ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNjE3MGYKLS0tIC9kZXYvbnVsbAorKysgYi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMzEgQEAKKy9idWlsZAorL3NvdXJjZS9idWlsZAorKi5tb2RlMXYzCisqLnBieHVzZXIKKyoucGJ4aW5kZXgvCishdXNlci5wYnh1c2VyCisvKi5sb2cKKyoudXNlcgorKi5uY2IKKyouc3VvCisqLnBkYgorKi5wZGYKKyouaHRtbAorKi5pZGIKKyoubworKi5sbworKi5hCisqLnNvCisqLnNvLjAKKyoubGEKKy5kZXBzCisubGlicworKi5weWMKKy5EU19TdG9yZQorIyBFbWFjcyBhbmQgb3RoZXIgZWRpdG9yIGJhY2t1cCBmaWxlcworKn4KKworIyBidWlsZHMgb24gV2luZG93cworRGVidWcvCitSZWxlYXNlLworcmVsZWFzZS8KZGlmZiAtLWdpdCBhL0FCT1VUIE1FTU9SWSBMRUFLUy50eHQgYi9BQk9VVCBNRU1PUlkgTEVBS1MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZWEyYTIKLS0tIC9kZXYvbnVsbAorKysgYi9BQk9VVCBNRU1PUlkgTEVBS1MudHh0CkBAIC0wLDAgKzEsNiBAQAorMiBzb3VyY2VzIG9mIGxlYWtzIHdlcmUgZml4ZWQgYXMgb2YgOC8yOS8wOAorCisxKSBJbiBzb21lIGNhc2VzIG9iamVjdHMgdGhhdCBhcmUgcG9pbnRlcnMgdG8gb3RoZXIgb2JqZWN0cyBhbmQgaGljaCBhcmUgdGhlbXNsZXZlcyBjb250YWluZWQgaW4gYSB2ZWN0b3Igd291bGQgbGVhayAodGhlIHBvaW50ZWQgb2JqZWN0IHdhcyBsb3N0KS4gCisyKSBPYmplY3RzIHRoYXQgY29udGFpbmVkIHBvaW50ZXJzIHdoZXJlIG5vdCBkZWxldGVkIHdoZW4gdGhlIGRlc3RydWN0b3Igd2FzIGNhbGxlZAorCitUaGUgZmlsZSBzcmNcc3ltYm9sMi5jIHdhcyBmaXhlZCBhY2NvcmRpbmdseSBhbmQgdGhlcmVmb3JlIGV4dHJlbWUgY2FyZSBzaG91bGQgYmUgdGFrZW4gaW4gdXBncmFkaW5nIG9yIHJlY29tcGlsaW5nIGdTT0FQIChpbiBvdGhlciB3b3JkcyBtYWtlIHN1cmUgdGhhdCB0aGlzIGNoYW5nZSBpcyBub3QgbG9zdCkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9OT1RFUy50eHQgYi9OT1RFUy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE4NGY0ZQotLS0gL2Rldi9udWxsCisrKyBiL05PVEVTLnR4dApAQCAtMCwwICsxLDExNSBAQAorCitESVNUUklCVVRJT04gTk9URVMKKworVG8gaW5zdGFsbCBnU09BUCwgdW5wYWNrIHRoZSBhcmNoaXZlLiBZb3Ugd2lsbCBnZXQgdGhlIGZvbGxvd2luZyBmaWxlczoKKworUkVBRE1FLnR4dAlyZWFkIHRoaXMgZmlyc3QKK05PVEVTLnR4dAl0aGlzIGZpbGUKK2NoYW5nZWxvZy5odG1sCWNoYW5nZXMKK2xpY2Vuc2UuaHRtbAlnU09BUCBwdWJsaWMgbGljZW5zZSAoSFRNTCkKK2xpY2Vuc2UucGRmCWdTT0FQIHB1YmxpYyBsaWNlbnNlIChQREYpCitncGwudHh0CQlHUEwgbGljZW5zZQorc29hcGNwcDIJZXhlY3V0YWJsZSBnU09BUCAyIGNvbXBpbGVyCit3c2RsMmgJCWV4ZWN1dGFibGUgZ1NPQVAgV1NETCBwYXJzZXIKK3NvYXBkb2MyLmh0bWwJZG9jdW1lbnRhdGlvbiAoSFRNTCkKK3NvYXBkb2MyLnBkZglkb2N1bWVudGF0aW9uIChQREYpCitzdGRzb2FwMi5oCWhlYWRlciBmaWxlIGZvciBzdGRzb2FwMi5jW3BwXQorc3Rkc29hcDIuYwlsaWJyYXJ5IGFuZCBnU09BUCBydW50aW1lCitzdGRzb2FwMi5jcHAJbGlicmFyeSAoaWRlbnRpY2FsIHRvIHN0ZHNvYXAyLmMpCitkb20uaHRtbAlnU09BUCBET00gcGFyc2VyIChIVE1MKQorZG9tLnBkZgkJZ1NPQVAgRE9NIHBhcnNlciAoUERGKQorZG9tLmgJCWhlYWRlciBmaWxlIGZvciBkb20uYworZG9tLmMJCUMgRE9NIHBhcnNlcgorZG9tKysuaAkJaGVhZGVyIGZpbGUgZm9yIGRvbSsrLmNwcAorZG9tKysuY3BwCUMrKyBET00gcGFyc2VyCit0eXBlbWFwLmRhdAlYTUwgc2NoZW1hIHRvIEMvQysrIHR5cGUgbWFwcGVyIGZvciB3c2RsMmggV1NETCBwYXJzZXIKKworLi4uIGFuZCB0aGUgZm9sbG93aW5nIHN1YmRpcmVjdG9yaWVzOgorCitzYW1wbGVzCQlleGFtcGxlcworZXh0cmFzCQkoY29udHJpYnV0ZWQpIGV4dHJhcworaW1wb3J0CQkjaW1wb3J0LWVkIGhlYWRlciBmaWxlcyBmb3Igc29hcGNwcDIgY29tcGlsZXIKK3BsdWdpbgkJcGx1Zy1pbiBleGFtcGxlcworY3VzdG9tCQljdXN0b20gc2VyaWFsaXplcnMgZm9yIHZhcmlvdXMgZGF0YSB0eXBlcworbW9kX2dzb2FwCUFwYWNoZSBtb2RfZ3NvYXAsIElJUywgYW5kIFdpbkluZXQgc3VwcG9ydAorc3JjCQlnU09BUCBjb21waWxlciBzb3VyY2VzCit3c2RsCQlXU0RMIHBhcnNlciBzb3VyY2VzCisKK0V4YW1wbGVzIGFyZSBpbmNsdWRlZCBpbiB0aGUgJ3NhbXBsZXMnIHN1YmRpcmVjdG9yeS4gVGhlIGV4YW1wbGVzIGFyZToKKworRElSRUNUT1JZCQkJREVTQ1JJUFRJT04KK2NhbGM6CQkJCVNpbXBsZSBjYWxjdWxhdG9yIGNsaWVudCBhbmQgc2VydmVyCitjazoJCQkJSFRUUCBjb29raWUgY2xpZW50IGFuZCBzZXJ2ZXIKK2NvbXBvbmVudHMvYywgY29tcG9uZW50cy9jcHA6CU11bHRpcGxlIGNsaWVudHMvc2VydmljZXMgaW4gb25lIGV4ZWN1dGFibGUKK2RpbWU6CQkJCURJTUUgYXR0YWNobWVudCBjbGllbnQgYW5kIHNlcnZlcgorZXZlbnRzOgkJCQlBc3luY2hyb25vdXMgb25lLXdheSBtZXNzYWdpbmcKK2ZhY3Rvcnk6CQkJUmVtb3RlIG9iamVjdCBmYWN0b3J5IGFuZCBzaW1wbGUgT1JCCitmYWN0b3J5dGVzdDoJCQlUZXN0IGNsaWVudCBmb3IgcmVtb3RlIG9iamVjdCBmYWN0b3J5Citnb29nbGVhcGk6CQkJR29vZ2xlIFdlYiBBUEkgY2xpZW50CitsaXN0aW5nOgkJCVhNZXRob2Qgc2VydmljZSBsaXN0aW5nIGNsaWVudAorbG9jYWx0aW1lOgkJCUdldCBsb2NhbHRpbWUgY2xpZW50CitsdToJCQkJTGluZWFyIHNvbHZlciBjbGllbnQgYW5kIHNlcnZlcgorbWFnaWM6CQkJCU1hZ2ljIFNxdWFyZXMgY2xpZW50IGFuZCBzZXJ2ZXIKK210b206CQkJCU1UT00gYXR0YWNobWVudCBjbGllbnQgYW5kIHNlcnZlcgorb25lbGluZXJzOgkJCVNldmVyYWwgb25lLWxpbmVyIGNsaWVudHMgYW5kIHNlcnZpY2VzCitwb2x5dGVzdDoJCQlQb2x5bW9ycGhpYyBvYmplY3QgZXhjaGFuZ2UKK3F1b3RlOgkJCQlHZXQgZGVsYXllZCBzdG9jayBxdW90ZQorcXVvdGUyOgkJCQlHZXQgZGVsYXllZCBzdG9jayBxdW90ZSAoU09BUCBhc3luYyBtZXNzYWdlcykKK3F1b3RlMzoJCQkJR2V0IGRlbGF5ZWQgc3RvY2sgcXVvdGUgKHdpdGggU3RvY2sgY2xhc3MpCitxdW90ZTQ6CQkJCUdldCBkZWxheWVkIHN0b2NrIHF1b3RlICh1c2luZyBYTUwgRE9NKQorcXVvdGV4OgkJCQlDb21iaW5lZCBjbGllbnQvc2VydmVyIGV4YW1wbGUgaW4gb25lCityb3V0ZXI6CQkJCVJvdXRlciBvZiBIVFRQIG1lc3NhZ2VzIG92ZXIgVENQL0lQCityc3M6CQkJCVJTUyAwLjkxLCAwLjkyLCBhbmQgMi4wIHNlcnZlcgorc3NsOgkJCQlIVFRQUy9TU0wgZXhhbXBsZSAocmVxdWlyZXMgT3BlblNTTCkKK3VkcDoJCQkJU09BUC1vdmVyLVVEUCBleGFtcGxlIGNsaWVudCBhbmQgc2VydmVyCit2YXJwYXJhbToJCQlWYXJpYWJsZSBwb2x5bW9ycGhpYyBwYXJhbWV0ZXJzIGNsaWVudC9zZXJ2ZXIKK3dlYnNlcnZlcjoJCQlTdGFuZC1hbG9uZSBXZWIgc2VydmVyIHdpdGggYSBsb3Qgb2YgZmVhdHVyZXMKK3htbC1ycGM6CQkJWE1MLVJQQyBzdXBwb3J0CisKK1RvIGJ1aWxkIHRoZSBleGFtcGxlIHNlcnZpY2VzIGFuZCBjbGllbnRzLCB0eXBlICJtYWtlIiBpbiB0aGUgJ3NhbXBsZXMnCitkaXJlY3RvcnkgKFN1biBTb2xhcmlzIHVzZXJzIHNob3VsZCB0eXBlICJtYWtlIC1mIE1ha2VmaWxlU29sYXJpcyIpLiBTZWUKK2Fsc28gaHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL3NvYXBleGFtcGxlcy5odG1sCitmb3IgZGV0YWlscyBhbmQgZXhwbGFuYXRpb25zIGZvciBzb21lIG9mIHRoZXNlIGV4YW1wbGVzLgorCitGb3IgV2luZG93cyB1c2VycywgdGhlIGFyY2hpdmUgaW5jbHVkZXMgJ21hZ2ljX1ZDJyBhbmQgJ3F1b3RlX1ZDJyBWaXN1YWwKK1N0dWRpbyBwcm9qZWN0cyBpbiB0aGUgJ3NhbXBsZXMnIGRpcmVjdG9yeS4KKworRm9yIE1hYyB1c2VycywgdGhlIGFyY2hpdmUgaW5jbHVkZXMgYSAncXVvdGVfTUFDX1Byb2pCdWlsZCcgUHJvamVjdCBCdWlsZGVyCitleGFtcGxlIGluIHRoZSAnc2FtcGxlcycgZGlyZWN0b3J5LgorCitUbyB0cnkgdGhlIFNTTC1zZWN1cmUgU09BUCBzZXJ2ZXIsIGluc3RhbGwgT3BlblNTTCBhbmQgY2hhbmdlIHRoZSBvY2N1cnJlbmNlcworb2YgImxpbnByb2cyLmNzLmZzdS5lZHUiIGluIHNzbGNsaWVudC5jIGFuZCBzc2xzZXJ2ZXIuYyB0byB0aGUgbWFjaGluZSBuYW1lCisob3IgbWFjaGluZSBJUCkgeW91IGFyZSB1c2luZy4gRXhhbXBsZSAucGVtIGZpbGVzIGFyZSBpbmNsdWRlZCBidXQgeW91IG5lZWQgdG8KK2NyZWF0ZSB5b3VyIG93biAucGVtIGZpbGVzIChzZWUgT3BlblNTTCBkb2N1bWVudGF0aW9uKS4KKworVGhlIHNzbGNsaWVudCBhbmQgc3Nsc2VydmVyIGNvZGVzIGNhbiB0aGVuIGJlIGJ1aWxkIGFzIGZvbGxvd3M6CisKK3NvYXBjcHAyIC1jIHNzbC5oCitnY2MgLURXSVRIX09QRU5TU0wgLW8gc3NsY2xpZW50IHNzbGNsaWVudC5jIHN0ZHNvYXAyLmMgc29hcEMuYyBzb2FwQ2xpZW50LmMgLWxzc2wgLWxjcnlwdG8KK2djYyAtRFdJVEhfT1BFTlNTTCAtbyBzc2xzZXJ2ZXIgc3Nsc2VydmVyLmMgc3Rkc29hcDIuYyBzb2FwQy5jIHNvYXBTZXJ2ZXIuYyAtbHNzbCAtbGNyeXB0byAtbHB0aHJlYWQKKworVGhlICdnc29hcF9tb2QnIGRpcmVjdG9yeSBpbmNsdWRlcyBBcGFjaGUgMS54IGFuZCAyLjAgbW9kcyBmb3IgZ1NPQVAsIElJUywgYW5kCitXaW5JbmV0IHN1cHBvcnQuIFdpbkluZXQgYWxsb3dzIGdzb2FwIHRvIHVzZSB0aGUgV2luSW5ldCBBUEkgaW5zdGVhZCBvZiBjYWxscwordG8gdGhlIHNvY2tldCBBUEkuIFRoZSBwcmltYXJ5IGJlbmVmaXQgb2YgdGhpcyBhcnJhbmdlbWVudCBpcyB0aGF0ICJpZiBJRQord29ya3MsIHlvdXIgcHJvZ3JhbSB3aWxsIHdvcmsiLiBUaGVyZSBpcyBubyBuZWVkIHRvIHJlYWQgcHJveHkgc2V0dGluZ3MgZnJvbQordGhlIHJlZ2lzdHJ5LCBkZWFsIHdpdGggcHJveHkgY29uZmlndXJhdGlvbiBzY3JpcHRzLCBldGMuIENoYW5nZXMgaW4gdGhlCisiSW50ZXJuZXQgT3B0aW9ucyIgZGlhbG9nIGJveCB3aWxsIGltbWVkaWF0ZWx5IHRha2UgZWZmZWN0IGluIHlvdXIgcHJvZ3JhbS4KK0FkZGl0aW9uYWxseSwgdGhpcyB3aWxsIGFsbG93IGdzb2FwIHRvIGhhbmRsZSBmb3JtcyBvZiBhdXRoZW50aWNhdGlvbiBub3QgeWV0CitzdXBwb3J0ZWQgbmF0aXZlbHksIHN1Y2ggYXMgTlRMTSAoSW50ZWdyYXRlZCBXaW5kb3dzIEF1dGhlbnRpY2F0aW9uKSwgZXRjLgorCitDb250cmlidXRpb25zIGFyZSBpbmNsdWRlZCBpbiB0aGUgJ2V4dHJhcycgZGlyZWN0b3J5OgorCitja2RiLmggY2tkYi5jOgorSFRUUCBjb29raWUgZGF0YWJhc2UgbG9hZCBhbmQgc3RvcmUgb3BlcmF0aW9ucyBmb3IgcGVyc2lzdGFudCBjb29raWUgc3VwcG9ydC4KK0Nvb2tpZXMgYXJlIHNhdmVkIGluIFhNTCBmb3JtYXQgdXNpbmcgZ1NPQVAncyBzZXJpYWxpemVycy4KKworY2tkYnRlc3QuaCBja2RidGVzdC5jOgorVGVzdCBjbGllbnQgcHJvZ3JhbSBmb3IgY29va2llIGRhdGFiYXNlLgorCitzb2FwZGVmcy5oIGxvZ2dpbmcuY3BwOgorQysrIG1lc3NhZ2UgbG9nZ2luZyB3aXRoIHN0cmVhbXMuCisKK0RJU0NMQUlNRVI6IFdFIFRSWSBPVVIgQkVTVCBUTyBQUk9WSURFIFlPVSBXSVRIICJSRUFMLVdPUkxEIiBFWEFNUExFUyBCVVQgV0UKK0NBTk5PVCBHVUFSQU5URUUgVEhBVCBBTEwgQ0xJRU5UIEVYQU1QTEVTIENBTiBDT05ORUNUIFRPIFRISVJEIFBBUlRZIFdFQgorU0VSVklDRVMgV0hFTiBUSEVTRSBTRVJWSUNFUyBBUkUgRE9XTiBPUiBIQVZFIEJFRU4gUkVNT1ZFRC4KKwpkaWZmIC0tZ2l0IGEvUkVBRE1FLnR4dCBiL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk4ZDNiYQotLS0gL2Rldi9udWxsCisrKyBiL1JFQURNRS50eHQKQEAgLTAsMCArMSwxOTYgQEAKKworVGhhbmtzIGZvciB1c2luZyBnU09BUCEKKworZ1NPQVAgcHJvdmlkZXMgYSBjcm9zcy1wbGF0Zm9ybSBkZXZlbG9wbWVudCB0b29sa2l0IGZvciBkZXZlbG9waW5nIHNlcnZlciwKK2NsaWVudCwgYW5kIHBlZXIgV2ViIHNlcnZpY2UgYXBwbGljYXRpb25zIGluIEMgYW5kIEMrKy4KKworKiBUaGUgZ1NPQVAgJ3NvYXBjcHAyJyBjb21waWxlciBhbmQgJ3N0ZHNvYXAyJyBydW50aW1lIGFyZSBzdGFibGUgc2luY2UKKyAgdmVyc2lvbiByZWxlYXNlIDIuMS4zLgorCisqIFRoZSBnU09BUCAnd3NkbDJoJyBXU0RMIHBhcnNlciBpcyBzdGFibGUgc2luY2Ugd3NkbDJoIHZlcnNpb24gcmVsZWFzZSAxLjEuMC4KKyAgVGhlIFdTREwgcGFyc2VyIGZ1bGx5IHN1cHBvcnRzIFdTREwgMS4xIGFuZCBYTUwgc2NoZW1hcy4KKworVGhlIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGhvdXQgYW55IHdhcnJhbnR5LiAgSG93ZXZlciwgZ1NPQVAKK2hhcyByZWNlaXZlZCBhIGxvdCBvZiBzdXBwb3J0IGZyb20gdXNlcnMgYW5kIGhhcyBiZWVuIGV4dGVuc2l2ZWx5IHRlc3RlZAoraW4gdGhlICJyZWFsIHdvcmxkIi4gIFdlIGFsc28gY29udGludWUgdG8gaW1wcm92ZSBnU09BUCBhbmQgYWRkIG5ldyBmZWF0dXJlcy4KKworV0hBVCdTIENPT0w/CisKK1RoZSBnU09BUCBXU0RMIHBhcnNlciBpcyBhIGdTT0FQIGFwcGxpY2F0aW9uIGl0c2VsZiwgd2hpY2ggZGVtb25zdHJhdGVzIHRoZQorY2FwYWJpbGl0aWVzIG9mIHRoZSBnZW5lcmljIFhNTCBoYW5kbGluZyBieSB0aGUgdG9vbGtpdCB0byBwYXJzZSBXU0RMLCBYTUwKK3NjaGVtYXMsIGFuZCBTT0FQL1hNTC4KKworZ1NPQVAgc3VwcG9ydHMgc3RyZWFtaW5nIHRlY2hub2xvZ2llcyB0byBleHBlZGl0ZSBTT0FQL1hNTCBhbmQgYmluYXJ5IERJTUUKK2F0dGFjaG1lbnQgdHJhbnNmZXJzLiAgSXQgaXMgdGhlIG9ubHkgdG9vbGtpdCB0aGF0IHN1cHBvcnRzIHN0cmVhbWluZyBESU1FCit0cmFuc2ZlcnMgb2YgcG90ZW50aWFsbHkgdW5saW1pdGVkIGJpbmFyeSBkYXRhIGxlbmd0aHMuCisKK2dTT0FQIGlzIHRoZSBvbmx5IHRvb2xraXQgdGhhdCBzdXBwb3J0cyB0aGUgc2VyaWFsaXphdGlvbiBvZiBuYXRpdmUgQyBhbmQgQysrCitkYXRhIHR5cGVzLiAgWW91IGNhbiB1c2UgaXQgdG8gZXhwb3J0IGFuZCBpbXBvcnQgeW91ciBhcHBsaWNhdGlvbiBkYXRhIGluIFhNTAord2l0aG91dCBoYXZpbmcgdG8gd3JpdGUgd3JhcHBlciByb3V0aW5lcy4KKworZ1NPQVAgZW5zdXJlcyBhcyBzbWFsbCBtZW1vcnkgZm9vdHByaW50LCBiZWNhdXNlIFhNTCBpcyBhIHByb2Nlc3NlZCBhcyBhCit0cmFuc2llbnQgZm9ybWF0IGFuZCBub3QgYnVmZmVyZWQuICBNYW55IG9wdGltaXphdGlvbnMgaGF2ZSBiZWVuIGFwcGxpZWQgdG8KK3JlZHVjZSByZXNvdXJjZSByZXF1aXJlbWVudHMgYW5kIHRvIGV4cGVkaXRlIFhNTCBwYXJzaW5nLgorCitJTlNUQUxMQVRJT04KKworU2VlIE5PVEVTLnR4dCBmb3IgZGlzdHJpYnV0aW9uIG5vdGVzIGFuZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zLgorCitTZWUgdGhlICdkb2MnIGRpcmVjdG9yeSBkb2MvaW5kZXguaHRtbCBmb3IgZG9jdW1lbnRhdGlvbi4KKworU2VlIHRoZSAnc2FtcGxlcycgZGlyZWN0b3J5IGZvciBleGFtcGxlIGdTT0FQIFdlYiBzZXJ2aWNlIGFwcGxpY2F0aW9ucy4KKworU2VlIHRoZSAndWRkaTInIGRpcmVjdG9yeSB0byBidWlsZCBVRERJIHYyIHJlZ2lzdHJpZXMuCisKK1NlZSB0aGUgJ1dTJyBkaXJlY3RvcnkgZm9yIFdTLSogcHJvdG9jb2wgc3VwcG9ydC4gVGhpcyBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBpcwordW5kZXIgZGV2ZWxvcG1lbnQgYXMgbmV3IFdTLSogcHJvdG9jb2xzIGFyZSBwdWJsaXNoZWQuCisKK1NlZSB0aGUgJ2ltcG9ydCcgZGlyZWN0b3J5IGZvciBXUy0qIHByb3RvY29scyB5b3UgY2FuIGltcG9ydC4KKworU2VlIHRoZSAncGx1Z2luJyBkaXJlY3RvcnkgZm9yIHBsdWdpbnMuCisKK1NlZSB0aGUgJ2N1c3RvbScgZGlyZWN0b3J5IGZvciBleGFtcGxlIGN1c3RvbSBzZXJpYWxpemVycy4KKworU2VlIHRoZSAnbW9kX2dzb2FwJyBkaXJlY3RvcnkgZm9yIEFwYWNoZSBtb2RfZ3NvYXAsIElJUyBtb2R1bGVzLCBhbmQgV2luSW5ldC4KKworU2VlIHRoZSAnZXh0cmFzJyBkaXJlY3Rvcnkgd2l0aCB0aGlyZC1wYXJ0eSBjb250cmlidXRpb25zLgorCitHRVRUSU5HIFNUQVJURUQKKworVGhlIGdTT0FQIFdTREwgcGFyc2VyIGNvbnZlcnRzIFdTREwgaW50byBhIGdTT0FQIGhlYWRlciBmaWxlIGZvciBwcm9jZXNzaW5nCit3aXRoIHRoZSBnU09BUCBzdHViIGFuZCBza2VsZXRvbiBjb21waWxlciB0byBidWlsZCB5b3VyIFdlYiBzZXJ2aWNlcworYXBwbGljYXRpb25zLiAgWW91IGNhbiB1c2UgdGhlIFdTREwgcGFyc2VyIHRvIHRyYW5zbGF0ZSBXU0RMIGFuZC9vciBYTUwgc2NoZW1hcworaW50byBDIG9yIEMrKyBkYXRhIHN0cnVjdHVyZXMgYW5kIFhNTCBwYXJzZXJzLiBZb3UgY2FuIGFsc28gdXNlIHRoZSBnU09BUAorY29tcGlsZXIgc2VwYXJhdGVseSB0byBjcmVhdGUgWE1MIHNlcmlhbGl6YXRpb24gcm91dGluZXMgZm9yIGFwcGxpY2F0aW9uIGRhdGEuCisKK0ZvciBleGFtcGxlOgorCiskIHdzZGwyaCAtcyAtbyBYTWV0aG9kc1F1ZXJ5LmggaHR0cDovL3d3dy54bWV0aG9kcy5uZXQvd3NkbC9xdWVyeS53c2RsCisKKyQgc29hcGNwcDIgWE1ldGhvZHNRdWVyeS5oCisKK1RoZSBYTWV0aG9kc1F1ZXJ5LmggaGVhZGVyIGZpbGUgY29udGFpbnMgYSB0cmFuc2xhdGlvbiBvZiB0aGUgc2VydmljZXMgYW5kIFhNTAorc2NoZW1hcyB0byBDL0MrKyBhbmQgb3RoZXIgdXNlZnVsIGluZm9ybWF0aW9uIGNvcGllZCBmcm9tIHRoZSBXU0RMLiAgVGhlCitoZWFkZXIgZmlsZSBpcyB0aGVuIHByb2Nlc3NlZCBieSB0aGUgZ1NPQVAgc3R1YiBhbmQgc2tlbGV0b24gY29tcGlsZXIgdG8KK2dlbmVyYXRlIHRoZSBmb2xsb3dpbmcgZmlsZXM6CisKK3NvYXBDbGllbnQuY3BwCQljbGllbnQtc2lkZSBzdHViIHJvdXRpbmVzIGZvciBzZXJ2aWNlIGludm9jYXRpb24KK3NvYXBTZXJ2ZXIuY3BwCQlzZXJ2ZXItc2lkZSBza2VsZXRvbiByb3V0aW5lcyBmb3Igc2VydmVyIGRldmVsb3BtZW50Citzb2FwQy5jcHAJCUMvQysrIHBhcmFtZXRlciBtYXJzaGFsbGluZyBjb2RlCisKK1RvIGRldmVsb3AgYSBDKysgY2xpZW50IGFwcGxpY2F0aW9uLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBnZW5lcmF0ZWQKKydzb2FwWE1ldGhvZHNRdWVyeVNvYXBQcm94eS5oJyBjbGFzcyBhbmQgJ1hNZXRob2RzUXVlcnlTb2FwLm5zbWFwJyBYTUwKK25hbWVzcGFjZSB0YWJsZSB0byBhY2Nlc3MgdGhlIFhNZXRob2RzIFdlYiBzZXJ2aWNlLiBCb3RoIG5lZWQgdG8gYmUKKycjaW5jbHVkZSctZCBpbiB5b3VyIHNvdXJjZS4gVGhlbiBjb21waWxlIGFuZCBsaW5rIHRoZSBzb2FwQy5jcHAsCitzb2FwQ2xpZW50LmNwcCwgYW5kIHN0ZHNvYXAyLmNwcCBzb3VyY2VzIHRvIGNvbXBsZXRlIHRoZSBidWlsZC4gIE1vcmUKK2luZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiB0aGUgZ1NPQVAgZG9jdW1lbnRhdGlvbiBhbmQgdGhlIFF1aWNrIEhvdy1UbyBwYWdlCitvbiB0aGUgZ1NPQVAgV2ViIHNpdGUuCisKK1NlZSBhbHNvIHRoZSAnd3NkbC9SRUFETUUudHh0JyBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBXU0RMIHBhcnNlciBhbmQKK2luc3RhbGxhdGlvbiAoaW4gY2FzZSB5b3UgZG9uJ3QgaGF2ZSB0aGUgd3NkbDJoIGV4ZWN1dGFibGUpLgorCitMSUNFTlNFCisKK2dTT0FQIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRocmVlIGxpY2Vuc2VzOgorCisqIFRoZSBnU09BUCBwdWJsaWMgb3BlbiBzb3VyY2UgbGljZW5zZSAod2hpY2ggaXMgYmFzZWQgb24gdGhlIE1vemlsbGEgcHVibGljCisgIGxpY2Vuc2UgMS4xKS4gU2VlIGxpY2Vuc2UuaHRtbCBvciBsaWNlbnNlLnBkZiBmb3IgZnVydGhlciBkZXRhaWxzLgorCisqIEdQTCAoR05VIFB1YmxpYyBMaWNlbnNlKS4KKworKiBMaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKworTW9zdCBwYXJ0cyBhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIGdTT0FQIHB1YmxpYyBsaWNlbnNlIGFuZCBHUEwuICBZb3UgY2FuCitjaG9vc2Ugd2hpY2ggbGljZW5zZSBhcHBsaWVzIGJlc3QgdG8geW91ciB1c2UuICBTb21lIHBhcnRzIG9mIGdTT0FQIGFyZQorc3RyaWN0bHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdQTC4gIEEgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUKK2Zyb20gR2VuaXZpYSBJbmMsIHNlZSBodHRwOi8vZ2VuaXZpYS5jb20vUHJvZHVjdHMvZ3NvYXAvY29udHJhY3QuaHRtbAorCitQbGVhc2UgcmVmZXIgdG8gdGhlIFJFQURNRSBmaWxlcyBhbmQvb3IgaGVhZGVyIGluZm9ybWF0aW9uIGluIHNvdXJjZSBjb2RlIGZpbGVzCitmb3IgdGhlIGFwcHJvcHJpYXRlIGxpY2Vuc2luZyBzcGVjaWZpYyB0byB0aGF0IHBhcnQgb2YgdGhlIHNvdXJjZSBjb2RlLiAgVGhlCitnU09BUCBwdWJsaWMgbGljZW5zZSwgdW5saWtlIEdQTCwgYWxsb3dzIGZvciBjb21tZXJjaWFsIHVzZSBvZiBnU09BUC4gIEl0IGFsc28KK2FsbG93cyBwcm9kdWN0cyB0byBiZSBidWlsdCBvbiB0b3AgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIGFueSBsaWNlbnNlIChpbmNsdWRpbmcKK2NvbW1lcmNpYWwpLiAgUHJvZHVjdHMgZGV2ZWxvcGVkIHdpdGggZ1NPQVAgc2hvdWxkIGluY2x1ZGUgYSBub3RpY2Ugb2YKK2NvcHlyaWdodCBhbmQgYSBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5IGluIHRoZSBwcm9kdWN0J3MgZG9jdW1lbnRhdGlvbiAoTGljZW5zZQorRXhoaWJpdCBCKS4gIFRoZSBzb3VyY2UgY29kZSBnZW5lcmF0ZWQgYnkgdGhlIGdTT0FQIGNvbXBpbGVyICdzb2FwY3BwMicgaXMgYWxzbworY292ZXJlZCBieSB0aGUgZ1NPQVAgcHVibGljIGxpY2Vuc2UsIHdoaWNoIG1lYW5zIHRoYXQgeW91IGNhbiB1c2UgaXQgZm9yCitjb21tZXJjaWFsIHB1cnBvc2VzLgorCitUaGUgcGFydHMgb2YgdGhlIGNvZGUgdGhhdCBhcmUgc3RyaWN0bHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdQTCAoaS5lLiB0aGUgY29kZQordGhhdCBpcyBvbmx5IGRpc3RyaWJ1dGVkIHVuZGVyIEdQTCBhbmQgbm90IGpvaW50bHkgdW5kZXIgR1BMIGFuZCBnU09BUCBwdWJsaWMKK2xpY2Vuc2UpIGNhbm5vdCBiZSB1c2VkIGZvciBjb21tZXJjaWFsIHB1cnBvc2VzLiBUaGVzZSBwYXJ0cyBhcmU6CisKKyogVGhlIHdzZGwyaCBXU0RMIHBhcnNlciBzb3VyY2UgY29kZSBhbmQgdGhlIGNvZGUgZ2VuZXJhdGVkIGJ5IGl0LgorCisqIFRoZSBleGFtcGxlcyBpbmNsdWRlZCBpbiB0aGUgZ1NPQVAgZGlzdHJpYnV0aW9uIHBhY2thZ2UgJ3NhbXBsZXMnIGRpcmVjdG9yeS4KKworQSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZvciB0aGUgR1BMIGxpY2Vuc2VkIHNvZnR3YXJlLiBQbGVhc2UgcmVmZXIKK3RvIHRoZSBsaWNlbnNlIGRldGFpbHMgYXQgaHR0cDovL3d3dy5nZW5pdmlhLmNvbS9Qcm9kdWN0cy9nc29hcC9jb250cmFjdC5odG1sCitmb3IgZnVydGhlciBkZXRhaWxzLgorCitDT1BZUklHSFQKKworZ1NPQVAgaXMgY29weXJpZ2h0ZWQgYnkgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLCBHZW5pdmlhLCBJbmMuCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4sIEdlbml2aWEsIEluYy4KK0FsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK1VTRSBSRVNUUklDVElPTlMKKworWW91IG1heSBub3Q6IChpKSB0cmFuc2ZlciByaWdodHMgdG8gZ1NPQVAgb3IgY2xhaW0gYXV0aG9yc2hpcDsgb3IgKGlpKSByZW1vdmUKK2FueSBwcm9kdWN0IGlkZW50aWZpY2F0aW9uLCBjb3B5cmlnaHQsIHByb3ByaWV0YXJ5IG5vdGljZXMgb3IgbGFiZWxzIGZyb20gZ1NPQVAuCisKK1dBUlJBTlRZIAorCitHRU5JVklBIElOQy4gRVhQUkVTU0xZIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUywgV0hFVEhFUiBFWFBSRVNTLCBJTVBMSUVEIE9SCitTVEFUVVRPUlksIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFksIE9GIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBOT05JTkZSSU5HRU1FTlQgT0YgVEhJUkQKK1BBUlRZIElOVEVMTEVDVFVBTCBQUk9QRVJUWSBSSUdIVFMsIEFORCBBTlkgV0FSUkFOVFkgVEhBVCBNQVkgQVJJU0UgQlkgUkVBU09OCitPRiBUUkFERSBVU0FHRSwgQ1VTVE9NLCBPUiBDT1VSU0UgT0YgREVBTElORy4gIFdJVEhPVVQgTElNSVRJTkcgVEhFCitGT1JFR09JTkcsIFlPVSBBQ0tOT1dMRURHRSBUSEFUIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEFUCitHRU5JVklBIElOQy4gRE8gTk9UIFdBUlJBTlQgVEhFIFNPRlRXQVJFIFdJTEwgUlVOIFVOSU5URVJSVVBURUQgT1IgRVJST1IgRlJFRS4KK0xJTUlURUQgTElBQklMSVRZOiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gUkVTVUxUUyBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFCitTT0ZUV0FSRSBJUyBBU1NVTUVEIEJZIFlPVS4gIFVOREVSIE5PIENJUkNVTVNUQU5DRVMgV0lMTCBHRU5JVklBIElOQy4gQkUgTElBQkxFCitGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNULCBJTkNJREVOVEFMLCBFWEVNUExBUlkgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GCitBTlkgS0lORCBPUiBOQVRVUkUgV0hBVFNPRVZFUiwgV0hFVEhFUiBCQVNFRCBPTiBDT05UUkFDVCwgV0FSUkFOVFksIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSksIFNUUklDVCBMSUFCSUxJVFkgT1IgT1RIRVJXSVNFLCBBUklTSU5HIE9VVCBPRiBPUiBJTgorQU5ZIFdBWSBSRUxBVEVEIFRPIFRIRSBTT0ZUV0FSRSwgRVZFTiBJRiBHRU5JVklBIElOQy4gSEFTIEJFRU4gQURWSVNFRCBPTiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFIE9SIElGIFNVQ0ggREFNQUdFIENPVUxEIEhBVkUgQkVFTiBSRUFTT05BQkxZCitGT1JFU0VFTiwgQU5EIE5PVFdJVEhTVEFORElORyBBTlkgRkFJTFVSRSBPRiBFU1NFTlRJQUwgUFVSUE9TRSBPRiBBTlkKK0VYQ0xVU0lWRSBSRU1FRFkgUFJPVklERUQuICBTVUNIIExJTUlUQVRJT04gT04gREFNQUdFUyBJTkNMVURFUywgQlVUIElTIE5PVAorTElNSVRFRCBUTywgREFNQUdFUyBGT1IgTE9TUyBPRiBHT09EV0lMTCwgTE9TVCBQUk9GSVRTLCBMT1NTIE9GIERBVEEgT1IKK1NPRlRXQVJFLCBXT1JLIFNUT1BQQUdFLCBDT01QVVRFUiBGQUlMVVJFIE9SIE1BTEZVTkNUSU9OIE9SIElNUEFJUk1FTlQgT0YKK09USEVSIEdPT0RTLiAgSU4gTk8gRVZFTlQgV0lMTCBHRU5JVklBIElOQy4gQkUgTElBQkxFIEZPUiBUSEUgQ09TVFMgT0YKK1BST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgU09GVFdBUkUgT1IgU0VSVklDRVMuICBZT1UgQUNLTk9XTEVER0UgVEhBVCBUSElTCitTT0ZUV0FSRSBJUyBOT1QgREVTSUdORUQgRk9SIFVTRSBJTiBPTi1MSU5FIEVRVUlQTUVOVCBJTiBIQVpBUkRPVVMKK0VOVklST05NRU5UUyBTVUNIIEFTIE9QRVJBVElPTiBPRiBOVUNMRUFSIEZBQ0lMSVRJRVMsIEFJUkNSQUZUIE5BVklHQVRJT04gT1IKK0NPTlRST0wsIE9SIExJRkUtQ1JJVElDQUwgQVBQTElDQVRJT05TLiAgR0VOSVZJQSBJTkMuIEVYUFJFU1NMWSBESVNDTEFJTSBBTlkKK0xJQUJJTElUWSBSRVNVTFRJTkcgRlJPTSBVU0UgT0YgVEhFIFNPRlRXQVJFIElOIEFOWSBTVUNIIE9OLUxJTkUgRVFVSVBNRU5UIElOCitIQVpBUkRPVVMgRU5WSVJPTk1FTlRTIEFORCBBQ0NFUFRTIE5PIExJQUJJTElUWSBJTiBSRVNQRUNUIE9GIEFOWSBBQ1RJT05TIE9SCitDTEFJTVMgQkFTRUQgT04gVEhFIFVTRSBPRiBUSEUgU09GVFdBUkUgSU4gQU5ZIFNVQ0ggT04tTElORSBFUVVJUE1FTlQgSU4KK0hBWkFSRE9VUyBFTlZJUk9OTUVOVFMgQlkgWU9VLiAgRk9SIFBVUlBPU0VTIE9GIFRISVMgUEFSQUdSQVBILCBUSEUgVEVSTQorIkxJRkUtQ1JJVElDQUwgQVBQTElDQVRJT04iIE1FQU5TIEFOIEFQUExJQ0FUSU9OIElOIFdISUNIIFRIRSBGVU5DVElPTklORyBPUgorTUFMRlVOQ1RJT05JTkcgT0YgVEhFIFNPRlRXQVJFIE1BWSBSRVNVTFQgRElSRUNUTFkgT1IgSU5ESVJFQ1RMWSBJTiBQSFlTSUNBTAorSU5KVVJZIE9SIExPU1MgT0YgSFVNQU4gTElGRS4KKworTElCUkFSSUVTCisKK2dTT0FQIGlzIHNlbGYtY29udGFpbmVkIGFuZCBkb2VzIG5vdCByZXF1aXJlIGFueSB0aGlyZC1wYXJ0eSBzb2Z0d2FyZSwgZXhjZXB0Citmb3IgdGhlIFpsaWIgYW5kIE9wZW5TU0wgbGlicmFyaWVzIHRoYXQgbXVzdCBiZSBpbnN0YWxsZWQgdG8gc3VwcG9ydAorY29tcHJlc3Npb24gYW5kIGVuY3J5cHRpb24uIENvbXByZXNzaW9uIGFuZCBlbmNyeXB0aW9uIGFyZSBvcHRpb25hbC4KKworVG8gYnVpbGQgdGhlIGdTT0FQICdzb2FwY3BwMicgY29tcGlsZXIsIHlvdSBtdXN0IGhhdmUgQmlzb24gYW5kIEZsZXggaW5zdGFsbGVkCisob3IgdGhlIG9sZGVyIFlhY2MgYW5kIExleCBlcXVpdmFsZW50cykuCisKK1dpbjMyIGJ1aWxkIG9mIGNsaWVudHMgYW5kIHNlcnZpY2VzIHJlcXVpcmVzIHdpbnNvY2suZGxsLiBUbyBkbyB0aGlzIGluCitWaXN1YWwgQysrIDYuMCwgZ28gdG8gIlByb2plY3QiLCAic2V0dGluZ3MiLCBzZWxlY3QgdGhlICJMaW5rIiB0YWIgKHRoZQorcHJvamVjdCBmaWxlIG5lZWRzIHRvIGJlIHNlbGVjdGVkIGluIHRoZSBmaWxlIHZpZXcpIGFuZCBhZGQgIndzb2NrMzIubGliIiB0bwordGhlICJPYmplY3QvbGlicmFyeSBtb2R1bGVzIiBlbnRyeS4gVGhlIFdpbjMyIGRpc3RyaWJ1dGlvbiBjb250YWlucyB0d28KK01TVkMrKyBwcm9qZWN0IGV4YW1wbGVzLiBUaGUgY3VzdG9tIGJ1aWxkIGluIFZDKysgNi4wIGhhcyBiZWVuIGNvbmZpZ3VyZWQgdG8KK2ludm9rZSB0aGUgZ1NPQVAgY29tcGlsZXIgYXV0b21hdGljYWxseS4gVGhlIFZDKysgcHJvamVjdHMgY2FuIGJlIGNvbnZlcnRlZCB0bworTVNWQysrIDcuMC4KKworRElTQ0xBSU1FUgorCitXRSBUUlkgT1VSIEJFU1QgVE8gUFJPVklERSBZT1UgV0lUSCAiUkVBTC1XT1JMRCIgRVhBTVBMRVMgQlVUIFdFIENBTk5PVAorR1VBUkFOVEVFIFRIQVQgQUxMIENMSUVOVCBFWEFNUExFUyBDQU4gQ09OTkVDVCBUTyBUSElSRCBQQVJUWSBXRUIgU0VSVklDRVMKK1dIRU4gVEhFU0UgU0VSVklDRVMgQVJFIERPV04gT1IgSEFWRSBCRUVOIFJFTU9WRUQuCisKZGlmZiAtLWdpdCBhL1dTL1JFQURNRS50eHQgYi9XUy9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NDExYTcKLS0tIC9kZXYvbnVsbAorKysgYi9XUy9SRUFETUUudHh0CkBAIC0wLDAgKzEsMTQgQEAKK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIGEgbnVtYmVyIG9mIFdTLSogc3BlY3MuIEl0IHNlcnZlcyBhcyBhIHJlcG9zaXRvcnkgZm9yCitnZW5lcmF0aW5nIGhlYWRlciBmaWxlcyBzdG9yZWQgaW4gdGhlICdpbXBvcnQnIGRpcmVjdG9yeS4KKworVGhlICdXUy10eXBlbWFwLmRhdCcgY29udGFpbnMgYmluZGluZ3MgZm9yIHRoZXNlIFdTLSogc3BlY3MgdG8gQyAoYW5kIEMrKykuCitUaGlzIGZpbGUgaXMgdXNlZCBieSB3c2RsMmggdG8gY3VzdG9taXplIHRoZSBnZW5lcmF0ZWQgYmluZGluZ3MuCisKK0ZvciBleGFtcGxlLCB0aGUgJ2ltcG9ydC93c2EuaCcgV1MtQWRkcmVzc2luZyBkZWZpbml0aW9ucyB3ZXJlIGdlbmVyYXRlZCBieToKK3dzZGwyaCAtY2d5IC1vIHdzYS5oIC10IFdTL1dTLXR5cGVtYXAuZGF0IFdTL1dTLUFkZHJlc3NpbmcueHNkCit3aGljaCBnZW5lcmF0ZWQgdGhlICdpbXBvcnQvd3NhLmgnIGZpbGUgdGhhdCBjYW4gYmUgI2ltcG9ydC1lZCBpbiBhIGdTT0FQCitoZWFkZXIgZmlsZSB0byBlbmFibGUgV1MtQWRkcmVzc2luZyBzdXBwb3J0LgorCitBbGwgaW1wb3J0YWJsZSBXUy0qIHNwZWNzIGluIGhlYWRlciBmb3JtYXQgYXJlIGxvY2F0ZWQgaW4gdGhlICdpbXBvcnQnCitkaXJlY3Rvcnkgb2YgdGhlIHBhY2thZ2UuCisKZGlmZiAtLWdpdCBhL1dTL1dTLUFkZHJlc3NpbmcueHNkIGIvV1MvV1MtQWRkcmVzc2luZy54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY2NmU3NAotLS0gL2Rldi9udWxsCisrKyBiL1dTL1dTLUFkZHJlc3NpbmcueHNkCkBAIC0wLDAgKzEsMTMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0gCitDb3B5cmlnaHQgwqkgMjAwMi0yMDA0IEJFQSBTeXN0ZW1zIEluYy4sIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24sIAorTWljcm9zb2Z0IENvcnBvcmF0aW9uLCBJbmMsIFNBUCBBRywgYW5kIFN1biBNaWNyb3N5c3RlbXMsIEluYy4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIAorCitQZXJtaXNzaW9uIHRvIGNvcHksIGRpc3BsYXksIHBlcmZvcm0sIG1vZGlmeSBhbmQgZGlzdHJpYnV0ZSB0aGUgV1MtQWRkcmVzc2luZyBTcGVjaWZpY2F0aW9uLCAKK2FuZCB0byBhdXRob3JpemUgb3RoZXJzIHRvIGRvIHRoZSBmb3JlZ29pbmcsIGluIGFueSBtZWRpdW0gd2l0aG91dCBmZWUgb3Igcm95YWx0eSBpcyBoZXJlYnkKK2dyYW50ZWQgZm9yIHRoZSBwdXJwb3NlIG9mIGRldmVsb3BpbmcgYW5kIGV2YWx1YXRpbmcgdGhlIFdTLUFkZHJlc3NpbmcgU3BlY2lmaWNhdGlvbi4KKworQkVBLCBJQk0sIE1pY3Jvc29mdCwgU0FQIEFHLCBhbmQgU3VuIE1pY3Jvc3lzdGVtcyAoY29sbGVjdGl2ZWx5LCB0aGUgIkF1dGhvcnMiKSBlYWNoIGFncmVlIAordG8gZ3JhbnQgYSBsaWNlbnNlIHRvIHRoaXJkIHBhcnRpZXMsIHVuZGVyIHJveWFsdHktZnJlZSAgYW5kIG90aGVyd2lzZSByZWFzb25hYmxlLCAKK25vbi1kaXNjcmltaW5hdG9yeSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgdG8gdGhlaXIgcmVzcGVjdGl2ZSBlc3NlbnRpYWwgcGF0ZW50IGNsYWltcyB0aGF0Cit0aGV5IGRlZW0gbmVjZXNzYXJ5IHRvIGltcGxlbWVudCB0aGUgV1MtQWRkcmVzc2luZyBTcGVjaWZpY2F0aW9uLgorCitESVNDTEFJTUVSUzoKKworVEhFIFdTLUFkZHJlc3NpbmcgU3BlY2lmaWNhdGlvbiBJUyBQUk9WSURFRCAiQVMgSVMiLCBBTkQgVEhFIEFVVEhPUlMgTUFLRSBOTyBSRVBSRVNFTlRBVElPTlMKK09SIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFdBUlJBTlRJRVMgT0YgCitNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBOT04tSU5GUklOR0VNRU5ULCBPUiBUSVRMRTsgVEhBVCBUSEUgCitDT05URU5UUyBPRiBUSEUgV1MtQWRkcmVzc2luZyBTcGVjaWZpY2F0aW9uIElTIFNVSVRBQkxFIEZPUiBBTlkgUFVSUE9TRTsgTk9SIFRIQVQgVEhFIAorSU1QTEVNRU5UQVRJT04gT0YgU1VDSCBDT05URU5UUyBXSUxMIE5PVCBJTkZSSU5HRSBBTlkgVEhJUkQgUEFSVFkgUEFURU5UUywgQ09QWVJJR0hUUywgCitUUkFERU1BUktTIE9SIE9USEVSIFJJR0hUUy4KKworVEhFIEFVVEhPUlMgV0lMTCBOT1QgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIAorREFNQUdFUyBBUklTSU5HIE9VVCBPRiBBTlkgVVNFIE9GIFRIRSBXUy1BZGRyZXNzaW5nIFNwZWNpZmljYXRpb24gT1IgVEhFIFBFUkZPUk1BTkNFIE9SIAorSU1QTEVNRU5UQVRJT04gT0YgVEhFIENPTlRFTlRTIFRIRVJFT0YuCisKK1lvdSBtYXkgcmVtb3ZlIHRoZXNlIGRpc2NsYWltZXJzIGZyb20geW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgV1MtQWRkcmVzc2luZyAKK1NwZWNpZmljYXRpb24gcHJvdmlkZWQgdGhhdCB5b3UgZWZmZWN0aXZlbHkgZGlzY2xhaW0gYWxsIHdhcnJhbnRpZXMgYW5kIGxpYWJpbGl0aWVzIG9uIGJlaGFsZiAKK29mIGFsbCBjb3B5cmlnaHQgaG9sZGVycyBpbiB0aGUgY29waWVzIG9mIGFueSBzdWNoIG1vZGlmaWVkIHZlcnNpb25zIHlvdSBkaXN0cmlidXRlLgorCitUaGUgbmFtZSBhbmQgdHJhZGVtYXJrcyBvZiB0aGUgQXV0aG9ycyBtYXkgTk9UIGJlIHVzZWQgaW4gYW55IG1hbm5lciwgaW5jbHVkaW5nIGFkdmVydGlzaW5nIAorb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhlIFdTLUFkZHJlc3NpbmcgU3BlY2lmaWNhdGlvbiBvciBpdHMgY29udGVudHMgd2l0aG91dCBzcGVjaWZpYywgCit3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uIFRpdGxlIHRvIGNvcHlyaWdodCBpbiB0aGUgV1MtQWRkcmVzc2luZyBTcGVjaWZpY2F0aW9uIHdpbGwgYXQgYWxsIAordGltZXMgcmVtYWluIHdpdGggdGhlIEF1dGhvcnMuCisKK05vIG90aGVyIHJpZ2h0cyBhcmUgZ3JhbnRlZCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLgorCistLT4KKzx4czpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6d3NhPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiBibG9ja0RlZmF1bHQ9IiNhbGwiPgorICA8IS0tIC8vLy8vLy8vLy8vLy8vLy8vLy8vIFdTLUFkZHJlc3NpbmcgLy8vLy8vLy8vLy8vLy8vLy8vLy8gLS0+CisgIDwhLS0gRW5kcG9pbnQgcmVmZXJlbmNlIC0tPgorICA8eHM6ZWxlbWVudCBuYW1lPSJFbmRwb2ludFJlZmVyZW5jZSIgdHlwZT0id3NhOkVuZHBvaW50UmVmZXJlbmNlVHlwZSIvPgorICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iRW5kcG9pbnRSZWZlcmVuY2VUeXBlIj4KKyAgICA8eHM6c2VxdWVuY2U+CisgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJBZGRyZXNzIiB0eXBlPSJ3c2E6QXR0cmlidXRlZFVSSSIvPgorICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmVmZXJlbmNlUHJvcGVydGllcyIgdHlwZT0id3NhOlJlZmVyZW5jZVByb3BlcnRpZXNUeXBlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlZmVyZW5jZVBhcmFtZXRlcnMiIHR5cGU9IndzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzVHlwZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJQb3J0VHlwZSIgdHlwZT0id3NhOkF0dHJpYnV0ZWRRTmFtZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTZXJ2aWNlTmFtZSIgdHlwZT0id3NhOlNlcnZpY2VOYW1lVHlwZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KKwkJCQkJIElmICJQb2xpY3kiIGVsZW1lbnRzIGZyb20gbmFtZXNwYWNlICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAyLzEyL3BvbGljeSNwb2xpY3kiIGFyZSB1c2VkLCB0aGV5IG11c3QgYXBwZWFyIGZpcnN0IChiZWZvcmUgYW55IGV4dGVuc2liaWxpdHkgZWxlbWVudHMpLgorCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+CisgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgICAgIDwveHM6YW55PgorICAgIDwveHM6c2VxdWVuY2U+CisgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+CisgIDwveHM6Y29tcGxleFR5cGU+CisgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJSZWZlcmVuY2VQcm9wZXJ0aWVzVHlwZSI+CisgICAgPHhzOnNlcXVlbmNlPgorICAgICAgPHhzOmFueSBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgIDwveHM6c2VxdWVuY2U+CisgIDwveHM6Y29tcGxleFR5cGU+CisgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJSZWZlcmVuY2VQYXJhbWV0ZXJzVHlwZSI+CisgICAgPHhzOnNlcXVlbmNlPgorICAgICAgPHhzOmFueSBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgIDwveHM6c2VxdWVuY2U+CisgIDwveHM6Y29tcGxleFR5cGU+CisgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJTZXJ2aWNlTmFtZVR5cGUiPgorICAgIDx4czpzaW1wbGVDb250ZW50PgorICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpRTmFtZSI+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iUG9ydE5hbWUiIHR5cGU9InhzOk5DTmFtZSIvPgorICAgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KKyAgICAgIDwveHM6ZXh0ZW5zaW9uPgorICAgIDwveHM6c2ltcGxlQ29udGVudD4KKyAgPC94czpjb21wbGV4VHlwZT4KKyAgPCEtLSBNZXNzYWdlIGluZm9ybWF0aW9uIGhlYWRlciBibG9ja3MgLS0+CisgIDx4czplbGVtZW50IG5hbWU9Ik1lc3NhZ2VJRCIgdHlwZT0id3NhOkF0dHJpYnV0ZWRVUkkiLz4KKyAgPHhzOmVsZW1lbnQgbmFtZT0iUmVsYXRlc1RvIiB0eXBlPSJ3c2E6UmVsYXRpb25zaGlwIi8+CisgIDx4czplbGVtZW50IG5hbWU9IlRvIiB0eXBlPSJ3c2E6QXR0cmlidXRlZFVSSSIvPgorICA8eHM6ZWxlbWVudCBuYW1lPSJBY3Rpb24iIHR5cGU9IndzYTpBdHRyaWJ1dGVkVVJJIi8+CisgIDx4czplbGVtZW50IG5hbWU9IkZyb20iIHR5cGU9IndzYTpFbmRwb2ludFJlZmVyZW5jZVR5cGUiLz4KKyAgPHhzOmVsZW1lbnQgbmFtZT0iUmVwbHlUbyIgdHlwZT0id3NhOkVuZHBvaW50UmVmZXJlbmNlVHlwZSIvPgorICA8eHM6ZWxlbWVudCBuYW1lPSJGYXVsdFRvIiB0eXBlPSJ3c2E6RW5kcG9pbnRSZWZlcmVuY2VUeXBlIi8+CisgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJSZWxhdGlvbnNoaXAiPgorICAgIDx4czpzaW1wbGVDb250ZW50PgorICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbnlVUkkiPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9IlJlbGF0aW9uc2hpcFR5cGUiIHR5cGU9InhzOlFOYW1lIiB1c2U9Im9wdGlvbmFsIi8+CisgICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorICAgICAgPC94czpleHRlbnNpb24+CisgICAgPC94czpzaW1wbGVDb250ZW50PgorICA8L3hzOmNvbXBsZXhUeXBlPgorICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJSZWxhdGlvbnNoaXBUeXBlVmFsdWVzIj4KKyAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6UU5hbWUiPgorICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ3c2E6UmVwbHkiLz4KKyAgICA8L3hzOnJlc3RyaWN0aW9uPgorICA8L3hzOnNpbXBsZVR5cGU+CisgIDx4czplbGVtZW50IG5hbWU9IlJlcGx5QWZ0ZXIiIHR5cGU9IndzYTpSZXBseUFmdGVyVHlwZSIvPgorICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iUmVwbHlBZnRlclR5cGUiPgorICAgIDx4czpzaW1wbGVDb250ZW50PgorICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiPgorICAgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIvPgorICAgICAgPC94czpleHRlbnNpb24+CisgICAgPC94czpzaW1wbGVDb250ZW50PgorICA8L3hzOmNvbXBsZXhUeXBlPgorICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJGYXVsdFN1YmNvZGVWYWx1ZXMiPgorICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpRTmFtZSI+CisgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IndzYTpJbnZhbGlkTWVzc2FnZUluZm9ybWF0aW9uSGVhZGVyIi8+CisgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IndzYTpNZXNzYWdlSW5mb3JtYXRpb25IZWFkZXJSZXF1aXJlZCIvPgorICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ3c2E6RGVzdGluYXRpb25VbnJlYWNoYWJsZSIvPgorICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ3c2E6QWN0aW9uTm90U3VwcG9ydGVkIi8+CisgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IndzYTpFbmRwb2ludFVuYXZhaWxhYmxlIi8+CisgICAgPC94czpyZXN0cmljdGlvbj4KKyAgPC94czpzaW1wbGVUeXBlPgorICA8eHM6YXR0cmlidXRlIG5hbWU9IkFjdGlvbiIgdHlwZT0ieHM6YW55VVJJIi8+CisgIDwhLS0gQ29tbW9uIGRlY2xhcmF0aW9ucyBhbmQgZGVmaW5pdGlvbnMgLS0+CisgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJBdHRyaWJ1dGVkUU5hbWUiPgorICAgIDx4czpzaW1wbGVDb250ZW50PgorICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpRTmFtZSI+CisgICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorICAgICAgPC94czpleHRlbnNpb24+CisgICAgPC94czpzaW1wbGVDb250ZW50PgorICA8L3hzOmNvbXBsZXhUeXBlPgorICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQXR0cmlidXRlZFVSSSI+CisgICAgPHhzOnNpbXBsZUNvbnRlbnQ+CisgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFueVVSSSI+CisgICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorICAgICAgPC94czpleHRlbnNpb24+CisgICAgPC94czpzaW1wbGVDb250ZW50PgorICA8L3hzOmNvbXBsZXhUeXBlPgorPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS9XUy9XUy1BZGRyZXNzaW5nMDMueHNkIGIvV1MvV1MtQWRkcmVzc2luZzAzLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjEwYThjCi0tLSAvZGV2L251bGwKKysrIGIvV1MvV1MtQWRkcmVzc2luZzAzLnhzZApAQCAtMCwwICsxLDExMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tIAorIAorTGVnYWwgRGlzY2xhaW1lcgorCitUaGUgcHJlc2VudGF0aW9uLCBkaXN0cmlidXRpb24gb3Igb3RoZXIgZGlzc2VtaW5hdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gCitjb250YWluZWQgaW4gdGhpcyBkb2N1bWVudCBpcyBub3QgYSBsaWNlbnNlLCBlaXRoZXIgZXhwcmVzc2x5IG9yIGltcGxpZWRseSwgCit0byBhbnkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG93bmVkIG9yIGNvbnRyb2xsZWQgYnkgQkVBIG9yIElCTSBvciBNaWNyb3NvZnQKK2FuZFxvciBhbnkgb3RoZXIgdGhpcmQgcGFydHkuICBCRUEgYW5kIElCTSBhbmQgTWljcm9zb2Z0IGFuZFxvciBhbnkgb3RoZXIKK3RoaXJkIHBhcnR5IG1heSBoYXZlIHBhdGVudHMsIHBhdGVudCBhcHBsaWNhdGlvbnMsIHRyYWRlbWFya3MsIGNvcHlyaWdodHMsIAorb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBjb3ZlcmluZyBzdWJqZWN0IG1hdHRlciBpbiB0aGlzIAorZG9jdW1lbnQuICBUaGUgZnVybmlzaGluZyBvZiB0aGlzIGRvY3VtZW50IGRvZXMgbm90IGdpdmUgeW91IGFueSBsaWNlbnNlIAordG8gQkVBJ3MgYW5kIElCTSdzIGFuZCBNaWNyb3NvZnQncyBvciBhbnkgb3RoZXIgdGhpcmQgcGFydHkncyBwYXRlbnRzLCAKK3RyYWRlbWFya3MsIGNvcHlyaWdodHMsIG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eS4KKworVGhpcyBkb2N1bWVudCBhbmQgdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBoZXJlaW4gaXMgcHJvdmlkZWQgb24gYW4gIkFTIElTIgorYmFzaXMgYW5kIHRvIHRoZSBtYXhpbXVtIGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIEJFQSBhbmQgSUJNIAorYW5kIE1pY3Jvc29mdCBwcm92aWRlIHRoZSBkb2N1bWVudCBBUyBJUyBBTkQgV0lUSCBBTEwgRkFVTFRTLCBhbmQgaGVyZWJ5IAorZGlzY2xhaW1zIGFsbCBvdGhlciB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBlaXRoZXIgZXhwcmVzcywgaW1wbGllZCBvciAKK3N0YXR1dG9yeSwgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIGFueSAoaWYgYW55KSBpbXBsaWVkIHdhcnJhbnRpZXMsIAorZHV0aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5LCBvZiBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgCitwdXJwb3NlLCBvZiBhY2N1cmFjeSBvciBjb21wbGV0ZW5lc3Mgb2YgcmVzcG9uc2VzLCBvZiByZXN1bHRzLCBvZiAKK3dvcmttYW5saWtlIGVmZm9ydCwgb2YgbGFjayBvZiB2aXJ1c2VzLCBhbmQgb2YgbGFjayBvZiBuZWdsaWdlbmNlLCBhbGwgd2l0aAorcmVnYXJkIHRvIHRoZSBkb2N1bWVudC4gQUxTTywgVEhFUkUgSVMgTk8gV0FSUkFOVFkgT1IgQ09ORElUSU9OIE9GIAorVElUTEUsIFFVSUVUIEVOSk9ZTUVOVCwgUVVJRVQgUE9TU0VTU0lPTiwgQ09SUkVTUE9OREVOQ0UgVE8gREVTQ1JJUFRJT04gT1IgCitOT04tSU5GUklOR0VNRU5UIE9GIEFOWSBJTlRFTExFQ1RVQUwgUFJPUEVSVFkgUklHSFRTIFdJVEggUkVHQVJEIFRPIFRIRSAKK0RPQ1VNRU5ULgorCitJTiBOTyBFVkVOVCBXSUxMIEJFQSBvciBJQk0gb3IgTUlDUk9TT0ZUIEJFIExJQUJMRSBUTyBBTlkgT1RIRVIgUEFSVFkgRk9SIFRIRQorQ09TVCBPRiBQUk9DVVJJTkcgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUywgTE9TVCBQUk9GSVRTLCBMT1NTIE9GIFVTRSwgCitMT1NTIE9GIERBVEEsIE9SIEFOWSBJTkNJREVOVEFMLCBDT05TRVFVRU5USUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBTUEVDSUFMIAorREFNQUdFUyBXSEVUSEVSIFVOREVSIENPTlRSQUNULCBUT1JULCBXQVJSQU5UWSwgT1IgT1RIRVJXSVNFLCBBUklTSU5HIElOIEFOWSAKK1dBWSBPVVQgT0YgVEhJUyBPUiBBTlkgT1RIRVIgQUdSRUVNRU5UIFJFTEFUSU5HIFRPIFRISVMgRE9DVU1FTlQsIFdIRVRIRVIgT1IgCitOT1QgU1VDSCBQQVJUWSBIQUQgQURWQU5DRSBOT1RJQ0UgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworQ29weXJpZ2h0IE5vdGljZQorCitDb3B5cmlnaHQgMjAwMyBCRUEgU3lzdGVtcyBJbmMuIGFuZCBJQk0gQ29ycG9yYXRpb24gYW5kIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworLS0+Cis8eHM6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMy8wMy9hZGRyZXNzaW5nIiB4bWxuczp3c2E9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDMvMDMvYWRkcmVzc2luZyIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgYmxvY2tEZWZhdWx0PSIjYWxsIj4KKworICAgPCEtLSAvLy8vLy8vLy8vLy8vLy8vLy8vLyBXUy1BZGRyZXNzaW5nIC8vLy8vLy8vLy8vLy8vLy8vLy8vIC0tPgorCTwhLS0gRW5kcG9pbnQgcmVmZXJlbmNlIC0tPgorCTx4czplbGVtZW50IG5hbWU9IkVuZHBvaW50UmVmZXJlbmNlIiB0eXBlPSJ3c2E6RW5kcG9pbnRSZWZlcmVuY2VUeXBlIi8+CisJPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkVuZHBvaW50UmVmZXJlbmNlVHlwZSI+CisJCTx4czpzZXF1ZW5jZT4KKwkJCTx4czplbGVtZW50IG5hbWU9IkFkZHJlc3MiIHR5cGU9IndzYTpBdHRyaWJ1dGVkVVJJIi8+CisJCQk8eHM6ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2VQcm9wZXJ0aWVzIiB0eXBlPSJ3c2E6UmVmZXJlbmNlUHJvcGVydGllc1R5cGUiIG1pbk9jY3Vycz0iMCIvPgorCQkJPHhzOmVsZW1lbnQgbmFtZT0iUG9ydFR5cGUiIHR5cGU9IndzYTpBdHRyaWJ1dGVkUU5hbWUiIG1pbk9jY3Vycz0iMCIvPgorCQkJPHhzOmVsZW1lbnQgbmFtZT0iU2VydmljZU5hbWUiIHR5cGU9IndzYTpTZXJ2aWNlTmFtZVR5cGUiIG1pbk9jY3Vycz0iMCIvPgorCQkJPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKwkJCQk8eHM6YW5ub3RhdGlvbj4KKwkJCQkJPHhzOmRvY3VtZW50YXRpb24+CisJCQkJCSBJZiAiUG9saWN5IiBlbGVtZW50cyBmcm9tIG5hbWVzcGFjZSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMi8xMi9wb2xpY3kjcG9saWN5IiBhcmUgdXNlZCwgdGhleSBtdXN0IGFwcGVhciBmaXJzdCAoYmVmb3JlIGFueSBleHRlbnNpYmlsaXR5IGVsZW1lbnRzKS4KKwkJCQkJPC94czpkb2N1bWVudGF0aW9uPgorCQkJCTwveHM6YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6YW55PgkJCQorCQk8L3hzOnNlcXVlbmNlPgorCQk8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KKwk8L3hzOmNvbXBsZXhUeXBlPgorCTx4czpjb21wbGV4VHlwZSBuYW1lPSJSZWZlcmVuY2VQcm9wZXJ0aWVzVHlwZSI+CisJCTx4czpzZXF1ZW5jZT4KKwkJCTx4czphbnkgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJPC94czpzZXF1ZW5jZT4KKwk8L3hzOmNvbXBsZXhUeXBlPgorCTx4czpjb21wbGV4VHlwZSBuYW1lPSJTZXJ2aWNlTmFtZVR5cGUiPgorCQk8eHM6c2ltcGxlQ29udGVudD4KKwkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6UU5hbWUiPgorCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iUG9ydE5hbWUiIHR5cGU9InhzOk5DTmFtZSIvPgorCQkJCTx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorCQkJPC94czpleHRlbnNpb24+CisJCTwveHM6c2ltcGxlQ29udGVudD4KKwk8L3hzOmNvbXBsZXhUeXBlPgorCTwhLS0gTWVzc2FnZSBpbmZvcm1hdGlvbiBoZWFkZXIgYmxvY2tzIC0tPgorCTx4czplbGVtZW50IG5hbWU9Ik1lc3NhZ2VJRCIgdHlwZT0id3NhOkF0dHJpYnV0ZWRVUkkiLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJSZWxhdGVzVG8iIHR5cGU9IndzYTpSZWxhdGlvbnNoaXAiLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJUbyIgdHlwZT0id3NhOkF0dHJpYnV0ZWRVUkkiLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJBY3Rpb24iIHR5cGU9IndzYTpBdHRyaWJ1dGVkVVJJIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iRnJvbSIgdHlwZT0id3NhOkVuZHBvaW50UmVmZXJlbmNlVHlwZSIvPgorCTx4czplbGVtZW50IG5hbWU9IlJlcGx5VG8iIHR5cGU9IndzYTpFbmRwb2ludFJlZmVyZW5jZVR5cGUiLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJGYXVsdFRvIiB0eXBlPSJ3c2E6RW5kcG9pbnRSZWZlcmVuY2VUeXBlIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iUmVjaXBpZW50IiB0eXBlPSJ3c2E6RW5kcG9pbnRSZWZlcmVuY2VUeXBlIi8+CisJPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlJlbGF0aW9uc2hpcCI+CisJCTx4czpzaW1wbGVDb250ZW50PgorCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbnlVUkkiPgorCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iUmVsYXRpb25zaGlwVHlwZSIgdHlwZT0ieHM6UU5hbWUiIHVzZT0ib3B0aW9uYWwiLz4KKwkJCQk8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KKwkJCTwveHM6ZXh0ZW5zaW9uPgorCQk8L3hzOnNpbXBsZUNvbnRlbnQ+CisJPC94czpjb21wbGV4VHlwZT4KKwk8eHM6c2ltcGxlVHlwZSBuYW1lPSJSZWxhdGlvbnNoaXBUeXBlVmFsdWVzIj4KKwkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOlFOYW1lIj4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0id3NhOlJlc3BvbnNlIi8+CisJCTwveHM6cmVzdHJpY3Rpb24+CisJPC94czpzaW1wbGVUeXBlPgorCTwhLS0gQ29tbW9uIGRlY2xhcmF0aW9ucyBhbmQgZGVmaW5pdGlvbnMgLS0+CisJPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkF0dHJpYnV0ZWRRTmFtZSI+CisJCTx4czpzaW1wbGVDb250ZW50PgorCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpRTmFtZSI+CisJCQkJPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+CisJCQk8L3hzOmV4dGVuc2lvbj4KKwkJPC94czpzaW1wbGVDb250ZW50PgorCTwveHM6Y29tcGxleFR5cGU+CisJPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkF0dHJpYnV0ZWRVUkkiPgorCQk8eHM6c2ltcGxlQ29udGVudD4KKwkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6YW55VVJJIj4KKwkJCQk8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KKwkJCTwveHM6ZXh0ZW5zaW9uPgorCQk8L3hzOnNpbXBsZUNvbnRlbnQ+CisJPC94czpjb21wbGV4VHlwZT4KKzwveHM6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1dTL1dTLURpc2NvdmVyeS53c2RsIGIvV1MvV1MtRGlzY292ZXJ5LndzZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ2MDYyMAotLS0gL2Rldi9udWxsCisrKyBiL1dTL1dTLURpc2NvdmVyeS53c2RsCkBAIC0wLDAgKzEsMTA2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKK0Zyb206IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDIvZGlzY292ZXJ5L2Rpc2NvdmVyeS53c2RsCisKKyhjKSAyMDA0IE1pY3Jvc29mdCBDb3Jwb3JhdGlvbiwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorVGhlIFdlYiBTZXJ2aWNlcyBEeW5hbWljIERpc2NvdmVyeSBXU0RMLCBhL2svYSBXUy1EaXNjb3ZlcnkgV1NETCAodGhlICJEb2N1bWVudCIpLCAKK3dhcyBkZXZlbG9wZWQgYnkgTWljcm9zb2Z0LCB3aXRoIHRoZSBhc3Npc3RhbmNlIG9mIEJFQSBTeXN0ZW1zLCBDYW5vbiwgSW5jLCBhbmQgSW50ZWwgCisoY29sbGVjdGl2ZWx5LCB0aGUgIkNvLURldmVsb3BlcnMiKS4gCisKK1RoZSBjb3B5cmlnaHQgaXMgb3duZWQgYnkgTWljcm9zb2Z0LCBhbmQgTWljcm9zb2Z0IGhlcmVieSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gY29weSBhbmQgCitkaXNwbGF5IHRoZSBEb2N1bWVudCwgaW4gYW55IG1lZGl1bSB3aXRob3V0IGZlZSBvciByb3lhbHR5LCBwcm92aWRlZCB0aGF0IHlvdSBpbmNsdWRlIAordGhlIGZvbGxvd2luZyBvbiBBTEwgY29waWVzIG9mIHRoZSBEb2N1bWVudCwgb3IgcG9ydGlvbnMgdGhlcmVvZiwgdGhhdCB5b3UgbWFrZTogCisxLglBIGxpbmsgb3IgVVJMIHRvIHRoZSBEb2N1bWVudCBhdCB0aGlzIGxvY2F0aW9uOiAKK2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDIvZGlzY292ZXJ5L2Rpc2NvdmVyeS53c2RsIAorMi4JVGhlIGNvcHlyaWdodCBub3RpY2UgYXMgc2hvd24gaW4gdGhlIERvY3VtZW50LiAKKworRVhDRVBUIEZPUiBUSEUgQ09QWVJJR0hUIExJQ0VOU0UgR1JBTlRFRCBBQk9WRSwgTUlDUk9TT0ZUIEFORCBUSEUgQ08tREVWRUxPUEVSUyBETyBOT1QgR1JBTlQsIAorRUlUSEVSIEVYUFJFU1NMWSBPUiBJTVBMSUVETFksIEEgTElDRU5TRSBUTyBBTlkgSU5URUxMRUNUVUFMIFBST1BFUlRZLCBJTkNMVURJTkcgUEFURU5UUywgCitUSEVZLCBPUiBBTlkgT1RIRVIgVEhJUkQgUEFSVElFUywgT1dOIE9SIENPTlRST0wuICBUSVRMRSBUTyBUSEUgQ09QWVJJR0hUIElOIFRIRSBET0NVTUVOVCAKK1dJTEwgQVQgQUxMIFRJTUVTIFJFTUFJTiBXSVRIIE1JQ1JPU09GVC4gCisKK1RIRSBET0NVTUVOVCBJUyBQUk9WSURFRCAiQVMgSVMsIiBNSUNST1NPRlQgQU5EIFRIRSBDTy1ERVZFTE9QRVJTIE1BS0UgTk8gUkVQUkVTRU5UQVRJT05TIAorT1IgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIE5PTi1JTkZSSU5HRU1FTlQsIE9SIFRJVExFOyBUSEFUIFRIRSBDT05URU5UUyBPRiBUSEUgCitET0NVTUVOVCBBUkUgU1VJVEFCTEUgRk9SIEFOWSBQVVJQT1NFOyBOT1IgVEhBVCBUSEUgSU1QTEVNRU5UQVRJT04gT0YgU1VDSCBDT05URU5UUyBXSUxMIAorTk9UIElORlJJTkdFIEFOWSBUSElSRCBQQVJUWSBQQVRFTlRTLCBDT1BZUklHSFRTLCBUUkFERU1BUktTIE9SIE9USEVSIFJJR0hUUy4gCisKK01JQ1JPU09GVCBBTkQgVEhFIENPLURFVkVMT1BFUlMgV0lMTCBOT1QgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgU1BFQ0lBTCwgSU5DSURFTlRBTCAKK09SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBPUiBSRUxBVElORyBUTyBBTlkgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgCitET0NVTUVOVC4gCisKK1RoZSBEb2N1bWVudCBtYXkgY2hhbmdlIGJlZm9yZSBmaW5hbCByZWxlYXNlIGFuZCB5b3UgYXJlIGNhdXRpb25lZCBhZ2FpbnN0IHJlbHlpbmcgb24gdGhlIAorY29udGVudCBvZiB0aGlzIERvY3VtZW50LiAKKworTm8gb3RoZXIgcmlnaHRzIGFyZSBncmFudGVkIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuCistLT4KKzx3c2RsOmRlZmluaXRpb25zCisgICAgdGFyZ2V0TmFtZXNwYWNlPSdodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzAyL2Rpc2NvdmVyeScKKyAgICB4bWxuczp0bnM9J2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDIvZGlzY292ZXJ5JworICAgIHhtbG5zOndzZGw9J2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvJyAKKyAgICB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnID4KKworICA8d3NkbDp0eXBlcz4KKyAgICA8eHM6c2NoZW1hPgorICAgICAgPHhzOmltcG9ydAorICAgICAgICAgIG5hbWVzcGFjZT0naHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wMi9kaXNjb3ZlcnknCisgICAgICAgICAgc2NoZW1hTG9jYXRpb249J2Rpc2NvdmVyeS54c2QnIC8+CisgICAgPC94czpzY2hlbWE+CisgIDwvd3NkbDp0eXBlcz4KKworICA8d3NkbDptZXNzYWdlIG5hbWU9J0hlbGxvTXNnJyA+CisgICAgPHdzZGw6cGFydCBuYW1lPSdib2R5JyBlbGVtZW50PSd0bnM6SGVsbG8nIC8+CisgIDwvd3NkbDptZXNzYWdlPgorCisgIDx3c2RsOm1lc3NhZ2UgbmFtZT0nQnllTXNnJyA+CisgICAgPHdzZGw6cGFydCBuYW1lPSdib2R5JyBlbGVtZW50PSd0bnM6QnllJyAvPgorICA8L3dzZGw6bWVzc2FnZT4KKworICA8d3NkbDptZXNzYWdlIG5hbWU9J1Byb2JlTXNnJyA+CisgICAgPHdzZGw6cGFydCBuYW1lPSdib2R5JyBlbGVtZW50PSd0bnM6UHJvYmUnIC8+CisgIDwvd3NkbDptZXNzYWdlPgorCisgIDx3c2RsOm1lc3NhZ2UgbmFtZT0nUHJvYmVNYXRjaE1zZycgPgorICAgIDx3c2RsOnBhcnQgbmFtZT0nYm9keScgZWxlbWVudD0ndG5zOlByb2JlTWF0Y2gnIC8+CisgIDwvd3NkbDptZXNzYWdlPgorCisgIDx3c2RsOm1lc3NhZ2UgbmFtZT0nUmVzb2x2ZU1zZycgLz4KKworICA8d3NkbDptZXNzYWdlIG5hbWU9J1Jlc29sdmVNYXRjaE1zZycgPgorICAgIDx3c2RsOnBhcnQgbmFtZT0nYm9keScgZWxlbWVudD0ndG5zOlJlc29sdmVNYXRjaCcgLz4KKyAgPC93c2RsOm1lc3NhZ2U+CisKKyAgPHdzZGw6cG9ydFR5cGUgbmFtZT0nRGlzY292ZXJ5JyA+CisgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9J0hlbGxvT3AnID4KKyAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSd0bnM6SGVsbG9Nc2cnIC8+CisgICAgPC93c2RsOm9wZXJhdGlvbj4KKyAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0nQnllT3AnID4KKyAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSd0bnM6QnllTXNnJyAvPgorICAgIDwvd3NkbDpvcGVyYXRpb24+CisgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9J1Byb2JlT3AnID4KKyAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9J3RuczpQcm9iZU1zZycgLz4KKyAgICA8L3dzZGw6b3BlcmF0aW9uPgorICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSdQcm9iZU1hdGNoT3AnID4KKyAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSd0bnM6UHJvYmVNYXRjaE1zZycgLz4KKyAgICA8L3dzZGw6b3BlcmF0aW9uPgorICA8L3dzZGw6cG9ydFR5cGU+CisKKyAgPHdzZGw6cG9ydFR5cGUgbmFtZT0nVGFyZ2V0U2VydmljZScgPgorICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSdSZXNvbHZlT3AnID4KKyAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9J3RuczpSZXNvbHZlTXNnJyAvPgorICAgIDwvd3NkbDpvcGVyYXRpb24+CisgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9J1Jlc29sdmVNYXRjaE9wJyA+CisgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ndG5zOlJlc29sdmVNYXRjaE1zZycgLz4KKyAgICA8L3dzZGw6b3BlcmF0aW9uPgorICA8L3dzZGw6cG9ydFR5cGU+CisKKyAgPCEtLSBJZiB0aGlzIHBvcnRUeXBlIGlzIGluY2x1ZGVkIGluIEVuZHBvaW50UmVmZXJlbmNlL1R5cGVzLCBpdAorICAgICAgIGluZGljYXRlcyB0aGUgVGFyZ2V0IFNlcnZpY2UgaXMgYSBEaXNjb3ZlcnkgUHJveHkuICBCZWNhdXNlCisgICAgICAgdGhpcyBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGRlZmluZSBwcm94eS1zcGVjaWZpYyBvcGVyYXRpb25zLAorICAgICAgIG5vIG9wZXJhdGlvbnMgYXJlIGRlZmluZWQgd2l0aGluIHRoaXMgcG9ydFR5cGU7IERpc2NvdmVyeQorICAgICAgIFByb3hpZXMgaW1wbGVtZW50IG90aGVyIHR5cGVzIHRoYXQgZGVmaW5lIHByb3h5LXNwZWNpZmljCisgICAgICAgb3BlcmF0aW9ucy4gIERpc2NvdmVyeSBQcm94aWVzIGFsc28gaW1wbGVtZW50CisgICAgICAgVGFyZ2V0U2VydmljZS4gLS0+CisgIDx3c2RsOnBvcnRUeXBlIG5hbWU9J0Rpc2NvdmVyeVByb3h5JyAvPgorCis8L3dzZGw6ZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvV1MvV1MtRW51bWVyYXRpb24ud3NkbCBiL1dTL1dTLUVudW1lcmF0aW9uLndzZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY5Yzk2OAotLS0gL2Rldi9udWxsCisrKyBiL1dTL1dTLUVudW1lcmF0aW9uLndzZGwKQEAgLTAsMCArMSw4OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisoYykgMjAwNCBCRUEgU3lzdGVtcyBJbmMuLCBDb21wdXRlciBBc3NvY2lhdGVzLCBNaWNyb3NvZnQgQ29ycG9yYXRpb24sIEluYy4sIFNvbmljIFNvZnR3YXJlLCBhbmQgU3lzdGluZXQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1Blcm1pc3Npb24gdG8gY29weSBhbmQgZGlzcGxheSB0aGUgV1MtRW51bWVyYXRpb24gKHRoZSAiU3BlY2lmaWNhdGlvbiIsIHdoaWNoIGluY2x1ZGVzIFdTREwgYW5kIHNjaGVtYSBkb2N1bWVudHMpLCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgZmVlIG9yIHJveWFsdHkgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgeW91IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBvbiBBTEwgY29waWVzIG9mIHRoZSBTcGVjaWZpY2F0aW9uIHRoYXQgeW91IG1ha2U6CisKKzEuCUEgbGluayBvciBVUkwgdG8gdGhlIFNwZWNpZmljYXRpb24gYXQgb25lIG9mIHRoZSBDby1EZXZlbG9wZXJzJyB3ZWJzaXRlcy4KKzIuCVRoZSBjb3B5cmlnaHQgbm90aWNlIGFzIHNob3duIGluIHRoZSBTcGVjaWZpY2F0aW9uLgorCitCRUEgU3lzdGVtcywgQ29tcHV0ZXIgQXNzb2NpYXRlcywgTWljcm9zb2Z0LCBTb25pYyBTb2Z0d2FyZSwgYW5kIFN5c3RpbmV0IChjb2xsZWN0aXZlbHksIHRoZSAiQ28tRGV2ZWxvcGVycyIpIGVhY2ggYWdyZWUgdG8gZ3JhbnQgeW91IGEgbGljZW5zZSwgdW5kZXIgcm95YWx0eS1mcmVlIGFuZCBvdGhlcndpc2UgcmVhc29uYWJsZSwgbm9uLWRpc2NyaW1pbmF0b3J5IHRlcm1zIGFuZCBjb25kaXRpb25zLCB0byB0aGVpciByZXNwZWN0aXZlIGVzc2VudGlhbCBwYXRlbnQgY2xhaW1zIHRoYXQgdGhleSBkZWVtIG5lY2Vzc2FyeSB0byBpbXBsZW1lbnQgdGhlIFNwZWNpZmljYXRpb24uCisKK1RIRSBTUEVDSUZJQ0FUSU9OIElTIFBST1ZJREVEICJBUyBJUywiIEFORCBUSEUgQ08tREVWRUxPUEVSUyBNQUtFIE5PIFJFUFJFU0VOVEFUSU9OUyBPUiBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIE5PTi1JTkZSSU5HRU1FTlQsIE9SIFRJVExFOyBUSEFUIFRIRSBDT05URU5UUyBPRiBUSEUgU1BFQ0lGSUNBVElPTiBBUkUgU1VJVEFCTEUgRk9SIEFOWSBQVVJQT1NFOyBOT1IgVEhBVCBUSEUgSU1QTEVNRU5UQVRJT04gT0YgU1VDSCBDT05URU5UUyBXSUxMIE5PVCBJTkZSSU5HRSBBTlkgVEhJUkQgUEFSVFkgUEFURU5UUywgQ09QWVJJR0hUUywgVFJBREVNQVJLUyBPUiBPVEhFUiBSSUdIVFMuCisKK1RIRSBDTy1ERVZFTE9QRVJTIFdJTEwgTk9UIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIE9SIFJFTEFUSU5HIFRPIEFOWSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBTUEVDSUZJQ0FUSU9OUy4KKworVGhlIG5hbWUgYW5kIHRyYWRlbWFya3Mgb2YgdGhlIENvLURldmVsb3BlcnMgbWF5IE5PVCBiZSB1c2VkIGluIGFueSBtYW5uZXIsIGluY2x1ZGluZyBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byB0aGUgU3BlY2lmaWNhdGlvbnMgb3IgdGhlaXIgY29udGVudHMgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiBUaXRsZSB0byBjb3B5cmlnaHQgaW4gdGhlIFNwZWNpZmljYXRpb25zIHdpbGwgYXQgYWxsIHRpbWVzIHJlbWFpbiB3aXRoIHRoZSBDby1EZXZlbG9wZXJzLgorTm8gb3RoZXIgcmlnaHRzIGFyZSBncmFudGVkIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuCistLT4KKzx3c2RsOmRlZmluaXRpb25zCisgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA5L2VudW1lcmF0aW9uIiAKKyAgICB4bWxuczp3c2VuPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA5L2VudW1lcmF0aW9uIgorICAgIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiAKKyAgICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiID4KKworICA8d3NkbDp0eXBlcz4KKyAgICA8eHM6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9lbnVtZXJhdGlvbiI+CisgICAgICA8eHM6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iZW51bWVyYXRpb24ueHNkIiAvPgorICAgIDwveHM6c2NoZW1hPgorICA8L3dzZGw6dHlwZXM+CisKKyAgPHdzZGw6bWVzc2FnZSBuYW1lPSJFbnVtZXJhdGVNc2ciPgorICAgIDx3c2RsOnBhcnQgbmFtZT0iYm9keSIgZWxlbWVudD0id3NlbjpFbnVtZXJhdGUiIC8+CisgIDwvd3NkbDptZXNzYWdlPgorICA8d3NkbDptZXNzYWdlIG5hbWU9IkVudW1lcmF0ZVJlc3BvbnNlTXNnIj4KKyAgICA8d3NkbDpwYXJ0IG5hbWU9ImJvZHkiIGVsZW1lbnQ9IndzZW46RW51bWVyYXRlUmVzcG9uc2UiIC8+CisgIDwvd3NkbDptZXNzYWdlPgorICA8d3NkbDptZXNzYWdlIG5hbWU9IlB1bGxNc2ciPgorICAgIDx3c2RsOnBhcnQgbmFtZT0iYm9keSIgZWxlbWVudD0id3NlbjpQdWxsIiAvPgorICA8L3dzZGw6bWVzc2FnZT4KKyAgPHdzZGw6bWVzc2FnZSBuYW1lPSJQdWxsUmVzcG9uc2VNc2ciPgorICAgIDx3c2RsOnBhcnQgbmFtZT0iYm9keSIgZWxlbWVudD0id3NlbjpQdWxsUmVzcG9uc2UiIC8+CisgIDwvd3NkbDptZXNzYWdlPgorICA8d3NkbDptZXNzYWdlIG5hbWU9IlJlbmV3TXNnIiA+CisgICAgPHdzZGw6cGFydCBuYW1lPSJib2R5IiBlbGVtZW50PSJ3c2VuOlJlbmV3IiAvPgorICA8L3dzZGw6bWVzc2FnZT4KKyAgPHdzZGw6bWVzc2FnZSBuYW1lPSJSZW5ld1Jlc3BvbnNlTXNnIiA+CisgICAgPHdzZGw6cGFydCBuYW1lPSJib2R5IiBlbGVtZW50PSJ3c2VuOlJlbmV3UmVzcG9uc2UiIC8+CisgIDwvd3NkbDptZXNzYWdlPgorICA8d3NkbDptZXNzYWdlIG5hbWU9IkdldFN0YXR1c01zZyIgPgorICAgIDx3c2RsOnBhcnQgbmFtZT0iYm9keSIgZWxlbWVudD0id3NlbjpHZXRTdGF0dXMiIC8+CisgIDwvd3NkbDptZXNzYWdlPgorICA8d3NkbDptZXNzYWdlIG5hbWU9IkdldFN0YXR1c1Jlc3BvbnNlTXNnIiA+CisgICAgPHdzZGw6cGFydCBuYW1lPSJib2R5IiBlbGVtZW50PSJ3c2VuOkdldFN0YXR1c1Jlc3BvbnNlIiAvPgorICA8L3dzZGw6bWVzc2FnZT4KKyAgPHdzZGw6bWVzc2FnZSBuYW1lPSJSZWxlYXNlTXNnIj4KKyAgICA8d3NkbDpwYXJ0IG5hbWU9ImJvZHkiIGVsZW1lbnQ9IndzZW46UmVsZWFzZSIgLz4KKyAgPC93c2RsOm1lc3NhZ2U+CisgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iUmVsZWFzZVJlc3BvbnNlTXNnIiAvPgorICA8d3NkbDptZXNzYWdlIG5hbWU9IkVudW1lcmF0aW9uRW5kTXNnIiA+CisgICAgPHdzZGw6cGFydCBuYW1lPSJib2R5IiBlbGVtZW50PSJ3c2VuOkVudW1lcmF0aW9uRW5kIiAvPgorICA8L3dzZGw6bWVzc2FnZT4KKyAgCisgIDx3c2RsOnBvcnRUeXBlIG5hbWU9IkRhdGFTb3VyY2UiPgorICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJFbnVtZXJhdGVPcCI+CisgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJ3c2VuOkVudW1lcmF0ZU1zZyIgLz4KKyAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJ3c2VuOkVudW1lcmF0ZVJlc3BvbnNlTXNnIiAvPgorICAgIDwvd3NkbDpvcGVyYXRpb24+CisgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9IlB1bGxPcCI+CisgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJ3c2VuOlB1bGxNc2ciIC8+CisgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0id3NlbjpQdWxsUmVzcG9uc2VNc2ciIC8+CisgICAgPC93c2RsOm9wZXJhdGlvbj4KKyAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iUmVuZXdPcCIgPgorICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0id3NlbjpSZW5ld01zZyIgLz4KKyAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJ3c2VuOlJlbmV3UmVzcG9uc2VNc2ciIC8+CisgICAgPC93c2RsOm9wZXJhdGlvbj4KKyAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iR2V0U3RhdHVzT3AiID4KKyAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9IndzZW46R2V0U3RhdHVzTXNnIiAvPgorICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9IndzZW46R2V0U3RhdHVzUmVzcG9uc2VNc2ciIC8+CisgICAgPC93c2RsOm9wZXJhdGlvbj4KKyAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iUmVsZWFzZU9wIj4KKyAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9IndzZW46UmVsZWFzZU1zZyIgLz4KKyAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJ3c2VuOlJlbGVhc2VSZXNwb25zZU1zZyIgLz4KKyAgICA8L3dzZGw6b3BlcmF0aW9uPgorICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJFbnVtZXJhdGlvbkVuZE9wIiA+CisgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0id3NlbjpFbnVtZXJhdGlvbkVuZCIgLz4KKyAgICA8L3dzZGw6b3BlcmF0aW9uPgorICA8L3dzZGw6cG9ydFR5cGU+Cis8L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS9XUy9XUy1Qb2xpY3kueHNkIGIvV1MvV1MtUG9saWN5LnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWZhYTMwCi0tLSAvZGV2L251bGwKKysrIGIvV1MvV1MtUG9saWN5LnhzZApAQCAtMCwwICsxLDExOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisoYykgMjAwMS0yMDA0IEJFQSBTeXN0ZW1zIEluYy4sIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24sIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbiwgSW5jLiwgU0FQIEFHLCBTb25pYyBTb2Z0d2FyZSwgYW5kIFZlcmlTaWduLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1Blcm1pc3Npb24gdG8gY29weSBhbmQgZGlzcGxheSB0aGUgV1MtUG9saWN5IFNwZWNpZmljYXRpb24gKHRoZSAiU3BlY2lmaWNhdGlvbiIsIHdoaWNoIGluY2x1ZGVzIFdTREwgYW5kIHNjaGVtYSBkb2N1bWVudHMpLCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgZmVlIG9yIHJveWFsdHkgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgeW91IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBvbiBBTEwgY29waWVzIG9mIHRoZSBXUy1Qb2xpY3kgU3BlY2lmaWNhdGlvbiwgdGhhdCB5b3UgbWFrZToKKworMS4JQSBsaW5rIG9yIFVSTCB0byB0aGUgV1MtUG9saWN5IFNwZWNpZmljYXRpb24gYXQgb25lIG9mIHRoZSBBdXRob3JzJyB3ZWJzaXRlcworMi4JVGhlIGNvcHlyaWdodCBub3RpY2UgYXMgc2hvd24gaW4gdGhlIFdTLVBvbGljeSBTcGVjaWZpY2F0aW9uLgorCitCRUEgU3lzdGVtcywgSUJNLCBNaWNyb3NvZnQsIFNBUCwgU29uaWMgU29mdHdhcmUsIGFuZCBWZXJpU2lnbiAoY29sbGVjdGl2ZWx5LCB0aGUgIkF1dGhvcnMiKSBlYWNoIGFncmVlIHRvIGdyYW50IHlvdSBhIGxpY2Vuc2UsIHVuZGVyIHJveWFsdHktZnJlZSBhbmQgb3RoZXJ3aXNlIHJlYXNvbmFibGUsIG5vbi1kaXNjcmltaW5hdG9yeSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgdG8gdGhlaXIgcmVzcGVjdGl2ZSBlc3NlbnRpYWwgcGF0ZW50IGNsYWltcyB0aGF0IHRoZXkgZGVlbSBuZWNlc3NhcnkgdG8gaW1wbGVtZW50IHRoZSBXUy1Qb2xpY3kgU3BlY2lmaWNhdGlvbi4KKworVEhFIFdTLVBPTElDWSBTUEVDSUZJQ0FUSU9OIElTIFBST1ZJREVEICJBUyBJUywiIEFORCBUSEUgQVVUSE9SUyBNQUtFIE5PIFJFUFJFU0VOVEFUSU9OUyBPUiBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIE5PTi1JTkZSSU5HRU1FTlQsIE9SIFRJVExFOyBUSEFUIFRIRSBDT05URU5UUyBPRiBUSEUgV1MtUE9MSUNZIFNQRUNJRklDQVRJT04gQVJFIFNVSVRBQkxFIEZPUiBBTlkgUFVSUE9TRTsgTk9SIFRIQVQgVEhFIElNUExFTUVOVEFUSU9OIE9GIFNVQ0ggQ09OVEVOVFMgV0lMTCBOT1QgSU5GUklOR0UgQU5ZIFRISVJEIFBBUlRZIFBBVEVOVFMsIENPUFlSSUdIVFMsIFRSQURFTUFSS1MgT1IgT1RIRVIgUklHSFRTLgorCitUSEUgQVVUSE9SUyBXSUxMIE5PVCBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBPUiBSRUxBVElORyBUTyBBTlkgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgV1MtUE9MSUNZIFNQRUNJRklDQVRJT04uCisKK1RoZSBuYW1lIGFuZCB0cmFkZW1hcmtzIG9mIHRoZSBBdXRob3JzIG1heSBOT1QgYmUgdXNlZCBpbiBhbnkgbWFubmVyLCBpbmNsdWRpbmcgYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhlIFdTLVBvbGljeSBTcGVjaWZpY2F0aW9uIG9yIGl0cyBjb250ZW50cyB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uIFRpdGxlIHRvIGNvcHlyaWdodCBpbiB0aGUgV1MtUG9saWN5IFNwZWNpZmljYXRpb24gd2lsbCBhdCBhbGwgdGltZXMgcmVtYWluIHdpdGggdGhlIEF1dGhvcnMuCisKK05vIG90aGVyIHJpZ2h0cyBhcmUgZ3JhbnRlZCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLgorLS0+Cis8eHM6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9wb2xpY3kiCisgICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9wb2xpY3kiCisgICAgICAgICAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKKyAgICAgICAgICAgeG1sbnM6d3NzZT0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIgorICAgICAgICAgICB4bWxuczp3c3U9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS11dGlsaXR5LTEuMC54c2QiCisgICAgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgorICAgICAgICAgICBibG9ja0RlZmF1bHQ9IiNhbGwiID4KKworICA8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIgorICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiIC8+CisKKyAgPHhzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS11dGlsaXR5LTEuMC54c2QiCisgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS11dGlsaXR5LTEuMC54c2QiIC8+CisKKyAgPCEtLSAvLy8vLy8vLy8vIFdTLVBvbGljeSAvLy8vLy8vLy8vIC0tPgorCisgIDx4czplbGVtZW50IG5hbWU9IlBvbGljeSIgPgorICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgIDx4czpjb21wbGV4Q29udGVudD4KKyAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ0bnM6T3BlcmF0b3JDb250ZW50VHlwZSIgPgorICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iVGFyZ2V0TmFtZXNwYWNlIgorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHM6YW55VVJJIgorICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJvcHRpb25hbCIgLz4KKyAgICAgICAgICA8eHM6YXR0cmlidXRlIHJlZj0id3N1OklkIiB1c2U9Im9wdGlvbmFsIiAvPgorICAgICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI2FueSIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+CisgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgorICAgICAgPC94czpjb21wbGV4Q29udGVudD4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICA8L3hzOmVsZW1lbnQ+CisgIDx4czplbGVtZW50IG5hbWU9IkFsbCIgdHlwZT0idG5zOk9wZXJhdG9yQ29udGVudFR5cGUiIC8+CisgIDx4czplbGVtZW50IG5hbWU9IkV4YWN0bHlPbmUiIHR5cGU9InRuczpPcGVyYXRvckNvbnRlbnRUeXBlIiAvPgorCisgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJPcGVyYXRvckNvbnRlbnRUeXBlIiA+CisgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiA+CisgICAgICA8eHM6ZWxlbWVudCByZWY9InRuczpQb2xpY3kiIC8+CisgICAgICA8eHM6ZWxlbWVudCByZWY9InRuczpBbGwiIC8+CisgICAgICA8eHM6ZWxlbWVudCByZWY9InRuczpFeGFjdGx5T25lIiAvPgorICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ0bnM6UG9saWN5UmVmZXJlbmNlIiAvPgorICAgICAgPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgorICAgIDwveHM6Y2hvaWNlPgorICA8L3hzOmNvbXBsZXhUeXBlPgorCisgIDx4czplbGVtZW50IG5hbWU9IlBvbGljeVJlZmVyZW5jZSIgPgorICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iVVJJIiB0eXBlPSJ4czphbnlVUkkiIC8+CisgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9IkRpZ2VzdCIgdHlwZT0ieHM6YmFzZTY0QmluYXJ5IiB1c2U9Im9wdGlvbmFsIiAvPgorICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJEaWdlc3RBbGdvcml0aG0iIHR5cGU9InhzOmFueVVSSSIgdXNlPSJvcHRpb25hbCIgLz4KKyAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI2FueSIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+CisgICAgPC94czpjb21wbGV4VHlwZT4KKyAgPC94czplbGVtZW50PgorCisgIDx4czphdHRyaWJ1dGUgbmFtZT0iT3B0aW9uYWwiIHR5cGU9InhzOmJvb2xlYW4iIC8+CisKKyAgPCEtLSAvLy8vLy8vLy8vIFdTLVBvbGljeUF0dGFjaG1lbnQgLy8vLy8vLy8vLyAtLT4KKworICA8eHM6ZWxlbWVudCBuYW1lPSJVc2luZ1BvbGljeSIgPgorICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI2FueSIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+CisgICAgPC94czpjb21wbGV4VHlwZT4KKyAgPC94czplbGVtZW50PgorCisgIDx4czphdHRyaWJ1dGUgbmFtZT0iUG9saWN5VVJJcyIgPgorICAgIDx4czpzaW1wbGVUeXBlPgorICAgICAgPHhzOmxpc3QgaXRlbVR5cGU9InhzOmFueVVSSSIgLz4KKyAgICA8L3hzOnNpbXBsZVR5cGU+CisgIDwveHM6YXR0cmlidXRlPgorCisgIDx4czplbGVtZW50IG5hbWU9IlBvbGljeUF0dGFjaG1lbnQiID4KKyAgICA8eHM6Y29tcGxleFR5cGU+CisgICAgICA8eHM6c2VxdWVuY2U+CisgICAgICAgIDx4czplbGVtZW50IHJlZj0idG5zOkFwcGxpZXNUbyIgLz4KKyAgICAgICAgPHhzOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgPgorICAgICAgICAgIDx4czplbGVtZW50IHJlZj0idG5zOlBvbGljeSIgLz4KKyAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InRuczpQb2xpY3lSZWZlcmVuY2UiIC8+CisgICAgICAgIDwveHM6Y2hvaWNlPgorPCEtLSBvbWl0dGVkIG9ubHkgYmVjYXVzZSBpdCBjYXVzZXMgdGhlIGNvbnRlbnQgbW9kZWwgdG8gYmUgbm9uLWRldGVybWlzdGljCisgICAgICAgIDx4czplbGVtZW50IHJlZj0id3NzZTpTZWN1cml0eSIgbWluT2NjdXJzPSIwIiAvPgorLS0+CisgICAgICAgIDx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIgorICAgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0ibGF4IgorICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKKyAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KKyAgICAgIDwveHM6c2VxdWVuY2U+CisgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNhbnkiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgorICAgIDwveHM6Y29tcGxleFR5cGU+CisgIDwveHM6ZWxlbWVudD4KKworICA8eHM6ZWxlbWVudCBuYW1lPSJBcHBsaWVzVG8iID4KKyAgICA8eHM6Y29tcGxleFR5cGU+CisgICAgICA8eHM6c2VxdWVuY2U+CisgICAgICAgIDx4czphbnkgbmFtZXNwYWNlPSIjI2FueSIKKyAgICAgICAgICAgICAgICBwcm9jZXNzQ29udGVudHM9ImxheCIKKyAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KKyAgICAgIDwveHM6c2VxdWVuY2U+CisgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNhbnkiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgorICAgIDwveHM6Y29tcGxleFR5cGU+CisgIDwveHM6ZWxlbWVudD4KKworPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS9XUy9XUy1Sb3V0aW5nLnhzZCBiL1dTL1dTLVJvdXRpbmcueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYzZlODAKLS0tIC9kZXYvbnVsbAorKysgYi9XUy9XUy1Sb3V0aW5nLnhzZApAQCAtMCwwICsxLDEzOCBAQAorPD94bWwgdmVyc2lvbj0nMS4wJz8+Cis8IS0tIFhNTCBTY2hlbWEgZm9yIFNPQVAtUlAgLS0+Cis8IS0tIENvcHlyaWdodCAyMDAxIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworVGhlIHByZXNlbnRhdGlvbiwgZGlzdHJpYnV0aW9uIG9yIG90aGVyIGRpc3NlbWluYXRpb24gb2YgdGhlCitpbmZvcm1hdGlvbiBjb250YWluZWQgaGVyZWluIGJ5IE1pY3Jvc29mdCBpcyBub3QgYSBsaWNlbnNlLCBlaXRoZXIKK2V4cHJlc3NseSBvciBpbXBsaWVkbHksIHRvIGFueSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb3duZWQgb3IKK2NvbnRyb2xsZWQgYnkgTWljcm9zb2Z0LgorCitUaGlzIGRvY3VtZW50IGFuZCB0aGUgaW5mb3JtYXRpb24gY29udGFpbmVkIGhlcmVpbiBpcyBwcm92aWRlZCBvbiBhbgorIkFTIElTIiBiYXNpcyBhbmQgdG8gdGhlIG1heGltdW0gZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywKK01pY3Jvc29mdCBwcm92aWRlcyB0aGUgZG9jdW1lbnQgQVMgSVMgQU5EIFdJVEggQUxMIEZBVUxUUywgYW5kIGhlcmVieQorZGlzY2xhaW1zIGFsbCBvdGhlciB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBlaXRoZXIgZXhwcmVzcywgaW1wbGllZAorb3Igc3RhdHV0b3J5LCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgYW55IChpZiBhbnkpIGltcGxpZWQKK3dhcnJhbnRpZXMsIGR1dGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSwgb2YgZml0bmVzcyBmb3IgYQorcGFydGljdWxhciBwdXJwb3NlLCBvZiBhY2N1cmFjeSBvciBjb21wbGV0ZW5lc3Mgb2YgcmVzcG9uc2VzLCBvZgorcmVzdWx0cywgb2Ygd29ya21hbmxpa2UgZWZmb3J0LCBvZiBsYWNrIG9mIHZpcnVzZXMsIGFuZCBvZiBsYWNrIG9mCituZWdsaWdlbmNlLCBhbGwgd2l0aCByZWdhcmQgdG8gdGhlIGRvY3VtZW50LiBBTFNPLCBUSEVSRSBJUyBOTworV0FSUkFOVFkgT1IgQ09ORElUSU9OIE9GIFRJVExFLCBRVUlFVCBFTkpPWU1FTlQsIFFVSUVUIFBPU1NFU1NJT04sCitDT1JSRVNQT05ERU5DRSBUTyBERVNDUklQVElPTiBPUiBOT04tSU5GUklOR0VNRU5UIFdJVEggUkVHQVJEIFRPIFRIRQorRE9DVU1FTlQuCisKK0lOIE5PIEVWRU5UIFdJTEwgTUlDUk9TT0ZUIEJFIExJQUJMRSBUTyBBTlkgT1RIRVIgUEFSVFkgRk9SIFRIRSBDT1NUCitPRiBQUk9DVVJJTkcgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUywgTE9TVCBQUk9GSVRTLCBMT1NTIE9GIFVTRSwKK0xPU1MgT0YgREFUQSwgT1IgQU5ZIElOQ0lERU5UQUwsIENPTlNFUVVFTlRJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SCitTUEVDSUFMIERBTUFHRVMgV0hFVEhFUiBVTkRFUiBDT05UUkFDVCwgVE9SVCwgV0FSUkFOVFksIE9SIE9USEVSV0lTRSwKK0FSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhJUyBPUiBBTlkgT1RIRVIgQUdSRUVNRU5UIFJFTEFUSU5HIFRPIFRISVMKK0RPQ1VNRU5ULCBXSEVUSEVSIE9SIE5PVCBTVUNIIFBBUlRZIEhBRCBBRFZBTkNFIE5PVElDRSBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4gIC0tPgorPCFET0NUWVBFIHNjaGVtYSBQVUJMSUMgIi0vL1czQy8vRFREIFhNTFNDSEVNQSAyMDAxMDIvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEuZHRkIiA+Cis8c2NoZW1hIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYScgeG1sbnM6dG5zPSdodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9ycC8nIHRhcmdldE5hbWVzcGFjZT0naHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvcnAvJyBmaW5hbERlZmF1bHQ9JyNhbGwnPgorICAgICAKKzwhLS0gU09BUC1SUCBwYXRoIGNvbnN0cnVjdCAtLT4KKyAgCis8ZWxlbWVudCBuYW1lPSdwYXRoJyB0eXBlPSd0bnM6cGF0aF90Jy8+Cis8Y29tcGxleFR5cGUgbmFtZT0ncGF0aF90Jz4KKyA8c2VxdWVuY2U+CisgIDxlbGVtZW50IHJlZj0ndG5zOmFjdGlvbicvPgorICA8ZWxlbWVudCByZWY9J3Ruczp0bycgbWluT2NjdXJzPScwJy8+CisgIDxlbGVtZW50IHJlZj0ndG5zOmZ3ZCcgbWluT2NjdXJzPScwJy8+CisgIDxlbGVtZW50IHJlZj0ndG5zOnJldicgbWluT2NjdXJzPScwJy8+CisgIDxlbGVtZW50IHJlZj0ndG5zOmZyb20nIG1pbk9jY3Vycz0nMCcvPgorICA8ZWxlbWVudCByZWY9J3RuczppZCcgbWluT2NjdXJzPScwJy8+CisgIDxlbGVtZW50IHJlZj0ndG5zOnJlbGF0ZXNUbycgbWluT2NjdXJzPScwJy8+CisgIDxlbGVtZW50IHJlZj0ndG5zOmZhdWx0JyBtaW5PY2N1cnM9JzAnLz4KKyA8L3NlcXVlbmNlPgorIDxhbnlBdHRyaWJ1dGUvPgorPC9jb21wbGV4VHlwZT4KKyAgICAgICAgICAKKzxlbGVtZW50IG5hbWU9J2FjdGlvbicgdHlwZT0ndG5zOmFjdGlvbl90Jy8+Cis8c2ltcGxlVHlwZSBuYW1lPSdhY3Rpb25fdCc+CisgPHJlc3RyaWN0aW9uIGJhc2U9J2FueVVSSScvPgorPC9zaW1wbGVUeXBlPgorCis8ZWxlbWVudCBuYW1lPSd0bycgdHlwZT0ndG5zOnRvX3QnLz4KKzxzaW1wbGVUeXBlIG5hbWU9J3RvX3QnPgorIDxyZXN0cmljdGlvbiBiYXNlPSdhbnlVUkknLz4KKzwvc2ltcGxlVHlwZT4KKworPGVsZW1lbnQgbmFtZT0ndmlhJyB0eXBlPSd0bnM6dmlhX3QnLz4KKzxjb21wbGV4VHlwZSBuYW1lPSd2aWFfdCc+CisgPHNpbXBsZUNvbnRlbnQ+CisgIDxleHRlbnNpb24gYmFzZT0nYW55VVJJJz4KKyAgIDxhdHRyaWJ1dGUgbmFtZT0ndmlkJyB0eXBlPSdhbnlVUkknIHVzZT0nb3B0aW9uYWwnLz4KKyAgPC9leHRlbnNpb24+CisgPC9zaW1wbGVDb250ZW50PgorPC9jb21wbGV4VHlwZT4KKworPGVsZW1lbnQgbmFtZT0nZndkJyB0eXBlPSd0bnM6ZndkX3QnLz4KKzxjb21wbGV4VHlwZSBuYW1lPSdmd2RfdCc+CisgPHNlcXVlbmNlPgorICA8ZWxlbWVudCByZWY9J3Ruczp2aWEnIG1pbk9jY3Vycz0nMCcgbWF4T2NjdXJzPSd1bmJvdW5kZWQnLz4KKyA8L3NlcXVlbmNlPgorIDxhbnlBdHRyaWJ1dGUvPgorPC9jb21wbGV4VHlwZT4KKworPGVsZW1lbnQgbmFtZT0ncmV2JyB0eXBlPSd0bnM6cmV2X3QnLz4KKzxjb21wbGV4VHlwZSBuYW1lPSdyZXZfdCc+CisgPHNlcXVlbmNlPgorICA8ZWxlbWVudCByZWY9J3Ruczp2aWEnIG1pbk9jY3Vycz0nMCcgbWF4T2NjdXJzPSd1bmJvdW5kZWQnLz4KKyA8L3NlcXVlbmNlPgorIDxhbnlBdHRyaWJ1dGUvPgorPC9jb21wbGV4VHlwZT4KKworPGVsZW1lbnQgbmFtZT0nZnJvbScgdHlwZT0ndG5zOmZyb21fdCcvPgorPHNpbXBsZVR5cGUgbmFtZT0nZnJvbV90Jz4KKyA8cmVzdHJpY3Rpb24gYmFzZT0nYW55VVJJJy8+Cis8L3NpbXBsZVR5cGU+CisKKzxlbGVtZW50IG5hbWU9J2lkJyB0eXBlPSd0bnM6aWRfdCcvPgorPHNpbXBsZVR5cGUgbmFtZT0naWRfdCc+CisgPHJlc3RyaWN0aW9uIGJhc2U9J2FueVVSSScvPgorPC9zaW1wbGVUeXBlPgorCis8ZWxlbWVudCBuYW1lPSdyZWxhdGVzVG8nIHR5cGU9J3RuczpyZWxhdGVzVG9fdCcvPgorPHNpbXBsZVR5cGUgbmFtZT0ncmVsYXRlc1RvX3QnPgorIDxyZXN0cmljdGlvbiBiYXNlPSdhbnlVUkknLz4KKzwvc2ltcGxlVHlwZT4KKworPCEtLSBTT0FQLVJQIGZhdWx0IC0tPgorCis8ZWxlbWVudCBuYW1lPSdmYXVsdGNvZGUnIHR5cGU9J3RuczpmYXVsdGNvZGVfdCcvPgorPHNpbXBsZVR5cGUgbmFtZT0nZmF1bHRjb2RlX3QnPgorICA8cmVzdHJpY3Rpb24gYmFzZT0naW50ZWdlcicvPgorPC9zaW1wbGVUeXBlPgorCis8ZWxlbWVudCBuYW1lPSdmYXVsdHJlYXNvbicgdHlwZT0ndG5zOmZhdWx0cmVhc29uX3QnLz4KKzxzaW1wbGVUeXBlIG5hbWU9J2ZhdWx0cmVhc29uX3QnPgorIDxyZXN0cmljdGlvbiBiYXNlPSdzdHJpbmcnPgorIDwvcmVzdHJpY3Rpb24+Cis8L3NpbXBsZVR5cGU+CisKKzwhLS0gT25seSBjZXJ0YWluIGNvbWJpbmF0aW9ucyBvZiB0aGUgZm9sbG93aW5nIGFyZQorICAgICB2YWxpZCBhbmQgdGhleSB0aWUgaW50byB0aGUgZmF1bHQgY29kZSAtLT4KKworPGVsZW1lbnQgbmFtZT0nZm91bmQnIHR5cGU9J3Ruczpmb3VuZF90Jy8+Cis8Y29tcGxleFR5cGUgbmFtZT0nZm91bmRfdCc+CisgPHNlcXVlbmNlPgorICA8ZWxlbWVudCBuYW1lPSdhdCcgdHlwZT0nYW55VVJJJyBtYXhPY2N1cnM9J3VuYm91bmRlZCcvPgorIDwvc2VxdWVuY2U+CisgPGFueUF0dHJpYnV0ZS8+Cis8L2NvbXBsZXhUeXBlPgorCis8ZWxlbWVudCBuYW1lPSdmYXVsdCcgdHlwZT0ndG5zOmZhdWx0X3QnLz4KKzxjb21wbGV4VHlwZSBuYW1lPSdmYXVsdF90Jz4KKyA8c2VxdWVuY2U+CisgIDxlbGVtZW50IHJlZj0ndG5zOmZhdWx0Y29kZScvPgorICA8ZWxlbWVudCByZWY9J3RuczpmYXVsdHJlYXNvbicvPgorICA8ZWxlbWVudCBuYW1lPSdlbmRwb2ludCcgdHlwZT0nYW55VVJJJyBtaW5PY2N1cnM9JzAnLz4KKyAgPGVsZW1lbnQgbmFtZT0nZm91bmQnIHR5cGU9J3Ruczpmb3VuZF90JyBtaW5PY2N1cnM9JzAnLz4KKyAgPGVsZW1lbnQgbmFtZT0nbWF4c2l6ZScgdHlwZT0naW50ZWdlcicgbWluT2NjdXJzPScwJy8+CisgIDxlbGVtZW50IG5hbWU9J21heHRpbWUnIHR5cGU9J2ludGVnZXInIG1pbk9jY3Vycz0nMCcvPgorICA8ZWxlbWVudCBuYW1lPSdyZXRyeUFmdGVyJyB0eXBlPSdpbnRlZ2VyJyBtaW5PY2N1cnM9JzAnLz4gIAorIDwvc2VxdWVuY2U+CisgPGFueUF0dHJpYnV0ZS8+Cis8L2NvbXBsZXhUeXBlPgorCis8L3NjaGVtYT4KZGlmZiAtLWdpdCBhL1dTL1dTLXR5cGVtYXAuZGF0IGIvV1MvV1MtdHlwZW1hcC5kYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEyYWE4NwotLS0gL2Rldi9udWxsCisrKyBiL1dTL1dTLXR5cGVtYXAuZGF0CkBAIC0wLDAgKzEsMzI4IEBACisjCVdTLXR5cGVtYXAuZGF0CisjCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKKyNDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyNUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR3byBsaWNlbnNlczoKKyNHUEwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNHUEwgbGljZW5zZS4KKyMKKyNUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgorI3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisjRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKyN2ZXJzaW9uLgorIworI1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKKyNXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorI3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKKyNQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisjCisjQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CisjZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIwlCaW5kaW5ncyBmb3IgV1MtKiBwcm90b2NvbHM6CisKK3dzcnAJPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvcnAvIgord3Nlbgk9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA5L2VudW1lcmF0aW9uIgord3NhCT0gPGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZz4KK3dzYTMJPSA8aHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMy8wMy9hZGRyZXNzaW5nPgord3NwCT0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDkvcG9saWN5IgorCisjCXdzYTpBdHRyaWJ1dGVkUU5hbWUgaXMgYSBRTmFtZSBlbGVtZW50IGV4dGVuc2libGUgd2l0aCBhdHRyaWJ1dGVzLgorIwlXZSByZWRlY2xhcmUgaXQgYXMgYSBRTmFtZSBzdHJpbmcsIGFzc3VtaW5nIHdlIGRvbid0IG5lZWQgYXR0cmlidXRlczoKKword3NhX19BdHRyaWJ1dGVkUU5hbWUJPSB8IF9RTmFtZQord3NhM19fQXR0cmlidXRlZFFOYW1lCT0gfCBfUU5hbWUKKworIwl3c2E6QXR0cmlidXRlZFVSSSBpcyBhbiBhbnlVUkkgZWxlbWVudCBleHRlbnNpYmxlIHdpdGggYXR0cmlidXRlcy4KKyMJV2UgcmVkZWNsYXJlIGl0IGFzIGEgcmVndWxhciBzdHJpbmcsIGFzc3VtaW5nIHdlIGRvbid0IG5lZWQgYXR0cmlidXRlczoKKword3NhX19BdHRyaWJ1dGVkVVJJCT0gfCBjaGFyKgord3NhM19fQXR0cmlidXRlZFVSSQk9IHwgY2hhcioKKworIwl3c2E6UmVwbHlBZnRlclR5cGUgaXMgYW4gbm9ubmVnYXRpdmVJbnRlZ2VyIGV4dGVuc2libGUgd2l0aCBhdHRyaWJ1dGVzLgorIwlXZSByZWRlY2xhcmUgaXQgaGVyZSwgYXNzdW1pbmcgd2UgZG9uJ3QgbmVlZCBhdHRyaWJ1dGVzOgorCit3c2FfX1JlcGx5QWZ0ZXJUeXBlCT0gfCB1bnNpZ25lZCBpbnQKKworIwl3c3NlLCB3c3UsIGRzLCBhbmQgeGVuYyBiaW5kaW5ncworCit3c3NlCT0gPGh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZD4KK3dzdQk9IDxodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktdXRpbGl0eS0xLjAueHNkPgorZHMJPSA8aHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIz4KK3hlbmMJPSA8aHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxlbmMjPgorCit3c3NlMgk9IDxodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAyLzEyL3NlY2V4dD4KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMJd3N1IHJlZGVmaW5pdGlvbnMKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK193c3VfX0lkCQk9IHwgY2hhcioKK193c3VfX0NyZWF0ZWQJCT0gfCBjaGFyKgorX3dzdV9fRXhwaXJlcwkJPSB8IGNoYXIqCisKK3dzdV9fQXR0cmlidXRlZERhdGVUaW1lCT0gfCB0aW1lX3QKK3dzdV9fQXR0cmlidXRlZFVSSQk9IHwgY2hhcioKKword3N1X19UaW1lc3RhbXBUeXBlCT0KKworX3dzdV9fVGltZXN0YW1wID1cCit0eXBlZGVmIHN0cnVjdCBfd3N1X19UaW1lc3RhbXBcblwKK3sJQGNoYXIqCXdzdV9fSWQ7CS8vIHVzZSBxdWFsaWZpZWQgZm9ybSB0byBlbmFibGUgc2lnbmF0dXJlXG5cCisJY2hhcioJQ3JlYXRlZDtcblwKKwljaGFyKglFeHBpcmVzO1xuXAorfSBfd3N1X19UaW1lc3RhbXA7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjCXdzc2UgcmVkZWZpbml0aW9ucworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyB3c3NlOkF0dHJpYnV0ZWRTdHJpbmcgaGFzIGEgd3N1OklkIHdlIGRvbid0IG5lZWQKK3dzc2VfX0F0dHJpYnV0ZWRTdHJpbmcgPSB8IGNoYXIqCisKKyMgd3NzZTpFbmNvZGVkU3RyaW5nIGhhcyBhbiBFbmNvZGluZ1R5cGUgYXR0cmlidXRlIHdlIGRvbid0IG5lZWQgZm9yIE5vbmNlCit3c3NlX19FbmNvZGVkU3RyaW5nID0gfCBjaGFyKgorCisjIERvbid0IHVzZSBnbG9iYWwgd3NzZTpOb25jZQorX3dzc2VfX05vbmNlID0KKworIyBEb24ndCB1c2Ugd3NzZTp0VXNhZ2UgYW5kIGdsb2JhbCB3c3NlOlVzYWdlCit3c3NlX190VXNhZ2UgPQorX3dzc2VfX1VzYWdlID0KKworIyBEb24ndCB1c2Ugd3NzZTpQYXNzd29yZFN0cmluZword3NzZV9fUGFzc3dvcmRTdHJpbmcgPQorCisjIEJ1dCB1c2Ugd3NzZTpQYXNzd29yZCBlbGVtZW50IHdpdGggc2ltaWxhciBjb250ZW50Citfd3NzZV9fUGFzc3dvcmQgPVwKK3R5cGVkZWYgc3RydWN0IF93c3NlX19QYXNzd29yZFxuXAorewljaGFyKgkJCQkJX19pdGVtO1xuXAorCUBjaGFyKgkJCQkJVHlwZTtcblwKK30gX3dzc2VfX1Bhc3N3b3JkOworCisjIERvbid0IHVzZSB3c3NlOlVzZXJuYW1lVG9rZW5UeXBlCit3c3NlX19Vc2VybmFtZVRva2VuVHlwZSA9CisKKyMgQnV0IHVzZSB3c3NlOlVzZXJuYW1lVG9rZW4gZWxlbWVudCB3aXRoIHNpbWlsYXIgY29udGVudAorX3dzc2VfX1VzZXJuYW1lVG9rZW4gPVwKK3R5cGVkZWYgc3RydWN0IF93c3NlX19Vc2VybmFtZVRva2VuXG5cCit7CWNoYXIqCQkJCQlVc2VybmFtZTtcblwKKwlzdHJ1Y3QgX3dzc2VfX1Bhc3N3b3JkKgkJCVBhc3N3b3JkO1xuXAorCWNoYXIqCQkJCQlOb25jZTtcblwKKwljaGFyKgkJCQkJd3N1X19DcmVhdGVkO1xuXAorCUBjaGFyKgkJCQkJd3N1X19JZDtcblwKK30gX3dzc2VfX1VzZXJuYW1lVG9rZW47CisKKyMgRG9uJ3QgdXNlIHdzc2U6QmluYXJ5U2VjdXJpdHlUb2tlblR5cGUKK3dzc2VfX0JpbmFyeVNlY3VyaXR5VG9rZW5UeXBlID0KKworIyBCdXQgdXNlIHdzc2U6QmluYXJ5U2VjdXJpdHlUb2tlbiBlbGVtZW50IHdpdGggc2ltaWxhciBjb250ZW50Citfd3NzZV9fQmluYXJ5U2VjdXJpdHlUb2tlbiA9XAordHlwZWRlZiBzdHJ1Y3QgX3dzc2VfX0JpbmFyeVNlY3VyaXR5VG9rZW5cblwKK3sJY2hhcioJCQkJCV9faXRlbTtcblwKKwlAY2hhcioJCQkJCXdzdV9fSWQ7XG5cCisJQGNoYXIqCQkJCQlWYWx1ZVR5cGU7XG5cCisJQGNoYXIqCQkJCQlFbmNvZGluZ1R5cGU7XG5cCit9IF93c3NlX19CaW5hcnlTZWN1cml0eVRva2VuOworCisjIERvbid0IHVzZSB3c3NlOlNlY3VyaXR5VG9rZW5SZWZlcmVuY2VUeXBlCit3c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlVHlwZSA9CisKKyMgQnV0IHVzZSB3c3NlOlNlY3VyaXR5VG9rZW5SZWZlcmVuY2UgZWxlbWVudAorX3dzc2VfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2UgPVwKK3R5cGVkZWYgc3RydWN0IF93c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlXG5cCit7CXN0cnVjdCBfd3NzZV9fUmVmZXJlbmNlKgkJUmVmZXJlbmNlO1xuXAorCXN0cnVjdCBfd3NzZV9fS2V5SWRlbnRpZmllcioJCUtleUlkZW50aWZpZXI7XG5cCisJc3RydWN0IF93c3NlX19FbWJlZGRlZCoJCQlFbWJlZGRlZDtcblwKKwlAY2hhcioJCQkJCXdzdV9fSWQ7XG5cCisJQGNoYXIqCQkJCQlVc2FnZTtcblwKK30gX3dzc2VfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2U7CisKKyMgRG9uJ3QgdXNlIHdzc2U6UmVmZXJlbmNlVHlwZQord3NzZV9fUmVmZXJlbmNlVHlwZSA9CisKKyMgQnV0IHVzZSB3c3NlOlJlZmVyZW5jZSBlbGVtZW50Citfd3NzZV9fUmVmZXJlbmNlID1cCit0eXBlZGVmIHN0cnVjdCBfd3NzZV9fUmVmZXJlbmNlXG5cCit7CUBjaGFyKgkJCQkJVVJJO1xuXAorCUBjaGFyKgkJCQkJVmFsdWVUeXBlO1xuXAorfSBfd3NzZV9fUmVmZXJlbmNlOworCisjIERvbid0IHVzZSB3c3NlOktleUlkZW50aWZpZXJUeXBlCit3c3NlX19LZXlJZGVudGlmaWVyVHlwZSA9CisKKyMgQnV0IHVzZSB3c3NlOktleUlkZW50aWZpZXIKK193c3NlX19LZXlJZGVudGlmaWVyID1cCit0eXBlZGVmIHN0cnVjdCBfd3NzZV9fS2V5SWRlbnRpZmllclxuXAorewljaGFyKgkJCQkJX19pdGVtO1xuXAorCUBjaGFyKgkJCQkJd3N1X19JZDtcblwKKwlAY2hhcioJCQkJCVZhbHVlVHlwZTtcblwKKwlAY2hhcioJCQkJCUVuY29kaW5nVHlwZTtcblwKK30gX3dzc2VfX0tleUlkZW50aWZpZXI7CisKKyMgRG9uJ3QgdXNlIHdzc2U6RW1iZWRkZWRUeXBlCit3c3NlX19FbWJlZGRlZFR5cGUgPQorCisjIEJ1dCB1c2Ugd3NzZTpLZXlJZGVudGlmaWVyCitfd3NzZV9fRW1iZWRkZWQgPVwKK3R5cGVkZWYgc3RydWN0IF93c3NlX19FbWJlZGRlZFxuXAorewkvKiBFeHRlbnNpYmxlIHdpdGggZW1iZWRkZWQgdG9rZW5zIGFuZCBhc3NlcnRpb25zICovXG5cCisJQGNoYXIqCQkJCQl3c3VfX0lkO1xuXAorCUBjaGFyKgkJCQkJVmFsdWVUeXBlO1xuXAorfSBfd3NzZV9fRW1iZWRkZWQ7CisKKyMgRG9uJ3QgdXNlIHdzc2U6VHJhbnNmb3JtYXRpb25QYXJhbWV0ZXJzVHlwZQord3NzZV9fVHJhbnNmb3JtYXRpb25QYXJhbWV0ZXJzVHlwZSA9CisKKyMgRG9uJ3QgdXNlIHdzc2U6VHJhbnNmb3JtYXRpb25QYXJhbWV0ZXJzCitfd3NzZV9fVHJhbnNmb3JtYXRpb25QYXJhbWV0ZXJzID0KKworIyBEb24ndCB1c2Ugd3NzZTpTZWN1cml0eUhlYWRlclR5cGUKK3dzc2VfX1NlY3VyaXR5SGVhZGVyVHlwZSA9CisKKyMgQnV0IHVzZSB3c3NlOlNlY3VyaXR5IGVsZW1lbnQgd2l0aCBhZGRpdGlvbmFsIGNvbnRlbnQKK193c3NlX19TZWN1cml0eSA9XAorI2ltcG9ydCAiZHMuaCJcblwKK3R5cGVkZWYgc3RydWN0IF93c3NlX19TZWN1cml0eVxuXAorewlzdHJ1Y3QgX3dzdV9fVGltZXN0YW1wKgkJCXdzdV9fVGltZXN0YW1wO1xuXAorCXN0cnVjdCBfd3NzZV9fVXNlcm5hbWVUb2tlbioJCVVzZXJuYW1lVG9rZW47XG5cCisJc3RydWN0IF93c3NlX19CaW5hcnlTZWN1cml0eVRva2VuKglCaW5hcnlTZWN1cml0eVRva2VuO1xuXAorCXN0cnVjdCBkc19fU2lnbmF0dXJlVHlwZSoJCWRzX19TaWduYXR1cmU7XG5cCisJQGNoYXIqCQkJCQlTT0FQX0VOVl9fYWN0b3I7XG5cCisJQGNoYXIqCQkJCQlTT0FQX0VOVl9fcm9sZTtcblwKK30gX3dzc2VfX1NlY3VyaXR5OworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIwlkcyByZWRlZmluaXRpb25zCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitkc19fQ3J5cHRvQmluYXJ5ID0gfCBjaGFyKiAvKmJhc2U2NCovCisKK2RzX19EaWdlc3RWYWx1ZVR5cGUgPSB8IGNoYXIqIC8qYmFzZTY0Ki8KKworZHNfX0hNQUNPdXRwdXRMZW5ndGhUeXBlID0gfCBpbnQKKworZHNfX1RyYW5zZm9ybVR5cGUgPSAjaW1wb3J0ICJjMTRuLmgiXG5cCit0eXBlZGVmIHN0cnVjdCBkc19fVHJhbnNmb3JtVHlwZVxuXAorewlfYzE0bl9fSW5jbHVzaXZlTmFtZXNwYWNlcyoJCWMxNG5fX0luY2x1c2l2ZU5hbWVzcGFjZXM7XG5cCisgICAgICAgIF9YTUwJCQkJCV9fYW55O1xuXAorCUBjaGFyKgkJCQkJQWxnb3JpdGhtO1xuXAorfSBkc19fVHJhbnNmb3JtVHlwZTsKKworZHNfX0tleUluZm9UeXBlID1cCit0eXBlZGVmIHN0cnVjdCBkc19fS2V5SW5mb1R5cGVcblwKK3sJY2hhcioJCQkJCUtleU5hbWU7XG5cCisJc3RydWN0IGRzX19LZXlWYWx1ZVR5cGUqCQlLZXlWYWx1ZTtcblwKKwlzdHJ1Y3QgZHNfX1JldHJpZXZhbE1ldGhvZFR5cGUqCQlSZXRyaWV2YWxNZXRob2Q7XG5cCisJc3RydWN0IGRzX19YNTA5RGF0YVR5cGUqCQlYNTA5RGF0YTtcblwKKwlzdHJ1Y3QgX3dzc2VfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2UqCXdzc2VfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2U7XG5cCisJQGNoYXIqCQkJCQlJZDtcblwKK30gZHNfX0tleUluZm9UeXBlOworCitkc19fU2lnbmF0dXJlVHlwZSA9XAordHlwZWRlZiBzdHJ1Y3QgZHNfX1NpZ25hdHVyZVR5cGVcblwKK3sJc3RydWN0IGRzX19TaWduZWRJbmZvVHlwZSoJCVNpZ25lZEluZm87XG5cCisJY2hhcioJCQkJCVNpZ25hdHVyZVZhbHVlO1xuXAorCXN0cnVjdCBkc19fS2V5SW5mb1R5cGUqCQkJS2V5SW5mbztcblwKKwlAY2hhcioJCQkJCUlkO1xuXAorfSBkc19fU2lnbmF0dXJlVHlwZTsKKworIyBBZGQgYzE0bjpJbmNsdXNpdmVOYW1lc3BhY2VzIGVsZW1lbnQgdG8gZHM6Q2Fub25pY2FsaXphdGlvbk1ldGhvZFR5cGUKK2RzX19DYW5vbmljYWxpemF0aW9uTWV0aG9kVHlwZSA9ICRcCisgICAgX2MxNG5fX0luY2x1c2l2ZU5hbWVzcGFjZXMqCQljMTRuX19JbmNsdXNpdmVOYW1lc3BhY2VzOworCisjIGRzOlNpZ25hdHVyZVZhbHVlVHlwZSBoYXMgYW4gSWQgd2UgZG9uJ3QgbmVlZAorZHNfX1NpZ25hdHVyZVZhbHVlVHlwZSA9CisKK2RzX19PYmplY3RUeXBlID0KKworZHNfX01hbmlmZXN0VHlwZSA9CisKK2RzX19TaWduYXR1cmVQcm9wZXJ0eVR5cGUgPQorCitkc19fU2lnbmF0dXJlUHJvcGVydGllc1R5cGUgPQorCitkc19fUEdQRGF0YVR5cGUgPQorCitkc19fU1BLSURhdGFUeXBlID0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMJQ29tbW9uIGRlZmluaXRpb25zCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjCVVzZSByZWd1bGFyIGNoYXIqIHN0cmluZ3MgZm9yIElECisKK3hzZF9fSUQJCQk9IHwgY2hhciogLypJRCovCisKKyMJVXNlIHJlZ3VsYXIgY2hhciogc3RyaW5ncyBmb3IgTkNOYW1lCisKK3hzZF9fTkNOYW1lCQk9IHwgY2hhciogLypOQ05hbWUqLworCisjCVVzZSByZWd1bGFyIGNoYXIqIHN0cmluZ3MgZm9yIGFueVVSSQorCit4c2RfX2FueVVSSQkJPSB8IGNoYXIqIC8qVVJJKi8KKworIwlVc2UgYnVpbHQtaW4gZ1NPQVAgX1FOYW1lCisKK3hzZF9fUU5hbWUJCT0gfCBfUU5hbWUgfCBfUU5hbWUKKworIwlNYXAgeHNkOmludGVnZXIgdG8gaW50CisKK3hzZF9faW50ZWdlcgkJPSB8IGludAorCisjCU1hcCB4c2Q6bm9uTmVnYXRpdmVJbnRlZ2VyIHRvIHVuc2lnbmVkIGludAorCit4c2RfX25vbk5lZ2F0aXZlSW50ZWdlcgk9IHwgdW5zaWduZWQgaW50CisKKyMJTWFwIHhzZDpiYXNlNjRCaW5hcnkgdG8gY2hhciogYW5kIG1hbmlwdWxhdGUgYmFzZTY0IGRhdGEgaW50ZXJuYWxseQorCit4c2RfX2Jhc2U2NEJpbmFyeQk9IHwgY2hhciogLypiYXNlNjQqLworCisjCU1hcCB4c2Q6Ym9vbGVhbiB0byB4c2RfX2Jvb2xlYW5fIHRvIGF2b2lkIHJlZGVmcworCit4c2RfX2Jvb2xlYW4JCT0gZW51bSB4c2RfX2Jvb2xlYW5fIHsgX2ZhbHNlLCBfdHJ1ZSB9OyB8IGVudW0geHNkX19ib29sZWFuXworCisjCVJlZGVjbGFyZSB3c3JwOmFjdGlvbl90CisKK3dzcnBfX2FjdGlvbl9VU0NPUkV0CT0gfCBjaGFyKgorCisjCVJlZGVjbGFyZSB3c3JwOnRvX3QKKword3NycF9fdG9fVVNDT1JFdAk9IHwgY2hhcioKKworIwlSZWRlY2xhcmUgd3NycDpmcm9tX3QKKword3NycF9fZnJvbV9VU0NPUkV0CT0gfCBjaGFyKgorCisjCVJlZGVjbGFyZSB3c3JwOmlkX3QKKword3NycF9faWRfVVNDT1JFdAk9IHwgY2hhcioKKworIwlSZWRlY2xhcmUgd3NycDpyZWxhdGVzVG9fdAorCit3c3JwX19yZWxhdGVzVG9fVVNDT1JFdAk9IHwgY2hhcioKKworIwlSZWRlY2xhcmUgd3NycDpmYXVsdGNvZGVfdAorCit3c3JwX19mYXVsdGNvZGVfVVNDT1JFdAk9IHwgY2hhcioKKworIwlSZWRlY2xhcmUgd3NycDpmYXVsdHJlYXNvbl90CisKK3dzcnBfX2ZhdWx0cmVhc29uX1VTQ09SRXQgPSB8IGNoYXIqCisKZGlmZiAtLWdpdCBhL1dTL2Rpc2NvdmVyeS54c2QgYi9XUy9kaXNjb3ZlcnkueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NjRlODAKLS0tIC9kZXYvbnVsbAorKysgYi9XUy9kaXNjb3ZlcnkueHNkCkBAIC0wLDAgKzEsMTU4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKKyhjKSAyMDA0IE1pY3Jvc29mdCBDb3Jwb3JhdGlvbiwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorVGhlIFdlYiBTZXJ2aWNlcyBEeW5hbWljIERpc2NvdmVyeSBTY2hlbWEsIGEvay9hIFdTLURpc2NvdmVyeSBTY2hlbWEgKHRoZSAiRG9jdW1lbnQiKSwgCit3YXMgZGV2ZWxvcGVkIGJ5IE1pY3Jvc29mdCwgd2l0aCB0aGUgYXNzaXN0YW5jZSBvZiBCRUEgU3lzdGVtcywgQ2Fub24sIEluYywgYW5kIEludGVsIAorKGNvbGxlY3RpdmVseSwgdGhlICJDby1EZXZlbG9wZXJzIikuIAorCitUaGUgY29weXJpZ2h0IGlzIG93bmVkIGJ5IE1pY3Jvc29mdCwgYW5kIE1pY3Jvc29mdCBoZXJlYnkgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kIAorZGlzcGxheSB0aGUgRG9jdW1lbnQsIGluIGFueSBtZWRpdW0gd2l0aG91dCBmZWUgb3Igcm95YWx0eSwgcHJvdmlkZWQgdGhhdCB5b3UgaW5jbHVkZSAKK3RoZSBmb2xsb3dpbmcgb24gQUxMIGNvcGllcyBvZiB0aGUgRG9jdW1lbnQsIG9yIHBvcnRpb25zIHRoZXJlb2YsIHRoYXQgeW91IG1ha2U6IAorMS4JQSBsaW5rIG9yIFVSTCB0byB0aGUgRG9jdW1lbnQgYXQgdGhpcyBsb2NhdGlvbjogCitodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzAyL2Rpc2NvdmVyeS9kaXNjb3ZlcnkueHNkIAorMi4JVGhlIGNvcHlyaWdodCBub3RpY2UgYXMgc2hvd24gaW4gdGhlIERvY3VtZW50LiAKKworRVhDRVBUIEZPUiBUSEUgQ09QWVJJR0hUIExJQ0VOU0UgR1JBTlRFRCBBQk9WRSwgTUlDUk9TT0ZUIEFORCBUSEUgQ08tREVWRUxPUEVSUyBETyBOT1QgR1JBTlQsIAorRUlUSEVSIEVYUFJFU1NMWSBPUiBJTVBMSUVETFksIEEgTElDRU5TRSBUTyBBTlkgSU5URUxMRUNUVUFMIFBST1BFUlRZLCBJTkNMVURJTkcgUEFURU5UUywgCitUSEVZLCBPUiBBTlkgT1RIRVIgVEhJUkQgUEFSVElFUywgT1dOIE9SIENPTlRST0wuICBUSVRMRSBUTyBUSEUgQ09QWVJJR0hUIElOIFRIRSBET0NVTUVOVCAKK1dJTEwgQVQgQUxMIFRJTUVTIFJFTUFJTiBXSVRIIE1JQ1JPU09GVC4gCisKK1RIRSBET0NVTUVOVCBJUyBQUk9WSURFRCAiQVMgSVMsIiBNSUNST1NPRlQgQU5EIFRIRSBDTy1ERVZFTE9QRVJTIE1BS0UgTk8gUkVQUkVTRU5UQVRJT05TIAorT1IgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIE5PTi1JTkZSSU5HRU1FTlQsIE9SIFRJVExFOyBUSEFUIFRIRSBDT05URU5UUyBPRiBUSEUgCitET0NVTUVOVCBBUkUgU1VJVEFCTEUgRk9SIEFOWSBQVVJQT1NFOyBOT1IgVEhBVCBUSEUgSU1QTEVNRU5UQVRJT04gT0YgU1VDSCBDT05URU5UUyBXSUxMIAorTk9UIElORlJJTkdFIEFOWSBUSElSRCBQQVJUWSBQQVRFTlRTLCBDT1BZUklHSFRTLCBUUkFERU1BUktTIE9SIE9USEVSIFJJR0hUUy4gCisKK01JQ1JPU09GVCBBTkQgVEhFIENPLURFVkVMT1BFUlMgV0lMTCBOT1QgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgU1BFQ0lBTCwgSU5DSURFTlRBTCAKK09SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBPUiBSRUxBVElORyBUTyBBTlkgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgCitET0NVTUVOVC4gCisKK1RoZSBEb2N1bWVudCBtYXkgY2hhbmdlIGJlZm9yZSBmaW5hbCByZWxlYXNlIGFuZCB5b3UgYXJlIGNhdXRpb25lZCBhZ2FpbnN0IHJlbHlpbmcgb24gdGhlIAorY29udGVudCBvZiB0aGlzIERvY3VtZW50LiAKKworTm8gb3RoZXIgcmlnaHRzIGFyZSBncmFudGVkIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuCistLT4KKzx4czpzY2hlbWEKKyAgICB0YXJnZXROYW1lc3BhY2U9J2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDIvZGlzY292ZXJ5JworICAgIHhtbG5zOnRucz0naHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wMi9kaXNjb3ZlcnknCisgICAgeG1sbnM6d3NhPSdodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAzLzAzL2FkZHJlc3NpbmcnCisgICAgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJworICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0ncXVhbGlmaWVkJworICAgIGJsb2NrRGVmYXVsdD0nI2FsbCcgPgorCisgIDx4czppbXBvcnQKKyAgICAgIG5hbWVzcGFjZT0naHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMy8wMy9hZGRyZXNzaW5nJworICAgICAgc2NoZW1hTG9jYXRpb249J2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDMvMDMvYWRkcmVzc2luZycgLz4KKworICA8IS0tIC8vLy8vLy8vLy8vLy8vLy8vLy8vIFdTLURpc2NvdmVyeSAvLy8vLy8vLy8vLy8vLy8vLy8vLyAtLT4KKworICA8IS0tIE1lc3NhZ2VzIC0tPgorCisgIDx4czplbGVtZW50IG5hbWU9J0hlbGxvJyB0eXBlPSd0bnM6RGlzY292ZXJ5UmVmZXJlbmNlVHlwZScgLz4KKworICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nRGlzY292ZXJ5UmVmZXJlbmNlVHlwZScgPgorICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgIDx4czplbGVtZW50IHJlZj0nd3NhOkVuZHBvaW50UmVmZXJlbmNlJyAvPgorICAgICAgPHhzOmVsZW1lbnQgcmVmPSd0bnM6VHlwZXMnIG1pbk9jY3Vycz0nMCcgLz4KKyAgICAgIDx4czplbGVtZW50IHJlZj0ndG5zOlNjb3BlcycgbWluT2NjdXJzPScwJyAvPgorICAgICAgPHhzOmVsZW1lbnQgcmVmPSd0bnM6TWV0YWRhdGFWZXJzaW9uJyAvPgorICAgICAgPHhzOmFueSBuYW1lc3BhY2U9JyMjb3RoZXInCisgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0nbGF4JworICAgICAgICAgICAgICBtaW5PY2N1cnM9JzAnCisgICAgICAgICAgICAgIG1heE9jY3Vycz0ndW5ib3VuZGVkJyAvPgorICAgIDwveHM6c2VxdWVuY2U+CisgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9JyMjb3RoZXInIHByb2Nlc3NDb250ZW50cz0nbGF4JyAvPgorICA8L3hzOmNvbXBsZXhUeXBlPgorCisgIDx4czplbGVtZW50IG5hbWU9J0J5ZScgPgorICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSd3c2E6RW5kcG9pbnRSZWZlcmVuY2UnIC8+CisgICAgICAgIDx4czphbnkgbmFtZXNwYWNlPScjI2FueScKKyAgICAgICAgICAgICAgICBwcm9jZXNzQ29udGVudHM9J2xheCcKKyAgICAgICAgICAgICAgICBtaW5PY2N1cnM9JzAnCisgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSd1bmJvdW5kZWQnIC8+CisgICAgICAgIDwhLS0gIyNhbnkgYWxsb3dzIHNpbXBsaWZ5aW5nIGFuIGltcGxlbWVudGF0aW9uIHRvCisgICAgICAgICAgICAgc2VuZCB0aGUgc2FtZSBjaGlsZHJlbiBpbiBCeWUgYXMgaW4gSGVsbG8gLS0+CisgICAgICA8L3hzOnNlcXVlbmNlPgorICAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9JyMjb3RoZXInIHByb2Nlc3NDb250ZW50cz0nbGF4JyAvPgorICAgIDwveHM6Y29tcGxleFR5cGU+CisgIDwveHM6ZWxlbWVudD4KKworICA8eHM6ZWxlbWVudCBuYW1lPSdQcm9iZScgPgorICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSd0bnM6VHlwZXMnIG1pbk9jY3Vycz0nMCcgLz4KKyAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSd0bnM6U2NvcGUnIG1pbk9jY3Vycz0nMCcgLz4KKyAgICAgICAgPHhzOmFueSBuYW1lc3BhY2U9JyMjb3RoZXInCisgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSdsYXgnCisgICAgICAgICAgICAgICAgbWluT2NjdXJzPScwJworICAgICAgICAgICAgICAgIG1heE9jY3Vycz0ndW5ib3VuZGVkJyAvPgorICAgICAgPC94czpzZXF1ZW5jZT4KKyAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPScjI290aGVyJyBwcm9jZXNzQ29udGVudHM9J2xheCcgLz4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICA8L3hzOmVsZW1lbnQ+CisKKyAgPHhzOmVsZW1lbnQgbmFtZT0nUHJvYmVNYXRjaCcgdHlwZT0ndG5zOkRpc2NvdmVyeVJlZmVyZW5jZVR5cGUnIC8+CisKKyAgPCEtLSBObyBib2R5IGRlZmluZWQgZm9yIFJlc29sdmUgLS0+CisKKyAgPHhzOmVsZW1lbnQgbmFtZT0nUmVzb2x2ZU1hdGNoJyB0eXBlPSd0bnM6RGlzY292ZXJ5UmVmZXJlbmNlVHlwZScgLz4KKworICA8IS0tIFNoYXJlZCBnbG9iYWwgZWxlbWVudHMgLS0+CisKKyAgPHhzOmVsZW1lbnQgbmFtZT0nVHlwZXMnID4KKyAgICA8eHM6c2ltcGxlVHlwZT4KKyAgICAgIDx4czpsaXN0IGl0ZW1UeXBlPSd4czpRTmFtZScgLz4KKyAgICA8L3hzOnNpbXBsZVR5cGU+CisgIDwveHM6ZWxlbWVudD4KKworICA8eHM6ZWxlbWVudCBuYW1lPSdTY29wZScgPgorICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgIDx4czpzaW1wbGVDb250ZW50PgorICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9J3hzOmFueVVSSScgPgorICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0nTWF0Y2hCeScgdHlwZT0neHM6YW55VVJJJyAvPgorICAgICAgICA8L3hzOmV4dGVuc2lvbj4KKyAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICA8L3hzOmVsZW1lbnQ+CisKKyAgPHhzOmVsZW1lbnQgbmFtZT0nU2NvcGVzJyA+CisgICAgPHhzOnNpbXBsZVR5cGU+CisgICAgICA8eHM6bGlzdCBpdGVtVHlwZT0neHM6YW55VVJJJyAvPgorICAgIDwveHM6c2ltcGxlVHlwZT4KKyAgPC94czplbGVtZW50PgorCisgIDx4czplbGVtZW50IG5hbWU9J01ldGFkYXRhVmVyc2lvbicgdHlwZT0neHM6bm9uTmVnYXRpdmVJbnRlZ2VyJyAvPgorCisgIDwhLS0gLy8vLy8vLy8vLy8vLy8vLy8vLy8gR2VuZXJhbCBIZWFkZXJzIC8vLy8vLy8vLy8vLy8vLy8vLy8vIC0tPgorCisgIDx4czplbGVtZW50IG5hbWU9J0FwcFNlcXVlbmNlJyA+CisgICA8eHM6Y29tcGxleFR5cGU+CisgICAgPHhzOmNvbXBsZXhDb250ZW50PgorICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6YW55VHlwZScgPgorICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSdJbnN0YW5jZUlkJworICAgICAgICAgICAgICAgICAgICB0eXBlPSd4czpwb3NpdGl2ZUludGVnZXInCisgICAgICAgICAgICAgICAgICAgIHVzZT0ncmVxdWlyZWQnIC8+CisgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9J1NlcXVlbmNlSWQnIHR5cGU9J3hzOmFueVVSSScgLz4KKyAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0nTWVzc2FnZU51bWJlcicKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0neHM6cG9zaXRpdmVJbnRlZ2VyJworICAgICAgICAgICAgICAgICAgICB1c2U9J3JlcXVpcmVkJyAvPgorICAgICA8L3hzOnJlc3RyaWN0aW9uPgorICAgIDwveHM6Y29tcGxleENvbnRlbnQ+CisgICA8L3hzOmNvbXBsZXhUeXBlPgorICA8L3hzOmVsZW1lbnQ+CisKKyAgPCEtLSAvLy8vLy8vLy8vLy8vLy8vLy8vLyBQb2xpY3kgQXNzZXJ0aW9ucyAvLy8vLy8vLy8vLy8vLy8vLy8vLyAtLT4KKworICA8eHM6ZWxlbWVudCBuYW1lPSdTb2FwSHR0cFJlcXVlc3RSZXBseUFkZHJlc3MnID4KKyAgICA8eHM6Y29tcGxleFR5cGU+CisgICAgICA8eHM6c2ltcGxlQ29udGVudD4KKyAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSd4czphbnlVUkknID4KKyAgICAgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0nIyNvdGhlcicgcHJvY2Vzc0NvbnRlbnRzPSdsYXgnIC8+CisgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgorICAgICAgPC94czpzaW1wbGVDb250ZW50PgorICAgIDwveHM6Y29tcGxleFR5cGU+CisgIDwveHM6ZWxlbWVudD4KKworPC94czpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvV1MvZHMueHNkIGIvV1MvZHMueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMTI2YjMKLS0tIC9kZXYvbnVsbAorKysgYi9XUy9kcy54c2QKQEAgLTAsMCArMSwzMTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IURPQ1RZUEUgc2NoZW1hCisgIFBVQkxJQyAiLS8vVzNDLy9EVEQgWE1MU2NoZW1hIDIwMDEwMi8vRU4iICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS5kdGQiCisgWworICAgPCFBVFRMSVNUIHNjaGVtYSAKKyAgICAgeG1sbnM6ZHMgQ0RBVEEgI0ZJWEVEICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4KKyAgIDwhRU5USVRZIGRzaWcgJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMnPgorICAgPCFFTlRJVFkgJSBwICcnPgorICAgPCFFTlRJVFkgJSBzICcnPgorICBdPgorCis8IS0tIFNjaGVtYSBmb3IgWE1MIFNpZ25hdHVyZXMKKyAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjCisgICAgJFJldmlzaW9uOiAxLjEgJCBvbiAkRGF0ZTogMjAwMi8wMi8wOCAyMDozMjoyNiAkIGJ5ICRBdXRob3I6IHJlYWdsZSAkCisKKyAgICBDb3B5cmlnaHQgMjAwMSBUaGUgSW50ZXJuZXQgU29jaWV0eSBhbmQgVzNDIChNYXNzYWNodXNldHRzIEluc3RpdHV0ZQorICAgIG9mIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4KKyAgICBBdXRvbWF0aXF1ZSwgS2VpbyBVbml2ZXJzaXR5KS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgICBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLworCisgICAgVGhpcyBkb2N1bWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgVzNDIFNvZnR3YXJlIExpY2Vuc2UgWzFdIGFzIGRlc2NyaWJlZAorICAgIGluIHRoZSBGQVEgWzJdLgorCisgICAgWzFdIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvY29weXJpZ2h0LXNvZnR3YXJlLTE5OTgwNzIwCisgICAgWzJdIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvSVBSLUZBUS0yMDAwMDYyMC5odG1sI0RURAorLS0+CisKKworPHNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCisgICAgICAgIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIgorICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiCisgICAgICAgIHZlcnNpb249IjAuMSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPiAKKworPCEtLSBCYXNpYyBUeXBlcyBEZWZpbmVkIGZvciBTaWduYXR1cmVzIC0tPgorCis8c2ltcGxlVHlwZSBuYW1lPSJDcnlwdG9CaW5hcnkiPgorICA8cmVzdHJpY3Rpb24gYmFzZT0iYmFzZTY0QmluYXJ5Ij4KKyAgPC9yZXN0cmljdGlvbj4KKzwvc2ltcGxlVHlwZT4KKworPCEtLSBTdGFydCBTaWduYXR1cmUgLS0+CisKKzxlbGVtZW50IG5hbWU9IlNpZ25hdHVyZSIgdHlwZT0iZHM6U2lnbmF0dXJlVHlwZSIvPgorPGNvbXBsZXhUeXBlIG5hbWU9IlNpZ25hdHVyZVR5cGUiPgorICA8c2VxdWVuY2U+IAorICAgIDxlbGVtZW50IHJlZj0iZHM6U2lnbmVkSW5mbyIvPiAKKyAgICA8ZWxlbWVudCByZWY9ImRzOlNpZ25hdHVyZVZhbHVlIi8+IAorICAgIDxlbGVtZW50IHJlZj0iZHM6S2V5SW5mbyIgbWluT2NjdXJzPSIwIi8+IAorICAgIDxlbGVtZW50IHJlZj0iZHM6T2JqZWN0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+IAorICA8L3NlcXVlbmNlPiAgCisgIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+Cis8L2NvbXBsZXhUeXBlPgorCisgIDxlbGVtZW50IG5hbWU9IlNpZ25hdHVyZVZhbHVlIiB0eXBlPSJkczpTaWduYXR1cmVWYWx1ZVR5cGUiLz4gCisgIDxjb21wbGV4VHlwZSBuYW1lPSJTaWduYXR1cmVWYWx1ZVR5cGUiPgorICAgIDxzaW1wbGVDb250ZW50PgorICAgICAgPGV4dGVuc2lvbiBiYXNlPSJiYXNlNjRCaW5hcnkiPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPgorICAgICAgPC9leHRlbnNpb24+CisgICAgPC9zaW1wbGVDb250ZW50PgorICA8L2NvbXBsZXhUeXBlPgorCis8IS0tIFN0YXJ0IFNpZ25lZEluZm8gLS0+CisKKzxlbGVtZW50IG5hbWU9IlNpZ25lZEluZm8iIHR5cGU9ImRzOlNpZ25lZEluZm9UeXBlIi8+Cis8Y29tcGxleFR5cGUgbmFtZT0iU2lnbmVkSW5mb1R5cGUiPgorICA8c2VxdWVuY2U+IAorICAgIDxlbGVtZW50IHJlZj0iZHM6Q2Fub25pY2FsaXphdGlvbk1ldGhvZCIvPiAKKyAgICA8ZWxlbWVudCByZWY9ImRzOlNpZ25hdHVyZU1ldGhvZCIvPiAKKyAgICA8ZWxlbWVudCByZWY9ImRzOlJlZmVyZW5jZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gCisgIDwvc2VxdWVuY2U+ICAKKyAgPGF0dHJpYnV0ZSBuYW1lPSJJZCIgdHlwZT0iSUQiIHVzZT0ib3B0aW9uYWwiLz4gCis8L2NvbXBsZXhUeXBlPgorCisgIDxlbGVtZW50IG5hbWU9IkNhbm9uaWNhbGl6YXRpb25NZXRob2QiIHR5cGU9ImRzOkNhbm9uaWNhbGl6YXRpb25NZXRob2RUeXBlIi8+IAorICA8Y29tcGxleFR5cGUgbmFtZT0iQ2Fub25pY2FsaXphdGlvbk1ldGhvZFR5cGUiIG1peGVkPSJ0cnVlIj4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8YW55IG5hbWVzcGFjZT0iIyNhbnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDwhLS0gKDAsdW5ib3VuZGVkKSBlbGVtZW50cyBmcm9tICgxLDEpIG5hbWVzcGFjZSAtLT4KKyAgICA8L3NlcXVlbmNlPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iQWxnb3JpdGhtIiB0eXBlPSJhbnlVUkkiIHVzZT0icmVxdWlyZWQiLz4gCisgIDwvY29tcGxleFR5cGU+CisKKyAgPGVsZW1lbnQgbmFtZT0iU2lnbmF0dXJlTWV0aG9kIiB0eXBlPSJkczpTaWduYXR1cmVNZXRob2RUeXBlIi8+CisgIDxjb21wbGV4VHlwZSBuYW1lPSJTaWduYXR1cmVNZXRob2RUeXBlIiBtaXhlZD0idHJ1ZSI+CisgICAgPHNlcXVlbmNlPgorICAgICAgPGVsZW1lbnQgbmFtZT0iSE1BQ091dHB1dExlbmd0aCIgbWluT2NjdXJzPSIwIiB0eXBlPSJkczpITUFDT3V0cHV0TGVuZ3RoVHlwZSIvPgorICAgICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDwhLS0gKDAsdW5ib3VuZGVkKSBlbGVtZW50cyBmcm9tICgxLDEpIGV4dGVybmFsIG5hbWVzcGFjZSAtLT4KKyAgICA8L3NlcXVlbmNlPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iQWxnb3JpdGhtIiB0eXBlPSJhbnlVUkkiIHVzZT0icmVxdWlyZWQiLz4gCisgIDwvY29tcGxleFR5cGU+CisKKzwhLS0gU3RhcnQgUmVmZXJlbmNlIC0tPgorCis8ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2UiIHR5cGU9ImRzOlJlZmVyZW5jZVR5cGUiLz4KKzxjb21wbGV4VHlwZSBuYW1lPSJSZWZlcmVuY2VUeXBlIj4KKyAgPHNlcXVlbmNlPiAKKyAgICA8ZWxlbWVudCByZWY9ImRzOlRyYW5zZm9ybXMiIG1pbk9jY3Vycz0iMCIvPiAKKyAgICA8ZWxlbWVudCByZWY9ImRzOkRpZ2VzdE1ldGhvZCIvPiAKKyAgICA8ZWxlbWVudCByZWY9ImRzOkRpZ2VzdFZhbHVlIi8+IAorICA8L3NlcXVlbmNlPgorICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPiAKKyAgPGF0dHJpYnV0ZSBuYW1lPSJVUkkiIHR5cGU9ImFueVVSSSIgdXNlPSJvcHRpb25hbCIvPiAKKyAgPGF0dHJpYnV0ZSBuYW1lPSJUeXBlIiB0eXBlPSJhbnlVUkkiIHVzZT0ib3B0aW9uYWwiLz4gCis8L2NvbXBsZXhUeXBlPgorCisgIDxlbGVtZW50IG5hbWU9IlRyYW5zZm9ybXMiIHR5cGU9ImRzOlRyYW5zZm9ybXNUeXBlIi8+CisgIDxjb21wbGV4VHlwZSBuYW1lPSJUcmFuc2Zvcm1zVHlwZSI+CisgICAgPHNlcXVlbmNlPgorICAgICAgPGVsZW1lbnQgcmVmPSJkczpUcmFuc2Zvcm0iIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAKKyAgICA8L3NlcXVlbmNlPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxlbGVtZW50IG5hbWU9IlRyYW5zZm9ybSIgdHlwZT0iZHM6VHJhbnNmb3JtVHlwZSIvPgorICA8Y29tcGxleFR5cGUgbmFtZT0iVHJhbnNmb3JtVHlwZSIgbWl4ZWQ9InRydWUiPgorICAgIDxjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+IAorICAgICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+CisgICAgICA8IS0tICgxLDEpIGVsZW1lbnRzIGZyb20gKDAsdW5ib3VuZGVkKSBuYW1lc3BhY2VzIC0tPgorICAgICAgPGVsZW1lbnQgbmFtZT0iWFBhdGgiIHR5cGU9InN0cmluZyIvPiAKKyAgICA8L2Nob2ljZT4KKyAgICA8YXR0cmlidXRlIG5hbWU9IkFsZ29yaXRobSIgdHlwZT0iYW55VVJJIiB1c2U9InJlcXVpcmVkIi8+IAorICA8L2NvbXBsZXhUeXBlPgorCis8IS0tIEVuZCBSZWZlcmVuY2UgLS0+CisKKzxlbGVtZW50IG5hbWU9IkRpZ2VzdE1ldGhvZCIgdHlwZT0iZHM6RGlnZXN0TWV0aG9kVHlwZSIvPgorPGNvbXBsZXhUeXBlIG5hbWU9IkRpZ2VzdE1ldGhvZFR5cGUiIG1peGVkPSJ0cnVlIj4gCisgIDxzZXF1ZW5jZT4KKyAgICA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgPC9zZXF1ZW5jZT4gICAgCisgIDxhdHRyaWJ1dGUgbmFtZT0iQWxnb3JpdGhtIiB0eXBlPSJhbnlVUkkiIHVzZT0icmVxdWlyZWQiLz4gCis8L2NvbXBsZXhUeXBlPgorCis8ZWxlbWVudCBuYW1lPSJEaWdlc3RWYWx1ZSIgdHlwZT0iZHM6RGlnZXN0VmFsdWVUeXBlIi8+Cis8c2ltcGxlVHlwZSBuYW1lPSJEaWdlc3RWYWx1ZVR5cGUiPgorICA8cmVzdHJpY3Rpb24gYmFzZT0iYmFzZTY0QmluYXJ5Ii8+Cis8L3NpbXBsZVR5cGU+CisKKzwhLS0gRW5kIFNpZ25lZEluZm8gLS0+CisKKzwhLS0gU3RhcnQgS2V5SW5mbyAtLT4KKworPGVsZW1lbnQgbmFtZT0iS2V5SW5mbyIgdHlwZT0iZHM6S2V5SW5mb1R5cGUiLz4gCis8Y29tcGxleFR5cGUgbmFtZT0iS2V5SW5mb1R5cGUiIG1peGVkPSJ0cnVlIj4KKyAgPGNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCI+ICAgICAKKyAgICA8ZWxlbWVudCByZWY9ImRzOktleU5hbWUiLz4gCisgICAgPGVsZW1lbnQgcmVmPSJkczpLZXlWYWx1ZSIvPiAKKyAgICA8ZWxlbWVudCByZWY9ImRzOlJldHJpZXZhbE1ldGhvZCIvPiAKKyAgICA8ZWxlbWVudCByZWY9ImRzOlg1MDlEYXRhIi8+IAorICAgIDxlbGVtZW50IHJlZj0iZHM6UEdQRGF0YSIvPiAKKyAgICA8ZWxlbWVudCByZWY9ImRzOlNQS0lEYXRhIi8+CisgICAgPGVsZW1lbnQgcmVmPSJkczpNZ210RGF0YSIvPgorICAgIDxhbnkgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG5hbWVzcGFjZT0iIyNvdGhlciIvPgorICAgIDwhLS0gKDEsMSkgZWxlbWVudHMgZnJvbSAoMCx1bmJvdW5kZWQpIG5hbWVzcGFjZXMgLS0+CisgIDwvY2hvaWNlPgorICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPiAKKzwvY29tcGxleFR5cGU+CisKKyAgPGVsZW1lbnQgbmFtZT0iS2V5TmFtZSIgdHlwZT0ic3RyaW5nIi8+CisgIDxlbGVtZW50IG5hbWU9Ik1nbXREYXRhIiB0eXBlPSJzdHJpbmciLz4KKworICA8ZWxlbWVudCBuYW1lPSJLZXlWYWx1ZSIgdHlwZT0iZHM6S2V5VmFsdWVUeXBlIi8+IAorICA8Y29tcGxleFR5cGUgbmFtZT0iS2V5VmFsdWVUeXBlIiBtaXhlZD0idHJ1ZSI+CisgICA8Y2hvaWNlPgorICAgICA8ZWxlbWVudCByZWY9ImRzOkRTQUtleVZhbHVlIi8+CisgICAgIDxlbGVtZW50IHJlZj0iZHM6UlNBS2V5VmFsdWUiLz4KKyAgICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+CisgICA8L2Nob2ljZT4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8ZWxlbWVudCBuYW1lPSJSZXRyaWV2YWxNZXRob2QiIHR5cGU9ImRzOlJldHJpZXZhbE1ldGhvZFR5cGUiLz4gCisgIDxjb21wbGV4VHlwZSBuYW1lPSJSZXRyaWV2YWxNZXRob2RUeXBlIj4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8ZWxlbWVudCByZWY9ImRzOlRyYW5zZm9ybXMiIG1pbk9jY3Vycz0iMCIvPiAKKyAgICA8L3NlcXVlbmNlPiAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJVUkkiIHR5cGU9ImFueVVSSSIvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iVHlwZSIgdHlwZT0iYW55VVJJIiB1c2U9Im9wdGlvbmFsIi8+CisgIDwvY29tcGxleFR5cGU+CisKKzwhLS0gU3RhcnQgWDUwOURhdGEgLS0+CisKKzxlbGVtZW50IG5hbWU9Ilg1MDlEYXRhIiB0eXBlPSJkczpYNTA5RGF0YVR5cGUiLz4gCis8Y29tcGxleFR5cGUgbmFtZT0iWDUwOURhdGFUeXBlIj4KKyAgPHNlcXVlbmNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICA8Y2hvaWNlPgorICAgICAgPGVsZW1lbnQgbmFtZT0iWDUwOUlzc3VlclNlcmlhbCIgdHlwZT0iZHM6WDUwOUlzc3VlclNlcmlhbFR5cGUiLz4KKyAgICAgIDxlbGVtZW50IG5hbWU9Ilg1MDlTS0kiIHR5cGU9ImJhc2U2NEJpbmFyeSIvPgorICAgICAgPGVsZW1lbnQgbmFtZT0iWDUwOVN1YmplY3ROYW1lIiB0eXBlPSJzdHJpbmciLz4KKyAgICAgIDxlbGVtZW50IG5hbWU9Ilg1MDlDZXJ0aWZpY2F0ZSIgdHlwZT0iYmFzZTY0QmluYXJ5Ii8+CisgICAgICA8ZWxlbWVudCBuYW1lPSJYNTA5Q1JMIiB0eXBlPSJiYXNlNjRCaW5hcnkiLz4KKyAgICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorICAgIDwvY2hvaWNlPgorICA8L3NlcXVlbmNlPgorPC9jb21wbGV4VHlwZT4KKworPGNvbXBsZXhUeXBlIG5hbWU9Ilg1MDlJc3N1ZXJTZXJpYWxUeXBlIj4gCisgIDxzZXF1ZW5jZT4gCisgICAgPGVsZW1lbnQgbmFtZT0iWDUwOUlzc3Vlck5hbWUiIHR5cGU9InN0cmluZyIvPiAKKyAgICA8ZWxlbWVudCBuYW1lPSJYNTA5U2VyaWFsTnVtYmVyIiB0eXBlPSJpbnRlZ2VyIi8+IAorICA8L3NlcXVlbmNlPgorPC9jb21wbGV4VHlwZT4KKworPCEtLSBFbmQgWDUwOURhdGEgLS0+CisKKzwhLS0gQmVnaW4gUEdQRGF0YSAtLT4KKworPGVsZW1lbnQgbmFtZT0iUEdQRGF0YSIgdHlwZT0iZHM6UEdQRGF0YVR5cGUiLz4gCis8Y29tcGxleFR5cGUgbmFtZT0iUEdQRGF0YVR5cGUiPiAKKyAgPGNob2ljZT4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8ZWxlbWVudCBuYW1lPSJQR1BLZXlJRCIgdHlwZT0iYmFzZTY0QmluYXJ5Ii8+IAorICAgICAgPGVsZW1lbnQgbmFtZT0iUEdQS2V5UGFja2V0IiB0eXBlPSJiYXNlNjRCaW5hcnkiIG1pbk9jY3Vycz0iMCIvPiAKKyAgICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIgorICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC9zZXF1ZW5jZT4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8ZWxlbWVudCBuYW1lPSJQR1BLZXlQYWNrZXQiIHR5cGU9ImJhc2U2NEJpbmFyeSIvPiAKKyAgICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIgorICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC9zZXF1ZW5jZT4KKyAgPC9jaG9pY2U+Cis8L2NvbXBsZXhUeXBlPgorCis8IS0tIEVuZCBQR1BEYXRhIC0tPgorCis8IS0tIEJlZ2luIFNQS0lEYXRhIC0tPgorCis8ZWxlbWVudCBuYW1lPSJTUEtJRGF0YSIgdHlwZT0iZHM6U1BLSURhdGFUeXBlIi8+IAorPGNvbXBsZXhUeXBlIG5hbWU9IlNQS0lEYXRhVHlwZSI+CisgIDxzZXF1ZW5jZSBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgPGVsZW1lbnQgbmFtZT0iU1BLSVNleHAiIHR5cGU9ImJhc2U2NEJpbmFyeSIvPgorICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIi8+CisgIDwvc2VxdWVuY2U+Cis8L2NvbXBsZXhUeXBlPiAKKworPCEtLSBFbmQgU1BLSURhdGEgLS0+CisKKzwhLS0gRW5kIEtleUluZm8gLS0+CisKKzwhLS0gU3RhcnQgT2JqZWN0IChNYW5pZmVzdCwgU2lnbmF0dXJlUHJvcGVydHkpIC0tPgorCis8ZWxlbWVudCBuYW1lPSJPYmplY3QiIHR5cGU9ImRzOk9iamVjdFR5cGUiLz4gCis8Y29tcGxleFR5cGUgbmFtZT0iT2JqZWN0VHlwZSIgbWl4ZWQ9InRydWUiPgorICA8c2VxdWVuY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgPGFueSBuYW1lc3BhY2U9IiMjYW55IiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorICA8L3NlcXVlbmNlPgorICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPiAKKyAgPGF0dHJpYnV0ZSBuYW1lPSJNaW1lVHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+IDwhLS0gYWRkIGEgZ3JlcCBmYWNldCAtLT4KKyAgPGF0dHJpYnV0ZSBuYW1lPSJFbmNvZGluZyIgdHlwZT0iYW55VVJJIiB1c2U9Im9wdGlvbmFsIi8+IAorPC9jb21wbGV4VHlwZT4KKworPGVsZW1lbnQgbmFtZT0iTWFuaWZlc3QiIHR5cGU9ImRzOk1hbmlmZXN0VHlwZSIvPiAKKzxjb21wbGV4VHlwZSBuYW1lPSJNYW5pZmVzdFR5cGUiPgorICA8c2VxdWVuY2U+CisgICAgPGVsZW1lbnQgcmVmPSJkczpSZWZlcmVuY2UiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+IAorICA8L3NlcXVlbmNlPgorICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPiAKKzwvY29tcGxleFR5cGU+CisKKzxlbGVtZW50IG5hbWU9IlNpZ25hdHVyZVByb3BlcnRpZXMiIHR5cGU9ImRzOlNpZ25hdHVyZVByb3BlcnRpZXNUeXBlIi8+IAorPGNvbXBsZXhUeXBlIG5hbWU9IlNpZ25hdHVyZVByb3BlcnRpZXNUeXBlIj4KKyAgPHNlcXVlbmNlPgorICAgIDxlbGVtZW50IHJlZj0iZHM6U2lnbmF0dXJlUHJvcGVydHkiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+IAorICA8L3NlcXVlbmNlPgorICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPiAKKzwvY29tcGxleFR5cGU+CisKKyAgIDxlbGVtZW50IG5hbWU9IlNpZ25hdHVyZVByb3BlcnR5IiB0eXBlPSJkczpTaWduYXR1cmVQcm9wZXJ0eVR5cGUiLz4gCisgICA8Y29tcGxleFR5cGUgbmFtZT0iU2lnbmF0dXJlUHJvcGVydHlUeXBlIiBtaXhlZD0idHJ1ZSI+CisgICAgIDxjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorICAgICAgIDwhLS0gKDEsMSkgZWxlbWVudHMgZnJvbSAoMSx1bmJvdW5kZWQpIG5hbWVzcGFjZXMgLS0+CisgICAgIDwvY2hvaWNlPgorICAgICA8YXR0cmlidXRlIG5hbWU9IlRhcmdldCIgdHlwZT0iYW55VVJJIiB1c2U9InJlcXVpcmVkIi8+IAorICAgICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPiAKKyAgIDwvY29tcGxleFR5cGU+CisKKzwhLS0gRW5kIE9iamVjdCAoTWFuaWZlc3QsIFNpZ25hdHVyZVByb3BlcnR5KSAtLT4KKworPCEtLSBTdGFydCBBbGdvcml0aG0gUGFyYW1ldGVycyAtLT4KKworPHNpbXBsZVR5cGUgbmFtZT0iSE1BQ091dHB1dExlbmd0aFR5cGUiPgorICA8cmVzdHJpY3Rpb24gYmFzZT0iaW50ZWdlciIvPgorPC9zaW1wbGVUeXBlPgorCis8IS0tIFN0YXJ0IEtleVZhbHVlIEVsZW1lbnQtdHlwZXMgLS0+CisKKzxlbGVtZW50IG5hbWU9IkRTQUtleVZhbHVlIiB0eXBlPSJkczpEU0FLZXlWYWx1ZVR5cGUiLz4KKzxjb21wbGV4VHlwZSBuYW1lPSJEU0FLZXlWYWx1ZVR5cGUiPgorICA8c2VxdWVuY2U+CisgICAgPHNlcXVlbmNlIG1pbk9jY3Vycz0iMCI+CisgICAgICA8ZWxlbWVudCBuYW1lPSJQIiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiLz4KKyAgICAgIDxlbGVtZW50IG5hbWU9IlEiIHR5cGU9ImRzOkNyeXB0b0JpbmFyeSIvPgorICAgIDwvc2VxdWVuY2U+CisgICAgPGVsZW1lbnQgbmFtZT0iRyIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5IiBtaW5PY2N1cnM9IjAiLz4KKyAgICA8ZWxlbWVudCBuYW1lPSJZIiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiLz4KKyAgICA8ZWxlbWVudCBuYW1lPSJKIiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiIG1pbk9jY3Vycz0iMCIvPgorICAgIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiPgorICAgICAgPGVsZW1lbnQgbmFtZT0iU2VlZCIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5Ii8+CisgICAgICA8ZWxlbWVudCBuYW1lPSJQZ2VuQ291bnRlciIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5Ii8+CisgICAgPC9zZXF1ZW5jZT4KKyAgPC9zZXF1ZW5jZT4KKzwvY29tcGxleFR5cGU+CisKKzxlbGVtZW50IG5hbWU9IlJTQUtleVZhbHVlIiB0eXBlPSJkczpSU0FLZXlWYWx1ZVR5cGUiLz4KKzxjb21wbGV4VHlwZSBuYW1lPSJSU0FLZXlWYWx1ZVR5cGUiPgorICA8c2VxdWVuY2U+CisgICAgPGVsZW1lbnQgbmFtZT0iTW9kdWx1cyIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5Ii8+IAorICAgIDxlbGVtZW50IG5hbWU9IkV4cG9uZW50IiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiLz4gCisgIDwvc2VxdWVuY2U+Cis8L2NvbXBsZXhUeXBlPiAKKworPCEtLSBFbmQgS2V5VmFsdWUgRWxlbWVudC10eXBlcyAtLT4KKworPCEtLSBFbmQgU2lnbmF0dXJlIC0tPgorCis8L3NjaGVtYT4KZGlmZiAtLWdpdCBhL1dTL2VudW1lcmF0aW9uLnhzZCBiL1dTL2VudW1lcmF0aW9uLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMThmMDUxCi0tLSAvZGV2L251bGwKKysrIGIvV1MvZW51bWVyYXRpb24ueHNkCkBAIC0wLDAgKzEsMjIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KKzwhLS0gCisoYykgMjAwNCBCRUEgU3lzdGVtcyBJbmMuLCBDb21wdXRlciBBc3NvY2lhdGVzLCBNaWNyb3NvZnQgQ29ycG9yYXRpb24sIEluYy4sIFNvbmljIFNvZnR3YXJlLCBhbmQgU3lzdGluZXQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1Blcm1pc3Npb24gdG8gY29weSBhbmQgZGlzcGxheSB0aGUgV1MtRW51bWVyYXRpb24gKHRoZSAiU3BlY2lmaWNhdGlvbiIsIHdoaWNoIGluY2x1ZGVzIFdTREwgYW5kIHNjaGVtYSBkb2N1bWVudHMpLCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgZmVlIG9yIHJveWFsdHkgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgeW91IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBvbiBBTEwgY29waWVzIG9mIHRoZSBTcGVjaWZpY2F0aW9uIHRoYXQgeW91IG1ha2U6CisKKzEuCUEgbGluayBvciBVUkwgdG8gdGhlIFNwZWNpZmljYXRpb24gYXQgb25lIG9mIHRoZSBDby1EZXZlbG9wZXJzJyB3ZWJzaXRlcy4KKzIuCVRoZSBjb3B5cmlnaHQgbm90aWNlIGFzIHNob3duIGluIHRoZSBTcGVjaWZpY2F0aW9uLgorCitCRUEgU3lzdGVtcywgQ29tcHV0ZXIgQXNzb2NpYXRlcywgTWljcm9zb2Z0LCBTb25pYyBTb2Z0d2FyZSwgYW5kIFN5c3RpbmV0IChjb2xsZWN0aXZlbHksIHRoZSAiQ28tRGV2ZWxvcGVycyIpIGVhY2ggYWdyZWUgdG8gZ3JhbnQgeW91IGEgbGljZW5zZSwgdW5kZXIgcm95YWx0eS1mcmVlIGFuZCBvdGhlcndpc2UgcmVhc29uYWJsZSwgbm9uLWRpc2NyaW1pbmF0b3J5IHRlcm1zIGFuZCBjb25kaXRpb25zLCB0byB0aGVpciByZXNwZWN0aXZlIGVzc2VudGlhbCBwYXRlbnQgY2xhaW1zIHRoYXQgdGhleSBkZWVtIG5lY2Vzc2FyeSB0byBpbXBsZW1lbnQgdGhlIFNwZWNpZmljYXRpb24uCisKK1RIRSBTUEVDSUZJQ0FUSU9OIElTIFBST1ZJREVEICJBUyBJUywiIEFORCBUSEUgQ08tREVWRUxPUEVSUyBNQUtFIE5PIFJFUFJFU0VOVEFUSU9OUyBPUiBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIE5PTi1JTkZSSU5HRU1FTlQsIE9SIFRJVExFOyBUSEFUIFRIRSBDT05URU5UUyBPRiBUSEUgU1BFQ0lGSUNBVElPTiBBUkUgU1VJVEFCTEUgRk9SIEFOWSBQVVJQT1NFOyBOT1IgVEhBVCBUSEUgSU1QTEVNRU5UQVRJT04gT0YgU1VDSCBDT05URU5UUyBXSUxMIE5PVCBJTkZSSU5HRSBBTlkgVEhJUkQgUEFSVFkgUEFURU5UUywgQ09QWVJJR0hUUywgVFJBREVNQVJLUyBPUiBPVEhFUiBSSUdIVFMuCisKK1RIRSBDTy1ERVZFTE9QRVJTIFdJTEwgTk9UIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIE9SIFJFTEFUSU5HIFRPIEFOWSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBTUEVDSUZJQ0FUSU9OUy4KKworVGhlIG5hbWUgYW5kIHRyYWRlbWFya3Mgb2YgdGhlIENvLURldmVsb3BlcnMgbWF5IE5PVCBiZSB1c2VkIGluIGFueSBtYW5uZXIsIGluY2x1ZGluZyBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byB0aGUgU3BlY2lmaWNhdGlvbnMgb3IgdGhlaXIgY29udGVudHMgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiBUaXRsZSB0byBjb3B5cmlnaHQgaW4gdGhlIFNwZWNpZmljYXRpb25zIHdpbGwgYXQgYWxsIHRpbWVzIHJlbWFpbiB3aXRoIHRoZSBDby1EZXZlbG9wZXJzLgorTm8gb3RoZXIgcmlnaHRzIGFyZSBncmFudGVkIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuCistLT4KKzx4czpzY2hlbWEKKwl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDkvZW51bWVyYXRpb24iCisJeG1sbnM6dG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA5L2VudW1lcmF0aW9uIgorCXhtbG5zOndzYT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIgorCXhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCisJZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIAorCWJsb2NrRGVmYXVsdD0iI2FsbCI+CisKKwk8eHM6aW1wb3J0IG5hbWVzcGFjZT0naHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlJyAvPgorCTx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciIC8+CisKKwk8IS0tIFR5cGVzIGFuZCBnbG9iYWwgZWxlbWVudHMgLS0+CisJPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkZpbHRlclR5cGUiIG1peGVkPSJ0cnVlIj4KKwkJPHhzOnNlcXVlbmNlPgorCQkJPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgorCQk8L3hzOnNlcXVlbmNlPgorCQk8eHM6YXR0cmlidXRlIG5hbWU9IkRpYWxlY3QiIHR5cGU9InhzOmFueVVSSSIgLz4KKwkJPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgorCTwveHM6Y29tcGxleFR5cGU+CisJCisJPHhzOnNpbXBsZVR5cGUgbmFtZT0iUG9zaXRpdmVEdXJhdGlvblR5cGUiPgorCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZHVyYXRpb24iPgorCQkJPHhzOm1pbkV4Y2x1c2l2ZSB2YWx1ZT0iUDBZME0wRFQwSDBNMFMiIC8+CisJCTwveHM6cmVzdHJpY3Rpb24+CisJPC94czpzaW1wbGVUeXBlPgorCisJPHhzOnNpbXBsZVR5cGUgbmFtZT0iTm9uTmVnYXRpdmVEdXJhdGlvblR5cGUiPgorCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZHVyYXRpb24iPgorCQkJPHhzOm1pbkluY2x1c2l2ZSB2YWx1ZT0iUDBZME0wRFQwSDBNMFMiIC8+CisJCTwveHM6cmVzdHJpY3Rpb24+CisJPC94czpzaW1wbGVUeXBlPgorCisJPHhzOnNpbXBsZVR5cGUgbmFtZT0iRXhwaXJhdGlvblR5cGUiPgorCQk8eHM6dW5pb24gbWVtYmVyVHlwZXM9InhzOmRhdGVUaW1lIHRuczpOb25OZWdhdGl2ZUR1cmF0aW9uVHlwZSIgLz4KKwk8L3hzOnNpbXBsZVR5cGU+CisKKwk8eHM6Y29tcGxleFR5cGUgbmFtZT0iRW51bWVyYXRpb25Db250ZXh0VHlwZSI+CisJCTx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+CisJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55VHlwZSI+CisJCQkJPHhzOnNlcXVlbmNlPgorCQkJCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CisJCQkJPC94czpzZXF1ZW5jZT4KKwkJCQk8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+CisJCQk8L3hzOnJlc3RyaWN0aW9uPgorCQk8L3hzOmNvbXBsZXhDb250ZW50PgorCTwveHM6Y29tcGxleFR5cGU+CisJCisJPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikl0ZW1MaXN0VHlwZSI+CisJCTx4czpzZXF1ZW5jZSBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisJCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CisJCTwveHM6c2VxdWVuY2U+CisJPC94czpjb21wbGV4VHlwZT4KKworCTx4czpjb21wbGV4VHlwZSBuYW1lPSJMYW5ndWFnZVNwZWNpZmljU3RyaW5nVHlwZSI+CisJCTx4czpzaW1wbGVDb250ZW50PgorCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgorCQkJCTx4czphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIgLz4KKwkJCQk8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+CisJCQk8L3hzOmV4dGVuc2lvbj4KKwkJPC94czpzaW1wbGVDb250ZW50PgorCTwveHM6Y29tcGxleFR5cGU+CisKKwk8IS0tIEVudW1lcmF0ZSByZXF1ZXN0IC0tPgorCTx4czplbGVtZW50IG5hbWU9IkVudW1lcmF0ZSI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJFbmRUbyIgdHlwZT0id3NhOkVuZHBvaW50UmVmZXJlbmNlVHlwZSIgbWluT2NjdXJzPSIwIiAvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IkV4cGlyZXMiIHR5cGU9InRuczpFeHBpcmF0aW9uVHlwZSIgbWluT2NjdXJzPSIwIiAvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IkZpbHRlciIgdHlwZT0idG5zOkZpbHRlclR5cGUiIG1pbk9jY3Vycz0iMCIgLz4KKwkJCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CisJCQk8L3hzOnNlcXVlbmNlPgorCQkJPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwkKKwk8IS0tIFVzZWQgZm9yIGEgZmF1bHQgcmVzcG9uc2UgLS0+CisJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcG9ydGVkRGlhbGVjdCIgdHlwZT0ieHM6YW55VVJJIiAvPgorCQorCTwhLS0gRW51bWVyYXRlIHJlc3BvbnNlIC0tPgorCTx4czplbGVtZW50IG5hbWU9IkVudW1lcmF0ZVJlc3BvbnNlIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IG5hbWU9IkV4cGlyZXMiIHR5cGU9InRuczpFeHBpcmF0aW9uVHlwZSIgbWluT2NjdXJzPSIwIiAvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IkVudW1lcmF0aW9uQ29udGV4dCIgdHlwZT0idG5zOkVudW1lcmF0aW9uQ29udGV4dFR5cGUiIC8+CisJCQkJPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJCTx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJCisJPCEtLSBQdWxsIHJlcXVlc3QgLS0+CisJPHhzOmVsZW1lbnQgbmFtZT0iUHVsbCI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJFbnVtZXJhdGlvbkNvbnRleHQiIHR5cGU9InRuczpFbnVtZXJhdGlvbkNvbnRleHRUeXBlIiAvPgorCQkJCTx4czplbGVtZW50IG5hbWU9Ik1heFRpbWUiIHR5cGU9InRuczpQb3NpdGl2ZUR1cmF0aW9uVHlwZSIgbWluT2NjdXJzPSIwIiAvPgorCQkJCTx4czplbGVtZW50IG5hbWU9Ik1heEVsZW1lbnRzIiB0eXBlPSJ4czpwb3NpdGl2ZUludGVnZXIiIG1pbk9jY3Vycz0iMCIgLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJNYXhDaGFyYWN0ZXJzIiB0eXBlPSJ4czpwb3NpdGl2ZUludGVnZXIiIG1pbk9jY3Vycz0iMCIgLz4KKwkJCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CisJCQk8L3hzOnNlcXVlbmNlPgorCQkJPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwkKKwk8IS0tIFB1bGwgcmVzcG9uc2UgLS0+CisJPHhzOmVsZW1lbnQgbmFtZT0iUHVsbFJlc3BvbnNlIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IG5hbWU9IkVudW1lcmF0aW9uQ29udGV4dCIgdHlwZT0idG5zOkVudW1lcmF0aW9uQ29udGV4dFR5cGUiIG1pbk9jY3Vycz0iMCIgLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJdGVtcyIgdHlwZT0idG5zOkl0ZW1MaXN0VHlwZSIgbWluT2NjdXJzPSIwIiAvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IkVuZE9mU2VxdWVuY2UiIG1pbk9jY3Vycz0iMCIgLz4KKwkJCTwveHM6c2VxdWVuY2U+CisJCQk8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCQorCTwhLS0gUmVuZXcgcmVxdWVzdCAtLT4KKwk8eHM6ZWxlbWVudCBuYW1lPSJSZW5ldyI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJFbnVtZXJhdGlvbkNvbnRleHQiIHR5cGU9InRuczpFbnVtZXJhdGlvbkNvbnRleHRUeXBlIiAvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IkV4cGlyZXMiIHR5cGU9InRuczpFeHBpcmF0aW9uVHlwZSIgbWluT2NjdXJzPSIwIiAvPgorCQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgCisJCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CisJCQk8L3hzOnNlcXVlbmNlPgorCQkJPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKworCTwhLS0gUmVuZXcgcmVzcG9uc2UgLS0+CisJPHhzOmVsZW1lbnQgbmFtZT0iUmVuZXdSZXNwb25zZSI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJFeHBpcmVzIiB0eXBlPSJ0bnM6RXhwaXJhdGlvblR5cGUiIG1pbk9jY3Vycz0iMCIgLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJFbnVtZXJhdGlvbkNvbnRleHQiIHR5cGU9InRuczpFbnVtZXJhdGlvbkNvbnRleHRUeXBlIiBtaW5PY2N1cnM9IjAiIC8+CisJCQkJPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAKKwkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KKwkJCTwveHM6c2VxdWVuY2U+CisJCQk8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCisJPCEtLSBHZXRTdGF0dXMgcmVxdWVzdCAtLT4KKwk8eHM6ZWxlbWVudCBuYW1lPSJHZXRTdGF0dXMiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2VxdWVuY2U+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iRW51bWVyYXRpb25Db250ZXh0IiB0eXBlPSJ0bnM6RW51bWVyYXRpb25Db250ZXh0VHlwZSIgLz4KKwkJCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIAorCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJCTx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisKKwk8IS0tIEdldFN0YXR1cyByZXNwb25zZSAtLT4KKwk8eHM6ZWxlbWVudCBuYW1lPSJHZXRTdGF0dXNSZXNwb25zZSI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJFeHBpcmVzIiB0eXBlPSJ0bnM6RXhwaXJhdGlvblR5cGUiIG1pbk9jY3Vycz0iMCIgLz4KKwkJCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIAorCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJCTx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisKKwk8IS0tIFJlbGVhc2UgcmVxdWVzdCAtLT4KKwk8eHM6ZWxlbWVudCBuYW1lPSJSZWxlYXNlIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IG5hbWU9IkVudW1lcmF0aW9uQ29udGV4dCIgdHlwZT0idG5zOkVudW1lcmF0aW9uQ29udGV4dFR5cGUiIC8+CisJCQk8L3hzOnNlcXVlbmNlPgorCQkJPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwkKKwk8IS0tIFJlbGVhc2UgcmVzcG9uc2UgaGFzIGFuIGVtcHR5IGJvZHkgLS0+CisJCisJPCEtLSBFbnVtZXJhdGlvbkVuZCBtZXNzYWdlIC0tPgorCTx4czplbGVtZW50IG5hbWU9IkVudW1lcmF0aW9uRW5kIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQk8eHM6c2VxdWVuY2U+CisJCQk8eHM6ZWxlbWVudCBuYW1lPSJFbnVtZXJhdGlvbkNvbnRleHQiIHR5cGU9InRuczpFbnVtZXJhdGlvbkNvbnRleHRUeXBlIiAvPgorCQkJPHhzOmVsZW1lbnQgbmFtZT0iQ29kZSIgdHlwZT0idG5zOk9wZW5FbnVtZXJhdGlvbkVuZENvZGVUeXBlIiAvPgorCQkJPHhzOmVsZW1lbnQgbmFtZT0iUmVhc29uIiB0eXBlPSJ0bnM6TGFuZ3VhZ2VTcGVjaWZpY1N0cmluZ1R5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CisJCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIAorCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KKwkJPC94czpzZXF1ZW5jZT4KKwkJPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKworCTx4czpzaW1wbGVUeXBlIG5hbWU9IkVudW1lcmF0aW9uRW5kQ29kZVR5cGUiPgorCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55VVJJIj4KKwkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA5L2VudW1lcmF0aW9uL1NvdXJjZVNodXR0aW5nRG93biIgLz4KKwkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA5L2VudW1lcmF0aW9uL1NvdXJjZUNhbmNlbGxpbmciIC8+CisJCTwveHM6cmVzdHJpY3Rpb24+CisJPC94czpzaW1wbGVUeXBlPgorCisJPHhzOnNpbXBsZVR5cGUgbmFtZT0iT3BlbkVudW1lcmF0aW9uRW5kQ29kZVR5cGUiPgorCQk8eHM6dW5pb24gbWVtYmVyVHlwZXM9InRuczpFbnVtZXJhdGlvbkVuZENvZGVUeXBlIHhzOmFueVVSSSIgLz4KKwk8L3hzOnNpbXBsZVR5cGU+Cis8L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL1dTL3dzc2UueHNkIGIvV1Mvd3NzZS54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQxNzk4YgotLS0gL2Rldi9udWxsCisrKyBiL1dTL3dzc2UueHNkCkBAIC0wLDAgKzEsMTk1IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKK09BU0lTIHRha2VzIG5vIHBvc2l0aW9uIHJlZ2FyZGluZyB0aGUgdmFsaWRpdHkgb3Igc2NvcGUgb2YgYW55IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvciBvdGhlciByaWdodHMgdGhhdCBtaWdodCBiZSBjbGFpbWVkIHRvIHBlcnRhaW4gdG8gdGhlIGltcGxlbWVudGF0aW9uIG9yIHVzZSBvZiB0aGUgdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudCBvciB0aGUgZXh0ZW50IHRvIHdoaWNoIGFueSBsaWNlbnNlIHVuZGVyIHN1Y2ggcmlnaHRzIG1pZ2h0IG9yIG1pZ2h0IG5vdCBiZSBhdmFpbGFibGU7IG5laXRoZXIgZG9lcyBpdCByZXByZXNlbnQgdGhhdCBpdCBoYXMgbWFkZSBhbnkgZWZmb3J0IHRvIGlkZW50aWZ5IGFueSBzdWNoIHJpZ2h0cy4gSW5mb3JtYXRpb24gb24gT0FTSVMncyBwcm9jZWR1cmVzIHdpdGggcmVzcGVjdCB0byByaWdodHMgaW4gT0FTSVMgc3BlY2lmaWNhdGlvbnMgY2FuIGJlIGZvdW5kIGF0IHRoZSBPQVNJUyB3ZWJzaXRlLiBDb3BpZXMgb2YgY2xhaW1zIG9mIHJpZ2h0cyBtYWRlIGF2YWlsYWJsZSBmb3IgcHVibGljYXRpb24gYW5kIGFueSBhc3N1cmFuY2VzIG9mIGxpY2Vuc2VzIHRvIGJlIG1hZGUgYXZhaWxhYmxlLCBvciB0aGUgcmVzdWx0IG9mIGFuIGF0dGVtcHQgbWFkZSB0byBvYnRhaW4gYSBnZW5lcmFsIGxpY2Vuc2Ugb3IgcGVybWlzc2lvbiBmb3IgdGhlIHVzZSBvZiBzdWNoIHByb3ByaWV0YXJ5IHJpZ2h0cyBieSBpbXBsZW1lbnRvcnMgb3IgdXNlcnMgb2YgdGhpcyBzcGVjaWZpY2F0aW9uLCBjYW4gYmUgb2J0YWluZWQgZnJvbSB0aGUgT0FTSVMgRXhlY3V0aXZlIERpcmVjdG9yLgorT0FTSVMgaW52aXRlcyBhbnkgaW50ZXJlc3RlZCBwYXJ0eSB0byBicmluZyB0byBpdHMgYXR0ZW50aW9uIGFueSBjb3B5cmlnaHRzLCBwYXRlbnRzIG9yIHBhdGVudCBhcHBsaWNhdGlvbnMsIG9yIG90aGVyIHByb3ByaWV0YXJ5IHJpZ2h0cyB3aGljaCBtYXkgY292ZXIgdGVjaG5vbG9neSB0aGF0IG1heSBiZSByZXF1aXJlZCB0byBpbXBsZW1lbnQgdGhpcyBzcGVjaWZpY2F0aW9uLiBQbGVhc2UgYWRkcmVzcyB0aGUgaW5mb3JtYXRpb24gdG8gdGhlIE9BU0lTIEV4ZWN1dGl2ZSBEaXJlY3Rvci4KK0NvcHlyaWdodCDCqSBPQVNJUyBPcGVuIDIwMDItMjAwNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgZG9jdW1lbnQgYW5kIHRyYW5zbGF0aW9ucyBvZiBpdCBtYXkgYmUgY29waWVkIGFuZCBmdXJuaXNoZWQgdG8gb3RoZXJzLCBhbmQgZGVyaXZhdGl2ZSB3b3JrcyB0aGF0IGNvbW1lbnQgb24gb3Igb3RoZXJ3aXNlIGV4cGxhaW4gaXQgb3IgYXNzaXN0IGluIGl0cyBpbXBsZW1lbnRhdGlvbiBtYXkgYmUgcHJlcGFyZWQsIGNvcGllZCwgcHVibGlzaGVkIGFuZCBkaXN0cmlidXRlZCwgaW4gd2hvbGUgb3IgaW4gcGFydCwgd2l0aG91dCByZXN0cmljdGlvbiBvZiBhbnkga2luZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggYXJlIGluY2x1ZGVkIG9uIGFsbCBzdWNoIGNvcGllcyBhbmQgZGVyaXZhdGl2ZSB3b3Jrcy4gSG93ZXZlciwgdGhpcyBkb2N1bWVudCBpdHNlbGYgZG9lcyBub3QgYmUgbW9kaWZpZWQgaW4gYW55IHdheSwgc3VjaCBhcyBieSByZW1vdmluZyB0aGUgY29weXJpZ2h0IG5vdGljZSBvciByZWZlcmVuY2VzIHRvIE9BU0lTLCBleGNlcHQgYXMgbmVlZGVkIGZvciB0aGUgcHVycG9zZSBvZiBkZXZlbG9waW5nIE9BU0lTIHNwZWNpZmljYXRpb25zLCBpbiB3aGljaCBjYXNlIHRoZSBwcm9jZWR1cmVzIGZvciBjb3B5cmlnaHRzIGRlZmluZWQgaW4gdGhlIE9BU0lTIEludGVsbGVjdHVhbCBQcm9wZXJ0eSBSaWdodHMgZG9jdW1lbnQgbXVzdCBiZSBmb2xsb3dlZCwgb3IgYXMgcmVxdWlyZWQgdG8gdHJhbnNsYXRlIGl0IGludG8gbGFuZ3VhZ2VzIG90aGVyIHRoYW4gRW5nbGlzaC4KK1RoZSBsaW1pdGVkIHBlcm1pc3Npb25zIGdyYW50ZWQgYWJvdmUgYXJlIHBlcnBldHVhbCBhbmQgd2lsbCBub3QgYmUgcmV2b2tlZCBieSBPQVNJUyBvciBpdHMgc3VjY2Vzc29ycyBvciBhc3NpZ25zLgorVGhpcyBkb2N1bWVudCBhbmQgdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBoZXJlaW4gaXMgcHJvdmlkZWQgb24gYW4g4oCcQVMgSVPigJ0gYmFzaXMgYW5kIE9BU0lTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIEFOWSBXQVJSQU5UWSBUSEFUIFRIRSBVU0UgT0YgVEhFIElORk9STUFUSU9OIEhFUkVJTiBXSUxMIE5PVCBJTkZSSU5HRSBBTlkgUklHSFRTIE9SIEFOWSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLS0+Cis8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCIgeG1sbnM6U09BUC1FTlY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIiB4bWxucz0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIiB4bWxuczp3c3U9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS11dGlsaXR5LTEuMC54c2QiIHhtbG5zOndzc2U9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6ZHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiIGJsb2NrRGVmYXVsdD0iI2FsbCIgdmVyc2lvbj0iMC4yIj4KKwk8eHNkOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS11dGlsaXR5LTEuMC54c2QiIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktdXRpbGl0eS0xLjAueHNkIi8+CisJPHhzZDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QiLz4KKwk8eHNkOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxkc2lnLWNvcmUveG1sZHNpZy1jb3JlLXNjaGVtYS54c2QiLz4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkF0dHJpYnV0ZWRTdHJpbmciPgorCQk8eHNkOmFubm90YXRpb24+CisJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyB0eXBlIHJlcHJlc2VudHMgYW4gZWxlbWVudCB3aXRoIGFyYml0cmFyeSBhdHRyaWJ1dGVzLjwveHNkOmRvY3VtZW50YXRpb24+CisJCTwveHNkOmFubm90YXRpb24+CisJCTx4c2Q6c2ltcGxlQ29udGVudD4KKwkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgorCQkJCTx4c2Q6YXR0cmlidXRlIHJlZj0id3N1OklkIi8+CisJCQkJPHhzZDphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorCQkJPC94c2Q6ZXh0ZW5zaW9uPgorCQk8L3hzZDpzaW1wbGVDb250ZW50PgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFzc3dvcmRTdHJpbmciPgorCQk8eHNkOmFubm90YXRpb24+CisJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyB0eXBlIGlzIHVzZWQgZm9yIHBhc3N3b3JkIGVsZW1lbnRzIHBlciBTZWN0aW9uIDQuMS48L3hzZDpkb2N1bWVudGF0aW9uPgorCQk8L3hzZDphbm5vdGF0aW9uPgorCQk8eHNkOnNpbXBsZUNvbnRlbnQ+CisJCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ3c3NlOkF0dHJpYnV0ZWRTdHJpbmciPgorCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9IlR5cGUiIHR5cGU9InhzZDphbnlVUkkiLz4KKwkJCTwveHNkOmV4dGVuc2lvbj4KKwkJPC94c2Q6c2ltcGxlQ29udGVudD4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkVuY29kZWRTdHJpbmciPgorCQk8eHNkOmFubm90YXRpb24+CisJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyB0eXBlIGlzIHVzZWQgZm9yIGVsZW1lbnRzIGNvbnRhaW5pbmcgc3RyaW5naWZpZWQgYmluYXJ5IGRhdGEuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkJPC94c2Q6YW5ub3RhdGlvbj4KKwkJPHhzZDpzaW1wbGVDb250ZW50PgorCQkJPHhzZDpleHRlbnNpb24gYmFzZT0id3NzZTpBdHRyaWJ1dGVkU3RyaW5nIj4KKwkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJFbmNvZGluZ1R5cGUiIHR5cGU9InhzZDphbnlVUkkiLz4KKwkJCTwveHNkOmV4dGVuc2lvbj4KKwkJPC94c2Q6c2ltcGxlQ29udGVudD4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlVzZXJuYW1lVG9rZW5UeXBlIj4KKwkJPHhzZDphbm5vdGF0aW9uPgorCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgdHlwZSByZXByZXNlbnRzIGEgdXNlcm5hbWUgdG9rZW4gcGVyIFNlY3Rpb24gNC4xPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkJPC94c2Q6YW5ub3RhdGlvbj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJVc2VybmFtZSIgdHlwZT0id3NzZTpBdHRyaWJ1dGVkU3RyaW5nIi8+CisJCQk8eHNkOmFueSBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQk8L3hzZDpzZXF1ZW5jZT4KKwkJPHhzZDphdHRyaWJ1dGUgcmVmPSJ3c3U6SWQiLz4KKwkJPHhzZDphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQmluYXJ5U2VjdXJpdHlUb2tlblR5cGUiPgorCQk8eHNkOmFubm90YXRpb24+CisJCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzZWN1cml0eSB0b2tlbiB0aGF0IGlzIGVuY29kZWQgaW4gYmluYXJ5PC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkJPC94c2Q6YW5ub3RhdGlvbj4KKwkJPHhzZDpzaW1wbGVDb250ZW50PgorCQkJPHhzZDpleHRlbnNpb24gYmFzZT0id3NzZTpFbmNvZGVkU3RyaW5nIj4KKwkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJWYWx1ZVR5cGUiIHR5cGU9InhzZDphbnlVUkkiLz4KKwkJCTwveHNkOmV4dGVuc2lvbj4KKwkJPC94c2Q6c2ltcGxlQ29udGVudD4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IktleUlkZW50aWZpZXJUeXBlIj4KKwkJPHhzZDphbm5vdGF0aW9uPgorCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc2VjdXJpdHkgdG9rZW4ga2V5IGlkZW50aWZpZXI8L3hzZDpkb2N1bWVudGF0aW9uPgorCQk8L3hzZDphbm5vdGF0aW9uPgorCQk8eHNkOnNpbXBsZUNvbnRlbnQ+CisJCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ3c3NlOkVuY29kZWRTdHJpbmciPgorCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9IlZhbHVlVHlwZSIgdHlwZT0ieHNkOmFueVVSSSIvPgorCQkJPC94c2Q6ZXh0ZW5zaW9uPgorCQk8L3hzZDpzaW1wbGVDb250ZW50PgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ0VXNhZ2UiPgorCQk8eHNkOmFubm90YXRpb24+CisJCQk8eHNkOmRvY3VtZW50YXRpb24+VHlwZWRlZiB0byBhbGxvdyBhIGxpc3Qgb2YgdXNhZ2VzIChhcyBVUklzKS48L3hzZDpkb2N1bWVudGF0aW9uPgorCQk8L3hzZDphbm5vdGF0aW9uPgorCQk8eHNkOmxpc3QgaXRlbVR5cGU9InhzZDphbnlVUkkiLz4KKwk8L3hzZDpzaW1wbGVUeXBlPgorCTx4c2Q6YXR0cmlidXRlIG5hbWU9IlVzYWdlIiB0eXBlPSJ0VXNhZ2UiPgorCQk8eHNkOmFubm90YXRpb24+CisJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBnbG9iYWwgYXR0cmlidXRlIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIHVzYWdlIG9mIGEgcmVmZXJlbmNlZCBvciBpbmRpY2F0ZWQgdG9rZW4gd2l0aGluIHRoZSBjb250YWluaW5nIGNvbnRleHQ8L3hzZDpkb2N1bWVudGF0aW9uPgorCQk8L3hzZDphbm5vdGF0aW9uPgorCTwveHNkOmF0dHJpYnV0ZT4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJlZmVyZW5jZVR5cGUiPgorCQk8eHNkOmFubm90YXRpb24+CisJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyB0eXBlIHJlcHJlc2VudHMgYSByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgc2VjdXJpdHkgdG9rZW4uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkJPC94c2Q6YW5ub3RhdGlvbj4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iVVJJIiB0eXBlPSJ4c2Q6YW55VVJJIi8+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9IlZhbHVlVHlwZSIgdHlwZT0ieHNkOmFueVVSSSIvPgorCQk8eHNkOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFbWJlZGRlZFR5cGUiPgorCQk8eHNkOmFubm90YXRpb24+CisJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyB0eXBlIHJlcHJlc2VudHMgYSByZWZlcmVuY2UgdG8gYW4gZW1iZWRkZWQgc2VjdXJpdHkgdG9rZW4uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkJPC94c2Q6YW5ub3RhdGlvbj4KKwkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisJCQk8eHNkOmFueSBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorCQk8L3hzZDpjaG9pY2U+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9IlZhbHVlVHlwZSIgdHlwZT0ieHNkOmFueVVSSSIvPgorCQk8eHNkOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTZWN1cml0eVRva2VuUmVmZXJlbmNlVHlwZSI+CisJCTx4c2Q6YW5ub3RhdGlvbj4KKwkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIHR5cGUgaXMgdXNlZCByZWZlcmVuY2UgYSBzZWN1cml0eSB0b2tlbi48L3hzZDpkb2N1bWVudGF0aW9uPgorCQk8L3hzZDphbm5vdGF0aW9uPgorCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKwkJCTx4c2Q6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+CisJCTwveHNkOmNob2ljZT4KKwkJPHhzZDphdHRyaWJ1dGUgcmVmPSJ3c3U6SWQiLz4KKwkJPHhzZDphdHRyaWJ1dGUgcmVmPSJ3c3NlOlVzYWdlIi8+CisJCTx4c2Q6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNlY3VyaXR5SGVhZGVyVHlwZSI+CisJCTx4c2Q6YW5ub3RhdGlvbj4KKwkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGNvbXBsZXhUeXBlIGRlZmluZXMgaGVhZGVyIGJsb2NrIHRvIHVzZSBmb3Igc2VjdXJpdHktcmVsZXZhbnQgZGF0YSBkaXJlY3RlZCBhdCBhIHNwZWNpZmljIFNPQVAgYWN0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkJPC94c2Q6YW5ub3RhdGlvbj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKwkJCQk8eHNkOmFubm90YXRpb24+CisJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgdXNlIG9mICJhbnkiIGlzIHRvIGFsbG93IGV4dGVuc2liaWxpdHkgYW5kIGRpZmZlcmVudCBmb3JtcyBvZiBzZWN1cml0eSBkYXRhLjwveHNkOmRvY3VtZW50YXRpb24+CisJCQkJPC94c2Q6YW5ub3RhdGlvbj4KKwkJCTwveHNkOmFueT4KKwkJPC94c2Q6c2VxdWVuY2U+CisJCTx4c2Q6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRyYW5zZm9ybWF0aW9uUGFyYW1ldGVyc1R5cGUiPgorCQk8eHNkOmFubm90YXRpb24+CisJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBjb21wbGV4VHlwZSBkZWZpbmVzIGEgY29udGFpbmVyIGZvciBlbGVtZW50cyB0byBiZSBzcGVjaWZpZWQgZnJvbSBhbnkgbmFtZXNwYWNlIGFzIHByb3BlcnRpZXMvcGFyYW1ldGVycyBvZiBhIERTSUcgdHJhbnNmb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkJPC94c2Q6YW5ub3RhdGlvbj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKwkJCQk8eHNkOmFubm90YXRpb24+CisJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgdXNlIG9mICJhbnkiIGlzIHRvIGFsbG93IGV4dGVuc2liaWxpdHkgZnJvbSBhbnkgbmFtZXNwYWNlLjwveHNkOmRvY3VtZW50YXRpb24+CisJCQkJPC94c2Q6YW5ub3RhdGlvbj4KKwkJCTwveHNkOmFueT4KKwkJPC94c2Q6c2VxdWVuY2U+CisJCTx4c2Q6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iVXNlcm5hbWVUb2tlbiIgdHlwZT0id3NzZTpVc2VybmFtZVRva2VuVHlwZSI+CisJCTx4c2Q6YW5ub3RhdGlvbj4KKwkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgd3NzZTpVc2VybmFtZVRva2VuIGVsZW1lbnQgcGVyIFNlY3Rpb24gNC4xLjwveHNkOmRvY3VtZW50YXRpb24+CisJCTwveHNkOmFubm90YXRpb24+CisJPC94c2Q6ZWxlbWVudD4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iQmluYXJ5U2VjdXJpdHlUb2tlbiIgdHlwZT0id3NzZTpCaW5hcnlTZWN1cml0eVRva2VuVHlwZSI+CisJCTx4c2Q6YW5ub3RhdGlvbj4KKwkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgd3NzZTpCaW5hcnlTZWN1cml0eVRva2VuIGVsZW1lbnQgcGVyIFNlY3Rpb24gNC4yLjwveHNkOmRvY3VtZW50YXRpb24+CisJCTwveHNkOmFubm90YXRpb24+CisJPC94c2Q6ZWxlbWVudD4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iUmVmZXJlbmNlIiB0eXBlPSJ3c3NlOlJlZmVyZW5jZVR5cGUiPgorCQk8eHNkOmFubm90YXRpb24+CisJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBlbGVtZW50IGRlZmluZXMgYSBzZWN1cml0eSB0b2tlbiByZWZlcmVuY2U8L3hzZDpkb2N1bWVudGF0aW9uPgorCQk8L3hzZDphbm5vdGF0aW9uPgorCTwveHNkOmVsZW1lbnQ+CisJPHhzZDplbGVtZW50IG5hbWU9IkVtYmVkZGVkIiB0eXBlPSJ3c3NlOkVtYmVkZGVkVHlwZSI+CisJCTx4c2Q6YW5ub3RhdGlvbj4KKwkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGVsZW1lbnQgZGVmaW5lcyBhIHNlY3VyaXR5IHRva2VuIGVtYmVkZGVkIHJlZmVyZW5jZTwveHNkOmRvY3VtZW50YXRpb24+CisJCTwveHNkOmFubm90YXRpb24+CisJPC94c2Q6ZWxlbWVudD4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iS2V5SWRlbnRpZmllciIgdHlwZT0id3NzZTpLZXlJZGVudGlmaWVyVHlwZSI+CisJCTx4c2Q6YW5ub3RhdGlvbj4KKwkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGVsZW1lbnQgZGVmaW5lcyBhIGtleSBpZGVudGlmaWVyIHJlZmVyZW5jZTwveHNkOmRvY3VtZW50YXRpb24+CisJCTwveHNkOmFubm90YXRpb24+CisJPC94c2Q6ZWxlbWVudD4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iU2VjdXJpdHlUb2tlblJlZmVyZW5jZSIgdHlwZT0id3NzZTpTZWN1cml0eVRva2VuUmVmZXJlbmNlVHlwZSI+CisJCTx4c2Q6YW5ub3RhdGlvbj4KKwkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgd3NzZTpTZWN1cml0eVRva2VuUmVmZXJlbmNlIHBlciBTZWN0aW9uIDQuMy48L3hzZDpkb2N1bWVudGF0aW9uPgorCQk8L3hzZDphbm5vdGF0aW9uPgorCTwveHNkOmVsZW1lbnQ+CisJPHhzZDplbGVtZW50IG5hbWU9IlNlY3VyaXR5IiB0eXBlPSJ3c3NlOlNlY3VyaXR5SGVhZGVyVHlwZSI+CisJCTx4c2Q6YW5ub3RhdGlvbj4KKwkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgd3NzZTpTZWN1cml0eSBTT0FQIGhlYWRlciBlbGVtZW50IHBlciBTZWN0aW9uIDQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkJPC94c2Q6YW5ub3RhdGlvbj4KKwk8L3hzZDplbGVtZW50PgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJUcmFuc2Zvcm1hdGlvblBhcmFtZXRlcnMiIHR5cGU9Indzc2U6VHJhbnNmb3JtYXRpb25QYXJhbWV0ZXJzVHlwZSI+CisJCTx4c2Q6YW5ub3RhdGlvbj4KKwkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGVsZW1lbnQgY29udGFpbnMgcHJvcGVydGllcyBmb3IgdHJhbnNmb3JtYXRpb25zIGZyb20gYW55IG5hbWVzcGFjZSwgaW5jbHVkaW5nIERTSUcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkJPC94c2Q6YW5ub3RhdGlvbj4KKwk8L3hzZDplbGVtZW50PgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJQYXNzd29yZCIgdHlwZT0id3NzZTpQYXNzd29yZFN0cmluZyIvPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJOb25jZSIgdHlwZT0id3NzZTpFbmNvZGVkU3RyaW5nIi8+CisJPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkZhdWx0Y29kZUVudW0iPgorCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpRTmFtZSI+CisJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ3c3NlOlVuc3VwcG9ydGVkU2VjdXJpdHlUb2tlbiIvPgorCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0id3NzZTpVbnN1cHBvcnRlZEFsZ29yaXRobSIvPgorCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0id3NzZTpJbnZhbGlkU2VjdXJpdHkiLz4KKwkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Indzc2U6SW52YWxpZFNlY3VyaXR5VG9rZW4iLz4KKwkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Indzc2U6RmFpbGVkQXV0aGVudGljYXRpb24iLz4KKwkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Indzc2U6RmFpbGVkQ2hlY2siLz4KKwkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Indzc2U6U2VjdXJpdHlUb2tlblVuYXZhaWxhYmxlIi8+CisJCTwveHNkOnJlc3RyaWN0aW9uPgorCTwveHNkOnNpbXBsZVR5cGU+Cis8L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9XUy93c3UueHNkIGIvV1Mvd3N1LnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGQ3NGU5Ci0tLSAvZGV2L251bGwKKysrIGIvV1Mvd3N1LnhzZApAQCAtMCwwICsxLDEwOCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCitPQVNJUyB0YWtlcyBubyBwb3NpdGlvbiByZWdhcmRpbmcgdGhlIHZhbGlkaXR5IG9yIHNjb3BlIG9mIGFueSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb3Igb3RoZXIgcmlnaHRzIHRoYXQgbWlnaHQgYmUgY2xhaW1lZCB0byBwZXJ0YWluIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvciB1c2Ugb2YgdGhlIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQgb3IgdGhlIGV4dGVudCB0byB3aGljaCBhbnkgbGljZW5zZSB1bmRlciBzdWNoIHJpZ2h0cyBtaWdodCBvciBtaWdodCBub3QgYmUgYXZhaWxhYmxlOyBuZWl0aGVyIGRvZXMgaXQgcmVwcmVzZW50IHRoYXQgaXQgaGFzIG1hZGUgYW55IGVmZm9ydCB0byBpZGVudGlmeSBhbnkgc3VjaCByaWdodHMuIEluZm9ybWF0aW9uIG9uIE9BU0lTJ3MgcHJvY2VkdXJlcyB3aXRoIHJlc3BlY3QgdG8gcmlnaHRzIGluIE9BU0lTIHNwZWNpZmljYXRpb25zIGNhbiBiZSBmb3VuZCBhdCB0aGUgT0FTSVMgd2Vic2l0ZS4gQ29waWVzIG9mIGNsYWltcyBvZiByaWdodHMgbWFkZSBhdmFpbGFibGUgZm9yIHB1YmxpY2F0aW9uIGFuZCBhbnkgYXNzdXJhbmNlcyBvZiBsaWNlbnNlcyB0byBiZSBtYWRlIGF2YWlsYWJsZSwgb3IgdGhlIHJlc3VsdCBvZiBhbiBhdHRlbXB0IG1hZGUgdG8gb2J0YWluIGEgZ2VuZXJhbCBsaWNlbnNlIG9yIHBlcm1pc3Npb24gZm9yIHRoZSB1c2Ugb2Ygc3VjaCBwcm9wcmlldGFyeSByaWdodHMgYnkgaW1wbGVtZW50b3JzIG9yIHVzZXJzIG9mIHRoaXMgc3BlY2lmaWNhdGlvbiwgY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlIE9BU0lTIEV4ZWN1dGl2ZSBEaXJlY3Rvci4KK09BU0lTIGludml0ZXMgYW55IGludGVyZXN0ZWQgcGFydHkgdG8gYnJpbmcgdG8gaXRzIGF0dGVudGlvbiBhbnkgY29weXJpZ2h0cywgcGF0ZW50cyBvciBwYXRlbnQgYXBwbGljYXRpb25zLCBvciBvdGhlciBwcm9wcmlldGFyeSByaWdodHMgd2hpY2ggbWF5IGNvdmVyIHRlY2hub2xvZ3kgdGhhdCBtYXkgYmUgcmVxdWlyZWQgdG8gaW1wbGVtZW50IHRoaXMgc3BlY2lmaWNhdGlvbi4gUGxlYXNlIGFkZHJlc3MgdGhlIGluZm9ybWF0aW9uIHRvIHRoZSBPQVNJUyBFeGVjdXRpdmUgRGlyZWN0b3IuCitDb3B5cmlnaHQgwqkgT0FTSVMgT3BlbiAyMDAyLTIwMDQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIGRvY3VtZW50IGFuZCB0cmFuc2xhdGlvbnMgb2YgaXQgbWF5IGJlIGNvcGllZCBhbmQgZnVybmlzaGVkIHRvIG90aGVycywgYW5kIGRlcml2YXRpdmUgd29ya3MgdGhhdCBjb21tZW50IG9uIG9yIG90aGVyd2lzZSBleHBsYWluIGl0IG9yIGFzc2lzdCBpbiBpdHMgaW1wbGVtZW50YXRpb24gbWF5IGJlIHByZXBhcmVkLCBjb3BpZWQsIHB1Ymxpc2hlZCBhbmQgZGlzdHJpYnV0ZWQsIGluIHdob2xlIG9yIGluIHBhcnQsIHdpdGhvdXQgcmVzdHJpY3Rpb24gb2YgYW55IGtpbmQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGFyZSBpbmNsdWRlZCBvbiBhbGwgc3VjaCBjb3BpZXMgYW5kIGRlcml2YXRpdmUgd29ya3MuIEhvd2V2ZXIsIHRoaXMgZG9jdW1lbnQgaXRzZWxmIGRvZXMgbm90IGJlIG1vZGlmaWVkIGluIGFueSB3YXksIHN1Y2ggYXMgYnkgcmVtb3ZpbmcgdGhlIGNvcHlyaWdodCBub3RpY2Ugb3IgcmVmZXJlbmNlcyB0byBPQVNJUywgZXhjZXB0IGFzIG5lZWRlZCBmb3IgdGhlIHB1cnBvc2Ugb2YgZGV2ZWxvcGluZyBPQVNJUyBzcGVjaWZpY2F0aW9ucywgaW4gd2hpY2ggY2FzZSB0aGUgcHJvY2VkdXJlcyBmb3IgY29weXJpZ2h0cyBkZWZpbmVkIGluIHRoZSBPQVNJUyBJbnRlbGxlY3R1YWwgUHJvcGVydHkgUmlnaHRzIGRvY3VtZW50IG11c3QgYmUgZm9sbG93ZWQsIG9yIGFzIHJlcXVpcmVkIHRvIHRyYW5zbGF0ZSBpdCBpbnRvIGxhbmd1YWdlcyBvdGhlciB0aGFuIEVuZ2xpc2guCitUaGUgbGltaXRlZCBwZXJtaXNzaW9ucyBncmFudGVkIGFib3ZlIGFyZSBwZXJwZXR1YWwgYW5kIHdpbGwgbm90IGJlIHJldm9rZWQgYnkgT0FTSVMgb3IgaXRzIHN1Y2Nlc3NvcnMgb3IgYXNzaWducy4KK1RoaXMgZG9jdW1lbnQgYW5kIHRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaGVyZWluIGlzIHByb3ZpZGVkIG9uIGFuIOKAnEFTIElT4oCdIGJhc2lzIGFuZCBPQVNJUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBBTlkgV0FSUkFOVFkgVEhBVCBUSEUgVVNFIE9GIFRIRSBJTkZPUk1BVElPTiBIRVJFSU4gV0lMTCBOT1QgSU5GUklOR0UgQU5ZIFJJR0hUUyBPUiBBTlkgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy0tPgorPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktdXRpbGl0eS0xLjAueHNkIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKKworCisKK3htbG5zOndzdT0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXV0aWxpdHktMS4wLnhzZCIgeG1sbnM9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS11dGlsaXR5LTEuMC54c2QiIAorZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIgdmVyc2lvbj0iMC4xIj4KKwk8IS0tIC8vIEZhdWx0IENvZGVzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gLS0+CisJPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRUaW1lc3RhbXBGYXVsdCI+CisJCTx4c2Q6YW5ub3RhdGlvbj4KKwkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KK1RoaXMgdHlwZSBkZWZpbmVzIHRoZSBmYXVsdCBjb2RlIHZhbHVlIGZvciBUaW1lc3RhbXAgbWVzc2FnZSBleHBpcmF0aW9uLgorICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisJCTwveHNkOmFubm90YXRpb24+CisJCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOlFOYW1lIj4KKwkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IndzdTpNZXNzYWdlRXhwaXJlZCIvPgorCQk8L3hzZDpyZXN0cmljdGlvbj4KKwk8L3hzZDpzaW1wbGVUeXBlPgorCTwhLS0gLy8gR2xvYmFsIGF0dHJpYnV0ZXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIC0tPgorCTx4c2Q6YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJ4c2Q6SUQiPgorCQk8eHNkOmFubm90YXRpb24+CisJCQk8eHNkOmRvY3VtZW50YXRpb24+CitUaGlzIGdsb2JhbCBhdHRyaWJ1dGUgc3VwcG9ydHMgYW5ub3RhdGluZyBhcmJpdHJhcnkgZWxlbWVudHMgd2l0aCBhbiBJRC4KKyAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCQk8L3hzZDphbm5vdGF0aW9uPgorCTwveHNkOmF0dHJpYnV0ZT4KKwk8eHNkOmF0dHJpYnV0ZUdyb3VwIG5hbWU9ImNvbW1vbkF0dHMiPgorCQk8eHNkOmFubm90YXRpb24+CisJCQk8eHNkOmRvY3VtZW50YXRpb24+CitDb252ZW5pZW5jZSBhdHRyaWJ1dGUgZ3JvdXAgdXNlZCB0byBzaW1wbGlmeSB0aGlzIHNjaGVtYS4KKyAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCQk8L3hzZDphbm5vdGF0aW9uPgorCQk8eHNkOmF0dHJpYnV0ZSByZWY9IndzdTpJZCIgdXNlPSJvcHRpb25hbCIvPgorCQk8eHNkOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+CisJPC94c2Q6YXR0cmlidXRlR3JvdXA+CisJPCEtLSAvLyBVdGlsaXR5IHR5cGVzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gLS0+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBdHRyaWJ1dGVkRGF0ZVRpbWUiPgorCQk8eHNkOmFubm90YXRpb24+CisJCQk8eHNkOmRvY3VtZW50YXRpb24+CitUaGlzIHR5cGUgaXMgZm9yIGVsZW1lbnRzIHdob3NlIFtjaGlsZHJlbl0gaXMgYSBwc3VlZG8tZGF0ZVRpbWUgYW5kIGNhbiBoYXZlIGFyYml0cmFyeSBhdHRyaWJ1dGVzLiAKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisJCTwveHNkOmFubm90YXRpb24+CisJCTx4c2Q6c2ltcGxlQ29udGVudD4KKwkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgorCQkJCTx4c2Q6YXR0cmlidXRlR3JvdXAgcmVmPSJ3c3U6Y29tbW9uQXR0cyIvPgorCQkJPC94c2Q6ZXh0ZW5zaW9uPgorCQk8L3hzZDpzaW1wbGVDb250ZW50PgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQXR0cmlidXRlZFVSSSI+CisJCTx4c2Q6YW5ub3RhdGlvbj4KKwkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KK1RoaXMgdHlwZSBpcyBmb3IgZWxlbWVudHMgd2hvc2UgW2NoaWxkcmVuXSBpcyBhbiBhbnlVUkkgYW5kIGNhbiBoYXZlIGFyYml0cmFyeSBhdHRyaWJ1dGVzLgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkJPC94c2Q6YW5ub3RhdGlvbj4KKwkJPHhzZDpzaW1wbGVDb250ZW50PgorCQkJPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOmFueVVSSSI+CisJCQkJPHhzZDphdHRyaWJ1dGVHcm91cCByZWY9IndzdTpjb21tb25BdHRzIi8+CisJCQk8L3hzZDpleHRlbnNpb24+CisJCTwveHNkOnNpbXBsZUNvbnRlbnQ+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPCEtLSAvLyBUaW1lc3RhbXAgaGVhZGVyIGNvbXBvbmVudHMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIC0tPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGltZXN0YW1wVHlwZSI+CisJCTx4c2Q6YW5ub3RhdGlvbj4KKwkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KK1RoaXMgY29tcGxleCB0eXBlIHRpZXMgdG9nZXRoZXIgdGhlIHRpbWVzdGFtcCByZWxhdGVkIGVsZW1lbnRzIGludG8gYSBjb21wb3NpdGUgdHlwZS4KKyAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisJCTwveHNkOmFubm90YXRpb24+CisJCTx4c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ3c3U6Q3JlYXRlZCIgbWluT2NjdXJzPSIwIi8+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ3c3U6RXhwaXJlcyIgbWluT2NjdXJzPSIwIi8+CisJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKwkJCQk8eHNkOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+CisJCQk8L3hzZDpjaG9pY2U+CisJCTwveHNkOnNlcXVlbmNlPgorCQk8eHNkOmF0dHJpYnV0ZUdyb3VwIHJlZj0id3N1OmNvbW1vbkF0dHMiLz4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iVGltZXN0YW1wIiB0eXBlPSJ3c3U6VGltZXN0YW1wVHlwZSI+CisJCTx4c2Q6YW5ub3RhdGlvbj4KKwkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KK1RoaXMgZWxlbWVudCBhbGxvd3MgVGltZXN0YW1wcyB0byBiZSBhcHBsaWVkIGFueXdoZXJlIGVsZW1lbnQgd2lsZGNhcmRzIGFyZSBwcmVzZW50LAoraW5jbHVkaW5nIGFzIGEgU09BUCBoZWFkZXIuCisgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCQk8L3hzZDphbm5vdGF0aW9uPgorCTwveHNkOmVsZW1lbnQ+CisJPCEtLSBnbG9iYWwgZWxlbWVudCBkZWNscyB0byBhbGxvdyBpbmRpdmlkdWFsIGVsZW1lbnRzIHRvIGFwcGVhciBhbnl3aGVyZSAtLT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iRXhwaXJlcyIgdHlwZT0id3N1OkF0dHJpYnV0ZWREYXRlVGltZSI+CisJCTx4c2Q6YW5ub3RhdGlvbj4KKwkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KK1RoaXMgZWxlbWVudCBhbGxvd3MgYW4gZXhwaXJhdGlvbiB0aW1lIHRvIGJlIGFwcGxpZWQgYW55d2hlcmUgZWxlbWVudCB3aWxkY2FyZHMgYXJlIHByZXNlbnQuCisgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCQk8L3hzZDphbm5vdGF0aW9uPgorCTwveHNkOmVsZW1lbnQ+CisJPHhzZDplbGVtZW50IG5hbWU9IkNyZWF0ZWQiIHR5cGU9IndzdTpBdHRyaWJ1dGVkRGF0ZVRpbWUiPgorCQk8eHNkOmFubm90YXRpb24+CisJCQk8eHNkOmRvY3VtZW50YXRpb24+CitUaGlzIGVsZW1lbnQgYWxsb3dzIGEgY3JlYXRpb24gdGltZSB0byBiZSBhcHBsaWVkIGFueXdoZXJlIGVsZW1lbnQgd2lsZGNhcmRzIGFyZSBwcmVzZW50LgorICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkJPC94c2Q6YW5ub3RhdGlvbj4KKwk8L3hzZDplbGVtZW50PgorPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvY2hhbmdlbG9nLmh0bWwgYi9jaGFuZ2Vsb2cuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTkyMTU3Ci0tLSAvZGV2L251bGwKKysrIGIvY2hhbmdlbG9nLmh0bWwKQEAgLTAsMCArMSw2MjAgQEAKKzwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+DQorPGh0bWw+DQorPGhlYWQ+DQorICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+DQorICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJSb2JlcnQgQS4gdmFuIEVuZ2VsZW4iPg0KKyAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80Ljc2IFtlbl0gKFgxMTsgVTsgU3VuT1MgNS44IHN1bjR1KSBbTmV0c2NhcGVdIj4NCis8L2hlYWQ+DQorPGJvZHkgYmdjb2xvcj0iI2U2ZTZlNiI+DQorDQorPGgxPkNoYW5nZWxvZzwvaDE+DQorDQorPHVsPg0KKzxsaT5WZXJzaW9uIDEuMTwvbGk+DQorPHVsPg0KKzxsaT5BZGRlZCB0eXBlZGVmIGNvbnZlbnRpb25zPC9saT4NCis8bGk+QWRkZWQgZW51bWVyYXRpb25zPC9saT4NCis8bGk+QWRkZWQgaGV4QmluYXJ5IGVuY29kaW5nPC9saT4NCis8bGk+QWRkZWQgYmFzZTY0IGVuY29kaW5nPC9saT4NCis8bGk+RW5hYmxlIHBhc3MgYnkgcmVmZXJlbmNlIG9wZXJhdG9yICgmYW1wOykgZm9yIG91dHB1dCBwYXJhbWV0ZXI8L2xpPg0KKzxsaT5FbmFibGUgc3BlY2lmaWNhdGlvbiBvZiBtZXRob2RzIGluIGNsYXNzZXM8L2xpPg0KKzwvdWw+DQorPGxpPlZlcnNpb24gMS4yICg5LzkvMjAwMSk8L2xpPg0KKzx1bD4NCis8bGk+QWRkZWQgV1NETCZuYnNwO2dlbmVyYXRvcjwvbGk+DQorPC91bD4NCis8bGk+VmVyc2lvbiAxLjJ3ICg5LzE0LzIwMDEpPC9saT4NCis8dWw+DQorPGxpPldpbjMyIHBvcnQ8L2xpPg0KKzxsaT5GaXhlZCBhIHNvY2tldCBjb21tdW5pY2F0aW9uIHByb2JsZW0gaW4gd2luMzIgdmVyc2lvbjwvbGk+DQorPGxpPkFkZGVkIG5hbWVzcGFjZSBuYW1lIHBhdHRlcm4gbWF0Y2hpbmcgdG8gZWFzZSB2YWxpZGF0aW9uPC9saT4NCis8L3VsPg0KKzxsaT5WZXJzaW9uIDEuMi4xICgxMC8yNC8yMDAxKTwvbGk+DQorPHVsPg0KKzxsaT5DaHVua2VkIEhUVFAgMS4xIHRyYW5zZmVyIHN1cHBvcnQ8L2xpPg0KKzxsaT5JbXByb3ZlZCBidWZmZXJpbmc8L2xpPg0KKzxsaT5GaXhlZCBhIHByb2JsZW0gd2l0aCBuZXN0ZWQgdmVjdG9yIGFsbG9jYXRpb248L2xpPg0KKzwvdWw+DQorPGxpPlZlcnNpb24gMS4yLjIgKDExLzIvMjAwMSk8L2xpPg0KKzx1bD4NCis8bGk+U3VwcG9ydCBmb3Igc3BlY2lhbCBYTUwgZWxlbWVudCBuYW1lcyB3aXRoIGRvdHMsIHVuZGVyc2NvcmVzLCBhbmQgY2VudGVyIGRvdHMgKHNlZSBkb2N1bWVudGF0aW9uIHNlY3Rpb24gNS4zKTwvbGk+DQorPGxpPkZpeGVkIGEgZGVjb2RpbmcgcHJvYmxlbSB3aXRoIGR5bmFtaWMgYXJyYXkgb2YgcG9pbnRlcnMgdG8gcG9seW1vcnBoaWMgb2JqZWN0czwvbGk+DQorPGxpPkZpeGVkIGFuIGVuY29kaW5nIHByb2JsZW0gd2l0aCBlbnVtZXJhdGlvbnM8L2xpPg0KKzxsaT5BZGRlZCBhICJzYWZlLW1vZGUiIGZsYWcgdG8gZGlzYWJsZSBzZXJpYWxpemF0aW9uIG9mIG11bHRpLXJlZmVyZW5jZWQgb2JqZWN0czoNCis8cHJlPg0KK3NvYXBfZGlzYWJsZV9ocmVmID0gMTsNCis8L3ByZT4NCitZb3UgY2FuIHNldCB0aGlzIGdsb2JhbCBmbGFnIGFueXdlcmUgaW4gdGhlIGNvZGUsIGJ1dCBhdCBsZWFzdCBiZWZvcmUgc2VyaWFsaXphdGlvbiBpcyBwZXJmb3JtZWQuDQorSXQgd2lsbCBkaXNhYmxlIHRoZSB1c2Ugb2YgaHJlZiBhdHRyaWJ1dGVzIHdoZW4gc2VuZGluZyBtdWx0aS1yZWZlcmVuY2UgZGF0YS4gSW5zdGVhZCwgdGhlIGRhdGEgaXMgY29waWVkDQoraW4gdGhlIHBheWxvYWQuDQorPGI+V2hlbiBzZXQsIHRoaXMgZmxhZyB3aWxsIGhhbmcgdGhlIHNlcmlhbGl6ZXIgd2hlbiBzZW5kaW5nIGN5Y2xpYyBkYXRhIHN0cnVjdHVyZXMuPC9iPg0KKzwvbGk+DQorPC91bD4NCis8bGk+VmVyc2lvbiAxLjIuMyAoMTIvNS8yMDAxKTwvbGk+DQorPHVsPg0KKzxsaT5BZGRlZCA8aT5ib29sPC9pPiB0eXBlIGVuY29kaW5nL2RlY29kaW5nLjwvbGk+DQorPGxpPkFkZGVkIGR5bmFtaWMgbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzLjwvbGk+DQorPGxpPkFkZGVkIHN1cHBvcnQgZm9yIHByaW1pdGl2ZSBwb2x5bW9ycGhpYyB0eXBlcy48L2xpPg0KKzxsaT5BZGRlZCBmdWxsIHN1cHBvcnQgZm9yIENEQVRBIGNvbnRlbnQgZGVjb2RpbmcuPC9saT4NCis8bGk+TW9yZSBjb252ZW5pZW50IGN1c3RvbWl6YXRpb24gb2YgU09BUCBIZWFkZXJzIGFuZCBGYXVsdHMuIE5vIHNlcGFyYXRlIDx0dD5zb2FwaGVhZGVyLmg8L3R0PiBhbmQgPHR0PnNvYXBmYXVsdC5oPC90dD4gZmlsZXMNCityZXF1aXJlZCAoYW5kIHRoZXJlZm9yZSBubyA8dHQ+LmNwcDwvdHQ+IGZpbGVzIGhhdmUgdG8gYmUgY3JlYXRlZCBmb3IgdGhlc2UpLiBJbnN0ZWFkLCB0aGUgY29tcGlsZXIgZ2VuZXJhdGVzIGN1c3RvbWl6ZWQgU09BUA0KK0hlYWRlciBhbmQgU09BUCBGYXVsdCBtYXJzaGFsbGluZyByb3V0aW5lcyB3aGVuIHN0cnVjdC9jbGFzcyA8dHQ+U09BUF9FTlZfX0ZhdWx0PC90dD4gYW5kL29yIDx0dD5TT0FQX0VOVl9fSGVhZGVyPC90dD4gYXJlDQorc3BlY2lmaWVkIGluIHRoZSBoZWFkZXIgZmlsZSBpbnB1dCB0byB0aGUgY29tcGlsZXIuDQorPC9saT4NCis8bGk+T24tZGVtYW5kIGdlbmVyYXRpb24gb2YgdGhlIG1hcnNoYWxsaW5nIHJvdXRpbmVzIGZvciB0aGUgcHJpbWl0aXZlIHR5cGVzLCB3aGljaCByZWR1Y2VzIHRoZSBzaXplIG9mIHRoZSBleGVjdXRhYmxlcy48L2xpPg0KKzxsaT5GaXhlZCBhIFdTREwgaW5jb21wYXRpYmlsaXR5IHByb2JsZW0gaW4gdGhlIFdTREwgZ2VuZXJhdG9yLjwvbGk+DQorPGxpPkltcHJvdmVkIGRlY29kaW5nIG9mIG11bHRpLXJlZmVyZW5jZSBlbGVtZW50cyAobm8gPHR0PnhzaTp0eXBlPC90dD4gcmVxdWlyZWQgYW55bW9yZSBpbiByZWNlaXZpbmcgbWVzc2FnZSBzbyBnU09BUCBkb2VzIG5vdCBicmVhaykuPC9saT4gDQorPGxpPkltcHJvdmVkIHN1cHBvcnQgZm9yIGVuY29kaW5nL2RlY29kaW5nIGluZGlyZWN0IGRhdGEgKGUuZy4gcG9pbnRlcnMgdG8gcG9pbnRlcnMgdG8gZGF0YSkuPC9saT4NCis8bGk+DQorSW1wcm92ZWQgZW5jb2Rpbmcgb2YgZGF0YSB3aXRoIHRoZSBzYW1lIHBvaW50ZXJzIHRvIHNoYXJlZCBkYXRhIGJ1dCB3aXRoIHRoZSBzaGFyZWQgZGF0YSBkZWNsYXJlZCB3aXRoIGRpZmZlcmVudCBYTUwgc2NoZW1hIHR5cGVzDQorKGZvcm1lcmx5IGVuY29kZWQgYXMgbXVsdGktcmVmZXJlbmNlIGRhdGEgd2hpY2ggY291bGQgY2F1c2UgdHlwZSBpbmNtcGF0aWJpbGl0aWVzIGF0IHRoZSByZWNlaXZpbmcgc2lkZSkuICBGb3IgZXhhbXBsZSwgaW4gdGhlDQorZGVjbGFyYXRpb25zIDx0dD50eXBlZGVmIGNoYXIgKnhzZF9fTkNOYW1lOyB4c2RfX05DTmFtZSAqcz0iU09BUCI7IGNoYXIgKnQgPSBzOzwvdHQ+IHRoZSBwb2ludGVycyA8dHQ+czwvdHQ+IGFuZCA8dHQ+dDwvdHQ+IHBvaW50DQordG8gdGhlIHNhbWUgZGF0YSwgYnV0IHdpbGwgbm90IGJlIGVuY29kZWQgYXMgbXVsdGktcmVmZXJlbmNlIGRhdGEgc2luY2UgdGhlIHR5cGVzIGFyZSBkaWZmZXJlbnQuDQorPC9saT4NCis8bGk+QWRkZWQgZmxhZzoNCis8cHJlPg0KK3NvYXBfZW5hYmxlX251bGwgPSAxOw0KKzwvcHJlPg0KK1doZW4gc2V0LCBhbGwgTlVMTCBwb2ludGVycyB3aWxsIGJlIGV4cGxpY2l0bHkgZW5jb2RlZC4gQnkgZGVmYXVsdCwgTlVMTCBwb2ludGVycyBhcmUgb21pdHRlZCBmcm9tIHRoZSBTT0FQIHBheWxvYWQuICBGb3IgZXhhbXBsZSwNCit3aXRoIHRoaXMgZmxhZyBzZXQgYWxsIE5VTEwgc3RyaW5ncyBhbmQgb3RoZXIgTlVMTCBwb2ludGVyIGRhdGEgd2lsbCBhcHBlYXIgYXMgbmlsIHZhbHVlcyBpbiB0aGUgU09BUCBwYXlsb2FkLg0KKzwvbGk+DQorPGxpPkFkZGVkIGZsYWc6DQorPHByZT4NCitzb2FwX2VuYWJsZV9lbWJlZGRpbmcgPSAxOw0KKzwvcHJlPg0KK1doZW4gc2V0LCBtdWx0aS1yZWZlcmVuY2UgZGF0YSB3aWxsIGJlIGVuY29kZWQgaW5saW5lIHdoaWNoIHdpbGwgZ3VhcmFudGVlIHRoZSBleGFjdCBwcmVzZXJ2YXRpb24gb2YgdGhlIHN0cnVjdHVyZSBvZiB0aGUgZGF0YQ0KK3RyYW5zbWl0dGVkLiBIb3dldmVyLCBzb21lIFNPQVAgaW1wbGVtZW50YXRpb25zIGRvIG5vdCBzdXBwb3J0IGVtYmVkZGluZyBpbmxpbmUgbXVsdGktcmVmZXJlbmNlIGRhdGEgYWx0aG91Z2ggdGhpcyBlbmNvZGluZyBzdHlsZQ0KK2lzIGxpa2VseSB0byBiZSBpbmNsdWRlZCBpbiBmdXR1cmUgdmVyaW9ucyBvZiB0aGUgU09BUCBwcm90b2NvbC4gIFRoZSBmbGFnIGlzIHVzZWZ1bCB3aGVuIGNyZWF0aW5nIEMrKyBhcHBsaWNhdGlvbnMgdGhhdCBuZWVkIHRvDQorY29tbXVuaWNhdGUgZGF0YSB0byBlYWNob3RoZXIgYW5kIHRoZSBkYXRhIHN0cnVjdHVyZXMgbmVlZCB0byBiZSBwcmVzZXJ2ZWQuIFNldHRpbmcgdGhpcyBmbGFnIG1heSBjYXVzZSBhIGR1cGxpY2F0aW9uIG9mDQorbXVsdGktcmVmZXJlbmNlIGRhdGEgYnkgdGhlIHJlY2VpdmVyIGNyZWF0ZWQgd2l0aCB0aGUgU09BUCBzdHViIGNvbXBpbGVyIHdoZW4gdGhlIGRhdGEgaXMgcGFydCBvZiBhIHN0cnVjdC9jbGFzcyBvciBhcnJheS4gIFRoZQ0KK2RhdGEgaXMgbm90IGNvcGllZCBieSB0aGUgcmVjZWl2ZXIgd2hlbiB0aGUgc3RydWN0L2NsYXNzIG9yIGFycmF5cyB1c2UgcG9pbnRlcnMgdG8gdGhlIGRhdGEgdHlwZS4NCis8L2xpPg0KKzxsaT5BZGRlZCB0aGUgYWJpbGl0eSB0byBkZWNsYXJlIHZpcnR1YWwgZGVzdHJ1Y3RvcnMuPC9saT4NCis8bGk+Rml4ZWQgYSBjb21waWxhdGlvbiBlcnJvciB3aXRoIGZpeGVkLXNpemUgYXJyYXkgb2YgcG9pbnRlcnMuPC9saT4NCis8bGk+Rml4ZWQgYSBwcm9ibGVtIHdpdGggcGFkZGluZyBpbiBCYXNlNjQgKGVuL2RlKWNvZGluZy48L2xpPg0KKzxsaT5GaXhlZCBYTUwgZW50aXR5IGRlY29kaW5nIChoZXhhZGVjaW1hbCkuPC9saT4NCis8bGk+QWRkZWQgZW5jb2Rpbmcgb2Ygc3BhcnNlIGFycmF5cy4gQSBzcGFyc2UgYXJyYXkgTVVTVCBiZSBkZWNsYXJlZCBhcyBhIChmaXhlZC1zaXplIG9mIGR5bmFtaWMpIGFycmF5IG9mIHBvaW50ZXJzLiBOVUxMIHBvaW50ZXINCit2YWx1ZXMgYXJlIG9taXR0ZWQgZnJvbSB0aGUgb3V0cHV0IGFuZCBTT0FQLUVOQzpwb3NpdGlvbiBhdHRyaWJ1dGVzIGFyZSB1c2VkIGZvciBub24tTlVMTCBlbGVtZW50cy48L2xpPg0KKzxsaT5DaGFuZ2VkIHNvYXBfcHV0IGFuZCBzb2FwX2dldCBmdW5jdGlvbnMgdG8gaW5jbHVkZSBleHBsaWNpdCBzY2hlbWEgdHlwZSBwYXJhbWV0ZXJzLiAgVGhpcyBmaXhlZCBhIHByb2JsZW0gd2l0aCBXZWIgc2VydmljZXMgdGhhdCBuZWVkIHRvIHJldHVybiB0eXBlZGVmLWVkIFhNTCBzY2hlbWEgdHlwZXMgVGhlIG5ldyBzdGRzb2FwLmNwcCBhbmQgc3Rkc29hcC5oIGZpbGVzIGFyZSBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJldmlvdXMgdmVyc2lvbihzKS4NCis8L2xpPg0KKzxsaT5BZGRlZCB0aGUgYWJpbGl0eSB0byBpZ25vcmUgdGhlIG5hbWVzIG9mIGFjY2Vzc29ycyB3aGVuIGRlY29kaW5nIGZpZWxkcyB0aHJvdWdoIHRoZSB1c2Ugb2YgYSBsZWFkaW5nDQorPHR0Pl88L3R0PiBpbiBhIGZpZWxkIG5hbWUuIEZvciBleGFtcGxlOg0KKzxwcmU+DQorbnNfX215bWV0aG9kKHhzZF9fc3RyaW5nIGluLCB4c2RfX3N0cmluZyAmYW1wO19yZXR1cm4pOw0KKzwvcHJlPg0KK1doZW4gdXNlZCB0byBpbnZva2UgYSByZW1vdGUgbWV0aG9kLCB0aGUgYWN0dWFsIGVsZW1lbnQgbmFtZSBvZiB0aGUgcmVtb3RlIHJldHVybiBwYXJhbWV0ZXIgdXNlZCBieSB0aGUgc2VydmljZSBpcyBpbnNpZ25pZmljYW50Lg0KKzwvbGk+DQorPGxpPkltcHJvdmVkIG1lbW9yeSBtYW5hZ2VtZW50LiBBZGRlZCBuZXcgZnVuY3Rpb246IDx0dD5zb2FwX2Rlc3Ryb3koKTwvdHQ+IHRvIHJlbW92ZSBhbGwgY2xhc3MgaW5zdGFuY2VzLjwvbGk+DQorPGxpPkltcHJvdmVkIGRvY3VtZW50YXRpb24uPC9saT4NCis8bGk+QWRkZWQgPGk+dGltZV90PC9pPiB0eXBlIHN1cHBvcnQsIGJ1dCBzdGlsbCBuZWVkIHRvIGFkZCBlbmNvZGluZy9kZWNvZGluZyByb3V0aW5lcyB0byB0aGUgcnVudGltZSAobmV4dCB2ZXJzaW9uKS48L2xpPg0KKzxsaT5BZGRlZCA8aT53Y2hhcl90PC9pPiB0eXBlIHN1cHBvcnQsIGJ1dCBzdGlsbCBuZWVkIHRvIGFkZCBlbmNvZGluZy9kZWNvZGluZyByb3V0aW5lcyB0byB0aGUgcnVudGltZSAobmV4dCB2ZXJzaW9uKS48L2xpPg0KKzwvdWw+DQorPGxpPlZlcnNpb24gMS4yLjQgKDEyLzE3LzIwMDEpPC9saT4NCis8dWw+DQorPGxpPkFkZGVkIHN1cHBvcnQgZm9yIHdpZGUgY2hhcmFjdGVyIHN0cmluZ3MgKDxpPndjaGFyX3QqPC9pPikuPC9saT4NCis8bGk+QWRkZWQgc3VwcG9ydCBmb3IgPGk+dGltZV90PC9pPiB0eXBlLjwvbGk+DQorPGxpPkFkZGVkIHN1cHBvcnQgZm9yIFNPQVAgbGl0ZXJhbCBlbmNvZGluZy48L2xpPg0KKzxsaT5GaXhlZCBhbiBvYnNjdXJlIGJ1ZyBpbiB0aGUgZGVzZXJpYWxpemF0aW9uIG9mIGRhdGEgZnJvbSB0aGUgU09BUDRSIHRvb2xraXQgdGhhdCBjYXVzZWQgdGhlIGRlc2VyaWFsaXplciB0byBoYW5nLjwvbGk+DQorPGxpPkZpeGVkIGEgcHJvYmxlbSB3aXRoIHRoZSBzb2FwX2Rpc2FibGVfaHJlZiBmbGFnLjwvbGk+DQorPGxpPkZpeGVkIGEgcHJvYmxlbSB3aXRoIHRoZSBwb3NpdGlvbiBhdHRyaWJ1dGVzIGluIHNwYXJzZSBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMuPC9saT4NCis8bGk+Rml4ZWQgYSBwcm9ibGVtIHdpdGggdGhlIGdlbmVyYXRpb24gb2YgLm5zbWFwIGZpbGVzLjwvbGk+DQorPGxpPkZpeGVkIGEgcHJvYmxlbSB3aXRoIG1peGVkIGNvbnRlbnQgZGVjb2RpbmcgaW4gc3RyaW5ncy48L2xpPg0KKzwvdWw+DQorPGxpPlZlcnNpb24gMS4yLjUgKDEyLzI3LzIwMDEpPC9saT4NCis8dWw+DQorPGxpPkZpeGVkIGEgbWVtb3J5IGxlYWsgaW4gdGhlIGJsb2NrIGFsbG9jYXRpb24gc2NoZW1lIHVzZWQgZm9yIHN0cmluZ3MsIGhleEJpbmFyeSwgYW5kIGJhc2U2NCB0eXBlcy48L2xpPg0KKzxsaT5GaXhlZCBhIGJ1ZyBpbiB0aGUgV1NETCBnZW5lcmF0b3IgZm9yIGZpeGVkLXNpemUgYXJyYXlzLjwvbGk+DQorPGxpPkZpeGVkIGEgcHJvYmxlbSB3aXRoIHRoZSB1c2Ugb2YgdHJhaWxpbmcgdW5kZXJzY29yZXMgaW4gZmllbGQgbmFtZXMgaW4gc3RydWN0L2NsYXNzIGRlY2xhcmF0aW9ucy48L2xpPg0KKzwvdWw+DQorPGxpPlZlcnNpb24gMS4yLjYgKDEvMjUvMjAwMik8L2xpPg0KKzx1bD4NCis8bGk+SW1wcm92ZWQgcG9ydGFiaWxpdHkuPC9saT4NCis8bGk+SW1wcm92ZWQgaWQvaHJlZiBoYXNoIHRhYmxlIGVmZmljaWVuY3kgYW5kIHN0b3JhZ2UuPC9saT4NCis8bGk+SW1wcm92ZWQgbmFtZXNwYWNlIFVSSSBtYXRjaGluZyB3aXRoIHdpbGRjYXJkcy48L2xpPg0KKzxsaT5JbXByb3ZlZCBzdGFuZC1hbG9uZSBkZXBsb3ltZW50LjwvbGk+DQorPGxpPkFkZGVkIDx0dD5zb2FwX2Rpc2FibGVfcmVzcG9uc2VfY291bnQ8L3R0PiBmbGFnLjwvbGk+DQorPGxpPkZpeGVkIG9wZXJhdG9yIGRlY2xhcmF0aW9uIHBhcnNpbmcgKGNhc3Qgb3BlcmF0b3JzKS48L2xpPg0KKzxsaT5GaXhlZCBhIFdTREwgZ2VuZXJhdG9yIGJ1ZyBmb3Igb3V0cHV0IHBhcmFtZXRlcnMgYW5kIGVudW1lcmF0aW9uIHR5cGVzLjwvbGk+DQorPGxpPlJlbmFtZWQgZnVuY3Rpb24gPHR0PnNvYXBfcmV0dXJuX2ZhdWx0KCk8L3R0PiBpbnRvIDx0dD5zb2FwX3NlbmRfZmF1bHQoKTwvdHQ+LjwvbGk+DQorPC91bD4NCis8bGk+VmVyc2lvbiAyLjAgKDIvMi8yMDAyKTwvbGk+DQorPHVsPg0KKzxsaT5SZXdyb3RlIHRoZSBjb21waWxlciBhbmQgdGhlIHJ1bi10aW1lIHRvIGNyZWF0ZSBhIHRocmVhZCBzYWZlIGltcGxlbWVudGF0aW9uLjwvbGk+DQorPC91bD4NCis8bGk+VmVyc2lvbnMgMS4yLjcgYW5kIDIuMC4xICgyLzExLzIwMDIpPC9saT4NCis8dWw+DQorPGxpPkFkZGVkIGNvbXBpbGVyIG9wdGlvbnMgKC1oIC1jIC1kIC1wKS48L2xpPg0KKzxsaT5BZGRlZCBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHNlcnZpY2UgbmFtZSwgbG9jYXRpb24sIGFuZCBuYW1lc3BhY2UgVVJJIGluIGhlYWRlciBmaWxlLjwvbGk+DQorPGxpPkltcHJvdmVkIGludGVyb3BlcmFiaWxpdHkuPC9saT4NCis8L3VsPg0KKzxsaT5WZXJzaW9ucyAxLjIuOCBhbmQgMi4wLjIgKDIvMjQvMjAwMik8L2xpPg0KKzx1bD4NCis8bGk+QWRkZWQgZnVuY3Rpb24gY2FsbGJhY2tzIHRvIHN1cHBvcnQgY3VzdG9taXplZCBJL08gYW5kIEhUVFAgb3BlcmF0aW9ucy4gVGhpcyBhbGxvd3MgZm9yIHBsdWctaW4gSFRUUCBjb2RlLCBOU0FQSSBpbnRlcmZhY2UgY29kZSwNCityZWFkaW5nL3dyaXRpbmcgZnJvbS90byBmaWxlcyBvciBzdHJpbmcgYnVmZmVycywgZXRjLjwvbGk+DQorPGxpPkFkZGVkIEhUVFAgMS4wLzEuMSBrZWVwLWFsaXZlIHN1cHBvcnQuPC9saT4NCis8bGk+QWRkZWQgSFRUUCAxLjEgY2h1bmtlZCB0cmFuc2ZlciBzdXBwb3J0LjwvbGk+DQorPGxpPkFkZGVkIDx0dD5zb2FwX2Rpc2FibGVfcmVxdWVzdF9jb3VudDwvdHQ+IGZsYWcuPC9saT4NCis8bGk+QWRkZWQgPHR0PnNvYXBfZW5hYmxlX2FycmF5X292ZXJmbG93PC90dD4gZmxhZy48L2xpPg0KKzxsaT5BZGRlZCB0eXBlIG5hbWluZyBjb252ZW50aW9ucyB0byBzZXJpYWxpemUgZWxlbWVudHMgd2l0aG91dCBnZW5lcmF0aW5nIDx0dD54c2k6dHlwZTwvdHQ+IGF0dHJpYnV0ZXMuPC9saT4NCis8bGk+Rml4ZWQgYSBmaXhlZC1zaXplIGFycmF5IGRlY29kaW5nIHByb2JsZW0gKHR5cGUgbWlzbWF0Y2gpLjwvbGk+DQorPGxpPkZpeGVkICZsdDsvc2VxdWVuY2UvJmd0OyBidWcgaW4gdGhlIFdTREwgZ2VuZXJhdG9ycy48L2xpPg0KKzwvdWw+DQorPGxpPlZlcnNpb25zIDEuMyBhbmQgMi4xICgzLzEwLzIwMDIpPC9saT4NCis8dWw+DQorPGxpPkFkZGVkIGNsaWVudC1zaWRlIFNTTCAoSFRUUFMpIHN1cHBvcnQgKHRoYW5rcyB0byBNYXNzaW1vIENhZmFybyBmb3IgaGlzIHN1Z2dlc3Rpb25zKS48L2xpPg0KKzxsaT5BZGRlZCBhIG5hbWluZyBjb252ZW50aW9uIGZvciBkeW5hbWljIGFycmF5IDx0dD5fX3B0cjwvdHQ+IGZpZWxkcyB3aGljaCBlbmFibGVzIHRoZSBuYW1pbmcgb2YgdGhlIFhNTCB0YWdzIG9mIGFycmF5IGVsZW1lbnRzLjwvbGk+DQorPGxpPkFkZGVkIFdTREwgSGVhZGVyIGFuZCBGYXVsdCBzY2hlbWEgZ2VuZXJhdGlvbi48L2xpPg0KKzxsaT5JbXByb3ZlZCBkb2MvbGl0ZXJhbCBlbmNvZGluZyBzdHlsZS48L2xpPg0KKzxsaT5JbXByb3ZlZCBXU0RMIHNlcnZpY2Uvc2NoZW1hIG5hbWVzcGFjZSBnZW5lcmF0aW9uLjwvbGk+DQorPGxpPkZpeGVkIFNPQVAtRU5WOkhlYWRlcnMgdG8gYmUgc2VsZiBjb250YWluZWQuPC9saT4NCis8bGk+Rml4ZWQgV1NETCBnZW5lcmF0aW9uIG9mIHhzZCBzY2hlbWEgdHlwZXMgZGVjbGFyZWQgYXMgc3RyaW5nLjwvbGk+DQorPGxpPkZpeGVkIGEgbWV0aG9kIG92ZXJyaWRpbmcgdHlwZSBjbGFzaCBmb3IgZGVyaXZlZCBjbGFzc2VzLjwvbGk+DQorPGxpPkZpeGVkIHNwdXJpb3VzIG9jY3VycmVuY2Ugb2YgaWQ9Ii0xIiB3aXRoIHNvYXBfZW5hYmxlX251bGwgZmxhZyBlbmFibGVkLjwvbGk+DQorPGxpPkZpeGVkIGEgZnJvbnQtZW5kIGdTT0FQIGNvbXBpbGVyIHByb2JsZW0gd2l0aCBmb3J3YXJkIGFuZCBjeWNsaWMgc3RydWN0IGRlY2xhcmF0aW9ucy48L2xpPg0KKzwvdWw+DQorPGxpPlZlcnNpb25zIDEuMy4xIGFuZCAyLjEuMSAoMy8yNS8yMDAyKTwvbGk+DQorPHVsPg0KKzxsaT5BZGRlZCBoZWFkZXIgZmlsZSBzb3VyY2UgY29uc3RydWN0cyB0byBzdXBwb3J0IHRyYW5zaWVudCBkYXRhIHR5cGVzIGFuZCB0cmFuc2llbnQgc3RydWN0L2NsYXNzIGZpZWxkcyB0byBjb250cm9sIGdTT0FQJ3MgY29kZSBnZW5lcmF0aWlvbiB3aW5kb3cgZm9yIChkZSlzZXJpYWxpemF0aW9uIHJvdXRpbmVzLjwvbGk+DQorPGxpPkFkZGVkIGNhbGxiYWNrIGZvciBoYW5kbGluZyBYTUwgZWxlbWVudHMgdGhhdCBhcmUgaWdub3JlZCBvbiB0aGUgcmVjZWl2aW5nIHNpZGUgKGUuZy4gYmVjYXVzZSBvZiBzY2hlbWEgdHlwZSBwcm9ibGVtcykuIFRoaXMgZmVhdHVyZSBpcyBpbnRlbmRlZCB0byBlbmhhbmNlIHRoZSByZWxpYWJpbGl0eSBvZiBzZXJ2aWNlcy9jbGllbnRzLjwvbGk+DQorPGxpPkFkZGVkIHNlcnZlci1zaWRlIFNTTCBzdXBwb3J0IGFuZCBpbmNsdWRlZCBhbiBleGFtcGxlIG11bHRpLXRocmVhZGVkIHN0YW5kLWFsb25lIFNTTCBzZWN1cmUgU09BUCBzZXJ2ZXIgZXhhbXBsZS48L2xpPg0KKzxsaT5BZGRlZCBwcm94eSBzZXJ2ZXIgc3VwcG9ydC48L2xpPg0KKzxsaT5JbXByb3ZlZCBtZXNzYWdlIGxvZ2dpbmcgaW4gZ1NPQVAgMi4xLjEgKHRoYW5rcyB0byBKZXNzaWUgUmFnc2RhbGUgZm9yIGhpcyBzdWdnZXN0aW9ucykuPC9saT4NCis8bGk+Rml4ZWQgV1NETCBnZW5lcmF0aW9uIGZvciBkeW5hbWljIGFycmF5cy48L2xpPg0KKzxsaT5GaXhlZCBkZXNlcmlhbGl6YXRpb24gb2YgZW1wdHkgbXVsdGktcmVmIGRlcml2ZWQgY2xhc3MgaW5zdGFuY2VzLjwvbGk+DQorPC91bD4NCis8bGk+VmVyc2lvbnMgMS4zLjIgYW5kIDIuMS4yICg0LzE1LzIwMDIpPC9saT4NCis8dWw+DQorPGxpPkFkZGVkIHNvY2tldCB0aW1lb3V0IG1hbmFnZW1lbnQuPC9saT4NCis8bGk+QWRkZWQgb3B0aW9uYWwgY2xpZW50IGFuZCBzZXJ2ZXIgY29va2llIHN1cHBvcnQuPC9saT4NCis8bGk+QWRkZWQgc3VwcG9ydCBmb3IgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIGZvciBhcmJpdHJhcnkgZWxlbWVudHMgaW4gY29tcGxleFR5cGVzIChub3QganVzdCBsaW1pdGVkIHRvIFNPQVAgYXJyYXlzKS48L2xpPg0KKzxsaT5JbXByb3ZlZCBnZW5lcmF0aW9uIG9mIHNjaGVtYSAmbHQ7ZXh0ZW5zaW9uJmd0OyBkZWZpbml0aW9ucyB0byBhbGxvdyBYTUwgdmFsaWRhdGlvbiBpbiB0aGUgcHJlc2VuY2Ugb2YgY2xhc3Mgb3ZlcnJpZGluZy48L2xpPg0KKzxsaT5GaXhlZCBVTE9ORzY0IHR5cGUgaGFuZGxpbmcuPC9saT4NCis8bGk+Rml4ZWQgbGlnaHQgdmFsaWRhdGlvbiBwcm9ibGVtIChub3cgcmVqZWN0cyBpbnZhbGlkIFhNTCBzY2hlbWEgVVJJcykuPC9saT4NCis8bGk+Rml4ZWQgYSBkZXNlcmlhbGl6YXRpb24gdHlwZSBtaXNtYXRjaCB3aXRoIHR5cGVkZWYtZWQgcG9pbnRlciBwcmltaXRpdmVzLjwvbGk+DQorPGxpPkZpeGVkIFdTREwgYW5kIHNjaGVtYSBpbnRlcm9wZXJhYmlsaXR5IHByb2JsZW1zLjwvbGk+DQorPC91bD4NCis8bGk+VmVyc2lvbnMgMS4zLjMgYW5kIDIuMS4zICg0LzI3LzIwMDIpPC9saT4NCis8dWw+DQorPGxpPkFkZGVkICdtdXN0VW5kZXJzdGFuZCcgZGVjbGFyYXRpb24gcXVhbGlmaWVyIGZvciBTT0FQIEhlYWRlciBwcm9jZXNzaW5nLjwvbGk+DQorPGxpPkFkZGVkIHNvYXAuYWN0b3IgYXR0cmlidXRlIGZvciBTT0FQIEhlYWRlciBwcm9jZXNzaW5nLjwvbGk+DQorPGxpPkFkZGVkIG1ldGhvZC1oZWFkZXItcGFydCBkaXJlY3RpdmUgdG8gaWRlbnRpZnkgbWV0aG9kcyB3aXRoIGhlYWRlciBtZXNzYWdlIGFzc29jaWF0aW9ucyAoV1NETCByZXF1aXJlbWVudCkuPC9saT4NCis8bGk+QWRkZWQgYml0bWFzayAoZGUpc2VyaWFsaXphdGlvbi48L2xpPg0KKzxsaT5BZGRlZCBGYXN0Q0dJIHN1cHBvcnQuPC9saT4NCis8bGk+SW1wcm92ZWQgRExMIGJ1aWxkIHN1cHBvcnQgKGdTT0FQIDIuMS4zIG9ubHkpLjwvbGk+DQorPGxpPkltcHJvdmVkIFdpbkNFIHN1cHBvcnQgKGdTT0FQIDIuMS4zIG9ubHksIHRoYW5rcyB0byBTZWFuIFJ5YW4gZm9yIGhpcyBzdWdnZXN0aW9ucykuPC9saT4NCis8bGk+SW1wcm92ZWQgTWFjIE9TIFggc3VwcG9ydC48L2xpPg0KKzxsaT5XU0RMIGdlbmVyYXRvciBpbXByb3ZlbWVudHMgYW5kIGZpeGVzLjwvbGk+DQorPGxpPldvcmthcm91bmQgYSBidWcgaW4gLk5FVCBTT0FQIEhlYWRlcnMgKG5vbi11bmlxdWUgaWQgbmFtZSB2YWx1ZXMgaW4gLk5FVCkuPC9saT4NCis8bGk+Rml4ZWQgZGlzYWJsZV9ocmVmPTEgYnVnLjwvbGk+DQorPGxpPkZpeGVkIGBYTUwgaW4gc3RyaW5nIHBhcnNpbmcnIGNvZGUgZ2VuZXJhdGlvbiBwcm9ibGVtLjwvbGk+DQorPC91bD4NCis8bGk+VmVyc2lvbnMgMS4zLjQgYW5kIDIuMS40ICg2LzkvMjAwMik8L2xpPg0KKzx1bD4NCis8bGk+QWRkZWQgbm9uLWJsb2NraW5nIHNvYXBfYWNjZXB0KCkgd2l0aCB0aW1lb3V0IG1hbmFnZW1lbnQuPC9saT4NCis8bGk+QWRkZWQgc3VwcG9ydCBmb3IgU09BUCBIZWFkZXIgYW5kIEZhdWx0IGRlY2xhcmVkIGFzIGNsYXNzZXMuPC9saT4NCis8bGk+QWRkZWQgc3ludGF4IGZvciAnZXh0ZXJuJyBkZWNsYXJhdGlvbnMgZm9yIHRyYW5zaWVudCB0eXBlcyBhbmQgZmllbGRzLjwvbGk+DQorPGxpPkFkZGVkIHN1cHBvcnQgZm9yIFNPQVAgSGVhZGVycyBpbiBTT0FQIEZhdWx0IG1lc3NhZ2VzLjwvbGk+DQorPGxpPkFkZGVkIG9uZS13YXkgU09BUCBtZXNzYWdlcyAoMi4xLjQgb25seSkuPC9saT4NCis8bGk+QWRkZWQgc3VwcG9ydCBmb3IgdXNlci1kZWZpbmVkIChkZSlzZXJpYWxpemVycyAoMi4xLjQgb25seSkuPC9saT4NCis8bGk+SW1wcm92ZWQgb2JqZWN0IG1lbW9yeSBtYW5hZ2VtZW50LjwvbGk+DQorPGxpPkltcHJvdmVkIHN1cHBvcnQgZm9yIEFJWCBhbmQgSFAgcGxhdGZvcm1zLjwvbGk+DQorPGxpPkZpeGVkIHByb3h5IHNlcnZlciBjb25uZWN0IGJ1Zy48L2xpPg0KKzxsaT5GaXhlZCBhbiBPcGVuU1NMIGJ1Zy48L2xpPg0KKzxsaT5GaXhlZCBzb2FwX2luc3RhbnRpYXRlX0NsYXNzWCgpIGRlcml2ZWQgY2xhc3MgYWxsb2NhdGlvbiBwcm9ibGVtLjwvbGk+DQorPGxpPkZpeGVkIGdlbmVyYXRpb24gb2Ygc3B1cmlvdXMgLnhzZCBmaWxlcyB3aGVuIGxvdHMgb2YgdHJhaWxpbmcgdW5kZXJzY29yZXMgYXJlIHVzZWQgYnkgaWRlbnRpZmllcnMgaW4gdGhlIGhlYWRlciBmaWxlLjwvbGk+DQorPGxpPkZpeGVkIHN5bnRheCBlcnJvciB0aGF0IG9jY3VyZWQgd2l0aCBoZWFkZXIgZmlsZXMgY29udGFpbmluZyBjeWNsaWMgY2xhc3MgZGVjbGFyYXRpb25zLjwvbGk+DQorPGxpPkZpeGVkICdjbGFzcyBpbiBzdHJ1Y3QnIGFuZCAndmVjdG9yIG9mIGNsYXNzZXMnIFZNVCBpbml0aWFsaXphdGlvbiBidWdzLjwvbGk+DQorPC91bD4NCis8bGk+VmVyc2lvbiAyLjEuNSAoNi8yMi8yMDAyKTwvbGk+DQorPHVsPg0KKzxsaT5BZGRlZCBub24tYmxvY2tpbmcgcmVtb3RlIG1ldGhvZCBjYWxscyAobm90IHN1cHBvcnRlZCBpbiB3aW4zMiB2ZXJzaW9uKS48L2xpPg0KKzxsaT5BZGRlZCBzcGVjaWZpY2F0aW9uIG9mIGRlZmF1bHQgdmFsdWVzIGZvciBzdHJ1Y3QvY2xhc3MgZmllbGRzLjwvbGk+DQorPGxpPkFkZGVkIHNwZWNpZmljYXRpb24gb2YgbWluT2NjdXJzIGFuZCBtYXhPY2N1cnMgZm9yIHN0cnVjdC9jbGFzcyBmaWVsZHMuPC9saT4NCis8bGk+QWRkZWQgcmVzb2x1dGlvbiBvcGVyYXRvciAnOjonIHBhcnNpbmcuPC9saT4NCis8bGk+QWRkZWQgYWJzdHJhY3QgbWV0aG9kIGRlY2xhcmF0aW9uIHN1cHBvcnQuPC9saT4NCis8bGk+Rml4ZWQgV1NETCBnZW5lcmF0aW9uIG9mIFNPQVAgZG9jL2xpdC48L2xpPg0KKzxsaT5GaXhlZCBXSVRIX0ZBU1RDR0kgb3B0aW9uLjwvbGk+DQorPC91bD4NCis8bGk+VmVyc2lvbiAyLjEuNiAoNy8xMC8yMDAyKTwvbGk+DQorPHVsPg0KKzxsaT5BZGRlZCBESU1FIGF0dGFjaG1lbnQgc3VwcG9ydC48L2xpPg0KKzxsaT5BZGRlZCB3aW4zMiBub24tYmxvY2tpbmcgc29ja2V0cy48L2xpPg0KKzxsaT5DaGFuZ2VkICIlbGxkIi8iJWxsdSIgZm9ybWF0IHN0cmluZ3MgaW50byAiJUk2NGQiLyIlSTY0dSIgZm9ybWF0IHN0cmluZyBmb3Igd2luMzIuPC9saT4NCis8bGk+SW1wcm92ZWQgSS9PLjwvbGk+DQorPGxpPkZpeGVkIG11bHRpLWRpbWVuc2lvbmFsIGR5bmFtaWMgYXJyYXkgKGRlKXNlcmlhbGl6YXRpb24uPC9saT4NCis8bGk+Rml4ZWQgV1NETCBlbnVtIGFuZCBoZWFkZXIgbmFtZXNwYWNlIGdlbmVyYXRpb24uPC9saT4NCis8L3VsPg0KKzxsaT5WZXJzaW9uIDIuMS43ICg4LzYvMjAwMik8L2xpPg0KKzx1bD4NCis8bGk+QWRkZWQgZ2VuZXJhdGlvbiBvZiBleGFtcGxlIFNPQVAvWE1MIHJlcXVlc3QgYW5kIHJlc3BvbnNlIG1lc3NhZ2VzIGJ5IHRoZSBjb21waWxlci48L2xpPg0KKzxsaT5BZGRlZCBSU0EgdG8gU1NMIHN0YWNrLjwvbGk+DQorPGxpPkFkZGVkIHR3byBjYWxsYmFja3MgdG8gdGhlIEhUVFAgc3RhY2sgZm9yIGVmZmljaWVudCBoYW5kbGluZyBvZiBIVFRQIGhlYWRlcnMgaW4gQXBhY2hlLW1vZCBhbmQgSUlTLjwvbGk+DQorPGxpPkFkZGVkIGNvbXBpbGVyIG9wdGlvbiAtbSAobWFsbG9jKCkgbWVtb3J5IGNvbnRyb2wpIGFuZCB1cGRhdGVkIGRvYyBvbiBtZW1vcnkgYWxsb2NhdGlvbiBwb2xpY2llcy48L2xpPg0KKzxsaT5BZGRlZCBjb21waWxlciBvcHRpb24gLWkgdG8gc3VwcG9ydCAjaW5jbHVkZSBhbmQgI2RlZmluZSBkaXJlY3RpdmVzLjwvbGk+DQorPGxpPkltcHJvdmVkIEhUVFAgY29va2llIHN1cHBvcnQgdG8gaGFuZGxlIG5ldyBhbmQgb2xkIGNvb2tpZSBwcm90b2NvbHMuPC9saT4NCis8bGk+SW1wcm92ZWQgZXh0ZXJuYWwgY2xhc3MgKGRlKXNlcmlhbGl6YXRpb24gc3VwcG9ydCAoc3RkOjpzdHJpbmcgZXhhbXBsZSBpcyBpbmNsdWRlZCkuPC9saT4NCis8bGk+Rml4ZWQgYSBTU0wrcHJveHkgY29ubmVjdCBwcm9ibGVtLjwvbGk+DQorPGxpPkZpeGVkIHVuaW5pdGlhbGl6ZWQgJy8vZ3NvYXAuLmV4ZWN1dGFibGU6JyBzdHJpbmcgd2hpY2ggY2F1c2VkIHNwb3JhZGljIGV4aXRzLjwvbGk+DQorPGxpPkZpeGVkIFhNTCBsaXRlcmFsIHN0cmluZyBlbmNvZGluZyBwcm9ibGVtIGludHJvZHVjZWQgd2l0aCBESU1FLjwvbGk+DQorPGxpPkZpeGVkIGFuZCByZW1vdmVkIFdTREwgZHVwbGljYXRlIHJlc3BvbnNlIGVsZW1lbnRzLjwvbGk+DQorPGxpPkZpeGVkIExPTkc2NCBhbmQgVUxPTkc2NCB0eXBlcyBmb3IgV2luQ0UuPC9saT4NCis8L3VsPg0KKzxsaT5WZXJzaW9uIDIuMS44ICg4LzI4LzIwMDIpPC9saT4NCis8dWw+DQorPGxpPkFkZGVkIGNsaWVudC1zaWRlIHByb3h5IGNsYXNzIHNvdXJjZSBjb2RlIGdlbmVyYXRpb24uPC9saT4NCis8bGk+QWRkZWQgc29hcC5lbmFibGVfc3RyaWN0IGZsYWcgdG8gZW5hYmxlIHZlcnkgc3RyaWN0IHZhbGlkYXRpb24gb2YgbWVzc2FnZXMgKHVua25vd24gbmFtZXNwYWNlIFVSSXMgYW5kIFhNTCBlbGVtZW50cyBhcmUgbm90IGFsbG93ZWQpLjwvbGk+DQorPGxpPkFkZGVkIHNvYXAuc29ja2V0X2ZsYWdzIHRvIGNvbnRyb2wgc29ja2V0IHNlbmQoKSBhbmQgcmVjdigpIGZsYWdzLCBlLmcuIHRvIGRpc2FibGUgYnJva2VuIHBpcGUgc2lnbmFscyAoc29hcC5zb2NrZXRfZmxhZ3M9TVNHX05PU0lHTkFMKS48L2xpPg0KKzxsaT5BZGRlZCAnLy9nc29hcCBucyBzZXJ2aWNlIG1ldGhvZC1hY3Rpb24nIGhlYWRlciBmaWxlIGRpcmVjdGl2ZS48L2xpPg0KKzxsaT5BZGRlZCBzZXJ2ZXItc2lkZSBzb2FwX3JlY2VpdmVyX2ZhdWx0KCkgYW5kIHNvYXBfc2VuZGVyX2ZhdWx0KCkgZnVuY3Rpb25zIHRvIHJldHVybiBTT0FQIDEuMSBhbmQgU09BUCAxLjIgZmF1bHRzLjwvbGk+DQorPGxpPkFkZGVkIHNlZWRpbmcgb2YgdGhlIFBSTkcgZm9yIFNTTC48L2xpPg0KKzxsaT5BZGRlZCBzb2FwY3BwMiBjb21waWxlciBvcHRpb24gJy0yJyB0byBhdXRvbWF0ZSBTT0FQIDEuMiBzdXBwb3J0IChTT0FQIDEuMiBmZWF0dXJlcyBhcmUgQmV0YS1yZWxlYXNlKS48L2xpPg0KKzxsaT5DaGFuZ2VkIGtlZXAtYWxpdmUgc3VwcG9ydCAoc2VlIGRvY3MpLjwvbGk+DQorPGxpPkltcHJvdmVkIFdTREwgb3V0cHV0LjwvbGk+DQorPGxpPldvcmthcm91bmQgQmlzb24gMS42IGZvciB3aW4zMiBidWcgaW4gZ1NPQVAgd2luMzIgdmVyc2lvbi48L2xpPg0KKzxsaT5GaXhlZCBhIHdpbGQtY2FyZCBtYXRjaGluZyBidWcgaW4gc29hcF90YWdfY21wKCk8L2xpPg0KKzxsaT5GaXhlZCBhIHN0cmluZyBkZXNlcmlhbGl6YXRpb24gcHJvYmxlbS48L2xpPg0KKzxsaT5GaXhlZCBhIGRlc2VyaWFsaXphdGlvbiBidWcgdGhhdCBjYW4gb2NjdXIgaW4gYSBjbGllbnQtc2VydmVyIGNvbWJpbmF0aW9uIHdpdGggZ1NPQVAgYW5kIEFwYWNoZSBBeGlzLjwvbGk+DQorPC91bD4NCis8bGk+VmVyc2lvbiAyLjEuOSAoOS8wOC8yMDAyKTwvbGk+DQorPHVsPg0KKzxsaT5BZGRlZCBIVFRQIHByb3h5IGF1dGhlbnRpY2F0aW9uLjwvbGk+DQorPGxpPkFkZGVkIHBsdWctaW4gcmVnaXN0cnkgKEJldGEpLjwvbGk+DQorPGxpPkNoYW5nZWQgY29tcGlsZXIgZXhpdCBzdGF0dXMgZm9yIGNvbXBpbGF0aW9uIGVycm9ycy48L2xpPg0KKzxsaT5GaXhlZCBzdGRpbi9zdGRvdXQgYmluYXJ5IG1vZGUgZm9yIERJTUUgdHJhbnNmZXIgd2l0aCBnU09BUCBmb3Igd2luMzIuPC9saT4NCis8bGk+Rml4ZWQgd2luMzIgc29hcGNwcDIuZXhlIGJ1ZyBpbiAucmVzLnhtbCBmaWxlIGdlbmVyYXRpb24uPC9saT4NCis8L3VsPg0KKzxsaT5WZXJzaW9uIDIuMS4xMCAoMTAvMTQvMjAwMik8L2xpPg0KKzx1bD4NCis8bGk+QWRkZWQgJy8vZ3NvYXAgbnMgc2VydmljZSBtZXRob2QtZG9jdW1lbnRhdGlvbjonIGRpcmVjdGl2ZS48L2xpPg0KKzxsaT5BZGRlZCBwcm92aXNpb24gZm9yIGFkZGl0aW9uYWwgZG9jdW1lbnRhdGlvbiB0ZXh0IHdpdGggJy8vZ3NvYXAgbnMgc2VydmljZSBuYW1lOicgZGlyZWN0aXZlLjwvbGk+DQorPGxpPkFkZGVkICNpbXBvcnQgZGlyZWN0aXZlIHRvIChyZWN1cnNpdmVseSkgaW1wb3J0IGdTT0FQIGhlYWRlciBmaWxlcy48L2xpPg0KKzxsaT5BZGRlZCBwbHVnaW4gZmVhdHVyZXMgYW5kIGluY2x1ZGVkIGEgcGx1Z2luIGV4YW1wbGUgaW4gJ2V4dHJhcycgZGlyZWN0b3J5LjwvbGk+DQorPGxpPkFkZGVkIGF1dG9tYWtlL2F1dG9jb25mIHRvIGdlbmVyaWMgZ1NPQVAgcGFja2FnZSAodGhhbmtzIHRvIENocmlzdGlhbiBBYmVyZ2VyKS48L2xpPg0KKzxsaT5BZGRlZCAtRFdJVEhfTE9DQUxUSU1FIGNvbXBpbGF0aW9uIG9wdGlvbiB0byBjb250cm9sIHRpbWVfdCAoZGUpc2VyaWFsaXphdGlvbi48L2xpPg0KKzxsaT5DaGFuZ2VkIHRpbWVfdCAoZGUpc2VyaWFsaXphdGlvbiAobm93IHVzZXMgdGltZWdtKCkgYW5kIGdtdGltZSgpIHRvIGhhbmRsZSBVVEMpLiBGb3VuZCB0aGF0IG1rdGltZSgpIGxpYnJhcnkgY2FsbCBpcyBidWdneSBvbiBzb21lIHN5c3RlbXMuPC9saT4NCis8bGk+SW1wcm92ZWQgYW5kIHJlb3JnYW5pemVkIHBhY2thZ2UgZGlyZWN0b3J5IHN0cnVjdHVyZS48L2xpPg0KKzxsaT5GaXhlZCBEREwgbGlua2FnZSBwcm9ibGVtIHdpdGggaW5zdGFudGlhdGUvZGVsZXRlIHJvdXRpbmVzIGRlYWxpbmcgd2l0aCBjbGFzcyBpbnN0YW5jZSBtZW1vcnkgbWFuYWdlbWVudC48L2xpPg0KKzxsaT5GaXhlZCBjb21waWxhdGlvbiBwcm9ibGVtIHdpdGggU3VuIFdvcmtzaG9wIENDIGNvbXBpbGVyIGFuZCBvdGhlciBjb21waWxlcnMgdGhhdCBhZG9wdCBhIHNwZWNmaWMgY2xhc3MgVk1UIHN0cnVjdHVyZSB0aGF0IGNvdWxkIGJyZWFrIG9iamVjdCAoZGUpc2VyaWFsaXplcnMuPC9saT4NCis8bGk+Rml4ZWQgYnVnIGluIFdTREwgZ2VuZXJhdG9yIHdpdGggbXVsdGlwbGUgc2VydmljZSBuYW1lc3BhY2VzLjwvbGk+DQorPC91bD4NCis8bGk+VmVyc2lvbiAyLjEuMTEgKDExLzEwLzIwMDIpPC9saT4NCis8dWw+DQorPGxpPkFkZGVkIGEgbXVsdGktZnVuY3Rpb25hbCBTT0FQIHJvdXRlciBhcHBsaWNhdGlvbiAobWVzc2FnZSBmb3J3YXJkaW5nIGFuZA0KK21lc3NhZ2UgcmVsYXkgc2VydmVyKS48L2xpPg0KKzxsaT5BZGRlZCBrZWVwLWFsaXZlIHN1cHBvcnQgZm9yIGFzeW5jaHJvbm91cyBvbmUtd2F5IG1lc3NhZ2VzLjwvbGk+DQorPGxpPkltcHJvdmVkIHBhcnNpbmcgYW5kIGhhbmRsaW5nIG9mIGZ1bmN0aW9uIHByb3RvdHlwZXMgYW5kIGNsYXNzIG1ldGhvZHMuPC9saT4NCis8bGk+SW1wcm92ZWQgbW9kdWxhciBkZXNpZ24gdG8gZW5hYmxlIHRoZSBjb21waWxhdGlvbiBhbmQgbGlua2FnZSBvZiBtdWx0aXBsZSBjbGllbnQgYW5kIHNlcnZpY2UgbW9kdWxlcy48L2xpPg0KKzxsaT5JbXByb3ZlZCB1c2VyLWRlZmluZWQgU09BUCBGYXVsdCBkZXRhaWwgaGFuZGxpbmcuPC9saT4NCis8bGk+Rml4ZWQgU1NMX2FjY2VwdCBidWcuPC9saT4NCis8bGk+Rml4ZWQgc2VyaWFsaXphdGlvbiBvZiBwb2ludGVycyB0byBkeW5hbWljIGFycmF5cyB3aXRoIG11bHRpLXJlZmVyZW5jZXMuPC9saT4NCis8L3VsPg0KKzxsaT5WZXJzaW9uIDIuMiAoMTIvMTIvMjAwMik8L2xpPg0KKzx1bD4NCis8bGk+QWRkZWQgWE1MIGF0dHJpYnV0ZSAoZGUpc2VyaWFsaXphdGlvbiBzdXBwb3J0LjwvbGk+DQorPGxpPkFkZGVkIFhTRCBRTmFtZSBwYXJzaW5nIGFuZCBjb252ZXJzaW9uIHN1cHBvcnQgKHR5cGVkZWYgY2hhciAqeHNkX19RTmFtZSkuPC9saT4NCis8bGk+QWRkZWQgY29tcHJlc3Npb24gc3VwcG9ydCAoLURXSVRIX1pMSUIgcmVxdWlyZXMgWmxpYikuPC9saT4NCis8bGk+Q2hhbmdlZCBhbmQgaW1wcm92ZWQgdHJhbnNwb3J0IGFuZCBlbmNvZGluZyBzZXR0aW5ncyBieSBzcGxpdHRpbmcgdXAgc2VuZGluZyBhbmQNCityZWNlaXZpbmcgc2lkZSBmbGFncyBpbnRvIHNlcGFyYXRlIHNldHMuIERlcHJpY2F0ZWQgc29hcC5lbmFibGVfWCBhbmQgc29hcC5kaXNhYmxlX1ggZmxhZ3MuPC9saT4NCis8bGk+SW1wcm92ZWQga2VlcC1hbGl2ZSBzdXBwb3J0IChhdXRvbWF0aWMgY2xpZW50IGFuZCBzZXJ2ZXIgc2lkZXMpLjwvbGk+DQorPGxpPkZpeGVkIGEgYnVnIGluIG11c3RVbmRlcnN0YW5kIGhhbmRsaW5nLjwvbGk+DQorPGxpPkZpeGVkIGEgc3BvcmFkaWMgY3Jhc2ggb2YgdGhlIGdTT0FQIGNvbXBpbGVyIHVuZGVyIHdpbjMyLjwvbGk+DQorPGxpPkZpeGVkIHVzZXItZGVmaW5lZCBTT0FQIEZhdWx0IG91dHB1dCBpbiBXU0RMIGdlbmVyYXRvci48L2xpPg0KKzwvdWw+DQorPGxpPlZlcnNpb24gMi4yLjEgKDEyLzE4LzIwMDIpPC9saT4NCis8dWw+DQorPGxpPkFkZGVkIGNhbGxiYWNrcyB0byBlbmFibGUgY3VzdG9tIHN0cmVhbWluZyBvZiBESU1FIGF0dGFjaG1lbnRzLjwvbGk+DQorPGxpPkZpeGVkIGJyb2tlbiBzZXJpYWxpemF0aW9uIG9mIHBvaW50ZXJzIHRvIGR5bmFtaWMgYXJyYXlzIHdpdGggTlVMTA0KK19fcHRyPC9saT4NCis8bGk+Rml4ZWQgc29tZSBXU0RMIGlzc3Vlcy48L2xpPg0KKzwvdWw+DQorPGxpPlZlcnNpb24gMi4yLjIgKDEvMjUvMjAwMyk8L2xpPg0KKzx1bD4NCis8bGk+QWRkZWQgZ3ppcCBzdXBwb3J0ICgtRFdJVEhfR1pJUCByZXF1aXJlcyBabGliKS48L2xpPg0KKzxsaT5BZGRlZCBmYWNjZXB0KCkgY2FsbGJhY2suPC9saT4NCis8bGk+SW1wcm92ZWQgSFRUUCBjaHVua2luZy48L2xpPg0KKzxsaT5GaXhlZCBPcGVuU1NMIGFuZCBhY2NlcHRfdGltZW91dCAoT3BlblNTTCByZXF1aXJlcyBibG9ja2luZyBzb2NrZXRzKS48L2xpPg0KKzxsaT5GaXhlZCBIVFRQIGhlYWRlciBidWZmZXJpbmcuPC9saT4NCis8bGk+Rml4ZWQgVVRGOCBkZWNvZGluZyBvZiBhIHN1YnNldCBvZiBjaGFyYWN0ZXJzICgyLW9jdGV0IFVURikuPC9saT4NCis8bGk+Rml4ZWQgJ29wZXJhdG9yPT0nIHBhcnNpbmcuPC9saT4NCis8bGk+Rml4ZWQgYSBjb3VwbGUgb2YgV1NETCBpc3N1ZXMuPC9saT4NCis8L3VsPg0KKzxsaT5WZXJzaW9uIDIuMi4zICgzLzIvMjAwMyk8L2xpPg0KKzx1bD4NCis8bGk+QWRkZWQgc2VydmVyLXNpZGUgSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvbi48L2xpPg0KKzxsaT5JbXByb3ZlZCBzcGVlZC48L2xpPg0KKzxsaT5JbXByb3ZlZCBUcnU2NCBwb3J0YWJpbGl0eS48L2xpPg0KKzxsaT5DaGFuZ2VkIGZwb3N0KCkgZnVuY3Rpb24gY2FsbGJhY2sgc2lnbmF0dXJlOiBhZGRlZCAnaW50IHBvcnQnIGFyZ3VtZW50IGFuZA0KK2FkZGVkIHBvcnQgbnVtYmVyIHRvIHRoZSBIb3N0OiBIVFRQIGhlYWRlci48L2xpPg0KKzxsaT5GaXhlZCBtZW1vcnkgbGVhayBpbiBTU0wgY29ubmVjdCB3aGVuIHVzaW5nIE9wZW5TU0wgREguPC9saT4NCis8bGk+Rml4ZWQgY3VzdG9tIChkZSlzZXJpYWxpemVyIGRlZmluaXRpb25zIHBhcnNpbmcuPC9saT4NCis8bGk+Rml4ZWQgYSBnemlwL2RlZmxhdGUgYnVnIHdpdGggbGFyZ2UgdHJhbnNmZXJzLjwvbGk+DQorPGxpPkZpeGVkIHVzZSBvZiBmdGltZSgpIGZvciB0aW1lX3QgKGRlKXNlcmlhbGl6YXRpb24gd2l0aCB0aW1lem9uZXMuPC9saT4NCis8bGk+Rml4ZWQgYSBwcm9ibGVtIHdpdGggY29uY3VycmVudCBhY2Nlc3MgdG8gZ2xvYmFsIG5hbWVzcGFjZSB0YWJsZSBieSBtdWx0aXBsZSB0aHJlYWRzLjwvbGk+DQorPGxpPkZpeGVkIGNyYXNoIHdpdGggLy9nc29hcCBuYW1lIGRpcmVjdGl2ZS48L2xpPg0KKzxsaT5GaXhlZCBkZXNlcmlhbGl6YXRpb24gYnVnIHdpdGggbXVsdGktcmVmIG9iamVjdCBlbmNvZGluZyBieSBBcGFjaGUgQXhpcy48L2xpPg0KKzwvdWw+DQorPGxpPlZlcnNpb24gMi4zLjEtOCAoOS8yNC8yMDAzKTwvbGk+DQorPHVsPg0KKzxsaT5VcGRhdGVkIFNPQVAgMS4yIHN1cHBvcnQgKGltcGxlbWVudHMgdGhlIFNPQVAgMS4yIHJlY29tbWVuZGF0aW9uKS48L2xpPg0KKzxsaT5BZGRlZCBTVEwgY29udGFpbmVyIHN1cHBvcnQgYW5kIGJ1aWx0LWluIHN0ZDo6c3RyaW5nIGVuY29kaW5nLjwvbGk+DQorPGxpPkFkZGVkIHN0YW5kLWFsb25lIFdlYiBzZXJ2ZXIgZXhhbXBsZSB0byBzZXJ2ZSBzdGF0aWMgYW5kIGR5bmFtaWMgcGFnZXMNCit3aXRoIGEgbmV3IEhUVFAgR0VUIHBsdWdpbi48L2xpPg0KKzxsaT5BZGRlZCB2b2lkKiAoZGUpc2VyaWFsaXphdGlvbiwgZS5nLiB1c2VmdWwgdG8gc3VwcG9ydCBwb2x5bW9ycGhpc20gd2l0aCBDDQorYXBwbGljYXRpb25zIGFuZCBhcyBhbiBhbHRlcm5hdGl2ZSB0byB1bmlvbiB0eXBlcy48L2xpPg0KKzxsaT5BZGRlZCBYTUwgRE9NIHBhcnNlciB0byBzdXBwb3J0IFNPQVAgZG9jdW1lbnQgZW5jb2RpbmcgYW5kIGZvciBtaXhpbmcgb2YgYXBwbGljYXRpb24gZGF0YSAoZGUpc2VyaWFsaXphdGlvbiB3aXRoaW4gYW4gWE1MIERPTS48L2xpPg0KKzxsaT5BZGRlZCBXSVRIX0xFQU4gYW5kIFdJVEhfTEVBTkVSIGNvbXBpbGF0aW9uIGZsYWdzIHRvIGltcHJvdmUgc3VwcG9ydCBmb3INCitzbWFsbC1tZW1vcnkgZGV2aWNlcyBzdWNoIGFzIFdpbkNFIGFuZCBQYWxtLjwvbGk+DQorPGxpPkFkZGVkIFNPQVBfWE1MX0NBTk9OSUNBTCBmbGFnIGZvciBjYW5vbmljYWwgWE1MIG91dHB1dCAoWE1MLUMxNE4gc3VwcG9ydA0KK2FuZCBTT0FQIDEuMiBub3JtYWxpemF0aW9uIHN1cHBvcnQpLjwvbGk+DQorPGxpPkFkZGVkICcvL2dzb2FwIG5zIG1ldGhvZC1lbmNvZGluZzonIGRpcmVjdGl2ZS48L2xpPg0KKzxsaT5BZGRlZCAnLy9nc29hcCBucyBzY2hlbWEgaW1wb3J0OicgZGlyZWN0aXZlLjwvbGk+DQorPGxpPkFkZGVkIG9wdGlvbmFsIGNsYXNzIGdldHRlciBhbmQgc2V0dGVyIG1ldGhvZHMgZm9yIG9iamVjdCAoZGUpc2VyaWFsaXphdGlvbi48L2xpPg0KKzxsaT5BZGRlZCAndm9sYXRpbGUnIHF1YWxpZmllciB0byBpbmRpY2F0ZSB0aGF0IGNlcnRhaW4gdHlwZSBkZWNsYXJhdGlvbnMNCitzaG91bGQgYmUgdHJlYXRlZCAnYXMtaXMnIHdoZW4gdHlwZXMgYXJlIGRlY2xhcmVkIGV4dGVybmFsbHkgKGUuZy4gcGFydCBvZiBhDQorbGlicmFyeSkuPC9saT4NCis8bGk+QWRkZWQgYSBuZXcgc3RyaW5nIG5vdGF0aW9uIGZvciBkZWNsYXJhdGlvbnMgdG8gc3BlY2lmeSBzaW1wbGVUeXBlIHJlc3RyaWN0aW9uIHBhdHRlcm5zLjwvbGk+DQorPGxpPkFkZGVkIHNvYXBjcHAyIC1JIG9wdGlvbiB0byBpbmRpY2F0ZSAjaW1wb3J0IHBhdGguPC9saT4NCis8bGk+QWRkZWQgc3VwcG9ydCBmb3IgKGRlKXNlcmlhbGl6YXRpb24gb2YgYXBwbGljYXRpb24gZGF0YSB0byBDKysgaW9zdHJlYW1zLjwvbGk+DQorPGxpPkFkZGVkIGZzc2xhdXRoKCkgY2FsbGJhY2suPC9saT4NCis8bGk+QWRkZWQgSFRUUCBjb2RlIGVycm9yIHZhbHVlcy48L2xpPg0KKzxsaT5BZGRlZCBTT0FQX01BTExPQyBhbmQgU09BUF9GUkVFIG1hY3JvcyB0byByZXBsYWNlIG1hbGxvYygpIGFuZCBmcmVlKCkuPC9saT4NCis8bGk+QWRkZWQgc29hcF9zdHJkdXAoc29hcCwgc3RyaW5nKSB0byBjb3B5IHN0cmluZ3MgaW4gZ1NPQVAncyBtZW1vcnkgc3BhY2UuPC9saT4NCis8bGk+QWRkZWQgY2h1bmtlZCBzdHJlYW1pbmcgRElNRSBvdXRwdXQgKHRoYW5rcyB0byBKLiBMaSBmb3IgaGlzDQorc3VnZ2VzdGlvbnMpLjwvbGk+DQorPGxpPkFkZGVkIFNPQVBfU09DS0VUIGZvciB3aW4zMiBzdXBwb3J0ICh0aGFua3MgdG8gQi4gR2lsbGUgZm9yIGhpcyBzdWdnZXN0aW9ucykuPC9saT4NCis8bGk+QWRkZWQgU09fTElOR0VSIHN1cHBvcnQgKHNvYXAuY29ubmVjdF9mbGFncykuPC9saT4NCis8bGk+QWRkZWQgc3VwcG9ydCBmb3IgaXNvLTg4NTktMSBlbmNvZGVkIFhNTCBwYXJzaW5nIChkZWZhdWx0IGlzIHV0ZjgpLjwvbGk+DQorPGxpPkFkZGVkICNtb2R1bGUgZGlyZWN0aXZlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuPC9saT4NCis8bGk+QWRkZWQgQysrIG5hbWVzcGFjZXMgc3VwcG9ydCB0byBlbmFibGUgdGhlIGNvbXBpbGF0aW9uIGFuZCBsaW5rYWdlIG9mDQorbXVsdGlwbGUgY2xpZW50IGFuZCBzZXJ2aWNlIGNvZGVzLjwvbGk+DQorPGxpPkFkZGVkIFdJVEhfQ0FTRUlOU0VOU0lUSVZFVEFHUyBjb21waWxhdGlvbiBmbGFnIHRvIGVuYWJsZSBjYXNlIGluc2Vuc2l0aXZlDQorWE1MIHBhcnNpbmcuPC9saT4NCis8bGk+SW1wcm92ZWQgV1NETCB0eXBlcyBzY2hlbWEgb3V0cHV0LjwvbGk+DQorPGxpPkltcHJvdmVkIGN1c3RvbSAoZGUpc2VyaWFsaXphdGlvbiAobm90ZTogZXh0cmFzL3N0cmluZ3Rlc3QgZXhhbXBsZQ0KK2hhcyBiZWVuIGNoYW5nZWQpLjwvbGk+DQorPGxpPkltcHJvdmVkIFNPQVAgbGl0ZXJhbCBlbmNvZGluZy48L2xpPg0KKzxsaT5JbXByb3ZlZCBzcGVlZC48L2xpPg0KKzxsaT5JbXByb3ZlZCBIVFRQMS4wLzEuMSBzdXBwb3J0LjwvbGk+DQorPGxpPlJlbW92ZWQgc29hcC5kZWZhdWx0TmFtZXNwYWNlIGluIGZhdm9yIG9mIGF1dG9tYXRpYyBTT0FQIGxpdGVyYWwgb3V0cHV0IGJhc2VkIG9uIHNvYXAuZW5jb2RpbmdTdHlsZSB2YWx1ZS48L2xpPg0KKzxsaT5GaXhlZCBHTVQgdG8gRFNUIGxvY2FsdGltZSBjb252ZXJzaW9uLCBidXQgc3RpbGwgaXNzdWVzIHdpdGggU3VuIFNvbGFyaXMuPC9saT4NCis8bGk+Rml4ZWQgZHluYW1pYyBhcnJheSBfX29mZnNldCBoYW5kbGluZy48L2xpPg0KKzxsaT5GaXhlZCBjbGFzcyBkZWZpbml0aW9uIG9yZGVyLjwvbGk+DQorPGxpPkZpeGVkIHNwb3JhZGljIG1lbW9yeSBsZWFrIGluIEhUVFAgY29va2llIHJlYWRlci48L2xpPg0KKzxsaT5GaXhlZCBtdWx0aS10aHJlYWRlZCBzZXJ2ZXItc2lkZSBPcGVuU1NMIGluaXRpYWxpemF0aW9uLjwvbGk+DQorPGxpPkZpeGVkIGVudW1lcmF0aW9uLWJhc2VkIFhNTCBhdHRyaWJ1dGUgZGVzZXJpYWxpYXRpb24uPC9saT4NCis8bGk+Rml4ZWQgU09BUC1FTkM6cG9zaXRpb24gYXR0cmlidXRlIHBsYWNlbWVudCB3aGVuIGFycmF5cyBvZiBwb2ludGVycyBhcmUNCittaXhlZCB3aXRoIG5pbGxhYmxlIGRhdGEuPC9saT4NCis8bGk+Rml4ZWQgY3Jhc2ggd2hlbiBwYXJzaW5nIGluY29ycmVjdCBTT0FQL1hNTCBhdHRyaWJ1dGUgY29udGVudC48L2xpPg0KKzwvdWw+DQorPGxpPlZlcnNpb24gMi40ICgxMi8yMC8yMDAzKTwvbGk+DQorPHVsPg0KKzxsaT5OZXcgV1NETCBwYXJzZXIgYW5kIGltcG9ydGVyIHdpdGggaW1wcm92ZWQgc3VwcG9ydCBmb3IgU09BUCBkb2N1bWVudCBzdHlsZSBhbmQgbGl0ZXJhbCBlbmNvZGluZy48L2xpPg0KKzxsaT5BZGRlZCBvcHRpb25hbCBmdWxsIHNjaGVtYSB2YWxpZGF0aW9uIChwYXJ0aWFsIGJ5IGRlZmF1bHQpLiBVc2UgU09BUF9YTUxfU1RSSUNUIGZsYWcuPC9saT4NCis8bGk+QWRkZWQgU1NMIHNlc3Npb24gY2FjaGluZy48L2xpPg0KKzxsaT5BZGRlZCBzb2FwX3NldF9uYW1lc3BhY2VzKCkgdG8gc3dpdGNoIG5hbWVzcGFjZSB0YWJsZXMuPC9saT4NCis8bGk+Rml4ZWQgcGx1Z2luIG1lbW9yeSBsZWFrLiBSRVFVSVJFRCBDSEFOR0UgdG8gcGx1Z2luIGFsbG9jYXRpb24gYW5kIGNvcHlpbmcuPC9saT4NCis8bGk+Rml4ZWQgc2VydmVyLXNpZGUgYmxvY2tpbmcgU1NMIGFjY2VwdC48L2xpPg0KKzwvdWw+DQorPGxpPlZlcnNpb24gMi40LjEgKDAxLzA3LzIwMDQpPC9saT4NCis8dWw+DQorPGxpPkNoYW5nZWQgX1VTQ09SRV8gYW5kIF9ET1RfIG5hbWluZyBjb252ZW50aW9ucyBpbnRvIF9VU0NPUkUgYW5kIF9ET1QgdG8gaW1wcm92ZSBuYW1lDQorbWFwcGluZy48L2xpPg0KKzxsaT5VcGRhdGVkIERPTSBwYXJzZXIgKGludGVncmF0ZWQgaW50byBjb3JlIGdTT0FQIGxpYnJhcnkpLjwvbGk+DQorPGxpPkltcHJvdmVkIFdTREwgcGFyc2VyIGFuZCBpbmNsdWRlZCBzZXZlcmFsIG5ldyBmZWF0dXJlcy48L2xpPg0KKzxsaT5GaXhlZCBXU0RMIHNjaGVtYSBpbXBvcnQgYW5kIFdTREwgbGl0ZXJhbCBvdXRwdXQuPC9saT4NCis8L3VsPg0KKzxsaT5WZXJzaW9uIDIuNSAoMDEvMjgvMjAwNCk8L2xpPg0KKzx1bD4NCis8bGk+Q2hhbmdlZCBkZWZhdWx0IGVuY29kaW5nIHRvIFNPQVAgUlBDIGxpdGVyYWwsIGFzIG1hbmRhdGVkIGJ5IFdTLUkgQmFzaWMNCitQcm9maWxlIDEuMGEgYW5kIGJlc3QgcHJhY3RpY2VzLjwvbGk+DQorPGxpPkFkZGVkIHNvYXBjcHAyIGNvbXBpbGVyIG9wdGlvbiAtZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB0byBnU09BUA0KKzIuNC4xIGFuZCBlYXJsaWVyIHRoYXQgdXNlIFNPQVAgUlBDDQorZW5jb2RpbmcgZGVmYXVsdHMgKGhlbHBmdWwgd2hlbiBtaWdyYXRpbmcgZ1NPQVAgcHJvamVjdHMgdG8gMi41KS48L2xpPg0KKzxsaT5BZGRlZCBhdXRvbWF0aWMgY29tcGlsZXItc2lkZSBXUy1JIEJhc2ljIFByb2ZpbGUgMS4wYSBjb21wbGlhbmNlIHdhcm5pbmdzDQorKHdhcm5zIGJlZm9yZSBkZXBsb3ltZW50KS48L2xpPg0KKzxsaT5BZGRlZCBmZ2V0KCkgY2FsbGJhY2sgZm9yIEhUVFAgR0VUIHJlc3BvbnNlcy48L2xpPg0KKzxsaT5BZGRlZCBJUHY2IHN1cHBvcnQgY29udHJpYnV0ZWQgYnkgV2luZCBSaXZlciBTeXN0ZW1zLjwvbGk+DQorPGxpPkFkZGVkIFZ4V29ya3Mgc3VwcG9ydCBjb250cmlidXRlZCBieSBXaW5kIFJpdmVyIFN5c3RlbXMuPC9saT4NCis8bGk+SW1wcm92ZWQgU09BUCBGYXVsdCBoYW5kbGluZy48L2xpPg0KKzxsaT5JbXByb3ZlZCBpbnRlcm9wIHdpdGggQXhpcyBSUEMgZW5jb2RlZCByZXNwb25zZSBtZXNzYWdlcy48L2xpPg0KKzxsaT5GaXhlZCBzdGQ6OnN0cmluZyB4c2k6dHlwZSBhdHRyaWJ1dGUgdmFsdWUuPC9saT4NCis8bGk+Rml4ZWQgZ1NPQVAgMi40IHByb2JsZW1zIHdpdGggc2VyaWFsaXphdGlvbiBvZiBlbnVtZXJhdGlvbiB2YWx1ZXMgb3V0c2lkZSBlbnVtZXJhdGlvbiByYW5nZS48L2xpPg0KKzxsaT5GaXhlZCBnU09BUCAyLjQgUG9ja2V0IFBDIGJ1aWxkIHByb2JsZW0uPC9saT4NCis8bGk+Rml4ZWQgd3NkbDJoIFNPQVAgRmF1bHQgYW5kIEhlYWRlciBvdXRwdXQuPC9saT4NCis8L3VsPg0KKzxsaT5WZXJzaW9uIDIuNS4xICgwMi8xMi8yMDA0KTwvbGk+DQorPHVsPg0KKzxsaT5JbXByb3ZlZCBXU0RMIG91dHB1dCBhbmQgV1MtSSBCUDEuMGEgY29tcGxpYW5jZS48L2xpPg0KKzxsaT5JbXByb3ZlZCBXU0RMIHBhcnNlciBzdGFiaWxpdHkuPC9saT4NCis8bGk+Rml4ZWQgcHJvYmxlbSBwYXJzaW5nIGVtcHR5IHhzZDpiYXNlNjRCaW5hcnkgZWxlbWVudHMuPC9saT4NCis8bGk+Rml4ZWQgVnhXb3JrcyBhbmQgVFJVNjQgcG9ydGFiaWxpdHkgaXNzdWVzLjwvbGk+DQorPGxpPkZpeGVkIEhUVFAgNDAwIGVycm9yIHByb2JsZW0uPC9saT4NCis8bGk+Rml4ZWQgc29hcGNwcDIgMi41IHN0YWJpbGl0eSBwcm9ibGVtIHdpdGggb25lLXdheSBtZXNzYWdlcy48L2xpPg0KKzwvdWw+DQorPGxpPlZlcnNpb24gMi41LjIgKDAyLzIzLzIwMDQpPC9saT4NCis8dWw+DQorPGxpPkZpeGVkIFdTREwgZ2VuZXJhdGlvbiB3YXJuaW5ncy48L2xpPg0KKzxsaT5GaXhlZCBMT05HNjQgcHJvYmxlbSBmb3IgUGFsbU9TLjwvbGk+DQorPGxpPkZpeGVkIG1vZHVsZSBidWlsZCBsaW5rIHByb2JsZW0gYW5kICdjb21wb25lbnRzJyBleGFtcGxlLjwvbGk+DQorPC91bD4NCis8bGk+VmVyc2lvbiAyLjYuMCAoMDMvMjgvMjAwNCk8L2xpPg0KKzx1bD4NCis8bGk+Q2hhbmdlZCBkZWZhdWx0IHN0eWxlIHRvIGRvYy9saXQuPC9saT4NCis8bGk+SW1wcm92ZWQgZG9jL2xpdCBXU0RMIGhhbmRsaW5nLjwvbGk+DQorPGxpPkltcHJvdmVkIHNvYXBjcHAyIHNhbXBsZSBTT0FQL1hNTCBtZXNzYWdlIG91dHB1dC48L2xpPg0KKzxsaT5BZGRlZCBwcm94eSBzdXBwb3J0IGZvciB3c2RsMmguPC9saT4NCis8bGk+Rml4ZWQgQ09OTkVDVCBtZXRob2QgZm9yIHByb3h5K1NTTCtnemlwLjwvbGk+DQorPC91bD4NCis8bGk+VmVyc2lvbiAyLjYuMSAoMDYvMDcvMjAwNCk8L2xpPg0KKzx1bD4NCis8bGk+QWRkZWQgb3B0aW9uYWwgbXVsdGlieXRlIGNoYXJhY3RlciBzdXBwb3J0LjwvbGk+DQorPGxpPkltcHJvdmVkIFdTREwgb3V0cHV0LjwvbGk+DQorPGxpPkZpeGVkIFNUTCBjb250YWluZXIgbXVsdGktcmVmIGRlc2VyaWFsaXphdGlvbiBwcm9ibGVtIHdpdGggbWlzc2luZyBkYXRhLjwvbGk+DQorPGxpPkZpeGVkIGRvYy9saXQgc2VydmVyIGNvZGUgZ2VuZXJhdGlvbiBmcm9tIGRvYy9saXQgV1NETCBkZWZpbml0aW9ucy48L2xpPg0KKzwvdWw+DQorPGxpPlZlcnNpb24gMi42LjIgKDA2LzEyLzIwMDQpPC9saT4NCis8dWw+DQorPGxpPkFkZGVkIE1hdGxhYih0bSkgY29kZSBvdXRwdXQgKGRvY3VtZW50YXRpb24gaXMgbm90IGF2YWlsYWJlbCB5ZXQpLjwvbGk+DQorPGxpPkltcHJvdmVkIHdzZGwyaCBvdXRwdXQgZm9yIHNjaGVtYSBmYWNldHMuPC9saT4NCis8bGk+VXBkYXRlZCBkb20uY3BwLjwvbGk+DQorPGxpPkNoYW5nZWQgd3NkbDJoIHN0ZDo6c3RyaW5nKiAtLSZndDsgc3RkOjpzdHJpbmcgZ2VuZXJhdGlvbiAodG8gYXZvaWQgZG91YmxlDQorcG9pbnRlcnMgc3RkOjpzdHJpbmcqKikuIFRvIG9idGFpbiBvbGQgYmVoYXZpb3IsIGFkZCBlbnRyeSAieHNkOnN0cmluZyA9DQorfCBzdGQ6OnN0cmluZyogfCBzdGQ6OnN0cmluZyoiIHRvIHR5cGVtYXAuZGF0LjwvbGk+DQorPGxpPkZpeGVkIHdzZGwyaCBoYW5kbGluZyBvZiAmbHQ7eHM6aW5jbHVkZSZndDsuPC9saT4NCis8bGk+Rml4ZWQgd3NkbDJoIGhhbmRsaW5nIG9mIGVtcHR5IG5hbWVzcGFjZXMgYW5kIGFic2VudCB0YXJnZXROYW1lc3BhY2UNCitzY2hlbWEgYXR0cmlidXRlcy48L2xpPg0KKzxsaT5GaXhlZCBNQiBjaGFyIGhhbmRsaW5nLjwvbGk+DQorPC91bD4NCis8bGk+VmVyc2lvbiAyLjcuMGEvYi9jL2QvZS9mICgwOS8xMC8yMDA0LCAyLzEvMjAwNSk8L2xpPg0KKzx1bD4NCis8bGk+QWRkZWQgbXVsdGlwYXJ0L3JlbGF0ZWQgc3VwcG9ydCBmb3IgU09BUCB3aXRoIE1JTUUgYXR0YWNobWVudHMgKFN3QSkuPC9saT4NCis8bGk+QWRkZWQgQVBJIGZ1bmN0aW9ucyBmb3IgRElNRSBvcGVuIGFuZCBjbG9zZWQgbGF5b3V0IHN1cHBvcnQuPC9saT4NCis8bGk+QWRkZWQgLy9nc29hcCBzY2hlbWEgZWxlbWVudEZvcm0vYXR0cmlidXRlRm9ybSBkaXJlY3RpdmUuPC9saT4NCis8bGk+QWRkZWQgZmNsb3Nlc29ja2V0LCBmc2h1dGRvd25zb2NrZXQsIGZwb2xsLCBmc2VydmVsb29wIGNhbGxiYWNrcy48L2xpPg0KKzxsaT5BZGRlZCBzb2FwLmF1dGhyZWFsbSBzdHJpbmcgYXR0cmlidXRlIHRvIHNldCBiYXNpYyBhdXRoZW50aWNhdGlvbiByZWFsbS48L2xpPg0KKzxsaT5BZGRlZCBzb2FwLnByb2xvZyBzdHJpbmcgYXR0cmlidXRlIHRvIG91dHB1dCBvcHRpb25hbCBYTUwgcHJvbG9nIHdpdGggcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgYW5kIGRpcmVjdGl2ZXMuPC9saT4NCis8bGk+QWRkZWQgc29hcGNwcDIgb3B0aW9uIC10LjwvbGk+DQorPGxpPkFkZGVkIHdzZGwyaCBvcHRpb25zIC1lIGFuZCAtaS48L2xpPg0KKzxsaT5BZGRlZCBQYWxtIE9TIGFuZCBTeW1iaWFuIGluc3RydWN0aW9ucyBhbmQgZXhhbXBsZXMuPC9saT4NCis8bGk+QWRkZWQgeG1sLXJwYyBzdXBwb3J0IGFuZCBleGFtcGxlcy48L2xpPg0KKzxsaT5OZXcgbW9kX2dzb2FwIGRpcmVjdG9yeSB3aXRoIG1vZHVsZXMgZm9yIEFwYWNoZSAxLngvMi54LCBJSVMsIGFuZCBXaW5JbmV0PC9saT4NCis8bGk+SW1wcm92ZWQgWE1MIHZhbGlkYXRpb24gd2l0aCBTT0FQX1hNTF9TVFJJQ1QgZmxhZy48L2xpPg0KKzxsaT5JbXByb3ZlZCBtZW1vcnkgZm9vdHByaW50IChyZWR1Y2VkIGNvZGUgc2l6ZSBhbmQgcmVkdWNlZCBzZXJpYWxpemF0aW9uIG92ZXJoZWFkKS48L2xpPg0KKzxsaT5JbXByb3ZlZCBydW50aW1lIGlkLXJlZiBzZXJpYWxpemF0aW9uIGFuZCBkZXNlcmlhbGl6YXRpb24uPC9saT4NCis8bGk+SW1wcm92ZWQgd3NkbDJoIHRyYW5zbGF0aW9uLjwvbGk+DQorPGxpPlVwZGF0ZWQgZG9tLmNwcC48L2xpPg0KKzxsaT5VcGRhdGVkIHdlYnNlcnZlci5jLjwvbGk+DQorPGxpPkZpeGVkIGlzc3VlcyB3aXRoIG5hbWVzcGFjZSBxdWFsaWZpY2F0aW9uIGluIGRvYy9saXQgbWVzc2FnZXMuPC9saT4NCis8bGk+Rml4ZWQgU09BUF9IUkVGIGVycm9yLjwvbGk+DQorPGxpPkZpeGVkIHByb3h5K1NTTCt6bGliK2NodW5raW5nLjwvbGk+DQorPGxpPkZpeGVkIFNTTCBzZWxlY3QoKSBwb2xsaW5nIGluIGZyZWN2KCkuPC9saT4NCis8bGk+Rml4ZWQgd3NkbDJoIG11bHRpZGltZW5zaW9uYWwgU09BUCBhcnJheXMgZ2VuZXJhdGUgcHJvYmxlbS48L2xpPg0KKzwvdWw+DQorPGxpPlZlcnNpb24gMi43LjEgKDAzLzMxLzIwMDUpPC9saT4NCis8dWw+DQorPGxpPkFkZGVkIG5ldyBzdHlsZSBvZiBDKysgcHJveHkvb2JqZWN0IGdlbmVyYXRpb24gKG9iamVjdHMgZGVyaXZlZCBmcm9tDQorc29hcCBzdHJ1Y3QpLCBlbmFibGVkIHdpdGggc29hcGNwcDIgb3B0aW9uIC1pLjwvbGk+DQorPGxpPkFkZGVkIG5ldyBmZWF0dXJlcyB0byB3c2RsMmggZ2VuZXJhdGlvbiB0byBlbmFibGUgdXNlci1kZWZpbmVkIGNsYXNzL3N0cnVjdCBleHRlbnNpb25zIHN1Y2ggYXMgbWVtYmVyIGRhdGEgYW5kIGZ1bmN0aW9ucyB3aGljaCBhcmUgZGVjbGFyZWQgaW4gdHlwZW1hcC5kYXQuPC9saT4NCis8bGk+QWRkZWQgTUlNRSBtdWx0aXBhcnQvZm9ybS1kYXRhIHBhcnNpbmcgdG8gc3VwcG9ydCBIVFRQIFBPU1QgSFRNTCBmb3JtIGhhbmRsaW5nIChleGFtcGxlIGluY2x1ZGVkIGluIHNhbXBsZXMvd2Vic2VydmVyKS48L2xpPg0KKzxsaT5BZGRlZCBidWlsdC1pbiBtZW1vcnkgbGVhayBkZXRlY3Rpb24gZW5hYmxlZCB3aXRoIC1EREVCVUcuPC9saT4NCis8bGk+QWRkZWQgVURESSB2MiBBUEkgYW5kIGV4YW1wbGVzLjwvbGk+DQorPGxpPkFkZGVkICdXUycgZGlyZWN0b3J5IHdpdGggV1MtKiBwcm90b2NvbHMsIHN1Y2ggYXMgV1MtQWRkcmVzc2luZy4gVGhpcyBwYXJ0IHdpbGwgbWF0dXJlIGFzIG1vcmUgV1MtKiBwcm90b2NvbHMgd2lsbCBiZSBhZGRlZCBvdmVyIHRpbWUuPC9saT4NCis8bGk+QWRkZWQgZnNldGVycm9yKCkgY2FsbGJhY2suPC9saT4NCis8bGk+SW1wcm92ZWQgd3NkbDJoIGNvZGUgb3V0cHV0LjwvbGk+DQorPGxpPkVuaGFuY2VkIFdlYiBzZXJ2ZXIgc2FtcGxlIGNvZGUsIGFuZCBodHRwZ2V0IGFuZCBsb2dnaW5nIHBsdWdpbnMuPC9saT4NCis8bGk+Rml4ZWQgYmFzZTY0L2hleEJpbmFyeSBYTUwgYXR0cmlidXRlIHNlcmlhbGl6YXRpb24uPC9saT4NCis8bGk+Rml4ZWQgYSBtaXNzaW5nIG1pbi9tYXhPY2N1cnMgY2hlY2sgZm9yIHZhbGlkYXRpb24uPC9saT4NCis8L3VsPg0KKzxsaT5WZXJzaW9uIDIuNy4yICgwNS8xMS8yMDA1KTwvbGk+DQorPHVsPg0KKzxsaT5BZGRlZCBTT0FQLW92ZXItVURQIElQdjQvSVB2NiBzdXBwb3J0IHdpdGggZXhhbXBsZXMuPC9saT4NCis8bGk+QWRkZWQgVURESSB2MiBBUEkgcHVibGlzaCBleGFtcGxlLjwvbGk+DQorPGxpPkltcHJvdmVkIHdzZGwyaCBwYXJzZXIgYWNjZXB0aW5nIG11bHRpcGxlIFdTREwvWFNEIGZpbGVzIGZyb20gdGhlIGNvbW1hbmQNCitsaW5lLjwvbGk+DQorPGxpPkZpeGVkIHdzZGwyaCBzY2hlbWEgaW1wb3J0IGZyb20gaW5jbHVkZWQgc2NoZW1hIGJ1Zy48L2xpPg0KKzxsaT5GaXhlZCBTT0FQIDEuMiBGYXVsdCBTdWJjb2RlIGhhbmRsaW5nLjwvbGk+DQorPC91bD4NCis8bGk+VmVyc2lvbiAyLjcuMyAoMDYvMjcvMjAwNSk8L2xpPg0KKzx1bD4NCis8bGk+QWRkZWQgTVRPTSBhdHRhY2htZW50IHN1cHBvcnQuPC9saT4NCis8bGk+QWRkZWQgJ3BsdWdpbicgZGlyZWN0b3J5IHdpdGggZXhhbXBsZSBwbHVnLWlucy48L2xpPg0KKzxsaT5BZGRlZCAnaW1wb3J0JyBkaXJlY3RvcnkgZm9yIGNvbW1vbmx5ICNpbXBvcnQtZWQgZmlsZXMgc3VjaCBhcyBzdGx2ZWN0b3IuaC48L2xpPg0KKzxsaT5BZGRlZCBIVFRQIGRpZ2VzdCBhdXRoZW50aWNhdGlvbiBwbHVnLWluICdwbHVnaW5zL2h0dHBkYS5oJy48L2xpPg0KKzxsaT5BZGRlZCBuZXcgaW1wb3J0IGZlYXR1cmUgdG8gd3NkbDJoIHVzaW5nIG5zPSZsdDt1cmkmZ3Q7IGNvbnZlbnRpb24gZm9yDQordHlwZW1hcC5kYXQgZmlsZXMsIHdoaWNoIGVuYWJsZXMgd3NkbDJoIHRvIHBhcnNlIGEgV1NETCB0aGF0IGltcG9ydHMga25vd24NCitXU0RMcy9zY2hlbWFzIHN1Y2ggYXMgWE9QLCBYTUwgTUlNRSwgYW5kIFdTLUFkZHJlc3Npbmcgd2l0aG91dCBhY3R1YWxseQ0KK3JlYWRpbmcgdGhlIGltcG9ydGVkIFdTREwvc2NoZW1hcy48L2xpPg0KKzxsaT5BZGRlZCBzb2FwY3BwMiBvcHRpb25zIC1DIGFuZCAtUyB0byBnZW5lcmF0ZSBjbGllbnQtIG9yIHNlcnZlci1vbmx5DQorY29kZXMuPC9saT4NCis8bGk+QWRkZWQgbXVsdGktcGF0aCBzdXBwb3J0IGZvciBzb2FwcGNwcDIgb3B0aW9uIC1JLjwvbGk+DQorPGxpPkFkZGVkIEMgYW5kIEMrKyBleGFtcGxlcyB0byBjb21iaW5lIG11bHRpcGxlIGNsaWVudHMgYW5kIHNlcnZpY2VzIGludG8gb25lDQorZXhlY3V0YWJsZSwgc2VlIHRoZSBzYW1wbGVzL2NvbXBvbmVudHMgZGlyZWN0b3J5IGluIHRoZSBwYWNrYWdlLjwvbGk+DQorPGxpPkltcHJvdmVkIHNvYXBjcHAyIG9wdGlvbiAtZSB0byBnZW5lcmF0ZSBTT0FQIFJQQyBlbmNvZGluZyBzdHlsZSBjbGllbnQvc2VydmVyIGNvZGVzIGJ5DQorZGVmYXVsdCAoaW5zdGVhZCBvZiBkb2N1bWVudC9saXRlcmFsIGJ5IGRlZmF1bHQpLjwvbGk+DQorPGxpPkZpeGVkIHdzZGwyaCBjaXJjdWxhciBpbXBvcnQgb2Ygc2NoZW1hcy48L2xpPg0KKzxsaT5GaXhlZCBhdHRyaWJ1dGVHcm91cCBoYW5kbGluZyBpbiB3c2RsMmguPC9saT4NCis8bGk+Rml4ZWQgc29hcGNwcDIgaGFuZGxpbmcgb2YgJ2ludmlzaWJsZScgdGFncywgZS5nLiBfX2FueSwgdGhhdCBzaG91bGQgb25seSBiZQ0KK3BvcHVsYXRlZCBhZnRlciBhbGwgZWxzZSBmYWlsZWQgdG8gbWF0Y2ggdGhlIGRlbGl2ZXJlZCBYTUwgY29udGVudC48L2xpPg0KKzxsaT5GaXhlZCB2YWxpZGF0aW9uIG9mIG51bWVyaWMgZW51bSBjb25zdGFudHMgd2l0aCBTT0FQX1hNTF9TVFJJQ1QgdmFsaWRhdGlvbi48L2xpPg0KKzxsaT5GaXhlZCBlbmdpbmUncyBzcHVyaW91cyBsb2cgZmlsZSBnZW5lcmF0aW9uIGlzc3VlLjwvbGk+DQorPC91bD4NCis8bGk+VmVyc2lvbiAyLjcuNCAoMDcvMjQvMjAwNSk8L2xpPg0KKzx1bD4NCis8bGk+QWRkZWQgdW5pb24gc2VyaWFsaXphdGlvbi48L2xpPg0KKzxsaT5BZGRlZCAnLy9nc29hcCAuLi4gdHlwZS1kb2N1bWVudGF0aW9uOicgZGlyZWN0aXZlLjwvbGk+DQorPGxpPkFkZGVkICcvL2dzb2FwIC4uLiBtZXRob2QtbWltZS10eXBlOicgZGlyZWN0aXZlLjwvbGk+DQorPGxpPkFkZGVkIHdzZGwyaCBvcHRpb24gLWcgZm9yIGdlbmVyYXRpbmcgZ2xvYmFsIGVsZW1lbnQvYXR0cmlidXRlIGRlY2xhcmF0aW9ucyBmb3IgYnVpbGRpbmcgbW9kdWxhciAuaCBmaWxlcy48L2xpPg0KKzxsaT5BZGRlZCB3c2RsMiBvcHRpb24gLXkgZm9yIGdlbmVyYXRpbmcgdHlwZWRlZiBzeW5vbnltcyBmb3Igc3RydWN0cyBhbmQgZW51bXMsIHdpdGggaW1wcm92ZWQgaGFuZGxpbmcgb2YgdHlwZWRlZnMgYnkgc29hcGNwcDIuPC9saT4NCis8bGk+QWRkZWQgd3NkbDIgb3B0aW9uIC11IHRvIGRpc2FibGUgdW5pb24gZ2VuZXJhdGlvbiBmb3IgeHM6Y2hvaWNlLjwvbGk+DQorPGxpPkltcHJvdmVkIHdzZGwyaCBkb2N1bWVudGF0aW9uIGdlbmVyYXRpb24uPC9saT4NCis8bGk+SW1wcm92ZWQgd3NkbDJoIGFuZCBzb2FwY3BwMiBNSU1FIGJpbmRpbmdzLjwvbGk+DQorPGxpPkltcHJvdmVkIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24gaW4gZW5naW5lIHdpdGggbG9vay1hc2lkZSBidWZmZXJpbmcuPC9saT4NCis8bGk+Rml4ZWQgd3NkbDJoIHhzOmNvbXBsZXhDb250ZW50L2V4dGVuc2lvbi9hdHRyaWJ1dGVHcm91cCB0cmFuc2xhdGlvbi48L2xpPg0KKzxsaT5GaXhlZCB3c2RsMmggeHM6Y2hvaWNlIHdpdGggbWluL21heE9jY3VycyAhPSAxIHRyYW5zbGF0aW9uLjwvbGk+DQorPGxpPkZpeGVkIHdzZGwyaCBzb2FwOmJvZHkgcGFydHMgYXR0cmlidXRlLjwvbGk+DQorPC91bD4NCis8bGk+VmVyc2lvbiAyLjcuNSAoMDgvMDEvMjAwNSk8L2xpPg0KKzx1bD4NCis8bGk+QWRkZWQgeHM6cmVkZWZpbmUgc3VwcG9ydCB0byB3c2RsMmguPC9saT4NCis8bGk+QWRkZWQgSFRNTCBQT1NUIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBwbHVnaW4gaHR0cGZvcm0uYw0KKyhkZW1vIHNhbXBsZXMvd2Vic2VydmVyKS48L2xpPg0KKzxsaT5JbXByb3ZlZCB3c2RsMmggb3V0cHV0LjwvbGk+DQorPGxpPkZpeGVkIHdzZGwyaCBoYW5kbGluZyBvZiBkdXBsaWNhdGUgdmFsdWVzIGluIHNpbmdsZSBlbnVtIGxpc3QuPC9saT4NCis8L3VsPg0KKzxsaT5WZXJzaW9uIDIuNy42IHJldmlzaW9uIGEvYi9jL2QvZSAoMDgvMTkvMjAwNS0wMi8xOC8wNik8L2xpPg0KKzx1bD4NCis8bGk+QWRkZWQgV1MtU2VjdXJpdHkgYXV0aGVudGljYXRpb24sIHRva2VucywgYW5kIHNpZ25hdHVyZXMgd2l0aCBuZXcgJ3dzc2UnDQorcGx1Z2luLCBzZWUgZG9jdW1lbnRhdGlvbiBpbiAnZG9jJyBkaXJlY3RvcnkgYW5kICdzYW1wbGVzL3dzc2UnLjwvbGk+DQorPGxpPkFkZGVkICdkb2MnIGRpcmVjdG9yeSBmb3IgZG9jdW1lbnRhdGlvbiBhbmQgbW92ZWQgc29hcGRvYzIuaHRtbCBhbmQgc29hcGRvYzIucGRmLjwvbGk+DQorPGxpPkFkZGVkIFNPQVBfWE1MX0lOREVOVCBmbGFnLjwvbGk+DQorPGxpPkFkZGVkIHNvYXBfc2VuZGVyX2ZhdWx0X3N1YmNvZGUoKSBhbmQgc29hcF9yZWNlaXZlcl9mYXVsdF9zdWJjb2RlKCkgZm9yIFNPQVAgMS4yIHN1YmNvZGVzLjwvbGk+DQorPGxpPkFkZGVkIFdJVEhfRE9NIGNvbXBpbGUgZmxhZyB0byBlbmFibGUgZmx1c2hpbmcgc2VyaWFsaXplZCBhbmQgZGVzZXJpYWxpemVkDQorZGF0YSB0byBET00gKGFzIHdlbGwgYXMgYSBzdHJlYW0pLjwvbGk+DQorPGxpPkFkZGVkIHNvYXBjcHAyIG9wdGlvbiAtTC48L2xpPg0KKzxsaT5BZGRlZCBzb2FwY3BwMiBvcHRpb24gLWEuPC9saT4NCis8bGk+QWRkZWQgd3NkbDJoIG9wdGlvbiAtYSAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpLjwvbGk+DQorPGxpPkFkZGVkIHdzZGwyaCBvcHRpb24gLWQuPC9saT4NCis8bGk+QWRkZWQgV0lUSF9UQ1BGSU4gY29taWxlIGZsYWcgdG8gZW5hYmxlIG9wdGlvbmFsIHNodXRkb3duIHdpdGggaG93PTEgKFRDUEZJTikgYWZ0ZXIgZmluYWwgc2VuZHMgdG8gZm9yY2UgRU9GIG9uIG90aGVyIHNpZGUgKHVzZWQgdG8gYmUgdGhlIGRlZmF1bHQgYmVoYXZpb3IpLjwvbGk+DQorPGxpPkFkZGVkIHNjaGVtYSBzdWJzdGl0dXRpb25Hcm91cCBzdXBwb3J0LjwvbGk+DQorPGxpPkFkZGVkIHNvYXBfc3NsX2luaXQoKS48L2xpPg0KKzxsaT5JbXByb3ZlZCBET00gaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24uPC9saT4NCis8bGk+SW1wcm92ZWQgQVM0MDAgcG9ydGFiaWxpdHkuPC9saT4NCis8bGk+SW1wcm92ZWQgc2NoZW1hIGNob2ljZSBzdXBwb3J0LjwvbGk+DQorPGxpPkZpeGVkIHdzZGwyaCBtdWx0aXBsZSBzY2hlbWEgaW5jbHVkZSBpc3N1ZS48L2xpPg0KKzxsaT5GaXhlZCBzb2FwczJkYXRlVGltZSBhbmQgc29hcF90aW1lZ20gZnVuY3Rpb25zIHdoZW4gdGltZWdtIGlzIG5vdCBhdmFpbGFibGUuPC9saT4NCis8bGk+Rml4ZWQgZXhjLWMxNG4gZm9ybWF0dGluZy48L2xpPg0KKzxsaT5GaXhlZCBTT0FQIDEuMiBmYXVsdCBoYW5kbGluZy48L2xpPg0KKzxsaT5GaXhlZCBtaXNzaW5nIHNvYXBfZmxhZ19fX2l0ZW0yIGlzc3VlLjwvbGk+DQorPGxpPkZpeGVkIHBhcnRpYWwgTUlNRSBib3VuZGFyeSBwYXJzaW5nIGlzc3VlLjwvbGk+DQorPGxpPkZpeGVkIGJhc2U2NCBwYXJzaW5nIHdpdGggV0lUSF9GQVNULjwvbGk+DQorPGxpPkZpeGVkIE1JTUUgZW5jb2Rpbmcgb2YgXHJcciBzZXF1ZW5jZS48L2xpPg0KKzxsaT5GaXhlZCBRTmFtZSBub3JtYWxpemF0aW9uIGlzc3VlLjwvbGk+DQorPGxpPkZpeGVkIHJlbGF0aXZlIHBhdGggc2NoZW1hIGltcG9ydC48L2xpPg0KKzxsaT5GaXhlZCBNVE9NIGNpZCBtYXRjaGluZyB3aXRoIFVSTCBlbmNvZGVkIElEcy48L2xpPg0KKzxsaT5GaXhlZCB3aWRlLWNoYXJhY3RlciAod2NoYXJfdCopIFhNTCBhdHRyaWJ1dGUgaGFuZGxpbmcuPC9saT4NCis8bGk+Rml4ZWQgc3RkOjp2ZWN0b3IgZWxlbWVudCBpZC1yZWYgb3JkZXJpbmcgaW4gZGVzZXJpYWxpemVyLjwvbGk+DQorPC91bD4NCis8L3VsPg0KKw0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvY3VzdG9tL1JFQURNRS50eHQgYi9jdXN0b20vUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzEyZDg0Ci0tLSAvZGV2L251bGwKKysrIGIvY3VzdG9tL1JFQURNRS50eHQKQEAgLTAsMCArMSw4IEBACitUaGlzIGRpcmVjdG9yeSBjb250YWlucyBjdXN0b20gc2VyaWFsaXplcnMgZm9yIGNvbW1vbiBkYXRhIHR5cGVzLgorCitDdXN0b20gc2VyaWFsaXplcnMgcmVwbGFjZSB0aGUgc29hcGNwcDItZ2VuZXJhdGVkIHNlcmlhbGl6YXRpb24gcm91dGluZXMuCitTZWUgdGhlIG5vdGVzIGluIHRoZSBzb3VyY2UgZmlsZXMgb24gc3BlY2lmaWMgdXNhZ2UuCisKK1RoZSBmb2xsb3dpbmcgc2VyaWFsaXplcnMgYXJlIGF2YWlsYWJsZToKKworc3RydWN0X3RtLioJU2VyaWFsaXplcyA8dGltZS5oPiBzdHJ1Y3QgdG0KZGlmZiAtLWdpdCBhL2N1c3RvbS9zdHJ1Y3RfdG0uYyBiL2N1c3RvbS9zdHJ1Y3RfdG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWI5MmY5Ci0tLSAvZGV2L251bGwKKysrIGIvY3VzdG9tL3N0cnVjdF90bS5jCkBAIC0wLDAgKzEsMTM0IEBACisvKgorCitzdHJ1Y3RfdG0uYworCitDdXN0b20gc2VyaWFsaXplciBmb3IgPHRpbWUuaD4gc3RydWN0IHRtCisKK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgcGFydCBvZiB0aGUgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXM6CitHUEwsIHRoZSBnU09BUCBwdWJsaWMgbGljZW5zZSwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIHB1YmxpYyBsaWNlbnNlLgorCitUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBnU09BUCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMworKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCitMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK2h0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9zb2FwbGljZW5zZS5odG1sCitTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAorV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCitmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLgorQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSwgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisvLyBzb2FwSC5oIGdlbmVyYXRlZCBieSBzb2FwY3BwMiBmcm9tIC5oIGZpbGUgY29udGFpbmluZyAjaW1wb3J0ICJzdHJ1Y3RfdG0uaCI6CisjaW5jbHVkZSAic29hcEguaCIKKwordm9pZCBzb2FwX2RlZmF1bHRfeHNkX19kYXRlVGltZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHRtICphKQoreyBtZW1zZXQoYSwgMCwgc2l6ZW9mKHN0cnVjdCB0bSkpOworfQorCit2b2lkIHNvYXBfc2VyaWFsaXplX3hzZF9fZGF0ZVRpbWUoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCB0bSBjb25zdCAqYSkKK3sgfQorCitpbnQgc29hcF9vdXRfeHNkX19kYXRlVGltZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHN0cnVjdCB0bSAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sgaWYgKCFzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgYSwgU09BUF9UWVBFX3hzZF9fZGF0ZVRpbWUpLCB0eXBlKSkKKyAgeyBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVNaIiwgYSk7CisgICAgaWYgKHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwLT50bXBidWYsIDApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGVsc2UKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorCitzdHJ1Y3QgdG0gKnNvYXBfaW5feHNkX19kYXRlVGltZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzdHJ1Y3QgdG0gKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpkYXRlVGltZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisgIGEgPSAoc3RydWN0IHRtKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBhLCBTT0FQX1RZUEVfeHNkX19kYXRlVGltZSwgc2l6ZW9mKHN0cnVjdCB0bSksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgYSA9IChzdHJ1Y3QgdG0qKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBhLCBTT0FQX1RZUEVfeHNkX19kYXRlVGltZSwgMCwgc2l6ZW9mKHN0cnVjdCB0bSksIDAsIE5VTEwpOworICBlbHNlIGlmIChhKQorICB7IGNvbnN0IGNoYXIgKnMgPSBzb2FwX3ZhbHVlKHNvYXApOworICAgIG1lbXNldCgodm9pZCopYSwgMCwgc2l6ZW9mKHN0cnVjdCB0bSkpOworICAgIGlmIChzKQorICAgIHsgY2hhciB6b25lWzE2XTsKKyAgICAgIGNvbnN0IGNoYXIgKnQ7CisgICAgICB6b25lW3NpemVvZih6b25lKS0xXSA9ICdcMCc7CisgICAgICBpZiAoc3RyY2hyKHMsICctJykpCisgICAgICAgIHQgPSAiJWQtJWQtJWRUJWQ6JWQ6JWQlMTVzIjsKKyAgICAgIGVsc2UgaWYgKHN0cmNocihzLCAnOicpKQorICAgICAgICB0ID0gIiU0ZCUyZCUyZFQlZDolZDolZCUxNXMiOworICAgICAgZWxzZSAvKiBwYXJzZSBub24tWFNELXN0YW5kYXJkIGFsdGVybmF0aXZlIElTTyA4NjAxIGZvcm1hdCAqLworICAgICAgICB0ID0gIiU0ZCUyZCUyZFQlMmQlMmQlMmQlMTVzIjsKKyAgICAgIHNzY2FuZihzLCB0LCAmYS0+dG1feWVhciwgJmEtPnRtX21vbiwgJmEtPnRtX21kYXksICZhLT50bV9ob3VyLCAmYS0+dG1fbWluLCAmYS0+dG1fc2VjLCB6b25lKTsKKyAgICAgIGlmIChhLT50bV95ZWFyID09IDEpCisgICAgICAgIGEtPnRtX3llYXIgPSA3MDsKKyAgICAgIGVsc2UKKyAgICAgICAgYS0+dG1feWVhciAtPSAxOTAwOworICAgICAgYS0+dG1fbW9uLS07CisgICAgICBpZiAoKnpvbmUpCisgICAgICB7IGlmICgqem9uZSA9PSAnLicpCisgICAgICAgIHsgZm9yIChzID0gem9uZSArIDE7ICpzOyBzKyspCisgICAgICAgICAgICBpZiAoKnMgPCAnMCcgfHwgKnMgPiAnOScpCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzID0gem9uZTsKKyAgICAgICAgaWYgKCpzID09ICcrJyB8fCAqcyA9PSAnLScpCisgICAgICAgIHsgaW50IGggPSAwLCBtID0gMDsKKyAgICAgICAgICBpZiAoc1szXSA9PSAnOicpCisgICAgICAgICAgeyBzc2NhbmYocywgIiVkOiVkIiwgJmgsICZtKTsKKyAgICAgICAgICAgIGlmIChoIDwgMCkKKyAgICAgICAgICAgICAgbSA9IC1tOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeyBtID0gKGludClhdG9sKHMpOworICAgICAgICAgICAgaCA9IG0gLyAxMDA7CisgICAgICAgICAgICBtID0gbSAlIDEwMDsKKyAgICAgICAgICB9CisgICAgICAgICAgYS0+dG1faG91ciAtPSBoOworICAgICAgICAgIGEtPnRtX21pbiAtPSBtOworICAgICAgICB9CisgICAgICAgIGEtPnRtX2lzZHN0ID0gMDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgYS0+dG1faXNkc3QgPSAtMTsKKyAgICB9CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gYTsKK30KKworCmRpZmYgLS1naXQgYS9jdXN0b20vc3RydWN0X3RtLmggYi9jdXN0b20vc3RydWN0X3RtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q2NWU2OAotLS0gL2Rldi9udWxsCisrKyBiL2N1c3RvbS9zdHJ1Y3RfdG0uaApAQCAtMCwwICsxLDY3IEBACisvKgorCitzdHJ1Y3RfdG0uaAorCitDdXN0b20gc2VyaWFsaXplciBmb3IgPHRpbWUuaD4gc3RydWN0IHRtCisKKyNpbXBvcnQgdGhpcyBmaWxlIGludG8geW91ciBnU09BUCAuaCBmaWxlIHRvIGVuYWJsZSBzdHJ1Y3QgdG0gc2VyaWFsaXphdGlvbi4KKworVG8gc2VyaWFsaXplIHN0cnVjdCB0bSBkYXRhIGFzIGFuIHhzZDpkYXRlVGltZSBYU0QgdHlwZSwgdXNlIHRoZSB4c2RfX2RhdGVUaW1lCit0eXBlZGVmIGluIHlvdXIgZGVjbGFyYXRpb25zLiBMaW5rIHlvdXIgY29kZSB3aXRoIHN0cnVjdF90bS5jCisKK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgcGFydCBvZiB0aGUgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXM6CitHUEwsIHRoZSBnU09BUCBwdWJsaWMgbGljZW5zZSwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIHB1YmxpYyBsaWNlbnNlLgorCitUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBnU09BUCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMworKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCitMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK2h0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9zb2FwbGljZW5zZS5odG1sCitTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAorV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCitmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLgorQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSwgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaW5jbHVkZSA8dGltZS5oPgorCit2b2xhdGlsZSBzdHJ1Y3QgdG0KK3sJaW50CXRtX3NlYzsJCS8vIHNlY29uZHMgKDAgLSA2MCkKKwlpbnQJdG1fbWluOwkJLy8gbWludXRlcyAoMCAtIDU5KQorCWludAl0bV9ob3VyOwkvLyBob3VycyAoMCAtIDIzKQorCWludAl0bV9tZGF5OwkvLyBkYXkgb2YgbW9udGggKDEgLSAzMSkKKwlpbnQJdG1fbW9uOwkJLy8gbW9udGggb2YgeWVhciAoMCAtIDExKQorCWludAl0bV95ZWFyOwkvLyB5ZWFyIC0gMTkwMAorCWludAl0bV93ZGF5OwkvLyBkYXkgb2Ygd2VlayAoU3VuZGF5ID0gMCkKKwlpbnQJdG1feWRheTsJLy8gZGF5IG9mIHllYXIgKDAgLSAzNjUpCisJaW50CXRtX2lzZHN0OwkvLyBpcyBzdW1tZXIgdGltZSBpbiBlZmZlY3Q/CisJY2hhcioJdG1fem9uZTsJLy8gYWJicmV2aWF0aW9uIG9mIHRpbWV6b25lCit9OworCitleHRlcm4gdHlwZWRlZiBzdHJ1Y3QgdG0geHNkX19kYXRlVGltZTsKZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9hbm5vdGF0ZWQuaHRtbCBiL2RvYy9kb20vaHRtbC9hbm5vdGF0ZWQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWZkY2IxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL2Fubm90YXRlZC5odG1sCkBAIC0wLDAgKzEsMTggQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIGxldmVsLTIgRE9NOiBDbGFzcyBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4SEwiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPjwvZGl2Pg0KKzxoMT5nU09BUCBsZXZlbC0yIERPTSBDbGFzcyBMaXN0PC9oMT5IZXJlIGFyZSB0aGUgY2xhc3Nlcywgc3RydWN0cywgdW5pb25zIGFuZCBpbnRlcmZhY2VzIHdpdGggYnJpZWYgZGVzY3JpcHRpb25zOjx0YWJsZT4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwiPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+PC90ZD48L3RyPg0KKyAgPHRyPjx0ZCBjbGFzcz0iaW5kZXhrZXkiPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2F0dHJpYnV0ZV9faXRlcmF0b3IuaHRtbCI+c29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj48L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+PC90ZD48L3RyPg0KKyAgPHRyPjx0ZCBjbGFzcz0iaW5kZXhrZXkiPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2VsZW1lbnRfX2l0ZXJhdG9yLmh0bWwiPnNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3I8L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPjwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBTYXQgQXVnIDIwIDEyOjI0OjM2IDIwMDUgZm9yIGdTT0FQIGxldmVsLTIgRE9NIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvY2xhc3Nzb2FwX19kb21fX2F0dHJpYnV0ZV9faXRlcmF0b3ItbWVtYmVycy5odG1sIGIvZG9jL2RvbS9odG1sL2NsYXNzc29hcF9fZG9tX19hdHRyaWJ1dGVfX2l0ZXJhdG9yLW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjQ3OGVkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL2NsYXNzc29hcF9fZG9tX19hdHRyaWJ1dGVfX2l0ZXJhdG9yLW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDIzIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBsZXZlbC0yIERPTTogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPjwvZGl2Pg0KKzxoMT5zb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fYXR0cmlidXRlX19pdGVyYXRvci5odG1sIj5zb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2F0dHJpYnV0ZV9faXRlcmF0b3IuaHRtbCNvMCI+YXR0PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2F0dHJpYnV0ZV9faXRlcmF0b3IuaHRtbCI+c29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2F0dHJpYnV0ZV9faXRlcmF0b3IuaHRtbCNvMiI+bmFtZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19hdHRyaWJ1dGVfX2l0ZXJhdG9yLmh0bWwiPnNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19hdHRyaWJ1dGVfX2l0ZXJhdG9yLmh0bWwjbzEiPm5zdHI8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fYXR0cmlidXRlX19pdGVyYXRvci5odG1sIj5zb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fYXR0cmlidXRlX19pdGVyYXRvci5odG1sI2EyIj5vcGVyYXRvciAqPC9hPigpIGNvbnN0PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fYXR0cmlidXRlX19pdGVyYXRvci5odG1sIj5zb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fYXR0cmlidXRlX19pdGVyYXRvci5odG1sI2ExIj5vcGVyYXRvciE9PC9hPihjb25zdCBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IgJmFtcDspIGNvbnN0PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fYXR0cmlidXRlX19pdGVyYXRvci5odG1sIj5zb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fYXR0cmlidXRlX19pdGVyYXRvci5odG1sI2EzIj5vcGVyYXRvcisrPC9hPigpPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fYXR0cmlidXRlX19pdGVyYXRvci5odG1sIj5zb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fYXR0cmlidXRlX19pdGVyYXRvci5odG1sI2EwIj5vcGVyYXRvcj09PC9hPihjb25zdCBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IgJmFtcDspIGNvbnN0PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fYXR0cmlidXRlX19pdGVyYXRvci5odG1sIj5zb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fYXR0cmlidXRlX19pdGVyYXRvci5odG1sI2E0Ij5zb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I8L2E+KCk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19hdHRyaWJ1dGVfX2l0ZXJhdG9yLmh0bWwiPnNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19hdHRyaWJ1dGVfX2l0ZXJhdG9yLmh0bWwjYTUiPnNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjwvYT4oc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAqKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2F0dHJpYnV0ZV9faXRlcmF0b3IuaHRtbCI+c29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2F0dHJpYnV0ZV9faXRlcmF0b3IuaHRtbCNhNiI+fnNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjwvYT4oKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2F0dHJpYnV0ZV9faXRlcmF0b3IuaHRtbCI+c29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBTYXQgQXVnIDIwIDEyOjI0OjM2IDIwMDUgZm9yIGdTT0FQIGxldmVsLTIgRE9NIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvY2xhc3Nzb2FwX19kb21fX2F0dHJpYnV0ZV9faXRlcmF0b3IuaHRtbCBiL2RvYy9kb20vaHRtbC9jbGFzc3NvYXBfX2RvbV9fYXR0cmlidXRlX19pdGVyYXRvci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3OWU0YzIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvY2xhc3Nzb2FwX19kb21fX2F0dHJpYnV0ZV9faXRlcmF0b3IuaHRtbApAQCAtMCwwICsxLDMwOSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgbGV2ZWwtMiBET006IHNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvciBDbGFzcyBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPjwvZGl2Pg0KKzxoMT5zb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IgQ2xhc3MgUmVmZXJlbmNlPC9oMT48Y29kZT4jaW5jbHVkZSAmbHQ7c3Rkc29hcDIuaCZndDs8L2NvZGU+DQorPHA+DQorQ29sbGFib3JhdGlvbiBkaWFncmFtIGZvciBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I6PHA+PGNlbnRlcj48aW1nIHNyYz0iY2xhc3Nzb2FwX19kb21fX2F0dHJpYnV0ZV9faXRlcmF0b3JfX2NvbGxfX2dyYXBoLnBuZyIgYm9yZGVyPSIwIiB1c2VtYXA9IiNzb2FwX19kb21fX2F0dHJpYnV0ZV9faXRlcmF0b3JfX2NvbGxfX21hcCIgYWx0PSJDb2xsYWJvcmF0aW9uIGdyYXBoIj48L2NlbnRlcj4NCis8bWFwIG5hbWU9InNvYXBfX2RvbV9fYXR0cmlidXRlX19pdGVyYXRvcl9fY29sbF9fbWFwIj4NCis8YXJlYSBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sIiBzaGFwZT0icmVjdCIgY29vcmRzPSIzMiwxNywxNjAsNDQiIGFsdD0iIj4NCis8L21hcD4NCis8Y2VudGVyPjxmb250IHNpemU9IjIiPls8YSBocmVmPSJncmFwaF9sZWdlbmQuaHRtbCI+bGVnZW5kPC9hPl08L2ZvbnQ+PC9jZW50ZXI+PGEgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2F0dHJpYnV0ZV9faXRlcmF0b3ItbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIE1lbWJlciBGdW5jdGlvbnM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Ym9vbCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fYXR0cmlidXRlX19pdGVyYXRvci5odG1sI2EwIj5vcGVyYXRvcj09PC9hPiAoY29uc3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fYXR0cmlidXRlX19pdGVyYXRvci5odG1sIj5zb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I8L2E+ICZhbXA7KSBjb25zdDwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Ym9vbCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fYXR0cmlidXRlX19pdGVyYXRvci5odG1sI2ExIj5vcGVyYXRvciE9PC9hPiAoY29uc3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fYXR0cmlidXRlX19pdGVyYXRvci5odG1sIj5zb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I8L2E+ICZhbXA7KSBjb25zdDwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sIj5zb2FwX2RvbV9hdHRyaWJ1dGU8L2E+ICZhbXA7Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19hdHRyaWJ1dGVfX2l0ZXJhdG9yLmh0bWwjYTIiPm9wZXJhdG9yICo8L2E+ICgpIGNvbnN0PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19hdHRyaWJ1dGVfX2l0ZXJhdG9yLmh0bWwiPnNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjwvYT4gJmFtcDsmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2F0dHJpYnV0ZV9faXRlcmF0b3IuaHRtbCNhMyI+b3BlcmF0b3IrKzwvYT4gKCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fYXR0cmlidXRlX19pdGVyYXRvci5odG1sI2E0Ij5zb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I8L2E+ICgpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2F0dHJpYnV0ZV9faXRlcmF0b3IuaHRtbCNhNSI+c29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yPC9hPiAoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCI+c29hcF9kb21fYXR0cmlidXRlPC9hPiAqKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19hdHRyaWJ1dGVfX2l0ZXJhdG9yLmh0bWwjYTYiPn5zb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I8L2E+ICgpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sIj5zb2FwX2RvbV9hdHRyaWJ1dGU8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2F0dHJpYnV0ZV9faXRlcmF0b3IuaHRtbCNvMCI+YXR0PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19hdHRyaWJ1dGVfX2l0ZXJhdG9yLmh0bWwjbzEiPm5zdHI8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jb25zdCBjaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2F0dHJpYnV0ZV9faXRlcmF0b3IuaHRtbCNvMiI+bmFtZTwvYT48L3RkPjwvdHI+DQorDQorPC90YWJsZT4NCis8aHI+PGgyPkNvbnN0cnVjdG9yICZhbXA7IERlc3RydWN0b3IgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTQiIGRveHl0YWc9InNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjo6c29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjo6c29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNSIgZG94eXRhZz0ic29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yOjpzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yOjpzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sIj5zb2FwX2RvbV9hdHRyaWJ1dGU8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTYiIGRveHl0YWc9InNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjo6fnNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvciIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I6On48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19hdHRyaWJ1dGVfX2l0ZXJhdG9yLmh0bWwiPnNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjwvYT4gICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj48aDI+TWVtYmVyIEZ1bmN0aW9uIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEyIiBkb3h5dGFnPSJzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I6Om9wZXJhdG9yICoiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCI+c29hcF9kb21fYXR0cmlidXRlPC9hPiZhbXA7IHNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjo6b3BlcmF0b3IgKiAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPiBjb25zdDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTEiIGRveHl0YWc9InNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjo6b3BlcmF0b3IhPSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBib29sIHNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjo6b3BlcmF0b3IhPSAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPmNvbnN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2F0dHJpYnV0ZV9faXRlcmF0b3IuaHRtbCI+c29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yPC9hPiAmYW1wOyZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+IGNvbnN0PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMyIgZG94eXRhZz0ic29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yOjpvcGVyYXRvcisrIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2F0dHJpYnV0ZV9faXRlcmF0b3IuaHRtbCI+c29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yPC9hPiZhbXA7IHNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjo6b3BlcmF0b3IrKyAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTAiIGRveHl0YWc9InNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjo6b3BlcmF0b3I9PSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBib29sIHNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjo6b3BlcmF0b3I9PSAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPmNvbnN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2F0dHJpYnV0ZV9faXRlcmF0b3IuaHRtbCI+c29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yPC9hPiAmYW1wOyZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+IGNvbnN0PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I6OmF0dCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sIj5zb2FwX2RvbV9hdHRyaWJ1dGU8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19hdHRyaWJ1dGVfX2l0ZXJhdG9yLmh0bWwjbzAiPnNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjo6YXR0PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I6Om5hbWUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY29uc3QgY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fYXR0cmlidXRlX19pdGVyYXRvci5odG1sI28yIj5zb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I6Om5hbWU8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9InNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjo6bnN0ciIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjb25zdCBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19hdHRyaWJ1dGVfX2l0ZXJhdG9yLmh0bWwjbzEiPnNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjo6bnN0cjwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy9kb20vPGEgY2xhc3M9ImVsIiBocmVmPSJzdGRzb2FwMl84aC5odG1sIj5zdGRzb2FwMi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFNhdCBBdWcgMjAgMTI6MjQ6MzYgMjAwNSBmb3IgZ1NPQVAgbGV2ZWwtMiBET00gYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9jbGFzc3NvYXBfX2RvbV9fYXR0cmlidXRlX19pdGVyYXRvcl9fY29sbF9fZ3JhcGgubWFwIGIvZG9jL2RvbS9odG1sL2NsYXNzc29hcF9fZG9tX19hdHRyaWJ1dGVfX2l0ZXJhdG9yX19jb2xsX19ncmFwaC5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M2MGYzMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9jbGFzc3NvYXBfX2RvbV9fYXR0cmlidXRlX19pdGVyYXRvcl9fY29sbF9fZ3JhcGgubWFwCkBAIC0wLDAgKzEsMiBAQAorYmFzZSByZWZlcmVyCityZWN0ICRzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sIDMyLDE3IDE2MCw0NApkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL2NsYXNzc29hcF9fZG9tX19hdHRyaWJ1dGVfX2l0ZXJhdG9yX19jb2xsX19ncmFwaC5tZDUgYi9kb2MvZG9tL2h0bWwvY2xhc3Nzb2FwX19kb21fX2F0dHJpYnV0ZV9faXRlcmF0b3JfX2NvbGxfX2dyYXBoLm1kNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWQyOTZjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL2NsYXNzc29hcF9fZG9tX19hdHRyaWJ1dGVfX2l0ZXJhdG9yX19jb2xsX19ncmFwaC5tZDUKQEAgLTAsMCArMSBAQAorMDRjN2JjNzNjYTgwZjA0MmE4NmRiZmRiNjRhOWZjZTcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvY2xhc3Nzb2FwX19kb21fX2F0dHJpYnV0ZV9faXRlcmF0b3JfX2NvbGxfX2dyYXBoLnBuZyBiL2RvYy9kb20vaHRtbC9jbGFzc3NvYXBfX2RvbV9fYXR0cmlidXRlX19pdGVyYXRvcl9fY29sbF9fZ3JhcGgucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5N2E5MTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvY2xhc3Nzb2FwX19kb21fX2F0dHJpYnV0ZV9faXRlcmF0b3JfX2NvbGxfX2dyYXBoLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvY2xhc3Nzb2FwX19kb21fX2VsZW1lbnRfX2l0ZXJhdG9yLW1lbWJlcnMuaHRtbCBiL2RvYy9kb20vaHRtbC9jbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3ItbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZTczNWIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvY2xhc3Nzb2FwX19kb21fX2VsZW1lbnRfX2l0ZXJhdG9yLW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDI0IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBsZXZlbC0yIERPTTogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPjwvZGl2Pg0KKzxoMT5zb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yIE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2VsZW1lbnRfX2l0ZXJhdG9yLmh0bWwiPnNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3I8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2VsZW1lbnRfX2l0ZXJhdG9yLmh0bWwjbzAiPmVsdDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sIj5zb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2VsZW1lbnRfX2l0ZXJhdG9yLmh0bWwjbzIiPm5hbWU8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3IuaHRtbCI+c29hcF9kb21fZWxlbWVudF9pdGVyYXRvcjwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sI28xIj5uc3RyPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2VsZW1lbnRfX2l0ZXJhdG9yLmh0bWwiPnNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3I8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3IuaHRtbCNhMiI+b3BlcmF0b3IgKjwvYT4oKSBjb25zdDwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2VsZW1lbnRfX2l0ZXJhdG9yLmh0bWwiPnNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3I8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3IuaHRtbCNhMSI+b3BlcmF0b3IhPTwvYT4oY29uc3Qgc29hcF9kb21fZWxlbWVudF9pdGVyYXRvciAmYW1wOykgY29uc3Q8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sIj5zb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2VsZW1lbnRfX2l0ZXJhdG9yLmh0bWwjYTMiPm9wZXJhdG9yKys8L2E+KCk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sIj5zb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2VsZW1lbnRfX2l0ZXJhdG9yLmh0bWwjYTAiPm9wZXJhdG9yPT08L2E+KGNvbnN0IHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IgJmFtcDspIGNvbnN0PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3IuaHRtbCI+c29hcF9kb21fZWxlbWVudF9pdGVyYXRvcjwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sI2E0Ij5zb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yPC9hPigpPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3IuaHRtbCI+c29hcF9kb21fZWxlbWVudF9pdGVyYXRvcjwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sI2E1Ij5zb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yPC9hPihzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2VsZW1lbnRfX2l0ZXJhdG9yLmh0bWwiPnNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3I8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3IuaHRtbCNvMyI+dHlwZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sIj5zb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2VsZW1lbnRfX2l0ZXJhdG9yLmh0bWwjYTYiPn5zb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yPC9hPigpPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3IuaHRtbCI+c29hcF9kb21fZWxlbWVudF9pdGVyYXRvcjwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gU2F0IEF1ZyAyMCAxMjoyNDozNiAyMDA1IGZvciBnU09BUCBsZXZlbC0yIERPTSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL2NsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sIGIvZG9jL2RvbS9odG1sL2NsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1N2ZkYTEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvY2xhc3Nzb2FwX19kb21fX2VsZW1lbnRfX2l0ZXJhdG9yLmh0bWwKQEAgLTAsMCArMSwzMzUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIGxldmVsLTIgRE9NOiBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+PC9kaXY+DQorPGgxPnNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IgQ2xhc3MgUmVmZXJlbmNlPC9oMT48Y29kZT4jaW5jbHVkZSAmbHQ7c3Rkc29hcDIuaCZndDs8L2NvZGU+DQorPHA+DQorQ29sbGFib3JhdGlvbiBkaWFncmFtIGZvciBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yOjxwPjxjZW50ZXI+PGltZyBzcmM9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvcl9fY29sbF9fZ3JhcGgucG5nIiBib3JkZXI9IjAiIHVzZW1hcD0iI3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3JfX2NvbGxfX21hcCIgYWx0PSJDb2xsYWJvcmF0aW9uIGdyYXBoIj48L2NlbnRlcj4NCis8bWFwIG5hbWU9InNvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3JfX2NvbGxfX21hcCI+DQorPGFyZWEgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiIHNoYXBlPSJyZWN0IiBjb29yZHM9IjMxLDExOSwxNjEsMTQ1IiBhbHQ9IiI+DQorPGFyZWEgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCIgc2hhcGU9InJlY3QiIGNvb3Jkcz0iMzIsMTcsMTYwLDQ0IiBhbHQ9IiI+DQorPC9tYXA+DQorPGNlbnRlcj48Zm9udCBzaXplPSIyIj5bPGEgaHJlZj0iZ3JhcGhfbGVnZW5kLmh0bWwiPmxlZ2VuZDwvYT5dPC9mb250PjwvY2VudGVyPjxhIGhyZWY9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgTWVtYmVyIEZ1bmN0aW9uczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5ib29sJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sI2EwIj5vcGVyYXRvcj09PC9hPiAoY29uc3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3IuaHRtbCI+c29hcF9kb21fZWxlbWVudF9pdGVyYXRvcjwvYT4gJmFtcDspIGNvbnN0PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5ib29sJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sI2ExIj5vcGVyYXRvciE9PC9hPiAoY29uc3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3IuaHRtbCI+c29hcF9kb21fZWxlbWVudF9pdGVyYXRvcjwvYT4gJmFtcDspIGNvbnN0PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiAmYW1wOyZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3IuaHRtbCNhMiI+b3BlcmF0b3IgKjwvYT4gKCkgY29uc3Q8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2VsZW1lbnRfX2l0ZXJhdG9yLmh0bWwiPnNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3I8L2E+ICZhbXA7Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sI2EzIj5vcGVyYXRvcisrPC9hPiAoKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sI2E0Ij5zb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yPC9hPiAoKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sI2E1Ij5zb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yPC9hPiAoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+ICopPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2VsZW1lbnRfX2l0ZXJhdG9yLmh0bWwjYTYiPn5zb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yPC9hPiAoKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2VsZW1lbnRfX2l0ZXJhdG9yLmh0bWwjbzAiPmVsdDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3IuaHRtbCNvMSI+bnN0cjwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3IuaHRtbCNvMiI+bmFtZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3IuaHRtbCNvMyI+dHlwZTwvYT48L3RkPjwvdHI+DQorDQorPC90YWJsZT4NCis8aHI+PGgyPkNvbnN0cnVjdG9yICZhbXA7IERlc3RydWN0b3IgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTQiIGRveHl0YWc9InNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3I6OnNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc29hcF9kb21fZWxlbWVudF9pdGVyYXRvcjo6c29hcF9kb21fZWxlbWVudF9pdGVyYXRvciAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTUiIGRveHl0YWc9InNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3I6OnNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc29hcF9kb21fZWxlbWVudF9pdGVyYXRvcjo6c29hcF9kb21fZWxlbWVudF9pdGVyYXRvciAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE2IiBkb3h5dGFnPSJzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yOjp+c29hcF9kb21fZWxlbWVudF9pdGVyYXRvciIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yOjp+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3IuaHRtbCI+c29hcF9kb21fZWxlbWVudF9pdGVyYXRvcjwvYT4gICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj48aDI+TWVtYmVyIEZ1bmN0aW9uIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEyIiBkb3h5dGFnPSJzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yOjpvcGVyYXRvciAqIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiZhbXA7IHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3I6Om9wZXJhdG9yICogICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD4gY29uc3Q8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExIiBkb3h5dGFnPSJzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yOjpvcGVyYXRvciE9IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGJvb2wgc29hcF9kb21fZWxlbWVudF9pdGVyYXRvcjo6b3BlcmF0b3IhPSAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPmNvbnN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2VsZW1lbnRfX2l0ZXJhdG9yLmh0bWwiPnNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3I8L2E+ICZhbXA7Jm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD4gY29uc3Q8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEzIiBkb3h5dGFnPSJzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yOjpvcGVyYXRvcisrIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2VsZW1lbnRfX2l0ZXJhdG9yLmh0bWwiPnNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3I8L2E+JmFtcDsgc29hcF9kb21fZWxlbWVudF9pdGVyYXRvcjo6b3BlcmF0b3IrKyAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTAiIGRveHl0YWc9InNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3I6Om9wZXJhdG9yPT0iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gYm9vbCBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yOjpvcGVyYXRvcj09ICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+Y29uc3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3IuaHRtbCI+c29hcF9kb21fZWxlbWVudF9pdGVyYXRvcjwvYT4gJmFtcDsmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPiBjb25zdDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0ic29hcF9kb21fZWxlbWVudF9pdGVyYXRvcjo6ZWx0IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3IuaHRtbCNvMCI+c29hcF9kb21fZWxlbWVudF9pdGVyYXRvcjo6ZWx0PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yOjpuYW1lIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNvbnN0IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2VsZW1lbnRfX2l0ZXJhdG9yLmh0bWwjbzIiPnNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3I6Om5hbWU8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9InNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3I6Om5zdHIiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY29uc3QgY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3IuaHRtbCNvMSI+c29hcF9kb21fZWxlbWVudF9pdGVyYXRvcjo6bnN0cjwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMyIgZG94eXRhZz0ic29hcF9kb21fZWxlbWVudF9pdGVyYXRvcjo6dHlwZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3IuaHRtbCNvMyI+c29hcF9kb21fZWxlbWVudF9pdGVyYXRvcjo6dHlwZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy9kb20vPGEgY2xhc3M9ImVsIiBocmVmPSJzdGRzb2FwMl84aC5odG1sIj5zdGRzb2FwMi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFNhdCBBdWcgMjAgMTI6MjQ6MzYgMjAwNSBmb3IgZ1NPQVAgbGV2ZWwtMiBET00gYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9jbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3JfX2NvbGxfX2dyYXBoLm1hcCBiL2RvYy9kb20vaHRtbC9jbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3JfX2NvbGxfX2dyYXBoLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTQxYTc4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL2NsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvcl9fY29sbF9fZ3JhcGgubWFwCkBAIC0wLDAgKzEsMyBAQAorYmFzZSByZWZlcmVyCityZWN0ICRzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCAzMSwxMTkgMTYxLDE0NQorcmVjdCAkc3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCAzMiwxNyAxNjAsNDQKZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9jbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3JfX2NvbGxfX2dyYXBoLm1kNSBiL2RvYy9kb20vaHRtbC9jbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3JfX2NvbGxfX2dyYXBoLm1kNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTY4YWE4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL2NsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvcl9fY29sbF9fZ3JhcGgubWQ1CkBAIC0wLDAgKzEgQEAKKzk4M2FiNDU1NzgwMDRhN2Q4NmJkOWE0NTFiZmI1ZTg2ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL2NsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvcl9fY29sbF9fZ3JhcGgucG5nIGIvZG9jL2RvbS9odG1sL2NsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvcl9fY29sbF9fZ3JhcGgucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZjYzOGEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvY2xhc3Nzb2FwX19kb21fX2VsZW1lbnRfX2l0ZXJhdG9yX19jb2xsX19ncmFwaC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL2NsYXNzc29hcF9fZG9tX19pdGVyYXRvci1tZW1iZXJzLmh0bWwgYi9kb2MvZG9tL2h0bWwvY2xhc3Nzb2FwX19kb21fX2l0ZXJhdG9yLW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjcwMWFlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL2NsYXNzc29hcF9fZG9tX19pdGVyYXRvci1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwyNCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgbGV2ZWwtMiBET006IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT48L2Rpdj4NCis8aDE+c29hcF9kb21faXRlcmF0b3IgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9faXRlcmF0b3IuaHRtbCI+c29hcF9kb21faXRlcmF0b3I8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2l0ZXJhdG9yLmh0bWwjbzAiPmVsdDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19pdGVyYXRvci5odG1sIj5zb2FwX2RvbV9pdGVyYXRvcjwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19pdGVyYXRvci5odG1sI28yIj5uYW1lPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2l0ZXJhdG9yLmh0bWwiPnNvYXBfZG9tX2l0ZXJhdG9yPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2l0ZXJhdG9yLmh0bWwjbzEiPm5zdHI8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9faXRlcmF0b3IuaHRtbCI+c29hcF9kb21faXRlcmF0b3I8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9faXRlcmF0b3IuaHRtbCNhMiI+b3BlcmF0b3IgKjwvYT4oKSBjb25zdDwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2l0ZXJhdG9yLmh0bWwiPnNvYXBfZG9tX2l0ZXJhdG9yPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2l0ZXJhdG9yLmh0bWwjYTEiPm9wZXJhdG9yIT08L2E+KGNvbnN0IHNvYXBfZG9tX2l0ZXJhdG9yICZhbXA7KSBjb25zdDwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2l0ZXJhdG9yLmh0bWwiPnNvYXBfZG9tX2l0ZXJhdG9yPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2l0ZXJhdG9yLmh0bWwjYTMiPm9wZXJhdG9yKys8L2E+KCk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19pdGVyYXRvci5odG1sIj5zb2FwX2RvbV9pdGVyYXRvcjwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19pdGVyYXRvci5odG1sI2EwIj5vcGVyYXRvcj09PC9hPihjb25zdCBzb2FwX2RvbV9pdGVyYXRvciAmYW1wOykgY29uc3Q8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19pdGVyYXRvci5odG1sIj5zb2FwX2RvbV9pdGVyYXRvcjwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19pdGVyYXRvci5odG1sI2E0Ij5zb2FwX2RvbV9pdGVyYXRvcjwvYT4oKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2l0ZXJhdG9yLmh0bWwiPnNvYXBfZG9tX2l0ZXJhdG9yPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2l0ZXJhdG9yLmh0bWwjYTUiPnNvYXBfZG9tX2l0ZXJhdG9yPC9hPihzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2l0ZXJhdG9yLmh0bWwiPnNvYXBfZG9tX2l0ZXJhdG9yPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2l0ZXJhdG9yLmh0bWwjbzMiPnR5cGU8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9faXRlcmF0b3IuaHRtbCI+c29hcF9kb21faXRlcmF0b3I8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9faXRlcmF0b3IuaHRtbCNhNiI+fnNvYXBfZG9tX2l0ZXJhdG9yPC9hPigpPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9faXRlcmF0b3IuaHRtbCI+c29hcF9kb21faXRlcmF0b3I8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMjM6MTA6MjMgMjAwNSBmb3IgZ1NPQVAgbGV2ZWwtMiBET00gYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9jbGFzc3NvYXBfX2RvbV9faXRlcmF0b3IuaHRtbCBiL2RvYy9kb20vaHRtbC9jbGFzc3NvYXBfX2RvbV9faXRlcmF0b3IuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjVkNzMxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL2NsYXNzc29hcF9fZG9tX19pdGVyYXRvci5odG1sCkBAIC0wLDAgKzEsMzM1IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBsZXZlbC0yIERPTTogc29hcF9kb21faXRlcmF0b3IgQ2xhc3MgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT48L2Rpdj4NCis8aDE+c29hcF9kb21faXRlcmF0b3IgQ2xhc3MgUmVmZXJlbmNlPC9oMT48Y29kZT4jaW5jbHVkZSAmbHQ7c3Rkc29hcDIuaCZndDs8L2NvZGU+DQorPHA+DQorQ29sbGFib3JhdGlvbiBkaWFncmFtIGZvciBzb2FwX2RvbV9pdGVyYXRvcjo8cD48Y2VudGVyPjxpbWcgc3JjPSJjbGFzc3NvYXBfX2RvbV9faXRlcmF0b3JfX2NvbGxfX2dyYXBoLnBuZyIgYm9yZGVyPSIwIiB1c2VtYXA9IiNzb2FwX19kb21fX2l0ZXJhdG9yX19jb2xsX19tYXAiIGFsdD0iQ29sbGFib3JhdGlvbiBncmFwaCI+PC9jZW50ZXI+DQorPG1hcCBuYW1lPSJzb2FwX19kb21fX2l0ZXJhdG9yX19jb2xsX19tYXAiPg0KKzxhcmVhIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIiBzaGFwZT0icmVjdCIgY29vcmRzPSI3LDExOSwxMzcsMTQ1IiBhbHQ9IiI+DQorPGFyZWEgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCIgc2hhcGU9InJlY3QiIGNvb3Jkcz0iOCwxNywxMzYsNDQiIGFsdD0iIj4NCis8L21hcD4NCis8Y2VudGVyPjxmb250IHNpemU9IjIiPls8YSBocmVmPSJncmFwaF9sZWdlbmQuaHRtbCI+bGVnZW5kPC9hPl08L2ZvbnQ+PC9jZW50ZXI+PGEgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2l0ZXJhdG9yLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBNZW1iZXIgRnVuY3Rpb25zPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmJvb2wmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2l0ZXJhdG9yLmh0bWwjYTAiPm9wZXJhdG9yPT08L2E+IChjb25zdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19pdGVyYXRvci5odG1sIj5zb2FwX2RvbV9pdGVyYXRvcjwvYT4gJmFtcDspIGNvbnN0PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5ib29sJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19pdGVyYXRvci5odG1sI2ExIj5vcGVyYXRvciE9PC9hPiAoY29uc3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9faXRlcmF0b3IuaHRtbCI+c29hcF9kb21faXRlcmF0b3I8L2E+ICZhbXA7KSBjb25zdDwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT4gJmFtcDsmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2l0ZXJhdG9yLmh0bWwjYTIiPm9wZXJhdG9yICo8L2E+ICgpIGNvbnN0PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19pdGVyYXRvci5odG1sIj5zb2FwX2RvbV9pdGVyYXRvcjwvYT4gJmFtcDsmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2l0ZXJhdG9yLmh0bWwjYTMiPm9wZXJhdG9yKys8L2E+ICgpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2l0ZXJhdG9yLmh0bWwjYTQiPnNvYXBfZG9tX2l0ZXJhdG9yPC9hPiAoKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19pdGVyYXRvci5odG1sI2E1Ij5zb2FwX2RvbV9pdGVyYXRvcjwvYT4gKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiAqKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19pdGVyYXRvci5odG1sI2E2Ij5+c29hcF9kb21faXRlcmF0b3I8L2E+ICgpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9faXRlcmF0b3IuaHRtbCNvMCI+ZWx0PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19pdGVyYXRvci5odG1sI28xIj5uc3RyPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19pdGVyYXRvci5odG1sI28yIj5uYW1lPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19pdGVyYXRvci5odG1sI28zIj50eXBlPC9hPjwvdGQ+PC90cj4NCisNCis8L3RhYmxlPg0KKzxocj48aDI+Q29uc3RydWN0b3IgJmFtcDsgRGVzdHJ1Y3RvciBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNCIgZG94eXRhZz0ic29hcF9kb21faXRlcmF0b3I6OnNvYXBfZG9tX2l0ZXJhdG9yIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHNvYXBfZG9tX2l0ZXJhdG9yOjpzb2FwX2RvbV9pdGVyYXRvciAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTUiIGRveHl0YWc9InNvYXBfZG9tX2l0ZXJhdG9yOjpzb2FwX2RvbV9pdGVyYXRvciIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzb2FwX2RvbV9pdGVyYXRvcjo6c29hcF9kb21faXRlcmF0b3IgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNiIgZG94eXRhZz0ic29hcF9kb21faXRlcmF0b3I6On5zb2FwX2RvbV9pdGVyYXRvciIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzb2FwX2RvbV9pdGVyYXRvcjo6fjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2l0ZXJhdG9yLmh0bWwiPnNvYXBfZG9tX2l0ZXJhdG9yPC9hPiAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPjxoMj5NZW1iZXIgRnVuY3Rpb24gRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTIiIGRveHl0YWc9InNvYXBfZG9tX2l0ZXJhdG9yOjpvcGVyYXRvciAqIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiZhbXA7IHNvYXBfZG9tX2l0ZXJhdG9yOjpvcGVyYXRvciAqICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+IGNvbnN0PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMSIgZG94eXRhZz0ic29hcF9kb21faXRlcmF0b3I6Om9wZXJhdG9yIT0iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gYm9vbCBzb2FwX2RvbV9pdGVyYXRvcjo6b3BlcmF0b3IhPSAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPmNvbnN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2l0ZXJhdG9yLmh0bWwiPnNvYXBfZG9tX2l0ZXJhdG9yPC9hPiAmYW1wOyZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+IGNvbnN0PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMyIgZG94eXRhZz0ic29hcF9kb21faXRlcmF0b3I6Om9wZXJhdG9yKysiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9faXRlcmF0b3IuaHRtbCI+c29hcF9kb21faXRlcmF0b3I8L2E+JmFtcDsgc29hcF9kb21faXRlcmF0b3I6Om9wZXJhdG9yKysgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEwIiBkb3h5dGFnPSJzb2FwX2RvbV9pdGVyYXRvcjo6b3BlcmF0b3I9PSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBib29sIHNvYXBfZG9tX2l0ZXJhdG9yOjpvcGVyYXRvcj09ICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+Y29uc3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9faXRlcmF0b3IuaHRtbCI+c29hcF9kb21faXRlcmF0b3I8L2E+ICZhbXA7Jm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD4gY29uc3Q8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InNvYXBfZG9tX2l0ZXJhdG9yOjplbHQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19pdGVyYXRvci5odG1sI28wIj5zb2FwX2RvbV9pdGVyYXRvcjo6ZWx0PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJzb2FwX2RvbV9pdGVyYXRvcjo6bmFtZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjb25zdCBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19pdGVyYXRvci5odG1sI28yIj5zb2FwX2RvbV9pdGVyYXRvcjo6bmFtZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0ic29hcF9kb21faXRlcmF0b3I6Om5zdHIiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY29uc3QgY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9faXRlcmF0b3IuaHRtbCNvMSI+c29hcF9kb21faXRlcmF0b3I6Om5zdHI8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzMiIGRveHl0YWc9InNvYXBfZG9tX2l0ZXJhdG9yOjp0eXBlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19pdGVyYXRvci5odG1sI28zIj5zb2FwX2RvbV9pdGVyYXRvcjo6dHlwZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy9kb20vPGEgY2xhc3M9ImVsIiBocmVmPSJzdGRzb2FwMl84aC5odG1sIj5zdGRzb2FwMi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMjM6MTA6MjMgMjAwNSBmb3IgZ1NPQVAgbGV2ZWwtMiBET00gYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9jbGFzc3NvYXBfX2RvbV9faXRlcmF0b3JfX2NvbGxfX2dyYXBoLm1hcCBiL2RvYy9kb20vaHRtbC9jbGFzc3NvYXBfX2RvbV9faXRlcmF0b3JfX2NvbGxfX2dyYXBoLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjdhOTE3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL2NsYXNzc29hcF9fZG9tX19pdGVyYXRvcl9fY29sbF9fZ3JhcGgubWFwCkBAIC0wLDAgKzEsMyBAQAorYmFzZSByZWZlcmVyCityZWN0ICRzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCA3LDExOSAxMzcsMTQ1CityZWN0ICRzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sIDgsMTcgMTM2LDQ0CmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvY2xhc3Nzb2FwX19kb21fX2l0ZXJhdG9yX19jb2xsX19ncmFwaC5tZDUgYi9kb2MvZG9tL2h0bWwvY2xhc3Nzb2FwX19kb21fX2l0ZXJhdG9yX19jb2xsX19ncmFwaC5tZDUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmZWQ1NwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9jbGFzc3NvYXBfX2RvbV9faXRlcmF0b3JfX2NvbGxfX2dyYXBoLm1kNQpAQCAtMCwwICsxIEBACitmMzg5YmE4ODM0ZjgzMTBhYzkzNWYxNGQyYTJhMDE1YQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9jbGFzc3NvYXBfX2RvbV9faXRlcmF0b3JfX2NvbGxfX2dyYXBoLnBuZyBiL2RvYy9kb20vaHRtbC9jbGFzc3NvYXBfX2RvbV9faXRlcmF0b3JfX2NvbGxfX2dyYXBoLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjM5ODFmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL2NsYXNzc29hcF9fZG9tX19pdGVyYXRvcl9fY29sbF9fZ3JhcGgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9kb20uaHRtbCBiL2RvYy9kb20vaHRtbC9kb20uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzA5NTNmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL2RvbS5odG1sCkBAIC0wLDAgKzEsMTE0IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBsZXZlbC0yIERPTTogVGhlIGdTT0FQIGxldmVsLTIgRE9NIHBhcnNlcjwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KK1RoZSBnU09BUCBsZXZlbC0yIERPTSBwYXJzZXIgZmVhdHVyZXMgInNtYXJ0IiBYTUwgbmFtZXNwYWNlIGhhbmRsaW5nIGFuZCBjYW4gYmUgdXNlZCB0byBtaXggZ1NPQVAgWE1MIHNlcmlhbGl6ZXJzIHdpdGggcGxhaW4gWE1MIHBhcnNpbmcuIFRoZSBET00gcGFyc2VyIGlzIGFsc28gYW4gZXNzZW50aWFsIGNvbXBvbmVudCBvZiB0aGUgd3NzZSBwbHVnaW4gdG8gdmVyaWZ5IGRpZ2l0YWwgc2lnbmF0dXJlcy48cD4NCitUaGUgRE9NIHBhcnNlciBpcyBub3QgYSBzdGFuZC1hbG9uZSBhcHBsaWNhdGlvbi4gVGhlIERPTSBwYXJzZXIgaW52b2tlcyB0aGUgU09BUCBlbmdpbmUgdG8gcG9wdWxhdGUgYSBub2RlIHNldCBhbmQgdG8gcmVuZGVyIGEgbm9kZSBzZXQgaW4gWE1MLjxoMj48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJkb21fMSI+DQorVXNpbmcgRE9NIE5vZGUgU2V0cyBpbiBhIGdTT0FQIEhlYWRlciBGaWxlPC9hPjwvaDI+DQorVG8gdXNlIHRoZSBET00gbm9kZSBzZXQgaW4gYSBkYXRhIHN0cnVjdHVyZSBkZWZpbmVkIGluIGEgZ1NPQVAgaGVhZGVyIGZpbGUsIGltcG9ydCB0aGUgPGEgY2xhc3M9ImVsIiBocmVmPSJkb21fOGguaHRtbCI+ZG9tLmg8L2E+IGZpbGUgaW50byB0aGUgaGVhZGVyIGZpbGU6PHA+DQorPGRpdiBjbGFzcz0iZnJhZ21lbnQiPjxwcmU+PHNwYW4gY2xhc3M9InByZXByb2Nlc3NvciI+ICAgICNpbXBvcnQgIjxhIGNsYXNzPSJjb2RlIiBocmVmPSJkb21fOGguaHRtbCI+ZG9tLmg8L2E+Ijwvc3Bhbj4NCis8L3ByZT48L2Rpdj48cD4NCitCeSBpbXBvcnRpbmcgPGEgY2xhc3M9ImVsIiBocmVmPSJkb21fOGguaHRtbCI+ZG9tLmg8L2E+IGEgc3BlY2lhbCBkYXRhIHR5cGUgPGEgY2xhc3M9ImVsIiBocmVmPSJkb21fOGguaHRtbCNhMCI+eHNkX19hbnlUeXBlPC9hPiBpcyBhdmFpbGFibGUgdGhhdCByZXByZXNlbnRzIGEgaGllcmFyY2hpY2FsIERPTSBub2RlIHNldC4gRE9NIG5vZGVzIGNhbiBiZSB1c2VkIHdpdGggc3RydWN0cywgY2xhc3NlcywgU1RMIGNvbnRhaW5lcnMsIGFuZCBhcyBhcmd1bWVudHMgb2Ygc2VydmljZSBvcGVyYXRpb25zIGluIHlvdXIgZ1NPQVAgaGVhZGVyIGZpbGUgZGVjbGFyYXRpb25zLiBGb3IgZXhhbXBsZTo8cD4NCis8ZGl2IGNsYXNzPSJmcmFnbWVudCI+PHByZT48c3BhbiBjbGFzcz0icHJlcHJvY2Vzc29yIj4gICAgI2ltcG9ydCAiPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImRvbV84aC5odG1sIj5kb20uaDwvYT4iPC9zcGFuPg0KKzxzcGFuIGNsYXNzPSJwcmVwcm9jZXNzb3IiPiAgICAjaW1wb3J0ICJ3c3UuaCI8L3NwYW4+DQorICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5jbGFzcyA8L3NwYW4+bnNfX215UHJvZHVjdA0KKyAgICB7IDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5wdWJsaWM8L3NwYW4+Og0KKyAgICAgICAgQDxzcGFuIGNsYXNzPSJrZXl3b3JkdHlwZSI+Y2hhcjwvc3Bhbj4qICAgICAgICAgIHdzdV9fSWQ7DQorICAgICAgICBfd3N1X19UaW1lc3RhbXAgd3N1X19UaW1lc3RhbXA7DQorICAgICAgICA8c3BhbiBjbGFzcz0ia2V5d29yZHR5cGUiPmNoYXI8L3NwYW4+KiAgICAgICAgICAgbmFtZTsNCisgICAgICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkdHlwZSI+aW50PC9zcGFuPiAgICAgICAgICAgICBTS1U7DQorICAgICAgICA8c3BhbiBjbGFzcz0ia2V5d29yZHR5cGUiPmRvdWJsZTwvc3Bhbj4gICAgICAgICAgcHJpY2U7DQorICAgICAgICA8YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnhzZF9fYW55VHlwZTwvYT4qICAgYW55Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5zX19teVByb2R1Y3QoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB+bnNfX215UHJvZHVjdCgpOw0KKyAgICB9Ow0KKzwvcHJlPjwvZGl2PjxwPg0KK0l0IGlzIGltcG9ydGFudCB0aGF0IHdlIGFkZCA8YSBjbGFzcz0iZWwiIGhyZWY9ImRvbV84aC5odG1sI2EwIj54c2RfX2FueVR5cGU8L2E+IGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdCBvciBjbGFzcywgc2luY2UgaXQgY29uc3VtZXMgYW55IFhNTCBlbGVtZW50ICh0aGUgZmllbGQgbmFtZSwgJ2FueScgaW4gdGhpcyBjYXNlLCBpcyBpcnJlbGF2YW50KS4gVGh1cywgdGhlIG90aGVyIGZpZWxkcyBtdXN0IGJlIGRlZmluZWQgZmlyc3QgdG8gZW5zdXJlIHRoZXkgYXJlIHBvcHVsYXRlZCBmaXJzdCBiZWZvcmUgdGhlIERPTSBub2RlIHNldCBpcyBwb3B1bGF0ZWQgd2l0aCBhbnkgbm9uLXByZXZpb3VzbHkgbWF0Y2hlZCBYTUwgZWxlbWVudC48cD4NCitOb3RlIHRoYXQgd2UgYWxzbyBpbXBvcnRlZCB3c3UuaCB0byB1c2UgdGhlIHdzdTpJZCBhdHRyaWJ1dGUgaW4gY2FzZSB3ZSB3YW50IHRvIGRpZ2l0YWxseSBzaWduIHByb2R1Y3QgaW5zdGFuY2VzIGFuZCBhIHdzdTpDcmVhdGVkIHRpbWVzdGFtcCBlbGVtZW50IHRvIHJlY29yZCBjcmVhdGlvbiBhbmQgZXhwaXJhdGlvbiB0aW1lcy48cD4NCitUbyBjb21waWxlLCBydW4gc29hcGNwcDIgKHdpdGggLUlpbXBvcnQpIGFuZCBjb21waWxlIHlvdXIgY29kZSBieSBsaW5raW5nIGRvbS5jcHAgKG9yIGRvbS5jIGZvciBDKS4gTm90ZSB0aGF0IHRoZSBET00gZGF0YSBzdHJ1Y3R1cmVzIGFyZSBkZWNsYXJlZCBpbiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0ZHNvYXAyXzhoLmh0bWwiPnN0ZHNvYXAyLmg8L2E+LCB3aGlsZSB0aGUgRE9NIG9wZXJhdGlvbnMgYXJlIGRlZmluZWQgaW4gZG9tLmNwcCAob3IgZG9tLmMpLjxoMj48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJkb21fMiI+DQorUG9wdWxhdGluZyBhIERPTSBOb2RlIFNldDwvYT48L2gyPg0KK1doZW4gYSBzdHJ1Y3R1cmUgd2l0aCBhIERPTSBub2RlIHNldCAoYXMgc2hvd24gaW4gdGhlIGV4YW1wbGUgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24pIGlzIGRlc2VyaWFsaXplZCwgdGhlIG5vZGUgc2V0IGlzIGF1dG9tYXRpY2FsbHkgcG9wdWxhdGVkLjxwPg0KK0luIGFkZGl0aW9uLCB0aGUgQysrIGlvc3RyZWFtIG9wZXJhdG9ycyBhcmUgb3ZlcmxvYWRlZCB0byBwYXJzZSBhbmQgZGlzcGxheSBYTUwgb2YgYSBub2RlIHNldDo8cD4NCis8ZGl2IGNsYXNzPSJmcmFnbWVudCI+PHByZT4gICAgPHNwYW4gY2xhc3M9ImtleXdvcmQiPnN0cnVjdCA8L3NwYW4+c29hcCAqc29hcCA9IHNvYXBfbmV3KCk7DQorICAgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT4gZG9tKHNvYXApOw0KKyAgICBjaW4gJmd0OyZndDsgZG9tOyA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gcGFyc2UgWE1MPC9zcGFuPg0KKyAgICA8c3BhbiBjbGFzcz0ia2V5d29yZGZsb3ciPmlmPC9zcGFuPiAoc29hcC5lcnJvcikNCisgICAgICAuLi4gPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIHBhcnNlIGVycm9yPC9zcGFuPg0KKyAgICBjb3V0ICZsdDsmbHQ7IGRvbTsgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIGRpc3BsYXkgWE1MPC9zcGFuPg0KKzwvcHJlPjwvZGl2PjxwPg0KK0luIEMgd2UgdXNlIHRoZSBET00gInNlcmlhbGl6ZXJzIiBhcyBmb2xsb3dzOjxwPg0KKzxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPiAgICA8c3BhbiBjbGFzcz0ia2V5d29yZCI+c3RydWN0IDwvc3Bhbj5zb2FwICpzb2FwID0gc29hcF9uZXcoKTsNCisgICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiBkb207DQorICAgIGRvbS48YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzEyIj5zb2FwPC9hPiA9IHNvYXA7DQorICAgIHNvYXAtJmd0O3JlY3ZmZCA9IHN0ZGluOw0KKyAgICA8c3BhbiBjbGFzcz0ia2V5d29yZGZsb3ciPmlmPC9zcGFuPiAoc29hcF9iZWdpbl9yZWN2KHNvYXApDQorICAgICB8fCBzb2FwX2luX3hzZF9fYW55VHlwZShzb2FwLCBOVUxMLCAmYW1wO2RvbSwgTlVMTCkgIT0gTlVMTA0KKyAgICAgfHwgc29hcF9lbmRfcmVjdihzb2FwKSkNCisgICAgICAuLi4gPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIHBhcnNlIGVycm9yPC9zcGFuPg0KKyAgICBzb2FwLSZndDtzZW5kZmQgPSBzdGRvdXQ7DQorICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkZmxvdyI+aWY8L3NwYW4+IChzb2FwX2JlZ2luX3NlbmQoc29hcCkNCisgICAgIHx8IHNvYXBfb3V0X3hzZF9fYW55VHlwZShzb2FwLCBOVUxMLCAwLCAmYW1wO2RvbSwgTlVMTCkNCisgICAgIHx8IHNvYXBfZW5kX3NlbmQoc29hcCkpDQorICAgICAgLi4uIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBzZW5kIGVycm9yPC9zcGFuPg0KKzwvcHJlPjwvZGl2PjxwPg0KK1RoZSBTT0FQX0RPTV9OT0RFIGZsYWcgaXMgdXNlZCB0byBpbnN0cnVjdCB0aGUgcGFyc2VyIHRvIHBvcHVsYXRlIGEgRE9NIG5vZGUgc2V0IHdpdGggZGVzZXJpYWxpemVkIEMgYW5kIEMrKyBkYXRhIHN0cnVjdHVyZXMgdXNpbmcgdGhlIGRhdGEgdHlwZSdzIGRlc2VyaWFsaXplcnMgZ2VuZXJhdGVkIHdpdGggc29hcGNwcDIuIFN1cHBvc2UgZm9yIGV4YW1wbGUgdGhhdCB0aGUgZm9sbG93aW5nIGhlYWRlciBmaWxlIHdhcyB1c2VkIChpbiBmYWN0LCB0aGUgZGVjbGFyYXRpb24gYXBwZWFycyBpbiB3c3UuaCk6PHA+DQorPGRpdiBjbGFzcz0iZnJhZ21lbnQiPjxwcmU+ICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5zdHJ1Y3QgPC9zcGFuPl93c3VfX1RpbWVzdGFtcA0KKyAgICB7ICAgQDxzcGFuIGNsYXNzPSJrZXl3b3JkdHlwZSI+Y2hhcjwvc3Bhbj4qICB3c3VfSWQ7DQorICAgICAgICA8c3BhbiBjbGFzcz0ia2V5d29yZHR5cGUiPmNoYXI8L3NwYW4+KiAgIENyZWF0ZWQ7DQorICAgICAgICA8c3BhbiBjbGFzcz0ia2V5d29yZHR5cGUiPmNoYXI8L3NwYW4+KiAgIEV4cGlyZXM7DQorICAgIH07DQorPC9wcmU+PC9kaXY+PHA+DQorTm90ZSB0aGF0IHRoZSBsZWFkaW5nIHVuZGVyc2NvcmUgb2YgdGhlIHR5cGUgbmFtZSBpbmRpY2F0ZSBYTUwgZWxlbWVudCBkZWZpbml0aW9ucyAocmF0aGVyIHRoYW4gY29tcGxleFR5cGVzKSwgc28gdGhlIG5hbWUgb2YgdGhlIGRhdGEgdHlwZSBpcyByZWxldmFudCB3aGVuIGNvbXBhcmluZyBYTUwgZWxlbWVudCB0YWdzIHRvIEMvQysrIGRhdGEgdHlwZXMgYnkgdGhlIGRlc2VyaWFsaXplcnMuPHA+DQorV2hlbiBhICZsdDt3c3U6VGltZXN0YW1wJmd0OyBlbGVtZW50IGFwcGVhcnMgaW4gWE1MLCB0aGUgRE9NIG5vZGUgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlZCB3aXRoIHRoZSBfd3N1X19UaW1lc3RhbXAgb2JqZWN0IHVzaW5nIHRoZSBTT0FQX0RPTV9OT0RFIGZsYWc6PHA+DQorPGRpdiBjbGFzcz0iZnJhZ21lbnQiPjxwcmU+ICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5zdHJ1Y3QgPC9zcGFuPnNvYXAgKnNvYXAgPSBzb2FwX25ldzEoU09BUF9ET01fTk9ERSk7DQorICAgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT4gZG9tKHNvYXApOw0KKyAgICBjaW4gJmd0OyZndDsgZG9tOyA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gcGFyc2UgWE1MPC9zcGFuPg0KKyAgICA8c3BhbiBjbGFzcz0ia2V5d29yZGZsb3ciPmlmPC9zcGFuPiAoc29hcC5lcnJvcikNCisgICAgICAuLi4gPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIHBhcnNlIGVycm9yPC9zcGFuPg0KKzwvcHJlPjwvZGl2PjxoMj48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJkb21fMyI+DQorVHJhdmVyc2luZyBhIERPTSBOb2RlIFNldDwvYT48L2gyPg0KK1RoZSBET00gbm9kZSBzZXQgaXMgdHJhdmVyc2VkIHdpdGggYSBDKysgaXRlcmF0b3Igb3Igd2l0aCB0aGUgQyBmdW5jdGlvbnMgPGEgY2xhc3M9ImVsIiBocmVmPSJzdGRzb2FwMl84aC5odG1sI2ExIj5zb2FwX2RvbV9uZXh0X2VsZW1lbnQ8L2E+IGFuZCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0ZHNvYXAyXzhoLmh0bWwjYTIiPnNvYXBfZG9tX25leHRfYXR0cmlidXRlPC9hPi4gRm9yIGV4YW1wbGUsIHRvIHdhbGsgb3ZlciB0aGUgbm9kZSBzZXQgd2l0aCBhbiBpbi1vcmRlciB0cmF2ZXJzYWwgdXNlOjxwPg0KKzxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPiAgICA8c3BhbiBjbGFzcz0ia2V5d29yZCI+c3RydWN0IDwvc3Bhbj5zb2FwICpzb2FwID0gc29hcF9uZXcoKTsNCisgICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiBkb20oc29hcCk7DQorICAgIC4uLg0KKyAgICA8c3BhbiBjbGFzcz0ia2V5d29yZGZsb3ciPmZvcjwvc3Bhbj4gKDxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9faXRlcmF0b3IuaHRtbCI+c29hcF9kb21fZWxlbWVudDo6aXRlcmF0b3I8L2E+IHdhbGtlciA9IGRvbS5iZWdpbigpOyB3YWxrZXIgIT0gZG9tLmVuZCgpOyArK3dhbGtlcikNCisgICAgICAuLi4NCis8L3ByZT48L2Rpdj48cD4NCitJbiBDLCB1c2U8cD4NCis8ZGl2IGNsYXNzPSJmcmFnbWVudCI+PHByZT4gICAgPHNwYW4gY2xhc3M9ImtleXdvcmQiPnN0cnVjdCA8L3NwYW4+c29hcCAqc29hcCA9IHNvYXBfbmV3KCk7DQorICAgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT4gZG9tLCAqd2Fsa2VyOw0KKyAgICBkb20uPGEgY2xhc3M9ImNvZGUiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI28xMiI+c29hcDwvYT4gPSBzb2FwOw0KKyAgICAuLi4NCisgICAgPHNwYW4gY2xhc3M9ImtleXdvcmRmbG93Ij5mb3I8L3NwYW4+ICh3YWxrZXIgPSAmYW1wO2RvbTsgd2Fsa2VyOyB3YWxrZXIgPSA8YSBjbGFzcz0iY29kZSIgaHJlZj0ic3Rkc29hcDJfOGguaHRtbCNhMSI+c29hcF9kb21fbmV4dF9lbGVtZW50PC9hPih3YWxrZXIpKQ0KKyAgICAgIC4uLg0KKzwvcHJlPjwvZGl2PjxwPg0KK1RoZSA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiBhbmQgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sIj5zb2FwX2RvbV9hdHRyaWJ1dGU8L2E+IHN0cnVjdHMgZm9ybSBlc3NlbnRpYWxseSBsaW5rZWQgbGlzdHMsIHNvIGl0IGlzIG5vdCB0b28gZGlmZmljdWx0IHRvIHdyaXRlIHlvdXIgb3duIHRyZWUgd2Fsa2Vycy48aDI+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iZG9tXzQiPg0KK1NlYXJjaGluZyBhbmQgZmlsdGVyaW5nIGEgRE9NIE5vZGUgU2V0PC9hPjwvaDI+DQorPGgyPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImRvbV81Ij4NCitVc2luZyBhIERPTSB3aXRoIEVtYmVkZGVkIEFwcGxpY2F0aW9uIERhdGE8L2E+PC9oMj4NCis8aDI+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iZG9tXzYiPg0KK1RpcHMgYW5kIFRyaWNrczwvYT48L2gyPg0KK0RPTSBlbGVtZW50IG5vZGVzIGFuZCBhdHRyaWJ1dGUgbm9kZXMgY2FuIGhhdmUgYW4gb3B0aW9uYWwgbmFtZXNwYWNlIG5hbWVzLiBUaGUgbmFtZXNwYWNlIHByZWZpeCBhbmQgbmFtZSBiaW5kaW5ncyAoeG1sbnMgaW4gWE1MKSBhcmUgYXV0b21hdGljYWxseSByZXNvbHZlZC48cD4NCitUaGUgRE9NIGVsZW1lbnRzIGNhbiBiZSB1c2VkIGFueXdoZXJlIHdpdGhpbiBhIEMvQysrIGRhdGEgc3RydWN0dXJlIGFuZCBhbHNvIGFzIHRoZSBhcmd1bWVudHMgdG8gYSBzZXJ2aWNlIG1ldGhvZC4gRm9yIGV4YW1wbGU6IHN0cnVjdCBTT0FQX0VOVl9fSGVhZGVyIHsgeHNkX19hbnlUeXBlICphdXRoZW50aWNhdGlvbjsgfTsgaW50IG5zX190ZXN0KHhzZF9fYW55VHlwZSBpbiwgeHNkX19hbnlUeXBlICpvdXQpOyB3aGljaCBkZWZpbmVzIGEgY3VzdG9tIFNPQVAgSGVhZGVyIHdpdGggYW4gYXV0aGVudGljYXRpb24gZWxlbWVudCBwYXJzZWQgYXMgYSBET00uPHA+DQorRE9NIG5vZGUgZmllbGRzOiBwcm50IHBvaW50ZXIgdG8gcGFyZW50IG5vZGUgZWx0cyBsaXN0IG9mIGNoaWxkIGVsZW1lbnRzIChsaXN0IG9mIERPTSBub2RlcykgYXR0cyBsaXN0IG9mIGF0dHJpYnV0ZXMgY29uc3QgY2hhciAqbnN0ciBvcHRpb25hbCBlbGVtZW50IG5hbWVzcGFjZSBuYW1lIChVUkkpIGNoYXIgKm5hbWUgZWxlbWVudCBuYW1lIHdpdGggb3B0aW9uYWwgbnM6IHByZWZpeCBjaGFyICpkYXRhIG9wdGlvbmFsIGVsZW1lbnQgZGF0YSAoc2VlIGNvbW1lbnQgYmVsb3cpIHdjaGFyX3QgKndpZGUgb3B0aW9uYWwgZWxlbWVudCBkYXRhIChzZWUgY29tbWVudCBiZWxvdykgaW50IHR5cGUgb3B0aW9uYWwgdHlwZSBTT0FQX1RZUEVfWCBhcyBkZWZpbmVkIGluIHNvYXBILmggdm9pZCAqbm9kZSBhbmQgb3B0aW9uYWwgcG9pbnRlciB0byBDL0MrKyBkYXRhIHR5cGUgY2hhciAqaGVhZCBsZWFkaW5nIHdoaXRlc3BhY2UgdG8gc3RhcnQgdGFnIChyZW5kZXIgb25seSkgY2hhciAqdGFpbCBsZWFkaW5nIHdoaXRlc3BhY2UgdG8gZW5kIHRhZyAocmVuZGVyIG9ubHkpIHNvYXAgdGhlIGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgaW5zdGFuY2U8cD4NCitET00gUGFyc2luZzogVGhlIG5hbWVzcGFjZSBuYW1lIChVUkkpIHBhcnNpbmcgaXMgc21hcnQgYW5kIGZpbGxzIHRoZSAnbnN0cicgZmllbGQgd2l0aCB0aGUgbmFtZXNwYWNlIFVSSXMuIFRoZSBhbGdvcml0aG0gY2hlY2tzIHRoZSBuYW1lcyBpbiB0aGUgbnNtYXAgdGFibGUgZmlyc3QuIEFmdGVyIHBhcnNpbmcsIHRoZSAnbnN0cicgbmFtZXNwYWNlIHN0cmluZ3Mgd2lsbCBwb2ludCB0byB0aGUgbnNtYXAgdGFibGUgY29udGVudHMgaW4gY2FzZSB0aGUgbmFtZXMgKFVSSXMpIG1hdGNoIGEgdGFibGUgZW50cnkuIE90aGVyd2lzZSwgdGhlIG5hbWVzIGFyZSBkeW5hbWljYWxseSBhbGxvY2F0ZWQuIFRoaXMgZW5hYmxlcyBxdWljayBwb2ludGVyLWJhc2VkIGNoZWNrcyBvbiB0aGUgRE9NIG5vZGUncyBuYW1lc3BhY2UgbmFtZXMgYnkgY29tcGFyaW5nIHRoZSBwb2ludGVyIHRvIHRoZSBuYW1lc3BhY2UgdGFibGUgZW50cmllcyAnbmFtZXNwYWNlc1tpXS5ucycuPHA+DQorQ2hhcmFjdGVyIGRhdGEgcGFyc2luZzogVGhlIHBhcnNlciBmaWxscyB0aGUgJ3dpZGUnIHN0cmluZyBmaWVsZHMgb2YgdGhlIERPTSBub2RlcyBvbmx5ICh0aGUgJ3dpZGUnIGZpZWxkcyBjb250YWluIFVuaWNvZGUgWE1MIGNkYXRhKSwgdW5sZXNzIHRoZSBpbnB1dC1tb2RlIGZsYWcgU09BUF9DX1VURlNUUklORyBvciBTT0FQX0NfTUJTVFJJTkcgaXMgc2V0IHVzaW5nIHNvYXBfaW5pdDIoKSBvciBzb2FwX3NldF9pbW9kZSgpLiBJbiB0aGF0IGNhc2UgdGhlICdkYXRhJyBmaWVsZHMgYXJlIHNldCB3aXRoIFVURjggY29udGVudHMgb3IgbXVsdGlieXRlIGNoYXJhY3RlciBzdHJpbmdzLjxwPg0KK1RoZSBmb2xsb3dpbmcgaW5wdXQtbW9kZSBmbGFncyAoc2V0IHdpdGggc29hcF9zZXRfaW1vZGUoKSkgY29udHJvbCB0aGUgcGFyc2luZyBvZiBDL0MrKyBkYXRhIHR5cGVzIChzdG9yZWQgaW4gdGhlICdub2RlJyBhbmQgJ3R5cGUnIGZpZWxkcyk6PHA+DQorZGVmYXVsdDogb25seSBlbGVtZW50cyB3aXRoIGFuICdpZCcgYXR0cmlidXRlIGFyZSBkZXNlcmlhbGl6ZWQgYXMgQy9DKysgZGF0YSB0eXBlcyAod2hlbiBhIGRlc2VyaWFsaXplciBpcyBhdmFpbGFibGUpIFNPQVBfRE9NX1RSRUU6IG5ldmVyIGRlc2VyaWFsaXplIEMvQysrIHR5cGVzIChwcm9kdWNlcyBET00gdHJlZSkgU09BUF9ET01fTk9ERTogYWx3YXlzIGRlc2VyaWFsaXplIEMvQysrIHR5cGVzICh3aGVuIGEgZGVzZXJpYWxpemVyIGlzIGF2YWlsYWJsZSBhbmQgdGhlIHhzaTp0eXBlIGF0dHJpYnV0ZSBpcyBwcmVzZW50IGluIHRoZSBYTUwgbm9kZSBvciB0aGUgWE1MIGVsZW1lbnQgdGFnIG1hdGNoZXMgdGhlIHR5cGUgbmFtZSkgU09BUF9ET01fQVNJUzogbmV2ZXIgaW5zZXJ0IHhtbG5zIGJpbmRpbmdzIGZvciBVUklzIHN0b3JlZCBpbiBuc3RyLCBidXQgYXNzdW1lIHRoZSBET00gaXMgc2VsZi1jb250YWluZWQ8cD4NCitUaGUgZm9sbG93aW5nIG91dHB1dC1tb2RlIGZsYWcgKHNldCB3aXRoIHNvYXBfc2V0X29tb2RlKCkpIGNvbnRyb2xzIHRoZSBzZXJpYWxpemF0aW9uIG9mIFhNTDo8cD4NCitTT0FQX1hNTF9JTkRFTlQ6IHNlcmlhbGl6ZSBYTUwgd2l0aCBpbmRlbnRhdGlvbiBTT0FQX1hNTF9DQU5PTklDQUw6IHNlcmlhbGl6ZSBYTUwgaW4gY2Fub25pY2FsIGZvcm08cD4NCitUaGUgZW50aXJlIGRlc2VyaWFsaXplZCBET00gaXMgZnJlZWQgd2l0aCBzb2FwX2Rlc3Ryb3koRE9NLnNvYXApOyBzb2FwX2VuZChET00uc29hcCk7PHA+DQorRXhhbXBsZXMgKFhNTCBwYXJzaW5nIGFuZCBnZW5lcmF0aW9uKTo8cD4NCitzdHJ1Y3Qgc29hcCAqc29hcCA9IHNvYXBfbmV3KCk7IHhzZF9fYW55VHlwZSBkb20oc29hcCk7IC8vIG5lZWQgYSBzb2FwIHN0cnVjdCB0byBwYXJzZSBYTUwgdXNpbmcgJyZndDsmZ3Q7JyBjaW4gJmd0OyZndDsgZG9tOyAvLyBwYXJzZSBYTUwgaWYgKHNvYXAtJmd0O2Vycm9yKSAuLi4gaW5wdXQgZXJyb3IgLi4uIHNvYXBfZGVzdHJveShzb2FwKTsgLy8gZGVsZXRlIERPTSBzb2FwX2VuZChzb2FwKTsgLy8gZGVsZXRlIGRhdGEgc29hcF9kb25lKHNvYXApOyAvLyBmaW5hbGl6ZSBmcmVlKHNvYXApOzxwPg0KK3N0cnVjdCBzb2FwICpzb2FwID0gc29hcF9uZXcoKTsgeHNkX19hbnlUeXBlIGRvbShzb2FwLCAuLi4pOyAvLyBwb3B1bGF0ZSB0aGUgRE9NIGNvdXQgJmx0OyZsdDsgZG9tOyAvLyBwcmludCBpZiAoc29hcC0mZ3Q7ZXJyb3IpIC4uLiBvdXRwdXQgZXJyb3IgLi4uIHNvYXBfZGVzdHJveShzb2FwKTsgLy8gY2xlYW4gdXAgb2JqZWN0cyBzb2FwX2VuZChzb2FwKTsgLy8gY2xlYW4gdXAgc29hcF9kb25lKHNvYXApOyAvLyBmaW5hbGl6ZSBmcmVlKHNvYXApOzxwPg0KK1RvIHJldGFpbiB0aGUgRE9NIGJ1dCByZW1vdmUgYWxsIG90aGVyIGRhdGEsIHVzZTogZG9tLnVubGluaygpOzxwPg0KK0NvbXBpbGU6IHNvYXBjcHAyIDxhIGNsYXNzPSJlbCIgaHJlZj0iZG9tXzhoLmh0bWwiPmRvbS5oPC9hPiBnKysgLWMgZG9tLmNwcDxwPg0KK1RvIHVzZSBhIERPTSBpbiB5b3VyIFdlYiBzZXJ2aWNlIGFwcGxpY2F0aW9uLCBhZGQgdG8gdGhlIGdTT0FQIGhlYWRlciBmaWxlIHRoYXQgZGVmaW5lcyB5b3VyIHNlcnZpY2U6ICNpbXBvcnQgImRvbS5oIiBUaGVuIHVzZSB0aGUgeHNkX19hbnlUeXBlIHRvIHJlZmVyIHRvIHRoZSBET00gaW4geW91ciBkYXRhIHN0cnVjdHVyZXMuPHA+DQorTGluayB0aGUgYXBwbGljYXRpb24gd2l0aCBkb20ubyA8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAyMDo1NTo1NCAyMDA1IGZvciBnU09BUCBsZXZlbC0yIERPTSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL2RvbV84Y3BwLmh0bWwgYi9kb2MvZG9tL2h0bWwvZG9tXzhjcHAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWYwZjEwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL2RvbV84Y3BwLmh0bWwKQEAgLTAsMCArMSw3NzQgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIGxldmVsLTIgRE9NOiAvVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvZG9tL2RvbS5jcHAgRmlsZSBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPjwvZGl2Pg0KKzxoMT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvZG9tL2RvbS5jcHAgRmlsZSBSZWZlcmVuY2U8L2gxPjxjb2RlPiNpbmNsdWRlICI8YSBjbGFzcz0iZWwiIGhyZWY9InN0ZHNvYXAyXzhoLmh0bWwiPnN0ZHNvYXAyLmg8L2E+IjwvY29kZT48YnI+DQorDQorPHA+DQorSW5jbHVkZSBkZXBlbmRlbmN5IGdyYXBoIGZvciBkb20uY3BwOjxwPjxjZW50ZXI+PGltZyBzcmM9ImRvbV84Y3BwX19pbmNsLnBuZyIgYm9yZGVyPSIwIiB1c2VtYXA9IiNkb20uY3BwX21hcCIgYWx0PSJJbmNsdWRlIGRlcGVuZGVuY3kgZ3JhcGgiPjwvY2VudGVyPg0KKzxtYXAgbmFtZT0iZG9tLmNwcF9tYXAiPg0KKzxhcmVhIGhyZWY9InN0ZHNvYXAyXzhoLmh0bWwiIHNoYXBlPSJyZWN0IiBjb29yZHM9IjcsMTcsODEsNDQiIGFsdD0iIj4NCis8L21hcD4NCis8dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+RGVmaW5lczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4jZGVmaW5lJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImRvbV84Y3BwLmh0bWwjYTAiPlNPQVBfRE9NSURfRk9STUFUPC9hPiZuYnNwOyZuYnNwOyZuYnNwOyJkb20lZCI8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5GdW5jdGlvbnM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+U09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iZG9tXzhjcHAuaHRtbCNhMSI+c29hcF9zZXJpYWxpemVfeHNkX19hbnlUeXBlPC9hPiAoc3RydWN0IHNvYXAgKiwgc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+IGNvbnN0ICopPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5TT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJkb21fOGNwcC5odG1sI2EyIj5zb2FwX2RlZmF1bHRfeHNkX19hbnlUeXBlPC9hPiAoc3RydWN0IHNvYXAgKiwgc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+ICopPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5TT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImRvbV84Y3BwLmh0bWwjYTMiPnNvYXBfcHV0X3hzZF9fYW55VHlwZTwvYT4gKHN0cnVjdCBzb2FwICosIGNvbnN0IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPlNPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzImbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iZG9tXzhjcHAuaHRtbCNhNCI+c29hcF9vdXRfeHNkX19hbnlUeXBlPC9hPiAoc3RydWN0IHNvYXAgKiwgY29uc3QgY2hhciAqLCBpbnQsIGNvbnN0IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiAqLCBjb25zdCBjaGFyICopPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5TT0FQX0ZNQUMzIHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiA8YnI+DQorKlNPQVBfRk1BQzQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iZG9tXzhjcHAuaHRtbCNhNSI+c29hcF9nZXRfeHNkX19hbnlUeXBlPC9hPiAoc3RydWN0IHNvYXAgKiwgc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+ICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+U09BUF9GTUFDMSBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT4gPGJyPg0KKypTT0FQX0ZNQUMyJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImRvbV84Y3BwLmh0bWwjYTYiPnNvYXBfaW5feHNkX19hbnlUeXBlPC9hPiAoc3RydWN0IHNvYXAgKiwgY29uc3QgY2hhciAqLCBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT4gKiwgY29uc3QgY2hhciAqKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+U09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iZG9tXzhjcHAuaHRtbCNhNyI+c29hcF9tYXJrZWxlbWVudDwvYT4gKHN0cnVjdCBzb2FwICosIGNvbnN0IHZvaWQgKiwgaW50KTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+U09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJkb21fOGNwcC5odG1sI2E4Ij5zb2FwX3B1dGVsZW1lbnQ8L2E+IChzdHJ1Y3Qgc29hcCAqLCBjb25zdCB2b2lkICosIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5TT0FQX0ZNQUMzIHZvaWQgKlNPQVBfRk1BQzQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iZG9tXzhjcHAuaHRtbCNhOSI+c29hcF9nZXRlbGVtZW50PC9hPiAoc3RydWN0IHNvYXAgKiwgaW50ICopPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zb2FwX2lsaXN0ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iZG9tXzhjcHAuaHRtbCNhMTAiPnNvYXBfbG9va3VwX25zPC9hPiAoc3RydWN0IHNvYXAgKiwgY29uc3QgY2hhciAqKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c29hcF9pbGlzdCAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImRvbV84Y3BwLmh0bWwjYTExIj5zb2FwX2VudGVyX25zPC9hPiAoc3RydWN0IHNvYXAgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iZG9tXzhjcHAuaHRtbCNhMTIiPm91dF9lbGVtZW50PC9hPiAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiAqbm9kZSwgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpuc3RyKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImRvbV84Y3BwLmh0bWwjYTEzIj5vdXRfYXR0cmlidXRlPC9hPiAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZGF0YSk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPlNPQVBfRk1BQzEgY29uc3QgY2hhciAqU09BUF9GTUFDMiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJkb21fOGNwcC5odG1sI2ExNCI+c29hcF9kb21fY3VycmVudF9uc3RyPC9hPiAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZyk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPlNPQVBfRk1BQzEgc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+IDxicj4NCisqU09BUF9GTUFDMiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJkb21fOGNwcC5odG1sI2ExNSI+c29hcF9kb21fbmV4dF9lbGVtZW50PC9hPiAoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+ICplbHQpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwiPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJkb21fOGNwcC5odG1sI2ExNiI+c29hcF9kb21fbmV4dF9hdHRyaWJ1dGU8L2E+IChzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sIj5zb2FwX2RvbV9hdHRyaWJ1dGU8L2E+ICphdHQpPC90ZD48L3RyPg0KKw0KKzwvdGFibGU+DQorPGhyPjxoMj5EZWZpbmUgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTAiIGRveHl0YWc9ImRvbS5jcHA6OlNPQVBfRE9NSURfRk9STUFUIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+ICNkZWZpbmUgU09BUF9ET01JRF9GT1JNQVQmbmJzcDsmbmJzcDsmbmJzcDsiZG9tJWQiICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPjxoMj5GdW5jdGlvbiBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMTMiIGRveHl0YWc9ImRvbS5jcHA6Om91dF9hdHRyaWJ1dGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IG91dF9hdHRyaWJ1dGUgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnByZWZpeDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+bmFtZTwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+ZGF0YTwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PGNvZGU+IFtzdGF0aWNdPC9jb2RlPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTEyIiBkb3h5dGFnPSJkb20uY3BwOjpvdXRfZWxlbWVudCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgb3V0X2VsZW1lbnQgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3Qgc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+bm9kZTwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+cHJlZml4PC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5uYW1lPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5uc3RyPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48Y29kZT4gW3N0YXRpY108L2NvZGU+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMiIgZG94eXRhZz0iZG9tLmNwcDo6c29hcF9kZWZhdWx0X3hzZF9fYW55VHlwZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2RlZmF1bHRfeHNkX19hbnlUeXBlICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMTQiIGRveHl0YWc9ImRvbS5jcHA6OnNvYXBfZG9tX2N1cnJlbnRfbnN0ciIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9kb21fY3VycmVudF9uc3RyICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT50YWc8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTE2IiBkb3h5dGFnPSJkb20uY3BwOjpzb2FwX2RvbV9uZXh0X2F0dHJpYnV0ZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sIj5zb2FwX2RvbV9hdHRyaWJ1dGU8L2E+KiBzb2FwX2RvbV9uZXh0X2F0dHJpYnV0ZSAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwiPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gPGVtPmF0dDwvZW0+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTE1IiBkb3h5dGFnPSJkb20uY3BwOjpzb2FwX2RvbV9uZXh0X2VsZW1lbnQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gU09BUF9GTUFDMSBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT4qIFNPQVBfRk1BQzIgc29hcF9kb21fbmV4dF9lbGVtZW50ICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5lbHQ8L2VtPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExMSIgZG94eXRhZz0iZG9tLmNwcDo6c29hcF9lbnRlcl9ucyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3Qgc29hcF9pbGlzdCAqIHNvYXBfZW50ZXJfbnMgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjxjb2RlPiBbc3RhdGljXTwvY29kZT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE1IiBkb3h5dGFnPSJkb20uY3BwOjpzb2FwX2dldF94c2RfX2FueVR5cGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gU09BUF9GTUFDMyBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT4qIFNPQVBfRk1BQzQgc29hcF9nZXRfeHNkX19hbnlUeXBlICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE5IiBkb3h5dGFnPSJkb20uY3BwOjpzb2FwX2dldGVsZW1lbnQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gU09BUF9GTUFDMyB2b2lkKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0ZWxlbWVudCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+aW50ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTYiIGRveHl0YWc9ImRvbS5jcHA6OnNvYXBfaW5feHNkX19hbnlUeXBlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IFNPQVBfRk1BQzEgc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+ICpTT0FQX0ZNQUMyIHNvYXBfaW5feHNkX19hbnlUeXBlICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+c3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExMCIgZG94eXRhZz0iZG9tLmNwcDo6c29hcF9sb29rdXBfbnMiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IHNvYXBfaWxpc3QgKiBzb2FwX2xvb2t1cF9ucyAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48Y29kZT4gW3N0YXRpY108L2NvZGU+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNyIgZG94eXRhZz0iZG9tLmNwcDo6c29hcF9tYXJrZWxlbWVudCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX21hcmtlbGVtZW50ICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCB2b2lkICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+aW50Jm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE0IiBkb3h5dGFnPSJkb20uY3BwOjpzb2FwX291dF94c2RfX2FueVR5cGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dF94c2RfX2FueVR5cGUgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5pbnQmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3Qgc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEzIiBkb3h5dGFnPSJkb20uY3BwOjpzb2FwX3B1dF94c2RfX2FueVR5cGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF94c2RfX2FueVR5cGUgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTgiIGRveHl0YWc9ImRvbS5jcHA6OnNvYXBfcHV0ZWxlbWVudCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0ZWxlbWVudCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3Qgdm9pZCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5pbnQmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+aW50Jm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExIiBkb3h5dGFnPSJkb20uY3BwOjpzb2FwX3NlcmlhbGl6ZV94c2RfX2FueVR5cGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXJpYWxpemVfeHNkX19hbnlUeXBlICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT4gY29uc3QgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gU2F0IEF1ZyAyMCAxMjoyNDozNiAyMDA1IGZvciBnU09BUCBsZXZlbC0yIERPTSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL2RvbV84Y3BwX19pbmNsLm1hcCBiL2RvYy9kb20vaHRtbC9kb21fOGNwcF9faW5jbC5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFkY2M2YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9kb21fOGNwcF9faW5jbC5tYXAKQEAgLTAsMCArMSwyIEBACitiYXNlIHJlZmVyZXIKK3JlY3QgJHN0ZHNvYXAyXzhoLmh0bWwgNywxNyA4MSw0NApkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL2RvbV84Y3BwX19pbmNsLm1kNSBiL2RvYy9kb20vaHRtbC9kb21fOGNwcF9faW5jbC5tZDUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQxMTEyZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9kb21fOGNwcF9faW5jbC5tZDUKQEAgLTAsMCArMSBAQAorMWUxYWRhZWMxOGE1MzljMzZlNGI2ZDRiZmQxNTUyYzgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvZG9tXzhjcHBfX2luY2wucG5nIGIvZG9jL2RvbS9odG1sL2RvbV84Y3BwX19pbmNsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjk5NWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL2RvbV84Y3BwX19pbmNsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvZG9tXzhoLmh0bWwgYi9kb2MvZG9tL2h0bWwvZG9tXzhoLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM1ODQ5OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9kb21fOGguaHRtbApAQCAtMCwwICsxLDQ1IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBsZXZlbC0yIERPTTogL1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL2RvbS9kb20uaCBGaWxlIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+PC9kaXY+DQorPGgxPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy9kb20vZG9tLmggRmlsZSBSZWZlcmVuY2U8L2gxPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5UeXBlZGVmczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD50eXBlZGVmIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImRvbV84aC5odG1sI2EwIj54c2RfX2FueVR5cGU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlRoZSBjdXN0b20gc2VyaWFsaXplciBmb3IgRE9NIG5vZGVzIGlzIHJlcHJlc2VudGVkIGJ5IHhzZF9fYW55VHlwZS4gIDxhIGhyZWY9IiNhMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGgyPlR5cGVkZWYgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTAiIGRveHl0YWc9ImRvbS5oOjp4c2RfX2FueVR5cGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdHlwZWRlZiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT4gPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+eHNkX19hbnlUeXBlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1RoZSBjdXN0b20gc2VyaWFsaXplciBmb3IgRE9NIG5vZGVzIGlzIHJlcHJlc2VudGVkIGJ5IHhzZF9fYW55VHlwZS4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFNhdCBBdWcgMjAgMTI6MjQ6MzYgMjAwNSBmb3IgZ1NPQVAgbGV2ZWwtMiBET00gYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9kb3h5Z2VuLmNzcyBiL2RvYy9kb20vaHRtbC9kb3h5Z2VuLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjJlNTgyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL2RveHlnZW4uY3NzCkBAIC0wLDAgKzEsMjE2IEBACitIMSB7CisJdGV4dC1hbGlnbjogY2VudGVyOworCWZvbnQtZmFtaWx5OiBHZW5ldmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Cit9CitIMiB7CisJZm9udC1mYW1pbHk6IEdlbmV2YSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKK30KK0NBUFRJT04geyBmb250LXdlaWdodDogYm9sZCB9CitESVYucWluZGV4IHsKKwl3aWR0aDogMTAwJTsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWZmOworCWJvcmRlcjogMXB4IHNvbGlkICNCMEIwQjA7CisJdGV4dC1hbGlnbjogY2VudGVyOworCW1hcmdpbjogMnB4OworCXBhZGRpbmc6IDJweDsKKwlsaW5lLWhlaWdodDogMTIwJTsKK30KK0EucWluZGV4IHsKKyAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgICAgY29sb3I6ICMxQTQxOUQ7CisgICAgICAgcGFkZGluZzogMnB4OworfQorQS5xaW5kZXg6dmlzaXRlZCB7CisgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgICAgIGNvbG9yOiAjMUE0MTlECisgICAgICAgcGFkZGluZzogMnB4OworfQorQS5xaW5kZXg6aG92ZXIgeworCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZGRkZGZmOworCXBhZGRpbmc6IDJweDsKK30KK0EucWluZGV4SEwgeworCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKKwlmb250LXdlaWdodDogYm9sZDsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjNjY2NmNjOworCWNvbG9yOiAjZmZmZmZmOworCXBhZGRpbmc6IDJweCA2cHg7CisJYm9yZGVyOiAxcHggZG91YmxlICM5Mjk1QzI7Cit9CitBLnFpbmRleEhMOmhvdmVyIHsKKwl0ZXh0LWRlY29yYXRpb246IG5vbmU7CisJYmFja2dyb3VuZC1jb2xvcjogIzY2NjZjYzsKKwljb2xvcjogI2ZmZmZmZjsKKwlwYWRkaW5nOiAycHggNnB4OworfQorQS5xaW5kZXhITDp2aXNpdGVkIHsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBiYWNrZ3JvdW5kLWNvbG9yOiAjNjY2NmNjOyBjb2xvcjogI2ZmZmZmZiB9CitBLmVsIHsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBmb250LXdlaWdodDogYm9sZCB9CitBLmVsUmVmIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQorQS5jb2RlIHsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBmb250LXdlaWdodDogbm9ybWFsOyBjb2xvcjogIzFBNDE5RH0KK0EuY29kZVJlZiB7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGNvbG9yOiAjMUE0MTlEfQorQTpob3ZlciB7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgYmFja2dyb3VuZC1jb2xvcjogI2YyZjJmZiB9CitETC5lbCB7IG1hcmdpbi1sZWZ0OiAtMWNtIH0KK1BSRS5mcmFnbWVudCB7CisJYm9yZGVyOiAxcHggc29saWQgI0NDQ0NDQzsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1OworCW1hcmdpbi10b3A6IDRweDsKKwltYXJnaW4tYm90dG9tOiA0cHg7CisJbWFyZ2luLWxlZnQ6IDJweDsKKwltYXJnaW4tcmlnaHQ6IDhweDsKKwlwYWRkaW5nLWxlZnQ6IDZweDsKKwlwYWRkaW5nLXJpZ2h0OiA2cHg7CisJcGFkZGluZy10b3A6IDRweDsKKwlwYWRkaW5nLWJvdHRvbTogNHB4OworfQorRElWLmZyYWdtZW50IHsKKwlib3JkZXI6IDFweCBzb2xpZCAjQ0NDQ0NDOworCWJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7CisJcGFkZGluZzogNnB4OworfQorRElWLmFoIHsgYmFja2dyb3VuZC1jb2xvcjogYmxhY2s7IGZvbnQtd2VpZ2h0OiBib2xkOyBjb2xvcjogI2ZmZmZmZjsgbWFyZ2luLWJvdHRvbTogM3B4OyBtYXJnaW4tdG9wOiAzcHggfQorVEQubWQgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjRjRGNEZCOyBmb250LXdlaWdodDogYm9sZDsgfQorVEQubWRuYW1lMSB7IGJhY2tncm91bmQtY29sb3I6ICNGNEY0RkI7IGZvbnQtd2VpZ2h0OiBib2xkOyBjb2xvcjogIzYwMjAyMDsgfQorVEQubWRuYW1lIHsgYmFja2dyb3VuZC1jb2xvcjogI0Y0RjRGQjsgZm9udC13ZWlnaHQ6IGJvbGQ7IGNvbG9yOiAjNjAyMDIwOyB3aWR0aDogNjAwcHg7IH0KK0RJVi5ncm91cEhlYWRlciB7CisgICAgICAgbWFyZ2luLWxlZnQ6IDE2cHg7CisgICAgICAgbWFyZ2luLXRvcDogMTJweDsKKyAgICAgICBtYXJnaW4tYm90dG9tOiA2cHg7CisgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisJZm9udC1mYW1pbHk6IEdlbmV2YSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKK30KK0RJVi5ncm91cFRleHQgeyBtYXJnaW4tbGVmdDogMTZweDsgZm9udC1zdHlsZTogaXRhbGljOyBmb250LXNpemU6IDE0cHggfQorQk9EWSB7CisJYmFja2dyb3VuZDogd2hpdGU7CisJY29sb3I6IGJsYWNrOworCW1hcmdpbi1yaWdodDogMjBweDsKKwltYXJnaW4tbGVmdDogMjBweDsKK30KK1RELmluZGV4a2V5IHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWZmOworCWZvbnQtd2VpZ2h0OiBib2xkOworCXBhZGRpbmctcmlnaHQgIDogMTBweDsKKwlwYWRkaW5nLXRvcCAgICA6IDJweDsKKwlwYWRkaW5nLWxlZnQgICA6IDEwcHg7CisJcGFkZGluZy1ib3R0b20gOiAycHg7CisJbWFyZ2luLWxlZnQgICAgOiAwcHg7CisJbWFyZ2luLXJpZ2h0ICAgOiAwcHg7CisJbWFyZ2luLXRvcCAgICAgOiAycHg7CisJbWFyZ2luLWJvdHRvbSAgOiAycHg7CisJYm9yZGVyOiAxcHggc29saWQgI0NDQ0NDQzsKK30KK1RELmluZGV4dmFsdWUgeworCWJhY2tncm91bmQtY29sb3I6ICNlZWVlZmY7CisJZm9udC1zdHlsZTogaXRhbGljOworCXBhZGRpbmctcmlnaHQgIDogMTBweDsKKwlwYWRkaW5nLXRvcCAgICA6IDJweDsKKwlwYWRkaW5nLWxlZnQgICA6IDEwcHg7CisJcGFkZGluZy1ib3R0b20gOiAycHg7CisJbWFyZ2luLWxlZnQgICAgOiAwcHg7CisJbWFyZ2luLXJpZ2h0ICAgOiAwcHg7CisJbWFyZ2luLXRvcCAgICAgOiAycHg7CisJbWFyZ2luLWJvdHRvbSAgOiAycHg7CisJYm9yZGVyOiAxcHggc29saWQgI0NDQ0NDQzsKK30KK1RSLm1lbWxpc3QgeworICAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDsgCit9CitQLmZvcm11bGFEc3AgeyB0ZXh0LWFsaWduOiBjZW50ZXI7IH0KK0lNRy5mb3JtdWxhRHNwIHsgfQorSU1HLmZvcm11bGFJbmwgeyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyB9CitTUEFOLmtleXdvcmQgICAgICAgeyBjb2xvcjogIzAwODAwMCB9CitTUEFOLmtleXdvcmR0eXBlICAgeyBjb2xvcjogIzYwNDAyMCB9CitTUEFOLmtleXdvcmRmbG93ICAgeyBjb2xvcjogI2UwODAwMCB9CitTUEFOLmNvbW1lbnQgICAgICAgeyBjb2xvcjogIzgwMDAwMCB9CitTUEFOLnByZXByb2Nlc3NvciAgeyBjb2xvcjogIzgwNjAyMCB9CitTUEFOLnN0cmluZ2xpdGVyYWwgeyBjb2xvcjogIzAwMjA4MCB9CitTUEFOLmNoYXJsaXRlcmFsICAgeyBjb2xvcjogIzAwODA4MCB9CisubWRUYWJsZSB7CisJYm9yZGVyOiAxcHggc29saWQgIzg2ODY4NjsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRjRGNEZCOworfQorLm1kUm93IHsKKwlwYWRkaW5nOiA4cHggMTBweDsKK30KKy5tZGVzY0xlZnQgeworICAgICAgIHBhZGRpbmc6IDBweCA4cHggNHB4IDhweDsKKwlmb250LXNpemU6IDE0cHg7CisJZm9udC1zdHlsZTogaXRhbGljOworCWJhY2tncm91bmQtY29sb3I6ICNGQUZBRkE7CisJYm9yZGVyLXRvcDogMXB4IG5vbmUgI0UwRTBFMDsKKwlib3JkZXItcmlnaHQ6IDFweCBub25lICNFMEUwRTA7CisJYm9yZGVyLWJvdHRvbTogMXB4IG5vbmUgI0UwRTBFMDsKKwlib3JkZXItbGVmdDogMXB4IG5vbmUgI0UwRTBFMDsKKwltYXJnaW46IDBweDsKK30KKy5tZGVzY1JpZ2h0IHsKKyAgICAgICBwYWRkaW5nOiAwcHggOHB4IDRweCA4cHg7CisJZm9udC1zaXplOiAxNHB4OworCWZvbnQtc3R5bGU6IGl0YWxpYzsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRkFGQUZBOworCWJvcmRlci10b3A6IDFweCBub25lICNFMEUwRTA7CisJYm9yZGVyLXJpZ2h0OiAxcHggbm9uZSAjRTBFMEUwOworCWJvcmRlci1ib3R0b206IDFweCBub25lICNFMEUwRTA7CisJYm9yZGVyLWxlZnQ6IDFweCBub25lICNFMEUwRTA7CisJbWFyZ2luOiAwcHg7Cit9CisubWVtSXRlbUxlZnQgeworCXBhZGRpbmc6IDFweCAwcHggMHB4IDhweDsKKwltYXJnaW46IDRweDsKKwlib3JkZXItdG9wLXdpZHRoOiAxcHg7CisJYm9yZGVyLXJpZ2h0LXdpZHRoOiAxcHg7CisJYm9yZGVyLWJvdHRvbS13aWR0aDogMXB4OworCWJvcmRlci1sZWZ0LXdpZHRoOiAxcHg7CisJYm9yZGVyLXRvcC1zdHlsZTogc29saWQ7CisJYm9yZGVyLXRvcC1jb2xvcjogI0UwRTBFMDsKKwlib3JkZXItcmlnaHQtY29sb3I6ICNFMEUwRTA7CisJYm9yZGVyLWJvdHRvbS1jb2xvcjogI0UwRTBFMDsKKwlib3JkZXItbGVmdC1jb2xvcjogI0UwRTBFMDsKKwlib3JkZXItcmlnaHQtc3R5bGU6IG5vbmU7CisJYm9yZGVyLWJvdHRvbS1zdHlsZTogbm9uZTsKKwlib3JkZXItbGVmdC1zdHlsZTogbm9uZTsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRkFGQUZBOworCWZvbnQtZmFtaWx5OiBHZW5ldmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CisJZm9udC1zaXplOiAxMnB4OworfQorLm1lbUl0ZW1SaWdodCB7CisJcGFkZGluZzogMXB4IDhweCAwcHggOHB4OworCW1hcmdpbjogNHB4OworCWJvcmRlci10b3Atd2lkdGg6IDFweDsKKwlib3JkZXItcmlnaHQtd2lkdGg6IDFweDsKKwlib3JkZXItYm90dG9tLXdpZHRoOiAxcHg7CisJYm9yZGVyLWxlZnQtd2lkdGg6IDFweDsKKwlib3JkZXItdG9wLXN0eWxlOiBzb2xpZDsKKwlib3JkZXItdG9wLWNvbG9yOiAjRTBFMEUwOworCWJvcmRlci1yaWdodC1jb2xvcjogI0UwRTBFMDsKKwlib3JkZXItYm90dG9tLWNvbG9yOiAjRTBFMEUwOworCWJvcmRlci1sZWZ0LWNvbG9yOiAjRTBFMEUwOworCWJvcmRlci1yaWdodC1zdHlsZTogbm9uZTsKKwlib3JkZXItYm90dG9tLXN0eWxlOiBub25lOworCWJvcmRlci1sZWZ0LXN0eWxlOiBub25lOworCWJhY2tncm91bmQtY29sb3I6ICNGQUZBRkE7CisJZm9udC1mYW1pbHk6IEdlbmV2YSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKKwlmb250LXNpemU6IDEzcHg7Cit9Cisuc2VhcmNoICAgICB7IGNvbG9yOiAjMDAzMzk5OworICAgICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDsKK30KK0ZPUk0uc2VhcmNoIHsKKyAgICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogMHB4OworICAgICAgICAgICAgICBtYXJnaW4tdG9wOiAwcHg7Cit9CitJTlBVVC5zZWFyY2ggeyBmb250LXNpemU6IDc1JTsKKyAgICAgICAgICAgICAgIGNvbG9yOiAjMDAwMDgwOworICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWVlZmY7Cit9CitURC50aW55ICAgICAgeyBmb250LXNpemU6IDc1JTsKK30KK2EgeworCWNvbG9yOiAjMjUyRTc4OworfQorYTp2aXNpdGVkIHsKKwljb2xvcjogIzNEMjE4NTsKK30KZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9kb3h5Z2VuLnBuZyBiL2RvYy9kb20vaHRtbC9kb3h5Z2VuLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGE1NWY5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL2RveHlnZW4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9maWxlcy5odG1sIGIvZG9jL2RvbS9odG1sL2ZpbGVzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI4YWI4YgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9maWxlcy5odG1sCkBAIC0wLDAgKzEsMTcgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIGxldmVsLTIgRE9NOiBGaWxlIEluZGV4PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXhITCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPjwvZGl2Pg0KKzxoMT5nU09BUCBsZXZlbC0yIERPTSBGaWxlIExpc3Q8L2gxPkhlcmUgaXMgYSBsaXN0IG9mIGFsbCBmaWxlcyB3aXRoIGJyaWVmIGRlc2NyaXB0aW9uczo8dGFibGU+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL2RvbS88YSBjbGFzcz0iZWwiIGhyZWY9ImRvbV84Y3BwLmh0bWwiPmRvbS5jcHA8L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPjwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvZG9tLzxhIGNsYXNzPSJlbCIgaHJlZj0iZG9tXzhoLmh0bWwiPmRvbS5oPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj48L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL2RvbS88YSBjbGFzcz0iZWwiIGhyZWY9InN0ZHNvYXAyXzhoLmh0bWwiPnN0ZHNvYXAyLmg8L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPjwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBTYXQgQXVnIDIwIDEyOjI0OjM2IDIwMDUgZm9yIGdTT0FQIGxldmVsLTIgRE9NIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvZnVuY3Rpb25zLmh0bWwgYi9kb2MvZG9tL2h0bWwvZnVuY3Rpb25zLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI5ZTkyMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9mdW5jdGlvbnMuaHRtbApAQCAtMCwwICsxLDgyIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBsZXZlbC0yIERPTTogQ2xhc3MgTWVtYmVyczwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4SEwiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT48L2Rpdj4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXhITCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkFsbDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnNfZnVuYy5odG1sIj5GdW5jdGlvbnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zX3ZhcnMuaHRtbCI+VmFyaWFibGVzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9uc190eXBlLmh0bWwiPlR5cGVkZWZzPC9hPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iI2luZGV4X2EiPmE8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iI2luZGV4X2IiPmI8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iI2luZGV4X2QiPmQ8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iI2luZGV4X2UiPmU8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iI2luZGV4X2YiPmY8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iI2luZGV4X2giPmg8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iI2luZGV4X2kiPmk8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iI2luZGV4X24iPm48L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iI2luZGV4X28iPm88L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iI2luZGV4X3AiPnA8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iI2luZGV4X3MiPnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iI2luZGV4X3QiPnQ8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iI2luZGV4X3UiPnU8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iI2luZGV4X3ciPnc8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iI2luZGV4X34iPn48L2E+PC9kaXY+DQorDQorPHA+DQorDQorPHA+DQorSGVyZSBpcyBhIGxpc3Qgb2YgYWxsIGNsYXNzIG1lbWJlcnMgd2l0aCBsaW5rcyB0byB0aGUgY2xhc3NlcyB0aGV5IGJlbG9uZyB0bzo8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfYSI+LSBhIC08L2E+PC9oMz48dWw+DQorPGxpPmFkZCgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI2E2Ij5zb2FwX2RvbV9lbGVtZW50PC9hPjxsaT5hdHQNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2F0dHJpYnV0ZV9faXRlcmF0b3IuaHRtbCNvMCI+c29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yPC9hPjxsaT5hdHRzDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI28zIj5zb2FwX2RvbV9lbGVtZW50PC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X2IiPi0gYiAtPC9hPjwvaDM+PHVsPg0KKzxsaT5iZWdpbigpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI2E3Ij5zb2FwX2RvbV9lbGVtZW50PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI2EyIj5zb2FwX2RvbV9hdHRyaWJ1dGU8L2E+PC91bD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfZCI+LSBkIC08L2E+PC9oMz48dWw+DQorPGxpPmRhdGENCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzYiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwjbzMiPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF9lIj4tIGUgLTwvYT48L2gzPjx1bD4NCis8bGk+ZWx0DQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sI28wIj5zb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yPC9hPjxsaT5lbHRzDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI28yIj5zb2FwX2RvbV9lbGVtZW50PC9hPjxsaT5lbmQoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNhOCI+c29hcF9kb21fZWxlbWVudDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCNhMyI+c29hcF9kb21fYXR0cmlidXRlPC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X2YiPi0gZiAtPC9hPjwvaDM+PHVsPg0KKzxsaT5maW5kKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjYTEwIj5zb2FwX2RvbV9lbGVtZW50PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI2E0Ij5zb2FwX2RvbV9hdHRyaWJ1dGU8L2E+PC91bD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfaCI+LSBoIC08L2E+PC9oMz48dWw+DQorPGxpPmhlYWQNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzEwIj5zb2FwX2RvbV9lbGVtZW50PC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X2kiPi0gaSAtPC9hPjwvaDM+PHVsPg0KKzxsaT5pdGVyYXRvcg0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCN3MCI+c29hcF9kb21fZWxlbWVudDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCN3MCI+c29hcF9kb21fYXR0cmlidXRlPC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X24iPi0gbiAtPC9hPjwvaDM+PHVsPg0KKzxsaT5uYW1lDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI281Ij5zb2FwX2RvbV9lbGVtZW50PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3IuaHRtbCNvMiI+c29hcF9kb21fZWxlbWVudF9pdGVyYXRvcjwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCNvMiI+c29hcF9kb21fYXR0cmlidXRlPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fYXR0cmlidXRlX19pdGVyYXRvci5odG1sI28yIj5zb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I8L2E+PGxpPm5leHQNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzAiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwjbzAiPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT48bGk+bm9kZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvOSI+c29hcF9kb21fZWxlbWVudDwvYT48bGk+bnN0cg0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvNCI+c29hcF9kb21fZWxlbWVudDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2VsZW1lbnRfX2l0ZXJhdG9yLmh0bWwjbzEiPnNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3I8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwjbzEiPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2F0dHJpYnV0ZV9faXRlcmF0b3IuaHRtbCNvMSI+c29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yPC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X28iPi0gbyAtPC9hPjwvaDM+PHVsPg0KKzxsaT5vcGVyYXRvciAqKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2VsZW1lbnRfX2l0ZXJhdG9yLmh0bWwjYTIiPnNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3I8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19hdHRyaWJ1dGVfX2l0ZXJhdG9yLmh0bWwjYTIiPnNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjwvYT48bGk+b3BlcmF0b3IhPSgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sI2ExIj5zb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fYXR0cmlidXRlX19pdGVyYXRvci5odG1sI2ExIj5zb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I8L2E+PGxpPm9wZXJhdG9yKysoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3IuaHRtbCNhMyI+c29hcF9kb21fZWxlbWVudF9pdGVyYXRvcjwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2F0dHJpYnV0ZV9faXRlcmF0b3IuaHRtbCNhMyI+c29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yPC9hPjxsaT5vcGVyYXRvcj09KCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2VsZW1lbnRfX2l0ZXJhdG9yLmh0bWwjYTAiPnNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3I8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19hdHRyaWJ1dGVfX2l0ZXJhdG9yLmh0bWwjYTAiPnNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF9wIj4tIHAgLTwvYT48L2gzPjx1bD4NCis8bGk+cHJudA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvMSI+c29hcF9kb21fZWxlbWVudDwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF9zIj4tIHMgLTwvYT48L2gzPjx1bD4NCis8bGk+c2V0KCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjYTIiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwjYTEiPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT48bGk+c29hcA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvMTIiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwjbzUiPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT48bGk+c29hcF9kb21fYXR0cmlidXRlKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCNhOCI+c29hcF9kb21fYXR0cmlidXRlPC9hPjxsaT5zb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fYXR0cmlidXRlX19pdGVyYXRvci5odG1sI2E1Ij5zb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I8L2E+PGxpPnNvYXBfZG9tX2VsZW1lbnQoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNhMTYiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+PGxpPnNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3IuaHRtbCNhNSI+c29hcF9kb21fZWxlbWVudF9pdGVyYXRvcjwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF90Ij4tIHQgLTwvYT48L2gzPjx1bD4NCis8bGk+dGFpbA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvMTEiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+PGxpPnR5cGUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzgiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sI28zIj5zb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yPC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X3UiPi0gdSAtPC9hPjwvaDM+PHVsPg0KKzxsaT51bmxpbmsoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNhMTEiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwjYTUiPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF93Ij4tIHcgLTwvYT48L2gzPjx1bD4NCis8bGk+d2lkZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvNyI+c29hcF9kb21fZWxlbWVudDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCNvNCI+c29hcF9kb21fYXR0cmlidXRlPC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X34iPi0gfiAtPC9hPjwvaDM+PHVsPg0KKzxsaT5+c29hcF9kb21fYXR0cmlidXRlKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCNhOSI+c29hcF9kb21fYXR0cmlidXRlPC9hPjxsaT5+c29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2F0dHJpYnV0ZV9faXRlcmF0b3IuaHRtbCNhNiI+c29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yPC9hPjxsaT5+c29hcF9kb21fZWxlbWVudCgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI2ExNyI+c29hcF9kb21fZWxlbWVudDwvYT48bGk+fnNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3IuaHRtbCNhNiI+c29hcF9kb21fZWxlbWVudF9pdGVyYXRvcjwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBTYXQgQXVnIDIwIDEyOjI0OjM2IDIwMDUgZm9yIGdTT0FQIGxldmVsLTIgRE9NIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvZnVuY3Rpb25zX2Z1bmMuaHRtbCBiL2RvYy9kb20vaHRtbC9mdW5jdGlvbnNfZnVuYy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZDE2MmMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvZnVuY3Rpb25zX2Z1bmMuaHRtbApAQCAtMCwwICsxLDM1IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBsZXZlbC0yIERPTTogQ2xhc3MgTWVtYmVycyAtIEZ1bmN0aW9uczwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4SEwiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT48L2Rpdj4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5BbGw8L2E+IHwgPGEgY2xhc3M9InFpbmRleEhMIiBocmVmPSJmdW5jdGlvbnNfZnVuYy5odG1sIj5GdW5jdGlvbnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zX3ZhcnMuaHRtbCI+VmFyaWFibGVzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9uc190eXBlLmh0bWwiPlR5cGVkZWZzPC9hPjwvZGl2Pg0KKw0KKzxwPg0KKzx1bD4NCis8bGk+YWRkKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjYTYiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+PGxpPmJlZ2luKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjYTciPnNvYXBfZG9tX2VsZW1lbnQ8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwjYTIiPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT48bGk+ZW5kKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjYTgiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwjYTMiPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT48bGk+ZmluZCgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI2ExMCI+c29hcF9kb21fZWxlbWVudDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCNhNCI+c29hcF9kb21fYXR0cmlidXRlPC9hPjxsaT5vcGVyYXRvciAqKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2VsZW1lbnRfX2l0ZXJhdG9yLmh0bWwjYTIiPnNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3I8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19hdHRyaWJ1dGVfX2l0ZXJhdG9yLmh0bWwjYTIiPnNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjwvYT48bGk+b3BlcmF0b3IhPSgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sI2ExIj5zb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fYXR0cmlidXRlX19pdGVyYXRvci5odG1sI2ExIj5zb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I8L2E+PGxpPm9wZXJhdG9yKysoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3IuaHRtbCNhMyI+c29hcF9kb21fZWxlbWVudF9pdGVyYXRvcjwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2F0dHJpYnV0ZV9faXRlcmF0b3IuaHRtbCNhMyI+c29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yPC9hPjxsaT5vcGVyYXRvcj09KCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2VsZW1lbnRfX2l0ZXJhdG9yLmh0bWwjYTAiPnNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3I8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19hdHRyaWJ1dGVfX2l0ZXJhdG9yLmh0bWwjYTAiPnNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjwvYT48bGk+c2V0KCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjYTIiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwjYTEiPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT48bGk+c29hcF9kb21fYXR0cmlidXRlKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCNhOCI+c29hcF9kb21fYXR0cmlidXRlPC9hPjxsaT5zb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fYXR0cmlidXRlX19pdGVyYXRvci5odG1sI2E1Ij5zb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I8L2E+PGxpPnNvYXBfZG9tX2VsZW1lbnQoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNhMTYiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+PGxpPnNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3IuaHRtbCNhNSI+c29hcF9kb21fZWxlbWVudF9pdGVyYXRvcjwvYT48bGk+dW5saW5rKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjYTExIj5zb2FwX2RvbV9lbGVtZW50PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI2E1Ij5zb2FwX2RvbV9hdHRyaWJ1dGU8L2E+PGxpPn5zb2FwX2RvbV9hdHRyaWJ1dGUoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI2E5Ij5zb2FwX2RvbV9hdHRyaWJ1dGU8L2E+PGxpPn5zb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fYXR0cmlidXRlX19pdGVyYXRvci5odG1sI2E2Ij5zb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I8L2E+PGxpPn5zb2FwX2RvbV9lbGVtZW50KCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjYTE3Ij5zb2FwX2RvbV9lbGVtZW50PC9hPjxsaT5+c29hcF9kb21fZWxlbWVudF9pdGVyYXRvcigpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sI2E2Ij5zb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFNhdCBBdWcgMjAgMTI6MjQ6MzYgMjAwNSBmb3IgZ1NPQVAgbGV2ZWwtMiBET00gYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9mdW5jdGlvbnNfdHlwZS5odG1sIGIvZG9jL2RvbS9odG1sL2Z1bmN0aW9uc190eXBlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRiNDZiOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9mdW5jdGlvbnNfdHlwZS5odG1sCkBAIC0wLDAgKzEsMTggQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIGxldmVsLTIgRE9NOiBDbGFzcyBNZW1iZXJzIC0gVHlwZWRlZnM8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleEhMIiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+PC9kaXY+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+QWxsPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9uc19mdW5jLmh0bWwiPkZ1bmN0aW9uczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnNfdmFycy5odG1sIj5WYXJpYWJsZXM8L2E+IHwgPGEgY2xhc3M9InFpbmRleEhMIiBocmVmPSJmdW5jdGlvbnNfdHlwZS5odG1sIj5UeXBlZGVmczwvYT48L2Rpdj4NCisNCis8cD4NCis8dWw+DQorPGxpPml0ZXJhdG9yDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI3cwIj5zb2FwX2RvbV9lbGVtZW50PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI3cwIj5zb2FwX2RvbV9hdHRyaWJ1dGU8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gU2F0IEF1ZyAyMCAxMjoyNDozNiAyMDA1IGZvciBnU09BUCBsZXZlbC0yIERPTSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL2Z1bmN0aW9uc192YXJzLmh0bWwgYi9kb2MvZG9tL2h0bWwvZnVuY3Rpb25zX3ZhcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmMxYmY4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL2Z1bmN0aW9uc192YXJzLmh0bWwKQEAgLTAsMCArMSwzMiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgbGV2ZWwtMiBET006IENsYXNzIE1lbWJlcnMgLSBWYXJpYWJsZXM8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleEhMIiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+PC9kaXY+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+QWxsPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9uc19mdW5jLmh0bWwiPkZ1bmN0aW9uczwvYT4gfCA8YSBjbGFzcz0icWluZGV4SEwiIGhyZWY9ImZ1bmN0aW9uc192YXJzLmh0bWwiPlZhcmlhYmxlczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnNfdHlwZS5odG1sIj5UeXBlZGVmczwvYT48L2Rpdj4NCisNCis8cD4NCis8dWw+DQorPGxpPmF0dA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fYXR0cmlidXRlX19pdGVyYXRvci5odG1sI28wIj5zb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I8L2E+PGxpPmF0dHMNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzMiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+PGxpPmRhdGENCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzYiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwjbzMiPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT48bGk+ZWx0DQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sI28wIj5zb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yPC9hPjxsaT5lbHRzDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI28yIj5zb2FwX2RvbV9lbGVtZW50PC9hPjxsaT5oZWFkDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI28xMCI+c29hcF9kb21fZWxlbWVudDwvYT48bGk+bmFtZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvNSI+c29hcF9kb21fZWxlbWVudDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2VsZW1lbnRfX2l0ZXJhdG9yLmh0bWwjbzIiPnNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3I8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwjbzIiPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2F0dHJpYnV0ZV9faXRlcmF0b3IuaHRtbCNvMiI+c29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yPC9hPjxsaT5uZXh0DQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI28wIj5zb2FwX2RvbV9lbGVtZW50PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI28wIj5zb2FwX2RvbV9hdHRyaWJ1dGU8L2E+PGxpPm5vZGUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzkiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+PGxpPm5zdHINCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzQiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sI28xIj5zb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI28xIj5zb2FwX2RvbV9hdHRyaWJ1dGU8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19hdHRyaWJ1dGVfX2l0ZXJhdG9yLmh0bWwjbzEiPnNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjwvYT48bGk+cHJudA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvMSI+c29hcF9kb21fZWxlbWVudDwvYT48bGk+c29hcA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvMTIiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwjbzUiPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT48bGk+dGFpbA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvMTEiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+PGxpPnR5cGUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzgiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sI28zIj5zb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yPC9hPjxsaT53aWRlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI283Ij5zb2FwX2RvbV9lbGVtZW50PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI280Ij5zb2FwX2RvbV9hdHRyaWJ1dGU8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gU2F0IEF1ZyAyMCAxMjoyNDozNiAyMDA1IGZvciBnU09BUCBsZXZlbC0yIERPTSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL2dsb2JhbHMuaHRtbCBiL2RvYy9kb20vaHRtbC9nbG9iYWxzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBjMmE1MgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9nbG9iYWxzLmh0bWwKQEAgLTAsMCArMSwzNyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgbGV2ZWwtMiBET006IEZpbGUgTWVtYmVyczwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXhITCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT48L2Rpdj4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXhITCIgaHJlZj0iZ2xvYmFscy5odG1sIj5BbGw8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFsc19mdW5jLmh0bWwiPkZ1bmN0aW9uczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzX3R5cGUuaHRtbCI+VHlwZWRlZnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFsc19kZWZzLmh0bWwiPkRlZmluZXM8L2E+PC9kaXY+DQorDQorPHA+DQorSGVyZSBpcyBhIGxpc3Qgb2YgYWxsIGZpbGUgbWVtYmVycyB3aXRoIGxpbmtzIHRvIHRoZSBmaWxlcyB0aGV5IGJlbG9uZyB0bzo8dWw+DQorPGxpPm9wZXJhdG9yJmx0OyZsdDsoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdGRzb2FwMl84aC5odG1sI2EzIj5zdGRzb2FwMi5oPC9hPjxsaT5vcGVyYXRvciZndDsmZ3Q7KCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3Rkc29hcDJfOGguaHRtbCNhNCI+c3Rkc29hcDIuaDwvYT48bGk+b3V0X2F0dHJpYnV0ZSgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImRvbV84Y3BwLmh0bWwjYTEzIj5kb20uY3BwPC9hPjxsaT5vdXRfZWxlbWVudCgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImRvbV84Y3BwLmh0bWwjYTEyIj5kb20uY3BwPC9hPjxsaT5zb2FwX2RlZmF1bHRfeHNkX19hbnlUeXBlKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iZG9tXzhjcHAuaHRtbCNhMiI+ZG9tLmNwcDwvYT48bGk+c29hcF9kb21fY3VycmVudF9uc3RyKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3Rkc29hcDJfOGguaHRtbCNhMCI+c3Rkc29hcDIuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iZG9tXzhjcHAuaHRtbCNhMTQiPmRvbS5jcHA8L2E+PGxpPnNvYXBfZG9tX25leHRfYXR0cmlidXRlKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3Rkc29hcDJfOGguaHRtbCNhMiI+c3Rkc29hcDIuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iZG9tXzhjcHAuaHRtbCNhMTYiPmRvbS5jcHA8L2E+PGxpPnNvYXBfZG9tX25leHRfZWxlbWVudCgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0ZHNvYXAyXzhoLmh0bWwjYTEiPnN0ZHNvYXAyLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImRvbV84Y3BwLmh0bWwjYTE1Ij5kb20uY3BwPC9hPjxsaT5TT0FQX0RPTUlEX0ZPUk1BVA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJkb21fOGNwcC5odG1sI2EwIj5kb20uY3BwPC9hPjxsaT5zb2FwX2VudGVyX25zKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iZG9tXzhjcHAuaHRtbCNhMTEiPmRvbS5jcHA8L2E+PGxpPnNvYXBfZ2V0X3hzZF9fYW55VHlwZSgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImRvbV84Y3BwLmh0bWwjYTUiPmRvbS5jcHA8L2E+PGxpPnNvYXBfZ2V0ZWxlbWVudCgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImRvbV84Y3BwLmh0bWwjYTkiPmRvbS5jcHA8L2E+PGxpPnNvYXBfaW5feHNkX19hbnlUeXBlKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iZG9tXzhjcHAuaHRtbCNhNiI+ZG9tLmNwcDwvYT48bGk+c29hcF9sb29rdXBfbnMoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJkb21fOGNwcC5odG1sI2ExMCI+ZG9tLmNwcDwvYT48bGk+c29hcF9tYXJrZWxlbWVudCgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImRvbV84Y3BwLmh0bWwjYTciPmRvbS5jcHA8L2E+PGxpPnNvYXBfb3V0X3hzZF9fYW55VHlwZSgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImRvbV84Y3BwLmh0bWwjYTQiPmRvbS5jcHA8L2E+PGxpPnNvYXBfcHV0X3hzZF9fYW55VHlwZSgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImRvbV84Y3BwLmh0bWwjYTMiPmRvbS5jcHA8L2E+PGxpPnNvYXBfcHV0ZWxlbWVudCgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImRvbV84Y3BwLmh0bWwjYTgiPmRvbS5jcHA8L2E+PGxpPnNvYXBfc2VyaWFsaXplX3hzZF9fYW55VHlwZSgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImRvbV84Y3BwLmh0bWwjYTEiPmRvbS5jcHA8L2E+PGxpPnhzZF9fYW55VHlwZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJkb21fOGguaHRtbCNhMCI+ZG9tLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gU2F0IEF1ZyAyMCAxMjoyNDozNiAyMDA1IGZvciBnU09BUCBsZXZlbC0yIERPTSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL2dsb2JhbHNfZGVmcy5odG1sIGIvZG9jL2RvbS9odG1sL2dsb2JhbHNfZGVmcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYzYwNWMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvZ2xvYmFsc19kZWZzLmh0bWwKQEAgLTAsMCArMSwxOCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgbGV2ZWwtMiBET006IEZpbGUgTWVtYmVycyAtIERlZmluZXM8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4SEwiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+PC9kaXY+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkFsbDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzX2Z1bmMuaHRtbCI+RnVuY3Rpb25zPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHNfdHlwZS5odG1sIj5UeXBlZGVmczwvYT4gfCA8YSBjbGFzcz0icWluZGV4SEwiIGhyZWY9Imdsb2JhbHNfZGVmcy5odG1sIj5EZWZpbmVzPC9hPjwvZGl2Pg0KKw0KKzxwPg0KKzx1bD4NCis8bGk+U09BUF9ET01JRF9GT1JNQVQNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iZG9tXzhjcHAuaHRtbCNhMCI+ZG9tLmNwcDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBTYXQgQXVnIDIwIDEyOjI0OjM2IDIwMDUgZm9yIGdTT0FQIGxldmVsLTIgRE9NIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvZ2xvYmFsc19lbnVtLmh0bWwgYi9kb2MvZG9tL2h0bWwvZ2xvYmFsc19lbnVtLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNmMmFmMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9nbG9iYWxzX2VudW0uaHRtbApAQCAtMCwwICsxLDE4IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBsZXZlbC0yIERPTTogRmlsZSBNZW1iZXJzIC0gRW51bWVyYXRpb25zPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleEhMIiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5BbGw8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFsc19mdW5jLmh0bWwiPkZ1bmN0aW9uczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzX3ZhcnMuaHRtbCI+VmFyaWFibGVzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHNfdHlwZS5odG1sIj5UeXBlZGVmczwvYT4gfCA8YSBjbGFzcz0icWluZGV4SEwiIGhyZWY9Imdsb2JhbHNfZW51bS5odG1sIj5FbnVtZXJhdGlvbnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFsc19ldmFsLmh0bWwiPkVudW1lcmF0aW9uJm5ic3A7dmFsdWVzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHNfZGVmcy5odG1sIj5EZWZpbmVzPC9hPjwvZGl2Pg0KKw0KKzxwPg0KKzx1bD4NCis8bGk+c29hcF9taW1lX2VuY29kaW5nDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0ZHNvYXAyXzhoLmh0bWwjYTQ2OSI+c3Rkc29hcDIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBUaHUgQXVnIDE4IDExOjI5OjU3IDIwMDUgZm9yIGdTT0FQIGxldmVsLTIgRE9NIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvZ2xvYmFsc19ldmFsLmh0bWwgYi9kb2MvZG9tL2h0bWwvZ2xvYmFsc19ldmFsLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU3OGQ0YwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9nbG9iYWxzX2V2YWwuaHRtbApAQCAtMCwwICsxLDI1IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBsZXZlbC0yIERPTTogRmlsZSBNZW1iZXJzIC0gRW51bWVyYXRpb24gdmFsdWVzPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleEhMIiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5BbGw8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFsc19mdW5jLmh0bWwiPkZ1bmN0aW9uczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzX3ZhcnMuaHRtbCI+VmFyaWFibGVzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHNfdHlwZS5odG1sIj5UeXBlZGVmczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzX2VudW0uaHRtbCI+RW51bWVyYXRpb25zPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXhITCIgaHJlZj0iZ2xvYmFsc19ldmFsLmh0bWwiPkVudW1lcmF0aW9uJm5ic3A7dmFsdWVzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHNfZGVmcy5odG1sIj5EZWZpbmVzPC9hPjwvZGl2Pg0KKw0KKzxwPg0KKzx1bD4NCis8bGk+U09BUF9NSU1FXzdCSVQNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3Rkc29hcDJfOGguaHRtbCNhNDY5YTE5OCI+c3Rkc29hcDIuaDwvYT48bGk+U09BUF9NSU1FXzhCSVQNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3Rkc29hcDJfOGguaHRtbCNhNDY5YTE5OSI+c3Rkc29hcDIuaDwvYT48bGk+U09BUF9NSU1FX0JBU0U2NA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdGRzb2FwMl84aC5odG1sI2E0NjlhMjAyIj5zdGRzb2FwMi5oPC9hPjxsaT5TT0FQX01JTUVfQklOQVJZDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0ZHNvYXAyXzhoLmh0bWwjYTQ2OWEyMDAiPnN0ZHNvYXAyLmg8L2E+PGxpPlNPQVBfTUlNRV9JRVRGX1RPS0VODQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0ZHNvYXAyXzhoLmh0bWwjYTQ2OWEyMDMiPnN0ZHNvYXAyLmg8L2E+PGxpPlNPQVBfTUlNRV9OT05FDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0ZHNvYXAyXzhoLmh0bWwjYTQ2OWExOTciPnN0ZHNvYXAyLmg8L2E+PGxpPlNPQVBfTUlNRV9RVU9URURfUFJJTlRBQkxFDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0ZHNvYXAyXzhoLmh0bWwjYTQ2OWEyMDEiPnN0ZHNvYXAyLmg8L2E+PGxpPlNPQVBfTUlNRV9YX1RPS0VODQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0ZHNvYXAyXzhoLmh0bWwjYTQ2OWEyMDQiPnN0ZHNvYXAyLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gVGh1IEF1ZyAxOCAxMToyOTo1NyAyMDA1IGZvciBnU09BUCBsZXZlbC0yIERPTSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL2dsb2JhbHNfZnVuYy5odG1sIGIvZG9jL2RvbS9odG1sL2dsb2JhbHNfZnVuYy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMjJkMjkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvZ2xvYmFsc19mdW5jLmh0bWwKQEAgLTAsMCArMSwzNSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgbGV2ZWwtMiBET006IEZpbGUgTWVtYmVycyAtIEZ1bmN0aW9uczwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXhITCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT48L2Rpdj4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+QWxsPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXhITCIgaHJlZj0iZ2xvYmFsc19mdW5jLmh0bWwiPkZ1bmN0aW9uczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzX3R5cGUuaHRtbCI+VHlwZWRlZnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFsc19kZWZzLmh0bWwiPkRlZmluZXM8L2E+PC9kaXY+DQorDQorPHA+DQorPHVsPg0KKzxsaT5vcGVyYXRvciZsdDsmbHQ7KCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3Rkc29hcDJfOGguaHRtbCNhMyI+c3Rkc29hcDIuaDwvYT48bGk+b3BlcmF0b3ImZ3Q7Jmd0OygpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0ZHNvYXAyXzhoLmh0bWwjYTQiPnN0ZHNvYXAyLmg8L2E+PGxpPm91dF9hdHRyaWJ1dGUoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJkb21fOGNwcC5odG1sI2ExMyI+ZG9tLmNwcDwvYT48bGk+b3V0X2VsZW1lbnQoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJkb21fOGNwcC5odG1sI2ExMiI+ZG9tLmNwcDwvYT48bGk+c29hcF9kZWZhdWx0X3hzZF9fYW55VHlwZSgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImRvbV84Y3BwLmh0bWwjYTIiPmRvbS5jcHA8L2E+PGxpPnNvYXBfZG9tX2N1cnJlbnRfbnN0cigpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0ZHNvYXAyXzhoLmh0bWwjYTAiPnN0ZHNvYXAyLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImRvbV84Y3BwLmh0bWwjYTE0Ij5kb20uY3BwPC9hPjxsaT5zb2FwX2RvbV9uZXh0X2F0dHJpYnV0ZSgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0ZHNvYXAyXzhoLmh0bWwjYTIiPnN0ZHNvYXAyLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImRvbV84Y3BwLmh0bWwjYTE2Ij5kb20uY3BwPC9hPjxsaT5zb2FwX2RvbV9uZXh0X2VsZW1lbnQoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdGRzb2FwMl84aC5odG1sI2ExIj5zdGRzb2FwMi5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJkb21fOGNwcC5odG1sI2ExNSI+ZG9tLmNwcDwvYT48bGk+c29hcF9lbnRlcl9ucygpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImRvbV84Y3BwLmh0bWwjYTExIj5kb20uY3BwPC9hPjxsaT5zb2FwX2dldF94c2RfX2FueVR5cGUoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJkb21fOGNwcC5odG1sI2E1Ij5kb20uY3BwPC9hPjxsaT5zb2FwX2dldGVsZW1lbnQoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJkb21fOGNwcC5odG1sI2E5Ij5kb20uY3BwPC9hPjxsaT5zb2FwX2luX3hzZF9fYW55VHlwZSgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImRvbV84Y3BwLmh0bWwjYTYiPmRvbS5jcHA8L2E+PGxpPnNvYXBfbG9va3VwX25zKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iZG9tXzhjcHAuaHRtbCNhMTAiPmRvbS5jcHA8L2E+PGxpPnNvYXBfbWFya2VsZW1lbnQoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJkb21fOGNwcC5odG1sI2E3Ij5kb20uY3BwPC9hPjxsaT5zb2FwX291dF94c2RfX2FueVR5cGUoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJkb21fOGNwcC5odG1sI2E0Ij5kb20uY3BwPC9hPjxsaT5zb2FwX3B1dF94c2RfX2FueVR5cGUoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJkb21fOGNwcC5odG1sI2EzIj5kb20uY3BwPC9hPjxsaT5zb2FwX3B1dGVsZW1lbnQoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJkb21fOGNwcC5odG1sI2E4Ij5kb20uY3BwPC9hPjxsaT5zb2FwX3NlcmlhbGl6ZV94c2RfX2FueVR5cGUoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJkb21fOGNwcC5odG1sI2ExIj5kb20uY3BwPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFNhdCBBdWcgMjAgMTI6MjQ6MzYgMjAwNSBmb3IgZ1NPQVAgbGV2ZWwtMiBET00gYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9nbG9iYWxzX3R5cGUuaHRtbCBiL2RvYy9kb20vaHRtbC9nbG9iYWxzX3R5cGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDNhMDNlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL2dsb2JhbHNfdHlwZS5odG1sCkBAIC0wLDAgKzEsMTggQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIGxldmVsLTIgRE9NOiBGaWxlIE1lbWJlcnMgLSBUeXBlZGVmczwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXhITCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT48L2Rpdj4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+QWxsPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHNfZnVuYy5odG1sIj5GdW5jdGlvbnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleEhMIiBocmVmPSJnbG9iYWxzX3R5cGUuaHRtbCI+VHlwZWRlZnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFsc19kZWZzLmh0bWwiPkRlZmluZXM8L2E+PC9kaXY+DQorDQorPHA+DQorPHVsPg0KKzxsaT54c2RfX2FueVR5cGUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iZG9tXzhoLmh0bWwjYTAiPmRvbS5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFNhdCBBdWcgMjAgMTI6MjQ6MzYgMjAwNSBmb3IgZ1NPQVAgbGV2ZWwtMiBET00gYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9nbG9iYWxzX3ZhcnMuaHRtbCBiL2RvYy9kb20vaHRtbC9nbG9iYWxzX3ZhcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjk0NjAzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL2dsb2JhbHNfdmFycy5odG1sCkBAIC0wLDAgKzEsMTkgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIGxldmVsLTIgRE9NOiBGaWxlIE1lbWJlcnMgLSBWYXJpYWJsZXM8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4SEwiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+PC9kaXY+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkFsbDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzX2Z1bmMuaHRtbCI+RnVuY3Rpb25zPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXhITCIgaHJlZj0iZ2xvYmFsc192YXJzLmh0bWwiPlZhcmlhYmxlczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzX3R5cGUuaHRtbCI+VHlwZWRlZnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFsc19lbnVtLmh0bWwiPkVudW1lcmF0aW9uczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzX2V2YWwuaHRtbCI+RW51bWVyYXRpb24mbmJzcDt2YWx1ZXM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFsc19kZWZzLmh0bWwiPkRlZmluZXM8L2E+PC9kaXY+DQorDQorPHA+DQorPHVsPg0KKzxsaT5uYW1lc3BhY2VzDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0ZHNvYXAyXzhoLmh0bWwjYTE5NiI+c3Rkc29hcDIuaDwvYT48bGk+c29hcF9kb3VibGVfbmFuDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0ZHNvYXAyXzhoLmh0bWwjYTE5MyI+c3Rkc29hcDIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBUaHUgQXVnIDE4IDExOjI5OjU3IDIwMDUgZm9yIGdTT0FQIGxldmVsLTIgRE9NIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvZ3JhcGhfbGVnZW5kLmRvdCBiL2RvYy9kb20vaHRtbC9ncmFwaF9sZWdlbmQuZG90Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MjA5MjcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvZ3JhcGhfbGVnZW5kLmRvdApAQCAtMCwwICsxLDIyIEBACitkaWdyYXBoIEcKK3sKKyAgZWRnZSBbZm9udG5hbWU9IkhlbHZldGljYSIsZm9udHNpemU9MTAsbGFiZWxmb250bmFtZT0iSGVsdmV0aWNhIixsYWJlbGZvbnRzaXplPTEwXTsKKyAgbm9kZSBbZm9udG5hbWU9IkhlbHZldGljYSIsZm9udHNpemU9MTAsc2hhcGU9cmVjb3JkXTsKKyAgTm9kZTkgW3NoYXBlPSJib3giLGxhYmVsPSJJbmhlcml0ZWQiLGZvbnRzaXplPTEwLGhlaWdodD0wLjIsd2lkdGg9MC40LGZvbnRuYW1lPSJIZWx2ZXRpY2EiLGNvbG9yPSJibGFjayIsc3R5bGU9ImZpbGxlZCIgZm9udGNvbG9yPSJ3aGl0ZSJdOworICBOb2RlMTAgLT4gTm9kZTkgW2Rpcj1iYWNrLGNvbG9yPSJtaWRuaWdodGJsdWUiLGZvbnRzaXplPTEwLHN0eWxlPSJzb2xpZCIsZm9udG5hbWU9IkhlbHZldGljYSJdOworICBOb2RlMTAgW3NoYXBlPSJib3giLGxhYmVsPSJQdWJsaWNCYXNlIixmb250c2l6ZT0xMCxoZWlnaHQ9MC4yLHdpZHRoPTAuNCxmb250bmFtZT0iSGVsdmV0aWNhIixjb2xvcj0iYmxhY2siLFVSTD0iJGNsYXNzUHVibGljQmFzZS5odG1sIl07CisgIE5vZGUxMSAtPiBOb2RlMTAgW2Rpcj1iYWNrLGNvbG9yPSJtaWRuaWdodGJsdWUiLGZvbnRzaXplPTEwLHN0eWxlPSJzb2xpZCIsZm9udG5hbWU9IkhlbHZldGljYSJdOworICBOb2RlMTEgW3NoYXBlPSJib3giLGxhYmVsPSJUcnVuY2F0ZWQiLGZvbnRzaXplPTEwLGhlaWdodD0wLjIsd2lkdGg9MC40LGZvbnRuYW1lPSJIZWx2ZXRpY2EiLGNvbG9yPSJyZWQiLFVSTD0iJGNsYXNzVHJ1bmNhdGVkLmh0bWwiXTsKKyAgTm9kZTEzIC0+IE5vZGU5IFtkaXI9YmFjayxjb2xvcj0iZGFya2dyZWVuIixmb250c2l6ZT0xMCxzdHlsZT0ic29saWQiLGZvbnRuYW1lPSJIZWx2ZXRpY2EiXTsKKyAgTm9kZTEzIFtzaGFwZT0iYm94IixsYWJlbD0iUHJvdGVjdGVkQmFzZSIsZm9udHNpemU9MTAsaGVpZ2h0PTAuMix3aWR0aD0wLjQsZm9udG5hbWU9IkhlbHZldGljYSIsY29sb3I9ImJsYWNrIixVUkw9IiRjbGFzc1Byb3RlY3RlZEJhc2UuaHRtbCJdOworICBOb2RlMTQgLT4gTm9kZTkgW2Rpcj1iYWNrLGNvbG9yPSJmaXJlYnJpY2s0Iixmb250c2l6ZT0xMCxzdHlsZT0ic29saWQiLGZvbnRuYW1lPSJIZWx2ZXRpY2EiXTsKKyAgTm9kZTE0IFtzaGFwZT0iYm94IixsYWJlbD0iUHJpdmF0ZUJhc2UiLGZvbnRzaXplPTEwLGhlaWdodD0wLjIsd2lkdGg9MC40LGZvbnRuYW1lPSJIZWx2ZXRpY2EiLGNvbG9yPSJibGFjayIsVVJMPSIkY2xhc3NQcml2YXRlQmFzZS5odG1sIl07CisgIE5vZGUxNSAtPiBOb2RlOSBbZGlyPWJhY2ssY29sb3I9Im1pZG5pZ2h0Ymx1ZSIsZm9udHNpemU9MTAsc3R5bGU9InNvbGlkIixmb250bmFtZT0iSGVsdmV0aWNhIl07CisgIE5vZGUxNSBbc2hhcGU9ImJveCIsbGFiZWw9IlVuZG9jdW1lbnRlZCIsZm9udHNpemU9MTAsaGVpZ2h0PTAuMix3aWR0aD0wLjQsZm9udG5hbWU9IkhlbHZldGljYSIsY29sb3I9ImdyZXk3NSJdOworICBOb2RlMTYgLT4gTm9kZTkgW2Rpcj1iYWNrLGNvbG9yPSJtaWRuaWdodGJsdWUiLGZvbnRzaXplPTEwLHN0eWxlPSJzb2xpZCIsZm9udG5hbWU9IkhlbHZldGljYSJdOworICBOb2RlMTYgW3NoYXBlPSJib3giLGxhYmVsPSJUZW1wbDwgaW50ID4iLGZvbnRzaXplPTEwLGhlaWdodD0wLjIsd2lkdGg9MC40LGZvbnRuYW1lPSJIZWx2ZXRpY2EiLGNvbG9yPSJibGFjayIsVVJMPSIkY2xhc3NUZW1wbC5odG1sIl07CisgIE5vZGUxNyAtPiBOb2RlMTYgW2Rpcj1iYWNrLGNvbG9yPSJvcmFuZ2UiLGZvbnRzaXplPTEwLHN0eWxlPSJkYXNoZWQiLGxhYmVsPSI8IGludCA+Iixmb250bmFtZT0iSGVsdmV0aWNhIl07CisgIE5vZGUxNyBbc2hhcGU9ImJveCIsbGFiZWw9IlRlbXBsPCBUID4iLGZvbnRzaXplPTEwLGhlaWdodD0wLjIsd2lkdGg9MC40LGZvbnRuYW1lPSJIZWx2ZXRpY2EiLGNvbG9yPSJibGFjayIsVVJMPSIkY2xhc3NUZW1wbC5odG1sIl07CisgIE5vZGUxOCAtPiBOb2RlOSBbZGlyPWJhY2ssY29sb3I9ImRhcmtvcmNoaWQzIixmb250c2l6ZT0xMCxzdHlsZT0iZGFzaGVkIixsYWJlbD0ibV91c2VkQ2xhc3MiLGZvbnRuYW1lPSJIZWx2ZXRpY2EiXTsKKyAgTm9kZTE4IFtzaGFwZT0iYm94IixsYWJlbD0iVXNlZCIsZm9udHNpemU9MTAsaGVpZ2h0PTAuMix3aWR0aD0wLjQsZm9udG5hbWU9IkhlbHZldGljYSIsY29sb3I9ImJsYWNrIixVUkw9IiRjbGFzc1VzZWQuaHRtbCJdOworfQpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL2dyYXBoX2xlZ2VuZC5odG1sIGIvZG9jL2RvbS9odG1sL2dyYXBoX2xlZ2VuZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMDVkZTcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvZ3JhcGhfbGVnZW5kLmh0bWwKQEAgLTAsMCArMSw3NCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgbGV2ZWwtMiBET006IEdyYXBoIExlZ2VuZDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+PC9kaXY+DQorPGgxPkdyYXBoIExlZ2VuZDwvaDE+VGhpcyBwYWdlIGV4cGxhaW5zIGhvdyB0byBpbnRlcnByZXQgdGhlIGdyYXBocyB0aGF0IGFyZSBnZW5lcmF0ZWQgYnkgZG94eWdlbi48cD4NCitDb25zaWRlciB0aGUgZm9sbG93aW5nIGV4YW1wbGU6IDxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPjxzcGFuIGNsYXNzPSJjb21tZW50Ij4vKiEgSW52aXNpYmxlIGNsYXNzIGJlY2F1c2Ugb2YgdHJ1bmNhdGlvbiAqLzwvc3Bhbj4NCis8c3BhbiBjbGFzcz0ia2V5d29yZCI+Y2xhc3MgPC9zcGFuPkludmlzaWJsZSB7IH07DQorPHNwYW4gY2xhc3M9ImNvbW1lbnQiPjwvc3Bhbj4NCis8c3BhbiBjbGFzcz0iY29tbWVudCI+LyohIFRydW5jYXRlZCBjbGFzcywgaW5oZXJpdGFuY2UgcmVsYXRpb24gaXMgaGlkZGVuICovPC9zcGFuPg0KKzxzcGFuIGNsYXNzPSJrZXl3b3JkIj5jbGFzcyA8L3NwYW4+VHJ1bmNhdGVkIDogPHNwYW4gY2xhc3M9ImtleXdvcmQiPnB1YmxpYzwvc3Bhbj4gSW52aXNpYmxlIHsgfTsNCisNCis8c3BhbiBjbGFzcz0iY29tbWVudCI+LyogQ2xhc3Mgbm90IGRvY3VtZW50ZWQgd2l0aCBkb3h5Z2VuIGNvbW1lbnRzICovPC9zcGFuPg0KKzxzcGFuIGNsYXNzPSJrZXl3b3JkIj5jbGFzcyA8L3NwYW4+VW5kb2N1bWVudGVkIHsgfTsNCis8c3BhbiBjbGFzcz0iY29tbWVudCI+PC9zcGFuPg0KKzxzcGFuIGNsYXNzPSJjb21tZW50Ij4vKiEgQ2xhc3MgdGhhdCBpcyBpbmhlcml0ZWQgdXNpbmcgcHVibGljIGluaGVyaXRhbmNlICovPC9zcGFuPg0KKzxzcGFuIGNsYXNzPSJrZXl3b3JkIj5jbGFzcyA8L3NwYW4+UHVibGljQmFzZSA6IDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5wdWJsaWM8L3NwYW4+IFRydW5jYXRlZCB7IH07DQorPHNwYW4gY2xhc3M9ImNvbW1lbnQiPjwvc3Bhbj4NCis8c3BhbiBjbGFzcz0iY29tbWVudCI+LyohIEEgdGVtcGxhdGUgY2xhc3MgKi88L3NwYW4+DQorPHNwYW4gY2xhc3M9ImtleXdvcmQiPnRlbXBsYXRlPC9zcGFuPiZsdDs8c3BhbiBjbGFzcz0ia2V5d29yZCI+Y2xhc3M8L3NwYW4+IFQmZ3Q7IDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5jbGFzcyA8L3NwYW4+VGVtcGwgeyB9Ow0KKzxzcGFuIGNsYXNzPSJjb21tZW50Ij48L3NwYW4+DQorPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8qISBDbGFzcyB0aGF0IGlzIGluaGVyaXRlZCB1c2luZyBwcm90ZWN0ZWQgaW5oZXJpdGFuY2UgKi88L3NwYW4+DQorPHNwYW4gY2xhc3M9ImtleXdvcmQiPmNsYXNzIDwvc3Bhbj5Qcm90ZWN0ZWRCYXNlIHsgfTsNCis8c3BhbiBjbGFzcz0iY29tbWVudCI+PC9zcGFuPg0KKzxzcGFuIGNsYXNzPSJjb21tZW50Ij4vKiEgQ2xhc3MgdGhhdCBpcyBpbmhlcml0ZWQgdXNpbmcgcHJpdmF0ZSBpbmhlcml0YW5jZSAqLzwvc3Bhbj4NCis8c3BhbiBjbGFzcz0ia2V5d29yZCI+Y2xhc3MgPC9zcGFuPlByaXZhdGVCYXNlIHsgfTsNCis8c3BhbiBjbGFzcz0iY29tbWVudCI+PC9zcGFuPg0KKzxzcGFuIGNsYXNzPSJjb21tZW50Ij4vKiEgQ2xhc3MgdGhhdCBpcyB1c2VkIGJ5IHRoZSBJbmhlcml0ZWQgY2xhc3MgKi88L3NwYW4+DQorPHNwYW4gY2xhc3M9ImtleXdvcmQiPmNsYXNzIDwvc3Bhbj5Vc2VkIHsgfTsNCis8c3BhbiBjbGFzcz0iY29tbWVudCI+PC9zcGFuPg0KKzxzcGFuIGNsYXNzPSJjb21tZW50Ij4vKiEgU3VwZXIgY2xhc3MgdGhhdCBpbmhlcml0cyBhIG51bWJlciBvZiBvdGhlciBjbGFzc2VzICovPC9zcGFuPg0KKzxzcGFuIGNsYXNzPSJrZXl3b3JkIj5jbGFzcyA8L3NwYW4+SW5oZXJpdGVkIDogPHNwYW4gY2xhc3M9ImtleXdvcmQiPnB1YmxpYzwvc3Bhbj4gUHVibGljQmFzZSwNCisgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ia2V5d29yZCI+cHJvdGVjdGVkPC9zcGFuPiBQcm90ZWN0ZWRCYXNlLA0KKyAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5wcml2YXRlPC9zcGFuPiBQcml2YXRlQmFzZSwNCisgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ia2V5d29yZCI+cHVibGljPC9zcGFuPiBVbmRvY3VtZW50ZWQNCisgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ia2V5d29yZCI+cHVibGljPC9zcGFuPiBUZW1wbCZsdDtpbnQmZ3Q7DQorew0KKyAgPHNwYW4gY2xhc3M9ImtleXdvcmQiPnByaXZhdGU8L3NwYW4+Og0KKyAgICBVc2VkICptX3VzZWRDbGFzczsNCit9Ow0KKzwvcHJlPjwvZGl2PklmIHRoZSA8Y29kZT5NQVhfRE9UX0dSQVBIX0hFSUdIVDwvY29kZT4gdGFnIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgc2V0IHRvIDI0MCB0aGlzIHdpbGwgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgZ3JhcGg6PHA+DQorPGNlbnRlcj48ZGl2IGFsaWduPSJjZW50ZXIiPg0KKzxpbWcgc3JjPSJncmFwaF9sZWdlbmQucG5nIiBhbHQ9ImdyYXBoX2xlZ2VuZC5wbmciIGFsdD4NCis8L2Rpdj4NCis8L2NlbnRlcj4gPHA+DQorVGhlIGJveGVzIGluIHRoZSBhYm92ZSBncmFwaCBoYXZlIHRoZSBmb2xsb3dpbmcgbWVhbmluZzogPHVsPg0KKzxsaT4NCitBIGZpbGxlZCBibGFjayBib3ggcmVwcmVzZW50cyB0aGUgc3RydWN0IG9yIGNsYXNzIGZvciB3aGljaCB0aGUgZ3JhcGggaXMgZ2VuZXJhdGVkLiA8L2xpPg0KKzxsaT4NCitBIGJveCB3aXRoIGEgYmxhY2sgYm9yZGVyIGRlbm90ZXMgYSBkb2N1bWVudGVkIHN0cnVjdCBvciBjbGFzcy4gPC9saT4NCis8bGk+DQorQSBib3ggd2l0aCBhIGdyZXkgYm9yZGVyIGRlbm90ZXMgYW4gdW5kb2N1bWVudGVkIHN0cnVjdCBvciBjbGFzcy4gPC9saT4NCis8bGk+DQorQSBib3ggd2l0aCBhIHJlZCBib3JkZXIgZGVub3RlcyBhIGRvY3VtZW50ZWQgc3RydWN0IG9yIGNsYXNzIGZvcndoaWNoIG5vdCBhbGwgaW5oZXJpdGFuY2UvY29udGFpbm1lbnQgcmVsYXRpb25zIGFyZSBzaG93bi4gQSBncmFwaCBpcyB0cnVuY2F0ZWQgaWYgaXQgZG9lcyBub3QgZml0IHdpdGhpbiB0aGUgc3BlY2lmaWVkIGJvdW5kYXJpZXMuIDwvbGk+DQorPC91bD4NCitUaGUgYXJyb3dzIGhhdmUgdGhlIGZvbGxvd2luZyBtZWFuaW5nOiA8dWw+DQorPGxpPg0KK0EgZGFyayBibHVlIGFycm93IGlzIHVzZWQgdG8gdmlzdWFsaXplIGEgcHVibGljIGluaGVyaXRhbmNlIHJlbGF0aW9uIGJldHdlZW4gdHdvIGNsYXNzZXMuIDwvbGk+DQorPGxpPg0KK0EgZGFyayBncmVlbiBhcnJvdyBpcyB1c2VkIGZvciBwcm90ZWN0ZWQgaW5oZXJpdGFuY2UuIDwvbGk+DQorPGxpPg0KK0EgZGFyayByZWQgYXJyb3cgaXMgdXNlZCBmb3IgcHJpdmF0ZSBpbmhlcml0YW5jZS4gPC9saT4NCis8bGk+DQorQSBwdXJwbGUgZGFzaGVkIGFycm93IGlzIHVzZWQgaWYgYSBjbGFzcyBpcyBjb250YWluZWQgb3IgdXNlZCBieSBhbm90aGVyIGNsYXNzLiBUaGUgYXJyb3cgaXMgbGFiZWxlZCB3aXRoIHRoZSB2YXJpYWJsZShzKSB0aHJvdWdoIHdoaWNoIHRoZSBwb2ludGVkIGNsYXNzIG9yIHN0cnVjdCBpcyBhY2Nlc3NpYmxlLiA8L2xpPg0KKzxsaT4NCitBIHllbGxvdyBkYXNoZWQgYXJyb3cgZGVub3RlcyBhIHJlbGF0aW9uIGJldHdlZW4gYSB0ZW1wbGF0ZSBpbnN0YW5jZSBhbmQgdGhlIHRlbXBsYXRlIGNsYXNzIGl0IHdhcyBpbnN0YW50aWF0ZWQgZnJvbS4gVGhlIGFycm93IGlzIGxhYmVsZWQgd2l0aCB0aGUgdGVtcGxhdGUgcGFyYW1ldGVycyBvZiB0aGUgaW5zdGFuY2UuIDwvbGk+DQorPC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gU2F0IEF1ZyAyMCAxMjoyNDozNiAyMDA1IGZvciBnU09BUCBsZXZlbC0yIERPTSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL2dyYXBoX2xlZ2VuZC5wbmcgYi9kb2MvZG9tL2h0bWwvZ3JhcGhfbGVnZW5kLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTM0MmI1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL2dyYXBoX2xlZ2VuZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL2luZGV4Lmh0bWwgYi9kb2MvZG9tL2h0bWwvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWYzNDEyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL2luZGV4Lmh0bWwKQEAgLTAsMCArMSwzNDAgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIGxldmVsLTIgRE9NOiBUaGUgZ1NPQVAgbGV2ZWwtMiBET00gcGFyc2VyPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4SEwiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPjwvZGl2Pg0KKzxoMT5UaGUgZ1NPQVAgbGV2ZWwtMiBET00gcGFyc2VyIDwvaDE+DQorPHA+DQorVGhlIGdTT0FQIGxldmVsLTIgRE9NIHBhcnNlciBmZWF0dXJlcyAic21hcnQiIFhNTCBuYW1lc3BhY2UgaGFuZGxpbmcgYW5kIGNhbiBiZSB1c2VkIHRvIG1peCBnU09BUCBYTUwgc2VyaWFsaXplcnMgd2l0aCBwbGFpbiBYTUwgcGFyc2luZy4gVGhlIERPTSBwYXJzZXIgaXMgYWxzbyBhbiBlc3NlbnRpYWwgY29tcG9uZW50IG9mIHRoZSB3c3NlIHBsdWdpbiB0byB2ZXJpZnkgZGlnaXRhbCBzaWduYXR1cmVzLjxwPg0KK1RoZSBET00gcGFyc2VyIGlzIG5vdCBhIHN0YW5kLWFsb25lIGFwcGxpY2F0aW9uLiBUaGUgRE9NIHBhcnNlciBpcyBpbnRlZ3JhdGVkIHdpdGggdGhlIFNPQVAgZW5naW5lIHRvIHBvcHVsYXRlIGEgbm9kZSBzZXQgYW5kIHRvIHJlbmRlciBhIG5vZGUgc2V0IGluIFhNTC48cD4NCitUd28gZmlsZXMgYXJlIG5lZWRlZCB0byB3b3JrIHdpdGggRE9NIG5vZGUgc2V0czo8cD4NCis8dWw+DQorPGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0iZG9tXzhoLmh0bWwiPmRvbS5oPC9hPiB0byB1c2UgYSBET00gbm9kZSBzZXQgaW4gYSBnU09BUCBoZWFkZXIgZmlsZSB3aXRoIHNlcnZpY2UgZGVmaW5pdGlvbnMuPC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJkb21fOGNwcC5odG1sIj5kb20uY3BwPC9hPiAob3IgZG9tLmMpIHRvIGJlIGxpbmtlZCB3aXRoIHlvdXIgYXBwbGljYXRpb24gY29kZS48L2xpPjwvdWw+DQorPGgyPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImRvbV8xIj4NCitEZWNsYXJpbmcgRE9NIE5vZGUgU2V0cyBpbiBhIGdTT0FQIEhlYWRlciBGaWxlPC9hPjwvaDI+DQorVG8gdXNlIHRoZSBET00gbm9kZSBzZXQgd2l0aCB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGRlZmluZWQgaW4gYSBnU09BUCBoZWFkZXIgZmlsZSwgaW1wb3J0IHRoZSA8YSBjbGFzcz0iZWwiIGhyZWY9ImRvbV84aC5odG1sIj5kb20uaDwvYT4gZmlsZSBpbnRvIHlvdXIgaGVhZGVyIGZpbGU6PHA+DQorPGRpdiBjbGFzcz0iZnJhZ21lbnQiPjxwcmU+PHNwYW4gY2xhc3M9InByZXByb2Nlc3NvciI+ICAgICNpbXBvcnQgIjxhIGNsYXNzPSJjb2RlIiBocmVmPSJkb21fOGguaHRtbCI+ZG9tLmg8L2E+Ijwvc3Bhbj4NCis8L3ByZT48L2Rpdj48cD4NCitCeSBpbXBvcnRpbmcgPGEgY2xhc3M9ImVsIiBocmVmPSJkb21fOGguaHRtbCI+ZG9tLmg8L2E+IGEgc3BlY2lhbCBkYXRhIHR5cGUgPGEgY2xhc3M9ImVsIiBocmVmPSJkb21fOGguaHRtbCNhMCI+eHNkX19hbnlUeXBlPC9hPiBpcyBhdmFpbGFibGUgdGhhdCByZXByZXNlbnRzIGEgaGllcmFyY2hpY2FsIERPTSBub2RlIHNldC4gVGhlIERPTSBub2RlIHNldCBkYXRhIHN0cnVjdHVyZSBjYW4gYmUgdXNlZCB3aXRoaW4gc3RydWN0cywgY2xhc3NlcywgU1RMIGNvbnRhaW5lcnMsIGFuZCBhcyBhcmd1bWVudHMgb2Ygc2VydmljZSBvcGVyYXRpb25zLiBGb3IgZXhhbXBsZTo8cD4NCis8ZGl2IGNsYXNzPSJmcmFnbWVudCI+PHByZT48c3BhbiBjbGFzcz0icHJlcHJvY2Vzc29yIj4gICAgI2ltcG9ydCAiPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImRvbV84aC5odG1sIj5kb20uaDwvYT4iPC9zcGFuPg0KKzxzcGFuIGNsYXNzPSJwcmVwcm9jZXNzb3IiPiAgICAjaW1wb3J0ICJ3c3UuaCI8L3NwYW4+DQorICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5jbGFzcyA8L3NwYW4+bnNfX215UHJvZHVjdA0KKyAgICB7IDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5wdWJsaWM8L3NwYW4+Og0KKyAgICAgICAgQDxzcGFuIGNsYXNzPSJrZXl3b3JkdHlwZSI+Y2hhcjwvc3Bhbj4qICAgICAgICAgICAgd3N1X19JZDsNCisgICAgICAgIF93c3VfX1RpbWVzdGFtcCogIHdzdV9fVGltZXN0YW1wOw0KKyAgICAgICAgPHNwYW4gY2xhc3M9ImtleXdvcmR0eXBlIj5jaGFyPC9zcGFuPiogICAgICAgICAgICAgbmFtZTsNCisgICAgICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkdHlwZSI+aW50PC9zcGFuPiAgICAgICAgICAgICAgIFNLVTsNCisgICAgICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkdHlwZSI+ZG91YmxlPC9zcGFuPiAgICAgICAgICAgIHByaWNlOw0KKyAgICAgICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj54c2RfX2FueVR5cGU8L2E+KiAgICAgYW55Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbnNfX215UHJvZHVjdCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgfm5zX19teVByb2R1Y3QoKTsNCisgICAgfTsNCis8L3ByZT48L2Rpdj48cD4NCitJdCBpcyBpbXBvcnRhbnQgdG8gZGVjbGFyZSB0aGUgPGEgY2xhc3M9ImVsIiBocmVmPSJkb21fOGguaHRtbCNhMCI+eHNkX19hbnlUeXBlPC9hPiBhdCB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3Qgb3IgY2xhc3MsIHNpbmNlIHRoZSBET00gcGFyc2VyIGNvbnN1bWVzIGFueSBYTUwgZWxlbWVudCAodGhlIGZpZWxkIG5hbWUsICdhbnknIGluIHRoaXMgY2FzZSwgaXMgaXJyZWxhdmFudCkuIFRodXMsIHRoZSBvdGhlciBmaWVsZHMgbXVzdCBiZSBkZWZpbmVkIGZpcnN0IHRvIGVuc3VyZSB0aGV5IGFyZSBwb3B1bGF0ZWQgZmlyc3QgYmVmb3JlIHRoZSBET00gbm9kZSBzZXQgaXMgcG9wdWxhdGVkIHdpdGggYW55IG5vbi1wcmV2aW91c2x5IG1hdGNoZWQgWE1MIGVsZW1lbnQuPHA+DQorTm90ZSB0aGF0IHdlIGFsc28gaW1wb3J0ZWQgd3N1LmggYXMgYW4gZXhhbXBsZSB0byBzaG93IGhvdyB0byBhZGQgYSB3c3U6SWQgYXR0cmlidXRlIHRvIGEgc3RydWN0IG9yIGNsYXNzIGlmIHdlIHdhbnQgdG8gZGlnaXRhbGx5IHNpZ24gaW5zdGFuY2VzLCBhbmQgaG93IHRvIGFkZCBhIHN0YW5kYXJkaXplZCB3c3U6VGltZXN0YW1wIGVsZW1lbnQgdG8gcmVjb3JkIGNyZWF0aW9uIGFuZCBleHBpcmF0aW9uIHRpbWVzLjxwPg0KK1RvIGNvbXBpbGUsIHJ1biBzb2FwY3BwMiAod2l0aCAtSWltcG9ydCkgYW5kIGNvbXBpbGUgeW91ciBjb2RlIGJ5IGxpbmtpbmcgPGEgY2xhc3M9ImVsIiBocmVmPSJkb21fOGNwcC5odG1sIj5kb20uY3BwPC9hPiAob3IgZG9tLmMgZm9yIEMpLiBOb3RlIHRoYXQgdGhlIERPTSBkYXRhIHN0cnVjdHVyZXMgYXJlIGRlY2xhcmVkIGluIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3Rkc29hcDJfOGguaHRtbCI+c3Rkc29hcDIuaDwvYT4sIHdoaWxlIHRoZSBET00gb3BlcmF0aW9ucyBhcmUgZGVmaW5lZCBpbiA8YSBjbGFzcz0iZWwiIGhyZWY9ImRvbV84Y3BwLmh0bWwiPmRvbS5jcHA8L2E+IChvciBkb20uYyBmb3IgQykuPHA+DQorTWV0aG9kcyB0byBwb3B1bGF0ZSBhbmQgdHJhdmVyc2UgRE9NIG5vZGUgc2V0cyB3aWxsIGJlIGV4cGxhaW5lZCBsYXRlci4gRmlyc3QsIGxldCdzIHRha2UgYSBsb29rIGF0IHBhcnNpbmcgYW5kIGdlbmVyYXRpbmcgWE1MIGRvY3VtZW50cy48aDI+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iZG9tXzIiPg0KK1BhcnNpbmcgYW5kIEdlbmVyYXRpbmcgWE1MPC9hPjwvaDI+DQorVGhlIGZvbGxvd2luZyBleGFtcGxlcyBhc3N1bWUgdGhhdCB0aGUgc29hcGNwcDIgY29tcGlsZXIgd2FzIHVzZWQgb24gYSBoZWFkZXIgZmlsZSAoanVzdCB0aGUgPGEgY2xhc3M9ImVsIiBocmVmPSJkb21fOGguaHRtbCI+ZG9tLmg8L2E+IGZpbGUgd2lsbCBkbykgYW5kIHRoZSBnZW5lcmF0ZWQgc29hcEMuY3BwIG9yIChzb2FwQy5jIGZvciBDKSBjb2RlIHdhcyBjb21waWxlZCBhbmQgbGlua2VkIHdpdGggPGEgY2xhc3M9ImVsIiBocmVmPSJkb21fOGNwcC5odG1sIj5kb20uY3BwPC9hPiAob3IgZG9tLmMgZm9yIEMpLCBzdGRzb2FwMi5jcHAgKG9yIHN0ZHNvYXAyLmMpIGFuZCB0aGUgZXhhbXBsZSBhcHBsaWNhdGlvbiBjb2RlLiBUaGUgZ2VuZXJhdGVkIG5hbWVzcGFjZSB0YWJsZSBzaG91bGQgYWxzbyBiZSB1c2VkLCBzaW5jZSB0aGUgbmFtZXNwYWNlIGJpbmRpbmdzIGFyZSByZWxldmFudCBmb3IgY29uc3VtaW5nIGFuZCBwcm9kdWNpbmcgWE1MIGZvciBET00gbm9kZSBzZXRzLiBUaGVyZWZvcmUsIGVhY2ggb2YgdGhlIGV4YW1wbGUgY29kZXMgaW4gdGhpcyBkb2N1bWVudGF0aW9uIGlzIGFzc3VtZWQgdG8gc3RhcnQgd2l0aCB0aGUgZm9sbG93aW5nIHR3byBpbmNsdWRlczo8cD4NCis8ZGl2IGNsYXNzPSJmcmFnbWVudCI+PHByZT48c3BhbiBjbGFzcz0icHJlcHJvY2Vzc29yIj4gICAgI2luY2x1ZGUgInNvYXBILmgiPC9zcGFuPiAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIGdlbmVyYXRlZCBieSBzb2FwY3BwMjwvc3Bhbj4NCis8c3BhbiBjbGFzcz0icHJlcHJvY2Vzc29yIj4gICAgI2luY2x1ZGUgIm5zLm5zbWFwIjwvc3Bhbj4gPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIGEgbmFtZXNwYWNlIHRhYmxlIHdpdGggdGhlIFhNTCBuYW1lc3BhY2UgdXNlZDwvc3Bhbj4NCis8L3ByZT48L2Rpdj48cD4NCitUaGUgQysrIHN0ZDo6aW9zdHJlYW0gb3BlcmF0b3JzIGFyZSBvdmVybG9hZGVkIHRvIHBhcnNlIFhNTCBvY3RldCBzdHJlYW1zIGludG8gbm9kZSBzZXRzIGFuZCB0byBlbWl0IFhNTCBmcm9tIG5vZGUgc2V0czo8cD4NCis8ZGl2IGNsYXNzPSJmcmFnbWVudCI+PHByZT4gICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiBkb207DQorICAgIGRvbS48YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzEyIj5zb2FwPC9hPiA9IHNvYXBfbmV3MShTT0FQX0RPTV9UUkVFIHwgU09BUF9DX1VURlNUUklORyk7DQorICAgIGNpbiAmZ3Q7Jmd0OyBkb207IDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBwYXJzZSBYTUw8L3NwYW4+DQorICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkZmxvdyI+aWY8L3NwYW4+IChkb20uc29hcC0mZ3Q7ZXJyb3IpDQorICAgICAgLi4uIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBwYXJzZSBlcnJvcjwvc3Bhbj4NCisgICAgY291dCAmbHQ7Jmx0OyBkb207IDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBkaXNwbGF5IFhNTDwvc3Bhbj4NCisgICAgPHNwYW4gY2xhc3M9ImtleXdvcmRmbG93Ij5pZjwvc3Bhbj4gKGRvbS5zb2FwLSZndDtlcnJvcikNCisgICAgICAuLi4gPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIG91dHB1dCBlcnJvcjwvc3Bhbj4NCisgICAgc29hcF9kZXN0cm95KGRvbS5zb2FwKTsNCisgICAgc29hcF9lbmQoZG9tLnNvYXApOw0KKyAgICBzb2FwX2RvbmUoZG9tLnNvYXApOw0KKyAgICBmcmVlKGRvbS5zb2FwKTsNCis8L3ByZT48L2Rpdj48cD4NCitJbiB0aGUgZXhhbXBsZSBhYm92ZSB3ZSBjb3BpZWQgYW4gWE1MIGRvY3VtZW50IGZyb20gc3RkaW4gdG8gc3Rkb3V0LjxwPg0KK0luIEMgd2UgdXNlIHRoZSBET00gInNlcmlhbGl6ZXJzIiB0byBhY2NvbXBsaXNoIHRoaXMgYXMgZm9sbG93czo8cD4NCis8ZGl2IGNsYXNzPSJmcmFnbWVudCI+PHByZT4gICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiBkb207DQorICAgIGRvbS48YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzEyIj5zb2FwPC9hPiA9IHNvYXBfbmV3MShTT0FQX0RPTV9UUkVFIHwgU09BUF9DX1VURlNUUklORyk7DQorICAgIGRvbS48YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzEyIj5zb2FwPC9hPi0mZ3Q7cmVjdmZkID0gc3RkaW47DQorICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkZmxvdyI+aWY8L3NwYW4+IChzb2FwX2JlZ2luX3JlY3YoZG9tLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvMTIiPnNvYXA8L2E+KQ0KKyAgICAgfHwgTlVMTCAhPSA8YSBjbGFzcz0iY29kZSIgaHJlZj0iZG9tXzhjcHAuaHRtbCNhNiI+c29hcF9pbl94c2RfX2FueVR5cGU8L2E+KGRvbS48YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzEyIj5zb2FwPC9hPiwgTlVMTCwgJmFtcDtkb20sIE5VTEwpDQorICAgICB8fCBzb2FwX2VuZF9yZWN2KGRvbS48YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzEyIj5zb2FwPC9hPikpDQorICAgICAgLi4uIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBwYXJzZSBlcnJvcjwvc3Bhbj4NCisgICAgZG9tLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvMTIiPnNvYXA8L2E+LSZndDtzZW5kZmQgPSBzdGRvdXQ7DQorICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkZmxvdyI+aWY8L3NwYW4+IChzb2FwX2JlZ2luX3NlbmQoZG9tLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvMTIiPnNvYXA8L2E+KQ0KKyAgICAgfHwgPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImRvbV84Y3BwLmh0bWwjYTQiPnNvYXBfb3V0X3hzZF9fYW55VHlwZTwvYT4oZG9tLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvMTIiPnNvYXA8L2E+LCBOVUxMLCAwLCAmYW1wO2RvbSwgTlVMTCkNCisgICAgIHx8IHNvYXBfZW5kX3NlbmQoZG9tLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvMTIiPnNvYXA8L2E+KSkNCisgICAgICAuLi4gPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIG91dHB1dCBlcnJvcjwvc3Bhbj4NCisgICAgc29hcF9lbmQoZG9tLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvMTIiPnNvYXA8L2E+KTsNCisgICAgc29hcF9kb25lKGRvbS48YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzEyIj5zb2FwPC9hPik7DQorICAgIGZyZWUoZG9tLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvMTIiPnNvYXA8L2E+KTsNCis8L3ByZT48L2Rpdj48cD4NCitUaGUgU09BUF9ET01fTk9ERSBmbGFnIGlzIHVzZWQgdG8gaW5zdHJ1Y3QgdGhlIHBhcnNlciB0byBwb3B1bGF0ZSBhIERPTSBub2RlIHNldCB3aXRoIGRlc2VyaWFsaXplZCBDIGFuZCBDKysgZGF0YSBzdHJ1Y3R1cmVzIHVzaW5nIHRoZSBkYXRhIHR5cGUncyBkZXNlcmlhbGl6ZXJzIHRoYXQgd2VyZSBnZW5lcmF0ZWQgd2l0aCBzb2FwY3BwMiBmcm9tIGEgaGVhZGVyIGZpbGUgd2l0aCB0aGUgZGF0YSB0eXBlIGRlY2xhcmF0aW9ucy4gU3VwcG9zZSBmb3IgZXhhbXBsZSB0aGF0IHRoZSBmb2xsb3dpbmcgaGVhZGVyIGZpbGUgd2FzIHVzZWQgKGluIGZhY3QsIHRoaXMgZGVjbGFyYXRpb24gYXBwZWFycyBpbiB3c3UuaCk6PHA+DQorPGRpdiBjbGFzcz0iZnJhZ21lbnQiPjxwcmU+ICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkIj50eXBlZGVmPC9zcGFuPiA8c3BhbiBjbGFzcz0ia2V5d29yZCI+c3RydWN0IDwvc3Bhbj5fd3N1X19UaW1lc3RhbXANCisgICAgeyAgIEA8c3BhbiBjbGFzcz0ia2V5d29yZHR5cGUiPmNoYXI8L3NwYW4+KiAgd3N1X19JZDsNCisgICAgICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkdHlwZSI+Y2hhcjwvc3Bhbj4qICAgQ3JlYXRlZDsNCisgICAgICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkdHlwZSI+Y2hhcjwvc3Bhbj4qICAgRXhwaXJlczsNCisgICAgfSBfd3N1X19UaW1lc3RhbXA7DQorPC9wcmU+PC9kaXY+PHA+DQorTm90ZSB0aGF0IHRoZSBsZWFkaW5nIHVuZGVyc2NvcmUgb2YgdGhlIHR5cGUgbmFtZSBpbmRpY2F0ZXMgYW4gWE1MIGVsZW1lbnQgZGVmaW5pdGlvbiAocmF0aGVyIHRoYW4gYSBjb21wbGV4VHlwZSBkZWZpbml0aW9uKSwgc28gdGhlIG5hbWUgb2YgdGhlIGRhdGEgdHlwZSBpcyByZWxldmFudCB3aGVuIGNvbXBhcmluZyBYTUwgZWxlbWVudCB0YWdzIHRvIEMvQysrIGRhdGEgdHlwZXMgYnkgdGhlIGRlc2VyaWFsaXplcnMuPHA+DQorV2hlbiBhbiBYTUwgZG9jdW1lbnQgaXMgcGFyc2VkIHdpdGggb25lIG9yIG1vcmUgJmx0O3dzdTpUaW1lc3RhbXAmZ3Q7IGVsZW1lbnRzLCB0aGUgRE9NIHdpbGwgYmUgYXV0b21hdGljYWxseSBwb3B1bGF0ZWQgd2l0aCB0aGUgX3dzdV9fVGltZXN0YW1wIG9iamVjdHMuIFN1cHBvc2UgdGhlIFhNTCBkb2N1bWVudCByb290IGlzIGEgJmx0O3dzdTpUaW1lc3RhbXAmZ3Q7LCB0aGVuIHRoZSByb290IG5vZGUgb2YgdGhlIERPTSBpcyBhIF93c3VfX1RpbWVzdGFtcCBvYmplY3Q6PHA+DQorPGRpdiBjbGFzcz0iZnJhZ21lbnQiPjxwcmU+ICAgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT4gZG9tOw0KKyAgICBkb20uPGEgY2xhc3M9ImNvZGUiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI28xMiI+c29hcDwvYT4gPSBzb2FwX25ldzEoU09BUF9ET01fTk9ERSk7DQorICAgIGNpbiAmZ3Q7Jmd0OyBkb207IDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBwYXJzZSBYTUw8L3NwYW4+DQorICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkZmxvdyI+aWY8L3NwYW4+IChkb20uc29hcC0mZ3Q7ZXJyb3IpDQorICAgICAgLi4uIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBwYXJzZSBlcnJvcjwvc3Bhbj4NCisgICAgPHNwYW4gY2xhc3M9ImtleXdvcmRmbG93Ij5pZjwvc3Bhbj4gKGRvbS50eXBlID09IFNPQVBfVFlQRV9fd3N1X19UaW1lc3RhbXApDQorICAgIHsgX3dzdV9fVGltZXN0YW1wICp0ID0gKF93c3VfX1RpbWVzdGFtcCopZG9tLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvOSI+bm9kZTwvYT47DQorICAgICAgY291dCAmbHQ7Jmx0OyA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+IlN0YXJ0ICI8L3NwYW4+ICZsdDsmbHQ7ICh0LSZndDtDcmVhdGVkID8gdC0mZ3Q7Q3JlYXRlZCA6IDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iIjwvc3Bhbj4pDQorICAgICAgICAgICAmbHQ7Jmx0OyA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+IiB0aWxsICI8L3NwYW4+ICZsdDsmbHQ7ICh0LSZndDtFeHBpcmVzID8gdC0mZ3Q7RXhwaXJlcyA6IDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iIjwvc3Bhbj4pICZsdDsmbHQ7IGVuZGw7DQorICAgIH0NCis8L3ByZT48L2Rpdj48cD4NCitOb3RlIHRoYXQgdGhlIHNvYXBjcHAyIGNvbXBpbGVyIGdlbmVyYXRlcyBhIHVuaXF1ZSB0eXBlIGlkZW50aWZpY2F0aW9uIGNvbnN0YW50IFNPQVBfVFlQRV9YIGZvciBlYWNoIGRhdGEgdHlwZSBYLCB3aGljaCBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgbm9kZSdzIHR5cGUgaW4gdGhlIGV4YW1wbGUgYWJvdmUuPHA+DQorV2hlbiBvYmplY3RzIG9jY3VyIGRlZXBlciB3aXRoaW4gdGhlIERPTSBub2RlIHNldCB0aGVuIHRoZSBET00gdHJlZSBzaG91bGQgYmUgdHJhdmVyc2VkLiBUaGlzIHN1YmplY3Qgd2lsbCBiZSBkaXNjdXNzZWQgbmV4dC48aDI+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iZG9tXzMiPg0KK1RyYXZlcnNpbmcgYSBET00gTm9kZSBTZXQ8L2E+PC9oMj4NCitUaGUgRE9NIG5vZGUgc2V0IGlzIHRyYXZlcnNlZCB3aXRoIGEgQysrIGl0ZXJhdG9yIG9yIHdpdGggdGhlIEMgZnVuY3Rpb25zIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3Rkc29hcDJfOGguaHRtbCNhMSI+c29hcF9kb21fbmV4dF9lbGVtZW50PC9hPiBhbmQgPGEgY2xhc3M9ImVsIiBocmVmPSJzdGRzb2FwMl84aC5odG1sI2EyIj5zb2FwX2RvbV9uZXh0X2F0dHJpYnV0ZTwvYT4uIEZvciBleGFtcGxlLCB0byB3YWxrIHRoZSBub2RlIHNldCB2aXNpdGluZyBub2RlcyBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGV5IGFwcGVhcmVkIGluIHRoZSBkb2N1bWVudCwgdXNlOjxwPg0KKzxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPiAgICA8YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+IGRvbTsNCisgICAgZG9tLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvMTIiPnNvYXA8L2E+ID0gc29hcF9uZXcxKFNPQVBfRE9NX1RSRUUgfCBTT0FQX0NfVVRGU1RSSU5HKTsNCisgICAgLi4uDQorICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkZmxvdyI+Zm9yPC9zcGFuPiAoPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sIj5zb2FwX2RvbV9lbGVtZW50OjppdGVyYXRvcjwvYT4gaXRlciA9IGRvbS48YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjYTciPmJlZ2luPC9hPigpOyBpdGVyICE9IGRvbS48YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjYTgiPmVuZDwvYT4oKTsgKytpdGVyKQ0KKyAgICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkZmxvdyI+Zm9yPC9zcGFuPiAoPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19hdHRyaWJ1dGVfX2l0ZXJhdG9yLmh0bWwiPnNvYXBfZG9tX2F0dHJpYnV0ZTo6aXRlcmF0b3I8L2E+IGF0dHIgPSAoKml0ZXIpLmF0dHMuYmVnaW4oKTsgYXR0ciAhPSAoKml0ZXIpLmF0dHMuZW5kKCk7ICsrYXR0cikNCisgICAgICAgIC4uLg0KKzwvcHJlPjwvZGl2PjxwPg0KK0luIEMgY29kZSwgdXNlOjxwPg0KKzxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPiAgICA8YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+IGRvbSwgKml0ZXI7DQorICAgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sIj5zb2FwX2RvbV9hdHRyaWJ1dGU8L2E+ICphdHRyOw0KKyAgICBkb20uPGEgY2xhc3M9ImNvZGUiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI28xMiI+c29hcDwvYT4gPSBzb2FwX25ldzEoU09BUF9ET01fVFJFRSB8IFNPQVBfQ19VVEZTVFJJTkcpOw0KKyAgICAuLi4NCisgICAgPHNwYW4gY2xhc3M9ImtleXdvcmRmbG93Ij5mb3I8L3NwYW4+IChpdGVyID0gJmFtcDtkb207IGl0ZXI7IGl0ZXIgPSA8YSBjbGFzcz0iY29kZSIgaHJlZj0iZG9tXzhjcHAuaHRtbCNhMTUiPnNvYXBfZG9tX25leHRfZWxlbWVudDwvYT4oaXRlcikpDQorICAgICAgPHNwYW4gY2xhc3M9ImtleXdvcmRmbG93Ij5mb3I8L3NwYW4+IChhdHRyID0gaXRlci0mZ3Q7PGEgY2xhc3M9ImNvZGUiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI28zIj5hdHRzPC9hPjsgYXR0cjsgYXR0ciA9IDxhIGNsYXNzPSJjb2RlIiBocmVmPSJkb21fOGNwcC5odG1sI2ExNiI+c29hcF9kb21fbmV4dF9hdHRyaWJ1dGU8L2E+KGF0dHIpKQ0KKyAgICAgICAgIC4uLg0KKzwvcHJlPjwvZGl2PjxwPg0KK1RoZSA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiBhbmQgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sIj5zb2FwX2RvbV9hdHRyaWJ1dGU8L2E+IHN0cnVjdHMgZm9ybSBlc3NlbnRpYWxseSBsaW5rZWQgbGlzdHMsIHNvIGl0IHdvdWxkIG5vdCBiZSB0b28gZGlmZmljdWx0IHRvIHdyaXRlIHlvdXIgb3duIHRyZWUgd2Fsa2Vyczo8cD4NCis8dWw+DQorPGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzEiPnNvYXBfZG9tX2VsZW1lbnQ6OnBybnQ8L2E+IHBvaW50cyB0byB0aGUgcGFyZW50IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+IG5vZGUuPC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvMiI+c29hcF9kb21fZWxlbWVudDo6ZWx0czwvYT4gcG9pbnRzIHRvIHRoZSBsaW5rZWQgbGlzdCBvZiBjaGlsZCBlbGVtZW50IG5vZGVzLjwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzMiPnNvYXBfZG9tX2VsZW1lbnQ6OmF0dHM8L2E+IHBvaW50cyB0byB0aGUgbGlua2VkIGxpc3Qgb2YgYXR0cmlidXRlIG5vZGVzLjwvbGk+PC91bD4NCis8cD4NCitUaGUgbGlua2VkIGxpc3RzIG9mIHNpYmxpbmcgZWxlbWVudHMgbm9kZXMgYW5kIGF0dHJpYnV0ZSBub2RlcyBhcmUgcmVzcGVjdGl2ZWx5OjxwPg0KKzx1bD4NCis8bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvMCI+c29hcF9kb21fZWxlbWVudDo6bmV4dDwvYT4gcG9pbnRzIHRvIHRoZSBuZXh0IHNpYmxpbmcgZWxlbWVudCBub2RlLjwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCNvMCI+c29hcF9kb21fYXR0cmlidXRlOjpuZXh0PC9hPiBwb2ludHMgdG8gdGhlIG5leHQgYXR0cmlidXRlIGluIHRoZSBhdHRyaWJ1dGUgbGlzdCBvZiBhbiBlbGVtZW50IG5vZGUuPC9saT48L3VsPg0KKzxwPg0KK05vdGUgdGhhdCBmb3IgYSByb290IG5vZGUsIHRoZSA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI28xIj5zb2FwX2RvbV9lbGVtZW50Ojpwcm50PC9hPiBhbmQgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvMCI+c29hcF9kb21fZWxlbWVudDo6bmV4dDwvYT4gYXJlIGJvdGggTlVMTC48cD4NCitUYWcgbmFtZXMgb2YgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgYXJlIHN0b3JlZCBpbiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI281Ij5zb2FwX2RvbV9lbGVtZW50OjpuYW1lPC9hPiBhbmQgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI28yIj5zb2FwX2RvbV9hdHRyaWJ1dGU6Om5hbWU8L2E+IHN0cmluZ3MsIHJlc3BlY3RpdmVseS4gVGhlIG5hbWVzIGFyZSBVVEYtOCBlbmNvZGVkLjxwPg0KK1hNTCBuYW1lc3BhY2UgYmluZGluZ3MgYXJlIGV4cGxpY2l0bHkgcHJvcGFnYXRlZCB0aHJvdWdob3V0IHRoZSBET00gbm9kZSBzZXQgZm9yIHRob3NlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIHRoYXQgYXJlIG5hbWVzcGFjZSBxdWFsaWZpZWQgKGVpdGhlciB3aXRoIGEgbmFtZXNwYWNlIHByZWZpeCBvciB3aGVuIHRoZXkgb2NjdXIgaW4gYSB4bWxucyBkZWZhdWx0IG5hbWVzcGFjZSBzY29wZSkuIFRoZSBuYW1lc3BhY2VzIGFyZSBzdG9yZWQgaW4gdGhlIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzQiPnNvYXBfZG9tX2VsZW1lbnQ6Om5zdHI8L2E+IGFuZCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwjbzEiPnNvYXBfZG9tX2F0dHJpYnV0ZTo6bnN0cjwvYT4gc3RyaW5ncy4gVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byB0cmF2ZXJzZSBhIERPTSBub2RlIHNldCBhbmQgcHJpbnQgdGhlIGVsZW1lbnRzIHdpdGggdGhlaXIgbmFtZXNwYWNlIFVSSXMgd2hlbiBwcmVzZW50OjxwPg0KKzxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPiAgICA8YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+IGRvbTsNCisgICAgZG9tLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvMTIiPnNvYXA8L2E+ID0gc29hcF9uZXcxKFNPQVBfRE9NX1RSRUUgfCBTT0FQX0NfVVRGU1RSSU5HKTsNCisgICAgY2luICZndDsmZ3Q7IGRvbTsNCisgICAgPHNwYW4gY2xhc3M9ImtleXdvcmRmbG93Ij5mb3I8L3NwYW4+ICg8YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2VsZW1lbnRfX2l0ZXJhdG9yLmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ6Oml0ZXJhdG9yPC9hPiBpdGVyID0gZG9tLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNhNyI+YmVnaW48L2E+KCk7IGl0ZXIgIT0gZG9tLmVuZCgpOyArK2l0ZXIpDQorICAgIHsgY291dCAmbHQ7Jmx0OyA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+IkVsZW1lbnQgIjwvc3Bhbj4gJmx0OyZsdDsgKCppdGVyKS48YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2VsZW1lbnRfX2l0ZXJhdG9yLmh0bWwjbzIiPm5hbWU8L2E+Ow0KKyAgICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkZmxvdyI+aWY8L3NwYW4+ICgoKml0ZXIpLm5zdHIpDQorICAgICAgICBjb3V0ICZsdDsmbHQ7IDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iIGhhcyBuYW1lc3BhY2UgIjwvc3Bhbj4gJmx0OyZsdDsgKCppdGVyKS5uc3RyOw0KKyAgICAgIGNvdXQgJmx0OyZsdDsgZW5kbDsNCisgICAgfQ0KKyAgICBzb2FwX2Rlc3Ryb3koZG9tLnNvYXApOw0KKyAgICBzb2FwX2VuZChkb20uc29hcCk7DQorICAgIHNvYXBfZG9uZShkb20uc29hcCk7DQorICAgIGZyZWUoZG9tLnNvYXApOw0KKzwvcHJlPjwvZGl2PjxwPg0KK1RleHQgY29udGVudCBvZiBhIG5vZGUgaXMgc3RvcmVkIGluIHRoZSA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI282Ij5zb2FwX2RvbV9lbGVtZW50OjpkYXRhPC9hPiBzdHJpbmcgaW4gVVRGLTggZm9ybWF0LiBUaGlzIHN0cmluZyBpcyBwb3B1bGF0ZWQgaWYgdGhlIFNPQVBfQ19VVEZTVFJJTkcgZmxhZyB3YXMgc2V0LiBPdGhlcndpc2UgdGhlIGRhdGEgY29udGVudCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvNyI+c29hcF9kb21fZWxlbWVudDo6d2lkZTwvYT4gd2lkZS1jaGFyYWN0ZXIgc3RyaW5nLjxwPg0KK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBwcmludHMgdGhvc2UgZWxlbWVudCBub2RlcyB0aGF0IGhhdmUgdGV4dCBjb250ZW50IChpbiBVVEYtOCBmb3JtYXQpOjxwPg0KKzxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPiAgICA8YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+IGRvbTsNCisgICAgLi4uDQorICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkZmxvdyI+Zm9yPC9zcGFuPiAoPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sIj5zb2FwX2RvbV9lbGVtZW50OjppdGVyYXRvcjwvYT4gaXRlciA9IGRvbS48YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjYTciPmJlZ2luPC9hPigpOyBpdGVyICE9IGRvbS48YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjYTgiPmVuZDwvYT4oKTsgKytpdGVyKQ0KKyAgICB7IGNvdXQgJmx0OyZsdDsgPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJFbGVtZW50ICI8L3NwYW4+ICZsdDsmbHQ7ICgqaXRlcikuPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sI28yIj5uYW1lPC9hPjsNCisgICAgICA8c3BhbiBjbGFzcz0ia2V5d29yZGZsb3ciPmlmPC9zcGFuPiAoKCppdGVyKS5kYXRhKQ0KKyAgICAgICAgY291dCAmbHQ7Jmx0OyA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+IiA9ICI8L3NwYW4+ICZsdDsmbHQ7ICgqaXRlcikuZGF0YTsNCisgICAgICBjb3V0ICZsdDsmbHQ7IGVuZGw7DQorICAgIH0NCisgICAgLi4uDQorPC9wcmU+PC9kaXY+PHA+DQorV2hlbiBhIERPTSBub2RlIHNldCBjb250YWlucyBkZXNlcmlhbGl6ZWQgb2JqZWN0cyAoZW5hYmxlZCB3aXRoIHRoZSBTT0FQX0RPTV9OT0RFIGZsYWcpLCB0aGUgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvOCI+c29hcF9kb21fZWxlbWVudDo6dHlwZTwvYT4gYW5kIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzkiPnNvYXBfZG9tX2VsZW1lbnQ6Om5vZGU8L2E+IHZhbHVlcyBhcmUgc2V0OjxwPg0KKzxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPiAgICA8YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+IGRvbTsNCisgICAgLi4uDQorICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkZmxvdyI+Zm9yPC9zcGFuPiAoPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sIj5zb2FwX2RvbV9lbGVtZW50OjppdGVyYXRvcjwvYT4gaXRlciA9IGRvbS48YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjYTciPmJlZ2luPC9hPigpOyBpdGVyICE9IGRvbS48YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjYTgiPmVuZDwvYT4oKTsgKytpdGVyKQ0KKyAgICB7IGNvdXQgJmx0OyZsdDsgPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJFbGVtZW50ICI8L3NwYW4+ICZsdDsmbHQ7ICgqaXRlcikuPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sI28yIj5uYW1lPC9hPjsNCisgICAgICA8c3BhbiBjbGFzcz0ia2V5d29yZGZsb3ciPmlmPC9zcGFuPiAoKCppdGVyKS50eXBlKQ0KKyAgICAgICAgY291dCAmbHQ7Jmx0OyA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+IkVsZW1lbnQgIjwvc3Bhbj4gJmx0OyZsdDsgKCppdGVyKS5uYW1lICZsdDsmbHQ7IDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iIGNvbnRhaW5zIGEgZGVzZXJpYWxpemVkIG9iamVjdCI8L3NwYW4+ICZsdDsmbHQ7IGVuZGw7DQorICAgICAgY291dCAmbHQ7Jmx0OyBlbmRsOw0KKyAgICB9DQorICAgIC4uLg0KKzwvcHJlPjwvZGl2PjxwPg0KK1RoZSA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI284Ij5zb2FwX2RvbV9lbGVtZW50Ojp0eXBlPC9hPiBpcyAwIG9yIGEgU09BUF9UWVBFX1ggY29uc3RhbnQsIHdoZXJlIFggaXMgdGhlIG5hbWUgb2YgdGhlIGRlc2VyaWFsaXplZCB0eXBlLiBUaGUgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvOSI+c29hcF9kb21fZWxlbWVudDo6bm9kZTwvYT4gcG9pbnRzIHRvIHRoZSBkZXNlcmlhbGl6ZWQgb2JqZWN0LiBJZiB0aGlzIGlzIGEgY2hhciogc3RyaW5nLCBpdCBwb2ludHMgZGlyZWN0bHkgdG8gdGhlIGNoYXJhY3RlciBzZXF1ZW5jZS48cD4NCitOb3RlOiB0aGUgU09BUF9ET01fVFJFRSBmbGFnIHJlc3RyaWN0cyB0aGUgcGFyc2VyIHRvIERPTSBjb250ZW50IG9ubHksIHNvIGRlc2VyaWFsaXplcnMgaXMgbm90IHVzZWQuIFdoZW4gdGhlIFNPQVBfRE9NX1RSRUUgZmxhZyBpcyBub3QgdXNlZCwgYW4gYXBwcm9wcmlhdGUgZGVzZXJpYWxpemVyIE1BWSBiZSB1c2VkIGJ5IGdTT0FQIHdoZW4gYW4gZWxlbWVudCBjb250YWlucyBhbiBpZCBhdHRyaWJ1dGUgYW5kIGdTT0FQIGNhbiBkZXRlcm1pbmUgdGhlIHR5cGUgZnJvbSB0aGUgaWQgYXR0cmlidXRlIHJlZmVyZW5jZSBhbmQvb3IgdGhlIHhzaTp0eXBlIGF0dHJpYnV0ZSBvZiBhbiBlbGVtZW50LjxoMj48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJkb21fNCI+DQorU2VhcmNoaW5nPC9hPjwvaDI+DQorQ29tbW9uIG9wZXJhdGlvbnMgb24gRE9NIG5vZGUgc2V0cyBpbiBsZXZlbC0yIERPTSBwYXJzZXJzIGFyZSBzZWFyY2hpbmcgYW5kIGZpbHRlcmluZy48cD4NCitGb3IgQysrIGNvZGUsIHRoZSBidWlsdC1pbiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI3cwIj5zb2FwX2RvbV9lbGVtZW50OjppdGVyYXRvcjwvYT4gY2FuIGJlIHVzZWQgdG8gc2VhcmNoIGZvciBtYXRjaGluZyBlbGVtZW50IG5vZGVzLiBDIHByb2dyYW1tZXJzIGFyZSBvdXQgb2YgbHVjayBhcyB0aGV5IHNob3VsZCB3cml0ZSBsb29waW5nIGNvZGUgdG8gc2VhcmNoIGZvciBub2RlcyBleHBsaWNpdGx5LjxwPg0KK1RoZSA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI2E5Ij5zb2FwX2RvbV9lbGVtZW50OjpmaW5kPC9hPiBtZXRob2QgcmV0dXJucyBhIHNlYXJjaCBpdGVyYXRvci4gVGhlIG1ldGhvZCB0YWtlcyBhbiBvcHRpb25hbCBuYW1lc3BhY2UgVVJJIGFuZCBlbGVtZW50IG5hbWUgdG8gbWF0Y2ggZWxlbWVudHMgaW4gdGhlIERPTSBub2RlIHNldC4gRm9yIGV4YW1wbGUsIHRvIGl0ZXJhdGUgb3ZlciBhbGwgInByb2R1Y3QiIGVsZW1lbnRzOjxwPg0KKzxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPiAgICA8YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+IGRvbTsNCisgICAgLi4uDQorICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkZmxvdyI+Zm9yPC9zcGFuPiAoPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sIj5zb2FwX2RvbV9lbGVtZW50OjppdGVyYXRvcjwvYT4gaXRlciA9IGRvbS48YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjYTkiPmZpbmQ8L2E+KE5VTEwsIDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4icHJvZHVjdCI8L3NwYW4+KTsgaXRlciAhPSBkb20uPGEgY2xhc3M9ImNvZGUiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI2E4Ij5lbmQ8L2E+KCk7ICsraXRlcikNCisgICAgICBjb3V0ICZsdDsmbHQ7IDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iRWxlbWVudCAiPC9zcGFuPiAmbHQ7Jmx0OyAoKml0ZXIpLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3IuaHRtbCNvMiI+bmFtZTwvYT4gJmx0OyZsdDsgZW5kbDsNCisgICAgLi4uDQorPC9wcmU+PC9kaXY+PHA+DQorVG8gaXRlcmF0ZSBvdmVyIGFsbCBlbGVtZW50cyBpbiBhIHBhcnRpY3VsYXIgbmFtZXNwYWNlOjxwPg0KKzxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPiAgICA8YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+IGRvbTsNCisgICAgLi4uDQorICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkZmxvdyI+Zm9yPC9zcGFuPiAoPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sIj5zb2FwX2RvbV9lbGVtZW50OjppdGVyYXRvcjwvYT4gaXRlciA9IGRvbS48YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjYTkiPmZpbmQ8L2E+KDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPC9zcGFuPiwgTlVMTCk7IGl0ZXIgIT0gZG9tLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNhOCI+ZW5kPC9hPigpOyArK2l0ZXIpDQorICAgICAgY291dCAmbHQ7Jmx0OyA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+IkVsZW1lbnQgIjwvc3Bhbj4gJmx0OyZsdDsgKCppdGVyKS48YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2VsZW1lbnRfX2l0ZXJhdG9yLmh0bWwjbzIiPm5hbWU8L2E+ICZsdDsmbHQ7IGVuZGw7DQorICAgIC4uLg0KKzwvcHJlPjwvZGl2PjxwPg0KK1NpbmNlIG5hbWVzcGFjZXMgbWF5IGhhdmUgZGlmZmVyZW50IHZlcnNpb24sIGEgJyonIHdpbGRjYXJkIGNhbiBiZSB1c2VkIHdpdGggdGhlIG5hbWVzcGFjZSBzdHJpbmcuIExpa2V3aXNlLCB0YWcgbmFtZXMgbWF5IGJlIG5hbWVzcGFjZSBxdWFsaWZpZWQgd2l0aCBwcmVmaXhlcyB0aGF0IGFyZSBub3QgcmVsZXZhbnQgdG8gdGhlIHNlYXJjaDo8cD4NCis8ZGl2IGNsYXNzPSJmcmFnbWVudCI+PHByZT4gICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiBkb207DQorICAgIC4uLg0KKyAgICA8c3BhbiBjbGFzcz0ia2V5d29yZGZsb3ciPmZvcjwvc3Bhbj4gKDxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3IuaHRtbCI+c29hcF9kb21fZWxlbWVudDo6aXRlcmF0b3I8L2E+IGl0ZXIgPSBkb20uPGEgY2xhc3M9ImNvZGUiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI2E5Ij5maW5kPC9hPig8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+Imh0dHA6Ly93d3cudzMub3JnLypYTUxTY2hlbWEiPC9zcGFuPiwgPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiIqOnNjaGVtYSI8L3NwYW4+KTsgaXRlciAhPSBkb20uPGEgY2xhc3M9ImNvZGUiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI2E4Ij5lbmQ8L2E+KCk7ICsraXRlcikNCisgICAgICBjb3V0ICZsdDsmbHQ7IDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iRWxlbWVudCAiPC9zcGFuPiAmbHQ7Jmx0OyAoKml0ZXIpLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3IuaHRtbCNvMiI+bmFtZTwvYT4gJmx0OyZsdDsgZW5kbDsNCisgICAgLi4uDQorPC9wcmU+PC9kaXY+PHA+DQorVGhpcyBzZWFyY2hlcyBmb3IgcXVhbGlmaWVkIGVsZW1lbnRzIGluIG9uZSBvZiB0aGUgWFNEIG5hbWVzcGFjZXMuPGgyPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImRvbV81Ij4NCitDb25zdHJ1Y3RpbmcgRE9NIE5vZGUgU2V0czwvYT48L2gyPg0KK1RoZSA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI2EwIj5zb2FwX2RvbV9lbGVtZW50OjpzZXQ8L2E+IGFuZCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI2EzIj5zb2FwX2RvbV9lbGVtZW50OjphZGQ8L2E+IG1ldGhvZHMgYXJlIHVzZWQgdG8gZGVjb3JhdGUgYSBET00gbm9kZSBzZXQgd2l0aCBjaGlsZCBlbGVtZW50IG5vZGVzIGFuZCBhdHRyaWJ1dGUgbm9kZXMuIEFwcGxpY2F0aW9uIGRhdGEgd2l0aCBzZXJpYWxpemVycyBjYW4gYmUgaW5jb3Jwb3JhdGVkIGluIHRoZSBub2RlIHNldCBhcyB3ZWxsLjxwPg0KK1RoZSBmb2xsb3dpbmcgZXhhbXBsZXMgYXJlIHNob3duIGluIEMrKy4gQyBwcm9ncmFtbWVycyBjYW4gdXNlIHRoZSA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPjplbHRzIGxpc3QgYW5kIHNvYXBfZG9tX2VsZW1lbnRzOjphdHRzIGxpc3QgdG8gYWRkIGNoaWxkIG5vZGVzIGFuZCBhdHRyaWJ1dGUgbm9kZXMsIHJlc3BlY3RpdmVseS48cD4NCis8ZGl2IGNsYXNzPSJmcmFnbWVudCI+PHByZT4gICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiBkb207DQorICAgIGRvbS48YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzEyIj5zb2FwPC9hPiA9IHNvYXBfbmV3MShTT0FQX0NfVVRGU1RSSU5HIHwgU09BUF9YTUxfSU5ERU5UKTsNCisgICAgPHNwYW4gY2xhc3M9ImtleXdvcmQiPmNvbnN0PC9zcGFuPiA8c3BhbiBjbGFzcz0ia2V5d29yZHR5cGUiPmNoYXI8L3NwYW4+ICpteVVSSSA9IDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iaHR0cDovL3d3dy5teWRvbWFpbi5jb20vbXlwcm9kdWN0cyI8L3NwYW4+Ow0KKyAgICBuc19fbXlQcm9kdWN0IHByb2R1Y3QoKTsNCisgICAgcHJvZHVjdC5zb2FwX2RlZmF1bHQoZG9tLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvMTIiPnNvYXA8L2E+KTsgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIG1ldGhvZCBnZW5lcmF0ZWQgYnkgc29hcGNwcDI8L3NwYW4+DQorICAgIHByb2R1Y3QubmFtZSA9IDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iRXJuaWUiPC9zcGFuPjsNCisgICAgcHJvZHVjdC5TS1UgPSAxMjM7DQorICAgIHByb2R1Y3QucHJpY2UgPSA5Ljk1Ow0KKyAgICBkb20uPGEgY2xhc3M9ImNvZGUiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI2EwIj5zZXQ8L2E+KG15VVJJLCA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+Imxpc3QiPC9zcGFuPik7DQorICAgIGRvbS48YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjYTMiPmFkZDwvYT4oPGEgY2xhc3M9ImNvZGUiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwiPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT4oZG9tLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvMTIiPnNvYXA8L2E+LCBteVVSSSwgPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJ2ZXJzaW9uIjwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iMC45Ijwvc3Bhbj4pKTsNCisgICAgZG9tLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNhMyI+YWRkPC9hPig8YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+KGRvbS48YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzEyIj5zb2FwPC9hPiwgbXlVUkksIDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iZG9jdW1lbnRhdGlvbiI8L3NwYW4+LCA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+Ikxpc3Qgb2YgcHJvZHVjdHMiPC9zcGFuPikpOw0KKyAgICBkb20uPGEgY2xhc3M9ImNvZGUiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI2EzIj5hZGQ8L2E+KDxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT4oZG9tLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvMTIiPnNvYXA8L2E+LCBteVVSSSwgPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJwcm9kdWN0Ijwvc3Bhbj4sIFNPQVBfVFlQRV9uc19fbXlQcm9kdWN0LCAmYW1wO3Byb2R1Y3QpOw0KKyAgICBjb3V0ICZsdDsmbHQ7IGRvbTsNCisgICAgLi4uDQorPC9wcmU+PC9kaXY+PHA+DQorQXNzdW1pbmcgdGhhdCBteVVSSSBpcyBhc3NvY2lhdGVkIHdpdGggbmFtZXNwYWNlIHByZWZpeCAibnMiIGluIHRoZSBuYW1lc3BhY2UgdGFibGUsIHRoZSByZW5kaXRpb24gaXM8cD4NCis8ZGl2IGNsYXNzPSJmcmFnbWVudCI+PHByZT4mbHQ7P3htbCB2ZXJzaW9uPTxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iMS4wIjwvc3Bhbj4gZW5jb2Rpbmc9PHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJVVEYtOCI8L3NwYW4+PyZndDsNCismbHQ7bnM6bGlzdA0KKyAgeG1sbnM6U09BUC1FTlY9PHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI8L3NwYW4+DQorICB4bWxuczpTT0FQLUVOQz08c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIjwvc3Bhbj4NCisgIHhtbG5zOnhzaT08c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIjwvc3Bhbj4NCisgIHhtbG5zOnhzZD08c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIjwvc3Bhbj4NCisgIHhtbG5zOm5zPTxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iaHR0cDovL2RvbWFpbi9zY2hlbWFzL3Byb2R1Y3QueHNkIjwvc3Bhbj4NCisgIHZlcnNpb249PHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiIwLjkiPC9zcGFuPiAmZ3Q7DQorICAgICAgICAmbHQ7bnM6ZG9jdW1lbnRhdGlvbiZndDtMaXN0IG9mIHByb2R1Y3RzJmx0Oy9uczpkb2N1bWVudGF0aW9uJmd0Ow0KKyAgICAgICAgJmx0O25zOnByb2R1Y3QmZ3Q7DQorICAgICAgICAgICAgICAgICZsdDtuYW1lJmd0O0VybmllJmx0Oy9uYW1lJmd0Ow0KKyAgICAgICAgICAgICAgICAmbHQ7U0tVJmd0OzEyMyZsdDsvU0tVJmd0Ow0KKyAgICAgICAgICAgICAgICAmbHQ7cHJpY2UmZ3Q7OS45NSZsdDsvcHJpY2UmZ3Q7DQorICAgICAgICAmbHQ7L25zOnByb2R1Y3QmZ3Q7DQorJmx0Oy9uczpsaXN0Jmd0Ow0KKzwvcHJlPjwvZGl2PjxwPg0KK05vdGUgdGhhdCB0aGUgbmFtZXNwYWNlIHRhYmxlIGNvbnRlbnQgaXMgImR1bXBlZCIgaW50byB0aGUgWE1MIHJlbmRpdGlvbi48cD4NCitUaGUgZ2xvYmFsIG5hbWVzcGFjZSBtYXBwaW5nIHRhYmxlICJuYW1lc3BhY2VzW10iIGNvbnRhaW5zIHRoZSBuYW1lc3BhY2UgYmluZGluZ3MgdGhhdCBzaG91bGQgYmUgbWVhbmluZ2Z1bCB0byB0aGUgYXBwbGljYXRpb24uIFRoZSBzb2FwIGNvbnRleHQgY2FuIGJlIHNldCB0byBhIG5ldyB0YWJsZSBhcyBmb2xsb3dzOjxwPg0KKzxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPiAgICBOYW1lc3BhY2UgbXlOYW1lc3BhY2VzW10gPSB7IHsgPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJucyI8L3NwYW4+LCA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+Ii4uLiI8L3NwYW4+IH0sIC4uLiAsIHsgTlVMTCB9IH07DQorICAgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT4gZG9tOw0KKyAgICBkb20uPGEgY2xhc3M9ImNvZGUiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI28xMiI+c29hcDwvYT4gPSBzb2FwX25ldzEoU09BUF9DX1VURlNUUklORyB8IFNPQVBfWE1MX0lOREVOVCk7DQorICAgIGRvbS48YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzEyIj5zb2FwPC9hPi0mZ3Q7bmFtZXNwYWNlcyA9IG15TmFtZXNwYWNlczsNCis8L3ByZT48L2Rpdj48cD4NCitUbyBwcm9kdWNlIGNsZWFuZXIgWE1MLCB1c2UgdGhlIFNPQVBfWE1MX0NBTk9OSUNBTCBmbGFnIHRvIGluaXRpYXRlIHRoZSBzb2FwIGNvbnRleHQ6PHA+DQorPGRpdiBjbGFzcz0iZnJhZ21lbnQiPjxwcmU+Jmx0O25zOmxpc3QgeG1sbnM6bnM9PHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJodHRwOi8vZG9tYWluL3NjaGVtYXMvcHJvZHVjdC54c2QiPC9zcGFuPiB2ZXJzaW9uPTxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iMC45Ijwvc3Bhbj4gJmd0Ow0KKyAgICAgICAgJmx0O25zOmRvY3VtZW50YXRpb24mZ3Q7TGlzdCBvZiBwcm9kdWN0cyZsdDsvbnM6ZG9jdW1lbnRhdGlvbiZndDsNCisgICAgICAgICZsdDtuczpwcm9kdWN0Jmd0Ow0KKyAgICAgICAgICAgICAgICAmbHQ7bmFtZSZndDtFcm5pZSZsdDsvbmFtZSZndDsNCisgICAgICAgICAgICAgICAgJmx0O1NLVSZndDsxMjMmbHQ7L1NLVSZndDsNCisgICAgICAgICAgICAgICAgJmx0O3ByaWNlJmd0OzkuOTUmbHQ7L3ByaWNlJmd0Ow0KKyAgICAgICAgJmx0Oy9uczpwcm9kdWN0Jmd0Ow0KKyZsdDsvbnM6bGlzdCZndDsNCis8L3ByZT48L2Rpdj48cD4NCitOb3RlIHRoYXQgdGhlIHhtbG5zIGJpbmRpbmdzIGFyZSByZW5kZXJlZCBhdXRvbWF0aWNhbGx5LiBXaGVuIHBhcnNpbmcgYW4gWE1MIGRvY3VtZW50LCB4bWxucyBiaW5kaW5ncyBhcmUgbm90IGFkZGVkIHRvIHRoZSBhdHRyaWJ1dGUgbm9kZSBzZXQuIFRoZSA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI280Ij5zb2FwX2RvbV9lbGVtZW50Ojpuc3RyPC9hPiBhbmQgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI28xIj5zb2FwX2RvbV9hdHRyaWJ1dGU6Om5zdHI8L2E+IG5hbWVzcGFjZSBzdHJpbmdzIGFyZSBzZXQgdG8gcmV0YWluIG5hbWVzcGFjZSBVUklzLiBUaGUgWE1MIHJlbmRlcmluZyBhbGdvcml0aG0gdXNlcyB0aGUgbmFtZXNwYWNlIHN0cmluZ3MgdG8gYWRkIHhtbG5zIGJpbmRpbmdzIHRoYXQgYXJlIG5vdCBhbHJlYWR5IGluIHRoZSBuYW1lc3BhY2UgdGFibGUuPHA+DQorV2hlbiBpdCBpcyBkZXNpcmFibGUgdG8gcmVuZGVyIFhNTCBleGFjdGx5IGFzIHJlcHJlc2VudGVkIGluIHRoZSBET00gbm9kZSBzZXQsIGUuZy4gd2hlbiB4bWxucyBiaW5kaW5ncyBhcmUgZXhwbGljaXRseSBpbmNsdWRlZCBpbiB0aGUgYXR0cmlidXRlIG5vZGUgc2V0LCB1c2UgdGhlIFNPQVBfRE9NX0FTSVMgZmxhZzo8cD4NCis8ZGl2IGNsYXNzPSJmcmFnbWVudCI+PHByZT4gICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiBkb207DQorICAgIGRvbS48YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzEyIj5zb2FwPC9hPiA9IHNvYXBfbmV3MShTT0FQX0NfVVRGU1RSSU5HIHwgU09BUF9ET01fQVNJUyk7DQorPC9wcmU+PC9kaXY+PGgyPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImRvbV82Ij4NCitFeGFtcGxlPC9hPjwvaDI+DQorVGhlIGdTT0FQIGhlYWRlciBmaWxlIGJlbG93IGltcG9ydHMgRE9NIGFuZCBkZWNsYXJlcyB4c2Q6ZmxvYXQgdG8gZW5hYmxlIHNlcmlhbGl6aW5nIGZsb2F0cyBlbWJlZGRlZCB3aXRoaW4gRE9NIG5vZGUgc2V0cyBhbmQgZGVzZXJpYWxpemluZyBmbG9hdHMgdG8gcG9wdWxhdGUgRE9NIG5vZGUgc2V0czo8cD4NCis8ZGl2IGNsYXNzPSJmcmFnbWVudCI+PHByZT48c3BhbiBjbGFzcz0icHJlcHJvY2Vzc29yIj4gICAgI2ltcG9ydCAiPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImRvbV84aC5odG1sIj5kb20uaDwvYT4iPC9zcGFuPg0KKyAgICA8c3BhbiBjbGFzcz0ia2V5d29yZCI+dHlwZWRlZjwvc3Bhbj4gPHNwYW4gY2xhc3M9ImtleXdvcmR0eXBlIj5mbG9hdDwvc3Bhbj4geHNkX19mbG9hdDsNCis8L3ByZT48L2Rpdj48cD4NCitDb25zaWRlciBpbnZva2luZyB0aGUgWE1ldGhvZHMgZGVsYXllZCBzdG9jayBxdW90ZSBzZXJ2aWNlIHRvIG9idGFpbiBhIHN0b2NrIHF1b3RlLiBUaGUgZmxvYXQgZGVzZXJpYWxpemVyIGlzIHVzZWQgdG8gc3RvcmUgdGhlIGZsb2F0aW5nLXBvaW50IHZhbHVlIG9mIGEgc3RvY2sgZ2l2ZW4gdGhhdCB0aGUgJmx0O3Jlc3VsdCZndDsgZWxlbWVudCBoYXMgYW4geHNpOnR5cGU9InhzZDpmbG9hdCIgYXR0cmlidXRlLjxwPg0KKzxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPiAgICA8c3BhbiBjbGFzcz0ia2V5d29yZCI+c3RydWN0IDwvc3Bhbj5zb2FwICpzb2FwID0gc29hcF9uZXcxKFNPQVBfQ19VVEZTVFJJTkcgfCBTT0FQX0RPTV9OT0RFKTsNCisgICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiBlbnZlbG9wZShzb2FwLCA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIjwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iRW52ZWxvcGUiPC9zcGFuPik7DQorICAgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT4gYm9keShzb2FwLCA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIjwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iQm9keSI8L3NwYW4+KTsNCisgICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwiPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT4gZW5jb2RpbmdTdHlsZShzb2FwLCA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIjwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iZW5jb2RpbmdTdHlsZSI8L3NwYW4+LCA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIjwvc3Bhbj4pOw0KKyAgICA8YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+IHJlcXVlc3Qoc29hcCwgPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJ1cm46eG1ldGhvZHMtZGVsYXllZC1xdW90ZXMiPC9zcGFuPiwgPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJnZXRRdW90ZSI8L3NwYW4+KTsNCisgICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiBzeW1ib2woc29hcCwgTlVMTCwgPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJzeW1ib2wiPC9zcGFuPiwgPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJJQk0iPC9zcGFuPik7DQorICAgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT4gcmVzcG9uc2Uoc29hcCk7DQorICAgIGVudmVsb3BlLmFkZChib2R5KTsNCisgICAgYm9keS5hZGQoZW5jb2RpbmdTdHlsZSk7DQorICAgIGJvZHkuYWRkKHJlcXVlc3QpOw0KKyAgICByZXF1ZXN0LmFkZChzeW1ib2wpOw0KKyAgICBjb3V0ICZsdDsmbHQ7IDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iUmVxdWVzdCBtZXNzYWdlOiI8L3NwYW4+ICZsdDsmbHQ7IGVuZGwgJmx0OyZsdDsgZW52ZWxvcGUgJmx0OyZsdDsgZW5kbDsNCisgICAgPHNwYW4gY2xhc3M9ImtleXdvcmRmbG93Ij5pZjwvc3Bhbj4gKHNvYXBfY29ubmVjdChzb2FwLCA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+Imh0dHA6Ly9zZXJ2aWNlcy54bWV0aG9kcy5uZXQvc29hcCI8L3NwYW4+LCA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+IiI8L3NwYW4+KQ0KKyAgICAgfHwgPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImRvbV84Y3BwLmh0bWwjYTQiPnNvYXBfb3V0X3hzZF9fYW55VHlwZTwvYT4oc29hcCwgTlVMTCwgMCwgJmFtcDtlbnZlbG9wZSwgTlVMTCkNCisgICAgIHx8IHNvYXBfZW5kX3NlbmQoc29hcCkNCisgICAgIHx8IHNvYXBfYmVnaW5fcmVjdihzb2FwKQ0KKyAgICAgfHwgTlVMTCAhPSA8YSBjbGFzcz0iY29kZSIgaHJlZj0iZG9tXzhjcHAuaHRtbCNhNiI+c29hcF9pbl94c2RfX2FueVR5cGU8L2E+KHNvYXAsIE5VTEwsICZhbXA7cmVzcG9uc2UsIE5VTEwpDQorICAgICB8fCBzb2FwX2VuZF9yZWN2KHNvYXApDQorICAgICB8fCBzb2FwX2Nsb3Nlc29jayhzb2FwKSkNCisgICAgeyBzb2FwX3ByaW50X2ZhdWx0KHNvYXAsIHN0ZGVycik7DQorICAgICAgc29hcF9wcmludF9mYXVsdF9sb2NhdGlvbihzb2FwLCBzdGRlcnIpOw0KKyAgICB9DQorICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkZmxvdyI+ZWxzZTwvc3Bhbj4NCisgICAgeyBjb3V0ICZsdDsmbHQ7IDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iUmVzcG9uc2UgbWVzc2FnZToiPC9zcGFuPiAmbHQ7Jmx0OyBlbmRsICZsdDsmbHQ7IHJlc3BvbnNlICZsdDsmbHQ7IGVuZGw7DQorICAgICAgPHNwYW4gY2xhc3M9ImtleXdvcmRmbG93Ij5mb3I8L3NwYW4+ICg8YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2VsZW1lbnRfX2l0ZXJhdG9yLmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ6Oml0ZXJhdG9yPC9hPiB3YWxrZXIgPSByZXNwb25zZS5maW5kKFNPQVBfVFlQRV94c2RfX2Zsb2F0KTsgd2Fsa2VyICE9IHJlc3BvbnNlLmVuZCgpOyArK3dhbGtlcikNCisgICAgICAgIGNvdXQgJmx0OyZsdDsgPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJRdW90ZSA9ICI8L3NwYW4+ICZsdDsmbHQ7ICooeHNkX19mbG9hdCopKCp3YWxrZXIpLm5vZGUgJmx0OyZsdDsgZW5kbDsNCisgICAgfQ0KKyAgICBzb2FwX2Rlc3Ryb3koc29hcCk7DQorICAgIHNvYXBfZW5kKHNvYXApOw0KKyAgICBzb2FwX2RvbmUoc29hcCk7DQorICAgIGZyZWUoc29hcCk7DQorPC9wcmU+PC9kaXY+PGgyPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImRvbV83Ij4NCitTdW1tYXJ5PC9hPjwvaDI+DQorVGhlIERPTSBwYXJzZXIgbmVlZHMgYSBzb2FwIGNvbnRleHQgdG8gYWxsb2NhdGUgbm9kZXM6PHA+DQorPGRpdiBjbGFzcz0iZnJhZ21lbnQiPjxwcmU+ICAgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT4gZG9tOw0KKyAgICBkb20uPGEgY2xhc3M9ImNvZGUiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI28xMiI+c29hcDwvYT4gPSBzb2FwX25ldzEoLi4uIGZsYWdzIC4uLik7DQorICAgIC4uLg0KKyAgICBzb2FwX2Rlc3Ryb3koZG9tLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvMTIiPnNvYXA8L2E+KTsNCisgICAgc29hcF9lbmQoZG9tLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvMTIiPnNvYXA8L2E+KTsNCisgICAgc29hcF9kb25lKGRvbS48YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzEyIj5zb2FwPC9hPik7DQorICAgIHNvYXBfZnJlZShkb20uPGEgY2xhc3M9ImNvZGUiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI28xMiI+c29hcDwvYT4pOw0KKzwvcHJlPjwvZGl2PjxwPg0KK1RoZSBub2RlcyBhcmUgcmVtb3ZlZCB3aXRoIHNvYXBfZGVzdHJveSAoZm9yIEMrKykgYW5kIHNvYXBfZW5kLiBUaGUgc29hcF9kb25lIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQgYmVmb3JlIHRoZSBzb2FwIGNvbnRleHQgaXMgZGVhbGxvY2F0ZWQuPHA+DQorVGhlIHNvYXAgY29udGV4dCBmbGFncyB0aGF0IGNvbnRyb2wgdGhlIHBhcnNpbmcgYW5kIHJlbmRpdGlvbiBvZiBYTUwgYXJlOjxwPg0KKzx1bD4NCis8bGk+KG5vIGZsYWcpOiBvbmx5IGVsZW1lbnRzIHdpdGggYW4gaWQgYXR0cmlidXRlIGFyZSBkZXNlcmlhbGl6ZWQgYXMgQy9DKysgZGF0YSB0eXBlcyAod2hlbiBhIGRlc2VyaWFsaXplciBpcyBhdmFpbGFibGUpLiBYTUwgZWxlbWVudHMgd2l0aCBjaGFyYWN0ZXIgZGF0YSBhcmUgZGVzZXJpYWxpemVkIGludG8gdGhlIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzciPnNvYXBfZG9tX2VsZW1lbnQ6OndpZGU8L2E+IGZpZWxkLjwvbGk+PGxpPlNPQVBfQ19VVEZTVFJJTkc6IHN0b3JlIGNoYXJhY3RlciBkYXRhIGluIFVURi04IGZvcm1hdCBpbiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI282Ij5zb2FwX2RvbV9lbGVtZW50OjpkYXRhPC9hPi48L2xpPjxsaT5TT0FQX0NfTUJTVFJJTkc6IHN0b3JlIGNoYXJhY3RlciBkYXRhIGluIG11bHRpLWJ5dGUgZm9ybWF0IGluIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzYiPnNvYXBfZG9tX2VsZW1lbnQ6OmRhdGE8L2E+LCB3aGVyZSB0aGUgZGVjb2RpbmcgZGVwZW5kcyBvbiB0aGUgY3VycmVudCBsb2NhbGljYXRpb24uIFRoZSBwbGF0Zm9ybSBtdXN0IHN1cHBvcnQgTUIgc3RyaW5ncyAoSEFWRV9NQlRPV0MpLjwvbGk+PGxpPlNPQVBfRE9NX1RSRUU6IHByZXZlbnRzIGRlc2VyaWFsaXphdGlvbiBvZiBDL0MrKyBkYXRhIHN0cnVjdHVyZXMgaW50byB0aGUgRE9NLjwvbGk+PGxpPlNPQVBfRE9NX05PREU6IGF0dGVtcHQgdG8gZGVzZXJpYWxpemUgQy9DKysgZGF0YSBzdHJ1Y3R1cmVzIHdoZW4gYSBkZXNlcmlhbGl6ZXIgaXMgYXZhaWxhYmxlLiBBIGRlc2VyaWFsaXplciBpcyBzZWxlY3RlZCBiYXNlZCBvbiB0aGUgZWxlbWVudCBuYW1lIG9yIHRoZSB4c2k6dHlwZSBhdHRyaWJ1dGUuPC9saT48bGk+U09BUF9ET01fQVNJUzogcmVuZGVyIFhNTCAiYXMgaXMiLCBpLmUuIGRvIG5vdCBpbnNlcnQgeG1sbnMgYmluZGluZ3MgZm9yIFVSSXMgc3RvcmVkIGluIG5zdHIuIEFzc3VtZXMgdGhlIERPTSBpcyBzZWxmLWNvbnRhaW5lZC48L2xpPjxsaT5TT0FQX1hNTF9JTkRFTlQ6IHJlbmRlciBYTUwgd2l0aCBpbmRlbnQuPC9saT48bGk+U09BUF9YTUxfQ0FOT05JQ0FMOiByZW5kZXIgWE1MIGluIGV4Yy1jMTRuIGZvcm0uPC9saT48L3VsPg0KKzxwPg0KK1RoZSBET00gdHJhdmVyc2FsIG9wZXJhdGlvbnM6PHA+DQorPHVsPg0KKzxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InN0ZHNvYXAyXzhoLmh0bWwjYTEiPnNvYXBfZG9tX25leHRfZWxlbWVudDwvYT4gcmV0dXJucyB0aGUgbmV4dCBlbGVtZW50IGluIGFuIGluLW9yZGVyIHRyYXZlcnNhbC48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InN0ZHNvYXAyXzhoLmh0bWwjYTIiPnNvYXBfZG9tX25leHRfYXR0cmlidXRlPC9hPiByZXR1cm5zIHRoZSBuZXh0IGF0dHJpYnV0ZSBvZiBhIG5vZGUuPC9saT48L3VsPg0KKzxwPg0KK1RoZSA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiBmaWVsZHM6PHA+DQorPHVsPg0KKzxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI28wIj5zb2FwX2RvbV9lbGVtZW50OjpuZXh0PC9hPiBwb2ludGVyIHRvIG5leHQgc2libGluZyBpbiBsaXN0LjwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzEiPnNvYXBfZG9tX2VsZW1lbnQ6OnBybnQ8L2E+IHBvaW50ZXIgdG8gcGFyZW50IG5vZGUuPC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvMiI+c29hcF9kb21fZWxlbWVudDo6ZWx0czwvYT4gcG9pbnRlciB0byBsaXN0IG9mIGNoaWxkIGVsZW1lbnQgbm9kZXMuPC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvMyI+c29hcF9kb21fZWxlbWVudDo6YXR0czwvYT4gcG9pbnRlciB0byBsaXN0IG9mIGF0dHJpYnV0ZSBub2Rlcy48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI280Ij5zb2FwX2RvbV9lbGVtZW50Ojpuc3RyPC9hPiBvcHRpb25hbCBuYW1lc3BhY2Ugc3RyaW5nIG9mIHRoaXMgbm9kZS48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI281Ij5zb2FwX2RvbV9lbGVtZW50OjpuYW1lPC9hPiB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCBub2RlICh3aXRoIG9wdGlvbmFsIHByZWZpeCkuPC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvNiI+c29hcF9kb21fZWxlbWVudDo6ZGF0YTwvYT4gb3B0aW9uYWwgY2hhcmFjdGVyIGRhdGEgaW4gVVRGLTggZm9ybWF0LjwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzciPnNvYXBfZG9tX2VsZW1lbnQ6OndpZGU8L2E+IG9wdGlvbmFsIGNoYXJhY3RlciBkYXRhIGluIHdpZGUgc3RyaW5nIGZvcm1hdC48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI284Ij5zb2FwX2RvbV9lbGVtZW50Ojp0eXBlPC9hPiBvcHRpb25hbCBTT0FQX1RZUEVfWCB0eXBlIG9mIGEgQy9DKysgZGF0YSBzdHJ1Y3R1cmUgc3RvcmVkIHdpdGggdGhpcyBub2RlLjwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzkiPnNvYXBfZG9tX2VsZW1lbnQ6Om5vZGU8L2E+IG9wdGlvbmFsIHBvaW50ZXIgdG8gdGhlIEMvQysrIGRhdGEgc3RydWN0dXJlIHN0b3JlZCB3aXRoIHRoaXMgbm9kZS48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI28xMCI+c29hcF9kb21fZWxlbWVudDo6aGVhZDwvYT4gb3B0aW9uYWwgbGVhZGluZyB3aGl0ZXNwYWNlIHRvIHRoZSBzdGFydCB0YWcuPC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvMTEiPnNvYXBfZG9tX2VsZW1lbnQ6OnRhaWw8L2E+IG9wdGlvbmFsIGxlYWRpbmcgd2hpdGVzcGFjZSB0byB0aGUgZW5kIHRhZy48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI28xMiI+c29hcF9kb21fZWxlbWVudDo6c29hcDwvYT4gdGhlIHNvYXAgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBub2RlLjwvbGk+PC91bD4NCis8cD4NCitUaGUgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT4gdHlwZXM6PHA+DQorPHVsPg0KKzxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI3cwIj5zb2FwX2RvbV9lbGVtZW50OjppdGVyYXRvcjwvYT48L2xpPjwvdWw+DQorPHA+DQorVGhlIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+IG1ldGhvZHM6PHA+DQorPHVsPg0KKzxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI2EwIj5zb2FwX2RvbV9lbGVtZW50OjpzZXQ8L2E+KG5zdHIsIG5hbWUpOzwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjYTAiPnNvYXBfZG9tX2VsZW1lbnQ6OnNldDwvYT4oZGF0YSk7PC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNhMCI+c29hcF9kb21fZWxlbWVudDo6c2V0PC9hPihub2RlLCB0eXBlKTs8L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI2EzIj5zb2FwX2RvbV9lbGVtZW50OjphZGQ8L2E+KDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+KTs8L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI2EzIj5zb2FwX2RvbV9lbGVtZW50OjphZGQ8L2E+KDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCI+c29hcF9kb21fYXR0cmlidXRlPC9hPik7PC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNhNyI+c29hcF9kb21fZWxlbWVudDo6YmVnaW48L2E+KCk7PC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNhOCI+c29hcF9kb21fZWxlbWVudDo6ZW5kPC9hPigpOzwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjYTkiPnNvYXBfZG9tX2VsZW1lbnQ6OmZpbmQ8L2E+KG5zdHIsIG5hbWUpOzwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjYTkiPnNvYXBfZG9tX2VsZW1lbnQ6OmZpbmQ8L2E+KHR5cGUpOzwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjYTExIj5zb2FwX2RvbV9lbGVtZW50Ojp1bmxpbms8L2E+KCk7PC9saT48L3VsPg0KKzxwPg0KK1RoZSA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiBjb25zdHJ1Y3RvcnM6PHA+DQorPHVsPg0KKzxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPigpOzwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+KHNvYXApOzwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+KHNvYXAsIG5zdHIsIG5hbWUpOzwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+KHNvYXAsIG5zdHIsIG5hbWUsIGRhdGEpOzwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+KHNvYXAsIG5zdHIsIG5hbWUsIG5vZGUsIHR5cGUpOzwvbGk+PC91bD4NCis8cD4NCitUaGUgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sIj5zb2FwX2RvbV9hdHRyaWJ1dGU8L2E+IGZpZWxkczo8cD4NCis8dWw+DQorPGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCNvMCI+c29hcF9kb21fYXR0cmlidXRlOjpuZXh0PC9hPiBwb2ludGVyIHRvIG5leHQgYXR0cmlidXRlIG5vZGUgaW4gbGlzdC48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwjbzEiPnNvYXBfZG9tX2F0dHJpYnV0ZTo6bnN0cjwvYT4gb3B0aW9uYWwgbmFtZXNwYWNlIHN0cmluZyBvZiB0aGlzIG5vZGUuPC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI28yIj5zb2FwX2RvbV9hdHRyaWJ1dGU6Om5hbWU8L2E+IHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgKHdpdGggb3B0aW9uYWwgcHJlZml4KS48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwjbzMiPnNvYXBfZG9tX2F0dHJpYnV0ZTo6ZGF0YTwvYT4gb3B0aW9uYWwgY2hhcmFjdGVyIGRhdGEgaW4gVVRGLTggZm9ybWF0LjwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCNvNSI+c29hcF9kb21fYXR0cmlidXRlOjpzb2FwPC9hPiB0aGUgc29hcCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIG5vZGUuPC9saT48L3VsPg0KKzxwPg0KK1RoZSA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwiPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT4gdHlwZXM6PHA+DQorPHVsPg0KKzxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwjdzAiPnNvYXBfZG9tX2F0dHJpYnV0ZTo6aXRlcmF0b3I8L2E+PC9saT48L3VsPg0KKzxwPg0KK1RoZSA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwiPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT4gbWV0aG9kczo8cD4NCis8dWw+DQorPGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCNhMCI+c29hcF9kb21fYXR0cmlidXRlOjpzZXQ8L2E+KG5zdHIsIG5hbWUpOzwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCNhMCI+c29hcF9kb21fYXR0cmlidXRlOjpzZXQ8L2E+KGRhdGEpOzwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCNhMiI+c29hcF9kb21fYXR0cmlidXRlOjpiZWdpbjwvYT4oKTs8L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwjYTMiPnNvYXBfZG9tX2F0dHJpYnV0ZTo6ZW5kPC9hPigpOzwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCNhNCI+c29hcF9kb21fYXR0cmlidXRlOjpmaW5kPC9hPihuc3RyLCBuYW1lKTs8L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwjYTUiPnNvYXBfZG9tX2F0dHJpYnV0ZTo6dW5saW5rPC9hPigpOzwvbGk+PC91bD4NCis8cD4NCitUaGUgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sIj5zb2FwX2RvbV9hdHRyaWJ1dGU8L2E+IGNvbnN0cnVjdG9yczo8cD4NCis8dWw+DQorPGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCI+c29hcF9kb21fYXR0cmlidXRlPC9hPigpOzwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCI+c29hcF9kb21fYXR0cmlidXRlPC9hPihzb2FwKTs8L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwiPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT4oc29hcCwgbnN0ciwgbmFtZSwgZGF0YSk7IDwvbGk+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gU2F0IEF1ZyAyMCAxMjoyNDozNiAyMDA1IGZvciBnU09BUCBsZXZlbC0yIERPTSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3BhZ2VzLmh0bWwgYi9kb2MvZG9tL2h0bWwvcGFnZXMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWUwZDM5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3BhZ2VzLmh0bWwKQEAgLTAsMCArMSwxNiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgbGV2ZWwtMiBET006IFBhZ2UgSW5kZXg8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXhITCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT5nU09BUCBsZXZlbC0yIERPTSBSZWxhdGVkIFBhZ2VzPC9oMT5IZXJlIGlzIGEgbGlzdCBvZiBhbGwgcmVsYXRlZCBkb2N1bWVudGF0aW9uIHBhZ2VzOjx1bD4NCis8bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJkb20uaHRtbCI+VGhlIGdTT0FQIGxldmVsLTIgRE9NIHBhcnNlcjwvYT4NCisNCis8L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDIwOjU1OjU0IDIwMDUgZm9yIGdTT0FQIGxldmVsLTIgRE9NIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvc3Rkc29hcDJfOGguaHRtbCBiL2RvYy9kb20vaHRtbC9zdGRzb2FwMl84aC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMzM1MTQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvc3Rkc29hcDJfOGguaHRtbApAQCAtMCwwICsxLDIxMSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgbGV2ZWwtMiBET006IC9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy9kb20vc3Rkc29hcDIuaCBGaWxlIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+PC9kaXY+DQorPGgxPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy9kb20vc3Rkc29hcDIuaCBGaWxlIFJlZmVyZW5jZTwvaDE+DQorPHA+DQorVGhpcyBncmFwaCBzaG93cyB3aGljaCBmaWxlcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluY2x1ZGUgdGhpcyBmaWxlOjxwPjxjZW50ZXI+PGltZyBzcmM9InN0ZHNvYXAyXzhoX19kZXBfX2luY2wucG5nIiBib3JkZXI9IjAiIHVzZW1hcD0iI3N0ZHNvYXAyLmhkZXBfbWFwIiBhbHQ9IkluY2x1ZGVkIGJ5IGRlcGVuZGVuY3kgZ3JhcGgiPjwvY2VudGVyPg0KKzxtYXAgbmFtZT0ic3Rkc29hcDIuaGRlcF9tYXAiPg0KKzxhcmVhIGhyZWY9ImRvbV84Y3BwLmh0bWwiIHNoYXBlPSJyZWN0IiBjb29yZHM9IjEzLDE3LDc1LDQ0IiBhbHQ9IiI+DQorPC9tYXA+DQorPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPkNsYXNzZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2xhc3MgJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19hdHRyaWJ1dGVfX2l0ZXJhdG9yLmh0bWwiPnNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0cnVjdCAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCI+c29hcF9kb21fYXR0cmlidXRlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2xhc3MgJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sIj5zb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c3RydWN0ICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5GdW5jdGlvbnM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+U09BUF9GTUFDMSBjb25zdCBjaGFyICpTT0FQX0ZNQUMyJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0ZHNvYXAyXzhoLmh0bWwjYTAiPnNvYXBfZG9tX2N1cnJlbnRfbnN0cjwvYT4gKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5TT0FQX0ZNQUMxIHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiA8YnI+DQorKlNPQVBfRk1BQzImbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3Rkc29hcDJfOGguaHRtbCNhMSI+c29hcF9kb21fbmV4dF9lbGVtZW50PC9hPiAoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+ICplbHQpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5TT0FQX0ZNQUMxIHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwiPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT4gPGJyPg0KKypTT0FQX0ZNQUMyJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0ZHNvYXAyXzhoLmh0bWwjYTIiPnNvYXBfZG9tX25leHRfYXR0cmlidXRlPC9hPiAoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCI+c29hcF9kb21fYXR0cmlidXRlPC9hPiAqYXR0KTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c3RkOjpvc3RyZWFtICZhbXA7Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0ZHNvYXAyXzhoLmh0bWwjYTMiPm9wZXJhdG9yJmx0OyZsdDs8L2E+IChzdGQ6Om9zdHJlYW0gJmFtcDssIGNvbnN0IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiAmYW1wOyk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0ZDo6aXN0cmVhbSAmYW1wOyZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdGRzb2FwMl84aC5odG1sI2E0Ij5vcGVyYXRvciZndDsmZ3Q7PC9hPiAoc3RkOjppc3RyZWFtICZhbXA7LCBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT4gJmFtcDspPC90ZD48L3RyPg0KKw0KKzwvdGFibGU+DQorPGhyPjxoMj5GdW5jdGlvbiBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMyIgZG94eXRhZz0ic3Rkc29hcDIuaDo6b3BlcmF0b3I8PCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdGQ6Om9zdHJlYW0mYW1wOyBvcGVyYXRvciZsdDsmbHQ7ICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RkOjpvc3RyZWFtICZhbXA7Jm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiAmYW1wOyZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNCIgZG94eXRhZz0ic3Rkc29hcDIuaDo6b3BlcmF0b3I+PiIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdGQ6OmlzdHJlYW0mYW1wOyBvcGVyYXRvciZndDsmZ3Q7ICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RkOjppc3RyZWFtICZhbXA7Jm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPnN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiAmYW1wOyZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMCIgZG94eXRhZz0ic3Rkc29hcDIuaDo6c29hcF9kb21fY3VycmVudF9uc3RyIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IFNPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX2RvbV9jdXJyZW50X25zdHIgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnRhZzwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMiIgZG94eXRhZz0ic3Rkc29hcDIuaDo6c29hcF9kb21fbmV4dF9hdHRyaWJ1dGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gU09BUF9GTUFDMSBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sIj5zb2FwX2RvbV9hdHRyaWJ1dGU8L2E+KiBTT0FQX0ZNQUMyIHNvYXBfZG9tX25leHRfYXR0cmlidXRlICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCI+c29hcF9kb21fYXR0cmlidXRlPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiA8ZW0+YXR0PC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMSIgZG94eXRhZz0ic3Rkc29hcDIuaDo6c29hcF9kb21fbmV4dF9lbGVtZW50IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IFNPQVBfRk1BQzEgc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+KiBTT0FQX0ZNQUMyIHNvYXBfZG9tX25leHRfZWxlbWVudCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiA8ZW0+ZWx0PC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gU2F0IEF1ZyAyMCAxMjoyNDozNiAyMDA1IGZvciBnU09BUCBsZXZlbC0yIERPTSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0ZHNvYXAyXzhoX19kZXBfX2luY2wubWFwIGIvZG9jL2RvbS9odG1sL3N0ZHNvYXAyXzhoX19kZXBfX2luY2wubWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNWE0ODgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvc3Rkc29hcDJfOGhfX2RlcF9faW5jbC5tYXAKQEAgLTAsMCArMSwyIEBACitiYXNlIHJlZmVyZXIKK3JlY3QgJGRvbV84Y3BwLmh0bWwgMTMsMTcgNzUsNDQKZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9zdGRzb2FwMl84aF9fZGVwX19pbmNsLm1kNSBiL2RvYy9kb20vaHRtbC9zdGRzb2FwMl84aF9fZGVwX19pbmNsLm1kNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWZkNzg0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0ZHNvYXAyXzhoX19kZXBfX2luY2wubWQ1CkBAIC0wLDAgKzEgQEAKK2YzOWExMzhmNmNkZDVhMWY5ZTBjNTg0NTkwYTQxMjljClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0ZHNvYXAyXzhoX19kZXBfX2luY2wucG5nIGIvZG9jL2RvbS9odG1sL3N0ZHNvYXAyXzhoX19kZXBfX2luY2wucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYzZmYWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvc3Rkc29hcDJfOGhfX2RlcF9faW5jbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0ZHNvYXAyXzhoX19pbmNsLm1hcCBiL2RvYy9kb20vaHRtbC9zdGRzb2FwMl84aF9faW5jbC5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWExNDc3OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9zdGRzb2FwMl84aF9faW5jbC5tYXAKQEAgLTAsMCArMSBAQAorYmFzZSByZWZlcmVyCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvc3Rkc29hcDJfOGhfX2luY2wubWQ1IGIvZG9jL2RvbS9odG1sL3N0ZHNvYXAyXzhoX19pbmNsLm1kNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjNmYWE4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0ZHNvYXAyXzhoX19pbmNsLm1kNQpAQCAtMCwwICsxIEBACitiOGYyOTM1NWY0MzQ5NGI5NTEzNmQ1ZmQ1N2VlMWQ3NApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9zdGRzb2FwMl84aF9faW5jbC5wbmcgYi9kb2MvZG9tL2h0bWwvc3Rkc29hcDJfOGhfX2luY2wucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4Y2UyMTMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvc3Rkc29hcDJfOGhfX2luY2wucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9zdHJ1Y3RfbmFtZXNwYWNlLW1lbWJlcnMuaHRtbCBiL2RvYy9kb20vaHRtbC9zdHJ1Y3RfbmFtZXNwYWNlLW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDA0YWE4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdF9uYW1lc3BhY2UtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTcgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIGxldmVsLTIgRE9NOiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+PC9kaXY+DQorPGgxPk5hbWVzcGFjZSBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9uYW1lc3BhY2UuaHRtbCI+TmFtZXNwYWNlPC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9uYW1lc3BhY2UuaHRtbCNvMCI+aWQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfbmFtZXNwYWNlLmh0bWwiPk5hbWVzcGFjZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9uYW1lc3BhY2UuaHRtbCNvMiI+aW48L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfbmFtZXNwYWNlLmh0bWwiPk5hbWVzcGFjZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9uYW1lc3BhY2UuaHRtbCNvMSI+bnM8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfbmFtZXNwYWNlLmh0bWwiPk5hbWVzcGFjZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9uYW1lc3BhY2UuaHRtbCNvMyI+b3V0PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X25hbWVzcGFjZS5odG1sIj5OYW1lc3BhY2U8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFRodSBBdWcgMTggMTE6Mjk6NTcgMjAwNSBmb3IgZ1NPQVAgbGV2ZWwtMiBET00gYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9zdHJ1Y3RfbmFtZXNwYWNlLmh0bWwgYi9kb2MvZG9tL2h0bWwvc3RydWN0X25hbWVzcGFjZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MjFmMGYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvc3RydWN0X25hbWVzcGFjZS5odG1sCkBAIC0wLDAgKzEsMTIxIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBsZXZlbC0yIERPTTogTmFtZXNwYWNlIFN0cnVjdCBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPjwvZGl2Pg0KKzxoMT5OYW1lc3BhY2UgU3RydWN0IFJlZmVyZW5jZTwvaDE+PGNvZGU+I2luY2x1ZGUgJmx0O3N0ZHNvYXAyLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KKzxhIGhyZWY9InN0cnVjdF9uYW1lc3BhY2UtbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9uYW1lc3BhY2UuaHRtbCNvMCI+aWQ8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jb25zdCBjaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X25hbWVzcGFjZS5odG1sI28xIj5uczwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfbmFtZXNwYWNlLmh0bWwjbzIiPmluPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9uYW1lc3BhY2UuaHRtbCNvMyI+b3V0PC9hPjwvdGQ+PC90cj4NCisNCis8L3RhYmxlPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9Ik5hbWVzcGFjZTo6aWQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY29uc3QgY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfbmFtZXNwYWNlLmh0bWwjbzAiPk5hbWVzcGFjZTo6aWQ8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9Ik5hbWVzcGFjZTo6aW4iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY29uc3QgY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfbmFtZXNwYWNlLmh0bWwjbzIiPk5hbWVzcGFjZTo6aW48L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9Ik5hbWVzcGFjZTo6bnMiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY29uc3QgY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfbmFtZXNwYWNlLmh0bWwjbzEiPk5hbWVzcGFjZTo6bnM8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzMiIGRveHl0YWc9Ik5hbWVzcGFjZTo6b3V0IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X25hbWVzcGFjZS5odG1sI28zIj5OYW1lc3BhY2U6Om91dDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgc3RydWN0IHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvZG9tLzxhIGNsYXNzPSJlbCIgaHJlZj0ic3Rkc29hcDJfOGguaHRtbCI+c3Rkc29hcDIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBUaHUgQXVnIDE4IDExOjI5OjU3IDIwMDUgZm9yIGdTT0FQIGxldmVsLTIgRE9NIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvc3RydWN0c29hcC1tZW1iZXJzLmh0bWwgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcC1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUyMDM5MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwLW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDE1NiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgbGV2ZWwtMiBET006IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT48L2Rpdj4NCis8aDE+c29hcCBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzE5Ij5hY2NlcHRfZmxhZ3M8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzE1Ij5hY2NlcHRfdGltZW91dDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTE0Ij5hY3Rpb248L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzExIj5hY3RvcjwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNzciPmFoZWFkPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28yNSI+YWxpc3Q8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzEwNyI+YWxsb2NlZDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvOTUiPmFycmF5T2Zmc2V0PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI285NCI+YXJyYXlTaXplPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI285MyI+YXJyYXlUeXBlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMDAiPmF0dHJpYnV0ZXM8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzExNSI+YXV0aHJlYWxtPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xOCI+YmluZF9mbGFnczwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMjMiPmJsaXN0PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI283OSI+Ym9keTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvODYiPmJ1ZjwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNzUiPmJ1ZmlkeDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNzYiPmJ1ZmxlbjwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTM2Ij5jMTRuZXhjbHVkZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTM1Ij5jMTRuaW5jbHVkZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNzgiPmNkYXRhPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMTAiPmNodW5rYnVmbGVuPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMDkiPmNodW5rc2l6ZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMjQiPmNsaXN0PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xNyI+Y29ubmVjdF9mbGFnczwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTQiPmNvbm5lY3RfdGltZW91dDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTM4Ij5jb29raWVfZG9tYWluPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xNDAiPmNvb2tpZV9tYXg8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzEzOSI+Y29va2llX3BhdGg8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzEzNyI+Y29va2llczwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMSI+Y29weTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvODEiPmNvdW50PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMjkiPmRpbWU8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzciPmRpbWVfaWRfZm9ybWF0PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMjgiPmRvbTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNiI+ZG91YmxlX2Zvcm1hdDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTAxIj5lbmNvZGluZzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTAiPmVuY29kaW5nU3R5bGU8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzExMSI+ZW5kcG9pbnQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzEyNiI+ZXJybW9kZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTI3Ij5lcnJudW08L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzEyNSI+ZXJyb3I8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzUwIj5mYWNjZXB0PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28zMSI+ZmF1bHQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzUxIj5mY2xvc2U8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzQ3Ij5mY2xvc2Vzb2NrZXQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzQ1Ij5mY29ubmVjdDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTMzIj5mZGVidWc8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzY3Ij5mZGltZXJlYWQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzY1Ij5mZGltZXJlYWRjbG9zZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNjMiPmZkaW1lcmVhZG9wZW48L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzY4Ij5mZGltZXdyaXRlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI282NiI+ZmRpbWV3cml0ZWNsb3NlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI282NCI+ZmRpbWV3cml0ZW9wZW48L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzQ2Ij5mZGlzY29ubmVjdDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMzkiPmZmb3JtPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28zOCI+ZmdldDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNTYiPmZpZ25vcmU8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzUiPmZsb2F0X2Zvcm1hdDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNDkiPmZvcGVuPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI280MiI+ZnBhcnNlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI280MyI+ZnBhcnNlaGRyPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI281OCI+ZnBsdWdpbjwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNTQiPmZwb2xsPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28zNyI+ZnBvc3Q8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzQwIj5mcG9zdGhkcjwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNjIiPmZwcmVwYXJlZmluYWw8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzU5Ij5mcHJlcGFyZWluaXQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzYxIj5mcHJlcGFyZXJlY3Y8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzYwIj5mcHJlcGFyZXNlbmQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzUzIj5mcmVjdjwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNDQiPmZyZXNvbHZlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI280MSI+ZnJlc3BvbnNlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI281MiI+ZnNlbmQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzU3Ij5mc2VydmVsb29wPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI281NSI+ZnNldGVycm9yPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI280OCI+ZnNodXRkb3duc29ja2V0PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28zMCI+aGVhZGVyPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMTMiPmhvc3Q8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzkxIj5ocmVmPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI285Ij5odHRwX2NvbnRlbnQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzgiPmh0dHBfdmVyc2lvbjwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvOTAiPmlkPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28zMiI+aWRudW08L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzI2Ij5paHQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzMiPmltb2RlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMTciPmlwPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI283MiI+aXM8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzEwMyI+a2VlcF9hbGl2ZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvODMiPmxhYmJ1ZjwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvODUiPmxhYmlkeDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvODQiPmxhYmxlbjwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvODIiPmxlbmd0aDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvODAiPmxldmVsPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28yMSI+bG9jYWxfbmFtZXNwYWNlczwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTMyIj5sb2dmaWxlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI282OSI+bWFzdGVyPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMTkiPm1heF9rZWVwX2FsaXZlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMzQiPm1odDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTMwIj5taW1lPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28yIj5tb2RlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI284OCI+bXNnYnVmPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMDIiPm11c3RVbmRlcnN0YW5kPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28yMCI+bmFtZXNwYWNlczwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMjIiPm5saXN0PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMDUiPm5zPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMDQiPm51bGw8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzQiPm9tb2RlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI283MSI+b3M8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzk2Ij5vdGhlcjwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTA2Ij5wYXJ0PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28zNiI+cGFzc3dkPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMTIiPnBhdGg8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzI4Ij5wYmxrPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMDgiPnBlZWtlZDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTQxIj5wZWVyPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xNDIiPnBlZXJsZW48L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzI3Ij5waHQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzI5Ij5waWR4PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28zNCI+cGx1Z2luczwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTE4Ij5wb3J0PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI285NyI+cG9zaXRpb248L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzk4Ij5wb3NpdGlvbnM8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzExNiI+cHJvbG9nPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMjAiPnByb3h5X2hvc3Q8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzEyMyI+cHJveHlfcGFzc3dkPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMjEiPnByb3h5X3BvcnQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzEyMiI+cHJveHlfdXNlcmlkPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMiI+cmVjdl90aW1lb3V0PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI283NCI+cmVjdmZkPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI285OSI+cm9vdDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTMiPnNlbmRfdGltZW91dDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNzMiPnNlbmRmZDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNzAiPnNvY2tldDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTYiPnNvY2tldF9mbGFnczwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTI0Ij5zdGF0dXM8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzg5Ij50YWc8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzg3Ij50bXBidWY8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzkyIj50eXBlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28zMyI+dXNlcjwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMzUiPnVzZXJpZDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMCI+dmVyc2lvbjwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTMxIj54bGlzdDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gVGh1IEF1ZyAxOCAxMToyOTo1NyAyMDA1IGZvciBnU09BUCBsZXZlbC0yIERPTSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXAuaHRtbCBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE0Zjc5ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwLmh0bWwKQEAgLTAsMCArMSwzNjEzIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBsZXZlbC0yIERPTTogc29hcCBTdHJ1Y3QgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT48L2Rpdj4NCis8aDE+c29hcCBTdHJ1Y3QgUmVmZXJlbmNlPC9oMT48Y29kZT4jaW5jbHVkZSAmbHQ7c3Rkc29hcDIuaCZndDs8L2NvZGU+DQorPHA+DQorQ29sbGFib3JhdGlvbiBkaWFncmFtIGZvciBzb2FwOjxwPjxjZW50ZXI+PGltZyBzcmM9InN0cnVjdHNvYXBfX2NvbGxfX2dyYXBoLnBuZyIgYm9yZGVyPSIwIiB1c2VtYXA9IiNzb2FwX19jb2xsX19tYXAiIGFsdD0iQ29sbGFib3JhdGlvbiBncmFwaCI+PC9jZW50ZXI+DQorPG1hcCBuYW1lPSJzb2FwX19jb2xsX19tYXAiPg0KKzxhcmVhIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIiBzaGFwZT0icmVjdCIgY29vcmRzPSI1NDAsNTExLDY3MSw1MzciIGFsdD0iIj4NCis8YXJlYSBocmVmPSJzdHJ1Y3Rzb2FwX19wbGlzdC5odG1sIiBzaGFwZT0icmVjdCIgY29vcmRzPSIxOSw0OCw5MSw3NSIgYWx0PSIiPg0KKzxhcmVhIGhyZWY9InN0cnVjdHNvYXBfX3BibGsuaHRtbCIgc2hhcGU9InJlY3QiIGNvb3Jkcz0iMTc1LDExMSwyNDksMTM3IiBhbHQ9IiI+DQorPGFyZWEgaHJlZj0ic3RydWN0c29hcF9fbmxpc3QuaHRtbCIgc2hhcGU9InJlY3QiIGNvb3Jkcz0iMTc2LDIwMSwyNDgsMjI4IiBhbHQ9IiI+DQorPGFyZWEgaHJlZj0ic3RydWN0X25hbWVzcGFjZS5odG1sIiBzaGFwZT0icmVjdCIgY29vcmRzPSIxNzEsMjUyLDI1MywyNzkiIGFsdD0iIj4NCis8YXJlYSBocmVmPSJzdHJ1Y3Rzb2FwX194bGlzdC5odG1sIiBzaGFwZT0icmVjdCIgY29vcmRzPSIxNzYsMzQzLDI0OCwzNjkiIGFsdD0iIj4NCis8YXJlYSBocmVmPSJzdHJ1Y3Rzb2FwX19hdHRyaWJ1dGUuaHRtbCIgc2hhcGU9InJlY3QiIGNvb3Jkcz0iMTY1LDQzMywyNTksNDYwIiBhbHQ9IiI+DQorPGFyZWEgaHJlZj0ic3RydWN0c29hcF9faWxpc3QuaHRtbCIgc2hhcGU9InJlY3QiIGNvb3Jkcz0iMTc5LDUyNCwyNDUsNTUxIiBhbHQ9IiI+DQorPGFyZWEgaHJlZj0ic3RydWN0c29hcF9fbWltZS5odG1sIiBzaGFwZT0icmVjdCIgY29vcmRzPSIxNzIsNTc1LDI1Miw2MDEiIGFsdD0iIj4NCis8YXJlYSBocmVmPSJzdHJ1Y3Rzb2FwX19wbHVnaW4uaHRtbCIgc2hhcGU9InJlY3QiIGNvb3Jkcz0iMTcxLDY2NSwyNTMsNjkyIiBhbHQ9IiI+DQorPGFyZWEgaHJlZj0ic3RydWN0c29hcF9fY29va2llLmh0bWwiIHNoYXBlPSJyZWN0IiBjb29yZHM9IjE2OSw3NTYsMjU1LDc4MyIgYWx0PSIiPg0KKzxhcmVhIGhyZWY9InN0cnVjdHNvYXBfX2NsaXN0Lmh0bWwiIHNoYXBlPSJyZWN0IiBjb29yZHM9IjE3Niw4NDcsMjQ4LDg3MyIgYWx0PSIiPg0KKzxhcmVhIGhyZWY9InN0cnVjdHNvYXBfX2JsaXN0Lmh0bWwiIHNoYXBlPSJyZWN0IiBjb29yZHM9IjE3Niw5MzcsMjQ4LDk2NCIgYWx0PSIiPg0KKzxhcmVhIGhyZWY9InN0cnVjdHNvYXBfX2RpbWUuaHRtbCIgc2hhcGU9InJlY3QiIGNvb3Jkcz0iMTczLDk4OCwyNTEsMTAxNSIgYWx0PSIiPg0KKzwvbWFwPg0KKzxjZW50ZXI+PGZvbnQgc2l6ZT0iMiI+WzxhIGhyZWY9ImdyYXBoX2xlZ2VuZC5odG1sIj5sZWdlbmQ8L2E+XTwvZm9udD48L2NlbnRlcj48YSBocmVmPSJzdHJ1Y3Rzb2FwLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnNob3J0Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMCI+dmVyc2lvbjwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnNob3J0Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMSI+Y29weTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3Rkc29hcDJfOGguaHRtbCNhMTk0Ij5zb2FwX21vZGU8L2E+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMiI+bW9kZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3Rkc29hcDJfOGguaHRtbCNhMTk0Ij5zb2FwX21vZGU8L2E+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMyI+aW1vZGU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0ZHNvYXAyXzhoLmh0bWwjYTE5NCI+c29hcF9tb2RlPC9hPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzQiPm9tb2RlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNSI+ZmxvYXRfZm9ybWF0PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNiI+ZG91YmxlX2Zvcm1hdDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzciPmRpbWVfaWRfZm9ybWF0PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvOCI+aHR0cF92ZXJzaW9uPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvOSI+aHR0cF9jb250ZW50PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTAiPmVuY29kaW5nU3R5bGU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jb25zdCBjaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMSI+YWN0b3I8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMiI+cmVjdl90aW1lb3V0PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTMiPnNlbmRfdGltZW91dDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzE0Ij5jb25uZWN0X3RpbWVvdXQ8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xNSI+YWNjZXB0X3RpbWVvdXQ8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xNiI+c29ja2V0X2ZsYWdzPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTciPmNvbm5lY3RfZmxhZ3M8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xOCI+YmluZF9mbGFnczwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzE5Ij5hY2NlcHRfZmxhZ3M8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jb25zdCBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfbmFtZXNwYWNlLmh0bWwiPk5hbWVzcGFjZTwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzIwIj5uYW1lc3BhY2VzPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfbmFtZXNwYWNlLmh0bWwiPk5hbWVzcGFjZTwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzIxIj5sb2NhbF9uYW1lc3BhY2VzPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19ubGlzdC5odG1sIj5zb2FwX25saXN0PC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMjIiPm5saXN0PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19ibGlzdC5odG1sIj5zb2FwX2JsaXN0PC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMjMiPmJsaXN0PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19jbGlzdC5odG1sIj5zb2FwX2NsaXN0PC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMjQiPmNsaXN0PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+dm9pZCAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMjUiPmFsaXN0PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19pbGlzdC5odG1sIj5zb2FwX2lsaXN0PC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMjYiPmlodDwvYT4gW1NPQVBfSURIQVNIXTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19wbGlzdC5odG1sIj5zb2FwX3BsaXN0PC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMjciPnBodDwvYT4gW1NPQVBfUFRSSEFTSF08L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fcGJsay5odG1sIj5zb2FwX3BibGs8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28yOCI+cGJsazwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnNob3J0Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMjkiPnBpZHg8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5TT0FQX0VOVl9fSGVhZGVyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28zMCI+aGVhZGVyPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+U09BUF9FTlZfX0ZhdWx0ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28zMSI+ZmF1bHQ8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28zMiI+aWRudW08L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD52b2lkICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28zMyI+dXNlcjwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fcGx1Z2luLmh0bWwiPnNvYXBfcGx1Z2luPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMzQiPnBsdWdpbnM8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28zNSI+dXNlcmlkPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMzYiPnBhc3N3ZDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCgqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMzciPmZwb3N0PC9hPiApKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT4gKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIHNpemVfdCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCgqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMzgiPmZnZXQ8L2E+ICkoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPiAqKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50KCombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28zOSI+ZmZvcm08L2E+ICkoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPiAqKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50KCombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI280MCI+ZnBvc3RoZHI8L2E+ICkoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPiAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCgqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNDEiPmZyZXNwb25zZTwvYT4gKShzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+ICosIGludCwgc2l6ZV90KTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50KCombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI280MiI+ZnBhcnNlPC9hPiApKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT4gKik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCgqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNDMiPmZwYXJzZWhkcjwvYT4gKShzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+ICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50KCombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI280NCI+ZnJlc29sdmU8L2E+ICkoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPiAqLCBjb25zdCBjaGFyICosIHN0cnVjdCBpbl9hZGRyICppbmFkZHIpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQoKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzQ1Ij5mY29ubmVjdDwvYT4gKShzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+ICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQoKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzQ2Ij5mZGlzY29ubmVjdDwvYT4gKShzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+ICopPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQoKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzQ3Ij5mY2xvc2Vzb2NrZXQ8L2E+ICkoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPiAqLCBTT0FQX1NPQ0tFVCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCgqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNDgiPmZzaHV0ZG93bnNvY2tldDwvYT4gKShzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+ICosIFNPQVBfU09DS0VULCBpbnQpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQoKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzQ5Ij5mb3BlbjwvYT4gKShzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+ICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQoKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzUwIj5mYWNjZXB0PC9hPiApKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT4gKiwgaW50LCBzdHJ1Y3Qgc29ja2FkZHIgKiwgaW50ICpuKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50KCombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI281MSI+ZmNsb3NlPC9hPiApKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT4gKik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCgqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNTIiPmZzZW5kPC9hPiApKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT4gKiwgY29uc3QgY2hhciAqLCBzaXplX3QpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zaXplX3QoKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzUzIj5mcmVjdjwvYT4gKShzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+ICosIGNoYXIgKiwgc2l6ZV90KTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50KCombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI281NCI+ZnBvbGw8L2E+ICkoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPiAqKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+dm9pZCgqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNTUiPmZzZXRlcnJvcjwvYT4gKShzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+ICosIGNvbnN0IGNoYXIgKipjLCBjb25zdCBjaGFyICoqcyk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCgqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNTYiPmZpZ25vcmU8L2E+ICkoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPiAqLCBjb25zdCBjaGFyICopPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQoKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzU3Ij5mc2VydmVsb29wPC9hPiApKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT4gKik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnZvaWQgKigqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNTgiPmZwbHVnaW48L2E+ICkoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPiAqLCBjb25zdCBjaGFyICopPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQoKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzU5Ij5mcHJlcGFyZWluaXQ8L2E+ICkoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPiAqKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50KCombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI282MCI+ZnByZXBhcmVzZW5kPC9hPiApKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT4gKiwgY29uc3QgY2hhciAqLCBzaXplX3QpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQoKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzYxIj5mcHJlcGFyZXJlY3Y8L2E+ICkoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPiAqLCBjb25zdCBjaGFyICosIHNpemVfdCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCgqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNjIiPmZwcmVwYXJlZmluYWw8L2E+ICkoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPiAqKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+dm9pZCAqKCombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI282MyI+ZmRpbWVyZWFkb3BlbjwvYT4gKShzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+ICosIHZvaWQgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnZvaWQgKigqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNjQiPmZkaW1ld3JpdGVvcGVuPC9hPiApKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT4gKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnZvaWQoKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzY1Ij5mZGltZXJlYWRjbG9zZTwvYT4gKShzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+ICosIHZvaWQgKik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnZvaWQoKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzY2Ij5mZGltZXdyaXRlY2xvc2U8L2E+ICkoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPiAqLCB2b2lkICopPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zaXplX3QoKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzY3Ij5mZGltZXJlYWQ8L2E+ICkoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPiAqLCB2b2lkICosIGNoYXIgKiwgc2l6ZV90KTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50KCombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI282OCI+ZmRpbWV3cml0ZTwvYT4gKShzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+ICosIHZvaWQgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI282OSI+bWFzdGVyPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNzAiPnNvY2tldDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnZvaWQgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzcxIj5vczwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnZvaWQgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzcyIj5pczwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzczIj5zZW5kZmQ8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI283NCI+cmVjdmZkPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c2l6ZV90Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNzUiPmJ1ZmlkeDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnNpemVfdCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzc2Ij5idWZsZW48L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0ZHNvYXAyXzhoLmh0bWwjYTE5NSI+c29hcF93Y2hhcjwvYT4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI283NyI+YWhlYWQ8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zaG9ydCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzc4Ij5jZGF0YTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnNob3J0Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNzkiPmJvZHk8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD51bnNpZ25lZCBpbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI284MCI+bGV2ZWw8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zaXplX3QmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI284MSI+Y291bnQ8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zaXplX3QmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI284MiI+bGVuZ3RoPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvODMiPmxhYmJ1ZjwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnNpemVfdCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzg0Ij5sYWJsZW48L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zaXplX3QmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI284NSI+bGFiaWR4PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzg2Ij5idWY8L2E+IFtTT0FQX0JVRkxFTl08L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXImbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI284NyI+dG1wYnVmPC9hPiBbMTAyNF08L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXImbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI284OCI+bXNnYnVmPC9hPiBbMTAyNF08L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXImbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI284OSI+dGFnPC9hPiBbU09BUF9UQUdMRU5dPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvOTAiPmlkPC9hPiBbU09BUF9UQUdMRU5dPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvOTEiPmhyZWY8L2E+IFtTT0FQX1RBR0xFTl08L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXImbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI285MiI+dHlwZTwvYT4gW1NPQVBfVEFHTEVOXTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzkzIj5hcnJheVR5cGU8L2E+IFtTT0FQX1RBR0xFTl08L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXImbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI285NCI+YXJyYXlTaXplPC9hPiBbU09BUF9UQUdMRU5dPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvOTUiPmFycmF5T2Zmc2V0PC9hPiBbU09BUF9UQUdMRU5dPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zaG9ydCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzk2Ij5vdGhlcjwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnNob3J0Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvOTciPnBvc2l0aW9uPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvOTgiPnBvc2l0aW9uczwvYT4gW1NPQVBfTUFYRElNU108L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnNob3J0Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvOTkiPnJvb3Q8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2F0dHJpYnV0ZS5odG1sIj5zb2FwX2F0dHJpYnV0ZTwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzEwMCI+YXR0cmlidXRlczwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnNob3J0Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTAxIj5lbmNvZGluZzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnNob3J0Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTAyIj5tdXN0VW5kZXJzdGFuZDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnNob3J0Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTAzIj5rZWVwX2FsaXZlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c2hvcnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMDQiPm51bGw8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zaG9ydCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzEwNSI+bnM8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zaG9ydCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzEwNiI+cGFydDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnNob3J0Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTA3Ij5hbGxvY2VkPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c2hvcnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMDgiPnBlZWtlZDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnNpemVfdCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzEwOSI+Y2h1bmtzaXplPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c2l6ZV90Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTEwIj5jaHVua2J1ZmxlbjwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXImbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMTEiPmVuZHBvaW50PC9hPiBbU09BUF9UQUdMRU5dPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTEyIj5wYXRoPC9hPiBbU09BUF9UQUdMRU5dPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTEzIj5ob3N0PC9hPiBbU09BUF9UQUdMRU5dPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMTQiPmFjdGlvbjwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzExNSI+YXV0aHJlYWxtPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTE2Ij5wcm9sb2c8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD51bnNpZ25lZCBsb25nJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTE3Ij5pcDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzExOCI+cG9ydDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnVuc2lnbmVkIGludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzExOSI+bWF4X2tlZXBfYWxpdmU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jb25zdCBjaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMjAiPnByb3h5X2hvc3Q8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMjEiPnByb3h5X3BvcnQ8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jb25zdCBjaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMjIiPnByb3h5X3VzZXJpZDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzEyMyI+cHJveHlfcGFzc3dkPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTI0Ij5zdGF0dXM8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMjUiPmVycm9yPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTI2Ij5lcnJtb2RlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTI3Ij5lcnJudW08L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTI4Ij5kb208L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RpbWUuaHRtbCI+c29hcF9kaW1lPC9hPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzEyOSI+ZGltZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbWltZS5odG1sIj5zb2FwX21pbWU8L2E+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTMwIj5taW1lPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX194bGlzdC5odG1sIj5zb2FwX3hsaXN0PC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTMxIj54bGlzdDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzEzMiI+bG9nZmlsZTwvYT4gW1NPQVBfTUFYTE9HU108L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPkZJTEUgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzEzMyI+ZmRlYnVnPC9hPiBbU09BUF9NQVhMT0dTXTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c29hcF9tbGlzdCAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTM0Ij5taHQ8L2E+IFtTT0FQX1BUUkhBU0hdPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jb25zdCBjaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMzUiPmMxNG5pbmNsdWRlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTM2Ij5jMTRuZXhjbHVkZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fY29va2llLmh0bWwiPnNvYXBfY29va2llPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTM3Ij5jb29raWVzPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTM4Ij5jb29raWVfZG9tYWluPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTM5Ij5jb29raWVfcGF0aDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzE0MCI+Y29va2llX21heDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnNvY2thZGRyX2luJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTQxIj5wZWVyPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c2l6ZV90Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTQyIj5wZWVybGVuPC9hPjwvdGQ+PC90cj4NCisNCis8L3RhYmxlPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzE5IiBkb3h5dGFnPSJzb2FwOjphY2NlcHRfZmxhZ3MiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xOSI+c29hcDo6YWNjZXB0X2ZsYWdzPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xNSIgZG94eXRhZz0ic29hcDo6YWNjZXB0X3RpbWVvdXQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xNSI+c29hcDo6YWNjZXB0X3RpbWVvdXQ8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzExNCIgZG94eXRhZz0ic29hcDo6YWN0aW9uIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMTQiPnNvYXA6OmFjdGlvbjwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMTEiIGRveHl0YWc9InNvYXA6OmFjdG9yIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNvbnN0IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMSI+c29hcDo6YWN0b3I8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzc3IiBkb3h5dGFnPSJzb2FwOjphaGVhZCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0ZHNvYXAyXzhoLmh0bWwjYTE5NSI+c29hcF93Y2hhcjwvYT4gPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzc3Ij5zb2FwOjphaGVhZDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMjUiIGRveHl0YWc9InNvYXA6OmFsaXN0IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHZvaWQqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28yNSI+c29hcDo6YWxpc3Q8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEwNyIgZG94eXRhZz0ic29hcDo6YWxsb2NlZCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzaG9ydCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTA3Ij5zb2FwOjphbGxvY2VkPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im85NSIgZG94eXRhZz0ic29hcDo6YXJyYXlPZmZzZXQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvOTUiPnNvYXA6OmFycmF5T2Zmc2V0PC9hPltTT0FQX1RBR0xFTl0gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvOTQiIGRveHl0YWc9InNvYXA6OmFycmF5U2l6ZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI285NCI+c29hcDo6YXJyYXlTaXplPC9hPltTT0FQX1RBR0xFTl0gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvOTMiIGRveHl0YWc9InNvYXA6OmFycmF5VHlwZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI285MyI+c29hcDo6YXJyYXlUeXBlPC9hPltTT0FQX1RBR0xFTl0gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMTAwIiBkb3h5dGFnPSJzb2FwOjphdHRyaWJ1dGVzIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2F0dHJpYnV0ZS5odG1sIj5zb2FwX2F0dHJpYnV0ZTwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMDAiPnNvYXA6OmF0dHJpYnV0ZXM8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzExNSIgZG94eXRhZz0ic29hcDo6YXV0aHJlYWxtIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMTUiPnNvYXA6OmF1dGhyZWFsbTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMTgiIGRveHl0YWc9InNvYXA6OmJpbmRfZmxhZ3MiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xOCI+c29hcDo6YmluZF9mbGFnczwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMjMiIGRveHl0YWc9InNvYXA6OmJsaXN0IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2JsaXN0Lmh0bWwiPnNvYXBfYmxpc3Q8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMjMiPnNvYXA6OmJsaXN0PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im83OSIgZG94eXRhZz0ic29hcDo6Ym9keSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzaG9ydCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNzkiPnNvYXA6OmJvZHk8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzg2IiBkb3h5dGFnPSJzb2FwOjpidWYiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvODYiPnNvYXA6OmJ1ZjwvYT5bU09BUF9CVUZMRU5dICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzc1IiBkb3h5dGFnPSJzb2FwOjpidWZpZHgiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc2l6ZV90IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI283NSI+c29hcDo6YnVmaWR4PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im83NiIgZG94eXRhZz0ic29hcDo6YnVmbGVuIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHNpemVfdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNzYiPnNvYXA6OmJ1ZmxlbjwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMTM2IiBkb3h5dGFnPSJzb2FwOjpjMTRuZXhjbHVkZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjb25zdCBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTM2Ij5zb2FwOjpjMTRuZXhjbHVkZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMTM1IiBkb3h5dGFnPSJzb2FwOjpjMTRuaW5jbHVkZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjb25zdCBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTM1Ij5zb2FwOjpjMTRuaW5jbHVkZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNzgiIGRveHl0YWc9InNvYXA6OmNkYXRhIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHNob3J0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI283OCI+c29hcDo6Y2RhdGE8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzExMCIgZG94eXRhZz0ic29hcDo6Y2h1bmtidWZsZW4iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc2l6ZV90IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMTAiPnNvYXA6OmNodW5rYnVmbGVuPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xMDkiIGRveHl0YWc9InNvYXA6OmNodW5rc2l6ZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzaXplX3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzEwOSI+c29hcDo6Y2h1bmtzaXplPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yNCIgZG94eXRhZz0ic29hcDo6Y2xpc3QiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fY2xpc3QuaHRtbCI+c29hcF9jbGlzdDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28yNCI+c29hcDo6Y2xpc3Q8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzE3IiBkb3h5dGFnPSJzb2FwOjpjb25uZWN0X2ZsYWdzIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTciPnNvYXA6OmNvbm5lY3RfZmxhZ3M8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzE0IiBkb3h5dGFnPSJzb2FwOjpjb25uZWN0X3RpbWVvdXQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xNCI+c29hcDo6Y29ubmVjdF90aW1lb3V0PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xMzgiIGRveHl0YWc9InNvYXA6OmNvb2tpZV9kb21haW4iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY29uc3QgY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzEzOCI+c29hcDo6Y29va2llX2RvbWFpbjwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMTQwIiBkb3h5dGFnPSJzb2FwOjpjb29raWVfbWF4IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTQwIj5zb2FwOjpjb29raWVfbWF4PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xMzkiIGRveHl0YWc9InNvYXA6OmNvb2tpZV9wYXRoIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNvbnN0IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMzkiPnNvYXA6OmNvb2tpZV9wYXRoPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xMzciIGRveHl0YWc9InNvYXA6OmNvb2tpZXMiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fY29va2llLmh0bWwiPnNvYXBfY29va2llPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzEzNyI+c29hcDo6Y29va2llczwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0ic29hcDo6Y29weSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzaG9ydCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMSI+c29hcDo6Y29weTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvODEiIGRveHl0YWc9InNvYXA6OmNvdW50IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHNpemVfdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvODEiPnNvYXA6OmNvdW50PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xMjkiIGRveHl0YWc9InNvYXA6OmRpbWUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZGltZS5odG1sIj5zb2FwX2RpbWU8L2E+IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMjkiPnNvYXA6OmRpbWU8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzciIGRveHl0YWc9InNvYXA6OmRpbWVfaWRfZm9ybWF0IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNvbnN0IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI283Ij5zb2FwOjpkaW1lX2lkX2Zvcm1hdDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMTI4IiBkb3h5dGFnPSJzb2FwOjpkb20iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTI4Ij5zb2FwOjpkb208L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzYiIGRveHl0YWc9InNvYXA6OmRvdWJsZV9mb3JtYXQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY29uc3QgY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzYiPnNvYXA6OmRvdWJsZV9mb3JtYXQ8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEwMSIgZG94eXRhZz0ic29hcDo6ZW5jb2RpbmciID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc2hvcnQgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzEwMSI+c29hcDo6ZW5jb2Rpbmc8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEwIiBkb3h5dGFnPSJzb2FwOjplbmNvZGluZ1N0eWxlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNvbnN0IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMCI+c29hcDo6ZW5jb2RpbmdTdHlsZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMTExIiBkb3h5dGFnPSJzb2FwOjplbmRwb2ludCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMTEiPnNvYXA6OmVuZHBvaW50PC9hPltTT0FQX1RBR0xFTl0gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMTI2IiBkb3h5dGFnPSJzb2FwOjplcnJtb2RlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTI2Ij5zb2FwOjplcnJtb2RlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xMjciIGRveHl0YWc9InNvYXA6OmVycm51bSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzEyNyI+c29hcDo6ZXJybnVtPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xMjUiIGRveHl0YWc9InNvYXA6OmVycm9yIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTI1Ij5zb2FwOjplcnJvcjwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNTAiIGRveHl0YWc9InNvYXA6OmZhY2NlcHQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50KCogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzUwIj5zb2FwOjpmYWNjZXB0PC9hPikoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPiAqLCBpbnQsIHN0cnVjdCBzb2NrYWRkciAqLCBpbnQgKm4pICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzMxIiBkb3h5dGFnPSJzb2FwOjpmYXVsdCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgU09BUF9FTlZfX0ZhdWx0KiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMzEiPnNvYXA6OmZhdWx0PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im81MSIgZG94eXRhZz0ic29hcDo6ZmNsb3NlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCgqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI281MSI+c29hcDo6ZmNsb3NlPC9hPikoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPiAqKSAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im80NyIgZG94eXRhZz0ic29hcDo6ZmNsb3Nlc29ja2V0IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCgqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI280NyI+c29hcDo6ZmNsb3Nlc29ja2V0PC9hPikoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPiAqLCBTT0FQX1NPQ0tFVCkgICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNDUiIGRveHl0YWc9InNvYXA6OmZjb25uZWN0IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCgqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI280NSI+c29hcDo6ZmNvbm5lY3Q8L2E+KShzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+ICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEzMyIgZG94eXRhZz0ic29hcDo6ZmRlYnVnIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IEZJTEUqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMzMiPnNvYXA6OmZkZWJ1ZzwvYT5bU09BUF9NQVhMT0dTXSAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im82NyIgZG94eXRhZz0ic29hcDo6ZmRpbWVyZWFkIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHNpemVfdCgqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI282NyI+c29hcDo6ZmRpbWVyZWFkPC9hPikoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPiAqLCB2b2lkICosIGNoYXIgKiwgc2l6ZV90KSAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im82NSIgZG94eXRhZz0ic29hcDo6ZmRpbWVyZWFkY2xvc2UiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdm9pZCgqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI282NSI+c29hcDo6ZmRpbWVyZWFkY2xvc2U8L2E+KShzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+ICosIHZvaWQgKikgICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNjMiIGRveHl0YWc9InNvYXA6OmZkaW1lcmVhZG9wZW4iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdm9pZCooKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNjMiPnNvYXA6OmZkaW1lcmVhZG9wZW48L2E+KShzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+ICosIHZvaWQgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikgICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNjgiIGRveHl0YWc9InNvYXA6OmZkaW1ld3JpdGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50KCogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzY4Ij5zb2FwOjpmZGltZXdyaXRlPC9hPikoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPiAqLCB2b2lkICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KSAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im82NiIgZG94eXRhZz0ic29hcDo6ZmRpbWV3cml0ZWNsb3NlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHZvaWQoKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNjYiPnNvYXA6OmZkaW1ld3JpdGVjbG9zZTwvYT4pKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT4gKiwgdm9pZCAqKSAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im82NCIgZG94eXRhZz0ic29hcDo6ZmRpbWV3cml0ZW9wZW4iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdm9pZCooKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNjQiPnNvYXA6OmZkaW1ld3JpdGVvcGVuPC9hPikoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPiAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im80NiIgZG94eXRhZz0ic29hcDo6ZmRpc2Nvbm5lY3QiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50KCogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzQ2Ij5zb2FwOjpmZGlzY29ubmVjdDwvYT4pKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT4gKikgICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMzkiIGRveHl0YWc9InNvYXA6OmZmb3JtIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCgqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28zOSI+c29hcDo6ZmZvcm08L2E+KShzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+ICopICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzM4IiBkb3h5dGFnPSJzb2FwOjpmZ2V0IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCgqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28zOCI+c29hcDo6ZmdldDwvYT4pKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT4gKikgICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNTYiIGRveHl0YWc9InNvYXA6OmZpZ25vcmUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50KCogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzU2Ij5zb2FwOjpmaWdub3JlPC9hPikoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPiAqLCBjb25zdCBjaGFyICopICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzUiIGRveHl0YWc9InNvYXA6OmZsb2F0X2Zvcm1hdCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjb25zdCBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNSI+c29hcDo6ZmxvYXRfZm9ybWF0PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im80OSIgZG94eXRhZz0ic29hcDo6Zm9wZW4iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50KCogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzQ5Ij5zb2FwOjpmb3BlbjwvYT4pKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT4gKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCkgICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNDIiIGRveHl0YWc9InNvYXA6OmZwYXJzZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQoKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNDIiPnNvYXA6OmZwYXJzZTwvYT4pKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT4gKikgICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNDMiIGRveHl0YWc9InNvYXA6OmZwYXJzZWhkciIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQoKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNDMiPnNvYXA6OmZwYXJzZWhkcjwvYT4pKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT4gKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzU4IiBkb3h5dGFnPSJzb2FwOjpmcGx1Z2luIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHZvaWQqKCogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzU4Ij5zb2FwOjpmcGx1Z2luPC9hPikoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPiAqLCBjb25zdCBjaGFyICopICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzU0IiBkb3h5dGFnPSJzb2FwOjpmcG9sbCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQoKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNTQiPnNvYXA6OmZwb2xsPC9hPikoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPiAqKSAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8zNyIgZG94eXRhZz0ic29hcDo6ZnBvc3QiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50KCogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzM3Ij5zb2FwOjpmcG9zdDwvYT4pKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT4gKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIHNpemVfdCkgICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNDAiIGRveHl0YWc9InNvYXA6OmZwb3N0aGRyIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCgqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI280MCI+c29hcDo6ZnBvc3RoZHI8L2E+KShzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+ICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im82MiIgZG94eXRhZz0ic29hcDo6ZnByZXBhcmVmaW5hbCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQoKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNjIiPnNvYXA6OmZwcmVwYXJlZmluYWw8L2E+KShzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+ICopICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzU5IiBkb3h5dGFnPSJzb2FwOjpmcHJlcGFyZWluaXQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50KCogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzU5Ij5zb2FwOjpmcHJlcGFyZWluaXQ8L2E+KShzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+ICopICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzYxIiBkb3h5dGFnPSJzb2FwOjpmcHJlcGFyZXJlY3YiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50KCogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzYxIj5zb2FwOjpmcHJlcGFyZXJlY3Y8L2E+KShzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+ICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KSAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im82MCIgZG94eXRhZz0ic29hcDo6ZnByZXBhcmVzZW5kIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCgqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI282MCI+c29hcDo6ZnByZXBhcmVzZW5kPC9hPikoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPiAqLCBjb25zdCBjaGFyICosIHNpemVfdCkgICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNTMiIGRveHl0YWc9InNvYXA6OmZyZWN2IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHNpemVfdCgqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI281MyI+c29hcDo6ZnJlY3Y8L2E+KShzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+ICosIGNoYXIgKiwgc2l6ZV90KSAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im80NCIgZG94eXRhZz0ic29hcDo6ZnJlc29sdmUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50KCogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzQ0Ij5zb2FwOjpmcmVzb2x2ZTwvYT4pKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT4gKiwgY29uc3QgY2hhciAqLCBzdHJ1Y3QgaW5fYWRkciAqaW5hZGRyKSAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im80MSIgZG94eXRhZz0ic29hcDo6ZnJlc3BvbnNlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCgqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI280MSI+c29hcDo6ZnJlc3BvbnNlPC9hPikoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPiAqLCBpbnQsIHNpemVfdCkgICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNTIiIGRveHl0YWc9InNvYXA6OmZzZW5kIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCgqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI281MiI+c29hcDo6ZnNlbmQ8L2E+KShzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+ICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KSAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im81NyIgZG94eXRhZz0ic29hcDo6ZnNlcnZlbG9vcCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQoKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNTciPnNvYXA6OmZzZXJ2ZWxvb3A8L2E+KShzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+ICopICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzU1IiBkb3h5dGFnPSJzb2FwOjpmc2V0ZXJyb3IiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdm9pZCgqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI281NSI+c29hcDo6ZnNldGVycm9yPC9hPikoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPiAqLCBjb25zdCBjaGFyICoqYywgY29uc3QgY2hhciAqKnMpICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzQ4IiBkb3h5dGFnPSJzb2FwOjpmc2h1dGRvd25zb2NrZXQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50KCogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzQ4Ij5zb2FwOjpmc2h1dGRvd25zb2NrZXQ8L2E+KShzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+ICosIFNPQVBfU09DS0VULCBpbnQpICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzMwIiBkb3h5dGFnPSJzb2FwOjpoZWFkZXIiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IFNPQVBfRU5WX19IZWFkZXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28zMCI+c29hcDo6aGVhZGVyPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xMTMiIGRveHl0YWc9InNvYXA6Omhvc3QiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTEzIj5zb2FwOjpob3N0PC9hPltTT0FQX1RBR0xFTl0gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvOTEiIGRveHl0YWc9InNvYXA6OmhyZWYiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvOTEiPnNvYXA6OmhyZWY8L2E+W1NPQVBfVEFHTEVOXSAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im85IiBkb3h5dGFnPSJzb2FwOjpodHRwX2NvbnRlbnQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY29uc3QgY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzkiPnNvYXA6Omh0dHBfY29udGVudDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvOCIgZG94eXRhZz0ic29hcDo6aHR0cF92ZXJzaW9uIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNvbnN0IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI284Ij5zb2FwOjpodHRwX3ZlcnNpb248L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzkwIiBkb3h5dGFnPSJzb2FwOjppZCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI285MCI+c29hcDo6aWQ8L2E+W1NPQVBfVEFHTEVOXSAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8zMiIgZG94eXRhZz0ic29hcDo6aWRudW0iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28zMiI+c29hcDo6aWRudW08L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzI2IiBkb3h5dGFnPSJzb2FwOjppaHQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9faWxpc3QuaHRtbCI+c29hcF9pbGlzdDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28yNiI+c29hcDo6aWh0PC9hPltTT0FQX0lESEFTSF0gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMyIgZG94eXRhZz0ic29hcDo6aW1vZGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJzdGRzb2FwMl84aC5odG1sI2ExOTQiPnNvYXBfbW9kZTwvYT4gPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzMiPnNvYXA6Omltb2RlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xMTciIGRveHl0YWc9InNvYXA6OmlwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHVuc2lnbmVkIGxvbmcgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzExNyI+c29hcDo6aXA8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzcyIiBkb3h5dGFnPSJzb2FwOjppcyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB2b2lkKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNzIiPnNvYXA6OmlzPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xMDMiIGRveHl0YWc9InNvYXA6OmtlZXBfYWxpdmUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc2hvcnQgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzEwMyI+c29hcDo6a2VlcF9hbGl2ZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvODMiIGRveHl0YWc9InNvYXA6OmxhYmJ1ZiIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvODMiPnNvYXA6OmxhYmJ1ZjwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvODUiIGRveHl0YWc9InNvYXA6OmxhYmlkeCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzaXplX3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzg1Ij5zb2FwOjpsYWJpZHg8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzg0IiBkb3h5dGFnPSJzb2FwOjpsYWJsZW4iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc2l6ZV90IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI284NCI+c29hcDo6bGFibGVuPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im84MiIgZG94eXRhZz0ic29hcDo6bGVuZ3RoIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHNpemVfdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvODIiPnNvYXA6Omxlbmd0aDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvODAiIGRveHl0YWc9InNvYXA6OmxldmVsIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHVuc2lnbmVkIGludCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvODAiPnNvYXA6OmxldmVsPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yMSIgZG94eXRhZz0ic29hcDo6bG9jYWxfbmFtZXNwYWNlcyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfbmFtZXNwYWNlLmh0bWwiPk5hbWVzcGFjZTwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28yMSI+c29hcDo6bG9jYWxfbmFtZXNwYWNlczwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMTMyIiBkb3h5dGFnPSJzb2FwOjpsb2dmaWxlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNvbnN0IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMzIiPnNvYXA6OmxvZ2ZpbGU8L2E+W1NPQVBfTUFYTE9HU10gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNjkiIGRveHl0YWc9InNvYXA6Om1hc3RlciIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzY5Ij5zb2FwOjptYXN0ZXI8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzExOSIgZG94eXRhZz0ic29hcDo6bWF4X2tlZXBfYWxpdmUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdW5zaWduZWQgaW50IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMTkiPnNvYXA6Om1heF9rZWVwX2FsaXZlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xMzQiIGRveHl0YWc9InNvYXA6Om1odCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3Qgc29hcF9tbGlzdCogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzEzNCI+c29hcDo6bWh0PC9hPltTT0FQX1BUUkhBU0hdICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEzMCIgZG94eXRhZz0ic29hcDo6bWltZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19taW1lLmh0bWwiPnNvYXBfbWltZTwvYT4gPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzEzMCI+c29hcDo6bWltZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMiIgZG94eXRhZz0ic29hcDo6bW9kZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0ZHNvYXAyXzhoLmh0bWwjYTE5NCI+c29hcF9tb2RlPC9hPiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMiI+c29hcDo6bW9kZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvODgiIGRveHl0YWc9InNvYXA6Om1zZ2J1ZiIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI284OCI+c29hcDo6bXNnYnVmPC9hPlsxMDI0XSAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xMDIiIGRveHl0YWc9InNvYXA6Om11c3RVbmRlcnN0YW5kIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHNob3J0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMDIiPnNvYXA6Om11c3RVbmRlcnN0YW5kPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yMCIgZG94eXRhZz0ic29hcDo6bmFtZXNwYWNlcyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjb25zdCBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfbmFtZXNwYWNlLmh0bWwiPk5hbWVzcGFjZTwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28yMCI+c29hcDo6bmFtZXNwYWNlczwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMjIiIGRveHl0YWc9InNvYXA6Om5saXN0IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX25saXN0Lmh0bWwiPnNvYXBfbmxpc3Q8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMjIiPnNvYXA6Om5saXN0PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xMDUiIGRveHl0YWc9InNvYXA6Om5zIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHNob3J0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMDUiPnNvYXA6Om5zPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xMDQiIGRveHl0YWc9InNvYXA6Om51bGwiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc2hvcnQgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzEwNCI+c29hcDo6bnVsbDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNCIgZG94eXRhZz0ic29hcDo6b21vZGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJzdGRzb2FwMl84aC5odG1sI2ExOTQiPnNvYXBfbW9kZTwvYT4gPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzQiPnNvYXA6Om9tb2RlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im83MSIgZG94eXRhZz0ic29hcDo6b3MiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdm9pZCogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzcxIj5zb2FwOjpvczwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvOTYiIGRveHl0YWc9InNvYXA6Om90aGVyIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHNob3J0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI285NiI+c29hcDo6b3RoZXI8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEwNiIgZG94eXRhZz0ic29hcDo6cGFydCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzaG9ydCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTA2Ij5zb2FwOjpwYXJ0PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8zNiIgZG94eXRhZz0ic29hcDo6cGFzc3dkIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28zNiI+c29hcDo6cGFzc3dkPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xMTIiIGRveHl0YWc9InNvYXA6OnBhdGgiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTEyIj5zb2FwOjpwYXRoPC9hPltTT0FQX1RBR0xFTl0gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMjgiIGRveHl0YWc9InNvYXA6OnBibGsiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fcGJsay5odG1sIj5zb2FwX3BibGs8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMjgiPnNvYXA6OnBibGs8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEwOCIgZG94eXRhZz0ic29hcDo6cGVla2VkIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHNob3J0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMDgiPnNvYXA6OnBlZWtlZDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMTQxIiBkb3h5dGFnPSJzb2FwOjpwZWVyIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCBzb2NrYWRkcl9pbiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTQxIj5zb2FwOjpwZWVyPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xNDIiIGRveHl0YWc9InNvYXA6OnBlZXJsZW4iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc2l6ZV90IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xNDIiPnNvYXA6OnBlZXJsZW48L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzI3IiBkb3h5dGFnPSJzb2FwOjpwaHQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fcGxpc3QuaHRtbCI+c29hcF9wbGlzdDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28yNyI+c29hcDo6cGh0PC9hPltTT0FQX1BUUkhBU0hdICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzI5IiBkb3h5dGFnPSJzb2FwOjpwaWR4IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHNob3J0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28yOSI+c29hcDo6cGlkeDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMzQiIGRveHl0YWc9InNvYXA6OnBsdWdpbnMiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fcGx1Z2luLmh0bWwiPnNvYXBfcGx1Z2luPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzM0Ij5zb2FwOjpwbHVnaW5zPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xMTgiIGRveHl0YWc9InNvYXA6OnBvcnQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMTgiPnNvYXA6OnBvcnQ8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzk3IiBkb3h5dGFnPSJzb2FwOjpwb3NpdGlvbiIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzaG9ydCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvOTciPnNvYXA6OnBvc2l0aW9uPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im85OCIgZG94eXRhZz0ic29hcDo6cG9zaXRpb25zIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvOTgiPnNvYXA6OnBvc2l0aW9uczwvYT5bU09BUF9NQVhESU1TXSAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xMTYiIGRveHl0YWc9InNvYXA6OnByb2xvZyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTE2Ij5zb2FwOjpwcm9sb2c8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEyMCIgZG94eXRhZz0ic29hcDo6cHJveHlfaG9zdCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjb25zdCBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTIwIj5zb2FwOjpwcm94eV9ob3N0PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xMjMiIGRveHl0YWc9InNvYXA6OnByb3h5X3Bhc3N3ZCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjb25zdCBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTIzIj5zb2FwOjpwcm94eV9wYXNzd2Q8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEyMSIgZG94eXRhZz0ic29hcDo6cHJveHlfcG9ydCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzEyMSI+c29hcDo6cHJveHlfcG9ydDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMTIyIiBkb3h5dGFnPSJzb2FwOjpwcm94eV91c2VyaWQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY29uc3QgY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzEyMiI+c29hcDo6cHJveHlfdXNlcmlkPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xMiIgZG94eXRhZz0ic29hcDo6cmVjdl90aW1lb3V0IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTIiPnNvYXA6OnJlY3ZfdGltZW91dDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNzQiIGRveHl0YWc9InNvYXA6OnJlY3ZmZCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzc0Ij5zb2FwOjpyZWN2ZmQ8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzk5IiBkb3h5dGFnPSJzb2FwOjpyb290IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHNob3J0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI285OSI+c29hcDo6cm9vdDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMTMiIGRveHl0YWc9InNvYXA6OnNlbmRfdGltZW91dCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzEzIj5zb2FwOjpzZW5kX3RpbWVvdXQ8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzczIiBkb3h5dGFnPSJzb2FwOjpzZW5kZmQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI283MyI+c29hcDo6c2VuZGZkPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im83MCIgZG94eXRhZz0ic29hcDo6c29ja2V0IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvNzAiPnNvYXA6OnNvY2tldDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMTYiIGRveHl0YWc9InNvYXA6OnNvY2tldF9mbGFncyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzE2Ij5zb2FwOjpzb2NrZXRfZmxhZ3M8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEyNCIgZG94eXRhZz0ic29hcDo6c3RhdHVzIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMTI0Ij5zb2FwOjpzdGF0dXM8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzg5IiBkb3h5dGFnPSJzb2FwOjp0YWciID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvODkiPnNvYXA6OnRhZzwvYT5bU09BUF9UQUdMRU5dICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzg3IiBkb3h5dGFnPSJzb2FwOjp0bXBidWYiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvODciPnNvYXA6OnRtcGJ1ZjwvYT5bMTAyNF0gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvOTIiIGRveHl0YWc9InNvYXA6OnR5cGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvOTIiPnNvYXA6OnR5cGU8L2E+W1NPQVBfVEFHTEVOXSAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8zMyIgZG94eXRhZz0ic29hcDo6dXNlciIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB2b2lkKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCNvMzMiPnNvYXA6OnVzZXI8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzM1IiBkb3h5dGFnPSJzb2FwOjp1c2VyaWQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzM1Ij5zb2FwOjp1c2VyaWQ8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InNvYXA6OnZlcnNpb24iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc2hvcnQgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwjbzAiPnNvYXA6OnZlcnNpb248L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEzMSIgZG94eXRhZz0ic29hcDo6eGxpc3QiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9feGxpc3QuaHRtbCI+c29hcF94bGlzdDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sI28xMzEiPnNvYXA6OnhsaXN0PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBzdHJ1Y3Qgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy9kb20vPGEgY2xhc3M9ImVsIiBocmVmPSJzdGRzb2FwMl84aC5odG1sIj5zdGRzb2FwMi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFRodSBBdWcgMTggMTE6Mjk6NTcgMjAwNSBmb3IgZ1NPQVAgbGV2ZWwtMiBET00gYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19hcnJheS1tZW1iZXJzLmh0bWwgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fYXJyYXktbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNmQxN2MKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fYXJyYXktbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIGxldmVsLTIgRE9NOiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+PC9kaXY+DQorPGgxPnNvYXBfYXJyYXkgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19hcnJheS5odG1sIj5zb2FwX2FycmF5PC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2FycmF5Lmh0bWwjbzAiPl9fcHRyPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fYXJyYXkuaHRtbCI+c29hcF9hcnJheTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2FycmF5Lmh0bWwjbzEiPl9fc2l6ZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2FycmF5Lmh0bWwiPnNvYXBfYXJyYXk8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFRodSBBdWcgMTggMTE6Mjk6NTcgMjAwNSBmb3IgZ1NPQVAgbGV2ZWwtMiBET00gYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19hcnJheS5odG1sIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2FycmF5Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIzNjhjNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19hcnJheS5odG1sCkBAIC0wLDAgKzEsNzEgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIGxldmVsLTIgRE9NOiBzb2FwX2FycmF5IFN0cnVjdCBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPjwvZGl2Pg0KKzxoMT5zb2FwX2FycmF5IFN0cnVjdCBSZWZlcmVuY2U8L2gxPjxjb2RlPiNpbmNsdWRlICZsdDtzdGRzb2FwMi5oJmd0OzwvY29kZT4NCis8cD4NCis8YSBocmVmPSJzdHJ1Y3Rzb2FwX19hcnJheS1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgQXR0cmlidXRlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD52b2lkICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fYXJyYXkuaHRtbCNvMCI+X19wdHI8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fYXJyYXkuaHRtbCNvMSI+X19zaXplPC9hPjwvdGQ+PC90cj4NCisNCis8L3RhYmxlPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InNvYXBfYXJyYXk6Ol9fcHRyIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHZvaWQqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fYXJyYXkuaHRtbCNvMCI+c29hcF9hcnJheTo6X19wdHI8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9InNvYXBfYXJyYXk6Ol9fc2l6ZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19hcnJheS5odG1sI28xIj5zb2FwX2FycmF5OjpfX3NpemU8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIHN0cnVjdCB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL2RvbS88YSBjbGFzcz0iZWwiIGhyZWY9InN0ZHNvYXAyXzhoLmh0bWwiPnN0ZHNvYXAyLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gVGh1IEF1ZyAxOCAxMToyOTo1NyAyMDA1IGZvciBnU09BUCBsZXZlbC0yIERPTSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2F0dHJpYnV0ZS1tZW1iZXJzLmh0bWwgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fYXR0cmlidXRlLW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2NkMDg5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2F0dHJpYnV0ZS1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwxOSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgbGV2ZWwtMiBET006IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT48L2Rpdj4NCis8aDE+c29hcF9hdHRyaWJ1dGUgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19hdHRyaWJ1dGUuaHRtbCI+c29hcF9hdHRyaWJ1dGU8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fYXR0cmlidXRlLmh0bWwjbzUiPm5hbWU8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19hdHRyaWJ1dGUuaHRtbCI+c29hcF9hdHRyaWJ1dGU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19hdHRyaWJ1dGUuaHRtbCNvMCI+bmV4dDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2F0dHJpYnV0ZS5odG1sIj5zb2FwX2F0dHJpYnV0ZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2F0dHJpYnV0ZS5odG1sI28zIj5uczwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2F0dHJpYnV0ZS5odG1sIj5zb2FwX2F0dHJpYnV0ZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2F0dHJpYnV0ZS5odG1sI28yIj5zaXplPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fYXR0cmlidXRlLmh0bWwiPnNvYXBfYXR0cmlidXRlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fYXR0cmlidXRlLmh0bWwjbzEiPnZhbHVlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fYXR0cmlidXRlLmh0bWwiPnNvYXBfYXR0cmlidXRlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fYXR0cmlidXRlLmh0bWwjbzQiPnZpc2libGU8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19hdHRyaWJ1dGUuaHRtbCI+c29hcF9hdHRyaWJ1dGU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFRodSBBdWcgMTggMTE6Mjk6NTcgMjAwNSBmb3IgZ1NPQVAgbGV2ZWwtMiBET00gYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19hdHRyaWJ1dGUuaHRtbCBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19hdHRyaWJ1dGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTZhMjMyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2F0dHJpYnV0ZS5odG1sCkBAIC0wLDAgKzEsMTcyIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBsZXZlbC0yIERPTTogc29hcF9hdHRyaWJ1dGUgU3RydWN0IFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+PC9kaXY+DQorPGgxPnNvYXBfYXR0cmlidXRlIFN0cnVjdCBSZWZlcmVuY2U8L2gxPjxjb2RlPiNpbmNsdWRlICZsdDtzdGRzb2FwMi5oJmd0OzwvY29kZT4NCis8cD4NCitDb2xsYWJvcmF0aW9uIGRpYWdyYW0gZm9yIHNvYXBfYXR0cmlidXRlOjxwPjxjZW50ZXI+PGltZyBzcmM9InN0cnVjdHNvYXBfX2F0dHJpYnV0ZV9fY29sbF9fZ3JhcGgucG5nIiBib3JkZXI9IjAiIHVzZW1hcD0iI3NvYXBfX2F0dHJpYnV0ZV9fY29sbF9fbWFwIiBhbHQ9IkNvbGxhYm9yYXRpb24gZ3JhcGgiPjwvY2VudGVyPg0KKzxjZW50ZXI+PGZvbnQgc2l6ZT0iMiI+WzxhIGhyZWY9ImdyYXBoX2xlZ2VuZC5odG1sIj5sZWdlbmQ8L2E+XTwvZm9udD48L2NlbnRlcj48YSBocmVmPSJzdHJ1Y3Rzb2FwX19hdHRyaWJ1dGUtbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19hdHRyaWJ1dGUuaHRtbCI+c29hcF9hdHRyaWJ1dGU8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fYXR0cmlidXRlLmh0bWwjbzAiPm5leHQ8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fYXR0cmlidXRlLmh0bWwjbzEiPnZhbHVlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c2l6ZV90Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2F0dHJpYnV0ZS5odG1sI28yIj5zaXplPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2F0dHJpYnV0ZS5odG1sI28zIj5uczwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnNob3J0Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2F0dHJpYnV0ZS5odG1sI280Ij52aXNpYmxlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19hdHRyaWJ1dGUuaHRtbCNvNSI+bmFtZTwvYT4gWzFdPC90ZD48L3RyPg0KKw0KKzwvdGFibGU+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNSIgZG94eXRhZz0ic29hcF9hdHRyaWJ1dGU6Om5hbWUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2F0dHJpYnV0ZS5odG1sI281Ij5zb2FwX2F0dHJpYnV0ZTo6bmFtZTwvYT5bMV0gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0ic29hcF9hdHRyaWJ1dGU6Om5leHQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fYXR0cmlidXRlLmh0bWwiPnNvYXBfYXR0cmlidXRlPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19hdHRyaWJ1dGUuaHRtbCNvMCI+c29hcF9hdHRyaWJ1dGU6Om5leHQ8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzMiIGRveHl0YWc9InNvYXBfYXR0cmlidXRlOjpucyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2F0dHJpYnV0ZS5odG1sI28zIj5zb2FwX2F0dHJpYnV0ZTo6bnM8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9InNvYXBfYXR0cmlidXRlOjpzaXplIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHNpemVfdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2F0dHJpYnV0ZS5odG1sI28yIj5zb2FwX2F0dHJpYnV0ZTo6c2l6ZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0ic29hcF9hdHRyaWJ1dGU6OnZhbHVlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fYXR0cmlidXRlLmh0bWwjbzEiPnNvYXBfYXR0cmlidXRlOjp2YWx1ZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNCIgZG94eXRhZz0ic29hcF9hdHRyaWJ1dGU6OnZpc2libGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc2hvcnQgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19hdHRyaWJ1dGUuaHRtbCNvNCI+c29hcF9hdHRyaWJ1dGU6OnZpc2libGU8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIHN0cnVjdCB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL2RvbS88YSBjbGFzcz0iZWwiIGhyZWY9InN0ZHNvYXAyXzhoLmh0bWwiPnN0ZHNvYXAyLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gVGh1IEF1ZyAxOCAxMToyOTo1NyAyMDA1IGZvciBnU09BUCBsZXZlbC0yIERPTSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2F0dHJpYnV0ZV9fY29sbF9fZ3JhcGgubWFwIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2F0dHJpYnV0ZV9fY29sbF9fZ3JhcGgubWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMTQ3NzkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fYXR0cmlidXRlX19jb2xsX19ncmFwaC5tYXAKQEAgLTAsMCArMSBAQAorYmFzZSByZWZlcmVyCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fYXR0cmlidXRlX19jb2xsX19ncmFwaC5tZDUgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fYXR0cmlidXRlX19jb2xsX19ncmFwaC5tZDUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNmN2M4MwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19hdHRyaWJ1dGVfX2NvbGxfX2dyYXBoLm1kNQpAQCAtMCwwICsxIEBACithYzMyNjM3M2UzODk3NWY5YjZiZDY5MTU2NzgzNGNlYgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19hdHRyaWJ1dGVfX2NvbGxfX2dyYXBoLnBuZyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19hdHRyaWJ1dGVfX2NvbGxfX2dyYXBoLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmQ4Y2U3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2F0dHJpYnV0ZV9fY29sbF9fZ3JhcGgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19ibGlzdC1tZW1iZXJzLmh0bWwgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fYmxpc3QtbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NzU2YjgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fYmxpc3QtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTYgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIGxldmVsLTIgRE9NOiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+PC9kaXY+DQorPGgxPnNvYXBfYmxpc3QgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19ibGlzdC5odG1sIj5zb2FwX2JsaXN0PC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2JsaXN0Lmh0bWwjbzAiPm5leHQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19ibGlzdC5odG1sIj5zb2FwX2JsaXN0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fYmxpc3QuaHRtbCNvMSI+cHRyPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fYmxpc3QuaHRtbCI+c29hcF9ibGlzdDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2JsaXN0Lmh0bWwjbzIiPnNpemU8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19ibGlzdC5odG1sIj5zb2FwX2JsaXN0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBUaHUgQXVnIDE4IDExOjI5OjU3IDIwMDUgZm9yIGdTT0FQIGxldmVsLTIgRE9NIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fYmxpc3QuaHRtbCBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19ibGlzdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMWQ3OTAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fYmxpc3QuaHRtbApAQCAtMCwwICsxLDk3IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBsZXZlbC0yIERPTTogc29hcF9ibGlzdCBTdHJ1Y3QgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT48L2Rpdj4NCis8aDE+c29hcF9ibGlzdCBTdHJ1Y3QgUmVmZXJlbmNlPC9oMT48Y29kZT4jaW5jbHVkZSAmbHQ7c3Rkc29hcDIuaCZndDs8L2NvZGU+DQorPHA+DQorQ29sbGFib3JhdGlvbiBkaWFncmFtIGZvciBzb2FwX2JsaXN0OjxwPjxjZW50ZXI+PGltZyBzcmM9InN0cnVjdHNvYXBfX2JsaXN0X19jb2xsX19ncmFwaC5wbmciIGJvcmRlcj0iMCIgdXNlbWFwPSIjc29hcF9fYmxpc3RfX2NvbGxfX21hcCIgYWx0PSJDb2xsYWJvcmF0aW9uIGdyYXBoIj48L2NlbnRlcj4NCis8Y2VudGVyPjxmb250IHNpemU9IjIiPls8YSBocmVmPSJncmFwaF9sZWdlbmQuaHRtbCI+bGVnZW5kPC9hPl08L2ZvbnQ+PC9jZW50ZXI+PGEgaHJlZj0ic3RydWN0c29hcF9fYmxpc3QtbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19ibGlzdC5odG1sIj5zb2FwX2JsaXN0PC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2JsaXN0Lmh0bWwjbzAiPm5leHQ8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fYmxpc3QuaHRtbCNvMSI+cHRyPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c2l6ZV90Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2JsaXN0Lmh0bWwjbzIiPnNpemU8L2E+PC90ZD48L3RyPg0KKw0KKzwvdGFibGU+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0ic29hcF9ibGlzdDo6bmV4dCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19ibGlzdC5odG1sIj5zb2FwX2JsaXN0PC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19ibGlzdC5odG1sI28wIj5zb2FwX2JsaXN0OjpuZXh0PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJzb2FwX2JsaXN0OjpwdHIiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19ibGlzdC5odG1sI28xIj5zb2FwX2JsaXN0OjpwdHI8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9InNvYXBfYmxpc3Q6OnNpemUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc2l6ZV90IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fYmxpc3QuaHRtbCNvMiI+c29hcF9ibGlzdDo6c2l6ZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgc3RydWN0IHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvZG9tLzxhIGNsYXNzPSJlbCIgaHJlZj0ic3Rkc29hcDJfOGguaHRtbCI+c3Rkc29hcDIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBUaHUgQXVnIDE4IDExOjI5OjU3IDIwMDUgZm9yIGdTT0FQIGxldmVsLTIgRE9NIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fYmxpc3RfX2NvbGxfX2dyYXBoLm1hcCBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19ibGlzdF9fY29sbF9fZ3JhcGgubWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMTQ3NzkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fYmxpc3RfX2NvbGxfX2dyYXBoLm1hcApAQCAtMCwwICsxIEBACitiYXNlIHJlZmVyZXIKZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19ibGlzdF9fY29sbF9fZ3JhcGgubWQ1IGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2JsaXN0X19jb2xsX19ncmFwaC5tZDUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY1MjM4NwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19ibGlzdF9fY29sbF9fZ3JhcGgubWQ1CkBAIC0wLDAgKzEgQEAKKzViYWYzYTEzM2FlOTNjMjUxZmIzODI1Mzc1NzEwNWRmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2JsaXN0X19jb2xsX19ncmFwaC5wbmcgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fYmxpc3RfX2NvbGxfX2dyYXBoLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjczZGM0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2JsaXN0X19jb2xsX19ncmFwaC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2NsaXN0LW1lbWJlcnMuaHRtbCBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19jbGlzdC1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU3ZjY1OAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19jbGlzdC1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwxOCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgbGV2ZWwtMiBET006IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT48L2Rpdj4NCis8aDE+c29hcF9jbGlzdCBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2NsaXN0Lmh0bWwiPnNvYXBfY2xpc3Q8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fY2xpc3QuaHRtbCNvNCI+ZmRlbGV0ZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2NsaXN0Lmh0bWwiPnNvYXBfY2xpc3Q8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19jbGlzdC5odG1sI28wIj5uZXh0PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fY2xpc3QuaHRtbCI+c29hcF9jbGlzdDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2NsaXN0Lmh0bWwjbzEiPnB0cjwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2NsaXN0Lmh0bWwiPnNvYXBfY2xpc3Q8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19jbGlzdC5odG1sI28zIj5zaXplPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fY2xpc3QuaHRtbCI+c29hcF9jbGlzdDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2NsaXN0Lmh0bWwjbzIiPnR5cGU8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19jbGlzdC5odG1sIj5zb2FwX2NsaXN0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBUaHUgQXVnIDE4IDExOjI5OjU3IDIwMDUgZm9yIGdTT0FQIGxldmVsLTIgRE9NIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fY2xpc3QuaHRtbCBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19jbGlzdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NDE2ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fY2xpc3QuaHRtbApAQCAtMCwwICsxLDE0NyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgbGV2ZWwtMiBET006IHNvYXBfY2xpc3QgU3RydWN0IFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+PC9kaXY+DQorPGgxPnNvYXBfY2xpc3QgU3RydWN0IFJlZmVyZW5jZTwvaDE+PGNvZGU+I2luY2x1ZGUgJmx0O3N0ZHNvYXAyLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KK0NvbGxhYm9yYXRpb24gZGlhZ3JhbSBmb3Igc29hcF9jbGlzdDo8cD48Y2VudGVyPjxpbWcgc3JjPSJzdHJ1Y3Rzb2FwX19jbGlzdF9fY29sbF9fZ3JhcGgucG5nIiBib3JkZXI9IjAiIHVzZW1hcD0iI3NvYXBfX2NsaXN0X19jb2xsX19tYXAiIGFsdD0iQ29sbGFib3JhdGlvbiBncmFwaCI+PC9jZW50ZXI+DQorPGNlbnRlcj48Zm9udCBzaXplPSIyIj5bPGEgaHJlZj0iZ3JhcGhfbGVnZW5kLmh0bWwiPmxlZ2VuZDwvYT5dPC9mb250PjwvY2VudGVyPjxhIGhyZWY9InN0cnVjdHNvYXBfX2NsaXN0LW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fY2xpc3QuaHRtbCI+c29hcF9jbGlzdDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19jbGlzdC5odG1sI28wIj5uZXh0PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+dm9pZCAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2NsaXN0Lmh0bWwjbzEiPnB0cjwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19jbGlzdC5odG1sI28yIj50eXBlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2NsaXN0Lmh0bWwjbzMiPnNpemU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD52b2lkKCombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fY2xpc3QuaHRtbCNvNCI+ZmRlbGV0ZTwvYT4gKShzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19jbGlzdC5odG1sIj5zb2FwX2NsaXN0PC9hPiAqKTwvdGQ+PC90cj4NCisNCis8L3RhYmxlPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzQiIGRveHl0YWc9InNvYXBfY2xpc3Q6OmZkZWxldGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdm9pZCgqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fY2xpc3QuaHRtbCNvNCI+c29hcF9jbGlzdDo6ZmRlbGV0ZTwvYT4pKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2NsaXN0Lmh0bWwiPnNvYXBfY2xpc3Q8L2E+ICopICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InNvYXBfY2xpc3Q6Om5leHQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fY2xpc3QuaHRtbCI+c29hcF9jbGlzdDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fY2xpc3QuaHRtbCNvMCI+c29hcF9jbGlzdDo6bmV4dDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0ic29hcF9jbGlzdDo6cHRyIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHZvaWQqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fY2xpc3QuaHRtbCNvMSI+c29hcF9jbGlzdDo6cHRyPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8zIiBkb3h5dGFnPSJzb2FwX2NsaXN0OjpzaXplIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2NsaXN0Lmh0bWwjbzMiPnNvYXBfY2xpc3Q6OnNpemU8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9InNvYXBfY2xpc3Q6OnR5cGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fY2xpc3QuaHRtbCNvMiI+c29hcF9jbGlzdDo6dHlwZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgc3RydWN0IHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvZG9tLzxhIGNsYXNzPSJlbCIgaHJlZj0ic3Rkc29hcDJfOGguaHRtbCI+c3Rkc29hcDIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBUaHUgQXVnIDE4IDExOjI5OjU3IDIwMDUgZm9yIGdTT0FQIGxldmVsLTIgRE9NIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fY2xpc3RfX2NvbGxfX2dyYXBoLm1hcCBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19jbGlzdF9fY29sbF9fZ3JhcGgubWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMTQ3NzkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fY2xpc3RfX2NvbGxfX2dyYXBoLm1hcApAQCAtMCwwICsxIEBACitiYXNlIHJlZmVyZXIKZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19jbGlzdF9fY29sbF9fZ3JhcGgubWQ1IGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2NsaXN0X19jb2xsX19ncmFwaC5tZDUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMzOWQyMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19jbGlzdF9fY29sbF9fZ3JhcGgubWQ1CkBAIC0wLDAgKzEgQEAKKzRmNGE3NDU5OWE4OGI5MjFjMzFjNTQ0OTE0ODQzNDRiClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2NsaXN0X19jb2xsX19ncmFwaC5wbmcgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fY2xpc3RfX2NvbGxfX2dyYXBoLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmM2NTRkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2NsaXN0X19jb2xsX19ncmFwaC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2NvZGVfX21hcC1tZW1iZXJzLmh0bWwgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fY29kZV9fbWFwLW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTNmNjZjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2NvZGVfX21hcC1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwxNSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgbGV2ZWwtMiBET006IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT48L2Rpdj4NCis8aDE+c29hcF9jb2RlX21hcCBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2NvZGVfX21hcC5odG1sIj5zb2FwX2NvZGVfbWFwPC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2NvZGVfX21hcC5odG1sI28wIj5jb2RlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fY29kZV9fbWFwLmh0bWwiPnNvYXBfY29kZV9tYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19jb2RlX19tYXAuaHRtbCNvMSI+c3RyaW5nPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fY29kZV9fbWFwLmh0bWwiPnNvYXBfY29kZV9tYXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFRodSBBdWcgMTggMTE6Mjk6NTcgMjAwNSBmb3IgZ1NPQVAgbGV2ZWwtMiBET00gYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19jb2RlX19tYXAuaHRtbCBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19jb2RlX19tYXAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDAyMWQwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2NvZGVfX21hcC5odG1sCkBAIC0wLDAgKzEsNzEgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIGxldmVsLTIgRE9NOiBzb2FwX2NvZGVfbWFwIFN0cnVjdCBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPjwvZGl2Pg0KKzxoMT5zb2FwX2NvZGVfbWFwIFN0cnVjdCBSZWZlcmVuY2U8L2gxPjxjb2RlPiNpbmNsdWRlICZsdDtzdGRzb2FwMi5oJmd0OzwvY29kZT4NCis8cD4NCis8YSBocmVmPSJzdHJ1Y3Rzb2FwX19jb2RlX19tYXAtbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+bG9uZyZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19jb2RlX19tYXAuaHRtbCNvMCI+Y29kZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19jb2RlX19tYXAuaHRtbCNvMSI+c3RyaW5nPC9hPjwvdGQ+PC90cj4NCisNCis8L3RhYmxlPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InNvYXBfY29kZV9tYXA6OmNvZGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gbG9uZyA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2NvZGVfX21hcC5odG1sI28wIj5zb2FwX2NvZGVfbWFwOjpjb2RlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJzb2FwX2NvZGVfbWFwOjpzdHJpbmciID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY29uc3QgY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19jb2RlX19tYXAuaHRtbCNvMSI+c29hcF9jb2RlX21hcDo6c3RyaW5nPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBzdHJ1Y3Qgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy9kb20vPGEgY2xhc3M9ImVsIiBocmVmPSJzdGRzb2FwMl84aC5odG1sIj5zdGRzb2FwMi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFRodSBBdWcgMTggMTE6Mjk6NTcgMjAwNSBmb3IgZ1NPQVAgbGV2ZWwtMiBET00gYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19jb2xsX19ncmFwaC5tYXAgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fY29sbF9fZ3JhcGgubWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMDZmODIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fY29sbF9fZ3JhcGgubWFwCkBAIC0wLDAgKzEsMTUgQEAKK2Jhc2UgcmVmZXJlcgorcmVjdCAkc3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwgNTQwLDUxMSA2NzEsNTM3CityZWN0ICRzdHJ1Y3Rzb2FwX19wbGlzdC5odG1sIDE5LDQ4IDkxLDc1CityZWN0ICRzdHJ1Y3Rzb2FwX19wYmxrLmh0bWwgMTc1LDExMSAyNDksMTM3CityZWN0ICRzdHJ1Y3Rzb2FwX19ubGlzdC5odG1sIDE3NiwyMDEgMjQ4LDIyOAorcmVjdCAkc3RydWN0X25hbWVzcGFjZS5odG1sIDE3MSwyNTIgMjUzLDI3OQorcmVjdCAkc3RydWN0c29hcF9feGxpc3QuaHRtbCAxNzYsMzQzIDI0OCwzNjkKK3JlY3QgJHN0cnVjdHNvYXBfX2F0dHJpYnV0ZS5odG1sIDE2NSw0MzMgMjU5LDQ2MAorcmVjdCAkc3RydWN0c29hcF9faWxpc3QuaHRtbCAxNzksNTI0IDI0NSw1NTEKK3JlY3QgJHN0cnVjdHNvYXBfX21pbWUuaHRtbCAxNzIsNTc1IDI1Miw2MDEKK3JlY3QgJHN0cnVjdHNvYXBfX3BsdWdpbi5odG1sIDE3MSw2NjUgMjUzLDY5MgorcmVjdCAkc3RydWN0c29hcF9fY29va2llLmh0bWwgMTY5LDc1NiAyNTUsNzgzCityZWN0ICRzdHJ1Y3Rzb2FwX19jbGlzdC5odG1sIDE3Niw4NDcgMjQ4LDg3MworcmVjdCAkc3RydWN0c29hcF9fYmxpc3QuaHRtbCAxNzYsOTM3IDI0OCw5NjQKK3JlY3QgJHN0cnVjdHNvYXBfX2RpbWUuaHRtbCAxNzMsOTg4IDI1MSwxMDE1CmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fY29sbF9fZ3JhcGgubWQ1IGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2NvbGxfX2dyYXBoLm1kNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGE3MDRjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2NvbGxfX2dyYXBoLm1kNQpAQCAtMCwwICsxIEBACiszNjYxODZiMmJhNDQ5ZDQ4YzFjODNmY2RmODA5OWU0MQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19jb2xsX19ncmFwaC5wbmcgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fY29sbF9fZ3JhcGgucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYTMyMWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fY29sbF9fZ3JhcGgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19jb29raWUtbWVtYmVycy5odG1sIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2Nvb2tpZS1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk4M2MxOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19jb29raWUtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMjQgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIGxldmVsLTIgRE9NOiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+PC9kaXY+DQorPGgxPnNvYXBfY29va2llIE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fY29va2llLmh0bWwiPnNvYXBfY29va2llPC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2Nvb2tpZS5odG1sI28zIj5kb21haW48L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19jb29raWUuaHRtbCI+c29hcF9jb29raWU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19jb29raWUuaHRtbCNvOSI+ZW52PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fY29va2llLmh0bWwiPnNvYXBfY29va2llPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fY29va2llLmh0bWwjbzUiPmV4cGlyZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2Nvb2tpZS5odG1sIj5zb2FwX2Nvb2tpZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2Nvb2tpZS5odG1sI28xMCI+bW9kaWZpZWQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19jb29raWUuaHRtbCI+c29hcF9jb29raWU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19jb29raWUuaHRtbCNvMSI+bmFtZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2Nvb2tpZS5odG1sIj5zb2FwX2Nvb2tpZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2Nvb2tpZS5odG1sI28wIj5uZXh0PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fY29va2llLmh0bWwiPnNvYXBfY29va2llPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fY29va2llLmh0bWwjbzQiPnBhdGg8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19jb29raWUuaHRtbCI+c29hcF9jb29raWU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19jb29raWUuaHRtbCNvNyI+c2VjdXJlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fY29va2llLmh0bWwiPnNvYXBfY29va2llPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fY29va2llLmh0bWwjbzgiPnNlc3Npb248L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19jb29raWUuaHRtbCI+c29hcF9jb29raWU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19jb29raWUuaHRtbCNvMiI+dmFsdWU8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19jb29raWUuaHRtbCI+c29hcF9jb29raWU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19jb29raWUuaHRtbCNvNiI+dmVyc2lvbjwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2Nvb2tpZS5odG1sIj5zb2FwX2Nvb2tpZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gVGh1IEF1ZyAxOCAxMToyOTo1NyAyMDA1IGZvciBnU09BUCBsZXZlbC0yIERPTSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2Nvb2tpZS5odG1sIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2Nvb2tpZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NjkzZTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fY29va2llLmh0bWwKQEAgLTAsMCArMSwyOTcgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIGxldmVsLTIgRE9NOiBzb2FwX2Nvb2tpZSBTdHJ1Y3QgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT48L2Rpdj4NCis8aDE+c29hcF9jb29raWUgU3RydWN0IFJlZmVyZW5jZTwvaDE+PGNvZGU+I2luY2x1ZGUgJmx0O3N0ZHNvYXAyLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KK0NvbGxhYm9yYXRpb24gZGlhZ3JhbSBmb3Igc29hcF9jb29raWU6PHA+PGNlbnRlcj48aW1nIHNyYz0ic3RydWN0c29hcF9fY29va2llX19jb2xsX19ncmFwaC5wbmciIGJvcmRlcj0iMCIgdXNlbWFwPSIjc29hcF9fY29va2llX19jb2xsX19tYXAiIGFsdD0iQ29sbGFib3JhdGlvbiBncmFwaCI+PC9jZW50ZXI+DQorPGNlbnRlcj48Zm9udCBzaXplPSIyIj5bPGEgaHJlZj0iZ3JhcGhfbGVnZW5kLmh0bWwiPmxlZ2VuZDwvYT5dPC9mb250PjwvY2VudGVyPjxhIGhyZWY9InN0cnVjdHNvYXBfX2Nvb2tpZS1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgQXR0cmlidXRlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2Nvb2tpZS5odG1sIj5zb2FwX2Nvb2tpZTwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19jb29raWUuaHRtbCNvMCI+bmV4dDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19jb29raWUuaHRtbCNvMSI+bmFtZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19jb29raWUuaHRtbCNvMiI+dmFsdWU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fY29va2llLmh0bWwjbzMiPmRvbWFpbjwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19jb29raWUuaHRtbCNvNCI+cGF0aDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmxvbmcmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fY29va2llLmh0bWwjbzUiPmV4cGlyZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnVuc2lnbmVkIGludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19jb29raWUuaHRtbCNvNiI+dmVyc2lvbjwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnNob3J0Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2Nvb2tpZS5odG1sI283Ij5zZWN1cmU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zaG9ydCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19jb29raWUuaHRtbCNvOCI+c2Vzc2lvbjwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnNob3J0Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2Nvb2tpZS5odG1sI285Ij5lbnY8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zaG9ydCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19jb29raWUuaHRtbCNvMTAiPm1vZGlmaWVkPC9hPjwvdGQ+PC90cj4NCisNCis8L3RhYmxlPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzMiIGRveHl0YWc9InNvYXBfY29va2llOjpkb21haW4iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19jb29raWUuaHRtbCNvMyI+c29hcF9jb29raWU6OmRvbWFpbjwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvOSIgZG94eXRhZz0ic29hcF9jb29raWU6OmVudiIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzaG9ydCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2Nvb2tpZS5odG1sI285Ij5zb2FwX2Nvb2tpZTo6ZW52PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im81IiBkb3h5dGFnPSJzb2FwX2Nvb2tpZTo6ZXhwaXJlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGxvbmcgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19jb29raWUuaHRtbCNvNSI+c29hcF9jb29raWU6OmV4cGlyZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMTAiIGRveHl0YWc9InNvYXBfY29va2llOjptb2RpZmllZCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzaG9ydCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2Nvb2tpZS5odG1sI28xMCI+c29hcF9jb29raWU6Om1vZGlmaWVkPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJzb2FwX2Nvb2tpZTo6bmFtZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2Nvb2tpZS5odG1sI28xIj5zb2FwX2Nvb2tpZTo6bmFtZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0ic29hcF9jb29raWU6Om5leHQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fY29va2llLmh0bWwiPnNvYXBfY29va2llPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19jb29raWUuaHRtbCNvMCI+c29hcF9jb29raWU6Om5leHQ8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzQiIGRveHl0YWc9InNvYXBfY29va2llOjpwYXRoIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fY29va2llLmh0bWwjbzQiPnNvYXBfY29va2llOjpwYXRoPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im83IiBkb3h5dGFnPSJzb2FwX2Nvb2tpZTo6c2VjdXJlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHNob3J0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fY29va2llLmh0bWwjbzciPnNvYXBfY29va2llOjpzZWN1cmU8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzgiIGRveHl0YWc9InNvYXBfY29va2llOjpzZXNzaW9uIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHNob3J0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fY29va2llLmh0bWwjbzgiPnNvYXBfY29va2llOjpzZXNzaW9uPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJzb2FwX2Nvb2tpZTo6dmFsdWUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19jb29raWUuaHRtbCNvMiI+c29hcF9jb29raWU6OnZhbHVlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im82IiBkb3h5dGFnPSJzb2FwX2Nvb2tpZTo6dmVyc2lvbiIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB1bnNpZ25lZCBpbnQgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19jb29raWUuaHRtbCNvNiI+c29hcF9jb29raWU6OnZlcnNpb248L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIHN0cnVjdCB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL2RvbS88YSBjbGFzcz0iZWwiIGhyZWY9InN0ZHNvYXAyXzhoLmh0bWwiPnN0ZHNvYXAyLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gVGh1IEF1ZyAxOCAxMToyOTo1NyAyMDA1IGZvciBnU09BUCBsZXZlbC0yIERPTSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2Nvb2tpZV9fY29sbF9fZ3JhcGgubWFwIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2Nvb2tpZV9fY29sbF9fZ3JhcGgubWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMTQ3NzkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fY29va2llX19jb2xsX19ncmFwaC5tYXAKQEAgLTAsMCArMSBAQAorYmFzZSByZWZlcmVyCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fY29va2llX19jb2xsX19ncmFwaC5tZDUgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fY29va2llX19jb2xsX19ncmFwaC5tZDUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg2ZjlmMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19jb29raWVfX2NvbGxfX2dyYXBoLm1kNQpAQCAtMCwwICsxIEBACis4NGY1MDYyOTE5NWI5MWI1N2M2MmY0NTI5NTkwMjMzMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19jb29raWVfX2NvbGxfX2dyYXBoLnBuZyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19jb29raWVfX2NvbGxfX2dyYXBoLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmM5MTU0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2Nvb2tpZV9fY29sbF9fZ3JhcGgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19kaW1lLW1lbWJlcnMuaHRtbCBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19kaW1lLW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDIzMjk3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2RpbWUtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMjUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIGxldmVsLTIgRE9NOiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+PC9kaXY+DQorPGgxPnNvYXBfZGltZSBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RpbWUuaHRtbCI+c29hcF9kaW1lPC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RpbWUuaHRtbCNvMyI+YnVmbGVuPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZGltZS5odG1sIj5zb2FwX2RpbWU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kaW1lLmh0bWwjbzIiPmNodW5rc2l6ZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RpbWUuaHRtbCI+c29hcF9kaW1lPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZGltZS5odG1sI28wIj5jb3VudDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RpbWUuaHRtbCI+c29hcF9kaW1lPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZGltZS5odG1sI28xMCI+Zmlyc3Q8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kaW1lLmh0bWwiPnNvYXBfZGltZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RpbWUuaHRtbCNvNCI+ZmxhZ3M8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kaW1lLmh0bWwiPnNvYXBfZGltZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RpbWUuaHRtbCNvNiI+aWQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kaW1lLmh0bWwiPnNvYXBfZGltZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RpbWUuaHRtbCNvMTEiPmxhc3Q8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kaW1lLmh0bWwiPnNvYXBfZGltZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RpbWUuaHRtbCNvOSI+bGlzdDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RpbWUuaHRtbCI+c29hcF9kaW1lPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZGltZS5odG1sI284Ij5vcHRpb25zPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZGltZS5odG1sIj5zb2FwX2RpbWU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kaW1lLmh0bWwjbzUiPnB0cjwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RpbWUuaHRtbCI+c29hcF9kaW1lPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZGltZS5odG1sI28xIj5zaXplPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZGltZS5odG1sIj5zb2FwX2RpbWU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kaW1lLmh0bWwjbzciPnR5cGU8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kaW1lLmh0bWwiPnNvYXBfZGltZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gVGh1IEF1ZyAxOCAxMToyOTo1NyAyMDA1IGZvciBnU09BUCBsZXZlbC0yIERPTSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2RpbWUuaHRtbCBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19kaW1lLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdiODYyOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19kaW1lLmh0bWwKQEAgLTAsMCArMSwzMjUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIGxldmVsLTIgRE9NOiBzb2FwX2RpbWUgU3RydWN0IFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+PC9kaXY+DQorPGgxPnNvYXBfZGltZSBTdHJ1Y3QgUmVmZXJlbmNlPC9oMT48Y29kZT4jaW5jbHVkZSAmbHQ7c3Rkc29hcDIuaCZndDs8L2NvZGU+DQorPHA+DQorQ29sbGFib3JhdGlvbiBkaWFncmFtIGZvciBzb2FwX2RpbWU6PHA+PGNlbnRlcj48aW1nIHNyYz0ic3RydWN0c29hcF9fZGltZV9fY29sbF9fZ3JhcGgucG5nIiBib3JkZXI9IjAiIHVzZW1hcD0iI3NvYXBfX2RpbWVfX2NvbGxfX21hcCIgYWx0PSJDb2xsYWJvcmF0aW9uIGdyYXBoIj48L2NlbnRlcj4NCis8bWFwIG5hbWU9InNvYXBfX2RpbWVfX2NvbGxfX21hcCI+DQorPGFyZWEgaHJlZj0ic3RydWN0c29hcF9fbXVsdGlwYXJ0Lmh0bWwiIHNoYXBlPSJyZWN0IiBjb29yZHM9IjcsMTcsMTA1LDQ0IiBhbHQ9IiI+DQorPC9tYXA+DQorPGNlbnRlcj48Zm9udCBzaXplPSIyIj5bPGEgaHJlZj0iZ3JhcGhfbGVnZW5kLmh0bWwiPmxlZ2VuZDwvYT5dPC9mb250PjwvY2VudGVyPjxhIGhyZWY9InN0cnVjdHNvYXBfX2RpbWUtbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c2l6ZV90Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RpbWUuaHRtbCNvMCI+Y291bnQ8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zaXplX3QmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZGltZS5odG1sI28xIj5zaXplPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c2l6ZV90Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RpbWUuaHRtbCNvMiI+Y2h1bmtzaXplPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c2l6ZV90Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RpbWUuaHRtbCNvMyI+YnVmbGVuPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kaW1lLmh0bWwjbzQiPmZsYWdzPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RpbWUuaHRtbCNvNSI+cHRyPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RpbWUuaHRtbCNvNiI+aWQ8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jb25zdCBjaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZGltZS5odG1sI283Ij50eXBlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RpbWUuaHRtbCNvOCI+b3B0aW9uczwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbXVsdGlwYXJ0Lmh0bWwiPnNvYXBfbXVsdGlwYXJ0PC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RpbWUuaHRtbCNvOSI+bGlzdDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbXVsdGlwYXJ0Lmh0bWwiPnNvYXBfbXVsdGlwYXJ0PC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RpbWUuaHRtbCNvMTAiPmZpcnN0PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19tdWx0aXBhcnQuaHRtbCI+c29hcF9tdWx0aXBhcnQ8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZGltZS5odG1sI28xMSI+bGFzdDwvYT48L3RkPjwvdHI+DQorDQorPC90YWJsZT4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8zIiBkb3h5dGFnPSJzb2FwX2RpbWU6OmJ1ZmxlbiIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzaXplX3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kaW1lLmh0bWwjbzMiPnNvYXBfZGltZTo6YnVmbGVuPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJzb2FwX2RpbWU6OmNodW5rc2l6ZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzaXplX3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kaW1lLmh0bWwjbzIiPnNvYXBfZGltZTo6Y2h1bmtzaXplPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJzb2FwX2RpbWU6OmNvdW50IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHNpemVfdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RpbWUuaHRtbCNvMCI+c29hcF9kaW1lOjpjb3VudDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMTAiIGRveHl0YWc9InNvYXBfZGltZTo6Zmlyc3QiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbXVsdGlwYXJ0Lmh0bWwiPnNvYXBfbXVsdGlwYXJ0PC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kaW1lLmh0bWwjbzEwIj5zb2FwX2RpbWU6OmZpcnN0PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im80IiBkb3h5dGFnPSJzb2FwX2RpbWU6OmZsYWdzIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kaW1lLmh0bWwjbzQiPnNvYXBfZGltZTo6ZmxhZ3M8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzYiIGRveHl0YWc9InNvYXBfZGltZTo6aWQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY29uc3QgY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kaW1lLmh0bWwjbzYiPnNvYXBfZGltZTo6aWQ8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzExIiBkb3h5dGFnPSJzb2FwX2RpbWU6Omxhc3QiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbXVsdGlwYXJ0Lmh0bWwiPnNvYXBfbXVsdGlwYXJ0PC9hPiAqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZGltZS5odG1sI28xMSI+c29hcF9kaW1lOjpsYXN0PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im85IiBkb3h5dGFnPSJzb2FwX2RpbWU6Omxpc3QiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbXVsdGlwYXJ0Lmh0bWwiPnNvYXBfbXVsdGlwYXJ0PC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kaW1lLmh0bWwjbzkiPnNvYXBfZGltZTo6bGlzdDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvOCIgZG94eXRhZz0ic29hcF9kaW1lOjpvcHRpb25zIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNvbnN0IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZGltZS5odG1sI284Ij5zb2FwX2RpbWU6Om9wdGlvbnM8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzUiIGRveHl0YWc9InNvYXBfZGltZTo6cHRyIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZGltZS5odG1sI281Ij5zb2FwX2RpbWU6OnB0cjwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0ic29hcF9kaW1lOjpzaXplIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHNpemVfdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RpbWUuaHRtbCNvMSI+c29hcF9kaW1lOjpzaXplPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im83IiBkb3h5dGFnPSJzb2FwX2RpbWU6OnR5cGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY29uc3QgY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kaW1lLmh0bWwjbzciPnNvYXBfZGltZTo6dHlwZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgc3RydWN0IHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvZG9tLzxhIGNsYXNzPSJlbCIgaHJlZj0ic3Rkc29hcDJfOGguaHRtbCI+c3Rkc29hcDIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBUaHUgQXVnIDE4IDExOjI5OjU3IDIwMDUgZm9yIGdTT0FQIGxldmVsLTIgRE9NIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fZGltZV9fY29sbF9fZ3JhcGgubWFwIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2RpbWVfX2NvbGxfX2dyYXBoLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTAzMThiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2RpbWVfX2NvbGxfX2dyYXBoLm1hcApAQCAtMCwwICsxLDIgQEAKK2Jhc2UgcmVmZXJlcgorcmVjdCAkc3RydWN0c29hcF9fbXVsdGlwYXJ0Lmh0bWwgNywxNyAxMDUsNDQKZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19kaW1lX19jb2xsX19ncmFwaC5tZDUgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fZGltZV9fY29sbF9fZ3JhcGgubWQ1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZTAxODIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fZGltZV9fY29sbF9fZ3JhcGgubWQ1CkBAIC0wLDAgKzEgQEAKKzg1YTI3ZjMzMDFiMWYwNWI2NDc1ZjI1ZjZjNDQ4NmFmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2RpbWVfX2NvbGxfX2dyYXBoLnBuZyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19kaW1lX19jb2xsX19ncmFwaC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJmZTY0MwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19kaW1lX19jb2xsX19ncmFwaC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLW1lbWJlcnMuaHRtbCBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UzODI4OAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwzMCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgbGV2ZWwtMiBET006IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT48L2Rpdj4NCis8aDE+c29hcF9kb21fYXR0cmlidXRlIE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCI+c29hcF9kb21fYXR0cmlidXRlPC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwjYTIiPmJlZ2luPC9hPigpPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sIj5zb2FwX2RvbV9hdHRyaWJ1dGU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI28zIj5kYXRhPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCI+c29hcF9kb21fYXR0cmlidXRlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCNhMyI+ZW5kPC9hPigpPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sIj5zb2FwX2RvbV9hdHRyaWJ1dGU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI2E0Ij5maW5kPC9hPihjb25zdCBjaGFyICpuc3RyLCBjb25zdCBjaGFyICpuYW1lKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCI+c29hcF9kb21fYXR0cmlidXRlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCN3MCI+aXRlcmF0b3I8L2E+IHR5cGVkZWY8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwiPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwjbzIiPm5hbWU8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sIj5zb2FwX2RvbV9hdHRyaWJ1dGU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI28wIj5uZXh0PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCI+c29hcF9kb21fYXR0cmlidXRlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCNvMSI+bnN0cjwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwiPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwjYTAiPnNldDwvYT4oY29uc3QgY2hhciAqbnN0ciwgY29uc3QgY2hhciAqbmFtZSk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwiPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwjYTEiPnNldDwvYT4oY29uc3QgY2hhciAqZGF0YSk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwiPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwjbzUiPnNvYXA8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sIj5zb2FwX2RvbV9hdHRyaWJ1dGU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI2E2Ij5zb2FwX2RvbV9hdHRyaWJ1dGU8L2E+KCk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwiPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwjYTciPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT4oc3RydWN0IHNvYXAgKnNvYXApPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sIj5zb2FwX2RvbV9hdHRyaWJ1dGU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI2E4Ij5zb2FwX2RvbV9hdHRyaWJ1dGU8L2E+KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuc3RyLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkYXRhKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCI+c29hcF9kb21fYXR0cmlidXRlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCNhNSI+dW5saW5rPC9hPigpPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sIj5zb2FwX2RvbV9hdHRyaWJ1dGU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI280Ij53aWRlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCI+c29hcF9kb21fYXR0cmlidXRlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCNhOSI+fnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT4oKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCI+c29hcF9kb21fYXR0cmlidXRlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBTYXQgQXVnIDIwIDEyOjI0OjM2IDIwMDUgZm9yIGdTT0FQIGxldmVsLTIgRE9NIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MDhjYTAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbApAQCAtMCwwICsxLDUzNiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgbGV2ZWwtMiBET006IHNvYXBfZG9tX2F0dHJpYnV0ZSBTdHJ1Y3QgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT48L2Rpdj4NCis8aDE+c29hcF9kb21fYXR0cmlidXRlIFN0cnVjdCBSZWZlcmVuY2U8L2gxPjxjb2RlPiNpbmNsdWRlICZsdDtzdGRzb2FwMi5oJmd0OzwvY29kZT4NCis8cD4NCitDb2xsYWJvcmF0aW9uIGRpYWdyYW0gZm9yIHNvYXBfZG9tX2F0dHJpYnV0ZTo8cD48Y2VudGVyPjxpbWcgc3JjPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZV9fY29sbF9fZ3JhcGgucG5nIiBib3JkZXI9IjAiIHVzZW1hcD0iI3NvYXBfX2RvbV9fYXR0cmlidXRlX19jb2xsX19tYXAiIGFsdD0iQ29sbGFib3JhdGlvbiBncmFwaCI+PC9jZW50ZXI+DQorPGNlbnRlcj48Zm9udCBzaXplPSIyIj5bPGEgaHJlZj0iZ3JhcGhfbGVnZW5kLmh0bWwiPmxlZ2VuZDwvYT5dPC9mb250PjwvY2VudGVyPjxhIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBUeXBlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD50eXBlZGVmIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2F0dHJpYnV0ZV9faXRlcmF0b3IuaHRtbCI+c29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yPC9hPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI3cwIj5pdGVyYXRvcjwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgTWVtYmVyIEZ1bmN0aW9uczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwiPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT4gJmFtcDsmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCNhMCI+c2V0PC9hPiAoY29uc3QgY2hhciAqPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI28xIj5uc3RyPC9hPiwgY29uc3QgY2hhciAqPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI28yIj5uYW1lPC9hPik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCI+c29hcF9kb21fYXR0cmlidXRlPC9hPiAmYW1wOyZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI2ExIj5zZXQ8L2E+IChjb25zdCBjaGFyICo8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwjbzMiPmRhdGE8L2E+KTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fYXR0cmlidXRlX19pdGVyYXRvci5odG1sIj5zb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I8L2E+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwjYTIiPmJlZ2luPC9hPiAoKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fYXR0cmlidXRlX19pdGVyYXRvci5odG1sIj5zb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I8L2E+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwjYTMiPmVuZDwvYT4gKCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2F0dHJpYnV0ZV9faXRlcmF0b3IuaHRtbCI+c29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yPC9hPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI2E0Ij5maW5kPC9hPiAoY29uc3QgY2hhciAqPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI28xIj5uc3RyPC9hPiwgY29uc3QgY2hhciAqPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI28yIj5uYW1lPC9hPik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnZvaWQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCNhNSI+dW5saW5rPC9hPiAoKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwjYTYiPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT4gKCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI2E3Ij5zb2FwX2RvbV9hdHRyaWJ1dGU8L2E+IChzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI281Ij5zb2FwPC9hPiAqPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI281Ij5zb2FwPC9hPik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI2E4Ij5zb2FwX2RvbV9hdHRyaWJ1dGU8L2E+IChzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI281Ij5zb2FwPC9hPiAqPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI281Ij5zb2FwPC9hPiwgY29uc3QgY2hhciAqPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI28xIj5uc3RyPC9hPiwgY29uc3QgY2hhciAqPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI28yIj5uYW1lPC9hPiwgY29uc3QgY2hhciAqPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI28zIj5kYXRhPC9hPik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI2E5Ij5+c29hcF9kb21fYXR0cmlidXRlPC9hPiAoKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCI+c29hcF9kb21fYXR0cmlidXRlPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwjbzAiPm5leHQ8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jb25zdCBjaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCNvMSI+bnN0cjwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI28yIj5uYW1lPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwjbzMiPmRhdGE8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD53Y2hhcl90ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCNvNCI+d2lkZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCNvNSI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI281Ij5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8L3RhYmxlPg0KKzxocj48aDI+TWVtYmVyIFR5cGVkZWYgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0idzAiIGRveHl0YWc9InNvYXBfZG9tX2F0dHJpYnV0ZTo6aXRlcmF0b3IiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdHlwZWRlZiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19hdHRyaWJ1dGVfX2l0ZXJhdG9yLmh0bWwiPnNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjwvYT4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fYXR0cmlidXRlX19pdGVyYXRvci5odG1sIj5zb2FwX2RvbV9hdHRyaWJ1dGU6Oml0ZXJhdG9yPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj48aDI+Q29uc3RydWN0b3IgJmFtcDsgRGVzdHJ1Y3RvciBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNiIgZG94eXRhZz0ic29hcF9kb21fYXR0cmlidXRlOjpzb2FwX2RvbV9hdHRyaWJ1dGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc29hcF9kb21fYXR0cmlidXRlOjpzb2FwX2RvbV9hdHRyaWJ1dGUgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE3IiBkb3h5dGFnPSJzb2FwX2RvbV9hdHRyaWJ1dGU6OnNvYXBfZG9tX2F0dHJpYnV0ZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzb2FwX2RvbV9hdHRyaWJ1dGU6OnNvYXBfZG9tX2F0dHJpYnV0ZSAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwjbzUiPnNvYXA8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhOCIgZG94eXRhZz0ic29hcF9kb21fYXR0cmlidXRlOjpzb2FwX2RvbV9hdHRyaWJ1dGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc29hcF9kb21fYXR0cmlidXRlOjpzb2FwX2RvbV9hdHRyaWJ1dGUgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI281Ij5zb2FwPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPm5zdHI8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPm5hbWU8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmRhdGE8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTkiIGRveHl0YWc9InNvYXBfZG9tX2F0dHJpYnV0ZTo6fnNvYXBfZG9tX2F0dHJpYnV0ZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzb2FwX2RvbV9hdHRyaWJ1dGU6On48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwiPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT4gICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj48aDI+TWVtYmVyIEZ1bmN0aW9uIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEyIiBkb3h5dGFnPSJzb2FwX2RvbV9hdHRyaWJ1dGU6OmJlZ2luIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2F0dHJpYnV0ZV9faXRlcmF0b3IuaHRtbCI+c29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yPC9hPiBzb2FwX2RvbV9hdHRyaWJ1dGU6OmJlZ2luICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMyIgZG94eXRhZz0ic29hcF9kb21fYXR0cmlidXRlOjplbmQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fYXR0cmlidXRlX19pdGVyYXRvci5odG1sIj5zb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I8L2E+IHNvYXBfZG9tX2F0dHJpYnV0ZTo6ZW5kICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNCIgZG94eXRhZz0ic29hcF9kb21fYXR0cmlidXRlOjpmaW5kIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2F0dHJpYnV0ZV9faXRlcmF0b3IuaHRtbCI+c29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yPC9hPiBzb2FwX2RvbV9hdHRyaWJ1dGU6OmZpbmQgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+bnN0cjwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+bmFtZTwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMSIgZG94eXRhZz0ic29hcF9kb21fYXR0cmlidXRlOjpzZXQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCI+c29hcF9kb21fYXR0cmlidXRlPC9hPiZhbXA7IHNvYXBfZG9tX2F0dHJpYnV0ZTo6c2V0ICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiA8ZW0+ZGF0YTwvZW0+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTAiIGRveHl0YWc9InNvYXBfZG9tX2F0dHJpYnV0ZTo6c2V0IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwiPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT4mYW1wOyBzb2FwX2RvbV9hdHRyaWJ1dGU6OnNldCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5uc3RyPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5uYW1lPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE1IiBkb3h5dGFnPSJzb2FwX2RvbV9hdHRyaWJ1dGU6OnVubGluayIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB2b2lkIHNvYXBfZG9tX2F0dHJpYnV0ZTo6dW5saW5rICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8zIiBkb3h5dGFnPSJzb2FwX2RvbV9hdHRyaWJ1dGU6OmRhdGEiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI28zIj5zb2FwX2RvbV9hdHRyaWJ1dGU6OmRhdGE8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9InNvYXBfZG9tX2F0dHJpYnV0ZTo6bmFtZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwjbzIiPnNvYXBfZG9tX2F0dHJpYnV0ZTo6bmFtZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0ic29hcF9kb21fYXR0cmlidXRlOjpuZXh0IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwiPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCNvMCI+c29hcF9kb21fYXR0cmlidXRlOjpuZXh0PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJzb2FwX2RvbV9hdHRyaWJ1dGU6Om5zdHIiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY29uc3QgY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI28xIj5zb2FwX2RvbV9hdHRyaWJ1dGU6Om5zdHI8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzUiIGRveHl0YWc9InNvYXBfZG9tX2F0dHJpYnV0ZTo6c29hcCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI281Ij5zb2FwPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sI281Ij5zb2FwX2RvbV9hdHRyaWJ1dGU6OnNvYXA8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzQiIGRveHl0YWc9InNvYXBfZG9tX2F0dHJpYnV0ZTo6d2lkZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB3Y2hhcl90KiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwjbzQiPnNvYXBfZG9tX2F0dHJpYnV0ZTo6d2lkZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgc3RydWN0IHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvZG9tLzxhIGNsYXNzPSJlbCIgaHJlZj0ic3Rkc29hcDJfOGguaHRtbCI+c3Rkc29hcDIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBTYXQgQXVnIDIwIDEyOjI0OjM2IDIwMDUgZm9yIGdTT0FQIGxldmVsLTIgRE9NIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGVfX2NvbGxfX2dyYXBoLm1hcCBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZV9fY29sbF9fZ3JhcGgubWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMTQ3NzkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGVfX2NvbGxfX2dyYXBoLm1hcApAQCAtMCwwICsxIEBACitiYXNlIHJlZmVyZXIKZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZV9fY29sbF9fZ3JhcGgubWQ1IGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlX19jb2xsX19ncmFwaC5tZDUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcyNDA5NwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZV9fY29sbF9fZ3JhcGgubWQ1CkBAIC0wLDAgKzEgQEAKKzc4ZjAyMzNhZWY4NTI5NGFjMDVhN2IxMWEyYTI2Y2Y1ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlX19jb2xsX19ncmFwaC5wbmcgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGVfX2NvbGxfX2dyYXBoLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjQ5Njc4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlX19jb2xsX19ncmFwaC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC1tZW1iZXJzLmh0bWwgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fZG9tX19lbGVtZW50LW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDgwMmU4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSw0NSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgbGV2ZWwtMiBET006IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT48L2Rpdj4NCis8aDE+c29hcF9kb21fZWxlbWVudCBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI2EzIj5hZGQ8L2E+KHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICopPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI2E0Ij5hZGQ8L2E+KHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICZhbXA7KTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNhNSI+YWRkPC9hPihzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICopPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI2E2Ij5hZGQ8L2E+KHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgJmFtcDspPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI28zIj5hdHRzPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNhNyI+YmVnaW48L2E+KCk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzYiPmRhdGE8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI28yIj5lbHRzPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNhOCI+ZW5kPC9hPigpPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI2E5Ij5maW5kPC9hPihjb25zdCBjaGFyICpuc3RyLCBjb25zdCBjaGFyICpuYW1lKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNhMTAiPmZpbmQ8L2E+KGludCB0eXBlKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvMTAiPmhlYWQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI3cwIj5pdGVyYXRvcjwvYT4gdHlwZWRlZjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvNSI+bmFtZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzAiPm5leHQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI285Ij5ub2RlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvNCI+bnN0cjwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzEiPnBybnQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI2EwIj5zZXQ8L2E+KGNvbnN0IGNoYXIgKm5zdHIsIGNvbnN0IGNoYXIgKm5hbWUpPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI2ExIj5zZXQ8L2E+KGNvbnN0IGNoYXIgKmRhdGEpPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI2EyIj5zZXQ8L2E+KHZvaWQgKm5vZGUsIGludCB0eXBlKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvMTIiPnNvYXA8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI2ExMiI+c29hcF9kb21fZWxlbWVudDwvYT4oKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNhMTMiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+KHN0cnVjdCBzb2FwICpzb2FwKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNhMTQiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuc3RyLCBjb25zdCBjaGFyICpuYW1lKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNhMTUiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuc3RyLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkYXRhKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNhMTYiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuc3RyLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpub2RlLCBpbnQgdHlwZSk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzExIj50YWlsPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvOCI+dHlwZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjYTExIj51bmxpbms8L2E+KCk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzciPndpZGU8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI2ExNyI+fnNvYXBfZG9tX2VsZW1lbnQ8L2E+KCk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBTYXQgQXVnIDIwIDEyOjI0OjM2IDIwMDUgZm9yIGdTT0FQIGxldmVsLTIgRE9NIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI3ZDUyNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbApAQCAtMCwwICsxLDEwMDUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIGxldmVsLTIgRE9NOiBzb2FwX2RvbV9lbGVtZW50IFN0cnVjdCBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPjwvZGl2Pg0KKzxoMT5zb2FwX2RvbV9lbGVtZW50IFN0cnVjdCBSZWZlcmVuY2U8L2gxPjxjb2RlPiNpbmNsdWRlICZsdDtzdGRzb2FwMi5oJmd0OzwvY29kZT4NCis8cD4NCitDb2xsYWJvcmF0aW9uIGRpYWdyYW0gZm9yIHNvYXBfZG9tX2VsZW1lbnQ6PHA+PGNlbnRlcj48aW1nIHNyYz0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50X19jb2xsX19ncmFwaC5wbmciIGJvcmRlcj0iMCIgdXNlbWFwPSIjc29hcF9fZG9tX19lbGVtZW50X19jb2xsX19tYXAiIGFsdD0iQ29sbGFib3JhdGlvbiBncmFwaCI+PC9jZW50ZXI+DQorPG1hcCBuYW1lPSJzb2FwX19kb21fX2VsZW1lbnRfX2NvbGxfX21hcCI+DQorPGFyZWEgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCIgc2hhcGU9InJlY3QiIGNvb3Jkcz0iOCwxNywxMzYsNDQiIGFsdD0iIj4NCis8L21hcD4NCis8Y2VudGVyPjxmb250IHNpemU9IjIiPls8YSBocmVmPSJncmFwaF9sZWdlbmQuaHRtbCI+bGVnZW5kPC9hPl08L2ZvbnQ+PC9jZW50ZXI+PGEgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50LW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBUeXBlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD50eXBlZGVmIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2VsZW1lbnRfX2l0ZXJhdG9yLmh0bWwiPnNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3I8L2E+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI3cwIj5pdGVyYXRvcjwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgTWVtYmVyIEZ1bmN0aW9uczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiAmYW1wOyZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNhMCI+c2V0PC9hPiAoY29uc3QgY2hhciAqPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvNCI+bnN0cjwvYT4sIGNvbnN0IGNoYXIgKjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzUiPm5hbWU8L2E+KTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT4gJmFtcDsmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjYTEiPnNldDwvYT4gKGNvbnN0IGNoYXIgKjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzYiPmRhdGE8L2E+KTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT4gJmFtcDsmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjYTIiPnNldDwvYT4gKHZvaWQgKjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzkiPm5vZGU8L2E+LCBpbnQgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvOCI+dHlwZTwvYT4pPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiAmYW1wOyZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNhMyI+YWRkPC9hPiAoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+ICopPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiAmYW1wOyZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNhNCI+YWRkPC9hPiAoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+ICZhbXA7KTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT4gJmFtcDsmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjYTUiPmFkZDwvYT4gKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwiPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT4gKik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+ICZhbXA7Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI2E2Ij5hZGQ8L2E+IChzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sIj5zb2FwX2RvbV9hdHRyaWJ1dGU8L2E+ICZhbXA7KTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3IuaHRtbCI+c29hcF9kb21fZWxlbWVudF9pdGVyYXRvcjwvYT4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjYTciPmJlZ2luPC9hPiAoKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3IuaHRtbCI+c29hcF9kb21fZWxlbWVudF9pdGVyYXRvcjwvYT4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjYTgiPmVuZDwvYT4gKCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3Nzb2FwX19kb21fX2VsZW1lbnRfX2l0ZXJhdG9yLmh0bWwiPnNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3I8L2E+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI2E5Ij5maW5kPC9hPiAoY29uc3QgY2hhciAqPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvNCI+bnN0cjwvYT4sIGNvbnN0IGNoYXIgKjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzUiPm5hbWU8L2E+KTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3IuaHRtbCI+c29hcF9kb21fZWxlbWVudF9pdGVyYXRvcjwvYT4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjYTEwIj5maW5kPC9hPiAoaW50IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzgiPnR5cGU8L2E+KTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+dm9pZCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNhMTEiPnVubGluazwvYT4gKCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNhMTIiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+ICgpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjYTEzIj5zb2FwX2RvbV9lbGVtZW50PC9hPiAoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzEyIj5zb2FwPC9hPiAqPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvMTIiPnNvYXA8L2E+KTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI2ExNCI+c29hcF9kb21fZWxlbWVudDwvYT4gKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI28xMiI+c29hcDwvYT4gKjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzEyIj5zb2FwPC9hPiwgY29uc3QgY2hhciAqPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvNCI+bnN0cjwvYT4sIGNvbnN0IGNoYXIgKjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzUiPm5hbWU8L2E+KTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI2ExNSI+c29hcF9kb21fZWxlbWVudDwvYT4gKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI28xMiI+c29hcDwvYT4gKjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzEyIj5zb2FwPC9hPiwgY29uc3QgY2hhciAqPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvNCI+bnN0cjwvYT4sIGNvbnN0IGNoYXIgKjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzUiPm5hbWU8L2E+LCBjb25zdCBjaGFyICo8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI282Ij5kYXRhPC9hPik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNhMTYiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+IChzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvMTIiPnNvYXA8L2E+ICo8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI28xMiI+c29hcDwvYT4sIGNvbnN0IGNoYXIgKjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzQiPm5zdHI8L2E+LCBjb25zdCBjaGFyICo8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI281Ij5uYW1lPC9hPiwgdm9pZCAqPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvOSI+bm9kZTwvYT4sIGludCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI284Ij50eXBlPC9hPik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNhMTciPn5zb2FwX2RvbV9lbGVtZW50PC9hPiAoKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzAiPm5leHQ8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI28xIj5wcm50PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvMiI+ZWx0czwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCI+c29hcF9kb21fYXR0cmlidXRlPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI28zIj5hdHRzPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI280Ij5uc3RyPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI281Ij5uYW1lPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI282Ij5kYXRhPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+d2NoYXJfdCAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI283Ij53aWRlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI284Ij50eXBlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+dm9pZCAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI285Ij5ub2RlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI28xMCI+aGVhZDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvMTEiPnRhaWw8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI28xMiI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvMTIiPnNvYXA8L2E+PC90ZD48L3RyPg0KKw0KKzwvdGFibGU+DQorPGhyPjxoMj5NZW1iZXIgVHlwZWRlZiBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJ3MCIgZG94eXRhZz0ic29hcF9kb21fZWxlbWVudDo6aXRlcmF0b3IiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdHlwZWRlZiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sIj5zb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yPC9hPiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sIj5zb2FwX2RvbV9lbGVtZW50OjppdGVyYXRvcjwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+PGgyPkNvbnN0cnVjdG9yICZhbXA7IERlc3RydWN0b3IgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTEyIiBkb3h5dGFnPSJzb2FwX2RvbV9lbGVtZW50Ojpzb2FwX2RvbV9lbGVtZW50IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHNvYXBfZG9tX2VsZW1lbnQ6OnNvYXBfZG9tX2VsZW1lbnQgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExMyIgZG94eXRhZz0ic29hcF9kb21fZWxlbWVudDo6c29hcF9kb21fZWxlbWVudCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzb2FwX2RvbV9lbGVtZW50Ojpzb2FwX2RvbV9lbGVtZW50ICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzEyIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiA8ZW0+c29hcDwvZW0+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTE0IiBkb3h5dGFnPSJzb2FwX2RvbV9lbGVtZW50Ojpzb2FwX2RvbV9lbGVtZW50IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHNvYXBfZG9tX2VsZW1lbnQ6OnNvYXBfZG9tX2VsZW1lbnQgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvMTIiPnNvYXA8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+bnN0cjwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+bmFtZTwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMTUiIGRveHl0YWc9InNvYXBfZG9tX2VsZW1lbnQ6OnNvYXBfZG9tX2VsZW1lbnQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc29hcF9kb21fZWxlbWVudDo6c29hcF9kb21fZWxlbWVudCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI28xMiI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5uc3RyPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5uYW1lPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5kYXRhPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExNiIgZG94eXRhZz0ic29hcF9kb21fZWxlbWVudDo6c29hcF9kb21fZWxlbWVudCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzb2FwX2RvbV9lbGVtZW50Ojpzb2FwX2RvbV9lbGVtZW50ICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzEyIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPm5zdHI8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPm5hbWU8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+dm9pZCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPm5vZGU8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+aW50Jm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnR5cGU8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTE3IiBkb3h5dGFnPSJzb2FwX2RvbV9lbGVtZW50Ojp+c29hcF9kb21fZWxlbWVudCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzb2FwX2RvbV9lbGVtZW50Ojp+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT4gICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj48aDI+TWVtYmVyIEZ1bmN0aW9uIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE2IiBkb3h5dGFnPSJzb2FwX2RvbV9lbGVtZW50OjphZGQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+JmFtcDsgc29hcF9kb21fZWxlbWVudDo6YWRkICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19hdHRyaWJ1dGUuaHRtbCI+c29hcF9kb21fYXR0cmlidXRlPC9hPiAmYW1wOyZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNSIgZG94eXRhZz0ic29hcF9kb21fZWxlbWVudDo6YWRkIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiZhbXA7IHNvYXBfZG9tX2VsZW1lbnQ6OmFkZCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwiPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNCIgZG94eXRhZz0ic29hcF9kb21fZWxlbWVudDo6YWRkIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiZhbXA7IHNvYXBfZG9tX2VsZW1lbnQ6OmFkZCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiAmYW1wOyZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMyIgZG94eXRhZz0ic29hcF9kb21fZWxlbWVudDo6YWRkIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiZhbXA7IHNvYXBfZG9tX2VsZW1lbnQ6OmFkZCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE3IiBkb3h5dGFnPSJzb2FwX2RvbV9lbGVtZW50OjpiZWdpbiIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sIj5zb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yPC9hPiBzb2FwX2RvbV9lbGVtZW50OjpiZWdpbiAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTgiIGRveHl0YWc9InNvYXBfZG9tX2VsZW1lbnQ6OmVuZCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sIj5zb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yPC9hPiBzb2FwX2RvbV9lbGVtZW50OjplbmQgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExMCIgZG94eXRhZz0ic29hcF9kb21fZWxlbWVudDo6ZmluZCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzc29hcF9fZG9tX19lbGVtZW50X19pdGVyYXRvci5odG1sIj5zb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yPC9hPiBzb2FwX2RvbV9lbGVtZW50OjpmaW5kICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+aW50Jm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiA8ZW0+dHlwZTwvZW0+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTkiIGRveHl0YWc9InNvYXBfZG9tX2VsZW1lbnQ6OmZpbmQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3NvYXBfX2RvbV9fZWxlbWVudF9faXRlcmF0b3IuaHRtbCI+c29hcF9kb21fZWxlbWVudF9pdGVyYXRvcjwvYT4gc29hcF9kb21fZWxlbWVudDo6ZmluZCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5uc3RyPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5uYW1lPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEyIiBkb3h5dGFnPSJzb2FwX2RvbV9lbGVtZW50OjpzZXQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+JmFtcDsgc29hcF9kb21fZWxlbWVudDo6c2V0ICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+dm9pZCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPm5vZGU8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+aW50Jm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnR5cGU8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTEiIGRveHl0YWc9InNvYXBfZG9tX2VsZW1lbnQ6OnNldCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT4mYW1wOyBzb2FwX2RvbV9lbGVtZW50OjpzZXQgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5kYXRhPC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMCIgZG94eXRhZz0ic29hcF9kb21fZWxlbWVudDo6c2V0IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sIj5zb2FwX2RvbV9lbGVtZW50PC9hPiZhbXA7IHNvYXBfZG9tX2VsZW1lbnQ6OnNldCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5uc3RyPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5uYW1lPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExMSIgZG94eXRhZz0ic29hcF9kb21fZWxlbWVudDo6dW5saW5rIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHZvaWQgc29hcF9kb21fZWxlbWVudDo6dW5saW5rICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8zIiBkb3h5dGFnPSJzb2FwX2RvbV9lbGVtZW50OjphdHRzIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fYXR0cmlidXRlLmh0bWwiPnNvYXBfZG9tX2F0dHJpYnV0ZTwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzMiPnNvYXBfZG9tX2VsZW1lbnQ6OmF0dHM8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzYiIGRveHl0YWc9InNvYXBfZG9tX2VsZW1lbnQ6OmRhdGEiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvNiI+c29hcF9kb21fZWxlbWVudDo6ZGF0YTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMiIgZG94eXRhZz0ic29hcF9kb21fZWxlbWVudDo6ZWx0cyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzIiPnNvYXBfZG9tX2VsZW1lbnQ6OmVsdHM8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEwIiBkb3h5dGFnPSJzb2FwX2RvbV9lbGVtZW50OjpoZWFkIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzEwIj5zb2FwX2RvbV9lbGVtZW50OjpoZWFkPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im81IiBkb3h5dGFnPSJzb2FwX2RvbV9lbGVtZW50OjpuYW1lIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzUiPnNvYXBfZG9tX2VsZW1lbnQ6Om5hbWU8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InNvYXBfZG9tX2VsZW1lbnQ6Om5leHQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwiPnNvYXBfZG9tX2VsZW1lbnQ8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI28wIj5zb2FwX2RvbV9lbGVtZW50OjpuZXh0PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im85IiBkb3h5dGFnPSJzb2FwX2RvbV9lbGVtZW50Ojpub2RlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHZvaWQqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzkiPnNvYXBfZG9tX2VsZW1lbnQ6Om5vZGU8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzQiIGRveHl0YWc9InNvYXBfZG9tX2VsZW1lbnQ6Om5zdHIiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY29uc3QgY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvNCI+c29hcF9kb21fZWxlbWVudDo6bnN0cjwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0ic29hcF9kb21fZWxlbWVudDo6cHJudCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCI+c29hcF9kb21fZWxlbWVudDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzEiPnNvYXBfZG9tX2VsZW1lbnQ6OnBybnQ8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEyIiBkb3h5dGFnPSJzb2FwX2RvbV9lbGVtZW50Ojpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI28xMiI+c29hcDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG9tX19lbGVtZW50Lmh0bWwjbzEyIj5zb2FwX2RvbV9lbGVtZW50Ojpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xMSIgZG94eXRhZz0ic29hcF9kb21fZWxlbWVudDo6dGFpbCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI28xMSI+c29hcF9kb21fZWxlbWVudDo6dGFpbDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvOCIgZG94eXRhZz0ic29hcF9kb21fZWxlbWVudDo6dHlwZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnQuaHRtbCNvOCI+c29hcF9kb21fZWxlbWVudDo6dHlwZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNyIgZG94eXRhZz0ic29hcF9kb21fZWxlbWVudDo6d2lkZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB3Y2hhcl90KiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvbV9fZWxlbWVudC5odG1sI283Ij5zb2FwX2RvbV9lbGVtZW50Ojp3aWRlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBzdHJ1Y3Qgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy9kb20vPGEgY2xhc3M9ImVsIiBocmVmPSJzdGRzb2FwMl84aC5odG1sIj5zdGRzb2FwMi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFNhdCBBdWcgMjAgMTI6MjQ6MzYgMjAwNSBmb3IgZ1NPQVAgbGV2ZWwtMiBET00gYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnRfX2NvbGxfX2dyYXBoLm1hcCBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnRfX2NvbGxfX2dyYXBoLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDk5MTU2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2RvbV9fZWxlbWVudF9fY29sbF9fZ3JhcGgubWFwCkBAIC0wLDAgKzEsMiBAQAorYmFzZSByZWZlcmVyCityZWN0ICRzdHJ1Y3Rzb2FwX19kb21fX2F0dHJpYnV0ZS5odG1sIDgsMTcgMTM2LDQ0CmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fZG9tX19lbGVtZW50X19jb2xsX19ncmFwaC5tZDUgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fZG9tX19lbGVtZW50X19jb2xsX19ncmFwaC5tZDUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEwNTliYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnRfX2NvbGxfX2dyYXBoLm1kNQpAQCAtMCwwICsxIEBACis3NDY3YTMzYzkyZjY3ZWE3OGE4MWU2ZGFjNTBlNDk2NApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnRfX2NvbGxfX2dyYXBoLnBuZyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19kb21fX2VsZW1lbnRfX2NvbGxfX2dyYXBoLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTAyYTdmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2RvbV9fZWxlbWVudF9fY29sbF9fZ3JhcGgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19kb3VibGVfX25hbi1tZW1iZXJzLmh0bWwgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fZG91YmxlX19uYW4tbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMzZlMzgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fZG91YmxlX19uYW4tbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIGxldmVsLTIgRE9NOiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+PC9kaXY+DQorPGgxPnNvYXBfZG91YmxlX25hbiBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvdWJsZV9fbmFuLmh0bWwiPnNvYXBfZG91YmxlX25hbjwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb3VibGVfX25hbi5odG1sI28wIj5uMTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvdWJsZV9fbmFuLmh0bWwiPnNvYXBfZG91YmxlX25hbjwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvdWJsZV9fbmFuLmh0bWwjbzEiPm4yPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG91YmxlX19uYW4uaHRtbCI+c29hcF9kb3VibGVfbmFuPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBUaHUgQXVnIDE4IDExOjI5OjU3IDIwMDUgZm9yIGdTT0FQIGxldmVsLTIgRE9NIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fZG91YmxlX19uYW4uaHRtbCBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19kb3VibGVfX25hbi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZDJkZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fZG91YmxlX19uYW4uaHRtbApAQCAtMCwwICsxLDcxIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBsZXZlbC0yIERPTTogc29hcF9kb3VibGVfbmFuIFN0cnVjdCBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPjwvZGl2Pg0KKzxoMT5zb2FwX2RvdWJsZV9uYW4gU3RydWN0IFJlZmVyZW5jZTwvaDE+PGNvZGU+I2luY2x1ZGUgJmx0O3N0ZHNvYXAyLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KKzxhIGhyZWY9InN0cnVjdHNvYXBfX2RvdWJsZV9fbmFuLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnVuc2lnbmVkIGludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb3VibGVfX25hbi5odG1sI28wIj5uMTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnVuc2lnbmVkIGludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19kb3VibGVfX25hbi5odG1sI28xIj5uMjwvYT48L3RkPjwvdHI+DQorDQorPC90YWJsZT4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJzb2FwX2RvdWJsZV9uYW46Om4xIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHVuc2lnbmVkIGludCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2RvdWJsZV9fbmFuLmh0bWwjbzAiPnNvYXBfZG91YmxlX25hbjo6bjE8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9InNvYXBfZG91YmxlX25hbjo6bjIiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdW5zaWduZWQgaW50IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZG91YmxlX19uYW4uaHRtbCNvMSI+c29hcF9kb3VibGVfbmFuOjpuMjwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgc3RydWN0IHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvZG9tLzxhIGNsYXNzPSJlbCIgaHJlZj0ic3Rkc29hcDJfOGguaHRtbCI+c3Rkc29hcDIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBUaHUgQXVnIDE4IDExOjI5OjU3IDIwMDUgZm9yIGdTT0FQIGxldmVsLTIgRE9NIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fZmxpc3QtbWVtYmVycy5odG1sIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2ZsaXN0LW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2FmNGMwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2ZsaXN0LW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDE4IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBsZXZlbC0yIERPTTogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPjwvZGl2Pg0KKzxoMT5zb2FwX2ZsaXN0IE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZmxpc3QuaHRtbCI+c29hcF9mbGlzdDwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19mbGlzdC5odG1sI280Ij5mY29weTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2ZsaXN0Lmh0bWwiPnNvYXBfZmxpc3Q8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19mbGlzdC5odG1sI28zIj5sZXZlbDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2ZsaXN0Lmh0bWwiPnNvYXBfZmxpc3Q8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19mbGlzdC5odG1sI28wIj5uZXh0PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZmxpc3QuaHRtbCI+c29hcF9mbGlzdDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2ZsaXN0Lmh0bWwjbzIiPnB0cjwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2ZsaXN0Lmh0bWwiPnNvYXBfZmxpc3Q8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19mbGlzdC5odG1sI28xIj50eXBlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZmxpc3QuaHRtbCI+c29hcF9mbGlzdDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gVGh1IEF1ZyAxOCAxMToyOTo1NyAyMDA1IGZvciBnU09BUCBsZXZlbC0yIERPTSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2ZsaXN0Lmh0bWwgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fZmxpc3QuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDBlNDY5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2ZsaXN0Lmh0bWwKQEAgLTAsMCArMSwxNDcgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIGxldmVsLTIgRE9NOiBzb2FwX2ZsaXN0IFN0cnVjdCBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPjwvZGl2Pg0KKzxoMT5zb2FwX2ZsaXN0IFN0cnVjdCBSZWZlcmVuY2U8L2gxPjxjb2RlPiNpbmNsdWRlICZsdDtzdGRzb2FwMi5oJmd0OzwvY29kZT4NCis8cD4NCitDb2xsYWJvcmF0aW9uIGRpYWdyYW0gZm9yIHNvYXBfZmxpc3Q6PHA+PGNlbnRlcj48aW1nIHNyYz0ic3RydWN0c29hcF9fZmxpc3RfX2NvbGxfX2dyYXBoLnBuZyIgYm9yZGVyPSIwIiB1c2VtYXA9IiNzb2FwX19mbGlzdF9fY29sbF9fbWFwIiBhbHQ9IkNvbGxhYm9yYXRpb24gZ3JhcGgiPjwvY2VudGVyPg0KKzxjZW50ZXI+PGZvbnQgc2l6ZT0iMiI+WzxhIGhyZWY9ImdyYXBoX2xlZ2VuZC5odG1sIj5sZWdlbmQ8L2E+XTwvZm9udD48L2NlbnRlcj48YSBocmVmPSJzdHJ1Y3Rzb2FwX19mbGlzdC1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgQXR0cmlidXRlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2ZsaXN0Lmh0bWwiPnNvYXBfZmxpc3Q8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZmxpc3QuaHRtbCNvMCI+bmV4dDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19mbGlzdC5odG1sI28xIj50eXBlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+dm9pZCAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2ZsaXN0Lmh0bWwjbzIiPnB0cjwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnVuc2lnbmVkIGludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19mbGlzdC5odG1sI28zIj5sZXZlbDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnZvaWQoKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19mbGlzdC5odG1sI280Ij5mY29weTwvYT4gKShzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+ICosIGludCwgaW50LCB2b2lkICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTwvdGQ+PC90cj4NCisNCis8L3RhYmxlPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzQiIGRveHl0YWc9InNvYXBfZmxpc3Q6OmZjb3B5IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHZvaWQoKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2ZsaXN0Lmh0bWwjbzQiPnNvYXBfZmxpc3Q6OmZjb3B5PC9hPikoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPiAqLCBpbnQsIGludCwgdm9pZCAqLCBjb25zdCB2b2lkICosIHNpemVfdCkgICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMyIgZG94eXRhZz0ic29hcF9mbGlzdDo6bGV2ZWwiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdW5zaWduZWQgaW50IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZmxpc3QuaHRtbCNvMyI+c29hcF9mbGlzdDo6bGV2ZWw8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InNvYXBfZmxpc3Q6Om5leHQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZmxpc3QuaHRtbCI+c29hcF9mbGlzdDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZmxpc3QuaHRtbCNvMCI+c29hcF9mbGlzdDo6bmV4dDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMiIgZG94eXRhZz0ic29hcF9mbGlzdDo6cHRyIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHZvaWQqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fZmxpc3QuaHRtbCNvMiI+c29hcF9mbGlzdDo6cHRyPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJzb2FwX2ZsaXN0Ojp0eXBlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2ZsaXN0Lmh0bWwjbzEiPnNvYXBfZmxpc3Q6OnR5cGU8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIHN0cnVjdCB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL2RvbS88YSBjbGFzcz0iZWwiIGhyZWY9InN0ZHNvYXAyXzhoLmh0bWwiPnN0ZHNvYXAyLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gVGh1IEF1ZyAxOCAxMToyOTo1NyAyMDA1IGZvciBnU09BUCBsZXZlbC0yIERPTSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2ZsaXN0X19jb2xsX19ncmFwaC5tYXAgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fZmxpc3RfX2NvbGxfX2dyYXBoLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTE0Nzc5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2ZsaXN0X19jb2xsX19ncmFwaC5tYXAKQEAgLTAsMCArMSBAQAorYmFzZSByZWZlcmVyCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fZmxpc3RfX2NvbGxfX2dyYXBoLm1kNSBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19mbGlzdF9fY29sbF9fZ3JhcGgubWQ1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNjU2NjcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fZmxpc3RfX2NvbGxfX2dyYXBoLm1kNQpAQCAtMCwwICsxIEBACithZDdhMzhhMWYzZWEzNGY5N2Q5Y2NjODBmZDM0MGIzMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19mbGlzdF9fY29sbF9fZ3JhcGgucG5nIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2ZsaXN0X19jb2xsX19ncmFwaC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU4MTU4NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19mbGlzdF9fY29sbF9fZ3JhcGgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19pbGlzdC1tZW1iZXJzLmh0bWwgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9faWxpc3QtbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMGZkMTAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9faWxpc3QtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMjIgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIGxldmVsLTIgRE9NOiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+PC9kaXY+DQorPGgxPnNvYXBfaWxpc3QgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19pbGlzdC5odG1sIj5zb2FwX2lsaXN0PC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2lsaXN0Lmh0bWwjbzQiPmNvcHk8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19pbGlzdC5odG1sIj5zb2FwX2lsaXN0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9faWxpc3QuaHRtbCNvNSI+Zmxpc3Q8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19pbGlzdC5odG1sIj5zb2FwX2lsaXN0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9faWxpc3QuaHRtbCNvOCI+aWQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19pbGlzdC5odG1sIj5zb2FwX2lsaXN0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9faWxpc3QuaHRtbCNvNyI+bGV2ZWw8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19pbGlzdC5odG1sIj5zb2FwX2lsaXN0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9faWxpc3QuaHRtbCNvMyI+bGluazwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2lsaXN0Lmh0bWwiPnNvYXBfaWxpc3Q8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19pbGlzdC5odG1sI28wIj5uZXh0PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9faWxpc3QuaHRtbCI+c29hcF9pbGlzdDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2lsaXN0Lmh0bWwjbzYiPnB0cjwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2lsaXN0Lmh0bWwiPnNvYXBfaWxpc3Q8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19pbGlzdC5odG1sI28yIj5zaXplPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9faWxpc3QuaHRtbCI+c29hcF9pbGlzdDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2lsaXN0Lmh0bWwjbzEiPnR5cGU8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19pbGlzdC5odG1sIj5zb2FwX2lsaXN0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBUaHUgQXVnIDE4IDExOjI5OjU3IDIwMDUgZm9yIGdTT0FQIGxldmVsLTIgRE9NIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9faWxpc3QuaHRtbCBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19pbGlzdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYmE2ODMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9faWxpc3QuaHRtbApAQCAtMCwwICsxLDI1MCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgbGV2ZWwtMiBET006IHNvYXBfaWxpc3QgU3RydWN0IFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+PC9kaXY+DQorPGgxPnNvYXBfaWxpc3QgU3RydWN0IFJlZmVyZW5jZTwvaDE+PGNvZGU+I2luY2x1ZGUgJmx0O3N0ZHNvYXAyLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KK0NvbGxhYm9yYXRpb24gZGlhZ3JhbSBmb3Igc29hcF9pbGlzdDo8cD48Y2VudGVyPjxpbWcgc3JjPSJzdHJ1Y3Rzb2FwX19pbGlzdF9fY29sbF9fZ3JhcGgucG5nIiBib3JkZXI9IjAiIHVzZW1hcD0iI3NvYXBfX2lsaXN0X19jb2xsX19tYXAiIGFsdD0iQ29sbGFib3JhdGlvbiBncmFwaCI+PC9jZW50ZXI+DQorPG1hcCBuYW1lPSJzb2FwX19pbGlzdF9fY29sbF9fbWFwIj4NCis8YXJlYSBocmVmPSJzdHJ1Y3Rzb2FwX19mbGlzdC5odG1sIiBzaGFwZT0icmVjdCIgY29vcmRzPSI3LDE3LDczLDQ0IiBhbHQ9IiI+DQorPC9tYXA+DQorPGNlbnRlcj48Zm9udCBzaXplPSIyIj5bPGEgaHJlZj0iZ3JhcGhfbGVnZW5kLmh0bWwiPmxlZ2VuZDwvYT5dPC9mb250PjwvY2VudGVyPjxhIGhyZWY9InN0cnVjdHNvYXBfX2lsaXN0LW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9faWxpc3QuaHRtbCI+c29hcF9pbGlzdDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19pbGlzdC5odG1sI28wIj5uZXh0PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2lsaXN0Lmh0bWwjbzEiPnR5cGU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zaXplX3QmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9faWxpc3QuaHRtbCNvMiI+c2l6ZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnZvaWQgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19pbGlzdC5odG1sI28zIj5saW5rPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+dm9pZCAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2lsaXN0Lmh0bWwjbzQiPmNvcHk8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2ZsaXN0Lmh0bWwiPnNvYXBfZmxpc3Q8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9faWxpc3QuaHRtbCNvNSI+Zmxpc3Q8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD52b2lkICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9faWxpc3QuaHRtbCNvNiI+cHRyPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+dW5zaWduZWQgaW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2lsaXN0Lmh0bWwjbzciPmxldmVsPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19pbGlzdC5odG1sI284Ij5pZDwvYT4gWzFdPC90ZD48L3RyPg0KKw0KKzwvdGFibGU+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNCIgZG94eXRhZz0ic29hcF9pbGlzdDo6Y29weSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB2b2lkKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2lsaXN0Lmh0bWwjbzQiPnNvYXBfaWxpc3Q6OmNvcHk8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzUiIGRveHl0YWc9InNvYXBfaWxpc3Q6OmZsaXN0IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2ZsaXN0Lmh0bWwiPnNvYXBfZmxpc3Q8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2lsaXN0Lmh0bWwjbzUiPnNvYXBfaWxpc3Q6OmZsaXN0PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im84IiBkb3h5dGFnPSJzb2FwX2lsaXN0OjppZCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9faWxpc3QuaHRtbCNvOCI+c29hcF9pbGlzdDo6aWQ8L2E+WzFdICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzciIGRveHl0YWc9InNvYXBfaWxpc3Q6OmxldmVsIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHVuc2lnbmVkIGludCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX2lsaXN0Lmh0bWwjbzciPnNvYXBfaWxpc3Q6OmxldmVsPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8zIiBkb3h5dGFnPSJzb2FwX2lsaXN0OjpsaW5rIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHZvaWQqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9faWxpc3QuaHRtbCNvMyI+c29hcF9pbGlzdDo6bGluazwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0ic29hcF9pbGlzdDo6bmV4dCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19pbGlzdC5odG1sIj5zb2FwX2lsaXN0PC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19pbGlzdC5odG1sI28wIj5zb2FwX2lsaXN0OjpuZXh0PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im82IiBkb3h5dGFnPSJzb2FwX2lsaXN0OjpwdHIiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdm9pZCogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19pbGlzdC5odG1sI282Ij5zb2FwX2lsaXN0OjpwdHI8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9InNvYXBfaWxpc3Q6OnNpemUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc2l6ZV90IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9faWxpc3QuaHRtbCNvMiI+c29hcF9pbGlzdDo6c2l6ZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0ic29hcF9pbGlzdDo6dHlwZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19pbGlzdC5odG1sI28xIj5zb2FwX2lsaXN0Ojp0eXBlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBzdHJ1Y3Qgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy9kb20vPGEgY2xhc3M9ImVsIiBocmVmPSJzdGRzb2FwMl84aC5odG1sIj5zdGRzb2FwMi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFRodSBBdWcgMTggMTE6Mjk6NTcgMjAwNSBmb3IgZ1NPQVAgbGV2ZWwtMiBET00gYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19pbGlzdF9fY29sbF9fZ3JhcGgubWFwIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2lsaXN0X19jb2xsX19ncmFwaC5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFkYzlkMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19pbGlzdF9fY29sbF9fZ3JhcGgubWFwCkBAIC0wLDAgKzEsMiBAQAorYmFzZSByZWZlcmVyCityZWN0ICRzdHJ1Y3Rzb2FwX19mbGlzdC5odG1sIDcsMTcgNzMsNDQKZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19pbGlzdF9fY29sbF9fZ3JhcGgubWQ1IGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2lsaXN0X19jb2xsX19ncmFwaC5tZDUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU5MTU2MQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19pbGlzdF9fY29sbF9fZ3JhcGgubWQ1CkBAIC0wLDAgKzEgQEAKKzcxODZjNGMwMjAzMDgwNGE0YzM2Y2VjMzM1NTI0NGE4ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2lsaXN0X19jb2xsX19ncmFwaC5wbmcgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9faWxpc3RfX2NvbGxfX2dyYXBoLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzE2MTcxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX2lsaXN0X19jb2xsX19ncmFwaC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX21pbWUtbWVtYmVycy5odG1sIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX21pbWUtbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNzhmMTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fbWltZS1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwxOCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgbGV2ZWwtMiBET006IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT48L2Rpdj4NCis8aDE+c29hcF9taW1lIE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbWltZS5odG1sIj5zb2FwX21pbWU8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbWltZS5odG1sI28wIj5ib3VuZGFyeTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX21pbWUuaHRtbCI+c29hcF9taW1lPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbWltZS5odG1sI28zIj5maXJzdDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX21pbWUuaHRtbCI+c29hcF9taW1lPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbWltZS5odG1sI280Ij5sYXN0PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbWltZS5odG1sIj5zb2FwX21pbWU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19taW1lLmh0bWwjbzIiPmxpc3Q8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19taW1lLmh0bWwiPnNvYXBfbWltZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX21pbWUuaHRtbCNvMSI+c3RhcnQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19taW1lLmh0bWwiPnNvYXBfbWltZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gVGh1IEF1ZyAxOCAxMToyOTo1NyAyMDA1IGZvciBnU09BUCBsZXZlbC0yIERPTSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX21pbWUuaHRtbCBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19taW1lLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFkMjBjNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19taW1lLmh0bWwKQEAgLTAsMCArMSwxNTAgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIGxldmVsLTIgRE9NOiBzb2FwX21pbWUgU3RydWN0IFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+PC9kaXY+DQorPGgxPnNvYXBfbWltZSBTdHJ1Y3QgUmVmZXJlbmNlPC9oMT48Y29kZT4jaW5jbHVkZSAmbHQ7c3Rkc29hcDIuaCZndDs8L2NvZGU+DQorPHA+DQorQ29sbGFib3JhdGlvbiBkaWFncmFtIGZvciBzb2FwX21pbWU6PHA+PGNlbnRlcj48aW1nIHNyYz0ic3RydWN0c29hcF9fbWltZV9fY29sbF9fZ3JhcGgucG5nIiBib3JkZXI9IjAiIHVzZW1hcD0iI3NvYXBfX21pbWVfX2NvbGxfX21hcCIgYWx0PSJDb2xsYWJvcmF0aW9uIGdyYXBoIj48L2NlbnRlcj4NCis8bWFwIG5hbWU9InNvYXBfX21pbWVfX2NvbGxfX21hcCI+DQorPGFyZWEgaHJlZj0ic3RydWN0c29hcF9fbXVsdGlwYXJ0Lmh0bWwiIHNoYXBlPSJyZWN0IiBjb29yZHM9IjcsMTcsMTA1LDQ0IiBhbHQ9IiI+DQorPC9tYXA+DQorPGNlbnRlcj48Zm9udCBzaXplPSIyIj5bPGEgaHJlZj0iZ3JhcGhfbGVnZW5kLmh0bWwiPmxlZ2VuZDwvYT5dPC9mb250PjwvY2VudGVyPjxhIGhyZWY9InN0cnVjdHNvYXBfX21pbWUtbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX21pbWUuaHRtbCNvMCI+Ym91bmRhcnk8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jb25zdCBjaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbWltZS5odG1sI28xIj5zdGFydDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbXVsdGlwYXJ0Lmh0bWwiPnNvYXBfbXVsdGlwYXJ0PC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX21pbWUuaHRtbCNvMiI+bGlzdDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbXVsdGlwYXJ0Lmh0bWwiPnNvYXBfbXVsdGlwYXJ0PC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX21pbWUuaHRtbCNvMyI+Zmlyc3Q8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX211bHRpcGFydC5odG1sIj5zb2FwX211bHRpcGFydDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19taW1lLmh0bWwjbzQiPmxhc3Q8L2E+PC90ZD48L3RyPg0KKw0KKzwvdGFibGU+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0ic29hcF9taW1lOjpib3VuZGFyeSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX21pbWUuaHRtbCNvMCI+c29hcF9taW1lOjpib3VuZGFyeTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMyIgZG94eXRhZz0ic29hcF9taW1lOjpmaXJzdCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19tdWx0aXBhcnQuaHRtbCI+c29hcF9tdWx0aXBhcnQ8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX21pbWUuaHRtbCNvMyI+c29hcF9taW1lOjpmaXJzdDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNCIgZG94eXRhZz0ic29hcF9taW1lOjpsYXN0IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX211bHRpcGFydC5odG1sIj5zb2FwX211bHRpcGFydDwvYT4gKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX21pbWUuaHRtbCNvNCI+c29hcF9taW1lOjpsYXN0PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJzb2FwX21pbWU6Omxpc3QiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbXVsdGlwYXJ0Lmh0bWwiPnNvYXBfbXVsdGlwYXJ0PC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19taW1lLmh0bWwjbzIiPnNvYXBfbWltZTo6bGlzdDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0ic29hcF9taW1lOjpzdGFydCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjb25zdCBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX21pbWUuaHRtbCNvMSI+c29hcF9taW1lOjpzdGFydDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgc3RydWN0IHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvZG9tLzxhIGNsYXNzPSJlbCIgaHJlZj0ic3Rkc29hcDJfOGguaHRtbCI+c3Rkc29hcDIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBUaHUgQXVnIDE4IDExOjI5OjU3IDIwMDUgZm9yIGdTT0FQIGxldmVsLTIgRE9NIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fbWltZV9fY29sbF9fZ3JhcGgubWFwIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX21pbWVfX2NvbGxfX2dyYXBoLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTAzMThiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX21pbWVfX2NvbGxfX2dyYXBoLm1hcApAQCAtMCwwICsxLDIgQEAKK2Jhc2UgcmVmZXJlcgorcmVjdCAkc3RydWN0c29hcF9fbXVsdGlwYXJ0Lmh0bWwgNywxNyAxMDUsNDQKZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19taW1lX19jb2xsX19ncmFwaC5tZDUgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fbWltZV9fY29sbF9fZ3JhcGgubWQ1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZmM1YmIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fbWltZV9fY29sbF9fZ3JhcGgubWQ1CkBAIC0wLDAgKzEgQEAKK2FiN2ZmOTJkN2VjNjkwYTVhYzllZTA0ZjdjMTFhNzYzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX21pbWVfX2NvbGxfX2dyYXBoLnBuZyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19taW1lX19jb2xsX19ncmFwaC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY3NjdhZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19taW1lX19jb2xsX19ncmFwaC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX211bHRpcGFydC1tZW1iZXJzLmh0bWwgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fbXVsdGlwYXJ0LW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTFmYWM3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX211bHRpcGFydC1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwyMiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgbGV2ZWwtMiBET006IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT48L2Rpdj4NCis8aDE+c29hcF9tdWx0aXBhcnQgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19tdWx0aXBhcnQuaHRtbCI+c29hcF9tdWx0aXBhcnQ8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbXVsdGlwYXJ0Lmh0bWwjbzgiPmRlc2NyaXB0aW9uPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbXVsdGlwYXJ0Lmh0bWwiPnNvYXBfbXVsdGlwYXJ0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbXVsdGlwYXJ0Lmh0bWwjbzYiPmVuY29kaW5nPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbXVsdGlwYXJ0Lmh0bWwiPnNvYXBfbXVsdGlwYXJ0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbXVsdGlwYXJ0Lmh0bWwjbzMiPmlkPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbXVsdGlwYXJ0Lmh0bWwiPnNvYXBfbXVsdGlwYXJ0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbXVsdGlwYXJ0Lmh0bWwjbzciPmxvY2F0aW9uPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbXVsdGlwYXJ0Lmh0bWwiPnNvYXBfbXVsdGlwYXJ0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbXVsdGlwYXJ0Lmh0bWwjbzAiPm5leHQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19tdWx0aXBhcnQuaHRtbCI+c29hcF9tdWx0aXBhcnQ8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19tdWx0aXBhcnQuaHRtbCNvNSI+b3B0aW9uczwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX211bHRpcGFydC5odG1sIj5zb2FwX211bHRpcGFydDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX211bHRpcGFydC5odG1sI28xIj5wdHI8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19tdWx0aXBhcnQuaHRtbCI+c29hcF9tdWx0aXBhcnQ8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19tdWx0aXBhcnQuaHRtbCNvMiI+c2l6ZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX211bHRpcGFydC5odG1sIj5zb2FwX211bHRpcGFydDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX211bHRpcGFydC5odG1sI280Ij50eXBlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbXVsdGlwYXJ0Lmh0bWwiPnNvYXBfbXVsdGlwYXJ0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBUaHUgQXVnIDE4IDExOjI5OjU3IDIwMDUgZm9yIGdTT0FQIGxldmVsLTIgRE9NIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fbXVsdGlwYXJ0Lmh0bWwgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fbXVsdGlwYXJ0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdlOTdiOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19tdWx0aXBhcnQuaHRtbApAQCAtMCwwICsxLDI0NyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgbGV2ZWwtMiBET006IHNvYXBfbXVsdGlwYXJ0IFN0cnVjdCBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPjwvZGl2Pg0KKzxoMT5zb2FwX211bHRpcGFydCBTdHJ1Y3QgUmVmZXJlbmNlPC9oMT48Y29kZT4jaW5jbHVkZSAmbHQ7c3Rkc29hcDIuaCZndDs8L2NvZGU+DQorPHA+DQorQ29sbGFib3JhdGlvbiBkaWFncmFtIGZvciBzb2FwX211bHRpcGFydDo8cD48Y2VudGVyPjxpbWcgc3JjPSJzdHJ1Y3Rzb2FwX19tdWx0aXBhcnRfX2NvbGxfX2dyYXBoLnBuZyIgYm9yZGVyPSIwIiB1c2VtYXA9IiNzb2FwX19tdWx0aXBhcnRfX2NvbGxfX21hcCIgYWx0PSJDb2xsYWJvcmF0aW9uIGdyYXBoIj48L2NlbnRlcj4NCis8Y2VudGVyPjxmb250IHNpemU9IjIiPls8YSBocmVmPSJncmFwaF9sZWdlbmQuaHRtbCI+bGVnZW5kPC9hPl08L2ZvbnQ+PC9jZW50ZXI+PGEgaHJlZj0ic3RydWN0c29hcF9fbXVsdGlwYXJ0LW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbXVsdGlwYXJ0Lmh0bWwiPnNvYXBfbXVsdGlwYXJ0PC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX211bHRpcGFydC5odG1sI28wIj5uZXh0PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX211bHRpcGFydC5odG1sI28xIj5wdHI8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zaXplX3QmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbXVsdGlwYXJ0Lmh0bWwjbzIiPnNpemU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jb25zdCBjaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbXVsdGlwYXJ0Lmh0bWwjbzMiPmlkPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX211bHRpcGFydC5odG1sI280Ij50eXBlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX211bHRpcGFydC5odG1sI281Ij5vcHRpb25zPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+ZW51bSA8YSBjbGFzcz0iZWwiIGhyZWY9InN0ZHNvYXAyXzhoLmh0bWwjYTQ2OSI+c29hcF9taW1lX2VuY29kaW5nPC9hPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19tdWx0aXBhcnQuaHRtbCNvNiI+ZW5jb2Rpbmc8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jb25zdCBjaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbXVsdGlwYXJ0Lmh0bWwjbzciPmxvY2F0aW9uPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX211bHRpcGFydC5odG1sI284Ij5kZXNjcmlwdGlvbjwvYT48L3RkPjwvdHI+DQorDQorPC90YWJsZT4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im84IiBkb3h5dGFnPSJzb2FwX211bHRpcGFydDo6ZGVzY3JpcHRpb24iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY29uc3QgY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19tdWx0aXBhcnQuaHRtbCNvOCI+c29hcF9tdWx0aXBhcnQ6OmRlc2NyaXB0aW9uPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im82IiBkb3h5dGFnPSJzb2FwX211bHRpcGFydDo6ZW5jb2RpbmciID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gZW51bSA8YSBjbGFzcz0iZWwiIGhyZWY9InN0ZHNvYXAyXzhoLmh0bWwjYTQ2OSI+c29hcF9taW1lX2VuY29kaW5nPC9hPiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX211bHRpcGFydC5odG1sI282Ij5zb2FwX211bHRpcGFydDo6ZW5jb2Rpbmc8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzMiIGRveHl0YWc9InNvYXBfbXVsdGlwYXJ0OjppZCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjb25zdCBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX211bHRpcGFydC5odG1sI28zIj5zb2FwX211bHRpcGFydDo6aWQ8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzciIGRveHl0YWc9InNvYXBfbXVsdGlwYXJ0Ojpsb2NhdGlvbiIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjb25zdCBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX211bHRpcGFydC5odG1sI283Ij5zb2FwX211bHRpcGFydDo6bG9jYXRpb248L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InNvYXBfbXVsdGlwYXJ0OjpuZXh0IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX211bHRpcGFydC5odG1sIj5zb2FwX211bHRpcGFydDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbXVsdGlwYXJ0Lmh0bWwjbzAiPnNvYXBfbXVsdGlwYXJ0OjpuZXh0PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im81IiBkb3h5dGFnPSJzb2FwX211bHRpcGFydDo6b3B0aW9ucyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjb25zdCBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX211bHRpcGFydC5odG1sI281Ij5zb2FwX211bHRpcGFydDo6b3B0aW9uczwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0ic29hcF9tdWx0aXBhcnQ6OnB0ciIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX211bHRpcGFydC5odG1sI28xIj5zb2FwX211bHRpcGFydDo6cHRyPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJzb2FwX211bHRpcGFydDo6c2l6ZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzaXplX3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19tdWx0aXBhcnQuaHRtbCNvMiI+c29hcF9tdWx0aXBhcnQ6OnNpemU8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzQiIGRveHl0YWc9InNvYXBfbXVsdGlwYXJ0Ojp0eXBlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNvbnN0IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbXVsdGlwYXJ0Lmh0bWwjbzQiPnNvYXBfbXVsdGlwYXJ0Ojp0eXBlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBzdHJ1Y3Qgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy9kb20vPGEgY2xhc3M9ImVsIiBocmVmPSJzdGRzb2FwMl84aC5odG1sIj5zdGRzb2FwMi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFRodSBBdWcgMTggMTE6Mjk6NTcgMjAwNSBmb3IgZ1NPQVAgbGV2ZWwtMiBET00gYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19tdWx0aXBhcnRfX2NvbGxfX2dyYXBoLm1hcCBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19tdWx0aXBhcnRfX2NvbGxfX2dyYXBoLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTE0Nzc5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX211bHRpcGFydF9fY29sbF9fZ3JhcGgubWFwCkBAIC0wLDAgKzEgQEAKK2Jhc2UgcmVmZXJlcgpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX211bHRpcGFydF9fY29sbF9fZ3JhcGgubWQ1IGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX211bHRpcGFydF9fY29sbF9fZ3JhcGgubWQ1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NTFmODAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fbXVsdGlwYXJ0X19jb2xsX19ncmFwaC5tZDUKQEAgLTAsMCArMSBAQAorOWY4Nzg1Y2RkMDEwNjVjYjk5MmEwNTIyOGM0ZTBjOTYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fbXVsdGlwYXJ0X19jb2xsX19ncmFwaC5wbmcgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fbXVsdGlwYXJ0X19jb2xsX19ncmFwaC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlkMzYwYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19tdWx0aXBhcnRfX2NvbGxfX2dyYXBoLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fbmxpc3QtbWVtYmVycy5odG1sIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX25saXN0LW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDQyYjIyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX25saXN0LW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDE4IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBsZXZlbC0yIERPTTogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPjwvZGl2Pg0KKzxoMT5zb2FwX25saXN0IE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbmxpc3QuaHRtbCI+c29hcF9ubGlzdDwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19ubGlzdC5odG1sI280Ij5pZDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX25saXN0Lmh0bWwiPnNvYXBfbmxpc3Q8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19ubGlzdC5odG1sI28yIj5pbmRleDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX25saXN0Lmh0bWwiPnNvYXBfbmxpc3Q8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19ubGlzdC5odG1sI28xIj5sZXZlbDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX25saXN0Lmh0bWwiPnNvYXBfbmxpc3Q8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19ubGlzdC5odG1sI28wIj5uZXh0PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbmxpc3QuaHRtbCI+c29hcF9ubGlzdDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX25saXN0Lmh0bWwjbzMiPm5zPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbmxpc3QuaHRtbCI+c29hcF9ubGlzdDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gVGh1IEF1ZyAxOCAxMToyOTo1NyAyMDA1IGZvciBnU09BUCBsZXZlbC0yIERPTSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX25saXN0Lmh0bWwgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fbmxpc3QuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTdjN2UzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX25saXN0Lmh0bWwKQEAgLTAsMCArMSwxNDcgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIGxldmVsLTIgRE9NOiBzb2FwX25saXN0IFN0cnVjdCBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPjwvZGl2Pg0KKzxoMT5zb2FwX25saXN0IFN0cnVjdCBSZWZlcmVuY2U8L2gxPjxjb2RlPiNpbmNsdWRlICZsdDtzdGRzb2FwMi5oJmd0OzwvY29kZT4NCis8cD4NCitDb2xsYWJvcmF0aW9uIGRpYWdyYW0gZm9yIHNvYXBfbmxpc3Q6PHA+PGNlbnRlcj48aW1nIHNyYz0ic3RydWN0c29hcF9fbmxpc3RfX2NvbGxfX2dyYXBoLnBuZyIgYm9yZGVyPSIwIiB1c2VtYXA9IiNzb2FwX19ubGlzdF9fY29sbF9fbWFwIiBhbHQ9IkNvbGxhYm9yYXRpb24gZ3JhcGgiPjwvY2VudGVyPg0KKzxjZW50ZXI+PGZvbnQgc2l6ZT0iMiI+WzxhIGhyZWY9ImdyYXBoX2xlZ2VuZC5odG1sIj5sZWdlbmQ8L2E+XTwvZm9udD48L2NlbnRlcj48YSBocmVmPSJzdHJ1Y3Rzb2FwX19ubGlzdC1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgQXR0cmlidXRlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX25saXN0Lmh0bWwiPnNvYXBfbmxpc3Q8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fbmxpc3QuaHRtbCNvMCI+bmV4dDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnVuc2lnbmVkIGludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19ubGlzdC5odG1sI28xIj5sZXZlbDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnNob3J0Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX25saXN0Lmh0bWwjbzIiPmluZGV4PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX25saXN0Lmh0bWwjbzMiPm5zPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19ubGlzdC5odG1sI280Ij5pZDwvYT4gWzFdPC90ZD48L3RyPg0KKw0KKzwvdGFibGU+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNCIgZG94eXRhZz0ic29hcF9ubGlzdDo6aWQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX25saXN0Lmh0bWwjbzQiPnNvYXBfbmxpc3Q6OmlkPC9hPlsxXSAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJzb2FwX25saXN0OjppbmRleCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzaG9ydCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX25saXN0Lmh0bWwjbzIiPnNvYXBfbmxpc3Q6OmluZGV4PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJzb2FwX25saXN0OjpsZXZlbCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB1bnNpZ25lZCBpbnQgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19ubGlzdC5odG1sI28xIj5zb2FwX25saXN0OjpsZXZlbDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0ic29hcF9ubGlzdDo6bmV4dCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19ubGlzdC5odG1sIj5zb2FwX25saXN0PC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19ubGlzdC5odG1sI28wIj5zb2FwX25saXN0OjpuZXh0PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8zIiBkb3h5dGFnPSJzb2FwX25saXN0OjpucyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX25saXN0Lmh0bWwjbzMiPnNvYXBfbmxpc3Q6Om5zPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBzdHJ1Y3Qgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy9kb20vPGEgY2xhc3M9ImVsIiBocmVmPSJzdGRzb2FwMl84aC5odG1sIj5zdGRzb2FwMi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFRodSBBdWcgMTggMTE6Mjk6NTcgMjAwNSBmb3IgZ1NPQVAgbGV2ZWwtMiBET00gYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19ubGlzdF9fY29sbF9fZ3JhcGgubWFwIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX25saXN0X19jb2xsX19ncmFwaC5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWExNDc3OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19ubGlzdF9fY29sbF9fZ3JhcGgubWFwCkBAIC0wLDAgKzEgQEAKK2Jhc2UgcmVmZXJlcgpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX25saXN0X19jb2xsX19ncmFwaC5tZDUgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fbmxpc3RfX2NvbGxfX2dyYXBoLm1kNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWQ5ODM2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX25saXN0X19jb2xsX19ncmFwaC5tZDUKQEAgLTAsMCArMSBAQAorMzE2YWYwMjUwZmIxY2ZmYTY4NThkZGIzZDdkMjg3ZDEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fbmxpc3RfX2NvbGxfX2dyYXBoLnBuZyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19ubGlzdF9fY29sbF9fZ3JhcGgucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZjIxMjEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fbmxpc3RfX2NvbGxfX2dyYXBoLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fcGJsay1tZW1iZXJzLmh0bWwgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fcGJsay1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQzYWY5NAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19wYmxrLW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDE1IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBsZXZlbC0yIERPTTogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPjwvZGl2Pg0KKzxoMT5zb2FwX3BibGsgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19wYmxrLmh0bWwiPnNvYXBfcGJsazwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19wYmxrLmh0bWwjbzAiPm5leHQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19wYmxrLmh0bWwiPnNvYXBfcGJsazwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3BibGsuaHRtbCNvMSI+cGxpc3Q8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19wYmxrLmh0bWwiPnNvYXBfcGJsazwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gVGh1IEF1ZyAxOCAxMToyOTo1NyAyMDA1IGZvciBnU09BUCBsZXZlbC0yIERPTSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX3BibGsuaHRtbCBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19wYmxrLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIyMTJlYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19wYmxrLmh0bWwKQEAgLTAsMCArMSw3NiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgbGV2ZWwtMiBET006IHNvYXBfcGJsayBTdHJ1Y3QgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT48L2Rpdj4NCis8aDE+c29hcF9wYmxrIFN0cnVjdCBSZWZlcmVuY2U8L2gxPjxjb2RlPiNpbmNsdWRlICZsdDtzdGRzb2FwMi5oJmd0OzwvY29kZT4NCis8cD4NCitDb2xsYWJvcmF0aW9uIGRpYWdyYW0gZm9yIHNvYXBfcGJsazo8cD48Y2VudGVyPjxpbWcgc3JjPSJzdHJ1Y3Rzb2FwX19wYmxrX19jb2xsX19ncmFwaC5wbmciIGJvcmRlcj0iMCIgdXNlbWFwPSIjc29hcF9fcGJsa19fY29sbF9fbWFwIiBhbHQ9IkNvbGxhYm9yYXRpb24gZ3JhcGgiPjwvY2VudGVyPg0KKzxtYXAgbmFtZT0ic29hcF9fcGJsa19fY29sbF9fbWFwIj4NCis8YXJlYSBocmVmPSJzdHJ1Y3Rzb2FwX19wbGlzdC5odG1sIiBzaGFwZT0icmVjdCIgY29vcmRzPSI5LDEwOCw4MSwxMzQiIGFsdD0iIj4NCis8YXJlYSBocmVmPSJzdHJ1Y3Rzb2FwX19hcnJheS5odG1sIiBzaGFwZT0icmVjdCIgY29vcmRzPSI2LDE3LDg0LDQ0IiBhbHQ9IiI+DQorPC9tYXA+DQorPGNlbnRlcj48Zm9udCBzaXplPSIyIj5bPGEgaHJlZj0iZ3JhcGhfbGVnZW5kLmh0bWwiPmxlZ2VuZDwvYT5dPC9mb250PjwvY2VudGVyPjxhIGhyZWY9InN0cnVjdHNvYXBfX3BibGstbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19wYmxrLmh0bWwiPnNvYXBfcGJsazwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19wYmxrLmh0bWwjbzAiPm5leHQ8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3BsaXN0Lmh0bWwiPnNvYXBfcGxpc3Q8L2E+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3BibGsuaHRtbCNvMSI+cGxpc3Q8L2E+IFtTT0FQX1BUUkJMS108L3RkPjwvdHI+DQorDQorPC90YWJsZT4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJzb2FwX3BibGs6Om5leHQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fcGJsay5odG1sIj5zb2FwX3BibGs8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3BibGsuaHRtbCNvMCI+c29hcF9wYmxrOjpuZXh0PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJzb2FwX3BibGs6OnBsaXN0IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3BsaXN0Lmh0bWwiPnNvYXBfcGxpc3Q8L2E+IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fcGJsay5odG1sI28xIj5zb2FwX3BibGs6OnBsaXN0PC9hPltTT0FQX1BUUkJMS10gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgc3RydWN0IHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvZG9tLzxhIGNsYXNzPSJlbCIgaHJlZj0ic3Rkc29hcDJfOGguaHRtbCI+c3Rkc29hcDIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBUaHUgQXVnIDE4IDExOjI5OjU3IDIwMDUgZm9yIGdTT0FQIGxldmVsLTIgRE9NIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fcGJsa19fY29sbF9fZ3JhcGgubWFwIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX3BibGtfX2NvbGxfX2dyYXBoLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTUzOWUwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX3BibGtfX2NvbGxfX2dyYXBoLm1hcApAQCAtMCwwICsxLDMgQEAKK2Jhc2UgcmVmZXJlcgorcmVjdCAkc3RydWN0c29hcF9fcGxpc3QuaHRtbCA5LDEwOCA4MSwxMzQKK3JlY3QgJHN0cnVjdHNvYXBfX2FycmF5Lmh0bWwgNiwxNyA4NCw0NApkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX3BibGtfX2NvbGxfX2dyYXBoLm1kNSBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19wYmxrX19jb2xsX19ncmFwaC5tZDUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFiMmFiOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19wYmxrX19jb2xsX19ncmFwaC5tZDUKQEAgLTAsMCArMSBAQAorNDdjNDlmZDg2MDcwM2Y2YjRmOTMzYWNjNzc1NWMyZTkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fcGJsa19fY29sbF9fZ3JhcGgucG5nIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX3BibGtfX2NvbGxfX2dyYXBoLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmM0YTVlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX3BibGtfX2NvbGxfX2dyYXBoLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fcGxpc3QtbWVtYmVycy5odG1sIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX3BsaXN0LW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjQ3MTVkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX3BsaXN0LW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDIwIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBsZXZlbC0yIERPTTogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPjwvZGl2Pg0KKzxoMT5zb2FwX3BsaXN0IE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fcGxpc3QuaHRtbCI+c29hcF9wbGlzdDwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19wbGlzdC5odG1sI28yIj5hcnJheTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3BsaXN0Lmh0bWwiPnNvYXBfcGxpc3Q8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19wbGlzdC5odG1sI280Ij5pZDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3BsaXN0Lmh0bWwiPnNvYXBfcGxpc3Q8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19wbGlzdC5odG1sI281Ij5tYXJrMTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3BsaXN0Lmh0bWwiPnNvYXBfcGxpc3Q8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19wbGlzdC5odG1sI282Ij5tYXJrMjwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3BsaXN0Lmh0bWwiPnNvYXBfcGxpc3Q8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19wbGlzdC5odG1sI28wIj5uZXh0PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fcGxpc3QuaHRtbCI+c29hcF9wbGlzdDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3BsaXN0Lmh0bWwjbzEiPnB0cjwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3BsaXN0Lmh0bWwiPnNvYXBfcGxpc3Q8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19wbGlzdC5odG1sI28zIj50eXBlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fcGxpc3QuaHRtbCI+c29hcF9wbGlzdDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gVGh1IEF1ZyAxOCAxMToyOTo1NyAyMDA1IGZvciBnU09BUCBsZXZlbC0yIERPTSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX3BsaXN0Lmh0bWwgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fcGxpc3QuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTAzNGM4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX3BsaXN0Lmh0bWwKQEAgLTAsMCArMSwyMDAgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIGxldmVsLTIgRE9NOiBzb2FwX3BsaXN0IFN0cnVjdCBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPjwvZGl2Pg0KKzxoMT5zb2FwX3BsaXN0IFN0cnVjdCBSZWZlcmVuY2U8L2gxPjxjb2RlPiNpbmNsdWRlICZsdDtzdGRzb2FwMi5oJmd0OzwvY29kZT4NCis8cD4NCitDb2xsYWJvcmF0aW9uIGRpYWdyYW0gZm9yIHNvYXBfcGxpc3Q6PHA+PGNlbnRlcj48aW1nIHNyYz0ic3RydWN0c29hcF9fcGxpc3RfX2NvbGxfX2dyYXBoLnBuZyIgYm9yZGVyPSIwIiB1c2VtYXA9IiNzb2FwX19wbGlzdF9fY29sbF9fbWFwIiBhbHQ9IkNvbGxhYm9yYXRpb24gZ3JhcGgiPjwvY2VudGVyPg0KKzxtYXAgbmFtZT0ic29hcF9fcGxpc3RfX2NvbGxfX21hcCI+DQorPGFyZWEgaHJlZj0ic3RydWN0c29hcF9fYXJyYXkuaHRtbCIgc2hhcGU9InJlY3QiIGNvb3Jkcz0iNywxNyw4NCw0NCIgYWx0PSIiPg0KKzwvbWFwPg0KKzxjZW50ZXI+PGZvbnQgc2l6ZT0iMiI+WzxhIGhyZWY9ImdyYXBoX2xlZ2VuZC5odG1sIj5sZWdlbmQ8L2E+XTwvZm9udD48L2NlbnRlcj48YSBocmVmPSJzdHJ1Y3Rzb2FwX19wbGlzdC1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgQXR0cmlidXRlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3BsaXN0Lmh0bWwiPnNvYXBfcGxpc3Q8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fcGxpc3QuaHRtbCNvMCI+bmV4dDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNvbnN0IHZvaWQgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19wbGlzdC5odG1sI28xIj5wdHI8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jb25zdCBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19hcnJheS5odG1sIj5zb2FwX2FycmF5PC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3BsaXN0Lmh0bWwjbzIiPmFycmF5PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3BsaXN0Lmh0bWwjbzMiPnR5cGU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fcGxpc3QuaHRtbCNvNCI+aWQ8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3BsaXN0Lmh0bWwjbzUiPm1hcmsxPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19wbGlzdC5odG1sI282Ij5tYXJrMjwvYT48L3RkPjwvdHI+DQorDQorPC90YWJsZT4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJzb2FwX3BsaXN0OjphcnJheSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjb25zdCBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19hcnJheS5odG1sIj5zb2FwX2FycmF5PC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19wbGlzdC5odG1sI28yIj5zb2FwX3BsaXN0OjphcnJheTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNCIgZG94eXRhZz0ic29hcF9wbGlzdDo6aWQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fcGxpc3QuaHRtbCNvNCI+c29hcF9wbGlzdDo6aWQ8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzUiIGRveHl0YWc9InNvYXBfcGxpc3Q6Om1hcmsxIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19wbGlzdC5odG1sI281Ij5zb2FwX3BsaXN0OjptYXJrMTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNiIgZG94eXRhZz0ic29hcF9wbGlzdDo6bWFyazIiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3BsaXN0Lmh0bWwjbzYiPnNvYXBfcGxpc3Q6Om1hcmsyPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJzb2FwX3BsaXN0OjpuZXh0IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3BsaXN0Lmh0bWwiPnNvYXBfcGxpc3Q8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3BsaXN0Lmh0bWwjbzAiPnNvYXBfcGxpc3Q6Om5leHQ8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9InNvYXBfcGxpc3Q6OnB0ciIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjb25zdCB2b2lkKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3BsaXN0Lmh0bWwjbzEiPnNvYXBfcGxpc3Q6OnB0cjwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMyIgZG94eXRhZz0ic29hcF9wbGlzdDo6dHlwZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19wbGlzdC5odG1sI28zIj5zb2FwX3BsaXN0Ojp0eXBlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBzdHJ1Y3Qgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy9kb20vPGEgY2xhc3M9ImVsIiBocmVmPSJzdGRzb2FwMl84aC5odG1sIj5zdGRzb2FwMi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFRodSBBdWcgMTggMTE6Mjk6NTcgMjAwNSBmb3IgZ1NPQVAgbGV2ZWwtMiBET00gYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19wbGlzdF9fY29sbF9fZ3JhcGgubWFwIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX3BsaXN0X19jb2xsX19ncmFwaC5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThjYTU4MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19wbGlzdF9fY29sbF9fZ3JhcGgubWFwCkBAIC0wLDAgKzEsMiBAQAorYmFzZSByZWZlcmVyCityZWN0ICRzdHJ1Y3Rzb2FwX19hcnJheS5odG1sIDcsMTcgODQsNDQKZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19wbGlzdF9fY29sbF9fZ3JhcGgubWQ1IGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX3BsaXN0X19jb2xsX19ncmFwaC5tZDUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JhMzA3MQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19wbGlzdF9fY29sbF9fZ3JhcGgubWQ1CkBAIC0wLDAgKzEgQEAKKzkyNGRmODNkZWE2ZTlkNTFmNTBiOTJhZjU1MTJmM2RhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX3BsaXN0X19jb2xsX19ncmFwaC5wbmcgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fcGxpc3RfX2NvbGxfX2dyYXBoLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzI1Y2U5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX3BsaXN0X19jb2xsX19ncmFwaC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX3BsdWdpbi1tZW1iZXJzLmh0bWwgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fcGx1Z2luLW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDE0YmI2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX3BsdWdpbi1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwxOCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgbGV2ZWwtMiBET006IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT48L2Rpdj4NCis8aDE+c29hcF9wbHVnaW4gTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19wbHVnaW4uaHRtbCI+c29hcF9wbHVnaW48L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fcGx1Z2luLmh0bWwjbzIiPmRhdGE8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19wbHVnaW4uaHRtbCI+c29hcF9wbHVnaW48L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19wbHVnaW4uaHRtbCNvMyI+ZmNvcHk8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19wbHVnaW4uaHRtbCI+c29hcF9wbHVnaW48L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19wbHVnaW4uaHRtbCNvNCI+ZmRlbGV0ZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3BsdWdpbi5odG1sIj5zb2FwX3BsdWdpbjwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3BsdWdpbi5odG1sI28xIj5pZDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3BsdWdpbi5odG1sIj5zb2FwX3BsdWdpbjwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3BsdWdpbi5odG1sI28wIj5uZXh0PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fcGx1Z2luLmh0bWwiPnNvYXBfcGx1Z2luPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBUaHUgQXVnIDE4IDExOjI5OjU3IDIwMDUgZm9yIGdTT0FQIGxldmVsLTIgRE9NIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fcGx1Z2luLmh0bWwgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fcGx1Z2luLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg4ODk2MQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19wbHVnaW4uaHRtbApAQCAtMCwwICsxLDE0NyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgbGV2ZWwtMiBET006IHNvYXBfcGx1Z2luIFN0cnVjdCBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPjwvZGl2Pg0KKzxoMT5zb2FwX3BsdWdpbiBTdHJ1Y3QgUmVmZXJlbmNlPC9oMT48Y29kZT4jaW5jbHVkZSAmbHQ7c3Rkc29hcDIuaCZndDs8L2NvZGU+DQorPHA+DQorQ29sbGFib3JhdGlvbiBkaWFncmFtIGZvciBzb2FwX3BsdWdpbjo8cD48Y2VudGVyPjxpbWcgc3JjPSJzdHJ1Y3Rzb2FwX19wbHVnaW5fX2NvbGxfX2dyYXBoLnBuZyIgYm9yZGVyPSIwIiB1c2VtYXA9IiNzb2FwX19wbHVnaW5fX2NvbGxfX21hcCIgYWx0PSJDb2xsYWJvcmF0aW9uIGdyYXBoIj48L2NlbnRlcj4NCis8Y2VudGVyPjxmb250IHNpemU9IjIiPls8YSBocmVmPSJncmFwaF9sZWdlbmQuaHRtbCI+bGVnZW5kPC9hPl08L2ZvbnQ+PC9jZW50ZXI+PGEgaHJlZj0ic3RydWN0c29hcF9fcGx1Z2luLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fcGx1Z2luLmh0bWwiPnNvYXBfcGx1Z2luPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3BsdWdpbi5odG1sI28wIj5uZXh0PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3BsdWdpbi5odG1sI28xIj5pZDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnZvaWQgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19wbHVnaW4uaHRtbCNvMiI+ZGF0YTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCgqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3BsdWdpbi5odG1sI28zIj5mY29weTwvYT4gKShzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwLmh0bWwiPnNvYXA8L2E+ICo8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT4sIHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3BsdWdpbi5odG1sIj5zb2FwX3BsdWdpbjwvYT4gKmRzdCwgc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fcGx1Z2luLmh0bWwiPnNvYXBfcGx1Z2luPC9hPiAqc3JjKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+dm9pZCgqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3BsdWdpbi5odG1sI280Ij5mZGVsZXRlPC9hPiApKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT4gKjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPiwgc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fcGx1Z2luLmh0bWwiPnNvYXBfcGx1Z2luPC9hPiAqcCk8L3RkPjwvdHI+DQorDQorPC90YWJsZT4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJzb2FwX3BsdWdpbjo6ZGF0YSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB2b2lkKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3BsdWdpbi5odG1sI28yIj5zb2FwX3BsdWdpbjo6ZGF0YTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMyIgZG94eXRhZz0ic29hcF9wbHVnaW46OmZjb3B5IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCgqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fcGx1Z2luLmh0bWwjbzMiPnNvYXBfcGx1Z2luOjpmY29weTwvYT4pKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT4gKjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPiwgc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fcGx1Z2luLmh0bWwiPnNvYXBfcGx1Z2luPC9hPiAqZHN0LCBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19wbHVnaW4uaHRtbCI+c29hcF9wbHVnaW48L2E+ICpzcmMpICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzQiIGRveHl0YWc9InNvYXBfcGx1Z2luOjpmZGVsZXRlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHZvaWQoKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3BsdWdpbi5odG1sI280Ij5zb2FwX3BsdWdpbjo6ZmRlbGV0ZTwvYT4pKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXAuaHRtbCI+c29hcDwvYT4gKjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcC5odG1sIj5zb2FwPC9hPiwgc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fcGx1Z2luLmh0bWwiPnNvYXBfcGx1Z2luPC9hPiAqcCkgICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0ic29hcF9wbHVnaW46OmlkIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNvbnN0IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fcGx1Z2luLmh0bWwjbzEiPnNvYXBfcGx1Z2luOjppZDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0ic29hcF9wbHVnaW46Om5leHQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fcGx1Z2luLmh0bWwiPnNvYXBfcGx1Z2luPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19wbHVnaW4uaHRtbCNvMCI+c29hcF9wbHVnaW46Om5leHQ8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIHN0cnVjdCB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL2RvbS88YSBjbGFzcz0iZWwiIGhyZWY9InN0ZHNvYXAyXzhoLmh0bWwiPnN0ZHNvYXAyLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gVGh1IEF1ZyAxOCAxMToyOTo1NyAyMDA1IGZvciBnU09BUCBsZXZlbC0yIERPTSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX3BsdWdpbl9fY29sbF9fZ3JhcGgubWFwIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX3BsdWdpbl9fY29sbF9fZ3JhcGgubWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMTQ3NzkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fcGx1Z2luX19jb2xsX19ncmFwaC5tYXAKQEAgLTAsMCArMSBAQAorYmFzZSByZWZlcmVyCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fcGx1Z2luX19jb2xsX19ncmFwaC5tZDUgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9fcGx1Z2luX19jb2xsX19ncmFwaC5tZDUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QxMjdkNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19wbHVnaW5fX2NvbGxfX2dyYXBoLm1kNQpAQCAtMCwwICsxIEBACis3ZTU1MTRhMTkxMDQ5MjU1YjkxZDgzYTczOGZlZjIxNApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19wbHVnaW5fX2NvbGxfX2dyYXBoLnBuZyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX19wbHVnaW5fX2NvbGxfX2dyYXBoLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODgxOTEzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX3BsdWdpbl9fY29sbF9fZ3JhcGgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX194bGlzdC1tZW1iZXJzLmh0bWwgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9feGxpc3QtbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5M2E2ODUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9feGxpc3QtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTkgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIGxldmVsLTIgRE9NOiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+PC9kaXY+DQorPGgxPnNvYXBfeGxpc3QgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX194bGlzdC5odG1sIj5zb2FwX3hsaXN0PC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3hsaXN0Lmh0bWwjbzMiPmlkPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9feGxpc3QuaHRtbCI+c29hcF94bGlzdDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3hsaXN0Lmh0bWwjbzAiPm5leHQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX194bGlzdC5odG1sIj5zb2FwX3hsaXN0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9feGxpc3QuaHRtbCNvNSI+b3B0aW9uczwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3hsaXN0Lmh0bWwiPnNvYXBfeGxpc3Q8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX194bGlzdC5odG1sI28xIj5wdHI8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX194bGlzdC5odG1sIj5zb2FwX3hsaXN0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9feGxpc3QuaHRtbCNvMiI+c2l6ZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3hsaXN0Lmh0bWwiPnNvYXBfeGxpc3Q8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX194bGlzdC5odG1sI280Ij50eXBlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9feGxpc3QuaHRtbCI+c29hcF94bGlzdDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gVGh1IEF1ZyAxOCAxMToyOTo1NyAyMDA1IGZvciBnU09BUCBsZXZlbC0yIERPTSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX3hsaXN0Lmh0bWwgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9feGxpc3QuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTQ3Y2FhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX3hsaXN0Lmh0bWwKQEAgLTAsMCArMSwxNzIgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIGxldmVsLTIgRE9NOiBzb2FwX3hsaXN0IFN0cnVjdCBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPjwvZGl2Pg0KKzxoMT5zb2FwX3hsaXN0IFN0cnVjdCBSZWZlcmVuY2U8L2gxPjxjb2RlPiNpbmNsdWRlICZsdDtzdGRzb2FwMi5oJmd0OzwvY29kZT4NCis8cD4NCitDb2xsYWJvcmF0aW9uIGRpYWdyYW0gZm9yIHNvYXBfeGxpc3Q6PHA+PGNlbnRlcj48aW1nIHNyYz0ic3RydWN0c29hcF9feGxpc3RfX2NvbGxfX2dyYXBoLnBuZyIgYm9yZGVyPSIwIiB1c2VtYXA9IiNzb2FwX194bGlzdF9fY29sbF9fbWFwIiBhbHQ9IkNvbGxhYm9yYXRpb24gZ3JhcGgiPjwvY2VudGVyPg0KKzxjZW50ZXI+PGZvbnQgc2l6ZT0iMiI+WzxhIGhyZWY9ImdyYXBoX2xlZ2VuZC5odG1sIj5sZWdlbmQ8L2E+XTwvZm9udD48L2NlbnRlcj48YSBocmVmPSJzdHJ1Y3Rzb2FwX194bGlzdC1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgQXR0cmlidXRlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3hsaXN0Lmh0bWwiPnNvYXBfeGxpc3Q8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9feGxpc3QuaHRtbCNvMCI+bmV4dDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnVuc2lnbmVkIGNoYXIgKiombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9feGxpc3QuaHRtbCNvMSI+cHRyPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9feGxpc3QuaHRtbCNvMiI+c2l6ZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX194bGlzdC5odG1sI28zIj5pZDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9feGxpc3QuaHRtbCNvNCI+dHlwZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9feGxpc3QuaHRtbCNvNSI+b3B0aW9uczwvYT48L3RkPjwvdHI+DQorDQorPC90YWJsZT4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8zIiBkb3h5dGFnPSJzb2FwX3hsaXN0OjppZCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3hsaXN0Lmh0bWwjbzMiPnNvYXBfeGxpc3Q6OmlkPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJzb2FwX3hsaXN0OjpuZXh0IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3hsaXN0Lmh0bWwiPnNvYXBfeGxpc3Q8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3hsaXN0Lmh0bWwjbzAiPnNvYXBfeGxpc3Q6Om5leHQ8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzUiIGRveHl0YWc9InNvYXBfeGxpc3Q6Om9wdGlvbnMiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhcioqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9feGxpc3QuaHRtbCNvNSI+c29hcF94bGlzdDo6b3B0aW9uczwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0ic29hcF94bGlzdDo6cHRyIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHVuc2lnbmVkIGNoYXIqKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3hsaXN0Lmh0bWwjbzEiPnNvYXBfeGxpc3Q6OnB0cjwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMiIgZG94eXRhZz0ic29hcF94bGlzdDo6c2l6ZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9feGxpc3QuaHRtbCNvMiI+c29hcF94bGlzdDo6c2l6ZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNCIgZG94eXRhZz0ic29hcF94bGlzdDo6dHlwZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX194bGlzdC5odG1sI280Ij5zb2FwX3hsaXN0Ojp0eXBlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBzdHJ1Y3Qgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy9kb20vPGEgY2xhc3M9ImVsIiBocmVmPSJzdGRzb2FwMl84aC5odG1sIj5zdGRzb2FwMi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFRodSBBdWcgMTggMTE6Mjk6NTcgMjAwNSBmb3IgZ1NPQVAgbGV2ZWwtMiBET00gYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX194bGlzdF9fY29sbF9fZ3JhcGgubWFwIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX3hsaXN0X19jb2xsX19ncmFwaC5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWExNDc3OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX194bGlzdF9fY29sbF9fZ3JhcGgubWFwCkBAIC0wLDAgKzEgQEAKK2Jhc2UgcmVmZXJlcgpkaWZmIC0tZ2l0IGEvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX3hsaXN0X19jb2xsX19ncmFwaC5tZDUgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9feGxpc3RfX2NvbGxfX2dyYXBoLm1kNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2Q4NWE2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2RvbS9odG1sL3N0cnVjdHNvYXBfX3hsaXN0X19jb2xsX19ncmFwaC5tZDUKQEAgLTAsMCArMSBAQAorMjk4ZmJmYjc2OWU2MDdhYjk0ZTc3MGNlZTMyNDA1YjgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9feGxpc3RfX2NvbGxfX2dyYXBoLnBuZyBiL2RvYy9kb20vaHRtbC9zdHJ1Y3Rzb2FwX194bGlzdF9fY29sbF9fZ3JhcGgucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NWFmZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZG9tL2h0bWwvc3RydWN0c29hcF9feGxpc3RfX2NvbGxfX2dyYXBoLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvaW5kZXguY3NzIGIvZG9jL2luZGV4LmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjJlNTgyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2luZGV4LmNzcwpAQCAtMCwwICsxLDIxNiBAQAorSDEgeworCXRleHQtYWxpZ246IGNlbnRlcjsKKwlmb250LWZhbWlseTogR2VuZXZhLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOworfQorSDIgeworCWZvbnQtZmFtaWx5OiBHZW5ldmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Cit9CitDQVBUSU9OIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQorRElWLnFpbmRleCB7CisJd2lkdGg6IDEwMCU7CisJYmFja2dyb3VuZC1jb2xvcjogI2VlZWVmZjsKKwlib3JkZXI6IDFweCBzb2xpZCAjQjBCMEIwOworCXRleHQtYWxpZ246IGNlbnRlcjsKKwltYXJnaW46IDJweDsKKwlwYWRkaW5nOiAycHg7CisJbGluZS1oZWlnaHQ6IDEyMCU7Cit9CitBLnFpbmRleCB7CisgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgICAgIGNvbG9yOiAjMUE0MTlEOworICAgICAgIHBhZGRpbmc6IDJweDsKK30KK0EucWluZGV4OnZpc2l0ZWQgeworICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICAgICBjb2xvcjogIzFBNDE5RAorICAgICAgIHBhZGRpbmc6IDJweDsKK30KK0EucWluZGV4OmhvdmVyIHsKKwl0ZXh0LWRlY29yYXRpb246IG5vbmU7CisJYmFja2dyb3VuZC1jb2xvcjogI2RkZGRmZjsKKwlwYWRkaW5nOiAycHg7Cit9CitBLnFpbmRleEhMIHsKKwl0ZXh0LWRlY29yYXRpb246IG5vbmU7CisJZm9udC13ZWlnaHQ6IGJvbGQ7CisJYmFja2dyb3VuZC1jb2xvcjogIzY2NjZjYzsKKwljb2xvcjogI2ZmZmZmZjsKKwlwYWRkaW5nOiAycHggNnB4OworCWJvcmRlcjogMXB4IGRvdWJsZSAjOTI5NUMyOworfQorQS5xaW5kZXhITDpob3ZlciB7CisJdGV4dC1kZWNvcmF0aW9uOiBub25lOworCWJhY2tncm91bmQtY29sb3I6ICM2NjY2Y2M7CisJY29sb3I6ICNmZmZmZmY7CisJcGFkZGluZzogMnB4IDZweDsKK30KK0EucWluZGV4SEw6dmlzaXRlZCB7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgYmFja2dyb3VuZC1jb2xvcjogIzY2NjZjYzsgY29sb3I6ICNmZmZmZmYgfQorQS5lbCB7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC13ZWlnaHQ6IGJvbGQgfQorQS5lbFJlZiB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KK0EuY29kZSB7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgY29sb3I6ICMxQTQxOUR9CitBLmNvZGVSZWYgeyBmb250LXdlaWdodDogbm9ybWFsOyBjb2xvcjogIzFBNDE5RH0KK0E6aG92ZXIgeyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGJhY2tncm91bmQtY29sb3I6ICNmMmYyZmYgfQorREwuZWwgeyBtYXJnaW4tbGVmdDogLTFjbSB9CitQUkUuZnJhZ21lbnQgeworCWJvcmRlcjogMXB4IHNvbGlkICNDQ0NDQ0M7CisJYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTsKKwltYXJnaW4tdG9wOiA0cHg7CisJbWFyZ2luLWJvdHRvbTogNHB4OworCW1hcmdpbi1sZWZ0OiAycHg7CisJbWFyZ2luLXJpZ2h0OiA4cHg7CisJcGFkZGluZy1sZWZ0OiA2cHg7CisJcGFkZGluZy1yaWdodDogNnB4OworCXBhZGRpbmctdG9wOiA0cHg7CisJcGFkZGluZy1ib3R0b206IDRweDsKK30KK0RJVi5mcmFnbWVudCB7CisJYm9yZGVyOiAxcHggc29saWQgI0NDQ0NDQzsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1OworCXBhZGRpbmc6IDZweDsKK30KK0RJVi5haCB7IGJhY2tncm91bmQtY29sb3I6IGJsYWNrOyBmb250LXdlaWdodDogYm9sZDsgY29sb3I6ICNmZmZmZmY7IG1hcmdpbi1ib3R0b206IDNweDsgbWFyZ2luLXRvcDogM3B4IH0KK1RELm1kIHsgYmFja2dyb3VuZC1jb2xvcjogI0Y0RjRGQjsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KK1RELm1kbmFtZTEgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjRjRGNEZCOyBmb250LXdlaWdodDogYm9sZDsgY29sb3I6ICM2MDIwMjA7IH0KK1RELm1kbmFtZSB7IGJhY2tncm91bmQtY29sb3I6ICNGNEY0RkI7IGZvbnQtd2VpZ2h0OiBib2xkOyBjb2xvcjogIzYwMjAyMDsgd2lkdGg6IDYwMHB4OyB9CitESVYuZ3JvdXBIZWFkZXIgeworICAgICAgIG1hcmdpbi1sZWZ0OiAxNnB4OworICAgICAgIG1hcmdpbi10b3A6IDEycHg7CisgICAgICAgbWFyZ2luLWJvdHRvbTogNnB4OworICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworCWZvbnQtZmFtaWx5OiBHZW5ldmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Cit9CitESVYuZ3JvdXBUZXh0IHsgbWFyZ2luLWxlZnQ6IDE2cHg7IGZvbnQtc3R5bGU6IGl0YWxpYzsgZm9udC1zaXplOiAxNHB4IH0KK0JPRFkgeworCWJhY2tncm91bmQ6IHdoaXRlOworCWNvbG9yOiBibGFjazsKKwltYXJnaW4tcmlnaHQ6IDIwcHg7CisJbWFyZ2luLWxlZnQ6IDIwcHg7Cit9CitURC5pbmRleGtleSB7CisJYmFja2dyb3VuZC1jb2xvcjogI2VlZWVmZjsKKwlmb250LXdlaWdodDogYm9sZDsKKwlwYWRkaW5nLXJpZ2h0ICA6IDEwcHg7CisJcGFkZGluZy10b3AgICAgOiAycHg7CisJcGFkZGluZy1sZWZ0ICAgOiAxMHB4OworCXBhZGRpbmctYm90dG9tIDogMnB4OworCW1hcmdpbi1sZWZ0ICAgIDogMHB4OworCW1hcmdpbi1yaWdodCAgIDogMHB4OworCW1hcmdpbi10b3AgICAgIDogMnB4OworCW1hcmdpbi1ib3R0b20gIDogMnB4OworCWJvcmRlcjogMXB4IHNvbGlkICNDQ0NDQ0M7Cit9CitURC5pbmRleHZhbHVlIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWZmOworCWZvbnQtc3R5bGU6IGl0YWxpYzsKKwlwYWRkaW5nLXJpZ2h0ICA6IDEwcHg7CisJcGFkZGluZy10b3AgICAgOiAycHg7CisJcGFkZGluZy1sZWZ0ICAgOiAxMHB4OworCXBhZGRpbmctYm90dG9tIDogMnB4OworCW1hcmdpbi1sZWZ0ICAgIDogMHB4OworCW1hcmdpbi1yaWdodCAgIDogMHB4OworCW1hcmdpbi10b3AgICAgIDogMnB4OworCW1hcmdpbi1ib3R0b20gIDogMnB4OworCWJvcmRlcjogMXB4IHNvbGlkICNDQ0NDQ0M7Cit9CitUUi5tZW1saXN0IHsKKyAgIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7IAorfQorUC5mb3JtdWxhRHNwIHsgdGV4dC1hbGlnbjogY2VudGVyOyB9CitJTUcuZm9ybXVsYURzcCB7IH0KK0lNRy5mb3JtdWxhSW5sIHsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgfQorU1BBTi5rZXl3b3JkICAgICAgIHsgY29sb3I6ICMwMDgwMDAgfQorU1BBTi5rZXl3b3JkdHlwZSAgIHsgY29sb3I6ICM2MDQwMjAgfQorU1BBTi5rZXl3b3JkZmxvdyAgIHsgY29sb3I6ICNlMDgwMDAgfQorU1BBTi5jb21tZW50ICAgICAgIHsgY29sb3I6ICM4MDAwMDAgfQorU1BBTi5wcmVwcm9jZXNzb3IgIHsgY29sb3I6ICM4MDYwMjAgfQorU1BBTi5zdHJpbmdsaXRlcmFsIHsgY29sb3I6ICMwMDIwODAgfQorU1BBTi5jaGFybGl0ZXJhbCAgIHsgY29sb3I6ICMwMDgwODAgfQorLm1kVGFibGUgeworCWJvcmRlcjogMXB4IHNvbGlkICM4Njg2ODY7CisJYmFja2dyb3VuZC1jb2xvcjogI0Y0RjRGQjsKK30KKy5tZFJvdyB7CisJcGFkZGluZzogOHB4IDEwcHg7Cit9CisubWRlc2NMZWZ0IHsKKyAgICAgICBwYWRkaW5nOiAwcHggOHB4IDRweCA4cHg7CisJZm9udC1zaXplOiAxNHB4OworCWZvbnQtc3R5bGU6IGl0YWxpYzsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRkFGQUZBOworCWJvcmRlci10b3A6IDFweCBub25lICNFMEUwRTA7CisJYm9yZGVyLXJpZ2h0OiAxcHggbm9uZSAjRTBFMEUwOworCWJvcmRlci1ib3R0b206IDFweCBub25lICNFMEUwRTA7CisJYm9yZGVyLWxlZnQ6IDFweCBub25lICNFMEUwRTA7CisJbWFyZ2luOiAwcHg7Cit9CisubWRlc2NSaWdodCB7CisgICAgICAgcGFkZGluZzogMHB4IDhweCA0cHggOHB4OworCWZvbnQtc2l6ZTogMTRweDsKKwlmb250LXN0eWxlOiBpdGFsaWM7CisJYmFja2dyb3VuZC1jb2xvcjogI0ZBRkFGQTsKKwlib3JkZXItdG9wOiAxcHggbm9uZSAjRTBFMEUwOworCWJvcmRlci1yaWdodDogMXB4IG5vbmUgI0UwRTBFMDsKKwlib3JkZXItYm90dG9tOiAxcHggbm9uZSAjRTBFMEUwOworCWJvcmRlci1sZWZ0OiAxcHggbm9uZSAjRTBFMEUwOworCW1hcmdpbjogMHB4OworfQorLm1lbUl0ZW1MZWZ0IHsKKwlwYWRkaW5nOiAxcHggMHB4IDBweCA4cHg7CisJbWFyZ2luOiA0cHg7CisJYm9yZGVyLXRvcC13aWR0aDogMXB4OworCWJvcmRlci1yaWdodC13aWR0aDogMXB4OworCWJvcmRlci1ib3R0b20td2lkdGg6IDFweDsKKwlib3JkZXItbGVmdC13aWR0aDogMXB4OworCWJvcmRlci10b3Atc3R5bGU6IHNvbGlkOworCWJvcmRlci10b3AtY29sb3I6ICNFMEUwRTA7CisJYm9yZGVyLXJpZ2h0LWNvbG9yOiAjRTBFMEUwOworCWJvcmRlci1ib3R0b20tY29sb3I6ICNFMEUwRTA7CisJYm9yZGVyLWxlZnQtY29sb3I6ICNFMEUwRTA7CisJYm9yZGVyLXJpZ2h0LXN0eWxlOiBub25lOworCWJvcmRlci1ib3R0b20tc3R5bGU6IG5vbmU7CisJYm9yZGVyLWxlZnQtc3R5bGU6IG5vbmU7CisJYmFja2dyb3VuZC1jb2xvcjogI0ZBRkFGQTsKKwlmb250LWZhbWlseTogR2VuZXZhLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOworCWZvbnQtc2l6ZTogMTJweDsKK30KKy5tZW1JdGVtUmlnaHQgeworCXBhZGRpbmc6IDFweCA4cHggMHB4IDhweDsKKwltYXJnaW46IDRweDsKKwlib3JkZXItdG9wLXdpZHRoOiAxcHg7CisJYm9yZGVyLXJpZ2h0LXdpZHRoOiAxcHg7CisJYm9yZGVyLWJvdHRvbS13aWR0aDogMXB4OworCWJvcmRlci1sZWZ0LXdpZHRoOiAxcHg7CisJYm9yZGVyLXRvcC1zdHlsZTogc29saWQ7CisJYm9yZGVyLXRvcC1jb2xvcjogI0UwRTBFMDsKKwlib3JkZXItcmlnaHQtY29sb3I6ICNFMEUwRTA7CisJYm9yZGVyLWJvdHRvbS1jb2xvcjogI0UwRTBFMDsKKwlib3JkZXItbGVmdC1jb2xvcjogI0UwRTBFMDsKKwlib3JkZXItcmlnaHQtc3R5bGU6IG5vbmU7CisJYm9yZGVyLWJvdHRvbS1zdHlsZTogbm9uZTsKKwlib3JkZXItbGVmdC1zdHlsZTogbm9uZTsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRkFGQUZBOworCWZvbnQtZmFtaWx5OiBHZW5ldmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CisJZm9udC1zaXplOiAxM3B4OworfQorLnNlYXJjaCAgICAgeyBjb2xvcjogIzAwMzM5OTsKKyAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CitGT1JNLnNlYXJjaCB7CisgICAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDBweDsKKyAgICAgICAgICAgICAgbWFyZ2luLXRvcDogMHB4OworfQorSU5QVVQuc2VhcmNoIHsgZm9udC1zaXplOiA3NSU7CisgICAgICAgICAgICAgICBjb2xvcjogIzAwMDA4MDsKKyAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWZmOworfQorVEQudGlueSAgICAgIHsgZm9udC1zaXplOiA3NSU7Cit9CithIHsKKwljb2xvcjogIzI1MkU3ODsKK30KK2E6dmlzaXRlZCB7CisJY29sb3I6ICMzRDIxODU7Cit9CmRpZmYgLS1naXQgYS9kb2MvaW5kZXguaHRtbCBiL2RvYy9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MWMwMjQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaW5kZXguaHRtbApAQCAtMCwwICsxLDE4IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBEb2N1bWVudGF0aW9uPC90aXRsZT4NCis8bGluayBocmVmPSJpbmRleC5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8aDE+Z1NPQVAgRG9jdW1lbnRhdGlvbjwvaDE+DQorPHA+DQorPGgzIGFsaWduPSJjZW50ZXIiPk92ZXJ2aWV3PC9oMz4NCis8dWw+DQorPGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0ic29hcGRvYzIuaHRtbCI+VGhlIGdTT0FQIFVzZXIgR3VpZGU8L2E+LjwvbGk+DQorPGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0iZG9tL2h0bWwvaW5kZXguaHRtbCI+VGhlIGdTT0FQIGxldmVsLTIgRE9NPC9hPi48L2xpPg0KKzxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGkyL2h0bWwvaW5kZXguaHRtbCI+VGhlIFVEREkgdjIgQVBJPC9hPiBkb2N1bWVudHMgdGhlIGdTT0FQIFVEREkgdjIgQVBJLjwvbGk+DQorPGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZS9odG1sL2luZGV4Lmh0bWwiPlRoZSB3c3NlIHBsdWdpbjwvYT4gZG9jdW1lbnRzIHRoZSB3c3NlIHBsdWdpbiBmb3IgV1MtU2VjdXJpdHkgMS4wIHN1cHBvcnQuPC9saT4NCis8bGk+PGEgY2xhc3M9ImVsIiBocmVmPSIuLi9jaGFuZ2Vsb2cuaHRtbCI+VGhlIGNoYW5nZWxvZzwvYT4gaGlzdG9yeSBvZiBjaGFuZ2VzLjwvbGk+DQorPC91bD4NCis8aHIgc2l6ZT0iMSI+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2Mvc29hcGRvYzIuaHRtbCBiL2RvYy9zb2FwZG9jMi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MTMzOGMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc29hcGRvYzIuaHRtbApAQCAtMCwwICsxLDEzMDgxIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iDQorICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9sb29zZS5kdGQiPg0KKzxodG1sPg0KKzxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iVHRIIDMuNzIiPg0KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPg0KKyA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPiBkaXYucCB7IG1hcmdpbi10b3A6IDdwdDt9PC9zdHlsZT4NCisgPHN0eWxlIHR5cGU9InRleHQvY3NzIj48IS0tDQorIHRkIGRpdi5jb21wIHsgbWFyZ2luLXRvcDogLTAuNmV4OyBtYXJnaW4tYm90dG9tOiAtMWV4O30NCisgdGQgZGl2LmNvbWIgeyBtYXJnaW4tdG9wOiAtMC42ZXg7IG1hcmdpbi1ib3R0b206IC0uNmV4O30NCisgdGQgZGl2LmhyY29tcCB7IGxpbmUtaGVpZ2h0OiAwLjk7IG1hcmdpbi10b3A6IC0wLjhleDsgbWFyZ2luLWJvdHRvbTogLTFleDt9DQorIHRkIGRpdi5ub3JtIHtsaW5lLWhlaWdodDpub3JtYWw7fQ0KKyBzcGFuLnJvbWFuIHtmb250LWZhbWlseTogc2VyaWY7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDt9IA0KKyBzcGFuLm92ZXJhY2MyIHtwb3NpdGlvbjogcmVsYXRpdmU7ICBsZWZ0OiAuOGVtOyB0b3A6IC0xLjJleDt9DQorIHNwYW4ub3ZlcmFjYzEge3Bvc2l0aW9uOiByZWxhdGl2ZTsgIGxlZnQ6IC42ZW07IHRvcDogLTEuMmV4O30gLS0+PC9zdHlsZT4NCisNCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4NCisNCisNCisNCis8dGl0bGU+IGdTT0FQIDIuNy42IFVzZXIgR3VpZGU8L3RpdGxlPg0KKyAgICANCis8aDEgYWxpZ249ImNlbnRlciI+Z1NPQVAgMi43LjYgVXNlciBHdWlkZSA8L2gxPg0KKw0KKzxoMyBhbGlnbj0iY2VudGVyIj5Sb2JlcnQgdmFuIEVuZ2VsZW4gPGJyIC8+RmxvcmlkYSBTdGF0ZSBVbml2ZXJzaXR5IDxiciAvPmFuZCBHZW5pdmlhLCBJbmMuIDxiciAvPmVuZ2VsZW5AZ2VuaXZpYS5jb20gJmFtcDsgZW5nZWxlbkBhY20ub3JnIDwvaDM+DQorDQorPGgzIGFsaWduPSJjZW50ZXIiPkZlYiAxOSwgMjAwNg0KKzxiciAvPjxhIGhyZWY9InNvYXBkb2MyLnBkZiI+PGZvbnQgY29sb3I9IiNGRjAwMDAiPjxiPltUaGlzIGRvY3VtZW50IGlzIGFsc28gYXZhaWxhYmxlIGluIFBERiBmb3JtYXQgKGJsYWNrIGFuZCB3aGl0ZSBvbmx5KV08L2I+PC9mb250PjwvYT48L2gzPg0KKyA8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNEMEQwRDAiPjx0cj48dGQ+PHNwYW4gY2xhc3M9InJvbWFuIj4NCisNCis8aDE+Q29udGVudHMgPC9oMT48YSBocmVmPSIjdHRoX3NFYzEiDQorPjEmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkludHJvZHVjdGlvbjwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxLjEiDQorPjEuMSZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+R2V0dGluZyBTdGFydGVkPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzEuMiINCis+MS4yJm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5Zb3VyIEZpcnN0IFdlYiBTZXJ2aWNlIENsaWVudCBBcHBsaWNhdGlvbjwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxLjMiDQorPjEuMyZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+WW91ciBGaXJzdCBXZWIgU2VydmljZSBpbiBDR0k8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMS40Ig0KKz4xLjQmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkZlYXR1cmVzPC9mb250PjwvYT48YnIgLz4NCis8YSBocmVmPSIjdHRoX3NFYzIiDQorPjImbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPk5vdGF0aW9uYWwgQ29udmVudGlvbnM8L2ZvbnQ+PC9hPjxiciAvPg0KKzxhIGhyZWY9IiN0dGhfc0VjMyINCis+MyZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+RGlmZmVyZW5jZXMgQmV0d2VlbiBnU09BUCBWZXJzaW9ucyAyLjQgKGFuZCBFYXJsaWVyKSBhbmQgMi41PC9mb250PjwvYT48YnIgLz4NCis8YSBocmVmPSIjdHRoX3NFYzQiDQorPjQmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkRpZmZlcmVuY2VzIEJldHdlZW4gZ1NPQVAgVmVyc2lvbnMgMi4xIChhbmQgRWFybGllcikgYW5kIDIuMjwvZm9udD48L2E+PGJyIC8+DQorPGEgaHJlZj0iI3R0aF9zRWM1Ig0KKz41Jm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5EaWZmZXJlbmNlcyBCZXR3ZWVuIGdTT0FQIFZlcnNpb25zIDEuWCBhbmQgMi5YPC9mb250PjwvYT48YnIgLz4NCis8YSBocmVmPSIjdHRoX3NFYzYiDQorPjYmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkludGVyb3BlcmFiaWxpdHk8L2ZvbnQ+PC9hPjxiciAvPg0KKzxhIGhyZWY9IiN0dGhfc0VjNyINCis+NyZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+UXVpY2sgVXNlciBHdWlkZTwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWM3LjEiDQorPjcuMSZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+SG93IHRvIFVzZSB0aGUgZ1NPQVAgU3R1YiBhbmQgU2tlbGV0b24gQ29tcGlsZXIgdG8gQnVpbGQgU09BUCBDbGllbnRzPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzcuMS4xIg0KKz43LjEuMSZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+RXhhbXBsZTwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWM3LjEuMiINCis+Ny4xLjImbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPk5hbWVzcGFjZSBDb25zaWRlcmF0aW9uczwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWM3LjEuMyINCis+Ny4xLjMmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkV4YW1wbGU8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjNy4xLjQiDQorPjcuMS40Jm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5Ib3cgdG8gR2VuZXJhdGUgQysrIENsaWVudCBQcm94eSBDbGFzc2VzPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzcuMS41Ig0KKz43LjEuNSZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+WFNEIFR5cGUgRW5jb2RpbmcgQ29uc2lkZXJhdGlvbnM8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjNy4xLjYiDQorPjcuMS42Jm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5FeGFtcGxlPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzcuMS43Ig0KKz43LjEuNyZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+SG93IHRvIENoYW5nZSB0aGUgUmVzcG9uc2UgRWxlbWVudCBOYW1lPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzcuMS44Ig0KKz43LjEuOCZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+RXhhbXBsZTwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWM3LjEuOSINCis+Ny4xLjkmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkhvdyB0byBTcGVjaWZ5IE11bHRpcGxlIE91dHB1dCBQYXJhbWV0ZXJzPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzcuMS4xMCINCis+Ny4xLjEwJm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5FeGFtcGxlPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzcuMS4xMSINCis+Ny4xLjExJm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5Ib3cgdG8gU3BlY2lmeSBPdXRwdXQgUGFyYW1ldGVycyBXaXRoIHN0cnVjdC9jbGFzcyBDb21wb3VuZCBEYXRhIFR5cGVzPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzcuMS4xMiINCis+Ny4xLjEyJm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5FeGFtcGxlPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzcuMS4xMyINCis+Ny4xLjEzJm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5Ib3cgdG8gU3BlY2lmeSBBbm9ueW1vdXMgUGFyYW1ldGVyIE5hbWVzPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzcuMS4xNCINCis+Ny4xLjE0Jm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5Ib3cgdG8gU3BlY2lmeSBhIE1ldGhvZCB3aXRoIE5vIElucHV0IFBhcmFtZXRlcnM8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjNy4xLjE1Ig0KKz43LjEuMTUmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkhvdyB0byBTcGVjaWZ5IGEgTWV0aG9kIHdpdGggTm8gT3V0cHV0IFBhcmFtZXRlcnM8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjNy4yIg0KKz43LjImbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkhvdyB0byBVc2UgdGhlIGdTT0FQIFN0dWIgYW5kIFNrZWxldG9uIENvbXBpbGVyIHRvIEJ1aWxkIFNPQVAgV2ViIFNlcnZpY2VzPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzcuMi4xIg0KKz43LjIuMSZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+RXhhbXBsZTwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWM3LjIuMiINCis+Ny4yLjImbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPk1TVkMrKyBCdWlsZHM8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjNy4yLjMiDQorPjcuMi4zJm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5Ib3cgdG8gQ3JlYXRlIGEgU3RhbmQtQWxvbmUgZ1NPQVAgU2VydmljZTwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWM3LjIuNCINCis+Ny4yLjQmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkhvdyB0byBDcmVhdGUgYSBNdWx0aS1UaHJlYWRlZCBTdGFuZC1BbG9uZSBTZXJ2aWNlPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzcuMi41Ig0KKz43LjIuNSZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+SG93IHRvIFBhc3MgQXBwbGljYXRpb24gRGF0YSB0byBTZXJ2aWNlIE1ldGhvZHM8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjNy4yLjYiDQorPjcuMi42Jm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5Tb21lIFdlYiBTZXJ2aWNlIEltcGxlbWVudGF0aW9uIElzc3VlczwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWM3LjIuNyINCis+Ny4yLjcmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkhvdyB0byBHZW5lcmF0ZSBDKysgU2VydmVyIE9iamVjdCBDbGFzc2VzPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzcuMi44Ig0KKz43LjIuOCZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+SG93IHRvIEdlbmVyYXRlIFdTREwgU2VydmljZSBEZXNjcmlwdGlvbnM8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjNy4yLjkiDQorPjcuMi45Jm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5FeGFtcGxlPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzcuMi4xMCINCis+Ny4yLjEwJm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5Ib3cgdG8gUGFyc2UgYW5kIEltcG9ydCBXU0RMIFNlcnZpY2UgRGVzY3JpcHRpb25zIHRvIERldmVsb3AgQ2xpZW50cyBhbmQgU2VydmVyczwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWM3LjIuMTEiDQorPjcuMi4xMSZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+VGhlIHR5cGVtYXAuZGF0IEZpbGU8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjNy4yLjEyIg0KKz43LjIuMTImbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkhvdyB0byBVc2UgQ2xpZW50IEZ1bmN0aW9uYWxpdGllcyBXaXRoaW4gYSBTZXJ2aWNlPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzcuMyINCis+Ny4zJm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5Ib3cgdG8gVXNlIGdTT0FQIGZvciBBc3luY2hyb25vdXMgT25lLVdheSBNZXNzYWdlIFBhc3Npbmc8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjNy40Ig0KKz43LjQmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPk9uZS1XYXkgTWVzc2FnZSBQYXNzaW5nIG92ZXIgSFRUUDwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWM3LjUiDQorPjcuNSZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+SG93IHRvIFVzZSB0aGUgU09BUCBTZXJpYWxpemVycyBhbmQgRGVzZXJpYWxpemVycyB0byBTYXZlIGFuZCBMb2FkIEFwcGxpY2F0aW9uIERhdGE8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjNy41LjEiDQorPjcuNS4xJm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5TZXJpYWxpemluZyBhIERhdGEgVHlwZTwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWM3LjUuMiINCis+Ny41LjImbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkRlc2VyaWFsaXppbmcgYSBEYXRhIFR5cGU8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjNy41LjMiDQorPjcuNS4zJm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5FeGFtcGxlPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzcuNS40Ig0KKz43LjUuNCZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+U2VyaWFsaXppbmcgYW5kIERlc2VyaWFsaXppbmcgQ2xhc3MgSW5zdGFuY2VzIHRvIFN0cmVhbXM8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjNy41LjUiDQorPjcuNS41Jm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5Ib3cgdG8gU3BlY2lmeSBEZWZhdWx0IFZhbHVlcyBmb3IgT21pdHRlZCBEYXRhPC9mb250PjwvYT48YnIgLz4NCis8YSBocmVmPSIjdHRoX3NFYzgiDQorPjgmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPlVzaW5nIHRoZSBnU09BUCBTdHViIGFuZCBTa2VsZXRvbiBDb21waWxlcjwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWM4LjEiDQorPjguMSZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+Q29tcGlsZXIgT3B0aW9uczwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWM4LjIiDQorPjguMiZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+U09BUCAxLjEgVmVyc3VzIFNPQVAgMS4yPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzguMyINCis+OC4zJm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5UaGUgc29hcGRlZnMuaCBIZWFkZXIgRmlsZTwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWM4LjQiDQorPjguNCZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+SG93IHRvIEJ1aWxkIE1vZHVsZXMgYW5kIExpYnJhcmllcyB3aXRoIHRoZSBnU09BUCAjbW9kdWxlIERpcmVjdGl2ZTwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWM4LjUiDQorPjguNSZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+SG93IHRvIHVzZSB0aGUgZ1NPQVAgI2ltcG9ydCBEaXJlY3RpdmU8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjOC42Ig0KKz44LjYmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkhvdyB0byBVc2UgI2luY2x1ZGUgYW5kICNkZWZpbmUgRGlyZWN0aXZlczwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWM4LjciDQorPjguNyZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+Q29tcGlsaW5nIGEgZ1NPQVAgQ2xpZW50PC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzguOCINCis+OC44Jm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5Db21waWxpbmcgYSBnU09BUCBXZWIgU2VydmljZTwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWM4LjkiDQorPjguOSZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+VXNpbmcgZ1NPQVAgZm9yIENyZWF0aW5nIFdlYiBTZXJ2aWNlcyBhbmQgQ2xpZW50cyBpbiBQdXJlIEM8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjOC4xMCINCis+OC4xMCZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+TGltaXRhdGlvbnMgb2YgZ1NPQVA8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjOC4xMSINCis+OC4xMSZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+Q29tcGlsZSBUaW1lIEZsYWdzPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzguMTIiDQorPjguMTImbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPlJ1biBUaW1lIEZsYWdzPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzguMTMiDQorPjguMTMmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPk1lbW9yeSBNYW5hZ2VtZW50PC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzguMTMuMSINCis+OC4xMy4xJm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5NZW1vcnkgTWFuYWdlbWVudCBQb2xpY2llczwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWM4LjEzLjIiDQorPjguMTMuMiZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+SW50cmEtQ2xhc3MgTWVtb3J5IE1hbmFnZW1lbnQ8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjOC4xNCINCis+OC4xNCZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+RGVidWdnaW5nPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzguMTUiDQorPjguMTUmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPlJlcXVpcmVkIExpYnJhcmllczwvZm9udD48L2E+PGJyIC8+DQorPGEgaHJlZj0iI3R0aF9zRWM5Ig0KKz45Jm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5UaGUgZ1NPQVAgUmVtb3RlIE1ldGhvZCBTcGVjaWZpY2F0aW9uIEZvcm1hdDwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWM5LjEiDQorPjkuMSZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+UmVtb3RlIE1ldGhvZCBQYXJhbWV0ZXIgUGFzc2luZzwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWM5LjIiDQorPjkuMiZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+RXJyb3IgQ29kZXM8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjOS4zIg0KKz45LjMmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkMvQysrIElkZW50aWZpZXIgTmFtZSB0byBYTUwgTmFtZSBUcmFuc2xhdGlvbnM8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjOS40Ig0KKz45LjQmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPk5hbWVzcGFjZSBNYXBwaW5nIFRhYmxlPC9mb250PjwvYT48YnIgLz4NCis8YSBocmVmPSIjdHRoX3NFYzEwIg0KKz4xMCZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+Z1NPQVAgU2VyaWFsaXphdGlvbiBhbmQgRGVzZXJpYWxpemF0aW9uIFJ1bGVzPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzEwLjEiDQorPjEwLjEmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPlByaW1pdGl2ZSBUeXBlIEVuY29kaW5nPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzEwLjIiDQorPjEwLjImbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkhvdyB0byBFbmNvZGUgYW5kIERlY29kZSBQcmltaXRpdmUgVHlwZXMgYXMgWFNEIFR5cGVzPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzEwLjIuMSINCis+MTAuMi4xJm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5Ib3cgdG8gVXNlIE11bHRpcGxlIEMvQysrIFR5cGVzIGZvciBhIFNpbmdsZSBQcmltaXRpdmUgWFNEIFR5cGU8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTAuMi4yIg0KKz4xMC4yLjImbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkhvdyB0byB1c2UgV3JhcHBlciBDbGFzc2VzIHRvIFNwZWNpZnkgUG9seW1vcnBoaWMgUHJpbWl0aXZlIFR5cGVzPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzEwLjIuMyINCis+MTAuMi4zJm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5YU0QgU2NoZW1hIFR5cGUgRGVjb2RpbmcgUnVsZXM8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTAuMi40Ig0KKz4xMC4yLjQmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPk11bHRpLVJlZmVyZW5jZSBTdHJpbmdzPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzEwLjIuNSINCis+MTAuMi41Jm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj4iU21hcnQgU3RyaW5nIiBNaXhlZC1Db250ZW50IERlY29kaW5nPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzEwLjIuNiINCis+MTAuMi42Jm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5TVEwgU3RyaW5nczwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxMC4yLjciDQorPjEwLjIuNyZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+Q2hhbmdpbmcgdGhlIEVuY29kaW5nIFByZWNpc2lvbiBvZiA8Yj5mbG9hdDwvYj4mbmJzcDthbmQgPGI+ZG91YmxlPC9iPiZuYnNwO1R5cGVzPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzEwLjIuOCINCis+MTAuMi44Jm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5JTkYsIC1JTkYsIGFuZCBOYU4gVmFsdWVzIG9mIDxiPmZsb2F0PC9iPiZuYnNwO2FuZCA8Yj5kb3VibGU8L2I+Jm5ic3A7VHlwZXM8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTAuMyINCis+MTAuMyZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+RW51bWVyYXRpb24gU2VyaWFsaXphdGlvbjwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxMC4zLjEiDQorPjEwLjMuMSZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+U2VyaWFsaXphdGlvbiBvZiBTeW1ib2xpYyBFbnVtZXJhdGlvbiBDb25zdGFudHM8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTAuMy4yIg0KKz4xMC4zLjImbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkVuY29kaW5nIG9mIEVudW1lcmF0aW9uIENvbnN0YW50czwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxMC4zLjMiDQorPjEwLjMuMyZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+SW5pdGlhbGl6ZWQgRW51bWVyYXRpb24gQ29uc3RhbnRzPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzEwLjMuNCINCis+MTAuMy40Jm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5Ib3cgdG8gIlJldXNlIiBTeW1ib2xpYyBFbnVtZXJhdGlvbiBDb25zdGFudHM8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTAuMy41Ig0KKz4xMC4zLjUmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkJvb2xlYW4gRW51bWVyYXRpb24gU2VyaWFsaXphdGlvbiBmb3IgQzwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxMC4zLjYiDQorPjEwLjMuNiZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+Qml0bWFzayBFbnVtZXJhdGlvbiBTZXJpYWxpemF0aW9uPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzEwLjQiDQorPjEwLjQmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPlN0cnVjdCBTZXJpYWxpemF0aW9uPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzEwLjUiDQorPjEwLjUmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkNsYXNzIEluc3RhbmNlIFNlcmlhbGl6YXRpb248L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTAuNS4xIg0KKz4xMC41LjEmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkV4YW1wbGU8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTAuNS4yIg0KKz4xMC41LjImbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkluaXRpYWxpemVkIDxiPnN0YXRpYzwvYj4mbmJzcDs8Yj5jb25zdDwvYj4mbmJzcDtGaWVsZHM8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTAuNS4zIg0KKz4xMC41LjMmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkNsYXNzIE1ldGhvZHM8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTAuNS40Ig0KKz4xMC41LjQmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkdldHRlciBhbmQgU2V0dGVyIE1ldGhvZHM8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTAuNS41Ig0KKz4xMC41LjUmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPlN0cmVhbWluZyBYTUwgd2l0aCBHZXR0ZXIgYW5kIFNldHRlciBNZXRob2RzPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzEwLjUuNiINCis+MTAuNS42Jm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5Qb2x5bW9ycGhpc20sIERlcml2ZWQgQ2xhc3NlcywgYW5kIER5bmFtaWMgQmluZGluZzwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxMC41LjciDQorPjEwLjUuNyZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+WE1MIEF0dHJpYnV0ZXM8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTAuNS44Ig0KKz4xMC41LjgmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPlFOYW1lIEF0dHJpYnV0ZXMgYW5kIEVsZW1lbnRzPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzEwLjYiDQorPjEwLjYmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPlVuaW9uIFNlcmlhbGl6YXRpb248L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTAuNyINCis+MTAuNyZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+U2VyaWFsaXppbmcgUG9pbnRlciBUeXBlczwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxMC43LjEiDQorPjEwLjcuMSZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+TXVsdGktUmVmZXJlbmNlZCBEYXRhPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzEwLjcuMiINCis+MTAuNy4yJm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5OVUxMIFBvaW50ZXJzIGFuZCBOaWwgRWxlbWVudHM8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTAuOCINCis+MTAuOCZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+Vm9pZCBQb2ludGVyczwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxMC45Ig0KKz4xMC45Jm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5GaXhlZC1TaXplIEFycmF5czwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxMC4xMCINCis+MTAuMTAmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkR5bmFtaWMgQXJyYXlzPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzEwLjEwLjEiDQorPjEwLjEwLjEmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPlNPQVAgQXJyYXkgQm91bmRzIExpbWl0czwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxMC4xMC4yIg0KKz4xMC4xMC4yJm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5PbmUtRGltZW5zaW9uYWwgRHluYW1pYyBBcnJheXM8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTAuMTAuMyINCis+MTAuMTAuMyZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+RXhhbXBsZTwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxMC4xMC40Ig0KKz4xMC4xMC40Jm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5PbmUtRGltZW5zaW9uYWwgRHluYW1pYyBBcnJheXMgV2l0aCBOb24tWmVybyBPZmZzZXQ8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTAuMTAuNSINCis+MTAuMTAuNSZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+TmVzdGVkIE9uZS1EaW1lbnNpb25hbCBEeW5hbWljIEFycmF5czwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxMC4xMC42Ig0KKz4xMC4xMC42Jm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5NdWx0aS1EaW1lbnNpb25hbCBEeW5hbWljIEFycmF5czwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxMC4xMC43Ig0KKz4xMC4xMC43Jm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5FbmNvZGluZyBYTUwgR2VuZXJpY3MgQ29udGFpbmluZyBEeW5hbWljIEFycmF5czwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxMC4xMC44Ig0KKz4xMC4xMC44Jm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5TVEwgQ29udGFpbmVyczwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxMC4xMC45Ig0KKz4xMC4xMC45Jm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5Qb2x5bW9ycGhpYyBEeW5hbWljIEFycmF5cyBhbmQgTGlzdHM8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTAuMTAuMTAiDQorPjEwLjEwLjEwJm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5Ib3cgdG8gQ2hhbmdlIHRoZSBUYWcgTmFtZXMgb2YgdGhlIEVsZW1lbnRzIG9mIGEgU09BUCBBcnJheSBvciBMaXN0PC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzEwLjExIg0KKz4xMC4xMSZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+QmFzZTY0QmluYXJ5IFhNTCBTY2hlbWEgVHlwZSBFbmNvZGluZzwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxMC4xMiINCis+MTAuMTImbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPmhleEJpbmFyeSBYTUwgU2NoZW1hIFR5cGUgRW5jb2Rpbmc8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTAuMTMiDQorPjEwLjEzJm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5MaXRlcmFsIFhNTCBFbmNvZGluZyBTdHlsZTwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxMC4xMy4xIg0KKz4xMC4xMy4xJm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5TZXJpYWxpemluZyBhbmQgRGVzZXJpYWxpemluZyBNaXhlZCBDb250ZW50IFhNTCBXaXRoIFN0cmluZ3M8L2ZvbnQ+PC9hPjxiciAvPg0KKzxhIGhyZWY9IiN0dGhfc0VjMTEiDQorPjExJm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5TT0FQIEZhdWx0IFByb2Nlc3Npbmc8L2ZvbnQ+PC9hPjxiciAvPg0KKzxhIGhyZWY9IiN0dGhfc0VjMTIiDQorPjEyJm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5TT0FQIEhlYWRlciBQcm9jZXNzaW5nPC9mb250PjwvYT48YnIgLz4NCis8YSBocmVmPSIjdHRoX3NFYzEzIg0KKz4xMyZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+TUlNRSBBdHRhY2htZW50czwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxMy4xIg0KKz4xMy4xJm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5TZW5kaW5nIGEgQ29sbGVjdGlvbiBvZiBNSU1FIEF0dGFjaG1lbnRzPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzEzLjIiDQorPjEzLjImbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPlJldHJpZXZpbmcgYSBDb2xsZWN0aW9uIG9mIE1JTUUgQXR0YWNobWVudHM8L2ZvbnQ+PC9hPjxiciAvPg0KKzxhIGhyZWY9IiN0dGhfc0VjMTQiDQorPjE0Jm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5ESU1FIEF0dGFjaG1lbnRzPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzE0LjEiDQorPjE0LjEmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPlNlbmRpbmcgYSBDb2xsZWN0aW9uIG9mIERJTUUgQXR0YWNobWVudHM8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTQuMiINCis+MTQuMiZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+UmV0cmlldmluZyBhIENvbGxlY3Rpb24gb2YgRElNRSBBdHRhY2htZW50czwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxNC4zIg0KKz4xNC4zJm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5TZXJpYWxpemluZyBCaW5hcnkgRGF0YSBpbiBESU1FPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzE0LjQiDQorPjE0LjQmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPlN0cmVhbWluZyBESU1FPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzE0LjUiDQorPjE0LjUmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPlN0cmVhbWluZyBDaHVua2VkIERJTUU8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTQuNiINCis+MTQuNiZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+V1NETCBCaW5kaW5ncyBmb3IgRElNRSBBdHRhY2htZW50czwvZm9udD48L2E+PGJyIC8+DQorPGEgaHJlZj0iI3R0aF9zRWMxNSINCis+MTUmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPk1UT00gQXR0YWNobWVudHM8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTUuMSINCis+MTUuMSZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+R2VuZXJhdGluZyBNdWx0aXBhcnRSZWxhdGVkIE1JTUUgQXR0YWNobWVudCBCaW5kaW5ncyBpbiBXU0RMPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzE1LjIiDQorPjE1LjImbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPlNlbmRpbmcgYW5kIFJlY2VpdmluZyBNVE9NIEF0dGFjaG1lbnRzPC9mb250PjwvYT48YnIgLz4NCis8YSBocmVmPSIjdHRoX3NFYzE2Ig0KKz4xNiZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+WE1MIFZhbGlkYXRpb248L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTYuMSINCis+MTYuMSZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+T2NjdXJyZW5jZSBDb25zdHJhaW50czwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxNi4xLjEiDQorPjE2LjEuMSZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+RWxlbWVudHMgd2l0aCBtaW5PY2N1cnMgYW5kIG1heE9jY3VycyBSZXN0cmljdGlvbnM8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTYuMS4yIg0KKz4xNi4xLjImbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPlJlcXVpcmVkIGFuZCBQcm9oaWJpdGVkIEF0dHJpYnV0ZXM8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTYuMS4zIg0KKz4xNi4xLjMmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkRhdGEgTGVuZ3RoIFJlc3RyaWN0aW9uczwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxNi4yIg0KKz4xNi4yJm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5PdGhlciBDb25zdHJhaW50czwvZm9udD48L2E+PGJyIC8+DQorPGEgaHJlZj0iI3R0aF9zRWMxNyINCis+MTcmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPlNPQVAtb3Zlci1VRFA8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTcuMSINCis+MTcuMSZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+VXNpbmcgV1MtQWRkcmVzc2luZyB3aXRoIFNPQVAtb3Zlci1VRFA8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTcuMiINCis+MTcuMiZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+Q2xpZW50LXNpZGUgT25lLXdheSBVbmljYXN0PC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzE3LjMiDQorPjE3LjMmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkNsaWVudC1zaWRlIE9uZS13YXkgTXVsdGljYXN0PC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzE3LjQiDQorPjE3LjQmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkNsaWVudC1zaWRlIFJlcXVlc3QtUmVzcG9uc2UgVW5pY2FzdDwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxNy41Ig0KKz4xNy41Jm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5DbGllbnQtc2lkZSBSZXF1ZXN0LVJlc3BvbnNlIE11bHRpY2FzdDwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxNy42Ig0KKz4xNy42Jm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5TT0FQLW92ZXItVURQIFNlcnZlcjwvZm9udD48L2E+PGJyIC8+DQorPGEgaHJlZj0iI3R0aF9zRWMxOCINCis+MTgmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkFkdmFuY2VkIEZlYXR1cmVzPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzE4LjEiDQorPjE4LjEmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkludGVybmF0aW9uYWxpemF0aW9uPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzE4LjIiDQorPjE4LjImbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkN1c3RvbWl6aW5nIHRoZSBXU0RMIGFuZCBOYW1lc3BhY2UgTWFwcGluZyBUYWJsZSBGaWxlIENvbnRlbnRzIFdpdGggZ1NPQVAgRGlyZWN0aXZlczwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxOC4yLjEiDQorPjE4LjIuMSZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+RXhhbXBsZTwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxOC4zIg0KKz4xOC4zJm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5UcmFuc2llbnQgRGF0YSBUeXBlczwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxOC40Ig0KKz4xOC40Jm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5Wb2xhdGlsZSBEYXRhIFR5cGVzPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzE4LjUiDQorPjE4LjUmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkhvdyB0byBEZWNsYXJlIFVzZXItRGVmaW5lZCBTZXJpYWxpemVycyBhbmQgRGVzZXJpYWxpemVyczwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxOC42Ig0KKz4xOC42Jm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5Ib3cgdG8gU2VyaWFsaXplIERhdGEgV2l0aG91dCBHZW5lcmF0aW5nIFhTRCBUeXBlIEF0dHJpYnV0ZXM8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTguNyINCis+MTguNyZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+RnVuY3Rpb24gQ2FsbGJhY2tzIGZvciBDdXN0b21pemVkIEkvTyBhbmQgSFRUUCBIYW5kbGluZzwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxOC44Ig0KKz4xOC44Jm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5IVFRQIDEuMCBhbmQgMS4xPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzE4LjkiDQorPjE4LjkmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkhUVFAgMzA3IFRlbXBvcmFyeSBSZWRpcmVjdCBTdXBwb3J0PC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzE4LjEwIg0KKz4xOC4xMCZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+SFRUUCBHRVQgU3VwcG9ydDwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxOC4xMSINCis+MTguMTEmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkhUVFAgS2VlcC1BbGl2ZTwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxOC4xMiINCis+MTguMTImbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkhUVFAgQ2h1bmtlZCBUcmFuc2ZlciBFbmNvZGluZzwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxOC4xMyINCis+MTguMTMmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkhUVFAgQnVmZmVyZWQgU2VuZHM8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTguMTQiDQorPjE4LjE0Jm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5IVFRQIEF1dGhlbnRpY2F0aW9uPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzE4LjE1Ig0KKz4xOC4xNSZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+SFRUUCBQcm94eSBBdXRoZW50aWNhdGlvbjwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxOC4xNiINCis+MTguMTYmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPlNwZWVkIEltcHJvdmVtZW50IFRpcHM8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTguMTciDQorPjE4LjE3Jm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5UaW1lb3V0IE1hbmFnZW1lbnQgZm9yIE5vbi1CbG9ja2luZyBPcGVyYXRpb25zPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzE4LjE4Ig0KKz4xOC4xOCZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+U29ja2V0IE9wdGlvbnMgYW5kIEZsYWdzPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzE4LjE5Ig0KKz4xOC4xOSZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+U2VjdXJlIFNPQVAgV2ViIFNlcnZpY2VzIHdpdGggSFRUUFMvU1NMPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzE4LjIwIg0KKz4xOC4yMCZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+U2VjdXJlIFNPQVAgQ2xpZW50cyB3aXRoIEhUVFBTL1NTTDwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxOC4yMSINCis+MTguMjEmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPlNTTCBBdXRoZW50aWNhdGlvbiBDYWxsYmFjazwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxOC4yMiINCis+MTguMjImbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPlNTTCBDZXJ0aWZpY2F0ZXM8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTguMjMiDQorPjE4LjIzJm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5TU0wgSGFyZHdhcmUgQWNjZWxlcmF0aW9uPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzE4LjI0Ig0KKz4xOC4yNCZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+U1NMIG9uIFdpbmRvd3M8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTguMjUiDQorPjE4LjI1Jm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5abGliIENvbXByZXNzaW9uPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzE4LjI2Ig0KKz4xOC4yNiZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+Q2xpZW50LVNpZGUgQ29va2llIFN1cHBvcnQ8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTguMjciDQorPjE4LjI3Jm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5TZXJ2ZXItU2lkZSBDb29raWUgU3VwcG9ydDwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxOC4yOCINCis+MTguMjgmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkNvbm5lY3RpbmcgQ2xpZW50cyBUaHJvdWdoIFByb3h5IFNlcnZlcnM8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTguMjkiDQorPjE4LjI5Jm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5GYXN0Q0dJIFN1cHBvcnQ8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTguMzAiDQorPjE4LjMwJm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5Ib3cgdG8gQ3JlYXRlIGdTT0FQIEFwcGxpY2F0aW9ucyBXaXRoIGEgU21hbGwgTWVtb3J5IEZvb3RwcmludDwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxOC4zMSINCis+MTguMzEmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkhvdyB0byBFbGltaW5hdGUgQlNEIFNvY2tldCBMaWJyYXJ5IExpbmthZ2U8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTguMzIiDQorPjE4LjMyJm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5Ib3cgdG8gQ29tYmluZSBNdWx0aXBsZSBDbGllbnQgYW5kIFNlcnZlciBJbXBsZW1lbnRhdGlvbnMgaW50byBvbmUgRXhlY3V0YWJsZTwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxOC4zMyINCis+MTguMzMmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkhvdyB0byBCdWlsZCBhIENsaWVudCBvciBTZXJ2ZXIgaW4gYSBDKysgQ29kZSBOYW1lc3BhY2U8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTguMzQiDQorPjE4LjM0Jm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5Ib3cgdG8gQ3JlYXRlIENsaWVudC9TZXJ2ZXIgTGlicmFyaWVzPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzE4LjM0LjEiDQorPjE4LjM0LjEmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkMrKyBFeGFtcGxlPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzE4LjM0LjIiDQorPjE4LjM0LjImbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkMgRXhhbXBsZTwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxOC4zNSINCis+MTguMzUmbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkhvdyB0byBDcmVhdGUgRExMczwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxOC4zNS4xIg0KKz4xOC4zNS4xJm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5DcmVhdGUgdGhlIEJhc2Ugc3Rkc29hcDIuZGxsPC9mb250PjwvYT48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSIjdHRoX3NFYzE4LjM1LjIiDQorPjE4LjM1LjImbmJzcDsgPGZvbnQgY29sb3I9IiMwMDAwRkYiPkNyZWF0aW5nIENsaWVudCBhbmQgU2VydmVyIERMTHM8L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTguMzYiDQorPjE4LjM2Jm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5nU09BUCBQbHVnLWluczwvZm9udD48L2E+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iI3R0aF9zRWMxOC4zNi4xIg0KKz4xOC4zNi4xJm5ic3A7IDxmb250IGNvbG9yPSIjMDAwMEZGIj5UaGUgTWVzc2FnZSBMb2dnaW5nIGFuZCBTdGF0aXN0aWNzIFBsdWctaW48L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTguMzYuMiINCis+MTguMzYuMiZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+VGhlIEhUVFAgR0VUIFBsdWctaW48L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTguMzYuMyINCis+MTguMzYuMyZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+VGhlIEhUVFAgTUQ1IFBsdWctaW48L2ZvbnQ+PC9hPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9IiN0dGhfc0VjMTguMzYuNCINCis+MTguMzYuNCZuYnNwOyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+VGhlIEhUVFAgRGlnZXN0IEF1dGhlbnRpY2F0aW9uIFBsdWctaW48L2ZvbnQ+PC9hPjxiciAvPg0KKw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQorPGk+Q29weXJpZ2h0IChDKSAyMDAwLTIwMDYgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLCBHZW5pdmlhLCBJbmMuLCBBbGwgUmlnaHRzIFJlc2VydmVkLjwvaT4NCisNCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorIDxoMj48YSBuYW1lPSJ0dGhfc0VjMSI+DQorMTwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+SW50cm9kdWN0aW9uPC9mb250PjwvaDI+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBnU09BUCB0b29scyBwcm92aWRlIGEgU09BUC9YTUwtdG8tQy9DKysgbGFuZ3VhZ2UgYmluZGluZw0KK3RvIGVhc2UgdGhlIGRldmVsb3BtZW50IG9mIFNPQVAvWE1MIFdlYiBzZXJ2aWNlcyBhbmQgY2xpZW50IGFwcGxpY2F0aW9uIGluIEMNCithbmQgQysrLiAgTW9zdCB0b29sa2l0cyBmb3IgQysrIFdlYiBzZXJ2aWNlcyBhZG9wdCBhIFNPQVAtY2VudHJpYyB2aWV3IGFuZA0KK29mZmVyIEFQSXMgdGhhdCByZXF1aXJlIHRoZSB1c2Ugb2YgY2xhc3MgbGlicmFyaWVzIGZvciBTT0FQLXNwZWNpZmljDQorZGF0YSBzdHJ1Y3R1cmVzLiAgVGhpcyBvZnRlbiBmb3JjZXMgYSB1c2VyIHRvIGFkYXB0IHRoZSBhcHBsaWNhdGlvbiBsb2dpYyB0bw0KK3RoZXNlIGxpYnJhcmllcy4gIEluIGNvbnRyYXN0LCBnU09BUCBwcm92aWRlcyBhIEMvQysrIHRyYW5zcGFyZW50IFNPQVAgQVBJDQordGhyb3VnaCB0aGUgdXNlIG9mIGNvbXBpbGVyIHRlY2hub2xvZ3kgdGhhdCBoaWRlcyBpcnJlbGV2YW50IFNPQVAtc3BlY2lmaWMNCitkZXRhaWxzIGZyb20gdGhlIHVzZXIuICBUaGUgZ1NPQVAgc3R1YiBhbmQgc2tlbGV0b24gY29tcGlsZXIgYXV0b21hdGljYWxseQ0KK21hcHMgbmF0aXZlIGFuZCB1c2VyLWRlZmluZWQgQyBhbmQgQysrIGRhdGEgdHlwZXMgdG8gc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQNCitYTUwgZGF0YSB0eXBlcyBhbmQgdmljZS12ZXJzYS4gIEFzIGEgcmVzdWx0LCBmdWxsIFNPQVAgaW50ZXJvcGVyYWJpbGl0eSBpcw0KK2FjaGlldmVkIHdpdGggYSBzaW1wbGUgQVBJIHJlbGlldmluZyB0aGUgdXNlciBmcm9tIHRoZSBidXJkZW4gb2YgU09BUCBkZXRhaWxzLA0KK3RodXMgZW5hYmxpbmcgaGltIG9yIGhlciB0byBjb25jZW50cmF0ZSBvbiB0aGUgYXBwbGljYXRpb24tZXNzZW50aWFsIGxvZ2ljLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgZ1NPQVAgY29tcGlsZXIgZW5hYmxlcyB0aGUgaW50ZWdyYXRpb24gb2YgKGxlZ2FjeSkgQy9DKysgYW5kIEZvcnRyYW4gY29kZXMNCisodGhyb3VnaCBhIEZvcnRyYW4gdG8gQyBpbnRlcmZhY2UpLCBlbWJlZGRlZCBzeXN0ZW1zLCBhbmQgcmVhbC10aW1lIHNvZnR3YXJlIGluDQorU09BUCBhcHBsaWNhdGlvbnMgdGhhdCBzaGFyZSBjb21wdXRhdGlvbmFsIHJlc291cmNlcyBhbmQgaW5mb3JtYXRpb24gd2l0aCBvdGhlcg0KK1NPQVAgYXBwbGljYXRpb25zLCBwb3NzaWJseSBhY3Jvc3MgZGlmZmVyZW50IHBsYXRmb3JtcywgbGFuZ3VhZ2UgZW52aXJvbm1lbnRzLA0KK2FuZCBkaXNwYXJhdGUgb3JnYW5pemF0aW9ucyBsb2NhdGVkIGJlaGluZCBmaXJld2FsbHMuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKyAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWMxLjEiPg0KKzEuMTwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+R2V0dGluZyBTdGFydGVkPC9mb250PjwvaDM+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RvIHN0YXJ0IGJ1aWxkaW5nIFdlYiBzZXJ2aWNlcyBhcHBsaWNhdGlvbnMgd2l0aCBnU09BUCwgeW91IG5lZWQ6DQorDQorPHVsPg0KKzxsaT4gVGhlIGdTT0FQIHBhY2thZ2UgZnJvbSA8YSBocmVmPSJodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2dzb2FwMiI+PHR0Pmh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvZ3NvYXAyPC90dD48L2E+DQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorDQorPGxpPiBBIEMgb3IgQysrIGNvbXBpbGVyLg0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8L2xpPg0KKw0KKzxsaT4gWW91IG1heSB3YW50IHRvIGluc3RhbGwgT3BlblNTTCBhbmQgdGhlIFpsaWIgbGlicmFyaWVzIHRvIGVuYWJsZSBTU0wgKEhUVFBTKSBhbmQgY29tcHJlc3Npb24uIFRoZXNlIGxpYnJhcmllcyBhcmUgYXZhaWxhYmxlIGZvciBtb3N0IHBsYXRmb3JtcyBhbmQgYXJlIG9mdGVuIGFscmVhZHkgaW5zdGFsbGVkLg0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8L2xpPg0KKzwvdWw+DQorZ1NPQVAgaXMgc2VsZi1jb250YWluZWQsIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gZG93bmxvYWQgYW55IHRoaXJkLXBhcnR5DQorc29mdHdhcmUgKHVubGVzcyB5b3Ugd2FudCB0byB1c2UgT3BlblNTTCBhbmQgdGhlIGxpYnJhcnkgaXMgbm90IGFscmVhZHkNCitpbnN0YWxsZWQpLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitBbHRob3VnaCBnU09BUCBpcyBhdmFpbGFibGUgaW4gYmluYXJ5IGZvcm1hdCBmb3Igc2V2ZXJhbCBwbGF0Zm9ybXMsIHRoZSBjb2RlDQorZ2VuZXJhdGVkIGJ5IHRoZSBnU09BUCBzdHViIGFuZCBza2VsZXRvbiBjb21waWxlciBhbmQgdGhlIGdTT0FQIHJ1bnRpbWUgY29kZXMNCithcmUgZXF1aXZhbGVudC4gVGhpcyBtZWFucyB0aGF0IHRoZSBnZW5lcmF0ZWQgY29kZXMgY2FuIGJlIHRyYW5zZmVycmVkIHRvIG90aGVyDQorcGxhdGZvcm1zIGFuZCBjb21waWxlZC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIGdTT0FQIHBhY2thZ2VzIGF2YWlsYWJsZSBmcm9tIFNvdXJjZUZvcmdlIGluY2x1ZGUgcHJlLWJ1aWxkIHRvb2xzOg0KKw0KKzx1bD4NCis8bGk+IFRoZSA8aT53c2RsMmg8L2k+IFdTREwvc2NoZW1hIHBhcnNlciB0b29sLg0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8L2xpPg0KKw0KKzxsaT4gVGhlIDxpPnNvYXBjcHAyPC9pPiBzdHViL3NrZWxldG9uIGNvbXBpbGVyLg0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8L2xpPg0KKzwvdWw+DQorV2luMzIgdmVyc2lvbnMgb2YgdGhlc2UgdHdvIGFyZSBpbmNsdWRlZCBpbiB0aGUgV2luMzIgZ1NPQVAgcGFja2FnZSBvbmx5Lg0KK0lmIHlvdSBkb24ndCBoYXZlIHRoZSBiaW5hcmllcyBvciBpZiB5b3Ugd2FudCB0byByZWJ1aWxkIHRoZW0sIHlvdSBuZWVkDQorDQorPHVsPg0KKzxsaT4gQSBDKysgY29tcGlsZXIgdG8gYnVpbGQgPGk+d3NkbDJoPC9pPi4NCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorPC9saT4NCisNCis8bGk+IEEgQyBjb21waWxlciBhbmQgQmlzb24gb3IgWWFjYyB0byBidWlsZCA8aT5zb2FwY3BwMjwvaT4uDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorDQorPGxpPiBBIEMgY29tcGlsZXIgYW5kIEZsZXggb3IgTGV4IHRvIGJ1aWxkIDxpPnNvYXBjcHAyPC9pPi4NCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorPC9saT4NCis8L3VsPg0KK0Jpc29uIGFuZCBGbGV4IGFyZSBwcmVmZXJyZWQuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSB0b29scyBhcmUgdXNlZCB0byBnZW5lcmF0ZSBjb2RlIHRoYXQgaXMgbGlua2VkIHdpdGggdGhlIGdTT0FQIGVuZ2luZQ0KKzxpPnNvYXBjcHAyLmM8L2k+IChDIHZlcnNpb24pIG9yIDxpPnNvYXBjcHAyLmNwcDwvaT4gKEMrKyB2ZXJzaW9uKSBhbmQgeW91cg0KK2FwcGxpY2F0aW9uIGNvZGUuIFRoZSBlbmdpbmUgaXMgYWxzbyBhdmFpbGFibGUgYXMgYSBsaWJyYXJ5IDxpPmxpYmdzb2FwLmE8L2k+IGFuZA0KKzxpPmxpYmdzb2FwKysuYTwvaT4gd2l0aCBzZXBhcmF0ZSB2ZXJzaW9ucyB0aGF0IHN1cHBvcnQgU1NMLiBTZWUgdGhlDQorPGk+UkVBRE1FLnR4dDwvaT4gaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBidWlsZCB0aGVzZSBsaWJyYXJpZXMgd2l0aCB0aGUNCitwbGF0Zm9ybS1pbmRlcGVuZGVudCBnU09BUCBwYWNrYWdlJ3MgYXV0b2NvbmYgYW5kIGF1dG9tYWtlLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgZ1NPQVAgcGFja2FnZXMgY29udGFpbiBudW1lcm91cyBleGFtcGxlcyBpbiB0aGUgPGk+c2FtcGxlczwvaT4gZGlyZWN0b3J5Lg0KK1J1biA8aT5tYWtlPC9pPiB0byBidWlsZCB0aGUgZXhhbXBsZSBhcHBsaWNhdGlvbnMuIFRoZSBleGFtcGxlcyBhcmUgYWxzbyBtZWFudA0KK3RvIGRlbW9uc3RyYXRlIGRpZmZlcmVudCBmZWF0dXJlcyBvZiBnU09BUC4gVGhlIHNpbXBsZXN0IGV4YW1wbGVzIGFyZSB0aGUNCitvbmUtbGluZXJzIGluIDxpPnNhbXBsZXMvb25lbGluZXJzPC9pPi4gSW5kZWVkLCB5b3UgY2FuIHdyaXRlIGEgb25lLWxpbmUgV2ViDQorc2VydmljZSB3aXRoIENHSSEuIEEgc3RyZWFtaW5nIERJTUUgYXR0YWNobWVudCBzZXJ2ZXIgYW5kIGNsaWVudCBhcHBsaWNhdGlvbg0KK2RlbW9uc3RyYXRlIGVmZmljaWVudCBmaWxlIGV4Y2hhbmdlcyBpbiA8aT5zYW1wbGVzL2RpbWU8L2k+LiBBbiBTU0wtc2VjdXJlIFdlYg0KK3NlcnZlciBhcHBsaWNhdGlvbiBkZW1vbnN0cmF0ZXMgdGhlIGdlbmVyYXRpb24gb2YgZHluYW1pYyBjb250ZW50IGZvciBXZWINCiticm93c2luZyBhbmQgV2ViIHNlcnZpY2VzIGZ1bmN0aW9uYWxpdHkgYXQgdGhlIHNhbWUgdGltZSwgc2VlDQorPGk+c2FtcGxlcy93ZWJzZXJ2aWNlPC9pPi4gQW5kIG11Y2ggbW9yZS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorICAgICA8aDM+PGEgbmFtZT0idHRoX3NFYzEuMiI+DQorMS4yPC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5Zb3VyIEZpcnN0IFdlYiBTZXJ2aWNlIENsaWVudCBBcHBsaWNhdGlvbjwvZm9udD48L2gzPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgZ1NPQVAgdG9vbHMgbWluaW1pemUgYXBwbGljYXRpb24gYWRhcHRhdGlvbiBlZmZvcnRzIGZvciBidWlsZGluZyBXZWINCitTZXJ2aWNlcy4gIFRoZSBnU09BUCA8aT53c2RsMmg8L2k+IHRvb2wgaW1wb3J0cyBvbmUgb3IgbW9yZSBXU0RMcyBhbmQgWE1MDQorc2NoZW1hcyB0byBnZW5lcmF0ZSBhIGhlYWRlciBmaWxlIHdpdGggdGhlIFdlYiBzZXJ2aWNlIG9wZXJhdGlvbnMgYW5kIHRoZSBDL0MrKw0KK2RhdGEgdHlwZXMgdXNlZCBieSB0aGUgc2VydmljZXMuIFRoZSBnU09BUCA8aT5zb2FwY3BwMjwvaT4gY29tcGlsZXIgdGFrZXMgdGhlDQoraGVhZGVyIGZpbGUgYW5kIGdlbmVyYXRlcyBYTUwgc2VyaWFsaXplcnMgZm9yIHRoZSBkYXRhIHR5cGVzICg8aT5zb2FwSC5oPC9pPiBhbmQNCis8aT5zb2FwQy5jcHA8L2k+KSwgdGhlIGNsaWVudC1zaWRlIHN0dWJzICg8aT5zb2FwQ2xpZW50LmNwcDwvaT4pLCBhbmQgc2VydmVyLXNpZGUNCitza2VsZXRvbnMgKDxpPnNvYXBTZXJ2ZXIuY3BwPC9pPikuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBnU09BUCA8aT5zb2FwY3BwMjwvaT4gY29tcGlsZXIgY2FuIGFsc28gZ2VuZXJhdGUgV1NETCBkZWZpbml0aW9ucyBmb3INCitpbXBsZW1lbnRpbmcgYSBzZXJ2aWNlIGZyb20gc2NyYXRjaCwgaS5lLiZuYnNwO3dpdGhvdXQgZGVmaW5pbmcgYSBXU0RMIGZpcnN0LiBUaGlzDQorImNsb3NlcyB0aGUgY2lyY2xlIiBpbiB0aGF0IGl0IGVuYWJsZXMgV2ViIHNlcnZpY2VzIGRldmVsb3BtZW50IGZyb20gV1NETCBvcg0KK2RpcmVjdGx5IGZyb20gYSBzZXQgb3AgQy9DKysgb3BlcmF0aW9ucyBpbiBhIGhlYWRlciBmaWxlIHdpdGhvdXQgdGhlIG5lZWQgZm9yDQordXNlcnMgdG8gYW5hbHl6ZSBXZWIgc2VydmljZSBkZXRhaWxzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitZb3Ugb25seSBuZWVkIHRvIGZvbGxvdyBhIGZldyBzdGVwcyB0byBleGVjdXRlIHRoZSB0b29scyBmcm9tIHRoZSBjb21tYW5kIGxpbmUNCitvciBNYWtlZmlsZSAoc2VlIGFsc28gTVNWQysrIHByb2plY3QgZXhhbXBsZXMgaW4gdGhlIDxpPnNhbXBsZXM8L2k+IGRpcmVjdG9yeQ0KK3dpdGggdG9vbCBpbnRlZ3JhdGlvbiBpbiB0aGUgTVNWQysrIElERSkuIEZvciBleGFtcGxlLCB0byBnZW5lcmF0ZSBjb2RlIGZvciB0aGUNCitYTWV0aG9kcyBzZXJ2aWNlIGxpc3RpbmcgV2ViIHNlcnZpY2UsIHdlIHJ1biB0aGUgPGk+d3NkbDJoPC9pPiB0b29sIGZyb20gdGhlDQorY29tbWFuZCBsaW5lIG9uIHRoZSBVUkwgb2YgdGhlIFdTREwgYW5kIHVzZSBvcHRpb24gPGk+LW88L2k+IHRvIHNwZWNpZnkgdGhlDQorb3V0cHV0IGZpbGU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjRDBEMEQwIj48dHI+PHRkPjxzcGFuIGNsYXNzPSJyb21hbiI+DQorPGk+JCB3c2RsMmggLW8gWE1ldGhvZHNRdWVyeS5oIGh0dHA6Ly93d3cueG1ldGhvZHMubmV0L3dzZGwvcXVlcnkud3NkbDwvaT4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9zcGFuPg0KK1RoaXMgZ2VuZXJhdGVzIHRoZSA8aT5YTWV0aG9kc1F1ZXJ5Lmg8L2k+IGhlYWRlciBmaWxlIHdpdGggV2ViIHNlcnZpY2UNCitvcGVyYXRpb25zIGFuZCB0aGUgZGF0YSB0eXBlcyB0aGF0IHRoZSBzZXJ2aWNlIHVzZXMuIFRoaXMgaGVhZGVyIGZpbGUgaXMgdG8gYmUNCitwcm9jZXNzZWQgd2l0aCA8aT5zb2FwY3BwMjwvaT4gdG8gZ2VuZXJhdGUgdGhlIHN0dWIgYW5kL29yIHNrZWxldG9uIGNvZGUuIFRoZQ0KKzxpPlhNZXRob2RzUXVlcnkuaDwvaT4gZmlsZSBpbmNsdWRlcyBhbGwgZG9jdW1lbnRhdGlvbiwgc28geW91IGNhbiB1c2UgRG94eWdlbg0KKyg8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnIj48dHQ+aHR0cDovL3d3dy5kb3h5Z2VuLm9yZzwvdHQ+PC9hPikgdG8gYXV0b21hdGljYWxseSBnZW5lcmF0ZSB0aGUgZG9jdW1lbnRhdGlvbiBwYWdlcyBmb3INCit5b3VyIGRldmVsb3BtZW50Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitJbiB0aGlzIGV4YW1wbGUgd2UgYXJlIGRldmVsb3BpbmcgYSBDKysgQVBJIGZvciB0aGUgWE1ldGhvZHMgc2VydmljZS4gQnkNCitkZWZhdWx0LCBnU09BUCBhc3N1bWVzIHlvdSB3aWxsIHVzZSBDKysgd2l0aCBTVEwuICBUbyBidWlsZCB3aXRob3V0IFNUTCwgdXNlIG9wdGlvbg0KKzxpPi1zPC9pPjoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNEMEQwRDAiPjx0cj48dGQ+PHNwYW4gY2xhc3M9InJvbWFuIj4NCis8aT4kIHdzZGwyaCAtcyAtbyBYTWV0aG9kc1F1ZXJ5LmggaHR0cDovL3d3dy54bWV0aG9kcy5uZXQvd3NkbC9xdWVyeS53c2RsPC9pPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQorVG8gYnVpbGQgYSBwdXJlIEMgYXBwbGljYXRpb24sIHVzZSBvcHRpb24gPGk+LWM8L2k+Og0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKzxpPiQgd3NkbDJoIC1jIC1vIFhNZXRob2RzUXVlcnkuaCBodHRwOi8vd3d3LnhtZXRob2RzLm5ldC93c2RsL3F1ZXJ5LndzZGw8L2k+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvc3Bhbj4NCitXZSBoYXZlIG5vdCB5ZXQgZ2VuZXJhdGVkIHRoZSBzdHVicyBmb3IgdGhlIEMvQysrIEFQSS4gVG8gZG8gc28sIHJ1biB0aGUgPGk+c29hcGNwcDI8L2k+IGNvbXBpbGVyOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKzxpPiQgc29hcGNwcDIgLUMgLUlpbXBvcnQgWE1ldGhvZHNRdWVyeS5oPC9pPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQorV2hlcmUgb3B0aW9uIDxpPi1DPC9pPiBpbmRpY2F0ZXMgY2xpZW50LXNpZGUgb25seSBmaWxlcyAoPGk+c29hcGNwcDI8L2k+DQorZ2VuZXJhdGVzIGJvdGggY2xpZW50IGFuZCBzZXJ2ZXIgc3R1YnMgYW5kIHNrZWxldG9ucyBieSBkZWZhdWx0KS4gT3B0aW9uDQorPGk+LUk8L2k+IGlzIG5lZWRlZCB0byBpbXBvcnQgdGhlIDxpPnN0bHZlY3Rvci5oPC9pPiBmaWxlIHRvIHN1cHBvcnQgU1RMIHZlY3RvcnMuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1N1cHBvc2Ugd2UgZGV2ZWxvcCBhIEMrKyBjbGllbnQgZm9yIHRoZSBYTWV0aG9kcyBzZXJ2aWNlLiBJbiB0aGlzIGNhc2Ugd2UgdXNlDQordGhlIGdlbmVyYXRlZCA8aT5zb2FwWE1ldGhvZHNRdWVyeVNvYXBQcm94eTwvaT4gY2xhc3MgYW5kDQorPGk+WE1ldGhvZHNRdWVyeVNvYXAubnNtYXA8L2k+IFhNTCBuYW1lc3BhY2UgbWFwcGluZyB0YWJsZSB0byBhY2Nlc3MgdGhlIFdlYg0KK3NlcnZpY2UuIFRoZSA8aT5zb2FwWE1ldGhvZHNRdWVyeVNvYXBQcm94eTwvaT4gY2xhc3MgaXMgYSBwcm94eSB0byBpbnZva2UgdGhlDQorc2VydmljZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorI2luY2x1ZGUgInNvYXBYTWV0aG9kc1F1ZXJ5U29hcFByb3h5LmgiIDxiciAvPg0KKyNpbmNsdWRlICJYTWV0aG9kc1F1ZXJ5U29hcC5uc21hcCIgPGJyIC8+DQorbWFpbigpIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7WE1ldGhvZHNRdWVyeVNvYXAgc2VydmljZTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7bnMzX19nZXRBbGxTZXJ2aWNlTmFtZXNSZXNwb25zZSByZXNwb25zZTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Ly8gZ2V0IGFsbCBzZXJ2aWNlIG5hbWVzIGZyb20gdGhlIFhNZXRob2RzIGRhdGFiYXNlOiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoc2VydmljZS5uczNfX2dldEFsbFNlcnZpY2VOYW1lcyhyZXNwb25zZSkgPT0gU09BUF9PSykgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c3RkOjpjb3V0IDx0dD4mbHQ7Jmx0OzwvdHQ+ICJUaGUgZmlyc3QgWE1ldGhvZHMgc2VydmljZSBpczogIiA8dHQ+Jmx0OyZsdDs8L3R0PiAoKnJlc3BvbnNlLl9SZXN1bHQ8dHQ+LSZndDs8L3R0Pl9fcHRyWzBdPHR0Pi0mZ3Q7PC90dD5uYW1lKSA8dHQ+Jmx0OyZsdDs8L3R0PiBzdGQ6OmVuZGw7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmVsc2U8L2I+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9wcmludF9mYXVsdChzZXJ2aWNlLnNvYXAsIHN0ZGVycik7IDxiciAvPg0KK30NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoZSA8aT5yZXNwb25zZTwvaT4gZGF0YSBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiA8aT5YTWV0aG9kc1F1ZXJ5Lmg8L2k+LCBhbmQNCitjb250YWlucyBhIFNPQVAgZW5jb2RlZCBhcnJheSAoPGk+X19wdHJbbl08L2k+KSBvZiBwb2ludGVycyB0byBJRC1OYW1lIHBhaXJzDQorKDxpPl9fcHRyW25dPC9pPjx0dD4tJmd0OzwvdHQ+PGk+aWQ8L2k+IGFuZCA8aT5fX3B0cltuXTwvaT48dHQ+LSZndDs8L3R0PjxpPm5hbWU8L2k+KS4gKE5vdGU6IHlvdSBtYXkNCit3YW50IHRvIGFkZCBOVUxMIGNoZWNrcyBiZWZvcmUgZGVyZWZlcmVuY2luZyB0aGUgcG9pbnRlcnMuKQ0KK1RvIGNvbXBsZXRlIHRoZSBidWlsZCwgY29tcGlsZSBhbmQgbGluayB0aGUgZ2VuZXJhdGVkIDxpPnNvYXBDLmNwcDwvaT4sDQorPGk+c29hcENsaWVudC5jcHA8L2k+LCBhbmQgdGhlIHJ1bi10aW1lIGdTT0FQIGVuZ2luZSA8aT5zdGRzb2FwMi5jcHA8L2k+IHdpdGgNCit5b3VyIGNvZGUuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKyAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWMxLjMiPg0KKzEuMzwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+WW91ciBGaXJzdCBXZWIgU2VydmljZSBpbiBDR0k8L2ZvbnQ+PC9oMz4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorRGV2ZWxvcGluZyBhIHNlcnZpY2UgYXBwbGljYXRpb24gaXMgZWFzeSB0b28uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1N1cHBvc2Ugd2UgaW1wbGVtZW50IGEgQ0dJLWJhc2VkIHNlcnZpY2UgdGhhdCByZXR1cm5zIHRoZSB0aW1lIGluIEdNVC4gVGhlDQorQ29tbW9uIEdhdGV3YXkgSW50ZXJmYWNlIChDR0kpIGlzIGEgc2ltcGxlIG1lY2hhbmlzbSB0byBwdWJsaXNoIHNlcnZpY2VzIG9uDQoreW91ciBXZWIgc2l0ZSwgYnV0IGl0IGlzIGNlcnRhaW5seSBub3QgdGhlIG1vc3QgZWZmaWNpZW50IHdheS4gWW91IGNhbiBhbHNvDQorZGV2ZWxvcCBoaWdoLXBlcmZvcm1hbmNlIHN0YW5kLWFsb25lIGdTT0FQIHNlcnZpY2VzIHdpdGggYnVpbHQtaW4gSFRUUC9TIHN0YWNrcw0KK29yIHlvdSBjYW4gdXNlIEFwYWNoZSBtb2RfZ3NvYXAgYW5kIElJUyAoc2VlIHRoZSA8aT5leHRyYXM8L2k+IGRpcmVjdG9yeSkuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK091ciA8aT5jdXJyZW50VGltZTwvaT4gc2VydmljZSBvbmx5IGhhcyBhbiBvdXRwdXQgcGFyYW1ldGVyLCB3aGljaCBpcyB0aGUNCitjdXJyZW50IHRpbWU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vIEZpbGU6IGN1cnJlbnRUaW1lLmggPGJyIC8+DQorLy9nc29hcCBucyBzZXJ2aWNlIG5hbWU6IGN1cnJlbnRUaW1lIDxiciAvPg0KKy8vZ3NvYXAgbnMgc2VydmljZSBuYW1lc3BhY2U6IHVybjpjdXJyZW50VGltZSA8YnIgLz4NCisvL2dzb2FwIG5zIHNlcnZpY2UgbG9jYXRpb246IGh0dHA6Ly93d3cueW91cmRvbWFpbi5jb20vY3VycmVudFRpbWUuY2dpIDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDtuc19fY3VycmVudFRpbWUodGltZV90JmFtcDsgcmVzcG9uc2UpOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorTm90ZSB0aGF0IHdlIG11c3QgYXNzb2NpYXRlIGFuIFhNTCBuYW1lc3BhY2Ugd2l0aCBhIHNlcnZpY2UuIFRoZSBnU09BUCB0b29scw0KK3VzZSBhIHNwZWNpYWwgY29udmVudGlvbiBmb3IgaWRlbnRpZmllciBuYW1lcyB0aGF0IGFyZSBwYXJ0IG9mIGEgbmFtZXNwYWNlOiBhDQorbmFtZXNwYWNlIHByZWZpeCAoPGk+bnM8L2k+IGluIHRoaXMgY2FzZSkgZm9sbG93ZWQgYnkgYSBkb3VibGUgdW5kZXJzY29yZQ0KKzxpPl9fPC9pPi4gVGhpcyBjb252ZW50aW9uIGlzIHVzZWQgdG8gcmVzb2x2ZSBuYW1lc3BhY2VzIGFuZCB0byBhdm9pZCBuYW1lDQorY2xhc2hlcy4gVGhlIDxpPm5zPC9pPiBuYW1lc3BhY2UgcHJlZml4IGlzIGJvdW5kIHRvIHRoZSA8aT51cm46Y3VycmVudFRpbWU8L2k+DQorbmFtZXNwYWNlIG5hbWUgd2l0aCB0aGUgPGk+Ly9nc29hcDwvaT4gZGlyZWN0aXZlLiBUaGUgPGk+Ly9nc29hcDwvaT4gZGlyZWN0aXZlcw0KK2FyZSB1c2VkIHRvIHNldCB0aGUgcHJvcGVydGllcyBvZiB0aGUgc2VydmljZSwgaW4gdGhpcyBjYXNlIHRoZSBuYW1lLA0KK25hbWVzcGFjZSwgYW5kIGxvY2F0aW9uIGVuZHBvaW50Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBmb3IgQ0dJIGlzDQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vIEZpbGU6IGN1cnJlbnRUaW1lLmNwcCA8YnIgLz4NCittYWluKCkgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsvLyBjcmVhdGUgc29hcCBjb250ZXh0IGFuZCBzZXJ2ZSBvbmUgQ0dJLWJhc2VkIHJlcXVlc3Q6IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfc2VydmUoc29hcF9uZXcoKSk7IDxiciAvPg0KK30NCis8YnIgLz4NCis8Yj5pbnQ8L2I+Jm5ic3A7bnNfX2N1cnJlbnRUaW1lKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCB0aW1lX3QmYW1wOyByZXNwb25zZSkgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtyZXNwb25zZSA9IHRpbWUoMCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDtTT0FQX09LOyA8YnIgLz4NCit9DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitOb3RlIHRoYXQgd2UgcGFzcyB0aGUgc29hcCBzdHJ1Y3Qgd2l0aCB0aGUgZ1NPQVAgY29udGV4dCBpbmZvcm1hdGlvbiB0byB0aGUNCitzZXJ2aWNlIHJvdXRpbmUsIHdoaWNoIGNhbiBiZSBoYW5keSB0byBkZXRlcm1pbmUgcHJvcGVydGllcyBvZiB0aGUgY29ubmVjdGlvbg0KK2FuZCB0byBkeW5hbWljYWxseSBhbGxvY2F0ZSBkYXRhIHdpdGggPGk+c29hcF9tYWxsb2Moc29hcCwgbnVtX2J5dGVzKTwvaT4gdGhhdA0KK3dpbGwgYmUgYXV0b21hdGljYWxseSBkZWxldGVkIHdoZW4gdGhlIHNlcnZpY2UgaXMgZmluaXNoZWQuDQorV2UgcnVuIHRoZSA8aT5zb2FwY3BwMjwvaT4gY29tcGlsZXIgb24gdGhlIGhlYWRlciBmaWxlIHRvIGdlbmVyYXRlIHRoZQ0KK3NlcnZlci1zaWRlIGNvZGU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjRDBEMEQwIj48dHI+PHRkPjxzcGFuIGNsYXNzPSJyb21hbiI+DQorPGk+JCBzb2FwY3BwMiAtUyBjdXJyZW50VGltZS5oPC9pPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQorYW5kIHRoZW4gY29tcGlsZSB0aGUgQ0dJIGJpbmFyeToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNEMEQwRDAiPjx0cj48dGQ+PHNwYW4gY2xhc3M9InJvbWFuIj4NCis8aT4kIGMrKyAtbyBjdXJyZW50VGltZS5jZ2kgY3VycmVudFRpbWUuY3BwIHNvYXBDLmNwcCBzb2FwU2VydmVyLmNwcCBzdGRzb2FwMi5jcHA8L2k+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvc3Bhbj4NCitUbyBhY3RpdmF0ZSB0aGUgc2VydmljZSwgY29weSB0aGUgPGk+Y3VycmVudFRpbWUuY2dpPC9pPiBiaW5hcnkgdG8geW91cg0KKzxpPmJpbi1jZ2k8L2k+IGRpcmVjdG9yeSB3aXRoIHRoZSBwcm9wZXIgZmlsZSBwZXJtaXNzaW9ucy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIDxpPnNvYXBjcHAyPC9pPiBjb21waWxlciBnZW5lcmF0ZWQgdGhlIFdTREwgZGVmaW5pdGlvbnMNCis8aT5jdXJyZW50VGltZS53c2RsPC9pPi4gWW91IGNhbiB1c2UgdGhlIFdTREwgdG8gYWR2ZXJ0aXplIHlvdXIgc2VydmljZS4NCitZb3UgZG9uJ3QgbmVlZCB0byB1c2UgdGhpcyBXU0RMIHRvIGRldmVsb3AgYSBnU09BUCBjbGllbnQuIFlvdSBjYW4gdXNlIHRoZQ0KKzxpPmN1cnJlbnRUaW1lLmg8L2k+IGZpbGUgd2l0aCB0aGUgPGk+c29hcGNwcDIgLUM8L2k+IGNvbW1hbmQgdG8gZ2VuZXJhdGUNCitjbGllbnQtc2lkZSBjb2RlLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitXaGVuIHlvdSBjb250cmlidXRlIGEgV2ViIHNlcnZpY2Ugd2l0aCBpbnRlcmVzdGluZyBjYXBhYmlsaXRpZXMsIHlvdSBjYW4NCitjb250YWN0IHd3dy5YTWV0aG9kcy5jb20gdG8gcHVibGlzaCB5b3VyIHNlcnZpY2UgYW5kIHNlZSBpdCB3aXRoIHRoZSBjbGllbnQNCithcHBsaWNhdGlvbiBmb3IgdGhlIFhNZXRob2RzIHNlcnZpY2UgbGlzdGluZyB5b3UgZGV2ZWxvcGVkIGluIHRoZSBwcmV2aW91cw0KK3NlY3Rpb24uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKyAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWMxLjQiPg0KKzEuNDwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+RmVhdHVyZXM8L2ZvbnQ+PC9oMz4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIGhpZ2hsaWdodHMgb2YgZ1NPQVAgYXJlOg0KKw0KKzx1bD4NCis8bGk+VW5pcXVlIGludGVyb3BlcmFiaWxpdHkgZmVhdHVyZXM6IHRoZSBnU09BUCBjb21waWxlciBnZW5lcmF0ZXMgU09BUCBtYXJzaGFsbGluZyByb3V0aW5lcyB0aGF0IChkZSlzZXJpYWxpemUgbmF0aXZlIGFuZA0KK3VzZXItZGVmaW5lZCBDIGFuZCBDKysgZGF0YSBzdHJ1Y3R1cmVzLg0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8L2xpPg0KKw0KKzxsaT4NCitnU09BUCBzdXBwb3J0cyBXU0RMIDEuMSwgU09BUCAxLjEsIFNPQVAgMS4yLCBTT0FQIFJQQyBlbmNvZGluZyBzdHlsZSwgYW5kIGRvY3VtZW50L2xpdGVyYWwgc3R5bGUuDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorDQorPGxpPg0KK2dTT0FQIGlzIG9uZSBvZiB0aGUgZmV3IFNPQVAgdG9vbGtpdHMgdGhhdCBzdXBwb3J0IHRoZSBmdWxsIHJhbmdlIG9mIFNPQVAgMS4xIFJQQyBlbmNvZGluZyBmZWF0dXJlcw0KK2luY2x1ZGluZyBzcGFyc2UgbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIGFuZCBwb2x5bW9ycGhpYyB0eXBlcy4gRm9yIGV4YW1wbGUsIGEgcmVtb3RlIG1ldGhvZCB3aXRoIGEgYmFzZSBjbGFzcyBwYXJhbWV0ZXIgbWF5IGFjY2VwdA0KK2Rlcml2ZWQgY2xhc3MgaW5zdGFuY2VzIGZyb20gYSBjbGllbnQuIERlcml2ZWQgY2xhc3MgaW5zdGFuY2VzIGtlZXAgdGhlaXIgaWRlbnRpdHkgdGhyb3VnaCBkeW5hbWljIGJpbmRpbmcuDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorDQorPGxpPg0KK2dTT0FQIHN1cHBvcnRzIE1JTUUgKFN3QSksIERJTUUsIGFuZCBNVE9NIGF0dGFjaG1lbnRzLg0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8L2xpPg0KKw0KKzxsaT4NCitnU09BUCBpcyB0aGUgb25seSB0b29sa2l0IHRoYXQgc3VwcG9ydHMgPGVtPnN0cmVhbWluZzwvZW0+IERJTUUgYXR0YWNobWVudCB0cmFuc2ZlcnMsIHdoaWNoIGFsbG93cyB5b3UgdG8gZXhjaGFuZ2UgYmluYXJ5IGRhdGEgb2YgcHJhY3RpY2FsbHkgdW5saW1pdGVkIHNpemUgaW4gdGhlIGZhc3Rlc3QgcG9zc2libGUgd2F5IChzdHJlYW1pbmcpIHdoaWxlIGVuc3VyaW5nIHRoZSB1c2VmdWxuZXNzIG9mIFhNTCBpbnRlcm9wZXJhYmlsaXR5Lg0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8L2xpPg0KKw0KKzxsaT4NCitnU09BUCBzdXBwb3J0cyBTT0FQLW92ZXItVURQLg0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8L2xpPg0KKw0KKzxsaT4NCitnU09BUCBzdXBwb3J0cyBJUHY0IGFuZCBJUHY2Lg0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8L2xpPg0KKw0KKzxsaT4NCitnU09BUCBzdXBwb3J0cyBabGliIGRlZmxhdGUgYW5kIGd6aXAgY29tcHJlc3Npb24gKGZvciBIVFRQLCBUQ1AvSVAsIGFuZCBYTUwgZmlsZSBzdG9yYWdlKS4NCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorPC9saT4NCisNCis8bGk+DQorZ1NPQVAgc3VwcG9ydHMgU1NMIChIVFRQUykuDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorDQorPGxpPg0KK2dTT0FQIHN1cHBvcnRzIEhUVFAvMS4wLCBIVFRQLzEuMSBrZWVwLWFsaXZlLCBjaHVua2luZywgYmFzaWMgYXV0aGVudGljYXRpb24sIGFuZCBkaWdlc3QgYXV0aGVudGljYXRpb24gdXNpbmcgYSBwbHVnaW4uDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorDQorPGxpPg0KK2dTT0FQIHN1cHBvcnRzIFNPQVAgb25lLXdheSBtZXNzYWdpbmcuDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorDQorPGxpPg0KK1RoZSBzY2hlbWEtc3BlY2lmaWMgWE1MIHB1bGwgcGFyc2VyIGlzIGZhc3QgYW5kIGVmZmljaWVudCBhbmQgZG9lcyBub3QgcmVxdWlyZSBpbnRlcm1lZGlhdGUgZGF0YSBzdG9yYWdlIGZvcg0KK2RlbWFyc2hhbGxpbmcgdG8gc2F2ZSBzcGFjZSBhbmQgdGltZS4NCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorPC9saT4NCisNCis8bGk+DQorVGhlIGdTT0FQIDxpPnNvYXBjcHAyPC9pPiBjb21waWxlciBpbmNsdWRlcyBhIFdTREwgZ2VuZXJhdG9yIGZvciBjb252ZW5pZW50IFdlYiBTZXJ2aWNlIHB1Ymxpc2hpbmcuDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorDQorPGxpPg0KK2dTT0FQIGluY2x1ZGVzIGEgV1NETCBwYXJzZXIgPGk+d3NsZDJoPC9pPiAoV1NETCBjb252ZXJ0ZXIgdG8gZ1NPQVAgaGVhZGVyIGZpbGVzKSBmb3IgYXV0b21hdGVkIGNsaWVudCBhbmQgc2VydmVyIGRldmVsb3BtZW50Lg0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8L2xpPg0KKw0KKzxsaT4NCitHZW5lcmF0ZXMgc291cmNlIGNvZGUgZm9yIHN0YW5kLWFsb25lIFdlYiBTZXJ2aWNlcyBhbmQgY2xpZW50IGFwcGxpY2F0aW9ucy4NCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorPC9saT4NCisNCis8bGk+DQorSWRlYWwgZm9yIHNtYWxsIGRldmljZXMgc3VjaCBhcyBQYWxtIE9TLCBTeW1iaWFuLCBQb2NrZXQgUEMsIGJlY2F1c2UgdGhlIG1lbW9yeSBmb290cHJpbnQgaXMgc21hbGwuDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorDQorPGxpPg0KK0lkZWFsIGZvciBidWlsZGluZyB3ZWIgc2VydmljZXMgdGhhdCBhcmUgY29tcHV0ZS1pbnRlbnNpdmUgYW5kIGFyZSB0aGVyZWZvcmUgYmVzdCB3cml0dGVuIGluIEMgYW5kIEMrKy4NCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorPC9saT4NCisNCis8bGk+DQorUGxhdGZvcm0gaW5kZXBlbmRlbnQ6IFdpbmRvd3MsIFVuaXgsIExpbnV4LCBNYWMgT1MgWCwgUG9ja2V0IFBDLCBQYWxtIE9TLCBTeW1iaWFuLCBldGMuDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorDQorPGxpPg0KK1N1cHBvcnRzIHNlcmlhbGl6aW5nIG9mIGFwcGxpY2F0aW9uJ3MgbmF0aXZlIEMgYW5kIEMrKyBkYXRhIHN0cnVjdHVyZXMsIHdoaWNoIGFsbG93cyB5b3UgdG8gc2F2ZSBhbmQgbG9hZCBvZiBYTUwgc2VyaWFsaXplZCBkYXRhIHN0cnVjdHVyZXMgdG8gYW5kIGZyb20gZmlsZXMuDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorDQorPGxpPg0KK1NlbGVjdGl2ZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcmluZyBpcyB1c2VkIHRvIGluY3JlYXNlIGVmZmljaWVuY3ksIGJ1dCBmdWxsIG1lc3NhZ2UgYnVmZmVyaW5nIHRvIGRldGVybWluZSBIVFRQIG1lc3NhZ2UgbGVuZ3RoDQoraXMgbm90IHVzZWQuIEluc3RlYWQsIGEgdGhyZWUtcGhhc2Ugc2VyaWFsaXphdGlvbiBtZXRob2QgaXMgdXNlZCB0byBkZXRlcm1pbmUgbWVzc2FnZSBsZW5ndGguIEFzIGEgcmVzdWx0LCBsYXJnZSBkYXRhIHNldHMNCitzdWNoIGFzIGJhc2U2NC1lbmNvZGVkIGltYWdlcyBjYW4gYmUgdHJhbnNtaXR0ZWQgd2l0aCBvciB3aXRob3V0IERJTUUgYXR0YWNobWVudHMgYnkgc21hbGwtbWVtb3J5IGRldmljZXMgc3VjaCBhcyBQREFzLg0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8L2xpPg0KKw0KKzxsaT4NCitTdXBwb3J0cyBDKysgc2luZ2xlIGNsYXNzIGluaGVyaXRhbmNlLCBkeW5hbWljIGJpbmRpbmcsIG92ZXJsb2FkaW5nLCBhcmJpdHJhcnkgcG9pbnRlciBzdHJ1Y3R1cmVzIHN1Y2ggYXMgbGlzdHMsIHRyZWVzLCBncmFwaHMsDQorY3ljbGljIGdyYXBocywgZml4ZWQtc2l6ZSBhcnJheXMsIChtdWx0aS1kaW1lbnNpb25hbCkgZHluYW1pYyBhcnJheXMsIGVudW1lcmF0aW9ucywgYnVpbHQtaW4gWFNEIFNjaGVtYSB0eXBlcyBpbmNsdWRpbmcNCitiYXNlNjRCaW5hcnkgZW5jb2RpbmcsIGFuZCBoZXhCaW5hcnkgZW5jb2RpbmcuDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorDQorPGxpPg0KK05vIG5lZWQgdG8gcmV3cml0ZSBleGlzdGluZyBDL0MrKyBhcHBsaWNhdGlvbnMgZm9yIFdlYiBzZXJ2aWNlIGRlcGxveW1lbnQuIEhvd2V2ZXIsIHBhcnRzIG9mIGFuIGFwcGxpY2F0aW9uIHRoYXQgdXNlIHVuaW9ucywNCitwb2ludGVycyB0byBzZXF1ZW5jZXMgb2YgZWxlbWVudHMgaW4gbWVtb3J5LCBhbmQgPGk+PGI+dm9pZDwvYj4qPC9pPiBuZWVkIHRvIGJlIG1vZGlmaWVkLCBidXQgPGI+b25seTwvYj4gaWYgdGhlIGRhdGEgc3RydWN0dXJlcyB0aGF0DQorYWRvcHQgdGhlbSBhcmUgcmVxdWlyZWQgdG8gYmUgc2VyaWFsaXplZCBvciBkZXNlcmlhbGl6ZWQgYXMgcGFydCBvZiBhIHJlbW90ZSBtZXRob2QgaW52b2NhdGlvbi4NCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorPC9saT4NCisNCis8bGk+DQorVGhyZWUtcGhhc2UgbWFyc2hhbGxpbmc6IDEpIGFuYWx5c2lzIG9mIHBvaW50ZXJzLCBzaW5nbGUtcmVmZXJlbmNlLCBtdWx0aS1yZWZlcmVuY2UsIGFuZCBjeWNsaWMgZGF0YSBzdHJ1Y3R1cmVzLCAyKSBIVFRQDQorbWVzc2FnZS1sZW5ndGggZGV0ZXJtaW5hdGlvbiwgYW5kIDMpIHNlcmlhbGl6YXRpb24gYXMgcGVyIFNPQVAgMS4xIGVuY29kaW5nIHN0eWxlIG9yIHVzZXItZGVmaW5lZCBlbmNvZGluZyBzdHlsZXMuDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorDQorPGxpPg0KK1R3by1waGFzZSBkZW1hcnNoYWxsaW5nOiAxKSBTT0FQIHBhcnNpbmcgYW5kIGRlY29kaW5nLCB3aGljaCBpbnZvbHZlcyB0aGUgcmVjb25zdHJ1Y3Rpb24gb2YgbXVsdGktcmVmZXJlbmNlIGFuZCBjeWNsaWMgZGF0YQ0KK3N0cnVjdHVyZXMgZnJvbSB0aGUgcGF5bG9hZCwgYW5kIDIpIHJlc29sdXRpb24gb2YgImZvcndhcmQiIHBvaW50ZXJzIChpLmUuIHJlc29sdXRpb24gb2YgdGhlIGZvcndhcmQgPHR0PmhyZWY8L3R0PiBhdHRyaWJ1dGVzIGluIFNPQVApLg0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8L2xpPg0KKw0KKzxsaT4NCitGdWxsIGFuZCBjdXN0b21pemFibGUgU09BUCBGYXVsdCBwcm9jZXNzaW5nIChjbGllbnQgcmVjZWl2ZSBhbmQgc2VydmljZSBzZW5kKS4NCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorPC9saT4NCisNCis8bGk+DQorQ3VzdG9taXphYmxlIFNPQVAgSGVhZGVyIHByb2Nlc3NpbmcgKHNlbmQgYW5kIHJlY2VpdmUpLCB3aGljaCBmb3IgZXhhbXBsZSBlbmFibGVzIGVhc3kgdHJhbnNhY3Rpb24gcHJvY2Vzc2luZyBmb3IgdGhlIHNlcnZpY2UgdG8NCitrZWVwIHN0YXRlIGluZm9ybWF0aW9uLg0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8L2xpPg0KKzwvdWw+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKyA8aDI+PGEgbmFtZT0idHRoX3NFYzIiPg0KKzI8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPk5vdGF0aW9uYWwgQ29udmVudGlvbnM8L2ZvbnQ+PC9oMj4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIHR5cG9ncmFwaGljYWwgY29udmVudGlvbnMgdXNlZCBieSB0aGlzIGRvY3VtZW50IGFyZToNCisNCis8ZGwgY29tcGFjdD0iY29tcGFjdCI+DQorIDxkdD48Yj48c3BhbiBjbGFzcz0icm9tYW4iPjxpPlNhbnMgc2VyaWYgb3IgaXRhbGljcyBmb250PC9pPjwvYj48L2R0Pg0KKwk8ZGQ+IGRlbm90ZXMgQyBhbmQgQysrIHNvdXJjZSBjb2RlLCBmaWxlIG5hbWVzLCBhbmQgc2hlbGwvYmF0Y2ggY29tbWFuZHMuPC9zcGFuPjwvZGQ+DQorIDxkdD48Yj48aT48Yj5Cb2xkIGZvbnQ8L2I+PC9pPjwvYj48L2R0Pg0KKwk8ZGQ+IGRlbm90ZXMgQyBhbmQgQysrIGtleXdvcmRzLjwvZGQ+DQorIDxkdD48Yj48dHQ+Q291cmllciBmb250PC90dD48L2I+PC9kdD4NCisJPGRkPiBkZW5vdGVzIEhUVFAgaGVhZGVyIGNvbnRlbnQsIEhUTUwsIFhNTCwgWE1MIFNjaGVtYSBjb250ZW50IGFuZCBXU0RMIGNvbnRlbnQuPC9kZD4NCisgPGR0PjxiPjxzcGFuIGNsYXNzPSJyb21hbiI+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+T3B0aW9uYWw8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD48L2I+PC9kdD4NCisJPGRkPiBkZW5vdGVzIGFuIG9wdGlvbmFsIGNvbnN0cnVjdC48L3NwYW4+PC9kZD4NCis8L2RsPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUga2V5d29yZHMgIk1VU1QiLCAiTVVTVCBOT1QiLCAiUkVRVUlSRUQiLCAiU0hBTEwiLCAiU0hBTEwgTk9UIiwgIlNIT1VMRCIsICJTSE9VTEQgTk9UIiwgIlJFQ09NTUVOREVEIiwgIk1BWSIsIGFuZA0KKyJPUFRJT05BTCIgaW4gdGhpcyBkb2N1bWVudCBhcmUgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgZGVzY3JpYmVkIGluIFJGQy0yMTE5Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisgPGgyPjxhIG5hbWU9InR0aF9zRWMzIj4NCiszPC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5EaWZmZXJlbmNlcyBCZXR3ZWVuIGdTT0FQIFZlcnNpb25zIDIuNCAoYW5kIEVhcmxpZXIpIGFuZCAyLjU8L2ZvbnQ+PC9oMj4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVG8gY29tcGx5IHdpdGggV1MtSSBCYXNpYyBQcm9maWxlIDEuMGEsIGdTT0FQIDIuNSBhbmQgaGlnaGVyIGFkb3B0cyBTT0FQIGRvY3VtZW50L2xpdGVyYWwgYnkgZGVmYXVsdC4NCitUaGVyZSBpcyBubyBuZWVkIGZvciBjb25jZXJuLCBiZWNhdXNlIHRoZSBXU0RMIHBhcnNlciA8aT53c2RsMmg8L2k+IGF1dG9tYXRpY2FsbHkgdGFrZXMgY2FyZSBvZiB0aGUgZGlmZmVyZW5jZXMgd2hlbiB5b3UgcHJvdmlkZSBhIFdTREwgZG9jdW1lbnQsIGJlY2F1c2UgU09BUCBSUEMgZW5jb2RpbmcsIGxpdGVyYWwsIGFuZCBkb2N1bWVudCBzdHlsZSBhcmUgc3VwcG9ydGVkLg0KK0EgbmV3IHNvYXBjcHAyIGNvbXBpbGVyIG9wdGlvbiB3YXMgYWRkZWQgPGk+LWU8L2k+IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggZ1NPQVAgMi40IGFuZCBlYXJsaWVyIHRvIGFkb3B0IFNPQVAgUlBDIGVuY29kaW5nIGJ5IGRlZmF1bHQgaW4gY2FzZSB5b3Ugd2FudCB0byBkZXZlbG9wIGEgc2VydmljZSB0aGF0IHVzZXMgU09BUCBlbmNvZGluZy4gWW91IGNhbiBhbHNvIHVzZSB0aGUgZ1NPQVAgY29tcGlsZXIgZGlyZWN0aXZlcyB0byBzcGVjaWZ5IFNPQVAgZW5jb2RpbmcgZm9yIGluZGl2aWR1YWwgb3BlcmFyYXRpb25zLCB3aGVuIGRlc2lyZWQuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKyA8aDI+PGEgbmFtZT0idHRoX3NFYzQiPg0KKzQ8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPkRpZmZlcmVuY2VzIEJldHdlZW4gZ1NPQVAgVmVyc2lvbnMgMi4xIChhbmQgRWFybGllcikgYW5kIDIuMjwvZm9udD48L2gyPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitZb3Ugc2hvdWxkIHJlYWQgdGhpcyBzZWN0aW9uIG9ubHkgaWYgeW91IGFyZSB1cGdyYWRpbmcgZnJvbSBnU09BUCAyLjEgdG8gMi4yIGFuZCBsYXRlci4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorUnVuLXRpbWUgb3B0aW9ucyBhbmQgZmxhZ3MgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gZW5hYmxlIHNlcGFyYXRlIHJlY3Yvc2VuZA0KK3NldHRpbmdzIGZvciB0cmFuc3BvcnQsIGNvbnRlbnQgZW5jb2RpbmdzLCBhbmQgbWFwcGluZ3MuICBUaGUgZmxhZ3MgYXJlIGRpdmlkZWQNCitpbnRvIGZvdXIgY2xhc3NlczogdHJhbnNwb3J0IChJTyksIGNvbnRlbnQgZW5jb2RpbmcgKEVOQyksIFhNTCBtYXJzaGFsbGluZw0KKyhYTUwpLCBhbmQgQy9DKysgZGF0YSBtYXBwaW5nIChDKS4gIFRoZSBvbGQtc3R5bGUgZmxhZ3MgPGk+c29hcF9kaXNhYmxlX1g8L2k+DQorYW5kIDxpPnNvYXBfZW5hYmxlX1g8L2k+LCB3aGVyZSA8aT5YPC9pPiBpcyBhIHBhcnRpY3VsYXIgZmVhdHVyZSwgYXJlDQorZGVwcmVjYXRlZC4gIFNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzpmbGFncyI+OC4xMjwvYT4gZm9yIG1vcmUgZGV0YWlscy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorIDxoMj48YSBuYW1lPSJ0dGhfc0VjNSI+DQorNTwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+RGlmZmVyZW5jZXMgQmV0d2VlbiBnU09BUCBWZXJzaW9ucyAxLlggYW5kIDIuWDwvZm9udD48L2gyPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitZb3Ugc2hvdWxkIHJlYWQgdGhpcyBzZWN0aW9uIG9ubHkgaWYgeW91IGFyZSB1cGdyYWRpbmcgZnJvbSBnU09BUCAxLlggdG8gMi5YLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitnU09BUCB2ZXJzaW9ucyAyLjAgYW5kIGxhdGVyIGhhdmUgYmVlbiByZXdyaXR0ZW4gYmFzZWQgb24gdmVyc2lvbnMgMS5YLg0KK2dTT0FQIDIuMCBhbmQgbGF0ZXIgaXMgdGhyZWFkLXNhZmUsIHdoaWxlIDEuWCBpcyBub3QuDQorQWxsIGZpbGVzIGluIHRoZSBnU09BUCAyLlggZGlzdHJpYnV0aW9uIGFyZSByZW5hbWVkIHRvIGF2b2lkIGNvbmZ1c2lvbiB3aXRoIGdTT0FQIHZlcnNpb24gMS5YIGZpbGVzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKw0KKzx0YWJsZT4NCis8dHI+PHRkPjxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5nU09BUCAxLlg8L2I+PC9mb250Pgk8L3RkPjx0ZD48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+Z1NPQVAgMi5YPC9iPjwvZm9udD4gPC90ZD48L3RyPg0KKzx0cj48dGQ+c29hcGNwcAkJPC90ZD48dGQ+c29hcGNwcDIgPC90ZD48L3RyPg0KKzx0cj48dGQ+c29hcGNwcC5leGUJPC90ZD48dGQ+c29hcGNwcDIuZXhlIDwvdGQ+PC90cj4NCis8dHI+PHRkPnN0ZHNvYXAuaAk8L3RkPjx0ZD5zdGRzb2FwMi5oIDwvdGQ+PC90cj4NCis8dHI+PHRkPnN0ZHNvYXAuYwk8L3RkPjx0ZD5zdGRzb2FwMi5jIDwvdGQ+PC90cj4NCis8dHI+PHRkPnN0ZHNvYXAuY3BwCTwvdGQ+PHRkPnN0ZHNvYXAyLmNwcCA8L3RkPjwvdHI+PC90YWJsZT4NCisNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9zcGFuPg0KK0NoYW5naW5nIHRoZSB2ZXJzaW9uIDEuWCBhcHBsaWNhdGlvbiBjb2RlcyB0byBhY2NvbW1vZGF0ZSBnU09BUCAyLlggZG9lcyBub3QgcmVxdWlyZSBhIHNpZ25pZmljYW50IGFtb3VudCBvZiByZWNvZGluZy4NCitUaGUgY2hhbmdlIHRvIGdTT0FQIDIuWCBhZmZlY3RzIGFsbCBmdW5jdGlvbnMgZGVmaW5lZCBpbiA8aT5zdGRzb2FwMi5jW3BwXTwvaT4gKHRoZSBnU09BUCBydW50aW1lIGVudmlyb25tZW50IEFQSSkgYW5kIHRoZSBmdW5jdGlvbnMgaW4gdGhlDQorc291cmNlcyBnZW5lcmF0ZWQgYnkgdGhlIGdTT0FQIGNvbXBpbGVyICh0aGUgZ1NPQVAgUlBDK21hcnNoYWxsaW5nIEFQSSkuDQorVGhlcmVmb3JlLCBjbGllbnRzIGFuZCBzZXJ2aWNlcyBkZXZlbG9wZWQgd2l0aCBnU09BUCAxLlggbmVlZCB0byBiZSBtb2RpZmllZCB0byBhY2NvbW1vZGF0ZSBhIGNoYW5nZSBpbiB0aGUgY2FsbGluZyBjb252ZW50aW9uIHVzZWQgaW4gMi5YOg0KK0luIDIuWCwgPGI+YWxsPC9iPiBnU09BUCBmdW5jdGlvbnMgKGluY2x1ZGluZyB0aGUgcmVtb3RlIG1ldGhvZCBwcm94eSByb3V0aW5lcykgdGFrZSBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlciB3aGljaCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ1NPQVAgcnVudGltZQ0KK2Vudmlyb25tZW50IHRoYXQgaW5jbHVkZXMgZmlsZSBkZXNjcmlwdG9ycywgdGFibGVzLCBidWZmZXJzLCBhbmQgZmxhZ3MuDQorVGhpcyBhZGRpdGlvbmFsIHBhcmFtZXRlciBpcyA8Yj5hbHdheXM8L2I+IHRoZSBmaXJzdCBwYXJhbWV0ZXIgb2YgYW55IGdTT0FQIGZ1bmN0aW9uLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgZ1NPQVAgcnVudGltZSBlbnZpcm9ubWVudCBpcyBzdG9yZWQgaW4gYSA8aT48Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcDwvaT4gdHlwZS4gQSA8aT48Yj5zdHJ1Y3Q8L2I+PC9pPiB3YXMgY2hvc2VuIHRvIHN1cHBvcnQgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQgaW4NCitDIHdpdGhvdXQgdGhlIG5lZWQgZm9yIGEgc2VwYXJhdGUgZ1NPQVAgaW1wbGVtZW50YXRpb24uICBBbiBvYmplY3Qtb3JpZW50ZWQgYXBwcm9hY2ggd2l0aCBhIGNsYXNzIGZvciB0aGUgZ1NPQVAgcnVudGltZSBlbnZpcm9ubWVudCB3b3VsZCBoYXZlIHByb2hpYml0ZWQgdGhlIGltcGxlbWVudGF0aW9uIG9mIHB1cmUgQyBhcHBsaWNhdGlvbnMuDQorQmVmb3JlIGEgY2xpZW50IGNhbiBpbnZva2UgcmVtb3RlIG1ldGhvZHMgb3IgYmVmb3JlIGEgc2VydmljZSBjYW4gYWNjZXB0IHJlcXVlc3RzLCBhIHJ1bnRpbWUgZW52aXJvbm1lbnQgbmVlZCB0byBiZSBhbGxvY2F0ZWQgYW5kDQoraW5pdGlhbGl6ZWQuDQorVGhyZWUgbmV3IGZ1bmN0aW9ucyBhcmUgYWRkZWQgdG8gZ1NPQVAgMi5YOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKw0KKzx0YWJsZT4NCis8dHI+PHRkPjxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5GdW5jdGlvbjwvYj48L2ZvbnQ+IDwvdGQ+PHRkIHdpZHRoPSIzNTEiPjxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5EZXNjcmlwdGlvbjwvYj48L2ZvbnQ+IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPnNvYXBfaW5pdCg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCk8L2k+IDwvdGQ+PHRkIHdpZHRoPSIzNTEiPkluaXRpYWxpemVzIGEgcnVudGltZSBlbnZpcm9ubWVudCAocmVxdWlyZWQgb25seSBvbmNlKSA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT48Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcF9uZXcoKTwvaT4gPC90ZD48dGQgd2lkdGg9IjM1MSI+QWxsb2NhdGVzLCBpbml0aWFsaXplcywgYW5kIHJldHVybnMgYSBwb2ludGVyIHRvIGEgcnVudGltZSBlbnZpcm9ubWVudCA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT48Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcF9jb3B5KDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwKTwvaT4gPC90ZD48dGQgd2lkdGg9IjM1MSI+QWxsb2NhdGVzIGEgbmV3IHJ1bnRpbWUgZW52aXJvbm1lbnQgYW5kIGNvcGllcyBjb250ZW50cyBvZg0KK3RoZSBhcmd1bWVudCBlbnZpcm9ubWVudCBzdWNoIHRoYXQgdGhlIG5ldyBlbnZpcm9ubWVudCBkb2VzIG5vdCBzaGFyZSBhbnkgZGF0YQ0KK3dpdGggdGhlIG9yaWdpbmFsIGVudmlyb25tZW50IDwvdGQ+PC90cj48L3RhYmxlPg0KKw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQorQW4gZW52aXJvbm1lbnQgY2FuIGJlIHJldXNlZCBhcyBtYW55IHRpbWVzIGFzIG5lY2Vzc2FyeSBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSByZWluaXRpYWxpemVkIGluIGRvaW5nIHNvLg0KK0EgbmV3IGVudmlyb25tZW50IGlzIG9ubHkgcmVxdWlyZWQgZm9yIGVhY2ggbmV3IHRocmVhZCB0byBndWFyYW50ZWUgZXhjbHVzaXZlIGFjY2Vzcw0KK3RvIGEgbmV3IHJ1bnRpbWUgZW52aXJvbm1lbnQgYnkgZWFjaCB0aHJlYWQuDQorRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZSBzdGFjay1hbGxvY2F0ZXMgdGhlIHJ1bnRpbWUgZW52aXJvbm1lbnQgd2hpY2ggaXMgdXNlZCBmb3IgbXVsdGlwbGUgcmVtb3RlIG1ldGhvZCBjYWxsczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+aW50PC9iPiZuYnNwO21haW4oKSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwIHNvYXA7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOy4uLiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2luaXQoJmFtcDtzb2FwKTsgLy8gaW5pdGlhbGl6ZSBydW50aW1lIGVudmlyb25tZW50IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOy4uLiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2NhbGxfbnNfX21ldGhvZDEoJmFtcDtzb2FwLCAuLi4pOyAvLyBtYWtlIGEgcmVtb3RlIGNhbGwgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Li4uIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfY2FsbF9uc19fbWV0aG9kMigmYW1wO3NvYXAsIC4uLik7IC8vIG1ha2UgYW5vdGhlciByZW1vdGUgY2FsbCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsuLi4gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9kZXN0cm95KCZhbXA7c29hcCk7IC8vIHJlbW92ZSBkZXNlcmlhbGl6ZWQgY2xhc3MgaW5zdGFuY2VzIChDKysgb25seSkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9lbmQoJmFtcDtzb2FwKTsgLy8gY2xlYW4gdXAgYW5kIHJlbW92ZSBkZXNlcmlhbGl6ZWQgZGF0YSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2RvbmUoJmFtcDtzb2FwKTsgLy8gZGV0YWNoIGVudmlyb25tZW50IChsYXN0IHVzZSBhbmQgbm8gbG9uZ2VyIGluIHNjb3BlKTxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOy4uLiA8YnIgLz4NCit9DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgcnVudGltZSBlbnZpcm9ubWVudCBjYW4gYWxzbyBiZSBoZWFwIGFsbG9jYXRlZDoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+aW50PC9iPiZuYnNwO21haW4oKSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsuLi4gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcCA9IHNvYXBfbmV3KCk7IC8vIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHJ1bnRpbWUgZW52aXJvbm1lbnQgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KCFzb2FwKSAvLyBjb3VsZG4ndCBhbGxvY2F0ZTogc3RvcCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsuLi4gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9jYWxsX25zX19tZXRob2QxKHNvYXAsIC4uLik7IC8vIG1ha2UgYSByZW1vdGUgY2FsbCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsuLi4gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9jYWxsX25zX19tZXRob2QyKHNvYXAsIC4uLik7IC8vIG1ha2UgYW5vdGhlciByZW1vdGUgY2FsbCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsuLi4gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9kZXN0cm95KHNvYXApOyAvLyByZW1vdmUgZGVzZXJpYWxpemVkIGNsYXNzIGluc3RhbmNlcyAoQysrIG9ubHkpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfZW5kKHNvYXApOyAvLyBjbGVhbiB1cCBhbmQgcmVtb3ZlIGRlc2VyaWFsaXplZCBkYXRhIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfZG9uZShzb2FwKTsgLy8gZGV0YWNoIHJ1bnRpbWUgZW52aXJvbm1lbnQgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Li4uIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO2ZyZWUoc29hcCk7IC8vIGRlYWxsb2NhdGUgcnVudGltZSBlbnZpcm9ubWVudCA8YnIgLz4NCit9DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitBIHNlcnZpY2UgbmVlZCB0byBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhbiBlbnZpcm9ubWVudCBiZWZvcmUgY2FsbGluZyA8aT5zb2FwX3NlcnZlPC9pPjoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+aW50PC9iPiZuYnNwO21haW4oKSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwIHNvYXA7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfaW5pdCgmYW1wO3NvYXApOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX3NlcnZlKCZhbXA7c29hcCk7IDxiciAvPg0KK30NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK09yIGFsdGVybmF0aXZlbHk6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPmludDwvYj4mbmJzcDttYWluKCkgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX3NlcnZlKHNvYXBfbmV3KCkpOyA8YnIgLz4NCit9DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgPGk+c29hcF9zZXJ2ZTwvaT4gZGlzcGF0Y2hlciBoYW5kbGVzIG9uZSByZXF1ZXN0IG9yIG11bHRpcGxlIHJlcXVlc3RzIHdoZW4gSFRUUCBrZWVwLWFsaXZlIGlzIGVuYWJsZWQgKHdpdGggdGhlIDxpPlNPQVBfSU9fS0VFUEFMSVZFPC9pPiBmbGFnIHNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzprZWVwYWxpdmUiPjE4LjExPC9hPikuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0Egc2VydmljZSBjYW4gdXNlIG11bHRpLXRocmVhZGluZyB0byBoYW5kbGUgcmVxdWVzdHMgd2hpbGUgcnVubmluZyBzb21lIG90aGVyIGNvZGUgdGhhdCBpbnZva2VzIHJlbW90ZSBtZXRob2RzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5pbnQ8L2I+Jm5ic3A7bWFpbigpIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgc29hcDEsIHNvYXAyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtwdGhyZWFkX3QgdGlkOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsuLi4gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9pbml0KCZhbXA7c29hcDEpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoc29hcF9iaW5kKCZhbXA7c29hcDEsIGhvc3QsIHBvcnQsIGJhY2tsb2cpICAmbHQ7ICAwKSBleGl0KDEpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoc29hcF9hY2NlcHQoJmFtcDtzb2FwMSkgICZsdDsgIDApIGV4aXQoMSk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3B0aHJlYWRfY3JlYXRlKCZhbXA7dGlkLCBOVUxMLCAoPGI+dm9pZDwvYj4qKCopKDxiPnZvaWQ8L2I+Kikpc29hcF9zZXJ2ZSwgKDxiPnZvaWQ8L2I+KikmYW1wO3NvYXAxKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Li4uIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfaW5pdCgmYW1wO3NvYXAyKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9jYWxsX25zX19tZXRob2QoJmFtcDtzb2FwMiwgLi4uKTsgLy8gbWFrZSBhIHJlbW90ZSBjYWxsIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOy4uLiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2VuZCgmYW1wO3NvYXAyKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Li4uIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3B0aHJlYWRfam9pbih0aWQsIE5VTEwpOyAvLyB3YWl0IGZvciB0aHJlYWQgdG8gdGVybWluYXRlIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfZW5kKCZhbXA7c29hcDEpOyAvLyByZWxlYXNlIGl0cyBkYXRhIDxiciAvPg0KK30NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK0luIHRoZSBleGFtcGxlIGFib3ZlLCB0d28gcnVudGltZSBlbnZpcm9ubWVudHMgYXJlIHJlcXVpcmVkLg0KK0luIGNvbXBhcmlzb24sIGdTT0FQIDEuWCBzdGF0aWNhbGx5IGFsbG9jYXRlcyB0aGUgcnVudGltZSBlbnZpcm9ubWVudCwgd2hpY2ggcHJvaGliaXRzIG11bHRpLXRocmVhZGluZyAob25seSBvbmUgdGhyZWFkIGNhbiBpbnZva2UNCityZW1vdGUgbWV0aG9kcyBhbmQvb3IgYWNjZXB0IHJlcXVlc3RzIGR1ZSB0byB0aGUgc2luZ2xlIHJ1bnRpbWUgZW52aXJvbm1lbnQpLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzptdCI+Ny4yLjQ8L2E+IHByZXNlbnRzIGEgbXVsdGktdGhyZWFkZWQgc3RhbmQtYWxvbmUgV2ViIFNlcnZpY2UgdGhhdCBoYW5kbGVzIG11bHRpcGxlIFNPQVAgcmVxdWVzdHMgYnkgc3Bhd25pbmcgYSB0aHJlYWQgZm9yIGVhY2ggcmVxdWVzdC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorIDxoMj48YSBuYW1lPSJ0dGhfc0VjNiI+DQorNjwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+SW50ZXJvcGVyYWJpbGl0eTwvZm9udD48L2gyPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitnU09BUCBpbnRlcm9wZXJhYmlsaXR5IGhhcyBiZWVuIHZlcmlmaWVkIHdpdGggdGhlIGZvbGxvd2luZyBTT0FQIGltcGxlbWVudGF0aW9ucyBhbmQgdG9vbGtpdHM6DQorDQorPGRsIGNvbXBhY3Q9ImNvbXBhY3QiPg0KKyA8ZHQ+PGI+QXBhY2hlIDIuMjwvYj48L2R0Pg0KKwk8ZGQ+PC9kZD4NCisgPGR0PjxiPkFwYWNoZSBBeGlzPC9iPjwvZHQ+DQorCTxkZD48L2RkPg0KKyA8ZHQ+PGI+QVNQLk5FVDwvYj48L2R0Pg0KKwk8ZGQ+PC9kZD4NCisgPGR0PjxiPkNhcGUgQ29ubmVjdDwvYj48L2R0Pg0KKwk8ZGQ+PC9kZD4NCisgPGR0PjxiPkRlbHBoaTwvYj48L2R0Pg0KKwk8ZGQ+PC9kZD4NCisgPGR0PjxiPmVhc3lTT0FQKys8L2I+PC9kdD4NCisJPGRkPjwvZGQ+DQorIDxkdD48Yj5lU09BUDwvYj48L2R0Pg0KKwk8ZGQ+PC9kZD4NCisgPGR0PjxiPkZyb250aWVyPC9iPjwvZHQ+DQorCTxkZD48L2RkPg0KKyA8ZHQ+PGI+R0xVRTwvYj48L2R0Pg0KKwk8ZGQ+PC9kZD4NCisgPGR0PjxiPklvbmEgWE1MQnVzPC9iPjwvZHQ+DQorCTxkZD48L2RkPg0KKyA8ZHQ+PGI+a1NPQVA8L2I+PC9kdD4NCisJPGRkPjwvZGQ+DQorIDxkdD48Yj5NUyBTT0FQPC9iPjwvZHQ+DQorCTxkZD48L2RkPg0KKyA8ZHQ+PGI+UGhhbGFueDwvYj48L2R0Pg0KKwk8ZGQ+PC9kZD4NCisgPGR0PjxiPlNJTTwvYj48L2R0Pg0KKwk8ZGQ+PC9kZD4NCisgPGR0PjxiPlNPQVA6OkxpdGU8L2I+PC9kdD4NCisJPGRkPjwvZGQ+DQorIDxkdD48Yj5TT0FQNFI8L2I+PC9kdD4NCisJPGRkPjwvZGQ+DQorIDxkdD48Yj5TcHJheTwvYj48L2R0Pg0KKwk8ZGQ+PC9kZD4NCisgPGR0PjxiPlNRTERhdGE8L2I+PC9kdD4NCisJPGRkPjwvZGQ+DQorIDxkdD48Yj5XYXNwIEFkdi48L2I+PC9kdD4NCisJPGRkPjwvZGQ+DQorIDxkdD48Yj5XYXNwIEMrKzwvYj48L2R0Pg0KKwk8ZGQ+PC9kZD4NCisgPGR0PjxiPldoaXRlIE1lc2E8L2I+PC9kdD4NCisJPGRkPjwvZGQ+DQorIDxkdD48Yj54U09BUDwvYj48L2R0Pg0KKwk8ZGQ+PC9kZD4NCisgPGR0PjxiPlpTSTwvYj48L2R0Pg0KKwk8ZGQ+PC9kZD4NCisgPGR0PjxiPjRTNEM8L2I+PC9kdD4NCisJPGRkPjwvZGQ+DQorPC9kbD4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorIDxoMj48YSBuYW1lPSJ0dGhfc0VjNyI+DQorNzwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+UXVpY2sgVXNlciBHdWlkZTwvZm9udD48L2gyPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGlzIHVzZXIgZ3VpZGUgb2ZmZXJzIGEgcXVpY2sgd2F5IHRvIGdldCBzdGFydGVkIHdpdGggZ1NPQVAuICBUaGlzIHNlY3Rpb24NCityZXF1aXJlcyBhIGJhc2ljIHVuZGVyc3RhbmRpbmcgb2YgdGhlIFNPQVAgMS4xIHByb3RvY29sIGFuZCBzb21lIGZhbWlsaWFyaXR5DQord2l0aCBDIGFuZC9vciBDKysuIEluIHByaW5jaXBsZSwgU09BUCBjbGllbnRzIGFuZCBTT0FQIFdlYiBzZXJ2aWNlcyBjYW4gYmUNCitkZXZlbG9wZWQgaW4gQyBhbmQgQysrIHdpdGggdGhlIGdTT0FQIGNvbXBpbGVyIHdpdGhvdXQgYSBkZXRhaWxlZCB1bmRlcnN0YW5kaW5nDQorb2YgdGhlIFNPQVAgcHJvdG9jb2wgd2hlbiBnU09BUCBjbGllbnQtc2VydmVyIGFwcGxpY2F0aW9ucyBhcmUgYnVpbHQgYXMgYW4NCitlbnNhbWJsZSBhbmQgb25seSBjb21tdW5pY2F0ZSB3aXRoaW4gdGhpcyBncm91cCAoaS5lLiZuYnNwO21lYW5pbmcgdGhhdCB5b3UgZG9uJ3QNCitoYXZlIHRvIHdvcnJ5IGFib3V0IGludGVyb3BlcmFiaWxpdHkgd2l0aCBvdGhlciBTT0FQIGltcGxlbWVudGF0aW9ucykuICBUaGlzDQorc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBpbGx1c3RyYXRlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBnU09BUCBXZWIgc2VydmljZXMgYW5kDQorY2xpZW50cyB0aGF0IGNvbm5lY3QgdG8gYW5kIGludGVyb3BlcmF0ZSB3aXRoIG90aGVyIFNPQVAgaW1wbGVtZW50YXRpb25zIHN1Y2gNCithcyBBcGFjaGUgQXhpcywgU09BUDo6TGl0ZSwgYW5kIC5ORVQuICBUaGlzIHJlcXVpcmVzIHNvbWUgZGV0YWlscyBvZiB0aGUgU09BUA0KK2FuZCBXU0RMIHByb3RvY29scyB0byBiZSB1bmRlcnN0b29kLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJICAgICA8aDM+PGEgbmFtZT0idHRoX3NFYzcuMSI+DQorNy4xPC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5Ib3cgdG8gVXNlIHRoZSBnU09BUCBTdHViIGFuZCBTa2VsZXRvbiBDb21waWxlciB0byBCdWlsZCBTT0FQIENsaWVudHM8L2ZvbnQ+PC9oMz48YSBuYW1lPSJzZWM6Y2xpZW50Ij4NCis8L2E+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0luIGdlbmVyYWwsIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIFNPQVAgY2xpZW50IGFwcGxpY2F0aW9uIHJlcXVpcmVzIGEgPGI+DQorc3R1YjwvYj4gcm91dGluZSBmb3IgZWFjaCByZW1vdGUgbWV0aG9kIHRoYXQgdGhlIGNsaWVudCBhcHBsaWNhdGlvbiBuZWVkcyB0bw0KK2ludm9rZS4gIFRoZSBwcmltYXJ5IHN0dWIncyByZXNwb25zaWJpbGl0eSBpcyB0byBtYXJzaGFsbCB0aGUgcGFyYW1ldGVyIGRhdGEsIHNlbmQNCit0aGUgcmVxdWVzdCB3aXRoIHRoZSBwYXJhbWV0ZXJzIHRvIHRoZSBkZXNpZ25hdGVkIFNPQVAgc2VydmljZSBvdmVyIHRoZSB3aXJlLCB0byB3YWl0IGZvciB0aGUNCityZXNwb25zZSwgYW5kIHRvIGRlbWFyc2hhbGwgdGhlIHBhcmFtZXRlciBkYXRhIG9mIHRoZSByZXNwb25zZSB3aGVuIGl0IGFycml2ZXMuIFRoZSBjbGllbnQNCithcHBsaWNhdGlvbiBpbnZva2VzIHRoZSBzdHViIHJvdXRpbmUgZm9yIGEgcmVtb3RlIG1ldGhvZCBhcyBpZiBpdCB3b3VsZCBpbnZva2UNCithIGxvY2FsIG1ldGhvZC4gIFRvIHdyaXRlIGEgc3R1YiByb3V0aW5lIGluIEMgb3IgQysrIGJ5IGhhbmQgaXMgYSB0ZWRpb3VzIHRhc2ssDQorZXNwZWNpYWxseSBpZiB0aGUgaW5wdXQgYW5kL29yIG91dHB1dCBwYXJhbWV0ZXJzIG9mIGEgcmVtb3RlIG1ldGhvZCBjb250YWluDQorZWxhYm9yYXRlIGRhdGEgc3RydWN0dXJlcyBzdWNoIGFzIHJlY29yZHMsIGFycmF5cywgYW5kIGdyYXBocy4gRm9ydHVuYXRlbHksIHRoZQ0KK2dTT0FQICd3c2RsMmgnIFdTREwgcGFyc2VyIGFuZCAnc29hcGNwcDInIHN0dWIgYW5kIHNrZWxldG9uIGNvbXBpbGVyIGF1dG9tYXRlIHRoZQ0KK2RldmVsb3BtZW50IG9mIFdlYiBzZXJ2aWNlIGNsaWVudCBhbmQgc2VydmVyIGFwcGxpY2F0aW9ucy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIGdTT0FQIHN0dWIgYW5kIHNrZWxldG9uIGNvbXBpbGVyIGlzIGEgPGI+cHJlcHJvY2Vzc29yPC9iPiB0aGF0IGdlbmVyYXRlcyB0aGUNCituZWNlc3NhcnkgQysrIHNvdXJjZXMgdG8gYnVpbGQgU09BUCBDKysgY2xpZW50cy4gVGhlIGlucHV0IHRvIHRoZSBnU09BUCBzdHViDQorYW5kIHNrZWxldG9uIGNvbXBpbGVyIGNvbnNpc3RzIG9mIGEgc3RhbmRhcmQgQy9DKysgPGI+aGVhZGVyIGZpbGU8L2I+LiAgVGhlDQoraGVhZGVyIGZpbGUgY2FuIGJlIGdlbmVyYXRlZCBmcm9tIGEgV1NETCAoV2ViIFNlcnZpY2UgRGVzY3JpcHRpb24gTGFuZ3VhZ2UpDQorZG9jdW1lbnRhdGlvbiBvZiBhIHNlcnZpY2Ugd2l0aCB0aGUgZ1NPQVAgV1NETCBwYXJzZXIuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0NvbnNpZGVyIHRoZSBmb2xsb3dpbmcgY29tbWFuZCAoZW50ZXJlZCBhdCB0aGUgY29tbWFuZCBwcm9tcHQpOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKyQgd3NkbDJoIC1vIHF1b3RlLmggaHR0cDovL3NlcnZpY2VzLnhtZXRob2RzLm5ldC9zb2FwL3Vybjp4bWV0aG9kcy1kZWxheWVkLXF1b3Rlcy53c2RsDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvc3Bhbj4NCitUaGlzIGdlbmVyYXRlcyB0aGUgZmlsZSA8aT5xdW90ZS5oPC9pPiBpbiBDKysgZm9ybWF0IGZyb20gdGhlIFdTREwgYXQgdGhlIHNwZWNpZmllZCBVUkwuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RvIGdlbmVyYXRlIGEgaGVhZGVyIGZpbGUgdG8gZGV2ZWxvcCBhIHB1cmUgQyBjbGllbnQgYXBwbGljYXRpb24sIGlzc3VlIHRoZSBjb21tYW5kOg0KK0NvbnNpZGVyIHRoZSBmb2xsb3dpbmcgY29tbWFuZCAoZW50ZXJlZCBhdCB0aGUgY29tbWFuZCBwcm9tcHQpOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKyQgd3NkbDJoIC1jIC1vIHF1b3RlLmggaHR0cDovL3NlcnZpY2VzLnhtZXRob2RzLm5ldC9zb2FwL3Vybjp4bWV0aG9kcy1kZWxheWVkLXF1b3Rlcy53c2RsDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvc3Bhbj4NCitGb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBXU0RMIHBhcnNlciBhbmQgaXRzIG9wdGlvbnMsIHNlZSZuYnNwOzxhIGhyZWY9IiNzZWM6d3NkbGluIj43LjIuMTA8L2E+Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgPGk+cXVvdGUuaDwvaT4gaGVhZGVyIGZpbGUgaXMgdGhlbiBwcm9jZXNzZWQgYnkgdGhlIGdTT0FQIGNvbXBpbGVyIHRvIGdlbmVyYXRlIHRoZSBzdHVicyB0byBkZXZlbG9wIGNsaWVudCBhcHBsaWNhdGlvbnMNCisoYW5kIHNrZWxldG9ucyB0byBkZXZlbG9wIGEgc2VydmljZSkuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBTT0FQIHNlcnZpY2UgbWV0aG9kcyBhcmUgc3BlY2lmaWVkIGluIHRoZSBoZWFkZXIgZmlsZSBhcyA8Yj5mdW5jdGlvbg0KK3Byb3RvdHlwZXM8L2I+LiBTdHViIHJvdXRpbmVzIGluIEMvQysrIHNvdXJjZSBmb3JtIGFyZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieQ0KK3RoZSBnU09BUCBjb21waWxlciBmb3IgdGhlc2UgZnVuY3Rpb24gcHJvdG90eXBlcyBvZiByZW1vdGUgbWV0aG9kcy4gIFRoZQ0KK3Jlc3VsdGluZyBzdHViIHJvdXRpbmVzIGFsbG93IEMgYW5kIEMrKyBjbGllbnQgYXBwbGljYXRpb25zIHRvIHNlYW1sZXNzbHkNCitpbnRlcmFjdCB3aXRoIGV4aXN0aW5nIFNPQVAgV2ViIHNlcnZpY2VzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgZ1NPQVAgc3R1YiBhbmQgc2tlbGV0b24gY29tcGlsZXIgYWxzbyBnZW5lcmF0ZXMgPGI+c2tlbGV0b248L2I+IHJvdXRpbmVzIGZvcg0KK2VhY2ggb2YgdGhlIHJlbW90ZSBtZXRob2RzIHNwZWNpZmllZCBpbiB0aGUgaGVhZGVyIGZpbGUuIFRoZSBza2VsZXRvbiByb3V0aW5lcw0KK2NhbiBiZSByZWFkaWx5IHVzZWQgdG8gaW1wbGVtZW50IG9uZSBvciBtb3JlIG9mIHRoZSByZW1vdGUgbWV0aG9kcyBpbiBhIG5ldw0KK1NPQVAgV2ViIHNlcnZpY2UuIFRoZXNlIHNrZWxldG9uIHJvdXRpbmVzIGFyZSBub3QgdXNlZCBmb3IgYnVpbGRpbmcgU09BUA0KK2NsaWVudHMgaW4gQysrLCBhbHRob3VnaCB0aGV5IGNhbiBiZSB1c2VkIHRvIGJ1aWxkIG1peGVkIFNPQVAgY2xpZW50L3NlcnZlcg0KK2FwcGxpY2F0aW9ucyAocGVlciBhcHBsaWNhdGlvbnMpLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgaW5wdXQgYW5kIG91dHB1dCBwYXJhbWV0ZXJzIG9mIGEgU09BUCBzZXJ2aWNlIG1ldGhvZCBtYXkgYmUgc2ltcGxlIGRhdGENCit0eXBlcyBvciBjb21wb3VuZCBkYXRhIHR5cGVzLCBlaXRoZXIgZ2VuZXJhdGVkIGJ5IHRoZSBXU0RMIHBhcnNlciBvciBzcGVjaWZpZWQgYnkgaGFuZC4NCitUaGUgZ1NPQVAgc3R1YiBhbmQgc2tlbGV0b24gY29tcGlsZXIgYXV0b21hdGljYWxseSBnZW5lcmF0ZXMgPGI+DQorc2VyaWFsaXplcnM8L2I+IGFuZCA8Yj5kZXNlcmlhbGl6ZXJzPC9iPiBmb3IgdGhlIGRhdGEgdHlwZXMgdG8gZW5hYmxlIHRoZSBnZW5lcmF0ZWQNCitzdHViIHJvdXRpbmVzIHRvIGVuY29kZSBhbmQgZGVjb2RlIHRoZSBjb250ZW50cyBvZiB0aGUgcGFyYW1ldGVycyBvZiB0aGUgcmVtb3RlDQorbWV0aG9kcyBpbiBYTUwuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkJICAgICAgPGg0PjxhIG5hbWU9InR0aF9zRWM3LjEuMSI+DQorNy4xLjE8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPkV4YW1wbGU8L2ZvbnQ+PC9oND48YSBuYW1lPSJzZWM6ZXhhbXBsZTEiPg0KKzwvYT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIDxpPmdldFF1b3RlPC9pPiByZW1vdGUgbWV0aG9kIG9mIFhNZXRob2RzIERlbGF5ZWQgU3RvY2sgUXVvdGUgc2VydmljZSAoZGVmaW5lZCBpbiB0aGUgPGk+cXVvdGUuaDwvaT4gZmlsZSBvYnRhaW5lZCB3aXRoIHRoZSAnd3NkbDJoJyBXU0RMIHBhcnNlcikNCitwcm92aWRlcyBhIGRlbGF5ZWQgc3RvY2sgcXVvdGUgZm9yIGEgZ2l2ZW4gdGlja2VyIG5hbWUuDQorVGhlIFdTREwgZGVzY3JpcHRpb24gb2YgdGhlIFhNZXRob2RzIERlbGF5ZWQgU3RvY2sgUXVvdGUgc2VydmljZSBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGRldGFpbHM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjRDBEMEQwIj48dHI+PHRkPjxzcGFuIGNsYXNzPSJyb21hbiI+DQorDQorPHRhYmxlPg0KKzx0cj48dGQ+RW5kcG9pbnQgVVJMOiA8L3RkPjx0ZD48dHQ+aHR0cDovL3NlcnZpY2VzLnhtZXRob2RzLm5ldDo4MC9zb2FwPC90dD4gPC90ZD48L3RyPg0KKzx0cj48dGQ+U09BUCBhY3Rpb246IDwvdGQ+PHRkPiIiICgyIHF1b3RlcykgPC90ZD48L3RyPg0KKzx0cj48dGQ+UmVtb3RlIG1ldGhvZCBuYW1lc3BhY2U6IDwvdGQ+PHRkPjx0dD51cm46eG1ldGhvZHMtZGVsYXllZC1xdW90ZXM8L3R0PiA8L3RkPjwvdHI+DQorPHRyPjx0ZD5SZW1vdGUgbWV0aG9kIG5hbWU6IDwvdGQ+PHRkPjx0dD5nZXRRdW90ZTwvdHQ+IDwvdGQ+PC90cj4NCis8dHI+PHRkPiZuYnNwOyZuYnNwOyZuYnNwO0lucHV0IHBhcmFtZXRlcjogPC90ZD48dGQ+PHR0PnN5bWJvbDwvdHQ+IG9mIHR5cGUgPHR0PnhzZDpzdHJpbmc8L3R0PiA8L3RkPjwvdHI+DQorPHRyPjx0ZD4mbmJzcDsmbmJzcDsmbmJzcDtPdXRwdXQgcGFyYW1ldGVyOiA8L3RkPjx0ZD48dHQ+UmVzdWx0PC90dD4gb2YgdHlwZSA8dHQ+eHNkOmZsb2F0PC90dD4NCis8L3RkPjwvdHI+PC90YWJsZT4NCisNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9zcGFuPg0KK1RoZSBmb2xsb3dpbmcgPGk+Z2V0UXVvdGUuaDwvaT4gaGVhZGVyIGZpbGUgZm9yIEMgaXMgY3JlYXRlZCBmcm9tIHRoZSBXU0RMIGRlc2NyaXB0aW9uIHdpdGggdGhlIFdTREwgcGFyc2VyDQorKHRoZSBhY3R1YWwgY29udGVudHMgbWF5IHZhcnkgZGVwZW5kaW5nIG9uIHRoZSAnd3NkbDJoJyByZWxlYXNlIHZlcnNpb24gYW5kIHRoZSBvcHRpb25zIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBvdXRwdXQpOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisvL2dzb2FwIG5zMSBzZXJ2aWNlIG5hbWU6ICAgICAgIG5ldF9ET1R4bWV0aG9kc19ET1RzZXJ2aWNlc19ET1RzdG9ja3F1b3RlX0RPVFN0b2NrUXVvdGVCaW5kaW5nICA8YnIgLz4NCisvL2dzb2FwIG5zMSBzZXJ2aWNlIHR5cGU6ICAgICAgIG5ldF9ET1R4bWV0aG9kc19ET1RzZXJ2aWNlc19ET1RzdG9ja3F1b3RlX0RPVFN0b2NrUXVvdGVQb3J0VHlwZSAgPGJyIC8+DQorLy9nc29hcCBuczEgc2VydmljZSBwb3J0OiAgICAgICBodHRwOi8vNjYuMjguOTguMTIxOjkwOTAvc29hcCA8YnIgLz4NCisvL2dzb2FwIG5zMSBzZXJ2aWNlIG5hbWVzcGFjZTogIHVybjp4bWV0aG9kcy1kZWxheWVkLXF1b3RlcyA8YnIgLz4NCisvL2dzb2FwIG5zMSBzZXJ2aWNlIGRvY3VtZW50YXRpb246ICAgICAgRGVmaW5pdGlvbnMgZ2VuZXJhdGVkIGJ5IHRoZSBnU09BUCBXU0RMIHBhcnNlciAxLjAgIDxiciAvPg0KKy8vIFNlcnZpY2UgbmV0LnhtZXRob2RzLnNlcnZpY2VzLnN0b2NrcXVvdGUuU3RvY2tRdW90ZVNlcnZpY2UgOiBuZXQueG1ldGhvZHMuc2VydmljZXMuc3RvY2txdW90ZS5TdG9ja1F1b3RlIHdlYiBzZXJ2aWNlIDxiciAvPg0KKzxiciAvPg0KKy8vZ3NvYXAgbnMxIHNlcnZpY2UgbWV0aG9kLXN0eWxlOiAgICAgICBnZXRRdW90ZSBycGMgPGJyIC8+DQorLy9nc29hcCBuczEgc2VydmljZSBtZXRob2QtZW5jb2Rpbmc6ICAgIGdldFF1b3RlIGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIDxiciAvPg0KKy8vZ3NvYXAgbnMxIHNlcnZpY2UgbWV0aG9kLWFjdGlvbjogICAgICBnZXRRdW90ZSB1cm46eG1ldGhvZHMtZGVsYXllZC1xdW90ZXMjZ2V0UXVvdGUgPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO25zMV9fZ2V0UXVvdGUoPGI+Y2hhcjwvYj4mbmJzcDsqc3ltYm9sLCA8Yj5mbG9hdDwvYj4mbmJzcDsmYW1wO1Jlc3VsdCk7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgaGVhZGVyIGZpbGUgZXNzZW50aWFsbHkgc3BlY2lmaWVzIHRoZSBzZXJ2aWNlIGRldGFpbHMgaW4gQy9DKysgd2l0aA0KK2RpcmVjdGl2ZXMgZm9yIHRoZSBnU09BUCBjb21waWxlci4gIFRoZSByZW1vdGUgbWV0aG9kIGlzIGRlY2xhcmVkIGFzIGENCis8aT5uczFfX2dldFF1b3RlPC9pPiA8Yj5mdW5jdGlvbiBwcm90b3R5cGU8L2I+IHdoaWNoIHNwZWNpZmllcyBhbGwgb2YgdGhlDQorbmVjZXNzYXJ5IGRldGFpbHMgZm9yIHRoZSBnU09BUCBjb21waWxlciB0byBnZW5lcmF0ZSB0aGUgc3R1YiByb3V0aW5lIGZvciBhDQorY2xpZW50IGFwcGxpY2F0aW9uIHRvIGludGVyYWN0IHdpdGggdGhlIERlbGF5ZWQgU3RvY2sgUXVvdGUgc2VydmljZS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIERlbGF5ZWQgU3RvY2sgUXVvdGUgc2VydmljZSBkZXNjcmlwdGlvbiByZXF1aXJlcyB0aGF0IHRoZSA8Yj5pbnB1dA0KK3BhcmFtZXRlcjwvYj4gb2YgdGhlIDxpPmdldFF1b3RlPC9pPiByZW1vdGUgbWV0aG9kIGlzIGEgPGk+c3ltYm9sPC9pPiBwYXJhbWV0ZXIgb2YNCit0eXBlIHN0cmluZy4gVGhlIGRlc2NyaXB0aW9uIGFsc28gaW5kaWNhdGVzIHRoYXQgdGhlIDxpPlJlc3VsdDwvaT4gPGI+b3V0cHV0DQorcGFyYW1ldGVyPC9iPiBpcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlciB0aGF0IHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgdW5pdCBwcmljZSBvZg0KK3RoZSBzdG9jayBpbiBkb2xsYXJzLiBUaGUgZ1NPQVAgY29tcGlsZXIgdXNlcyB0aGUgY29udmVudGlvbiB0aGUgPGI+bGFzdA0KK3BhcmFtZXRlcjwvYj4gb2YgdGhlIGZ1bmN0aW9uIHByb3RvdHlwZSBtdXN0IGJlIHRoZSBvdXRwdXQgcGFyYW1ldGVyIG9mIHRoZSByZW1vdGUNCittZXRob2QsIHdoaWNoIGlzIHJlcXVpcmVkIHRvIGJlIHBhc3NlZCBieSByZWZlcmVuY2UgdXNpbmcgdGhlIHJlZmVyZW5jZQ0KK29wZXJhdG9yICg8aT4mYW1wOzwvaT4pIG9yIGJ5IHVzaW5nIGEgcG9pbnRlciB0eXBlLiBBbGwgb3RoZXIgcGFyYW1ldGVycyBleGNlcHQgdGhlDQorbGFzdCBhcmUgaW5wdXQgcGFyYW1ldGVycyBvZiB0aGUgcmVtb3RlIG1ldGhvZCwgd2hpY2ggYXJlIHJlcXVpcmVkIHRvIGJlIHBhc3NlZA0KK2J5IHZhbHVlIG9yIHBhc3NlZCB1c2luZyBhIHBvaW50ZXIgdG8gYSB2YWx1ZSAoYnkgcmVmZXJlbmNlIGlzIG5vdCBhbGxvd2VkKS4NCitUaGUgZnVuY3Rpb24gcHJvdG90eXBlIGFzc29jaWF0ZWQgd2l0aCBhIHJlbW90ZSBtZXRob2QgaXMgcmVxdWlyZWQgdG8gcmV0dXJuIGFuDQorPGk+PGI+aW50PC9iPjwvaT4sIHdob3NlIHZhbHVlIGluZGljYXRlcyB0byB0aGUgY2FsbGVyIHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gdG8gYQ0KK1NPQVAgV2ViIHNlcnZpY2Ugd2FzIHN1Y2Nlc3NmdWwgb3IgcmVzdWx0ZWQgaW4gYW4gZXhjZXB0aW9uLCBzZWUNCitTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzplcnJjb2RlcyI+OS4yPC9hPiBmb3IgdGhlIGVycm9yIGNvZGVzLiANCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIHVzZSBvZiB0aGUgbmFtZXNwYWNlIHByZWZpeCA8aT5uczFfXzwvaT4gaW4gdGhlIHJlbW90ZSBtZXRob2QgbmFtZSBpbiB0aGUNCitmdW5jdGlvbiBwcm90b3R5cGUgZGVjbGFyYXRpb24gaXMgZGlzY3Vzc2VkIGluIGRldGFpbCBpbiZuYnNwOzxhIGhyZWY9IiNzZWM6bmFtZXNwYWNlIj43LjEuMjwvYT4uDQorQmFzaWNhbGx5LCBhIG5hbWVzcGFjZSBwcmVmaXggaXMgZGlzdGluZ3Vpc2hlZCBieSBhIDxiPnBhaXIgb2YgdW5kZXJzY29yZXM8L2I+DQoraW4gdGhlIGZ1bmN0aW9uIG5hbWUsIGFzIGluIDxpPm5zMV9fZ2V0UXVvdGU8L2k+IHdoZXJlIDxpPm5zMTwvaT4gaXMgdGhlDQorbmFtZXNwYWNlIHByZWZpeCBhbmQgPGk+Z2V0UXVvdGU8L2k+IGlzIHRoZSByZW1vdGUgbWV0aG9kIG5hbWUuICAoQSBzaW5nbGUNCit1bmRlcnNjb3JlIGluIGFuIGlkZW50aWZpZXIgbmFtZSB3aWxsIGJlIHRyYW5zbGF0ZWQgaW50byBhIGRhc2ggaW4gWE1MLCBiZWNhdXNlDQorZGFzaGVzIGFyZSBtb3JlIGZyZXF1ZW50bHkgdXNlZCBpbiBYTUwgY29tcGFyZWQgdG8gdW5kZXJzY29yZXMsIHNlZQ0KK1NlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOmlkdHJhbnMiPjkuMzwvYT4uKQ0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgZ1NPQVAgY29tcGlsZXIgaXMgaW52b2tlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgd2l0aDoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNEMEQwRDAiPjx0cj48dGQ+PHNwYW4gY2xhc3M9InJvbWFuIj4NCis8aT5zb2FwY3BwMiBnZXRRdW90ZS5oPC9pPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQorVGhlIGNvbXBpbGVyIGdlbmVyYXRlcyB0aGUgc3R1YiByb3V0aW5lIGZvciB0aGUgPGk+Z2V0UXVvdGU8L2k+IHJlbW90ZSBtZXRob2QNCitzcGVjaWZpZWQgaW4gdGhlIDxpPmdldFF1b3RlLmg8L2k+IGhlYWRlciBmaWxlLiBUaGlzIHN0dWIgcm91dGluZSBjYW4gYmUgY2FsbGVkDQorYnkgYSBjbGllbnQgcHJvZ3JhbSBhdCBhbnkgdGltZSB0byByZXF1ZXN0IGEgc3RvY2sgcXVvdGUgZnJvbSB0aGUgRGVsYXllZCBTdG9jaw0KK1F1b3RlIHNlcnZpY2UuIFRoZSBpbnRlcmZhY2UgdG8gdGhlIGdlbmVyYXRlZCBzdHViIHJvdXRpbmUgaXMgdGhlIGZvbGxvd2luZw0KK2Z1bmN0aW9uIHByb3RvdHlwZSBnZW5lcmF0ZWQgYnkgdGhlIGdTT0FQIGNvbXBpbGVyOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5pbnQ8L2I+Jm5ic3A7c29hcF9jYWxsX25zMV9fZ2V0UXVvdGUoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIDxiPmNoYXI8L2I+Jm5ic3A7KlVSTCwgPGI+Y2hhcjwvYj4mbmJzcDsqYWN0aW9uLCA8Yj5jaGFyPC9iPiZuYnNwOypzeW1ib2wsIDxiPmZsb2F0PC9iPiZuYnNwOyZhbXA7UmVzdWx0KTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoZSBzdHViIHJvdXRpbmUgaXMgc2F2ZWQgaW4gPGk+c29hcENsaWVudC5jcHA8L2k+LiBUaGUgZmlsZSA8aT5zb2FwQy5jcHA8L2k+DQorY29udGFpbnMgdGhlIDxiPnNlcmlhbGl6ZXI8L2I+IGFuZCA8Yj5kZXNlcmlhbGl6ZXI8L2I+IHJvdXRpbmVzIGZvciB0aGUgZGF0YQ0KK3R5cGVzIHVzZWQgYnkgdGhlIHN0dWIuIFlvdSBjYW4gdXNlIG9wdGlvbiA8aT4tYzwvaT4gZm9yIHRoZSA8aT5zb2FwY3BwMjwvaT4gY29tcGlsZXIgdG8NCitnZW5lcmF0ZSBwdXJlIEMgY29kZS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorTm90ZSB0aGF0IHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSA8aT5zb2FwX2NhbGxfbnMxX19nZXRRdW90ZTwvaT4gZnVuY3Rpb24gYXJlDQoraWRlbnRpY2FsIHRvIHRoZSA8aT5uczFfX2dldFF1b3RlPC9pPiBmdW5jdGlvbiBwcm90b3R5cGUgd2l0aCB0aHJlZSBhZGRpdGlvbmFsDQoraW5wdXQgcGFyYW1ldGVyczogPGk+c29hcDwvaT4gbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gYSBnU09BUCBydW50aW1lDQorZW52aXJvbm1lbnQsIDxpPlVSTDwvaT4gaXMgdGhlIFNPQVAgV2ViIHNlcnZpY2UgPGI+ZW5kcG9pbnQgVVJMPC9iPiBwYXNzZWQgYXMgYQ0KK3N0cmluZywgYW5kIDxpPmFjdGlvbjwvaT4gaXMgYSBzdHJpbmcgdGhhdCBkZW5vdGVzIHRoZSA8Yj5TT0FQIGFjdGlvbjwvYj4NCityZXF1aXJlZCBieSB0aGUgV2ViIHNlcnZpY2UuDQorTm90ZSB0aGF0IHRoZSBYTWV0aG9kcyBEZWxheWVkIFN0b2NrIFF1b3RlIHNlcnZpY2UgZW5kcG9pbnQgVVJMIGlzDQorPHR0Pmh0dHA6Ly82Ni4yOC45OC4xMjE6OTA5MC9zb2FwPC90dD4gYW5kIHRoZSBTT0FQIGFjdGlvbiByZXF1aXJlZCBpcw0KKzx0dD4iIjwvdHQ+ICh0d28gcXVvdGVzKS4gWW91IGNhbiBjaGFuZ2UgdGhlIGVuZHBvaW50IGFuZCBhY3Rpb24gZHluYW1pY2FsbHkuIFRoZSBlbmRwb2ludCBhbmQgYWN0aW9uIGFyZSB0aGUgc2Vjb25kIGFuZCB0aGlyZCBwYXJhbWV0ZXJzIG9mIHRoZSA8aT5zb2FwX2NhbGxfbnMxX19nZXRRdW90ZTwvaT4uIFdoZW4gTlVMTCwgdGhlIHZhbHVlcyBzcGVjaWZpZWQgaW4gdGhlIGhlYWRlciBmaWxlIHdpbGwgYmUgdXNlZC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIGZvbGxvd2luZyBleGFtcGxlIG1peGVkIEMvQysrIGNsaWVudCBwcm9ncmFtIGludm9rZXMgdGhlIHN0dWIgdG8gcmV0cmlldmUgdGhlIGxhdGVzdCBJQk0gc3RvY2sgcXVvdGUgZnJvbSB0aGUgWE1ldGhvZHMgRGVsYXllZCBTdG9jaw0KK1F1b3RlIHNlcnZpY2U6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKyNpbmNsdWRlIDx0dD4ic29hcEguaCI8L3R0PiAvLyBvYnRhaW4gdGhlIGdlbmVyYXRlZCBzdHViIDxiciAvPg0KKyNpbmNsdWRlIDx0dD4ibmV0X0RPVF94bWV0aG9kc19ET1Rfc2VydmljZXNfRE9UX3N0b2NrcXVvdGVfRE9UX1N0b2NrUXVvdGVCaW5kaW5nLm5zbWFwIjwvdHQ+IC8vIG9idGFpbiB0aGUgbmFtZXNwYWNlIG1hcHBpbmcgdGFibGUgPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO21haW4oKSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwIHNvYXA7IC8vIGdTT0FQIHJ1bnRpbWUgZW52aXJvbm1lbnQgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+ZmxvYXQ8L2I+Jm5ic3A7cXVvdGU7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfaW5pdCgmYW1wO3NvYXApOyAvLyBpbml0aWFsaXplIHJ1bnRpbWUgZW52aXJvbm1lbnQgKG9ubHkgb25jZSkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KHNvYXBfY2FsbF9uczFfX2dldFF1b3RlKCZhbXA7c29hcCwgTlVMTCwgTlVMTCwgPHR0PiJJQk0iPC90dD4sICZhbXA7cXVvdGUpID09IFNPQVBfT0spIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3N0ZDo6Y291dCAgJmx0OyZsdDsgICJDdXJyZW50IElCTSBTdG9jayBRdW90ZSA9ICIgICZsdDsmbHQ7ICBxdW90ZSAgJmx0OyZsdDsgIHN0ZDo6ZW5kbDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+ZWxzZTwvYj4mbmJzcDsvLyBhbiBlcnJvciBvY2N1cnJlZCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwX3ByaW50X2ZhdWx0KCZhbXA7c29hcCwgc3RkZXJyKTsgLy8gZGlzcGxheSB0aGUgU09BUCBmYXVsdCBtZXNzYWdlIG9uIHRoZSBzdGRlcnIgc3RyZWFtIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfZGVzdHJveSgmYW1wO3NvYXApOyAvLyBkZWxldGUgZGVzZXJpYWxpemVkIGNsYXNzIGluc3RhbmNlcyAoZm9yIEMrKyBvbmx5KSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2VuZCgmYW1wO3NvYXApOyAvLyByZW1vdmUgZGVzZXJpYWxpemVkIGRhdGEgYW5kIGNsZWFuIHVwIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfZG9uZSgmYW1wO3NvYXApOyAvLyBkZXRhY2ggdGhlIGdTT0FQIGVudmlyb25tZW50IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDswOyA8YnIgLz4NCit9DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitXaGVuIHN1Y2Nlc3NmdWwsIHRoZSBzdHViIHJldHVybnMgPGk+U09BUF9PSzwvaT4gYW5kDQorPGk+cXVvdGU8L2k+IGNvbnRhaW5zIHRoZSBsYXRlc3Qgc3RvY2sgcXVvdGUuICBPdGhlcndpc2UsIGFuIGVycm9yIG9jY3VycmVkIGFuZA0KK3RoZSBTT0FQIGZhdWx0IGlzIGRpc3BsYXllZCB3aXRoIHRoZSA8aT5zb2FwX3ByaW50X2ZhdWx0PC9pPiBmdW5jdGlvbi4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIGdTT0FQIGNvbXBpbGVyIGFsc28gZ2VuZXJhdGVzIGEgcHJveHkgY2xhc3MgZm9yIEMrKyBjbGllbnQgYXBwbGljYXRpb25zLiBUaGlzIGdlbmVyYXRlZCBwcm94eSBjbGFzcyBjYW4gYmUgaW5jbHVkZWQgaW50byBhIGNsaWVudCBhcHBsaWNhdGlvbiB0b2dldGhlciB3aXRoIHRoZSBnZW5lcmF0ZWQgbmFtZXNwYWNlIHRhYmxlIGFzIHNob3duIGluIHRoaXMgZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorI2luY2x1ZGUgPHR0PiJzb2FwbmV0X0RPVF94bWV0aG9kc19ET1Rfc2VydmljZXNfRE9UX3N0b2NrcXVvdGVfRE9UX1N0b2NrUXVvdGVCaW5kaW5nUHJveHkuaCI8L3R0PiAvLyBnZXQgcHJveHkgPGJyIC8+DQorI2luY2x1ZGUgPHR0PiJuZXRfRE9UX3htZXRob2RzX0RPVF9zZXJ2aWNlc19ET1Rfc3RvY2txdW90ZV9ET1RfU3RvY2tRdW90ZUJpbmRpbmcubnNtYXAiPC90dD4gLy8gb2J0YWluIHRoZSBuYW1lc3BhY2UgbWFwcGluZyB0YWJsZSA8YnIgLz4NCis8Yj5pbnQ8L2I+Jm5ic3A7bWFpbigpIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7bmV0IHE7IC8vICJuZXQiIGlzIHRoZSBwcm94eSBjbGFzcyB3aXRoIGEgbmFtZSB0aGF0IGlzIHRoZSBzaG9ydCBuYW1lIG9mIHRoZSBzZXJ2aWNlIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmZsb2F0PC9iPiZuYnNwO3I7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyhxLm5zMV9fZ2V0UXVvdGUoIklCTSIsIHIpID09IFNPQVBfT0spIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3N0ZDo6Y291dCAgJmx0OyZsdDsgIHIgICZsdDsmbHQ7ICBzdGQ6OmVuZGw7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmVsc2U8L2I+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9wcmludF9mYXVsdChxLnNvYXAsIHN0ZGVycik7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDswOyA8YnIgLz4NCit9DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgcHJveHkgY2xhc3MgY29uc3RydWN0b3IgYWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyBhIGdTT0FQIGVudmlyb25tZW50IGZvciB0aGUgaW5zdGFuY2UuDQorQWxsIHRoZSBIVFRQIGFuZCBTT0FQL1hNTCBwcm9jZXNzaW5nIGlzIGhpZGRlbiBhbmQgcGVyZm9ybWVkIG9uIHRoZSBiYWNrZ3JvdW5kLg0KK05vdGUgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgc2VydmljZSBpbiB0aGUgaGVhZGVyIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoZSBXU0RMIHBhcnNlci4NCitUaGUgbmFtZSBpcyBleHRyYWN0ZWQgZnJvbSB0aGUgV1NETCBjb250ZW50IGFuZCBtYXkgbm90IGFsd2F5cyBiZSBpbiBhIHNob3J0IGZvcm1hdC4gRmVlbCBmcmVlIHRvIGNoYW5nZSB0aGUgZW50cnkNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorLy9nc29hcCBuczEgc2VydmljZSBuYW1lOiAgICAgICBuZXRfRE9UX3htZXRob2RzX0RPVF9zZXJ2aWNlc19ET1Rfc3RvY2txdW90ZV9ET1RfU3RvY2tRdW90ZUJpbmRpbmcNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK3RvIHVzZSBhIG1vcmUgc3VpdGFibGUgbmFtZS4gVGhlIG5hbWUgd2lsbCBjb250cm9sIHRoZSBmaWxlIG5hbWUgb2YgdGhlIHByb3h5IGNsYXNzIGZpbGUgYW5kIHRoZSBYTUwgbmFtZXNwYWNlIG1hcHBpbmcgdGFibGUuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGNhbiBiZSB1c2VkIHRvIGV4cGxpY2l0bHkgc2V0dXAgYSBnU09BUCBydW50aW1lIGVudmlyb25tZW50ICg8aT48Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcDwvaT4pOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKw0KKzx0YWJsZT4NCis8dHI+PHRkPjxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5GdW5jdGlvbjwvYj48L2ZvbnQ+IDwvdGQ+PHRkIHdpZHRoPSIzNTEiPjxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5EZXNjcmlwdGlvbjwvYj48L2ZvbnQ+IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPnNvYXBfaW5pdCg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCk8L2k+IDwvdGQ+PHRkIHdpZHRoPSIzNTEiPkluaXRpYWxpemVzIGEgcnVudGltZSBlbnZpcm9ubWVudCAocmVxdWlyZWQgb25seSBvbmNlKSA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT5zb2FwX2luaXQxKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCBzb2FwX21vZGUgaW9tb2RlKTwvaT4gPC90ZD48dGQgd2lkdGg9IjM1MSI+SW5pdGlhbGl6ZXMgYSBydW50aW1lIGVudmlyb25tZW50IGFuZCBzZXQgaW4vb3V0IG1vZGUgZmxhZ3MgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+c29hcF9pbml0Mig8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgc29hcF9tb2RlIGltb2RlLCBzb2FwX21vZGUgb21vZGUpPC9pPiA8L3RkPjx0ZCB3aWR0aD0iMzUxIj5Jbml0aWFsaXplcyBhIHJ1bnRpbWUgZW52aXJvbm1lbnQgYW5kIHNldCBzZXBhcmF0ZSBpbi9vdXQgbW9kZSBmbGFncyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT48Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcF9uZXcoKTwvaT4gPC90ZD48dGQgd2lkdGg9IjM1MSI+QWxsb2NhdGVzLCBpbml0aWFsaXplcywgYW5kIHJldHVybnMgYSBwb2ludGVyIHRvIGEgcnVudGltZSBlbnZpcm9ubWVudCA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT48Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcF9uZXcxKHNvYXBfbW9kZSBpb21vZGUpPC9pPiA8L3RkPjx0ZCB3aWR0aD0iMzUxIj5BbGxvY2F0ZXMsIGluaXRpYWxpemVzLCBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBydW50aW1lIGVudmlyb25tZW50IGFuZCBzZXQgaW4vb3V0IG1vZGUgZmxhZ3MgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+PGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXBfbmV3Mihzb2FwX21vZGUgaW1vZGUsIHNvYXBfbW9kZSBvbW9kZSk8L2k+IDwvdGQ+PHRkIHdpZHRoPSIzNTEiPkFsbG9jYXRlcywgaW5pdGlhbGl6ZXMsIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byBhIHJ1bnRpbWUgZW52aXJvbm1lbnQgYW5kIHNldCBzZXBhcmF0ZSBpbi9vdXQgbW9kZSBmbGFncyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT48Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcF9jb3B5KDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwKTwvaT4gPC90ZD48dGQgd2lkdGg9IjM1MSI+QWxsb2NhdGVzIGEgbmV3IHJ1bnRpbWUgZW52aXJvbm1lbnQgYW5kIGNvcGllcyBjb250ZW50cyBvZg0KK3RoZSBhcmd1bWVudCBlbnZpcm9ubWVudCBzdWNoIHRoYXQgdGhlIG5ldyBlbnZpcm9ubWVudCBkb2VzIG5vdCBzaGFyZSBkYXRhIHdpdGggdGhlIGFyZ3VtZW50IGVudmlyb25tZW50IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPnNvYXBfZG9uZSg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCk8L2k+IDwvdGQ+PHRkIHdpZHRoPSIzNTEiPlJlc2V0LCBjbG9zZSBjb21tdW5pY2F0aW9ucywgYW5kIHJlbW92ZSBjYWxsYmFja3MgPC90ZD48L3RyPjwvdGFibGU+DQorDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvc3Bhbj4NCitBbiBlbnZpcm9ubWVudCBjYW4gYmUgcmV1c2VkIGFzIG1hbnkgdGltZXMgYXMgbmVjZXNzYXJ5IGZvciBjbGllbnQtc2lkZSByZW1vdGUgY2FsbHMgYW5kIGRvZXMgbm90IG5lZWQgdG8gYmUgcmVpbml0aWFsaXplZCBpbiBkb2luZyBzby4NCitBIG5ldyBlbnZpcm9ubWVudCBpcyByZXF1aXJlZCBmb3IgZWFjaCBuZXcgdGhyZWFkIHRvIGd1YXJhbnRlZSBleGNsdXNpdmUgYWNjZXNzDQordG8gcnVudGltZSBlbnZpcm9ubWVudHMgYnkgdGhyZWFkcy4gIEFsc28gdGhlIHVzZSBvZiBhbnkgY2xpZW50IGNhbGxzIHdpdGhpbiBhbiBhY3RpdmUgc2VydmljZSBtZXRob2QgcmVxdWlyZXMgYSBuZXcgZW52aXJvbm1lbnQuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1doZW4gdGhlIGV4YW1wbGUgY2xpZW50IGFwcGxpY2F0aW9uIGlzIGludm9rZWQsIHRoZSBTT0FQIHJlcXVlc3QgaXMgcGVyZm9ybWVkIGJ5IHRoZSBzdHViIHJvdXRpbmUgPGk+c29hcF9jYWxsX25zMV9fZ2V0UXVvdGU8L2k+LCB3aGljaA0KK2dlbmVyYXRlcyB0aGUgZm9sbG93aW5nIFNPQVAgUlBDIHJlcXVlc3QgbWVzc2FnZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEIwRDAiPjx0cj48dGQ+PHR0Pg0KK1BPU1QgL3NvYXAgSFRUUC8xLjEgPGJyIC8+DQorSG9zdDogc2VydmljZXMueG1ldGhvZHMubmV0IDxiciAvPg0KK0NvbnRlbnQtVHlwZTogdGV4dC94bWwgPGJyIC8+DQorQ29udGVudC1MZW5ndGg6IDUyOSA8YnIgLz4NCitTT0FQQWN0aW9uOiAiIiA8YnIgLz4NCis8YnIgLz4NCismbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/JiM2MjsgPGJyIC8+DQorJmx0O1NPQVAtRU5WOkVudmVsb3BlIHhtbG5zOlNPQVAtRU5WPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eG1sbnM6U09BUC1FTkM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt4bWxuczpuczE9InVybjp4bWV0aG9kcy1kZWxheWVkLXF1b3RlcyIgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7U09BUC1FTlY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iJiM2MjsgPGJyIC8+DQorJmx0O1NPQVAtRU5WOkJvZHkmIzYyOyA8YnIgLz4NCismbHQ7bnMxOmdldFF1b3RlJiM2MjsgPGJyIC8+DQorJmx0O3N5bWJvbCYjNjI7SUJNJmx0Oy9zeW1ib2wmIzYyOyA8YnIgLz4NCismbHQ7L25zMTpnZXRRdW90ZSYjNjI7IDxiciAvPg0KKyZsdDsvU09BUC1FTlY6Qm9keSYjNjI7IDxiciAvPg0KKyZsdDsvU09BUC1FTlY6RW52ZWxvcGUmIzYyOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3R0Pg0KK1RoZSBYTWV0aG9kcyBEZWxheWVkIFN0b2NrIFF1b3RlIHNlcnZpY2UgcmVzcG9uZHMgd2l0aCB0aGUgU09BUCByZXNwb25zZSBtZXNzYWdlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwQjBEMCI+PHRyPjx0ZD48dHQ+DQorSFRUUC8xLjEgMjAwIE9LIDxiciAvPg0KK0RhdGU6IFNhdCwgMjUgQXVnIDIwMDEgMTk6Mjg6NTkgR01UIDxiciAvPg0KK0NvbnRlbnQtVHlwZTogdGV4dC94bWwgPGJyIC8+DQorU2VydmVyOiBFbGVjdHJpYy8xLjAgPGJyIC8+DQorQ29ubmVjdGlvbjogS2VlcC1BbGl2ZSA8YnIgLz4NCitDb250ZW50LUxlbmd0aDogNDkxIDxiciAvPg0KKzxiciAvPg0KKyZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8mIzYyOyA8YnIgLz4NCismbHQ7c29hcDpFbnZlbG9wZSB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXA6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8mIzE4NzsgPGJyIC8+DQorJmx0O3NvYXA6Qm9keSYjNjI7IDxiciAvPg0KKyZsdDtuOmdldFF1b3RlUmVzcG9uc2UgeG1sbnM6bj0idXJuOnhtZXRob2RzLWRlbGF5ZWQtcXVvdGVzJiMxODc7IDxiciAvPg0KKyZsdDtSZXN1bHQgeHNpOnR5cGU9InhzZDpmbG9hdCYjMTg3OzQxLjgxJmx0Oy9SZXN1bHQmIzYyOyA8YnIgLz4NCismbHQ7L246Z2V0UXVvdGVSZXNwb25zZSYjNjI7IDxiciAvPg0KKyZsdDsvc29hcDpCb2R5JiM2MjsgPGJyIC8+DQorJmx0Oy9zb2FwOkVudmVsb3BlJiM2MjsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC90dD4NCitUaGUgc2VydmVyJ3MgU09BUCBSUEMgcmVzcG9uc2UgaXMgcGFyc2VkIGJ5IHRoZSBzdHViLiBUaGUgc3R1YiByb3V0aW5lIGZ1cnRoZXIgZGVtYXJzaGFsbHMgdGhlIGRhdGEgb2YgPHR0PlJlc3VsdDwvdHQ+DQorZWxlbWVudCBvZiB0aGUgU09BUCByZXNwb25zZSBhbmQgc3RvcmVzIGl0IGluIHRoZSA8aT5xdW90ZTwvaT4gcGFyYW1ldGVyIG9mIDxpPnNvYXBfY2FsbF9uczFfX2dldFF1b3RlPC9pPi4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorQSBjbGllbnQgcHJvZ3JhbSBjYW4gaW52b2tlIGEgcmVtb3RlIG1ldGhvZCBhdCBhbnkgdGltZSBhbmQgbXVsdGlwbGUgdGltZXMgaWYgbmVjZXNzYXJ5LiBDb25zaWRlciBmb3IgZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorLi4uIDxiciAvPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwIHNvYXA7IDxiciAvPg0KKzxiPmZsb2F0PC9iPiZuYnNwO3F1b3Rlc1szXTsgY2hhciAqbXlwb3J0Zm9saW9bXSA9IHs8dHQ+IklCTSI8L3R0PiwgPHR0PiJNU0ROIjwvdHQ+fTsgPGJyIC8+DQorc29hcF9pbml0KCZhbXA7c29hcCk7IC8vIG5lZWQgdG8gaW5pdGlhbGl6ZSBvbmx5IG9uY2UgPGJyIC8+DQorPGI+Zm9yPC9iPiZuYnNwOyg8Yj5pbnQ8L2I+Jm5ic3A7aSA9IDA7IGkgICZsdDsgIDM7IGkrKykgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KHNvYXBfY2FsbF9uczFfX2dldFF1b3RlKCZhbXA7c29hcCwgPHR0PiJodHRwOi8vc2VydmljZXMueG1ldGhvZHMubmV0OjgwL3NvYXAiPC90dD4sIDx0dD4iIjwvdHQ+LCBteXBvcnRmb2xpb1tpXSwgJmFtcDtxdW90ZXNbaV0pICE9IFNPQVBfT0spIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPmJyZWFrPC9iPjsgPGJyIC8+DQorPGI+aWY8L2I+Jm5ic3A7KHNvYXAuZXJyb3IpIC8vIGFuIGVycm9yIG9jY3VycmVkIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfcHJpbnRfZmF1bHQoJmFtcDtzb2FwLCBzdGRlcnIpOyA8YnIgLz4NCitzb2FwX2VuZCgmYW1wO3NvYXApOyAvLyBjbGVhbiB1cCBhbGwgZGVzZXJpYWxpemVkIGRhdGEgPGJyIC8+DQorLi4uDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGlzIGNsaWVudCBjb21wb3NlcyBhbiBhcnJheSBvZiBzdG9jayBxdW90ZXMgYnkgY2FsbGluZyB0aGUgPGk+bnMxX19nZXRRdW90ZTwvaT4gc3R1YiByb3V0aW5lIGZvciBlYWNoIHN5bWJvbCBpbiBhIHBvcnRmb2xpbyBhcnJheS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlZCBob3cgZWFzeSBpdCBpcyB0byBidWlsZCBhIFNPQVAgY2xpZW50IHdpdGggZ1NPQVAgb25jZSB0aGUgZGV0YWlscyBvZiBhIFdlYiBzZXJ2aWNlIGFyZSBhdmFpbGFibGUgDQoraW4gdGhlIGZvcm0gb2YgYSBXU0RMIGRvY3VtZW50Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJCSAgICAgIDxoND48YSBuYW1lPSJ0dGhfc0VjNy4xLjIiPg0KKzcuMS4yPC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5OYW1lc3BhY2UgQ29uc2lkZXJhdGlvbnM8L2ZvbnQ+PC9oND48YSBuYW1lPSJzZWM6bmFtZXNwYWNlIj4NCis8L2E+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBkZWNsYXJhdGlvbiBvZiB0aGUgPGk+bnMxX19nZXRRdW90ZTwvaT4gZnVuY3Rpb24gcHJvdG90eXBlIChkaXNjdXNzZWQgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24pIHVzZXMgdGhlIG5hbWVzcGFjZSBwcmVmaXgNCis8aT5uczFfXzwvaT4gb2YgdGhlIHJlbW90ZSBtZXRob2QgbmFtZXNwYWNlLCB3aGljaCBpcyBkaXN0aW5ndWlzaGVkIGJ5IGEgPGI+cGFpciBvZiB1bmRlcnNjb3JlczwvYj4gaW4gdGhlIGZ1bmN0aW9uIG5hbWUgdG8NCitzZXBhcmF0ZSB0aGUgbmFtZXNwYWNlIHByZWZpeCBmcm9tIHRoZSByZW1vdGUgbWV0aG9kIG5hbWUuICBUaGUgcHVycG9zZSBvZiBhIG5hbWVzcGFjZSBwcmVmaXggaXMgdG8gYXNzb2NpYXRlIGEgcmVtb3RlDQorbWV0aG9kIG5hbWUgd2l0aCBhIHNlcnZpY2UgaW4gb3JkZXIgdG8gcHJldmVudCBuYW1pbmcgY29uZmxpY3RzLCBlLmcuJm5ic3A7dG8gZGlzdGluZ3Vpc2ggaWRlbnRpY2FsIHJlbW90ZSBtZXRob2QgbmFtZXMgdXNlZA0KK2J5IGRpZmZlcmVudCBzZXJ2aWNlcy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorTm90ZSB0aGF0IHRoZSBYTUwgcmVzcG9uc2Ugb2YgdGhlIFhNZXRob2RzIERlbGF5ZWQgU3RvY2sgUXVvdGUgc2VydmljZSBleGFtcGxlIHVzZXMgdGhlIDxiPm5hbWVzcGFjZSBwcmVmaXg8L2I+IDx0dD5uPC90dD4gd2hpY2ggaXMNCitib3VuZCB0byB0aGUgPGI+bmFtZXNwYWNlIG5hbWU8L2I+IDx0dD51cm46eG1ldGhvZHMtZGVsYXllZC1xdW90ZXM8L3R0PiB0aHJvdWdoIHRoZSA8dHQ+eG1sbnM6bj0idXJuOnhtZXRob2RzLWRlbGF5ZWQtcXVvdGVzPC90dD4NCitiaW5kaW5nLiAgVGhlIHVzZSBvZiBuYW1lc3BhY2UgcHJlZml4ZXMgYW5kIG5hbWVzcGFjZSBuYW1lcyBpcyBhbHNvIHJlcXVpcmVkIHRvIGVuYWJsZSBTT0FQIGFwcGxpY2F0aW9ucyB0byB2YWxpZGF0ZSB0aGUgY29udGVudCBvZg0KK1NPQVAgbWVzc2FnZXMuICBUaGUgbmFtZXNwYWNlIG5hbWUgaW4gdGhlIHNlcnZpY2UgcmVzcG9uc2UgaXMgdmVyaWZpZWQgYnkgdGhlIHN0dWIgcm91dGluZSBieSB1c2luZyB0aGUNCitpbmZvcm1hdGlvbiBzdXBwbGllZCBpbiBhIDxiPm5hbWVzcGFjZSBtYXBwaW5nIHRhYmxlPC9iPiB0aGF0IGlzIHJlcXVpcmVkIHRvIGJlIHBhcnQgb2YgZ1NPQVAgY2xpZW50IGFuZCBzZXJ2aWNlIGFwcGxpY2F0aW9uIGNvZGVzLiAgVGhlIHRhYmxlIGlzIGFjY2Vzc2VkDQorYXQgcnVuIHRpbWUgdG8gcmVzb2x2ZSBuYW1lc3BhY2UgYmluZGluZ3MsIGJvdGggYnkgdGhlIGdlbmVyYXRlZCBzdHViJ3MgZGF0YSBzdHJ1Y3R1cmUgc2VyaWFsaXplciBmb3IgZW5jb2RpbmcgdGhlIGNsaWVudCByZXF1ZXN0DQorYW5kIGJ5IHRoZSBnZW5lcmF0ZWQgc3R1YidzIGRhdGEgc3RydWN0dXJlIGRlc2VyaWFsaXplciB0byBkZWNvZGUgYW5kIHZhbGlkYXRlIHRoZSBzZXJ2aWNlIHJlc3BvbnNlLiBUaGUgbmFtZXNwYWNlIG1hcHBpbmcgdGFibGUNCitzaG91bGQgPGI+bm90PC9iPiBiZSBwYXJ0IG9mIHRoZSBoZWFkZXIgZmlsZSBpbnB1dCB0byB0aGUgZ1NPQVAgc3R1YiBhbmQgc2tlbGV0b24gY29tcGlsZXIuIFNlcnZpY2UgZGV0YWlscyBpbmNsdWRpbmcgbmFtZXNwYWNlIGJpbmRpbmdzIG1heSBiZSBwcm92aWRlZCB3aXRoIGdTT0FQIGRpcmVjdGl2ZXMgaW4gYSBoZWFkZXIgZmlsZSwgc2VlIFNlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOmRpcmVjdGl2ZXMiPjE4LjI8L2E+Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgbmFtZXNwYWNlIG1hcHBpbmcgdGFibGUgZm9yIHRoZSBEZWxheWVkIFN0b2NrIFF1b3RlIGNsaWVudCBpczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+c3RydWN0PC9iPiZuYnNwO05hbWVzcGFjZSBuYW1lc3BhY2VzW10gPSA8YnIgLz4NCit7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ly8geyJucy1wcmVmaXgiLCAibnMtbmFtZSJ9IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3s8Zm9udCBjb2xvcj0iI0ZGMDAwMCI+IlNPQVAtRU5WIiwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIjwvZm9udD59LCAvLyBNVVNUIGJlIGZpcnN0IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3s8Zm9udCBjb2xvcj0iIzAwMDBGRiI+IlNPQVAtRU5DIiwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIjwvZm9udD59LCAvLyBNVVNUIGJlIHNlY29uZCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7PGZvbnQgY29sb3I9IiNGRjAwRkYiPiJ4c2kiLCAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI8L2ZvbnQ+fSwgLy8gTVVTVCBiZSB0aGlyZCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7PGZvbnQgY29sb3I9IiMwMEZGRkYiPiJ4c2QiLCAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI8L2ZvbnQ+fSwgLy8gMjAwMSBYTUwgU2NoZW1hIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3s8Zm9udCBjb2xvcj0iIzAwRkYwMCI+Im5zMSIsICAgICAgInVybjp4bWV0aG9kcy1kZWxheWVkLXF1b3RlcyI8L2ZvbnQ+fSwgLy8gZ2l2ZW4gYnkgdGhlIHNlcnZpY2UgZGVzY3JpcHRpb24gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7e05VTEwsIE5VTEx9IC8vIGVuZCBvZiB0YWJsZSA8YnIgLz4NCit9Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+IA0KK1RoZSBmaXJzdCBmb3VyIG5hbWVzcGFjZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBjb25zaXN0IG9mIHRoZSBzdGFuZGFyZCBuYW1lc3BhY2VzIHVzZWQgYnkgdGhlIFNPQVAgMS4xIHByb3RvY29sLiBJbiBmYWN0LCB0aGUNCituYW1lc3BhY2UgbWFwcGluZyB0YWJsZSBpcyBleHBsaWNpdGx5IGRlY2xhcmVkIHRvIGVuYWJsZSBhIHByb2dyYW1tZXIgdG8gc3BlY2lmeSB0aGUgU09BUCBlbmNvZGluZyBzdHlsZSBhbmQgdG8gYWxsb3cgdGhlDQoraW5jbHVzaW9uIG9mIG5hbWVzcGFjZS1wcmVmaXggd2l0aCBuYW1lc3BhY2UtbmFtZSBiaW5kaW5ncyB0byBjb21wbHkgdG8gdGhlIG5hbWVzcGFjZSByZXF1aXJlbWVudHMgb2YgYSBzcGVjaWZpYyBTT0FQIHNlcnZpY2UuIEZvcg0KK2V4YW1wbGUsIHRoZSBuYW1lc3BhY2UgcHJlZml4IDx0dD5uczE8L3R0Piwgd2hpY2ggaXMgYm91bmQgdG8gPHR0PnVybjp4bWV0aG9kcy1kZWxheWVkLXF1b3RlczwvdHQ+IGJ5IHRoZSBuYW1lc3BhY2UgbWFwcGluZyB0YWJsZSBzaG93bg0KK2Fib3ZlLCBpcyB1c2VkIGJ5IHRoZSBnZW5lcmF0ZWQgc3R1YiByb3V0aW5lIHRvIGVuY29kZSB0aGUgPGk+Z2V0UXVvdGU8L2k+IHJlcXVlc3QuIFRoaXMgaXMgcGVyZm9ybWVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGdTT0FQDQorY29tcGlsZXIgYnkgdXNpbmcgdGhlIDxpPm5zMTwvaT4gcHJlZml4IG9mIHRoZSA8aT5uczFfX2dldFF1b3RlPC9pPiBtZXRob2QgbmFtZSBzcGVjaWZpZWQgaW4gdGhlIDxpPmdldFF1b3RlLmg8L2k+IGhlYWRlciBmaWxlLiBJbg0KK2dlbmVyYWwsIGlmIGEgZnVuY3Rpb24gbmFtZSBvZiBhIHJlbW90ZSBtZXRob2QsIDxpPjxiPnN0cnVjdDwvYj48L2k+IG5hbWUsIDxpPjxiPmNsYXNzPC9iPjwvaT4gbmFtZSwgPGk+PGI+ZW51bTwvYj48L2k+IG5hbWUsIG9yIGZpZWxkIG5hbWUgb2YgYQ0KKzxpPjxiPnN0cnVjdDwvYj48L2k+IG9yIDxpPjxiPmNsYXNzPC9iPjwvaT4gaGFzIGEgcGFpciBvZiB1bmRlcnNjb3JlcywgdGhlIG5hbWUgaGFzIGEgbmFtZXNwYWNlIHByZWZpeCB0aGF0IG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgbmFtZXNwYWNlDQorbWFwcGluZyB0YWJsZS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIG5hbWVzcGFjZSBtYXBwaW5nIHRhYmxlIHdpbGwgYmUgb3V0cHV0IGFzIHBhcnQgb2YgdGhlIFNPQVAgRW52ZWxvcGUgYnkgdGhlIHN0dWIgcm91dGluZS4gRm9yIGV4YW1wbGU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBCMEQwIj48dHI+PHRkPjx0dD4NCisuLi4gPGJyIC8+DQorJmx0O1NPQVAtRU5WOkVudmVsb3BlIHhtbG5zOjxmb250IGNvbG9yPSIjRkYwMDAwIj5TT0FQLUVOVj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iPC9mb250PiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt4bWxuczo8Zm9udCBjb2xvcj0iIzAwMDBGRiI+U09BUC1FTkM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIjwvZm9udD4gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eG1sbnM6PGZvbnQgY29sb3I9IiNGRjAwRkYiPnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPC9mb250PiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt4bWxuczo8Zm9udCBjb2xvcj0iIzAwRkZGRiI+eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI8L2ZvbnQ+IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3htbG5zOjxmb250IGNvbG9yPSIjMDBGRjAwIj5uczE9InVybjp4bWV0aG9kcy1kZWxheWVkLXF1b3RlcyI8L2ZvbnQ+IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO1NPQVAtRU5WOmVuY29kaW5nU3R5bGU9PGZvbnQgY29sb3I9IiMwMDAwRkYiPiJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI8L2ZvbnQ+JiM2MjsgPGJyIC8+DQorLi4uDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvdHQ+DQorVGhlIG5hbWVzcGFjZSBiaW5kaW5ncyB3aWxsIGJlIHVzZWQgYnkgYSBTT0FQIHNlcnZpY2UgdG8gdmFsaWRhdGUgdGhlIFNPQVAgcmVxdWVzdC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCQkgICAgICA8aDQ+PGEgbmFtZT0idHRoX3NFYzcuMS4zIj4NCis3LjEuMzwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+RXhhbXBsZTwvZm9udD48L2g0PjxhIG5hbWU9InNlYzpleGFtcGxlMiI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgaW5jb3Jwb3JhdGlvbiBvZiBuYW1lc3BhY2UgcHJlZml4ZXMgaW50byBDKysgaWRlbnRpZmllciBuYW1lcyBpcyBuZWNlc3NhcnkgdG8gZGlzdGluZ3Vpc2ggcmVtb3RlIG1ldGhvZHMgdGhhdA0KK3NoYXJlIHRoZSBzYW1lIG5hbWUgYnV0IGFyZSBwcm92aWRlZCBieSBzZXBhcmF0ZSBXZWIgc2VydmljZXMgYW5kL29yIG9yZ2FuaXphdGlvbnMuIENvbnNpZGVyIGZvciBleGFtcGxlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisvLyBDb250ZW50cyBvZiBmaWxlICJnZXRRdW90ZS5oIjogPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO25zMV9fZ2V0UXVvdGUoPGI+Y2hhcjwvYj4mbmJzcDsqc3ltYm9sLCA8Yj5mbG9hdDwvYj4mbmJzcDsmYW1wO1Jlc3VsdCk7IDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDtuczJfX2dldFF1b3RlKDxiPmNoYXI8L2I+Jm5ic3A7KnRpY2tlciwgPGI+Y2hhcjwvYj4mbmJzcDsqJmFtcDtxdW90ZSk7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitSZWNhbGwgdGhhdCB0aGUgbmFtZXNwYWNlIHByZWZpeCBpcyBhbHdheXMgc2VwYXJhdGVkIGZyb20gdGhlIG5hbWUgb2YgYSByZW1vdGUgbWV0aG9kIGJ5IGEgcGFpciBvZiB1bmRlcnNjb3JlcyAoPGk+X188L2k+KS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhpcyBleGFtcGxlIGVuYWJsZXMgYSBjbGllbnQgcHJvZ3JhbSB0byBjb25uZWN0IHRvIGEgKGh5cG90aGV0aWNhbCkgU3RvY2sgUXVvdGUgc2VydmljZSB3aXRoIHJlbW90ZSBtZXRob2RzIHRoYXQgY2FuIG9ubHkgYmUNCitkaXN0aW5ndWlzaGVkIGJ5IHRoZWlyIG5hbWVzcGFjZXMuIENvbnNlcXVlbnRseSwgdHdvIGRpZmZlcmVudCBuYW1lc3BhY2UgcHJlZml4ZXMgaGFkIHRvIGJlIHVzZWQgYXMgcGFydCBvZiB0aGUgcmVtb3RlIG1ldGhvZA0KK25hbWVzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgbmFtZXNwYWNlIHByZWZpeCBjb252ZW50aW9uIGNhbiBhbHNvIGJlIGFwcGxpZWQgdG8gPGk+PGI+Y2xhc3M8L2I+PC9pPiBkZWNsYXJhdGlvbnMgdGhhdCBjb250YWluIFNPQVAgY29tcG91bmQgdmFsdWVzDQordGhhdCBzaGFyZSB0aGUgc2FtZSBuYW1lIGJ1dCBoYXZlIGRpZmZlcmVudCBuYW1lc3BhY2VzIHRoYXQgcmVmZXIgdG8gZGlmZmVyZW50IFhNTCBTY2hlbWFzLiBGb3IgZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7PGZvbnQgY29sb3I9IiNGRjAwMDAiPmVfX0FkZHJlc3M8L2ZvbnQ+IC8vIGFuIGVsZWN0cm9uaWMgYWRkcmVzcyA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO2NoYXIgKmVtYWlsOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtjaGFyICp1cmw7IDxiciAvPg0KK307IDxiciAvPg0KKzxiPmNsYXNzPC9iPiZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5zX19BZGRyZXNzPC9mb250PiAvLyBhIHN0cmVldCBhZGRyZXNzIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Y2hhciAqc3RyZWV0OyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtpbnQgbnVtYmVyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtjaGFyICpjaXR5OyA8YnIgLz4NCit9Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIG5hbWVzcGFjZSBwcmVmaXggaXMgc2VwYXJhdGVkIGZyb20gdGhlIG5hbWUgb2YgYSBkYXRhIHR5cGUgYnkgYSBwYWlyIG9mIHVuZGVyc2NvcmVzICg8aT5fXzwvaT4pLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitBbiBpbnN0YW5jZSBvZiA8aT48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+ZV9fQWRkcmVzczwvZm9udD48L2k+IGlzIGVuY29kZWQgYnkgdGhlIGdlbmVyYXRlZCBzZXJpYWxpemVyIGZvciB0aGlzIHR5cGUgYXMgYW4gQWRkcmVzcyBlbGVtZW50IHdpdGggbmFtZXNwYWNlIHByZWZpeCA8aT48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+ZTwvZm9udD48L2k+Og0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwQjBEMCI+PHRyPjx0ZD48dHQ+DQorJmx0Ozxmb250IGNvbG9yPSIjRkYwMDAwIj5lOkFkZHJlc3M8L2ZvbnQ+IHhzaTp0eXBlPSI8Zm9udCBjb2xvcj0iI0ZGMDAwMCI+ZTpBZGRyZXNzPC9mb250PiImIzYyOyA8YnIgLz4NCismbHQ7ZW1haWwgeHNpOnR5cGU9InN0cmluZyImIzYyO21lQGhvbWUmbHQ7L2VtYWlsJiM2MjsgPGJyIC8+DQorJmx0O3VybCB4c2k6dHlwZT0ic3RyaW5nIiYjNjI7d3d3Lm1lLmNvbSZsdDsvdXJsJiM2MjsgPGJyIC8+DQorJmx0Oy88Zm9udCBjb2xvcj0iI0ZGMDAwMCI+ZTpBZGRyZXNzPC9mb250PiYjNjI7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvdHQ+DQorV2hpbGUgYW4gaW5zdGFuY2Ugb2YgPGk+PGZvbnQgY29sb3I9IiMwMDAwRkYiPnNfX0FkZHJlc3M8L2ZvbnQ+PC9pPiBpcyBlbmNvZGVkIGJ5IHRoZSBnZW5lcmF0ZWQgc2VyaWFsaXplciBmb3IgdGhpcyB0eXBlIGFzIGFuIEFkZHJlc3MgZWxlbWVudCB3aXRoIG5hbWVzcGFjZSBwcmVmaXggPGk+PGZvbnQgY29sb3I9IiMwMDAwRkYiPnM8L2ZvbnQ+PC9pPjoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEIwRDAiPjx0cj48dGQ+PHR0Pg0KKyZsdDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+czpBZGRyZXNzPC9mb250PiB4c2k6dHlwZT0iPGZvbnQgY29sb3I9IiMwMDAwRkYiPnM6QWRkcmVzczwvZm9udD4iJiM2MjsgPGJyIC8+DQorJmx0O3N0cmVldCB4c2k6dHlwZT0ic3RyaW5nIiYjNjI7VGVjaG5vbG9neSBEcml2ZSZsdDsvc3RyZWV0JiM2MjsgPGJyIC8+DQorJmx0O251bWJlciB4c2k6dHlwZT0iaW50IiYjNjI7NSZsdDsvbnVtYmVyJiM2MjsgPGJyIC8+DQorJmx0O2NpdHkgeHNpOnR5cGU9InN0cmluZyImIzYyO1NvZnRjaXR5Jmx0Oy9jaXR5JiM2MjsgPGJyIC8+DQorJmx0Oy88Zm9udCBjb2xvcj0iIzAwMDBGRiI+czpBZGRyZXNzPC9mb250PiYjNjI7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvdHQ+DQorVGhlIG5hbWVzcGFjZSBtYXBwaW5nIHRhYmxlIG9mIHRoZSBjbGllbnQgcHJvZ3JhbSBtdXN0IGhhdmUgZW50cmllcyBmb3IgPGk+PGZvbnQgY29sb3I9IiNGRjAwMDAiPmU8L2ZvbnQ+PC9pPiBhbmQgPGk+PGZvbnQgY29sb3I9IiMwMDAwRkYiPnM8L2ZvbnQ+PC9pPiB0aGF0IHJlZmVyIHRvIHRoZSBYTUwgU2NoZW1hcyBvZiB0aGUgZGF0YSB0eXBlczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+c3RydWN0PC9iPiZuYnNwO05hbWVzcGFjZSBuYW1lc3BhY2VzW10gPSA8YnIgLz4NCit7IC4uLiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7Ijxmb250IGNvbG9yPSIjRkYwMDAwIj5lPC9mb250PiIsICJodHRwOi8vd3d3Lm1lLmNvbS9zY2hlbWFzL2VsZWN0cm9uaWMtYWRkcmVzcyJ9LCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7Ijxmb250IGNvbG9yPSIjMDAwMEZGIj5zPC9mb250PiIsICJodHRwOi8vd3d3Lm1lLmNvbS9zY2hlbWFzL3N0cmVldC1hZGRyZXNzIn0sIDxiciAvPg0KKy4uLg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+IA0KK1RoaXMgdGFibGUgaXMgcmVxdWlyZWQgdG8gYmUgcGFydCBvZiB0aGUgY2xpZW50IGFwcGxpY2F0aW9uIHRvIGFsbG93IGFjY2VzcyBieSB0aGUgc2VyaWFsaXplcnMgYW5kIGRlc2VyaWFsaXplcnMgb2YgdGhlIGRhdGEgdHlwZXMgYXQgcnVuIHRpbWUuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkJICAgICAgPGg0PjxhIG5hbWU9InR0aF9zRWM3LjEuNCI+DQorNy4xLjQ8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPkhvdyB0byBHZW5lcmF0ZSBDKysgQ2xpZW50IFByb3h5IENsYXNzZXM8L2ZvbnQ+PC9oND48YSBuYW1lPSJzZWM6cHJveHkiPg0KKzwvYT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorUHJveHkgY2xhc3NlcyBmb3IgQysrIGNsaWVudCBhcHBsaWNhdGlvbnMgYXJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBnU09BUCBjb21waWxlci4NCitUbyBpbGx1c3RyYXRlIHRoZSBnZW5lcmF0aW9uIG9mIGEgcHJveHkgY2xhc3MsIHRoZSA8aT5nZXRRdW90ZS5oPC9pPiBoZWFkZXIgZmlsZSBleGFtcGxlIG9mIHRoZSBwcmV2aW91cyBzZWN0aW9uIGlzIGF1Z21lbnRlZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3RpdmVzIHRvIGVuYWJsZSB0aGUgZ1NPQVAgY29tcGlsZXIgdG8NCitnZW5lcmF0ZSB0aGUgcHJveHkgY2xhc3MuIFNpbWlsYXIgZGlyZWN0aXZlcyBhcmUgaW5jbHVkZWQgaW4gdGhlIGhlYWRlciBmaWxlIGJ5IHRoZSBXU0RMIGltcG9ydGVyLg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisvLyBDb250ZW50IG9mIGZpbGUgPHR0PiJnZXRRdW90ZS5oIjwvdHQ+OiA8YnIgLz4NCisvL2dzb2FwIG5zMSBzZXJ2aWNlIG5hbWU6IFF1b3RlIDxiciAvPg0KKy8vZ3NvYXAgbnMxIHNlcnZpY2UgbG9jYXRpb246IGh0dHA6Ly9zZXJ2aWNlcy54bWV0aG9kcy5uZXQvc29hcCA8YnIgLz4NCisvL2dzb2FwIG5zMSBzZXJ2aWNlIG5hbWVzcGFjZTogdXJuOnhtZXRob2RzLWRlbGF5ZWQtcXVvdGVzIDxiciAvPg0KKy8vZ3NvYXAgbnMxIHNlcnZpY2Ugc3R5bGU6IHJwYyA8YnIgLz4NCisvL2dzb2FwIG5zMSBzZXJ2aWNlIGVuY29kaW5nOiBlbmNvZGVkIDxiciAvPg0KKy8vZ3NvYXAgbnMxIHNlcnZpY2UgbWV0aG9kLWFjdGlvbjogZ2V0UXVvdGUgIiIgPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO25zMV9fZ2V0UXVvdGUoPGI+Y2hhcjwvYj4mbmJzcDsqc3ltYm9sLCA8Yj5mbG9hdDwvYj4mbmJzcDsmYW1wO1Jlc3VsdCk7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgZmlyc3QgdGhyZWUgZGlyZWN0aXZlcyBwcm92aWRlIHRoZSBzZXJ2aWNlIG5hbWUgd2hpY2ggaXMgdXNlZCB0byBuYW1lIHRoZSBwcm94eSBjbGFzcywgdGhlIHNlcnZpY2UgbG9jYXRpb24gKGVuZHBvaW50KSwgYW5kDQordGhlIHNjaGVtYS4gVGhlIGZvcnRoIGFuZCBmaWZ0aCBkaXJlY3RpdmVzIHNwZWNpZnkgdGhhdCBTT0FQIFJQQyBlbmNvZGluZyBpcyB1c2VkLCB3aGljaCBpcyByZXF1aXJlZCBieSB0aGlzIHNlcnZpY2UuIFRoZSBsYXN0IGRpcmVjdGl2ZSBkZWZpbmVzIHRoZSBvcHRpb25hbCBTT0FQQWN0aW9uLCB3aGljaCBpcyBhIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggU09BUCAxLjEgb3BlcmF0aW9ucy4NCitUaGlzIGRpcmVjdGl2ZSBtdXN0IGJlIHByb3ZpZGVkIGZvciBlYWNoIHJlbW90ZSBtZXRob2Qgd2hlbiB0aGUgU09BUEFjdGlvbiBpcyByZXF1aXJlZC4NCitDb21waWxhdGlvbiBvZiB0aGlzIGhlYWRlciBmaWxlIHdpdGggdGhlIGdTT0FQIGNvbXBpbGVyIDxpPnNvYXBjcHAyPC9pPiBjcmVhdGVzIGEgbmV3IGZpbGUgPGk+c29hcFF1b3RlUHJveHkuaDwvaT4gd2l0aCB0aGUNCitmb2xsb3dpbmcgY29udGVudHM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKyNpbmNsdWRlICJzb2FwSC5oIiA8YnIgLz4NCis8Yj5jbGFzczwvYj4mbmJzcDtRdW90ZSA8YnIgLz4NCit7IDxiPnB1YmxpYzwvYj46IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5jb25zdDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyplbmRwb2ludDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7UXVvdGUoKSB7IHNvYXAgPSBzb2FwX25ldygpOyBlbmRwb2ludCA9ICJodHRwOi8vc2VydmljZXMueG1ldGhvZHMubmV0L3NvYXAiOyB9OyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt+UXVvdGUoKSB7IDxiPmlmPC9iPiZuYnNwOyhzb2FwKSB7IHNvYXBfZGVzdHJveShzb2FwKTsgc29hcF9lbmQoc29hcCk7IHNvYXBfZG9uZShzb2FwKTsgZnJlZSgodm9pZCopc29hcCk7IH19OyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7Z2V0UXVvdGUoPGI+Y2hhcjwvYj4mbmJzcDsqc3ltYm9sLCA8Yj5mbG9hdDwvYj4mbmJzcDsmYW1wO1Jlc3VsdCkgeyA8Yj5yZXR1cm48L2I+Jm5ic3A7c29hcCA/IHNvYXBfY2FsbF9uczFfX2dldFF1b3RlKHNvYXAsIGVuZHBvaW50LCAiIiwgc3ltYm9sLCBSZXN1bHQpIDogU09BUF9FT007IH07IDxiciAvPg0KK307DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgZ1NPQVAgZW52aXJvbm1lbnQgYW5kIGVuZHBvaW50IGFyZSBkZWNsYXJlZCBwdWJsaWMgdG8gZW5hYmxlIGFjY2VzcyBmb3IgcnVuLXRpbWUgY3VzdG9taXphdGlvbi4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhpcyBnZW5lcmF0ZWQgcHJveHkgY2xhc3MgY2FuIGJlIGluY2x1ZGVkIGludG8gYSBjbGllbnQgYXBwbGljYXRpb24gdG9nZXRoZXIgd2l0aCB0aGUgZ2VuZXJhdGVkIG5hbWVzcGFjZSB0YWJsZSBhcyBzaG93biBpbiB0aGlzIGV4YW1wbGU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKyNpbmNsdWRlICJzb2FwUXVvdGVQcm94eS5oIgkvLyBnZXQgcHJveHkgPGJyIC8+DQorI2luY2x1ZGUgIlF1b3RlLm5zbWFwIgkJLy8gZ2V0IG5hbWVzcGFjZSBiaW5kaW5ncyA8YnIgLz4NCis8Yj5pbnQ8L2I+Jm5ic3A7bWFpbigpIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7UXVvdGUgcTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+ZmxvYXQ8L2I+Jm5ic3A7cjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KHEubnMxX19nZXRRdW90ZSgiSUJNIiwgcikgPT0gU09BUF9PSykgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c3RkOjpjb3V0ICAmbHQ7Jmx0OyAgciAgJmx0OyZsdDsgIHN0ZDo6ZW5kbDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+ZWxzZTwvYj48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwX3ByaW50X2ZhdWx0KHEuc29hcCwgc3RkZXJyKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cmV0dXJuPC9iPiZuYnNwOzA7IDxiciAvPg0KK30NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoZSA8aT5RdW90ZTwvaT4gY29uc3RydWN0b3IgYWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyBhIGdTT0FQIGVudmlyb25tZW50IGZvciB0aGUgaW5zdGFuY2UuDQorQWxsIHRoZSBIVFRQIGFuZCBTT0FQL1hNTCBwcm9jZXNzaW5nIGlzIGhpZGRlbiBhbmQgcGVyZm9ybWVkIG9uIHRoZSBiYWNrZ3JvdW5kLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitZb3UgY2FuIHVzZSBzb2FwY3BwMiBjb21waWxlciBvcHRpb24gPGk+LW48L2k+IHRvZ2V0aGVyIHdpdGggPGk+LXA8L2k+IHRvIGNyZWF0ZSBhIGxvY2FsIG5hbWVzcGFjZXMgdGFibGUgdG8gYXZvaWQgbGluayBjb25mbGljdHMgd2hlbiB5b3UgbmVlZCBtdWx0aXBsZSBuYW1lc3BhY2UgdGFibGVzIG9yIG5lZWQgdG8gY29tYmluZSBtdWx0aXBsZSBjbGllbnRzLCBzZWUgYWxzbyBTZWN0aW9ucyZuYnNwOzxhIGhyZWY9IiNzZWM6b3B0aW9ucyI+OC4xPC9hPiBhbmQmbmJzcDs8YSBocmVmPSIjc2VjOmR5bGlicyI+MTguMzQ8L2E+LCBhbmQgeW91IGNhbiB1c2UgYSBDKysgY29kZSA8aT48Yj5uYW1lc3BhY2U8L2I+PC9pPiB0byBjcmVhdGUgYSBuYW1lc3BhY2UgcXVhbGlmaWVkIHByb3h5IGNsYXNzLCBzZWUgU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6Y29kZW5hbWVzcGFjZSI+MTguMzM8L2E+Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJCSAgICAgIDxoND48YSBuYW1lPSJ0dGhfc0VjNy4xLjUiPg0KKzcuMS41PC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5YU0QgVHlwZSBFbmNvZGluZyBDb25zaWRlcmF0aW9uczwvZm9udD48L2g0PjxhIG5hbWU9InNlYzplbmNvZGluZyI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitNYW55IFNPQVAgc2VydmljZXMgcmVxdWlyZSB0aGUgZXhwbGljaXQgdXNlIG9mIFhNTCBTY2hlbWEgdHlwZXMgaW4gdGhlIFNPQVAgcGF5bG9hZC4gVGhlIGRlZmF1bHQgZW5jb2RpbmcsIHdoaWNoIGlzIGFsc28gYWRvcHRlZA0KK2J5IHRoZSBnU09BUCBjb21waWxlciwgYXNzdW1lcyBTT0FQIFJQQyBlbmNvZGluZyB3aGljaCBvbmx5IHJlcXVpcmVzIHRoZSB1c2Ugb2YgdHlwZXMgdG8gaGFuZGxlIHBvbHltb3JwaGljIGNhc2VzLg0KK05ldmVydGhlbGVzcywgdGhlIHVzZSBvZiBYU0QgdHlwZWQgbWVzc2FnZXMgaXMgYWR2aXNlZCB0byBpbXByb3ZlIGludGVyb3BlcmFiaWxpdHkuDQorWFNEIHR5cGVzIGFyZSBpbnRyb2R1Y2VkIHdpdGggPGk+PGI+dHlwZWRlZjwvYj48L2k+IGRlZmluaXRpb25zIGluDQordGhlIGhlYWRlciBmaWxlIGlucHV0IHRvIHRoZSBnU09BUCBjb21waWxlci4gVGhlIHR5cGUgbmFtZSBkZWZpbmVkIGJ5IGEgPGk+PGI+dHlwZWRlZjwvYj48L2k+IGRlZmluaXRpb24gY29ycmVzcG9uZHMgdG8gYW4gWE1MIFNjaGVtYQ0KK3R5cGUgKFhTRCB0eXBlKS4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgPGk+PGI+dHlwZWRlZjwvYj48L2k+IGRlY2xhcmF0aW9ucw0KK2RlZmluZSB2YXJpb3VzIGJ1aWx0LWluIFhTRCB0eXBlcyBpbXBsZW1lbnRlZCBhcyBwcmltaXRpdmUgQy9DKysgdHlwZXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vIENvbnRlbnRzIG9mIGhlYWRlciBmaWxlOiA8YnIgLz4NCisuLi4gPGJyIC8+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyp4c2RfX3N0cmluZzsgLy8gZW5jb2RlIHhzZF9fc3RyaW5nIHZhbHVlIGFzIHRoZSA8c3BhbiBjbGFzcz0icm9tYW4iPjx0dD54c2Q6c3RyaW5nPC90dD48L3NwYW4+IHNjaGVtYSB0eXBlIDxiciAvPg0KKzxiPnR5cGVkZWY8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqeHNkX19hbnlVUkk7IC8vIGVuY29kZSB4c2RfX2FueVVSSSB2YWx1ZSBhcyB0aGUgPHNwYW4gY2xhc3M9InJvbWFuIj48dHQ+eHNkOmFueVVSSTwvdHQ+PC9zcGFuPiBzY2hlbWEgdHlwZSA8YnIgLz4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmZsb2F0PC9iPiZuYnNwO3hzZF9fZmxvYXQ7IC8vIGVuY29kZSB4c2RfX2Zsb2F0IHZhbHVlIGFzIHRoZSA8c3BhbiBjbGFzcz0icm9tYW4iPjx0dD54c2Q6ZmxvYXQ8L3R0Pjwvc3Bhbj4gc2NoZW1hIHR5cGUgPGJyIC8+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5sb25nPC9iPiZuYnNwO3hzZF9faW50OyAvLyBlbmNvZGUgeHNkX19pbnQgdmFsdWUgYXMgdGhlIDxzcGFuIGNsYXNzPSJyb21hbiI+PHR0PnhzZDppbnQ8L3R0Pjwvc3Bhbj4gc2NoZW1hIHR5cGUgPGJyIC8+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5ib29sPC9iPiZuYnNwO3hzZF9fYm9vbGVhbjsgLy8gZW5jb2RlIHhzZF9fYm9vbGVhbiB2YWx1ZSBhcyB0aGUgPHNwYW4gY2xhc3M9InJvbWFuIj48dHQ+eHNkOmJvb2xlYW48L3R0Pjwvc3Bhbj4gc2NoZW1hIHR5cGUgPGJyIC8+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj51bnNpZ25lZDwvYj4mbmJzcDs8Yj5sb25nPC9iPiZuYnNwOzxiPmxvbmc8L2I+Jm5ic3A7eHNkX19wb3NpdGl2ZUludGVnZXI7IC8vIGVuY29kZSB4c2RfX3Bvc2l0aXZlSW50ZWdlciB2YWx1ZSBhcyB0aGUgPHNwYW4gY2xhc3M9InJvbWFuIj48dHQ+eHNkOnBvc2l0aXZlSW50ZWdlcjwvdHQ+PC9zcGFuPiAgc2NoZW1hIHR5cGU8YnIgLz4NCisuLi4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoaXMgc2ltcGxlIG1lY2hhbmlzbSBpbmZvcm1zIHRoZSBnU09BUCBjb21waWxlciB0byBnZW5lcmF0ZSBzZXJpYWxpemVycyBhbmQgZGVzZXJpYWxpemVycyB0aGF0IGV4cGxpY2l0bHkgZW5jb2RlIGFuZCBkZWNvZGUgdGhlDQorcHJpbWl0aXZlIEMrKyB0eXBlcyBhcyBidWlsdC1pbiBwcmltaXRpdmUgWFNEIHR5cGVzIHdoZW4gdGhlIDxpPnR5cGVkZWY8L2k+ZWQgdHlwZSBpcyB1c2VkIGluIHRoZSBwYXJhbWV0ZXIgc2lnbmF0dXJlIG9mIGENCityZW1vdGUgbWV0aG9kIChvciB3aGVuIHVzZWQgbmVzdGVkIHdpdGhpbiBzdHJ1Y3RzLCBjbGFzc2VzLCBhbmQgYXJyYXlzKS4gIEF0IHRoZSBzYW1lIHRpbWUsIHRoZSB1c2Ugb2YgPGk+PGI+dHlwZWRlZjwvYj48L2k+IA0KK2RvZXMgbm90IGZvcmNlIGFueSByZWNvZGluZyBvZiBhIEMrKyBjbGllbnQgb3IgV2ViIHNlcnZpY2UgYXBwbGljYXRpb24gYXMgdGhlIGludGVybmFsIEMrKyB0eXBlcyB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbg0KK2FyZSBub3QgcmVxdWlyZWQgdG8gYmUgY2hhbmdlZCAoYnV0IHN0aWxsIGhhdmUgdG8gYmUgcHJpbWl0aXZlIEMrKyB0eXBlcywgc2VlIFNlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOnByaW1jbGFzcyI+MTAuMi4yPC9hPiBmb3IgYWx0ZXJuYXRpdmUgY2xhc3MNCitpbXBsZW1lbnRhdGlvbnMgb2YgcHJpbWl0aXZlIFhTRCB0eXBlcyB3aGljaCBhbGxvd3MgZm9yIHRoZSBtYXJzaGFsbGluZyBvZiBwb2x5bW9ycGhpYyBwcmltaXRpdmUgdHlwZXMpLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJCSAgICAgIDxoND48YSBuYW1lPSJ0dGhfc0VjNy4xLjYiPg0KKzcuMS42PC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5FeGFtcGxlPC9mb250PjwvaDQ+PGEgbmFtZT0ic2VjOmV4YW1wbGUzIj4NCis8L2E+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1JlY29uc2lkZXIgdGhlIDxpPmdldFF1b3RlPC9pPiBleGFtcGxlLCBub3cgcmV3cml0dGVuIHdpdGggZXhwbGljaXQgWFNEIHR5cGVzIHRvIGlsbHVzdHJhdGUgdGhlIGVmZmVjdDoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorLy8gQ29udGVudHMgb2YgZmlsZSAiZ2V0UXVvdGUuaCI6IDxiciAvPg0KKzxiPnR5cGVkZWY8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqPGZvbnQgY29sb3I9IiNGRjAwMDAiPnhzZF9fc3RyaW5nPC9mb250PjsgPGJyIC8+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5mbG9hdDwvYj4mbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+eHNkX19mbG9hdDwvZm9udD47IDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDs8Zm9udCBjb2xvcj0iIzAwRkYwMCI+bnMxX19nZXRRdW90ZTwvZm9udD4oPGZvbnQgY29sb3I9IiNGRjAwMDAiPnhzZF9fc3RyaW5nPC9mb250PiA8Zm9udCBjb2xvcj0iI0ZGMDBGRiI+c3ltYm9sPC9mb250PiwgPGZvbnQgY29sb3I9IiMwMDAwRkYiPnhzZF9fZmxvYXQ8L2ZvbnQ+ICZhbXA7PGZvbnQgY29sb3I9IiMwMEZGRkYiPlJlc3VsdDwvZm9udD4pOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhpcyBoZWFkZXIgZmlsZSBpcyBjb21waWxlZCBieSB0aGUgZ1NPQVAgc3R1YiBhbmQgc2tlbGV0b24gY29tcGlsZXIgYW5kIHRoZSBjb21waWxlciBnZW5lcmF0ZXMgc291cmNlIGNvZGUgZm9yIHRoZSBmdW5jdGlvbg0KKzxpPnNvYXBfY2FsbF9uczFfX2dldFF1b3RlPC9pPiwgd2hpY2ggaXMgaWRlbnRpY2FsIHRvIHRoZSAib2xkIiBwcm94eToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+aW50PC9iPiZuYnNwO3NvYXBfY2FsbF9uczFfX2dldFF1b3RlKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj5jaGFyPC9iPiZuYnNwOypVUkwsIDxiPmNoYXI8L2I+Jm5ic3A7KmFjdGlvbiwgPGI+Y2hhcjwvYj4mbmJzcDsqc3ltYm9sLCA8Yj5mbG9hdDwvYj4mbmJzcDsmYW1wO1Jlc3VsdCk7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgY2xpZW50IGFwcGxpY2F0aW9uIGRvZXMgbm90IG5lZWQgdG8gYmUgcmV3cml0dGVuIGFuZCBjYW4gc3RpbGwgY2FsbCB0aGUgcHJveHkgdXNpbmcgdGhlICJvbGQiIHBhcmFtZXRlciBzaWduYXR1cmUuIEluIGNvbnRyYXN0IHRvDQordGhlIHByZXZpb3VzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzdHViIGhvd2V2ZXIsIHRoZSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgb2YgdGhlIGRhdGEgdHlwZXMgYnkgdGhlIHN0dWIgaGFzIGJlZW4gY2hhbmdlZCB0bw0KK2V4cGxpY2l0bHkgdXNlIHRoZSBYU0QgdHlwZXMgaW4gdGhlIG1lc3NhZ2UgcGF5bG9hZC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorRm9yIGV4YW1wbGUsIHdoZW4gdGhlIGNsaWVudCBhcHBsaWNhdGlvbiBjYWxscyB0aGUgcHJveHksIHRoZSBwcm94eSBwcm9kdWNlcyBhIFNPQVAgcmVxdWVzdCB3aXRoIGFuIDx0dD54c2Q6c3RyaW5nPC90dD46DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBCMEQwIj48dHI+PHRkPjx0dD4NCisuLi4gPGJyIC8+DQorJmx0O1NPQVAtRU5WOkJvZHkmIzYyOyA8YnIgLz4NCismbHQ7PGZvbnQgY29sb3I9IiMwMEZGMDAiPm5zMTpnZXRRdW90ZTwvZm9udD4mIzYyOyZsdDs8Zm9udCBjb2xvcj0iI0ZGMDBGRiI+c3ltYm9sPC9mb250PiB4c2k6dHlwZT0iPGZvbnQgY29sb3I9IiNGRjAwMDAiPnhzZDpzdHJpbmc8L2ZvbnQ+IiYjNjI7SUJNJmx0Oy88Zm9udCBjb2xvcj0iI0ZGMDBGRiI+c3ltYm9sPC9mb250PiYjNjI7IDxiciAvPg0KKyZsdDsvPGZvbnQgY29sb3I9IiMwMEZGMDAiPm5zMTpnZXRRdW90ZTwvZm9udD4mIzYyOyA8YnIgLz4NCismbHQ7L1NPQVAtRU5WOkJvZHkmIzYyOyA8YnIgLz4NCisuLi4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC90dD4NCitUaGUgc2VydmljZSByZXNwb25zZSBpczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEIwRDAiPjx0cj48dGQ+PHR0Pg0KKy4uLiA8YnIgLz4NCismbHQ7c29hcDpCb2R5JiM2MjsgPGJyIC8+DQorJmx0Ozxmb250IGNvbG9yPSIjMDBGRjAwIj5uOmdldFF1b3RlPC9mb250PlJlc3BvbnNlIHhtbG5zOm49InVybjp4bWV0aG9kcy1kZWxheWVkLXF1b3RlcyYjMTg3OyA8YnIgLz4NCismbHQ7PGZvbnQgY29sb3I9IiMwMEZGRkYiPlJlc3VsdDwvZm9udD4geHNpOnR5cGU9Ijxmb250IGNvbG9yPSIjMDAwMEZGIj54c2Q6ZmxvYXQ8L2ZvbnQ+JiMxODc7NDEuODEmbHQ7Lzxmb250IGNvbG9yPSIjMDBGRkZGIj5SZXN1bHQ8L2ZvbnQ+JiM2MjsgPGJyIC8+DQorJmx0Oy88Zm9udCBjb2xvcj0iIzAwRkYwMCI+bjpnZXRRdW90ZTwvZm9udD5SZXNwb25zZSYjNjI7IDxiciAvPg0KKyZsdDsvc29hcDpCb2R5JiM2MjsgPGJyIC8+DQorLi4uDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvdHQ+DQorVGhlIHZhbGlkYXRpb24gb2YgdGhpcyBzZXJ2aWNlIHJlc3BvbnNlIGJ5IHRoZSBzdHViIHJvdXRpbmUgdGFrZXMgcGxhY2UgYnkgbWF0Y2hpbmcgdGhlIG5hbWVzcGFjZSBuYW1lcyAoVVJJcykgdGhhdCBhcmUgYm91bmQgdG8gdGhlDQorPHR0PnhzZDwvdHQ+IG5hbWVzcGFjZSBwcmVmaXguIFRoZSBzdHViIGFsc28gZXhwZWN0cyB0aGUgPHR0PmdldFF1b3RlUmVzcG9uc2U8L3R0PiBlbGVtZW50IHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBVUkkNCis8dHQ+dXJuOnhtZXRob2RzLWRlbGF5ZWQtcXVvdGVzPC90dD4gdGhyb3VnaCB0aGUgYmluZGluZyBvZiB0aGUgbmFtZXNwYWNlIHByZWZpeCA8dHQ+bnMxPC90dD4gaW4gdGhlIG5hbWVzcGFjZSBtYXBwaW5nIHRhYmxlLiBUaGUNCitzZXJ2aWNlIHJlc3BvbnNlIHVzZXMgbmFtZXNwYWNlIHByZWZpeCA8dHQ+bjwvdHQ+IGZvciB0aGUgPHR0PmdldFF1b3RlUmVzcG9uc2U8L3R0PiBlbGVtZW50LiBUaGlzIG5hbWVzcGFjZSBwcmVmaXggaXMgYm91bmQgdG8gdGhlIHNhbWUNCitVUkkgPHR0PnVybjp4bWV0aG9kcy1kZWxheWVkLXF1b3RlczwvdHQ+IGFuZCB0aGVyZWZvcmUgdGhlIHNlcnZpY2UgcmVzcG9uc2UgaXMgYXNzdW1lZCB0byBiZSB2YWxpZC4gIFRoZSByZXNwb25zZSBpcw0KK3JlamVjdGVkIGFuZCBhIFNPQVAgZmF1bHQgaXMgZ2VuZXJhdGVkIHdoZW4gdGhlIFVSSXMgZG8gbm90IG1hdGNoLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJCSAgICAgIDxoND48YSBuYW1lPSJ0dGhfc0VjNy4xLjciPg0KKzcuMS43PC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5Ib3cgdG8gQ2hhbmdlIHRoZSBSZXNwb25zZSBFbGVtZW50IE5hbWU8L2ZvbnQ+PC9oND48YSBuYW1lPSJzZWM6cmVzcG9uc2UiPg0KKzwvYT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlcmUgaXMgbm8gc3RhbmRhcmRpemVkIGNvbnZlbnRpb24gZm9yIHRoZSByZXNwb25zZSBlbGVtZW50IG5hbWUgaW4gYSBTT0FQIHJlc3BvbnNlIG1lc3NhZ2UsIGFsdGhvdWdoIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlIHJlc3BvbnNlDQorZWxlbWVudCBuYW1lIGlzIHRoZSBtZXRob2QgbmFtZSBlbmRpbmcgd2l0aCAiPHR0PlJlc3BvbnNlPC90dD4iLiBGb3IgZXhhbXBsZSwgdGhlIHJlc3BvbnNlIGVsZW1lbnQgb2YgPHR0PmdldFF1b3RlPC90dD4gaXMNCis8dHQ+Z2V0UXVvdGVSZXNwb25zZTwvdHQ+Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgcmVzcG9uc2UgZWxlbWVudCBuYW1lIGNhbiBiZSBzcGVjaWZpZWQgZXhwbGljaXRseSB1c2luZyBhIDxpPjxiPnN0cnVjdDwvYj48L2k+IG9yIDxpPjxiPmNsYXNzPC9iPjwvaT4gZGVjbGFyYXRpb24gaW4gdGhlIGhlYWRlciBmaWxlLiBUaGUNCis8aT48Yj5zdHJ1Y3Q8L2I+PC9pPiBvciA8aT48Yj5jbGFzczwvYj48L2k+IG5hbWUgcmVwcmVzZW50cyB0aGUgU09BUCByZXNwb25zZSBlbGVtZW50IG5hbWUgdXNlZCBieSB0aGUgc2VydmljZS4gQ29uc2VxdWVudGx5LCB0aGUgb3V0cHV0DQorcGFyYW1ldGVyIG9mIHRoZSByZW1vdGUgbWV0aG9kIG11c3QgYmUgZGVjbGFyZWQgYXMgYSBmaWVsZCBvZiB0aGUgPGk+PGI+c3RydWN0PC9iPjwvaT4gb3IgPGk+PGI+Y2xhc3M8L2I+PC9pPi4gIFRoZSB1c2Ugb2YgYSA8aT48Yj5zdHJ1Y3Q8L2I+PC9pPiBvciBhDQorPGk+PGI+Y2xhc3M8L2I+PC9pPiBmb3IgdGhlIHNlcnZpY2UgcmVzcG9uc2UgaXMgZnVsbHkgU09BUCAxLjEgY29tcGxpYW50LiBJbiBmYWN0LCB0aGUgYWJzZW5jZSBvZiBhIDxpPjxiPnN0cnVjdDwvYj48L2k+IG9yIDxpPjxiPmNsYXNzPC9iPjwvaT4NCitpbmRpY2F0ZXMgdG8gdGhlIGdTT0FQIGNvbXBpbGVyIHRvIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgYSA8aT5zdHJ1Y3Q8L2k+IGZvciB0aGUgcmVzcG9uc2Ugd2hpY2ggaXMgaW50ZXJuYWxseSB1c2VkIGJ5IGEgc3R1Yi4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCQkgICAgICA8aDQ+PGEgbmFtZT0idHRoX3NFYzcuMS44Ij4NCis3LjEuODwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+RXhhbXBsZTwvZm9udD48L2g0PjxhIG5hbWU9InNlYzpleGFtcGxlNCI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitSZWNvbnNpZGVyIHRoZSA8aT5nZXRRdW90ZTwvaT4gcmVtb3RlIG1ldGhvZCBzcGVjaWZpY2F0aW9uIHdoaWNoIGNhbiBiZSByZXdyaXR0ZW4gd2l0aCBhbiBleHBsaWNpdCBkZWNsYXJhdGlvbiBvZiBhIFNPQVAgcmVzcG9uc2UNCitlbGVtZW50IGFzIGZvbGxvd3M6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vIENvbnRlbnRzIG9mICJnZXRRdW90ZS5oIjogPGJyIC8+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyo8Zm9udCBjb2xvcj0iI0ZGMDAwMCI+eHNkX19zdHJpbmc8L2ZvbnQ+OyA8YnIgLz4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmZsb2F0PC9iPiZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj54c2RfX2Zsb2F0PC9mb250PjsgPGJyIC8+DQorPGI+c3RydWN0PC9iPiZuYnNwOzxmb250IGNvbG9yPSIjRkZGRjAwIj5uczFfX2dldFF1b3RlUmVzcG9uc2U8L2ZvbnQ+IHs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+eHNkX19mbG9hdDwvZm9udD4gPGZvbnQgY29sb3I9IiMwMEZGRkYiPlJlc3VsdDwvZm9udD47fTsgPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwOzxmb250IGNvbG9yPSIjMDBGRjAwIj5uczFfX2dldFF1b3RlPC9mb250Pig8Zm9udCBjb2xvcj0iI0ZGMDAwMCI+eHNkX19zdHJpbmc8L2ZvbnQ+IDxmb250IGNvbG9yPSIjRkYwMEZGIj5zeW1ib2w8L2ZvbnQ+LCA8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7PGZvbnQgY29sb3I9IiNGRkZGMDAiPm5zMV9fZ2V0UXVvdGVSZXNwb25zZTwvZm9udD4gJmFtcDtyKTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoZSBTT0FQIHJlcXVlc3QgaXMgdGhlIHNhbWUgYXMgYmVmb3JlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwQjBEMCI+PHRyPjx0ZD48dHQ+DQorLi4uIDxiciAvPg0KKyZsdDtTT0FQLUVOVjpCb2R5JiM2MjsgPGJyIC8+DQorJmx0Ozxmb250IGNvbG9yPSIjMDBGRjAwIj5uczE6Z2V0UXVvdGU8L2ZvbnQ+JiM2MjsmbHQ7PGZvbnQgY29sb3I9IiNGRjAwRkYiPnN5bWJvbDwvZm9udD4geHNpOnR5cGU9Ijxmb250IGNvbG9yPSIjRkYwMDAwIj54c2Q6c3RyaW5nPC9mb250PiImIzYyO0lCTSZsdDsvPGZvbnQgY29sb3I9IiNGRjAwRkYiPnN5bWJvbDwvZm9udD4mIzYyOyA8YnIgLz4NCismbHQ7Lzxmb250IGNvbG9yPSIjMDBGRjAwIj5uczE6Z2V0UXVvdGU8L2ZvbnQ+JiM2MjsgPGJyIC8+DQorJmx0Oy9TT0FQLUVOVjpCb2R5JiM2MjsgPGJyIC8+DQorLi4uDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvdHQ+DQorVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUgc2VydmljZSByZXNwb25zZSBpcyByZXF1aXJlZCB0byBtYXRjaCB0aGUgc3BlY2lmaWVkIDxpPmdldFF1b3RlUmVzcG9uc2U8L2k+IG5hbWUgYW5kIGl0cyBuYW1lc3BhY2UgVVJJOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwQjBEMCI+PHRyPjx0ZD48dHQ+DQorLi4uIDxiciAvPg0KKyZsdDtzb2FwOkJvZHkmIzYyOyA8YnIgLz4NCismbHQ7PGZvbnQgY29sb3I9IiNGRkZGMDAiPm46Z2V0UXVvdGVSZXNwb25zZTwvZm9udD4geG1sbnM6bj0ndXJuOnhtZXRob2RzLWRlbGF5ZWQtcXVvdGVzJyYjNjI7IDxiciAvPg0KKyZsdDs8Zm9udCBjb2xvcj0iIzAwRkZGRiI+UmVzdWx0PC9mb250PiB4c2k6dHlwZT0nPGZvbnQgY29sb3I9IiMwMDAwRkYiPnhzZDpmbG9hdDwvZm9udD4nJiM2Mjs0MS44MSZsdDsvPGZvbnQgY29sb3I9IiMwMEZGRkYiPlJlc3VsdDwvZm9udD4mIzYyOyA8YnIgLz4NCismbHQ7Lzxmb250IGNvbG9yPSIjRkZGRjAwIj5uOmdldFF1b3RlUmVzcG9uc2U8L2ZvbnQ+JiM2MjsgPGJyIC8+DQorJmx0Oy9zb2FwOkJvZHkmIzYyOyA8YnIgLz4NCisuLi4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC90dD4NCitUaGlzIHVzZSBvZiBhIDxpPjxiPnN0cnVjdDwvYj48L2k+IG9yIDxpPjxiPmNsYXNzPC9iPjwvaT4gZW5hYmxlcyB0aGUgYWRhcHRhdGlvbiBvZiB0aGUgZGVmYXVsdCBTT0FQIHJlc3BvbnNlIGVsZW1lbnQgbmFtZSBhbmQvb3IgbmFtZXNwYWNlIFVSSSB3aGVuIHJlcXVpcmVkLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitOb3RlIHRoYXQgdGhlIDxpPjxiPnN0cnVjdDwvYj48L2k+IChvciA8aT48Yj5jbGFzczwvYj48L2k+KSBkZWNsYXJhdGlvbiBtYXkgYXBwZWFyIHdpdGhpbiB0aGUgZnVuY3Rpb24gcHJvdG90eXBlIGRlY2xhcmF0aW9uLiBGb3IgZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorLy8gQ29udGVudHMgb2YgImdldFF1b3RlLmgiOiA8YnIgLz4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7Kjxmb250IGNvbG9yPSIjRkYwMDAwIj54c2RfX3N0cmluZzwvZm9udD47IDxiciAvPg0KKzxiPnR5cGVkZWY8L2I+Jm5ic3A7PGI+ZmxvYXQ8L2I+Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPnhzZF9fZmxvYXQ8L2ZvbnQ+OyA8YnIgLz4NCis8Yj5pbnQ8L2I+Jm5ic3A7PGZvbnQgY29sb3I9IiMwMEZGMDAiPm5zMV9fZ2V0UXVvdGU8L2ZvbnQ+KDxmb250IGNvbG9yPSIjRkYwMDAwIj54c2RfX3N0cmluZzwvZm9udD4gPGZvbnQgY29sb3I9IiNGRjAwRkYiPnN5bWJvbDwvZm9udD4sIDxiPnN0cnVjdDwvYj4mbmJzcDs8Zm9udCBjb2xvcj0iI0ZGRkYwMCI+bnMxX19nZXRRdW90ZVJlc3BvbnNlPC9mb250PiB7PGZvbnQgY29sb3I9IiMwMDAwRkYiPnhzZF9fZmxvYXQ8L2ZvbnQ+IDxmb250IGNvbG9yPSIjMDBGRkZGIj5SZXN1bHQ8L2ZvbnQ+O30gJmFtcDtyKTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoaXMgZXhhbXBsZSBjb21iaW5lcyB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIHJlc3BvbnNlIGVsZW1lbnQgb2YgdGhlIHJlbW90ZSBtZXRob2Qgd2l0aCB0aGUgZnVuY3Rpb24gcHJvdG90eXBlIG9mIHRoZSByZW1vdGUgbWV0aG9kLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJCSAgICAgIDxoND48YSBuYW1lPSJ0dGhfc0VjNy4xLjkiPg0KKzcuMS45PC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5Ib3cgdG8gU3BlY2lmeSBNdWx0aXBsZSBPdXRwdXQgUGFyYW1ldGVyczwvZm9udD48L2g0PjxhIG5hbWU9InNlYzptdWx0aXBsZSI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgZ1NPQVAgc3R1YiBhbmQgc2tlbGV0b24gY29tcGlsZXIgdXNlcyB0aGUgY29udmVudGlvbiB0aGF0IHRoZSANCis8Yj5sYXN0IHBhcmFtZXRlcjwvYj4gb2YgdGhlIGZ1bmN0aW9uIHByb3RvdHlwZSBkZWNsYXJhdGlvbiBvZiBhIHJlbW92ZSBtZXRob2QgaW4gYSBoZWFkZXIgZmlsZQ0KK2lzIGFsc28gdGhlIDxiPm9ubHkgc2luZ2xlIG91dHB1dCBwYXJhbWV0ZXI8L2I+IG9mIHRoZSBtZXRob2QuDQorQWxsIG90aGVyIHBhcmFtZXRlcnMgYXJlIGNvbnNpZGVyZWQgaW5wdXQgcGFyYW1ldGVycyBvZiB0aGUgcmVtb3RlIG1ldGhvZC4gVG8gc3BlY2lmeSBhIHJlbW90ZSBtZXRob2QNCit3aXRoIDxiPm11bHRpcGxlIG91dHB1dCBwYXJhbWV0ZXJzPC9iPiwgYSA8aT48Yj5zdHJ1Y3Q8L2I+PC9pPiBvciA8aT48Yj5jbGFzczwvYj48L2k+IG11c3QgYmUgZGVjbGFyZWQgZm9yIHRoZSByZW1vdGUgbWV0aG9kIHJlc3BvbnNlLCBzZWUNCithbHNvJm5ic3A7PGEgaHJlZj0iI3NlYzpyZXNwb25zZSI+Ny4xLjc8L2E+LiAgVGhlIGZpZWxkcyBvZiB0aGUgPGk+PGI+c3RydWN0PC9iPjwvaT4gb3IgPGk+PGI+Y2xhc3M8L2I+PC9pPiBhcmUgdGhlIG91dHB1dCBwYXJhbWV0ZXJzIG9mIHRoZSByZW1vdGUgbWV0aG9kLg0KK0JvdGggdGhlIG9yZGVyIG9mIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGluIHRoZSBmdW5jdGlvbiBwcm90b3R5cGUgYW5kIHRoZSBvcmRlciBvZiB0aGUgb3V0cHV0IHBhcmFtZXRlcnMgKHRoZSBmaWVsZHMgaW4gdGhlDQorPGk+PGI+c3RydWN0PC9iPjwvaT4gb3IgPGk+PGI+Y2xhc3M8L2I+PC9pPikgaXMgbm90IHNpZ25pZmljYW50LiBIb3dldmVyLCB0aGUgU09BUCAxLjEgc3BlY2lmaWNhdGlvbiBzdGF0ZXMgdGhhdCBpbnB1dCBhbmQgb3V0cHV0IHBhcmFtZXRlcnMgbWF5IGJlDQordHJlYXRlZCBhcyBoYXZpbmcgYW5vbnltb3VzIHBhcmFtZXRlciBuYW1lcyB3aGljaCByZXF1aXJlcyBhIHBhcnRpY3VsYXIgb3JkZXJpbmcsIHNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzphbm9ueW1vdXMiPjcuMS4xMzwvYT4uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkJICAgICAgPGg0PjxhIG5hbWU9InR0aF9zRWM3LjEuMTAiPg0KKzcuMS4xMDwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+RXhhbXBsZTwvZm9udD48L2g0PjxhIG5hbWU9InNlYzpleGFtcGxlNSI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitBcyBhbiBleGFtcGxlLCBjb25zaWRlciBhIGh5cG90aGV0aWNhbCByZW1vdGUgbWV0aG9kIDxpPmdldE5hbWVzPC9pPiB3aXRoIGEgc2luZ2xlIGlucHV0IHBhcmFtZXRlciA8aT48Zm9udCBjb2xvcj0iI0ZGMDBGRiI+U1NOPC9mb250PjwvaT4gDQorYW5kIHR3byBvdXRwdXQgcGFyYW1ldGVycyA8aT48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Zmlyc3Q8L2ZvbnQ+PC9pPiBhbmQgPGk+PGZvbnQgY29sb3I9IiMwMDAwRkYiPmxhc3Q8L2ZvbnQ+PC9pPi4gVGhpcyBjYW4gYmUgc3BlY2lmaWVkIGFzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisvLyBDb250ZW50cyBvZiBmaWxlICJnZXROYW1lcy5oIjogPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwOzxmb250IGNvbG9yPSIjMDBGRjAwIj5uczNfX2dldE5hbWVzPC9mb250Pig8Yj5jaGFyPC9iPiZuYnNwOyo8Zm9udCBjb2xvcj0iI0ZGMDBGRiI+U1NOPC9mb250PiwgPGI+c3RydWN0PC9iPiZuYnNwOzxmb250IGNvbG9yPSIjRkZGRjAwIj5uczNfX2dldE5hbWVzUmVzcG9uc2U8L2ZvbnQ+IHs8Yj5jaGFyPC9iPiZuYnNwOyo8Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Zmlyc3Q8L2ZvbnQ+OyA8Yj5jaGFyPC9iPiZuYnNwOyo8Zm9udCBjb2xvcj0iIzAwMDBGRiI+bGFzdDwvZm9udD47fSAmYW1wO3IpOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIGdTT0FQIHN0dWIgYW5kIHNrZWxldG9uIGNvbXBpbGVyIHRha2VzIHRoaXMgaGVhZGVyIGZpbGUgYXMgaW5wdXQgYW5kIGdlbmVyYXRlcyBzb3VyY2UgY29kZSBmb3IgdGhlIGZ1bmN0aW9uIDxpPnNvYXBfY2FsbF9uczNfX2dldE5hbWVzPC9pPi4gV2hlbiBpbnZva2VkIGJ5IGEgY2xpZW50IGFwcGxpY2F0aW9uLCB0aGUgcHJveHkgcHJvZHVjZXMgdGhlIFNPQVAgcmVxdWVzdDoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEIwRDAiPjx0cj48dGQ+PHR0Pg0KKy4uLiA8YnIgLz4NCismbHQ7U09BUC1FTlY6RW52ZWxvcGUgLi4uIHhtbG5zOm5zMz0idXJuOm5hbWVzIiAuLi4mIzYyOyA8YnIgLz4NCisuLi4gPGJyIC8+DQorJmx0Ozxmb250IGNvbG9yPSIjMDBGRjAwIj5uczM6Z2V0TmFtZXM8L2ZvbnQ+JiM2MjsgPGJyIC8+DQorJmx0Ozxmb250IGNvbG9yPSIjRkYwMEZGIj5TU048L2ZvbnQ+JiM2Mjs5OTkgOTkgOTk5OSZsdDsvPGZvbnQgY29sb3I9IiNGRjAwRkYiPlNTTjwvZm9udD4mIzYyOyA8YnIgLz4NCismbHQ7Lzxmb250IGNvbG9yPSIjMDBGRjAwIj5uczM6Z2V0TmFtZXM8L2ZvbnQ+JiM2MjsgPGJyIC8+DQorLi4uDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvdHQ+DQorVGhlIHJlc3BvbnNlIGJ5IGEgU09BUCBzZXJ2aWNlIGNvdWxkIGJlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwQjBEMCI+PHRyPjx0ZD48dHQ+DQorLi4uIDxiciAvPg0KKyZsdDs8Zm9udCBjb2xvcj0iI0ZGRkYwMCI+bTpnZXROYW1lc1Jlc3BvbnNlPC9mb250PiB4bWxuczptPSJ1cm46bmFtZXMiJiM2MjsgPGJyIC8+DQorJmx0Ozxmb250IGNvbG9yPSIjRkYwMDAwIj5maXJzdDwvZm9udD4mIzYyO0pvaG4mbHQ7Lzxmb250IGNvbG9yPSIjRkYwMDAwIj5maXJzdDwvZm9udD4mIzYyOyA8YnIgLz4NCismbHQ7PGZvbnQgY29sb3I9IiMwMDAwRkYiPmxhc3Q8L2ZvbnQ+JiM2MjtEb2UmbHQ7Lzxmb250IGNvbG9yPSIjMDAwMEZGIj5sYXN0PC9mb250PiYjNjI7IDxiciAvPg0KKyZsdDsvPGZvbnQgY29sb3I9IiNGRkZGMDAiPm06Z2V0TmFtZXNSZXNwb25zZTwvZm9udD4mIzYyOyA8YnIgLz4NCisuLi4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC90dD4NCit3aGVyZSA8dHQ+PGZvbnQgY29sb3I9IiNGRjAwMDAiPmZpcnN0PC9mb250PjwvdHQ+IGFuZCA8dHQ+PGZvbnQgY29sb3I9IiMwMDAwRkYiPmxhc3Q8L2ZvbnQ+PC90dD4gYXJlIHRoZSBvdXRwdXQgcGFyYW1ldGVycyBvZiB0aGUgPGk+Z2V0TmFtZXM8L2k+IHJlbW90ZSBtZXRob2Qgb2YgdGhlIHNlcnZpY2UuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0FzIGFub3RoZXIgZXhhbXBsZSwgY29uc2lkZXIgYSByZW1vdGUgbWV0aG9kIDxpPmNvcHk8L2k+IHdpdGggYW4gaW5wdXQgcGFyYW1ldGVyIGFuZCBhbiBvdXRwdXQgcGFyYW1ldGVyIHdpdGggaWRlbnRpY2FsDQorcGFyYW1ldGVyIG5hbWVzICh0aGlzIGlzIG5vdCBwcm9oaWJpdGVkIGJ5IHRoZSBTT0FQIDEuMSBwcm90b2NvbCkuIFRoaXMgY2FuIGJlIHNwZWNpZmllZCBhcyB3ZWxsIHVzaW5nIGEgcmVzcG9uc2UgPGk+PGI+c3RydWN0PC9iPjwvaT46DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vIENvbnRlbnQgb2YgZmlsZSAiY29weS5oIjogPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwOzxmb250IGNvbG9yPSIjMDBGRjAwIj5YX3JveF9fY29weV9uYW1lPC9mb250Pig8Yj5jaGFyPC9iPiZuYnNwOyo8Zm9udCBjb2xvcj0iI0ZGMDBGRiI+bmFtZTwvZm9udD4sIDxiPnN0cnVjdDwvYj4mbmJzcDs8Zm9udCBjb2xvcj0iI0ZGRkYwMCI+WF9yb3hfX2NvcHlfbmFtZVJlc3BvbnNlPC9mb250PiB7PGI+Y2hhcjwvYj4mbmJzcDsqPGZvbnQgY29sb3I9IiNGRjAwMDAiPm5hbWU8L2ZvbnQ+O30gJmFtcDtyKTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoZSB1c2Ugb2YgYSA8aT48Yj5zdHJ1Y3Q8L2I+PC9pPiBvciA8aT48Yj5jbGFzczwvYj48L2k+IGZvciB0aGUgcmVtb3RlIG1ldGhvZCByZXNwb25zZSBlbmFibGVzIHRoZSBkZWNsYXJhdGlvbiBvZiByZW1vdGUgbWV0aG9kcyB0aGF0IGhhdmUNCitwYXJhbWV0ZXJzIHRoYXQgYXJlIHBhc3NlZCBib3RoIGFzIGlucHV0IGFuZCBvdXRwdXQgcGFyYW1ldGVycy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIGdTT0FQIGNvbXBpbGVyIHRha2VzIHRoZSA8aT5jb3B5Lmg8L2k+IGhlYWRlciBmaWxlIGFzIGlucHV0IGFuZCBnZW5lcmF0ZXMgdGhlIDxpPnNvYXBfY2FsbF9YX3JveF9fY29weV9uYW1lPC9pPiBwcm94eS4gV2hlbiBpbnZva2VkIGJ5IGEgY2xpZW50IGFwcGxpY2F0aW9uLCB0aGUgcHJveHkgcHJvZHVjZXMgdGhlIFNPQVAgcmVxdWVzdDoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEIwRDAiPjx0cj48dGQ+PHR0Pg0KKy4uLiA8YnIgLz4NCismbHQ7U09BUC1FTlY6RW52ZWxvcGUgLi4uIHhtbG5zOlgtcm94PSJ1cm46Y29weSIgLi4uJiM2MjsgPGJyIC8+DQorLi4uIDxiciAvPg0KKyZsdDs8Zm9udCBjb2xvcj0iIzAwRkYwMCI+WC1yb3g6Y29weS1uYW1lPC9mb250PiYjNjI7IDxiciAvPg0KKyZsdDs8Zm9udCBjb2xvcj0iI0ZGMDBGRiI+bmFtZTwvZm9udD4mIzYyO1NPQVAmbHQ7Lzxmb250IGNvbG9yPSIjRkYwMEZGIj5uYW1lPC9mb250PiYjNjI7IDxiciAvPg0KKyZsdDsvPGZvbnQgY29sb3I9IiMwMEZGMDAiPlgtcm94OmNvcHktbmFtZTwvZm9udD4mIzYyOyA8YnIgLz4NCisuLi4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC90dD4NCitUaGUgcmVzcG9uc2UgYnkgYSBTT0FQIGNvcHkgc2VydmljZSBjb3VsZCBiZSBzb21ldGhpbmcgbGlrZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEIwRDAiPjx0cj48dGQ+PHR0Pg0KKy4uLiA8YnIgLz4NCismbHQ7PGZvbnQgY29sb3I9IiNGRkZGMDAiPm06Y29weS1uYW1lUmVzcG9uc2U8L2ZvbnQ+IHhtbG5zOm09InVybjpjb3B5IiYjNjI7IDxiciAvPg0KKyZsdDs8Zm9udCBjb2xvcj0iI0ZGMDAwMCI+bmFtZTwvZm9udD4mIzYyO1NPQVAmbHQ7Lzxmb250IGNvbG9yPSIjRkYwMDAwIj5uYW1lPC9mb250PiYjNjI7IDxiciAvPg0KKyZsdDsvPGZvbnQgY29sb3I9IiNGRkZGMDAiPm06Y29weS1uYW1lUmVzcG9uc2U8L2ZvbnQ+JiM2MjsgPGJyIC8+DQorLi4uDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvdHQ+DQorVGhlIG5hbWUgd2lsbCBiZSBwYXJzZWQgYW5kIGRlY29kZWQgYnkgdGhlIHByb3h5IGFuZCByZXR1cm5lZCBpbiB0aGUgPGk+bmFtZTwvaT4gZmllbGQgb2YgdGhlIDxpPjxiPnN0cnVjdDwvYj4mbmJzcDtYX3JveF9fY29weV9uYW1lUmVzcG9uc2UgJmFtcDtyPC9pPiBwYXJhbWV0ZXIuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkJICAgICAgPGg0PjxhIG5hbWU9InR0aF9zRWM3LjEuMTEiPg0KKzcuMS4xMTwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+SG93IHRvIFNwZWNpZnkgT3V0cHV0IFBhcmFtZXRlcnMgV2l0aCBzdHJ1Y3QvY2xhc3MgQ29tcG91bmQgRGF0YSBUeXBlczwvZm9udD48L2g0PjxhIG5hbWU9InNlYzpjb21wb3VuZCI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitJZiB0aGUgc2luZ2xlIG91dHB1dCBwYXJhbWV0ZXIgb2YgYSByZW1vdGUgbWV0aG9kIGlzIGEgY29tcGxleCBkYXRhIHR5cGUgc3VjaCBhcyBhIDxpPjxiPnN0cnVjdDwvYj48L2k+IG9yIDxpPjxiPmNsYXNzPC9iPjwvaT4gaXQgaXMgbmVjZXNzYXJ5IHRvDQorc3BlY2lmeSB0aGUgcmVzcG9uc2UgZWxlbWVudCBvZiB0aGUgcmVtb3RlIG1ldGhvZCBhcyBhIDxpPjxiPnN0cnVjdDwvYj48L2k+IG9yIDxpPjxiPmNsYXNzPC9iPjwvaT4gPGI+YXQgYWxsIHRpbWVzPC9iPi4NCitPdGhlcndpc2UsIHRoZSBvdXRwdXQgcGFyYW1ldGVyIHdpbGwNCitiZSBjb25zaWRlcmVkIHRoZSByZXNwb25zZSBlbGVtZW50ICghKSwgYmVjYXVzZSBvZiB0aGUgcmVzcG9uc2UgZWxlbWVudCBzcGVjaWZpY2F0aW9uIGNvbnZlbnRpb24gdXNlZCBieSBnU09BUCwNCithcyBkaXNjdXNzZWQgaW4mbmJzcDs8YSBocmVmPSIjc2VjOnJlc3BvbnNlIj43LjEuNzwvYT4uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkJICAgICAgPGg0PjxhIG5hbWU9InR0aF9zRWM3LjEuMTIiPg0KKzcuMS4xMjwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+RXhhbXBsZTwvZm9udD48L2g0PjxhIG5hbWU9InNlYzpleGFtcGxlNiI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGlzIGlzIGlzIGJlc3QgaWxsdXN0cmF0ZWQgd2l0aCBhbiBleGFtcGxlLiBUaGUgRmxpZ2h0dHJhY2tlciBzZXJ2aWNlIGJ5IE9iamVjdFNwYWNlIHByb3ZpZGVzIHJlYWwgdGltZSBmbGlnaHQgaW5mb3JtYXRpb24gZm9yDQorZmxpZ2h0cyBpbiB0aGUgYWlyLiBJdCByZXF1aXJlcyBhbiBhaXJsaW5lIGNvZGUgYW5kIGZsaWdodCBudW1iZXIgYXMgcGFyYW1ldGVycy4NCitUaGUgcmVtb3RlIG1ldGhvZCBuYW1lIGlzIDxpPmdldEZsaWdodEluZm88L2k+IGFuZA0KK3RoZSBtZXRob2QgaGFzIHR3byBzdHJpbmcgcGFyYW1ldGVyczogdGhlIGFpcmxpbmUgY29kZSBhbmQgZmxpZ2h0IG51bWJlciwgYm90aCBvZiB3aGljaCBtdXN0IGJlIGVuY29kZWQgYXMgPHR0PnhzZDpzdHJpbmc8L3R0PiB0eXBlcy4NCitUaGUgbWV0aG9kIHJldHVybnMgYSA8aT5nZXRGbGlnaHRSZXNwb25zZTwvaT4gcmVzcG9uc2UgZWxlbWVudCB3aXRoIGEgPGk+cmV0dXJuPC9pPiBvdXRwdXQgcGFyYW1ldGVyIHRoYXQgaXMgb2YgY29tcGxleCB0eXBlDQorPGk+RmxpZ2h0SW5mbzwvaT4uIFRoZSB0eXBlIDxpPkZsaWdodEluZm88L2k+IGlzIHJlcHJlc2VudGVkIGJ5IGEgPGk+PGI+Y2xhc3M8L2I+PC9pPiBpbiB0aGUgaGVhZGVyIGZpbGUsIHdob3NlIGZpZWxkIG5hbWVzIGNvcnJlc3BvbmQgdG8NCit0aGUgPGk+RmxpZ2h0SW5mbzwvaT4gYWNjZXNzb3JzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisvLyBDb250ZW50cyBvZiBmaWxlICJmbGlnaHQuaCI6IDxiciAvPg0KKzxiPnR5cGVkZWY8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqeHNkX19zdHJpbmc7IDxiciAvPg0KKzxiPmNsYXNzPC9iPiZuYnNwO25zMl9fRmxpZ2h0SW5mbyA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnB1YmxpYzwvYj46IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3hzZF9fc3RyaW5nIGFpcmxpbmU7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3hzZF9fc3RyaW5nIGZsaWdodE51bWJlcjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eHNkX19zdHJpbmcgYWx0aXR1ZGU7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3hzZF9fc3RyaW5nIGN1cnJlbnRMb2NhdGlvbjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eHNkX19zdHJpbmcgZXF1aXBtZW50OyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt4c2RfX3N0cmluZyBzcGVlZDsgPGJyIC8+DQorfTsgPGJyIC8+DQorPGI+c3RydWN0PC9iPiZuYnNwO25zMV9fZ2V0RmxpZ2h0SW5mb1Jlc3BvbnNlIHtuczJfX0ZsaWdodEluZm8gX3JldHVybjt9OyA8YnIgLz4NCis8Yj5pbnQ8L2I+Jm5ic3A7bnMxX19nZXRGbGlnaHRJbmZvKHhzZF9fc3RyaW5nIHBhcmFtMSwgeHNkX19zdHJpbmcgcGFyYW0yLCA8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7bnMxX19nZXRGbGlnaHRJbmZvUmVzcG9uc2UgJmFtcDtyKTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoZSByZXNwb25zZSBlbGVtZW50IDxpPm5zMV9fZ2V0RmxpZ2h0SW5mb1Jlc3BvbnNlPC9pPiBpcyBleHBsaWNpdGx5IGRlY2xhcmVkIGFuZCBpdCBoYXMgb25lIGZpZWxkOiA8aT5yZXR1cm5fPC9pPiBvZiB0eXBlDQorPGk+bnMyX19GbGlnaHRJbmZvPC9pPi4gIE5vdGUgdGhhdCA8aT5yZXR1cm5fPC9pPiBoYXMgYSB0cmFpbGluZyB1bmRlcnNjb3JlIHRvIGF2b2lkIGEgbmFtZSBjbGFzaCB3aXRoIHRoZSA8aT48Yj5yZXR1cm48L2I+PC9pPiBrZXl3b3JkLA0KK3NlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzppZHRyYW5zIj45LjM8L2E+IGZvciBkZXRhaWxzIG9uIHRoZSB0cmFuc2xhdGlvbiBvZiBDKysgaWRlbnRpZmllcnMgdG8gWE1MIGVsZW1lbnQgbmFtZXMuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBnU09BUCBjb21waWxlciBnZW5lcmF0ZXMgdGhlIDxpPnNvYXBfY2FsbF9uczFfX2dldEZsaWdodEluZm88L2k+IHByb3h5LiBIZXJlIGlzIGFuIGV4YW1wbGUgZnJhZ21lbnQgb2YgYSBjbGllbnQgYXBwbGljYXRpb24gdGhhdCB1c2VzIHRoaXMgcHJveHkgdG8gcmVxdWVzdCBmbGlnaHQgaW5mb3JtYXRpb246DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwIHNvYXA7IDxiciAvPg0KKy4uLiA8YnIgLz4NCitzb2FwX2luaXQoJmFtcDtzb2FwKTsgPGJyIC8+DQorLi4uIDxiciAvPg0KK3NvYXBfY2FsbF9uczFfX2dldEZsaWdodEluZm8oJmFtcDtzb2FwLCA8dHQ+InRlc3R2Z2VyLm9iamVjdHNwYWNlLmNvbS9zb2FwL3NlcnZsZXQvcnBjcm91dGVyIjwvdHQ+LCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8dHQ+InVybjpnYWxkZW1vOmZsaWdodHRyYWNrZXIiPC90dD4sIDx0dD4iVUFMIjwvdHQ+LCA8dHQ+IjE4NCI8L3R0Piwgcik7IDxiciAvPg0KKy4uLiA8YnIgLz4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7TmFtZXNwYWNlIG5hbWVzcGFjZXNbXSA9IDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyJTT0FQLUVOViIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyJ9LCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7IlNPQVAtRU5DIiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8ifSwgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyJ4c2kiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UifSwgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyJ4c2QiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEifSwgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyJuczEiLCAidXJuOmdhbGRlbW86ZmxpZ2h0dHJhY2tlciJ9LCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7Im5zMiIsICJodHRwOi8vZ2FsZGVtby5mbGlnaHR0cmFja2VyLmNvbSJ9LCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7TlVMTCwgTlVMTH0gPGJyIC8+DQorfTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1doZW4gaW52b2tlZCBieSBhIGNsaWVudCBhcHBsaWNhdGlvbiwgdGhlIHByb3h5IHByb2R1Y2VzIHRoZSBTT0FQIHJlcXVlc3Q6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBCMEQwIj48dHI+PHRkPjx0dD4NCitQT1NUIC9zb2FwL3NlcnZsZXQvcnBjcm91dGVyIEhUVFAvMS4xIDxiciAvPg0KK0hvc3Q6IHRlc3R2Z2VyLm9iamVjdHNwYWNlLmNvbSA8YnIgLz4NCitDb250ZW50LVR5cGU6IHRleHQveG1sIDxiciAvPg0KK0NvbnRlbnQtTGVuZ3RoOiA2MzQgPGJyIC8+DQorU09BUEFjdGlvbjogInVybjpnYWxkZW1vOmZsaWdodHRyYWNrZXIiIDxiciAvPg0KKzxiciAvPg0KKyZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8mIzYyOyA8YnIgLz4NCismbHQ7U09BUC1FTlY6RW52ZWxvcGUgeG1sbnM6U09BUC1FTlY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt4bWxuczpTT0FQLUVOQz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3htbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3htbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3htbG5zOm5zMT0idXJuOmdhbGRlbW86ZmxpZ2h0dHJhY2tlciIgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eG1sbnM6bnMyPSJodHRwOi8vZ2FsZGVtby5mbGlnaHR0cmFja2VyLmNvbSIgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7U09BUC1FTlY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iJiM2MjsgPGJyIC8+DQorJmx0O1NPQVAtRU5WOkJvZHkmIzYyOyA8YnIgLz4NCismbHQ7bnMxOmdldEZsaWdodEluZm8geHNpOnR5cGU9Im5zMTpnZXRGbGlnaHRJbmZvIiYjNjI7IDxiciAvPg0KKyZsdDtwYXJhbTEgeHNpOnR5cGU9InhzZDpzdHJpbmciJiM2MjtVQUwmbHQ7L3BhcmFtMSYjNjI7IDxiciAvPg0KKyZsdDtwYXJhbTIgeHNpOnR5cGU9InhzZDpzdHJpbmciJiM2MjsxODQmbHQ7L3BhcmFtMiYjNjI7IDxiciAvPg0KKyZsdDsvbnMxOmdldEZsaWdodEluZm8mIzYyOyA8YnIgLz4NCismbHQ7L1NPQVAtRU5WOkJvZHkmIzYyOyA8YnIgLz4NCismbHQ7L1NPQVAtRU5WOkVudmVsb3BlJiM2MjsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC90dD4NCitUaGUgRmxpZ2h0dHJhY2tlciBzZXJ2aWNlIHJlc3BvbmRzIHdpdGg6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBCMEQwIj48dHI+PHRkPjx0dD4NCitIVFRQLzEuMSAyMDAgb2sgPGJyIC8+DQorRGF0ZTogVGh1LCAzMCBBdWcgMjAwMSAwMDozNDoxNyBHTVQgPGJyIC8+DQorU2VydmVyOiBJQk1fSFRUUF9TZXJ2ZXIvMS4zLjEyLjMgQXBhY2hlLzEuMy4xMiAoV2luMzIpIDxiciAvPg0KK1NldC1Db29raWU6IHNlc2Vzc2lvbmlkPTJHRlZUT0dDMzBEMExHUkdVMkw0SEZBO1BhdGg9LyA8YnIgLz4NCitDYWNoZS1Db250cm9sOiBuby1jYWNoZT0ic2V0LWNvb2tpZSxzZXQtY29va2llMiIgPGJyIC8+DQorRXhwaXJlczogVGh1LCAwMSBEZWMgMTk5NCAxNjowMDowMCBHTVQgPGJyIC8+DQorQ29udGVudC1MZW5ndGg6IDg2MSA8YnIgLz4NCitDb250ZW50LVR5cGU6IHRleHQveG1sOyBjaGFyc2V0PXV0Zi04IDxiciAvPg0KK0NvbnRlbnQtTGFuZ3VhZ2U6IGVuIDxiciAvPg0KKzxiciAvPg0KKyZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8mIzYyOyA8YnIgLz4NCismbHQ7U09BUC1FTlY6RW52ZWxvcGUgeG1sbnM6U09BUC1FTlY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiYjNjI7IDxiciAvPg0KKyZsdDtTT0FQLUVOVjpCb2R5JiM2MjsgPGJyIC8+DQorJmx0O25zMTpnZXRGbGlnaHRJbmZvUmVzcG9uc2UgeG1sbnM6bnMxPSJ1cm46Z2FsZGVtbzpmbGlnaHR0cmFja2VyIiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtTT0FQLUVOVjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyImIzYyOyA8YnIgLz4NCismbHQ7cmV0dXJuIHhtbG5zOm5zMj0iaHR0cDovL2dhbGRlbW8uZmxpZ2h0dHJhY2tlci5jb20iIHhzaTp0eXBlPSJuczI6RmxpZ2h0SW5mbyImIzYyOyA8YnIgLz4NCismbHQ7ZXF1aXBtZW50IHhzaTp0eXBlPSJ4c2Q6c3RyaW5nIiYjNjI7QTMyMCZsdDsvZXF1aXBtZW50JiM2MjsgPGJyIC8+DQorJmx0O2FpcmxpbmUgeHNpOnR5cGU9InhzZDpzdHJpbmciJiM2MjtVQUwmbHQ7L2FpcmxpbmUmIzYyOyA8YnIgLz4NCismbHQ7Y3VycmVudExvY2F0aW9uIHhzaTp0eXBlPSJ4c2Q6c3RyaW5nIiYjNjI7MTg4IG1pIFcgb2YgTGluY29sbiwgTkUmbHQ7L2N1cnJlbnRMb2NhdGlvbiYjNjI7IDxiciAvPg0KKyZsdDthbHRpdHVkZSB4c2k6dHlwZT0ieHNkOnN0cmluZyImIzYyOzM3MDAwJmx0Oy9hbHRpdHVkZSYjNjI7IDxiciAvPg0KKyZsdDtzcGVlZCB4c2k6dHlwZT0ieHNkOnN0cmluZyImIzYyOzQ5NyZsdDsvc3BlZWQmIzYyOyA8YnIgLz4NCismbHQ7ZmxpZ2h0TnVtYmVyIHhzaTp0eXBlPSJ4c2Q6c3RyaW5nIiYjNjI7MTg0Jmx0Oy9mbGlnaHROdW1iZXImIzYyOyA8YnIgLz4NCismbHQ7L3JldHVybiYjNjI7IDxiciAvPg0KKyZsdDsvbnMxOmdldEZsaWdodEluZm9SZXNwb25zZSYjNjI7IDxiciAvPg0KKyZsdDsvU09BUC1FTlY6Qm9keSYjNjI7IDxiciAvPg0KKyZsdDsvU09BUC1FTlY6RW52ZWxvcGUmIzYyOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3R0Pg0KK1RoZSBwcm94eSByZXR1cm5zIHRoZSBzZXJ2aWNlIHJlc3BvbnNlIGluIHZhcmlhYmxlIDxpPnI8L2k+IG9mIHR5cGUgPGk+PGI+c3RydWN0PC9iPiZuYnNwO25zMV9fZ2V0RmxpZ2h0SW5mb1Jlc3BvbnNlPC9pPiBhbmQgdGhpcyBpbmZvcm1hdGlvbiBjYW4gYmUgZGlzcGxheWVkIGJ5IHRoZSBjbGllbnQgYXBwbGljYXRpb24gd2l0aCB0aGUgZm9sbG93aW5nIGNvZGUgZnJhZ21lbnQ6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KK2NvdXQgICZsdDsmbHQ7ICByLnJldHVybl8uZXF1aXBtZW50ICAmbHQ7Jmx0OyAgIiBmbGlnaHQgIiAgJmx0OyZsdDsgIHIucmV0dXJuXy5haXJsaW5lICAmbHQ7Jmx0OyAgci5yZXR1cm5fLmZsaWdodE51bWJlciA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsgJmx0OyZsdDsgICIgdHJhdmVsaW5nICIgICZsdDsmbHQ7ICByLnJldHVybl8uc3BlZWQgICZsdDsmbHQ7ICAiIG1waCAiICAmbHQ7Jmx0OyAgIiBhdCAiICAmbHQ7Jmx0OyAgci5yZXR1cm5fLmFsdGl0dWRlIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7Jmx0OyAgIiBmdCwgaXMgbG9jYXRlZCAiICAmbHQ7Jmx0OyAgci5yZXR1cm5fLmN1cnJlbnRMb2NhdGlvbiAgJmx0OyZsdDsgIGVuZGw7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGlzIGNvZGUgZGlzcGxheXMgdGhlIHNlcnZpY2UgcmVzcG9uc2UgYXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjRDBEMEQwIj48dHI+PHRkPjxzcGFuIGNsYXNzPSJyb21hbiI+DQorPHR0PkEzMjAgZmxpZ2h0IFVBTDE4NCB0cmF2ZWxpbmcgNDk3IG1waCBhdCAzNzAwMCBmdCwgaXMgbG9jYXRlZCAxODggbWkgVyBvZiBMaW5jb2xuLCBORTwvdHQ+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvc3Bhbj4NCitOb3RlOiB0aGUgZmxpZ2h0IHRyYWNrZXIgc2VydmljZSBpcyBubyBsb25nZXIgYXZhaWxhYmxlIHNpbmNlIDkvMTEvMjAwMS4gSXQgaXMga2VwdCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyBhbiBleGFtcGxlIHRvIGlsbHVzdHJhdGUgdGhlIHVzZSBvZiBzdHJ1Y3RzL2NsYXNzZXMgYW5kIHJlc3BvbnNlIHR5cGVzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJCSAgICAgIDxoND48YSBuYW1lPSJ0dGhfc0VjNy4xLjEzIj4NCis3LjEuMTM8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPkhvdyB0byBTcGVjaWZ5IEFub255bW91cyBQYXJhbWV0ZXIgTmFtZXM8L2ZvbnQ+PC9oND48YSBuYW1lPSJzZWM6YW5vbnltb3VzIj4NCis8L2E+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBTT0FQIDEuMSBwcm90b2NvbCBhbGxvd3MgcGFyYW1ldGVyIG5hbWVzIHRvIGJlIGFub255bW91cy4gIFRoYXQgaXMsIHRoZSBuYW1lKHMpIG9mIHRoZSBvdXRwdXQNCitwYXJhbWV0ZXJzIG9mIGEgcmVtb3RlIG1ldGhvZCBhcmUgbm90IHN0cmljdGx5IHJlcXVpcmVkIHRvIG1hdGNoIGEgY2xpZW50J3MgdmlldyBvZiB0aGUgcGFyYW1ldGVycyBuYW1lcy4gIEFsc28sIHRoZQ0KK2lucHV0IHBhcmFtZXRlciBuYW1lcyBvZiBhIHJlbW90ZSBtZXRob2QgYXJlIG5vdCBzdHJpY3RseSByZXF1aXJlZCB0byBtYXRjaCBhIHNlcnZpY2UncyB2aWV3IG9mIHRoZSBwYXJhbWV0ZXIgbmFtZXMuICBBbHRob3VnaA0KK3RoaXMgY29udmVudGlvbiBpcyBsaWtlbHkgdG8gYmUgZGVwcmVjYXRlZCBpbiBTT0FQIDEuMiwgdGhlIGdTT0FQIGNvbXBpbGVyIGNhbiBnZW5lcmF0ZSBzdHViIGFuZCBza2VsZXRvbg0KK3JvdXRpbmVzIHRoYXQgc3VwcG9ydCBhbm9ueW1vdXMgcGFyYW1ldGVycy4gIFBhcmFtZXRlciBuYW1lcyBhcmUgaW1wbGljaXRseQ0KK2Fub255bW91cyBieSBvbWl0dGluZyB0aGUgcGFyYW1ldGVyIG5hbWVzIGluIHRoZSBmdW5jdGlvbiBwcm90b3R5cGUgb2YgdGhlDQorcmVtb3RlIG1ldGhvZC4gRm9yDQorZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorLy8gQ29udGVudHMgb2YgImdldFF1b3RlLmgiOiA8YnIgLz4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KnhzZF9fc3RyaW5nOyA8YnIgLz4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmZsb2F0PC9iPiZuYnNwO3hzZF9fZmxvYXQ7IDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDtuczFfX2dldFF1b3RlKHhzZF9fc3RyaW5nLCB4c2RfX2Zsb2F0JmFtcDspOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVG8gbWFrZSBwYXJhbWV0ZXIgbmFtZXMgZXhwbGljaXRseSBhbm9ueW1vdXMgb24gdGhlIHJlY2VpdmluZyBzaWRlIChjbGllbnQgb3Igc2VydmljZSksDQordGhlIHBhcmFtZXRlciBuYW1lcyBzaG91bGQgc3RhcnQgd2l0aCBhbiB1bmRlcnNjb3JlICg8aT5fPC9pPikgaW4gdGhlIGZ1bmN0aW9uIHByb3RvdHlwZSBpbiB0aGUgaGVhZGVyIGZpbGUuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0ZvciBleGFtcGxlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisvLyBDb250ZW50cyBvZiAiZ2V0UXVvdGUuaCI6IDxiciAvPg0KKzxiPnR5cGVkZWY8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqeHNkX19zdHJpbmc7IDxiciAvPg0KKzxiPnR5cGVkZWY8L2I+Jm5ic3A7PGI+ZmxvYXQ8L2I+Jm5ic3A7eHNkX19mbG9hdDsgPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO25zMV9fZ2V0UXVvdGUoeHNkX19zdHJpbmcgc3ltYm9sLCB4c2RfX2Zsb2F0ICZhbXA7X3JldHVybik7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitPciwgYWx0ZXJuYXRpdmVseSB3aXRoIGEgcmVzcG9uc2UgPGk+PGI+c3RydWN0PC9iPjwvaT46DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vIENvbnRlbnRzIG9mICJnZXRRdW90ZS5oIjogPGJyIC8+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyp4c2RfX3N0cmluZzsgPGJyIC8+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5mbG9hdDwvYj4mbmJzcDt4c2RfX2Zsb2F0OyA8YnIgLz4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7bnMxX19nZXRRdW90ZVJlc3BvbnNlIHt4c2RfX2Zsb2F0IF9yZXR1cm47fTsgPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO25zMV9fZ2V0UXVvdGUoeHNkX19zdHJpbmcgc3ltYm9sLCA8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7bnMxX19nZXRRdW90ZVJlc3BvbnNlICZhbXA7cik7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitJbiB0aGlzIGV4YW1wbGUsIDxpPl9yZXR1cm48L2k+IGlzIGFuIGFub255bW91cyBvdXRwdXQgcGFyYW1ldGVyLg0KK0FzIGEgY29uc2VxdWVuY2UsIHRoZSBzZXJ2aWNlIHJlc3BvbnNlIHRvIGEgcmVxdWVzdCBtYWRlIGJ5IGEgY2xpZW50IGNyZWF0ZWQgd2l0aCBnU09BUCB1c2luZyB0aGlzIGhlYWRlciBmaWxlIHNwZWNpZmljYXRpb24NCittYXkgaW5jbHVkZSBhbnkgbmFtZSBmb3IgdGhlIG91dHB1dCBwYXJhbWV0ZXIgaW4gdGhlIFNPQVAgcGF5bG9hZC4NCitUaGUgaW5wdXQgcGFyYW1ldGVycyBtYXkgYWxzbyBiZSBhbm9ueW1vdXMuIFRoaXMgYWZmZWN0cyB0aGUgaW1wbGVtZW50YXRpb24gb2YgV2ViIHNlcnZpY2VzIGluIGdTT0FQDQorYW5kIHRoZSBtYXRjaGluZyBvZiBwYXJhbWV0ZXIgbmFtZXMgYnkgdGhlIHNlcnZpY2UuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5DYXV0aW9uPC9iPjwvZm9udD46IHdoZW4gYW5vbnltb3VzIHBhcmFtZXRlciBuYW1lcyBhcmUgdXNlZCwgdGhlIG9yZGVyIG9mIHRoZSBwYXJhbWV0ZXJzIGluIHRoZSBmdW5jdGlvbiBwcm90b3R5cGUgb2YgYSByZW1vdGUgbWV0aG9kIGlzDQorc2lnbmlmaWNhbnQuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkJICAgICAgPGg0PjxhIG5hbWU9InR0aF9zRWM3LjEuMTQiPg0KKzcuMS4xNDwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+SG93IHRvIFNwZWNpZnkgYSBNZXRob2Qgd2l0aCBObyBJbnB1dCBQYXJhbWV0ZXJzPC9mb250PjwvaDQ+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RvIHNwZWNpZnkgYSByZW1vdGUgbWV0aG9kIHRoYXQgaGFzIG5vIGlucHV0IHBhcmFtZXRlcnMsIGp1c3QgcHJvdmlkZSBhIGZ1bmN0aW9uIHByb3RvdHlwZSB3aXRoIG9uZSBwYXJhbWV0ZXIgd2hpY2ggaXMgdGhlIG91dHB1dA0KK3BhcmFtZXRlci4gIEhvd2V2ZXIsIHNvbWUgQy9DKysgY29tcGlsZXJzIChub3RhYmx5IFZpc3VhbCBDKys8c3VwPjxzcGFuIGNsYXNzPSJyb21hbiI+VE08L3NwYW4+PC9zdXA+KSB3aWxsIG5vdCBjb21waWxlIGFuZCBjb21wbGFpbiBhYm91dCBhbiBlbXB0eQ0KKzxpPjxiPnN0cnVjdDwvYj48L2k+LiAgVGhpcyA8aT48Yj5zdHJ1Y3Q8L2I+PC9pPiBpcyBnZW5lcmF0ZWQgYnkgZ1NPQVAgdG8gY29udGFpbiB0aGUgU09BUCByZXF1ZXN0IG1lc3NhZ2UuICBUbyBmaXggdGhpcywgcHJvdmlkZSBvbmUgaW5wdXQNCitwYXJhbWV0ZXIgb2YgdHlwZSA8aT48Yj52b2lkPC9iPio8L2k+IChnU09BUCBjYW4gbm90IHNlcmlhbGl6ZSA8aT52b2lkKjwvaT4gZGF0YSkuICBGb3IgZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+c3RydWN0PC9iPiZuYnNwO25zM19fU09BUFNlcnZpY2UgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5wdWJsaWM8L2I+OiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7SUQ7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7Km5hbWU7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7Km93bmVyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypkZXNjcmlwdGlvbjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqaG9tZXBhZ2VVUkw7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KmVuZHBvaW50OyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypTT0FQQWN0aW9uOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyptZXRob2ROYW1lc3BhY2VVUkk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KnNlcnZpY2VTdGF0dXM7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7Km1ldGhvZE5hbWU7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KmRhdGVDcmVhdGVkOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypkb3dubG9hZFVSTDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqd3NkbFVSTDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqaW5zdHJ1Y3Rpb25zOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypjb250YWN0RW1haWw7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KnNlcnZlckltcGxlbWVudGF0aW9uOyA8YnIgLz4NCit9OyA8YnIgLz4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7QXJyYXlPZlNPQVBTZXJ2aWNlIHs8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7bnMzX19TT0FQU2VydmljZSAqX19wdHI7IDxiPmludDwvYj4mbmJzcDtfX3NpemU7fTsgPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO25zX19nZXRBbGxTT0FQU2VydmljZXMoPGI+dm9pZDwvYj4mbmJzcDsqXywgPGI+c3RydWN0PC9iPiZuYnNwO0FycmF5T2ZTT0FQU2VydmljZSAmYW1wO19yZXR1cm4pOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIDxpPm5zX19nZXRBbGxTT0FQU2VydmljZXM8L2k+IG1ldGhvZCBoYXMgb25lIDxpPjxiPnZvaWQ8L2I+KjwvaT4gaW5wdXQgcGFyYW1ldGVyIHdoaWNoIGlzIGlnbm9yZWQgYnkgdGhlIHNlcmlhbGl6ZXIgdG8gcHJvZHVjZSB0aGUNCityZXF1ZXN0IG1lc3NhZ2UuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK01vc3QgQy9DKysgY29tcGlsZXJzIGFsbG93IGVtcHR5IDxpPjxiPnN0cnVjdDwvYj48L2k+cyBhbmQgdGhlcmVmb3JlIHRoZSA8aT48Yj52b2lkPC9iPio8L2k+IHBhcmFtZXRlciBpcyBub3QgcmVxdWlyZWQuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkJICAgICAgPGg0PjxhIG5hbWU9InR0aF9zRWM3LjEuMTUiPg0KKzcuMS4xNTwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+SG93IHRvIFNwZWNpZnkgYSBNZXRob2Qgd2l0aCBObyBPdXRwdXQgUGFyYW1ldGVyczwvZm9udD48L2g0Pg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUbyBzcGVjaWZ5IGEgcmVtb3RlIG1ldGhvZCB0aGF0IGhhcyBubyBvdXRwdXQgcGFyYW1ldGVycywganVzdCBwcm92aWRlIGEgZnVuY3Rpb24gcHJvdG90eXBlIHdpdGggYSByZXNwb25zZSBzdHJ1Y3QgdGhhdCBpcw0KK2VtcHR5LiBGb3IgZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+ZW51bTwvYj4mbmJzcDtuc19fZXZlbnQgeyBvZmYsIG9uLCBzdGFuZF9ieSB9OyA8YnIgLz4NCis8Yj5pbnQ8L2I+Jm5ic3A7bnNfX3NpZ25hbCg8Yj5lbnVtPC9iPiZuYnNwO25zX19ldmVudCBpbiwgPGI+c3RydWN0PC9iPiZuYnNwO25zX19zaWduYWxSZXNwb25zZSB7IH0gKm91dCk7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitTaW5jZSB0aGUgcmVzcG9uc2Ugc3RydWN0IGlzIGVtcHR5LCBubyBvdXRwdXQgcGFyYW1ldGVycyBhcmUgc3BlY2lmaWVkLg0KK01vc3QgQy9DKysgY29tcGlsZXJzIGFsbG93IGVtcHR5IDxpPjxiPnN0cnVjdDwvYj48L2k+cy4gRm9yIHRob3NlIHRoYXQgZG9uJ3QsIHVzZSBhIDxpPjxiPnZvaWQ8L2I+KjwvaT4gcGFyYW1ldGVyIGluIHRoZSBzdHJ1Y3QuDQorVGhpcyBwYXJhbWV0ZXIgaXMgbm90IChkZSlzZXJpYWxpemVkLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitTb21lIFNPQVAgcmVzb3VyY2VzIHJlZmVyIHRvIFNPQVAgUlBDIHdpdGggZW1wdHkgcmVzcG9uc2VzIGFzIDxiPm9uZSB3YXk8L2I+IFNPQVAgbWVzc2FnaW5nLiBIb3dldmVyLCB3ZSByZWZlciB0byBvbmUtd2F5IG1hc3NhZ2luZw0KK2J5IGFzeW5jaHJvbm91cyBleHBsaWNpdCBzZW5kIGFuZCByZWNlaXZlIG9wZXJhdGlvbnMgYXMgZGVzY3JpYmVkIGluIFNlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOm9uZXdheTEiPjcuMzwvYT4uICBUaGUgbGF0dGVyIHZpZXcgb2Ygb25lLXdheSBTT0FQIG1lc3NhZ2luZyBpcyBhbHNvIGluIGxpbmUgd2l0aCBCYXNpYyBQcm9maWxlIDEuMC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCSAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWM3LjIiPg0KKzcuMjwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+SG93IHRvIFVzZSB0aGUgZ1NPQVAgU3R1YiBhbmQgU2tlbGV0b24gQ29tcGlsZXIgdG8gQnVpbGQgU09BUCBXZWIgU2VydmljZXM8L2ZvbnQ+PC9oMz4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIGdTT0FQIHN0dWIgYW5kIHNrZWxldG9uIGNvbXBpbGVyIGdlbmVyYXRlcyA8Yj5za2VsZXRvbjwvYj4gcm91dGluZXMgaW4gQysrIHNvdXJjZSBmb3JtIGZvciBlYWNoIG9mIHRoZSByZW1vdGUgbWV0aG9kcyBzcGVjaWZpZWQNCithcyBmdW5jdGlvbiBwcm90b3R5cGVzIGluIHRoZSBoZWFkZXIgZmlsZSBwcm9jZXNzZWQgYnkgdGhlIGdTT0FQIGNvbXBpbGVyLiAgVGhlIHNrZWxldG9uIHJvdXRpbmVzIGNhbiBiZSByZWFkaWx5IHVzZWQgdG8gaW1wbGVtZW50DQordGhlIHJlbW90ZSBtZXRob2RzIGluIGEgbmV3IFNPQVAgV2ViIHNlcnZpY2UuIFRoZSBjb21wb3VuZCBkYXRhIHR5cGVzIHVzZWQgYnkgdGhlIGlucHV0IGFuZCBvdXRwdXQgcGFyYW1ldGVycyBvZiBTT0FQIHJlbW90ZQ0KK21ldGhvZHMgbXVzdCBiZSBkZWNsYXJlZCBpbiB0aGUgaGVhZGVyIGZpbGUsIHN1Y2ggYXMgc3RydWN0cywgY2xhc3NlcywgYXJyYXlzLCBhbmQgcG9pbnRlci1iYXNlZCBkYXRhIHN0cnVjdHVyZXMgKGdyYXBocykgdGhhdCBhcmUNCit1c2VkIGFzIHRoZSBkYXRhIHR5cGVzIG9mIHRoZSBwYXJhbWV0ZXJzIG9mIGEgcmVtb3RlIG1ldGhvZC4gVGhlIGdTT0FQIGNvbXBpbGVyIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVzIHNlcmlhbGl6ZXJzIGFuZA0KK2Rlc2VyaWFsaXplcnMgZm9yIHRoZSBkYXRhIHR5cGVzIHRvIGVuYWJsZSB0aGUgZ2VuZXJhdGVkIHNrZWxldG9uIHJvdXRpbmVzIHRvIGVuY29kZSBhbmQgZGVjb2RlIHRoZSBjb250ZW50cyBvZiB0aGUgcGFyYW1ldGVycyBvZg0KK3RoZSByZW1vdGUgbWV0aG9kcy4gIFRoZSBnU09BUCBjb21waWxlciBhbHNvIGdlbmVyYXRlcyBhIHJlbW90ZSBtZXRob2QgcmVxdWVzdCBkaXNwYXRjaGVyIHJvdXRpbmUgdGhhdCB3aWxsIHNlcnZlIHJlcXVlc3RzIGJ5DQorY2FsbGluZyB0aGUgYXBwcm9wcmlhdGUgc2tlbGV0b24gd2hlbiB0aGUgU09BUCBzZXJ2aWNlIGFwcGxpY2F0aW9uIGlzIGluc3RhbGxlZCBhcyBhIENHSSBhcHBsaWNhdGlvbiBvbiBhIFdlYiBzZXJ2ZXIuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkJICAgICAgPGg0PjxhIG5hbWU9InR0aF9zRWM3LjIuMSI+DQorNy4yLjE8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPkV4YW1wbGU8L2ZvbnQ+PC9oND48YSBuYW1lPSJzZWM6ZXhhbXBsZTciPg0KKzwvYT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIGZvbGxvd2luZyBleGFtcGxlIHNwZWNpZmllcyB0aHJlZSByZW1vdGUgbWV0aG9kcyB0byBiZSBpbXBsZW1lbnRlZCBieSBhIG5ldyBTT0FQIFdlYiBzZXJ2aWNlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisvLyBDb250ZW50cyBvZiBmaWxlICJjYWxjLmgiOiA8YnIgLz4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmRvdWJsZTwvYj4mbmJzcDt4c2RfX2RvdWJsZTsgPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO25zX19hZGQoeHNkX19kb3VibGUgYSwgeHNkX19kb3VibGUgYiwgeHNkX19kb3VibGUgJmFtcDtyZXN1bHQpOyA8YnIgLz4NCis8Yj5pbnQ8L2I+Jm5ic3A7bnNfX3N1Yih4c2RfX2RvdWJsZSBhLCB4c2RfX2RvdWJsZSBiLCB4c2RfX2RvdWJsZSAmYW1wO3Jlc3VsdCk7IDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDtuc19fc3FydCh4c2RfX2RvdWJsZSBhLCB4c2RfX2RvdWJsZSAmYW1wO3Jlc3VsdCk7IDxiciAvPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIDxpPmFkZDwvaT4gYW5kIDxpPnN1YjwvaT4gbWV0aG9kcyBhcmUgaW50ZW5kZWQgdG8gYWRkIGFuZCBzdWJ0cmFjdCB0d28gZG91YmxlIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgc3RvcmVkIGluIGlucHV0IHBhcmFtZXRlcnMNCis8aT5hPC9pPiBhbmQgPGk+YjwvaT4gYW5kIHNob3VsZCByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uIGluIHRoZSA8aT5yZXN1bHQ8L2k+IG91dHB1dCBwYXJhbWV0ZXIuIFRoZSA8aT5xc3J0PC9pPiBtZXRob2QgaXMNCitpbnRlbmRlZCB0byB0YWtlIHRoZSBzcXVhcmUgcm9vdCBvZiBpbnB1dCBwYXJhbWV0ZXIgPGk+YTwvaT4gYW5kIHRvIHJldHVybiB0aGUgcmVzdWx0IGluIHRoZSBvdXRwdXQgcGFyYW1ldGVyIDxpPnJlc3VsdDwvaT4uDQorVGhlIDxpPnhzZF9fZG91YmxlPC9pPiB0eXBlIGlzIHJlY29nbml6ZWQgYnkgdGhlIGdTT0FQIGNvbXBpbGVyIGFzIHRoZSA8dHQ+eHNkOmRvdWJsZTwvdHQ+IFhTRCBTY2hlbWEgZGF0YSB0eXBlLg0KK1RoZSB1c2Ugb2YgPGk+PGI+dHlwZWRlZjwvYj48L2k+IGlzIGEgY29udmVuaWVudCB3YXkgdG8gYXNzb2NpYXRlIHByaW1pdGl2ZSBDIHR5cGVzIHdpdGggcHJpbWl0aXZlIFhNTCBTY2hlbWEgZGF0YSB0eXBlcy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVG8gZ2VuZXJhdGUgdGhlIHNrZWxldG9uIHJvdXRpbmVzLCB0aGUgZ1NPQVAgY29tcGlsZXIgaXMgaW52b2tlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgd2l0aDoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNEMEQwRDAiPjx0cj48dGQ+PHNwYW4gY2xhc3M9InJvbWFuIj4NCis8aT5zb2FwY3BwMiBjYWxjLmg8L2k+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvc3Bhbj4NCitUaGUgY29tcGlsZXIgZ2VuZXJhdGVzIHRoZSBza2VsZXRvbiByb3V0aW5lcyBmb3IgdGhlIDxpPmFkZDwvaT4sIDxpPnN1YjwvaT4sIGFuZCA8aT5zcXJ0PC9pPiByZW1vdGUgbWV0aG9kcyBzcGVjaWZpZWQgaW4gdGhlDQorPGk+Y2FsYy5oPC9pPiBoZWFkZXIgZmlsZS4gVGhlIHNrZWxldG9uIHJvdXRpbmVzIGFyZSByZXNwZWN0aXZlbHksIDxpPnNvYXBfc2VydmVfbnNfX2FkZDwvaT4sIDxpPnNvYXBfc2VydmVfbnNfX3N1YjwvaT4sIGFuZA0KKzxpPnNvYXBfc2VydmVfbnNfX3NxcnQ8L2k+IGFuZCBzYXZlZCBpbiB0aGUgZmlsZSA8aT5zb2FwU2VydmVyLmNwcDwvaT4uIFRoZSBnZW5lcmF0ZWQgZmlsZSA8aT5zb2FwQy5jcHA8L2k+IGNvbnRhaW5zIHNlcmlhbGl6ZXJzDQorYW5kIGRlc2VyaWFsaXplcnMgZm9yIHRoZSBza2VsZXRvbi4gVGhlIGNvbXBpbGVyIGFsc28gZ2VuZXJhdGVzIGEgc2VydmljZSBkaXNwYXRjaGVyOiB0aGUgPGk+c29hcF9zZXJ2ZTwvaT4gZnVuY3Rpb24gaGFuZGxlcw0KK2NsaWVudCByZXF1ZXN0cyBvbiB0aGUgc3RhbmRhcmQgaW5wdXQgc3RyZWFtIGFuZCBkaXNwYXRjaGVzIHRoZSByZW1vdGUgbWV0aG9kIHJlcXVlc3RzIHRvIHRoZSBhcHByb3ByaWF0ZSBza2VsZXRvbnMgdG8gc2VydmUgdGhlDQorcmVxdWVzdHMuIFRoZSBza2VsZXRvbiBpbiB0dXJuIGNhbGxzIHRoZSByZW1vdGUgbWV0aG9kIGltcGxlbWVudGF0aW9uIGZ1bmN0aW9uLiBUaGUgZnVuY3Rpb24gcHJvdG90eXBlIG9mIHRoZSByZW1vdGUgbWV0aG9kDQoraW1wbGVtZW50YXRpb24gZnVuY3Rpb24gaXMgc3BlY2lmaWVkIGluIHRoZSBoZWFkZXIgZmlsZSB0aGF0IGlzIGlucHV0IHRvIHRoZSBnU09BUCBjb21waWxlci4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorSGVyZSBpcyBhbiBleGFtcGxlIENhbGN1bGF0b3Igc2VydmljZSBhcHBsaWNhdGlvbiB0aGF0IHVzZXMgdGhlIGdlbmVyYXRlZCA8aT5zb2FwX3NlcnZlPC9pPiByb3V0aW5lIHRvIGhhbmRsZSBjbGllbnQgcmVxdWVzdHM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vIENvbnRlbnRzIG9mIGZpbGUgImNhbGMuY3BwIjogPGJyIC8+DQorI2luY2x1ZGUgInNvYXBILmgiIDxiciAvPg0KKyNpbmNsdWRlICAmbHQ7IG1hdGguaCAmZ3Q7ICAvLyBmb3Igc3FydCgpIDxiciAvPg0KK21haW4oKSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfc2VydmUoc29hcF9uZXcoKSk7IC8vIHVzZSB0aGUgcmVtb3RlIG1ldGhvZCByZXF1ZXN0IGRpc3BhdGNoZXIgPGJyIC8+DQorfSA8YnIgLz4NCisvLyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgImFkZCIgcmVtb3RlIG1ldGhvZDogPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO25zX19hZGQoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIDxiPmRvdWJsZTwvYj4mbmJzcDthLCA8Yj5kb3VibGU8L2I+Jm5ic3A7YiwgPGI+ZG91YmxlPC9iPiZuYnNwOyZhbXA7cmVzdWx0KSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3Jlc3VsdCA9IGEgKyBiOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7U09BUF9PSzsgPGJyIC8+DQorfSA8YnIgLz4NCisvLyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgInN1YiIgcmVtb3RlIG1ldGhvZDogPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO25zX19zdWIoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIDxiPmRvdWJsZTwvYj4mbmJzcDthLCA8Yj5kb3VibGU8L2I+Jm5ic3A7YiwgPGI+ZG91YmxlPC9iPiZuYnNwOyZhbXA7cmVzdWx0KSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3Jlc3VsdCA9IGEgLSBiOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7U09BUF9PSzsgPGJyIC8+DQorfSA8YnIgLz4NCisvLyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgInNxcnQiIHJlbW90ZSBtZXRob2Q6IDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDtuc19fc3FydCg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgPGI+ZG91YmxlPC9iPiZuYnNwO2EsIDxiPmRvdWJsZTwvYj4mbmJzcDsmYW1wO3Jlc3VsdCkgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoYSAgJmd0OyA9IDApIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7cmVzdWx0ID0gc3FydChhKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cmV0dXJuPC9iPiZuYnNwO1NPQVBfT0s7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO30gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+ZWxzZTwvYj48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7c29hcF9yZWNlaXZlcl9mYXVsdChzb2FwLCAiU3F1YXJlIHJvb3Qgb2YgbmVnYXRpdmUgbnVtYmVyIiwgIkkgY2FuIG9ubHkgdGFrZSB0aGUgc3F1YXJlIHJvb3Qgb2YgYSBub24tbmVnYXRpdmUgbnVtYmVyIik7IDxiciAvPg0KK30gPGJyIC8+DQorLy8gQXMgYWx3YXlzLCBhIG5hbWVzcGFjZSBtYXBwaW5nIHRhYmxlIGlzIG5lZWRlZDogPGJyIC8+DQorPGI+c3RydWN0PC9iPiZuYnNwO05hbWVzcGFjZSBuYW1lc3BhY2VzW10gPSA8YnIgLz4NCit7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ly8geyJucy1wcmVmaXgiLCAibnMtbmFtZSJ9IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3siU09BUC1FTlYiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8ifSwgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyJTT0FQLUVOQyIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyJ9LCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7InhzaSIsICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIn0sIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3sieHNkIiwgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEifSwgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyJucyIsICAgICAgICJ1cm46c2ltcGxlLWNhbGMifSwgLy8gYmluZCAibnMiIG5hbWVzcGFjZSBwcmVmaXggPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7e05VTEwsIE5VTEx9IDxiciAvPg0KK307DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitOb3RlIHRoYXQgdGhlIHJlbW90ZSBtZXRob2RzIGhhdmUgYW4gZXh0cmEgaW5wdXQgcGFyYW1ldGVyIHdoaWNoIGlzIGEgcG9pbnRlciB0byB0aGUgZ1NPQVAgcnVudGltZSBlbnZpcm9ubWVudC4NCitUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHJlbW90ZSBtZXRob2RzIE1VU1QgcmV0dXJuIGEgU09BUCBlcnJvciBjb2RlLiBUaGUgY29kZSA8aT5TT0FQX09LPC9pPiBkZW5vdGVzIHN1Y2Nlc3MsIHdoaWxlDQorPGk+U09BUF9GQVVMVDwvaT4gZGVub3RlcyBhbiBleGNlcHRpb24gd2l0aCBkZXRhaWxzIHRoYXQgY2FuIGJlIGRlZmluZWQgYnkgdGhlIHVzZXIuIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24gY2FuIGJlIGFzc2lnbmVkIHRvDQordGhlIDxpPnNvYXA8L2k+PHR0Pi0mZ3Q7PC90dD48aT5mYXVsdDwvaT48dHQ+LSZndDs8L3R0PjxpPmZhdWx0c3RyaW5nPC9pPiBzdHJpbmcgYW5kIGRldGFpbHMgY2FuIGJlIGFzc2lnbmVkIHRvIHRoZQ0KKzxpPnNvYXA8L2k+PHR0Pi0mZ3Q7PC90dD48aT5mYXVsdDwvaT48dHQ+LSZndDs8L3R0PjxpPmRldGFpbDwvaT4gc3RyaW5nLiBUaGlzIGlzIFNPQVAgMS4xIHNwZWNpZmljLiBTT0FQIDEuMiByZXF1aXJlcw0KK3RoZSA8aT5zb2FwPC9pPjx0dD4tJmd0OzwvdHQ+PGk+ZmF1bHQ8L2k+PHR0Pi0mZ3Q7PC90dD48aT5TT0FQX0VOVl9fUmVhc29uPC9pPiBhbmQgdGhlDQorPGk+c29hcDwvaT48dHQ+LSZndDs8L3R0PjxpPmZhdWx0PC9pPjx0dD4tJmd0OzwvdHQ+PGk+U09BUF9FTlZfX0RldGFpbDwvaT4gc3RyaW5ncyB0byBiZSBhc3NpZ25lZC4NCitCZXR0ZXIgaXMgdG8gdXNlIHRoZQ0KKzxpPnNvYXBfcmVjZWl2ZXJfZmF1bHQ8L2k+IGZ1bmN0aW9uIHRoYXQgYWxsb2NhdGVzIGEgZmF1bHQgc3RydWN0IGFuZCBzZXRzIHRoZSBTT0FQIEZhdWx0IHN0cmluZyBhbmQgZGV0YWlscw0KK3JlZ2FyZGxlc3Mgb2YgdGhlIFNPQVAgMS4xIG9yIFNPQVAgMS4yIHZlcnNpb24gdXNlZC4gVGhlIDxpPnNvYXBfcmVjZWl2ZXJfZmF1bHQ8L2k+IGZ1bmN0aW9uIHJldHVybnMNCis8aT5TT0FQX0ZBVUxUPC9pPiwgaS5lLiZuYnNwO2FuIGFwcGxpY2F0aW9uLXNwZWNpZmljIGZhdWx0LiBUaGUgZmF1bHQgZXhjZXB0aW9uIHdpbGwgYmUgcGFzc2VkIG9uIHRvIHRoZSBjbGllbnQgb2YgdGhpcyBzZXJ2aWNlLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGlzIHNlcnZpY2UgYXBwbGljYXRpb24gY2FuIGJlIHJlYWRpbHkgaW5zdGFsbGVkIGFzIGEgQ0dJIGFwcGxpY2F0aW9uLiBUaGUgc2VydmljZSBkZXNjcmlwdGlvbiB3b3VsZCBiZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNEMEQwRDAiPjx0cj48dGQ+PHNwYW4gY2xhc3M9InJvbWFuIj4NCisNCis8dGFibGU+DQorPHRyPjx0ZD5FbmRwb2ludCBVUkw6IDwvdGQ+PHRkPnRoZSBVUkwgb2YgdGhlIENHSSBhcHBsaWNhdGlvbiA8L3RkPjwvdHI+DQorPHRyPjx0ZD5TT0FQIGFjdGlvbjogPC90ZD48dGQ+IiIgKDIgcXVvdGVzKSA8L3RkPjwvdHI+DQorPHRyPjx0ZD5SZW1vdGUgbWV0aG9kIG5hbWVzcGFjZTogPC90ZD48dGQ+PHR0PnVybjpzaW1wbGUtY2FsYzwvdHQ+IDwvdGQ+PC90cj4NCis8dHI+PHRkPlJlbW90ZSBtZXRob2QgbmFtZTogPC90ZD48dGQ+PHR0PmFkZDwvdHQ+IDwvdGQ+PC90cj4NCis8dHI+PHRkPiZuYnNwOyZuYnNwOyZuYnNwO0lucHV0IHBhcmFtZXRlcnM6IDwvdGQ+PHRkPjx0dD5hPC90dD4gb2YgdHlwZSA8dHQ+eHNkOmRvdWJsZTwvdHQ+IGFuZCA8dHQ+YjwvdHQ+IG9mIHR5cGUgPHR0PnhzZDpkb3VibGU8L3R0PiA8L3RkPjwvdHI+DQorPHRyPjx0ZD4mbmJzcDsmbmJzcDsmbmJzcDtPdXRwdXQgcGFyYW1ldGVyOiA8L3RkPjx0ZD48dHQ+cmVzdWx0PC90dD4gb2YgdHlwZSA8dHQ+eHNkOmRvdWJsZTwvdHQ+IDwvdGQ+PC90cj4NCis8dHI+PHRkPlJlbW90ZSBtZXRob2QgbmFtZTogPC90ZD48dGQ+PHR0PnN1YjwvdHQ+IDwvdGQ+PC90cj4NCis8dHI+PHRkPiZuYnNwOyZuYnNwOyZuYnNwO0lucHV0IHBhcmFtZXRlcnM6IDwvdGQ+PHRkPjx0dD5hPC90dD4gb2YgdHlwZSA8dHQ+eHNkOmRvdWJsZTwvdHQ+IGFuZCA8dHQ+YjwvdHQ+IG9mIHR5cGUgPHR0PnhzZDpkb3VibGU8L3R0PiA8L3RkPjwvdHI+DQorPHRyPjx0ZD4mbmJzcDsmbmJzcDsmbmJzcDtPdXRwdXQgcGFyYW1ldGVyOiA8L3RkPjx0ZD48dHQ+cmVzdWx0PC90dD4gb2YgdHlwZSA8dHQ+eHNkOmRvdWJsZTwvdHQ+IDwvdGQ+PC90cj4NCis8dHI+PHRkPlJlbW90ZSBtZXRob2QgbmFtZTogPC90ZD48dGQ+PHR0PnNxcnQ8L3R0PiA8L3RkPjwvdHI+DQorPHRyPjx0ZD4mbmJzcDsmbmJzcDsmbmJzcDtJbnB1dCBwYXJhbWV0ZXI6IDwvdGQ+PHRkPjx0dD5hPC90dD4gb2YgdHlwZSA8dHQ+eHNkOmRvdWJsZTwvdHQ+IDwvdGQ+PC90cj4NCis8dHI+PHRkPiZuYnNwOyZuYnNwOyZuYnNwO091dHB1dCBwYXJhbWV0ZXI6IDwvdGQ+PHRkPjx0dD5yZXN1bHQ8L3R0PiBvZiB0eXBlIDx0dD54c2Q6ZG91YmxlPC90dD4gb3IgYSBTT0FQIEZhdWx0DQorPC90ZD48L3RyPjwvdGFibGU+DQorDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvc3Bhbj4NCitUaGUgPGk+c29hcGNwcDI8L2k+IGNvbXBpbGUgZ2VuZXJhdGVzIGEgV1NETCBmaWxlIGZvciB0aGlzIHNlcnZpY2UsIHNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzp3c2RsIj43LjIuODwvYT4uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1VubGVzcyB0aGUgQ0dJIGFwcGxpY2F0aW9uIGluc3BlY3RzIGFuZCBjaGVja3MgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIDxpPlNPQVBBY3Rpb248L2k+IHdoaWNoIGNvbnRhaW5zIHRoZSBTT0FQIGFjdGlvbiByZXF1ZXN0IGJ5DQorYSBjbGllbnQsIHRoZSBTT0FQIGFjdGlvbiBpcyBpZ25vcmVkIGJ5IHRoZSBDR0kgYXBwbGljYXRpb24uICBTT0FQIGFjdGlvbnMgYXJlIHNwZWNpZmljIHRvIHRoZSBTT0FQIHByb3RvY29sIGFuZCBwcm92aWRlIGEgbWVhbnMNCitmb3Igcm91dGluZyByZXF1ZXN0cyBhbmQgZm9yIHNlY3VyaXR5IHJlYXNvbnMgKGUuZy4mbmJzcDtmaXJld2FsbCBzb2Z0d2FyZSBjYW4gaW5zcGVjdCBTT0FQIGFjdGlvbiBoZWFkZXJzIHRvIGdyYW50IG9yIGRlbnkgdGhlDQorU09BUCByZXF1ZXN0LiBOb3RlIHRoYXQgdGhpcyByZXF1aXJlcyB0aGUgU09BUCBzZXJ2aWNlIHRvIGNoZWNrIHRoZSBTT0FQIGFjdGlvbiBoZWFkZXIgYXMgd2VsbCB0byBtYXRjaCBpdCB3aXRoIHRoZSByZW1vdGUgbWV0aG9kLikNCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIGhlYWRlciBmaWxlIGlucHV0IHRvIHRoZSBnU09BUCBjb21waWxlciBkb2VzIG5vdCBuZWVkIHRvIGJlIG1vZGlmaWVkIHRvIGdlbmVyYXRlIGNsaWVudCBzdHVicyBmb3IgYWNjZXNzaW5nIHRoaXMNCitzZXJ2aWNlLiAgQ2xpZW50IGFwcGxpY2F0aW9ucyBjYW4gYmUgZGV2ZWxvcGVkIGJ5IHVzaW5nIHRoZSBzYW1lIGhlYWRlciBmaWxlIGFzIGZvciB3aGljaCB0aGUgc2VydmljZSBhcHBsaWNhdGlvbg0KK3dhcyBkZXZlbG9wZWQuICBGb3IgZXhhbXBsZSwgdGhlIDxpPnNvYXBfY2FsbF9uc19fYWRkPC9pPiBzdHViIHJvdXRpbmUgaXMgYXZhaWxhYmxlIGZyb20gdGhlIDxpPnNvYXBDbGllbnQuY3BwPC9pPiBmaWxlIGFmdGVyIGludm9raW5nDQordGhlIGdTT0FQIGNvbXBpbGVyIG9uIHRoZSA8aT5jYWxjLmg8L2k+IGhlYWRlciBmaWxlLiBBcyBhIHJlc3VsdCwgY2xpZW50IGFuZCBzZXJ2aWNlIGFwcGxpY2F0aW9ucyBjYW4gYmUgZGV2ZWxvcGVkIHdpdGhvdXQNCit0aGUgbmVlZCB0byBrbm93IHRoZSBkZXRhaWxzIG9mIHRoZSBTT0FQIGVuY29kaW5nIHVzZWQuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkJICAgICAgPGg0PjxhIG5hbWU9InR0aF9zRWM3LjIuMiI+DQorNy4yLjI8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPk1TVkMrKyBCdWlsZHM8L2ZvbnQ+PC9oND4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorDQorPHVsPg0KKzxsaT4gV2luMzIgYnVpbGRzIG5lZWQgd2luc29jay5kbGwgKE1TIFZpc3VhbCBDKysgIndzb2NrMzIubGliIikNCitUbyBkbyB0aGlzIGluIFZpc3VhbCBDKysgNi4wLCBnbyB0byAiUHJvamVjdCIsICYjMjIzO2V0dGluZ3MiLCBzZWxlY3QgdGhlICJMaW5rIg0KK3RhYiAodGhlIHByb2plY3QgZmlsZSBuZWVkcyB0byBiZSBzZWxlY3RlZCBpbiB0aGUgZmlsZSB2aWV3KSBhbmQgYWRkDQorIndzb2NrMzIubGliIiB0byB0aGUgJiMyMTQ7YmplY3QvbGlicmFyeSBtb2R1bGVzIiBlbnRyeS4NCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorPC9saT4NCisNCis8bGk+IFVzZSBmaWxlcyB3aXRoIGV4dGVuc2lvbiAuY3BwIG9ubHkgKGRvbid0IG1peCAuYyB3aXRoIC5jcHApLg0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8L2xpPg0KKw0KKzxsaT4gVHVybiBwcmUtY29tcGlsZWQgaGVhZGVycyBvZmYuDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorDQorPGxpPiBXaGVuIGNyZWF0aW5nIGEgbmV3IHByb2plY3QsIHlvdSBjYW4gc3BlY2lmeSBhIGN1c3RvbSBidWlsZCBzdGVwIHRvIGF1dG9tYXRpY2FsbHkgaW52b2tlIHRoZSBnU09BUCBjb21waWxlciBvbiBhIGdTT0FQIGhlYWRlciBmaWxlLiBJbiB0aGlzIHdheSB5b3UgY2FuIGluY3JlbWVudGFsbHkgYnVpbGQgYSBuZXcgc2VydmljZSBieSBhZGRpbmcgbmV3IG9wZXJhdGlvbnMgYW5kIGRhdGEgdHlwZXMgdG8gdGhlIGhlYWRlciBmaWxlLiBUbyBzcGVjaWZ5IGEgY3VzdG9tIGJ1aWxkIHN0ZXAsIHNlbGVjdCB0aGUgIlByb2plY3QiIG1lbnUgaXRlbSAiU2V0dGluZ3MiIGFuZCBzZWxlY3QgdGhlIGhlYWRlciBmaWxlIGluIHRoZSBGaWxlIHZpZXcgcGFuZS4gU2VsZWN0IHRoZSAiQ3VzdG9tIEJ1aWxkIiB0YWIgYW5kIGVudGVyICc8aT5zb2FwY3BwMi5leGUgIiQoaW5wdXRQYXRoKSI8L2k+JyBpbiB0aGUgIkNvbW1hbmQiIHBhbmUuIEVudGVyICc8aT5zb2FwU3R1Yi5oIHNvYXBILmggc29hcEMuY3BwIHNvYXBDbGllbnQuY3BwIHNvYXBTZXJ2ZXIuY3BwIHNvYXBDbGllbnRMaWIuY3BwIHNvYXBTZXJ2ZXJMaWIuY3BwPC9pPicuIERvbid0IGZvcmdldCB0byBhZGQgdGhlIDxpPnNvYXBYWVpQcm94eS5oIHNvYXBYWVpQcm94eS5jcHAgc29hcFhZWk9iamVjdC5oIHNvYXBYWVpPYmplY3QuY3BwPC9pPiBmaWxlcyB0aGF0IGFyZSBnZW5lcmF0ZWQgZm9yIEMrKyBjbGFzcyBwcm94aWVzIGFuZCBzZXJ2ZXIgb2JqZWN0cyBuYW1lZCBYWVouIENsaWNrICYjMjE0O0siLiBSdW4gdGhlIHNvYXBjcHAyIGNvbXBpbGVyIG9uY2UgdG8gZ2VuZXJhdGUgdGhlc2UgZmlsZXMgKHlvdSBjYW4gc2ltcGx5IGRvIHRoaXMgYnkgc2VsZWN0aW5nIHlvdXIgaGVhZGVyIGZpbGUgYW5kIHNlbGVjdCAiQ29tcGlsZSIpLiBBZGQgdGhlIGZpbGVzIHRvIHlvdXIgcHJvamVjdC4gRWFjaCB0aW1lIHlvdSBtYWtlIGEgY2hhbmdlIHRvIHRoZSBoZWFkZXIgZmlsZSwgdGhlIHByb2plY3Qgc291cmNlcyBhcmUgdXBkYXRlZCBhdXRvbWF0aWNhbGx5Lg0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8L2xpPg0KKw0KKzxsaT4gWW91IG1heSB3YW50IHRvIHVzZSB0aGUgV2luSW5ldCBpbnRlcmZhY2UgYXZhaWxhYmxlIGluIHRoZSA8aT5tb2RfZ3NvYXA8L2k+IGRpcmVjdG9yeSBvZiB0aGUgZ1NPQVAgcGFja2FnZSB0byBzaW1wbGlmeSBJbnRlcm5ldCBhY2Nlc3MgYW5kIGRlYWwgd2l0aCBlbmNyeXB0aW9uLCBwcm94aWVzLCBhbmQgYXV0aGVudGljYXRpb24uIEFQSSBpbnN0cnVjdGlvbnMgYXJlIGluY2x1ZGVkIGluIHRoZSBzb3VyY2UuDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorDQorPGxpPiBGb3IgdGhlIFBvY2tldFBDLCBydW4gdGhlIDxpPndzZGwyaDwvaT4gV1NETCBwYXJzZXIgd2l0aCBvcHRpb24gPGk+LXM8L2k+IHRvIHByZXZlbnQgdGhlIGdlbmVyYXRpb24gb2YgU1RMIGNvZGUuIEluIGFkZGl0aW9uLCA8aT50aW1lX3Q8L2k+IHNlcmlhbGl6YXRpb24gaXMgbm90IHN1cHBvcnRlZCwgd2hpY2ggbWVhbnMgdGhhdCB5b3Ugc2hvdWxkIGFkZCB0aGUgZm9sbG93aW5nIGxpbmUgdG8gPGk+dHlwZW1hcC5kYXQ8L2k+IGluZGljYXRpbmcgYSBtYXBwaW5nIG9mIDxpPnhzZF9fZGF0ZVRpbWU8L2k+IHRvIDxpPjxiPmNoYXI8L2I+KjwvaT46IDx0dD54c2RfX2RhdGVUaW1lID0gIC0gIGNoYXIqICAtICBjaGFyKjwvdHQ+Lg0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8L2xpPg0KKzwvdWw+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkJICAgICAgPGg0PjxhIG5hbWU9InR0aF9zRWM3LjIuMyI+DQorNy4yLjM8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPkhvdyB0byBDcmVhdGUgYSBTdGFuZC1BbG9uZSBnU09BUCBTZXJ2aWNlPC9mb250PjwvaDQ+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBkZXBsb3ltZW50IG9mIGEgV2ViIHNlcnZpY2UgYXMgYSBDR0kgYXBwbGljYXRpb24gaXMgYW4gZWFzeSBtZWFucyB0byBwcm92aWRlIHlvdXIgc2VydmljZSBvbiB0aGUgSW50ZXJuZXQuDQorZ1NPQVAgc2VydmljZXMgY2FuIGFsc28gcnVuIGFzIHN0YW5kLWFsb25lIHNlcnZpY2VzIG9uIGFueSBwb3J0IGJ5IHV0aWxpemluZyB0aGUgYnVpbHQtaW4gSFRUUCBhbmQgVENQL0lQIHN0YWNrcy4NCitUaGUgc3RhbmQtYWxvbmUgc2VydmljZXMgY2FuIGJlIHJ1biBvbiBwb3J0IDgwIHRoZXJlYnkgcHJvdmlkaW5nIFdlYiBzZXJ2ZXIgY2FwYWJpbGl0aWVzIHJlc3RyaWN0ZWQgdG8gU09BUCBSUEMuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RvIGNyZWF0ZSBhIHN0YW5kLWFsb25lIHNlcnZpY2UsIG9ubHkgdGhlIDxpPm1haW48L2k+IHJvdXRpbmUgb2YgdGhlIHNlcnZpY2UgbmVlZHMgdG8gYmUgbW9kaWZpZWQgYXMgZm9sbG93cy4gIEluc3RlYWQgb2YganVzdCBjYWxsaW5nIHRoZQ0KKzxpPnNvYXBfc2VydmU8L2k+IHJvdXRpbmUsIHRoZSA8aT5tYWluPC9pPiByb3V0aW5lIGlzIGNoYW5nZWQgaW50bzoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+aW50PC9iPiZuYnNwO21haW4oKSA8YnIgLz4NCit7PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgc29hcDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aW50PC9iPiZuYnNwO20sIHM7IC8vIG1hc3RlciBhbmQgc2xhdmUgc29ja2V0cyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2luaXQoJmFtcDtzb2FwKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7bSA9IHNvYXBfYmluZCgmYW1wO3NvYXAsIDx0dD4ibWFjaGluZS5jcy5mc3UuZWR1IjwvdHQ+LCAxODA4MywgMTAwKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KG0gICZsdDsgIDApIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfcHJpbnRfZmF1bHQoJmFtcDtzb2FwLCBzdGRlcnIpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5lbHNlPC9iPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZnByaW50ZihzdGRlcnIsIDx0dD4iU29ja2V0Jm5ic3A7Y29ubmVjdGlvbiZuYnNwO3N1Y2Nlc3NmdWw6Jm5ic3A7bWFzdGVyJm5ic3A7c29ja2V0Jm5ic3A7PSZuYnNwOyVkXG4iPC90dD4sIG0pOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5mb3I8L2I+Jm5ic3A7KDxiPmludDwvYj4mbmJzcDtpID0gMTsgOyBpKyspIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3s8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzID0gc29hcF9hY2NlcHQoJmFtcDtzb2FwKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KHMgICZsdDsgIDApIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9wcmludF9mYXVsdCgmYW1wO3NvYXAsIHN0ZGVycik7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2JyZWFrOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDt9IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2ZwcmludGYoc3RkZXJyLCA8dHQ+IiVkOiZuYnNwO2FjY2VwdGVkJm5ic3A7Y29ubmVjdGlvbiZuYnNwO2Zyb20mbmJzcDtJUD0lZC4lZC4lZC4lZCZuYnNwO3NvY2tldD0lZCI8L3R0PiwgaSwgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7KHNvYXAuaXAgJmd0OyZndDsgMjQpJmFtcDsweEZGLCAoc29hcC5pcCAmZ3Q7Jmd0OyAxNikmYW1wOzB4RkYsIChzb2FwLmlwICZndDsmZ3Q7IDgpJmFtcDsweEZGLCBzb2FwLmlwJmFtcDsweEZGLCBzKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KHNvYXBfc2VydmUoJmFtcDtzb2FwKSAhPSBTT0FQX09LKQkvLyBwcm9jZXNzIFJQQyByZXF1ZXN0IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfcHJpbnRfZmF1bHQoJmFtcDtzb2FwLCBzdGRlcnIpOyAvLyBwcmludCBlcnJvciA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtmcHJpbnRmKHN0ZGVyciwgPHR0PiJyZXF1ZXN0Jm5ic3A7c2VydmVkXG4iPC90dD4pOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2Rlc3Ryb3koJmFtcDtzb2FwKTsJLy8gY2xlYW4gdXAgY2xhc3MgaW5zdGFuY2VzIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfZW5kKCZhbXA7c29hcCk7CS8vIGNsZWFuIHVwIGV2ZXJ5dGhpbmcgYW5kIGNsb3NlIHNvY2tldCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDt9IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO30gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9kb25lKCZhbXA7c29hcCk7IC8vIGNsb3NlIG1hc3RlciBzb2NrZXQgYW5kIGRldGFjaCBlbnZpcm9ubWVudCA8YnIgLz4NCit9DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgPGk+c29hcF9zZXJ2ZTwvaT4gZGlzcGF0Y2hlciBoYW5kbGVzIG9uZSByZXF1ZXN0IG9yIG11bHRpcGxlIHJlcXVlc3RzIHdoZW4gSFRUUCBrZWVwLWFsaXZlIGlzIGVuYWJsZWQgKHdpdGggdGhlIDxpPlNPQVBfSU9fS0VFUEFMSVZFPC9pPiBmbGFnIHNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzprZWVwYWxpdmUiPjE4LjExPC9hPikuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBnU09BUCBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCBhcmU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjRDBEMEQwIj48dHI+PHRkPjxzcGFuIGNsYXNzPSJyb21hbiI+DQorDQorPHRhYmxlPg0KKzx0cj48dGQgd2lkdGg9IjMwMSI+PGZvbnQgY29sb3I9IiNGRjAwMDAiPjxiPkZ1bmN0aW9uPC9iPjwvZm9udD4gPC90ZD48dGQgd2lkdGg9IjMwMSI+PGZvbnQgY29sb3I9IiNGRjAwMDAiPjxiPkRlc2NyaXB0aW9uPC9iPjwvZm9udD4gPC90ZD48L3RyPg0KKzx0cj48dGQgd2lkdGg9IjMwMSI+PGk+c29hcF9pbml0KDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwKTwvaT4gPC90ZD48dGQgd2lkdGg9IjMwMSI+SW5pdGlhbGl6ZXMgZ1NPQVAgcnVudGltZSBlbnZpcm9ubWVudCAocmVxdWlyZWQgb25jZSkgPC90ZD48L3RyPg0KKzx0cj48dGQgd2lkdGg9IjMwMSI+PGk+c29hcF9iaW5kKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj5jaGFyPC9iPiZuYnNwOypob3N0LCA8Yj5pbnQ8L2I+Jm5ic3A7cG9ydCwgPGI+aW50PC9iPiZuYnNwO2JhY2tsb2cpPC9pPiA8L3RkPjx0ZCB3aWR0aD0iMzAxIj5SZXR1cm5zIG1hc3RlciBzb2NrZXQgKGJhY2tsb2cgPSBtYXguJm5ic3A7cXVldWUNCitzaXplIGZvciByZXF1ZXN0cykuIFdoZW4gPGk+aG9zdD09TlVMTDwvaT46IGhvc3QgaXMgdGhlIG1hY2hpbmUgb24gd2hpY2ggdGhlIHNlcnZpY2UgcnVucyA8L3RkPjwvdHI+DQorPHRyPjx0ZCB3aWR0aD0iMzAxIj48aT5zb2FwX2FjY2VwdCg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCk8L2k+IDwvdGQ+PHRkIHdpZHRoPSIzMDEiPlJldHVybnMgc2xhdmUgc29ja2V0IDwvdGQ+PC90cj4NCis8dHI+PHRkIHdpZHRoPSIzMDEiPjxpPnNvYXBfZW5kKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwKTwvaT4gPC90ZD48dGQgd2lkdGg9IjMwMSI+Q2xlYW4gdXAgZGVzZXJpYWxpemVkIGRhdGEgKGV4Y2VwdCBjbGFzcyBpbnN0YW5jZXMpIGFuZCB0ZW1wb3JhcnkgZGF0YSA8L3RkPjwvdHI+DQorPHRyPjx0ZCB3aWR0aD0iMzAxIj48aT5zb2FwX2ZyZWUoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXApPC9pPiA8L3RkPjx0ZCB3aWR0aD0iMzAxIj5DbGVhbiB1cCB0ZW1wb3JhcnkgZGF0YSBvbmx5IDwvdGQ+PC90cj4NCis8dHI+PHRkIHdpZHRoPSIzMDEiPjxpPnNvYXBfZGVzdHJveSg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCk8L2k+IDwvdGQ+PHRkIHdpZHRoPSIzMDEiPkNsZWFuIHVwIGRlc2VyaWFsaXplZCBjbGFzcyBpbnN0YW5jZXMgKG5vdGU6IHRoaXMgZnVuY3Rpb24gd2lsbCBiZSByZW5hbWVkIHdpdGggb3B0aW9uIDxpPi1uPC9pPiA8L3RkPjwvdHI+DQorPHRyPjx0ZCB3aWR0aD0iMzAxIj48aT5zb2FwX2RvbmUoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXApPC9pPiA8L3RkPjx0ZCB3aWR0aD0iMzAxIj5SZXNldDogY2xvc2UgbWFzdGVyL3NsYXZlIHNvY2tldHMgYW5kIHJlbW92ZSBjYWxsYmFja3MgPC90ZD48L3RyPg0KKzx0cj48dGQgd2lkdGg9IjMwMSI+PC90ZD48dGQgd2lkdGg9IjMwMSI+KHNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzpjYWxsYmFjayI+MTguNzwvYT4gPC90ZD48L3RyPjwvdGFibGU+DQorDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvc3Bhbj4NCitUaGUgPGk+aG9zdDwvaT4gbmFtZSBpbiA8aT5zb2FwX2JpbmQ8L2k+IG1heSBiZSBOVUxMIHRvIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgaG9zdCBzaG91bGQgYmUgdXNlZC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIDxpPnNvYXAuYWNjZXB0X3RpbWVvdXQ8L2k+IGF0dHJpYnV0ZSBvZiB0aGUgZ1NPQVAgcnVuLXRpbWUgZW52aXJvbm1lbnQgc3BlY2lmaWVzIHRoZSB0aW1lb3V0IHZhbHVlIGZvciBhIG5vbi1ibG9ja2luZw0KKzxpPnNvYXBfYWNjZXB0KCZhbXA7c29hcCk8L2k+IGNhbGwuIFNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzp0aW1lb3V0Ij4xOC4xNzwvYT4gZm9yIG1vcmUgZGV0YWlscyBvbiB0aW1lb3V0IG1hbmFnZW1lbnQuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1NlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzptZW1vcnkiPjguMTM8L2E+IGZvciBtb3JlIGRldGFpbHMgb24gbWVtb3J5IG1hbmFnZW1lbnQuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0EgY2xpZW50IGFwcGxpY2F0aW9uIGNvbm5lY3RzIHRvIHRoaXMgc3RhbmQtYWxvbmUgc2VydmljZSB3aXRoIHRoZSBlbmRwb2ludA0KKzxpPm1hY2hpbmUuY3MuZnN1LmVkdToxODA4MzwvaT4uDQorQSBjbGllbnQgbWF5IHVzZSB0aGUgPGk+aHR0cDovLzwvaT4gcHJlZml4LiBXaGVuIGFic2VudCwgbm8gSFRUUCBoZWFkZXIgaXMgc2VuZCBhbmQgbm8gSFRUUC1iYXNlZCBpbmZvcm1hdGlvbiB3aWxsIGJlIGNvbW11bmljYXRlZA0KK3RvIHRoZSBzZXJ2aWNlLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJCSAgICAgIDxoND48YSBuYW1lPSJ0dGhfc0VjNy4yLjQiPg0KKzcuMi40PC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5Ib3cgdG8gQ3JlYXRlIGEgTXVsdGktVGhyZWFkZWQgU3RhbmQtQWxvbmUgU2VydmljZTwvZm9udD48L2g0PjxhIG5hbWU9InNlYzptdCI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitNdWx0aS10aHJlYWRpbmcgYSBXZWIgU2VydmljZSBpcyBlc3NlbnRpYWwgd2hlbiB0aGUgcmVzcG9uc2UgdGltZXMgZm9yIGhhbmRsaW5nIHJlcXVlc3RzIGJ5IHRoZSBzZXJ2aWNlIGFyZSAocG90ZW50aWFsbHkpIGxvbmcgb3Igd2hlbiBrZWVwLWFsaXZlIGlzIGVuYWJsZWQsIHNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzprZWVwYWxpdmUiPjE4LjExPC9hPi4NCitJbiBjYXNlIG9mIGxvbmcgcmVzcG9uc2UgdGltZXMsIHRoZSBsYXRlbmNpZXMgaW50cm9kdWNlZCBieSB0aGUgdW5yZWxhdGVkIHJlcXVlc3RzIG1heSBiZWNvbWUgcHJvaGliaXRpdmUgZm9yIGEgc3VjY2Vzc2Z1bA0KK2RlcGxveW1lbnQgb2YgYSBzdGFuZC1hbG9uZSBzZXJ2aWNlLiBXaGVuIEhUVFAga2VlcC1hbGl2ZSBpcyBlbmFibGVkLCBhIGNsaWVudCBtYXkgbm90IGNsb3NlIHRoZSBzb2NrZXQgb24gdGltZSwgdGhlcmVieSBwcmV2ZW50aW5nIG90aGVyIGNsaWVudHMgZnJvbSBjb25uZWN0aW5nLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitnU09BUCAyLjAgYW5kIGhpZ2hlciBpcyB0aHJlYWQgc2FmZSBhbmQgc3VwcG9ydHMgdGhlIGltcGxlbWVudGF0aW9uIG9mIG11bHRpLXRocmVhZGVkIHN0YW5kLWFsb25lIHNlcnZpY2VzIGluIHdoaWNoDQorYSB0aHJlYWQgaXMgdXNlZCB0byBoYW5kbGUgYSByZXF1ZXN0Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgZm9sbG93aW5nIGV4YW1wbGUgaWxsdXN0cmF0ZXMgdGhlIHVzZSBvZiB0aHJlYWRzIHRvIGltcHJvdmUgdGhlIHF1YWxpdHkgb2Ygc2VydmljZSBieSBoYW5kbGluZyBuZXcgcmVxdWVzdHMgaW4gc2VwYXJhdGUgdGhyZWFkczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorI2luY2x1ZGUgInNvYXBILmgiIDxiciAvPg0KKyNpbmNsdWRlICAmbHQ7IHB0aHJlYWQuaCAmZ3Q7ICA8YnIgLz4NCisjZGVmaW5lIEJBQ0tMT0cgKDEwMCkJLy8gTWF4LiByZXF1ZXN0IGJhY2tsb2cgPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO21haW4oPGI+aW50PC9iPiZuYnNwO2FyZ2MsIDxiPmNoYXI8L2I+Jm5ic3A7Kiphcmd2KSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwIHNvYXA7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfaW5pdCgmYW1wO3NvYXApOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoYXJnYyAgJmx0OyAgMikgLy8gbm8gYXJnczogYXNzdW1lIHRoaXMgaXMgYSBDR0kgYXBwbGljYXRpb24gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwX3NlcnZlKCZhbXA7c29hcCk7IC8vIHNlcnZlIHJlcXVlc3QsIG9uZSB0aHJlYWQsIENHSSBzdHlsZSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2Rlc3Ryb3koJmFtcDtzb2FwKTsgLy8gZGVhbGxvYyBDKysgZGF0YSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2VuZCgmYW1wO3NvYXApOyAvLyBkZWFsbG9jIGRhdGEgYW5kIGNsZWFuIHVwIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO30gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+ZWxzZTwvYj4mbmJzcDs8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NvYXAuc2VuZF90aW1lb3V0ID0gNjA7IC8vIDYwIHNlY29uZHMgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c29hcC5yZWN2X3RpbWVvdXQgPSA2MDsgLy8gNjAgc2Vjb25kcyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwLmFjY2VwdF90aW1lb3V0ID0gMzYwMDsgLy8gc2VydmVyIHN0b3BzIGFmdGVyIDEgaG91ciBvZiBpbmFjdGl2aXR5IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NvYXAubWF4X2tlZXBfYWxpdmUgPSAxMDA7IC8vIG1heCBrZWVwLWFsaXZlIHNlcXVlbmNlIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPnZvaWQ8L2I+Jm5ic3A7KnByb2Nlc3NfcmVxdWVzdCg8Yj52b2lkPC9iPiopOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqdHNvYXA7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3B0aHJlYWRfdCB0aWQ7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPmludDwvYj4mbmJzcDtwb3J0ID0gYXRvaShhcmd2WzFdKTsgLy8gZmlyc3QgY29tbWFuZC1saW5lIGFyZyBpcyBwb3J0IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NPQVBfU09DS0VUIG0sIHM7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO20gPSBzb2FwX2JpbmQoJmFtcDtzb2FwLCBOVUxMLCBwb3J0LCBCQUNLTE9HKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KCFzb2FwX3ZhbGlkX3NvY2tldChtKSkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZXhpdCgxKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZnByaW50ZihzdGRlcnIsIDx0dD4iU29ja2V0Jm5ic3A7Y29ubmVjdGlvbiZuYnNwO3N1Y2Nlc3NmdWwmbmJzcDslZFxuIjwvdHQ+LCBtKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Zm9yPC9iPiZuYnNwOyg7OykgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7eyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzID0gc29hcF9hY2NlcHQoJmFtcDtzb2FwKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KCFzb2FwX3ZhbGlkX3NvY2tldChzKSkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7eyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoc29hcC5lcnJudW0pIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9wcmludF9mYXVsdCgmYW1wO3NvYXAsIHN0ZGVycik7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2V4aXQoMSk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO30gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZnByaW50ZihzdGRlcnIsIDx0dD4ic2VydmVyJm5ic3A7dGltZWQmbmJzcDtvdXRcbiI8L3R0Pik7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPmJyZWFrPC9iPjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtmcHJpbnRmKHN0ZGVyciwgPHR0PiJUaHJlYWQmbmJzcDslZCZuYnNwO2FjY2VwdHMmbmJzcDtzb2NrZXQmbmJzcDslZCZuYnNwO2Nvbm5lY3Rpb24mbmJzcDtmcm9tJm5ic3A7SVAmbmJzcDslZC4lZC4lZC4lZFxuIjwvdHQ+LCBpLCBzLCAoc29hcC5pcCAmZ3Q7Jmd0OyAyNCkmYW1wOzB4RkYsDQorKHNvYXAuaXAgJmd0OyZndDsgMTYpJmFtcDsweEZGLCAoc29hcC5pcCAmZ3Q7Jmd0OyA4KSZhbXA7MHhGRiwgc29hcC5pcCZhbXA7MHhGRik7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3Rzb2FwID0gc29hcF9jb3B5KCZhbXA7c29hcCk7IC8vIG1ha2UgYSBzYWZlIGNvcHkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KCF0c29hcCkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+YnJlYWs8L2I+OyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtwdGhyZWFkX2NyZWF0ZSgmYW1wO3RpZCwgTlVMTCwgKDxiPnZvaWQ8L2I+KigqKSg8Yj52b2lkPC9iPiopKXByb2Nlc3NfcmVxdWVzdCwgKDxiPnZvaWQ8L2I+Kil0c29hcCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO30gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2RvbmUoJmFtcDtzb2FwKTsgLy8gZGV0YWNoIHNvYXAgc3RydWN0IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDswOyA8YnIgLz4NCit9IDxiciAvPg0KKzxiPnZvaWQ8L2I+Jm5ic3A7KnByb2Nlc3NfcmVxdWVzdCg8Yj52b2lkPC9iPiZuYnNwOypzb2FwKSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3B0aHJlYWRfZGV0YWNoKHB0aHJlYWRfc2VsZigpKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9zZXJ2ZSgoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAqKXNvYXApOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2Rlc3Ryb3koKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwKilzb2FwKTsgLy8gZGVhbGxvYyBDKysgZGF0YSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2VuZCgoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAqKXNvYXApOyAvLyBkZWFsbG9jIGRhdGEgYW5kIGNsZWFuIHVwIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfZG9uZSgoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAqKXNvYXApOyAvLyBkZXRhY2ggc29hcCBzdHJ1Y3QgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7ZnJlZShzb2FwKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cmV0dXJuPC9iPiZuYnNwO05VTEw7IDxiciAvPg0KK30NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK05vdGU6IHRoZSBjb2RlIGRvZXMgbm90IHdhaXQgZm9yIHRocmVhZHMgdG8gam9pbiB0aGUgbWFpbiB0aHJlYWQgdXBvbiBwcm9ncmFtIHRlcm1pbmF0aW9uLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgPGk+c29hcF9zZXJ2ZTwvaT4gZGlzcGF0Y2hlciBoYW5kbGVzIG9uZSByZXF1ZXN0IG9yIG11bHRpcGxlIHJlcXVlc3RzIHdoZW4NCitIVFRQIGtlZXAtYWxpdmUgaXMgc2V0IHdpdGggPGk+U09BUF9JT19LRUVQQUxJVkU8L2k+LiBUaGUNCis8aT5zb2FwLm1heF9rZWVwX2FsaXZlPC9pPiB2YWx1ZSBjYW4gYmUgc2V0IHRvIHRoZSBtYXhpbXVtIGtlZXAtYWxpdmUgY2FsbHMNCithbGxvd2VkLCB3aGljaCBpcyBpbXBvcnRhbnQgdG8gYXZvaWQgYSBjbGllbnQgZnJvbSBob2xkaW5nIGEgdGhyZWFkDQoraW5kZWZpbml0ZWx5LiBUaGUgc2VuZCBhbmQgcmVjZWl2ZSB0aW1lb3V0cyBhcmUgc2V0IHRvIGF2b2lkIChpbnRlbnRpb25hbGx5KQ0KK3Nsb3cgY2xpZW50cyBmcm9tIGhvbGRpbmcgYSBzb2NrZXQgY29ubmVjdGlvbiB0b28gbG9uZy4gVGhlIGFjY2VwdCB0aW1lb3V0IGlzIHVzZWQNCit0byBsZXQgdGhlIHNlcnZlciB0ZXJtaW5hdGUgYXV0b21hdGljYWxseSBhZnRlciBhIHBlcmlvZCBvZiBpbmFjdGl2aXR5Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgZm9sbG93aW5nIGV4YW1wbGUgdXNlcyBhIHBvb2wgb2Ygc2VydmVycyB0byBsaW1pdCB0aGUgbWFjaGluZSdzIHJlc291cmNlIHV0aWxpemF0aW9uOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisjaW5jbHVkZSAic29hcEguaCIgPGJyIC8+DQorI2luY2x1ZGUgICZsdDsgcHRocmVhZC5oICZndDsgIDxiciAvPg0KKyNkZWZpbmUgQkFDS0xPRyAoMTAwKQkvLyBNYXguIHJlcXVlc3QgYmFja2xvZyA8YnIgLz4NCisjZGVmaW5lIE1BWF9USFIgKDEwKQkvLyBNYXguIHRocmVhZHMgdG8gc2VydmUgcmVxdWVzdHMgPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO21haW4oPGI+aW50PC9iPiZuYnNwO2FyZ2MsIDxiPmNoYXI8L2I+Jm5ic3A7Kiphcmd2KSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwIHNvYXA7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfaW5pdCgmYW1wO3NvYXApOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoYXJnYyAgJmx0OyAgMikgLy8gbm8gYXJnczogYXNzdW1lIHRoaXMgaXMgYSBDR0kgYXBwbGljYXRpb24gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwX3NlcnZlKCZhbXA7c29hcCk7IC8vIHNlcnZlIHJlcXVlc3QsIG9uZSB0aHJlYWQsIENHSSBzdHlsZSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2Rlc3Ryb3koJmFtcDtzb2FwKTsgLy8gZGVhbGxvYyBDKysgZGF0YSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2VuZCgmYW1wO3NvYXApOyAvLyBkZWFsbG9jIGRhdGEgYW5kIGNsZWFuIHVwIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO30gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+ZWxzZTwvYj4mbmJzcDs8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwX3RocltNQVhfVEhSXTsgLy8gZWFjaCB0aHJlYWQgbmVlZHMgYSBydW50aW1lIGVudmlyb25tZW50IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3B0aHJlYWRfdCB0aWRbTUFYX1RIUl07IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPmludDwvYj4mbmJzcDtwb3J0ID0gYXRvaShhcmd2WzFdKTsgLy8gZmlyc3QgY29tbWFuZC1saW5lIGFyZyBpcyBwb3J0IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NPQVBfU09DS0VUIG0sIHM7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPmludDwvYj4mbmJzcDtpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDttID0gc29hcF9iaW5kKCZhbXA7c29hcCwgTlVMTCwgcG9ydCwgQkFDS0xPRyk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyghc29hcF92YWxpZF9zb2NrZXQobSkpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2V4aXQoMSk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2ZwcmludGYoc3RkZXJyLCA8dHQ+IlNvY2tldCZuYnNwO2Nvbm5lY3Rpb24mbmJzcDtzdWNjZXNzZnVsJm5ic3A7JWRcbiI8L3R0PiwgbSk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPmZvcjwvYj4mbmJzcDsoaSA9IDA7IGkgICZsdDsgIE1BWF9USFI7IGkrKykgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF90aHJbaV0gPSBOVUxMOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5mb3I8L2I+Jm5ic3A7KDs7KSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDt7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPmZvcjwvYj4mbmJzcDsoaSA9IDA7IGkgICZsdDsgIE1BWF9USFI7IGkrKykgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7eyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzID0gc29hcF9hY2NlcHQoJmFtcDtzb2FwKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KCFzb2FwX3ZhbGlkX3NvY2tldChzKSkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7eyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoc29hcC5lcnJudW0pIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9wcmludF9mYXVsdCgmYW1wO3NvYXAsIHN0ZGVycik7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNvbnRpbnVlPC9iPjsgLy8gcmV0cnk8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDt9IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPmVsc2U8L2I+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7eyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtmcHJpbnRmKHN0ZGVyciwgPHR0PiJTZXJ2ZXImbmJzcDt0aW1lZCZuYnNwO291dFxuIjwvdHQ+KTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+YnJlYWs8L2I+OyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDt9IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO30gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZnByaW50ZihzdGRlcnIsIDx0dD4iVGhyZWFkJm5ic3A7JWQmbmJzcDthY2NlcHRzJm5ic3A7c29ja2V0Jm5ic3A7JWQmbmJzcDtjb25uZWN0aW9uJm5ic3A7ZnJvbSZuYnNwO0lQJm5ic3A7JWQuJWQuJWQuJWRcbiI8L3R0PiwgaSwgcywgKHNvYXAuaXAgJmd0OyZndDsgMjQpJmFtcDsweEZGLA0KKyhzb2FwLmlwICZndDsmZ3Q7IDE2KSZhbXA7MHhGRiwgKHNvYXAuaXAgJmd0OyZndDsgOCkmYW1wOzB4RkYsIHNvYXAuaXAmYW1wOzB4RkYpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoIXNvYXBfdGhyW2ldKSAvLyBmaXJzdCB0aW1lIGFyb3VuZCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDt7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfdGhyW2ldID0gc29hcF9jb3B5KCZhbXA7c29hcCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyghc29hcF90aHJbaV0pIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2V4aXQoMSk7IC8vIGNvdWxkIG5vdCBhbGxvY2F0ZSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDt9IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPmVsc2U8L2I+Ly8gcmVjeWNsZSBzb2FwIGVudmlyb25tZW50IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7cHRocmVhZF9qb2luKHRpZFtpXSwgTlVMTCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2ZwcmludGYoc3RkZXJyLCAiVGhyZWFkIDx0dD4lPC90dD5kIGNvbXBsZXRlZDx0dD5cPC90dD5uIiwgaSk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfZGVzdHJveShzb2FwX3RocltpXSk7IC8vIGRlYWxsb2NhdGUgQysrIGRhdGEgb2Ygb2xkIHRocmVhZCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2VuZChzb2FwX3RocltpXSk7IC8vIGRlYWxsb2NhdGUgZGF0YSBvZiBvbGQgdGhyZWFkIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO30gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF90aHJbaV08dHQ+LSZndDs8L3R0PnNvY2tldCA9IHM7IC8vIG5ldyBzb2NrZXQgZmQgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7cHRocmVhZF9jcmVhdGUoJmFtcDt0aWRbaV0sIE5VTEwsICg8Yj52b2lkPC9iPiooKikoPGI+dm9pZDwvYj4qKSlzb2FwX3NlcnZlLCAoPGI+dm9pZDwvYj4qKXNvYXBfdGhyW2ldKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDt9IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPmZvcjwvYj4mbmJzcDsoaSA9IDA7IGkgICZsdDsgIE1BWF9USFI7IGkrKykgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KHNvYXBfdGhyW2ldKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDt7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfZG9uZShzb2FwX3RocltpXSk7IC8vIGRldGFjaCBjb250ZXh0IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2ZyZWUoc29hcF90aHJbaV0pOyAvLyBmcmVlIHVwIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO30gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7MDsgPGJyIC8+DQorfQ0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgY2FuIGJlIHVzZWQgdG8gc2V0dXAgYSBnU09BUCBydW50aW1lIGVudmlyb25tZW50ICg8aT48Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcDwvaT4pOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKw0KKzx0YWJsZT4NCis8dHI+PHRkPjxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5GdW5jdGlvbjwvYj48L2ZvbnQ+IDwvdGQ+PHRkIHdpZHRoPSIzNTEiPjxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5EZXNjcmlwdGlvbjwvYj48L2ZvbnQ+IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPnNvYXBfaW5pdCg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCk8L2k+IDwvdGQ+PHRkIHdpZHRoPSIzNTEiPkluaXRpYWxpemVzIGEgcnVudGltZSBlbnZpcm9ubWVudCAocmVxdWlyZWQgb25seSBvbmNlKSA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT48Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcF9uZXcoKTwvaT4gPC90ZD48dGQgd2lkdGg9IjM1MSI+QWxsb2NhdGVzLCBpbml0aWFsaXplcywgYW5kIHJldHVybnMgYSBwb2ludGVyIHRvIGEgcnVudGltZSBlbnZpcm9ubWVudCA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT48Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcF9jb3B5KDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwKTwvaT4gPC90ZD48dGQgd2lkdGg9IjM1MSI+QWxsb2NhdGVzIGEgbmV3IHJ1bnRpbWUgZW52aXJvbm1lbnQgYW5kIGNvcGllcyBjb250ZW50cyBvZg0KK3RoZSBhcmd1bWVudCBlbnZpcm9ubWVudCBzdWNoIHRoYXQgdGhlIG5ldyBlbnZpcm9ubWVudCBkb2VzIG5vdCBzaGFyZSBkYXRhIHdpdGggdGhlIGFyZ3VtZW50IGVudmlyb25tZW50IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPnNvYXBfZG9uZSg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCk8L2k+IDwvdGQ+PHRkIHdpZHRoPSIzNTEiPlJlc2V0LCBjbG9zZSBjb21tdW5pY2F0aW9ucywgYW5kIHJlbW92ZSBjYWxsYmFja3MgPC90ZD48L3RyPjwvdGFibGU+DQorDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvc3Bhbj4NCitBIG5ldyBlbnZpcm9ubWVudCBpcyBpbml0aWF0ZWQgZm9yIGVhY2ggdGhyZWFkIHRvIGd1YXJhbnRlZSBleGNsdXNpdmUgYWNjZXNzDQordG8gcnVudGltZSBlbnZpcm9ubWVudHMuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0ZvciBjbGVhbiB0ZXJtaW5hdGlvbiBvZiB0aGUgc2VydmVyLCB0aGUgbWFzdGVyIHNvY2tldCBjYW4gYmUgY2xvc2VkIGFuZCBjYWxsYmFja3MgcmVtb3ZlZCB3aXRoIDxpPnNvYXBfZG9uZSg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCk8L2k+Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgYWR2YW50YWdlIG9mIHRoZSBjb2RlIHNob3duIGFib3ZlIGlzIHRoYXQgdGhlIG1hY2hpbmUgY2Fubm90IGJlIG92ZXJsb2FkZWQgd2l0aCByZXF1ZXN0cywgc2luY2UgdGhlIG51bWJlciBvZiBhY3RpdmUgc2VydmljZXMgaXMgbGltaXRlZC4gSG93ZXZlciwgdGhyZWFkcyBhcmUgc3RpbGwgc3RhcnRlZCBhbmQgdGVybWluYXRlZC4gVGhpcyBvdmVyaGVhZCBjYW4gYmUgZWxpbWluYXRlZCB1c2luZyBhIHF1ZXVlIG9mIHJlcXVlc3RzIChvcGVuIHNvY2tldHMpIGFzIGlzIHNob3duIGluIHRoZSBjb2RlIGJlbG93Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorI2luY2x1ZGUgInNvYXBILmgiIDxiciAvPg0KKyNpbmNsdWRlICAmbHQ7IHB0aHJlYWQuaCAmZ3Q7ICA8YnIgLz4NCisjZGVmaW5lIEJBQ0tMT0cgKDEwMCkJLy8gTWF4LiByZXF1ZXN0IGJhY2tsb2cgPGJyIC8+DQorI2RlZmluZSBNQVhfVEhSICgxMCkgLy8gU2l6ZSBvZiB0aHJlYWQgcG9vbCA8YnIgLz4NCisjZGVmaW5lIE1BWF9RVUVVRSAoMTAwMCkgLy8gTWF4LiBzaXplIG9mIHJlcXVlc3QgcXVldWUgPGJyIC8+DQorU09BUF9TT0NLRVQgcXVldWVbTUFYX1FVRVVFXTsgLy8gVGhlIGdsb2JhbCByZXF1ZXN0IHF1ZXVlIG9mIHNvY2tldHMgPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO2hlYWQgPSAwLCB0YWlsID0gMDsgLy8gUXVldWUgaGVhZCBhbmQgdGFpbCA8YnIgLz4NCis8Yj52b2lkPC9iPiZuYnNwOypwcm9jZXNzX3F1ZXVlKDxiPnZvaWQ8L2I+Kik7IDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDtlbnF1ZXVlKFNPQVBfU09DS0VUKTsgPGJyIC8+DQorU09BUF9TT0NLRVQgZGVxdWV1ZSgpOyA8YnIgLz4NCitwdGhyZWFkX211dGV4X3QgcXVldWVfY3M7IDxiciAvPg0KK3B0aHJlYWRfY29uZF90IHF1ZXVlX2N2OyA8YnIgLz4NCis8Yj5pbnQ8L2I+Jm5ic3A7bWFpbig8Yj5pbnQ8L2I+Jm5ic3A7YXJnYywgPGI+Y2hhcjwvYj4mbmJzcDsqKmFyZ3YpIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgc29hcDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9pbml0KCZhbXA7c29hcCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyhhcmdjICAmbHQ7ICAyKSAvLyBubyBhcmdzOiBhc3N1bWUgdGhpcyBpcyBhIENHSSBhcHBsaWNhdGlvbiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfc2VydmUoJmFtcDtzb2FwKTsgLy8gc2VydmUgcmVxdWVzdCwgb25lIHRocmVhZCwgQ0dJIHN0eWxlIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfZGVzdHJveSgmYW1wO3NvYXApOyAvLyBkZWFsbG9jIEMrKyBkYXRhIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfZW5kKCZhbXA7c29hcCk7IC8vIGRlYWxsb2MgZGF0YSBhbmQgY2xlYW4gdXAgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5lbHNlPC9iPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXBfdGhyW01BWF9USFJdOyAvLyBlYWNoIHRocmVhZCBuZWVkcyBhIHJ1bnRpbWUgZW52aXJvbm1lbnQgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7cHRocmVhZF90IHRpZFtNQVhfVEhSXTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aW50PC9iPiZuYnNwO3BvcnQgPSBhdG9pKGFyZ3ZbMV0pOyAvLyBmaXJzdCBjb21tYW5kLWxpbmUgYXJnIGlzIHBvcnQgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U09BUF9TT0NLRVQgbSwgczsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aW50PC9iPiZuYnNwO2k7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO20gPSBzb2FwX2JpbmQoJmFtcDtzb2FwLCBOVUxMLCBwb3J0LCBCQUNLTE9HKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KCFzb2FwX3ZhbGlkX3NvY2tldChtKSkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZXhpdCgxKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZnByaW50ZihzdGRlcnIsIDx0dD4iU29ja2V0Jm5ic3A7Y29ubmVjdGlvbiZuYnNwO3N1Y2Nlc3NmdWwmbmJzcDslZFxuIjwvdHQ+LCBtKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7cHRocmVhZF9tdXRleF9pbml0KCZhbXA7cXVldWVfY3MsIE5VTEwpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtwdGhyZWFkX2NvbmRfaW5pdCgmYW1wO3F1ZXVlX2N2LCBOVUxMKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Zm9yPC9iPiZuYnNwOyhpID0gMDsgaSAgJmx0OyAgTUFYX1RIUjsgaSsrKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDt7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfdGhyW2ldID0gc29hcF9jb3B5KCZhbXA7c29hcCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2ZwcmludGYoc3RkZXJyLCA8dHQ+IlN0YXJ0aW5nJm5ic3A7dGhyZWFkJm5ic3A7JWRcbiI8L3R0PiwgaSk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3B0aHJlYWRfY3JlYXRlKCZhbXA7dGlkW2ldLCBOVUxMLCAoPGI+dm9pZDwvYj4qKCopKDxiPnZvaWQ8L2I+KikpcHJvY2Vzc19xdWV1ZSwgKDxiPnZvaWQ8L2I+Kilzb2FwX3RocltpXSk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO30gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Zm9yPC9iPiZuYnNwOyg7OykgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7eyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzID0gc29hcF9hY2NlcHQoJmFtcDtzb2FwKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KCFzb2FwX3ZhbGlkX3NvY2tldChzKSkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7eyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoc29hcC5lcnJudW0pIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9wcmludF9mYXVsdCgmYW1wO3NvYXAsIHN0ZGVycik7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNvbnRpbnVlPC9iPjsgLy8gcmV0cnkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5lbHNlPC9iPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZnByaW50ZihzdGRlcnIsIDx0dD4iU2VydmVyJm5ic3A7dGltZWQmbmJzcDtvdXRcbiI8L3R0Pik7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPmJyZWFrPC9iPjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDt9IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2ZwcmludGYoc3RkZXJyLCA8dHQ+IlRocmVhZCZuYnNwOyVkJm5ic3A7YWNjZXB0cyZuYnNwO3NvY2tldCZuYnNwOyVkJm5ic3A7Y29ubmVjdGlvbiZuYnNwO2Zyb20mbmJzcDtJUCZuYnNwOyVkLiVkLiVkLiVkXG4iPC90dD4sIGksIHMsIChzb2FwLmlwICZndDsmZ3Q7IDI0KSZhbXA7MHhGRiwgKHNvYXAuaXAgJmd0OyZndDsgMTYpJmFtcDsweEZGLCAoc29hcC5pcCAmZ3Q7Jmd0OyA4KSZhbXA7MHhGRiwgc29hcC5pcCZhbXA7MHhGRik7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPndoaWxlPC9iPiZuYnNwOyhlbnF1ZXVlKHMpID09IFNPQVBfRU9NKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzbGVlcCgxKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5mb3I8L2I+Jm5ic3A7KGkgPSAwOyBpICAmbHQ7ICBNQVhfVEhSOyBpKyspIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+d2hpbGU8L2I+Jm5ic3A7KGVucXVldWUoU09BUF9JTlZBTElEX1NPQ0tFVCkgPT0gU09BUF9FT00pIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NsZWVwKDEpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDt9IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPmZvcjwvYj4mbmJzcDsoaSA9IDA7IGkgICZsdDsgIE1BWF9USFI7IGkrKykgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7eyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtmcHJpbnRmKHN0ZGVyciwgPHR0PiJXYWl0aW5nJm5ic3A7Zm9yJm5ic3A7dGhyZWFkJm5ic3A7JWQmbmJzcDt0byZuYnNwO3Rlcm1pbmF0ZS4uLiZuYnNwOyI8L3R0PiwgaSk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3B0aHJlYWRfam9pbih0aWRbaV0sIE5VTEwpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtmcHJpbnRmKHN0ZGVyciwgPHR0PiJ0ZXJtaW5hdGVkXG4iPC90dD4pOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2RvbmUoc29hcF90aHJbaV0pOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtmcmVlKHNvYXBfdGhyW2ldKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtwdGhyZWFkX211dGV4X2Rlc3Ryb3koJmFtcDtxdWV1ZV9jcyk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3B0aHJlYWRfY29uZF9kZXN0cm95KCZhbXA7cXVldWVfY3YpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt9IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfZG9uZSgmYW1wO3NvYXApOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7MDsgPGJyIC8+DQorfSA8YnIgLz4NCis8Yj52b2lkPC9iPiZuYnNwOypwcm9jZXNzX3F1ZXVlKDxiPnZvaWQ8L2I+Jm5ic3A7KnNvYXApIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnRzb2FwID0gKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwKilzb2FwOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5mb3I8L2I+Jm5ic3A7KDs7KSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3Rzb2FwPHR0Pi0mZ3Q7PC90dD5zb2NrZXQgPSBkZXF1ZXVlKCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyghc29hcF92YWxpZF9zb2NrZXQodHNvYXA8dHQ+LSZndDs8L3R0PnNvY2tldCkpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPmJyZWFrPC9iPjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9zZXJ2ZSh0c29hcCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfZGVzdHJveSh0c29hcCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfZW5kKHRzb2FwKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZnByaW50ZihzdGRlcnIsIDx0dD4ic2VydmVkXG4iPC90dD4pOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt9IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDtOVUxMOyA8YnIgLz4NCit9IDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDtlbnF1ZXVlKFNPQVBfU09DS0VUIHNvY2spIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aW50PC9iPiZuYnNwO3N0YXR1cyA9IFNPQVBfT0s7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmludDwvYj4mbmJzcDtuZXh0OyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtwdGhyZWFkX211dGV4X2xvY2soJmFtcDtxdWV1ZV9jcyk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO25leHQgPSB0YWlsICsgMTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KG5leHQgICZndDsgPSBNQVhfUVVFVUUpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO25leHQgPSAwOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsobmV4dCA9PSBoZWFkKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzdGF0dXMgPSBTT0FQX0VPTTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+ZWxzZTwvYj48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3F1ZXVlW3RhaWxdID0gc29jazsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7dGFpbCA9IG5leHQ7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO30gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7cHRocmVhZF9jb25kX3NpZ25hbCgmYW1wO3F1ZXVlX2N2KTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7cHRocmVhZF9tdXRleF91bmxvY2soJmFtcDtxdWV1ZV9jcyk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDtzdGF0dXM7IDxiciAvPg0KK30gPGJyIC8+DQorU09BUF9TT0NLRVQgZGVxdWV1ZSgpIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7U09BUF9TT0NLRVQgc29jazsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7cHRocmVhZF9tdXRleF9sb2NrKCZhbXA7cXVldWVfY3MpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtwdGhyZWFkX2NvbmRfd2FpdCgmYW1wO3F1ZXVlX2N2LCAmYW1wO3F1ZXVlX2NzKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29jayA9IHF1ZXVlW2hlYWQrK107IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyhoZWFkICAmZ3Q7ID0gTUFYX1FVRVVFKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtoZWFkID0gMDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7cHRocmVhZF9tdXRleF91bmxvY2soJmFtcDtxdWV1ZV9jcyk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDtzb2NrOyA8YnIgLz4NCit9DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCQkgICAgICA8aDQ+PGEgbmFtZT0idHRoX3NFYzcuMi41Ij4NCis3LjIuNTwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+SG93IHRvIFBhc3MgQXBwbGljYXRpb24gRGF0YSB0byBTZXJ2aWNlIE1ldGhvZHM8L2ZvbnQ+PC9oND4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIDxpPjxiPnZvaWQ8L2I+Jm5ic3A7KnNvYXAudXNlcjwvaT4gZmllbGQgY2FuIGJlIHVzZWQgdG8gcGFzcyBhcHBsaWNhdGlvbiBkYXRhIHRvIHNlcnZpY2UgbWV0aG9kcy4gVGhpcyBmaWVsZCBzaG91bGQgYmUgc2V0IGJlZm9yZSB0aGUgPGk+c29hcF9zZXJ2ZSgpPC9pPiBjYWxsLiBUaGUgc2VydmljZSBtZXRob2QgY2FuIGFjY2VzcyB0aGlzIGZpZWxkIHRvIHVzZSB0aGUgYXBwbGljYXRpb24tZGVwZW5kZW50IGRhdGEuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgYSBub24tc3RhdGljIGRhdGFiYXNlIGhhbmRsZSBpcyBpbml0aWFsaXplZCBhbmQgcGFzc2VkIHRvIHRoZSBzZXJ2aWNlIG1ldGhvZHM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjRDBEMEQwIj48dHI+PHRkPjxzcGFuIGNsYXNzPSJyb21hbiI+DQoreyAuLi4gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgc29hcDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7ZGF0YWJhc2VfaGFuZGxlX3R5cGUgZGF0YWJhc2VfaGFuZGxlOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2luaXQoJmFtcDtzb2FwKTsNCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwLnVzZXIgPSAodm9pZCopZGF0YWJhc2VfaGFuZGxlOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsuLi4gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9zZXJ2ZSgmYW1wO3NvYXApOyAvLyBjYWxsIHRoZSByZW1vdmUgbWV0aG9kIGRpc3BhdGNoZXIgdG8gaGFuZGxlIHJlcXVlc3QgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Li4uIDxiciAvPg0KK30gPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO25zX19teU1ldGhvZCg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgLi4uKSA8YnIgLz4NCit7IC4uLiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtmZXRjaCgoZGF0YWJhc2VfaGFuZGxlX3R5cGUqKXNvYXA8dHQ+LSZndDs8L3R0PnVzZXIpOyA8YnIgLz4vLyBnZXQgZGF0YQ0KKyZuYnNwOyZuYnNwOyZuYnNwOy4uLiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7U09BUF9PSzsgPGJyIC8+DQorfQ0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQorQW5vdGhlciB3YXkgdG8gcGFzcyBhcHBsaWNhdGlvbiBkYXRhIGFyb3VuZCBpbiBhIG1vcmUgb3JnYW5pemVkIHdheSBpcyBhY2NvbXBsaXNoZWQgd2l0aCBwbHVnaW5zLCBzZWUgU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6cGx1Z2lucyI+MTguMzY8L2E+Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJCSAgICAgIDxoND48YSBuYW1lPSJ0dGhfc0VjNy4yLjYiPg0KKzcuMi42PC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5Tb21lIFdlYiBTZXJ2aWNlIEltcGxlbWVudGF0aW9uIElzc3VlczwvZm9udD48L2g0Pg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgc2FtZSBjbGllbnQgaGVhZGVyIGZpbGUgc3BlY2lmaWNhdGlvbiBpc3N1ZXMgYXBwbHkgdG8gdGhlIHNwZWNpZmljYXRpb24gYW5kIGltcGxlbWVudGF0aW9uIG9mIGEgU09BUCBXZWIgc2VydmljZS4gUmVmZXIgdG8NCisNCis8dWw+DQorPGxpPiA8YSBocmVmPSIjc2VjOm5hbWVzcGFjZSI+Ny4xLjI8L2E+IGZvciBuYW1lc3BhY2UgY29uc2lkZXJhdGlvbnMuDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorDQorPGxpPiA8YSBocmVmPSIjc2VjOmVuY29kaW5nIj43LjEuNTwvYT4gZm9yIGFuIGV4cGxhbmF0aW9uIG9uIGhvdyB0byBjaGFuZ2UgdGhlIGVuY29kaW5nIG9mIHRoZSBwcmltaXRpdmUgdHlwZXMuDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorDQorPGxpPiA8YSBocmVmPSIjc2VjOnJlc3BvbnNlIj43LjEuNzwvYT4gZm9yIGEgZGlzY3Vzc2lvbiBvbiBob3cgdGhlIHJlc3BvbnNlIGVsZW1lbnQgZm9ybWF0IGNhbiBiZSBjb250cm9sbGVkLg0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8L2xpPg0KKw0KKzxsaT4gPGEgaHJlZj0iI3NlYzptdWx0aXBsZSI+Ny4xLjk8L2E+IGZvciBkZXRhaWxzIG9uIGhvdyB0byBwYXNzIG11bHRpcGxlIG91dHB1dCBwYXJhbWV0ZXJzIGZyb20gYSByZW1vdGUgbWV0aG9kLg0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8L2xpPg0KKw0KKzxsaT4gPGEgaHJlZj0iI3NlYzpjb21wb3VuZCI+Ny4xLjExPC9hPiBmb3IgcGFzc2luZyBjb21wbGV4IGRhdGEgdHlwZXMgYXMgb3V0cHV0IHBhcmFtZXRlcnMuDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorDQorPGxpPiA8YSBocmVmPSIjc2VjOmFub255bW91cyI+Ny4xLjEzPC9hPiBmb3IgYW5vbnltaXppbmcgdGhlIGlucHV0IGFuZCBvdXRwdXQgcGFyYW1ldGVyIG5hbWVzLg0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8L2xpPg0KKzwvdWw+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkJICAgICAgPGg0PjxhIG5hbWU9InR0aF9zRWM3LjIuNyI+DQorNy4yLjc8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPkhvdyB0byBHZW5lcmF0ZSBDKysgU2VydmVyIE9iamVjdCBDbGFzc2VzPC9mb250PjwvaDQ+PGEgbmFtZT0ic2VjOm9iamVjdCI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitTZXJ2ZXIgb2JqZWN0IGNsYXNzZXMgZm9yIEMrKyBzZXJ2ZXIgYXBwbGljYXRpb25zIGFyZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgZ1NPQVAgY29tcGlsZXIuDQorV2UgaWxsdXN0cmF0ZSB0aGUgZ2VuZXJhdGlvbiBvZiBhbiBvYmplY3QgY2xhc3Mgd2l0aCBhIGNhbGN1bGF0b3IgZXhhbXBsZS4NCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorLy8gQ29udGVudCBvZiBmaWxlIDx0dD4iY2FsYy5oIjwvdHQ+OiA8YnIgLz4NCisvL2dzb2FwIG5zIHNlcnZpY2UgbmFtZTogQ2FsY3VsYXRvciA8YnIgLz4NCisvL2dzb2FwIG5zIHNlcnZpY2Ugc3R5bGU6IHJwYyA8YnIgLz4NCisvL2dzb2FwIG5zIHNlcnZpY2UgZW5jb2Rpbmc6IGVuY29kZWQgPGJyIC8+DQorLy9nc29hcCBucyBzZXJ2aWNlIGxvY2F0aW9uOiBodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vY2FsYy5jZ2kgPGJyIC8+DQorLy9nc29hcCBucyBzY2hlbWEgbmFtZXNwYWNlOiB1cm46Y2FsYyA8YnIgLz4NCisvL2dzb2FwIG5zIHNlcnZpY2UgbWV0aG9kLWFjdGlvbjogYWRkICIiIDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDtuc19fYWRkKDxiPmRvdWJsZTwvYj4mbmJzcDthLCA8Yj5kb3VibGU8L2I+Jm5ic3A7YiwgPGI+ZG91YmxlPC9iPiZuYnNwOyZhbXA7cmVzdWx0KTsNCis8Yj5pbnQ8L2I+Jm5ic3A7bnNfX3N1Yig8Yj5kb3VibGU8L2I+Jm5ic3A7YSwgPGI+ZG91YmxlPC9iPiZuYnNwO2IsIDxiPmRvdWJsZTwvYj4mbmJzcDsmYW1wO3Jlc3VsdCk7DQorPGI+aW50PC9iPiZuYnNwO25zX19tdWwoPGI+ZG91YmxlPC9iPiZuYnNwO2EsIDxiPmRvdWJsZTwvYj4mbmJzcDtiLCA8Yj5kb3VibGU8L2I+Jm5ic3A7JmFtcDtyZXN1bHQpOw0KKzxiPmludDwvYj4mbmJzcDtuc19fZGl2KDxiPmRvdWJsZTwvYj4mbmJzcDthLCA8Yj5kb3VibGU8L2I+Jm5ic3A7YiwgPGI+ZG91YmxlPC9iPiZuYnNwOyZhbXA7cmVzdWx0KTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoZSBmaXJzdCB0aHJlZSBkaXJlY3RpdmVzIHByb3ZpZGUgdGhlIHNlcnZpY2UgbmFtZSB3aGljaCBpcyB1c2VkIHRvIG5hbWUgdGhlIHNlcnZpY2UgY2xhc3MsIHRoZSBzZXJ2aWNlIGxvY2F0aW9uIChlbmRwb2ludCksIGFuZA0KK3RoZSBzY2hlbWEuIFRoZSBmb3VydGggZGlyZWN0aXZlIGRlZmluZXMgdGhlIG9wdGlvbmFsIFNPQVBBY3Rpb24gZm9yIHRoZSBtZXRob2QsIHdoaWNoIGlzIGEgc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBTT0FQIDEuMSBvcGVyYXRpb25zLg0KK0NvbXBpbGF0aW9uIG9mIHRoaXMgaGVhZGVyIGZpbGUgd2l0aCB0aGUgZ1NPQVAgY29tcGlsZXIgPGk+c29hcGNwcDI8L2k+IGNyZWF0ZXMgYSBuZXcgZmlsZSA8aT5zb2FwQ2FsY3VsYXRvck9iamVjdC5oPC9pPiB3aXRoIHRoZQ0KK2ZvbGxvd2luZyBjb250ZW50czoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorI2luY2x1ZGUgInNvYXBILmgiIDxiciAvPg0KKzxiPmNsYXNzPC9iPiZuYnNwO0NhbGN1bGF0b3IgOiA8Yj5wdWJsaWM8L2I+Jm5ic3A7c29hcCA8YnIgLz4NCit7IDxiPnB1YmxpYzwvYj46IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO1F1b3RlKCkgeyBzb2FwX2luaXQoPGI+dGhpczwvYj4pOyB9OyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt+UXVvdGUoKSB7IHNvYXBfZGVzdHJveSg8Yj50aGlzPC9iPik7IHNvYXBfZW5kKDxiPnRoaXM8L2I+KTsgc29hcF9kb25lKDxiPnRoaXM8L2I+KTsgfX07IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmludDwvYj4mbmJzcDtzZXJ2ZSgpIHsgPGI+cmV0dXJuPC9iPiZuYnNwO3NvYXBfc2VydmUoPGI+dGhpczwvYj4pOyB9OyA8YnIgLz4NCit9Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhpcyBnZW5lcmF0ZWQgc2VydmVyIG9iamVjdCBjbGFzcyBjYW4gYmUgaW5jbHVkZWQgaW50byBhIHNlcnZlciBhcHBsaWNhdGlvbiB0b2dldGhlciB3aXRoIHRoZSBnZW5lcmF0ZWQgbmFtZXNwYWNlIHRhYmxlIGFzIHNob3duIGluIHRoaXMgZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorI2luY2x1ZGUgInNvYXBDYWxjdWxhdG9yT2JqZWN0LmgiCS8vIGdldCBzZXJ2ZXIgb2JqZWN0IDxiciAvPg0KKyNpbmNsdWRlICJDYWxjdWxhdG9yLm5zbWFwIgkJLy8gZ2V0IG5hbWVzcGFjZSBiaW5kaW5ncyA8YnIgLz4NCis8Yj5pbnQ8L2I+Jm5ic3A7bWFpbigpIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Q2FsY3VsYXRvciBjOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7Yy5zZXJ2ZSgpOyAvLyBjYWxscyA8aT5zb2FwX3NlcnZlPC9pPiB0byBzZXJ2ZSBhcyBDR0kgYXBwbGljYXRpb24gKHVzaW5nIHN0ZGluL291dCkgPGJyIC8+DQorfSA8YnIgLz4NCis8Yj5pbnQ8L2I+Jm5ic3A7bnNfX2FkZCg8Yj5kb3VibGU8L2I+Jm5ic3A7YSwgPGI+ZG91YmxlPC9iPiZuYnNwO2IsIDxiPmRvdWJsZTwvYj4mbmJzcDsmYW1wO3Jlc3VsdCkgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtyZXN1bHQgPSBhICsgYjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cmV0dXJuPC9iPiZuYnNwO1NPQVBfT0s7IDxiciAvPg0KK30gPGJyIC8+DQorLi4uIHN1YigpLCBtdWwoKSwgYW5kIGRpdigpIGltcGxlbWVudGF0aW9ucyAuLi4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1lvdSBjYW4gdXNlIHNvYXBjcHAyIGNvbXBpbGVyIG9wdGlvbiA8aT4tbjwvaT4gdG9nZXRoZXIgd2l0aCA8aT4tcDwvaT4gdG8gY3JlYXRlIGEgbG9jYWwgbmFtZXNwYWNlcyB0YWJsZSB0byBhdm9pZCBsaW5rIGNvbmZsaWN0IHdoZW4geW91IG5lZWQgdG8gY29tYmluZSBtdWx0aXBsZSB0YWJsZXMgYW5kL29yIG11bHRpcGxlIHNlcnZlcnMsIHNlZSBhbHNvIFNlY3Rpb25zJm5ic3A7PGEgaHJlZj0iI3NlYzpvcHRpb25zIj44LjE8L2E+IGFuZCZuYnNwOzxhIGhyZWY9IiNzZWM6ZHlsaWJzIj4xOC4zNDwvYT4sIGFuZCB5b3UgY2FuIHVzZSBhIEMrKyBjb2RlIDxpPjxiPm5hbWVzcGFjZTwvYj48L2k+IHRvIGNyZWF0ZSBhIG5hbWVzcGFjZSBxdWFsaWZpZWQgc2VydmVyIG9iamVjdCBjbGFzcywgc2VlIFNlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOmNvZGVuYW1lc3BhY2UiPjE4LjMzPC9hPi4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCQkgICAgICA8aDQ+PGEgbmFtZT0idHRoX3NFYzcuMi44Ij4NCis3LjIuODwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+SG93IHRvIEdlbmVyYXRlIFdTREwgU2VydmljZSBEZXNjcmlwdGlvbnM8L2ZvbnQ+PC9oND48YSBuYW1lPSJzZWM6d3NkbCI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgZ1NPQVAgc3R1YiBhbmQgc2tlbGV0b24gY29tcGlsZXIgPGk+c29hcGNwcDI8L2k+IGdlbmVyYXRlcyBXU0RMIChXZWIgU2VydmljZSBEZXNjcmlwdGlvbiBMYW5ndWFnZSkgc2VydmljZSBkZXNjcmlwdGlvbnMgYW5kIFhNTCBTY2hlbWEgZmlsZXMNCit3aGVuIHByb2Nlc3NpbmcgYSBoZWFkZXIgZmlsZS4gIFRoZSBjb21waWxlciBwcm9kdWNlcyBvbmUgV1NETCBmaWxlIGZvciBhIHNldCBvZiByZW1vdGUgbWV0aG9kcy4gIFRoZSBuYW1lcyBvZiB0aGUgZnVuY3Rpb24NCitwcm90b3R5cGVzIG9mIHRoZSByZW1vdGUgbWV0aG9kcyBtdXN0IHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UgcHJlZml4IGFuZCB0aGUgbmFtZXNwYWNlIHByZWZpeCBpcyB1c2VkIHRvIG5hbWUgdGhlIFdTREwgZmlsZS4gIElmDQorbXVsdGlwbGUgbmFtZXNwYWNlIHByZWZpeGVzIGFyZSB1c2VkIHRvIGRlZmluZSByZW1vdGUgbWV0aG9kcywgbXVsdGlwbGUgV1NETCBmaWxlcyB3aWxsIGJlIGNyZWF0ZWQgYW5kIGVhY2ggZmlsZSBkZXNjcmliZXMgdGhlIHNldA0KK29mIHJlbW90ZSBtZXRob2RzIGJlbG9uZ2luZyB0byBhIG5hbWVzcGFjZSBwcmVmaXguDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0luIGFkZGl0aW9uIHRvIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSA8dHQ+bnMud3NkbDwvdHQ+IGZpbGUsIGEgZmlsZSB3aXRoIGEgbmFtZXNwYWNlIG1hcHBpbmcgdGFibGUgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBnU09BUA0KK2NvbXBpbGVyLiBBbiBleGFtcGxlIG1hcHBpbmcgdGFibGUgaXMgc2hvd24gYmVsb3c6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtOYW1lc3BhY2UgbmFtZXNwYWNlc1tdID0gPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7IlNPQVAtRU5WIiwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIn0sIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3siU09BUC1FTkMiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8ifSwgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyJ4c2kiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCBcImh0dHA6Ly93d3cudzMub3JnLyovWE1MU2NoZW1hLWluc3RhbmNlIn0sIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3sieHNkIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiwgXCJodHRwOi8vd3d3LnczLm9yZy8qL1hNTFNjaGVtYSJ9LCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7Im5zIiwgImh0dHA6Ly90ZW1wdXJpLm9yZyJ9LCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7TlVMTCwgTlVMTH0gPGJyIC8+DQorfTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoaXMgZmlsZSBjYW4gYmUgaW5jb3Jwb3JhdGVkIGluIHRoZQ0KK2NsaWVudC9zZXJ2aWNlIGFwcGxpY2F0aW9uLCBzZWUgU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6bnN0YWJsZSI+OS40PC9hPiBmb3IgZGV0YWlscyBvbiBuYW1lc3BhY2UgbWFwcGluZyB0YWJsZXMuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RvIGRlcGxveSBhIFdlYiBzZXJ2aWNlLCBjb3B5IHRoZSBjb21waWxlZCBDR0kgc2VydmljZSBhcHBsaWNhdGlvbiB0byB0aGUgZGVzaWduYXRlZCBDR0kgZGlyZWN0b3J5IG9mIHlvdXIgV2ViIHNlcnZlci4NCitNYWtlIHN1cmUgdGhlIHByb3BlciBmaWxlIHBlcm1pc3Npb25zIGFyZSBzZXQgKDx0dD5jaG1vZCA3NTUgY2FsYy5jZ2k8L3R0PiBmb3IgVW5peC9MaW51eCkuDQorWW91IGNhbiB0aGVuIHB1Ymxpc2ggdGhlIFdTREwgZmlsZSBvbiB0aGUgV2ViIGJ5IHBsYWNpbmcgaXQgaW4gdGhlIGFwcHJvcHJpYXRlIFdlYiBzZXJ2ZXIgZGlyZWN0b3J5Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgZ1NPQVAgY29tcGlsZXIgYWxzbyBnZW5lcmF0ZXMgWE1MIFNjaGVtYSBmaWxlcyBmb3IgYWxsIEMvQysrDQorY29tcGxleCB0eXBlcyAoZS5nLiZuYnNwOzxpPjxiPnN0cnVjdDwvYj48L2k+cyBhbmQgPGk+PGI+Y2xhc3M8L2I+PC9pPmVzKSB3aGVuIGRlY2xhcmVkIHdpdGggYSBuYW1lc3BhY2UgcHJlZml4Lg0KK1RoZXNlIGZpbGVzIGFyZSBuYW1lZCA8dHQ+bnMueHNkPC90dD4sIHdoZXJlIDx0dD5uczwvdHQ+IGlzIHRoZSBuYW1lc3BhY2UgcHJlZml4IHVzZWQgaW4gdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBjb21wbGV4IHR5cGUuDQorVGhlIFhNTCBTY2hlbWEgZmlsZXMgZG8gbm90IGhhdmUgdG8gYmUgcHVibGlzaGVkIGFzIHRoZSBXU0RMIGZpbGUgYWxyZWFkeSBjb250YWlucyB0aGUgYXBwcm9wcmlhdGUgWE1MIFNjaGVtYSBkZWZpbml0aW9ucy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCQkgICAgICA8aDQ+PGEgbmFtZT0idHRoX3NFYzcuMi45Ij4NCis3LjIuOTwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+RXhhbXBsZTwvZm9udD48L2g0PjxhIG5hbWU9InNlYzpleGFtcGxlOCI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitGb3IgZXhhbXBsZSwgc3VwcG9zZSB0aGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIGRlZmluZWQgaW4gdGhlIGhlYWRlciBmaWxlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmRvdWJsZTwvYj4mbmJzcDt4c2RfX2RvdWJsZTsgPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO25zX19hZGQoeHNkX19kb3VibGUgYSwgeHNkX19kb3VibGUgYiwgeHNkX19kb3VibGUgJmFtcDtyZXN1bHQpOyA8YnIgLz4NCis8Yj5pbnQ8L2I+Jm5ic3A7bnNfX3N1Yih4c2RfX2RvdWJsZSBhLCB4c2RfX2RvdWJsZSBiLCB4c2RfX2RvdWJsZSAmYW1wO3Jlc3VsdCk7IDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDtuc19fc3FydCh4c2RfX2RvdWJsZSBhLCB4c2RfX2RvdWJsZSAmYW1wO3Jlc3VsdCk7IDxiciAvPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlbiwgb25lIFdTREwgZmlsZSB3aWxsIGJlIGNyZWF0ZWQgd2l0aCB0aGUgZmlsZSBuYW1lIDx0dD5ucy53c2RsPC90dD4gdGhhdCBkZXNjcmliZXMgYWxsIHRocmVlIHJlbW90ZSBtZXRob2RzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwQjBEMCI+PHRyPjx0ZD48dHQ+DQorJmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPyYjNjI7IDxiciAvPg0KKyZsdDtkZWZpbml0aW9ucyBuYW1lPSJTZXJ2aWNlIiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3RhcmdldE5hbWVzcGFjZT0iaHR0cDovL2xvY2F0aW9uL1NlcnZpY2Uud3NkbCIgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eG1sbnM6U09BUC1FTlY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt4bWxuczpTT0FQLUVOQz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3htbG5zOlNPQVA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3htbG5zOldTREw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMTAvWE1MU2NoZW1hIiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt4bWxuczp0bnM9Imh0dHA6Ly9sb2NhdGlvbi9TZXJ2aWNlLndzZGwiIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3htbG5zOm5zPSJodHRwOi8vdGVtcHVyaS5vcmciJiM2MjsgPGJyIC8+DQorJmx0O3R5cGVzJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3NjaGVtYSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDt4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8xMC9YTUxTY2hlbWEiIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3RhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnIiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDt4bWxuczpTT0FQLUVOVj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3htbG5zOlNPQVAtRU5DPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyImIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7Y29tcGxleFR5cGUgbmFtZT0iYWRkUmVzcG9uc2UiJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2FsbCYjNjI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtlbGVtZW50IG5hbWU9InJlc3VsdCIgdHlwZT0iZG91YmxlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0Oy9hbGwmIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIvJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0Oy9jb21wbGV4VHlwZSYjNjI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtjb21wbGV4VHlwZSBuYW1lPSJzdWJSZXNwb25zZSImIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7YWxsJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2VsZW1lbnQgbmFtZT0icmVzdWx0IiB0eXBlPSJkb3VibGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8mIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7L2FsbCYjNjI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDthbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIi8mIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7L2NvbXBsZXhUeXBlJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2NvbXBsZXhUeXBlIG5hbWU9InNxcnRSZXNwb25zZSImIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7YWxsJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2VsZW1lbnQgbmFtZT0icmVzdWx0IiB0eXBlPSJkb3VibGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8mIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7L2FsbCYjNjI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDthbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIi8mIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7L2NvbXBsZXhUeXBlJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0Oy9zY2hlbWEmIzYyOyA8YnIgLz4NCismbHQ7L3R5cGVzJiM2MjsgPGJyIC8+DQorJmx0O21lc3NhZ2UgbmFtZT0iYWRkUmVxdWVzdCImIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbHQ7cGFydCBuYW1lPSJhIiB0eXBlPSJ4c2Q6ZG91YmxlIi8mIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbHQ7cGFydCBuYW1lPSJiIiB0eXBlPSJ4c2Q6ZG91YmxlIi8mIzYyOyA8YnIgLz4NCismbHQ7L21lc3NhZ2UmIzYyOyA8YnIgLz4NCismbHQ7bWVzc2FnZSBuYW1lPSJhZGRSZXNwb25zZSImIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbHQ7cGFydCBuYW1lPSJyZXN1bHQiIHR5cGU9InhzZDpkb3VibGUiLyYjNjI7IDxiciAvPg0KKyZsdDsvbWVzc2FnZSYjNjI7IDxiciAvPg0KKyZsdDttZXNzYWdlIG5hbWU9InN1YlJlcXVlc3QiJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3BhcnQgbmFtZT0iYSIgdHlwZT0ieHNkOmRvdWJsZSIvJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3BhcnQgbmFtZT0iYiIgdHlwZT0ieHNkOmRvdWJsZSIvJiM2MjsgPGJyIC8+DQorJmx0Oy9tZXNzYWdlJiM2MjsgPGJyIC8+DQorJmx0O21lc3NhZ2UgbmFtZT0ic3ViUmVzcG9uc2UiJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3BhcnQgbmFtZT0icmVzdWx0IiB0eXBlPSJ4c2Q6ZG91YmxlIi8mIzYyOyA8YnIgLz4NCismbHQ7L21lc3NhZ2UmIzYyOyA8YnIgLz4NCismbHQ7bWVzc2FnZSBuYW1lPSJzcXJ0UmVxdWVzdCImIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbHQ7cGFydCBuYW1lPSJhIiB0eXBlPSJ4c2Q6ZG91YmxlIi8mIzYyOyA8YnIgLz4NCismbHQ7L21lc3NhZ2UmIzYyOyA8YnIgLz4NCismbHQ7bWVzc2FnZSBuYW1lPSJzcXJ0UmVzcG9uc2UiJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3BhcnQgbmFtZT0icmVzdWx0IiB0eXBlPSJ4c2Q6ZG91YmxlIi8mIzYyOyA8YnIgLz4NCismbHQ7L21lc3NhZ2UmIzYyOyA8YnIgLz4NCismbHQ7cG9ydFR5cGUgbmFtZT0iU2VydmljZVBvcnRUeXBlIiYjNjI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtvcGVyYXRpb24gbmFtZT0iYWRkIiYjNjI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtpbnB1dCBtZXNzYWdlPSJ0bnM6YWRkUmVxdWVzdCIvJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O291dHB1dCBtZXNzYWdlPSJ0bnM6YWRkUmVzcG9uc2UiLyYjNjI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZsdDsvb3BlcmF0aW9uJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O29wZXJhdGlvbiBuYW1lPSJzdWIiJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2lucHV0IG1lc3NhZ2U9InRuczpzdWJSZXF1ZXN0Ii8mIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7b3V0cHV0IG1lc3NhZ2U9InRuczpzdWJSZXNwb25zZSIvJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0Oy9vcGVyYXRpb24mIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbHQ7b3BlcmF0aW9uIG5hbWU9InNxcnQiJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2lucHV0IG1lc3NhZ2U9InRuczpzcXJ0UmVxdWVzdCIvJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O291dHB1dCBtZXNzYWdlPSJ0bnM6c3FydFJlc3BvbnNlIi8mIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbHQ7L29wZXJhdGlvbiYjNjI7IDxiciAvPg0KKyZsdDsvcG9ydFR5cGUmIzYyOyA8YnIgLz4NCismbHQ7YmluZGluZyBuYW1lPSJTZXJ2aWNlQmluZGluZyIgdHlwZT0idG5zOlNlcnZpY2VQb3J0VHlwZSImIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbHQ7U09BUDpiaW5kaW5nIHN0eWxlPSJycGMiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8mIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbHQ7b3BlcmF0aW9uIG5hbWU9ImFkZCImIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7U09BUDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnI2FkZCIvJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2lucHV0JiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O1NPQVA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnIiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0Oy9pbnB1dCYjNjI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtvdXRwdXQmIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7U09BUDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmciIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2VuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8mIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7L291dHB1dCYjNjI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZsdDsvb3BlcmF0aW9uJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O29wZXJhdGlvbiBuYW1lPSJzdWIiJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O1NPQVA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly90ZW1wdXJpLm9yZyNzdWIiLyYjNjI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtpbnB1dCYjNjI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtTT0FQOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZyIgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLyYjNjI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDsvaW5wdXQmIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7b3V0cHV0JiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O1NPQVA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnIiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0Oy9vdXRwdXQmIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbHQ7L29wZXJhdGlvbiYjNjI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtvcGVyYXRpb24gbmFtZT0ic3FydCImIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7U09BUDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnI3NxcnQiLyYjNjI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtpbnB1dCYjNjI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtTT0FQOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZyIgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLyYjNjI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDsvaW5wdXQmIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7b3V0cHV0JiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O1NPQVA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnIiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0Oy9vdXRwdXQmIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbHQ7L29wZXJhdGlvbiYjNjI7IDxiciAvPg0KKyZsdDsvYmluZGluZyYjNjI7IDxiciAvPg0KKyZsdDtzZXJ2aWNlIG5hbWU9IlNlcnZpY2UiJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3BvcnQgbmFtZT0iU2VydmljZVBvcnQiIGJpbmRpbmc9InRuczpTZXJ2aWNlQmluZGluZyImIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7U09BUDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYXRpb24vU2VydmljZS5jZ2kiLyYjNjI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZsdDsvcG9ydCYjNjI7IDxiciAvPg0KKyZsdDsvc2VydmljZSYjNjI7IDxiciAvPg0KKyZsdDsvZGVmaW5pdGlvbnMmIzYyOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3R0Pg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJCSAgICAgIDxoND48YSBuYW1lPSJ0dGhfc0VjNy4yLjEwIj4NCis3LjIuMTA8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPkhvdyB0byBQYXJzZSBhbmQgSW1wb3J0IFdTREwgU2VydmljZSBEZXNjcmlwdGlvbnMgdG8gRGV2ZWxvcCBDbGllbnRzIGFuZCBTZXJ2ZXJzPC9mb250PjwvaDQ+PGEgbmFtZT0ic2VjOndzZGxpbiI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitOb3RlOiBzZWUgPGk+UkVBRE1FLnR4dDwvaT4gaW4gdGhlIDxpPndzZGw8L2k+IGRpcmVjdG9yeSBmb3IgaW5zdGFsbGF0aW9uDQoraW5zdHJ1Y3Rpb25zIGZvciB0aGUgV1NETCBwYXJzZXIgYW5kIGltcG9ydGVyLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgY3JlYXRpb24gb2YgU09BUCBXZWIgU2VydmljZXMgYXBwbGljYXRpb25zIGZyb20gYSBXU0RMIHNlcnZpY2UgZGVzY3JpcHRpb24gaXMgYQ0KK3R3by1zdGVwIHByb2Nlc3MuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0ZpcnN0LCBleGVjdXRlIDxpPndzZGwyaCA8dT48c3BhbiBjbGFzcz0icm9tYW4iPmZpbGU8L3NwYW4+PC91Pi53c2RsPC9pPiB3aGljaCBnZW5lcmF0ZXMgdGhlDQorYSBDKysgaGVhZGVyIGZpbGUgPGk+PHU+PHNwYW4gY2xhc3M9InJvbWFuIj5maWxlPC9zcGFuPjwvdT4uaDwvaT4NCisodXNlIDxpPndzZGwyaCAtYyA8dT48c3BhbiBjbGFzcz0icm9tYW4iPmZpbGU8L3NwYW4+PC91Pi53c2RsPC9pPiB0byBnZW5lcmF0ZSBwdXJlIEMgY29kZSkuDQorWW91IGNhbiBwcm92aWRlIGEgVVJMIGluc3RlYWQgb2YgYSBmaWxlIG5hbWUsIHdoZW4gYXBwbGljYWJsZS4NCitUaGUgZ2VuZXJhdGVkIGhlYWRlciBmaWxlIGlzIGEgV2ViIHNlcnZpY2Ugc3BlY2lmaWNhdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSBwYXJhbWV0ZXIgdHlwZXMgYW5kIHNlcnZpY2UgZnVuY3Rpb24gZGVmaW5pdGlvbnMuDQorVGhlIGZ1bmN0aW9ucyBhcmUgcmVwcmVzZW50ZWQgYXMgZnVuY3Rpb24gcHJvdG90eXBlcy4gVGhlIGZpbGUgY29udGFpbnMgdmFyaW91cyBhbm5vdGF0aW9ucyByZWxhdGVkIHRvIHRoZSBXZWIgc2VydmljZS4NCitUaGUgaGVhZGVyIGZpbGUgbXVzdCBiZSBwcm9jZXNzZWQgYnkgdGhlIGdTT0FQIGNvbXBpbGVyLiBZb3UgY2Fubm90IHVzZSBpdCB3aXRoIGEgQy9DKysgY29tcGlsZXIgZGlyZWN0bHkuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1NlY29uZCwgdGhlIGhlYWRlciBmaWxlIDxpPjx1PjxzcGFuIGNsYXNzPSJyb21hbiI+ZmlsZTwvc3Bhbj48L3U+Lmg8L2k+IGlzIHByb2Nlc3NlZCBieSB0aGUNCitnU09BUCBjb21waWxlciBieSBleGVjdXRpbmcgPGk+c29hcGNwcDIgLWkgPHU+PHNwYW4gY2xhc3M9InJvbWFuIj5maWxlPC9zcGFuPjwvdT4uaDwvaT4uICBUaGlzDQorY3JlYXRlcyB0aGUgQy9DKysgc291cmNlIGZpbGVzIHRvIGJ1aWxkIGEgY2xpZW50IGFwcGxpY2F0aW9uLA0KK3NlZSZuYnNwOzxhIGhyZWY9IiNzZWM6Y2xpZW50Ij43LjE8L2E+LiAgSW4gYWRkaXRpb24sIHRoaXMgZ2VuZXJhdGVzIGEgY2xpZW50IHByb3h5IG9iamVjdA0KK2RlY2xhcmVkIGluIDxpPnNvYXA8dT48c3BhbiBjbGFzcz0icm9tYW4iPlNlcnZpY2U8L3NwYW4+PC91PlByb3h5Lmg8L2k+LCB3aGVyZQ0KKzxzcGFuIGNsYXNzPSJyb21hbiI+PHU+U2VydmljZTwvdT48L3NwYW4+IGlzIHRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGRlZmluZWQgaW4gdGhlIFdTREwuICBUbw0KK3VzZSB0aGlzIG9iamVjdCwgaW5jbHVkZSB0aGUgPGk+c29hcDx1PjxzcGFuIGNsYXNzPSJyb21hbiI+U2VydmljZTwvc3Bhbj48L3U+UHJveHkuaDwvaT4gYW5kDQorPGk+PHU+PHNwYW4gY2xhc3M9InJvbWFuIj5TZXJ2aWNlPC9zcGFuPjwvdT4ubnNtYXA8L2k+IGZpbGVzIGluIHlvdXIgQysrIGNsaWVudCBhcHBsaWNhdGlvbi4gIFRoZQ0KKzxzcGFuIGNsYXNzPSJyb21hbiI+PHU+U2VydmljZTwvdT48L3NwYW4+IGNsYXNzIHByb3ZpZGVzIHRoZSByZW1vdGUgV2ViIHNlcnZpY2UgbWV0aG9kcyBhcyBjbGFzcw0KK21lbWJlcnMuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0NvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBjb21tYW5kcyAoZW50ZXJlZCBhdCB0aGUgY29tbWFuZCBwcm9tcHQpOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKyQgd3NkbDJoIC1vIFhNZXRob2RzUXVlcnkuaCBodHRwOi8vd3d3LnhtZXRob2RzLm5ldC93c2RsL3F1ZXJ5LndzZGwgPGJyIC8+DQorLi4uIDxiciAvPg0KKyQgc29hcGNwcDIgLWkgWE1ldGhvZHNRdWVyeS5oDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvc3Bhbj4NCitUaGUgZmlyc3QgY29tbWFuZCBnZW5lcmF0ZXMgPGk+WE1ldGhvZHNRdWVyeS5oPC9pPiBmcm9tIHRoZSBXU0RMIGF0IHRoZSBzcGVjaWZpZWQgVVJMLg0KK1RoZSBoZWFkZXIgZmlsZSBpcyB0aGVuIHByb2Nlc3NlZCBieSB0aGUgZ1NPQVAgY29tcGlsZXIgdG8gZ2VuZXJhdGUgdGhlIHN0dWJzDQorYW5kIHNrZWxldG9ucy4NCitTZWUgWE1ldGhvZHNRdWVyeS5oIGZvciB0aGUgdHlwZXMgYW5kIHNlcnZpY2UgZnVuY3Rpb25zLiBBIEMrKyBjbGllbnQgYXBwbGljYXRpb24gbWF5DQordXNlIHRoZSBnZW5lcmF0ZWQgPGk+c29hcFhNZXRob2RzUXVlcnlTb2FwUHJveHkuaDwvaT4gY2xhc3MgYW5kDQorPGk+WE1ldGhvZHNRdWVyeVNvYXAubnNtYXA8L2k+IFhNTCBuYW1lc3BhY2UgdGFibGUgdG8gYWNjZXNzIHRoZSBXZWINCitzZXJ2aWNlLiBCb3RoIG5lZWQgdG8gYmUgPGk+I2luY2x1ZGU8L2k+LWQgaW4geW91ciBzb3VyY2UuIFRoZW4gY29tcGlsZSBhbmQgbGluaw0KK3RoZSA8aT5zb2FwQy5jcHA8L2k+LCA8aT5zb2FwQ2xpZW50LmNwcDwvaT4sIGFuZCA8aT5zdGRzb2FwMi5jcHA8L2k+IHNvdXJjZXMgdG8gY29tcGxldGUgdGhlIGJ1aWxkLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitXaGVuIHBhcnNpbmcgYSBXU0RMLCB0aGUgb3V0cHV0IGZpbGUgbmFtZSBpcyB0aGUgV1NETCBpbnB1dCBmaWxlIG5hbWUgd2l0aA0KK2V4dGVuc2lvbiA8aT4uaDwvaT4gaW5zdGVhZCBvZiA8aT4ud3NkbDwvaT4uIFdoZW4gYW4gaW5wdXQgZmlsZSBpcyBhYnNlbnQgb3IgYSBXU0RMIGZpbGUNCitmcm9tIGEgV2ViIGxvY2F0aW9uIGlzIGFjY2Vzc2VkLCB0aGUgaGVhZGVyIG91dHB1dCB3aWxsIGJlIHByb2R1Y2VkIG9uIHRoZQ0KK3N0YW5kYXJkIG91dHB1dC4gU2NoZW1hIGZpbGVzICg8aT4ueHNkPC9pPikgY2FuIGFsc28gYmUgcGFyc2VkIGFuZCBwcm9jZXNzZWQuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSA8aT53c2RsMmg8L2k+IGNvbW1hbmQtbGluZSBvcHRpb25zIGFyZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNEMEQwRDAiPjx0cj48dGQ+PHNwYW4gY2xhc3M9InJvbWFuIj4NCisNCis8dGFibGU+DQorPHRyPjx0ZD48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+T3B0aW9uPC9iPjwvZm9udD4JPC90ZD48dGQ+PGZvbnQgY29sb3I9IiNGRjAwMDAiPjxiPkRlc2NyaXB0aW9uPC9iPjwvZm9udD4gPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+LWE8L2k+CTwvdGQ+PHRkPmdlbmVyYXRlIGluZGV4ZWQgc3RydWN0IG5hbWVzIGZvciBsb2NhbCBlbGVtZW50cyB3aXRoIGFub255bW91cyB0eXBlcyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT4tYzwvaT4JPC90ZD48dGQ+Z2VuZXJhdGUgQyBzb3VyY2UgY29kZSA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT4tZDwvaT4JPC90ZD48dGQ+dXNlIERPTSB0byBwb3B1bGF0ZSB4czphbnkgYW5kIHhzZDphbnlUeXBlIGVsZW1lbnRzIDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPi1lPC9pPgk8L3RkPjx0ZD5kb24ndCBxdWFsaWZ5IGVudW0gbmFtZXMgPC90ZD48L3RyPg0KKzx0cj48dGQ+PC90ZD48dGQ+VGhpcyBvcHRpb24gaXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBnU09BUCAyLjQuMSBhbmQgZWFybGllci4gPC90ZD48L3RyPg0KKzx0cj48dGQ+PC90ZD48dGQ+VGhlIG9wdGlvbiBkb2VzIG5vdCBwcm9kdWNlIGNvZGUgdGhhdCBjb25mb3JtcyB0byBXUy1JIEJhc2ljIFByb2ZpbGUgMS4wYS4gPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+LWY8L2k+ICAgICAgPC90ZD48dGQ+Z2VuZXJhdGUgZmxhdCBDKysgY2xhc3MgaGllcmFyY2h5IGZvciBzY2hlbWEgZXh0ZW5zaW9ucyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT4tZzwvaT4JPC90ZD48dGQ+Z2VuZXJhdGUgZ2xvYmFsIHRvcC1sZXZlbCBlbGVtZW50IGRlY2xhcmF0aW9ucyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT4taDwvaT4gICAgICA8L3RkPjx0ZD5wcmludCBoZWxwIGluZm9ybWF0aW9uIDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPi1JIHBhdGg8L2k+CTwvdGQ+PHRkPnVzZSBwYXRoIHRvIGZpbmQgZmlsZXMgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+LWw8L2k+CTwvdGQ+PHRkPmluY2x1ZGUgbGljZW5zZSBpbmZvcm1hdGlvbiBpbiBvdXRwdXQgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+LW08L2k+CTwvdGQ+PHRkPnVzZSB4c2QuaCBtb2R1bGUgdG8gaW1wb3J0IHByaW1pdGl2ZSB0eXBlcyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT4tbiBuYW1lPC9pPgk8L3RkPjx0ZD51c2UgPGk+bmFtZTwvaT4gYXMgdGhlIGJhc2UgbmFtZXNwYWNlIHByZWZpeCBuYW1lIGluc3RlYWQgb2YgPGk+bnM8L2k+IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPi1OIG5hbWU8L2k+CTwvdGQ+PHRkPnVzZSA8aT5uYW1lPC9pPiBhcyB0aGUgYmFzZSBuYW1lc3BhY2UgcHJlZml4IG5hbWUgZm9yIHNlcnZpY2UgbmFtZXNwYWNlcyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT4tbyBmaWxlPC9pPiAgPC90ZD48dGQ+b3V0cHV0IHRvIGZpbGUgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+LXA8L2k+ICAgICAgPC90ZD48dGQ+Y3JlYXRlIHBvbHltb3JwaGljIHR5cGVzIHdpdGggQysrIGluaGVyaXRhbmNlIGhpZXJhcmNoeSB3aXRoIGJhc2UgPGk+eHNkX19hbnlUeXBlPC9pPiA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjx0ZD5UaGlzIGlzIGF1dG9tYXRpY2FsbHkgcGVyZm9ybWVkIHdoZW4gV1NETCBjb250YWlucyBwb2x5bW9ycGhpYyBkZWZpbml0aW9ucyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT4tciBob3N0OnBvcnQ8L2k+ICAgICAgPC90ZD48dGQ+Y29ubmVjdCB2aWEgcHJveHkgaG9zdCBhbmQgcG9ydCA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT4tczwvaT4gICAgICA8L3RkPjx0ZD5kb24ndCBnZW5lcmF0ZSBTVEwgY29kZSAobm8gc3RkOjpzdHJpbmcgYW5kIG5vIHN0ZDo6dmVjdG9yKSA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT4tdCBmaWxlPC9pPiAgPC90ZD48dGQ+dXNlIHR5cGUgbWFwIGZpbGUgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBmaWxlIHR5cGVtYXAuZGF0IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPi11PC9pPgk8L3RkPjx0ZD5kb24ndCBnZW5lcmF0ZSB1bmlvbnMgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+LXY8L2k+ICAgICAgPC90ZD48dGQ+dmVyYm9zZSBvdXRwdXQgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+LXc8L2k+ICAgICAgPC90ZD48dGQ+YWx3YXlzIHdyYXAgcmVzcG9uc2UgcGFyYW1ldGVycyBpbiBhIHJlc3BvbnNlIHN0cnVjdCA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT4teDwvaT4JPC90ZD48dGQ+ZG9uJ3QgZ2VuZXJhdGUgPGk+X1hNTCBhbnkvYW55QXR0cmlidXRlPC9pPiBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPi15PC9pPgk8L3RkPjx0ZD5nZW5lcmF0ZSB0eXBlZGVmIHN5bm9ueW1zIGZvciBzdHJ1Y3RzIGFuZCBlbnVtcyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT4tPzwvaT4gICAgICA8L3RkPjx0ZD5wcmludCBoZWxwIGluZm9ybWF0aW9uIDwvdGQ+PC90cj48L3RhYmxlPg0KKw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKyAgICAgIDxoND48YSBuYW1lPSJ0dGhfc0VjNy4yLjExIj4NCis3LjIuMTE8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPlRoZSB0eXBlbWFwLmRhdCBGaWxlPC9mb250PjwvaDQ+PGEgbmFtZT0ic2VjOnR5cGVtYXAiPg0KKzwvYT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorQSA8aT50eXBlbWFwLmRhdDwvaT4gZmlsZSBmb3IgPGk+d3NkbDJoPC9pPiBjb250YWlucyBjdXN0b20gWE1MIFNjaGVtYSBhbmQgQy9DKysNCit0eXBlIGJpbmRpbmdzLiBBbiBpbnRlcm5hbCB0YWJsZSBpcyB1c2VkIGJ5IGRlZmF1bHQuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0FuIGV4YW1wbGUgdHlwZW1hcCBmaWxlIGlzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwQjBEMCI+PHRyPjx0ZD48dHQ+DQorIyAgICAgICBUaGlzIGZpbGUgY29udGFpbnMgY3VzdG9tIGRlZmluaXRpb25zIG9mIHRoZSBYTUwgU2NoZW1hIHR5cGVzIGFuZCA8YnIgLz4NCisjICAgICAgIEMvQysrIHR5cGVzIGZvciB5b3VyIHByb2plY3QsIGFuZCBYTUwgbmFtZXNwYWNlIHByZWZpeCBkZWZpbml0aW9ucy4gPGJyIC8+DQorIyAgICAgICBUaGUgd3NkbDJoIFdTREwgaW1wb3J0ZXIgY29uc3VsdHMgdGhpcyBmaWxlIHRvIGRldGVybWluZSBiaW5kaW5ncy4gPGJyIC8+DQorICA8YnIgLz4NCis8dHQ+WzwvdHQ+IDxiciAvPg0KKy8vIFRoaXMgY29tbWVudCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0ZWQgLmggZmlsZSA8YnIgLz4NCisvLyBZb3UgY2FuIGluY2x1ZGUgYW55IGFkZGl0aW9uYWwgZGVjbGFyYXRpb25zLCBpbmNsdWRlcywgaW1wb3J0cywgZXRjLiA8YnIgLz4NCisvLyB3aXRoaW4gPHR0Pls8L3R0PiA8dHQ+XTwvdHQ+IHNlY3Rpb25zLiBUaGUgYnJhY2tldHMgTVVTVCBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZSA8YnIgLz4NCis8dHQ+XTwvdHQ+IDxiciAvPg0KKyMgICAgICAgWE1MIG5hbWVzcGFjZSBwcmVmaXggZGVmaW5pdGlvbnMgY2FuIGJlIHByb3ZpZGVkIHRvIG92ZXJyaWRlIHRoZSA8YnIgLz4NCisjICAgICAgIGRlZmF1bHQgY2hvaWNlIG9mIG5zMSwgbnMyLCAuLi4gcHJlZml4ZXMuIEZvciBleGFtcGxlOiA8YnIgLz4NCisgPGJyIC8+DQoraSAgICAgICA9ICJodHRwOi8vd3d3LnNvYXBpbnRlcm9wLm9yZy8iIDxiciAvPg0KK3MgICAgICAgPSAiaHR0cDovL3d3dy5zb2FwaW50ZXJvcC5vcmcveHNkIiA8YnIgLz4NCisgPGJyIC8+DQorIyAgICAgICBUeXBlIGRlZmluaXRpb25zIGFyZSBvZiB0aGUgZm9ybToNCisjICAgICAgIHR5cGUgPSBkZWNsYXJhdGlvbiA8Zm9udCBmYWNlPSJzeW1ib2wiPnw8L2ZvbnQNCis+IHVzZSA8Zm9udCBmYWNlPSJzeW1ib2wiPnw8L2ZvbnQNCis+IHBvaW50ZXItdXNlIDxiciAvPg0KKyMgICAgICAgd2hlcmUgPGJyIC8+DQorIyAgICAgICB0eXBlIGlzIHRoZSBYTUwgU2NoZW1hIHR5cGUgKG9yIGFuIGFwcGxpY2F0aW9uIHR5cGUgaW4gYSBuYW1lc3BhY2UgPGJyIC8+DQorIyAgICAgICAgICAgICAgIHRoYXQgaGFzIGEgcHJlZml4IGRlZmluaXRpb24gZ2l2ZW4gYXMgYWJvdmUpLiA8YnIgLz4NCisjICAgICAgIGRlY2xhcmF0aW9uIGlzIGFuIG9wdGlvbmFsIEMvQysrIHR5cGUgZGVjbGFyYXRpb24gPGJyIC8+DQorIyAgICAgICB1c2UgaXMgaG93IHRoZSB0eXBlIGlzIHJlZmVycmVkIHRvIGluIGNvZGUgPGJyIC8+DQorIyAgICAgICBwb2ludGVyLXVzZSBpcyBob3cgdGhlIHR5cGUgc2hvdWxkIGJlIHJlZmVycmVkIHRvIGFzIGEgcG9pbnRlciAob3B0KSA8YnIgLz4NCisjICAgICAgIEV4YW1wbGUgWE1MIFNjaGVtYSBhbmQgQy9DKysgdHlwZSBiaW5kaW5nczogPGJyIC8+DQorIDxiciAvPg0KK3hzZF9faW50ICAgICAgICA9IDxmb250IGZhY2U9InN5bWJvbCI+fDwvZm9udA0KKz4gaW50IDxiciAvPg0KK3hzZF9fc3RyaW5nICAgICA9IDxmb250IGZhY2U9InN5bWJvbCI+fDwvZm9udA0KKz4gY2hhciogPGZvbnQgZmFjZT0ic3ltYm9sIj58PC9mb250DQorPiBjaGFyKiA8YnIgLz4NCit4c2RfX2Jvb2xlYW4gPSBlbnVtIHhzZF9fYm9vbGVhbiAgZmFsc2VfLCB0cnVlXyA7IDxmb250IGZhY2U9InN5bWJvbCI+fDwvZm9udA0KKz4gZW51bSB4c2RfX2Jvb2xlYW4gPGJyIC8+DQoreHNkX19iYXNlNjRCaW5hcnkgPSBjbGFzcyB4c2RfX2Jhc2U2NEJpbmFyeSAgdW5zaWduZWQgY2hhciAqX19wdHI7IGludCBfX3NpemU7IDsgPGZvbnQgZmFjZT0ic3ltYm9sIj58PC9mb250DQorPiB4c2RfX2Jhc2U2NEJpbmFyeSA8Zm9udCBmYWNlPSJzeW1ib2wiPnw8L2ZvbnQNCis+IHhzZF9fYmFzZTY0QmluYXJ5IDxiciAvPg0KKyMJWW91IGNhbiBleHRlbmQgc3RydWN0cyBhbmQgY2xhc3NlcyB3aXRoIG1lbWJlciBkYXRhIGFuZCBmdW5jdGlvbnMuIDxiciAvPg0KKyMgICAgICBGb3IgZXhhbXBsZSwgYWRkaW5nIGEgY29uc3RydWN0b3IgdG8gbnNfX215Q2xhc3M6DQorbnNfX215Q2xhc3MgICAgID0gJCBuc19fbXlDbGFzcygpOyA8YnIgLz4NCisjCVRoZSBnZW5lcmFsIGZvcm0gaXMNCisjCWNsYXNzX25hbWUgPSAkIG1lbWJlcjsgPGJyIC8+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvdHQ+DQorVGhlIDxpPmk8L2k+IGFuZCA8aT5zPC9pPiBwcmVmaXhlcyBhcmUgZGVjbGFyZWQgc3VjaCB0aGF0IHRoZSBoZWFkZXIgZmlsZSBvdXRwdXQgYnkgdGhlIFdTREwgcGFyc2VyIHdpbGwgdXNlIHRoZXNlIHRvIHByb2R1Y2UgQy9DKysgY29kZS4NCitYTUwgU2NoZW1hIHR5cGVzIGFyZSBhc3NvY2lhdGVkIHdpdGggYW4gb3B0aW9uYWwgQy9DKysgdHlwZSBkZWNsYXJhdGlvbiwgYSB1c2UgcmVmZXJlbmNlLCBhbmQgYSBwb2ludGVyLXVzZSByZWZlcmVuY2UuIFRoZSBwb2ludGVyLXVzZSByZWZlcmVuY2Ugb2YgdGhlIDxpPnhzZF9fYnl0ZTwvaT4gdHlwZSBmb3IgZXhhbXBsZSwgaXMgPGk+PGI+aW50PC9iPio8L2k+IGJlY2F1c2UgPGk+PGI+Y2hhcjwvYj4qPC9pPiBpcyByZXNlcnZlZCBmb3Igc3RyaW5ncy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCQkgICAgICA8aDQ+PGEgbmFtZT0idHRoX3NFYzcuMi4xMiI+DQorNy4yLjEyPC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5Ib3cgdG8gVXNlIENsaWVudCBGdW5jdGlvbmFsaXRpZXMgV2l0aGluIGEgU2VydmljZTwvZm9udD48L2g0Pg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitBIGdTT0FQIHNlcnZpY2UgaW1wbGVtZW50ZWQgd2l0aCBDR0kgbWF5IG1ha2UgZGlyZWN0IGNsaWVudCBjYWxscyB0byBvdGhlciBzZXJ2aWNlcyBmcm9tIHdpdGhpbiBpdHMgc2VydmljZSBvcGVyYXRpb25zLCB3aXRob3V0IHNldHRpbmcgdXAgYSBuZXcgY29udGV4dC4gQSBzdGFuZC1hbG9uZSBzZXJ2aWNlIGFwcGxpY2F0aW9uIG11c3Qgc2V0dXAgYSBuZXcgc29hcCBzdHJ1Y3QgY29udGV4dCwgZS5nLiZuYnNwO3VzaW5nIDxpPnNvYXBfY29weTwvaT4gYW5kIGRlbGV0ZSBpdCBhZnRlciB0aGUgY2FsbC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIHNlcnZlci1zaWRlIGNsaWVudCBjYWxsIGlzIGJlc3QgaWxsdXN0cmF0ZWQgd2l0aCBhbiBleGFtcGxlLiAgVGhlIGZvbGxvd2luZyBleGFtcGxlIGlzIGENCittb3JlIHNvcGhpc3RpY2F0ZWQgZXhhbXBsZSB0aGF0IGNvbWJpbmVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHR3byBXZWIgc2VydmljZXMNCitpbnRvIG9uZSBuZXcgU09BUCBXZWIgc2VydmljZS4gIFRoZSBzZXJ2aWNlIHByb3ZpZGVzIGEgY3VycmVuY3ktY29udmVydGVkIHN0b2NrDQorcXVvdGUuICBUbyBzZXJ2ZSBhIHJlcXVlc3QsIHRoZSBzZXJ2aWNlIGluIHR1cm4gcmVxdWVzdHMgdGhlIHN0b2NrIHF1b3RlIGFuZA0KK3RoZSBjdXJyZW5jeS1leGNoYW5nZSByYXRlIGZyb20gdHdvIFhNZXRob2RzIHNlcnZpY2VzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitJbiBhZGRpdGlvbiB0byBiZWluZyBhIGNsaWVudCBvZiB0d28gWE1ldGhvZHMgc2VydmljZXMsIHRoaXMgc2VydmljZQ0KK2FwcGxpY2F0aW9uIGNhbiBhbHNvIGJlIHVzZWQgYXMgYSBjbGllbnQgb2YgaXRzZWxmIHRvIHRlc3QgdGhlIGltcGxlbWVudGF0aW9uLg0KK0FzIGEgY2xpZW50IGludm9rZWQgZnJvbSB0aGUgY29tbWFuZC1saW5lLCBpdCB3aWxsIHJldHVybiBhIGN1cnJlbmN5LWNvbnZlcnRlZA0KK3N0b2NrIHF1b3RlIGJ5IGNvbm5lY3RpbmcgdG8gYSBjb3B5IG9mIGl0c2VsZiBpbnN0YWxsZWQgYXMgYSBDR0kgYXBwbGljYXRpb24gb24NCit0aGUgV2ViIHRvIHJldHJpZXZlIHRoZSBxdW90ZSBhZnRlciB3aGljaCBpdCB3aWxsIHByaW50IHRoZSBxdW90ZSBvbiB0aGUNCit0ZXJtaW5hbC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIGhlYWRlciBmaWxlIGlucHV0IHRvIHRoZSBnU09BUCBjb21waWxlciBpcyBnaXZlbiBiZWxvdzoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorLy8gQ29udGVudHMgb2YgZmlsZSAicXVvdGV4LmgiOiA8YnIgLz4NCis8Yj5pbnQ8L2I+Jm5ic3A7bnMxX19nZXRRdW90ZSg8Yj5jaGFyPC9iPiZuYnNwOypzeW1ib2wsIDxiPmZsb2F0PC9iPiZuYnNwOyZhbXA7cmVzdWx0KTsgLy8gWE1ldGhvZHMgZGVsYXllZCBzdG9jayBxdW90ZSBzZXJ2aWNlIHJlbW90ZSBtZXRob2QgPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO25zMl9fZ2V0UmF0ZSg8Yj5jaGFyPC9iPiZuYnNwOypjb3VudHJ5MSwgPGI+Y2hhcjwvYj4mbmJzcDsqY291bnRyeTIsIDxiPmZsb2F0PC9iPiZuYnNwOyZhbXA7cmVzdWx0KTsgLy8gWE1ldGhvZHMgY3VycmVuY3ktZXhjaGFuZ2Ugc2VydmljZSByZW1vdGUgbWV0aG9kIDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDtuczNfX2dldFF1b3RlKDxiPmNoYXI8L2I+Jm5ic3A7KnN5bWJvbCwgPGI+Y2hhcjwvYj4mbmJzcDsqY291bnRyeSwgPGI+ZmxvYXQ8L2I+Jm5ic3A7JmFtcDtyZXN1bHQpOyAvLyB0aGUgbmV3IGN1cnJlbmN5LWNvbnZlcnRlZCBzdG9jayBxdW90ZSBzZXJ2aWNlIDxiciAvPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIDxpPnF1b3RleC5jcHA8L2k+IGNsaWVudC9zZXJ2aWNlIGFwcGxpY2F0aW9uIHNvdXJjZSBpczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorLy8gQ29udGVudHMgb2YgZmlsZSAicXVvdGV4LmNwcCI6IDxiciAvPg0KKyNpbmNsdWRlICJzb2FwSC5oIgkvLyBpbmNsdWRlIGdlbmVyYXRlZCBwcm94eSBhbmQgU09BUCBzdXBwb3J0IDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDttYWluKDxiPmludDwvYj4mbmJzcDthcmdjLCA8Yj5jaGFyPC9iPiZuYnNwOyoqYXJndikgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCBzb2FwOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5mbG9hdDwvYj4mbmJzcDtxOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2luaXQoJmFtcDtzb2FwKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KGFyZ2MgICZsdDsgPSAyKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwX3NlcnZlKCZhbXA7c29hcCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmVsc2U8L2I+Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KHNvYXBfY2FsbF9uczNfX2dldFF1b3RlKCZhbXA7c29hcCwgPHR0PiJodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vcXVvdGV4LmNnaSI8L3R0PiwgPHR0PiIiPC90dD4sIGFyZ3ZbMV0sIGFyZ3ZbMl0sIHEpKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwX3ByaW50X2ZhdWx0KCZhbXA7c29hcCwgc3RkZXJyKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+ZWxzZTwvYj4mbmJzcDs8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtwcmludGYoPHR0PiJcbkNvbXBhbnkmbmJzcDslczombmJzcDslZiZuYnNwOyglcylcbiI8L3R0PiwgYXJndlsxXSwgcSwgYXJndlsyXSk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDswOyA8YnIgLz4NCit9IDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDtuczNfX2dldFF1b3RlKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj5jaGFyPC9iPiZuYnNwOypzeW1ib2wsIDxiPmNoYXI8L2I+Jm5ic3A7KmNvdW50cnksIDxiPmZsb2F0PC9iPiZuYnNwOyZhbXA7cmVzdWx0KSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmZsb2F0PC9iPiZuYnNwO3EsIHI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmludDwvYj4mbmJzcDtzb2NrZXQgPSBzb2FwPHR0Pi0mZ3Q7PC90dD5zb2NrZXQ7IC8vIHNhdmUgc29ja2V0IChzdGFuZC1hbG9uZSBzZXJ2aWNlIG9ubHksIGRvZXMgbm90IHN1cHBvcnQga2VlcC1hbGl2ZSkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KHNvYXBfY2FsbF9uczFfX2dldFF1b3RlKHNvYXAsIDx0dD4iaHR0cDovL3NlcnZpY2VzLnhtZXRob2RzLm5ldC9zb2FwIjwvdHQ+LCA8dHQ+IiI8L3R0Piwgc3ltYm9sLCAmYW1wO3EpID09IDAgJmFtcDsmYW1wOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2NhbGxfbnMyX19nZXRSYXRlKHNvYXAsIDx0dD4iaHR0cDovL3NlcnZpY2VzLnhtZXRob2RzLm5ldC9zb2FwIjwvdHQ+LCBOVUxMLCA8dHQ+InVzIjwvdHQ+LCBjb3VudHJ5LCAmYW1wO3IpID09IDApIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7cmVzdWx0ID0gcSpyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwPHR0Pi0mZ3Q7PC90dD5zb2NrZXQgPSBzb2NrZXQ7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDtTT0FQX09LOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt9IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXA8dHQ+LSZndDs8L3R0PnNvY2tldCA9IHNvY2tldDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cmV0dXJuPC9iPiZuYnNwO1NPQVBfRkFVTFQ7CS8vIHBhc3Mgc29hcCBmYXVsdCBtZXNzYWdlcyBvbiB0byB0aGUgY2xpZW50IG9mIHRoaXMgYXBwIDxiciAvPg0KK30gPGJyIC8+DQorLyogU2luY2UgdGhpcyBhcHAgaXMgYSBjb21iaW5lZCBjbGllbnQtc2VydmVyLCBpdCBpcyBwdXQgdG9nZXRoZXIgd2l0aCA8YnIgLz4NCisgKiBvbmUgaGVhZGVyIGZpbGUgdGhhdCBkZXNjcmliZXMgYWxsIHJlbW90ZSBtZXRob2RzLiBIb3dldmVyLCBhcyBhIGNvbnNlcXVlbmNlIHdlIDxiciAvPg0KKyAqIGhhdmUgdG8gaW1wbGVtZW50IHRoZSBtZXRob2RzIHRoYXQgYXJlIG5vdCBvdXJzLiBTaW5jZSB0aGVzZSBpbXBsZW1lbnRhdGlvbnMgYXJlIDxiciAvPg0KKyAqIG5ldmVyIGNhbGxlZCAodGhpcyBjb2RlIGlzIGNsaWVudC1zaWRlKSwgd2UgY2FuIG1ha2UgdGhlbSBkdW1taWVzIGFzIGJlbG93LiA8YnIgLz4NCisgKi8gPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO25zMV9fZ2V0UXVvdGUoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIDxiPmNoYXI8L2I+Jm5ic3A7KnN5bWJvbCwgPGI+ZmxvYXQ8L2I+Jm5ic3A7JmFtcDtyZXN1bHQpIDxiciAvPg0KK3sgPGI+cmV0dXJuPC9iPiZuYnNwO1NPQVBfTk9fTUVUSE9EOyB9IC8vIGR1bW15OiB3aWxsIG5ldmVyIGJlIGNhbGxlZCA8YnIgLz4NCis8Yj5pbnQ8L2I+Jm5ic3A7bnMyX19nZXRSYXRlKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj5jaGFyPC9iPiZuYnNwOypjb3VudHJ5MSwgPGI+Y2hhcjwvYj4mbmJzcDsqY291bnRyeTIsIDxiPmZsb2F0PC9iPiZuYnNwOyZhbXA7cmVzdWx0KSA8YnIgLz4NCit7IDxiPnJldHVybjwvYj4mbmJzcDtTT0FQX05PX01FVEhPRDsgfSAvLyBkdW1teTogd2lsbCBuZXZlciBiZSBjYWxsZWQgPGJyIC8+DQorIDxiciAvPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtOYW1lc3BhY2UgbmFtZXNwYWNlc1tdID0gPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7IlNPQVAtRU5WIiwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIn0sIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3siU09BUC1FTkMiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8ifSwgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyJ4c2kiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCAiaHR0cDovL3d3dy53My5vcmcvKi9YTUxTY2hlbWEtaW5zdGFuY2UifSwgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyJ4c2QiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLCAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvKi9YTUxTY2hlbWEifSwgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyJuczEiLCAidXJuOnhtZXRob2RzLWRlbGF5ZWQtcXVvdGVzIn0sIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3sibnMyIiwgInVybjp4bWV0aG9kcy1DdXJyZW5jeUV4Y2hhbmdlIn0sIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3sibnMzIiwgInVybjpxdW90ZXgifSwgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7e05VTEwsIE5VTEx9IDxiciAvPg0KK307DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUbyBjb21waWxlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKzxpPnNvYXBjcHAyIHF1b3RleC5oPC9pPiA8YnIgLz4NCis8aT5nKysgLW8gcXVvdGV4LmNnaSBxdW90ZXguY3BwIHNvYXBDLmNwcCBzb2FwQ2xpZW50LmNwcCBzb2FwU2VydmVyLmNwcCBzdGRzb2FwMi5jcHAgLWxzb2NrZXQgLWx4bmV0IC1sbnNsPC9pPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQorTm90ZTogdW5kZXIgTGludXggYW5kIE1hYyBPUyBYIHlvdSBjYW4gb2Z0ZW4gb21pdCB0aGUgPHR0Pi1sPC90dD4gbGlicmFyaWVzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgPGk+cXVvdGV4LmNnaTwvaT4gZXhlY3V0YWJsZSBpcyBpbnN0YWxsZWQgYXMgYSBDR0kgYXBwbGljYXRpb24gb24gdGhlIFdlYiBieQ0KK2NvcHlpbmcgaXQgaW4gdGhlIGRlc2lnbmF0ZWQgZGlyZWN0b3J5IHNwZWNpZmljIHRvIHlvdXIgV2ViIHNlcnZlci4gIEFmdGVyDQordGhpcywgdGhlIGV4ZWN1dGFibGUgY2FuIGFsc28gc2VydmUgdG8gdGVzdCB0aGUgc2VydmljZS4gIEZvciBleGFtcGxlDQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjRDBEMEQwIj48dHI+PHRkPjxzcGFuIGNsYXNzPSJyb21hbiI+DQorPGk+cXVvdGV4LmNnaSBJQk0gdWs8L2k+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvc3Bhbj4NCityZXR1cm5zIHRoZSBxdW90ZSBvZiA8aT5JQk08L2k+IGluIDxpPnVrPC9pPiBwb3VuZHMgYnkgY29tbXVuaWNhdGluZyB0aGUgcmVxdWVzdA0KK2FuZCByZXNwb25zZSBxdW90ZSBmcm9tIHRoZSBDR0kgYXBwbGljYXRpb24uICBTZWUNCis8YSBocmVmPSJodHRwOi8veG1ldGhvZHMuY29tL2RldGFpbC5odG1sP2lkPTUiPjx0dD5odHRwOi8veG1ldGhvZHMuY29tL2RldGFpbC5odG1sP2lkPTU8L3R0PjwvYT4gZm9yIGRldGFpbHMgb24gdGhlIGN1cnJlbmN5DQorYWJicmV2aWF0aW9ucy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorV2hlbiBjb21iaW5pbmcgY2xpZW50cyBhbmQgc2VydmljZSBmdW5jdGlvbmFsaXRpZXMsIGl0IGlzIHJlcXVpcmVkIHRvIHVzZSBvbmUNCitoZWFkZXIgZmlsZSBpbnB1dCB0byB0aGUgY29tcGlsZXIuICBBcyBhIGNvbnNlcXVlbmNlLCBob3dldmVyLCBzdHVicyBhbmQNCitza2VsZXRvbnMgYXJlIGF2YWlsYWJsZSBmb3IgPGI+YWxsPC9iPiByZW1vdGUgbWV0aG9kcywgd2hpbGUgdGhlIGNsaWVudCBwYXJ0DQord2lsbCBvbmx5IHVzZSB0aGUgc3R1YnMgYW5kIHRoZSBzZXJ2aWNlIHBhcnQgd2lsbCB1c2UgdGhlIHNrZWxldG9ucy4gIFRodXMsDQorZHVtbXkgaW1wbGVtZW50YXRpb25zIG9mIHRoZSB1bnVzZWQgcmVtb3RlIG1ldGhvZHMgbmVlZCB0byBiZSBnaXZlbiB3aGljaCBhcmUNCituZXZlciBjYWxsZWQuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RocmVlIFdTREwgZmlsZXMgYXJlIGNyZWF0ZWQgYnkgZ1NPQVA6IDx0dD5uczEud3NkbDwvdHQ+LCA8dHQ+bnMyLndzZGw8L3R0PiwgYW5kDQorPHR0Pm5zMy53c2RsPC90dD4uIE9ubHkgdGhlIDx0dD5uczMud3NkbDwvdHQ+IGZpbGUgaXMgcmVxdWlyZWQgdG8gYmUgcHVibGlzaGVkIGFzIGl0DQorY29udGFpbnMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBjb21iaW5lZCBzZXJ2aWNlLCB3aGlsZSB0aGUgb3RoZXJzIGFyZQ0KK2dlbmVyYXRlZCBhcyBhIHNpZGUtZWZmZWN0IChhbmQgaW4gY2FzZSB5b3Ugd2FudCB0byBkZXZlbG9wIHRoZXNlIHNlcGFyYXRlDQorc2VydmljZXMpLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJICAgICA8aDM+PGEgbmFtZT0idHRoX3NFYzcuMyI+DQorNy4zPC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5Ib3cgdG8gVXNlIGdTT0FQIGZvciBBc3luY2hyb25vdXMgT25lLVdheSBNZXNzYWdlIFBhc3Npbmc8L2ZvbnQ+PC9oMz48YSBuYW1lPSJzZWM6b25ld2F5MSI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitTT0FQIFJQQyBjbGllbnQtc2VydmVyIGludGVyYWN0aW9uIGlzIHN5bmNocm9ub3VzOiB0aGUgY2xpZW50IGJsb2NrcyB1bnRpbCB0aGUgc2VydmVyIHJlc3BvbmRzIHRvIHRoZSByZXF1ZXN0Lg0KK2dTT0FQIGFsc28gc3VwcG9ydHMgYXN5bmNocm9ub3VzIG9uZS13YXkgbWVzc2FnZSBwYXNzaW5nIGFuZCB0aGUgaW50ZXJvcGVyYWJsZSBzeW5jaHJvbm91cyBvbmUtd2F5IG1lc3NhZ2UgcGFzc2luZyBvdmVyIEhUVFAuIFRoZSB0d28gc3R5bGVzIGFyZSBzaW1pbGFyLCBidXQgb25seSB0aGUgbGF0dGVyIGlzIGludGVyb3BlcmFibGUgYW5kIGlzIGNvbXBsaWFudCB0byBCYXNpYyBQcm9maWxlIDEuMC4gVGhlIGludGVyb3BlcmFibGUgc3luY2hyb25vdXMgb25lLXdheSBtZXNzYWdlIHBhc3Npbmcgc3R5bGUgb3ZlciBIVFRQIGlzIGRpc2N1c3NlZCBpbiBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzpvbmV3YXkyIj43LjQ8L2E+IGJlbG93Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitTT0FQIG1lc3NhZ2luZyByb3V0aW5lcyBhcmUgZGVjbGFyZWQgYXMgZnVuY3Rpb24gcHJvdG90eXBlcywganVzdCBsaWtlIHJlbW90ZSBtZXRob2RzIGZvciBTT0FQIFJQQy4gIEhvd2V2ZXIsIHRoZSBvdXRwdXQgcGFyYW1ldGVyIGlzIGENCis8aT48Yj52b2lkPC9iPjwvaT4gdHlwZSB0byBpbmRpY2F0ZSB0aGUgYWJzZW5jZSBvZiBhIHJldHVybiB2YWx1ZS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgaGVhZGVyIGZpbGUgc3BlY2lmaWVzIGEgZXZlbnQgbWVzc2FnZSBmb3IgU09BUCBtZXNzYWdpbmc6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPmludDwvYj4mbmJzcDtuc19fZXZlbnQoPGI+aW50PC9iPiZuYnNwO2V2ZW50Tm8sIDxiPnZvaWQ8L2I+Jm5ic3A7ZHVtbXkpOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIGdTT0FQIHN0dWIgYW5kIHNrZWxldG9uIGNvbXBpbGVyIGdlbmVyYXRlcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBpbiA8aT5zb2FwQ2xpZW50LmNwcDwvaT46DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPmludDwvYj4mbmJzcDtzb2FwX3NlbmRfbnNfX2V2ZW50KDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj5jb25zdDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwO1VSTCwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDthY3Rpb24sIDxiPmludDwvYj4mbmJzcDtldmVudCk7IDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDtzb2FwX3JlY3ZfbnNfX2V2ZW50KDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7bnNfX2V2ZW50ICpkdW1teSk7IDxiciAvPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIDxpPnNvYXBfc2VuZF9uc19fZXZlbnQ8L2k+IGZ1bmN0aW9uIHRyYW5zbWl0cyB0aGUgbWVzc2FnZSB0byB0aGUgZGVzdGluYXRpb24gVVJMIGJ5IG9wZW5pbmcgYSBzb2NrZXQgYW5kIHNlbmRpbmcgdGhlIFNPQVAgZW5jb2RlZA0KK21lc3NhZ2UuIFRoZSBzb2NrZXQgd2lsbCByZW1haW4NCitvcGVuIGFmdGVyIHRoZSBzZW5kIGFuZCBoYXMgdG8gYmUgY2xvc2VkIHdpdGggPGk+c29hcF9jbG9zZXNvY2soKTwvaT4uICBUaGUgb3BlbiBzb2NrZXQgY29ubmVjdGlvbiBjYW4gYWxzbyBiZSB1c2VkIHRvIG9idGFpbiBhIHNlcnZpY2UNCityZXNwb25zZSwgZS5nLiB3aXRoIGEgPGk+c29hcF9yZWN2PC9pPiBmdW5jdGlvbiBjYWxsLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgPGk+c29hcF9yZWN2X25zX19ldmVudDwvaT4gZnVuY3Rpb24gd2FpdHMgZm9yIGEgU09BUCBtZXNzYWdlIG9uIHRoZSBjdXJyZW50bHkgb3BlbiBzb2NrZXQgKDxpPnNvYXAuc29ja2V0PC9pPikgYW5kIGZpbGxzIHRoZQ0KKzxpPjxiPnN0cnVjdDwvYj4mbmJzcDtuc19fZXZlbnQ8L2k+IHdpdGggdGhlIDxpPm5zX19ldmVudDwvaT4gcGFyYW1ldGVycyAoZS5nLiA8aT48Yj5pbnQ8L2I+Jm5ic3A7ZXZlbnRObzwvaT4pLg0KK1RoZSA8aT48Yj5zdHJ1Y3Q8L2I+Jm5ic3A7bnNfX2V2ZW50PC9pPiBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkgZ1NPQVAgYW5kIGlzIGEgbWlycm9yIGltYWdlIG9mIHRoZSA8aT5uc19fZXZlbnQ8L2k+IHBhcmFtZXRlcnM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtuc19fZXZlbnQgPGJyIC8+DQoreyA8Yj5pbnQ8L2I+Jm5ic3A7ZXZlbnRObzsgPGJyIC8+DQorfQ0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIGdTT0FQIGdlbmVyYXRlZCA8aT5zb2FwU2VydmVyLmNwcDwvaT4gY29kZSBpbmNsdWRlcyBhIHNrZWxldG9uIHJvdXRpbmUgdG8gYWNjZXB0IHRoZSBtZXNzYWdlLg0KKyhUaGUgc2tlbGV0b24gcm91dGluZSBkb2VzIG5vdCByZXNwb25kIHdpdGggYSBTT0FQIHJlc3BvbnNlIG1lc3NhZ2UuKQ0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5pbnQ8L2I+Jm5ic3A7c29hcF9zZXJ2ZV9uc19fZXZlbnQoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXApOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIHNrZWxldG9uIHJvdXRpbmUgY2FsbHMgdGhlIHVzZXItaW1wbGVtZW50ZWQgPGk+bnNfX2V2ZW50KDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj5pbnQ8L2I+Jm5ic3A7ZXZlbnRObyk8L2k+IHJvdXRpbmUgKG5vdGUgdGhlIGFic2VuY2Ugb2YgdGhlIHZvaWQNCitwYXJhbWV0ZXIhKS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorQXMgdXN1YWwsIHRoZSBza2VsZXRvbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY2FsbGVkIGJ5IHRoZSByZW1vdGUgbWV0aG9kIHJlcXVlc3QgZGlzcGF0Y2hlciB0aGF0IGhhbmRsZXMgYm90aCB0aGUgcmVtb3RlIG1ldGhvZA0KK3JlcXVlc3RzIChSUENzKSBhbmQgbWVzc2FnZXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KK21haW4oKSA8YnIgLz4NCit7IHNvYXBfc2VydmUoc29hcF9uZXcoKSk7IDxiciAvPg0KK30gPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO25zX19ldmVudCg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgPGI+aW50PC9iPiZuYnNwO2V2ZW50Tm8pIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Li4uIC8vIGhhbmRsZSBldmVudCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7U09BUF9PSzsgPGJyIC8+DQorfQ0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkgICAgIDxoMz48YSBuYW1lPSJ0dGhfc0VjNy40Ij4NCis3LjQ8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPk9uZS1XYXkgTWVzc2FnZSBQYXNzaW5nIG92ZXIgSFRUUDwvZm9udD48L2gzPjxhIG5hbWU9InNlYzpvbmV3YXkyIj4NCis8L2E+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK09uZS13YXkgU09BUCBtZXNzYWdlIHBhc3Npbmcgb3ZlciBIVFRQIGFzIGRlZmluZWQgYnkgdGhlIFNPQVAgc3BlY2lmaWNhdGlvbiBhbmQgQmFzaWMgUHJvZmlsZSAxLjAgaXMgc3luY2hyb3Vub3VzLCBtZWFuaW5nIHRoYXQgdGhlIHNlcnZlciBtdXN0IHJlc3BvbmQgd2l0aCBhbiBIVFRQIE9LIGhlYWRlciBhbmQgYW4gZW1wdHkgYm9keS4gVG8gaW1wbGVtZW50IHN5bmNocm91bm91cyBvbmUtd2F5IG1lc3NhZ2luZywgdGhlIHNhbWUgc2V0dXAgZm9yIGFzeW5jaHJvdW5vdXMgb25lLXdheSBtZXNzYWluZyBkaXNjdXNzZWQgaW4gU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6b25ld2F5MSI+Ny4zPC9hPiBpcyB1c2VkLCBidXQgd2l0aCBvbmUgc2ltcGxlIGFkZGl0aW9uIGF0IHRoZSBjbGllbnQgYW5kIHNlcnZlciBzaWRlLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitBdCB0aGUgc2VydmVyIHNpZGUsIHdlIG5lZWQgdG8gcmV0dXJuIGFuIGVtcHR5IEhUVFAgT0sgcmVzcG9uc2UuIFRoaXMgaXMgYWNjb21wbGlzaGVkIGFzIGZvbGxvd3MuIEZvciBlYWNoIG9uZS13YXkgb3BlcmF0aW9uIGltcGxlbWVudGVkIGluIEMvQysrLCB3ZSByZXBsYWNlIHRoZSA8aT48Yj5yZXR1cm48L2I+Jm5ic3A7U09BUF9PSzwvaT4gd2l0aDoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+aW50PC9iPiZuYnNwO25zX19ldmVudCg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgPGI+aW50PC9iPiZuYnNwO2V2ZW50Tm8pIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Li4uIC8vIGhhbmRsZSBldmVudCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7c29hcF9zZW5kX2VtcHR5X3Jlc3BvbnNlKHNvYXApOyA8YnIgLz4NCit9DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitBdCB0aGUgY2xpZW50IHNpZGUsIHRoZSBlbXB0eSByZXNwb25zZSBoZWFkZXIgbXVzdCBiZSBwYXJzZWQgYXMgZm9sbG93czoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+aWY8L2I+Jm5ic3A7KHNvYXBfc2VuZF9uc19fZXZlbnQoc29hcCwgZXZlbnRObykgIT0gU09BUF9PSyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Zm9udCBmYWNlPSJzeW1ib2wiPnw8L2ZvbnQNCis+PGZvbnQgZmFjZT0ic3ltYm9sIj58PC9mb250DQorPiBzb2FwX3JlY3ZfZW1wdHlfcmVzcG9uc2Uoc29hcCkgIT0gU09BUF9PSykgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOyA8YnIgLz4NCisuLi4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoZSBzeW5jaHJvbm91cyAoYW5kIGFzeW5jaHJvbm91cykgb25lLXdheSBtZXNzYWdpbmcgc3VwcG9ydHMgSFRUUCBrZWVwLWFsaXZlIGFuZCBjaHVua2luZy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCSAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWM3LjUiPg0KKzcuNTwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+SG93IHRvIFVzZSB0aGUgU09BUCBTZXJpYWxpemVycyBhbmQgRGVzZXJpYWxpemVycyB0byBTYXZlIGFuZCBMb2FkIEFwcGxpY2F0aW9uIERhdGE8L2ZvbnQ+PC9oMz4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIGdTT0FQIHN0dWIgYW5kIHNrZWxldG9uIGNvbXBpbGVyIGdlbmVyYXRlcyBzZXJpYWxpemVycyBhbmQgZGVzZXJpYWxpemVycyBmb3IgYWxsIHVzZXItZGVmaW5lZCBkYXRhIHN0cnVjdHVyZXMgdGhhdCBhcmUNCitzcGVjaWZpZWQgaW4gdGhlIGhlYWRlciBmaWxlIGlucHV0IHRvIHRoZSBjb21waWxlci4gVGhlIHNlcmlhbGl6ZXJzIGFuZCBkZXNlcmlhbGl6ZXJzIGNhbiBiZSBmb3VuZCBpbiB0aGUgZ2VuZXJhdGVkDQorPGk+c29hcEMuY3BwPC9pPiBmaWxlLiBUaGVzZSBzZXJpYWxpemVycyBhbmQgZGVzZXJpYWxpemVycyBjYW4gYmUgdXNlZCBzZXBhcmF0ZWx5IGJ5IGFuIGFwcGxpY2F0aW9uIHdpdGhvdXQgdGhlIG5lZWQgdG8gYnVpbGQgYQ0KK2Z1bGwgY2xpZW50IG9yIHNlcnZpY2UgYXBwbGljYXRpb24uICBUaGlzIGlzIHVzZWZ1bCBmb3IgYXBwbGljYXRpb25zIHRoYXQgbmVlZCB0byBzYXZlIG9yIGV4cG9ydCB0aGVpciBkYXRhIGluIFhNTCBvciBuZWVkIHRvDQoraW1wb3J0IG9yIGxvYWQgZGF0YSBzdG9yZWQgaW4gWE1MIGZvcm1hdC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGNhbiBiZSBzZXQgdG8gY29udHJvbCB0aGUgZGVzdGluYXRpb24gYW5kIHNvdXJjZSBmb3Igc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKw0KKzx0YWJsZT4NCis8dHI+PHRkPjxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5WYXJpYWJsZTwvYj48L2ZvbnQ+IDwvdGQ+PHRkPjxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5EZXNjcmlwdGlvbjwvYj48L2ZvbnQ+IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPjxiPmludDwvYj4mbmJzcDtzb2FwLnNvY2tldDwvaT4gPC90ZD48dGQ+c29ja2V0IGZpbGUgZGVzY3JpcHRvciBmb3IgaW5wdXQgYW5kIG91dHB1dCBvciAtMSA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT5vc3RyZWFtICpzb2FwLm9zPC9pPgk8L3RkPjx0ZD4oQysrIG9ubHkpIG91dHB1dCBzdHJlYW0gdXNlZCBmb3Igc2VuZCBvcGVyYXRpb25zIDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPmlzdHJlYW0gKnNvYXAuaXM8L2k+CTwvdGQ+PHRkPihDKysgb25seSkgaW5wdXQgc3RyZWFtIHVzZWQgZm9yIHJlY2VpdmUgb3BlcmF0aW9ucyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT48Yj5pbnQ8L2I+Jm5ic3A7c29hcC5zZW5kZmQ8L2k+IDwvdGQ+PHRkPndoZW4gPGk+c29hcF9zb2NrZXQ8L2k+ICZsdDsgMCwgdGhpcyBmZCBpcyB1c2VkIGZvciBzZW5kIG9wZXJhdGlvbnMgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+PGI+aW50PC9iPiZuYnNwO3NvYXAucmVjdmZkPC9pPiA8L3RkPjx0ZD53aGVuIDxpPnNvYXBfc29ja2V0PC9pPiAmbHQ7IDAsIHRoaXMgZmQgaXMgdXNlZCBmb3IgcmVjZWl2ZSBvcGVyYXRpb25zIDwvdGQ+PC90cj48L3RhYmxlPg0KKw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQorVGhlIGZvbGxvd2luZyBpbml0aWFsaXppbmcgYW5kIGZpbmFsaXppbmcgZnVuY3Rpb25zIGNhbiBiZSB1c2VkOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKw0KKzx0YWJsZT4NCis8dHI+PHRkPjxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5GdW5jdGlvbjwvYj48L2ZvbnQ+IDwvdGQ+PHRkPjxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5EZXNjcmlwdGlvbjwvYj48L2ZvbnQ+IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPjxiPnZvaWQ8L2I+Jm5ic3A7c29hcF9iZWdpbl9zZW5kKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwKik8L2k+CTwvdGQ+PHRkPnN0YXJ0IGEgc2VuZC93cml0ZSBwaGFzZSA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT48Yj5pbnQ8L2I+Jm5ic3A7c29hcF9lbmRfc2VuZCg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCopPC9pPiAJPC90ZD48dGQ+Zmx1c2ggdGhlIGJ1ZmZlciA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT48Yj5pbnQ8L2I+Jm5ic3A7c29hcF9iZWdpbl9yZWN2KDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwKik8L2k+CTwvdGQ+PHRkPnN0YXJ0IGEgcmVjL3JlYWQgcGhhc2UgKGlmIGFuIEhUVFAgaGVhZGVyIGlzIHByZXNlbnQsIHBhcnNlIGl0IGZpcnN0KSA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT48Yj5pbnQ8L2I+Jm5ic3A7c29hcF9lbmRfcmVjdig8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCopPC9pPiAJPC90ZD48dGQ+cGVyZm9ybSBhIGlkL2hyZWYgY29uc2lzdGVuY3kgY2hlY2sgb24gZGVzZXJpYWxpemVkIGRhdGEgPC90ZD48L3RyPjwvdGFibGU+DQorDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvc3Bhbj4NCitUaGVzZSBvcGVyYXRpb25zIGRvIG5vdCBvcGVuIG9yIGNsb3NlIHRoZSBjb25uZWN0aW9ucy4gVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBvcGVuIGFuZCBjbG9zZSBjb25uZWN0aW9ucyBvciBmaWxlcyBhbmQgc2V0IHRoZSA8aT5zb2FwLnNvY2tldDwvaT4sIDxpPnNvYXAub3M8L2k+IG9yIDxpPnNvYXAuc2VuZGZkPC9pPiwgPGk+c29hcC5pczwvaT4gb3IgPGk+c29hcC5yZWN2ZmQ8L2k+IHN0cmVhbXMgb3IgZGVzY3JpcHRvcnMuDQorV2hlbiA8aT5zb2FwLnNvY2tldDwvaT4gJmx0OyAwIGFuZCBub25lIG9mIHRoZSBzdHJlYW1zIGFuZCBkZXNjcmlwdG9ycyBhcmUgc2V0LCB0aGVuIHRoZSBzdGFuZGFyZCBpbnB1dCBhbmQgb3V0cHV0IHdpbGwgYmUgdXNlZC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorU2VlIGFsc28gU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6ZmxhZ3MiPjguMTI8L2E+IHRvIGNvbnRyb2wgdGhlIEkvTyBidWZmZXJpbmcgYW5kIGNvbnRlbnQgZW5jb2Rpbmcgc3VjaCBhcyBjb21wcmVzc2lvbiBhbmQgRElNRSBlbmNvZGluZy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCQkgICAgICA8aDQ+PGEgbmFtZT0idHRoX3NFYzcuNS4xIj4NCis3LjUuMTwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+U2VyaWFsaXppbmcgYSBEYXRhIFR5cGU8L2ZvbnQ+PC9oND48YSBuYW1lPSJzZWM6c2VyaWFsaXplIj4NCis8L2E+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RvIHNlcmlhbGl6ZSBhIGRhdGEgdHlwZSB0byBhIHN0cmVhbSwgdHdvIGZ1bmN0aW9ucyBzaG91bGQgYmUgY2FsbGVkIHRvIHByZXBhcmUNCitmb3Igc2VyaWFsaXphdGlvbiBvZiB0aGUgZGF0YSBhbmQgdG8gc2VuZCB0aGUgZGF0YSwgcmVzcGVjdGl2ZWx5LiAgVGhlIGZpcnN0IGZ1bmN0aW9uLA0KKzxpPnNvYXBfc2VyaWFsaXplPC9pPiwgYW5hbHl6ZXMgcG9pbnRlcnMgYW5kIGRldGVybWluZXMgaWYgbXVsdGktcmVmZXJlbmNlcw0KK2FyZSByZXF1aXJlZCB0byBlbmNvZGUgdGhlIGRhdGEgYW5kIGlmIGN5Y2xlcyBhcmUgcHJlc2VudCB0aGUgb2JqZWN0IGdyYXBoLg0KK1RoZSBzZWNvbmQgZnVuY3Rpb24sIDxpPnNvYXBfcHV0PC9pPiwgcHJvZHVjZXMgdGhlIFhNTCBvdXRwdXQgb24gYSBzdHJlYW0uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSA8aT5zb2FwX3NlcmlhbGl6ZTwvaT4gYW5kIDxpPnNvYXBfcHV0PC9pPiBmdW5jdGlvbiBuYW1lcyBhcmUgc3BlY2lmaWMgdG8gYQ0KK2RhdGEgdHlwZS4gRm9yIGV4YW1wbGUsIDxpPnNvYXBfc2VyaWFsaXplX2Zsb2F0KCZhbXA7c29hcCwgJmFtcDtkKTwvaT4gaXMgY2FsbGVkIHRvDQorc2VyaWFsaXplIGFuIDxpPjxiPmZsb2F0PC9iPjwvaT4gdmFsdWUgYW5kIDxpPnNvYXBfcHV0X2Zsb2F0KCZhbXA7c29hcCwgJmFtcDtkLA0KKyJudW1iZXIiLCBOVUxMKTwvaT4gaXMgY2FsbGVkIHRvIG91dHB1dCB0aGUgZmxvYXRpbmcgcG9pbnQgdmFsdWUgaW4gU09BUCB0YWdnZWQNCit3aXRoIHRoZSBuYW1lIDx0dD4mbHQ7bnVtYmVyJiM2Mjs8L3R0Pi4gIFRvIGluaXRpYWxpemUgZGF0YSwgdGhlIDxpPnNvYXBfZGVmYXVsdDwvaT4NCitmdW5jdGlvbiBvZiBhIGRhdGEgdHlwZSBjYW4gYmUgdXNlZC4gIEZvciBleGFtcGxlLA0KKzxpPnNvYXBfZGVmYXVsdF9mbG9hdCgmYW1wO3NvYXAsICZhbXA7ZCk8L2k+IGluaXRpYWxpemVzIHRoZSBmbG9hdCB0byAwLjAuICBUaGUNCis8aT5zb2FwX2RlZmF1bHQ8L2k+IGZ1bmN0aW9ucyBhcmUgdXNlZnVsIHRvIGluaXRpYWxpemUgY29tcGxleCBkYXRhIHR5cGVzIHN1Y2gNCithcyBhcnJheXMsIDxpPjxiPnN0cnVjdDwvYj48L2k+cywgYW5kIDxpPjxiPmNsYXNzPC9iPjwvaT4gaW5zdGFuY2VzLiAgTm90ZSB0aGF0IHRoZQ0KKzxpPnNvYXBfZGVmYXVsdDwvaT4gZnVuY3Rpb25zIGRvIG5vdCBuZWVkIHRoZSBnU09BUCBydW50aW1lIGVudmlyb25tZW50IGFzIGENCitmaXJzdCBwYXJhbWV0ZXIuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBmb2xsb3dpbmcgdGFibGUgbGlzdHMgdGhlIHR5cGUgbmFtaW5nIGNvbnZlbnRpb25zIHVzZWQgYnkgZ1NPQVA6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjRDBEMEQwIj48dHI+PHRkPjxzcGFuIGNsYXNzPSJyb21hbiI+DQorDQorPHRhYmxlPg0KKzx0cj48dGQ+PGZvbnQgY29sb3I9IiNGRjAwMDAiPjxiPlR5cGU8L2I+PC9mb250PiA8L3RkPjx0ZD48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+VHlwZSBOYW1lPC9iPjwvZm9udD4gPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+PGI+Y2hhcjwvYj4qPC9pPiA8L3RkPjx0ZD48aT5zdHJpbmc8L2k+IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPndjaGFyX3QqPC9pPiA8L3RkPjx0ZD48aT53c3RyaW5nPC9pPiA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT48Yj5jaGFyPC9iPjwvaT4gPC90ZD48dGQ+PGk+Ynl0ZTwvaT4gPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+PGI+Ym9vbDwvYj48L2k+IDwvdGQ+PHRkPjxpPmJvb2w8L2k+IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPjxiPmRvdWJsZTwvYj48L2k+IDwvdGQ+PHRkPjxpPmRvdWJsZTwvaT4gPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+PGI+aW50PC9iPjwvaT4gPC90ZD48dGQ+PGk+aW50PC9pPiA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT48Yj5mbG9hdDwvYj48L2k+IDwvdGQ+PHRkPjxpPmZsb2F0PC9pPiA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT48Yj5sb25nPC9iPjwvaT4gPC90ZD48dGQ+PGk+bG9uZzwvaT4gPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+TE9ORzY0PC9pPiA8L3RkPjx0ZD48aT5MT05HNjQ8L2k+IChXaW4zMikgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+PGI+bG9uZzwvYj4mbmJzcDs8Yj5sb25nPC9iPjwvaT4gPC90ZD48dGQ+PGk+TE9ORzY0PC9pPiAoVW5peC9MaW51eCkgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+PGI+c2hvcnQ8L2I+PC9pPiA8L3RkPjx0ZD48aT5zaG9ydDwvaT4gPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+dGltZV90PC9pPiA8L3RkPjx0ZD48aT50aW1lPC9pPiA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT48Yj51bnNpZ25lZDwvYj4mbmJzcDs8Yj5jaGFyPC9iPjwvaT4gPC90ZD48dGQ+PGk+dW5zaWduZWRCeXRlPC9pPiA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT48Yj51bnNpZ25lZDwvYj4mbmJzcDs8Yj5pbnQ8L2I+PC9pPiA8L3RkPjx0ZD48aT51bnNpZ25lZEludDwvaT4gPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+PGI+dW5zaWduZWQ8L2I+Jm5ic3A7PGI+bG9uZzwvYj48L2k+IDwvdGQ+PHRkPjxpPnVuc2lnbmVkTG9uZzwvaT4gPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+VUxPTkc2NDwvaT4gPC90ZD48dGQ+PGk+dW5zaWduZWRMT05HNjQ8L2k+IChXaW4zMik8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT48Yj51bnNpZ25lZDwvYj4mbmJzcDs8Yj5sb25nPC9iPiZuYnNwOzxiPmxvbmc8L2I+PC9pPiA8L3RkPjx0ZD48aT51bnNpZ25lZExPTkc2NDwvaT4gKFVuaXgvTGludXgpIDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPjxiPnVuc2lnbmVkPC9iPiZuYnNwOzxiPnNob3J0PC9iPjwvaT4gPC90ZD48dGQ+PGk+dW5zaWduZWRTaG9ydDwvaT4gPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+PHU+PHNwYW4gY2xhc3M9InJvbWFuIj5UPC9zcGFuPjwvdT48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PHU+PHNwYW4gY2xhc3M9InJvbWFuIj5OPC9zcGFuPjwvdT48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9pPiA8L3RkPjx0ZD48aT5BcnJheTx1PjxzcGFuIGNsYXNzPSJyb21hbiI+Tjwvc3Bhbj48L3U+T2Y8dT48c3BhbiBjbGFzcz0icm9tYW4iPlR5cGU8L3NwYW4+PC91PjwvaT4gd2hlcmUgPHU+VHlwZTwvdT4gaXMgdGhlIHR5cGUgbmFtZSBvZiA8dT5UPC91PiA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT48dT48c3BhbiBjbGFzcz0icm9tYW4iPlQ8L3NwYW4+PC91Pio8L2k+IDwvdGQ+PHRkPjxpPlBvaW50ZXJUbzx1PjxzcGFuIGNsYXNzPSJyb21hbiI+VHlwZTwvc3Bhbj48L3U+PC9pPiB3aGVyZSA8dT5UeXBlPC91PiBpcyB0aGUgdHlwZSBuYW1lIG9mIDx1PlQ8L3U+IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPjxiPnN0cnVjdDwvYj4mbmJzcDtOYW1lPC9pPiA8L3RkPjx0ZD48aT5OYW1lPC9pPiA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT48Yj5jbGFzczwvYj4mbmJzcDtOYW1lPC9pPiA8L3RkPjx0ZD48aT5OYW1lPC9pPiA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT48Yj5lbnVtPC9iPiZuYnNwO05hbWU8L2k+IDwvdGQ+PHRkPjxpPk5hbWU8L2k+IDwvdGQ+PC90cj48L3RhYmxlPg0KKw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQorQ29uc2lkZXIgZm9yIGV4YW1wbGUgdGhlIGZvbGxvd2luZyBDIGNvZGUgd2l0aCBhIGRlY2xhcmF0aW9uIG9mIDxpPnA8L2k+IGFzIGENCitwb2ludGVyIHRvIGEgPGk+PGI+c3RydWN0PC9iPiZuYnNwO25zX19QZXJzb248L2k+Og0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7bnNfX1BlcnNvbiB7IDxiPmNoYXI8L2I+Jm5ic3A7Km5hbWU7IH0gKnA7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUbyBzZXJpYWxpemUgPGk+cDwvaT4sIGl0cyBhZGRyZXNzIGlzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24NCis8aT5zb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG9uc19fUGVyc29uPC9pPiBnZW5lcmF0ZWQgZm9yIHRoaXMgdHlwZSBieSB0aGUNCitnU09BUCBjb21waWxlcjoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorc29hcF9zZXJpYWxpemVfUG9pbnRlclRvbnNfX1BlcnNvbigmYW1wO3NvYXAsICZhbXA7cCk7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgPGI+YWRkcmVzcyBvZjwvYj4gPGk+cDwvaT4gaXMgcGFzc2VkLCBzbyB0aGUgc2VyaWFsaXplciBjYW4gZGV0ZXJtaW5lIHdoZXRoZXINCis8aT5wPC9pPiB3YXMgYWxyZWFkeSBzZXJpYWxpemVkIGFuZCB0byBkaXNjb3ZlciBjeWNsZXMgaW4gZ3JhcGggZGF0YSBzdHJ1Y3R1cmVzLg0KK1RvIGdlbmVyYXRlIHRoZSBvdXRwdXQsIHRoZSBhZGRyZXNzIG9mIDxpPnA8L2k+IGlzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24NCis8aT5zb2FwX3B1dF9Qb2ludGVyVG9uc19fUGVyc29uPC9pPiB0b2dldGhlciB3aXRoIHRoZSBuYW1lIG9mIGFuIFhNTCBlbGVtZW50DQorYW5kIGFuIG9wdGlvbmFsIHR5cGUgc3RyaW5nICh0byBvbWl0IGEgdHlwZSwgdXNlIDxpPk5VTEw8L2k+KToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorc29hcF9iZWdpbl9zZW5kKCZhbXA7c29hcCk7IDxiciAvPg0KK3NvYXBfcHV0X1BvaW50ZXJUb25zX19QZXJzb24oJmFtcDtzb2FwLCAmYW1wO3AsICJuczplbGVtZW50LW5hbWUiLCAibnM6dHlwZS1uYW1lIik7IDxiciAvPg0KK3NvYXBfZW5kX3NlbmQoJmFtcDtzb2FwKTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoaXMgcHJvZHVjZXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBCMEQwIj48dHI+PHRkPjx0dD4NCismbHQ7bnM6ZWxlbWVudC1uYW1lIHhtbG5zOlNPQVAtRU5WPSIuLi4iIHhtbG5zOlNPQVAtRU5DPSIuLi4iIHhtbG5zOm5zPSIuLi4iIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOy4uLiB4c2k6dHlwZT0ibnM6dHlwZS1uYW1lIiYjNjI7IDxiciAvPg0KKyZsdDtuYW1lIHhzaTp0eXBlPSJ4c2Q6c3RyaW5nIiYjNjI7Li4uJmx0Oy9uYW1lJiM2MjsgPGJyIC8+DQorJmx0Oy9uczplbGVtZW50LW5hbWUmIzYyOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3R0Pg0KK1RoZSBzZXJpYWxpemVyIGlzIGluaXRpYWxpemVkIHdpdGggdGhlIDxpPnNvYXBfYmVnaW5fc2VuZChzb2FwKTwvaT4gZnVuY3Rpb24NCithbmQgY2xvc2VkIHdpdGggPGk+c29hcF9lbmRfc2VuZChzb2FwKTwvaT4uIEFsbCB0ZW1wb3JhcnkgZGF0YSBzdHJ1Y3R1cmVzIGFuZA0KK2RhdGEgc3RydWN0dXJlcyBkZXNlcmlhbGl6ZWQgb24gdGhlIGhlYXAgYXJlIGRlc3Ryb3llZCB3aXRoIHRoZQ0KKzxpPnNvYXBfZW5kKCk8L2k+IGZ1bmN0aW9uLiAgVGhlIDxpPnNvYXBfZnJlZSgpPC9pPiBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0bw0KK3JlbW92ZSB0aGUgdGVtcG9yYXJ5IGRhdGEgb25seSBhbmQga2VlcCB0aGUgZGVzZXJpYWxpemVkIGRhdGEgb24gdGhlIGhlYXAuDQorVGVtcG9yYXJ5IGRhdGEgc3RydWN0dXJlcyBhcmUgb25seSBjcmVhdGVkIGlmIHRoZSBlbmNvZGVkIGRhdGEgdXNlcyBwb2ludGVycy4NCitFYWNoIHBvaW50ZXIgaW4gdGhlIGVuY29kZWQgZGF0YSBoYXMgYW4gaW50ZXJuYWwgaGFzaCB0YWJsZSBlbnRyeSB0byBkZXRlcm1pbmUNCithbGwgbXVsdGktcmVmZXJlbmNlIHBhcnRzIGFuZCBjeWNsaWMgcGFydHMgb2YgdGhlIGNvbXBsZXRlIGRhdGEgc3RydWN0dXJlLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitZb3UgY2FuIGFzc2lnbiBhbg0KK291dHB1dCBzdHJlYW0gdG8gPGk+c29hcC5vczwvaT4gb3IgYSBmaWxlIGRlc2NyaXB0b3IgdG8gPGk+c29hcC5zZW5kZmQ8L2k+Lg0KK0ZvciBleGFtcGxlDQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KK3NvYXAuc2VuZGZkID0gb3BlbihmaWxlLCBPX1JEV1IgfCBPX0NSRUFULCBTX0lXVVNSIHwgU19JUlVTUik7IDxiciAvPg0KK3NvYXBfc2VyaWFsaXplX1BvaW50ZXJUb25zX19QZXJzb24oJmFtcDtzb2FwLCAmYW1wO3ApOyA8YnIgLz4NCitzb2FwX2JlZ2luX3NlbmQoJmFtcDtzb2FwKTsgPGJyIC8+DQorc29hcF9wdXRfUG9pbnRlclRvbnNfX1BlcnNvbigmYW1wO3NvYXAsICZhbXA7cCwgIm5zOmVsZW1lbnQtbmFtZSIsICJuczp0eXBlLW5hbWUiKTsgPGJyIC8+DQorc29hcF9lbmRfc2VuZCgmYW1wO3NvYXApOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIDxpPnNvYXBfc2VyaWFsaXplPC9pPiBmdW5jdGlvbiBpcyBvcHRpb25hbC4gSXQgTVVTVCBiZSB1c2VkIHdoZW4NCit0aGUgb2JqZWN0IGdyYXBoIGNvbnRhaW5zIGN5Y2xlcy4NCitJdCBNVVNUIGJlIGNhbGxlZCB0byBwcmVzZXJ2ZWQgdGhlIGxvZ2ljYWwgY29oZXJlbmNlIG9mIHBvaW50ZXItYmFzZWQNCitkYXRhIHN0cnVjdHVyZXMsIHdoZXJlIHBvaW50ZXJzIG1heSByZWZlciB0byBjby1yZWZlcmVuY2VkIG9iamVjdHMuDQorQnkgY2FsbGluZyA8aT5zb2FwX3NlcmlhbGl6ZTwvaT4sIGRhdGEgc3RydWN0dXJlcyBzaGFyZWQgdGhyb3VnaCBwb2ludGVycyBhcmUgc2VyaWFsaXplZCBvbmx5IG9uY2UgYW5kDQorcmVmZXJlbmNlZCBpbiBYTUwgdXNpbmcgaWQtcmVmcyBhdHRyaWJ1dGVzLg0KK1RoaXMgYWN0dWFsIGlkLXJlZnMgdXNlZCBkZXBlbmQgb24gdGhlIFNPQVAgZW5jb2RpbmcuIFRvIHR1cm4gb2ZmIFNPQVAgZW5jb2RpbmcsDQorcmVtb3ZlIG9yIGF2b2lkIHVzaW5nIHRoZSBTT0FQLUVOViBhbmQgU09BUC1FTkMgbmFtZXNwYWNlIGJpbmRpbmdzIGluIHRoZSBuYW1lc3BhY2UgdGFibGUuDQorSW4gYWRkaXRpb24sIHRoZSA8aT5TT0FQX1hNTF9UUkVFPC9pPiBhbmQgPGk+U09BUF9YTUxfR1JBUEg8L2k+IGZsYWdzIGNhbiBiZSB1c2VkDQordG8gY29udHJvbCB0aGUgb3V0cHV0Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUbyBzYXZlIHRoZSBkYXRhIGFzIGFuIFhNTCB0cmVlICh3aXRoIG9uZSByb290KSB3aXRob3V0IGFueSBpZC1yZWYgYXR0cmlidXRlcywgdXNlIHRoZQ0KKzxpPlNPQVBfWE1MX1RSRUU8L2k+IGZsYWcuIFRoZSBkYXRhIHN0cnVjdHVyZSBNVVNUIE5PVCBjb250YWluIHBvaW50ZXItYmFzZWQgY3ljbGVzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUbyBwcmVzZXJ2ZSB0aGUgZXhhY3Qgc3RydWN0dXJlIG9mIHRoZSBkYXRhIG9iamVjdCBncmFwaCBhbmQgY3JlYXRlIFhNTCB3aXRoIG9uZSByb290LCB1c2UNCit0aGUgPGk+U09BUF9YTUxfR1JBUEg8L2k+IG91dHB1dC1tb2RlIGZsYWcgKHNlZQ0KK1NlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOmZsYWdzIj44LjEyPC9hPikuIFVzZSB0aGlzIGZsYWcgYW5kIHRoZSA8aT5zb2FwX3NlcmlhbGl6ZTwvaT4gZnVuY3Rpb24NCit0byBwcmVwYXJlIHRoZSBzZXJpYWxpemF0aW9uIG9mIGRhdGEgd2l0aCBpbi1saW5lIGlkLXJlZiBhdHRyaWJ1dGVzLg0KK1VzaW5nIHRoZSA8aT5TT0FQX1hNTF9HUkFQSDwvaT4gZmxhZyBhc3N1cmVzIHRoZSBwcmVzZXJ2YXRpb24gb2YgdGhlIGxvZ2ljYWwgc3RydWN0dXJlIG9mIHRoZSBkYXRhDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0ZvciBleGFtcGxlLCB0byBlbmNvZGUgdGhlIGNvbnRlbnRzIG9mIHR3byB2YXJpYWJsZXMgPGk+dmFyMTwvaT4gYW5kIDxpPnZhcjI8L2k+IHRoYXQgbWF5DQorc2hhcmUgZGF0YSB0aHJvdWcgcG9pbnRlciBzdHJ1Y3R1cmVzLA0KK3RoZSBzZXJpYWxpemVycyBhcmUgY2FsbGVkIGJlZm9yZSB0aGUgb3V0cHV0IHJvdXRpbmVzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8dT48c3BhbiBjbGFzcz0icm9tYW4iPlQxPC9zcGFuPjwvdT4gdmFyMTsgPGJyIC8+DQorPHU+PHNwYW4gY2xhc3M9InJvbWFuIj5UMjwvc3Bhbj48L3U+IHZhcjI7IDxiciAvPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwIHNvYXA7IDxiciAvPg0KKy4uLiA8YnIgLz4NCitzb2FwX2luaXQoJmFtcDtzb2FwKTsgLy8gaW5pdGlhbGl6ZSA8YnIgLz4NCis8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD5zb2FwX29tb2RlKCZhbXA7c29hcCwgZmxhZ3MpOzxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PiAvLyBzZXQgb3V0cHV0LW1vZGUgZmxhZ3MgKGUuZy4gU09BUF9FTkNfWE1MPHR0Pnw8L3R0PlNPQVBfRU5DX1pMSUIpIDxiciAvPg0KK3NvYXBfYmVnaW4oJmFtcDtzb2FwKTsgLy8gc3RhcnQgbmV3IChkZSlzZXJpYWxpemF0aW9uIHBoYXNlIDxiciAvPg0KK3NvYXBfc2V0X29tb2RlKCZhbXA7c29hcCwgU09BUF9YTUxfR1JBUEgpOyA8YnIgLz4NCitzb2FwX3NlcmlhbGl6ZV88dT48c3BhbiBjbGFzcz0icm9tYW4iPlR5cGUxPC9zcGFuPjwvdT4oJmFtcDtzb2FwLCAmYW1wO3ZhcjEpOyA8YnIgLz4NCitzb2FwX3NlcmlhbGl6ZV88dT48c3BhbiBjbGFzcz0icm9tYW4iPlR5cGUyPC9zcGFuPjwvdT4oJmFtcDtzb2FwLCAmYW1wO3ZhcjIpOyA8YnIgLz4NCisuLi4gPGJyIC8+DQorPGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+c29hcC5zb2NrZXQgPSBhX3NvY2tldF9maWxlX2Rlc2NyaXB0b3I7PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+IC8vIHdoZW4gdXNpbmcgc29ja2V0cyA8YnIgLz4NCis8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD5zb2FwLm9zID0gYW5fb3V0cHV0X3N0cmVhbTs8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD4gLy8gQysrIDxiciAvPg0KKzxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PnNvYXAuc2VuZGZkID0gYW5fb3V0cHV0X2ZpbGVfZGVzY3JpcHRvcjs8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD4gLy8gQyA8YnIgLz4NCitzb2FwX2JlZ2luX3NlbmQoJmFtcDtzb2FwKTsgPGJyIC8+DQorc29hcF9wdXRfPHU+PHNwYW4gY2xhc3M9InJvbWFuIj5UeXBlMTwvc3Bhbj48L3U+KCZhbXA7c29hcCwgJmFtcDt2YXIxLCAiPGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+bmFtZXNwYWNlLXByZWZpeDo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD5lbGVtZW50LW5hbWUxIiwgIjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250Pm5hbWVzcGFjZS1wcmVmaXg6PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+dHlwZS1uYW1lMSIpOyA8YnIgLz4NCitzb2FwX3B1dF88dT48c3BhbiBjbGFzcz0icm9tYW4iPlR5cGUyPC9zcGFuPjwvdT4oJmFtcDtzb2FwLCAmYW1wO3ZhcjIsICI8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD5uYW1lc3BhY2UtcHJlZml4Ojxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PmVsZW1lbnQtbmFtZTIiLCAiPGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+bmFtZXNwYWNlLXByZWZpeDo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD50eXBlLW5hbWUyIik7IDxiciAvPg0KKy4uLiA8YnIgLz4NCitzb2FwX2VuZF9zZW5kKCZhbXA7c29hcCk7IC8vIGZsdXNoIDxiciAvPg0KK3NvYXBfZW5kKCZhbXA7c29hcCk7IC8vIHJlbW92ZSB0ZW1wb3JhcnkgZGF0YSBzdHJ1Y3R1cmVzIGFmdGVyIHBoYXNlIDxiciAvPg0KK3NvYXBfZG9uZSgmYW1wO3NvYXApOyAvLyBmaW5hbGl6ZSBsYXN0IHVzZSBvZiB0aGlzIGVudmlyb25tZW50IDxiciAvPg0KKy4uLg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQord2hlcmUgPHU+VHlwZTE8L3U+IGlzIHRoZSB0eXBlIG5hbWUgb2YgPHU+VDE8L3U+IGFuZA0KKzx1PlR5cGUyPC91PiBpcyB0aGUgdHlwZSBuYW1lIG9mIDx1PlQyPC91PiAoc2VlIHRhYmxlIGFib3ZlKS4gIFRoZQ0KK3N0cmluZ3MgPGk+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+bmFtZXNwYWNlLXByZWZpeDo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD50eXBlLW5hbWUxPC9pPiBhbmQNCis8aT48Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD5uYW1lc3BhY2UtcHJlZml4Ojxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PnR5cGUtbmFtZTI8L2k+IGRlc2NyaWJlIHRoZSBzY2hlbWEgdHlwZXMgb2YgdGhlDQorZWxlbWVudHMuICBVc2UgPGk+TlVMTDwvaT4gdG8gb21pdCB0aGlzIHR5cGUgaW5mb3JtYXRpb24uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0ZvciBzZXJpYWxpemluZyBjbGFzcyBpbnN0YW5jZXMsIG1ldGhvZCBpbnZvY2F0aW9ucyBNVVNUIGJlIHVzZWQgaW5zdGVhZCBvZiBmdW5jdGlvbiBjYWxscywgZm9yIGV4YW1wbGUNCis8aT5vYmouc29hcF9zZXJpYWxpemUoJmFtcDtzb2FwKTwvaT4gYW5kIDxpPm9iai5zb2FwX3B1dCgmYW1wO3NvYXAsICJlbHQiLCAidHlwZSIpPC9pPi4gIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBwcm9wZXIgc2VyaWFsaXplcnMgYXJlIHVzZWQgZm9yDQorc2VyaWFsaXppbmcgaW5zdGFuY2VzIG9mIGRlcml2ZWQgY2xhc3Nlcy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorWW91IGNhbiBzZXJpYWxpemUgYSBjbGFzcyBpbnN0YW5jZSB0byBhIHN0cmVhbSBhcyBmb2xsb3dzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCBzb2FwOyA8YnIgLz4NCitteUNsYXNzIG9iajsgPGJyIC8+DQorc29hcF9pbml0KCZhbXA7c29hcCk7IC8vIGluaXRpYWxpemUgPGJyIC8+DQorc29hcF9iZWdpbigmYW1wO3NvYXApOyAvLyBzdGFydCBuZXcgKGRlKXNlcmlhbGl6YXRpb24gcGhhc2UgPGJyIC8+DQorc29hcF9zZXRfb21vZGUoJmFtcDtzb2FwLCBTT0FQX1hNTF9HUkFQSCk7IDxiciAvPg0KK29iai5zZXJpYWxpemUoJmFtcDtzb2FwKTsgPGJyIC8+DQorc29hcC5vcyA9IGNvdXQ7IC8vIHNlbmQgdG8gY291dCA8YnIgLz4NCitzb2FwX2JlZ2luX3NlbmQoJmFtcDtzb2FwKTsgPGJyIC8+DQorb2JqLnB1dCgmYW1wO3NvYXAsICI8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD5uYW1lc3BhY2UtcHJlZml4Ojxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PmVsZW1lbnQtbmFtZTEiLCAiPGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+bmFtZXNwYWNlLXByZWZpeDo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD50eXBlLW5hbWUxIik7IDxiciAvPg0KKy4uLiA8YnIgLz4NCitzb2FwX2VuZF9zZW5kKCZhbXA7c29hcCk7IC8vIGZsdXNoIDxiciAvPg0KK3NvYXBfZW5kKCZhbXA7c29hcCk7IC8vIHJlbW92ZSB0ZW1wb3JhcnkgZGF0YSBzdHJ1Y3R1cmVzIGFmdGVyIHBoYXNlIDxiciAvPg0KK3NvYXBfZG9uZSgmYW1wO3NvYXApOyAvLyBmaW5hbGl6ZSBsYXN0IHVzZSBvZiB0aGlzIGVudmlyb25tZW50DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitXaGVuIHlvdSBkZWNsYXJlIGEgc29hcCBzdHJ1Y3QgcG9pbnRlciBhcyBhIGRhdGEgbWVtYmVyIGluIGEgY2xhc3MsIHlvdSBjYW4gb3ZlcmxvYWQgdGhlIDx0dD4mbHQ7Jmx0OzwvdHQ+IG9wZXJhdG9yIHRvIHNlcmlhbGl6ZSB0aGUgY2xhc3MgdG8gc3RyZWFtczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorb3N0cmVhbSAmYW1wO29wZXJhdG9yPHR0PiZsdDsmbHQ7PC90dD4ob3N0cmVhbSAmYW1wO28sIDxiPmNvbnN0PC9iPiZuYnNwO215Q2xhc3MgJmFtcDtlKSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyghZS5zb2FwKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsuLi4gZXJyb3I6IG5lZWQgYSBzb2FwIHN0cnVjdCB0byBzZXJpYWxpemUgKGNvdWxkIHVzZSBnbG9iYWwgc3RydWN0KSAuLi4gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+ZWxzZTwvYj4mbmJzcDs8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO29zdHJlYW0gKm9zID0gZS5zb2FwPHR0Pi0mZ3Q7PC90dD5vczsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZS5zb2FwPHR0Pi0mZ3Q7PC90dD5vcyA9ICZhbXA7bzsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9zZXRfb21vZGUoZS5zb2FwLCBTT0FQX1hNTF9HUkFQSCk7DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZS5zZXJpYWxpemUoZS5zb2FwKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9iZWdpbl9zZW5kKGUuc29hcCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2UucHV0KGUuc29hcCwgIm15Q2xhc3MiLCBOVUxMKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9lbmRfc2VuZChlLnNvYXApOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtlLnNvYXA8dHQ+LSZndDs8L3R0Pm9zID0gb3M7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfY2xyX29tb2RlKGUuc29hcCwgU09BUF9YTUxfR1JBUEgpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt9IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDtvOyA8YnIgLz4NCit9DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitPZiBjb3Vyc2UsIHdoZW4geW91IGNvbnN0cnVjdCBhbiBpbnN0YW5jZSB5b3UgbXVzdCBzZXQgaXRzIHNvYXAgc3RydWN0IHRvIGEgdmFsaWQgZW52aXJvbm1lbnQuICBEZXNlcmlhbGl6ZWQgY2xhc3MgaW5zdGFuY2VzIHdpdGggYSBzb2FwIHN0cnVjdCBkYXRhIG1lbWJlciB3aWxsIGhhdmUgdGhlaXIgc29hcCBzdHJ1Y3RzIHNldCBhdXRvbWF0aWNhbGx5LCBzZWUgU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6Y2xhc3NtZW1vcnkiPjguMTMuMjwvYT4uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0luIHByaW5jaXBsZSwgWE1MIG91dHB1dCBmb3IgYSBkYXRhIHN0cnVjdHVyZSBjYW4gYmUgcHJvZHVjZWQgd2l0aCA8aT5zb2FwX3B1dDwvaT4NCit3aXRob3V0IGNhbGxpbmcgdGhlIDxpPnNvYXBfc2VyaWFsaXplPC9pPiBmdW5jdGlvbiBmaXJzdC4NCitJbiB0aGlzIGNhc2UsIHRoZSByZXN1bHQgaXMgc2ltaWxhciB0byA8aT5TT0FQX1hNTF9UUkVFPC9pPiB3aGljaA0KK21lYW5zIHRoYXQgbm8gaWQtcmVmcyBhcmUgb3V0cHV0LiBDeWNsZXMgaW4gdGhlIGRhdGEgc3RydWN0dXJlIHdpbGwgY3Jhc2ggdGhlIHNlcmlhbGl6YXRpb24NCithbGdvcml0aG0sIGV2ZW4gd2hlbiB0aGUgPGk+U09BUF9YTUxfR1JBUEg8L2k+IGlzIHNldC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorQ29uc2lkZXIgdGhlIGZvbGxvd2luZyA8aT48Yj5zdHJ1Y3Q8L2I+PC9pPjoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorLy8gQ29udGVudHMgb2YgZmlsZSAidHJpY2t5LmgiOiA8YnIgLz4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7VHJpY2t5PGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7KnA7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmludDwvYj4mbmJzcDtuOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7KnE7IDxiciAvPg0KK307DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgZm9sbG93aW5nIGZyYWdtZW50IGluaXRpYWxpemVzIHRoZSBwb2ludGVyIGZpZWxkcyA8aT5wPC9pPiBhbmQgPGk+cTwvaT4gdG8gdGhlIHZhbHVlIG9mIGZpZWxkIDxpPm48L2k+Og0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCBzb2FwOyA8YnIgLz4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7VHJpY2t5IFg7IDxiciAvPg0KK1gubiA9IDE7IDxiciAvPg0KK1gucCA9ICZhbXA7WC5uOyA8YnIgLz4NCitYLnEgPSAmYW1wO1gubjsgPGJyIC8+DQorc29hcF9pbml0KCZhbXA7c29hcCk7IDxiciAvPg0KK3NvYXBfYmVnaW4oJmFtcDtzb2FwKTsgPGJyIC8+DQorc29hcF9zZXJpYWxpemVfVHJpY2t5KCZhbXA7c29hcCwgJmFtcDtYKTsgPGJyIC8+DQorc29hcF9wdXRfVHJpY2t5KCZhbXA7c29hcCwgJmFtcDtYLCA8dHQ+IlRyaWNreSI8L3R0PiwgTlVMTCk7IDxiciAvPg0KK3NvYXBfZW5kKCZhbXA7c29hcCk7IC8vIENsZWFuIHVwIHRlbXBvcmFyeSBkYXRhIHVzZWQgYnkgdGhlIHNlcmlhbGl6ZXINCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1doYXQgaXMgc3BlY2lhbCBhYm91dCB0aGlzIGRhdGEgc3RydWN0dXJlIGlzIHRoYXQgPGk+bjwvaT4gaXMgJ2ZpeGVkJyBpbiB0aGUgPGk+VHJpY2t5PC9pPiBzdHJ1Y3R1cmUsIGFuZCA8aT5wPC9pPiBhbmQgPGk+cTwvaT4gYm90aCBwb2ludCB0byA8aT5uPC9pPi4gVGhlIGdTT0FQIHNlcmlhbGl6ZXJzIHN0cmF0ZWdpY2FsbHkgcGxhY2UgdGhlIGlkLXJlZiBhdHRyaWJ1dGVzIHN1Y2ggdGhhdCA8aT5uPC9pPiB3aWxsIGJlIGlkZW50aWZpZWQgYXMgdGhlIHByaW1hcnkgZGF0YSBzb3VyY2UsIHdoaWxlIDxpPnA8L2k+IGFuZCA8aT5xPC9pPiBhcmUgc2VyaWFsaXplZCB3aXRoIHJlZi9ocmVmIGF0dHJpYnV0ZXMuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSByZXN1bHRpbmcgb3V0cHV0IGlzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwQjBEMCI+PHRyPjx0ZD48dHQ+DQorJmx0O1RyaWNreSB4c2k6dHlwZT0iVHJpY2t5IiYjNjI7IDxiciAvPg0KKyZsdDtwIGhyZWY9IiMyIi8mIzYyOw0KKyZsdDtuIHhzaTp0eXBlPSJpbnQiJiM2MjsxJmx0Oy9uJiM2MjsNCismbHQ7cSBocmVmPSIjMiIvJiM2MjsNCismbHQ7ciB4c2k6dHlwZT0iaW50IiYjNjI7MiZsdDsvciYjNjI7DQorJmx0Oy9Ucmlja3kmIzYyOw0KKyZsdDtpZCBpZD0iMiIgeHNpOnR5cGU9ImludCImIzYyOzEmbHQ7L2lkJiM2MjsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC90dD4NCit3aGljaCB1c2VzIGFuIGluZGVwZW5kZW50IGVsZW1lbnQgYXQgdGhlIGVuZCB0byByZXByZXNlbnQgdGhlIG11bHRpLXJlZmVyZW5jZWQgaW50ZWdlciwgYXNzdW1pbmcgdGhlIDxpPlNPQVAtRU5WPC9pPiBhbmQgPGk+U09BUC1FTkM8L2k+IG5hbWVzcGFjZXMgaW5kaWNhdGUgU09BUCAxLjEgZW5jb2RpbmcuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1dpdGggdGhlIDxpPlNPQVBfWE1MX0dSQVBIPC9pPiBmbGFnIHRoZSBvdXRwdXQgaXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBCMEQwIj48dHI+PHRkPjx0dD4NCismbHQ7VHJpY2t5IHhzaTp0eXBlPSJUcmlja3kiJiM2MjsgPGJyIC8+DQorJmx0O3AgaHJlZj0iIzIiLyYjNjI7DQorJmx0O24gaWQ9IjIiIHhzaTp0eXBlPSJpbnQiJiM2MjsxJmx0Oy9uJiM2MjsNCismbHQ7cSBocmVmPSIjMiIvJiM2MjsNCismbHQ7L1RyaWNreSYjNjI7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvdHQ+DQorSW4gdGhpcyBjYXNlLCB0aGUgWE1MIGlzIHNlbGYtY29udGFpbmVkIGFuZCBtdWx0aS1yZWZlcmVuY2VkIGRhdGEgaXMgYWNjdXJhdGVseSBzZXJpYWxpemVkLg0KK1RoZSBnU09BUCBnZW5lcmF0ZWQgZGVzZXJpYWxpemVyIGZvciB0aGlzIGRhdGEgdHlwZSB3aWxsIGJlIGFibGUgdG8gYWNjdXJhdGVseSByZWNvbnN0cnVjdCB0aGUgZGF0YSBmcm9tIHRoZSBYTUwgKG9uIHRoZSBoZWFwKS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCQkgICAgICA8aDQ+PGEgbmFtZT0idHRoX3NFYzcuNS4yIj4NCis3LjUuMjwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+RGVzZXJpYWxpemluZyBhIERhdGEgVHlwZTwvZm9udD48L2g0PjxhIG5hbWU9InNlYzpkZXNlcmlhbGl6ZSI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUbyBkZXNlcmlhbGl6ZSBhIGRhdGEgdHlwZSwgaXRzIDxpPnNvYXBfZ2V0PC9pPiBmdW5jdGlvbiBpcyB1c2VkLiBUaGUgb3V0bGluZSBvZiBhIHByb2dyYW0gdGhhdCBkZXNlcmlhbGl6ZXMgdHdvIHZhcmlhYmxlcyA8aT52YXIxPC9pPiBhbmQgPGk+dmFyMjwvaT4gaXMgZm9yIGV4YW1wbGU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzx1PjxzcGFuIGNsYXNzPSJyb21hbiI+VDE8L3NwYW4+PC91PiB2YXIxOyA8YnIgLz4NCis8dT48c3BhbiBjbGFzcz0icm9tYW4iPlQyPC9zcGFuPjwvdT4gdmFyMjsgPGJyIC8+DQorPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgc29hcDsgPGJyIC8+DQorLi4uIDxiciAvPg0KK3NvYXBfaW5pdCgmYW1wO3NvYXApOyAvLyBpbml0aWFsaXplIGF0IGxlYXN0IG9uY2UgPGJyIC8+DQorPGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+c29hcF9pbW9kZSgmYW1wO3NvYXAsIGZsYWdzKTs8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD4gLy8gc2V0IGlucHV0LW1vZGUgZmxhZ3MgPGJyIC8+DQorc29hcF9iZWdpbigmYW1wO3NvYXApOyAvLyBiZWdpbiBuZXcgZGVjb2RpbmcgcGhhc2UgPGJyIC8+DQorPGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+c29hcC5pcyA9IGFuX2lucHV0X3N0cmVhbTs8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD4gLy8gQysrIDxiciAvPg0KKzxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PnNvYXAucmVjdmZkID0gYW5faW5wdXRfZmlsZV9kZXNyaXB0cHI7PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+IC8vIEMgPGJyIC8+DQorc29hcF9iZWdpbl9yZWN2KCZhbXA7c29hcCk7IC8vIGlmIEhUVFAvTUlNRS9ESU1FL0daSVAgaGVhZGVycyBhcmUgcHJlc2VudCwgcGFyc2UgdGhlbSA8YnIgLz4NCis8Yj5pZjwvYj4mbmJzcDsoIXNvYXBfZ2V0Xzx1PjxzcGFuIGNsYXNzPSJyb21hbiI+VHlwZTE8L3NwYW4+PC91PigmYW1wO3NvYXAsICZhbXA7dmFyMSwgIjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250Pm5hbWVzcGFjZS1wcmVmaXg6PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+ZWxlbWVudC1uYW1lMSIsICI8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD5uYW1lc3BhY2UtcHJlZml4Ojxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PnR5cGUtbmFtZTEiKSkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Li4uIGVycm9yIC4uLiA8YnIgLz4NCis8Yj5pZjwvYj4mbmJzcDsoIXNvYXBfZ2V0Xzx1PjxzcGFuIGNsYXNzPSJyb21hbiI+VHlwZTI8L3NwYW4+PC91PigmYW1wO3NvYXAsICZhbXA7dmFyMiwgIjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250Pm5hbWVzcGFjZS1wcmVmaXg6PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+ZWxlbWVudC1uYW1lMiIsICI8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD5uYW1lc3BhY2UtcHJlZml4Ojxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PnR5cGUtbmFtZTEiKSkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Li4uIGVycm9yIC4uLiA8YnIgLz4NCisuLi4gPGJyIC8+DQorc29hcF9lbmRfcmVjdigmYW1wO3NvYXApOyAvLyBjaGVjayBjb25zaXN0ZW5jeSBvZiBpZC9ocmVmcyA8YnIgLz4NCitzb2FwX2Rlc3Ryb3koJmFtcDtzb2FwKTsgLy8gcmVtb3ZlIGRlc2VyaWFsaXplZCBjbGFzcyBpbnN0YW5jZXMgPGJyIC8+DQorc29hcF9lbmQoJmFtcDtzb2FwKTsgLy8gcmVtb3ZlIHRlbXBvcmFyeSBkYXRhLCBpbmNsdWRpbmcgdGhlIGRlY29kZWQgZGF0YSBvbiB0aGUgaGVhcCA8YnIgLz4NCitzb2FwX2RvbmUoJmFtcDtzb2FwKTsgLy8gZmluYWxpemUgbGFzdCB1c2Ugb2YgdGhlIGVudmlyb25tZW50DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgc3RyaW5ncyA8aT48Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD5uYW1lc3BhY2UtcHJlZml4Ojxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PnR5cGUtbmFtZTE8L2k+IGFuZA0KKzxpPjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250Pm5hbWVzcGFjZS1wcmVmaXg6PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+dHlwZS1uYW1lMjwvaT4gYXJlIHRoZSBzY2hlbWEgdHlwZXMgb2YgdGhlIGVsZW1lbnRzDQorYW5kIHNob3VsZCBtYXRjaCB0aGUgPHR0PnhzaTp0eXBlPC90dD4gYXR0cmlidXRlIG9mIHRoZSByZWNlaXZpbmcgbWVzc2FnZS4gVG8gb21pdA0KK3RoZSBtYXRjaCwgdXNlIDxpPk5VTEw8L2k+IGFzIHRoZSB0eXBlLiAgRm9yIGNsYXNzIGluc3RhbmNlcywgbWV0aG9kIGludm9jYXRpb24NCitjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGEgZnVuY3Rpb24gY2FsbCBpZiB0aGUgb2JqZWN0IGlzIGFscmVhZHkgaW5zdGFudGlhdGVkLA0KK2kuZS4gPGk+b2JqLnNvYXBfZ2V0KCZhbXA7c29hcCwgIi4uLiIsICIuLi4iKTwvaT4uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSA8aT5zb2FwX2JlZ2luPC9pPiBjYWxsIHJlc2V0cyB0aGUgZGVzZXJpYWxpemVycy4gVGhlIDxpPnNvYXBfZGVzdHJveTwvaT4NCithbmQgPGk+c29hcF9lbmQ8L2k+IGNhbGxzIHJlbW92ZSB0aGUgdGVtcG9yYXJ5IGRhdGEgc3RydWN0dXJlcyA8Yj5hbmQ8L2I+IHRoZQ0KK2RlY29kZWQgZGF0YSB0aGF0IHdhcyBwbGFjZWQgb24gdGhlIGhlYXAuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RvIHJlbW92ZSB0ZW1wb3JhcnkgZGF0YSB3aGlsZSByZXRhaW5pbmcgdGhlIGRlc2VyaWFsaXplZCBkYXRhIG9uIHRoZSBoZWFwLCB0aGUNCitmdW5jdGlvbiA8aT5zb2FwX2ZyZWU8L2k+IHNob3VsZCBiZSBjYWxsZWQgaW5zdGVhZCBvZiA8aT5zb2FwX2Rlc3Ryb3k8L2k+IGFuZA0KKzxpPnNvYXBfZW5kPC9pPi4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorT25lIGNhbGwgdG8gdGhlIDxpPnNvYXBfZ2V0X1R5cGU8L2k+IGZ1bmN0aW9uIG9mIGEgdHlwZSA8aT5UeXBlPC9pPiBzY2FucyB0aGUNCitlbnRpcmUgaW5wdXQgdG8gcHJvY2VzcyBpdHMgWE1MIGNvbnRlbnQgYW5kIHRvIGNhcHR1cmUgU09BUCAxLjEgaW5kZXBlbmRlbnQNCitlbGVtZW50cyAod2hpY2ggY29udGFpbiBtdWx0aS1yZWZlcmVuY2VkIG9iamVjdHMpLiBBcyBhIHJlc3VsdCwgPGk+c29hcC5lcnJvcjwvaT4gd2lsbCBzZXQgdG8gPGk+U09BUF9FT0Y8L2k+Lg0KK0Fsc28gc3RvcmluZw0KK211bHRpcGxlIG9iamVjdHMgaW50byBvbmUgZmlsZSB3aWxsIGZhaWwgdG8gZGVjb2RlIHRoZW0gcHJvcGVybHkgd2l0aCBtdWx0aXBsZSA8aT5zb2FwX2dldDwvaT4gY2FsbHMuIEEgd2VsbC1mb3JtZWQgWE1MIGRvY3VtZW50IHNob3VsZA0KK29ubHkgaGF2ZSBvbmUgcm9vdCBhbnl3YXksIHNvIGRvbid0IHNhdmUgbXVsdGlwbGUgb2JqZWN0cyBpbnRvIG9uZSBmaWxlLiBJZiB5b3UNCittdXN0IHNhdmUgbXVsdGlwbGUgb2JqZWN0cywgY3JlYXRlIGEgbGlua2VkIGxpc3Qgb3IgYW4gYXJyYXkgb2Ygb2JqZWN0cyBhbmQgc2F2ZQ0KK3RoZSBsaW5rZWQgbGlzdCBvciBhcnJheS4gWW91IGNvdWxkIHVzZSB0aGUgPGk+c29hcF9pbl9UeXBlPC9pPiBmdW5jdGlvbiBpbnN0ZWFkIG9mIHRoZSA8aT5zb2FwX2dldF9UeXBlPC9pPiBmdW5jdGlvbi4gVGhlIDxpPnNvYXBfaW5fVHlwZTwvaT4gZnVuY3Rpb24gcGFyc2VzIG9uZSBYTUwgZWxlbWVudCBhdCBhIHRpbWUuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1lvdSBjYW4gZGVzZXJpYWxpemUgY2xhc3MgaW5zdGFuY2VzIGZyb20gYSBzdHJlYW0gYXMgZm9sbG93czoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorbXlDbGFzcyBvYmo7IDxiciAvPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwIHNvYXA7IDxiciAvPg0KK3NvYXBfaW5pdCgmYW1wO3NvYXApOyAvLyBpbml0aWFsaXplIDxiciAvPg0KK3NvYXBfYmVnaW4oJmFtcDtzb2FwKTsgLy8gYmVnaW4gbmV3IGRlY29kaW5nIHBoYXNlIDxiciAvPg0KK3NvYXAuaXMgPSBjaW47IC8vIHJlYWQgZnJvbSBjaW4gPGJyIC8+DQorc29hcF9iZWdpbl9yZWN2KCZhbXA7c29hcCk7IC8vIGlmIEhUVFAgaGVhZGVyIGlzIHByZXNlbnQsIHBhcnNlIGl0IDxiciAvPg0KKzxiPmlmPC9iPiZuYnNwOyghb2JqLmdldCgmYW1wO3NvYXAsICJteUNsYXNzIiwgTlVMTCkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Li4uIGVycm9yIC4uLiA8YnIgLz4NCitzb2FwX2VuZF9yZWN2KCZhbXA7c29hcCk7IC8vIGNoZWNrIGNvbnNpc3RlbmN5IG9mIGlkL2hyZWZzIDxiciAvPg0KKy4uLiA8YnIgLz4NCitzb2FwX2Rlc3Ryb3koJmFtcDtzb2FwKTsgLy8gcmVtb3ZlIGRlc2VyaWFsaXplZCBjbGFzcyBpbnN0YW5jZXMgPGJyIC8+DQorc29hcF9lbmQoJmFtcDtzb2FwKTsgLy8gcmVtb3ZlIHRlbXBvcmFyeSBkYXRhLCBpbmNsdWRpbmcgdGhlIGRlY29kZWQgZGF0YSBvbiB0aGUgaGVhcCA8YnIgLz4NCitzb2FwX2RvbmUoJmFtcDtzb2FwKTsgLy8gZmluYWxpemUgbGFzdCB1c2Ugb2YgdGhlIGVudmlyb25tZW50DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitXaGVuIHlvdSBkZWNsYXJlIGEgc29hcCBzdHJ1Y3QgcG9pbnRlciBhcyBhIGRhdGEgbWVtYmVyIGluIGEgY2xhc3MsIHlvdSBjYW4gb3ZlcmxvYWQgdGhlIDx0dD4mZ3Q7Jmd0OzwvdHQ+IG9wZXJhdG9yIHRvIHBhcnNlIGFuZCBkZXNlcmlhbGl6ZSBhIGNsYXNzIGluc3RhbmNlIGZyb20gYSBzdHJlYW06DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KK2lzdHJlYW0gJmFtcDtvcGVyYXRvcjx0dD4mZ3Q7Jmd0OzwvdHQ+KGlzdHJlYW0gJmFtcDtpLCBteUNsYXNzICZhbXA7ZSkgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoIWUuc29hcCkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Li4uIGVycm9yOiBuZWVkIHNvYXAgc3RydWN0IHRvIGRlc2VyaWFsaXplIChjb3VsZCB1c2UgZ2xvYmFsIHN0cnVjdCkuLi4gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7aXN0cmVhbSAqaXMgPSBlLnNvYXA8dHQ+LSZndDs8L3R0PmlzOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtlLnNvYXA8dHQ+LSZndDs8L3R0PmlzID0gJmFtcDtpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoc29hcF9iZWdpbl9yZWN2KGUuc29hcCkgPHR0Pnx8PC90dD4gZS5pbihlLnNvYXAsIE5VTEwsIE5VTEwpIDx0dD58fDwvdHQ+IHNvYXBfZW5kX3JlY3YoZS5zb2FwKSkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Li4uIGVycm9yIC4uLiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtlLnNvYXA8dHQ+LSZndDs8L3R0PmlzID0gaXM7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDtpOyA8YnIgLz4NCit9DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCQkgICAgICA8aDQ+PGEgbmFtZT0idHRoX3NFYzcuNS4zIj4NCis3LjUuMzwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+RXhhbXBsZTwvZm9udD48L2g0PjxhIG5hbWU9InNlYzpleGFtcGxlOSI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitBcyBhbiBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIGRhdGEgdHlwZSBkZWNsYXJhdGlvbnM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vIENvbnRlbnRzIG9mIGZpbGUgInBlcnNvbi5oIjogPGJyIC8+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyp4c2RfX3N0cmluZzsgPGJyIC8+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyp4c2RfX05hbWU7IDxiciAvPg0KKzxiPnR5cGVkZWY8L2I+Jm5ic3A7PGI+dW5zaWduZWQ8L2I+Jm5ic3A7PGI+aW50PC9iPiZuYnNwO3hzZF9fdW5zaWduZWRJbnQ7IDxiciAvPg0KKzxiPmVudW08L2I+Jm5ic3A7bnNfX0dlbmRlciB7bWFsZSwgZmVtYWxlfTsgPGJyIC8+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7bnNfX0FkZHJlc3MgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5wdWJsaWM8L2I+OiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt4c2RfX3N0cmluZyBzdHJlZXQ7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3hzZF9fdW5zaWduZWRJbnQgbnVtYmVyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt4c2RfX3N0cmluZyBjaXR5OyA8YnIgLz4NCit9OyA8YnIgLz4NCis8Yj5jbGFzczwvYj4mbmJzcDtuc19fUGVyc29uIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cHVibGljPC9iPjogPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eHNkX19OYW1lIG5hbWU7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmVudW08L2I+Jm5ic3A7bnNfX0dlbmRlciBnZW5kZXI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO25zX19BZGRyZXNzIGFkZHJlc3M7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO25zX19QZXJzb24gKm1vdGhlcjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7bnNfX1BlcnNvbiAqZmF0aGVyOyA8YnIgLz4NCit9Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIGZvbGxvd2luZyBwcm9ncmFtIHVzZXMgdGhlc2UgZGF0YSB0eXBlcyB0byB3cml0ZSB0byBzdGFuZGFyZCBvdXRwdXQgYSBkYXRhIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBkYXRhIG9mIGEgcGVyc29uIG5hbWVkICJKb2huIiBsaXZpbmcgYXQgRG93bmluZyBzdC4gMTAgaW4gTG9uZGVuLiBIZSBoYXMgYSBtb3RoZXINCisiTWFyeSIgYW5kIGEgZmF0aGVyICJTdHVhcnQiLiBBZnRlciBpbml0aWFsaXphdGlvbiwgdGhlIGNsYXNzIGluc3RhbmNlIGZvciAiSm9obiIgaXMgc2VyaWFsaXplZCBhbmQgZW5jb2RlZCBpbiBYTUwgdG8gdGhlDQorc3RhbmRhcmQgb3V0cHV0IHN0cmVhbSB1c2luZyBnemlwIGNvbXByZXNzaW9uIChyZXF1aXJlcyB0aGUgWmxpYiBsaWJyYXJ5LCBjb21waWxlIHNvdXJjZXMgd2l0aCAtRFdJVEhfR1pJUCk6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vIENvbnRlbnRzIG9mIGZpbGUgInBlcnNvbi5jcHAiOiA8YnIgLz4NCisjaW5jbHVkZSAic29hcEguaCIgPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO21haW4oKSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwIHNvYXA7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO25zX19QZXJzb24gbW90aGVyLCBmYXRoZXIsIGpvaG47IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO21vdGhlci5uYW1lID0gPHR0PiJNYXJ5IjwvdHQ+OyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDttb3RoZXIuZ2VuZGVyID0gZmVtYWxlOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDttb3RoZXIuYWRkcmVzcy5zdHJlZXQgPSA8dHQ+IkRvd25pbmcmbmJzcDtzdC4iPC90dD47IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO21vdGhlci5hZGRyZXNzLm51bWJlciA9IDEwOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDttb3RoZXIuYWRkcmVzcy5jaXR5ID0gPHR0PiJMb25kb24iPC90dD47IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO21vdGhlci5tb3RoZXIgPSBOVUxMOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDttb3RoZXIuZmF0aGVyID0gTlVMTDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7ZmF0aGVyLm5hbWUgPSA8dHQ+IlN0dWFydCI8L3R0PjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7ZmF0aGVyLmdlbmRlciA9IG1hbGU7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO2ZhdGhlci5hZGRyZXNzLnN0cmVldCA9IDx0dD4iTWFpbiZuYnNwO3N0LiI8L3R0PjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7ZmF0aGVyLmFkZHJlc3MubnVtYmVyID0gNTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7ZmF0aGVyLmFkZHJlc3MuY2l0eSA9IDx0dD4iTG9uZG9uIjwvdHQ+OyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtmYXRoZXIubW90aGVyID0gTlVMTDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7ZmF0aGVyLmZhdGhlciA9IE5VTEw7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO2pvaG4ubmFtZSA9IDx0dD4iSm9obiI8L3R0PjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7am9obi5nZW5kZXIgPSBtYWxlOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtqb2huLmFkZHJlc3MgPSBtb3RoZXIuYWRkcmVzczsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7am9obi5tb3RoZXIgPSAmYW1wO21vdGhlcjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7am9obi5mYXRoZXIgPSAmYW1wO2ZhdGhlcjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9pbml0KCZhbXA7c29hcCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfb21vZGUoJmFtcDtzb2FwLCBTT0FQX0VOQ19aTElCIHwgU09BUF9YTUxfR1JBUEgpOyAvLyBzZWUmbmJzcDs8YSBocmVmPSIjc2VjOmZsYWdzIj44LjEyPC9hPiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2JlZ2luKCZhbXA7c29hcCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfYmVnaW5fc2VuZCgmYW1wO3NvYXApOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtqb2huLnNvYXBfc2VyaWFsaXplKCZhbXA7c29hcCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO2pvaG4uc29hcF9wdXQoJmFtcDtzb2FwLCA8dHQ+ImpvaG5uaWUiPC90dD4sIE5VTEwpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2VuZF9zZW5kKCZhbXA7c29hcCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfZW5kKCZhbXA7c29hcCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfZG9uZSgmYW1wO3NvYXApOyA8YnIgLz4NCit9IDxiciAvPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtOYW1lc3BhY2UgbmFtZXNwYWNlc1tdID0gPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7IlNPQVAtRU5WIiwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIn0sIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3siU09BUC1FTkMiLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyJ9LCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7InhzaSIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSJ9LCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7InhzZCIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSJ9LCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7Im5zIiwgInVybjpwZXJzb24ifSwgLy8gTmFtZXNwYWNlIFVSSSBvZiB0aGUgIlBlcnNvbiIgZGF0YSB0eXBlIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3tOVUxMLCBOVUxMfSA8YnIgLz4NCit9Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIGhlYWRlciBmaWxlIGlzIHByb2Nlc3NlZCBhbmQgdGhlIGFwcGxpY2F0aW9uIGNvbXBpbGVkIG9uIExpbnV4L1VuaXggd2l0aDoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNEMEQwRDAiPjx0cj48dGQ+PHNwYW4gY2xhc3M9InJvbWFuIj4NCis8aT5zb2FwY3BwMiBwZXJzb24uaDwvaT4gPGJyIC8+DQorPGk+ZysrIC1EV0lUSF9HWklQIC1vIHBlcnNvbiBwZXJzb24uY3BwIHNvYXBDLmNwcCBzdGRzb2FwMi5jcHAgLWxzb2NrZXQgLWx4bmV0IC1sbnNsIC1sejwvaT4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9zcGFuPg0KKyhEZXBlbmRpbmcgb24geW91ciBzeXN0ZW0gY29uZmlndXJhdGlvbiwgdGhlIGxpYnJhcmllcyA8aT5saWJzb2NrZXQuYTwvaT4sDQorPGk+bGlieG5ldC5hPC9pPiwgPGk+bGlibnNsLmE8L2k+DQorYXJlIHJlcXVpcmVkLiBDb21waWxpbmcgb24gTGludXggdHlwaWNhbGx5IGRvZXMgbm90IHJlcXVpcmUgdGhlIGluY2x1c2lvbiBvZiB0aG9zZQ0KK2xpYnJhcmllcy4pDQorU2VlJm5ic3A7PGEgaHJlZj0iI3NlYzpjb21wcmVzc2lvbiI+MTguMjU8L2E+IGZvciBkZXRhaWxzIG9uIGNvbXByZXNzaW9uIHdpdGggZ1NPQVAuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1J1bm5pbmcgdGhlIDxpPnBlcnNvbjwvaT4gYXBwbGljYXRpb24gcmVzdWx0cyBpbiB0aGUgY29tcHJlc3NlZCBYTUwgb3V0cHV0Og0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwQjBEMCI+PHRyPjx0ZD48dHQ+DQorJmx0O2pvaG5uaWUgeHNpOnR5cGU9Im5zOlBlcnNvbiIgeG1sbnM6U09BUC1FTlY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt4bWxuczpTT0FQLUVOQz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3htbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3htbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3htbG5zOm5zPSJ1cm46cGVyc29uIiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtTT0FQLUVOVjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyImIzYyOyA8YnIgLz4NCismbHQ7bmFtZSB4c2k6dHlwZT0ieHNkOk5hbWUiJiM2MjtKb2huJmx0Oy9uYW1lJiM2MjsgPGJyIC8+DQorJmx0O2dlbmRlciB4c2k6dHlwZT0ibnM6R2VuZGVyIiYjNjI7bWFsZSZsdDsvZ2VuZGVyJiM2MjsgPGJyIC8+DQorJmx0O2FkZHJlc3MgeHNpOnR5cGU9Im5zOkFkZHJlc3MiJiM2MjsgPGJyIC8+DQorJmx0O3N0cmVldCBpZD0iMyIgeHNpOnR5cGU9InhzZDpzdHJpbmciJiM2MjtEb3dsaW5nIHN0LiZsdDsvc3RyZWV0JiM2MjsgPGJyIC8+DQorJmx0O251bWJlciB4c2k6dHlwZT0idW5zaWduZWRJbnQiJiM2MjsxMCZsdDsvbnVtYmVyJiM2MjsgPGJyIC8+DQorJmx0O2NpdHkgaWQ9IjQiIHhzaTp0eXBlPSJ4c2Q6c3RyaW5nIiYjNjI7TG9uZG9uJmx0Oy9jaXR5JiM2MjsgPGJyIC8+DQorJmx0Oy9hZGRyZXNzJiM2MjsgPGJyIC8+DQorJmx0O21vdGhlciB4c2k6dHlwZT0ibnM6UGVyc29uIiYjNjI7IDxiciAvPg0KKyZsdDtuYW1lIHhzaTp0eXBlPSJ4c2Q6TmFtZSImIzYyO01hcnkmbHQ7L25hbWUmIzYyOyA8YnIgLz4NCismbHQ7Z2VuZGVyIHhzaTp0eXBlPSJuczpHZW5kZXIiJiM2MjtmZW1hbGUmbHQ7L2dlbmRlciYjNjI7IDxiciAvPg0KKyZsdDthZGRyZXNzIHhzaTp0eXBlPSJuczpBZGRyZXNzIiYjNjI7IDxiciAvPg0KKyZsdDtzdHJlZXQgaHJlZj0iIzMiLyYjNjI7IDxiciAvPg0KKyZsdDtudW1iZXIgeHNpOnR5cGU9InVuc2lnbmVkSW50IiYjNjI7NSZsdDsvbnVtYmVyJiM2MjsgPGJyIC8+DQorJmx0O2NpdHkgaHJlZj0iIzQiLyYjNjI7IDxiciAvPg0KKyZsdDsvYWRkcmVzcyYjNjI7IDxiciAvPg0KKyZsdDsvbW90aGVyJiM2MjsgPGJyIC8+DQorJmx0O2ZhdGhlciB4c2k6dHlwZT0ibnM6UGVyc29uIiYjNjI7IDxiciAvPg0KKyZsdDtuYW1lIHhzaTp0eXBlPSJ4c2Q6TmFtZSImIzYyO1N0dWFydCZsdDsvbmFtZSYjNjI7IDxiciAvPg0KKyZsdDtnZW5kZXIgeHNpOnR5cGU9Im5zOkdlbmRlciImIzYyO21hbGUmbHQ7L2dlbmRlciYjNjI7IDxiciAvPg0KKyZsdDthZGRyZXNzIHhzaTp0eXBlPSJuczpBZGRyZXNzIiYjNjI7IDxiciAvPg0KKyZsdDtzdHJlZXQgeHNpOnR5cGU9InhzZDpzdHJpbmciJiM2MjtNYWluIHN0LiZsdDsvc3RyZWV0JiM2MjsgPGJyIC8+DQorJmx0O251bWJlciB4c2k6dHlwZT0idW5zaWduZWRJbnQiJiM2MjsxMyZsdDsvbnVtYmVyJiM2MjsgPGJyIC8+DQorJmx0O2NpdHkgaHJlZj0iIzQiLyYjNjI7IDxiciAvPg0KKyZsdDsvYWRkcmVzcyYjNjI7IDxiciAvPg0KKyZsdDsvZmF0aGVyJiM2MjsgPGJyIC8+DQorJmx0Oy9qb2hubmllJiM2MjsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC90dD4NCitUaGUgZm9sbG93aW5nIHByb2dyYW0gZnJhZ21lbnQgZGVjb2RlcyB0aGlzIGNvbnRlbnQgZnJvbSBzdGFuZGFyZCBpbnB1dCBhbmQgcmVjb25zdHJ1Y3RzIHRoZSBvcmlnaW5hbCBkYXRhIHN0cnVjdHVyZSBvbiB0aGUgaGVhcDoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorI2luY2x1ZGUgInNvYXBILmgiIDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDttYWluKCkgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCBzb2FwOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtuc19fUGVyc29uICptb3RoZXIsICpmYXRoZXIsICpqb2huID0gTlVMTDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9pbml0KCZhbXA7c29hcCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfaW1vZGUoJmFtcDtzb2FwLCBTT0FQX0VOQ19aTElCKTsgLy8gb3B0aW9uYWw6IGd6aXAgaXMgZGV0ZWN0ZWQgYXV0b21hdGljYWxseSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2JlZ2luKCZhbXA7c29hcCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfYmVnaW5fcmVjdigmYW1wO3NvYXApOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoc29hcF9nZXRfbnNfX1BlcnNvbigmYW1wO3NvYXAsIGpvaG4sICJqb2hubmllIiwgTlVMTCkgPT0gTlVMTCkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Li4uIGVycm9yIC4uLiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDttb3RoZXIgPSBqb2huPHR0Pi0mZ3Q7PC90dD5tb3RoZXI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO2ZhdGhlciA9IGpvaG48dHQ+LSZndDs8L3R0PmZhdGhlcjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Li4uIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfZW5kX3JlY3YoJmFtcDtzb2FwKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9mcmVlKCZhbXA7c29hcCk7IC8vIENsZWFuIHVwIHRlbXBvcmFyeSBkYXRhIGJ1dCBrZWVwIGRlc2VyaWFsaXplZCBkYXRhIDxiciAvPg0KK30gPGJyIC8+DQorPGI+c3RydWN0PC9iPiZuYnNwO05hbWVzcGFjZSBuYW1lc3BhY2VzW10gPSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3siU09BUC1FTlYiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8ifSwgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyJTT0FQLUVOQyIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIn0sIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3sieHNpIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIn0sIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3sieHNkIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIn0sIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3sibnMiLCAidXJuOnBlcnNvbiJ9LCAvLyBOYW1lc3BhY2UgVVJJIG9mIHRoZSAiUGVyc29uIiBkYXRhIHR5cGUgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7e05VTEwsIE5VTEx9IDxiciAvPg0KK307DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitJdCBpcyBSRVFVSVJFRCB0byBlaXRoZXIgcGFzcyA8aT5OVUxMPC9pPiB0byB0aGUgPGk+c29hcF9nZXQ8L2k+IHJvdXRpbmUsIG9yIGEgdmFsaWQgcG9pbnRlciB0byBhIGRhdGEgc3RydWN0dXJlIHRoYXQgY2FuDQoraG9sZCB0aGUgZGVjb2RlZCBjb250ZW50LiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgZXhwbGljaXRseSBwYXNzZXMgPGk+TlVMTDwvaT46DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKyZuYnNwOyZuYnNwOyZuYnNwO2pvaG4gPSBzb2FwX2dldF9uc19fUGVyc29uKCZhbXA7c29hcCwgTlVMTCwgImpvaG5uaWUiLCBOVUxMKTsgPGJyIC8+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitOb3RlOiB0aGUgc2Vjb25kIDxpPk5VTEw8L2k+IHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhhdCB0aGUgc2NoZW1hIHR5cGUgYXR0cmlidXRlIG9mIHRoZSByZWNlaXZpbmcgbWVzc2FnZSBjYW4gYmUgaWdub3JlZC4NCitUaGUgZGVzZXJpYWxpemVyIHN0b3JlcyB0aGUgU09BUCBjb250ZW50cyBvbiB0aGUgaGVhcCwgYW5kIHJldHVybnMgdGhlIGFkZHJlc3MuIFRoZSBhbGxvY2F0ZWQgc3RvcmFnZSBpcyByZWxlYXNlZCB3aXRoIHRoZQ0KKzxpPnNvYXBfZW5kPC9pPiBjYWxsLCB3aGljaCByZW1vdmVzIGFsbCB0ZW1wb3JhcnkgYW5kIGRlc2VyaWFsaXplZCBkYXRhIGZyb20gdGhlIGhlYXAsIG9yIHdpdGggdGhlIDxpPnNvYXBfZnJlZTwvaT4gY2FsbCwgd2hpY2ggcmVtb3ZlcyBhbGwNCit0ZW1wb3JhcnkgZGF0YSBvbmx5Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitBbHRlcm5hdGl2ZWx5LCB0aGUgWE1MIGNvbnRlbnQgY2FuIGJlIGRlY29kZWQgd2l0aGluIGFuIGV4aXN0aW5nIGFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZS4NCitUaGUgZm9sbG93aW5nIHByb2dyYW0gZnJhZ21lbnQgZGVjb2RlcyB0aGUgU09BUCBjb250ZW50IGluIGEgPGk+PGI+c3RydWN0PC9iPiZuYnNwO25zX19QZXJzb248L2k+IGFsbG9jYXRlZCBvbiB0aGUgc3RhY2s6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKyNpbmNsdWRlICJzb2FwSC5oIiA8YnIgLz4NCittYWluKCkgPGJyIC8+DQorezxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwIHNvYXA7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO25zX19QZXJzb24gKm1vdGhlciwgKmZhdGhlciwgam9objsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9pbml0KCZhbXA7c29hcCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfaW1vZGUoJmFtcDtzb2FwLCBTT0FQX0VOQ19aTElCKTsgLy8gb3B0aW9uYWwgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9iZWdpbigmYW1wO3NvYXApOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2JlZ2luX3JlY3YoJmFtcDtzb2FwKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9kZWZhdWx0X25zX19QZXJzb24oJmFtcDtzb2FwLCAmYW1wO2pvaG4pOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoc29hcF9nZXRfbnNfX1BlcnNvbigmYW1wO3NvYXAsICZhbXA7am9obiwgImpvaG5uaWUiLCBOVUxMKSA9PSBOVUxMKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsuLi4gZXJyb3IgLi4uIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOy4uLiA8YnIgLz4NCit9IDxiciAvPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtOYW1lc3BhY2UgbmFtZXNwYWNlc1tdID0gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Li4uDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitOb3RlIHRoZSB1c2Ugb2YgPGk+c29hcF9kZWZhdWx0X25zX19QZXJzb248L2k+LiBUaGlzIHJvdXRpbmUgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBnU09BUCBzdHViIGFuZCBza2VsZXRvbiBjb21waWxlciBhbmQgYXNzaWducyBkZWZhdWx0DQordmFsdWVzIHRvIHRoZSBmaWVsZHMgb2YgPGk+am9objwvaT4uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkgICAgICA8aDQ+PGEgbmFtZT0idHRoX3NFYzcuNS40Ij4NCis3LjUuNDwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+U2VyaWFsaXppbmcgYW5kIERlc2VyaWFsaXppbmcgQ2xhc3MgSW5zdGFuY2VzIHRvIFN0cmVhbXM8L2ZvbnQ+PC9oND4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorQysrIGFwcGxpY2F0aW9ucyBjYW4gZGVmaW5lIGFwcHJvcHJpYXRlIHN0cmVhbSBvcGVyYXRpb25zIG9uIG9iamVjdHMgZm9yIChkZSlzZXJpYWxpemF0aW9uIG9mIG9iamVjdHMgb24gc3RyZWFtcy4NCitUaGlzIGlzIGJlc3QgaWxsdXN0cmF0ZWQgd2l0aCBhbiBleGFtcGxlLg0KK0NvbnNpZGVyIHRoZSBjbGFzcw0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5jbGFzczwvYj4mbmJzcDtuc19fcGVyc29uIDxiciAvPg0KK3sgPGI+cHVibGljPC9iPjogPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqbmFtZTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXA7IC8vIHdlIG5lZWQgdGhpcywgc2VlIGJlbG93IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO25zX19wZXJzb24oKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7fm5zX19wZXJzb24oKTsgPGJyIC8+DQorfTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoZSA8aT48Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcDwvaT4gbWVtYmVyIGlzIHVzZWQgdG8gYmluZCB0aGUgaW5zdGFuY2VzIHRvIGEgZ1NPQVANCitlbnZpcm9ubWVudCBmb3IgKGRlKXNlcmlhbGl6YXRpb24uICBXZSB1c2UgdGhlIGdTT0FQIGNvbXBpbGVyIGZyb20gdGhlIGNvbW1hbmQNCitwcm9tcHQgdG8gZ2VuZXJhdGUgdGhlIGNsYXNzIChkZSlzZXJpYWxpemVycyAoYXNzdW1pbmcgdGhhdCA8aT5wZXJzb24uaDwvaT4NCitjb250YWlucyB0aGUgY2xhc3MgZGVjbGFyYXRpb24pOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKzxpPnNvYXBjcHAyIHBlcnNvbi5oPC9pPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQorZ1NPQVAgZ2VuZXJhdGVzIHRoZSAoZGUpc2VyaWFsaXplcnMgYW5kIGFuIGluc3RhbnRpYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBjbGFzcw0KKzxpPnNvYXBfbmV3X25zX19wZXJzb24oPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIDxiPmludDwvYj4mbmJzcDthcnJheSk8L2k+IHRvIGluc3RhbnRpYXRlDQorb25lIG9yIG1vcmUgb2JqZWN0cyBhbmQgYXNzb2NpYXRlIHRoZW0gd2l0aCBhIGdTT0FQIGVudmlyb25tZW50LiAgVGhlDQorPGk+YXJyYXk8L2k+IHBhcmFtZXRlciBzaG91bGQgYmUgLTEgdG8gaW5zdGFudGlhdGUgb25lIG9iamVjdCBvciBzaG91bGQgYmUgdGhlDQorbnVtYmVyIG9mIG9iamVjdHMgdG8gaW5zdGFudGlhdGUgYXMgYW4gYXJyYXkgb2Ygb2JqZWN0cy4NCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorI2luY2x1ZGUgInNvYXBILmgiIDxiciAvPg0KKyNpbmNsdWRlICJucy5uc21hcCIgPGJyIC8+DQorLi4uIDxiciAvPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwID0gc29hcF9uZXcoKTsgPGJyIC8+DQorbnNfX3BlcnNvbiAqcCA9IHNvYXBfbmV3X25zX19wZXJzb24oc29hcCwgLTEpOyA8YnIgLz4NCisuLi4gPGJyIC8+DQorY291dCAgJmx0OyZsdDsgIHA7IC8vIHNlcmlhbGl6ZSBwIGluIFhNTCA8YnIgLz4NCisuLi4gPGJyIC8+DQoraW4gICZndDsmZ3Q7ICBwOyAvLyBwYXJzZSBYTUwgYW5kIGRlc2VyaWFsaXplIHAgPGJyIC8+DQorLi4uIDxiciAvPg0KK3NvYXBfZGVzdHJveShzb2FwKTsgLy8gZGVsZXRlcyBwIHRvbyA8YnIgLz4NCitzb2FwX2VuZChzb2FwKTsgPGJyIC8+DQorc29hcF9kb25lKHNvYXApOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIHN0cmVhbSBvcGVyYXRpb25zIGFyZSBpbXBsZW1lbnRlZCBhcyBmb2xsb3dzDQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KK29zdHJlYW0gJmFtcDs8Yj5vcGVyYXRvcjwvYj48dHQ+Jmx0OyZsdDs8L3R0Pihvc3RyZWFtICZhbXA7bywgPGI+Y29uc3Q8L2I+Jm5ic3A7bnNfX3BlcnNvbiAmYW1wO3ApIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KCFwPHR0Pi0mZ3Q7PC90dD5zb2FwKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7bzsgLy8gbmVlZCBhIGdTT0FQIGVudmlyb25tZW50IHRvIHNlcmlhbGl6ZSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtwLnNvYXA8dHQ+LSZndDs8L3R0Pm9zID0gJmFtcDtvOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX29tb2RlKHAuc29hcCwgU09BUF9YTUxfR1JBUEgpOyAvLyBYTUwgdHJlZSBvciBncmFwaCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtwPHR0Pi0mZ3Q7PC90dD5zb2FwX3NlcmlhbGl6ZShwLnNvYXApOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2JlZ2luX3NlbmQocC5zb2FwKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KHA8dHQ+LSZndDs8L3R0PnNvYXBfcHV0KHAuc29hcCwgInBlcnNvbiIsIE5VTEwpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB8ICB8ICBzb2FwX2VuZF9zZW5kKHAuc29hcCkpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzsgLy8gaGFuZGxlIEkvTyBlcnJvciA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7bzsgPGJyIC8+DQorfSA8YnIgLz4NCitpc3RyZWFtICZhbXA7PGI+b3BlcmF0b3I8L2I+PHR0PiZndDsmZ3Q7PC90dD4oaXN0cmVhbSAmYW1wO2ksIG5zX19wZXJzb24gJmFtcDtwKSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyghcDx0dD4tJmd0OzwvdHQ+c29hcCkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cmV0dXJuPC9iPiZuYnNwO287IC8vIG5lZWQgYSBnU09BUCBlbnZpcm9ubWVudCB0byBwYXJzZSBYTUwgYW5kIGRlc2VyaWFsaXplIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3Auc29hcDx0dD4tJmd0OzwvdHQ+aXMgPSAmYW1wO2k7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyhzb2FwX2JlZ2luX3JlY3YocC5zb2FwKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgfCAgfCAgcDx0dD4tJmd0OzwvdHQ+c29hcF9pbihwLnNvYXAsIE5VTEwsIE5VTEwpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB8ICB8ICBzb2FwX2VuZF9yZWN2KHAuc29hcCkpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzsgLy8gaGFuZGxlIEkvTyBlcnJvciA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7aTsgPGJyIC8+DQorfQ0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkJICAgICAgPGg0PjxhIG5hbWU9InR0aF9zRWM3LjUuNSI+DQorNy41LjU8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPkhvdyB0byBTcGVjaWZ5IERlZmF1bHQgVmFsdWVzIGZvciBPbWl0dGVkIERhdGE8L2ZvbnQ+PC9oND4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIGdTT0FQIGNvbXBpbGVyIGdlbmVyYXRlcyA8aT5zb2FwX2RlZmF1bHQ8L2k+IGZ1bmN0aW9ucyBmb3IgYWxsIGRhdGEgdHlwZXMuICBUaGUgZGVmYXVsdCB2YWx1ZXMgb2YgdGhlIHByaW1pdGl2ZSB0eXBlcyBjYW4gYmUNCitlYXNpbHkgY2hhbmdlZCBieSBkZWZpbmluZyBhbnkgb2YgdGhlIGZvbGxvd2luZyBtYWNyb3MgaW4gdGhlIDxpPnN0ZHNvYXAyLmg8L2k+IGZpbGU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKyNkZWZpbmUgU09BUF9ERUZBVUxUX2Jvb2wgPGJyIC8+DQorI2RlZmluZSBTT0FQX0RFRkFVTFRfYnl0ZSA8YnIgLz4NCisjZGVmaW5lIFNPQVBfREVGQVVMVF9kb3VibGUgPGJyIC8+DQorI2RlZmluZSBTT0FQX0RFRkFVTFRfZmxvYXQgPGJyIC8+DQorI2RlZmluZSBTT0FQX0RFRkFVTFRfaW50IDxiciAvPg0KKyNkZWZpbmUgU09BUF9ERUZBVUxUX2xvbmcgPGJyIC8+DQorI2RlZmluZSBTT0FQX0RFRkFVTFRfTE9ORzY0IDxiciAvPg0KKyNkZWZpbmUgU09BUF9ERUZBVUxUX3Nob3J0IDxiciAvPg0KKyNkZWZpbmUgU09BUF9ERUZBVUxUX3N0cmluZyA8YnIgLz4NCisjZGVmaW5lIFNPQVBfREVGQVVMVF90aW1lIDxiciAvPg0KKyNkZWZpbmUgU09BUF9ERUZBVUxUX3Vuc2lnbmVkQnl0ZSA8YnIgLz4NCisjZGVmaW5lIFNPQVBfREVGQVVMVF91bnNpZ25lZEludCA8YnIgLz4NCisjZGVmaW5lIFNPQVBfREVGQVVMVF91bnNpZ25lZExvbmcgPGJyIC8+DQorI2RlZmluZSBTT0FQX0RFRkFVTFRfdW5zaWduZWRMT05HNjQgPGJyIC8+DQorI2RlZmluZSBTT0FQX0RFRkFVTFRfdW5zaWduZWRTaG9ydCA8YnIgLz4NCisjZGVmaW5lIFNPQVBfREVGQVVMVF93c3RyaW5nDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitJbnN0ZWFkIG9mIGFkZGluZyB0aGVzZSB0byA8aT5zdGRzb2FwMi5oPC9pPiwgeW91IGNhbiBhbHNvIGNvbXBpbGUgd2l0aCBvcHRpb24gPGk+LURXSVRIX1NPQVBERUZTX0g8L2k+IGFuZCBpbmNsdWRlIHlvdXINCitkZWZpbml0aW9ucyBpbiBmaWxlIDxpPnVzZXJkZWZzLmg8L2k+Lg0KK1RoZSBhYnNlbmNlIG9mIGEgZGF0YSB2YWx1ZSBpbiBhIHJlY2VpdmluZyBTT0FQIG1lc3NhZ2Ugd2lsbCByZXN1bHQgaW4gdGhlIGFzc2lnbm1lbnQgb2YgYSBkZWZhdWx0IHZhbHVlIHRvIGEgcHJpbWl0aXZlIHR5cGUgdXBvbg0KK2Rlc2VyaWFsaXphdGlvbi4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorRGVmYXVsdCB2YWx1ZXMgY2FuIGFsc28gYmUgYXNzaWduZWQgdG8gaW5kaXZpZHVhbCA8aT48Yj5zdHJ1Y3Q8L2I+PC9pPiBhbmQgPGk+PGI+Y2xhc3M8L2I+PC9pPiBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUuIEZvciBleGFtcGxlLA0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7TXlSZWNvcmQgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypuYW1lID0gIlVua25vd24iOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7dmFsdWUgPSA5OTk5OyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5lbnVtPC9iPiZuYnNwO1N0YXR1cyB7IGFjdGl2ZSwgcGFzc2l2ZSB9IHN0YXR1cyA9IHBhc3NpdmU7IDxiciAvPg0KK30NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK0RlZmF1bHQgdmFsdWVzIGFyZSBhc3NpZ25lZCB0byB0aGUgZmllbGRzIG9uIHJlY2VpdmluZyBhIFNPQVAvWE1MIG1lc3NhZ2UgaW4gd2hpY2ggdGhlIGRhdGEgdmFsdWVzIGFyZSBhYnNlbnQuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0JlY2F1c2UgbWV0aG9kIHJlcXVlc3RzIGFuZCByZXNwb25zZXMgYXJlIGVzc2VudGlhbGx5IHN0cnVjdHMsIGRlZmF1bHQgdmFsdWVzIGNhbiBhbHNvIGJlIGFzc2lnbmVkIHRvIG1ldGhvZCBwYXJhbWV0ZXJzLiBUaGUNCitkZWZhdWx0IHBhcmFtZXRlciB2YWx1ZXMgZG8gbm90IGNvbnRyb2wgdGhlIHBhcmFtZXRlcml6YXRpb24gb2YgQy9DKysgZnVuY3Rpb24gY2FsbHMsIGkuZS4gYWxsIGFjdHVhbCBwYXJhbWV0ZXJzIG11c3QgYmUgcHJlc2VudA0KK3doZW4gY2FsbGluZyBhIGZ1bmN0aW9uLiBUaGUgZGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWVzIGFyZSB1c2VkIGluIGNhc2UgYW4gaW5ib3VuZCByZXF1ZXN0IG9yIHJlc3BvbnNlIG1lc3NhZ2UgbGFja3MgdGhlIFhNTA0KK2VsZW1lbnRzIHdpdGggcGFyYW1ldGVyIHZhbHVlcy4gRm9yIGV4YW1wbGUsIGEgV2ViIHNlcnZpY2UgY2FuIHVzZSBkZWZhdWx0IHZhbHVlcyB0byBmaWxsLWluIGFic2VudCBwYXJhbWV0ZXJzIGluIGENCitTT0FQL1hNTCByZXF1ZXN0Og0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5pbnQ8L2I+Jm5ic3A7bnNfX2xvZ2luKDxiPmNoYXI8L2I+Jm5ic3A7KnVpZCA9ICJhbm9ueW1vdXMiLCA8Yj5jaGFyPC9iPiZuYnNwOypwd2QgPSAiZ3Vlc3QiLCA8Yj5ib29sPC9iPiZuYnNwO2dyYW50ZWQpOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorV2hlbiB0aGUgcmVxdWVzdCBtZXNzYWdlIGxhY2tzIHVpZCBhbmQgcHdkIHBhcmFtZXRlcnMsIGUuZy46DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBCMEQwIj48dHI+PHRkPjx0dD4NCismbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/JiM2MjsgPGJyIC8+DQorJmx0O1NPQVAtRU5WOkVudmVsb3BlIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3htbG5zOlNPQVAtRU5WPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eG1sbnM6U09BUC1FTkM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt4bWxuczpucz0iaHR0cDovL3RlbXB1cmkub3JnIiYjNjI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtTT0FQLUVOVjpCb2R5IGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiYjNjI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtuczpsb2dpbiYjNjI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDsvbnM6bG9naW4mIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbHQ7L1NPQVAtRU5WOkJvZHkmIzYyOyA8YnIgLz4NCismbHQ7L1NPQVAtRU5WOkVudmVsb3BlJiM2MjsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC90dD4NCit0aGVuIHRoZSBzZXJ2aWNlIHVzZXMgdGhlIGRlZmF1bHQgdmFsdWVzLg0KK0luIGFkZGl0aW9uLCB0aGUgZGVmYXVsdCB2YWx1ZXMgd2lsbCBzaG93IHVwIGluIHRoZSBTT0FQL1hNTCByZXF1ZXN0IGFuZCByZXNwb25zZSBtZXNzYWdlIGV4YW1wbGVzIGdlbmVyYXRlZCBieSB0aGUgZ1NPQVANCitjb21waWxlci4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorIDxoMj48YSBuYW1lPSJ0dGhfc0VjOCI+DQorODwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+VXNpbmcgdGhlIGdTT0FQIFN0dWIgYW5kIFNrZWxldG9uIENvbXBpbGVyPC9mb250PjwvaDI+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBnU09BUCBzdHViIGFuZCBza2VsZXRvbiBjb21waWxlciBpcyBpbnZva2VkIGZyb20gdGhlIGNvbW1hbmQgbGluZSBhbmQgb3B0aW9uYWxseSB0YWtlcyB0aGUgbmFtZSBvZiBhIGhlYWRlciBmaWxlIGFzIGFuDQorYXJndW1lbnQgb3IsIHdoZW4gdGhlIGZpbGUgbmFtZSBpcyBhYnNlbnQsIHBhcnNlcyB0aGUgc3RhbmRhcmQgaW5wdXQ6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjRDBEMEQwIj48dHI+PHRkPjxzcGFuIGNsYXNzPSJyb21hbiI+DQorPGk+c29hcGNwcDIgPGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+YWhlYWRlcmZpbGUuaDxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PjwvaT4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9zcGFuPg0KK3doZXJlIDxpPmFoZWFkZXJmaWxlLmg8L2k+IGlzIGEgc3RhbmRhcmQgQysrIGhlYWRlciBmaWxlLiBUaGUgY29tcGlsZXIgYWN0cyBhcyBhIHByZXByb2Nlc3NvciBhbmQgcHJvZHVjZXMgQysrIHNvdXJjZSBmaWxlcyB0aGF0DQorY2FuIGJlIHVzZWQgdG8gYnVpbGQgU09BUCBjbGllbnQgYW5kIFdlYiBzZXJ2aWNlIGFwcGxpY2F0aW9ucyBpbiBDKysuIFRoZSBmaWxlcyBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyIGFyZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNEMEQwRDAiPjx0cj48dGQ+PHNwYW4gY2xhc3M9InJvbWFuIj4NCisNCis8dGFibGU+DQorPHRyPjx0ZD48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+RmlsZSBOYW1lPC9iPjwvZm9udD4gPC90ZD48dGQgd2lkdGg9IjUwMSI+PGZvbnQgY29sb3I9IiNGRjAwMDAiPjxiPkRlc2NyaXB0aW9uPC9iPjwvZm9udD4gPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+c29hcFN0dWIuaDwvaT4gPC90ZD48dGQgd2lkdGg9IjUwMSI+QSBtb2RpZmllZCBhbmQgYW5ub3RhdGVkIGhlYWRlciBmaWxlIHByb2R1Y2VkIGZyb20gdGhlIGlucHV0IGhlYWRlciBmaWxlIDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPnNvYXBILmg8L2k+IDwvdGQ+PHRkIHdpZHRoPSI1MDEiPk1haW4gaGVhZGVyIGZpbGUgdG8gYmUgaW5jbHVkZWQgYnkgYWxsIGNsaWVudCBhbmQgc2VydmljZSBzb3VyY2VzIDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPnNvYXBDLmNwcDwvaT4gPC90ZD48dGQgd2lkdGg9IjUwMSI+U2VyaWFsaXplcnMgYW5kIGRlc2VyaWFsaXplcnMgZm9yIHRoZSBzcGVjaWZpZWQgZGF0YSBzdHJ1Y3R1cmVzIDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPnNvYXBDbGllbnQuY3BwPC9pPiA8L3RkPjx0ZCB3aWR0aD0iNTAxIj5DbGllbnQgc3R1YiByb3V0aW5lcyBmb3IgcmVtb3RlIG9wZXJhdGlvbnMgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+c29hcFNlcnZlci5jcHA8L2k+IDwvdGQ+PHRkIHdpZHRoPSI1MDEiPlNlcnZpY2Ugc2tlbGV0b24gcm91dGluZXMgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+c29hcENsaWVudExpYi5jcHA8L2k+IDwvdGQ+PHRkIHdpZHRoPSI1MDEiPkNsaWVudCBzdHVicyBjb21iaW5lZCB3aXRoIGxvY2FsIHN0YXRpYyAoZGUpc2VyaWFsaXplcnMgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+c29hcFNlcnZlckxpYi5jcHA8L2k+IDwvdGQ+PHRkIHdpZHRoPSI1MDEiPlNlcnZpY2Ugc2tlbGV0b25zIGNvbWJpbmVkIHdpdGggbG9jYWwgc3RhdGljIChkZSlzZXJpYWxpemVycyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT5zb2FwWFlaUHJveHkuaDwvaT4gPC90ZD48dGQgd2lkdGg9IjUwMSI+QSBDKysgcHJveHkgb2JqZWN0IChjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIHNvYXBDbGllbnQuY3BwKSA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT5zb2FwWFlaUHJveHkuY3BwPC9pPiA8L3RkPjx0ZCB3aWR0aD0iNTAxIj5JbXBsZW1lbnRhdGlvbiBvZiBDKysgcHJveHkgb2JqZWN0IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPnNvYXBYWVpPYmplY3QuaDwvaT4gPC90ZD48dGQgd2lkdGg9IjUwMSI+QSBDKysgc2VydmVyIG9iamVjdCAoY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBzb2FwU2VydmVyLmNwcCkgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+c29hcFhZWk9iamVjdC5jcHA8L2k+IDwvdGQ+PHRkIHdpZHRoPSI1MDEiPkltcGxlbWVudGF0aW9uIG9mIEMrKyBzZXJ2ZXIgb2JqZWN0IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPi54c2Q8L2k+IDwvdGQ+PHRkIHdpZHRoPSI1MDEiPkFuIDxpPm5zLnhzZDwvaT4gZmlsZSBpcyBnZW5lcmF0ZWQgd2l0aCBhbiBYTUwgU2NoZW1hIGZvciBlYWNoIG5hbWVzcGFjZSBwcmVmaXggPGk+bnM8L2k+IHVzZWQgYnkgYSBkYXRhIHN0cnVjdHVyZSBpbiB0aGUgaGVhZGVyDQorZmlsZSBpbnB1dCB0byB0aGUgY29tcGlsZXIsIHNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzp3c2RsIj43LjIuODwvYT4gPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+LndzZGw8L2k+IDwvdGQ+PHRkIHdpZHRoPSI1MDEiPkEgPGk+bnMud3NkbDwvaT4gZmlsZSBpcyBnZW5lcmF0ZWQgd2l0aCBhbiBXU0RMIGRlc2NyaXB0aW9uIGZvciBlYWNoIG5hbWVzcGFjZSBwcmVmaXggPGk+bnM8L2k+IHVzZWQgYnkgYSByZW1vdGUgbWV0aG9kIGluIHRoZQ0KK2hlYWRlciBmaWxlIGlucHV0IHRvIHRoZSBjb21waWxlciwgc2VlIFNlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOndzZGwiPjcuMi44PC9hPiA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT4ueG1sPC9pPiA8L3RkPjx0ZCB3aWR0aD0iNTAxIj5TZXZlcmFsIFNPQVAvWE1MIHJlcXVlc3QgYW5kIHJlc3BvbnNlIGZpbGVzIGFyZSBnZW5lcmF0ZWQuIFRoZXNlIGFyZSBleGFtcGxlIG1lc3NhZ2UgZmlsZXMgYXJlIHZhbGlkIHByb3ZpZGVkDQordGhhdCBzdWZmaWNpZW50IHNjaGVtYSBuYW1lc3BhY2UgZGlyZWN0aXZlcyBhcmUgYWRkZWQgdG8gdGhlIGhlYWRlciBmaWxlIG9yIHRoZSBnZW5lcmF0ZWQgLm5zbWFwIG5hbWVzcGFjZSB0YWJsZSBmb3IgdGhlDQorY2xpZW50L3NlcnZpY2UgaXMgbm90IG1vZGlmaWVkIGJ5IGhhbmQgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+Lm5zbWFwPC9pPiA8L3RkPjx0ZCB3aWR0aD0iNTAxIj5BIDxpPm5zLm5zbWFwPC9pPiBmaWxlIGlzIGdlbmVyYXRlZCBmb3IgZWFjaCBuYW1lc3BhY2UgcHJlZml4IDxpPm5zPC9pPiB1c2VkIGJ5IGEgcmVtb3RlIG1ldGhvZCBpbiB0aGUNCitoZWFkZXIgZmlsZSBpbnB1dCB0byB0aGUgY29tcGlsZXIsIHNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzp3c2RsIj43LjIuODwvYT4uICBUaGUgZmlsZSBjb250YWlucyBhIG5hbWVzcGFjZSBtYXBwaW5nIHRhYmxlIHRoYXQgY2FuIGJlIHVzZWQgaW4gdGhlIGNsaWVudC9zZXJ2aWNlIHNvdXJjZXMgPC90ZD48L3RyPjwvdGFibGU+DQorDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvc3Bhbj4NCitCb3RoIGNsaWVudCBhbmQgc2VydmljZSBhcHBsaWNhdGlvbnMgYXJlIGRldmVsb3BlZCBmcm9tIGEgaGVhZGVyIGZpbGUgdGhhdCBzcGVjaWZpZXMgdGhlIHJlbW90ZSBtZXRob2RzLiBJZiBjbGllbnQgYW5kDQorc2VydmljZSBhcHBsaWNhdGlvbnMgYXJlIGRldmVsb3BlZCB3aXRoIHRoZSBzYW1lIGhlYWRlciBmaWxlLCB0aGUgYXBwbGljYXRpb25zIGFyZSBndWFyYW50ZWVkIHRvIGJlIGNvbXBhdGlibGUgYmVjYXVzZSB0aGUgc3R1YiBhbmQgc2tlbGV0b24gcm91dGluZXMgdXNlDQordGhlIHNhbWUgc2VyaWFsaXplcnMgYW5kIGRlc2VyaWFsaXplcnMgdG8gZW5jb2RlIGFuZCBkZWNvZGUgdGhlIHBhcmFtZXRlcnMuIE5vdGUgdGhhdCB3aGVuIGNsaWVudCBhbmQgc2VydmljZSBhcHBsaWNhdGlvbnMgYXJlIGRldmVsb3BlZCB0b2dldGhlciwgYW4gYXBwbGljYXRpb24gZGV2ZWxvcGVyIGRvZXMNCitub3QgbmVlZCB0byBrbm93IHRoZSBkZXRhaWxzIG9mIHRoZSBpbnRlcm5hbCBTT0FQIGVuY29kaW5nIHVzZWQgYnkgdGhlIGNsaWVudCBhbmQgc2VydmljZS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIDxpPnNvYXBDbGllbnRMaWIuY3BwPC9pPiBhbmQgPGk+c29hcFNlcnZlckxpYi5jcHA8L2k+IGNhbiBiZSB1c2VkIHRvIGJ1aWxkIChkeW5hbWljKSBjbGllbnQgYW5kIHNlcnZlciBsaWJyYXJpZXMuIFRoZSBzZXJpYWxpemF0aW9uIHJvdXRpbmVzIGFyZSBsb2NhbCAoc3RhdGljKSB0byBhdm9pZCBsaW5rIHN5bWJvbCBjb25mbGljdHMuIFlvdSBtdXN0IGNyZWF0ZSBhIHNlcGFyYXRlIGxpYnJhcnkgZm9yIFNPQVAgSGVhZGVyIGFuZCBGYXVsdCBoYW5kbGluZywgYXMgZGVzY3JpYmVkIGluIFNlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOmR5bGlicyI+MTguMzQ8L2E+Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgZm9sbG93aW5nIGZpbGVzIGFyZSBwYXJ0IG9mIHRoZSBnU09BUCBwYWNrYWdlIGFuZCBhcmUgcmVxdWlyZWQgdG8gYnVpbGQgY2xpZW50IGFuZCBzZXJ2aWNlIGFwcGxpY2F0aW9uczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNEMEQwRDAiPjx0cj48dGQ+PHNwYW4gY2xhc3M9InJvbWFuIj4NCisNCis8dGFibGU+DQorPHRyPjx0ZD48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+RmlsZSBOYW1lPC9iPjwvZm9udD4gPC90ZD48dGQ+PGZvbnQgY29sb3I9IiNGRjAwMDAiPjxiPkRlc2NyaXB0aW9uPC9iPjwvZm9udD4gPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+c3Rkc29hcDIuaDwvaT4gPC90ZD48dGQ+SGVhZGVyIGZpbGUgb2YgPGk+c3Rkc29hcDIuY3BwPC9pPiBydW50aW1lIGxpYnJhcnkgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+c3Rkc29hcDIuYzwvaT4gPC90ZD48dGQ+UnVudGltZSBDIGxpYnJhcnkgd2l0aCBYTUwgcGFyc2VyIGFuZCBydW4tdGltZSBzdXBwb3J0IHJvdXRpbmVzIDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPnN0ZHNvYXAyLmNwcDwvaT4gPC90ZD48dGQ+UnVudGltZSBDKysgbGlicmFyeSBpZGVudGljYWwgdG8gPGk+c3Rkc29hcDIuYzwvaT4gPC90ZD48L3RyPjwvdGFibGU+DQorDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvc3Bhbj4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCSAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWM4LjEiPg0KKzguMTwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+Q29tcGlsZXIgT3B0aW9uczwvZm9udD48L2gzPjxhIG5hbWU9InNlYzpvcHRpb25zIj4NCis8L2E+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBjb21waWxlciBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjRDBEMEQwIj48dHI+PHRkPjxzcGFuIGNsYXNzPSJyb21hbiI+DQorDQorPHRhYmxlPg0KKzx0cj48dGQ+PGZvbnQgY29sb3I9IiNGRjAwMDAiPjxiPk9wdGlvbjwvYj48L2ZvbnQ+IDwvdGQ+PHRkPjxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5EZXNjcmlwdGlvbjwvYj48L2ZvbnQ+IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPi0xPC9pPgk8L3RkPjx0ZD5Vc2UgU09BUCAxLjEgbmFtZXNwYWNlcyBhbmQgZW5jb2RpbmdzIChkZWZhdWx0KSA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT4tMjwvaT4JPC90ZD48dGQ+VXNlIFNPQVAgMS4yIG5hbWVzcGFjZXMgYW5kIGVuY29kaW5ncyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT4tQzwvaT4JPC90ZD48dGQ+R2VuZXJhdGUgY2xpZW50LXNpZGUgY29kZSBvbmx5IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPi1TPC9pPgk8L3RkPjx0ZD5HZW5lcmF0ZSBzZXJ2ZXItc2lkZSBjb2RlIG9ubHkgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+LUw8L2k+CTwvdGQ+PHRkPkRvIG5vdCBnZW5lcmF0ZSBzb2FwQ2xpZW50TGliL3NvYXBTZXJ2ZXJMaWIgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+LWE8L2k+CTwvdGQ+PHRkPnVzZSB2YWx1ZSBvZiBTT0FQQWN0aW9uIEhUVFAgaGVhZGVyIHRvIGRpc3BhdGNoIG1ldGhvZCBhdCBzZXJ2ZXIgc2lkZSA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT4tYzwvaT4JPC90ZD48dGQ+R2VuZXJhdGUgcHVyZSBDIGNvZGUgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+LWQgICZsdDsgcGF0aCAmZ3Q7IDwvaT4JPC90ZD48dGQ+U2F2ZSBzb3VyY2VzIGluIGRpcmVjdG9yeSBzcGVjaWZpZWQgYnkgPGk+ICZsdDsgcGF0aCAmZ3Q7IDwvaT4gPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+LWU8L2k+CTwvdGQ+PHRkPkdlbmVyYXRlIFNPQVAgUlBDIGVuY29kaW5nIHN0eWxlIGJpbmRpbmdzIDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPi1oPC9pPgk8L3RkPjx0ZD5QcmludCBhIGJyaWVmIHVzYWdlIG1lc3NhZ2UgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+LWk8L2k+CTwvdGQ+PHRkPkdlbmVyYXRlIHNlcnZpY2UgcHJveGllcyBhbmQgb2JqZWN0cyBpbmhlcml0ZWQgZnJvbSBzb2FwIHN0cnVjdCA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT4tSSAgJmx0OyBwYXRoICZndDsgPC9pPgk8L3RkPjx0ZD5Vc2UgPGk+ICZsdDsgcGF0aCAmZ3Q7IDwvaT4gKG9yIHBhdGhzIHNlcGFyYXRlZCB3aXRoIGA6JykgZm9yIDxpPiNpbXBvcnQ8L2k+IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPi1sPC9pPgk8L3RkPjx0ZD5HZW5lcmF0ZSBsaW5rYWJsZSBtb2R1bGVzIChleHBlcmltZW50YWwpIDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPi1tPC9pPgk8L3RkPjx0ZD5HZW5lcmF0ZSBNYXRsYWI8c3VwPjxzcGFuIGNsYXNzPSJyb21hbiI+dG08L3NwYW4+PC9zdXA+IGNvZGUgZm9yIE1FWCBjb21waWxlciA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT4tbjwvaT4JPC90ZD48dGQ+V2hlbiB1c2VkIHdpdGggPGk+LXA8L2k+LCBlbmFibGVzIG11bHRpLWNsaWVudCBhbmQgbXVsdGktc2VydmVyIGJ1aWxkczogPC90ZD48L3RyPg0KKzx0cj48dGQ+PC90ZD48dGQ+U2V0cyBjb21waWxlciBvcHRpb24gPGk+V0lUSF9OT05BTUVTUEFDRVM8L2k+LCBzZWUgU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6Y29tcGlsZXJmbGFncyI+OC4xMTwvYT4gPC90ZD48L3RyPg0KKzx0cj48dGQ+PC90ZD48dGQ+U2F2ZXMgdGhlIG5hbWVzcGFjZSBtYXBwaW5nIHRhYmxlIHdpdGggbmFtZSA8aT4gJmx0OyBuYW1lICZndDsgX25hbWVzcGFjZXM8L2k+IGluc3RlYWQgb2YgPGk+bmFtZXNwYWNlczwvaT4gPC90ZD48L3RyPg0KKzx0cj48dGQ+PC90ZD48dGQ+UmVuYW1lcyA8aT5zb2FwX3NlcnZlKCk8L2k+IGludG8gPGk+ICZsdDsgbmFtZSAmZ3Q7IF9zZXJ2ZSgpPC9pPiBhbmQgPGk+c29hcF9kZXN0cm95KCk8L2k+IGludG8gPGk+ICZsdDsgbmFtZSAmZ3Q7IF9kZXN0cm95KCk8L2k+IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPi1wICAmbHQ7IG5hbWUgJmd0OyA8L2k+CTwvdGQ+PHRkPlNhdmUgc291cmNlcyB3aXRoIGZpbGUgbmFtZSBwcmVmaXggPGk+ICZsdDsgbmFtZSAmZ3Q7IDwvaT4gaW5zdGVhZCBvZiAiPGk+c29hcDwvaT4iIDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPi10PC9pPgk8L3RkPjx0ZD5HZW5lcmF0ZXMgY29kZSB0byBzZW5kIHR5cGVkIG1lc3NhZ2VzICh3aXRoIHRoZSA8dHQ+eHNpOnR5cGU8L3R0PiBhdHRyaWJ1dGUpIDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPi12PC9pPgk8L3RkPjx0ZD5EaXNwbGF5IHZlcnNpb24gaW5mbzwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPi13PC9pPgk8L3RkPjx0ZD5EbyBub3QgZ2VuZXJhdGUgV1NETCBhbmQgc2NoZW1hIGZpbGVzIDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPi14PC9pPgk8L3RkPjx0ZD5EbyBub3QgZ2VuZXJhdGUgc2FtcGxlIFhNTCBtZXNzYWdlIGZpbGVzIDwvdGQ+PC90cj48L3RhYmxlPg0KKw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQorRm9yIGV4YW1wbGUNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNEMEQwRDAiPjx0cj48dGQ+PHNwYW4gY2xhc3M9InJvbWFuIj4NCis8aT5zb2FwY3BwMiAtY2QgJy4uL3Byb2plY3RzJyAtcG15IGZpbGUuaDwvaT4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9zcGFuPg0KK1NhdmVzIHRoZSBzb3VyY2VzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKzxpPi4uL3Byb2plY3RzL215SC5oPC9pPiA8YnIgLz4NCis8aT4uLi9wcm9qZWN0cy9teUMuYzwvaT4gPGJyIC8+DQorPGk+Li4vcHJvamVjdHMvbXlDbGllbnQuYzwvaT4gPGJyIC8+DQorPGk+Li4vcHJvamVjdHMvbXlTZXJ2ZXIuYzwvaT4gPGJyIC8+DQorPGk+Li4vcHJvamVjdHMvbXlTdHViLmg8L2k+IDxiciAvPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQorTVMgV2luZG93cyB1c2VycyBjYW4gdXNlIHRoZSB1c3VhbCAiPGk+LzwvaT4iIGZvciBvcHRpb25zLCBmb3IgZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNEMEQwRDAiPjx0cj48dGQ+PHNwYW4gY2xhc3M9InJvbWFuIj4NCis8aT5zb2FwY3BwMiAvY2QgJy4uXHByb2plY3RzJyAvcG15IGZpbGUuaDwvaT4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9zcGFuPg0KK0NvbXBpbGVyIG9wdGlvbnMgPGk+YywgaSwgbiwgbCwgdzwvaT4gY2FuIGJlIHNldCBpbiB0aGUgZ1NPQVAgaGVhZGVyIGZpbGUgdXNpbmcgdGhlIDxpPi8vZ3NvYXBvcHQ8L2k+IGRpcmVjdGl2ZS4gRm9yIGV4YW1wbGUsDQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vIEdlbmVyYXRlIHB1cmUgQyBhbmQgZG8gbm90IHByb2R1Y2UgV1NETCBvdXRwdXQ6IDxiciAvPg0KKy8vZ3NvYXBvcHQgY3cgPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO25zX19teU1ldGhvZCg8Yj5jaGFyPC9iPiosPGI+Y2hhcjwvYj4qKik7IC8vIHRha2VzIGEgc3RyaW5nIGFuZCByZXR1cm5zIGEgc3RyaW5nDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCSAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWM4LjIiPg0KKzguMjwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+U09BUCAxLjEgVmVyc3VzIFNPQVAgMS4yPC9mb250PjwvaDM+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK2dTT0FQIHN1cHBvcnRzIFNPQVAgMS4xIGJ5IGRlZmF1bHQuIFNPQVAgMS4yIHN1cHBvcnQgaXMgYXV0b21hdGljYWxseSB0dXJuZWQgb24gd2hlbiB0aGUgYXBwcm9wcmlhdGUgU09BUCAxLjIgbmFtZXNwYWNlIGlzIHVzZWQNCitpbiB0aGUgbmFtZXNwYWNlIG1hcHBpbmcgdGFibGU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtOYW1lc3BhY2UgbmFtZXNwYWNlc1tdID0gPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7IlNPQVAtRU5WIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDIvMDYvc29hcC1lbnZlbG9wZSJ9LCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7IlNPQVAtRU5DIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDIvMDYvc29hcC1lbmNvZGluZyJ9LCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7InhzaSIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsICJodHRwOi8vd3d3LnczLm9yZy8qL1hNTFNjaGVtYS1pbnN0YW5jZSJ9LCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7InhzZCIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsICJodHRwOi8vd3d3LnczLm9yZy8qL1hNTFNjaGVtYSJ9LA0KKyZuYnNwOyZuYnNwOyZuYnNwOy4uLiA8YnIgLz4NCit9DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitnU09BUCBXZWIgc2VydmljZXMgYW5kIGNsaWVudHMgY2FuIGF1dG9tYXRpY2FsbHkgc3dpdGNoIGZyb20gU09BUCAxLjEgdG8gU09BUCAxLjIgYnkgcHJvdmlkaW5nIHRoZSBTT0FQIDEuMiBuYW1lc3BhY2UNCithcyBhIHBhdHRlcm4gaW4gdGhlIHRoaXJkIGNvbHVtbiBvZiBhIG5hbWVzcGFjZSB0YWJsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+c3RydWN0PC9iPiZuYnNwO05hbWVzcGFjZSBuYW1lc3BhY2VzW10gPSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3siU09BUC1FTlYiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMi8wNi9zb2FwLWVuY29kaW5nIn0sIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3siU09BUC1FTkMiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMi8wNi9zb2FwLWVudmVsb3BlIn0sIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3sieHNpIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgImh0dHA6Ly93d3cudzMub3JnLyovWE1MU2NoZW1hLWluc3RhbmNlIn0sIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3sieHNkIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiwgImh0dHA6Ly93d3cudzMub3JnLyovWE1MU2NoZW1hIn0sDQorJm5ic3A7Jm5ic3A7Jm5ic3A7Li4uIDxiciAvPg0KK30NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoaXMgd2F5LCBnU09BUCBXZWIgc2VydmljZXMgY2FuIHJlc3BvbmQgdG8gZWl0aGVyIFNPQVAgMS4xIG9yIFNPQVAgMS4yIHJlcXVlc3RzLiAgZ1NPQVAgd2lsbCBhdXRvbWF0aWNhbGx5IHJldHVybiBTT0FQIDEuMiByZXNwb25zZXMgZm9yIFNPQVAgMS4yIHJlcXVlc3RzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgZ1NPQVAgPGk+c29hcGNwcDI8L2k+IGNvbXBpbGVyIGdlbmVyYXRlcyBhIDxpPi5uc21hcDwvaT4gZmlsZSB3aXRoIDxpPlNPQVAtRU5WPC9pPiBhbmQgPGk+U09BUC1FTkM8L2k+IG5hbWVzcGFjZSBwYXR0ZXJucyBzaW1pbGFyIHRvIHRoZSBhYm92ZS4NCitTaW5jZSBjbGllbnRzIGlzc3VlIGEgc2VuZCBmaXJzdCwgdGhleSB3aWxsIGFsd2F5cyB1c2UgU09BUCAxLjEgZm9yIHJlcXVlc3RzIHdoZW4gdGhlIG5hbWVzcGFjZSB0YWJsZSBpcyBzaW1pbGFyIGFzIHNob3duIGFib3ZlLg0KK0NsaWVudHMgY2FuIGFjY2VwdCBTT0FQIDEuMiByZXNwb25zZXMgYnkgaW5zcGVjdGluZyB0aGUgcmVzcG9uc2UgbWVzc2FnZS4NCitUbyByZXN0cmljdCBnU09BUCBzZXJ2aWNlcyBhbmQgY2xpZW50cyB0byBTT0FQIDEuMiBhbmQgdG8gZ2VuZXJhdGUgU09BUCAxLjIgc2VydmljZSBXU0RMcywgdXNlIDxpPnNvYXBjcHAyPC9pPg0KK2NvbXBpbGVyIG9wdGlvbiA8aT4tMjwvaT4gdG8gZ2VuZXJhdGUgU09BUCAxLjIgY29uZm9ybWFudCA8aT4ubnNtYXA8L2k+IGFuZCA8aT4ud3NkbDwvaT4gZmlsZXMuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5DYXV0aW9uPC9iPjwvZm9udD46IFNPQVAgMS4yIGRvZXMgbm90IHN1cHBvcnQgcGFydGlhbGx5IHRyYW5zbWl0dGVkIGFycmF5cy4gU28gdGhlIDxpPl9fb2Zmc2V0PC9pPiBmaWVsZCBvZiBhIGR5bmFtaWMgYXJyYXkgaXMgbWVhbmluZ2xlc3MuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5DYXV0aW9uPC9iPjwvZm9udD46IFNPQVAgMS4yIHJlcXVpcmVzIHRoZSB1c2Ugb2YgPGk+U09BUF9FTlZfX0NvZGU8L2k+LCA8aT5TT0FQX0VOVl9fUmVhc29uPC9pPiwgYW5kIDxpPlNPQVBfRU5WX19EZXRhaWw8L2k+IGZpZWxkcw0KK2luIGEgPGk+U09BUF9FTlZfX0ZhdWx0PC9pPiBmYXVsdCBzdHJ1Y3QsIHdoaWxlIFNPQVAgMS4xIHVzZXMgPGk+ZmF1bHRjb2RlPC9pPiwgPGk+ZmF1bHRzdHJpbmc8L2k+LCBhbmQgPGk+ZGV0YWlsPC9pPiBmaWVsZHMuDQorVXNlIDxpPnNvYXBfcmVjZWl2ZXJfZmF1bHRfc3ViY29kZSg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqc3ViY29kZSwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqZmF1bHRzdHJpbmcsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KmRldGFpbCk8L2k+IHRvIHNldCBhIFNPQVAgMS4xLzEuMg0KK2ZhdWx0IGF0IHRoZSBzZXJ2ZXItc2lkZSB3aXRoIGEgZmF1bHQgc3ViY29kZSAoU09BUCAxLjIpLg0KK1VzZSA8aT5zb2FwX3NlbmRlcl9mYXVsdF9zdWJjb2RlKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj5jb25zdDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypzdWJjb2RlLCA8Yj5jb25zdDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypmYXVsdHN0cmluZywgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqZGV0YWlsKTwvaT4gdG8gc2V0IGEgU09BUCAxLjEvMS4yDQordW5yZWNvdmVyYWJsZSBCYWQgUmVxdWVzdCBmYXVsdCBhdCB0aGUgc2VydmVyLXNpZGUgd2l0aCBhIGZhdWx0IHN1YmNvZGUgKFNPQVAgMS4yKS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCSAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWM4LjMiPg0KKzguMzwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+VGhlIHNvYXBkZWZzLmggSGVhZGVyIEZpbGU8L2ZvbnQ+PC9oMz48YSBuYW1lPSJzZWM6c29hcGRlZnMiPg0KKzwvYT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIDxpPnNvYXBkZWZzLmg8L2k+IGhlYWRlciBmaWxlIGlzIGluY2x1ZGVkIGluIDxpPnN0ZHNvYXAyLmg8L2k+IHdoZW4gY29tcGlsaW5nIHdpdGggb3B0aW9uIDxpPi1EV0lUSF9TT0FQREVGU19IPC9pPjoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNEMEQwRDAiPjx0cj48dGQ+PHNwYW4gY2xhc3M9InJvbWFuIj4NCis8aT5nKysgLURXSVRIX1NPQVBERUZTX0ggLWMgc3Rkc29hcDIuY3BwPC9pPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQorVGhlIDxpPnNvYXBkZWZzLmg8L2k+IGZpbGUgYWxsb3dzIHVzZXJzIHRvIGluY2x1ZGUgZGVmaW5pdGlvbnMgYW5kIGFkZCBpbmNsdWRlcyB3aXRob3V0IHJlcXVpcmluZyBjaGFuZ2VzIHRvIDxpPnN0ZHNvYXAyLmg8L2k+Lg0KK0ZvciBleGFtcGxlLA0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisvLyBDb250ZW50cyBvZiBzb2FwZGVmcy5oIDxiciAvPg0KKyNpbmNsdWRlICAmbHQ7IG9zdHJlYW0gJmd0OyAgPGJyIC8+DQorI2RlZmluZSBTT0FQX0JVRkxFTiAyMDQ4MCAvLyB1c2UgbGFyZ2Ugc2VuZC9yZWN2IGJ1ZmZlciA8YnIgLz4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoZSBmb2xsb3dpbmcgaGVhZGVyIGZpbGUgY2FuIG5vdyByZWZlciB0byA8aT5vc3RyZWFtPC9pPjoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+ZXh0ZXJuPC9iPiZuYnNwOzxiPmNsYXNzPC9iPiZuYnNwO29zdHJlYW07IC8vIG9zdHJlYW0gY2FuJ3QgYmUgKGRlKXNlcmlhbGl6ZWQsIGJ1dCBuZWVkIHRvIGJlIGRlY2xhcmVkIHRvIG1ha2UgaXQgdmlzaWJsZSB0byBnU09BUCA8YnIgLz4NCis8Yj5jbGFzczwvYj4mbmJzcDtuc19fbXlDbGFzcyA8YnIgLz4NCit7IC4uLiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj52aXJ0dWFsPC9iPiZuYnNwOzxiPnZvaWQ8L2I+Jm5ic3A7cHJpbnQob3N0cmVhbSAmYW1wO3MpIDxiPmNvbnN0PC9iPjsgLy8gbmVlZCBvc3RyZWFtIGhlcmUgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Li4uIDxiciAvPg0KK307DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitTZWUgYWxzbyBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzp0cmFuc2llbnQiPjE4LjM8L2E+Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJICAgICA8aDM+PGEgbmFtZT0idHRoX3NFYzguNCI+DQorOC40PC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5Ib3cgdG8gQnVpbGQgTW9kdWxlcyBhbmQgTGlicmFyaWVzIHdpdGggdGhlIGdTT0FQICNtb2R1bGUgRGlyZWN0aXZlPC9mb250PjwvaDM+PGEgbmFtZT0ic2VjOm1vZHVsZSI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgPGk+I21vZHVsZTwvaT4gZGlyZWN0aXZlIGlzIHVzZWQgdG8gYnVpbGQgbW9kdWxlcy4gQSBsaWJyYXJ5IGNhbiBiZSBidWlsZCBmcm9tIGEgbW9kdWxlIGFuZCBsaW5rZWQgd2l0aCBtdWx0aXBsZSBXZWIgc2VydmljZXMgYXBwbGljYXRpb25zLiBUaGUgZGlyZWN0aXZlIHNob3VsZCBhcHBlYXIgYXQgdGhlIHRvcCBvZiB0aGUgaGVhZGVyIGZpbGUgYW5kIGhhcyB0aGUgZm9sbG93aW5nIGZvcm1hdDoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorI21vZHVsZSAiPGk+bmFtZTwvaT4iIDxiciAvPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQord2hlcmUgPGk+bmFtZTwvaT4gaXMgYSB1bmlxdWUgbmFtZSBmb3IgdGhlIG1vZHVsZS4gVGhlIG5hbWUgaXMgY2FzZSBpbnNlbnNpdGl2ZSBhbmQgTVVTVCBub3QgZXhjZWVkIDQgY2hhcmFjdGVycyBpbiBsZW5ndGguDQorVGhlIHJlc3Qgb2YgdGhlIGNvbnRlbnQgb2YgdGhlIGhlYWRlciBmaWxlIHNob3VsZCBpbmNsdWRlIHR5cGUgZGVjbGFyYXRpb25zIGFuZCBvcHRpb25hbGx5IHRoZSBkZWNsYXJhdGlvbnMgb2YgcmVtb3RlIG1ldGhvZHMgYW5kIFNPQVAgSGVhZGVycy9GYXVsdHMuIFdoZW4gdGhlIGdTT0FQIGNvbXBpbGVyIHByb2Nlc3NlcyB0aGUgaGVhZGVyIGZpbGUgbW9kdWxlLCBpdCB3aWxsIGdlbmVyYXRlIHRoZSBzb3VyY2UgY29kZXMgZm9yIGEgbGlicmFyeS4gVGhlIFdlYiBzZXJ2aWNlcyBhcHBsaWNhdGlvbiB0aGF0IHVzZXMgdGhlIGxpYnJhcnkgc2hvdWxkIHVzZSBhIGhlYWRlciBmaWxlIHRoYXQgaW1wb3J0cyB0aGUgbW9kdWxlIHdpdGggdGhlIDxpPiNpbXBvcnQ8L2k+IGRpcmVjdGl2ZS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorRm9yIGV4YW1wbGU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8qIENvbnRlbnRzIG9mIG1vZHVsZS5oICovIDxiciAvPg0KKyNtb2R1bGUgInRlc3QiIDxiciAvPg0KKzxiPmxvbmc8L2I+OyA8YnIgLz4NCis8Yj5jaGFyPC9iPio7IDxiciAvPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtuc19fUyA8YnIgLz4NCit7IC4uLiB9DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgPGk+bW9kdWxlLmg8L2k+IGhlYWRlciBmaWxlIGRlY2xhcmVzIGEgPGI+bG9uZzwvYj4sIDxiPmNoYXI8L2I+KiwgYW5kIGEgPGk+PGI+c3RydWN0PC9iPiZuYnNwO25zX19YPC9pPi4gVGhlIG1vZHVsZSBuYW1lIGlzICJ0ZXN0Iiwgc28gdGhlIGdTT0FQIGNvbXBpbGVyIHByb2R1Y2VzIGEgPGk+dGVzdEMuY3BwPC9pPiBmaWxlIHdpdGggdGhlIChkZSlzZXJpYWxpemVycyBmb3IgdGhlc2UgdHlwZXMuIFRoZSA8aT50ZXN0Qy5jcHA8L2k+IGxpYnJhcnkgY2FuIGJlIHNlcGFyYXRlbHkgY29tcGlsZWQgYW5kIGxpbmtlZCB3aXRoIGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYnVpbHQgZnJvbSBhIGhlYWRlciBmaWxlIHRoYXQgaW1wb3J0cyAibW9kdWxlLmgiIHVzaW5nIDxpPiNpbXBvcnQgIm1vZHVsZS5oIjwvaT4uIFlvdSBzaG91bGQgYWxzbyBjb21waWxlIDxpPnRlc3RDbGllbnQuY3BwPC9pPiB3aGVuIHlvdSB3YW50IHRvIGJ1aWxkIGEgbGlicmFyeSB0aGF0IGluY2x1ZGVzIHRoZSByZW1vdGUgbWV0aG9kcyB0aGF0IHlvdSBkZWZpbmVkIGluIHRoZSBtb2R1bGUgaGVhZGVyIGZpbGUuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0EgbW9kdWxlIE1VU1QgYmUgaW1wb3J0ZWQgaW50byBhbm90aGVyIGhlYWRlciBmaWxlIHRvIHVzZSBpdCBhbmQgeW91IGNhbm5vdCB1c2UgYSBtb2R1bGUgYWxvbmUgdG8gYnVpbGQgYSBTT0FQIG9yIFhNTCBhcHBsaWNhdGlvbi4gVGhhdCBpcywgdGhlIHRvcCBtb3N0IGhlYWRlciBmaWxlIGluIHRoZSBpbXBvcnQgdHJlZSBTSE9VTEQgTk9UIGJlIGEgbW9kdWxlLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitXaGVuIG11bHRpcGxlIG1vZHVsZXMgYXJlIGxpbmtlZCwgdGhlIHR5cGVzIHRoYXQgdGhleSBkZWNsYXJlIE1VU1QgYmUgZGVjbGFyZWQgaW4gb25lIG1vZHVsZSBvbmx5IHRvIGF2b2lkIG5hbWUgY2xhc2hlcyBhbmQgbGluayBlcnJvcnMuIFlvdSBjYW5ub3QgY3JlYXRlIHR3byBtb2R1bGVzIHRoYXQgc2hhcmUgdGhlIHNhbWUgdHlwZSBkZWNsYXJhdGlvbiBhbmQgbGluayB0aGUgbW9kdWxlcy4gV2hlbiBuZWNlc3NhcnksIHlvdSBzaG91bGQgY29uc2lkZXIgY3JlYXRpbmcgYSBtb2R1bGUgaGllcmFyY2h5IHN1Y2ggdGhhdCB0eXBlcyBhcmUgZGVjbGFyZWQgb25seSBvbmNlIGFuZCBieSBvbmx5IG9uZSBtb2R1bGUgd2hlbiB0aGVzZSBtb2R1bGVzIG11c3QgYmUgbGlua2VkLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJICAgICA8aDM+PGEgbmFtZT0idHRoX3NFYzguNSI+DQorOC41PC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5Ib3cgdG8gdXNlIHRoZSBnU09BUCAjaW1wb3J0IERpcmVjdGl2ZTwvZm9udD48L2gzPjxhIG5hbWU9InNlYzppbXBvcnQiPg0KKzwvYT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIDxpPiNpbXBvcnQ8L2k+IGRpcmVjdGl2ZSBpcyB1c2VkIHRvIGluY2x1ZGUgZ1NPQVAgaGVhZGVyIGZpbGVzIGludG8gb3RoZXIgZ1NPQVAgaGVhZGVyIGZpbGVzIGZvciBwcm9jZXNzaW5nIHdpdGgNCit0aGUgZ1NPQVAgY29tcGlsZXIgPGk+c29hcGNwcDI8L2k+Lg0KK1RoZSBDIDxpPiNpbmNsdWRlPC9pPiBkaXJlY3RpdmUgY2Fubm90IGJlIHVzZWQgdG8gaW5jbHVkZSBnU09BUCBoZWFkZXIgZmlsZXMuDQorVGhlIDxpPiNpbmNsdWRlPC9pPiBkaXJlY3RpdmUgaXMgcmVzZXJ2ZWQgdG8gY29udHJvbCB0aGUgcG9zdC1nU09BUCBjb21waWxhdGlvbiBwcm9jZXNzLCBzZWUmbmJzcDs8YSBocmVmPSIjc2VjOnByYWdtYXMiPjguNjwvYT4uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSA8aT4jaW1wb3J0PC9pPiBkaXJlY3RpdmUgaXMgdXNlZCBmb3IgdHdvIHB1cnBvc2VzOiB5b3UgY2FuIHVzZSBpdCB0byBpbmNsdWRlIHRoZSBjb250ZW50cyBvZiBhIGhlYWRlciBmaWxlIGludG8gYW5vdGhlciBoZWFkZXIgZmlsZSBhbmQgeW91IGNhbiB1c2UgaXQgdG8gaW1wb3J0IGEgbW9kdWxlLCBzZWUmbmJzcDs8YSBocmVmPSIjc2VjOm1vZHVsZSI+OC40PC9hPi4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorQW4gZXhhbXBsZSBvZiB0aGUgPGk+I2ltcG9ydDwvaT4gZGlyZWN0aXZlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisjaW1wb3J0ICJteWRlZnMuZ3NvYXAiIDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDtuc19fbXltZXRob2QoeHNkX19zdHJpbmcgaW4sIHhzZF9faW50ICpvdXQpOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQord2hlcmUgPGk+Im15ZGVmcy5nc29hcCI8L2k+IGlzIGEgZ1NPQVAgaGVhZGVyIGZpbGUgdGhhdCBkZWZpbmVzIDxpPnhzZF9fc3RyaW5nPC9pPiBhbmQgPGk+eHNkX19pbnQ8L2k+Og0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KnhzZF9fc3RyaW5nOyA8YnIgLz4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmludDwvYj4mbmJzcDt4c2RfX2ludDsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJICAgICA8aDM+PGEgbmFtZT0idHRoX3NFYzguNiI+DQorOC42PC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5Ib3cgdG8gVXNlICNpbmNsdWRlIGFuZCAjZGVmaW5lIERpcmVjdGl2ZXM8L2ZvbnQ+PC9oMz48YSBuYW1lPSJzZWM6cHJhZ21hcyI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgPGk+I2luY2x1ZGU8L2k+IGFuZCA8aT4jZGVmaW5lPC9pPiBkaXJlY3RpdmVzIGFyZSBub3JtYWxseSBpZ25vcmVkIGJ5IHRoZSBnU09BUCBjb21waWxlci4NCitUaGUgdXNlIG9mIHRoZSBkaXJlY3RpdmVzIGlzIGVuYWJsZWQgd2l0aCB0aGUgPGk+LWk8L2k+IG9wdGlvbiBvZiB0aGUgZ1NPQVAgY29tcGlsZXIsIHNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzpvcHRpb25zIj44LjE8L2E+Lg0KK0hvd2V2ZXIsIHRoZSBnU09BUCBjb21waWxlciB3aWxsIG5vdCBhY3R1YWxseSBwYXJzZSB0aGUgY29udGVudHMgb2YgdGhlIGhlYWRlciBmaWxlcyBwcm92aWRlZCBieSB0aGUgPGk+I2luY2x1ZGU8L2k+IGRpcmVjdGl2ZXMgaW4gYSBoZWFkZXIgZmlsZS4NCitJbnN0ZWFkLCB0aGUgPGk+I2luY2x1ZGU8L2k+IGFuZCA8aT4jZGVmaW5lPC9pPiBkaXJlY3RpdmVzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGdlbmVyYXRlZCA8aT5zb2FwSC5oPC9pPiBoZWFkZXIgZmlsZSA8Yj5iZWZvcmU8L2I+DQorYW55IG90aGVyIGhlYWRlciBmaWxlIGlzIGluY2x1ZGVkLiBUaGVyZWZvcmUsIDxpPiNpbmNsdWRlPC9pPiBhbmQgPGk+I2RlZmluZTwvaT4gZGlyZWN0aXZlcyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZSBDL0MrKw0KK2NvbXBpbGF0aW9uIHByb2Nlc3Mgb2YgdGhlIHNvdXJjZXMgb2YgYW4gYXBwbGljYXRpb24uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBoZWFkZXIgZmlsZSByZWZlcnMgdG8gPGk+b3N0cmVhbTwvaT4gYnkgaW5jbHVkaW5nIDxpPiAmbHQ7IG9zdHJlYW0gJmd0OyA8L2k+Og0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisjaW5jbHVkZSAgJmx0OyBvc3RyZWFtICZndDsgIDxiciAvPg0KKyNkZWZpbmUgV0lUSF9DT09LSUVTIC8vIHVzZSBIVFRQIGNvb2tpZSBzdXBwb3J0ICh5b3UgbXVzdCBjb21waWxlIHN0ZHNvYXAyLmNwcCB3aXRoIC1EV0lUSF9DT09LSUVTKSA8YnIgLz4NCisjZGVmaW5lIFdJVEhfT1BFTlNTTCAvLyBlbmFibGUgSFRUUFMgKFNTTCkgc3VwcG9ydCAoeW91IG11c3QgY29tcGlsZSBzdGRzb2FwMi5jcHAgd2l0aCAtRFdJVEhfT1BFTlNTTCkgPGJyIC8+DQorI2RlZmluZSBTT0FQX0RFRkFVTFRfZmxvYXQgRkxUX05BTiAvLyB1c2UgTmFOIGluc3RlYWQgb2YgMC4wIDxiciAvPg0KKzxiPmV4dGVybjwvYj4mbmJzcDs8Yj5jbGFzczwvYj4mbmJzcDtvc3RyZWFtOyAvLyBvc3RyZWFtIGNhbid0IGJlIChkZSlzZXJpYWxpemVkLCBidXQgbmVlZCB0byBiZSBkZWNsYXJlZCB0byBtYWtlIGl0IHZpc2libGUgdG8gZ1NPQVAgPGJyIC8+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7bnNfX215Q2xhc3MgPGJyIC8+DQoreyAuLi4gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+dmlydHVhbDwvYj4mbmJzcDs8Yj52b2lkPC9iPiZuYnNwO3ByaW50KG9zdHJlYW0gJmFtcDtzKSA8Yj5jb25zdDwvYj47IC8vIG5lZWQgb3N0cmVhbSBoZXJlIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOy4uLiA8YnIgLz4NCit9Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhpcyBleGFtcGxlIGFsc28gdXNlcyA8aT4jZGVmaW5lPC9pPiBkaXJlY3RpdmVzIGZvciB2YXJpb3VzIHNldHRpbmdzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+Q2F1dGlvbjwvYj48L2ZvbnQ+OiBOb3RlIHRoYXQgdGhlIHVzZSBvZiA8aT4jZGVmaW5lPC9pPiBpbiB0aGUgaGVhZGVyIGZpbGUgZG9lcyBub3QgYXV0b21hdGljYWxseSByZXN1bHQgaW4gY29tcGlsaW5nDQorPGk+c3Rkc29hcDIuY3BwPC9pPiB3aXRoIHRoZXNlIGRpcmVjdGl2ZXMuIFlvdSBNVVNUIHVzZSB0aGUgPGk+LURXSVRIX0NPT0tJRVM8L2k+IGFuZCA8aT4tRFdJVEhfT1BFTlNTTDwvaT4gb3B0aW9ucyB3aGVuDQorY29tcGlsaW5nIDxpPnN0ZHNvYXAyLmNwcDwvaT4gYmVmb3JlIGxpbmtpbmcgdGhlIG9iamVjdCBmaWxlIHdpdGggeW91ciBjb2Rlcy4gQXMgYW4gYWx0ZXJuYXRpdmUsIHlvdSBjYW4gdXNlIDxpPiNkZWZpbmUNCitXSVRIX1NPQVBERUZTX0g8L2k+IGFuZCBwdXQgdGhlIDxpPiNkZWZpbmU8L2k+IGRpcmVjdGl2ZXMgaW4gdGhlIDxpPnNvYXBkZWZzLmg8L2k+IGZpbGUuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkgICAgIDxoMz48YSBuYW1lPSJ0dGhfc0VjOC43Ij4NCis4Ljc8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPkNvbXBpbGluZyBhIGdTT0FQIENsaWVudDwvZm9udD48L2gzPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitBZnRlciBpbnZva2luZyB0aGUgZ1NPQVAgc3R1YiBhbmQgc2tlbGV0b24gY29tcGlsZXIgb24gYSBoZWFkZXIgZmlsZSBkZXNjcmlwdGlvbiBvZiBhIHNlcnZpY2UsIHRoZSBjbGllbnQgYXBwbGljYXRpb24gY2FuIGJlIGNvbXBpbGVkIG9uIGEgTGludXggbWFjaGluZSBhcyBmb2xsb3dzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKzxpPmcrKyAtbyBteWNsaWVudCBteWNsaWVudC5jcHAgc3Rkc29hcDIuY3BwIHNvYXBDLmNwcCBzb2FwQ2xpZW50LmNwcDwvaT4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9zcGFuPg0KK09yIG9uIGEgVW5peCBtYWNoaW5lOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKzxpPmcrKyAtbyBteWNsaWVudCBteWNsaWVudC5jcHAgc3Rkc29hcDIuY3BwIHNvYXBDLmNwcCBzb2FwQ2xpZW50LmNwcCAtbHNvY2tldCAtbHhuZXQgLWxuc2w8L2k+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvc3Bhbj4NCisoRGVwZW5kaW5nIG9uIHlvdXIgc3lzdGVtIGNvbmZpZ3VyYXRpb24sIHRoZSBsaWJyYXJpZXMgPGk+bGlic29ja2V0LmE8L2k+LA0KKzxpPmxpYnhuZXQuYTwvaT4sIDxpPmxpYm5zbC5hPC9pPiBvciBkeW5hbWljIDxpPiouc288L2k+IHZlcnNpb25zIG9mIHRob3NlIGxpYnJhcmllcyBhcmUgcmVxdWlyZWQuKQ0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgPGk+bXljbGllbnQuY3BwPC9pPiBmaWxlIG11c3QgaW5jbHVkZSA8aT5zb2FwSC5oPC9pPiBhbmQgbXVzdCBkZWZpbmUgYSBnbG9iYWwgbmFtZXNwYWNlIG1hcHBpbmcgdGFibGUuIEEgdHlwaWNhbCBjbGllbnQgcHJvZ3JhbSBsYXlvdXQgd2l0aCBuYW1lc3BhY2UgbWFwcGluZyB0YWJsZSBpcyBzaG93biBiZWxvdzoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorLy8gQ29udGVudHMgb2YgZmlsZSAibXljbGllbnQuY3BwIiA8YnIgLz4NCisjaW5jbHVkZSAic29hcEguaCI7IDxiciAvPg0KKy4uLiA8YnIgLz4NCisvLyBBIHJlbW90ZSBtZXRob2QgaW52b2NhdGlvbjogPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9jYWxsX3NvbWVfcmVtb3RlX21ldGhvZCguLi4pOyA8YnIgLz4NCisuLi4gPGJyIC8+DQorPGI+c3RydWN0PC9iPiZuYnNwO05hbWVzcGFjZSBuYW1lc3BhY2VzW10gPSA8YnIgLz4NCit7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ly8geyJucy1wcmVmaXgiLCAibnMtbmFtZSJ9IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3siU09BUC1FTlYiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8ifSwgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyJTT0FQLUVOQyIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyJ9LCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7InhzaSIsICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIn0sIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3sieHNkIiwgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEifSwgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyJuczEiLCAgICAgICJ1cm46bXktcmVtb3RlLW1ldGhvZCJ9LCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7TlVMTCwgTlVMTH0gPGJyIC8+DQorfTsgPGJyIC8+DQorLi4uDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitBIG1hcHBpbmcgdGFibGUgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBnU09BUCBjb21waWxlciB0aGF0IGNhbiBiZSB1c2VkIGluIHRoZSBzb3VyY2UsIHNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzp3c2RsIj43LjIuODwvYT4uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkgICAgIDxoMz48YSBuYW1lPSJ0dGhfc0VjOC44Ij4NCis4Ljg8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPkNvbXBpbGluZyBhIGdTT0FQIFdlYiBTZXJ2aWNlPC9mb250PjwvaDM+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0FmdGVyIGludm9raW5nIHRoZSBnU09BUCBzdHViIGFuZCBza2VsZXRvbiBjb21waWxlciBvbiBhIGhlYWRlciBmaWxlIGRlc2NyaXB0aW9uIG9mIHRoZSBzZXJ2aWNlLCB0aGUgc2VydmVyIGFwcGxpY2F0aW9uIGNhbiBiZSBjb21waWxlZCBvbiBhIExpbnV4IG1hY2hpbmUgYXMgZm9sbG93czoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNEMEQwRDAiPjx0cj48dGQ+PHNwYW4gY2xhc3M9InJvbWFuIj4NCis8aT5nKysgLW8gbXlzZXJ2ZXIgbXlzZXJ2ZXIuY3BwIHN0ZHNvYXAyLmNwcCBzb2FwQy5jcHAgc29hcFNlcnZlci5jcHA8L2k+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvc3Bhbj4NCitPciBvbiBhIFVuaXggbWFjaGluZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNEMEQwRDAiPjx0cj48dGQ+PHNwYW4gY2xhc3M9InJvbWFuIj4NCis8aT5nKysgLW8gbXlzZXJ2ZXIgbXlzZXJ2ZXIuY3BwIHN0ZHNvYXAyLmNwcCBzb2FwQy5jcHAgc29hcFNlcnZlci5jcHAgLWxzb2NrZXQgLWx4bmV0IC1sbnNsPC9pPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQorKERlcGVuZGluZyBvbiB5b3VyIHN5c3RlbSBjb25maWd1cmF0aW9uLCB0aGUgbGlicmFyaWVzIDxpPmxpYnNvY2tldC5hPC9pPiwNCis8aT5saWJ4bmV0LmE8L2k+LCA8aT5saWJuc2wuYTwvaT4gb3IgZHluYW1pYyA8aT4qLnNvPC9pPiB2ZXJzaW9ucyBvZiB0aG9zZSBsaWJyYXJpZXMgYXJlIHJlcXVpcmVkLikNCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIDxpPm15c2VydmVyLmNwcDwvaT4gZmlsZSBtdXN0IGluY2x1ZGUgPGk+c29hcEguaDwvaT4gYW5kIG11c3QgZGVmaW5lIGEgZ2xvYmFsIG5hbWVzcGFjZSBtYXBwaW5nIHRhYmxlLiBBIHR5cGljYWwgc2VydmljZSBwcm9ncmFtIGxheW91dCB3aXRoIG5hbWVzcGFjZSBtYXBwaW5nIHRhYmxlIGlzIHNob3duIGJlbG93Og0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisvLyBDb250ZW50cyBvZiBmaWxlICJteXNlcnZlci5jcHAiIDxiciAvPg0KKyNpbmNsdWRlICJzb2FwSC5oIjsgPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO21haW4oKSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfc2VydmUoc29hcF9uZXcoKSk7IDxiciAvPg0KK30gPGJyIC8+DQorLi4uIDxiciAvPg0KKy8vIEltcGxlbWVudGF0aW9ucyBvZiB0aGUgcmVtb3RlIG1ldGhvZHMgYXMgQysrIGZ1bmN0aW9ucyA8YnIgLz4NCisuLi4gPGJyIC8+DQorPGI+c3RydWN0PC9iPiZuYnNwO05hbWVzcGFjZSBuYW1lc3BhY2VzW10gPSA8YnIgLz4NCit7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ly8geyJucy1wcmVmaXgiLCAibnMtbmFtZSJ9IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3siU09BUC1FTlYiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8ifSwgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyJTT0FQLUVOQyIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyJ9LCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7InhzaSIsICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIn0sIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3sieHNkIiwgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEifSwgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyJuczEiLCAgICAgICJ1cm46bXktcmVtb3RlLW1ldGhvZCJ9LCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7TlVMTCwgTlVMTH0gPGJyIC8+DQorfTsgPGJyIC8+DQorLi4uDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitXaGVuIHRoZSBnU09BUCBzZXJ2aWNlIGlzIGNvbXBpbGVkIGFuZCBpbnN0YWxsZWQgYXMgYSBDR0kgYXBwbGljYXRpb24sIHRoZSA8aT5zb2FwX3NlcnZlPC9pPiBmdW5jdGlvbiBhY3RzIGFzIGEgc2VydmljZSBkaXNwYXRjaGVyLiBJdCBsaXN0ZW5zIHRvIHN0YW5kYXJkIGlucHV0IGFuZA0KK2ludm9rZXMgdGhlIG1ldGhvZCB2aWEgYSBza2VsZXRvbiByb3V0aW5lIHRvIHNlcnZlIGEgU09BUCBjbGllbnQgcmVxdWVzdC4gQWZ0ZXIgdGhlIHJlcXVlc3QgaXMgc2VydmVkLCB0aGUgcmVzcG9uc2UgaXMgZW5jb2RlZCBpbg0KK1NPQVAgYW5kIHNlbmQgdG8gc3RhbmRhcmQgb3V0cHV0LiBUaGUgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHNlcnZlciBhcHBsaWNhdGlvbiBhbmQgdGhlIHR5cGUgc2lnbmF0dXJlIG9mIHRoZSBtZXRob2QNCittdXN0IGJlIGlkZW50aWNhbCB0byB0aGUgcmVtb3RlIG1ldGhvZCBzcGVjaWZpZWQgaW4gdGhlIGhlYWRlciBmaWxlLiBUaGF0IGlzLCB0aGUgZnVuY3Rpb24gcHJvdG90eXBlIGluIHRoZSBoZWFkZXIgZmlsZSBtdXN0IGJlIGENCit2YWxpZCBwcm90b3R5cGUgb2YgdGhlIG1ldGhvZCBpbXBsZW1lbnRlZCBhcyBhIEMvQysrIGZ1bmN0aW9uLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJICAgICA8aDM+PGEgbmFtZT0idHRoX3NFYzguOSI+DQorOC45PC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5Vc2luZyBnU09BUCBmb3IgQ3JlYXRpbmcgV2ViIFNlcnZpY2VzIGFuZCBDbGllbnRzIGluIFB1cmUgQzwvZm9udD48L2gzPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgZ1NPQVAgY29tcGlsZXIgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIHB1cmUgQyBXZWIgc2VydmljZXMgYW5kIGNsaWVudHMuIFRoZSBnU09BUCBzdHViIGFuZCBza2VsZXRvbiBjb21waWxlcg0KKzxpPnNvYXBjcHAyPC9pPiBnZW5lcmF0ZXMgPGk+LmNwcDwvaT4gZmlsZXMgYnkgZGVmYXVsdC4gVGhlIGNvbXBpbGVyIGdlbmVyYXRlcyA8aT4uYzwvaT4gZmlsZXMgd2l0aCB0aGUgPGk+LWM8L2k+IG9wdGlvbi4NCitIb3dldmVyLCB0aGVzZSBmaWxlcyBvbmx5IHVzZSBDIHN5bnRheCBhbmQgZGF0YSB0eXBlcyA8Yj5pZjwvYj4gdGhlIGhlYWRlcg0KK2ZpbGUgaW5wdXQgdG8gPGk+c29hcGNwcDI8L2k+IHVzZXMgQyBzeW50YXggYW5kIGRhdGEgdHlwZXMuIEZvciBleGFtcGxlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKzxpPnNvYXBjcHAyIC1jIHF1b3RlLmg8L2k+IDxiciAvPg0KKzxpPmdjYyAtbyBxdW90ZSBxdW90ZS5jIHN0ZHNvYXAyLmMgc29hcEMuYyBzb2FwQ2xpZW50LmM8L2k+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvc3Bhbj4NCitXYXJuaW5ncyB3aWxsIGJlIGlzc3VlZCBieSB0aGUgY29tcGlsZXIgd2hlbiBDKysgY2xhc3MgZGVjbGFyYXRpb25zIG9jY3VyIGluIHRoZSBoZWFkZXIgZmlsZS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCSAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWM4LjEwIj4NCis4LjEwPC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5MaW1pdGF0aW9ucyBvZiBnU09BUDwvZm9udD48L2gzPjxhIG5hbWU9InNlYzpsaW1pdGF0aW9ucyI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitnU09BUCBpcyBTT0FQIDEuMSBhbmQgU09BUCAxLjIgY29tcGxpYW50IGFuZCBzdXBwb3J0cyBTT0FQIFJQQyBhbmQgZG9jdW1lbnQvbGl0ZXJhbCBvcGVyYXRpb25zLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitGcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgQy9DKysgbGFuZ3VhZ2UsIGEgZmV3IEMrKyBsYW5ndWFnZSBmZWF0dXJlcyBhcmUgbm90IHN1cHBvcnRlZCBieSBnU09BUCBhbmQgdGhlc2UgZmVhdHVyZXMgY2Fubm90IGJlIHVzZWQgaW4gdGhlIHNwZWNpZmljYXRpb24gb2YgU09BUCByZW1vdGUgbWV0aG9kcy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlcmUgYXJlIGNlcnRhaW4gbGltaXRhdGlvbnMgZm9yIHRoZSBmb2xsb3dpbmcgQysrIGxhbmd1YWdlIGNvbnN0cnVjdHM6DQorDQorPGRsIGNvbXBhY3Q9ImNvbXBhY3QiPg0KKyA8ZHQ+PGI+U1RMIGFuZCBTVEwgdGVtcGxhdGVzPC9iPjwvZHQ+DQorCTxkZD4gVGhlIGdTT0FQIGNvbXBpbGVyIHN1cHBvcnRzIFNUTCBzdHJpbmdzIDxpPnN0ZDo6c3RyaW5nPC9pPiBhbmQgPGk+c3RkOjp3c3RyaW5nPC9pPiAoc2VlIFNlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOnN0cmluZ3MiPjEwLjIuNjwvYT4pIGFuZCB0aGUgU1RMIGNvbnRhaW5lcnMgPGk+c3RkOjpkZXF1ZTwvaT4sIDxpPnN0ZDo6bGlzdDwvaT4sIDxpPnN0ZDo6dmVjdG9yPC9pPiwgYW5kIDxpPnN0ZDo6c2V0PC9pPiwgKHNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzp0ZW1wbGF0ZXMiPjEwLjEwLjg8L2E+KS48L2RkPg0KKyA8ZHQ+PGI+VGVtcGxhdGVzPC9iPjwvZHQ+DQorCTxkZD4gVGhlIGdTT0FQIGNvbXBpbGVyIGlzIGEgcHJlcHJvY2Vzc29yIHRoYXQgY2Fubm90IGRldGVybWluZSB0aGUgdGVtcGxhdGUgaW5zdGFudGF0aW9ucyB1c2VkIGJ5IHRoZSBtYWluIHByb2dyYW0sIG5vciBjYW4gaXQgZ2VuZXJhdGUgdGVtcGxhdGVkIGNvZGUuIFlvdSBjYW4gaG93ZXZlciBpbXBsZW1lbnQgY29udGFpbmVycyBzaW1pbGFyIHRvIHRoZSBTVEwgY29udGFpbmVycy48L2RkPg0KKyA8ZHQ+PGI+TXVsdGlwbGUgaW5oZXJpdGFuY2U8L2I+PC9kdD4NCisJPGRkPiBTaW5nbGUgY2xhc3MgaW5oZXJpdGFuY2UgaXMgc3VwcG9ydGVkLiBNdWx0aXBsZSBpbmhlcml0YW5jZSBjYW5ub3QgYmUgc3VwcG9ydGVkIGR1ZSB0byBsaW1pdGF0aW9ucyBvZiB0aGUgU09BUCBwcm90b2NvbC48L2RkPg0KKyA8ZHQ+PGI+QWJzdHJhY3QgbWV0aG9kczwvYj48L2R0Pg0KKwk8ZGQ+IEEgY2xhc3MgbXVzdCBiZSBpbnN0YW50aWF0YWJsZSB0byBhbGxvdyBkZWNvZGluZyBvZiBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzLjwvZGQ+DQorIDxkdD48Yj5EaXJlY3RpdmVzPC9iPjwvZHQ+DQorCTxkZD4gRGlyZWN0aXZlcyBhbmQgcHJhZ21hcyBzdWNoIGFzIDxpPiNpbmNsdWRlPC9pPiBhbmQgPGk+I2RlZmluZTwvaT4gYXJlIGludGVycHJldGVkIGJ5IHRoZSBnU09BUCBjb21waWxlci4NCitIb3dldmVyLCB0aGUgaW50ZXJwcmV0YXRpb24gaXMgZGlmZmVyZW50IGNvbXBhcmVkIHRvIHRoZSB1c3VhbCBoYW5kbGluZyBvZiBkaXJlY3RpdmVzLCBzZWUgU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6cHJhZ21hcyI+OC42PC9hPi4gSWYgbmVjZXNzYXJ5LCBhIHRyYWRpdGlvbmFsIEMrKw0KK3ByZXByb2Nlc3NvciBjYW4gYmUgdXNlZCBmb3IgdGhlIGludGVycHJldGF0aW9uIG9mIGRpcmVjdGl2ZXMuIEZvciBleGFtcGxlLCBVbml4IGFuZCBMaW51eCB1c2VycyBjYW4gdXNlICI8dHQ+Y3BwIC1CPC90dD4iDQordG8gZXhwYW5kIHRoZSBoZWFkZXIgZmlsZSwgZS5nLiA8dHQ+Y3BwIC1CIG15ZmlsZS5oICAtICBzb2FwY3BwMjwvdHQ+Lg0KK1VzZSB0aGUgZ1NPQVAgPGk+I2ltcG9ydDwvaT4gZGlyZWN0aXZlIHRvIGltcG9ydCBnU09BUCBoZWFkZXIgZmlsZXMsIHNlZSZuYnNwOzxhIGhyZWY9IiNzZWM6aW1wb3J0Ij44LjU8L2E+LjwvZGQ+DQorIDxkdD48Yj5DIGFuZCBDKysgcHJvZ3JhbW1pbmcgc3RhdGVtZW50czwvYj48L2R0Pg0KKwk8ZGQ+IEFsbCBjbGFzcyBtZXRob2RzIG9mIGEgY2xhc3Mgc2hvdWxkIGJlIGRlY2xhcmVkIHdpdGhpbiB0aGUgY2xhc3MgZGVjbGFyYXRpb24gaW4gdGhlIGhlYWRlciBmaWxlLCBidXQgdGhlIG1ldGhvZHMgc2hvdWxkIG5vdCBiZSBpbXBsZW1lbnRlZCBpbiBjb2RlLiBBbGwgY2xhc3MgbWV0aG9kIGltcGxlbWVudGF0aW9ucyBtdXN0IGJlIGRlZmluZWQgd2l0aGluIGFub3RoZXIgQysrIHNvdXJjZSBmaWxlIGFuZCBsaW5rZWQgdG8gdGhlIGFwcGxpY2F0aW9uLjwvZGQ+DQorPC9kbD4NCitUaGUgZm9sbG93aW5nIGRhdGEgdHlwZXMgcmVxdWlyZSBzb21lIGF0dGVudGlvbiB0byBlbnN1cmUgdGhleSBhcmUgc2VyaWFsaXplZDoNCisNCis8ZGwgY29tcGFjdD0iY29tcGFjdCI+DQorIDxkdD48Yj48aT48Yj51bmlvbjwvYj48L2k+IHR5cGVzPC9iPjwvZHQ+DQorCTxkZD4gQSA8aT48Yj51bmlvbjwvYj48L2k+IGRhdGEgdHlwZSBjYW4gbm90IGJlIHNlcmlhbGl6ZWQgdW5sZXNzIHJ1bi10aW1lIGluZm9ybWF0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCBhIDxpPjxiPnVuaW9uPC9iPjwvaT4gaW4gYSBzdHJ1Y3QvY2xhc3MgYXMgZGlzY3Vzc2VkIGluIFNlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOnVuaW9uIj4xMC42PC9hPi4gQW4gYWx0ZXJuYXRpdmUgaXMgdG8gdXNlIGEgPGk+PGI+c3RydWN0PC9iPjwvaT4gd2l0aCBhIHBvaW50ZXIgdHlwZSBmb3IgZWFjaCBmaWVsZC4gQmVjYXVzZSA8aT5OVUxMPC9pPiBwb2ludGVycyBhcmUgbm90IGVuY29kZWQsIHRoZSByZXN1bHRpbmcgZW5jb2Rpbmcgd2lsbCBhcHBlYXIgYXMgYSB1bmlvbiB0eXBlIGlmIG9ubHkgb25lIHBvaW50ZXIgZmllbGQgaXMgdmFsaWQgKGkuZS4mbmJzcDtub24tPGk+TlVMTDwvaT4pIGF0IHRoZSB0aW1lIHRoYXQgdGhlIGRhdGEgdHlwZSBpcyBlbmNvZGVkLjwvZGQ+DQorIDxkdD48Yj48aT48Yj52b2lkPC9iPjwvaT4gYW5kIDxpPjxiPnZvaWQ8L2I+KjwvaT4gdHlwZXM8L2I+PC9kdD4NCisJPGRkPiBUaGUgPGk+PGI+dm9pZDwvYj48L2k+IGRhdGEgdHlwZSBjYW5ub3QgYmUgc2VyaWFsaXplZCB1bmxlc3MgcnVuLXRpbWUgdHlwZSBpbmZvcm1hdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHBvaW50ZXIgdXNpbmcgYSA8aT48Yj5pbnQ8L2I+Jm5ic3A7X190eXBlPC9pPiBmaWVsZCBpbiB0aGUgc3RydWN0L2NsYXNzIHRoYXQgY29udGFpbnMgdGhlIDxpPjxiPnZvaWQ8L2I+KjwvaT4uIFRoZSA8aT48Yj52b2lkPC9iPio8L2k+IGRhdGEgdHlwZSBpcyB0eXBpY2FsbHkgdXNlZCB0byBwb2ludCB0byBzb21lIG9iamVjdCBvciB0byBzb21lIGFycmF5IG9mIHNvbWUgdHlwZSBvZiBvYmplY3RzIGF0IHJ1bi10aW1lLiBUaGUgY29tcGlsZXIgY2Fubm90IGRldGVybWluZSB0aGUgdHlwZSBvZiBkYXRhIHBvaW50ZWQgdG8gYW5kIHRoZSBzaXplIG9mIHRoZSBhcnJheSBwb2ludGVkIHRvLiBBIHN0cnVjdCBvciBjbGFzcyB3aXRoIGEgPGk+PGI+dm9pZDwvYj4qPC9pPiBmaWVsZCBjYW4gYmUgYXVnbWVudGVkIHRvIHN1cHBvcnQgdGhlIChkZSlzZXJpYWxpemF0aW9uIG9mIHRoZSA8aT48Yj52b2lkPC9iPio8L2k+IHVzaW5nIGEgPGk+PGI+aW50PC9iPiZuYnNwO19fdHlwZTwvaT4gZmllbGQgYXMgZGVzY3JpYmVkIGluIFNlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOnZvaWQiPjEwLjg8L2E+LjwvZGQ+DQorIDxkdD48Yj5Qb2ludGVycyB0byBzZXF1ZW5jZXMgb2YgZWxlbWVudHMgaW4gbWVtb3J5PC9iPjwvZHQ+DQorCTxkZD4gQW55IHBvaW50ZXIsIGV4Y2VwdCBmb3IgQyBzdHJpbmdzIHdoaWNoIGFyZSBwb2ludGVycyB0byBhIHNlcXVlbmNlIG9mDQorY2hhcmFjdGVycywgYXJlIHRyZWF0ZWQgYnkgdGhlIGNvbXBpbGVyIGFzIGlmIHRoZSBwb2ludGVyIHBvaW50cyB0byA8Yj5vbmx5IG9uZSBlbGVtZW50IGluIG1lbW9yeTwvYj4gYXQgcnVuLXRpbWUuIENvbnNlcXVlbnRseSwNCit0aGUgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHJvdXRpbmVzIHdpbGwgaWdub3JlIGFueSBzdWJzZXF1ZW50IGVsZW1lbnRzIHRoYXQgZm9sbG93IHRoZSBmaXJzdCBpbiBtZW1vcnkuIEZvciB0aGUgc2FtZSByZWFzb24sDQorYXJyYXlzIG9mIHVuZGV0ZXJtaW5lZCBsZW5ndGgsIGUuZy4mbmJzcDs8aT48Yj5mbG9hdDwvYj4mbmJzcDthW108L2k+IGNhbm5vdCBiZSB1c2VkLiBnU09BUCBzdXBwb3J0cyBkeW5hbWljIGFycmF5cyB1c2luZyBhIHNwZWNpYWwgdHlwZSBjb252ZW50aW9uLA0KK3NlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzpkeW5hcnJheSI+MTAuMTA8L2E+LjwvZGQ+DQorIDxkdD48Yj5VbmluaXRpYWxpemVkIHBvaW50ZXJzPC9iPjwvZHQ+DQorCTxkZD4gT2J2aW91c2x5LCBhbGwgcG9pbnRlcnMgdGhhdCBhcmUgcGFydCBvZiBhIGRhdGEgc3RydWN0dXJlIG11c3QgYmUgdmFsaWQgb3IgPGk+TlVMTDwvaT4gdG8gZW5hYmxlDQorc2VyaWFsaXphdGlvbiBvZiB0aGUgZGF0YSBzdHJ1Y3R1cmUgYXQgcnVuIHRpbWUuPC9kZD4NCis8L2RsPg0KK1RoZXJlIGFyZSBhIG51bWJlciBvZiBwcm9ncmFtbWluZyBzb2x1dGlvbnMgdGhhdCBjYW4gYmUgYWRvcHRlZCB0byBjaXJjdW12ZW50IHRoZXNlIGxpbWl0YXRpb25zLiBJbnN0ZWFkIG9mIHVzaW5nIDxpPjxiPnZvaWQ8L2I+KjwvaT4sIGEgcHJvZ3JhbQ0KK2NhbiBpbiBzb21lIGNhc2VzIGJlIG1vZGlmaWVkIHRvIHVzZSBhIHBvaW50ZXIgdG8gYSBrbm93biB0eXBlLiBJZiB0aGUgcG9pbnRlciBpcyBpbnRlbmRlZCB0byBwb2ludCB0byBkaWZmZXJlbnQgdHlwZXMgb2Ygb2JqZWN0cywgYSBnZW5lcmljDQorYmFzZSBjbGFzcyBjYW4gYmUgZGVjbGFyZWQgYW5kIHRoZSBwb2ludGVyIGlzIGRlY2xhcmVkIHRvIHBvaW50IHRvIHRoZSBiYXNlIGNsYXNzLiBBbGwgdGhlIG90aGVyIHR5cGVzIGFyZSBkZWNsYXJlZCB0byBiZSBkZXJpdmVkDQorY2xhc3NlcyBvZiB0aGlzIGJhc2UgY2xhc3MuIEZvciBwb2ludGVycyB0aGF0IHBvaW50IHRvIGEgc2VxdWVuY2Ugb2YgZWxlbWVudHMgaW4gbWVtb3J5IGR5bmFtaWMgYXJyYXlzIHNob3VsZCBiZSB1c2VkIGluc3RlYWQsDQorc2VlIDxhIGhyZWY9IiNzZWM6ZHluYXJyYXkiPjEwLjEwPC9hPi4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCSAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWM4LjExIj4NCis4LjExPC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5Db21waWxlIFRpbWUgRmxhZ3M8L2ZvbnQ+PC9oMz48YSBuYW1lPSJzZWM6Y29tcGlsZXJmbGFncyI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgZm9sbG93aW5nIG1hY3JvcyAoPGk+I2RlZmluZTwvaT5zKSBjYW4gYmUgdXNlZCB0byBlbmFibGUgY2VydGFpbiBvcHRpb25hbCBmZWF0dXJlczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNEMEQwRDAiPjx0cj48dGQ+PHNwYW4gY2xhc3M9InJvbWFuIj4NCisNCis8dGFibGU+DQorPHRyPjx0ZD48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+TWFjcm88L2I+PC9mb250PiA8L3RkPjx0ZD48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+RGVzY3JpcHRpb248L2I+PC9mb250PiA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT5XSVRIX1NPQVBERUZTX0g8L2k+CTwvdGQ+PHRkPmluY2x1ZGVzIHRoZSA8aT5zb2FwZGVmcy5oPC9pPiBmaWxlIGZvciBjdXN0b20gc2V0dGluZ3MsIHNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzpzb2FwZGVmcyI+OC4zPC9hPiA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT5XSVRIX0NPT0tJRVM8L2k+CTwvdGQ+PHRkPmVuYWJsZXMgSFRUUCBjb29raWVzLCBzZWUgU2VjdGlvbnMmbmJzcDs8YSBocmVmPSIjc2VjOmNsaWVudGNvb2tpZSI+MTguMjY8L2E+Jm5ic3A7PGEgaHJlZj0iI3NlYzpzZXJ2ZXJjb29raWUiPjE4LjI3PC9hPiA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT5XSVRIX09QRU5TU0w8L2k+CTwvdGQ+PHRkPmVuYWJsZXMgT3BlblNTTCwgc2VlIFNlY3Rpb25zJm5ic3A7PGEgaHJlZj0iI3NlYzpjbGllbnRvcGVuc3NsIj4xOC4yMDwvYT4mbmJzcDs8YSBocmVmPSIjc2VjOnNlcnZlcm9wZW5zc2wiPjE4LjE5PC9hPiA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT5XSVRIX0lQVjY8L2k+CTwvdGQ+PHRkPmVuYWJsZXMgSVB2NiBzdXBwb3J0IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPldJVEhfVENQRklOPC9pPgk8L3RkPjx0ZD51c2UgVENQIEZJTiBhZnRlciBzZW5kcyB3aGVuIHNvY2tldCBpcyByZWFkeSB0byBjbG9zZSA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT5XSVRIX0ZBU1RDR0k8L2k+CTwvdGQ+PHRkPmVuYWJsZXMgRmFzdENHSSwgc2VlIFNlY3Rpb25zJm5ic3A7PGEgaHJlZj0iI3NlYzpmYXN0Y2dpIj4xOC4yOTwvYT4gPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+V0lUSF9HWklQPC9pPgk8L3RkPjx0ZD5lbmFibGVzIGd6aXAgYW5kIGRlZmxhdGUgY29tcHJlc3Npb24sIHNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzpjb21wcmVzc2lvbiI+MTguMjU8L2E+IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPldJVEhfWkxJQjwvaT4JPC90ZD48dGQ+ZW5hYmxlcyBkZWZsYXRlIGNvbXByZXNzaW9uIG9ubHksIHNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzpjb21wcmVzc2lvbiI+MTguMjU8L2E+IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPldJVEhfVURQPC9pPgkJPC90ZD48dGQ+ZW5hYmxlcyBVRFAgc3VwcG9ydCAoU09BUC1vdmVyLVVEUCksIHNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzp1ZHAiPjE3PC9hPiA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT5XSVRIX0ZBU1Q8L2k+CTwvdGQ+PHRkPihvYnNvbGV0ZSkgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+V0lUSF9OT0lPPC9pPgk8L3RkPjx0ZD5lbGltaW5hdGVzIG5lZWQgZm9yIGZpbGUgSU8gYW5kIEJTRCBzb2NrZXQgbGlicmFyeSwgc2VlIFNlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOm5vaW8iPjE4LjMxPC9hPiA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT5XSVRIX05PSFRUUDwvaT4JPC90ZD48dGQ+ZWxpbWluYXRlcyBIVFRQIHN0YWNrIHRvIHJlZHVjZSBjb2RlIHNpemUgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+V0lUSF9MRUFOPC9pPgk8L3RkPjx0ZD5jcmVhdGVzIGEgc21hbGwtZm9vdHByaW50IGV4ZWN1dGFibGUsIHNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzpsZWFuIj4xOC4zMDwvYT4gPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+V0lUSF9MRUFORVI8L2k+CTwvdGQ+PHRkPmNyZWF0ZXMgYW4gZXZlbiBzbWFsbGVyIGZvb3RwcmludCBleGVjdXRhYmxlLCBzZWUgU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6bGVhbiI+MTguMzA8L2E+IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPldJVEhfTk9OQU1FU1BBQ0VTPC9pPjwvdGQ+PHRkPm9taXQgaW5pdGlhbGl6YXRpb24gb2Ygc29hcCBzdHJ1Y3Qgd2l0aCBnbG9iYWwgPGk+bmFtZXNwYWNlczwvaT4gdGFibGUgPC90ZD48L3RyPg0KKzx0cj48dGQ+PC90ZD48dGQ+YW5kIHlvdSBNVVNUIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZSA8aT5zb2FwLm5hbWVzcGFjZXM8L2k+IHRvIHBvaW50IHRvIGEgdGFibGUgPC90ZD48L3RyPg0KKzx0cj48dGQ+PC90ZD48dGQ+c2VlIGFsc28gU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6bnN0YWJsZSI+OS40PC9hPiA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT5XSVRIX05PR0xPQkFMPC9pPgk8L3RkPjx0ZD5vbWl0IFNPQVAgSGVhZGVyIGFuZCBGYXVsdCBzZXJpYWxpemF0aW9uIGNvZGUgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+V0lUSF9DREFUQTwvaT4JPC90ZD48dGQ+cmV0YWluIHRoZSBwYXJzZWQgQ0RBVEEgc2VjdGlvbnMgaW4gbGl0ZXJhbCBYTUwgc3RyaW5ncyAobm8gY29udmVyc2lvbikgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+V0lUSF9DQVNFSU5TRU5TSVRJVkVUQUdTPC9pPgk8L3RkPjx0ZD5lbmFibGUgY2FzZSBpbnNlbnNpdGl2ZSBYTUwgcGFyc2luZyA8L3RkPjwvdHI+PC90YWJsZT4NCisNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9zcGFuPg0KKzxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5DYXV0aW9uPC9iPjwvZm9udD46IGl0IGlzIGltcG9ydGFudCB0aGF0IHRoZSBtYWNyb3MgTVVTVCBiZSBjb25zaXN0ZW50bHkgZGVmaW5lZCB0bw0KK2NvbXBpbGUgdGhlIHNvdXJjZXMsIHN1Y2ggYXMgPGk+c3Rkc29hcDIuY3BwPC9pPiwgPGk+c29hcEMuY3BwPC9pPiwNCis8aT5zb2FwQ2xpZW50LmNwcDwvaT4sIDxpPnNvYXBTZXJ2ZXIuY3BwPC9pPiwgYW5kIGFsbCBhcHBsaWNhdGlvbiBzb3VyY2VzIHRoYXQNCitpbmNsdWRlIDxpPnN0ZHNvYXAyLmg8L2k+IG9yIDxpPnNvYXBILmg8L2k+LiBJZiB0aGUgbWFjcm9zIGFyZSBub3QgY29uc2lzdGVudGx5DQordXNlZCwgdGhlIGFwcGxpY2F0aW9uIHdpbGwgY3Jhc2ggZHVlIHRvIGEgbWlzbWF0Y2hlcyBpbiB0aGUgZGVjbGFyYXRpb24gYW5kDQorYWNjZXNzIG9mIHRoZSBnU09BUCBlbnZpcm9ubWVudC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCSAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWM4LjEyIj4NCis4LjEyPC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5SdW4gVGltZSBGbGFnczwvZm9udD48L2gzPjxhIG5hbWU9InNlYzpmbGFncyI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitnU09BUCBwcm92aWRlcyBmbGFncyB0byBjb250cm9sIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vZGUgc2V0dGluZ3MgYXQgcnVudGltZS4NCitUaGVzZSBmbGFncyBhcmUgZGl2aWRlZCBpbnRvIGZvdXIgY2F0ZWdvcmllczogdHJhbnNwb3J0IChJTyksIGNvbnRlbnQgZW5jb2RpbmcNCisoRU5DKSwgWE1MIG1hcnNoYWxsaW5nIChYTUwpLCBhbmQgQy9DKysgZGF0YSBtYXBwaW5nIChDKS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorQWx0aG91Z2ggZ1NPQVAgaXMgZnVsbHkgU09BUCAxLjEgY29tcGxpYW50LCBzb21lIFNPQVAgaW1wbGVtZW50YXRpb25zIG1heSBoYXZlDQordHJvdWJsZSBhY2NlcHRpbmcgbXVsdGktcmVmZXJlbmNlIGRhdGEgYW5kL29yIHJlcXVpcmUgZXhwbGljaXQgbmlsIGRhdGEgc28NCit0aGVzZSBmbGFncyBjYW4gYmUgdXNlZCB0byBwdXQgZ1NPQVAgaW4gInNhZmUgbW9kZSIuICBJbiBhZGRpdGlvbiwgdGhlDQorZW1iZWRkaW5nIChvciBpbmxpbmluZykgb2YgbXVsdGktcmVmZXJlbmNlIGRhdGEgaXMgYWRvcHRlZCBpbiB0aGUgU09BUCAxLjINCitzcGVjaWZpY2F0aW9uLCB3aGljaCBnU09BUCBhdXRvbWF0aWNhbGx5IHN1cHBvcnRzIHdoZW4gaGFuZGxpbmcgd2l0aCBTT0FQIDEuMg0KK21lc3NhZ2VzLiAgVGhlIGZsYWdzIGFyZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNEMEQwRDAiPjx0cj48dGQ+PHNwYW4gY2xhc3M9InJvbWFuIj4NCisNCis8dGFibGU+DQorPHRyPjx0ZD48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+RmxhZzwvYj48L2ZvbnQ+IDwvdGQ+PHRkPjxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5EZXNjcmlwdGlvbjwvYj48L2ZvbnQ+IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPlNPQVBfSU9fRkxVU0g8L2k+IDwvdGQ+PHRkPkRpc2FibGUgYnVmZmVyaW5nIGFuZCBmbHVzaCBvdXRwdXQgKGRlZmF1bHQgZm9yIGFsbCBmaWxlLWJhc2VkIG91dHB1dCkgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+U09BUF9JT19CVUZGRVI8L2k+IDwvdGQ+PHRkPkVuYWJsZSBidWZmZXJpbmcgKGRlZmF1bHQgZm9yIGFsbCBzb2NrZXQtb3JpZW50ZWQgY29ubmVjdGlvbnMpIDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPlNPQVBfSU9fU1RPUkU8L2k+IDwvdGQ+PHRkPlN0b3JlIGVudGlyZSBtZXNzYWdlIHRvIGNhbGN1bGF0ZSBIVFRQIGNvbnRlbnQgbGVuZ3RoIDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPlNPQVBfSU9fQ0hVTks8L2k+IDwvdGQ+PHRkPlVzZSBIVFRQIGNodW5raW5nIDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPlNPQVBfSU9fTEVOR1RIPC9pPiA8L3RkPjx0ZD5SZXF1aXJlIGFwcmlvcmkgY2FsY3VsYXRpb24gb2YgY29udGVudCBsZW5ndGggKHRoaXMgaXMgYXV0b21hdGljKSA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT5TT0FQX0lPX0tFRVBBTElWRTwvaT4gPC90ZD48dGQ+QXR0ZW1wdCB0byBrZWVwIHNvY2tldCBjb25uZWN0aW9ucyBhbGl2ZSAob3BlbikgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+U09BUF9JT19VRFA8L2k+IDwvdGQ+PHRkPlVzZSBVRFAgKGRhdGFncmFtKSB0cmFuc3BvcnQsIG1heGltdW0gbWVzc2FnZSBsZW5ndGggaXMgPGk+U09BUF9CVUZMRU48L2k+IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPlNPQVBfRU5DX1hNTDwvaT4gPC90ZD48dGQ+VXNlIHBsYWluIFhNTCBlbmNvZGluZyB3aXRob3V0IEhUVFAgaGVhZGVycyAodXNlZnVsIHdpdGggPGk+U09BUF9FTkNfWkxJQjwvaT4pIDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPlNPQVBfRU5DX0RJTUU8L2k+IDwvdGQ+PHRkPlVzZSBESU1FIGVuY29kaW5nIChhdXRvbWF0aWMgd2hlbiBESU1FIGF0dGFjaG1lbnRzIGFyZSB1c2VkKSA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT5TT0FQX0VOQ19NSU1FPC9pPiA8L3RkPjx0ZD5Vc2UgTUlNRSBlbmNvZGluZyAoYWN0aXZhdGUgdXNpbmcgPGk+c29hcF9zZXRfbWltZTwvaT4pIDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPlNPQVBfRU5DX01UT008L2k+IDwvdGQ+PHRkPlVzZSBNVE9NIFhPUCBhdHRhY2htZW50cyAoaW5zdGVhZCBvZiBESU1FKSA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT5TT0FQX0VOQ19aTElCPC9pPiA8L3RkPjx0ZD5Db21wcmVzcyBlbmNvZGluZyB3aXRoIFpsaWIgKGRlZmxhdGUgb3IgZ3ppcCBmb3JtYXQpIDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPlNPQVBfRU5DX1NTTDwvaT4gPC90ZD48dGQ+RW5jcnlwdCBlbmNvZGluZyB3aXRoIFNTTCAoYXV0b21hdGljIHdpdGggImh0dHBzOiIgZW5kcG9pbnRzKSA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT5TT0FQX1hNTF9JTkRFTlQ8L2k+IDwvdGQ+PHRkPlByb2R1Y2UgaW5kZW50ZWQgWE1MIG91dHB1dCA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT5TT0FQX1hNTF9DQU5PTklDQUw8L2k+IDwvdGQ+PHRkPlByb2R1Y2UgY2Fub25pY2FsIFhNTCBvdXRwdXQgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+U09BUF9YTUxfU1RSSUNUPC9pPiA8L3RkPjx0ZD5YTUwgc3RyaWN0IHZhbGlkYXRpb24gPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+U09BUF9YTUxfVFJFRTwvaT4gPC90ZD48dGQ+U2VyaWFsaXplIGRhdGEgYXMgWE1MIHRyZWVzIChubyBtdWx0aS1yZWYsIGR1cGxpY2F0ZSBkYXRhIHdoZW4gbmVjZXNzYXJ5KSA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT5TT0FQX1hNTF9HUkFQSDwvaT4gPC90ZD48dGQ+U2VyaWFsaXplIGRhdGEgYXMgYW4gWE1MIGdyYXBoIHdpdGggaW5saW5lIG11bHRpLXJlZiAoU09BUCAxLjIgZGVmYXVsdCkgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+U09BUF9YTUxfTklMPC9pPiA8L3RkPjx0ZD5TZXJpYWxpemUgTlVMTCBkYXRhIGFzIHhzaTpuaWwgZWxlbWVudHMgKG9taXQgYnkgZGVmYXVsdCkgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+U09BUF9DX05PSU9CPC9pPiA8L3RkPjx0ZD5EbyBub3QgZmF1bHQgd2l0aCA8aT5TT0FQX0lPQjwvaT4gPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+U09BUF9DX1VURlNUUklORzwvaT4gPC90ZD48dGQ+KERlKXNlcmlhbGl6ZSA4LWJpdCBzdHJpbmdzICJhcyBpcyIgKHN0cmluZ3MgTVVTVCBoYXZlIFVURi04IGVuY29kZWQgY29udGVudCkgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+U09BUF9DX01CU1RSSU5HPC9pPiA8L3RkPjx0ZD5BY3RpdmF0ZSBtdWx0aWJ5dGUgY2hhcmFjdGVyIHN1cHBvcnQgKGRlcGVuZHMgb24gbG9jYWxlKSA8L3RkPjwvdHI+PC90YWJsZT4NCisNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9zcGFuPg0KK1RoZSBmbGFncyBjYW4gYmUgc2VsZWN0aXZlbHkgdHVybmVkIG9uL29mZiBhdCBhbnkgdGltZSwgZm9yIGV4YW1wbGUgd2hlbg0KK211bHRpcGxlIFdlYiBzZXJ2aWNlcyBhcmUgYWNjZXNzZWQgYnkgYSBjbGllbnQgdGhhdCByZXF1aXJlIHNwZWNpYWwgdHJlYXRtZW50Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitBbGwgZmxhZ3MgYXJlIG9ydGhvZ29uYWwsIGV4Y2VwdA0KKzxpPlNPQVBfSU9fRkxVU0g8L2k+LA0KKzxpPlNPQVBfSU9fQlVGRkVSPC9pPiwNCis8aT5TT0FQX0lPX1NUT1JFPC9pPiwgYW5kDQorPGk+U09BUF9JT19DSFVOSzwvaT4NCit3aGljaCBhcmUgZW51bWVyYXRpb25zIGFuZCBvbmx5IG9uZSBvZiB0aGVzZSBJL08gZmxhZ3MgY2FuIGJlIHVzZWQuICBBbHNvIHRoZQ0KK1hNTCBzZXJpYWxpemF0aW9uIGZsYWdzDQorPGk+U09BUF9YTUxfVFJFRTwvaT4gYW5kDQorPGk+U09BUF9YTUxfR1JBUEg8L2k+IHNob3VsZCBub3QgYmUgbWl4ZWQuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBmbGFncyBjb250cm9sIHRoZSBpbmJvdW5kIGFuZCBvdXRib3VuZCBtZXNzYWdlIHRyYW5zcG9ydCwgZW5jb2RpbmcsIGFuZA0KKyhkZSlzZXJpYWxpemF0aW9uLiAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gc2V0IGFuZCByZXNldCB0aGUgZmxhZ3MNCitmb3IgaW5wdXQgYW5kIG91dHB1dCBtb2RlczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNEMEQwRDAiPjx0cj48dGQ+PHNwYW4gY2xhc3M9InJvbWFuIj4NCisNCis8dGFibGU+DQorPHRyPjx0ZD48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+RnVuY3Rpb248L2I+PC9mb250PiA8L3RkPjx0ZD48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+RGVzY3JpcHRpb248L2I+PC9mb250PiA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT5zb2FwX2luaXQyKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCBpbnQgaW1vZGUsIGludCBvbW9kZSk8L2k+IDwvdGQ+PHRkPkluaXRpYWxpemUgdGhlIHJ1bnRpbWUgYW5kIHNldCBmbGFncyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT5zb2FwX2ltb2RlKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCBpbnQgaW1vZGUpPC9pPiA8L3RkPjx0ZD5TZXQgYWxsIGlucHV0IG1vZGUgZmxhZ3MgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+c29hcF9vbW9kZSg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgaW50IG9tb2RlKTwvaT4gPC90ZD48dGQ+U2V0IGFsbCBvdXRwdXQgbW9kZSBmbGFncyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT5zb2FwX3NldF9pbW9kZSg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgaW50IGltb2RlKTwvaT4gPC90ZD48dGQ+RW5hYmxlIGlucHV0IG1vZGUgZmxhZ3MgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+c29hcF9zZXRfb21vZGUoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIGludCBvbW9kZSk8L2k+IDwvdGQ+PHRkPkVuYWJsZSBvdXRwdXQgbW9kZSBmbGFncyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT5zb2FwX2Nscl9pbW9kZSg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgaW50IG9tb2RlKTwvaT4gPC90ZD48dGQ+RGlzYWJsZSBpbnB1dCBtb2RlIGZsYWdzIDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPnNvYXBfY2xyX29tb2RlKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCBpbnQgb21vZGUpPC9pPiA8L3RkPjx0ZD5EaXNhYmxlIG91dHB1dCBtb2RlIGZsYWdzIDwvdGQ+PC90cj48L3RhYmxlPg0KKw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQorVGhlIGRlZmF1bHQgc2V0dGluZyBpcyA8aT5TT0FQX0lPX0RFRkFVTFQ8L2k+IGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQgbW9kZXMuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0ZvciBleGFtcGxlDQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwIHNvYXA7IDxiciAvPg0KK3NvYXBfaW5pdDIoJmFtcDtzb2FwLCBTT0FQX0lPX0tFRVBBTElWRSwgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7U09BUF9JT19LRUVQQUxJVkUgfCBTT0FQX0VOQ19aTElCIHwgU09BUF9YTUxfVFJFRSB8IFNPQVBfWE1MX0NBTk9OSUNBTCk7IDxiciAvPg0KKzxiPmlmPC9iPiZuYnNwOyhzb2FwX2NhbGxfbnNfX215TWV0aG9kKCZhbXA7c29hcCwgLi4uKSkgPGJyIC8+DQorLi4uDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitzZW5kcyBhIGNvbXByZXNzZWQgY2xpZW50IHJlcXVlc3Qgd2l0aCBrZWVwLWFsaXZlIGVuYWJsZWQgYW5kIGFsbCBkYXRhIHNlcmlhbGl6ZWQgYXMgY2Fub25pY2FsIFhNTCB0cmVlcy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorSW4gbWFueSBjYXNlcywgc2V0dGluZyB0aGUgaW5wdXQgbW9kZSB3aWxsIGhhdmUgbm8gZWZmZWN0LCBlc3BlY2lhbGx5IHdpdGggSFRUUA0KK3RyYW5zcG9ydCBiZWNhdXNlIGdTT0FQIHdpbGwgZGV0ZXJtaW5lIHRoZSBvcHRpbWFsIGlucHV0IGJ1ZmZlcmluZyBhbmQgdGhlDQorZW5jb2RpbmcgdXNlZCBmb3IgYW4gaW5ib3VuZCBtZXNzYWdlLiBUaGUgZmxhZ3MgdGhhdCBoYXZlIGFuIGVmZmVjdCBvbg0KK2hhbmRsaW5nIGluYm91bmQgbWVzc2FnZXMgYXJlIDxpPlNPQVBfSU9fS0VFUEFMSVZFPC9pPiwgPGk+U09BUF9FTkNfU1NMPC9pPg0KKyhidXQgYXV0b21hdGljIHdoZW4gImh0dHBzOiIgZW5kcG9pbnRzIGFyZSB1c2VkIG9yIDxpPnNvYXBfc3NsX2FjY2VwdDwvaT4pLA0KKzxpPlNPQVBfQ19OT0lPQjwvaT4sIDxpPlNPQVBfQ19VVEZTVFJJTkc8L2k+LCBhbmQgPGk+U09BUF9DX01CU1RSSU5HPC9pPi4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorPGZvbnQgY29sb3I9IiNGRjAwMDAiPjxiPkNhdXRpb248L2I+PC9mb250PjogVGhlIDxpPlNPQVBfWE1MX1RSRUU8L2k+IHNlcmlhbGl6YXRpb24gZmxhZyBjYW4gYmUgdXNlZCB0bw0KK2ltcHJvdmUgaW50ZXJvcGVyYWJpbGl0eSB3aXRoIFNPQVAgaW1wbGVtZW50YXRpb25zIHRoYXQgYXJlIG5vdCBmdWxseSBTT0FQIDEuMQ0KK2NvbXBsaWFudC4gIEhvd2V2ZXIsIGEgdHJlZSBzZXJpYWxpemF0aW9uIHdpbGwgZHVwbGljYXRlIGRhdGEgd2hlbiBuZWNlc3NhcnkNCithbmQgd2lsbCBjcmFzaCB0aGUgc2VyaWFsaXplciBmb3IgY3ljbGljIGRhdGEgc3RydWN0dXJlcy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCSAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWM4LjEzIj4NCis4LjEzPC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5NZW1vcnkgTWFuYWdlbWVudDwvZm9udD48L2gzPjxhIG5hbWU9InNlYzptZW1vcnkiPg0KKzwvYT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVW5kZXJzdGFuZGluZyBnU09BUCdzIHJ1bi10aW1lIG1lbW9yeSBtYW5hZ2VtZW50IGlzIGltcG9ydGFudCB0byBvcHRpbWl6ZQ0KK2NsaWVudCBhbmQgc2VydmljZSBhcHBsaWNhdGlvbnMgYnkgZWxpbWluYXRpbmcgbWVtb3J5IGxlYWtzIGFuZC9vciBkYW5nbGluZw0KK3JlZmVyZW5jZXMuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZXJlIGFyZSB0d28gZm9ybXMgb2YgZHluYW1pYyAoaGVhcCkgYWxsb2NhdGlvbnMgbWFkZSBieSBnU09BUCdzIHJ1bnRpbWUgZm9yDQorc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uIG9mIGRhdGEuICBUZW1wb3JhcnkgZGF0YSBpcyBjcmVhdGVkIGJ5IHRoZQ0KK3J1bnRpbWUgc3VjaCBhcyBoYXNoIHRhYmxlcyB0byBrZWVwIHBvaW50ZXIgcmVmZXJlbmNlIGluZm9ybWF0aW9uIGZvcg0KK3NlcmlhbGl6YXRpb24gYW5kIGhhc2ggdGFibGVzIHRvIGtlZXAgWE1MIGlkL2hyZWYgaW5mb3JtYXRpb24gZm9yDQorbXVsdGktcmVmZXJlbmNlIG9iamVjdCBkZXNlcmlhbGl6YXRpb24uICBEZXNlcmlhbGl6ZWQgZGF0YSBpcyBjcmVhdGVkIHVwb24NCityZWNlaXZpbmcgU09BUCBtZXNzYWdlcy4gIFRoaXMgZGF0YSBpcyBzdG9yZWQgb24gdGhlIGhlYXAgYW5kIHJlcXVpcmVzIHNldmVyYWwNCitjYWxscyB0byB0aGUgPGk+bWFsbG9jPC9pPiBsaWJyYXJ5IGZ1bmN0aW9uIHRvIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgZGF0YSBhbmQNCis8aT48Yj5uZXc8L2I+PC9pPiB0byBjcmVhdGUgY2xhc3MgaW5zdGFuY2VzLiAgQWxsIHN1Y2ggYWxsb2NhdGlvbnMgYXJlIHRyYWNrZWQgYnkNCitnU09BUCdzIHJ1bnRpbWUgYnkgbGlua2VkIGxpc3RzIGZvciBsYXRlciBkZWFsbG9jYXRpb24uICBUaGUgbGlua2VkIGxpc3QgZm9yDQorPGk+bWFsbG9jPC9pPiBhbGxvY2F0aW9ucyB1c2VzIHNvbWUgZXh0cmEgc3BhY2UgaW4gZWFjaCA8aT5tYWxsb2M8L2k+ZWQgYmxvY2sgdG8NCitmb3JtIGEgY2hhaW4gb2YgcG9pbnRlcnMgdGhyb3VnaCB0aGUgPGk+bWFsbG9jPC9pPmVkIGJsb2Nrcy4gIEEgc2VwYXJhdGUNCis8aT5tYWxsb2M8L2k+ZWQgbGlua2VkIGxpc3QgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIGNsYXNzIGluc3RhbmNlIGFsbG9jYXRpb25zLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitnU09BUCBkb2VzIG5vdCBlbmZvcmNlIGEgZGVhbGxvY2F0aW9uIHBvbGljeSBhbmQgdGhlIHVzZXIgY2FuIGFkb3B0IGENCitkZWFsbG9jYXRpb24gcG9saWN5IHRoYXQgd29ya3MgYmVzdCBmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uLiAgQXMgYQ0KK2NvbnNlcXVlbmNlLCBkZXNlcmlhbGl6ZWQgZGF0YSBpcyBuZXZlciBkZWFsbG9jYXRlZCBieSB0aGUgZ1NPQVAgcnVudGltZSB1bmxlc3MNCit0aGUgdXNlciBleHBsaWNpdGx5IGZvcmNlcyBkZWFsbG9jYXRpb24gYnkgY2FsbGluZyBmdW5jdGlvbnMgdG8gZGVhbGxvY2F0ZSBkYXRhDQorY29sbGVjdGl2ZWx5IG9yIGluZGl2aWR1YWxseS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIGRlYWxsb2NhdGlvbiBmdW5jdGlvbnMgYXJlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKw0KKzx0YWJsZT4NCis8dHI+PHRkPjxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5GdW5jdGlvbiBDYWxsPC9iPjwvZm9udD4gPC90ZD48dGQ+PGZvbnQgY29sb3I9IiNGRjAwMDAiPjxiPkRlc2NyaXB0aW9uPC9iPjwvZm9udD4gPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+c29hcF9lbmQoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXApPC9pPiA8L3RkPjx0ZD5SZW1vdmUgdGVtcG9yYXJ5IGRhdGEgYW5kIGRlc2VyaWFsaXplZCBkYXRhIGV4Y2VwdCA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjx0ZD5jbGFzcyBpbnN0YW5jZXMgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+c29hcF9mcmVlKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwKTwvaT4gPC90ZD48dGQ+UmVtb3ZlIHRlbXBvcmFyeSBkYXRhIG9ubHkgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+c29hcF9kZXN0cm95KDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwKTwvaT4gPC90ZD48dGQ+UmVtb3ZlIGFsbCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgY2xhc3MgaW5zdGFuY2VzLiA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjx0ZD5OZWVkIHRvIGJlIGNhbGxlZCBiZWZvcmUgPGk+c29hcF9lbmQoKTwvaT4gPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+c29hcF9kZWFsbG9jKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj52b2lkPC9iPiZuYnNwOypwKTwvaT4gPC90ZD48dGQ+UmVtb3ZlIG1hbGxvY2VkIGRhdGEgYXQgPGk+cDwvaT4uIFdoZW4gPGk+cD09TlVMTDwvaT46IHJlbW92ZSBhbGwgPC90ZD48L3RyPg0KKzx0cj48dGQ+PC90ZD48dGQ+ZHluYW1pY2FsbHkgYWxsb2NhdGVkIChkZXNlcmlhbGl6ZWQpIGRhdGEgZXhjZXB0IGNsYXNzIGluc3RhbmNlcyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT5zb2FwX2RlbGV0ZSg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgPGI+dm9pZDwvYj4mbmJzcDsqcCk8L2k+IDwvdGQ+PHRkPlJlbW92ZSBjbGFzcyBpbnN0YW5jZSBhdCA8aT5wPC9pPi4gV2hlbiA8aT5wPT1OVUxMPC9pPjogcmVtb3ZlIGFsbCA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjx0ZD5keW5hbWljYWxseSBhbGxvY2F0ZWQgKGRlc2VyaWFsaXplZCkgY2xhc3MgaW5zdGFuY2VzIDwvdGQ+PC90cj4NCis8dHI+PHRkPjwvdGQ+PHRkPih0aGlzIGlzIGlkZW50aWNhbCB0byBjYWxsaW5nIHNvYXBfZGVzdHJveSg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCkpIDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPnNvYXBfdW5saW5rKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj52b2lkPC9iPiZuYnNwOypwKTwvaT4gPC90ZD48dGQ+VW5saW5rIGRhdGEvb2JqZWN0IGF0IDxpPnA8L2k+IGZyb20gZ1NPQVAncyBkZWFsbG9jYXRpb24gY2hhaW4gPC90ZD48L3RyPg0KKzx0cj48dGQ+PC90ZD48dGQ+c28gZ1NPQVAgd29uJ3QgZGVhbGxvY2F0ZSBpdCA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT5zb2FwX2RvbmUoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXApPC9pPiA8L3RkPjx0ZD5SZXNldDogY2xvc2UgbWFzdGVyL3NsYXZlIHNvY2tldHMgYW5kIHJlbW92ZSBjYWxsYmFja3MgPC90ZD48L3RyPg0KKzx0cj48dGQ+PC90ZD48dGQ+KHNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzpjYWxsYmFjayI+MTguNzwvYT4gPC90ZD48L3RyPjwvdGFibGU+DQorDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvc3Bhbj4NCitUZW1wb3JhcnkgZGF0YSAoaS5lLiZuYnNwO3RoZSBoYXNoIHRhYmxlcykgYXJlIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCB3aXRoIGNhbGxzIHRvDQordGhlIDxpPnNvYXBfZnJlZTwvaT4gZnVuY3Rpb24gd2hpY2ggaXMgbWFkZSB3aXRoaW4gPGk+c29hcF9lbmQ8L2k+IGFuZA0KKzxpPnNvYXBfZG9uZTwvaT4gb3Igd2hlbiB0aGUgbmV4dCBjYWxsIHRvIGEgc3R1YiBvciBza2VsZXRvbiByb3V0aW5lIGlzIG1hZGUgdG8NCitzZW5kIGEgbWVzc2FnZSBvciByZWNlaXZlIGEgbWVzc2FnZS4gIERlYWxsb2NhdGlvbiBvZiBub24tY2xhc3MgYmFzZWQgZGF0YSBpcw0KK3N0cmFpZ2h0Zm9yd2FyZDogPGk+c29hcF9lbmQ8L2k+IHJlbW92ZXMgYWxsIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBkZXNlcmlhbGl6ZWQNCitkYXRhIChkYXRhIGFsbG9jYXRlZCB3aXRoIDxpPnNvYXBfbWFsbG9jPC9pPi4gIFRoYXQgaXMsIHdoZW4gdGhlIGNsaWVudC9zZXJ2aWNlDQorYXBwbGljYXRpb24gZG9lcyBub3QgdXNlIGFueSBjbGFzcyBpbnN0YW5jZXMgdGhhdCBhcmUgKGRlKW1hcnNoYWxsZWQsIGJ1dCB1c2VzDQorc3RydWN0cywgYXJyYXlzLCBldGMuLCB0aGVuIGNhbGxpbmcgdGhlIDxpPnNvYXBfZW5kPC9pPiBmdW5jdGlvbiBpcyBzYWZlIHRvDQorcmVtb3ZlIGFsbCBkZXNlcmlhbGl6ZWQgZGF0YS4gIFRoZSBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGFmdGVyIHByb2Nlc3NpbmcgdGhlDQorZGVzZXJpYWxpemVkIGRhdGEgb2YgYSByZW1vdGUgbWV0aG9kIGNhbGwgb3IgYWZ0ZXIgYSBudW1iZXIgb2YgcmVtb3RlIG1ldGhvZA0KK2NhbGxzIGhhdmUgYmVlbiBtYWRlLiAgVGhlIGZ1bmN0aW9uIGlzIGFsc28gdHlwaWNhbGx5IGNhbGxlZCBhZnRlcg0KKzxpPnNvYXBfc2VydmU8L2k+LCB3aGVuIHRoZSBzZXJ2aWNlIGZpbmlzaGVkIHNlbmRpbmcgdGhlIHJlc3BvbnNlIHRvIGEgY2xpZW50DQorYW5kIHRoZSBkZXNlcmlhbGl6ZWQgY2xpZW50IHJlcXVlc3QgZGF0YSBjYW4gYmUgcmVtb3ZlZC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorSW5kaXZpZHVhbCBkYXRhIG9iamVjdHMgY2FuIGJlIHVubGlua2VkIGZyb20gdGhlIGRlYWxsb2NhdGlvbiBjaGFpbiBpZg0KK25lY2Vzc2FyeSwgdG8gcHJldmVudCBkZWFsbG9jYXRpb24gYnkgdGhlIGNvbGxlY3RpdmUgPGk+c29hcF9lbmQ8L2k+IG9yDQorPGk+c29hcF9kZXN0cm95PC9pPiBmdW5jdGlvbnMuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkgICAgICA8aDQ+PGEgbmFtZT0idHRoX3NFYzguMTMuMSI+DQorOC4xMy4xPC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5NZW1vcnkgTWFuYWdlbWVudCBQb2xpY2llczwvZm9udD48L2g0Pg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGVyZSBhcmUgdGhyZWUgc2l0dWF0aW9ucyB0byBjb25zaWRlciBmb3IgbWVtb3J5IGRlYWxsb2NhdGlvbiBwb2xpY2llcyBmb3IgY2xhc3MgaW5zdGFuY2VzOg0KKw0KKzxvbCB0eXBlPSIxIj4NCis8bGk+IHRoZSBwcm9ncmFtIGNvZGUgZGVsZXRlcyB0aGUgY2xhc3MNCitpbnN0YW5jZXMgYW5kIHRoZSBjbGFzcyBkZXN0cnVjdG9ycyBpbiB0dXJuIFNIT1VMRCBkZWxldGUgYW5kIGZyZWUgYW55IGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBkYXRhIChkZWVwIGRlYWxsb2NhdGlvbikgd2l0aG91dA0KK2NhbGxpbmcgdGhlIDxpPnNvYXBfZW5kPC9pPiBhbmQgPGk+c29hcF9kZXN0cm95PC9pPiBmdW5jdGlvbnMsDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorDQorPGxpPiBvciB0aGUgY2xhc3MNCitkZXN0cnVjdG9ycyBTSE9VTEQgTk9UIGRlYWxsb2NhdGUgYW55IGRhdGEgYW5kIHRoZSA8aT5zb2FwX2VuZDwvaT4gYW5kIDxpPnNvYXBfZGVzdHJveTwvaT4gZnVuY3Rpb25zIGNhbiBiZSBjYWxsZWQgdG8gcmVtb3ZlDQordGhlIGRhdGEuDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorDQorPGxpPiBvciB0aGUgY2xhc3MNCitkZXN0cnVjdG9ycyBTSE9VTEQgbWFyayB0aGVpciBvd24gZGVhbGxvY2F0aW9uIGFuZCBtYXJrIHRoZSBkZWFsbG9jYXRpb24gb2YgYW55IG90aGVyIGRhdGEgZGVhbGxvY2F0ZWQgYnkgaXQncyBkZXN0cnVjdG9ycw0KK2J5IGNhbGxpbmcgdGhlIDxpPnNvYXBfdW5saW5rPC9pPiBmdW5jdGlvbi4gVGhpcyBhbGxvd3MNCis8aT5zb2FwX2Rlc3Ryb3k8L2k+IGFuZCA8aT5zb2FwX2VuZDwvaT4gdG8gcmVtb3ZlIHRoZSByZW1haW5pbmcgaW5zdGFuY2VzIGFuZCBkYXRhIHdpdGhvdXQgY2F1c2luZyBkdXBsaWNhdGUgZGVhbGxvY2F0aW9ucy4NCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorPC9saT4NCis8L29sPg0KK0l0IGlzIGFkdmlzZWQgdG8gdXNlIHBvaW50ZXJzIHRvIGNsYXNzIGluc3RhbmNlcyB0aGF0IGFyZSB1c2VkIHdpdGhpbiBvdGhlciBzdHJ1Y3RzIGFuZCBjbGFzc2VzIHRvIGF2b2lkIHRoZSBjcmVhdGlvbiBvZiB0ZW1wb3JhcnkNCitjbGFzcyBpbnN0YW5jZXMgZHVyaW5nIGRlc2VyaWFsaXphdGlvbi4gVGhlIHByb2JsZW0gd2l0aCB0ZW1wb3JhcnkgY2xhc3MgaW5zdGFuY2VzIGlzIHRoYXQgdGhlIGRlc3RydWN0b3Igb2YgdGhlIHRlbXBvcmFyeSBtYXkgYWZmZWN0IGRhdGEgdXNlZCBieQ0KK290aGVyIGluc3RhbmNlcyB0aHJvdWdoIHRoZSBzaGFyaW5nIG9mIGRhdGEgcGFydHMgYWNjZXNzZWQgd2l0aCBwb2ludGVycy4gVGVtcG9yYXJpZXMgYW5kIGV2ZW4gd2hvbGUgY29waWVzIG9mIGNsYXNzIGluc3RhbmNlcw0KK2NhbiBiZSBjcmVhdGVkIHdoZW4gZGVzZXJpYWxpemluZyBTT0FQIG11bHRpLXJlZmVyZW5jZWQgb2JqZWN0cy4NCitBIGR5bmFtaWMgYXJyYXkgb2YgY2xhc3MgaW5zdGFuY2VzIGlzIHNpbWlsYXI6IHRlbXBvcmFyaWVzIG1heSBiZSBjcmVhdGVkIHRvIGZpbGwgdGhlIGFycmF5IHVwb24gZGVzZXJpYWxpemF0aW9uLiBUbyBhdm9pZA0KK3Byb2JsZW1zLCB1c2UgZHluYW1pYyBhcnJheXMgb2YgcG9pbnRlcnMgdG8gY2xhc3MgaW5zdGFuY2VzLiBUaGlzIGFsc28gZW5hYmxlcyB0aGUgZXhjaGFuZ2Ugb2YgcG9seW1vcnBoaWMgYXJyYXlzIHdoZW4gdGhlDQorZWxlbWVudHMgYXJlIGluc3RhbmNlcyBvZiBjbGFzc2VzIGluIGFuIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4NCitJbiBhZGRpdGlvbiwgYWxsb2NhdGUgZGF0YSBhbmQgY2xhc3MgaW5zdGFuY2VzIHdpdGggPGk+c29hcF9tYWxsb2M8L2k+IGFuZCA8aT5zb2FwX25ld19YPC9pPiBmdW5jdGlvbnMgKG1vcmUgZGV0YWlscyBiZWxvdykuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RvIHN1bW1hcml6ZSwgaXQgaXMgYWR2aXNlZCB0byBwYXNzIGNsYXNzIGRhdGEgdHlwZXMgYnkgcG9pbnRlciB0byBhIHJlbW90ZSBtZXRob2QuIEZvciBleGFtcGxlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5jbGFzczwvYj4mbmJzcDtYIHsgLi4uIH07IDxiciAvPg0KK25zX19yZW1vdGVNZXRob2QoWCAqaW4sIC4uLik7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitSZXNwb25zZSBlbGVtZW50cyB0aGF0IGFyZSBjbGFzcyBkYXRhIHR5cGVzIGNhbiBiZSBwYXNzZWQgYnkgcmVmZXJlbmNlLCBhcyBpbjoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7WCB7IC4uLiB9OyA8YnIgLz4NCis8Yj5jbGFzczwvYj4mbmJzcDtuc19fcmVtb3RlTWV0aG9kUmVzcG9uc2UgeyAuLi4gfTsgPGJyIC8+DQorbnNfX3JlbW90ZU1ldGhvZChYICppbiwgbnNfX3JlbW90ZU1ldGhvZFJlc3BvbnNlICZhbXA7b3V0KTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK0J1dCBkeW5hbWljIGFycmF5cyBkZWNsYXJlZCBhcyBjbGFzcyBkYXRhIHR5cGVzIHNob3VsZCB1c2UgYSBwb2ludGVyIHRvIGEgdmFsaWQgb2JqZWN0IHRoYXQgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZQ0KK2Z1bmN0aW9uIGlzIGNhbGxlZCwgYXMgaW46DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnR5cGVkZWY8L2I+Jm5ic3A7PGI+aW50PC9iPiZuYnNwO3hzZF9faW50OyA8YnIgLz4NCis8Yj5jbGFzczwvYj4mbmJzcDtYIHsgLi4uIH07IDxiciAvPg0KKzxiPmNsYXNzPC9iPiZuYnNwO0FycmF5T2ZpbnQgeyB4c2RfX2ludCAqX19wdHI7IDxiPmludDwvYj4mbmJzcDtfX3NpemU7IH07IDxiciAvPg0KK25zX19yZW1vdGVNZXRob2QoWCAqaW4sIEFycmF5T2ZpbnQgKm91dCk7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitPciBhIHJlZmVyZW5jZSB0byBhIHZhbGlkIG9yIDxpPk5VTEw8L2k+IHBvaW50ZXIsIGFzIGluOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmludDwvYj4mbmJzcDt4c2RfX2ludDsgPGJyIC8+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7WCB7IC4uLiB9OyA8YnIgLz4NCis8Yj5jbGFzczwvYj4mbmJzcDtBcnJheU9maW50IHsgeHNkX19pbnQgKl9fcHRyOyA8Yj5pbnQ8L2I+Jm5ic3A7X19zaXplOyB9OyA8YnIgLz4NCituc19fcmVtb3RlTWV0aG9kKFggKmluLCBBcnJheU9maW50IComYW1wO291dCk7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgZ1NPQVAgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zIGNhbiBiZSB1c2VkIGluIGNsaWVudCBhbmQvb3Igc2VydmljZSBjb2RlIHRvIGFsbG9jYXRlIHRlbXBvcmFyeSBkYXRhIHRoYXQgd2lsbCBiZQ0KK2F1dG9tYXRpY2FsbHkgZGVhbGxvY2F0ZWQuDQorVGhlc2UgZnVuY3Rpb25zIGFyZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNEMEQwRDAiPjx0cj48dGQ+PHNwYW4gY2xhc3M9InJvbWFuIj4NCisNCis8dGFibGU+DQorPHRyPjx0ZD48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+RnVuY3Rpb24gQ2FsbDwvYj48L2ZvbnQ+IDwvdGQ+PHRkPjxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5EZXNjcmlwdGlvbjwvYj48L2ZvbnQ+IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPjxiPnZvaWQ8L2I+Jm5ic3A7KnNvYXBfbWFsbG9jKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCBzaXplX3Qgbik8L2k+IDwvdGQ+PHRkPnJldHVybiBwb2ludGVyIHRvIDxpPm48L2k+IGJ5dGVzIDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPjx1PjxzcGFuIGNsYXNzPSJyb21hbiI+Q2xhc3M8L3NwYW4+PC91PiAqc29hcF9uZXdfPHU+PHNwYW4gY2xhc3M9InJvbWFuIj5DbGFzczwvc3Bhbj48L3U+KDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj5pbnQ8L2I+Jm5ic3A7bik8L2k+IDwvdGQ+PHRkPmluc3RhbnRpYXRlIDxpPm48L2k+IDx1PjxzcGFuIGNsYXNzPSJyb21hbiI+Q2xhc3M8L3NwYW4+PC91PiBvYmplY3RzIDwvdGQ+PC90cj48L3RhYmxlPg0KKw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQorVGhlIDxpPnNvYXBfbmV3X1g8L2k+IGZ1bmN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBnU09BUCBjb21waWxlciBmb3IgZXZlcnkgY2xhc3MgPGk+WDwvaT4gaW4gdGhlIGhlYWRlciBmaWxlLg0KK1BhcmFtZXRlciA8aT5uPC9pPiBNVVNUIGJlIDxpPi0xPC9pPiB0byBpbnN0YW50aWF0ZSBhIHNpbmdsZSBvYmplY3QsIG9yIGxhcmdlciBvciBlcXVhbCB0byAwIHRvIGluc3RhbnRpYXRlIGFuIGFycmF5IG9mIDxpPm48L2k+IG9iamVjdHMuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1NwYWNlIGFsbG9jYXRlZCB3aXRoIDxpPnNvYXBfbWFsbG9jPC9pPiB3aWxsIGJlIHJlbGVhc2VkIHdpdGggdGhlIDxpPnNvYXBfZW5kPC9pPiBhbmQgPGk+c29hcF9kZWFsbG9jPC9pPiBmdW5jdGlvbnMuDQorT2JqZWN0cyBpbnN0YW50aWF0ZWQgd2l0aCA8aT5zb2FwX25ld19YKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwKik8L2k+IGFyZSByZW1vdmVkIGFsdG9nZXRoZXIgd2l0aCA8aT5zb2FwX2Rlc3Ryb3koPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAqKTwvaT4uDQorSW5kaXZpZHVhbCBvYmplY3RzIGluc3RhbnRpYXRlZCB3aXRoIDxpPnNvYXBfbmV3X1g8L2k+IGFyZSByZW1vdmVkIHdpdGggPGk+c29hcF9kZWxldGVfWCg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCosIFgqKTwvaT4uDQorRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgc2VydmljZSB1c2VzIHRlbXBvcmFyeSBkYXRhIGluIHRoZSByZW1vdGUgbWV0aG9kIGltcGxlbWVudGF0aW9uOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5pbnQ8L2I+Jm5ic3A7bWFpbigpIDxiciAvPg0KK3sgLi4uIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwIHNvYXA7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfaW5pdCgmYW1wO3NvYXApOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX3NlcnZlKCZhbXA7c29hcCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfZW5kKCZhbXA7c29hcCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOy4uLiA8YnIgLz4NCit9DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitBbiBleGFtcGxlIHJlbW90ZSBtZXRob2QgdGhhdCBhbGxvY2F0ZXMgYSB0ZW1wb3Jhcnkgc3RyaW5nIGlzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5pbnQ8L2I+Jm5ic3A7bnNfX2l0b2EoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIDxiPmludDwvYj4mbmJzcDtpLCA8Yj5jaGFyPC9iPiZuYnNwOyoqYSkgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsqYSA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCAxMSk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NwcmludGYoKmEsICIlZCIsIGkpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7U09BUF9PSzsgPGJyIC8+DQorfQ0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhpcyB0ZW1wb3JhcnkgYWxsb2NhdGlvbiBjYW4gYWxzbyBiZSB1c2VkIHRvIGFsbG9jYXRlIHN0cmluZ3MgZm9yIHRoZSBTT0FQIEZhdWx0IGRhdGEgc3RydWN0dXJlLiBGb3IgZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+aW50PC9iPiZuYnNwO25zX19teW1ldGhvZCguLi4pIDxiciAvPg0KK3sgLi4uIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyhleGNlcHRpb24pIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqbXNnID0gKDxiPmNoYXI8L2I+Kilzb2FwX21hbGxvYyhzb2FwLCAxMDI0KTsgLy8gYWxsb2NhdGUgdGVtcG9yYXJ5IHNwYWNlIGZvciBkZXRhaWxlZCBtZXNzYWdlIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NwcmludGYobXNnLCAiLi4uIiwgLi4uKTsgLy8gcHJvZHVjZSB0aGUgZGV0YWlsZWQgbWVzc2FnZSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7c29hcF9yZWNlaXZlcl9mYXVsdChzb2FwLCAmIzE5NjtuIGV4Y2VwdGlvbiBvY2N1cnJlZCIsIG1zZyk7IC8vIHJldHVybiB0aGUgc2VydmVyLXNpZGUgZmF1bHQgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsuLi4gPGJyIC8+DQorfQ0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVXNlIDxpPnNvYXBfcmVjZWl2ZXJfZmF1bHQoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KmZhdWx0c3RyaW5nLCA8Yj5jb25zdDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypkZXRhaWwpPC9pPiB0byBzZXQgYSBTT0FQIDEuMS8xLjIgZmF1bHQgYXQgdGhlIHNlcnZlci1zaWRlLg0KK1VzZSA8aT5zb2FwX3NlbmRlcl9mYXVsdCg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqZmF1bHRzdHJpbmcsDQorPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqZGV0YWlsKTwvaT4gdG8gc2V0IGEgU09BUCAxLjEvMS4yIHVucmVjb3ZlcmFibGUgQmFkIFJlcXVlc3QgZmF1bHQNCithdCB0aGUgc2VydmVyLXNpZGUuIFNlbmRpbmcgY2xpZW50cyBhcmUgbm90IHN1cHBvc2VkIHRvIHJldHJ5IG1lc3NhZ2VzIGFmdGVyIGENCitCYWQgUmVxdWVzdCwgd2hpbGUgZXJyb3JzIGF0IHRoZSByZWNlaXZlci1zaWRlIGluZGljYXRlIHRlbXBvcmFyeSBwcm9ibGVtcy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIGFib3ZlIGZ1bmN0aW9ucyBkbyBub3QgaW5jbHVkZSBhIFNPQVAgMS4yIFN1YmNvZGUgZWxlbWVudC4gVG8gaW5jbHVkZSBTdWJjb2RlIGVsZW1lbnQsIHVzZSA8aT5zb2FwX3JlY2VpdmVyX2ZhdWx0X3N1YmNvZGUoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KnN1YmNvZGUsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KmZhdWx0c3RyaW5nLCA8Yj5jb25zdDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypkZXRhaWwpPC9pPiB0byBzZXQgYSBTT0FQIDEuMS8xLjIgZmF1bHQgd2l0aCBTdWJjb2RlIGF0IHRoZSBzZXJ2ZXItc2lkZS4NCitVc2UgPGk+c29hcF9zZW5kZXJfZmF1bHRfc3ViY29kZSg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqc3ViY29kZSwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqZmF1bHRzdHJpbmcsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KmRldGFpbCk8L2k+IHRvIHNldCBhIFNPQVAgMS4xLzEuMiB1bnJlY292ZXJhYmxlIEJhZCBSZXF1ZXN0IGZhdWx0IHdpdGggU3ViY29kZSBhdCB0aGUgc2VydmVyLXNpZGUuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK2dTT0FQIHByb3ZpZGVzIGEgZnVuY3Rpb24gdG8gZHVwbGljYXRlIGEgc3RyaW5nIGludG8gZ1NPQVAncyBtZW1vcnkgc3BhY2U6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjRDBEMEQwIj48dHI+PHRkPjxzcGFuIGNsYXNzPSJyb21hbiI+DQorPGk+PGI+Y2hhcjwvYj4mbmJzcDsqc29hcF9zdHJkdXAoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMpPC9pPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQorVGhlIGZ1bmN0aW9uIGFsbG9jYXRlcyBzcGFjZSBmb3IgPGk+czwvaT4gd2l0aCA8aT5zb2FwX21hbGxvYzwvaT4sIGNvcGllcyB0aGUNCitzdHJpbmcsIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZHVwbGljYXRlZCBzdHJpbmcuIFdoZW4gPGk+czwvaT4gaXMgTlVMTCwNCit0aGUgZnVuY3Rpb24gZG9lcyBub3QgYWxsb2NhdGUgYW5kIGNvcHkgdGhlIHN0cmluZyBhbmQgcmV0dXJucyBOVUxMLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJCSAgICAgIDxoND48YSBuYW1lPSJ0dGhfc0VjOC4xMy4yIj4NCis4LjEzLjI8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPkludHJhLUNsYXNzIE1lbW9yeSBNYW5hZ2VtZW50PC9mb250PjwvaDQ+PGEgbmFtZT0ic2VjOmNsYXNzbWVtb3J5Ij4NCis8L2E+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1doZW4gYSBjbGFzcyBkZWNsYXJhdGlvbiBoYXMgYSA8aT48Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqPC9pPiBmaWVsZCwgdGhpcyBmaWVsZCB3aWxsIGJlIHNldCB0byBwb2ludCB0byB0aGUgY3VycmVudCBnU09BUCBydW4tdGltZSBlbnZpcm9ubWVudCBieQ0KK2dTT0FQJ3MgZGVzZXJpYWxpemVycyBhbmQgYnkgdGhlIDxpPnNvYXBfbmV3X0NsYXNzPC9pPiBmdW5jdGlvbnMuDQorVGhpcyBzaW1wbGlmaWVzIG1lbW9yeSBtYW5hZ2VtZW50IGZvciBjbGFzcyBpbnN0YW5jZXMuDQorVGhlIDxpPjxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwKjwvaT4gcG9pbnRlciBpcyBpbXBsaWNpdGx5IHNldCBieSB0aGUgZ1NPQVAgZGVzZXJpYWxpemVyIGZvcg0KK3RoZSBjbGFzcyBvciBleHBsaWNpdGx5IGJ5IGNhbGxpbmcgdGhlIDxpPnNvYXBfbmV3X1g8L2k+IGZ1bmN0aW9uIGZvciBjbGFzcyA8aT5YPC9pPi4NCitGb3IgZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7U2FtcGxlIDxiciAvPg0KK3sgPGI+cHVibGljPC9iPjogPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXA7IC8vIHJlZmVyZW5jZSB0byBnU09BUCdzIHJ1bi10aW1lIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOy4uLiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtTYW1wbGUoKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7flNhbXBsZSgpOyA8YnIgLz4NCit9Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIGZvciBjbGFzcyA8aT5TYW1wbGU8L2k+IGFyZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorU2FtcGxlOjpTYW1wbGUoKSA8YnIgLz4NCit7IHRoaXM8dHQ+LSZndDs8L3R0PnNvYXAgPSBOVUxMOyA8YnIgLz4NCit9IDxiciAvPg0KK1NhbXBsZTo6flNhbXBsZSgpIDxiciAvPg0KK3sgc29hcF91bmxpbmsodGhpczx0dD4tJmd0OzwvdHQ+c29hcCwgdGhpcyk7IDxiciAvPg0KK30NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoZSA8aT5zb2FwX3VubGluaygpPC9pPiBjYWxsIHJlbW92ZXMgdGhlIG9iamVjdCBmcm9tIGdTT0FQJ3MgZGVhbGxvY2F0aW9uIGNoYWluLg0KK0luIHRoYXQgd2F5LCA8aT5zb2FwX2Rlc3Ryb3k8L2k+IGNhbiBiZSBzYWZlbHkgY2FsbGVkIHRvIHJlbW92ZSBhbGwgY2xhc3MgaW5zdGFuY2VzLg0KK1RoZSBmb2xsb3dpbmcgY29kZSBpbGx1c3RyYXRlcyB0aGUgZXhwbGljaXQgY3JlYXRpb24gb2YgYSA8aT5TYW1wbGU8L2k+IG9iamVjdCBhbmQgY2xlYW51cDoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAgPSBzb2FwX25ldygpOyAvLyBuZXcgZ1NPQVAgcnVudGltZSA8YnIgLz4NCitTYW1wbGUgKm9iaiA9IHNvYXBfbmV3X1NhbXBsZShzb2FwLCAtMSk7IC8vIG5ldyBTYW1wbGUgb2JqZWN0IHdpdGggb2JqPHR0Pi0mZ3Q7PC90dD5zb2FwIHNldCB0byBydW50aW1lIDxiciAvPg0KKy4uLiA8YnIgLz4NCis8Yj5kZWxldGU8L2I+Jm5ic3A7b2JqOyAvLyBhbHNvIGNhbGxzIHNvYXBfdW5saW5rIHRvIHJlbW92ZSBvYmogZnJvbSB0aGUgZGVhbGxvY2F0aW9uIGNoYWluIDxiciAvPg0KK3NvYXBfZGVzdHJveShzb2FwKTsgLy8gZGVhbGxvY2F0ZSBhbGwgKG90aGVyKSBjbGFzcyBpbnN0YW5jZXMgPGJyIC8+DQorc29hcF9lbmQoc29hcCk7IC8vIGNsZWFuIHVwDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitIZXJlIGlzIGFub3RoZXIgZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7bnNfX215Q2xhc3MgPGJyIC8+DQoreyAuLi4gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXA7IC8vIHNldCBieSBzb2FwX25ld19uc19fbXlDbGFzcygpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7Km5hbWU7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnZvaWQ8L2I+Jm5ic3A7c2V0TmFtZSg8Yj5jb25zdDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypzKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Li4uIDxiciAvPg0KK307DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitDYWxscyB0byA8aT5zb2FwX25ld19uc19fbXlDbGFzcyhzb2FwLCBuKTwvaT4gd2lsbCBzZXQgdGhlIDxpPnNvYXA8L2k+IGZpZWxkIGluIHRoZSBjbGFzcyBpbnN0YW5jZSB0byB0aGUgY3VycmVudCBnU09BUA0KK2Vudmlyb25tZW50LiBCZWNhdXNlIHRoZSBkZXNlcmlhbGl6ZXJzIGludm9rZSB0aGUgPGk+c29hcF9uZXc8L2k+IGZ1bmN0aW9ucywgdGhlIDxpPnNvYXA8L2k+IGZpZWxkIG9mIHRoZSA8aT5uc19fbXlDbGFzczwvaT4NCitpbnN0YW5jZXMgYXJlIHNldCBhcyB3ZWxsLg0KK1RoaXMgbWVjaGFuaXNtIGlzIGNvbnZlbmllbnQgd2hlbiBXZWIgU2VydmljZSBtZXRob2RzIG5lZWQgdG8gcmV0dXJuIG9iamVjdHMgdGhhdCBhcmUgaW5zdGFudGlhdGVkIGluIHRoZSBtZXRob2RzLg0KK0ZvciBleGFtcGxlDQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPmludDwvYj4mbmJzcDtuc19fbXlNZXRob2QoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIC4uLikgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtuc19fbXlDbGFzcyAqcCA9IHNvYXBfbmV3X25zX19teUNsYXNzKHNvYXAsIC0xKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7cDx0dD4tJmd0OzwvdHQ+c2V0TmFtZSgiU09BUCIpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7U09BUF9PSzsgPGJyIC8+DQorfSA8YnIgLz4NCis8Yj52b2lkPC9iPiZuYnNwO25zX19teUNsYXNzOjpuc19fc2V0TmFtZSg8Yj5jb25zdDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypzKSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyhzb2FwKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtuYW1lID0gKDxiPmNoYXI8L2I+Kilzb2FwX21hbGxvYyhzb2FwLCBzdHJsZW4ocykrMSk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmVsc2U8L2I+Jm5ic3A7PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7bmFtZSA9ICg8Yj5jaGFyPC9iPiopbWFsbG9jKHN0cmxlbihzKSsxKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c3RyY3B5KG5hbWUsIHMpOyA8YnIgLz4NCit9IDxiciAvPg0KK25zX19teUNsYXNzOjpuc19fbXlDbGFzcygpIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcCA9IE5VTEw7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO25hbWUgPSBOVUxMOyA8YnIgLz4NCit9IDxiciAvPg0KK25zX19teUNsYXNzOjp+bnNfX215Q2xhc3MoKSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyghc29hcCAmYW1wOyZhbXA7IG5hbWUpIGZyZWUobmFtZSk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfdW5saW5rKHNvYXAsIHRoaXMpOyA8YnIgLz4NCit9IA0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorQ2FsbGluZyA8aT5zb2FwX2Rlc3Ryb3k8L2k+IHJpZ2h0IGFmdGVyIDxpPnNvYXBfc2VydmU8L2k+IGluIHRoZSBXZWIgU2VydmljZSB3aWxsIGRlc3Ryb3kgYWxsIGR5bmFtaWNhbGx5IGFsbG9jYXRlZA0KK2NsYXNzIGluc3RhbmNlcy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCSAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWM4LjE0Ij4NCis4LjE0PC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5EZWJ1Z2dpbmc8L2ZvbnQ+PC9oMz4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVG8gYWN0aXZhdGUgbWVzc2FnZSBsb2dnaW5nIGZvciBkZWJ1Z2dpbmcsIHVuLWNvbW1lbnQgdGhlIDxpPiNkZWZpbmUgREVCVUc8L2k+IGRpcmVjdGl2ZSBpbiA8aT5zdGRzb2FwMi5oPC9pPi4gQ29tcGlsZSB0aGUgY2xpZW50IGFuZC9vcg0KK3NlcnZlciBhcHBsaWNhdGlvbnMgYXMgZGVzY3JpYmVkIGFib3ZlIChvciBzaW1wbHkgdXNlIDxpPmcrKyAtRERFQlVHIC4uLjwvaT4gdG8gY29tcGlsZSB3aXRoIGRlYnVnZ2luZyBhY3RpdmF0ZWQpLiBXaGVuIHRoZSBjbGllbnQgYW5kIHNlcnZlciBhcHBsaWNhdGlvbnMgcnVuLCB0aGV5IHdpbGwgbG9nIHRoZWlyIGFjdGl2aXR5IGluIHRocmVlDQorc2VwYXJhdGUgZmlsZXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjRDBEMEQwIj48dHI+PHRkPjxzcGFuIGNsYXNzPSJyb21hbiI+DQorDQorPHRhYmxlPg0KKzx0cj48dGQ+PGZvbnQgY29sb3I9IiNGRjAwMDAiPjxiPkZpbGU8L2I+PC9mb250PiA8L3RkPjx0ZD48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+RGVzY3JpcHRpb248L2I+PC9mb250PiA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT5TRU5ULmxvZzwvaT4gPC90ZD48dGQ+VGhlIFNPQVAgY29udGVudCB0cmFuc21pdHRlZCBieSB0aGUgYXBwbGljYXRpb24gPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+UkVDVi5sb2c8L2k+IDwvdGQ+PHRkPlRoZSBTT0FQIGNvbnRlbnQgcmVjZWl2ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPlRFU1QubG9nPC9pPiA8L3RkPjx0ZD5BIGxvZyBjb250YWluaW5nIHZhcmlvdXMgYWN0aXZpdGllcyBwZXJmb3JtZWQgYnkgdGhlIGFwcGxpY2F0aW9uIDwvdGQ+PC90cj48L3RhYmxlPg0KKw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQorPGZvbnQgY29sb3I9IiNGRjAwMDAiPjxiPkNhdXRpb248L2I+PC9mb250PjogVGhlIGNsaWVudCBhbmQgc2VydmVyIGFwcGxpY2F0aW9ucyBtYXkgcnVuIHNsb3cgZHVlIHRvIHRoZSBsb2dnaW5nIGFjdGl2aXR5Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+Q2F1dGlvbjwvYj48L2ZvbnQ+OiBXaGVuIGluc3RhbGxpbmcgYSBDR0kgYXBwbGljYXRpb24gb24gdGhlIFdlYiB3aXRoIGRlYnVnZ2luZyBhY3RpdmF0ZWQsIHRoZSBsb2cgZmlsZXMgbWF5IHNvbWV0aW1lcyBub3QgYmUgY3JlYXRlZCBkdWUgdG8gZmlsZQ0KK2FjY2VzcyBwZXJtaXNzaW9uIHJlc3RyaWN0aW9ucyBpbXBvc2VkIG9uIENHSSBhcHBsaWNhdGlvbnMuIFRvIGdldCBhcm91bmQgdGhpcywgY3JlYXRlIGVtcHR5IGxvZyBmaWxlcyB3aXRoIHVuaXZlcnNhbCB3cml0ZQ0KK3Blcm1pc3Npb25zLiBCZSBjYXJlZnVsIGFib3V0IHRoZSBzZWN1cml0eSBpbXBsaWNhdGlvbiBvZiB0aGlzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitZb3UgY2FuIHRlc3QgYSBzZXJ2aWNlIENHSSBhcHBsaWNhdGlvbiB3aXRob3V0IGRlcGxveWluZyBpdCBvbiB0aGUgV2ViLg0KK1RvIGRvIHRoaXMsIGNyZWF0ZSBhIGNsaWVudCBhcHBsaWNhdGlvbiBmb3IgdGhlIHNlcnZpY2UgYW5kIGFjdGl2YXRlIG1lc3NhZ2UgbG9nZ2luZyBieSB0aGlzIGNsaWVudC4NCitSZW1vdmUgYW55IG9sZCA8aT5TRU5ULmxvZzwvaT4gZmlsZSBhbmQgcnVuIHRoZSBjbGllbnQgKHdoaWNoIGNvbm5lY3RzIHRvIHRoZSBXZWIgc2VydmljZSBvciB0byBhbm90aGVyIGR1bW15LCBidXQgdmFsaWQgYWRkcmVzcykNCithbmQgY29weSB0aGUgPGk+U0VOVC5sb2c8L2k+IGZpbGUgdG8gYW5vdGhlciBmaWxlLCBlLmcuIDxpPlNFTlQudHN0PC9pPi4NCitUaGVuIHJlZGlyZWN0IHRoZSA8aT5TRU5ULnRzdDwvaT4gZmlsZSB0byB0aGUgc2VydmljZSBDR0kgYXBwbGljYXRpb24uICBGb3IgZXhhbXBsZSwNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNEMEQwRDAiPjx0cj48dGQ+PHNwYW4gY2xhc3M9InJvbWFuIj4NCis8aT5teXNlcnZpY2UuY2dpPC9pPiAgJmx0OyAgPGk+U0VOVC50c3Q8L2k+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvc3Bhbj4NCitUaGlzIHNob3VsZCBkaXNwbGF5IHRoZSBzZXJ2aWNlIHJlc3BvbnNlIG9uIHRoZSB0ZXJtaW5hbC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIGZpbGUgbmFtZXMgb2YgdGhlIGxvZyBmaWxlcyBhbmQgdGhlIGxvZ2dpbmcgYWN0aXZpdHkgY2FuIGJlIGNvbnRyb2xsZWQgYXQgdGhlIGFwcGxpY2F0aW9uIGxldmVsLiBUaGlzIGFsbG93cyB0aGUgY3JlYXRpb24gb2YNCitzZXBhcmF0ZSBsb2cgZmlsZXMgYnkgc2VwYXJhdGUgc2VydmljZXMsIGNsaWVudHMsIGFuZCB0aHJlYWRzLg0KK0ZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHNlcnZpY2UgbG9ncyBhbGwgU09BUCBtZXNzYWdlcyAoYnV0IG5vIGRlYnVnIG1lc3NhZ2VzKSBpbiBzZXBhcmF0ZSBkaXJlY3RvcmllczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgc29hcDsgPGJyIC8+DQorc29hcF9pbml0KCZhbXA7c29hcCk7IDxiciAvPg0KKy4uLiA8YnIgLz4NCitzb2FwX3NldF9yZWN2X2xvZ2ZpbGUoJmFtcDtzb2FwLCAibG9ncy9yZWN2L3NlcnZpY2UxMi5sb2ciKTsgLy8gYXBwZW5kIGFsbCBtZXNzYWdlcyByZWNlaXZlZCBpbiAvbG9ncy9yZWN2L3NlcnZpY2UxMi5sb2cgPGJyIC8+DQorc29hcF9zZXRfc2VudF9sb2dmaWxlKCZhbXA7c29hcCwgImxvZ3Mvc2VudC9zZXJ2aWNlMTIubG9nIik7IC8vIGFwcGVuZCBhbGwgbWVzc2FnZXMgc2VudCBpbiAvbG9ncy9zZW50L3NlcnZpY2UxMi5sb2cgPGJyIC8+DQorc29hcF9zZXRfdGVzdF9sb2dmaWxlKCZhbXA7c29hcCwgTlVMTCk7IC8vIG5vIGZpbGUgbmFtZTogZG8gbm90IHNhdmUgZGVidWcgbWVzc2FnZXMgPGJyIC8+DQorLi4uIDxiciAvPg0KK3NvYXBfc2VydmUoJmFtcDtzb2FwKTsgPGJyIC8+DQorLi4uDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitMaWtld2lzZSwgbWVzc2FnZXMgY2FuIGJlIGxvZ2dlZCBmb3IgaW5kaXZpZHVhbCBjbGllbnQtc2lkZSByZW1vdGUgbWV0aG9kIGNhbGxzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJICAgICA8aDM+PGEgbmFtZT0idHRoX3NFYzguMTUiPg0KKzguMTU8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPlJlcXVpcmVkIExpYnJhcmllczwvZm9udD48L2gzPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisNCis8dWw+DQorPGxpPiBUaGUgc29ja2V0IGxpYnJhcnkgaXMgZXNzZW50aWFsIGFuZCByZXF1aXJlcyB0aGUgaW5jbHVzaW9uIG9mIHRoZSBhcHByb3ByaWF0ZSBsaWJyYXJpZXMgd2l0aCB0aGUgY29tcGlsZSBjb21tYW5kIGZvciBTdW4NCitTb2xhcmlzIHN5c3RlbXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjRDBEMEQwIj48dHI+PHRkPjxzcGFuIGNsYXNzPSJyb21hbiI+DQorPGk+ZysrIC1vIG15Y2xpZW50IG15Y2xpZW50LmNwcCBzdGRzb2FwMi5jcHAgc29hcEMuY3BwIHNvYXBDbGllbnQuY3BwIC1sc29ja2V0IC1seG5ldCAtbG5zbDwvaT4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9zcGFuPg0KK1RoZXNlIGxpYnJhcnkgbG9hZGluZyBvcHRpb25zIGFyZSBub3QgcmVxdWlyZWQgd2l0aCBMaW51eC4NCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorPC9saT4NCisNCis8bGk+IFRoZSBnU09BUCBydW50aW1lIHVzZXMgdGhlIG1hdGggbGlicmFyeSBmb3IgdGhlIDx0dD5OYU48L3R0PiwgPHR0PklORjwvdHQ+LCBhbmQgPHR0Pi1JTkY8L3R0PiBmbG9hdGluZyBwb2ludCByZXByZXNlbnRhdGlvbnMuICBUaGUgbGlicmFyeQ0KK2lzIG5vdCBzdHJpY3RseSBuZWNlc3NhcnkgYW5kIHRoZSA8aT4gJmx0OyBtYXRoLmggJmd0OyA8L2k+IGhlYWRlciBmaWxlIGltcG9ydCBjYW4gYmUgY29tbWVudGVkIG91dCBmcm9tIHRoZSA8aT5zdGRzb2FwMi5oPC9pPiBoZWFkZXIgZmlsZS4NCitUaGUgYXBwbGljYXRpb24gY2FuIGJlIGxpbmtlZCB3aXRob3V0IHRoZSA8aT4tbG08L2k+IG1hdGggbGlicmFyeSBlLmcuIHVuZGVyIFN1biBTb2xhcmlzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKzxpPmcrKyAtbyBteWNsaWVudCBteWNsaWVudC5jcHAgc3Rkc29hcDIuY3BwIHNvYXBDLmNwcCBzb2FwQ2xpZW50LmNwcCAtbHNvY2tldCAtbHhuZXQgLWxuc2w8L2k+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvc3Bhbj4NCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorPC9saT4NCis8L3VsPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisgPGgyPjxhIG5hbWU9InR0aF9zRWM5Ij4NCis5PC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5UaGUgZ1NPQVAgUmVtb3RlIE1ldGhvZCBTcGVjaWZpY2F0aW9uIEZvcm1hdDwvZm9udD48L2gyPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitBIFNPQVAgcmVtb3RlIG1ldGhvZCBpcyBzcGVjaWZpZWQgYXMgYSBDL0MrKyBmdW5jdGlvbiBwcm90b3R5cGUgaW4gYSBoZWFkZXINCitmaWxlLiBUaGUgZnVuY3Rpb24gaXMgUkVRVUlSRUQgdG8gcmV0dXJuIDxpPjxiPmludDwvYj48L2k+LCB3aGljaCBpcyB1c2VkIHRvIHJlcHJlc2VudA0KK2EgU09BUCBlcnJvciBjb2RlLCBzZWUgU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6ZXJyY29kZXMiPjkuMjwvYT4uIE11bHRpcGxlIHJlbW90ZSBtZXRob2RzIE1BWQ0KK2JlIGRlY2xhcmVkIHRvZ2V0aGVyIGluIG9uZSBoZWFkZXIgZmlsZS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIGdlbmVyYWwgZm9ybSBvZiBhIFNPQVAgcmVtb3RlIG1ldGhvZCBzcGVjaWZpY2F0aW9uIGlzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD48Yj5pbnQ8L2I+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+IDxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250Pm5hbWVzcGFjZV9wcmVmaXhfXzxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250Pm1ldGhvZF9uYW1lKDxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PmlucGFyYW0xLCBpbnBhcmFtMiwgLi4uLDxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PiBvdXRwYXJhbSk7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCit3aGVyZQ0KKw0KKzxkbCBjb21wYWN0PSJjb21wYWN0Ij4NCisgPGR0PjxiPjxzcGFuIGNsYXNzPSJyb21hbiI+PGk+bmFtZXNwYWNlX3ByZWZpeF9fPC9pPjwvYj48L2R0Pg0KKwk8ZGQ+IGlzIHRoZSBvcHRpb25hbCBuYW1lc3BhY2UgcHJlZml4IG9mIHRoZSBtZXRob2QgKHNlZSBpZGVudGlmaWVyIHRyYW5zbGF0aW9uIHJ1bGVzJm5ic3A7PGEgaHJlZj0iI3NlYzppZHRyYW5zIj45LjM8L2E+KTwvc3Bhbj48L2RkPg0KKyA8ZHQ+PGI+PHNwYW4gY2xhc3M9InJvbWFuIj48aT5tZXRob2RfbmFtZTwvaT48L2I+PC9kdD4NCisJPGRkPgkgaXQgdGhlIHJlbW90ZSBtZXRob2QgbmFtZSAoc2VlIGlkZW50aWZpZXIgdHJhbnNsYXRpb24gcnVsZXMmbmJzcDs8YSBocmVmPSIjc2VjOmlkdHJhbnMiPjkuMzwvYT4pPC9zcGFuPjwvZGQ+DQorIDxkdD48Yj48c3BhbiBjbGFzcz0icm9tYW4iPjxpPmlucGFyYW08L2k+PC9iPjwvZHQ+DQorCTxkZD4JCSBpcyB0aGUgZGVjbGFyYXRpb24gb2YgYW4gaW5wdXQgcGFyYW1ldGVyIG9mIHRoZSByZW1vdGUgbWV0aG9kPC9zcGFuPjwvZGQ+DQorIDxkdD48Yj48c3BhbiBjbGFzcz0icm9tYW4iPjxpPm91dHBhcmFtPC9pPjwvYj48L2R0Pg0KKwk8ZGQ+CSBpcyB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIG91dHB1dCBwYXJhbWV0ZXIgb2YgdGhlIHJlbW90ZSBtZXRob2Q8L3NwYW4+PC9kZD4NCis8L2RsPg0KK1RoaXMgc2ltcGxlIGZvcm0gY2FuIG9ubHkgcGFzcyBhIHNpbmdsZSwgbm9uLTxpPjxiPnN0cnVjdDwvYj48L2k+IGFuZCBub24tPGk+PGI+Y2xhc3M8L2I+PC9pPg0KK3R5cGUgb3V0cHV0IHBhcmFtZXRlci4gU2VlJm5ic3A7PGEgaHJlZj0iI3NlYzpwYXJhbSI+OS4xPC9hPiBmb3IgcGFzc2luZyBtdWx0aXBsZSBvdXRwdXQNCitwYXJhbWV0ZXJzLiBUaGUgbmFtZSBvZiB0aGUgZGVjbGFyZWQgZnVuY3Rpb24gPGk+bmFtZXNwYWNlX3ByZWZpeF9fDQorbWV0aG9kX25hbWU8L2k+IG11c3QgYmUgdW5pcXVlIGFuZCBjYW5ub3QgbWF0Y2ggdGhlIG5hbWUgb2YgYSA8aT48Yj5zdHJ1Y3Q8L2I+PC9pPiwNCis8aT48Yj5jbGFzczwvYj48L2k+LCBvciA8aT48Yj5lbnVtPC9iPjwvaT4gZGVjbGFyZWQgaW4gdGhlIHNhbWUgaGVhZGVyIGZpbGUuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBtZXRob2QgcmVxdWVzdCBpcyBlbmNvZGVkIGluIFNPQVAgYXMgYW4gWE1MIGVsZW1lbnQgYW5kIHRoZSBuYW1lc3BhY2UgcHJlZml4LCBtZXRob2QgbmFtZSwgYW5kIGlucHV0IHBhcmFtZXRlcnMgYXJlIGVuY29kZWQgdXNpbmcgdGhlIGZvcm1hdDoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEIwRDAiPjx0cj48dGQ+PHR0Pg0KKyZsdDs8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD5uYW1lc3BhY2UtcHJlZml4Ojxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250Pm1ldGhvZF9uYW1lIHhzaTp0eXBlPSI8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD5uYW1lc3BhY2UtcHJlZml4Ojxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250Pm1ldGhvZF9uYW1lJiM2MjsgPGJyIC8+DQorJmx0O2lucGFyYW0tbmFtZTEgeHNpOnR5cGU9Ii4uLiImIzYyOy4uLiZsdDsvaW5wYXJhbS1uYW1lMSYjNjI7IDxiciAvPg0KKyZsdDtpbnBhcmFtLW5hbWUyIHhzaTp0eXBlPSIuLi4iJiM2MjsuLi4mbHQ7L2lucGFyYW0tbmFtZTImIzYyOyA8YnIgLz4NCisuLi4gPGJyIC8+DQorJmx0Oy88Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD5uYW1lc3BhY2UtcHJlZml4Ojxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250Pm1ldGhvZF9uYW1lJiM2MjsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC90dD4NCit3aGVyZSB0aGUgPHR0PmlucGFyYW0tbmFtZTwvdHQ+IGFjY2Vzc29ycyBhcmUgdGhlIGVsZW1lbnQtbmFtZSByZXByZXNlbnRhdGlvbnMgb2YgdGhlIDxpPmlucGFyYW08L2k+IHBhcmFtZXRlciBuYW1lIGRlY2xhcmF0aW9ucywgc2VlDQorU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6aWR0cmFucyI+OS4zPC9hPi4gKFRoZSBvcHRpb25hbCBwYXJ0cyBhcmUgc2hvd24gZW5jbG9zZWQgaW4gPGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+LikNCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIFhNTCByZXNwb25zZSBieSB0aGUgV2ViIHNlcnZpY2UgaXMgb2YgdGhlIGZvcm06DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBCMEQwIj48dHI+PHRkPjx0dD4NCismbHQ7PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+bmFtZXNwYWNlLXByZWZpeDo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD5tZXRob2QtbmFtZVJlc3BvbnNlIHhzaTp0eXBlPSI8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD5uYW1lc3BhY2UtcHJlZml4Ojxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250Pm1ldGhvZC1uYW1lUmVzcG9uc2UmIzYyOyA8YnIgLz4NCismbHQ7b3V0cGFyYW0tbmFtZSB4c2k6dHlwZT0iLi4uIiYjNjI7Li4uJmx0Oy9vdXRwYXJhbS1uYW1lJiM2MjsgPGJyIC8+DQorJmx0Oy88Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD5uYW1lc3BhY2UtcHJlZml4Ojxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250Pm1ldGhvZC1uYW1lUmVzcG9uc2UmIzYyOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3R0Pg0KK3doZXJlIHRoZSA8dHQ+b3V0cGFyYW0tbmFtZTwvdHQ+IGFjY2Vzc29yIGlzIHRoZSBlbGVtZW50LW5hbWUgcmVwcmVzZW50YXRpb24gb2YgdGhlIDxpPm91dHBhcmFtPC9pPiBwYXJhbWV0ZXIgbmFtZSBkZWNsYXJhdGlvbiwgc2VlDQorU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6aWR0cmFucyI+OS4zPC9hPi4gQnkgY29udmVudGlvbiwgdGhlIHJlc3BvbnNlIGVsZW1lbnQgbmFtZSBpcyB0aGUgbWV0aG9kIG5hbWUgZW5kaW5nIGluIDx0dD5SZXNwb25zZTwvdHQ+Lg0KK1NlZSZuYnNwOzxhIGhyZWY9IiNzZWM6cGFyYW0iPjkuMTwvYT4gb24gaG93IHRvIGNoYW5nZSB0aGUgZGVjbGFyYXRpb24gaWYgdGhlIHNlcnZpY2UgcmVzcG9uc2UgZWxlbWVudCBuYW1lIGlzIGRpZmZlcmVudC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIGdTT0FQIHN0dWIgYW5kIHNrZWxldG9uIGNvbXBpbGVyIGdlbmVyYXRlcyBhIHN0dWIgcm91dGluZSBmb3IgdGhlIHJlbW90ZQ0KK21ldGhvZC4gVGhpcyBzdHViIGlzIG9mIHRoZSBmb3JtOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5pbnQ8L2I+Jm5ic3A7c29hcF9jYWxsXzxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250Pm5hbWVzcGFjZV9wcmVmaXhfXzxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250Pm1ldGhvZF9uYW1lKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj5jaGFyPC9iPiZuYnNwOypVUkwsIDxiPmNoYXI8L2I+Jm5ic3A7KmFjdGlvbiwgPGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+aW5wYXJhbTEsIGlucGFyYW0yLCAuLi4sPGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+IG91dHBhcmFtKTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoaXMgcHJveHkgY2FuIGJlIGNhbGxlZCBieSBhIGNsaWVudCBhcHBsaWNhdGlvbiB0byBwZXJmb3JtIHRoZSByZW1vdGUgbWV0aG9kDQorY2FsbC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIGdTT0FQIHN0dWIgYW5kIHNrZWxldG9uIGNvbXBpbGVyIGdlbmVyYXRlcyBhIHNrZWxldG9uIHJvdXRpbmUgZm9yIHRoZQ0KK3JlbW90ZSBtZXRob2QuIFRoZSBza2VsZXRvbiBmdW5jdGlvbiBpczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+aW50PC9iPiZuYnNwO3NvYXBfc2VydmVfPGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+bmFtZXNwYWNlX3ByZWZpeF9fPGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+bWV0aG9kX25hbWUoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXApOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIHNrZWxldG9uIHJvdXRpbmUsIHdoZW4gY2FsbGVkIGJ5IGEgc2VydmljZSBhcHBsaWNhdGlvbiwgd2lsbCBhdHRlbXB0IHRvDQorc2VydmUgYSByZXF1ZXN0IG9uIHRoZSBzdGFuZGFyZCBpbnB1dC4gSWYgbm8gcmVxdWVzdCBpcyBwcmVzZW50IG9yIGlmIHRoZQ0KK3JlcXVlc3QgZG9lcyBub3QgbWF0Y2ggdGhlIG1ldGhvZCBuYW1lLCA8aT5TT0FQX05PX01FVEhPRDwvaT4gaXMgcmV0dXJuZWQuDQorVGhlIHNrZWxldG9uIHJvdXRpbmVzIGFyZSBhdXRvbWF0aWNhbGx5IGNhbGxlZCBieSB0aGUgZ2VuZXJhdGVkDQorPGk+c29hcF9zZXJ2ZTwvaT4gcm91dGluZSB0aGF0IGhhbmRsZXMgYWxsIHJlcXVlc3RzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJICAgICA8aDM+PGEgbmFtZT0idHRoX3NFYzkuMSI+DQorOS4xPC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5SZW1vdGUgTWV0aG9kIFBhcmFtZXRlciBQYXNzaW5nPC9mb250PjwvaDM+PGEgbmFtZT0ic2VjOnBhcmFtIj4NCis8L2E+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBpbnB1dCBwYXJhbWV0ZXJzIG9mIGEgcmVtb3RlIG1ldGhvZCBNVVNUIGJlIHBhc3NlZCBieSB2YWx1ZS4gIElucHV0DQorcGFyYW1ldGVycyBjYW5ub3QgYmUgcGFzc2VkIGJ5IHJlZmVyZW5jZSB3aXRoIHRoZSA8aT4mYW1wOzwvaT4gcmVmZXJlbmNlIG9wZXJhdG9yLA0KK2J1dCBhbiBpbnB1dCBwYXJhbWV0ZXIgdmFsdWUgTUFZIGJlIHBhc3NlZCBieSBhIHBvaW50ZXIgdG8gdGhlIGRhdGEuICBPZg0KK2NvdXJzZSwgcGFzc2luZyBhIHBvaW50ZXIgdG8gdGhlIGRhdGEgaXMgcHJlZmVycmVkIHdoZW4gdGhlIHNpemUgb2YgdGhlIGRhdGEgb2YNCit0aGUgcGFyYW1ldGVyIGlzIGxhcmdlLiAgQWxzbywgdG8gcGFzcyBpbnN0YW5jZXMgb2YgKGRlcml2ZWQpIGNsYXNzZXMsIHBvaW50ZXJzDQordG8gdGhlIGluc3RhbmNlIG5lZWQgdG8gYmUgdXNlZCB0byBhdm9pZCBwYXNzaW5nIHRoZSBpbnN0YW5jZSBieSB2YWx1ZSB3aGljaA0KK3JlcXVpcmVzIGEgdGVtcG9yYXJ5IGFuZCBwcm9oaWJpdHMgcGFzc2luZyBkZXJpdmVkIGNsYXNzIGluc3RhbmNlcy4gIFdoZW4gdHdvDQoraW5wdXQgcGFyYW1ldGVyIHZhbHVlcyBhcmUgaWRlbnRpY2FsLCBwYXNzaW5nIHRoZW0gdXNpbmcgYSBwb2ludGVyIGhhcyB0aGUNCithZHZhbnRhZ2UgdGhhdCB0aGUgdmFsdWUgd2lsbCBiZSBlbmNvZGVkIG9ubHkgb25jZSBhcyBtdWx0aS1yZWZlcmVuY2UgKGhlbmNlLA0KK3RoZSBwYXJhbWV0ZXJzIGFyZSBhbGlhc2VzKS4gIFdoZW4gaW5wdXQgcGFyYW1ldGVycyBhcmUgcGFzc2VkIHVzaW5nIGEgcG9pbnRlciwNCit0aGUgZGF0YSBwb2ludGVkIHRvIHdpbGwgbm90IGJlIG1vZGlmaWVkIGJ5IHRoZSByZW1vdGUgbWV0aG9kIGFuZCByZXR1cm5lZCB0bw0KK3RoZSBjYWxsZXIuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBvdXRwdXQgcGFyYW1ldGVyIE1VU1QgYmUgcGFzc2VkIGJ5IHJlZmVyZW5jZSB1c2luZyA8aT4mYW1wOzwvaT4gb3IgYnkgdXNpbmcgYQ0KK3BvaW50ZXIuIEFycmF5cyBhcmUgcGFzc2VkIGJ5IHJlZmVyZW5jZSBieSBkZWZhdWx0IGFuZCBkbyBub3QgcmVxdWlyZSB0aGUgdXNlDQorb2YgdGhlIHJlZmVyZW5jZSBvcGVyYXRvciA8aT4mYW1wOzwvaT4uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBpbnB1dCBhbmQgb3V0cHV0IHBhcmFtZXRlciB0eXBlcyBoYXZlIGNlcnRhaW4gbGltaXRhdGlvbnMsIHNlZQ0KK1NlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOmxpbWl0YXRpb25zIj44LjEwPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitJZiB0aGUgb3V0cHV0IHBhcmFtZXRlciBpcyBhIDxpPjxiPnN0cnVjdDwvYj48L2k+IG9yIDxpPjxiPmNsYXNzPC9iPjwvaT4gdHlwZSwgaXQgaXMNCitjb25zaWRlcmVkIGEgU09BUCByZW1vdGUgbWV0aG9kIHJlc3BvbnNlIGVsZW1lbnQgaW5zdGVhZCBvZiBhIHNpbXBsZSBvdXRwdXQNCitwYXJhbWV0ZXIgdmFsdWUuIFRoYXQgaXMsIHRoZSBuYW1lIG9mIHRoZSA8aT48Yj5zdHJ1Y3Q8L2I+PC9pPiBvciA8aT48Yj5jbGFzczwvYj48L2k+IGlzIHRoZQ0KK25hbWUgb2YgdGhlIHJlc3BvbnNlIGVsZW1lbnQgYW5kIHRoZSA8aT48Yj5zdHJ1Y3Q8L2I+PC9pPiBvciA8aT48Yj5jbGFzczwvYj48L2k+IGZpZWxkcyBhcmUNCit0aGUgb3V0cHV0IHBhcmFtZXRlcnMgb2YgdGhlIHJlbW90ZSBtZXRob2QsIHNlZSBhbHNvJm5ic3A7PGEgaHJlZj0iI3NlYzpyZXNwb25zZSI+Ny4xLjc8L2E+LiBIZW5jZSwNCitpZiB0aGUgb3V0cHV0IHBhcmFtZXRlciBoYXMgdG8gYmUgYSA8aT48Yj5zdHJ1Y3Q8L2I+PC9pPiBvciA8aT48Yj5jbGFzczwvYj48L2k+LCBhIHJlc3BvbnNlDQorPGk+PGI+c3RydWN0PC9iPjwvaT4gb3IgPGk+PGI+Y2xhc3M8L2I+PC9pPiBNVVNUIGJlIGRlY2xhcmVkIGFzIHdlbGwuICBJbiBhZGRpdGlvbiwgaWYgYQ0KK3JlbW90ZSBtZXRob2QgcmV0dXJucyBtdWx0aXBsZSBvdXRwdXQgcGFyYW1ldGVycywgYSByZXNwb25zZSA8aT48Yj5zdHJ1Y3Q8L2I+PC9pPiBvcg0KKzxpPjxiPmNsYXNzPC9iPjwvaT4gTVVTVCBiZSBkZWNsYXJlZC4gQnkgY29udmVudGlvbiwgdGhlIHJlc3BvbnNlIGVsZW1lbnQgaXMgdGhlDQorcmVtb3RlIG1ldGhvZCBuYW1lIGVuZGluZyB3aXRoICI8dHQ+UmVzcG9uc2U8L3R0PiIuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBnZW5lcmFsIGZvcm0gb2YgYSByZXNwb25zZSBlbGVtZW50IGRlY2xhcmF0aW9uIGlzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+bmFtZXNwYWNlX3ByZWZpeF9fPGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+cmVzcG9uc2VfZWxlbWVudF9uYW1lIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7b3V0cGFyYW0xOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtvdXRwYXJhbTI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOy4uLiA8YnIgLz4NCit9Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQord2hlcmUNCisNCis8ZGwgY29tcGFjdD0iY29tcGFjdCI+DQorIDxkdD48Yj48c3BhbiBjbGFzcz0icm9tYW4iPjxpPm5hbWVzcGFjZV9wcmVmaXhfXzwvaT48L2I+PC9kdD4NCisJPGRkPiBpcyB0aGUgb3B0aW9uYWwgbmFtZXNwYWNlIHByZWZpeCBvZiB0aGUgcmVzcG9uc2UgZWxlbWVudCAoc2VlIGlkZW50aWZpZXIgdHJhbnNsYXRpb24gcnVsZXMmbmJzcDs8YSBocmVmPSIjc2VjOmlkdHJhbnMiPjkuMzwvYT4pPC9zcGFuPjwvZGQ+DQorIDxkdD48Yj48c3BhbiBjbGFzcz0icm9tYW4iPjxpPnJlc3BvbnNlX2VsZW1lbnRfbmFtZTwvaT48L2I+PC9kdD4NCisJPGRkPgkgaXQgdGhlIG5hbWUgb2YgdGhlIHJlc3BvbnNlIGVsZW1lbnQgKHNlZSBpZGVudGlmaWVyIHRyYW5zbGF0aW9uIHJ1bGVzJm5ic3A7PGEgaHJlZj0iI3NlYzppZHRyYW5zIj45LjM8L2E+KTwvc3Bhbj48L2RkPg0KKyA8ZHQ+PGI+PHNwYW4gY2xhc3M9InJvbWFuIj48aT5vdXRwYXJhbTwvaT48L2I+PC9kdD4NCisJPGRkPgkgaXMgdGhlIGRlY2xhcmF0aW9uIG9mIGFuIG91dHB1dCBwYXJhbWV0ZXIgb2YgdGhlIHJlbW90ZSBtZXRob2Q8L3NwYW4+PC9kZD4NCis8L2RsPg0KK1RoZSBnZW5lcmFsIGZvcm0gb2YgYSByZW1vdGUgbWV0aG9kIHNwZWNpZmljYXRpb24gd2l0aCBhIHJlc3BvbnNlIGVsZW1lbnQgZGVjbGFyYXRpb24gZm9yIChtdWx0aXBsZSkgb3V0cHV0IHBhcmFtZXRlcnMgaXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PjxiPmludDwvYj48Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD4gPGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+bmFtZXNwYWNlX3ByZWZpeF9fPGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+bWV0aG9kX25hbWUoPGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+aW5wYXJhbTEsIGlucGFyYW0yLCAuLi4sPGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+IDxiPnN0cnVjdDwvYj4mbmJzcDs8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD5uYW1lc3BhY2VfcHJlZml4X188Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD5yZXNwb25zZV9lbGVtZW50X25hbWUge291dHBhcmFtMTxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250Piwgb3V0cGFyYW0yLCAuLi48Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD59ICZhbXA7YW55cGFyYW0pOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIGNob2ljZSBvZiBuYW1lIGZvciA8aT5hbnlwYXJhbTwvaT4gaGFzIG5vIGVmZmVjdCBvbiB0aGUgU09BUCBlbmNvZGluZyBhbmQgZGVjb2RpbmcgYW5kIGlzIG9ubHkgdXNlZCBhcyBhIHBsYWNlIGhvbGRlciBmb3IgdGhlDQorcmVzcG9uc2UuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBtZXRob2QgcmVxdWVzdCBpcyBlbmNvZGVkIGluIFNPQVAgYXMgYW4gaW5kZXBlbmRlbnQgZWxlbWVudCBhbmQgdGhlDQorbmFtZXNwYWNlIHByZWZpeCwgbWV0aG9kIG5hbWUsIGFuZCBpbnB1dCBwYXJhbWV0ZXJzIGFyZSBlbmNvZGVkIHVzaW5nIHRoZQ0KK2Zvcm1hdDoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEIwRDAiPjx0cj48dGQ+PHR0Pg0KKyZsdDs8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD5uYW1lc3BhY2UtcHJlZml4Ojxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250Pm1ldGhvZC1uYW1lIHhzaTp0eXBlPSI8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD5uYW1lc3BhY2UtcHJlZml4Ojxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250Pm1ldGhvZC1uYW1lJiM2MjsgPGJyIC8+DQorJmx0O2lucGFyYW0tbmFtZTEgeHNpOnR5cGU9Ii4uLiImIzYyOy4uLiZsdDsvaW5wYXJhbS1uYW1lMSYjNjI7IDxiciAvPg0KKyZsdDtpbnBhcmFtLW5hbWUyIHhzaTp0eXBlPSIuLi4iJiM2MjsuLi4mbHQ7L2lucGFyYW0tbmFtZTImIzYyOyA8YnIgLz4NCisuLi4gPGJyIC8+DQorJmx0Oy88Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD5uYW1lc3BhY2UtcHJlZml4Ojxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250Pm1ldGhvZC1uYW1lJiM2MjsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC90dD4NCit3aGVyZSB0aGUgPHR0PmlucGFyYW0tbmFtZTwvdHQ+IGFjY2Vzc29ycyBhcmUgdGhlIGVsZW1lbnQtbmFtZSByZXByZXNlbnRhdGlvbnMgb2YNCit0aGUgPGk+aW5wYXJhbTwvaT4gcGFyYW1ldGVyIG5hbWUgZGVjbGFyYXRpb25zLCBzZWUgU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6aWR0cmFucyI+OS4zPC9hPi4NCisoVGhlIG9wdGlvbmFsIHBhcnRzIHJlc3VsdGluZyBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGFyZSBzaG93biBlbmNsb3NlZCBpbg0KKzxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250Pjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250Pi4pDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBtZXRob2QgcmVzcG9uc2UgaXMgZXhwZWN0ZWQgdG8gYmUgb2YgdGhlIGZvcm06DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBCMEQwIj48dHI+PHRkPjx0dD4NCismbHQ7PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+bmFtZXNwYWNlLXByZWZpeDo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD5yZXNwb25zZS1lbGVtZW50LW5hbWUgeHNpOnR5cGU9Ijxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250Pm5hbWVzcGFjZS1wcmVmaXg6PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+cmVzcG9uc2UtZWxlbWVudC1uYW1lJiM2MjsgPGJyIC8+DQorJmx0O291dHBhcmFtLW5hbWUxIHhzaTp0eXBlPSIuLi4iJiM2MjsuLi4mbHQ7L291dHBhcmFtLW5hbWUxJiM2MjsgPGJyIC8+DQorJmx0O291dHBhcmFtLW5hbWUyIHhzaTp0eXBlPSIuLi4iJiM2MjsuLi4mbHQ7L291dHBhcmFtLW5hbWUyJiM2MjsgPGJyIC8+DQorLi4uIDxiciAvPg0KKyZsdDsvPGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+bmFtZXNwYWNlLXByZWZpeDo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD5yZXNwb25zZS1lbGVtZW50LW5hbWUmIzYyOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3R0Pg0KK3doZXJlIHRoZSA8dHQ+b3V0cGFyYW0tbmFtZTwvdHQ+IGFjY2Vzc29ycyBhcmUgdGhlIGVsZW1lbnQtbmFtZSByZXByZXNlbnRhdGlvbnMgb2YNCit0aGUgPGk+b3V0cGFyYW08L2k+IHBhcmFtZXRlciBuYW1lIGRlY2xhcmF0aW9ucywgc2VlIFNlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOmlkdHJhbnMiPjkuMzwvYT4uDQorKFRoZSBvcHRpb25hbCBwYXJ0cyByZXN1bHRpbmcgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBhcmUgc2hvd24gZW5jbG9zZWQgaW4NCis8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD48Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD4uKQ0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgaW5wdXQgYW5kL29yIG91dHB1dCBwYXJhbWV0ZXJzIGNhbiBiZSBtYWRlIGFub255bW91cywgd2hpY2ggYWxsb3dzIHRoZQ0KK2Rlc2VyaWFsaXphdGlvbiBvZiByZXF1ZXN0cy9yZXNwb25zZXMgd2l0aCBkaWZmZXJlbnQgcGFyYW1ldGVyIG5hbWVzIGFzIGlzDQorZW5kb3JzZWQgYnkgdGhlIFNPQVAgMS4xIHNwZWNpZmljYXRpb24sIHNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzphbm9ueW1vdXMiPjcuMS4xMzwvYT4uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkgICAgIDxoMz48YSBuYW1lPSJ0dGhfc0VjOS4yIj4NCis5LjI8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPkVycm9yIENvZGVzPC9mb250PjwvaDM+PGEgbmFtZT0ic2VjOmVycmNvZGVzIj4NCis8L2E+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBlcnJvciBjb2RlcyByZXR1cm5lZCBieSB0aGUgc3R1YiBhbmQgc2tlbGV0b24gcm91dGluZXMgYXJlIGxpc3RlZCBiZWxvdy4NCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNEMEQwRDAiPjx0cj48dGQ+PHNwYW4gY2xhc3M9InJvbWFuIj4NCisNCis8dGFibGU+DQorPHRyPjx0ZCBhbGlnbj0icmlnaHQiPjxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5Db2RlPC9iPjwvZm9udD4gPC90ZD48dGQ+PGZvbnQgY29sb3I9IiNGRjAwMDAiPjxiPkRlc2NyaXB0aW9uPC9iPjwvZm9udD4gPC90ZD48L3RyPg0KKzx0cj48dGQgYWxpZ249InJpZ2h0Ij48aT5TT0FQX09LPC9pPiA8L3RkPjx0ZD5ObyBlcnJvciA8L3RkPjwvdHI+DQorPHRyPjx0ZCBhbGlnbj0icmlnaHQiPjxpPlNPQVBfQ0xJX0ZBVUxUPC9pPiogPC90ZD48dGQ+VGhlIHNlcnZpY2UgcmV0dXJuZWQgYSBjbGllbnQgZmF1bHQgKFNPQVAgMS4yIFNlbmRlciBmYXVsdCk8L3RkPjwvdHI+DQorPHRyPjx0ZCBhbGlnbj0icmlnaHQiPjxpPlNPQVBfU1ZSX0ZBVUxUPC9pPiogPC90ZD48dGQ+VGhlIHNlcnZpY2UgcmV0dXJuZWQgYSBzZXJ2ZXIgZmF1bHQgKFNPQVAgMS4yIFJlY2VpdmVyIGZhdWx0KTwvdGQ+PC90cj4NCis8dHI+PHRkIGFsaWduPSJyaWdodCI+PGk+U09BUF9UQUdfTUlTTUFUQ0g8L2k+IDwvdGQ+PHRkPkFuIFhNTCBlbGVtZW50IGRpZG4ndCBjb3JyZXNwb25kIHRvIGFueXRoaW5nIGV4cGVjdGVkIDwvdGQ+PC90cj4NCis8dHI+PHRkIGFsaWduPSJyaWdodCI+PGk+U09BUF9UWVBFPC9pPiA8L3RkPjx0ZD5BbiBYTUwgU2NoZW1hIHR5cGUgbWlzbWF0Y2ggPC90ZD48L3RyPg0KKzx0cj48dGQgYWxpZ249InJpZ2h0Ij48aT5TT0FQX1NZTlRBWF9FUlJPUjwvaT4gPC90ZD48dGQ+QW4gWE1MIHN5bnRheCBlcnJvciBvY2N1cnJlZCBvbiB0aGUgaW5wdXQgPC90ZD48L3RyPg0KKzx0cj48dGQgYWxpZ249InJpZ2h0Ij48aT5TT0FQX05PX1RBRzwvaT4gPC90ZD48dGQ+QmVnaW4gb2YgYW4gZWxlbWVudCBleHBlY3RlZCwgYnV0IG5vdCBmb3VuZCA8L3RkPjwvdHI+DQorPHRyPjx0ZCBhbGlnbj0icmlnaHQiPjxpPlNPQVBfSU9CPC9pPiA8L3RkPjx0ZD5BcnJheSBpbmRleCBvdXQgb2YgYm91bmRzIDwvdGQ+PC90cj4NCis8dHI+PHRkIGFsaWduPSJyaWdodCI+PGk+U09BUF9NVVNUVU5ERVJTVEFORDwvaT4qIDwvdGQ+PHRkPkFuIGVsZW1lbnQgbmVlZHMgdG8gYmUgaWdub3JlZCB0aGF0IG5lZWQgdG8gYmUgdW5kZXJzdG9vZCA8L3RkPjwvdHI+DQorPHRyPjx0ZCBhbGlnbj0icmlnaHQiPjxpPlNPQVBfTkFNRVNQQUNFPC9pPiA8L3RkPjx0ZD5OYW1lc3BhY2UgbmFtZSBtaXNtYXRjaCAodmFsaWRhdGlvbiBlcnJvcikgPC90ZD48L3RyPg0KKzx0cj48dGQgYWxpZ249InJpZ2h0Ij48aT5TT0FQX09CSl9NSVNNQVRDSDwvaT4gPC90ZD48dGQ+TWlzbWF0Y2ggaW4gdGhlIHNpemUgYW5kL29yIHNoYXBlIG9mIGFuIG9iamVjdCA8L3RkPjwvdHI+DQorPHRyPjx0ZCBhbGlnbj0icmlnaHQiPjxpPlNPQVBfRkFUQUxfRVJST1I8L2k+IDwvdGQ+PHRkPkludGVybmFsIGVycm9yIDwvdGQ+PC90cj4NCis8dHI+PHRkIGFsaWduPSJyaWdodCI+PGk+U09BUF9GQVVMVDwvaT4gPC90ZD48dGQ+QW4gZXhjZXB0aW9uIHJhaXNlZCBieSB0aGUgc2VydmljZSA8L3RkPjwvdHI+DQorPHRyPjx0ZCBhbGlnbj0icmlnaHQiPjxpPlNPQVBfTk9fTUVUSE9EPC9pPiA8L3RkPjx0ZD5Ta2VsZXRvbiBlcnJvcjogdGhlIHNrZWxldG9uIGNhbm5vdCBzZXJ2ZSB0aGUgbWV0aG9kIDwvdGQ+PC90cj4NCis8dHI+PHRkIGFsaWduPSJyaWdodCI+PGk+U09BUF9HRVRfTUVUSE9EPC9pPiA8L3RkPjx0ZD5VbnN1cHBvcnRlZCBIVFRQIEdFVCA8L3RkPjwvdHI+DQorPHRyPjx0ZCBhbGlnbj0icmlnaHQiPjxpPlNPQVBfRU9NPC9pPiA8L3RkPjx0ZD5PdXQgb2YgbWVtb3J5IDwvdGQ+PC90cj4NCis8dHI+PHRkIGFsaWduPSJyaWdodCI+PGk+U09BUF9OVUxMPC9pPiA8L3RkPjx0ZD5BbiBlbGVtZW50IHdhcyBudWxsLCB3aGlsZSBpdCBpcyBub3Qgc3VwcG9zZWQgdG8gYmUgbnVsbCA8L3RkPjwvdHI+DQorPHRyPjx0ZCBhbGlnbj0icmlnaHQiPjxpPlNPQVBfTVVMVElfSUQ8L2k+IDwvdGQ+PHRkPk11bHRpcGxlIG9jY3VycmVuY2VzIG9mIHRoZSBzYW1lIGVsZW1lbnQgSUQgb24gdGhlIGlucHV0IDwvdGQ+PC90cj4NCis8dHI+PHRkIGFsaWduPSJyaWdodCI+PGk+U09BUF9NSVNTSU5HX0lEPC9pPiA8L3RkPjx0ZD5FbGVtZW50IElEIG1pc3NpbmcgZm9yIGFuIEhSRUYgb24gdGhlIGlucHV0IDwvdGQ+PC90cj4NCis8dHI+PHRkIGFsaWduPSJyaWdodCI+PGk+U09BUF9IUkVGPC9pPiA8L3RkPjx0ZD5SZWZlcmVuY2UgdG8gb2JqZWN0IGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBvYmplY3QgcmVmZXJlZCB0byA8L3RkPjwvdHI+DQorPHRyPjx0ZCBhbGlnbj0icmlnaHQiPjxpPlNPQVBfVURQX0VSUk9SPC9pPiA8L3RkPjx0ZD5NZXNzYWdlIHRvbyBsYXJnZSB0byBzdG9yZSBpbiBVRFAgcGFja2V0IDwvdGQ+PC90cj4NCis8dHI+PHRkIGFsaWduPSJyaWdodCI+PGk+U09BUF9UQ1BfRVJST1I8L2k+IDwvdGQ+PHRkPkEgY29ubmVjdGlvbiBlcnJvciBvY2N1cmVkIDwvdGQ+PC90cj4NCis8dHI+PHRkIGFsaWduPSJyaWdodCI+PGk+U09BUF9IVFRQX0VSUk9SPC9pPiA8L3RkPjx0ZD5BbiBIVFRQIGVycm9yIG9jY3VyZWQgPC90ZD48L3RyPg0KKzx0cj48dGQgYWxpZ249InJpZ2h0Ij48aT5TT0FQX1NTTF9FUlJPUjwvaT4gPC90ZD48dGQ+QW4gU1NMIGVycm9yIG9jY3VyZWQgPC90ZD48L3RyPg0KKzx0cj48dGQgYWxpZ249InJpZ2h0Ij48aT5TT0FQX1pMSUJfRVJST1I8L2k+IDwvdGQ+PHRkPkEgWmxpYiBlcnJvciBvY2N1cmVkIDwvdGQ+PC90cj4NCis8dHI+PHRkIGFsaWduPSJyaWdodCI+PGk+U09BUF9QTFVHSU5fRVJST1I8L2k+IDwvdGQ+PHRkPkZhaWxlZCB0byByZWdpc3RlciBwbHVnaW4gPC90ZD48L3RyPg0KKzx0cj48dGQgYWxpZ249InJpZ2h0Ij48aT5TT0FQX01JTUVfRVJST1I8L2k+IDwvdGQ+PHRkPk1JTUUgcGFyc2luZyBlcnJvciA8L3RkPjwvdHI+DQorPHRyPjx0ZCBhbGlnbj0icmlnaHQiPjxpPlNPQVBfRElNRV9FUlJPUjwvaT4gPC90ZD48dGQ+RElNRSBwYXJzaW5nIGVycm9yIDwvdGQ+PC90cj4NCis8dHI+PHRkIGFsaWduPSJyaWdodCI+PGk+U09BUF9ESU1FX0VORDwvaT4gPC90ZD48dGQ+RW5kIG9mIERJTUUgZXJyb3IgPC90ZD48L3RyPg0KKzx0cj48dGQgYWxpZ249InJpZ2h0Ij48aT5TT0FQX0RJTUVfSFJFRjwvaT4gPC90ZD48dGQ+RElNRSBhdHRhY2htZW50IGhhcyBubyBocmVmIGZyb20gU09BUCBib2R5IDwvdGQ+PC90cj4NCis8dHI+PHRkIGFsaWduPSJyaWdodCI+PC90ZD48dGQ+KGFuZCBubyBESU1FIGNhbGxiYWNrcyB3ZXJlIGRlZmluZWQgdG8gc2F2ZSB0aGUgYXR0YWNobWVudCkgPC90ZD48L3RyPg0KKzx0cj48dGQgYWxpZ249InJpZ2h0Ij48aT5TT0FQX0RJTUVfTUlTTUFUQ0g8L2k+IDwvdGQ+PHRkPkRJTUUgdmVyc2lvbi90cmFuc21pc3Npb24gZXJyb3IgPC90ZD48L3RyPg0KKzx0cj48dGQgYWxpZ249InJpZ2h0Ij48aT5TT0FQX1ZFUlNJT05NSVNNQVRDSDwvaT4qIDwvdGQ+PHRkPlNPQVAgdmVyc2lvbiBtaXNtYXRjaCBvciBubyBTT0FQIG1lc3NhZ2UgPC90ZD48L3RyPg0KKzx0cj48dGQgYWxpZ249InJpZ2h0Ij48aT5TT0FQX0RBVEFFTkNPRElOR1VOS05PV048L2k+IDwvdGQ+PHRkPlNPQVAgMS4yIERhdGFFbmNvZGluZ1Vua25vd24gZmF1bHQgPC90ZD48L3RyPg0KKzx0cj48dGQgYWxpZ249InJpZ2h0Ij48aT5TT0FQX1JFUVVJUkVEPC9pPiA8L3RkPjx0ZD5BdHRyaWJ1dGVkIHJlcXVpcmVkIHZhbGlkYXRpb24gZXJyb3IgPC90ZD48L3RyPg0KKzx0cj48dGQgYWxpZ249InJpZ2h0Ij48aT5TT0FQX1BST0hJQklURUQ8L2k+IDwvdGQ+PHRkPkF0dHJpYnV0ZWQgcHJvaGliaXRlZCB2YWxpZGF0aW9uIGVycm9yIDwvdGQ+PC90cj4NCis8dHI+PHRkIGFsaWduPSJyaWdodCI+PGk+U09BUF9PQ0NVUlM8L2k+IDwvdGQ+PHRkPkVsZW1lbnQgbWluT2NjdXJzL21heE9jY3VycyB2YWxpZGF0aW9uIGVycm9yIDwvdGQ+PC90cj4NCis8dHI+PHRkIGFsaWduPSJyaWdodCI+PGk+U09BUF9MRU5HVEg8L2k+IDwvdGQ+PHRkPkVsZW1lbnQgbGVuZ3RoIHZhbGlkYXRpb24gZXJyb3IgPC90ZD48L3RyPg0KKzx0cj48dGQgYWxpZ249InJpZ2h0Ij48aT5TT0FQX0VPRjwvaT4gPC90ZD48dGQ+VW5leHBlY3RlZCBlbmQgb2YgZmlsZSwgbm8gaW5wdXQsIG9yIHRpbWVvdXQgd2hpbGUgcmVjZWl2aW5nIGRhdGEgPC90ZD48L3RyPjwvdGFibGU+DQorDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvc3Bhbj4NCitUaGUgZXJyb3IgY29kZXMgdGhhdCBhcmUgcmV0dXJuZWQgYnkgYSBzdHViIHJvdXRpbmUgKHByb3h5KSB1cG9uIHJlY2VpdmluZyBhDQorU09BUCBGYXVsdCBmcm9tIHRoZSBzZXJ2ZXIgYXJlIG1hcmtlZCAoKikuICBUaGUgcmVtYWluaW5nIGVycm9yIGNvZGVzIGFyZQ0KK2dlbmVyYXRlZCBieSB0aGUgcHJveHkgaXRzZWxmIGFzIGEgcmVzdWx0IG9mIHByb2JsZW1zIHdpdGggYSBTT0FQIHBheWxvYWQuICBUaGUNCitlcnJvciBjb2RlIGlzIDxpPlNPQVBfT0s8L2k+IHdoZW4gdGhlIHJlbW90ZSBtZXRob2QgY2FsbCB3YXMgc3VjY2Vzc2Z1bCAodGhlDQorPGk+U09BUF9PSzwvaT4gcHJlZGVmaW5lZCBjb25zdGFudCBpcyBndWFyYW50ZWVkIHRvIGJlIDxpPjA8L2k+KS4gIFRoZSBlcnJvcg0KK2NvZGUgaXMgYWxzbyBzdG9yZWQgaW4gPGk+c29hcC5lcnJvcjwvaT4sIHdoZXJlIDxpPnNvYXA8L2k+IGlzIGEgdmFyaWFibGUgdGhhdA0KK2NvbnRhaW5zIHRoZSBjdXJyZW50IHJ1bnRpbWUgZW52aXJvbm1lbnQuIFRoZSBmdW5jdGlvbg0KKzxpPnNvYXBfcHJpbnRfZmF1bHQoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIEZJTEUgKmZkKTwvaT4gY2FuIGJlIGNhbGxlZCB0bw0KK2Rpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSBvbiA8aT5mZDwvaT4gd2hlcmUgY3VycmVudCB2YWx1ZSBvZiB0aGUNCis8aT5zb2FwLmVycm9yPC9pPiB2YXJpYWJsZSBpcyB1c2VkIGJ5IHRoZSBmdW5jdGlvbiB0byBkaXNwbGF5IHRoZSBlcnJvci4gIFRoZQ0KK2Z1bmN0aW9uIDxpPnNvYXBfcHJpbnRfZmF1bHRfbG9jYXRpb24oPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIEZJTEUgKmZkKTwvaT4NCitwcmludHMgdGhlIGxvY2F0aW9uIG9mIHRoZSBlcnJvciBpZiB0aGUgZXJyb3IgaXMgYSByZXN1bHQgZnJvbSBwYXJzaW5nIFhNTC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorQSByZW1vdGUgbWV0aG9kIGltcGxlbWVudGVkIGluIGEgU09BUCBzZXJ2aWNlIE1VU1QgcmV0dXJuIGFuIGVycm9yIGNvZGUgYXMgdGhlDQorZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUuIDxpPlNPQVBfT0s8L2k+IGRlbm90ZXMgc3VjY2VzcyBhbmQgPGk+U09BUF9GQVVMVDwvaT4NCitkZW5vdGVzIGFuIGV4Y2VwdGlvbi4gVGhlIGV4Y2VwdGlvbiBkZXRhaWxzIGNhbiBiZSBhc3NpZ25lZCB3aXRoIHRoZQ0KKzxpPnNvYXBfcmVjZWl2ZXJfZmF1bHQoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KmZhdWx0c3RyaW5nLA0KKzxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KmRldGFpbCk8L2k+IHdoaWNoIHNldHMgdGhlIHN0cmluZ3MNCis8aT5zb2FwLmZhdWx0PC9pPjx0dD4tJmd0OzwvdHQ+PGk+ZmF1bHRzdHJpbmc8L2k+IGFuZA0KKzxpPnNvYXAuZmF1bHQ8L2k+PHR0Pi0mZ3Q7PC90dD48aT5kZXRhaWw8L2k+IGZvciBTT0FQIDEuMSwgYW5kDQorPGk+c29hcC5mYXVsdDwvaT48dHQ+LSZndDs8L3R0PjxpPlNPQVBfRU5WX19SZWFzb248L2k+IGFuZA0KKzxpPnNvYXAuZmF1bHQ8L2k+PHR0Pi0mZ3Q7PC90dD48aT5TT0FQX0VOVl9fRGV0YWlsPC9pPiBmb3IgU09BUCAxLjIsIHdoZXJlDQorPGk+c29hcDwvaT4gaXMgYSB2YXJpYWJsZSB0aGF0IGNvbnRhaW5zIHRoZSBjdXJyZW50IHJ1bnRpbWUgZW52aXJvbm1lbnQsIHNlZQ0KK1NlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOmZhdWx0Ij4xMTwvYT4uDQorQSByZWNlaXZlciBlcnJvciBpbmRpY2F0ZXMgdGhhdCB0aGUgc2VydmljZSBjYW4ndCBoYW5kbGUgdGhlIHJlcXVlc3QsIGJ1dCBjYW4gcG9zc2libHkgcmVjb3ZlciBmcm9tIHRoZSBlcnJvci4NCitUbyByZXR1cm4gYW4gdW5yZWNvdmVyYWJsZSBlcnJvciwgdXNlIDxpPnNvYXBfcmVjZWl2ZXJfZmF1bHQoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KmZhdWx0c3RyaW5nLA0KKzxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KmRldGFpbCk8L2k+Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUbyByZXR1cm4gYSBIVFRQIGVycm9yIGNvZGUgYSBzZXJ2aWNlIG1ldGhvZCBjYW4gc2ltcGx5IHJldHVybiB0aGUgSFRUUCBlcnJvciBjb2RlIG51bWJlci4NCitGb3IgZXhhbXBsZSwgPGk+PGI+cmV0dXJuPC9iPiZuYnNwOzQwNDs8L2k+IHJldHVybnMgYSAiNDA0IE5vdCBGb3VuZCIgSFRUUCBlcnJvciBiYWNrIHRvIHRoZSBjbGllbnQuICBUaGUgPGk+c29hcC5lcnJvcjwvaT4NCitpcyBzZXQgdG8gdGhlIEhUVFAgZXJyb3IgY29kZSBhdCB0aGUgY2xpZW50IHNpZGUuDQorVGhlIEhUVFAgMS4xIGVycm9yIGNvZGVzIGFyZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNEMEQwRDAiPjx0cj48dGQ+PHNwYW4gY2xhc3M9InJvbWFuIj4NCisNCis8dGFibGU+DQorPHRyPjx0ZCBhbGlnbj0icmlnaHQiPjxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj4jPC9iPjwvZm9udD4gPC90ZD48dGQ+PGZvbnQgY29sb3I9IiNGRjAwMDAiPjxiPkVycm9yPC9iPjwvZm9udD4gPC90ZD48L3RyPg0KKzx0cj48dGQgYWxpZ249InJpZ2h0Ij4yMDEgPC90ZD48dGQ+Q3JlYXRlZCA8L3RkPjwvdHI+DQorPHRyPjx0ZCBhbGlnbj0icmlnaHQiPjIwMiA8L3RkPjx0ZD5BY2NlcHRlZCA8L3RkPjwvdHI+DQorPHRyPjx0ZCBhbGlnbj0icmlnaHQiPjIwMyA8L3RkPjx0ZD5Ob24tQXV0aG9yaXRhdGl2ZSBJbmZvcm1hdGlvbiA8L3RkPjwvdHI+DQorPHRyPjx0ZCBhbGlnbj0icmlnaHQiPjIwNCA8L3RkPjx0ZD5ObyBDb250ZW50IDwvdGQ+PC90cj4NCis8dHI+PHRkIGFsaWduPSJyaWdodCI+MjA1IDwvdGQ+PHRkPlJlc2V0IENvbnRlbnQgPC90ZD48L3RyPg0KKzx0cj48dGQgYWxpZ249InJpZ2h0Ij4yMDYgPC90ZD48dGQ+UGFydGlhbCBDb250ZW50IDwvdGQ+PC90cj4NCis8dHI+PHRkIGFsaWduPSJyaWdodCI+MzAwIDwvdGQ+PHRkPk11bHRpcGxlIENob2ljZXMgPC90ZD48L3RyPg0KKzx0cj48dGQgYWxpZ249InJpZ2h0Ij4zMDEgPC90ZD48dGQ+TW92ZWQgUGVybWFuZW50bHkgPC90ZD48L3RyPg0KKzx0cj48dGQgYWxpZ249InJpZ2h0Ij4zMDIgPC90ZD48dGQ+Rm91bmQgPC90ZD48L3RyPg0KKzx0cj48dGQgYWxpZ249InJpZ2h0Ij4zMDMgPC90ZD48dGQ+U2VlIE90aGVyIDwvdGQ+PC90cj4NCis8dHI+PHRkIGFsaWduPSJyaWdodCI+MzA0IDwvdGQ+PHRkPk5vdCBNb2RpZmllZCA8L3RkPjwvdHI+DQorPHRyPjx0ZCBhbGlnbj0icmlnaHQiPjMwNSA8L3RkPjx0ZD5Vc2UgUHJveHkgPC90ZD48L3RyPg0KKzx0cj48dGQgYWxpZ249InJpZ2h0Ij4zMDcgPC90ZD48dGQ+VGVtcG9yYXJ5IFJlZGlyZWN0IDwvdGQ+PC90cj4NCis8dHI+PHRkIGFsaWduPSJyaWdodCI+NDAwIDwvdGQ+PHRkPkJhZCBSZXF1ZXN0IDwvdGQ+PC90cj4NCis8dHI+PHRkIGFsaWduPSJyaWdodCI+NDAxIDwvdGQ+PHRkPlVuYXV0aG9yaXplZCA8L3RkPjwvdHI+DQorPHRyPjx0ZCBhbGlnbj0icmlnaHQiPjQwMiA8L3RkPjx0ZD5QYXltZW50IFJlcXVpcmVkIDwvdGQ+PC90cj4NCis8dHI+PHRkIGFsaWduPSJyaWdodCI+NDAzIDwvdGQ+PHRkPkZvcmJpZGRlbiA8L3RkPjwvdHI+DQorPHRyPjx0ZCBhbGlnbj0icmlnaHQiPjQwNCA8L3RkPjx0ZD5Ob3QgRm91bmQgPC90ZD48L3RyPg0KKzx0cj48dGQgYWxpZ249InJpZ2h0Ij40MDUgPC90ZD48dGQ+TWV0aG9kIE5vdCBBbGxvd2VkIDwvdGQ+PC90cj4NCis8dHI+PHRkIGFsaWduPSJyaWdodCI+NDA2IDwvdGQ+PHRkPk5vdCBBY2NlcHRhYmxlIDwvdGQ+PC90cj4NCis8dHI+PHRkIGFsaWduPSJyaWdodCI+NDA3IDwvdGQ+PHRkPlByb3h5IEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkIDwvdGQ+PC90cj4NCis8dHI+PHRkIGFsaWduPSJyaWdodCI+NDA4IDwvdGQ+PHRkPlJlcXVlc3QgVGltZS1vdXQgPC90ZD48L3RyPg0KKzx0cj48dGQgYWxpZ249InJpZ2h0Ij40MDkgPC90ZD48dGQ+Q29uZmxpY3QgPC90ZD48L3RyPg0KKzx0cj48dGQgYWxpZ249InJpZ2h0Ij40MTAgPC90ZD48dGQ+R29uZSA8L3RkPjwvdHI+DQorPHRyPjx0ZCBhbGlnbj0icmlnaHQiPjQxMSA8L3RkPjx0ZD5MZW5ndGggUmVxdWlyZWQgPC90ZD48L3RyPg0KKzx0cj48dGQgYWxpZ249InJpZ2h0Ij40MTIgPC90ZD48dGQ+UHJlY29uZGl0aW9uIEZhaWxlZCA8L3RkPjwvdHI+DQorPHRyPjx0ZCBhbGlnbj0icmlnaHQiPjQxMyA8L3RkPjx0ZD5SZXF1ZXN0IEVudGl0eSBUb28gTGFyZ2UgPC90ZD48L3RyPg0KKzx0cj48dGQgYWxpZ249InJpZ2h0Ij40MTQgPC90ZD48dGQ+UmVxdWVzdC1VUkkgVG9vIExhcmdlIDwvdGQ+PC90cj4NCis8dHI+PHRkIGFsaWduPSJyaWdodCI+NDE1IDwvdGQ+PHRkPlVuc3VwcG9ydGVkIE1lZGlhIFR5cGUgPC90ZD48L3RyPg0KKzx0cj48dGQgYWxpZ249InJpZ2h0Ij40MTYgPC90ZD48dGQ+UmVxdWVzdGVkIHJhbmdlIG5vdCBzYXRpc2ZpYWJsZSA8L3RkPjwvdHI+DQorPHRyPjx0ZCBhbGlnbj0icmlnaHQiPjQxNyA8L3RkPjx0ZD5FeHBlY3RhdGlvbiBGYWlsZWQgPC90ZD48L3RyPg0KKzx0cj48dGQgYWxpZ249InJpZ2h0Ij41MDAgPC90ZD48dGQ+SW50ZXJuYWwgU2VydmVyIEVycm9yIDwvdGQ+PC90cj4NCis8dHI+PHRkIGFsaWduPSJyaWdodCI+NTAxIDwvdGQ+PHRkPk5vdCBJbXBsZW1lbnRlZCA8L3RkPjwvdHI+DQorPHRyPjx0ZCBhbGlnbj0icmlnaHQiPjUwMiA8L3RkPjx0ZD5CYWQgR2F0ZXdheSA8L3RkPjwvdHI+DQorPHRyPjx0ZCBhbGlnbj0icmlnaHQiPjUwMyA8L3RkPjx0ZD5TZXJ2aWNlIFVuYXZhaWxhYmxlIDwvdGQ+PC90cj4NCis8dHI+PHRkIGFsaWduPSJyaWdodCI+NTA0IDwvdGQ+PHRkPkdhdGV3YXkgVGltZS1vdXQgPC90ZD48L3RyPg0KKzx0cj48dGQgYWxpZ249InJpZ2h0Ij41MDUgPC90ZD48dGQ+SFRUUCBWZXJzaW9uIG5vdCBzdXBwb3J0ZWQgPC90ZD48L3RyPjwvdGFibGU+DQorDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvc3Bhbj4NCitUaGUgZXJyb3IgY29kZXMgYXJlIGdpdmVuIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkuIFRoZSBIVFRQIHByb3RvY29sIHJlcXVpcmVzIHRoZSBwcm9wZXIgYWN0aW9ucyBhZnRlciBhbiBlcnJvciBpcyBpc3N1ZWQuIGdTT0FQJ3MgSFRUUCAxLjAvMS4xIGhhbmRsaW5nIGlzIGF1dG9tYXRpYy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCSAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWM5LjMiPg0KKzkuMzwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+Qy9DKysgSWRlbnRpZmllciBOYW1lIHRvIFhNTCBOYW1lIFRyYW5zbGF0aW9uczwvZm9udD48L2gzPjxhIG5hbWU9InNlYzppZHRyYW5zIj4NCis8L2E+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK09uZSBvZiB0aGUgInNlY3JldHMiIGJlaGluZCB0aGUgcG93ZXIgYW5kIGZsZXhpYmlsaXR5IG9mIGdTT0FQJ3MgZW5jb2RpbmcgYW5kDQorZGVjb2Rpbmcgb2YgcmVtb3RlIG1ldGhvZCBuYW1lcywgY2xhc3MgbmFtZXMsIHR5cGUgaWRlbnRpZmllcnMsIGFuZCBzdHJ1Y3Qgb3INCitjbGFzcyBmaWVsZHMgaXMgdGhlIGFiaWxpdHkgdG8gc3BlY2lmeSBuYW1lc3BhY2UgcHJlZml4ZXMgd2l0aCB0aGVzZSBuYW1lcyB0aGF0DQorYXJlIHVzZWQgdG8gZGVub3RlIHRoZWlyIGVuY29kaW5nIHN0eWxlLiBNb3JlIHNwZWNpZmljYWxseSwgYSBDL0MrKyBpZGVudGlmaWVyDQorbmFtZSBvZiB0aGUgZm9ybQ0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD5uYW1lc3BhY2VfcHJlZml4X188Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD5lbGVtZW50X25hbWUNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK3dpbGwgYmUgZW5jb2RlZCBpbiBYTUwgYXMNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEIwRDAiPjx0cj48dGQ+PHR0Pg0KKyZsdDs8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD5uYW1lc3BhY2UtcHJlZml4Ojxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PmVsZW1lbnQtbmFtZSAuLi4mIzYyOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3R0Pg0KK1RoZSA8Yj51bmRlcnNjb3JlIHBhaXI8L2I+ICg8aT5fXzwvaT4pIHNlcGFyYXRlcyB0aGUgbmFtZXNwYWNlIHByZWZpeCBmcm9tIHRoZQ0KK2VsZW1lbnQgbmFtZS4gIEVhY2ggbmFtZXNwYWNlIHByZWZpeCBoYXMgYSBuYW1lc3BhY2UgVVJJIHNwZWNpZmllZCBieSBhDQorbmFtZXNwYWNlIG1hcHBpbmcgdGFibGUmbmJzcDs8YSBocmVmPSIjc2VjOm5zdGFibGUiPjkuNDwvYT4sIHNlZSBhbHNvDQorU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6bmFtZXNwYWNlIj43LjEuMjwvYT4uICBUaGUgbmFtZXNwYWNlIFVSSSBpcyBhIHVuaXF1ZSBpZGVudGlmaWNhdGlvbiB0aGF0DQorY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVtb3RlIG1ldGhvZHMgYW5kIGRhdGEgdHlwZXMuICBUaGUgbmFtZXNwYWNlIFVSSQ0KK2Rpc2FtYmlndWF0ZXMgcG90ZW50aWFsbHkgaWRlbnRpY2FsIHJlbW90ZSBtZXRob2QgbmFtZXMgYW5kIGRhdGEgdHlwZSBuYW1lcw0KK3VzZWQgYnkgZGlzcGFyYXRlIG9yZ2FuaXphdGlvbnMuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1hNTCBlbGVtZW50IG5hbWVzIGFyZSBOQ05hbWVzIChyZXN0cmljdGVkIHN0cmluZ3MpIHRoYXQgTUFZIGNvbnRhaW4gPGI+DQoraHlwaGVuczwvYj4sIDxiPmRvdHM8L2I+LCBhbmQgPGI+dW5kZXJzY29yZXM8L2I+LiAgVGhlIHNwZWNpYWwgY2hhcmFjdGVycyBpbiB0aGUgWE1MDQorZWxlbWVudCBuYW1lcyBvZiByZW1vdGUgbWV0aG9kcywgc3RydWN0cywgY2xhc3NlcywgdHlwZWRlZnMsIGFuZCBmaWVsZHMgY2FuIGJlDQorY29udHJvbGxlZCB1c2luZyB0aGUgZm9sbG93aW5nIGNvbnZlbnRpb25zOiBBIDxiPnNpbmdsZSB1bmRlcnNjb3JlPC9iPiBpbiBhDQorbmFtZXNwYWNlIHByZWZpeCBvciBpZGVudGlmaWVyIG5hbWUgaXMgcmVwbGFjZWQgYnkgYSBoeXBoZW4gKDx0dD4tPC90dD4pIGluIHRoZQ0KK1hNTCBlbGVtZW50IG5hbWUuICBGb3IgZXhhbXBsZSwgdGhlIGlkZW50aWZpZXIgbmFtZSA8aT5TT0FQX0VOQ19fdXJfdHlwZTwvaT4NCitpcyByZXByZXNlbnRlZCBpbiBYTUwgYXMgPHR0PlNPQVAtRU5DOnVyLXR5cGU8L3R0Pi4gIFRoZSBzZXF1ZW5jZSA8aT5fRE9UPC9pPiBpcw0KK3JlcGxhY2VkIGJ5IGEgZG90ICg8dHQ+LjwvdHQ+KSwgYW5kIHRoZSBzZXF1ZW5jZSA8aT5fVVNDT1JFPC9pPiBpcyByZXBsYWNlZCBieQ0KK2FuIHVuZGVyc2NvcmUgKDx0dD5fPC90dD4pIGluIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBlbGVtZW50IG5hbWUuICBGb3IgZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7bl9zX19iaXpfRE9UY29tIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqbl9zX19iaXpfVVNDT1JFbmFtZTsgPGJyIC8+DQorfTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK2lzIGVuY29kZWQgaW4gWE1MIGFzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwQjBEMCI+PHRyPjx0ZD48dHQ+DQorJmx0O24tczpiaXouY29tIHhzaTp0eXBlPSJuLXM6Yml6LmNvbSImIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbHQ7bi1zOmJpel9uYW1lIHhzaTp0eXBlPSJzdHJpbmciJiM2MjtCaXp5Yml6Jmx0Oy9uLXM6Yml6X25hbWUmIzYyOyA8YnIgLz4NCismbHQ7L24tczpiaXouY29tJiM2MjsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC90dD4NCitUcmFpbGluZyB1bmRlcnNjb3JlcyBvZiBhbiBpZGVudGlmaWVyIG5hbWUgYXJlIG5vdCB0cmFuc2xhdGVkIGludG8gdGhlIFhNTA0KK3JlcHJlc2VudGF0aW9uLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGFuIGlkZW50aWZpZXIgbmFtZSBjbGFzaGVzIHdpdGggYSBDKysNCitrZXl3b3JkLiBGb3IgZXhhbXBsZSwgPHR0PnJldHVybjwvdHQ+IGlzIG9mdGVuIHVzZWQgYXMgYW4gYWNjZXNzb3IgbmFtZSBpbiBhIFNPQVANCityZXNwb25zZSBlbGVtZW50LiAgVGhlIDx0dD5yZXR1cm48L3R0PiBlbGVtZW50IGNhbiBiZSBzcGVjaWZpZWQgYXMgPGk+cmV0dXJuXzwvaT4NCitpbiB0aGUgQysrIHNvdXJjZSBjb2RlLiBOb3RlIHRoYXQgWE1MIHNob3VsZCBiZSB0cmVhdGVkIGFzIGNhc2Ugc2Vuc2l0aXZlLCBzbw0KK3RoZSB1c2Ugb2YgZS5nLiA8aT5SZXR1cm48L2k+IG1heSBub3QgYWx3YXlzIHdvcmsgdG8gYXZvaWQgYSBuYW1lIGNsYXNoIHdpdGggdGhlDQorPGk+PGI+cmV0dXJuPC9iPjwvaT4ga2V5d29yZC4gIFRoZSB1c2Ugb2YgdHJhaWxpbmcgdW5kZXJzY29yZXMgYWxzbyBhbGxvd3MgZm9yDQorZGVmaW5pbmcgPGk+PGI+c3RydWN0PC9iPjwvaT5zIGFuZCA8aT48Yj5jbGFzczwvYj48L2k+ZXMgd2l0aCBlc3NlbnRpYWxseSB0aGUgc2FtZSBYTUwgU2NoZW1hDQordHlwZSBuYW1lLCBidXQgdGhhdCBoYXZlIHRvIGJlIGRpc3Rpbmd1aXNoZWQgYXMgc2VwZXJhdGUgQy9DKysgdHlwZXMuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0ZvciBkZWNvZGluZywgdGhlIHVuZGVyc2NvcmVzIGluIGlkZW50aWZpZXIgbmFtZXMgYWN0IGFzIHdpbGRjYXJkcy4gQW4gWE1MDQorZWxlbWVudCBpcyBwYXJzZWQgYW5kIG1hdGNoZXMgdGhlIG5hbWUgb2YgYW4gaWRlbnRpZmllciBpZiB0aGUgbmFtZSBpcw0KK2lkZW50aWNhbCB0byB0aGUgZWxlbWVudCBuYW1lIChjYXNlIGluc2Vuc2l0aXZlKSBhbmQgdGhlIHVuZGVyc2NvcmVzIGluIHRoZQ0KK2lkZW50aWZpZXIgbmFtZSBhcmUgYWxsb3dlZCB0byBtYXRjaCBhbnkgY2hhcmFjdGVyIGluIHRoZSBlbGVtZW50IG5hbWUuIEZvcg0KK2V4YW1wbGUsIHRoZSBpZGVudGlmaWVyIG5hbWUgPGk+SV93YW50X19zb2FwX2Z1bl90aGVfYmVhX19fRE9UY29tPC9pPg0KK21hdGNoZXMgdGhlIGVsZW1lbnQgbmFtZSA8dHQ+SS13YW50OlNPQVA0ZnVuQHRoZS1iZWFjaC5jb208L3R0Pi4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCSAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWM5LjQiPg0KKzkuNDwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+TmFtZXNwYWNlIE1hcHBpbmcgVGFibGU8L2ZvbnQ+PC9oMz48YSBuYW1lPSJzZWM6bnN0YWJsZSI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitBIG5hbWVzcGFjZSBtYXBwaW5nIHRhYmxlIE1VU1QgYmUgZGVmaW5lZCBieSBjbGllbnRzIGFuZCBzZXJ2aWNlIGFwcGxpY2F0aW9ucy4NCitUaGUgbWFwcGluZyB0YWJsZSBpcyB1c2VkIGJ5IHRoZSBzZXJpYWxpemVycyBhbmQgZGVzZXJpYWxpemVycyBvZiB0aGUgc3R1YiBhbmQNCitza2VsZXRvbiByb3V0aW5lcyB0byBwcm9kdWNlIGEgdmFsaWQgU09BUCBwYXlsb2FkIGFuZCB0byB2YWxpZGF0ZSBhbiBpbmNvbWluZw0KK1NPQVAgcGF5bG9hZC4gIEEgdHlwaWNhbCBtYXBwaW5nIHRhYmxlIGlzIHNob3duIGJlbG93Og0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7TmFtZXNwYWNlIG5hbWVzcGFjZXNbXSA9IDxiciAvPg0KK3smbmJzcDsmbmJzcDsmbmJzcDsvLyB7Im5zLXByZWZpeCIsICJucy1uYW1lIn0gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyJTT0FQLUVOViIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyJ9LCAvLyBNVVNUIGJlIGZpcnN0IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3siU09BUC1FTkMiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8ifSwgLy8gTVVTVCBiZSBzZWNvbmQgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyJ4c2kiLCAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSJ9LCAvLyBNVVNUIGJlIHRoaXJkIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3sieHNkIiwgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEifSwgLy8gUmVxdWlyZWQgZm9yIFhNTCBTY2hlbWEgdHlwZXMgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyJuczEiLCAgICAgICJ1cm46bXktc2VydmljZS1VUkkifSwgLy8gVGhlIG5hbWVzcGFjZSBVUkkgb2YgdGhlIHJlbW90ZSBtZXRob2RzIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3tOVUxMLCBOVUxMfSAvLyBlbmQgb2YgdGFibGUgPGJyIC8+DQorfTsgPGJyIC8+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitFYWNoIG5hbWVzcGFjZSBwcmVmaXggdXNlZCBieSBhIGlkZW50aWZpZXIgbmFtZSBpbiB0aGUgaGVhZGVyIGZpbGUNCitzcGVjaWZpY2F0aW9uIChzZWUgU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6aWR0cmFucyI+OS4zPC9hPikgTVVTVCBoYXZlIGEgYmluZGluZyB0byBhDQorbmFtZXNwYWNlIFVSSSBpbiB0aGUgbWFwcGluZyB0YWJsZS4gVGhlIGVuZCBvZiB0aGUgbmFtZXNwYWNlIG1hcHBpbmcgdGFibGUgTVVTVA0KK2JlIGluZGljYXRlZCBieSB0aGUgPGk+TlVMTDwvaT4gcGFpci4gIFRoZSBuYW1lc3BhY2UgVVJJIG1hdGNoaW5nIGlzIGNhc2UNCitpbnNlbnNpdGl2ZS4gQSBuYW1lc3BhY2UgcHJlZml4IGlzIGRpc3Rpbmd1aXNoZWQgYnkgdGhlIG9jY3VycmVuY2Ugb2YgYSBwYWlyDQorb2YgdW5kZXJzY29yZXMgKDxpPl9fPC9pPikgaW4gYW4gaWRlbnRpZmllci4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorQW4gb3B0aW9uYWwgbmFtZXNwYWNlIHBhdHRlcm4gTUFZIGJlIHByb3ZpZGVkIHdpdGggZWFjaCBuYW1lc3BhY2UgbWFwcGluZyB0YWJsZQ0KK2VudHJ5LiAgVGhlIHBhdHRlcm5zIHByb3ZpZGUgYW4gYWx0ZXJuYXRpdmUgbmFtZXNwYWNlIG1hdGNoaW5nIGZvciB0aGUNCit2YWxpZGF0aW9uIG9mIGRlY29kZWQgU09BUCBtZXNzYWdlcy4gIEluIHRoaXMgcGF0dGVybiwgZGFzaGVzICg8aT4tPC9pPikgYXJlDQorc2luZ2xlLWNoYXJhY3RlciB3aWxkY2FyZHMgYW5kIGFzdGVyaXNrcyAoPGk+KjwvaT4pIGFyZSBtdWx0aS1jaGFyYWN0ZXINCit3aWxkY2FyZHMuICBGb3IgZXhhbXBsZSwgdG8gZGVjb2RlIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBYTUwgU2NoZW1hIHR5cGUgd2l0aA0KK2RpZmZlcmVudCBhdXRob3JpbmcgZGF0ZXMsIGZvdXIgZGFzaGVzIGNhbiBiZSB1c2VkIGluIHBsYWNlIG9mIHRoZSBzcGVjaWZpYw0KK2RhdGVzIGluIHRoZSBuYW1lc3BhY2UgbWFwcGluZyB0YWJsZSBwYXR0ZXJuOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7TmFtZXNwYWNlIG5hbWVzcGFjZXNbXSA9IDxiciAvPg0KK3smbmJzcDsmbmJzcDsmbmJzcDsvLyB7Im5zLXByZWZpeCIsICJucy1uYW1lIiwgIm5zLW5hbWUgdmFsaWRhdGlvbiBwYXR0ZXJuIn0gPGJyIC8+DQorLi4uIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3sieHNpIiwgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCAiaHR0cDovL3d3dy53My5vcmcvPHR0Pi0tLS08L3R0Pi9YTUxTY2hlbWEtaW5zdGFuY2UifSwgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyJ4c2QiLCAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsICJodHRwOi8vd3d3LnczLm9yZy88dHQ+LS0tLTwvdHQ+L1hNTFNjaGVtYSJ9LCA8YnIgLz4NCisuLi4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK09yIGFsdGVybmF0aXZlbHksIGFzdGVyaXNrcyBjYW4gYmUgdXNlZCBhcyB3aWxkY2FyZHMgZm9yIG11bHRpcGxlIGNoYXJhY3RlcnM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtOYW1lc3BhY2UgbmFtZXNwYWNlc1tdID0gPGJyIC8+DQoreyZuYnNwOyZuYnNwOyZuYnNwOy8vIHsibnMtcHJlZml4IiwgIm5zLW5hbWUiLCAibnMtbmFtZSB2YWxpZGF0aW9uIHBhdHRlcm4ifSA8YnIgLz4NCisuLi4gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyJ4c2kiLCAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsICJodHRwOi8vd3d3LnczLm9yZy8qL1hNTFNjaGVtYS1pbnN0YW5jZSJ9LCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7InhzZCIsICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiwgImh0dHA6Ly93d3cudzMub3JnLyovWE1MU2NoZW1hIn0sIDxiciAvPg0KKy4uLg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorQSBuYW1lc3BhY2UgbWFwcGluZyB0YWJsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCB0b2dldGhlciB3aXRoIGEgV1NETCBmaWxlDQorZm9yIGVhY2ggbmFtZXNwYWNlIHByZWZpeCB0aGF0IGlzIHVzZWQgZm9yIGEgcmVtb3RlIG1ldGhvZCBpbiB0aGUgaGVhZGVyIGZpbGUuDQorVGhpcyBuYW1lc3BhY2UgbWFwcGluZyB0YWJsZSBoYXMgZW50cmllcyBmb3IgYWxsIG5hbWVzcGFjZSBwcmVmaXhlcy4gIFRoZQ0KK25hbWVzcGFjZSBVUklzIG5lZWQgdG8gYmUgZmlsbGVkIGluLiBUaGVzZSBhcHBlYXIgYXMgPGk+aHR0cDovL3RlbXB1cmkub3JnPC9pPg0KK2luIHRoZSB0YWJsZS4gIFNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzpkaXJlY3RpdmVzIj4xOC4yPC9hPiBvbiBob3cgdG8gc3BlY2lmeSB0aGUgbmFtZXNwYWNlDQorVVJJcyBpbiB0aGUgaGVhZGVyIGZpbGUuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0ZvciBkZWNvZGluZyBlbGVtZW50cyB3aXRoIG5hbWVzcGFjZSBwcmVmaXhlcywgdGhlIG5hbWVzcGFjZSBVUkkgYXNzb2NpYXRlZCB3aXRoIHRoZSBuYW1lc3BhY2UgcHJlZml4ICh0aHJvdWdoIHRoZSA8dHQ+eG1sbnM8L3R0Pg0KK2F0dHJpYnV0ZSBvZiBhbiBYTUwgZWxlbWVudCkgaXMgc2VhcmNoZWQgZnJvbSB0aGUNCitiZWdpbm5pbmcgdG8gdGhlIGVuZCBpbiBhIG5hbWVzcGFjZSBtYXBwaW5nIHRhYmxlLA0KK2FuZCBmb3IgZXZlcnkgcm93IHRoZSBmb2xsb3dpbmcgdGVzdHMgYXJlIHBlcmZvcm1lZCBhcyBwYXJ0IG9mIHRoZSB2YWxpZGF0aW9uIHByb2Nlc3M6DQorDQorPG9sIHR5cGU9IjEiPg0KKzxsaT4gdGhlIHN0cmluZyBpbiB0aGUgc2Vjb25kIGNvbHVtbiBtYXRjaGVzIHRoZSBuYW1lc3BhY2UgVVJJIChjYXNlIGluc2Vuc2l0aXZlKQ0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8L2xpPg0KKw0KKzxsaT4gdGhlIHN0cmluZyBpbiB0aGUgb3B0aW9uYWwgdGhpcmQgY29sdW1uIG1hdGNoZXMgdGhlIG5hbWVzcGFjZSBVUkkgKGNhc2UgaW5zZW5zaXRpdmUpLCB3aGVyZSA8aT4tPC9pPiBpcyBhIG9uZS1jaGFyYWN0ZXIgd2lsZGNhcmQgYW5kIDxpPio8L2k+IGlzIGENCisgICBtdWx0aS1jaGFyYWN0ZXIgd2lsZGNhcmQNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorPC9saT4NCis8L29sPg0KK1doZW4gYSBtYXRjaCBpcyBmb3VuZCwgdGhlIG5hbWVzcGFjZSBwcmVmaXggaW4gdGhlIGZpcnN0IGNvbHVtbiBvZiB0aGUgdGFibGUgaXMgY29uc2lkZXJlZCBzZW1hbnRpY2FsbHkgaWRlbnRpY2FsIHRvIHRoZSBuYW1lc3BhY2UgcHJlZml4IHVzZWQNCitieSB0aGUgWE1MIGVsZW1lbnQgdG8gYmUgZGVjb2RlZCwgdGhvdWdoIHRoZSBwcmVmaXggbmFtZXMgbWF5IGRpZmZlci4NCitBIHNlcnZpY2Ugd2lsbCByZXNwb25kIHdpdGggdGhlIG5hbWVzcGFjZSB0aGF0IGl0IHJlY2VpdmVkIGZyb20gYSBjbGllbnQgaW4gY2FzZSBpdCBtYXRjaGVzIGEgcGF0dGVybiBpbiB0aGUgdGhpcmQgY29sdW1uLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitGb3IgZXhhbXBsZSwgbGV0J3Mgc2F5IHdlIGhhdmUgdGhlIGZvbGxvd2luZyBzdHJ1Y3RzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7YV9fZWx0IHsgLi4uIH07IDxiciAvPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtiX19lbHQgeyAuLi4gfTsgPGJyIC8+DQorPGI+c3RydWN0PC9iPiZuYnNwO2tfX2VsdCB7IC4uLiB9OyA8YnIgLz4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK2FuZCBhIG5hbWVzcGFjZSBtYXBwaW5nIHRhYmxlIGluIHRoZSBwcm9ncmFtOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7TmFtZXNwYWNlIG5hbWVzcGFjZXNbXSA9IDxiciAvPg0KK3smbmJzcDsmbmJzcDsmbmJzcDsvLyB7Im5zLXByZWZpeCIsICJucy1uYW1lIiwgIm5zLW5hbWUgdmFsaWRhdGlvbiBwYXR0ZXJuIn0gPGJyIC8+DQorLi4uIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3siYSIsICJzb21lIHVyaSJ9LCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7ImIiLCAib3RoZXIgdXJpIn0sIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3siYyIsICJoaXMgdXJpIiwgIiogdXJpIn0sIDxiciAvPg0KKy4uLg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlbiwgdGhlIGZvbGxvd2luZyBYTUwgZWxlbWVudHMgd2lsbCBtYXRjaCB0aGUgc3RydWN0czoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEIwRDAiPjx0cj48dGQ+PHR0Pg0KKyZsdDtuOmVsdCB4bWxuczpuPSJzb21lIFVSSSImIzYyOyAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDttYXRjaGVzIHRoZSBzdHJ1Y3QgbmFtZSA8aT5hX19lbHQ8L2k+IDxiciAvPg0KKy4uLiA8YnIgLz4NCismbHQ7bTplbHQgeG1sbnM6bT0ib3RoZXIgVVJJIiYjNjI7ICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO21hdGNoZXMgdGhlIHN0cnVjdCBuYW1lIDxpPmJfX2VsdDwvaT4gPGJyIC8+DQorLi4uIDxiciAvPg0KKyZsdDtrOmVsdCB4bWxuczprPSJteSBVUkkiJiM2MjsgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7bWF0Y2hlcyB0aGUgc3RydWN0IG5hbWUgPGk+Y19fZWx0PC9pPiA8YnIgLz4NCisuLi4gPGJyIC8+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvdHQ+DQorVGhlIHJlc3BvbnNlIG9mIGEgc2VydmljZSB0byBhIGNsaWVudCByZXF1ZXN0IHRoYXQgdXNlcyB0aGUgbmFtZXNwYWNlcyBsaXN0ZWQgYWJvdmUsDQord2lsbCBpbmNsdWRlIDx0dD5teSBVUkk8L3R0PiBmb3IgdGhlIG5hbWUgc3BhY2Ugb2YgZWxlbWVudCA8dHQ+azwvdHQ+Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitJdCBpcyBwb3NzaWJsZSB0byB1c2UgYSBudW1iZXIgb2YgZGlmZmVyZW50IG5hbWVzcGFjZSB0YWJsZXMgYW5kIHNlbGVjdCB0aGUgb25lIHRoYXQgaXMgYXBwcm9wcmlhdGUuDQorRm9yIGV4YW1wbGUsIGFuIGFwcGxpY2F0aW9uIG1pZ2h0IGNvbnRhY3QgbWFueSBkaWZmZXJlbnQgV2ViIHNlcnZpY2VzIGFsbCB1c2luZyBkaWZmZXJlbnQgbmFtZXNwYWNlIFVSSXMuDQorSWYgYWxsIHRoZSBVUklzIGFyZSBzdG9yZWQgaW4gb25lIHRhYmxlLCBlYWNoIHJlbW90ZSBtZXRob2QgaW52b2NhdGlvbiB3aWxsIGR1bXAgdGhlIHdob2xlIG5hbWVzcGFjZQ0KK3RhYmxlIGluIHRoZSBTT0FQIHBheWxvYWQuICBUaGVyZSBpcyBubyB0ZWNobmljYWwgcHJvYmxlbSB3aXRoIHRoYXQsIGJ1dCBpdCBjYW4gYmUgdWdseSB3aGVuIHRoZSB0YWJsZSBpcyBsYXJnZS4NCitUbyB1c2UgZGlmZmVyZW50IG5hbWVzcGFjZSB0YWJsZXMsIGRlY2xhcmUgYSBwb2ludGVyIHRvIGEgdGFibGUgYW5kIHNldCB0aGUgcG9pbnRlciB0byBhIHBhcnRpY3VsYXIgdGFibGUgYmVmb3JlIHJlbW90ZSBtZXRob2QNCitpbnZvY2F0aW9uLiAgRm9yIGV4YW1wbGU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtOYW1lc3BhY2UgbmFtZXNwYWNlc1RhYmxlMVtdID0geyAuLi4gfTsgPGJyIC8+DQorPGI+c3RydWN0PC9iPiZuYnNwO05hbWVzcGFjZSBuYW1lc3BhY2VzVGFibGUyW10gPSB7IC4uLiB9OyA8YnIgLz4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7TmFtZXNwYWNlIG5hbWVzcGFjZXNUYWJsZTNbXSA9IHsgLi4uIH07IDxiciAvPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtOYW1lc3BhY2UgKm5hbWVzcGFjZXM7IDxiciAvPg0KKy4uLiA8YnIgLz4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCBzb2FwOyA8YnIgLz4NCisuLi4gPGJyIC8+DQorc29hcF9pbml0KCZhbXA7c29hcCk7IDxiciAvPg0KK3NvYXBfc2V0X25hbWVzcGFjZXMoJmFtcDtzb2FwLCBuYW1lc3BhY2VUYWJsZTEpOyA8YnIgLz4NCitzb2FwX2NhbGxfcmVtb3RlX21ldGhvZCgmYW1wO3NvYXAsIFVSTCwgQWN0aW9uLCAuLi4pOyA8YnIgLz4NCisuLi4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPiANCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorIDxoMj48YSBuYW1lPSJ0dGhfc0VjMTAiPg0KKzEwPC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5nU09BUCBTZXJpYWxpemF0aW9uIGFuZCBEZXNlcmlhbGl6YXRpb24gUnVsZXM8L2ZvbnQ+PC9oMj4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uIG9mIEMgYW5kIEMrKyBkYXRhIHR5cGVzIGZvciBTT0FQIDEuMSBhbmQgMS4yIGNvbXBsaWFudCBlbmNvZGluZyBhbmQgZGVjb2RpbmcuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkgICAgIDxoMz48YSBuYW1lPSJ0dGhfc0VjMTAuMSI+DQorMTAuMTwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+UHJpbWl0aXZlIFR5cGUgRW5jb2Rpbmc8L2ZvbnQ+PC9oMz4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIGRlZmF1bHQgZW5jb2RpbmcgcnVsZXMgZm9yIHRoZSBwcmltaXRpdmUgQyBhbmQgQysrIGRhdGEgdHlwZXMgYXJlIGdpdmVuIGluIHRoZSB0YWJsZSBiZWxvdzoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNEMEQwRDAiPjx0cj48dGQ+PHNwYW4gY2xhc3M9InJvbWFuIj4NCisNCis8dGFibGU+DQorPHRyPjx0ZD48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+VHlwZTwvYj48L2ZvbnQ+IDwvdGQ+PHRkPjxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5YU0QgVHlwZTwvYj48L2ZvbnQ+IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPjxiPmJvb2w8L2I+PC9pPiA8L3RkPjx0ZD48dHQ+Ym9vbGVhbjwvdHQ+IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPjxiPmNoYXI8L2I+KjwvaT4gKEMgc3RyaW5nKSA8L3RkPjx0ZD48dHQ+c3RyaW5nPC90dD4gPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+PGI+Y2hhcjwvYj48L2k+IDwvdGQ+PHRkPjx0dD5ieXRlPC90dD4gPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+PGI+ZG91YmxlPC9iPjwvaT4gPC90ZD48dGQ+PHR0PmRvdWJsZTwvdHQ+IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPjxiPmZsb2F0PC9iPjwvaT4gPC90ZD48dGQ+PHR0PmZsb2F0PC90dD4gPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+PGI+aW50PC9iPjwvaT4gPC90ZD48dGQ+PHR0PmludDwvdHQ+IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPjxiPmxvbmc8L2I+PC9pPiA8L3RkPjx0ZD48dHQ+bG9uZzwvdHQ+IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPkxPTkc2NDwvaT4gPC90ZD48dGQ+PHR0Pmxvbmc8L3R0PiA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT48Yj5sb25nPC9iPiZuYnNwOzxiPmxvbmc8L2I+PC9pPiA8L3RkPjx0ZD48dHQ+bG9uZzwvdHQ+IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPjxiPnNob3J0PC9iPjwvaT4gPC90ZD48dGQ+PHR0PnNob3J0PC90dD4gPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+dGltZV90PC9pPiA8L3RkPjx0ZD48dHQ+ZGF0ZVRpbWU8L3R0PiA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT48Yj51bnNpZ25lZDwvYj4mbmJzcDs8Yj5jaGFyPC9iPjwvaT4gPC90ZD48dGQ+PHR0PnVuc2lnbmVkQnl0ZTwvdHQ+IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPjxiPnVuc2lnbmVkPC9iPiZuYnNwOzxiPmludDwvYj48L2k+IDwvdGQ+PHRkPjx0dD51bnNpZ25lZEludDwvdHQ+IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPjxiPnVuc2lnbmVkPC9iPiZuYnNwOzxiPmxvbmc8L2I+PC9pPiA8L3RkPjx0ZD48dHQ+dW5zaWduZWRMb25nPC90dD4gPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+VUxPTkc2NDwvaT4gPC90ZD48dGQ+PHR0PnVuc2lnbmVkTG9uZzwvdHQ+IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPjxiPnVuc2lnbmVkPC9iPiZuYnNwOzxiPmxvbmc8L2I+Jm5ic3A7PGI+bG9uZzwvYj48L2k+IDwvdGQ+PHRkPjx0dD51bnNpZ25lZExvbmc8L3R0PiA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT48Yj51bnNpZ25lZDwvYj4mbmJzcDs8Yj5zaG9ydDwvYj48L2k+IDwvdGQ+PHRkPjx0dD51bnNpZ25lZFNob3J0PC90dD4gPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+d2NoYXJfdCo8L2k+IDwvdGQ+PHRkPjx0dD5zdHJpbmc8L3R0PiA8L3RkPjwvdHI+PC90YWJsZT4NCisNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9zcGFuPg0KK09iamVjdHMgb2YgdHlwZSA8aT48Yj52b2lkPC9iPjwvaT4gYW5kIDxpPjxiPnZvaWQ8L2I+KjwvaT4gY2Fubm90IGJlIGVuY29kZWQuDQorRW51bWVyYXRpb25zIGFuZCBiaXQgbWFza3MgYXJlIHN1cHBvcnRlZCBhcyB3ZWxsLCBzZWUmbmJzcDs8YSBocmVmPSIjc2VjOmVudW0iPjEwLjM8L2E+Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJCSAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWMxMC4yIj4NCisxMC4yPC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5Ib3cgdG8gRW5jb2RlIGFuZCBEZWNvZGUgUHJpbWl0aXZlIFR5cGVzIGFzIFhTRCBUeXBlczwvZm9udD48L2gzPjxhIG5hbWU9InNlYzpwcmltaXRpdmUiPg0KKzwvYT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorQnkgZGVmYXVsdCwgZW5jb2Rpbmcgb2YgdGhlIHByaW1pdGl2ZSB0eXBlcyB3aWxsIHRha2UgcGxhY2UgYXMgcGVyIFNPQVANCitlbmNvZGluZyBzdHlsZS4gIFRoZSBlbmNvZGluZyBjYW4gYmUgY2hhbmdlZCB0byBhbnkgWE1MIFNjaGVtYSB0eXBlIChYU0QgdHlwZSkgd2l0aCBhbg0KK29wdGlvbmFsIG5hbWVzcGFjZSBwcmVmaXggYnkgdXNpbmcgYSA8aT48Yj50eXBlZGVmPC9iPjwvaT4gaW4gdGhlIGhlYWRlciBmaWxlIGlucHV0IHRvDQordGhlIGdTT0FQIHN0dWIgYW5kIHNrZWxldG9uIGNvbXBpbGVyLiBUaGUgZGVjbGFyYXRpb24gZW5hYmxlcyB0aGUNCitpbXBsZW1lbnRhdGlvbiBvZiBidWlsdC1pbiBYTUwgU2NoZW1hIHR5cGVzIChhbHNvIGtub3duIGFzIFhTRCB0eXBlcykgc3VjaCBhcw0KKzx0dD5wb3NpdGl2ZUludGVnZXI8L3R0PiwgPHR0PnhzZDphbnlVUkk8L3R0PiwgYW5kIDx0dD54c2Q6ZGF0ZTwvdHQ+IGZvciB3aGljaCBubw0KK2J1aWx0LWluIGRhdGEgc3RydWN0dXJlcyBpbiBDIGFuZCBDKysgZXhpc3QgYnV0IHdoaWNoIGNhbiBiZSByZXByZXNlbnRlZCB1c2luZw0KK3N0YW5kYXJkIGRhdGEgc3RydWN0dXJlcyBzdWNoIGFzIHN0cmluZ3MsIGludGVnZXJzLCBhbmQgZmxvYXRzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgPGk+PGI+dHlwZWRlZjwvYj48L2k+IGRlY2xhcmF0aW9uIGlzIGZyZXF1ZW50bHkgdXNlZCBmb3IgY29udmVuaWVuY2UgaW4gQy4gQQ0KKzxpPjxiPnR5cGVkZWY8L2I+PC9pPiBkZWNsYXJlcyBhIHR5cGUgbmFtZSBmb3IgYSAoY29tcGxleCkgdHlwZSBleHByZXNzaW9uLiBUaGUgdHlwZQ0KK25hbWUgY2FuIHRoZW4gYmUgdXNlZCBpbiBvdGhlciBkZWNsYXJhdGlvbnMgaW4gcGxhY2Ugb2YgdGhlIG1vcmUgY29tcGxleCB0eXBlDQorZXhwcmVzc2lvbiwgd2hpY2ggb2Z0ZW4gaW1wcm92ZXMgdGhlIHJlYWRhYmlsaXR5IG9mIHRoZSBwcm9ncmFtIGNvZGUuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBnU09BUCBjb21waWxlciBpbnRlcnByZXRzIDxpPjxiPnR5cGVkZWY8L2I+PC9pPiBkZWNsYXJhdGlvbnMgdGhlIHNhbWUgd2F5IGFzIGENCityZWd1bGFyIEMgY29tcGlsZXIgaW50ZXJwcmV0cyB0aGVtLCBpLmUuJm5ic3A7YXMgdHlwZXMgaW4gZGVjbGFyYXRpb25zLiBJbiBhZGRpdGlvbg0KK2hvd2V2ZXIsIHRoZSBnU09BUCBjb21waWxlciB3aWxsIGFsc28gdXNlIHRoZSB0eXBlIG5hbWUgaW4gdGhlIGVuY29kaW5nIG9mIHRoZQ0KK2RhdGEgaW4gU09BUC4gIFRoZSA8aT48Yj50eXBlZGVmPC9iPjwvaT4gbmFtZSB3aWxsIGFwcGVhciBhcyB0aGUgWE1MIGVsZW1lbnQgbmFtZSBvZg0KK2FuIGluZGVwZW5kZW50IGVsZW1lbnQgYW5kIGFzIHRoZSB2YWx1ZSBvZiB0aGUgPHR0PnhzaTp0eXBlPC90dD4gYXR0cmlidXRlIGluIHRoZQ0KK1NPQVAgcGF5bG9hZC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorTWFueSBidWlsdC1pbiBwcmltaXRpdmUgYW5kIGRlcml2ZWQgWFNEIHR5cGVzIHN1Y2ggYXMgPHR0PnhzZDphbnlVUkk8L3R0PiwNCis8dHQ+cG9zaXRpdmVJbnRlZ2VyPC90dD4sIGFuZCA8dHQ+ZGVjaW1hbDwvdHQ+IGNhbiBiZSBzdG9yZWQgYnkgc3RhbmRhcmQgcHJpbWl0aXZlDQorZGF0YSBzdHJ1Y3R1cmVzIGluIEMrKyBhcyB3ZWxsIHN1Y2ggYXMgc3RyaW5ncywgaW50ZWdlcnMsIGZsb2F0cywgYW5kIGRvdWJsZXMuDQorVG8gc2VyaWFsaXplIHN0cmluZ3MsIGludGVnZXJzLCBmbG9hdHMsIGFuZCBkb3VibGVzIGFzIGJ1aWx0LWluIHByaW1pdGl2ZSBhbmQNCitkZXJpdmVkIFhTRCB0eXBlcy4gVG8gdGhpcyBlbmQsIGEgPGk+PGI+dHlwZWRlZjwvYj48L2k+IGRlY2xhcmF0aW9uIGNhbiBiZSB1c2VkDQordG8gZGVjbGFyZSBhbiBYU0QgdHlwZS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorRm9yIGV4YW1wbGUsIHRoZSBkZWNsYXJhdGlvbg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPnVuc2lnbmVkPC9iPiZuYnNwOzxiPmludDwvYj4mbmJzcDt4c2RfX3Bvc2l0aXZlSW50ZWdlcjsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK2NyZWF0ZXMgYSBuYW1lZCB0eXBlIDxpPnBvc2l0aXZlSW50ZWdlcjwvaT4gd2hpY2ggaXMgcmVwcmVzZW50ZWQgYnkgPGk+PGI+dW5zaWduZWQ8L2I+Jm5ic3A7PGI+aW50PC9iPjwvaT4gaW4gQysrLiBGb3IgZXhhbXBsZSwgdGhlIGVuY29kaW5nIG9mIGENCis8aT5wb3NpdGl2ZUludGVnZXI8L2k+IHZhbHVlIDxpPjM8L2k+IGlzDQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBCMEQwIj48dHI+PHRkPjx0dD4NCismbHQ7cG9zaXRpdmVJbnRlZ2VyIHhzaTp0eXBlPSJ4c2Q6cG9zaXRpdmVJbnRlZ2VyIiYjNjI7MyZsdDsvcG9zaXRpdmVJbnRlZ2VyJiM2MjsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC90dD4NCitUaGUgYnVpbHQtaW4gWE1MIFNjaGVtYSBkYXRhdHlwZSBoaWVyYXJjaHkgZnJvbSB0aGUgWE1MIFNjaGVtYSBQYXJ0IDIgZG9jdW1lbnRhdGlvbiA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMiI+PHR0Pmh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yPC90dD48L2E+IGlzIGRlcGljdGVkIGJlbG93Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8YSBuYW1lPSJ0dGhfZklnMSI+DQorPC9hPiANCis8Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi90eXBlLWhpZXJhcmNoeS5naWYiLz4NCis8L2NlbnRlcj4NCisNCis8Y2VudGVyPkZpZ3VyZSAxOiBCdWlsdC1pbiBEYXRhdHlwZSBIaWVyYXJjaHk8L2NlbnRlcj4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIGJ1aWx0LWluIHByaW1pdGl2ZSBhbmQgZGVyaXZlZCBudW1lcmljYWwgWE1MIFNjaGVtYSB0eXBlcyBhcmUgbGlzdGVkIGJlbG93IHRvZ2V0aGVyIHdpdGggdGhlaXIgcmVjb21tZW5kZWQgPGk+PGI+dHlwZWRlZjwvYj48L2k+DQorZGVjbGFyYXRpb25zLiBOb3RlIHRoYXQgdGhlIFNPQVAgZW5jb2Rpbmcgc2NoZW1hcyBmb3IgcHJpbWl0aXZlIHR5cGVzIGFyZSBkZXJpdmVkIGZyb20gdGhlIGJ1aWx0LWluIFhNTCBTY2hlbWEgdHlwZXMsIHNvDQorPGk+U09BUF9FTkNfXzwvaT4gY2FuIGJlIHVzZWQgYXMgYSBuYW1lc3BhY2UgcHJlZml4IGluc3RlYWQgb2YgPGk+eHNkX188L2k+Lg0KKw0KKzxkbCBjb21wYWN0PSJjb21wYWN0Ij4NCisgPGR0PjxiPjx0dD54c2Q6YW55VVJJPC90dD48L2I+PC9kdD4NCisJPGRkPg0KK1JlcHJlc2VudHMgYSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIgUmVmZXJlbmNlIChVUkkpLg0KK0VhY2ggVVJJIHNjaGVtZSBpbXBvc2VzIHNwZWNpYWxpemVkIHN5bnRheCBydWxlcyBmb3IgVVJJcyBpbiB0aGF0IHNjaGVtZSwgaW5jbHVkaW5nIHJlc3RyaWN0aW9ucw0KK29uIHRoZSBzeW50YXggb2YgYWxsb3dlZCBmcmFnbWVudCBpZGVudGlmaWVycy4NCitJdCBpcyByZWNvbW1lbmRlZCB0byB1c2Ugc3RyaW5ncyB0byBzdG9yZSA8dHQ+eHNkOmFueVVSSTwvdHQ+IFhNTCBTY2hlbWEgdHlwZXMuIFRoZSByZWNvbW1lbmRlZCB0eXBlIGRlY2xhcmF0aW9uIGlzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KnhzZF9fYW55VVJJOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+PC9kZD4NCisgPGR0PjxiPjx0dD54c2Q6YmFzZTY0QmluYXJ5PC90dD48L2I+PC9kdD4NCisJPGRkPg0KK1JlcHJlc2VudHMgQmFzZTY0LWVuY29kZWQgYXJiaXRyYXJ5IGJpbmFyeSBkYXRhLg0KK0ZvciB1c2luZyB0aGUgPHR0PnhzZDpiYXNlNjRCaW5hcnk8L3R0PiBYU0QgU2NoZW1hIHR5cGUsIHRoZSB1c2Ugb2YgdGhlIGJhc2U2NEJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiBhIGR5bmFtaWMgYXJyYXkgaXMgPGI+c3Ryb25nbHk8L2I+IHJlY29tbWVuZGVkLA0KK3NlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzpiYXNlNjRiaW5hcnkiPjEwLjExPC9hPi4gSG93ZXZlciwgdGhlDQordHlwZSBjYW4gYWxzbyBiZSBkZWNsYXJlZCBhcyBhIHN0cmluZyBhbmQgdGhlIGVuY29kaW5nIHdpbGwgYmUgc3RyaW5nLWJhc2VkOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KnhzZF9fYmFzZTY0QmluYXJ5Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorV2l0aCB0aGlzIGFwcHJvYWNoLCBpdCBpcyBzb2xlbHkgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBhcHBsaWNhdGlvbiB0byBtYWtlIHN1cmUgdGhlIHN0cmluZyBjb250ZW50IGlzIGFjY29yZGluZyB0byB0aGUgQmFzZTY0IENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcgZGVmaW5lZCBpbiBTZWN0aW9uIDYuOCBvZiBSRkMgMjA0NS48L2RkPg0KKyA8ZHQ+PGI+PHR0PnhzZDpib29sZWFuPC90dD48L2I+PC9kdD4NCisJPGRkPg0KK0ZvciBkZWNsYXJpbmcgYW4gPHR0PnhzZDpib29sZWFuPC90dD4gWFNEIFNjaGVtYSB0eXBlLCB0aGUgdXNlIG9mIGEgYm9vbCBpcyA8Yj5zdHJvbmdseTwvYj4gcmVjb21tZW5kZWQuDQorSWYgYSBwdXJlIEMgY29tcGlsZXIgaXMgdXNlZCB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhlIDxpPmJvb2w8L2k+IHR5cGUsIHNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzpib29sZWFuIj4xMC4zLjU8L2E+Lg0KK1RoZSBjb3JyZXNwb25kaW5nIHR5cGUgZGVjbGFyYXRpb24gaXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnR5cGVkZWY8L2I+Jm5ic3A7PGI+Ym9vbDwvYj4mbmJzcDt4c2RfX2Jvb2xlYW47DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUeXBlIDxpPnhzZF9fYm9vbGVhbjwvaT4gZGVjbGFyZXMgYSBCb29sZWFuICgwIG9yIDEpLCB3aGljaCBpcyBlbmNvZGVkIGFzDQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBCMEQwIj48dHI+PHRkPjx0dD4NCismbHQ7eHNkOmJvb2xlYW4geHNpOnR5cGU9InhzZDpib29sZWFuIiYjNjI7Li4uJmx0Oy94c2Q6Ym9vbGVhbiYjNjI7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvdHQ+PC9kZD4NCisgPGR0PjxiPjx0dD54c2Q6Ynl0ZTwvdHQ+PC9iPjwvZHQ+DQorCTxkZD4NCitSZXByZXNlbnRzIGEgYnl0ZSAoLTEyOC4uLjEyNykuIFRoZSBjb3JyZXNwb25kaW5nIHR5cGUgZGVjbGFyYXRpb24gaXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnR5cGVkZWY8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDt4c2RfX2J5dGU7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUeXBlIDxpPnhzZF9fYnl0ZTwvaT4gZGVjbGFyZXMgYSBieXRlIHdoaWNoIGlzIGVuY29kZWQgYXMgDQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBCMEQwIj48dHI+PHRkPjx0dD4NCismbHQ7eHNkOmJ5dGUgeHNpOnR5cGU9InhzZDpieXRlIiYjNjI7Li4uJmx0Oy94c2Q6Ynl0ZSYjNjI7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvdHQ+PC9kZD4NCisgPGR0PjxiPjx0dD54c2Q6ZGF0ZVRpbWU8L3R0PjwvYj48L2R0Pg0KKwk8ZGQ+DQorUmVwcmVzZW50cyBhIGRhdGUgYW5kIHRpbWUuIFRoZSBsZXhpY2FsIHJlcHJlc2VudGF0aW9uIGlzIGFjY29yZGluZyB0byB0aGUgSVNPIDg2MDEgZXh0ZW5kZWQgZm9ybWF0IENDWVktTU0tRERUaGg6bW06c3Mgd2hlcmUgIkNDIg0KK3JlcHJlc2VudHMgdGhlIGNlbnR1cnksICJZWSIgdGhlIHllYXIsICJNTSIgdGhlIG1vbnRoIGFuZCAiREQiIHRoZSBkYXksIHByZWNlZGVkIGJ5IGFuIG9wdGlvbmFsIGxlYWRpbmcgIi0iIHNpZ24gdG8gaW5kaWNhdGUgYQ0KK25lZ2F0aXZlIG51bWJlci4gSWYgdGhlIHNpZ24gaXMgb21pdHRlZCwgIisiIGlzIGFzc3VtZWQuIFRoZSBsZXR0ZXIgIlQiIGlzIHRoZSBkYXRlL3RpbWUgc2VwYXJhdG9yIGFuZCAiaGgiLCAibW0iLCAic3MiIHJlcHJlc2VudA0KK2hvdXIsIG1pbnV0ZSBhbmQgc2Vjb25kIHJlc3BlY3RpdmVseS4NCitJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgdGhlIDxpPnRpbWVfdDwvaT4gdHlwZSB0byBzdG9yZSA8dHQ+eHNkOmRhdGVUaW1lPC90dD4gWFNEIFNjaGVtYSB0eXBlcyBhbmQgdGhlIHR5cGUgZGVjbGFyYXRpb24gaXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnR5cGVkZWY8L2I+Jm5ic3A7dGltZV90IHhzZF9fZGF0ZVRpbWU7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitIb3dldmVyLCBub3RlIHRoYXQgY2FsZW5kYXIgdGltZXMgIGJlZm9yZSAgdGhlIHllYXIgMTkwMiAgb3IgYWZ0ZXINCit0aGUgeWVhciAyMDM3IGNhbm5vdCBiZSByZXByZXNlbnRlZC4gVXBvbiByZWNlaXZpbmcgYSBkYXRlIG91dHNpZGUgdGhpcyByYW5nZSwNCit0aGUgPGk+dGltZV90PC9pPiB2YWx1ZSB3aWxsIGJlIHNldCB0byAtMS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorU3RyaW5ncyAoPGk+PGI+Y2hhcjwvYj4qPC9pPikgY2FuIGJlIHVzZWQgdG8gc3RvcmUgPHR0PnhzZDpkYXRlVGltZTwvdHQ+IFhTRCBTY2hlbWEgdHlwZXMuIFRoZSB0eXBlIGRlY2xhcmF0aW9uIGlzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KnhzZF9fZGF0ZVRpbWU7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitJbiB0aGlzIGNhc2UsIGl0IGlzIHVwIHRvIHRoZSBhcHBsaWNhdGlvbiB0byByZWFkIGFuZCBzZXQgdGhlIGRhdGVUaW1lIHJlcHJlc2VudGF0aW9uLjwvZGQ+DQorIDxkdD48Yj48dHQ+eHNkOmRhdGU8L3R0PjwvYj48L2R0Pg0KKwk8ZGQ+DQorUmVwcmVzZW50cyBhIGRhdGUuDQorVGhlIGxleGljYWwgcmVwcmVzZW50YXRpb24gZm9yIGRhdGUgaXMgdGhlIHJlZHVjZWQgKHJpZ2h0IHRydW5jYXRlZCkgbGV4aWNhbCByZXByZXNlbnRhdGlvbiBmb3IgZGF0ZVRpbWU6IENDWVktTU0tREQuDQorSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIHN0cmluZ3MgKDxpPjxiPmNoYXI8L2I+KjwvaT4pIHRvIHN0b3JlIDx0dD54c2Q6ZGF0ZTwvdHQ+IFhTRCBTY2hlbWEgdHlwZXMuIFRoZSB0eXBlIGRlY2xhcmF0aW9uIGlzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KnhzZF9fZGF0ZTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPjwvZGQ+DQorIDxkdD48Yj48dHQ+eHNkOmRlY2ltYWw8L3R0PjwvYj48L2R0Pg0KKwk8ZGQ+DQorUmVwcmVzZW50cyBhcmJpdHJhcnkgcHJlY2lzaW9uIGRlY2ltYWwgbnVtYmVycy4NCitJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgdGhlIDxiPmRvdWJsZTwvYj4gdHlwZSB0byBzdG9yZSA8dHQ+eHNkOmRlY2ltYWw8L3R0PiBYU0QgU2NoZW1hIHR5cGVzIGFuZCB0aGUgdHlwZSBkZWNsYXJhdGlvbiBpczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5kb3VibGU8L2I+Jm5ic3A7eHNkX19kZWNpbWFsOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVHlwZSA8aT54c2RfX2RlY2ltYWw8L2k+IGRlY2xhcmVzIGEgZG91YmxlIGZsb2F0aW5nIHBvaW50IG51bWJlciB3aGljaCBpcyBlbmNvZGVkIGFzIA0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwQjBEMCI+PHRyPjx0ZD48dHQ+DQorJmx0O3hzZDpkb3VibGUgeHNpOnR5cGU9InhzZDpkZWNpbWFsIiYjNjI7Li4uJmx0Oy94c2Q6ZG91YmxlJiM2MjsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC90dD48L2RkPg0KKyA8ZHQ+PGI+PHR0PnhzZDpkb3VibGU8L3R0PjwvYj48L2R0Pg0KKwk8ZGQ+DQorQ29ycmVzcG9uZHMgdG8gdGhlIElFRUUgZG91YmxlLXByZWNpc2lvbiA2NC1iaXQgZmxvYXRpbmcgcG9pbnQgdHlwZS4gVGhlIHR5cGUgZGVjbGFyYXRpb24gaXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnR5cGVkZWY8L2I+Jm5ic3A7PGI+ZG91YmxlPC9iPiZuYnNwO3hzZF9fZG91YmxlOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVHlwZSA8aT54c2RfX2RvdWJsZTwvaT4gZGVjbGFyZXMgYSBkb3VibGUgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHdoaWNoIGlzIGVuY29kZWQgYXMgDQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBCMEQwIj48dHI+PHRkPjx0dD4NCismbHQ7eHNkOmRvdWJsZSB4c2k6dHlwZT0ieHNkOmRvdWJsZSImIzYyOy4uLiZsdDsveHNkOmRvdWJsZSYjNjI7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvdHQ+PC9kZD4NCisgPGR0PjxiPjx0dD54c2Q6ZHVyYXRpb248L3R0PjwvYj48L2R0Pg0KKwk8ZGQ+DQorUmVwcmVzZW50cyBhIGR1cmF0aW9uIG9mIHRpbWUuDQorVGhlIGxleGljYWwgcmVwcmVzZW50YXRpb24gZm9yIGR1cmF0aW9uIGlzIHRoZSBJU08gODYwMSBleHRlbmRlZCBmb3JtYXQgUG5ZbiBNbkRUbkggbk1uUywgd2hlcmUgblkgcmVwcmVzZW50cw0KK3RoZSBudW1iZXIgb2YgeWVhcnMsIG5NIHRoZSBudW1iZXIgb2YgbW9udGhzLCBuRCB0aGUgbnVtYmVyIG9mIGRheXMsIFQgaXMgdGhlIGRhdGUvdGltZSBzZXBhcmF0b3IsIG5IIHRoZSBudW1iZXIgb2YNCitob3Vycywgbk0gdGhlIG51bWJlciBvZiBtaW51dGVzIGFuZCBuUyB0aGUgbnVtYmVyIG9mIHNlY29uZHMuIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyBjYW4gaW5jbHVkZSBkZWNpbWFsIGRpZ2l0cyB0bw0KK2FyYml0cmFyeSBwcmVjaXNpb24uDQorSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIHN0cmluZ3MgKDxpPjxiPmNoYXI8L2I+KjwvaT4pIHRvIHN0b3JlIDx0dD54c2Q6ZHVyYXRpb248L3R0PiBYU0QgU2NoZW1hIHR5cGVzLiBUaGUgdHlwZSBkZWNsYXJhdGlvbiBpczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyp4c2RfX2R1cmF0aW9uOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+PC9kZD4NCisgPGR0PjxiPjx0dD54c2Q6ZmxvYXQ8L3R0PjwvYj48L2R0Pg0KKwk8ZGQ+DQorQ29ycmVzcG9uZHMgdG8gdGhlIElFRUUgc2luZ2xlLXByZWNpc2lvbiAzMi1iaXQgZmxvYXRpbmcgcG9pbnQgdHlwZS4gVGhlIHR5cGUgZGVjbGFyYXRpb24gaXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnR5cGVkZWY8L2I+Jm5ic3A7PGI+ZmxvYXQ8L2I+Jm5ic3A7eHNkX19mbG9hdDsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1R5cGUgPGk+eHNkX19mbG9hdDwvaT4gZGVjbGFyZXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgd2hpY2ggaXMgZW5jb2RlZCBhcyANCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEIwRDAiPjx0cj48dGQ+PHR0Pg0KKyZsdDt4c2Q6ZmxvYXQgeHNpOnR5cGU9InhzZDpmbG9hdCImIzYyOy4uLiZsdDsveHNkOmZsb2F0JiM2MjsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC90dD48L2RkPg0KKyA8ZHQ+PGI+PHR0PnhzZDpoZXhCaW5hcnk8L3R0PjwvYj48L2R0Pg0KKwk8ZGQ+DQorUmVwcmVzZW50cyBhcmJpdHJhcnkgaGV4LWVuY29kZWQgYmluYXJ5IGRhdGEuICBJdCBoYXMgYSBsZXhpY2FsIHJlcHJlc2VudGF0aW9uIHdoZXJlIGVhY2ggYmluYXJ5IG9jdGV0IGlzIGVuY29kZWQgYXMgYSBjaGFyYWN0ZXINCit0dXBsZSwgY29uc2lzdGluZyBvZiB0d28gaGV4YWRlY2ltYWwgZGlnaXRzIChbMC05YS1mQS1GXSkgcmVwcmVzZW50aW5nIHRoZSBvY3RldCBjb2RlLiBGb3IgZXhhbXBsZSwgIjBGQjciIGlzIGEgaGV4IGVuY29kaW5nIGZvcg0KK3RoZSAxNi1iaXQgaW50ZWdlciA0MDIzICh3aG9zZSBiaW5hcnkgcmVwcmVzZW50YXRpb24gaXMgMTExMTEwMTEwMTExLg0KK0ZvciB1c2luZyB0aGUgPHR0PnhzZDpoZXhCaW5hcnk8L3R0PiBYU0QgU2NoZW1hIHR5cGUsIHRoZSB1c2Ugb2YgdGhlIGhleEJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiBhIGR5bmFtaWMgYXJyYXkgaXMgPGI+c3Ryb25nbHk8L2I+IHJlY29tbWVuZGVkLA0KK3NlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzpoZXhiaW5hcnkiPjEwLjEyPC9hPi4gSG93ZXZlciwgdGhlDQordHlwZSBjYW4gYWxzbyBiZSBkZWNsYXJlZCBhcyBhIHN0cmluZyBhbmQgdGhlIGVuY29kaW5nIHdpbGwgYmUgc3RyaW5nLWJhc2VkOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KnhzZF9faGV4QmluYXJ5Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorV2l0aCB0aGlzIGFwcHJvYWNoLCBpdCBpcyBzb2xlbHkgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBhcHBsaWNhdGlvbiB0byBtYWtlIHN1cmUgdGhlIHN0cmluZyBjb250ZW50IGNvbnNpc3RzIG9mIGEgc2VxdWVuY2Ugb2Ygb2N0ZXRzLjwvZGQ+DQorIDxkdD48Yj48dHQ+eHNkOmludDwvdHQ+PC9iPjwvZHQ+DQorCTxkZD4NCitDb3JyZXNwb25kcyB0byBhIDMyLWJpdCBpbnRlZ2VyIGluIHRoZSByYW5nZSAtMjE0NzQ4MzY0OCB0byAyMTQ3NDgzNjQ3Lg0KK0lmIHRoZSBDKysgY29tcGlsZXIgc3VwcG9ydHMgMzItYml0IDxpPjxiPmludDwvYj48L2k+IHR5cGVzLCB0aGUgdHlwZSBkZWNsYXJhdGlvbiBjYW4gdXNlIHRoZSA8aT48Yj5pbnQ8L2I+PC9pPiB0eXBlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmludDwvYj4mbmJzcDt4c2RfX2ludDsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK090aGVyd2lzZSwgdGhlIEMrKyBjb21waWxlciBzdXBwb3J0cyAxNi1iaXQgPGk+PGI+aW50PC9iPjwvaT4gdHlwZXMgYW5kIHRoZSB0eXBlIGRlY2xhcmF0aW9uIHNob3VsZCB1c2UgdGhlIDxpPjxiPmxvbmc8L2I+PC9pPiB0eXBlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmxvbmc8L2I+Jm5ic3A7eHNkX19pbnQ7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUeXBlIDxpPnhzZF9faW50PC9pPiBkZWNsYXJlcyBhIDMyLWJpdCBpbnRlZ2VyIHdoaWNoIGlzIGVuY29kZWQgYXMgDQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBCMEQwIj48dHI+PHRkPjx0dD4NCismbHQ7eHNkOmludCB4c2k6dHlwZT0ieHNkOmludCImIzYyOy4uLiZsdDsveHNkOmludCYjNjI7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvdHQ+PC9kZD4NCisgPGR0PjxiPjx0dD54c2Q6aW50ZWdlcjwvdHQ+PC9iPjwvZHQ+DQorCTxkZD4NCitDb3JyZXNwb25kcyB0byBhbiB1bmJvdW5kZWQgaW50ZWdlci4NCitTaW5jZSBDKysgZG9lcyBub3Qgc3VwcG9ydCB1bmJvdW5kZWQgaW50ZWdlcnMgYXMgYSBzdGFuZGFyZCBmZWF0dXJlLCB0aGUgcmVjb21tZW5kZWQgdHlwZSBkZWNsYXJhdGlvbiBpczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5sb25nPC9iPiZuYnNwOzxiPmxvbmc8L2I+Jm5ic3A7eHNkX19pbnRlZ2VyOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVHlwZSA8aT54c2RfX2ludGVnZXI8L2k+IGRlY2xhcmVzIGEgNjQtYml0IGludGVnZXIgd2hpY2ggaXMgZW5jb2RlZCBhcyBhbiB1bmJvdW5kZWQgPHR0PnhzZDppbnRlZ2VyPC90dD46DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBCMEQwIj48dHI+PHRkPjx0dD4NCismbHQ7eHNkOmludGVnZXIgeHNpOnR5cGU9InhzZDppbnRlZ2VyIiYjNjI7Li4uJmx0Oy94c2Q6aW50ZWdlciYjNjI7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvdHQ+DQorQW5vdGhlciBwb3NzaWJpbGl0eSBpcyB0byB1c2Ugc3RyaW5ncyB0byByZXByZXNlbnQgdW5ib3VuZGVkIGludGVnZXJzIGFuZCBkbyB0aGUgdHJhbnNsYXRpb24gaW4gY29kZS48L2RkPg0KKyA8ZHQ+PGI+PHR0PnhzZDpsb25nPC90dD48L2I+PC9kdD4NCisJPGRkPg0KK0NvcnJlc3BvbmRzIHRvIGEgNjQtYml0IGludGVnZXIgaW4gdGhlIHJhbmdlIC05MjIzMzcyMDM2ODU0Nzc1ODA4IHRvIDkyMjMzNzIwMzY4NTQ3NzU4MDcuDQorVGhlIHR5cGUgZGVjbGFyYXRpb24gaXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnR5cGVkZWY8L2I+Jm5ic3A7PGI+bG9uZzwvYj4mbmJzcDs8Yj5sb25nPC9iPiZuYnNwO3hzZF9fbG9uZzsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK09yIGluIFZpc3VhbCBDKys6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnR5cGVkZWY8L2I+Jm5ic3A7TE9ORzY0IHhzZF9fbG9uZzsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1R5cGUgPGk+eHNkX19sb25nPC9pPiBkZWNsYXJlcyBhIDY0LWJpdCBpbnRlZ2VyIHdoaWNoIGlzIGVuY29kZWQgYXMgDQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBCMEQwIj48dHI+PHRkPjx0dD4NCismbHQ7eHNkOmxvbmcgeHNpOnR5cGU9InhzZDpsb25nIiYjNjI7Li4uJmx0Oy94c2Q6bG9uZyYjNjI7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvdHQ+PC9kZD4NCisgPGR0PjxiPjx0dD54c2Q6bmVnYXRpdmVJbnRlZ2VyPC90dD48L2I+PC9kdD4NCisJPGRkPg0KK0NvcnJlc3BvbmRzIHRvIGEgbmVnYXRpdmUgdW5ib3VuZGVkIGludGVnZXIgKCAmbHQ7IDApLg0KK1NpbmNlIEMrKyBkb2VzIG5vdCBzdXBwb3J0IHVuYm91bmRlZCBpbnRlZ2VycyBhcyBhIHN0YW5kYXJkIGZlYXR1cmUsIHRoZSByZWNvbW1lbmRlZCB0eXBlIGRlY2xhcmF0aW9uIGlzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmxvbmc8L2I+Jm5ic3A7PGI+bG9uZzwvYj4mbmJzcDt4c2RfX25lZ2F0aXZlSW50ZWdlcjsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1R5cGUgPGk+eHNkX19uZWdhdGl2ZUludGVnZXI8L2k+IGRlY2xhcmVzIGEgNjQtYml0IGludGVnZXIgd2hpY2ggaXMgZW5jb2RlZCBhcyBhIDx0dD54c2Q6bmVnYXRpdmVJbnRlZ2VyPC90dD46DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBCMEQwIj48dHI+PHRkPjx0dD4NCismbHQ7eHNkOm5lZ2F0aXZlSW50ZWdlciB4c2k6dHlwZT0ieHNkOm5lZ2F0aXZlSW50ZWdlciImIzYyOy4uLiZsdDsveHNkOm5lZ2F0aXZlSW50ZWdlciYjNjI7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvdHQ+DQorQW5vdGhlciBwb3NzaWJpbGl0eSBpcyB0byB1c2Ugc3RyaW5ncyB0byByZXByZXNlbnQgdW5ib3VuZGVkIGludGVnZXJzIGFuZCBkbyB0aGUgdHJhbnNsYXRpb24gaW4gY29kZS48L2RkPg0KKyA8ZHQ+PGI+PHR0PnhzZDpub25OZWdhdGl2ZUludGVnZXI8L3R0PjwvYj48L2R0Pg0KKwk8ZGQ+DQorQ29ycmVzcG9uZHMgdG8gYSBub24tbmVnYXRpdmUgdW5ib3VuZGVkIGludGVnZXIgKCAmZ3Q7IDApLg0KK1NpbmNlIEMrKyBkb2VzIG5vdCBzdXBwb3J0IHVuYm91bmRlZCBpbnRlZ2VycyBhcyBhIHN0YW5kYXJkIGZlYXR1cmUsIHRoZSByZWNvbW1lbmRlZCB0eXBlIGRlY2xhcmF0aW9uIGlzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPnVuc2lnbmVkPC9iPiZuYnNwOzxiPmxvbmc8L2I+Jm5ic3A7PGI+bG9uZzwvYj4mbmJzcDt4c2RfX25vbk5lZ2F0aXZlSW50ZWdlcjsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1R5cGUgPGk+eHNkX19ub25OZWdhdGl2ZUludGVnZXI8L2k+IGRlY2xhcmVzIGEgNjQtYml0IHVuc2lnbmVkIGludGVnZXIgd2hpY2ggaXMgZW5jb2RlZCBhcyBhIG5vbi1uZWdhdGl2ZSB1bmJvdW5kZWQgPHR0PnhzZDpub25OZWdhdGl2ZUludGVnZXI8L3R0PjoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEIwRDAiPjx0cj48dGQ+PHR0Pg0KKyZsdDt4c2Q6bm9uTmVnYXRpdmVJbnRlZ2VyIHhzaTp0eXBlPSJ4c2Q6bm9uTmVnYXRpdmVJbnRlZ2VyIiYjNjI7Li4uJmx0Oy94c2Q6bm9uTmVnYXRpdmVJbnRlZ2VyJiM2MjsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC90dD4NCitBbm90aGVyIHBvc3NpYmlsaXR5IGlzIHRvIHVzZSBzdHJpbmdzIHRvIHJlcHJlc2VudCB1bmJvdW5kZWQgaW50ZWdlcnMgYW5kIGRvIHRoZSB0cmFuc2xhdGlvbiBpbiBjb2RlLjwvZGQ+DQorIDxkdD48Yj48dHQ+eHNkOm5vblBvc2l0aXZlSW50ZWdlcjwvdHQ+PC9iPjwvZHQ+DQorCTxkZD4NCitDb3JyZXNwb25kcyB0byBhIG5vbi1wb3NpdGl2ZSB1bmJvdW5kZWQgaW50ZWdlciAoIDxmb250IGZhY2U9InN5bWJvbCI+ozwvZm9udA0KKz4gMCkuDQorU2luY2UgQysrIGRvZXMgbm90IHN1cHBvcnQgdW5ib3VuZGVkIGludGVnZXJzIGFzIGEgc3RhbmRhcmQgZmVhdHVyZSwgdGhlIHJlY29tbWVuZGVkIHR5cGUgZGVjbGFyYXRpb24gaXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnR5cGVkZWY8L2I+Jm5ic3A7PGI+bG9uZzwvYj4mbmJzcDs8Yj5sb25nPC9iPiZuYnNwO3hzZF9fbm9uUG9zaXRpdmVJbnRlZ2VyOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVHlwZSA8aT54c2RfX25vblBvc2l0aXZlSW50ZWdlcjwvaT4gZGVjbGFyZXMgYSA2NC1iaXQgaW50ZWdlciB3aGljaCBpcyBlbmNvZGVkIGFzIGEgPHR0PnhzZDpub25Qb3NpdGl2ZUludGVnZXI8L3R0PjoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEIwRDAiPjx0cj48dGQ+PHR0Pg0KKyZsdDt4c2Q6bm9uUG9zaXRpdmVJbnRlZ2VyIHhzaTp0eXBlPSJ4c2Q6bm9uUG9zaXRpdmVJbnRlZ2VyIiYjNjI7Li4uJmx0Oy94c2Q6bm9uUG9zaXRpdmVJbnRlZ2VyJiM2MjsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC90dD4NCitBbm90aGVyIHBvc3NpYmlsaXR5IGlzIHRvIHVzZSBzdHJpbmdzIHRvIHJlcHJlc2VudCB1bmJvdW5kZWQgaW50ZWdlcnMgYW5kIGRvIHRoZSB0cmFuc2xhdGlvbiBpbiBjb2RlLjwvZGQ+DQorIDxkdD48Yj48dHQ+eHNkOm5vcm1hbGl6ZWRTdHJpbmc8L3R0PjwvYj48L2R0Pg0KKwk8ZGQ+DQorUmVwcmVzZW50cyBub3JtYWxpemVkIGNoYXJhY3RlciBzdHJpbmdzLg0KK05vcm1hbGl6ZWQgY2hhcmFjdGVyIHN0cmluZ3MgZG8gbm90IGNvbnRhaW4gdGhlIGNhcnJpYWdlIHJldHVybiAoI3hEKSwgbGluZSBmZWVkICgjeEEpIG5vciB0YWIgKCN4OSkgY2hhcmFjdGVycy4NCitJdCBpcyByZWNvbW1lbmRlZCB0byB1c2Ugc3RyaW5ncyB0byBzdG9yZSA8dHQ+eHNkOm5vcm1hbGl6ZVN0cmluZzwvdHQ+IFhTRCBTY2hlbWEgdHlwZXMuDQorVGhlIHR5cGUgZGVjbGFyYXRpb24gaXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnR5cGVkZWY8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqeHNkX19ub3JtYWxpemVkU3RyaW5nOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVHlwZSA8aT54c2RfX25vcm1hbGl6ZWRTdHJpbmc8L2k+IGRlY2xhcmVzIGEgc3RyaW5nIHR5cGUgd2hpY2ggaXMgZW5jb2RlZCBhcyANCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEIwRDAiPjx0cj48dGQ+PHR0Pg0KKyZsdDt4c2Q6bm9ybWFsaXplZFN0cmluZyB4c2k6dHlwZT0ieHNkOm5vcm1hbGl6ZWRTdHJpbmciJiM2MjsuLi4mbHQ7L3hzZDpub3JtYWxpemVkU3RyaW5nJiM2MjsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC90dD4NCitJdCBpcyBzb2xlbHkgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBhcHBsaWNhdGlvbiB0byBtYWtlIHN1cmUgdGhlIHN0cmluZ3MgZG8gbm90IGNvbnRhaW4gY2FycmlhZ2UgcmV0dXJuICgjeEQpLCBsaW5lIGZlZWQgKCN4QSkNCithbmQgdGFiICgjeDkpIGNoYXJhY3RlcnMuPC9kZD4NCisgPGR0PjxiPjx0dD54c2Q6cG9zaXRpdmVJbnRlZ2VyPC90dD48L2I+PC9kdD4NCisJPGRkPg0KK0NvcnJlc3BvbmRzIHRvIGEgcG9zaXRpdmUgdW5ib3VuZGVkIGludGVnZXIgKCA8Zm9udCBmYWNlPSJzeW1ib2wiPrM8L2ZvbnQNCis+IDApLg0KK1NpbmNlIEMrKyBkb2VzIG5vdCBzdXBwb3J0IHVuYm91bmRlZCBpbnRlZ2VycyBhcyBhIHN0YW5kYXJkIGZlYXR1cmUsIHRoZSByZWNvbW1lbmRlZCB0eXBlIGRlY2xhcmF0aW9uIGlzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPnVuc2lnbmVkPC9iPiZuYnNwOzxiPmxvbmc8L2I+Jm5ic3A7PGI+bG9uZzwvYj4mbmJzcDt4c2RfX3Bvc2l0aXZlSW50ZWdlcjsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1R5cGUgPGk+eHNkX19wb3NpdGl2ZUludGVnZXI8L2k+IGRlY2xhcmVzIGEgNjQtYml0IHVuc2lnbmVkIGludGVnZXIgd2hpY2ggaXMgZW5jb2RlZCBhcyBhIDx0dD54c2Q6cG9zaXRpdmVJbnRlZ2VyPC90dD46DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBCMEQwIj48dHI+PHRkPjx0dD4NCismbHQ7eHNkOnBvc2l0aXZlSW50ZWdlciB4c2k6dHlwZT0ieHNkOnBvc2l0aXZlSW50ZWdlciImIzYyOy4uLiZsdDsveHNkOnBvc2l0aXZlSW50ZWdlciYjNjI7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvdHQ+DQorQW5vdGhlciBwb3NzaWJpbGl0eSBpcyB0byB1c2Ugc3RyaW5ncyB0byByZXByZXNlbnQgdW5ib3VuZGVkIGludGVnZXJzIGFuZCBkbyB0aGUgdHJhbnNsYXRpb24gaW4gY29kZS48L2RkPg0KKyA8ZHQ+PGI+PHR0PnhzZDpzaG9ydDwvdHQ+PC9iPjwvZHQ+DQorCTxkZD4NCitDb3JyZXNwb25kcyB0byBhIDE2LWJpdCBpbnRlZ2VyIGluIHRoZSByYW5nZSAtMzI3NjggdG8gMzI3NjcuDQorVGhlIHR5cGUgZGVjbGFyYXRpb24gaXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnR5cGVkZWY8L2I+Jm5ic3A7PGI+c2hvcnQ8L2I+Jm5ic3A7eHNkX19zaG9ydDsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1R5cGUgPGk+eHNkX19zaG9ydDwvaT4gZGVjbGFyZXMgYSBzaG9ydCAxNi1iaXQgaW50ZWdlciB3aGljaCBpcyBlbmNvZGVkIGFzIA0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwQjBEMCI+PHRyPjx0ZD48dHQ+DQorJmx0O3hzZDpzaG9ydCB4c2k6dHlwZT0ieHNkOnNob3J0IiYjNjI7Li4uJmx0Oy94c2Q6c2hvcnQmIzYyOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3R0PjwvZGQ+DQorIDxkdD48Yj48dHQ+eHNkOnN0cmluZzwvdHQ+PC9iPjwvZHQ+DQorCTxkZD4NCitSZXByZXNlbnRzIGNoYXJhY3RlciBzdHJpbmdzLiBUaGUgdHlwZSBkZWNsYXJhdGlvbiBpczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyp4c2RfX3N0cmluZzsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1R5cGUgPGk+eHNkX19zdHJpbmc8L2k+IGRlY2xhcmVzIGEgc3RyaW5nIHR5cGUgd2hpY2ggaXMgZW5jb2RlZCBhcyANCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEIwRDAiPjx0cj48dGQ+PHR0Pg0KKyZsdDt4c2Q6c3RyaW5nIHhzaTp0eXBlPSJ4c2Q6c3RyaW5nIiYjNjI7Li4uJmx0Oy94c2Q6c3RyaW5nJiM2MjsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC90dD4NCitUaGUgdHlwZSBkZWNsYXJhdGlvbiBmb3Igd2lkZSBjaGFyYWN0ZXIgc3RyaW5ncyBpczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDt3Y2hhcl90ICp4c2RfX3N0cmluZzsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK0JvdGggdHlwZSBvZiBzdHJpbmdzIGNhbiBiZSB1c2VkIGF0IHRoZSBzYW1lIHRpbWUsIGJ1dCByZXF1aXJlcyBvbmUgdHlwZWRlZiBuYW1lIHRvIGJlIGNoYW5nZWQgYnkgYXBwZW5kaW5nIGFuIHVuZGVyc2NvcmUgd2hpY2ggaXMNCitpbnZpc2libGUgaW4gWE1MLiBGb3IgZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDt3Y2hhcl90ICp4c2RfX3N0cmluZ187DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT48L2RkPg0KKyA8ZHQ+PGI+PHR0PnhzZDp0aW1lPC90dD48L2I+PC9kdD4NCisJPGRkPg0KK1JlcHJlc2VudHMgYSB0aW1lLiAgVGhlIGxleGljYWwgcmVwcmVzZW50YXRpb24gZm9yIHRpbWUgaXMgdGhlIGxlZnQgdHJ1bmNhdGVkIGxleGljYWwgcmVwcmVzZW50YXRpb24gZm9yIGRhdGVUaW1lOiBoaDptbTpzcy5zc3MNCit3aXRoIG9wdGlvbmFsIGZvbGxvd2luZyB0aW1lIHpvbmUgaW5kaWNhdG9yLg0KK0l0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBzdHJpbmdzICg8aT48Yj5jaGFyPC9iPio8L2k+KSB0byBzdG9yZSA8dHQ+eHNkOnRpbWU8L3R0PiBYU0QgU2NoZW1hIHR5cGVzLiBUaGUgdHlwZSBkZWNsYXJhdGlvbiBpczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyp4c2RfX3RpbWU7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT48L2RkPg0KKyA8ZHQ+PGI+PHR0PnhzZDp0b2tlbjwvdHQ+PC9iPjwvZHQ+DQorCTxkZD4NCitSZXByZXNlbnRzIHRva2VuaXplZCBzdHJpbmdzLg0KK1Rva2VucyBhcmUgc3RyaW5ncyB0aGF0IGRvIG5vdCBjb250YWluIHRoZQ0KK2xpbmUgZmVlZCAoI3hBKSBub3IgdGFiICgjeDkpIGNoYXJhY3RlcnMsIHRoYXQgaGF2ZSBubyBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcyAoI3gyMCkgYW5kIHRoYXQgaGF2ZSBubyBpbnRlcm5hbA0KK3NlcXVlbmNlcyBvZiB0d28gb3IgbW9yZSBzcGFjZXMuDQorSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIHN0cmluZ3MgdG8gc3RvcmUgPHR0PnhzZDp0b2tlbjwvdHQ+IFhTRCBTY2hlbWEgdHlwZXMuDQorVGhlIHR5cGUgZGVjbGFyYXRpb24gaXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnR5cGVkZWY8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqeHNkX190b2tlbjsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1R5cGUgPGk+eHNkX190b2tlbjwvaT4gZGVjbGFyZXMgYSBzdHJpbmcgdHlwZSB3aGljaCBpcyBlbmNvZGVkIGFzIA0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwQjBEMCI+PHRyPjx0ZD48dHQ+DQorJmx0O3hzZDp0b2tlbiB4c2k6dHlwZT0ieHNkOnRva2VuIiYjNjI7Li4uJmx0Oy94c2Q6dG9rZW4mIzYyOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3R0Pg0KK0l0IGlzIHNvbGVseSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGFwcGxpY2F0aW9uIHRvIG1ha2Ugc3VyZSB0aGUgc3RyaW5ncyBkbyBub3QgY29udGFpbiB0aGUgbGluZSBmZWVkICgjeEEpIG5vciB0YWIgKCN4OSkNCitjaGFyYWN0ZXJzLCB0aGF0IGhhdmUgbm8gbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMgKCN4MjApIGFuZCB0aGF0IGhhdmUgbm8gaW50ZXJuYWwgc2VxdWVuY2VzIG9mIHR3byBvciBtb3JlIHNwYWNlcy48L2RkPg0KKyA8ZHQ+PGI+PHR0PnhzZDp1bnNpZ25lZEJ5dGU8L3R0PjwvYj48L2R0Pg0KKwk8ZGQ+DQorQ29ycmVzcG9uZHMgdG8gYW4gOC1iaXQgdW5zaWduZWQgaW50ZWdlciBpbiB0aGUgcmFuZ2UgMCB0byAyNTUuDQorVGhlIHR5cGUgZGVjbGFyYXRpb24gaXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnR5cGVkZWY8L2I+Jm5ic3A7PGI+dW5zaWduZWQ8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDt4c2RfX3Vuc2lnbmVkQnl0ZTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1R5cGUgPGk+eHNkX191bnNpZ25lZEJ5dGU8L2k+IGRlY2xhcmVzIGEgdW5zaWduZWQgOC1iaXQgaW50ZWdlciB3aGljaCBpcyBlbmNvZGVkIGFzIA0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwQjBEMCI+PHRyPjx0ZD48dHQ+DQorJmx0O3hzZDp1bnNpZ25lZEJ5dGUgeHNpOnR5cGU9InhzZDp1bnNpZ25lZEJ5dGUiJiM2MjsuLi4mbHQ7L3hzZDp1bnNpZ25lZEJ5dGUmIzYyOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3R0PjwvZGQ+DQorIDxkdD48Yj48dHQ+eHNkOnVuc2lnbmVkSW50PC90dD48L2I+PC9kdD4NCisJPGRkPg0KK0NvcnJlc3BvbmRzIHRvIGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIgaW4gdGhlIHJhbmdlIDAgdG8gNDI5NDk2NzI5NS4NCitJZiB0aGUgQysrIGNvbXBpbGVyIHN1cHBvcnRzIDMyLWJpdCA8aT48Yj5pbnQ8L2I+PC9pPiB0eXBlcywgdGhlIHR5cGUgZGVjbGFyYXRpb24gY2FuIHVzZSB0aGUgPGk+PGI+aW50PC9iPjwvaT4gdHlwZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj51bnNpZ25lZDwvYj4mbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7eHNkX191bnNpZ25lZEludDsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK090aGVyd2lzZSwgdGhlIEMrKyBjb21waWxlciBzdXBwb3J0cyAxNi1iaXQgPGk+PGI+aW50PC9iPjwvaT4gdHlwZXMgYW5kIHRoZSB0eXBlIGRlY2xhcmF0aW9uIHNob3VsZCB1c2UgdGhlIDxpPjxiPmxvbmc8L2I+PC9pPiB0eXBlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPnVuc2lnbmVkPC9iPiZuYnNwOzxiPmxvbmc8L2I+Jm5ic3A7eHNkX191bnNpZ25lZEludDsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1R5cGUgPGk+eHNkX191bnNpZ25lZEludDwvaT4gZGVjbGFyZXMgYW4gdW5zaWduZWQgMzItYml0IGludGVnZXIgd2hpY2ggaXMgZW5jb2RlZCBhcyANCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEIwRDAiPjx0cj48dGQ+PHR0Pg0KKyZsdDt4c2Q6dW5zaWduZWRJbnQgeHNpOnR5cGU9InhzZDp1bnNpZ25lZEludCImIzYyOy4uLiZsdDsveHNkOnVuc2lnbmVkSW50JiM2MjsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC90dD48L2RkPg0KKyA8ZHQ+PGI+PHR0PnhzZDp1bnNpZ25lZExvbmc8L3R0PjwvYj48L2R0Pg0KKwk8ZGQ+DQorQ29ycmVzcG9uZHMgdG8gYSA2NC1iaXQgdW5zaWduZWQgaW50ZWdlciBpbiB0aGUgcmFuZ2UgMCB0byAxODQ0Njc0NDA3MzcwOTU1MTYxNS4NCitUaGUgdHlwZSBkZWNsYXJhdGlvbiBpczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj51bnNpZ25lZDwvYj4mbmJzcDs8Yj5sb25nPC9iPiZuYnNwOzxiPmxvbmc8L2I+Jm5ic3A7eHNkX191bnNpZ25lZExvbmc7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitPciBpbiBWaXN1YWwgQysrOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj50eXBlZGVmPC9iPiZuYnNwO1VMT05HNjQgeHNkX191bnNpZ25lZExvbmc7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUeXBlIDxpPnhzZF9fdW5zaWduZWRMb25nPC9pPiBkZWNsYXJlcyBhbiB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlciB3aGljaCBpcyBlbmNvZGVkIGFzIA0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwQjBEMCI+PHRyPjx0ZD48dHQ+DQorJmx0O3hzZDp1bnNpZ25lZExvbmcgeHNpOnR5cGU9InhzZDp1bnNpZ25lZExvbmciJiM2MjsuLi4mbHQ7L3hzZDp1bnNpZ25lZExvbmcmIzYyOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3R0PjwvZGQ+DQorIDxkdD48Yj48dHQ+eHNkOnVuc2lnbmVkU2hvcnQ8L3R0PjwvYj48L2R0Pg0KKwk8ZGQ+DQorQ29ycmVzcG9uZHMgdG8gYSAxNi1iaXQgdW5zaWduZWQgaW50ZWdlciBpbiB0aGUgcmFuZ2UgMCB0byA2NTUzNS4NCitUaGUgdHlwZSBkZWNsYXJhdGlvbiBpczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj51bnNpZ25lZDwvYj4mbmJzcDs8Yj5zaG9ydDwvYj4mbmJzcDt4c2RfX3Vuc2lnbmVkU2hvcnQ7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUeXBlIDxpPnhzZF9fdW5zZ2luZWRTaG9ydDwvaT4gZGVjbGFyZXMgYW4gdW5zaWduZWQgc2hvcnQgMTYtYml0IGludGVnZXIgd2hpY2ggaXMgZW5jb2RlZCBhcyANCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEIwRDAiPjx0cj48dGQ+PHR0Pg0KKyZsdDt4c2Q6dW5zaWduZWRTaG9ydCB4c2k6dHlwZT0ieHNkOnVuc2lnbmVkU2hvcnQiJiM2MjsuLi4mbHQ7L3hzZDp1bnNpZ25lZFNob3J0JiM2MjsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC90dD48L2RkPg0KKzwvZGw+DQorT3RoZXIgWFNEIFNjaGVtYSB0eXBlcyBzdWNoIGFzIDx0dD5nWWVhck1vbnRoPC90dD4sIDx0dD5nWWVhcjwvdHQ+LCA8dHQ+Z01vbnRoRGF5PC90dD4sIDx0dD5nRGF5PC90dD4sIDx0dD54c2Q6Z01vbnRoPC90dD4sIDx0dD5RTmFtZTwvdHQ+LA0KKzx0dD5OT1RBVElPTjwvdHQ+LCBldGMuLCBjYW4gYmUgZW5jb2RlZCBzaW1pbGFybHkgdXNpbmcgYSA8aT48Yj50eXBlZGVmPC9iPjwvaT4gZGVjbGFyYXRpb24uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkJICAgICAgPGg0PjxhIG5hbWU9InR0aF9zRWMxMC4yLjEiPg0KKzEwLjIuMTwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+SG93IHRvIFVzZSBNdWx0aXBsZSBDL0MrKyBUeXBlcyBmb3IgYSBTaW5nbGUgUHJpbWl0aXZlIFhTRCBUeXBlPC9mb250PjwvaDQ+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RyYWlsaW5nIHVuZGVyc2NvcmVzIChzZWUgU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6aWR0cmFucyI+OS4zPC9hPikgY2FuIGJlIHVzZWQgaW4gdGhlIHR5cGUNCituYW1lIGluIGEgPGk+PGI+dHlwZWRlZjwvYj48L2k+IHRvIGVuYWJsZSB0aGUgZGVjbGFyYXRpb24gb2YgbXVsdGlwbGUgc3RvcmFnZSBmb3JtYXRzDQorZm9yIGEgc2luZ2xlIFhNTCBTY2hlbWEgdHlwZS4gRm9yIGV4YW1wbGUsIG9uZSBwYXJ0IG9mIGEgQy9DKysgYXBwbGljYXRpb24ncw0KK2RhdGEgc3RydWN0dXJlIG1heSB1c2UgcGxhaW4gc3RyaW5ncyB3aGlsZSBhbm90aGVyIHBhcnQgbWF5IHVzZSB3aWRlIGNoYXJhY3Rlcg0KK3N0cmluZ3MuICBUbyBlbmFibGUgdGhpcyBzaW11bHRhbmVvdXMgdXNlLCBkZWNsYXJlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KnhzZF9fc3RyaW5nOyA8YnIgLz4NCis8Yj50eXBlZGVmPC9iPiZuYnNwO3djaGFyX3QgKnhzZF9fc3RyaW5nXzsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK05vdywgdGhlIDxpPnhzZF9fc3RyaW5nPC9pPiBhbmQgPGk+eHNkX19zdHJpbmdfPC9pPiB0eXBlcyB3aWxsIGJvdGggYmUgZW5jb2RlZA0KK2FuZCBkZWNvZGVkIGFzIFhNTCBzdHJpbmcgdHlwZXMgYW5kIHRoZSB1c2Ugb2YgdHJhaWxpbmcgdW5kZXJzY29yZXMgYWxsb3dzDQorbXVsdGlwbGUgZGVjbGFyYXRpb25zIGZvciBhIHNpbmdsZSBYTUwgU2NoZW1hIHR5cGUuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkJICAgICAgPGg0PjxhIG5hbWU9InR0aF9zRWMxMC4yLjIiPg0KKzEwLjIuMjwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+SG93IHRvIHVzZSBXcmFwcGVyIENsYXNzZXMgdG8gU3BlY2lmeSBQb2x5bW9ycGhpYyBQcmltaXRpdmUgVHlwZXM8L2ZvbnQ+PC9oND48YSBuYW1lPSJzZWM6cHJpbWNsYXNzIj4NCis8L2E+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1NPQVAgMS4xIHN1cHBvcnRzIHBvbHltb3JwaGljIHR5cGVzLCBiZWNhdXNlIFhTRCBTY2hlbWEgdHlwZXMgZm9ybSBhIGhpZXJhcmNoeS4NCitUaGUgcm9vdCBvZiB0aGUgaGllcmFyY2h5IGlzIGNhbGxlZCA8dHQ+eHNkOmFueVR5cGU8L3R0PiAoPHR0PnhzZDp1ci10eXBlPC90dD4gaW4gdGhlDQorb2xkZXIgMTk5OSBzY2hlbWEpLiAgU28sIGZvciBleGFtcGxlLCBhbiBhcnJheSBvZiA8dHQ+eHNkOmFueVR5cGU8L3R0PiBpbiBTT0FQIG1heQ0KK2FjdHVhbGx5IGNvbnRhaW4gYW55IG1peCBvZiBlbGVtZW50IHR5cGVzIHRoYXQgYXJlIHRoZSBkZXJpdmVkIHR5cGVzIG9mIHRoZQ0KK3Jvb3QgdHlwZS4gIFRoZSB1c2Ugb2YgcG9seW1vcnBoaWMgdHlwZXMgaXMgaW5kaWNhdGVkIGJ5IHRoZSBXU0RMIGFuZCBzY2hlbWENCitkZXNjcmlwdGlvbnMgb2YgYSBXZWIgc2VydmljZSBhbmQgY2FuIHRoZXJlZm9yZSBiZSBwcmVkaWN0ZWQvZXhwZWN0ZWQgZm9yIGVhY2gNCitwYXJ0aWN1bGFyIGNhc2UuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK09uIHRoZSBvbmUgaGFuZCwgdGhlIDxpPjxiPnR5cGVkZWY8L2I+PC9pPiBjb25zdHJ1Y3QgcHJvdmlkZXMgYSBjb252ZW5pZW50IHdheSB0bw0KK2Fzc29jaWF0ZSBDL0MrKyB0eXBlcyB3aXRoIFhNTCBTY2hlbWEgdHlwZXMgYW5kIG1ha2VzIGl0IGVhc3kgdG8gaW5jb3Jwb3JhdGUNCit0aGVzZSB0eXBlcyBpbiBhIChsZWdhY3kpIEMvQysrIGFwcGxpY2F0aW9uLiAgSG93ZXZlciwgb24gdGhlIG90aGVyIGhhbmQgdGhlDQorPGk+PGI+dHlwZWRlZjwvYj48L2k+IGRlY2xhcmF0aW9ucyBjYW5ub3QgYmUgdXNlZCB0byBzdXBwb3J0IHBvbHltb3JwaGljIFhNTCBTY2hlbWENCit0eXBlcy4gIE1vc3QgU09BUCBjbGllbnRzIGFuZCBzZXJ2aWNlcyBkbyBub3QgdXNlIHBvbHltb3JwaGljIHR5cGVzLiAgSW4gY2FzZQ0KK3RoZXkgZG8sIHRoZSBwcmltaXRpdmUgcG9seW1vcnBoaWMgdHlwZXMgY2FuIGJlIGRlY2xhcmVkIGFzIGEgaGllcmFyY2h5IG9mIEMrKw0KKzxpPjxiPmNsYXNzPC9iPjwvaT5lcyB0aGF0IGNhbiBiZSB1c2VkIHNpbXVsdGFuZW91c2x5IHdpdGggdGhlIDxpPjxiPnR5cGVkZWY8L2I+PC9pPg0KK2RlY2xhcmF0aW9ucy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIGdlbmVyYWwgZm9ybSBvZiBhIHByaW1pdGl2ZSB0eXBlIGRlY2xhcmF0aW9uIHRoYXQgaXMgZGVyaXZlZCBmcm9tIGEgc3VwZXIgdHlwZSBpczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7eHNkX190eXBlX25hbWU6IDxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PjxiPnB1YmxpYzwvYj4mbmJzcDt4c2RfX3N1cGVyX3R5cGVfbmFtZTxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PiA8YnIgLz4NCit7IDxiPnB1YmxpYzwvYj46IDx1PjxzcGFuIGNsYXNzPSJyb21hbiI+VHlwZTwvc3Bhbj48L3U+IF9faXRlbTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+PGI+cHVibGljPC9iPjo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD4gPGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+PGI+cHJpdmF0ZTwvYj48Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD4gPGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+PGI+cHJvdGVjdGVkPC9iPjo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD4gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7bWV0aG9kMTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7bWV0aG9kMjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Li4uIDxiciAvPg0KK307DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCit3aGVyZSA8dT48c3BhbiBjbGFzcz0icm9tYW4iPlR5cGU8L3NwYW4+PC91PiBpcyBhIHByaW1pdGl2ZSBDIHR5cGUuIFRoZSA8aT5fX2l0ZW08L2k+IGZpZWxkIE1VU1QgYmUgdGhlIGZpcnN0DQorZmllbGQgaW4gdGhpcyB3cmFwcGVyIGNsYXNzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitGb3IgZXhhbXBsZSwgdGhlIFhNTCBTY2hlbWEgdHlwZSBoaWVyYXJjaHkgY2FuIGJlIGNvcGllZCB0byBDKysgd2l0aCB0aGUgZm9sbG93aW5nIGRlY2xhcmF0aW9uczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7eHNkX19hbnlUeXBlIHsgfTsgPGJyIC8+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7eHNkX19hbnlTaW1wbGVUeXBlOiA8Yj5wdWJsaWM8L2I+Jm5ic3A7eHNkX19hbnlUeXBlIHsgfTsgPGJyIC8+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyp4c2RfX2FueVVSSTsgPGJyIC8+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7eHNkX19hbnlVUklfOiA8Yj5wdWJsaWM8L2I+Jm5ic3A7eHNkX19hbnlTaW1wbGVUeXBlIHsgPGI+cHVibGljPC9iPjogeHNkX19hbnlVUkkgX19pdGVtOyB9OyA8YnIgLz4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmJvb2w8L2I+Jm5ic3A7eHNkX19ib29sZWFuOyA8YnIgLz4NCis8Yj5jbGFzczwvYj4mbmJzcDt4c2RfX2Jvb2xlYW5fOiA8Yj5wdWJsaWM8L2I+Jm5ic3A7eHNkX19hbnlTaW1wbGVUeXBlIHsgPGI+cHVibGljPC9iPjogeHNkX19ib29sZWFuIF9faXRlbTsgfTsgPGJyIC8+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyp4c2RfX2RhdGU7IDxiciAvPg0KKzxiPmNsYXNzPC9iPiZuYnNwO3hzZF9fZGF0ZV86IDxiPnB1YmxpYzwvYj4mbmJzcDt4c2RfX2FueVNpbXBsZVR5cGUgeyA8Yj5wdWJsaWM8L2I+OiB4c2RfX2RhdGUgX19pdGVtOyB9OyA8YnIgLz4NCis8Yj50eXBlZGVmPC9iPiZuYnNwO3RpbWVfdCB4c2RfX2RhdGVUaW1lOyA8YnIgLz4NCis8Yj5jbGFzczwvYj4mbmJzcDt4c2RfX2RhdGVUaW1lXzogPGI+cHVibGljPC9iPiZuYnNwO3hzZF9fYW55U2ltcGxlVHlwZSB7IDxiPnB1YmxpYzwvYj46IHhzZF9fZGF0ZVRpbWUgX19pdGVtOyB9OyA8YnIgLz4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmRvdWJsZTwvYj4mbmJzcDt4c2RfX2RvdWJsZTsgPGJyIC8+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7eHNkX19kb3VibGVfOiA8Yj5wdWJsaWM8L2I+Jm5ic3A7eHNkX19hbnlTaW1wbGVUeXBlIHsgPGI+cHVibGljPC9iPjogeHNkX19kb3VibGUgX19pdGVtOyB9OyA8YnIgLz4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KnhzZF9fZHVyYXRpb247IDxiciAvPg0KKzxiPmNsYXNzPC9iPiZuYnNwO3hzZF9fZHVyYXRpb25fOiA8Yj5wdWJsaWM8L2I+Jm5ic3A7eHNkX19hbnlTaW1wbGVUeXBlIHsgPGI+cHVibGljPC9iPjogeHNkX19kdXJhdGlvbiBfX2l0ZW07IH07IDxiciAvPg0KKzxiPnR5cGVkZWY8L2I+Jm5ic3A7PGI+ZmxvYXQ8L2I+Jm5ic3A7eHNkX19mbG9hdDsgPGJyIC8+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7eHNkX19mbG9hdF86IDxiPnB1YmxpYzwvYj4mbmJzcDt4c2RfX2FueVNpbXBsZVR5cGUgeyA8Yj5wdWJsaWM8L2I+OiB4c2RfX2Zsb2F0IF9faXRlbTsgfTsgPGJyIC8+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyp4c2RfX3RpbWU7IDxiciAvPg0KKzxiPmNsYXNzPC9iPiZuYnNwO3hzZF9fdGltZV86IDxiPnB1YmxpYzwvYj4mbmJzcDt4c2RfX2FueVNpbXBsZVR5cGUgeyA8Yj5wdWJsaWM8L2I+OiB4c2RfX3RpbWUgX19pdGVtOyB9OyA8YnIgLz4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KnhzZF9fZGVjaW1hbDsgPGJyIC8+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7eHNkX19kZWNpbWFsXzogPGI+cHVibGljPC9iPiZuYnNwO3hzZF9fYW55U2ltcGxlVHlwZSB7IDxiPnB1YmxpYzwvYj46IHhzZF9fZGVjaW1hbCBfX2l0ZW07IH07IDxiciAvPg0KKzxiPnR5cGVkZWY8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqeHNkX19pbnRlZ2VyOyA8YnIgLz4NCis8Yj5jbGFzczwvYj4mbmJzcDt4c2RfX2ludGVnZXJfOiA8Yj5wdWJsaWM8L2I+Jm5ic3A7eHNkX19kZWNpbWFsXyB7IDxiPnB1YmxpYzwvYj46IHhzZF9faW50ZWdlciBfX2l0ZW07IH07IDxiciAvPg0KKzxiPnR5cGVkZWY8L2I+Jm5ic3A7TE9ORzY0IHhzZF9fbG9uZzsgPGJyIC8+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7eHNkX19sb25nXzogPGI+cHVibGljPC9iPiZuYnNwO3hzZF9faW50ZWdlcl8geyA8Yj5wdWJsaWM8L2I+OiB4c2RfX2xvbmcgX19pdGVtOyB9OyA8YnIgLz4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmxvbmc8L2I+Jm5ic3A7eHNkX19pbnQ7IDxiciAvPg0KKzxiPmNsYXNzPC9iPiZuYnNwO3hzZF9faW50XzogPGI+cHVibGljPC9iPiZuYnNwO3hzZF9fbG9uZ18geyA8Yj5wdWJsaWM8L2I+OiB4c2RfX2ludCBfX2l0ZW07IH07IDxiciAvPg0KKzxiPnR5cGVkZWY8L2I+Jm5ic3A7PGI+c2hvcnQ8L2I+Jm5ic3A7eHNkX19zaG9ydDsgPGJyIC8+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7eHNkX19zaG9ydF86IDxiPnB1YmxpYzwvYj4mbmJzcDt4c2RfX2ludF8geyA8Yj5wdWJsaWM8L2I+OiB4c2RfX3Nob3J0IF9faXRlbTsgfTsgPGJyIC8+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwO3hzZF9fYnl0ZTsgPGJyIC8+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7eHNkX19ieXRlXzogPGI+cHVibGljPC9iPiZuYnNwO3hzZF9fc2hvcnRfIHsgPGI+cHVibGljPC9iPjogeHNkX19ieXRlIF9faXRlbTsgfTsgPGJyIC8+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyp4c2RfX25vblBvc2l0aXZlSW50ZWdlcjsgPGJyIC8+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7eHNkX19ub25Qb3NpdGl2ZUludGVnZXJfOiA8Yj5wdWJsaWM8L2I+Jm5ic3A7eHNkX19pbnRlZ2VyXyB7IDxiPnB1YmxpYzwvYj46IHhzZF9fbm9uUG9zaXRpdmVJbnRlZ2VyIF9faXRlbTsgfTsgPGJyIC8+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyp4c2RfX25lZ2F0aXZlSW50ZWdlcjsgPGJyIC8+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7eHNkX19uZWdhdGl2ZUludGVnZXJfOiA8Yj5wdWJsaWM8L2I+Jm5ic3A7eHNkX19ub25Qb3NpdGl2ZUludGVnZXJfIHsgPGI+cHVibGljPC9iPjogeHNkX19uZWdhdGl2ZUludGVnZXIgX19pdGVtOyB9OyA8YnIgLz4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KnhzZF9fbm9uTmVnYXRpdmVJbnRlZ2VyOyA8YnIgLz4NCis8Yj5jbGFzczwvYj4mbmJzcDt4c2RfX25vbk5lZ2F0aXZlSW50ZWdlcl86IDxiPnB1YmxpYzwvYj4mbmJzcDt4c2RfX2ludGVnZXJfIHsgPGI+cHVibGljPC9iPjogeHNkX19ub25OZWdhdGl2ZUludGVnZXIgX19pdGVtOyB9OyA8YnIgLz4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KnhzZF9fcG9zaXRpdmVJbnRlZ2VyOyA8YnIgLz4NCis8Yj5jbGFzczwvYj4mbmJzcDt4c2RfX3Bvc2l0aXZlSW50ZWdlcl86IDxiPnB1YmxpYzwvYj4mbmJzcDt4c2RfX25vbk5lZ2F0aXZlSW50ZWdlcl8geyA8Yj5wdWJsaWM8L2I+OiB4c2RfX3Bvc2l0aXZlSW50ZWdlciBfX2l0ZW07IH07IDxiciAvPg0KKzxiPnR5cGVkZWY8L2I+Jm5ic3A7VUxPTkc2NCB4c2RfX3Vuc2lnbmVkTG9uZzsgPGJyIC8+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7eHNkX191bnNpZ25lZExvbmdfOiA8Yj5wdWJsaWM8L2I+Jm5ic3A7eHNkX19ub25OZWdhdGl2ZUludGVnZXJfIHsgPGI+cHVibGljPC9iPjogeHNkX191bnNpZ25lZExvbmcgX19pdGVtOyB9OyA8YnIgLz4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPnVuc2lnbmVkPC9iPiZuYnNwOzxiPmxvbmc8L2I+Jm5ic3A7eHNkX191bnNpZ25lZEludDsgPGJyIC8+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7eHNkX191bnNpZ25lZEludF86IDxiPnB1YmxpYzwvYj4mbmJzcDt4c2RfX3Vuc2dpbmVkTG9uZ18geyA8Yj5wdWJsaWM8L2I+OiB4c2RfX3Vuc2lnbmVkSW50IF9faXRlbTsgfTsgPGJyIC8+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj51bnNpZ25lZDwvYj4mbmJzcDs8Yj5zaG9ydDwvYj4mbmJzcDt4c2RfX3Vuc2lnbmVkU2hvcnQ7IDxiciAvPg0KKzxiPmNsYXNzPC9iPiZuYnNwO3hzZF9fdW5zaWduZWRTaG9ydF86IDxiPnB1YmxpYzwvYj4mbmJzcDt4c2RfX3Vuc2lnbmVkSW50XyB7IDxiPnB1YmxpYzwvYj46IHhzZF9fdW5zaWduZWRTaG9ydCBfX2l0ZW07IH07IDxiciAvPg0KKzxiPnR5cGVkZWY8L2I+Jm5ic3A7PGI+dW5zaWduZWQ8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDt4c2RfX3Vuc2lnbmVkQnl0ZTsgPGJyIC8+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7eHNkX191bnNpZ25lZEJ5dGVfOiA8Yj5wdWJsaWM8L2I+Jm5ic3A7eHNkX191bnNpZ25lZFNob3J0XyB7IDxiPnB1YmxpYzwvYj46IHhzZF9fdW5zaWduZWRCeXRlIF9faXRlbTsgfTsgPGJyIC8+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyp4c2RfX3N0cmluZzsgPGJyIC8+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7eHNkX19zdHJpbmdfOiA8Yj5wdWJsaWM8L2I+Jm5ic3A7eHNkX19hbnlTaW1wbGVUeXBlIHsgPGI+cHVibGljPC9iPjogeHNkX19zdHJpbmcgX19pdGVtOyB9OyA8YnIgLz4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KnhzZF9fbm9ybWFsaXplZFN0cmluZzsgPGJyIC8+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7eHNkX19ub3JtYWxpemVkU3RyaW5nXzogPGI+cHVibGljPC9iPiZuYnNwO3hzZF9fc3RyaW5nXyB7IDxiPnB1YmxpYzwvYj46IHhzZF9fbm9ybWFsaXplZFN0cmluZyBfX2l0ZW07IH07IDxiciAvPg0KKzxiPnR5cGVkZWY8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqeHNkX190b2tlbjsgPGJyIC8+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7eHNkX190b2tlbl86IDxiPnB1YmxpYzwvYj4mbmJzcDt4c2RfX25vcm1hbGl6ZWRTdHJpbmdfIHsgPGI+cHVibGljPC9iPjogeHNkX190b2tlbiBfX2l0ZW07IH07IDxiciAvPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorTm90ZSB0aGUgdXNlIG9mIHRoZSB0cmFpbGluZyB1bmRlcnNjb3JlcyBmb3IgdGhlIDxpPjxiPmNsYXNzPC9iPjwvaT4gbmFtZXMgdG8gZGlzdGluZ3Vpc2ggdGhlIDxpPjxiPnR5cGVkZWY8L2I+PC9pPiB0eXBlIG5hbWVzIGZyb20gdGhlDQorPGk+PGI+Y2xhc3M8L2I+PC9pPiBuYW1lcy4gIE9ubHkgdGhlIG1vc3QgZnJlcXVlbnRseSB1c2VkIGJ1aWx0LWluIHNjaGVtYSB0eXBlcyBhcmUgc2hvd24uDQorSXQgaXMgYWxzbyBhbGxvd2VkIHRvIGluY2x1ZGUgdGhlIDxpPnhzZDpiYXNlNjRCaW5hcnk8L2k+IGFuZCA8aT54c2Q6aGV4QmluYXJ5PC9pPiB0eXBlcyBpbiB0aGUgaGllcmFyY2h5Og0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5jbGFzczwvYj4mbmJzcDt4c2RfX2Jhc2U2NEJpbmFyeTogPGI+cHVibGljPC9iPiZuYnNwO3hzZF9fYW55U2ltcGxlVHlwZSB7IDxiPnB1YmxpYzwvYj46IDxiPnVuc2lnbmVkPC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7Kl9fcHRyOyA8Yj5pbnQ8L2I+Jm5ic3A7X19zaXplOyB9OyA8YnIgLz4NCis8Yj5jbGFzczwvYj4mbmJzcDt4c2RfX2hleEJpbmFyeTogPGI+cHVibGljPC9iPiZuYnNwO3hzZF9fYW55U2ltcGxlVHlwZSB7IDxiPnB1YmxpYzwvYj46IDxiPnVuc2lnbmVkPC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7Kl9fcHRyOyA8Yj5pbnQ8L2I+Jm5ic3A7X19zaXplOyB9Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorU2VlIFNlY3Rpb25zJm5ic3A7PGEgaHJlZj0iI3NlYzpiYXNlNjRiaW5hcnkiPjEwLjExPC9hPiBhbmQmbmJzcDs8YSBocmVmPSIjc2VjOmhleGJpbmFyeSI+MTAuMTI8L2E+Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitNZXRob2RzIGFyZSBhbGxvd2VkIHRvIGJlIGFkZGVkIHRvIHRoZSBjbGFzc2VzIGFib3ZlLCBzdWNoIGFzIGNvbnN0cnVjdG9ycyBhbmQgZ2V0dGVyL3NldHRlciBtZXRob2RzLCBzZWUgU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6Z2V0dGVyc2V0dGVyIj4xMC41LjQ8L2E+Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitXcmFwcGVyIHN0cnVjdHMgYXJlIHN1cHBvcnRlZCBhcyB3ZWxsLCBzaW1pbGFyIHRvIHdyYXBwZXIgY2xhc3Nlcy4gIEJ1dCB0aGV5IGNhbm5vdCBiZSB1c2VkDQordG8gaW1wbGVtZW50IHBvbHltb3JwaGlzbS4gIFJhdGhlciwgdGhlIHdyYXBwZXIgc3RydWN0cyBmYWNpbGl0YXRlIHRoZSB1c2Ugb2YgWE1MIGF0dHJpYnV0ZXMNCit3aXRoIGEgcHJpbWl0aXZlIHR5cGVkIG9iamVjdCwgc2VlJm5ic3A7PGEgaHJlZj0iI3NlYzphdHRyaWJ1dGVzIj4xMC41Ljc8L2E+Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJCSAgICAgIDxoND48YSBuYW1lPSJ0dGhfc0VjMTAuMi4zIj4NCisxMC4yLjM8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPlhTRCBTY2hlbWEgVHlwZSBEZWNvZGluZyBSdWxlczwvZm9udD48L2g0Pg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgZGVjb2RpbmcgcnVsZXMgZm9yIHRoZSBwcmltaXRpdmUgQyBhbmQgQysrIGRhdGEgdHlwZXMgaXMgZ2l2ZW4gaW4gdGhlIHRhYmxlIGJlbG93Og0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKw0KKzx0YWJsZT4NCis8dHI+PHRkPjxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5UeXBlPC9iPjwvZm9udD4gPC90ZD48dGQ+PGZvbnQgY29sb3I9IiNGRjAwMDAiPjxiPkFsbG93cyBEZWNvZGluZyBvZjwvYj48L2ZvbnQ+IDwvdGQ+PHRkPjxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5QcmVjaXNpb24gTG9zdD88L2I+PC9mb250PiA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT48Yj5ib29sPC9iPjwvaT4gPC90ZD48dGQ+PHR0Pjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PnhzZDo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD5ib29sZWFuPC90dD4gPC90ZD48dGQ+bm8gPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+PGI+Y2hhcjwvYj4qPC9pPiAoQyBzdHJpbmcpIDwvdGQ+PHRkPmFueSB0eXBlLCBzZWUmbmJzcDs8YSBocmVmPSIjc2VjOnNtYXJ0Ij4xMC4yLjU8L2E+IDwvdGQ+PHRkPm5vIDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPndjaGFyX3QgKjwvaT4gKHdpZGUgc3RyaW5nKSA8L3RkPjx0ZD5hbnkgdHlwZSwgc2VlJm5ic3A7PGEgaHJlZj0iI3NlYzpzbWFydCI+MTAuMi41PC9hPiA8L3RkPjx0ZD5ubyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZD48aT48Yj5kb3VibGU8L2I+PC9pPgk8L3RkPjx0ZD48dHQ+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+eHNkOjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PmRvdWJsZTwvdHQ+IDwvdGQ+PHRkPm5vIDwvdGQ+PC90cj4NCis8dHI+PHRkPjwvdGQ+PHRkPjx0dD48Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD54c2Q6PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+ZmxvYXQ8L3R0PiA8L3RkPjx0ZD5ubyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjx0ZD48dHQ+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+eHNkOjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250Pmxvbmc8L3R0PiA8L3RkPjx0ZD5ubyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjx0ZD48dHQ+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+eHNkOjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PmludDwvdHQ+IDwvdGQ+PHRkPm5vIDwvdGQ+PC90cj4NCis8dHI+PHRkPjwvdGQ+PHRkPjx0dD48Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD54c2Q6PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+c2hvcnQ8L3R0PiA8L3RkPjx0ZD5ubyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjx0ZD48dHQ+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+eHNkOjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PmJ5dGU8L3R0PiA8L3RkPjx0ZD5ubyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjx0ZD48dHQ+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+eHNkOjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PnVuc2lnbmVkTG9uZzwvdHQ+IDwvdGQ+PHRkPm5vIDwvdGQ+PC90cj4NCis8dHI+PHRkPjwvdGQ+PHRkPjx0dD48Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD54c2Q6PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+dW5zaWduZWRJbnQ8L3R0PiA8L3RkPjx0ZD5ubyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjx0ZD48dHQ+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+eHNkOjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PnVuc2lnbmVkU2hvcnQ8L3R0PiA8L3RkPjx0ZD5ubyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjx0ZD48dHQ+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+eHNkOjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PnVuc2lnbmVkQnl0ZTwvdHQ+IDwvdGQ+PHRkPm5vIDwvdGQ+PC90cj4NCis8dHI+PHRkPjwvdGQ+PHRkPjx0dD48Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD54c2Q6PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+ZGVjaW1hbDwvdHQ+IDwvdGQ+PHRkPnBvc3NpYmx5IDwvdGQ+PC90cj4NCis8dHI+PHRkPjwvdGQ+PHRkPjx0dD48Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD54c2Q6PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+aW50ZWdlcjwvdHQ+IDwvdGQ+PHRkPnBvc3NpYmx5IDwvdGQ+PC90cj4NCis8dHI+PHRkPjwvdGQ+PHRkPjx0dD48Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD54c2Q6PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+cG9zaXRpdmVJbnRlZ2VyPC90dD4gPC90ZD48dGQ+cG9zc2libHkgPC90ZD48L3RyPg0KKzx0cj48dGQ+PC90ZD48dGQ+PHR0Pjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PnhzZDo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD5uZWdhdGl2ZUludGVnZXI8L3R0PiA8L3RkPjx0ZD5wb3NzaWJseSA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjx0ZD48dHQ+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+eHNkOjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250Pm5vblBvc2l0aXZlSW50ZWdlcjwvdHQ+IDwvdGQ+PHRkPnBvc3NpYmx5IDwvdGQ+PC90cj4NCis8dHI+PHRkPjwvdGQ+PHRkPjx0dD48Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD54c2Q6PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+bm9uTmVnYXRpdmVJbnRlZ2VyPC90dD4gPC90ZD48dGQ+cG9zc2libHkgPC90ZD48L3RyPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+PGI+ZmxvYXQ8L2I+PC9pPgk8L3RkPjx0ZD48dHQ+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+eHNkOjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PmZsb2F0PC90dD4gPC90ZD48dGQ+bm8gPC90ZD48L3RyPg0KKzx0cj48dGQ+PC90ZD48dGQ+PHR0Pjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PnhzZDo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD5sb25nPC90dD4gPC90ZD48dGQ+bm8gPC90ZD48L3RyPg0KKzx0cj48dGQ+PC90ZD48dGQ+PHR0Pjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PnhzZDo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD5pbnQ8L3R0PiA8L3RkPjx0ZD5ubyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjx0ZD48dHQ+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+eHNkOjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PnNob3J0PC90dD4gPC90ZD48dGQ+bm8gPC90ZD48L3RyPg0KKzx0cj48dGQ+PC90ZD48dGQ+PHR0Pjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PnhzZDo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD5ieXRlPC90dD4gPC90ZD48dGQ+bm8gPC90ZD48L3RyPg0KKzx0cj48dGQ+PC90ZD48dGQ+PHR0Pjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PnhzZDo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD51bnNpZ25lZExvbmc8L3R0PiA8L3RkPjx0ZD5ubyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjx0ZD48dHQ+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+eHNkOjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PnVuc2lnbmVkSW50PC90dD4gPC90ZD48dGQ+bm8gPC90ZD48L3RyPg0KKzx0cj48dGQ+PC90ZD48dGQ+PHR0Pjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PnhzZDo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD51bnNpZ25lZFNob3J0PC90dD4gPC90ZD48dGQ+bm8gPC90ZD48L3RyPg0KKzx0cj48dGQ+PC90ZD48dGQ+PHR0Pjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PnhzZDo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD51bnNpZ25lZEJ5dGU8L3R0PiA8L3RkPjx0ZD5ubyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjx0ZD48dHQ+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+eHNkOjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PmRlY2ltYWw8L3R0PiA8L3RkPjx0ZD5wb3NzaWJseSA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjx0ZD48dHQ+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+eHNkOjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PmludGVnZXI8L3R0PiA8L3RkPjx0ZD5wb3NzaWJseSA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjx0ZD48dHQ+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+eHNkOjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PnBvc2l0aXZlSW50ZWdlcjwvdHQ+IDwvdGQ+PHRkPnBvc3NpYmx5IDwvdGQ+PC90cj4NCis8dHI+PHRkPjwvdGQ+PHRkPjx0dD48Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD54c2Q6PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+bmVnYXRpdmVJbnRlZ2VyPC90dD4gPC90ZD48dGQ+cG9zc2libHkgPC90ZD48L3RyPg0KKzx0cj48dGQ+PC90ZD48dGQ+PHR0Pjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PnhzZDo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD5ub25Qb3NpdGl2ZUludGVnZXI8L3R0PiA8L3RkPjx0ZD5wb3NzaWJseSA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjx0ZD48dHQ+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+eHNkOjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250Pm5vbk5lZ2F0aXZlSW50ZWdlcjwvdHQ+IDwvdGQ+PHRkPnBvc3NpYmx5IDwvdGQ+PC90cj4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPjxiPmxvbmc8L2I+Jm5ic3A7PGI+bG9uZzwvYj48L2k+IDwvdGQ+PHRkPjx0dD48Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD54c2Q6PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+bG9uZzwvdHQ+IDwvdGQ+PHRkPm5vIDwvdGQ+PC90cj4NCis8dHI+PHRkPjwvdGQ+PHRkPjx0dD48Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD54c2Q6PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+aW50PC90dD4gPC90ZD48dGQ+bm8gPC90ZD48L3RyPg0KKzx0cj48dGQ+PC90ZD48dGQ+PHR0Pjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PnhzZDo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD5zaG9ydDwvdHQ+IDwvdGQ+PHRkPm5vIDwvdGQ+PC90cj4NCis8dHI+PHRkPjwvdGQ+PHRkPjx0dD48Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD54c2Q6PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+Ynl0ZTwvdHQ+IDwvdGQ+PHRkPm5vIDwvdGQ+PC90cj4NCis8dHI+PHRkPjwvdGQ+PHRkPjx0dD48Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD54c2Q6PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+dW5zaWduZWRMb25nPC90dD4gPC90ZD48dGQ+cG9zc2libHkgPC90ZD48L3RyPg0KKzx0cj48dGQ+PC90ZD48dGQ+PHR0Pjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PnhzZDo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD51bnNpZ25lZEludDwvdHQ+IDwvdGQ+PHRkPm5vIDwvdGQ+PC90cj4NCis8dHI+PHRkPjwvdGQ+PHRkPjx0dD48Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD54c2Q6PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+dW5zaWduZWRTaG9ydDwvdHQ+IDwvdGQ+PHRkPm5vIDwvdGQ+PC90cj4NCis8dHI+PHRkPjwvdGQ+PHRkPjx0dD48Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD54c2Q6PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+dW5zaWduZWRCeXRlPC90dD4gPC90ZD48dGQ+bm8gPC90ZD48L3RyPg0KKzx0cj48dGQ+PC90ZD48dGQ+PHR0Pjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PnhzZDo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD5pbnRlZ2VyPC90dD4gPC90ZD48dGQ+cG9zc2libHkgPC90ZD48L3RyPg0KKzx0cj48dGQ+PC90ZD48dGQ+PHR0Pjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PnhzZDo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD5wb3NpdGl2ZUludGVnZXI8L3R0PiA8L3RkPjx0ZD5wb3NzaWJseSA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjx0ZD48dHQ+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+eHNkOjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250Pm5lZ2F0aXZlSW50ZWdlcjwvdHQ+IDwvdGQ+PHRkPnBvc3NpYmx5IDwvdGQ+PC90cj4NCis8dHI+PHRkPjwvdGQ+PHRkPjx0dD48Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD54c2Q6PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+bm9uUG9zaXRpdmVJbnRlZ2VyPC90dD4gPC90ZD48dGQ+cG9zc2libHkgPC90ZD48L3RyPg0KKzx0cj48dGQ+PC90ZD48dGQ+PHR0Pjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PnhzZDo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD5ub25OZWdhdGl2ZUludGVnZXI8L3R0PiA8L3RkPjx0ZD5wb3NzaWJseSA8L3RkPjwvdHI+PC90YWJsZT4NCisNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9zcGFuPg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKw0KKzx0YWJsZT4NCis8dHI+PHRkPjxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5UeXBlPC9iPjwvZm9udD4gPC90ZD48dGQ+PGZvbnQgY29sb3I9IiNGRjAwMDAiPjxiPkFsbG93cyBEZWNvZGluZyBvZjwvYj48L2ZvbnQ+IDwvdGQ+PHRkPjxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5QcmVjaXNpb24gTG9zdD88L2I+PC9mb250PiA8L3RkPjwvdHI+DQorPHRyPjx0ZD48aT48Yj5sb25nPC9iPjwvaT4JPC90ZD48dGQ+PHR0Pjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PnhzZDo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD5sb25nPC90dD4gPC90ZD48dGQ+cG9zc2libHksIGlmIDxpPjxiPmxvbmc8L2I+PC9pPiBpcyAzMiBiaXQgPC90ZD48L3RyPg0KKzx0cj48dGQ+PC90ZD48dGQ+PHR0Pjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PnhzZDo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD5pbnQ8L3R0PiA8L3RkPjx0ZD5ubyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjx0ZD48dHQ+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+eHNkOjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PnNob3J0PC90dD4gPC90ZD48dGQ+bm8gPC90ZD48L3RyPg0KKzx0cj48dGQ+PC90ZD48dGQ+PHR0Pjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PnhzZDo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD5ieXRlPC90dD4gPC90ZD48dGQ+bm8gPC90ZD48L3RyPg0KKzx0cj48dGQ+PC90ZD48dGQ+PHR0Pjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PnhzZDo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD51bnNpZ25lZExvbmc8L3R0PiA8L3RkPjx0ZD5wb3NzaWJseSA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjx0ZD48dHQ+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+eHNkOjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PnVuc2lnbmVkSW50PC90dD4gPC90ZD48dGQ+bm8gPC90ZD48L3RyPg0KKzx0cj48dGQ+PC90ZD48dGQ+PHR0Pjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PnhzZDo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD51bnNpZ25lZFNob3J0PC90dD4gPC90ZD48dGQ+bm8gPC90ZD48L3RyPg0KKzx0cj48dGQ+PC90ZD48dGQ+PHR0Pjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PnhzZDo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD51bnNpZ25lZEJ5dGU8L3R0PiA8L3RkPjx0ZD5ubyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZD48aT48Yj5pbnQ8L2I+PC9pPgk8L3RkPjx0ZD48dHQ+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+eHNkOjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PmludDwvdHQ+IDwvdGQ+PHRkPm5vIDwvdGQ+PC90cj4NCis8dHI+PHRkPjwvdGQ+PHRkPjx0dD48Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD54c2Q6PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+c2hvcnQ8L3R0PiA8L3RkPjx0ZD5ubyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjx0ZD48dHQ+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+eHNkOjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PmJ5dGU8L3R0PiA8L3RkPjx0ZD5ubyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjx0ZD48dHQ+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+eHNkOjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PnVuc2lnbmVkSW50PC90dD4gPC90ZD48dGQ+cG9zc2libHkgPC90ZD48L3RyPg0KKzx0cj48dGQ+PC90ZD48dGQ+PHR0Pjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PnhzZDo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD51bnNpZ25lZFNob3J0PC90dD4gPC90ZD48dGQ+bm8gPC90ZD48L3RyPg0KKzx0cj48dGQ+PC90ZD48dGQ+PHR0Pjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PnhzZDo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD51bnNpZ25lZEJ5dGU8L3R0PiA8L3RkPjx0ZD5ubyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZD48aT48Yj5zaG9ydDwvYj48L2k+CTwvdGQ+PHRkPjx0dD48Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD54c2Q6PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+c2hvcnQ8L3R0PiA8L3RkPjx0ZD5ubyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjx0ZD48dHQ+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+eHNkOjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PmJ5dGU8L3R0PiA8L3RkPjx0ZD5ubyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjx0ZD48dHQ+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+eHNkOjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PnVuc2lnbmVkU2hvcnQ8L3R0PiA8L3RkPjx0ZD5ubyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjx0ZD48dHQ+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+eHNkOjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PnVuc2lnbmVkQnl0ZTwvdHQ+IDwvdGQ+PHRkPm5vIDwvdGQ+PC90cj4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPjxiPmNoYXI8L2I+PC9pPgk8L3RkPjx0ZD48dHQ+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+eHNkOjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PmJ5dGU8L3R0PiA8L3RkPjx0ZD5ubyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjx0ZD48dHQ+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+eHNkOjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PnVuc2lnbmVkQnl0ZTwvdHQ+IDwvdGQ+PHRkPnBvc3NpYmx5IDwvdGQ+PC90cj4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPjxiPnVuc2lnbmVkPC9iPiZuYnNwOzxiPmxvbmc8L2I+Jm5ic3A7PGI+bG9uZzwvYj48L2k+IDwvdGQ+PHRkPjx0dD48Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD54c2Q6PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+dW5zaWduZWRMb25nPC90dD4gPC90ZD48dGQ+bm8gPC90ZD48L3RyPg0KKzx0cj48dGQ+PC90ZD48dGQ+PHR0Pjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PnhzZDo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD51bnNpZ25lZEludDwvdHQ+IDwvdGQ+PHRkPm5vIDwvdGQ+PC90cj4NCis8dHI+PHRkPjwvdGQ+PHRkPjx0dD48Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD54c2Q6PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+dW5zaWduZWRTaG9ydDwvdHQ+IDwvdGQ+PHRkPm5vIDwvdGQ+PC90cj4NCis8dHI+PHRkPjwvdGQ+PHRkPjx0dD48Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD54c2Q6PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+dW5zaWduZWRCeXRlPC90dD4gPC90ZD48dGQ+bm8gPC90ZD48L3RyPg0KKzx0cj48dGQ+PC90ZD48dGQ+PHR0Pjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PnhzZDo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD5wb3NpdGl2ZUludGVnZXI8L3R0PiA8L3RkPjx0ZD5wb3NzaWJseSA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjx0ZD48dHQ+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+eHNkOjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250Pm5vbk5lZ2F0aXZlSW50ZWdlcjwvdHQ+IDwvdGQ+PHRkPnBvc3NpYmx5IDwvdGQ+PC90cj4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPjxiPnVuc2lnbmVkPC9iPiZuYnNwOzxiPmxvbmc8L2I+PC9pPiA8L3RkPjx0ZD48dHQ+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+eHNkOjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PnVuc2lnbmVkTG9uZzwvdHQ+IDwvdGQ+PHRkPnBvc3NpYmx5LCBpZiA8aT48Yj5sb25nPC9iPjwvaT4gaXMgMzIgYml0IDwvdGQ+PC90cj4NCis8dHI+PHRkPjwvdGQ+PHRkPjx0dD48Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD54c2Q6PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+dW5zaWduZWRJbnQ8L3R0PiA8L3RkPjx0ZD5ubyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjx0ZD48dHQ+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+eHNkOjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PnVuc2lnbmVkU2hvcnQ8L3R0PiA8L3RkPjx0ZD5ubyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjx0ZD48dHQ+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+eHNkOjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PnVuc2lnbmVkQnl0ZTwvdHQ+IDwvdGQ+PHRkPm5vIDwvdGQ+PC90cj4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPjxiPnVuc2lnbmVkPC9iPiZuYnNwOzxiPmludDwvYj48L2k+IDwvdGQ+PHRkPjx0dD48Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD54c2Q6PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+dW5zaWduZWRJbnQ8L3R0PiA8L3RkPjx0ZD5ubyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjx0ZD48dHQ+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+eHNkOjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PnVuc2lnbmVkU2hvcnQ8L3R0PiA8L3RkPjx0ZD5ubyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjx0ZD48dHQ+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+eHNkOjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PnVuc2lnbmVkQnl0ZTwvdHQ+IDwvdGQ+PHRkPm5vIDwvdGQ+PC90cj4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPjxiPnVuc2lnbmVkPC9iPiZuYnNwOzxiPnNob3J0PC9iPjwvaT4gPC90ZD48dGQ+PHR0Pjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PnhzZDo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD51bnNpZ25lZFNob3J0PC90dD4gPC90ZD48dGQ+bm8gPC90ZD48L3RyPg0KKzx0cj48dGQ+PC90ZD48dGQ+PHR0Pjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PnhzZDo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD51bnNpZ25lZEJ5dGU8L3R0PiA8L3RkPjx0ZD5ubyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZD48aT48Yj51bnNpZ25lZDwvYj4mbmJzcDs8Yj5jaGFyPC9iPjwvaT4gPC90ZD48dGQ+PHR0Pjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PnhzZDo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD51bnNpZ25lZEJ5dGU8L3R0PiA8L3RkPjx0ZD5ubyA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZD48aT50aW1lX3Q8L2k+CTwvdGQ+PHRkPjx0dD48Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD54c2Q6PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+ZGF0ZVRpbWU8L3R0PiA8L3RkPjx0ZD5ubyg/KSA8L3RkPjwvdHI+DQorPHRyPjx0ZD48L3RkPjwvdHI+PC90YWJsZT4NCisNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9zcGFuPg0KK0R1ZSB0byBsaW1pdGF0aW9ucyBpbiByZXByZXNlbnRhdGlvbiBvZiBjZXJ0YWluIHByaW1pdGl2ZSBDKysgdHlwZXMsIGEgcG9zc2libGUgbG9zcyBvZiBhY2N1cmFjeSBtYXkgb2NjdXIgd2l0aCB0aGUgZGVjb2Rpbmcgb2YgY2VydGFpbiBYU0QgU2NoZW1hIHR5cGVzIGFzIGlzIGluZGljYXRlZCBpbiB0aGUgdGFibGUuIFRoZSB0YWJsZSBkb2VzIG5vdCBpbmRpY2F0ZSB0aGUgcG9zc2libGUgbG9zcyBvZiBwcmVjaXNpb24gb2YgZmxvYXRpbmcgcG9pbnQgdmFsdWVzIGR1ZSB0byB0aGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiBmbG9hdGluZyBwb2ludCB2YWx1ZXMgaW4gU09BUC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorQWxsIGV4cGxpY2l0bHkgZGVjbGFyZWQgWFNEIFNjaGVtYSBlbmNvZGVkIHByaW1pdGl2ZSB0eXBlcyBhZGhlcmUgdG8gdGhlIHNhbWUgZGVjb2RpbmcgcnVsZXMuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGRlY2xhcmF0aW9uOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPnVuc2lnbmVkPC9iPiZuYnNwOzxiPmxvbmc8L2I+Jm5ic3A7PGI+bG9uZzwvYj4mbmJzcDt4c2RfX25vbk5lZ2F0aXZlSW50ZWdlcjsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK2VuYWJsZXMgdGhlIGVuY29kaW5nIGFuZCBkZWNvZGluZyBvZiA8dHQ+eHNkOm5vbk5lZ2F0aXZlSW50ZWdlcjwvdHQ+IFhTRCBTY2hlbWEgdHlwZXMgKGFsdGhvdWdoIGRlY29kaW5nIHRha2VzIHBsYWNlIHdpdGggYSBwb3NzaWJsZQ0KK2xvc3Mgb2YgcHJlY2lzaW9uKS4NCitUaGUgZGVjbGFyYXRpb24gYWxzbyBhbGxvd3MgZGVjb2Rpbmcgb2YgPHR0PnhzZDpwb3NpdGl2ZUludGVnZXI8L3R0PiBYU0QgU2NoZW1hIHR5cGVzLCBiZWNhdXNlIG9mIHRoZSBzdG9yYWdlIGFzIGEgPGk+PGI+dW5zaWduZWQ8L2I+Jm5ic3A7PGI+bG9uZzwvYj4mbmJzcDs8Yj5sb25nPC9iPjwvaT4gZGF0YSB0eXBlLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJCSAgICAgIDxoND48YSBuYW1lPSJ0dGhfc0VjMTAuMi40Ij4NCisxMC4yLjQ8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPk11bHRpLVJlZmVyZW5jZSBTdHJpbmdzPC9mb250PjwvaDQ+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0lmIG1vcmUgdGhhbiBvbmUgPGk+PGI+Y2hhcjwvYj48L2k+IHBvaW50ZXIgcG9pbnRzIHRvIHRoZSBzYW1lIHN0cmluZywgdGhlIHN0cmluZyBpcyBlbmNvZGVkIGFzIGEgbXVsdGktcmVmZXJlbmNlIHZhbHVlLg0KK0NvbnNpZGVyIGZvciBleGFtcGxlDQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPmNoYXI8L2I+Jm5ic3A7KnMgPSAiaGVsbG8iLCAqdCA9IHM7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgPGk+czwvaT4gYW5kIDxpPnQ8L2k+IHZhcmlhYmxlcyBhcmUgYXNzaWduZWQgdGhlIHNhbWUgc3RyaW5nLCBhbmQgd2hlbiBzZXJpYWxpemVkLCA8aT50PC9pPiByZWZlcnMgdG8gdGhlIGNvbnRlbnQgb2YgPGk+czwvaT46DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBCMEQwIj48dHI+PHRkPjx0dD4NCismbHQ7c3RyaW5nIGlkPSIxMjMiIHhzaTp0eXBlPSJzdHJpbmciJiM2MjtoZWxsbyZsdDsvc3RyaW5nJiM2MjsgPGJyIC8+DQorLi4uIDxiciAvPg0KKyZsdDtzdHJpbmcgaHJlZj0iIzEyMyIvJiM2MjsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC90dD4NCitUaGUgZXhhbXBsZSBhc3N1bWVkIHRoYXQgPGk+czwvaT4gYW5kIDxpPnQ8L2k+IGFyZSBlbmNvZGVkIGFzIGluZGVwZW5kZW50IGVsZW1lbnRzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitOb3RlOiB0aGUgdXNlIG9mIDxpPjxiPnR5cGVkZWY8L2I+PC9pPiB0byBkZWNsYXJlIGEgc3RyaW5nIHR5cGUgc3VjaCBhcyA8aT54c2RfX3N0cmluZzwvaT4gd2lsbCBub3QgYWZmZWN0IHRoZSBtdWx0aS1yZWZlcmVuY2Ugc3RyaW5nDQorZW5jb2RpbmcuICBIb3dldmVyLCBzdHJpbmdzIGRlY2xhcmVkIHdpdGggZGlmZmVyZW50IDxpPjxiPnR5cGVkZWY8L2I+PC9pPnMgd2lsbCBuZXZlciBiZSBjb25zaWRlcmVkIG11bHRpLXJlZmVyZW5jZSBldmVuIHdoZW4gdGhleSBwb2ludA0KK3RvIHRoZSBzYW1lIHN0cmluZy4gIEZvciBleGFtcGxlDQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnR5cGVkZWY8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqeHNkX19zdHJpbmc7IDxiciAvPg0KKzxiPnR5cGVkZWY8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqeHNkX19hbnlVUkk7IDxiciAvPg0KK3hzZF9fYW55VVJJICpzID0gImh0dHA6Ly93d3cubXlzZXJ2aWNlLmNvbSI7IDxiciAvPg0KK3hzZF9fc3RyaW5nICp0ID0gczsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoZSB2YXJpYWJsZXMgPGk+czwvaT4gYW5kIDxpPnQ8L2k+IHBvaW50IHRvIHRoZSBzYW1lIHN0cmluZywgYnV0IHNpbmNlIHRoZXkgYXJlIGNvbnNpZGVyZWQgZGlmZmVyZW50IHR5cGVzIHRoZWlyIGNvbnRlbnQgd2lsbCBub3QNCitiZSBzaGFyZWQgaW4gdGhlIFNPQVAgcGF5bG9hZCB0aHJvdWdoIGEgbXVsdGktcmVmZXJlbmNlZCBzdHJpbmcuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkJICAgICAgPGg0PjxhIG5hbWU9InR0aF9zRWMxMC4yLjUiPg0KKzEwLjIuNTwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+IlNtYXJ0IFN0cmluZyIgTWl4ZWQtQ29udGVudCBEZWNvZGluZzwvZm9udD48L2g0PjxhIG5hbWU9InNlYzpzbWFydCI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgaW1wbGVtZW50YXRpb24gb2Ygc3RyaW5nIGRlY29kaW5nIGluIGdTT0FQIGFsbG93cyBmb3IgbWl4ZWQgY29udGVudCBkZWNvZGluZy4gSWYgdGhlIFNPQVAgcGF5bG9hZCBjb250YWlucyBhIGNvbXBsZXggZGF0YSB0eXBlIGluIHBsYWNlIG9mDQorYSBzdHJpbmcsIHRoZSBjb21wbGV4IGRhdGEgdHlwZSBpcyBkZWNvZGVkIGluIHRoZSBzdHJpbmcgYXMgcGxhaW4gWE1MIHRleHQuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0ZvciBleGFtcGxlLCBzdXBwb3NlIHRoZSA8aT5nZXRJbmZvPC9pPiByZW1vdGUgbWV0aG9kIHJldHVybnMgc29tZSBkZXRhaWxlZCBpbmZvcm1hdGlvbi4gVGhlIHJlbW90ZSBtZXRob2QgaXMgZGVjbGFyZWQgYXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vIENvbnRlbnRzIG9mIGhlYWRlciBmaWxlICJnZXRJbmZvLmgiOiA8YnIgLz4NCitnZXRJbmZvKDxiPmNoYXI8L2I+Jm5ic3A7KmRldGFpbCk7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgcHJveHkgb2YgdGhlIHJlbW90ZSBtZXRob2QgaXMgdXNlZCBieSBhIGNsaWVudCB0byByZXF1ZXN0IGEgcGllY2Ugb2YgaW5mb3JtYXRpb24gYW5kIHRoZSBzZXJ2aWNlIHJlc3BvbmRzIHdpdGg6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBCMEQwIj48dHI+PHRkPjx0dD4NCitIVFRQLzEuMSAyMDAgT0sgPGJyIC8+DQorQ29udGVudC1UeXBlOiB0ZXh0L3htbCA8YnIgLz4NCitDb250ZW50LUxlbmd0aDogbm5uIDxiciAvPg0KKzxiciAvPg0KKyZsdDtTT0FQLUVOVjpFbnZlbG9wZSB4bWxuczpTT0FQLUVOVj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3htbG5zOlNPQVAtRU5DPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgPGJyIC8+DQorJmx0O1NPQVAtRU5WOkJvZHkmIzYyOyA8YnIgLz4NCismbHQ7Z2V0SW5mb1Jlc3BvbnNlJiM2MjsgPGJyIC8+DQorJmx0O2RldGFpbCYjNjI7IDxiciAvPg0KKyZsdDtwaWN0dXJlJiM2MjtNb25hIExpc2EgYnkgJmx0O2kmIzYyO0xlb25hcmRvIGRhIFZpbmNpJmx0Oy9pJiM2MjsmbHQ7L3BpY3R1cmUmIzYyOyA8YnIgLz4NCismbHQ7L2RldGFpbCYjNjI7IDxiciAvPg0KKyZsdDsvZ2V0SW5mb1Jlc3BvbnNlJiM2MjsgPGJyIC8+DQorJmx0Oy9TT0FQLUVOVjpCb2R5JiM2MjsgPGJyIC8+DQorJmx0Oy9TT0FQLUVOVjpFbnZlbG9wZSYjNjI7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvdHQ+DQorQXMgYSByZXN1bHQgb2YgdGhlIG1peGVkIGNvbnRlbnQgZGVjb2RpbmcsIHRoZSA8aT5kZXRhaWw8L2k+IHN0cmluZyBjb250YWlucyAiPHR0PiZsdDtwaWN0dXJlJiM2MjtNb25hIExpc2EgYnkgJmx0O2kmIzYyO0xlb25hcmRvIGRhIFZpbmNpJmx0Oy9pJiM2MjsmbHQ7L3BpY3R1cmUmIzYyOzwvdHQ+Ii4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCQkgICAgICA8aDQ+PGEgbmFtZT0idHRoX3NFYzEwLjIuNiI+DQorMTAuMi42PC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5TVEwgU3RyaW5nczwvZm9udD48L2g0PjxhIG5hbWU9InNlYzpzdHJpbmdzIj4NCis8L2E+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK2dTT0FQIHN1cHBvcnRzIFNUTCBzdHJpbmdzIDxpPnN0ZDo6c3RyaW5nPC9pPiBhbmQgPGk+c3RkOjp3c3RyaW5nPC9pPi4NCitGb3IgZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDtzdGQ6OnN0cmluZyB4c2RfX3N0cmluZzsgPGJyIC8+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7bnNfX215Q2xhc3MgPGJyIC8+DQoreyA8Yj5wdWJsaWM8L2I+OiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt4c2RfX3N0cmluZyBzOyAvLyBzZXJpYWxpemVkIHdpdGggeHNpOnR5cGU9InhzZDpzdHJpbmciIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3N0ZDo6c3RyaW5nIHQ7IC8vIHNlcmlhbGl6ZWQgd2l0aG91dCB4c2k6dHlwZSA8YnIgLz4NCisuLi4gPGJyIC8+DQorfTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+Q2F1dGlvbjo8L2I+PC9mb250PiBQbGVhc2UgYXZvaWQgbWl4aW5nIDxpPnN0ZDo6c3RyaW5nPC9pPiBhbmQgQyBzdHJpbmdzICg8aT48Yj5jaGFyPC9iPio8L2k+KSBpbiB0aGUgaGVhZGVyIGZpbGUgd2hlbiB1c2luZyBTT0FQIDEuMSBlbmNvZGluZy4gVGhlIHByb2JsZW0gaXMgdGhhdCBtdWx0aS1yZWZlcmVuY2VkIHN0cmluZ3MgaW4gU09BUCBlbmNvZGVkIG1lc3NhZ2VzIGNhbm5vdCBiZSBhc3NpZ25lZCBzaW11bHRhbmVvdXNseSB0byBhIDxpPnN0ZDo6c3RyaW5nPC9pPiBhbmQgYSA8aT48Yj5jaGFyPC9iPio8L2k+IHN0cmluZy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCQkgICAgICA8aDQ+PGEgbmFtZT0idHRoX3NFYzEwLjIuNyI+DQorMTAuMi43PC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5DaGFuZ2luZyB0aGUgRW5jb2RpbmcgUHJlY2lzaW9uIG9mIDxiPmZsb2F0PC9iPiZuYnNwO2FuZCA8Yj5kb3VibGU8L2I+Jm5ic3A7VHlwZXM8L2ZvbnQ+PC9oND4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIDxpPmRvdWJsZTwvaT4gZW5jb2RpbmcgZm9ybWF0IGlzIGJ5IGRlZmF1bHQgc2V0IHRvICI8aT4lLjE4RzwvaT4iIChzZWUgYSBtYW51YWwgb24gPGk+cHJpbnRmPC9pPiB0ZXh0IGZvcm1hdHRpbmcgaW4gQyksDQoraS5lLiZuYnNwO2F0IG1vc3QgMTggZGlnaXRzIG9mIHByZWNpc2lvbiB0byBsaW1pdCBhIGxvc3MgaW4gYWNjdXJhY3kuDQorVGhlIDxpPmZsb2F0PC9pPiBlbmNvZGluZyBmb3JtYXQgaXMgYnkgZGVmYXVsdCAiPGk+JS45RzwvaT4iLCBpLmUuJm5ic3A7YXQgbW9zdCA5IGRpZ2l0cyBvZiBwcmVjaXNpb24uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBlbmNvZGluZyBmb3JtYXQgb2YgYSBkb3VibGUgdHlwZSBjYW4gYmUgc2V0IGJ5IGFzc2lnbmluZyBhIGZvcm1hdCBzdHJpbmcgdG8gPGk+c29hcC5kb3VibGVfZm9ybWF0PC9pPiwgd2hlcmUgPGk+c29hcDwvaT4gaXMgYQ0KK3ZhcmlhYmxlIHRoYXQgY29udGFpbnMgdGhlDQorY3VycmVudCBydW50aW1lIGVudmlyb25tZW50LiBGb3IgZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgc29hcDsgPGJyIC8+DQorc29hcF9pbml0KCZhbXA7c29hcCk7IC8vIHNldHMgZG91YmxlX2Zvcm1hdCA9ICIlLjE4RyIgPGJyIC8+DQorc29hcC5kb3VibGVfZm9ybWF0ID0gIiVlIjsgLy8gcmVkZWZpbmUNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK3doaWNoIGNhdXNlcyBhbGwgZG91YmxlcyB0byBiZSBlbmNvZGVkIGluIHNjaWVudGlmaWMgbm90YXRpb24uDQorTGlrZXdpc2UsIHRoZSBlbmNvZGluZyBmb3JtYXQgb2YgYSBmbG9hdCB0eXBlIGNhbiBiZSBzZXQgYnkgYXNzaWduaW5nIGEgZm9ybWF0IHN0cmluZyB0byB0aGUgc3RhdGljIDxpPnNvYXBfZmxvYXRfZm9ybWF0PC9pPiBzdHJpbmcgdmFyaWFibGUuIEZvciBleGFtcGxlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCBzb2FwOyA8YnIgLz4NCitzb2FwX2luaXQoJmFtcDtzb2FwKTsgLy8gc2V0cyBmbG9hdF9mb3JtYXQgPSAiJS45RyIgPGJyIC8+DQorc29hcC5mbG9hdF9mb3JtYXQgPSAiJS40ZiI7IC8vIHJlZGVmaW5lDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCit3aGljaCBjYXVzZXMgYWxsIGZsb2F0cyB0byBiZSBlbmNvZGVkIHdpdGggZm91ciBkaWdpdHMgcHJlY2lzaW9uLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+Q2F1dGlvbjwvYj48L2ZvbnQ+OiBUaGUgZm9ybWF0IHN0cmluZ3MgYXJlIG5vdCBhdXRvbWF0aWNhbGx5IHJlc2V0IGJlZm9yZSBvciBhZnRlciBTT0FQIGNvbW11bmljYXRpb25zLiBBbiBlcnJvciBpbiB0aGUgZm9ybWF0IHN0cmluZyBtYXkgcmVzdWx0IGluIHRoZSBpbmNvcnJlY3QgZW5jb2Rpbmcgb2YgZmxvYXRpbmcgcG9pbnQgdmFsdWVzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJCSAgICAgIDxoND48YSBuYW1lPSJ0dGhfc0VjMTAuMi44Ij4NCisxMC4yLjg8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPklORiwgLUlORiwgYW5kIE5hTiBWYWx1ZXMgb2YgPGI+ZmxvYXQ8L2I+Jm5ic3A7YW5kIDxiPmRvdWJsZTwvYj4mbmJzcDtUeXBlczwvZm9udD48L2g0Pg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgZ1NPQVAgcnVudGltZSA8aT5zdGRzb2FwMi5jcHA8L2k+IGFuZCBoZWFkZXIgZmlsZSA8aT5zdGRzb2FwMi5oPC9pPiBzdXBwb3J0IHRoZSBtYXJzaGFsbGluZyBvZiBJRUVFIElORiwgLUlORiwgYW5kIE5hTg0KK3JlcHJlc2VudGF0aW9ucy4gIFVuZGVyIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcyB0aGlzIG1heSBicmVhayBpZiB0aGUgaGFyZHdhcmUgYW5kL29yIEMvQysrIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgdGhlc2UNCityZXByZXNlbnRhdGlvbnMuDQorVG8gcmVtb3ZlIHRoZSByZXByZXNlbnRhdGlvbnMsIHJlbW92ZSB0aGUgaW5jbHVzaW9uIG9mIHRoZSA8aT4gJmx0OyBtYXRoLmggJmd0OyA8L2k+IGhlYWRlciBmaWxlIGZyb20gdGhlIDxpPnN0ZHNvYXAyLmg8L2k+IGZpbGUuDQorWW91IGNhbiBjb250cm9sIHRoZSByZXByZXNlbnRhdGlvbnMgYXMgd2VsbCwgd2hpY2ggYXJlIGRlZmluZWQgYnkgdGhlIG1hY3JvczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorI2RlZmluZSBGTFRfTkFOIDxiciAvPg0KKyNkZWZpbmUgRkxUX1BJTkZUWSA8YnIgLz4NCisjZGVmaW5lIEZMVF9OSU5GVFkgPGJyIC8+DQorI2RlZmluZSBEQkxfTkFOIDxiciAvPg0KKyNkZWZpbmUgREJMX1BJTkZUWSA8YnIgLz4NCisjZGVmaW5lIERCTF9OSU5GVFkNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJICAgICA8aDM+PGEgbmFtZT0idHRoX3NFYzEwLjMiPg0KKzEwLjM8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPkVudW1lcmF0aW9uIFNlcmlhbGl6YXRpb248L2ZvbnQ+PC9oMz48YSBuYW1lPSJzZWM6ZW51bSI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitFbnVtZXJhdGlvbnMgYXJlIGdlbmVyYWxseSB1c2VmdWwgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiBuYW1lZCBpbnRlZ2VyLXZhbHVlZCBjb25zdGFudHMsIGFsc28gY2FsbGVkIGVudW1lcmF0aW9uIGNvbnN0YW50cy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCQkgICAgICA8aDQ+PGEgbmFtZT0idHRoX3NFYzEwLjMuMSI+DQorMTAuMy4xPC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5TZXJpYWxpemF0aW9uIG9mIFN5bWJvbGljIEVudW1lcmF0aW9uIENvbnN0YW50czwvZm9udD48L2g0Pg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgZ1NPQVAgc3R1YiBhbmQgc2tlbGV0b24gY29tcGlsZXIgZW5jb2RlcyB0aGUgY29uc3RhbnRzIG9mIGVudW1lcmF0aW9uLXR5cGVkIHZhcmlhYmxlcyBpbiBzeW1ib2xpYyBmb3JtIHVzaW5nIHRoZSBuYW1lcyBvZiB0aGUgY29uc3RhbnRzIHdoZW4gcG9zc2libGUgdG8gY29tcGx5IHRvIFNPQVAncyBlbnVtZXJhdGlvbiBlbmNvZGluZyBzdHlsZS4gQ29uc2lkZXIgZm9yIGV4YW1wbGUgdGhlIGZvbGxvd2luZyBlbnVtZXJhdGlvbiBvZiB3ZWVrZGF5czoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+ZW51bTwvYj4mbmJzcDt3ZWVrZGF5IHtNb24sIFR1ZSwgV2VkLCBUaHUsIEZyaSwgU2F0LCBTdW59Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIGVudW1lcmF0aW9uLWNvbnN0YW50IDxpPk1vbjwvaT4sIGZvciBleGFtcGxlLCBpcyBlbmNvZGVkIGFzDQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBCMEQwIj48dHI+PHRkPjx0dD4NCismbHQ7d2Vla2RheSB4c2k6dHlwZT0id2Vla2RheSImIzYyO01vbiZsdDsvd2Vla2RheSYjNjI7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvdHQ+DQorVGhlIHZhbHVlIG9mIHRoZSA8dHQ+eHNpOnR5cGU8L3R0PiBhdHRyaWJ1dGUgaXMgdGhlIGVudW1lcmF0aW9uLXR5cGUgaWRlbnRpZmllcidzIG5hbWUuIElmIHRoZSBlbGVtZW50IGlzIGluZGVwZW5kZW50IGFzIGluIHRoZSBleGFtcGxlIGFib3ZlLCB0aGUgZWxlbWVudCBuYW1lIGlzIHRoZSBlbnVtZXJhdGlvbi10eXBlIGlkZW50aWZpZXIncyBuYW1lLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgZW5jb2Rpbmcgb2YgY29tcGxleCB0eXBlcyBzdWNoIGFzIGVudW1lcmF0aW9ucyByZXF1aXJlcyBhIHJlZmVyZW5jZSB0byBhbiBYTUwgU2NoZW1hIHRocm91Z2ggdGhlIHVzZSBvZiBhIG5hbWVzcGFjZSBwcmVmaXguIFRoZSBuYW1lc3BhY2UgcHJlZml4IGNhbiBiZSBzcGVjaWZpZWQgYXMgcGFydCBvZiB0aGUgZW51bWVyYXRpb24tdHlwZSBpZGVudGlmaWVyJ3MgbmFtZSwgd2l0aCB0aGUgdXN1YWwgbmFtZXNwYWNlIHByZWZpeCBjb252ZW50aW9ucyBmb3IgaWRlbnRpZmllcnMuIFRoaXMgY2FuIGJlIHVzZWQgdG8gZXhwbGljaXRseSBzcGVjaWZ5IHRoZSBlbmNvZGluZyBzdHlsZS4gRm9yIGV4YW1wbGU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPmVudW08L2I+Jm5ic3A7bnMxX193ZWVrZGF5IHtNb24sIFR1ZSwgV2VkLCBUaHUsIEZyaSwgU2F0LCBTdW59Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIGVudW1lcmF0aW9uLWNvbnN0YW50IDxpPlNhdDwvaT4sIGZvciBleGFtcGxlLCBpcyBlbmNvZGVkIGFzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwQjBEMCI+PHRyPjx0ZD48dHQ+DQorJmx0O25zMTp3ZWVrZGF5IHhzaTp0eXBlPSJuczE6d2Vla2RheSImIzYyO1NhdCZsdDsvbnMxOndlZWtkYXkmIzYyOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3R0Pg0KK1RoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgZm9yIHRoaXMgZW51bWVyYXRpb24gZGF0YSB0eXBlIHdvdWxkIGJlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwQjBEMCI+PHRyPjx0ZD48dHQ+DQorJmx0O3hzZDplbGVtZW50IG5hbWU9IndlZWtkYXkiIHR5cGU9InRuczp3ZWVrZGF5Ii8mIzYyOyA8YnIgLz4NCismbHQ7eHNkOnNpbXBsZVR5cGUgbmFtZT0id2Vla2RheSImIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbHQ7eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3hzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9uIi8mIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUdWUiLyYjNjI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDt4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlZCIvJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3hzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGh1Ii8mIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmkiLyYjNjI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDt4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdCIvJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3hzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VuIi8mIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbHQ7L3hzZDpyZXN0cmljdGlvbiYjNjI7IDxiciAvPg0KKyZsdDsveHNkOnNpbXBsZVR5cGUmIzYyOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3R0Pg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJCSAgICAgIDxoND48YSBuYW1lPSJ0dGhfc0VjMTAuMy4yIj4NCisxMC4zLjI8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPkVuY29kaW5nIG9mIEVudW1lcmF0aW9uIENvbnN0YW50czwvZm9udD48L2g0Pg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitJZiB0aGUgdmFsdWUgb2YgYW4gZW51bWVyYXRpb24tdHlwZWQgdmFyaWFibGUgaGFzIG5vIGNvcnJlc3BvbmRpbmcgbmFtZWQgY29uc3RhbnQsIHRoZSB2YWx1ZSBpcyBlbmNvZGVkIGFzIGEgc2lnbmVkIGludGVnZXIgbGl0ZXJhbC4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgZGVjbGFyYXRpb24gb2YgYSA8aT53b3JrZGF5PC9pPiBlbnVtZXJhdGlvbiB0eXBlIGxhY2tzIG5hbWVkIGNvbnN0YW50cyBmb3IgU2F0dXJkYXkgYW5kIFN1bmRheToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+ZW51bTwvYj4mbmJzcDtuczFfX3dvcmtkYXkge01vbiwgVHVlLCBXZWQsIFRodSwgRnJpfTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK0lmIHRoZSBjb25zdGFudCA8aT41PC9pPiAoU2F0dXJkYXkpIG9yIDxpPjY8L2k+IChTdW5kYXkpIGlzIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdGhlIDxpPndvcmtkYXk8L2k+IGVudW1lcmF0aW9uIHR5cGUsIHRoZSB2YXJpYWJsZSB3aWxsIGJlIGVuY29kZWQgd2l0aCB0aGUgaW50ZWdlciBsaXRlcmFscyA8dHQ+NTwvdHQ+IGFuZCA8dHQ+NjwvdHQ+LCByZXNwZWN0aXZlbHkuIEZvciBleGFtcGxlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwQjBEMCI+PHRyPjx0ZD48dHQ+DQorJmx0O25zMTp3b3JrZGF5IHhzaTp0eXBlPSJuczE6d29ya2RheSImIzYyOzUmbHQ7L25zMTp3b3JrZGF5JiM2MjsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC90dD4NCitTaW5jZSB0aGlzIGlzIGxlZ2FsIGluIEMrKyBhbmQgU09BUCBhbGxvd3MgZW51bWVyYXRpb24gY29uc3RhbnRzIHRvIGJlIGludGVnZXIgbGl0ZXJhbHMsIHRoaXMgbWV0aG9kIGVuc3VyZXMgdGhhdCBub24tc3ltYm9saWMNCitlbnVtZXJhdGlvbiBjb25zdGFudHMgYXJlIGNvcnJlY3RseSBjb21tdW5pY2F0ZWQgdG8gYW5vdGhlciBwYXJ0eSBpZiB0aGUgb3RoZXIgcGFydHkgYWNjZXB0cyBsaXRlcmFsIGVudW1lcmF0aW9uIGNvbnN0YW50cyAoYXMNCit3aXRoIHRoZSBnU09BUCBzdHViIGFuZCBza2VsZXRvbiBjb21waWxlcikuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0JvdGggc3ltYm9saWMgYW5kIGxpdGVyYWwgZW51bWVyYXRpb24gY29uc3RhbnRzIGNhbiBiZSBkZWNvZGVkLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUbyBlbmZvcmNlIHRoZSBsaXRlcmFsIGVudW1lcmF0aW9uIGNvbnN0YW50IGVuY29kaW5nIGFuZCB0byBnZXQgdGhlIGxpdGVyYWwgY29uc3RhbnRzIGluIHRoZSBXU0RMIGZpbGUsIHVzZSB0aGUgZm9sbG93aW5nIHRyaWNrOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5lbnVtPC9iPiZuYnNwO25zMV9fbnVtcyB7IF8xID0gMSwgXzIgPSAyLCBfMyA9IDMgfTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoZSBkaWZmZXJlbmNlIHdpdGggYW4gZW51bWVyYXRpb24gdHlwZSB3aXRob3V0IGEgbGlzdCBvZiB2YWx1ZXMgYW5kIHRoZSBlbnVtZXJhdGlvbiB0eXBlIGFib3ZlIGlzIHRoYXQgdGhlIGVudW1lcmF0aW9uIGNvbnN0YW50cw0KK3dpbGwgYXBwZWFyIGluIHRoZSBXU0RMIHNlcnZpY2UgZGVzY3JpcHRpb24uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkJICAgICAgPGg0PjxhIG5hbWU9InR0aF9zRWMxMC4zLjMiPg0KKzEwLjMuMzwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+SW5pdGlhbGl6ZWQgRW51bWVyYXRpb24gQ29uc3RhbnRzPC9mb250PjwvaDQ+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBnU09BUCBjb21waWxlciBzdXBwb3J0cyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgZW51bWVyYXRpb24gY29uc3RhbnRzLCBhcyBpbjoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+ZW51bTwvYj4mbmJzcDtuczFfX3JlbGF0aW9uIHtMRVNTID0gLTEsIEVRVUFMID0gMCwgR1JFQVRFUiA9IDF9Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIHN5bWJvbGljIG5hbWVzIDx0dD5MRVNTPC90dD4sIDx0dD5FUVVBTDwvdHQ+LCBhbmQgPHR0PkdSRUFURVI8L3R0PiB3aWxsIGFwcGVhciBpbiB0aGUgU09BUCBwYXlsb2FkIGZvciB0aGUgZW5jb2Rpbmcgb2YgdGhlIDxpPm5zMV9fcmVsYXRpb248L2k+IGVudW1lcmF0aW9uIHZhbHVlcyA8aT4tMTwvaT4sIDxpPjA8L2k+LCBhbmQgPGk+MTwvaT4sIHJlc3BlY3RpdmVseS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCQkgICAgICA8aDQ+PGEgbmFtZT0idHRoX3NFYzEwLjMuNCI+DQorMTAuMy40PC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5Ib3cgdG8gIlJldXNlIiBTeW1ib2xpYyBFbnVtZXJhdGlvbiBDb25zdGFudHM8L2ZvbnQ+PC9oND4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorQSB3ZWxsLWtub3duIGRlZmljaWVuY3kgb2YgQyBhbmQgQysrIGVudW1lcmF0aW9uIHR5cGVzIGlzIHRoZSBsYWNrIG9mIHN1cHBvcnQgZm9yIHRoZSByZXVzZSBvZiBzeW1ib2xpYyBuYW1lcyBieSBtdWx0aXBsZSBlbnVtZXJhdGlvbnMuIFRoYXQgaXMsIHRoZSBuYW1lcyBvZiBhbGwgdGhlIHN5bWJvbGljIGNvbnN0YW50cyBkZWZpbmVkIGJ5IGFuIGVudW1lcmF0aW9uIGNhbm5vdCBiZSByZXVzZWQgYnkgYW5vdGhlciBlbnVtZXJhdGlvbi4gVG8gZm9yY2UgZW5jb2Rpbmcgb2YgdGhlIHNhbWUgc3ltYm9saWMgbmFtZSBieSBkaWZmZXJlbnQgZW51bWVyYXRpb25zLCB0aGUgaWRlbnRpZmllciBvZiB0aGUgc3ltYm9saWMgbmFtZSBjYW4gZW5kIGluIGFuIHVuZGVyc2NvcmUgKDxpPl88L2k+KSBvciBhbnkgbnVtYmVyIG9mIHVuZGVyc2NvcmVzIHRvIGRpc3Rpbmd1aXNoIGl0IGZyb20gb3RoZXIgc3ltYm9saWMgbmFtZXMgaW4gQysrLiBUaGlzIGd1YXJhbnRlZXMgdGhhdCB0aGUgU09BUCBlbmNvZGluZyB3aWxsIHVzZSB0aGUgc2FtZSBuYW1lLCB3aGlsZSB0aGUgc3ltYm9saWMgbmFtZXMgY2FuIGJlIGRpc3Rpbmd1aXNoZWQgaW4gQysrLiBFZmZlY3RpdmVseSwgdGhlIHVuZGVyc2NvcmVzIGFyZSByZW1vdmVkIGZyb20gYSBzeW1ib2xpYyBuYW1lIHByaW9yIHRvIGVuY29kaW5nLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitDb25zaWRlciBmb3IgZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+ZW51bTwvYj4mbmJzcDtuczFfX3dvcmtkYXkge01vbiwgVHVlLCBXZWQsIFRodSwgRnJpfTsgPGJyIC8+DQorPGI+ZW51bTwvYj4mbmJzcDtuczFfX3dlZWtkYXkge01vbl8sIFR1ZV8sIFdlZF8sIFRodV8sIEZyaV8sIFNhdF8sIFN1bl99Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQord2hpY2ggd2lsbCByZXN1bHQgaW4gdGhlIGVuY29kaW5nIG9mIHRoZSBjb25zdGFudHMgb2YgPGk+ZW51bSBuczFfX3dlZWtkYXk8L2k+IHdpdGhvdXQgdGhlIHVuZGVyc2NvcmUsIGZvciBleGFtcGxlIGFzIDx0dD5Nb248L3R0Pi4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorPGZvbnQgY29sb3I9IiNGRjAwMDAiPjxiPkNhdXRpb248L2I+PC9mb250PjogVGhlIGZvbGxvd2luZyBkZWNsYXJhdGlvbjoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+ZW51bTwvYj4mbmJzcDtuczFfX3dvcmtkYXkge01vbiwgVHVlLCBXZWQsIFRodSwgRnJpfTsgPGJyIC8+DQorPGI+ZW51bTwvYj4mbmJzcDtuczFfX3dlZWtkYXkge1NhdCA9IDUsIFN1biA9IDZ9Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQord2lsbCBub3QgcHJvcGVybHkgZW5jb2RlIHRoZSA8aT53ZWVrZGF5PC9pPiBlbnVtZXJhdGlvbiwgYmVjYXVzZSBpdCBsYWNrcyB0aGUgbmFtZWQgY29uc3RhbnRzIGZvciA8aT53b3JrZGF5PC9pPiBpbiBpdHMgZW51bWVyYXRpb24gbGlzdC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCQkgICAgICA8aDQ+PGEgbmFtZT0idHRoX3NFYzEwLjMuNSI+DQorMTAuMy41PC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5Cb29sZWFuIEVudW1lcmF0aW9uIFNlcmlhbGl6YXRpb24gZm9yIEM8L2ZvbnQ+PC9oND48YSBuYW1lPSJzZWM6Ym9vbGVhbiI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitXaGVuIGRldmVsb3BpbmcgYSBDIFdlYiBzZXJ2aWNlIGFwcGxpY2F0aW9uLCB0aGUgQysrIDxpPmJvb2w8L2k+IHR5cGUgc2hvdWxkIG5vdCBiZSB1c2VkIHNpbmNlIGl0IGlzIG5vdCB1c3VhbGx5IHN1cHBvcnRlZCBieSB0aGUgQyBjb21waWxlci4NCitJbnN0ZWFkLCBhbiBlbnVtZXJhdGlvbiB0eXBlIHNob3VsZCBiZSB1c2VkIHRvIHNlcmlhbGl6ZSB0cnVlL2ZhbHNlIHZhbHVlcyBhcyA8dHQ+eHNkOmJvb2xlYW48L3R0PiBTY2hlbWEgdHlwZSBlbnVtZXJhdGlvbiB2YWx1ZXMuDQorVGhlIDx0dD54c2Q6Ym9vbGVhbjwvdHQ+IFhNTCBTY2hlbWEgdHlwZSBpcyBkZWZpbmVkIGFzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5lbnVtPC9iPiZuYnNwO3hzZF9fYm9vbGVhbiB7ZmFsc2VfLCB0cnVlX307DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgdmFsdWUgPGk+ZmFsc2VfPC9pPiwgZm9yIGV4YW1wbGUsIGlzIGVuY29kZWQgYXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBCMEQwIj48dHI+PHRkPjx0dD4NCismbHQ7eHNkOmJvb2xlYW4geHNpOnR5cGU9InhzZDpib29sZWFuIiYjNjI7ZmFsc2UmbHQ7L3hzZDpib29sZWFuJiM2MjsgPGJyIC8+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvdHQ+DQorUGVjdWxpYXIgb2YgdGhlIFNPQVAgYm9vbGVhbiB0eXBlIGVuY29kaW5nIGlzIHRoYXQgaXQgb25seSBkZWZpbmVzIHRoZSB2YWx1ZXMgPHR0PjA8L3R0PiBhbmQgPHR0PjE8L3R0Piwgd2hpbGUgdGhlIGJ1aWx0LWluIFhNTCBTY2hlbWEgYm9vbGVhbiB0eXBlIGFsc28gZGVmaW5lcyB0aGUgPHR0PmZhbHNlPC90dD4gYW5kIDx0dD50cnVlPC90dD4gc3ltYm9saWMgY29uc3RhbnRzIGFzIHZhbGlkIHZhbHVlcy4gVGhlIGZvbGxvd2luZyBleGFtcGxlIGRlY2xhcmF0aW9uIG9mIGFuIGVudW1lcmF0aW9uIHR5cGUgbGFja3MgbmFtZWQgY29uc3RhbnRzIGFsdG9nZXRoZXIgdG8gZm9yY2UgZW5jb2Rpbmcgb2YgdGhlIGVudW1lcmF0aW9uIHZhbHVlcyBhcyBsaXRlcmFsIGNvbnN0YW50czoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+ZW51bTwvYj4mbmJzcDtTT0FQX0VOQ19fYm9vbGVhbiB7fTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoZSB2YWx1ZSA8aT4wPC9pPiwgZm9yIGV4YW1wbGUsIGlzIGVuY29kZWQgd2l0aCBhbiBpbnRlZ2VyIGxpdGVyYWw6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBCMEQwIj48dHI+PHRkPjx0dD4NCismbHQ7U09BUC1FTkM6Ym9vbGVhbiB4c2k6dHlwZT0iU09BUC1FTkM6Ym9vbGVhbiImIzYyOzAmbHQ7U09BUC1FTkM6Ym9vbGVhbiYjNjI7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvdHQ+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkJICAgICAgPGg0PjxhIG5hbWU9InR0aF9zRWMxMC4zLjYiPg0KKzEwLjMuNjwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+Qml0bWFzayBFbnVtZXJhdGlvbiBTZXJpYWxpemF0aW9uPC9mb250PjwvaDQ+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0EgYml0bWFzayBpcyBhbiBlbnVtZXJhdGlvbiBvZiBmbGFncyBzdWNoIGFzIGRlY2xhcmVkIHdpdGggQyMncyBbRmxhZ3NdIDxpPjxiPmVudW08L2I+PC9pPiBhbm5vdGF0aW9uLg0KK2dTT0FQIHN1cHBvcnRzIGJpdG1hc2sgZW5jb2RpbmcgYW5kIGRlY29kaW5nIGZvciBpbnRlcm9wZXJhYmlsaXR5LiBIb3dldmVyLCBiaXRtYXNrIHR5cGVzIGFyZSBub3Qgc3RhbmRhcmRpemVkIHdpdGggU09BUCBSUEMuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0Egc3BlY2lhbCBzeW50YWN0aWMgY29udmVudGlvbiBpcyB1c2VkIGluIHRoZSBoZWFkZXIgZmlsZSBpbnB1dCB0byB0aGUgZ1NPQVAgY29tcGlsZXIgdG8gaW5kaWNhdGUgdGhlIHVzZSBvZiBiaXRtYXNrcyB3aXRoIGFuDQorYXN0ZXJpc2s6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPmVudW08L2I+Jm5ic3A7KiA8aT5uYW1lPC9pPiB7IDxpPmVudW0tY29uc3RhbnQ8L2k+LCA8aT5lbnVtLWNvbnN0YW50PC9pPiwgLi4uIH07DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgZ1NPQVAgY29tcGlsZXIgd2lsbCBlbmNvZGUgdGhlIGVudW1lcmF0aW9uIGNvbnN0YW50cyBhcyBmbGFncywgaS5lLiBhcyBhIHNlcmllcyBvZiBwb3dlcnMgb2YgMiBzdGFydGluZyB3aXRoIDEuDQorVGhlIGVudW1lcmF0aW9uIGNvbnN0YW50cyBjYW4gYmUgb3ItZWQgdG8gZm9ybSBhIGJpdHZlY3RvciAoYml0bWFzaykgd2hpY2ggaXMgZW5jb2RlZCBhbmQgZGVjb2RlZCBhcyBhIGxpc3Qgb2Ygc3ltYm9saWMgdmFsdWVzDQoraW4gU09BUC4NCitGb3IgZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+ZW51bTwvYj4mbmJzcDsqIG5zX19tYWNoaW5lU3RhdHVzIHsgT04sIEJFTFQsIFZBTFZFLCBIQVRDSH07IDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDtuc19fZ2V0TWFjaGluZVN0YXR1cyg8Yj5jaGFyPC9iPiZuYnNwOypuYW1lLCA8Yj5jaGFyPC9iPiZuYnNwOyo8Yj5lbnVtPC9iPiZuYnNwO25zX19tYWNoaW5lU3RhdHVzIHJlc3VsdCk7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitOb3RlIHRoYXQgdGhlIHVzZSBvZiB0aGUgPGk+PGI+ZW51bTwvYj48L2k+IGRvZXMgbm90IHJlcXVpcmUgdGhlIGFzdGVyaXNrLCBvbmx5IHRoZSBkZWZpbml0aW9uLg0KK1RoZSBnU09BUCBjb21waWxlciBnZW5lcmF0ZXMgdGhlIGVudW1lcmF0aW9uOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5lbnVtPC9iPiZuYnNwO25zX19tYWNoaW5lU3RhdHVzIHsgT049MSwgQkVMVD0yLCBWQUxWRT00LCBIQVRDSD04fTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK0EgcmVtb3RlIG1ldGhvZCBpbXBsZW1lbnRhdGlvbiBpbiBhIFdlYiBzZXJ2aWNlIGNhbiByZXR1cm46DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPmludDwvYj4mbmJzcDtuc19fZ2V0TWFjaGluZVN0YXR1cyg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgPGI+Y2hhcjwvYj4mbmJzcDsqbmFtZSwgPGI+ZW51bTwvYj4mbmJzcDtuc19fbWFjaGluZVN0YXR1cyByZXN1bHQpIDxiciAvPg0KK3sgLi4uIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOypyZXN1bHQgPSBCRUxUICAtICBIQVRDSDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cmV0dXJuPC9iPiZuYnNwO1NPQVBfT0s7IDxiciAvPg0KK30NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJICAgICA8aDM+PGEgbmFtZT0idHRoX3NFYzEwLjQiPg0KKzEwLjQ8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPlN0cnVjdCBTZXJpYWxpemF0aW9uPC9mb250PjwvaDM+PGEgbmFtZT0ic2VjOnN0cnVjdCI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitBIDxpPjxiPnN0cnVjdDwvYj48L2k+IGRhdGEgdHlwZSBpcyBlbmNvZGVkIGFzIGFuIFhNTCBTY2hlbWEgY29tcGxleFR5cGUgKFNPQVAtZW5jb2RlZCBjb21wb3VuZCBkYXRhIHR5cGUpIHN1Y2ggdGhhdCB0aGUNCis8aT48Yj5zdHJ1Y3Q8L2I+PC9pPiBuYW1lIGZvcm1zIHRoZSBkYXRhIHR5cGUncyBlbGVtZW50IG5hbWUgYW5kIHNjaGVtYSB0eXBlIGFuZCB0aGUNCitmaWVsZHMgb2YgdGhlIDxpPjxiPnN0cnVjdDwvYj48L2k+IGFyZSB0aGUgZGF0YSB0eXBlJ3MgYWNjZXNzb3JzLiBUaGlzIGVuY29kaW5nIGlzDQoraWRlbnRpY2FsIHRvIHRoZSA8aT48Yj5jbGFzczwvYj48L2k+IGluc3RhbmNlIGVuY29kaW5nIHdpdGhvdXQgaW5oZXJpdGFuY2UgYW5kIG1ldGhvZA0KK2RlY2xhcmF0aW9ucywgc2VlIFNlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOmNsYXNzIj4xMC41PC9hPiBmb3IgZnVydGhlciBkZXRhaWxzLiAgSG93ZXZlciwgdGhlDQorZW5jb2RpbmcgYW5kIGRlY29kaW5nIG9mIDxpPjxiPnN0cnVjdDwvYj48L2k+cyBpcyBtb3JlIGVmZmljaWVudCBjb21wYXJlZCB0bw0KKzxpPjxiPmNsYXNzPC9iPjwvaT4gaW5zdGFuY2VzIGR1ZSB0byB0aGUgbGFjayBvZiBpbmhlcml0YW5jZSBhbmQgdGhlIHJlcXVpcmVtZW50IGJ5DQordGhlIHNlcmlhbGl6YXRpb24gcm91dGluZXMgdG8gY2hlY2sgaW5oZXJpdGFuY2UgcHJvcGVydGllcyBhdCBydW4gdGltZS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorQ2VydGFpbiB0eXBlIG9mIGZpZWxkcyBvZiBhIDxpPjxiPnN0cnVjdDwvYj48L2k+IGNhbiBiZSAoZGUpc2VyaWFsaXplZCBhcyBYTUwgYXR0cmlidXRlcy4NCitTZWUmbmJzcDs8YSBocmVmPSIjc2VjOmF0dHJpYnV0ZXMiPjEwLjUuNzwvYT4gZm9yIG1vcmUgZGV0YWlscy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCSAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWMxMC41Ij4NCisxMC41PC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5DbGFzcyBJbnN0YW5jZSBTZXJpYWxpemF0aW9uPC9mb250PjwvaDM+PGEgbmFtZT0ic2VjOmNsYXNzIj4NCis8L2E+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0EgPGk+PGI+Y2xhc3M8L2I+PC9pPiBpbnN0YW5jZSBpcyBzZXJpYWxpemVkIGFzIGFuIFhNTCBTY2hlbWEgY29tcGxleFR5cGUgKFNPQVAtZW5jb2RlZCBjb21wb3VuZCBkYXRhIHR5cGUpIHN1Y2ggdGhhdCB0aGUNCis8aT48Yj5jbGFzczwvYj48L2k+IG5hbWUgZm9ybXMgdGhlIGRhdGEgdHlwZSdzIGVsZW1lbnQgbmFtZSBhbmQgc2NoZW1hIHR5cGUgYW5kIHRoZQ0KK2RhdGEgbWVtYmVyIGZpZWxkcyBhcmUgdGhlIGRhdGEgdHlwZSdzIGFjY2Vzc29ycy4gT25seSB0aGUgZGF0YSBtZW1iZXIgZmllbGRzDQorYXJlIGVuY29kZWQgaW4gdGhlIFNPQVAgcGF5bG9hZC4gQ2xhc3MgbWV0aG9kcyBhcmUgbm90IGVuY29kZWQuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBnZW5lcmFsIGZvcm0gb2YgYSA8aT48Yj5jbGFzczwvYj48L2k+IGRlY2xhcmF0aW9uIGlzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5jbGFzczwvYj4mbmJzcDs8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD5uYW1lc3BhY2VfcHJlZml4X188Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD5jbGFzc19uYW1lMSA8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD46PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+PGI+cHVibGljPC9iPjo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD4gPGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+PGI+cHJpdmF0ZTwvYj46PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+IDxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PjxiPnByb3RlY3RlZDwvYj46PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+IDxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250Pm5hbWVzcGFjZV9wcmVmaXhfXzxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PmNsYXNzX25hbWUyPGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+IDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+PGI+cHVibGljPC9iPjo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD4gPGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+PGI+cHJpdmF0ZTwvYj46PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+IDxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PjxiPnByb3RlY3RlZDwvYj46PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO2ZpZWxkMTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7ZmllbGQyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsuLi4gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+PGI+cHVibGljPC9iPjo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD4gPGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+PGI+cHJpdmF0ZTwvYj46PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+IDxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PjxiPnByb3RlY3RlZDwvYj46PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO21ldGhvZDE7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO21ldGhvZDI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOy4uLiA8YnIgLz4NCit9OyA8YnIgLz4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK3doZXJlDQorDQorPGRsIGNvbXBhY3Q9ImNvbXBhY3QiPg0KKyA8ZHQ+PGI+PHNwYW4gY2xhc3M9InJvbWFuIj48aT5uYW1lc3BhY2VfcHJlZml4X188L2k+PC9iPjwvZHQ+DQorCTxkZD4gaXMgdGhlIG9wdGlvbmFsIG5hbWVzcGFjZSBwcmVmaXggb2YgdGhlIGNvbXBvdW5kIGRhdGEgdHlwZSAoc2VlIGlkZW50aWZpZXIgdHJhbnNsYXRpb24gcnVsZXMmbmJzcDs8YSBocmVmPSIjc2VjOmlkdHJhbnMiPjkuMzwvYT4pPC9zcGFuPjwvZGQ+DQorIDxkdD48Yj48c3BhbiBjbGFzcz0icm9tYW4iPjxpPmNsYXNzX25hbWUxPC9pPjwvYj48L2R0Pg0KKwk8ZGQ+CSBpcyB0aGUgZWxlbWVudCBuYW1lIG9mIHRoZSBjb21wb3VuZCBkYXRhIHR5cGUgKHNlZSBpZGVudGlmaWVyIHRyYW5zbGF0aW9uIHJ1bGVzJm5ic3A7PGEgaHJlZj0iI3NlYzppZHRyYW5zIj45LjM8L2E+KS48L3NwYW4+PC9kZD4NCisgPGR0PjxiPjxzcGFuIGNsYXNzPSJyb21hbiI+PGk+Y2xhc3NfbmFtZTI8L2k+PC9iPjwvZHQ+DQorCTxkZD4JIGlzIGFuIG9wdGlvbmFsIGJhc2UgY2xhc3MuPC9zcGFuPjwvZGQ+DQorIDxkdD48Yj48c3BhbiBjbGFzcz0icm9tYW4iPjxpPmZpZWxkPC9pPjwvYj48L2R0Pg0KKwk8ZGQ+CSBpcyBhIGZpZWxkIGRlY2xhcmF0aW9uIChkYXRhIG1lbWJlcikuIEEgZmllbGQgTUFZIGJlIGRlY2xhcmVkIDxpPjxiPnN0YXRpYzwvYj48L2k+IGFuZCA8aT48Yj5jb25zdDwvYj48L2k+IGFuZCBNQVkgYmUgaW5pdGlhbGl6ZWQuPC9zcGFuPjwvZGQ+DQorIDxkdD48Yj48c3BhbiBjbGFzcz0icm9tYW4iPjxpPm1ldGhvZDwvaT48L2I+PC9kdD4NCisJPGRkPiBpcyBhIG1ldGhvZCBkZWNsYXJhdGlvbi4gQSBtZXRob2QgTUFZIGJlIGRlY2xhcmVkIDxpPjxiPnZpcnR1YWw8L2I+PC9pPiwgYnV0IGFic3RyYWN0IG1ldGhvZHMgYXJlIG5vdCBhbGxvd2VkLiBUaGUgbWV0aG9kIHBhcmFtZXRlciBkZWNsYXJhdGlvbnMgYXJlIFJFUVVJUkVEIHRvIGhhdmUgcGFyYW1ldGVyIGlkZW50aWZpZXIgbmFtZXMuPC9zcGFuPjwvZGQ+DQorIDxkdD48Yj48Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD48Yj5wdWJsaWM8L2I+Ojxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PiA8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD48Yj5wcml2YXRlPC9iPjo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD4gPGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+PGI+cHJvdGVjdGVkPC9iPjo8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD48L2I+PC9kdD4NCisJPGRkPiBhcmUgT1BUSU9OQUwuIE9ubHkgbWVtYmVycyB3aXRoIDxpPjxiPnB1YmxpYzwvYj48L2k+IGFjY2VzIHBlcm1pc3Npb24gY2FuIGJlIHNlcmlhbGl6ZWQuPC9kZD4NCis8L2RsPg0KK0EgY2xhc3MgbmFtZSBpcyBSRVFVSVJFRCB0byBiZSB1bmlxdWUgYW5kIGNhbm5vdCBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgYQ0KKzxpPjxiPnN0cnVjdDwvYj48L2k+LCA8aT48Yj5lbnVtPC9iPjwvaT4sIG9yIHJlbW90ZSBtZXRob2QgbmFtZSBzcGVjaWZpZWQgaW4gdGhlIGhlYWRlciBmaWxlDQoraW5wdXQgdG8gdGhlIGdTT0FQIGNvbXBpbGVyLiAgVGhlIHJlYXNvbiBpcyB0aGF0IHJlbW90ZSBtZXRob2QgcmVxdWVzdHMgYXJlDQorZW5jb2RlZCBzaW1pbGFybHkgdG8gY2xhc3MgaW5zdGFuY2VzIGluIFNPQVAgYW5kIHRoZXkgYXJlIGluIHByaW5jaXBsZQ0KK3VuZGlzdGluZ3Vpc2hhYmxlICh0aGUgbWV0aG9kIHBhcmFtZXRlcnMgYXJlIGVuY29kZWQganVzdCBhcyB0aGUgZmllbGRzIG9mIGENCis8aT48Yj5jbGFzczwvYj48L2k+KS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorT25seSBzaW5nbGUgaW5oZXJpdGFuY2UgaXMgc3VwcG9ydGVkIGJ5IHRoZSBnU09BUCBjb21waWxlci4gTXVsdGlwbGUNCitpbmhlcml0YW5jZSBpcyBub3Qgc3VwcG9ydGVkLCBiZWNhdXNlIG9mIHRoZSBsaW1pdGF0aW9ucyBvZiB0aGUgU09BUCBwcm90b2NvbC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorSWYgYSBjb25zdHJ1Y3RvciBtZXRob2QgaXMgcHJlc2VudCwgdGhlcmUgTVVTVCBhbHNvIGJlIGEgY29uc3RydWN0b3INCitkZWNsYXJhdGlvbiB3aXRoIGVtcHR5IHBhcmFtZXRlciBsaXN0Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitDbGFzc2VzIHNob3VsZCBiZSBkZWNsYXJlZCAidm9sYXRpbGUiIGlmIHlvdSBkb24ndCB3YW50IGdTT0FQIHRvIGFkZCBzZXJpYWxpemF0aW9uIG1ldGhvZHMgdG8gdGhlc2UgY2xhc3Nlcywgc2VlIFNlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOnZvbGF0aWxlIj4xOC40PC9hPiBmb3IgbW9yZSBkZXRhaWxzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitDbGFzcyB0ZW1wbGF0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGdTT0FQIGNvbXBpbGVyLCBidXQgeW91IGNhbiB1c2UgU1RMIGNvbnRhaW5lcnMsDQorc2VlIFNlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOnRlbXBsYXRlcyI+MTAuMTAuODwvYT4uIFlvdSBjYW4gYWxzbyBkZWZpbmUgeW91ciBvd24NCitjb250YWluZXJzIHNpbWlsYXIgdG8gU1RMIGNvbnRhaW5lcnMuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0NlcnRhaW4gZmllbGRzIG9mIGEgPGk+PGI+Y2xhc3M8L2I+PC9pPiBjYW4gYmUgKGRlKXNlcmlhbGl6ZWQgYXMgWE1MIGF0dHJpYnV0ZXMuDQorU2VlJm5ic3A7PGEgaHJlZj0iI3NlYzphdHRyaWJ1dGVzIj4xMC41Ljc8L2E+IGZvciBtb3JlIGRldGFpbHMuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0FycmF5cyBtYXkgYmUgZW1iZWRkZWQgd2l0aGluIGEgY2xhc3MgKGFuZCBzdHJ1Y3QpIHVzaW5nIGEgcG9pbnRlciBmaWVsZCBhbmQNCitzaXplIGluZm9ybWF0aW9uLCBzZWUgU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6bGlzdCI+MTAuMTAuNzwvYT4uIFRoaXMgZGVmaW5lcyB3aGF0IGlzIHNvbWV0aW1lcw0KK3JlZmVycmVkIHRvIGluIFNPQVAgYXMgImdlbmVyaWNzIi4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVm9pZCBwb2ludGVycyBtYXkgYmUgdXNlZCBpbiBhIGNsYXNzIChvciBzdHJ1Y3QpLCBidXQgeW91IGhhdmUgdG8gYWRkIGEgdHlwZQ0KK2ZpZWxkIHNvIHRoZSBnU09BUCBydW50aW1lIGNhbiBkZXRlcm1pbmUgdGhlIHR5cGUgb2Ygb2JqZWN0IHBvaW50ZWQgdG8sIHNlZQ0KK1NlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOnZvaWQiPjEwLjg8L2E+Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitBIDxpPjxiPmNsYXNzPC9iPjwvaT4gaW5zdGFuY2UgaXMgZW5jb2RlZCBhczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEIwRDAiPjx0cj48dGQ+PHR0Pg0KKyZsdDs8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD5uYW1lc3BhY2UtcHJlZml4Ojxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PmNsYXNzLW5hbWUgeHNpOnR5cGU9Ijxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250Pm5hbWVzcGFjZS1wcmVmaXg6PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+Y2xhc3MtbmFtZSImIzYyOyA8YnIgLz4NCismbHQ7YmFzZWZpZWxkLW5hbWUxIHhzaTp0eXBlPSIuLi4iJiM2MjsuLi4mbHQ7L2Jhc2VmaWVsZC1uYW1lMSYjNjI7IDxiciAvPg0KKyZsdDtiYXNlZmllbGQtbmFtZTIgeHNpOnR5cGU9Ii4uLiImIzYyOy4uLiZsdDsvYmFzZWZpZWxkLW5hbWUyJiM2MjsgPGJyIC8+DQorLi4uIDxiciAvPg0KKyZsdDtmaWVsZC1uYW1lMSB4c2k6dHlwZT0iLi4uIiYjNjI7Li4uJmx0Oy9maWVsZC1uYW1lMSYjNjI7IDxiciAvPg0KKyZsdDtmaWVsZC1uYW1lMiB4c2k6dHlwZT0iLi4uIiYjNjI7Li4uJmx0Oy9maWVsZC1uYW1lMiYjNjI7IDxiciAvPg0KKy4uLiA8YnIgLz4NCismbHQ7Lzxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250Pm5hbWVzcGFjZS1wcmVmaXg6PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+Y2xhc3MtbmFtZSYjNjI7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvdHQ+DQord2hlcmUgdGhlIDx0dD5maWVsZC1uYW1lPC90dD4gYWNjZXNzb3JzIGhhdmUgZWxlbWVudC1uYW1lIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUNCitjbGFzcyBmaWVsZHMgYW5kIHRoZSA8dHQ+YmFzZWZpZWxkLW5hbWU8L3R0PiBhY2Nlc3NvcnMgaGF2ZSBlbGVtZW50LW5hbWUNCityZXByZXNlbnRhdGlvbnMgb2YgdGhlIGJhc2UgY2xhc3MgZmllbGRzLiAoVGhlIG9wdGlvbmFsIHBhcnRzIHJlc3VsdGluZyBmcm9tDQordGhlIHNwZWNpZmljYXRpb24gYXJlIHNob3duIGVuY2xvc2VkIGluIDxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250Pjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250Pi4pDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBkZWNvZGluZyBvZiBhIGNsYXNzIGluc3RhbmNlIGFsbG93cyBhbnkgb3JkZXJpbmcgb2YgdGhlIGFjY2Vzc29ycyBpbiB0aGUNCitTT0FQIHBheWxvYWQuIEhvd2V2ZXIsIGlmIGEgYmFzZSBjbGFzcyBmaWVsZCBuYW1lIGlzIGlkZW50aWNhbCB0byBhIGRlcml2ZWQNCitjbGFzcyBmaWVsZCBuYW1lIGJlY2F1c2UgdGhlIGZpZWxkIGlzIG92ZXJsb2FkZWQsIHRoZSBiYXNlIGNsYXNzIGZpZWxkIG5hbWUNCitNVVNUIHByZWNlZGUgdGhlIGRlcml2ZWQgY2xhc3MgZmllbGQgbmFtZSBpbiB0aGUgU09BUCBwYXlsb2FkIGZvciBkZWNvZGluZy4NCitnU09BUCBndWFyYW50ZWVzIHRoaXMsIGJ1dCBpbnRlcm9wZXJhYmlsaXR5IHdpdGggb3RoZXIgU09BUCBpbXBsZW1lbnRhdGlvbnMgaXMNCitjYW5ub3QgYmUgZ3VhcmFudGVlZC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCQkgICAgICA8aDQ+PGEgbmFtZT0idHRoX3NFYzEwLjUuMSI+DQorMTAuNS4xPC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5FeGFtcGxlPC9mb250PjwvaDQ+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZWNsYXJlcyBhIGJhc2UgY2xhc3MgPGk+bnNfX09iamVjdDwvaT4gYW5kIGEgZGVyaXZlZCBjbGFzcyA8aT5uc19fU2hhcGU8L2k+Og0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisvLyBDb250ZW50cyBvZiBmaWxlICJzaGFwZS5oIjogPGJyIC8+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7bnNfX09iamVjdCA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnB1YmxpYzwvYj46IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7Km5hbWU7IDxiciAvPg0KK307IDxiciAvPg0KKzxiPmNsYXNzPC9iPiZuYnNwO25zX19TaGFwZSA6IDxiPnB1YmxpYzwvYj4mbmJzcDtuc19fT2JqZWN0IDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cHVibGljPC9iPjogPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aW50PC9iPiZuYnNwO3NpZGVzOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5lbnVtPC9iPiZuYnNwO25zX19Db2xvciB7UmVkLCBHcmVlbiwgQmx1ZX0gY29sb3I7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO25zX19TaGFwZSgpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtuc19fU2hhcGUoPGI+aW50PC9iPiZuYnNwO3NpZGVzLCA8Yj5lbnVtPC9iPiZuYnNwO25zX19HcmVlbiBjb2xvcik7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO35uc19fU2hhcGUoKTsgPGJyIC8+DQorfTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbWV0aG9kcyBvZiA8aT48Yj5jbGFzczwvYj4mbmJzcDtuc19fU2hhcGU8L2k+IG11c3Qgbm90IGJlIHBhcnQgb2YgdGhlIGhlYWRlciBmaWxlIGFuZCBuZWVkIHRvIGJlIGRlZmluZWQgZWxzZXdoZXJlLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitBbiBpbnN0YW5jZSBvZiA8aT48Yj5jbGFzczwvYj4mbmJzcDtuc19fU2hhcGU8L2k+IHdpdGggbmFtZSBUcmlhbmdsZSwgMyBzaWRlcywgYW5kIGNvbG9yIEdyZWVuIGlzIGVuY29kZWQgYXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBCMEQwIj48dHI+PHRkPjx0dD4NCismbHQ7bnM6U2hhcGUgeHNpOnR5cGU9Im5zOlNoYXBlIiYjNjI7IDxiciAvPg0KKyZsdDtuYW1lIHhzaTp0eXBlPSJzdHJpbmciJiM2MjtUcmlhbmdsZSZsdDsvbmFtZSYjNjI7IDxiciAvPg0KKyZsdDtzaWRlcyB4c2k6dHlwZT0iaW50IiYjNjI7MyZsdDsvc2lkZXMmIzYyOyA8YnIgLz4NCismbHQ7Y29sb3IgeHNpOnR5cGU9Im5zOkNvbG9yIiYjNjI7R3JlZW4mbHQ7L2NvbG9yJiM2MjsgPGJyIC8+DQorJmx0Oy9uczpzaGFwZSYjNjI7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvdHQ+DQorVGhlIG5hbWVzcGFjZSBVUkkgb2YgdGhlIG5hbWVzcGFjZSBwcmVmaXggPHR0Pm5zPC90dD4gbXVzdCBiZSBkZWZpbmVkIGJ5IGEgbmFtZXNwYWNlIG1hcHBpbmcgdGFibGUsIHNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzpuc3RhYmxlIj45LjQ8L2E+Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJCSAgICAgIDxoND48YSBuYW1lPSJ0dGhfc0VjMTAuNS4yIj4NCisxMC41LjI8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPkluaXRpYWxpemVkIDxiPnN0YXRpYzwvYj4mbmJzcDs8Yj5jb25zdDwvYj4mbmJzcDtGaWVsZHM8L2ZvbnQ+PC9oND4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorQSBkYXRhIG1lbWJlciBmaWVsZCBvZiBhIGNsYXNzIGRlY2xhcmVkIGFzIDxpPjxiPnN0YXRpYzwvYj4mbmJzcDs8Yj5jb25zdDwvYj48L2k+IGlzIGluaXRpYWxpemVkDQord2l0aCBhIGNvbnN0YW50IHZhbHVlIGF0IGNvbXBpbGUgdGltZS4gVGhpcyBmaWVsZCBpcyBlbmNvZGVkIGluIHRoZQ0KK3NlcmlhbGl6YXRpb24gcHJvY2VzcywgYnV0IGlzIG5vdCBkZWNvZGVkIGluIHRoZSBkZXNlcmlhbGl6YXRpb24gcHJvY2Vzcy4gRm9yDQorZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorLy8gQ29udGVudHMgb2YgZmlsZSAidHJpYW5nbGUuaCI6IDxiciAvPg0KKzxiPmNsYXNzPC9iPiZuYnNwO25zX19UcmlhbmdsZSA6IDxiPnB1YmxpYzwvYj4mbmJzcDtuc19fT2JqZWN0IDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cHVibGljPC9iPjogPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aW50PC9iPiZuYnNwO3NpemU7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnN0YXRpYzwvYj4mbmJzcDs8Yj5jb25zdDwvYj4mbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7c2lkZXMgPSAzOyA8YnIgLz4NCit9Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorQW4gaW5zdGFuY2Ugb2YgPGk+PGI+Y2xhc3M8L2I+Jm5ic3A7bnNfX1RyaWFuZ2xlPC9pPiBpcyBlbmNvZGVkIGluIFNPQVAgYXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBCMEQwIj48dHI+PHRkPjx0dD4NCismbHQ7bnM6VHJpYW5nbGUgeHNpOnR5cGU9Im5zOlRyaWFuZ2xlIiYjNjI7IDxiciAvPg0KKyZsdDtuYW1lIHhzaTp0eXBlPSJzdHJpbmciJiM2MjtUcmlhbmdsZSZsdDsvbmFtZSYjNjI7IDxiciAvPg0KKyZsdDtzaXplIHhzaTp0eXBlPSJpbnQiJiM2MjsxNSZsdDsvc2l6ZSYjNjI7IDxiciAvPg0KKyZsdDtzaWRlcyB4c2k6dHlwZT0iaW50IiYjNjI7MyYjNjI7L3NpZGVzJiM2MjsgPGJyIC8+DQorJmx0Oy9uczpUcmlhbmdsZSYjNjI7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvdHQ+DQorRGVjb2Rpbmcgd2lsbCBpZ25vcmUgdGhlIDxpPnNpZGVzPC9pPiBmaWVsZCdzIHZhbHVlLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+Q2F1dGlvbjwvYj48L2ZvbnQ+OiBUaGUgY3VycmVudCBnU09BUCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IGVuY29kaW5nDQorPGk+PGI+c3RhdGljPC9iPiZuYnNwOzxiPmNvbnN0PC9iPjwvaT4gZmllbGRzLCBkdWUgdG8gQysrIGNvbXBpbGVyIGNvbXBhdGliaWxpdHkgZGlmZmVyZW5jZXMuDQorVGhpcyBmZWF0dXJlIG1heSBiZSBwcm92aWRlZCB0aGUgZnV0dXJlLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJCSAgICAgIDxoND48YSBuYW1lPSJ0dGhfc0VjMTAuNS4zIj4NCisxMC41LjM8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPkNsYXNzIE1ldGhvZHM8L2ZvbnQ+PC9oND4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorQSA8aT48Yj5jbGFzczwvYj48L2k+IGRlY2xhcmF0aW9uIGluIHRoZSBoZWFkZXIgZmlsZSBpbnB1dCB0byB0aGUgZ1NPQVAgY29tcGlsZXIgTUFZDQoraW5jbHVkZSBtZXRob2QgZGVjbGFyYXRpb25zLiAgVGhlIG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgTVVTVCBOT1QgYmUgcGFydCBvZg0KK3RoZSBoZWFkZXIgZmlsZSBidXQgYXJlIHJlcXVpcmVkIHRvIGJlIGRlZmluZWQgaW4gYW5vdGhlciBDKysgc291cmNlIHRoYXQgaXMNCitleHRlcm5hbGx5IGxpbmtlZCB3aXRoIHRoZSBhcHBsaWNhdGlvbi4gVGhpcyBjb252ZW50aW9uIGlzIGFsc28gdXNlZCBmb3IgdGhlDQorY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBvZiB0aGUgPGk+PGI+Y2xhc3M8L2I+PC9pPi4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorRHluYW1pYyBiaW5kaW5nIGlzIHN1cHBvcnRlZCwgc28gYSBtZXRob2QgTUFZIGJlIGRlY2xhcmVkIDxpPjxiPnZpcnR1YWw8L2I+PC9pPi4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCQkgICAgICA8aDQ+PGEgbmFtZT0idHRoX3NFYzEwLjUuNCI+DQorMTAuNS40PC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5HZXR0ZXIgYW5kIFNldHRlciBNZXRob2RzPC9mb250PjwvaDQ+PGEgbmFtZT0ic2VjOmdldHRlcnNldHRlciI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitTZXR0ZXIgYW5kIGdldHRlciBtZXRob2RzIGFyZSBpbnZva2VkIGF0IHJ1biB0aW1lIHVwb24gc2VyaWFsaXphdGlvbiBhbmQNCitkZXNlcmlhbGl6YXRpb24gb2YgY2xhc3MgaW5zdGFuY2VzLCByZXNwZWN0aXZlbHkuIFRoZSB1c2Ugb2Ygc2V0dGVyIGFuZCBnZXR0ZXIgbWV0aG9kcyBhZGRzIG1vcmUgZmxleGliaWxpdHkgdG8gdGhlIHNlcmlhbGl6YXRpb24gYW5kIGRlc2VyaWFsaXphdGlvbiBwcm9jZXNzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitBIHNldHRlciBtZXRob2QgaXMgY2FsbGVkIGluIHRoZSBzZXJpYWxpemF0aW9uIHBoYXNlIGZyb20gdGhlIHZpcnR1YWwNCis8aT5zb2FwX3NlcmlhbGl6YXRpb248L2k+IG1ldGhvZCBnZW5lcmF0ZWQgYnkgdGhlIGdTT0FQIGNvbXBpbGVyLiAgWW91IGNhbiB1c2UNCitzZXR0ZXIgbWV0aG9kcyB0byBwcm9jZXNzIGEgY2xhc3MgaW5zdGFuY2UganVzdCBiZWZvcmUgaXQgaXMgc2VyaWFsaXplZC4gQQ0KK3NldHRlciBtZXRob2QgY2FuIGJlIHVzZWQgdG8gY29udmVydCBhcHBsaWNhdGlvbiBkYXRhLCBzdWNoIGFzIHRyYW5zbGF0aW5nDQordHJhbnNpZW50IGFwcGxpY2F0aW9uIGRhdGEgaW50byBzZXJpYWxpemFibGUgZGF0YSwgZm9yIGV4YW1wbGUuIFlvdSBjYW4gYWxzbw0KK3VzZSBzZXR0ZXIgbWV0aG9kcyB0byByZXRyaWV2ZSBkeW5hbWljIGNvbnRlbnQgYW5kIHVzZSBpdCB0byB1cGRhdGUgYSBjbGFzcw0KK2luc3RhbmNlIHJpZ2h0IGJlZm9yZSBzZXJpYWxpemF0aW9uLiBSZW1lbWJlciBzZXR0ZXJzDQorYXMgJiMyMjM7ZXQgdG8gc2VyaWFsaXplIiBvcGVyYXRpb25zLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitHZXR0ZXIgbWV0aG9kcyBhcmUgaW52b2tlZCBhZnRlciBkZXNlcmlhbGl6YXRpb24gb2YgdGhlIGluc3RhbmNlLiBZb3UgY2FuIHVzZQ0KK3RoZW0gdG8gYWRqdXN0IHRoZSBjb250ZW50cyBvZiBjbGFzcyBpbnN0YW5jZXMgYWZ0ZXIgYWxsIHRoZWlyIG1lbWJlcnMgaGF2ZSBiZWVuDQorZGVzZXJpYWxpemVkLiBHZXR0ZXJzIGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgZGVzZXJpYWxpemVkIG1lbWJlcnMgaW50bw0KK3RyYW5zaWVudCBtZW1iZXJzIGFuZCBldmVuIGludm9rZSBtZXRob2RzIHRvIHByb2Nlc3MgdGhlIGRlc2VyaWFsaXplZCBkYXRhIG9uDQordGhlIGZseS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorR2V0dGVyIGFuZCBzZXR0ZXIgbWV0aG9kcyBoYXZlIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD48Yj52aXJ0dWFsPC9iPjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PiA8Yj5pbnQ8L2I+Jm5ic3A7Z2V0KDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwKSA8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD48Yj5jb25zdDwvYj48Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD47IDxiciAvPg0KKzxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250PjxiPnZpcnR1YWw8L2I+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+IDxiPmludDwvYj4mbmJzcDtzZXQoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXApOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIGFjdGl2ZSBzb2FwIHN0cnVjdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgPGk+Z2V0PC9pPiBhbmQgPGk+c2V0PC9pPiBtZXRob2RzLiBUaGUgbWV0aG9kcyBzaG91bGQgcmV0dXJuIDxpPlNPQVBfT0s8L2k+IHdoZW4gc3VjY2Vzc2Z1bC4gQSBzZXR0ZXIgbWV0aG9kIHNob3VsZCBwcmVwYXJlIHRoZSBjb250ZW50cyBvZiB0aGUgY2xhc3MgaW5zdGFuY2UgZm9yIHNlcmlhbGl6YXRpb24uIEEgZ2V0dGVyIG1ldGhvZCBzaG91bGQgcHJvY2VzcyB0aGUgaW5zdGFuY2UgYWZ0ZXIgZGVzZXJpYWxpemF0aW9uLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitIZXJlIGlzIGFuIGV4YW1wbGUgb2YgYSBiYXNlNjQgYmluYXJ5IGNsYXNzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5jbGFzczwvYj4mbmJzcDt4c2RfX2Jhc2U2NEJpbmFyeSA8YnIgLz4NCit7IDxiPnB1YmxpYzwvYj46IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnVuc2lnbmVkPC9iPmNoYXIgKl9fcHRyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pbnQ8L2I+X19zaXplOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7Z2V0KHN0cnVjdCBzb2FwICpzb2FwKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aW50PC9iPiZuYnNwO3NldChzdHJ1Y3Qgc29hcCAqc29hcCk7IDxiciAvPg0KK307DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitTdXBwb3NlIHRoYXQgdGhlIHR5cGUgYW5kIG9wdGlvbnMgbWVtYmVycyBvZiB0aGUgYXR0YWNobWVudCBzaG91bGQgYmUgc2V0IHdoZW4NCit0aGUgY2xhc3MgaXMgYWJvdXQgdG8gYmUgc2VyaWFsaXplZC4gVGhpcyBjYW4gYmUgYWNjb21wbGlzaGVkIHdpdGggdGhlDQorPGk+c2V0PC9pPiBtZXRob2QgZnJvbSB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgdGhlIDxpPl9fcHRyPC9pPiB0byB0aGUgZGF0YQ0KK2FuZCB0aGUgc29hcCBzdHJ1Y3QgcGFzc2VkIHRvIHRoZSA8aT5zZXQ8L2k+IG1ldGhvZCAoeW91IGNhbiBwYXNzIGRhdGEgdmlhIHRoZQ0KKzxpPjxiPnZvaWQ8L2I+KnNvYXAudXNlcjwvaT4gZmllbGQpLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgPGk+Z2V0PC9pPiBtZXRob2QgaXMgaW52b2tlZCBhZnRlciB0aGUgYmFzZTY0IGRhdGEgaGFzIGJlZW4gcHJvY2Vzc2VkLiBZb3UNCitjYW4gdXNlIGl0IGZvciBwb3N0LXByb2Nlc3NpbmcgcHVycG9zZXMuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0hlcmUgaXMgYW5vdGhlciBleGFtcGxlLiBJdCBkZWZpbmVzIGEgcHJpbWl0aXZlIDxpPnVwZGF0ZTwvaT4gdHlwZS4gVGhlIGNsYXNzIGlzIGEgd3JhcHBlciBmb3IgdGhlIDxpPnRpbWVfdDwvaT4gdHlwZSwgc2VlIFNlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOnByaW1jbGFzcyI+MTAuMi4yPC9hPi4gVGhlcmVmb3JlLCBlbGVtZW50cyBvZiB0aGlzIHR5cGUgY29udGFpbiA8dHQ+eHNkOmRhdGVUeXBlPC90dD4gZGF0YS4NCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7dXBkYXRlIDxiciAvPg0KK3sgPGI+cHVibGljPC9iPjogPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7dGltZV90IF9faXRlbTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aW50PC9iPiZuYnNwO3NldCg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCk7IDxiciAvPg0KK307DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgc2V0dGVyIG1ldGhvZCBhc3NpZ25zIHRoZSBjdXJyZW50IHRpbWU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPmludDwvYj4mbmJzcDt1cGRhdGU6OnNldCg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCkgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt0aGlzPHR0Pi0mZ3Q7PC90dD5fX2l0ZW0gPSB0aW1lKE5VTEwpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7U09BUF9PSzsgPGJyIC8+DQorfQ0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlcmVmb3JlLCBzZXJpYWxpemF0aW9uIHJlc3VsdHMgaW4gdGhlIGluY2x1c2lvbiBvZiBhIHRpbWUgc3RhbXAgaW4gWE1MLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+Q2F1dGlvbjwvYj48L2ZvbnQ+OiBhIDxpPmdldDwvaT4gbWV0aG9kIGlzIGludm9rZWQgb25seSB3aGVuIHRoZSBYTUwgZWxlbWVudCB3aXRoIGl0cyBkYXRhDQord2FzIGNvbXBsZXRlbHkgcGFyc2VkLiBUaGUgbWV0aG9kIGlzIG5vdCBpbnZva2VkIHdoZW4gdGhlIGVsZW1lbnQgaXMgYW4gPHR0PnhzaTpuaWw8L3R0PiBlbGVtZW50IG9yIGhhcyBhbiANCis8dHQ+aHJlZjwvdHQ+IGF0dHJpYnV0ZS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorPGZvbnQgY29sb3I9IiNGRjAwMDAiPjxiPkNhdXRpb246PC9iPjwvZm9udD4gVGhlIDxpPnNvYXBfc2VyaWFsaXplPC9pPiBtZXRob2Qgb2YgYSBjbGFzcyBjYWxscyB0aGUgc2V0dGVyICh3aGVuDQorcHJvdmlkZWQpLiBIb3dldmVyLCB0aGUgPGk+c29hcF9zZXJpYWxpemU8L2k+IG1ldGhvZCBpcyBkZWNsYXJlZCA8aT48Yj5jb25zdDwvYj48L2k+DQord2hpbGUgdGhlIHNldHRlciBzaG91bGQgYmUgYWxsb3dlZCB0byBtb2RpZnkgdGhlIGNvbnRlbnRzIG9mIHRoZSBjbGFzcw0KK2luc3RhbmNlLiBUaGVyZWZvcmUsIHRoZSBnU09BUC1nZW5lcmF0ZWQgY29kZSByZWNhc3RzIHRoZSBpbnN0YW5jZSBhbmQgdGhlDQorPGk+PGI+Y29uc3Q8L2I+PC9pPiBpcyByZW1vdmVkIHdoZW4gaW52b2tpbmcgdGhlIHNldHRlci4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCQkgICAgICA8aDQ+PGEgbmFtZT0idHRoX3NFYzEwLjUuNSI+DQorMTAuNS41PC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5TdHJlYW1pbmcgWE1MIHdpdGggR2V0dGVyIGFuZCBTZXR0ZXIgTWV0aG9kczwvZm9udD48L2g0PjxhIG5hbWU9InNlYzpzdHJlYW1pbmciPg0KKzwvYT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorR2V0dGVyIG1ldGhvZHMgZW5hYmxlIHN0cmVhbWluZyBYTUwgb3BlcmF0aW9ucy4gQSBnZXR0ZXIgbWV0aG9kIGlzIGludm9rZWQNCit3aGVuIHRoZSBvYmplY3QgaXMgZGVzZXJpYWxpemVkIGFuZCB0aGUgcmVzdCBvZiB0aGUgU09BUC9YTUwgbWVzc2FnZSBoYXMgbm90DQorYmVlbiBwcm9jZXNzZWQgeWV0LiBGb3IgZXhhbXBsZSwgeW91IGNhbiBhZGQgYSBnZXR0ZXIgbWV0aG9kIHRvIHRoZSBTT0FQIEhlYWRlcg0KK2NsYXNzIHRvIGltcGxlbWVudCBoZWFkZXIgcHJvY2Vzc2luZyBsb2dpYyB0aGF0IGlzIGFjdGl2YXRlZCBhcyBzb29uIGFzIHRoZQ0KK1NPQVAgSGVhZGVyIGlzIHJlY2VpdmVkLiAgQW4gZXhhbXBsZSBjb2RlIGlzIHNob3duIGJlbG93Og0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5jbGFzczwvYj4mbmJzcDtoX19BdXRoZW50aWNhdGlvbiA8YnIgLz4NCit7IDxiPnB1YmxpYzwvYj46IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KmlkOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7Z2V0KDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwKTsgPGJyIC8+DQorfTsgPGJyIC8+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7U09BUF9FTlZfX0hlYWRlciA8YnIgLz4NCit7IDxiPnB1YmxpYzwvYj46IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO2hfX0F1dGhlbnRpY2F0aW9uICpoX19hdXRoZW50aWNhdGlvbjsgPGJyIC8+DQorfTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoZSA8aT5BdXRoZW50aWNhdGlvbjwvaT4gU09BUCBIZWFkZXIgZmllbGQgaXMgaW5zdGFudGlhdGVkIGFuZCBkZWNvZGVkLiBBZnRlcg0KK2RlY29kaW5nLCB0aGUgZ2V0dGVyIG1ldGhvZCBpcyBpbnZva2VkLCB3aGljaCBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgPGk+aWQ8L2k+DQorYmVmb3JlIHRoZSByZXN0IG9mIHRoZSBTT0FQIG1lc3NhZ2UgaXMgcHJvY2Vzc2VkLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJCSAgICAgIDxoND48YSBuYW1lPSJ0dGhfc0VjMTAuNS42Ij4NCisxMC41LjY8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPlBvbHltb3JwaGlzbSwgRGVyaXZlZCBDbGFzc2VzLCBhbmQgRHluYW1pYyBCaW5kaW5nPC9mb250PjwvaDQ+PGEgbmFtZT0ic2VjOnBvbHltb3JwaCI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitJbnRlcm9wZXJhYmlsaXR5IGJldHdlZW4gY2xpZW50IGFuZCBzZXJ2aWNlIGFwcGxpY2F0aW9ucyBkZXZlbG9wZWQgd2l0aCBnU09BUA0KK2lzIGVzdGFibGlzaGVkIGV2ZW4gd2hlbiBjbGllbnRzIGFuZC9vciBzZXJ2aWNlcyB1c2UgZGVyaXZlZCBjbGFzc2VzIGluc3RlYWQgb2YNCit0aGUgYmFzZSBjbGFzc2VzIHVzZWQgaW4gdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSByZW1vdGUgbWV0aG9kIHBhcmFtZXRlcnMuICBBDQorY2xpZW50IGFwcGxpY2F0aW9uIE1BWSB1c2UgcG9pbnRlcnMgdG8gaW5zdGFuY2VzIG9mIGRlcml2ZWQgY2xhc3NlcyBmb3IgdGhlDQoraW5wdXQgcGFyYW1ldGVycyBvZiBhIHJlbW90ZSBtZXRob2QuIElmIHRoZSBzZXJ2aWNlIHdhcyBjb21waWxlZCB3aXRoIGENCitkZWNsYXJhdGlvbiBhbmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIGRlcml2ZWQgY2xhc3MsIHRoZSByZW1vdGUgbWV0aG9kIGJhc2UNCitjbGFzcyBpbnB1dCBwYXJhbWV0ZXJzIGFyZSBkZW1hcnNoYWxsZWQgYW5kIGEgZGVyaXZlZCBjbGFzcyBpbnN0YW5jZSBpcyBjcmVhdGVkDQoraW5zdGVhZCBvZiBhIGJhc2UgY2xhc3MgaW5zdGFuY2UuIElmIHRoZSBzZXJ2aWNlIGRpZCBub3QgaW5jbHVkZSBhIGRlY2xhcmF0aW9uDQorb2YgdGhlIGRlcml2ZWQgY2xhc3MsIHRoZSBkZXJpdmVkIGNsYXNzIGZpZWxkcyBhcmUgaWdub3JlZCBhbmQgYSBiYXNlIGNsYXNzDQoraW5zdGFuY2UgaXMgY3JlYXRlZC4gVGhlcmVmb3JlLCBpbnRlcm9wZXJhYmlsaXR5IGlzIGd1YXJhbnRlZWQgZXZlbiB3aGVuIHRoZQ0KK2NsaWVudCBzZW5kcyBhbiBpbnN0YW5jZSBvZiBhIGRlcml2ZWQgY2xhc3NlcyBhbmQgd2hlbiBhIHNlcnZpY2UgcmV0dXJucyBhbg0KK2luc3RhbmNlIG9mIGEgZGVyaXZlZCBjbGFzcy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIGZvbGxvd2luZyBleGFtcGxlIGRlY2xhcmVzIEJhc2UgYW5kIERlcml2ZWQgY2xhc3NlcyBhbmQgYSByZW1vdGUgbWV0aG9kDQordGhhdCB0YWtlcyBhIHBvaW50ZXIgdG8gYSBCYXNlIGNsYXNzIGluc3RhbmNlIGFuZCByZXR1cm5zIGEgQmFzZSBjbGFzcw0KK2luc3RhbmNlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisvLyBDb250ZW50cyBvZiBmaWxlICJkZXJpdmVkLmgiIDxiciAvPg0KKzxiPmNsYXNzPC9iPiZuYnNwO0Jhc2UgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5wdWJsaWM8L2I+OiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypuYW1lOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtCYXNlKCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnZpcnR1YWw8L2I+Jm5ic3A7PGI+dm9pZDwvYj4mbmJzcDtwcmludCgpOyA8YnIgLz4NCit9OyA8YnIgLz4NCis8Yj5jbGFzczwvYj4mbmJzcDtEZXJpdmVkIDogPGI+cHVibGljPC9iPiZuYnNwO0Jhc2UgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5wdWJsaWM8L2I+OiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7bnVtOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtEZXJpdmVkKCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnZpcnR1YWw8L2I+Jm5ic3A7PGI+dm9pZDwvYj4mbmJzcDtwcmludCgpOyA8YnIgLz4NCit9OyA8YnIgLz4NCis8Yj5pbnQ8L2I+Jm5ic3A7bWV0aG9kKEJhc2UgKmluLCA8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7bWV0aG9kUmVzcG9uc2UgeyBCYXNlICpvdXQ7IH0gJmFtcDtyZXN1bHQpOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhpcyBoZWFkZXIgZmlsZSBzcGVjaWZpY2F0aW9uIGlzIHByb2Nlc3NlZCBieSB0aGUgZ1NPQVAgY29tcGlsZXIgdG8gcHJvZHVjZSB0aGUgc3R1YiBhbmQgc2tlbGV0b24gcm91dGluZXMgd2hpY2ggYXJlIHVzZWQgdG8gaW1wbGVtZW50IGEgY2xpZW50IGFuZCBzZXJ2aWNlLg0KK1RoZSBwb2ludGVyIG9mIHRoZSByZW1vdGUgbWV0aG9kIGlzIGFsc28gYWxsb3dlZCB0byBwb2ludCB0byBEZXJpdmVkIGNsYXNzIGluc3RhbmNlcyBhbmQgdGhlc2UgaW5zdGFuY2VzIHdpbGwgYmUgbWFyc2hhbGxlZCBhcyBEZXJpdmVkIGNsYXNzIGluc3RhbmNlcyBhbmQgc2VuZCB0byBhIHNlcnZpY2UsIHdoaWNoIGlzIGluIGFjY29yZCB0byB0aGUgdXN1YWwgc2VtYW50aWNzIG9mIHBhcmFtZXRlciBwYXNzaW5nIGluIEMrKyB3aXRoIGR5bmFtaWMgYmluZGluZy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIEJhc2UgYW5kIERlcml2ZWQgY2xhc3MgbWV0aG9kIGltcGxlbWVudGF0aW9ucyBhcmU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vIE1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIEJhc2UgYW5kIERlcml2ZWQgY2xhc3NlczogPGJyIC8+DQorI2luY2x1ZGUgInNvYXBILmgiIDxiciAvPg0KKy4uLiA8YnIgLz4NCitCYXNlOjpCYXNlKCkgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtjb3V0ICAmbHQ7Jmx0OyAgImNyZWF0ZWQgYSBCYXNlIGNsYXNzIGluc3RhbmNlIiAgJmx0OyZsdDsgIGVuZGw7IDxiciAvPg0KK30gPGJyIC8+DQorRGVyaXZlZDo6RGVyaXZlZCgpIDxiciAvPg0KK3s8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtjb3V0ICAmbHQ7Jmx0OyAgImNyZWF0ZWQgYSBEZXJpdmVkIGNsYXNzIGluc3RhbmNlIiAgJmx0OyZsdDsgIGVuZGw7IDxiciAvPg0KK30gPGJyIC8+DQorQmFzZTo6cHJpbnQoKSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO2NvdXQgICZsdDsmbHQ7ICAicHJpbnQoKTogQmFzZSBjbGFzcyBpbnN0YW5jZSAiICAmbHQ7Jmx0OyAgbmFtZSAgJmx0OyZsdDsgIGVuZGw7IDxiciAvPg0KK30gPGJyIC8+DQorRGVyaXZlZDo6cHJpbnQoKSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO2NvdXQgICZsdDsmbHQ7ICAicHJpbnQoKTogRGVyaXZlZCBjbGFzcyBpbnN0YW5jZSAiICAmbHQ7Jmx0OyAgbmFtZSAgJmx0OyZsdDsgICIgIiAgJmx0OyZsdDsgIG51bSAgJmx0OyZsdDsgIGVuZGw7IDxiciAvPg0KK30NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK0JlbG93IGlzIGFuIGV4YW1wbGUgPGk+Q0xJRU5UPC9pPiBhcHBsaWNhdGlvbiB0aGF0IGNyZWF0ZXMgYSBEZXJpdmVkIGNsYXNzIGluc3RhbmNlIHRoYXQgaXMgcGFzc2VkIGFzIHRoZSBpbnB1dCBwYXJhbWV0ZXIgb2YgdGhlIHJlbW90ZSBtZXRob2Q6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vIENMSUVOVCA8YnIgLz4NCisjaW5jbHVkZSAic29hcEguaCIgPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO21haW4oKSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwIHNvYXA7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfaW5pdCgmYW1wO3NvYXApOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtEZXJpdmVkIG9iajE7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO0Jhc2UgKm9iajI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnN0cnVjdDwvYj4mbmJzcDttZXRob2RSZXNwb25zZSByOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtvYmoxLm5hbWUgPSAiWCI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO29iajEubnVtID0gMzsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9jYWxsX21ldGhvZCgmYW1wO3NvYXAsIHVybCwgYWN0aW9uLCAmYW1wO29iajEsIHIpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtyLm9iajI8dHQ+LSZndDs8L3R0PnByaW50KCk7IDxiciAvPg0KK30gPGJyIC8+DQorLi4uDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgZm9sbG93aW5nIGV4YW1wbGUgPGk+U0VSVkVSMTwvaT4gYXBwbGljYXRpb24gY29waWVzIGEgY2xhc3MgaW5zdGFuY2UgKEJhc2Ugb3IgRGVyaXZlZCBjbGFzcykgZnJvbSB0aGUgaW5wdXQgdG8gdGhlIG91dHB1dCBwYXJhbWV0ZXI6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vIFNFUlZFUjEgPGJyIC8+DQorI2luY2x1ZGUgInNvYXBILmgiIDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDttYWluKCkgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX3NlcnZlKHNvYXBfbmV3KCkpOyA8YnIgLz4NCit9IDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDttZXRob2QoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIEJhc2UgKm9iajEsIDxiPnN0cnVjdDwvYj4mbmJzcDttZXRob2RSZXNwb25zZSAmYW1wO3Jlc3VsdCkgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtvYmoxPHR0Pi0mZ3Q7PC90dD5wcmludCgpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtyZXN1bHQub2JqMiA9IG9iajE7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDtTT0FQX09LOyA8YnIgLz4NCit9IDxiciAvPg0KKy4uLg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIGZvbGxvd2luZyBtZXNzYWdlcyBhcmUgcHJvZHVjZWQgYnkgdGhlIDxpPkNMSUVOVDwvaT4gYW5kIDxpPlNFUlZFUjE8L2k+IGFwcGxpY2F0aW9uczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNEMEQwRDAiPjx0cj48dGQ+PHNwYW4gY2xhc3M9InJvbWFuIj4NCitDTElFTlQ6IGNyZWF0ZWQgYSBEZXJpdmVkIGNsYXNzIGluc3RhbmNlIDxiciAvPg0KK1NFUlZFUjE6IGNyZWF0ZWQgYSBEZXJpdmVkIGNsYXNzIGluc3RhbmNlIDxiciAvPg0KK1NFUlZFUjE6IHByaW50KCk6IERlcml2ZWQgY2xhc3MgaW5zdGFuY2UgWCAzIDxiciAvPg0KK0NMSUVOVDogY3JlYXRlZCBhIERlcml2ZWQgY2xhc3MgaW5zdGFuY2UgPGJyIC8+DQorQ0xJRU5UOiBwcmludCgpOiBEZXJpdmVkIGNsYXNzIGluc3RhbmNlIFggMw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQorV2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIGRlcml2ZWQgY2xhc3Mga2VwdCBpdHMgaWRlbnRpdHkgd2hlbiBpdCBwYXNzZWQgdGhyb3VnaCA8aT5TRVJWRVIxPC9pPi4gTm90ZSB0aGF0IGluc3RhbmNlcyBhcmUgY3JlYXRlZCBib3RoIGJ5IHRoZSA8aT5DTElFTlQ8L2k+IGFuZCA8aT5TRVJWRVIxPC9pPiBieSB0aGUgZGVtYXJzaGFsbGluZyBwcm9jZXNzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitOb3cgc3VwcG9zZSBhIHNlcnZpY2UgYXBwbGljYXRpb24gaXMgZGV2ZWxvcGVkIHRoYXQgb25seSBhY2NlcHRzIEJhc2UgY2xhc3MgaW5zdGFuY2VzLiBUaGUgaGVhZGVyIGZpbGUgaXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vIENvbnRlbnRzIG9mIGZpbGUgImJhc2UuaCI6IDxiciAvPg0KKzxiPmNsYXNzPC9iPiZuYnNwO0Jhc2UgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5wdWJsaWM8L2I+OiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypuYW1lOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtCYXNlKCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnZpcnR1YWw8L2I+Jm5ic3A7PGI+dm9pZDwvYj4mbmJzcDtwcmludCgpOyA8YnIgLz4NCit9OyA8YnIgLz4NCis8Yj5pbnQ8L2I+Jm5ic3A7bWV0aG9kKEJhc2UgKmluLCBCYXNlICpvdXQpOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhpcyBoZWFkZXIgZmlsZSBzcGVjaWZpY2F0aW9uIGlzIHByb2Nlc3NlZCBieSB0aGUgZ1NPQVAgc3R1YiBhbmQgc2tlbGV0b24gY29tcGlsZXIgdG8gcHJvZHVjZSBza2VsZXRvbiByb3V0aW5lIHdoaWNoIGlzIHVzZWQgdG8gaW1wbGVtZW50IGEgc2VydmljZSAoc28gdGhlIGNsaWVudCB3aWxsIHN0aWxsIHVzZSB0aGUgZGVyaXZlZCBjbGFzc2VzKS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIG1ldGhvZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQmFzZSBjbGFzcyBhcmU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vIE1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIEJhc2UgY2xhc3M6IDxiciAvPg0KKyNpbmNsdWRlICJzb2FwSC5oIiA8YnIgLz4NCisuLi4gPGJyIC8+DQorQmFzZTo6QmFzZSgpIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Y291dCAgJmx0OyZsdDsgICJjcmVhdGVkIGEgQmFzZSBjbGFzcyBpbnN0YW5jZSIgICZsdDsmbHQ7ICBlbmRsOyA8YnIgLz4NCit9IDxiciAvPg0KK0Jhc2U6OnByaW50KCkgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtjb3V0ICAmbHQ7Jmx0OyAgInByaW50KCk6IEJhc2UgY2xhc3MgaW5zdGFuY2UgIiAgJmx0OyZsdDsgIG5hbWUgICZsdDsmbHQ7ICBlbmRsOyA8YnIgLz4NCit9IDxiciAvPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorQW5kIHRoZSA8aT5TRVJWRVIyPC9pPiBhcHBsaWNhdGlvbiBpcyB0aGF0IHVzZXMgdGhlIEJhc2UgY2xhc3MgaXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vIFNFUlZFUjIgPGJyIC8+DQorI2luY2x1ZGUgInNvYXBILmgiIDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDttYWluKCkgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX3NlcnZlKHNvYXBfbmV3KCkpOyA8YnIgLz4NCit9IDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDttZXRob2QoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIEJhc2UgKm9iajEsIDxiPnN0cnVjdDwvYj4mbmJzcDttZXRob2RSZXNwb25zZSAmYW1wO3Jlc3VsdCkgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtvYmoxPHR0Pi0mZ3Q7PC90dD5wcmludCgpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtyZXN1bHQub2JqMiA9IG9iajE7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDtTT0FQX09LOyA8YnIgLz4NCit9IDxiciAvPg0KKy4uLg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorSGVyZSBhcmUgdGhlIG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IHRoZSA8aT5DTElFTlQ8L2k+IGFuZCA8aT5TRVJWRVIyPC9pPiBhcHBsaWNhdGlvbnM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjRDBEMEQwIj48dHI+PHRkPjxzcGFuIGNsYXNzPSJyb21hbiI+DQorQ0xJRU5UOiBjcmVhdGVkIGEgRGVyaXZlZCBjbGFzcyBpbnN0YW5jZSA8YnIgLz4NCitTRVJWRVIyOiBjcmVhdGVkIGEgQmFzZSBjbGFzcyBpbnN0YW5jZSA8YnIgLz4NCitTRVJWRVIyOiBwcmludCgpOiBCYXNlIGNsYXNzIGluc3RhbmNlIFggPGJyIC8+DQorQ0xJRU5UOiBjcmVhdGVkIGEgQmFzZSBjbGFzcyBpbnN0YW5jZSA8YnIgLz4NCitDTElFTlQ6IHByaW50KCk6IEJhc2UgY2xhc3MgaW5zdGFuY2UgWA0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQorSW4gdGhpcyBleGFtcGxlLCB0aGUgb2JqZWN0IHdhcyBwYXNzZWQgYXMgYSBEZXJpdmVkIGNsYXNzIGluc3RhbmNlIHRvIDxpPlNFUlZFUjI8L2k+LiBTaW5jZSA8aT5TRVJWRVIyPC9pPiBvbmx5IGltcGxlbWVudHMgdGhlIEJhc2UgY2xhc3MsIHRoaXMgb2JqZWN0IGlzIGNvbnZlcnRlZCB0byBhIEJhc2UgY2xhc3MgaW5zdGFuY2UgYW5kIHNlbmQgYmFjayB0byA8aT5DTElFTlQ8L2k+Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJICAgICAgPGg0PjxhIG5hbWU9InR0aF9zRWMxMC41LjciPg0KKzEwLjUuNzwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+WE1MIEF0dHJpYnV0ZXM8L2ZvbnQ+PC9oND48YSBuYW1lPSJzZWM6YXR0cmlidXRlcyI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgU09BUCBSUEMvTElUIGFuZCBTT0FQIERPQy9MSVQgZW5jb2Rpbmcgc3R5bGVzIHN1cHBvcnQgWE1MIGF0dHJpYnV0ZXMgaW4NCitTT0FQIG1lc3NhZ2VzIHdoaWxlIFNPQVAgUlBDIHdpdGggIlNlY3Rpb24gNSIgZW5jb2RpbmcgZG9lcyBub3Qgc3VwcG9ydCBYTUwNCithdHRyaWJ1dGVzIG90aGVyIHRoYW4gdGhlIFNPQVAgYW5kIFhTRCBzcGVjaWZpYyBhdHRyaWJ1dGVzLiBTT0FQIFJQQyAiU2VjdGlvbg0KKzUiIGVuY29kaW5nIGhhcyBhZHZhbnRhZ2VzIGZvciBjcm9zcy1sYW5ndWFnZSBpbnRlcm9wZXJhYmlsaXR5IGFuZCBkYXRhDQorZW5jb2RpbmdzIHN1Y2ggYXMgZ3JhcGggc2VyaWFsaXphdGlvbi4gSG93ZXZlciwgUlBDL0xJVCBhbmQgRE9DL0xJVCBlbmFibGVzDQorZGlyZWN0IGV4Y2hhbmdlIG9mIFhNTCBkb2N1bWVudHMsIHdoaWNoIG1heSBpbmNsdWRlIGVuY29kZWQgYXBwbGljYXRpb24gZGF0YQ0KK3N0cnVjdHVyZXMuIExhbmd1YWdlIGludGVyb3BlcmFiaWxpdHkgaXMgY29tcHJvbWlzZWQsIGJlY2F1c2Ugbm8gbWFwcGluZw0KK2JldHdlZW4gWE1MIGFuZCB0aGUgdHlwaWNhbCBsYW5ndWFnZSBkYXRhIHR5cGVzIGlzIGRlZmluZWQuIFRoZSBtZWFuaW5nIG9mIHRoZQ0KK1JQQy9MSVQgYW5kIERPQy9MSVQgWE1MIGNvbnRlbnQgaXMgU2NoZW1hIGRyaXZlbiByYXRoZXIgdGhhbg0KK2FwcGxpY2F0aW9uL2xhbmd1YWdlIGRyaXZlbi4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorZ1NPQVAgc3VwcG9ydHMgWE1MIGF0dHJpYnV0ZSAoZGUpc2VyaWFsaXphdGlvbiBvZiBtZW1iZXJzIGluIHN0cnVjdHMgYW5kIGNsYXNzZXMuDQorQXR0cmlidXRlcyBhcmUgcHJpbWl0aXZlIFhTRCB0eXBlcywgc3VjaCBhcyBzdHJpbmdzLCBlbnVtZXJhdGlvbnMsIGJvb2xlYW4sIGFuZA0KK251bWVyaWMgdHlwZXMuIFRvIGRlY2xhcmUgYW4gWE1MIGF0dHJpYnV0ZSBpbiBhIHN0cnVjdC9jbGFzcywgdGhlIHF1YWxpZmllcg0KKzxpPkA8L2k+IGlzIHVzZWQgd2l0aCB0aGUgdHlwZSBvZiB0aGUgYXR0cmlidXRlLiBUaGUgdHlwZSBtdXN0IGJlDQorcHJpbWl0aXZlIHR5cGUgKGluY2x1ZGluZyBlbnVtZXJhdGlvbnMgYW5kIHN0cmluZ3MpLCB3aGljaCBjYW4gYmUgZGVjbGFyZWQgd2l0aCBvciB3aXRob3V0DQorYSA8aT48Yj50eXBlZGVmPC9iPjwvaT4gdG8gYXNzb2NpYXRlIGEgWFNEIHR5cGUgd2l0aCB0aGUgQy9DKyB0eXBlLiAgRm9yIGV4YW1wbGUNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyp4c2RfX3N0cmluZzsgPGJyIC8+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5ib29sPC9iPiZuYnNwOyp4c2RfX2Jvb2xlYW47IDxiciAvPg0KKzxiPmVudW08L2I+Jm5ic3A7bnNfX3N0YXRlIHsgXzAsIF8xLCBfMiB9OyA8YnIgLz4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7bnNfX215U3RydWN0IDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7QHhzZF9fc3RyaW5nIG5zX190eXBlOyAvLyBlbmNvZGUgYXMgWE1MIGF0dHJpYnV0ZSAnbnM6dHlwZScgb2YgdHlwZSAneHNkOnN0cmluZycgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7QHhzZF9fYm9vbGVhbiBuc19fZmxhZyA9IGZhbHNlOyAvLyBlbmNvZGUgYXMgWE1MIGF0dHJpYnV0ZSAnbnM6ZmxhZycgb2YgdHlwZSAneHNkOmJvb2xlYW4nIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO0A8Yj5lbnVtPC9iPiZuYnNwO25zX19zdGF0ZSBuc19fc3RhdGUgPSBfMjsgLy8gZW5jb2RlIGFzIFhNTCBhdHRyaWJ1dGUgJ25zOnN0YXRlJyBvZiB0eXBlICduczpzdGF0ZScgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+c3RydWN0PC9iPiZuYnNwO25zX19teVN0cnVjdCAqbmV4dDsgPGJyIC8+DQorfTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoZSA8aT5APC9pPiBxdWFsaWZpZXIgaW5kaWNhdGVzIFhNTCBhdHRyaWJ1dGUgZW5jb2RpbmcgZm9yIHRoZQ0KKzxpPm5zX190eXBlPC9pPiwgPGk+bnNfX2ZsYWc8L2k+LCBhbmQgPGk+bnNfX3N0YXRlPC9pPiBmaWVsZHMuIE5vdGUgdGhhdCB0aGUNCituYW1lc3BhY2UgcHJlZml4IDxpPm5zPC9pPiBpcyB1c2VkIHRvIGRpc3Rpbmd1aXNoIHRoZXNlIGF0dHJpYnV0ZXMgZnJvbSBhbnkNCitvdGhlciBhdHRyaWJ1dGVzIHN1Y2ggYXMgPHR0PnhzaTp0eXBlPC90dD4gKDx0dD5uczp0eXBlPC90dD4gaXMgbm90IHRvIGJlIGNvbmZ1c2VkDQord2l0aCA8dHQ+eHNpOnR5cGU8L3R0PikuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0RlZmF1bHQgdmFsdWVzIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggYW55IGZpZWxkIHRoYXQgaGFzDQorYSBwcmltaXRpdmUgdHlwZSBpbiBhIHN0cnVjdC9jbGFzcywgYXMgaXMgaWxsdXN0cmF0ZWQgaW4gdGhpcyBleGFtcGxlLiBUaGUNCitkZWZhdWx0IHZhbHVlcyBhcmUgdXNlZCB3aGVuIHRoZSByZWNlaXZpbmcgbWVzc2FnZSBkb2VzIG5vdCBjb250YWluIHRoZQ0KK2NvcnJlc3BvbmRpbmcgdmFsdWVzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitTdHJpbmcgYXR0cmlidXRlcyBhcmUgb3B0aW9uYWwuIE90aGVyIHR5cGUgb2YgYXR0cmlidXRlcyBzaG91bGQgYmUgZGVjbGFyZWQgYXMgcG9pbnRlcnMgdG8gbWFrZSB0aGVtIG9wdGlvbmFsOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7bnNfX215U3RydWN0IDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7QDxiPmludDwvYj4mbmJzcDsqYTsgLy8gb21pdHRlZCB3aGVuIE5VTEwNCit9Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorQmVjYXVzZSBhIHJlbW90ZSBtZXRob2QgcmVxdWVzdCBhbmQgcmVzcG9uc2UgaXMgZXNzZW50aWFsbHkgYSBzdHJ1Y3QsIFhNTA0KK2F0dHJpYnV0ZXMgY2FuIGFsc28gYmUgYXNzb2NpYXRlZCB3aXRoIG1ldGhvZCByZXF1ZXN0cyBhbmQgcmVzcG9uc2VzLiBGb3INCitleGFtcGxlDQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPmludDwvYj4mbmJzcDtuc19fbXlNZXRob2QoQDxiPmNoYXI8L2I+Jm5ic3A7Km5zX19uYW1lLCAuLi4pOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorQXR0cmlidXRlcyBjYW4gYWxzbyBiZSBhdHRhY2hlZCB0byB0aGUgZHluYW1pYyBhcnJheXMsIGJpbmFyeSB0eXBlcywgYW5kIHdyYXBwZXIgY2xhc3Nlcy9zdHJ1Y3RzIG9mIHByaW1pdGl2ZQ0KK3R5cGVzLiBXcmFwcGVyIGNsYXNzZXMgYXJlIGRlc2NyaWJlZCBpbiBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzpwcmltY2xhc3MiPjEwLjIuMjwvYT4uICBGb3INCitleGFtcGxlDQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDt4c2RfX3N0cmluZyA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7Kl9faXRlbTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7QHhzZF9fYm9vbGVhbiBmbGFnOyA8YnIgLz4NCit9Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorYW5kDQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDt4c2RfX2Jhc2U2NEJpbmFyeSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnVuc2lnbmVkPC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7Kl9fcHRyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7X19zaXplOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtAeHNkX19ib29sZWFuIGZsYWc7IDxiciAvPg0KK307DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgYXR0cmlidXRlIGRlY2xhcmF0aW9ucyBNVVNUIGZvbGxvdyB0aGUgPGk+X19pdGVtPC9pPiwgPGk+X19wdHI8L2k+LCBhbmQgPGk+X19zaXplPC9pPiBmaWVsZHMNCit3aGljaCBkZWZpbmUgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiB3cmFwcGVyIHN0cnVjdHMvY2xhc3NlcyBhbmQgZHluYW1pYyBhcnJheXMuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5DYXV0aW9uPC9iPjwvZm9udD46IERvIG5vdCB1c2UgWE1MIGF0dHJpYnV0ZXMgd2l0aCBTT0FQIFJQQyBlbmNvZGluZy4gWW91IGNhbiBvbmx5IHVzZSBhdHRyaWJ1dGVzIHdpdGggUlBDIGxpdGVyYWwgZW5jb2RpbmcuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkgICAgICA8aDQ+PGEgbmFtZT0idHRoX3NFYzEwLjUuOCI+DQorMTAuNS44PC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5RTmFtZSBBdHRyaWJ1dGVzIGFuZCBFbGVtZW50czwvZm9udD48L2g0Pg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitnU09BUCBlbnN1cmVzIHRoZSBwcm9wZXIgZGVjb2Rpbmcgb2YgWFNEIFFOYW1lcy4NCitBbiBlbGVtZW50IG9yIGF0dHJpYnV0ZSB3aXRoIHR5cGUgUU5hbWUgKFF1YWxpZmllZCBOYW1lKSBjb250YWlucyBhIG5hbWVzcGFjZSBwcmVmaXggYW5kIGEgbG9jYWwgbmFtZS4NCitZb3UgY2FuIGRlY2xhcmUgYSBRTmFtZSB0eXBlIGFzIGEgPGk+PGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyp4c2RfX1FOYW1lPC9pPi4gVmFsdWVzIG9mIHR5cGUgUU5hbWUNCithcmUgaW50ZXJuYWxseSBoYW5kbGVkIGFzIHJlZ3VsYXIgc3RyaW5ncy4NCitnU09BUCB0YWtlcyBjYXJlIG9mIHRoZSBwcm9wZXIgbmFtZXNwYWNlIHByZWZpeCBtYXBwaW5ncyB3aGVuIGRlc2VyaWFsaXppbmcgUU5hbWUgdmFsdWVzLg0KK0ZvciBleGFtcGxlDQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnR5cGVkZWY8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqeHNkX19RTmFtZTsgPGJyIC8+DQorPGI+c3RydWN0PC9iPiZuYnNwO25zX19teVN0cnVjdCA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3hzZF9fUU5hbWUgZWx0ID0gIm5zOnh5eiI7IC8vIFFOYW1lIGVsZW1lbnQgd2l0aCBkZWZhdWx0IHZhbHVlICJuczp4eXoiIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO0B4c2RfX1FOYW1lIGF0dCA9ICJuczphYmMiOyAvLyBRTmFtZSBhdHRyaWJ1dGUgd2l0aCBkZWZhdWx0IHZhbHVlICJuczphYmMiIDxiciAvPg0KK307DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitXaGVuIHRoZSA8aT5lbHQ8L2k+IGFuZCA8aT5hdHQ8L2k+IGZpZWxkcyBhcmUgc2VyaWFsaXplZCwNCit0aGVpciBzdHJpbmcgY29udGVudHMgYXJlIGp1c3QgdHJhbnNtaXR0ZWQgKHdoaWNoIG1lYW5zIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGlzIHJlc3BvbnNpYmxlIHRvDQorZW5zdXJlIHByb3BlciBmb3JtYXR0aW5nIG9mIHRoZSBRTmFtZSBzdHJpbmdzIHByaW9yIHRvIHRyYW5zbWlzc2lvbikuIFdoZW4gdGhlDQorZmllbGRzIGFyZSBkZXNlcmlhbGl6ZWQgaG93ZXZlciwgZ1NPQVAgdGFrZXMgY2FyZSBtYXBwaW5nIHRoZSBxdWFsaWZpZXJzIHRvIHRoZQ0KK2FwcHJvcHJpYXRlIG5hbWVzcGFjZSBwcmVmaXhlcy4gU3VwcG9zZSB0aGF0IHRoZSBpbmJvdW5kIHZhbHVlDQorZm9yIHRoZSA8aT5lbHQ8L2k+IGlzIDx0dD54OmRlZjwvdHQ+LCB3aGVyZSB0aGUgbmFtZXNwYWNlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZQ0KK3ByZWZpeCA8dHQ+eDwvdHQ+IG1hdGNoZXMgdGhlIG5hbWVzcGFjZSBuYW1lIG9mIHRoZSBwcmVmaXggPHR0Pm5zPC90dD4gKGFzIGRlZmluZWQgaW4NCit0aGUgbmFtZXNwYWNlIG1hcHBpbmcgdGFibGUpLiBUaGVuLCB0aGUgdmFsdWUgaXMgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgaW50byA8dHQ+bnM6ZGVmPC90dD4uDQorSWYgdGhlIG5hbWVzcGFjZSBuYW1lIGlzIG5vdCBpbiB0aGUgdGFibGUsIHRoZW4NCis8dHQ+eDpkZWY8L3R0PiBpcyBjb252ZXJ0ZWQgdG8gPGk+JiMyMjA7UkkiOmRlZjwvaT4gd2hlcmUgPHR0PiYjMjIwO1JJIjwvdHQ+IGlzIHRoZSBuYW1lc3BhY2UNCitVUkkgYm91bmQgdG8gPHR0Png8L3R0PiBpbiB0aGUgbWVzc2FnZSByZWNlaXZlZC4gIFRoaXMgZW5hYmxlcyBhbiBhcHBsaWNhdGlvbiB0bw0KK3JldHJpZXZlIHRoZSBuYW1lc3BhY2UgaW5mb3JtYXRpb24sIHdoZXRoZXIgaXQgaXMgaW4gdGhlIG5hbWVzcGFjZSBtYXBwaW5nDQordGFibGUgb3Igbm90Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitOb3RlOiA8aT5RTmFtZTwvaT4gaXMgYSBwcmUtZGVmaW5lZCB0eXBlZGVmIHR5cGUgYW5kIHVzZWQgYnkgZ1NPQVAgdG8NCisoZGUpc2VyaWFsaXplIFNPQVAgRmF1bHQgY29kZXMgd2hpY2ggYXJlIFFOYW1lIGVsZW1lbnRzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJICAgICA8aDM+PGEgbmFtZT0idHRoX3NFYzEwLjYiPg0KKzEwLjY8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPlVuaW9uIFNlcmlhbGl6YXRpb248L2ZvbnQ+PC9oMz48YSBuYW1lPSJzZWM6dW5pb24iPg0KKzwvYT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorQSA8aT48Yj51bmlvbjwvYj48L2k+IGlzIG9ubHkgc2VyaWFsaXplZCBpZiB0aGUgPGk+PGI+dW5pb248L2I+PC9pPiBpcyB1c2VkIHdpdGhpbiBhDQorPGk+PGI+c3RydWN0PC9iPjwvaT4gb3IgPGk+PGI+Y2xhc3M8L2I+PC9pPiBkZWNsYXJhdGlvbiB0aGF0IGluY2x1ZGVzIGEgPGk+PGI+aW50PC9iPiZuYnNwO19fdW5pb248L2k+DQorZmllbGQgdGhhdCBhY3RzIGFzIGEgPGVtPmRpc2NyaW1pbmFudDwvZW0+IG9yIDxlbT5zZWxlY3RvcjwvZW0+IGZvciB0aGUgPGk+PGI+dW5pb248L2I+PC9pPg0KK2ZpZWxkcy4gVGhlIHNlbGVjdG9yIHN0b3JlcyBydW4tdGltZSB1c2FnZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgPGk+PGI+dW5pb248L2I+PC9pPg0KK2ZpZWxkcy4gVGhhdCBpcywgdGhlIHNlbGVjdG9yIGlzIHVzZWQgdG8gZW51bWVyYXRlIHRoZSA8aT48Yj51bmlvbjwvYj48L2k+IGZpZWxkcyBzdWNoDQordGhhdCB0aGUgZ1NPQVAgZW5naW5lIGlzIGFibGUgdG8gc2VsZWN0IHRoZSBjb3JyZWN0IDxpPjxiPnVuaW9uPC9iPjwvaT4gZmllbGQgdG8NCitzZXJpYWxpemUuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0EgPGk+PGI+dW5pb248L2I+PC9pPiB3aXRoaW4gYSA8aT48Yj5zdHJ1Y3Q8L2I+PC9pPiBvciA8aT48Yj5jbGFzczwvYj48L2k+IHdpdGggYSBzZWxlY3RvciBmaWVsZA0KK3JlcHJlc2VudHMgPHR0PnhzOmNob2ljZTwvdHQ+IHdpdGhpbiBhIFNjaGVtYSBjb21wbGV4VHlwZSBjb21wb25lbnQuIEZvciBleGFtcGxlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7bnNfX1BPIDxiciAvPg0KK3sgLi4uIH07IDxiciAvPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtuc19fSW52b2ljZSA8YnIgLz4NCit7IC4uLiB9OyA8YnIgLz4NCis8Yj51bmlvbjwvYj4mbmJzcDtuc19fUE9fb3JfSW52b2ljZSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnN0cnVjdDwvYj4mbmJzcDtuc19fUE8gcG87IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnN0cnVjdDwvYj4mbmJzcDtuc19fSW52b2ljZSBpbnZvaWNlOyA8YnIgLz4NCit9Ow0KKzxiPnN0cnVjdDwvYj4mbmJzcDtuc19fY29tcG9zaXRlIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqbmFtZTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aW50PC9iPiZuYnNwO19fdW5pb247IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnVuaW9uPC9iPiZuYnNwO25zX19QT19vcl9JbnZvaWNlIHZhbHVlOyA8YnIgLz4NCit9Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIDxpPjxiPnVuaW9uPC9iPiZuYnNwO25zX19QT19vcl9JbnZvaWNlPC9pPiBpcyBleHBhbmRlZCBhcyBhIDx0dD54czpjaG9pY2U8L3R0PjoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEIwRDAiPjx0cj48dGQ+PHR0Pg0KKyZsdDtjb21wbGV4VHlwZSBuYW1lPSJjb21wb3NpdGUmIzE4NzsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3NlcXVlbmNlJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2VsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2Nob2ljZSYjNjI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtlbGVtZW50IG5hbWU9InBvIiB0eXBlPSJuczpQTyIvJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2VsZW1lbnQgbmFtZT0iaW52b2ljZSIgdHlwZT0ibnM6SW52b2ljZSIvJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0Oy9jaG9pY2UmIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbHQ7L3NlcXVlbmNlJiM2MjsgPGJyIC8+DQorJmx0Oy9jb21wbGV4VHlwZSYjNjI7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvdHQ+DQorVGhlcmVmb3JlLCB0aGUgbmFtZSBvZiB0aGUgPGk+PGI+dW5pb248L2I+PC9pPiBhbmQgZmllbGQgY2FuIGJlIGZyZWVseSBjaG9zZW4uDQorSG93ZXZlciwgdGhlIDxpPjxiPnVuaW9uPC9iPjwvaT4gbmFtZSBzaG91bGQgYmUgcXVhbGlmaWVkIChhcyBzaG93biBpbiB0aGUgZXhhbXBsZSkgdG8NCitlbnN1cmUgaW5zdGFuY2VzIG9mIFhNTCBTY2hlbWFzIHdpdGggPHR0PmVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIjwvdHQ+IGFyZQ0KK2NvcnJlY3RseSBzZXJpYWxpemVkICg8aT5wbzwvaT4gYW5kIDxpPmludm9pY2U8L2k+IGFyZSA8dHQ+bnM6PC90dD4gcXVhbGlmaWVkKS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIDxpPjxiPmludDwvYj4mbmJzcDtfX3VuaW9uPC9pPiBmaWVsZCBzZWxlY3RvcidzIHZhbHVlcyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUNCis8aT5zb2FwY3BwMjwvaT4gY29tcGlsZXIuIEVhY2ggPGk+PGI+dW5pb248L2I+PC9pPiBmaWVsZCBuYW1lIGhhcyBhIHNlbGVjdG9yIHZhbHVlDQorZm9ybWVkIGJ5Og0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCitTT0FQX1VOSU9OXzxpPnVuaW9uLW5hbWU8L2k+XzxpPmZpZWxkLW5hbWU8L2k+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGVzZSBzZWxlY3RvciB2YWx1ZXMgZW51bWVyYXRlIHRoZSA8aT48Yj51bmlvbjwvYj48L2k+IGZpZWxkcyBzdGFydGluZyB3aXRoIDEuIFRoZQ0KK3ZhbHVlIDAgY2FuIGJlIGFzc2lnbmVkIHRvIG9taXQgdGhlIHNlcmlhbGl6YXRpb24gb2YgdGhlIDxpPjxiPnVuaW9uPC9iPjwvaT4sIGJ1dCBvbmx5DQoraWYgZXhwbGljaXRseSBhbGxvd2VkIGJ5IHZhbGlkYXRpb24gcnVsZXMsIHdoaWNoIHJlcXVpcmVzIDx0dD5taW5PY2N1cnM9IjAiPC90dD4NCitmb3IgdGhlIDx0dD54czpjaG9pY2U8L3R0PiBhcyBmb2xsb3dzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7bnNfX2NvbXBvc2l0ZSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7Km5hbWU7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmludDwvYj4mbmJzcDtfX3VuaW9uIDA7IC8vIDx0dD4mbHQ7Y2hvaWNlIG1pbk9jY3Vycz0iMCYjMTg3OzwvdHQ+IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnVuaW9uPC9iPiZuYnNwO25zX19QT19vcl9JbnZvaWNlIHZhbHVlOyA8YnIgLz4NCit9Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhpcyB3YXkgd2UgY2FuIHRyZWF0IHRoZSA8aT48Yj51bmlvbjwvYj48L2k+IGFzIGFuIG9wdGlvbmFsIGRhdGEgaXRlbSBieSBzZXR0aW5nIDxpPl9fdW5pb249MDwvaT4uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdGhlIDxpPjxiPnN0cnVjdDwvYj4mbmJzcDtuc19fY29tcG9zaXRlPC9pPiBpbnN0YW5jZSBpcw0KK2luaXRpYWxpemVkIGZvciBzZXJpYWxpemF0aW9uOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7bnNfX2NvbXBvc2l0ZSBkYXRhOyA8YnIgLz4NCitkYXRhLm5hbWUgPSAiLi4uIjsgPGJyIC8+DQorZGF0YS5fX3VuaW9uID0gU09BUF9VTklPTl9uc19fUE9fb3JfSW52b2ljZV9wbzsgLy8gc2VsZWN0IFBPIDxiciAvPg0KK2RhdGEudmFsdWUucG8ubnVtYmVyID0gLi4uOyAvLyBwb3B1bGF0ZSB0aGUgUE8NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK05vdGUgdGhhdCBmYWlsaW5nIHRvIHNldCB0aGUgc2VsZWN0b3IgdG8gYSB2YWxpZCA8aT48Yj51bmlvbjwvYj48L2k+IGZpZWxkIGNhbiBsZWFkIHRvDQorYSBjcmFzaCBvZiB0aGUgZ1NPQVAgc2VyaWFsaXplciBiZWNhdXNlIGl0IHdpbGwgYXR0ZW1wdCB0byBzZXJpYWxpemUgYW4gaW52YWxpZA0KKzxpPjxiPnVuaW9uPC9iPjwvaT4gZmllbGQuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0ZvciBkZXNlcmlhbGl6YXRpb24gb2YgPGk+PGI+dW5pb248L2I+PC9pPiB0eXBlcywgdGhlIDxpPl9fdW5pb248L2k+IHNlbGVjdG9yIHdpbGwgYmUNCitzZXIgdG8gMCAod2hlbiBwZXJtaXR0ZWQpIGJ5IHRoZSBnU09BUCBkZXNlcmlhbGl6ZXIgb3Igc2V0IHRvIG9uZSBvZiB0aGUNCis8aT48Yj51bmlvbjwvYj48L2k+IGZpZWxkIHNlbGVjdG9yIHZhbHVlcyBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBYTUwgcGF5bG9hZC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorV2hlbiBtb3JlIHRoYW4gb25lIDxpPjxiPnVuaW9uPC9iPjwvaT4gaXMgdXNlZCBpbiBhIDxpPjxiPnN0cnVjdDwvYj48L2k+IG9yIDxpPjxiPmNsYXNzPC9iPjwvaT4sIHRoZQ0KKzxpPl9fdW5pb248L2k+IHNlbGVjdG9ycyBtdXN0IGJlIHJlbmFtZWQgdG8gYXZvaWQgbmFtZSBjbGFzaGVzIGJ5IHVzaW5nDQorc3VmZml4ZXMgYXMgaW46DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtuc19fY29tcG9zaXRlIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqbmFtZTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aW50PC9iPiZuYnNwO19fdW5pb25fdmFsdWU7IC8vIGFkZGVkIHN1ZmZpeCAiX3ZhbHVlIiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj51bmlvbjwvYj4mbmJzcDtuc19fUE9fb3JfSW52b2ljZSB2YWx1ZTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aW50PC9iPiZuYnNwO19fdW5pb25fZGF0YTsgLy8gYWRkZWQgc3VmZml4ICJfZGF0YSIgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+dW5pb248L2I+Jm5ic3A7bnNfX0VtYWlsX29yX0ZheCBkYXRhOyA8YnIgLz4NCit9Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkgICAgIDxoMz48YSBuYW1lPSJ0dGhfc0VjMTAuNyI+DQorMTAuNzwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+U2VyaWFsaXppbmcgUG9pbnRlciBUeXBlczwvZm9udD48L2gzPjxhIG5hbWU9InNlYzpwb2ludGVyIj4NCis8L2E+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBzZXJpYWxpemF0aW9uIG9mIGEgcG9pbnRlciB0byBhIGRhdGEgdHlwZSBhbW91bnRzIHRvIHRoZSBzZXJpYWxpemF0aW9uIG9mDQordGhlIGRhdGEgdHlwZSBpbiBTT0FQIGFuZCB0aGUgU09BUCBlbmNvZGVkIHJlcHJlc2VudGF0aW9uIG9mIGEgcG9pbnRlciB0byB0aGUNCitkYXRhIHR5cGUgaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB0aGUgZW5jb2RlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGF0YQ0KK3R5cGUgcG9pbnRlZCB0by4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCQkgICAgICA8aDQ+PGEgbmFtZT0idHRoX3NFYzEwLjcuMSI+DQorMTAuNy4xPC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5NdWx0aS1SZWZlcmVuY2VkIERhdGE8L2ZvbnQ+PC9oND4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorQSBkYXRhIHN0cnVjdHVyZSBwb2ludGVkIHRvIGJ5IG1vcmUgdGhhbiBvbmUgcG9pbnRlciBpcyBzZXJpYWxpemVkIGFzIFNPQVANCittdWx0aS1yZWZlcmVuY2UgZGF0YS4gVGhpcyBtZWFucyB0aGF0IHRoZSBkYXRhIHdpbGwgYmUgc2VyaWFsaXplZCBvbmx5IG9uY2UgYW5kDQoraWRlbnRpZmllZCB3aXRoIGEgdW5pcXVlIDx0dD5pZDwvdHQ+IGF0dHJpYnV0ZS4gVGhlIGVuY29kaW5nIG9mIHRoZSBwb2ludGVycyB0bw0KK3RoZSBzaGFyZWQgZGF0YSBpcyBkb25lIHRocm91Z2ggdGhlIHVzZSBvZiA8dHQ+aHJlZjwvdHQ+IGF0dHJpYnV0ZXMgdG8gcmVmZXIgdG8NCit0aGUgbXVsdGktcmVmZXJlbmNlIGRhdGEgKGFsc28gc2VlIFNlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOmZsYWdzIj44LjEyPC9hPiBvbiBvcHRpb25zIHRvDQorY29udHJvbCB0aGUgc2VyaWFsaXphdGlvbiBvZiBtdWx0aS1yZWZlcmVuY2UgZGF0YSkuICBDeWNsaWMgQy9DKysgZGF0YQ0KK3N0cnVjdHVyZXMgYXJlIGVuY29kZWQgd2l0aCBtdWx0aS1yZWZlcmVuY2UgU09BUCBlbmNvZGluZy4gIENvbnNpZGVyIGZvcg0KK2V4YW1wbGUgdGhlIGZvbGxvd2luZyBhIGxpbmtlZCBsaXN0IGRhdGEgc3RydWN0dXJlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KnhzZF9fc3RyaW5nOyA8YnIgLz4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7bnNfX2xpc3Q8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3hzZF9fc3RyaW5nIHZhbHVlOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7bnNfX2xpc3QgKm5leHQ7IDxiciAvPg0KK307DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitTdXBwb3NlIGEgY3ljbGljIGxpbmtlZCBsaXN0IGlzIGNyZWF0ZWQuIFRoZSBmaXJzdCBub2RlIGNvbnRhaW5zIHRoZSB2YWx1ZSAiPHR0PmFiYzwvdHQ+IiBhbmQgcG9pbnRzIHRvIGEgbm9kZSB3aXRoIHZhbHVlDQorIjx0dD5kZWY8L3R0PiIgd2hpY2ggaW4gdHVybiBwb2ludHMgdG8gdGhlIGZpcnN0IG5vZGUuIFRoaXMgaXMgZW5jb2RlZCBhczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEIwRDAiPjx0cj48dGQ+PHR0Pg0KKyZsdDtuczpsaXN0IGlkPSIxIiB4c2k6dHlwZT0ibnM6bGlzdCImIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbHQ7dmFsdWUgeHNpOnR5cGU9InhzZDpzdHJpbmciJiM2MjthYmMmbHQ7L3ZhbHVlJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O25leHQgeHNpOnR5cGU9Im5zOmxpc3QiJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3ZhbHVlIHhzaTp0eXBlPSJ4c2Q6c3RyaW5nIiYjNjI7ZGVmJmx0Oy92YWx1ZSYjNjI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtuZXh0IGhyZWY9IiMxIi8mIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbHQ7L25leHQmIzYyOyA8YnIgLz4NCismbHQ7L25zOmxpc3QmIzYyOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3R0Pg0KK0luIGNhc2UgbXVsdGktcmVmZXJlbmNlZCBkYXRhIGlzIHJlY2VpdmVkIHRoYXQgImRvZXMgbm90IGZpdCBpbiBhIHBvaW50ZXItYmFzZWQgc3RydWN0dXJlIiwgdGhlIGRhdGEgaXMgY29waWVkLg0KK0ZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHR3byA8aT48Yj5zdHJ1Y3Q8L2I+PC9pPnMgYXJlIHNpbWlsYXIsIGV4Y2VwdCB0aGF0IHRoZSBmaXJzdCB1c2VzIHBvaW50ZXItYmFzZWQgZmllbGRzIHdoaWxlIHRoZSBvdGhlciB1c2VzDQorbm9uLXBvaW50ZXItYmFzZWQgZmllbGRzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmxvbmc8L2I+Jm5ic3A7eHNkX19pbnQ7IDxiciAvPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtuc19fcmVjb3JkIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eHNkX19pbnQgKmE7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3hzZF9faW50ICpiOyA8YnIgLz4NCit9IFA7IDxiciAvPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtuc19fcmVjb3JkPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt4c2RfX2ludCBhOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt4c2RfX2ludCBiOyA8YnIgLz4NCit9IFI7IDxiciAvPg0KKy4uLiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtQLmEgPSAmYW1wO247IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO1AuYiA9ICZhbXA7bjsgPGJyIC8+DQorLi4uDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitTaW5jZSBib3RoIDxpPmE8L2k+IGFuZCA8aT5iPC9pPiBmaWVsZHMgb2YgPGk+UDwvaT4gcG9pbnQgdG8gdGhlIHNhbWUgaW50ZWdlciwgdGhlIGVuY29kaW5nIG9mIDxpPlA8L2k+IGlzIG11bHRpLXJlZmVyZW5jZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEIwRDAiPjx0cj48dGQ+PHR0Pg0KKyZsdDtuczpyZWNvcmQgeHNpOnR5cGU9Im5zOnJlY29yZCImIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbHQ7YSBocmVmPSIjMSIvJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2IgaHJlZj0iIzEiLyYjNjI7IDxiciAvPg0KKyZsdDsvbnM6cmVjb3JkJiM2MjsgPGJyIC8+DQorJmx0O2lkIGlkPSIxIiB4c2k6dHlwZT0ieHNkOmludCImIzYyOzEyMyZsdDsvaWQmIzYyOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3R0Pg0KK05vdywgdGhlIGRlY29kaW5nIG9mIHRoZSBjb250ZW50IGluIHRoZSA8aT5SPC9pPiBkYXRhIHN0cnVjdHVyZSB0aGF0IGRvZXMgbm90IHVzZSBwb2ludGVycyB0byBpbnRlZ2VycyByZXN1bHRzIGluIGEgY29weSBvZiBlYWNoDQorbXVsdGktcmVmZXJlbmNlIGludGVnZXIuICBOb3RlIHRoYXQgdGhlIHR3byA8aT48Yj5zdHJ1Y3Q8L2I+PC9pPnMgcmVzZW1ibGUgdGhlIHNhbWUgWE1MIGRhdGEgdHlwZSBiZWNhdXNlIHRoZSB0cmFpbGluZyB1bmRlcnNjb3JlIHdpbGwgYmUNCitpZ25vcmVkIGluIFhNTCBlbmNvZGluZyBhbmQgZGVjb2RpbmcuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkJICAgICAgPGg0PjxhIG5hbWU9InR0aF9zRWMxMC43LjIiPg0KKzEwLjcuMjwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+TlVMTCBQb2ludGVycyBhbmQgTmlsIEVsZW1lbnRzPC9mb250PjwvaDQ+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0EgPGk+TlVMTDwvaT4gcG9pbnRlciBpcyA8Yj5ub3Q8L2I+IHNlcmlhbGl6ZWQsIHVubGVzcyB0aGUgcG9pbnRlciBpdHNlbGYgaXMgcG9pbnRlZCB0byBieSBhbm90aGVyIHBvaW50ZXIgKGJ1dCBzZWUNCitTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzpmbGFncyI+OC4xMjwvYT4gdG8gY29udHJvbCB0aGUgc2VyaWFsaXphdGlvbiBvZiBOVUxMcykuDQorRm9yIGV4YW1wbGU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtYIDxiciAvPg0KK3s8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7KnA7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmludDwvYj4mbmJzcDsqKnE7IDxiciAvPg0KK30NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1N1cHBvc2UgcG9pbnRlciA8aT5xPC9pPiBwb2ludHMgdG8gcG9pbnRlciA8aT5wPC9pPiBhbmQgc3VwcG9zZSA8aT5wPU5VTEw8L2k+Lg0KK0luIHRoYXQgY2FzZSB0aGUgPGk+cDwvaT4gcG9pbnRlciBpcyBzZXJpYWxpemVkIGFzDQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBCMEQwIj48dHI+PHRkPjx0dD4NCismbHQ7Li4uIGlkPSIxMjMiIHhzaTpuaWw9InRydWUiLyYjNjI7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvdHQ+DQorYW5kIHRoZSBzZXJpYWxpemF0aW9uIG9mIDxpPnE8L2k+IHJlZmVycyB0byA8dHQ+aHJlZj0iIzEyMyI8L3R0Pi4NCitOb3RlIHRoYXQgU09BUCAxLjEgZG9lcyBub3Qgc3VwcG9ydA0KK3BvaW50ZXIgdG8gcG9pbnRlciB0eXBlcyAoISksIHNvIHRoaXMgZW5jb2RpbmcgaXMgc3BlY2lmaWMgdG8gZ1NPQVAuIFRoZSBwb2ludGVyIHRvIHBvaW50ZXIgZW5jb2RpbmcgaXMgcmFyZWx5IHVzZWQgaW4gY29kZXMNCithbnl3YXkuICBNb3JlIGNvbW1vbiBpcyBhIHBvaW50ZXIgdG8gYSBkYXRhIHR5cGUgc3VjaCBhcyBhIDxpPjxiPnN0cnVjdDwvYj48L2k+IHdpdGggcG9pbnRlciBmaWVsZHMuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5DYXV0aW9uPC9iPjwvZm9udD46IFdoZW4gdGhlIGRlc2VyaWFsaXplciBlbmNvdW50ZXJzIGFuIFhNTCBlbGVtZW50IHRoYXQgaGFzIGEgPHR0PnhzaTpuaWw9InRydWUiPC90dD4gYXR0cmlidXRlIGJ1dCB0aGUgY29ycmVzcG9uZGluZyBDKysgZGF0YSBpcyBub3QgYSBwb2ludGVyIG9yIHJlZmVyZW5jZSwNCit0aGUgZGVzZXJpYWxpemVyIHdpbGwgdGVybWluYXRlIHdpdGggYSA8aT5TT0FQX05VTEw8L2k+IGZhdWx0IHdoZW4gdGhlIDxpPlNPQVBfWE1MX1NUUklDVDwvaT4gZmxhZyBpcyBzZXQuDQorVGhlIHR5cGVzIHNlY3Rpb24gb2YgYSBXU0RMIGRlc2NyaXB0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSAibmlsYWJpbGl0eSIgb2YgZGF0YS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCQkgICAgIDxoMz48YSBuYW1lPSJ0dGhfc0VjMTAuOCI+DQorMTAuODwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+Vm9pZCBQb2ludGVyczwvZm9udD48L2gzPjxhIG5hbWU9InNlYzp2b2lkIj4NCis8L2E+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0luIGdlbmVyYWwsIHZvaWQgcG9pbnRlcnMgKDxpPjxiPnZvaWQ8L2I+KjwvaT4pIGNhbm5vdCBiZSAoZGUpc2VyaWFsaXplZCBiZWNhdXNlIHRoZQ0KK3R5cGUgb2YgZGF0YSByZWZlcnJlZCB0byBpcyB1bnR5cGVkLiAgVG8gZW5hYmxlIHRoZSAoZGUpc2VyaWFsaXphdGlvbiBvZiB0aGUNCit2b2lkIHBvaW50ZXJzIHRoYXQgYXJlIG1lbWJlcnMgb2Ygc3RydWN0cyBvciBjbGFzc2VzLCB5b3UgY2FuIGluc2VydCBhDQorPGk+PGI+aW50PC9iPiZuYnNwO19fdHlwZTwvaT4gZmllbGQgcmlnaHQgYmVmb3JlIHRoZSB2b2lkIHBvaW50ZXIgZmllbGQuICBUaGUgPGk+PGI+aW50PC9iPiZuYnNwO19fDQordHlwZTwvaT4gZmllbGQgY29udGFpbnMgcnVuIHRpbWUgaW5mb3JtYXRpb24gb24gdGhlIHR5cGUgb2YgdGhlIGRhdGEgcG9pbnRlZCB0byBieQ0KKzxpPjxiPnZvaWQ8L2I+KjwvaT4gbWVtYmVyIGluIGEgc3RydWN0L2NsYXNzIHRvIGVuYWJsZSB0aGUgKGRlKXNlcmlhbGl6YXRpb24gb2YgdGhpcw0KK2RhdGEuICBUaGUgPGk+PGI+aW50PC9iPiZuYnNwO19fdHlwZTwvaT4gZmllbGQgaXMgc2V0IHRvIGEgPGk+U09BUF9UWVBFX1g8L2k+IHZhbHVlLCB3aGVyZSA8aT5YPC9pPiBpcyB0aGUgbmFtZSBvZiBhIHR5cGUuICBnU09BUCBnZW5lcmF0ZXMgdGhlIDxpPlNPQVBfVFlQRV9YPC9pPiBkZWZpbml0aW9ucyBpbiA8aT5zb2FwSC5oPC9pPiBhbmQgdXNlcyB0aGVtIGludGVybmFsbHkgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhlIHR5cGUgb2YgZWFjaCBvYmplY3QuDQorVGhlIHR5cGUgbmFtaW5nIGNvbnZlbnRpb25zIG91dGxpbmVkIGluDQorU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6c2VyaWFsaXplIj43LjUuMTwvYT4gYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG5hbWUgZm9yIDxpPlg8L2k+Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitIZXJlIGlzIGFuIGV4YW1wbGUgdG8gaWxsdXN0cmF0ZSB0aGUgKGRlKXNlcmlhbGl6YXRpb24gb2YgYSA8aT48Yj52b2lkPC9iPio8L2k+IGZpZWxkIGluIGEgc3RydWN0Og0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7bXlTdHJ1Y3QgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7X190eXBlOyAvLyB0aGUgU09BUF9UWVBFIHBvaW50ZWQgdG8gYnkgcCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj52b2lkPC9iPiZuYnNwOypwOyA8YnIgLz4NCit9Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIDxpPl9fdHlwZTwvaT4gaW50ZWdlciBjYW4gYmUgc2V0IHRvIDAgYXQgcnVuIHRpbWUgdG8gb21pdCB0aGUgc2VyaWFsaXphdGlvbg0KK29mIHRoZSB2b2lkIHBvaW50ZXIgZmllbGQuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbGx1c3RyYXRlcyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgPGk+bXlTdHJ1Y3Q8L2k+IHdpdGggYQ0KK3ZvaWQgcG9pbnRlciB0byBhbiBpbnQ6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtteVN0cnVjdCBTOyA8YnIgLz4NCis8Yj5pbnQ8L2I+Jm5ic3A7bjsgPGJyIC8+DQorUy5wID0gJmFtcDtuOyA8YnIgLz4NCitTLl9fdHlwZSA9IFNPQVBfVFlQRV9pbnQ7IDxiciAvPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIHNlcmlhbGl6ZWQgb3V0cHV0IG9mIDxpPlM8L2k+IGNvbnRhaW5zIHRoZSBpbnRlZ2VyLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgZGVzZXJpYWxpemVyIGZvciA8aT5teVN0cnVjdDwvaT4gd2lsbCBhdXRvbWF0aWNhbGx5IHNldCB0aGUgPGk+X190eXBlPC9pPg0KK2ZpZWxkIGFuZCB2b2lkIHBvaW50ZXIgdG8gdGhlIGRlc2VyaWFsaXplZCBkYXRhLCBwcm92aWRlZCB0aGF0IHRoZSBYTUwgY29udGVudA0KK2ZvciA8aT5wPC9pPiBjYXJyaWVzIHRoZSA8dHQ+eHNpOnR5cGU8L3R0PiBhdHRyaWJ1dGUgZnJvbSB3aGljaCBnU09BUCBjYW4gZGV0ZXJtaW5lDQordGhlIHR5cGUuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5JbXBvcnRhbnQ8L2I+PC9mb250Pjogd2hlbiAoZGUpc2VyaWFsaXppbmcgc3RyaW5ncyB2aWEgYSA8aT48Yj52b2lkPC9iPio8L2k+IGZpZWxkLCB0aGUgPGk+PGI+dm9pZDwvYj4qPC9pPiBwb2ludGVyIE1VU1QgZGlyZWN0bHkgcG9pbnQgdG8gdGhlIHN0cmluZyB2YWx1ZSByYXRoZXIgdGhhbiBpbmRpcmVjdGx5IGFzIHdpdGggYWxsIG90aGVyIHR5cGVzLiBGb3IgZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+c3RydWN0PC9iPiZuYnNwO215U3RydWN0IFM7IDxiciAvPg0KK1MucCA9ICg8Yj52b2lkPC9iPiopIkhlbGxvIjsgPGJyIC8+DQorUy5fX3R5cGUgPSBTT0FQX1RZUEVfc3RyaW5nOyA8YnIgLz4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoaXMgaXMgdGhlIGNhc2UgZm9yIGFsbCBzdHJpbmctYmFzZWQgdHlwZXMsIGluY2x1ZGluZyB0eXBlcyBkZWZpbmVkIHdpdGggPGk+PGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5jaGFyPC9iPio8L2k+Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitZb3UgbWF5IHVzZSBhbiBhcmJpdHJhcnkgc3VmZml4IHdpdGggdGhlIDxpPl9fdHlwZTwvaT4gZmllbGRzIHRvIGhhbmRsZQ0KK211bHRpcGxlIHZvaWQgcG9pbnRlcnMgaW4gc3RydWN0cy9jbGFzc2VzLiAgRm9yIGV4YW1wbGUNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+c3RydWN0PC9iPiZuYnNwO215U3RydWN0IDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aW50PC9iPiZuYnNwO19fdHlwZU9mcDsgLy8gdGhlIFNPQVBfVFlQRSBwb2ludGVkIHRvIGJ5IHAgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+dm9pZDwvYj4mbmJzcDsqcDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aW50PC9iPiZuYnNwO19fdHlwZU9mcTsgLy8gdGhlIFNPQVBfVFlQRSBwb2ludGVkIHRvIGJ5IHEgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+dm9pZDwvYj4mbmJzcDsqcTsgPGJyIC8+DQorfTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK0JlY2F1c2Ugc2VydmljZSBtZXRob2QgcGFyYW1ldGVycyBhcmUgc3RvcmVkIHdpdGhpbiBzdHJ1Y3RzLCB5b3UgY2FuIHVzZQ0KKzxpPl9fdHlwZTwvaT4gYW5kIDxpPjxiPnZvaWQ8L2I+KjwvaT4gcGFyYW1ldGVycyB0byBwYXNzIHBvbHltb3JwaGljIGFyZ3VtZW50cyB3aXRob3V0DQoraGF2aW5nIHRvIGRlZmluZSBhIEMrKyBjbGFzcyBoaWVyYXJjaHkgKFNlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOnBvbHltb3JwaCI+MTAuNS42PC9hPikuICBGb3INCitleGFtcGxlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KnhzZF9fc3RyaW5nOyA8YnIgLz4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmludDwvYj4mbmJzcDt4c2RfX2ludDsgPGJyIC8+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5mbG9hdDwvYj4mbmJzcDt4c2RfX2Zsb2F0OyA8YnIgLz4NCis8Yj5lbnVtPC9iPiZuYnNwO25zX19zdGF0dXMgeyBvbiwgb2ZmIH07IDxiciAvPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtuc19fd2lkZ2V0IHsgeHNkX19zdHJpbmcgbmFtZTsgeHNkX19pbnQgcGFydDsgfTsNCis8Yj5pbnQ8L2I+Jm5ic3A7bnNfX215TWV0aG9kKDxiPmludDwvYj4mbmJzcDtfX3R5cGUsIDxiPnZvaWQ8L2I+Jm5ic3A7KmRhdGEsIDxiPnN0cnVjdDwvYj4mbmJzcDtuc19fbXlNZXRob2RSZXNwb25zZSB7IDxiPmludDwvYj4mbmJzcDtfX3R5cGU7IDxiPnZvaWQ8L2I+Jm5ic3A7KnJldHVybl87IH0gKm91dCk7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGlzIG1ldGhvZCBoYXMgYSBwb2x5bW9ycGhpYyBpbnB1dCBwYXJhbWV0ZXIgPGk+ZGF0YTwvaT4gYW5kIGEgcG9seW1vcnBoaWMNCitvdXRwdXQgcGFyYW1ldGVyIDxpPnJldHVybl88L2k+LiAgVGhlIDxpPl9fdHlwZTwvaT4gcGFyYW1ldGVycyBjYW4gYmUgb25lIG9mDQorPGk+U09BUF9UWVBFX3hzZF9fc3RyaW5nPC9pPiwgPGk+U09BUF9UWVBFX3hzZF9faW50PC9pPiwNCis8aT5TT0FQX1RZUEVfeHNkX19mbG9hdDwvaT4sIDxpPlNPQVBfVFlQRV9uc19fc3RhdHVzPC9pPiwgb3INCis8aT5TT0FQX1RZUEVfbnNfX3dpZGdldDwvaT4uICBUaGUgV1NETCBwcm9kdWNlZCBieSB0aGUgZ1NPQVAgY29tcGlsZXINCitkZWNsYXJlcyB0aGUgcG9seW1vcnBoaWMgcGFyYW1ldGVycyBvZiB0eXBlIDx0dD54c2Q6YW55VHlwZTwvdHQ+IHdoaWNoIGlzICJ0b28NCitsb29zZSIgYW5kIGRvZXNuJ3QgYWxsb3cgdGhlIGdTT0FQIGltcG9ydGVyIHRvIGhhbmRsZSB0aGUgV1NETCBhY2N1cmF0ZWx5Lg0KK0Z1dHVyZSBnU09BUCByZWxlYXNlcyBtaWdodCByZXBsYWNlIDx0dD54c2Q6YW55VHlwZTwvdHQ+IHdpdGggYSA8dHQ+Y2hvaWNlPC90dD4NCitzY2hlbWEgdHlwZSB0aGF0IGxpbWl0cyB0aGUgY2hvaWNlIG9mIHR5cGVzIHRvIHRoZSB0eXBlcyBkZWNsYXJlZCBpbiB0aGUNCitoZWFkZXIgZmlsZS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCSAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWMxMC45Ij4NCisxMC45PC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5GaXhlZC1TaXplIEFycmF5czwvZm9udD48L2gzPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitGaXhlZCBzaXplIGFycmF5cyBhcmUgZW5jb2RlZCBhcyBwZXIgU09BUCAxLjEgb25lLWRpbWVuc2lvbmFsIGFycmF5IHR5cGVzLg0KK011bHRpLWRpbWVuc2lvbmFsIGZpeGVkIHNpemUgYXJyYXlzIGFyZSBlbmNvZGVkIGJ5IGdTT0FQIGFzIG5lc3RlZA0KK29uZS1kaW1lbnNpb25hbCBhcnJheXMgaW4gU09BUC4gIEVuY29kaW5nIG9mIGZpeGVkIHNpemUgYXJyYXlzIHN1cHBvcnRzDQorcGFydGlhbGx5IHRyYW5zbWl0dGVkIGFuZCBzcGFyc2UgYXJyYXkgU09BUCBmb3JtYXRzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgZGVjb2Rpbmcgb2YgKG11bHRpLWRpbWVuc2lvbmFsKSBmaXhlZC1zaXplIGFycmF5cyBzdXBwb3J0cyB0aGUgU09BUCBtdWx0aS1kaW1lbnNpb25hbCBhcnJheSBmb3JtYXQgYXMgd2VsbCBhcyBwYXJ0aWFsbHkgdHJhbnNtaXR0ZWQgYW5kIHNwYXJzZSBhcnJheSBmb3JtYXRzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitBbiBleGFtcGxlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisvLyBDb250ZW50cyBvZiBoZWFkZXIgZmlsZSAiZml4ZWQuaCI6IDxiciAvPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtFeGFtcGxlIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+ZmxvYXQ8L2I+Jm5ic3A7YVsyXVszXTsgPGJyIC8+DQorfTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoaXMgc3BlY2lmaWVzIGEgZml4ZWQtc2l6ZSBhcnJheSBwYXJ0IG9mIHRoZSA8aT48Yj5zdHJ1Y3Q8L2I+Jm5ic3A7RXhhbXBsZTwvaT4uIFRoZSBlbmNvZGluZyBvZiBhcnJheSA8aT5hPC9pPiBpczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEIwRDAiPjx0cj48dGQ+PHR0Pg0KKyZsdDthIHhzaTp0eXBlPSJTT0FQLUVOQzpBcnJheSIgU09BUC1FTkM6YXJyYXlUeXBlPSJmbG9hdFtdWzJdIiYjNjI7IDxiciAvPg0KKyZsdDtTT0FQLUVOQzpBcnJheSB4c2k6dHlwZT0iU09BUC1FTkM6QXJyYXkiIFNPQVAtRU5DOmFycmF5VHlwZT0iZmxvYXRbM10iIDxiciAvPg0KKyZsdDtmbG9hdCB4c2k6dHlwZT0iZmxvYXQiJiM2MjsuLi4mbHQ7L2Zsb2F0JiM2MjsgPGJyIC8+DQorJmx0O2Zsb2F0IHhzaTp0eXBlPSJmbG9hdCImIzYyOy4uLiZsdDsvZmxvYXQmIzYyOyA8YnIgLz4NCismbHQ7ZmxvYXQgeHNpOnR5cGU9ImZsb2F0IiYjNjI7Li4uJmx0Oy9mbG9hdCYjNjI7IDxiciAvPg0KKyZsdDsvU09BUC1FTkM6QXJyYXkmIzYyOyA8YnIgLz4NCismbHQ7U09BUC1FTkM6QXJyYXkgeHNpOnR5cGU9IlNPQVAtRU5DOkFycmF5IiBTT0FQLUVOQzphcnJheVR5cGU9ImZsb2F0WzNdIiA8YnIgLz4NCismbHQ7ZmxvYXQgeHNpOnR5cGU9ImZsb2F0IiYjNjI7Li4uJmx0Oy9mbG9hdCYjNjI7IDxiciAvPg0KKyZsdDtmbG9hdCB4c2k6dHlwZT0iZmxvYXQiJiM2MjsuLi4mbHQ7L2Zsb2F0JiM2MjsgPGJyIC8+DQorJmx0O2Zsb2F0IHhzaTp0eXBlPSJmbG9hdCImIzYyOy4uLiZsdDsvZmxvYXQmIzYyOyA8YnIgLz4NCismbHQ7L1NPQVAtRU5DOkFycmF5JiM2MjsgPGJyIC8+DQorJmx0Oy9hJiM2MjsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC90dD4NCis8Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+Q2F1dGlvbjwvYj48L2ZvbnQ+OiBBbnkgZGVjb2RlZCBwYXJ0cyBvZiBhIChtdWx0aS1kaW1lbnNpb25hbCkgYXJyYXkgdGhhdCBkbyBub3QgImZpdCIgaW4gdGhlIGZpeGVkIHNpemUgYXJyYXkgYXJlIGlnbm9yZWQgYnkgdGhlIGRlc2VyaWFsaXplci4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCSAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWMxMC4xMCI+DQorMTAuMTA8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPkR5bmFtaWMgQXJyYXlzPC9mb250PjwvaDM+PGEgbmFtZT0ic2VjOmR5bmFycmF5Ij4NCis8L2E+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0FzIHRoZSBuYW1lIHN1Z2dlc3RzLCBkeW5hbWljIGFycmF5cyBhcmUgbXVjaCBtb3JlIGZsZXhpYmxlIHRoYW4gZml4ZWQtc2l6ZQ0KK2FycmF5cyBhbmQgZHluYW1pYyBhcnJheXMgYXJlIGJldHRlciBhZGFwdGFibGUgdG8gdGhlIFNPQVAgZW5jb2RpbmcgYW5kIGRlY29kaW5nDQorcnVsZXMgZm9yIGFycmF5cy4gIEluIGFkZGl0aW9uLCBhIHR5cGljYWwgQyBhcHBsaWNhdGlvbiBhbGxvY2F0ZXMgYSBkeW5hbWljDQorYXJyYXkgdXNpbmcgPGk+bWFsbG9jPC9pPiwgYXNzaWducyB0aGUgbG9jYXRpb24gdG8gYSBwb2ludGVyIHZhcmlhYmxlLCBhbmQNCitkZWFsbG9jYXRlcyB0aGUgYXJyYXkgbGF0ZXIgd2l0aCA8aT5mcmVlPC9pPi4gIEEgdHlwaWNhbCBDKysgYXBwbGljYXRpb24NCithbGxvY2F0ZXMgYSBkeW5hbWljIGFycmF5IHVzaW5nIDxpPm5ldzwvaT4sIGFzc2lnbnMgdGhlIGxvY2F0aW9uIHRvIGEgcG9pbnRlcg0KK3ZhcmlhYmxlLCBhbmQgZGVhbGxvY2F0ZXMgdGhlIGFycmF5IGxhdGVyIHdpdGggPGk+ZGVsZXRlPC9pPi4gIFN1Y2ggZHluYW1pYw0KK2FsbG9jYXRpb25zIGFyZSBmbGV4aWJsZSwgYnV0IHBvc2UgYSBwcm9ibGVtIGZvciB0aGUgc2VyaWFsaXphdGlvbiBvZiBkYXRhOiBob3cNCitkb2VzIHRoZSBhcnJheSBzZXJpYWxpemVyIGtub3cgdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkgdG8gYmUgc2VyaWFsaXplZCBnaXZlbg0KK29ubHkgYSBwb2ludGVyIHRvIHRoZSBzZXF1ZW5jZSBvZiBlbGVtZW50cz8gIFRoZSBhcHBsaWNhdGlvbiBzdG9yZXMgdGhlIHNpemUNCitpbmZvcm1hdGlvbiBzb21ld2hlcmUuIFRoaXMgaW5mb3JtYXRpb24gaXMgY3J1Y2lhbCBmb3IgdGhlIGFycmF5IHNlcmlhbGl6ZXIgYW5kDQoraGFzIHRvIGJlIG1hZGUgZXhwbGljaXRseSBrbm93biB0byB0aGUgYXJyYXkgc2VyaWFsaXplciBieSBwYWNrYWdpbmcgdGhlDQorcG9pbnRlciBhbmQgYXJyYXkgc2l6ZSBpbmZvcm1hdGlvbiB3aXRoaW4gYSA8aT48Yj5zdHJ1Y3Q8L2I+PC9pPiBvciA8aT48Yj5jbGFzczwvYj48L2k+Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJCSAgICAgIDxoND48YSBuYW1lPSJ0dGhfc0VjMTAuMTAuMSI+DQorMTAuMTAuMTwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+U09BUCBBcnJheSBCb3VuZHMgTGltaXRzPC9mb250PjwvaDQ+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1NPQVAgZW5jb2RlZCBhcnJheXMgdXNlIHRoZSA8dHQ+U09BUC1FTkM6QXJyYXk8L3R0PiB0eXBlIGFuZCB0aGUgPHR0PlNPQVAtRU5DOmFycmF5VHlwZTwvdHQ+IGF0dHJpYnV0ZSB0byBkZWZpbmUgdGhlIGFycmF5IGRpbWVuc2lvbmFsaXR5IGFuZCBzaXplLiBBcyBhIHNlY3VyaXR5IG1lYXN1cmUgdG8gYXZvaWQgZGVuaWFsIG9mIHNlcnZpY2UgYXR0YWNrcyBiYXNlZCBvbiBzZW5kaW5nIGEgaHVnZSBhcnJheSBzaXplIHZhbHVlIHJlcXVpcmluZyB0aGUgYWxsb2NhdGlvbiBvZiBsYXJnZSBjaHVua3Mgb2YgbWVtb3J5LCB0aGUgdG90YWwgbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzIHNldCBieSB0aGUgPHR0PlNPQVAtRU5DOmFycmF5VHlwZTwvdHQ+IGF0dHJpYnV0ZSBjYW5ub3QgZXhjZWVkIDxpPlNPQVBfTUFYQVJSQVlTSVpFPC9pPiwgd2hpY2ggaXMgc2V0IHRvIDEwMCwwMDAgYnkgZGVmYXVsdC4gVGhpcyBjb25zdGFudCBpcyBkZWZpbmVkIGluIDxpPnN0ZHNvYXAyLmg8L2k+LiBUaGlzIGNvbnN0YW50IDxiPm9ubHk8L2I+IGFmZmVjdHMgbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIGFuZCB0aGUgZGltZW5zaW9uYWxpdHkgb2YgdGhlIHJlY2VpdmluZyBhcnJheSB3aWxsIGJlIGxvc3Qgd2hlbiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGV4Y2VlZHMgMTAwLDAwMC4gT25lLWRpbWVuc2lvbmFsIGFycmF5cyB3aWxsIGJlIHBvcHVsYXRlZCBpbiBzZXF1ZW50aWFsIG9yZGVyIGFzIGV4cGVjdGVkLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJCSAgICAgIDxoND48YSBuYW1lPSJ0dGhfc0VjMTAuMTAuMiI+DQorMTAuMTAuMjwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+T25lLURpbWVuc2lvbmFsIER5bmFtaWMgQXJyYXlzPC9mb250PjwvaDQ+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0Egc3BlY2lhbCBmb3JtIG9mIDxpPjxiPnN0cnVjdDwvYj48L2k+IG9yIDxpPjxiPmNsYXNzPC9iPjwvaT4gaXMgdXNlZCBmb3Igb25lLWRpbWVuc2lvbmFsDQorZHluYW1pYyBhcnJheXMgdGhhdCBjb250YWlucyBhIHBvaW50ZXIgdmFyaWFibGUgYW5kIGEgZmllbGQgdGhhdCByZWNvcmRzIHRoZQ0KK251bWJlciBvZiBlbGVtZW50cyB0aGUgcG9pbnRlciBwb2ludHMgdG8gaW4gbWVtb3J5Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgZ2VuZXJhbCBmb3JtIG9mIHRoZSA8aT48Yj5zdHJ1Y3Q8L2I+PC9pPiBkZWNsYXJhdGlvbiBmb3Igb25lLWRpbWVuc2lvbmFsIGR5bmFtaWMgU09BUCBhcnJheXMgaXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtzb21lX25hbWUgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8dT48c3BhbiBjbGFzcz0icm9tYW4iPlR5cGU8L3NwYW4+PC91PiAqX19wdHI7IC8vIHBvaW50ZXIgdG8gYXJyYXkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aW50PC9iPiZuYnNwO19fc2l6ZTsgLy8gbnVtYmVyIG9mIGVsZW1lbnRzIHBvaW50ZWQgdG8gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+PGI+c3RhdGljPC9iPiZuYnNwOzxiPmNvbnN0PC9iPjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PiA8Yj5pbnQ8L2I+Jm5ic3A7X19vZmZzZXQgPGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+Wzwvc3Bhbj48L2ZvbnQ+PSAuLi48Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD47PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+IC8vIG9wdGlvbmFsIFNPQVAgMS4xIGFycmF5IG9mZnNldCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsuLi4gLy8gYW55dGhpbmcgdGhhdCBmb2xsb3dzIGhlcmUgd2lsbCBiZSBpZ25vcmVkIDxiciAvPg0KK307DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCit3aGVyZSA8aT48dT48c3BhbiBjbGFzcz0icm9tYW4iPlR5cGU8L3NwYW4+PC91PjwvaT4gTVVTVCBiZSBhIHR5cGUgYXNzb2NpYXRlZCB3aXRoIGFuIFhNTCBTY2hlbWEgb3IgTVVTVCBiZSBhIHByaW1pdGl2ZSB0eXBlLg0KK0lmIHRoZXNlIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXQsIGEgdmVjdG9yLWxpa2UgWE1MIChkZSlzZXJpYWxpemF0aW9uIGlzIHVzZWQgKHNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzpsaXN0Ij4xMC4xMC43PC9hPikuDQorQSBwcmltaXRpdmUgdHlwZSBjYW4gYmUgdXNlZCB3aXRoIG9yIHdpdGhvdXQgYSA8aT48Yj50eXBlZGVmPC9iPjwvaT4uDQorSWYgdGhlIGFycmF5IGVsZW1lbnRzIGFyZSBzdHJ1Y3RzIG9yIGNsYXNzZXMsIHRoZW4gdGhlIDxpPnN0cnVjdDwvaT4vPGk+Y2xhc3M8L2k+IHR5cGUgbmFtZXMgc2hvdWxkIGhhdmUgYSBuYW1lc3BhY2UgcHJlZml4IGZvciBzY2hlbWENCithc3NvY2lhdGlvbiwgb3IgdGhleSBzaG91bGQgYmUgb3RoZXIgKG5lc3RlZCkgZHluYW1pYyBhcnJheXMuIA0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitBbiBhbHRlcm5hdGl2ZSB0byBhIDxpPjxiPnN0cnVjdDwvYj48L2k+IGlzIHRvIHVzZSBhIDxpPjxiPmNsYXNzPC9iPjwvaT4gd2l0aCBvcHRpb25hbCBtZXRob2RzIHRoYXQgTVVTVCBhcHBlYXIgYWZ0ZXIgdGhlIDxpPl9fcHRyPC9pPiBhbmQNCis8aT5fX3NpemU8L2k+IGZpZWxkczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7c29tZV9uYW1lIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cHVibGljPC9iPjogPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PHU+PHNwYW4gY2xhc3M9InJvbWFuIj5UeXBlPC9zcGFuPjwvdT4gKl9fcHRyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7X19zaXplOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD48Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD48Yj5zdGF0aWM8L2I+Jm5ic3A7PGI+Y29uc3Q8L2I+PGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+IDxiPmludDwvYj4mbmJzcDtfX29mZnNldCA8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD49IC4uLjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250Pjs8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5dPC9zcGFuPjwvZm9udD4gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7bWV0aG9kMTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7bWV0aG9kMjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Li4uIC8vIGFueSBmaWVsZHMgdGhhdCBmb2xsb3cgd2lsbCBiZSBpZ25vcmVkIDxiciAvPg0KK307DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUbyBlbmNvZGUgdGhlIGRhdGEgdHlwZSBhcyBhbiBhcnJheSwgdGhlIG5hbWUgb2YgdGhlIDxpPjxiPnN0cnVjdDwvYj48L2k+IG9yDQorPGk+PGI+Y2xhc3M8L2I+PC9pPiBTSE9VTEQgTk9UIGhhdmUgYSBuYW1lc3BhY2UgcHJlZml4LCBvdGhlcndpc2UgdGhlIGRhdGEgdHlwZSB3aWxsDQorYmUgZW5jb2RlZCBhbmQgZGVjb2RlZCBhcyBhIGdlbmVyaWMgdmVjdG9yLCBzZWUgU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6bGlzdCI+MTAuMTAuNzwvYT4uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBkZXNlcmlhbGl6ZXIgb2YgYSBkeW5hbWljIGFycmF5IGNhbiBkZWNvZGUgcGFydGlhbGx5IHRyYW5zbWl0dGVkIGFuZC9vcg0KK1NPQVAgc3BhcnNlIGFycmF5cywgYW5kIGV2ZW4gbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIHdoaWNoIHdpbGwgYmUgY29sbGFwc2VkDQoraW50byBhIG9uZS1kaW1lbnNpb25hbCBhcnJheSB3aXRoIHJvdy1tYWpvciBvcmRlcmluZy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorPGZvbnQgY29sb3I9IiNGRjAwMDAiPjxiPkNhdXRpb248L2I+PC9mb250PjogU09BUCAxLjIgZG9lcyBub3Qgc3VwcG9ydCBwYXJ0aWFsbHkgdHJhbnNtaXR0ZWQgYXJyYXlzLiBTbyB0aGUgPGk+X19vZmZzZXQ8L2k+IGZpZWxkIG9mIGEgZHluYW1pYyBhcnJheSBpcyBpZ25vcmVkLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJCSAgICAgIDxoND48YSBuYW1lPSJ0dGhfc0VjMTAuMTAuMyI+DQorMTAuMTAuMzwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+RXhhbXBsZTwvZm9udD48L2g0Pg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgZm9sbG93aW5nIGV4YW1wbGUgaGVhZGVyIGZpbGUgc3BlY2lmaWVzIHRoZSBYTWV0aG9kcyBTZXJ2aWNlIExpc3Rpbmcgc2VydmljZSA8aT5nZXRBbGxTT0FQU2VydmljZXM8L2k+IHJlbW90ZSBtZXRob2QgYW5kIGFuIGFycmF5IG9mIDxpPlNPQVBTZXJ2aWNlPC9pPiBkYXRhIHN0cnVjdHVyZXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vIENvbnRlbnRzIG9mIGZpbGUgImxpc3RpbmcuaCI6IDxiciAvPg0KKzxiPmNsYXNzPC9iPiZuYnNwO25zM19fU09BUFNlcnZpY2UgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5wdWJsaWM8L2I+OiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7SUQ7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7Km5hbWU7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7Km93bmVyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypkZXNjcmlwdGlvbjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqaG9tZXBhZ2VVUkw7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KmVuZHBvaW50OyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypTT0FQQWN0aW9uOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyptZXRob2ROYW1lc3BhY2VVUkk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KnNlcnZpY2VTdGF0dXM7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7Km1ldGhvZE5hbWU7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KmRhdGVDcmVhdGVkOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypkb3dubG9hZFVSTDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqd3NkbFVSTDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqaW5zdHJ1Y3Rpb25zOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypjb250YWN0RW1haWw7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KnNlcnZlckltcGxlbWVudGF0aW9uOyA8YnIgLz4NCit9OyA8YnIgLz4NCis8Yj5jbGFzczwvYj4mbmJzcDtTZXJ2aWNlQXJyYXkgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5wdWJsaWM8L2I+OiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtuczNfX1NPQVBTZXJ2aWNlICpfX3B0cjsgLy8gcG9pbnRzIHRvIGFycmF5IGVsZW1lbnRzIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmludDwvYj4mbmJzcDtfX3NpemU7IC8vIG51bWJlciBvZiBlbGVtZW50cyBwb2ludGVkIHRvIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO1NlcnZpY2VBcnJheSgpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt+U2VydmljZUFycmF5KCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnZvaWQ8L2I+Jm5ic3A7cHJpbnQoKTsgPGJyIC8+DQorfTsgPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO25zX19nZXRBbGxTT0FQU2VydmljZXMoU2VydmljZUFycmF5ICZhbXA7cmV0dXJuXyk7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitBbiBleGFtcGxlIGNsaWVudCBhcHBsaWNhdGlvbjoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorI2luY2x1ZGUgInNvYXBILmgiDQorLi4uIDxiciAvPg0KKy8vIFNlcnZpY2VBcnJheSBjbGFzcyBtZXRob2QgaW1wbGVtZW50YXRpb25zOiA8YnIgLz4NCitTZXJ2aWNlQXJyYXk6OlNlcnZpY2VBcnJheSgpIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7X19wdHIgPSBOVUxMOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtfX3NpemUgPSAwOyA8YnIgLz4NCit9IDxiciAvPg0KK1NlcnZpY2VBcnJheTo6flNlcnZpY2VBcnJheSgpIDxiciAvPg0KK3sgLy8gZGVzdHJ1Y3Rpb24gaGFuZGxlZCBieSBnU09BUCA8YnIgLz4NCit9IDxiciAvPg0KKzxiPnZvaWQ8L2I+Jm5ic3A7U2VydmljZUFycmF5OjpwcmludCgpIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Zm9yPC9iPiZuYnNwOyg8Yj5pbnQ8L2I+Jm5ic3A7aSA9IDA7IGkgJmx0OyBfX3NpemU7IGkrKykgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Y291dCAgJmx0OyZsdDsgIF9fcHRyW2ldLm5hbWUgICZsdDsmbHQ7ICAiOiAiICAmbHQ7Jmx0OyAgX19wdHJbaV0uaG9tZXBhZ2UgICZsdDsmbHQ7ICBlbmRsOyA8YnIgLz4NCit9IDxiciAvPg0KKy4uLiA8YnIgLz4NCisvLyBSZXF1ZXN0IGEgc2VydmljZSBsaXN0aW5nIGFuZCBkaXNwbGF5IHJlc3VsdHM6IDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgc29hcDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7U2VydmljZUFycmF5IHJlc3VsdDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqZW5kcG9pbnQgPSAid3d3LnhtZXRob2RzLm5ldDo4MC9zb2FwL3NlcnZsZXQvcnBjcm91dGVyIjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqYWN0aW9uID0gInVybjp4bWV0aG9kc1NlcnZpY2VzTWFuYWdlciNnZXRBbGxTT0FQU2VydmljZXMiOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsuLi4gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9pbml0KCZhbXA7c29hcCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfY2FsbF9uc19fZ2V0QWxsU09BUFNlcnZpY2VzKCZhbXA7c29hcCwgZW5kcG9pbnQsIGFjdGlvbiwgcmVzdWx0KTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7cmVzdWx0LnByaW50KCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOy4uLiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2Rlc3Ryb3koJmFtcDtzb2FwKTsgLy8gZGVhbGxvYyBjbGFzcyBpbnN0YW5jZXMgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9lbmQoJmFtcDtzb2FwKTsgLy8gZGVhbGxvYyBkZXNlcmlhbGl6ZWQgZGF0YSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2RvbmUoJmFtcDtzb2FwKTsgLy8gY2xlYW51cCBhbmQgZGV0YWNoIHNvYXAgc3RydWN0IDxiciAvPg0KK30NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJCSAgICAgIDxoND48YSBuYW1lPSJ0dGhfc0VjMTAuMTAuNCI+DQorMTAuMTAuNDwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+T25lLURpbWVuc2lvbmFsIER5bmFtaWMgQXJyYXlzIFdpdGggTm9uLVplcm8gT2Zmc2V0PC9mb250PjwvaDQ+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBkZWNsYXJhdGlvbiBvZiBhIGR5bmFtaWMgYXJyYXkgYXMgZGVzY3JpYmVkIGluJm5ic3A7PGEgaHJlZj0iI3NlYzpkeW5hcnJheSI+MTAuMTA8L2E+IE1BWQ0KK2luY2x1ZGUgYW4gPGk+PGI+aW50PC9iPiZuYnNwO19fb2Zmc2V0PC9pPiBmaWVsZC4gV2hlbiBzZXQgdG8gYW4gaW50ZWdlciB2YWx1ZSwgdGhlDQorc2VyaWFsaXplciBvZiB0aGUgZHluYW1pYyBhcnJheSB3aWxsIHVzZSB0aGlzIGZpZWxkIGFzIHRoZSBzdGFydCBpbmRleCBvZiB0aGUNCithcnJheSBhbmQgdGhlIFNPQVAgYXJyYXkgb2Zmc2V0IGF0dHJpYnV0ZSB3aWxsIGJlIHVzZWQgaW4gdGhlIFNPQVAgcGF5bG9hZC4NCitOb3RlIHRoYXQgYXJyYXkgb2Zmc2V0cyBpcyBhIFNPQVAgMS4xIHNwZWNpZmljIGZlYXR1cmUgd2hpY2ggaXMgbm90IHN1cHBvcnRlZA0KK2luIFNPQVAgMS4yLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBoZWFkZXIgZmlsZSBkZWNsYXJlcyBhIG1hdGhlbWF0aWNhbCA8aT5WZWN0b3I8L2k+DQorY2xhc3MsIHdoaWNoIGlzIGEgZHluYW1pYyBhcnJheSBvZiBmbG9hdGluZyBwb2ludCB2YWx1ZXMgd2l0aCBhbiBpbmRleCB0aGF0DQorc3RhcnRzIGF0IDE6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vIENvbnRlbnRzIG9mIGZpbGUgInZlY3Rvci5oIjogPGJyIC8+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5mbG9hdDwvYj4mbmJzcDt4c2RfX2Zsb2F0OyA8YnIgLz4NCis8Yj5jbGFzczwvYj4mbmJzcDtWZWN0b3IgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt4c2RfX2Zsb2F0ICpfX3B0cjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aW50PC9iPiZuYnNwO19fc2l6ZTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aW50PC9iPiZuYnNwO19fb2Zmc2V0OyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtWZWN0b3IoKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7VmVjdG9yKDxiPmludDwvYj4mbmJzcDtuKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+ZmxvYXQ8L2I+JmFtcDsgPGI+b3BlcmF0b3I8L2I+W10oPGI+aW50PC9iPiZuYnNwO2kpOyA8YnIgLz4NCit9DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSA8aT5WZWN0b3I8L2k+IG1ldGhvZHMgYXJlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCitWZWN0b3I6OlZlY3RvcigpIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7X19wdHIgPSBOVUxMOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtfX3NpemUgPSAwOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtfX29mZnNldCA9IDE7IDxiciAvPg0KK30gPGJyIC8+DQorVmVjdG9yOjpWZWN0b3IoPGI+aW50PC9iPiZuYnNwO24pIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7X19wdHIgPSAoPGI+ZmxvYXQ8L2I+KiltYWxsb2Mobio8Yj5zaXplb2Y8L2I+KDxiPmZsb2F0PC9iPikpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtfX3NpemUgPSBuOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtfX29mZnNldCA9IDE7IDxiciAvPg0KK30gPGJyIC8+DQorVmVjdG9yOjp+VmVjdG9yKCkgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoX19wdHIpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2ZyZWUoX19wdHIpOyA8YnIgLz4NCit9IDxiciAvPg0KKzxiPmZsb2F0PC9iPiZhbXA7IFZlY3Rvcjo6PGI+b3BlcmF0b3I8L2I+W10oPGI+aW50PC9iPiZuYnNwO2kpIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cmV0dXJuPC9iPiZuYnNwO19fcHRyW2ktX19vZmZzZXRdOyA8YnIgLz4NCit9DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitBbiBleGFtcGxlIHByb2dyYW0gZnJhZ21lbnQgdGhhdCBzZXJpYWxpemVzIGEgdmVjdG9yIG9mIDMgZWxlbWVudHM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwIHNvYXA7IDxiciAvPg0KK3NvYXBfaW5pdCgmYW1wO3NvYXApOyA8YnIgLz4NCitWZWN0b3IgdigzKTsgPGJyIC8+DQordlsxXSA9IDEuMDsgPGJyIC8+DQordlsyXSA9IDIuMDsgPGJyIC8+DQordlszXSA9IDMuMDsgPGJyIC8+DQorc29hcF9iZWdpbigmYW1wO3NvYXApOyA8YnIgLz4NCit2LnNlcmlhbGl6ZSgmYW1wO3NvYXApOyA8YnIgLz4NCit2LnB1dCg8dHQ+InZlYyI8L3R0Pik7IDxiciAvPg0KK3NvYXBfZW5kKCZhbXA7c29hcCk7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgb3V0cHV0IGlzIGEgcGFydGlhbGx5IHRyYW5zbWl0dGVkIGFycmF5Og0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwQjBEMCI+PHRyPjx0ZD48dHQ+DQorJmx0O3ZlYyB4c2k6dHlwZT0iU09BUC1FTkM6QXJyYXkiIFNPQVAtRU5DOmFycmF5VHlwZT0ieHNkOmZsb2F0WzRdIiBTT0FQLUVOQzpvZmZzZXQ9IlsxXSImIzYyOyA8YnIgLz4NCismbHQ7aXRlbSB4c2k6dHlwZT0ieHNkOmZsb2F0IiYjNjI7MS4wJmx0Oy9pdGVtJiM2MjsgPGJyIC8+DQorJmx0O2l0ZW0geHNpOnR5cGU9InhzZDpmbG9hdCImIzYyOzIuMCZsdDsvaXRlbSYjNjI7IDxiciAvPg0KKyZsdDtpdGVtIHhzaTp0eXBlPSJ4c2Q6ZmxvYXQiJiM2MjszLjAmbHQ7L2l0ZW0mIzYyOyA8YnIgLz4NCismbHQ7L3ZlYyYjNjI7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvdHQ+DQorTm90ZSB0aGF0IHRoZSBzaXplIG9mIHRoZSBlbmNvZGVkIGFycmF5IGlzIG5lY2Vzc2FyaWx5IHNldCB0byA0IGFuZCB0aGF0IHRoZSBlbmNvZGluZyBvbWl0cyB0aGUgbm9uLWV4aXN0ZW50IGVsZW1lbnQgYXQgaW5kZXggMC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIGRlY29kaW5nIG9mIGEgZHluYW1pYyBhcnJheSB3aXRoIGFuIDxpPl9fb2Zmc2V0PC9pPiBmaWVsZCBpcyBtb3JlIGVmZmljaWVudCB0aGFuIGRlY29kaW5nIGEgZHluYW1pYyBhcnJheSB3aXRob3V0IGFuIDxpPl9fb2Zmc2V0PC9pPiBmaWVsZCwgYmVjYXVzZSB0aGUgPGk+X19vZmZzZXQ8L2k+IGZpZWxkIHdpbGwgYmUgYXNzaWduZWQgdGhlIHZhbHVlIG9mIHRoZSA8dHQ+U09BUC1FTkM6b2Zmc2V0PC90dD4gYXR0cmlidXRlIGluc3RlYWQgb2YgcGFkZGluZyB0aGUgaW5pdGlhbCBwYXJ0IG9mIHRoZSBhcnJheSB3aXRoIGRlZmF1bHQgdmFsdWVzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJCSAgICAgIDxoND48YSBuYW1lPSJ0dGhfc0VjMTAuMTAuNSI+DQorMTAuMTAuNTwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+TmVzdGVkIE9uZS1EaW1lbnNpb25hbCBEeW5hbWljIEFycmF5czwvZm9udD48L2g0PjxhIG5hbWU9InNlYzpuZXN0ZWQiPg0KKzwvYT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorT25lLWRpbWVuc2lvbmFsIGR5bmFtaWMgYXJyYXlzIE1BWSBiZSBuZXN0ZWQuDQorRm9yIGV4YW1wbGUsIHVzaW5nIDxpPjxiPmNsYXNzPC9iPiZuYnNwO1ZlY3RvcjwvaT4gZGVjbGFyZWQgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24sIDxpPjxiPmNsYXNzPC9iPiZuYnNwO01hdHJpeDwvaT4gaXMgZGVjbGFyZWQ6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vIENvbnRlbnRzIG9mIGZpbGUgIm1hdHJpeC5oIjogPGJyIC8+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7TWF0cml4IDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cHVibGljPC9iPjogPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7VmVjdG9yICpfX3B0cjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aW50PC9iPiZuYnNwO19fc2l6ZTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aW50PC9iPiZuYnNwO19fb2Zmc2V0OyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtNYXRyaXgoKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7TWF0cml4KDxiPmludDwvYj4mbmJzcDtuLCA8Yj5pbnQ8L2I+Jm5ic3A7bSk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO35NYXRyaXgoKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7VmVjdG9yJmFtcDsgPGI+b3BlcmF0b3I8L2I+W10oPGI+aW50PC9iPiZuYnNwO2kpOyA8YnIgLz4NCit9OyANCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoZSBNYXRyaXggdHlwZSBpcyBlc3NlbnRpYWxseSBhbiBhcnJheSBvZiBwb2ludGVycyB0byBhcnJheXMgd2hpY2ggbWFrZSB1cCB0aGUgcm93cyBvZiBhIG1hdHJpeC4NCitUaGUgZW5jb2Rpbmcgb2YgdGhlIHR3by1kaW1lbnNpb25hbCBkeW5hbWljIGFycmF5IGluIFNPQVAgd2lsbCBiZSBpbiBuZXN0ZWQgZm9ybS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCQkgICAgICA8aDQ+PGEgbmFtZT0idHRoX3NFYzEwLjEwLjYiPg0KKzEwLjEwLjY8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPk11bHRpLURpbWVuc2lvbmFsIER5bmFtaWMgQXJyYXlzPC9mb250PjwvaDQ+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBnZW5lcmFsIGZvcm0gb2YgdGhlIDxpPjxiPnN0cnVjdDwvYj48L2k+IGRlY2xhcmF0aW9uIGZvciBLLWRpbWVuc2lvbmFsIChLICZndDsgMSkgZHluYW1pYyBhcnJheXMgaXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtzb21lX25hbWUgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8dT48c3BhbiBjbGFzcz0icm9tYW4iPlR5cGU8L3NwYW4+PC91PiAqX19wdHI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmludDwvYj4mbmJzcDtfX3NpemVbS107IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmludDwvYj4mbmJzcDtfX29mZnNldFtLXTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Li4uIC8vIGFueXRoaW5nIHRoYXQgZm9sbG93cyBoZXJlIHdpbGwgYmUgaWdub3JlZCA8YnIgLz4NCit9Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQord2hlcmUgPGk+PHU+PHNwYW4gY2xhc3M9InJvbWFuIj5UeXBlPC9zcGFuPjwvdT48L2k+IE1VU1QgYmUgYSB0eXBlIGFzc29jaWF0ZWQgd2l0aCBhbiBYTUwgU2NoZW1hLCB3aGljaCBtZWFucyB0aGF0IGl0IG11c3QgYmUgYSA8aT48Yj50eXBlZGVmPC9iPjwvaT5lZCB0eXBlDQoraW4gY2FzZSBvZiBhIHByaW1pdGl2ZSB0eXBlLCBvciBhIDxpPjxiPnN0cnVjdDwvYj48L2k+LzxpPjxiPmNsYXNzPC9iPjwvaT4gbmFtZSB3aXRoIGEgbmFtZXNwYWNlIHByZWZpeCBmb3Igc2NoZW1hIGFzc29jaWF0aW9uLCBvciBhbm90aGVyIGR5bmFtaWMgYXJyYXkuIElmIHRoZXNlIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXQsIGEgZ2VuZXJpYyB2ZWN0b3IgWE1MIChkZSlzZXJpYWxpemF0aW9uIGlzIHVzZWQgKHNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzpsaXN0Ij4xMC4xMC43PC9hPikuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0FuIGFsdGVybmF0aXZlIGlzIHRvIHVzZSBhIDxpPjxiPmNsYXNzPC9iPjwvaT4gd2l0aCBvcHRpb25hbCBtZXRob2RzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5jbGFzczwvYj4mbmJzcDtzb21lX25hbWUgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5wdWJsaWM8L2I+OiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8dT48c3BhbiBjbGFzcz0icm9tYW4iPlR5cGU8L3NwYW4+PC91PiAqX19wdHI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmludDwvYj4mbmJzcDtfX3NpemVbS107IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmludDwvYj4mbmJzcDtfX29mZnNldFtLXTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7bWV0aG9kMTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7bWV0aG9kMjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Li4uIC8vIGFueSBmaWVsZHMgdGhhdCBmb2xsb3cgd2lsbCBiZSBpZ25vcmVkIDxiciAvPg0KK307DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitJbiB0aGUgYWJvdmUsIEsgaXMgYSBjb25zdGFudCBkZW5vdGluZyB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgb2YgdGhlIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUbyBlbmNvZGUgdGhlIGRhdGEgdHlwZSBhcyBhbiBhcnJheSwgdGhlIG5hbWUgb2YgdGhlIDxpPjxiPnN0cnVjdDwvYj48L2k+IG9yIDxpPjxiPmNsYXNzPC9iPjwvaT4gU0hPVUxEIE5PVCBoYXZlIGEgbmFtZXNwYWNlIHByZWZpeCwgb3RoZXJ3aXNlDQordGhlIGRhdGEgdHlwZSB3aWxsIGJlIGVuY29kZWQgYW5kIGRlY29kZWQgYXMgYSBnZW5lcmljIHZlY3Rvciwgc2VlIFNlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOmxpc3QiPjEwLjEwLjc8L2E+Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgZGVzZXJpYWxpemVyIG9mIGEgZHluYW1pYyBhcnJheSBjYW4gZGVjb2RlIHBhcnRpYWxseSB0cmFuc21pdHRlZCBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0ZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGRlY2xhcmF0aW9uIHNwZWNpZmllcyBhIG1hdHJpeCBjbGFzczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5kb3VibGU8L2I+Jm5ic3A7eHNkX19kb3VibGU7IDxiciAvPg0KKzxiPmNsYXNzPC9iPiZuYnNwO01hdHJpeCA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnB1YmxpYzwvYj46IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3hzZF9fZG91YmxlICpfX3B0cjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aW50PC9iPiZuYnNwO19fc2l6ZVsyXTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aW50PC9iPiZuYnNwO19fb2Zmc2V0WzJdOyA8YnIgLz4NCit9OyANCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK0luIGNvbnRyYXN0IHRvIHRoZSBtYXRyaXggY2xhc3Mgb2YgU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6bmVzdGVkIj4xMC4xMC41PC9hPiB0aGF0IGRlZmluZWQgYSBtYXRyaXggYXMgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gbWF0cml4IHJvd3MsIHRoaXMNCitjbGFzcyBoYXMgb25lIHBvaW50ZXIgdG8gYSBtYXRyaXggc3RvcmVkIGluIHJvdy1tYWpvciBvcmRlci4gIFRoZSBzaXplIG9mIHRoZSBtYXRyaXggaXMgZGV0ZXJtaW5lZCBieSB0aGUgPGk+X19zaXplPC9pPiBmaWVsZDoNCis8aT5fX3NpemVbMF08L2k+IGhvbGRzIHRoZSBudW1iZXIgb2Ygcm93cyBhbmQgPGk+X19zaXplWzFdPC9pPiBob2xkcyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgb2YgdGhlIG1hdHJpeC4gIExpa2V3aXNlLCA8aT5fXw0KK29mZnNldFswXTwvaT4gaXMgdGhlIHJvdyBvZmZzZXQgYW5kIDxpPl9fb2Zmc2V0WzFdPC9pPiBpcyB0aGUgY29sdW1ucyBvZmZzZXQuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkJICAgICAgPGg0PjxhIG5hbWU9InR0aF9zRWMxMC4xMC43Ij4NCisxMC4xMC43PC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5FbmNvZGluZyBYTUwgR2VuZXJpY3MgQ29udGFpbmluZyBEeW5hbWljIEFycmF5czwvZm9udD48L2g0PjxhIG5hbWU9InNlYzpsaXN0Ij4NCis8L2E+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1hNTCAiZ2VuZXJpY3MiIGV4dGVuZCB0aGUgY29uY2VwdCBvZiBhIHN0cnVjdCBieSBhbGxvd2luZyByZXBldGl0aW9ucyBvZiBlbGVtZW50cyB3aXRoaW4gdGhlIHN0cnVjdC4NCitBIHNpbXBsZSBnZW5lcmljIGlzIGFuIGFycmF5LWxpa2UgZGF0YSBzdHJ1Y3R1cmUgd2l0aCBhIHJlcGV0aXRpb24gb2Ygb25lIGVsZW1lbnQuDQorVG8gYWNoaWV2ZSB0aGlzLCBkZWNsYXJlIGEgZHluYW1pYyBhcnJheSBhcyBhIDxpPjxiPnN0cnVjdDwvYj48L2k+IG9yIDxpPjxiPmNsYXNzPC9iPjwvaT4gd2l0aCBhIG5hbWUgdGhhdCBpcyBxdWFsaWZpZWQgd2l0aA0KK2EgbmFtZXNwYWNlIHByZWZpeC4gIFNPQVAgYXJyYXlzIGFyZSBkZWNsYXJlZCB3aXRob3V0IHByZWZpeC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorRm9yIGV4YW1wbGU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtuc19fTWFwIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+c3RydWN0PC9iPiZuYnNwO25zX19CaW5kaW5nIHs8Yj5jaGFyPC9iPiZuYnNwOyprZXk7IDxiPmNoYXI8L2I+Jm5ic3A7KnZhbDt9ICpfX3B0cjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aW50PC9iPiZuYnNwO19fc2l6ZTsgPGJyIC8+DQorfTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoaXMgZGVjbGFyZXMgYSBkeW5hbWljIGFycmF5LCBidXQgdGhlIGFycmF5IHdpbGwgYmUgc2VyaWFsaXplZCBhbmQgZGVzZXJpYWxpemVkIGFzIGEgZ2VuZXJpYyB3aXRoIGEgbGlzdC1saWtlIGRhdGEgc3RydWN0dXJlLiBGb3IgZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEIwRDAiPjx0cj48dGQ+PHR0Pg0KKyZsdDtuczpNYXAgeHNpOnR5cGU9Im5zOk1hcCImIzYyOyA8YnIgLz4NCismbHQ7bnM6QmluZGluZyB4c2k6dHlwZT0ibnM6QmluZGluZyImIzYyOyA8YnIgLz4NCismbHQ7a2V5JiM2MjtKb2UmbHQ7L2tleSYjNjI7IDxiciAvPg0KKyZsdDt2YWwmIzYyOzU1NSA3NyAxMjM0Jmx0Oy92YWwmIzYyOyA8YnIgLz4NCismbHQ7L25zOkJpbmRpbmcmIzYyOyA8YnIgLz4NCismbHQ7bnM6QmluZGluZyB4c2k6dHlwZT0ibnM6QmluZGluZyImIzYyOyA8YnIgLz4NCismbHQ7a2V5JiM2MjtTdXNhbiZsdDsva2V5JiM2MjsgPGJyIC8+DQorJmx0O3ZhbCYjNjI7NTU1IDEyIDY3MjUmbHQ7L3ZhbCYjNjI7IDxiciAvPg0KKyZsdDsvbnM6QmluZGluZyYjNjI7IDxiciAvPg0KKyZsdDtuczpCaW5kaW5nIHhzaTp0eXBlPSJuczpCaW5kaW5nIiYjNjI7IDxiciAvPg0KKyZsdDtrZXkmIzYyO1BldGUmbHQ7L2tleSYjNjI7IDxiciAvPg0KKyZsdDt2YWwmIzYyOzU1NSA5OSA0MzIxJmx0Oy92YWwmIzYyOyA8YnIgLz4NCismbHQ7L25zOkJpbmRpbmcmIzYyOyA8YnIgLz4NCismbHQ7L25zOk1hcCYjNjI7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvdHQ+DQorRGVzZXJpYWxpemF0aW9uIGlzIGxlc3MgZWZmaWNpZW50IGNvbXBhcmVkIHRvIGFuIGFycmF5LCBiZWNhdXNlIHRoZSBzaXplIG9mIHRoZQ0KK2xpc3QgaXMgbm90IHBhcnQgb2YgdGhlIFNPQVAgZW5jb2RpbmcuIEludGVybmFsIGJ1ZmZlcmluZyBpcyB1c2VkIGJ5IHRoZQ0KK2Rlc2VyaWFsaXplciB0byBjb2xsZWN0IHRoZSBlbGVtZW50cy4gV2hlbiB0aGUgZW5kIG9mIHRoZSBsaXN0IGlzIHJlYWNoZWQsIHRoZQ0KK2J1ZmZlcmVkIGVsZW1lbnRzIGFyZSBjb3BpZWQgdG8gYSBuZXdseSBhbGxvY2F0ZWQgc3BhY2Ugb24gdGhlIGhlYXAgZm9yIHRoZQ0KK2R5bmFtaWMgYXJyYXkuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK011bHRpcGxlIGFycmF5cyBjYW4gYmUgdXNlZCBpbiBhIHN0cnVjdC9jbGFzcyB0byBzdXBwb3J0IHRoZSBjb25jZXB0IG9mDQorZ2VuZXJpY3MuICBFYWNoIGFycmF5IHJlc3VsdHMgaW4gYSByZXBldGl0aW9uIG9mIGVsZW1lbnRzIGluIHRoZSBzdHJ1Y3QvY2xhc3MuDQorVGhpcyBpcyBhY2hpZXZlZCB3aXRoIGEgPGk+PGI+aW50PC9iPiZuYnNwO19fc2l6ZTwvaT4gZmllbGQgaW4gdGhlIHN0cnVjdC9jbGFzcyB3aGVyZSB0aGUNCituZXh0IGZpZWxkIChpLmUuJm5ic3A7YmVsb3cgdGhlIDxpPl9fc2l6ZTwvaT4gZmllbGQpIGlzIGEgcG9pbnRlciB0eXBlLiAgVGhlIHBvaW50ZXINCit0eXBlIGlzIGFzc3VtZWQgdG8gcG9pbnQgdG8gYW4gYXJyYXkgb2YgdmFsdWVzIGF0IHJ1biB0aW1lLiAgVGhlIDxpPl9fc2l6ZTwvaT4NCitmaWVsZCBob2xkcyB0aGUgbnVtYmVyIG9mIHZhbHVlcyBhdCBydW4gdGltZS4gIE11bHRpcGxlIGFycmF5cyBjYW4gYmUgZW1iZWRkZWQNCitpbiBhIHN0cnVjdC9jbGFzcyB3aXRoIDxpPl9fc2l6ZTwvaT4gZmllbGRzIHRoYXQgaGF2ZSBhIGRpc3RpbmN0IG5hbWVzLiAgVG8NCittYWtlIHRoZSA8aT5fX3NpemU8L2k+IGZpZWxkcyBkaXN0aW5jdCwgeW91IGNhbiBlbmQgdGhlbSB3aXRoIGEgdW5pcXVlIG5hbWUNCitzdWZmaXggc3VjaCBhcyA8aT5fX3NpemVPZnN0cmluZ3M8L2k+LCBmb3IgZXhhbXBsZS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIGdlbmVyYWwgY29udmVudGlvbiBmb3IgZW1iZWRkaW5nIGFycmF5cyBpczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+c3RydWN0PC9iPiZuYnNwO25zX19Tb21lU3RydWN0IDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Li4uIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmludDwvYj4mbmJzcDtfX3NpemU8dT48c3BhbiBjbGFzcz0icm9tYW4iPm5hbWUxPC9zcGFuPjwvdT47IC8vIG51bWJlciBvZiBlbGVtZW50cyBwb2ludGVkIHRvIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzx1PjxzcGFuIGNsYXNzPSJyb21hbiI+VHlwZTE8L3NwYW4+PC91PiAqPHU+ZmllbGQxPC91PjsgLy8gYnkgdGhpcyBmaWVsZCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsuLi4gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aW50PC9iPiZuYnNwO19fc2l6ZTx1PjxzcGFuIGNsYXNzPSJyb21hbiI+bmFtZTI8L3NwYW4+PC91PjsgLy8gbnVtYmVyIG9mIGVsZW1lbnRzIHBvaW50ZWQgdG8gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PHU+PHNwYW4gY2xhc3M9InJvbWFuIj5UeXBlMjwvc3Bhbj48L3U+ICo8dT5maWVsZDI8L3U+OyAvLyBieSB0aGlzIGZpZWxkIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOy4uLiA8YnIgLz4NCit9Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQord2hlcmUgPGk+PHU+PHNwYW4gY2xhc3M9InJvbWFuIj5uYW1lMTwvc3Bhbj48L3U+PC9pPiBhbmQgPGk+PHU+PHNwYW4gY2xhc3M9InJvbWFuIj5uYW1lMjwvc3Bhbj48L3U+PC9pPiBhcmUgaWRlbnRpZmllcnMgdXNlZCBhcyBhIHN1ZmZpeCB0byBkaXN0aW5ndWlzaCB0aGUgPGk+X18NCitzaXplPC9pPiBmaWVsZC4gVGhlc2UgbmFtZXMgY2FuIGJlIGFyYml0cmFyeSBhbmQgYXJlIG5vdCB2aXNpYmxlIGluIFhNTC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgc3RydWN0IGhhcyB0d28gZW1iZWRkZWQgYXJyYXlzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7bnNfX0NvbnRhY3QgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypmaXJzdE5hbWU7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7Kmxhc3ROYW1lOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7X19zaXplUGhvbmVzOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtVTE9ORzY0ICpwaG9uZU51bWJlcjsgLy8gYXJyYXkgb2YgcGhvbmUgbnVtYmVycyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7X19zaXplRW1haWxzOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyoqZW1haWxBZGRyZXNzOyAvLyBhcnJheSBvZiBlbWFpbCBhZGRyZXNzZXMgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqc29jU2VjTnVtYmVyOyA8YnIgLz4NCit9Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIFhNTCBzZXJpYWxpemF0aW9uIG9mIGFuIGV4YW1wbGUgPGk+bnNfX0NvbnRhY3Q8L2k+IGlzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwQjBEMCI+PHRyPjx0ZD48dHQ+DQorJmx0O215Y29udGFjdCB4c2k6dHlwZT0ibnM6Q29udGFjdCImIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbHQ7Zmlyc3ROYW1lJiM2MjtKb2UmbHQ7L2ZpcnN0TmFtZSYjNjI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtsYXN0TmFtZSYjNjI7U21pdGgmbHQ7L2xhc3ROYW1lJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3Bob25lTnVtYmVyJiM2Mjs1NTUxMTEyMjIyJmx0Oy9waG9uZU51bWJlciYjNjI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtwaG9uZU51bWJlciYjNjI7NTU1MTIzNDU2NyZsdDsvcGhvbmVOdW1iZXImIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbHQ7cGhvbmVOdW1iZXImIzYyOzU1NTIzNDg5MDEmbHQ7L3Bob25lTnVtYmVyJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2VtYWlsQWRkcmVzcyYjNjI7Sm9lLlNtaXRoQG1haWwuY29tJmx0Oy9lbWFpbEFkZHJlc3MmIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbHQ7ZW1haWxBZGRyZXNzJiM2MjtKb2VAU21pdGguY29tJmx0Oy9lbWFpbEFkZHJlc3MmIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbHQ7c29jU2VjTnVtYmVyJiM2Mjs5OTk5OTk5OTkmbHQ7L3NvY1NlY051bWJlciYjNjI7IDxiciAvPg0KKyZsdDsvbXljb250YWN0JiM2MjsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC90dD4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCQkgICAgICA8aDQ+PGEgbmFtZT0idHRoX3NFYzEwLjEwLjgiPg0KKzEwLjEwLjg8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPlNUTCBDb250YWluZXJzPC9mb250PjwvaDQ+PGEgbmFtZT0ic2VjOnRlbXBsYXRlcyI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitnU09BUCBzdXBwb3J0cyB0aGUgU1RMIGNvbnRhaW5lcnMgPGk+c3RkOjpkZXF1ZTwvaT4sIDxpPnN0ZDo6bGlzdDwvaT4sDQorPGk+c3RkOjpzZXQ8L2k+LCBhbmQgPGk+c3RkOjp2ZWN0b3I8L2k+Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitTVEwgY29udGFpbmVycyBjYW4gb25seSBiZSB1c2VkIHdpdGhpbiBjbGFzc2VzIHRvIGRlY2xhcmUgbWVtYmVycyB0aGF0IGNvbnRhaW4NCittdWx0aXBsZSB2YWx1ZXMuICBUaGlzIGlzIHNvbWV3aGF0IHNpbWlsYXIgdG8gdGhlIGVtYmVkZGluZyBvZiBhcnJheXMgaW4NCitzdHJ1Y3RzIGluIEMgYXMgZXhwbGFpbmVkIGluIFNlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOmxpc3QiPjEwLjEwLjc8L2E+LCBidXQgdGhlIFNUTCBjb250YWluZXINCithcHByb2FjaCBpcyBtb3JlIGZsZXhpYmxlLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitZb3UgbmVlZCB0byBpbXBvcnQgPGk+c3RsZGVxdWUuaDwvaT4sIDxpPnN0bGxpc3QuaDwvaT4sIDxpPnN0bHNldC5oPC9pPiwgb3INCis8aT5zdGx2ZWN0b3IuaDwvaT4gdG8gZW5hYmxlIDxpPnN0ZDo6ZGVxdWU8L2k+LCA8aT5zdGQ6Omxpc3Q8L2k+LCA8aT5zdGQ6OnNldDwvaT4sDQorYW5kIDxpPnN0ZDo6dmVjdG9yPC9pPiAoZGUpc2VyaWFsaXphdGlvbi4NCitIZXJlIGlzIGFuIGV4YW1wbGU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKyNpbXBvcnQgInN0bHZlY3Rvci5oIiA8YnIgLz4NCis8Yj5jbGFzczwvYj4mbmJzcDtuc19fbXlDbGFzcyA8YnIgLz4NCit7IDxiPnB1YmxpYzwvYj46IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3N0ZDo6dmVjdG9yICZsdDsgaW50ICZndDsgICpudW1iZXI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3N0ZDo6dmVjdG9yICZsdDsgeHNkX19zdHJpbmcgJmd0OyAgKm5hbWU7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOy4uLiA8YnIgLz4NCit9Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIHVzZSBvZiBwb2ludGVyIG1lbWJlcnMgaXMgbm90IHJlcXVpcmVkIGJ1dCBhZHZpc2VkLiBUaGUgcmVhc29uIGlzIHRoYXQNCitpbnRlcm9wZXJhYmlsaXR5IHdpdGggb3RoZXIgU09BUCB0b29sa2l0cyBtYXkgbGVhZCB0byBjb3B5aW5nIG9mIDxpPm5zX18NCitteUNsYXNzPC9pPiBpbnN0YW5jZXMgYXQgcnVuIHRpbWUgd2hlbiAoZGUpc2VyaWFsaXppbmcgbXVsdGktcmVmZXJlbmNlZCBkYXRhLg0KK1doZW4gYSBjb3B5IGlzIG1hZGUsIGNlcnRhaW4gcGFydHMgb2YgdGhlIGNvbnRhaW5lcnMgd2lsbCBiZSBzaGFyZWQgYmV0d2VlbiB0aGUNCitjb3BpZXMgd2hpY2ggY291bGQgbGVhZCB0byBkaXNhc3RlciB3aGVuIHRoZSBjbGFzc2VzIHdpdGggdGhlaXIgY29udGFpbmVycyBhcmUNCitkZWFsbG9jYXRlZC4gIEFub3RoZXIgd2F5IHRvIGF2b2lkIHRoaXMgaXMgdG8gZGVjbGFyZSBjbGFzcyA8aT5uc19fbXlDbGFzczwvaT4NCit3aXRoaW4gb3RoZXIgZGF0YSB0eXBlcyB2aWEgYSBwb2ludGVyLiAgKEludGVyb3BlcmFiaWxpdHkgYmV0d2VlbiBnU09BUCBjbGllbnRzDQorYW5kIHNlcnZpY2VzIGRvZXMgbm90IGxlYWQgdG8gY29weWluZy4pDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBYTUwgU2NoZW1hIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIDxpPm5zX19teUNsYXNzPC9pPiB0eXBlIGlzDQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBCMEQwIj48dHI+PHRkPjx0dD4NCismbHQ7Y29tcGxleFR5cGUgbmFtZT0ibXlDbGFzcyYjMTg3OyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbHQ7c2VxdWVuY2UmIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7ZWxlbWVudCBuYW1lPSJudW1iZXIiIHR5cGU9InhzZDppbnQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLyYjNjI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtlbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLyYjNjI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOy4uLiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbHQ7L3NlcXVlbmNlJiM2MjsgPGJyIC8+DQorJmx0Oy9jb21wbGV4VHlwZSYjNjI7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvdHQ+DQorWW91IGNhbiBzcGVjaWZ5IHRoZSBtaW5PY2N1cnMgYW5kIG1heE9jY3VycyB2YWx1ZXMgYXMgZXhwbGFpbmVkIGluIFNlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOmRpcmVjdGl2ZXMiPjE4LjI8L2E+Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitZb3UgY2FuIGFsc28gaW1wbGVtZW50IHlvdXIgb3duDQorY29udGFpbmVycyBzaW1pbGFyIHRvIFNUTCBjb250YWluZXJzLiBUaGUgY29udGFpbmVycyBtdXN0IGJlIGNsYXNzIHRlbXBsYXRlcyBhbmQgc2hvdWxkIGRlZmluZSBhbiBpdGVyYXRvciB0eXBlLCBhbmQgPGk+PGI+dm9pZDwvYj4mbmJzcDtjbGVhcigpPC9pPiwgPGk+aXRlcmF0b3IgYmVnaW4oKTwvaT4sIDxpPml0ZXJhdG9yIGVuZCgpPC9pPiwgYW5kIDxpPml0ZXJhdG9yIGluc2VydChpdGVyYXRvciBwb3MsIGNvbnN0X3JlZmVyZW5jZSB2YWwpPC9pPi4NCitUaGUgPGk+aXRlcmF0b3I8L2k+IHNob3VsZCBoYXZlIGEgZGVyZWZlcmVuY2Ugb3BlcmF0b3IgdG8NCithY2Nlc3MgdGhlIGNvbnRhaW5lcidzIGVsZW1lbnRzLiAgVGhlIGRlcmVmZXJlbmNlIG9wZXJhdG9yIGlzIHVzZWQgYnkgZ1NPQVAgdG8NCitzZW5kIGEgc2VxdWVuY2Ugb2YgWE1MIGVsZW1lbnQgdmFsdWVzLiAgVGhlIDxpPmluc2VydDwvaT4gbWV0aG9kIGNhbiBiZSB1c2VkIGFzDQorYSBzZXR0ZXIgbWV0aG9kLiAgZ1NPQVAgcmVhZHMgYSBzZXF1ZW5jZSBvZiBYTUwgZWxlbWVudCB2YWx1ZXMgYW5kIGluc2VydHMgdGhlbQ0KK2luIHRoZSBjb250YWluZXIgdmlhIHRoaXMgbWV0aG9kLiAgDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0hlcmUgaXMgaW4gZXhhbXBsZSB1c2VyLWRlZmluZWQgY29udGFpbmVyIHRlbXBsYXRlIGNsYXNzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisvLyBzaW1wbGVWZWN0b3IuaCA8YnIgLz4NCis8Yj50ZW1wbGF0ZTwvYj4mbmJzcDsgJmx0OyA8Yj5jbGFzczwvYj4mbmJzcDtUICZndDsgIDxiciAvPg0KKzxiPmNsYXNzPC9iPiZuYnNwO3NpbXBsZVZlY3RvciA8YnIgLz4NCit7IDxiciAvPg0KKzxiPnB1YmxpYzwvYj46IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnR5cGVkZWY8L2I+Jm5ic3A7VAkJCSAgdmFsdWVfdHlwZTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+dHlwZWRlZjwvYj4mbmJzcDt2YWx1ZV90eXBlCQkqIHBvaW50ZXI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnR5cGVkZWY8L2I+Jm5ic3A7Y29uc3QgdmFsdWVfdHlwZQkqIGNvbnN0X3BvaW50ZXI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnR5cGVkZWY8L2I+Jm5ic3A7dmFsdWVfdHlwZQkJJmFtcDsgcmVmZXJlbmNlOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj50eXBlZGVmPC9iPiZuYnNwO2NvbnN0IHZhbHVlX3R5cGUJJmFtcDsgY29uc3RfcmVmZXJlbmNlOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj50eXBlZGVmPC9iPiZuYnNwO3BvaW50ZXIJCSAgaXRlcmF0b3I7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnR5cGVkZWY8L2I+Jm5ic3A7Y29uc3RfcG9pbnRlcgkJICBjb25zdF9pdGVyYXRvcjsgPGJyIC8+DQorPGI+cHJvdGVjdGVkPC9iPjogPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7aXRlcmF0b3IJCQkgIHN0YXJ0OyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtpdGVyYXRvcgkJCSAgZmluaXNoOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzaXplX3QJCQkgIGxlbmd0aDsgPGJyIC8+DQorPGI+cHVibGljPC9iPjogPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c2ltcGxlVmVjdG9yKCkJeyBjbGVhcigpOyB9IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO35zaW1wbGVWZWN0b3IoKQl7IDxiPmRlbGV0ZTwvYj5bXSBzdGFydDsgfSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj52b2lkPC9iPlwJCQkJICBjbGVhcigpCQl7IHN0YXJ0ID0gZmluaXNoID0gTlVMTDsgfSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtpdGVyYXRvcgkJCSAgYmVnaW4oKQkJeyA8Yj5yZXR1cm48L2I+Jm5ic3A7c3RhcnQ7IH0gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Y29uc3RfaXRlcmF0b3IJCSAgYmVnaW4oKSA8Yj5jb25zdDwvYj5cCQl7IDxiPnJldHVybjwvYj4mbmJzcDtzdGFydDsgfSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtpdGVyYXRvcgkJCSAgZW5kKCkJCQl7IDxiPnJldHVybjwvYj4mbmJzcDtmaW5pc2g7IH0gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Y29uc3RfaXRlcmF0b3IJCSAgZW5kKCkgPGI+Y29uc3Q8L2I+XAkJeyA8Yj5yZXR1cm48L2I+Jm5ic3A7ZmluaXNoOyB9IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NpemVfdAkJICBzaXplKCkgPGI+Y29uc3Q8L2I+XAkJeyA8Yj5yZXR1cm48L2I+Jm5ic3A7ZmluaXNoLXN0YXJ0OyB9IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO2l0ZXJhdG9yCQkJICBpbnNlcnQoaXRlcmF0b3IgcG9zLCBjb25zdF9yZWZlcmVuY2UgdmFsKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDt7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyghc3RhcnQpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3N0YXJ0ID0gZmluaXNoID0gPGI+bmV3PC9iPiZuYnNwO3ZhbHVlX3R5cGVbbGVuZ3RoID0gNF07IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPmVsc2U8L2I+Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KGZpbmlzaCAgJmd0OyA9IHN0YXJ0ICsgbGVuZ3RoKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDt7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2l0ZXJhdG9yIGkgPSBzdGFydDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7aXRlcmF0b3IgaiA9IDxiPm5ldzwvYj4mbmJzcDt2YWx1ZV90eXBlWzIgKiBsZW5ndGhdOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzdGFydCA9IGo7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2ZpbmlzaCA9IHN0YXJ0ICsgbGVuZ3RoOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtsZW5ndGggKj0gMjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KHBvcykgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7cG9zID0gaiArIChwb3MgLSBpKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+d2hpbGU8L2I+Jm5ic3A7KGkgIT0gZmluaXNoKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsqaisrID0gKmkrKzsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsocG9zICZhbXA7JmFtcDsgcG9zICE9IGZpbmlzaCkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7eyBpdGVyYXRvciBpID0gZmluaXNoOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtpdGVyYXRvciBqID0gaSAtIDE7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPndoaWxlPC9iPiZuYnNwOyhqICE9IHBvcykgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7KmktID0gKmotOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDt9IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOypmaW5pc2grKyA9IHZhbDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cmV0dXJuPC9iPiZuYnNwO3BvczsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCit9Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVG8gZW5hYmxlIHRoZSBjb250YWluZXIsIHdlIGFkZCB0aGUgZm9sbG93aW5nIHR3byBsaW5lcyB0byBvdXIgZ1NPQVAgaGVhZGVyIGZpbGU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKyNpbmNsdWRlICJzaW1wbGVWZWN0b3IuaCIgPGJyIC8+DQorPGI+dGVtcGxhdGU8L2I+Jm5ic3A7ICZsdDsgY2xhc3MgVCAmZ3Q7ICA8Yj5jbGFzczwvYj4mbmJzcDtzaW1wbGVWZWN0b3I7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgY29udGFpbmVyIGNsYXNzDQorc2hvdWxkIG5vdCBiZSBkZWZpbmVkIGluIHRoZSBnU09BUCBoZWFkZXIgZmlsZS4gSXQgbXVzdCBiZSBkZWZpbmVkIGluDQorYSBzZXBhcmF0ZSBoZWFkZXIgZmlsZSAoZS5nLiZuYnNwOyJzaW1wbGVWZWN0b3IuaCIpLiBUaGUgPGk+PGI+dGVtcGxhdGU8L2I+Jm5ic3A7ICZsdDsgY2xhc3MgVCAmZ3Q7ICA8Yj5jbGFzczwvYj4mbmJzcDtzaW1wbGVWZWN0b3I8L2k+IGRlY2xhcmF0aW9uIGVuc3VyZXMgdGhhdCBnU09BUCB3aWxsIHJlY29nbml6ZSA8aT5zaW1wbGVWZWN0b3I8L2k+IGFzIGEgY29udGFpbmVyIGNsYXNzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+Q2F1dGlvbjwvYj48L2ZvbnQ+OiB3aGVuIHBhcnNpbmcgWE1MIGNvbnRlbnQgdGhlIGNvbnRhaW5lciBlbGVtZW50cyBtYXkgbm90IGJlIHN0b3JlZCBpbiB0aGUgc2FtZSBvcmRlciBnaXZlbiBpbg0KK3RoZSBYTUwgY29udGVudC4gIFdoZW4gZ1NPQVAgcGFyc2VzIFhNTCBpdCB1c2VzIHRoZSA8aT5pbnNlcnQ8L2k+IGNvbnRhaW5lciBtZXRob2RzIHRvDQorc3RvcmUgZWxlbWVudHMgb25lIGJ5IG9uZS4gIEhvd2V2ZXIsIGVsZW1lbnQgY29udGVudCB0aGF0IGlzICJmb3J3YXJkZWQiIHdpdGgNCis8dHQ+aHJlZjwvdHQ+IGF0dHJpYnV0ZXMgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgY29udGFpbmVyLiAgRm9yd2FyZGluZyBjYW4gdGFrZQ0KK3BsYWNlIHdpdGggbXVsdGktcmVmZXJlbmNlZCBkYXRhIHRoYXQgaXMgcmVmZXJyZWQgdG8gZnJvbSB0aGUgbWFpbiBwYXJ0IG9mIHRoZQ0KK1NPQVAgMS4xIFhNTCBtZXNzYWdlIHRvIHRoZSBpbmRlcGVuZGVudCBlbGVtZW50cyB0aGF0IGNhcnJ5IDx0dD5pZDwvdHQ+cy4NCitUaGVyZWZvcmUsIHlvdXIgYXBwbGljYXRpb24gc2hvdWxkIG5vdCByZWx5IG9uIHRoZSBwcmVzZXJ2YXRpb24gb2YgdGhlIG9yZGVyIG9mDQorZWxlbWVudHMgaW4gYSBjb250YWluZXIuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkJICAgICAgPGg0PjxhIG5hbWU9InR0aF9zRWMxMC4xMC45Ij4NCisxMC4xMC45PC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5Qb2x5bW9ycGhpYyBEeW5hbWljIEFycmF5cyBhbmQgTGlzdHM8L2ZvbnQ+PC9oND4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorUG9seW1vcnBoaWMgYXJyYXlzIChhcnJheXMgb2YgcG9seW1vcnBoaWMgZWxlbWVudCB0eXBlcykgY2FuIGJlIGVuY29kZWQgd2hlbg0KK2RlY2xhcmVkIGFzIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIGNsYXNzIGluc3RhbmNlcy4gIGFuZCBsaXN0cy4gIEZvciBleGFtcGxlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5jbGFzczwvYj4mbmJzcDtuc19fT2JqZWN0IDxiciAvPg0KK3s8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5wdWJsaWM8L2I+OiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsuLi4gPGJyIC8+DQorfTsgPGJyIC8+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7bnNfX0RhdGE6IDxiPnB1YmxpYzwvYj4mbmJzcDtuc19fT2JqZWN0IDxiciAvPg0KK3s8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5wdWJsaWM8L2I+OiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsuLi4gPGJyIC8+DQorfTsgPGJyIC8+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7QXJyYXlPZk9iamVjdCA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnB1YmxpYzwvYj46IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO25zX19PYmplY3QgKipfX3B0cjsgLy8gcG9pbnRlciB0byBhcnJheSBvZiBwb2ludGVycyB0byBPYmplY3RzIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmludDwvYj4mbmJzcDtfX3NpemU7IC8vIG51bWJlciBvZiBPYmplY3RzIHBvaW50ZWQgdG8gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aW50PC9iPiZuYnNwO19fb2Zmc2V0OyAvLyBvcHRpb25hbCBTT0FQIDEuMSBhcnJheSBvZmZzZXQgPGJyIC8+DQorfTsgDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgcG9pbnRlcnMgaW4gdGhlIGFycmF5IGNhbiBwb2ludCB0byB0aGUgPGk+bnNfX09iamVjdDwvaT4gYmFzZSBjbGFzcyBvcg0KKzxpPm5zX19EYXRhPC9pPiBkZXJpdmVkIGNsYXNzIGluc3RhbmNlcyB3aGljaCB3aWxsIGJlIHNlcmlhbGl6ZWQgYW5kDQorZGVzZXJpYWxpemVkIGFjY29yZGluZ2x5IGluIFNPQVAuICBUaGF0IGlzLCB0aGUgYXJyYXkgZWxlbWVudHMgYXJlIHBvbHltb3JwaGljLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJCSAgICAgIDxoND48YSBuYW1lPSJ0dGhfc0VjMTAuMTAuMTAiPg0KKzEwLjEwLjEwPC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5Ib3cgdG8gQ2hhbmdlIHRoZSBUYWcgTmFtZXMgb2YgdGhlIEVsZW1lbnRzIG9mIGEgU09BUCBBcnJheSBvciBMaXN0PC9mb250PjwvaDQ+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSA8aT5fX3B0cjwvaT4gZmllbGQgaW4gYSA8aT48Yj5zdHJ1Y3Q8L2I+PC9pPiBvciA8aT48Yj5jbGFzczwvYj48L2k+IGRlY2xhcmF0aW9uIG9mIGEgZHluYW1pYyBhcnJheSBtYXkgaGF2ZSBhbiBvcHRpb25hbCBzdWZmaXggcGFydCB0aGF0DQorZGVzY3JpYmVzIHRoZSBuYW1lIG9mIHRoZSB0YWdzIG9mIHRoZSBTT0FQIGFycmF5IFhNTCBlbGVtZW50cy4NCitUaGUgc3VmZml4IGlzIHBhcnQgb2YgdGhlIGZpZWxkIG5hbWU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzx1PjxzcGFuIGNsYXNzPSJyb21hbiI+VHlwZTwvc3Bhbj48L3U+ICpfX3B0cjx1PjxzcGFuIGNsYXNzPSJyb21hbiI+YXJyYXlfZWx0X25hbWU8L3NwYW4+PC91Pg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIHN1ZmZpeCBkZXNjcmliZXMgdGhlIHRhZyBuYW1lIHRvIGJlIHVzZWQgZm9yIGFsbCBhcnJheSBlbGVtZW50cy4gVGhlIHVzdWFsIGlkZW50aWZpZXIgdG8gWE1MIHRyYW5zbGF0aW9ucyBhcHBseSwgc2VlDQorU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6aWR0cmFucyI+OS4zPC9hPi4NCitUaGUgZGVmYXVsdCBYTUwgZWxlbWVudCB0YWcgbmFtZSBmb3IgYXJyYXkgZWxlbWVudHMgaXMgPHR0Pml0ZW08L3R0PiAod2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIHVzZSBvZiBmaWVsZCBuYW1lIDxpPl9fcHRyaXRlbTwvaT4pLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitDb25zaWRlciBmb3IgZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+c3RydWN0PC9iPiZuYnNwO0FycmF5T2ZzdHJpbmcgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt4c2RfX3N0cmluZyAqX19wdHJzdHJpbmc7DQorJm5ic3A7Jm5ic3A7Jm5ic3A7aW50IF9fc2l6ZTsNCit9Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIGFycmF5IGlzIHNlcmlhbGl6ZWQgYXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBCMEQwIj48dHI+PHRkPjx0dD4NCismbHQ7YXJyYXkgeHNpOnR5cGU9IlNPQVAtRU5DOkFycmF5IiBTT0FQLUVOQzphcnJheVR5cGU9InhzZDpzdHJpbmdbMl0mIzE4NzsgPGJyIC8+DQorJmx0O3N0cmluZyB4c2k6dHlwZT0ieHNkOnN0cmluZyYjMTg3O0hlbGxvJmx0Oy9zdHJpbmcmIzYyOyA8YnIgLz4NCismbHQ7c3RyaW5nIHhzaTp0eXBlPSJ4c2Q6c3RyaW5nJiMxODc7V29ybGQmbHQ7L3N0cmluZyYjNjI7IDxiciAvPg0KKyZsdDsvYXJyYXkmIzYyOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3R0Pg0KK1NPQVAgMS4xIGFuZCAxLjIgZG8gbm90IHJlcXVpcmUgdGhlIHVzZSBvZiBhIHNwZWNpZmljIHRhZyBuYW1lIGZvciBhcnJheSBlbGVtZW50cy4gIGdTT0FQIHdpbGwgZGVzZXJpYWxpemUgYSBTT0FQIGFycmF5IHdoaWxlDQoraWdub3JpbmcgdGhlIHRhZyBuYW1lcy4gQ2VydGFpbiBYTUwgU2NoZW1hcyB1c2VkIGluIGRvYy9saXRlcmFsIGVuY29kaW5nIG1heSByZXF1aXJlIHRoZSBkZWNsYXJhdGlvbiBvZiBhcnJheSBlbGVtZW50IHRhZyBuYW1lcy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCSAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWMxMC4xMSI+DQorMTAuMTE8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPkJhc2U2NEJpbmFyeSBYTUwgU2NoZW1hIFR5cGUgRW5jb2Rpbmc8L2ZvbnQ+PC9oMz48YSBuYW1lPSJzZWM6YmFzZTY0YmluYXJ5Ij4NCis8L2E+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSA8dHQ+YmFzZTY0QmluYXJ5PC90dD4gWE1MIFNjaGVtYSB0eXBlIGlzIGEgc3BlY2lhbCBmb3JtIG9mIGR5bmFtaWMgYXJyYXkgZGVjbGFyZWQgd2l0aCBhIHBvaW50ZXIgKDxpPl9fcHRyPC9pPikgdG8gYW4NCis8aT48Yj51bnNpZ25lZDwvYj4mbmJzcDs8Yj5jaGFyPC9iPjwvaT4gYXJyYXkuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0ZvciBleGFtcGxlIHVzaW5nIGEgPGk+PGI+c3RydWN0PC9iPjwvaT46DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDt4c2RfX2Jhc2U2NEJpbmFyeSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnVuc2lnbmVkPC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7Kl9fcHRyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7X19zaXplOyA8YnIgLz4NCit9Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorT3Igd2l0aCBhIDxpPjxiPmNsYXNzPC9iPjwvaT46DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPmNsYXNzPC9iPiZuYnNwO3hzZF9fYmFzZTY0QmluYXJ5IDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cHVibGljPC9iPjogPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+dW5zaWduZWQ8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqX19wdHI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmludDwvYj4mbmJzcDtfX3NpemU7IDxiciAvPg0KK307DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitXaGVuIGNvbXBpbGVkIGJ5IHRoZSBnU09BUCBzdHViIGFuZCBza2VsZXRvbiBjb21waWxlciwgdGhpcyBoZWFkZXIgZmlsZSBzcGVjaWZpY2F0aW9uIHdpbGwgZ2VuZXJhdGUgPHR0PmJhc2U2NEJpbmFyeTwvdHQ+IHNlcmlhbGl6ZXJzIGFuZCBkZXNlcmlhbGl6ZXJzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgPHR0PlNPQVBfRU5DOmJhc2U2NDwvdHQ+IGVuY29kaW5nIGlzIGFub3RoZXIgdHlwZSBmb3IgYmFzZSA2NCBiaW5hcnkgZW5jb2RpbmcNCitzcGVjaWZpZWQgYnkgdGhlIFNPQVAgZGF0YSB0eXBlIHNjaGVtYSBhbmQgc29tZSBTT0FQIGFwcGxpY2F0aW9ucyBtYXkgdXNlIHRoaXMgZm9ybQ0KKyhhcyBpbmRpY2F0ZWQgYnkgdGhlaXIgV1NETCBkZXNjcmlwdGlvbnMpLiBJdCBpcyBkZWNsYXJlZCBieToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+c3RydWN0PC9iPiZuYnNwO1NPQVBfRU5DX19iYXNlNjQgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj51bnNpZ25lZDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypfX3B0cjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aW50PC9iPiZuYnNwO19fc2l6ZTsgPGJyIC8+DQorfTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK09yIHdpdGggYSA8aT48Yj5jbGFzczwvYj48L2k+Og0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5jbGFzczwvYj4mbmJzcDtTT0FQX0VOQ19fYmFzZTY0IDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+dW5zaWduZWQ8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqX19wdHI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmludDwvYj4mbmJzcDtfX3NpemU7IDxiciAvPg0KK307DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitXaGVuIGNvbXBpbGVkIGJ5IHRoZSBnU09BUCBzdHViIGFuZCBza2VsZXRvbiBjb21waWxlciwgdGhpcyBoZWFkZXIgZmlsZSBzcGVjaWZpY2F0aW9uIHdpbGwgZ2VuZXJhdGUgPHR0PlNPQVAtRU5DOmJhc2U2NDwvdHQ+IHNlcmlhbGl6ZXJzIGFuZCBkZXNlcmlhbGl6ZXJzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgYWR2YW50YWdlIG9mIHVzaW5nIGEgPGk+PGI+Y2xhc3M8L2I+PC9pPiBpcyB0aGF0IG1ldGhvZHMgY2FuIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSBhbmQgbWFuaXB1bGF0ZSB0aGUgPGk+X19wdHI8L2k+IGFuZCA8aT5fX3NpemU8L2k+IGZpZWxkcy4gVGhlIHVzZXIgY2FuIGFkZCBtZXRob2RzIHRvIHRoaXMgY2xhc3MgdG8gZG8gdGhpcy4gRm9yIGV4YW1wbGU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPmNsYXNzPC9iPiZuYnNwO3hzZF9fYmFzZTY0QmluYXJ5IDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cHVibGljPC9iPjogPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+dW5zaWduZWQ8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqX19wdHI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmludDwvYj4mbmJzcDtfX3NpemU7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3hzZF9fYmFzZTY0QmluYXJ5KCk7IC8vIENvbnN0cnVjdG9yIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3hzZF9fYmFzZTY0QmluYXJ5KDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj5pbnQ8L2I+Jm5ic3A7bik7IC8vIENvbnN0cnVjdG9yIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO354c2RfX2Jhc2U2NEJpbmFyeSgpOyAvLyBEZXN0cnVjdG9yIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnVuc2lnbmVkPC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KmxvY2F0aW9uKCk7IC8vIHJldHVybnMgdGhlIG1lbW9yeSBsb2NhdGlvbiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7c2l6ZSgpOyAvLyByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgPGJyIC8+DQorfTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK0hlcmUgYXJlIGV4YW1wbGUgbWV0aG9kIGltcGxlbWVudGF0aW9uczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQoreHNkX19iYXNlNjRCaW5hcnk6OnhzZF9fYmFzZTY0QmluYXJ5KCkgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtfX3B0ciA9IE5VTEw7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO19fc2l6ZSA9IDA7IDxiciAvPg0KK30gPGJyIC8+DQoreHNkX19iYXNlNjRCaW5hcnk6OnhzZF9fYmFzZTY0QmluYXJ5KDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj5pbnQ8L2I+Jm5ic3A7bikgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtfX3B0ciA9ICg8Yj51bnNpZ25lZDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiopc29hcF9tYWxsb2Moc29hcCwgbik7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO19fc2l6ZSA9IG47IDxiciAvPg0KK30gPGJyIC8+DQoreHNkX19iYXNlNjRCaW5hcnk6On54c2RfX2Jhc2U2NEJpbmFyeSgpIDxiciAvPg0KK3sgfSA8YnIgLz4NCis8Yj51bnNpZ25lZDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyp4c2RfX2Jhc2U2NEJpbmFyeTo6bG9jYXRpb24oKSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDtfX3B0cjsgPGJyIC8+DQorfSA8YnIgLz4NCis8Yj5pbnQ8L2I+Jm5ic3A7eHNkX19iYXNlNjRCaW5hcnk6OnNpemUoKSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDtfX3NpemU7IDxiciAvPg0KK30NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbiBDL0MrKyByZWFkcyBmcm9tIGEgcmF3IGltYWdlIGZpbGUgYW5kIGVuY29kZXMgdGhlIGltYWdlIGluIFNPQVAgdXNpbmcgdGhlIDx0dD5iYXNlNjRCaW5hcnk8L3R0PiB0eXBlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisuLi4gPGJyIC8+DQorRklMRSAqZmQgPSBmb3Blbig8dHQ+ImltYWdlLmpwZyI8L3R0PiwgPHR0PiJyYiI8L3R0Pik7IDxiciAvPg0KK3hzZF9fYmFzZTY0QmluYXJ5IGltYWdlKCZhbXA7c29hcCwgZmlsZXNpemUoZmQpKTsgPGJyIC8+DQorZnJlYWQoaW1hZ2UubG9jYXRpb24oKSwgaW1hZ2Uuc2l6ZSgpLCAxLCBmZCk7IDxiciAvPg0KK2ZjbG9zZShmZCk7IDxiciAvPg0KK3NvYXBfYmVnaW4oJmFtcDtzb2FwKTsgPGJyIC8+DQoraW1hZ2Uuc29hcF9zZXJpYWxpemUoJmFtcDtzb2FwKTsgPGJyIC8+DQoraW1hZ2Uuc29hcF9wdXQoJmFtcDtzb2FwLCA8dHQ+ImpwZWdpbWFnZSI8L3R0PiwgTlVMTCk7IDxiciAvPg0KK3NvYXBfZW5kKCZhbXA7c29hcCk7IDxiciAvPg0KKy4uLg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQord2hlcmUgPGk+ZmlsZXNpemU8L2k+IGlzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBzaXplIG9mIGEgZmlsZSBnaXZlbiBhIGZpbGUgZGVzY3JpcHRvci4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorUmVhZGluZyB0aGUgPHR0PnhzZDpiYXNlNjRCaW5hcnk8L3R0PiBlbmNvZGVkIGltYWdlLg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisuLi4gPGJyIC8+DQoreHNkX19iYXNlNjRCaW5hcnkgaW1hZ2U7IDxiciAvPg0KK3NvYXBfYmVnaW4oJmFtcDtzb2FwKTsgPGJyIC8+DQoraW1hZ2UuZ2V0KCZhbXA7c29hcCwgPHR0PiJqcGVnaW1hZ2UiPC90dD4pOyA8YnIgLz4NCitzb2FwX2VuZCgmYW1wO3NvYXApOyA8YnIgLz4NCisuLi4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoZSA8aT48Yj5zdHJ1Y3Q8L2I+PC9pPiBvciA8aT48Yj5jbGFzczwvYj48L2k+IG5hbWUgPGk+c29hcF9lbmNfX2Jhc2U2NDwvaT4gc2hvdWxkIGJlIHVzZWQgZm9yIDx0dD5TT0FQLUVOQzpiYXNlNjQ8L3R0PiBzY2hlbWEgdHlwZSBpbnN0ZWFkIG9mDQorPGk+eHNkX19iYXNlNjRCaW5hcnk8L2k+Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJICAgICA8aDM+PGEgbmFtZT0idHRoX3NFYzEwLjEyIj4NCisxMC4xMjwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+aGV4QmluYXJ5IFhNTCBTY2hlbWEgVHlwZSBFbmNvZGluZzwvZm9udD48L2gzPjxhIG5hbWU9InNlYzpoZXhiaW5hcnkiPg0KKzwvYT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIDx0dD5oZXhCaW5hcnk8L3R0PiBYTUwgU2NoZW1hIHR5cGUgaXMgYSBzcGVjaWFsIGZvcm0gb2YgZHluYW1pYyBhcnJheSBkZWNsYXJlZCB3aXRoIHRoZSBuYW1lIDxpPnhzZF9faGV4QmluYXJ5PC9pPiBhbmQgYSBwb2ludGVyICg8aT5fX3B0cjwvaT4pIHRvIGFuIDxpPjxiPnVuc2lnbmVkPC9iPiZuYnNwOzxiPmNoYXI8L2I+PC9pPiBhcnJheS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorRm9yIGV4YW1wbGUsIHVzaW5nIGEgPGk+PGI+c3RydWN0PC9iPjwvaT46DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDt4c2RfX2hleEJpbmFyeSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnVuc2lnbmVkPC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7Kl9fcHRyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7X19zaXplOyA8YnIgLz4NCit9Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorT3IgdXNpbmcgYSA8aT48Yj5jbGFzczwvYj48L2k+Og0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5jbGFzczwvYj4mbmJzcDt4c2RfX2hleEJpbmFyeSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnB1YmxpYzwvYj46IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnVuc2lnbmVkPC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7Kl9fcHRyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7X19zaXplOyA8YnIgLz4NCit9Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorV2hlbiBjb21waWxlZCBieSB0aGUgZ1NPQVAgc3R1YiBhbmQgc2tlbGV0b24gY29tcGlsZXIsIHRoaXMgaGVhZGVyIGZpbGUgc3BlY2lmaWNhdGlvbiB3aWxsIGdlbmVyYXRlIDx0dD5iYXNlNjRCaW5hcnk8L3R0PiBzZXJpYWxpemVycyBhbmQgZGVzZXJpYWxpemVycy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCSAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWMxMC4xMyI+DQorMTAuMTM8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPkxpdGVyYWwgWE1MIEVuY29kaW5nIFN0eWxlPC9mb250PjwvaDM+PGEgbmFtZT0ic2VjOmxpdGVyYWwiPg0KKzwvYT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorZ1NPQVAgc3VwcG9ydHMgZG9jdW1lbnQvbGl0ZXJhbCBlbmNvZGluZyBieSBkZWZhdWx0Lg0KK0p1c3QgYXMgd2l0aCBTT0FQIFJQQyBlbmNvZGluZywgbGl0ZXJhbCBlbmNvZGluZyByZXF1aXJlcyB0aGUgWE1MIFNjaGVtYSBvZiB0aGUgbWVzc2FnZSBkYXRhIHRvIGJlIHByb3ZpZGVkDQorZS5nLiZuYnNwO2luIFdTREwgaW4gb3JkZXIgZm9yIHRoZQ0KK2dTT0FQIGNvbXBpbGVyIHRvIGdlbmVyYXRlIHRoZSAoZGUpc2VyaWFsaXphdGlvbiByb3V0aW5lcy4gIEFsdGVybmF0aXZlbHksIHRoZQ0KK29wdGlvbmFsIERPTSBwYXJzZXIgKDxpPmRvbS5jPC9pPiBhbmQgPGk+ZG9tKysuY3BwPC9pPikgY2FuIGJlIHVzZWQgdG8gaGFuZGxlIGdlbmVyaWMgWE1MIG9yDQorYXJiaXRyYXJ5IFhNTCBkb2N1bWVudHMgY2FuIGJlIChkZSlzZXJpYWxpemVkIGludG8gcmVndWxhciBDIHN0cmluZ3Mgb3Igd2lkZQ0KK2NoYXJhY3RlciBzdHJpbmdzICg8aT53Y2hhcl90KjwvaT4pIGJ5IGdTT0FQIChzZWUgU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6bGl0ZXJhbDIiPjEwLjEzLjE8L2E+KS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIDxpPi8vZ3NvYXAgc2VydmljZSBlbmNvZGluZzwvaT4sIDxpPi8vZ3NvYXAgc2VydmljZSBtZXRob2QtZW5jb2Rpbmc8L2k+LCBhbmQgPGk+Ly9nc29hcCBzZXJ2aWNlIG1ldGhvZC1yZXNwb25zZS1lbmNvZGluZzwvaT4gZGlyZWN0aXZlcyBleHBsaWNpdGx5IGVuYWJsZSBTT0FQIGVuY29kZWQgb3IgbGl0ZXJhbCBlbmNvZGVkIG1lc3NhZ2VzLiBGb3IgZXhhbXBsZSwgdG8gZW5hYmxlIFJQQyBlbmNvZGluZyBzdHlsZSBmb3IgdGhlIGVudGlyZSBzZXJ2aWNlLCB1c2U6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vZ3NvYXAgbnMgc2VydmljZSBlbmNvZGluZzogZW5jb2RlZA0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVG8gZW5hYmxlIGVuY29kaW5nIGZvciBwYXJ0aWN1bGFyIHNlcnZpY2UgbWV0aG9kcywgdXNlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisvL2dzb2FwIG5zIHNlcnZpY2UgbWV0aG9kLWVuY29kaW5nOiBteU1ldGhvZCBlbmNvZGVkIDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDtuc19fbXlNZXRob2QoLi4uKQ0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVG8gZW5hYmxlIGVuY29kaW5nIGZvciBwYXJ0aWN1bGFyIHNlcnZpY2UgbWV0aG9kcyByZXNwb25zZXMgd2hlbiB0aGUgbWV0aG9kIHJlcXVlc3QgaXMgbGl0ZXJhbCwgdXNlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisvL2dzb2FwIG5zIHNlcnZpY2UgbWV0aG9kLXJlc3BvbnNlLWVuY29kaW5nOiBteU1ldGhvZCBlbmNvZGVkIDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDtuc19fbXlNZXRob2QoLi4uKQ0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorSW5zdGVhZCBvZiB0aGUgPGk+ZW5jb2RlZDwvaT4gdmFsdWUsIHlvdSBjYW4gdXNlIDxpPmxpdGVyYWw8L2k+LCBvciBhIHNwZWNpZmljIGVuY29kaW5nIHN0eWxlIHZhbHVlLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitDb25zaWRlciB0aGUgZm9sbG93aW5nIGV4YW1wbGUgdGhhdCB1c2VzIHRoZSBkaXJlY3RpdmUgdG8gbWFrZSB0aGUgbGl0ZXJhbCBlbmNvZGluZyBleHBsaWNpdC4NCitUaGUgPGk+TG9jYWxUaW1lQnlaaXBDb2RlPC9pPiByZW1vdGUgc2VydmljZSBtZXRob2Qgb2YgdGhlIExvY2FsVGltZSBzZXJ2aWNlIHByb3ZpZGVzDQordGhlIGxvY2FsIHRpbWUgZ2l2ZW4gYSB6aXAgY29kZSBhbmQgdXNlcyBsaXRlcmFsIGVuY29kaW5nICh3aXRoIE1TDQorLk5FVCkuICBUaGUgZm9sbG93aW5nIGhlYWRlciBmaWxlIGRlY2xhcmVzIHRoZSBtZXRob2Q6IDxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT5pbnQNCitMb2NhbFRpbWVCeVppcENvZGUoPGI+Y2hhcjwvYj4mbmJzcDsqWmlwQ29kZSwgPGI+Y2hhcjwvYj4mbmJzcDsqKkxvY2FsVGltZUJ5WmlwQ29kZVJlc3VsdCk7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4gTm90ZSB0aGF0IG5vbmUgb2YgdGhlIGRhdGEgdHlwZXMgbmVlZCB0byBiZSBuYW1lc3BhY2UgcXVhbGlmaWVkIHVzaW5nDQorbmFtZXNwYWNlIHByZWZpeGVzLg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisvL2dzb2FwIG5zIHNlcnZpY2UgbmFtZTogbG9jYWx0aW1lIDxiciAvPg0KKy8vZ3NvYXAgbnMgc2VydmljZSBlbmNvZGluZzogbGl0ZXJhbCA8YnIgLz4NCisvL2dzb2FwIG5zIHNlcnZpY2UgbmFtZXNwYWNlOiBodHRwOi8vYWxldGhlYS5uZXQvd2Vic2VydmljZXMvIDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDtuc19fTG9jYWxUaW1lQnlaaXBDb2RlKDxiPmNoYXI8L2I+Jm5ic3A7KlppcENvZGUsIDxiPmNoYXI8L2I+Jm5ic3A7KipMb2NhbFRpbWVCeVppcENvZGVSZXN1bHQpOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorSW4gdGhpcyBjYXNlLCB0aGUgbWV0aG9kIG5hbWUgcmVxdWlyZXMgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGEgc2NoZW1hIHRocm91Z2ggYSBuYW1lc3BhY2UgcHJlZml4LCBlLmcuIDxpPm5zPC9pPiBpcyB1c2VkIGluIHRoaXMgZXhhbXBsZS4NCitTZWUgU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6ZGlyZWN0aXZlcyI+MTguMjwvYT4gZm9yIG1vcmUgZGV0YWlscyBvbiBnU09BUCBkaXJlY3RpdmVzLg0KK1dpdGggdGhlc2UgZGlyZWN0aXZlcywgdGhlIGdTT0FQIGNvbXBpbGVyIGdlbmVyYXRlcyBjbGllbnQgYW5kIHNlcnZlciBzb3VyY2VzIHdpdGggdGhlIHNwZWNpZmllZCBzZXR0aW5ncy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIGV4YW1wbGUgY2xpZW50IHByb2dyYW0gaXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKyNpbmNsdWRlICJzb2FwSC5oIiA8YnIgLz4NCisjaW5jbHVkZSAibG9jYWx0aW1lLm5zbWFwIiAvLyBpbmNsdWRlIGdlbmVyYXRlZCBtYXAgZmlsZSA8YnIgLz4NCis8Yj5pbnQ8L2I+Jm5ic3A7bWFpbigpIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgc29hcDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqdDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9pbml0KCZhbXA7c29hcCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyhzb2FwX2NhbGxfbnNfX0xvY2FsVGltZUJ5WmlwQ29kZSgmYW1wO3NvYXAsICJodHRwOi8vYWxldGhlYS5uZXQvd2Vic2VydmljZXMvTG9jYWxUaW1lLmFzbXgiLCAiaHR0cDovL2FsZXRoZWEubmV0L3dlYnNlcnZpY2VzL0xvY2FsVGltZUJ5WmlwQ29kZSIsICIzMjMwNiIsICZhbXA7dCkpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfcHJpbnRfZmF1bHQoJmFtcDtzb2FwLCBzdGRlcnIpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5lbHNlPC9iPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3ByaW50ZigiVGltZSA9ICVzPHR0PlxuPC90dD4iLCB0KTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cmV0dXJuPC9iPiZuYnNwOzA7IDxiciAvPg0KK30gPGJyIC8+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVG8gaWxsdXN0cmF0ZSB0aGUgbWFudWFsIGRvYy9saXRlcmFsIHNldHRpbmcsIHRoZSBmb2xsb3dpbmcgY2xpZW50IHByb2dyYW0gc2V0cw0KK3RoZSByZXF1aXJlZCBwcm9wZXJ0aWVzIGJlZm9yZSB0aGUgY2FsbDoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorI2luY2x1ZGUgInNvYXBILmgiIDxiciAvPg0KKyNpbmNsdWRlICJsb2NhbHRpbWUubnNtYXAiIC8vIGluY2x1ZGUgZ2VuZXJhdGVkIG1hcCBmaWxlIDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDttYWluKCkgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCBzb2FwOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyp0OyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2luaXQoJmFtcDtzb2FwKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcC5lbmNvZGluZ1N0eWxlID0gTlVMTDsgLy8gZG9uJ3QgdXNlIFNPQVAgZW5jb2RpbmcgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9zZXRfb21vZGUoJmFtcDtzb2FwLCBTT0FQX1hNTF9UUkVFKTsiIC8vIGRvbid0IHByb2R1Y2UgbXVsdGktcmVmIGRhdGEgKGJ1dCBjYW4gYWNjZXB0KSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoc29hcF9jYWxsX25zX19Mb2NhbFRpbWVCeVppcENvZGUoJmFtcDtzb2FwLCAiaHR0cDovL2FsZXRoZWEubmV0L3dlYnNlcnZpY2VzL0xvY2FsVGltZS5hc214IiwgImh0dHA6Ly9hbGV0aGVhLm5ldC93ZWJzZXJ2aWNlcy9Mb2NhbFRpbWVCeVppcENvZGUiLCAiMzIzMDYiLCAmYW1wO3QpKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwX3ByaW50X2ZhdWx0KCZhbXA7c29hcCwgc3RkZXJyKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+ZWxzZTwvYj48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtwcmludGYoIlRpbWUgPSAlczx0dD5cbjwvdHQ+IiwgdCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDswOyA8YnIgLz4NCit9DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgU09BUCByZXF1ZXN0IGlzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwQjBEMCI+PHRyPjx0ZD48dHQ+DQorUE9TVCAvd2Vic2VydmljZXMvTG9jYWxUaW1lLmFzbXggSFRUUC8xLjAgPGJyIC8+DQorSG9zdDogYWxldGhlYS5uZXQgPGJyIC8+DQorQ29udGVudC1UeXBlOiB0ZXh0L3htbDsgY2hhcnNldD11dGYtOCA8YnIgLz4NCitDb250ZW50LUxlbmd0aDogNDc5IDxiciAvPg0KK1NPQVBBY3Rpb246ICJodHRwOi8vYWxldGhlYS5uZXQvd2Vic2VydmljZXMvTG9jYWxUaW1lQnlaaXBDb2RlIiA8YnIgLz4NCis8YnIgLz4NCismbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSYjMjIwO1RGLTgiPyYjNjI7IDxiciAvPg0KKyZsdDtTT0FQLUVOVjpFbnZlbG9wZSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt4bWxuczpTT0FQLUVOVj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3htbG5zOlNPQVAtRU5DPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O1NPQVAtRU5WOkJvZHkmIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7TG9jYWxUaW1lQnlaaXBDb2RlIHhtbG5zPSJodHRwOi8vYWxldGhlYS5uZXQvd2Vic2VydmljZXMvIiYjNjI7IDxiciAvPg0KKyZsdDtaaXBDb2RlJiM2MjszMjMwNiZsdDsvWmlwQ29kZSYjNjI7Jmx0Oy9Mb2NhbFRpbWVCeVppcENvZGUmIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbHQ7L1NPQVAtRU5WOkJvZHkmIzYyOyA8YnIgLz4NCismbHQ7L1NPQVAtRU5WOkVudmVsb3BlJiM2MjsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC90dD4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCSAgICAgIDxoND48YSBuYW1lPSJ0dGhfc0VjMTAuMTMuMSI+DQorMTAuMTMuMTwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+U2VyaWFsaXppbmcgYW5kIERlc2VyaWFsaXppbmcgTWl4ZWQgQ29udGVudCBYTUwgV2l0aCBTdHJpbmdzPC9mb250PjwvaDQ+PGEgbmFtZT0ic2VjOmxpdGVyYWwyIj4NCis8L2E+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RvIGRlY2xhcmUgYSBsaXRlcmFsIFhNTCAidHlwZSIgdG8gaG9sZCBYTUwgZG9jdW1lbnRzIGluIHJlZ3VsYXIgc3RyaW5ncywgdXNlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KlhNTDsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RvIGRlY2xhcmUgYSBsaXRlcmFsIFhNTCAidHlwZSIgdG8gaG9sZCBYTUwgZG9jdW1lbnRzIGluIHdpZGUgY2hhcmFjdGVyIHN0cmluZ3MsIHVzZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDt3Y2hhcl90ICpYTUw7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitOb3RlOiBvbmx5IG9uZSBvZiB0aGUgdHdvIHN0b3JhZ2UgZm9ybWF0cyBjYW4gYmUgdXNlZC4NCitUaGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdXNlIG9mIHJlZ3VsYXIgc3RyaW5ncyB2ZXJzdXMgd2lkZSBjaGFyYWN0ZXIgc3RyaW5ncyBmb3IgWE1MIGRvY3VtZW50cyBhcmU6DQorDQorPHVsPg0KKzxsaT4gUmVndWxhciBzdHJpbmdzIGZvciBYTUwgZG9jdW1lbnRzIE1VU1QgaG9sZCBVVEYtOCBlbmNvZGVkIFhNTCBkb2N1bWVudHMuIFRoYXQgaXMsIHRoZSBzdHJpbmcgTVVTVCBjb250YWluIHRoZSBwcm9wZXIgVVRGLTgNCitlbmNvZGluZyB0byBleGNoYW5nZSB0aGUgWE1MIGRvY3VtZW50IGluIFNPQVAgbWVzc2FnZXMuDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorDQorPGxpPiBXaWRlIGNoYXJhY3RlciBzdHJpbmdzIGZvciBYTUwgZG9jdW1lbnRzIFNIT1VMRCBOT1QgaG9sZCBVVEYtOCBlbmNvZGVkIFhNTCBkb2N1bWVudHMuIEluc3RlYWQsIHRoZSBVVEYtOCB0cmFuc2xhdGlvbiBpcyBkb25lIGF1dG9tYXRpY2FsbHkgYnkNCit0aGUgZ1NPQVAgcnVudGltZSBtYXJzaGFsbGluZyByb3V0aW5lcy4NCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorPC9saT4NCis8L3VsPg0KK0hlcmUgaXMgYW4gZXhhbXBsZSBvZiBhIHJlbW90ZSBtZXRob2Qgc3BlY2lmaWNhdGlvbiBpbiB3aGljaCB0aGUgcGFyYW1ldGVycyBvZiB0aGUgcmVtb3RlIG1ldGhvZCB1c2VzIGxpdGVyYWwgWE1MIGVuY29kaW5nIHRvIHBhc3MNCithbiBYTUwgZG9jdW1lbnQgdG8gYSBzZXJ2aWNlIGFuZCBiYWNrOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KlhNTDsgPGJyIC8+DQorbnNfX0dldERvY3VtZW50KFhNTCBtX19YTUxEb2MsIFhNTCAmYW1wO21fX1hNTERvY18pOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIDxpPm5zX19Eb2N1bWVudDwvaT4gaXMgZXNzZW50aWFsbHkgYSA8aT48Yj5zdHJ1Y3Q8L2I+PC9pPiB0aGF0IGZvcm1zIHRoZSByb290IG9mIHRoZSBYTUwgZG9jdW1lbnQuDQorVGhlIHVzZSBvZiB0aGUgdW5kZXJzY29yZSBpbiB0aGUgPGk+bnNfX0RvY3VtZW50PC9pPiByZXNwb25zZSBwYXJ0IG9mIHRoZSBtZXNzYWdlIGF2b2lkcyB0aGUgbmFtZSBjbGFzaCBiZXR3ZWVuIHRoZQ0KKzxpPjxiPnN0cnVjdDwvYj48L2k+cy4NCitBc3N1bWluZyB0aGF0IHRoZSBuYW1lc3BhY2UgbWFwcGluZyB0YWJsZSBjb250YWlucyB0aGUgYmluZGluZyBvZiA8aT5uczwvaT4gdG8gPHR0Pmh0dHA6Ly9teS5vcmcvPC90dD4NCithbmQgdGhlIGJpbmRpbmcgb2YgPGk+bTwvaT4gdG8gPHR0Pmh0dHA6Ly9teS5vcmcvbXlkb2MueHNkPC90dD4sIHRoZSBYTUwgbWVzc2FnZSBpczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEIwRDAiPjx0cj48dGQ+PHR0Pg0KKyZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8mIzYyOyA8YnIgLz4NCismbHQ7U09BUC1FTlY6RW52ZWxvcGUgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eG1sbnM6U09BUC1FTlY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt4bWxuczpTT0FQLUVOQz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3htbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3htbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3htbG5zOm5zPSJodHRwOi8vbXkub3JnLyIgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eG1sbnM6bT0iaHR0cDovL215Lm9yZy9teWRvYy54c2QiIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO1NPQVAtRU5WOmVuY29kaW5nU3R5bGU9IiImIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbHQ7U09BUC1FTlY6Qm9keSYjNjI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtuczpHZXREb2N1bWVudCYjNjI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtYTUxEb2MgeG1sbnM9Imh0dHA6Ly9teS5vcmcvbXlkb2MueHNkIiYjNjI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOy4uLiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7L1hNTERvYyYjNjI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDsvbnM6RG9jdW1lbnQmIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbHQ7L1NPQVAtRU5WOkJvZHkmIzYyOyA8YnIgLz4NCismbHQ7L1NPQVAtRU5WOkVudmVsb3BlJiM2MjsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC90dD4NCitXaGVuIHVzaW5nIGxpdGVyYWwgZW5jb2Rpbmcgb2YgbWV0aG9kIHBhcmFtZXRlcnMgYW5kIHJlc3BvbnNlIGFzIHNob3duIGluIHRoZSBleGFtcGxlIGFib3ZlLCB0aGUgbGl0ZXJhbCBYTUwgZW5jb2Rpbmcgc3R5bGUgTVVTVCBiZSBzcGVjaWZpZWQgYnkgc2V0dGluZyA8aT5zb2FwLmVuY29kaW5nU3R5bGU8L2k+Lg0KK0ZvciBleGFtcGxlLCB0byBzcGVjaWZ5IG5vIGNvbnN0cmFpbnRzIG9uIHRoZSBlbmNvZGluZyBzdHlsZSAod2hpY2ggaXMgdHlwaWNhbCkgdXNlIE5VTEw6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwIHNvYXA7IDxiciAvPg0KK3NvYXBfaW5pdCgmYW1wO3NvYXApOyA8YnIgLz4NCitzb2FwLmVuY29kaW5nU3R5bGUgPSBOVUxMOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorQXMgYSByZXN1bHQsIHRoZSA8dHQ+U09BUC1FTlY6ZW5jb2RpbmdTdHlsZTwvdHQ+IGF0dHJpYnV0ZSB3aWxsIG5vdCBhcHBlYXIgaW4gdGhlIFNPQVAgcGF5bG9hZC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorRm9yIGludGVyb3BlcmFiaWxpdHkgd2l0aCBBcGFjaGUgU09BUCwgdXNlDQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwIHNvYXA7IDxiciAvPg0KK3NvYXBfaW5pdCgmYW1wO3NvYXApOyA8YnIgLz4NCitzb2FwLmVuY29kaW5nU3R5bGUgPSAiaHR0cDovL3htbC5hcGFjaGUub3JnL3htbC1zb2FwL2xpdGVyYWx4bWwiOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorV2hlbiB0aGUgcmVzcG9uc2UgcGFyYW1ldGVyIGlzIGFuIFhNTCB0eXBlLCBpdCB3aWxsIHN0b3JlIHRoZSBlbnRpcmUgWE1MIHJlc3BvbnNlIGNvbnRlbnQgYnV0IHdpdGhvdXQgdGhlIGVudmVsb3BpbmcgcmVzcG9uc2UgZWxlbWVudC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIFhNTCB0eXBlIGNhbiBiZSB1c2VkIGFzIHBhcnQgb2YgYW55IGRhdGEgc3RydWN0dXJlIHRvIGVuYWJsZSB0aGUgcmVuZGVyaW5nIGFuZCBwYXJzaW5nIG9mIGN1c3RvbSBYTUwgZG9jdW1lbnRzLiBGb3IgZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypYTUw7IDxiciAvPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtuc19fRGF0YSAvKiBkYXRhIGluIG5hbWVzcGFjZSAnbnMnICovIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aW50PC9iPiZuYnNwO251bWJlcjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqbmFtZTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7WE1MIG1fX2RvY3VtZW50OyAvKiBYTUwgZG9jdW1lbnQgaW4gZGVmYXVsdCBuYW1lc3BhY2UgJ20nICovIDxiciAvPg0KK307IDxiciAvPg0KK25zX19FeGFtcGxlKDxiPnN0cnVjdDwvYj4mbmJzcDtuc19fRGF0YSBkYXRhLCA8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7bnNfX0V4YW1wbGVSZXNwb25zZSB7IDxiPnN0cnVjdDwvYj4mbmJzcDtuc19fRGF0YSBkYXRhOyB9ICpvdXQpOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKyA8aDI+PGEgbmFtZT0idHRoX3NFYzExIj4NCisxMTwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+U09BUCBGYXVsdCBQcm9jZXNzaW5nPC9mb250PjwvaDI+PGEgbmFtZT0ic2VjOmZhdWx0Ij4NCis8L2E+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0EgcHJlZGVjbGFyZWQgc3RhbmRhcmQgU09BUCBGYXVsdCBkYXRhIHN0cnVjdHVyZSBpcyBnZW5lcmF0ZWQgYnkgdGhlIGdTT0FQIHN0dWIgYW5kIHNrZWxldG9uIGNvbXBpbGVyIGZvciBleGNoYW5naW5nIGV4Y2VwdGlvbiBtZXNzYWdlcy4NCitUaGUgYnVpbHQtaW4gPGk+PGI+c3RydWN0PC9iPiZuYnNwO1NPQVBfRU5WX19GYXVsdDwvaT4gZGF0YSBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBhczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+c3RydWN0PC9iPiZuYnNwO1NPQVBfRU5WX19GYXVsdCA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO19RTmFtZSBmYXVsdGNvZGU7IC8vIF9RTmFtZSBpcyBidWlsdGluIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KmZhdWx0c3RyaW5nOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypmYXVsdGFjdG9yOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7U09BUF9FTkNfX0RldGFpbCAqZGV0YWlsOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7U09BUF9FTlZfX0NvZGUgKlNPQVBfRU5WX19Db2RlOyAvLyBNVVNUIGJlIGEgU09BUF9FTlZfX0NvZGUgc3RydWN0IGRlZmluZWQgYmVsb3cgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqU09BUF9FTlZfX1JlYXNvbjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqU09BUF9FTlZfX05vZGU7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KlNPQVBfRU5WX19Sb2xlOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7U09BUF9FTlZfX0RldGFpbCBTT0FQX0VOVl9fRGV0YWlsOyAvLyBTT0FQIDEuMiBkZXRhaWwgZmllbGQgPGJyIC8+DQorfTsNCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7U09BUF9FTlZfX0NvZGUgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtfUU5hbWUgU09BUF9FTlZfX1ZhbHVlOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7U09BUF9FTlZfX0NvZGUgKlNPQVBfRU5WX19TdWJjb2RlOw0KK307IDxiciAvPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtTT0FQX0VOVl9fRGV0YWlsIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aW50PC9iPiZuYnNwO19fdHlwZTsgLy8gVGhlIFNPQVBfVFlQRV8gb2YgdGhlIG9iamVjdCBzZXJpYWxpemVkIGFzIEZhdWx0IGRldGFpbCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj52b2lkPC9iPiZuYnNwOypmYXVsdDsgLy8gcG9pbnRlciB0byB0aGUgZmF1bHQgb2JqZWN0LCBvciBOVUxMIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7Kl9fYW55OyAvLyBhbnkgb3RoZXIgZGV0YWlsIGVsZW1lbnQgY29udGVudCAoc3RvcmVkIGluIFhNTCBmb3JtYXQpIDxiciAvPg0KK307DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgZmlyc3QgZm91ciBmaWVsZHMgaW4gPGk+U09BUF9FTlZfX0ZhdWx0PC9pPiBhcmUgU09BUCAxLjEgc3BlY2lmaWMuIFRoZSBsYXN0IGZpdmUgZmllbGRzIGFyZSBTT0FQIDEuMiBzcGVjaWZpYy4NCitZb3UgY2FuIHJlZGVmaW5lIHRoZXNlIHN0cnVjdHVyZXMgaW4gdGhlIGhlYWRlciBmaWxlLiBGb3IgZXhhbXBsZSwgeW91IGNhbiB1c2UgYSA8aT5jbGFzczwvaT4gZm9yIHRoZSA8aT5TT0FQX0VOVl9fRmF1bHQ8L2k+IGFuZCBhZGQgbWV0aG9kcyBmb3IgY29udmVuaWVuY2UuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBkYXRhIHN0cnVjdHVyZSBjb250ZW50IGNhbiBiZSBjaGFuZ2VkIHRvIHRoZSBuZWVkIG9mIGFuIGFwcGxpY2F0aW9uLCBidXQgdGhpcyBpcyBnZW5lcmFsbHkgbm90IG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBhcHBsaWNhdGlvbi1zcGVjaWZpYyBTT0FQIEZhdWx0IGRldGFpbHMgY2FuIGJlIHNlcmlhbGl6ZWQgdmlhIHRoZSA8aT5fX3R5cGU8L2k+IGFuZCA8aT5mYXVsdDwvaT4gZmllbGRzIGluIHRoZSA8aT5TT0FQX0VOVl9fRGV0YWlsPC9pPiBmaWVsZCwgc2VlIFNlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOnZvaWQiPjEwLjg8L2E+IG9uIHRoZSBzZXJpYWxpemF0aW9uIG9mIGRhdGEgcmVmZXJlZCB0byBieSA8aT5fX3R5cGU8L2k+IGFuZCA8aT5mYXVsdDwvaT4uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSA8aT5fX3R5cGU8L2k+IGZpZWxkIGFsbG93cyBhcHBsaWNhdGlvbiBkYXRhIHRvIGJlIHNlcmlhbGl6ZWQgYXMgcGFydCBvZiB0aGUgU09BUCBGYXVsdC4gVGhlIGFwcGxpY2F0aW9uIGRhdGEgU0hPVUxEIGJlIGRlZmluZWQgYXMgWE1MIGVsZW1lbnRzLCB3aGljaCByZXF1aXJlcyB5b3UgdG8gZGVjbGFyZSB0aGUgdHlwZSBuYW1lcyB3aXRoIGEgbGVhZGluZyB1bmRlcnNjb3JlIHRvIGVuc3VyZSB0aGF0IHRoZSB0eXBlcyBhcmUgY29tcGF0aWJsZSB3aXRoIFhNTCBlbGVtZW50cyBhbmQgbm90IGp1c3Qgc2ltcGxlVHlwZXMgYW5kIGNvbXBsZXhUeXBlcy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorV2hlbiB0aGUgc2tlbGV0b24gb2YgYSByZW1vdGUgbWV0aG9kIHJldHVybnMgYW4gZXJyb3IgKHNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzplcnJjb2RlcyI+OS4yPC9hPiksIHRoZW4gPGk+c29hcC5mYXVsdDwvaT4gY29udGFpbnMgdGhlIFNPQVANCitGYXVsdCBkYXRhIGF0IHRoZSByZWNlaXZpbmcgc2lkZSAoY2xpZW50KS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorU2VydmVyLXNpZGUgZmF1bHRzIGFyZSByYWlzZWQgd2l0aCA8aT5zb2FwX3NlbmRlcl9mYXVsdDwvaT4gb3IgPGk+c29hcF9yZWNlaXZlcl9mYXVsdDwvaT4uIFRoZSA8aT5zb2FwX3NlbmRlcl9mYXVsdDwvaT4gY2FsbCBzaG91bGQgYmUgdXNlZCB0byBpbmZvcm0gdGhhdCB0aGUgc2VuZGVyIGlzIGF0IGZhdWx0IGFuZCB0aGUgc2VuZGVyIChjbGllbnQpIHNob3VsZCBub3QgcmVzZW5kIHRoZSByZXF1ZXN0LiBUaGUgPGk+c29hcF9yZWNlaXZlcl9mYXVsdDwvaT4gY2FsbCBzaG91bGQgYmUgdXNlZCB0byBpbmRpY2F0ZSBhIHRlbXBvcmFyeSBzZXJ2ZXItc2lkZSBwcm9ibGVtLCBzbyBhIHNlbmRlciAoY2xpZW50KSBjYW4gcmVzZW5kIHRoZSByZXF1ZXN0IGxhdGVyLiBGb3IgZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+aW50PC9iPiZuYnNwO25zMV9fbXlNZXRob2QoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIC4uLikgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsuLi4gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cmV0dXJuPC9iPiZuYnNwO3NvYXBfcmVjZWl2ZXJfZmF1bHQoc29hcCwgIlJlc291cmNlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlIiwgTlVMTCk7IC8vIHJldHVybiBmYXVsdCB0byBzZW5kZXIgPGJyIC8+DQorfQ0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorSW4gdGhlIGV4YW1wbGUsIHRoZSBTT0FQIEZhdWx0IGRldGFpbHMgd2VyZSBlbXB0eSAoTlVMTCkuIFlvdSBtYXkgcGFzcyBhbiBYTUwgZnJhZ21lbnQsIHdoaWNoIHdpbGwgYmUgbGl0ZXJhbGx5IGluY2x1ZGVkIGluIHRoZSBTT0FQIEZhdWx0IG1lc3NhZ2UuIEZvciBXUy1JIEJhc2ljIFByb2ZpbGUgY29tcGxpYW5jZSwgeW91IG11c3QgcGFzcyBhbiBYTUwgc3RyaW5nIHdpdGggb25lIG9yIG1vcmUgbmFtZXNwYWNlIHF1YWxpZmllZCBlbGVtZW50cywgc3VjaCBhczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+cmV0dXJuPC9iPiZuYnNwO3NvYXBfcmVjZWl2ZXJfZmF1bHQoc29hcCwgIlJlc291cmNlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlIiwgIiAmbHQ7IGVycm9yY29kZSB4bWxucz0naHR0cDovL3RlbXB1cmkub3JnJyAmZ3Q7IDEyMyAmbHQ7IC9lcnJvcmNvZGUgJmd0OyAgJmx0OyBlcnJvcmluZm8geG1sbnM9J2h0dHA6Ly90ZW1wdXJpLm9yZycgJmd0OyBhYmMgJmx0OyAvZXJyb3JpbmZvICZndDsgIik7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorV2hlbiBhIHJlbW90ZSBtZXRob2QgbXVzdCByYWlzZSBhbiBleGNlcHRpb24gd2l0aCBhcHBsaWNhdGlvbiBTT0FQIEZhdWx0IGRldGFpbHMsIGl0IGRvZXMgc28gYnkgYXNzaWduaW5nIHRoZSA8aT5zb2FwLmZhdWx0PC9pPiBmaWVsZCBvZiB0aGUgY3VycmVudCByZWZlcmVuY2UgdG8gdGhlDQorcnVudGltZSBlbnZpcm9ubWVudCB3aXRoIA0KK2FwcHJvcHJpYXRlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBleGNlcHRpb24gYW5kIGJ5IHJldHVybmluZyB0aGUgZXJyb3IgPGk+U09BUF9GQVVMVDwvaT4uDQorRm9yIGV4YW1wbGU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfcmVjZWl2ZXJfZmF1bHQoc29hcCwgIlN0YWNrIGR1bXAiLCBOVUxMKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KHNvYXA8dHQ+LSZndDs8L3R0PnZlcnNpb24gPT0gMikgLy8gU09BUCAxLjIgaXMgdXNlZCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NvYXA8dHQ+LSZndDs8L3R0PmZhdWx0PHR0Pi0mZ3Q7PC90dD5TT0FQX0VOVl9fRGV0YWlsID0gKDxiPnN0cnVjdDwvYj4mbmJzcDtTT0FQX0VOVl9fRGV0YWlsKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2YoPGI+c3RydWN0PC9iPiZuYnNwO1NPQVBfRU5WX19EZXRhaWwpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwPHR0Pi0mZ3Q7PC90dD5mYXVsdDx0dD4tJmd0OzwvdHQ+U09BUF9FTlZfX0RldGFpbDx0dD4tJmd0OzwvdHQ+X190eXBlID0gU09BUF9UWVBFX25zMV9fbXlTdGFja0RhdGFUeXBlOyAvLyBzdGFjayB0eXBlIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NvYXA8dHQ+LSZndDs8L3R0PmZhdWx0PHR0Pi0mZ3Q7PC90dD5TT0FQX0VOVl9fRGV0YWlsPHR0Pi0mZ3Q7PC90dD5mYXVsdCA9IHNwOyAvLyBwb2ludCB0byBzdGFjayA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwPHR0Pi0mZ3Q7PC90dD5mYXVsdDx0dD4tJmd0OzwvdHQ+U09BUF9FTlZfX0RldGFpbDx0dD4tJmd0OzwvdHQ+X19hbnkgPSBOVUxMOyAvLyBubyBvdGhlciBYTUwgZGF0YSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt9IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmVsc2U8L2I+Jm5ic3A7PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwPHR0Pi0mZ3Q7PC90dD5mYXVsdDx0dD4tJmd0OzwvdHQ+ZGV0YWlsID0gKDxiPnN0cnVjdDwvYj4mbmJzcDtTT0FQX0VOVl9fRGV0YWlsKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2YoPGI+c3RydWN0PC9iPiZuYnNwO1NPQVBfRU5WX19EZXRhaWwpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwPHR0Pi0mZ3Q7PC90dD5mYXVsdDx0dD4tJmd0OzwvdHQ+ZGV0YWlsPHR0Pi0mZ3Q7PC90dD5fX3R5cGUgPSBTT0FQX1RZUEVfbnMxX19teVN0YWNrRGF0YVR5cGU7IC8vIHN0YWNrIHR5cGUgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c29hcDx0dD4tJmd0OzwvdHQ+ZmF1bHQ8dHQ+LSZndDs8L3R0PmRldGFpbDx0dD4tJmd0OzwvdHQ+ZmF1bHQgPSBzcDsgLy8gcG9pbnQgdG8gc3RhY2sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c29hcDx0dD4tJmd0OzwvdHQ+ZmF1bHQ8dHQ+LSZndDs8L3R0PmRldGFpbDx0dD4tJmd0OzwvdHQ+X19hbnkgPSBOVUxMOyAvLyBubyBvdGhlciBYTUwgZGF0YSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt9IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDtTT0FQX0ZBVUxUOyAvLyByZXR1cm4gZnJvbSByZW1vdGUgbWV0aG9kIGNhbGwNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1doZW4gPGk+c29hcF9yZWNlaXZlcl9mYXVsdDwvaT4gYWxsb2NhdGVzIGEgZmF1bHQgc3RydWN0LCB0aGlzIGRhdGEgaXMgcmVtb3ZlZCB3aXRoIHRoZSA8aT5zb2FwX2VuZDwvaT4gY2FsbCAob3IgPGk+c29hcF9kZWFsbG9jPC9pPikuDQorTm90ZSB0aGF0IHRoZSA8aT5zb2FwX3JlY2VpdmVyX2ZhdWx0PC9pPiBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gYWxsb2NhdGUgdGhlIGZhdWx0IHN0cnVjdCBhbmQgc2V0IHRoZSBmYXVsdCBzdHJpbmcgYW5kIGRldGFpbA0KK2ZpZWxkcywgaS5lLiA8aT5zb2FwX3JlY2VpdmVyX2ZhdWx0KHNvYXAsICJTdGFjayBkdW1wIiwgTlVMTCk8L2k+LiBUaGUgYWR2YW50YWdlIGlzIHRoYXQgdGhpcyBpcyBpbmRlcGVuZGVudCBvZiBTT0FQIDEuMSBhbmQNCitTT0FQIDEuMi4gIEhvd2V2ZXIsIHNldHRpbmcgdGhlIGN1c3RvbSBkZXRhaWwgZmllbGRzIHJlcXVpcmVzIGluc3BlY3RpbmcgdGhlIFNPQVAgdmVyc2lvbiB1c2VkLCB1c2luZyB0aGUgPGk+c29hcDwvaT48dHQ+LSZndDs8L3R0PjxpPnZlcnNpb248L2k+DQorYXR0cmlidXRlIHdoaWNoIGlzIDEgZm9yIFNPQVAgMS4xIGFuZCAyIGZvciBTT0FQIDEuMi4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorRWFjaCByZW1vdGUgbWV0aG9kIGltcGxlbWVudGF0aW9uIGluIGEgc2VydmljZSBhcHBsaWNhdGlvbiBjYW4gcmV0dXJuIGEgU09BUCBGYXVsdCB1cG9uIGFuIGV4Y2VwdGlvbiBieSByZXR1cm5pbmcgYW4gZXJyb3IgY29kZSwNCitzZWUgU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6ZXhhbXBsZTciPjcuMi4xPC9hPiBmb3IgZGV0YWlscyBhbmQgYW4gZXhhbXBsZS4NCitJbiBhZGRpdGlvbiwgYSBTT0FQIEZhdWx0IGNhbiBiZSByZXR1cm5lZCBieSBhIHNlcnZpY2UgYXBwbGljYXRpb24gdGhyb3VnaCBjYWxsaW5nIHRoZSA8aT5zb2FwX3NlbmRfZmF1bHQ8L2k+IGZ1bmN0aW9uLg0KK1RoaXMgaXMgdXNlZnVsIGluIGNhc2UgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBhcHBsaWNhdGlvbiBmYWlscywgYXMgaWxsdXN0cmF0ZWQgaW4gdGhlIGV4YW1wbGUgYmVsb3c6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPmludDwvYj4mbmJzcDttYWluKCkgPGJyIC8+DQorezxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwIHNvYXA7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfaW5pdCgmYW1wO3NvYXApOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb21lIGluaXRpYWxpemF0aW9uIGNvZGUgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KGluaXRpYWxpemF0aW9uIGZhaWxlZCkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7ezxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NvYXAuZXJyb3IgPSBzb2FwX3JlY2VpdmVyX2ZhdWx0KCZhbXA7c29hcCwgPHR0PiJJbml0Jm5ic3A7ZmFpbGVkIjwvdHQ+LCBOVUxMKTsgLy8gc2V0IHRoZSBlcnJvciBjb25kaXRpb24gKFNPQVBfRkFVTFQpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfc2VuZF9mYXVsdCgmYW1wO3NvYXApOyAvLyBTZW5kIFNPQVAgRmF1bHQgdG8gY2xpZW50IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDswOyAvLyBUZXJtaW5hdGUgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCit9DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorIDxoMj48YSBuYW1lPSJ0dGhfc0VjMTIiPg0KKzEyPC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5TT0FQIEhlYWRlciBQcm9jZXNzaW5nPC9mb250PjwvaDI+PGEgbmFtZT0ic2VjOmhlYWRlciI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitBIHByZWRlY2xhcmVkIHN0YW5kYXJkIFNPQVAgSGVhZGVyIGRhdGEgc3RydWN0dXJlIGlzIGdlbmVyYXRlZCBieSB0aGUgZ1NPQVAgc3R1YiBhbmQgc2tlbGV0b24gY29tcGlsZXIgZm9yIGV4Y2hhbmdpbmcgU09BUA0KK21lc3NhZ2VzIHdpdGggU09BUCBIZWFkZXJzLg0KK1RoaXMgcHJlZGVjbGFyZWQgZGF0YSBzdHJ1Y3R1cmUgaXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtTT0FQX0VOVl9fSGVhZGVyIDxiciAvPg0KK3sgPGI+dm9pZDwvYj4mbmJzcDsqZHVtbXk7IDxiciAvPg0KK307DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCit3aGljaCBkZWNsYXJlcyBhbmQgZW1wdHkgaGVhZGVyIChzb21lIEMgYW5kIEMrKyBjb21waWxlcnMgZG9uJ3QgYWNjZXB0IGVtcHR5IHN0cnVjdHMgc28gYSB0cmFuc2llbnQgZHVtbXkgZmllbGQgaXMgcHJvdmlkZWQpLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUbyBhZGFwdCB0aGUgZGF0YSBzdHJ1Y3R1cmUgdG8gYSBzcGVjaWZpYyBuZWVkIGZvciBTT0FQIEhlYWRlciBwcm9jZXNzaW5nLCBhDQorbmV3IDxpPjxiPnN0cnVjdDwvYj4mbmJzcDtTT0FQX0VOVl9fSGVhZGVyPC9pPiBjYW4gYmUgYWRkZWQgdG8gdGhlIGhlYWRlciBmaWxlIGlucHV0IHRvIHRoZSBnU09BUA0KK2NvbXBpbGVyLiAgQSA8aT48Yj5jbGFzczwvYj48L2k+IGZvciB0aGUgU09BUCBIZWFkZXIgZGF0YSBzdHJ1Y3R1cmUgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBhIDxpPjxiPnN0cnVjdDwvYj48L2k+Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBoZWFkZXIgY2FuIGJlIHVzZWQgZm9yIHRyYW5zYWN0aW9uIGNvbnRyb2w6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtTT0FQX0VOVl9fSGVhZGVyIDxiciAvPg0KK3sgPGI+Y2hhcjwvYj4mbmJzcDsqdF9fdHJhbnNhY3Rpb247IDxiciAvPg0KK307DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCit3aXRoIGNsaWVudC1zaWRlIGNvZGU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwIHNvYXA7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfaW5pdCgmYW1wO3NvYXApOyA8YnIgLz4NCisuLi4gPGJyIC8+DQorc29hcC5oZWFkZXIgPSBOVUxMOyAvLyBkbyBub3QgdXNlIGEgU09BUCBIZWFkZXIgZm9yIHRoZSByZXF1ZXN0IChhcyBzZXQgd2l0aCBzb2FwX2luaXQpIDxiciAvPg0KK3NvYXAuYWN0b3IgPSBOVUxMOyAvLyBkbyBub3QgdXNlIGFuIGFjdG9yIChyZWNlaXZlciBpcyBhY3RvcikgPGJyIC8+DQorc29hcF9jYWxsX21ldGhvZCgmYW1wO3NvYXAsIC4uLik7IDxiciAvPg0KKzxiPmlmPC9iPiZuYnNwOyhzb2FwLmhlYWRlcikgLy8gYSBTT0FQIEhlYWRlciB3YXMgcmVjZWl2ZWQgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Y291dCAgJmx0OyZsdDsgIHNvYXAuaGVhZGVyPHR0Pi0mZ3Q7PC90dD50X190cmFuc2FjdGlvbjsgPGJyIC8+DQorLy8gQ2FuIHJlc2V0LCBtb2RpZnksIG9yIHNldCBzb2FwLmhlYWRlciBoZXJlIGJlZm9yZSBuZXh0IGNhbGwgPGJyIC8+DQorc29hcF9jYWxsX21ldGhvZCgmYW1wO3NvYXAsIC4uLik7IC8vIHJldXNlIHRoZSBTT0FQIEhlYWRlciBvZiB0aGUgc2VydmljZSByZXNwb25zZSBmb3IgdGhlIHJlcXVlc3QgPGJyIC8+DQorLi4uDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgU09BUCBXZWIgc2VydmljZSByZXNwb25zZSBjYW4gaW5jbHVkZSBhIFNPQVAgSGVhZGVyIHdpdGggYSB0cmFuc2FjdGlvbiBudW1iZXIgdGhhdCB0aGUgY2xpZW50IGlzIHN1cHBvc2VkIHRvIHVzZSBmb3IgdGhlIG5leHQgcmVtb3RlIG1ldGhvZCBpbnZvY2F0aW9uIHRvIHRoZSBzZXJ2aWNlLiBUaGVyZWZvcmUsIHRoZSBuZXh0IHJlcXVlc3QgaW5jbHVkZXMgYSB0cmFuc2FjdGlvbiBudW1iZXI6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBCMEQwIj48dHI+PHRkPjx0dD4NCisuLi4gPGJyIC8+DQorJmx0O1NPQVAtRU5WOkVudmVsb3BlIC4uLiYjNjI7IDxiciAvPg0KKyZsdDtTT0FQLUVOVjpIZWFkZXImIzYyOyA8YnIgLz4NCismbHQ7dHJhbnNhY3Rpb24geG1sbnM9Ii4uLiIgeHNpOnR5cGU9ImludCImIzYyOzEyMzQ1Jmx0Oy90cmFuc2FjdGlvbiYjNjI7IDxiciAvPg0KKyZsdDsvU09BUC1FTlY6SGVhZGVyJiM2MjsgPGJyIC8+DQorJmx0O1NPQVAtRU5WOkJvZHkmIzYyOyA8YnIgLz4NCisuLi4gPGJyIC8+DQorJmx0Oy9TT0FQLUVOVjpCb2R5JiM2MjsgPGJyIC8+DQorJmx0Oy9TT0FQLUVOVjpFbnZlbG9wZSYjNjI7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvdHQ+DQorVGhpcyBpcyBqdXN0IGFuIGV4YW1wbGUgYW5kIHRoZSB0cmFuc2FjdGlvbiBjb250cm9sIGlzIG5vdCBhIGZlYXR1cmUgb2YgU09BUCBidXQgY2FuIGJlIGFkZGVkIG9uIGJ5IHRoZSBhcHBsaWNhdGlvbiBsYXllcg0KK3RvIGltcGxlbWVudCBzdGF0ZWZ1bCB0cmFuc2FjdGlvbnMgYmV0d2VlbiBjbGllbnRzIGFuZCBzZXJ2aWNlcy4NCitBdCB0aGUgY2xpZW50IHNpZGUsIHRoZSA8aT5zb2FwLmFjdG9yPC9pPiBhdHRyaWJ1dGUgY2FuIGJlIHNldCB0bw0KK2luZGljYXRlIHRoZSByZWNpcGllbnQgb2YgdGhlIGhlYWRlciAodGhlIFNPQVAgPHR0PlNPQVAtRU5WOmFjdG9yPC90dD4gYXR0cmlidXRlKS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorQSBXZWIgc2VydmljZSBjYW4gcmVhZCBhbmQgc2V0IHRoZSBTT0FQIEhlYWRlciBhcyBmb2xsb3dzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5pbnQ8L2I+Jm5ic3A7bWFpbigpIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgc29hcDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcC5hY3RvciA9IE5VTEw7IC8vIHVzZSB0aGlzIHRvIGFjY2VwdCBhbGwgaGVhZGVycyAoZGVmYXVsdCkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcC5hY3RvciA9ICJodHRwOi8vc29tZS9hY3RvciI7IC8vIGFjY2VwdCBoZWFkZXJzIGRlc3RpbmVkIGZvciAiaHR0cDovL3NvbWUvYWN0b3IiIG9ubHkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9zZXJ2ZSgmYW1wO3NvYXApOzxiciAvPg0KK30gPGJyIC8+DQorLi4uIDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDttZXRob2QoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIC4uLikgPGJyIC8+DQorezxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyhzb2FwPHR0Pi0mZ3Q7PC90dD5oZWFkZXIpIC8vIGEgSGVhZGVyIHdhcyByZWNlaXZlZCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsuLi4gPSBzb2FwPHR0Pi0mZ3Q7PC90dD5oZWFkZXI8dHQ+LSZndDs8L3R0PnRfX3RyYW5zYWN0aW9uOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5lbHNlPC9iPiZuYnNwOzxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NvYXA8dHQ+LSZndDs8L3R0PmhlYWRlciA9IHNvYXBfbWFsbG9jKDxiPnNpemVvZjwvYj4oPGI+c3RydWN0PC9iPiZuYnNwO1NPQVBfRU5WX19IZWFkZXIpKTsgLy8gYWxsb2MgbmV3IGhlYWRlciA8YnIgLz4NCisuLi4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwPHR0Pi0mZ3Q7PC90dD5oZWFkZXI8dHQ+LSZndDs8L3R0PnRfX3RyYW5zYWN0aW9uID0gLi4uOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7U09BUF9PSzsgPGJyIC8+DQorfQ0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorU2VlIFNlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOmRpcmVjdGl2ZXMiPjE4LjI8L2E+IG9uIGhvdyB0byBnZW5lcmF0ZSBXU0RMIHdpdGggdGhlIHByb3BlciBtZXRob2QtdG8taGVhZGVyLXBhcnQgYmluZGluZ3MuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSA8dHQ+U09BUC1FTlY6bXVzdFVuZGVyc3RhbmQ8L3R0PiBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoZSByZXF1aXJlbWVudCB0aGF0IHRoZSByZWNpcGllbnQgb2YgdGhlIFNPQVAgSGVhZGVyICh3aG8gbXVzdA0KK2NvcnJlc3BvbmQgdG8gdGhlIDx0dD5TT0FQLUVOVjphY3RvcjwvdHQ+IGF0dHJpYnV0ZSB3aGVuIHByZXNlbnQgb3Igd2hlbiB0aGUgYXR0cmlidXRlIGhhcyB0aGUgdmFsdWUNCis8dHQ+U09BUC1FTlY6YWN0b3I9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvYWN0b3IvbmV4dCI8L3R0PikgTVVTVCBoYW5kbGUgdGhlIEhlYWRlciBwYXJ0IHRoYXQgY2FycmllcyB0aGUgYXR0cmlidXRlLg0KK2dTT0FQIGhhbmRsZXMgdGhpcyBhdXRvbWF0aWNhbGx5IG9uIHRoZSBiYWNrZ3JvdW5kLiBIb3dldmVyLCBhbiBhcHBsaWNhdGlvbiBzdGlsbCBuZWVkcyB0byBpbnNwZWN0IHRoZSBoZWFkZXIgcGFydCdzIHZhbHVlDQorYW5kIGhhbmRsZSBpdCBhcHByb3ByaWF0ZWx5LiBJZiBhIHJlbW90ZSBtZXRob2QgaW4gYSBXZWIgc2VydmljZSBpcyBub3QgYWJsZSB0byBkbyB0aGlzLCBpdCBzaG91bGQgcmV0dXJuDQorPGk+U09BUF9NVVNUVU5ERVJTVEFORDwvaT4gdG8gaW5kaWNhdGUgdGhpcyBmYWlsdXJlLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgc3ludGF4IGZvciB0aGUgaGVhZGVyIGZpbGUgaW5wdXQgdG8gdGhlIGdTT0FQIGNvbXBpbGVyIGlzIGV4dGVuZGVkIHdpdGggYSBzcGVjaWFsIHN0b3JhZ2UgcXVhbGlmaWVyIDxpPm11c3RVbmRlcnN0YW5kPC9pPi4NCitUaGlzIHF1YWxpZmllciBjYW4gYmUgdXNlZCBpbiB0aGUgU09BUCBIZWFkZXIgZGVjbGFyYXRpb24gdG8gaW5kaWNhdGUgd2hpY2ggcGFydHMgc2hvdWxkIGNhcnJ5IGEgPGk+U09BUC1FTlY6bXVzdFVuZGVyc3RhbmQ9IjEiPC9pPg0KK2F0dHJpYnV0ZS4gRm9yIGV4YW1wbGU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtTT0FQX0VOVl9fSGVhZGVyIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqdF9fdHJhbnNhY3Rpb247IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO211c3RVbmRlcnN0YW5kIDxiPmNoYXI8L2I+Jm5ic3A7KnRfX2F1dGhlbnRpY2F0aW9uOyA8YnIgLz4NCit9Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorV2hlbiBib3RoIGZpZWxkcyBhcmUgc2V0IGFuZCA8aT5zb2FwLmFjdG9yPSJodHRwOi8vc29tZS9hY3RvciI8L2k+IHRoZW4gdGhlIG1lc3NhZ2UgY29udGFpbnM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBCMEQwIj48dHI+PHRkPjx0dD4NCismbHQ7U09BUC1FTlY6RW52ZWxvcGUgLi4uJiM2MjsgPGJyIC8+DQorJmx0O1NPQVAtRU5WOkhlYWRlciYjNjI7IDxiciAvPg0KKyZsdDt0cmFuc2FjdGlvbiB4bWxucz0iLi4uJiMxODc7NSZsdDsvdHJhbnNhY3Rpb24mIzYyOyA8YnIgLz4NCismbHQ7YXV0aGVudGljYXRpb24geG1sbnM9Ii4uLiIgU09BUC1FTlY6YWN0b3I9Imh0dHA6Ly9zb21lL2FjdG9yIiBTT0FQLUVOVjptdXN0VW5kZXJzdGFuZD0iMSImIzYyO1hYIDxiciAvPg0KKyZsdDsvYXV0aGVudGljYXRpb24mIzYyOyA8YnIgLz4NCismbHQ7L1NPQVAtRU5WOkhlYWRlciYjNjI7IDxiciAvPg0KKyZsdDtTT0FQLUVOVjpCb2R5JiM2MjsgPGJyIC8+DQorLi4uIDxiciAvPg0KKyZsdDsvU09BUC1FTlY6Qm9keSYjNjI7IDxiciAvPg0KKyZsdDsvU09BUC1FTlY6RW52ZWxvcGUmIzYyOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3R0Pg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisgPGgyPjxhIG5hbWU9InR0aF9zRWMxMyI+DQorMTM8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPk1JTUUgQXR0YWNobWVudHM8L2ZvbnQ+PC9oMj48YSBuYW1lPSJzZWM6TUlNRSI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgZ1NPQVAgdG9vbGtpdCBzdXBwb3J0cyBNSU1FIGF0dGFjaG1lbnRzIGFzIHBlciBTT0FQIHdpdGggQXR0YWNobWVudHMgKFN3QSkNCitzcGVjaWZpY2F0aW9uIChodHRwOi8vd3d3LnczLm9yZy9UUi9TT0FQLWF0dGFjaG1lbnRzKS4gTUlNRSBhdHRhY2htZW50IGRhdGEgbXVzdCBiZSBtZW1vcnkgcmVzaWRlbnQgZm9yIHNlbmRpbmcNCitvcGVyYXRpb25zIGFuZCBNSU1FIGF0dGFjaG1lbnRzIHJlY2VpdmVkIHdpbGwgYmUgc3RvcmVkIGluIG1lbW9yeS4gRElNRQ0KK2F0dGFjaG1lbnRzIG9uIHRoZSBvdGhlciBoYW5kIGNhbiBiZSBzdHJlYW1lZCBhbmQgdGhlcmVmb3JlIERJTUUgYXR0YWNobWVudA0KK2RhdGEgZG9lcyBub3QgbmVlZCB0byBiZSBzdG9yZWQgaW4gbWVtb3J5LCBzZWUNCitTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzpESU1FIj4xNDwvYT4uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RyYW5zbWl0dGluZyBtdWx0aXBhcnQvcmVsYXRlZCBNSU1FIGF0dGFjaG1lbnRzIHdpdGggYSBTT0FQL1hNTCBtZXNzYWdlIGlzDQorYWNjb21wbGlzaGVkIHdpdGggdHdvIGZ1bmN0aW9ucywgPGk+c29hcF9zZXRfbWltZTwvaT4gYW5kDQorPGk+c29hcF9zZXRfbWltZV9hdHRhY2htZW50PC9pPi4gVGhlIGZpcnN0IGZ1bmN0aW9uIGlzIGZvciBpbml0aWFsaXphdGlvbg0KK3B1cnBvc2VzIGFuZCB0aGUgbGF0dGVyIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSBtZXRhIGRhdGEgYW5kIGNvbnRlbnQgZGF0YQ0KK2ZvciBlYWNoIGF0dGFjaG1lbnQuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkgICAgIDxoMz48YSBuYW1lPSJ0dGhfc0VjMTMuMSI+DQorMTMuMTwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+U2VuZGluZyBhIENvbGxlY3Rpb24gb2YgTUlNRSBBdHRhY2htZW50czwvZm9udD48L2gzPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBzaG91bGQgYmUgdXNlZCB0byBzZXQgdXAgYSBjb2xsZWN0aW9uIG9mDQorbXVsdGlwYXJ0L3JlbGF0ZWQgTUlNRSBhdHRhY2htZW50cyBmb3IgdHJhbnNtaXNzaW9uIHdpdGggYSBTT0FQL1hNTCBtZXNzYWdlLg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKw0KKzx0YWJsZT4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPjxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5GdW5jdGlvbjwvYj48L2ZvbnQ+IDwvdGQ+PC90cj4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPjxpPjxiPnZvaWQ8L2I+Jm5ic3A7c29hcF9zZXRfbWltZSg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqYm91bmRhcnksIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KnN0YXJ0KTwvaT4gPC90ZD48L3RyPg0KKzx0cj48dGQgd2lkdGg9IjYwMiI+VGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBmaXJzdCB0byBpbml0aWFsaXplIE1JTUUgYXR0YWNobWVudCBzZW5kIG9wZXJhdGlvbnMgKHJlY2VpdmVzIGFyZSBhdXRvbWF0aWMpLiBUaGUgZnVuY3Rpb24gc3BlY2lmaWVzIGEgTUlNRSBib3VuZGFyeSBhbmQgc3RhcnQgY29udGVudCBJRCB1c2VkIGZvciB0aGUgU09BUCBtZXNzYWdlIGJvZHkuIFdoZW4gPGk+Ym91bmRhcnk8L2k+IGlzIE5VTEwsIGFuIGFwcHJvcHJpYXRlIE1JTUUgYm91bmRhcnkgd2lsbCBiZSBjaG9vc2VuIChpbXBvcnRhbnQ6IGJvdW5kYXJpZXMgY2Fubm90IG9jY3VyIGluIHRoZSBTT0FQL1hNTCBtZXNzYWdlIGFuZCBjYW5ub3Qgb2NjdXIgaW4gYW55IG9mIHRoZSBNSU1FIGF0dGFjaG1lbnRzIGNvbnRlbnQpLiBXaGVuIGEgc3BlY2lmaWMgYm91bmRhcnkgdmFsdWUgaXMgcHJvdmlkZWQsIGdTT0FQIHdpbGwgTk9UIHZlcmlmeSB0aGF0IHRoZSBib3VuZGFyeSBpcyB2YWxpZC4gV2hlbiA8aT5zdGFydDwvaT4gaXMgTlVMTCwgdGhlIHN0YXJ0IElEIG9mIHRoZSBTT0FQIG1lc3NhZ2UgaXMgPHR0PiZsdDs8L3R0Pjx0dD5TT0FQLUVOVjpFbnZlbG9wZTwvdHQ+PHR0PiZndDs8L3R0Pi4NCis8L3RkPjwvdHI+DQorPHRyPjx0ZCB3aWR0aD0iNjAyIj48aT48Yj5pbnQ8L2I+Jm5ic3A7c29hcF9zZXRfbWltZV9hdHRhY2htZW50KDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj5jaGFyPC9iPiZuYnNwOypwdHIsIHNpemVfdCBzaXplLCA8Yj5lbnVtPC9iPiZuYnNwO3NvYXBfbWltZV9lbmNvZGluZyBlbmNvZGluZywgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqdHlwZSwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqaWQsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KmxvY2F0aW9uLCA8Yj5jb25zdDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypkZXNjcmlwdGlvbik8L2k+IDwvdGQ+PC90cj4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPlRoaXMgZnVuY3Rpb24gYWRkcyBhIG5ldyBhdHRhY2htZW50IHRvIHRoZSBsaXN0IG9mIGF0dGFjaG1lbnRzLCB3aGVyZSA8aT5wdHI8L2k+IGFuZCA8aT5zaXplPC9pPiByZWZlciB0byB0aGUgYmxvY2sgb2YgbWVtb3J5IHRoYXQgaG9sZHMgdGhlIGF0dGFjaG1lbnQgZGF0YS4gVGhlIDxpPmVuY29kaW5nPC9pPiBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBjb250ZW50IGVuY29kaW5nIG9mIHRoaXMgYmxvY2ssIHdoZXJlIHRoZSB2YWx1ZSBvZiA8aT5lbmNvZGluZzwvaT4gaXMgb25lIG9mIDxpPlNPQVBfTUlNRV83QklUPC9pPiwgPGk+U09BUF9NSU1FXzhCSVQ8L2k+LCA8aT5TT0FQX01JTUVfQklOQVJZPC9pPiwgPGk+U09BUF9NSU1FX1FVT1RFRF9QUklOVEFCTEU8L2k+LCA8aT5TT0FQX01JTUVfQkFTRTY0PC9pPiwgPGk+U09BUF9NSU1FX0lFVEZfVE9LRU48L2k+LCBvciA8aT5TT0FQX01JTUVfWF9UT0tFTjwvaT4uIFRoZXNlIGNvbnN0YW50cyByZWZsZWN0IHRoZSBjb250ZW50IGVuY29kaW5nIGRlZmluZWQgaW4gUkZDMjA0NSBhbmQgeW91IE1VU1QgYWRoZXJlIHRvIHRoZSBjb250ZW50IGVuY29kaW5nIHJ1bGVzIGRlZmluZWQgYnkgUkZDMjA0NS4gV2hlbiBpbiBkb3VidCwgdXNlIDxpPlNPQVBfTUlNRV9CSU5BUlk8L2k+LCBzaW5jZSB0aGlzIGVuY29kaW5nIHR5cGUgY292ZXJzIGFueSBjb250ZW50LiBUaGUgbWFuZGF0b3J5IDxpPnR5cGU8L2k+IHN0cmluZyBwYXJhbWV0ZXIgaXMgdGhlIE1JTUUgdHlwZSBvZiB0aGUgZGF0YS4gVGhlIDxpPmlkPC9pPiBzdHJpbmcgcGFyYW1ldGVyIGlzIHRoZSBjb250ZW50IElEIG9mIHRoZSBNSU1FIGF0dGFjaG1lbnQuIFRoZSBvcHRpb25hbCA8aT5sb2NhdGlvbjwvaT4gc3RyaW5nIHBhcmFtZXRlciBpcyB0aGUgY29udGVudCBsb2NhdGlvbiBvZiB0aGUgYXR0YWNobWVudC4gVGhlIG9wdGlvbmFsIDxpPmRlc2NyaXB0aW9uPC9pPiBzdHJpbmcgcGFyYW1ldGVyIGhvbGRzIGEgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiB0aGUgYXR0YWNobWVudCAoaXQgbWF5IG5vdCBjb250YWluIGFueSBjb250cm9sIGNoYXJhY3RlcnMpLiBBbGwgcGFyYW1ldGVyIHZhbHVlcyBhcmUgY29waWVkLCBleGNlcHQgPGk+cHRyPC9pPiB3aGljaCBtdXN0IHBvaW50IHRvIGEgdmFsaWQgbG9jYXRpb24gb2YgdGhlIGF0dGFjaG1lbnQgZGF0YSBkdXJpbmcgdGhlIHRyYW5zZmVyLg0KK1RoZSB2YWx1ZSA8aT5TT0FQX09LPC9pPiBpcyByZXR1cm5lZCB3aGVuIHRoZSBhdHRhY2htZW50IHdhcyBhZGRlZC4gT3RoZXJ3aXNlIGEgZ1NPQVAgZXJyb3IgY29kZSBpcyByZXR1cm5lZC4NCis8L3RkPjwvdHI+DQorPHRyPjx0ZCB3aWR0aD0iNjAyIj48aT48Yj52b2lkPC9iPiZuYnNwO3NvYXBfY2xyX21pbWUoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXApPC9pPiA8L3RkPjwvdHI+DQorPHRyPjx0ZCB3aWR0aD0iNjAyIj5EaXNhYmxlcyBNSU1FIGF0dGFjaG1lbnRzLCBlLmcuJm5ic3A7dG8gYXZvaWQgTUlNRSBhdHRhY2htZW50cyB0byBiZSBwYXJ0IG9mIGEgU09BUCBGYXVsdCByZXNwb25zZSBtZXNzYWdlLiA8L3RkPjwvdHI+PC90YWJsZT4NCisNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9zcGFuPg0KK1doZW4gcHJvdmlkaW5nIGEgTUlNRSBib3VuZGFyeSB3aXRoIDxpPnNvYXBfc2V0X21pbWU8L2k+LCB5b3UgaGF2ZSB0byBtYWtlDQorc3VyZSB0aGUgYm91bmRhcnkgY2Fubm90IG1hdGNoIGFueSBTT0FQL1hNTCBtZXNzYWdlIGNvbnRlbnQuIFRoZXJlZm9yZSwgaXQgaXMNCityZWNvbW1lbmRlZCB0byBpbmNsdWRlIGFuIGludmFsaWQgWE1MIHNlcXVlbmNlIHN1Y2ggYXMgPHR0PiZsdDsmZ3Q7PC90dD4uIE9yIHlvdSBjYW4NCitzaW1wbHkgcGFzcyBOVUxMIGFuZCBsZXQgZ1NPQVAgc2VsZWN0IGEgc2FmZSBib3VuZGFyeSBmb3IgeW91Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgaW50ZXJuYWwgbGlzdCBvZiBhdHRhY2htZW50cyBpcyBkZXN0cm95ZWQgd2l0aCA8aT5zb2FwX2VuZDwvaT4sIHlvdSBzaG91bGQNCitjYWxsIHRoaXMgZnVuY3Rpb24gc29tZXRpbWUgYWZ0ZXIgdGhlIG1lc3NhZ2UgZXhjaGFuZ2Ugd2FzIGNvbXBsZXRlZCAodGhlDQorY29udGVudCBvZiB0aGUgYmxvY2sgb2YgbWVtb3J5IHJlZmVycmVkIHRvIGJ5IHRoZSA8aT5wdHI8L2k+IHBhcmFtZXRlciBpcw0KK3VuYWZmZWN0ZWQpLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IGEgbXVsdGlwYXJ0L3JlbGF0ZWQgSFRUUCBtZXNzYWdlIHdpdGggdGhyZWUNCitNSU1FIGF0dGFjaG1lbnRzIGlzIHNldCB1cCBhbmQgdHJhbnNtaXR0ZWQgdG8gYSBzZXJ2ZXIuIFRoZSBmaXJzdCBhdHRhY2htZW50DQorY29udGFpbnMgdGhlIFNPQVAgbWVzc2FnZS4gVGhlIHNlY29uZCBhbmQgdGhpcmQgYXR0YWNobWVudHMgY29udGFpbiBpbWFnZSBkYXRhLg0KK0luIHRoaXMgZXhhbXBsZSB3ZSBsZXQgdGhlIFNPQVAgbWVzc2FnZSBib2R5IHJlZmVyIHRvIHRoZSBhdHRhY2htZW50cyB1c2luZw0KKzx0dD5ocmVmPC90dD4gYXR0cmlidXRlcy4gIFRoZSA8aT48Yj5zdHJ1Y3Q8L2I+Jm5ic3A7Y2xhaW1fX2Zvcm08L2k+IGRhdGEgdHlwZSBpbmNsdWRlcyBhDQorZGVmaW5pdGlvbiBvZiBhIDxpPmhyZWY8L2k+IGF0dHJpYnV0ZSBmb3IgdGhpcyBwdXJwb3NlLg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7Y2xhaW1fX2Zvcm0gZm9ybTEsIGZvcm0yOyA8YnIgLz4NCitmb3JtMS5ocmVmID0gPHR0PiJjaWQ6Y2xhaW0wNjE0MDBhLnRpZmZAY2xhaW1pbmctaXQuY29tIjwvdHQ+OyA8YnIgLz4NCitmb3JtMi5ocmVmID0gPHR0PiJjaWQ6Y2xhaW0wNjE0MDBhLmpwZWdAY2xhaW1pbmctaXQuY29tIjwvdHQ+OyA8YnIgLz4NCisvKiBpbml0aWFsaXplIGFuZCBlbmFibGUgTUlNRSAqLyA8YnIgLz4NCitzb2FwX3NldF9taW1lKHNvYXAsIDx0dD4iTUlNRV9ib3VuZGFyeSI8L3R0PiwgPHR0PiImbHQ7Y2xhaW0wNjE0MDBhLnhtbEBjbGFpbWluZy1pdC5jb20mZ3Q7IjwvdHQ+KTsgPGJyIC8+DQorLyogYWRkIGEgYmFzZTY0IGVuY29kZWQgdGlmZiBpbWFnZSAodGlmZkltYWdlIHBvaW50cyB0byBiYXNlNjQgZGF0YSkgKi8gPGJyIC8+DQorc29hcF9zZXRfbWltZV9hdHRhY2htZW50KHNvYXAsIHRpZmZJbWFnZSwgdGlmZkxlbiwgU09BUF9NSU1FX0JBU0U2NCwgPHR0PiJpbWFnZS90aWZmIjwvdHQ+LCA8dHQ+IiZsdDtjbGFpbTA2MTQwMGEudGlmZkBjbGFpbWluZy1pdC5jb20mZ3Q7IjwvdHQ+LCBOVUxMLCBOVUxMKTsgPGJyIC8+DQorLyogYWRkIGEgcmF3IGJpbmFyeSBqcGVnIGltYWdlIChqcGVnSW1hZ2UgcG9pbnRzIHRvIHJhdyBkYXRhKSAqLyA8YnIgLz4NCitzb2FwX3NldF9taW1lX2F0dGFjaG1lbnQoc29hcCwganBlZ0ltYWdlLCBqcGVnTGVuLCBTT0FQX01JTUVfQklOQVJZLCA8dHQ+ImltYWdlL2pwZWciPC90dD4sIDx0dD4iJmx0O2NsYWltMDYxNDAwYS5qcGVnQGNsYWltaW5nLWl0LmNvbSZndDsiPC90dD4sIE5VTEwsIE5VTEwpOyA8YnIgLz4NCisvKiBzZW5kIHRoZSBmb3JtcyBhcyBNSU1FIGF0dGFjaG1lbnRzIHdpdGggdGhpcyBpbnZvY2F0aW9uICovIDxiciAvPg0KKzxiPmlmPC9iPiZuYnNwOyhzb2FwX2NhbGxfY2xhaW1fX2luc3VyYW5jZV9jbGFpbV9hdXRvKHNvYXAsIGZvcm0xLCBmb3JtMiwgLi4uKSkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Ly8gYW4gZXJyb3Igb2NjdXJyZWQgPGJyIC8+DQorPGI+ZWxzZTwvYj48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsvLyBwcm9jZXNzIHJlc3BvbnNlDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitOb3RlOiB0aGUgYWJvdmUgZXhhbXBsZSBhc3N1bWVzIHRoYXQgdGhlIGJvdW5kYXJ5IDx0dD5NSU1FX2JvdW5kYXJ5PC90dD4gZG9lcyBub3Qgb2NjdXIgaW4gdGhlIFNPQVAvWE1MIG1lc3NhZ2UuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSA8aT5jbGFpbV9fZm9ybTwvaT4gc3RydWN0IGlzIGRlY2xhcmVkIGluIHRoZSBnU09BUCBoZWFkZXIgZmlsZSBhczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+c3RydWN0PC9iPiZuYnNwO2NsYWltX19mb3JtIDxiciAvPg0KK3sgQDxiPmNoYXI8L2I+Jm5ic3A7KmhyZWY7IDxiciAvPg0KK307DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4JDQorVGhpcyBkYXRhIHR5cGUgZGVmaW5lcyB0aGUgcGFyYW1ldGVyIGRhdGEgb2YgdGhlIG9wZXJhdGlvbi4gVGhlIGNsYWltIGZvcm1zIGluDQordGhlIFNPQVAvWE1MIG1lc3NhZ2UgY29uc2lzdCBvZiA8dHQ+aHJlZjwvdHQ+cyB0byB0aGUgY2xhaW0gZm9ybXMgYXR0YWNoZWQuICBUaGUNCitwcm9kdWNlZCBtZXNzYWdlIGlzIHNpbWlsYXIgdG8gdGhlIGxhc3QgZXhhbXBsZSBzaG93biBpbiB0aGUgU09BUCB3aXRoDQorQXR0YWNobWVudHMgc3BlY2lmaWNhdGlvbiAoaHR0cDovL3d3dy53My5vcmcvVFIvU09BUC1hdHRhY2htZW50cykuICBOb3RlIHRoYXQNCit0aGUgdXNlIG9mIDx0dD5ocmVmPC90dD4gb3Igb3RoZXIgYXR0cmlidXRlcyBmb3IgcmVmZXJyaW5nIHRvIHRoZSBNSU1FIGF0dGFjaG1lbnRzDQoraXMgb3B0aW9uYWwgYWNjb3JkaW5nIHRvIHRoZSBTd0Egc3RhbmRhcmQuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RvIGFzc29jaWF0ZSBNSU1FIGF0dGFjaG1lbnRzIHdpdGggdGhlIHJlcXVlc3QgYW5kIHJlc3BvbnNlIG9mIGEgc2VydmljZSBvcGVyYXRpb24gaW4gdGhlIGdlbmVyYXRlZCBXU0RMLCBwbGVhc2Ugc2VlIFNlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOk1JTUVXU0RMIj4xNS4xPC9hPi4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIHNlcnZlci1zaWRlIGNvZGUgdG8gdHJhbnNtaXQgTUlNRSBhdHRhY2htZW50cyBiYWNrIHRvIGEgY2xpZW50IGlzIHNpbWlsYXI6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPmludDwvYj4mbmJzcDtjbGFpbV9faW5zdXJhbmNlX2NsYWltX2F1dG8oPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIC4uLikgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX3NldF9taW1lKHNvYXAsIE5VTEwsIE5VTEwpOyAvLyBlbmFibGUgTUlNRTxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOy8vIGFkZCBhIEhUTUwgZG9jdW1lbnQgKGh0bWxEb2MgcG9pbnRzIHRvIGRhdGEsIHdoZXJlIHRoZSBIVE1MIGRvYyBpcyBzdG9yZWQgaW4gY29tcGxpYW5jZSB3aXRoIDdiaXQgZW5jb2RpbmcgUkZDMjA0NSkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KHNvYXBfc2V0X21pbWVfYXR0YWNobWVudChzb2FwLCBodG1sRG9jLCBzdHJsZW4oaHRtbERvYyksIFNPQVBfTUlNRV83QklULCA8dHQ+InRleHQvaHRtbCI8L3R0PiwgPHR0PiImbHQ7Y2xhaW0wNjE0MDBhLmh0bWxAY2xhaW1pbmctaXQuY29tJmd0OyI8L3R0PiwgTlVMTCwgTlVMTCkpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9jbHJfbWltZShzb2FwKTsgLy8gZG9uJ3Qgd2FudCBmYXVsdCB3aXRoIGF0dGFjaG1lbnRzIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDtzb2FwPHR0Pi0mZ3Q7PC90dD5lcnJvcjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7U09BUF9PSzsgPGJyIC8+DQorfQ0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBhdHRhY2ggZGF0YSB0byBhIFNPQVAgZmF1bHQgbWVzc2FnZS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorPGZvbnQgY29sb3I9IiNGRjAwMDAiPjxiPkNhdXRpb246PC9iPjwvZm9udD4gRElNRSBpbiBNSU1FIGlzIHN1cHBvcnRlZC4gSG93ZXZlciwgZ1NPQVAgd2lsbCBub3QgdmVyaWZ5IHdoZXRoZXINCit0aGUgTUlNRSBib3VuZGFyeSBpcyBwcmVzZW50IGluIHRoZSBESU1FIGF0dGFjaG1lbnRzIGFuZCB0aGVyZWZvcmUgd2lsbCBub3QNCitzZWxlY3QgYSBib3VuZGFyeSB0aGF0IGlzIGd1YXJhbnRlZWQgdG8gYmUgdW5pcXVlLiBUaGVyZWZvcmUsIHlvdSBtdXN0IHByb3ZpZGUNCithIE1JTUUgYm91bmRhcnkgd2l0aCA8aT5zb2FwX3NldF9taW1lPC9pPiB0aGF0IGlzIHVuaXF1ZSB3aGVuIHVzaW5nIERJTUUgaW4NCitNSU1FLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJICAgICA8aDM+PGEgbmFtZT0idHRoX3NFYzEzLjIiPg0KKzEzLjI8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPlJldHJpZXZpbmcgYSBDb2xsZWN0aW9uIG9mIE1JTUUgQXR0YWNobWVudHM8L2ZvbnQ+PC9oMz4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorTUlNRSBhdHRhY2htZW50cyBhcmUgYXV0b21hdGljYWxseSBwYXJzZWQgYW5kIHN0b3JlZCBpbiBtZW1vcnkuDQorQWZ0ZXIgcmVjZWl2aW5nIGEgc2V0IG9mIE1JTUUgYXR0YWNobWVudHMsIGVpdGhlciBhdCB0aGUgY2xpZW50LXNpZGUgb3INCit0aGUgc2VydmVyLXNpZGUsIHRoZSBsaXN0IG9mIE1JTUUgYXR0YWNobWVudHMgY2FuIGJlIHRyYXZlcnNlZCB0byBleHRyYWN0DQorbWV0YSBkYXRhIGFuZCB0aGUgYXR0YWNobWVudCBjb250ZW50LiBUaGUgZmlyc3QgYXR0YWNobWVudCBpbiB0aGUgY29sbGVjdGlvbiBvZg0KK01JTUUgYXR0YWNobWVudHMgYWx3YXlzIGNvbnRhaW5zIG1ldGEgZGF0YSBhYm91dCB0aGUgU09BUCBtZXNzYWdlDQoraXRzZWxmIChiZWNhdXNlIHRoZSBTT0FQIG1lc3NhZ2Ugd2FzIHByb2Nlc3NlZCB0aGUgYXR0YWNobWVudCBkb2VzIG5vdCBjb250YWluDQorYW55IHVzZWZ1bCBkYXRhKS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVG8gdHJhdmVyc2UgdGhlIGxpc3Qgb2YgTUlNRSBhdHRhY2htZW50cyBpbiBDLCB5b3UgdXNlIGEgbG9vcCBzaW1pbGFyIHRvOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcF9tdWx0aXBhcnQgKmF0dGFjaG1lbnQ7IDxiciAvPg0KKzxiPmZvcjwvYj4mbmJzcDsoYXR0YWNobWVudCA9IHNvYXAubWltZS5saXN0OyBhdHRhY2htZW50OyBhdHRhY2htZW50ID0gYXR0YWNobWVudDx0dD4tJmd0OzwvdHQ+bmV4dCkgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtwcmludGYoPHR0PiJNSU1FJm5ic3A7YXR0YWNobWVudDpcbiI8L3R0Pik7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3ByaW50Zig8dHQ+Ik1lbW9yeT0lcFxuIjwvdHQ+LCAoKmF0dGFjaG1lbnQpLnB0cik7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3ByaW50Zig8dHQ+IlNpemU9JXVsXG4iPC90dD4sICgqYXR0YWNobWVudCkuc2l6ZSk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3ByaW50Zig8dHQ+IkVuY29kaW5nPSVkXG4iPC90dD4sICg8Yj5pbnQ8L2I+KSgqYXR0YWNobWVudCkuZW5jb2RpbmcpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtwcmludGYoPHR0PiJUeXBlPSVzXG4iPC90dD4sICgqYXR0YWNobWVudCkudHlwZT8oKmF0dGFjaG1lbnQpLnR5cGU6Im51bGwiKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7cHJpbnRmKDx0dD4iSUQ9JXNcbiI8L3R0PiwgKCphdHRhY2htZW50KS5pZD8oKmF0dGFjaG1lbnQpLmlkOiJudWxsIik7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3ByaW50Zig8dHQ+IkxvY2F0aW9uPSVzXG4iPC90dD4sICgqYXR0YWNobWVudCkubG9jYXRpb24/KCphdHRhY2htZW50KS5sb2NhdGlvbjoibnVsbCIpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtwcmludGYoPHR0PiJEZXNjcmlwdGlvbj0lc1xuIjwvdHQ+LCAoKmF0dGFjaG1lbnQpLmRlc2NyaXB0aW9uPygqYXR0YWNobWVudCkuZGVzY3JpcHRpb246Im51bGwiKTsgPGJyIC8+DQorfQ0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorQysrIHByb2dyYW1tZXJzIGNhbiB1c2UgYW4gaXRlcmF0b3IgaW5zdGVhZCwgYXMgaW46DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPmZvcjwvYj4mbmJzcDsoc29hcF9tdWx0aXBhcnQ6Oml0ZXJhdG9yIGF0dGFjaG1lbnQgPSBzb2FwLm1pbWUuYmVnaW4oKTsgYXR0YWNobWVudCAhPSBzb2FwLm1pbWUuZW5kKCk7ICsrYXR0YWNobWVudCkgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtjb3V0IDx0dD4mbHQ7Jmx0OzwvdHQ+ICJNSU1FIGF0dGFjaG1lbnQ6IiA8dHQ+Jmx0OyZsdDs8L3R0PiBlbmRsOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtjb3V0IDx0dD4mbHQ7Jmx0OzwvdHQ+ICJNZW1vcnk9IiA8dHQ+Jmx0OyZsdDs8L3R0PiAoPGI+dm9pZDwvYj4qKSgqYXR0YWNobWVudCkucHRyIDx0dD4mbHQ7Jmx0OzwvdHQ+IGVuZGw7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO2NvdXQgPHR0PiZsdDsmbHQ7PC90dD4gIlNpemU9IiA8dHQ+Jmx0OyZsdDs8L3R0PiAoKmF0dGFjaG1lbnQpLnNpemUgPHR0PiZsdDsmbHQ7PC90dD4gZW5kbDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Y291dCA8dHQ+Jmx0OyZsdDs8L3R0PiAmIzIwMztuY29kaW5nPSIgPHR0PiZsdDsmbHQ7PC90dD4gKCphdHRhY2htZW50KS5lbmNvZGluZyA8dHQ+Jmx0OyZsdDs8L3R0PiBlbmRsOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtjb3V0IDx0dD4mbHQ7Jmx0OzwvdHQ+ICJUeXBlPSIgPHR0PiZsdDsmbHQ7PC90dD4gKCgqYXR0YWNobWVudCkudHlwZT8oKmF0dGFjaG1lbnQpLnR5cGU6Im51bGwiKSA8dHQ+Jmx0OyZsdDs8L3R0PiBlbmRsOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtjb3V0IDx0dD4mbHQ7Jmx0OzwvdHQ+ICJJRD0iIDx0dD4mbHQ7Jmx0OzwvdHQ+ICgoKmF0dGFjaG1lbnQpLmlkPygqYXR0YWNobWVudCkuaWQ6Im51bGwiKSA8dHQ+Jmx0OyZsdDs8L3R0PiBlbmRsOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtjb3V0IDx0dD4mbHQ7Jmx0OzwvdHQ+ICJMb2NhdGlvbj0iIDx0dD4mbHQ7Jmx0OzwvdHQ+ICgoKmF0dGFjaG1lbnQpLmxvY2F0aW9uPygqYXR0YWNobWVudCkubG9jYXRpb246Im51bGwiKSA8dHQ+Jmx0OyZsdDs8L3R0PiBlbmRsOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtjb3V0IDx0dD4mbHQ7Jmx0OzwvdHQ+ICJEZXNjcmlwdGlvbj0iIDx0dD4mbHQ7Jmx0OzwvdHQ+ICgoKmF0dGFjaG1lbnQpLmRlc2NyaXB0aW9uPygqYXR0YWNobWVudCkuZGVzY3JpcHRpb246Im51bGwiKSA8dHQ+Jmx0OyZsdDs8L3R0PiBlbmRsOyA8YnIgLz4NCit9DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitOb3RlOiBrZWVwIGluIG1pbmQgdGhhdCB0aGUgZmlyc3QgYXR0YWNobWVudCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIFNPQVANCittZXNzYWdlIGFuZCB5b3UgbWF5IHdhbnQgdG8gaWdub3JlIGl0Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitBIGNhbGwgdG8gPGk+c29hcF9lbmQ8L2k+IHJlbW92ZXMgYWxsIG9mIHRoZSByZWNlaXZlZCBNSU1FIGRhdGEuIFRvIHByZXNlcnZlIGFuDQorYXR0YWNobWVudCBpbiBtZW1vcnksIHVzZSA8aT5zb2FwX3VubGluazwvaT4gb24gdGhlIDxpPnB0cjwvaT4gZmllbGQgb2YgdGhlDQorPGk+c29hcF9tdWx0aXBhcnQ8L2k+IHN0cnVjdC4gUmVjYWxsIHRoYXQgdGhlIDxpPnNvYXBfdW5saW5rPC9pPiBmdW5jdGlvbiBpcw0KK2NvbW1vbmx5IHVzZWQgdG8gcHJldmVudCBkZWFsbG9jYXRpb24gb2YgZGVzZXJpYWxpemVkIGRhdGEuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKyA8aDI+PGEgbmFtZT0idHRoX3NFYzE0Ij4NCisxNDwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+RElNRSBBdHRhY2htZW50czwvZm9udD48L2gyPjxhIG5hbWU9InNlYzpESU1FIj4NCis8L2E+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBnU09BUCB0b29sa2l0IHN1cHBvcnRzIERJTUUgYXR0YWNobWVudHMgYXMgcGVyIERJTUUNCitzcGVjaWZpY2F0aW9uLCBzZWUgZm9yIGV4YW1wbGUgKGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9lbi11cy9kbmdsb2JzcGVjL2h0bWwvZHJhZnQtbmllbHNlbi1kaW1lLTAyLnR4dCkNCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorQXBwbGljYXRpb25zIGRldmVsb3BlZCB3aXRoIGdTT0FQIGNhbiB0cmFuc21pdCBiaW5hcnkgRElNRQ0KK2F0dGFjaG1lbnRzIHdpdGggb3Igd2l0aG91dCBzdHJlYW1pbmcuIFdpdGhvdXQgc3RyZWFtaW5nLCBhbGwgZGF0YSBpcyBzdG9yZWQgYW5kIHJldHJpZXZlZCBpbiBtZW1vcnksIHdoaWNoIGNhbiBiZSBwcm9oaWJpdGl2ZSB3aGVuIHRyYW5zbWl0dGluZyBsYXJnZSBmaWxlcyBvbiBzbWFsbCBkZXZpY2VzLiBJbiBjb250cmFzdCB3aXRoIERJTUUgDQorc3RyZWFtaW5nLCBkYXRhIGhhbmRsZXJzIGFyZSB1c2VkIHRvIHBhc3MgdGhlIGRhdGEgdG8gYW5kIGZyb20gYSByZXNvdXJjZSwgc3VjaCBhcyBhIGZpbGUgb3IgZGV2aWNlLg0KK1dpdGggRElNRSBvdXRwdXQgc3RyZWFtaW5nLCByYXcgYmluYXJ5IGRhdGEgaXMgc2VuZCBmcm9tIGEgZGF0YSBzb3VyY2UgaW4NCitjaHVua3Mgb24gdGhlIGZseSB3aXRob3V0IGJ1ZmZlcmluZyB0aGUgZW50aXJlIGNvbnRlbnQgdG8gc2F2ZSBtZW1vcnkuIFdpdGggRElNRSBpbnB1dCBzdHJlYW1pbmcsDQorcmF3IGJpbmFyeSBkYXRhIHdpbGwgYmUgcGFzc2VkIHRvIGRhdGEgaGFuZGxlcnMgKGNhbGxiYWNrcykuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkgICAgIDxoMz48YSBuYW1lPSJ0dGhfc0VjMTQuMSI+DQorMTQuMTwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+U2VuZGluZyBhIENvbGxlY3Rpb24gb2YgRElNRSBBdHRhY2htZW50czwvZm9udD48L2gzPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBzaG91bGQgYmUgdXNlZCB0byBzZXQgdXAgYSBjb2xsZWN0aW9uIG9mDQorbXVsdGlwYXJ0L3JlbGF0ZWQgTUlNRSBhdHRhY2htZW50cyBmb3IgdHJhbnNtaXNzaW9uIHdpdGggYSBTT0FQL1hNTCBtZXNzYWdlLg0KK1RoZSBhdHRhY2htZW50cyBjYW4gYmUgc3RyZWFtZWQsIGFzIGRlc2NyaWJlZCBpbiBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzpESU1Fc3RyZWFtaW5nIj4xNC40PC9hPi4NCitXaXRob3V0IHN0cmVhbWluZywgZWFjaCBhdHRhY2htZW50IG11c3QgcmVmZXIgdG8gYSBibG9jayBvZiBkYXRhIGluIG1lbW9yeS4NCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNEMEQwRDAiPjx0cj48dGQ+PHNwYW4gY2xhc3M9InJvbWFuIj4NCisNCis8dGFibGU+DQorPHRyPjx0ZCB3aWR0aD0iNjAyIj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+RnVuY3Rpb248L2I+PC9mb250PiA8L3RkPjwvdHI+DQorPHRyPjx0ZCB3aWR0aD0iNjAyIj48aT48Yj52b2lkPC9iPiZuYnNwO3NvYXBfc2V0X2RpbWUoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXApPC9pPiA8L3RkPjwvdHI+DQorPHRyPjx0ZCB3aWR0aD0iNjAyIj5UaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGZpcnN0IHRvIGluaXRpYWxpemUgRElNRSBhdHRhY2htZW50IHNlbmQgb3BlcmF0aW9ucyAocmVjZWl2ZXMgYXJlIGF1dG9tYXRpYykuDQorPC90ZD48L3RyPg0KKzx0cj48dGQgd2lkdGg9IjYwMiI+PGk+PGI+aW50PC9iPiZuYnNwO3NvYXBfc2V0X2RpbWVfYXR0YWNobWVudCg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgPGI+Y2hhcjwvYj4mbmJzcDsqcHRyLCBzaXplX3Qgc2l6ZSwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqdHlwZSwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqaWQsIDxiPnVuc2lnbmVkPC9iPiZuYnNwOzxiPnNob3J0PC9iPiZuYnNwO29wdHlwZSwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqb3B0aW9uKTwvaT4gPC90ZD48L3RyPg0KKzx0cj48dGQgd2lkdGg9IjYwMiI+VGhpcyBmdW5jdGlvbiBhZGRzIGEgbmV3IGF0dGFjaG1lbnQgdG8gdGhlIGxpc3Qgb2YgYXR0YWNobWVudHMsIHdoZXJlIDxpPnB0cjwvaT4gYW5kIDxpPnNpemU8L2k+IHJlZmVyIHRvIHRoZSBibG9jayBvZiBtZW1vcnkgdGhhdCBob2xkcyB0aGUgYXR0YWNobWVudCBkYXRhIChleGNlcHQgd2hlbiBESU1FIHN0cmVhbWluZyBjYWxsYmFjayBoYW5kbGVycyBhcmUgdXNlZCBhcyBkZXNjcmliZWQgaW4gU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6RElNRXN0cmVhbWluZyI+MTQuNDwvYT4uIFRoZSA8aT50eXBlPC9pPiBzdHJpbmcgcGFyYW1ldGVyIGlzIHRoZSBNSU1FIHR5cGUgb2YgdGhlIGRhdGEuIFRoZSA8aT5pZDwvaT4gc3RyaW5nIHBhcmFtZXRlciBpcyB0aGUgY29udGVudCBJRCBvZiB0aGUgRElNRSBhdHRhY2htZW50LiBUaGUgPGk+b3B0aW9uPC9pPiBzdHJpbmcgcGFyYW1ldGVyIGhvbGRzIG9wdGlvbmFsIHRleHQgKGdTT0FQIHN1cHBvcnRzIERJTUUgb3B0aW9ucywgYnV0IGl0IGNhbiBzZW5kIG9ubHkgb25lKSBhbmQgPGk+b3B0eXBlPC9pPiBpcyBhIHVzZXItZGVmaW5lZCBvcHRpb24gdHlwZSAoYXMgcGVyIERJTUUgb3B0aW9uIHNwZWNpZmljYXRpb24gZm9ybWF0KS4gQWxsIHBhcmFtZXRlciB2YWx1ZXMgYXJlIGNvcGllZCwgZXhjZXB0IDxpPnB0cjwvaT4uDQorVGhlIHZhbHVlIDxpPlNPQVBfT0s8L2k+IGlzIHJldHVybmVkIHdoZW4gdGhlIGF0dGFjaG1lbnQgd2FzIGFkZGVkLiBPdGhlcndpc2UgYSBnU09BUCBlcnJvciBjb2RlIGlzIHJldHVybmVkLg0KKzwvdGQ+PC90cj4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPjxpPjxiPnZvaWQ8L2I+Jm5ic3A7c29hcF9jbHJfbWltZSg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCk8L2k+IDwvdGQ+PC90cj4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPkRpc2FibGVzIERJTUUgYXR0YWNobWVudHMsIHVubGVzcyB0aGUgc2VyaWFsaXplZCBTT0FQIG1lc3NhZ2UgY29udGFpbnMgYXR0YWNobWVudHMgZm9yIHRyYW5zbWlzc2lvbi4NCis8L3RkPjwvdHI+PC90YWJsZT4NCisNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9zcGFuPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJICAgICA8aDM+PGEgbmFtZT0idHRoX3NFYzE0LjIiPg0KKzE0LjI8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPlJldHJpZXZpbmcgYSBDb2xsZWN0aW9uIG9mIERJTUUgQXR0YWNobWVudHM8L2ZvbnQ+PC9oMz4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorRElNRSBhdHRhY2htZW50cyBhcmUgYXV0b21hdGljYWxseSBwYXJzZWQgYW5kIHN0b3JlZCBpbiBtZW1vcnkgKG9yIHBhc3NlZCB0byB0aGUgc3RyZWFtaW5nIGhhbmRsZXJzKS4NCitBZnRlciByZWNlaXZpbmcgYSBzZXQgb2YgRElNRSBhdHRhY2htZW50cywgZWl0aGVyIGF0IHRoZSBjbGllbnQtc2lkZSBvcg0KK3RoZSBzZXJ2ZXItc2lkZSwgdGhlIGxpc3Qgb2YgRElNRSBhdHRhY2htZW50cyBjYW4gYmUgdHJhdmVyc2VkIHRvIGV4dHJhY3QNCittZXRhIGRhdGEgYW5kIHRoZSBhdHRhY2htZW50IGNvbnRlbnQuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RvIHRyYXZlcnNlIHRoZSBsaXN0IG9mIERJTUUgYXR0YWNobWVudHMgaW4gQywgeW91IHVzZSBhIGxvb3Agc2ltaWxhciB0bzoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+c3RydWN0PC9iPiZuYnNwO3NvYXBfbXVsdGlwYXJ0ICphdHRhY2htZW50OyA8YnIgLz4NCis8Yj5mb3I8L2I+Jm5ic3A7KGF0dGFjaG1lbnQgPSBzb2FwLmRpbWUubGlzdDsgYXR0YWNobWVudDsgYXR0YWNobWVudCA9IGF0dGFjaG1lbnQ8dHQ+LSZndDs8L3R0Pm5leHQpIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7cHJpbnRmKDx0dD4iRElNRSZuYnNwO2F0dGFjaG1lbnQ6XG4iPC90dD4pOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtwcmludGYoPHR0PiJNZW1vcnk9JXBcbiI8L3R0PiwgKCphdHRhY2htZW50KS5wdHIpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtwcmludGYoPHR0PiJTaXplPSV1bFxuIjwvdHQ+LCAoKmF0dGFjaG1lbnQpLnNpemUpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtwcmludGYoPHR0PiJUeXBlPSVzXG4iPC90dD4sICgqYXR0YWNobWVudCkudHlwZT8oKmF0dGFjaG1lbnQpLnR5cGU6Im51bGwiKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7cHJpbnRmKDx0dD4iSUQ9JXNcbiI8L3R0PiwgKCphdHRhY2htZW50KS5pZD8oKmF0dGFjaG1lbnQpLmlkOiJudWxsIik7IDxiciAvPg0KK30NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK0MrKyBwcm9ncmFtbWVycyBjYW4gdXNlIGFuIGl0ZXJhdG9yIGluc3RlYWQsIGFzIGluOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5mb3I8L2I+Jm5ic3A7KHNvYXBfbXVsdGlwYXJ0OjppdGVyYXRvciBhdHRhY2htZW50ID0gc29hcC5kaW1lLmJlZ2luKCk7IGF0dGFjaG1lbnQgIT0gc29hcC5kaW1lLmVuZCgpOyArK2F0dGFjaG1lbnQpIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Y291dCA8dHQ+Jmx0OyZsdDs8L3R0PiAiRElNRSBhdHRhY2htZW50OiIgPHR0PiZsdDsmbHQ7PC90dD4gZW5kbDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Y291dCA8dHQ+Jmx0OyZsdDs8L3R0PiAiTWVtb3J5PSIgPHR0PiZsdDsmbHQ7PC90dD4gKDxiPnZvaWQ8L2I+KikoKmF0dGFjaG1lbnQpLnB0ciA8dHQ+Jmx0OyZsdDs8L3R0PiBlbmRsOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtjb3V0IDx0dD4mbHQ7Jmx0OzwvdHQ+ICJTaXplPSIgPHR0PiZsdDsmbHQ7PC90dD4gKCphdHRhY2htZW50KS5zaXplIDx0dD4mbHQ7Jmx0OzwvdHQ+IGVuZGw7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO2NvdXQgPHR0PiZsdDsmbHQ7PC90dD4gIlR5cGU9IiA8dHQ+Jmx0OyZsdDs8L3R0PiAoKCphdHRhY2htZW50KS50eXBlPygqYXR0YWNobWVudCkudHlwZToibnVsbCIpIDx0dD4mbHQ7Jmx0OzwvdHQ+IGVuZGw7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO2NvdXQgPHR0PiZsdDsmbHQ7PC90dD4gIklEPSIgPHR0PiZsdDsmbHQ7PC90dD4gKCgqYXR0YWNobWVudCkuaWQ/KCphdHRhY2htZW50KS5pZDoibnVsbCIpIDx0dD4mbHQ7Jmx0OzwvdHQ+IGVuZGw7IDxiciAvPg0KK30NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoZSA8aT5vcHRpb25zPC9pPiBmaWVsZCBpcyBhdmFpbGFibGUgYXMgd2VsbC4gVGhlIDxpPm9wdGlvbnM8L2k+IGNvbnRlbnQgaXMNCitmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBESU1FIHNwZWNpZmljYXRpb246IHRoZSBmaXJzdCB0d28gYnl0ZXMgYXJlIHJlc2VydmVkDQorZm9yIHRoZSBvcHRpb24gdHlwZSwgdGhlIG5leHQgdHdvIGJ5dGVzIHN0b3JlIHRoZSBzaXplIG9mIHRoZSBvcHRpb24gZGF0YSwNCitmb2xsb3dlZCBieSB0aGUgKGJpbmFyeSkgb3B0aW9uIGRhdGEuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0EgY2FsbCB0byA8aT5zb2FwX2VuZDwvaT4gcmVtb3ZlcyBhbGwgb2YgdGhlIHJlY2VpdmVkIERJTUUgZGF0YS4gVG8gcHJlc2VydmUgYW4NCithdHRhY2htZW50IGluIG1lbW9yeSwgdXNlIDxpPnNvYXBfdW5saW5rPC9pPiBvbiB0aGUgPGk+cHRyPC9pPiBmaWVsZCBvZiB0aGUNCis8aT5zb2FwX211bHRpcGFydDwvaT4gc3RydWN0LiBSZWNhbGwgdGhhdCB0aGUgPGk+c29hcF91bmxpbms8L2k+IGZ1bmN0aW9uIGlzDQorY29tbW9ubHkgdXNlZCB0byBwcmV2ZW50IGRlYWxsb2NhdGlvbiBvZiBkZXNlcmlhbGl6ZWQgZGF0YS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCSAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWMxNC4zIj4NCisxNC4zPC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5TZXJpYWxpemluZyBCaW5hcnkgRGF0YSBpbiBESU1FPC9mb250PjwvaDM+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0JpbmFyeSBkYXRhIHN0b3JlZCBpbiBleHRlbmRlZCA8dHQ+eHNkOmJhc2U2NEJpbmFyeTwvdHQ+IGFuZCA8dHQ+eHNkOmhleEJpbmFyeTwvdHQ+DQordHlwZXMgY2FuIGJlIHNlcmlhbGl6ZWQgYW5kIGRlc2VyaWFsaXplZCBhcyBESU1FIGF0dGFjaG1lbnRzLiBUaGVzZSBhdHRhY2htZW50cw0KK3dpbGwgYmUgdHJhbnNtaXR0ZWQgcHJpb3IgdG8gdGhlIHNlcXVlbmNlIG9mIHNlY29uZGFyeSBESU1FIGF0dGFjaG1lbnRzIGRlZmluZWQNCitieSB0aGUgdXNlciB3aXRoIDxpPnNvYXBfc2V0X2RpbWVfYXR0YWNobWVudDwvaT4gYXMgZXhwbGFpbmVkIGluIHRoZQ0KK3ByZXZpb3VzIHNlY3Rpb24uIFRoZSBzZXJpYWxpemF0aW9uIHByb2Nlc3MgaXMgYXV0b21hdGVkIGFuZCBESU1FIGF0dGFjaG1lbnRzDQord2lsbCBiZSBzZW5kIGV2ZW4gd2hlbiA8aT5zb2FwX3NldF9kaW1lPC9pPiBvcg0KKzxpPnNvYXBfc2V0X2RpbWVfYXR0YWNobWVudDwvaT4gYXJlIG5vdCB1c2VkLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgPHR0PnhzZDpiYXNlNjRCaW5hcnk8L3R0PiBYU0QgdHlwZSBpcyBkZWZpbmVkIGluIGdTT0FQIGFzIGEgc3RydWN0IG9yIGNsYXNzIGJ5DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDt4c2RfX2Jhc2U2NEJpbmFyeSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnVuc2lnbmVkPC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7Kl9fcHRyOyAvLyBwb2ludGVyIHRvIHJhdyBiaW5hcnkgZGF0YSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7X19zaXplOyAvLyBzaXplIG9mIHRoZSBibG9jayBvZiBkYXRhIDxiciAvPg0KK307DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUbyBlbmFibGUgc2VyaWFsaXphdGlvbiBvZiB0aGUgZGF0YSBpbiBESU1FLCB3ZSBleHRlbmQgdGhpcyB0eXBlIHdpdGggdGhyZWUNCithZGRpdGlvbmFsIGZpZWxkczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+c3RydWN0PC9iPiZuYnNwO3hzZF9fYmFzZTY0QmluYXJ5IDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+dW5zaWduZWQ8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqX19wdHI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmludDwvYj4mbmJzcDtfX3NpemU7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KmlkOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyp0eXBlOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypvcHRpb25zOyA8YnIgLz4NCit9Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIHRocmVlIGFkZGl0aW9uYWwgZmllbGRzIGNvbnNpc3Qgb2YgYW4gPGk+aWQ8L2k+IGZpZWxkIGZvciBhdHRhY2htZW50DQorcmVmZXJlbmNpbmcgKHR5cGljYWxseSBhIGNvbnRlbnQgaWQgKENJRCkgb3IgVVVJRCksIGEgPGk+dHlwZTwvaT4gZmllbGQgdG8NCitzcGVjaWZ5IHRoZSBNSU1FIHR5cGUgb2YgdGhlIGJpbmFyeSBkYXRhLCBhbmQgYW4gPGk+b3B0aW9uczwvaT4gZmllbGQgdG8NCitwaWdneS1iYWNrIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gd2l0aCBhIERJTUUgYXR0YWNobWVudC4gIFRoZSBvcmRlciBvZiB0aGUNCitkZWNsYXJhdGlvbiBvZiB0aGUgZmllbGRzIGlzIHNpZ25pZmljYW50LiBJbiBhZGRpdGlvbiwgbm8gb3RoZXIgZmllbGRzIG9yDQorbWV0aG9kcyBtYXkgYmUgZGVjbGFyZWQgYmVmb3JlIGFueSBvZiB0aGVzZSBmaWVsZHMgaW4gdGhlIHN0cnVjdC9jbGFzcywgYnV0DQorYWRkaXRpb25hbCBmaWVsZHMgYW5kIG1ldGhvZHMgbWF5IGFwcGVhciBhZnRlciB0aGUgZmllbGQgZGVjbGFyYXRpb25zLiBBbg0KK2V4dGVuZGVkIDxpPnhzZF9faGV4QmluYXJ5PC9pPiBkZWNsYXJhdGlvbiBpcyBzaW1pbGFyLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgPGk+aWQ8L2k+IGFuZCA8aT50eXBlPC9pPiBmaWVsZHMgY29udGFpbiB0ZXh0LiBUaGUgc2V0IHRoZSBESU1FLXNwZWNpZmljDQorb3B0aW9ucyBmaWVsZCwgeW91IGNhbiB1c2UgdGhlIDxpPnNvYXBfZGltZV9vcHRpb248L2k+IGZ1bmN0aW9uOiA8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+Y2hhcjwvYj4mbmJzcDsqc29hcF9kaW1lX29wdGlvbig8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgPGI+dW5zaWduZWQ8L2I+Jm5ic3A7PGI+c2hvcnQ8L2I+Jm5ic3A7dHlwZSwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqb3B0aW9uKQ0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorcmV0dXJucyBhIHN0cmluZyB3aXRoIHRoaXMgZW5jb2RpbmcuIEZvciBleGFtcGxlDQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDt4c2RfX2Jhc2U2NEJpbmFyeSBpbWFnZTsgPGJyIC8+DQoraW1hZ2UuX19wdHIgPSAuLi47IDxiciAvPg0KK2ltYWdlLl9fc2l6ZSA9IC4uLjsgPGJyIC8+DQoraW1hZ2UuaWQgPSA8dHQ+InV1aWQ6MDkyMzM1MjMtMzQ1Yi00MzUxLWI2MjMtNWRzZjM1c2dzNWQ2IjwvdHQ+OyA8YnIgLz4NCitpbWFnZS50eXBlID0gPHR0PiJpbWFnZS9qcGVnIjwvdHQ+OyA8YnIgLz4NCitpbWFnZS5vcHRpb25zID0gc29hcF9kaW1lX29wdGlvbihzb2FwLCAwLCA8dHQ+Ik15Jm5ic3A7d2VkZGluZyZuYnNwO3BpY3R1cmUiPC90dD4pOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorV2hlbiBlaXRoZXIgdGhlIDxpPmlkPC9pPiBvciA8aT50eXBlPC9pPiBmaWVsZCB2YWx1ZXMgYXJlIG5vbi1OVUxMIGF0IHJ1biB0aW1lLA0KK3RoZSBkYXRhIHdpbGwgYmUgc2VyaWFsaXplZCBhcyBhIERJTUUgYXR0YWNobWVudC4gVGhlIFNPQVAvWE1MIG1lc3NhZ2UgcmVmZXJzDQordG8gdGhlIGF0dGFjaG1lbnRzIHVzaW5nIDx0dD5ocmVmPC90dD4gYXR0cmlidXRlcy4gVGhpcyBnZW5lcmFsbHkgd29ya3Mgd2lsbCB3aXRoDQorU09BUCBSUEMsIGJlY2F1c2UgPHR0PmhyZWY8L3R0PiBhdHRyaWJ1dGVzIGFyZSBwZXJtaXR0ZWQuIEhvd2V2ZXIsIHdpdGggZG9jdW1lbnQvbGl0ZXJhbCBzdHlsZSB0aGUgcmVmZXJlbmNpbmcgbWVjaGFuaXNtIG11c3QgYmUgZXhwbGljaXRseSBkZWZpbmVkDQoraW4gdGhlIHNjaGVtYSBvZiB0aGUgYmluYXJ5IHR5cGUuIFRoZSBnU09BUA0KK2RlY2xhcmF0aW9uIG9mIGFuIGV4dGVuZGVkIGJpbmFyeSB0eXBlIGlzDQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtuc19fbXlCaW5hcnlEYXRhVHlwZSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnVuc2lnbmVkPC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7Kl9fcHRyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7X19zaXplOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyppZDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqdHlwZTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqb3B0aW9uczsgPGJyIC8+DQorfTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK0MrKyBwcm9ncmFtbWVycyBjYW4gdXNlIGluaGVyaXRhbmNlIGluc3RlYWQgb2YgdGV4dHVhbCBleHRlbnNpb24gcmVxdWlyZWQgaW4gQywgYXMgaW4NCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7eHNkX19iYXNlNjRCaW5hcnkgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj51bnNpZ25lZDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypfX3B0cjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aW50PC9iPiZuYnNwO19fc2l6ZTsgPGJyIC8+DQorfTsgPGJyIC8+DQorPGI+Y2xhc3M8L2I+Jm5ic3A7bnNfX215QmluYXJ5RGF0YVR5cGUgOiB4c2RfX2Jhc2U2NEJpbmFyeSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KmlkOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyp0eXBlOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypvcHRpb25zOyA8YnIgLz4NCit9Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhpcyBkZWZpbmVzIGFuIGV4dGVuc2lvbiBvZiA8dHQ+eHNkOmJhc2U2NEJpbmFyeTwvdHQ+LCBzdWNoIHRoYXQgdGhlIGRhdGEgY2FuIGJlIA0KK3NlcmlhbGl6ZWQgYXMgRElNRSBhdHRhY2htZW50cyB1c2luZyA8dHQ+aHJlZjwvdHQ+IGF0dHJpYnV0ZXMgZm9yIHJlZmVyZW5jaW5nLg0KK1doZW4gYSBkaWZmZXJlbnQgYXR0cmlidXRlIG5hbWUgaXMgaW4gZmFjdCB1c2VkLCBpdCBtdXN0IGJlIGV4cGxpY2l0bHkgZGVmaW5lZDoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorLy9nc29hcCBXU3JlZiBzY2hlbWEgaW1wb3J0OiBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAyLzA0L3JlZmVyZW5jZS8gPGJyIC8+DQorPGI+c3RydWN0PC9iPiZuYnNwO25zX19teUJpbmFyeURhdGFUeXBlIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+dW5zaWduZWQ8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqX19wdHI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmludDwvYj4mbmJzcDtfX3NpemU7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KmlkOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyp0eXBlOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypvcHRpb25zOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtAPGI+Y2hhcjwvYj4mbmJzcDsqV1NyZWZfX2xvY2F0aW9uOyA8YnIgLz4NCit9Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIGV4YW1wbGUgYWJvdmUgdXNlcyB0aGUgPHR0PmxvY2F0aW9uPC90dD4gYXR0cmlidXRlIGRlZmluZWQgaW4gdGhlIGNvbnRlbnQgcmVmZXJlbmNlIHNjaGVtYSwgYXMgZGVmaW5lZCBpbiBvbmUgb2YgdGhlIHZlbmRvcidzIHNwZWNpZmljIFdTREwgZXh0ZW5zaW9ucyBmb3IgRElNRSAoaHR0cDovL3d3dy5nb3Rkb3RuZXQuY29tL3RlYW0veG1sX3dzc3BlY3MvZGltZS9XU0RMLUV4dGVuc2lvbi1mb3ItRElNRS5odG0pLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitXaGVuIHJlY2VpdmluZyBESU1FIGF0dGFjaG1lbnRzLCB0aGUgRElNRSBtZXRhIGRhdGEgYW5kIGJpbmFyeSBkYXRhIGNvbnRlbnQgaXMNCitzdG9yZWQgaW4gYmluYXJ5IGRhdGEgdHlwZXMgb25seSB3aGVuIHRoZSBYTUwgcGFydHMgb2YgdGhlIG1lc3NhZ2UgdXNlcw0KKzx0dD5ocmVmPC90dD4gYXR0cmlidXRlcyB0byByZWZlciB0byB0aGVzZSBhdHRhY2htZW50cy4gVGhlIGdTT0FQIHRvb2xraXQgbWF5DQorc3VwcG9ydCBhdXRvbWF0aWMgKGRlKXNlcmlhbGl6YXRpb24gd2l0aCBvdGhlciB1c2VyLWRlZmluZWQgKG9yIFdTREwtZGVmaW5lZCkNCithdHRyaWJ1dGVzIGluIGZ1dHVyZSByZWxlYXNlcy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorTWVzc2FnZXMgbWF5IGNvbnRhaW4gYmluYXJ5IGRhdGEgdGhhdCByZWZlcmVuY2VzIGV4dGVybmFsIHJlc291cmNlcyBub3QNCitwcm92aWRlZCBhcyBhdHRhY2htZW50cy4gSW4gdGhhdCBjYXNlLCB0aGUgPGk+X19wdHI8L2k+IGZpZWxkIGlzIE5VTEwgYW5kIHRoZQ0KKzxpPmlkPC9pPiBmaWVsZCByZWZlcnMgdG8gdGhlIGV4dGVybmFsIGRhdGEgc291cmNlLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgPGk+ZGltZV9pZF9mb3JtYXQ8L2k+IGF0dHJpYnV0ZSBvZiB0aGUgY3VycmVudCBnU09BUCBydW4tdGltZSBlbnZpcm9ubWVudA0KK2NhbiBiZSBzZXQgdG8gdGhlIGRlZmF1bHQgZm9ybWF0IG9mIERJTUUgaWQgZmllbGRzLiAgVGhlIGZvcm1hdCBzdHJpbmcgTVVTVA0KK2NvbnRhaW4gYSA8aT4lZDwvaT4gZm9ybWF0IHNwZWNpZmllciAob3IgYW55IG90aGVyIDxpPjxiPmludDwvYj48L2k+LWJhc2VkIGZvcm1hdA0KK3NwZWNpZmllcikuIFRoZSB2YWx1ZSBvZiB0aGlzIHNwZWNpZmllciBpcyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLCB3aXRoIHplcm8NCitiZWluZyB0aGUgdmFsdWUgb2YgdGhlIERJTUUgYXR0YWNobWVudCBpZCBmb3IgdGhlIFNPQVAgbWVzc2FnZS4gIEZvciBleGFtcGxlLA0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCBzb2FwOzxiciAvPg0KK3NvYXBfaW5pdCgmYW1wO3NvYXApOyA8YnIgLz4NCitzb2FwLmRpbWVfaWRfZm9ybWF0ID0gPHR0PiJ1dWlkOjA5MjMzNTIzLTM0NWItNDM1MS1iNjIzLTVkc2YzNXNnczVkNi0leCI8L3R0PjsgPGJyIC8+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitBcyBhIHJlc3VsdCwgYWxsIGF0dGFjaG1lbnRzIHdpdGggYSBOVUxMIDxpPmlkPC9pPiBmaWVsZCB3aWxsIHVzZSBhDQorZ1NPQVAtZ2VuZXJhdGVkIGlkIHZhbHVlIGJhc2VkIG9uIHRoZSBmb3JtYXQgc3RyaW5nLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+Q2F1dGlvbjo8L2I+PC9mb250PiBDYXJlIG11c3QgYmUgdGFrZW4gbm90IHRvIGludHJvZHVjZSBkdXBsaWNhdGUgY29udGVudCBpZCB2YWx1ZXMsDQord2hlbiBhc3NpZ25pbmcgY29udGVudCBpZCB2YWx1ZXMgdG8gdGhlIGlkIGZpZWxkcyBvZiBESU1FIGV4dGVuZGVkIGJpbmFyeSBkYXRhDQordHlwZXMuIENvbnRlbnQgaWRzIG11c3QgYmUgdW5pcXVlLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJICAgICA8aDM+PGEgbmFtZT0idHRoX3NFYzE0LjQiPg0KKzE0LjQ8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPlN0cmVhbWluZyBESU1FPC9mb250PjwvaDM+PGEgbmFtZT0ic2VjOkRJTUVzdHJlYW1pbmciPg0KKzwvYT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorU3RyZWFtaW5nIERJTUUgaXMgYWNoaWV2ZWQgd2l0aCBjYWxsYmFjayBmdW5jdGlvbnMgdG8gZmV0Y2ggYW5kIHN0b3JlIGRhdGENCitkdXJpbmcgdHJhbnNtaXNzaW9uLiAgVGhyZWUgZnVuY3Rpb24gY2FsbGJhY2tzIGZvciBzdHJlYW1pbmcgRElNRSBvdXRwdXQgYW5kDQordGhyZWUgY2FsbGJhY2tzIGZvciBzdHJlYW1pbmcgRElNRSBpbnB1dCBhcmUgYXZhaWxhYmxlLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNEMEQwRDAiPjx0cj48dGQ+PHNwYW4gY2xhc3M9InJvbWFuIj4NCisNCis8dGFibGU+DQorPHRyPjx0ZCB3aWR0aD0iNjAyIj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+Q2FsbGJhY2sgKGZ1bmN0aW9uIHBvaW50ZXIpPC9iPjwvZm9udD4gPC90ZD48L3RyPg0KKzx0cj48dGQgd2lkdGg9IjYwMiI+PGk+PGI+dm9pZDwvYj4mbmJzcDsqKCpzb2FwLmZkaW1lcmVhZG9wZW4pKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj52b2lkPC9iPiZuYnNwOypoYW5kbGUsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KmlkLCA8Yj5jb25zdDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyp0eXBlLCA8Yj5jb25zdDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypvcHRpb25zKTwvaT4gPC90ZD48L3RyPg0KKzx0cj48dGQgd2lkdGg9IjYwMiI+Q2FsbGVkIGJ5IHRoZSBnU09BUCBydW4tdGltZSBESU1FIGF0dGFjaG1lbnQgc2VuZGVyIHRvIHN0YXJ0IHJlYWRpbmcgZnJvbSBhDQorKGJpbmFyeSkgZGF0YSBzb3VyY2UgZm9yIG91dGJvdW5kIHRyYW5zbWlzc2lvbi4gVGhlIGNvbnRlbnQgd2lsbCBiZSByZWFkIGZyb20gdGhlDQorYXBwbGljYXRpb24ncyBkYXRhIHNvdXJjZSBpbiBjaHVua3MgdXNpbmcgdGhlIDxpPmZkaW1lcmVhZDwvaT4gY2FsbGJhY2sgYW5kDQorc3RyZWFtZWQgaW50byB0aGUgU09BUC9YTUwvRElNRSBvdXRwdXQgc3RyZWFtLiBUaGUgPGk+aGFuZGxlPC9pPiBjb250YWlucyB0aGUNCit2YWx1ZSBvZiB0aGUgPGk+X19wdHI8L2k+IGZpZWxkIG9mIGFuIGF0dGFjaG1lbnQgc3RydWN0L2NsYXNzLCB3aGljaCBjb3VsZCBiZSBhDQorcG9pbnRlciB0byBzcGVjaWZpYyBpbmZvcm1hdGlvbiBzdWNoIGFzIGEgZmlsZSBkZXNjcmlwdG9yIG9yIGEgcG9pbnRlciB0byBhDQorc3RyaW5nIHRvIGJlIHBhc3NlZCB0byB0aGlzIGNhbGxiYWNrLiAgQm90aCA8aT5fX3B0cjwvaT4gYW5kIDxpPl9fc2l6ZTwvaT4NCitmaWVsZHMgc2hvdWxkIGhhdmUgYmVlbiBzZXQgYnkgdGhlIGFwcGxpY2F0aW9uIHByaW9yIHRvIHRoZSBzZXJpYWxpemF0aW9uIG9mDQordGhlIGNvbnRlbnQuIFRoZSA8aT5pZDwvaT4sIDxpPnR5cGU8L2k+LCBhbmQgPGk+b3B0aW9uczwvaT4gYXJndW1lbnRzIGFyZSB0aGUgRElNRQ0KK2lkLCB0eXBlLCBhbmQgb3B0aW9ucywgcmVzcGVjdGl2ZWx5LiBUaGUgY2FsbGJhY2sgc2hvdWxkIHJldHVybiA8aT5oYW5kbGU8L2k+LA0KK29yIGFub3RoZXIgcG9pbnRlciB2YWx1ZSB3aGljaCB3aWxsIGJlIHBhc3NlZCBhcyBhIGhhbmRsZSB0byA8aT5mZGltZXJlYWQ8L2k+DQorYW5kIDxpPmZkaW1lcmVhZGNsb3NlPC9pPi4gIFRoZSBjYWxsYmFjayBzaG91bGQgcmV0dXJuIE5VTEwgYW5kIHNldA0KKzxpPnNvYXA8L2k+PHR0Pi0mZ3Q7PC90dD48aT5lcnJvcjwvaT4gd2hlbiBhbiBlcnJvciBvY2N1cnJlZC4gVGhlIGNhbGxiYWNrIHNob3VsZCByZXR1cm4NCitOVUxMIChhbmQgbm90IHNldCA8aT5zb2FwPC9pPjx0dD4tJmd0OzwvdHQ+PGk+ZXJyb3I8L2k+KSB3aGVuIHRoaXMgcGFydGljdWxhciBESU1FDQorYXR0YWNobWVudCBpcyBub3QgdG8gYmUgc3RyZWFtZWQuDQorPC90ZD48L3RyPg0KKzx0cj48dGQgd2lkdGg9IjYwMiI+PGk+c2l6ZV90ICgqc29hcC5mZGltZXJlYWQpKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj52b2lkPC9iPiZuYnNwOypoYW5kbGUsIDxiPmNoYXI8L2I+Jm5ic3A7KmJ1Ziwgc2l6ZV90IGxlbik8L2k+IDwvdGQ+PC90cj4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPkNhbGxlZCBieSB0aGUgZ1NPQVAgcnVuLXRpbWUgRElNRSBhdHRhY2htZW50IHNlbmRlciB0byByZWFkIG1vcmUgZGF0YSBmcm9tIGENCisoYmluYXJ5KSBkYXRhIHNvdXJjZSBmb3Igc3RyZWFtaW5nIGludG8gdGhlIG91dHB1dCBzdHJlYW0uICBUaGUgPGk+aGFuZGxlPC9pPg0KK2NvbnRhaW5zIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgPGk+ZmRpbWVyZWFkb3BlbjwvaT4gY2FsbGJhY2suICBUaGUgPGk+YnVmPC9pPg0KK2FyZ3VtZW50IGlzIHRoZSBidWZmZXIgb2YgbGVuZ3RoIDxpPmxlbjwvaT4gaW50byB3aGljaCBhIGNodW5rIG9mIGRhdGEgc2hvdWxkIGJlDQorc3RvcmVkLiAgVGhlIGFjdHVhbCBhbW91bnQgb2YgZGF0YSBzdG9yZWQgaW4gdGhlIGJ1ZmZlciBtYXkgYmUgbGVzcyB0aGFuDQorPGk+bGVuPC9pPiBhbmQgdGhpcyBhbW91bnQgc2hvdWxkIGJlIHJldHVybmVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gIEEgcmV0dXJuIHZhbHVlDQorb2YgMCBpbmRpY2F0ZXMgYW4gZXJyb3IgKHRoZSBjYWxsYmFjayBtYXkgc2V0IDxpPnNvYXA8L2k+PHR0Pi0mZ3Q7PC90dD48aT5lcnJudW08L2k+IHRvIGVycm5vKS4NCitUaGUgPGk+X19zaXplPC9pPiBmaWVsZCBvZiB0aGUgYXR0YWNobWVudA0KK3N0cnVjdC9jbGFzcyBzaG91bGQgaGF2ZSBiZWVuIHNldCBieSB0aGUgYXBwbGljYXRpb24gcHJpb3IgdG8gdGhlIHNlcmlhbGl6YXRpb24NCitvZiB0aGUgY29udGVudC4gIFRoZSB2YWx1ZSBvZiA8aT5fX3NpemU8L2k+IGluZGljYXRlcyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUNCitjb250ZW50IHRvIGJlIHRyYW5zbWl0dGVkLiAgV2hlbiB0aGUgPGk+X19zaXplPC9pPiBpcyB6ZXJvIHRoZW4gRElNRSBjaHVua2VkDQordHJhbnNmZXJzIGNhbiBiZSB1c2VkIHVuZGVyIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcyB0byBzdHJlYW0gY29udGVudCB3aXRob3V0DQorcHJpb3IgZGV0ZXJtaW5hdGlvbiBvZiBhdHRhY2htZW50IHNpemUsIHNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzpkaW1lY2h1bmtpbmciPjE0LjU8L2E+IGJlbG93Lg0KKzwvdGQ+PC90cj4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPjxpPjxiPnZvaWQ8L2I+KCpzb2FwLmZkaW1lcmVhZGNsb3NlKSg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgPGI+dm9pZDwvYj4mbmJzcDsqaGFuZGxlKTwvaT4gPC90ZD48L3RyPg0KKzx0cj48dGQgd2lkdGg9IjYwMiI+Q2FsbGVkIGJ5IHRoZSBnU09BUCBydW4tdGltZSBESU1FIGF0dGFjaG1lbnQgc2VuZGVyIGF0IHRoZSBlbmQgb2YgdGhlDQorc3RyZWFtaW5nIHByb2Nlc3MgdG8gY2xvc2UgdGhlIGRhdGEgc291cmNlLiAgVGhlIDxpPmhhbmRsZTwvaT4gY29udGFpbnMgdGhlDQordmFsdWUgcmV0dXJuZWQgYnkgdGhlIDxpPmZkaW1lcmVhZG9wZW48L2k+IGNhbGxiYWNrLiAgVGhlIDxpPmZkaW1ld3JpdGVjbG9zZTwvaT4NCitjYWxsYmFjayBpcyBjYWxsZWQgYWZ0ZXIgc3VjY2Vzc2Z1bGx5IHRyYW5zbWl0dGluZyB0aGUgZGF0YSBvciB3aGVuIGFuIGVycm9yDQorb2NjdXJyZWQuDQorPC90ZD48L3RyPg0KKzx0cj48dGQgd2lkdGg9IjYwMiI+PGk+PGI+dm9pZDwvYj4mbmJzcDsqKCpzb2FwLmZkaW1ld3JpdGVvcGVuKSg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqaWQsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KnR5cGUsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7Km9wdGlvbnMpPC9pPiA8L3RkPjwvdHI+DQorPHRyPjx0ZCB3aWR0aD0iNjAyIj5DYWxsZWQgYnkgdGhlIGdTT0FQIHJ1bi10aW1lIERJTUUgYXR0YWNobWVudCByZWNlaXZlciB0byBzdGFydCB3cml0aW5nIGFuDQoraW5ib3VuZCBESU1FIGF0dGFjaG1lbnQgdG8gYW4gYXBwbGljYXRpb24ncyBkYXRhIHN0b3JlLiBUaGUgY29udGVudCBpcyBzdHJlYW1lZA0KK2ludG8gYW4gYXBwbGljYXRpb24gZGF0YSBzdG9yZSB0aHJvdWdoIG11bHRpcGxlIDxpPmZkaW1ld3JpdGU8L2k+IGNhbGxzIGZyb20gdGhlDQorZ1NPQVAgYXR0YWNobWVudCByZWNlaXZlci4gIFRoZSA8aT5pZDwvaT4sIDxpPnR5cGU8L2k+LCBhbmQgPGk+b3B0aW9uczwvaT4NCithcmd1bWVudHMgYXJlIHRoZSBESU1FIGlkLCB0eXBlLCBhbmQgb3B0aW9ucyByZXNwZWN0aXZlbHkuIFRoZSBjYWxsYmFjayBzaG91bGQNCityZXR1cm4gYSBoYW5kbGUgd2hpY2ggaXMgcGFzc2VkIHRvIHRoZSA8aT5mZGltZXdyaXRlPC9pPiBhbmQNCis8aT5mZGltZXdyaXRlY2xvc2U8L2k+IGNhbGxiYWNrcy4gVGhlIDxpPl9fcHRyPC9pPiBmaWVsZCBvZiB0aGUgYXR0YWNobWVudA0KK3N0cnVjdC9jbGFzcyBpcyBzZXQgdG8gdGhlIHZhbHVlIG9mIHRoaXMgaGFuZGxlLiBUaGUgPGk+X19zaXplPC9pPiBmaWVsZCBpcyBzZXQNCit0byB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgYXR0YWNobWVudCBhZnRlciByZWNlaXZpbmcgdGhlIGVudGlyZSBjb250ZW50LiBUaGUgc2l6ZQ0KK2lzIHVua25vd24gaW4gYWR2YW5jZSBiZWNhdXNlIERJTUUgYXR0YWNobWVudHMgbWF5IGJlIGNodW5rZWQuDQorPC90ZD48L3RyPg0KKzx0cj48dGQgd2lkdGg9IjYwMiI+PGk+PGI+aW50PC9iPiZuYnNwOygqc29hcC5mZGltZXdyaXRlKSg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgPGI+dm9pZDwvYj4mbmJzcDsqaGFuZGxlLCA8Yj5jb25zdDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypidWYsIHNpemVfdCBsZW4pPC9pPiA8L3RkPjwvdHI+DQorPHRyPjx0ZCB3aWR0aD0iNjAyIj5DYWxsZWQgYnkgdGhlIGdTT0FQIHJ1bi10aW1lIERJTUUgYXR0YWNobWVudCByZWNlaXZlciB0byB3cml0ZSBwYXJ0IG9mDQorYW4gaW5ib3VuZCBESU1FIGF0dGFjaG1lbnQgdG8gYW4gYXBwbGljYXRpb24ncyBkYXRhIHN0b3JlLg0KK1RoZSA8aT5oYW5kbGU8L2k+DQorY29udGFpbnMgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSA8aT5mZGltZXdyaXRlb3BlbjwvaT4gY2FsbGJhY2suICBUaGUgPGk+YnVmPC9pPg0KK2FyZ3VtZW50IGNvbnRhaW5zIHRoZSBkYXRhIG9mIGxlbmd0aCA8aT5sZW48L2k+Lg0KK1RoZSBjYWxsYmFjayBzaG91bGQgcmV0dXJuIGEgZ1NPQVAgZXJyb3IgY29kZSAoZS5nLiZuYnNwOzxpPlNPQVBfT0s8L2k+IHdoZW4gbm8gZXJyb3Igb2NjdXJyZWQpLg0KKzwvdGQ+PC90cj4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPjxpPjxiPnZvaWQ8L2I+KCpzb2FwLmZkaW1ld3JpdGVjbG9zZSkoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIDxiPnZvaWQ8L2I+Jm5ic3A7KmhhbmRsZSk8L2k+IDwvdGQ+PC90cj4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPkNhbGxlZCBieSB0aGUgZ1NPQVAgcnVuLXRpbWUgRElNRSBhdHRhY2htZW50IHJlY2VpdmVyIGF0IHRoZSBlbmQgb2YgdGhlDQorc3RyZWFtaW5nIHByb2Nlc3MgdG8gY2xvc2UgdGhlIGRhdGEgc3RvcmUuICBUaGUgPGk+ZmRpbWV3cml0ZWNsb3NlPC9pPiBjYWxsYmFjaw0KK2lzIGNhbGxlZCBhZnRlciBzdWNjZXNzZnVsbHkgcmVjZWl2aW5nIHRoZSBkYXRhIG9yIHdoZW4gYW4gZXJyb3Igb2NjdXJyZWQuICBUaGUNCis8aT5oYW5kbGU8L2k+IGNvbnRhaW5zIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgPGk+ZmRpbWV3cml0ZW9wZW48L2k+IGNhbGxiYWNrLg0KKzwvdGQ+PC90cj48L3RhYmxlPg0KKw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQorSW4gYWRkaXRpb24sIGEgPGk+PGI+dm9pZDwvYj4qdXNlcjwvaT4gZmllbGQgaW4gdGhlIDxpPjxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwPC9pPiBkYXRhIHN0cnVjdHVyZQ0KK2lzIGF2YWlsYWJsZSB0byBwYXNzIHVzZXItZGVmaW5lZCBkYXRhIHRvIHRoZSBjYWxsYmFja3MuICBUaGlzIHdheSwgeW91IGNhbiBzZXQNCis8aT5zb2FwLnVzZXI8L2k+IHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEgdGhhdCB0aGUgY2FsbGJhY2tzIG5lZWQgc3VjaCBhcyBhDQorZmlsZSBuYW1lIGZvciBleGFtcGxlLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgZm9sbG93aW5nIGV4YW1wbGUgaWxsdXN0cmF0ZXMgdGhlIGNsaWVudC1zaWRlIGluaXRpYWxpemF0aW9uIG9mIGFuIGltYWdlDQorYXR0YWNobWVudCBzdHJ1Y3QgdG8gc3RyZWFtIGEgZmlsZSBpbnRvIGEgRElNRSBhdHRhY2htZW50Og0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5pbnQ8L2I+Jm5ic3A7bWFpbigpIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgc29hcDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+c3RydWN0PC9iPiZuYnNwO3hzZF9fYmFzZTY0QmluYXJ5IGltYWdlOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtGSUxFICpmZDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+c3RydWN0PC9iPiZuYnNwO3N0YXQgc2I7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfaW5pdCgmYW1wO3NvYXApOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoIWZzdGF0KGZpbGVubyhmZCksICZhbXA7c2IpICZhbXA7JmFtcDsgc2Iuc3Rfc2l6ZSAgJmd0OyAgMCkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyAvLyBiZWNhdXNlIHdlIGNhbiBnZXQgdGhlIGxlbmd0aCBvZiB0aGUgZmlsZSwgd2UgY2FuIHN0cmVhbSBpdCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwLmZkaW1lcmVhZG9wZW4gPSBkaW1lX3JlYWRfb3BlbjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c29hcC5mZGltZXJlYWRjbG9zZSA9IGRpbWVfcmVhZF9jbG9zZTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c29hcC5mZGltZXJlYWQgPSBkaW1lX3JlYWQ7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2ltYWdlLl9fcHRyID0gKDxiPnVuc2lnbmVkPC9iPiZuYnNwOzxiPmNoYXI8L2I+KilmZDsgLy8gbXVzdCBzZXQgdG8gbm9uLU5VTEwgKHRoaXMgaXMgb3VyIGZkIGhhbmRsZSB3aGljaCB3ZSBuZWVkIGluIHRoZSBjYWxsYmFja3MpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2ltYWdlLl9fc2l6ZSA9IHNiLnN0X3NpemU7IC8vIG11c3Qgc2V0IHNpemUgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5lbHNlPC9iPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3sgLy8gZG9uJ3Qga25vdyB0aGUgc2l6ZSwgc28gYnVmZmVyIGl0IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NpemVfdCBpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7YzsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7aW1hZ2UuX19wdHIgPSAoPGI+dW5zaWduZWQ8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4qKXNvYXBfbWFsbG9jKCZhbXA7c29hcCwgTUFYX0ZJTEVfU0laRSk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPmZvcjwvYj4mbmJzcDsoaSA9IDA7IGkgICZsdDsgIE1BWF9GSUxFX1NJWkU7IGkrKykgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7eyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoKGMgPSBmZ2V0YyhmZCkpID09IEVPRikgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+YnJlYWs8L2I+OyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtpbWFnZS5fX3B0cltpXSA9IGM7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO30gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZmNsb3NlKGZkKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7aW1hZ2UuX19zaXplID0gaTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtpbWFnZS50eXBlID0gImltYWdlL2pwZWciOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtpbWFnZS5vcHRpb25zID0gc29hcF9kaW1lX29wdGlvbigmYW1wO3NvYXAsIDAsICJNeSBwaWN0dXJlIik7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfY2FsbF9uc19fbWV0aG9kKCZhbXA7c29hcCwgLi4uKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Li4uIDxiciAvPg0KK30gPGJyIC8+DQorPGI+dm9pZDwvYj4mbmJzcDsqZGltZV9yZWFkX29wZW4oPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIDxiPnZvaWQ8L2I+Jm5ic3A7KmhhbmRsZSwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqaWQsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KnR5cGUsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7Km9wdGlvbnMpIDxiciAvPg0KK3sgPGI+cmV0dXJuPC9iPiZuYnNwO2hhbmRsZTsgPGJyIC8+DQorfSA8YnIgLz4NCis8Yj52b2lkPC9iPiZuYnNwO2RpbWVfcmVhZF9jbG9zZSg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgPGI+dm9pZDwvYj4mbmJzcDsqaGFuZGxlKSA8YnIgLz4NCit7IGZjbG9zZSgoRklMRSopaGFuZGxlKTsgPGJyIC8+DQorfSA8YnIgLz4NCitzaXplX3QgZGltZV9yZWFkKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj52b2lkPC9iPiZuYnNwOypoYW5kbGUsIDxiPmNoYXI8L2I+Jm5ic3A7KmJ1Ziwgc2l6ZV90IGxlbikgPGJyIC8+DQoreyA8Yj5yZXR1cm48L2I+Jm5ic3A7ZnJlYWQoYnVmLCAxLCBsZW4sIChGSUxFKiloYW5kbGUpOyA8YnIgLz4NCit9DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgZm9sbG93aW5nIGV4YW1wbGUgaWxsdXN0cmF0ZXMgdGhlIHN0cmVhbWluZyBvZiBhIERJTUUgYXR0YWNobWVudCBpbnRvIGEgZmlsZSBieSBhIGNsaWVudDoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+aW50PC9iPiZuYnNwO21haW4oKSA8YnIgLz4NCit7IDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwIHNvYXA7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfaW5pdCgmYW1wO3NvYXApOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwLmZkaW1ld3JpdGVvcGVuID0gZGltZV93cml0ZV9vcGVuOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwLmZkaW1ld3JpdGVjbG9zZSA9IGRpbWVfd3JpdGVfY2xvc2U7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXAuZmRpbWV3cml0ZSA9IGRpbWVfd3JpdGU7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfY2FsbF9uc19fbWV0aG9kKCZhbXA7c29hcCwgLi4uKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Li4uIDxiciAvPg0KK30gPGJyIC8+DQorPGI+dm9pZDwvYj4mbmJzcDsqZGltZV93cml0ZV9vcGVuKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj5jb25zdDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyppZCwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqdHlwZSwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqb3B0aW9ucykgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtGSUxFICpoYW5kbGUgPSBmb3Blbigic29tZWZpbGUiLCAid2IiKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KCFoYW5kbGUpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c29hcDx0dD4tJmd0OzwvdHQ+ZXJyb3IgPSBTT0FQX0VPRjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c29hcDx0dD4tJmd0OzwvdHQ+ZXJybnVtID0gZXJybm87IC8vIGdldCByZWFzb24gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7KDxiPnZvaWQ8L2I+KiloYW5kbGU7IDxiciAvPg0KK30gPGJyIC8+DQorPGI+dm9pZDwvYj4mbmJzcDtkaW1lX3dyaXRlX2Nsb3NlKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj52b2lkPC9iPiZuYnNwOypoYW5kbGUpIDxiciAvPg0KK3sgZmNsb3NlKChGSUxFKiloYW5kbGUpOyA8YnIgLz4NCit9IDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDtkaW1lX3dyaXRlKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj52b2lkPC9iPiZuYnNwOypoYW5kbGUsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KmJ1Ziwgc2l6ZV90IGxlbikgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzaXplX3QgbndyaXR0ZW47IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPndoaWxlPC9iPiZuYnNwOyhsZW4pIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7bndyaXR0ZW4gPSBmd3JpdGUoYnVmLCAxLCBsZW4sIChGSUxFKiloYW5kbGUpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoIW53cml0dGVuKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDt7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NvYXA8dHQ+LSZndDs8L3R0PmVycm51bSA9IGVycm5vOyAvLyBnZXQgcmVhc29uIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDtTT0FQX0VPRjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtsZW4gLT0gbndyaXR0ZW47IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2J1ZiArPSBud3JpdHRlbjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7U09BUF9PSzsgPGJyIC8+DQorfQ0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorTm90ZSB0aGF0IGNvbXByZXNzaW9uIGNhbiBiZSB1c2VkIHdpdGggRElNRSB0byBjb21wcmVzcyB0aGUgZW50aXJlIG1lc3NhZ2UuDQorSG93ZXZlciwgY29tcHJlc3Npb24gcmVxdWlyZXMgYnVmZmVyaW5nIHRvIGRldGVybWluZSB0aGUgSFRUUCBjb250ZW50IGxlbmd0aA0KK2hlYWRlciwgd2hpY2ggY2FuY2VscyB0aGUgYmVuZWZpdHMgb2Ygc3RyZWFtaW5nIERJTUUuIFRvIGF2b2lkIHRoaXMsIHlvdSBzaG91bGQNCit1c2UgY2h1bmtlZCBIVFRQICh3aXRoIHRoZSBvdXRwdXQtbW9kZSA8aT5TT0FQX0lPX0NIVU5LPC9pPiBmbGFnKSB3aXRoDQorY29tcHJlc3Npb24gYW5kIHN0cmVhbWluZyBESU1FLiBBdCB0aGUgc2VydmVyIHNpZGUsIHdoZW4geW91IHNldA0KKzxpPlNPQVBfSU9fQ0hVTks8L2k+IGJlZm9yZSBjYWxsaW5nIDxpPnNvYXBfc2VydmU8L2k+LCBnU09BUCB3aWxsDQorYXV0b21hdGljYWxseSByZXZlcnQgdG8gYnVmZmVyaW5nICg8aT5TT0FQX0lPX1NUT1JFPC9pPiBmbGFnIGlzIHNldCkuICBZb3UgY2FuDQorY2hlY2sgdGhpcyBmbGFnIHdpdGggPGk+KHNvYXAtJiM2MjtvbW9kZSAmYW1wOyBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LPC9pPiB0byBzZWUNCitpZiB0aGUgY2xpZW50IGFjY2VwdHMgY2h1bmtpbmcuIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgc3RyZWFtaW5nIGNodW5rZWQgRElNRQ0KK2NhbiBiZSBmb3VuZCBpbiBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzpkaW1lY2h1bmtpbmciPjE0LjU8L2E+Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+QzwvYj48L2ZvbnQ+YXV0aW9uOiBUaGUgPGk+b3B0aW9uczwvaT4gZmllbGQgaXMgYSBESU1FLXNwZWNpZmljIGRhdGEgc3RydWN0dXJlLA0KK2NvbnNpc3Rpbmcgb2YgYSA0IGJ5dGUgaGVhZGVyIGNvbnRhaW5pbmcgdGhlIG9wdGlvbiB0eXBlIGluZm8gKGhpIGJ5dGUsIGxvDQorYnl0ZSksIG9wdGlvbiBzdHJpbmcgbGVuZ3RoIChoaSBieXRlLCBsbyBieXRlKSwgZm9sbG93ZWQgYnkgYSBub24tPHR0PidcMCc8L3R0Pg0KK3Rlcm1pbmF0ZWQgc3RyaW5nLiBUaGUgZ1NPQVAgRElNRSBoYW5kbGVyIHJlY29nbml6ZXMgb25lIG9wdGlvbiBhdCBtb3N0Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJCSAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWMxNC41Ij4NCisxNC41PC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5TdHJlYW1pbmcgQ2h1bmtlZCBESU1FPC9mb250PjwvaDM+PGEgbmFtZT0ic2VjOmRpbWVjaHVua2luZyI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitnU09BUCBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgaW5ib3VuZCBjaHVua2VkIERJTUUgYXR0YWNobWVudHMgKHN0cmVhbWluZyBvcg0KK25vbi1zdHJlYW1pbmcpLiAgVG8gdHJhbnNtaXQgb3V0Ym91bmQgRElNRSBhdHRhY2htZW50cywgdGhlIGF0dGFjaG1lbnQgc2l6ZXMNCitNVVNUIGJlIGRldGVybWluZWQgaW4gYWR2YW5jZSB0byBjYWxjdWxhdGUgSFRUUCBtZXNzYWdlIGxlbmd0aCByZXF1aXJlZCB0bw0KK3N0cmVhbSBESU1FIG92ZXIgSFRUUC4gIEhvd2V2ZXIsIGdTT0FQIGFsc28gc3VwcG9ydHMgdGhlIHRyYW5zbWlzc2lvbiBvZg0KK291dGJvdW5kIGNodW5rZWQgRElNRSBhdHRhY2htZW50cyB3aXRob3V0IHByaW9yIGRldGVybWluYXRpb24gb2YgRElNRQ0KK2F0dGFjaG1lbnQgc2l6ZXMgd2hlbiBjZXJ0YWluIGNvbmRpdGlvbnMgYXJlIG1ldC4gIFRoZXNlIGNvbmRpdGlvbnMgcmVxdWlyZQ0KK2VpdGhlciBub24tSFRUUCB0cmFuc3BvcnQgKHVzZSB0aGUgb3V0cHV0LW1vZGUgPGk+U09BUF9FTkNfWE1MPC9pPiBmbGFnKSwgb3INCitjaHVua2VkIEhUVFAgdHJhbnNwb3J0ICh1c2UgdGhlIG91dHB1dC1tb2RlIDxpPlNPQVBfSU9fQ0hVTks8L2k+IGZsYWcpLiAgWW91DQorY2FuIGFsc28gdXNlIHRoZSA8aT5TT0FQX0lPX1NUT1JFPC9pPiBmbGFnICh3aGljaCBpcyBhbHNvIHVzZWQgYXV0b21hdGljYWxseQ0KK3dpdGggY29tcHJlc3Npb24gdG8gZGV0ZXJtaW5lIHRoZSBIVFRQIGNvbnRlbnQgbGVuZ3RoIGhlYWRlcikgYnV0IHRoYXQgY2FuY2Vscw0KK3RoZSBiZW5lZml0cyBvZiBzdHJlYW1pbmcgRElNRS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVG8gc3RyZWFtIGNodW5rZWQgRElNRSwgc2V0IHRoZSA8aT5fX3NpemU8L2k+IGZpZWxkIG9mIGFuIGF0dGFjaG1lbnQgdG8gemVybw0KK2FuZCBlbmFibGUgSFRUUCBjaHVua2luZy4gIFRoZSBESU1FIDxpPmZkaW1lcmVhZDwvaT4gY2FsbGJhY2sgdGhlbiBmZXRjaGVzIGRhdGENCitpbiBjaHVua3MgYW5kIGl0IGlzIGltcG9ydGFudCB0byBmaWxsIHRoZSBlbnRpcmUgYnVmZmVyIHVubGVzcyB0aGUgZW5kIG9mIHRoZQ0KK2RhdGEgaGFzIGJlZW4gcmVhY2hlZCBhbmQgdGhlIGxhc3QgY2h1bmsgaXMgdG8gYmUgc2VuZC4gIFRoYXQgaXMsDQorPGk+ZmRpbWVyZWFkPC9pPiBzaG91bGQgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgbGFzdCA8aT5sZW48L2k+IHBhcmFtZXRlciBhbmQNCitmaWxsIHRoZSBlbnRpcmUgYnVmZmVyIDxpPmJ1ZjwvaT4gZm9yIGFsbCBjaHVua3MgZXhjZXB0IHRoZSBsYXN0Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJICAgICA8aDM+PGEgbmFtZT0idHRoX3NFYzE0LjYiPg0KKzE0LjY8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPldTREwgQmluZGluZ3MgZm9yIERJTUUgQXR0YWNobWVudHM8L2ZvbnQ+PC9oMz4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIDxpPndzZGwyaDwvaT4gV1NETCBwYXJzZXIgcmVjb2duaXplcyBESU1FIGF0dGFjaG1lbnRzIGFuZCBwcm9kdWNlcyBhbiBhbm5vdGF0ZWQgaGVhZGVyIGZpbGUuIEJvdGggb3BlbiBhbmQgY2xvc2VkIGxheW91dHMgYXJlIHN1cHBvcnRlZCBmb3IgdHJhbnNtaXR0aW5nIERJTUUgYXR0YWNobWVudHMuIEZvciBjbG9zZWQgZm9ybWF0cywgYWxsIERJTUUgYXR0YWNobWVudHMgbXVzdCBiZSByZWZlcmVuY2VkIGZyb20gdGhlIFNPQVAgbWVzc2FnZSwgZS5nLiZuYnNwO3VzaW5nIGhyZWZzIHdpdGggU09BUCBlbmNvZGluZyBhbmQgdXNpbmcgdGhlIGFwcGxpY2F0aW9uLXNwZWNpZmljIHJlZmVyZW5jZSBhdHRyaWJ1dGUgaW5jbHVkZWQgaW4gdGhlIDxpPmJhc2U2NEJpbmFyeTwvaT4gc3RydWN0L2NsYXNzIGZvciBkb2MvbGl0Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitBcyBvZiB0aGlzIHdyaXRpbmcsIHRoZSBnU09BUCBjb21waWxlciA8aT5zb2FwY3BwMjwvaT4gZG9lcyBub3QgeWV0IHByb2R1Y2UgYSBXU0RMIHdpdGggRElNRSBleHRlbnNpb25zLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisgPGgyPjxhIG5hbWU9InR0aF9zRWMxNSI+DQorMTU8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPk1UT00gQXR0YWNobWVudHM8L2ZvbnQ+PC9oMj48YSBuYW1lPSJzZWM6TVRPTSI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitNVE9NIChNZXNzYWdlIFRyYW5zbWlzc2lvbiBPcHRpbWl6YXRpb24gTWVjaGFuaXNtKSBpcyBhIHJlbGF0aXZlbHkgbmV3IGZvcm1hdA0KK2ZvciB0cmFuc21pdHRpbmcgYXR0YWNobWVudHMgd2l0aCBTT0FQIG1lc3NhZ2VzIChzZWUNCis8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9zb2FwMTItbXRvbSI+PHR0Pmh0dHA6Ly93d3cudzMub3JnL1RSL3NvYXAxMi1tdG9tPC90dD48L2E+KS4gTVRPTSBpcyBhIFczQyB3b3JraW5nIGRyYWZ0IGFzIG9mIHRoaXMNCit3cml0aW5nLiBNVE9NIGF0dGFjaG1lbnRzIGFyZSBlc3NlbnRpYWxseSBNSU1FIGF0dGFjaG1lbnRzIHdpdGggc3RhbmRhcmRpemVkDQorbWVjaGFuaXNtcyBmb3IgY3Jvc3MgcmVmZXJlbmNpbmcgYXR0YWNobWVudHMgZnJvbSB0aGUgU09BUCBib2R5LCB3aGljaCBpcw0KK2Fic2VudCBpbiAocGxhaW4pIE1JTUUgYXR0YWNobWVudHMgYW5kIG9wdGlvbmFsIHdpdGggRElNRSBhdHRhY2htZW50cy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVW5saWtlIHRoZSBuYW1lIHN1Z2dlc3RzLCB0aGUgc3BlZWQgYnkgd2hpY2ggYXR0YWNoZWQgZGF0YSBpcyB0cmFuc21pdHRlZCBpcw0KK25vdCBpbmNyZWFzZWQgY29tcGFyZWQgdG8gTUlNRSwgRElNRSwgb3IgZXZlbiBYTUwgZW5jb2RlZCBiYXNlNjQgZGF0YSAoYXQgbGVhc3QNCit0aGUgcGVyZm9ybWFuY2UgZGlmZmVyZW5jZXMgaW4gZ1NPQVAgd2lsbCBiZSBzbWFsbCkuIFRoZSBhZHZhbnRhZ2Ugb2YgdGhlDQorZm9ybWF0IGlzIHRoZSBzdGFuZGFyZGl6ZWQgYXR0YWNobWVudCByZWZlcmVuY2UgbWVjaGFuaXNtLCB3aGljaCBzaG91bGQgaW1wcm92ZQ0KK2ludGVyb3BlcmFiaWxpdHkuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBNVE9NIHNwZWNpZmljYXRpb24gbWFuZGF0ZXMgU09BUCAxLjIgYW5kIHRoZSB1c2Ugb2YgdGhlIFhPUCBuYW1lc3BhY2UuIFRoZQ0KK1hPUCBJbmNsdWRlIGVsZW1lbnQgPHR0PnhvcDpJbmNsdWRlPC90dD4gaXMgdXNlZCB0byByZWZlcmVuY2UgYXR0YWNobWVudChzKSBmcm9tIHRoZSBTT0FQIG1lc3NhZ2UgYm9keS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorQmVjYXVzZSByZWZlcmVuY2VzIGZyb20gd2l0aGluIHRoZSBTT0FQIG1lc3NhZ2UgYm9keSB0byBhdHRhY2htZW50cyBhcmUNCittYW5kYXRvcnkgd2l0aCBNVE9NLCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNlcmlhbGl6YXRpb24gYW5kIGRlc2VyaWFsaXphdGlvbiBvZiBNVE9NDQorTUlNRSBhdHRhY2htZW50cyBpbiBnU09BUCB1c2VzIHRoZSBleHRlbmRlZCBiaW5hcnkgdHlwZSBjb21wYXJhYmxlIHRvIERJTUUgc3VwcG9ydCBpbiBnU09BUC4gVGhpcyBiaW5hcnkgdHlwZSBpcyBwcmVkZWZpbmVkIGluIHRoZSA8aT5pbXBvcnQveG9wLmg8L2k+IGZpbGU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vZ3NvYXAgeG9wIHNjaGVtYSBpbXBvcnQ6IGh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgveG9wL2luY2x1ZGUgPGJyIC8+DQorPGI+c3RydWN0PC9iPiZuYnNwO194b3BfX0luY2x1ZGUgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj51bnNpZ25lZDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypfX3B0cjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aW50PC9iPiZuYnNwO19fc2l6ZTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqaWQ7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KnR5cGU7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7Km9wdGlvbnM7IDxiciAvPg0KK307IDxiciAvPg0KKzxiPnR5cGVkZWY8L2I+Jm5ic3A7PGI+c3RydWN0PC9iPiZuYnNwO194b3BfX0luY2x1ZGUgX3hvcF9fSW5jbHVkZTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoZSBhZGRpdGlvbmFsIDxpPmlkPC9pPiwgPGk+dHlwZTwvaT4sIGFuZCA8aT5vcHRpb248L2k+IGZpZWxkcw0KK2VuYWJsZSBNVE9NIGF0dGFjaG1lbnRzIGZvciB0aGUgZGF0YSBwb2ludGVkIHRvIGJ5IDxpPl9fcHRyPC9pPiBvZiBzaXplIDxpPl9fc2l6ZTwvaT4uIFRoZSBwcm9jZXNzIGZvciBzZW5kaW5nIGFuZCByZWNlaXZpbmcgTVRPTSBYT1ANCithdHRhY2htZW50cyBpcyBmdWxseSBhdXRvbWF0ZWQuIFN0cmVhbWluZyB0ZWNobmlxdWVzIGhvd2V2ZXIsIHN1Y2ggYXMgZm9yIERJTUUNCithcmUgbm90ICh5ZXQpIGF2YWlsYWJsZS4NCitUaGUgPGk+aWQ8L2k+IGZpZWxkIHJlZmVyZW5jZXMgdGhlIGF0dGFjaG1lbnQgKHR5cGljYWxseSBhIGNvbnRlbnQgaWQgQ0lEIG9yIFVVSUQpLiBXaGVuIHNldCB0byBOVUxMLCBnU09BUCBhc3NpZ25zIGEgdW5pcXVlIENJRC4gVGhlIDxpPnR5cGU8L2k+DQorZmllbGQgc3BlY2lmaWVzIHRoZSByZXF1aXJlZCBNSU1FIHR5cGUgb2YgdGhlIGJpbmFyeSBkYXRhLCBhbmQgdGhlIG9wdGlvbmFsDQorPGk+b3B0aW9uczwvaT4gZmllbGQgY2FuIGJlIHVzZWQgdG8gcGlnZ3ktYmFjayBkZXNjcmlwdGl2ZSB0ZXh0IHdpdGggYW4gYXR0YWNobWVudC4gIFRoZSBvcmRlciBvZiB0aGUNCitkZWNsYXJhdGlvbiBvZiB0aGUgZmllbGRzIGlzIHNpZ25pZmljYW50Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitZb3UgY2FuIGV4cGxpY2l0bHkgaW1wb3J0IHRoZSA8aT54b3AuaDwvaT4gaW4geW91ciBoZWFkZXIgZmlsZSB0byB1c2UgdGhlIE1UT00gYXR0YWNobWVudHMgaW4geW91ciBzZXJ2aWNlLCBmb3IgZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorI2ltcG9ydCAmIzIzOTttcG9ydC9zb2FwMTIuaCIgPGJyIC8+DQorLyogYWx0ZXJuYXRpdmVseSwgd2l0aG91dCB0aGUgaW1wb3J0IGFib3ZlLCB1c2U6IDxiciAvPg0KKy8vZ3NvYXAgU09BUC1FTlYgc2NoZW1hIG5hbWVzcGFjZTogaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIDxiciAvPg0KKy8vZ3NvYXAgU09BUC1FTkMgc2NoZW1hIG5hbWVzcGFjZTogaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVuY29kaW5nIDxiciAvPg0KKyovIDxiciAvPg0KKyNpbXBvcnQgJiMyMzk7bXBvcnQveG9wLmgiIDxiciAvPg0KKyNpbXBvcnQgJiMyMzk7bXBvcnQveG1sbWltZS5oIiA8YnIgLz4NCis8YnIgLz4NCisvL2dzb2FwIHggc2NoZW1hIG5hbWVzcGFjZTogaHR0cDovL215LmZpcnN0Lm10b20ubmV0IDxiciAvPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDt4X19teURhdGEgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtfeG9wX19JbmNsdWRlIHhvcF9fSW5jbHVkZTsgLy8gYXR0YWNobWVudCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtAPGI+Y2hhcjwvYj4mbmJzcDsqeG1sbWltZV9fY29udGVudFR5cGU7IC8vIGFuZCBpdHMgY29udGVudFR5cGUgPGJyIC8+DQorfTsgPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO3hfX215TVRPTXRlc3QoPGI+c3RydWN0PC9iPiZuYnNwO3hfX215RGF0YSAqaW4sIDxiPnN0cnVjdDwvYj4mbmJzcDt4X19teURhdGEgKm91dCk7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitBcyB5b3UgY2FuIHNlZSwgdGhlcmUgaXMgcmVhbGx5IG5vIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3BlY2lmaWNhdGlvbiBvZiBNVE9NDQorYW5kIERJTUUgYXR0YWNobWVudHMgaW4gYSBnU09BUCBoZWFkZXIgZmlsZS4gRXhjZXB0IHRoYXQgeW91IE1VU1QgdXNlIFNPQVAgMS4yDQorYW5kIHRoZSA8aT54b3BfX0luY2x1ZGU8L2k+IGVsZW1lbnQuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1doZW4gYW4gaW5zdGFuY2Ugb2YgPGk+eF9fbXlEYXRhVHlwZTwvaT4gaXMgc2VyaWFsaXplZCBhbmQgZWl0aGVyIG9yIGJvdGggdGhlDQorPGk+aWQ8L2k+IGFuZCA8aT50eXBlPC9pPiBmaWVsZHMgYXJlIG5vbi1OVUxMLCB0aGUgZGF0YSBpcyB0cmFuc21pdHRlZCBhcyBNVE9NDQorTUlNRSBhdHRhY2htZW50IGlmIHRoZSA8aT5TT0FQX0VOQ19NVE9NPC9pPiBmbGFnIGlzIHNldCBpbiB0aGUgZ1NPQVAncyBzb2FwDQorc3RydWN0IGNvbnRleHQ6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwID0gc29hcF9uZXcxKFNPQVBfRU5DX01UT00pOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorV2l0aG91dCB0aGlzIGZsYWcsIHRoZSBhdHRhY2htZW50cyB3aWxsIGJlIHRyYW5zbWl0dGVkIGluIERJTUUgZm9ybWF0DQorKFNlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOkRJTUUiPjE0PC9hPikuIElmIHlvdXIgY3VycmVudCBjbGllbnRzIGFuZCBzZXJ2aWNlcyBhcmUgYmFzZWQgb24NCitub24tc3RyZWFtaW5nIERJTUUgYXR0YWNobWVudHMgdXNpbmcgdGhlIFNPQVAgYm9keSByZWZlcmVuY2UgbWVjaGFuaXNtICh0aHVzLA0KK3dpdGhvdXQgdXNpbmcgdGhlIDxpPnNvYXBfc2V0X2RpbWVfYXR0YWNobWVudDwvaT4gZnVuY3Rpb24pIG9yIHBsYWluIGJhc2U2NA0KK2JpbmFyeSBYTUwgZGF0YSBlbGVtZW50cywgaXQgaXMgdmVyeSBlYXN5IHRvIGFkb3B0IE1UT00gYnkgcmVuYW1pbmcgdGhlIGJpbmFyeSB0eXBlcyB0byA8aT54b3BfX0luY2x1ZGU8L2k+IGFuZCB1c2luZyB0aGUNCis8aT5TT0FQX0VOQ19NVE9NPC9pPiBmbGFnIHdpdGggdGhlIFNPQVAgMS4yIG5hbWVzcGFjZS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCSAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWMxNS4xIj4NCisxNS4xPC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5HZW5lcmF0aW5nIE11bHRpcGFydFJlbGF0ZWQgTUlNRSBBdHRhY2htZW50IEJpbmRpbmdzIGluIFdTREw8L2ZvbnQ+PC9oMz48YSBuYW1lPSJzZWM6TUlNRVdTREwiPg0KKzwvYT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVG8gZ2VuZXJhdGUgbXVsdGlwYXJ0UmVsYXRlZCBiaW5kaW5ncyBpbiB0aGUgV1NETCBmaWxlLCB1c2UgdGhlIDxpPi8vZ3NvYXANCisuLi4gc2VydmljZSBtZXRob2QtbWltZS10eXBlPC9pPiBkaXJlY3RpdmUgKHNlZSBhbHNvIFNlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOmRpcmVjdGl2ZXMiPjE4LjI8L2E+LiBUaGUNCitkaXJlY3RpdmUgY2FuIGJlIHJlcGVhdGVkIGZvciBlYWNoIGF0dGFjaG1lbnQgeW91IHdhbnQgdG8gYXNzb2NpYXRlIHdpdGggYQ0KK21ldGhvZCdzIHJlcXVlc3QgYW5kIHJlc3BvbnNlIG1lc3NhZ2VzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitGb3IgZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorI2ltcG9ydCAmIzIzOTttcG9ydC9zb2FwMTIuaCIgPGJyIC8+DQorI2ltcG9ydCAmIzIzOTttcG9ydC94b3AuaCIgPGJyIC8+DQorI2ltcG9ydCAmIzIzOTttcG9ydC94bWxtaW1lLmgiIDxiciAvPg0KKzxiciAvPg0KKy8vZ3NvYXAgeCBzY2hlbWEgbmFtZXNwYWNlOiBodHRwOi8vbXkuZmlyc3QubXRvbS5uZXQgPGJyIC8+DQorPGI+c3RydWN0PC9iPiZuYnNwO3hfX215RGF0YSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO194b3BfX0luY2x1ZGUgeG9wX19JbmNsdWRlOyAvLyBhdHRhY2htZW50IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO0A8Yj5jaGFyPC9iPiZuYnNwOyp4bWxtaW1lX19jb250ZW50VHlwZTsgLy8gYW5kIGl0cyBjb250ZW50VHlwZSA8YnIgLz4NCit9OyA8YnIgLz4NCisvL2dzb2FwIHggc2VydmljZSBtZXRob2QtbWltZS10eXBlOiBteU1UT010ZXN0IHRleHQveG1sIDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDt4X19teU1UT010ZXN0KDxiPnN0cnVjdDwvYj4mbmJzcDt4X19teURhdGEgKmluLCA8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7eF9fbXlEYXRhICpvdXQpOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIDxpPi8vZ3NvYXAgeCBzZXJ2aWNlIG1ldGhvZC1taW1lLXR5cGU8L2k+IGRpcmVjdGl2ZSBpbmRpY2F0ZXMgdGhhdCB0aGlzDQorb3BlcmF0aW9uIGFjY2VwdHMgPHR0PnRleHQveG1sPC90dD4gTUlNRSBhdHRhY2htZW50cy4gU2VlIHRoZSBTT0FQLXdpdGgtQXR0YWNobWVudA0KK3NwZWNpZmljYXRpb24gZm9yIHRoZSBNSU1FIHR5cGVzIHRvIHVzZSAoZm9yIGV4YW1wbGUsIDx0dD4qLyo8L3R0PiBpcyBhIHdpbGRjYXJkKS4NCitJZiB0aGUgb3BlcmF0aW9uIGhhcyBtb3JlIHRoYW4gb25lIGF0dGFjaG1lbnQsIGp1c3QgcmVwZWF0IHRoaXMgZGlyZWN0aXZlIGZvcg0KK2VhY2ggYXR0YWNobWVudCB5b3Ugd2FudCB0byBiaW5kIHRvIHRoZSBvcGVyYXRpb24uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RvIGJpbmQgYXR0YWNobWVudHMgb25seSB0byB0aGUgcmVxdWVzdCBtZXNzYWdlIG9mIGFuIG9wZXJhdGlvbiwgdXNlDQorPGk+Ly9nc29hcCB4IHNlcnZpY2UgbWV0aG9kLWlucHV0LW1pbWUtdHlwZTwvaT4uIFNpbWlsYXJseSwgdG8gYmluZCBhdHRhY2htZW50cw0KK29ubHkgdG8gdGhlIHJlc3BvbnNlIG1lc3NhZ2Ugb2YgYW4gb3BlcmF0aW9uLCB1c2UgPGk+Ly9nc29hcCB4IHNlcnZpY2UNCittZXRob2Qtb3VwdXQtbWltZS10eXBlPC9pPi4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIDxpPndzZGwyaDwvaT4gV1NETCBwYXJzZXIgcmVjb2duaXplcyBNSU1FIGF0dGFjaG1lbnRzIGFuZCBwcm9kdWNlcyBhbg0KK2Fubm90YXRlZCBoZWFkZXIgZmlsZS4gSG93ZXZlciwgdGhlIG9yZGVyaW5nIG9mIE1JTUUgcGFydHMgaW4gdGhlDQorbXVsdGlwYXJ0UmVsYXRlZCBlbGVtZW50cyBpcyBub3QgcmVmbGVjdGVkIGluIHRoZSBoZWFkZXIgZmlsZS4gQXBwbGljYXRpb24NCitkZXZlbG9wZXJzIHNob3VsZCBhZGhlcmUgdGhlIHN0YW5kYXJkcyBhbmQgZW5zdXJlIHRoYXQgbXVsdGlwYXJ0L3JlbGF0ZWQNCithdHRhY2htZW50cyBhcmUgdHJhbnNtaXR0ZWQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBXU0RMIG9wZXJhdGlvbiBkZWNsYXJhdGlvbnMuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkgICAgIDxoMz48YSBuYW1lPSJ0dGhfc0VjMTUuMiI+DQorMTUuMjwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+U2VuZGluZyBhbmQgUmVjZWl2aW5nIE1UT00gQXR0YWNobWVudHM8L2ZvbnQ+PC9oMz4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorQSByZWNlaXZlciBtdXN0IGJlIHRvbGQgdG8gcmVjb2duaXplIE1UT00gYXR0YWNobWVudHMgYnkgc2V0dGluZw0KK3RoZSA8aT5TT0FQX0VOQ19NVE9NPC9pPiBmbGFnIG9mIHRoZSBnU09BUCBjb250ZXh0LiBPdGhlcndpc2UsIHRoZSByZWd1bGFyIE1JTUUNCithdHRhY2htZW50IG1lY2hhbmlzbSB3aWxsIGJlIHVzZWQgdG8gc3RvcmUgYXR0YWNobWVudHMgYW5kIGluIHRoaXMgcHJvY2VzcyB0aGUgcmVmZXJlbmNlcyBmcm9tIHRoZSBTT0FQIG1lc3NhZ2UgYm9keSB0byB0aGUgYXR0YWNobWVudHMgYXJlIGxvc3QuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1doZW4gdXNpbmcgPGk+d3NkbDJoPC9pPiB0byBidWlsZCBjbGllbnRzIGFuZC9vciBzZXJ2aWNlcywgeW91IHNob3VsZCB1c2UgdGhlIDxpPnR5cGVtYXAuZGF0PC9pPiBmaWxlIGluY2x1ZGVkIGluIHRoZSBkaXN0cmlidXRpb24gcGFja2FnZS4gVGhlIDxpPnR5cGVtYXAuZGF0PC9pPiBmaWxlIGRlZmluZXMgdGhlIFhPUCBuYW1lc3BhY2UgYW5kIFhNTCBNSU1FIG5hbWVzcGFjZXMgYXMgaW1wb3J0ZWQgbmFtZXNwYWNlczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQoreG9wICAgICA9ICAmbHQ7IGh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgveG9wL2luY2x1ZGUgJmd0OyAgPGJyIC8+DQoreG1pbWUgICA9ICAmbHQ7IGh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDYveG1sbWltZSAmZ3Q7ICA8YnIgLz4NCit4bWxtaW1lID0gICZsdDsgaHR0cDovL3d3dy53My5vcmcvMjAwNC8xMS94bWxtaW1lICZndDsgDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgPGk+d3NkbDJoPC9pPiB0b29sIHVzZXMgdGhlIDxpPnR5cGVtYXAuZGF0PC9pPiBmaWxlIChzZWUgYWxzbyBvcHRpb24gLXQpIHRvDQorY29udmVydCBXU0RMIGludG8gYSBnU09BUCBoZWFkZXIgZmlsZS4gSW4gdGhpcyBjYXNlIHdlIGRvbid0IHdhbnQgdGhlDQorPGk+d3NkbDJoPC9pPiB0b29sIHRvIHJlYWQgdGhlIFhPUCBzY2hlbWEgYW5kIHRyYW5zbGF0ZSBpdCwgc2luY2Ugd2UgaGF2ZSBhDQorc3BlY2lhbCA8aT5feG9wX19JbmNsdWRlPC9pPiBlbGVtZW50IGFscmVhZHkgZGVmaW5lZCBpbiA8aT54b3AuaDwvaT4uDQorVGhlcmVmb3JlLCB0aGUgYWJvdmUgYmluZGluZ3Mgd2lsbCBub3QgdHJhbnNsYXRlIHRoZSBYT1AgYW5kIFhNTCBNSU1FIHNjaGVtYXMsDQorYnV0IGluc3RlYWQgZ2VuZXJhdGVzIDxpPiNpbXBvcnQ8L2k+IHN0YXRlbWVudHM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKyNpbXBvcnQgInhvcC5oIiA8YnIgLz4NCisjaW1wb3J0ICJ4bWxtaW1lLmgiDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgPGk+I2ltcG9ydDwvaT4gc3RhdGVtZW50cyBhcmUgb25seSBhZGRlZCBmb3IgdGhvc2UgbmFtZXNwYWNlcyB0aGF0IGFyZQ0KK2FjdHVhbGx5IHVzZWQgYnkgdGhlIHNlcnZpY2UuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0xldCdzIHRha2UgYSBsb29rIGF0IGFuIGV4YW1wbGUuDQorVGhlIDxpPndzZGwyaDwvaT4gaW1wb3J0ZXIgZ2VuZXJhdGVzIGEgaGVhZGVyIGZpbGUgd2l0aCA8aT4jaW1wb3J0ICJ4b3AuaCI8L2k+IGZyb20gYSBXU0RMIHRoYXQgcmVmZXJlbmNlcyBYT1AsIGZvciBleGFtcGxlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisjaW1wb3J0ICJ4b3AuaCIgPGJyIC8+DQorI2ltcG9ydCAieG1sbWltZS5oIiA8YnIgLz4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7bnNfX0RhdGEgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtfeG9wX19JbmNsdWRlIHhvcF9fSW5jbHVkZTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7QDxiPmNoYXI8L2I+Jm5ic3A7KnhtbG1pbWVfX2NvbnRlbnRUeXBlOyAgPGJyIC8+DQorfTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1N1cHBvc2UgdGhlIFdTREwgZGVmaW5lcyBhbiBvcGVyYXRpb246DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPmludDwvYj4mbmJzcDtuc19fZWNob0RhdGEoPGI+c3RydWN0PC9iPiZuYnNwO25zX19EYXRhICppbiwgPGI+c3RydWN0PC9iPiZuYnNwO25zX19EYXRhICpvdXQpOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorQWZ0ZXIgZ2VuZXJhdGluZyB0aGUgc3R1YnMvcHJveGllcyB3aXRoIHRoZSA8aT5zb2FwY3BwMjwvaT4gY29tcGlsZXIsIHdlIGNhbiBpbnZva2UgdGhlIHN0dWIgYXQgdGhlIGNsaWVudCBzaWRlIHdpdGg6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwID0gc29hcF9uZXcxKFNPQVBfRU5DX01UT00pOyA8YnIgLz4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7bnNfX0RhdGEgZGF0YTsgPGJyIC8+DQorZGF0YS54b3BfX0luY2x1ZGUuX19wdHIgPSAoPGI+dW5zaWduZWQ8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4qKSI8dHQ+Jmx0O2ImZ3Q7SGVsbG8mbmJzcDt3b3JsZCEmbHQ7L2ImZ3Q7PC90dD4iOyA8YnIgLz4NCitkYXRhLnhvcF9fSW5jbHVkZS5fX3NpemUgPSAyMDsgPGJyIC8+DQorZGF0YS54b3BfX0luY2x1ZGUuaWQgPSBOVUxMOyAvLyBDSUQgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgZ1NPQVAgZW5naW5lIDxiciAvPg0KK2RhdGEueG9wX19JbmNsdWRlLnR5cGUgPSAidGV4dC9odG1sIjsgLy8gTUlNRSB0eXBlIDxiciAvPg0KK2RhdGEueG9wX19JbmNsdWRlLm9wdGlvbnMgPSBOVUxMOyAvLyBubyBkZXNjcmlwdGl2ZSBpbmZvIGFkZGVkIDxiciAvPg0KK2RhdGEueG1sbWltZV9fY29udGVudFR5cGUgPSAidGV4dC9odG1sIjsgLy8gTUlNRSB0eXBlIDxiciAvPg0KKzxiPmlmPC9iPiZuYnNwOyhzb2FwX2NhbGxfbnNfX2VjaG9EYXRhKHNvYXAsIGVuZHBvaW50LCBhY3Rpb24sICZhbXA7ZGF0YSwgJmFtcDtkYXRhKSkNCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX3ByaW50X2ZhdWx0KHNvYXAsIHN0ZGVycik7DQorPGI+ZWxzZTwvYj48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtwcmludGYoIjx0dD5Hb3QmbmJzcDtkYXRhXG48L3R0PiIpOyA8YnIgLz4NCitzb2FwX2Rlc3Ryb3koc29hcCk7IC8vIHJlbW92ZSBkZXNlcmlhbGl6ZWQgY2xhc3MgaW5zdGFuY2VzIChDKysgb25seSkgPGJyIC8+DQorc29hcF9lbmQoc29hcCk7IC8vIHJlbW92ZSB0ZW1wb3JhcnkgYW5kIGRlc2VyaWFsaXplZCBkYXRhIDxiciAvPg0KK3NvYXBfZG9uZShzb2FwKTsgLy8gZGV0YWNoIDxiciAvPg0KK2ZyZWUoc29hcCk7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitOb3RlIHRoYXQgdGhlIDxpPnhvcF9fSW5jbHVkZS50eXBlPC9pPiBmaWVsZCBtdXN0IGJlIHNldCB0byB0cmFuc21pdCBNVE9NIGF0dGFjaG1lbnRzLCBvdGhlcndpc2UgcGxhaW4gYmFzZTY0IFhNTCB3aWxsIGJlIHVzZWQuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0F0IHRoZSBzZXJ2ZXIgc2lkZSwgd2UgY2FuIGltcGxlbWVudCBhbiBvcGVyYXRpb24gaGFuZGxlciB0aGF0IGp1c3QgY29waWVzIHRoZSBpbnB1dCBkYXRhIHRvIG91dHB1dCB0byBpbXBsZW1lbnQgdGhlIGVjaG8gb3BlcmF0aW9uIGFzIGZvbGxvd3M6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPmludDwvYj4mbmJzcDtuc19fZWNob0RhdGEoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIDxiPnN0cnVjdDwvYj4mbmJzcDtuc19fRGF0YSAqaW4sIDxiPnN0cnVjdDwvYj4mbmJzcDtuc19fZGF0YSAqb3V0KSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOypvdXQgPSAqaW47IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDtTT0FQX09LOyA8YnIgLz4NCit9DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgc2VydmVyIG11c3QgdXNlIHRoZSA8aT5TT0FQX0VOQ19NVE9NPC9pPiBmbGFnIHRvIGluaXRpYWxpemUgdGhlIHNvYXAgc3RydWN0IHRvIHJlY2VpdmUgYW5kIHNlbmQgTVRPTSBhdHRhY2htZW50cy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorIDxoMj48YSBuYW1lPSJ0dGhfc0VjMTYiPg0KKzE2PC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5YTUwgVmFsaWRhdGlvbjwvZm9udD48L2gyPjxhIG5hbWU9InNlYzp2YWxpZGF0aW9uIj4NCis8L2E+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBnU09BUCBYTUwgcGFyc2VyIGFwcGxpZXMgYmFzaWMgcnVsZXMgdG8gdmFsaWRhdGUgY29udGVudC4gSG93ZXZlciwNCitvY2N1cnJlbmNlIGNvbnN0cmFpbnRzIGFyZSBub3QgYXV0b21hdGljYWxseSB2ZXJpZmllZCB1bmxlc3MgZXhwbGljaXRseQ0KK2luZGljYXRlZC4gIFRoaXMgaGVscHMgdG8gYXZvaWQgaW50ZXJvcGVyYWJpbGl0eSBwcm9ibGVtcyB3aXRoIHRvb2xraXRzIHRoYXQgZG8NCitub3Qgc3RyaWN0bHkgZW5mb3JjZSB2YWxpZGF0aW9uIHJ1bGVzLiBJbiBhZGRpdGlvbiwgd2UgY2Fubm90IGFsd2F5cyB1c2Ugc3RyaWN0DQordmFsaWRhdGlvbiBmb3IgU09BUCBSUEMgZW5jb2RlZCBtZXNzYWdlcywgc2luY2UgU09BUCBSUEMgZW5jb2RpbmcgYWRvcHRzIGEgdmVyeQ0KK2xvb3NlIHNlcmlhbGl6YXRpb24gZm9ybWF0Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitWYWxpZGF0aW9uIGNvbnN0cmFpbnRzIGFyZSBjaGVja2VkIGJ5IGdTT0FQIHdpdGggdGhlIDxpPlNPQVBfWE1MX1NUUklDVDwvaT4gaW5wdXQgbW9kZQ0KK2ZsYWcgc2V0LCBlLmcuJm5ic3A7d2l0aCA8aT5zb2FwX3NldF9pbW9kZShzb2FwLCBTT0FQX1hNTF9TVFJJQ1QpPC9pPiBvcg0KKzxpPnNvYXBfbmV3KFNPQVBfWE1MX1NUUklDVCk8L2k+LCBzZWUgU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6ZmxhZ3MiPjguMTI8L2E+IGZvciBhIGNvbXBsZXRlIGxpc3QNCitvZiBmbGFncy4gDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkgICAgIDxoMz48YSBuYW1lPSJ0dGhfc0VjMTYuMSI+DQorMTYuMTwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+T2NjdXJyZW5jZSBDb25zdHJhaW50czwvZm9udD48L2gzPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJCSAgICAgIDxoND48YSBuYW1lPSJ0dGhfc0VjMTYuMS4xIj4NCisxNi4xLjE8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPkVsZW1lbnRzIHdpdGggbWluT2NjdXJzIGFuZCBtYXhPY2N1cnMgUmVzdHJpY3Rpb25zPC9mb250PjwvaDQ+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RvIGZvcmNlIHRoZSB2YWxpZGF0aW9uIG9mIG1pbk9jY3VycyBhbmQgbWF4T2NjdXJzIGNvbnRyYWludHMgdGhlIDxpPlNPQVBfWE1MX1NUUklDVDwvaT4gaW5wdXQgbW9kZSBmbGFnIG11c3QgYmUgc2V0Lg0KK1RoZSBtaW5PY2N1cnMgYW5kIG1heE9jY3VycyBjb25zdHJhaW50cyBhcmUgc3BlY2lmaWVkIGZvciBmaWVsZHMgb2YgYSBzdHJ1Y3QgYW5kIG1lbWJlcnMgb2YgYSBjbGFzcyBpbiBhIGhlYWRlciBmaWxlIHVzaW5nIHRoZSBmb2xsb3dpbmcgc3ludGF4Og0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8dT48c3BhbiBjbGFzcz0icm9tYW4iPlR5cGU8L3NwYW4+PC91PiA8dT48c3BhbiBjbGFzcz0icm9tYW4iPmZpZWxkbmFtZTwvc3Bhbj48L3U+IDxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPls8L3NwYW4+PC9mb250Pjx1PjxzcGFuIGNsYXNzPSJyb21hbiI+bWluT2NjdXJzPC9zcGFuPjwvdT48Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD46PHU+PHNwYW4gY2xhc3M9InJvbWFuIj5tYXhPY2N1cnM8L3NwYW4+PC91Pjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250Pjxmb250IHNpemU9IisxIj48c3BhbiBjbGFzcz0icm9tYW4iPl08L3NwYW4+PC9mb250PiA8Zm9udCBzaXplPSIrMSI+PHNwYW4gY2xhc3M9InJvbWFuIj5bPC9zcGFuPjwvZm9udD49IHZhbHVlPGZvbnQgc2l6ZT0iKzEiPjxzcGFuIGNsYXNzPSJyb21hbiI+XTwvc3Bhbj48L2ZvbnQ+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgbWluT2NjdXJzIGFuZCBtYXhPY2N1cnMgdmFsdWVzIG11c3QgYmUgaW50ZWdlciBsaXRlcmFscy4gQSBkZWZhdWx0IHZhbHVlIGNhbiBiZSBwcm92aWRlZCB3aGVuIG1pbk9jY3VycyBpcyB6ZXJvLiBEZWZhdWx0IHZhbHVlcyBtdXN0IGJlIHByaW1pdGl2ZSB0eXBlcywgaW50ZWdlciwgZmxvYXQsIHN0cmluZywgZXRjLiBCeSBkZWZhdWx0IHRoZSBtaW5PY2N1cnMgY29uc3RyYWludCBpcyB6ZXJvLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitGb3IgZXhhbXBsZQ0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7bnNfX015UmVjb3JkIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aW50PC9iPiZuYnNwO24gPSA1OyAvLyBlbGVtZW50IHdpdGggZGVmYXVsdCB2YWx1ZSA1LCBtaW5PY2N1cnM9MCwgbWF4T2NjdXJzPTE8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7bSAxOyAvLyBlbGVtZW50IHdpdGggbWluT2NjdXJzPTEgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aW50PC9iPiZuYnNwO19fc2l6ZSAwOjEwOyAvLyBzZXF1ZW5jZSAmbHQ7aXRlbSYjNjI7IHdpdGggbWluT2NjdXJzPTAsIG1heE9jY3Vycz0xMDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmludDwvYj4mbmJzcDsqaXRlbTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c3RkOjp2ZWN0b3I8dHQ+Jmx0OzwvdHQ+ZG91YmxlPHR0PiZndDs8L3R0PiBudW1zIDI7IC8vIHNlcXVlbmNlICZsdDtudW1zJiM2Mjsgd2l0aCBtaW5PY2N1cnM9MiwgbWF4T2NjdXJzPXVuYm91bmRlZCA8YnIgLz4NCit9OyA8YnIgLz4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7YXJyYXlPZmludCA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmludDwvYj4mbmJzcDsqX19wdHIgMToxMDA7IC8vIG1pbk9jY3Vycz0xLCBtYXhPY2N1cnM9MTAwIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmludDwvYj4mbmJzcDtzaXplOyA8YnIgLz4NCit9Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorUG9pbnRlci1iYXNlZCBzdHJ1Y3QgZmllbGRzIGFuZCBjbGFzcyBtZW1iZXJzIGFyZSBhbGxvd2VkIHRvIGJlIG5pbGxhYmxlIHdoZW4gbWluT2NjdXJzIGlzIHplcm8uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkJICAgICAgPGg0PjxhIG5hbWU9InR0aF9zRWMxNi4xLjIiPg0KKzE2LjEuMjwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+UmVxdWlyZWQgYW5kIFByb2hpYml0ZWQgQXR0cmlidXRlczwvZm9udD48L2g0Pg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitTaW1pbGFyIHRvIHRoZSBtaW5PY2N1cnMgYW5kIG1heE9jY3VycyBhbm5vdGF0aW9ucyBkZWZpbmVkIGluIHRoZSBwcmV2aW91cw0KK3NlY3Rpb24sIGF0dHJpYnV0ZXMgaW4gYSBzdHJ1Y3Qgb3IgY2xhc3MgY2FuIGJlIGFubm90YXRlZCB3aXRoIG9jY3VycmVuY2UNCitjb25zdHJhaW50cyB0byBtYWtlIHRoZW0gb3B0aW9uYWwgKDApLCByZXF1aXJlZCAoMSksIG9yIHByb2hpYml0ZWQgKDA6MCkuDQorRGVmYXVsdCB2YWx1ZXMgY2FuIGJlIGFzc2lnbmVkIHRvIG9wdGlvbmFsIGF0dHJpYnV0ZXMuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0ZvciBleGFtcGxlDQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtuc19fTXlSZWNvcmQgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtAPGI+aW50PC9iPiZuYnNwO20gMTsgLy8gcmVxdWlyZWQgYXR0cmlidXRlIChvY2N1cnMgYXQgbGVhc3Qgb25jZSkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7QDxiPmludDwvYj4mbmJzcDtuID0gNTsgLy8gb3B0aW9uYWwgYXR0cmlidXRlIHdpdGggZGVmYXVsdCB2YWx1ZSA1PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7QDxiPmludDwvYj4mbmJzcDtvIDA7IC8vIG9wdGlvbmFsIGF0dHJpYnV0ZSAobWF5IG9yIG1heSBub3Qgb2NjdXIpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO0A8Yj5pbnQ8L2I+Jm5ic3A7cCAwOjA7IC8vIHByb2hpYml0ZWQgYXR0cmlidXRlIDxiciAvPg0KK307DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitSZW1lbWJlciB0byBzZXQgdGhlIDxpPlNPQVBfWE1MX1NUUklDVDwvaT4gaW5wdXQgbW9kZSBmbGFnIHRvDQorZW5hYmxlIHRoZSB2YWxpZGF0aW9uIG9mIGF0dHJpYnV0ZSBvY2N1cnJlbmNlIGNvbnN0cmFpbnRzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJCSAgICAgIDxoND48YSBuYW1lPSJ0dGhfc0VjMTYuMS4zIj4NCisxNi4xLjM8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPkRhdGEgTGVuZ3RoIFJlc3RyaWN0aW9uczwvZm9udD48L2g0Pg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitBIHNjaGVtYSBzaW1wbGVUeXBlIGlzIGRlZmluZWQgd2l0aCBhIDxpPjxiPnR5cGVkZWY8L2I+PC9pPiBieSB0YWtpbmcgYSBiYXNlIHByaW1pdGl2ZSB0byBkZWZpbmVkIGEgZGVyaXZlZCBzaW1wbGVUeXBlLiAgRm9yIGV4YW1wbGU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnR5cGVkZWY8L2I+Jm5ic3A7PGI+aW50PC9iPiZuYnNwO3RpbWVfX3NlY29uZHM7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGlzIGRlZmluZXMgdGhlIGZvbGxvd2luZyBzY2hlbWEgdHlwZSBpbiA8aT50aW1lLnhzZDwvaT46DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBCMEQwIj48dHI+PHRkPjx0dD4NCismbHQ7c2ltcGxlVHlwZSBuYW1lPSJzZWNvbmRzJiMxODc7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6aW50Ii8mIzYyOyA8YnIgLz4NCismbHQ7L3NpbXBsZVR5cGUmIzYyOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3R0Pg0KK0EgY29tcGxleFR5cGUgd2l0aCBzaW1wbGVDb250ZW50IGlzIGRlZmluZWQgd2l0aCBhIHdyYXBwZXIgc3RydWN0L2NsYXNzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7dGltZV9fZGF0ZSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7Kl9faXRlbTsgLy8gc29tZSBjdXN0b20gZm9ybWF0IGRhdGUgKHJlc3RyaWN0aW9uIG9mIHN0cmluZykgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7QDxiPmVudW08L2I+Jm5ic3A7dGltZV9fem9uZSB7IEVTVCwgR01ULCAuLi4gfSB6b25lOyA8YnIgLz4NCit9DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGlzIGRlZmluZXMgdGhlIGZvbGxvd2luZyBzY2hlbWEgdHlwZSBpbiA8aT50aW1lLnhzZDwvaT46DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBCMEQwIj48dHI+PHRkPjx0dD4NCismbHQ7Y29tcGxleFR5cGUgbmFtZT0iZGF0ZSYjMTg3OyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbHQ7c2ltcGxlQ29udGVudCYjNjI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyIvJiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0Oy9zaW1wbGVDb250ZW50JiM2MjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2F0dHJpYnV0ZSBuYW1lPSJ6b25lIiB0eXBlPSJ0aW1lOnpvbmUiIHVzZT0ib3B0aW9uYWwiLyYjNjI7IDxiciAvPg0KKyZsdDsvY29tcGxleFR5cGUmIzYyOw0KKyZsdDtzaW1wbGVUeXBlIG5hbWU9InpvbmUmIzE4NzsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3Jlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmcmIzE4NzsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2VudW1lcmF0aW9uIHZhbHVlPSJFU1QiLyYjNjI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtlbnVtZXJhdGlvbiB2YWx1ZT0iR01UIi8mIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsuLi4gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0Oy9yZXN0cmljdGlvbiYjNjI7IDxiciAvPg0KKyZsdDsvc2ltcGxlVHlwZSYjNjI7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvdHQ+DQorRGF0YSB2YWx1ZSBsZW5ndGggY29uc3RyYWludHMgb2Ygc2ltcGxlVHlwZXMgYW5kIGNvbXBsZXhUeXBlcyB3aXRoIHNpbXBsZUNvbnRlbnQgYXJlIGRlZmluZWQgYXMgZm9sbG93cy4NCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypuc19fc3RyaW5nMjU2IDA6MjU2OyAvLyBzaW1wbGVUeXBlIHJlc3RyaWN0aW9uIG9mIHN0cmluZyB3aXRoIG1heCBsZW5ndGggMjU2IGNoYXJhY3RlcnMgPGJyIC8+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypuc19fc3RyaW5nMTAgMTA6MTA7IC8vIHNpbXBsZVR5cGUgcmVzdHJpY3Rpb24gb2Ygc3RyaW5nIHdpdGggbGVuZ3RoIG9mIDEwIGNoYXJhY3RlcnMgPGJyIC8+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDtzdGQ6OnN0cmluZyAqbnNfX3N0cmluZzggODsgLy8gc2ltcGxlVHlwZSByZXN0cmljdGlvbiBvZiBzdHJpbmcgd2l0aCBhdCBsZWFzdCA4IGNoYXJhY3RlcnMgPGJyIC8+DQorPGI+c3RydWN0PC9iPiZuYnNwO25zX19kYXRhIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqX19pdGVtIDoyNTY7IC8vIHNpbXBsZUNvbnRlbnQgd2l0aCBhdCBtb3N0IDI1NiBjaGFyYWN0ZXJzIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO0A8Yj5jaGFyPC9iPiZuYnNwOypuYW1lIDE7IC8vIHJlcXVpcmVkIG5hbWUgYXR0cmlidXRlIDxiciAvPg0KK307DQorPGI+c3RydWN0PC9iPiZuYnNwO3RpbWVfX2RhdGUgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypfX2l0ZW0gOjEwMDsNCismbmJzcDsmbmJzcDsmbmJzcDtAPGI+ZW51bTwvYj4mbmJzcDt0aW1lX196b25lIHsgRVNULCBHTVQsIC4uLiB9IHpvbmUgPSBHTVQ7IDxiciAvPg0KK30NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1JlbWVtYmVyIHRvIHNldCB0aGUgPGk+U09BUF9YTUxfU1RSSUNUPC9pPiBpbnB1dCBtb2RlIGZsYWcgdG8NCitlbmFibGUgdGhlIHZhbGlkYXRpb24gb2YgdmFsdWUgbGVuZ3RoIGNvbnN0cmFpbnRzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJICAgICA8aDM+PGEgbmFtZT0idHRoX3NFYzE2LjIiPg0KKzE2LjI8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPk90aGVyIENvbnN0cmFpbnRzPC9mb250PjwvaDM+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RvIGFzc29jaWF0ZSBhIHBhdHRlcm4gd2l0aCBhIHNpbXBsZVR5cGUsIHlvdSBjYW4gZGVmaW5lIGEgc2ltcGxlVHlwZSB3aXRoIGEgPGk+PGI+dHlwZWRlZjwvYj48L2k+IGFuZCBhIHBhdHRlcm4gc3RyaW5nOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmludDwvYj4mbmJzcDt0aW1lX19zZWNvbmQgIlsxLTVdP1swLTldIC0gNjAiOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhpcyBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgc2NoZW1hIHR5cGUgaW4gPGk+dGltZS54c2Q8L2k+Og0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwQjBEMCI+PHRyPjx0ZD48dHQ+DQorJmx0O3NpbXBsZVR5cGUgbmFtZT0ic2Vjb25kJiMxODc7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6aW50JiMxODc7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtwYXR0ZXJuIHZhbHVlPSJbMS01XT9bMC05XSAtIDYwIi8mIzYyOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbHQ7L3Jlc3RyaWN0aW9uIGJhc2U9InhzZDppbnQiLyYjNjI7IDxiciAvPg0KKyZsdDsvc2ltcGxlVHlwZSYjNjI7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvdHQ+DQorVGhlIHBhdHRlcm4gc3RyaW5nIE1VU1QgY29udGFpbiBhIHZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbi4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorUGF0dGVybnMgYXJlIGN1cnJlbnRseSBub3QgY2hlY2tlZCBpbiB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisgPGgyPjxhIG5hbWU9InR0aF9zRWMxNyI+DQorMTc8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPlNPQVAtb3Zlci1VRFA8L2ZvbnQ+PC9oMj48YSBuYW1lPSJzZWM6dWRwIj4NCis8L2E+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1VEUCBpcyBhIHNpbXBsZSwgdW5yZWxpYWJsZSBkYXRhZ3JhbSBwcm90b2NvbDogVURQIHNvY2tldHMgYXJlIGNvbm5lY3Rpb25sZXNzLg0KK1VEUCBhZGRyZXNzIGZvcm1hdHMgYXJlIGlkZW50aWNhbCB0byB0aG9zZSB1c2VkIGJ5IFRDUC4gIEluIHBhcnRpY3VsYXIgVURQDQorcHJvdmlkZXMgYSBwb3J0IGlkZW50aWZpZXIgaW4gYWRkaXRpb24gdG8gdGhlIG5vcm1hbCBJbnRlcm5ldCBhZGRyZXNzIGZvcm1hdC4NCitUaGUgVURQIHBvcnQgc3BhY2UgaXMgc2VwYXJhdGUgZnJvbSB0aGUgVENQIHBvcnQgc3BhY2UgKGkuZS4gYSBVRFAgcG9ydCBtYXkgbm90DQorYmUgImNvbm5lY3RlZCIgdG8gYSBUQ1AgcG9ydCkuICBJbiBhZGRpdGlvbiBicm9hZGNhc3QgcGFja2V0cyBtYXkgYmUgc2VudA0KKyhhc3N1bWluZyB0aGUgdW5kZXJseWluZyBuZXR3b3JrIHN1cHBvcnRzIHRoaXMpIGJ5IHVzaW5nIGEgcmVzZXJ2ZWQgImJyb2FkY2FzdA0KK2FkZHJlc3MiOyB0aGlzIGFkZHJlc3MgaXMgbmV0d29yayBpbnRlcmZhY2UgZGVwZW5kZW50Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUbyBlbmFibGUgU09BUC1vdmVyLVVEUCB3aXRoIGdTT0FQLCA8aT5zdGRzb2FwMi5jPC9pPiBhbmQgPGk+c3Rkc29hcDIuY3BwPC9pPg0KK01VU1QgYmUgY29tcGlsZWQgd2l0aCA8aT4tRFdJVEhfVURQPC9pPiBwcmlvciB0byBsaW5raW5nIHdpdGggeW91ciBhcHBsaWNhdGlvbi4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorQ2xpZW50LXNpZGUgbWVzc2FnZXMgd2l0aCBTT0FQLW92ZXItVURQIGVuZHBvaW50IFVSTHMNCisoPGk+c29hcC51ZHA6Ly8uLi48L2k+KSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgdHJhbnNtaXR0ZWQgYXMgZGF0YWdyYW1zLg0KK1NlcnZlci1zaWRlIGFwcGxpY2F0aW9ucyBzaG91bGQgc2V0IHRoZSA8aT5TT0FQX0lPX1VEUDwvaT4gbW9kZSBmbGFnIHRvDQorYWNjZXB0IFVEUCByZXF1ZXN0cywgZS5nLiB1c2luZyA8aT5zb2FwX2luaXQxPC9pPiBvciA8aT5zb2FwX3NldF9tb2RlPC9pPi4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIG1heGltdW0gbWVzc2FnZSBsZW5ndGggZm9yIGRhdGFncmFtIHBhY2tldHMgaXMgcmVzdHJpY3RlZCBieSB0aGUgYnVmZmVyDQorc2l6ZSA8aT5TT0FQX0JVRkxFTjwvaT4sIHdoaWNoIGlzIDY1NTM2IGJ5IGRlZmF1bHQsIHVubGVzcw0KK2NvbXBpbGVkIHdpdGggPGk+V0lUSF9MRUFOPC9pPiB0byBzdXBwb3J0IHNtYWxsLXNjYWxlIGVtYmVkZGVkIHN5c3RlbXMuDQorRm9yIFVEUCB0cmFuc3BvcnQgPGk+U09BUF9CVUZMRU48L2k+IG11c3Qgbm90IGV4Y2VlZCB0aGUgbWF4aW11bSBVRFAgcGFja2V0IHNpemUNCis2NTUzNiAodGhlIHNpemUgb2YgZGF0YWdyYW0gbWVzc2FnZXMgaXMgY29uc3RyYWluZWQgYnkgdGhlDQorVURQIHBhY2tldCBzaXplIDI8c3VwPjE2PC9zdXA+PTY1NTM2IGFzIHBlciBVRFAgc3RhbmRhcmQpLiBZb3UgY2FuIHVzZSBnemlwIGNvbXByZXNzaW9uDQordG8gcmVkdWNlIHRoZSBtZXNzYWdlIHNpemUsIGJ1dCBub3RlIHRoYXQgY29tcHJlc3NlZCBTT0FQLW92ZXItVURQIGlzIGENCitnU09BUC1zcGVjaWZpYyBmZWF0dXJlIGJlY2F1c2UgaXQgaXMgbm90IHBhcnQgb2YgdGhlIFNPQVAtb3Zlci1VRFANCitzcGVjaWZpY2F0aW9uLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgU09BUC1vdmVyLVVEUCBzcGVjaWZpY2F0aW9uIHJlbGllcyBvbiBXUy1BZGRyZXNzaW5nLiBUaGUgPGk+d3NhLmg8L2k+DQorZmlsZSBpbiB0aGUgPGk+aW1wb3J0PC9pPiBkaXJlY3RvcnkgZGVmaW5lcyB0aGUgV1MtQWRkcmVzc2luZyBlbGVtZW50cyBmb3INCitjbGllbnQgYW5kIHNlcnZlciBhcHBsaWNhdGlvbnMuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBnU09BUCBpbXBsZW1lbnRhdGlvbiBjb25mb3JtcyB0byB0aGUgU09BUC1vdmVyLVVEUCByZXF1aXJlbWVudHM6DQorDQorPHVsPg0KKzxsaT4gU09BUC1vdmVyLVVEUCBzZXJ2ZXIgZW5kcG9pbnQgVVJMIGZvcm1hdDogPGk+c29hcC51ZHA6Ly9ob3N0OnBvcnQvcGF0aDwvaT4NCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorPC9saT4NCisNCis8bGk+IFN1cHBvcnQgb25lLXdheSBtZXNzYWdlLWV4Y2hhbmdlIHBhdHRlcm4gKE1FUCkgd2hlcmUgYSBTT0FQIGVudmVsb3BlIGlzDQorICBjYXJyaWVkIGluIGEgdXNlciBkYXRhZ3JhbS4NCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorPC9saT4NCisNCis8bGk+IFN1cHBvcnQgcmVxdWVzdC1yZXNwb25zZSBtZXNzYWdlLWV4Y2hhbmdlIHBhdHRlcm4gKE1FUCkgd2hlcmUgU09BUCBlbnZlbG9wZXMNCisgIGFyZSBjYXJyaWVkIGluIHVzZXIgZGF0YWdyYW1zLg0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8L2xpPg0KKw0KKzxsaT4gU3VwcG9ydCBtdWx0aWNhc3QgdHJhbnNtaXNzaW9uIG9mIFNPQVAgZW52ZWxvcGVzIGNhcnJpZWQgaW4gdXNlciBkYXRhZ3JhbXMuDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorDQorPGxpPiBTdXBwb3J0IGJvdGggU09BUCAxLjEgYW5kIFNPQVAgMS4yIGVudmVsb3Blcy4NCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorPC9saT4NCis8L3VsPg0KK1RoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBmZWF0dXJlcyBhcmUgYWxzbyBhdmFpbGFibGUsIGJ1dCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgU09BUC1vdmVyLVVEUCBzcGVjaWZpY2F0aW9uOg0KKw0KKzx1bD4NCis8bGk+IFpsaWIvZ3ppcCBtZXNzYWdlIGNvbXByZXNzaW9uIChjb21waWxlIDxpPi1EV0lUSF9HWklQPC9pPikuDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorDQorPGxpPiBTT0FQIHdpdGggRElNRSBhdHRhY2htZW50cyBvdmVyIFVEUC4NCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorPC9saT4NCisNCis8bGk+IFNPQVAgd2l0aCBNSU1FIGF0dGFjaG1lbnRzIChTd0EpIG92ZXIgVURQLg0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8L2xpPg0KKw0KKzxsaT4gU3VwcG9ydCBmb3IgSVB2NiAoY29tcGlsZSA8aT4tRFdJVEhfSVBWNjwvaT4pDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorPC91bD4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCSAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWMxNy4xIj4NCisxNy4xPC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5Vc2luZyBXUy1BZGRyZXNzaW5nIHdpdGggU09BUC1vdmVyLVVEUDwvZm9udD48L2gzPjxhIG5hbWU9InNlYzp1ZHAuaCI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitBIFNPQVAtb3Zlci1VRFAgYXBwbGljYXRpb24gTVVTVCB1c2UgV1MtQWRkcmVzc2luZyB0byBjb250cm9sIG1lc3NhZ2UgZGVsaXZlcnkNCithcyBwZXIgU09BUC1vdmVyLVVEUCBzcGVjaWZpY2F0aW9uLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgPGk+d3NhLmg8L2k+IGZpbGUgaW4gdGhlIDxpPmltcG9ydDwvaT4gZGlyZWN0b3J5IGRlZmluZXMgdGhlDQorV1MtQWRkcmVzc2luZyBlbGVtZW50cy4gIFRvIGluY2x1ZGUgdGhlIFdTLUFkZHJlc3NpbmcgZWxlbWVudHMgaW4gdGhlIFNPQVANCitIZWFkZXIgZm9yIG1lc3NhZ2luZywgYSA8aT48Yj5zdHJ1Y3Q8L2I+Jm5ic3A7U09BUF9FTlZfX0hlYWRlcjwvaT4gc3RydWN0dXJlIG11c3QgYmUNCitkZWZpbmVkIGluIHlvdXIgaGVhZGVyIGZpbGUgd2l0aCB0aGUgYXBwcm9wcmlhdGUgV1MtQWRkcmVzc2luZyBlbGVtZW50cy4NCitGb3IgZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorI2ltcG9ydCAid3NhLmgiIDxiciAvPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtTT0FQX0VOVl9fSGVhZGVyIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7bXVzdFVuZGVyc3RhbmQgX3dzYV9fTWVzc2FnZUlEICB3c2FfX01lc3NhZ2VJRCAwOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDttdXN0VW5kZXJzdGFuZCBfd3NhX19SZWxhdGVzVG8gKndzYV9fUmVsYXRlc1RvIDA7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO211c3RVbmRlcnN0YW5kIF93c2FfX0Zyb20gICAgICAqd3NhX19Gcm9tICAgICAgMDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7bXVzdFVuZGVyc3RhbmQgX3dzYV9fUmVwbHlUbyAgICp3c2FfX1JlcGx5VG8gICAwOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDttdXN0VW5kZXJzdGFuZCBfd3NhX19GYXVsdFRvICAgKndzYV9fRmF1bHRUbyAgIDA7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO211c3RVbmRlcnN0YW5kIF93c2FfX1RvICAgICAgICAgd3NhX19UbyAgICAgICAgMDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7bXVzdFVuZGVyc3RhbmQgX3dzYV9fQWN0aW9uICAgICB3c2FfX0FjdGlvbiAgICAwOyA8YnIgLz4NCit9Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorV2UgYWxzbyBpbmNsdWRlZCBhIDxpPi8vZ3NvYXAgd3NhIHNjaGVtYSBpbXBvcnQ8L2k+IGRpcmVjdGl2ZSBpbiB0aGUgPGk+d3NhLmg8L2k+IGZpbGUgdG8gZW5hYmxlIHRoZSBnZW5lcmF0aW9uIG9mIFdTREwNCitzcGVjaWZpY2F0aW9ucyB0aGF0IGltcG9ydCAoaW5zdGVhZCBvZiBpbmNsdWRlcykgdGhlIFdTLUFkZHJlc3NpbmcgZWxlbWVudHMuDQorTm90ZSB0aGF0IHRoZSA8aT4vL2dzb2Fwb3B0IHc8L2k+IGRpcmVjdGl2ZSBtdXN0IG5vdCBiZSBwcmVzZW50IGluIHlvdXIgaGVhZGVyIGZpbGUgdG8gZW5hYmxlIFdTREwgZ2VuZXJhdGlvbi4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorT25lLXdheSBTT0FQLW92ZXItVURQIG1lc3NhZ2VzIChzZWUgU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6b25ld2F5MSI+Ny4zPC9hPikgc2hvdWxkIGJlDQorZGVjbGFyZWQgdG8gaW5jbHVkZSB0aGUgPGk+d3NhOk1lc3NhZ2VJRDwvaT4sIDxpPndzYTpUbzwvaT4sIGFuZCA8aT53c2E6QWN0aW9uPC9pPg0KK2VsZW1lbnRzIGluIHRoZSBTT0FQIEhlYWRlciBvZiB0aGUgcmVxdWVzdCBtZXNzYWdlIGFzIGZvbGxvd3M6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vZ3NvYXAgbnMgc2VydmljZSBtZXRob2QtaGVhZGVyLXBhcnQ6ICAgICAgICAgIHNlbmRTdHJpbmcgd3NhX19NZXNzYWdlSUQgPGJyIC8+DQorLy9nc29hcCBucyBzZXJ2aWNlIG1ldGhvZC1oZWFkZXItcGFydDogICAgICAgICAgc2VuZFN0cmluZyB3c2FfX1RvIDxiciAvPg0KKy8vZ3NvYXAgbnMgc2VydmljZSBtZXRob2QtaGVhZGVyLXBhcnQ6ICAgICAgICAgIHNlbmRTdHJpbmcgd3NhX19BY3Rpb24gPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO25zX19zZW5kU3RyaW5nKDxiPmNoYXI8L2I+Jm5ic3A7KnN0ciwgPGI+dm9pZDwvYj4pOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorUmVxdWVzdC1yZXNwb25zZSBTT0FQLW92ZXItVURQIG1lc3NhZ2VzIHNob3VsZCBiZSBkZWNsYXJlZCB0byBpbmNsdWRlIHRoZQ0KKzxpPndzYTpNZXNzYWdlSUQ8L2k+LCA8aT53c2E6VG88L2k+LCA8aT53c2E6QWN0aW9uPC9pPiwgYW5kIDxpPndzYTpSZXBseVRvPC9pPg0KK2VsZW1lbnRzIGluIHRoZSBTT0FQIEhlYWRlciBvZiB0aGUgcmVxdWVzdCBtZXNzYWdlLCBhbmQgdGhlIHRoZQ0KKzxpPndzYTpNZXNzYWdlSUQ8L2k+LCA8aT53c2E6VG88L2k+LCA8aT53c2E6QWN0aW9uPC9pPiwgYW5kIDxpPndzYTpSZWxhdGVzVG88L2k+DQorZWxlbWVudHMgaW4gdGhlIFNPQVAgSGVhZGVyIG9mIHRoZSByZXNwb25zZSBtZXNzYWdlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisvL2dzb2FwIG5zIHNlcnZpY2UgbWV0aG9kLWhlYWRlci1wYXJ0OiAgICAgICAgICBlY2hvU3RyaW5nIHdzYV9fTWVzc2FnZUlEIDxiciAvPg0KKy8vZ3NvYXAgbnMgc2VydmljZSBtZXRob2QtaGVhZGVyLXBhcnQ6ICAgICAgICAgIGVjaG9TdHJpbmcgd3NhX19UbyA8YnIgLz4NCisvL2dzb2FwIG5zIHNlcnZpY2UgbWV0aG9kLWhlYWRlci1wYXJ0OiAgICAgICAgICBlY2hvU3RyaW5nIHdzYV9fQWN0aW9uIDxiciAvPg0KKy8vZ3NvYXAgbnMgc2VydmljZSBtZXRob2QtaW5wdXQtaGVhZGVyLXBhcnQ6ICAgIHNlbmRTdHJpbmcgd3NhX19SZXBseVRvIDxiciAvPg0KKy8vZ3NvYXAgbnMgc2VydmljZSBtZXRob2Qtb3V0cHV0LWhlYWRlci1wYXJ0OiAgIGVjaG9TdHJpbmcgd3NhX19SZWxhdGVzVG8gPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO25zX19lY2hvU3RyaW5nKDxiPmNoYXI8L2I+Jm5ic3A7KnN0ciwgPGI+Y2hhcjwvYj4mbmJzcDsqKnJlcyk7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitGb3IgdGhlIGNvbnRlbnQgcmVxdWlyZW1lbnRzIG9mIHRoZXNlIGVsZW1lbnRzLCBwbGVhc2UgY29uc3VsdCB0aGUNCitTT0FQLW92ZXItVURQIHNwZWNpZmljYXRpb24gYW5kL29yIHJlYWQgdGhlIG5leHQgc2VjdGlvbnMgZXhwbGFpbmluZw0KK1NPQVAtb3Zlci1VRFAgdW5pY2FzdCwgbXVsdGljYXN0LCBvbmUtd2F5LCBhbmQgcmVxdWVzdC1yZXNwb25zZSBjbGllbnQgYW5kDQorc2VydmVyIGFwcGxpY2F0aW9ucy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCSAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWMxNy4yIj4NCisxNy4yPC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5DbGllbnQtc2lkZSBPbmUtd2F5IFVuaWNhc3Q8L2ZvbnQ+PC9oMz4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhpcyBleGFtcGxlIGFzc3VtZXMgdGhhdCB0aGUgZ1NPQVAgaGVhZGVyIGZpbGUgaW5jbHVkZXMgdGhlIFNPQVAgSGVhZGVyIHdpdGgNCitXUy1BZGRyZXNzaW5nIGVsZW1lbnRzIGFuZCB0aGUgPGk+bnNfX3NlbmRTdHJpbmc8L2k+IGZ1bmN0aW9uIGRpc2N1c3NlZCBpbg0KK1NlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOnVkcC5oIj4xNy4xPC9hPg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCBzb2FwOyA8YnIgLz4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7U09BUF9FTlZfX0hlYWRlciBoZWFkZXI7IC8vIHRoZSBTT0FQIEhlYWRlciA8YnIgLz4NCitzb2FwX2luaXQoJmFtcDtzb2FwKTsgPGJyIC8+DQorc29hcC5zZW5kX3RpbWVvdXQgPSAxOyAvLyAxcyB0aW1lb3V0IDxiciAvPg0KK3NvYXBfZGVmYXVsdF9TT0FQX0VOVl9fSGVhZGVyKCZhbXA7c29hcCwgJmFtcDtoZWFkZXIpOyAvLyBpbml0IFNPQVAgSGVhZGVyIDxiciAvPg0KK2hlYWRlci53c2FfX01lc3NhZ2VJRCA9ICI8aT5tZXNzYWdlIElEPC9pPiI7IDxiciAvPg0KK2hlYWRlci53c2FfX1RvID0gIjxpPnNlcnZlciBVUkw8L2k+IjsgPGJyIC8+DQoraGVhZGVyLndzYV9fQWN0aW9uID0gIjxpPnNlcnZlciBhY3Rpb248L2k+IjsgPGJyIC8+DQorc29hcC5oZWFkZXIgPSAmYW1wO2hlYWRlcjsgLy8gYmluZCB0aGUgU09BUCBIZWFkZXIgZm9yIHRyYW5zcG9ydCA8YnIgLz4NCisvLyBTZW5kIHRoZSBtZXNzYWdlIG92ZXIgVURQOiA8YnIgLz4NCis8Yj5pZjwvYj4mbmJzcDsoc29hcF9zZW5kX25zX19lY2hvU3RyaW5nKCZhbXA7c29hcCwgInNvYXAudWRwOi8vLi4uIiwgTlVMTCwgImhlbGxvIHdvcmxkISIpKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX3ByaW50X2ZhdWx0KCZhbXA7c29hcCwgc3RkZXJyKTsgLy8gcmVwb3J0IGVycm9yIDxiciAvPg0KK3NvYXBfZW5kKCZhbXA7c29hcCk7IC8vIGNsZWFudXAgPGJyIC8+DQorc29hcF9kZXN0cm95KCZhbXA7c29hcCk7IC8vIGNsZWFudXAgPGJyIC8+DQorc29hcF9kb25lKCZhbXA7c29hcCk7IC8vIGNsb3NlIGNvbm5lY3Rpb24gKHNob3VsZCBub3QgdXNlIHNvYXAgc3RydWN0IGFmdGVyIHRoaXMpDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCSAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWMxNy4zIj4NCisxNy4zPC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5DbGllbnQtc2lkZSBPbmUtd2F5IE11bHRpY2FzdDwvZm9udD48L2gzPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGlzIGV4YW1wbGUgaXMgc2ltaWxhciB0byB0aGUgb25lLXdheSB1bmljYXN0IGV4YW1wbGUgZGlzY3Vzc2VkIGFib3ZlLCBidXQNCit1c2VzIGEgYnJvYWRjYXN0IGFkZHJlc3MgYW5kIHRoZSA8aT5TT19CUk9BRENBU1Q8L2k+IHNvY2tldCBvcHRpb246DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwIHNvYXA7IDxiciAvPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtTT0FQX0VOVl9fSGVhZGVyIGhlYWRlcjsgLy8gdGhlIFNPQVAgSGVhZGVyIDxiciAvPg0KK3NvYXBfaW5pdCgmYW1wO3NvYXApOyA8YnIgLz4NCitzb2FwLnNlbmRfdGltZW91dCA9IDE7IC8vIDFzIHRpbWVvdXQgPGJyIC8+DQorc29hcC5jb25uZWN0X2ZsYWdzID0gU09fQlJPQURDQVNUOyAvLyByZXF1aXJlZCBmb3IgYnJvYWRjYXN0IDxiciAvPg0KK3NvYXBfZGVmYXVsdF9TT0FQX0VOVl9fSGVhZGVyKCZhbXA7c29hcCwgJmFtcDtoZWFkZXIpOyAvLyBpbml0IFNPQVAgSGVhZGVyIDxiciAvPg0KK2hlYWRlci53c2FfX01lc3NhZ2VJRCA9ICI8aT5tZXNzYWdlIElEPC9pPiI7IDxiciAvPg0KK2hlYWRlci53c2FfX1RvID0gIjxpPnNlcnZlciBVUkw8L2k+IjsgPGJyIC8+DQoraGVhZGVyLndzYV9fQWN0aW9uID0gIjxpPnNlcnZlciBhY3Rpb248L2k+IjsgPGJyIC8+DQorc29hcC5oZWFkZXIgPSAmYW1wO2hlYWRlcjsgLy8gYmluZCB0aGUgU09BUCBIZWFkZXIgZm9yIHRyYW5zcG9ydCA8YnIgLz4NCisvLyBTZW5kIHRoZSBtZXNzYWdlIG92ZXIgVURQIHRvIGEgYnJvYWRjYXN0IGFkZHJlc3M6IDxiciAvPg0KKzxiPmlmPC9iPiZuYnNwOyhzb2FwX3NlbmRfbnNfX2VjaG9TdHJpbmcoJmFtcDtzb2FwLCAic29hcC51ZHA6Ly8uLi4iLCBOVUxMLCAiaGVsbG8gd29ybGQhIikpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfcHJpbnRfZmF1bHQoJmFtcDtzb2FwLCBzdGRlcnIpOyAvLyByZXBvcnQgZXJyb3IgPGJyIC8+DQorc29hcF9lbmQoJmFtcDtzb2FwKTsgLy8gY2xlYW51cCA8YnIgLz4NCitzb2FwX2Rlc3Ryb3koJmFtcDtzb2FwKTsgLy8gY2xlYW51cCA8YnIgLz4NCitzb2FwX2RvbmUoJmFtcDtzb2FwKTsgLy8gY2xvc2UgY29ubmVjdGlvbiAoc2hvdWxkIG5vdCB1c2Ugc29hcCBzdHJ1Y3QgYWZ0ZXIgdGhpcykNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJICAgICA8aDM+PGEgbmFtZT0idHRoX3NFYzE3LjQiPg0KKzE3LjQ8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPkNsaWVudC1zaWRlIFJlcXVlc3QtUmVzcG9uc2UgVW5pY2FzdDwvZm9udD48L2gzPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGlzIGV4YW1wbGUgYXNzdW1lcyB0aGF0IHRoZSBnU09BUCBoZWFkZXIgZmlsZSBpbmNsdWRlcyB0aGUgU09BUCBIZWFkZXIgd2l0aA0KK1dTLUFkZHJlc3NpbmcgZWxlbWVudHMgYW5kIHRoZSA8aT5uc19fZWNob1N0cmluZzwvaT4gZnVuY3Rpb24gZGlzY3Vzc2VkIGluDQorU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6dWRwLmgiPjE3LjE8L2E+DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwIHNvYXA7IDxiciAvPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtTT0FQX0VOVl9fSGVhZGVyIGhlYWRlcjsgLy8gdGhlIFNPQVAgSGVhZGVyIDxiciAvPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDt3c2FfX0VuZHBvaW50UmVmZXJlbmNlVHlwZSByZXBseVRvOyAvLyAoYW5vbnltb3VzKSByZXBseSBhZGRyZXNzIDxiciAvPg0KKzxiPmNoYXI8L2I+Jm5ic3A7KnJlczsgLy8gc2VydmVyIHJlc3BvbnNlIDxiciAvPg0KK3NvYXBfaW5pdCgmYW1wO3NvYXApOyA8YnIgLz4NCitzb2FwLnNlbmRfdGltZW91dCA9IDE7IC8vIDFzIHRpbWVvdXQgPGJyIC8+DQorc29hcC5yZWN2X3RpbWVvdXQgPSAxOyAvLyAxcyB0aW1lb3V0IDxiciAvPg0KK3NvYXBfZGVmYXVsdF9TT0FQX0VOVl9fSGVhZGVyKCZhbXA7c29hcCwgJmFtcDtoZWFkZXIpOyAvLyBpbml0IFNPQVAgSGVhZGVyIDxiciAvPg0KK3NvYXBfZGVmYXVsdF93c2FfX0VuZHBvaW50UmVmZXJlbmNlVHlwZSgmYW1wO3NvYXAsICZhbXA7cmVwbHlUbyk7IC8vIGluaXQgcmVwbHkgYWRkcmVzcyA8YnIgLz4NCityZXBseVRvLkFkZHJlc3MgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nL3JvbGUvYW5vbnltb3VzIjsgPGJyIC8+DQoraGVhZGVyLndzYV9fTWVzc2FnZUlEID0gIjxpPm1lc3NhZ2UgSUQ8L2k+IjsgPGJyIC8+DQoraGVhZGVyLndzYV9fVG8gPSAiPGk+c2VydmVyIFVSTDwvaT4iOyA8YnIgLz4NCitoZWFkZXIud3NhX19BY3Rpb24gPSAiPGk+c2VydmVyIGFjdGlvbjwvaT4iOyA8YnIgLz4NCitoZWFkZXIud3NhX19SZXBseVRvID0gJmFtcDtyZXBseVRvOyA8YnIgLz4NCitzb2FwLmhlYWRlciA9ICZhbXA7aGVhZGVyOyAvLyBiaW5kIHRoZSBTT0FQIEhlYWRlciBmb3IgdHJhbnNwb3J0IDxiciAvPg0KKy8vIFNlbmQgYW5kIHJlY2VpdmUgbWVzc2FnZXMgb3ZlciBVRFA6IDxiciAvPg0KKzxiPmlmPC9iPiZuYnNwOyhzb2FwX2NhbGxfbnNfX2VjaG9TdHJpbmcoJmFtcDtzb2FwLCAic29hcC51ZHA6Ly8uLi4iLCBOVUxMLCAiaGVsbG8gd29ybGQhIiwgJmFtcDtyZXMpKSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyhzb2FwLmVycm9yID09IFNPQVBfRU9GICZhbXA7JmFtcDsgc29hcC5lcnJudW0gPT0gMCkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ly8gVGltZW91dDogbm8gcmVzcG9uc2UgZnJvbSBzZXJ2ZXIgKG1lc3NhZ2UgYWxyZWFkeSBkZWxpdmVyZWQ/KSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5lbHNlPC9iPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfcHJpbnRfZmF1bHQoJmFtcDtzb2FwLCBzdGRlcnIpOyA8YnIgLz4NCit9IDxiciAvPg0KKzxiPmVsc2U8L2I+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Ly8gVURQIHNlcnZlciByZXNwb25zZSBpcyBzdG9yZWQgaW4gJ3JlcycgPGJyIC8+DQorLy8gY2hlY2sgU09BUCBoZWFkZXIgcmVjZWl2ZWQsIGlmIGFwcGxpY2FibGUgPGJyIC8+DQorY2hlY2tfaGVhZGVyKCZhbXA7c29hcC5oZWFkZXIpOyA8YnIgLz4NCitzb2FwX2VuZCgmYW1wO3NvYXApOyAvLyBjbGVhbnVwIDxiciAvPg0KK3NvYXBfZGVzdHJveSgmYW1wO3NvYXApOyAvLyBjbGVhbnVwIDxiciAvPg0KK3NvYXBfZG9uZSgmYW1wO3NvYXApOyAvLyBjbG9zZSBjb25uZWN0aW9uIChzaG91bGQgbm90IHVzZSBzb2FwIHN0cnVjdCBhZnRlciB0aGlzKQ0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkgICAgIDxoMz48YSBuYW1lPSJ0dGhfc0VjMTcuNSI+DQorMTcuNTwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+Q2xpZW50LXNpZGUgUmVxdWVzdC1SZXNwb25zZSBNdWx0aWNhc3Q8L2ZvbnQ+PC9oMz4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhpcyBleGFtcGxlIGlzIHNpbWlsYXIgdG8gdGhlIHJlcXVlc3QtcmVzcG9uc2UgdW5pY2FzdCBleGFtcGxlIGRpc2N1c3NlZA0KK2Fib3ZlLCBidXQgdXNlcyBhIGJyb2FkY2FzdCBhZGRyZXNzIGFuZCB0aGUgPGk+U09fQlJPQURDQVNUPC9pPiBzb2NrZXQgb3B0aW9uLg0KK0JlY2F1c2Ugd2UgZXhwZWN0IHRvIHJlY2VpdmUgbXVsdGlwbGUgcmVzcG9uc2VzLCB3ZSBhbHNvIG5lZWQgdG8gdXNlIHNlcGFyYXRlDQorcmVxdWVzdC1yZXNwb25zZSBtZXNzYWdlcyB0byBzZW5kIG9uZSByZXF1ZXN0IGFuZCBjb25zdW1lIG11bHRpcGxlIHJlc3BvbnNlcy4NCitJbiB0aGlzIGV4YW1wbGUgd2UgZGVmaW5lZCBhIDxpPmJjYXN0U3RyaW5nPC9pPiByZXF1ZXN0IGFuZCBhDQorPGk+YmNhc3RTdHJpbmdSZXNwb25zZTwvaT4gcmVzcG9uc2UgbWVzc2FnZSwgd2hpY2ggYXJlIGVzc2VudGlhbGx5IGRlY2xhcmVkIGFzDQorb25lLXdheSBtZXNzYWdlcyBpbiB0aGUgaGVhZGVyIGZpbGU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vZ3NvYXAgbnMgc2VydmljZSBtZXRob2QtaGVhZGVyLXBhcnQ6ICAgICAgICAgIGJjYXN0U3RyaW5nIHdzYV9fTWVzc2FnZUlEIDxiciAvPg0KKy8vZ3NvYXAgbnMgc2VydmljZSBtZXRob2QtaGVhZGVyLXBhcnQ6ICAgICAgICAgIGJjYXN0U3RyaW5nIHdzYV9fVG8gPGJyIC8+DQorLy9nc29hcCBucyBzZXJ2aWNlIG1ldGhvZC1oZWFkZXItcGFydDogICAgICAgICAgYmNhc3RTdHJpbmcgd3NhX19BY3Rpb24gPGJyIC8+DQorLy9nc29hcCBucyBzZXJ2aWNlIG1ldGhvZC1oZWFkZXItcGFydDogICAgICAgICAgYmNhc3RTdHJpbmcgd3NhX19SZXBseVRvIDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDtuc19fYmNhc3RTdHJpbmcoPGI+Y2hhcjwvYj4mbmJzcDsqc3RyLCA8Yj52b2lkPC9iPik7IDxiciAvPg0KKy8vZ3NvYXAgbnMgc2VydmljZSBtZXRob2QtaGVhZGVyLXBhcnQ6ICAgICAgICAgIGJjYXN0U3RyaW5nUmVzcG9uc2Ugd3NhX19NZXNzYWdlSUQgPGJyIC8+DQorLy9nc29hcCBucyBzZXJ2aWNlIG1ldGhvZC1oZWFkZXItcGFydDogICAgICAgICAgYmNhc3RTdHJpbmdSZXNwb25zZSB3c2FfX1RvIDxiciAvPg0KKy8vZ3NvYXAgbnMgc2VydmljZSBtZXRob2QtaGVhZGVyLXBhcnQ6ICAgICAgICAgIGJjYXN0U3RyaW5nUmVzcG9uc2Ugd3NhX19BY3Rpb24gPGJyIC8+DQorLy9nc29hcCBucyBzZXJ2aWNlIG1ldGhvZC1oZWFkZXItcGFydDogICAgICAgICAgYmNhc3RTdHJpbmdSZXNwb25zZSB3c2FfX1JlbGF0ZXNUbyA8YnIgLz4NCis8Yj5pbnQ8L2I+Jm5ic3A7bnNfX2JjYXN0U3RyaW5nUmVzcG9uc2UoPGI+Y2hhcjwvYj4mbmJzcDsqcmVzLCA8Yj52b2lkPC9iPik7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgY2xpZW5kIGNvZGUgaW5jbHVkZXMgYSBsb29wIHRvIHJlY2VpdmUgcmVzcG9uc2UgbWVzc2FnZXMgdW50aWwgYSB0aW1lb3V0IG9jY3VyczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgc29hcDsgPGJyIC8+DQorPGI+c3RydWN0PC9iPiZuYnNwO1NPQVBfRU5WX19IZWFkZXIgaGVhZGVyOyA8YnIgLz4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7d3NhX19FbmRwb2ludFJlZmVyZW5jZVR5cGUgcmVwbHlUbzsgPGJyIC8+DQorPGI+Y2hhcjwvYj4mbmJzcDsqcmVzOyA8YnIgLz4NCitzb2FwX2luaXQoJmFtcDtzb2FwKTsgPGJyIC8+DQorc29hcC5jb25uZWN0X2ZsYWdzID0gU09fQlJPQURDQVNUOyA8YnIgLz4NCitzb2FwLnNlbmRfdGltZW91dCA9IDE7IC8vIDFzIHRpbWVvdXQgPGJyIC8+DQorc29hcC5yZWN2X3RpbWVvdXQgPSAxOyAvLyAxcyB0aW1lb3V0IDxiciAvPg0KK3NvYXBfZGVmYXVsdF9TT0FQX0VOVl9fSGVhZGVyKCZhbXA7c29hcCwgJmFtcDtoZWFkZXIpOyA8YnIgLz4NCitzb2FwLmhlYWRlciA9ICZhbXA7aGVhZGVyOyA8YnIgLz4NCitzb2FwX2RlZmF1bHRfd3NhX19FbmRwb2ludFJlZmVyZW5jZVR5cGUoJmFtcDtzb2FwLCAmYW1wO3JlcGx5VG8pOyA8YnIgLz4NCityZXBseVRvLkFkZHJlc3MgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nL3JvbGUvYW5vbnltb3VzIjsgPGJyIC8+DQoraGVhZGVyLndzYV9fTWVzc2FnZUlEID0gIjxpPm1lc3NhZ2UgSUQ8L2k+IjsgPGJyIC8+DQoraGVhZGVyLndzYV9fVG8gPSAiPGk+c2VydmVyIFVSTDwvaT4iOyA8YnIgLz4NCitoZWFkZXIud3NhX19BY3Rpb24gPSAiPGk+c2VydmVyIGFjdGlvbjwvaT4iOyA8YnIgLz4NCitoZWFkZXIud3NhX19SZXBseVRvID0gJmFtcDtyZXBseVRvOyA8YnIgLz4NCis8Yj5pZjwvYj4mbmJzcDsoc29hcF9zZW5kX25zX19iY2FzdFN0cmluZygmYW1wO3NvYXAsICJzb2FwLnVkcDovLy4uLiIsIE5VTEwsICJoZWxsbyB3b3JsZCEiKSkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9wcmludF9mYXVsdCgmYW1wO3NvYXAsIHN0ZGVycik7IDxiciAvPg0KKzxiPmVsc2U8L2I+PGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5mb3I8L2I+Jm5ic3A7KDs7KSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyhzb2FwX3JlY3ZfbnNfX2JjYXN0U3RyaW5nUmVzcG9uc2UoJmFtcDtzb2FwLCAmYW1wO3JlcykpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPmJyZWFrPC9iPjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ly8gR290IHJlc3BvbnNlICdyZXMnIGZyb20gYSBzZXJ2ZXIgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoc29hcC5lcnJvciA9PSBTT0FQX0VPRiAmYW1wOyZhbXA7IHNvYXAuZXJybnVtID09IDApIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOy8vIFRpbWVvdXQ6IG5vIG1vcmUgbWVzc2FnZXMgcmVjZWl2ZWQgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+ZWxzZTwvYj48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwX3ByaW50X2ZhdWx0KCZhbXA7c29hcCwgc3RkZXJyKTsgPGJyIC8+DQorfSA8YnIgLz4NCitzb2FwX2VuZCgmYW1wO3NvYXApOyAvLyBjbGVhbnVwIDxiciAvPg0KK3NvYXBfZGVzdHJveSgmYW1wO3NvYXApOyAvLyBjbGVhbnVwIDxiciAvPg0KK3NvYXBfZG9uZSgmYW1wO3NvYXApOyAvLyBjbG9zZSBjb25uZWN0aW9uIChzaG91bGQgbm90IHVzZSBzb2FwIHN0cnVjdCBhZnRlciB0aGlzKQ0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorTm90ZSB0aGF0IGEgc2VydmVyIGZvciB0aGUgPGk+YmNhc3RTdHJpbmc8L2k+IGRvZXMgbm90IG5lZWQgdG8gdXNlIHR3by1vbmUgd2F5DQorbWVzc2FnZXMuICBUaHVzLCBtdWx0aWNhc3QgcmVxdWVzdC1yZXNwb25zZSBtZXNzYWdlIHBhdHRlcm4gY2FuIGJlIGRlY2xhcmVkIGFuZA0KK2ltcGxlbWVudGVkIGFzIHJlcXVlc3QtcmVzcG9uc2Ugb3BlcmF0aW9ucyBhdCB0aGUgc2VydmVyIHNpZGUuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkgICAgIDxoMz48YSBuYW1lPSJ0dGhfc0VjMTcuNiI+DQorMTcuNjwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+U09BUC1vdmVyLVVEUCBTZXJ2ZXI8L2ZvbnQ+PC9oMz4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIGZvbGxvd2luZyBleGFtcGxlIGNvZGUgaWxsdXN0cmF0ZXMgYSBTT0FQLW92ZXItVURQIHNlcnZlciBmb3Igb25lLXdheSA8aT5zZW5kU3RyaW5nPC9pPiBhbmQgcmVxdWVzdC1yZXNwb25zZSA8aT5lY2hvU3RyaW5nPC9pPiBtZXNzYWdlcy4NCitUaGlzIGV4YW1wbGUgYXNzdW1lcyB0aGF0IHRoZSBnU09BUCBoZWFkZXIgZmlsZSBpbmNsdWRlcyB0aGUgU09BUCBIZWFkZXIgd2l0aA0KK1dTLUFkZHJlc3NpbmcgZWxlbWVudHMgYW5kIHRoZSA8aT5uc19fZWNob1N0cmluZzwvaT4gZnVuY3Rpb24gZGlzY3Vzc2VkIGluDQorU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6dWRwLmgiPjE3LjE8L2E+Lg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCittYWluKCkgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCBzb2FwOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2luaXQxKCZhbXA7c29hcCwgU09BUF9JT19VRFApOyAvLyBtdXN0IHNldCBVRFAgZmxhZyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsvLyBiaW5kIHRvIGhvc3QgKE5VTEw9Y3VycmVudCBob3N0KSBhbmQgcG9ydDogPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KCFzb2FwX3ZhbGlkX3NvY2tldChzb2FwX2JpbmQoJmFtcDtzb2FwLCBob3N0LCBwb3J0LCAxMDApKSkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwX3ByaW50X2ZhdWx0KCZhbXA7c29hcCwgc3RkZXJyKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZXhpdCgxKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5mb3I8L2I+Jm5ic3A7KDs7KSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyhzb2FwX3NlcnZlKCZhbXA7c29hcCkpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfcHJpbnRfZmF1bHQoJmFtcDtzb2FwLCBzdGRlcnIpOyAvLyByZXBvcnQgdGhlIHByb2JsZW0gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9kZXN0cm95KCZhbXA7c29hcCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfZW5kKCZhbXA7c29hcCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO30gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9kb25lKCZhbXA7c29hcCk7IC8vIGNsb3NlIGNvbm5lY3Rpb24gPGJyIC8+DQorfSA8YnIgLz4NCis8Yj5pbnQ8L2I+Jm5ic3A7bnNfX2VjaG9TdHJpbmcoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIDxiPmNoYXI8L2I+Jm5ic3A7KnN0ciwgPGI+Y2hhcjwvYj4mbmJzcDsqKnJlcykgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoIXNvYXA8dHQ+LSZndDs8L3R0PmhlYWRlcikgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cmV0dXJuPC9iPiZuYnNwO3NvYXBfc2VuZGVyX2ZhdWx0KHNvYXAsICJObyBTT0FQIGhlYWRlciIsIE5VTEwpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoIXNvYXA8dHQ+LSZndDs8L3R0PmhlYWRlcjx0dD4tJmd0OzwvdHQ+d3NhX19NZXNzYWdlSUQpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDtzb2FwX3NlbmRlcl9mYXVsdChzb2FwLCAiTm8gV1MtQWRkcmVzc2luZyBNZXNzYWdlSUQiLCBOVUxMKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcDx0dD4tJmd0OzwvdHQ+aGVhZGVyPHR0Pi0mZ3Q7PC90dD53c2FfX1JlbGF0ZXNUbyA9ICg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7d3NhX19SZWxhdGlvbnNoaXAqKXNvYXBfbWFsbG9jKHNvYXAsIDxiPnNpemVvZjwvYj4oPGI+c3RydWN0PC9iPiZuYnNwO3dzYV9fUmVsYXRpb25zaGlwKSk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfZGVmYXVsdF93c2FfX1JlbGF0aW9uc2hpcChzb2FwLCBzb2FwPHR0Pi0mZ3Q7PC90dD5oZWFkZXI8dHQ+LSZndDs8L3R0PndzYV9fUmVsYXRlc1RvKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcDx0dD4tJmd0OzwvdHQ+aGVhZGVyPHR0Pi0mZ3Q7PC90dD53c2FfX1JlbGF0ZXNUbzx0dD4tJmd0OzwvdHQ+X19pdGVtID0gc29hcDx0dD4tJmd0OzwvdHQ+aGVhZGVyPHR0Pi0mZ3Q7PC90dD53c2FfX01lc3NhZ2VJRDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Ly8gbXVzdCBjaGVjayBmb3IgZHVwbGljYXRlIG1lc3NhZ2VzIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyhjaGVja19yZWNlaXZlZChzb2FwPHR0Pi0mZ3Q7PC90dD5oZWFkZXI8dHQ+LSZndDs8L3R0PndzYV9fTWVzc2FnZUlEKSkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsvLyBSZXF1ZXN0IG1lc3NhZ2UgYWxyZWFkeSByZWNlaXZlZCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7U09BUF9TVE9QOyAvLyBkb24ndCByZXR1cm4gcmVzcG9uc2UgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoIXNvYXA8dHQ+LSZndDs8L3R0PmhlYWRlcjx0dD4tJmd0OzwvdHQ+d3NhX19SZXBseVRvIDxmb250IGZhY2U9InN5bWJvbCI+fDwvZm9udA0KKz48Zm9udCBmYWNlPSJzeW1ib2wiPnw8L2ZvbnQNCis+ICFzb2FwPHR0Pi0mZ3Q7PC90dD5oZWFkZXI8dHQ+LSZndDs8L3R0PndzYV9fUmVwbHlUbzx0dD4tJmd0OzwvdHQ+QWRkcmVzcykgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cmV0dXJuPC9iPiZuYnNwO3NvYXBfc2VuZGVyX2ZhdWx0KHNvYXAsICJObyBXUy1BZGRyZXNzaW5nIFJlcGx5VG8gYWRkcmVzcyIsIE5VTEwpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwPHR0Pi0mZ3Q7PC90dD5oZWFkZXI8dHQ+LSZndDs8L3R0PndzYV9fVG8gPSBzb2FwPHR0Pi0mZ3Q7PC90dD5oZWFkZXI8dHQ+LSZndDs8L3R0PndzYV9fUmVwbHlUbzx0dD4tJmd0OzwvdHQ+QWRkcmVzczsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcDx0dD4tJmd0OzwvdHQ+aGVhZGVyPHR0Pi0mZ3Q7PC90dD53c2FfX01lc3NhZ2VJRCA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXBfaW50MnMoc29hcCwgaWRfY291bnQrKykpIDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcDx0dD4tJmd0OzwvdHQ+aGVhZGVyPHR0Pi0mZ3Q7PC90dD53c2FfX0FjdGlvbiA9ICJodHRwOi8vZ2VuaXZpYS5jb20vdWRwL2VjaG9TdHJpbmdSZXNwb25zZSI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOypyZXMgPSBzdHI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDtTT0FQX09LOyA8YnIgLz4NCit9IDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDtuc19fc2VuZFN0cmluZyg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgPGI+Y2hhcjwvYj4mbmJzcDsqc3RyKSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyghc29hcDx0dD4tJmd0OzwvdHQ+aGVhZGVyKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7U09BUF9TVE9QOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoIXNvYXA8dHQ+LSZndDs8L3R0PmhlYWRlcjx0dD4tJmd0OzwvdHQ+d3NhX19NZXNzYWdlSUQpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDtTT0FQX1NUT1A7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOy8vIG11c3QgY2hlY2sgZm9yIGR1cGxpY2F0ZSBtZXNzYWdlcyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoY2hlY2tfcmVjZWl2ZWQoc29hcDx0dD4tJmd0OzwvdHQ+aGVhZGVyPHR0Pi0mZ3Q7PC90dD53c2FfX01lc3NhZ2VJRCkpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDtTT0FQX1NUT1A7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDtTT0FQX09LOyA8YnIgLz4NCit9IDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDtuc19fc2VuZFN0cmluZ1Jlc3BvbnNlKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj5jaGFyPC9iPiZuYnNwOypyZXMpIDxiciAvPg0KK3sgPGI+cmV0dXJuPC9iPiZuYnNwO1NPQVBfTk9fTUVUSE9EOyB9IC8vIHdlIGRvbid0IGV4cGVjdCB0byBzZXJ2ZSB0aGlzIG1lc3NhZ2UNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoZSBzZXJ2ZXIgYmluZHMgdG8gYSBob3N0IGFuZCBwb3J0IGFuZCBhY2NlcHRzIG1lc3NhZ2VzIGluIGEgdGlnaHQgc2VxdWVudGlhbA0KK2xvb3AuICBCZWNhdXNlIFVEUCBkb2VzIG5vdCBoYXZlIHRoZSBlcXVpdmFsZW50IG9mIGFuIGFjY2VwdCB0aGUgbWVzc2FnZXMNCitjYW5ub3QgYmUgZGlzcGF0Y2hlZCB0byB0aHJlYWRzLCB0aGUgPGk+c29hcF9zZXJ2ZTwvaT4gd2FpdHMgZm9yIGEgbWVzc2FnZSBhbmQNCitpbW1lZGlhdGVseSBhY2NlcHRzIGl0LiBZb3UgY2FuIHVzZSBhIHJlY2VpdmUgdGltZW91dCB0byBtYWtlIDxpPnNvYXBfc2VydmU8L2k+DQorbm9uLWJsb2NraW5nLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisgPGgyPjxhIG5hbWU9InR0aF9zRWMxOCI+DQorMTg8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPkFkdmFuY2VkIEZlYXR1cmVzPC9mb250PjwvaDI+PGEgbmFtZT0ic2VjOmFkdmFuY2VkIj4NCis8L2E+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkJICAgICA8aDM+PGEgbmFtZT0idHRoX3NFYzE4LjEiPg0KKzE4LjE8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPkludGVybmF0aW9uYWxpemF0aW9uPC9mb250PjwvaDM+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK2dTT0FQIHVzZXMgcmVndWxhciBzdHJpbmdzIGJ5IGRlZmF1bHQuICBSZWd1bGFyIHN0cmluZ3MgY2Fubm90IGJlIHVzZWQgdG8gaG9sZA0KK1VDUyBjaGFyYWN0ZXJzIG91dHNpZGUgb2YgdGhlIGNoYXJhY3RlciByYW5nZSBbMSwyNTVdLiAgZ1NPQVAgY2FuIGhhbmRsZQ0KK3dpZGUtY2hhcmFjdGVyIGNvbnRlbnQgaW4gdHdvIHdheXMuIEZpcnN0LCBhcHBsaWNhdGlvbnMgY2FuIHV0aWxpemUNCit3aWRlLWNoYXJhY3RlciBzdHJpbmdzICg8aT53Y2hhcl90KjwvaT4pIGluc3RlYWQgb2YgcmVndWxhciBzdHJpbmdzIHRvIHN0b3JlDQord2lkZS1jaGFyYWN0ZXIgY29udGVudC4gIEZvciBleGFtcGxlLCB0aGUgPHR0PnhzZDpzdHJpbmc8L3R0PiBzdHJpbmcgc2NoZW1hIHR5cGUNCitjYW4gYmUgZGVjbGFyZWQgYXMgYSB3aWRlLWNoYXJhY3RlciBzdHJpbmcgYW5kIHVzZWQgc3Vic2VxdWVudGx5Og0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj50eXBlZGVmPC9iPiZuYnNwO3djaGFyX3QgKnhzZF9fc3RyaW5nOyA8YnIgLz4NCisuLi4gPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO25zX19teU1ldGhvZCh4c2RfX3N0cmluZyBpbnB1dCwgeHNkX19zdHJpbmcgKm91dHB1dCk7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitTZWNvbmQsIHJlZ3VsYXIgc3RyaW5ncyBjYW4gYmUgdXNlZCB0byBob2xkIHdpZGUtY2hhcmFjdGVyIGNvbnRlbnQgaW4gVVRGLTgNCitmb3JtYXQuICBUaGlzIGlzIGFjY29tcGxpc2hlZCB3aXRoIHRoZSA8aT5TT0FQX0NfVVRGU1RSSU5HPC9pPiBmbGFnIChmb3IgYm90aCBpbnB1dC9vdXRwdXQgbW9kZSksIHNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzpmbGFncyI+OC4xMjwvYT4uDQorV2l0aCB0aGlzIGZsYWcgc2V0LCBnU09BUCB3aWxsIGRlc2VyaWFsaXplIFhNTCBpbnRvDQorcmVndWxhciBzdHJpbmdzIGluIFVURi04IGZvcm1hdC4gIEFuIGFwcGxpY2F0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmaWxsaW5nDQorcmVndWxhciBzdHJpbmdzIHdpdGggVVRGLTggY29udGVudCB0byBlbnN1cmUgdGhhdCBzdHJpbmdzIGNhbiBiZSBjb3JyZWN0bHkgc2VyaWFsaXplZCBYTUwuDQorVGhpcmQsIHRoZSA8aT5TT0FQX0NfTUJTVFJJTkc8L2k+IGZsYWcgKGZvciBib3RoIGlucHV0L291dHB1dCBtb2RlKSBjYW4gYmUgdXNlZCB0byBhY3RpdmF0ZSBtdWx0aWJ5dGUgY2hhcmFjdGVyIHN1cHBvcnQuIE11bHRpYnl0ZSBzdXBwb3J0IGRlcGVuZHMgb24gdGhlIGxvY2FsZSBzZXR0aW5ncyBmb3IgZGVhbGluZyB3aXRoIGV4dGVuZGVkIG5hdHVyYWwgbGFuZ3VhZ2UgZW5jb2RpbmdzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitCb3RoIHJlZ3VsYXIgc3RyaW5ncyBhbmQgd2lkZS1jaGFyYWN0ZXIgc3RyaW5ncyBjYW4gYmUgdXNlZCB0b2dldGhlciB3aXRoaW4gYW4gYXBwbGljYXRpb24uDQorRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgaGVhZGVyIGZpbGUgZGVjbGFyYXRpb24gaW50cm9kdWNlcyB0d28gc3RyaW5nIHNjaGVtYSB0eXBlczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDt3Y2hhcl90ICp4c2RfX3N0cmluZzsgPGJyIC8+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyp4c2RfX3N0cmluZ187IC8vIHRyYWlsaW5nICdfJyBhdm9pZHMgbmFtZSBjbGFzaCA8YnIgLz4NCisuLi4gPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO25zX19teU1ldGhvZCh4c2RfX3N0cmluZyBpbnB1dCwgeHNkX19zdHJpbmdfICpvdXRwdXQpOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIDxpPmlucHV0PC9pPiBzdHJpbmcgcGFyYW1ldGVyIGlzIGEgd2lkZS1jaGFyYWN0ZXIgc3RyaW5nIGFuZCB0aGUgPGk+b3V0cHV0PC9pPiBzdHJpbmcNCitwYXJhbWV0ZXIgaXMgYSByZWd1bGFyIHN0cmluZy4gIFRoZSByZWd1bGFyIHN0cmluZyBoYXMgVUNTIGNoYXJhY3RlciBjb250ZW50IA0KK2luIHRoZSByYW5nZSBbMSwyNTVdIHVubGVzcyB0aGUNCis8aT5TT0FQX0NfVVRGU1RSSU5HPC9pPiBmbGFnIGlzIHNldC4gIFdpdGggdGhpcyBmbGFnLCB0aGUgc3RyaW5nIGhhcyBVVEYtOA0KK2VuY29kZWQgY29udGVudC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorUGxlYXNlIGNvbnN1bHQgdGhlIFVURi04IHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIFVURi04IGZvcm1hdC4NCitOb3RlIHRoYXQgdGhlIEFTQ0lJIGNoYXJhY3RlciBzZXQgWzEtMTI3XSBpcyBhIHN1YnNldCBvZiBVVEYtOC4gVGhlcmVmb3JlLCB3aXRoIHRoZSA8aT5TT0FQX0NfVVRGU1RSSU5HPC9pPiBmbGFnIHNldCwgc3RyaW5ncyBtYXkgaG9sZCBBU0NJSSBjaGFyYWN0ZXIgZGF0YSBhbmQgVVRGLTggZXh0ZW5zaW9ucy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCQkgICAgIDxoMz48YSBuYW1lPSJ0dGhfc0VjMTguMiI+DQorMTguMjwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+Q3VzdG9taXppbmcgdGhlIFdTREwgYW5kIE5hbWVzcGFjZSBNYXBwaW5nIFRhYmxlIEZpbGUgQ29udGVudHMgV2l0aCBnU09BUCBEaXJlY3RpdmVzPC9mb250PjwvaDM+PGEgbmFtZT0ic2VjOmRpcmVjdGl2ZXMiPg0KKzwvYT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorQSBoZWFkZXIgZmlsZSBjYW4gYmUgYXVnbWVudGVkIHdpdGggZGlyZWN0aXZlcyBmb3IgdGhlIGdTT0FQIFN0dWIgYW5kIFNrZWxldG9uIGNvbXBpbGVyIHRvIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgY3VzdG9taXplZCBXU0RMIGFuZCBuYW1lc3BhY2UgbWFwcGluZyB0YWJsZXMgY29udGVudHMuIFRoZSBXU0RMIGFuZCBuYW1lc3BhY2UgbWFwcGluZyB0YWJsZSBmaWxlcyBkbyBub3QgbmVlZCB0byBiZSBtb2RpZmllZCBieSBoYW5kIChTZWN0aW9ucyZuYnNwOzxhIGhyZWY9IiNzZWM6d3NkbCI+Ny4yLjg8L2E+IGFuZCZuYnNwOzxhIGhyZWY9IiNzZWM6bnN0YWJsZSI+OS40PC9hPikuDQorSW4gYWRkaXRpb24sIHRoZSBzYW1wbGUgU09BUC9YTUwgcmVxdWVzdCBhbmQgcmVzcG9uc2UgZmlsZXMgZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlciBhcmUgdmFsaWQgcHJvdmlkZWQgdGhhdCBYTUwgU2NoZW1hIG5hbWVzcGFjZQ0KK2luZm9ybWF0aW9uIGlzIGFkZGVkIHRvIHRoZSBoZWFkZXIgZmlsZSB3aXRoIGRpcmVjdGl2ZXMgc28gdGhhdCB0aGUgZ1NPQVAgY29tcGlsZXIgY2FuIHByb2R1Y2UgZXhhbXBsZSBTT0FQL1hNTCBtZXNzYWdlcyB0aGF0IGFyZSBjb3JyZWN0bHkgbmFtZXNwYWNlIHF1YWxpZmllZC4NCitUaGVzZSBjb21waWxlciBkaXJlY3RpdmUgYXJlIHNwZWNpZmllZCBhcyA8aT4vLzwvaT4tY29tbWVudHMuDQorKE5vdGU6IGJsYW5rcyBjYW4gYmUgdXNlZCBhbnl3aGVyZSBpbiB0aGUgZGlyZWN0aXZlLCBleGNlcHQgYmV0d2VlbiA8aT4vLzwvaT4gYW5kIDxpPmdzb2FwPC9pPi4pDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RocmVlIGRpcmVjdGl2ZXMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQgdGhhdCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGRldGFpbHMgYXNzb2NpYXRlZCB3aXRoIG5hbWVzcGFjZSBwcmVmaXhlcyB1c2VkIGJ5IHRoZSByZW1vdGUNCittZXRob2QgbmFtZXMgaW4gdGhlIGhlYWRlciBmaWxlLg0KK1RvIHNwZWNpZnkgdGhlIG5hbWUgb2YgYSBXZWIgU2VydmljZSBpbiB0aGUgaGVhZGVyIGZpbGUsIHVzZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorLy9nc29hcCA8aT5uYW1lc3BhY2UtcHJlZml4PC9pPiBzZXJ2aWNlIG5hbWU6IDxpPnNlcnZpY2UtbmFtZTwvaT4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK3doZXJlIDxpPm5hbWVzcGFjZS1wcmVmaXg8L2k+IGlzIGEgbmFtZXNwYWNlIHByZWZpeCB1c2VkIGJ5IGlkZW50aWZpZXJzIGluIHRoZSBoZWFkZXIgZmlsZSBhbmQgPGk+c2VydmljZS1uYW1lPC9pPiBpcyB0aGUgbmFtZQ0KK29mIGEgV2ViIFNlcnZpY2UgKG9ubHkgcmVxdWlyZWQgdG8gY3JlYXRlIG5ldyBXZWIgU2VydmljZXMpLg0KK1RoZSBuYW1lIG1heSBiZSBmb2xsb3dlZCBieSB0ZXh0IHVwIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUgd2hpY2ggaXMgaW5jb3Jwb3JhdGVkIGludG8gdGhlIFdTREwgc2VydmljZSBkb2N1bWVudGF0aW9uLiBBbHRlcm5hdGl2ZWx5LCB0aGUgc2VydmljZSBkb2N1bWVudGF0aW9uIGNhbiBiZSBwcm92aWRlZCB3aXRoIHRoZSBkaXJlY3RpdmUgYmVsb3cuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RvIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIFdTREwgZGVmaW5pdGlvbnMgaW4gdGhlIGhlYWRlciBmaWxlLCB1c2U6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vZ3NvYXAgPGk+bmFtZXNwYWNlLXByZWZpeDwvaT4gc2VydmljZSBkZWZpbml0aW9uczogPGk+ZGVmaW5pdGlvbnMtbmFtZTwvaT4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK3doZXJlIDxpPm5hbWVzcGFjZS1wcmVmaXg8L2k+IGlzIGEgbmFtZXNwYWNlIHByZWZpeCB1c2VkIGJ5IGlkZW50aWZpZXJzIGluIHRoZSBoZWFkZXIgZmlsZSBhbmQgPGk+ZGVmaW5pdGlvbnMtbmFtZTwvaT4gaXMgdGhlIG5hbWUgb2YgdGhlIFdTREwgZGVmaW5pdGlvbnMuIEJ5IGRlZmF1bHQsIHRoZSBXU0RMIGRlZmluaXRpb25zIG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIHNlcnZpY2UgbmFtZS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVG8gc3BlY2lmeSB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIFdlYiBTZXJ2aWNlIGluIHRoZSBoZWFkZXIgZmlsZSwgdXNlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisvL2dzb2FwIDxpPm5hbWVzcGFjZS1wcmVmaXg8L2k+IHNlcnZpY2UgZG9jdW1lbnRhdGlvbjogPGk+dGV4dDwvaT4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK3doZXJlIDxpPm5hbWVzcGFjZS1wcmVmaXg8L2k+IGlzIGEgbmFtZXNwYWNlIHByZWZpeCB1c2VkIGJ5IGlkZW50aWZpZXJzIGluIHRoZSBoZWFkZXIgZmlsZSBhbmQgPGk+dGV4dDwvaT4gaXMgdGhlIGRvY3VtZW50YXRpb24gdGV4dCB1cCB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLg0KK1RoZSB0ZXh0IGlzIGluY29ycG9yYXRlZCBpbnRvIHRoZSBXU0RMIHNlcnZpY2UgZG9jdW1lbnRhdGlvbi4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVG8gc3BlY2lmeSB0aGUgcG9ydFR5cGUgb2YgYSBXZWIgU2VydmljZSBpbiB0aGUgaGVhZGVyIGZpbGUsIHVzZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorLy9nc29hcCA8aT5uYW1lc3BhY2UtcHJlZml4PC9pPiBzZXJ2aWNlIHBvcnRUeXBlOiA8aT5wb3J0VHlwZS1uYW1lPC9pPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorb3INCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorLy9nc29hcCA8aT5uYW1lc3BhY2UtcHJlZml4PC9pPiBzZXJ2aWNlIHR5cGU6IDxpPnBvcnRUeXBlLW5hbWU8L2k+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCit3aGVyZSA8aT5uYW1lc3BhY2UtcHJlZml4PC9pPiBpcyBhIG5hbWVzcGFjZSBwcmVmaXggdXNlZCBieSBpZGVudGlmaWVycyBpbiB0aGUgaGVhZGVyIGZpbGUgYW5kIDxpPnBvcnRUeXBlLW5hbWU8L2k+IGlzIHRoZSBwb3J0VHlwZSBuYW1lIG9mIHRoZSBXU0RMIHNlcnZpY2UgcG9ydFR5cGUuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RvIHNwZWNpZnkgdGhlIGJpbmRpbmcgbmFtZSBvZiBhIFdlYiBTZXJ2aWNlIGluIHRoZSBoZWFkZXIgZmlsZSwgdXNlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisvL2dzb2FwIDxpPm5hbWVzcGFjZS1wcmVmaXg8L2k+IHNlcnZpY2UgYmluZGluZzogPGk+YmluZGluZy1uYW1lPC9pPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQord2hlcmUgPGk+bmFtZXNwYWNlLXByZWZpeDwvaT4gaXMgYSBuYW1lc3BhY2UgcHJlZml4IHVzZWQgYnkgaWRlbnRpZmllcnMgaW4gdGhlIGhlYWRlciBmaWxlIGFuZCA8aT5iaW5kaW5nLW5hbWU8L2k+IGlzIHRoZSBiaW5kaW5nIG5hbWUgb2YgdGhlIFdTREwgc2VydmljZSBiaW5kaW5nIGVsZW1lbnQuIEJ5IGRlZmF1bHQsIHRoZSBiaW5kaW5nIG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIHNlcnZpY2UgbmFtZS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVG8gc3BlY2lmeSB0aGUgYmluZGluZydzIHRyYW5zcG9ydCBwcm90b2NvbCBvZiBhIFdlYiBTZXJ2aWNlIGluIHRoZSBoZWFkZXIgZmlsZSwgdXNlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisvL2dzb2FwIDxpPm5hbWVzcGFjZS1wcmVmaXg8L2k+IHNlcnZpY2UgdHJhbnNwb3J0OiA8aT50cmFuc3BvcnQtVVJMPC9pPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQord2hlcmUgPGk+bmFtZXNwYWNlLXByZWZpeDwvaT4gaXMgYSBuYW1lc3BhY2UgcHJlZml4IHVzZWQgYnkgaWRlbnRpZmllcnMgaW4gdGhlIGhlYWRlciBmaWxlIGFuZCA8aT50cmFuc3BvcnQtVVJMPC9pPiBpcyB0aGUgVVJMIG9mIHRoZSB0cmFuc3BvcnQgcHJvdG9jb2wgc3VjaCBhcyA8aT5odHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHA8L2k+IGZvciBIVFRQLiBIVFRQIHRyYW5zcG9ydCBpcyBhc3N1bWVkIGJ5IGRlZmF1bHQuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIChvciBwb3J0IGVuZHBvaW50KSBvZiBhIFdlYiBTZXJ2aWNlIGluIHRoZSBoZWFkZXIgZmlsZSwgdXNlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisvL2dzb2FwIDxpPm5hbWVzcGFjZS1wcmVmaXg8L2k+IHNlcnZpY2UgbG9jYXRpb246IDxpPlVSTDwvaT4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK29yIGFsdGVybmF0aXZlbHkNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorLy9nc29hcCA8aT5uYW1lc3BhY2UtcHJlZml4PC9pPiBzZXJ2aWNlIHBvcnQ6IDxpPlVSTDwvaT4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK3doZXJlIDxpPlVSTDwvaT4gaXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBXZWIgU2VydmljZSAob25seSByZXF1aXJlZCB0byBjcmVhdGUgbmV3IFdlYiBTZXJ2aWNlcykuDQorVGhlIDxpPlVSTDwvaT4gc3BlY2lmaWVzIHRoZSBwYXRoIHRvIHRoZSBzZXJ2aWNlIGV4ZWN1dGFibGUgKHNvIDxpPjxpPlVSTDwvaT4vPGk+c2VydmljZS1leGVjdXRhYmxlPC9pPjwvaT4NCitpcyB0aGUgYWN0dWFsIGxvY2F0aW9uIG9mIHRoZSBleGVjdXRhYmxlIHdoZW4gZGVjbGFyZWQpLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUbyBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBleGVjdXRhYmxlIG9mIGEgV2ViIFNlcnZpY2UgaW4gdGhlIGhlYWRlciBmaWxlLCB1c2U6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vZ3NvYXAgPGk+bmFtZXNwYWNlLXByZWZpeDwvaT4gc2VydmljZSBleGVjdXRhYmxlOiA8aT5leGVjdXRhYmxlLW5hbWU8L2k+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCit3aGVyZSA8aT5leGVjdXRhYmxlLW5hbWU8L2k+IGlzIHRoZSBuYW1lIG9mIHRoZSBleGVjdXRhYmxlIG9mIHRoZSBXZWIgU2VydmljZS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorV2hlbiBkb2MvbGl0ZXJhbCBlbmNvZGluZyBpcyByZXF1aXJlZCBmb3IgdGhlIGVudGlyZSBzZXJ2aWNlLCB0aGUgc2VydmljZSBlbmNvZGluZyBjYW4gYmUgc3BlY2lmaWVkIGluIHRoZSBoZWFkZXIgZmlsZSBhcyBmb2xsb3dzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisvL2dzb2FwIDxpPm5hbWVzcGFjZS1wcmVmaXg8L2k+IHNlcnZpY2UgZW5jb2Rpbmc6IGxpdGVyYWwNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK29yIHdoZW4gdGhlIDx0dD5TT0FQLUVOVjplbmNvZGluZ1N0eWxlPC90dD4gYXR0cmlidXRlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBTT0FQIDEuMS8xLjIgZW5jb2Rpbmcgc3R5bGU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vZ3NvYXAgPGk+bmFtZXNwYWNlLXByZWZpeDwvaT4gc2VydmljZSBlbmNvZGluZzogPGk+ZW5jb2Rpbmctc3R5bGU8L2k+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVG8gc3BlY2lmeSB0aGUgbmFtZXNwYWNlIFVSSSBvZiBhIFdlYiBTZXJ2aWNlIGluIHRoZSBoZWFkZXIgZmlsZSwgdXNlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisvL2dzb2FwIDxpPm5hbWVzcGFjZS1wcmVmaXg8L2k+IHNlcnZpY2UgbmFtZXNwYWNlOiA8aT5uYW1lc3BhY2UtVVJJPC9pPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQord2hlcmUgPGk+bmFtZXNwYWNlLVVSSTwvaT4gaXMgdGhlIFVSSSBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWVzcGFjZSBwcmVmaXguDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0luIGFkZGl0aW9uLCB0aGUgc2NoZW1hIG5hbWVzcGFjZSBVUkkgY2FuIGJlIHNwZWNpZmllZCBpbiB0aGUgaGVhZGVyIGZpbGU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vZ3NvYXAgPGk+bmFtZXNwYWNlLXByZWZpeDwvaT4gc2NoZW1hIG5hbWVzcGFjZTogPGk+bmFtZXNwYWNlLVVSSTwvaT4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK3doZXJlIDxpPm5hbWVzcGFjZS1VUkk8L2k+IGlzIHRoZSBzY2hlbWEgVVJJIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZXNwYWNlIHByZWZpeC4NCitJZiBwcmVzZW50LCBpdCBkZWZpbmVzIHRoZSBzY2hlbWEtcGFydCBvZiB0aGUgZ2VuZXJhdGVkIFdTREwgZmlsZSBhbmQgdGhlIFVSSSBpbiB0aGUgbmFtZXNwYWNlIG1hcHBpbmcgdGFibGUuDQorVGhpcyBkZWNsYXJhdGlvbiBpcyB1c2VmdWwgd2hlbiB0aGUgc2VydmljZSBkZWNsYXJlcyBpdHMgb3duIGRhdGEgdHlwZXMgdGhhdCBuZWVkIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBhIG5hbWVzcGFjZS4NCitGdXJ0aGVybW9yZSwgdGhlIGhlYWRlciBmaWxlIGZvciBjbGllbnQgYXBwbGljYXRpb25zIGRvIG5vdCBuZWVkIHRoZSBmdWxsIHNlcnZpY2UgZGV0YWlscyBhbmQgdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIHNjaGVtYQ0KK25hbWVzcGFjZXMgZm9yIG5hbWVzcGFjZSBwcmVmaXhlcyBzdWZmaWNlcy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIGRpcmVjdGl2ZSBhYm92ZSBzcGVjaWZpZXMgYSBuZXcgc2NoZW1hIGFuZCB0aGUgZ1NPQVAgY29tcGlsZXIgZ2VuZXJhdGVzIGEgc2NoZW1hIGZpbGVzICgueHNkKSBmaWxlIGZvciB0aGUgc2NoZW1hLg0KK0FuIGV4aXN0aW5nIHNjaGVtYSBuYW1lc3BhY2UgVVJJIGNhbiBiZSBpbXBvcnRlZCB3aXRoOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisvL2dzb2FwIDxpPm5hbWVzcGFjZS1wcmVmaXg8L2k+IHNjaGVtYSBpbXBvcnQ6IDxpPm5hbWVzcGFjZS1VUkk8L2k+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCit3aGVyZSA8aT5uYW1lc3BhY2UtVVJJPC9pPiBpcyB0aGUgc2NoZW1hIFVSSSBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWVzcGFjZSBwcmVmaXguDQorZ1NPQVAgZG9lcyBub3QgcHJvZHVjZSBYTUwgU2NoZW1hIGZpbGVzIGZvciBpbXBvcnRlZCBzY2hlbWFzIGFuZCBpbXBvcnRzIHRoZSBzY2hlbWEgbmFtZXNwYWNlcyBpbiB0aGUgZ2VuZXJhdGVkIFdTREwgZmlsZS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorQSBzY2hlbWEgbmFtZXNwYWNlIFVSSSBjYW4gYmUgaW1wb3J0ZWQgZnJvbSBhIGxvY2F0aW9uIHdpdGg6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vZ3NvYXAgPGk+bmFtZXNwYWNlLXByZWZpeDwvaT4gc2NoZW1hIG5hbWVzcGFjZTogPGk+bmFtZXNwYWNlLVVSSTwvaT4gPGJyIC8+DQorLy9nc29hcCA8aT5uYW1lc3BhY2UtcHJlZml4PC9pPiBzY2hlbWEgaW1wb3J0OiA8aT5zY2hlbWEtbG9jYXRpb248L2k+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIGVsZW1lbnRGb3JtRGVmYXVsdCBhbmQgYXR0cmlidXRlRm9ybURlZmF1bHQgcXVhbGlmaWNhdGlvbiBvZiBhIHNjaGVtYSBjYW4gYmUgZGVmaW5lZCB3aXRoOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisvL2dzb2FwIDxpPm5hbWVzcGFjZS1wcmVmaXg8L2k+IHNjaGVtYSBlbGVtZW50Rm9ybTogcXVhbGlmaWVkIDxiciAvPg0KKy8vZ3NvYXAgPGk+bmFtZXNwYWNlLXByZWZpeDwvaT4gc2NoZW1hIGF0dHJpYnV0ZUZvcm06IHF1YWxpZmllZA0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorb3I6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vZ3NvYXAgPGk+bmFtZXNwYWNlLXByZWZpeDwvaT4gc2NoZW1hIGVsZW1lbnRGb3JtOiB1bnF1YWxpZmllZCA8YnIgLz4NCisvL2dzb2FwIDxpPm5hbWVzcGFjZS1wcmVmaXg8L2k+IHNjaGVtYSBhdHRyaWJ1dGVGb3JtOiB1bnF1YWxpZmllZA0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorQSBzaG9ydGN1dCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgcXVhbGlmaWNhdGlvbiBvZiBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBvZiBhIHNjaGVtYToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorLy9nc29hcCA8aT5uYW1lc3BhY2UtcHJlZml4PC9pPiBzY2hlbWEgZm9ybTogcXVhbGlmaWVkDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitvcjoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorLy9nc29hcCA8aT5uYW1lc3BhY2UtcHJlZml4PC9pPiBzY2hlbWEgZm9ybTogdW5xdWFsaWZpZWQNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUbyBkb2N1bWVudCBhIGRhdGEgdHlwZSwgdXNlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisvL2dzb2FwIDxpPm5hbWVzcGFjZS1wcmVmaXg8L2k+IHNjaGVtYSB0eXBlLWRvY3VtZW50YXRpb246IDxpPnR5cGUtbmFtZTwvaT4gLy88aT50ZXh0PC9pPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQord2hlcmUgPGk+dHlwZS1uYW1lPC9pPiBpcyB0aGUgdW5xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZGF0YSB0eXBlIGFuZCA8aT50ZXh0PC9pPg0KK2lzIGEgbGluZSBvZiB0ZXh0IHRlcm1pbmF0ZWQgYnkgYSBuZXdsaW5lLiBEbyBub3QgdXNlIGFueSBYTUwgcmVzZXJ2ZWQNCitjaGFyYWN0ZXJzIGluIDxpPnRleHQ8L2k+IHN1Y2ggYXMgICZsdDsgIGFuZCAgJmd0OyAuIFVzZSB3ZWxsLWZvcm1lZCBYTUwgYW5kIFhIVE1MIG1hcmt1cCBpbnN0ZWFkLg0KK0ZvciBleGFtcGxlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisvL2dzb2FwIG5zIHNjaGVtYSB0eXBlLWRvY3VtZW50YXRpb246IHRkYXRhIHN0b3JlcyA8dHQ+Jmx0O2EmbmJzcDtocmVmPSJ0cmFuc2FjdGlvbi5odG1sIiZndDs8L3R0PnRyYW5zYWN0aW9uPHR0PiZsdDsvYSZndDs8L3R0PiBkYXRhIDxiciAvPg0KKzxiPmNsYXNzPC9iPiZuYnNwO25zX190ZGF0YSA8YnIgLz4NCit7IC4uLiB9DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVG8gZG9jdW1lbnQgYSBtZXRob2QsIHVzZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorLy9nc29hcCA8aT5uYW1lc3BhY2UtcHJlZml4PC9pPiBzZXJ2aWNlIG1ldGhvZC1kb2N1bWVudGF0aW9uOiA8aT5tZXRob2QtbmFtZTwvaT4gLy88aT50ZXh0PC9pPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQord2hlcmUgPGk+bWV0aG9kLW5hbWU8L2k+IGlzIHRoZSB1bnF1YWxpZmllZCBuYW1lIG9mIHRoZSBtZXRob2QgYW5kIDxpPnRleHQ8L2k+DQoraXMgYSBsaW5lIG9mIHRleHQgdGVybWluYXRlZCBieSBhIG5ld2xpbmUuIERvIG5vdCB1c2UgYW55IFhNTCByZXNlcnZlZA0KK2NoYXJhY3RlcnMgaW4gPGk+dGV4dDwvaT4gc3VjaCBhcyAgJmx0OyAgYW5kICAmZ3Q7IC4gVXNlIHdlbGwtZm9ybWVkIFhNTCBhbmQgWEhUTUwgbWFya3VwIGluc3RlYWQuDQorRm9yIGV4YW1wbGU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vZ3NvYXAgbnMgc2VydmljZSBtZXRob2QtZG9jdW1lbnRhdGlvbjogZ2V0UXVvdGUgcmV0dXJucyBhIDx0dD4mbHQ7aSZndDs8L3R0PnN0b2NrIHF1b3RlPHR0PiZsdDsvaSZndDs8L3R0PiA8YnIgLz4NCis8Yj5pbnQ8L2I+Jm5ic3A7bnNfX2dldFF1b3RlKDxiPmNoYXI8L2I+Jm5ic3A7KnN5bWJvbCwgPGI+ZmxvYXQ8L2I+Jm5ic3A7JmFtcDtfcmVzdWx0KTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUbyBzcGVjaWZ5IHRoZSBTT0FQQWN0aW9uIGZvciBhIG1ldGhvZCwgdXNlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisvL2dzb2FwIDxpPm5hbWVzcGFjZS1wcmVmaXg8L2k+IHNlcnZpY2UgbWV0aG9kLWFjdGlvbjogPGk+bWV0aG9kLW5hbWU8L2k+IDxpPmFjdGlvbjwvaT4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK3doZXJlIDxpPm1ldGhvZC1uYW1lPC9pPiBpcyB0aGUgdW5xdWFsaWZpZWQgbmFtZSBvZiB0aGUgbWV0aG9kIGFuZCA8aT5hY3Rpb248L2k+DQoraXMgYSBxdW90ZWQgb3Igbm9uLXF1b3RlZCBzdHJpbmcgKHNwYWNlcyBhbmQgYmxhbmtzIGFyZSBub3QgYWxsb3dlZCkuDQorRm9yIGV4YW1wbGU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vZ3NvYXAgbnMgc2VydmljZSBtZXRob2QtYWN0aW9uOiBnZXRRdW90ZSAiIiA8YnIgLz4NCis8Yj5pbnQ8L2I+Jm5ic3A7bnNfX2dldFF1b3RlKDxiPmNoYXI8L2I+Jm5ic3A7KnN5bWJvbCwgPGI+ZmxvYXQ8L2I+Jm5ic3A7JmFtcDtfcmVzdWx0KTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitXaGVuIGRvY3VtZW50IHN0eWxlIGlzIHByZWZlcnJlZCBmb3IgYSBwYXJ0aWN1bGFyIHNlcnZpY2UgbWV0aG9kLCB1c2U6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vZ3NvYXAgPGk+bmFtZXNwYWNlLXByZWZpeDwvaT4gc2VydmljZSBtZXRob2Qtc3R5bGU6IDxpPm1ldGhvZC1uYW1lPC9pPiBkb2N1bWVudA0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1doZW4gU09BUCBSUEMgZW5jb2RpbmcgaXMgcmVxdWlyZWQgZm9yIGEgcGFydGljdWxhciBzZXJ2aWNlIG1ldGhvZCwgdXNlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisvL2dzb2FwIDxpPm5hbWVzcGFjZS1wcmVmaXg8L2k+IHNlcnZpY2UgbWV0aG9kLWVuY29kaW5nOiA8aT5tZXRob2QtbmFtZTwvaT4gZW5jb2RlZA0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorV2hlbiBsaXRlcmFsIGVuY29kaW5nIGlzIHJlcXVpcmVkIGZvciBhIHBhcnRpY3VsYXIgc2VydmljZSBtZXRob2QsIHVzZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorLy9nc29hcCA8aT5uYW1lc3BhY2UtcHJlZml4PC9pPiBzZXJ2aWNlIG1ldGhvZC1lbmNvZGluZzogPGk+bWV0aG9kLW5hbWU8L2k+IGxpdGVyYWwNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK29yIHdoZW4gdGhlIDx0dD5TT0FQLUVOVjplbmNvZGluZ1N0eWxlPC90dD4gYXR0cmlidXRlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBTT0FQIDEuMS8xLjIgZW5jb2Rpbmcgc3R5bGUsIHVzZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorLy9nc29hcCA8aT5uYW1lc3BhY2UtcHJlZml4PC9pPiBzZXJ2aWNlIG1ldGhvZC1lbmNvZGluZzogPGk+bWV0aG9kLW5hbWU8L2k+IDxpPmVuY29kaW5nLXN0eWxlPC9pPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1doZW4gU09BUCBSUEMgZW5jb2RpbmcgaXMgcmVxdWlyZWQgZm9yIGEgcGFydGljdWxhciBzZXJ2aWNlIG1ldGhvZCByZXNwb25zZSB3aGVuIHRoZSByZXF1ZXN0IG1lc3NhZ2UgaXMgbGl0ZXJhbCwgdXNlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisvL2dzb2FwIDxpPm5hbWVzcGFjZS1wcmVmaXg8L2k+IHNlcnZpY2UgbWV0aG9kLXJlc3BvbnNlLWVuY29kaW5nOiA8aT5tZXRob2QtbmFtZTwvaT4gZW5jb2RlZA0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorV2hlbiBsaXRlcmFsIGVuY29kaW5nIGlzIHJlcXVpcmVkIGZvciBhIHBhcnRpY3VsYXIgc2VydmljZSBtZXRob2QgcmVzcG9uc2Ugd2hlbiB0aGUgcmVxdWVzdCBtZXNzYWdlIGlzIGVuY29kZWQsIHVzZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorLy9nc29hcCA8aT5uYW1lc3BhY2UtcHJlZml4PC9pPiBzZXJ2aWNlIG1ldGhvZC1yZXNwb25zZS1lbmNvZGluZzogPGk+bWV0aG9kLW5hbWU8L2k+IGxpdGVyYWwNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK29yIHdoZW4gdGhlIDx0dD5TT0FQLUVOVjplbmNvZGluZ1N0eWxlPC90dD4gYXR0cmlidXRlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBTT0FQIDEuMS8xLjIgZW5jb2Rpbmcgc3R5bGUsIHVzZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorLy9nc29hcCA8aT5uYW1lc3BhY2UtcHJlZml4PC9pPiBzZXJ2aWNlIG1ldGhvZC1yZXNwb25zZS1lbmNvZGluZzogPGk+bWV0aG9kLW5hbWU8L2k+IDxpPmVuY29kaW5nLXN0eWxlPC9pPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorTm90ZSB0aGF0IHRoZSA8aT5tZXRob2QtcmVzcG9uc2UtZW5jb2Rpbmc8L2k+IGlzIHNldCB0byB0aGUgdmFsdWUgb2YgPGk+bWV0aG9kLWVuY29kaW5nPC9pPiBieSBkZWZhdWx0Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitXaGVuIGhlYWRlciBwcm9jZXNzaW5nIGlzIHJlcXVpcmVkLCBlYWNoIG1ldGhvZCBkZWNsYXJlZCBpbiB0aGUgV1NETCBzaG91bGQgcHJvdmlkZSBhIGJpbmRpbmcgdG8gdGhlIHBhcnRzIG9mIHRoZSBoZWFkZXIgdGhhdCBtYXkNCithcHBlYXIgYXMgcGFydCBvZiBhIG1ldGhvZCByZXF1ZXN0IG1lc3NhZ2UuIFN1Y2ggYSBiaW5kaW5nIGlzIGdpdmVuIGJ5Og0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisvL2dzb2FwIDxpPm5hbWVzcGFjZS1wcmVmaXg8L2k+IHNlcnZpY2UgbWV0aG9kLWhlYWRlci1wYXJ0OiA8aT5tZXRob2QtbmFtZTwvaT4gPGk+aGVhZGVyLXBhcnQ8L2k+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitGb3IgZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+c3RydWN0PC9iPiZuYnNwO1NPQVBfRU5WX19IZWFkZXIgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypoX190cmFuc2FjdGlvbjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+c3RydWN0PC9iPiZuYnNwO1VzZXJBdXRoICpoX19hdXRoZW50aWNhdGlvbjsgPGJyIC8+DQorfTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1N1cHBvc2UgbWV0aG9kIDxpPm5zX19sb2dpbjwvaT4gdXNlcyBib3RoIGhlYWRlciBwYXJ0cyAoYXQgbW9zdCksIHRoZW4gdGhpcyBpcyBkZWNsYXJlZCBhczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorLy9nc29hcCBucyBzZXJ2aWNlIG1ldGhvZC1oZWFkZXItcGFydDogbG9naW4gaF9fdHJhbnNhY3Rpb24gPGJyIC8+DQorLy9nc29hcCBucyBzZXJ2aWNlIG1ldGhvZC1oZWFkZXItcGFydDogbG9naW4gaF9fYXV0aGVudGljYXRpb24gPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO25zX19sb2dpbiguLi4pOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorU3VwcG9zZSBtZXRob2QgPGk+bnNfX3NlYXJjaDwvaT4gdXNlcyBvbmx5IHRoZSBmaXJzdCBoZWFkZXIgcGFydCwgdGhlbiB0aGlzIGlzIGRlY2xhcmVkIGFzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisvL2dzb2FwIG5zIHNlcnZpY2UgbWV0aG9kLWhlYWRlci1wYXJ0OiBzZWFyY2ggaF9fdHJhbnNhY3Rpb24gPGJyIC8+DQoraW50IG5zX19zZWFyY2goLi4uKTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK05vdGUgdGhhdCB0aGUgbWV0aG9kIG5hbWUgYW5kIGhlYWRlciBwYXJ0IG5hbWVzIE1VU1QgYmUgbmFtZXNwYWNlIHF1YWxpZmllZC4NCitUaGUgaGVhZGVycyBNVVNUIGJlIHByZXNlbnQgaW4gYWxsIG9wZXJhdGlvbnMgdGhhdCBkZWNsYXJlZCB0aGUgaGVhZGVyIHBhcnRzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUbyBzcGVjaWZ5IHRoZSBoZWFkZXIgcGFydHMgZm9yIHRoZSBtZXRob2QgaW5wdXQgKG1ldGhvZCByZXF1ZXN0IG1lc3NhZ2UpLCB1c2U6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vZ3NvYXAgPGk+bmFtZXNwYWNlLXByZWZpeDwvaT4gc2VydmljZSBtZXRob2QtaW5wdXQtaGVhZGVyLXBhcnQ6IDxpPm1ldGhvZC1uYW1lPC9pPiA8aT5oZWFkZXItcGFydDwvaT4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1NpbWlsYXJseSwgdG8gc3BlY2lmeSB0aGUgaGVhZGVyIHBhcnRzIGZvciB0aGUgbWV0aG9kIG91dHB1dCAobWV0aG9kIHJlc3BvbnNlIG1lc3NhZ2UpLCB1c2U6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vZ3NvYXAgPGk+bmFtZXNwYWNlLXByZWZpeDwvaT4gc2VydmljZSBtZXRob2Qtb3V0cHV0LWhlYWRlci1wYXJ0OiA8aT5tZXRob2QtbmFtZTwvaT4gPGk+aGVhZGVyLXBhcnQ8L2k+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgZGVjbGFyYXRpb25zIGFib3ZlIG9ubHkgYWZmZWN0IHRoZSBXU0RMLg0KK0ZvciBleGFtcGxlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7U09BUF9FTlZfX0hlYWRlciA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KmhfX3RyYW5zYWN0aW9uOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7VXNlckF1dGggKmhfX2F1dGhlbnRpY2F0aW9uOyA8YnIgLz4NCit9OyA8YnIgLz4NCisvL2dzb2FwIG5zIHNlcnZpY2UgbWV0aG9kLWlucHV0LWhlYWRlci1wYXJ0OiBsb2dpbiBoX19hdXRoZW50aWNhdGlvbiA8YnIgLz4NCisvL2dzb2FwIG5zIHNlcnZpY2UgbWV0aG9kLWlucHV0LWhlYWRlci1wYXJ0OiBsb2dpbiBoX190cmFuc2FjdGlvbiA8YnIgLz4NCisvL2dzb2FwIG5zIHNlcnZpY2UgbWV0aG9kLW91dHB1dC1oZWFkZXItcGFydDogbG9naW4gaF9fdHJhbnNhY3Rpb24gPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO25zX19sb2dpbiguLi4pOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIGhlYWRlcnMgTVVTVCBiZSBwcmVzZW50IGluIGFsbCBvcGVyYXRpb25zIHRoYXQgZGVjbGFyZWQgdGhlIGhlYWRlciBwYXJ0cy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVG8gc3BlY2lmeSBNSU1FIGF0dGFjaG1lbnRzIGZvciB0aGUgbWV0aG9kIGlucHV0IGFuZCBvdXRwdXQgKG1ldGhvZCByZXF1ZXN0IGFuZCByZXNwb25zZSBtZXNzYWdlcyksIHVzZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorLy9nc29hcCA8aT5uYW1lc3BhY2UtcHJlZml4PC9pPiBzZXJ2aWNlIG1ldGhvZC1taW1lLXR5cGU6IDxpPm1ldGhvZC1uYW1lPC9pPiA8aT5taW1lLXR5cGU8L2k+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitZb3UgY2FuIHJlcGVhdCB0aGlzIGRpcmVjdGl2ZSBmb3IgYWxsIG11bHRpcGFydFJlbGF0ZWQgTUlNRSBhdHRhY2htZW50cyB5b3Ugd2FudCB0byBhc3NvY2lhdGUgd2l0aCB0aGUgbWV0aG9kLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUbyBzcGVjaWZ5IE1JTUUgYXR0YWNobWVudHMgZm9yIHRoZSBtZXRob2QgaW5wdXQgKG1ldGhvZCByZXF1ZXN0IG1lc3NhZ2UpLCB1c2U6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vZ3NvYXAgPGk+bmFtZXNwYWNlLXByZWZpeDwvaT4gc2VydmljZSBtZXRob2QtaW5wdXQtbWltZS10eXBlOiA8aT5tZXRob2QtbmFtZTwvaT4gPGk+bWltZS10eXBlPC9pPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorU2ltaWxhcmx5LCB0byBzcGVjaWZ5IE1JTUUgYXR0YWNobWVudHMgZm9yIHRoZSBtZXRob2Qgb3V0cHV0IChtZXRob2QgcmVzcG9uc2UgbWVzc2FnZSksIHVzZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorLy9nc29hcCA8aT5uYW1lc3BhY2UtcHJlZml4PC9pPiBzZXJ2aWNlIG1ldGhvZC1vdXRwdXQtbWltZS10eXBlOiA8aT5tZXRob2QtbmFtZTwvaT4gPGk+bWltZS10eXBlPC9pPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorWW91IGNhbiByZXBlYXQgdGhlc2UgZGlyZWN0aXZlcyBmb3IgYWxsIG11bHRpcGFydFJlbGF0ZWQgTUlNRSBhdHRhY2htZW50cyB5b3Ugd2FudCB0byBhc3NvY2lhdGUgd2l0aCB0aGUgbWV0aG9kLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJICAgICAgPGg0PjxhIG5hbWU9InR0aF9zRWMxOC4yLjEiPg0KKzE4LjIuMTwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+RXhhbXBsZTwvZm9udD48L2g0Pg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgdXNlIG9mIGRpcmVjdGl2ZXMgaXMgYmVzdCBpbGx1c3RyYXRlZCB3aXRoIGFuIGV4YW1wbGUuDQorVGhlIDxpPnF1b3RleC5oPC9pPiBoZWFkZXIgZmlsZSBvZiB0aGUgPGk+cXVvdGV4PC9pPiBleGFtcGxlIGluIHRoZSBnU09BUCBkaXN0cmlidXRpb24gZm9yIFVuaXgvTGludXggaXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vZ3NvYXAgbnMxIHNlcnZpY2UgbmFtZXNwYWNlOgl1cm46eG1ldGhvZHMtZGVsYXllZC1xdW90ZXMgPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO25zMV9fZ2V0UXVvdGUoPGI+Y2hhcjwvYj4mbmJzcDsqc3ltYm9sLCA8Yj5mbG9hdDwvYj4mbmJzcDsmYW1wO3Jlc3VsdCk7IDxiciAvPg0KKyA8YnIgLz4NCisvL2dzb2FwIG5zMiBzZXJ2aWNlIG5hbWVzcGFjZToJdXJuOnhtZXRob2RzLUN1cnJlbmN5RXhjaGFuZ2UgPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO25zMl9fZ2V0UmF0ZSg8Yj5jaGFyPC9iPiZuYnNwOypjb3VudHJ5MSwgPGI+Y2hhcjwvYj4mbmJzcDsqY291bnRyeTIsIDxiPmZsb2F0PC9iPiZuYnNwOyZhbXA7cmVzdWx0KTsgPGJyIC8+DQorIDxiciAvPg0KKy8vZ3NvYXAgbnMzIHNlcnZpY2UgbmFtZToJcXVvdGV4IDxiciAvPg0KKy8vZ3NvYXAgbnMzIHNlcnZpY2Ugc3R5bGU6CXJwYyA8YnIgLz4NCisvL2dzb2FwIG5zMyBzZXJ2aWNlIGVuY29kaW5nOgllbmNvZGVkIDxiciAvPg0KKy8vZ3NvYXAgbnMzIHNlcnZpY2UgbG9jYXRpb246CWh0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbiA8YnIgLz4NCisvL2dzb2FwIG5zMyBzZXJ2aWNlIG5hbWVzcGFjZToJdXJuOnF1b3RleCA8YnIgLz4NCis8Yj5pbnQ8L2I+Jm5ic3A7bnMzX19nZXRRdW90ZSg8Yj5jaGFyPC9iPiZuYnNwOypzeW1ib2wsIDxiPmNoYXI8L2I+Jm5ic3A7KmNvdW50cnksIDxiPmZsb2F0PC9iPiZuYnNwOyZhbXA7cmVzdWx0KTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoZSA8aT5xdW90ZXg8L2k+IGV4YW1wbGUgaXMgYSBuZXcgV2ViIFNlcnZpY2UgY3JlYXRlZCBieSBjb21iaW5pbmcgdHdvIGV4aXN0aW5nIFdlYiBTZXJ2aWNlczoNCit0aGUgWE1ldGhvZHMgRGVsYXllZCBTdG9jayBRdW90ZSBzZXJ2aWNlIGFuZCBYTWV0aG9kcyBDdXJyZW5jeSBFeGNoYW5nZSBzZXJ2aWNlLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitOYW1lc3BhY2UgcHJlZml4IDxpPm5zMzwvaT4gaXMgdXNlZCBmb3IgdGhlIG5ldyA8aT5xdW90ZXg8L2k+IFdlYiBTZXJ2aWNlIHdpdGggbmFtZXNwYWNlIFVSSSA8aT51cm46cXVvdGV4PC9pPiwNCitzZXJ2aWNlIG5hbWUgPGk+cXVvdGV4PC9pPiwgYW5kIGxvY2F0aW9uIDxpPmh0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbjwvaT4uDQorU2luY2UgdGhlIG5ldyBXZWIgU2VydmljZSBpbnZva2VzIHRoZSA8aT5uczFfX2dldFF1b3RlPC9pPiBhbmQgPGk+bnMyX19nZXRSYXRlPC9pPiByZW1vdGUgbWV0aG9kcywNCit0aGUgc2VydmljZSBuYW1lc3BhY2VzIG9mIHRoZXNlIG1ldGhvZHMgYXJlIGdpdmVuLg0KK1RoZSBzZXJ2aWNlIG5hbWVzIGFuZCBsb2NhdGlvbnMgb2YgdGhlc2UgbWV0aG9kcyBhcmUgbm90IGdpdmVuIGJlY2F1c2UgdGhleQ0KK2FyZSBvbmx5IHJlcXVpcmVkIGZvciBzZXR0aW5nIHVwIGEgbmV3IFdlYiBTZXJ2aWNlIGZvciB0aGVzZSBtZXRob2RzDQorKGJ1dCBtYXkgYWxzbyBiZSBwcm92aWRlZCBpbiB0aGUgaGVhZGVyIGZpbGUgZm9yIGRvY3VtZW50YXRpb24gcHVycG9zZXMpLg0KK0FmdGVyIGludm9raW5nIHRoZSBnU09BUCBTdHViIGFuZCBTa2VsZXRvbiBjb21waWxlciBvbiB0aGUgPGk+cXVvdGV4Lmg8L2k+IGhlYWRlciBmaWxlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKzxpPnNvYXBjcHAyIHF1b3RleC5oPC9pPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQordGhlIFdTREwgb2YgdGhlIG5ldyA8aT5xdW90ZXg8L2k+IFdlYiBTZXJ2aWNlIGlzIHNhdmVkIGFzIDxpPnF1b3RleC53c2RsPC9pPi4NCitTaW5jZSB0aGUgc2VydmljZSBuYW1lICg8aT5xdW90ZXg8L2k+KSwgbG9jYXRpb24gKDxpPmh0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbjwvaT4pLCBhbmQgbmFtZXNwYWNlIFVSSQ0KKyg8aT51cm46cXVvdGV4PC9pPikgd2VyZSBwcm92aWRlZCBpbiB0aGUgaGVhZGVyIGZpbGUsIHRoZSBnZW5lcmF0ZWQgV1NETCBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgY2hhbmdlZCBieSBoYW5kIGFuZCBjYW4gYmUgcHVibGlzaGVkDQoraW1tZWRpYXRlbHkgdG9nZXRoZXIgd2l0aCB0aGUgY29tcGlsZWQgV2ViIFNlcnZpY2UgaW5zdGFsbGVkIGFzIGEgQ0dJIGFwcGxpY2F0aW9uIGF0IHRoZSBkZXNpZ25hdGVkIFVSTA0KKyg8aT5odHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vcXVvdGV4LmNnaTwvaT4NCithbmQgPGk+aHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL3F1b3RleC53c2RsPC9pPikuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBuYW1lc3BhY2UgbWFwcGluZyB0YWJsZSBmb3IgdGhlIDxpPnF1b3RleC5jcHA8L2k+IFdlYiBTZXJ2aWNlIGltcGxlbWVudGF0aW9uDQoraXMgc2F2ZWQgYXMgPGk+cXVvdGV4Lm5zbWFwPC9pPi4gIFRoaXMgZmlsZSBjYW4gYmUgZGlyZWN0bHkgaW5jbHVkZWQgaW4NCis8aT5xdW90ZXguY3BwPC9pPiBpbnN0ZWFkIG9mIHNwZWNpZmllZCBieSBoYW5kIGluIHRoZSBzb3VyY2Ugb2YNCis8aT5xdW90ZXguY3BwPC9pPjoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorI2luY2x1ZGUgInF1b3RleC5uc21hcCINCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoZSBhdXRvbWF0aWMgZ2VuZXJhdGlvbiBhbmQgaW5jbHVzaW9uIG9mIHRoZSBuYW1lc3BhY2UgbWFwcGluZyB0YWJsZSByZXF1aXJlcw0KK2NvbXBpbGVyIGRpcmVjdGl2ZXMgZm9yIDxiPmFsbDwvYj4gbmFtZXNwYWNlIHByZWZpeGVzIHRvIGFzc29jaWF0ZSBlYWNoDQorbmFtZXNwYWNlIHByZWZpeCB3aXRoIGEgbmFtZXNwYWNlIFVSSS4gT3RoZXJ3aXNlLCBuYW1lc3BhY2UgVVJJcyBoYXZlIHRvIGJlDQorbWFudWFsbHkgYWRkZWQgdG8gdGhlIHRhYmxlICh0aGV5IGFwcGVhciBhcyA8aT5odHRwOi8vdGVtcHVyaS5vcmc8L2k+KS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCQkgICAgIDxoMz48YSBuYW1lPSJ0dGhfc0VjMTguMyI+DQorMTguMzwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+VHJhbnNpZW50IERhdGEgVHlwZXM8L2ZvbnQ+PC9oMz48YSBuYW1lPSJzZWM6dHJhbnNpZW50Ij4NCis8L2E+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZXJlIGFyZSBzaXR1YXRpb25zIHdoZW4gY2VydGFpbiBkYXRhIHR5cGVzIGhhdmUgdG8gYmUgaWdub3JlZCBieSBnU09BUCBmb3INCit0aGUgY29tcGlsYXRpb24gb2YgKGRlKW1hcnNoYWxsaW5nIHJvdXRpbmVzLiAgRm9yIGV4YW1wbGUsIGluIGNlcnRhaW4gY2FzZXMNCitvbmx5IGEgZmV3IG1lbWJlcnMgb2YgYSBjbGFzcyBvciBzdHJ1Y3QgbmVlZCBub3QgYmUgKGRlKXNlcmlhbGl6ZWQsIG9yIHRoZSBiYXNlDQorY2xhc3Mgb2YgYSBkZXJpdmVkIGNsYXNzIHNob3VsZCBub3QgYmUgKGRlKXNlcmlhbGl6ZWQuIENlcnRhaW4gYnVpbHQtaW4gY2xhc3Nlcw0KK3N1Y2ggYXMgPGk+b3N0cmVhbTwvaT4gY2Fubm90IGJlIChkZSlzZXJpYWxpemVkLiAgRGF0YSBwYXJ0cyB0aGF0IHNob3VsZCBiZSBrZXB0DQoraW52aXNpYmxlIHRvIGdTT0FQIGFyZSBjYWxsZWQgInRyYW5zaWVudCIuICBUcmFuc2llbnQgZGF0YSB0eXBlcyBhbmQNCit0cmFuc2llbnQgc3RydWN0L2NsYXNzIG1lbWJlcnMgYXJlIGRlY2xhcmVkIHdpdGggdGhlIDxpPjxiPmV4dGVybjwvYj48L2k+IGtleXdvcmQgb3INCithcmUgZGVjbGFyZWQgd2l0aGluIDxpPls8L2k+IGFuZCA8aT5dPC9pPiBibG9ja3MgaW4gdGhlIGhlYWRlciBmaWxlLiAgVGhlDQorPGk+PGI+ZXh0ZXJuPC9iPjwvaT4ga2V5d29yZCBoYXMgYSBzcGVjaWFsIG1lYW5pbmcgdG8gdGhlIGdTT0FQIGNvbXBpbGVyIGFuZCB3b24ndA0KK2FmZmVjdCB0aGUgZ2VuZXJhdGVkIGNvZGVzLiAgVGhlIHNwZWNpYWwgPGk+WzwvaT4gYW5kIDxpPl08L2k+IGJsb2NrIGNvbnN0cnVjdA0KK2NhbiBiZSB1c2VkIHdpdGggZGF0YSB0eXBlIGRlY2xhcmF0aW9ucyBhbmQgd2l0aGluIDxpPjxiPnN0cnVjdDwvYj48L2k+IGFuZA0KKzxpPjxiPmNsYXNzPC9iPjwvaT4gZGVjbGFyYXRpb25zLiBUaGUgdXNlIG9mIDxpPjxiPmV4dGVybjwvYj48L2k+IG9yIDxpPlsgXTwvaT4gYWNoaWV2ZSB0aGUNCitzYW1lIGVmZmVjdCwgYnV0IDxpPlsgXTwvaT4gbWF5IGJlIG1vcmUgY29udmVuaWVudCB0byBlbmNhcHN1bGF0ZSB0cmFuc2llbnQNCit0eXBlcyBpbiBhIGxhcmdlciBwYXJ0IG9mIHRoZSBoZWFkZXIgZmlsZS4gVGhlIHVzZSBvZiA8aT48Yj5leHRlcm48L2I+PC9pPiB3aXRoDQorPGk+PGI+dHlwZWRlZjwvYj48L2k+IGlzIHJlc2VydmVkIGZvciB0aGUgZGVjbGFyYXRpb24gb2YgdXNlci1kZWZpbmVkIGV4dGVybmFsDQorKGRlKXNlcmlhbGl6ZXJzIGZvciBkYXRhIHR5cGVzLCBzZWUgU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6ZXh0ZXJuIj4xOC41PC9hPi4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorRmlyc3QgZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+ZXh0ZXJuPC9iPiZuYnNwOzxiPmNsYXNzPC9iPiZuYnNwO29zdHJlYW07IC8vIG9zdHJlYW0gY2FuJ3QgYmUgKGRlKXNlcmlhbGl6ZWQsIGJ1dCBuZWVkIHRvIGJlIGRlY2xhcmVkIHRvIG1ha2UgaXQgdmlzaWJsZSB0byBnU09BUCA8YnIgLz4NCis8Yj5jbGFzczwvYj4mbmJzcDtuc19fbXlDbGFzcyA8YnIgLz4NCit7IC4uLiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj52aXJ0dWFsPC9iPiZuYnNwOzxiPnZvaWQ8L2I+Jm5ic3A7cHJpbnQob3N0cmVhbSAmYW1wO3MpIDxiPmNvbnN0PC9iPjsgLy8gbmVlZCBvc3RyZWFtIGhlcmUgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Li4uIDxiciAvPg0KK307DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitTZWNvbmQgZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorWyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5jbGFzczwvYj4mbmJzcDtteUJhc2UgLy8gYmFzZSBjbGFzcyBuZWVkIG5vdCBiZSAoZGUpc2VyaWFsaXplZCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7IC4uLiB9OyA8YnIgLz4NCitdIDxiciAvPg0KKzxiPmNsYXNzPC9iPiZuYnNwO25zX19teURlcml2ZWQgOiBteUJhc2UgPGJyIC8+DQoreyAuLi4gfTsgPGJyIC8+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGlyZCBleGFtcGxlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCitbIDxiPnR5cGVkZWY8L2I+Jm5ic3A7PGI+aW50PC9iPiZuYnNwO3RyYW5zaWVudEludDsgXSA8YnIgLz4NCis8Yj5jbGFzczwvYj4mbmJzcDtuc19fbXlDbGFzcyA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmludDwvYj4mbmJzcDthOyAvLyB3aWxsIGJlIChkZSlzZXJpYWxpemVkIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO1sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aW50PC9iPiZuYnNwO2I7IC8vIHRyYW5zaWVudCBmaWVsZCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5jaGFyPC9iPiZuYnNwO3NbMjU2XTsgLy8gdHJhbnNpZW50IGZpZWxkIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO10gIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmV4dGVybjwvYj4mbmJzcDs8Yj5mbG9hdDwvYj4mbmJzcDtkOyAvLyB0cmFuc2llbnQgZmllbGQgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqdDsgLy8gd2lsbCBiZSAoZGUpc2VyaWFsaXplZCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt0cmFuc2llbnRJbnQgKm47IC8vIHRyYW5zaWVudCBmaWVsZCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtbIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnZpcnR1YWw8L2I+Jm5ic3A7PGI+dm9pZDwvYj4mbmJzcDttZXRob2QoPGI+Y2hhcjwvYj4mbmJzcDtidWZbMTAyNF0pOyAvLyBkb2VzIG5vdCBjcmVhdGUgYSA8Yj5jaGFyPC9iPlsxMDI0XSAoZGUpc2VyaWFsaXplciA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtdICA8YnIgLz4NCit9Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorSW4gdGhpcyBleGFtcGxlLCA8aT48Yj5jbGFzczwvYj4mbmJzcDtuc19fbXlDbGFzczwvaT4gaGFzIHRocmVlIHRyYW5zaWVudCBmaWVsZHM6DQorPGk+YjwvaT4sIDxpPnM8L2k+LCBhbmQgPGk+bjwvaT4gd2hpY2ggd2lsbCBub3QgYmUgKGRlKXNlcmlhbGl6ZWQgaW4gU09BUC4gRmllbGQNCis8aT5uPC9pPiBpcyB0cmFuc2llbnQgYmVjYXVzZSB0aGUgdHlwZSBpcyBkZWNsYXJlZCB3aXRoaW4gYSB0cmFuc2llbnQgYmxvY2suDQorUG9pbnRlcnMsIHJlZmVyZW5jZXMsIGFuZCBhcnJheXMgb2YgdHJhbnNpZW50IHR5cGVzIGFyZSB0cmFuc2llbnQuICBUaGUgc2luZ2xlDQorY2xhc3MgbWV0aG9kIGlzIGVuY2Fwc3VsYXRlZCB3aXRoaW4gPGk+WzwvaT4gYW5kIDxpPl08L2k+IHRvIHByZXZlbnQgZ1NPQVAgZnJvbQ0KK2NyZWF0aW5nIChkZSlzZXJpYWxpemVycyBmb3IgdGhlIDxpPjxiPmNoYXI8L2I+WzEwMjRdPC9pPiB0eXBlLiBnU09BUCB3aWxsIGdlbmVyYXRlDQorKGRlKXNlcmlhbGl6ZXJzIGZvciBhbGwgdHlwZXMgdGhhdCBhcmUgbm90IGRlY2xhcmVkIHdpdGhpbiBhIDxpPls8L2k+IGFuZA0KKzxpPl08L2k+IHRyYW5zaWVudCBibG9jay4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCQkgICAgIDxoMz48YSBuYW1lPSJ0dGhfc0VjMTguNCI+DQorMTguNDwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+Vm9sYXRpbGUgRGF0YSBUeXBlczwvZm9udD48L2gzPjxhIG5hbWU9InNlYzp2b2xhdGlsZSI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitXaGlsZSB0cmFuc2llbnQgZGF0YSB0eXBlcyBhcmUgc3VwcG9zZWQgdG8gYmUgaGlkZGVuIGZyb20gZ1NPQVAsIHZvbGF0aWxlIGRhdGENCit0eXBlcyBhcmUgdmlzaWJsZSB0byBnU09BUCBidXQgdGhlaXIgZGVjbGFyYXRpb24gYW5kIGltcGxlbWVudGF0aW9uIGlzIGFzc3VtZWQNCit0byBiZSBoaWRkZW4uIFRoYXQgaXMsIHZvbGF0aWxlIGRhdGEgdHlwZXMgYXJlIGFzc3VtZWQgdG8gYmUgcGFydCBvZiBhbg0KK2V4aXN0aW5nIG5vbi1tb2RpZmlhYmxlIHNvZnR3YXJlIHBhY2thZ2UsIHN1Y2ggYXMgYSBidWlsdC1pbiBsaWJyYXJ5LiBJdCB3b3VsZA0KK25vdCBtYWtlIHNlbnNlIHRvIHJlZGVmaW5lIHRoZSBkYXRhIHR5cGVzIGluIGEgZ1NPQVAgaGVhZGVyIGZpbGUuIFdoZW4geW91IG5lZWQNCit0byAoZGUpc2VyaWFsaXplIHN1Y2ggZGF0YSB0eXBlcywgeW91IG11c3QgZGVjbGFyZSB0aGVtIGluIGEgZ1NPQVAgaGVhZGVyIGZpbGUNCithbmQgdXNlIHRoZSA8aT48Yj52b2xhdGlsZTwvYj48L2k+IHF1YWxpZmllci4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorQ29uc2lkZXIgZm9yIGV4YW1wbGUgPGk+PGI+c3RydWN0PC9iPiZuYnNwO3RtPC9pPiwgZGVjbGFyZWQgaW4gPGk+dGltZS5oPC9pPi4gVGhlIHN0cnVjdHVyZSBtYXkgYWN0dWFsbHkgdmFyeSBiZXR3ZWVuIHBsYXRmb3JtcywgYnV0IHRoZSB0bSBzdHJ1Y3R1cmUgaW5jbHVkZXMgYXQgbGVhc3QgdGhlIGZvbGxvd2luZyBmaWVsZHM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnZvbGF0aWxlPC9iPiZuYnNwOzxiPnN0cnVjdDwvYj4mbmJzcDt0bSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmludDwvYj4mbmJzcDt0bV9zZWM7ICAgICAgICAgLyogc2Vjb25kcyAoMCAtIDYwKSAqLyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7dG1fbWluOyAgICAgICAgIC8qIG1pbnV0ZXMgKDAgLSA1OSkgKi8gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aW50PC9iPiZuYnNwO3RtX2hvdXI7ICAgICAgICAvKiBob3VycyAoMCAtIDIzKSAqLyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7dG1fbWRheTsgICAgICAgIC8qIGRheSBvZiBtb250aCAoMSAtIDMxKSAqLyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7dG1fbW9uOyAgICAgICAgIC8qIG1vbnRoIG9mIHllYXIgKDAgLSAxMSkgKi8gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aW50PC9iPiZuYnNwO3RtX3llYXI7ICAgICAgICAvKiB5ZWFyIC0gMTkwMCAqLyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7dG1fd2RheTsgICAgICAgIC8qIGRheSBvZiB3ZWVrIChTdW5kYXkgPSAwKSAqLyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7dG1feWRheTsgICAgICAgIC8qIGRheSBvZiB5ZWFyICgwIC0gMzY1KSAqLyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7dG1faXNkc3Q7ICAgICAgIC8qIGlzIHN1bW1lciB0aW1lIGluIGVmZmVjdD8gKi8gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqdG1fem9uZTsgICAgICAgIC8qIGFiYnJldmlhdGlvbiBvZiB0aW1lem9uZSBuYW1lICovIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmxvbmc8L2I+Jm5ic3A7dG1fZ210b2ZmOyAgICAgIC8qIG9mZnNldCBmcm9tIFVUQyBpbiBzZWNvbmRzICovIDxiciAvPg0KK307DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitOb3RlIHRoYXQgd2UgcXVhbGlmaWVkIHRoZSBzdHJ1Y3R1cmUgPGk+PGI+dm9sYXRpbGU8L2I+PC9pPiBpbiB0aGUgZ1NPQVAgaGVhZGVyIGZpbGUgdG8gaW5mb3JtIHRoZSBnU09BUCBjb21waWxlciB0aGF0IGl0IHNob3VsZCBub3QgYXR0ZW1wdCB0byByZWRlY2xhcmUgaXQuDQorV2UgY2FuIG5vdyByZWFkaWx5IHNlcmlhbGl6ZSBhbmQgZGVzZXJpYWxpemUgdGhlIHRtIHN0cnVjdHVyZS4gVGhlIGZvbGxvd2luZyBwcm9ncmFtIGZyYWdtZW50IHNlcmlhbGl6ZXMgdGhlIGxvY2FsIHRpbWUgc3RvcmVkIGluIGEgdG0gc3RydWN0dXJlIHRvIHN0ZG91dDoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQordGltZV90IFQgPSB0aW1lKE5VTEwpOyA8YnIgLz4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7dG0gKnQgPSBsb2NhbHRpbWUoJmFtcDtUKTsgPGJyIC8+DQorPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAgPSBzb2FwX25ldygpOyA8YnIgLz4NCitzb2FwX3NldF9vbW9kZShzb2FwLCBTT0FQX1hNTF9HUkFQSCk7IC8vIGdvb2QgaGFiaXQgdG8gdXNlIHRoaXMgPGJyIC8+DQorc29hcF9iZWdpbl9zZW5kKHNvYXApOyA8YnIgLz4NCitzb2FwX3B1dF90bShzb2FwLCB0LCAibXlMb2NhbFRpbWUiLCBOVUxMKTsgPGJyIC8+DQorc29hcF9lbmRfc2VuZChzb2FwKTsgPGJyIC8+DQorc29hcF9lbmQoc29hcCk7IDxiciAvPg0KK3NvYXBfZG9uZShzb2FwKTsgPGJyIC8+DQorZnJlZShzb2FwKTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK0l0IGlzIGFsc28gcG9zc2libGUgdG8gc2VyaWFsaXplIHRoZSB0bSBmaWVsZHMgYXMgWE1MIGF0dHJpYnV0ZXMgdXNpbmcgdGhlDQorQHF1YWxpZmllciwgc2VlIFNlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOmF0dHJpYnV0ZXMiPjEwLjUuNzwvYT4uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0lmIHlvdSBtdXN0IHByb2R1Y2UgYSBzY2hlbWEgZmlsZSwgc2F5IDxpPnRpbWUueHNkPC9pPiwgdGhhdCBkZWZpbmVzIGFuIFhNTA0KK3NjaGVtYSBhbmQgbmFtZXNwYWNlIGZvciB0aGUgdG0gc3RydWN0LCB5b3UgY2FuIGFkZCBhIDxpPjxiPnR5cGVkZWY8L2I+PC9pPg0KK2RlY2xhcmF0aW9uIHRvIHRoZSBoZWFkZXIgZmlsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7dG0gdGltZV9fc3RydWN0X3RtOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorV2UgdXNlZCB0aGUgPGk+PGI+dHlwZWRlZjwvYj48L2k+IG5hbWUgPGk+dGltZV9fc3RydWN0X3RtPC9pPiByYXRoZXIgdGhhbiA8aT50aW1lX18NCit0bTwvaT4sIGJlY2F1c2UgYSBzY2hlbWEgbmFtZSBjbGFzaCB3aWxsIG9jY3VyIHdpdGggdGhlIGxhdHRlciBzaW5jZSB0YWtpbmcgb2ZmDQordGhlIDxpPnRpbWU8L2k+IHByZWZpeCB3aWxsIHJlc3VsdCBpbiB0aGUgc2FtZSBuYW1lIGJlaW5nIHVzZWQuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0NsYXNzZXMgc2hvdWxkIGJlIGRlY2xhcmVkIHZvbGF0aWxlIHRvIHByZXZlbnQgbW9kaWZpY2F0aW9uIG9mIHRoZXNlIGNsYXNzZXMgYnkgZ1NPQVAuDQorZ1NPQVAgYWRkcyBzZXJpYWxpemF0aW9uIG1ldGhvZHMgdG8gY2xhc3NlcyB0byBzdXBwb3J0IHBvbHltb3JwaGlzbS4gIEhvd2V2ZXIsDQordGhpcyBpcyBhIHByb2JsZW0gd2hlbiB5b3UgY2FuJ3QgbW9kaWZ5IGNsYXNzIGRlY2xhcmF0aW9ucyBiZWNhdXNlIHRoZXkgYXJlDQorcGFydCBvZiBhIG5vbi1tb2RpZmlhYmxlIHNvZnR3YXJlIHBhY2thZ2UuICBUaGUgc29sdXRpb24gaXMgdG8gZGVjbGFyZSB0aGVzZQ0KK2NsYXNzZXMgPGk+PGI+dm9sYXRpbGU8L2I+PC9pPiwgc2ltaWxhciB0byB0aGUgdG0gc3RydWN0dXJlIGV4YW1wbGUgaWxsdXN0cmF0ZWQgYWJvdmUuIA0KK1lvdSBjYW4gYWxzbyB1c2UgYSA8aT48Yj50eXBlZGVmPC9iPjwvaT4gdG8gYXNzb2NpYXRlIGEgc2NoZW1hIHdpdGggYSBjbGFzcy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCQkgICAgIDxoMz48YSBuYW1lPSJ0dGhfc0VjMTguNSI+DQorMTguNTwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+SG93IHRvIERlY2xhcmUgVXNlci1EZWZpbmVkIFNlcmlhbGl6ZXJzIGFuZCBEZXNlcmlhbGl6ZXJzPC9mb250PjwvaDM+PGEgbmFtZT0ic2VjOmV4dGVybiI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitVc2VycyBjYW4gZGVjbGFyZSB0aGVpciBvd24gKGRlKXNlcmlhbGl6ZXJzIGZvciBzcGVjaWZpYyBkYXRhIHR5cGVzIGluc3RlYWQgb2YgcmVseWluZyBvbiB0aGUgZ1NPQVAtZ2VuZXJhdGVkIChkZSlzZXJpYWxpemVycy4NCitUbyBkZWNsYXJlIGEgZXh0ZXJuYWwgKGRlKXNlcmlhbGl6ZXIsIGRlY2xhcmUgYSB0eXBlIHdpdGggPGk+PGI+ZXh0ZXJuPC9iPiZuYnNwOzxiPnR5cGVkZWY8L2I+PC9pPi4gZ1NPQVAgd2lsbCBub3QgZ2VuZXJhdGUgdGhlIChkZSlzZXJpYWxpemVycw0KK2ZvciB0aGUgdHlwZSBuYW1lIHRoYXQgaXMgZGVjbGFyZWQuIEZvciBleGFtcGxlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5leHRlcm48L2I+Jm5ic3A7PGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypNeURhdGE7IDxiciAvPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtTYW1wbGUgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtNeURhdGEgczsgLy8gdXNlIHVzZXItZGVmaW5lZCAoZGUpc2VyaWFsaXplciBmb3IgdGhpcyBmaWVsZCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyp0OyAvLyB1c2UgZ1NPQVAgKGRlKXNlcmlhbGl6ZXIgZm9yIHRoaXMgZmllbGQgPGJyIC8+DQorfTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoZSB1c2VyIGlzIHJlcXVpcmVkIHRvIHN1cHBseSB0aGUgZm9sbG93aW5nIHJvdXRpbmVzIGZvciBlYWNoIDxpPjxiPmV4dGVybjwvYj4mbmJzcDs8Yj50eXBlZGVmPC9iPjwvaT4nZWQgbmFtZSA8dT5UPC91PjoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+dm9pZDwvYj4mbmJzcDtzb2FwX3NlcmlhbGl6ZV88dT48c3BhbiBjbGFzcz0icm9tYW4iPlQ8L3NwYW4+PC91Pig8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgPGI+Y29uc3Q8L2I+Jm5ic3A7PHU+PHNwYW4gY2xhc3M9InJvbWFuIj5UPC9zcGFuPjwvdT4gKmEpIDxiciAvPg0KKzxiPnZvaWQ8L2I+Jm5ic3A7c29hcF9kZWZhdWx0Xzx1PjxzcGFuIGNsYXNzPSJyb21hbiI+VDwvc3Bhbj48L3U+KDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8dT48c3BhbiBjbGFzcz0icm9tYW4iPlQ8L3NwYW4+PC91PiAqYSkgPGJyIC8+DQorPGI+dm9pZDwvYj4mbmJzcDtzb2FwX291dF88dT48c3BhbiBjbGFzcz0icm9tYW4iPlQ8L3NwYW4+PC91Pig8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqdGFnLCA8Yj5pbnQ8L2I+Jm5ic3A7aWQsIDxiPmNvbnN0PC9iPiZuYnNwOzx1PjxzcGFuIGNsYXNzPSJyb21hbiI+VDwvc3Bhbj48L3U+ICphLCA8Yj5jb25zdDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyp0eXBlKSA8YnIgLz4NCis8dT48c3BhbiBjbGFzcz0icm9tYW4iPlQ8L3NwYW4+PC91PiAqc29hcF9pbl88dT48c3BhbiBjbGFzcz0icm9tYW4iPlQ8L3NwYW4+PC91Pig8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqdGFnLCA8dT48c3BhbiBjbGFzcz0icm9tYW4iPlQ8L3NwYW4+PC91PiAqYSwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqdHlwZSkgDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgZnVuY3Rpb24gcHJvdG90eXBlcyBjYW4gYmUgZm91bmQgaW4gPGk+c29hcEguaDwvaT4uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0ZvciBleGFtcGxlLCB0aGUgKGRlKXNlcmlhbGl6YXRpb24gb2YgPGk+TXlEYXRhPC9pPiBjYW4gYmUgZG9uZSB3aXRoIHRoZSBmb2xsb3dpbmcgY29kZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+dm9pZDwvYj4mbmJzcDtzb2FwX3NlcmlhbGl6ZV9NeURhdGEoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIE15RGF0YSAqPGI+Y29uc3Q8L2I+KmEpIDxiciAvPg0KK3sgfSAvLyBubyBuZWVkIHRvIG1hcmsgdGhpcyBub2RlIChmb3IgbXVsdGktcmVmIGFuZCBjeWNsZSBkZXRlY3Rpb24pIDxiciAvPg0KKzxiPnZvaWQ8L2I+Jm5ic3A7c29hcF9kZWZhdWx0X015RGF0YSgmYW1wO3NvYXAsIE15RGF0YSAqKmEpIDxiciAvPg0KK3sgKmEgPSBOVUxMIH0gPGJyIC8+DQorPGI+dm9pZDwvYj4mbmJzcDtzb2FwX291dF9NeURhdGEoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KnRhZywgPGI+aW50PC9iPiZuYnNwO2lkLCBNeURhdGEgKjxiPmNvbnN0PC9iPiphLCA8Yj5jb25zdDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyp0eXBlKSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBpZCwgdHlwZSk7IC8vIHByaW50IFhNTCBiZWdpbm5pbmcgdGFnIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfc2VuZChzb2FwLCAqYSk7IC8vIGp1c3QgcHJpbnQgdGhlIHN0cmluZyAobm8gWE1MIGNvbnZlcnNpb24pIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7IC8vIHByaW50IFhNTCBlbmRpbmcgdGFnIDxiciAvPg0KK30gPGJyIC8+DQorTXlEYXRhICoqc29hcF9pbl9NeURhdGEoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KnRhZywgTXlEYXRhICoqYSwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqdHlwZSkgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZykpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDtOVUxMOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoIWEpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2EgPSAoTXlEYXRhKiopc29hcF9tYWxsb2Moc29hcCwgPGI+c2l6ZW9mPC9iPihNeURhdGEqKSk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyhzb2FwPHR0Pi0mZ3Q7PC90dD5udWxsKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsqYSA9IE5VTEw7IC8vIHhzaTpuaWwgZWxlbWVudCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoKnNvYXA8dHQ+LSZndDs8L3R0PnR5cGUgJmFtcDsmYW1wOyBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwPHR0Pi0mZ3Q7PC90dD50eXBlLCB0eXBlKSkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwPHR0Pi0mZ3Q7PC90dD5lcnJvciA9IFNPQVBfVFlQRTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cmV0dXJuPC9iPiZuYnNwO05VTEw7IC8vIHR5cGUgbWlzbWF0Y2ggPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoKnNvYXA8dHQ+LSZndDs8L3R0PmhyZWYpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2EgPSAoTXlEYXRhKiopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXA8dHQ+LSZndDs8L3R0PmhyZWYsIGEsIFNPQVBfTXlEYXRhLCA8Yj5zaXplb2Y8L2I+KE15RGF0YSopKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5lbHNlPC9iPiZuYnNwOzxiPmlmPC9iPiZuYnNwOyhzb2FwPHR0Pi0mZ3Q7PC90dD5ib2R5KSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KnMgPSBzb2FwX3ZhbHVlKHNvYXApOyAvLyBmaWxsIGJ1ZmZlciA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsqYSA9ICg8Yj5jaGFyPC9iPiopc29hcF9tYWxsb2Moc29hcCwgc3RybGVuKHMpKzEpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzdHJjcHkoKmEsIHMpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt9IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyhzb2FwPHR0Pi0mZ3Q7PC90dD5ib2R5ICZhbXA7JmFtcDsgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7TlVMTDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cmV0dXJuPC9iPiZuYnNwO2E7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitNb3JlIGluZm9ybWF0aW9uIG9uIGN1c3RvbSAoZGUpc2VyaWFsaXphdGlvbiB3aWxsIGJlIHByb3ZpZGVkIGluIHRoaXMgZG9jdW1lbnQgb3IgaW4gYSBzZXBhcmF0ZSBkb2N1bWVudCBpbiB0aGUgZnV0dXJlLg0KK1RoZSB3cml0aW5nIG9mIHRoZSAoZGUpc2VyaWFsaXplciBjb2RlIHJlcXVpcmVzIHRoZSB1c2Ugb2YgdGhlIGxvdy1sZXZlbCBnU09BUCBBUEkuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkJICAgICA8aDM+PGEgbmFtZT0idHRoX3NFYzE4LjYiPg0KKzE4LjY8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPkhvdyB0byBTZXJpYWxpemUgRGF0YSBXaXRob3V0IEdlbmVyYXRpbmcgWFNEIFR5cGUgQXR0cmlidXRlczwvZm9udD48L2gzPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitnU09BUCBzZXJpYWxpemVzIGRhdGEgaW4gWE1MIHdpdGggPHR0PnhzaTp0eXBlPC90dD4gYXR0cmlidXRlcyB3aGVuIHRoZSB0eXBlcyBhcmUNCitkZWNsYXJlZCB3aXRoIG5hbWVzcGFjZSBwcmVmaXhlcyB0byBpbmRpY2F0ZSB0aGUgc2NoZW1hIHR5cGUgb2YgdGhlIGRhdGENCitjb250YWluZWQgaW4gdGhlIGVsZW1lbnRzLiBTT0FQIDEuMSBhbmQgMS4yIHJlcXVpcmVzIDx0dD54c2k6dHlwZTwvdHQ+IGF0dHJpYnV0ZXMNCitpbiB0aGUgcHJlc2VuY2Ugb2YgcG9seW1vcnBoaWMgZGF0YSBvciB3aGVuIHRoZSB0eXBlIG9mIHRoZSBkYXRhIGNhbm5vdCBiZQ0KK2RlZHVjZWQgZnJvbSB0aGUgU09BUCBwYXlsb2FkLiAgVGhlIG5hbWVzcGFjZSBwcmVmaXhlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZQ0KK3R5cGUgbmFtZXMgb2YgPGk+PGI+dHlwZWRlZjwvYj48L2k+cyAoU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6cHJpbWl0aXZlIj4xMC4yPC9hPikgZm9yIHByaW1pdGl2ZSBkYXRhDQordHlwZXMsIDxpPjxiPnN0cnVjdDwvYj48L2k+LzxpPmNsYXNzPC9pPiBuYW1lcywgYW5kIDxpPjxiPmVudW08L2I+PC9pPiBuYW1lcy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVG8gcHJldmVudCB0aGUgb3V0cHV0IG9mIHRoZXNlIDx0dD54c2k6dHlwZTwvdHQ+IGF0dHJpYnV0ZXMgaW4gdGhlIFhNTA0KK3NlcmlhbGl6YXRpb24sIHlvdSBjYW4gc2ltcGx5IHVzZSB0eXBlIGRlY2xhcmF0aW9ucyB0aGF0IGRvIG5vdCBpbmNsdWRlIHRoZXNlDQorbmFtZXNwYWNlIHByZWZpeGVzLiAgVGhhdCBpcywgZG9uJ3QgdXNlIHRoZSA8aT48Yj50eXBlZGVmPC9iPjwvaT5zIGZvciBwcmltaXRpdmUgdHlwZXMNCithbmQgdXNlIHVucXVhbGlmaWVkIHR5cGUgbmFtZXMgd2l0aCA8aT48Yj5zdHJ1Y3Q8L2I+PC9pPnMsIDxpPjxiPmNsYXNzPC9iPjwvaT5lcywgYW5kDQorPGk+ZW51bTwvaT5zLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitIb3dldmVyLCB0aGVyZSBhcmUgdHdvIGlzc3Vlcy4gIEZpcnN0bHksIGlmIHlvdSB3YW50IHRvIHVzZSBhIHByaW1pdGl2ZSBzY2hlbWENCit0eXBlIHRoYXQgaGFzIG5vIEMvQysrIGNvdW50ZXJwYXJ0LCB5b3UgbXVzdCBkZWNsYXJlIGl0IGFzIGEgPGk+PGI+dHlwZWRlZjwvYj48L2k+DQorbmFtZSB3aXRoIGEgbGVhZGluZyB1bmRlcnNjb3JlLCBhcyBpbjoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+dHlwZWRlZjwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypfeHNkX19kYXRlOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhpcyB3aWxsIHByb2R1Y2UgdGhlIG5lY2Vzc2FyeSA8dHQ+eHNkOmRhdGU8L3R0PiBpbmZvcm1hdGlvbiBpbiB0aGUgV1NETCBvdXRwdXQNCitieSB0aGUgZ1NPQVAgY29tcGlsZXIuICBCdXQgdGhlIFhNTCBzZXJpYWxpemF0aW9uIG9mIHRoaXMgdHlwZSBhdCBydW4gdGltZQ0KK3dvbid0IGluY2x1ZGUgdGhlIDx0dD54c2k6dHlwZTwvdHQ+IGF0dHJpYnV0ZS4gIFNlY29uZGx5LCB0byBpbmNsdWRlIHRoZSBwcm9wZXINCitzY2hlbWEgZGVmaW5pdGlvbnMgaW4gdGhlIFdTREwgcHJvZHVjZWQgYnkgdGhlIGdTT0FQIGNvbXBpbGVyLCB5b3Ugc2hvdWxkDQordXNlIHF1YWxpZmllZCA8aT48Yj5zdHJ1Y3Q8L2I+PC9pPiwgPGk+PGI+Y2xhc3M8L2I+PC9pPiwgYW5kIDxpPjxiPmVudW08L2I+PC9pPiBuYW1lcyB3aXRoIGEgbGVhZGluZw0KK3VuZGVyc2NvcmUsIGFzIGluOiANCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+c3RydWN0PC9iPiZuYnNwO19uc19fbXlTdHJ1Y3QgPGJyIC8+DQoreyAuLi4gfTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoaXMgZW5zdXJlcyB0aGF0IDxpPm15U3RydWN0PC9pPiBpcyBhc3NvY2lhdGVkIHdpdGggYSBzY2hlbWEsIGFuZCB0aGVyZWZvcmUNCitpbmNsdWRlZCBpbiB0aGUgYXBwcm9wcmlhdGUgc2NoZW1hIGluIHRoZSBnZW5lcmF0ZWQgV1NETC4gIFRoZSBsZWFkaW5nDQordW5kZXJzY29yZSBwcmV2ZW50cyB0aGUgWE1MIHNlcmlhbGl6YXRpb24gb2YgPHR0PnhzaTp0eXBlPC90dD4gYXR0cmlidXRlcyBmb3IgdGhpcw0KK3R5cGUgaW4gdGhlIFNPQVAvWE1MIHBheWxvYWQuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkJICAgICA8aDM+PGEgbmFtZT0idHRoX3NFYzE4LjciPg0KKzE4Ljc8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPkZ1bmN0aW9uIENhbGxiYWNrcyBmb3IgQ3VzdG9taXplZCBJL08gYW5kIEhUVFAgSGFuZGxpbmc8L2ZvbnQ+PC9oMz48YSBuYW1lPSJzZWM6Y2FsbGJhY2siPg0KKzwvYT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorZ1NPQVAgcHJvdmlkZXMgZml2ZSBjYWxsYmFjayBmdW5jdGlvbnMgZm9yIGN1c3RvbWl6ZWQgSS9PIGFuZCBIVFRQIGhhbmRsaW5nOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKw0KKzx0YWJsZT4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPjxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5DYWxsYmFjayAoZnVuY3Rpb24gcG9pbnRlcik8L2I+PC9mb250PiA8L3RkPjwvdHI+DQorPHRyPjx0ZCB3aWR0aD0iNjAyIj48aT48Yj5pbnQ8L2I+Jm5ic3A7KCpzb2FwLmZvcGVuKSg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqZW5kcG9pbnQsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7Kmhvc3QsIDxiPmludDwvYj4mbmJzcDtwb3J0KTwvaT4gPC90ZD48L3RyPg0KKzx0cj48dGQgd2lkdGg9IjYwMiI+Q2FsbGVkIGZyb20gYSBjbGllbnQgcHJveHkgdG8gb3BlbiBhIGNvbm5lY3Rpb24gdG8gYSBXZWIgU2VydmljZSBsb2NhdGVkIGF0IDxpPmVuZHBvaW50PC9pPi4NCitJbnB1dCBwYXJhbWV0ZXJzIDxpPmhvc3Q8L2k+IGFuZCA8aT5wb3J0PC9pPiBhcmUgbWljcm8tcGFyc2VkIGZyb20gPGk+ZW5kcG9pbnQ8L2k+Lg0KK1Nob3VsZCByZXR1cm4gYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IsIG9yIDxpPlNPQVBfSU5WQUxJRF9TT0NLRVQ8L2k+IGFuZCA8aT5zb2FwPC9pPjx0dD4tJmd0OzwvdHQ+PGk+ZXJyb3I8L2k+IHNldCB0byBhbiBlcnJvciBjb2RlLg0KK0J1aWx0LWluIGdTT0FQIGZ1bmN0aW9uOiA8aT50Y3BfY29ubmVjdDwvaT4NCis8L3RkPjwvdHI+DQorPHRyPjx0ZCB3aWR0aD0iNjAyIj48aT48Yj5pbnQ8L2I+Jm5ic3A7KCpzb2FwLmZnZXQpKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwKTwvaT4gPC90ZD48L3RyPg0KKzx0cj48dGQgd2lkdGg9IjYwMiI+Q2FsbGVkIGJ5IHRoZSBtYWluIHNlcnZlciBsb29wIHVwb24gYW4gSFRUUCBHRVQgcmVxdWVzdC4gVGhlIDxpPlNPQVBfR0VUX01FVEhPRDwvaT4gZXJyb3IgaXMgcmV0dXJuZWQgYnkgdGhlIGRlZmF1bHQgPGk+ZmdldDwvaT4gcm91dGluZS4gVGhpcyBjYWxsYmFjayBjYW4gYmUgdXNlZCB0byByZXNwb25kIHRvIEhUVFAgR0VUIG1ldGhvZHMgd2l0aCBjb250ZW50LCBzZWUgU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6Z2V0Ij4xOC4xMDwvYT4uDQorU2hvdWxkIHJldHVybiA8aT5TT0FQX09LPC9pPiwgb3IgYSBnU09BUCBlcnJvciBjb2RlLg0KK0J1aWx0LWluIGdTT0FQIGZ1bmN0aW9uOiA8aT5odHRwX2dldDwvaT4NCis8L3RkPjwvdHI+DQorPHRyPjx0ZCB3aWR0aD0iNjAyIj48aT48Yj5pbnQ8L2I+Jm5ic3A7KCpzb2FwLmZmb3JtKSg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCk8L2k+IDwvdGQ+PC90cj4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPkNhbGxlZCBieSB0aGUgbWFpbiBzZXJ2ZXIgbG9vcCB3aGVuIGEgdXNlci1kZWZpbmVkIDxpPmZwYXJzZWhkcjwvaT4gY2FsbGJhY2sgcmV0dXJuZWQgPGk+U09BUF9GT1JNPC9pPiB0byBzaWduYWwgdGhhdCB0aGUgSFRUUCBib2R5IG11c3QgYmUgcHJvY2Vzc2VkIGJ5IHRoaXMgZm9ybSBoYW5kbGVyIGNhbGxiYWNrLiBUaGUgSFRUUCBQT1NUIGZvcm0gZGF0YSBNVVNUIGJlIHJlYWQsIG90aGVyd2lzZSBrZWVwLWFsaXZlIG1lc3NhZ2VzIHdpbGwgZW5kIHVwIG91dCBvZiBzeW5jLg0KK1Nob3VsZCByZXR1cm4gPGk+U09BUF9PSzwvaT4gb3IgYSBnU09BUCBlcnJvciBjb2RlLg0KK0J1aWx0LWluIGdTT0FQIGZ1bmN0aW9uOiBub25lLg0KKzwvdGQ+PC90cj4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPjxpPjxiPmludDwvYj4mbmJzcDsoKnNvYXAuZnBvc3QpKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj5jb25zdDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyplbmRwb2ludCwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqaG9zdCwgPGI+aW50PC9iPiZuYnNwO3BvcnQsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KnBhdGgsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KmFjdGlvbiwgc2l6ZV90IGNvdW50KTwvaT4gPC90ZD48L3RyPg0KKzx0cj48dGQgd2lkdGg9IjYwMiI+Q2FsbGVkIGZyb20gYSBjbGllbnQgcHJveHkgdG8gZ2VuZXJhdGUgdGhlIEhUVFAgaGVhZGVyIHRvIGNvbm5lY3QgdG8gPGk+ZW5kcG9pbnQ8L2k+Lg0KK0lucHV0IHBhcmFtZXRlcnMgPGk+aG9zdDwvaT4sIDxpPnBvcnQ8L2k+LCBhbmQgPGk+cGF0aDwvaT4gYXJlIG1pY3JvLXBhcnNlZCBmcm9tIDxpPmVuZHBvaW50PC9pPiwgPGk+YWN0aW9uPC9pPiBpcyB0aGUgU09BUCBhY3Rpb24sDQorYW5kIDxpPmNvdW50PC9pPiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBTT0FQIG1lc3NhZ2Ugb3IgMCB3aGVuIDxpPlNPQVBfRU5DX1hNTDwvaT4gaXMgc2V0IG9yIHdoZW4gPGk+U09BUF9JT19MRU5HVEg8L2k+IGlzIHJlc2V0Lg0KK1VzZSBmdW5jdGlvbiA8aT5zb2FwX3NlbmQoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIDxiPmNoYXI8L2I+Jm5ic3A7KnMpPC9pPiB0byB3cml0ZSB0aGUgaGVhZGVyIGNvbnRlbnRzLg0KK1Nob3VsZCByZXR1cm4gU09BUF9PSywgb3IgYSBnU09BUCBlcnJvciBjb2RlLg0KK0J1aWx0LWluIGdTT0FQIGZ1bmN0aW9uOiA8aT5odHRwX3Bvc3Q8L2k+Lg0KKzwvdGQ+PC90cj4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPjxpPjxiPmludDwvYj4mbmJzcDsoKnNvYXAuZnBvc3RoZHIpKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj5jb25zdDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyprZXksIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KnZhbCk8L2k+IDwvdGQ+PC90cj4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPkNhbGxlZCBieSA8aT5odHRwX3Bvc3Q8L2k+IGFuZCA8aT5odHRwX3Jlc3BvbnNlPC9pPiAodGhyb3VnaCB0aGUgY2FsbGJhY2tzKS4NCitFbWl0cyBIVFRQIDxpPmtleTwvaT46IDxpPnZhbDwvaT4gaGVhZGVyIGVudHJpZXMuDQorU2hvdWxkIHJldHVybiBTT0FQX09LLCBvciBhIGdTT0FQIGVycm9yIGNvZGUuDQorQnVpbHQtaW4gZ1NPQVAgZnVuY3Rpb246IDxpPmh0dHBfcG9zdF9oZWFkZXI8L2k+Lg0KKzwvdGQ+PC90cj4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPjxpPjxiPmludDwvYj4mbmJzcDsoKnNvYXAuZnJlc3BvbnNlKSg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgPGI+aW50PC9iPiZuYnNwO3NvYXBfZXJyb3JfY29kZSwgc2l6ZV90IGNvdW50KTwvaT4gPC90ZD48L3RyPg0KKzx0cj48dGQgd2lkdGg9IjYwMiI+Q2FsbGVkIGZyb20gYSBzZXJ2aWNlIHRvIGdlbmVyYXRlIHRoZSByZXNwb25zZSBIVFRQIGhlYWRlci4NCitJbnB1dCBwYXJhbWV0ZXIgPGk+c29hcF9lcnJvcl9jb2RlPC9pPiBpcyBhIGdTT0FQIGVycm9yIGNvZGUgKHNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzplcnJjb2RlcyI+OS4yPC9hPiBhbmQNCis8aT5jb3VudDwvaT4gaXMgdGhlIGxlbmd0aCBvZiB0aGUgU09BUCBtZXNzYWdlIG9yIDAgd2hlbiA8aT5TT0FQX0VOQ19YTUw8L2k+IGlzIHNldCBvciB3aGVuIDxpPlNPQVBfSU9fTEVOR1RIPC9pPiBpcyByZXNldC4NCitVc2UgZnVuY3Rpb24gPGk+c29hcF9zZW5kKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj5jaGFyPC9iPiZuYnNwOypzKTwvaT4gdG8gd3JpdGUgdGhlIGhlYWRlciBjb250ZW50cy4NCitTaG91bGQgcmV0dXJuIFNPQVBfT0ssIG9yIGEgZ1NPQVAgZXJyb3IgY29kZQ0KK0J1aWx0LWluIGdTT0FQIGZ1bmN0aW9uOiA8aT5odHRwX3Jlc3BvbnNlPC9pPg0KKzwvdGQ+PC90cj4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPjxpPjxiPmludDwvYj4mbmJzcDsoKnNvYXAuZnBhcnNlKSg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCk8L2k+IDwvdGQ+PC90cj4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPkNhbGxlZCBieSBjbGllbnQgcHJveHkgYW5kIHNlcnZpY2UgdG8gcGFyc2UgYW4gSFRUUCBoZWFkZXIgKGlmIHByZXNlbnQpLg0KK1doZW4gdXNlci1kZWZpbmVkLCB0aGlzIHJvdXRpbmUgbXVzdCBhdCBsZWFzdCBza2lwIHRoZSBoZWFkZXIuDQorVXNlIGZ1bmN0aW9uIDxpPjxiPmludDwvYj4mbmJzcDtzb2FwX2dldGxpbmUoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIDxiPmNoYXI8L2I+Jm5ic3A7KmJ1ZiwgPGI+aW50PC9iPiZuYnNwO2xlbik8L2k+IHRvIHJlYWQgSFRUUCBoZWFkZXIgbGluZXMgaW50bw0KK2EgYnVmZmVyIDxpPmJ1ZjwvaT4gb2YgbGVuZ3RoIDxpPmxlbjwvaT4gKHJldHVybnMgZW1wdHkgbGluZSBhdCBlbmQgb2YgSFRUUCBoZWFkZXIpLg0KK1Nob3VsZCByZXR1cm4gPGk+U09BUF9PSzwvaT4sIG9yIGEgZ1NPQVAgZXJyb3IgY29kZS4NCitCdWlsdC1pbiBnU09BUCBmdW5jdGlvbjogPGk+aHR0cF9wYXJzZTwvaT4NCis8L3RkPjwvdHI+DQorPHRyPjx0ZCB3aWR0aD0iNjAyIj48aT48Yj5pbnQ8L2I+Jm5ic3A7KCpzb2FwLmZwYXJzZWhkcikoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KmtleSwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqdmFsKTwvaT4gPC90ZD48L3RyPg0KKzx0cj48dGQgd2lkdGg9IjYwMiI+Q2FsbGVkIGJ5IDxpPmh0dHBfcGFyc2U8L2k+ICh0aHJvdWdoIHRoZSA8aT5mcGFyc2U8L2k+IGNhbGxiYWNrKS4NCitIYW5kbGVzIEhUVFAgPGk+a2V5PC9pPjogPGk+dmFsPC9pPiBoZWFkZXIgZW50cmllcyB0byBzZXQgZ1NPQVAncyBpbnRlcm5hbHMuDQorU2hvdWxkIHJldHVybiA8aT5TT0FQX09LPC9pPiwgPGk+U09BUF9TVE9QPC9pPiAoc2VlIDxpPmZzdG9wPC9pPikgb3IgYSBnU09BUCBlcnJvciBjb2RlLg0KK0J1aWx0LWluIGdTT0FQIGZ1bmN0aW9uOiA8aT5odHRwX3BhcnNlX2hlYWRlcjwvaT4NCis8L3RkPjwvdHI+DQorPHRyPjx0ZCB3aWR0aD0iNjAyIj48aT48Yj5pbnQ8L2I+Jm5ic3A7KCpzb2FwLmZjbG9zZSkoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXApPC9pPiA8L3RkPjwvdHI+DQorPHRyPjx0ZCB3aWR0aD0iNjAyIj5DYWxsZWQgYnkgY2xpZW50IHByb3h5IDxiPm11bHRpcGxlIHRpbWVzPC9iPiwgdG8gY2xvc2UgYSBzb2NrZXQgY29ubmVjdGlvbiBiZWZvcmUgYSBuZXcgc29ja2V0DQorY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCBhbmQgYXQgdGhlIGVuZCBvZiBjb21tdW5pY2F0aW9ucyB3aGVuIHRoZSA8aT5TT0FQX0lPX0tFRVBBTElWRTwvaT4gZmxhZyBpcyBub3Qgc2V0DQorYW5kIDxpPnNvYXAua2VlcF9hbGl2ZTwvaT4gPGZvbnQgZmFjZT0ic3ltYm9sIj65PC9mb250DQorPiAwIChpbmRpY2F0aW5nIHRoYXQgdGhlIG90aGVyIHBhcnR5IHN1cHBvcnRzIGtlZXAgYWxpdmUpLg0KK1Nob3VsZCByZXR1cm4gU09BUF9PSywgb3IgYSBnU09BUCBlcnJvciBjb2RlLg0KK0J1aWx0LWluIGdTT0FQIGZ1bmN0aW9uOiA8aT50Y3BfZGlzY29ubmVjdDwvaT4NCis8L3RkPjwvdHI+DQorPHRyPjx0ZCB3aWR0aD0iNjAyIj48aT48Yj5pbnQ8L2I+Jm5ic3A7KCpzb2FwLmZzZW5kKSg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqcywgc2l6ZV90IG4pPC9pPiA8L3RkPjwvdHI+DQorPHRyPjx0ZCB3aWR0aD0iNjAyIj5DYWxsZWQgZm9yIGFsbCBzZW5kIG9wZXJhdGlvbnMgdG8gZW1pdCBjb250ZW50cyBvZiA8aT5zPC9pPiBvZiBsZW5ndGggPGk+bjwvaT4uDQorU2hvdWxkIHJldHVybiBTT0FQX09LLCBvciBhIGdTT0FQIGVycm9yIGNvZGUuDQorQnVpbHQtaW4gZ1NPQVAgZnVuY3Rpb246IDxpPmZzZW5kPC9pPg0KKzwvdGQ+PC90cj4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPjxpPnNpemVfdCAoKnNvYXAuZnJlY3YpKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj5jaGFyPC9iPiZuYnNwOypzLCBzaXplX3Qgbik8L2k+IDwvdGQ+PC90cj4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPkNhbGxlZCBmb3IgYWxsIHJlY2VpdmUgb3BlcmF0aW9ucyB0byBmaWxsIGJ1ZmZlciA8aT5zPC9pPiBvZiBtYXhpbXVtIGxlbmd0aCA8aT5uPC9pPi4NCitTaG91bGQgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvciAwIGluIGNhc2Ugb2YgYW4gZXJyb3IsIGUuZy4mbmJzcDtFT0YuDQorQnVpbHQtaW4gZ1NPQVAgZnVuY3Rpb246IDxpPmZyZWN2PC9pPg0KKzwvdGQ+PC90cj4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPjxpPjxiPmludDwvYj4mbmJzcDsoKnNvYXAuZmlnbm9yZSkoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KnRhZyk8L2k+IDwvdGQ+PC90cj4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPkNhbGxlZCB3aGVuIGFuIHVua25vd24gWE1MIGVsZW1lbnQgd2FzIGVuY291bnRlcmVkIG9uIHRoZSBpbnB1dC4gVGhlIDxpPnRhZzwvaT4gcGFyYW1ldGVyIGlzIHRoZSBvZmZlbmRpbmcgWE1MIGVsZW1lbnQgdGFnIG5hbWUuDQorU2hvdWxkIHJldHVybiA8aT5TT0FQX09LPC9pPiwgb3IgYSBnU09BUCBlcnJvciBjb2RlIHN1Y2ggYXMgPGk+U09BUF9UQUdfTUlTTUFUQ0g8L2k+IHRvIHRocm93IGFuIGV4Y2VwdGlvbi4NCitCdWlsdC1pbiBnU09BUCBmdW5jdGlvbjogbm9uZS4NCis8L3RkPjwvdHI+DQorPHRyPjx0ZCB3aWR0aD0iNjAyIj48aT48Yj5pbnQ8L2I+Jm5ic3A7KCpzb2FwLmZjb25uZWN0KSg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqZW5kcG9pbnQsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7Kmhvc3QsIDxiPmludDwvYj4mbmJzcDtwb3J0KTwvaT4gPC90ZD48L3RyPg0KKzx0cj48dGQgd2lkdGg9IjYwMiI+V2hlbiBub24tTlVMTCwgdGhpcyBjYWxsYmFjayBpcyBjYWxsZWQgZm9yIGFsbCBjbGllbnQtdG8tc2VydmVyIGNvbm5lY3Qgb3BlcmF0aW9ucyBpbnN0ZWFkIG9mIHRoZSBidWlsdC1pbiBzb2NrZXQgY29ubmVjdCBjb2RlLiBUaGVyZWZvcmUsIGl0IGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBidWlsdC1pbiBjb25uZWN0aW9uIGVzdGFibGlzaG1lbnQuIFBhcmFtZXRlciA8aT5lbmRwb2ludDwvaT4gY29udGFpbnMgdGhlIHNlcnZlciBlbmRwb2ludCBVUkwsIDxpPmhvc3Q8L2k+IHRoZSBkb21haW4gbmFtZSBvciBJUCwgYW5kIDxpPnBvcnQ8L2k+IHRoZSBwb3J0IG51bWJlci4NCitTaG91bGQgcmV0dXJuIFNPQVBfT0ssIG9yIGEgZ1NPQVAgZXJyb3IgY29kZS4NCitCdWlsdC1pbiBnU09BUCBmdW5jdGlvbjogbm9uZQ0KKzwvdGQ+PC90cj4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPjxpPjxiPmludDwvYj4mbmJzcDsoKnNvYXAuZmFjY2VwdCkoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIDxiPnN0cnVjdDwvYj4mbmJzcDtzb2NrYWRkciAqYSwgPGI+aW50PC9iPiZuYnNwOypuKTwvaT4gPC90ZD48L3RyPg0KKzx0cj48dGQgd2lkdGg9IjYwMiI+Q2FsbGVkIGJ5IDxpPnNvYXBfYWNjZXB0PC9pPi4gVGhpcyBpcyBhIHdyYXBwZXIgcm91dGluZSBmb3IgPGk+YWNjZXB0PC9pPi4NCitTaG91bGQgcmV0dXJuIGEgdmFsaWQgc29ja2V0IGRlc2NyaXB0b3Igb3IgPGk+U09BUF9JTlZBTElEX1NPQ0tFVDwvaT4gYW5kIHNldCA8aT5zb2FwPC9pPjx0dD4tJmd0OzwvdHQ+PGk+ZXJyb3I8L2k+IHRvIGFuIGVycm9yIGNvZGUuDQorQnVpbHQtaW4gZ1NPQVAgZnVuY3Rpb246IDxpPnRjcF9hY2NlcHQ8L2k+DQorPC90ZD48L3RyPg0KKzx0cj48dGQgd2lkdGg9IjYwMiI+PGk+PGI+aW50PC9iPiZuYnNwOygqc29hcC5mcmVzb2x2ZSkoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KmFkZHIsIDxiPnN0cnVjdDwvYj4mbmJzcDtpbl9hZGRyICppbmFkZHIpPC9pPiA8L3RkPjwvdHI+DQorPHRyPjx0ZCB3aWR0aD0iNjAyIj5DYWxsZWQgYnkgPGk+c29hcF9iaW5kPC9pPiBpZiBhIGhvc3QgbmFtZSBpcyBnaXZlbiBhbmQgPGk+c29hcF9jb25uZWN0PC9pPiB0byByZXNvbHZlIGEgZG9tYWluIG5hbWUgPGk+YWRkcjwvaT4uDQorU2hvdWxkIHNldCA8aT5pbl9hZGRyICphPC9pPiBhbmQgcmV0dXJuIDxpPlNPQVBfT0s8L2k+IG9yIHJldHVybiA8aT5TT0FQX0VSUjwvaT4gdXBvbiBmYWlsdXJlLg0KKzwvdGQ+PC90cj4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPkJ1aWx0LWluIGdTT0FQIGZ1bmN0aW9uOiA8aT50Y3BfZ2V0aG9zdDwvaT4gPC90ZD48L3RyPg0KKzx0cj48dGQgd2lkdGg9IjYwMiI+PGk+PGI+aW50PC9iPiZuYnNwOygqc29hcC5mcG9sbCkoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXApPC9pPiA8L3RkPjwvdHI+DQorPHRyPjx0ZCB3aWR0aD0iNjAyIj5Vc2VkIGJ5IGNsaWVudHMgdG8gY2hlY2sgaWYgdGhlIHNlcnZlciBpcyBzdGlsbCByZXNwb25zaXZlLg0KKzwvdGQ+PC90cj4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPkJ1aWx0LWluIGdTT0FQIGZ1bmN0aW9uOiA8aT5zb2FwX3BvbGw8L2k+IDwvdGQ+PC90cj4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPjxpPjxiPmludDwvYj4mbmJzcDsoKnNvYXAuZnNlcnZlbG9vcCkoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXApPC9pPiA8L3RkPjwvdHI+DQorPHRyPjx0ZCB3aWR0aD0iNjAyIj5DYWxsZWQgYWZ0ZXIgc3VjY2Vzc2Z1bCBpbnZvY2F0aW9uIG9mIGEgc2VydmVyIG9wZXJhdGlvbiBpbiB0aGUgc2VydmVyIGxvb3AsIGltbWVkaWF0ZWx5IGFmdGVyIHNlbmRpbmcgdGhlIHJlc3BvbnNlIHRvIGEgY2xpZW50Lg0KK0NhbiBiZSB1c2VkIHRvIGNsZWFuIHVwIHJlc291cmNlcyAoZS5nLiZuYnNwO3VzaW5nIDxpPnNvYXBfZW5kKCk8L2k+KSB3aGlsZSBzZXJ2aW5nIGEgbG9uZyBzZXF1ZW5jZSBvZiBrZWVwLWFsaXZlIGNvbm5lY3Rpb25zLg0KK1Nob3VsZCByZXR1cm4gPGk+U09BUF9PSzwvaT4sIG9yIHNldCA8aT5zb2FwPC9pPjx0dD4tJmd0OzwvdHQ+PGk+ZXJyb3I8L2k+IHRvIGEgZ1NPQVAgZXJyb3IgY29kZSBhbmQgcmV0dXJuIDxpPnNvYXA8L2k+PHR0Pi0mZ3Q7PC90dD48aT5lcnJvcjwvaT4uDQorQnVpbHQtaW4gZ1NPQVAgZnVuY3Rpb246IG5vbmUuDQorPC90ZD48L3RyPg0KKzx0cj48dGQgd2lkdGg9IjYwMiI+PGk+PGI+dm9pZDwvYj4mbmJzcDsoKnNvYXAuZnNldGVycm9yKSg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqKmNvZGUsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KipzdHJpbmcpPC9pPiA8L3RkPjwvdHI+DQorPHRyPjx0ZCB3aWR0aD0iNjAyIj5DYWxsZWQgdG8gc2V0IHRoZSBTT0FQIEZhdWx0IDxpPmNvZGU8L2k+IGFuZCA8aT5zdHJpbmc8L2k+IHZhbHVlcyBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgPGk+c29hcDwvaT48dHQ+LSZndDs8L3R0PjxpPmVycm9yPC9pPi4gQWxsb3dzIHVzZXItZGVmaW5lZCBtZXNzYWdlcyB0byBiZSBhc3NvY2lhdGVkIHdpdGggZ1NPQVAgZXJyb3IgY29kZXMgdG8gb3ZlcnJpZGUgZ1NPQVAncyBidWlsdC1pbiBlcnJvciBtZXNzYWdlcy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorQnVpbHQtaW4gZ1NPQVAgZnVuY3Rpb246IG5vbmUuDQorPC90ZD48L3RyPjwvdGFibGU+DQorDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvc3Bhbj4NCitJbiBhZGRpdGlvbiwgYSA8aT48Yj52b2lkPC9iPip1c2VyPC9pPiBmaWVsZCBpbiB0aGUgPGk+PGI+c3RydWN0PC9iPiZuYnNwO3NvYXA8L2k+IGRhdGEgc3RydWN0dXJlIGlzIGF2YWlsYWJsZSB0byBwYXNzIHVzZXItZGVmaW5lZCBkYXRhIHRvIHRoZSBjYWxsYmFja3MuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSB1c2VzIEkvTyBmdW5jdGlvbiBjYWxsYmFja3MgZm9yIGN1c3RvbWl6ZWQgc2VyaWFsaXphdGlvbiBvZiBkYXRhIGludG8gYSBidWZmZXIgYW5kIGRlc2VyaWFsaXphdGlvbiBiYWNrIGludG8gYQ0KK2RhdGFzdHJ1Y3R1cmU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPmNoYXI8L2I+Jm5ic3A7YnVmWzEwMDAwXTsgLy8gWE1MIGJ1ZmZlciA8YnIgLz4NCis8Yj5pbnQ8L2I+Jm5ic3A7bGVuMSA9IDA7CS8vICNjaGFycyB3cml0dGVuIDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDtsZW4yID0gMDsJLy8gI2NoYXJzIHJlYWQgPGJyIC8+DQorLy8gbXlzZW5kOiBwdXQgWE1MIGluIGJ1ZltdIDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDtteXNlbmQoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KnMsIHNpemVfdCBuKSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyhsZW4xICsgbiAgJmd0OyAgPGI+c2l6ZW9mPC9iPihidWYpKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7U09BUF9FT0Y7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3N0cmNweShidWYgKyBsZW4xLCBzKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7bGVuMSArPSBuOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7U09BUF9PSzsgPGJyIC8+DQorfSA8YnIgLz4NCisvLyBteXJlY3Y6IGdldCBYTUwgZnJvbSBidWZbXSA8YnIgLz4NCitzaXplX3QgbXlyZWN2KDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj5jaGFyPC9iPiZuYnNwOypzLCBzaXplX3QgbikgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsobGVuMiArIG4gICZndDsgIGxlbjEpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO24gPSBsZW4xIC0gbGVuMjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c3RybmNweShzLCBidWYgKyBsZW4yLCBuKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7bGVuMiArPSBuOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7bjsgPGJyIC8+DQorfSA8YnIgLz4NCittYWluKCkgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCBzb2FwOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7bnNfX3BlcnNvbiBwOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2luaXQoJmFtcDtzb2FwKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7bGVuMSA9IGxlbjIgPSAwOwkvLyByZXNldCBidWZmZXIgcG9pbnRlcnMgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7cC5uYW1lID0gIkpvaG4gRG9lIjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7cC5hZ2UgPSAyNTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcC5mc2VuZCA9IG15c2VuZDsgLy8gYXNzaWduIGNhbGxiYWNrIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXAuZnJlY3YgPSBteXJlY3Y7IC8vIGFzc2lnbiBjYWxsYmFjayA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2JlZ2luKCZhbXA7c29hcCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfc2V0X29tb2RlKCZhbXA7c29hcCwgU09BUF9YTUxfR1JBUEgpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX3NlcmlhbGl6ZV9uc19fcGVyc29uKCZhbXA7c29hcCwgJmFtcDtwKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9wdXRfbnNfX3BlcnNvbigmYW1wO3NvYXAsICZhbXA7cCwgIm5zOnBlcnNvbiIsIE5VTEwpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoc29hcC5lcnJvcikgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwX3ByaW50X2ZhdWx0KCZhbXA7c29hcCwgc3Rkb3V0KTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZXhpdCgxKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2VuZCgmYW1wO3NvYXApOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2JlZ2luKCZhbXA7c29hcCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfZ2V0X25zX19wZXJzb24oJmFtcDtzb2FwLCAmYW1wO3AsICJuczpwZXJzb24iLCBOVUxMKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KHNvYXAuZXJyb3IpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9wcmludF9mYXVsdCgmYW1wO3NvYXAsIHN0ZG91dCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2V4aXQoMSk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO30gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9lbmQoJmFtcDtzb2FwKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9pbml0KCZhbXA7c29hcCk7IC8vIGRpc2FibGUgY2FsbGJhY2tzIDxiciAvPg0KK30NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoZSA8aT5zb2FwX2RvbmU8L2k+IGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgdG8gcmVzZXQgdGhlIGNhbGxiYWNrIHRvIHRoZSBkZWZhdWx0IGludGVybmFsIGdTT0FQIEkvTyBhbmQgSFRUUCBoYW5kbGVycy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIGZvbGxvd2luZyBleGFtcGxlIGlsbHVzdHJhdGVzIGN1c3RvbWl6ZWQgSS9PIGFuZCAoSFRUUCkgaGVhZGVyIGhhbmRsaW5nLiBUaGUgU09BUCByZXF1ZXN0IGlzIHNhdmVkIHRvIGEgZmlsZS4gVGhlIGNsaWVudCBwcm94eQ0KK3RoZW4gcmVhZHMgdGhlIGZpbGUgY29udGVudHMgYXMgdGhlIHNlcnZpY2UgcmVzcG9uc2UuIFRvIHBlcmZvcm0gdGhpcyB0cmljaywgdGhlIHNlcnZpY2UgcmVzcG9uc2UgaGFzIGV4YWN0bHkgdGhlIHNhbWUgc3RydWN0dXJlIGFzIHRoZQ0KK3JlcXVlc3QuIFRoaXMgaXMgZGVjbGFyZWQgYnkgdGhlIDxpPjxiPnN0cnVjdDwvYj4mbmJzcDtuc19fdGVzdDwvaT4gb3V0cHV0IHBhcmFtZXRlciBwYXJ0IG9mIHRoZSByZW1vdGUgbWV0aG9kIGRlY2xhcmF0aW9uLg0KK1RoaXMgc3RydWN0IHJlc2VtYmxlcyB0aGUgc2VydmljZSByZXF1ZXN0IChzZWUgdGhlIGdlbmVyYXRlZCA8aT5zb2FwU3R1Yi5oPC9pPiBmaWxlIGNyZWF0ZWQgZnJvbSB0aGUgaGVhZGVyIGZpbGUpLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgaGVhZGVyIGZpbGUgaXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vZ3NvYXAgbnMgc2VydmljZSBuYW1lOiBjYWxsYmFjayA8YnIgLz4NCisvL2dzb2FwIG5zIHNlcnZpY2UgbmFtZXNwYWNlOiB1cm46Y2FsbGJhY2sgPGJyIC8+DQorPGI+c3RydWN0PC9iPiZuYnNwO25zX19wZXJzb24gPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypuYW1lOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7YWdlOyA8YnIgLz4NCit9OyA8YnIgLz4NCis8Yj5pbnQ8L2I+Jm5ic3A7bnNfX3Rlc3QoPGI+c3RydWN0PC9iPiZuYnNwO25zX19wZXJzb24gaW4sIDxiPnN0cnVjdDwvYj4mbmJzcDtuc19fdGVzdCAmYW1wO291dCk7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgY2xpZW50IHByb2dyYW0gaXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKyNpbmNsdWRlICJzb2FwSC5oIiA8YnIgLz4NCisuLi4gPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO215b3Blbig8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqZW5kcG9pbnQsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7Kmhvc3QsIDxiPmludDwvYj4mbmJzcDtwb3J0KSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyhzdHJuY21wKGVuZHBvaW50LCAiZmlsZToiLCA1KSkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtwcmludGYoIkZpbGUgbmFtZSBleHBlY3RlZDx0dD5cPC90dD5uIik7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDtTT0FQX0VPRjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoKHNvYXA8dHQ+LSZndDs8L3R0PnNlbmRmZCA9IHNvYXA8dHQ+LSZndDs8L3R0PnJlY3ZmZCA9IG9wZW4oaG9zdCwgT19SRFdSIHwgT19DUkVBVCwgU19JV1VTUiB8IFNfSVJVU1IpKSAgJmx0OyAgMCkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cmV0dXJuPC9iPiZuYnNwO1NPQVBfRU9GOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7U09BUF9PSzsgPGJyIC8+DQorfSA8YnIgLz4NCis8Yj52b2lkPC9iPiZuYnNwO215Y2xvc2UoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXApIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7aWYgKHNvYXA8dHQ+LSZndDs8L3R0PnNlbmRmZCAgJmd0OyAgMikgLy8gc3RpbGwgb3Blbj8gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Y2xvc2Uoc29hcDx0dD4tJmd0OzwvdHQ+c2VuZGZkKTsgLy8gdGhlbiBjbG9zZSBpdCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwPHR0Pi0mZ3Q7PC90dD5yZWN2ZmQgPSAwOyAvLyBzZXQgYmFjayB0byBzdGRpbiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwPHR0Pi0mZ3Q7PC90dD5zZW5kZmQgPSAxOyAvLyBzZXQgYmFjayB0byBzdGRvdXQgPGJyIC8+DQorfSA8YnIgLz4NCis8Yj5pbnQ8L2I+Jm5ic3A7bXlwb3N0KDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj5jb25zdDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyplbmRwb2ludCwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqaG9zdCwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqcGF0aCwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqYWN0aW9uLCBzaXplX3QgY291bnQpIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cmV0dXJuPC9iPiZuYnNwO3NvYXBfc2VuZChzb2FwLCAiQ3VzdG9tLWdlbmVyYXRlZCBmaWxlPHR0Plw8L3R0Pm4iKTsgLy8gd3JpdGVzIHRvIHNvYXA8dHQ+LSZndDs8L3R0PnNlbmRmZCA8YnIgLz4NCit9IDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDtteXBhcnNlKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwKSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7YnVmWzI1Nl07IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyhsc2Vlayhzb2FwPHR0Pi0mZ3Q7PC90dD5yZWN2ZmQsIDAsIFNFRUtfU0VUKSAgJmx0OyAgMCA8dHQ+fHw8L3R0PiBzb2FwX2dldGxpbmUoc29hcCwgYnVmLCAyNTYpKSAvLyBnbyB0byBiZWdpbiBhbmQgc2tpcCBjdXN0b20gaGVhZGVyIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDtTT0FQX0VPRjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cmV0dXJuPC9iPiZuYnNwO1NPQVBfT0s7IDxiciAvPg0KK30gPGJyIC8+DQorbWFpbigpIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgc29hcDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+c3RydWN0PC9iPiZuYnNwO25zX190ZXN0IHI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnN0cnVjdDwvYj4mbmJzcDtuc19fcGVyc29uIHA7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfaW5pdCgmYW1wO3NvYXApOyAvLyByZXNldCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtwLm5hbWUgPSAiSm9obiBEb2UiOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtwLmFnZSA9IDk5OyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwLmZvcGVuID0gbXlvcGVuOyAvLyB1c2UgY3VzdG9tIG9wZW4gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcC5mcG9zdCA9IG15cG9zdDsgLy8gdXNlIGN1c3RvbSBwb3N0IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXAuZnBhcnNlID0gbXlwYXJzZTsgLy8gdXNlIGN1c3RvbSByZXNwb25zZSBwYXJzZXIgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcC5mY2xvc2UgPSBteWNsb3NlOyAvLyB1c2UgY3VzdG9tIGNsb3NlIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfY2FsbF9uc19fdGVzdCgmYW1wO3NvYXAsICJmaWxlOi8vdGVzdC54bWwiLCAiIiwgcCwgcik7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyhzb2FwLmVycm9yKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfcHJpbnRfZmF1bHQoJmFtcDtzb2FwLCBzdGRvdXQpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtleGl0KDEpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt9IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfZW5kKCZhbXA7c29hcCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfaW5pdCgmYW1wO3NvYXApOyAvLyByZXNldCB0byBkZWZhdWx0IGNhbGxiYWNrcyA8YnIgLz4NCit9DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitTT0FQIDEuMSBhbmQgMS4yIHNwZWNpZnkgdGhhdCBYTUwgZWxlbWVudHMgbWF5IGJlIGlnbm9yZWQgd2hlbiBwcmVzZW50IGluIGEgU09BUCBwYXlsb2FkIG9uIHRoZSByZWNlaXZpbmcgc2lkZS4NCitnU09BUCBpZ25vcmVzIFhNTCBlbGVtZW50cyB0aGF0IGFyZSB1bmtub3duLCB1bmxlc3MgdGhlIFhNTCBhdHRyaWJ1dGUgPHR0Pm11c3RVbmRlcnN0YW5kPSJ0cnVlIjwvdHQ+IGlzIHByZXNlbnQgaW4gdGhlIFhNTCBlbGVtZW50Lg0KK0l0IG1heSBiZSB1bmRlc2lyYWJsZSBmb3IgZWxlbWVudHMgdG8gYmUgaWdub3JlZCB3aGVuIHRoZSBvdXRjb21lIG9mIHRoZSBvbWlzc2lvbiBpcyB1bmNlcnRhaW4uDQorVGhlIDxpPnNvYXAuZmlnbm9yZTwvaT4gY2FsbGJhY2sgY2FuIGJlIHNldCB0byBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyA8aT5TT0FQX09LPC9pPiBpbiBjYXNlIHRoZSBlbGVtZW50IGNhbiBiZSBzYWZlbHkgaWdub3JlZCwgb3INCis8aT5TT0FQX01VU1RVTkRFUlNUQU5EPC9pPiB0byB0aHJvdyBhbiBleGNlcHRpb24sIG9yIHRvIHBlcmZvcm0gc29tZSBhcHBsaWNhdGlvbi1zcGVjaWZpYyBhY3Rpb24uDQorRm9yIGV4YW1wbGUsIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBhcyBzb29uIGFzIGFuIHVua25vd24gZWxlbWVudCBpcyBlbmNvdW50ZXJlZCBvbiB0aGUgaW5wdXQsIHVzZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+aW50PC9iPiZuYnNwO215aWdub3JlKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj5jb25zdDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyp0YWcpIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cmV0dXJuPC9iPiZuYnNwO1NPQVBfTVVTVFVOREVSU1RBTkQ7IC8vIG5ldmVyIHNraXAgZWxlbWVudHMgKHNlY3VyZSkgPGJyIC8+DQorfSA8YnIgLz4NCisuLi4gPGJyIC8+DQorc29hcC5maWdub3JlID0gbXlpZ25vcmU7IDxiciAvPg0KK3NvYXBfY2FsbF9uc19fbWV0aG9kKCZhbXA7c29hcCwgLi4uKTsgLy8gb3Igc29hcF9zZXJ2ZSgmYW1wO3NvYXApOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVG8gc2VsZWN0aXZlbHkgdGhyb3cgYW4gZXhjZXB0aW9uIGFzIHNvb24gYXMgYW4gdW5rbm93biBlbGVtZW50IGlzIGVuY291bnRlcmVkIGJ1dCBlbGVtZW50IDx0dD5uczp4eXo8L3R0PiBjYW4gYmUgc2FmZWx5IGlnbm9yZWQsIHVzZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+aW50PC9iPiZuYnNwO215aWdub3JlKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj5jb25zdDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyp0YWcpIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRhZywgIm5zOnh5eiIpICE9IFNPQVBfT0spIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDtTT0FQX01VU1RVTkRFUlNUQU5EOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7U09BUF9PSzsgPGJyIC8+DQorfSA8YnIgLz4NCisuLi4gPGJyIC8+DQorc29hcC5maWdub3JlID0gbXlpZ25vcmU7IDxiciAvPg0KK3NvYXBfY2FsbF9uc19fbWV0aG9kKCZhbXA7c29hcCwgLi4uKTsgLy8gb3Igc29hcF9zZXJ2ZSgmYW1wO3NvYXApIDxiciAvPg0KKy4uLiA8YnIgLz4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7TmFtZXNwYWNlIG5hbWVzcGFjZXNbXSA9IDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyJTT0FQLUVOViIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyJ9LCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7IlNPQVAtRU5DIiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8ifSwgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyJ4c2kiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UifSwgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyJ4c2QiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEifSwgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyJucyIsICJzb21lLVVSSSJ9LCAvLyB0aGUgbmFtZXNwYWNlIG9mIGVsZW1lbnQgbnM6eHl6IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3tOVUxMLCBOVUxMfSA8YnIgLz4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK0Z1bmN0aW9uIDxpPnNvYXBfbWF0Y2hfdGFnPC9pPiBjb21wYXJlcyB0d28gdGFncy4gVGhlIHRoaXJkIHBhcmFtZXRlciBtYXkgYmUgYSBwYXR0ZXJuIHdoZXJlIDxpPio8L2k+IGlzIGEgd2lsZGNhcmQNCithbmQgPGk+LTwvaT4gaXMgYSBzaW5nbGUgY2hhcmFjdGVyIHdpbGRjYXJkLiBTbyBmb3IgZXhhbXBsZQ0KKzxpPnNvYXBfbWF0Y2hfdGFnKHRhZywgIm5zOioiKTwvaT4gd2lsbCBtYXRjaCBhbnkgZWxlbWVudCBpbiBuYW1lc3BhY2UgPGk+bnM8L2k+IG9yIHdoZW4gbm8gbmFtZXNwYWNlIHByZWZpeCBpcyBwcmVzZW50IGluIHRoZSBYTUwNCittZXNzYWdlLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgY2FsbGJhY2sgY2FuIGFsc28gYmUgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHVua25vd24gZWxlbWVudHMgaW4gYW4gaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUgc3VjaCBhcyBhIGxpc3Q6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtVbmtub3duIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqdGFnOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7VW5rbm93biAqbmV4dDsgPGJyIC8+DQorfTsgPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO215aWdub3JlKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj5jb25zdDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyp0YWcpIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqcyA9ICg8Yj5jaGFyPC9iPiopc29hcF9tYWxsb2Moc29hcCwgc3RybGVuKHRhZykrMSk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnN0cnVjdDwvYj4mbmJzcDtVbmtub3duICp1ID0gKDxiPnN0cnVjdDwvYj4mbmJzcDtVbmtub3duKilzb2FwX21hbGxvYyhzb2FwLCA8Yj5zaXplb2Y8L2I+KDxiPnN0cnVjdDwvYj4mbmJzcDtVbmtub3duKSk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyhzICZhbXA7JmFtcDsgdSkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzdHJjcHkocywgdGFnKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7dTx0dD4tJmd0OzwvdHQ+dGFnID0gczsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7dTx0dD4tJmd0OzwvdHQ+bmV4dCA9IHVsaXN0OyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDt1bGlzdCA9IHU7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO30gPGJyIC8+DQorfSA8YnIgLz4NCisuLi4gPGJyIC8+DQorPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXA7IDxiciAvPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtVbmtub3duICp1bGlzdCA9IE5VTEw7IDxiciAvPg0KK3NvYXBfaW5pdCgmYW1wO3NvYXApOyA8YnIgLz4NCitzb2FwLmZpZ25vcmUgPSBteWlnbm9yZTsgPGJyIC8+DQorc29hcF9jYWxsX25zX19tZXRob2QoJmFtcDtzb2FwLCAuLi4pOyAvLyBvciBzb2FwX3NlcnZlKCZhbXA7c29hcCkgPGJyIC8+DQorLy8gcHJpbnQgdGhlIGxpc3Qgb2YgdW5rbm93biBlbGVtZW50cyA8YnIgLz4NCitzb2FwX2VuZCgmYW1wO3NvYXApOyAvLyBjbGVhbiB1cA0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkgICAgIDxoMz48YSBuYW1lPSJ0dGhfc0VjMTguOCI+DQorMTguODwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+SFRUUCAxLjAgYW5kIDEuMTwvZm9udD48L2gzPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitnU09BUCB1c2VzIEhUVFAgMS4xIGJ5IGRlZmF1bHQuIFlvdSBjYW4gcmV2ZXJ0IHRvIEhUVFAgMS4wIGFzIGZvbGxvd3M6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwIHNvYXA7IDxiciAvPg0KK3NvYXBfaW5pdCgmYW1wO3NvYXApOyA8YnIgLz4NCisuLi4gPGJyIC8+DQorc29hcC5odHRwX3ZlcnNpb24gPSAiMS4wIjsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoaXMgc2V0cyB0aGUgSFRUUCB2ZXJzaW9uIGFuZCByZWNvbmZpZ3VyZXMgdGhlIGVuZ2luZSB0byByZXZlcnQgdG8gSFRUUCAxLjAuDQorTm90ZSB0aGF0IHlvdSBjYW5ub3QgdXNlIEhUVFAgY2h1bmtpbmcgd2l0aCBIVFRQIDEuMC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCSAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWMxOC45Ij4NCisxOC45PC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5IVFRQIDMwNyBUZW1wb3JhcnkgUmVkaXJlY3QgU3VwcG9ydDwvZm9udD48L2gzPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgY2xpZW50LXNpZGUgaGFuZGxpbmcgb2YgSFRUUCAzMDcgY29kZSAiVGVtcG9yYXJ5IFJlZGlyZWN0IiBhbmQgYW55IG9mIHRoZSByZWRpcmVjdCBjb2RlcyAzMDEsIDMwMiwgYW5kIDMwMyBhcmUgbm90IGF1dG9tYXRlZCBpbiBnU09BUC4gQ2xpZW50IGFwcGxpY2F0aW9uIGRldmVsb3BlcnMgbWF5IHdhbnQgdG8gY29uc2lkZXIgYWRkaW5nIGEgZmV3IGxpbmVzIG9mIGNvZGUgdG8gc3VwcG9ydCByZWRpcmVjdHMuIEl0IHdhcyBkZWNpZGVkIG5vdCB0byBhdXRvbWF0aWNhbGx5IHN1cHBvcnQgcmVkaXJlY3RzIGZvciB0aGUgZm9sbG93aW5nIHJlYXNvbnM6DQorDQorPHVsPg0KKzxsaT4gUmVkaXJlY3RpbmcgYSBzZWN1cmUgSFRUUFMgYWRkcmVzcyB0byBhIG5vbi1zZWN1cmUgSFRUUCBhZGRyZXNzIHZpYSAzMDcgY3JlYXRlcyBhIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdHkuDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorDQorPGxpPiBDeWNsaWMgcmVkaXJlY3RzIG11c3QgYmUgZGV0ZWN0ZWQgKGUuZy4gYWxsb3dpbmcgb25seSBhIGxpbWl0ZWQgbnVtYmVyIG9mIHJlZGlyZWN0IGxldmVscykuDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorDQorPGxpPiBSZWRpcmVjdGluZyBIVFRQIFBPU1Qgd2lsbCByZXN1bHQgaW4gcmUtc2VyaWFsaXphdGlvbiBhbmQgcmUtcG9zdCBvZiB0aGUgZW50aXJlIFNPQVAgcmVxdWVzdC4gVGhlIFNPQVAgcmVxdWVzdCBtZXNzYWdlIG11c3QgYmUgcmUtcG9zdGVkIGluIGl0cyBlbnRpcml0eSB3aGVuIHJlLWlzc3VpbmcgdGhlIFNPQVAgb3BlcmF0aW9uIHRvIGEgbmV3IGFkZHJlc3MuDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorPC91bD4NCitUbyBpbXBsZW1lbnQgY2xpZW50LXNpZGUgMzA3IHJlZGlyZWN0LCBhZGQgdGhlIGZvbGxvd2luZyBsaW5lcyBvZiBjb2RlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5jaGFyPC9iPiZuYnNwOyplbmRwb2ludCA9IE5VTEw7IC8vIHVzZSBkZWZhdWx0IGVuZHBvaW50IGdpdmVuIGluIFdTREwgKG9yIGFkZCBhbm90aGVyIG9uZSBoZXJlKSA8YnIgLz4NCis8Yj5pbnQ8L2I+Jm5ic3A7biA9IDEwOyAvLyBtYXggcmVkaXJlY3QgY291bnQgPGJyIC8+DQorPGI+d2hpbGU8L2I+Jm5ic3A7KG4tKSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyhzb2FwX2NhbGxfbnMxX19teU1ldGhvZChzb2FwLCBlbmRwb2ludCwgLi4uKSkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoKHNvYXA8dHQ+LSZndDs8L3R0PmVycm9yIDx0dD4mZ3Q7PTwvdHQ+IDMwMSA8dHQ+JmFtcDsmYW1wOzwvdHQ+IHNvYXA8dHQ+LSZndDs8L3R0PmVycm9yIDx0dD4mbHQ7PTwvdHQ+IDMwMykgPHR0Pnx8PC90dD4gc29hcDx0dD4tJmd0OzwvdHQ+ZXJyb3IgPT0gMzA3KSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtlbmRwb2ludCA9IHNvYXA8dHQ+LSZndDs8L3R0PmVuZHBvaW50OyAvLyBlbmRwb2ludCBmcm9tIEhUVFAgMzAxLCAzMDIsIDMwMywgMzA3IExvY2F0aW9uIGhlYWRlciA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5lbHNlPC9iPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3sgLi4uIHJlcG9ydCBhbmQgaGFuZGxlIGVycm9yIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPmJyZWFrPC9iPjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt9IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmVsc2U8L2I+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+YnJlYWs8L2I+OyA8YnIgLz4NCit9DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCSAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWMxOC4xMCI+DQorMTguMTA8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPkhUVFAgR0VUIFN1cHBvcnQ8L2ZvbnQ+PC9oMz48YSBuYW1lPSJzZWM6Z2V0Ij4NCis8L2E+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0EgZ1NPQVAgc2VydmVyIG5vcm1hbGx5IG9ubHkgZ3JhbnRzIEhUVFAgKGFuZCBIVFRQUykgUE9TVCByZXF1ZXN0cy4gVG8gc3VwcG9ydCBIVFRQIChIVFRQUykgR0VULCB5b3UgbmVlZCB0byBzZXQgdGhlIDxpPnNvYXAuZmdldDwvaT4gY2FsbGJhY2suIFRoZSBjYWxsYmFjayBpcyByZXF1aXJlZCB0byBwcm9kdWNlIGEgcmVzcG9uc2UgdG8gdGhlIHJlcXVlc3QgaW4gdGV4dHVhbCBmb3JtLCBzdWNoIGFzIGEgV2ViIHBhZ2Ugb3IgYSBTT0FQL1hNTCByZXNwb25zZS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIGZvbGxvd2luZyBleGFtcGxlIHByb2R1Y2VzIGEgV2ViIHBhZ2UgdXBvbiBhIEhUVFAgR0VUIHJlcXVlc3QgKGUuZy4gZnJvbSBhIGJyb3dzZXIpOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCA9IHNvYXBfbmV3KCk7IDxiciAvPg0KK3NvYXA8dHQ+LSZndDs8L3R0PmZnZXQgPSBodHRwX2dldCgpOyA8YnIgLz4NCisuLi4gPGJyIC8+DQorc29hcF9zZXJ2ZShzb2FwKTsgPGJyIC8+DQorLi4uIDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDtodHRwX2dldCg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCkgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX3Jlc3BvbnNlKHNvYXAsIFNPQVBfSFRNTCk7IC8vIEhUVFAgcmVzcG9uc2UgaGVhZGVyIHdpdGggdGV4dC9odG1sIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfc2VuZChzb2FwLCAiJmx0O0hUTUwmIzYyO015IFdlYiBzZXJ2ZXIgaXMgb3BlcmF0aW9uYWwuJmx0Oy9IVE1MJiM2MjsiKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9lbmRfc2VuZChzb2FwKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cmV0dXJuPC9iPiZuYnNwO1NPQVBfT0s7IDxiciAvPg0KK30NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoZSBleGFtcGxlIGJlbG93IHByb2R1Y2VzIGEgV1NETCBmaWxlIHVwb24gYSBIVFRQIEdFVCB3aXRoIHBhdGggPGk+P3dzZGw8L2k+Og0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5pbnQ8L2I+Jm5ic3A7aHR0cF9nZXQoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXApIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqcyA9IHN0cmNocihzb2FwPHR0Pi0mZ3Q7PC90dD5wYXRoLCAnPycpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoIXMgPHR0Pnx8PC90dD4gc3RyY21wKHMsICI/d3NkbCIpKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7U09BUF9HRVRfTUVUSE9EOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtmZCA9IGZvcGVuKCJteXNlcnZpY2Uud3NkbCIsICJyYiIpOyAvLyBvcGVuIFdTREwgZmlsZSB0byBjb3B5IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyghZmQpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDs0MDQ7IC8vIHJldHVybiBIVFRQIG5vdCBmb3VuZCBlcnJvciA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwPHR0Pi0mZ3Q7PC90dD5odHRwX2NvbnRlbnQgPSAidGV4dC94bWwiOyAvLyBIVFRQIGhlYWRlciB3aXRoIHRleHQveG1sIGNvbnRlbnQgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9yZXNwb25zZShzb2FwLCBTT0FQX0ZJTEUpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5mb3I8L2I+Jm5ic3A7KDs7KSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3IgPSBmcmVhZChzb2FwPHR0Pi0mZ3Q7PC90dD50bXBidWYsIDEsIHNpemVvZihzb2FwPHR0Pi0mZ3Q7PC90dD50bXBidWYpLCBmZCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyghcikgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+YnJlYWs8L2I+OyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoc29hcF9zZW5kX3Jhdyhzb2FwLCBzb2FwPHR0Pi0mZ3Q7PC90dD50bXBidWYsIHIpKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5icmVhazwvYj47IC8vIGNhbid0IHNlbmQsIGJ1dCBsaXR0bGUgd2UgY2FuIGRvIGFib3V0IHRoYXQgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtmY2xvc2UoZmQpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2VuZF9zZW5kKHNvYXApOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7U09BUF9PSzsgPGJyIC8+DQorfQ0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVXNpbmcgb25lLXdheSBTT0FQL1hNTCBtZXNzYWdlLCB5b3UgY2FuIGFsc28gcmV0dXJuIGEgU09BUC9YTUwgcmVzcG9uc2U6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPmludDwvYj4mbmJzcDtodHRwX2dldCg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCkgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoKHNvYXA8dHQ+LSZndDs8L3R0Pm9tb2RlICZhbXA7IFNPQVBfSU8pICE9IFNPQVBfSU9fQ0hVTkspIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfc2V0X29tb2RlKHNvYXAsIFNPQVBfSU9fU1RPUkUpOyAvLyBpZiBub3QgY2h1bmtpbmcgd2UgTVVTVCBidWZmZXIgZW50aXJlIGNvbnRlbnQgdG8gZGV0ZXJtaW5lIGNvbnRlbnQgbGVuZ3RoIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfcmVzcG9uc2Uoc29hcCwgU09BUF9PSyk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDtzb2FwX3NlbmRfbnMxX19teVNlbmRNZXRob2RSZXNwb25zZShzb2FwLCAiIiwgTlVMTCwgLi4uIHBhcmFtcyAuLi4pOyA8YnIgLz4NCit9IDxiciAvPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQord2hlcmUgPGk+bnMxX19teVNlbmRNZXRob2RSZXNwb25zZTwvaT4gaXMgYSBvbmUtd2F5IG1lc3NhZ2UgZGVjbGFyZWQgaW4gYSBnU09BUCBoZWFkZXIgZmlsZSBhczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+aW50PC9iPiZuYnNwO25zMV9fbXlTZW5kTWV0aG9kUmVzcG9uc2UoLi4uIHBhcmFtcyAuLi4sIDxiPnZvaWQ8L2I+KTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoZSBnZW5lcmF0ZWQgPGk+c29hcENsaWVudC5jcHA8L2k+IGluY2x1ZGVzIHRoZSBzZW5kaW5nLXNpZGUgc3R1YiBmdW5jdGlvbi4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCSAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWMxOC4xMSI+DQorMTguMTE8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPkhUVFAgS2VlcC1BbGl2ZTwvZm9udD48L2gzPjxhIG5hbWU9InNlYzprZWVwYWxpdmUiPg0KKzwvYT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorZ1NPQVAgc3VwcG9ydHMga2VlcC1hbGl2ZSBzb2NrZXQgY29ubmVjdGlvbnMuIFRvIGFjdGl2YXRlIGtlZXAtYWxpdmUgc3VwcG9ydCwNCitzZXQgdGhlIDxpPlNPQVBfSU9fS0VFUEFMSVZFPC9pPiBmbGFnIGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQgbW9kZXMsIHNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzpmbGFncyI+OC4xMjwvYT4uDQorRm9yIGV4YW1wbGUNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgc29hcDsgPGJyIC8+DQorc29hcF9pbml0MigmYW1wO3NvYXAsIFNPQVBfSU9fS0VFUEFMSVZFLCBTT0FQX0lPX0tFRVBBTElWRSk7IDxiciAvPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorV2hlbiBhIGNsaWVudCBvciBhIHNlcnZpY2UgY29tbXVuaWNhdGVzIHdpdGggYW5vdGhlciBjbGllbnQgb3Igc2VydmljZSB0aGF0IHN1cHBvcnRzIGtlZXAgYWxpdmUsIHRoZQ0KK2F0dHJpYnV0ZSA8aT5zb2FwLmtlZXBfYWxpdmU8L2k+IHdpbGwgYmUgc2V0IHRvIDEsIG90aGVyd2lzZSBpdCBpcyByZXNldCB0byAwIChpbmRpY2F0aW5nIHRoYXQgdGhlIG90aGVyIHBhcnR5IA0KK3dpbGwgY2xvc2UgdGhlIGNvbm5lY3Rpb24pLg0KK1RoZSBjb25uZWN0aW9uIG1heWJlIHRlcm1pbmF0ZWQgb24gZWl0aGVyIGVuZCBiZWZvcmUgdGhlIGNvbW11bmljYXRpb24gY29tcGxldGVkLCBmb3IgZXhhbXBsZSB3aGVuIHRoZSBzZXJ2ZXIga2VlcC1hbGl2ZQ0KK2Nvbm5lY3Rpb24gaGFzIHRpbWVkIG91dC4NCitUaGlzIGdlbmVyYXRlcyBhICJCcm9rZW4gUGlwZSIgc2lnbmFsIG9uIFVuaXgvTGludXggcGxhdGZvcm1zLiBUaGlzIHNpZ25hbCBjYW4gYmUgY2F1Z2h0IHdpdGggYSBzaWduYWwgaGFuZGxlcjoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorc2lnbmFsKFNJR1BJUEUsIHNpZ3BpcGVfaGFuZGxlKTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK3doZXJlLCBmb3IgZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+dm9pZDwvYj4mbmJzcDtzaWdwaXBlX2hhbmRsZSg8Yj5pbnQ8L2I+Jm5ic3A7eCkgeyB9DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitBbHRlcm5hdGl2ZWx5LCBicm9rZW4gcGlwZXMgY2FuIGJlIGtlcHQgc2lsZW50IGJ5IHNldHRpbmc6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KK3NvYXAuc29ja2V0X2ZsYWdzID0gTVNHX05PU0lHTkFMOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhpcyBzZXR0aW5nIHdpbGwgbm90IGdlbmVyYXRlIGEgc2lncGlwZSBidXQgcmVhZC93cml0ZSBvcGVyYXRpb25zIHJldHVybiA8aT5TT0FQX0VPRjwvaT4gaW5zdGVhZC4NCitOb3RlIHRoYXQgV2luMzIgc3lzdGVtcyBkbyBub3Qgc3VwcG9ydCBzaWduYWxzIGFuZCBsYWNrIHRoZSA8aT5NU0dfTk9TSUdOQUw8L2k+IGZsYWcuDQorVGhlIHNpZ3BpcGUgaGFuZGxpbmcgYW5kIGZsYWdzIGFyZSBub3QgdmVyeSBwb3J0YWJsZS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorQSBjb25uZWN0aW9uIHdpbGwgYmUga2VwdCBvcGVuIG9ubHkgaWYgdGhlIHJlcXVlc3QgY29udGFpbnMgYW4gSFRUUCAxLjAgaGVhZGVyDQord2l0aCAiPHR0PkNvbm5lY3Rpb246IEtlZXAtQWxpdmU8L3R0PiIgb3IgYW4gSFRUUCAxLjEgaGVhZGVyIHRoYXQgZG9lcyBub3QgY29udGFpbg0KKyI8dHQ+Q29ubmVjdGlvbjogY2xvc2U8L3R0PiIuIFRoaXMgbWVhbnMgdGhhdCBhIGdTT0FQIGNsaWVudCBtZXRob2QgY2FsbCBzaG91bGQNCit1c2UgIjx0dD5odHRwOi8vPC90dD4iIGluIHRoZSBlbmRwb2ludCBVUkwgb2YgdGhlIHJlcXVlc3QgdG8gdGhlIHN0YW5kLWFsb25lDQorc2VydmljZSB0byBlbnN1cmUgSFRUUCBoZWFkZXJzIGFyZSB1c2VkLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitJZiB0aGUgY2xpZW50IGRvZXMgbm90IGNsb3NlIHRoZSBjb25uZWN0aW9uLCB0aGUgc2VydmVyIHdpbGwgd2FpdCBmb3JldmVyIHdoZW4NCitubyA8aT5yZWN2X3RpbWVvdXQ8L2k+IGlzIHNwZWNpZmllZC4gIEluIGFkZGl0aW9uLCBvdGhlciBjbGllbnRzIHdpbGwgYmUgZGVuaWVkDQorc2VydmljZSBhcyBsb25nIGFzIGEgY2xpZW50IGtlZXBzIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIgb3Blbi4gIFRvDQorcHJldmVudCB0aGlzIGZyb20gaGFwcGVuaW5nLCB0aGUgc2VydmljZSBzaG91bGQgYmUgbXVsdGktdGhyZWFkZWQgc3VjaCB0aGF0DQorZWFjaCB0aHJlYWQgaGFuZGxlcyB0aGUgY2xpZW50IGNvbm5lY3Rpb246DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPmludDwvYj4mbmJzcDttYWluKDxiPmludDwvYj4mbmJzcDthcmdjLCA8Yj5jaGFyPC9iPiZuYnNwOyoqYXJndikgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCBzb2FwLCAqdHNvYXA7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3B0aHJlYWRfdCB0aWQ7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO2ludCBtLCBzOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2luaXQyKCZhbXA7c29hcCwgU09BUF9JT19LRUVQQUxJVkUsIFNPQVBfSU9fS0VFUEFMSVZFKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcC5tYXhfa2VlcF9hbGl2ZSA9IDEwMDsgLy8gb3B0aW9uYWw6IGF0IG1vc3QgMTAwIGNhbGxzIHBlciBrZWVwLWFsaXZlIHNlc3Npb24gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcC5hY2NlcHRfdGltZW91dCA9IDYwMDsgLy8gb3B0aW9uYWw6IGxldCBzZXJ2ZXIgdGltZSBvdXQgYWZ0ZXIgdGVuIG1pbnV0ZXMgb2YgaW5hY3Rpdml0eSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDttID0gc29hcF9iaW5kKCZhbXA7c29hcCwgTlVMTCwgMTgwMDAsIEJBQ0tMT0cpOyAvLyB1c2UgcG9ydCAxODAwMCBvbiB0aGUgY3VycmVudCBtYWNoaW5lIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyhtICAmbHQ7ICAwKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfcHJpbnRfZmF1bHQoJmFtcDtzb2FwLCBzdGRlcnIpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtleGl0KDEpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt9IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO2ZwcmludGYoc3RkZXJyLCA8dHQ+IlNvY2tldCZuYnNwO2Nvbm5lY3Rpb24mbmJzcDtzdWNjZXNzZnVsJm5ic3A7JWRcbiI8L3R0PiwgbSk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmZvcjwvYj4mbmJzcDsoY291bnQgPSAwOyBjb3VudCAgJmd0OyA9IDA7IGNvdW50KyspIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c29hcC5zb2NrZXRfZmxhZ3MgPSBNU0dfTk9TSUdOQUw7IC8vIHVzZSB0aGlzIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NvYXAuYWNjZXB0X2ZsYWdzID0gU09fTk9TSUdQSVBFOyAvLyBvciB0aGlzIHRvIHByZXZlbnQgc2lncGlwZSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzID0gc29hcF9hY2NlcHQoJmFtcDtzb2FwKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KHMgICZsdDsgIDApIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KHNvYXAuZXJybnVtKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwX3ByaW50X2ZhdWx0KCZhbXA7c29hcCwgc3RkZXJyKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+ZWxzZTwvYj48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtmcHJpbnRmKHN0ZGVyciwgPHR0PiJTZXJ2ZXImbmJzcDt0aW1lZCZuYnNwO291dFxuIjwvdHQ+KTsgLy8gQXNzdW1lIHRpbWVvdXQgaXMgbG9uZyBlbm91Z2ggZm9yIHRocmVhZHMgdG8gY29tcGxldGUgc2VydmluZyByZXF1ZXN0cyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5icmVhazwvYj47IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO30gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZnByaW50ZihzdGRlcnIsIDx0dD4iQWNjZXB0cyZuYnNwO3NvY2tldCZuYnNwOyVkJm5ic3A7Y29ubmVjdGlvbiZuYnNwO2Zyb20mbmJzcDtJUCZuYnNwOyVkLiVkLiVkLiVkXG4iPC90dD4sIHMsICg8Yj5pbnQ8L2I+KShzb2FwLmlwICZndDsmZ3Q7IDI0KSZhbXA7MHhGRiwgKDxiPmludDwvYj4pKHNvYXAuaXAgJmd0OyZndDsgMTYpJmFtcDsweEZGLCAoPGI+aW50PC9iPikoc29hcC5pcCAmZ3Q7Jmd0OyA4KSZhbXA7MHhGRiwgKDxiPmludDwvYj4pc29hcC5pcCZhbXA7MHhGRik7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3Rzb2FwID0gc29hcF9jb3B5KCZhbXA7c29hcCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3B0aHJlYWRfY3JlYXRlKCZhbXA7dGlkLCBOVUxMLCAodm9pZCooKikodm9pZCopKXByb2Nlc3NfcmVxdWVzdCwgKHZvaWQqKXRzb2FwKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7MDsgPGJyIC8+DQorfSA8YnIgLz4NCis8Yj52b2lkPC9iPiZuYnNwOypwcm9jZXNzX3JlcXVlc3QoPGI+dm9pZDwvYj4mbmJzcDsqc29hcCkgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtwdGhyZWFkX2RldGFjaChwdGhyZWFkX3NlbGYoKSk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOygoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAqKXNvYXApPHR0Pi0mZ3Q7PC90dD5yZWN2X3RpbWVvdXQgPSAzMDA7IC8vIFRpbWVvdXQgYWZ0ZXIgNSBtaW51dGVzIHN0YWxsIG9uIHJlY3YgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7KCg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCopc29hcCk8dHQ+LSZndDs8L3R0PnNlbmRfdGltZW91dCA9IDYwOyAvLyBUaW1lb3V0IGFmdGVyIDEgbWludXRlIHN0YWxsIG9uIHNlbmQgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9zZXJ2ZSgoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAqKXNvYXApOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2Rlc3Ryb3koKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwKilzb2FwKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9lbmQoKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwKilzb2FwKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9kb25lKCg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCopc29hcCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO2ZyZWUoc29hcCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDtOVUxMOyA8YnIgLz4NCit9DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUbyBwcmV2ZW50IGEgbWFsaWNpb3VzIGNsaWVudCBmcm9tIGtlZXBpbmcgYSB0aHJlYWQgd2FpdGluZyBmb3JldmVyIGJ5IGtlZXBpbmcNCit0aGUgY29ubmVjdGlvbiBvcGVuLCB0aW1lb3V0cyBhcmUgc2V0IGluIHRoZSA8aT5wcm9jZXNzX3JlcXVlc3Q8L2k+IHJvdXRpbmUuDQorU2VlIFNlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOnRpbWVvdXQiPjE4LjE3PC9hPiBmb3IgbW9yZSBkZXRhaWxzIG9uIHRpbWVvdXQgc2V0dGluZ3MuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0EgZ1NPQVAgY2xpZW50IGNhbGwgd2lsbCBhdXRvbWF0aWNhbGx5IGF0dGVtcHQgdG8gcmUtZXN0YWJsaXNoIGEgY29ubmVjdGlvbiB0bw0KK2Egc2VydmVyIHdoZW4gdGhlIHNlcnZlciBoYXMgdGVybWluYXRlZCB0aGUgY29ubmVjdGlvbiBmb3IgYW55IHJlYXNvbi4gIFRoaXMNCit3YXksIGEgc2VxdWVuY2Ugb2YgY2FsbHMgY2FuIGJlIG1hZGUgdG8gdGhlIHNlcnZlciB3aGlsZSBrZWVwaW5nIHRoZSBjb25uZWN0aW9uDQorb3Blbi4gIENsaWVudCBzdHVicyB3aWxsIHBvbGwgdGhlIHNlcnZlciB0byBjaGVjayBpZiB0aGUgY29ubmVjdGlvbiBpcyBzdGlsbA0KK29wZW4uICBXaGVuIHRoZSBjb25uZWN0aW9uIHdhcyB0ZXJtaW5hdGVkIGJ5IHRoZSBzZXJ2ZXIsIHRoZSBjbGllbnQgd2lsbA0KK2F1dG9tYXRpY2FsbHkgcmVjb25uZWN0LiAgDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0EgY2xpZW50IHNob3VsZCByZXNldCA8aT5TT0FQX0lPX0tFRVBBTElWRTwvaT4ganVzdCBiZWZvcmUgdGhlIGxhc3QgY2FsbCB0byBhDQorc2VydmVyIHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uIGFmdGVyIHRoaXMgbGFzdCBjYWxsLiBUaGlzIHdpbGwgY2xvc2UgdGhlIHNvY2tldA0KK2FmdGVyIHRoZSBjYWxsIGFuZCBhbHNvIGluZm9ybXMgdGhlIHNlcnZlciB0byBncmFjZWZ1bGx5IGNsb3NlIHRoZSBjb25uZWN0aW9uLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJICAgICA8aDM+PGEgbmFtZT0idHRoX3NFYzE4LjEyIj4NCisxOC4xMjwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+SFRUUCBDaHVua2VkIFRyYW5zZmVyIEVuY29kaW5nPC9mb250PjwvaDM+PGEgbmFtZT0ic2VjOmNodW5rZWQiPg0KKzwvYT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorZ1NPQVAgc3VwcG9ydHMgSFRUUCBjaHVua2VkIHRyYW5zZmVyIGVuY29kaW5nLiBVbi1jaHVua2luZyBvZiBpbmJvdW5kIG1lc3NhZ2VzDQordGFrZXMgcGxhY2UgYXV0b21hdGljYWxseS4gT3V0Ym91bmQgbWVzc2FnZXMgYXJlIG5ldmVyIGNodW5rZWQsIGV4Y2VwdCB3aGVuIHRoZQ0KKzxpPlNPQVBfSU9fQ0hVTks8L2k+IGZsYWcgaXMgc2V0IGZvciB0aGUgb3V0cHV0IG1vZGUuICBNb3N0IFdlYiBzZXJ2aWNlcywNCitob3dldmVyLCB3aWxsIG5vdCBhY2NlcHQgY2h1bmtlZCBpbmJvdW5kIG1lc3NhZ2VzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJICAgICA8aDM+PGEgbmFtZT0idHRoX3NFYzE4LjEzIj4NCisxOC4xMzwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+SFRUUCBCdWZmZXJlZCBTZW5kczwvZm9udD48L2gzPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgZW50aXJlIG91dGJvdW5kIG1lc3NhZ2UgY2FuIGJlIHN0b3JlZCB0byBkZXRlcm1pbmUgdGhlIEhUVFAgY29udGVudCBsZW5ndGgNCityYXRoZXIgdGhhbiB0aGUgdHdvLXBoYXNlIGVuY29kaW5nIHVzZWQgYnkgZ1NPQVAgd2hpY2ggcmVxdWlyZXMgYSBzZXBhcmF0ZSBwYXNzDQorb3ZlciB0aGUgZGF0YSB0byBkZXRlcm1pbmUgdGhlIGxlbmd0aCBvZiB0aGUgb3V0Ym91bmQgbWVzc2FnZS4gIFNldHRpbmcgdGhlDQorZmxhZyA8aT5TT0FQX0lPX1NUT1JFPC9pPiBmb3IgdGhlIG91dHB1dCBtb2RlIHdpbGwgYnVmZmVyIHRoZSBlbnRpcmUgbWVzc2FnZS4NCitUaGlzIGNhbiBzcGVlZCB1cCB0aGUgdHJhbnNtaXNzaW9uIG9mIG1lc3NhZ2VzLCBkZXBlbmRpbmcgb24gdGhlIGNvbnRlbnQsIGJ1dA0KK21heSByZXF1aXJlIHNpZ25pZmljYW50IHN0b3JhZ2Ugc3BhY2UgdG8gaG9sZCB0aGUgdmVyYm9zZSBYTUwgbWVzc2FnZS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorWmxpYiBjb21wcmVzc2VkIHRyYW5zZmVycyByZXF1aXJlIGJ1ZmZlcmluZy4gVGhlIDxpPlNPQVBfSU9fU1RPUkU8L2k+IGZsYWcgaXMNCitzZXQgd2hlbiB0aGUgPGk+U09BUF9FTkNfWkxJQjwvaT4gZmxhZyBpcyBzZXQgdG8gc2VuZCBjb21wcmVzc2VkIG1lc3NhZ2VzLiBUaGUgdXNlIG9mIGNodW5raW5nDQorc2lnbmlmaWNhbnRseSByZWR1Y2VzIG1lbW9yeSB1c2FnZSBhbmQgbWF5IHNwZWVkIHVwIHRoZSB0cmFuc21pc3Npb24gb2YgY29tcHJlc3NlZCBTT0FQL1hNTCBtZXNzYWdlcy4NCitUaGlzIGlzIGFjY29tcGxpc2hlZCBieSBzZXR0aW5nIHRoZSA8aT5TT0FQX0lPX0NIVU5LPC9pPiBmbGFnIHdpdGgNCis8aT5TT0FQX0VOQ19aTElCPC9pPiBmb3IgdGhlIG91dHB1dCBtb2RlLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJICAgICA8aDM+PGEgbmFtZT0idHRoX3NFYzE4LjE0Ij4NCisxOC4xNDwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+SFRUUCBBdXRoZW50aWNhdGlvbjwvZm9udD48L2gzPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitIVFRQIGF1dGhlbnRpY2F0aW9uIChiYXNpYykgaXMgZW5hYmxlZCBhdCB0aGUgY2xpZW50LXNpZGUgYnkgc2V0dGluZyB0aGUNCis8aT5zb2FwLnVzZXJpZDwvaT4gYW5kIDxpPnNvYXAucGFzc3dkPC9pPiBzdHJpbmdzIHRvIGEgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLA0KK3Jlc3BlY3RpdmVseS4gIEEgc2VydmVyIG1heSByZXF1ZXN0IHVzZXIgYXV0aGVudGljYXRpb24NCithbmQgZGVuaWVzIGFjY2VzcyAoSFRUUCA0MDEgZXJyb3IpIHdoZW4gdGhlIGNsaWVudCB0cmllcyB0byBjb25uZWN0IHdpdGhvdXQgSFRUUCBhdXRoZW50aWNhdGlvbiAob3Igd2l0aCB0aGUgd3JvbmcgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24pLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitIZXJlIGlzIGFuIGV4YW1wbGUgY2xpZW50IGNvZGUgZnJhZ21lbnQgdG8gc2V0IHRoZSBIVFRQIGF1dGhlbnRpY2F0aW9uIHVzZXJuYW1lIGFuZCBwYXNzd29yZDoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgc29hcDsgPGJyIC8+DQorc29hcF9pbml0KCZhbXA7c29hcCk7IDxiciAvPg0KK3NvYXAudXNlcmlkID0gImd1ZXN0IjsgPGJyIC8+DQorc29hcC5wYXNzd2QgPSAidmlzaXQiOyA8YnIgLz4NCisuLi4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK0EgY2xpZW50IFNPQVAgcmVxdWVzdCB3aWxsIGhhdmUgdGhlIGZvbGxvd2luZyBIVFRQIGhlYWRlcjoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEIwRDAiPjx0cj48dGQ+PHR0Pg0KK1BPU1QgL1hYWCBIVFRQLzEuMCA8YnIgLz4NCitIb3N0OiBZWVkgPGJyIC8+DQorVXNlci1BZ2VudDogZ1NPQVAvMi4yIDxiciAvPg0KK0NvbnRlbnQtVHlwZTogdGV4dC94bWw7IGNoYXJzZXQ9dXRmLTggPGJyIC8+DQorQ29udGVudC1MZW5ndGg6IG5ubiA8YnIgLz4NCitBdXRob3JpemF0aW9uOiBCYXNpYyBaM1ZsYzNRNlozVmxjM1E9IDxiciAvPg0KKy4uLg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3R0Pg0KK0EgY2xpZW50IE1VU1Qgc2V0IHRoZSA8aT5zb2FwLnVzZXJpZDwvaT4gYW5kIDxpPnNvYXAucGFzc3dkPC9pPiBzdHJpbmdzIGZvciBlYWNoIGNhbGwgdGhhdCByZXF1aXJlcyBjbGllbnQgYXV0aGVudGljYXRpb24uIFRoZSBzdHJpbmdzIGFyZSByZXNldCBhZnRlciBlYWNoIHN1Y2Nlc3NmdWwgb3IgdW5zdWNjZXNzZnVsIGNhbGwuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1doZW4gcHJlc2VudCwgdGhlIHZhbHVlIG9mIHRoZSA8aT5XV1ctQXV0aGVudGljYXRlPC9pPiBIVFRQIGhlYWRlciB3aXRoIHRoZSBhdXRoZW50aWNhdGlvbiByZWFsbSBjYW4gYmUgb2J0YWluZWQgZnJvbSB0aGUgPGk+c29hcC5hdXRocmVhbG08L2k+IHN0cmluZy4gVGhpcyBpcyB1c2VmdWwgZm9yIGNsaWVudHMgdG8gcmVzcG9uZCBpbnRlbGxpZ2VudGx5IHRvIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3RzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitBIHN0YW5kLWFsb25lIGdTT0FQIFdlYiBTZXJ2aWNlIGNhbiBlbmZvcmNlIEhUVFAgYXV0aGVudGljYXRpb24gdXBvbiBjbGllbnRzLCBieSBjaGVja2luZyB0aGUgPGk+c29hcC51c2VyaWQ8L2k+IGFuZCA8aT5zb2FwLnBhc3N3ZDwvaT4gc3RyaW5ncy4gVGhlc2Ugc3RyaW5ncyBhcmUgc2V0IHdoZW4gYSBjbGllbnQgcmVxdWVzdCBjb250YWlucyBIVFRQIGF1dGhlbnRpY2F0aW9uIGhlYWRlcnMuIFRoZSBzdHJpbmdzIFNIT1VMRCBiZSBjaGVja2VkIGluIGVhY2ggc2VydmljZSBtZXRob2QgKHRoYXQgcmVxdWlyZXMgYXV0aGVudGljYXRpb24gdG8gZXhlY3V0ZSkuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0hlcmUgaXMgYW4gZXhhbXBsZSBzZXJ2aWNlIG1ldGhvZCBpbXBsZW1lbnRhdGlvbiB0aGF0IGVuZm9yY2VkIGNsaWVudCBhdXRoZW50aWNhdGlvbjoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+aW50PC9iPiZuYnNwO25zX19tZXRob2QoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIC4uLikgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoIXNvYXA8dHQ+LSZndDs8L3R0Pi51c2VyaWQgPHR0Pnx8PC90dD4gIXNvYXA8dHQ+LSZndDs8L3R0Pi5wYXNzd2QgPHR0Pnx8PC90dD4NCitzdHJjbXAoc29hcDx0dD4tJmd0OzwvdHQ+LnVzZXJpZCwgImd1ZXN0IikgPHR0Pnx8PC90dD4NCitzdHJjbXAoc29hcDx0dD4tJmd0OzwvdHQ+LnBhc3N3ZCwgInZpc2l0IikpDQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cmV0dXJuPC9iPiZuYnNwOzQwMTsNCisuLi4gPGJyIC8+DQorfQ0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorV2hlbiB0aGUgYXV0aGVudGljYXRpb24gZmFpbHMsIHRoZSBzZXJ2aWNlIHJlc3BvbnNlIHdpdGggYSBTT0FQIEZhdWx0IG1lc3NhZ2UgYW5kIGEgSFRUUCBlcnJvciBjb2RlICI0MDEgVW5hdXRob3JpemVkIi4NCitUaGUgSFRUUCBlcnJvciBjb2RlcyBhcmUgZGVzY3JpYmVkIGluIFNlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOmVycmNvZGVzIj45LjI8L2E+Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJICAgICA8aDM+PGEgbmFtZT0idHRoX3NFYzE4LjE1Ij4NCisxOC4xNTwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+SFRUUCBQcm94eSBBdXRoZW50aWNhdGlvbjwvZm9udD48L2gzPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitIVFRQIHByb3h5IGF1dGhlbnRpY2F0aW9uIChiYXNpYykgaXMgZW5hYmxlZCBhdCB0aGUgY2xpZW50LXNpZGUgYnkgc2V0dGluZyB0aGUNCis8aT5zb2FwLnByb3h5X3VzZXJpZDwvaT4gYW5kIDxpPnNvYXAucHJveHlfcGFzc3dkPC9pPiBzdHJpbmdzIHRvIGEgdXNlcm5hbWUgYW5kDQorcGFzc3dvcmQsIHJlc3BlY3RpdmVseS4gIEZvciBleGFtcGxlLCBhIHByb3h5IHNlcnZlciBtYXkgcmVxdWVzdCB1c2VyDQorYXV0aGVudGljYXRpb24uIE90aGVyd2lzZSwgYWNjZXNzIGlzIGRlbmllZCBieSB0aGUgcHJveHkgKEhUVFAgNDA3IGVycm9yKS4NCitFeGFtcGxlIGNsaWVudCBjb2RlIGZyYWdtZW50IHRvIHNldCBwcm94eSBzZXJ2ZXIsIHVzZXJuYW1lLCBhbmQgcGFzc3dvcmQ6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwIHNvYXA7IDxiciAvPg0KK3NvYXBfaW5pdCgmYW1wO3NvYXApOyA8YnIgLz4NCitzb2FwLnByb3h5X2hvc3QgPSAieHgueHgueHgueHgiOyAvLyBJUCA8YnIgLz4NCitzb2FwLnByb3h5X3BvcnQgPSA4MDgwOyA8YnIgLz4NCitzb2FwLnByb3h5X3VzZXJpZCA9ICJndWVzdCI7IDxiciAvPg0KK3NvYXAucHJveHlfcGFzc3dkID0gImd1ZXN0IjsgPGJyIC8+DQorLi4uDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitBIGNsaWVudCBTT0FQIHJlcXVlc3Qgd2lsbCBoYXZlIHRoZSBmb2xsb3dpbmcgSFRUUCBoZWFkZXI6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBCMEQwIj48dHI+PHRkPjx0dD4NCitQT1NUIC9YWFggSFRUUC8xLjAgPGJyIC8+DQorSG9zdDogWVlZIDxiciAvPg0KK1VzZXItQWdlbnQ6IGdTT0FQLzIuMiA8YnIgLz4NCitDb250ZW50LVR5cGU6IHRleHQveG1sOyBjaGFyc2V0PXV0Zi04IDxiciAvPg0KK0NvbnRlbnQtTGVuZ3RoOiBubm4gPGJyIC8+DQorUHJveHktQXV0aG9yaXphdGlvbjogQmFzaWMgWjNWbGMzUTZaM1ZsYzNRPSA8YnIgLz4NCisuLi4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC90dD4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCSAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWMxOC4xNiI+DQorMTguMTY8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPlNwZWVkIEltcHJvdmVtZW50IFRpcHM8L2ZvbnQ+PC9oMz4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorSGVyZSBhcmUgc29tZSB0aXBzIHlvdSBjYW4gdXNlIHRvIHNwZWVkIHVwIGdTT0FQLiBnU09BUCdzIGRlZmF1bHQgc2V0dGluZ3MgYXJlIGNob29zZW4gdG8gbWF4aW1pemUgcG9ydGFiaWxpdHkgYW5kIGNvbXBhdGliaWxpdHkuIFRoZSBzZXR0aW5ncyBjYW4gYmUgdHdlYWtlZCB0byBvcHRpbWl6ZSB0aGUgcGVyZm9ybWFuY2UgYXMgZm9sbG93czoNCisNCis8dWw+DQorPGxpPiBJbmNyZWFzZSB0aGUgYnVmZmVyIHNpemUgPGk+U09BUF9CVUZMRU48L2k+IGJ5IGNoYW5naW5nIHRoZSA8aT5TT0FQX0JVRkxFTjwvaT4gbWFjcm8gaW4gPGk+c3Rkc29hcDIuaDwvaT4uIFVzZSBidWZmZXIgc2l6ZSAyPHN1cD4xPC9zdXA+OD0yNjIxNDQgZm9yIGV4YW1wbGUuDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorDQorPGxpPiBVc2UgSFRUUCBrZWVwLWFsaXZlIGF0IHRoZSBjbGllbnQtc2lkZSwgc2VlJm5ic3A7PGEgaHJlZj0iI3NlYzprZWVwYWxpdmUiPjE4LjExPC9hPiwgd2hlbiB0aGUgY2xpZW50IG5lZWRzIHRvIG1ha2UgYSBzZXJpZXMgb2YgY2FsbHMgdG8gdGhlIHNhbWUgc2VydmVyLiBTZXJ2ZXItc2lkZSBrZWVwLWFsaXZlIHN1cHBvcnQgY2FuIGdyZWF0bHkgaW1wcm92ZSBwZXJmb3JtYW5jZSBvZiBib3RoIGNsaWVudCBhbmQgc2VydmVyLiBCdXQgYmUgYXdhcmUgdGhhdCBjbGllbnRzIGFuZCBzZXJ2aWNlcyB1bmRlciBVbml4L0xpbnV4IHJlcXVpcmUgc2lnbmFsIGhhbmRsZXJzIHRvIGNhdGNoIGRyb3BwZWQgY29ubmVjdGlvbnMuDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorDQorPGxpPiBVc2UgSFRUUCBjaHVua2VkIHRyYW5zZmVycywgc2VlJm5ic3A7PGEgaHJlZj0iI3NlYzpjaHVua2VkIj4xOC4xMjwvYT4uDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorDQorPGxpPiBEbyBOT1QgdXNlIGd6aXAgY29tcHJlc3Npb24sIGV2ZW4gd2hlbiB0cmFuc2ZlcnJpbmcgZGF0YSBvdmVyIGEgbW9kZW0gY29ubmVjdGlvbi4gTW9kZW1zIGFscmVhZHkgY29tcHJlc3MgZGF0YSB0cmFuc2ZlcnMuDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorPC91bD4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCSAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWMxOC4xNyI+DQorMTguMTc8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPlRpbWVvdXQgTWFuYWdlbWVudCBmb3IgTm9uLUJsb2NraW5nIE9wZXJhdGlvbnM8L2ZvbnQ+PC9oMz48YSBuYW1lPSJzZWM6dGltZW91dCI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitTb2NrZXQgY29ubmVjdCwgYWNjZXB0LCBzZW5kLCBhbmQgcmVjZWl2ZSB0aW1lb3V0IHZhbHVlcyBjYW4gYmUgc2V0IHRvIG1hbmFnZQ0KK3NvY2tldCBjb21tdW5pY2F0aW9uIHRpbWVvdXRzLiAgVGhlIDxpPnNvYXAuY29ubmVjdF90aW1lb3V0PC9pPiwNCis8aT5zb2FwLmFjY2VwdF90aW1lb3V0PC9pPiwgPGk+c29hcC5zZW5kX3RpbWVvdXQ8L2k+LCBhbmQNCis8aT5zb2FwLnJlY3ZfdGltZW91dDwvaT4gYXR0cmlidXRlcyBvZiB0aGUgY3VycmVudCBnU09BUCBydW50aW1lIGVudmlyb25tZW50DQorPGk+c29hcDwvaT4gY2FuIGJlIHNldCB0byB0aGUgYXBwcm9wcmlhdGUgdXNlci1kZWZpbmVkIHNvY2tldCBzZW5kLCByZWNlaXZlLCBhbmQNCithY2NlcHQgdGltZW91dCB2YWx1ZXMuICBBIHBvc2l0aXZlIHZhbHVlIG1lYXN1cmVzIHRoZSB0aW1lb3V0IGluIHNlY29uZHMuIEENCituZWdhdGl2ZSB0aW1lb3V0IHZhbHVlIG1lYXN1cmVzIHRoZSB0aW1lb3V0IGluIG1pY3Jvc2Vjb25kcyAoMTA8c3VwPjxmb250IGZhY2U9InN5bWJvbCI+LTwvZm9udA0KKz42PC9zdXA+IHNlYykuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSA8aT5zb2FwLmNvbm5lY3RfdGltZW91dDwvaT4gc3BlY2lmaWVzIHRoZSB0aW1lb3V0IHZhbHVlIGZvcg0KKzxpPnNvYXBfY2FsbF9uc19fbWV0aG9kPC9pPiBjYWxscy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIDxpPnNvYXAuYWNjZXB0X3RpbWVvdXQ8L2k+IHNwZWNpZmllcyB0aGUgdGltZW91dCB2YWx1ZSBmb3INCis8aT5zb2FwX2FjY2VwdCgmYW1wO3NvYXApPC9pPiBjYWxscy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIDxpPnNvYXAuc2VuZF90aW1lb3V0PC9pPiBhbmQgPGk+c29hcC5yZWN2X3RpbWVvdXQ8L2k+IHNwZWNpZnkgdGhlIHRpbWVvdXQNCit2YWx1ZXMgZm9yIG5vbi1ibG9ja2luZyBzb2NrZXQgSS9PIG9wZXJhdGlvbnMuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0V4YW1wbGU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwIHNvYXA7IDxiciAvPg0KK3NvYXBfaW5pdCgmYW1wO3NvYXApOyA8YnIgLz4NCitzb2FwLnNlbmRfdGltZW91dCA9IDEwOyA8YnIgLz4NCitzb2FwLnJlY3ZfdGltZW91dCA9IDEwOyANCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoaXMgd2lsbCByZXN1bHQgaW4gYSB0aW1lb3V0IGlmIG5vIGRhdGEgY2FuIGJlIHNlbmQgaW4gMTAgc2Vjb25kcyBhbmQgbm8gZGF0YSBpcyByZWNlaXZlZCB3aXRoaW4gMTAgc2Vjb25kcyBhZnRlciBpbml0aWF0aW5nDQorYSBzZW5kIG9yIHJlY2VpdmUgb3BlcmF0aW9uIG92ZXIgdGhlIHNvY2tldC4gQSB2YWx1ZSBvZiB6ZXJvIGRpc2FibGVzIHRpbWVvdXQsIGZvciBleGFtcGxlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCitzb2FwLnNlbmRfdGltZW91dCA9IDA7IDxiciAvPg0KK3NvYXAucmVjdl90aW1lb3V0ID0gMDsgDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitXaGVuIGEgdGltZW91dCBvY2N1cnMgaW4gc2VuZC9yZWNlaXZlIG9wZXJhdGlvbnMsIGEgPGk+U09BUF9FT0Y8L2k+IGV4Y2VwdGlvbiB3aWxsIGJlIHJhaXNlZCAoImVuZCBvZiBmaWxlIG9yIG5vIGlucHV0IikuDQorTmVnYXRpdmUgdGltZW91dCB2YWx1ZXMgbWVhc3VyZSB0aW1lb3V0cyBpbiBtaWNyb3NlY29uZHMsIGZvciBleGFtcGxlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisjZGVmaW5lIHVTZWMgKi0xIDxiciAvPg0KKyNkZWZpbmUgbVNlYyAqLTEwMDAgPGJyIC8+DQorc29hcC5hY2NlcHRfdGltZW91dCA9IDEwIHVTZWM7IDxiciAvPg0KK3NvYXAuc2VuZF90aW1lb3V0ID0gMjAgbVNlYzsgPGJyIC8+DQorc29hcC5yZWN2X3RpbWVvdXQgPSAyMCBtU2VjOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlIG1hY3JvcyBpbXByb3ZlIHJlYWRhYmlsaXR5Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+Q2F1dGlvbjwvYj48L2ZvbnQ+OiBNYW55IExpbnV4IHZlcnNpb25zIGRvIG5vdCBzdXBwb3J0IG5vbi1ibG9ja2luZyA8aT5jb25uZWN0KCk8L2k+LiBUaGVyZWZvcmUsIHNldHRpbmcgPGk+c29hcC5jb25uZWN0X3RpbWVvdXQ8L2k+IGZvcg0KK25vbi1ibG9ja2luZyA8aT5zb2FwX2NhbGxfbnNfX21ldGhvZDwvaT4gY2FsbHMgbWF5IG5vdCB3b3JrIHVuZGVyIExpbnV4Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJICAgICA8aDM+PGEgbmFtZT0idHRoX3NFYzE4LjE4Ij4NCisxOC4xODwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+U29ja2V0IE9wdGlvbnMgYW5kIEZsYWdzPC9mb250PjwvaDM+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK2dTT0FQJ3Mgc29ja2V0IGNvbW11bmljYXRpb25zIGNhbiBiZSBjb250cm9sbGVkIHdpdGggc29ja2V0IG9wdGlvbnMgYW5kIGZsYWdzLg0KK1RoZSBnU09BUCBydW4tdGltZSBlbnZpcm9ubWVudCA8aT48Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcDwvaT4gZmxhZ3MgYXJlOg0KKzxpPjxiPmludDwvYj4mbmJzcDtzb2FwLnNvY2tldF9mbGFnczwvaT4gdG8gY29udHJvbCBzb2NrZXQgc2VuZCgpIGFuZCByZWN2KCkgY2FsbHMsDQorPGk+PGI+aW50PC9iPiZuYnNwO3NvYXAuY29ubmVjdF9mbGFnczwvaT4gdG8gc2V0IGNsaWVudCBjb25uZWN0aW9uIHNvY2tldCBvcHRpb25zLA0KKzxpPjxiPmludDwvYj4mbmJzcDtzb2FwLmJpbmRfZmxhZ3M8L2k+IHRvIHNldCBzZXJ2ZXItc2lkZSBwb3J0IGJpbmQgc29ja2V0IG9wdGlvbnMsDQorPGk+PGI+aW50PC9iPiZuYnNwO3NvYXAuYWNjZXB0X2ZsYWdzPC9pPiB0byBzZXQgc2VydmVyLXNpZGUgcmVxdWVzdCBtZXNzYWdlIGFjY2VwdA0KK3NvY2tldCBvcHRpb25zLiBTZWUgdGhlIG1hbnVhbCBwYWdlcyBvZiA8aT5zZW5kPC9pPiBhbmQgPGk+cmVjdjwvaT4gZm9yDQorPGk+c29hcC5zb2NrZXRfZmxhZ3M8L2k+IHZhbHVlcyBhbmQgc2VlIHRoZSBtYW51YWwgcGFnZXMgb2YNCis8aT5zZXRzb2Nrb3B0PC9pPiBmb3INCis8aT5zb2FwLmNvbm5lY3RfZmxhZ3M8L2k+LCA8aT5zb2FwLmJpbmRfZmxhZ3M8L2k+LCBhbmQNCis8aT5zb2FwLmFjY2VwdF9mbGFnczwvaT4gKFNPTF9TT0NLRVQpIHZhbHVlcy4NCitUaGVzZSA8aT5TT188L2k+IHNvY2tldCBvcHRpb24gZmxhZ3MgKHNlZSA8aT5zZXRzb2Nrb3B0PC9pPiBtYW51YWwgcGFnZXMpDQorY2FuIGJlIGJpdC13aXNlIG9yLWVkIHRvIHNldCBtdWx0aXBsZQ0KK3NvY2tldCBvcHRpb25zIGF0IG9uY2UuDQorVGhlIGNsaWVudC1zaWRlIGZsYWcgPGk+c29hcC5jb25uZWN0X2ZsYWdzPVNPX0xJTkdFUjwvaT4gaXMgc3VwcG9ydGVkIHdpdGggdmFsdWVzIDxpPmxfb25vZmY9MTwvaT4gYW5kIDxpPmxfbGluZ2VyPTA8L2k+Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitGb3IgZXhhbXBsZSwgdG8gZGlzYWJsZSBzaWdwaXBlIHNpZ25hbHMgb24gVW5peC9MaW51eCBwbGF0Zm9ybXMgdXNlOiANCis8aT5zb2FwLnNvY2tldF9mbGFncz1NU0dfTk9TSUdOQUw8L2k+IGFuZC9vcg0KKzxpPnNvYXAuY29ubmVjdF9mbGFncz1TT19OT1NJR1BJUEU8L2k+IChpLmUuJm5ic3A7Y2xpZW50LXNpZGUgY29ubmVjdCkgZGVwZW5kaW5nDQorb24geW91ciBwbGF0Zm9ybS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVXNlIDxpPnNvYXAuYmluZF9mbGFncz1TT19SRVVTRUFERFI8L2k+IHRvIGVuYWJsZSBzZXJ2ZXItc2lkZSBwb3J0IHJldXNlIGFuZA0KK2xvY2FsIHBvcnQNCitzaGFyaW5nIChidXQgYmUgYXdhcmUgb2YgdGhlIHNlY3VyaXR5IGlzc3VlcyB3aGVuIHRoZSBwb3J0IGlzIG5vdCBibG9ja2VkIGJ5IGENCitmaXJld2FsbCBhbmQgb3BlbiB0byB0aGUgSW50ZXJuZXQpLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJICAgICA8aDM+PGEgbmFtZT0idHRoX3NFYzE4LjE5Ij4NCisxOC4xOTwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+U2VjdXJlIFNPQVAgV2ViIFNlcnZpY2VzIHdpdGggSFRUUFMvU1NMPC9mb250PjwvaDM+Jm5ic3A7PGEgbmFtZT0ic2VjOnNlcnZlcm9wZW5zc2wiPg0KKzwvYT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorV2hlbiBhIFdlYiBTZXJ2aWNlIGlzIGluc3RhbGxlZCBhcyBDR0ksIGl0IHVzZXMgc3RhbmRhcmQgSS9PIHRoYXQgaXMgZW5jcnlwdGVkL2RlY3J5cHRlZCBieSB0aGUgV2ViIHNlcnZlciB0aGF0IHJ1bnMgdGhlIENHSQ0KK2FwcGxpY2F0aW9uLg0KK1RoZXJlZm9yZSwgSFRUUFMvU1NMIHN1cHBvcnQgbXVzdCBiZSBjb25maWd1cmVkIGZvciB0aGUgV2ViIHNlcnZlciAobm90IENHSS1iYXNlZCBXZWIgU2VydmljZSBhcHBsaWNhdGlvbiBpdHNlbGYpLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUbyBlbmFibGUgT3BlblNTTCwgZmlyc3QgaW5zdGFsbCBPcGVuU1NMIGFuZCB1c2Ugb3B0aW9uIDxpPi1EV0lUSF9PUEVOU1NMPC9pPiB0byBjb21waWxlIHRoZSBzb3VyY2VzIHdpdGggeW91ciBDIG9yIEMrKyBjb21waWxlciwgZm9yIGV4YW1wbGU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjRDBEMEQwIj48dHI+PHRkPjxzcGFuIGNsYXNzPSJyb21hbiI+DQorPGk+ZysrIC1EV0lUSF9PUEVOU1NMIC1vIG15cHJvZyBteXByb2cuY3BwIHN0ZHNvYXAyLmNwcCBzb2FwQy5jcHAgc29hcFNlcnZlci5jcHAgLWxzc2wgLWxjcnlwdG88L2k+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvc3Bhbj4NCitTU0wgc3VwcG9ydCBmb3Igc3RhbmQtYWxvbmUgZ1NPQVAgV2ViIHNlcnZpY2VzIGlzIGVuYWJsZWQgYnkgY2FsbGluZyA8aT5zb2FwX3NzbF9hY2NlcHQ8L2k+IGFmdGVyIDxpPnNvYXBfYWNjZXB0PC9pPi4NCitJbiBhZGRpdGlvbiwgYSBrZXkgZmlsZSwgYSBDQSBmaWxlIChvciBwYXRoIHRvIGNlcnRpZmljYXRlcyksIERIIGZpbGUgKGlmIFJTQSBpcyBub3QgdXNlZCksIGFuZCBwYXNzd29yZCBuZWVkIHRvIGJlIHN1cHBsaWVkLiBJbnN0cnVjdGlvbnMgb24gaG93IHRvIGRvIHRoaXMgY2FuIGJlIGZvdW5kIGluIHRoZQ0KK09wZW5TU0wgZG9jdW1lbnRhdGlvbiA8aT5odHRwOi8vd3d3Lm9wZW5zc2wub3JnPC9pPi4gU2VlIGFsc28gU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6c3NsIj4xOC4yMjwvYT4uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0xldCdzIHRha2UgYSBsb29rIGF0IGFuIGV4YW1wbGUgU1NMIHNlY3VyZQ0KK211bHRpLXRocmVhZGVkIHN0YW5kLWFsb25lIFNPQVAgV2ViIFNlcnZpY2U6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPmludDwvYj4mbmJzcDttYWluKCkgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7bSwgczsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7cHRocmVhZF90IHRpZDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgc29hcCwgKnRzb2FwOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX3NzbF9pbml0KCk7IC8qIGluaXQgT3BlblNTTCAoanVzdCBvbmNlKSAqLzxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyhDUllQVE9fdGhyZWFkX3NldHVwKCkpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZnByaW50ZihzdGRlcnIsICJDYW5ub3Qgc2V0dXAgdGhyZWFkIG11dGV4XG4iKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZXhpdCgxKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2luaXQoJmFtcDtzb2FwKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KHNvYXBfc3NsX3NlcnZlcl9jb250ZXh0KCZhbXA7c29hcCwgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U09BUF9TU0xfREVGQVVMVCwgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7InNlcnZlci5wZW0iLAkvKiBrZXlmaWxlOiByZXF1aXJlZCB3aGVuIHNlcnZlciBtdXN0IGF1dGhlbnRpY2F0ZSB0byBjbGllbnRzIChzZWUgU1NMIGRvY3Mgb24gaG93IHRvIG9idGFpbiB0aGlzIGZpbGUpICovIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyJwYXNzd29yZCIsCS8qIHBhc3N3b3JkIHRvIHJlYWQgdGhlIGtleSBmaWxlICovIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyJjYWNlcnQucGVtIiwJLyogb3B0aW9uYWwgY2FjZXJ0IGZpbGUgdG8gc3RvcmUgdHJ1c3RlZCBjZXJ0aWZpY2F0ZXMgKi8gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7TlVMTCwJCS8qIG9wdGlvbmFsIGNhcGF0aCB0byBkaXJlY3Rvcnkgd2l0aCB0cnVzdGVkIGNlcnRpZmljYXRlcyAqLyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsiZGg1MTIucGVtIiwJLyogREggZmlsZSwgaWYgTlVMTCB1c2UgUlNBICovIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO05VTEwsCQkvKiBpZiByYW5kZmlsZSE9TlVMTDogdXNlIGEgZmlsZSB3aXRoIHJhbmRvbSBkYXRhIHRvIHNlZWQgcmFuZG9tbmVzcyAqLyAgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7TlVMTAkJLyogb3B0aW9uYWwgc2VydmVyIGlkZW50aWZpY2F0aW9uIHRvIGVuYWJsZSBTU0wgc2Vzc2lvbiBjYWNoZSAobXVzdCBiZSBhIHVuaXF1ZSBuYW1lKSAqLw0KKyZuYnNwOyZuYnNwOyZuYnNwOykpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9wcmludF9mYXVsdCgmYW1wO3NvYXAsIHN0ZGVycik7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2V4aXQoMSk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO30gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7bSA9IHNvYXBfYmluZCgmYW1wO3NvYXAsIE5VTEwsIDE4MDAwLCAxMDApOyAvLyB1c2UgcG9ydCAxODAwMCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsobSAgJmx0OyAgMCkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwX3ByaW50X2ZhdWx0KCZhbXA7c29hcCwgc3RkZXJyKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZXhpdCgxKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtmcHJpbnRmKHN0ZGVyciwgIlNvY2tldCBjb25uZWN0aW9uIHN1Y2Nlc3NmdWw6IG1hc3RlciBzb2NrZXQgPSAlZDx0dD5cPC90dD5uIiwgbSk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmZvcjwvYj4mbmJzcDsoOzspIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7cyA9IHNvYXBfYWNjZXB0KCZhbXA7c29hcCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2ZwcmludGYoc3RkZXJyLCAiU29ja2V0IGNvbm5lY3Rpb24gc3VjY2Vzc2Z1bDogc2xhdmUgc29ja2V0ID0gJWQ8dHQ+XDwvdHQ+biIsIHMpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsocyAgJmx0OyAgMCkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7eyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwX3ByaW50X2ZhdWx0KCZhbXA7c29hcCwgc3RkZXJyKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+YnJlYWs8L2I+OyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDt9IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3Rzb2FwID0gc29hcF9jb3B5KCZhbXA7c29hcCk7IC8qIHNob3VsZCBjYWxsIHNvYXBfc3NsX2FjY2VwdCBvbiBhIGNvcHkgKi8gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KCF0c29hcCkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+YnJlYWs8L2I+OyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoc29hcF9zc2xfYWNjZXB0KHRzb2FwKSkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7eyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwX3ByaW50X2ZhdWx0KHRzb2FwLCBzdGRlcnIpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2RvbmUodHNvYXApOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtmcmVlKHRzb2FwKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Y29udGludWU8L2I+OyAvKiB3aGVuIHNvYXBfc3NsX2FjY2VwdCBmYWlscywgd2Ugc2hvdWxkIGp1c3QgZ28gb24gKi8gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtwdGhyZWFkX2NyZWF0ZSgmYW1wO3RpZCwgTlVMTCwgJmFtcDtwcm9jZXNzX3JlcXVlc3QsICg8Yj52b2lkPC9iPiopdHNvYXApOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt9IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfZG9uZSgmYW1wO3NvYXApOyAvKiBkZWFsbG9jYXRlcyBTU0wgY29udGV4dCAqLzxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO0NSWVBUT190aHJlYWRfY2xlYW51cCgpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7MDsgPGJyIC8+DQorfSAgPGJyIC8+DQorPGI+dm9pZDwvYj4mbmJzcDsqcHJvY2Vzc19yZXF1ZXN0KDxiPnZvaWQ8L2I+Jm5ic3A7KnNvYXApIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7cHRocmVhZF9kZXRhY2gocHRocmVhZF9zZWxmKCkpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX3NlcnZlKCg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCopc29hcCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfZGVzdHJveSgoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAqKXNvYXApOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2VuZCgoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAqKXNvYXApOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2RvbmUoKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwKilzb2FwKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7ZnJlZShzb2FwKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cmV0dXJuPC9iPiZuYnNwO05VTEw7IDxiciAvPg0KK30NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoZSA8aT5zb2FwX3NzbF9zZXJ2ZXJfY29udGV4dDwvaT4gZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIHNlcnZlci1zaWRlIFNTTCBjb250ZXh0LiBUaGUgPGk+c2VydmVyLnBlbTwvaT4ga2V5IGZpbGUgaXMgdGhlIHNlcnZlcidzIHByaXZhdGUga2V5LiBUaGUgPGk+Y2FjZXJ0LnBlbTwvaT4gaXMgdXNlZCB0byBhdXRoZW50aWNhdGUgY2xpZW50cyBhbmQgY29udGFpbnMgdGhlIGNsaWVudCBjZXJ0aWZpY2F0ZXMuIEFsdGVybmF0aXZlbHkgYSBkaXJlY3RvcnkgbmFtZSBjYW4gYmUgc3BlY2lmaWVkLiBUaGlzIGRpcmVjdG9yeSBpcyBhc3N1bWVkIHRvIGNvbnRhaW4gdGhlIGNlcnRpZmljYXRlcy4gVGhlIDxpPmRoNTEyLnBlbTwvaT4gZmlsZSBzcGVjaWZpZXMgdGhhdCBESCB3aWxsIGJlIHVzZWQgZm9yIGtleSBhZ3JlZW1lbnQgaW5zdGVhZCBvZiBSU0EuIFRoZSByYW5kZmlsZSBlbnRyeSBjYW4gYmUgdXNlZCB0byBzZWVkIHRoZSBQUk5HLiBUaGUgbGFzdCBlbnRyeSBlbmFibGUgc2VydmVyLXNpZGUgc2Vzc2lvbiBjYWNoaW5nLiBBIHVuaXF1ZSBzZXJ2ZXIgbmFtZSBpcyByZXF1aXJlZC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIDxpPkNSWVBUT190aHJlYWRfc2V0dXAoKTwvaT4gYW5kIDxpPkNSWVBUT190aHJlYWRfY2xlYW51cCgpPC9pPiByb3V0aW5lcyBjYW4gYmUgZm91bmQgaW4gPGk+b3BlbnNzbC9jcnlwdG8vdGhyZWFkcy90aC1sb2NrLmM8L2k+LiBUaGVzZSByb3V0aW5lcyBhcmUgcmVxdWlyZWQgdG8gc2V0dXAgbG9ja3MgZm9yIG11bHRpLXRocmVhZGVkIGFwcGxpY2F0aW9ucyB0aGF0IHVzZSBTU0wuDQorV2UgZ2l2ZSBhIFdpbmRvd3MgYW5kIFBPU0lYIHRocmVhZHMgaW1wbGVtZW50YXRpb24gb2YgdGhlc2UgaGVyZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorI2luY2x1ZGUgICZsdDsgdW5pc3RkLmggJmd0OyAJCS8qIGRlZmluZXMgX1BPU0lYX1RIUkVBRFMgaWYgcHRocmVhZHMgYXJlIGF2YWlsYWJsZSAqLyA8YnIgLz4NCisjaWZkZWYgX1BPU0lYX1RIUkVBRFMgPGJyIC8+DQorIyBpbmNsdWRlICAmbHQ7IHB0aHJlYWQuaCAmZ3Q7ICA8YnIgLz4NCisjZW5kaWYgPGJyIC8+DQorI2lmIGRlZmluZWQoV0lOMzIpIDxiciAvPg0KKyMgZGVmaW5lIE1VVEVYX1RZUEUgICAgICAgICAgICAgSEFORExFIDxiciAvPg0KKyMgZGVmaW5lIE1VVEVYX1NFVFVQKHgpICAgICAgICAgKHgpID0gQ3JlYXRlTXV0ZXgoTlVMTCwgRkFMU0UsIE5VTEwpIDxiciAvPg0KKyMgZGVmaW5lIE1VVEVYX0NMRUFOVVAoeCkgICAgICAgQ2xvc2VIYW5kbGUoeCkgPGJyIC8+DQorIyBkZWZpbmUgTVVURVhfTE9DSyh4KSAgICAgICAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0KCh4KSwgSU5GSU5JVEUpIDxiciAvPg0KKyMgZGVmaW5lIE1VVEVYX1VOTE9DSyh4KSAgICAgICAgUmVsZWFzZU11dGV4KHgpIDxiciAvPg0KKyMgZGVmaW5lIFRIUkVBRF9JRCAgICAgICAgICAgICAgR2V0Q3VycmVudFRocmVhZElEKCkgPGJyIC8+DQorI2VsaWYgZGVmaW5lZChfUE9TSVhfVEhSRUFEUykgPGJyIC8+DQorIyBkZWZpbmUgTVVURVhfVFlQRSAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3QgPGJyIC8+DQorIyBkZWZpbmUgTVVURVhfU0VUVVAoeCkgICAgICAgICBwdGhyZWFkX211dGV4X2luaXQoJmFtcDsoeCksIE5VTEwpIDxiciAvPg0KKyMgZGVmaW5lIE1VVEVYX0NMRUFOVVAoeCkgICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZhbXA7KHgpKSA8YnIgLz4NCisjIGRlZmluZSBNVVRFWF9MT0NLKHgpICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmYW1wOyh4KSkgPGJyIC8+DQorIyBkZWZpbmUgTVVURVhfVU5MT0NLKHgpICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmYW1wOyh4KSkgPGJyIC8+DQorIyBkZWZpbmUgVEhSRUFEX0lEICAgICAgICAgICAgICBwdGhyZWFkX3NlbGYoKSA8YnIgLz4NCisjZWxzZSA8YnIgLz4NCisjIGVycm9yICJZb3UgbXVzdCBkZWZpbmUgbXV0ZXggb3BlcmF0aW9ucyBhcHByb3ByaWF0ZSBmb3IgeW91ciBwbGF0Zm9ybSIgPGJyIC8+DQorIyBlcnJvciAiU2VlIE9wZW5TU0wgL3RocmVhZHMvdGgtbG9jay5jIG9uIGhvdyB0byBpbXBsZW1lbnQgbXV0ZXggb24geW91ciBwbGF0Zm9ybSIgPGJyIC8+DQorI2VuZGlmIDxiciAvPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtDUllQVE9fZHlubG9ja192YWx1ZSB7IE1VVEVYX1RZUEUgbXV0ZXg7IH07IDxiciAvPg0KKzxiPnN0YXRpYzwvYj4mbmJzcDtNVVRFWF9UWVBFICptdXRleF9idWY7IDxiciAvPg0KKzxiPnN0YXRpYzwvYj4mbmJzcDs8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7Q1JZUFRPX2R5bmxvY2tfdmFsdWUgKmR5bl9jcmVhdGVfZnVuY3Rpb24oPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqZmlsZSwgPGI+aW50PC9iPiZuYnNwO2xpbmUpIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+c3RydWN0PC9iPiZuYnNwO0NSWVBUT19keW5sb2NrX3ZhbHVlICp2YWx1ZTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7dmFsdWUgPSAoPGI+c3RydWN0PC9iPiZuYnNwO0NSWVBUT19keW5sb2NrX3ZhbHVlKiltYWxsb2MoPGI+c2l6ZW9mPC9iPig8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7Q1JZUFRPX2R5bmxvY2tfdmFsdWUpKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KHZhbHVlKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtNVVRFWF9TRVRVUCh2YWx1ZTx0dD4tJmd0OzwvdHQ+bXV0ZXgpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7dmFsdWU7IDxiciAvPg0KK30gPGJyIC8+DQorPGI+c3RhdGljPC9iPiZuYnNwOzxiPnZvaWQ8L2I+Jm5ic3A7ZHluX2xvY2tfZnVuY3Rpb24oPGI+aW50PC9iPiZuYnNwO21vZGUsIDxiPnN0cnVjdDwvYj4mbmJzcDtDUllQVE9fZHlubG9ja192YWx1ZSAqbCwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqZmlsZSwgPGI+aW50PC9iPiZuYnNwO2xpbmUpIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KG1vZGUgJmFtcDsgQ1JZUFRPX0xPQ0spIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO01VVEVYX0xPQ0sobDx0dD4tJmd0OzwvdHQ+bXV0ZXgpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5lbHNlPC9iPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO01VVEVYX1VOTE9DSyhsPHR0Pi0mZ3Q7PC90dD5tdXRleCk7IDxiciAvPg0KK30gPGJyIC8+DQorPGI+c3RhdGljPC9iPiZuYnNwOzxiPnZvaWQ8L2I+Jm5ic3A7ZHluX2Rlc3Ryb3lfZnVuY3Rpb24oPGI+c3RydWN0PC9iPiZuYnNwO0NSWVBUT19keW5sb2NrX3ZhbHVlICpsLCA8Yj5jb25zdDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypmaWxlLCA8Yj5pbnQ8L2I+Jm5ic3A7bGluZSkgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtNVVRFWF9DTEVBTlVQKGw8dHQ+LTwvdHQ+JiM2MjttdXRleCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO2ZyZWUobCk7IDxiciAvPg0KK30gPGJyIC8+DQorPGI+dm9pZDwvYj4mbmJzcDtsb2NraW5nX2Z1bmN0aW9uKDxiPmludDwvYj4mbmJzcDttb2RlLCA8Yj5pbnQ8L2I+Jm5ic3A7biwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqZmlsZSwgPGI+aW50PC9iPiZuYnNwO2xpbmUpIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KG1vZGUgJmFtcDsgQ1JZUFRPX0xPQ0spIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO01VVEVYX0xPQ0sobXV0ZXhfYnVmW25dKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+ZWxzZTwvYj48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtNVVRFWF9VTkxPQ0sobXV0ZXhfYnVmW25dKTsgPGJyIC8+DQorfSA8YnIgLz4NCis8Yj51bnNpZ25lZDwvYj4mbmJzcDs8Yj5sb25nPC9iPiZuYnNwO2lkX2Z1bmN0aW9uKCkgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7KDxiPnVuc2lnbmVkPC9iPiZuYnNwOzxiPmxvbmc8L2I+KVRIUkVBRF9JRDsgPGJyIC8+DQorfSA8YnIgLz4NCis8Yj5pbnQ8L2I+Jm5ic3A7Q1JZUFRPX3RocmVhZF9zZXR1cCgpIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aW50PC9iPiZuYnNwO2k7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO211dGV4X2J1ZiA9IChNVVRFWF9UWVBFKiltYWxsb2MoQ1JZUFRPX251bV9sb2NrcygpICogc2l6ZW9mKHB0aHJlYWRfbXV0ZXhfdCkpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoIW11dGV4X2J1ZikgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cmV0dXJuPC9iPiZuYnNwO1NPQVBfRU9NOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5mb3I8L2I+Jm5ic3A7KGkgPSAwOyBpICAmbHQ7ICBDUllQVE9fbnVtX2xvY2tzKCk7IGkrKykgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7TVVURVhfU0VUVVAobXV0ZXhfYnVmW2ldKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Q1JZUFRPX3NldF9pZF9jYWxsYmFjayhpZF9mdW5jdGlvbik7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO0NSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFjayhsb2NraW5nX2Z1bmN0aW9uKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Q1JZUFRPX3NldF9keW5sb2NrX2NyZWF0ZV9jYWxsYmFjayhkeW5fY3JlYXRlX2Z1bmN0aW9uKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Q1JZUFRPX3NldF9keW5sb2NrX2xvY2tfY2FsbGJhY2soZHluX2xvY2tfZnVuY3Rpb24pOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtDUllQVE9fc2V0X2R5bmxvY2tfZGVzdHJveV9jYWxsYmFjayhkeW5fZGVzdHJveV9mdW5jdGlvbik7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDtTT0FQX09LOyA8YnIgLz4NCit9IDxiciAvPg0KKzxiPnZvaWQ8L2I+Jm5ic3A7Q1JZUFRPX3RocmVhZF9jbGVhbnVwKCkgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7aTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KCFtdXRleF9idWYpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj47IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO0NSWVBUT19zZXRfaWRfY2FsbGJhY2soTlVMTCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO0NSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFjayhOVUxMKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Q1JZUFRPX3NldF9keW5sb2NrX2NyZWF0ZV9jYWxsYmFjayhOVUxMKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Q1JZUFRPX3NldF9keW5sb2NrX2xvY2tfY2FsbGJhY2soTlVMTCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO0NSWVBUT19zZXRfZHlubG9ja19kZXN0cm95X2NhbGxiYWNrKE5VTEwpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5mb3I8L2I+Jm5ic3A7KGkgPSAwOyBpICAmbHQ7ICBDUllQVE9fbnVtX2xvY2tzKCk7IGkrKykgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7TVVURVhfQ0xFQU5VUChtdXRleF9idWZbaV0pOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtmcmVlKG11dGV4X2J1Zik7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO211dGV4X2J1ZiA9IE5VTEw7IDxiciAvPg0KK30NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK0ZvciBVbml4IGFuZCBMaW51eCwgbWFrZSBzdXJlIHlvdSBoYXZlIHNpZ25hbCBoYW5kbGVycyBzZXQgaW4geW91ciBzZXJ2aWNlIGFuZC9vciBjbGllbnQgYXBwbGljYXRpb25zIHRvIGNhdGNoIGJyb2tlbiBjb25uZWN0aW9ucyAoPGk+U0lHUElQRTwvaT4pOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCitzaWduYWwoU0lHUElQRSwgc2lncGlwZV9oYW5kbGUpOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQord2hlcmUsIGZvciBleGFtcGxlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj52b2lkPC9iPiZuYnNwO3NpZ3BpcGVfaGFuZGxlKDxiPmludDwvYj4mbmJzcDt4KSB7IH0NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK0J5IGRlZmF1bHQsIGNsaWVudHMgYXJlIG5vdCByZXF1aXJlZCB0byBhdXRoZW50aWNhdGUuIFRvIHN1cHBvcnQgY2xpZW50IGF1dGhlbnRpY2F0aW9uIHVzZSB0aGUgZm9sbG93aW5nOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoc29hcF9zc2xfc2VydmVyX2NvbnRleHQoJmFtcDtzb2FwLCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTT0FQX1NTTF9SRVFVSVJFX0NMSUVOVF9BVVRIRU5USUNBVElPTiwgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7InNlcnZlci5wZW0iLCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsicGFzc3dvcmQiLCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsiY2FjZXJ0LnBlbSIsIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO05VTEwsIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyJkaDUxMi5wZW0iLCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtOVUxMLCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtOVUxMIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOykpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9wcmludF9mYXVsdCgmYW1wO3NvYXAsIHN0ZGVycik7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2V4aXQoMSk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO30NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoaXMgcmVxdWlyZXMgZWFjaCBjbGllbnQgdG8gYXV0aGVudGljYXRlIHdpdGggaXRzIGNlcnRpZmljYXRlLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgPGk+Y2FjZXJ0PC9pPiBmaWxlIGFuZCA8aT5jYXBhdGg8L2k+IGFyZSBvcHRpb25hbC4gRWl0aGVyIG9uZSBjYW4gYmUNCitzcGVjaWZpZWQgd2hlbiBjbGllbnRzIG11c3QgcnVuIG9uIG5vbi10cnVzdGVkIHN5c3RlbXMuIFdlIHdhbnQgdG8gYXZvaWQNCitzdG9yaW5nIHRydXN0ZWQgY2VydGlmaWNhdGVzIGluIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9uIHRoZSBmaWxlIHN5c3RlbSB3aGVuDQordGhhdCBpcyBub3Qgc2VjdXJlLiBUaGVyZWZvcmUsIGEgZmxhdCA8aT5jYWNlcnQucGVtPC9pPiBmaWxlIG9yIGRpcmVjdG9yeSBjYW4gYmUNCitzcGVjaWZpZWQgdG8gc3RvcmUgdHJ1c3RlZCBjZXJ0aWZpY2F0ZXMuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBnU09BUCBkaXN0cmlidXRpb24gaW5jbHVkZXMgYSA8aT5jYWNlcnRzLnBlbTwvaT4gZmlsZSB3aXRoIHRoZSBjZXJ0aWZpY2F0ZXMNCitvZiBhbGwgY2VydGlmaWNhdGUgYXV0aG9yaXRpZXMgc3VjaCBhcyBWZXJpc2lnbi4gWW91IGNhbiB1c2UgdGhpcyBmaWxlIHRvDQordmVyaWZ5IHRoZSBhdXRoZW50aWNhdGlvbiBvZiBzZXJ2ZXJzIHRoYXQgcHJvdmlkZSBjZXJ0aWZpY2F0ZXMgaXNzdWVkIGJ5IHRoZXNlDQorQ0FzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgPGk+Y2FjZXJ0LnBlbTwvaT4sIDxpPmNsaWVudC5wZW08L2k+LCBhbmQgPGk+c2VydmVyLnBlbTwvaT4gZmlsZXMgaW4gdGhlIGdTT0FQDQorZGlzdHJpYnV0aW9uIGFyZSBleGFtcGxlcyBvZiBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZXMuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5DYXV0aW9uPC9iPjwvZm9udD46IGl0IGlzIGltcG9ydGFudCB0aGF0IHRoZSA8aT5XSVRIX09QRU5TU0w8L2k+IG1hY3JvIE1VU1QgYmUgY29uc2lzdGVudGx5IGRlZmluZWQgdG8NCitjb21waWxlIHRoZSBzb3VyY2VzLCBzdWNoIGFzIDxpPnN0ZHNvYXAyLmNwcDwvaT4sIDxpPnNvYXBDLmNwcDwvaT4sDQorPGk+c29hcENsaWVudC5jcHA8L2k+LCA8aT5zb2FwU2VydmVyLmNwcDwvaT4sIGFuZCBhbGwgYXBwbGljYXRpb24gc291cmNlcyB0aGF0DQoraW5jbHVkZSA8aT5zdGRzb2FwMi5oPC9pPiBvciA8aT5zb2FwSC5oPC9pPi4gSWYgdGhlIG1hY3JvcyBhcmUgbm90IGNvbnNpc3RlbnRseQ0KK3VzZWQsIHRoZSBhcHBsaWNhdGlvbiB3aWxsIGNyYXNoIGR1ZSB0byBhIG1pc21hdGNoZXMgaW4gdGhlIGRlY2xhcmF0aW9uIGFuZA0KK2FjY2VzcyBvZiB0aGUgZ1NPQVAgZW52aXJvbm1lbnQuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkgICAgIDxoMz48YSBuYW1lPSJ0dGhfc0VjMTguMjAiPg0KKzE4LjIwPC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5TZWN1cmUgU09BUCBDbGllbnRzIHdpdGggSFRUUFMvU1NMPC9mb250PjwvaDM+PGEgbmFtZT0ic2VjOmNsaWVudG9wZW5zc2wiPg0KKzwvYT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorWW91IG5lZWQgdG8gaW5zdGFsbCB0aGUgT3BlblNTTCBsaWJyYXJ5IG9uIHlvdXIgcGxhdGZvcm0gdG8gZW5hYmxlIHNlY3VyZSBTT0FQIGNsaWVudHMgdG8gdXRpbGl6ZSBIVFRQUy9TU0wuDQorQWZ0ZXIgaW5zdGFsbGF0aW9uLCBjb21waWxlIGFsbCB0aGUgc291cmNlcyBvZiB5b3VyIGFwcGxpY2F0aW9uIHdpdGggb3B0aW9uIDxpPi1EV0lUSF9PUEVOU1NMPC9pPi4gRm9yIGV4YW1wbGUgb24gTGludXg6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjRDBEMEQwIj48dHI+PHRkPjxzcGFuIGNsYXNzPSJyb21hbiI+DQorPGk+ZysrIC1EV0lUSF9PUEVOU1NMIG15Y2xpZW50LmNwcCBzdGRzb2FwLmNwcCBzb2FwQy5jcHAgc29hcENsaWVudC5jcHAgLWxzc2wgLWxjcnlwdG88L2k+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvc3Bhbj4NCitvciBVbml4Og0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKzxpPmcrKyAtRFdJVEhfT1BFTlNTTCBteWNsaWVudC5jcHAgc3Rkc29hcC5jcHAgc29hcEMuY3BwIHNvYXBDbGllbnQuY3BwIC1seG5ldCAtbHNvY2tldCAtbG5zbCAtbHNzbCAtbGNyeXB0bzwvaT4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9zcGFuPg0KK29yIHlvdSBjYW4gYWRkIHRoZSBmb2xsb3dpbmcgbGluZSB0byA8aT5zb2FwZGVmcy5oPC9pPjoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorI2RlZmluZSBXSVRIX09QRU5TU0wNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK2FuZCBjb21waWxlIHdpdGggb3B0aW9uIDxpPi1EV0lUSF9TT0FQREVGU19IPC9pPiB0byBpbmNsdWRlIDxpPnNvYXBkZWZzLmg8L2k+IGluIHlvdXIgcHJvamVjdC4NCitBIGNsaWVudCBwcm9ncmFtIHNpbXBseSB1c2VzIHRoZSBwcmVmaXggPGk+aHR0cHM6PC9pPiBpbnN0ZWFkIG9mIDxpPmh0dHA6PC9pPiBpbiB0aGUgZW5kcG9pbnQgVVJMIG9mIGEgcmVtb3RlIG1ldGhvZCBjYWxsIHRvIGENCitXZWIgU2VydmljZSB0byB1c2UgZW5jcnlwdGVkIHRyYW5zZmVycyAoaWYgdGhlIHNlcnZpY2Ugc3VwcG9ydHMgSFRUUFMpLiBZb3UgbmVlZCB0byBzcGVjaWZ5IHRoZSBjbGllbnQtc2lkZSBrZXkgZmlsZSBhbmQgcGFzc3dvcmQgb2YgdGhlIGtleWZpbGU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KK3NvYXBfc3NsX2luaXQoKTsgLyogaW5pdCBPcGVuU1NMIChqdXN0IG9uY2UpICovPGJyIC8+DQorPGI+aWY8L2I+Jm5ic3A7KHNvYXBfc3NsX2NsaWVudF9jb250ZXh0KCZhbXA7c29hcCwgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7U09BUF9TU0xfREVGQVVMVCwgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7ImNsaWVudC5wZW0iLAkvKiBrZXlmaWxlOiByZXF1aXJlZCBvbmx5IHdoZW4gY2xpZW50IG11c3QgYXV0aGVudGljYXRlIHRvIHNlcnZlciAoc2VlIFNTTCBkb2NzIG9uIGhvdyB0byBvYnRhaW4gdGhpcyBmaWxlKSAqLyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsicGFzc3dvcmQiLAkJLyogcGFzc3dvcmQgdG8gcmVhZCB0aGUga2V5IGZpbGUgKi8gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7ImNhY2VydC5wZW0iLCAJLyogb3B0aW9uYWwgY2FjZXJ0IGZpbGUgdG8gc3RvcmUgdHJ1c3RlZCBjZXJ0aWZpY2F0ZXMgKG5lZWRlZCB0byB2ZXJpZnkgc2VydmVyKSAqLw0KKyZuYnNwOyZuYnNwOyZuYnNwO05VTEwsCQkvKiBvcHRpb25hbCBjYXBhdGggdG8gZGlyZWNvdHkgd2l0aCB0cnVzdGVkIGNlcnRpZmljYXRlcyAqLyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtOVUxMCQkvKiBpZiByYW5kZmlsZSE9TlVMTDogdXNlIGEgZmlsZSB3aXRoIHJhbmRvbSBkYXRhIHRvIHNlZWQgcmFuZG9tbmVzcyAqLyAgPGJyIC8+DQorKSkgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX3ByaW50X2ZhdWx0KCZhbXA7c29hcCwgc3RkZXJyKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7ZXhpdCgxKTsgPGJyIC8+DQorfSA8YnIgLz4NCitzb2FwX2NhbGxfbnNfX215bWV0aG9kKCZhbXA7c29hcCwgImh0dHBzOi8vZG9tYWluL3BhdGgvc2VjdXJlLmNnaSIsICIiLCAuLi4pOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0J5IGRlZmF1bHQsIHNlcnZlciBhdXRoZW50aWNhdGlvbiBpcyBlbmFibGVkLiBUbyBkaXNhYmxlIHNlcnZlciBhdXRoZW50aWNhdGlvbiBmb3IgdGVzdGluZyBwdXJwb3NlcywgdXNlIHRoZSBmb2xsb3dpbmc6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPmlmPC9iPiZuYnNwOyhzb2FwX3NzbF9jbGllbnRfY29udGV4dCgmYW1wO3NvYXAsIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO1NPQVBfU1NMX05PX0FVVEhFTlRJQ0FUSU9OLCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtOVUxMLCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtOVUxMLCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtOVUxMLCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtOVUxMLCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtOVUxMCTxiciAvPg0KKykpIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9wcmludF9mYXVsdCgmYW1wO3NvYXAsIHN0ZGVycik7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO2V4aXQoMSk7IDxiciAvPg0KK30gPGJyIC8+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGlzIGFsc28gYXNzdW1lcyB0aGF0IHRoZSBzZXJ2ZXIgZG9lcyBub3QgcmVxdWlyZSBjbGllbnRzIHRvIGF1dGhlbnRpY2F0ZSAodGhlIGtleWZpbGUgaXMgYWJzZW50KS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIDxpPmNhY2VydDwvaT4gZmlsZSBhbmQgPGk+Y2FwYXRoPC9pPiBhcmUgb3B0aW9uYWwuIEVpdGhlciBvbmUgY2FuIGJlIHNwZWNpZmllZCB3aGVuIGNsaWVudHMgbXVzdCBydW4gb24gbm9uLXRydXN0ZWQgc3lzdGVtcy4gV2Ugd2FudCB0byBhdm9pZCBzdG9yaW5nIHRydXN0ZWQgY2VydGlmaWNhdGVzIGluIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9uIHRoZSBmaWxlIHN5c3RlbSB3aGVuIHRoYXQgaXMgbm90IHNlY3VyZS4gVGhlcmVmb3JlLCBhIGZsYXQgPGk+Y2FjZXJ0LnBlbTwvaT4gZmlsZSBvciBkaXJlY3RvcnkgY2FuIGJlIHNwZWNpZmllZCB0byBzdG9yZSB0cnVzdGVkIGNlcnRpZmljYXRlcy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorTWFrZSBzdXJlIHlvdSBoYXZlIHNpZ25hbCBoYW5kbGVycyBzZXQgaW4geW91ciBhcHBsaWNhdGlvbiB0byBjYXRjaCBicm9rZW4gY29ubmVjdGlvbnMgKDxpPlNJR1BJUEU8L2k+KToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorc2lnbmFsKFNJR1BJUEUsIHNpZ3BpcGVfaGFuZGxlKTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK3doZXJlLCBmb3IgZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+dm9pZDwvYj4mbmJzcDtzaWdwaXBlX2hhbmRsZSg8Yj5pbnQ8L2I+Jm5ic3A7eCkgeyB9DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCis8Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+Q2F1dGlvbjwvYj48L2ZvbnQ+OiBpdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGUgPGk+V0lUSF9PUEVOU1NMPC9pPiBtYWNybyBNVVNUIGJlIGNvbnNpc3RlbnRseSBkZWZpbmVkIHRvDQorY29tcGlsZSB0aGUgc291cmNlcywgc3VjaCBhcyA8aT5zdGRzb2FwMi5jcHA8L2k+LCA8aT5zb2FwQy5jcHA8L2k+LA0KKzxpPnNvYXBDbGllbnQuY3BwPC9pPiwgPGk+c29hcFNlcnZlci5jcHA8L2k+LCBhbmQgYWxsIGFwcGxpY2F0aW9uIHNvdXJjZXMgdGhhdA0KK2luY2x1ZGUgPGk+c3Rkc29hcDIuaDwvaT4gb3IgPGk+c29hcEguaDwvaT4uIElmIHRoZSBtYWNyb3MgYXJlIG5vdCBjb25zaXN0ZW50bHkNCit1c2VkLCB0aGUgYXBwbGljYXRpb24gd2lsbCBjcmFzaCBkdWUgdG8gYSBtaXNtYXRjaGVzIGluIHRoZSBkZWNsYXJhdGlvbiBhbmQNCithY2Nlc3Mgb2YgdGhlIGdTT0FQIGVudmlyb25tZW50Lg0KKzxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5DYXV0aW9uPC9iPjwvZm9udD46IGNvbmN1cnJlbnQgY2xpZW50IGNhbGxzIE1VU1QgYmUgbWFkZSB1c2luZyBzZXBhcmF0ZSBzb2FwIHN0cnVjdHMgY29waWVkIHdpdGggPGk+c29hcF9jb3B5PC9pPiBmcm9tIGFuIG9yaWdpbmF0aW5nIHN0cnVjdCBpbml0aWFsaXplZCB3aXRoIDxpPnNvYXBfc3NsX2NsaWVudF9jb250ZXh0PC9pPi4gSW4gYWRkaXRpb24sIHRoZSB0aHJlYWQgaW5pdGlhbGl6YXRpb24gY29kZSBkaXNjdXNzZWQgaW4gU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6c2VydmVyb3BlbnNzbCI+MTguMTk8L2E+IE1VU1QgYmUgdXNlZCB0byBwcm9wZXJseSBzZXR1cCBPcGVuU1NMIGluIGEgbXVsdGktdGhyZWFkZWQgY2xpZW50IGFwcGxpY2F0aW9uLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJICAgICA8aDM+PGEgbmFtZT0idHRoX3NFYzE4LjIxIj4NCisxOC4yMTwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+U1NMIEF1dGhlbnRpY2F0aW9uIENhbGxiYWNrPC9mb250PjwvaDM+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK2dTT0FQIHByb3ZpZGVzIGEgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGF1dGhlbnRpY2F0aW9uIGluaXRpYWxpemF0aW9uOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKw0KKzx0YWJsZT4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPjxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5DYWxsYmFjayAoZnVuY3Rpb24gcG9pbnRlcik8L2I+PC9mb250PiA8L3RkPjwvdHI+DQorPHRyPjx0ZCB3aWR0aD0iNjAyIj48aT48Yj5pbnQ8L2I+Jm5ic3A7KCpzb2FwLmZzc2xhdXRoKSg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCk8L2k+IDwvdGQ+PC90cj4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPkluaXRpYWxpemUgdGhlIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIGZvciBjbGllbnRzIGFuZCBzZXJ2aWNlcywgc3VjaCBhcyB0aGUNCitjZXJ0aWZpY2F0ZSBjaGFpbiwgcGFzc3dvcmQsIHJlYWQgdGhlIGtleSBhbmQvb3IgREggZmlsZSwgZ2VuZXJhdGUgYW4gUlNBIGtleSwNCithbmQgaW5pdGlhbGl6YXRpb24gb2YgdGhlIFJORy4gIFNob3VsZCByZXR1cm4gYSBnU09BUCBlcnJvciBjb2RlIG9yDQorPGk+U09BUF9PSzwvaT4uICBCdWlsdC1pbiBnU09BUCBmdW5jdGlvbjogPGk+c3NsX2F1dGhfaW5pdDwvaT4NCis8L3RkPjwvdHI+PC90YWJsZT4NCisNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9zcGFuPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJICAgICA8aDM+PGEgbmFtZT0idHRoX3NFYzE4LjIyIj4NCisxOC4yMjwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+U1NMIENlcnRpZmljYXRlczwvZm9udD48L2gzPjxhIG5hbWU9InNlYzpzc2wiPg0KKzwvYT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIGdTT0FQIGRpc3RyaWJ1dGlvbiBpbmNsdWRlcyBhIDxpPmNhY2VydHMucGVtPC9pPiBmaWxlIHdpdGggdGhlIGNlcnRpZmljYXRlcw0KK29mIGFsbCBjZXJ0aWZpY2F0ZSBhdXRob3JpdGllcyAoc3VjaCBhcyBWZXJpc2lnbikuIFlvdSBjYW4gdXNlIHRoaXMgZmlsZSB0bw0KK3ZlcmlmeSB0aGUgYXV0aGVudGljYXRpb24gb2Ygc2VydmVycyB0aGF0IHByb3ZpZGUgY2VydGlmaWNhdGVzIGlzc3VlZCBieSB0aGVzZQ0KK0NBcy4gSnVzdCBzZXQgdGhlIDxpPmNhZmlsZTwvaT4gcGFyYW1ldGVyIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGZpbGUgb24geW91ciBmaWxlIHN5c3RlbS4NCitUaGVyZWZvcmUsIHdoZW4geW91IG9idGFpbiBhIGNlcnRpZmljZSBzaWduZWQgYnkgYSB0cnVzdGVkIENBIHN1Y2ggYXMgVmVyaXNpZ24sIHlvdQ0KK2NhbiBzaW1wbHkgdXNlIHRoZSA8aT5jYWNlcnRzLnBlbTwvaT4gZmlsZSB0byBkZXZlbG9wIGNsaWVudCBhcHBsaWNhdGlvbnMNCit0aGF0IGNhbiB2ZXJpZnkgdGhlIGF1dGhlbnRpY2l0eSBvZiB5b3VyIHNlcnZlci4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIG90aGVyIDxpPi5wZW08L2k+IGZpbGVzIGluIHRoZSBnU09BUCBkaXN0cmlidXRpb24gYXJlIGV4YW1wbGVzDQorb2Ygc2VsZi1zaWduZWQgY2VydGlmaWNhdGVzIGZvciB0ZXN0aW5nIHB1cnBvc2VzICg8aT5jYWNlcnQucGVtPC9pPiwgPGk+Y2xpZW50LnBlbTwvaT4sIDxpPnNlcnZlci5wZW08L2k+KS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorWW91IGNhbiBhbHNvIGNyZWF0ZSB5b3VyIG93biBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZXMuDQorVGhlcmUgaXMgbW9yZSB0aGFuIG9uZSB3YXkgdG8gZ2VuZXJhdGUgdGhlIG5lY2Vzc2FyeSBmaWxlcyBmb3IgY2xpZW50cyBhbmQgc2VydmVycy4NCitTZWUgPGk+aHR0cDovL3d3dy5vcGVuc3NsLm9yZzwvaT4gZm9yIGluZm9ybWF0aW9uIG9uIE9wZW5TU0wgYW5kDQorPGk+aHR0cDovL3NpYWwub3JnL2hvd3RvL29wZW5zc2wvY2EvPC9pPiBvbiBob3cgdG8gc2V0dXAgYW5kIG1hbmFnZSBhIGxvY2FsIENBDQorYW5kIDxpPmh0dHA6Ly9zaWFsLm9yZy9ob3d0by9vcGVuc3NsL3NlbGYtc2lnbmVkLzwvaT4gb24gaG93IHRvIHNldHVwIHNlbGYtc2lnbmVkDQordGVzdCBjZXJ0aWZpY2F0ZXMuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0l0IGlzIGFsc28gcG9zc2libGUgdG8gY29udmVydCBJSVMtZ2VuZXJhdGVkIGNlcnRpZmljYXRlcyB0byBQRU0gZm9ybWF0LCBzZWUgPGk+aHR0cDovL3d3dy5pY2V3YXJwLmNvbS9Lbm93bGVkZ2ViYXNlLzYxNy5odG08L2k+IGZvciBhIGRpc2N1c3Npb24gYW5kIGV4YW1wbGVzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitIZXJlIGlzIHRoZSBzaW1wbGVzdCB3YXkgdG8gc2V0dXAgc2VsZi1zaWduZWQgY2VydGlmaWNhdGVzLiBGaXJzdCB5b3UgbmVlZCB0byBjcmVhdGUgYSBwcml2YXRlIENlcnRpZmljYXRlIEF1dGhvcml0eSAoQ0EpLiAgVGhlIENBIGlzIHVzZWQgaW4gU1NMIHRvIHZlcmlmeSB0aGUgYXV0aGVudGljaXR5IG9mIGEgZ2l2ZW4NCitjZXJ0aWZpY2F0ZS4gVGhlIENBIGFjdHMgYXMgYSB0cnVzdGVkIHRoaXJkIHBhcnR5IHdobyBoYXMgYXV0aGVudGljYXRlZCB0aGUNCit1c2VyIG9mIHRoZSBzaWduZWQgY2VydGlmaWNhdGUgYXMgYmVpbmcgd2hvIHRoZXkgc2F5LiBUaGUgY2VydGlmaWNhdGUgaXMNCitzaWduZWQgYnkgdGhlIENBLCBhbmQgaWYgdGhlIGNsaWVudCB0cnVzdHMgdGhlIENBLCBpdCB3aWxsIHRydXN0IHlvdXINCitjZXJ0aWZpY2F0ZS4gRm9yIHVzZSB3aXRoaW4geW91ciBvcmdhbml6YXRpb24sIGEgcHJpdmF0ZSBDQSB3aWxsIHByb2JhYmx5DQorc2VydmUgeW91ciBuZWVkcy4gSG93ZXZlciwgaWYgeW91IGludGVuZCB1c2UgeW91ciBjZXJ0aWZpY2F0ZXMgZm9yIGEgcHVibGljDQorc2VydmljZSwgeW91IHNob3VsZCBwcm9iYWJseSBvYnRhaW4gYSBjZXJ0aWZpY2F0ZSBmcm9tIGEga25vd24gQ0EgKGUuZy4mbmJzcDtWZXJpU2lnbikuDQorSW4gYWRkaXRpb24gdG8gaWRlbnRpZmljYXRpb24sIHlvdXIgY2VydGlmaWNhdGUgaXMgYWxzbyB1c2VkIGZvciBlbmNyeXB0aW9uLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitDcmVhdGluZyBjZXJ0aWZpY2F0ZXMgc2hvdWxkIGJlIGRvbmUgdGhyb3VnaCBhIENBIHRvIG9idGFpbiBzaWduZWQgY2VydGlmaWNhdGVzLiBCdXQgeW91IGNhbiBjcmVhdGUgeW91ciBvd24gY2VydGlmaWNhdGVzIGZvciB0ZXN0aW5nIHB1cnBvc2VzIGFzIGZvbGxvd3MuDQorDQorPHVsPg0KKzxsaT4gR28gdG8gdGhlIE9wZW5TU0wgYmluIGRpcmVjdG9yeSAoPGk+L3Vzci9sb2NhbC9zc2w8L2k+IGJ5IGRlZmF1bHQgYW5kDQorPGk+L1N5c3RlbS9MaWJyYXJ5L09wZW5TU0w8L2k+IG9uIE1hYyBPUyBYKQ0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8L2xpPg0KKw0KKzxsaT4gVGhlcmUgc2hvdWxkIGJlIGEgZmlsZSBjYWxsZWQgb3BlbnNzbC5jbmYNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorPC9saT4NCisNCis8bGk+IENyZWF0ZSBhIG5ldyBkaXJlY3RvcnkgaW4geW91ciBob21lIGFjY291bnQsIGUuZy4gJEhPTUUvQ0EsIGFuZCBjb3B5IHRoZSBvcGVuc3NsLmNuZiBmaWxlIHRvIHRoaXMgZGlyZWN0b3J5DQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorDQorPGxpPiBNb2RpZnkgb3BlbnNzbC5jbmYgYnkgY2hhbmdpbmcgdGhlICdkaXInIHZhbHVlIHRvIEhPTUUvQ0ENCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorPC9saT4NCisNCis8bGk+IENvcHkgdGhlIFJFQURNRS50eHQsIHJvb3Quc2gsIGFuZCBjZXJ0LnNoIHNjcmlwdHMgZnJvbSB0aGUgZ1NPQVAgZGlzdHJpYnV0aW9uIHBhY2thZ2UgbG9jYXRlZCBpbiB0aGUgc2FtcGxlcy9zc2wgZGlyZWN0b3J5IHRvIEhPTUUvQ0ENCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorPC9saT4NCisNCis8bGk+IEZvbGxvdyB0aGUgUkVBRE1FLnR4dCBpbnN0cnVjdGlvbnMNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorPC9saT4NCis8L3VsPg0KK1lvdSBub3cgaGF2ZSBhIHNlbGYtc2lnbmVkIENBIHJvb3QgY2VydGlmaWNhdGUgY2FjZXJ0LnBlbSBhbmQgYSBzZXJ2ZXIucGVtIChvciBjbGllbnQucGVtKSBjZXJ0aWZpY2F0ZSBpbiBQRU0gZm9ybWF0Lg0KK1RoZSBjYWNlcnQucGVtIGNlcnRpZmljYXRlIGlzIHVzZWQgaW4gdGhlIDxpPmNhZmlsZTwvaT4gcGFyYW1ldGVyIG9mIHRoZSA8aT5zb2FwX3NzbF9jbGllbnRfY29udGV4dDwvaT4gKG9yIDxpPnNvYXBfc3NsX3NlcnZlcl9jb250ZXh0PC9pPikgYXQgdGhlIGNsaWVudCAob3Igc2VydmVyKSBzaWRlIHRvIHZlcmlmeSB0aGUgYXV0aGVudGljaXR5IG9mIHRoZSBwZWVyLiBZb3UgY2FuIGFsc28gcHJvdmlkZSBhIGNhcGF0aCBwYXJhbWV0ZXIgdG8gdGhlc2UgdHJ1c3RlZCBjZXJ0aWZpY2F0ZXMuIFRoZSBzZXJ2ZXIucGVtIChvciBjbGllbnQucGVtKSBtdXN0IGJlIHByb3ZpZGVkIHdpdGggdGhlIDxpPnNvYXBfc3NsX3NlcnZlcl9jb250ZXh0PC9pPiBhdCB0aGUgc2VydmVyIHNpZGUgKG9yIDxpPnNvYXBfc3NsX2NsaWVudF9jb250ZXh0PC9pPiBhdCB0aGUgY2xpZW50IHNpZGUpIHRvZ2V0aGVyIHdpdGggdGhlIHBhc3N3b3JkIHlvdSBlbnRlcmVkIHdoZW4gZ2VuZXJhdGluZyB0aGUgY2VydGlmaWNhdGUgdXNpbmcgY2VydC5zaCB0byBhY2Nlc3MgdGhlIGZpbGUuIFRoZXNlIGNlcnRpZmljYXRlcyBtdXN0IGJlIHByZXNlbnQgdG8gZ3JhbnQgYXV0aGVudGljYXRpb24gcmVxdWVzdHMgYnkgcGVlcnMuIEluIGFkZGl0aW9uLCB0aGUgc2VydmVyLnBlbSAoYW5kIGNsaWVudC5wZW0pIGluY2x1ZGUgdGhlIGhvc3QgbmFtZSBvZiB0aGUgbWFjaGluZSBvbiB3aGljaCB0aGUgYXBwbGljYXRpb24gcnVucyAoZS5nLiBsb2NhbGhvc3QpLCBzbyB5b3UgbmVlZCB0byBnZW5lcmF0ZSBuZXcgY2VydGlmaWNhdGVzIHdoZW4gbWlncmF0aW5nIGEgc2VydmVyIChvciBjbGllbnQpLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitGaW5hbGx5IHlvdSBuZWVkIHRvIGdlbmVyYXRlIERpZmZpZS1IZWxtYW5uIHBhcmFtZXRlcnMgZm9yIHRoZSBzZXJ2ZXIgaWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIFJTQS4NCitEbyB0aGUgZm9sbG93aW5nIGF0IHRoZSBwcm9tcHQ6DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzxpPm9wZW5zc2wgZGhwYXJhbSAtb3V0Zm9ybSBQRU0gLW91dCBkaC5wZW0gNTEyPC9pPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitGaWxlIDxpPmRoNTEyLnBlbTwvaT4gaXMgdGhlIG91dHB1dCBmaWxlIGFuZCA1MTIgaXMgdGhlIG51bWJlciBvZiBiaXRzIHVzZWQuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkgICAgIDxoMz48YSBuYW1lPSJ0dGhfc0VjMTguMjMiPg0KKzE4LjIzPC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5TU0wgSGFyZHdhcmUgQWNjZWxlcmF0aW9uPC9mb250PjwvaDM+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1lvdSBjYW4gc3BlY2lmeSBhIGhhcmR3YXJlIGVuZ2luZSB0byBlbmFibGUgaGFyZHdhcmUgc3VwcG9ydCBmb3IgY3J5cHRvZ3JhcGhpYyBhY2NlbGVyYXRpb24uIFRoaXMgY2FuIGJlIGRvbmUgb25jZSBpbiBhIHNlcnZlciBvciBjbGllbnQgd2l0aCB0aGUgZm9sbG93aW5nIHN0YXRlbWVudHM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0YXRpYzwvYj4mbmJzcDs8Yj5jb25zdDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyplbmdpbmUgPSAiY3N3aWZ0IjsgLyogZW5naW5lIG5hbWUgKi8gPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO21haW4oKSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOy4uLiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtFTkdJTkUgKmU7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyghKGUgPSBFTkdJTkVfYnlfaWQoZW5naW5lKSkpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2ZwcmludGYoc3RkZXJyLCAiRXJyb3IgZmluZGluZyBlbmdpbmUgJXNcbiIsIGVuZ2luZSk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmVsc2U8L2I+Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KCFFTkdJTkVfc2V0X2RlZmF1bHQoZSwgRU5HSU5FX01FVEhPRF9BTEwpKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHVzaW5nIGVuZ2luZSAlc1xuIiwgZW5naW5lKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Li4uDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgZm9sbG93aW5nIHRhYmxlIGxpc3RzIHRoZSBuYW1lcyBvZiB0aGUgaGFyZHdhcmUgYW5kIHNvZnR3YXJlIGVuZ2luZXM6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjRDBEMEQwIj48dHI+PHRkPjxzcGFuIGNsYXNzPSJyb21hbiI+DQorDQorPHRhYmxlPg0KKzx0cj48dGQ+PGZvbnQgY29sb3I9IiNGRjAwMDAiPjxiPk5hbWU8L2I+PC9mb250PiA8L3RkPjx0ZCB3aWR0aD0iNTAxIj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+PGI+RGVzY3JpcHRpb248L2I+PC9mb250PiA8L3RkPjwvdHI+DQorPHRyPjx0ZD5vcGVuc3NsCTwvdGQ+PHRkIHdpZHRoPSI1MDEiPlRoZSBkZWZhdWx0IHNvZnR3YXJlIGVuZ2luZSBmb3IgY3J5cHRvZ3JhcGhpYyBvcGVyYXRpb25zIDwvdGQ+PC90cj4NCis8dHI+PHRkPm9wZW5ic2RfZGV2X2NyeXB0bwk8L3RkPjx0ZCB3aWR0aD0iNTAxIj5PcGVuQlNEIHN1cHBvcnRzIGtlcm5lbCBsZXZlbCBjcnlwdG9ncmFwaHkgPC90ZD48L3RyPg0KKzx0cj48dGQ+Y3N3aWZ0CQk8L3RkPjx0ZCB3aWR0aD0iNTAxIj5DcnlwdG9Td2lmdCBhY2NlbGVyYXRpb24gaGFyZHdhcmUgPC90ZD48L3RyPg0KKzx0cj48dGQ+Y2hpbAkJPC90ZD48dGQgd2lkdGg9IjUwMSI+bkNpcGhlciBDSElMIGFjY2VsZXJhdGlvbiBoYXJkd2FyZSA8L3RkPjwvdHI+DQorPHRyPjx0ZD5hdGFsbGEJCTwvdGQ+PHRkIHdpZHRoPSI1MDEiPkNvbXBhcSBBdGFsbGEgYWNjZWxlcmF0aW9uIGhhcmR3YXJlIDwvdGQ+PC90cj4NCis8dHI+PHRkPm51cm9uCQk8L3RkPjx0ZCB3aWR0aD0iNTAxIj5OdXJvbiBhY2NlbGVyYXRpb24gaGFyZHdhcmUgPC90ZD48L3RyPg0KKzx0cj48dGQ+dWJzZWMJCTwvdGQ+PHRkIHdpZHRoPSI1MDEiPkJyb2FkY29tIHVCU2VjIGFjY2VsZXJhdGlvbiBoYXJkd2FyZSA8L3RkPjwvdHI+DQorPHRyPjx0ZD5hZXAJCTwvdGQ+PHRkIHdpZHRoPSI1MDEiPkFlcCBhY2NlbGVyYXRpb24gaGFyZHdhcmUgPC90ZD48L3RyPg0KKzx0cj48dGQ+c3VyZXdhcmUJPC90ZD48dGQgd2lkdGg9IjUwMSI+U3VyZVdhcmUgYWNjZWxlcmF0aW9uIGhhcmR3YXJlIDwvdGQ+PC90cj48L3RhYmxlPg0KKw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkgICAgIDxoMz48YSBuYW1lPSJ0dGhfc0VjMTguMjQiPg0KKzE4LjI0PC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5TU0wgb24gV2luZG93czwvZm9udD48L2gzPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitTZXQgdGhlIGZ1bGwgcGF0aCB0byBsaWJzc2wubGliIGFuZCBsaWJjcnlwdG8ubGliIA0KK3VuZGVyIHRoZSBNU1ZDKysgIlByb2plY3RzIiBtZW51LCB0aGVuIGNob29zZSAiTGluayI6ICYjMjE0O2JqZWN0L01vZHVsZXMiLiBUaGUgcGF0aCANCit0byBsaWJzc2wzMi5kbGwgYW5kIGxpYmVheTMyLmRsbCBuZWVkIHRvIGJlIHNwZWNpZmllZCBpbiB0aGUgUEFUSCANCitlbnZpcm9ubWVudCB2YXJpYWJsZSB3aGVuIHJ1bm5pbmcgZ1NPQVAgYXBwbGljYXRpb25zLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHVzZSB0aGUgV2luSW5ldCBpbnRlcmZhY2UgYXZhaWxhYmxlIGluIHRoZSA8aT5tb2RfZ3NvYXA8L2k+IGRpcmVjdG9yeSBvZiB0aGUgZ1NPQVAgcGFja2FnZS4gQVBJIGluc3RydWN0aW9ucyBhcmUgaW5jbHVkZWQgaW4gdGhlIHNvdXJjZS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCSAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWMxOC4yNSI+DQorMTguMjU8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPlpsaWIgQ29tcHJlc3Npb248L2ZvbnQ+PC9oMz48YSBuYW1lPSJzZWM6Y29tcHJlc3Npb24iPg0KKzwvYT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVG8gZW5hYmxlIGRlZmxhdGUgYW5kIGd6aXAgY29tcHJlc3Npb24gd2l0aCBabGliLCBpbnN0YWxsIFpsaWIgZnJvbQ0KKzx0dD5odHRwOi8vd3d3LnpsaWIub3JnPC90dD4gaWYgbm90IGFscmVhZHkgaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtLiAgQ29tcGlsZQ0KKzxpPnN0ZHNvYXAyLmNwcDwvaT4gKG9yIDxpPnN0ZHNvYXAyLmM8L2k+KSBhbmQgPGI+YWxsPC9iPiB5b3VyIHNvdXJjZXMgdGhhdCBpbmNsdWRlDQorPGk+c3Rkc29hcDIuaDwvaT4gb3IgPGk+c29hcEguaDwvaT4gd2l0aCBjb21waWxlciBvcHRpb24gPGk+LURXSVRIX0daSVA8L2k+IGFuZA0KK2xpbmsgeW91ciBjb2RlIHdpdGggdGhlIFpsaWIgbGlicmFyeSwgZS5nLiA8aT4tbHo8L2k+IG9uIFVuaXgvTGludXggcGxhdGZvcm1zLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgZ3ppcCBjb21wcmVzc2lvbiBpcyBvcnRob2dvbmFsIHRvIGFsbCB0cmFuc3BvcnQgZW5jb2RpbmdzIHN1Y2ggYXMgSFRUUCwNCitTU0wsIERJTUUsIGFuZCBjYW4gYmUgdXNlZCB3aXRoIG90aGVyIHRyYW5zcG9ydCBsYXllcnMuICBZb3UgY2FuIGV2ZW4gc2F2ZSBhbmQNCitsb2FkIGNvbXByZXNzZWQgWE1MIGRhdGEgdG8vZnJvbSBmaWxlcy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorZ1NPQVAgc3VwcG9ydHMgdHdvIGNvbXByZXNzaW9uIGZvcm1hdHM6IGRlZmxhdGUgYW5kIGd6aXAuIFRoZSBnemlwIGZvcm1hdCBpcw0KK3VzZWQgYnkgZGVmYXVsdC4gVGhlIGd6aXAgZm9ybWF0IGhhcyBzZXZlcmFsIGJlbmVmaXRzIG92ZXIgZGVmbGF0ZS4gRmlyc3RseSwNCitnU09BUCBjYW4gYXV0b21hdGljYWxseSBkZXRlY3QgZ3ppcCBjb21wcmVzc2VkIGluYm91bmQgbWVzc2FnZXMsIGV2ZW4gd2l0aG91dA0KK0hUVFAgaGVhZGVycywgYnkgY2hlY2tpbmcgZm9yIHRoZSBwcmVzZW5jZSBvZiBhIGd6aXAgaGVhZGVyIGluIHRoZSBtZXNzYWdlDQorY29udGVudC4gU2Vjb25kbHksIGd6aXAgaW5jbHVkZXMgYSBDUkMzMiBjaGVja3N1bSB0byBlbnN1cmUgbWVzc2FnZXMgaGF2ZSBiZWVuDQorY29ycmVjdGx5IHJlY2VpdmVkLiBUaGlyZGx5LCBnemlwIGNvbXByZXNzZWQgY29udGVudCBjYW4gYmUgZGVjb21wcmVzc2VkIHdpdGgNCitvdGhlciBjb21wcmVzc2lvbiBzb2Z0d2FyZSwgc28geW91IGNhbiBkZWNvbXByZXNzIFhNTCBkYXRhIHNhdmVkIGJ5IGdTT0FQIGluDQorZ3ppcCBmb3JtYXQuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0d6aXAgY29tcHJlc3Npb24gaXMgZW5hYmxlZCBieSBjb21waWxpbmcgdGhlIHNvdXJjZXMgd2l0aCA8aT4tRFdJVEhfR1pJUDwvaT4uDQorVG8gdHJhbnNtaXQgZ3ppcCBjb21wcmVzc2VkIFNPQVAvWE1MIGRhdGEsIHNldCB0aGUgb3V0cHV0IG1vZGUgZmxhZ3MgdG8NCis8aT5TT0FQX0VOQ19aTElCPC9pPi4gRm9yIGV4YW1wbGU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KK3NvYXBfaW5pdCgmYW1wO3NvYXApOyA8YnIgLz4NCisuLi4gPGJyIC8+DQorc29hcF9zZXRfb21vZGUoJmFtcDtzb2FwLCBTT0FQX0VOQ19aTElCKTsgLy8gZW5hYmxlIFpsaWIncyBnemlwIDxiciAvPg0KKzxiPmlmPC9iPiZuYnNwOyhzb2FwX2NhbGxfbnNfX215TWV0aG9kKCZhbXA7c29hcCwgLi4uKSkgPGJyIC8+DQorLi4uIDxiciAvPg0KK3NvYXBfY2xyX29tb2RlKCZhbXA7c29hcCwgU09BUF9FTkNfWkxJQik7IC8vIGRpc2FibGUgWmxpYidzIGd6aXAgPGJyIC8+DQorLi4uDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGlzIHdpbGwgc2VuZCBhIGNvbXByZXNzZWQgU09BUC9YTUwgcmVxdWVzdCB0byBhIHNlcnZpY2UsIHByb3ZpZGVkIHRoYXQgWmxpYiBpcw0KK2luc3RhbGxlZCBhbmQgbGlua2VkIHdpdGggdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgPGk+LURXSVRIX0daSVA8L2k+IG9wdGlvbiB3YXMgdXNlZCB0byBjb21waWxlIHRoZSBzb3VyY2VzLg0KK1JlY2VpdmluZyBjb21wcmVzc2VkIFNPQVAvWE1MIG92ZXIgSFRUUCBlaXRoZXIgaW4gZ3ppcCBvciBkZWZsYXRlIGZvcm1hdHMgaXMgYXV0b21hdGljLiBUaGUgPGk+U09BUF9FTkNfWkxJQjwvaT4gZmxhZyBkb2VzIG5vdCBoYXZlDQordG8gYmUgc2V0IGF0IHRoZSBzZXJ2ZXIgc2lkZSB0byBhY2NlcHQgY29tcHJlc3NlZCBtZXNzYWdlcy4gUmVhZGluZyBhbmQgcmVjZWl2aW5nIGd6aXAgY29tcHJlc3NlZCBTT0FQL1hNTCB3aXRob3V0IEhUVFAgaGVhZGVycyAoZS5nLiB3aXRoIG90aGVyIHRyYW5zcG9ydCBwcm90b2NvbHMpIGlzIGFsc28gYXV0b21hdGljLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUbyBjb250cm9sIHRoZSBsZXZlbCBvZiBjb21wcmVzc2lvbiBmb3Igb3V0Ym91bmQgbWVzc2FnZXMsIHlvdSBjYW4gc2V0IHRoZSA8aT5zb2FwLnpfbGV2ZWw8L2k+IHRvIGEgdmFsdWUgYmV0d2VlbiAxIGFuZCA5LCB3aGVyZSAxIGlzIHRoZSBiZXN0IHNwZWVkIGFuZCA5IGlzIHRoZSBiZXN0IGNvbXByZXNzaW9uIChkZWZhdWx0IGlzIDYpLiAgRm9yIGV4YW1wbGUNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorc29hcF9pbml0KCZhbXA7c29hcCk7IDxiciAvPg0KKy4uLiA8YnIgLz4NCitzb2FwX3NldF9vbW9kZSgmYW1wO3NvYXAsIFNPQVBfRU5DX1pMSUIpOyA8YnIgLz4NCitzb2FwLnpfbGV2ZWwgPSA5OyAvLyBiZXN0IGNvbXByZXNzaW9uIDxiciAvPg0KKy4uLg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVG8gdmVyaWZ5IGFuZCBtb25pdG9yIGNvbXByZXNzaW9uIHJhdGVzLCB5b3UgY2FuIHVzZSB0aGUgdmFsdWVzIDxpPnNvYXAuel9yYXRpb19pbjwvaT4gYW5kIDxpPnNvYXAuel9yYXRpb19vdXQ8L2k+LiBUaGVzZSB0d28gZmxvYXQgdmFsdWVzIGxpZSBiZXR3ZWVuIDAuMCBhbmQgMS4wIGFuZCBleHByZXNzIHRoZSByYXRpbyBvZiB0aGUgY29tcHJlc3NlZCBtZXNzYWdlIGxlbmd0aCBvdmVyIHVuY29tcHJlc3NlZCBtZXNzYWdlIGxlbmd0aC4NCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorc29hcF9jYWxsX25zX19teU1ldGhvZCgmYW1wO3NvYXAsIC4uLik7IDxiciAvPg0KKy4uLiA8YnIgLz4NCitwcmludGYoIkNvbXByZXNzaW9uIHJhdGlvOiAlZiUlIChpbikgJWYlJSAob3V0KVxuIiwgMTAwKnNvYXAuel9yYXRpb19vdXQsIDEwMCpzb2FwLnpfcmF0aW9faW4pOyA8YnIgLz4NCisuLi4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK05vdGU6IGxvd2VyIHJhdGlvcyBtZWFuIGhpZ2hlciBjb21wcmVzc2lvbiByYXRlcy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorQ29tcHJlc3NlZCB0cmFuc2ZlcnMgcmVxdWlyZSBidWZmZXJpbmcgdGhlIGVudGlyZSBvdXRwdXQgbWVzc2FnZSB0byBkZXRlcm1pbmUgSFRUUCBtZXNzYWdlIGxlbmd0aC4NCitUaGlzIG1lYW5zIHRoYXQgdGhlIDxpPlNPQVBfSU9fU1RPUkU8L2k+IGZsYWcgaXMNCithdXRvbWF0aWNhbGx5IHNldCB3aGVuIHRoZSA8aT5TT0FQX0VOQ19aTElCPC9pPiBmbGFnIGlzIHNldCB0byBzZW5kIGNvbXByZXNzZWQgbWVzc2FnZXMuIFRoZSB1c2Ugb2YgSFRUUCBjaHVua2luZw0KK3NpZ25pZmljYW50bHkgcmVkdWNlcyBtZW1vcnkgdXNhZ2UgYW5kIG1heSBzcGVlZCB1cCB0aGUgdHJhbnNtaXNzaW9uIG9mIGNvbXByZXNzZWQgU09BUC9YTUwgbWVzc2FnZXMuDQorVGhpcyBpcyBhY2NvbXBsaXNoZWQgYnkgc2V0dGluZyB0aGUgPGk+U09BUF9JT19DSFVOSzwvaT4gZmxhZyB3aXRoDQorPGk+U09BUF9FTkNfWkxJQjwvaT4gZm9yIHRoZSBvdXRwdXQgbW9kZS4NCitIb3dldmVyLCBzb21lIFdlYiBzZXJ2ZXJzIGRvIG5vdCBhY2NlcHQgSFRUUCBjaHVua2VkIHJlcXVlc3QgbWVzc2FnZXMgKGV2ZW4gd2hlbiB0aGV5IHJldHVybiBIVFRQIGNodW5rZWQgbWVzc2FnZXMhKS4gU3RhbmQtYWxvbmUgZ1NPQVAgc2VydmljZXMgYWx3YXlzIGFjY2VwdCBjaHVua2VkIHJlcXVlc3QgbWVzc2FnZXMuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RvIHJlc3RyaWN0IHRoZSBjb21wcmVzc2lvbiB0byB0aGUgZGVmbGF0ZSBmb3JtYXQgb25seSwgY29tcGlsZSB0aGUgc291cmNlcyB3aXRoIDxpPi1EV0lUSF9aTElCPC9pPi4gVGhpcyBsaW1pdHMgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24gdG8gdGhlIGRlZmxhdGUgZm9ybWF0LiBPbmx5IHBsYWluIGFuZCBkZWZsYXRlZCBtZXNzYWdlcyBjYW4gYmUgZXhjaGFuZ2VkLCBnemlwIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCB0aGlzIG9wdGlvbi4NCitSZWNlaXZpbmcgZ3ppcCBjb21wcmVzc2VkIGNvbnRlbnQgaXMgYXV0b21hdGljLCBldmVuIGluIHRoZSBhYnNlbmNlIG9mIEhUVFAgaGVhZGVycy4NCitSZWNlaXZpbmcgZGVmbGF0ZSBjb21wcmVzc2VkIGNvbnRlbnQgaXMgbm90IGF1dG9tYXRpYyBpbiB0aGUgYWJzZW5jZSBvZiBIVFRQIGhlYWRlcnMgYW5kIHJlcXVpcmVzIHRoZSBmbGFnDQorPGk+U09BUF9FTkNfWkxJQjwvaT4gdG8gYmUgc2V0IGZvciB0aGUgaW5wdXQgbW9kZSB0byBkZWNvbXByZXNzIGRlZmxhdGVkIGRhdGEuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5DYXV0aW9uPC9iPjwvZm9udD46IGl0IGlzIGltcG9ydGFudCB0aGF0IHRoZSA8aT5XSVRIX0daSVA8L2k+IGFuZCA8aT5XSVRIX1pMSUI8L2k+IG1hY3JvcyBNVVNUIGJlIGNvbnNpc3RlbnRseSBkZWZpbmVkIHRvDQorY29tcGlsZSB0aGUgc291cmNlcywgc3VjaCBhcyA8aT5zdGRzb2FwMi5jcHA8L2k+LCA8aT5zb2FwQy5jcHA8L2k+LA0KKzxpPnNvYXBDbGllbnQuY3BwPC9pPiwgPGk+c29hcFNlcnZlci5jcHA8L2k+LCBhbmQgYWxsIGFwcGxpY2F0aW9uIHNvdXJjZXMgdGhhdA0KK2luY2x1ZGUgPGk+c3Rkc29hcDIuaDwvaT4gb3IgPGk+c29hcEguaDwvaT4uIElmIHRoZSBtYWNyb3MgYXJlIG5vdCBjb25zaXN0ZW50bHkNCit1c2VkLCB0aGUgYXBwbGljYXRpb24gd2lsbCBjcmFzaCBkdWUgdG8gYSBtaXNtYXRjaGVzIGluIHRoZSBkZWNsYXJhdGlvbiBhbmQNCithY2Nlc3Mgb2YgdGhlIGdTT0FQIGVudmlyb25tZW50Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJICAgICA8aDM+PGEgbmFtZT0idHRoX3NFYzE4LjI2Ij4NCisxOC4yNjwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+Q2xpZW50LVNpZGUgQ29va2llIFN1cHBvcnQ8L2ZvbnQ+PC9oMz48YSBuYW1lPSJzZWM6Y2xpZW50Y29va2llIj4NCis8L2E+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0NsaWVudC1zaWRlIGNvb2tpZSBzdXBwb3J0IGlzIG9wdGlvbmFsLiBUbyBlbmFibGUgY29va2llIHN1cHBvcnQsIGNvbXBpbGUgYWxsIHNvdXJjZXMgd2l0aCBvcHRpb24gPGk+LURXSVRIX0NPT0tJRVM8L2k+LCBmb3IgZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNEMEQwRDAiPjx0cj48dGQ+PHNwYW4gY2xhc3M9InJvbWFuIj4NCis8aT5nKysgLURXSVRIX0NPT0tJRVMgLW8gbXljbGllbnQgc3Rkc29hcDIuY3BwIHNvYXBDLmNwcCBzb2FwQ2xpZW50LmNwcDwvaT4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9zcGFuPg0KK29yIGFkZCB0aGUgZm9sbG93aW5nIGxpbmUgdG8gPGk+c3Rkc29hcC5oPC9pPjoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorI2RlZmluZSBXSVRIX0NPT0tJRVMNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK0NsaWVudC1zaWRlIGNvb2tpZSBzdXBwb3J0IGlzIGZ1bGx5IGF1dG9tYXRpYy4gU28ganVzdCAocmUpY29tcGlsZSA8aT5zdGRzb2FwMi5jcHA8L2k+IHdpdGggPGk+LURXSVRIX0NPT0tJRVM8L2k+IHRvIGVuYWJsZQ0KK2Nvb2tpZS1iYXNlZCBzZXNzaW9uIGNvbnRyb2wgaW4geW91ciBjbGllbnQuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0EgZGF0YWJhc2Ugb2YgY29va2llcyBpcyBrZXB0IGFuZCByZXR1cm5lZCB0byB0aGUgYXBwcm9wcmlhdGUgc2VydmVycy4NCitDb29raWVzIGFyZSBub3QgYXV0b21hdGljYWxseSBzYXZlZCB0byBhIGZpbGUgYnkgYSBjbGllbnQuIEFuIGV4YW1wbGUgY29va2llDQorZmlsZSBtYW5hZ2VyIGlzIGluY2x1ZGVkIGFzIGFuIGV4dHJhcyBpbiB0aGUgZGlzdHJpYnV0aW9uLiBZb3Ugc2hvdWxkDQorZXhwbGljaXRseSByZW1vdmUgYWxsIGNvb2tpZXMgYmVmb3JlIHRlcm1pbmF0aW5nIGEgZ1NPQVAgZW52aXJvbm1lbnQgYnkNCitjYWxsaW5nIDxpPnNvYXBfZnJlZV9jb29raWVzKHNvYXApPC9pPiBvciBieSBjYWxsaW5nIDxpPnNvYXBfZG9uZShzb2FwKTwvaT4uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RvIGF2b2lkICJjb29raWUgc3Rvcm1zIiBjYXVzZWQgYnkgbWFsaWNpb3VzIHNlcnZlcnMgdGhhdCByZXR1cm4gYW4gDQordW5yZWFzb25hYmxlIGFtb3VudCBvZiBjb29raWVzLCBnU09BUCBjbGllbnRzL3NlcnZlcnMgYXJlIHJlc3RyaWN0ZWQgdG8NCithIGRhdGFiYXNlIHNpemUgdGhhdCB0aGUgdXNlciBjYW4gbGltaXQgKDMyIGNvb2tpZXMgYnkgZGVmYXVsdCksIGZvciBleGFtcGxlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCBzb2FwOyA8YnIgLz4NCitzb2FwX2luaXQoJmFtcDtzb2FwKTsgPGJyIC8+DQorc29hcC5jb29raWVfbWF4ID0gMTA7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGUgY29va2llIGRhdGFiYXNlIGlzIGEgbGlua2VkIGxpc3QgcG9pbnRlZCB0byBieSA8aT5zb2FwLmNvb2tpZXM8L2k+IHdoZXJlIGVhY2ggbm9kZSBpcyBkZWNsYXJlZCBhczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+c3RydWN0PC9iPiZuYnNwO3NvYXBfY29va2llIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqbmFtZTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqdmFsdWU7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KmRvbWFpbjsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqcGF0aDsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+bG9uZzwvYj4mbmJzcDtleHBpcmU7IC8qIGNsaWVudC1zaWRlOiBsb2NhbCB0aW1lIHRvIGV4cGlyZTsgc2VydmVyLXNpZGU6IHNlY29uZHMgdG8gZXhwaXJlICovIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnVuc2lnbmVkPC9iPiZuYnNwOzxiPmludDwvYj4mbmJzcDt2ZXJzaW9uOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5zaG9ydDwvYj4mbmJzcDtzZWN1cmU7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnNob3J0PC9iPiZuYnNwO3Nlc3Npb247IC8qIHNlcnZlci1zaWRlICovIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnNob3J0PC9iPiZuYnNwO2VudjsgLyogc2VydmVyLXNpZGU6IDEgPSBnb3QgY29va2llIGZyb20gY2xpZW50ICovIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnNob3J0PC9iPiZuYnNwO21vZGlmaWVkOyAvKiBzZXJ2ZXItc2lkZTogMSA9IGNsaWVudCBjb29raWUgd2FzIG1vZGlmaWVkICovIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwX2Nvb2tpZSAqbmV4dDsgPGJyIC8+DQorfTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1NpbmNlIHRoZSBjb29raWUgZGF0YWJhc2UgaXMgbGlua2VkIHRvIGEgPGk+c29hcDwvaT4gc3RydWN0LCBlYWNoIHRocmVhZCBoYXMgYSBsb2NhbCBjb29raWUgZGF0YWJhc2UgaW4gYSBtdWx0aS10aHJlYWRlZA0KK2ltcGxlbWVudGF0aW9uLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJICAgICA8aDM+PGEgbmFtZT0idHRoX3NFYzE4LjI3Ij4NCisxOC4yNzwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+U2VydmVyLVNpZGUgQ29va2llIFN1cHBvcnQ8L2ZvbnQ+PC9oMz48YSBuYW1lPSJzZWM6c2VydmVyY29va2llIj4NCis8L2E+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1NlcnZlci1zaWRlIGNvb2tpZSBzdXBwb3J0IGlzIG9wdGlvbmFsLiBUbyBlbmFibGUgY29va2llIHN1cHBvcnQsIGNvbXBpbGUgYWxsIHNvdXJjZXMgd2l0aCBvcHRpb24gPGk+LURXSVRIX0NPT0tJRVM8L2k+LCBmb3IgZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNEMEQwRDAiPjx0cj48dGQ+PHNwYW4gY2xhc3M9InJvbWFuIj4NCis8aT5nKysgLURXSVRIX0NPT0tJRVMgLW8gbXlzZXJ2ZXIgLi4uPC9pPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQorZ1NPQVAgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBjb29raWUgQVBJIGZvciBzZXJ2ZXItc2lkZSBjb29raWUgc2Vzc2lvbiBjb250cm9sOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKw0KKzx0YWJsZT4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPjxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5GdW5jdGlvbjwvYj48L2ZvbnQ+IDwvdGQ+PC90cj4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPjxpPjxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwX2Nvb2tpZSAqc29hcF9zZXRfY29va2llKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj5jb25zdDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypuYW1lLCA8Yj5jb25zdDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOyp2YWx1ZSwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqZG9tYWluLCA8Yj5jb25zdDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypwYXRoKTs8L2k+IDwvdGQ+PC90cj4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPkFkZCBhIGNvb2tpZSB0byB0aGUgZGF0YWJhc2Ugd2l0aCBuYW1lIDxpPm5hbWU8L2k+IGFuZCB2YWx1ZSA8aT52YWx1ZTwvaT4uDQorPGk+ZG9tYWluPC9pPiBhbmQgPGk+cGF0aDwvaT4gbWF5IGJlIE5VTEwgdG8gdXNlIHRoZSBjdXJyZW50IGRvbWFpbiBhbmQgcGF0aCBnaXZlbiBieSA8aT5zb2FwX2Nvb2tpZV9kb21haW48L2k+IGFuZCA8aT5zb2FwX2Nvb2tpZV9wYXRoPC9pPi4NCitJZiBzdWNjZXNzZnVsLCByZXR1cm5zIHBvaW50ZXIgdG8gYSBjb29raWUgbm9kZSBpbiB0aGUgbGlua2VkIGxpc3QsIG9yIE5VTEwgb3RoZXJ3aXNlLg0KKzwvdGQ+PC90cj4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPjxpPjxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwX2Nvb2tpZSAqc29hcF9jb29raWUoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7Km5hbWUsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KmRvbWFpbiwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqcGF0aCk7PC9pPiA8L3RkPjwvdHI+DQorPHRyPjx0ZCB3aWR0aD0iNjAyIj5GaW5kIGEgY29va2llIGluIHRoZSBkYXRhYmFzZSB3aXRoIG5hbWUgPGk+bmFtZTwvaT4gYW5kIHZhbHVlIDxpPnZhbHVlPC9pPi4NCis8aT5kb21haW48L2k+IGFuZCA8aT5wYXRoPC9pPiBtYXkgYmUgTlVMTCB0byB1c2UgdGhlIGN1cnJlbnQgZG9tYWluIGFuZCBwYXRoIGdpdmVuIGJ5IDxpPnNvYXBfY29va2llX2RvbWFpbjwvaT4gYW5kIDxpPnNvYXBfY29va2llX3BhdGg8L2k+Lg0KK0lmIHN1Y2Nlc3NmdWwsIHJldHVybnMgcG9pbnRlciB0byBhIGNvb2tpZSBub2RlIGluIHRoZSBsaW5rZWQgbGlzdCwgb3IgTlVMTCBvdGhlcndpc2UuDQorPC90ZD48L3RyPg0KKzx0cj48dGQgd2lkdGg9IjYwMiI+PGk+PGI+Y2hhcjwvYj4mbmJzcDsqc29hcF9jb29raWVfdmFsdWUoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7Km5hbWUsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KmRvbWFpbiwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqcGF0aCk7PC9pPiA8L3RkPjwvdHI+DQorPHRyPjx0ZCB3aWR0aD0iNjAyIj5HZXQgdmFsdWUgb2YgYSBjb29raWUgaW4gdGhlIGRhdGFiYXNlIHdpdGggbmFtZSA8aT5uYW1lPC9pPi4NCis8aT5kb21haW48L2k+IGFuZCA8aT5wYXRoPC9pPiBtYXkgYmUgTlVMTCB0byB1c2UgdGhlIGN1cnJlbnQgZG9tYWluIGFuZCBwYXRoIGdpdmVuIGJ5IDxpPnNvYXBfY29va2llX2RvbWFpbjwvaT4gYW5kIDxpPnNvYXBfY29va2llX3BhdGg8L2k+Lg0KK0lmIHN1Y2Nlc3NmdWwsIHJldHVybnMgdGhlIHN0cmluZyBwb2ludGVyIHRvIHRoZSB2YWx1ZSwgb3IgTlVMTCBvdGhlcndpc2UuDQorPC90ZD48L3RyPg0KKzx0cj48dGQgd2lkdGg9IjYwMiI+PGk+PGI+bG9uZzwvYj4mbmJzcDtzb2FwX2Nvb2tpZV9leHBpcmUoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7Km5hbWUsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KmRvbWFpbiwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqcGF0aCk7PC9pPiA8L3RkPjwvdHI+DQorPHRyPjx0ZCB3aWR0aD0iNjAyIj5HZXQgZXhwaXJhdGlvbiB2YWx1ZSBvZiB0aGUgY29va2llIGluIHRoZSBkYXRhYmFzZSB3aXRoIG5hbWUgPGk+bmFtZTwvaT4gKGluIHNlY29uZHMpLg0KKzxpPmRvbWFpbjwvaT4gYW5kIDxpPnBhdGg8L2k+IG1heSBiZSBOVUxMIHRvIHVzZSB0aGUgY3VycmVudCBkb21haW4gYW5kIHBhdGggZ2l2ZW4gYnkgPGk+c29hcF9jb29raWVfZG9tYWluPC9pPiBhbmQgPGk+c29hcF9jb29raWVfcGF0aDwvaT4uDQorUmV0dXJucyB0aGUgZXhwaXJhdGlvbiB2YWx1ZSwgb3IgLTEgaWYgY29va2llIGRvZXMgbm90IGV4aXN0Lg0KKzwvdGQ+PC90cj4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPjxpPjxiPmludDwvYj4mbmJzcDtzb2FwX3NldF9jb29raWVfZXhwaXJlKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj5jb25zdDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypuYW1lLCA8Yj5sb25nPC9iPiZuYnNwO2V4cGlyZSwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqZG9tYWluLCA8Yj5jb25zdDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypwYXRoKTs8L2k+IDwvdGQ+PC90cj4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPlNldCBleHBpcmF0aW9uIHZhbHVlIDxpPmV4cGlyZTwvaT4gb2YgdGhlIGNvb2tpZSBpbiB0aGUgZGF0YWJhc2Ugd2l0aCBuYW1lIDxpPm5hbWU8L2k+IChpbiBzZWNvbmRzKS4NCis8aT5kb21haW48L2k+IGFuZCA8aT5wYXRoPC9pPiBtYXkgYmUgTlVMTCB0byB1c2UgdGhlIGN1cnJlbnQgZG9tYWluIGFuZCBwYXRoIGdpdmVuIGJ5IDxpPnNvYXBfY29va2llX2RvbWFpbjwvaT4gYW5kIDxpPnNvYXBfY29va2llX3BhdGg8L2k+Lg0KK0lmIHN1Y2Nlc3NmdWwsIHJldHVybnMgPGk+U09BUF9PSzwvaT4sIG9yIDxpPlNPQVBfRU9GPC9pPiBvdGhlcndpc2UuDQorPC90ZD48L3RyPg0KKzx0cj48dGQgd2lkdGg9IjYwMiI+PGk+PGI+aW50PC9iPiZuYnNwO3NvYXBfc2V0X2Nvb2tpZV9zZXNzaW9uKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj5jb25zdDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypuYW1lLCA8Yj5jb25zdDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypkb21haW4sIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KnBhdGgpOzwvaT4gPC90ZD48L3RyPg0KKzx0cj48dGQgd2lkdGg9IjYwMiI+U2V0IGNvb2tpZSBpbiB0aGUgZGF0YWJhc2Ugd2l0aCBuYW1lIDxpPm5hbWU8L2k+IHRvIGJlIGEgc2Vzc2lvbiBjb29raWUuDQorVGhpcyBtZWFucyB0aGF0IHRoZSBjb29raWUgd2lsbCBiZSByZXR1cm5lZCB0byB0aGUgY2xpZW50Lg0KKyhPbmx5IGNvb2tpZXMgdGhhdCBhcmUgbW9kaWZpZWQgYXJlIHJldHVybmVkIHRvIHRoZSBjbGllbnQpLg0KKzxpPmRvbWFpbjwvaT4gYW5kIDxpPnBhdGg8L2k+IG1heSBiZSBOVUxMIHRvIHVzZSB0aGUgY3VycmVudCBkb21haW4gYW5kIHBhdGggZ2l2ZW4gYnkgPGk+c29hcF9jb29raWVfZG9tYWluPC9pPiBhbmQgPGk+c29hcF9jb29raWVfcGF0aDwvaT4uDQorSWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyA8aT5TT0FQX09LPC9pPiwgb3IgPGk+U09BUF9FT0Y8L2k+IG90aGVyd2lzZS4NCis8L3RkPjwvdHI+DQorPHRyPjx0ZCB3aWR0aD0iNjAyIj48aT48Yj5pbnQ8L2I+Jm5ic3A7c29hcF9jbHJfY29va2llX3Nlc3Npb24oPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7Km5hbWUsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KmRvbWFpbiwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqcGF0aCk7PC9pPiA8L3RkPjwvdHI+DQorPHRyPjx0ZCB3aWR0aD0iNjAyIj5DbGVhciBjb29raWUgaW4gdGhlIGRhdGFiYXNlIHdpdGggbmFtZSA8aT5uYW1lPC9pPiB0byBiZSBhIHNlc3Npb24gY29va2llLg0KKzxpPmRvbWFpbjwvaT4gYW5kIDxpPnBhdGg8L2k+IG1heSBiZSBOVUxMIHRvIHVzZSB0aGUgY3VycmVudCBkb21haW4gYW5kIHBhdGggZ2l2ZW4gYnkgPGk+c29hcF9jb29raWVfZG9tYWluPC9pPiBhbmQgPGk+c29hcF9jb29raWVfcGF0aDwvaT4uDQorSWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyA8aT5TT0FQX09LPC9pPiwgb3IgPGk+U09BUF9FT0Y8L2k+IG90aGVyd2lzZS4NCis8L3RkPjwvdHI+DQorPHRyPjx0ZCB3aWR0aD0iNjAyIj48aT48Yj52b2lkPC9iPiZuYnNwO3NvYXBfY2xyX2Nvb2tpZSg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqbmFtZSwgPGI+Y29uc3Q8L2I+Jm5ic3A7PGI+Y2hhcjwvYj4mbmJzcDsqZG9tYWluLCA8Yj5jb25zdDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypwYXRoKTs8L2k+IDwvdGQ+PC90cj4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPlJlbW92ZSBjb29raWUgZnJvbSB0aGUgZGF0YWJhc2Ugd2l0aCBuYW1lIDxpPm5hbWU8L2k+Lg0KKzxpPmRvbWFpbjwvaT4gYW5kIDxpPnBhdGg8L2k+IG1heSBiZSBOVUxMIHRvIHVzZSB0aGUgY3VycmVudCBkb21haW4gYW5kIHBhdGggZ2l2ZW4gYnkgPGk+c29hcF9jb29raWVfZG9tYWluPC9pPiBhbmQgPGk+c29hcF9jb29raWVfcGF0aDwvaT4uDQorPC90ZD48L3RyPg0KKzx0cj48dGQgd2lkdGg9IjYwMiI+PGk+PGI+aW50PC9iPiZuYnNwO3NvYXBfZ2V0ZW52X2Nvb2tpZXMoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXApOzwvaT4gPC90ZD48L3RyPg0KKzx0cj48dGQgd2lkdGg9IjYwMiI+SW5pdGlhbGl6ZXMgY29va2llIGRhdGFiYXNlIGJ5IHJlYWRpbmcgdGhlICdIVFRQX0NPT0tJRScgZW52aXJvbm1lbnQgdmFyaWFibGUuDQorVGhpcyBwcm92aWRlcyBhIG1lYW5zIGZvciBhIENHSSBhcHBsaWNhdGlvbiB0byByZWFkIGNvb2tpZXMgc2VuZCBieSBhIGNsaWVudC4NCitJZiBzdWNjZXNzZnVsLCByZXR1cm5zIDxpPlNPQVBfT0s8L2k+LCBvciA8aT5TT0FQX0VPRjwvaT4gb3RoZXJ3aXNlLg0KKzwvdGQ+PC90cj4NCis8dHI+PHRkIHdpZHRoPSI2MDIiPjxpPjxiPnZvaWQ8L2I+Jm5ic3A7c29hcF9mcmVlX2Nvb2tpZXMoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXApOzwvaT4gPC90ZD48L3RyPg0KKzx0cj48dGQgd2lkdGg9IjYwMiI+UmVsZWFzZSBjb29raWUgZGF0YWJhc2UuIDwvdGQ+PC90cj48L3RhYmxlPg0KKw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQorVGhlIGZvbGxvd2luZyBnbG9iYWwgdmFyaWFibGVzIGFyZSB1c2VkIHRvIGRlZmluZSB0aGUgY3VycmVudCBkb21haW4gYW5kIHBhdGg6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjRDBEMEQwIj48dHI+PHRkPjxzcGFuIGNsYXNzPSJyb21hbiI+DQorDQorPHRhYmxlPg0KKzx0cj48dGQ+PGZvbnQgY29sb3I9IiNGRjAwMDAiPjxiPkF0dHJpYnV0ZTwvYj48L2ZvbnQ+IDwvdGQ+PHRkPjxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj52YWx1ZTwvYj48L2ZvbnQ+IDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPjxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KmNvb2tpZV9kb21haW48L2k+IDwvdGQ+PHRkPk1VU1QgYmUgc2V0IHRvIHRoZSBkb21haW4gKGhvc3QpIG9mIHRoZSBzZXJ2aWNlIDwvdGQ+PC90cj4NCis8dHI+PHRkPjxpPjxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KmNvb2tpZV9wYXRoPC9pPiA8L3RkPjx0ZD5NQVkgYmUgc2V0IHRvIHRoZSBkZWZhdWx0IHBhdGggdG8gdGhlIHNlcnZpY2UgPC90ZD48L3RyPg0KKzx0cj48dGQ+PGk+PGI+aW50PC9iPiZuYnNwO2Nvb2tpZV9tYXg8L2k+IDwvdGQ+PHRkPm1heGltdW0gY29va2llIGRhdGFiYXNlIHNpemUgKGRlZmF1bHQ9MzIpIDwvdGQ+PC90cj48L3RhYmxlPg0KKw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQorVGhlIDxpPmNvb2tpZV9wYXRoPC9pPiB2YWx1ZSBpcyB1c2VkIHRvIGZpbHRlciBjb29raWVzIGludGVuZGVkIGZvciB0aGlzIHNlcnZpY2UgYWNjb3JkaW5nIHRvIHRoZSBwYXRoIHByZWZpeCBydWxlcyBvdXRsaW5lZCBpbg0KK1JGQzIxMDkuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBzZXJ2ZXIgYWRvcHRzIGNvb2tpZXMgZm9yIHNlc3Npb24gY29udHJvbDoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+aW50PC9iPiZuYnNwO21haW4oKSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwIHNvYXA7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmludDwvYj4mbmJzcDttLCBzOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2luaXQoJmFtcDtzb2FwKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcC5jb29raWVfZG9tYWluID0gIi4uLiI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXAuY29va2llX3BhdGggPSAiLyI7IC8vIHRoZSBwYXRoIHdoaWNoIGlzIHVzZWQgdG8gZmlsdGVyL3NldCBjb29raWVzIHdpdGggdGhpcyBkZXN0aW5hdGlvbiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoYXJnYyAgJmx0OyAgMikgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2dldGVudl9jb29raWVzKCZhbXA7c29hcCk7IC8vIENHSSBhcHA6IGdyYWIgY29va2llcyBmcm9tICdIVFRQX0NPT0tJRScgZW52IHZhciA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwX3NlcnZlKCZhbXA7c29hcCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO30gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+ZWxzZTwvYj48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO20gPSBzb2FwX2JpbmQoJmFtcDtzb2FwLCBOVUxMLCBhdG9pKGFyZ3ZbMV0pLCAxMDApOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsobSAgJmx0OyAgMCkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZXhpdCgxKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+Zm9yPC9iPiZuYnNwOyg8Yj5pbnQ8L2I+Jm5ic3A7aSA9IDE7IDsgaSsrKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDt7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3MgPSBzb2FwX2FjY2VwdCgmYW1wO3NvYXApOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsocyAgJmx0OyAgMCkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZXhpdCgxKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9zZXJ2ZSgmYW1wO3NvYXApOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2VuZCgmYW1wO3NvYXApOwkJLy8gY2xlYW4gdXAgIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfZnJlZV9jb29raWVzKCZhbXA7c29hcCk7CS8vIHJlbW92ZSBhbGwgb2xkIGNvb2tpZXMgZnJvbSBkYXRhYmFzZSBzbyBubyBpbnRlcmZlcmVuY2Ugb2NjdXJzIHdpdGggdGhlIGFycml2YWwgb2YgbmV3IGNvb2tpZXMgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt9IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDswOyA8YnIgLz4NCit9IDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDtja19fZGVtbyg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgLi4uKSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmludDwvYj4mbmJzcDtuOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5jb25zdDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwOypzOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzID0gc29hcF9jb29raWVfdmFsdWUoc29hcCwgImRlbW8iLCBOVUxMLCBOVUxMKTsgLy8gY29va2llIHJldHVybmVkIGJ5IGNsaWVudD8gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KCFzKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzID0gImluaXQtdmFsdWUiOyAvLyBubzogc2V0IGluaXRpYWwgY29va2llIHZhbHVlIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmVsc2U8L2I+Jm5ic3A7PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Li4uIC8vIG1vZGlmeSAncycgdG8gcmVmbGVjdCBzZXNzaW9uIGNvbnRyb2wgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9zZXRfY29va2llKHNvYXAsICJkZW1vIiwgcywgTlVMTCwgTlVMTCk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfc2V0X2Nvb2tpZV9leHBpcmUoc29hcCwgImRlbW8iLCA1LCBOVUxMLCBOVUxMKTsgLy8gY29va2llIG1heSBleHBpcmUgYXQgY2xpZW50LXNpZGUgaW4gNSBzZWNvbmRzIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDtTT0FQX09LOyA8YnIgLz4NCit9DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCSAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWMxOC4yOCI+DQorMTguMjg8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPkNvbm5lY3RpbmcgQ2xpZW50cyBUaHJvdWdoIFByb3h5IFNlcnZlcnM8L2ZvbnQ+PC9oMz4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorV2hlbiBhIGNsaWVudCBuZWVkcyB0byBjb25uZWN0IHRvIGEgV2ViIFNlcnZpY2UgdGhyb3VnaCBhIHByb3h5IHNlcnZlciwgc2V0IHRoZSA8aT5zb2FwLnByb3h5X2hvc3Q8L2k+IHN0cmluZyBhbmQNCis8aT5zb2FwLnByb3h5X3BvcnQ8L2k+IGludGVnZXIgYXR0cmlidXRlcyBvZiB0aGUgY3VycmVudCA8aT5zb2FwPC9pPiBydW50aW1lIGVudmlyb25tZW50IHRvIHRoZSBwcm94eSdzIGhvc3QgbmFtZSBhbmQgcG9ydCwgcmVzcGVjdGl2ZWx5LiBGb3IgZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgc29hcDsgPGJyIC8+DQorc29hcF9pbml0KCZhbXA7c29hcCk7IDxiciAvPg0KK3NvYXAucHJveHlfaG9zdCA9ICJwcm94eWhvc3RuYW1lIjsgPGJyIC8+DQorc29hcC5wcm94eV9wb3J0ID0gODA4MDsgPGJyIC8+DQorPGI+aWY8L2I+Jm5ic3A7KHNvYXBfY2FsbF9uc19fbWV0aG9kKCZhbXA7c29hcCwgImh0dHA6Ly9ob3N0OnBvcnQvcGF0aCIsICJhY3Rpb24iLCAuLi4pKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX3ByaW50X2ZhdWx0KCZhbXA7c29hcCwgc3RkZXJyKTsgPGJyIC8+DQorPGI+ZWxzZTwvYj48YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsuLi4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoZSBhdHRyaWJ1dGVzIDxpPnNvYXAucHJveHlfaG9zdDwvaT4gYW5kIDxpPnNvYXAucHJveHlfcG9ydDwvaT4ga2VlcCB0aGVpciB2YWx1ZXMgdGhyb3VnaCB0aGUgcmVtb3RlIG1ldGhvZCBjYWxscywNCitzbyB0aGV5IG9ubHkgbmVlZCB0byBiZSBzZXQgb25jZS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCSAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWMxOC4yOSI+DQorMTguMjk8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPkZhc3RDR0kgU3VwcG9ydDwvZm9udD48L2gzPjxhIG5hbWU9InNlYzpmYXN0Y2dpIj4NCis8L2E+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RvIGVuYWJsZSBGYXN0Q0dJIHN1cHBvcnQsIGluc3RhbGwgRmFzdENHSSBhbmQgY29tcGlsZSA8ZW0+YWxsPC9lbT4gc291cmNlcyAoaW5jbHVkaW5nIHlvdXIgYXBwbGljYXRpb24gc291cmNlcyB0aGF0IHVzZSA8aT5zdGRzb2FwMi5oPC9pPikgd2l0aCBvcHRpb24gPGk+LURXSVRIX0ZBU1RDR0k8L2k+IG9yIGFkZA0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisjZGVmaW5lIFdJVEhfRkFTVENHSQ0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQordG8gPGk+c3Rkc29hcDIuaDwvaT4uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkgICAgIDxoMz48YSBuYW1lPSJ0dGhfc0VjMTguMzAiPg0KKzE4LjMwPC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5Ib3cgdG8gQ3JlYXRlIGdTT0FQIEFwcGxpY2F0aW9ucyBXaXRoIGEgU21hbGwgTWVtb3J5IEZvb3RwcmludDwvZm9udD48L2gzPjxhIG5hbWU9InNlYzpsZWFuIj4NCis8L2E+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RvIGNvbXBpbGUgZ1NPQVAgYXBwbGljYXRpb25zIGludGVuZGVkIGZvciBzbWFsbCBtZW1vcnkgZGV2aWNlcywgeW91IG1heSB3YW50DQordG8gcmVtb3ZlIGFsbCBub24tZXNzZW50aWFsIGZlYXR1cmVzIHRoYXQgY29uc3VtZSBwcmVjaW91cyBjb2RlIGFuZCBkYXRhIHNwYWNlLg0KK1RvIGRvIHRoaXMsIGNvbXBpbGUgdGhlIGdTT0FQIHNvdXJjZXMgd2l0aCA8aT4tRFdJVEhfTEVBTjwvaT4gKGkuZS4mbmJzcDs8aT4jZGVmaW5lIFdJVEhfTEVBTjwvaT4pIHRvIHJlbW92ZSBtYW55DQorbm9uLWVzc2VudGlhbCBmZWF0dXJlcy4gVGhlIGZlYXR1cmVzIHRoYXQgd2lsbCBiZSBkaXNhYmxlZCBhcmU6DQorDQorPHVsPg0KKzxsaT4gTm8gSS9PIHRpbWVvdXRzLiBOb3RlIHRoYXQgbWFueSBzb2NrZXQgb3BlcmF0aW9ucyBhbHJlYWR5IG9iZXkgc29tZSBmb3JtIG9mIHRpbWVvdXQgaGFuZGxpbmcsIHN1Y2ggYXMgYSBjb25uZWN0IHRpbWVvdXQgZm9yIGV4YW1wbGUuDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorDQorPGxpPiBObyBIVFRQIGtlZXAgYWxpdmUNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorPC9saT4NCisNCis8bGk+IE5vIEhUVFAgY29va2llcw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8L2xpPg0KKw0KKzxsaT4gTm8gSFRUUCBhdXRoZW50aWNhdGlvbg0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8L2xpPg0KKw0KKzxsaT4gTm8gSFRUUCBjaHVua2VkIG91dHB1dCAoYnV0IGlucHV0IGlzIE9LKQ0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8L2xpPg0KKw0KKzxsaT4gTm8gSFRUUCBjb21wcmVzc2VkIG91dHB1dCAoYnV0IGlucHV0IGlzIE9LIHdoZW4gY29tcGlsZWQgd2l0aCA8aT5XSVRIX0daSVA8L2k+KQ0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8L2xpPg0KKw0KKzxsaT4gTm8gc2VuZC9yZWN2IHRpbWVvdXRzDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorDQorPGxpPiBObyBzb2NrZXQgZmxhZ3MgKG5vIDxpPnNvYXAuc29ja2V0X2ZsYWcsIHNvYXAuY29ubmVjdF9mbGFnLCBzb2FwLmJpbmRfZmxhZywgc29hcC5hY2NlcHRfZmxhZzwvaT4pDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorDQorPGxpPiBObyBjYW5vbmljYWwgWE1MIG91dHB1dA0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8L2xpPg0KKw0KKzxsaT4gTm8gbG9nZ2luZw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8L2xpPg0KKw0KKzxsaT4gTGltaXRlZCBUQ1AvSVAgYW5kIEhUVFAgZXJyb3IgZGlhZ25vc3RpYyBtZXNzYWdlcw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8L2xpPg0KKw0KKzxsaT4gTm8gc3VwcG9ydCBmb3IgPGk+dGltZV90PC9pPiBzZXJpYWxpemF0aW9uDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorDQorPGxpPiBObyBzdXBwb3J0IGZvciA8aT5MT05HNjQ8L2k+LzxpPlVMT05HNjQ8L2k+IHNlcmlhbGl6YXRpb24gKHVzZSA8aT48Yj50eXBlZGVmPC9iPiZuYnNwOzxiPmxvbmc8L2I+Jm5ic3A7eHNkX19sb25nPC9pPikNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorPC9saT4NCis8L3VsPg0KK1VzZSA8aT4tRFdJVEhfTEVBTkVSPC9pPiB0byBtYWtlIHRoZSBleGVjdXRhYmxlIGV2ZW4gc21hbGxlciBieSByZW1vdmluZyBESU1FDQorYW5kIE1JTUUgYXR0YWNobWVudCBoYW5kbGluZywgPGk+d2NoYXJfdCo8L2k+IHNlcmlhbGl6YXRpb24sIGFuZCBzdXBwb3J0IGZvciBYTUwgRE9NIG9wZXJhdGlvbnMuDQorTm90ZSB0aGF0IERJTUUvTUlNRSBhdHRhY2htZW50cyBhcmUgbm90IGVzc2VudGlhbCB0byBhY2hpZXZlDQorU09BUC9YTUwgaW50ZXJvcGVyYWJpbGl0eS4gIERJTUUgYXR0YWNobWVudHMgYXJlIGEgY29udmVuaWVudCB3YXkgdG8gZXhjaGFuZ2UNCitub24tdGV4dC1iYXNlZCAoaS5lLiZuYnNwO2JpbmFyeSkgY29udGVudCwgYnV0IGFyZSBub3QgcmVxdWlyZWQgZm9yIGJhc2ljIFNPQVAvWE1MDQoraW50ZXJvcGVyYWJpbGl0eS4gIEF0dGFjaG1lbnQgcmVxdWlyZW1lbnRzIGFyZSBwcmVkaWN0YWJsZS4gIFRoYXQgaXMsDQorYXBwbGljYXRpb25zIHdvbid0IHN1ZGRlbmx5IGRlY2lkZSB0byB1c2UgRElNRSBvciBNSU1FIGluc3RlYWQgb2YgWE1MIHRvIGV4Y2hhbmdlDQorY29udGVudC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorSXQgaXMgc2FmZSB0byB0cnkgdG8gY29tcGlsZSB5b3VyIGFwcGxpY2F0aW9uIHdpdGggPGk+LURXSVRIX0xFQU48L2k+LCBwcm92aWRlZA0KK3RoYXQgeW91ciBhcHBsaWNhdGlvbiBkb2VzIG5vdCByZWx5IG9uIEkvTyB0aW1lb3V0cy4gV2hlbiBubyBsaW5rYWdlIGVycm9yDQorb2NjdXJzIGluIHRoZSBjb21waWxhdGlvbiBwcm9jZXNzLCBpdCBpcyBzYWZlIHRvIGFzc3VtZSB0aGF0IHlvdXIgYXBwbGljYXRpb24NCit3aWxsIHJ1biBqdXN0IGZpbmUuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkgICAgIDxoMz48YSBuYW1lPSJ0dGhfc0VjMTguMzEiPg0KKzE4LjMxPC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5Ib3cgdG8gRWxpbWluYXRlIEJTRCBTb2NrZXQgTGlicmFyeSBMaW5rYWdlPC9mb250PjwvaDM+PGEgbmFtZT0ic2VjOm5vaW8iPg0KKzwvYT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIDxpPnN0ZHNvYXAyLmM8L2k+IGFuZCA8aT5zdGRzb2FwMi5jcHA8L2k+IGdTT0FQIHJ1bnRpbWUgbGlicmFyaWVzIHNob3VsZCBiZSBsaW5rZWQgd2l0aCBhIEJTRCBzb2NrZXQgbGlicmFyeSBpbiB0aGUgcHJvamVjdCBidWlsZCwgZS5nLiB3aW5zb2NrIGZvciBXaW4zMi4gVG8gZWxpbWluYXRlIHRoZSBuZWVkIHRvIGxpbmsgYSBzb2NrZXQgbGlicmFyeSwgeW91IGNhbiBjb21waWxlIDxpPnN0ZHNvYXAyLmM8L2k+IChmb3IgQykgYW5kIDxpPnN0ZHNvYXAyLmNwcDwvaT4gKGZvciBDKyspIHdpdGggdGhlIDxpPi1EV0lUSF9OT0lPPC9pPiBtYWNybyBzZXQgKGkuZS4mbmJzcDs8aT4jZGVmaW5lIFdJVEhfTk9JTzwvaT4pLiBUaGlzIGVsaW1pbmF0ZXMgdGhlIGRlcGVuZGVuY3kgb24gdGhlIEJTRCBzb2NrZXQgQVBJLCBJTyBzdHJlYW1zLCA8aT5GSUxFPC9pPiB0eXBlLCBhbmQgPGk+ZXJybm88L2k+Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitBcyBhIGNvbnNlcXVlbmNlLCB5b3UgTVVTVCBkZWZpbmUgY2FsbGJhY2tzIHRvIHJlcGxhY2UgdGhlIG1pc3Npbmcgc29ja2V0IHN0YWNrLiBUbyBkbyBzbywgYWRkIHRvIHlvdXIgY29kZSB0aGUgZm9sbG93aW5nIGRlZmluaXRpb25zOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCBzb2FwOyA8YnIgLz4NCitzb2FwX2luaXQoJmFtcDtzb2FwKTsgPGJyIC8+DQorLyogZnNlbmQgaXMgdXNlZCB0byB0cmFuc21pdCBkYXRhIGluIGJsb2NrcyAqLyA8YnIgLz4NCitzb2FwLmZzZW5kID0gbXlfc2VuZDsgPGJyIC8+DQorLyogZnJlY3YgaXMgdXNlZCB0byByZWNlaXZlIGRhdGEgaW4gYmxvY2tzICovIDxiciAvPg0KK3NvYXAuZnJlY3YgPSBteV9yZWN2OyA8YnIgLz4NCisvKiBmb3BlbiBpcyB1c2VkIHRvIGNvbm5lY3QgKi8gPGJyIC8+DQorc29hcC5mb3BlbiA9IG15X3RjcF9jb25uZWN0OyA8YnIgLz4NCisvKiBmY2xvc2UgaXMgdXNlZCB0byBkaXNjb25uZWN0ICovIDxiciAvPg0KK3NvYXAuZmNsb3NlID0gbXlfdGNwX2Rpc2Nvbm5lY3Q7IDxiciAvPg0KKy8qIGZjbG9zZXNvY2tldCBpcyB1c2VkIG9ubHkgdG8gY2xvc2UgdGhlIG1hc3RlciBzb2NrZXQgaW4gYSBzZXJ2ZXIgdXBvbiBzb2FwX2RvbmUoKSAqLyA8YnIgLz4NCitzb2FwLmZjbG9zZXNvY2tldCA9IG15X3RjcF9jbG9zZXNvY2tldDsgPGJyIC8+DQorLyogZnNodXRkb3duc29ja2V0IGlzIHVzZWQgYWZ0ZXIgY29tcGxldGluZyBhIHNlbmQgb3BlcmF0aW9uIHRvIHNlbmQgVENQIEZJTiAqLyA8YnIgLz4NCitzb2FwLmZzaHV0ZG93bnNvY2tldCA9IG15X3RjcF9zaHV0ZG93bnNvY2tldDsgPGJyIC8+DQorLyogc2V0dGluZyBmcG9sbCBpcyBvcHRpb25hbCwgbGVhdmUgaXQgTlVMTCB0byBvbWl0IHBvbGxpbmcgdGhlIHNlcnZlciAqLyA8YnIgLz4NCitzb2FwLmZwb2xsID0gbXlfcG9sbDsgPGJyIC8+DQorLyogZmFjY2VwdCBpcyB1c2VkIG9ubHkgYnkgYSBzZXJ2ZXIgYXBwbGljYXRpb24gKi8gPGJyIC8+DQorc29hcC5mYWNjZXB0ID0gbXlfYWNjZXB0Ow0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhlc2UgZnVuY3Rpb25zIGFyZSBzdXBwb3NlZCB0byBwcm92aWRlIGEgKG1pbmltYWwpIHRyYW5zcG9ydCBzdGFjay4NCitTZWUgU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6Y2FsbGJhY2siPjE4Ljc8L2E+IGZvciBtb3JlIGRldGFpbHMgb24gdGhlIHVzZSBvZiB0aGVzZSBjYWxsYmFja3MuDQorQWxsIGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXJzIHNob3VsZCBiZSBub24tTlVMTCwgZXhjZXB0IDxpPmZwb2xsPC9pPi4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorWW91IGNhbm5vdCB1c2UgPGk+c29hcF9wcmludF9mYXVsdDwvaT4gYW5kIDxpPnNvYXBfcHJpbnRfZmF1bHRfbG9jYXRpb248L2k+IHRvIHByaW50IGVycm9yIGRpYWdub3N0aWNzLiBJbnN0ZWFkLCB0aGUgdmFsdWUgb2YgPGk+c29hcC5lcnJvcjwvaT4sIHdoaWNoIGNvbnRhaW5zIHRoZSBnU09BUCBlcnJvciBjb2RlLCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGNhdXNlIG9mIGEgZmF1bHQuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkgICAgIDxoMz48YSBuYW1lPSJ0dGhfc0VjMTguMzIiPg0KKzE4LjMyPC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5Ib3cgdG8gQ29tYmluZSBNdWx0aXBsZSBDbGllbnQgYW5kIFNlcnZlciBJbXBsZW1lbnRhdGlvbnMgaW50byBvbmUgRXhlY3V0YWJsZTwvZm9udD48L2gzPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgPGk+d3NkbDJoPC9pPiB0b29sIGNhbiBiZSB1c2VkIHRvIGltcG9ydCBtdWx0aXBsZSBXU0RMcyBhbmQgc2NoZW1hcyBhdCBvbmNlLg0KK1RoZSBzZXJ2aWNlIGRlZmluaXRpb25zIGFyZSBjb21iaW5lZCBpbiBvbmUgaGVhZGVyIGZpbGUgdG8gYmUgcGFyc2VkIGJ5DQorPGk+c29hcGNwcDI8L2k+LiBJdCBpcyBpbXBvcnRhbnQgdG8gYXNzaWduIG5hbWVzcGFjZSBwcmVmaXhlcyB0byBuYW1lc3BhY2UgVVJJcw0KK3VzaW5nIHRoZSA8aT50eXBlbWFwLmRhdDwvaT4gZmlsZS4gT3RoZXJ3aXNlLCA8aT53c2RsMmg8L2k+IHdpbGwgYXNzaWduIG5hbWVzcGFjZQ0KK3ByZWZpeGVzIDxpPm5zMTwvaT4sIDxpPm5zMjwvaT4sIGFuZCBzbyBvbiB0byB0aGUgc2VydmljZSBvcGVyYXRpb25zIGFuZCBzY2hlbWENCit0eXBlcy4gVGh1cywgYW55IGNoYW5nZSB0byBhIFdTREwgb3Igc2NoZW1hIG1heSByZXN1bHQgaW4gYSBuZXcgcHJlZml4DQorYXNzaWdubWVudC4gRm9yIG1vcmUgZGV0YWlscywgcGxlYXNlIHNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzp0eXBlbWFwIj43LjIuMTE8L2E+Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhlIFhNZXRob2RzIGRlbGF5ZWQgc3RvY2sgcXVvdGUgYW5kIGV4Y2hhbmdlIHJhdGUgc2VydmljZXMuIFdlIGNhbiBpbXBvcnQgYm90aCBXU0RMcyBhdCBvbmNlIHdpdGg6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjRDBEMEQwIj48dHI+PHRkPjxzcGFuIGNsYXNzPSJyb21hbiI+DQorPGk+d3NkbDJoIC1zIC1vIHF4LmggaHR0cDovL3NlcnZpY2VzLnhtZXRob2RzLm5ldC9zb2FwL3Vybjp4bWV0aG9kcy1kZWxheWVkLXF1b3Rlcy53c2RsoGh0dHA6Ly93d3cueG1ldGhvZHMubmV0L3NkLzIwMDEvQ3VycmVuY3lFeGNoYW5nZVNlcnZpY2Uud3NkbDwvaT4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9zcGFuPg0KK1RoaXMgZ2VuZXJhdGVzIHRoZSA8aT5xeC5oPC9pPiBmaWxlIGZvciBDKysgKG9wdGlvbiAtcyBmb3Igbm9uLVNUTCkuICBUaGUNCituZXh0IHN0ZXAgaXMgdG8gdXNlIHRoZSA8aT5zb2FwY3BwMjwvaT4gY29tcGlsZXIgb24gdGhpcyBmaWxlIHRvIGdlbmVyYXRlIGNsaWVudA0KK2NvZGUgKG9wdGlvbiAtQyk6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjRDBEMEQwIj48dHI+PHRkPjxzcGFuIGNsYXNzPSJyb21hbiI+DQorPGk+c29hcGNwcDIgLUMgcXguaDwvaT4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9zcGFuPg0KK1RoZSByZXN1bGluZyBoZWFkZXIgZmlsZSBjYW4gYmUgdmlld2VkIHdpdGggRG94eWdlbiB0byBwcmV0dHktcHJpbnQgdGhlIHNlcnZpY2UgZGVmaW5pdGlvbnMgaW4gSFRNTC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorWW91IHdpbGwgbm90aWNlIHRoYXQgdGhlIDxpPnF4Lmg8L2k+IGZpbGUgY29udGFpbnMgYSB2ZXJ5IGxlbmd0aHkgc2VydmljZQ0KK25hbWUgIm5ldF94MDAyZXhtZXRob2RzX3gwMDJlc2VydmljZXNfeDAwMmVzdG9ja3F1b3RlX3gwMDJlU3RvY2tRdW90ZUJpbmRpbmciLg0KK1NpbmNlIHRoaXMgaXMgdW5kZXNpcmFibGUgZm9yIG5hbWluZyBmaWxlcywgb3BlcmF0aW9ucywgYW5kIHByb3hpZXMsIHdlDQorbWFudWFsbHkgY2hhbmdlIGl0cyBuYW1lIGludG8gIlN0b2NrUXVvdGUiIGFuZCByZS1ydW4gPGk+c29hcGNwcDI8L2k+Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGlzIGdpdmVzIHVzIGEgY291cGxlIG9mIGZpbGVzIHdlIG5lZWQgdG8gYnVpbGQgdGhlIGFwcGxpY2F0aW9uIGluIEMrKzoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNEMEQwRDAiPjx0cj48dGQ+PHNwYW4gY2xhc3M9InJvbWFuIj4NCitzb2FwU3R1Yi5oIDxiciAvPg0KK3NvYXBILmggPGJyIC8+DQorc29hcEMuY3BwIDxiciAvPg0KK3NvYXBDbGllbnQuY3BwIDxiciAvPg0KK3NvYXBTdG9ja1F1b3RlUHJveHkuaCA8YnIgLz4NCitzb2FwQ3VycmVuY3lFeGNoYW5nZUJpbmRpbmdQcm94eS5oIDxiciAvPg0KK1N0b2NrUXVvdGUubnNtYXANCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9zcGFuPg0KK1RoZSB0d28gLmNwcCBmaWxlcyBhbmQgPGk+c3Rkc29hcDIuY3BwPC9pPiBhcmUgY29tcGlsZWQgYW5kIGxpbmtlZCB3aXRoIHRoZSBtYWluIGFwcGxpY2F0aW9uOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisjaW5jbHVkZSAic29hcFN0b2NrUXVvdGVQcm94eS5oIiA8YnIgLz4NCisjaW5jbHVkZSAic29hcEN1cnJlbmN5RXhjaGFuZ2VCaW5kaW5nUHJveHkuaCIgPGJyIC8+DQorI2luY2x1ZGUgIlN0b2NrUXVvdGUubnNtYXAiIDxiciAvPg0KK21haW4oKSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO1N0b2NrUXVvdGUgc3RvY2s7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO0N1cnJlbmN5RXhjaGFuZ2VCaW5kaW5nIGV4Y2hhbmdlOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtmbG9hdCBxdW90ZSwgcmF0ZTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c3RvY2subnMxX19nZXRRdW90ZSgiSUJNIiwgcXVvdGUpOyAvLyBnZXQgcXVvdGUgZm9yIElCTSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoc3RvY2suc29hcDx0dD4tJmd0OzwvdHQ+ZXJyb3IpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2V4aXQoMSk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO2V4Y2hhbmdlLm5zMl9fZ2V0UmF0ZSgmIzI1MjtzIiwgJiMyNTI7ayIsIHJhdGUpOyAvLyBnZXQgVVMgdG8gVUsgcmF0ZSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoZXhjaGFuZ2Uuc29hcDx0dD4tJmd0OzwvdHQ+ZXJyb3IpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2V4aXQoMSk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO2NvdXQgPHR0PiZsdDsmbHQ7PC90dD4gIklCTSBpbiBVSyBwb3VuZHMgPSAiIDx0dD4mbHQ7Jmx0OzwvdHQ+IHJhdGUqcXVvdGUgPHR0PiZsdDsmbHQ7PC90dD4gZW5kbDsgPGJyIC8+DQorfQ0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhpcyBhcHBsaWNhdGlvbiBwcmludHMgdGhlIHZhbHVlIG9mIHRoZSBJQk0gc3RvY2sgaW4gVUsgcG91bmRzLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitOb3RlIHRoYXQgdGhlIHByZWZpeGVzIDxpPm5zMTwvaT4gYW5kIDxpPm5zMjwvaT4gY2FuIGJlIGNoYW5nZWQgdXNpbmcgdGhlDQorPGk+dHlwZW1hcC5kYXQ8L2k+IGZpbGUgZm9yIDxpPndzZGwyaDwvaT4sIHNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzp0eXBlbWFwIj43LjIuMTE8L2E+Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitBbm90aGVyIGFwcHJvYWNoIHRvIGNvbWJpbmUgbXVsdGlwbGUgY2xpZW50IGFuZCBzZXJ2aWNlIGFwcGxpY2F0aW9ucyBpbnRvIG9uZQ0KK2V4ZWN1dGFibGUgaXMgYnkgdXNpbmcgQysrIG5hbWVzcGFjZXMgdG8gbG9naWNhbGx5IHNlcGFyYXRlIHRoZSBkZWZpbml0aW9ucyBvcg0KK2J5IGNyZWF0aW5nIEMgbGlicmFyaWVzIGZvciB0aGUgY2xpZW50L3NlcnZlciBvYmplY3RzIGFzIGV4cGxhaW5lZCBpbg0KK3N1YnNlcXVlbnQgc2VjdGlvbnMuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkgICAgIDxoMz48YSBuYW1lPSJ0dGhfc0VjMTguMzMiPg0KKzE4LjMzPC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5Ib3cgdG8gQnVpbGQgYSBDbGllbnQgb3IgU2VydmVyIGluIGEgQysrIENvZGUgTmFtZXNwYWNlPC9mb250PjwvaDM+PGEgbmFtZT0ic2VjOmNvZGVuYW1lc3BhY2UiPg0KKzwvYT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorWW91IGNhbiB1c2UgYSBDKysgY29kZSBuYW1lc3BhY2Ugb2YgeW91ciBjaG9pY2UgaW4geW91ciBoZWFkZXIgZmlsZSB0byBidWlsZA0KK2EgY2xpZW50IG9yIHNlcnZlciBpbiB0aGF0IGNvZGUgbmFtZXNwYWNlLiBJbiB0aGlzIHdheSwgeW91IGNhbiBjcmVhdGUgbXVsdGlwbGUNCitjbGllbnRzIGFuZCBzZXJ2ZXJzIHRoYXQgY2FuIGJlIGNvbWJpbmVkIGFuZCBsaW5rZWQgdG9nZXRoZXIgd2l0aG91dCBjb25mbGljdHMsDQord2hpY2ggaXMgZXhwbGFpbmVkIGluIG1vcmUgZGV0YWlsIGluIHRoZSBuZXh0IHNlY3Rpb24gKHdoaWNoIGFsc28gc2hvd3MgYW4NCitleGFtcGxlIGNvbWJpbmluZyB0d28gY2xpZW50IGxpYnJhcmllcyBkZWZpbmVkIGluIHR3byBDKysgY29kZSBuYW1lc3BhY2VzKS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorQXQgbW9zdCBvbmUgbmFtZXNwYWNlIGNhbiBiZSBkZWZpbmVkIGZvciB0aGUgZW50aXJlIGdTT0FQIGhlYWRlciBmaWxlLiBUaGUgY29kZQ0KK25hbWVzcGFjZSBNVVNUIGNvbXBsZXRlbHkgZW5jYXBzdWxhdGUgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgaGVhZGVyIGZpbGU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPm5hbWVzcGFjZTwvYj4mbmJzcDtteU5hbWVzcGFjZU5hbWUgeyA8YnIgLz4NCisuLi4gZ1NPQVAgaGVhZGVyIGZpbGUgY29udGVudHMgLi4uIDxiciAvPg0KK30NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1doZW4gY29tcGlsaW5nIHRoaXMgaGVhZGVyIGZpbGUgd2l0aCB0aGUgZ1NPQVAgY29tcGlsZXIsIGFsbCB0eXBlIGRlZmluaXRpb25zLA0KK3RoZSAoZGUpc2VyaWFsaXplcnMgZm9yIHRoZXNlIHR5cGVzLCBhbmQgdGhlIHN0dWIvc2tlbGV0b24gY29kZXMgd2lsbCBiZSBwbGFjZWQNCitpbiB0aGlzIG5hbWVzcGFjZS4gVGhlIFhNTCBuYW1lc3BhY2UgbWFwcGluZyB0YWJsZSAoc2F2ZWQgaW4gYSA8aT4ubnNtYXA8L2k+DQorZmlsZSkgd2lsbCBub3QgYmUgcGxhY2VkIGluIHRoZSBjb2RlIG5hbWVzcGFjZSB0byBhbGxvdyBpdCB0byBiZSBsaW5rZWQgYXMgYQ0KK2dsb2JhbCBvYmplY3QuIFlvdSBjYW4gdXNlIG9wdGlvbiA8aT4tbjwvaT4gdG8gY3JlYXRlIGxvY2FsIFhNTCBuYW1lc3BhY2UNCit0YWJsZXMsIHNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzpvcHRpb25zIj44LjE8L2E+IChidXQgcmVtZW1iZXIgdGhhdCB5b3UgZXhwbGljaXRseSBuZWVkIHRvDQoraW5pdGlhbGl6ZSB0aGUgPGk+c29hcC5uYW1lc3BhY2VzPC9pPiB0byBwb2ludCB0byBhIHRhYmxlIGF0IHJ1biB0aW1lKS4gVGhlDQorZ2VuZXJhdGVkIGZpbGVzIGFyZSBwcmVmaXhlZCB3aXRoIHRoZSBjb2RlIG5hbWVzcGFjZSBuYW1lIGluc3RlYWQgb2YgdGhlIHVzdWFsDQorPGk+c29hcDwvaT4gZmlsZSBuYW1lIHByZWZpeCB0byBlbmFibGUgbXVsdGlwbGUgY2xpZW50L3NlcnZlciBjb2RlcyB0byBiZSBidWlsZA0KK2luIHRoZSBzYW1lIHByb2plY3QgZGlyZWN0b3J5IChhIGNvZGUgbmFtZXNwYWNlIGF1dG9tYXRpY2FsbHkgc2V0cyB0aGUgPGk+LXA8L2k+DQorY29tcGlsZXIgb3B0aW9uLCBzZWUgU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6b3B0aW9ucyI+OC4xPC9hPiBmb3Igb3B0aW9ucykuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0JlY2F1c2UgdGhlIFNPQVAgSGVhZGVyIGFuZCBGYXVsdCBzZXJpYWxpemF0aW9uIGNvZGVzIHdpbGwgYWxzbyBiZSBwbGFjZWQgaW4NCit0aGUgbmFtZXNwYWNlLCB0aGV5IGNhbm5vdCBiZSBjYWxsZWQgZnJvbSB0aGUgPGk+c3Rkc29hcDIuY3BwPC9pPiBydW4gdGltZQ0KK2xpYnJhcnkgY29kZSBhbmQgYXJlIHRoZXJlZm9yZSByZW5kZXJlZCB1bnVzYWJsZS4gVGhlcmVmb3JlLCB0aGVzZSBzZXJpYWxpemVycw0KK2FyZSBub3QgY29tcGlsZWQgYXQgYWxsIChlbmZvcmNlZCB3aXRoIDxpPiNkZWZpbmUgV0lUSF9OT0dMT0JBTDwvaT4pLiBUbyBhZGQgU09BUA0KK0hlYWRlciBhbmQgRmF1bHQgc2VyaWFsaXplcnMsIHlvdSBNVVNUIGNvbXBpbGUgdGhlbSBzZXBhcmF0ZWx5IGFzIGZvbGxvd3MuDQorRmlyc3QsIGNyZWF0ZSBhIG5ldyBoZWFkZXIgZmlsZSA8aT5lbnYuaDwvaT4gd2l0aCB0aGUgU09BUCBIZWFkZXIgYW5kIEZhdWx0DQorZGVmaW5pdGlvbnMuICBZb3UgY2FuIGxlYXZlIHRoaXMgaGVhZGVyIGZpbGUgZW1wdHkgaWYgeW91IHdhbnQgdG8gdXNlIHRoZQ0KK2RlZmF1bHQgU09BUCBIZWFkZXIgYW5kIEZhdWx0LiBUaGVuIGNvbXBpbGUgdGhpcyBoZWFkZXIgZmlsZSB3aXRoOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKzxpPnNvYXBjcHAyIC1wZW52IGVudi5oPC9pPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQorVGhlIGdlbmVyYXRlZCA8aT5lbnZDLmNwcDwvaT4gZmlsZSBob2xkcyB0aGUgU09BUCBIZWFkZXIgYW5kIEZhdWx0IHNlcmlhbGl6ZXJzIGFuZCB5b3UgY2FuDQorbGluayB0aGlzIGZpbGUgd2l0aCB5b3VyIGNsaWVudCBvciBzZXJ2ZXIgYXBwbGljYXRpb24uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkgICAgIDxoMz48YSBuYW1lPSJ0dGhfc0VjMTguMzQiPg0KKzE4LjM0PC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5Ib3cgdG8gQ3JlYXRlIENsaWVudC9TZXJ2ZXIgTGlicmFyaWVzPC9mb250PjwvaDM+PGEgbmFtZT0ic2VjOmR5bGlicyI+DQorPC9hPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgZ1NPQVAgY29tcGlsZXIgcHJvZHVjZXMgPGk+c29hcENsaWVudExpYi5jcHA8L2k+IGFuZCA8aT5zb2FwU2VydmVyTGliLmNwcDwvaT4NCitjb2RlcyB0aGF0IGFyZSBzcGVjaWZpY2FsbHkgaW50ZW5kZWQgZm9yIGJ1aWxkaW5nIHN0YXRpYyBvciBkeW5hbWljDQorY2xpZW50L3NlcnZlciBsaWJyYXJpZXMuIFRoZXNlIGNvZGVzIGV4cG9ydCB0aGUgc3R1YnMgYW5kIHNrZWxldG9ucywgYnV0IGtlZXANCithbGwgbWFyc2hhbGluZyBjb2RlIChpLmUuJm5ic3A7cGFyYW1ldGVyIHNlcmlhbGl6ZXJzIGFuZCBkZXNlcmlhbGl6ZXJzKSBsb2NhbCAoaS5lLiZuYnNwOw0KK2FzIHN0YXRpYyBmdW5jdGlvbnMpIHRvIGF2b2lkIGxpbmsgc3ltYm9sIGNvbmZsaWN0cyB3aGVuIGNvbWJpbmluZyBtdWx0aXBsZQ0KK2NsaWVudHMgYW5kL29yIHNlcnZlcnMgaW50byBvbmUgZXhlY3V0YWJsZS4gTm90ZSB0aGF0IGl0IGlzIGZhciBzaW1wbGVyIHRvIHVzZQ0KK3RoZSA8aT53c2RsMmg8L2k+IHRvb2wgb24gbXVsdGlwbGUgV1NETCBmaWxlcyB0byBnZW5lcmF0ZSBhIGhlYWRlciBmaWxlIHRoYXQNCitjb21iaW5lcyBhbGwgc2VydmljZSBkZWZpbml0aW9ucy4gSG93ZXZlciwgdGhlIGFwcHJvYWNoIHByZXNlbnRlZCBpbiB0aGlzDQorc2VjdGlvbiBpcyB1c2VmdWwgd2hlbiBjcmVhdGluZyAoZHluYW1pYykgbGlicmFyaWVzIGZvciBjbGllbnQgYW5kIHNlcnZlcg0KK29iamVjdHMsIHN1Y2ggYXMgRExMcyBhcyBkZXNjcmliZWQgaW4gU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6ZGxsIj4xOC4zNTwvYT4uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RvIGJ1aWxkIG11bHRpcGxlIGxpYnJhcmllcyBpbiB0aGUgc2FtZSBwcm9qZWN0IGRpcmVjdG9yeSwgeW91IGNhbiBkZWZpbmUgYSBDKysNCitjb2RlIG5hbWVzcGFjZSBpbiB5b3VyIGhlYWRlciBmaWxlIChzZWUgU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6Y29kZW5hbWVzcGFjZSI+MTguMzM8L2E+KSBvciB5b3UNCitjYW4gdXNlIDxpPnNvYXBjcHAyPC9pPiB3aXRoIG9wdGlvbiA8aT4tcDwvaT4gdG8gcmVuYW1lIHRoZSBnZW5lcmF0ZWQNCis8aT5zb2FwQ2xpZW50TGliLmNwcDwvaT4gYW5kIDxpPnNvYXBTZXJ2ZXJMaWIuY3BwPC9pPiAoYW5kIGFzc29jaWF0ZWQpIGZpbGVzLiBUaGUNCis8aT4tcDwvaT4gb3B0aW9uIHNwZWNpZmllcyB0aGUgZmlsZSBuYW1lIHByZWZpeCB0byByZXBsYWNlIHRoZSA8aT5zb2FwPC9pPg0KK3ByZWZpeC4gIFRoZSBsaWJyYXJpZXMgZG9uJ3QgaGF2ZSB0byBiZSBDKysgY29kZXMuIFlvdSBjYW4gdXNlIG9wdGlvbiA8aT4tYzwvaT4NCit0byBnZW5lcmF0ZSBDIGNvZGUuIEEgY2xlYW4gc2VwYXJhdGlvbiBvZiBsaWJyYXJpZXMgY2FuIGFsc28gYmUgYWNoaWV2ZWQgd2l0aA0KK0MrKyBjb2RlIG5hbWVzcGFjZXMsIHNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzpjb2RlbmFtZXNwYWNlIj4xOC4zMzwvYT4uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBsaWJyYXJ5IGNvZGVzIGRvIG5vdCBkZWZpbmUgU09BUCBIZWFkZXIgYW5kIEZhdWx0IHNlcmlhbGl6ZXJzLiAgWW91IE1VU1QNCithZGQgU09BUCBIZWFkZXIgYW5kIEZhdWx0IHNlcmlhbGl6ZXJzIHRvIHlvdXIgYXBwbGljYXRpb24sIHdoaWNoIGFyZSBjb21waWxlZA0KK3NlcGFyYXRlbHkgYXMgZm9sbG93cy4gIEZpcnN0LCBjcmVhdGUgYSBuZXcgaGVhZGVyIGZpbGUgPGk+ZW52Lmg8L2k+IHdpdGggdGhlDQorU09BUCBIZWFkZXIgYW5kIEZhdWx0IGRlZmluaXRpb25zLiAgWW91IGNhbiBsZWF2ZSB0aGlzIGhlYWRlciBmaWxlIGVtcHR5IGlmIHlvdQ0KK3dhbnQgdG8gdXNlIHRoZSBkZWZhdWx0IFNPQVAgSGVhZGVyIGFuZCBGYXVsdC4gVGhlbiBjb21waWxlIHRoaXMgaGVhZGVyIGZpbGUNCit3aXRoOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKzxpPnNvYXBjcHAyIC1jIC1wZW52IGVudi5oPC9pPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQorVGhlIGdlbmVyYXRlZCA8aT5lbnZDLmNwcDwvaT4gZmlsZSBob2xkcyB0aGUgU09BUCBIZWFkZXIgYW5kIEZhdWx0IHNlcmlhbGl6ZXJzIGFuZCB5b3UgY2FuDQorY3JlYXRlIGEgKGR5bmFtaWMpIGxpYnJhcnkgZm9yIGl0IHRvIGxpbmsgdGhpcyBjb2RlIHdpdGggeW91ciBjbGllbnQgb3Igc2VydmVyIGFwcGxpY2F0aW9uLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitZb3UgTVVTVCBjb21waWxlIHRoZSA8aT5zdGRzb2FwMi5jcHA8L2k+IGxpYnJhcnkgdXNpbmcgPGk+LURXSVRIX05PTkFNRVNQQUNFUzwvaT46DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjRDBEMEQwIj48dHI+PHRkPjxzcGFuIGNsYXNzPSJyb21hbiI+DQorPGk+ZysrIC1EV0lUSF9OT05BTUVTUEFDRVMgLWMgc3Rkc29hcDIuY3BwPC9pPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQorVGhpcyBvbWl0cyB0aGUgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgbmFtZXNwYWNlcyB0YWJsZSwgd2hpY2ggaXMgbm93aGVyZQ0KK3RvIGJlIGRlZmluZWQgc2luY2Ugd2Ugd2lsbCB1c2UgWE1MIG5hbWVzcGFjZXMgZm9yIGVhY2ggY2xpZW50L3NlcnZpY2Ugc2VwYXJhdGVseS4gVGhlcmVmb3JlLCB5b3UgTVVTVCBleHBsaWNpdGx5IHNldCB0aGUNCituYW1lc3BhY2VzIHZhbHVlIG9mIHRoZSBnU09BUCBlbnZpcm9ubWVudCBpbiB5b3VyIGNvZGUgZXZlcnkgdGltZSBhZnRlciBpbml0aWFsaXphdGlvbiBvZiB0aGUgc29hcCBzdHJ1Y3QuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0ZvciBleGFtcGxlLCBzdXBwb3NlIHdlIGhhdmUgdHdvIGNsaWVudHMgZGVmaW5lZCBpbiBoZWFkZXIgZmlsZXMgPGk+Y2xpZW50MS5oPC9pPiBhbmQgPGk+Y2xpZW50Mi5oPC9pPi4gV2UgZmlyc3QgZ2VuZXJhdGUgdGhlIDxpPmVudkguaDwvaT4gZmlsZSBmb3IgdGhlIFNPQVAgSGVhZGVyIGFuZCBGYXVsdCBkZWZpbml0aW9uczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNEMEQwRDAiPjx0cj48dGQ+PHNwYW4gY2xhc3M9InJvbWFuIj4NCis8aT5zb2FwY3BwMiAtYyAtcGVudiBlbnYuaDwvaT4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9zcGFuPg0KK1RoZW4gd2UgZ2VuZXJhdGUgdGhlIGNvZGUgZm9yIGNsaWVudDEgYW5kIGNsaWVudDI6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjRDBEMEQwIj48dHI+PHRkPjxzcGFuIGNsYXNzPSJyb21hbiI+DQorPGk+c29hcGNwcDIgLWMgLW4gLXBteUNsaWVudDEgY2xpZW50MS5oPC9pPiA8YnIgLz4NCis8aT5zb2FwY3BwMiAtYyAtbiAtcG15Q2xpZW50MiBjbGllbnQyLmg8L2k+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvc3Bhbj4NCitUaGlzIGdlbmVyYXRlcyA8aT5teUNsaWVudDFDbGllbnRMaWIuYzwvaT4gYW5kIDxpPm15Q2xpZW50MkNsaWVudExpYi5jPC9pPiAoYW1vbmcgbWFueSBvdGhlciBmaWxlcykuDQorVGhlc2UgdHdvIGZpbGVzIHNob3VsZCBiZSBjb21waWxlZCBhbmQgbGlua2VkIHdpdGggeW91ciBhcHBsaWNhdGlvbi4NCitUaGUgc291cmNlIGNvZGUgb2YgeW91ciBhcHBsaWNhdGlvbiBzaG91bGQgaW5jbHVkZSB0aGUgZ2VuZXJhdGVkIDxpPmVudkguaDwvaT4sIDxpPm15Q2xpZW50MUguaDwvaT4sIDxpPm15Q2xpZW50Mi5oPC9pPiBmaWxlcyBhbmQgPGk+bXlDbGllbnQxLm5zbWFwPC9pPiwgPGk+bXlDbGllbnQyLm5zbWFwPC9pPiBmaWxlczoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorI2luY2x1ZGUgImVudkguaCIgLy8gaW5jbHVkZSB0aGlzIGZpbGUgZmlyc3QhIDxiciAvPg0KKyNpbmNsdWRlICJteUNsaWVudDFILmgiIC8vIGluY2x1ZGUgY2xpZW50IDEgc3R1YnMgPGJyIC8+DQorI2luY2x1ZGUgIm15Q2xpZW50MkguaCIgLy8gaW5jbHVkZSBjbGllbnQgMiBzdHVicyA8YnIgLz4NCisuLi4gPGJyIC8+DQorI2luY2x1ZGUgIm15Q2xpZW50MUgubnNtYXAiIC8vIGluY2x1ZGUgY2xpZW50IDEgbnNtYXAgPGJyIC8+DQorI2luY2x1ZGUgIm15Q2xpZW50MkgubnNtYXAiIC8vIGluY2x1ZGUgY2xpZW50IDIgbnNtYXAgPGJyIC8+DQorLi4uIDxiciAvPg0KK3NvYXBfaW5pdCgmYW1wO3NvYXApOyA8YnIgLz4NCitzb2FwX3NldF9uYW1lc3BhY2VzKCZhbXA7c29hcCwgbXlDbGllbnQxX25hbWVzcGFjZXMpOyA8YnIgLz4NCisuLi4gbWFrZSBDbGllbnQgMSBpbnZvY2F0aW9ucyAuLi4gPGJyIC8+DQorLi4uIDxiciAvPg0KK3NvYXBfc2V0X25hbWVzcGFjZXMoJmFtcDtzb2FwLCBteUNsaWVudDJfbmFtZXNwYWNlcyk7IDxiciAvPg0KKy4uLiBtYWtlIENsaWVudCAyIGludm9jYXRpb25zIC4uLg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorSXQgaXMgaW1wb3J0YW50IHRvIHVzZSA8aT5zb2FwY3BwMjwvaT4gb3B0aW9uIDxpPi1uPC9pPiwgc2VlIFNlY3Rpb24mbmJzcDs8YSBocmVmPSIjc2VjOm9wdGlvbnMiPjguMTwvYT4sIHRvIHJlbmFtZSB0aGUgbmFtZXNwYWNlIHRhYmxlcyBzbyB3ZSBjYW4gaW5jbHVkZSB0aGVtIGFsbCB3aXRob3V0IHJ1bm5pbmcgaW50byByZWRlZmluaXRpb25zLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitOb3RlOiBMaW5rIGNvbmZsaWN0cyBtYXkgc3RpbGwgb2NjdXIgaW4gdGhlIHVubGlrZWx5IHNpdHVhdGlvbiB0aGF0IGlkZW50aWNhbCByZW1vdGUgbWV0aG9kIG5hbWVzIGFyZSBkZWZpbmVkIGluDQordHdvIG9yIG1vcmUgY2xpZW50IHN0dWJzIG9yIHNlcnZlciBza2VsZXRvbnMgd2hlbiB0aGVzZSBtZXRob2RzIHNoYXJlIHRoZSBzYW1lIFhNTCBuYW1lc3BhY2UgcHJlZml4LiAgWW91IG1heSBoYXZlIHRvIHVzZSBDKysgY29kZQ0KK25hbWVzcGFjZXMgdG8gYXZvaWQgdGhlc2UgbGluayBjb25mbGljdHMgb3IgcmVuYW1lIHRoZSBuYW1lc3BhY2UgcHJlZml4ZXMgdXNlZCBieSB0aGUgcmVtb3RlIG1ldGhvZCBkZWZpbmVkIGluIHRoZSBoZWFkZXIgZmlsZXMuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkJICAgICAgPGg0PjxhIG5hbWU9InR0aF9zRWMxOC4zNC4xIj4NCisxOC4zNC4xPC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5DKysgRXhhbXBsZTwvZm9udD48L2g0Pg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitBcyBhbiBleGFtcGxlIHdlIHdpbGwgYnVpbGQgYSBEZWxheWVkIFN0b2NrIFF1b3RlIGNsaWVudCBsaWJyYXJ5IGFuZCBhIEN1cnJlbmN5IEV4Y2hhbmdlIFJhdGUgY2xpZW50IGxpYnJhcnkuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0ZpcnN0LCB3ZSBjcmVhdGUgYW4gZW1wdHkgaGVhZGVyIGZpbGUgPGk+ZW52Lmg8L2k+ICh3aGljaCBtYXkgY29udGFpbiBvcHRpb25hbCBTT0FQIEhlYWRlciBhbmQgRmF1bHQgZGVmaW5pdGlvbnMpLCBhbmQgY29tcGlsZSBpdCBhcyBmb2xsb3dzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKzxpPnNvYXBjcHAyIC1wZW52IGVudi5oPC9pPiA8YnIgLz4NCis8aT5nKysgLWMgZW52Qy5jcHA8L2k+IDxiciAvPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQorV2UgYWxzbyBjb21waWxlIDxpPnN0ZHNvYXAyLmNwcDwvaT4gd2l0aG91dCBuYW1lc3BhY2VzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKzxpPmcrKyAtYyAtRFdJVEhfTk9OQU1FU1BBQ0VTIHN0ZHNvYXAyLmNwcDwvaT4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9zcGFuPg0KK05vdGU6IHdoZW4geW91IGZvcmdldCB0byB1c2UgPGk+LURXSVRIX05PTkFNRVNQQUNFUzwvaT4geW91IHdpbGwgZ2V0IGFuIHVucmVzb2x2ZWQgbGluayBlcnJvciBmb3IgdGhlIGdsb2JhbCA8aT5uYW1lc3BhY2VzPC9pPiB0YWJsZS4gWW91IGNhbiBkZWZpbmUgYSBkdW1teSB0YWJsZSB0byBhdm9pZCBoYXZpbmcgdG8gcmVjb21waWxlIDxpPnN0ZHNvYXAyLmNwcDwvaT4uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1NlY29uZCwgd2UgY3JlYXRlIHRoZSBEZWxheWVkIFN0b2NrIFF1b3RlIGhlYWRlciBmaWxlIHNwZWNpZmljYXRpb24sIHdoaWNoIG1heSBiZSBvYnRhaW5lZCB1c2luZyB0aGUgV1NETCBpbXBvcnRlci4gSWYgeW91IHdhbnQgdG8gdXNlIEMrKyBuYW1lc3BhY2VzIHRoZW4geW91IG5lZWQgdG8gbWFudWFsbHkgYWRkIHRoZSA8aT48Yj5uYW1lc3BhY2U8L2I+PC9pPiBkZWNsYXJhdGlvbiB0byB0aGUgZ2VuZXJhdGVkIGhlYWRlciBmaWxlOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCis8Yj5uYW1lc3BhY2U8L2I+Jm5ic3A7cXVvdGUgeyA8YnIgLz4NCisvL2dzb2FwIG5zIHNlcnZpY2UgbmFtZTogU2VydmljZSA8YnIgLz4NCisvL2dzb2FwIG5zIHNlcnZpY2Ugc3R5bGU6IHJwYyA8YnIgLz4NCisvL2dzb2FwIG5zIHNlcnZpY2UgZW5jb2Rpbmc6IGVuY29kZWQgPGJyIC8+DQorLy9nc29hcCBucyBzZXJ2aWNlIGxvY2F0aW9uOiBodHRwOi8vc2VydmljZXMueG1ldGhvZHMubmV0L3NvYXAgPGJyIC8+DQorLy9nc29hcCBucyBzY2hlbWEgbmFtZXNwYWNlOiB1cm46eG1ldGhvZHMtZGVsYXllZC1xdW90ZXMgPGJyIC8+DQorLy9nc29hcCBucyBzZXJ2aWNlIG1ldGhvZC1hY3Rpb246IGdldFF1b3RlICIiIDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDtuc19fZ2V0UXVvdGUoPGI+Y2hhcjwvYj4mbmJzcDsqc3ltYm9sLCA8Yj5mbG9hdDwvYj4mbmJzcDsmYW1wO1Jlc3VsdCk7IDxiciAvPg0KK30NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1dlIHRoZW4gY29tcGlsZSBpdCBhcyBhIGxpYnJhcnkgYW5kIHdlIHVzZSBvcHRpb24gPGk+LW48L2k+IHRvIHJlbmFtZSB0aGUgbmFtZXNwYWNlIHRhYmxlIHRvIGF2b2lkIGxpbmsgY29uZmxpY3RzIGxhdGVyOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKzxpPnNvYXBjcHAyIC1uIHF1b3RlLmg8L2k+IDxiciAvPg0KKzxpPmcrKyAtYyBxdW90ZUNsaWVudExpYi5jcHA8L2k+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvc3Bhbj4NCitJZiB5b3UgZG9uJ3Qgd2FudCB0byB1c2UgYSBDKysgY29kZSBuYW1lc3BhY2UsIHlvdSBzaG91bGQgY29tcGlsZSA8aT5xdW90ZS5oPC9pPiAiYXMgaXMiIHdpdGggc29hcGNwcDIgb3B0aW9uIDxpPi1wcXVvdGU8L2k+Og0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKzxpPnNvYXBjcHAyIC1uIC1wcXVvdGUgcXVvdGUuaDwvaT4gPGJyIC8+DQorPGk+ZysrIC1jIHF1b3RlQ2xpZW50TGliLmNwcDwvaT4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9zcGFuPg0KK1RoaXJkLCB3ZSBjcmVhdGUgdGhlIEN1cnJlbmN5IEV4Y2hhbmdlIFJhdGUgaGVhZGVyIGZpbGUgc3BlY2lmaWNhdGlvbjoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+bmFtZXNwYWNlPC9iPiZuYnNwO3JhdGUgeyA8YnIgLz4NCisvL2dzb2FwIG5zIHNlcnZpY2UgbmFtZTogU2VydmljZSA8YnIgLz4NCisvL2dzb2FwIG5zIHNlcnZpY2Ugc3R5bGU6IHJwYyA8YnIgLz4NCisvL2dzb2FwIG5zIHNlcnZpY2UgZW5jb2Rpbmc6IGVuY29kZWQgPGJyIC8+DQorLy9nc29hcCBucyBzZXJ2aWNlIGxvY2F0aW9uOiBodHRwOi8vc2VydmljZXMueG1ldGhvZHMubmV0L3NvYXAgPGJyIC8+DQorLy9nc29hcCBucyBzY2hlbWEgbmFtZXNwYWNlOiB1cm46eG1ldGhvZHMtQ3VycmVuY3lFeGNoYW5nZSA8YnIgLz4NCisvL2dzb2FwIG5zIHNlcnZpY2UgbWV0aG9kLWFjdGlvbjogZ2V0UmF0ZSAiIiA8YnIgLz4NCis8Yj5pbnQ8L2I+Jm5ic3A7bnNfX2dldFJhdGUoPGI+Y2hhcjwvYj4mbmJzcDsqY291bnRyeTEsIDxiPmNoYXI8L2I+Jm5ic3A7KmNvdW50cnkyLCA8Yj5mbG9hdDwvYj4mbmJzcDsmYW1wO1Jlc3VsdCk7IDxiciAvPg0KK30NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1NpbWlsYXIgdG8gdGhlIFF1b3RlIGV4YW1wbGUgYWJvdmUsIHdlIGNvbXBpbGUgaXQgYXMgYSBsaWJyYXJ5IGFuZCB3ZSB1c2Ugb3B0aW9uIDxpPi1uPC9pPiB0byByZW5hbWUgdGhlIG5hbWVzcGFjZSB0YWJsZSB0byBhdm9pZCBsaW5rIGNvbmZsaWN0czoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNEMEQwRDAiPjx0cj48dGQ+PHNwYW4gY2xhc3M9InJvbWFuIj4NCis8aT5zb2FwY3BwMiAtbiByYXRlLmg8L2k+IDxiciAvPg0KKzxpPmcrKyAtYyByYXRlU2VydmVyUHJveHkuY3BwPC9pPiA8YnIgLz4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9zcGFuPg0KK0ZvdXJ0aCwgd2UgY29uc2lkZXIgbGlua2luZyB0aGUgbGlicmFyaWVzIHRvIHRoZSBtYWluIHByb2dyYW0uDQorVGhlIG1haW4gcHJvZ3JhbSBjYW4gaW1wb3J0IHRoZSA8aT5xdW90ZVNlcnZpY2VQcm94eS5oPC9pPiBhbmQgPGk+cmF0ZVNlcnZpY2VQcm94eS5oPC9pPiBmaWxlcyB0byBvYnRhaW4gY2xpZW50IHByb3hpZXMgdG8gaW52b2tlIHRoZSBzZXJ2aWNlcy4gVGhlIHByb3h5IGltcGxlbWVudGF0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgPGk+cXVvdGVTZXJ2aWNlUHJveHkuY3BwPC9pPiBhbmQgPGk+cmF0ZVNlcnZpY2VQcm94eS5jcHA8L2k+IGZpbGVzIGNvbXBpbGVkIGFib3ZlLg0KK1RoZSA8aT4tbjwvaT4gb3B0aW9uIGFsc28gYWZmZWN0cyB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgPGk+cXVvdGVTZXJ2aWNlUHJveHkuY3BwPC9pPiBhbmQgPGk+cmF0ZVNlcnZpY2VQcm94eS5jcHA8L2k+IEMrKyBwcm94eSBjb2RlcyB0byBlbnN1cmUgdGhhdCB0aGUgZ1NPQVAgZW52aXJvbm1lbnQgaXMgcHJvcGVybHkgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbmFtZXNwYWNlIHRhYmxlIChzbyB5b3UgZG9uJ3QgaGF2ZSB0byBpbml0aWFsaXplIGV4cGxpY2l0bHkgLSB0aGlzIGZlYXR1cmUgaXMgb25seSBhdmFpbGFibGUgd2l0aCBDKysgcHJveHkgYW5kIHNlcnZlciBvYmplY3QgY2xhc3NlcykuDQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKyNpbmNsdWRlICJxdW90ZVNlcnZpY2VQcm94eS5oIiAvLyBnZXQgcXVvdGUgU2VydmljZSBwcm94eSA8YnIgLz4NCisjaW5jbHVkZSAicmF0ZVNlcnZpY2VQcm94eS5oIiAvLyBnZXQgcmF0ZSBTZXJ2aWNlIHByb3h5IDxiciAvPg0KKyNpbmNsdWRlICJxdW90ZS5uc21hcCIgLy8gZ2V0IHF1b3RlIG5hbWVzcGFjZSBiaW5kaW5ncyA8YnIgLz4NCisjaW5jbHVkZSAicmF0ZS5uc21hcCIgLy8gZ2V0IHJhdGUgbmFtZXNwYWNlIGJpbmRpbmdzIDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDttYWluKDxiPmludDwvYj4mbmJzcDthcmdjLCA8Yj5jaGFyPC9iPiZuYnNwOyphcmd2W10pIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KGFyZ2MgICZsdDsgPSAxKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3N0ZDo6Y2VyciA8dHQ+Jmx0OyZsdDs8L3R0PiAiVXNhZ2U6IG1haW4gdGlja2VyIFtjdXJyZW5jeV0iIDx0dD4mbHQ7Jmx0OzwvdHQ+IHN0ZDo6ZW5kbCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtleGl0KDApOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt9IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3F1b3RlOjpTZXJ2aWNlIHF1b3RlOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5mbG9hdDwvYj4mbmJzcDtxOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsocXVvdGUuZ2V0UXVvdGUoYXJndlsxXSwgcSkpIC8vIGdldCBxdW90ZSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzb2FwX3ByaW50X2ZhdWx0KHF1b3RlLnNvYXAsIHN0ZGVycik7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmVsc2U8L2I+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoYXJnYyAgJmd0OyAgMikgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7eyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtyYXRlOjpTZXJ2aWNlIHJhdGU7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPmZsb2F0PC9iPiZuYnNwO3I7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyhyYXRlLmdldFJhdGUoInVzIiwgYXJndlsyXSwgcikpIC8vIGdldCByYXRlIGluIFVTIGRvbGxhcnMgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9wcmludF9mYXVsdChyYXRlLnNvYXAsIHN0ZGVycik7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPmVsc2U8L2I+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7cSAqPSByOyAvLyBjb252ZXJ0IHRoZSBxdW90ZSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDt9IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3N0ZDo6Y291dCA8dHQ+Jmx0OyZsdDs8L3R0PiBhcmd2WzFdIDx0dD4mbHQ7Jmx0OzwvdHQ+ICI6ICIgPHR0PiZsdDsmbHQ7PC90dD4gcSA8dHQ+Jmx0OyZsdDs8L3R0PiBzdGQ6OmVuZGw7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO30gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cmV0dXJuPC9iPiZuYnNwOzA7IDxiciAvPg0KK30NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK0NvbXBpbGUgYW5kIGxpbmsgdGhpcyBhcHBsaWNhdGlvbiB3aXRoIDxpPnN0ZHNvYXAyLm88L2k+LCA8aT5lbnZDLm88L2k+LCA8aT5xdW90ZVNlcnZlclByb3h5Lm88L2k+LCBhbmQgPGk+cmF0ZVNlcnZlclByb3h5Lm88L2k+Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUbyBjb21waWxlIGFuZCBsaW5rIGEgc2VydmVyIG9iamVjdCBpcyB2ZXJ5IHNpbWlsYXIuIEZvciBleGFtcGxlLCBhc3N1bWUgdGhhdCB3ZSBuZWVkIHRvIGltcGxlbWVudCBhIGNhbGN1bGF0b3Igc2VydmljZSBhbmQgd2Ugd2FudCB0byBjcmVhdGUgYSBsaWJyYXJ5IGZvciBpdC4NCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+bmFtZXNwYWNlPC9iPiZuYnNwO2NhbGMgeyA8YnIgLz4NCisvL2dzb2FwIG5zIHNlcnZpY2UgbmFtZTogU2VydmljZSA8YnIgLz4NCisvL2dzb2FwIG5zIHNlcnZpY2Ugc3R5bGU6IHJwYyA8YnIgLz4NCisvL2dzb2FwIG5zIHNlcnZpY2UgZW5jb2Rpbmc6IGVuY29kZWQgPGJyIC8+DQorLy9nc29hcCBucyBzZXJ2aWNlIGxvY2F0aW9uOiBodHRwOi8vd3d3LmNzLmZzdS5lZHUvJm5ic3A7ZW5nZWxlbi9jYWxjLmNnaSA8YnIgLz4NCisvL2dzb2FwIG5zIHNjaGVtYSBuYW1lc3BhY2U6IHVybjpjYWxjIDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDtuc19fYWRkKDxiPmRvdWJsZTwvYj4mbmJzcDthLCA8Yj5kb3VibGU8L2I+Jm5ic3A7YiwgPGI+ZG91YmxlPC9iPiZuYnNwOyZhbXA7cmVzdWx0KTsgPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO25zX19zdWIoPGI+ZG91YmxlPC9iPiZuYnNwO2EsIDxiPmRvdWJsZTwvYj4mbmJzcDtiLCA8Yj5kb3VibGU8L2I+Jm5ic3A7JmFtcDtyZXN1bHQpOyA8YnIgLz4NCis8Yj5pbnQ8L2I+Jm5ic3A7bnNfX211bCg8Yj5kb3VibGU8L2I+Jm5ic3A7YSwgPGI+ZG91YmxlPC9iPiZuYnNwO2IsIDxiPmRvdWJsZTwvYj4mbmJzcDsmYW1wO3Jlc3VsdCk7IDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDtuc19fZGl2KDxiPmRvdWJsZTwvYj4mbmJzcDthLCA8Yj5kb3VibGU8L2I+Jm5ic3A7YiwgPGI+ZG91YmxlPC9iPiZuYnNwOyZhbXA7cmVzdWx0KTsgPGJyIC8+DQorfQ0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorV2UgY29tcGlsZSB0aGlzIHdpdGg6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjRDBEMEQwIj48dHI+PHRkPjxzcGFuIGNsYXNzPSJyb21hbiI+DQorPGk+c29hcGNwcDIgLW4gY2FsYy5oPC9pPiA8YnIgLz4NCis8aT5nKysgLWMgY2FsY1NlcnZpY2VPYmplY3QuY3BwPC9pPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQorVGhlIGVmZmVjdCBvZiB0aGUgPGk+LW48L2k+IG9wdGlvbiBpcyB0aGF0IGl0IGNyZWF0ZXMgbG9jYWwgbmFtZXNwYWNlIHRhYmxlcywgYW5kIGEgbW9kaWZpZWQgPGk+Y2FsY1NlcnZpY2VPYmplY3QuaDwvaT4gc2VydmVyIGNsYXNzIGRlZmluaXRpb25zIHRoYXQgcHJvcGVybHkgaW5pdGlhbGl6ZSB0aGUgZ1NPQVAgcnVuIHRpbWUgd2l0aCB0aGUgdGFibGUuDQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKyNpbmNsdWRlICJjYWxjU2VydmljZU9iamVjdC5oIiAvLyBnZXQgU2VydmljZSBvYmplY3QgPGJyIC8+DQorI2luY2x1ZGUgImNhbGMubnNtYXAiIC8vIGdldCBjYWxjIG5hbWVzcGFjZSBiaW5kaW5ncyA8YnIgLz4NCisuLi4gPGJyIC8+DQorY2FsYzo6U2VydmljZSBjYWxjOyA8YnIgLz4NCitjYWxjLnNlcnZlKCk7IC8vIGNhbGxzIHJlcXVlc3QgZGlzcGF0Y2hlciB0byBpbnZva2Ugb25lIG9mIHRoZSBmdW5jdGlvbnMgYmVsb3cgPGJyIC8+DQorLi4uIDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDtjYWxjOjpTZXJ2aWNlOjphZGQoPGI+ZG91YmxlPC9iPiZuYnNwO2EsIDxiPmRvdWJsZTwvYj4mbmJzcDtiLCA8Yj5kb3VibGU8L2I+Jm5ic3A7JmFtcDtyZXN1bHQpOyA8YnIgLz4NCit7IHJlc3VsdCA9IGEgKyBiOyA8Yj5yZXR1cm48L2I+U09BUF9PSzsgfSA8YnIgLz4NCis8Yj5pbnQ8L2I+Jm5ic3A7Y2FsYzo6U2VydmljZTo6c3ViKDxiPmRvdWJsZTwvYj4mbmJzcDthLCA8Yj5kb3VibGU8L2I+Jm5ic3A7YiwgPGI+ZG91YmxlPC9iPiZuYnNwOyZhbXA7cmVzdWx0KTsgPGJyIC8+DQoreyByZXN1bHQgPSBhIC0gYjsgPGI+cmV0dXJuPC9iPlNPQVBfT0s7IH0gPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO2NhbGM6OlNlcnZpY2U6Om11bCg8Yj5kb3VibGU8L2I+Jm5ic3A7YSwgPGI+ZG91YmxlPC9iPiZuYnNwO2IsIDxiPmRvdWJsZTwvYj4mbmJzcDsmYW1wO3Jlc3VsdCk7IDxiciAvPg0KK3sgcmVzdWx0ID0gYSAqIGI7IDxiPnJldHVybjwvYj5TT0FQX09LOyB9IDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDtjYWxjOjpTZXJ2aWNlOjpkaXYoPGI+ZG91YmxlPC9iPiZuYnNwO2EsIDxiPmRvdWJsZTwvYj4mbmJzcDtiLCA8Yj5kb3VibGU8L2I+Jm5ic3A7JmFtcDtyZXN1bHQpOyA8YnIgLz4NCit7IHJlc3VsdCA9IGEgLyBiOyA8Yj5yZXR1cm48L2I+U09BUF9PSzsgfSA8YnIgLz4NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK0luIGZhY3QsIHRoZSA8aT5jYWxjOjpTZXJ2aWNlPC9pPiBjbGFzcyBpcyBkZXJpdmVkIGZyb20gdGhlIDxpPjxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwPC9pPi4gU28gdGhlIGVudmlyb25tZW50DQoraXMgYXZhaWxhYmxlIGFzIDxpPnRoaXM8L2k+LCB3aGljaCBjYW4gYmUgcGFzc2VkIHRvIGFsbCBnU09BUCBmdW5jdGlvbnMgdGhhdCByZXF1aXJlIGEgc29hcCBzdHJ1Y3QNCitjb250ZXh0Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJCSAgICAgIDxoND48YSBuYW1lPSJ0dGhfc0VjMTguMzQuMiI+DQorMTguMzQuMjwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+QyBFeGFtcGxlPC9mb250PjwvaDQ+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoaXMgaXMgdGhlIHNhbWUgZXhhbXBsZSBhcyBhYm92ZSwgYnV0IHRoZSBjbGllbnRzIGFyZSBidWlsZCB3aXRoIHB1cmUgQy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorRmlyc3QsIHdlIGNyZWF0ZSBhbiBlbXB0eSBoZWFkZXIgZmlsZSAod2hpY2ggbWF5IGNvbnRhaW4gb3B0aW9uYWwgU09BUCBIZWFkZXIgYW5kIEZhdWx0IGRlZmluaXRpb25zKSwgYW5kIGNvbXBpbGUgaXQgYXMgZm9sbG93czoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNEMEQwRDAiPjx0cj48dGQ+PHNwYW4gY2xhc3M9InJvbWFuIj4NCis8aT5zb2FwY3BwMiAtYyAtcGVudiBlbnYuaDwvaT4gPGJyIC8+DQorPGk+Z2NjIC1jIGVudkMuYzwvaT4gPGJyIC8+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvc3Bhbj4NCitXZSBhbHNvIGNvbXBpbGUgPGk+c3Rkc29hcDIuYzwvaT4gd2l0aG91dCBuYW1lc3BhY2VzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKzxpPmdjYyAtYyAtRFdJVEhfTk9OQU1FU1BBQ0VTIHN0ZHNvYXAyLmM8L2k+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvc3Bhbj4NCitTZWNvbmQsIHdlIGNyZWF0ZSB0aGUgRGVsYXllZCBTdG9jayBRdW90ZSBoZWFkZXIgZmlsZSBzcGVjaWZpY2F0aW9uLCB3aGljaCBtYXkgYmUgb2J0YWluZWQgdXNpbmcgdGhlIFdTREwgaW1wb3J0ZXIuDQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vZ3NvYXAgbnMgc2VydmljZSBuYW1lOiBTZXJ2aWNlIDxiciAvPg0KKy8vZ3NvYXAgbnMgc2VydmljZSBzdHlsZTogcnBjIDxiciAvPg0KKy8vZ3NvYXAgbnMgc2VydmljZSBlbmNvZGluZzogZW5jb2RlZCA8YnIgLz4NCisvL2dzb2FwIG5zIHNlcnZpY2UgbG9jYXRpb246IGh0dHA6Ly9zZXJ2aWNlcy54bWV0aG9kcy5uZXQvc29hcCA8YnIgLz4NCisvL2dzb2FwIG5zIHNjaGVtYSBuYW1lc3BhY2U6IHVybjp4bWV0aG9kcy1kZWxheWVkLXF1b3RlcyA8YnIgLz4NCisvL2dzb2FwIG5zIHNlcnZpY2UgbWV0aG9kLWFjdGlvbjogZ2V0UXVvdGUgIiIgPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO25zX19nZXRRdW90ZSg8Yj5jaGFyPC9iPiZuYnNwOypzeW1ib2wsIDxiPmZsb2F0PC9iPiZuYnNwOypSZXN1bHQpOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorV2UgY29tcGlsZSBpdCBhcyBhIGxpYnJhcnkgYW5kIHdlIHVzZSBvcHRpb25zIDxpPi1uPC9pPiBhbmQgPGk+LXA8L2k+IHRvIHJlbmFtZSB0aGUgbmFtZXNwYWNlIHRhYmxlIHRvIGF2b2lkIGxpbmsgY29uZmxpY3RzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKzxpPnNvYXBjcHAyIC1jIC1uIC1wcXVvdGUgcXVvdGUuaDwvaT4gPGJyIC8+DQorPGk+Z2NjIC1jIHF1b3RlQ2xpZW50TGliLmM8L2k+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvc3Bhbj4NCitUaGlyZCwgd2UgY3JlYXRlIHRoZSBDdXJyZW5jeSBFeGNoYW5nZSBSYXRlIGhlYWRlciBmaWxlIHNwZWNpZmljYXRpb246DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKy8vZ3NvYXAgbnMgc2VydmljZSBuYW1lOiBTZXJ2aWNlIDxiciAvPg0KKy8vZ3NvYXAgbnMgc2VydmljZSBzdHlsZTogcnBjIDxiciAvPg0KKy8vZ3NvYXAgbnMgc2VydmljZSBlbmNvZGluZzogZW5jb2RlZCA8YnIgLz4NCisvL2dzb2FwIG5zIHNlcnZpY2UgbG9jYXRpb246IGh0dHA6Ly9zZXJ2aWNlcy54bWV0aG9kcy5uZXQvc29hcCA8YnIgLz4NCisvL2dzb2FwIG5zIHNjaGVtYSBuYW1lc3BhY2U6IHVybjp4bWV0aG9kcy1DdXJyZW5jeUV4Y2hhbmdlIDxiciAvPg0KKy8vZ3NvYXAgbnMgc2VydmljZSBtZXRob2QtYWN0aW9uOiBnZXRSYXRlICIiIDxiciAvPg0KKzxiPmludDwvYj4mbmJzcDtuc19fZ2V0UmF0ZSg8Yj5jaGFyPC9iPiZuYnNwOypjb3VudHJ5MSwgPGI+Y2hhcjwvYj4mbmJzcDsqY291bnRyeTIsIDxiPmZsb2F0PC9iPiZuYnNwOypSZXN1bHQpOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorV2UgY29tcGlsZSBpdCBhcyBhIGxpYnJhcnkgYW5kIHdlIHVzZSBvcHRpb25zIDxpPi1uPC9pPiBhbmQgPGk+LXA8L2k+IHRvIHJlbmFtZSB0aGUgbmFtZXNwYWNlIHRhYmxlIHRvIGF2b2lkIGxpbmsgY29uZmxpY3RzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKzxpPnNvYXBjcHAyIC1jIC1uIC1wcmF0ZSByYXRlLmg8L2k+IDxiciAvPg0KKzxpPmdjYyAtYyByYXRlQ2xpZW50TGliLmM8L2k+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvc3Bhbj4NCitUaGUgbWFpbiBwcm9ncmFtIGlzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisjaW5jbHVkZSAicXVvdGVTdHViLmgiIC8vIGdldCBxdW90ZSBTZXJ2aWNlIHN0dWIgPGJyIC8+DQorI2luY2x1ZGUgInJhdGVTdHViLmgiIC8vIGdldCByYXRlIFNlcnZpY2Ugc3R1YiA8YnIgLz4NCisjaW5jbHVkZSAicXVvdGUubnNtYXAiIC8vIGdldCBxdW90ZSBuYW1lc3BhY2UgYmluZGluZ3MgPGJyIC8+DQorI2luY2x1ZGUgInJhdGUubnNtYXAiIC8vIGdldCByYXRlIG5hbWVzcGFjZSBiaW5kaW5ncyA8YnIgLz4NCis8Yj5pbnQ8L2I+Jm5ic3A7bWFpbig8Yj5pbnQ8L2I+Jm5ic3A7YXJnYywgPGI+Y2hhcjwvYj4mbmJzcDsqYXJndltdKSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyhhcmdjICAmbHQ7ID0gMSkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBtYWluIHRpY2tlciBbY3VycmVuY3ldXG4iKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZXhpdCgwKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCBzb2FwOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5mbG9hdDwvYj4mbmJzcDtxOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX2luaXQoJmFtcDtzb2FwKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9zZXRfbmFtZXNwYWNlcygmYW1wO3NvYXAsIHF1b3RlX25hbWVzcGFjZXMpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoc29hcF9jYWxsX25zX19nZXRRdW90ZSgmYW1wO3NvYXAsICJodHRwOi8vc2VydmljZXMueG1ldGhvZHMubmV0L3NvYXAiLCAiIiwgYXJndlsxXSwgJmFtcDtxKSkgLy8gZ2V0IHF1b3RlIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfcHJpbnRfZmF1bHQoJmFtcDtzb2FwLCBzdGRlcnIpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5lbHNlPC9iPjxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KGFyZ2MgICZndDsgIDIpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9zZXRfbmFtZXNwYWNlcygmYW1wO3NvYXAsIHJhdGVfbmFtZXNwYWNlcyk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPmZsb2F0PC9iPiZuYnNwO3I7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyhzb2FwX2NhbGxfbnNfX2dldFJhdGUoJmFtcDtzb2FwLCAiaHR0cDovL3NlcnZpY2VzLnhtZXRob2RzLm5ldC9zb2FwIiwgIiIsICJ1cyIsIGFyZ3ZbMl0sICZhbXA7cikpIC8vIGdldCByYXRlIGluIFVTIGRvbGxhcnMgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9wcmludF9mYXVsdCgmYW1wO3NvYXAsIHN0ZGVycik7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPmVsc2U8L2I+PGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7cSAqPSByOyAvLyBjb252ZXJ0IHRoZSBxdW90ZSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDt9IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3ByaW50ZigiJXM6ICVmIFxuIiwgYXJndlsxXSwgcSk7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO30gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cmV0dXJuPC9iPiZuYnNwOzA7IDxiciAvPg0KK30NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK0NvbXBpbGUgYW5kIGxpbmsgdGhpcyBhcHBsaWNhdGlvbiB3aXRoIDxpPnN0ZHNvYXAyLm88L2k+LCA8aT5lbnZDLm88L2k+LCA8aT5xdW90ZUNsaWVudExpYi5vPC9pPiwgYW5kIDxpPnJhdGVDbGllbnRMaWIubzwvaT4uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RvIGNvbXBpbGUgYW5kIGxpbmsgYSBzZXJ2ZXIgbGlicmFyeSBpcyB2ZXJ5IHNpbWlsYXIuIEFzc3VtaW5nIHRoYXQgdGhlIHNlcnZlciBpcyBuYW1lZCAiPGk+Y2FsYzwvaT4iIChhcyBzcGVjaWZpZWQgd2l0aCBvcHRpb25zIDxpPi1uPC9pPiBhbmQgPGk+LXA8L2k+KSwgdGhlIGFwcGxpY2F0aW9uIG5lZWRzIHRvIGluY2x1ZGUgdGhlIDxpPmNhbGNTdHViLmg8L2k+IGZpbGUsIGxpbmsgdGhlIDxpPmNhbGNTZXJ2ZXJMaWIubzwvaT4gZmlsZSwgYW5kIGNhbGwgPGk+Y2FsY19zZXJ2ZSgmYW1wO3NvYXApPC9pPiBmdW5jdGlvbiBhdCBydW4gdGltZS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCSAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWMxOC4zNSI+DQorMTguMzU8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPkhvdyB0byBDcmVhdGUgRExMczwvZm9udD48L2gzPjxhIG5hbWU9InNlYzpkbGwiPg0KKzwvYT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCQkgICAgICA8aDQ+PGEgbmFtZT0idHRoX3NFYzE4LjM1LjEiPg0KKzE4LjM1LjE8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPkNyZWF0ZSB0aGUgQmFzZSBzdGRzb2FwMi5kbGw8L2ZvbnQ+PC9oND4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorRmlyc3QsIGNyZWF0ZSBhIG5ldyBoZWFkZXIgZmlsZSA8aT5lbnYuaDwvaT4gd2l0aCB0aGUgU09BUCBIZWFkZXIgYW5kIEZhdWx0DQorZGVmaW5pdGlvbnMuICBZb3UgY2FuIGxlYXZlIHRoaXMgaGVhZGVyIGZpbGUgZW1wdHkgaWYgeW91IHdhbnQgdG8gdXNlIHRoZQ0KK2RlZmF1bHQgU09BUCBIZWFkZXIgYW5kIEZhdWx0LiBUaGVuIGNvbXBpbGUgdGhpcyBoZWFkZXIgZmlsZSB3aXRoOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0QwRDBEMCI+PHRyPjx0ZD48c3BhbiBjbGFzcz0icm9tYW4iPg0KKzxpPnNvYXBjcHAyIC1wZW52IGVudi5oPC9pPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQorVGhlIGdlbmVyYXRlZCA8aT5lbnZDLmNwcDwvaT4gZmlsZSBob2xkcyB0aGUgU09BUCBIZWFkZXIgYW5kIEZhdWx0IHNlcmlhbGl6ZXJzLCB3aGljaCBuZWVkIHRvIGJlIHBhcnQgb2YgdGhlIGJhc2UgbGlicmFyeSBmdW5jdGlvbnMuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RoZSBuZXh0IHN0ZXAgaXMgdG8gY3JlYXRlIDxpPnN0ZHNvYXAyLmRsbDwvaT4gd2hpY2ggY29uc2lzdHMgb2YgdGhlIGZpbGUNCis8aT5zdGRzb2FwMi5jcHA8L2k+IGFuZCA8aT5lbnZDLmNwcDwvaT4uIFRoaXMgRExMIGNvbnRhaW5zIGFsbCBjb21tb24gZnVuY3Rpb25zDQorbmVlZGVkIGZvciBhbGwgb3RoZXIgY2xpZW50cyBhbmQgc2VydmVycyBiYXNlZCBvbiBnU09BUC4gIENvbXBpbGUNCis8aT5lbnZDLmNwcDwvaT4gYW5kIDxpPnN0ZHNvYXAyLmNwcDwvaT4gaW50byA8aT5zdGRzb2FwMi5kbGw8L2k+IHVzaW5nIHRoZSBDKysNCitjb21waWxlciBvcHRpb24gPGk+LURXSVRIX05PTkFNRVNQQUNFUzwvaT4gYW5kIHRoZSBNU1ZDIFByZS1Qcm9jZXNzb3INCitkZWZpbml0aW9ucyA8aT5TT0FQX0ZNQUMxPV9fZGVjbHNwZWMoZGxsZXhwb3J0KTwvaT4gYW5kIDxpPlNPQVBfRk1BQzM9X19kZWNsc3BlYyhkbGxleHBvcnQpPC9pPiAob3IgeW91DQorY2FuIGNvbXBpbGUgd2l0aA0KKzxpPi1EV0lUSF9TT0FQREVGU19IPC9pPiBhbmQgcHV0IHRoZSBtYWNybyBkZWZpbml0aW9ucyBpbiA8aT5zb2FwZGVmcy5oPC9pPikuDQorVGhpcyBleHBvcnRzIGFsbCBmdW5jdGlvbnMgd2hpY2ggYXJlIHByZWNlZGVkIGJ5IHRoZSBtYWNybyA8aT5TT0FQX0ZNQUMxPC9pPiBpbg0KK3RoZSA8aT5zb2FwY3BwMi5jcHA8L2k+IHNvdXJjZSBmaWxlIGFuZCBtYWNybyA8aT5TT0FQX0ZNQUMzPC9pPiBpbiB0aGUgPGk+ZW52Qy5jcHA8L2k+IHNvdXJjZSBmaWxlLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJCSAgICAgIDxoND48YSBuYW1lPSJ0dGhfc0VjMTguMzUuMiI+DQorMTguMzUuMjwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+Q3JlYXRpbmcgQ2xpZW50IGFuZCBTZXJ2ZXIgRExMczwvZm9udD48L2g0Pg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitDb21waWxlIHRoZSA8aT5zb2FwQ2xpZW50TGliLmNwcDwvaT4gYW5kIDxpPnNvYXBTZXJ2ZXJMaWIuY3BwPC9pPiBzb3VyY2VzIGFzIERMTHMNCitieSB1c2luZyB0aGUgTVNWQyBQcmUtUHJvY2Vzc29yIGRlZmluaXRpb25zIDxpPlNPQVBfRk1BQzU9X19kZWNsc3BlYyhkbGxleHBvcnQpPC9pPiBhbmQgPGk+U09BUF9DTUFDPV9fKGRsbGV4cG9ydCk8L2k+LCBhbmQgYnkgdXNpbmcgdGhlIEMrKyBjb21waWxlciBvcHRpb24gPGk+LURXSVRIX05PTkFNRVNQQUNFUzwvaT4uDQorVGhpcyBETEwgbGlua3MgdG8gPGk+c3Rkc29hcDIuZGxsPC9pPi4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVG8gY3JlYXRlIG11bHRpcGxlIERMTHMgaW4gdGhlIHNhbWUgcHJvamVjdCBkaXJlY3RvcnksIHlvdSBTSE9VTEQgdXNlIG9wdGlvbg0KKzxpPi1wPC9pPiB0byByZW5hbWUgdGhlIGdlbmVyYXRlZCA8aT5zb2FwQ2xpZW50TGliLmNwcDwvaT4gYW5kDQorPGk+c29hcFNlcnZlckxpYi5jcHA8L2k+IChhbmQgYXNzb2NpYXRlZCkgZmlsZXMuIFRoZSA8aT4tcDwvaT4gb3B0aW9uIHNwZWNpZmllcw0KK3RoZSBmaWxlIG5hbWUgcHJlZml4IHRvIHJlcGxhY2UgdGhlIDxpPnNvYXA8L2k+IHByZWZpeC4NCitBIGNsZWFuIHNlcGFyYXRpb24gb2YgbGlicmFyaWVzIGNhbiBhbHNvIGJlIGFjaGlldmVkIHdpdGggQysrIG5hbWVzcGFjZXMsIHNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzpjb2RlbmFtZXNwYWNlIj4xOC4zMzwvYT4uDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1VubGVzcyB5b3UgdXNlIHRoZSBjbGllbnQgcHJveHkgYW5kIHNlcnZlciBvYmplY3QgY2xhc3NlcyAoPGk+c29hcFhQcm94eS5oPC9pPiBhbmQgPGk+c29hcFhPYmplY3QuaDwvaT4gd2hlcmUgPGk+WDwvaT4gaXMgdGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UpLCBhbGwgY2xpZW50IGFuZCBzZXJ2ZXIgYXBwbGljYXRpb25zIE1VU1QgZXhwbGljaXRseSBzZXQgdGhlIG5hbWVzcGFjZXMgdmFsdWUgb2YgdGhlIGdTT0FQIGVudmlyb25tZW50Og0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCitzb2FwX2luaXQoJmFtcDtzb2FwKTsgPGJyIC8+DQorc29hcF9zZXRfbmFtZXNwYWNlcygmYW1wO3NvYXAsIG5hbWVzcGFjZXMpOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQord2hlcmUgdGhlIDxpPm5hbWVzcGFjZXNbXTwvaT4gdGFibGUgc2hvdWxkIGJlIGRlZmluZWQgaW4gdGhlIGNsaWVudC9zZXJ2ZXIgc291cmNlLiBUaGVzZSB0YWJsZXMgYXJlIGdlbmVyYXRlZCBpbiB0aGUgPGk+Lm5zbWFwPC9pPiBmaWxlcy4gWW91IGNhbiByZW5hbWUgdGhlIHRhYmxlcyB1c2luZyBvcHRpb24gPGk+LW48L2k+LCBzZWUgU2VjdGlvbiZuYnNwOzxhIGhyZWY9IiNzZWM6b3B0aW9ucyI+OC4xPC9hPi4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCSAgICAgPGgzPjxhIG5hbWU9InR0aF9zRWMxOC4zNiI+DQorMTguMzY8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPmdTT0FQIFBsdWctaW5zPC9mb250PjwvaDM+PGEgbmFtZT0ic2VjOnBsdWdpbnMiPg0KKzwvYT4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIGdTT0FQIHBsdWctaW4gZmVhdHVyZSBlbmFibGVzIGEgY29udmVuaWVudCBleHRlbnNpb24gbWVjaGFuaXNtIG9mIGdTT0FQDQorY2FwYWJpbGl0aWVzLiBXaGVuIHRoZSBwbHVnLWluIHJlZ2lzdGVycyB3aXRoIGdTT0FQLCBpdCBoYXMgZnVsbCBhY2Nlc3MNCit0byB0aGUgcnVuLXRpbWUgc2V0dGluZ3MgYW5kIHRoZSBnU09BUCBmdW5jdGlvbiBjYWxsYmFja3MuDQorVXBvbiByZWdpc3RyeSwgdGhlIHBsdWctaW4ncyBsb2NhbCBkYXRhIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ1NPQVAgcnVuLXRpbWUuDQorQnkgb3ZlcnJpZGluZyBnU09BUCdzIGZ1bmN0aW9uIGNhbGxiYWNrcyB3aXRoIHRoZSBwbHVnLWluJ3MgZnVuY3Rpb24gY2FsbGJhY2tzLA0KK3RoZSBwbHVnLWluIGNhbiBleHRlbmQgZ1NPQVAncyBjYXBhYmlsaXRpZXMuIFRoZSBsb2NhbCBwbHVnLWluIGRhdGEgY2FuIGJlDQorYWNjZXNzZWQgdGhyb3VnaCBhIGxvb2t1cCBmdW5jdGlvbiwgdXN1YWxseSBpbnZva2VkIHdpdGhpbiBhIGNhbGxiYWNrIGZ1bmN0aW9uDQordG8gYWNjZXNzIHRoZSBwbHVnLWluIGRhdGEuIA0KK1RoZSByZWdpc3RyeSBhbmQgbG9va3VwIGZ1bmN0aW9ucyBhcmU6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjRDBEMEQwIj48dHI+PHRkPjxzcGFuIGNsYXNzPSJyb21hbiI+DQorPGk+PGI+aW50PC9iPiZuYnNwO3NvYXBfcmVnaXN0ZXJfcGx1Z2luX2FyZyg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgPGI+aW50PC9iPiZuYnNwOygqZmNyZWF0ZSkoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwX3BsdWdpbiAqcCwgPGI+dm9pZDwvYj4mbmJzcDsqYXJnKSwgPGI+dm9pZDwvYj4mbmJzcDsqYXJnKTwvaT4gPGJyIC8+DQorPGk+PGI+dm9pZDwvYj4qIHNvYXBfbG9va3VwX3BsdWdpbig8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCosIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Kik7PC9pPg0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L3NwYW4+DQorT3RoZXIgZnVuY3Rpb25zIHRoYXQgZGVhbCB3aXRoIHBsdWctaW5zIGFyZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNEMEQwRDAiPjx0cj48dGQ+PHNwYW4gY2xhc3M9InJvbWFuIj4NCis8aT48Yj5pbnQ8L2I+Jm5ic3A7c29hcF9jb3B5KDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwKTs8L2k+IDxiciAvPg0KKzxpPjxiPnZvaWQ8L2I+Jm5ic3A7c29hcF9kb25lKDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwKTs8L2k+DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvc3Bhbj4NCitUaGUgPGk+c29hcF9jb3B5PC9pPiBmdW5jdGlvbiByZXR1cm5zIGEgbmV3IGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBnU09BUA0KK2Vudmlyb25tZW50IHRoYXQgaXMgYSBjb3B5IG9mIGFub3RoZXIsIHN1Y2ggdGhhdCBubyBkYXRhIGlzIHNoYXJlZCBiZXR3ZWVuIHRoZQ0KK2NvcHkgYW5kIHRoZSBvcmlnaW5hbCBlbnZpcm9ubWVudC4gVGhlIDxpPnNvYXBfY29weTwvaT4gZnVuY3Rpb24gaW52b2tlcyB0aGUNCitwbHVnLWluIGNvcHkgY2FsbGJhY2tzIHRvIGNvcHkgdGhlIHBsdWctaW5zJyBsb2NhbCBkYXRhLg0KK1RoZSA8aT5zb2FwX2NvcHk8L2k+IGZ1bmN0aW9uIHJldHVybnMgYSBnU09BUCBlcnJvciBjb2RlIG9yIDxpPlNPQVBfT0s8L2k+Lg0KK1RoZSA8aT5zb2FwX2RvbmU8L2k+IGZ1bmN0aW9uIGRlLXJlZ2lzdGVycyBhbGwgcGx1Z2luLWlucywgc28gdGhpcyBmdW5jdGlvbg0KK3Nob3VsZCBiZSBjYWxsZWQgdG8gY2xlYW5seSB0ZXJtaW5hdGUgYSBnU09BUCBydW4tdGltZSBlbnZpcm9ubWVudC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorQW4gZXhhbXBsZSB3aWxsIGJlIHVzZWQgdG8gaWxsdXN0cmF0ZSB0aGVzZSBmdW5jdGlvbnMuDQorVGhpcyBleGFtcGxlIG92ZXJyaWRlcyB0aGUgc2VuZCBhbmQgcmVjZWl2ZSBjYWxsYmFja3MgdG8gY29weSBhbGwgbWVzc2FnZXMNCit0aGF0IGFyZSBzZW50IGFuZCByZWNlaXZlZCB0byB0aGUgdGVybWluYWwgKHN0ZGVycikuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0ZpcnN0LCB3ZSB3cml0ZSBhIGhlYWRlciBmaWxlIDxpPnBsdWdpbi5oPC9pPiB0byBkZWZpbmUgdGhlIGxvY2FsIHBsdWctaW4gZGF0YQ0KK3N0cnVjdHVyZShzKSBhbmQgd2UgZGVmaW5lIGEgZ2xvYmFsIG5hbWUgdG8gaWRlbnRpZnkgdGhlIHBsdWctaW46DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKyNpbmNsdWRlICJzdGRzb2FwMi5oIiA8YnIgLz4NCisjZGVmaW5lIFBMVUdJTl9JRCAiUExVR0lOLTEuMCIgLy8gc29tZSBuYW1lIHRvIGlkZW50aWZ5IHBsdWdpbiA8YnIgLz4NCis8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7cGx1Z2luX2RhdGEgLy8gbG9jYWwgcGx1Z2luIGRhdGEgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7KCpmc2VuZCkoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAqLCA8Yj5jb25zdDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiosIHNpemVfdCk7IC8vIHRvIHNhdmUgYW5kIHVzZSBzZW5kIGNhbGxiYWNrIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NpemVfdCAoKmZyZWN2KSg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCosIDxiPmNoYXI8L2I+Kiwgc2l6ZV90KTsgLy8gdG8gc2F2ZSBhbmQgdXNlIHJlY3YgY2FsbGJhY2sgPGJyIC8+DQorfTsgPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO3BsdWdpbig8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgPGI+c3RydWN0PC9iPiZuYnNwO3NvYXBfcGx1Z2luICpwbHVnaW4sIDxiPnZvaWQ8L2I+Jm5ic3A7KmFyZyk7DQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitUaGVuLCB3ZSB3cml0ZSB0aGUgcGx1Z2luIHJlZ2lzdHJ5IGZ1bmN0aW9uIGFuZCB0aGUgY2FsbGJhY2tzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisjaW5jbHVkZSAicGx1Z2luLmgiIDxiciAvPg0KKzxiPnN0YXRpYzwvYj4mbmJzcDs8Yj5jb25zdDwvYj4mbmJzcDs8Yj5jaGFyPC9iPiZuYnNwO3BsdWdpbl9pZFtdID0gUExVR0lOX0lEOyAvLyB0aGUgcGx1Z2luIGlkIDxiciAvPg0KKzxiPnN0YXRpYzwvYj4mbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7cGx1Z2luX2luaXQoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIDxiPnN0cnVjdDwvYj4mbmJzcDtwbHVnaW5fZGF0YSAqZGF0YSk7IDxiciAvPg0KKzxiPnN0YXRpYzwvYj4mbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7cGx1Z2luX2NvcHkoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwX3BsdWdpbiAqZHN0LCA8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcF9wbHVnaW4gKnNyYyk7IDxiciAvPg0KKzxiPnN0YXRpYzwvYj4mbmJzcDs8Yj52b2lkPC9iPiZuYnNwO3BsdWdpbl9kZWxldGUoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwX3BsdWdpbiAqcCk7IDxiciAvPg0KKzxiPnN0YXRpYzwvYj4mbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7cGx1Z2luX3NlbmQoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KmJ1Ziwgc2l6ZV90IGxlbik7IDxiciAvPg0KKzxiPnN0YXRpYzwvYj4mbmJzcDtzaXplX3QgcGx1Z2luX3JlY3YoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIDxiPmNoYXI8L2I+Jm5ic3A7KmJ1Ziwgc2l6ZV90IGxlbik7IDxiciAvPg0KKy8vIHRoZSByZWdpc3RyeSBmdW5jdGlvbjogPGJyIC8+DQorPGI+aW50PC9iPiZuYnNwO3BsdWdpbig8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgPGI+c3RydWN0PC9iPiZuYnNwO3NvYXBfcGx1Z2luICpwLCA8Yj52b2lkPC9iPiZuYnNwOyphcmcpIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7cDx0dD4tJmd0OzwvdHQ+aWQgPSBwbHVnaW5faWQ7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3A8dHQ+LSZndDs8L3R0PmRhdGEgPSAoPGI+dm9pZDwvYj4qKW1hbGxvYyg8Yj5zaXplb2Y8L2I+KDxiPnN0cnVjdDwvYj4mbmJzcDtwbHVnaW5fZGF0YSkpOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtwPHR0Pi0mZ3Q7PC90dD5mY29weSA9IHBsdWdpbl9jb3B5OyAvKiBvcHRpb25hbDogd2hlbiBzZXQgdGhlIHBsdWdpbiBtdXN0IGNvcHkgaXRzIGxvY2FsIGRhdGEgKi88YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtwPHR0Pi0mZ3Q7PC90dD5mZGVsZXRlID0gcGx1Z2luX2RlbGV0ZTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KHA8dHQ+LSZndDs8L3R0PmRhdGEpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyhwbHVnaW5faW5pdChzb2FwLCAoPGI+c3RydWN0PC9iPiZuYnNwO3BsdWdpbl9kYXRhKilwPHR0Pi0mZ3Q7PC90dD5kYXRhKSkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7eyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtmcmVlKHA8dHQ+LSZndDs8L3R0PmRhdGEpOyAvLyBlcnJvcjogY291bGQgbm90IGluaXQgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cmV0dXJuPC9iPiZuYnNwO1NPQVBfRU9NOyAvLyByZXR1cm4gZXJyb3IgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7U09BUF9PSzsgPGJyIC8+DQorfSA8YnIgLz4NCis8Yj5zdGF0aWM8L2I+Jm5ic3A7PGI+aW50PC9iPiZuYnNwO3BsdWdpbl9pbml0KDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7cGx1Z2luX2RhdGEgKmRhdGEpIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7ZGF0YTx0dD4tJmd0OzwvdHQ+ZnNlbmQgPSBzb2FwPHR0Pi0mZ3Q7PC90dD5mc2VuZDsgLy8gc2F2ZSBvbGQgcmVjdiBjYWxsYmFjayA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtkYXRhPHR0Pi0mZ3Q7PC90dD5mcmVjdiA9IHNvYXA8dHQ+LSZndDs8L3R0PmZyZWN2OyAvLyBzYXZlIG9sZCBzZW5kIGNhbGxiYWNrIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXA8dHQ+LSZndDs8L3R0PmZzZW5kID0gcGx1Z2luX3NlbmQ7IC8vIHJlcGxhY2Ugc2VuZCBjYWxsYmFjayB3aXRoIG5ldyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwPHR0Pi0mZ3Q7PC90dD5mcmVjdiA9IHBsdWdpbl9yZWN2OyAvLyByZXBsYWNlIHJlY3YgY2FsbGJhY2sgd2l0aCBuZXcgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7cmV0dXJuIFNPQVBfT0s7IDxiciAvPg0KK30gPGJyIC8+DQorLy8gY29weSBwbHVnaW4gZGF0YSwgY2FsbGVkIGJ5IHNvYXBfY29weSgpDQorLy8gVGhpcyBpcyBpbXBvcnRhbnQ6IHdlIG5lZWQgYSBkZWVwIGNvcHkgdG8gYXZvaWQgZGF0YSBzaGFyaW5nIGJ5IHR3byBydW4tdGltZSBlbnZpcm9ubWVudHMgPGJyIC8+DQorPGI+c3RhdGljPC9iPiZuYnNwOzxiPmludDwvYj4mbmJzcDtwbHVnaW5fY29weSg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGx1Z2luICpkc3QsIDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwX3BsdWdpbiAqc3JjKSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyghKGRzdDx0dD4tJmd0OzwvdHQ+ZGF0YSA9ICg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7cGx1Z2luX2RhdGEqKW1hbGxvYyg8Yj5zaXplb2Y8L2I+KDxiPnN0cnVjdDwvYj4mbmJzcDtwbHVnaW5fZGF0YSkpKSkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cmV0dXJuPC9iPiZuYnNwO1NPQVBfRU9NOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsqZHN0PHR0Pi0mZ3Q7PC90dD5kYXRhID0gKnNyYzx0dD4tJmd0OzwvdHQ+ZGF0YTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cmV0dXJuPC9iPiZuYnNwO1NPQVBfT0s7IDxiciAvPg0KK30gPGJyIC8+DQorLy8gcGx1Z2luIGRlbGV0aW9uLCBjYWxsZWQgYnkgc29hcF9kb25lKCkgPGJyIC8+DQorPGI+c3RhdGljPC9iPiZuYnNwOzxiPnZvaWQ8L2I+Jm5ic3A7cGx1Z2luX2RlbGV0ZSg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgPGI+c3RydWN0PC9iPiZuYnNwO3NvYXBfcGx1Z2luICpwKSA8YnIgLz4NCit7IGZyZWUocDx0dD4tJmd0OzwvdHQ+ZGF0YSk7IC8vIGZyZWUgYWxsb2NhdGVkIHBsdWdpbiBkYXRhIDxiciAvPg0KK30gPGJyIC8+DQorLy8gdGhlIG5ldyBzZW5kIGNhbGxiYWNrIDxiciAvPg0KKzxiPnN0YXRpYzwvYj4mbmJzcDs8Yj5pbnQ8L2I+Jm5ic3A7cGx1Z2luX3NlbmQoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgKnNvYXAsIDxiPmNvbnN0PC9iPiZuYnNwOzxiPmNoYXI8L2I+Jm5ic3A7KmJ1Ziwgc2l6ZV90IGxlbikgPGJyIC8+DQoreyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDs8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7cGx1Z2luX2RhdGEgKmRhdGEgPSAoPGI+c3RydWN0PC9iPiZuYnNwO3BsdWdpbl9kYXRhKilzb2FwX2xvb2t1cF9wbHVnaW4oc29hcCwgcGx1Z2luX2lkKTsgLy8gZmV0Y2ggcGx1Z2luJ3MgbG9jYWwgZGF0YSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtmd3JpdGUoYnVmLCBsZW4sIDEsIHN0ZGVycik7IC8vIHdyaXRlIG1lc3NhZ2UgdG8gc3RkZXJyIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDtkYXRhPHR0Pi0mZ3Q7PC90dD5mc2VuZChzb2FwLCBidWYsIGxlbik7IC8vIHBhc3MgZGF0YSBvbiB0byBvbGQgc2VuZCBjYWxsYmFjayA8YnIgLz4NCit9IDxiciAvPg0KKy8vIHRoZSBuZXcgcmVjZWl2ZSBjYWxsYmFjayA8YnIgLz4NCis8Yj5zdGF0aWM8L2I+Jm5ic3A7c2l6ZV90IHBsdWdpbl9yZWN2KDxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwICpzb2FwLCA8Yj5jaGFyPC9iPiZuYnNwOypidWYsIHNpemVfdCBsZW4pIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+c3RydWN0PC9iPiZuYnNwO3BsdWdpbl9kYXRhICpkYXRhID0gKDxiPnN0cnVjdDwvYj4mbmJzcDtwbHVnaW5fZGF0YSopc29hcF9sb29rdXBfcGx1Z2luKHNvYXAsIHBsdWdpbl9pZCk7IC8vIGZldGNoIHBsdWdpbidzIGxvY2FsIGRhdGEgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c2l6ZV90IHJlcyA9IGRhdGE8dHQ+LSZndDs8L3R0PmZyZWN2KHNvYXAsIGJ1ZiwgbGVuKTsgLy8gZ2V0IGRhdGEgZnJvbSBvbGQgcmVjdiBjYWxsYmFjayA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtmd3JpdGUoYnVmLCByZXMsIDEsIHN0ZGVycik7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDtyZXM7IDxiciAvPg0KK30NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK1RoZSA8aT5mZGVsZXRlPC9pPiBjYWxsYmFjayBvZiA8aT48Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcF9wbHVnaW48L2k+DQorTVVTVCBiZSBzZXQgdG8gcmVnaXN0ZXIgdGhlIHBsdWdpbi4gSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBwbHVnLWluIHRvDQoraGFuZGxlIHJlZ2lzdHJ5IChpbml0KSwgY29weSwgYW5kIGRlbGV0aW9uIG9mIHRoZSBwbHVnLWluIGRhdGEgYW5kIGNhbGxiYWNrcy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorQSBwbHVnaW4gaXMgY29waWVkIHdpdGggdGhlIDxpPnNvYXBfY29weSgpPC9pPiBjYWxsLiBUaGlzIGZ1bmN0aW9uIGNvcGllcyBhIHNvYXAgc3RydWN0DQorYW5kIHRoZSBjaGFpbiBvZiBwbHVnaW5zLiBJdCBpcyB1cCB0byB0aGUgcGx1Z2luIGltcGxlbWVudGF0aW9uIHRvIHNoYXJlIHRoZSBwbHVnaW4gZGF0YQ0KK29yIG5vdDogDQorDQorPG9sIHR5cGU9IjEiPg0KKzxsaT4gaWYgdGhlIDxpPmZjb3B5KCk8L2k+IGNhbGxiYWNrIGlzIHNldCBieSB0aGUgcGx1Z2luIGluaXRpYWxpemF0aW9uLCB0aGlzIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHRvIGFsbG93DQordGhlIHBsdWdpbiB0byBjb3B5IGl0cyBsb2NhbCBkYXRhIHVwb24gYSA8aT5zb2FwX2NvcHkoKTwvaT4gY2FsbC4gV2hlbiA8aT5zb2FwX2RvbmUoKTwvaT4gaXMgY2FsbGVkIG9uDQordGhlIHNvYXAgc3RydWN0IGNvcHksIHRoZSA8aT5mZGVsZXRlKCk8L2k+IGNhbGxiYWNrIGlzIGNhbGxlZCBmb3IgZGVhbGxvY2F0aW9uIGFuZCBjbGVhbnVwIG9mIHRoZSBsb2NhbCBkYXRhLg0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8L2xpPg0KKw0KKzxsaT4NCitpZiB0aGUgPGk+ZmNvcHkoKTwvaT4gY2FsbGJhY2sgaXMgbm90IHNldCwgdGhlbiB0aGUgcGx1Z2luIGRhdGENCit3aWxsIGJlIHNoYXJlZCAoaS5lLiB0aGUgZGF0YSBwb2ludGVyIHBvaW50cyB0byB0aGUgc2FtZSBhZGRyZXNzKS4NCitUaGUgPGk+ZmRlbGV0ZSgpPC9pPiBjYWxsYmFjayB3aWxsIG5vdCBiZSBjYWxsZWQgdXBvbiBhIDxpPnNvYXBfZG9uZSgpPC9pPiBvbiBhDQorY29weSBvZiB0aGUgc29hcCBzdHJ1Y3QuIFRoZSA8aT5mZGVsZXRlKCk8L2k+IGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIGZvcg0KK3RoZSBvcmlnaW5hbCBzb2FwIHN0cnVjdCB3aXRoIHdoaWNoIHRoZSBwbHVnaW4gd2FzIHJlZ2lzdGVyZWQuDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKzwvbGk+DQorPC9vbD4NCitUaGUgZXhhbXBsZSBwbHVnLWluIHNob3VsZCBiZSB1c2VkIGFzIGZvbGxvd3M6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtzb2FwIHNvYXA7IDxiciAvPg0KK3NvYXBfaW5pdCgmYW1wO3NvYXApOyA8YnIgLz4NCitzb2FwX3JlZ2lzdGVyX3BsdWdpbigmYW1wO3NvYXAsIHBsdWdpbik7IDxiciAvPg0KKy4uLiA8YnIgLz4NCitzb2FwX2RvbmUoJmFtcDtzb2FwKTsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK05vdGU6IDxpPnNvYXBfcmVnaXN0ZXJfcGx1Z2luKC4uLik8L2k+IGlzIGFuIGFsaWFzIGZvcg0KKzxpPnNvYXBfcmVnaXN0ZXJfcGx1Z2luX2FyZyguLi4sIE5VTEwpPC9pPi4gVGhhdCBpcywgaXQgcGFzc2VzIE5VTEwgYXMgYW4NCithcmd1bWVudCB0byBwbHVnLWluJ3MgcmVnaXN0cnkgY2FsbGJhY2suDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0EgbnVtYmVyIG9mIGV4YW1wbGUgcGx1Zy1pbnMgYXJlIGluY2x1ZGVkIGluIHRoZSBnU09BUCBwYWNrYWdlJ3MgPGk+cGx1Z2luPC9pPiBkaXJlY3RvcnkuIFNvbWUgb2YgdGhlc2UgcGx1Zy1pbnMgYXJlIGRpc2N1c3NlZC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorCQkgICAgICA8aDQ+PGEgbmFtZT0idHRoX3NFYzE4LjM2LjEiPg0KKzE4LjM2LjE8L2E+Jm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwRkYiPlRoZSBNZXNzYWdlIExvZ2dpbmcgYW5kIFN0YXRpc3RpY3MgUGx1Zy1pbjwvZm9udD48L2g0Pg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgbWVzc2FnZSBsb2dnaW5nIGFuZCBhY2Nlc3Mgc3RhdGlzdGljcyBwbHVnLWluIGNhbiBiZSB1c2VkIHRvIHNlbGVjdGl2ZWx5IGxvZyBpbmJvdW5kIGFuZCBvdXRib3VuZCBtZXNzYWdlcyB0byBhIGZpbGUgb3Igc3RyZWFtLiBJdCBhbHNvIGtlZXBzIGFjY2VzcyBzdGF0aXN0aWNzIHRvIGxvZyB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHNlbnQgYW5kIHJlY2VpdmVkLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUbyB1c2UgdGhlIHBsdWctaW4sIGNvbXBpbGUgYW5kIGxpbmsgeW91ciBhcHBsaWNhdGlvbiB3aXRoIDxpPmxvZ2dpbmcuYzwvaT4gbG9jYXRlZCBpbiB0aGUgPGk+cGx1Z2luPC9pPiBkaXJlY3Rvcnkgb2YgdGhlIHBhY2thZ2UuDQorVG8gZW5hYmxlIHRoZSBwbHVnLWluIGluIHlvdXIgY29kZSwgcmVnaXN0ZXIgdGhlIHBsdWctaW4gYW5kIHNldCB0aGUgc3RyZWFtcyBhcyBmb2xsb3dzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisjaW5jbHVkZSAibG9nZ2luZy5oIiA8YnIgLz4NCisuLi4gPGJyIC8+DQorPGI+aWY8L2I+Jm5ic3A7KHNvYXBfcmVnaXN0ZXJfcGx1Z2luKCZhbXA7c29hcCwgbG9nZ2luZykpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfcHJpbnRfZmF1bHQoJmFtcDtzb2FwLCBzdGRlcnIpOyAvLyBmYWlsZWQgdG8gcmVnaXN0ZXIgPGJyIC8+DQorLi4uIDxiciAvPg0KKzxiPnN0cnVjdDwvYj4mbmJzcDtsb2dnaW5nX2RhdGEgKmxvZ2RhdGE7IDxiciAvPg0KK2xvZ2RhdGEgPSAoPGI+c3RydWN0PC9iPiZuYnNwO2xvZ2dpbmdfZGF0YSopc29hcF9sb29rdXBfcGx1Z2luKCZhbXA7c29hcCwgbG9nZ2luZ19pZCk7IDxiciAvPg0KKzxiPmlmPC9iPiZuYnNwOyghbG9nZGF0YSkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Li4uIC8vIGlmIHRoZSBwbHVnLWluIHJlZ2lzdGVyZWQgT0ssIHRoZXJlIGlzIGNlcnRhaW5seSBkYXRhIGJ1dCBjYW4ndCBodXJ0IHRvIGNoZWNrIDxiciAvPg0KK2xvZ2RhdGE8dHQ+LSZndDs8L3R0PmluYm91bmQgPSBzdGRvdXQ7IC8vIGxvZyB0byBzdGRvdXQgPGJyIC8+DQorbG9nZGF0YTx0dD4tJmd0OzwvdHQ+b3V0Ym91bmQgPSBzdGRvdXQ7IC8vIGxvZyB0byBzdGRvdXQgPGJyIC8+DQorLi4uIHByb2Nlc3MgbWVzc2FnZXMgLi4uIDxiciAvPg0KK2xvZ2RhdGE8dHQ+LSZndDs8L3R0PmluYm91bmQgPSBOVUxMOyAvLyBkb24ndCBsb2cgPGJyIC8+DQorbG9nZGF0YTx0dD4tJmd0OzwvdHQ+b3V0Ym91bmQgPSBOVUxMOyAvLyBkb24ndCBsb2cgPGJyIC8+DQorLi4uIHByb2Nlc3MgbWVzc2FnZXMgLi4uIDxiciAvPg0KK3NpemVfdCBieXRlc19pbiA9IGxvZ2RhdGE8dHQ+LSZndDs8L3R0PnN0YXRfcmVjdjsgPGJyIC8+DQorc2l6ZV90IGJ5dGVzX291dCA9IGxvZ2RhdGE8dHQ+LSZndDs8L3R0PnN0YXRfc2VudDsNCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KK0lmIHlvdSB1c2UgPGk+c29hcF9jb3B5PC9pPiB0byBjb3B5IHRoZSBzb2FwIHN0cnVjdCB3aXRoIHRoZSBwbHVnLWluLCB0aGUgcGx1Zy1pbidzIGRhdGEgd2lsbCBiZSBzaGFyZWQgYnkgdGhlIGNvcHkuDQorVGhlcmVmb3JlLCB0aGUgc3RhdGlzdGljcyBhcmUgbm90IDEwMCUgZ3VhcmFudGVlZCB0byBiZSBhY2N1cmF0ZSBmb3IgbXVsdGktdGhyZWFkZWQgc2VydmljZXMgc2luY2UgcmFjZSBjb25kaXRpb25zIG9uIHRoZSBjb3VudGVycyBtYXkgb2NjdXIuIE11dGV4IGlzIG5vdCB1c2VkIHRvIHVwZGF0ZSB0aGUgY291bnRlcnMgdG8gYXZvaWQgaW50cm9kdWNpbmcgZXhwZW5zaXZlIHN5bmNocm9uaXphdGlvbiBwb2ludHMuIElmIDEwMCUgc2VydmVyLXNpZGUgYWNjdXJhY3kgaXMgcmVxdWlyZWQsIGFkZCBtdXRleCBhdCB0aGUgcG9pbnRzIGluZGljYXRlZCBpbiB0aGUgPGk+bG9nZ2luZy5jPC9pPiBjb2RlLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJCSAgICAgIDxoND48YSBuYW1lPSJ0dGhfc0VjMTguMzYuMiI+DQorMTguMzYuMjwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+VGhlIEhUVFAgR0VUIFBsdWctaW48L2ZvbnQ+PC9oND4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIEhUVFAgR0VUIHBsdWctaW4gYWxsb3dzIHlvdXIgc2VydmVyIHRvIGhhbmRsZSBIVFRQIEdFVCByZXF1ZXN0cyBhcyB3ZWxsIGFzIFNPQVAtYmFzZWQgUE9TVCByZXF1ZXN0Lg0KK0hUVFAgR0VUIHJlcXVlc3RzIGNhbiBhbHNvIGJlIGhhbmRsZWQgd2l0aCB0aGUgPGk+ZmdldDwvaT4gY2FsbGJhY2ssIHNlZSBTZWN0aW9uJm5ic3A7PGEgaHJlZj0iI3NlYzpjYWxsYmFjayI+MTguNzwvYT4uIEhvd2V2ZXIsIHRoZSBIVFRQIEdFVCBwbHVnLWluIGFsc28ga2VlcHMgc3RhdGlzdGljcyBvbiB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgUE9TVCBhbmQgR0VUIGV4Y2hhbmdlcyBhbmQgZmFpbGVkIG9wZXJhdGlvbnMgKEhUVFAgZmF1bHRzLCBTT0FQIEZhdWx0cywgZXRjLikuIEl0IGFsc28ga2VlcHMgaGl0IGhpc3RvZ3JhbXMgYWNjdW11bGF0ZWQgZm9yIHVwIHRvIGEgeWVhci4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVG8gdXNlIHRoZSBwbHVnLWluLCBjb21waWxlIGFuZCBsaW5rIHlvdXIgYXBwbGljYXRpb24gd2l0aCA8aT5odHRwZ2V0LmM8L2k+IGxvY2F0ZWQgaW4gdGhlIDxpPnBsdWdpbjwvaT4gZGlyZWN0b3J5IG9mIHRoZSBwYWNrYWdlLg0KK1RvIGVuYWJsZSB0aGUgcGx1Zy1pbiBpbiB5b3VyIGNvZGUsIHJlZ2lzdGVyIHRoZSBwbHVnLWluIHdpdGggeW91ciBIVFRQIEdFVCBoYW5kbGVyIGZ1bmN0aW9uIGFzIGZvbGxvd3M6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKyNpbmNsdWRlICJodHRwZ2V0LmgiIDxiciAvPg0KKy4uLiA8YnIgLz4NCis8Yj5pZjwvYj4mbmJzcDsoc29hcF9yZWdpc3Rlcl9wbHVnaW5fYXJnKCZhbXA7c29hcCwgaHR0cGdldCwgKDxiPnZvaWQ8L2I+KilteV9odHRwX2dldF9oYW5kbGVyKSkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9wcmludF9mYXVsdCgmYW1wO3NvYXAsIHN0ZGVycik7IC8vIGZhaWxlZCB0byByZWdpc3RlciA8YnIgLz4NCisuLi4gPGJyIC8+DQorPGI+c3RydWN0PC9iPiZuYnNwO2h0dHBfZ2V0X2RhdGEgKmh0dHBnZXRkYXRhOyA8YnIgLz4NCitodHRwZ2V0ZGF0YSA9ICg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7aHR0cF9nZXRfZGF0YSopc29hcF9sb29rdXBfcGx1Z2luKCZhbXA7c29hcCwgaHR0cF9nZXRfaWQpOyA8YnIgLz4NCis8Yj5pZjwvYj4mbmJzcDsoIWh0dHBnZXRkYXRhKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsuLi4gLy8gaWYgdGhlIHBsdWctaW4gcmVnaXN0ZXJlZCBPSywgdGhlcmUgaXMgY2VydGFpbmx5IGRhdGEgYnV0IGNhbid0IGh1cnQgdG8gY2hlY2sgPGJyIC8+DQorLi4uIHByb2Nlc3MgbWVzc2FnZXMgLi4uIDxiciAvPg0KK3NpemVfdCBnZXRfb2sgPSBodHRwZ2V0ZGF0YTx0dD4tJmd0OzwvdHQ+c3RhdF9nZXQ7IDxiciAvPg0KK3NpemVfdCBwb3N0X29rID0gaHR0cGdldGRhdGE8dHQ+LSZndDs8L3R0PnN0YXRfcG9zdDsgPGJyIC8+DQorc2l6ZV90IGVycm9ycyA9IGh0dHBnZXRkYXRhPHR0Pi0mZ3Q7PC90dD5zdGF0X2ZhaWw7IDxiciAvPg0KKy4uLiA8YnIgLz4NCit0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsgPGJyIC8+DQorPGI+c3RydWN0PC9iPiZuYnNwO3RtICpUOyA8YnIgLz4NCitUID0gbG9jYWx0aW1lKCZhbXA7bm93KTsgPGJyIC8+DQorc2l6ZV90IGhpdHN0aGlzbWludXRlID0gaHR0cGdldGRhdGE8dHQ+LSZndDs8L3R0Pm1pbltUPHR0Pi0mZ3Q7PC90dD50bV9taW5dOyA8YnIgLz4NCitzaXplX3QgaGl0c3RoaXNob3VyID0gaHR0cGdldGRhdGE8dHQ+LSZndDs8L3R0PmhvdXJbVDx0dD4tJmd0OzwvdHQ+dG1faG91cl07IDxiciAvPg0KK3NpemVfdCBoaXRzdG9kYXkgPSBodHRwZ2V0ZGF0YTx0dD4tJmd0OzwvdHQ+ZGF5W1Q8dHQ+LSZndDs8L3R0PnRtX3lkYXldOw0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorQW4gSFRUUCBHRVQgaGFuZGxlciBjYW4gc2ltcGx5IHByb2R1Y2UgSFRNTCBjb250ZW50LCBvciBhbnkgb3RoZXIgdHlwZSBvZiBpbmZvcm1hdGlvbjoNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorPGI+aW50PC9iPiZuYnNwO215X2h0dHBfZ2V0X2hhbmRsZXIoPGI+c3RydWN0PC9iPiZuYnNwO3NvYXApIDxiciAvPg0KK3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcDx0dD4tJmd0OzwvdHQ+aHR0cF9jb250ZW50ID0gInRleHQvaHRtbCI7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfcmVzcG9uc2Uoc29hcCwgU09BUF9GSUxFKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9zZW5kKHNvYXAsICYjMTcxO2h0bWwmIzYyO0hlbGxvJmx0Oy9odG1sJiM2MjsiKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9lbmRfc2VuZChzb2FwKTsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7PGI+cmV0dXJuPC9iPiZuYnNwO1NPQVBfT0s7IC8vIHJldHVybiBTT0FQX09LIG9yIEhUVFAgZXJyb3IgY29kZSwgZS5nLiA0MDQgPGJyIC8+DQorfQ0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorSWYgeW91IHVzZSA8aT5zb2FwX2NvcHk8L2k+IHRvIGNvcHkgdGhlIHNvYXAgc3RydWN0IHdpdGggdGhlIHBsdWctaW4sIHRoZSBwbHVnLWluJ3MgZGF0YSB3aWxsIGJlIHNoYXJlZCBieSB0aGUgY29weS4NCitUaGVyZWZvcmUsIHRoZSBzdGF0aXN0aWNzIGFyZSBub3QgMTAwJSBndWFyYW50ZWVkIHRvIGJlIGFjY3VyYXRlIGZvciBtdWx0aS10aHJlYWRlZCBzZXJ2aWNlcyBzaW5jZSByYWNlIGNvbmRpdGlvbnMgb24gdGhlIGNvdW50ZXJzIG1heSBvY2N1ci4gTXV0ZXggaXMgbm90IHVzZWQgdG8gdXBkYXRlIHRoZSBjb3VudGVycyB0byBhdm9pZCBpbnRyb2R1Y2luZyBleHBlbnNpdmUgc3luY2hyb25pemF0aW9uIHBvaW50cy4gSWYgMTAwJSBzZXJ2ZXItc2lkZSBhY2N1cmFjeSBpcyByZXF1aXJlZCwgYWRkIG11dGV4IGF0IHRoZSBwb2ludHMgaW5kaWNhdGVkIGluIHRoZSA8aT5odHRwZ2V0LmM8L2k+IGNvZGUuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKwkJICAgICAgPGg0PjxhIG5hbWU9InR0aF9zRWMxOC4zNi4zIj4NCisxOC4zNi4zPC9hPiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSIjMDAwMEZGIj5UaGUgSFRUUCBNRDUgUGx1Zy1pbjwvZm9udD48L2g0Pg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgSFRUUCBNRDUgcGx1Zy1pbiB3b3JrcyBpbiB0aGUgYmFja2dyb3VuZCB0byBhdXRvbWF0aWNhbGx5IHZlcmlmeSB0aGUNCitjb250ZW50IG9mIG1lc3NhZ2VzIHVzaW5nIE1ENSBjaGVja3N1bXMuIFdpdGggdGhlIHBsdWctaW4sIG1lc3NhZ2VzIGNhbiBiZQ0KK3RyYW5zZmVycmVkIG92ZXIgKHRydXN0ZWQgYnV0KSB1bnJlbGlhYmxlIGNvbm5lY3Rpb25zLiBUaGUgcGx1Zy1pbiBjYW4gYmUgdXNlZA0KK29uIHRoZSBjbGllbnQgc2lkZSBhbmQgc2VydmVyIHNpZGUuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK1RvIHVzZSB0aGUgcGx1Zy1pbiwgY29tcGlsZSBhbmQgbGluayB5b3VyIGFwcGxpY2F0aW9uIHdpdGggPGk+aHR0cG1kNS5jPC9pPiBhbmQgPGk+bWQ1ZXZwLmM8L2k+IGxvY2F0ZWQgaW4gdGhlIDxpPnBsdWdpbjwvaT4gZGlyZWN0b3J5IG9mIHRoZSBwYWNrYWdlLiBUaGUgPGk+bWQ1ZXZwLmM8L2k+IGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIEVWUCBpbnRlcmZhY2UgdG8gY29tcHV0ZSBNRDUgY2hlY2tzdW1zIHdpdGggT3BlblNTTCAoY29tcGlsZWQgd2l0aCA8aT4tRFdJVEhfT1BFTlNTTDwvaT4pLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUbyBlbmFibGUgdGhlIHBsdWctaW4gaW4geW91ciBjb2RlLCByZWdpc3RlciB0aGUgcGx1Zy1pbiBhcyBmb2xsb3dzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisjaW5jbHVkZSAiaHR0cG1kNS5oIiA8YnIgLz4NCisuLi4gPGJyIC8+DQorPGI+aWY8L2I+Jm5ic3A7KHNvYXBfcmVnaXN0ZXJfcGx1Z2luKCZhbXA7c29hcCwgaHR0cF9tZDUpKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX3ByaW50X2ZhdWx0KCZhbXA7c29hcCwgc3RkZXJyKTsgLy8gZmFpbGVkIHRvIHJlZ2lzdGVyDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitPbmNlIHJlZ2lzdGVyZWQsIE1ENSBjaGVja3N1bXMgYXJlIHByb2R1Y2VkIGZvciBhbGwgb3V0Ym91bmQgbWVzc2FnZXMuIEluYm91bmQgbWVzc2FnZXMgd2l0aCBNRDUgY2hlY2tzdW1zIGluIHRoZSBIVFRQIGhlYWRlciBhcmUgYXV0b21hdGljYWxseSB2ZXJpZmllZC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIHBsdWctaW4gcmVxdWlyZXMgeW91IHRvIHNldCB0aGUgPGk+U09BUF9JT19TVE9SRTwvaT4gZmxhZyB3aGVuIHNlbmRpbmcgU09BUCB3aXRoIGF0dGFjaG1lbnRzOg0KKzxicj48YnI+PHRhYmxlIGJvcmRlcj0wIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0IwRDBCMCI+PHRyPjx0ZD48aT4NCisjaW5jbHVkZSAiaHR0cG1kNS5oIiA8YnIgLz4NCisuLi4gPGJyIC8+DQorPGI+c3RydWN0PC9iPiZuYnNwO3NvYXAgc29hcDsgPGJyIC8+DQorc29hcF9pbml0MSgmYW1wO3NvYXAsIFNPQVBfSU9fU1RPUkUpOyA8YnIgLz4NCis8Yj5pZjwvYj4mbmJzcDsoc29hcF9yZWdpc3Rlcl9wbHVnaW4oJmFtcDtzb2FwLCBodHRwX21kNSkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9wcmludF9mYXVsdCgmYW1wO3NvYXAsIHN0ZGVycik7IC8vIGZhaWxlZCB0byByZWdpc3RlciA8YnIgLz4NCisuLi4gbm93IHNhZmUgdG8gc2VuZCBTT0FQIHdpdGggYXR0YWNobWVudHMgLi4uDQorPC90ZD48L3RyPjwvdGFibGU+PGJyPjwvaT4NCitVbmZvcnR1bmF0ZWx5LCB0aGlzIGVsaW1pbmF0ZXMgc3RyZWFtaW5nLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisJCSAgICAgIDxoND48YSBuYW1lPSJ0dGhfc0VjMTguMzYuNCI+DQorMTguMzYuNDwvYT4mbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0iIzAwMDBGRiI+VGhlIEhUVFAgRGlnZXN0IEF1dGhlbnRpY2F0aW9uIFBsdWctaW48L2ZvbnQ+PC9oND4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIEhUVFAgZGlnZXN0IGF1dGhlbnRpY2F0aW9uIHBsdWctaW4gZW5hYmxlcyBhIG1vcmUgc2VjdXJlIGF1dGhlbnRpY2F0aW9uDQorc2NoZW1lIGNvbXBhcmVkIHRvIGJhc2ljIGF1dGhlbnRpY2F0aW9uLiBIVFRQIGJhc2ljIGF1dGhlbnRpY2F0aW9uIHNlbmRzDQordW5lbmNyeXB0ZWQgdXNlcmlkcyBhbmQgcGFzc3dvcmRzIG92ZXIgdGhlIG5ldCwgd2hpbGUgZGlnZXN0IGF1dGhlbnRpY2F0aW9uDQorZG9lcyBub3QgZXhjaGFuZ2UgcGFzc3dvcmRzIGJ1dCBleGNoYW5nZXMgY2hlY2tzdW1zIG9mIHBhc3N3b3JkcyAoYW5kIG90aGVyDQorZGF0YSBzdWNoIGFzIG5vbmNlcyB0byBhdm9pZCByZXBsYXkgYXR0YWNrcykuIEZvciBtb3JlIGRldGFpbHMsIHBsZWFzZSBzZWUNCitSRkMgMjYxNy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIEhUVFAgZGlnZXN0IGF1dGhlbnRpY2F0aW9uIGNhbiBiZSB1c2VkIG5leHQgdG8gdGhlIGJ1aWx0LWluIGJhc2ljDQorYXV0aGVudGljYXRpb24sIG9yIGJhc2ljIGF1dGhlbnRpY2F0aW9uIGNhbiBiZSByZWplY3RlZCB0byB0aWdodGVuIHNlY3VyaXR5Lg0KK1RoZSBzZXJ2ZXIgbXVzdCBoYXZlIGEgZGF0YWJhc2Ugd2l0aCB1c2VyaWQncyBhbmQgcGFzc3dvcmRzIChpbiBwbGFpbiB0ZXh0DQorZm9ybSkuIFRoZSBjbGllbnQsIHdoZW4gY2hhbGxlbmdlZCBieSB0aGUgc2VydmVyLCBjaGVja3MgdGhlIGF1dGhlbnRpY2F0aW9uDQorcmVhbG0gcHJvdmlkZWQgYnkgdGhlIHNlcnZlciBhbmQgc2V0cyB0aGUgdXNlcmlkIGFuZCBwYXNzd29yZHMgZm9yIGRpZ2VzdA0KK2F1dGhlbnRpY2F0aW9uLiBUaGUgY2xpZW50IGFwcGxpY2F0aW9uIGNhbiB0ZW1wb3JhcmlseSBzdG9yZSB0aGUgdXNlcmlkIGFuZA0KK3Bhc3N3b3JkIGZvciBhIHNlcXVlbmNlIG9mIG1lc3NhZ2UgZXhjaGFuZ2VzIHdpdGggdGhlIHNlcnZlciwgd2hpY2ggaXMgZmFzdGVyDQordGhhbiByZXBlYXRlZCBhdXRob3JpemF0aW9uIGNoYWxsZW5nZXMgYW5kIGF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlcy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorQXQgdGhlIGNsaWVudCBzaWRlLCB0aGUgcGx1Zy1pbiBpcyByZWdpc3RlcmVkIGFuZCBzZXJ2aWNlIGludm9jYXRpb25zIGFyZQ0KK2NoZWNrZWQgZm9yIGF1dGhvcml6YXRpb24gY2hhbGxlbmdlcyAoSFRUUCBlcnJvciBjb2RlIDQwMSkuIFdoZW4gdGhlIHNlcnZlcg0KK2NoYWxsZW5nZXMgdGhlIGNsaWVudCwgdGhlIGNsaWVudCBzaG91bGQgc2V0IHRoZSB1c2VyaWQgYW5kIHBhc3N3b3JkIGFuZCByZXRyeQ0KK3RoZSBpbnZvY2F0aW9uLiBUaGUgY2xpZW50IGNhbiBkZXRlcm1pbmUgdGhlIHVzZXJpZCBhbmQgcGFzc3dvcmQgYmFzZWQgb24gdGhlDQorYXV0aGVudGljYXRpb24gcmVhbG0gcGFydCBvZiB0aGUgc2VydmVyJ3MgY2hhbGxlbmdlLiBUaGUgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24gY2FuIGJlIHRlbXBvcmFyaWx5IHNhdmVkIGZvciBtdWx0aXBsZSBpbnZvY2F0aW9ucy4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorQ2xpZW50LXNpZGUgZXhhbXBsZToNCis8YnI+PGJyPjx0YWJsZSBib3JkZXI9MCB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjgiIGJnY29sb3I9IiNCMEQwQjAiPjx0cj48dGQ+PGk+DQorI2luY2x1ZGUgImh0dHBkYS5oIiA8YnIgLz4NCisuLi4gPGJyIC8+DQorPGI+aWY8L2I+Jm5ic3A7c29hcF9yZWdpc3Rlcl9wbHVnaW4oJmFtcDtzb2FwLCBodHRwX2RhKSkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7c29hcF9wcmludF9mYXVsdCgmYW1wO3NvYXAsIHN0ZGVycik7IC8vIGZhaWxlZCB0byByZWdpc3RlciA8YnIgLz4NCisuLi4gPGJyIC8+DQorPGI+aWY8L2I+Jm5ic3A7KHNvYXBfY2FsbF9uc19fbWV0aG9kKCZhbXA7c29hcCwgLi4uKSAhPSBTT0FQX09LKSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyhzb2FwLmVycm9yID09IDQwMSkgLy8gY2hhbGxlbmdlOiBIVFRQIGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KCFzdHJjbXAoc29hcC5hdXRocmVhbG0sIGF1dGhyZWFsbSkpIC8vIGRldGVybWluZSBhdXRoZW50aWNhdGlvbiByZWFsbQ0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+c3RydWN0PC9iPiZuYnNwO2h0dHBfZGFfaW5mbyBpbmZvOyAvLyB0byBzdG9yZSB1c2VyaWQgYW5kIHBhc3N3ZCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtodHRwX2RhX3NhdmUoJmFtcDtzb2FwLCAmYW1wO2luZm8sIGF1dGhyZWFsbSwgdXNlcmlkLCBwYXNzd2QpOyAvLyBzZXQgdXNlcmlkIGFuZCBwYXNzd2QgZm9yIHRoaXMgcmVhbG08YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoc29hcF9jYWxsX25zX19tZXRob2QoJmFtcDtzb2FwLCAuLi4pID09IFNPQVBfT0spIC8vIHJldHJ5IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3sgLi4uIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3NvYXBfZW5kKCZhbXA7c29hcCk7IC8vIHVzZXJpZCBhbmQgcGFzc3dkIHdlcmUgZGVhbGxvY2F0ZWQgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7aHR0cF9kYV9yZXN0b3JlKCZhbXA7c29hcCwgJmFtcDtpbmZvKTsgLy8gcmVzdG9yZSB1c2VyaWQgYW5kIHBhc3N3ZCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoIXNvYXBfY2FsbF9uc19fbWV0aG9kKCZhbXA7c29hcCwgLi4uKSA9PSBTT0FQX09LKSAvLyBhbm90aGVyIGNhbGwgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Li4uIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2h0dHBfZGFfcmVsZWFzZSgmYW1wO3NvYXAsICZhbXA7aW5mbyk7IC8vIHJlbW92ZSB1c2VyaWQgYW5kIHBhc3N3ZA0KKzwvdGQ+PC90cj48L3RhYmxlPjxicj48L2k+DQorVGhpcyBjb2RlIHN1cHBvcnRzIGJvdGggYmFzaWMgYW5kIGRpZ2VzdCBhdXRoZW50aWNhdGlvbi4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIHNlcnZlciBjYW4gY2hhbGxlbmdlIGEgY2xpZW50IHVzaW5nIEhUVFAgY29kZSA0MDEuIFdpdGggdGhlIHBsdWctaW4sIEhUVFAgZGlnZXN0IGF1dGhlbnRpY2F0aW9uIGNoYWxsZW5nZXMgYXJlIHNlbmQuIFdpdGhvdXQgdGhlIHBsdWctaW4sIGJhc2ljIGF1dGhlbnRpY2F0aW9uIGNoYWxsZW5nZXMgYXJlIHNlbmQuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0VhY2ggc2VydmVyIG1ldGhvZCBjYW4gaW1wbGVtZW50IGF1dGhlbnRpY2F0aW9uIGFzIGRlc2lyZWQgYW5kIG1heSBlbmZvcmNlDQorZGlnZXN0IGF1dGhlbnRpY2F0aW9uIG9yIG1heSBhbHNvIGFjY2VwdCBiYXNpYyBhdXRoZW50aWNhdGlvbiByZXNwb25zZXMuIFRvDQordmVyaWZ5IGRpZ2VzdCBhdXRoZW50aWNhdGlvbiByZXNwb25zZXMsIHRoZSBzZXJ2ZXIgc2hvdWxkIGNvbXB1dGUgYW5kIGNvbXBhcmUNCit0aGUgY2hlY2tzdW1zIHVzaW5nIHRoZSBwbHVnLWluJ3MgPGk+aHR0cF9kYV92ZXJpZnlfcG9zdDwvaT4gZnVuY3Rpb24gZm9yDQorSFRUUCBQT1NUIHJlcXVlc3RzIChhbmQgPGk+aHR0cF9kYV92ZXJpZnlfZ2V0PC9pPiBmb3IgSFRUUCBHRVQgcmVxdWVzdHMgd2l0aA0KK3RoZSBIVFRQIEdFVCBwbHVnaW4pIGFzIGZvbGxvd3M6DQorPGJyPjxicj48dGFibGUgYm9yZGVyPTAgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjQjBEMEIwIj48dHI+PHRkPjxpPg0KKyNpbmNsdWRlICJodHRwZGEuaCIgPGJyIC8+DQorLi4uIDxiciAvPg0KKzxiPmlmPC9iPiZuYnNwOyhzb2FwX3JlZ2lzdGVyX3BsdWdpbigmYW1wO3NvYXAsIGh0dHBfZGEpKSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwX3ByaW50X2ZhdWx0KCZhbXA7c29hcCwgc3RkZXJyKTsgLy8gZmFpbGVkIHRvIHJlZ2lzdGVyIDxiciAvPg0KKy4uLiA8YnIgLz4NCitzb2FwX3NlcnZlKCZhbXA7c29hcCk7IDxiciAvPg0KKy4uLiA8YnIgLz4NCis8Yj5pbnQ8L2I+Jm5ic3A7bnNfX21ldGhvZCg8Yj5zdHJ1Y3Q8L2I+Jm5ic3A7c29hcCAqc29hcCwgLi4uKSA8YnIgLz4NCit7IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmlmPC9iPiZuYnNwOyhzb2FwPHR0Pi0mZ3Q7PC90dD51c2VyaWQgJmFtcDsmYW1wOyBzb2FwPHR0Pi0mZ3Q7PC90dD5wYXNzd2QpIC8vIGNsaWVudCB1c2VkIGJhc2ljIGF1dGhlbnRpY2F0aW9uDQorJm5ic3A7Jm5ic3A7Jm5ic3A7eyAvLyBtYXkgZGVjaWRlIG5vdCB0byBoYW5kbGUsIGJ1dCBpZiBvayB0aGVuIGdvIGFoZWFkIGFuZCBjb21wYXJlIGluZm86DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KCFzdHJjbXAoc29hcDx0dD4tJmd0OzwvdHQ+dXNlcmlkLCB1c2VyaWQpICZhbXA7JmFtcDsgIXN0cmNtcChzb2FwPHR0Pi0mZ3Q7PC90dD5wYXNzd2QsIHBhc3N3ZCkpIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3sgLi4uIGhhbmRsZSByZXF1ZXN0IC4uLiA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5yZXR1cm48L2I+Jm5ic3A7U09BUF9PSzsgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDt9IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPmVsc2U8L2I+Jm5ic3A7PGI+aWY8L2I+Jm5ic3A7KHNvYXA8dHQ+LSZndDs8L3R0PmF1dGhyZWFsbSAmYW1wOyZhbXA7IHNvYXA8dHQ+LSZndDs8L3R0PnVzZXJpZCkgLy8gRGlnZXN0IGF1dGhlbnRpY2F0aW9uIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwO3sgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7cGFzc3dkID0gLi4uIC8vIGRhdGFiYXNlIGxvb2t1cCBvbiB1c2VyaWQgYW5kIGF1dGhyZWFsbSB0byBmaW5kIHBhc3N3ZCA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoIXN0cmNtcChzb2FwPHR0Pi0mZ3Q7PC90dD5hdXRocmVhbG0sIGF1dGhyZWFsbSkgJmFtcDsmYW1wOyAhc3RyY21wKHNvYXA8dHQ+LSZndDs8L3R0PnVzZXJpZCwgdXNlcmlkKSkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7eyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5pZjwvYj4mbmJzcDsoIWh0dHBfZGFfdmVyaWZ5X3Bvc3Qoc29hcCwgcGFzc3dkKSkgPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7eyAuLi4gaGFuZGxlIHJlcXVlc3QgLi4uIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDtTT0FQX09LOyA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDt9IDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO30gPGJyIC8+DQorJm5ic3A7Jm5ic3A7Jm5ic3A7fSA8YnIgLz4NCismbmJzcDsmbmJzcDsmbmJzcDtzb2FwPHR0Pi0mZ3Q7PC90dD5hdXRocmVhbG0gPSBhdXRocmVhbG07IC8vIHNldCByZWFsbSBmb3IgY2hhbGxlbmdlIDxiciAvPg0KKyZuYnNwOyZuYnNwOyZuYnNwOzxiPnJldHVybjwvYj4mbmJzcDs0MDE7IC8vIE5vdCBhdXRob3JpemVkLCBjaGFsbGVuZ2UgZGlnZXN0IGF1dGhlbnRpY2F0aW9uIDxiciAvPg0KK30NCis8L3RkPjwvdHI+PC90YWJsZT48YnI+PC9pPg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCis8L2JvZHk+DQorDQorPGJyIC8+PGJyIC8+PGhyIC8+PHNtYWxsPkZpbGUgdHJhbnNsYXRlZCBmcm9tDQorVDxzdWI+PGZvbnQgc2l6ZT0iLTEiPkU8L2ZvbnQ+PC9zdWI+WA0KK2J5IDxhIGhyZWY9Imh0dHA6Ly9odXRjaGluc29uLmJlbG1vbnQubWEudXMvdHRoLyI+DQorVDxzdWI+PGZvbnQgc2l6ZT0iLTEiPlQ8L2ZvbnQ+PC9zdWI+SDwvYT4sDQordmVyc2lvbiAzLjcyLjxiciAvPk9uIDE5IEZlYiAyMDA2LCAxMTozNi48L3NtYWxsPg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2Mvc29hcGRvYzIucGRmIGIvZG9jL3NvYXBkb2MyLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTY5Y2UzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NvYXBkb2MyLnBkZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9hbm5vdGF0ZWQuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2Fubm90YXRlZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkOTYyMDQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9hbm5vdGF0ZWQuaHRtbApAQCAtMCwwICsxLDk4IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiBDbGFzcyBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4SEwiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+Z1NPQVAgVURESSB2MiBDbGFzcyBMaXN0PC9oMT5IZXJlIGFyZSB0aGUgY2xhc3Nlcywgc3RydWN0cywgdW5pb25zIGFuZCBpbnRlcmZhY2VzIHdpdGggYnJpZWYgZGVzY3JpcHRpb25zOjx0YWJsZT4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCI+X2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj5UaGUgU09BUCBGYXVsdCBEZXRhaWwgZWxlbWVudCBjb250YWlucyBvbmUgb2YgdGhlIGZvbGxvd2luZyB0eXBlcyBzZXJpYWxpemVkIDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWNjZXNzX3BvaW50Lmh0bWwiPnVkZGkyX19hY2Nlc3NQb2ludDwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImFjY2Vzc1BvaW50IiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FkZF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCI+dWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYWRkX3B1Ymxpc2hlckFzc2VydGlvbnMiIDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkcmVzcy5odG1sIj51ZGRpMl9fYWRkcmVzczwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImFkZHJlc3MiIDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkcmVzc19saW5lLmh0bWwiPnVkZGkyX19hZGRyZXNzTGluZTwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImFkZHJlc3NMaW5lIiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfaXRlbS5odG1sIj51ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbTwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImFzc2VydGlvblN0YXR1c0l0ZW0iIDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXNzZXJ0aW9uX3N0YXR1c19yZXBvcnQuaHRtbCI+dWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydDwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImFzc2VydGlvblN0YXR1c1JlcG9ydCIgPC90ZD48L3RyPg0KKyAgPHRyPjx0ZCBjbGFzcz0iaW5kZXhrZXkiPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hdXRoX3Rva2VuLmh0bWwiPnVkZGkyX19hdXRoVG9rZW48L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJhdXRoVG9rZW4iIDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ19kZXRhaWwuaHRtbCI+dWRkaTJfX2JpbmRpbmdEZXRhaWw8L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJiaW5kaW5nRGV0YWlsIiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGUuaHRtbCI+dWRkaTJfX2JpbmRpbmdUZW1wbGF0ZTwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImJpbmRpbmdUZW1wbGF0ZSIgPC90ZD48L3RyPg0KKyAgPHRyPjx0ZCBjbGFzcz0iaW5kZXhrZXkiPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX3RlbXBsYXRlcy5odG1sIj51ZGRpMl9fYmluZGluZ1RlbXBsYXRlczwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImJpbmRpbmdUZW1wbGF0ZXMiIDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsLmh0bWwiPnVkZGkyX19idXNpbmVzc0RldGFpbDwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImJ1c2luZXNzRGV0YWlsIiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2RldGFpbF9leHQuaHRtbCI+dWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0PC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYnVzaW5lc3NEZXRhaWxFeHQiIDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5Lmh0bWwiPnVkZGkyX19idXNpbmVzc0VudGl0eTwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImJ1c2luZXNzRW50aXR5IiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eV9leHQuaHRtbCI+dWRkaTJfX2J1c2luZXNzRW50aXR5RXh0PC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYnVzaW5lc3NFbnRpdHlFeHQiIDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfaW5mby5odG1sIj51ZGRpMl9fYnVzaW5lc3NJbmZvPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYnVzaW5lc3NJbmZvIiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2luZm9zLmh0bWwiPnVkZGkyX19idXNpbmVzc0luZm9zPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYnVzaW5lc3NJbmZvcyIgPC90ZD48L3RyPg0KKyAgPHRyPjx0ZCBjbGFzcz0iaW5kZXhrZXkiPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19saXN0Lmh0bWwiPnVkZGkyX19idXNpbmVzc0xpc3Q8L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJidXNpbmVzc0xpc3QiIDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3Nfc2VydmljZS5odG1sIj51ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYnVzaW5lc3NTZXJ2aWNlIiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2VzLmh0bWwiPnVkZGkyX19idXNpbmVzc1NlcnZpY2VzPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYnVzaW5lc3NTZXJ2aWNlcyIgPC90ZD48L3RyPg0KKyAgPHRyPjx0ZCBjbGFzcz0iaW5kZXhrZXkiPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19jYXRlZ29yeV9iYWcuaHRtbCI+dWRkaTJfX2NhdGVnb3J5QmFnPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiY2F0ZWdvcnlCYWciIDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fY29udGFjdC5odG1sIj51ZGRpMl9fY29udGFjdDwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImNvbnRhY3QiIDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fY29udGFjdHMuaHRtbCI+dWRkaTJfX2NvbnRhY3RzPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiY29udGFjdHMiIDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwiPnVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZzwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImRlbGV0ZV9iaW5kaW5nIiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzczwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImRlbGV0ZV9idXNpbmVzcyIgPC90ZD48L3RyPg0KKyAgPHRyPjx0ZCBjbGFzcz0iaW5kZXhrZXkiPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwiPnVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImRlbGV0ZV9wdWJsaXNoZXJBc3NlcnRpb25zIiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2U8L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJkZWxldGVfc2VydmljZSIgPC90ZD48L3RyPg0KKyAgPHRyPjx0ZCBjbGFzcz0iaW5kZXhrZXkiPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWw8L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJkZWxldGVfdE1vZGVsIiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rlc2NyaXB0aW9uLmh0bWwiPnVkZGkyX19kZXNjcmlwdGlvbjwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImRlc2NyaXB0aW9uIiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NhcmRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCI+dWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZGlzY2FyZF9hdXRoVG9rZW4iIDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzY292ZXJ5X3Vfcl9sLmh0bWwiPnVkZGkyX19kaXNjb3ZlcnlVUkw8L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJkaXNjb3ZlcnlVUkwiIDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzY292ZXJ5X3Vfcl9scy5odG1sIj51ZGRpMl9fZGlzY292ZXJ5VVJMczwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImRpc2NvdmVyeVVSTHMiIDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwiPnVkZGkyX19kaXNwb3NpdGlvblJlcG9ydDwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImRpc3Bvc2l0aW9uUmVwb3J0IiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2VtYWlsLmh0bWwiPnVkZGkyX19lbWFpbDwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImVtYWlsIiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Vycl9pbmZvLmh0bWwiPnVkZGkyX19lcnJJbmZvPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZXJySW5mbyIgPC90ZD48L3RyPg0KKyAgPHRyPjx0ZCBjbGFzcz0iaW5kZXhrZXkiPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwiPnVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmc8L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJmaW5kX2JpbmRpbmciIDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCI+dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M8L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJmaW5kX2J1c2luZXNzIiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXJlbGF0ZWRfYnVzaW5lc3Nlcy5odG1sIj51ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlczwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImZpbmRfcmVsYXRlZEJ1c2luZXNzZXMiIDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sIj51ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZmluZF9zZXJ2aWNlIiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCI+dWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZmluZF90TW9kZWwiIDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9xdWFsaWZpZXJzLmh0bWwiPnVkZGkyX19maW5kUXVhbGlmaWVyczwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImZpbmRRdWFsaWZpZXJzIiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXNzZXJ0aW9uX3N0YXR1c19yZXBvcnQuaHRtbCI+dWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQ8L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJnZXRfYXNzZXJ0aW9uU3RhdHVzUmVwb3J0IiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbjwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImdldF9hdXRoVG9rZW4iIDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2ViaW5kaW5nX2RldGFpbC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWw8L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJnZXRfYmluZGluZ0RldGFpbCIgPC90ZD48L3RyPg0KKyAgPHRyPjx0ZCBjbGFzcz0iaW5kZXhrZXkiPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZ2V0X2J1c2luZXNzRGV0YWlsIiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsX2V4dC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0PC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZ2V0X2J1c2luZXNzRGV0YWlsRXh0IiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCI+dWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZ2V0X3B1Ymxpc2hlckFzc2VydGlvbnMiIDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VyZWdpc3RlcmVkX2luZm8uaHRtbCI+dWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbzwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImdldF9yZWdpc3RlcmVkSW5mbyIgPC90ZD48L3RyPg0KKyAgPHRyPjx0ZCBjbGFzcz0iaW5kZXhrZXkiPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXNlcnZpY2VfZGV0YWlsLmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbDwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImdldF9zZXJ2aWNlRGV0YWlsIiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9ldF9tb2RlbF9kZXRhaWwuaHRtbCI+dWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWw8L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJnZXRfdE1vZGVsRGV0YWlsIiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2hvc3RpbmdfcmVkaXJlY3Rvci5odG1sIj51ZGRpMl9faG9zdGluZ1JlZGlyZWN0b3I8L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJob3N0aW5nUmVkaXJlY3RvciIgPC90ZD48L3RyPg0KKyAgPHRyPjx0ZCBjbGFzcz0iaW5kZXhrZXkiPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19pZGVudGlmaWVyX2JhZy5odG1sIj51ZGRpMl9faWRlbnRpZmllckJhZzwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImlkZW50aWZpZXJCYWciIDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19faW5zdGFuY2VfZGV0YWlscy5odG1sIj51ZGRpMl9faW5zdGFuY2VEZXRhaWxzPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiaW5zdGFuY2VEZXRhaWxzIiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2tleWVkX3JlZmVyZW5jZS5odG1sIj51ZGRpMl9fa2V5ZWRSZWZlcmVuY2U8L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJrZXllZFJlZmVyZW5jZSIgPC90ZD48L3RyPg0KKyAgPHRyPjx0ZCBjbGFzcz0iaW5kZXhrZXkiPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19rZXlzX293bmVkLmh0bWwiPnVkZGkyX19rZXlzT3duZWQ8L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJrZXlzT3duZWQiIDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fbmFtZS5odG1sIj51ZGRpMl9fbmFtZTwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6Im5hbWUiIDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fb3ZlcnZpZXdfZG9jLmh0bWwiPnVkZGkyX19vdmVydmlld0RvYzwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6Im92ZXJ2aWV3RG9jIiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3Bob25lLmh0bWwiPnVkZGkyX19waG9uZTwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InBob25lIiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb24uaHRtbCI+dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbjwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InB1Ymxpc2hlckFzc2VydGlvbiIgPC90ZD48L3RyPg0KKyAgPHRyPjx0ZCBjbGFzcz0iaW5kZXhrZXkiPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19wdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sIj51ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uczwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InB1Ymxpc2hlckFzc2VydGlvbnMiIDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVnaXN0ZXJlZF9pbmZvLmh0bWwiPnVkZGkyX19yZWdpc3RlcmVkSW5mbzwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InJlZ2lzdGVyZWRJbmZvIiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3Nlc19saXN0Lmh0bWwiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3Q8L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJyZWxhdGVkQnVzaW5lc3Nlc0xpc3QiIDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc19pbmZvLmh0bWwiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoicmVsYXRlZEJ1c2luZXNzSW5mbyIgPC90ZD48L3RyPg0KKyAgPHRyPjx0ZCBjbGFzcz0iaW5kZXhrZXkiPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzX2luZm9zLmh0bWwiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvczwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InJlbGF0ZWRCdXNpbmVzc0luZm9zIiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3Jlc3VsdC5odG1sIj51ZGRpMl9fcmVzdWx0PC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoicmVzdWx0IiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCI+dWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZzwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InNhdmVfYmluZGluZyIgPC90ZD48L3RyPg0KKyAgPHRyPjx0ZCBjbGFzcz0iaW5kZXhrZXkiPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sIj51ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzczwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InNhdmVfYnVzaW5lc3MiIDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sIj51ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92Mjoic2F2ZV9zZXJ2aWNlIiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCI+dWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92Mjoic2F2ZV90TW9kZWwiIDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9kZXRhaWwuaHRtbCI+dWRkaTJfX3NlcnZpY2VEZXRhaWw8L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJzZXJ2aWNlRGV0YWlsIiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfaW5mby5odG1sIj51ZGRpMl9fc2VydmljZUluZm88L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJzZXJ2aWNlSW5mbyIgPC90ZD48L3RyPg0KKyAgPHRyPjx0ZCBjbGFzcz0iaW5kZXhrZXkiPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2luZm9zLmh0bWwiPnVkZGkyX19zZXJ2aWNlSW5mb3M8L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJzZXJ2aWNlSW5mb3MiIDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9saXN0Lmh0bWwiPnVkZGkyX19zZXJ2aWNlTGlzdDwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InNlcnZpY2VMaXN0IiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCI+dWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92Mjoic2V0X3B1Ymxpc2hlckFzc2VydGlvbnMiIDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2hhcmVkX3JlbGF0aW9uc2hpcHMuaHRtbCI+dWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHM8L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJzaGFyZWRSZWxhdGlvbnNoaXBzIiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWwuaHRtbCI+dWRkaTJfX3RNb2RlbDwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InRNb2RlbCIgPC90ZD48L3RyPg0KKyAgPHRyPjx0ZCBjbGFzcz0iaW5kZXhrZXkiPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2JhZy5odG1sIj51ZGRpMl9fdE1vZGVsQmFnPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoidE1vZGVsQmFnIiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfZGV0YWlsLmh0bWwiPnVkZGkyX190TW9kZWxEZXRhaWw8L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJ0TW9kZWxEZXRhaWwiIDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbmZvLmh0bWwiPnVkZGkyX190TW9kZWxJbmZvPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoidE1vZGVsSW5mbyIgPC90ZD48L3RyPg0KKyAgPHRyPjx0ZCBjbGFzcz0iaW5kZXhrZXkiPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luZm9zLmh0bWwiPnVkZGkyX190TW9kZWxJbmZvczwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InRNb2RlbEluZm9zIiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5zdGFuY2VfZGV0YWlscy5odG1sIj51ZGRpMl9fdE1vZGVsSW5zdGFuY2VEZXRhaWxzPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoidE1vZGVsSW5zdGFuY2VEZXRhaWxzIiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5zdGFuY2VfaW5mby5odG1sIj51ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoidE1vZGVsSW5zdGFuY2VJbmZvIiA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfbGlzdC5odG1sIj51ZGRpMl9fdE1vZGVsTGlzdDwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InRNb2RlbExpc3QiIDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdmFsaWRhdGVfX191X3NfY19vX3JfZXZhbHVlcy5odG1sIj51ZGRpMl9fdmFsaWRhdGVfVVNDT1JFdmFsdWVzPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoidmFsaWRhdGVfdmFsdWVzIiA8L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNjo1OCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc19fZGlzcG9zaXRpb25fcmVwb3J0LW1lbWJlcnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzX19kaXNwb3NpdGlvbl9yZXBvcnQtbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNDliNTYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc19fZGlzcG9zaXRpb25fcmVwb3J0LW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDE1IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT5fZGlzcG9zaXRpb25SZXBvcnQgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwiPl9kaXNwb3NpdGlvblJlcG9ydDwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwjbzEiPnNvYXA8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwiPl9kaXNwb3NpdGlvblJlcG9ydDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCNvMCI+dWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0XzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCI+X2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU4IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDJlMjk1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3NfX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sCkBAIC0wLDAgKzEsNzcgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IF9kaXNwb3NpdGlvblJlcG9ydCBDbGFzcyBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+X2Rpc3Bvc2l0aW9uUmVwb3J0IENsYXNzIFJlZmVyZW5jZTwvaDE+VGhlIFNPQVAgRmF1bHQgRGV0YWlsIGVsZW1lbnQgY29udGFpbnMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHlwZXMgc2VyaWFsaXplZC4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7dWRkaV92Mi5oJmd0OzwvY29kZT4NCis8cD4NCis8YSBocmVmPSJjbGFzc19fZGlzcG9zaXRpb25fcmVwb3J0LW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCI+dWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCNvMCI+dWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0XzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3NfX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sI28xIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCNvMSI+c29hcDwvYT48L3RkPjwvdHI+DQorDQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1RoZSBTT0FQIEZhdWx0IERldGFpbCBlbGVtZW50IGNvbnRhaW5zIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR5cGVzIHNlcmlhbGl6ZWQuIA0KKzxwPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9Il9kaXNwb3NpdGlvblJlcG9ydDo6c29hcCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwjbzEiPnNvYXA8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCNvMSI+X2Rpc3Bvc2l0aW9uUmVwb3J0Ojpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJfZGlzcG9zaXRpb25SZXBvcnQ6OnVkZGkyX19kaXNwb3NpdGlvblJlcG9ydF8iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sIj51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQ8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCNvMCI+X2Rpc3Bvc2l0aW9uUmVwb3J0Ojp1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnRfPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3VkZGkyLzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCI+dWRkaV92Mi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTggMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19hY2Nlc3NfcG9pbnQtbWVtYmVycy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19hY2Nlc3NfcG9pbnQtbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNmFhYTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2FjY2Vzc19wb2ludC1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwxNiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX2FjY2Vzc1BvaW50IE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hY2Nlc3NfcG9pbnQuaHRtbCI+dWRkaTJfX2FjY2Vzc1BvaW50PC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWNjZXNzX3BvaW50Lmh0bWwjbzAiPl9faXRlbTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWNjZXNzX3BvaW50Lmh0bWwiPnVkZGkyX19hY2Nlc3NQb2ludDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWNjZXNzX3BvaW50Lmh0bWwjbzIiPnNvYXA8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FjY2Vzc19wb2ludC5odG1sIj51ZGRpMl9fYWNjZXNzUG9pbnQ8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FjY2Vzc19wb2ludC5odG1sI28xIj5VUkxUeXBlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hY2Nlc3NfcG9pbnQuaHRtbCI+dWRkaTJfX2FjY2Vzc1BvaW50PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU4IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYWNjZXNzX3BvaW50Lmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2FjY2Vzc19wb2ludC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMzFiOWIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2FjY2Vzc19wb2ludC5odG1sCkBAIC0wLDAgKzEsMTA4IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiB1ZGRpMl9fYWNjZXNzUG9pbnQgQ2xhc3MgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19hY2Nlc3NQb2ludCBDbGFzcyBSZWZlcmVuY2U8L2gxPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJhY2Nlc3NQb2ludCIuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3VkZGlfdjIuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19hY2Nlc3NfcG9pbnQtbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWNjZXNzX3BvaW50Lmh0bWwjbzAiPl9faXRlbTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmVudW0gPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0OSI+dWRkaTJfX1VSTFR5cGU8L2E+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWNjZXNzX3BvaW50Lmh0bWwjbzEiPlVSTFR5cGU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkF0dHJpYnV0ZSBVUkxUeXBlIG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOlVSTFR5cGUuICA8YSBocmVmPSIjbzEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWNjZXNzX3BvaW50Lmh0bWwjbzIiPnNvYXA8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hY2Nlc3NfcG9pbnQuaHRtbCNvMiI+c29hcDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuICA8YSBocmVmPSIjbzIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzwvdGFibGU+DQorPGhyPjxhIG5hbWU9Il9kZXRhaWxzIj48L2E+PGgyPkRldGFpbGVkIERlc2NyaXB0aW9uPC9oMj4NCitTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYWNjZXNzUG9pbnQiLiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJ1ZGRpMl9fYWNjZXNzUG9pbnQ6Ol9faXRlbSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWNjZXNzX3BvaW50Lmh0bWwjbzAiPnVkZGkyX19hY2Nlc3NQb2ludDo6X19pdGVtPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJ1ZGRpMl9fYWNjZXNzUG9pbnQ6OnNvYXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hY2Nlc3NfcG9pbnQuaHRtbCNvMiI+c29hcDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hY2Nlc3NfcG9pbnQuaHRtbCNvMiI+dWRkaTJfX2FjY2Vzc1BvaW50Ojpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0idWRkaTJfX2FjY2Vzc1BvaW50OjpVUkxUeXBlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGVudW0gPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0OSI+dWRkaTJfX1VSTFR5cGU8L2E+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hY2Nlc3NfcG9pbnQuaHRtbCNvMSI+dWRkaTJfX2FjY2Vzc1BvaW50OjpVUkxUeXBlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSBVUkxUeXBlIG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOlVSTFR5cGUuIA0KKzxwPg0KK1JlcXVpcmVkIGF0dHJpYnV0ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU4IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYWRkX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy1tZW1iZXJzLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2FkZF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMtbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlOTg4ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2FkZF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMjAgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sIj51ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzAiPmF1dGhJbmZvPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwiPnVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28yIj5nZW5lcmljPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwiPnVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28xIj5wdWJsaXNoZXJBc3NlcnRpb248L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FkZF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCI+dWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjYTIiPnNlbmQ8L2E+KGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbyk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sIj51ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FkZF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMyI+c29hcDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sIj51ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FkZF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNhMCI+dWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPihzdHJ1Y3Qgc29hcCAqKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwiPnVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI2ExIj51ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+KHN0cnVjdCBzb2FwICosIHN0ZDo6dmVjdG9yJmx0OyB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uICogJmd0OyBwdWJsaXNoZXJBc3NlcnRpb25zKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwiPnVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNjo1OCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2FkZF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYWRkX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZTE4NGYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2FkZF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbApAQCAtMCwwICsxLDI4MCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgQ2xhc3MgUmVmZXJlbmNlPC9oMT5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYWRkX3B1Ymxpc2hlckFzc2VydGlvbnMiLiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KKzxjb2RlPiNpbmNsdWRlICZsdDt1ZGRpX3YyLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KKzxhIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgTWVtYmVyIEZ1bmN0aW9uczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjYTAiPnVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT4gKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28zIj5zb2FwPC9hPiAqKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjYTEiPnVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT4gKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28zIj5zb2FwPC9hPiAqLCBzdGQ6OnZlY3RvciZsdDsgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb24uaHRtbCI+dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbjwvYT4gKiAmZ3Q7IHB1Ymxpc2hlckFzc2VydGlvbnMpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gIDxhIGhyZWY9IiNhMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCI+dWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI2EyIj5zZW5kPC9hPiAoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzAiPmF1dGhJbmZvPC9hPik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+TWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2EyIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FkZF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMCI+YXV0aEluZm88L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjphdXRoSW5mby4gIDxhIGhyZWY9IiNvMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbi5odG1sIj51ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uPC9hPiAqICZndDsmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzEiPnB1Ymxpc2hlckFzc2VydGlvbjwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VmVjdG9yIG9mIHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FkZF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMiI+Z2VuZXJpYzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcuICA8YSBocmVmPSIjbzIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28zIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28zIj5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvMyI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJhZGRfcHVibGlzaGVyQXNzZXJ0aW9ucyIuIA0KKzxwPg0KK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIGFkZCBvbmUgb3IgbW9yZSBwdWJsaXNoZXIgYXNzZXJ0aW9ucyB0byB0aGUgYXNzZXJ0aW9uIGNvbGxlY3Rpb24gZm9yIGFuIGluZGl2aWR1YWwgcHVibGlzaGVyLjxwPg0KK1NlZSAgPGEgaHJlZj0iaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzczMSI+aHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzczMTwvYT4gDQorPHA+DQorPGhyPjxoMj5Db25zdHJ1Y3RvciAmYW1wOyBEZXN0cnVjdG9yIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEwIiBkb3h5dGFnPSJ1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM6OnVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM6OnVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28zIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiA8ZW0+c29hcDwvZW0+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5nU09BUCBjb250ZXh0PC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zIGNsYXNzLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMSIgZG94eXRhZz0idWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjp1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjp1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FkZF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMyI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbi5odG1sIj51ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uPC9hPiAqICZndDsmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+cHVibGlzaGVyQXNzZXJ0aW9uczwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmdTT0FQIGNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5wdWJsaXNoZXJBc3NlcnRpb25zPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb2xsZWN0aW9uIG9mIHB1Ymxpc2hlciBhc3NlcnRpb25zPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQgcHVibGlzaGVyIGFzc2VydGlvbnMuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj48aDI+TWVtYmVyIEZ1bmN0aW9uIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEyIiBkb3h5dGFnPSJ1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM6OnNlbmQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sIj51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQ8L2E+ICogdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjpzZW5kICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmVuZHBvaW50PC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5hdXRoSW5mbzwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmVuZHBvaW50PC9lbT4mbmJzcDs8L3RkPjx0ZD5VUkwgb2YgdGhlIFVEREkgc2VydmVyIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+YXV0aEluZm88L2VtPiZuYnNwOzwvdGQ+PHRkPmF1dGhvcml6YXRpb24gdG9rZW4gcHJvdmlkZWQgYnkgdGhlIFVEREkgc2VydmVyIDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+QSBwb2ludGVyIHRvIGEgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sIj51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQ8L2E+IG9iamVjdCBvciBOVUxMIG9uIGVycm9yPC9kZD48L2RsPg0KK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2ZXIgdG8gYWRkIG9uZSBvciBtb3JlIHB1Ymxpc2hlciBhc3NlcnRpb25zIHRvIHRoZSBhc3NlcnRpb24gY29sbGVjdGlvbiBmb3IgYW4gaW5kaXZpZHVhbCBwdWJsaXNoZXIuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczo6YXV0aEluZm8iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FkZF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMCI+dWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjphdXRoSW5mbzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YXV0aEluZm8uIA0KKzxwPg0KK1JlcXVpcmVkIGVsZW1lbnQgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9InVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczo6Z2VuZXJpYyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28yIj51ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM6OmdlbmVyaWM8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcuIA0KKzxwPg0KK1JlcXVpcmVkIGF0dHJpYnV0ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0idWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjpwdWJsaXNoZXJBc3NlcnRpb24iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RkOjp2ZWN0b3ImbHQ7PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb24uaHRtbCI+dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbjwvYT4qJmd0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28xIj51ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM6OnB1Ymxpc2hlckFzc2VydGlvbjwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitWZWN0b3Igb2YgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbiogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMyIgZG94eXRhZz0idWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28zIj5zb2FwPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FkZF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMyI+dWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU4IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYWRkcmVzcy1tZW1iZXJzLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2FkZHJlc3MtbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MzM0YWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2FkZHJlc3MtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTggQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19hZGRyZXNzIE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRyZXNzLmh0bWwiPnVkZGkyX19hZGRyZXNzPC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkcmVzcy5odG1sI28wIj5hZGRyZXNzTGluZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkcmVzcy5odG1sIj51ZGRpMl9fYWRkcmVzczwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkcmVzcy5odG1sI280Ij5zb2FwPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRyZXNzLmh0bWwiPnVkZGkyX19hZGRyZXNzPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRyZXNzLmh0bWwjbzIiPnNvcnRDb2RlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRyZXNzLmh0bWwiPnVkZGkyX19hZGRyZXNzPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRyZXNzLmh0bWwjbzMiPnRNb2RlbEtleTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkcmVzcy5odG1sIj51ZGRpMl9fYWRkcmVzczwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkcmVzcy5odG1sI28xIj51c2VUeXBlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRyZXNzLmh0bWwiPnVkZGkyX19hZGRyZXNzPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU4IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYWRkcmVzcy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19hZGRyZXNzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgwZWRhYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYWRkcmVzcy5odG1sCkBAIC0wLDAgKzEsMTY3IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiB1ZGRpMl9fYWRkcmVzcyBDbGFzcyBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX2FkZHJlc3MgQ2xhc3MgUmVmZXJlbmNlPC9oMT5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYWRkcmVzcyIuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3VkZGlfdjIuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRyZXNzLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkcmVzc19saW5lLmh0bWwiPnVkZGkyX19hZGRyZXNzTGluZTwvYT4gKiAmZ3Q7Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkcmVzcy5odG1sI28wIj5hZGRyZXNzTGluZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VmVjdG9yIG9mIHVkZGkyX19hZGRyZXNzTGluZSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiAgPGEgaHJlZj0iI28wIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkcmVzcy5odG1sI28xIj51c2VUeXBlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgdXNlVHlwZSBvZiB0eXBlIHhzOnN0cmluZy4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FkZHJlc3MuaHRtbCNvMiI+c29ydENvZGU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkF0dHJpYnV0ZSBzb3J0Q29kZSBvZiB0eXBlIHhzOnN0cmluZy4gIDxhIGhyZWY9IiNvMiI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNSI+dWRkaTJfX3RNb2RlbEtleTwvYT4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRyZXNzLmh0bWwjbzMiPnRNb2RlbEtleTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIHRNb2RlbEtleSBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0TW9kZWxLZXkuICA8YSBocmVmPSIjbzMiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkcmVzcy5odG1sI280Ij5zb2FwPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkcmVzcy5odG1sI280Ij5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvNCI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJhZGRyZXNzIi4gDQorPHA+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0idWRkaTJfX2FkZHJlc3M6OmFkZHJlc3NMaW5lIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0ZDo6dmVjdG9yJmx0OzxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRyZXNzX2xpbmUuaHRtbCI+dWRkaTJfX2FkZHJlc3NMaW5lPC9hPiogJmd0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkcmVzcy5odG1sI28wIj51ZGRpMl9fYWRkcmVzczo6YWRkcmVzc0xpbmU8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVmVjdG9yIG9mIHVkZGkyX19hZGRyZXNzTGluZSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNCIgZG94eXRhZz0idWRkaTJfX2FkZHJlc3M6OnNvYXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRyZXNzLmh0bWwjbzQiPnNvYXA8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkcmVzcy5odG1sI280Ij51ZGRpMl9fYWRkcmVzczo6c29hcDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9InVkZGkyX19hZGRyZXNzOjpzb3J0Q29kZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkcmVzcy5odG1sI28yIj51ZGRpMl9fYWRkcmVzczo6c29ydENvZGU8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIHNvcnRDb2RlIG9mIHR5cGUgeHM6c3RyaW5nLiANCis8cD4NCitPcHRpb25hbCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzMiIGRveHl0YWc9InVkZGkyX19hZGRyZXNzOjp0TW9kZWxLZXkiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E1Ij51ZGRpMl9fdE1vZGVsS2V5PC9hPiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkcmVzcy5odG1sI28zIj51ZGRpMl9fYWRkcmVzczo6dE1vZGVsS2V5PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSB0TW9kZWxLZXkgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dE1vZGVsS2V5LiANCis8cD4NCitPcHRpb25hbCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9InVkZGkyX19hZGRyZXNzOjp1c2VUeXBlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRyZXNzLmh0bWwjbzEiPnVkZGkyX19hZGRyZXNzOjp1c2VUeXBlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSB1c2VUeXBlIG9mIHR5cGUgeHM6c3RyaW5nLiANCis8cD4NCitPcHRpb25hbCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvdWRkaTIvPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sIj51ZGRpX3YyLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNjo1OCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2FkZHJlc3NfbGluZS1tZW1iZXJzLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2FkZHJlc3NfbGluZS1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk5MGE0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYWRkcmVzc19saW5lLW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDE3IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fYWRkcmVzc0xpbmUgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FkZHJlc3NfbGluZS5odG1sIj51ZGRpMl9fYWRkcmVzc0xpbmU8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRyZXNzX2xpbmUuaHRtbCNvMCI+X19pdGVtPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRyZXNzX2xpbmUuaHRtbCI+dWRkaTJfX2FkZHJlc3NMaW5lPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRyZXNzX2xpbmUuaHRtbCNvMSI+a2V5TmFtZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkcmVzc19saW5lLmh0bWwiPnVkZGkyX19hZGRyZXNzTGluZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkcmVzc19saW5lLmh0bWwjbzIiPmtleVZhbHVlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRyZXNzX2xpbmUuaHRtbCI+dWRkaTJfX2FkZHJlc3NMaW5lPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRyZXNzX2xpbmUuaHRtbCNvMyI+c29hcDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkcmVzc19saW5lLmh0bWwiPnVkZGkyX19hZGRyZXNzTGluZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNjo1OCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2FkZHJlc3NfbGluZS5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19hZGRyZXNzX2xpbmUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzQ5Y2UxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19hZGRyZXNzX2xpbmUuaHRtbApAQCAtMCwwICsxLDEzNiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogdWRkaTJfX2FkZHJlc3NMaW5lIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fYWRkcmVzc0xpbmUgQ2xhc3MgUmVmZXJlbmNlPC9oMT5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYWRkcmVzc0xpbmUiLiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KKzxjb2RlPiNpbmNsdWRlICZsdDt1ZGRpX3YyLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KKzxhIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkcmVzc19saW5lLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FkZHJlc3NfbGluZS5odG1sI28wIj5fX2l0ZW08L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRyZXNzX2xpbmUuaHRtbCNvMSI+a2V5TmFtZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIGtleU5hbWUgb2YgdHlwZSB4czpzdHJpbmcuICA8YSBocmVmPSIjbzEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRyZXNzX2xpbmUuaHRtbCNvMiI+a2V5VmFsdWU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkF0dHJpYnV0ZSBrZXlWYWx1ZSBvZiB0eXBlIHhzOnN0cmluZy4gIDxhIGhyZWY9IiNvMiI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRyZXNzX2xpbmUuaHRtbCNvMyI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FkZHJlc3NfbGluZS5odG1sI28zIj5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvMyI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJhZGRyZXNzTGluZSIuIA0KKzxwPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InVkZGkyX19hZGRyZXNzTGluZTo6X19pdGVtIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRyZXNzX2xpbmUuaHRtbCNvMCI+dWRkaTJfX2FkZHJlc3NMaW5lOjpfX2l0ZW08L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9InVkZGkyX19hZGRyZXNzTGluZTo6a2V5TmFtZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkcmVzc19saW5lLmh0bWwjbzEiPnVkZGkyX19hZGRyZXNzTGluZTo6a2V5TmFtZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUga2V5TmFtZSBvZiB0eXBlIHhzOnN0cmluZy4gDQorPHA+DQorT3B0aW9uYWwgYXR0cmlidXRlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJ1ZGRpMl9fYWRkcmVzc0xpbmU6OmtleVZhbHVlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRyZXNzX2xpbmUuaHRtbCNvMiI+dWRkaTJfX2FkZHJlc3NMaW5lOjprZXlWYWx1ZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUga2V5VmFsdWUgb2YgdHlwZSB4czpzdHJpbmcuIA0KKzxwPg0KK09wdGlvbmFsIGF0dHJpYnV0ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMyIgZG94eXRhZz0idWRkaTJfX2FkZHJlc3NMaW5lOjpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkcmVzc19saW5lLmh0bWwjbzMiPnNvYXA8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkcmVzc19saW5lLmh0bWwjbzMiPnVkZGkyX19hZGRyZXNzTGluZTo6c29hcDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvdWRkaTIvPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sIj51ZGRpX3YyLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNjo1OCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfaXRlbS1tZW1iZXJzLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfaXRlbS1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EwYWVhYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYXNzZXJ0aW9uX3N0YXR1c19pdGVtLW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDE5IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbSBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXNzZXJ0aW9uX3N0YXR1c19pdGVtLmh0bWwiPnVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtPC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXNzZXJ0aW9uX3N0YXR1c19pdGVtLmh0bWwjbzQiPmNvbXBsZXRpb25TdGF0dXM8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfaXRlbS5odG1sIj51ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXNzZXJ0aW9uX3N0YXR1c19pdGVtLmh0bWwjbzAiPmZyb21LZXk8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfaXRlbS5odG1sIj51ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXNzZXJ0aW9uX3N0YXR1c19pdGVtLmh0bWwjbzIiPmtleWVkUmVmZXJlbmNlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hc3NlcnRpb25fc3RhdHVzX2l0ZW0uaHRtbCI+dWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW08L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfaXRlbS5odG1sI28zIj5rZXlzT3duZWQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfaXRlbS5odG1sIj51ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXNzZXJ0aW9uX3N0YXR1c19pdGVtLmh0bWwjbzUiPnNvYXA8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfaXRlbS5odG1sIj51ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXNzZXJ0aW9uX3N0YXR1c19pdGVtLmh0bWwjbzEiPnRvS2V5PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hc3NlcnRpb25fc3RhdHVzX2l0ZW0uaHRtbCI+dWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW08L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTggMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19hc3NlcnRpb25fc3RhdHVzX2l0ZW0uaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYXNzZXJ0aW9uX3N0YXR1c19pdGVtLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ1NjExYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYXNzZXJ0aW9uX3N0YXR1c19pdGVtLmh0bWwKQEAgLTAsMCArMSwxOTUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IHVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbSBDbGFzcyBSZWZlcmVuY2U8L2gxPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJhc3NlcnRpb25TdGF0dXNJdGVtIi4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7dWRkaV92Mi5oJmd0OzwvY29kZT4NCis8cD4NCis8YSBocmVmPSJjbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfaXRlbS1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgQXR0cmlidXRlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTMiPnVkZGkyX19idXNpbmVzc0tleTwvYT4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hc3NlcnRpb25fc3RhdHVzX2l0ZW0uaHRtbCNvMCI+ZnJvbUtleTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+RWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmZyb21LZXkuICA8YSBocmVmPSIjbzAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTMiPnVkZGkyX19idXNpbmVzc0tleTwvYT4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hc3NlcnRpb25fc3RhdHVzX2l0ZW0uaHRtbCNvMSI+dG9LZXk8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0b0tleS4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19rZXllZF9yZWZlcmVuY2UuaHRtbCI+dWRkaTJfX2tleWVkUmVmZXJlbmNlPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXNzZXJ0aW9uX3N0YXR1c19pdGVtLmh0bWwjbzIiPmtleWVkUmVmZXJlbmNlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5FbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6a2V5ZWRSZWZlcmVuY2UuICA8YSBocmVmPSIjbzIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fa2V5c19vd25lZC5odG1sIj51ZGRpMl9fa2V5c093bmVkPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXNzZXJ0aW9uX3N0YXR1c19pdGVtLmh0bWwjbzMiPmtleXNPd25lZDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+RWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmtleXNPd25lZC4gIDxhIGhyZWY9IiNvMyI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfaXRlbS5odG1sI280Ij5jb21wbGV0aW9uU3RhdHVzPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgY29tcGxldGlvblN0YXR1cyBvZiB0eXBlIHhzOnN0cmluZy4gIDxhIGhyZWY9IiNvNCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hc3NlcnRpb25fc3RhdHVzX2l0ZW0uaHRtbCNvNSI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfaXRlbS5odG1sI281Ij5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvNSI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJhc3NlcnRpb25TdGF0dXNJdGVtIi4gDQorPHA+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNCIgZG94eXRhZz0idWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW06OmNvbXBsZXRpb25TdGF0dXMiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfaXRlbS5odG1sI280Ij51ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbTo6Y29tcGxldGlvblN0YXR1czwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgY29tcGxldGlvblN0YXR1cyBvZiB0eXBlIHhzOnN0cmluZy4gDQorPHA+DQorUmVxdWlyZWQgYXR0cmlidXRlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJ1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbTo6ZnJvbUtleSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTMiPnVkZGkyX19idXNpbmVzc0tleTwvYT4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfaXRlbS5odG1sI28wIj51ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbTo6ZnJvbUtleTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6ZnJvbUtleS4gDQorPHA+DQorUmVxdWlyZWQgZWxlbWVudCAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMiIgZG94eXRhZz0idWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW06OmtleWVkUmVmZXJlbmNlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19rZXllZF9yZWZlcmVuY2UuaHRtbCI+dWRkaTJfX2tleWVkUmVmZXJlbmNlPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfaXRlbS5odG1sI28yIj51ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbTo6a2V5ZWRSZWZlcmVuY2U8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmtleWVkUmVmZXJlbmNlLiANCis8cD4NCitSZXF1aXJlZCBlbGVtZW50ICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8zIiBkb3h5dGFnPSJ1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbTo6a2V5c093bmVkIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19rZXlzX293bmVkLmh0bWwiPnVkZGkyX19rZXlzT3duZWQ8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXNzZXJ0aW9uX3N0YXR1c19pdGVtLmh0bWwjbzMiPnVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtOjprZXlzT3duZWQ8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmtleXNPd25lZC4gDQorPHA+DQorUmVxdWlyZWQgZWxlbWVudCAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNSIgZG94eXRhZz0idWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW06OnNvYXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hc3NlcnRpb25fc3RhdHVzX2l0ZW0uaHRtbCNvNSI+c29hcDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hc3NlcnRpb25fc3RhdHVzX2l0ZW0uaHRtbCNvNSI+dWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW06OnNvYXA8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJ1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbTo6dG9LZXkiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EzIj51ZGRpMl9fYnVzaW5lc3NLZXk8L2E+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hc3NlcnRpb25fc3RhdHVzX2l0ZW0uaHRtbCNvMSI+dWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW06OnRvS2V5PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0VsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0b0tleS4gDQorPHA+DQorUmVxdWlyZWQgZWxlbWVudCAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU4IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYXNzZXJ0aW9uX3N0YXR1c19yZXBvcnQtbWVtYmVycy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19hc3NlcnRpb25fc3RhdHVzX3JlcG9ydC1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZlZTAyYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYXNzZXJ0aW9uX3N0YXR1c19yZXBvcnQtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTcgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfcmVwb3J0Lmh0bWwiPnVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQ8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sI28wIj5hc3NlcnRpb25TdGF0dXNJdGVtPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sIj51ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sI28xIj5nZW5lcmljPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sIj51ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sI28yIj5vcGVyYXRvcl88L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfcmVwb3J0Lmh0bWwiPnVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQ8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfcmVwb3J0Lmh0bWwjbzMiPnNvYXA8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfcmVwb3J0Lmh0bWwiPnVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQ8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTggMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19hc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19hc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYzUxZGUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfcmVwb3J0Lmh0bWwKQEAgLTAsMCArMSwxMzkgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IHVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQgQ2xhc3MgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQgQ2xhc3MgUmVmZXJlbmNlPC9oMT5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYXNzZXJ0aW9uU3RhdHVzUmVwb3J0Ii4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7dWRkaV92Mi5oJmd0OzwvY29kZT4NCis8cD4NCis8YSBocmVmPSJjbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfcmVwb3J0LW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXNzZXJ0aW9uX3N0YXR1c19pdGVtLmh0bWwiPnVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtPC9hPiAqICZndDsmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sI28wIj5hc3NlcnRpb25TdGF0dXNJdGVtPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5WZWN0b3Igb2YgdWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW0qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gIDxhIGhyZWY9IiNvMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfcmVwb3J0Lmh0bWwjbzEiPmdlbmVyaWM8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nLiAgPGEgaHJlZj0iI28xIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXNzZXJ0aW9uX3N0YXR1c19yZXBvcnQuaHRtbCNvMiI+b3BlcmF0b3JfPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgb3BlcmF0b3Igb2YgdHlwZSB4czpzdHJpbmcuICA8YSBocmVmPSIjbzIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXNzZXJ0aW9uX3N0YXR1c19yZXBvcnQuaHRtbCNvMyI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfcmVwb3J0Lmh0bWwjbzMiPnNvYXA8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiAgPGEgaHJlZj0iI28zIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzxocj48YSBuYW1lPSJfZGV0YWlscyI+PC9hPjxoMj5EZXRhaWxlZCBEZXNjcmlwdGlvbjwvaDI+DQorU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImFzc2VydGlvblN0YXR1c1JlcG9ydCIuIA0KKzxwPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQ6OmFzc2VydGlvblN0YXR1c0l0ZW0iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RkOjp2ZWN0b3ImbHQ7PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfaXRlbS5odG1sIj51ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbTwvYT4qJmd0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXNzZXJ0aW9uX3N0YXR1c19yZXBvcnQuaHRtbCNvMCI+dWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydDo6YXNzZXJ0aW9uU3RhdHVzSXRlbTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitWZWN0b3Igb2YgdWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW0qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9InVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQ6OmdlbmVyaWMiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfcmVwb3J0Lmh0bWwjbzEiPnVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQ6OmdlbmVyaWM8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcuIA0KKzxwPg0KK1JlcXVpcmVkIGF0dHJpYnV0ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMiIgZG94eXRhZz0idWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydDo6b3BlcmF0b3JfIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sI28yIj51ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0OjpvcGVyYXRvcl88L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIG9wZXJhdG9yIG9mIHR5cGUgeHM6c3RyaW5nLiANCis8cD4NCitSZXF1aXJlZCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzMiIGRveHl0YWc9InVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQ6OnNvYXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sI28zIj5zb2FwPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfcmVwb3J0Lmh0bWwjbzMiPnVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQ6OnNvYXA8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3VkZGkyLzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCI+dWRkaV92Mi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTggMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19hdXRoX3Rva2VuLW1lbWJlcnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYXV0aF90b2tlbi1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFhYmU4NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYXV0aF90b2tlbi1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwxNyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX2F1dGhUb2tlbiBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXV0aF90b2tlbi5odG1sIj51ZGRpMl9fYXV0aFRva2VuPC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXV0aF90b2tlbi5odG1sI28wIj5hdXRoSW5mbzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXV0aF90b2tlbi5odG1sIj51ZGRpMl9fYXV0aFRva2VuPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hdXRoX3Rva2VuLmh0bWwjbzEiPmdlbmVyaWM8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2F1dGhfdG9rZW4uaHRtbCI+dWRkaTJfX2F1dGhUb2tlbjwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXV0aF90b2tlbi5odG1sI28yIj5vcGVyYXRvcl88L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2F1dGhfdG9rZW4uaHRtbCI+dWRkaTJfX2F1dGhUb2tlbjwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXV0aF90b2tlbi5odG1sI28zIj5zb2FwPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hdXRoX3Rva2VuLmh0bWwiPnVkZGkyX19hdXRoVG9rZW48L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTggMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19hdXRoX3Rva2VuLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2F1dGhfdG9rZW4uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGJmN2YyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19hdXRoX3Rva2VuLmh0bWwKQEAgLTAsMCArMSwxMzkgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IHVkZGkyX19hdXRoVG9rZW4gQ2xhc3MgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19hdXRoVG9rZW4gQ2xhc3MgUmVmZXJlbmNlPC9oMT5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYXV0aFRva2VuIi4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7dWRkaV92Mi5oJmd0OzwvY29kZT4NCis8cD4NCis8YSBocmVmPSJjbGFzc3VkZGkyX19fX2F1dGhfdG9rZW4tbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXV0aF90b2tlbi5odG1sI28wIj5hdXRoSW5mbzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+RWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmF1dGhJbmZvLiAgPGEgaHJlZj0iI28wIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXV0aF90b2tlbi5odG1sI28xIj5nZW5lcmljPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZy4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2F1dGhfdG9rZW4uaHRtbCNvMiI+b3BlcmF0b3JfPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgb3BlcmF0b3Igb2YgdHlwZSB4czpzdHJpbmcuICA8YSBocmVmPSIjbzIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXV0aF90b2tlbi5odG1sI28zIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXV0aF90b2tlbi5odG1sI28zIj5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvMyI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJhdXRoVG9rZW4iLiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJ1ZGRpMl9fYXV0aFRva2VuOjphdXRoSW5mbyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXV0aF90b2tlbi5odG1sI28wIj51ZGRpMl9fYXV0aFRva2VuOjphdXRoSW5mbzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YXV0aEluZm8uIA0KKzxwPg0KK1JlcXVpcmVkIGVsZW1lbnQgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9InVkZGkyX19hdXRoVG9rZW46OmdlbmVyaWMiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2F1dGhfdG9rZW4uaHRtbCNvMSI+dWRkaTJfX2F1dGhUb2tlbjo6Z2VuZXJpYzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZy4gDQorPHA+DQorUmVxdWlyZWQgYXR0cmlidXRlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJ1ZGRpMl9fYXV0aFRva2VuOjpvcGVyYXRvcl8iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2F1dGhfdG9rZW4uaHRtbCNvMiI+dWRkaTJfX2F1dGhUb2tlbjo6b3BlcmF0b3JfPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSBvcGVyYXRvciBvZiB0eXBlIHhzOnN0cmluZy4gDQorPHA+DQorUmVxdWlyZWQgYXR0cmlidXRlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8zIiBkb3h5dGFnPSJ1ZGRpMl9fYXV0aFRva2VuOjpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXV0aF90b2tlbi5odG1sI28zIj5zb2FwPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2F1dGhfdG9rZW4uaHRtbCNvMyI+dWRkaTJfX2F1dGhUb2tlbjo6c29hcDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvdWRkaTIvPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sIj51ZGRpX3YyLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNjo1OCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2JpbmRpbmdfZGV0YWlsLW1lbWJlcnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYmluZGluZ19kZXRhaWwtbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NjI2Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2JpbmRpbmdfZGV0YWlsLW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDE4IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fYmluZGluZ0RldGFpbCBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ19kZXRhaWwuaHRtbCI+dWRkaTJfX2JpbmRpbmdEZXRhaWw8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX2RldGFpbC5odG1sI28wIj5iaW5kaW5nVGVtcGxhdGU8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfZGV0YWlsLmh0bWwiPnVkZGkyX19iaW5kaW5nRGV0YWlsPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX2RldGFpbC5odG1sI28xIj5nZW5lcmljPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX2RldGFpbC5odG1sIj51ZGRpMl9fYmluZGluZ0RldGFpbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ19kZXRhaWwuaHRtbCNvMiI+b3BlcmF0b3JfPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX2RldGFpbC5odG1sIj51ZGRpMl9fYmluZGluZ0RldGFpbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ19kZXRhaWwuaHRtbCNvNCI+c29hcDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ19kZXRhaWwuaHRtbCI+dWRkaTJfX2JpbmRpbmdEZXRhaWw8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfZGV0YWlsLmh0bWwjbzMiPnRydW5jYXRlZDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ19kZXRhaWwuaHRtbCI+dWRkaTJfX2JpbmRpbmdEZXRhaWw8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTggMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19iaW5kaW5nX2RldGFpbC5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19iaW5kaW5nX2RldGFpbC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOWJmNzkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2JpbmRpbmdfZGV0YWlsLmh0bWwKQEAgLTAsMCArMSwxNjcgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IHVkZGkyX19iaW5kaW5nRGV0YWlsIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fYmluZGluZ0RldGFpbCBDbGFzcyBSZWZlcmVuY2U8L2gxPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJiaW5kaW5nRGV0YWlsIi4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7dWRkaV92Mi5oJmd0OzwvY29kZT4NCis8cD4NCis8YSBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfZGV0YWlsLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZS5odG1sIj51ZGRpMl9fYmluZGluZ1RlbXBsYXRlPC9hPiAqICZndDsmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX2RldGFpbC5odG1sI28wIj5iaW5kaW5nVGVtcGxhdGU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlZlY3RvciBvZiB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQuICA8YSBocmVmPSIjbzAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX2RldGFpbC5odG1sI28xIj5nZW5lcmljPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZy4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfZGV0YWlsLmh0bWwjbzIiPm9wZXJhdG9yXzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIG9wZXJhdG9yIG9mIHR5cGUgeHM6c3RyaW5nLiAgPGEgaHJlZj0iI28yIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+ZW51bSA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQ4Ij51ZGRpMl9fdHJ1bmNhdGVkPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ19kZXRhaWwuaHRtbCNvMyI+dHJ1bmNhdGVkPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgdHJ1bmNhdGVkIG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRydW5jYXRlZC4gIDxhIGhyZWY9IiNvMyI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX2RldGFpbC5odG1sI280Ij5zb2FwPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ19kZXRhaWwuaHRtbCNvNCI+c29hcDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuICA8YSBocmVmPSIjbzQiPjwvYT48YnI+PC90ZD48L3RyPg0KKzwvdGFibGU+DQorPGhyPjxhIG5hbWU9Il9kZXRhaWxzIj48L2E+PGgyPkRldGFpbGVkIERlc2NyaXB0aW9uPC9oMj4NCitTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYmluZGluZ0RldGFpbCIuIA0KKzxwPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InVkZGkyX19iaW5kaW5nRGV0YWlsOjpiaW5kaW5nVGVtcGxhdGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RkOjp2ZWN0b3ImbHQ7PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGUuaHRtbCI+dWRkaTJfX2JpbmRpbmdUZW1wbGF0ZTwvYT4qJmd0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ19kZXRhaWwuaHRtbCNvMCI+dWRkaTJfX2JpbmRpbmdEZXRhaWw6OmJpbmRpbmdUZW1wbGF0ZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitWZWN0b3Igb2YgdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0idWRkaTJfX2JpbmRpbmdEZXRhaWw6OmdlbmVyaWMiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfZGV0YWlsLmh0bWwjbzEiPnVkZGkyX19iaW5kaW5nRGV0YWlsOjpnZW5lcmljPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nLiANCis8cD4NCitSZXF1aXJlZCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9InVkZGkyX19iaW5kaW5nRGV0YWlsOjpvcGVyYXRvcl8iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfZGV0YWlsLmh0bWwjbzIiPnVkZGkyX19iaW5kaW5nRGV0YWlsOjpvcGVyYXRvcl88L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIG9wZXJhdG9yIG9mIHR5cGUgeHM6c3RyaW5nLiANCis8cD4NCitSZXF1aXJlZCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzQiIGRveHl0YWc9InVkZGkyX19iaW5kaW5nRGV0YWlsOjpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ19kZXRhaWwuaHRtbCNvNCI+c29hcDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX2RldGFpbC5odG1sI280Ij51ZGRpMl9fYmluZGluZ0RldGFpbDo6c29hcDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzMiIGRveHl0YWc9InVkZGkyX19iaW5kaW5nRGV0YWlsOjp0cnVuY2F0ZWQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gZW51bSA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQ4Ij51ZGRpMl9fdHJ1bmNhdGVkPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfZGV0YWlsLmh0bWwjbzMiPnVkZGkyX19iaW5kaW5nRGV0YWlsOjp0cnVuY2F0ZWQ8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIHRydW5jYXRlZCBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0cnVuY2F0ZWQuIA0KKzxwPg0KK09wdGlvbmFsIGF0dHJpYnV0ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU4IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZS1tZW1iZXJzLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGUtbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyODVlZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGUtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMjAgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19iaW5kaW5nVGVtcGxhdGUgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGUuaHRtbCI+dWRkaTJfX2JpbmRpbmdUZW1wbGF0ZTwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGUuaHRtbCNvMiI+YWNjZXNzUG9pbnQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGUuaHRtbCI+dWRkaTJfX2JpbmRpbmdUZW1wbGF0ZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZS5odG1sI281Ij5iaW5kaW5nS2V5PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX3RlbXBsYXRlLmh0bWwiPnVkZGkyX19iaW5kaW5nVGVtcGxhdGU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGUuaHRtbCNvMCI+ZGVzY3JpcHRpb248L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGUuaHRtbCI+dWRkaTJfX2JpbmRpbmdUZW1wbGF0ZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZS5odG1sI28zIj5ob3N0aW5nUmVkaXJlY3RvcjwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZS5odG1sIj51ZGRpMl9fYmluZGluZ1RlbXBsYXRlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX3RlbXBsYXRlLmh0bWwjbzQiPnNlcnZpY2VLZXk8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGUuaHRtbCI+dWRkaTJfX2JpbmRpbmdUZW1wbGF0ZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZS5odG1sI282Ij5zb2FwPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX3RlbXBsYXRlLmh0bWwiPnVkZGkyX19iaW5kaW5nVGVtcGxhdGU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGUuaHRtbCNvMSI+dE1vZGVsSW5zdGFuY2VEZXRhaWxzPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX3RlbXBsYXRlLmh0bWwiPnVkZGkyX19iaW5kaW5nVGVtcGxhdGU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTggMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19iaW5kaW5nX3RlbXBsYXRlLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWY4YjgyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19iaW5kaW5nX3RlbXBsYXRlLmh0bWwKQEAgLTAsMCArMSwyMjMgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IHVkZGkyX19iaW5kaW5nVGVtcGxhdGUgQ2xhc3MgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19iaW5kaW5nVGVtcGxhdGUgQ2xhc3MgUmVmZXJlbmNlPC9oMT5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYmluZGluZ1RlbXBsYXRlIi4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7dWRkaV92Mi5oJmd0OzwvY29kZT4NCis8cD4NCis8YSBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGUtbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c3RkOjp2ZWN0b3ImbHQ7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZXNjcmlwdGlvbi5odG1sIj51ZGRpMl9fZGVzY3JpcHRpb248L2E+ICogJmd0OyZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGUuaHRtbCNvMCI+ZGVzY3JpcHRpb248L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlZlY3RvciBvZiB1ZGRpMl9fZGVzY3JpcHRpb24qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gIDxhIGhyZWY9IiNvMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luc3RhbmNlX2RldGFpbHMuaHRtbCI+dWRkaTJfX3RNb2RlbEluc3RhbmNlRGV0YWlsczwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGUuaHRtbCNvMSI+dE1vZGVsSW5zdGFuY2VEZXRhaWxzPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5SZXF1aXJlZCBlbGVtZW50LiAgPGEgaHJlZj0iI28xIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FjY2Vzc19wb2ludC5odG1sIj51ZGRpMl9fYWNjZXNzUG9pbnQ8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX3RlbXBsYXRlLmh0bWwjbzIiPmFjY2Vzc1BvaW50PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5FbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YWNjZXNzUG9pbnQuICA8YSBocmVmPSIjbzIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19faG9zdGluZ19yZWRpcmVjdG9yLmh0bWwiPnVkZGkyX19ob3N0aW5nUmVkaXJlY3RvcjwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGUuaHRtbCNvMyI+aG9zdGluZ1JlZGlyZWN0b3I8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlJlcXVpcmVkIGVsZW1lbnQuICA8YSBocmVmPSIjbzMiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQiPnVkZGkyX19zZXJ2aWNlS2V5PC9hPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGUuaHRtbCNvNCI+c2VydmljZUtleTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIHNlcnZpY2VLZXkgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6c2VydmljZUtleS4gIDxhIGhyZWY9IiNvNCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMiI+dWRkaTJfX2JpbmRpbmdLZXk8L2E+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZS5odG1sI281Ij5iaW5kaW5nS2V5PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgYmluZGluZ0tleSBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpiaW5kaW5nS2V5LiAgPGEgaHJlZj0iI281Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGUuaHRtbCNvNiI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGUuaHRtbCNvNiI+c29hcDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuICA8YSBocmVmPSIjbzYiPjwvYT48YnI+PC90ZD48L3RyPg0KKzwvdGFibGU+DQorPGhyPjxhIG5hbWU9Il9kZXRhaWxzIj48L2E+PGgyPkRldGFpbGVkIERlc2NyaXB0aW9uPC9oMj4NCitTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYmluZGluZ1RlbXBsYXRlIi4gDQorPHA+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMiIgZG94eXRhZz0idWRkaTJfX2JpbmRpbmdUZW1wbGF0ZTo6YWNjZXNzUG9pbnQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FjY2Vzc19wb2ludC5odG1sIj51ZGRpMl9fYWNjZXNzUG9pbnQ8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZS5odG1sI28yIj51ZGRpMl9fYmluZGluZ1RlbXBsYXRlOjphY2Nlc3NQb2ludDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YWNjZXNzUG9pbnQuIA0KKzxwPg0KK1JlcXVpcmVkIGVsZW1lbnQgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzUiIGRveHl0YWc9InVkZGkyX19iaW5kaW5nVGVtcGxhdGU6OmJpbmRpbmdLZXkiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EyIj51ZGRpMl9fYmluZGluZ0tleTwvYT4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGUuaHRtbCNvNSI+dWRkaTJfX2JpbmRpbmdUZW1wbGF0ZTo6YmluZGluZ0tleTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgYmluZGluZ0tleSBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpiaW5kaW5nS2V5LiANCis8cD4NCitSZXF1aXJlZCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InVkZGkyX19iaW5kaW5nVGVtcGxhdGU6OmRlc2NyaXB0aW9uIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0ZDo6dmVjdG9yJmx0OzxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZXNjcmlwdGlvbi5odG1sIj51ZGRpMl9fZGVzY3JpcHRpb248L2E+KiAmZ3Q7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX3RlbXBsYXRlLmh0bWwjbzAiPnVkZGkyX19iaW5kaW5nVGVtcGxhdGU6OmRlc2NyaXB0aW9uPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1ZlY3RvciBvZiB1ZGRpMl9fZGVzY3JpcHRpb24qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzMiIGRveHl0YWc9InVkZGkyX19iaW5kaW5nVGVtcGxhdGU6Omhvc3RpbmdSZWRpcmVjdG9yIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19ob3N0aW5nX3JlZGlyZWN0b3IuaHRtbCI+dWRkaTJfX2hvc3RpbmdSZWRpcmVjdG9yPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGUuaHRtbCNvMyI+dWRkaTJfX2JpbmRpbmdUZW1wbGF0ZTo6aG9zdGluZ1JlZGlyZWN0b3I8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorUmVxdWlyZWQgZWxlbWVudC4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzQiIGRveHl0YWc9InVkZGkyX19iaW5kaW5nVGVtcGxhdGU6OnNlcnZpY2VLZXkiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0Ij51ZGRpMl9fc2VydmljZUtleTwvYT4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGUuaHRtbCNvNCI+dWRkaTJfX2JpbmRpbmdUZW1wbGF0ZTo6c2VydmljZUtleTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgc2VydmljZUtleSBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpzZXJ2aWNlS2V5LiANCis8cD4NCitPcHRpb25hbCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzYiIGRveHl0YWc9InVkZGkyX19iaW5kaW5nVGVtcGxhdGU6OnNvYXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX3RlbXBsYXRlLmh0bWwjbzYiPnNvYXA8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZS5odG1sI282Ij51ZGRpMl9fYmluZGluZ1RlbXBsYXRlOjpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0idWRkaTJfX2JpbmRpbmdUZW1wbGF0ZTo6dE1vZGVsSW5zdGFuY2VEZXRhaWxzIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luc3RhbmNlX2RldGFpbHMuaHRtbCI+dWRkaTJfX3RNb2RlbEluc3RhbmNlRGV0YWlsczwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX3RlbXBsYXRlLmh0bWwjbzEiPnVkZGkyX19iaW5kaW5nVGVtcGxhdGU6OnRNb2RlbEluc3RhbmNlRGV0YWlsczwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitSZXF1aXJlZCBlbGVtZW50LiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU4IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZXMtbWVtYmVycy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19iaW5kaW5nX3RlbXBsYXRlcy1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I0N2YyNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZXMtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19iaW5kaW5nVGVtcGxhdGVzIE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX3RlbXBsYXRlcy5odG1sIj51ZGRpMl9fYmluZGluZ1RlbXBsYXRlczwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGVzLmh0bWwjbzAiPmJpbmRpbmdUZW1wbGF0ZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZXMuaHRtbCI+dWRkaTJfX2JpbmRpbmdUZW1wbGF0ZXM8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGVzLmh0bWwjbzEiPnNvYXA8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGVzLmh0bWwiPnVkZGkyX19iaW5kaW5nVGVtcGxhdGVzPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU4IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZXMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZXMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTMyM2FjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19iaW5kaW5nX3RlbXBsYXRlcy5odG1sCkBAIC0wLDAgKzEsODMgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IHVkZGkyX19iaW5kaW5nVGVtcGxhdGVzIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fYmluZGluZ1RlbXBsYXRlcyBDbGFzcyBSZWZlcmVuY2U8L2gxPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJiaW5kaW5nVGVtcGxhdGVzIi4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7dWRkaV92Mi5oJmd0OzwvY29kZT4NCis8cD4NCis8YSBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGVzLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZS5odG1sIj51ZGRpMl9fYmluZGluZ1RlbXBsYXRlPC9hPiAqICZndDsmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX3RlbXBsYXRlcy5odG1sI28wIj5iaW5kaW5nVGVtcGxhdGU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlZlY3RvciBvZiB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQuICA8YSBocmVmPSIjbzAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZXMuaHRtbCNvMSI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGVzLmh0bWwjbzEiPnNvYXA8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiAgPGEgaHJlZj0iI28xIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzxocj48YSBuYW1lPSJfZGV0YWlscyI+PC9hPjxoMj5EZXRhaWxlZCBEZXNjcmlwdGlvbjwvaDI+DQorU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImJpbmRpbmdUZW1wbGF0ZXMiLiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJ1ZGRpMl9fYmluZGluZ1RlbXBsYXRlczo6YmluZGluZ1RlbXBsYXRlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0ZDo6dmVjdG9yJmx0OzxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX3RlbXBsYXRlLmh0bWwiPnVkZGkyX19iaW5kaW5nVGVtcGxhdGU8L2E+KiZndDsgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGVzLmh0bWwjbzAiPnVkZGkyX19iaW5kaW5nVGVtcGxhdGVzOjpiaW5kaW5nVGVtcGxhdGU8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVmVjdG9yIG9mIHVkZGkyX19iaW5kaW5nVGVtcGxhdGUqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9InVkZGkyX19iaW5kaW5nVGVtcGxhdGVzOjpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZXMuaHRtbCNvMSI+c29hcDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX3RlbXBsYXRlcy5odG1sI28xIj51ZGRpMl9fYmluZGluZ1RlbXBsYXRlczo6c29hcDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvdWRkaTIvPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sIj51ZGRpX3YyLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNjo1OCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2J1c2luZXNzX2RldGFpbC1tZW1iZXJzLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2J1c2luZXNzX2RldGFpbC1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ2MzhhNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsLW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDE4IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fYnVzaW5lc3NEZXRhaWwgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2RldGFpbC5odG1sIj51ZGRpMl9fYnVzaW5lc3NEZXRhaWw8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWwuaHRtbCNvMCI+YnVzaW5lc3NFbnRpdHk8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2RldGFpbC5odG1sIj51ZGRpMl9fYnVzaW5lc3NEZXRhaWw8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2RldGFpbC5odG1sI28xIj5nZW5lcmljPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWwuaHRtbCI+dWRkaTJfX2J1c2luZXNzRGV0YWlsPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWwuaHRtbCNvMiI+b3BlcmF0b3JfPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWwuaHRtbCI+dWRkaTJfX2J1c2luZXNzRGV0YWlsPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWwuaHRtbCNvNCI+c29hcDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsLmh0bWwiPnVkZGkyX19idXNpbmVzc0RldGFpbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsLmh0bWwjbzMiPnRydW5jYXRlZDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsLmh0bWwiPnVkZGkyX19idXNpbmVzc0RldGFpbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNjo1OCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2J1c2luZXNzX2RldGFpbC5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWwuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTg5YTdlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWwuaHRtbApAQCAtMCwwICsxLDE2NyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogdWRkaTJfX2J1c2luZXNzRGV0YWlsIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fYnVzaW5lc3NEZXRhaWwgQ2xhc3MgUmVmZXJlbmNlPC9oMT5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYnVzaW5lc3NEZXRhaWwiLiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KKzxjb2RlPiNpbmNsdWRlICZsdDt1ZGRpX3YyLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KKzxhIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5Lmh0bWwiPnVkZGkyX19idXNpbmVzc0VudGl0eTwvYT4gKiAmZ3Q7Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsLmh0bWwjbzAiPmJ1c2luZXNzRW50aXR5PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5WZWN0b3Igb2YgdWRkaTJfX2J1c2luZXNzRW50aXR5KiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQuICA8YSBocmVmPSIjbzAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWwuaHRtbCNvMSI+Z2VuZXJpYzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcuICA8YSBocmVmPSIjbzEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWwuaHRtbCNvMiI+b3BlcmF0b3JfPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgb3BlcmF0b3Igb2YgdHlwZSB4czpzdHJpbmcuICA8YSBocmVmPSIjbzIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5lbnVtIDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNDgiPnVkZGkyX190cnVuY2F0ZWQ8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWwuaHRtbCNvMyI+dHJ1bmNhdGVkPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgdHJ1bmNhdGVkIG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRydW5jYXRlZC4gIDxhIGhyZWY9IiNvMyI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWwuaHRtbCNvNCI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2RldGFpbC5odG1sI280Ij5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvNCI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJidXNpbmVzc0RldGFpbCIuIA0KKzxwPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InVkZGkyX19idXNpbmVzc0RldGFpbDo6YnVzaW5lc3NFbnRpdHkiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RkOjp2ZWN0b3ImbHQ7PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eS5odG1sIj51ZGRpMl9fYnVzaW5lc3NFbnRpdHk8L2E+KiAmZ3Q7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWwuaHRtbCNvMCI+dWRkaTJfX2J1c2luZXNzRGV0YWlsOjpidXNpbmVzc0VudGl0eTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitWZWN0b3Igb2YgdWRkaTJfX2J1c2luZXNzRW50aXR5KiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJ1ZGRpMl9fYnVzaW5lc3NEZXRhaWw6OmdlbmVyaWMiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2RldGFpbC5odG1sI28xIj51ZGRpMl9fYnVzaW5lc3NEZXRhaWw6OmdlbmVyaWM8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcuIA0KKzxwPg0KK1JlcXVpcmVkIGF0dHJpYnV0ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMiIgZG94eXRhZz0idWRkaTJfX2J1c2luZXNzRGV0YWlsOjpvcGVyYXRvcl8iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2RldGFpbC5odG1sI28yIj51ZGRpMl9fYnVzaW5lc3NEZXRhaWw6Om9wZXJhdG9yXzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgb3BlcmF0b3Igb2YgdHlwZSB4czpzdHJpbmcuIA0KKzxwPg0KK1JlcXVpcmVkIGF0dHJpYnV0ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNCIgZG94eXRhZz0idWRkaTJfX2J1c2luZXNzRGV0YWlsOjpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsLmh0bWwjbzQiPnNvYXA8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsLmh0bWwjbzQiPnVkZGkyX19idXNpbmVzc0RldGFpbDo6c29hcDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzMiIGRveHl0YWc9InVkZGkyX19idXNpbmVzc0RldGFpbDo6dHJ1bmNhdGVkIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGVudW0gPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0OCI+dWRkaTJfX3RydW5jYXRlZDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWwuaHRtbCNvMyI+dWRkaTJfX2J1c2luZXNzRGV0YWlsOjp0cnVuY2F0ZWQ8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIHRydW5jYXRlZCBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0cnVuY2F0ZWQuIA0KKzxwPg0KK09wdGlvbmFsIGF0dHJpYnV0ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU4IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsX2V4dC1tZW1iZXJzLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2J1c2luZXNzX2RldGFpbF9leHQtbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZTE2MWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2J1c2luZXNzX2RldGFpbF9leHQtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTggQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19idXNpbmVzc0RldGFpbEV4dCBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsX2V4dC5odG1sIj51ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHQ8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwjbzAiPmJ1c2luZXNzRW50aXR5RXh0PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwiPnVkZGkyX19idXNpbmVzc0RldGFpbEV4dDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsX2V4dC5odG1sI28xIj5nZW5lcmljPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwiPnVkZGkyX19idXNpbmVzc0RldGFpbEV4dDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsX2V4dC5odG1sI28yIj5vcGVyYXRvcl88L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2RldGFpbF9leHQuaHRtbCI+dWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwjbzQiPnNvYXA8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2RldGFpbF9leHQuaHRtbCI+dWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwjbzMiPnRydW5jYXRlZDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsX2V4dC5odG1sIj51ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHQ8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTggMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2J1c2luZXNzX2RldGFpbF9leHQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmI4OWU1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwKQEAgLTAsMCArMSwxNjcgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IHVkZGkyX19idXNpbmVzc0RldGFpbEV4dCBDbGFzcyBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0IENsYXNzIFJlZmVyZW5jZTwvaDE+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImJ1c2luZXNzRGV0YWlsRXh0Ii4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7dWRkaV92Mi5oJmd0OzwvY29kZT4NCis8cD4NCis8YSBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2RldGFpbF9leHQtbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c3RkOjp2ZWN0b3ImbHQ7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHlfZXh0Lmh0bWwiPnVkZGkyX19idXNpbmVzc0VudGl0eUV4dDwvYT4gKiAmZ3Q7Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsX2V4dC5odG1sI28wIj5idXNpbmVzc0VudGl0eUV4dDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VmVjdG9yIG9mIHVkZGkyX19idXNpbmVzc0VudGl0eUV4dCogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiAgPGEgaHJlZj0iI28wIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsX2V4dC5odG1sI28xIj5nZW5lcmljPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZy4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2RldGFpbF9leHQuaHRtbCNvMiI+b3BlcmF0b3JfPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgb3BlcmF0b3Igb2YgdHlwZSB4czpzdHJpbmcuICA8YSBocmVmPSIjbzIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5lbnVtIDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNDgiPnVkZGkyX190cnVuY2F0ZWQ8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwjbzMiPnRydW5jYXRlZDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIHRydW5jYXRlZCBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0cnVuY2F0ZWQuICA8YSBocmVmPSIjbzMiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsX2V4dC5odG1sI280Ij5zb2FwPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsX2V4dC5odG1sI280Ij5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvNCI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJidXNpbmVzc0RldGFpbEV4dCIuIA0KKzxwPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InVkZGkyX19idXNpbmVzc0RldGFpbEV4dDo6YnVzaW5lc3NFbnRpdHlFeHQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RkOjp2ZWN0b3ImbHQ7PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eV9leHQuaHRtbCI+dWRkaTJfX2J1c2luZXNzRW50aXR5RXh0PC9hPiomZ3Q7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwjbzAiPnVkZGkyX19idXNpbmVzc0RldGFpbEV4dDo6YnVzaW5lc3NFbnRpdHlFeHQ8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVmVjdG9yIG9mIHVkZGkyX19idXNpbmVzc0VudGl0eUV4dCogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0idWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0OjpnZW5lcmljIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwjbzEiPnVkZGkyX19idXNpbmVzc0RldGFpbEV4dDo6Z2VuZXJpYzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZy4gDQorPHA+DQorUmVxdWlyZWQgYXR0cmlidXRlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJ1ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHQ6Om9wZXJhdG9yXyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsX2V4dC5odG1sI28yIj51ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHQ6Om9wZXJhdG9yXzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgb3BlcmF0b3Igb2YgdHlwZSB4czpzdHJpbmcuIA0KKzxwPg0KK1JlcXVpcmVkIGF0dHJpYnV0ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNCIgZG94eXRhZz0idWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0Ojpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsX2V4dC5odG1sI280Ij5zb2FwPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2RldGFpbF9leHQuaHRtbCNvNCI+dWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0Ojpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMyIgZG94eXRhZz0idWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0Ojp0cnVuY2F0ZWQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gZW51bSA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQ4Ij51ZGRpMl9fdHJ1bmNhdGVkPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2RldGFpbF9leHQuaHRtbCNvMyI+dWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0Ojp0cnVuY2F0ZWQ8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIHRydW5jYXRlZCBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0cnVuY2F0ZWQuIA0KKzxwPg0KK09wdGlvbmFsIGF0dHJpYnV0ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU4IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5LW1lbWJlcnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5LW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjljNDc1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHktbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMjQgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19idXNpbmVzc0VudGl0eSBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5Lmh0bWwiPnVkZGkyX19idXNpbmVzc0VudGl0eTwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eS5odG1sI285Ij5hdXRob3JpemVkTmFtZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5Lmh0bWwiPnVkZGkyX19idXNpbmVzc0VudGl0eTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5Lmh0bWwjbzciPmJ1c2luZXNzS2V5PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHkuaHRtbCI+dWRkaTJfX2J1c2luZXNzRW50aXR5PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHkuaHRtbCNvNCI+YnVzaW5lc3NTZXJ2aWNlczwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5Lmh0bWwiPnVkZGkyX19idXNpbmVzc0VudGl0eTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5Lmh0bWwjbzYiPmNhdGVnb3J5QmFnPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHkuaHRtbCI+dWRkaTJfX2J1c2luZXNzRW50aXR5PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHkuaHRtbCNvMyI+Y29udGFjdHM8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eS5odG1sIj51ZGRpMl9fYnVzaW5lc3NFbnRpdHk8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eS5odG1sI28yIj5kZXNjcmlwdGlvbjwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5Lmh0bWwiPnVkZGkyX19idXNpbmVzc0VudGl0eTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5Lmh0bWwjbzAiPmRpc2NvdmVyeVVSTHM8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eS5odG1sIj51ZGRpMl9fYnVzaW5lc3NFbnRpdHk8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eS5odG1sI281Ij5pZGVudGlmaWVyQmFnPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHkuaHRtbCI+dWRkaTJfX2J1c2luZXNzRW50aXR5PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHkuaHRtbCNvMSI+bmFtZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5Lmh0bWwiPnVkZGkyX19idXNpbmVzc0VudGl0eTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5Lmh0bWwjbzgiPm9wZXJhdG9yXzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5Lmh0bWwiPnVkZGkyX19idXNpbmVzc0VudGl0eTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5Lmh0bWwjbzEwIj5zb2FwPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHkuaHRtbCI+dWRkaTJfX2J1c2luZXNzRW50aXR5PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU4IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5Lmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMzU1NTYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eS5odG1sCkBAIC0wLDAgKzEsMzM1IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiB1ZGRpMl9fYnVzaW5lc3NFbnRpdHkgQ2xhc3MgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19idXNpbmVzc0VudGl0eSBDbGFzcyBSZWZlcmVuY2U8L2gxPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJidXNpbmVzc0VudGl0eSIuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3VkZGlfdjIuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHktbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NvdmVyeV91X3JfbHMuaHRtbCI+dWRkaTJfX2Rpc2NvdmVyeVVSTHM8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHkuaHRtbCNvMCI+ZGlzY292ZXJ5VVJMczwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+RWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmRpc2NvdmVyeVVSTHMuICA8YSBocmVmPSIjbzAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zdGQ6OnZlY3RvciZsdDsgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX25hbWUuaHRtbCI+dWRkaTJfX25hbWU8L2E+ICogJmd0OyZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eS5odG1sI28xIj5uYW1lPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5WZWN0b3Igb2YgdWRkaTJfX25hbWUqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVzY3JpcHRpb24uaHRtbCI+dWRkaTJfX2Rlc2NyaXB0aW9uPC9hPiAqICZndDsmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHkuaHRtbCNvMiI+ZGVzY3JpcHRpb248L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlZlY3RvciBvZiB1ZGRpMl9fZGVzY3JpcHRpb24qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gIDxhIGhyZWY9IiNvMiI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19jb250YWN0cy5odG1sIj51ZGRpMl9fY29udGFjdHM8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHkuaHRtbCNvMyI+Y29udGFjdHM8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpjb250YWN0cy4gIDxhIGhyZWY9IiNvMyI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlcy5odG1sIj51ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlczwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eS5odG1sI280Ij5idXNpbmVzc1NlcnZpY2VzPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5FbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YnVzaW5lc3NTZXJ2aWNlcy4gIDxhIGhyZWY9IiNvNCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19pZGVudGlmaWVyX2JhZy5odG1sIj51ZGRpMl9faWRlbnRpZmllckJhZzwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eS5odG1sI281Ij5pZGVudGlmaWVyQmFnPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5FbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6aWRlbnRpZmllckJhZy4gIDxhIGhyZWY9IiNvNSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19jYXRlZ29yeV9iYWcuaHRtbCI+dWRkaTJfX2NhdGVnb3J5QmFnPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5Lmh0bWwjbzYiPmNhdGVnb3J5QmFnPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5FbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6Y2F0ZWdvcnlCYWcuICA8YSBocmVmPSIjbzYiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTMiPnVkZGkyX19idXNpbmVzc0tleTwvYT4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHkuaHRtbCNvNyI+YnVzaW5lc3NLZXk8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkF0dHJpYnV0ZSBidXNpbmVzc0tleSBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpidXNpbmVzc0tleS4gIDxhIGhyZWY9IiNvNyI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eS5odG1sI284Ij5vcGVyYXRvcl88L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkF0dHJpYnV0ZSBvcGVyYXRvciBvZiB0eXBlIHhzOnN0cmluZy4gIDxhIGhyZWY9IiNvOCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eS5odG1sI285Ij5hdXRob3JpemVkTmFtZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIGF1dGhvcml6ZWROYW1lIG9mIHR5cGUgeHM6c3RyaW5nLiAgPGEgaHJlZj0iI285Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eS5odG1sI28xMCI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eS5odG1sI28xMCI+c29hcDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuICA8YSBocmVmPSIjbzEwIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzxocj48YSBuYW1lPSJfZGV0YWlscyI+PC9hPjxoMj5EZXRhaWxlZCBEZXNjcmlwdGlvbjwvaDI+DQorU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImJ1c2luZXNzRW50aXR5Ii4gDQorPHA+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvOSIgZG94eXRhZz0idWRkaTJfX2J1c2luZXNzRW50aXR5OjphdXRob3JpemVkTmFtZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5Lmh0bWwjbzkiPnVkZGkyX19idXNpbmVzc0VudGl0eTo6YXV0aG9yaXplZE5hbWU8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIGF1dGhvcml6ZWROYW1lIG9mIHR5cGUgeHM6c3RyaW5nLiANCis8cD4NCitPcHRpb25hbCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzciIGRveHl0YWc9InVkZGkyX19idXNpbmVzc0VudGl0eTo6YnVzaW5lc3NLZXkiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EzIj51ZGRpMl9fYnVzaW5lc3NLZXk8L2E+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHkuaHRtbCNvNyI+dWRkaTJfX2J1c2luZXNzRW50aXR5OjpidXNpbmVzc0tleTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgYnVzaW5lc3NLZXkgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YnVzaW5lc3NLZXkuIA0KKzxwPg0KK1JlcXVpcmVkIGF0dHJpYnV0ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNCIgZG94eXRhZz0idWRkaTJfX2J1c2luZXNzRW50aXR5OjpidXNpbmVzc1NlcnZpY2VzIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlcy5odG1sIj51ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlczwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHkuaHRtbCNvNCI+dWRkaTJfX2J1c2luZXNzRW50aXR5OjpidXNpbmVzc1NlcnZpY2VzPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0VsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpidXNpbmVzc1NlcnZpY2VzLiANCis8cD4NCitPcHRpb25hbCBlbGVtZW50ICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im82IiBkb3h5dGFnPSJ1ZGRpMl9fYnVzaW5lc3NFbnRpdHk6OmNhdGVnb3J5QmFnIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19jYXRlZ29yeV9iYWcuaHRtbCI+dWRkaTJfX2NhdGVnb3J5QmFnPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eS5odG1sI282Ij51ZGRpMl9fYnVzaW5lc3NFbnRpdHk6OmNhdGVnb3J5QmFnPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0VsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpjYXRlZ29yeUJhZy4gDQorPHA+DQorT3B0aW9uYWwgZWxlbWVudCAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMyIgZG94eXRhZz0idWRkaTJfX2J1c2luZXNzRW50aXR5Ojpjb250YWN0cyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fY29udGFjdHMuaHRtbCI+dWRkaTJfX2NvbnRhY3RzPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eS5odG1sI28zIj51ZGRpMl9fYnVzaW5lc3NFbnRpdHk6OmNvbnRhY3RzPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0VsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpjb250YWN0cy4gDQorPHA+DQorT3B0aW9uYWwgZWxlbWVudCAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMiIgZG94eXRhZz0idWRkaTJfX2J1c2luZXNzRW50aXR5OjpkZXNjcmlwdGlvbiIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdGQ6OnZlY3RvciZsdDs8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVzY3JpcHRpb24uaHRtbCI+dWRkaTJfX2Rlc2NyaXB0aW9uPC9hPiogJmd0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5Lmh0bWwjbzIiPnVkZGkyX19idXNpbmVzc0VudGl0eTo6ZGVzY3JpcHRpb248L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVmVjdG9yIG9mIHVkZGkyX19kZXNjcmlwdGlvbiogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0idWRkaTJfX2J1c2luZXNzRW50aXR5OjpkaXNjb3ZlcnlVUkxzIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjb3ZlcnlfdV9yX2xzLmh0bWwiPnVkZGkyX19kaXNjb3ZlcnlVUkxzPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eS5odG1sI28wIj51ZGRpMl9fYnVzaW5lc3NFbnRpdHk6OmRpc2NvdmVyeVVSTHM8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmRpc2NvdmVyeVVSTHMuIA0KKzxwPg0KK09wdGlvbmFsIGVsZW1lbnQgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzUiIGRveHl0YWc9InVkZGkyX19idXNpbmVzc0VudGl0eTo6aWRlbnRpZmllckJhZyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19faWRlbnRpZmllcl9iYWcuaHRtbCI+dWRkaTJfX2lkZW50aWZpZXJCYWc8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5Lmh0bWwjbzUiPnVkZGkyX19idXNpbmVzc0VudGl0eTo6aWRlbnRpZmllckJhZzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6aWRlbnRpZmllckJhZy4gDQorPHA+DQorT3B0aW9uYWwgZWxlbWVudCAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0idWRkaTJfX2J1c2luZXNzRW50aXR5OjpuYW1lIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0ZDo6dmVjdG9yJmx0OzxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19uYW1lLmh0bWwiPnVkZGkyX19uYW1lPC9hPiogJmd0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5Lmh0bWwjbzEiPnVkZGkyX19idXNpbmVzc0VudGl0eTo6bmFtZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitWZWN0b3Igb2YgdWRkaTJfX25hbWUqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzgiIGRveHl0YWc9InVkZGkyX19idXNpbmVzc0VudGl0eTo6b3BlcmF0b3JfIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHkuaHRtbCNvOCI+dWRkaTJfX2J1c2luZXNzRW50aXR5OjpvcGVyYXRvcl88L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIG9wZXJhdG9yIG9mIHR5cGUgeHM6c3RyaW5nLiANCis8cD4NCitPcHRpb25hbCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEwIiBkb3h5dGFnPSJ1ZGRpMl9fYnVzaW5lc3NFbnRpdHk6OnNvYXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHkuaHRtbCNvMTAiPnNvYXA8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5Lmh0bWwjbzEwIj51ZGRpMl9fYnVzaW5lc3NFbnRpdHk6OnNvYXA8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3VkZGkyLzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCI+dWRkaV92Mi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTggMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHlfZXh0LW1lbWJlcnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5X2V4dC1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU2NTRkOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5X2V4dC1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwxNiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX2J1c2luZXNzRW50aXR5RXh0IE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHlfZXh0Lmh0bWwiPnVkZGkyX19idXNpbmVzc0VudGl0eUV4dDwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eV9leHQuaHRtbCNvMSI+X19hbnk8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eV9leHQuaHRtbCI+dWRkaTJfX2J1c2luZXNzRW50aXR5RXh0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHlfZXh0Lmh0bWwjbzAiPmJ1c2luZXNzRW50aXR5PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHlfZXh0Lmh0bWwiPnVkZGkyX19idXNpbmVzc0VudGl0eUV4dDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5X2V4dC5odG1sI28yIj5zb2FwPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHlfZXh0Lmh0bWwiPnVkZGkyX19idXNpbmVzc0VudGl0eUV4dDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNjo1OCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eV9leHQuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5X2V4dC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZGU1YTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eV9leHQuaHRtbApAQCAtMCwwICsxLDEwOCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogdWRkaTJfX2J1c2luZXNzRW50aXR5RXh0IENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQgQ2xhc3MgUmVmZXJlbmNlPC9oMT5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYnVzaW5lc3NFbnRpdHlFeHQiLiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KKzxjb2RlPiNpbmNsdWRlICZsdDt1ZGRpX3YyLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KKzxhIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5X2V4dC1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgQXR0cmlidXRlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5Lmh0bWwiPnVkZGkyX19idXNpbmVzc0VudGl0eTwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eV9leHQuaHRtbCNvMCI+YnVzaW5lc3NFbnRpdHk8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlJlcXVpcmVkIGVsZW1lbnQuICA8YSBocmVmPSIjbzAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5fWE1MJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5X2V4dC5odG1sI28xIj5fX2FueTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHlfZXh0Lmh0bWwjbzIiPnNvYXA8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHlfZXh0Lmh0bWwjbzIiPnNvYXA8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiAgPGEgaHJlZj0iI28yIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzxocj48YSBuYW1lPSJfZGV0YWlscyI+PC9hPjxoMj5EZXRhaWxlZCBEZXNjcmlwdGlvbjwvaDI+DQorU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImJ1c2luZXNzRW50aXR5RXh0Ii4gDQorPHA+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0idWRkaTJfX2J1c2luZXNzRW50aXR5RXh0OjpfX2FueSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBfWE1MIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHlfZXh0Lmh0bWwjbzEiPnVkZGkyX19idXNpbmVzc0VudGl0eUV4dDo6X19hbnk8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQ2F0Y2ggYW55IGVsZW1lbnQgY29udGVudCBpbiBYTUwgc3RyaW5nICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJ1ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQ6OmJ1c2luZXNzRW50aXR5IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHkuaHRtbCI+dWRkaTJfX2J1c2luZXNzRW50aXR5PC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eV9leHQuaHRtbCNvMCI+dWRkaTJfX2J1c2luZXNzRW50aXR5RXh0OjpidXNpbmVzc0VudGl0eTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitSZXF1aXJlZCBlbGVtZW50LiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMiIgZG94eXRhZz0idWRkaTJfX2J1c2luZXNzRW50aXR5RXh0Ojpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5X2V4dC5odG1sI28yIj5zb2FwPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eV9leHQuaHRtbCNvMiI+dWRkaTJfX2J1c2luZXNzRW50aXR5RXh0Ojpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU4IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYnVzaW5lc3NfaW5mby1tZW1iZXJzLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2J1c2luZXNzX2luZm8tbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NDZjZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2J1c2luZXNzX2luZm8tbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTggQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19idXNpbmVzc0luZm8gTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2luZm8uaHRtbCI+dWRkaTJfX2J1c2luZXNzSW5mbzwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2luZm8uaHRtbCNvMyI+YnVzaW5lc3NLZXk8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2luZm8uaHRtbCI+dWRkaTJfX2J1c2luZXNzSW5mbzwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfaW5mby5odG1sI28xIj5kZXNjcmlwdGlvbjwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfaW5mby5odG1sIj51ZGRpMl9fYnVzaW5lc3NJbmZvPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19pbmZvLmh0bWwjbzAiPm5hbWU8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2luZm8uaHRtbCI+dWRkaTJfX2J1c2luZXNzSW5mbzwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfaW5mby5odG1sI28yIj5zZXJ2aWNlSW5mb3M8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2luZm8uaHRtbCI+dWRkaTJfX2J1c2luZXNzSW5mbzwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfaW5mby5odG1sI280Ij5zb2FwPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19pbmZvLmh0bWwiPnVkZGkyX19idXNpbmVzc0luZm88L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTggMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19idXNpbmVzc19pbmZvLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2J1c2luZXNzX2luZm8uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDE5ZjBiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19idXNpbmVzc19pbmZvLmh0bWwKQEAgLTAsMCArMSwxNjcgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IHVkZGkyX19idXNpbmVzc0luZm8gQ2xhc3MgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19idXNpbmVzc0luZm8gQ2xhc3MgUmVmZXJlbmNlPC9oMT5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYnVzaW5lc3NJbmZvIi4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7dWRkaV92Mi5oJmd0OzwvY29kZT4NCis8cD4NCis8YSBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2luZm8tbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c3RkOjp2ZWN0b3ImbHQ7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19uYW1lLmh0bWwiPnVkZGkyX19uYW1lPC9hPiAqICZndDsmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19pbmZvLmh0bWwjbzAiPm5hbWU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlZlY3RvciBvZiB1ZGRpMl9fbmFtZSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiAgPGEgaHJlZj0iI28wIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c3RkOjp2ZWN0b3ImbHQ7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZXNjcmlwdGlvbi5odG1sIj51ZGRpMl9fZGVzY3JpcHRpb248L2E+ICogJmd0OyZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2luZm8uaHRtbCNvMSI+ZGVzY3JpcHRpb248L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlZlY3RvciBvZiB1ZGRpMl9fZGVzY3JpcHRpb24qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2luZm9zLmh0bWwiPnVkZGkyX19zZXJ2aWNlSW5mb3M8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19pbmZvLmh0bWwjbzIiPnNlcnZpY2VJbmZvczwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+RWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOnNlcnZpY2VJbmZvcy4gIDxhIGhyZWY9IiNvMiI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMyI+dWRkaTJfX2J1c2luZXNzS2V5PC9hPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2luZm8uaHRtbCNvMyI+YnVzaW5lc3NLZXk8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkF0dHJpYnV0ZSBidXNpbmVzc0tleSBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpidXNpbmVzc0tleS4gIDxhIGhyZWY9IiNvMyI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19pbmZvLmh0bWwjbzQiPnNvYXA8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19pbmZvLmh0bWwjbzQiPnNvYXA8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiAgPGEgaHJlZj0iI280Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzxocj48YSBuYW1lPSJfZGV0YWlscyI+PC9hPjxoMj5EZXRhaWxlZCBEZXNjcmlwdGlvbjwvaDI+DQorU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImJ1c2luZXNzSW5mbyIuIA0KKzxwPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzMiIGRveHl0YWc9InVkZGkyX19idXNpbmVzc0luZm86OmJ1c2luZXNzS2V5IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMyI+dWRkaTJfX2J1c2luZXNzS2V5PC9hPiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfaW5mby5odG1sI28zIj51ZGRpMl9fYnVzaW5lc3NJbmZvOjpidXNpbmVzc0tleTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgYnVzaW5lc3NLZXkgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YnVzaW5lc3NLZXkuIA0KKzxwPg0KK1JlcXVpcmVkIGF0dHJpYnV0ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0idWRkaTJfX2J1c2luZXNzSW5mbzo6ZGVzY3JpcHRpb24iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RkOjp2ZWN0b3ImbHQ7PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rlc2NyaXB0aW9uLmh0bWwiPnVkZGkyX19kZXNjcmlwdGlvbjwvYT4qICZndDsgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2luZm8uaHRtbCNvMSI+dWRkaTJfX2J1c2luZXNzSW5mbzo6ZGVzY3JpcHRpb248L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVmVjdG9yIG9mIHVkZGkyX19kZXNjcmlwdGlvbiogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0idWRkaTJfX2J1c2luZXNzSW5mbzo6bmFtZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdGQ6OnZlY3RvciZsdDs8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fbmFtZS5odG1sIj51ZGRpMl9fbmFtZTwvYT4qICZndDsgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2luZm8uaHRtbCNvMCI+dWRkaTJfX2J1c2luZXNzSW5mbzo6bmFtZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitWZWN0b3Igb2YgdWRkaTJfX25hbWUqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9InVkZGkyX19idXNpbmVzc0luZm86OnNlcnZpY2VJbmZvcyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9pbmZvcy5odG1sIj51ZGRpMl9fc2VydmljZUluZm9zPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2luZm8uaHRtbCNvMiI+dWRkaTJfX2J1c2luZXNzSW5mbzo6c2VydmljZUluZm9zPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0VsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpzZXJ2aWNlSW5mb3MuIA0KKzxwPg0KK1JlcXVpcmVkIGVsZW1lbnQgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzQiIGRveHl0YWc9InVkZGkyX19idXNpbmVzc0luZm86OnNvYXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19pbmZvLmh0bWwjbzQiPnNvYXA8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfaW5mby5odG1sI280Ij51ZGRpMl9fYnVzaW5lc3NJbmZvOjpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU4IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYnVzaW5lc3NfaW5mb3MtbWVtYmVycy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19idXNpbmVzc19pbmZvcy1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE3NWU2YwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYnVzaW5lc3NfaW5mb3MtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19idXNpbmVzc0luZm9zIE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19pbmZvcy5odG1sIj51ZGRpMl9fYnVzaW5lc3NJbmZvczwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2luZm9zLmh0bWwjbzAiPmJ1c2luZXNzSW5mbzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfaW5mb3MuaHRtbCI+dWRkaTJfX2J1c2luZXNzSW5mb3M8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2luZm9zLmh0bWwjbzEiPnNvYXA8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2luZm9zLmh0bWwiPnVkZGkyX19idXNpbmVzc0luZm9zPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU4IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYnVzaW5lc3NfaW5mb3MuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYnVzaW5lc3NfaW5mb3MuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmMwYzdhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19idXNpbmVzc19pbmZvcy5odG1sCkBAIC0wLDAgKzEsODMgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IHVkZGkyX19idXNpbmVzc0luZm9zIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fYnVzaW5lc3NJbmZvcyBDbGFzcyBSZWZlcmVuY2U8L2gxPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJidXNpbmVzc0luZm9zIi4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7dWRkaV92Mi5oJmd0OzwvY29kZT4NCis8cD4NCis8YSBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2luZm9zLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfaW5mby5odG1sIj51ZGRpMl9fYnVzaW5lc3NJbmZvPC9hPiAqICZndDsmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19pbmZvcy5odG1sI28wIj5idXNpbmVzc0luZm88L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlZlY3RvciBvZiB1ZGRpMl9fYnVzaW5lc3NJbmZvKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQuICA8YSBocmVmPSIjbzAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfaW5mb3MuaHRtbCNvMSI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2luZm9zLmh0bWwjbzEiPnNvYXA8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiAgPGEgaHJlZj0iI28xIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzxocj48YSBuYW1lPSJfZGV0YWlscyI+PC9hPjxoMj5EZXRhaWxlZCBEZXNjcmlwdGlvbjwvaDI+DQorU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImJ1c2luZXNzSW5mb3MiLiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJ1ZGRpMl9fYnVzaW5lc3NJbmZvczo6YnVzaW5lc3NJbmZvIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0ZDo6dmVjdG9yJmx0OzxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19pbmZvLmh0bWwiPnVkZGkyX19idXNpbmVzc0luZm88L2E+KiAmZ3Q7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19pbmZvcy5odG1sI28wIj51ZGRpMl9fYnVzaW5lc3NJbmZvczo6YnVzaW5lc3NJbmZvPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1ZlY3RvciBvZiB1ZGRpMl9fYnVzaW5lc3NJbmZvKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJ1ZGRpMl9fYnVzaW5lc3NJbmZvczo6c29hcCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2luZm9zLmh0bWwjbzEiPnNvYXA8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfaW5mb3MuaHRtbCNvMSI+dWRkaTJfX2J1c2luZXNzSW5mb3M6OnNvYXA8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3VkZGkyLzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCI+dWRkaV92Mi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTggMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19idXNpbmVzc19saXN0LW1lbWJlcnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYnVzaW5lc3NfbGlzdC1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcxYjg1NwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYnVzaW5lc3NfbGlzdC1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwxOCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX2J1c2luZXNzTGlzdCBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfbGlzdC5odG1sIj51ZGRpMl9fYnVzaW5lc3NMaXN0PC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfbGlzdC5odG1sI28wIj5idXNpbmVzc0luZm9zPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19saXN0Lmh0bWwiPnVkZGkyX19idXNpbmVzc0xpc3Q8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2xpc3QuaHRtbCNvMSI+Z2VuZXJpYzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfbGlzdC5odG1sIj51ZGRpMl9fYnVzaW5lc3NMaXN0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19saXN0Lmh0bWwjbzIiPm9wZXJhdG9yXzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfbGlzdC5odG1sIj51ZGRpMl9fYnVzaW5lc3NMaXN0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19saXN0Lmh0bWwjbzQiPnNvYXA8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2xpc3QuaHRtbCI+dWRkaTJfX2J1c2luZXNzTGlzdDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfbGlzdC5odG1sI28zIj50cnVuY2F0ZWQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2xpc3QuaHRtbCI+dWRkaTJfX2J1c2luZXNzTGlzdDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNjo1OCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2J1c2luZXNzX2xpc3QuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYnVzaW5lc3NfbGlzdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZGI2MDIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2J1c2luZXNzX2xpc3QuaHRtbApAQCAtMCwwICsxLDE2NyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogdWRkaTJfX2J1c2luZXNzTGlzdCBDbGFzcyBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX2J1c2luZXNzTGlzdCBDbGFzcyBSZWZlcmVuY2U8L2gxPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJidXNpbmVzc0xpc3QiLiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KKzxjb2RlPiNpbmNsdWRlICZsdDt1ZGRpX3YyLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KKzxhIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfbGlzdC1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgQXR0cmlidXRlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfaW5mb3MuaHRtbCI+dWRkaTJfX2J1c2luZXNzSW5mb3M8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19saXN0Lmh0bWwjbzAiPmJ1c2luZXNzSW5mb3M8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpidXNpbmVzc0luZm9zLiAgPGEgaHJlZj0iI28wIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfbGlzdC5odG1sI28xIj5nZW5lcmljPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZy4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2xpc3QuaHRtbCNvMiI+b3BlcmF0b3JfPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgb3BlcmF0b3Igb2YgdHlwZSB4czpzdHJpbmcuICA8YSBocmVmPSIjbzIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5lbnVtIDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNDgiPnVkZGkyX190cnVuY2F0ZWQ8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19saXN0Lmh0bWwjbzMiPnRydW5jYXRlZDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIHRydW5jYXRlZCBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0cnVuY2F0ZWQuICA8YSBocmVmPSIjbzMiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfbGlzdC5odG1sI280Ij5zb2FwPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfbGlzdC5odG1sI280Ij5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvNCI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJidXNpbmVzc0xpc3QiLiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJ1ZGRpMl9fYnVzaW5lc3NMaXN0OjpidXNpbmVzc0luZm9zIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19pbmZvcy5odG1sIj51ZGRpMl9fYnVzaW5lc3NJbmZvczwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19saXN0Lmh0bWwjbzAiPnVkZGkyX19idXNpbmVzc0xpc3Q6OmJ1c2luZXNzSW5mb3M8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmJ1c2luZXNzSW5mb3MuIA0KKzxwPg0KK1JlcXVpcmVkIGVsZW1lbnQgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9InVkZGkyX19idXNpbmVzc0xpc3Q6OmdlbmVyaWMiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2xpc3QuaHRtbCNvMSI+dWRkaTJfX2J1c2luZXNzTGlzdDo6Z2VuZXJpYzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZy4gDQorPHA+DQorUmVxdWlyZWQgYXR0cmlidXRlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJ1ZGRpMl9fYnVzaW5lc3NMaXN0OjpvcGVyYXRvcl8iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2xpc3QuaHRtbCNvMiI+dWRkaTJfX2J1c2luZXNzTGlzdDo6b3BlcmF0b3JfPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSBvcGVyYXRvciBvZiB0eXBlIHhzOnN0cmluZy4gDQorPHA+DQorUmVxdWlyZWQgYXR0cmlidXRlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im80IiBkb3h5dGFnPSJ1ZGRpMl9fYnVzaW5lc3NMaXN0Ojpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfbGlzdC5odG1sI280Ij5zb2FwPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2xpc3QuaHRtbCNvNCI+dWRkaTJfX2J1c2luZXNzTGlzdDo6c29hcDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzMiIGRveHl0YWc9InVkZGkyX19idXNpbmVzc0xpc3Q6OnRydW5jYXRlZCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBlbnVtIDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNDgiPnVkZGkyX190cnVuY2F0ZWQ8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfbGlzdC5odG1sI28zIj51ZGRpMl9fYnVzaW5lc3NMaXN0Ojp0cnVuY2F0ZWQ8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIHRydW5jYXRlZCBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0cnVuY2F0ZWQuIA0KKzxwPg0KK09wdGlvbmFsIGF0dHJpYnV0ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU4IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYnVzaW5lc3Nfc2VydmljZS1tZW1iZXJzLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2UtbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYzdmMmYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2UtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMjAgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19idXNpbmVzc1NlcnZpY2UgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2UuaHRtbCI+dWRkaTJfX2J1c2luZXNzU2VydmljZTwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2UuaHRtbCNvMiI+YmluZGluZ1RlbXBsYXRlczwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3Nfc2VydmljZS5odG1sIj51ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlLmh0bWwjbzUiPmJ1c2luZXNzS2V5PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlLmh0bWwiPnVkZGkyX19idXNpbmVzc1NlcnZpY2U8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2UuaHRtbCNvMyI+Y2F0ZWdvcnlCYWc8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2UuaHRtbCI+dWRkaTJfX2J1c2luZXNzU2VydmljZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3Nfc2VydmljZS5odG1sI28xIj5kZXNjcmlwdGlvbjwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3Nfc2VydmljZS5odG1sIj51ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlLmh0bWwjbzAiPm5hbWU8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2UuaHRtbCI+dWRkaTJfX2J1c2luZXNzU2VydmljZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3Nfc2VydmljZS5odG1sI280Ij5zZXJ2aWNlS2V5PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlLmh0bWwiPnVkZGkyX19idXNpbmVzc1NlcnZpY2U8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2UuaHRtbCNvNiI+c29hcDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3Nfc2VydmljZS5odG1sIj51ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU4IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYnVzaW5lc3Nfc2VydmljZS5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ2YmI5MwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYnVzaW5lc3Nfc2VydmljZS5odG1sCkBAIC0wLDAgKzEsMjIzIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlIENsYXNzIFJlZmVyZW5jZTwvaDE+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImJ1c2luZXNzU2VydmljZSIuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3VkZGlfdjIuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fbmFtZS5odG1sIj51ZGRpMl9fbmFtZTwvYT4gKiAmZ3Q7Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3Nfc2VydmljZS5odG1sI28wIj5uYW1lPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5WZWN0b3Igb2YgdWRkaTJfX25hbWUqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gIDxhIGhyZWY9IiNvMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVzY3JpcHRpb24uaHRtbCI+dWRkaTJfX2Rlc2NyaXB0aW9uPC9hPiAqICZndDsmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlLmh0bWwjbzEiPmRlc2NyaXB0aW9uPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5WZWN0b3Igb2YgdWRkaTJfX2Rlc2NyaXB0aW9uKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQuICA8YSBocmVmPSIjbzEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZXMuaHRtbCI+dWRkaTJfX2JpbmRpbmdUZW1wbGF0ZXM8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlLmh0bWwjbzIiPmJpbmRpbmdUZW1wbGF0ZXM8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpiaW5kaW5nVGVtcGxhdGVzLiAgPGEgaHJlZj0iI28yIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NhdGVnb3J5X2JhZy5odG1sIj51ZGRpMl9fY2F0ZWdvcnlCYWc8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlLmh0bWwjbzMiPmNhdGVnb3J5QmFnPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5FbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6Y2F0ZWdvcnlCYWcuICA8YSBocmVmPSIjbzMiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQiPnVkZGkyX19zZXJ2aWNlS2V5PC9hPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2UuaHRtbCNvNCI+c2VydmljZUtleTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIHNlcnZpY2VLZXkgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6c2VydmljZUtleS4gIDxhIGhyZWY9IiNvNCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMyI+dWRkaTJfX2J1c2luZXNzS2V5PC9hPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2UuaHRtbCNvNSI+YnVzaW5lc3NLZXk8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkF0dHJpYnV0ZSBidXNpbmVzc0tleSBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpidXNpbmVzc0tleS4gIDxhIGhyZWY9IiNvNSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlLmh0bWwjbzYiPnNvYXA8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlLmh0bWwjbzYiPnNvYXA8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiAgPGEgaHJlZj0iI282Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzxocj48YSBuYW1lPSJfZGV0YWlscyI+PC9hPjxoMj5EZXRhaWxlZCBEZXNjcmlwdGlvbjwvaDI+DQorU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImJ1c2luZXNzU2VydmljZSIuIA0KKzxwPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9InVkZGkyX19idXNpbmVzc1NlcnZpY2U6OmJpbmRpbmdUZW1wbGF0ZXMiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGVzLmh0bWwiPnVkZGkyX19iaW5kaW5nVGVtcGxhdGVzPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2UuaHRtbCNvMiI+dWRkaTJfX2J1c2luZXNzU2VydmljZTo6YmluZGluZ1RlbXBsYXRlczwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YmluZGluZ1RlbXBsYXRlcy4gDQorPHA+DQorT3B0aW9uYWwgZWxlbWVudCAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNSIgZG94eXRhZz0idWRkaTJfX2J1c2luZXNzU2VydmljZTo6YnVzaW5lc3NLZXkiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EzIj51ZGRpMl9fYnVzaW5lc3NLZXk8L2E+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlLmh0bWwjbzUiPnVkZGkyX19idXNpbmVzc1NlcnZpY2U6OmJ1c2luZXNzS2V5PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSBidXNpbmVzc0tleSBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpidXNpbmVzc0tleS4gDQorPHA+DQorT3B0aW9uYWwgYXR0cmlidXRlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8zIiBkb3h5dGFnPSJ1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlOjpjYXRlZ29yeUJhZyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fY2F0ZWdvcnlfYmFnLmh0bWwiPnVkZGkyX19jYXRlZ29yeUJhZzwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlLmh0bWwjbzMiPnVkZGkyX19idXNpbmVzc1NlcnZpY2U6OmNhdGVnb3J5QmFnPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0VsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpjYXRlZ29yeUJhZy4gDQorPHA+DQorT3B0aW9uYWwgZWxlbWVudCAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0idWRkaTJfX2J1c2luZXNzU2VydmljZTo6ZGVzY3JpcHRpb24iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RkOjp2ZWN0b3ImbHQ7PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rlc2NyaXB0aW9uLmh0bWwiPnVkZGkyX19kZXNjcmlwdGlvbjwvYT4qICZndDsgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2UuaHRtbCNvMSI+dWRkaTJfX2J1c2luZXNzU2VydmljZTo6ZGVzY3JpcHRpb248L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVmVjdG9yIG9mIHVkZGkyX19kZXNjcmlwdGlvbiogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0idWRkaTJfX2J1c2luZXNzU2VydmljZTo6bmFtZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdGQ6OnZlY3RvciZsdDs8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fbmFtZS5odG1sIj51ZGRpMl9fbmFtZTwvYT4qICZndDsgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2UuaHRtbCNvMCI+dWRkaTJfX2J1c2luZXNzU2VydmljZTo6bmFtZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitWZWN0b3Igb2YgdWRkaTJfX25hbWUqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzQiIGRveHl0YWc9InVkZGkyX19idXNpbmVzc1NlcnZpY2U6OnNlcnZpY2VLZXkiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0Ij51ZGRpMl9fc2VydmljZUtleTwvYT4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2UuaHRtbCNvNCI+dWRkaTJfX2J1c2luZXNzU2VydmljZTo6c2VydmljZUtleTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgc2VydmljZUtleSBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpzZXJ2aWNlS2V5LiANCis8cD4NCitSZXF1aXJlZCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzYiIGRveHl0YWc9InVkZGkyX19idXNpbmVzc1NlcnZpY2U6OnNvYXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlLmh0bWwjbzYiPnNvYXA8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3Nfc2VydmljZS5odG1sI282Ij51ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlOjpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU4IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYnVzaW5lc3Nfc2VydmljZXMtbWVtYmVycy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlcy1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAwYmQ1MQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYnVzaW5lc3Nfc2VydmljZXMtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19idXNpbmVzc1NlcnZpY2VzIE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlcy5odG1sIj51ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlczwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2VzLmh0bWwjbzAiPmJ1c2luZXNzU2VydmljZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3Nfc2VydmljZXMuaHRtbCI+dWRkaTJfX2J1c2luZXNzU2VydmljZXM8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2VzLmh0bWwjbzEiPnNvYXA8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2VzLmh0bWwiPnVkZGkyX19idXNpbmVzc1NlcnZpY2VzPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU4IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYnVzaW5lc3Nfc2VydmljZXMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fYnVzaW5lc3Nfc2VydmljZXMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjRjMjVlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlcy5odG1sCkBAIC0wLDAgKzEsODMgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IHVkZGkyX19idXNpbmVzc1NlcnZpY2VzIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlcyBDbGFzcyBSZWZlcmVuY2U8L2gxPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJidXNpbmVzc1NlcnZpY2VzIi4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7dWRkaV92Mi5oJmd0OzwvY29kZT4NCis8cD4NCis8YSBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2VzLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3Nfc2VydmljZS5odG1sIj51ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlPC9hPiAqICZndDsmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlcy5odG1sI28wIj5idXNpbmVzc1NlcnZpY2U8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlZlY3RvciBvZiB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQuICA8YSBocmVmPSIjbzAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3Nfc2VydmljZXMuaHRtbCNvMSI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2VzLmh0bWwjbzEiPnNvYXA8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiAgPGEgaHJlZj0iI28xIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzxocj48YSBuYW1lPSJfZGV0YWlscyI+PC9hPjxoMj5EZXRhaWxlZCBEZXNjcmlwdGlvbjwvaDI+DQorU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImJ1c2luZXNzU2VydmljZXMiLiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJ1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlczo6YnVzaW5lc3NTZXJ2aWNlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0ZDo6dmVjdG9yJmx0OzxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlLmh0bWwiPnVkZGkyX19idXNpbmVzc1NlcnZpY2U8L2E+KiZndDsgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2VzLmh0bWwjbzAiPnVkZGkyX19idXNpbmVzc1NlcnZpY2VzOjpidXNpbmVzc1NlcnZpY2U8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVmVjdG9yIG9mIHVkZGkyX19idXNpbmVzc1NlcnZpY2UqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9InVkZGkyX19idXNpbmVzc1NlcnZpY2VzOjpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3Nfc2VydmljZXMuaHRtbCNvMSI+c29hcDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlcy5odG1sI28xIj51ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlczo6c29hcDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvdWRkaTIvPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sIj51ZGRpX3YyLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNjo1OCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2NhdGVnb3J5X2JhZy1tZW1iZXJzLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2NhdGVnb3J5X2JhZy1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFlZDE2MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fY2F0ZWdvcnlfYmFnLW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDE1IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fY2F0ZWdvcnlCYWcgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NhdGVnb3J5X2JhZy5odG1sIj51ZGRpMl9fY2F0ZWdvcnlCYWc8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19jYXRlZ29yeV9iYWcuaHRtbCNvMCI+a2V5ZWRSZWZlcmVuY2U8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NhdGVnb3J5X2JhZy5odG1sIj51ZGRpMl9fY2F0ZWdvcnlCYWc8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NhdGVnb3J5X2JhZy5odG1sI28xIj5zb2FwPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19jYXRlZ29yeV9iYWcuaHRtbCI+dWRkaTJfX2NhdGVnb3J5QmFnPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU4IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fY2F0ZWdvcnlfYmFnLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2NhdGVnb3J5X2JhZy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZjRhNWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2NhdGVnb3J5X2JhZy5odG1sCkBAIC0wLDAgKzEsODMgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IHVkZGkyX19jYXRlZ29yeUJhZyBDbGFzcyBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX2NhdGVnb3J5QmFnIENsYXNzIFJlZmVyZW5jZTwvaDE+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImNhdGVnb3J5QmFnIi4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7dWRkaV92Mi5oJmd0OzwvY29kZT4NCis8cD4NCis8YSBocmVmPSJjbGFzc3VkZGkyX19fX2NhdGVnb3J5X2JhZy1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgQXR0cmlidXRlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zdGQ6OnZlY3RvciZsdDsgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2tleWVkX3JlZmVyZW5jZS5odG1sIj51ZGRpMl9fa2V5ZWRSZWZlcmVuY2U8L2E+ICogJmd0OyZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NhdGVnb3J5X2JhZy5odG1sI28wIj5rZXllZFJlZmVyZW5jZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VmVjdG9yIG9mIHVkZGkyX19rZXllZFJlZmVyZW5jZSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiAgPGEgaHJlZj0iI28wIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NhdGVnb3J5X2JhZy5odG1sI28xIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fY2F0ZWdvcnlfYmFnLmh0bWwjbzEiPnNvYXA8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiAgPGEgaHJlZj0iI28xIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzxocj48YSBuYW1lPSJfZGV0YWlscyI+PC9hPjxoMj5EZXRhaWxlZCBEZXNjcmlwdGlvbjwvaDI+DQorU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImNhdGVnb3J5QmFnIi4gDQorPHA+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0idWRkaTJfX2NhdGVnb3J5QmFnOjprZXllZFJlZmVyZW5jZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdGQ6OnZlY3RvciZsdDs8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fa2V5ZWRfcmVmZXJlbmNlLmh0bWwiPnVkZGkyX19rZXllZFJlZmVyZW5jZTwvYT4qICZndDsgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NhdGVnb3J5X2JhZy5odG1sI28wIj51ZGRpMl9fY2F0ZWdvcnlCYWc6OmtleWVkUmVmZXJlbmNlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1ZlY3RvciBvZiB1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9InVkZGkyX19jYXRlZ29yeUJhZzo6c29hcCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NhdGVnb3J5X2JhZy5odG1sI28xIj5zb2FwPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NhdGVnb3J5X2JhZy5odG1sI28xIj51ZGRpMl9fY2F0ZWdvcnlCYWc6OnNvYXA8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3VkZGkyLzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCI+dWRkaV92Mi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTggMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19jb250YWN0LW1lbWJlcnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fY29udGFjdC1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk3YzBhNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fY29udGFjdC1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwyMCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX2NvbnRhY3QgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NvbnRhY3QuaHRtbCI+dWRkaTJfX2NvbnRhY3Q8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19jb250YWN0Lmh0bWwjbzQiPmFkZHJlc3M8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NvbnRhY3QuaHRtbCI+dWRkaTJfX2NvbnRhY3Q8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NvbnRhY3QuaHRtbCNvMCI+ZGVzY3JpcHRpb248L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NvbnRhY3QuaHRtbCI+dWRkaTJfX2NvbnRhY3Q8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NvbnRhY3QuaHRtbCNvMyI+ZW1haWw8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NvbnRhY3QuaHRtbCI+dWRkaTJfX2NvbnRhY3Q8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NvbnRhY3QuaHRtbCNvMSI+cGVyc29uTmFtZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fY29udGFjdC5odG1sIj51ZGRpMl9fY29udGFjdDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fY29udGFjdC5odG1sI28yIj5waG9uZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fY29udGFjdC5odG1sIj51ZGRpMl9fY29udGFjdDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fY29udGFjdC5odG1sI282Ij5zb2FwPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19jb250YWN0Lmh0bWwiPnVkZGkyX19jb250YWN0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19jb250YWN0Lmh0bWwjbzUiPnVzZVR5cGU8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NvbnRhY3QuaHRtbCI+dWRkaTJfX2NvbnRhY3Q8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTggMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19jb250YWN0Lmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2NvbnRhY3QuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmM0MGY3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19jb250YWN0Lmh0bWwKQEAgLTAsMCArMSwyMjMgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IHVkZGkyX19jb250YWN0IENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fY29udGFjdCBDbGFzcyBSZWZlcmVuY2U8L2gxPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJjb250YWN0Ii4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7dWRkaV92Mi5oJmd0OzwvY29kZT4NCis8cD4NCis8YSBocmVmPSJjbGFzc3VkZGkyX19fX2NvbnRhY3QtbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c3RkOjp2ZWN0b3ImbHQ7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZXNjcmlwdGlvbi5odG1sIj51ZGRpMl9fZGVzY3JpcHRpb248L2E+ICogJmd0OyZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NvbnRhY3QuaHRtbCNvMCI+ZGVzY3JpcHRpb248L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlZlY3RvciBvZiB1ZGRpMl9fZGVzY3JpcHRpb24qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gIDxhIGhyZWY9IiNvMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NvbnRhY3QuaHRtbCNvMSI+cGVyc29uTmFtZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+RWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOnBlcnNvbk5hbWUuICA8YSBocmVmPSIjbzEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zdGQ6OnZlY3RvciZsdDsgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3Bob25lLmh0bWwiPnVkZGkyX19waG9uZTwvYT4gKiAmZ3Q7Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fY29udGFjdC5odG1sI28yIj5waG9uZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VmVjdG9yIG9mIHVkZGkyX19waG9uZSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiAgPGEgaHJlZj0iI28yIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c3RkOjp2ZWN0b3ImbHQ7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19lbWFpbC5odG1sIj51ZGRpMl9fZW1haWw8L2E+ICogJmd0OyZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NvbnRhY3QuaHRtbCNvMyI+ZW1haWw8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlZlY3RvciBvZiB1ZGRpMl9fZW1haWwqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gIDxhIGhyZWY9IiNvMyI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkcmVzcy5odG1sIj51ZGRpMl9fYWRkcmVzczwvYT4gKiAmZ3Q7Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fY29udGFjdC5odG1sI280Ij5hZGRyZXNzPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5WZWN0b3Igb2YgdWRkaTJfX2FkZHJlc3MqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gIDxhIGhyZWY9IiNvNCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NvbnRhY3QuaHRtbCNvNSI+dXNlVHlwZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIHVzZVR5cGUgb2YgdHlwZSB4czpzdHJpbmcuICA8YSBocmVmPSIjbzUiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fY29udGFjdC5odG1sI282Ij5zb2FwPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fY29udGFjdC5odG1sI282Ij5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvNiI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJjb250YWN0Ii4gDQorPHA+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNCIgZG94eXRhZz0idWRkaTJfX2NvbnRhY3Q6OmFkZHJlc3MiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RkOjp2ZWN0b3ImbHQ7PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FkZHJlc3MuaHRtbCI+dWRkaTJfX2FkZHJlc3M8L2E+KiAmZ3Q7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19jb250YWN0Lmh0bWwjbzQiPnVkZGkyX19jb250YWN0OjphZGRyZXNzPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1ZlY3RvciBvZiB1ZGRpMl9fYWRkcmVzcyogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0idWRkaTJfX2NvbnRhY3Q6OmRlc2NyaXB0aW9uIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0ZDo6dmVjdG9yJmx0OzxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZXNjcmlwdGlvbi5odG1sIj51ZGRpMl9fZGVzY3JpcHRpb248L2E+KiAmZ3Q7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19jb250YWN0Lmh0bWwjbzAiPnVkZGkyX19jb250YWN0OjpkZXNjcmlwdGlvbjwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitWZWN0b3Igb2YgdWRkaTJfX2Rlc2NyaXB0aW9uKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8zIiBkb3h5dGFnPSJ1ZGRpMl9fY29udGFjdDo6ZW1haWwiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RkOjp2ZWN0b3ImbHQ7PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2VtYWlsLmh0bWwiPnVkZGkyX19lbWFpbDwvYT4qICZndDsgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NvbnRhY3QuaHRtbCNvMyI+dWRkaTJfX2NvbnRhY3Q6OmVtYWlsPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1ZlY3RvciBvZiB1ZGRpMl9fZW1haWwqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9InVkZGkyX19jb250YWN0OjpwZXJzb25OYW1lIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19jb250YWN0Lmh0bWwjbzEiPnVkZGkyX19jb250YWN0OjpwZXJzb25OYW1lPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0VsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpwZXJzb25OYW1lLiANCis8cD4NCitSZXF1aXJlZCBlbGVtZW50ICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJ1ZGRpMl9fY29udGFjdDo6cGhvbmUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RkOjp2ZWN0b3ImbHQ7PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3Bob25lLmh0bWwiPnVkZGkyX19waG9uZTwvYT4qICZndDsgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NvbnRhY3QuaHRtbCNvMiI+dWRkaTJfX2NvbnRhY3Q6OnBob25lPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1ZlY3RvciBvZiB1ZGRpMl9fcGhvbmUqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzYiIGRveHl0YWc9InVkZGkyX19jb250YWN0Ojpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fY29udGFjdC5odG1sI282Ij5zb2FwPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NvbnRhY3QuaHRtbCNvNiI+dWRkaTJfX2NvbnRhY3Q6OnNvYXA8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im81IiBkb3h5dGFnPSJ1ZGRpMl9fY29udGFjdDo6dXNlVHlwZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fY29udGFjdC5odG1sI281Ij51ZGRpMl9fY29udGFjdDo6dXNlVHlwZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgdXNlVHlwZSBvZiB0eXBlIHhzOnN0cmluZy4gDQorPHA+DQorT3B0aW9uYWwgYXR0cmlidXRlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3VkZGkyLzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCI+dWRkaV92Mi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTggMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19jb250YWN0cy1tZW1iZXJzLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2NvbnRhY3RzLW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmI3N2YzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19jb250YWN0cy1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwxNSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX2NvbnRhY3RzIE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19jb250YWN0cy5odG1sIj51ZGRpMl9fY29udGFjdHM8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19jb250YWN0cy5odG1sI28wIj5jb250YWN0PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19jb250YWN0cy5odG1sIj51ZGRpMl9fY29udGFjdHM8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NvbnRhY3RzLmh0bWwjbzEiPnNvYXA8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NvbnRhY3RzLmh0bWwiPnVkZGkyX19jb250YWN0czwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNjo1OCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2NvbnRhY3RzLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2NvbnRhY3RzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVmNWQ3ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fY29udGFjdHMuaHRtbApAQCAtMCwwICsxLDgzIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiB1ZGRpMl9fY29udGFjdHMgQ2xhc3MgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19jb250YWN0cyBDbGFzcyBSZWZlcmVuY2U8L2gxPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJjb250YWN0cyIuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3VkZGlfdjIuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19jb250YWN0cy1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgQXR0cmlidXRlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zdGQ6OnZlY3RvciZsdDsgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NvbnRhY3QuaHRtbCI+dWRkaTJfX2NvbnRhY3Q8L2E+ICogJmd0OyZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NvbnRhY3RzLmh0bWwjbzAiPmNvbnRhY3Q8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlZlY3RvciBvZiB1ZGRpMl9fY29udGFjdCogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiAgPGEgaHJlZj0iI28wIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NvbnRhY3RzLmh0bWwjbzEiPnNvYXA8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19jb250YWN0cy5odG1sI28xIj5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJjb250YWN0cyIuIA0KKzxwPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InVkZGkyX19jb250YWN0czo6Y29udGFjdCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdGQ6OnZlY3RvciZsdDs8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fY29udGFjdC5odG1sIj51ZGRpMl9fY29udGFjdDwvYT4qICZndDsgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NvbnRhY3RzLmh0bWwjbzAiPnVkZGkyX19jb250YWN0czo6Y29udGFjdDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitWZWN0b3Igb2YgdWRkaTJfX2NvbnRhY3QqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9InVkZGkyX19jb250YWN0czo6c29hcCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NvbnRhY3RzLmh0bWwjbzEiPnNvYXA8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fY29udGFjdHMuaHRtbCNvMSI+dWRkaTJfX2NvbnRhY3RzOjpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU4IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2ViaW5kaW5nLW1lbWJlcnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2ViaW5kaW5nLW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWYyZTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJpbmRpbmctbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMjEgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwiPnVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZzwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI28wIj5hdXRoSW5mbzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwiPnVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZzwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjbzEiPmJpbmRpbmdLZXk8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sIj51ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmc8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI28yIj5nZW5lcmljPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNhMyI+c2VuZDwvYT4oY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNvMyI+c29hcDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwiPnVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZzwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjYTAiPnVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZzwvYT4oc3RydWN0IHNvYXAgKik8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwiPnVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZzwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjYTEiPnVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZzwvYT4oc3RydWN0IHNvYXAgKiwgY29uc3QgY2hhciAqYmluZGluZ0tleSk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwiPnVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZzwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjYTIiPnVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZzwvYT4oc3RydWN0IHNvYXAgKiwgc3RkOjp2ZWN0b3ImbHQ7IGNoYXIgKiAmZ3Q7IGJpbmRpbmdLZXlzKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU4IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZWU1ODYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sCkBAIC0wLDAgKzEsMzIzIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcgQ2xhc3MgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyBDbGFzcyBSZWZlcmVuY2U8L2gxPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJkZWxldGVfYmluZGluZyIuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3VkZGlfdjIuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJpbmRpbmctbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIE1lbWJlciBGdW5jdGlvbnM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjYTAiPnVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZzwvYT4gKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjbzMiPnNvYXA8L2E+ICopPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gIDxhIGhyZWY9IiNhMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI2ExIj51ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmc8L2E+IChzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI28zIj5zb2FwPC9hPiAqLCBjb25zdCBjaGFyICo8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjbzEiPmJpbmRpbmdLZXk8L2E+KTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNhMiI+dWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nPC9hPiAoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNvMyI+c29hcDwvYT4gKiwgc3RkOjp2ZWN0b3ImbHQ7IGNoYXIgKiAmZ3Q7IGJpbmRpbmdLZXlzKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwiPnVkZGkyX19kaXNwb3NpdGlvblJlcG9ydDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI2EzIj5zZW5kPC9hPiAoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNvMCI+YXV0aEluZm88L2E+KTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTMiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjbzAiPmF1dGhJbmZvPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5FbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YXV0aEluZm8uICA8YSBocmVmPSIjbzAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zdGQ6OnZlY3RvciZsdDsgPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EyIj51ZGRpMl9fYmluZGluZ0tleTwvYT4gJmd0OyZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI28xIj5iaW5kaW5nS2V5PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5WZWN0b3Igb2YgdWRkaTJfX2JpbmRpbmdLZXkgd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiAgPGEgaHJlZj0iI28xIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjbzIiPmdlbmVyaWM8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nLiAgPGEgaHJlZj0iI28yIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI28zIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjbzMiPnNvYXA8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiAgPGEgaHJlZj0iI28zIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzxocj48YSBuYW1lPSJfZGV0YWlscyI+PC9hPjxoMj5EZXRhaWxlZCBEZXNjcmlwdGlvbjwvaDI+DQorU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImRlbGV0ZV9iaW5kaW5nIi4gDQorPHA+DQorUmVwcmVzZW50cyBhIHJlcXVlc3QgdG8gZGVsZXRlIGEgYmluZGluZyB0aGF0IG1lZXRzIHRoZSBzcGVjaWZpZWQgcmVxdWlyZW1lbnRzLjxwPg0KK1NlZSAgPGEgaHJlZj0iaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzczMiI+aHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzczMjwvYT4gDQorPHA+DQorPGhyPjxoMj5Db25zdHJ1Y3RvciAmYW1wOyBEZXN0cnVjdG9yIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEwIiBkb3h5dGFnPSJ1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmc6OnVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmc6OnVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjbzMiPnNvYXA8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGV0ZV9VU0NPUkViaW5kaW5nIGNsYXNzLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMSIgZG94eXRhZz0idWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nOjp1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmciID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nOjp1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI28zIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmJpbmRpbmdLZXk8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5nU09BUCBjb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+YmluZGluZ0tleTwvZW0+Jm5ic3A7PC90ZD48dGQ+YSBiaW5kaW5nIGtleSBzdHJpbmc8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZGVsZXRlX1VTQ09SRWJpbmRpbmcgY2xhc3MuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEyIiBkb3h5dGFnPSJ1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmc6OnVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmc6OnVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjbzMiPnNvYXA8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5zdGQ6OnZlY3RvciZsdDsgY2hhciAqICZndDsmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+YmluZGluZ0tleXM8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5nU09BUCBjb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+YmluZGluZ0tleXM8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbGxlY3Rpb24gb2YgYmluZGluZyBrZXlzPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGV0ZV9VU0NPUkViaW5kaW5nIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQgYmluZGluZyBrZXlzLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+PGgyPk1lbWJlciBGdW5jdGlvbiBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMyIgZG94eXRhZz0idWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nOjpzZW5kIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCI+dWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPiAqIHVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZzo6c2VuZCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5lbmRwb2ludDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+YXV0aEluZm88L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5lbmRwb2ludDwvZW0+Jm5ic3A7PC90ZD48dGQ+VVJMIG9mIHRoZSBVRERJIHNlcnZlciA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmF1dGhJbmZvPC9lbT4mbmJzcDs8L3RkPjx0ZD5hdXRob3JpemF0aW9uIHRva2VuIHByb3ZpZGVkIGJ5IHRoZSBVRERJIHNlcnZlciA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPkEgcG9pbnRlciB0byBhIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCI+dWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPiBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcjwvZGQ+PC9kbD4NCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmljZSB0byBkZWxldGUgYSBiaW5kaW5nIHRoYXQgbWVldHMgdGhlIHNwZWNpZmllZCByZXF1aXJlbWVudHMuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZzo6YXV0aEluZm8iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI28wIj51ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmc6OmF1dGhJbmZvPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0VsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjphdXRoSW5mby4gDQorPHA+DQorUmVxdWlyZWQgZWxlbWVudCAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0idWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nOjpiaW5kaW5nS2V5IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0ZDo6dmVjdG9yJmx0OzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMiI+dWRkaTJfX2JpbmRpbmdLZXk8L2E+ICZndDsgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI28xIj51ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmc6OmJpbmRpbmdLZXk8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVmVjdG9yIG9mIHVkZGkyX19iaW5kaW5nS2V5IHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9InVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZzo6Z2VuZXJpYyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjbzIiPnVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZzo6Z2VuZXJpYzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZy4gDQorPHA+DQorUmVxdWlyZWQgYXR0cmlidXRlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8zIiBkb3h5dGFnPSJ1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmc6OnNvYXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNvMyI+c29hcDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNvMyI+dWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nOjpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU4IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VidXNpbmVzcy1tZW1iZXJzLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MtbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NWM3MzYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMjEgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3MgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzczwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvMCI+YXV0aEluZm88L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzczwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI28xIj5idXNpbmVzc0tleTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sIj51ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzIiPmdlbmVyaWM8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzczwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI2EzIj5zZW5kPC9hPihjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzczwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI28zIj5zb2FwPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwiPnVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3M8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNhMCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzczwvYT4oc3RydWN0IHNvYXAgKik8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sIj51ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjYTEiPnVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3M8L2E+KHN0cnVjdCBzb2FwICosIGNvbnN0IGNoYXIgKmJ1c2luZXNzS2V5KTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwiPnVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3M8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNhMiI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzczwvYT4oc3RydWN0IHNvYXAgKiwgc3RkOjp2ZWN0b3ImbHQ7IGNoYXIgKiAmZ3Q7IGJ1c2luZXNzS2V5cyk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sIj51ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU4IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg2YWEzZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sCkBAIC0wLDAgKzEsMzI4IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzIENsYXNzIFJlZmVyZW5jZTwvaDE+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImRlbGV0ZV9idXNpbmVzcyIuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3VkZGlfdjIuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJ1c2luZXNzLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBNZW1iZXIgRnVuY3Rpb25zPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNhMCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzczwvYT4gKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI28zIj5zb2FwPC9hPiAqKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjYTEiPnVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3M8L2E+IChzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvMyI+c29hcDwvYT4gKiwgY29uc3QgY2hhciAqPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvMSI+YnVzaW5lc3NLZXk8L2E+KTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjYTIiPnVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3M8L2E+IChzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvMyI+c29hcDwvYT4gKiwgc3RkOjp2ZWN0b3ImbHQ7IGNoYXIgKiAmZ3Q7IGJ1c2luZXNzS2V5cyk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+TWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2EyIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sIj51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQ8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjYTMiPnNlbmQ8L2E+IChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvMCI+YXV0aEluZm88L2E+KTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTMiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI28wIj5hdXRoSW5mbzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+RWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmF1dGhJbmZvLiAgPGEgaHJlZj0iI28wIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c3RkOjp2ZWN0b3ImbHQ7IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMyI+dWRkaTJfX2J1c2luZXNzS2V5PC9hPiAmZ3Q7Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI28xIj5idXNpbmVzc0tleTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VmVjdG9yIG9mIHVkZGkyX19idXNpbmVzc0tleSB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQuICA8YSBocmVmPSIjbzEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzIiPmdlbmVyaWM8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nLiAgPGEgaHJlZj0iI28yIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvMyI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvMyI+c29hcDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuICA8YSBocmVmPSIjbzMiPjwvYT48YnI+PC90ZD48L3RyPg0KKzwvdGFibGU+DQorPGhyPjxhIG5hbWU9Il9kZXRhaWxzIj48L2E+PGgyPkRldGFpbGVkIERlc2NyaXB0aW9uPC9oMj4NCitTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZGVsZXRlX2J1c2luZXNzIi4gDQorPHA+DQorUmVwcmVzZW50cyBhIHJlcXVlc3QgdG8gZGVsZXRlIGEgYnVzaW5lc3MgdGhhdCBtZWV0cyB0aGUgc3BlY2lmaWVkIHJlcXVpcmVtZW50cy48cD4NCitTZWUgIDxhIGhyZWY9Imh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3MzMiPmh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3MzM8L2E+IA0KKzxwPg0KKzxocj48aDI+Q29uc3RydWN0b3IgJmFtcDsgRGVzdHJ1Y3RvciBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMCIgZG94eXRhZz0idWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzczo6dWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzOjp1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzMiPnNvYXA8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmdTT0FQIGNvbnRleHQ8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZGVsZXRlX1VTQ09SRWJ1c2luZXNzIGNsYXNzLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMSIgZG94eXRhZz0idWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzczo6dWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzOjp1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzMiPnNvYXA8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+YnVzaW5lc3NLZXk8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5nU09BUCBjb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+YnVzaW5lc3NLZXk8L2VtPiZuYnNwOzwvdGQ+PHRkPmEgYnVzaW5lc3Mga2V5IHN0cmluZzwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWxldGVfVVNDT1JFYnVzaW5lc3MgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZCBidXNpbmVzcyBrZXkuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEyIiBkb3h5dGFnPSJ1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzOjp1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3M6OnVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3MgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvMyI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPnN0ZDo6dmVjdG9yJmx0OyBjaGFyICogJmd0OyZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5idXNpbmVzc0tleXM8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5nU09BUCBjb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+YnVzaW5lc3NLZXlzPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb2xsZWN0aW9uIG9mIGJ1c2luZXNzIGtleXM8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZGVsZXRlX1VTQ09SRWJ1c2luZXNzIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQgYnVzaW5lc3Mga2V5cy4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPjxoMj5NZW1iZXIgRnVuY3Rpb24gRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTMiIGRveHl0YWc9InVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3M6OnNlbmQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sIj51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQ8L2E+ICogdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzczo6c2VuZCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5lbmRwb2ludDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+YXV0aEluZm88L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5lbmRwb2ludDwvZW0+Jm5ic3A7PC90ZD48dGQ+VVJMIG9mIHRoZSBVRERJIHNlcnZlciA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmF1dGhJbmZvPC9lbT4mbmJzcDs8L3RkPjx0ZD5hdXRob3JpemF0aW9uIHRva2VuIHByb3ZpZGVkIGJ5IHRoZSBVRERJIHNlcnZlciA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPkEgcG9pbnRlciB0byBhIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCI+dWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPiBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcjwvZGQ+PC9kbD4NCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmljZSB0byBkZWxldGUgYSBidXNpbmVzcyB0aGF0IG1lZXRzIHRoZSBzcGVjaWZpZWQgcmVxdWlyZW1lbnRzLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJ1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzOjphdXRoSW5mbyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI28wIj51ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzOjphdXRoSW5mbzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YXV0aEluZm8uIA0KKzxwPg0KK1JlcXVpcmVkIGVsZW1lbnQgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9InVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3M6OmJ1c2luZXNzS2V5IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0ZDo6dmVjdG9yJmx0OzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMyI+dWRkaTJfX2J1c2luZXNzS2V5PC9hPiAmZ3Q7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzEiPnVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3M6OmJ1c2luZXNzS2V5PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1ZlY3RvciBvZiB1ZGRpMl9fYnVzaW5lc3NLZXkgd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMiIgZG94eXRhZz0idWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzczo6Z2VuZXJpYyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI28yIj51ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzOjpnZW5lcmljPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nLiANCis8cD4NCitSZXF1aXJlZCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzMiIGRveHl0YWc9InVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3M6OnNvYXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzMiPnNvYXA8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI28zIj51ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzOjpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU4IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy1tZW1iZXJzLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMtbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MGZjOWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMjAgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzAiPmF1dGhJbmZvPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwiPnVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28yIj5nZW5lcmljPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwiPnVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28xIj5wdWJsaXNoZXJBc3NlcnRpb248L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjYTIiPnNlbmQ8L2E+KGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbyk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMyI+c29hcDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNhMCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPihzdHJ1Y3Qgc29hcCAqKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwiPnVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI2ExIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+KHN0cnVjdCBzb2FwICosIHN0ZDo6dmVjdG9yJmx0OyB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uICogJmd0OyBwdWJsaXNoZXJBc3NlcnRpb25zKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwiPnVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNjo1OCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYTU1NTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbApAQCAtMCwwICsxLDI4MCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogdWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgQ2xhc3MgUmVmZXJlbmNlPC9oMT5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZGVsZXRlX3B1Ymxpc2hlckFzc2VydGlvbnMiLiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KKzxjb2RlPiNpbmNsdWRlICZsdDt1ZGRpX3YyLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KKzxhIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgTWVtYmVyIEZ1bmN0aW9uczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjYTAiPnVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT4gKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28zIj5zb2FwPC9hPiAqKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjYTEiPnVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT4gKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28zIj5zb2FwPC9hPiAqLCBzdGQ6OnZlY3RvciZsdDsgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb24uaHRtbCI+dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbjwvYT4gKiAmZ3Q7IHB1Ymxpc2hlckFzc2VydGlvbnMpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gIDxhIGhyZWY9IiNhMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCI+dWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI2EyIj5zZW5kPC9hPiAoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzAiPmF1dGhJbmZvPC9hPik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+TWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2EyIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMCI+YXV0aEluZm88L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjphdXRoSW5mby4gIDxhIGhyZWY9IiNvMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbi5odG1sIj51ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uPC9hPiAqICZndDsmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzEiPnB1Ymxpc2hlckFzc2VydGlvbjwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VmVjdG9yIG9mIHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMiI+Z2VuZXJpYzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcuICA8YSBocmVmPSIjbzIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28zIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28zIj5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvMyI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJkZWxldGVfcHVibGlzaGVyQXNzZXJ0aW9ucyIuIA0KKzxwPg0KK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIGRlbGV0ZSBwdWJsaXNoZXIgYXNzZXJ0aW9ucyBtZWV0aW5nIHRoZSBzcGVjaWZpZWQgcmVxdWlyZW1lbnRzLjxwPg0KK1NlZSAgPGEgaHJlZj0iaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzczNCI+aHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzczNDwvYT4gDQorPHA+DQorPGhyPjxoMj5Db25zdHJ1Y3RvciAmYW1wOyBEZXN0cnVjdG9yIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEwIiBkb3h5dGFnPSJ1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM6OnVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM6OnVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28zIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiA8ZW0+c29hcDwvZW0+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5nU09BUCBjb250ZXh0PC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zIGNsYXNzLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMSIgZG94eXRhZz0idWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjp1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjp1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMyI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbi5odG1sIj51ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uPC9hPiAqICZndDsmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+cHVibGlzaGVyQXNzZXJ0aW9uczwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmdTT0FQIGNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5wdWJsaXNoZXJBc3NlcnRpb25zPC9lbT4mbmJzcDs8L3RkPjx0ZD5hIGNvbGxlY3Rpb24gb2YgcHVibGlzaGVyIGFzc2VydGlvbnM8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG9mIHB1Ymxpc2hlciBhc3NlcnRpb25zLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+PGgyPk1lbWJlciBGdW5jdGlvbiBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMiIgZG94eXRhZz0idWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjpzZW5kIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCI+dWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPiAqIHVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczo6c2VuZCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5lbmRwb2ludDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+YXV0aEluZm88L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5lbmRwb2ludDwvZW0+Jm5ic3A7PC90ZD48dGQ+VVJMIG9mIHRoZSBVRERJIHNlcnZlciA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmF1dGhJbmZvPC9lbT4mbmJzcDs8L3RkPjx0ZD5hdXRob3JpemF0aW9uIHRva2VuIHByb3ZpZGVkIGJ5IHRoZSBVRERJIHNlcnZlciA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPkEgcG9pbnRlciB0byBhIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCI+dWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPiBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcjwvZGQ+PC9kbD4NCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmljZSB0byBkZWxldGUgcHVibGlzaGVyIGFzc2VydGlvbnMgbWVldGluZyB0aGUgc3BlY2lmaWVkIHJlcXVpcmVtZW50cy4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0idWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjphdXRoSW5mbyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28wIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM6OmF1dGhJbmZvPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0VsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjphdXRoSW5mby4gDQorPHA+DQorUmVxdWlyZWQgZWxlbWVudCAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMiIgZG94eXRhZz0idWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjpnZW5lcmljIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzIiPnVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczo6Z2VuZXJpYzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZy4gDQorPHA+DQorUmVxdWlyZWQgYXR0cmlidXRlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJ1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM6OnB1Ymxpc2hlckFzc2VydGlvbiIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdGQ6OnZlY3RvciZsdDs8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbi5odG1sIj51ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uPC9hPiomZ3Q7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzEiPnVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczo6cHVibGlzaGVyQXNzZXJ0aW9uPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1ZlY3RvciBvZiB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8zIiBkb3h5dGFnPSJ1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM6OnNvYXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzMiPnNvYXA8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28zIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM6OnNvYXA8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3VkZGkyLzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCI+dWRkaV92Mi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTggMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXNlcnZpY2UtbWVtYmVycy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXNlcnZpY2UtbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1OWVjZWIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lc2VydmljZS1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwyMSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlIE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlPC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjbzAiPmF1dGhJbmZvPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvMiI+Z2VuZXJpYzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwiPnVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjYTMiPnNlbmQ8L2E+KGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbyk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwiPnVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjbzEiPnNlcnZpY2VLZXk8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2U8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI28zIj5zb2FwPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNhMCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlPC9hPihzdHJ1Y3Qgc29hcCAqKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNhMSI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlPC9hPihzdHJ1Y3Qgc29hcCAqLCBjb25zdCBjaGFyICpzZXJ2aWNlS2V5KTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNhMiI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlPC9hPihzdHJ1Y3Qgc29hcCAqLCBzdGQ6OnZlY3RvciZsdDsgY2hhciAqICZndDsgc2VydmljZUtleXMpPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2U8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTkgMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcyYzJjMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwKQEAgLTAsMCArMSwzMjggQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IHVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZSBDbGFzcyBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlIENsYXNzIFJlZmVyZW5jZTwvaDE+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImRlbGV0ZV9zZXJ2aWNlIi4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7dWRkaV92Mi5oJmd0OzwvY29kZT4NCis8cD4NCis8YSBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lc2VydmljZS1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgTWVtYmVyIEZ1bmN0aW9uczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNhMCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlPC9hPiAoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvMyI+c29hcDwvYT4gKik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+TWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2EwIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjYTEiPnVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZTwvYT4gKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjbzMiPnNvYXA8L2E+ICosIGNvbnN0IGNoYXIgKjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvMSI+c2VydmljZUtleTwvYT4pPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gIDxhIGhyZWY9IiNhMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI2EyIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2U8L2E+IChzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI28zIj5zb2FwPC9hPiAqLCBzdGQ6OnZlY3RvciZsdDsgY2hhciAqICZndDsgc2VydmljZUtleXMpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gIDxhIGhyZWY9IiNhMiI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCI+dWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjYTMiPnNlbmQ8L2E+IChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI28wIj5hdXRoSW5mbzwvYT4pPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gIDxhIGhyZWY9IiNhMyI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgQXR0cmlidXRlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvMCI+YXV0aEluZm88L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjphdXRoSW5mby4gIDxhIGhyZWY9IiNvMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQiPnVkZGkyX19zZXJ2aWNlS2V5PC9hPiAmZ3Q7Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjbzEiPnNlcnZpY2VLZXk8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlZlY3RvciBvZiB1ZGRpMl9fc2VydmljZUtleSB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQuICA8YSBocmVmPSIjbzEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvMiI+Z2VuZXJpYzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcuICA8YSBocmVmPSIjbzIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjbzMiPnNvYXA8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvMyI+c29hcDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuICA8YSBocmVmPSIjbzMiPjwvYT48YnI+PC90ZD48L3RyPg0KKzwvdGFibGU+DQorPGhyPjxhIG5hbWU9Il9kZXRhaWxzIj48L2E+PGgyPkRldGFpbGVkIERlc2NyaXB0aW9uPC9oMj4NCitTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZGVsZXRlX3NlcnZpY2UiLiANCis8cD4NCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBkZWxldGUgYSBzZXJ2aWNlIHRoYXQgbWVldHMgdGhlIHNwZWNpZmllZCByZXF1aXJlbWVudHMuPHA+DQorU2VlICA8YSBocmVmPSJodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzM1Ij5odHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzM1PC9hPiANCis8cD4NCis8aHI+PGgyPkNvbnN0cnVjdG9yICZhbXA7IERlc3RydWN0b3IgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTAiIGRveHl0YWc9InVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZTo6dWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZTo6dWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvMyI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK01lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Z1NPQVAgY29udGV4dDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWxldGVfVVNDT1JFc2VydmljZSBjbGFzcy4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTEiIGRveHl0YWc9InVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZTo6dWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZTo6dWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvMyI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zZXJ2aWNlS2V5PC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK01lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Z1NPQVAgY29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNlcnZpY2VLZXk8L2VtPiZuYnNwOzwvdGQ+PHRkPmEgc2VydmljZSBrZXkgc3RyaW5nPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGV0ZV9VU0NPUkVzZXJ2aWNlIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQgc2VydmljZSBrZXkuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEyIiBkb3h5dGFnPSJ1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2U6OnVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2U6OnVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZSAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjbzMiPnNvYXA8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5zdGQ6OnZlY3RvciZsdDsgY2hhciAqICZndDsmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c2VydmljZUtleXM8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5nU09BUCBjb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c2VydmljZUtleXM8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbGxlY3Rpb24gb2Ygc2VydmljZSBrZXlzPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGV0ZV9VU0NPUkVzZXJ2aWNlIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQgc2VydmljZSBrZXlzLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+PGgyPk1lbWJlciBGdW5jdGlvbiBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMyIgZG94eXRhZz0idWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlOjpzZW5kIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCI+dWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPiAqIHVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZTo6c2VuZCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5lbmRwb2ludDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+YXV0aEluZm88L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5lbmRwb2ludDwvZW0+Jm5ic3A7PC90ZD48dGQ+VVJMIG9mIHRoZSBVRERJIHNlcnZlciA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmF1dGhJbmZvPC9lbT4mbmJzcDs8L3RkPjx0ZD5hdXRob3JpemF0aW9uIHRva2VuIHByb3ZpZGVkIGJ5IHRoZSBVRERJIHNlcnZlciA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPkEgcG9pbnRlciB0byBhIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCI+dWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPiBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcjwvZGQ+PC9kbD4NCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmljZSB0byBkZWxldGUgYSBzZXJ2aWNlIHRoYXQgbWVldHMgdGhlIHNwZWNpZmllZCByZXF1aXJlbWVudHMuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZTo6YXV0aEluZm8iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI28wIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2U6OmF1dGhJbmZvPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0VsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjphdXRoSW5mby4gDQorPHA+DQorUmVxdWlyZWQgZWxlbWVudCAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMiIgZG94eXRhZz0idWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlOjpnZW5lcmljIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvMiI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlOjpnZW5lcmljPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nLiANCis8cD4NCitSZXF1aXJlZCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9InVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZTo6c2VydmljZUtleSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdGQ6OnZlY3RvciZsdDs8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQiPnVkZGkyX19zZXJ2aWNlS2V5PC9hPiAmZ3Q7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvMSI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlOjpzZXJ2aWNlS2V5PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1ZlY3RvciBvZiB1ZGRpMl9fc2VydmljZUtleSB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8zIiBkb3h5dGFnPSJ1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2U6OnNvYXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvMyI+c29hcDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvMyI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlOjpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU5IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2V0X21vZGVsLW1lbWJlcnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2V0X21vZGVsLW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MThhMjA0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXRfbW9kZWwtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMjEgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsIE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWw8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNvMCI+YXV0aEluZm88L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzIiPmdlbmVyaWM8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjYTMiPnNlbmQ8L2E+KGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbyk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwiPnVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNvMyI+c29hcDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwiPnVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNvMSI+dE1vZGVsS2V5PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWw8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI2EwIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbDwvYT4oc3RydWN0IHNvYXAgKik8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwiPnVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNhMSI+dWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWw8L2E+KHN0cnVjdCBzb2FwICosIGNvbnN0IGNoYXIgKnRNb2RlbEtleSk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwiPnVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNhMiI+dWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWw8L2E+KHN0cnVjdCBzb2FwICosIHN0ZDo6dmVjdG9yJmx0OyBjaGFyICogJmd0OyB0TW9kZWxLZXlzKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWw8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTkgMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ2YTFmNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwKQEAgLTAsMCArMSwzMjggQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IHVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbCBDbGFzcyBSZWZlcmVuY2U8L2gxPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJkZWxldGVfdE1vZGVsIi4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7dWRkaV92Mi5oJmd0OzwvY29kZT4NCis8cD4NCis8YSBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgTWVtYmVyIEZ1bmN0aW9uczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNhMCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWw8L2E+IChzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI28zIj5zb2FwPC9hPiAqKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNhMSI+dWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWw8L2E+IChzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI28zIj5zb2FwPC9hPiAqLCBjb25zdCBjaGFyICo8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzEiPnRNb2RlbEtleTwvYT4pPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gIDxhIGhyZWY9IiNhMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI2EyIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbDwvYT4gKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzMiPnNvYXA8L2E+ICosIHN0ZDo6dmVjdG9yJmx0OyBjaGFyICogJmd0OyB0TW9kZWxLZXlzKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwiPnVkZGkyX19kaXNwb3NpdGlvblJlcG9ydDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI2EzIj5zZW5kPC9hPiAoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNvMCI+YXV0aEluZm88L2E+KTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTMiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzAiPmF1dGhJbmZvPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5FbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YXV0aEluZm8uICA8YSBocmVmPSIjbzAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zdGQ6OnZlY3RvciZsdDsgPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E1Ij51ZGRpMl9fdE1vZGVsS2V5PC9hPiAmZ3Q7Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzEiPnRNb2RlbEtleTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VmVjdG9yIG9mIHVkZGkyX190TW9kZWxLZXkgd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiAgPGEgaHJlZj0iI28xIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzIiPmdlbmVyaWM8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nLiAgPGEgaHJlZj0iI28yIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI28zIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzMiPnNvYXA8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiAgPGEgaHJlZj0iI28zIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzxocj48YSBuYW1lPSJfZGV0YWlscyI+PC9hPjxoMj5EZXRhaWxlZCBEZXNjcmlwdGlvbjwvaDI+DQorU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImRlbGV0ZV90TW9kZWwiLiANCis8cD4NCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBkZWxldGUgYSB0TW9kZWwgdGhhdCBtZWV0cyB0aGUgc3BlY2lmaWVkIHJlcXVpcmVtZW50cy48cD4NCitTZWUgIDxhIGhyZWY9Imh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3MzYiPmh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3MzY8L2E+IA0KKzxwPg0KKzxocj48aDI+Q29uc3RydWN0b3IgJmFtcDsgRGVzdHJ1Y3RvciBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMCIgZG94eXRhZz0idWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWw6OnVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsOjp1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzMiPnNvYXA8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmdTT0FQIGNvbnRleHQ8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZGVsZXRlX1VTQ09SRXRNb2RlbCBjbGFzcy4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTEiIGRveHl0YWc9InVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsOjp1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbDo6dWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI28zIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnRNb2RlbEtleTwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmdTT0FQIGNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT50TW9kZWxLZXk8L2VtPiZuYnNwOzwvdGQ+PHRkPmEgdE1vZGVsIGtleSBzdHJpbmc8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZGVsZXRlX1VTQ09SRXRNb2RlbCBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkIHRNb2RlbCBrZXkuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEyIiBkb3h5dGFnPSJ1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbDo6dWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWw6OnVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNvMyI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPnN0ZDo6dmVjdG9yJmx0OyBjaGFyICogJmd0OyZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT50TW9kZWxLZXlzPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK01lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Z1NPQVAgY29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnRNb2RlbEtleXM8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbGxlY3Rpb24gb2YgdE1vZGVsIGtleXM8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZGVsZXRlX1VTQ09SRXRNb2RlbCBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkIHRNb2RlbCBrZXlzLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+PGgyPk1lbWJlciBGdW5jdGlvbiBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMyIgZG94eXRhZz0idWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWw6OnNlbmQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sIj51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQ8L2E+ICogdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWw6OnNlbmQgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+ZW5kcG9pbnQ8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmF1dGhJbmZvPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK01lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+ZW5kcG9pbnQ8L2VtPiZuYnNwOzwvdGQ+PHRkPlVSTCBvZiB0aGUgVURESSBzZXJ2ZXIgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5hdXRoSW5mbzwvZW0+Jm5ic3A7PC90ZD48dGQ+YXV0aG9yaXphdGlvbiB0b2tlbiBwcm92aWRlZCBieSB0aGUgVURESSBzZXJ2ZXIgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5BIHBvaW50ZXIgdG8gYSA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwiPnVkZGkyX19kaXNwb3NpdGlvblJlcG9ydDwvYT4gb2JqZWN0IG9yIE5VTEwgb24gZXJyb3I8L2RkPjwvZGw+DQorU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZpY2UgdG8gZGVsZXRlIGEgdE1vZGVsIHRoYXQgbWVldHMgdGhlIHNwZWNpZmllZCByZXF1aXJlbWVudHMuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsOjphdXRoSW5mbyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzAiPnVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsOjphdXRoSW5mbzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YXV0aEluZm8uIA0KKzxwPg0KK1JlcXVpcmVkIGVsZW1lbnQgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9InVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsOjpnZW5lcmljIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNvMiI+dWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWw6OmdlbmVyaWM8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcuIA0KKzxwPg0KK1JlcXVpcmVkIGF0dHJpYnV0ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMyIgZG94eXRhZz0idWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWw6OnNvYXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNvMyI+c29hcDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNvMyI+dWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWw6OnNvYXA8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJ1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbDo6dE1vZGVsS2V5IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0ZDo6dmVjdG9yJmx0OzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNSI+dWRkaTJfX3RNb2RlbEtleTwvYT4gJmd0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzEiPnVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsOjp0TW9kZWxLZXk8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVmVjdG9yIG9mIHVkZGkyX190TW9kZWxLZXkgd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU5IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZGVzY3JpcHRpb24tbWVtYmVycy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19kZXNjcmlwdGlvbi1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUxZmFjNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZGVzY3JpcHRpb24tbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTYgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19kZXNjcmlwdGlvbiBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVzY3JpcHRpb24uaHRtbCI+dWRkaTJfX2Rlc2NyaXB0aW9uPC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVzY3JpcHRpb24uaHRtbCNvMCI+X19pdGVtPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZXNjcmlwdGlvbi5odG1sIj51ZGRpMl9fZGVzY3JpcHRpb248L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rlc2NyaXB0aW9uLmh0bWwjbzIiPnNvYXA8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rlc2NyaXB0aW9uLmh0bWwiPnVkZGkyX19kZXNjcmlwdGlvbjwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVzY3JpcHRpb24uaHRtbCNvMSI+eG1sX19sYW5nXzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVzY3JpcHRpb24uaHRtbCI+dWRkaTJfX2Rlc2NyaXB0aW9uPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU5IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZGVzY3JpcHRpb24uaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZGVzY3JpcHRpb24uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjdiZjdkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19kZXNjcmlwdGlvbi5odG1sCkBAIC0wLDAgKzEsMTA4IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiB1ZGRpMl9fZGVzY3JpcHRpb24gQ2xhc3MgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19kZXNjcmlwdGlvbiBDbGFzcyBSZWZlcmVuY2U8L2gxPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJkZXNjcmlwdGlvbiIuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3VkZGlfdjIuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZXNjcmlwdGlvbi1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgQXR0cmlidXRlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZXNjcmlwdGlvbi5odG1sI28wIj5fX2l0ZW08L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTEiPnhtbF9fbGFuZzwvYT4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZXNjcmlwdGlvbi5odG1sI28xIj54bWxfX2xhbmdfPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgcmVmZXJlbmNlIHhtbDpsYW5nLiAgPGEgaHJlZj0iI28xIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rlc2NyaXB0aW9uLmh0bWwjbzIiPnNvYXA8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZXNjcmlwdGlvbi5odG1sI28yIj5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvMiI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJkZXNjcmlwdGlvbiIuIA0KKzxwPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InVkZGkyX19kZXNjcmlwdGlvbjo6X19pdGVtIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZXNjcmlwdGlvbi5odG1sI28wIj51ZGRpMl9fZGVzY3JpcHRpb246Ol9faXRlbTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMiIgZG94eXRhZz0idWRkaTJfX2Rlc2NyaXB0aW9uOjpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVzY3JpcHRpb24uaHRtbCNvMiI+c29hcDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZXNjcmlwdGlvbi5odG1sI28yIj51ZGRpMl9fZGVzY3JpcHRpb246OnNvYXA8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJ1ZGRpMl9fZGVzY3JpcHRpb246OnhtbF9fbGFuZ18iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2ExIj54bWxfX2xhbmc8L2E+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZXNjcmlwdGlvbi5odG1sI28xIj51ZGRpMl9fZGVzY3JpcHRpb246OnhtbF9fbGFuZ188L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIHJlZmVyZW5jZSB4bWw6bGFuZy4gDQorPHA+DQorT3B0aW9uYWwgYXR0cmlidXRlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3VkZGkyLzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCI+dWRkaV92Mi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTkgMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19kaXNjYXJkX19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLW1lbWJlcnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZGlzY2FyZF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJkODA1MwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZGlzY2FyZF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwxOSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuIE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjYXJkX19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLmh0bWwiPnVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbjwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NhcmRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCNvMCI+YXV0aEluZm88L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NhcmRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCI+dWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjYXJkX19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLmh0bWwjbzEiPmdlbmVyaWM8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NhcmRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCI+dWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjYXJkX19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLmh0bWwjYTIiPnNlbmQ8L2E+KGNvbnN0IGNoYXIgKmVuZHBvaW50KTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjYXJkX19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLmh0bWwiPnVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbjwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzY2FyZF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sI28yIj5zb2FwPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjYXJkX19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLmh0bWwiPnVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbjwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzY2FyZF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sI2EwIj51ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW48L2E+KHN0cnVjdCBzb2FwICopPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NhcmRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCI+dWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjYXJkX19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLmh0bWwjYTEiPnVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbjwvYT4oc3RydWN0IHNvYXAgKiwgY29uc3QgY2hhciAqYXV0aEluZm8pPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NhcmRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCI+dWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU5IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZGlzY2FyZF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19kaXNjYXJkX19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRiNjBiMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZGlzY2FyZF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sCkBAIC0wLDAgKzEsMjQyIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiB1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4gQ2xhc3MgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbiBDbGFzcyBSZWZlcmVuY2U8L2gxPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJkaXNjYXJkX2F1dGhUb2tlbiIuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3VkZGlfdjIuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjYXJkX19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBNZW1iZXIgRnVuY3Rpb25zPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NhcmRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCNhMCI+dWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuPC9hPiAoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjYXJkX19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLmh0bWwjbzIiPnNvYXA8L2E+ICopPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gIDxhIGhyZWY9IiNhMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NhcmRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCNhMSI+dWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuPC9hPiAoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjYXJkX19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLmh0bWwjbzIiPnNvYXA8L2E+ICosIGNvbnN0IGNoYXIgKjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjYXJkX19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLmh0bWwjbzAiPmF1dGhJbmZvPC9hPik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+TWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2ExIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sIj51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQ8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjYXJkX19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLmh0bWwjYTIiPnNlbmQ8L2E+IChjb25zdCBjaGFyICplbmRwb2ludCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+TWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2EyIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NhcmRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCNvMCI+YXV0aEluZm88L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjphdXRoSW5mby4gIDxhIGhyZWY9IiNvMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NhcmRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCNvMSI+Z2VuZXJpYzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcuICA8YSBocmVmPSIjbzEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzY2FyZF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sI28yIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzY2FyZF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sI28yIj5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvMiI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJkaXNjYXJkX2F1dGhUb2tlbiIuIA0KKzxwPg0KK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIGRpc2NhcmQgYW4gYXV0aG9yaXphdGlvbiB0b2tlbiBvYnRhaW5lZCB3aXRoIHRoZSBnZXRfVVNDT1JFYXV0aFRva2VuIGNsYXNzLjxwPg0KK1NlZSAgPGEgaHJlZj0iaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzczNyI+aHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzczNzwvYT4gDQorPHA+DQorPGhyPjxoMj5Db25zdHJ1Y3RvciAmYW1wOyBEZXN0cnVjdG9yIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEwIiBkb3h5dGFnPSJ1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW46OnVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbiIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW46OnVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbiAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzY2FyZF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sI28yIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiA8ZW0+c29hcDwvZW0+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5nU09BUCBjb250ZXh0PC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGV0ZV9VU0NPUkVhdXRoVG9rZW4gY2xhc3MuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExIiBkb3h5dGFnPSJ1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW46OnVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbiIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW46OnVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbiAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzY2FyZF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sI28yIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmF1dGhJbmZvPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK01lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Z1NPQVAgY29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmF1dGhJbmZvPC9lbT4mbmJzcDs8L3RkPjx0ZD5hdXRob3JpemF0aW9uIHRva2VuIHByb3ZpZGVkIGJ5IHRoZSBVRERJIHNlcnZlcjwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWxldGVfVVNDT1JFYXV0aFRva2VuIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQgYXV0aGVudGljYXRpb24gdG9rZW4gc3RyaW5nLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+PGgyPk1lbWJlciBGdW5jdGlvbiBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMiIgZG94eXRhZz0idWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuOjpzZW5kIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCI+dWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPiAqIHVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbjo6c2VuZCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gPGVtPmVuZHBvaW50PC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmVuZHBvaW50PC9lbT4mbmJzcDs8L3RkPjx0ZD5VUkwgb2YgdGhlIFVEREkgc2VydmVyIDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+QSBwb2ludGVyIHRvIGEgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sIj51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQ8L2E+IG9iamVjdCBvciBOVUxMIG9uIGVycm9yPC9kZD48L2RsPg0KK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2aWNlIHRvIGRpc2NhcmQgYW4gYXV0aGVudGljYXRpb24gdG9rZW4uICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbjo6YXV0aEluZm8iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NhcmRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCNvMCI+dWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuOjphdXRoSW5mbzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YXV0aEluZm8uIA0KKzxwPg0KK1JlcXVpcmVkIGVsZW1lbnQgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9InVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbjo6Z2VuZXJpYyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzY2FyZF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sI28xIj51ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW46OmdlbmVyaWM8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcuIA0KKzxwPg0KK1JlcXVpcmVkIGF0dHJpYnV0ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMiIgZG94eXRhZz0idWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuOjpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzY2FyZF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sI28yIj5zb2FwPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NhcmRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCNvMiI+dWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuOjpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU5IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZGlzY292ZXJ5X3Vfcl9sLW1lbWJlcnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZGlzY292ZXJ5X3Vfcl9sLW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjRlNGU1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19kaXNjb3ZlcnlfdV9yX2wtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTYgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19kaXNjb3ZlcnlVUkwgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NvdmVyeV91X3JfbC5odG1sIj51ZGRpMl9fZGlzY292ZXJ5VVJMPC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzY292ZXJ5X3Vfcl9sLmh0bWwjbzAiPl9faXRlbTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzY292ZXJ5X3Vfcl9sLmh0bWwiPnVkZGkyX19kaXNjb3ZlcnlVUkw8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NvdmVyeV91X3JfbC5odG1sI28yIj5zb2FwPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjb3ZlcnlfdV9yX2wuaHRtbCI+dWRkaTJfX2Rpc2NvdmVyeVVSTDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzY292ZXJ5X3Vfcl9sLmh0bWwjbzEiPnVzZVR5cGU8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NvdmVyeV91X3JfbC5odG1sIj51ZGRpMl9fZGlzY292ZXJ5VVJMPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU5IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZGlzY292ZXJ5X3Vfcl9sLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2Rpc2NvdmVyeV91X3JfbC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMmYwY2EKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2Rpc2NvdmVyeV91X3JfbC5odG1sCkBAIC0wLDAgKzEsMTA4IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiB1ZGRpMl9fZGlzY292ZXJ5VVJMIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fZGlzY292ZXJ5VVJMIENsYXNzIFJlZmVyZW5jZTwvaDE+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImRpc2NvdmVyeVVSTCIuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3VkZGlfdjIuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjb3ZlcnlfdV9yX2wtbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzY292ZXJ5X3Vfcl9sLmh0bWwjbzAiPl9faXRlbTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NvdmVyeV91X3JfbC5odG1sI28xIj51c2VUeXBlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgdXNlVHlwZSBvZiB0eXBlIHhzOnN0cmluZy4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjb3ZlcnlfdV9yX2wuaHRtbCNvMiI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NvdmVyeV91X3JfbC5odG1sI28yIj5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvMiI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJkaXNjb3ZlcnlVUkwiLiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJ1ZGRpMl9fZGlzY292ZXJ5VVJMOjpfX2l0ZW0iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NvdmVyeV91X3JfbC5odG1sI28wIj51ZGRpMl9fZGlzY292ZXJ5VVJMOjpfX2l0ZW08L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9InVkZGkyX19kaXNjb3ZlcnlVUkw6OnNvYXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjb3ZlcnlfdV9yX2wuaHRtbCNvMiI+c29hcDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjb3ZlcnlfdV9yX2wuaHRtbCNvMiI+dWRkaTJfX2Rpc2NvdmVyeVVSTDo6c29hcDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9InVkZGkyX19kaXNjb3ZlcnlVUkw6OnVzZVR5cGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NvdmVyeV91X3JfbC5odG1sI28xIj51ZGRpMl9fZGlzY292ZXJ5VVJMOjp1c2VUeXBlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSB1c2VUeXBlIG9mIHR5cGUgeHM6c3RyaW5nLiANCis8cD4NCitSZXF1aXJlZCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvdWRkaTIvPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sIj51ZGRpX3YyLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNjo1OSAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2Rpc2NvdmVyeV91X3JfbHMtbWVtYmVycy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19kaXNjb3ZlcnlfdV9yX2xzLW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2YzYTdjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19kaXNjb3ZlcnlfdV9yX2xzLW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDE1IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fZGlzY292ZXJ5VVJMcyBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzY292ZXJ5X3Vfcl9scy5odG1sIj51ZGRpMl9fZGlzY292ZXJ5VVJMczwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NvdmVyeV91X3JfbHMuaHRtbCNvMCI+ZGlzY292ZXJ5VVJMPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjb3ZlcnlfdV9yX2xzLmh0bWwiPnVkZGkyX19kaXNjb3ZlcnlVUkxzPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjb3ZlcnlfdV9yX2xzLmh0bWwjbzEiPnNvYXA8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NvdmVyeV91X3JfbHMuaHRtbCI+dWRkaTJfX2Rpc2NvdmVyeVVSTHM8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTkgMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19kaXNjb3ZlcnlfdV9yX2xzLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2Rpc2NvdmVyeV91X3JfbHMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWU5ZmRiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19kaXNjb3ZlcnlfdV9yX2xzLmh0bWwKQEAgLTAsMCArMSw4MyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogdWRkaTJfX2Rpc2NvdmVyeVVSTHMgQ2xhc3MgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19kaXNjb3ZlcnlVUkxzIENsYXNzIFJlZmVyZW5jZTwvaDE+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImRpc2NvdmVyeVVSTHMiLiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KKzxjb2RlPiNpbmNsdWRlICZsdDt1ZGRpX3YyLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KKzxhIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzY292ZXJ5X3Vfcl9scy1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgQXR0cmlidXRlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zdGQ6OnZlY3RvciZsdDsgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NvdmVyeV91X3JfbC5odG1sIj51ZGRpMl9fZGlzY292ZXJ5VVJMPC9hPiAqICZndDsmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjb3ZlcnlfdV9yX2xzLmh0bWwjbzAiPmRpc2NvdmVyeVVSTDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VmVjdG9yIG9mIHVkZGkyX19kaXNjb3ZlcnlVUkwqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gIDxhIGhyZWY9IiNvMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjb3ZlcnlfdV9yX2xzLmh0bWwjbzEiPnNvYXA8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjb3ZlcnlfdV9yX2xzLmh0bWwjbzEiPnNvYXA8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiAgPGEgaHJlZj0iI28xIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzxocj48YSBuYW1lPSJfZGV0YWlscyI+PC9hPjxoMj5EZXRhaWxlZCBEZXNjcmlwdGlvbjwvaDI+DQorU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImRpc2NvdmVyeVVSTHMiLiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJ1ZGRpMl9fZGlzY292ZXJ5VVJMczo6ZGlzY292ZXJ5VVJMIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0ZDo6dmVjdG9yJmx0OzxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjb3ZlcnlfdV9yX2wuaHRtbCI+dWRkaTJfX2Rpc2NvdmVyeVVSTDwvYT4qICZndDsgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NvdmVyeV91X3JfbHMuaHRtbCNvMCI+dWRkaTJfX2Rpc2NvdmVyeVVSTHM6OmRpc2NvdmVyeVVSTDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitWZWN0b3Igb2YgdWRkaTJfX2Rpc2NvdmVyeVVSTCogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0idWRkaTJfX2Rpc2NvdmVyeVVSTHM6OnNvYXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjb3ZlcnlfdV9yX2xzLmh0bWwjbzEiPnNvYXA8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzY292ZXJ5X3Vfcl9scy5odG1sI28xIj51ZGRpMl9fZGlzY292ZXJ5VVJMczo6c29hcDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvdWRkaTIvPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sIj51ZGRpX3YyLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNjo1OSAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2Rpc3Bvc2l0aW9uX3JlcG9ydC1tZW1iZXJzLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2Rpc3Bvc2l0aW9uX3JlcG9ydC1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQxMjlhNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZGlzcG9zaXRpb25fcmVwb3J0LW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDE4IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sIj51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQ8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCNvMSI+Z2VuZXJpYzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwiPnVkZGkyX19kaXNwb3NpdGlvblJlcG9ydDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwjbzIiPm9wZXJhdG9yXzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwiPnVkZGkyX19kaXNwb3NpdGlvblJlcG9ydDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwjbzAiPnJlc3VsdDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwiPnVkZGkyX19kaXNwb3NpdGlvblJlcG9ydDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwjbzQiPnNvYXA8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sIj51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQ8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sI28zIj50cnVuY2F0ZWQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sIj51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQ8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTkgMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJlZTk2NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwKQEAgLTAsMCArMSwxNjcgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCBDbGFzcyBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0IENsYXNzIFJlZmVyZW5jZTwvaDE+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImRpc3Bvc2l0aW9uUmVwb3J0Ii4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7dWRkaV92Mi5oJmd0OzwvY29kZT4NCis8cD4NCis8YSBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc3Bvc2l0aW9uX3JlcG9ydC1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgQXR0cmlidXRlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zdGQ6OnZlY3RvciZsdDsgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3Jlc3VsdC5odG1sIj51ZGRpMl9fcmVzdWx0PC9hPiAqICZndDsmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCNvMCI+cmVzdWx0PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5WZWN0b3Igb2YgdWRkaTJfX3Jlc3VsdCogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiAgPGEgaHJlZj0iI28wIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwjbzEiPmdlbmVyaWM8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nLiAgPGEgaHJlZj0iI28xIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwjbzIiPm9wZXJhdG9yXzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIG9wZXJhdG9yIG9mIHR5cGUgeHM6c3RyaW5nLiAgPGEgaHJlZj0iI28yIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+ZW51bSA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQ4Ij51ZGRpMl9fdHJ1bmNhdGVkPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwjbzMiPnRydW5jYXRlZDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIHRydW5jYXRlZCBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0cnVuY2F0ZWQuICA8YSBocmVmPSIjbzMiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwjbzQiPnNvYXA8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCNvNCI+c29hcDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuICA8YSBocmVmPSIjbzQiPjwvYT48YnI+PC90ZD48L3RyPg0KKzwvdGFibGU+DQorPGhyPjxhIG5hbWU9Il9kZXRhaWxzIj48L2E+PGgyPkRldGFpbGVkIERlc2NyaXB0aW9uPC9oMj4NCitTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZGlzcG9zaXRpb25SZXBvcnQiLiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJ1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQ6OmdlbmVyaWMiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sI28xIj51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQ6OmdlbmVyaWM8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcuIA0KKzxwPg0KK1JlcXVpcmVkIGF0dHJpYnV0ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMiIgZG94eXRhZz0idWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0OjpvcGVyYXRvcl8iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sI28yIj51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQ6Om9wZXJhdG9yXzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgb3BlcmF0b3Igb2YgdHlwZSB4czpzdHJpbmcuIA0KKzxwPg0KK1JlcXVpcmVkIGF0dHJpYnV0ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0idWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0OjpyZXN1bHQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RkOjp2ZWN0b3ImbHQ7PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3Jlc3VsdC5odG1sIj51ZGRpMl9fcmVzdWx0PC9hPiogJmd0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwjbzAiPnVkZGkyX19kaXNwb3NpdGlvblJlcG9ydDo6cmVzdWx0PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1ZlY3RvciBvZiB1ZGRpMl9fcmVzdWx0KiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im80IiBkb3h5dGFnPSJ1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQ6OnNvYXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCNvNCI+c29hcDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCNvNCI+dWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0Ojpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMyIgZG94eXRhZz0idWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0Ojp0cnVuY2F0ZWQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gZW51bSA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQ4Ij51ZGRpMl9fdHJ1bmNhdGVkPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sI28zIj51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQ6OnRydW5jYXRlZDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgdHJ1bmNhdGVkIG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRydW5jYXRlZC4gDQorPHA+DQorT3B0aW9uYWwgYXR0cmlidXRlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3VkZGkyLzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCI+dWRkaV92Mi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTkgMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19lbWFpbC1tZW1iZXJzLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2VtYWlsLW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTA0NTdhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19lbWFpbC1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwxNiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX2VtYWlsIE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19lbWFpbC5odG1sIj51ZGRpMl9fZW1haWw8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19lbWFpbC5odG1sI28wIj5fX2l0ZW08L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2VtYWlsLmh0bWwiPnVkZGkyX19lbWFpbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZW1haWwuaHRtbCNvMiI+c29hcDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZW1haWwuaHRtbCI+dWRkaTJfX2VtYWlsPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19lbWFpbC5odG1sI28xIj51c2VUeXBlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19lbWFpbC5odG1sIj51ZGRpMl9fZW1haWw8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTkgMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19lbWFpbC5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19lbWFpbC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YzgyMjQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2VtYWlsLmh0bWwKQEAgLTAsMCArMSwxMDggQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IHVkZGkyX19lbWFpbCBDbGFzcyBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX2VtYWlsIENsYXNzIFJlZmVyZW5jZTwvaDE+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImVtYWlsIi4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7dWRkaV92Mi5oJmd0OzwvY29kZT4NCis8cD4NCis8YSBocmVmPSJjbGFzc3VkZGkyX19fX2VtYWlsLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2VtYWlsLmh0bWwjbzAiPl9faXRlbTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2VtYWlsLmh0bWwjbzEiPnVzZVR5cGU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkF0dHJpYnV0ZSB1c2VUeXBlIG9mIHR5cGUgeHM6c3RyaW5nLiAgPGEgaHJlZj0iI28xIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2VtYWlsLmh0bWwjbzIiPnNvYXA8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19lbWFpbC5odG1sI28yIj5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvMiI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJlbWFpbCIuIA0KKzxwPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InVkZGkyX19lbWFpbDo6X19pdGVtIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19lbWFpbC5odG1sI28wIj51ZGRpMl9fZW1haWw6Ol9faXRlbTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMiIgZG94eXRhZz0idWRkaTJfX2VtYWlsOjpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZW1haWwuaHRtbCNvMiI+c29hcDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19lbWFpbC5odG1sI28yIj51ZGRpMl9fZW1haWw6OnNvYXA8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJ1ZGRpMl9fZW1haWw6OnVzZVR5cGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2VtYWlsLmh0bWwjbzEiPnVkZGkyX19lbWFpbDo6dXNlVHlwZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgdXNlVHlwZSBvZiB0eXBlIHhzOnN0cmluZy4gDQorPHA+DQorT3B0aW9uYWwgYXR0cmlidXRlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3VkZGkyLzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCI+dWRkaV92Mi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTkgMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19lcnJfaW5mby1tZW1iZXJzLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2Vycl9pbmZvLW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjA3NTU1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19lcnJfaW5mby1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwxNiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX2VyckluZm8gTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Vycl9pbmZvLmh0bWwiPnVkZGkyX19lcnJJbmZvPC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZXJyX2luZm8uaHRtbCNvMCI+X19pdGVtPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19lcnJfaW5mby5odG1sIj51ZGRpMl9fZXJySW5mbzwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZXJyX2luZm8uaHRtbCNvMSI+ZXJyQ29kZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZXJyX2luZm8uaHRtbCI+dWRkaTJfX2VyckluZm88L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Vycl9pbmZvLmh0bWwjbzIiPnNvYXA8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Vycl9pbmZvLmh0bWwiPnVkZGkyX19lcnJJbmZvPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU5IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZXJyX2luZm8uaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZXJyX2luZm8uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODFiYmJhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19lcnJfaW5mby5odG1sCkBAIC0wLDAgKzEsMTA4IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiB1ZGRpMl9fZXJySW5mbyBDbGFzcyBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX2VyckluZm8gQ2xhc3MgUmVmZXJlbmNlPC9oMT5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZXJySW5mbyIuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3VkZGlfdjIuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19lcnJfaW5mby1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgQXR0cmlidXRlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19lcnJfaW5mby5odG1sI28wIj5fX2l0ZW08L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19lcnJfaW5mby5odG1sI28xIj5lcnJDb2RlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgZXJyQ29kZSBvZiB0eXBlIHhzOnN0cmluZy4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19lcnJfaW5mby5odG1sI28yIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZXJyX2luZm8uaHRtbCNvMiI+c29hcDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuICA8YSBocmVmPSIjbzIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzwvdGFibGU+DQorPGhyPjxhIG5hbWU9Il9kZXRhaWxzIj48L2E+PGgyPkRldGFpbGVkIERlc2NyaXB0aW9uPC9oMj4NCitTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZXJySW5mbyIuIA0KKzxwPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InVkZGkyX19lcnJJbmZvOjpfX2l0ZW0iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Vycl9pbmZvLmh0bWwjbzAiPnVkZGkyX19lcnJJbmZvOjpfX2l0ZW08L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9InVkZGkyX19lcnJJbmZvOjplcnJDb2RlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19lcnJfaW5mby5odG1sI28xIj51ZGRpMl9fZXJySW5mbzo6ZXJyQ29kZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgZXJyQ29kZSBvZiB0eXBlIHhzOnN0cmluZy4gDQorPHA+DQorUmVxdWlyZWQgYXR0cmlidXRlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJ1ZGRpMl9fZXJySW5mbzo6c29hcCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Vycl9pbmZvLmh0bWwjbzIiPnNvYXA8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZXJyX2luZm8uaHRtbCNvMiI+dWRkaTJfX2VyckluZm86OnNvYXA8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3VkZGkyLzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCI+dWRkaV92Mi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTkgMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2ViaW5kaW5nLW1lbWJlcnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYmluZGluZy1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI1MTRlZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYmluZGluZy1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwyMyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZyBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sIj51ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nPC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI28wIj5maW5kUXVhbGlmaWVyczwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sIj51ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjbzIiPmdlbmVyaWM8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCI+dWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZzwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI28zIj5tYXhSb3dzPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwiPnVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmc8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNhMyI+c2VuZDwvYT4oY29uc3QgY2hhciAqZW5kcG9pbnQpPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCI+dWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZzwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI280Ij5zZXJ2aWNlS2V5PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwiPnVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmc8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNvNSI+c29hcDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sIj51ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjbzEiPnRNb2RlbEJhZzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sIj51ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjYTAiPnVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmc8L2E+KHN0cnVjdCBzb2FwICopPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCI+dWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZzwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI2ExIj51ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nPC9hPihzdHJ1Y3Qgc29hcCAqLCBjb25zdCBjaGFyICp0TW9kZWxLZXkpPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCI+dWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZzwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI2EyIj51ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nPC9hPihzdHJ1Y3Qgc29hcCAqLCBzdGQ6OnZlY3RvciZsdDsgY2hhciAqICZndDsgdE1vZGVsS2V5cyk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sIj51ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU5IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRiOGI3MQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sCkBAIC0wLDAgKzEsMzc0IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiB1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nIENsYXNzIFJlZmVyZW5jZTwvaDE+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImZpbmRfYmluZGluZyIuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3VkZGlfdjIuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2ViaW5kaW5nLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBNZW1iZXIgRnVuY3Rpb25zPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNhMCI+dWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZzwvYT4gKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI281Ij5zb2FwPC9hPiAqKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjYTEiPnVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmc8L2E+IChzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNvNSI+c29hcDwvYT4gKiwgY29uc3QgY2hhciAqdE1vZGVsS2V5KTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjYTIiPnVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmc8L2E+IChzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNvNSI+c29hcDwvYT4gKiwgc3RkOjp2ZWN0b3ImbHQ7IGNoYXIgKiAmZ3Q7IHRNb2RlbEtleXMpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gIDxhIGhyZWY9IiNhMiI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX2RldGFpbC5odG1sIj51ZGRpMl9fYmluZGluZ0RldGFpbDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNhMyI+c2VuZDwvYT4gKGNvbnN0IGNoYXIgKmVuZHBvaW50KTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTMiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfcXVhbGlmaWVycy5odG1sIj51ZGRpMl9fZmluZFF1YWxpZmllcnM8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjbzAiPmZpbmRRdWFsaWZpZXJzPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5FbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6ZmluZFF1YWxpZmllcnMuICA8YSBocmVmPSIjbzAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9iYWcuaHRtbCI+dWRkaTJfX3RNb2RlbEJhZzwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNvMSI+dE1vZGVsQmFnPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5FbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dE1vZGVsQmFnLiAgPGEgaHJlZj0iI28xIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI28yIj5nZW5lcmljPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZy4gIDxhIGhyZWY9IiNvMiI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI28zIj5tYXhSb3dzPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgbWF4Um93cyBvZiB0eXBlIHhzOmludC4gIDxhIGhyZWY9IiNvMyI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNCI+dWRkaTJfX3NlcnZpY2VLZXk8L2E+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI280Ij5zZXJ2aWNlS2V5PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgc2VydmljZUtleSBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpzZXJ2aWNlS2V5LiAgPGEgaHJlZj0iI280Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNvNSI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNvNSI+c29hcDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuICA8YSBocmVmPSIjbzUiPjwvYT48YnI+PC90ZD48L3RyPg0KKzwvdGFibGU+DQorPGhyPjxhIG5hbWU9Il9kZXRhaWxzIj48L2E+PGgyPkRldGFpbGVkIERlc2NyaXB0aW9uPC9oMj4NCitTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZmluZF9iaW5kaW5nIi4gDQorPHA+DQorUmVwcmVzZW50cyBhIHJlcXVlc3QgdG8gbG9jYXRlIGJpbmRpbmdzIHRoYXQgbWVldCB0aGUgc3BlY2lmaWVkIHJlcXVpcmVtZW50cy48cD4NCitTZWUgIDxhIGhyZWY9Imh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3MTIiPmh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3MTI8L2E+IA0KKzxwPg0KKzxocj48aDI+Q29uc3RydWN0b3IgJmFtcDsgRGVzdHJ1Y3RvciBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMCIgZG94eXRhZz0idWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZzo6dWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nOjp1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjbzUiPnNvYXA8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmdTT0FQIGNvbnRleHQ8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmluZF9VU0NPUkViaW5kaW5nIGNsYXNzLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMSIgZG94eXRhZz0idWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZzo6dWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nOjp1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjbzUiPnNvYXA8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+dE1vZGVsS2V5PC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK01lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Z1NPQVAgY29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnRNb2RlbEtleTwvZW0+Jm5ic3A7PC90ZD48dGQ+c3RyaW5nPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZpbmRfVVNDT1JFYmluZGluZyBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkIHRNb2RlbCBrZXkuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEyIiBkb3h5dGFnPSJ1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nOjp1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmc6OnVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmcgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNvNSI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPnN0ZDo6dmVjdG9yJmx0OyBjaGFyICogJmd0OyZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT50TW9kZWxLZXlzPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK01lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Z1NPQVAgY29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnRNb2RlbEtleXM8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbGxlY3Rpb24gb2YgdE1vZGVsIGtleSBzdHJpbmdzPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZpbmRfVVNDT1JFYmluZGluZyBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkIHRNb2RlbCBrZXlzLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+PGgyPk1lbWJlciBGdW5jdGlvbiBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMyIgZG94eXRhZz0idWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZzo6c2VuZCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ19kZXRhaWwuaHRtbCI+dWRkaTJfX2JpbmRpbmdEZXRhaWw8L2E+ICogdWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZzo6c2VuZCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gPGVtPmVuZHBvaW50PC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmVuZHBvaW50PC9lbT4mbmJzcDs8L3RkPjx0ZD5VUkwgb2YgdGhlIFVEREkgc2VydmVyIDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+QSBwb2ludGVyIHRvIGEgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfZGV0YWlsLmh0bWwiPnVkZGkyX19iaW5kaW5nRGV0YWlsPC9hPiBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcjwvZGQ+PC9kbD4NCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmVyIHRvIGZpbmQgYmluZGluZyBkZXRhaWxzLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJ1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nOjpmaW5kUXVhbGlmaWVycyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9xdWFsaWZpZXJzLmh0bWwiPnVkZGkyX19maW5kUXVhbGlmaWVyczwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjbzAiPnVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmc6OmZpbmRRdWFsaWZpZXJzPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0VsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpmaW5kUXVhbGlmaWVycy4gDQorPHA+DQorT3B0aW9uYWwgZWxlbWVudCAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMiIgZG94eXRhZz0idWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZzo6Z2VuZXJpYyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI28yIj51ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nOjpnZW5lcmljPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nLiANCis8cD4NCitSZXF1aXJlZCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzMiIGRveHl0YWc9InVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmc6Om1heFJvd3MiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI28zIj51ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nOjptYXhSb3dzPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSBtYXhSb3dzIG9mIHR5cGUgeHM6aW50LiANCis8cD4NCitPcHRpb25hbCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzQiIGRveHl0YWc9InVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmc6OnNlcnZpY2VLZXkiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0Ij51ZGRpMl9fc2VydmljZUtleTwvYT4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNvNCI+dWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZzo6c2VydmljZUtleTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgc2VydmljZUtleSBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpzZXJ2aWNlS2V5LiANCis8cD4NCitSZXF1aXJlZCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzUiIGRveHl0YWc9InVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmc6OnNvYXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjbzUiPnNvYXA8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI281Ij51ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nOjpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0idWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZzo6dE1vZGVsQmFnIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2JhZy5odG1sIj51ZGRpMl9fdE1vZGVsQmFnPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNvMSI+dWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZzo6dE1vZGVsQmFnPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0VsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0TW9kZWxCYWcuIA0KKzxwPg0KK1JlcXVpcmVkIGVsZW1lbnQgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvdWRkaTIvPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sIj51ZGRpX3YyLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNjo1OSAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLW1lbWJlcnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYnVzaW5lc3MtbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1OTkxZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDI3IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzcyBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCI+dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI28zIj5jYXRlZ29yeUJhZzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCI+dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzUiPmRpc2NvdmVyeVVSTHM8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwiPnVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI28wIj5maW5kUXVhbGlmaWVyczwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCI+dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzYiPmdlbmVyaWM8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwiPnVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI28yIj5pZGVudGlmaWVyQmFnPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sIj51ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzczwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvNyI+bWF4Um93czwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCI+dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzEiPm5hbWU8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwiPnVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI2E0Ij5zZW5kPC9hPihjb25zdCBjaGFyICplbmRwb2ludCk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCI+dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzgiPnNvYXA8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwiPnVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI280Ij50TW9kZWxCYWc8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwiPnVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI2EwIj51ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzczwvYT4oc3RydWN0IHNvYXAgKik8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCI+dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjYTEiPnVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzPC9hPihzdHJ1Y3Qgc29hcCAqLCBjb25zdCBjaGFyICpuYW1lKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sIj51ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzczwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNhMiI+dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M8L2E+KHN0cnVjdCBzb2FwICosIHN0ZDo6dmVjdG9yJmx0OyBjaGFyICogJmd0OyB0TW9kZWxLZXlzKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sIj51ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzczwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNhMyI+dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M8L2E+KHN0cnVjdCBzb2FwICosIHN0ZDo6dmVjdG9yJmx0OyB1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UgKiAmZ3Q7IGtleWVkUmVmZXJlbmNlcyk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCI+dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTkgMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5OWNmNGQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwKQEAgLTAsMCArMSw1MDUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IHVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzcyBDbGFzcyBSZWZlcmVuY2U8L2gxPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJmaW5kX2J1c2luZXNzIi4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7dWRkaV92Mi5oJmd0OzwvY29kZT4NCis8cD4NCis8YSBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBNZW1iZXIgRnVuY3Rpb25zPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjYTAiPnVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzPC9hPiAoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI284Ij5zb2FwPC9hPiAqKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI2ExIj51ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzczwvYT4gKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvOCI+c29hcDwvYT4gKiwgY29uc3QgY2hhciAqPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzEiPm5hbWU8L2E+KTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI2EyIj51ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzczwvYT4gKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvOCI+c29hcDwvYT4gKiwgc3RkOjp2ZWN0b3ImbHQ7IGNoYXIgKiAmZ3Q7IHRNb2RlbEtleXMpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gIDxhIGhyZWY9IiNhMiI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjYTMiPnVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzPC9hPiAoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI284Ij5zb2FwPC9hPiAqLCBzdGQ6OnZlY3RvciZsdDsgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2tleWVkX3JlZmVyZW5jZS5odG1sIj51ZGRpMl9fa2V5ZWRSZWZlcmVuY2U8L2E+ICogJmd0OyBrZXllZFJlZmVyZW5jZXMpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gIDxhIGhyZWY9IiNhMyI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19saXN0Lmh0bWwiPnVkZGkyX19idXNpbmVzc0xpc3Q8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI2E0Ij5zZW5kPC9hPiAoY29uc3QgY2hhciAqZW5kcG9pbnQpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gIDxhIGhyZWY9IiNhNCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgQXR0cmlidXRlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9xdWFsaWZpZXJzLmh0bWwiPnVkZGkyX19maW5kUXVhbGlmaWVyczwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzAiPmZpbmRRdWFsaWZpZXJzPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5FbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6ZmluZFF1YWxpZmllcnMuICA8YSBocmVmPSIjbzAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zdGQ6OnZlY3RvciZsdDsgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX25hbWUuaHRtbCI+dWRkaTJfX25hbWU8L2E+ICogJmd0OyZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzEiPm5hbWU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlZlY3RvciBvZiB1ZGRpMl9fbmFtZSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiAgPGEgaHJlZj0iI28xIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2lkZW50aWZpZXJfYmFnLmh0bWwiPnVkZGkyX19pZGVudGlmaWVyQmFnPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvMiI+aWRlbnRpZmllckJhZzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+RWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmlkZW50aWZpZXJCYWcuICA8YSBocmVmPSIjbzIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fY2F0ZWdvcnlfYmFnLmh0bWwiPnVkZGkyX19jYXRlZ29yeUJhZzwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzMiPmNhdGVnb3J5QmFnPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5FbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6Y2F0ZWdvcnlCYWcuICA8YSBocmVmPSIjbzMiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9iYWcuaHRtbCI+dWRkaTJfX3RNb2RlbEJhZzwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzQiPnRNb2RlbEJhZzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+RWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRNb2RlbEJhZy4gIDxhIGhyZWY9IiNvNCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjb3ZlcnlfdV9yX2xzLmh0bWwiPnVkZGkyX19kaXNjb3ZlcnlVUkxzPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvNSI+ZGlzY292ZXJ5VVJMczwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+RWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmRpc2NvdmVyeVVSTHMuICA8YSBocmVmPSIjbzUiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI282Ij5nZW5lcmljPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZy4gIDxhIGhyZWY9IiNvNiI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvNyI+bWF4Um93czwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIG1heFJvd3Mgb2YgdHlwZSB4czppbnQuICA8YSBocmVmPSIjbzciPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvOCI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzgiPnNvYXA8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiAgPGEgaHJlZj0iI284Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzxocj48YSBuYW1lPSJfZGV0YWlscyI+PC9hPjxoMj5EZXRhaWxlZCBEZXNjcmlwdGlvbjwvaDI+DQorU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImZpbmRfYnVzaW5lc3MiLiANCis8cD4NCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBsb2NhdGUgYnVzaW5lc3NlcyB0aGF0IG1lZXQgc3BlY2lmaWMgcmVxdWlyZW1lbnRzLiBXaGVuIHRoZSBzZW5kIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBpbnN0YW5jZSByZXR1cm5zIGEgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2xpc3QuaHRtbCI+dWRkaTJfX2J1c2luZXNzTGlzdDwvYT4gb2JqZWN0IHRoYXQgY29udGFpbnMgYSBsaXN0IG9mIGJ1c2luZXNzIHRoYXQgbWF0Y2hlZCB0aGUgc2VhcmNoIGNyaXRlcmlhLjxwPg0KK1NlZSAgPGEgaHJlZj0iaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzcxMyI+aHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzcxMzwvYT48cD4NCitTZWUgYWxzbyA8YSBjbGFzcz0iZWwiIGhyZWY9ImV4YW1wbGUyLmh0bWwiPkNvZGUgRXhhbXBsZSAyOiBGaW5kaW5nIGEgYnVzaW5lc3M8L2E+LiANCis8cD4NCis8aHI+PGgyPkNvbnN0cnVjdG9yICZhbXA7IERlc3RydWN0b3IgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTAiIGRveHl0YWc9InVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzOjp1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzcyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzczo6dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzgiPnNvYXA8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmdTT0FQIGNvbnRleHQ8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmluZF9VU0NPUkVidXNpbmVzcyBjbGFzcy4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTEiIGRveHl0YWc9InVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzOjp1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzcyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzczo6dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzgiPnNvYXA8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+bmFtZTwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmdTT0FQIGNvbnRleHQ8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmluZF9VU0NPUkVidXNpbmVzcyBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkIG5hbWUgb2YgdGhlIHJlcXVlc3RlZCBidXNpbmVzcy4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTIiIGRveHl0YWc9InVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzOjp1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzcyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzczo6dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzgiPnNvYXA8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5zdGQ6OnZlY3RvciZsdDsgY2hhciAqICZndDsmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+dE1vZGVsS2V5czwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmdTT0FQIGNvbnRleHQ8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmluZF9VU0NPUkVidXNpbmVzcyBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkIHRNb2RlbCBrZXlzLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMyIgZG94eXRhZz0idWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M6OnVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzOjp1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzcyAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvOCI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fa2V5ZWRfcmVmZXJlbmNlLmh0bWwiPnVkZGkyX19rZXllZFJlZmVyZW5jZTwvYT4gKiAmZ3Q7Jm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmtleWVkUmVmZXJlbmNlczwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmdTT0FQIGNvbnRleHQ8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmluZF9VU0NPUkVidXNpbmVzcyBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkIGNhdGVnb3J5IHJlZmVyZW5jZXMuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj48aDI+TWVtYmVyIEZ1bmN0aW9uIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE0IiBkb3h5dGFnPSJ1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzczo6c2VuZCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfbGlzdC5odG1sIj51ZGRpMl9fYnVzaW5lc3NMaXN0PC9hPiAqIHVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzOjpzZW5kICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiA8ZW0+ZW5kcG9pbnQ8L2VtPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK01lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+ZW5kcG9pbnQ8L2VtPiZuYnNwOzwvdGQ+PHRkPlVSTCBvZiB0aGUgVURESSBzZXJ2ZXIgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5BIHBvaW50ZXIgdG8gYSA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfbGlzdC5odG1sIj51ZGRpMl9fYnVzaW5lc3NMaXN0PC9hPiBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcjwvZGQ+PC9kbD4NCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmVyIHRvIGZpbmQgYSBsaXN0IG9mIGJ1c2luZXNzZXMuPHA+DQorU2VlIGFsc28gPGEgY2xhc3M9ImVsIiBocmVmPSJleGFtcGxlMi5odG1sIj5Db2RlIEV4YW1wbGUgMjogRmluZGluZyBhIGJ1c2luZXNzPC9hPi4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMyIgZG94eXRhZz0idWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M6OmNhdGVnb3J5QmFnIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19jYXRlZ29yeV9iYWcuaHRtbCI+dWRkaTJfX2NhdGVnb3J5QmFnPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzMiPnVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzOjpjYXRlZ29yeUJhZzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6Y2F0ZWdvcnlCYWcuIA0KKzxwPg0KK09wdGlvbmFsIGVsZW1lbnQgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzUiIGRveHl0YWc9InVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzOjpkaXNjb3ZlcnlVUkxzIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjb3ZlcnlfdV9yX2xzLmh0bWwiPnVkZGkyX19kaXNjb3ZlcnlVUkxzPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzUiPnVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzOjpkaXNjb3ZlcnlVUkxzPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0VsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpkaXNjb3ZlcnlVUkxzLiANCis8cD4NCitPcHRpb25hbCBlbGVtZW50ICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJ1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzczo6ZmluZFF1YWxpZmllcnMiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfcXVhbGlmaWVycy5odG1sIj51ZGRpMl9fZmluZFF1YWxpZmllcnM8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvMCI+dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M6OmZpbmRRdWFsaWZpZXJzPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0VsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpmaW5kUXVhbGlmaWVycy4gDQorPHA+DQorT3B0aW9uYWwgZWxlbWVudCAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNiIgZG94eXRhZz0idWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M6OmdlbmVyaWMiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzYiPnVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzOjpnZW5lcmljPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nLiANCis8cD4NCitSZXF1aXJlZCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9InVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzOjppZGVudGlmaWVyQmFnIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19pZGVudGlmaWVyX2JhZy5odG1sIj51ZGRpMl9faWRlbnRpZmllckJhZzwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI28yIj51ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzczo6aWRlbnRpZmllckJhZzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6aWRlbnRpZmllckJhZy4gDQorPHA+DQorT3B0aW9uYWwgZWxlbWVudCAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNyIgZG94eXRhZz0idWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M6Om1heFJvd3MiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvNyI+dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M6Om1heFJvd3M8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIG1heFJvd3Mgb2YgdHlwZSB4czppbnQuIA0KKzxwPg0KK09wdGlvbmFsIGF0dHJpYnV0ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0idWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M6Om5hbWUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RkOjp2ZWN0b3ImbHQ7PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX25hbWUuaHRtbCI+dWRkaTJfX25hbWU8L2E+KiAmZ3Q7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI28xIj51ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzczo6bmFtZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitWZWN0b3Igb2YgdWRkaTJfX25hbWUqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzgiIGRveHl0YWc9InVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzOjpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvOCI+c29hcDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI284Ij51ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzczo6c29hcDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzQiIGRveHl0YWc9InVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzOjp0TW9kZWxCYWciID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfYmFnLmh0bWwiPnVkZGkyX190TW9kZWxCYWc8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvNCI+dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M6OnRNb2RlbEJhZzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dE1vZGVsQmFnLiANCis8cD4NCitPcHRpb25hbCBlbGVtZW50ICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3VkZGkyLzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCI+dWRkaV92Mi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTkgMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VyZWxhdGVkX2J1c2luZXNzZXMtbWVtYmVycy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VyZWxhdGVkX2J1c2luZXNzZXMtbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NTAyZjMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXJlbGF0ZWRfYnVzaW5lc3Nlcy1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwyMiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXJlbGF0ZWRfYnVzaW5lc3Nlcy5odG1sIj51ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlczwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXJlbGF0ZWRfYnVzaW5lc3Nlcy5odG1sI28xIj5idXNpbmVzc0tleTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lcmVsYXRlZF9idXNpbmVzc2VzLmh0bWwiPnVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VyZWxhdGVkX2J1c2luZXNzZXMuaHRtbCNvMCI+ZmluZFF1YWxpZmllcnM8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXJlbGF0ZWRfYnVzaW5lc3Nlcy5odG1sIj51ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlczwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lcmVsYXRlZF9idXNpbmVzc2VzLmh0bWwjbzMiPmdlbmVyaWM8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXJlbGF0ZWRfYnVzaW5lc3Nlcy5odG1sIj51ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlczwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lcmVsYXRlZF9idXNpbmVzc2VzLmh0bWwjbzIiPmtleWVkUmVmZXJlbmNlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VyZWxhdGVkX2J1c2luZXNzZXMuaHRtbCI+dWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXM8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXJlbGF0ZWRfYnVzaW5lc3Nlcy5odG1sI280Ij5tYXhSb3dzPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VyZWxhdGVkX2J1c2luZXNzZXMuaHRtbCI+dWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXM8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXJlbGF0ZWRfYnVzaW5lc3Nlcy5odG1sI2EyIj5zZW5kPC9hPihjb25zdCBjaGFyICplbmRwb2ludCk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lcmVsYXRlZF9idXNpbmVzc2VzLmh0bWwiPnVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VyZWxhdGVkX2J1c2luZXNzZXMuaHRtbCNvNSI+c29hcDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lcmVsYXRlZF9idXNpbmVzc2VzLmh0bWwiPnVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VyZWxhdGVkX2J1c2luZXNzZXMuaHRtbCNhMCI+dWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXM8L2E+KHN0cnVjdCBzb2FwICopPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXJlbGF0ZWRfYnVzaW5lc3Nlcy5odG1sIj51ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlczwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lcmVsYXRlZF9idXNpbmVzc2VzLmh0bWwjYTEiPnVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzPC9hPihzdHJ1Y3Qgc29hcCAqLCBjb25zdCBjaGFyICpidXNpbmVzc0tleSk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lcmVsYXRlZF9idXNpbmVzc2VzLmh0bWwiPnVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU5IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lcmVsYXRlZF9idXNpbmVzc2VzLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXJlbGF0ZWRfYnVzaW5lc3Nlcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxN2Q1NTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXJlbGF0ZWRfYnVzaW5lc3Nlcy5odG1sCkBAIC0wLDAgKzEsMzI2IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiB1ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyBDbGFzcyBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMgQ2xhc3MgUmVmZXJlbmNlPC9oMT5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZmluZF9yZWxhdGVkQnVzaW5lc3NlcyIuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3VkZGlfdjIuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VyZWxhdGVkX2J1c2luZXNzZXMtbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIE1lbWJlciBGdW5jdGlvbnM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lcmVsYXRlZF9idXNpbmVzc2VzLmh0bWwjYTAiPnVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzPC9hPiAoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VyZWxhdGVkX2J1c2luZXNzZXMuaHRtbCNvNSI+c29hcDwvYT4gKik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+TWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2EwIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lcmVsYXRlZF9idXNpbmVzc2VzLmh0bWwjYTEiPnVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzPC9hPiAoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VyZWxhdGVkX2J1c2luZXNzZXMuaHRtbCNvNSI+c29hcDwvYT4gKiwgY29uc3QgY2hhciAqPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXJlbGF0ZWRfYnVzaW5lc3Nlcy5odG1sI28xIj5idXNpbmVzc0tleTwvYT4pPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gIDxhIGhyZWY9IiNhMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzZXNfbGlzdC5odG1sIj51ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0PC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lcmVsYXRlZF9idXNpbmVzc2VzLmh0bWwjYTIiPnNlbmQ8L2E+IChjb25zdCBjaGFyICplbmRwb2ludCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+TWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2EyIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX3F1YWxpZmllcnMuaHRtbCI+dWRkaTJfX2ZpbmRRdWFsaWZpZXJzPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lcmVsYXRlZF9idXNpbmVzc2VzLmh0bWwjbzAiPmZpbmRRdWFsaWZpZXJzPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5FbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6ZmluZFF1YWxpZmllcnMuICA8YSBocmVmPSIjbzAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTMiPnVkZGkyX19idXNpbmVzc0tleTwvYT4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VyZWxhdGVkX2J1c2luZXNzZXMuaHRtbCNvMSI+YnVzaW5lc3NLZXk8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpidXNpbmVzc0tleS4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19rZXllZF9yZWZlcmVuY2UuaHRtbCI+dWRkaTJfX2tleWVkUmVmZXJlbmNlPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lcmVsYXRlZF9idXNpbmVzc2VzLmh0bWwjbzIiPmtleWVkUmVmZXJlbmNlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5FbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6a2V5ZWRSZWZlcmVuY2UuICA8YSBocmVmPSIjbzIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VyZWxhdGVkX2J1c2luZXNzZXMuaHRtbCNvMyI+Z2VuZXJpYzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcuICA8YSBocmVmPSIjbzMiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXJlbGF0ZWRfYnVzaW5lc3Nlcy5odG1sI280Ij5tYXhSb3dzPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgbWF4Um93cyBvZiB0eXBlIHhzOmludC4gIDxhIGhyZWY9IiNvNCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VyZWxhdGVkX2J1c2luZXNzZXMuaHRtbCNvNSI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXJlbGF0ZWRfYnVzaW5lc3Nlcy5odG1sI281Ij5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvNSI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJmaW5kX3JlbGF0ZWRCdXNpbmVzc2VzIi4gDQorPHA+DQorUmVwcmVzZW50cyBhIHJlcXVlc3QgdG8gbG9jYXRlIGJ1c2luZXNzZXMgdGhhdCBhcmUgcmVsYXRlZCB0byBhIHNwZWNpZmljIGJ1c2luZXNzLiBXaGVuIHRoZSBzZW5kIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBpbnN0YW5jZSByZXR1cm5zIGEgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0xpc3Qgb2JqZWN0IHRoYXQgY29udGFpbnMgYSBsaXN0IG9mIGJ1c2luZXNzIHRoYXQgbWF0Y2hlZCB0aGUgcmVsYXRpb25zaGlwIHNldC48cD4NCitTZWUgIDxhIGhyZWY9Imh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3MTQiPmh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3MTQ8L2E+IA0KKzxwPg0KKzxocj48aDI+Q29uc3RydWN0b3IgJmFtcDsgRGVzdHJ1Y3RvciBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMCIgZG94eXRhZz0idWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXM6OnVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzOjp1ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lcmVsYXRlZF9idXNpbmVzc2VzLmh0bWwjbzUiPnNvYXA8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmdTT0FQIGNvbnRleHQ8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3MgY2xhc3MuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExIiBkb3h5dGFnPSJ1ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3Nlczo6dWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXM6OnVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VyZWxhdGVkX2J1c2luZXNzZXMuaHRtbCNvNSI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5idXNpbmVzc0tleTwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmdTT0FQIGNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5idXNpbmVzc0tleTwvZW0+Jm5ic3A7PC90ZD48dGQ+c3RyaW5nPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQgYnVzaW5lc3Mga2V5LiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+PGgyPk1lbWJlciBGdW5jdGlvbiBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMiIgZG94eXRhZz0idWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXM6OnNlbmQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3Nlc19saXN0Lmh0bWwiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3Q8L2E+ICogdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXM6OnNlbmQgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5lbmRwb2ludDwvZW0+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5lbmRwb2ludDwvZW0+Jm5ic3A7PC90ZD48dGQ+VVJMIG9mIHRoZSBVRERJIHNlcnZlciA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPkEgcG9pbnRlciB0byBhIHVkZGkyX19yZWxhdGVkQnVzaW5lc3NMaXN0IG9iamVjdCBvciBOVUxMIG9uIGVycm9yPC9kZD48L2RsPg0KK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2ZXIgdG8gZmluZCBhIGxpc3Qgb2YgcmVsYXRlZCBidXNpbmVzc2VzLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJ1ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3Nlczo6YnVzaW5lc3NLZXkiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EzIj51ZGRpMl9fYnVzaW5lc3NLZXk8L2E+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VyZWxhdGVkX2J1c2luZXNzZXMuaHRtbCNvMSI+dWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXM6OmJ1c2luZXNzS2V5PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0VsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpidXNpbmVzc0tleS4gDQorPHA+DQorUmVxdWlyZWQgZWxlbWVudCAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0idWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXM6OmZpbmRRdWFsaWZpZXJzIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX3F1YWxpZmllcnMuaHRtbCI+dWRkaTJfX2ZpbmRRdWFsaWZpZXJzPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXJlbGF0ZWRfYnVzaW5lc3Nlcy5odG1sI28wIj51ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3Nlczo6ZmluZFF1YWxpZmllcnM8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmZpbmRRdWFsaWZpZXJzLiANCis8cD4NCitPcHRpb25hbCBlbGVtZW50ICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8zIiBkb3h5dGFnPSJ1ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3Nlczo6Z2VuZXJpYyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lcmVsYXRlZF9idXNpbmVzc2VzLmh0bWwjbzMiPnVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzOjpnZW5lcmljPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nLiANCis8cD4NCitSZXF1aXJlZCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9InVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzOjprZXllZFJlZmVyZW5jZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fa2V5ZWRfcmVmZXJlbmNlLmh0bWwiPnVkZGkyX19rZXllZFJlZmVyZW5jZTwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VyZWxhdGVkX2J1c2luZXNzZXMuaHRtbCNvMiI+dWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXM6OmtleWVkUmVmZXJlbmNlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0VsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjprZXllZFJlZmVyZW5jZS4gDQorPHA+DQorT3B0aW9uYWwgZWxlbWVudCAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNCIgZG94eXRhZz0idWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXM6Om1heFJvd3MiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lcmVsYXRlZF9idXNpbmVzc2VzLmh0bWwjbzQiPnVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzOjptYXhSb3dzPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSBtYXhSb3dzIG9mIHR5cGUgeHM6aW50LiANCis8cD4NCitPcHRpb25hbCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzUiIGRveHl0YWc9InVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzOjpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lcmVsYXRlZF9idXNpbmVzc2VzLmh0bWwjbzUiPnNvYXA8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lcmVsYXRlZF9idXNpbmVzc2VzLmh0bWwjbzUiPnVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzOjpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU5IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lc2VydmljZS1tZW1iZXJzLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXNlcnZpY2UtbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOTFiOGQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXNlcnZpY2UtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMjYgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2UgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCI+dWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZTwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvNiI+YnVzaW5lc3NLZXk8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCI+dWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI28yIj5jYXRlZ29yeUJhZzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sIj51ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjbzAiPmZpbmRRdWFsaWZpZXJzPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwiPnVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2U8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvNCI+Z2VuZXJpYzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sIj51ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjbzUiPm1heFJvd3M8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCI+dWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI28xIj5uYW1lPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwiPnVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2U8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNhNCI+c2VuZDwvYT4oY29uc3QgY2hhciAqZW5kcG9pbnQpPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCI+dWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI283Ij5zb2FwPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwiPnVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2U8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvMyI+dE1vZGVsQmFnPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwiPnVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2U8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNhMCI+dWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZTwvYT4oc3RydWN0IHNvYXAgKik8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sIj51ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjYTEiPnVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2U8L2E+KHN0cnVjdCBzb2FwICosIGNvbnN0IGNoYXIgKm5hbWUpPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCI+dWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI2EyIj51ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlPC9hPihzdHJ1Y3Qgc29hcCAqLCBzdGQ6OnZlY3RvciZsdDsgY2hhciAqICZndDsgdE1vZGVsS2V5cyk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sIj51ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjYTMiPnVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2U8L2E+KHN0cnVjdCBzb2FwICosIHN0ZDo6dmVjdG9yJmx0OyB1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UgKiAmZ3Q7IGtleWVkUmVmZXJlbmNlcyk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sIj51ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU5IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhkNzEyMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sCkBAIC0wLDAgKzEsNDgwIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiB1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlIENsYXNzIFJlZmVyZW5jZTwvaDE+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImZpbmRfc2VydmljZSIuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3VkZGlfdjIuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VzZXJ2aWNlLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBNZW1iZXIgRnVuY3Rpb25zPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNhMCI+dWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZTwvYT4gKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI283Ij5zb2FwPC9hPiAqKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjYTEiPnVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2U8L2E+IChzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvNyI+c29hcDwvYT4gKiwgY29uc3QgY2hhciAqPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvMSI+bmFtZTwvYT4pPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gIDxhIGhyZWY9IiNhMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNhMiI+dWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZTwvYT4gKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI283Ij5zb2FwPC9hPiAqLCBzdGQ6OnZlY3RvciZsdDsgY2hhciAqICZndDsgdE1vZGVsS2V5cyk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+TWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2EyIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI2EzIj51ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlPC9hPiAoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjbzciPnNvYXA8L2E+ICosIHN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fa2V5ZWRfcmVmZXJlbmNlLmh0bWwiPnVkZGkyX19rZXllZFJlZmVyZW5jZTwvYT4gKiAmZ3Q7IGtleWVkUmVmZXJlbmNlcyk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+TWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2EzIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfbGlzdC5odG1sIj51ZGRpMl9fc2VydmljZUxpc3Q8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjYTQiPnNlbmQ8L2E+IChjb25zdCBjaGFyICplbmRwb2ludCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+TWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2E0Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX3F1YWxpZmllcnMuaHRtbCI+dWRkaTJfX2ZpbmRRdWFsaWZpZXJzPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI28wIj5maW5kUXVhbGlmaWVyczwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+RWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmZpbmRRdWFsaWZpZXJzLiAgPGEgaHJlZj0iI28wIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c3RkOjp2ZWN0b3ImbHQ7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19uYW1lLmh0bWwiPnVkZGkyX19uYW1lPC9hPiAqICZndDsmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjbzEiPm5hbWU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlZlY3RvciBvZiB1ZGRpMl9fbmFtZSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiAgPGEgaHJlZj0iI28xIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NhdGVnb3J5X2JhZy5odG1sIj51ZGRpMl9fY2F0ZWdvcnlCYWc8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjbzIiPmNhdGVnb3J5QmFnPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5FbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6Y2F0ZWdvcnlCYWcuICA8YSBocmVmPSIjbzIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9iYWcuaHRtbCI+dWRkaTJfX3RNb2RlbEJhZzwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvMyI+dE1vZGVsQmFnPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5FbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dE1vZGVsQmFnLiAgPGEgaHJlZj0iI28zIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI280Ij5nZW5lcmljPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZy4gIDxhIGhyZWY9IiNvNCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI281Ij5tYXhSb3dzPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgbWF4Um93cyBvZiB0eXBlIHhzOmludC4gIDxhIGhyZWY9IiNvNSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMyI+dWRkaTJfX2J1c2luZXNzS2V5PC9hPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvNiI+YnVzaW5lc3NLZXk8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkF0dHJpYnV0ZSBidXNpbmVzc0tleSBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpidXNpbmVzc0tleS4gIDxhIGhyZWY9IiNvNiI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjbzciPnNvYXA8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjbzciPnNvYXA8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiAgPGEgaHJlZj0iI283Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzxocj48YSBuYW1lPSJfZGV0YWlscyI+PC9hPjxoMj5EZXRhaWxlZCBEZXNjcmlwdGlvbjwvaDI+DQorU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImZpbmRfc2VydmljZSIuIA0KKzxwPg0KK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIGxvY2F0ZSBzZXJ2aWNlcyB0aGF0IG1lZXQgdGhlIHNwZWNpZmllZCByZXF1aXJlbWVudHMuPHA+DQorU2VlICA8YSBocmVmPSJodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzE1Ij5odHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzE1PC9hPjxwPg0KK1NlZSBhbHNvIDxhIGNsYXNzPSJlbCIgaHJlZj0iZXhhbXBsZTEuaHRtbCI+Q29kZSBFeGFtcGxlIDE6IEZpbmRpbmcgYSBzZXJ2aWNlPC9hPi4gDQorPHA+DQorPGhyPjxoMj5Db25zdHJ1Y3RvciAmYW1wOyBEZXN0cnVjdG9yIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEwIiBkb3h5dGFnPSJ1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlOjp1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2U6OnVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2UgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvNyI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK01lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Z1NPQVAgY29udGV4dDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmaW5kX1VTQ09SRXNlcnZpY2UgY2xhc3MuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExIiBkb3h5dGFnPSJ1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlOjp1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2U6OnVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2UgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvNyI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5uYW1lPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK01lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Z1NPQVAgY29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPm5hbWU8L2VtPiZuYnNwOzwvdGQ+PHRkPm9mIHRoZSBzZXJ2aWNlPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZpbmRfVVNDT1JFc2VydmljZSBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkIG5hbWUuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEyIiBkb3h5dGFnPSJ1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlOjp1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2U6OnVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2UgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvNyI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPnN0ZDo6dmVjdG9yJmx0OyBjaGFyICogJmd0OyZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT50TW9kZWxLZXlzPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK01lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Z1NPQVAgY29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnRNb2RlbEtleXM8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbGxlY3Rpb24gb2YgdE1vZGVsIGtleSBzdHJpbmdzPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZpbmRfVVNDT1JFc2VydmljZSBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkIHRNb2RlbCBrZXlzLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMyIgZG94eXRhZz0idWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZTo6dWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlOjp1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjbzciPnNvYXA8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5zdGQ6OnZlY3RvciZsdDsgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2tleWVkX3JlZmVyZW5jZS5odG1sIj51ZGRpMl9fa2V5ZWRSZWZlcmVuY2U8L2E+ICogJmd0OyZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5rZXllZFJlZmVyZW5jZXM8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5nU09BUCBjb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+a2V5ZWRSZWZlcmVuY2VzPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb2xsZWN0aW9uIG9mIGNhdGVnb3J5IGtleXM8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmluZF9VU0NPUkVzZXJ2aWNlIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQgY2F0ZWdvcnkga2V5cy4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPjxoMj5NZW1iZXIgRnVuY3Rpb24gRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTQiIGRveHl0YWc9InVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2U6OnNlbmQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfbGlzdC5odG1sIj51ZGRpMl9fc2VydmljZUxpc3Q8L2E+ICogdWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZTo6c2VuZCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gPGVtPmVuZHBvaW50PC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmVuZHBvaW50PC9lbT4mbmJzcDs8L3RkPjx0ZD5VUkwgb2YgdGhlIFVEREkgc2VydmVyIDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+QSBwb2ludGVyIHRvIGEgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfbGlzdC5odG1sIj51ZGRpMl9fc2VydmljZUxpc3Q8L2E+IG9iamVjdCBvciBOVUxMIG9uIGVycm9yPC9kZD48L2RsPg0KK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2ZXIgdG8gZmluZCBhIGxpc3Qgb2Ygc2VydmljZXMuPHA+DQorU2VlIGFsc28gPGEgY2xhc3M9ImVsIiBocmVmPSJleGFtcGxlMS5odG1sIj5Db2RlIEV4YW1wbGUgMTogRmluZGluZyBhIHNlcnZpY2U8L2E+LiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im82IiBkb3h5dGFnPSJ1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlOjpidXNpbmVzc0tleSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTMiPnVkZGkyX19idXNpbmVzc0tleTwvYT4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvNiI+dWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZTo6YnVzaW5lc3NLZXk8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIGJ1c2luZXNzS2V5IG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOmJ1c2luZXNzS2V5LiANCis8cD4NCitPcHRpb25hbCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9InVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2U6OmNhdGVnb3J5QmFnIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19jYXRlZ29yeV9iYWcuaHRtbCI+dWRkaTJfX2NhdGVnb3J5QmFnPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvMiI+dWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZTo6Y2F0ZWdvcnlCYWc8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmNhdGVnb3J5QmFnLiANCis8cD4NCitPcHRpb25hbCBlbGVtZW50ICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJ1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlOjpmaW5kUXVhbGlmaWVycyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9xdWFsaWZpZXJzLmh0bWwiPnVkZGkyX19maW5kUXVhbGlmaWVyczwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjbzAiPnVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2U6OmZpbmRRdWFsaWZpZXJzPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0VsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpmaW5kUXVhbGlmaWVycy4gDQorPHA+DQorT3B0aW9uYWwgZWxlbWVudCAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNCIgZG94eXRhZz0idWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZTo6Z2VuZXJpYyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI280Ij51ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlOjpnZW5lcmljPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nLiANCis8cD4NCitSZXF1aXJlZCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzUiIGRveHl0YWc9InVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2U6Om1heFJvd3MiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI281Ij51ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlOjptYXhSb3dzPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSBtYXhSb3dzIG9mIHR5cGUgeHM6aW50LiANCis8cD4NCitPcHRpb25hbCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9InVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2U6Om5hbWUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RkOjp2ZWN0b3ImbHQ7PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX25hbWUuaHRtbCI+dWRkaTJfX25hbWU8L2E+KiAmZ3Q7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjbzEiPnVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2U6Om5hbWU8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVmVjdG9yIG9mIHVkZGkyX19uYW1lKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im83IiBkb3h5dGFnPSJ1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlOjpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI283Ij5zb2FwPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvNyI+dWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZTo6c29hcDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzMiIGRveHl0YWc9InVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2U6OnRNb2RlbEJhZyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9iYWcuaHRtbCI+dWRkaTJfX3RNb2RlbEJhZzwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjbzMiPnVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2U6OnRNb2RlbEJhZzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dE1vZGVsQmFnLiANCis8cD4NCitPcHRpb25hbCBlbGVtZW50ICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3VkZGkyLzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCI+dWRkaV92Mi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTkgMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2V0X21vZGVsLW1lbWJlcnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9ldF9tb2RlbC1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM0NzZjMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9ldF9tb2RlbC1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwyNCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsIE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwiPnVkZGkyX19maW5kX1VTQ09SRXRNb2RlbDwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNvMyI+Y2F0ZWdvcnlCYWc8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCI+dWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzAiPmZpbmRRdWFsaWZpZXJzPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwiPnVkZGkyX19maW5kX1VTQ09SRXRNb2RlbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI280Ij5nZW5lcmljPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwiPnVkZGkyX19maW5kX1VTQ09SRXRNb2RlbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI28yIj5pZGVudGlmaWVyQmFnPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwiPnVkZGkyX19maW5kX1VTQ09SRXRNb2RlbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI281Ij5tYXhSb3dzPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwiPnVkZGkyX19maW5kX1VTQ09SRXRNb2RlbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI28xIj5uYW1lPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwiPnVkZGkyX19maW5kX1VTQ09SRXRNb2RlbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI2EzIj5zZW5kPC9hPihjb25zdCBjaGFyICplbmRwb2ludCk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sIj51ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWw8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNvNiI+c29hcDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sIj51ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWw8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNhMCI+dWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsPC9hPihzdHJ1Y3Qgc29hcCAqKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwiPnVkZGkyX19maW5kX1VTQ09SRXRNb2RlbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI2ExIj51ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWw8L2E+KHN0cnVjdCBzb2FwICosIGNvbnN0IGNoYXIgKm5hbWUpPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCI+dWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjYTIiPnVkZGkyX19maW5kX1VTQ09SRXRNb2RlbDwvYT4oc3RydWN0IHNvYXAgKiwgc3RkOjp2ZWN0b3ImbHQ7IHVkZGkyX19rZXllZFJlZmVyZW5jZSAqICZndDsga2V5ZWRSZWZlcmVuY2VzKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwiPnVkZGkyX19maW5kX1VTQ09SRXRNb2RlbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNjo1OSAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZTAwMmYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbApAQCAtMCwwICsxLDQwMiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWwgQ2xhc3MgUmVmZXJlbmNlPC9oMT5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZmluZF90TW9kZWwiLiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KKzxjb2RlPiNpbmNsdWRlICZsdDt1ZGRpX3YyLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KKzxhIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9ldF9tb2RlbC1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgTWVtYmVyIEZ1bmN0aW9uczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjYTAiPnVkZGkyX19maW5kX1VTQ09SRXRNb2RlbDwvYT4gKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI282Ij5zb2FwPC9hPiAqKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjYTEiPnVkZGkyX19maW5kX1VTQ09SRXRNb2RlbDwvYT4gKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI282Ij5zb2FwPC9hPiAqLCBjb25zdCBjaGFyICo8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI28xIj5uYW1lPC9hPik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+TWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2ExIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI2EyIj51ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWw8L2E+IChzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNvNiI+c29hcDwvYT4gKiwgc3RkOjp2ZWN0b3ImbHQ7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19rZXllZF9yZWZlcmVuY2UuaHRtbCI+dWRkaTJfX2tleWVkUmVmZXJlbmNlPC9hPiAqICZndDsga2V5ZWRSZWZlcmVuY2VzKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9saXN0Lmh0bWwiPnVkZGkyX190TW9kZWxMaXN0PC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI2EzIj5zZW5kPC9hPiAoY29uc3QgY2hhciAqZW5kcG9pbnQpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gIDxhIGhyZWY9IiNhMyI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgQXR0cmlidXRlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9xdWFsaWZpZXJzLmh0bWwiPnVkZGkyX19maW5kUXVhbGlmaWVyczwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNvMCI+ZmluZFF1YWxpZmllcnM8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpmaW5kUXVhbGlmaWVycy4gIDxhIGhyZWY9IiNvMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19uYW1lLmh0bWwiPnVkZGkyX19uYW1lPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI28xIj5uYW1lPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5FbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6bmFtZS4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19pZGVudGlmaWVyX2JhZy5odG1sIj51ZGRpMl9faWRlbnRpZmllckJhZzwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNvMiI+aWRlbnRpZmllckJhZzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+RWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmlkZW50aWZpZXJCYWcuICA8YSBocmVmPSIjbzIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fY2F0ZWdvcnlfYmFnLmh0bWwiPnVkZGkyX19jYXRlZ29yeUJhZzwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNvMyI+Y2F0ZWdvcnlCYWc8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpjYXRlZ29yeUJhZy4gIDxhIGhyZWY9IiNvMyI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNvNCI+Z2VuZXJpYzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcuICA8YSBocmVmPSIjbzQiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNvNSI+bWF4Um93czwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIG1heFJvd3Mgb2YgdHlwZSB4czppbnQuICA8YSBocmVmPSIjbzUiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI282Ij5zb2FwPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI282Ij5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvNiI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJmaW5kX3RNb2RlbCIuIA0KKzxwPg0KK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIGxvY2F0ZSBhIGxpc3Qgb2YgdE1vZGVsIGVudHJpZXMgdGhhdCBtYXRjaCBhIHNldCBvZiBzcGVjaWZpYyBjcml0ZXJpYS4gVGhlIHJlc3VsdCBvZiBhIHNlYXJjaCBpcyBhIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2xpc3QuaHRtbCI+dWRkaTJfX3RNb2RlbExpc3Q8L2E+IG9iamVjdCB0aGF0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHJlZ2lzdGVyZWQgdE1vZGVsIGRhdGEgdGhhdCBtYXRjaGVzIHRoZSBjcml0ZXJpYS48cD4NCitTZWUgIDxhIGhyZWY9Imh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3MTYiPmh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3MTY8L2E+IA0KKzxwPg0KKzxocj48aDI+Q29uc3RydWN0b3IgJmFtcDsgRGVzdHJ1Y3RvciBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMCIgZG94eXRhZz0idWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsOjp1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWwiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsOjp1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWwgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNvNiI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK01lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Z1NPQVAgY29udGV4dDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmaW5kX1VTQ09SRXRNb2RlbCBjbGFzcy4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTEiIGRveHl0YWc9InVkZGkyX19maW5kX1VTQ09SRXRNb2RlbDo6dWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHVkZGkyX19maW5kX1VTQ09SRXRNb2RlbDo6dWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzYiPnNvYXA8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+bmFtZTwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmdTT0FQIGNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5uYW1lPC9lbT4mbmJzcDs8L3RkPjx0ZD5vZiB0aGUgdE1vZGVsPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZpbmRfVVNDT1JFdE1vZGVsIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQgdE1vZGVsIG5hbWUuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEyIiBkb3h5dGFnPSJ1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWw6OnVkZGkyX19maW5kX1VTQ09SRXRNb2RlbCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWw6OnVkZGkyX19maW5kX1VTQ09SRXRNb2RlbCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI282Ij5zb2FwPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+c3RkOjp2ZWN0b3ImbHQ7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19rZXllZF9yZWZlcmVuY2UuaHRtbCI+dWRkaTJfX2tleWVkUmVmZXJlbmNlPC9hPiAqICZndDsmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+a2V5ZWRSZWZlcmVuY2VzPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK01lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Z1NPQVAgY29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmtleWVkUmVmZXJlbmNlczwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29sbGVjdGlvbiBvZiBjYXRlZ29yeSBrZXlzPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZpbmRfVVNDT1JFdE1vZGVsIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQgY2F0ZWdvcnkga2V5cy4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPjxoMj5NZW1iZXIgRnVuY3Rpb24gRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTMiIGRveHl0YWc9InVkZGkyX19maW5kX1VTQ09SRXRNb2RlbDo6c2VuZCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9saXN0Lmh0bWwiPnVkZGkyX190TW9kZWxMaXN0PC9hPiAqIHVkZGkyX19maW5kX1VTQ09SRXRNb2RlbDo6c2VuZCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gPGVtPmVuZHBvaW50PC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmVuZHBvaW50PC9lbT4mbmJzcDs8L3RkPjx0ZD5VUkwgb2YgdGhlIFVEREkgc2VydmVyIDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+QSBwb2ludGVyIHRvIGEgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfbGlzdC5odG1sIj51ZGRpMl9fdE1vZGVsTGlzdDwvYT4gb2JqZWN0IG9yIE5VTEwgb24gZXJyb3I8L2RkPjwvZGw+DQorU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZlciB0byBmaW5kIGEgdE1vZGVsTGlzdC4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMyIgZG94eXRhZz0idWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsOjpjYXRlZ29yeUJhZyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fY2F0ZWdvcnlfYmFnLmh0bWwiPnVkZGkyX19jYXRlZ29yeUJhZzwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzMiPnVkZGkyX19maW5kX1VTQ09SRXRNb2RlbDo6Y2F0ZWdvcnlCYWc8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmNhdGVnb3J5QmFnLiANCis8cD4NCitPcHRpb25hbCBlbGVtZW50ICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJ1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWw6OmZpbmRRdWFsaWZpZXJzIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX3F1YWxpZmllcnMuaHRtbCI+dWRkaTJfX2ZpbmRRdWFsaWZpZXJzPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNvMCI+dWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsOjpmaW5kUXVhbGlmaWVyczwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6ZmluZFF1YWxpZmllcnMuIA0KKzxwPg0KK09wdGlvbmFsIGVsZW1lbnQgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzQiIGRveHl0YWc9InVkZGkyX19maW5kX1VTQ09SRXRNb2RlbDo6Z2VuZXJpYyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI280Ij51ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWw6OmdlbmVyaWM8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcuIA0KKzxwPg0KK1JlcXVpcmVkIGF0dHJpYnV0ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMiIgZG94eXRhZz0idWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsOjppZGVudGlmaWVyQmFnIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19pZGVudGlmaWVyX2JhZy5odG1sIj51ZGRpMl9faWRlbnRpZmllckJhZzwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzIiPnVkZGkyX19maW5kX1VTQ09SRXRNb2RlbDo6aWRlbnRpZmllckJhZzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6aWRlbnRpZmllckJhZy4gDQorPHA+DQorT3B0aW9uYWwgZWxlbWVudCAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNSIgZG94eXRhZz0idWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsOjptYXhSb3dzIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNvNSI+dWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsOjptYXhSb3dzPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSBtYXhSb3dzIG9mIHR5cGUgeHM6aW50LiANCis8cD4NCitPcHRpb25hbCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9InVkZGkyX19maW5kX1VTQ09SRXRNb2RlbDo6bmFtZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fbmFtZS5odG1sIj51ZGRpMl9fbmFtZTwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzEiPnVkZGkyX19maW5kX1VTQ09SRXRNb2RlbDo6bmFtZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6bmFtZS4gDQorPHA+DQorT3B0aW9uYWwgZWxlbWVudCAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNiIgZG94eXRhZz0idWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsOjpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI282Ij5zb2FwPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNvNiI+dWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsOjpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU5IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZmluZF9xdWFsaWZpZXJzLW1lbWJlcnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZmluZF9xdWFsaWZpZXJzLW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTAyOGY2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19maW5kX3F1YWxpZmllcnMtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19maW5kUXVhbGlmaWVycyBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9xdWFsaWZpZXJzLmh0bWwiPnVkZGkyX19maW5kUXVhbGlmaWVyczwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfcXVhbGlmaWVycy5odG1sI28wIj5maW5kUXVhbGlmaWVyPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX3F1YWxpZmllcnMuaHRtbCI+dWRkaTJfX2ZpbmRRdWFsaWZpZXJzPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX3F1YWxpZmllcnMuaHRtbCNvMSI+c29hcDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9xdWFsaWZpZXJzLmh0bWwiPnVkZGkyX19maW5kUXVhbGlmaWVyczwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNjo1OSAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2ZpbmRfcXVhbGlmaWVycy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19maW5kX3F1YWxpZmllcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmQ4NzhlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19maW5kX3F1YWxpZmllcnMuaHRtbApAQCAtMCwwICsxLDgzIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiB1ZGRpMl9fZmluZFF1YWxpZmllcnMgQ2xhc3MgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19maW5kUXVhbGlmaWVycyBDbGFzcyBSZWZlcmVuY2U8L2gxPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJmaW5kUXVhbGlmaWVycyIuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3VkZGlfdjIuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX3F1YWxpZmllcnMtbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c3RkOjp2ZWN0b3ImbHQ7IGNoYXIgKiAmZ3Q7Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9xdWFsaWZpZXJzLmh0bWwjbzAiPmZpbmRRdWFsaWZpZXI8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlZlY3RvciBvZiBjaGFyKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQuICA8YSBocmVmPSIjbzAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9xdWFsaWZpZXJzLmh0bWwjbzEiPnNvYXA8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX3F1YWxpZmllcnMuaHRtbCNvMSI+c29hcDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuICA8YSBocmVmPSIjbzEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzwvdGFibGU+DQorPGhyPjxhIG5hbWU9Il9kZXRhaWxzIj48L2E+PGgyPkRldGFpbGVkIERlc2NyaXB0aW9uPC9oMj4NCitTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZmluZFF1YWxpZmllcnMiLiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJ1ZGRpMl9fZmluZFF1YWxpZmllcnM6OmZpbmRRdWFsaWZpZXIiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RkOjp2ZWN0b3ImbHQ7Y2hhciogJmd0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9xdWFsaWZpZXJzLmh0bWwjbzAiPnVkZGkyX19maW5kUXVhbGlmaWVyczo6ZmluZFF1YWxpZmllcjwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitWZWN0b3Igb2YgY2hhciogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0idWRkaTJfX2ZpbmRRdWFsaWZpZXJzOjpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9xdWFsaWZpZXJzLmh0bWwjbzEiPnNvYXA8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9xdWFsaWZpZXJzLmh0bWwjbzEiPnVkZGkyX19maW5kUXVhbGlmaWVyczo6c29hcDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvdWRkaTIvPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sIj51ZGRpX3YyLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNjo1OSAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXNzZXJ0aW9uX3N0YXR1c19yZXBvcnQtbWVtYmVycy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWFzc2VydGlvbl9zdGF0dXNfcmVwb3J0LW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzU1MWZmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWFzc2VydGlvbl9zdGF0dXNfcmVwb3J0LW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDIwIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2Vhc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydDwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXNzZXJ0aW9uX3N0YXR1c19yZXBvcnQuaHRtbCNvMCI+YXV0aEluZm88L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXNzZXJ0aW9uX3N0YXR1c19yZXBvcnQuaHRtbCI+dWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQ8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXNzZXJ0aW9uX3N0YXR1c19yZXBvcnQuaHRtbCNvMSI+Y29tcGxldGlvblN0YXR1czwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2Vhc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2Vhc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sI28yIj5nZW5lcmljPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWFzc2VydGlvbl9zdGF0dXNfcmVwb3J0Lmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWFzc2VydGlvbl9zdGF0dXNfcmVwb3J0Lmh0bWwjYTIiPnNlbmQ8L2E+KGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbyk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2Vhc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2Vhc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sI28zIj5zb2FwPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWFzc2VydGlvbl9zdGF0dXNfcmVwb3J0Lmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWFzc2VydGlvbl9zdGF0dXNfcmVwb3J0Lmh0bWwjYTAiPnVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0PC9hPihzdHJ1Y3Qgc29hcCAqKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWFzc2VydGlvbl9zdGF0dXNfcmVwb3J0Lmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWFzc2VydGlvbl9zdGF0dXNfcmVwb3J0Lmh0bWwjYTEiPnVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0PC9hPihzdHJ1Y3Qgc29hcCAqLCBjb25zdCBjaGFyICpjb21wbGV0aW9uU3RhdHVzKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWFzc2VydGlvbl9zdGF0dXNfcmVwb3J0Lmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU5IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2Vhc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWFzc2VydGlvbl9zdGF0dXNfcmVwb3J0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhmNzE1MQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2Vhc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sCkBAIC0wLDAgKzEsMjgwIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiB1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCBDbGFzcyBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQgQ2xhc3MgUmVmZXJlbmNlPC9oMT5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZ2V0X2Fzc2VydGlvblN0YXR1c1JlcG9ydCIuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3VkZGlfdjIuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWFzc2VydGlvbl9zdGF0dXNfcmVwb3J0LW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBNZW1iZXIgRnVuY3Rpb25zPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXNzZXJ0aW9uX3N0YXR1c19yZXBvcnQuaHRtbCNhMCI+dWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQ8L2E+IChzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXNzZXJ0aW9uX3N0YXR1c19yZXBvcnQuaHRtbCNvMyI+c29hcDwvYT4gKik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+TWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2EwIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2Vhc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sI2ExIj51ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydDwvYT4gKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2Vhc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sI28zIj5zb2FwPC9hPiAqLCBjb25zdCBjaGFyICo8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2Vhc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sI28xIj5jb21wbGV0aW9uU3RhdHVzPC9hPik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+TWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2ExIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfcmVwb3J0Lmh0bWwiPnVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQ8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWFzc2VydGlvbl9zdGF0dXNfcmVwb3J0Lmh0bWwjYTIiPnNlbmQ8L2E+IChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXNzZXJ0aW9uX3N0YXR1c19yZXBvcnQuaHRtbCNvMCI+YXV0aEluZm88L2E+KTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2Vhc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sI28wIj5hdXRoSW5mbzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+RWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmF1dGhJbmZvLiAgPGEgaHJlZj0iI28wIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2Vhc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sI28xIj5jb21wbGV0aW9uU3RhdHVzPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5FbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6Y29tcGxldGlvblN0YXR1cy4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXNzZXJ0aW9uX3N0YXR1c19yZXBvcnQuaHRtbCNvMiI+Z2VuZXJpYzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcuICA8YSBocmVmPSIjbzIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2Vhc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sI28zIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2Vhc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sI28zIj5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvMyI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJnZXRfYXNzZXJ0aW9uU3RhdHVzUmVwb3J0Ii4gDQorPHA+DQorUHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gZGV0ZXJtaW5lIHRoZSBzdGF0dXMgb2YgY3VycmVudCBhbmQgb3V0c3RhbmRpbmcgcHVibGlzaGVyIGFzc2VydGlvbnMuIFRoZSByZXN1bHRzIGNhbiBiZSByZXN0cmljdGVkIGJ5IHNldHRpbmcgdGhlIGNvbXBsZXRpb25TdGF0dXMgcHJvcGVydHkuPHA+DQorU2VlICA8YSBocmVmPSJodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzM4Ij5odHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzM4PC9hPiANCis8cD4NCis8aHI+PGgyPkNvbnN0cnVjdG9yICZhbXA7IERlc3RydWN0b3IgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTAiIGRveHl0YWc9InVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0Ojp1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydDo6dWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXNzZXJ0aW9uX3N0YXR1c19yZXBvcnQuaHRtbCNvMyI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK01lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Z1NPQVAgY29udGV4dDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0IGNsYXNzLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMSIgZG94eXRhZz0idWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQ6OnVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0Ojp1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2Vhc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sI28zIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmNvbXBsZXRpb25TdGF0dXM8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5nU09BUCBjb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+Y29tcGxldGlvblN0YXR1czwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29tcGxldGlvbiBzdGF0dXMgc3RyaW5nPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZCBjb21wbGV0aW9uIHN0YXR1cy4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPjxoMj5NZW1iZXIgRnVuY3Rpb24gRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTIiIGRveHl0YWc9InVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0OjpzZW5kIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sIj51ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0PC9hPiAqIHVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0OjpzZW5kICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmVuZHBvaW50PC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5hdXRoSW5mbzwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmVuZHBvaW50PC9lbT4mbmJzcDs8L3RkPjx0ZD5VUkwgb2YgdGhlIFVEREkgc2VydmVyIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+YXV0aEluZm88L2VtPiZuYnNwOzwvdGQ+PHRkPmF1dGhvcml6YXRpb24gdG9rZW4gcHJvdmlkZWQgYnkgdGhlIFVEREkgc2VydmVyIDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+QSBwb2ludGVyIHRvIGEgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfcmVwb3J0Lmh0bWwiPnVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQ8L2E+IG9iamVjdCBvciBOVUxMIG9uIGVycm9yPC9kZD48L2RsPg0KK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2aWNlIHRvIGdldCB0aGUgc3RhdHVzIG9mIGN1cnJlbnQgYW5kIG91dHN0YW5kaW5nIHB1Ymxpc2hlciBhc3NlcnRpb25zLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJ1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydDo6YXV0aEluZm8iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXNzZXJ0aW9uX3N0YXR1c19yZXBvcnQuaHRtbCNvMCI+dWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQ6OmF1dGhJbmZvPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0VsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjphdXRoSW5mby4gDQorPHA+DQorUmVxdWlyZWQgZWxlbWVudCAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0idWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQ6OmNvbXBsZXRpb25TdGF0dXMiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXNzZXJ0aW9uX3N0YXR1c19yZXBvcnQuaHRtbCNvMSI+dWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQ6OmNvbXBsZXRpb25TdGF0dXM8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmNvbXBsZXRpb25TdGF0dXMuIA0KKzxwPg0KK09wdGlvbmFsIGVsZW1lbnQgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9InVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0OjpnZW5lcmljIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWFzc2VydGlvbl9zdGF0dXNfcmVwb3J0Lmh0bWwjbzIiPnVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0OjpnZW5lcmljPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nLiANCis8cD4NCitSZXF1aXJlZCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzMiIGRveHl0YWc9InVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0Ojpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2Vhc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sI28zIj5zb2FwPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXNzZXJ0aW9uX3N0YXR1c19yZXBvcnQuaHRtbCNvMyI+dWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQ6OnNvYXA8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3VkZGkyLzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCI+dWRkaV92Mi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTkgMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4tbWVtYmVycy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4tbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMmViOTUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwyMCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW4gTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbjwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sI28yIj5jcmVkPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCI+dWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW48L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sI28wIj5nZW5lcmljPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCI+dWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW48L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sI2EyIj5zZW5kPC9hPihjb25zdCBjaGFyICplbmRwb2ludCk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCNvMyI+c29hcDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCNhMCI+dWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW48L2E+KHN0cnVjdCBzb2FwICopPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbjwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLmh0bWwjYTEiPnVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuPC9hPihzdHJ1Y3Qgc29hcCAqLCBjb25zdCBjaGFyICp1c2VyaWQsIGNvbnN0IGNoYXIgKnBhc3N3ZCk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCNvMSI+dXNlcklEPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCI+dWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW48L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTkgMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdiOTVmYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLmh0bWwKQEAgLTAsMCArMSwyNzcgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbiBDbGFzcyBSZWZlcmVuY2U8L2gxPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJnZXRfYXV0aFRva2VuIi4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7dWRkaV92Mi5oJmd0OzwvY29kZT4NCis8cD4NCis8YSBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgTWVtYmVyIEZ1bmN0aW9uczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCNhMCI+dWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW48L2E+IChzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sI28zIj5zb2FwPC9hPiAqKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCNhMSI+dWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW48L2E+IChzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sI28zIj5zb2FwPC9hPiAqLCBjb25zdCBjaGFyICp1c2VyaWQsIGNvbnN0IGNoYXIgKnBhc3N3ZCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+TWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2ExIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2F1dGhfdG9rZW4uaHRtbCI+dWRkaTJfX2F1dGhUb2tlbjwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sI2EyIj5zZW5kPC9hPiAoY29uc3QgY2hhciAqZW5kcG9pbnQpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gIDxhIGhyZWY9IiNhMiI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgQXR0cmlidXRlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCNvMCI+Z2VuZXJpYzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcuICA8YSBocmVmPSIjbzAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCNvMSI+dXNlcklEPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgdXNlcklEIG9mIHR5cGUgeHM6c3RyaW5nLiAgPGEgaHJlZj0iI28xIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLmh0bWwjbzIiPmNyZWQ8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkF0dHJpYnV0ZSBjcmVkIG9mIHR5cGUgeHM6c3RyaW5nLiAgPGEgaHJlZj0iI28yIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sI28zIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLmh0bWwjbzMiPnNvYXA8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiAgPGEgaHJlZj0iI28zIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzxocj48YSBuYW1lPSJfZGV0YWlscyI+PC9hPjxoMj5EZXRhaWxlZCBEZXNjcmlwdGlvbjwvaDI+DQorU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImdldF9hdXRoVG9rZW4iLiANCis8cD4NCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBvYnRhaW4gYW4gYXV0aG9yaXphdGlvbiB0b2tlbiwgd2hpY2ggaXMgcmVwcmVzZW50ZWQgYnkgdGhlIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hdXRoX3Rva2VuLmh0bWwiPnVkZGkyX19hdXRoVG9rZW48L2E+IGNsYXNzLjxwPg0KK1NlZSAgPGEgaHJlZj0iaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzczOSI+aHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzczOTwvYT4gDQorPHA+DQorPGhyPjxoMj5Db25zdHJ1Y3RvciAmYW1wOyBEZXN0cnVjdG9yIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEwIiBkb3h5dGFnPSJ1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbjo6dWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW4iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW46OnVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCNvMyI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK01lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Z1NPQVAgY29udGV4dDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFYXV0aFRva2VuIGNsYXNzLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMSIgZG94eXRhZz0idWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW46OnVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuOjp1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbiAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLmh0bWwjbzMiPnNvYXA8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+dXNlcmlkPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5wYXNzd2Q8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5nU09BUCBjb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+dXNlcmlkPC9lbT4mbmJzcDs8L3RkPjx0ZD50aGUgdXNlciBJRCBzdHJpbmcgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5wYXNzd2Q8L2VtPiZuYnNwOzwvdGQ+PHRkPnRoZSBwYXNzd29yZCBzdHJpbmc8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRWF1dGhUb2tlbiBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkIHVzZXIgSUQgYW5kIHBhc3N3b3JkLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+PGgyPk1lbWJlciBGdW5jdGlvbiBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMiIgZG94eXRhZz0idWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW46OnNlbmQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2F1dGhfdG9rZW4uaHRtbCI+dWRkaTJfX2F1dGhUb2tlbjwvYT4gKiB1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbjo6c2VuZCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gPGVtPmVuZHBvaW50PC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmVuZHBvaW50PC9lbT4mbmJzcDs8L3RkPjx0ZD5VUkwgb2YgdGhlIFVEREkgc2VydmVyIDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+QSBwb2ludGVyIHRvIGEgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2F1dGhfdG9rZW4uaHRtbCI+dWRkaTJfX2F1dGhUb2tlbjwvYT4gb2JqZWN0IG9yIE5VTEwgb24gZXJyb3I8L2RkPjwvZGw+DQorU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZpY2UgdG8gZ2V0IGEgYXV0aG9yaXphdGlvbiB0b2tlbiBnaXZlbiBhIHVzZXIgSUQgYW5kIHBhc3N3b3JkLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJ1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbjo6Y3JlZCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLmh0bWwjbzIiPnVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuOjpjcmVkPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSBjcmVkIG9mIHR5cGUgeHM6c3RyaW5nLiANCis8cD4NCitSZXF1aXJlZCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuOjpnZW5lcmljIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCNvMCI+dWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW46OmdlbmVyaWM8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcuIA0KKzxwPg0KK1JlcXVpcmVkIGF0dHJpYnV0ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMyIgZG94eXRhZz0idWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW46OnNvYXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCNvMyI+c29hcDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCNvMyI+dWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW46OnNvYXA8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJ1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbjo6dXNlcklEIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCNvMSI+dWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW46OnVzZXJJRDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgdXNlcklEIG9mIHR5cGUgeHM6c3RyaW5nLiANCis8cD4NCitSZXF1aXJlZCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvdWRkaTIvPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sIj51ZGRpX3YyLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNjo1OSAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYmluZGluZ19kZXRhaWwtbWVtYmVycy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJpbmRpbmdfZGV0YWlsLW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDI5NGFjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJpbmRpbmdfZGV0YWlsLW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDIwIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYmluZGluZ19kZXRhaWwuaHRtbCI+dWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsPC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2ViaW5kaW5nX2RldGFpbC5odG1sI28wIj5iaW5kaW5nS2V5PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJpbmRpbmdfZGV0YWlsLmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2ViaW5kaW5nX2RldGFpbC5odG1sI28xIj5nZW5lcmljPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJpbmRpbmdfZGV0YWlsLmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2ViaW5kaW5nX2RldGFpbC5odG1sI2EzIj5zZW5kPC9hPihjb25zdCBjaGFyICplbmRwb2ludCk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2ViaW5kaW5nX2RldGFpbC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWw8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYmluZGluZ19kZXRhaWwuaHRtbCNvMiI+c29hcDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2ViaW5kaW5nX2RldGFpbC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWw8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYmluZGluZ19kZXRhaWwuaHRtbCNhMCI+dWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsPC9hPihzdHJ1Y3Qgc29hcCAqKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJpbmRpbmdfZGV0YWlsLmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2ViaW5kaW5nX2RldGFpbC5odG1sI2ExIj51ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWw8L2E+KHN0cnVjdCBzb2FwICosIGNvbnN0IGNoYXIgKmJpbmRpbmdLZXkpPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYmluZGluZ19kZXRhaWwuaHRtbCI+dWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJpbmRpbmdfZGV0YWlsLmh0bWwjYTIiPnVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbDwvYT4oc3RydWN0IHNvYXAgKiwgc3RkOjp2ZWN0b3ImbHQ7IGNoYXIgKiAmZ3Q7IGJpbmRpbmdLZXlzKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJpbmRpbmdfZGV0YWlsLmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNjo1OSAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYmluZGluZ19kZXRhaWwuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2ViaW5kaW5nX2RldGFpbC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NjQ5MTEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYmluZGluZ19kZXRhaWwuaHRtbApAQCAtMCwwICsxLDI5MCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogdWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwgQ2xhc3MgUmVmZXJlbmNlPC9oMT5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZ2V0X2JpbmRpbmdEZXRhaWwiLiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KKzxjb2RlPiNpbmNsdWRlICZsdDt1ZGRpX3YyLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KKzxhIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2ViaW5kaW5nX2RldGFpbC1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgTWVtYmVyIEZ1bmN0aW9uczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJpbmRpbmdfZGV0YWlsLmh0bWwjYTAiPnVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbDwvYT4gKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2ViaW5kaW5nX2RldGFpbC5odG1sI28yIj5zb2FwPC9hPiAqKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJpbmRpbmdfZGV0YWlsLmh0bWwjYTEiPnVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbDwvYT4gKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2ViaW5kaW5nX2RldGFpbC5odG1sI28yIj5zb2FwPC9hPiAqLCBjb25zdCBjaGFyICo8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2ViaW5kaW5nX2RldGFpbC5odG1sI28wIj5iaW5kaW5nS2V5PC9hPik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+TWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2ExIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2ViaW5kaW5nX2RldGFpbC5odG1sI2EyIj51ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWw8L2E+IChzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYmluZGluZ19kZXRhaWwuaHRtbCNvMiI+c29hcDwvYT4gKiwgc3RkOjp2ZWN0b3ImbHQ7IGNoYXIgKiAmZ3Q7IGJpbmRpbmdLZXlzKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ19kZXRhaWwuaHRtbCI+dWRkaTJfX2JpbmRpbmdEZXRhaWw8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJpbmRpbmdfZGV0YWlsLmh0bWwjYTMiPnNlbmQ8L2E+IChjb25zdCBjaGFyICplbmRwb2ludCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+TWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2EzIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTIiPnVkZGkyX19iaW5kaW5nS2V5PC9hPiAmZ3Q7Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2ViaW5kaW5nX2RldGFpbC5odG1sI28wIj5iaW5kaW5nS2V5PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5WZWN0b3Igb2YgdWRkaTJfX2JpbmRpbmdLZXkgd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiAgPGEgaHJlZj0iI28wIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2ViaW5kaW5nX2RldGFpbC5odG1sI28xIj5nZW5lcmljPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZy4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJpbmRpbmdfZGV0YWlsLmh0bWwjbzIiPnNvYXA8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJpbmRpbmdfZGV0YWlsLmh0bWwjbzIiPnNvYXA8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiAgPGEgaHJlZj0iI28yIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzxocj48YSBuYW1lPSJfZGV0YWlscyI+PC9hPjxoMj5EZXRhaWxlZCBEZXNjcmlwdGlvbjwvaDI+DQorU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImdldF9iaW5kaW5nRGV0YWlsIi4gDQorPHA+DQorUmVwcmVzZW50cyBhIHJlcXVlc3QgdG8gZ2V0IGJpbmRpbmcgZGV0YWlscyBmcm9tIGEgVURESSBzZXJ2ZXIuPHA+DQorU2VlICA8YSBocmVmPSJodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzE3Ij5odHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzE3PC9hPiANCis8cD4NCis8aHI+PGgyPkNvbnN0cnVjdG9yICZhbXA7IERlc3RydWN0b3IgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTAiIGRveHl0YWc9InVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbDo6dWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbDo6dWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJpbmRpbmdfZGV0YWlsLmh0bWwjbzIiPnNvYXA8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmdTT0FQIGNvbnRleHQ8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwgY2xhc3MuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExIiBkb3h5dGFnPSJ1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWw6OnVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWw6OnVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2ViaW5kaW5nX2RldGFpbC5odG1sI28yIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmJpbmRpbmdLZXk8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5nU09BUCBjb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+YmluZGluZ0tleTwvZW0+Jm5ic3A7PC90ZD48dGQ+c3RyaW5nPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdldF9VU0NPUkViaW5kaW5nRGV0YWlsIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQgYmluZGluZyBrZXkuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEyIiBkb3h5dGFnPSJ1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWw6OnVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWw6OnVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2ViaW5kaW5nX2RldGFpbC5odG1sI28yIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+c3RkOjp2ZWN0b3ImbHQ7IGNoYXIgKiAmZ3Q7Jm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmJpbmRpbmdLZXlzPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK01lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Z1NPQVAgY29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmJpbmRpbmdLZXlzPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb2xsZWN0aW9uIG9mIGtleSBzdHJpbmdzPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdldF9VU0NPUkViaW5kaW5nRGV0YWlsIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBvZiBiaW5kaW5nIGtleXMuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj48aDI+TWVtYmVyIEZ1bmN0aW9uIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEzIiBkb3h5dGFnPSJ1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWw6OnNlbmQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfZGV0YWlsLmh0bWwiPnVkZGkyX19iaW5kaW5nRGV0YWlsPC9hPiAqIHVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbDo6c2VuZCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gPGVtPmVuZHBvaW50PC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmVuZHBvaW50PC9lbT4mbmJzcDs8L3RkPjx0ZD5VUkwgb2YgdGhlIFVEREkgc2VydmVyIDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+QSBwb2ludGVyIHRvIGEgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfZGV0YWlsLmh0bWwiPnVkZGkyX19iaW5kaW5nRGV0YWlsPC9hPiBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcjwvZGQ+PC9kbD4NCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmVyIHRvIGdldCB0aGUgYmluZGluZyBkZXRhaWxzLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJ1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWw6OmJpbmRpbmdLZXkiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RkOjp2ZWN0b3ImbHQ7PGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EyIj51ZGRpMl9fYmluZGluZ0tleTwvYT4gJmd0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2ViaW5kaW5nX2RldGFpbC5odG1sI28wIj51ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWw6OmJpbmRpbmdLZXk8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVmVjdG9yIG9mIHVkZGkyX19iaW5kaW5nS2V5IHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9InVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbDo6Z2VuZXJpYyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2ViaW5kaW5nX2RldGFpbC5odG1sI28xIj51ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWw6OmdlbmVyaWM8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcuIA0KKzxwPg0KK1JlcXVpcmVkIGF0dHJpYnV0ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMiIgZG94eXRhZz0idWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsOjpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2ViaW5kaW5nX2RldGFpbC5odG1sI28yIj5zb2FwPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYmluZGluZ19kZXRhaWwuaHRtbCNvMiI+dWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsOjpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU5IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VidXNpbmVzc19kZXRhaWwtbWVtYmVycy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbC1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlhYTNhZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VidXNpbmVzc19kZXRhaWwtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMjAgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsLmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWw8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbC5odG1sI28wIj5idXNpbmVzc0tleTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VidXNpbmVzc19kZXRhaWwuaHRtbCI+dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VidXNpbmVzc19kZXRhaWwuaHRtbCNvMSI+Z2VuZXJpYzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VidXNpbmVzc19kZXRhaWwuaHRtbCI+dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VidXNpbmVzc19kZXRhaWwuaHRtbCNhMyI+c2VuZDwvYT4oY29uc3QgY2hhciAqZW5kcG9pbnQpPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsLmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWw8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsLmh0bWwjbzIiPnNvYXA8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsLmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWw8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsLmh0bWwjYTAiPnVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWw8L2E+KHN0cnVjdCBzb2FwICopPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsLmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWw8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsLmh0bWwjYTEiPnVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWw8L2E+KHN0cnVjdCBzb2FwICosIGNvbnN0IGNoYXIgKmJ1c2luZXNzS2V5KTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbC5odG1sI2EyIj51ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsPC9hPihzdHJ1Y3Qgc29hcCAqLCBzdGQ6OnZlY3RvciZsdDsgY2hhciAqICZndDsgYnVzaW5lc3NLZXlzKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU5IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VidXNpbmVzc19kZXRhaWwuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VidXNpbmVzc19kZXRhaWwuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTNjNjI0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbC5odG1sCkBAIC0wLDAgKzEsMjkwIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsIENsYXNzIFJlZmVyZW5jZTwvaDE+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImdldF9idXNpbmVzc0RldGFpbCIuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3VkZGlfdjIuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbC1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgTWVtYmVyIEZ1bmN0aW9uczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbC5odG1sI2EwIj51ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsPC9hPiAoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbC5odG1sI28yIj5zb2FwPC9hPiAqKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbC5odG1sI2ExIj51ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsPC9hPiAoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbC5odG1sI28yIj5zb2FwPC9hPiAqLCBjb25zdCBjaGFyICo8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VidXNpbmVzc19kZXRhaWwuaHRtbCNvMCI+YnVzaW5lc3NLZXk8L2E+KTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbC5odG1sI2EyIj51ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsPC9hPiAoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbC5odG1sI28yIj5zb2FwPC9hPiAqLCBzdGQ6OnZlY3RvciZsdDsgY2hhciAqICZndDsgYnVzaW5lc3NLZXlzKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsLmh0bWwiPnVkZGkyX19idXNpbmVzc0RldGFpbDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsLmh0bWwjYTMiPnNlbmQ8L2E+IChjb25zdCBjaGFyICplbmRwb2ludCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+TWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2EzIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTMiPnVkZGkyX19idXNpbmVzc0tleTwvYT4gJmd0OyZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsLmh0bWwjbzAiPmJ1c2luZXNzS2V5PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5WZWN0b3Igb2YgdWRkaTJfX2J1c2luZXNzS2V5IHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gIDxhIGhyZWY9IiNvMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsLmh0bWwjbzEiPmdlbmVyaWM8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nLiAgPGEgaHJlZj0iI28xIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsLmh0bWwjbzIiPnNvYXA8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbC5odG1sI28yIj5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvMiI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJnZXRfYnVzaW5lc3NEZXRhaWwiLiANCis8cD4NCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBnZXQgYnVzaW5lc3MgZGV0YWlscyBmcm9tIGEgVURESSBzZXJ2ZXIuPHA+DQorU2VlICA8YSBocmVmPSJodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzE4Ij5odHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzE4PC9hPiANCis8cD4NCis8aHI+PGgyPkNvbnN0cnVjdG9yICZhbXA7IERlc3RydWN0b3IgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTAiIGRveHl0YWc9InVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWw6OnVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbDo6dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VidXNpbmVzc19kZXRhaWwuaHRtbCNvMiI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK01lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Z1NPQVAgY29udGV4dDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwgY2xhc3MuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExIiBkb3h5dGFnPSJ1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWw6OnVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsLmh0bWwjbzIiPnNvYXA8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+YnVzaW5lc3NLZXk8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5nU09BUCBjb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+YnVzaW5lc3NLZXk8L2VtPiZuYnNwOzwvdGQ+PHRkPnN0cmluZzwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZCBidXNpbmVzcyBrZXkuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEyIiBkb3h5dGFnPSJ1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWw6OnVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsLmh0bWwjbzIiPnNvYXA8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5zdGQ6OnZlY3RvciZsdDsgY2hhciAqICZndDsmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+YnVzaW5lc3NLZXlzPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK01lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Z1NPQVAgY29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmJ1c2luZXNzS2V5czwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29sbGVjdGlvbiBvZiBrZXkgc3RyaW5nczwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG9mIGJ1c2luZXNzIGtleXMuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj48aDI+TWVtYmVyIEZ1bmN0aW9uIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEzIiBkb3h5dGFnPSJ1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsOjpzZW5kIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWwuaHRtbCI+dWRkaTJfX2J1c2luZXNzRGV0YWlsPC9hPiAqIHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWw6OnNlbmQgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5lbmRwb2ludDwvZW0+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5lbmRwb2ludDwvZW0+Jm5ic3A7PC90ZD48dGQ+VVJMIG9mIHRoZSBVRERJIHNlcnZlciA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPkEgcG9pbnRlciB0byBhIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWwuaHRtbCI+dWRkaTJfX2J1c2luZXNzRGV0YWlsPC9hPiBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcjwvZGQ+PC9kbD4NCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmVyIHRvIGdldCB0aGUgYnVzaW5lc3MgZGV0YWlscy4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0idWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbDo6YnVzaW5lc3NLZXkiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RkOjp2ZWN0b3ImbHQ7PGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EzIj51ZGRpMl9fYnVzaW5lc3NLZXk8L2E+ICZndDsgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsLmh0bWwjbzAiPnVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWw6OmJ1c2luZXNzS2V5PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1ZlY3RvciBvZiB1ZGRpMl9fYnVzaW5lc3NLZXkgd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0idWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbDo6Z2VuZXJpYyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VidXNpbmVzc19kZXRhaWwuaHRtbCNvMSI+dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbDo6Z2VuZXJpYzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZy4gDQorPHA+DQorUmVxdWlyZWQgYXR0cmlidXRlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJ1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsOjpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VidXNpbmVzc19kZXRhaWwuaHRtbCNvMiI+c29hcDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbC5odG1sI28yIj51ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsOjpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU5IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VidXNpbmVzc19kZXRhaWxfZXh0LW1lbWJlcnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VidXNpbmVzc19kZXRhaWxfZXh0LW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjVjZTJkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbF9leHQtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMjAgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsX2V4dC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0PC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VidXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwjbzAiPmJ1c2luZXNzS2V5PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbF9leHQuaHRtbCI+dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VidXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwjbzEiPmdlbmVyaWM8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsX2V4dC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbF9leHQuaHRtbCNhMyI+c2VuZDwvYT4oY29uc3QgY2hhciAqZW5kcG9pbnQpPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsX2V4dC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbF9leHQuaHRtbCNvMiI+c29hcDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VidXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQ8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsX2V4dC5odG1sI2EwIj51ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0PC9hPihzdHJ1Y3Qgc29hcCAqKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbF9leHQuaHRtbCI+dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VidXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwjYTEiPnVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQ8L2E+KHN0cnVjdCBzb2FwICosIGNvbnN0IGNoYXIgKmJ1c2luZXNzS2V5KTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbF9leHQuaHRtbCI+dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VidXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwjYTIiPnVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQ8L2E+KHN0cnVjdCBzb2FwICosIHN0ZDo6dmVjdG9yJmx0OyBjaGFyICogJmd0OyBidXNpbmVzc0tleXMpPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsX2V4dC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU5IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VidXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsX2V4dC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYjE2MzMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsX2V4dC5odG1sCkBAIC0wLDAgKzEsMjkwIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0IENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0IENsYXNzIFJlZmVyZW5jZTwvaDE+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImdldF9idXNpbmVzc0RldGFpbEV4dCIuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3VkZGlfdjIuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbF9leHQtbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIE1lbWJlciBGdW5jdGlvbnM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VidXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwjYTAiPnVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQ8L2E+IChzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsX2V4dC5odG1sI28yIj5zb2FwPC9hPiAqKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbF9leHQuaHRtbCNhMSI+dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dDwvYT4gKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VidXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwjbzIiPnNvYXA8L2E+ICosIGNvbnN0IGNoYXIgKjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbF9leHQuaHRtbCNvMCI+YnVzaW5lc3NLZXk8L2E+KTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbF9leHQuaHRtbCNhMiI+dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dDwvYT4gKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VidXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwjbzIiPnNvYXA8L2E+ICosIHN0ZDo6dmVjdG9yJmx0OyBjaGFyICogJmd0OyBidXNpbmVzc0tleXMpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gIDxhIGhyZWY9IiNhMiI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwiPnVkZGkyX19idXNpbmVzc0RldGFpbEV4dDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsX2V4dC5odG1sI2EzIj5zZW5kPC9hPiAoY29uc3QgY2hhciAqZW5kcG9pbnQpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gIDxhIGhyZWY9IiNhMyI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgQXR0cmlidXRlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zdGQ6OnZlY3RvciZsdDsgPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EzIj51ZGRpMl9fYnVzaW5lc3NLZXk8L2E+ICZndDsmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbF9leHQuaHRtbCNvMCI+YnVzaW5lc3NLZXk8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlZlY3RvciBvZiB1ZGRpMl9fYnVzaW5lc3NLZXkgd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiAgPGEgaHJlZj0iI28wIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VidXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwjbzEiPmdlbmVyaWM8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nLiAgPGEgaHJlZj0iI28xIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsX2V4dC5odG1sI28yIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VidXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwjbzIiPnNvYXA8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiAgPGEgaHJlZj0iI28yIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzxocj48YSBuYW1lPSJfZGV0YWlscyI+PC9hPjxoMj5EZXRhaWxlZCBEZXNjcmlwdGlvbjwvaDI+DQorU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImdldF9idXNpbmVzc0RldGFpbEV4dCIuIA0KKzxwPg0KK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIGdldCBidXNpbmVzcyBkZXRhaWxzIGZyb20gYSBVRERJIHNlcnZlci48cD4NCitTZWUgIDxhIGhyZWY9Imh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3MTkiPmh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3MTk8L2E+IA0KKzxwPg0KKzxocj48aDI+Q29uc3RydWN0b3IgJmFtcDsgRGVzdHJ1Y3RvciBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMCIgZG94eXRhZz0idWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dDo6dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0Ojp1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0ICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbF9leHQuaHRtbCNvMiI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK01lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Z1NPQVAgY29udGV4dDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQgY2xhc3MuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExIiBkb3h5dGFnPSJ1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0Ojp1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQ6OnVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsX2V4dC5odG1sI28yIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmJ1c2luZXNzS2V5PC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK01lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Z1NPQVAgY29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmJ1c2luZXNzS2V5PC9lbT4mbmJzcDs8L3RkPjx0ZD5zdHJpbmc8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0IGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQgYnVzaW5lc3Mga2V5LiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMiIgZG94eXRhZz0idWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dDo6dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0Ojp1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0ICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbF9leHQuaHRtbCNvMiI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPnN0ZDo6dmVjdG9yJmx0OyBjaGFyICogJmd0OyZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5idXNpbmVzc0tleXM8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5nU09BUCBjb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+YnVzaW5lc3NLZXlzPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb2xsZWN0aW9uIG9mIGtleSBzdHJpbmdzPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dCBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2YgYnVzaW5lc3Mga2V5cy4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPjxoMj5NZW1iZXIgRnVuY3Rpb24gRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTMiIGRveHl0YWc9InVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQ6OnNlbmQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2RldGFpbF9leHQuaHRtbCI+dWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0PC9hPiAqIHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQ6OnNlbmQgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5lbmRwb2ludDwvZW0+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5lbmRwb2ludDwvZW0+Jm5ic3A7PC90ZD48dGQ+VVJMIG9mIHRoZSBVRERJIHNlcnZlciA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPkEgcG9pbnRlciB0byBhIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwiPnVkZGkyX19idXNpbmVzc0RldGFpbEV4dDwvYT4gb2JqZWN0IG9yIE5VTEwgb24gZXJyb3I8L2RkPjwvZGw+DQorU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZlciB0byBnZXQgdGhlIGJ1c2luZXNzIGRldGFpbHMuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQ6OmJ1c2luZXNzS2V5IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0ZDo6dmVjdG9yJmx0OzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMyI+dWRkaTJfX2J1c2luZXNzS2V5PC9hPiAmZ3Q7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbF9leHQuaHRtbCNvMCI+dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dDo6YnVzaW5lc3NLZXk8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVmVjdG9yIG9mIHVkZGkyX19idXNpbmVzc0tleSB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJ1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0OjpnZW5lcmljIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbF9leHQuaHRtbCNvMSI+dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dDo6Z2VuZXJpYzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZy4gDQorPHA+DQorUmVxdWlyZWQgYXR0cmlidXRlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJ1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0Ojpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VidXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwjbzIiPnNvYXA8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VidXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwjbzIiPnVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQ6OnNvYXA8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3VkZGkyLzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCI+dWRkaV92Mi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTkgMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLW1lbWJlcnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIxZjA1ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwxOCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zIE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMCI+YXV0aEluZm88L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCI+dWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzEiPmdlbmVyaWM8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCI+dWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjYTEiPnNlbmQ8L2E+KGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbyk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMiI+c29hcDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNhMCI+dWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPihzdHJ1Y3Qgc29hcCAqKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNjo1OSAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZDM1NDQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbApAQCAtMCwwICsxLDIwNCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogdWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgQ2xhc3MgUmVmZXJlbmNlPC9oMT5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZ2V0X3B1Ymxpc2hlckFzc2VydGlvbnMiLiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KKzxjb2RlPiNpbmNsdWRlICZsdDt1ZGRpX3YyLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KKzxhIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgTWVtYmVyIEZ1bmN0aW9uczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjYTAiPnVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT4gKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28yIj5zb2FwPC9hPiAqKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCI+dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnM8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjYTEiPnNlbmQ8L2E+IChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMCI+YXV0aEluZm88L2E+KTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28wIj5hdXRoSW5mbzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+RWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmF1dGhJbmZvLiAgPGEgaHJlZj0iI28wIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28xIj5nZW5lcmljPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZy4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzIiPnNvYXA8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzIiPnNvYXA8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiAgPGEgaHJlZj0iI28yIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzxocj48YSBuYW1lPSJfZGV0YWlscyI+PC9hPjxoMj5EZXRhaWxlZCBEZXNjcmlwdGlvbjwvaDI+DQorU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImdldF9wdWJsaXNoZXJBc3NlcnRpb25zIi4gDQorPHA+DQorUmVwcmVzZW50cyBhIHJlcXVlc3QgdG8gb2J0YWluIHRoZSBmdWxsIHNldCBvZiBwdWJsaXNoZXIgYXNzZXJ0aW9ucyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggYW4gaW5kaXZpZHVhbCBwdWJsaXNoZXIuPHA+DQorU2VlICA8YSBocmVmPSJodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzQwIj5odHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzQwPC9hPiANCis8cD4NCis8aHI+PGgyPkNvbnN0cnVjdG9yICZhbXA7IERlc3RydWN0b3IgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTAiIGRveHl0YWc9InVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczo6dWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczo6dWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzIiPnNvYXA8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmdTT0FQIGNvbnRleHQ8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2V0aW9ucyBjbGFzcy4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPjxoMj5NZW1iZXIgRnVuY3Rpb24gRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTEiIGRveHl0YWc9InVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczo6c2VuZCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCI+dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnM8L2E+ICogdWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjpzZW5kICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmVuZHBvaW50PC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5hdXRoSW5mbzwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmVuZHBvaW50PC9lbT4mbmJzcDs8L3RkPjx0ZD5VUkwgb2YgdGhlIFVEREkgc2VydmVyIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+YXV0aEluZm88L2VtPiZuYnNwOzwvdGQ+PHRkPmF1dGhvcml6YXRpb24gdG9rZW4gcHJvdmlkZWQgYnkgdGhlIFVEREkgc2VydmVyIDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+QSBwb2ludGVyIHRvIGEgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwiPnVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zPC9hPiBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcjwvZGQ+PC9kbD4NCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmljZSB0byBnZXQgcHVibGlzaGVyIGFzc2VydGlvbnMuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczo6YXV0aEluZm8iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMCI+dWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjphdXRoSW5mbzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YXV0aEluZm8uIA0KKzxwPg0KK1JlcXVpcmVkIGVsZW1lbnQgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9InVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczo6Z2VuZXJpYyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28xIj51ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM6OmdlbmVyaWM8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcuIA0KKzxwPg0KK1JlcXVpcmVkIGF0dHJpYnV0ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMiIgZG94eXRhZz0idWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28yIj5zb2FwPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMiI+dWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU5IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VyZWdpc3RlcmVkX2luZm8tbWVtYmVycy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXJlZ2lzdGVyZWRfaW5mby1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNkMzE3ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VyZWdpc3RlcmVkX2luZm8tbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTggQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8gTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lcmVnaXN0ZXJlZF9pbmZvLmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm88L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXJlZ2lzdGVyZWRfaW5mby5odG1sI28wIj5hdXRoSW5mbzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VyZWdpc3RlcmVkX2luZm8uaHRtbCI+dWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbzwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VyZWdpc3RlcmVkX2luZm8uaHRtbCNvMSI+Z2VuZXJpYzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VyZWdpc3RlcmVkX2luZm8uaHRtbCI+dWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbzwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VyZWdpc3RlcmVkX2luZm8uaHRtbCNhMSI+c2VuZDwvYT4oY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXJlZ2lzdGVyZWRfaW5mby5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXJlZ2lzdGVyZWRfaW5mby5odG1sI28yIj5zb2FwPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXJlZ2lzdGVyZWRfaW5mby5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXJlZ2lzdGVyZWRfaW5mby5odG1sI2EwIj51ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvPC9hPihzdHJ1Y3Qgc29hcCAqKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXJlZ2lzdGVyZWRfaW5mby5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU5IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VyZWdpc3RlcmVkX2luZm8uaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VyZWdpc3RlcmVkX2luZm8uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjE1MTViCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXJlZ2lzdGVyZWRfaW5mby5odG1sCkBAIC0wLDAgKzEsMjA0IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiB1ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvIENsYXNzIFJlZmVyZW5jZTwvaDE+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImdldF9yZWdpc3RlcmVkSW5mbyIuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3VkZGlfdjIuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXJlZ2lzdGVyZWRfaW5mby1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgTWVtYmVyIEZ1bmN0aW9uczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXJlZ2lzdGVyZWRfaW5mby5odG1sI2EwIj51ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvPC9hPiAoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXJlZ2lzdGVyZWRfaW5mby5odG1sI28yIj5zb2FwPC9hPiAqKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVnaXN0ZXJlZF9pbmZvLmh0bWwiPnVkZGkyX19yZWdpc3RlcmVkSW5mbzwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lcmVnaXN0ZXJlZF9pbmZvLmh0bWwjYTEiPnNlbmQ8L2E+IChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lcmVnaXN0ZXJlZF9pbmZvLmh0bWwjbzAiPmF1dGhJbmZvPC9hPik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+TWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2ExIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lcmVnaXN0ZXJlZF9pbmZvLmh0bWwjbzAiPmF1dGhJbmZvPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5FbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YXV0aEluZm8uICA8YSBocmVmPSIjbzAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXJlZ2lzdGVyZWRfaW5mby5odG1sI28xIj5nZW5lcmljPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZy4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXJlZ2lzdGVyZWRfaW5mby5odG1sI28yIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VyZWdpc3RlcmVkX2luZm8uaHRtbCNvMiI+c29hcDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuICA8YSBocmVmPSIjbzIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzwvdGFibGU+DQorPGhyPjxhIG5hbWU9Il9kZXRhaWxzIj48L2E+PGgyPkRldGFpbGVkIERlc2NyaXB0aW9uPC9oMj4NCitTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZ2V0X3JlZ2lzdGVyZWRJbmZvIi4gDQorPHA+DQorUmVwcmVzZW50cyBhIHJlcXVlc3QgdG8gZ2V0IGFsbCByZWdpc3RlcmVkIGJ1c2luZXNzIGVudGl0aWVzIGFuZCB0TW9kZWxzIGNvbnRyb2xsZWQgYnkgYW4gaW5kaXZpZHVhbC48cD4NCitTZWUgIDxhIGhyZWY9Imh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3NDEiPmh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3NDE8L2E+IA0KKzxwPg0KKzxocj48aDI+Q29uc3RydWN0b3IgJmFtcDsgRGVzdHJ1Y3RvciBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMCIgZG94eXRhZz0idWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbzo6dWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB1ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvOjp1ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXJlZ2lzdGVyZWRfaW5mby5odG1sI28yIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiA8ZW0+c29hcDwvZW0+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5nU09BUCBjb250ZXh0PC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyBjbGFzcy4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPjxoMj5NZW1iZXIgRnVuY3Rpb24gRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTEiIGRveHl0YWc9InVkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm86OnNlbmQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlZ2lzdGVyZWRfaW5mby5odG1sIj51ZGRpMl9fcmVnaXN0ZXJlZEluZm88L2E+ICogdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbzo6c2VuZCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5lbmRwb2ludDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+YXV0aEluZm88L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5lbmRwb2ludDwvZW0+Jm5ic3A7PC90ZD48dGQ+VVJMIG9mIHRoZSBVRERJIHNlcnZlciA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmF1dGhJbmZvPC9lbT4mbmJzcDs8L3RkPjx0ZD5hdXRob3JpemF0aW9uIHRva2VuIHByb3ZpZGVkIGJ5IHRoZSBVRERJIHNlcnZlciA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPkEgcG9pbnRlciB0byBhIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWdpc3RlcmVkX2luZm8uaHRtbCI+dWRkaTJfX3JlZ2lzdGVyZWRJbmZvPC9hPiBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcjwvZGQ+PC9kbD4NCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmljZSB0byBnZXQgYWxsIHJlZ2lzdGVyZWQgYnVzaW5lc3MgZW50aXRpZXMgYW5kIHRNb2RlbHMgY29udHJvbGxlZCBieSBhbiBpbmRpdmlkdWFsLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJ1ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvOjphdXRoSW5mbyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VyZWdpc3RlcmVkX2luZm8uaHRtbCNvMCI+dWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbzo6YXV0aEluZm88L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmF1dGhJbmZvLiANCis8cD4NCitSZXF1aXJlZCBlbGVtZW50ICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJ1ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvOjpnZW5lcmljIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXJlZ2lzdGVyZWRfaW5mby5odG1sI28xIj51ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvOjpnZW5lcmljPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nLiANCis8cD4NCitSZXF1aXJlZCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9InVkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm86OnNvYXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXJlZ2lzdGVyZWRfaW5mby5odG1sI28yIj5zb2FwPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lcmVnaXN0ZXJlZF9pbmZvLmh0bWwjbzIiPnVkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm86OnNvYXA8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3VkZGkyLzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCI+dWRkaV92Mi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTkgMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXNlcnZpY2VfZGV0YWlsLW1lbWJlcnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VzZXJ2aWNlX2RldGFpbC1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UxYjE4YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VzZXJ2aWNlX2RldGFpbC1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwyMCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsIE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXNlcnZpY2VfZGV0YWlsLmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbDwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lc2VydmljZV9kZXRhaWwuaHRtbCNvMSI+Z2VuZXJpYzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VzZXJ2aWNlX2RldGFpbC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWw8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lc2VydmljZV9kZXRhaWwuaHRtbCNhMyI+c2VuZDwvYT4oY29uc3QgY2hhciAqZW5kcG9pbnQpPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lc2VydmljZV9kZXRhaWwuaHRtbCI+dWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXNlcnZpY2VfZGV0YWlsLmh0bWwjbzAiPnNlcnZpY2VLZXk8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lc2VydmljZV9kZXRhaWwuaHRtbCI+dWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXNlcnZpY2VfZGV0YWlsLmh0bWwjbzIiPnNvYXA8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lc2VydmljZV9kZXRhaWwuaHRtbCI+dWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXNlcnZpY2VfZGV0YWlsLmh0bWwjYTAiPnVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbDwvYT4oc3RydWN0IHNvYXAgKik8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VzZXJ2aWNlX2RldGFpbC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWw8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lc2VydmljZV9kZXRhaWwuaHRtbCNhMSI+dWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsPC9hPihzdHJ1Y3Qgc29hcCAqLCBjb25zdCBjaGFyICpzZXJ2aWNlS2V5KTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXNlcnZpY2VfZGV0YWlsLmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VzZXJ2aWNlX2RldGFpbC5odG1sI2EyIj51ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWw8L2E+KHN0cnVjdCBzb2FwICosIHN0ZDo6dmVjdG9yJmx0OyBjaGFyICogJmd0OyBzZXJ2aWNlS2V5cyk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VzZXJ2aWNlX2RldGFpbC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWw8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTkgMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXNlcnZpY2VfZGV0YWlsLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lc2VydmljZV9kZXRhaWwuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTQ5Y2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXNlcnZpY2VfZGV0YWlsLmh0bWwKQEAgLTAsMCArMSwyOTAgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IHVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbCBDbGFzcyBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsIENsYXNzIFJlZmVyZW5jZTwvaDE+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImdldF9zZXJ2aWNlRGV0YWlsIi4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7dWRkaV92Mi5oJmd0OzwvY29kZT4NCis8cD4NCis8YSBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lc2VydmljZV9kZXRhaWwtbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIE1lbWJlciBGdW5jdGlvbnM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VzZXJ2aWNlX2RldGFpbC5odG1sI2EwIj51ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWw8L2E+IChzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lc2VydmljZV9kZXRhaWwuaHRtbCNvMiI+c29hcDwvYT4gKik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+TWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2EwIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VzZXJ2aWNlX2RldGFpbC5odG1sI2ExIj51ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWw8L2E+IChzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lc2VydmljZV9kZXRhaWwuaHRtbCNvMiI+c29hcDwvYT4gKiwgY29uc3QgY2hhciAqPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lc2VydmljZV9kZXRhaWwuaHRtbCNvMCI+c2VydmljZUtleTwvYT4pPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gIDxhIGhyZWY9IiNhMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lc2VydmljZV9kZXRhaWwuaHRtbCNhMiI+dWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsPC9hPiAoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXNlcnZpY2VfZGV0YWlsLmh0bWwjbzIiPnNvYXA8L2E+ICosIHN0ZDo6dmVjdG9yJmx0OyBjaGFyICogJmd0OyBzZXJ2aWNlS2V5cyk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+TWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2EyIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfZGV0YWlsLmh0bWwiPnVkZGkyX19zZXJ2aWNlRGV0YWlsPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VzZXJ2aWNlX2RldGFpbC5odG1sI2EzIj5zZW5kPC9hPiAoY29uc3QgY2hhciAqZW5kcG9pbnQpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gIDxhIGhyZWY9IiNhMyI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgQXR0cmlidXRlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zdGQ6OnZlY3RvciZsdDsgPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0Ij51ZGRpMl9fc2VydmljZUtleTwvYT4gJmd0OyZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lc2VydmljZV9kZXRhaWwuaHRtbCNvMCI+c2VydmljZUtleTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VmVjdG9yIG9mIHVkZGkyX19zZXJ2aWNlS2V5IHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gIDxhIGhyZWY9IiNvMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lc2VydmljZV9kZXRhaWwuaHRtbCNvMSI+Z2VuZXJpYzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcuICA8YSBocmVmPSIjbzEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VzZXJ2aWNlX2RldGFpbC5odG1sI28yIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VzZXJ2aWNlX2RldGFpbC5odG1sI28yIj5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvMiI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJnZXRfc2VydmljZURldGFpbCIuIA0KKzxwPg0KK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIGdldCBzZXJ2aWNlIGRldGFpbHMgZnJvbSBhIFVEREkgc2VydmVyLjxwPg0KK1NlZSAgPGEgaHJlZj0iaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzcyMCI+aHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzcyMDwvYT4gDQorPHA+DQorPGhyPjxoMj5Db25zdHJ1Y3RvciAmYW1wOyBEZXN0cnVjdG9yIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEwIiBkb3h5dGFnPSJ1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWw6OnVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWw6OnVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VzZXJ2aWNlX2RldGFpbC5odG1sI28yIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiA8ZW0+c29hcDwvZW0+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5nU09BUCBjb250ZXh0PC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdldF9VU0NPUkVzZXJ2aWNlRGV0YWlsIGNsYXNzLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMSIgZG94eXRhZz0idWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lc2VydmljZV9kZXRhaWwuaHRtbCNvMiI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zZXJ2aWNlS2V5PC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK01lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Z1NPQVAgY29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNlcnZpY2VLZXk8L2VtPiZuYnNwOzwvdGQ+PHRkPnN0cmluZzwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFc2VydmljZURldGFpbCBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkIHNlcnZpY2Uga2V5LiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMiIgZG94eXRhZz0idWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lc2VydmljZV9kZXRhaWwuaHRtbCNvMiI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPnN0ZDo6dmVjdG9yJmx0OyBjaGFyICogJmd0OyZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zZXJ2aWNlS2V5czwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmdTT0FQIGNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zZXJ2aWNlS2V5czwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29sbGVjdGlvbiBvZiBrZXkgc3RyaW5nczwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFc2VydmljZURldGFpbCBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2Ygc2VydmljZSBrZXlzLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+PGgyPk1lbWJlciBGdW5jdGlvbiBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMyIgZG94eXRhZz0idWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsOjpzZW5kIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2RldGFpbC5odG1sIj51ZGRpMl9fc2VydmljZURldGFpbDwvYT4gKiB1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWw6OnNlbmQgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5lbmRwb2ludDwvZW0+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5lbmRwb2ludDwvZW0+Jm5ic3A7PC90ZD48dGQ+VVJMIG9mIHRoZSBVRERJIHNlcnZlciA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPkEgcG9pbnRlciB0byBhIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2RldGFpbC5odG1sIj51ZGRpMl9fc2VydmljZURldGFpbDwvYT4gb2JqZWN0IG9yIE5VTEwgb24gZXJyb3I8L2RkPjwvZGw+DQorU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZlciB0byBnZXQgdGhlIHNlcnZpY2UgZGV0YWlscy4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0idWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsOjpnZW5lcmljIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXNlcnZpY2VfZGV0YWlsLmh0bWwjbzEiPnVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbDo6Z2VuZXJpYzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZy4gDQorPHA+DQorUmVxdWlyZWQgYXR0cmlidXRlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJ1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWw6OnNlcnZpY2VLZXkiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RkOjp2ZWN0b3ImbHQ7PGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0Ij51ZGRpMl9fc2VydmljZUtleTwvYT4gJmd0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VzZXJ2aWNlX2RldGFpbC5odG1sI28wIj51ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWw6OnNlcnZpY2VLZXk8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVmVjdG9yIG9mIHVkZGkyX19zZXJ2aWNlS2V5IHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9InVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbDo6c29hcCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lc2VydmljZV9kZXRhaWwuaHRtbCNvMiI+c29hcDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXNlcnZpY2VfZGV0YWlsLmh0bWwjbzIiPnVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbDo6c29hcDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvdWRkaTIvPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sIj51ZGRpX3YyLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNjo1OSAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9ldF9tb2RlbF9kZXRhaWwtbWVtYmVycy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXRfbW9kZWxfZGV0YWlsLW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2NhNWI1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXRfbW9kZWxfZGV0YWlsLW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDIwIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbCBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2V0X21vZGVsX2RldGFpbC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbDwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9ldF9tb2RlbF9kZXRhaWwuaHRtbCNvMSI+Z2VuZXJpYzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2V0X21vZGVsX2RldGFpbC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2V0X21vZGVsX2RldGFpbC5odG1sI2EzIj5zZW5kPC9hPihjb25zdCBjaGFyICplbmRwb2ludCk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2V0X21vZGVsX2RldGFpbC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2V0X21vZGVsX2RldGFpbC5odG1sI28yIj5zb2FwPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXRfbW9kZWxfZGV0YWlsLmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXRfbW9kZWxfZGV0YWlsLmh0bWwjbzAiPnRNb2RlbEtleTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2V0X21vZGVsX2RldGFpbC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2V0X21vZGVsX2RldGFpbC5odG1sI2EwIj51ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbDwvYT4oc3RydWN0IHNvYXAgKik8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2V0X21vZGVsX2RldGFpbC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2V0X21vZGVsX2RldGFpbC5odG1sI2ExIj51ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbDwvYT4oc3RydWN0IHNvYXAgKiwgY29uc3QgY2hhciAqdE1vZGVsS2V5KTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXRfbW9kZWxfZGV0YWlsLmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXRfbW9kZWxfZGV0YWlsLmh0bWwjYTIiPnVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsPC9hPihzdHJ1Y3Qgc29hcCAqLCBzdGQ6OnZlY3RvciZsdDsgY2hhciAqICZndDsgdE1vZGVsS2V5cyk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2V0X21vZGVsX2RldGFpbC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNjo1OSAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9ldF9tb2RlbF9kZXRhaWwuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2V0X21vZGVsX2RldGFpbC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZGM3ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9ldF9tb2RlbF9kZXRhaWwuaHRtbApAQCAtMCwwICsxLDI5MCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwgQ2xhc3MgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsIENsYXNzIFJlZmVyZW5jZTwvaDE+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImdldF90TW9kZWxEZXRhaWwiLiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KKzxjb2RlPiNpbmNsdWRlICZsdDt1ZGRpX3YyLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KKzxhIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2V0X21vZGVsX2RldGFpbC1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgTWVtYmVyIEZ1bmN0aW9uczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXRfbW9kZWxfZGV0YWlsLmh0bWwjYTAiPnVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsPC9hPiAoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXRfbW9kZWxfZGV0YWlsLmh0bWwjbzIiPnNvYXA8L2E+ICopPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gIDxhIGhyZWY9IiNhMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9ldF9tb2RlbF9kZXRhaWwuaHRtbCNhMSI+dWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWw8L2E+IChzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9ldF9tb2RlbF9kZXRhaWwuaHRtbCNvMiI+c29hcDwvYT4gKiwgY29uc3QgY2hhciAqPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9ldF9tb2RlbF9kZXRhaWwuaHRtbCNvMCI+dE1vZGVsS2V5PC9hPik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+TWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2ExIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2V0X21vZGVsX2RldGFpbC5odG1sI2EyIj51ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbDwvYT4gKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2V0X21vZGVsX2RldGFpbC5odG1sI28yIj5zb2FwPC9hPiAqLCBzdGQ6OnZlY3RvciZsdDsgY2hhciAqICZndDsgdE1vZGVsS2V5cyk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+TWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2EyIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfZGV0YWlsLmh0bWwiPnVkZGkyX190TW9kZWxEZXRhaWw8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXRfbW9kZWxfZGV0YWlsLmh0bWwjYTMiPnNlbmQ8L2E+IChjb25zdCBjaGFyICplbmRwb2ludCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+TWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2EzIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTUiPnVkZGkyX190TW9kZWxLZXk8L2E+ICZndDsmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXRfbW9kZWxfZGV0YWlsLmh0bWwjbzAiPnRNb2RlbEtleTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VmVjdG9yIG9mIHVkZGkyX190TW9kZWxLZXkgd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiAgPGEgaHJlZj0iI28wIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2V0X21vZGVsX2RldGFpbC5odG1sI28xIj5nZW5lcmljPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZy4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXRfbW9kZWxfZGV0YWlsLmh0bWwjbzIiPnNvYXA8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXRfbW9kZWxfZGV0YWlsLmh0bWwjbzIiPnNvYXA8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiAgPGEgaHJlZj0iI28yIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzxocj48YSBuYW1lPSJfZGV0YWlscyI+PC9hPjxoMj5EZXRhaWxlZCBEZXNjcmlwdGlvbjwvaDI+DQorU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImdldF90TW9kZWxEZXRhaWwiLiANCis8cD4NCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBnZXQgdE1vZGVsIGRldGFpbHMgZnJvbSBhIFVEREkgc2VydmVyLjxwPg0KK1NlZSAgPGEgaHJlZj0iaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzcyMSI+aHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzcyMTwvYT4gDQorPHA+DQorPGhyPjxoMj5Db25zdHJ1Y3RvciAmYW1wOyBEZXN0cnVjdG9yIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEwIiBkb3h5dGFnPSJ1ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbDo6dWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWw6OnVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXRfbW9kZWxfZGV0YWlsLmh0bWwjbzIiPnNvYXA8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmdTT0FQIGNvbnRleHQ8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRXRNb2RlbERldGFpbCBjbGFzcy4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTEiIGRveHl0YWc9InVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB1ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbDo6dWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9ldF9tb2RlbF9kZXRhaWwuaHRtbCNvMiI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT50TW9kZWxLZXk8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5nU09BUCBjb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+dE1vZGVsS2V5PC9lbT4mbmJzcDs8L3RkPjx0ZD5zdHJpbmc8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRXRNb2RlbERldGFpbCBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkIHRNb2RlbCBrZXkuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEyIiBkb3h5dGFnPSJ1ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbDo6dWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWw6OnVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXRfbW9kZWxfZGV0YWlsLmh0bWwjbzIiPnNvYXA8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5zdGQ6OnZlY3RvciZsdDsgY2hhciAqICZndDsmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+dE1vZGVsS2V5czwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmdTT0FQIGNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT50TW9kZWxLZXlzPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb2xsZWN0aW9uIG9mIGtleSBzdHJpbmdzPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdldF9VU0NPUkV0TW9kZWxEZXRhaWwgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG9mIHRNb2RlbCBrZXlzLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+PGgyPk1lbWJlciBGdW5jdGlvbiBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMyIgZG94eXRhZz0idWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWw6OnNlbmQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfZGV0YWlsLmh0bWwiPnVkZGkyX190TW9kZWxEZXRhaWw8L2E+ICogdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWw6OnNlbmQgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5lbmRwb2ludDwvZW0+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5lbmRwb2ludDwvZW0+Jm5ic3A7PC90ZD48dGQ+VVJMIG9mIHRoZSBVRERJIHNlcnZlciA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPkEgcG9pbnRlciB0byBhIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2RldGFpbC5odG1sIj51ZGRpMl9fdE1vZGVsRGV0YWlsPC9hPiBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcjwvZGQ+PC9kbD4NCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmVyIHRvIGdldCB0aGUgdE1vZGVsIGRldGFpbHMuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9InVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsOjpnZW5lcmljIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXRfbW9kZWxfZGV0YWlsLmh0bWwjbzEiPnVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsOjpnZW5lcmljPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nLiANCis8cD4NCitSZXF1aXJlZCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9InVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsOjpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2V0X21vZGVsX2RldGFpbC5odG1sI28yIj5zb2FwPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9ldF9tb2RlbF9kZXRhaWwuaHRtbCNvMiI+dWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWw6OnNvYXA8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJ1ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbDo6dE1vZGVsS2V5IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0ZDo6dmVjdG9yJmx0OzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNSI+dWRkaTJfX3RNb2RlbEtleTwvYT4gJmd0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2V0X21vZGVsX2RldGFpbC5odG1sI28wIj51ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbDo6dE1vZGVsS2V5PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1ZlY3RvciBvZiB1ZGRpMl9fdE1vZGVsS2V5IHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvdWRkaTIvPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sIj51ZGRpX3YyLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNjo1OSAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2hvc3RpbmdfcmVkaXJlY3Rvci1tZW1iZXJzLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2hvc3RpbmdfcmVkaXJlY3Rvci1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVlOTcyZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19faG9zdGluZ19yZWRpcmVjdG9yLW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDE1IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9faG9zdGluZ1JlZGlyZWN0b3IgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2hvc3RpbmdfcmVkaXJlY3Rvci5odG1sIj51ZGRpMl9faG9zdGluZ1JlZGlyZWN0b3I8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19ob3N0aW5nX3JlZGlyZWN0b3IuaHRtbCNvMCI+YmluZGluZ0tleTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19faG9zdGluZ19yZWRpcmVjdG9yLmh0bWwiPnVkZGkyX19ob3N0aW5nUmVkaXJlY3RvcjwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19faG9zdGluZ19yZWRpcmVjdG9yLmh0bWwjbzEiPnNvYXA8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2hvc3RpbmdfcmVkaXJlY3Rvci5odG1sIj51ZGRpMl9faG9zdGluZ1JlZGlyZWN0b3I8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTkgMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19ob3N0aW5nX3JlZGlyZWN0b3IuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19faG9zdGluZ19yZWRpcmVjdG9yLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBlYTY1YgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19faG9zdGluZ19yZWRpcmVjdG9yLmh0bWwKQEAgLTAsMCArMSw4MyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogdWRkaTJfX2hvc3RpbmdSZWRpcmVjdG9yIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9faG9zdGluZ1JlZGlyZWN0b3IgQ2xhc3MgUmVmZXJlbmNlPC9oMT5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiaG9zdGluZ1JlZGlyZWN0b3IiLiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KKzxjb2RlPiNpbmNsdWRlICZsdDt1ZGRpX3YyLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KKzxhIGhyZWY9ImNsYXNzdWRkaTJfX19faG9zdGluZ19yZWRpcmVjdG9yLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMiI+dWRkaTJfX2JpbmRpbmdLZXk8L2E+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19faG9zdGluZ19yZWRpcmVjdG9yLmh0bWwjbzAiPmJpbmRpbmdLZXk8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkF0dHJpYnV0ZSBiaW5kaW5nS2V5IG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOmJpbmRpbmdLZXkuICA8YSBocmVmPSIjbzAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19faG9zdGluZ19yZWRpcmVjdG9yLmh0bWwjbzEiPnNvYXA8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19ob3N0aW5nX3JlZGlyZWN0b3IuaHRtbCNvMSI+c29hcDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuICA8YSBocmVmPSIjbzEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzwvdGFibGU+DQorPGhyPjxhIG5hbWU9Il9kZXRhaWxzIj48L2E+PGgyPkRldGFpbGVkIERlc2NyaXB0aW9uPC9oMj4NCitTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiaG9zdGluZ1JlZGlyZWN0b3IiLiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJ1ZGRpMl9faG9zdGluZ1JlZGlyZWN0b3I6OmJpbmRpbmdLZXkiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EyIj51ZGRpMl9fYmluZGluZ0tleTwvYT4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2hvc3RpbmdfcmVkaXJlY3Rvci5odG1sI28wIj51ZGRpMl9faG9zdGluZ1JlZGlyZWN0b3I6OmJpbmRpbmdLZXk8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIGJpbmRpbmdLZXkgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YmluZGluZ0tleS4gDQorPHA+DQorUmVxdWlyZWQgYXR0cmlidXRlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJ1ZGRpMl9faG9zdGluZ1JlZGlyZWN0b3I6OnNvYXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19ob3N0aW5nX3JlZGlyZWN0b3IuaHRtbCNvMSI+c29hcDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19ob3N0aW5nX3JlZGlyZWN0b3IuaHRtbCNvMSI+dWRkaTJfX2hvc3RpbmdSZWRpcmVjdG9yOjpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU5IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19faWRlbnRpZmllcl9iYWctbWVtYmVycy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19pZGVudGlmaWVyX2JhZy1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRmYTczNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19faWRlbnRpZmllcl9iYWctbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19pZGVudGlmaWVyQmFnIE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19pZGVudGlmaWVyX2JhZy5odG1sIj51ZGRpMl9faWRlbnRpZmllckJhZzwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2lkZW50aWZpZXJfYmFnLmh0bWwjbzAiPmtleWVkUmVmZXJlbmNlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19pZGVudGlmaWVyX2JhZy5odG1sIj51ZGRpMl9faWRlbnRpZmllckJhZzwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19faWRlbnRpZmllcl9iYWcuaHRtbCNvMSI+c29hcDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19faWRlbnRpZmllcl9iYWcuaHRtbCI+dWRkaTJfX2lkZW50aWZpZXJCYWc8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTkgMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19pZGVudGlmaWVyX2JhZy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19pZGVudGlmaWVyX2JhZy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4Njc4M2UKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2lkZW50aWZpZXJfYmFnLmh0bWwKQEAgLTAsMCArMSw4MyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogdWRkaTJfX2lkZW50aWZpZXJCYWcgQ2xhc3MgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19pZGVudGlmaWVyQmFnIENsYXNzIFJlZmVyZW5jZTwvaDE+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImlkZW50aWZpZXJCYWciLiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KKzxjb2RlPiNpbmNsdWRlICZsdDt1ZGRpX3YyLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KKzxhIGhyZWY9ImNsYXNzdWRkaTJfX19faWRlbnRpZmllcl9iYWctbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c3RkOjp2ZWN0b3ImbHQ7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19rZXllZF9yZWZlcmVuY2UuaHRtbCI+dWRkaTJfX2tleWVkUmVmZXJlbmNlPC9hPiAqICZndDsmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19pZGVudGlmaWVyX2JhZy5odG1sI28wIj5rZXllZFJlZmVyZW5jZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VmVjdG9yIG9mIHVkZGkyX19rZXllZFJlZmVyZW5jZSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiAgPGEgaHJlZj0iI28wIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2lkZW50aWZpZXJfYmFnLmh0bWwjbzEiPnNvYXA8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19pZGVudGlmaWVyX2JhZy5odG1sI28xIj5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJpZGVudGlmaWVyQmFnIi4gDQorPHA+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0idWRkaTJfX2lkZW50aWZpZXJCYWc6OmtleWVkUmVmZXJlbmNlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0ZDo6dmVjdG9yJmx0OzxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19rZXllZF9yZWZlcmVuY2UuaHRtbCI+dWRkaTJfX2tleWVkUmVmZXJlbmNlPC9hPiogJmd0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19faWRlbnRpZmllcl9iYWcuaHRtbCNvMCI+dWRkaTJfX2lkZW50aWZpZXJCYWc6OmtleWVkUmVmZXJlbmNlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1ZlY3RvciBvZiB1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9InVkZGkyX19pZGVudGlmaWVyQmFnOjpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19faWRlbnRpZmllcl9iYWcuaHRtbCNvMSI+c29hcDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19pZGVudGlmaWVyX2JhZy5odG1sI28xIj51ZGRpMl9faWRlbnRpZmllckJhZzo6c29hcDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvdWRkaTIvPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sIj51ZGRpX3YyLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNjo1OSAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2luc3RhbmNlX2RldGFpbHMtbWVtYmVycy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19pbnN0YW5jZV9kZXRhaWxzLW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjg0NzNhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19pbnN0YW5jZV9kZXRhaWxzLW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDE3IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9faW5zdGFuY2VEZXRhaWxzIE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19pbnN0YW5jZV9kZXRhaWxzLmh0bWwiPnVkZGkyX19pbnN0YW5jZURldGFpbHM8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19pbnN0YW5jZV9kZXRhaWxzLmh0bWwjbzAiPmRlc2NyaXB0aW9uPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19pbnN0YW5jZV9kZXRhaWxzLmh0bWwiPnVkZGkyX19pbnN0YW5jZURldGFpbHM8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2luc3RhbmNlX2RldGFpbHMuaHRtbCNvMiI+aW5zdGFuY2VQYXJtczwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19faW5zdGFuY2VfZGV0YWlscy5odG1sIj51ZGRpMl9faW5zdGFuY2VEZXRhaWxzPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19pbnN0YW5jZV9kZXRhaWxzLmh0bWwjbzEiPm92ZXJ2aWV3RG9jPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19pbnN0YW5jZV9kZXRhaWxzLmh0bWwiPnVkZGkyX19pbnN0YW5jZURldGFpbHM8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2luc3RhbmNlX2RldGFpbHMuaHRtbCNvMyI+c29hcDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19faW5zdGFuY2VfZGV0YWlscy5odG1sIj51ZGRpMl9faW5zdGFuY2VEZXRhaWxzPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU5IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19faW5zdGFuY2VfZGV0YWlscy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19pbnN0YW5jZV9kZXRhaWxzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY4ODQyYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19faW5zdGFuY2VfZGV0YWlscy5odG1sCkBAIC0wLDAgKzEsMTM5IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiB1ZGRpMl9faW5zdGFuY2VEZXRhaWxzIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9faW5zdGFuY2VEZXRhaWxzIENsYXNzIFJlZmVyZW5jZTwvaDE+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6Imluc3RhbmNlRGV0YWlscyIuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3VkZGlfdjIuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19pbnN0YW5jZV9kZXRhaWxzLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVzY3JpcHRpb24uaHRtbCI+dWRkaTJfX2Rlc2NyaXB0aW9uPC9hPiAqICZndDsmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19pbnN0YW5jZV9kZXRhaWxzLmh0bWwjbzAiPmRlc2NyaXB0aW9uPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5WZWN0b3Igb2YgdWRkaTJfX2Rlc2NyaXB0aW9uKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQuICA8YSBocmVmPSIjbzAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fb3ZlcnZpZXdfZG9jLmh0bWwiPnVkZGkyX19vdmVydmlld0RvYzwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2luc3RhbmNlX2RldGFpbHMuaHRtbCNvMSI+b3ZlcnZpZXdEb2M8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpvdmVydmlld0RvYy4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2luc3RhbmNlX2RldGFpbHMuaHRtbCNvMiI+aW5zdGFuY2VQYXJtczwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+RWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmluc3RhbmNlUGFybXMuICA8YSBocmVmPSIjbzIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19faW5zdGFuY2VfZGV0YWlscy5odG1sI28zIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19faW5zdGFuY2VfZGV0YWlscy5odG1sI28zIj5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvMyI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJpbnN0YW5jZURldGFpbHMiLiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJ1ZGRpMl9faW5zdGFuY2VEZXRhaWxzOjpkZXNjcmlwdGlvbiIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdGQ6OnZlY3RvciZsdDs8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVzY3JpcHRpb24uaHRtbCI+dWRkaTJfX2Rlc2NyaXB0aW9uPC9hPiogJmd0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19faW5zdGFuY2VfZGV0YWlscy5odG1sI28wIj51ZGRpMl9faW5zdGFuY2VEZXRhaWxzOjpkZXNjcmlwdGlvbjwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitWZWN0b3Igb2YgdWRkaTJfX2Rlc2NyaXB0aW9uKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJ1ZGRpMl9faW5zdGFuY2VEZXRhaWxzOjppbnN0YW5jZVBhcm1zIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19pbnN0YW5jZV9kZXRhaWxzLmh0bWwjbzIiPnVkZGkyX19pbnN0YW5jZURldGFpbHM6Omluc3RhbmNlUGFybXM8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmluc3RhbmNlUGFybXMuIA0KKzxwPg0KK09wdGlvbmFsIGVsZW1lbnQgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9InVkZGkyX19pbnN0YW5jZURldGFpbHM6Om92ZXJ2aWV3RG9jIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19vdmVydmlld19kb2MuaHRtbCI+dWRkaTJfX292ZXJ2aWV3RG9jPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2luc3RhbmNlX2RldGFpbHMuaHRtbCNvMSI+dWRkaTJfX2luc3RhbmNlRGV0YWlsczo6b3ZlcnZpZXdEb2M8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOm92ZXJ2aWV3RG9jLiANCis8cD4NCitPcHRpb25hbCBlbGVtZW50ICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8zIiBkb3h5dGFnPSJ1ZGRpMl9faW5zdGFuY2VEZXRhaWxzOjpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19faW5zdGFuY2VfZGV0YWlscy5odG1sI28zIj5zb2FwPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2luc3RhbmNlX2RldGFpbHMuaHRtbCNvMyI+dWRkaTJfX2luc3RhbmNlRGV0YWlsczo6c29hcDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvdWRkaTIvPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sIj51ZGRpX3YyLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNjo1OSAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2tleWVkX3JlZmVyZW5jZS1tZW1iZXJzLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2tleWVkX3JlZmVyZW5jZS1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJjMzIzNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fa2V5ZWRfcmVmZXJlbmNlLW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDE3IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fa2V5ZWRSZWZlcmVuY2UgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2tleWVkX3JlZmVyZW5jZS5odG1sIj51ZGRpMl9fa2V5ZWRSZWZlcmVuY2U8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19rZXllZF9yZWZlcmVuY2UuaHRtbCNvMSI+a2V5TmFtZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fa2V5ZWRfcmVmZXJlbmNlLmh0bWwiPnVkZGkyX19rZXllZFJlZmVyZW5jZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fa2V5ZWRfcmVmZXJlbmNlLmh0bWwjbzIiPmtleVZhbHVlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19rZXllZF9yZWZlcmVuY2UuaHRtbCI+dWRkaTJfX2tleWVkUmVmZXJlbmNlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19rZXllZF9yZWZlcmVuY2UuaHRtbCNvMyI+c29hcDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fa2V5ZWRfcmVmZXJlbmNlLmh0bWwiPnVkZGkyX19rZXllZFJlZmVyZW5jZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fa2V5ZWRfcmVmZXJlbmNlLmh0bWwjbzAiPnRNb2RlbEtleTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fa2V5ZWRfcmVmZXJlbmNlLmh0bWwiPnVkZGkyX19rZXllZFJlZmVyZW5jZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNjo1OSAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2tleWVkX3JlZmVyZW5jZS5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19rZXllZF9yZWZlcmVuY2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTdkYmUzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19rZXllZF9yZWZlcmVuY2UuaHRtbApAQCAtMCwwICsxLDEzOSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogdWRkaTJfX2tleWVkUmVmZXJlbmNlIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fa2V5ZWRSZWZlcmVuY2UgQ2xhc3MgUmVmZXJlbmNlPC9oMT5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92Mjoia2V5ZWRSZWZlcmVuY2UiLiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KKzxjb2RlPiNpbmNsdWRlICZsdDt1ZGRpX3YyLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KKzxhIGhyZWY9ImNsYXNzdWRkaTJfX19fa2V5ZWRfcmVmZXJlbmNlLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNSI+dWRkaTJfX3RNb2RlbEtleTwvYT4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19rZXllZF9yZWZlcmVuY2UuaHRtbCNvMCI+dE1vZGVsS2V5PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgdE1vZGVsS2V5IG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRNb2RlbEtleS4gIDxhIGhyZWY9IiNvMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2tleWVkX3JlZmVyZW5jZS5odG1sI28xIj5rZXlOYW1lPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUga2V5TmFtZSBvZiB0eXBlIHhzOnN0cmluZy4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2tleWVkX3JlZmVyZW5jZS5odG1sI28yIj5rZXlWYWx1ZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIGtleVZhbHVlIG9mIHR5cGUgeHM6c3RyaW5nLiAgPGEgaHJlZj0iI28yIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2tleWVkX3JlZmVyZW5jZS5odG1sI28zIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fa2V5ZWRfcmVmZXJlbmNlLmh0bWwjbzMiPnNvYXA8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiAgPGEgaHJlZj0iI28zIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzxocj48YSBuYW1lPSJfZGV0YWlscyI+PC9hPjxoMj5EZXRhaWxlZCBEZXNjcmlwdGlvbjwvaDI+DQorU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImtleWVkUmVmZXJlbmNlIi4gDQorPHA+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0idWRkaTJfX2tleWVkUmVmZXJlbmNlOjprZXlOYW1lIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19rZXllZF9yZWZlcmVuY2UuaHRtbCNvMSI+dWRkaTJfX2tleWVkUmVmZXJlbmNlOjprZXlOYW1lPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSBrZXlOYW1lIG9mIHR5cGUgeHM6c3RyaW5nLiANCis8cD4NCitPcHRpb25hbCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9InVkZGkyX19rZXllZFJlZmVyZW5jZTo6a2V5VmFsdWUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2tleWVkX3JlZmVyZW5jZS5odG1sI28yIj51ZGRpMl9fa2V5ZWRSZWZlcmVuY2U6OmtleVZhbHVlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSBrZXlWYWx1ZSBvZiB0eXBlIHhzOnN0cmluZy4gDQorPHA+DQorUmVxdWlyZWQgYXR0cmlidXRlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8zIiBkb3h5dGFnPSJ1ZGRpMl9fa2V5ZWRSZWZlcmVuY2U6OnNvYXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19rZXllZF9yZWZlcmVuY2UuaHRtbCNvMyI+c29hcDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19rZXllZF9yZWZlcmVuY2UuaHRtbCNvMyI+dWRkaTJfX2tleWVkUmVmZXJlbmNlOjpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0idWRkaTJfX2tleWVkUmVmZXJlbmNlOjp0TW9kZWxLZXkiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E1Ij51ZGRpMl9fdE1vZGVsS2V5PC9hPiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fa2V5ZWRfcmVmZXJlbmNlLmh0bWwjbzAiPnVkZGkyX19rZXllZFJlZmVyZW5jZTo6dE1vZGVsS2V5PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSB0TW9kZWxLZXkgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dE1vZGVsS2V5LiANCis8cD4NCitPcHRpb25hbCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvdWRkaTIvPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sIj51ZGRpX3YyLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNjo1OSAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2tleXNfb3duZWQtbWVtYmVycy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19rZXlzX293bmVkLW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmNlYTk1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19rZXlzX293bmVkLW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDE2IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fa2V5c093bmVkIE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19rZXlzX293bmVkLmh0bWwiPnVkZGkyX19rZXlzT3duZWQ8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19rZXlzX293bmVkLmh0bWwjbzAiPmZyb21LZXk8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2tleXNfb3duZWQuaHRtbCI+dWRkaTJfX2tleXNPd25lZDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fa2V5c19vd25lZC5odG1sI28yIj5zb2FwPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19rZXlzX293bmVkLmh0bWwiPnVkZGkyX19rZXlzT3duZWQ8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2tleXNfb3duZWQuaHRtbCNvMSI+dG9LZXk8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2tleXNfb3duZWQuaHRtbCI+dWRkaTJfX2tleXNPd25lZDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNjo1OSAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2tleXNfb3duZWQuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fa2V5c19vd25lZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNzg4NmEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX2tleXNfb3duZWQuaHRtbApAQCAtMCwwICsxLDExMSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogdWRkaTJfX2tleXNPd25lZCBDbGFzcyBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX2tleXNPd25lZCBDbGFzcyBSZWZlcmVuY2U8L2gxPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJrZXlzT3duZWQiLiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KKzxjb2RlPiNpbmNsdWRlICZsdDt1ZGRpX3YyLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KKzxhIGhyZWY9ImNsYXNzdWRkaTJfX19fa2V5c19vd25lZC1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgQXR0cmlidXRlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTMiPnVkZGkyX19idXNpbmVzc0tleTwvYT4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19rZXlzX293bmVkLmh0bWwjbzAiPmZyb21LZXk8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpmcm9tS2V5LiAgPGEgaHJlZj0iI28wIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EzIj51ZGRpMl9fYnVzaW5lc3NLZXk8L2E+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fa2V5c19vd25lZC5odG1sI28xIj50b0tleTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+RWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRvS2V5LiAgPGEgaHJlZj0iI28xIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2tleXNfb3duZWQuaHRtbCNvMiI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2tleXNfb3duZWQuaHRtbCNvMiI+c29hcDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuICA8YSBocmVmPSIjbzIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzwvdGFibGU+DQorPGhyPjxhIG5hbWU9Il9kZXRhaWxzIj48L2E+PGgyPkRldGFpbGVkIERlc2NyaXB0aW9uPC9oMj4NCitTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92Mjoia2V5c093bmVkIi4gDQorPHA+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0idWRkaTJfX2tleXNPd25lZDo6ZnJvbUtleSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTMiPnVkZGkyX19idXNpbmVzc0tleTwvYT4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2tleXNfb3duZWQuaHRtbCNvMCI+dWRkaTJfX2tleXNPd25lZDo6ZnJvbUtleTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6ZnJvbUtleS4gDQorPHA+DQorT3B0aW9uYWwgZWxlbWVudCAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMiIgZG94eXRhZz0idWRkaTJfX2tleXNPd25lZDo6c29hcCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2tleXNfb3duZWQuaHRtbCNvMiI+c29hcDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19rZXlzX293bmVkLmh0bWwjbzIiPnVkZGkyX19rZXlzT3duZWQ6OnNvYXA8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJ1ZGRpMl9fa2V5c093bmVkOjp0b0tleSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTMiPnVkZGkyX19idXNpbmVzc0tleTwvYT4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2tleXNfb3duZWQuaHRtbCNvMSI+dWRkaTJfX2tleXNPd25lZDo6dG9LZXk8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRvS2V5LiANCis8cD4NCitPcHRpb25hbCBlbGVtZW50ICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3VkZGkyLzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCI+dWRkaV92Mi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTkgMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19uYW1lLW1lbWJlcnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fbmFtZS1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYxMGJmNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fbmFtZS1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwxNiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX25hbWUgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX25hbWUuaHRtbCI+dWRkaTJfX25hbWU8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19uYW1lLmh0bWwjbzAiPl9faXRlbTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fbmFtZS5odG1sIj51ZGRpMl9fbmFtZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fbmFtZS5odG1sI28yIj5zb2FwPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19uYW1lLmh0bWwiPnVkZGkyX19uYW1lPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19uYW1lLmh0bWwjbzEiPnhtbF9fbGFuZ188L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX25hbWUuaHRtbCI+dWRkaTJfX25hbWU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTkgMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19uYW1lLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX25hbWUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmU1YjVlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19uYW1lLmh0bWwKQEAgLTAsMCArMSwxMDggQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IHVkZGkyX19uYW1lIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fbmFtZSBDbGFzcyBSZWZlcmVuY2U8L2gxPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJuYW1lIi4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7dWRkaV92Mi5oJmd0OzwvY29kZT4NCis8cD4NCis8YSBocmVmPSJjbGFzc3VkZGkyX19fX25hbWUtbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fbmFtZS5odG1sI28wIj5fX2l0ZW08L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTEiPnhtbF9fbGFuZzwvYT4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19uYW1lLmh0bWwjbzEiPnhtbF9fbGFuZ188L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkF0dHJpYnV0ZSByZWZlcmVuY2UgeG1sOmxhbmcuICA8YSBocmVmPSIjbzEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fbmFtZS5odG1sI28yIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fbmFtZS5odG1sI28yIj5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvMiI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJuYW1lIi4gDQorPHA+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0idWRkaTJfX25hbWU6Ol9faXRlbSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fbmFtZS5odG1sI28wIj51ZGRpMl9fbmFtZTo6X19pdGVtPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJ1ZGRpMl9fbmFtZTo6c29hcCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX25hbWUuaHRtbCNvMiI+c29hcDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19uYW1lLmh0bWwjbzIiPnVkZGkyX19uYW1lOjpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0idWRkaTJfX25hbWU6OnhtbF9fbGFuZ18iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2ExIj54bWxfX2xhbmc8L2E+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19uYW1lLmh0bWwjbzEiPnVkZGkyX19uYW1lOjp4bWxfX2xhbmdfPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSByZWZlcmVuY2UgeG1sOmxhbmcuIA0KKzxwPg0KK09wdGlvbmFsIGF0dHJpYnV0ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU5IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fb3ZlcnZpZXdfZG9jLW1lbWJlcnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fb3ZlcnZpZXdfZG9jLW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2M3ZDBiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19vdmVydmlld19kb2MtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTYgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19vdmVydmlld0RvYyBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fb3ZlcnZpZXdfZG9jLmh0bWwiPnVkZGkyX19vdmVydmlld0RvYzwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX292ZXJ2aWV3X2RvYy5odG1sI28wIj5kZXNjcmlwdGlvbjwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fb3ZlcnZpZXdfZG9jLmh0bWwiPnVkZGkyX19vdmVydmlld0RvYzwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fb3ZlcnZpZXdfZG9jLmh0bWwjbzEiPm92ZXJ2aWV3VVJMPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19vdmVydmlld19kb2MuaHRtbCI+dWRkaTJfX292ZXJ2aWV3RG9jPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19vdmVydmlld19kb2MuaHRtbCNvMiI+c29hcDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fb3ZlcnZpZXdfZG9jLmh0bWwiPnVkZGkyX19vdmVydmlld0RvYzwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNjo1OSAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX292ZXJ2aWV3X2RvYy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19vdmVydmlld19kb2MuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGFiNjM4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19vdmVydmlld19kb2MuaHRtbApAQCAtMCwwICsxLDExMSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogdWRkaTJfX292ZXJ2aWV3RG9jIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fb3ZlcnZpZXdEb2MgQ2xhc3MgUmVmZXJlbmNlPC9oMT5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92Mjoib3ZlcnZpZXdEb2MiLiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KKzxjb2RlPiNpbmNsdWRlICZsdDt1ZGRpX3YyLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KKzxhIGhyZWY9ImNsYXNzdWRkaTJfX19fb3ZlcnZpZXdfZG9jLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVzY3JpcHRpb24uaHRtbCI+dWRkaTJfX2Rlc2NyaXB0aW9uPC9hPiAqICZndDsmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19vdmVydmlld19kb2MuaHRtbCNvMCI+ZGVzY3JpcHRpb248L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlZlY3RvciBvZiB1ZGRpMl9fZGVzY3JpcHRpb24qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gIDxhIGhyZWY9IiNvMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX292ZXJ2aWV3X2RvYy5odG1sI28xIj5vdmVydmlld1VSTDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+RWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOm92ZXJ2aWV3VVJMLiAgPGEgaHJlZj0iI28xIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX292ZXJ2aWV3X2RvYy5odG1sI28yIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fb3ZlcnZpZXdfZG9jLmh0bWwjbzIiPnNvYXA8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiAgPGEgaHJlZj0iI28yIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzxocj48YSBuYW1lPSJfZGV0YWlscyI+PC9hPjxoMj5EZXRhaWxlZCBEZXNjcmlwdGlvbjwvaDI+DQorU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6Im92ZXJ2aWV3RG9jIi4gDQorPHA+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0idWRkaTJfX292ZXJ2aWV3RG9jOjpkZXNjcmlwdGlvbiIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdGQ6OnZlY3RvciZsdDs8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVzY3JpcHRpb24uaHRtbCI+dWRkaTJfX2Rlc2NyaXB0aW9uPC9hPiogJmd0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fb3ZlcnZpZXdfZG9jLmh0bWwjbzAiPnVkZGkyX19vdmVydmlld0RvYzo6ZGVzY3JpcHRpb248L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVmVjdG9yIG9mIHVkZGkyX19kZXNjcmlwdGlvbiogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0idWRkaTJfX292ZXJ2aWV3RG9jOjpvdmVydmlld1VSTCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fb3ZlcnZpZXdfZG9jLmh0bWwjbzEiPnVkZGkyX19vdmVydmlld0RvYzo6b3ZlcnZpZXdVUkw8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOm92ZXJ2aWV3VVJMLiANCis8cD4NCitPcHRpb25hbCBlbGVtZW50ICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJ1ZGRpMl9fb3ZlcnZpZXdEb2M6OnNvYXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19vdmVydmlld19kb2MuaHRtbCNvMiI+c29hcDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19vdmVydmlld19kb2MuaHRtbCNvMiI+dWRkaTJfX292ZXJ2aWV3RG9jOjpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU5IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fcGhvbmUtbWVtYmVycy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19waG9uZS1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJhZTU3YgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fcGhvbmUtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTYgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19waG9uZSBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcGhvbmUuaHRtbCI+dWRkaTJfX3Bob25lPC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcGhvbmUuaHRtbCNvMCI+X19pdGVtPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19waG9uZS5odG1sIj51ZGRpMl9fcGhvbmU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3Bob25lLmh0bWwjbzIiPnNvYXA8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3Bob25lLmh0bWwiPnVkZGkyX19waG9uZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcGhvbmUuaHRtbCNvMSI+dXNlVHlwZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcGhvbmUuaHRtbCI+dWRkaTJfX3Bob25lPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU5IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fcGhvbmUuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fcGhvbmUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjcxZjE3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19waG9uZS5odG1sCkBAIC0wLDAgKzEsMTA4IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiB1ZGRpMl9fcGhvbmUgQ2xhc3MgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19waG9uZSBDbGFzcyBSZWZlcmVuY2U8L2gxPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJwaG9uZSIuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3VkZGlfdjIuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19waG9uZS1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgQXR0cmlidXRlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19waG9uZS5odG1sI28wIj5fX2l0ZW08L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19waG9uZS5odG1sI28xIj51c2VUeXBlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgdXNlVHlwZSBvZiB0eXBlIHhzOnN0cmluZy4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19waG9uZS5odG1sI28yIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcGhvbmUuaHRtbCNvMiI+c29hcDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuICA8YSBocmVmPSIjbzIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzwvdGFibGU+DQorPGhyPjxhIG5hbWU9Il9kZXRhaWxzIj48L2E+PGgyPkRldGFpbGVkIERlc2NyaXB0aW9uPC9oMj4NCitTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoicGhvbmUiLiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJ1ZGRpMl9fcGhvbmU6Ol9faXRlbSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcGhvbmUuaHRtbCNvMCI+dWRkaTJfX3Bob25lOjpfX2l0ZW08L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9InVkZGkyX19waG9uZTo6c29hcCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3Bob25lLmh0bWwjbzIiPnNvYXA8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcGhvbmUuaHRtbCNvMiI+dWRkaTJfX3Bob25lOjpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0idWRkaTJfX3Bob25lOjp1c2VUeXBlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19waG9uZS5odG1sI28xIj51ZGRpMl9fcGhvbmU6OnVzZVR5cGU8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIHVzZVR5cGUgb2YgdHlwZSB4czpzdHJpbmcuIA0KKzxwPg0KK09wdGlvbmFsIGF0dHJpYnV0ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU5IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbi1tZW1iZXJzLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb24tbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYTZiODkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb24tbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTcgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24gTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb24uaHRtbCI+dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbjwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb24uaHRtbCNvMCI+ZnJvbUtleTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbi5odG1sIj51ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19wdWJsaXNoZXJfYXNzZXJ0aW9uLmh0bWwjbzIiPmtleWVkUmVmZXJlbmNlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19wdWJsaXNoZXJfYXNzZXJ0aW9uLmh0bWwiPnVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb248L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb24uaHRtbCNvMyI+c29hcDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbi5odG1sIj51ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19wdWJsaXNoZXJfYXNzZXJ0aW9uLmh0bWwjbzEiPnRvS2V5PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19wdWJsaXNoZXJfYXNzZXJ0aW9uLmh0bWwiPnVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb248L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTkgMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19wdWJsaXNoZXJfYXNzZXJ0aW9uLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb24uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmM1ZWFhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19wdWJsaXNoZXJfYXNzZXJ0aW9uLmh0bWwKQEAgLTAsMCArMSwxMzkgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24gQ2xhc3MgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24gQ2xhc3MgUmVmZXJlbmNlPC9oMT5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoicHVibGlzaGVyQXNzZXJ0aW9uIi4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7dWRkaV92Mi5oJmd0OzwvY29kZT4NCis8cD4NCis8YSBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb24tbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EzIj51ZGRpMl9fYnVzaW5lc3NLZXk8L2E+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbi5odG1sI28wIj5mcm9tS2V5PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5FbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6ZnJvbUtleS4gIDxhIGhyZWY9IiNvMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMyI+dWRkaTJfX2J1c2luZXNzS2V5PC9hPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb24uaHRtbCNvMSI+dG9LZXk8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0b0tleS4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19rZXllZF9yZWZlcmVuY2UuaHRtbCI+dWRkaTJfX2tleWVkUmVmZXJlbmNlPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbi5odG1sI28yIj5rZXllZFJlZmVyZW5jZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+RWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmtleWVkUmVmZXJlbmNlLiAgPGEgaHJlZj0iI28yIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb24uaHRtbCNvMyI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb24uaHRtbCNvMyI+c29hcDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuICA8YSBocmVmPSIjbzMiPjwvYT48YnI+PC90ZD48L3RyPg0KKzwvdGFibGU+DQorPGhyPjxhIG5hbWU9Il9kZXRhaWxzIj48L2E+PGgyPkRldGFpbGVkIERlc2NyaXB0aW9uPC9oMj4NCitTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoicHVibGlzaGVyQXNzZXJ0aW9uIi4gDQorPHA+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0idWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbjo6ZnJvbUtleSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTMiPnVkZGkyX19idXNpbmVzc0tleTwvYT4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb24uaHRtbCNvMCI+dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbjo6ZnJvbUtleTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6ZnJvbUtleS4gDQorPHA+DQorUmVxdWlyZWQgZWxlbWVudCAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMiIgZG94eXRhZz0idWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbjo6a2V5ZWRSZWZlcmVuY2UiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2tleWVkX3JlZmVyZW5jZS5odG1sIj51ZGRpMl9fa2V5ZWRSZWZlcmVuY2U8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbi5odG1sI28yIj51ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uOjprZXllZFJlZmVyZW5jZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6a2V5ZWRSZWZlcmVuY2UuIA0KKzxwPg0KK1JlcXVpcmVkIGVsZW1lbnQgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzMiIGRveHl0YWc9InVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb246OnNvYXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19wdWJsaXNoZXJfYXNzZXJ0aW9uLmh0bWwjbzMiPnNvYXA8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbi5odG1sI28zIj51ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uOjpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0idWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbjo6dG9LZXkiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EzIj51ZGRpMl9fYnVzaW5lc3NLZXk8L2E+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19wdWJsaXNoZXJfYXNzZXJ0aW9uLmh0bWwjbzEiPnVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb246OnRvS2V5PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0VsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0b0tleS4gDQorPHA+DQorUmVxdWlyZWQgZWxlbWVudCAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU5IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbnMtbWVtYmVycy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19wdWJsaXNoZXJfYXNzZXJ0aW9ucy1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYyZTJkNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbnMtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTggQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zIE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19wdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sIj51ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uczwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzMiPmF1dGhvcml6ZWROYW1lPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19wdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sIj51ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uczwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMSI+Z2VuZXJpYzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCI+dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnM8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzIiPm9wZXJhdG9yXzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCI+dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnM8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzAiPnB1Ymxpc2hlckFzc2VydGlvbjwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCI+dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnM8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzQiPnNvYXA8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwiPnVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE3OjAwIDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmZiODRhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19wdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sCkBAIC0wLDAgKzEsMTY3IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9ucyBDbGFzcyBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMgQ2xhc3MgUmVmZXJlbmNlPC9oMT5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoicHVibGlzaGVyQXNzZXJ0aW9ucyIuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3VkZGlfdjIuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19wdWJsaXNoZXJfYXNzZXJ0aW9ucy1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgQXR0cmlidXRlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zdGQ6OnZlY3RvciZsdDsgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb24uaHRtbCI+dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbjwvYT4gKiAmZ3Q7Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMCI+cHVibGlzaGVyQXNzZXJ0aW9uPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5WZWN0b3Igb2YgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbiogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiAgPGEgaHJlZj0iI28wIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMSI+Z2VuZXJpYzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcuICA8YSBocmVmPSIjbzEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19wdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28yIj5vcGVyYXRvcl88L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkF0dHJpYnV0ZSBvcGVyYXRvciBvZiB0eXBlIHhzOnN0cmluZy4gIDxhIGhyZWY9IiNvMiI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzMiPmF1dGhvcml6ZWROYW1lPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgYXV0aG9yaXplZE5hbWUgb2YgdHlwZSB4czpzdHJpbmcuICA8YSBocmVmPSIjbzMiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvNCI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzQiPnNvYXA8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiAgPGEgaHJlZj0iI280Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzxocj48YSBuYW1lPSJfZGV0YWlscyI+PC9hPjxoMj5EZXRhaWxlZCBEZXNjcmlwdGlvbjwvaDI+DQorU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InB1Ymxpc2hlckFzc2VydGlvbnMiLiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8zIiBkb3h5dGFnPSJ1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uczo6YXV0aG9yaXplZE5hbWUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzMiPnVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zOjphdXRob3JpemVkTmFtZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgYXV0aG9yaXplZE5hbWUgb2YgdHlwZSB4czpzdHJpbmcuIA0KKzxwPg0KK1JlcXVpcmVkIGF0dHJpYnV0ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0idWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnM6OmdlbmVyaWMiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzEiPnVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zOjpnZW5lcmljPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nLiANCis8cD4NCitSZXF1aXJlZCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9InVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zOjpvcGVyYXRvcl8iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzIiPnVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zOjpvcGVyYXRvcl88L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIG9wZXJhdG9yIG9mIHR5cGUgeHM6c3RyaW5nLiANCis8cD4NCitSZXF1aXJlZCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zOjpwdWJsaXNoZXJBc3NlcnRpb24iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RkOjp2ZWN0b3ImbHQ7PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb24uaHRtbCI+dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbjwvYT4qJmd0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMCI+dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnM6OnB1Ymxpc2hlckFzc2VydGlvbjwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitWZWN0b3Igb2YgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbiogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNCIgZG94eXRhZz0idWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnM6OnNvYXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19wdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI280Ij5zb2FwPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzQiPnVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zOjpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE3OjAwIDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fcmVnaXN0ZXJlZF9pbmZvLW1lbWJlcnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fcmVnaXN0ZXJlZF9pbmZvLW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDA4YjMxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19yZWdpc3RlcmVkX2luZm8tbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTkgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19yZWdpc3RlcmVkSW5mbyBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVnaXN0ZXJlZF9pbmZvLmh0bWwiPnVkZGkyX19yZWdpc3RlcmVkSW5mbzwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlZ2lzdGVyZWRfaW5mby5odG1sI28wIj5idXNpbmVzc0luZm9zPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWdpc3RlcmVkX2luZm8uaHRtbCI+dWRkaTJfX3JlZ2lzdGVyZWRJbmZvPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWdpc3RlcmVkX2luZm8uaHRtbCNvMiI+Z2VuZXJpYzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVnaXN0ZXJlZF9pbmZvLmh0bWwiPnVkZGkyX19yZWdpc3RlcmVkSW5mbzwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVnaXN0ZXJlZF9pbmZvLmh0bWwjbzMiPm9wZXJhdG9yXzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVnaXN0ZXJlZF9pbmZvLmh0bWwiPnVkZGkyX19yZWdpc3RlcmVkSW5mbzwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVnaXN0ZXJlZF9pbmZvLmh0bWwjbzUiPnNvYXA8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlZ2lzdGVyZWRfaW5mby5odG1sIj51ZGRpMl9fcmVnaXN0ZXJlZEluZm88L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlZ2lzdGVyZWRfaW5mby5odG1sI28xIj50TW9kZWxJbmZvczwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVnaXN0ZXJlZF9pbmZvLmh0bWwiPnVkZGkyX19yZWdpc3RlcmVkSW5mbzwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVnaXN0ZXJlZF9pbmZvLmh0bWwjbzQiPnRydW5jYXRlZDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVnaXN0ZXJlZF9pbmZvLmh0bWwiPnVkZGkyX19yZWdpc3RlcmVkSW5mbzwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNzowMCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3JlZ2lzdGVyZWRfaW5mby5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19yZWdpc3RlcmVkX2luZm8uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjQ3NzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19yZWdpc3RlcmVkX2luZm8uaHRtbApAQCAtMCwwICsxLDE5NSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogdWRkaTJfX3JlZ2lzdGVyZWRJbmZvIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fcmVnaXN0ZXJlZEluZm8gQ2xhc3MgUmVmZXJlbmNlPC9oMT5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoicmVnaXN0ZXJlZEluZm8iLiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KKzxjb2RlPiNpbmNsdWRlICZsdDt1ZGRpX3YyLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KKzxhIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVnaXN0ZXJlZF9pbmZvLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19pbmZvcy5odG1sIj51ZGRpMl9fYnVzaW5lc3NJbmZvczwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlZ2lzdGVyZWRfaW5mby5odG1sI28wIj5idXNpbmVzc0luZm9zPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5FbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YnVzaW5lc3NJbmZvcy4gIDxhIGhyZWY9IiNvMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luZm9zLmh0bWwiPnVkZGkyX190TW9kZWxJbmZvczwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlZ2lzdGVyZWRfaW5mby5odG1sI28xIj50TW9kZWxJbmZvczwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+RWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRNb2RlbEluZm9zLiAgPGEgaHJlZj0iI28xIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVnaXN0ZXJlZF9pbmZvLmh0bWwjbzIiPmdlbmVyaWM8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nLiAgPGEgaHJlZj0iI28yIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVnaXN0ZXJlZF9pbmZvLmh0bWwjbzMiPm9wZXJhdG9yXzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIG9wZXJhdG9yIG9mIHR5cGUgeHM6c3RyaW5nLiAgPGEgaHJlZj0iI28zIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+ZW51bSA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQ4Ij51ZGRpMl9fdHJ1bmNhdGVkPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVnaXN0ZXJlZF9pbmZvLmh0bWwjbzQiPnRydW5jYXRlZDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIHRydW5jYXRlZCBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0cnVuY2F0ZWQuICA8YSBocmVmPSIjbzQiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVnaXN0ZXJlZF9pbmZvLmh0bWwjbzUiPnNvYXA8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWdpc3RlcmVkX2luZm8uaHRtbCNvNSI+c29hcDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuICA8YSBocmVmPSIjbzUiPjwvYT48YnI+PC90ZD48L3RyPg0KKzwvdGFibGU+DQorPGhyPjxhIG5hbWU9Il9kZXRhaWxzIj48L2E+PGgyPkRldGFpbGVkIERlc2NyaXB0aW9uPC9oMj4NCitTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoicmVnaXN0ZXJlZEluZm8iLiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJ1ZGRpMl9fcmVnaXN0ZXJlZEluZm86OmJ1c2luZXNzSW5mb3MiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2luZm9zLmh0bWwiPnVkZGkyX19idXNpbmVzc0luZm9zPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlZ2lzdGVyZWRfaW5mby5odG1sI28wIj51ZGRpMl9fcmVnaXN0ZXJlZEluZm86OmJ1c2luZXNzSW5mb3M8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmJ1c2luZXNzSW5mb3MuIA0KKzxwPg0KK1JlcXVpcmVkIGVsZW1lbnQgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9InVkZGkyX19yZWdpc3RlcmVkSW5mbzo6Z2VuZXJpYyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVnaXN0ZXJlZF9pbmZvLmh0bWwjbzIiPnVkZGkyX19yZWdpc3RlcmVkSW5mbzo6Z2VuZXJpYzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZy4gDQorPHA+DQorUmVxdWlyZWQgYXR0cmlidXRlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8zIiBkb3h5dGFnPSJ1ZGRpMl9fcmVnaXN0ZXJlZEluZm86Om9wZXJhdG9yXyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVnaXN0ZXJlZF9pbmZvLmh0bWwjbzMiPnVkZGkyX19yZWdpc3RlcmVkSW5mbzo6b3BlcmF0b3JfPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSBvcGVyYXRvciBvZiB0eXBlIHhzOnN0cmluZy4gDQorPHA+DQorUmVxdWlyZWQgYXR0cmlidXRlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im81IiBkb3h5dGFnPSJ1ZGRpMl9fcmVnaXN0ZXJlZEluZm86OnNvYXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWdpc3RlcmVkX2luZm8uaHRtbCNvNSI+c29hcDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWdpc3RlcmVkX2luZm8uaHRtbCNvNSI+dWRkaTJfX3JlZ2lzdGVyZWRJbmZvOjpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0idWRkaTJfX3JlZ2lzdGVyZWRJbmZvOjp0TW9kZWxJbmZvcyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbmZvcy5odG1sIj51ZGRpMl9fdE1vZGVsSW5mb3M8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVnaXN0ZXJlZF9pbmZvLmh0bWwjbzEiPnVkZGkyX19yZWdpc3RlcmVkSW5mbzo6dE1vZGVsSW5mb3M8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRNb2RlbEluZm9zLiANCis8cD4NCitSZXF1aXJlZCBlbGVtZW50ICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im80IiBkb3h5dGFnPSJ1ZGRpMl9fcmVnaXN0ZXJlZEluZm86OnRydW5jYXRlZCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBlbnVtIDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNDgiPnVkZGkyX190cnVuY2F0ZWQ8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVnaXN0ZXJlZF9pbmZvLmh0bWwjbzQiPnVkZGkyX19yZWdpc3RlcmVkSW5mbzo6dHJ1bmNhdGVkPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSB0cnVuY2F0ZWQgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dHJ1bmNhdGVkLiANCis8cD4NCitPcHRpb25hbCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvdWRkaTIvPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sIj51ZGRpX3YyLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNzowMCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3NfaW5mby1tZW1iZXJzLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3NfaW5mby1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM2NjBjYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc19pbmZvLW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDE4IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc19pbmZvLmh0bWwiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvPC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc19pbmZvLmh0bWwjbzAiPmJ1c2luZXNzS2V5PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzX2luZm8uaHRtbCI+dWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm88L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3NfaW5mby5odG1sI28yIj5kZXNjcmlwdGlvbjwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc19pbmZvLmh0bWwiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzX2luZm8uaHRtbCNvMSI+bmFtZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc19pbmZvLmh0bWwiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzX2luZm8uaHRtbCNvMyI+c2hhcmVkUmVsYXRpb25zaGlwczwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc19pbmZvLmh0bWwiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzX2luZm8uaHRtbCNvNCI+c29hcDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc19pbmZvLmh0bWwiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE3OjAwIDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc19pbmZvLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3NfaW5mby5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YTQxNzYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3NfaW5mby5odG1sCkBAIC0wLDAgKzEsMTY3IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyBDbGFzcyBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8gQ2xhc3MgUmVmZXJlbmNlPC9oMT5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoicmVsYXRlZEJ1c2luZXNzSW5mbyIuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3VkZGlfdjIuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzX2luZm8tbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EzIj51ZGRpMl9fYnVzaW5lc3NLZXk8L2E+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc19pbmZvLmh0bWwjbzAiPmJ1c2luZXNzS2V5PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5FbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YnVzaW5lc3NLZXkuICA8YSBocmVmPSIjbzAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zdGQ6OnZlY3RvciZsdDsgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX25hbWUuaHRtbCI+dWRkaTJfX25hbWU8L2E+ICogJmd0OyZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3NfaW5mby5odG1sI28xIj5uYW1lPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5WZWN0b3Igb2YgdWRkaTJfX25hbWUqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVzY3JpcHRpb24uaHRtbCI+dWRkaTJfX2Rlc2NyaXB0aW9uPC9hPiAqICZndDsmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzX2luZm8uaHRtbCNvMiI+ZGVzY3JpcHRpb248L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlZlY3RvciBvZiB1ZGRpMl9fZGVzY3JpcHRpb24qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gIDxhIGhyZWY9IiNvMiI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2hhcmVkX3JlbGF0aW9uc2hpcHMuaHRtbCI+dWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHM8L2E+ICogJmd0OyZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3NfaW5mby5odG1sI28zIj5zaGFyZWRSZWxhdGlvbnNoaXBzPC9hPjoyPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlZlY3RvciBvZiB1ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyogd2l0aCBsZW5ndGggMC4uMi4gIDxhIGhyZWY9IiNvMyI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzX2luZm8uaHRtbCNvNCI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3NfaW5mby5odG1sI280Ij5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvNCI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJyZWxhdGVkQnVzaW5lc3NJbmZvIi4gDQorPHA+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0idWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm86OmJ1c2luZXNzS2V5IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMyI+dWRkaTJfX2J1c2luZXNzS2V5PC9hPiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc19pbmZvLmh0bWwjbzAiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvOjpidXNpbmVzc0tleTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YnVzaW5lc3NLZXkuIA0KKzxwPg0KK1JlcXVpcmVkIGVsZW1lbnQgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9InVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvOjpkZXNjcmlwdGlvbiIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdGQ6OnZlY3RvciZsdDs8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVzY3JpcHRpb24uaHRtbCI+dWRkaTJfX2Rlc2NyaXB0aW9uPC9hPiogJmd0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc19pbmZvLmh0bWwjbzIiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvOjpkZXNjcmlwdGlvbjwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitWZWN0b3Igb2YgdWRkaTJfX2Rlc2NyaXB0aW9uKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJ1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbzo6bmFtZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdGQ6OnZlY3RvciZsdDs8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fbmFtZS5odG1sIj51ZGRpMl9fbmFtZTwvYT4qICZndDsgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3NfaW5mby5odG1sI28xIj51ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbzo6bmFtZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitWZWN0b3Igb2YgdWRkaTJfX25hbWUqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzMiIGRveHl0YWc9InVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvOjpzaGFyZWRSZWxhdGlvbnNoaXBzIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0ZDo6dmVjdG9yJmx0OzxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zaGFyZWRfcmVsYXRpb25zaGlwcy5odG1sIj51ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwczwvYT4qJmd0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc19pbmZvLmh0bWwjbzMiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvOjpzaGFyZWRSZWxhdGlvbnNoaXBzPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1ZlY3RvciBvZiB1ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyogd2l0aCBsZW5ndGggMC4uMi4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzQiIGRveHl0YWc9InVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvOjpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc19pbmZvLmh0bWwjbzQiPnNvYXA8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc19pbmZvLmh0bWwjbzQiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvOjpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE3OjAwIDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc19pbmZvcy1tZW1iZXJzLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3NfaW5mb3MtbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MjI2MGIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3NfaW5mb3MtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvcyBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc19pbmZvcy5odG1sIj51ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mb3M8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzX2luZm9zLmh0bWwjbzAiPnJlbGF0ZWRCdXNpbmVzc0luZm88L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3NfaW5mb3MuaHRtbCI+dWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzX2luZm9zLmh0bWwjbzEiPnNvYXA8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3NfaW5mb3MuaHRtbCI+dWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE3OjAwIDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc19pbmZvcy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzX2luZm9zLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE1YzliZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc19pbmZvcy5odG1sCkBAIC0wLDAgKzEsODMgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IHVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvcyBDbGFzcyBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zIENsYXNzIFJlZmVyZW5jZTwvaDE+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InJlbGF0ZWRCdXNpbmVzc0luZm9zIi4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7dWRkaV92Mi5oJmd0OzwvY29kZT4NCis8cD4NCis8YSBocmVmPSJjbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3NfaW5mb3MtbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c3RkOjp2ZWN0b3ImbHQ7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzX2luZm8uaHRtbCI+dWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm88L2E+ICogJmd0OyZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3NfaW5mb3MuaHRtbCNvMCI+cmVsYXRlZEJ1c2luZXNzSW5mbzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VmVjdG9yIG9mIHVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQuICA8YSBocmVmPSIjbzAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc19pbmZvcy5odG1sI28xIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc19pbmZvcy5odG1sI28xIj5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJyZWxhdGVkQnVzaW5lc3NJbmZvcyIuIA0KKzxwPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvczo6cmVsYXRlZEJ1c2luZXNzSW5mbyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdGQ6OnZlY3RvciZsdDs8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc19pbmZvLmh0bWwiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvPC9hPiomZ3Q7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzX2luZm9zLmh0bWwjbzAiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvczo6cmVsYXRlZEJ1c2luZXNzSW5mbzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitWZWN0b3Igb2YgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9InVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvczo6c29hcCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3NfaW5mb3MuaHRtbCNvMSI+c29hcDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzX2luZm9zLmh0bWwjbzEiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvczo6c29hcDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvdWRkaTIvPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sIj51ZGRpX3YyLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNzowMCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3Nlc19saXN0LW1lbWJlcnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc2VzX2xpc3QtbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOTFiZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3Nlc19saXN0LW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDE5IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0IE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzZXNfbGlzdC5odG1sIj51ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0PC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc2VzX2xpc3QuaHRtbCNvMCI+YnVzaW5lc3NLZXk8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3Nlc19saXN0Lmh0bWwiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3Q8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3Nlc19saXN0Lmh0bWwjbzIiPmdlbmVyaWM8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3Nlc19saXN0Lmh0bWwiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3Q8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3Nlc19saXN0Lmh0bWwjbzMiPm9wZXJhdG9yXzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc2VzX2xpc3QuaHRtbCI+dWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc2VzX2xpc3QuaHRtbCNvMSI+cmVsYXRlZEJ1c2luZXNzSW5mb3M8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3Nlc19saXN0Lmh0bWwiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3Q8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3Nlc19saXN0Lmh0bWwjbzUiPnNvYXA8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3Nlc19saXN0Lmh0bWwiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3Q8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3Nlc19saXN0Lmh0bWwjbzQiPnRydW5jYXRlZDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc2VzX2xpc3QuaHRtbCI+dWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNzowMCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3Nlc19saXN0Lmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3Nlc19saXN0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYwNDAwNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc2VzX2xpc3QuaHRtbApAQCAtMCwwICsxLDE5NSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdCBDbGFzcyBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdCBDbGFzcyBSZWZlcmVuY2U8L2gxPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJyZWxhdGVkQnVzaW5lc3Nlc0xpc3QiLiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KKzxjb2RlPiNpbmNsdWRlICZsdDt1ZGRpX3YyLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KKzxhIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc2VzX2xpc3QtbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EzIj51ZGRpMl9fYnVzaW5lc3NLZXk8L2E+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc2VzX2xpc3QuaHRtbCNvMCI+YnVzaW5lc3NLZXk8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpidXNpbmVzc0tleS4gIDxhIGhyZWY9IiNvMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzX2luZm9zLmh0bWwiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvczwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3Nlc19saXN0Lmh0bWwjbzEiPnJlbGF0ZWRCdXNpbmVzc0luZm9zPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5FbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6cmVsYXRlZEJ1c2luZXNzSW5mb3MuICA8YSBocmVmPSIjbzEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzZXNfbGlzdC5odG1sI28yIj5nZW5lcmljPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZy4gIDxhIGhyZWY9IiNvMiI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3Nlc19saXN0Lmh0bWwjbzMiPm9wZXJhdG9yXzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIG9wZXJhdG9yIG9mIHR5cGUgeHM6c3RyaW5nLiAgPGEgaHJlZj0iI28zIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+ZW51bSA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQ4Ij51ZGRpMl9fdHJ1bmNhdGVkPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc2VzX2xpc3QuaHRtbCNvNCI+dHJ1bmNhdGVkPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgdHJ1bmNhdGVkIG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRydW5jYXRlZC4gIDxhIGhyZWY9IiNvNCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzZXNfbGlzdC5odG1sI281Ij5zb2FwPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc2VzX2xpc3QuaHRtbCNvNSI+c29hcDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuICA8YSBocmVmPSIjbzUiPjwvYT48YnI+PC90ZD48L3RyPg0KKzwvdGFibGU+DQorPGhyPjxhIG5hbWU9Il9kZXRhaWxzIj48L2E+PGgyPkRldGFpbGVkIERlc2NyaXB0aW9uPC9oMj4NCitTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoicmVsYXRlZEJ1c2luZXNzZXNMaXN0Ii4gDQorPHA+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0idWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdDo6YnVzaW5lc3NLZXkiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EzIj51ZGRpMl9fYnVzaW5lc3NLZXk8L2E+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzZXNfbGlzdC5odG1sI28wIj51ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0OjpidXNpbmVzc0tleTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YnVzaW5lc3NLZXkuIA0KKzxwPg0KK1JlcXVpcmVkIGVsZW1lbnQgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9InVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3Q6OmdlbmVyaWMiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3Nlc19saXN0Lmh0bWwjbzIiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3Q6OmdlbmVyaWM8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcuIA0KKzxwPg0KK1JlcXVpcmVkIGF0dHJpYnV0ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMyIgZG94eXRhZz0idWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdDo6b3BlcmF0b3JfIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzZXNfbGlzdC5odG1sI28zIj51ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0OjpvcGVyYXRvcl88L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIG9wZXJhdG9yIG9mIHR5cGUgeHM6c3RyaW5nLiANCis8cD4NCitSZXF1aXJlZCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9InVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3Q6OnJlbGF0ZWRCdXNpbmVzc0luZm9zIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzX2luZm9zLmh0bWwiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvczwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzZXNfbGlzdC5odG1sI28xIj51ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0OjpyZWxhdGVkQnVzaW5lc3NJbmZvczwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6cmVsYXRlZEJ1c2luZXNzSW5mb3MuIA0KKzxwPg0KK1JlcXVpcmVkIGVsZW1lbnQgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzUiIGRveHl0YWc9InVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3Q6OnNvYXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzZXNfbGlzdC5odG1sI281Ij5zb2FwPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3Nlc19saXN0Lmh0bWwjbzUiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3Q6OnNvYXA8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im80IiBkb3h5dGFnPSJ1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0Ojp0cnVuY2F0ZWQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gZW51bSA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQ4Ij51ZGRpMl9fdHJ1bmNhdGVkPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3Nlc19saXN0Lmh0bWwjbzQiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3Q6OnRydW5jYXRlZDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgdHJ1bmNhdGVkIG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRydW5jYXRlZC4gDQorPHA+DQorT3B0aW9uYWwgYXR0cmlidXRlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3VkZGkyLzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCI+dWRkaV92Mi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTc6MDAgMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19yZXN1bHQtbWVtYmVycy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19yZXN1bHQtbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZWJkNDEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3Jlc3VsdC1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwxNyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX3Jlc3VsdCBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVzdWx0Lmh0bWwiPnVkZGkyX19yZXN1bHQ8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZXN1bHQuaHRtbCNvMCI+ZXJySW5mbzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVzdWx0Lmh0bWwiPnVkZGkyX19yZXN1bHQ8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3Jlc3VsdC5odG1sI28yIj5lcnJub188L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3Jlc3VsdC5odG1sIj51ZGRpMl9fcmVzdWx0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZXN1bHQuaHRtbCNvMSI+a2V5VHlwZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVzdWx0Lmh0bWwiPnVkZGkyX19yZXN1bHQ8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3Jlc3VsdC5odG1sI28zIj5zb2FwPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZXN1bHQuaHRtbCI+dWRkaTJfX3Jlc3VsdDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNzowMCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3Jlc3VsdC5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19yZXN1bHQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTBkZGM4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19yZXN1bHQuaHRtbApAQCAtMCwwICsxLDEzOSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogdWRkaTJfX3Jlc3VsdCBDbGFzcyBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX3Jlc3VsdCBDbGFzcyBSZWZlcmVuY2U8L2gxPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJyZXN1bHQiLiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KKzxjb2RlPiNpbmNsdWRlICZsdDt1ZGRpX3YyLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KKzxhIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVzdWx0LW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19lcnJfaW5mby5odG1sIj51ZGRpMl9fZXJySW5mbzwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3Jlc3VsdC5odG1sI28wIj5lcnJJbmZvPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5FbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6ZXJySW5mby4gIDxhIGhyZWY9IiNvMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmVudW0gPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E1MCI+dWRkaTJfX2tleVR5cGU8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZXN1bHQuaHRtbCNvMSI+a2V5VHlwZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIGtleVR5cGUgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6a2V5VHlwZS4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3Jlc3VsdC5odG1sI28yIj5lcnJub188L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkF0dHJpYnV0ZSBlcnJubyBvZiB0eXBlIHhzOmludC4gIDxhIGhyZWY9IiNvMiI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZXN1bHQuaHRtbCNvMyI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3Jlc3VsdC5odG1sI28zIj5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvMyI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJyZXN1bHQiLiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJ1ZGRpMl9fcmVzdWx0OjplcnJJbmZvIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19lcnJfaW5mby5odG1sIj51ZGRpMl9fZXJySW5mbzwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZXN1bHQuaHRtbCNvMCI+dWRkaTJfX3Jlc3VsdDo6ZXJySW5mbzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6ZXJySW5mby4gDQorPHA+DQorT3B0aW9uYWwgZWxlbWVudCAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMiIgZG94eXRhZz0idWRkaTJfX3Jlc3VsdDo6ZXJybm9fIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVzdWx0Lmh0bWwjbzIiPnVkZGkyX19yZXN1bHQ6OmVycm5vXzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgZXJybm8gb2YgdHlwZSB4czppbnQuIA0KKzxwPg0KK1JlcXVpcmVkIGF0dHJpYnV0ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0idWRkaTJfX3Jlc3VsdDo6a2V5VHlwZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBlbnVtIDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNTAiPnVkZGkyX19rZXlUeXBlPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3Jlc3VsdC5odG1sI28xIj51ZGRpMl9fcmVzdWx0OjprZXlUeXBlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSBrZXlUeXBlIG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOmtleVR5cGUuIA0KKzxwPg0KK09wdGlvbmFsIGF0dHJpYnV0ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMyIgZG94eXRhZz0idWRkaTJfX3Jlc3VsdDo6c29hcCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3Jlc3VsdC5odG1sI28zIj5zb2FwPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3Jlc3VsdC5odG1sI28zIj51ZGRpMl9fcmVzdWx0Ojpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE3OjAwIDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYmluZGluZy1tZW1iZXJzLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJpbmRpbmctbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MTUyYzIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJpbmRpbmctbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMjEgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCI+dWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZzwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNvMCI+YXV0aEluZm88L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCI+dWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZzwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI28xIj5iaW5kaW5nVGVtcGxhdGU8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCI+dWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZzwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI28yIj5nZW5lcmljPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwiPnVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmc8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNhMyI+c2VuZDwvYT4oY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwiPnVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmc8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNvMyI+c29hcDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sIj51ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjYTAiPnVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmc8L2E+KHN0cnVjdCBzb2FwICopPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCI+dWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZzwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI2ExIj51ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nPC9hPihzdHJ1Y3Qgc29hcCAqLCB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlICZhbXA7YmluZGluZ1RlbXBsYXRlKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwiPnVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmc8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNhMiI+dWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZzwvYT4oc3RydWN0IHNvYXAgKiwgc3RkOjp2ZWN0b3ImbHQ7IHVkZGkyX19iaW5kaW5nVGVtcGxhdGUgKiAmZ3Q7IGJpbmRpbmdUZW1wbGF0ZXMpPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCI+dWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZzwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNzowMCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MDRmMTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbApAQCAtMCwwICsxLDMyOCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZyBDbGFzcyBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZyBDbGFzcyBSZWZlcmVuY2U8L2gxPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJzYXZlX2JpbmRpbmciLiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KKzxjb2RlPiNpbmNsdWRlICZsdDt1ZGRpX3YyLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KKzxhIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYmluZGluZy1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgTWVtYmVyIEZ1bmN0aW9uczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjYTAiPnVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmc8L2E+IChzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNvMyI+c29hcDwvYT4gKik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+TWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2EwIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI2ExIj51ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nPC9hPiAoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjbzMiPnNvYXA8L2E+ICosIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX3RlbXBsYXRlLmh0bWwiPnVkZGkyX19iaW5kaW5nVGVtcGxhdGU8L2E+ICZhbXA7PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNvMSI+YmluZGluZ1RlbXBsYXRlPC9hPik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+TWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2ExIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI2EyIj51ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nPC9hPiAoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjbzMiPnNvYXA8L2E+ICosIHN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZS5odG1sIj51ZGRpMl9fYmluZGluZ1RlbXBsYXRlPC9hPiAqICZndDsgYmluZGluZ1RlbXBsYXRlcyk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+TWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2EyIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfZGV0YWlsLmh0bWwiPnVkZGkyX19iaW5kaW5nRGV0YWlsPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI2EzIj5zZW5kPC9hPiAoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjbzAiPmF1dGhJbmZvPC9hPik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+TWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2EzIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNvMCI+YXV0aEluZm88L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjphdXRoSW5mby4gIDxhIGhyZWY9IiNvMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZS5odG1sIj51ZGRpMl9fYmluZGluZ1RlbXBsYXRlPC9hPiAqICZndDsmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjbzEiPmJpbmRpbmdUZW1wbGF0ZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VmVjdG9yIG9mIHVkZGkyX19iaW5kaW5nVGVtcGxhdGUqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNvMiI+Z2VuZXJpYzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcuICA8YSBocmVmPSIjbzIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI28zIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI28zIj5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvMyI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJzYXZlX2JpbmRpbmciLiANCis8cD4NCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBwb3N0IGJpbmRpbmcgaW5mb3JtYXRpb24gb24gYSBVRERJIHNlcnZlci48cD4NCitTZWUgIDxhIGhyZWY9Imh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3NDIiPmh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3NDI8L2E+IA0KKzxwPg0KKzxocj48aDI+Q29uc3RydWN0b3IgJmFtcDsgRGVzdHJ1Y3RvciBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMCIgZG94eXRhZz0idWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZzo6dWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nOjp1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjbzMiPnNvYXA8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmdTT0FQIGNvbnRleHQ8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc2F2ZV9VU0NPUkViaW5kaW5nIGNsYXNzLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMSIgZG94eXRhZz0idWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZzo6dWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nOjp1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjbzMiPnNvYXA8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZS5odG1sIj51ZGRpMl9fYmluZGluZ1RlbXBsYXRlPC9hPiAmYW1wOyZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5iaW5kaW5nVGVtcGxhdGU8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5nU09BUCBjb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+YmluZGluZ1RlbXBsYXRlPC9lbT4mbmJzcDs8L3RkPjx0ZD5iaW5kaW5nIHRlbXBsYXRlPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNhdmVfVVNDT1JFYmluZGluZyBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkIGJpbmRpbmcgdGVtcGxhdGUuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEyIiBkb3h5dGFnPSJ1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nOjp1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmc6OnVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNvMyI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZS5odG1sIj51ZGRpMl9fYmluZGluZ1RlbXBsYXRlPC9hPiAqICZndDsmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+YmluZGluZ1RlbXBsYXRlczwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmdTT0FQIGNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5iaW5kaW5nVGVtcGxhdGVzPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb2xsZWN0aW9uIG9mIGJpbmRpbmcgdGVtcGxhdGVzPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNhdmVfVVNDT1JFYmluZGluZyBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkIGJpbmRpbmcgdGVtcGxhdGVzLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+PGgyPk1lbWJlciBGdW5jdGlvbiBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMyIgZG94eXRhZz0idWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZzo6c2VuZCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ19kZXRhaWwuaHRtbCI+dWRkaTJfX2JpbmRpbmdEZXRhaWw8L2E+ICogdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZzo6c2VuZCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5lbmRwb2ludDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+YXV0aEluZm88L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5lbmRwb2ludDwvZW0+Jm5ic3A7PC90ZD48dGQ+VVJMIG9mIHRoZSBVRERJIHNlcnZlciA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmF1dGhJbmZvPC9lbT4mbmJzcDs8L3RkPjx0ZD5hdXRob3JpemF0aW9uIHRva2VuIHByb3ZpZGVkIGJ5IHRoZSBVRERJIHNlcnZlciA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPkEgcG9pbnRlciB0byBhIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX2RldGFpbC5odG1sIj51ZGRpMl9fYmluZGluZ0RldGFpbDwvYT4gb2JqZWN0IG9yIE5VTEwgb24gZXJyb3I8L2RkPjwvZGw+DQorU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZlciB0byBwb3N0IGJpbmRpbmcgaW5mb3JtYXRpb24gb24gdGhlIHNlcnZlci4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0idWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZzo6YXV0aEluZm8iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNvMCI+dWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZzo6YXV0aEluZm88L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmF1dGhJbmZvLiANCis8cD4NCitSZXF1aXJlZCBlbGVtZW50ICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJ1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nOjpiaW5kaW5nVGVtcGxhdGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RkOjp2ZWN0b3ImbHQ7PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGUuaHRtbCI+dWRkaTJfX2JpbmRpbmdUZW1wbGF0ZTwvYT4qJmd0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI28xIj51ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nOjpiaW5kaW5nVGVtcGxhdGU8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVmVjdG9yIG9mIHVkZGkyX19iaW5kaW5nVGVtcGxhdGUqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9InVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmc6OmdlbmVyaWMiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNvMiI+dWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZzo6Z2VuZXJpYzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZy4gDQorPHA+DQorUmVxdWlyZWQgYXR0cmlidXRlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8zIiBkb3h5dGFnPSJ1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nOjpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI28zIj5zb2FwPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNvMyI+dWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZzo6c29hcDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvdWRkaTIvPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sIj51ZGRpX3YyLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNzowMCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJ1c2luZXNzLW1lbWJlcnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MtbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZWUzYWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJ1c2luZXNzLW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDIyIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCI+dWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI28wIj5hdXRoSW5mbzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCI+dWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzEiPmJ1c2luZXNzRW50aXR5PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sIj51ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzczwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvMyI+Z2VuZXJpYzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCI+dWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjYTMiPnNlbmQ8L2E+KGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbyk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCI+dWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzQiPnNvYXA8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwiPnVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI2EwIj51ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzczwvYT4oc3RydWN0IHNvYXAgKik8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCI+dWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjYTEiPnVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzPC9hPihzdHJ1Y3Qgc29hcCAqLCB1ZGRpMl9fYnVzaW5lc3NFbnRpdHkgJmFtcDtidXNpbmVzc0VudGl0eSk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCI+dWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjYTIiPnVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzPC9hPihzdHJ1Y3Qgc29hcCAqLCBzdGQ6OnZlY3RvciZsdDsgdWRkaTJfX2J1c2luZXNzRW50aXR5ICogJmd0OyBidXNpbmVzc0VudGl0aWVzKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sIj51ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzczwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvMiI+dXBsb2FkUmVnaXN0ZXI8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwiPnVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE3OjAwIDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjU4MzliCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sCkBAIC0wLDAgKzEsMzU2IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiB1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyBDbGFzcyBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3MgQ2xhc3MgUmVmZXJlbmNlPC9oMT5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92Mjoic2F2ZV9idXNpbmVzcyIuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3VkZGlfdjIuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VidXNpbmVzcy1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgTWVtYmVyIEZ1bmN0aW9uczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI2EwIj51ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzczwvYT4gKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvNCI+c29hcDwvYT4gKik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+TWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2EwIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNhMSI+dWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M8L2E+IChzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzQiPnNvYXA8L2E+ICosIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHkuaHRtbCI+dWRkaTJfX2J1c2luZXNzRW50aXR5PC9hPiAmYW1wOzxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI28xIj5idXNpbmVzc0VudGl0eTwvYT4pPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gIDxhIGhyZWY9IiNhMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjYTIiPnVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzPC9hPiAoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI280Ij5zb2FwPC9hPiAqLCBzdGQ6OnZlY3RvciZsdDsgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eS5odG1sIj51ZGRpMl9fYnVzaW5lc3NFbnRpdHk8L2E+ICogJmd0OyBidXNpbmVzc0VudGl0aWVzKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsLmh0bWwiPnVkZGkyX19idXNpbmVzc0RldGFpbDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjYTMiPnNlbmQ8L2E+IChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzAiPmF1dGhJbmZvPC9hPik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+TWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2EzIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzAiPmF1dGhJbmZvPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5FbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YXV0aEluZm8uICA8YSBocmVmPSIjbzAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zdGQ6OnZlY3RvciZsdDsgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eS5odG1sIj51ZGRpMl9fYnVzaW5lc3NFbnRpdHk8L2E+ICogJmd0OyZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzEiPmJ1c2luZXNzRW50aXR5PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5WZWN0b3Igb2YgdWRkaTJfX2J1c2luZXNzRW50aXR5KiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQuICA8YSBocmVmPSIjbzEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zdGQ6OnZlY3RvciZsdDsgY2hhciAqICZndDsmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI28yIj51cGxvYWRSZWdpc3RlcjwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VmVjdG9yIG9mIGNoYXIqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gIDxhIGhyZWY9IiNvMiI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzMiPmdlbmVyaWM8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nLiAgPGEgaHJlZj0iI28zIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzQiPnNvYXA8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI280Ij5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvNCI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJzYXZlX2J1c2luZXNzIi4gDQorPHA+DQorUmVwcmVzZW50cyBhIHJlcXVlc3QgdG8gcG9zdCBidXNpbmVzcyBpbmZvcm1hdGlvbiBvbiBhIFVEREkgc2VydmVyLjxwPg0KK1NlZSAgPGEgaHJlZj0iaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzc0MyI+aHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzc0MzwvYT4gDQorPHA+DQorPGhyPjxoMj5Db25zdHJ1Y3RvciAmYW1wOyBEZXN0cnVjdG9yIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEwIiBkb3h5dGFnPSJ1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzczo6dWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3MiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M6OnVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI280Ij5zb2FwPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiA8ZW0+c29hcDwvZW0+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5nU09BUCBjb250ZXh0PC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNhdmVfVVNDT1JFYnVzaW5lc3MgY2xhc3MuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExIiBkb3h5dGFnPSJ1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzczo6dWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3MiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M6OnVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI280Ij5zb2FwPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eS5odG1sIj51ZGRpMl9fYnVzaW5lc3NFbnRpdHk8L2E+ICZhbXA7Jm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmJ1c2luZXNzRW50aXR5PC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK01lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Z1NPQVAgY29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmJ1c2luZXNzRW50aXR5PC9lbT4mbmJzcDs8L3RkPjx0ZD5idXNpbmVzcyBlbnRpdHk8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc2F2ZV9VU0NPUkVidXNpbmVzcyBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkIGJ1c2luZXNzIGVudGl0eS4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTIiIGRveHl0YWc9InVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzOjp1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzczo6dWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3MgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzQiPnNvYXA8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5zdGQ6OnZlY3RvciZsdDsgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eS5odG1sIj51ZGRpMl9fYnVzaW5lc3NFbnRpdHk8L2E+ICogJmd0OyZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5idXNpbmVzc0VudGl0aWVzPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK01lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Z1NPQVAgY29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmJ1c2luZXNzRW50aXRpZXM8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbGxlY3Rpb24gb2YgYnVzaW5lc3MgZW50aXRpZXM8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc2F2ZV9VU0NPUkVidXNpbmVzcyBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkIGJ1c2luZXNzIGVudGl0aWVzLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+PGgyPk1lbWJlciBGdW5jdGlvbiBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMyIgZG94eXRhZz0idWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M6OnNlbmQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2RldGFpbC5odG1sIj51ZGRpMl9fYnVzaW5lc3NEZXRhaWw8L2E+ICogdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M6OnNlbmQgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+ZW5kcG9pbnQ8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmF1dGhJbmZvPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK01lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+ZW5kcG9pbnQ8L2VtPiZuYnNwOzwvdGQ+PHRkPlVSTCBvZiB0aGUgVURESSBzZXJ2ZXIgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5hdXRoSW5mbzwvZW0+Jm5ic3A7PC90ZD48dGQ+YXV0aG9yaXphdGlvbiB0b2tlbiBwcm92aWRlZCBieSB0aGUgVURESSBzZXJ2ZXIgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5BIHBvaW50ZXIgdG8gYSA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsLmh0bWwiPnVkZGkyX19idXNpbmVzc0RldGFpbDwvYT4gb2JqZWN0IG9yIE5VTEwgb24gZXJyb3I8L2RkPjwvZGw+DQorU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZlciB0byBwb3N0IGJ1c2luZXNzIGluZm9ybWF0aW9uIG9uIHRoZSBzZXJ2ZXIuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzOjphdXRoSW5mbyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvMCI+dWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M6OmF1dGhJbmZvPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0VsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjphdXRoSW5mby4gDQorPHA+DQorUmVxdWlyZWQgZWxlbWVudCAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0idWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M6OmJ1c2luZXNzRW50aXR5IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0ZDo6dmVjdG9yJmx0OzxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHkuaHRtbCI+dWRkaTJfX2J1c2luZXNzRW50aXR5PC9hPiogJmd0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvMSI+dWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M6OmJ1c2luZXNzRW50aXR5PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1ZlY3RvciBvZiB1ZGRpMl9fYnVzaW5lc3NFbnRpdHkqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzMiIGRveHl0YWc9InVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzOjpnZW5lcmljIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI28zIj51ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzczo6Z2VuZXJpYzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZy4gDQorPHA+DQorUmVxdWlyZWQgYXR0cmlidXRlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im80IiBkb3h5dGFnPSJ1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzczo6c29hcCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzQiPnNvYXA8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvNCI+dWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M6OnNvYXA8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJ1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzczo6dXBsb2FkUmVnaXN0ZXIiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RkOjp2ZWN0b3ImbHQ7Y2hhciogJmd0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvMiI+dWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M6OnVwbG9hZFJlZ2lzdGVyPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1ZlY3RvciBvZiBjaGFyKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3VkZGkyLzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCI+dWRkaV92Mi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTc6MDAgMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLW1lbWJlcnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lc2VydmljZS1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQxMDEyOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lc2VydmljZS1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwyMSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZSBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sIj51ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlPC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI28wIj5hdXRoSW5mbzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sIj51ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjbzEiPmJ1c2luZXNzU2VydmljZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sIj51ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjbzIiPmdlbmVyaWM8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCI+dWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI2EzIj5zZW5kPC9hPihjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCI+dWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI28zIj5zb2FwPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwiPnVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2U8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNhMCI+dWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZTwvYT4oc3RydWN0IHNvYXAgKik8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sIj51ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjYTEiPnVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2U8L2E+KHN0cnVjdCBzb2FwICosIHVkZGkyX19idXNpbmVzc1NlcnZpY2UgJmFtcDtidXNpbmVzc1NlcnZpY2UpPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCI+dWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI2EyIj51ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlPC9hPihzdHJ1Y3Qgc29hcCAqLCBzdGQ6OnZlY3RvciZsdDsgdWRkaTJfX2J1c2luZXNzU2VydmljZSAqICZndDsgYnVzaW5lc3NTZXJ2aWNlcyk8L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sIj51ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE3OjAwIDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZjYTA0YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sCkBAIC0wLDAgKzEsMzI4IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiB1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlIENsYXNzIFJlZmVyZW5jZTwvaDE+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InNhdmVfc2VydmljZSIuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3VkZGlfdjIuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBNZW1iZXIgRnVuY3Rpb25zPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNhMCI+dWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZTwvYT4gKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI28zIj5zb2FwPC9hPiAqKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjYTEiPnVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2U8L2E+IChzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvMyI+c29hcDwvYT4gKiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2UuaHRtbCI+dWRkaTJfX2J1c2luZXNzU2VydmljZTwvYT4gJmFtcDs8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI28xIj5idXNpbmVzc1NlcnZpY2U8L2E+KTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjYTIiPnVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2U8L2E+IChzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvMyI+c29hcDwvYT4gKiwgc3RkOjp2ZWN0b3ImbHQ7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlLmh0bWwiPnVkZGkyX19idXNpbmVzc1NlcnZpY2U8L2E+ICogJmd0OyBidXNpbmVzc1NlcnZpY2VzKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9kZXRhaWwuaHRtbCI+dWRkaTJfX3NlcnZpY2VEZXRhaWw8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjYTMiPnNlbmQ8L2E+IChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvMCI+YXV0aEluZm88L2E+KTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTMiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI28wIj5hdXRoSW5mbzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+RWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmF1dGhJbmZvLiAgPGEgaHJlZj0iI28wIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c3RkOjp2ZWN0b3ImbHQ7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlLmh0bWwiPnVkZGkyX19idXNpbmVzc1NlcnZpY2U8L2E+ICogJmd0OyZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvMSI+YnVzaW5lc3NTZXJ2aWNlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5WZWN0b3Igb2YgdWRkaTJfX2J1c2luZXNzU2VydmljZSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiAgPGEgaHJlZj0iI28xIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI28yIj5nZW5lcmljPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZy4gIDxhIGhyZWY9IiNvMiI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjbzMiPnNvYXA8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjbzMiPnNvYXA8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiAgPGEgaHJlZj0iI28zIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzxocj48YSBuYW1lPSJfZGV0YWlscyI+PC9hPjxoMj5EZXRhaWxlZCBEZXNjcmlwdGlvbjwvaDI+DQorU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InNhdmVfc2VydmljZSIuIA0KKzxwPg0KK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIHBvc3Qgc2VydmljZSBpbmZvcm1hdGlvbiBvbiBhIFVEREkgc2VydmVyLjxwPg0KK1NlZSAgPGEgaHJlZj0iaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzc0NCI+aHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzc0NDwvYT4gDQorPHA+DQorPGhyPjxoMj5Db25zdHJ1Y3RvciAmYW1wOyBEZXN0cnVjdG9yIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEwIiBkb3h5dGFnPSJ1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlOjp1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2U6OnVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2UgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvMyI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK01lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Z1NPQVAgY29udGV4dDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzYXZlX1VTQ09SRXNlcnZpY2UgY2xhc3MuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExIiBkb3h5dGFnPSJ1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlOjp1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2U6OnVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2UgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvMyI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlLmh0bWwiPnVkZGkyX19idXNpbmVzc1NlcnZpY2U8L2E+ICZhbXA7Jm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmJ1c2luZXNzU2VydmljZTwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmdTT0FQIGNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5idXNpbmVzc1NlcnZpY2U8L2VtPiZuYnNwOzwvdGQ+PHRkPmJ1c2luZXNzIHNlcnZpY2U8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc2F2ZV9VU0NPUkVzZXJ2aWNlIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQgc2VydmljZS4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTIiIGRveHl0YWc9InVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2U6OnVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2UiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZTo6dWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZSAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI28zIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+c3RkOjp2ZWN0b3ImbHQ7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlLmh0bWwiPnVkZGkyX19idXNpbmVzc1NlcnZpY2U8L2E+ICogJmd0OyZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5idXNpbmVzc1NlcnZpY2VzPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK01lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Z1NPQVAgY29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmJ1c2luZXNzU2VydmljZXM8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbGxlY3Rpb24gb2YgYnVzaW5lc3Mgc2VydmljZXM8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc2F2ZV9VU0NPUkVzZXJ2aWNlIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQgc2VydmljZXMuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj48aDI+TWVtYmVyIEZ1bmN0aW9uIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEzIiBkb3h5dGFnPSJ1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlOjpzZW5kIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2RldGFpbC5odG1sIj51ZGRpMl9fc2VydmljZURldGFpbDwvYT4gKiB1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlOjpzZW5kICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmVuZHBvaW50PC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5hdXRoSW5mbzwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmVuZHBvaW50PC9lbT4mbmJzcDs8L3RkPjx0ZD5VUkwgb2YgdGhlIFVEREkgc2VydmVyIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+YXV0aEluZm88L2VtPiZuYnNwOzwvdGQ+PHRkPmF1dGhvcml6YXRpb24gdG9rZW4gcHJvdmlkZWQgYnkgdGhlIFVEREkgc2VydmVyIDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+QSBwb2ludGVyIHRvIGEgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfZGV0YWlsLmh0bWwiPnVkZGkyX19zZXJ2aWNlRGV0YWlsPC9hPiBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcjwvZGQ+PC9kbD4NCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmVyIHRvIHBvc3Qgc2VydmljZSBpbmZvcm1hdGlvbiBvbiB0aGUgc2VydmVyLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJ1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlOjphdXRoSW5mbyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI28wIj51ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlOjphdXRoSW5mbzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YXV0aEluZm8uIA0KKzxwPg0KK1JlcXVpcmVkIGVsZW1lbnQgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9InVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2U6OmJ1c2luZXNzU2VydmljZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdGQ6OnZlY3RvciZsdDs8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3Nfc2VydmljZS5odG1sIj51ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlPC9hPiomZ3Q7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjbzEiPnVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2U6OmJ1c2luZXNzU2VydmljZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitWZWN0b3Igb2YgdWRkaTJfX2J1c2luZXNzU2VydmljZSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMiIgZG94eXRhZz0idWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZTo6Z2VuZXJpYyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI28yIj51ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlOjpnZW5lcmljPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nLiANCis8cD4NCitSZXF1aXJlZCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzMiIGRveHl0YWc9InVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2U6OnNvYXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjbzMiPnNvYXA8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI28zIj51ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlOjpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE3OjAwIDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC1tZW1iZXJzLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXRfbW9kZWwtbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OTI1Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXRfbW9kZWwtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMjIgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbCBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sIj51ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWw8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzAiPmF1dGhJbmZvPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwiPnVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI28zIj5nZW5lcmljPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwiPnVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI2EzIj5zZW5kPC9hPihjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCI+dWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzQiPnNvYXA8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCI+dWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzEiPnRNb2RlbDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sIj51ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWw8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNhMCI+dWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsPC9hPihzdHJ1Y3Qgc29hcCAqKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwiPnVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI2ExIj51ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWw8L2E+KHN0cnVjdCBzb2FwICosIHVkZGkyX190TW9kZWwgJmFtcDt0TW9kZWwpPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCI+dWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjYTIiPnVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbDwvYT4oc3RydWN0IHNvYXAgKiwgc3RkOjp2ZWN0b3ImbHQ7IHVkZGkyX190TW9kZWwgKiAmZ3Q7IHRNb2RlbHMpPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCI+dWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzIiPnVwbG9hZFJlZ2lzdGVyPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwiPnVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNzowMCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZjM0M2YKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbApAQCAtMCwwICsxLDM1NiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwgQ2xhc3MgUmVmZXJlbmNlPC9oMT5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92Mjoic2F2ZV90TW9kZWwiLiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KKzxjb2RlPiNpbmNsdWRlICZsdDt1ZGRpX3YyLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KKzxhIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgTWVtYmVyIEZ1bmN0aW9uczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjYTAiPnVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbDwvYT4gKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI280Ij5zb2FwPC9hPiAqKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjYTEiPnVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbDwvYT4gKHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI280Ij5zb2FwPC9hPiAqLCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbC5odG1sIj51ZGRpMl9fdE1vZGVsPC9hPiAmYW1wOzxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzEiPnRNb2RlbDwvYT4pPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gIDxhIGhyZWY9IiNhMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNhMiI+dWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsPC9hPiAoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzQiPnNvYXA8L2E+ICosIHN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbC5odG1sIj51ZGRpMl9fdE1vZGVsPC9hPiAqICZndDsgdE1vZGVscyk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+TWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2EyIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfZGV0YWlsLmh0bWwiPnVkZGkyX190TW9kZWxEZXRhaWw8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjYTMiPnNlbmQ8L2E+IChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNvMCI+YXV0aEluZm88L2E+KTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTMiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI28wIj5hdXRoSW5mbzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+RWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmF1dGhJbmZvLiAgPGEgaHJlZj0iI28wIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c3RkOjp2ZWN0b3ImbHQ7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsLmh0bWwiPnVkZGkyX190TW9kZWw8L2E+ICogJmd0OyZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNvMSI+dE1vZGVsPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5WZWN0b3Igb2YgdWRkaTJfX3RNb2RlbCogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiAgPGEgaHJlZj0iI28xIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c3RkOjp2ZWN0b3ImbHQ7IGNoYXIgKiAmZ3Q7Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI28yIj51cGxvYWRSZWdpc3RlcjwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VmVjdG9yIG9mIGNoYXIqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gIDxhIGhyZWY9IiNvMiI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNvMyI+Z2VuZXJpYzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcuICA8YSBocmVmPSIjbzMiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI280Ij5zb2FwPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI280Ij5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvNCI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJzYXZlX3RNb2RlbCIuIA0KKzxwPg0KK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIHBvc3QgdE1vZGVsIGluZm9ybWF0aW9uIG9uIGEgVURESSBzZXJ2ZXIuPHA+DQorU2VlICA8YSBocmVmPSJodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzQ1Ij5odHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzQ1PC9hPiANCis8cD4NCis8aHI+PGgyPkNvbnN0cnVjdG9yICZhbXA7IERlc3RydWN0b3IgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTAiIGRveHl0YWc9InVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbDo6dWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbDo6dWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzQiPnNvYXA8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmdTT0FQIGNvbnRleHQ8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc2F2ZV9VU0NPUkV0TW9kZWwgY2xhc3MuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExIiBkb3h5dGFnPSJ1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWw6OnVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWw6OnVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI280Ij5zb2FwPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWwuaHRtbCI+dWRkaTJfX3RNb2RlbDwvYT4gJmFtcDsmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+dE1vZGVsPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK01lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Z1NPQVAgY29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnRNb2RlbDwvZW0+Jm5ic3A7PC90ZD48dGQ+YSB0TW9kZWw8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc2F2ZV9VU0NPUkV0TW9kZWwgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZCB0TW9kZWwuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEyIiBkb3h5dGFnPSJ1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWw6OnVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWw6OnVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI280Ij5zb2FwPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+c3RkOjp2ZWN0b3ImbHQ7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsLmh0bWwiPnVkZGkyX190TW9kZWw8L2E+ICogJmd0OyZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT50TW9kZWxzPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK01lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Z1NPQVAgY29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnRNb2RlbHM8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbGxlY3Rpb24gb2YgdE1vZGVsczwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzYXZlX1VTQ09SRXRNb2RlbCBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkIHRNb2RlbHMuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj48aDI+TWVtYmVyIEZ1bmN0aW9uIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEzIiBkb3h5dGFnPSJ1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWw6OnNlbmQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfZGV0YWlsLmh0bWwiPnVkZGkyX190TW9kZWxEZXRhaWw8L2E+ICogdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsOjpzZW5kICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmVuZHBvaW50PC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5hdXRoSW5mbzwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmVuZHBvaW50PC9lbT4mbmJzcDs8L3RkPjx0ZD5VUkwgb2YgdGhlIFVEREkgc2VydmVyIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+YXV0aEluZm88L2VtPiZuYnNwOzwvdGQ+PHRkPmF1dGhvcml6YXRpb24gdG9rZW4gcHJvdmlkZWQgYnkgdGhlIFVEREkgc2VydmVyIDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+QSBwb2ludGVyIHRvIGEgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfZGV0YWlsLmh0bWwiPnVkZGkyX190TW9kZWxEZXRhaWw8L2E+IG9iamVjdCBvciBOVUxMIG9uIGVycm9yPC9kZD48L2RsPg0KK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2ZXIgdG8gcG9zdCB0TW9kZWwgaW5mb3JtYXRpb24gb24gdGhlIHNlcnZlci4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0idWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsOjphdXRoSW5mbyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI28wIj51ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWw6OmF1dGhJbmZvPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0VsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjphdXRoSW5mby4gDQorPHA+DQorUmVxdWlyZWQgZWxlbWVudCAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMyIgZG94eXRhZz0idWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsOjpnZW5lcmljIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzMiPnVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbDo6Z2VuZXJpYzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZy4gDQorPHA+DQorUmVxdWlyZWQgYXR0cmlidXRlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im80IiBkb3h5dGFnPSJ1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWw6OnNvYXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzQiPnNvYXA8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI280Ij51ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWw6OnNvYXA8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJ1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWw6OnRNb2RlbCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdGQ6OnZlY3RvciZsdDs8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbC5odG1sIj51ZGRpMl9fdE1vZGVsPC9hPiogJmd0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI28xIj51ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWw6OnRNb2RlbDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitWZWN0b3Igb2YgdWRkaTJfX3RNb2RlbCogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMiIgZG94eXRhZz0idWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsOjp1cGxvYWRSZWdpc3RlciIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdGQ6OnZlY3RvciZsdDtjaGFyKiAmZ3Q7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzIiPnVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbDo6dXBsb2FkUmVnaXN0ZXI8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVmVjdG9yIG9mIGNoYXIqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvdWRkaTIvPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sIj51ZGRpX3YyLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNzowMCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3NlcnZpY2VfZGV0YWlsLW1lbWJlcnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fc2VydmljZV9kZXRhaWwtbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NDQ1MGIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3NlcnZpY2VfZGV0YWlsLW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDE4IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fc2VydmljZURldGFpbCBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9kZXRhaWwuaHRtbCI+dWRkaTJfX3NlcnZpY2VEZXRhaWw8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2RldGFpbC5odG1sI28wIj5idXNpbmVzc1NlcnZpY2U8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfZGV0YWlsLmh0bWwiPnVkZGkyX19zZXJ2aWNlRGV0YWlsPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2RldGFpbC5odG1sI28xIj5nZW5lcmljPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2RldGFpbC5odG1sIj51ZGRpMl9fc2VydmljZURldGFpbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9kZXRhaWwuaHRtbCNvMiI+b3BlcmF0b3JfPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2RldGFpbC5odG1sIj51ZGRpMl9fc2VydmljZURldGFpbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9kZXRhaWwuaHRtbCNvNCI+c29hcDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9kZXRhaWwuaHRtbCI+dWRkaTJfX3NlcnZpY2VEZXRhaWw8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfZGV0YWlsLmh0bWwjbzMiPnRydW5jYXRlZDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9kZXRhaWwuaHRtbCI+dWRkaTJfX3NlcnZpY2VEZXRhaWw8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTc6MDAgMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2RldGFpbC5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2RldGFpbC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOTg2NWIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3NlcnZpY2VfZGV0YWlsLmh0bWwKQEAgLTAsMCArMSwxNjcgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IHVkZGkyX19zZXJ2aWNlRGV0YWlsIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fc2VydmljZURldGFpbCBDbGFzcyBSZWZlcmVuY2U8L2gxPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJzZXJ2aWNlRGV0YWlsIi4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7dWRkaV92Mi5oJmd0OzwvY29kZT4NCis8cD4NCis8YSBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfZGV0YWlsLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3Nfc2VydmljZS5odG1sIj51ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlPC9hPiAqICZndDsmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2RldGFpbC5odG1sI28wIj5idXNpbmVzc1NlcnZpY2U8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlZlY3RvciBvZiB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQuICA8YSBocmVmPSIjbzAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2RldGFpbC5odG1sI28xIj5nZW5lcmljPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZy4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfZGV0YWlsLmh0bWwjbzIiPm9wZXJhdG9yXzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIG9wZXJhdG9yIG9mIHR5cGUgeHM6c3RyaW5nLiAgPGEgaHJlZj0iI28yIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+ZW51bSA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQ4Ij51ZGRpMl9fdHJ1bmNhdGVkPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9kZXRhaWwuaHRtbCNvMyI+dHJ1bmNhdGVkPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgdHJ1bmNhdGVkIG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRydW5jYXRlZC4gIDxhIGhyZWY9IiNvMyI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2RldGFpbC5odG1sI280Ij5zb2FwPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9kZXRhaWwuaHRtbCNvNCI+c29hcDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuICA8YSBocmVmPSIjbzQiPjwvYT48YnI+PC90ZD48L3RyPg0KKzwvdGFibGU+DQorPGhyPjxhIG5hbWU9Il9kZXRhaWxzIj48L2E+PGgyPkRldGFpbGVkIERlc2NyaXB0aW9uPC9oMj4NCitTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92Mjoic2VydmljZURldGFpbCIuIA0KKzxwPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InVkZGkyX19zZXJ2aWNlRGV0YWlsOjpidXNpbmVzc1NlcnZpY2UiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RkOjp2ZWN0b3ImbHQ7PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2UuaHRtbCI+dWRkaTJfX2J1c2luZXNzU2VydmljZTwvYT4qJmd0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9kZXRhaWwuaHRtbCNvMCI+dWRkaTJfX3NlcnZpY2VEZXRhaWw6OmJ1c2luZXNzU2VydmljZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitWZWN0b3Igb2YgdWRkaTJfX2J1c2luZXNzU2VydmljZSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0idWRkaTJfX3NlcnZpY2VEZXRhaWw6OmdlbmVyaWMiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfZGV0YWlsLmh0bWwjbzEiPnVkZGkyX19zZXJ2aWNlRGV0YWlsOjpnZW5lcmljPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nLiANCis8cD4NCitSZXF1aXJlZCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9InVkZGkyX19zZXJ2aWNlRGV0YWlsOjpvcGVyYXRvcl8iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfZGV0YWlsLmh0bWwjbzIiPnVkZGkyX19zZXJ2aWNlRGV0YWlsOjpvcGVyYXRvcl88L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIG9wZXJhdG9yIG9mIHR5cGUgeHM6c3RyaW5nLiANCis8cD4NCitSZXF1aXJlZCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzQiIGRveHl0YWc9InVkZGkyX19zZXJ2aWNlRGV0YWlsOjpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9kZXRhaWwuaHRtbCNvNCI+c29hcDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2RldGFpbC5odG1sI280Ij51ZGRpMl9fc2VydmljZURldGFpbDo6c29hcDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzMiIGRveHl0YWc9InVkZGkyX19zZXJ2aWNlRGV0YWlsOjp0cnVuY2F0ZWQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gZW51bSA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQ4Ij51ZGRpMl9fdHJ1bmNhdGVkPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfZGV0YWlsLmh0bWwjbzMiPnVkZGkyX19zZXJ2aWNlRGV0YWlsOjp0cnVuY2F0ZWQ8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIHRydW5jYXRlZCBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0cnVuY2F0ZWQuIA0KKzxwPg0KK09wdGlvbmFsIGF0dHJpYnV0ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE3OjAwIDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fc2VydmljZV9pbmZvLW1lbWJlcnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fc2VydmljZV9pbmZvLW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDU1MWViCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2luZm8tbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTcgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19zZXJ2aWNlSW5mbyBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9pbmZvLmh0bWwiPnVkZGkyX19zZXJ2aWNlSW5mbzwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfaW5mby5odG1sI28yIj5idXNpbmVzc0tleTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9pbmZvLmh0bWwiPnVkZGkyX19zZXJ2aWNlSW5mbzwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9pbmZvLmh0bWwjbzAiPm5hbWU8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfaW5mby5odG1sIj51ZGRpMl9fc2VydmljZUluZm88L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfaW5mby5odG1sI28xIj5zZXJ2aWNlS2V5PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2luZm8uaHRtbCI+dWRkaTJfX3NlcnZpY2VJbmZvPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2luZm8uaHRtbCNvMyI+c29hcDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9pbmZvLmh0bWwiPnVkZGkyX19zZXJ2aWNlSW5mbzwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNzowMCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3NlcnZpY2VfaW5mby5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2luZm8uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDlhN2U0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2luZm8uaHRtbApAQCAtMCwwICsxLDEzOSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogdWRkaTJfX3NlcnZpY2VJbmZvIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fc2VydmljZUluZm8gQ2xhc3MgUmVmZXJlbmNlPC9oMT5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92Mjoic2VydmljZUluZm8iLiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KKzxjb2RlPiNpbmNsdWRlICZsdDt1ZGRpX3YyLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KKzxhIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9pbmZvLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fbmFtZS5odG1sIj51ZGRpMl9fbmFtZTwvYT4gKiAmZ3Q7Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9pbmZvLmh0bWwjbzAiPm5hbWU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlZlY3RvciBvZiB1ZGRpMl9fbmFtZSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiAgPGEgaHJlZj0iI28wIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0Ij51ZGRpMl9fc2VydmljZUtleTwvYT4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2luZm8uaHRtbCNvMSI+c2VydmljZUtleTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIHNlcnZpY2VLZXkgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6c2VydmljZUtleS4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMyI+dWRkaTJfX2J1c2luZXNzS2V5PC9hPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfaW5mby5odG1sI28yIj5idXNpbmVzc0tleTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIGJ1c2luZXNzS2V5IG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOmJ1c2luZXNzS2V5LiAgPGEgaHJlZj0iI28yIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfaW5mby5odG1sI28zIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9pbmZvLmh0bWwjbzMiPnNvYXA8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiAgPGEgaHJlZj0iI28zIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzxocj48YSBuYW1lPSJfZGV0YWlscyI+PC9hPjxoMj5EZXRhaWxlZCBEZXNjcmlwdGlvbjwvaDI+DQorU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InNlcnZpY2VJbmZvIi4gDQorPHA+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMiIgZG94eXRhZz0idWRkaTJfX3NlcnZpY2VJbmZvOjpidXNpbmVzc0tleSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTMiPnVkZGkyX19idXNpbmVzc0tleTwvYT4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfaW5mby5odG1sI28yIj51ZGRpMl9fc2VydmljZUluZm86OmJ1c2luZXNzS2V5PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSBidXNpbmVzc0tleSBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpidXNpbmVzc0tleS4gDQorPHA+DQorUmVxdWlyZWQgYXR0cmlidXRlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJ1ZGRpMl9fc2VydmljZUluZm86Om5hbWUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RkOjp2ZWN0b3ImbHQ7PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX25hbWUuaHRtbCI+dWRkaTJfX25hbWU8L2E+KiAmZ3Q7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2luZm8uaHRtbCNvMCI+dWRkaTJfX3NlcnZpY2VJbmZvOjpuYW1lPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1ZlY3RvciBvZiB1ZGRpMl9fbmFtZSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0idWRkaTJfX3NlcnZpY2VJbmZvOjpzZXJ2aWNlS2V5IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNCI+dWRkaTJfX3NlcnZpY2VLZXk8L2E+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2luZm8uaHRtbCNvMSI+dWRkaTJfX3NlcnZpY2VJbmZvOjpzZXJ2aWNlS2V5PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSBzZXJ2aWNlS2V5IG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOnNlcnZpY2VLZXkuIA0KKzxwPg0KK1JlcXVpcmVkIGF0dHJpYnV0ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMyIgZG94eXRhZz0idWRkaTJfX3NlcnZpY2VJbmZvOjpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9pbmZvLmh0bWwjbzMiPnNvYXA8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9pbmZvLmh0bWwjbzMiPnVkZGkyX19zZXJ2aWNlSW5mbzo6c29hcDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvdWRkaTIvPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sIj51ZGRpX3YyLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNzowMCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3NlcnZpY2VfaW5mb3MtbWVtYmVycy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2luZm9zLW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzM3MzFlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2luZm9zLW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDE1IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fc2VydmljZUluZm9zIE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2luZm9zLmh0bWwiPnVkZGkyX19zZXJ2aWNlSW5mb3M8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2luZm9zLmh0bWwjbzAiPnNlcnZpY2VJbmZvPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2luZm9zLmh0bWwiPnVkZGkyX19zZXJ2aWNlSW5mb3M8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfaW5mb3MuaHRtbCNvMSI+c29hcDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9pbmZvcy5odG1sIj51ZGRpMl9fc2VydmljZUluZm9zPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE3OjAwIDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fc2VydmljZV9pbmZvcy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2luZm9zLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE0N2ZkNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fc2VydmljZV9pbmZvcy5odG1sCkBAIC0wLDAgKzEsODMgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IHVkZGkyX19zZXJ2aWNlSW5mb3MgQ2xhc3MgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19zZXJ2aWNlSW5mb3MgQ2xhc3MgUmVmZXJlbmNlPC9oMT5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92Mjoic2VydmljZUluZm9zIi4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7dWRkaV92Mi5oJmd0OzwvY29kZT4NCis8cD4NCis8YSBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfaW5mb3MtbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c3RkOjp2ZWN0b3ImbHQ7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2luZm8uaHRtbCI+dWRkaTJfX3NlcnZpY2VJbmZvPC9hPiAqICZndDsmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2luZm9zLmh0bWwjbzAiPnNlcnZpY2VJbmZvPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5WZWN0b3Igb2YgdWRkaTJfX3NlcnZpY2VJbmZvKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQuICA8YSBocmVmPSIjbzAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9pbmZvcy5odG1sI28xIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9pbmZvcy5odG1sI28xIj5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJzZXJ2aWNlSW5mb3MiLiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJ1ZGRpMl9fc2VydmljZUluZm9zOjpzZXJ2aWNlSW5mbyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdGQ6OnZlY3RvciZsdDs8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9pbmZvLmh0bWwiPnVkZGkyX19zZXJ2aWNlSW5mbzwvYT4qICZndDsgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfaW5mb3MuaHRtbCNvMCI+dWRkaTJfX3NlcnZpY2VJbmZvczo6c2VydmljZUluZm88L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVmVjdG9yIG9mIHVkZGkyX19zZXJ2aWNlSW5mbyogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0idWRkaTJfX3NlcnZpY2VJbmZvczo6c29hcCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfaW5mb3MuaHRtbCNvMSI+c29hcDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2luZm9zLmh0bWwjbzEiPnVkZGkyX19zZXJ2aWNlSW5mb3M6OnNvYXA8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3VkZGkyLzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCI+dWRkaV92Mi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTc6MDAgMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2xpc3QtbWVtYmVycy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2xpc3QtbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MmRhM2UKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3NlcnZpY2VfbGlzdC1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwxOCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX3NlcnZpY2VMaXN0IE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2xpc3QuaHRtbCI+dWRkaTJfX3NlcnZpY2VMaXN0PC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9saXN0Lmh0bWwjbzEiPmdlbmVyaWM8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfbGlzdC5odG1sIj51ZGRpMl9fc2VydmljZUxpc3Q8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfbGlzdC5odG1sI28yIj5vcGVyYXRvcl88L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfbGlzdC5odG1sIj51ZGRpMl9fc2VydmljZUxpc3Q8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfbGlzdC5odG1sI28wIj5zZXJ2aWNlSW5mb3M8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfbGlzdC5odG1sIj51ZGRpMl9fc2VydmljZUxpc3Q8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfbGlzdC5odG1sI280Ij5zb2FwPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2xpc3QuaHRtbCI+dWRkaTJfX3NlcnZpY2VMaXN0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2xpc3QuaHRtbCNvMyI+dHJ1bmNhdGVkPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2xpc3QuaHRtbCI+dWRkaTJfX3NlcnZpY2VMaXN0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE3OjAwIDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fc2VydmljZV9saXN0Lmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3NlcnZpY2VfbGlzdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MzY2NDAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3NlcnZpY2VfbGlzdC5odG1sCkBAIC0wLDAgKzEsMTY3IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiB1ZGRpMl9fc2VydmljZUxpc3QgQ2xhc3MgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19zZXJ2aWNlTGlzdCBDbGFzcyBSZWZlcmVuY2U8L2gxPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJzZXJ2aWNlTGlzdCIuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3VkZGlfdjIuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2xpc3QtbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfaW5mb3MuaHRtbCI+dWRkaTJfX3NlcnZpY2VJbmZvczwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfbGlzdC5odG1sI28wIj5zZXJ2aWNlSW5mb3M8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpzZXJ2aWNlSW5mb3MuICA8YSBocmVmPSIjbzAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2xpc3QuaHRtbCNvMSI+Z2VuZXJpYzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcuICA8YSBocmVmPSIjbzEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2xpc3QuaHRtbCNvMiI+b3BlcmF0b3JfPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgb3BlcmF0b3Igb2YgdHlwZSB4czpzdHJpbmcuICA8YSBocmVmPSIjbzIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5lbnVtIDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNDgiPnVkZGkyX190cnVuY2F0ZWQ8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2xpc3QuaHRtbCNvMyI+dHJ1bmNhdGVkPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgdHJ1bmNhdGVkIG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRydW5jYXRlZC4gIDxhIGhyZWY9IiNvMyI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2xpc3QuaHRtbCNvNCI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfbGlzdC5odG1sI280Ij5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvNCI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJzZXJ2aWNlTGlzdCIuIA0KKzxwPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9InVkZGkyX19zZXJ2aWNlTGlzdDo6Z2VuZXJpYyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9saXN0Lmh0bWwjbzEiPnVkZGkyX19zZXJ2aWNlTGlzdDo6Z2VuZXJpYzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZy4gDQorPHA+DQorUmVxdWlyZWQgYXR0cmlidXRlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJ1ZGRpMl9fc2VydmljZUxpc3Q6Om9wZXJhdG9yXyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9saXN0Lmh0bWwjbzIiPnVkZGkyX19zZXJ2aWNlTGlzdDo6b3BlcmF0b3JfPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSBvcGVyYXRvciBvZiB0eXBlIHhzOnN0cmluZy4gDQorPHA+DQorUmVxdWlyZWQgYXR0cmlidXRlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJ1ZGRpMl9fc2VydmljZUxpc3Q6OnNlcnZpY2VJbmZvcyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9pbmZvcy5odG1sIj51ZGRpMl9fc2VydmljZUluZm9zPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfbGlzdC5odG1sI28wIj51ZGRpMl9fc2VydmljZUxpc3Q6OnNlcnZpY2VJbmZvczwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6c2VydmljZUluZm9zLiANCis8cD4NCitSZXF1aXJlZCBlbGVtZW50ICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im80IiBkb3h5dGFnPSJ1ZGRpMl9fc2VydmljZUxpc3Q6OnNvYXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2xpc3QuaHRtbCNvNCI+c29hcDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2xpc3QuaHRtbCNvNCI+dWRkaTJfX3NlcnZpY2VMaXN0Ojpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMyIgZG94eXRhZz0idWRkaTJfX3NlcnZpY2VMaXN0Ojp0cnVuY2F0ZWQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gZW51bSA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQ4Ij51ZGRpMl9fdHJ1bmNhdGVkPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfbGlzdC5odG1sI28zIj51ZGRpMl9fc2VydmljZUxpc3Q6OnRydW5jYXRlZDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgdHJ1bmNhdGVkIG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRydW5jYXRlZC4gDQorPHA+DQorT3B0aW9uYWwgYXR0cmlidXRlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3VkZGkyLzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCI+dWRkaV92Mi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTc6MDAgMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19zZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLW1lbWJlcnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fc2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlmNWY0NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fc2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwyMCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zIE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwiPnVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMCI+YXV0aEluZm88L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCI+dWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzIiPmdlbmVyaWM8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCI+dWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzEiPnB1Ymxpc2hlckFzc2VydGlvbjwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sIj51ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNhMiI+c2VuZDwvYT4oY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKTwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwiPnVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28zIj5zb2FwPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwiPnVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI2EwIj51ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+KHN0cnVjdCBzb2FwICopPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCI+dWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjYTEiPnVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT4oc3RydWN0IHNvYXAgKiwgc3RkOjp2ZWN0b3ImbHQ7IHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24gKiAmZ3Q7IHB1Ymxpc2hlckFzc2VydGlvbnMpPC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCI+dWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE3OjAwIDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fc2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19zZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdiMjRmZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fc2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sCkBAIC0wLDAgKzEsMjgwIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiB1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgQ2xhc3MgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyBDbGFzcyBSZWZlcmVuY2U8L2gxPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJzZXRfcHVibGlzaGVyQXNzZXJ0aW9ucyIuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3VkZGlfdjIuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBNZW1iZXIgRnVuY3Rpb25zPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNhMCI+dWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPiAoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzMiPnNvYXA8L2E+ICopPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdC4gIDxhIGhyZWY9IiNhMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNhMSI+dWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPiAoc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzMiPnNvYXA8L2E+ICosIHN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbi5odG1sIj51ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uPC9hPiAqICZndDsgcHVibGlzaGVyQXNzZXJ0aW9ucyk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+TWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2ExIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwiPnVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI2EyIj5zZW5kPC9hPiAoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzAiPmF1dGhJbmZvPC9hPik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+TWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2EyIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMCI+YXV0aEluZm88L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjphdXRoSW5mby4gIDxhIGhyZWY9IiNvMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbi5odG1sIj51ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uPC9hPiAqICZndDsmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzEiPnB1Ymxpc2hlckFzc2VydGlvbjwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VmVjdG9yIG9mIHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMiI+Z2VuZXJpYzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcuICA8YSBocmVmPSIjbzIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28zIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28zIj5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvMyI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJzZXRfcHVibGlzaGVyQXNzZXJ0aW9ucyIuIA0KKzxwPg0KK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIG1vZGlmeSB0aGUgZXhpc3RpbmcgcHVibGlzaGVyIGFzc2VydGlvbnMgZm9yIGFuIGluZGl2aWR1YWwgcHVibGlzaGVyLjxwPg0KK1NlZSAgPGEgaHJlZj0iaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzc0NiI+aHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzc0NjwvYT4gDQorPHA+DQorPGhyPjxoMj5Db25zdHJ1Y3RvciAmYW1wOyBEZXN0cnVjdG9yIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEwIiBkb3h5dGFnPSJ1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM6OnVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM6OnVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28zIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiA8ZW0+c29hcDwvZW0+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5nU09BUCBjb250ZXh0PC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zIGNsYXNzLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMSIgZG94eXRhZz0idWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjp1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjp1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMyI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbi5odG1sIj51ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uPC9hPiAqICZndDsmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+cHVibGlzaGVyQXNzZXJ0aW9uczwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmdTT0FQIGNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5wdWJsaXNoZXJBc3NlcnRpb25zPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb2xsZWN0aW9uIG9mIHB1Ymxpc2hlciBhc3NlcnRpb25zPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBvZiBwdWJsaXNoZXIgYXNzZXJ0aW9ucy4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPjxoMj5NZW1iZXIgRnVuY3Rpb24gRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTIiIGRveHl0YWc9InVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczo6c2VuZCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCI+dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnM8L2E+ICogdWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjpzZW5kICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmVuZHBvaW50PC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5hdXRoSW5mbzwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmVuZHBvaW50PC9lbT4mbmJzcDs8L3RkPjx0ZD5VUkwgb2YgdGhlIFVEREkgc2VydmVyIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+YXV0aEluZm88L2VtPiZuYnNwOzwvdGQ+PHRkPmF1dGhvcml6YXRpb24gdG9rZW4gcHJvdmlkZWQgYnkgdGhlIFVEREkgc2VydmVyIDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+QSBwb2ludGVyIHRvIGEgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwiPnVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zPC9hPiBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcjwvZGQ+PC9kbD4NCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmVyIHRvIHBvc3QgdE1vZGVsIGluZm9ybWF0aW9uIG9uIHRoZSBzZXJ2ZXIuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczo6YXV0aEluZm8iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMCI+dWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjphdXRoSW5mbzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YXV0aEluZm8uIA0KKzxwPg0KK1JlcXVpcmVkIGVsZW1lbnQgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9InVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczo6Z2VuZXJpYyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28yIj51ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM6OmdlbmVyaWM8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcuIA0KKzxwPg0KK1JlcXVpcmVkIGF0dHJpYnV0ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0idWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjpwdWJsaXNoZXJBc3NlcnRpb24iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RkOjp2ZWN0b3ImbHQ7PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb24uaHRtbCI+dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbjwvYT4qJmd0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28xIj51ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM6OnB1Ymxpc2hlckFzc2VydGlvbjwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitWZWN0b3Igb2YgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbiogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMyIgZG94eXRhZz0idWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28zIj5zb2FwPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMyI+dWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE3OjAwIDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fc2hhcmVkX3JlbGF0aW9uc2hpcHMtbWVtYmVycy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19zaGFyZWRfcmVsYXRpb25zaGlwcy1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhmODRkOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fc2hhcmVkX3JlbGF0aW9uc2hpcHMtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTYgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzIE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zaGFyZWRfcmVsYXRpb25zaGlwcy5odG1sIj51ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwczwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NoYXJlZF9yZWxhdGlvbnNoaXBzLmh0bWwjbzEiPmRpcmVjdGlvbjwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2hhcmVkX3JlbGF0aW9uc2hpcHMuaHRtbCI+dWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHM8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NoYXJlZF9yZWxhdGlvbnNoaXBzLmh0bWwjbzAiPmtleWVkUmVmZXJlbmNlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zaGFyZWRfcmVsYXRpb25zaGlwcy5odG1sIj51ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwczwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2hhcmVkX3JlbGF0aW9uc2hpcHMuaHRtbCNvMiI+c29hcDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2hhcmVkX3JlbGF0aW9uc2hpcHMuaHRtbCI+dWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHM8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTc6MDAgMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19zaGFyZWRfcmVsYXRpb25zaGlwcy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX19zaGFyZWRfcmVsYXRpb25zaGlwcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MWU2ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3NoYXJlZF9yZWxhdGlvbnNoaXBzLmh0bWwKQEAgLTAsMCArMSwxMTEgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IHVkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyBDbGFzcyBSZWZlcmVuY2U8L2gxPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJzaGFyZWRSZWxhdGlvbnNoaXBzIi4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7dWRkaV92Mi5oJmd0OzwvY29kZT4NCis8cD4NCis8YSBocmVmPSJjbGFzc3VkZGkyX19fX3NoYXJlZF9yZWxhdGlvbnNoaXBzLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fa2V5ZWRfcmVmZXJlbmNlLmh0bWwiPnVkZGkyX19rZXllZFJlZmVyZW5jZTwvYT4gKiAmZ3Q7Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2hhcmVkX3JlbGF0aW9uc2hpcHMuaHRtbCNvMCI+a2V5ZWRSZWZlcmVuY2U8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlZlY3RvciBvZiB1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gIDxhIGhyZWY9IiNvMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmVudW0gPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0NyI+dWRkaTJfX2RpcmVjdGlvbjwvYT4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zaGFyZWRfcmVsYXRpb25zaGlwcy5odG1sI28xIj5kaXJlY3Rpb248L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkF0dHJpYnV0ZSBkaXJlY3Rpb24gb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6ZGlyZWN0aW9uLiAgPGEgaHJlZj0iI28xIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NoYXJlZF9yZWxhdGlvbnNoaXBzLmh0bWwjbzIiPnNvYXA8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zaGFyZWRfcmVsYXRpb25zaGlwcy5odG1sI28yIj5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvMiI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJzaGFyZWRSZWxhdGlvbnNoaXBzIi4gDQorPHA+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0idWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHM6OmRpcmVjdGlvbiIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBlbnVtIDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNDciPnVkZGkyX19kaXJlY3Rpb248L2E+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zaGFyZWRfcmVsYXRpb25zaGlwcy5odG1sI28xIj51ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwczo6ZGlyZWN0aW9uPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSBkaXJlY3Rpb24gb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6ZGlyZWN0aW9uLiANCis8cD4NCitSZXF1aXJlZCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InVkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzOjprZXllZFJlZmVyZW5jZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdGQ6OnZlY3RvciZsdDs8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fa2V5ZWRfcmVmZXJlbmNlLmh0bWwiPnVkZGkyX19rZXllZFJlZmVyZW5jZTwvYT4qICZndDsgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NoYXJlZF9yZWxhdGlvbnNoaXBzLmh0bWwjbzAiPnVkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzOjprZXllZFJlZmVyZW5jZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitWZWN0b3Igb2YgdWRkaTJfX2tleWVkUmVmZXJlbmNlKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJ1ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwczo6c29hcCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NoYXJlZF9yZWxhdGlvbnNoaXBzLmh0bWwjbzIiPnNvYXA8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2hhcmVkX3JlbGF0aW9uc2hpcHMuaHRtbCNvMiI+dWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHM6OnNvYXA8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3VkZGkyLzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCI+dWRkaV92Mi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTc6MDAgMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX190X21vZGVsLW1lbWJlcnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fdF9tb2RlbC1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMzYmM1MwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fdF9tb2RlbC1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwyMiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX3RNb2RlbCBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbC5odG1sIj51ZGRpMl9fdE1vZGVsPC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbC5odG1sI283Ij5hdXRob3JpemVkTmFtZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbC5odG1sIj51ZGRpMl9fdE1vZGVsPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsLmh0bWwjbzQiPmNhdGVnb3J5QmFnPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsLmh0bWwiPnVkZGkyX190TW9kZWw8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWwuaHRtbCNvMSI+ZGVzY3JpcHRpb248L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWwuaHRtbCI+dWRkaTJfX3RNb2RlbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbC5odG1sI28zIj5pZGVudGlmaWVyQmFnPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsLmh0bWwiPnVkZGkyX190TW9kZWw8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWwuaHRtbCNvMCI+bmFtZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbC5odG1sIj51ZGRpMl9fdE1vZGVsPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsLmh0bWwjbzYiPm9wZXJhdG9yXzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbC5odG1sIj51ZGRpMl9fdE1vZGVsPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsLmh0bWwjbzIiPm92ZXJ2aWV3RG9jPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsLmh0bWwiPnVkZGkyX190TW9kZWw8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWwuaHRtbCNvOCI+c29hcDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbC5odG1sIj51ZGRpMl9fdE1vZGVsPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsLmh0bWwjbzUiPnRNb2RlbEtleTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbC5odG1sIj51ZGRpMl9fdE1vZGVsPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE3OjAwIDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fdF9tb2RlbC5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX190X21vZGVsLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMxMzk5OAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fdF9tb2RlbC5odG1sCkBAIC0wLDAgKzEsMjc5IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiB1ZGRpMl9fdE1vZGVsIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fdE1vZGVsIENsYXNzIFJlZmVyZW5jZTwvaDE+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InRNb2RlbCIuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3VkZGlfdjIuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19uYW1lLmh0bWwiPnVkZGkyX19uYW1lPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbC5odG1sI28wIj5uYW1lPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5FbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6bmFtZS4gIDxhIGhyZWY9IiNvMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVzY3JpcHRpb24uaHRtbCI+dWRkaTJfX2Rlc2NyaXB0aW9uPC9hPiAqICZndDsmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsLmh0bWwjbzEiPmRlc2NyaXB0aW9uPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5WZWN0b3Igb2YgdWRkaTJfX2Rlc2NyaXB0aW9uKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQuICA8YSBocmVmPSIjbzEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fb3ZlcnZpZXdfZG9jLmh0bWwiPnVkZGkyX19vdmVydmlld0RvYzwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWwuaHRtbCNvMiI+b3ZlcnZpZXdEb2M8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpvdmVydmlld0RvYy4gIDxhIGhyZWY9IiNvMiI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19pZGVudGlmaWVyX2JhZy5odG1sIj51ZGRpMl9faWRlbnRpZmllckJhZzwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWwuaHRtbCNvMyI+aWRlbnRpZmllckJhZzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+RWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmlkZW50aWZpZXJCYWcuICA8YSBocmVmPSIjbzMiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fY2F0ZWdvcnlfYmFnLmh0bWwiPnVkZGkyX19jYXRlZ29yeUJhZzwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWwuaHRtbCNvNCI+Y2F0ZWdvcnlCYWc8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpjYXRlZ29yeUJhZy4gIDxhIGhyZWY9IiNvNCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNSI+dWRkaTJfX3RNb2RlbEtleTwvYT4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsLmh0bWwjbzUiPnRNb2RlbEtleTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIHRNb2RlbEtleSBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0TW9kZWxLZXkuICA8YSBocmVmPSIjbzUiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsLmh0bWwjbzYiPm9wZXJhdG9yXzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIG9wZXJhdG9yIG9mIHR5cGUgeHM6c3RyaW5nLiAgPGEgaHJlZj0iI282Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbC5odG1sI283Ij5hdXRob3JpemVkTmFtZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIGF1dGhvcml6ZWROYW1lIG9mIHR5cGUgeHM6c3RyaW5nLiAgPGEgaHJlZj0iI283Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWwuaHRtbCNvOCI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWwuaHRtbCNvOCI+c29hcDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuICA8YSBocmVmPSIjbzgiPjwvYT48YnI+PC90ZD48L3RyPg0KKzwvdGFibGU+DQorPGhyPjxhIG5hbWU9Il9kZXRhaWxzIj48L2E+PGgyPkRldGFpbGVkIERlc2NyaXB0aW9uPC9oMj4NCitTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoidE1vZGVsIi4gDQorPHA+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNyIgZG94eXRhZz0idWRkaTJfX3RNb2RlbDo6YXV0aG9yaXplZE5hbWUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWwuaHRtbCNvNyI+dWRkaTJfX3RNb2RlbDo6YXV0aG9yaXplZE5hbWU8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIGF1dGhvcml6ZWROYW1lIG9mIHR5cGUgeHM6c3RyaW5nLiANCis8cD4NCitPcHRpb25hbCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzQiIGRveHl0YWc9InVkZGkyX190TW9kZWw6OmNhdGVnb3J5QmFnIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19jYXRlZ29yeV9iYWcuaHRtbCI+dWRkaTJfX2NhdGVnb3J5QmFnPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWwuaHRtbCNvNCI+dWRkaTJfX3RNb2RlbDo6Y2F0ZWdvcnlCYWc8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmNhdGVnb3J5QmFnLiANCis8cD4NCitPcHRpb25hbCBlbGVtZW50ICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJ1ZGRpMl9fdE1vZGVsOjpkZXNjcmlwdGlvbiIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdGQ6OnZlY3RvciZsdDs8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVzY3JpcHRpb24uaHRtbCI+dWRkaTJfX2Rlc2NyaXB0aW9uPC9hPiogJmd0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbC5odG1sI28xIj51ZGRpMl9fdE1vZGVsOjpkZXNjcmlwdGlvbjwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitWZWN0b3Igb2YgdWRkaTJfX2Rlc2NyaXB0aW9uKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8zIiBkb3h5dGFnPSJ1ZGRpMl9fdE1vZGVsOjppZGVudGlmaWVyQmFnIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19pZGVudGlmaWVyX2JhZy5odG1sIj51ZGRpMl9faWRlbnRpZmllckJhZzwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsLmh0bWwjbzMiPnVkZGkyX190TW9kZWw6OmlkZW50aWZpZXJCYWc8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmlkZW50aWZpZXJCYWcuIA0KKzxwPg0KK09wdGlvbmFsIGVsZW1lbnQgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InVkZGkyX190TW9kZWw6Om5hbWUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX25hbWUuaHRtbCI+dWRkaTJfX25hbWU8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbC5odG1sI28wIj51ZGRpMl9fdE1vZGVsOjpuYW1lPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0VsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpuYW1lLiANCis8cD4NCitSZXF1aXJlZCBlbGVtZW50ICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im82IiBkb3h5dGFnPSJ1ZGRpMl9fdE1vZGVsOjpvcGVyYXRvcl8iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWwuaHRtbCNvNiI+dWRkaTJfX3RNb2RlbDo6b3BlcmF0b3JfPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSBvcGVyYXRvciBvZiB0eXBlIHhzOnN0cmluZy4gDQorPHA+DQorT3B0aW9uYWwgYXR0cmlidXRlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJ1ZGRpMl9fdE1vZGVsOjpvdmVydmlld0RvYyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fb3ZlcnZpZXdfZG9jLmh0bWwiPnVkZGkyX19vdmVydmlld0RvYzwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsLmh0bWwjbzIiPnVkZGkyX190TW9kZWw6Om92ZXJ2aWV3RG9jPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0VsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpvdmVydmlld0RvYy4gDQorPHA+DQorT3B0aW9uYWwgZWxlbWVudCAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvOCIgZG94eXRhZz0idWRkaTJfX3RNb2RlbDo6c29hcCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWwuaHRtbCNvOCI+c29hcDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsLmh0bWwjbzgiPnVkZGkyX190TW9kZWw6OnNvYXA8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im81IiBkb3h5dGFnPSJ1ZGRpMl9fdE1vZGVsOjp0TW9kZWxLZXkiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E1Ij51ZGRpMl9fdE1vZGVsS2V5PC9hPiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbC5odG1sI281Ij51ZGRpMl9fdE1vZGVsOjp0TW9kZWxLZXk8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIHRNb2RlbEtleSBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0TW9kZWxLZXkuIA0KKzxwPg0KK1JlcXVpcmVkIGF0dHJpYnV0ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE3OjAwIDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fdF9tb2RlbF9iYWctbWVtYmVycy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX190X21vZGVsX2JhZy1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk3NzQxMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fdF9tb2RlbF9iYWctbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX190TW9kZWxCYWcgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfYmFnLmh0bWwiPnVkZGkyX190TW9kZWxCYWc8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2JhZy5odG1sI28xIj5zb2FwPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2JhZy5odG1sIj51ZGRpMl9fdE1vZGVsQmFnPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2JhZy5odG1sI28wIj50TW9kZWxLZXk8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfYmFnLmh0bWwiPnVkZGkyX190TW9kZWxCYWc8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTc6MDAgMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX190X21vZGVsX2JhZy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX190X21vZGVsX2JhZy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYWYzYzIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3RfbW9kZWxfYmFnLmh0bWwKQEAgLTAsMCArMSw4MyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogdWRkaTJfX3RNb2RlbEJhZyBDbGFzcyBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX3RNb2RlbEJhZyBDbGFzcyBSZWZlcmVuY2U8L2gxPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJ0TW9kZWxCYWciLiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KKzxjb2RlPiNpbmNsdWRlICZsdDt1ZGRpX3YyLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KKzxhIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9iYWctbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c3RkOjp2ZWN0b3ImbHQ7IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNSI+dWRkaTJfX3RNb2RlbEtleTwvYT4gJmd0OyZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfYmFnLmh0bWwjbzAiPnRNb2RlbEtleTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VmVjdG9yIG9mIHVkZGkyX190TW9kZWxLZXkgd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiAgPGEgaHJlZj0iI28wIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfYmFnLmh0bWwjbzEiPnNvYXA8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2JhZy5odG1sI28xIj5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJ0TW9kZWxCYWciLiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJ1ZGRpMl9fdE1vZGVsQmFnOjpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9iYWcuaHRtbCNvMSI+c29hcDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2JhZy5odG1sI28xIj51ZGRpMl9fdE1vZGVsQmFnOjpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0idWRkaTJfX3RNb2RlbEJhZzo6dE1vZGVsS2V5IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0ZDo6dmVjdG9yJmx0OzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNSI+dWRkaTJfX3RNb2RlbEtleTwvYT4gJmd0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9iYWcuaHRtbCNvMCI+dWRkaTJfX3RNb2RlbEJhZzo6dE1vZGVsS2V5PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1ZlY3RvciBvZiB1ZGRpMl9fdE1vZGVsS2V5IHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvdWRkaTIvPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sIj51ZGRpX3YyLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNzowMCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3RfbW9kZWxfZGV0YWlsLW1lbWJlcnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fdF9tb2RlbF9kZXRhaWwtbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMjk2NWMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3RfbW9kZWxfZGV0YWlsLW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDE4IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fdE1vZGVsRGV0YWlsIE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2RldGFpbC5odG1sIj51ZGRpMl9fdE1vZGVsRGV0YWlsPC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9kZXRhaWwuaHRtbCNvMSI+Z2VuZXJpYzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9kZXRhaWwuaHRtbCI+dWRkaTJfX3RNb2RlbERldGFpbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9kZXRhaWwuaHRtbCNvMiI+b3BlcmF0b3JfPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2RldGFpbC5odG1sIj51ZGRpMl9fdE1vZGVsRGV0YWlsPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2RldGFpbC5odG1sI280Ij5zb2FwPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2RldGFpbC5odG1sIj51ZGRpMl9fdE1vZGVsRGV0YWlsPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2RldGFpbC5odG1sI28wIj50TW9kZWw8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfZGV0YWlsLmh0bWwiPnVkZGkyX190TW9kZWxEZXRhaWw8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfZGV0YWlsLmh0bWwjbzMiPnRydW5jYXRlZDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9kZXRhaWwuaHRtbCI+dWRkaTJfX3RNb2RlbERldGFpbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNzowMCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3RfbW9kZWxfZGV0YWlsLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3RfbW9kZWxfZGV0YWlsLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE5NzgxOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fdF9tb2RlbF9kZXRhaWwuaHRtbApAQCAtMCwwICsxLDE2NyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogdWRkaTJfX3RNb2RlbERldGFpbCBDbGFzcyBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX3RNb2RlbERldGFpbCBDbGFzcyBSZWZlcmVuY2U8L2gxPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJ0TW9kZWxEZXRhaWwiLiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KKzxjb2RlPiNpbmNsdWRlICZsdDt1ZGRpX3YyLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KKzxhIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9kZXRhaWwtbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c3RkOjp2ZWN0b3ImbHQ7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsLmh0bWwiPnVkZGkyX190TW9kZWw8L2E+ICogJmd0OyZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfZGV0YWlsLmh0bWwjbzAiPnRNb2RlbDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VmVjdG9yIG9mIHVkZGkyX190TW9kZWwqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gIDxhIGhyZWY9IiNvMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfZGV0YWlsLmh0bWwjbzEiPmdlbmVyaWM8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nLiAgPGEgaHJlZj0iI28xIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9kZXRhaWwuaHRtbCNvMiI+b3BlcmF0b3JfPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgb3BlcmF0b3Igb2YgdHlwZSB4czpzdHJpbmcuICA8YSBocmVmPSIjbzIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5lbnVtIDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNDgiPnVkZGkyX190cnVuY2F0ZWQ8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2RldGFpbC5odG1sI28zIj50cnVuY2F0ZWQ8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkF0dHJpYnV0ZSB0cnVuY2F0ZWQgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dHJ1bmNhdGVkLiAgPGEgaHJlZj0iI28zIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfZGV0YWlsLmh0bWwjbzQiPnNvYXA8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2RldGFpbC5odG1sI280Ij5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvNCI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJ0TW9kZWxEZXRhaWwiLiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJ1ZGRpMl9fdE1vZGVsRGV0YWlsOjpnZW5lcmljIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2RldGFpbC5odG1sI28xIj51ZGRpMl9fdE1vZGVsRGV0YWlsOjpnZW5lcmljPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nLiANCis8cD4NCitSZXF1aXJlZCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9InVkZGkyX190TW9kZWxEZXRhaWw6Om9wZXJhdG9yXyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9kZXRhaWwuaHRtbCNvMiI+dWRkaTJfX3RNb2RlbERldGFpbDo6b3BlcmF0b3JfPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSBvcGVyYXRvciBvZiB0eXBlIHhzOnN0cmluZy4gDQorPHA+DQorUmVxdWlyZWQgYXR0cmlidXRlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im80IiBkb3h5dGFnPSJ1ZGRpMl9fdE1vZGVsRGV0YWlsOjpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9kZXRhaWwuaHRtbCNvNCI+c29hcDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2RldGFpbC5odG1sI280Ij51ZGRpMl9fdE1vZGVsRGV0YWlsOjpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0idWRkaTJfX3RNb2RlbERldGFpbDo6dE1vZGVsIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0ZDo6dmVjdG9yJmx0OzxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsLmh0bWwiPnVkZGkyX190TW9kZWw8L2E+KiAmZ3Q7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2RldGFpbC5odG1sI28wIj51ZGRpMl9fdE1vZGVsRGV0YWlsOjp0TW9kZWw8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVmVjdG9yIG9mIHVkZGkyX190TW9kZWwqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzMiIGRveHl0YWc9InVkZGkyX190TW9kZWxEZXRhaWw6OnRydW5jYXRlZCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBlbnVtIDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNDgiPnVkZGkyX190cnVuY2F0ZWQ8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9kZXRhaWwuaHRtbCNvMyI+dWRkaTJfX3RNb2RlbERldGFpbDo6dHJ1bmNhdGVkPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSB0cnVuY2F0ZWQgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dHJ1bmNhdGVkLiANCis8cD4NCitPcHRpb25hbCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvdWRkaTIvPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sIj51ZGRpX3YyLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNzowMCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5mby1tZW1iZXJzLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5mby1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVkYzZjZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fdF9tb2RlbF9pbmZvLW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDE2IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fdE1vZGVsSW5mbyBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbmZvLmh0bWwiPnVkZGkyX190TW9kZWxJbmZvPC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbmZvLmh0bWwjbzAiPm5hbWU8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5mby5odG1sIj51ZGRpMl9fdE1vZGVsSW5mbzwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbmZvLmh0bWwjbzIiPnNvYXA8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5mby5odG1sIj51ZGRpMl9fdE1vZGVsSW5mbzwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbmZvLmh0bWwjbzEiPnRNb2RlbEtleTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbmZvLmh0bWwiPnVkZGkyX190TW9kZWxJbmZvPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE3OjAwIDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fdF9tb2RlbF9pbmZvLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5mby5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNmI5ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5mby5odG1sCkBAIC0wLDAgKzEsMTExIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiB1ZGRpMl9fdE1vZGVsSW5mbyBDbGFzcyBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX3RNb2RlbEluZm8gQ2xhc3MgUmVmZXJlbmNlPC9oMT5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoidE1vZGVsSW5mbyIuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3VkZGlfdjIuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luZm8tbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX25hbWUuaHRtbCI+dWRkaTJfX25hbWU8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luZm8uaHRtbCNvMCI+bmFtZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+RWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOm5hbWUuICA8YSBocmVmPSIjbzAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTUiPnVkZGkyX190TW9kZWxLZXk8L2E+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbmZvLmh0bWwjbzEiPnRNb2RlbEtleTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIHRNb2RlbEtleSBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0TW9kZWxLZXkuICA8YSBocmVmPSIjbzEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbmZvLmh0bWwjbzIiPnNvYXA8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luZm8uaHRtbCNvMiI+c29hcDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuICA8YSBocmVmPSIjbzIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzwvdGFibGU+DQorPGhyPjxhIG5hbWU9Il9kZXRhaWxzIj48L2E+PGgyPkRldGFpbGVkIERlc2NyaXB0aW9uPC9oMj4NCitTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoidE1vZGVsSW5mbyIuIA0KKzxwPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InVkZGkyX190TW9kZWxJbmZvOjpuYW1lIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19uYW1lLmh0bWwiPnVkZGkyX19uYW1lPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5mby5odG1sI28wIj51ZGRpMl9fdE1vZGVsSW5mbzo6bmFtZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6bmFtZS4gDQorPHA+DQorUmVxdWlyZWQgZWxlbWVudCAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMiIgZG94eXRhZz0idWRkaTJfX3RNb2RlbEluZm86OnNvYXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luZm8uaHRtbCNvMiI+c29hcDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luZm8uaHRtbCNvMiI+dWRkaTJfX3RNb2RlbEluZm86OnNvYXA8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJ1ZGRpMl9fdE1vZGVsSW5mbzo6dE1vZGVsS2V5IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNSI+dWRkaTJfX3RNb2RlbEtleTwvYT4gPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5mby5odG1sI28xIj51ZGRpMl9fdE1vZGVsSW5mbzo6dE1vZGVsS2V5PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSB0TW9kZWxLZXkgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dE1vZGVsS2V5LiANCis8cD4NCitSZXF1aXJlZCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvdWRkaTIvPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sIj51ZGRpX3YyLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNzowMCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5mb3MtbWVtYmVycy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX190X21vZGVsX2luZm9zLW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjRhMjAwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX190X21vZGVsX2luZm9zLW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDE1IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fdE1vZGVsSW5mb3MgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5mb3MuaHRtbCI+dWRkaTJfX3RNb2RlbEluZm9zPC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbmZvcy5odG1sI28xIj5zb2FwPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luZm9zLmh0bWwiPnVkZGkyX190TW9kZWxJbmZvczwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbmZvcy5odG1sI28wIj50TW9kZWxJbmZvPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luZm9zLmh0bWwiPnVkZGkyX190TW9kZWxJbmZvczwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNzowMCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5mb3MuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fdF9tb2RlbF9pbmZvcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MDY3YWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5mb3MuaHRtbApAQCAtMCwwICsxLDgzIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiB1ZGRpMl9fdE1vZGVsSW5mb3MgQ2xhc3MgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX190TW9kZWxJbmZvcyBDbGFzcyBSZWZlcmVuY2U8L2gxPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJ0TW9kZWxJbmZvcyIuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3VkZGlfdjIuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luZm9zLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbmZvLmh0bWwiPnVkZGkyX190TW9kZWxJbmZvPC9hPiAqICZndDsmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luZm9zLmh0bWwjbzAiPnRNb2RlbEluZm88L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlZlY3RvciBvZiB1ZGRpMl9fdE1vZGVsSW5mbyogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiAgPGEgaHJlZj0iI28wIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5mb3MuaHRtbCNvMSI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5mb3MuaHRtbCNvMSI+c29hcDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuICA8YSBocmVmPSIjbzEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzwvdGFibGU+DQorPGhyPjxhIG5hbWU9Il9kZXRhaWxzIj48L2E+PGgyPkRldGFpbGVkIERlc2NyaXB0aW9uPC9oMj4NCitTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoidE1vZGVsSW5mb3MiLiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJ1ZGRpMl9fdE1vZGVsSW5mb3M6OnNvYXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luZm9zLmh0bWwjbzEiPnNvYXA8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbmZvcy5odG1sI28xIj51ZGRpMl9fdE1vZGVsSW5mb3M6OnNvYXA8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJ1ZGRpMl9fdE1vZGVsSW5mb3M6OnRNb2RlbEluZm8iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RkOjp2ZWN0b3ImbHQ7PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5mby5odG1sIj51ZGRpMl9fdE1vZGVsSW5mbzwvYT4qICZndDsgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5mb3MuaHRtbCNvMCI+dWRkaTJfX3RNb2RlbEluZm9zOjp0TW9kZWxJbmZvPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1ZlY3RvciBvZiB1ZGRpMl9fdE1vZGVsSW5mbyogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE3OjAwIDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fdF9tb2RlbF9pbnN0YW5jZV9kZXRhaWxzLW1lbWJlcnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fdF9tb2RlbF9pbnN0YW5jZV9kZXRhaWxzLW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmI2NDY0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX190X21vZGVsX2luc3RhbmNlX2RldGFpbHMtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX190TW9kZWxJbnN0YW5jZURldGFpbHMgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5zdGFuY2VfZGV0YWlscy5odG1sIj51ZGRpMl9fdE1vZGVsSW5zdGFuY2VEZXRhaWxzPC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbnN0YW5jZV9kZXRhaWxzLmh0bWwjbzEiPnNvYXA8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5zdGFuY2VfZGV0YWlscy5odG1sIj51ZGRpMl9fdE1vZGVsSW5zdGFuY2VEZXRhaWxzPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luc3RhbmNlX2RldGFpbHMuaHRtbCNvMCI+dE1vZGVsSW5zdGFuY2VJbmZvPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luc3RhbmNlX2RldGFpbHMuaHRtbCI+dWRkaTJfX3RNb2RlbEluc3RhbmNlRGV0YWlsczwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNzowMCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5zdGFuY2VfZGV0YWlscy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX190X21vZGVsX2luc3RhbmNlX2RldGFpbHMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWQxNzg5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX190X21vZGVsX2luc3RhbmNlX2RldGFpbHMuaHRtbApAQCAtMCwwICsxLDgzIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiB1ZGRpMl9fdE1vZGVsSW5zdGFuY2VEZXRhaWxzIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fdE1vZGVsSW5zdGFuY2VEZXRhaWxzIENsYXNzIFJlZmVyZW5jZTwvaDE+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InRNb2RlbEluc3RhbmNlRGV0YWlscyIuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3VkZGlfdjIuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luc3RhbmNlX2RldGFpbHMtbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c3RkOjp2ZWN0b3ImbHQ7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luc3RhbmNlX2luZm8uaHRtbCI+dWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbzwvYT4gKiAmZ3Q7Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbnN0YW5jZV9kZXRhaWxzLmh0bWwjbzAiPnRNb2RlbEluc3RhbmNlSW5mbzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VmVjdG9yIG9mIHVkZGkyX190TW9kZWxJbnN0YW5jZUluZm8qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gIDxhIGhyZWY9IiNvMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luc3RhbmNlX2RldGFpbHMuaHRtbCNvMSI+c29hcDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5zdGFuY2VfZGV0YWlscy5odG1sI28xIj5zb2FwPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1NjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJ0TW9kZWxJbnN0YW5jZURldGFpbHMiLiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJ1ZGRpMl9fdE1vZGVsSW5zdGFuY2VEZXRhaWxzOjpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbnN0YW5jZV9kZXRhaWxzLmh0bWwjbzEiPnNvYXA8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbnN0YW5jZV9kZXRhaWxzLmh0bWwjbzEiPnVkZGkyX190TW9kZWxJbnN0YW5jZURldGFpbHM6OnNvYXA8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJ1ZGRpMl9fdE1vZGVsSW5zdGFuY2VEZXRhaWxzOjp0TW9kZWxJbnN0YW5jZUluZm8iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RkOjp2ZWN0b3ImbHQ7PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5zdGFuY2VfaW5mby5odG1sIj51ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvPC9hPiomZ3Q7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luc3RhbmNlX2RldGFpbHMuaHRtbCNvMCI+dWRkaTJfX3RNb2RlbEluc3RhbmNlRGV0YWlsczo6dE1vZGVsSW5zdGFuY2VJbmZvPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1ZlY3RvciBvZiB1ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3VkZGkyLzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCI+dWRkaV92Mi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTc6MDAgMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX190X21vZGVsX2luc3RhbmNlX2luZm8tbWVtYmVycy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX190X21vZGVsX2luc3RhbmNlX2luZm8tbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNjMwZDAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5zdGFuY2VfaW5mby1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwxNyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbnN0YW5jZV9pbmZvLmh0bWwiPnVkZGkyX190TW9kZWxJbnN0YW5jZUluZm88L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luc3RhbmNlX2luZm8uaHRtbCNvMCI+ZGVzY3JpcHRpb248L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5zdGFuY2VfaW5mby5odG1sIj51ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luc3RhbmNlX2luZm8uaHRtbCNvMSI+aW5zdGFuY2VEZXRhaWxzPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luc3RhbmNlX2luZm8uaHRtbCI+dWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbzwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbnN0YW5jZV9pbmZvLmh0bWwjbzMiPnNvYXA8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5zdGFuY2VfaW5mby5odG1sIj51ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luc3RhbmNlX2luZm8uaHRtbCNvMiI+dE1vZGVsS2V5PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luc3RhbmNlX2luZm8uaHRtbCI+dWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbzwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNzowMCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5zdGFuY2VfaW5mby5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX190X21vZGVsX2luc3RhbmNlX2luZm8uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2QxNmY0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX190X21vZGVsX2luc3RhbmNlX2luZm8uaHRtbApAQCAtMCwwICsxLDEzOSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyBDbGFzcyBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyBDbGFzcyBSZWZlcmVuY2U8L2gxPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJ0TW9kZWxJbnN0YW5jZUluZm8iLiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KKzxjb2RlPiNpbmNsdWRlICZsdDt1ZGRpX3YyLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KKzxhIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbnN0YW5jZV9pbmZvLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVzY3JpcHRpb24uaHRtbCI+dWRkaTJfX2Rlc2NyaXB0aW9uPC9hPiAqICZndDsmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luc3RhbmNlX2luZm8uaHRtbCNvMCI+ZGVzY3JpcHRpb248L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlZlY3RvciBvZiB1ZGRpMl9fZGVzY3JpcHRpb24qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gIDxhIGhyZWY9IiNvMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19pbnN0YW5jZV9kZXRhaWxzLmh0bWwiPnVkZGkyX19pbnN0YW5jZURldGFpbHM8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luc3RhbmNlX2luZm8uaHRtbCNvMSI+aW5zdGFuY2VEZXRhaWxzPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5FbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6aW5zdGFuY2VEZXRhaWxzLiAgPGEgaHJlZj0iI28xIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E1Ij51ZGRpMl9fdE1vZGVsS2V5PC9hPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5zdGFuY2VfaW5mby5odG1sI28yIj50TW9kZWxLZXk8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkF0dHJpYnV0ZSB0TW9kZWxLZXkgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dE1vZGVsS2V5LiAgPGEgaHJlZj0iI28yIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5zdGFuY2VfaW5mby5odG1sI28zIj5zb2FwPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbnN0YW5jZV9pbmZvLmh0bWwjbzMiPnNvYXA8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiAgPGEgaHJlZj0iI28zIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzxocj48YSBuYW1lPSJfZGV0YWlscyI+PC9hPjxoMj5EZXRhaWxlZCBEZXNjcmlwdGlvbjwvaDI+DQorU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InRNb2RlbEluc3RhbmNlSW5mbyIuIA0KKzxwPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InVkZGkyX190TW9kZWxJbnN0YW5jZUluZm86OmRlc2NyaXB0aW9uIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0ZDo6dmVjdG9yJmx0OzxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZXNjcmlwdGlvbi5odG1sIj51ZGRpMl9fZGVzY3JpcHRpb248L2E+KiAmZ3Q7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luc3RhbmNlX2luZm8uaHRtbCNvMCI+dWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbzo6ZGVzY3JpcHRpb248L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVmVjdG9yIG9mIHVkZGkyX19kZXNjcmlwdGlvbiogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0idWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbzo6aW5zdGFuY2VEZXRhaWxzIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19pbnN0YW5jZV9kZXRhaWxzLmh0bWwiPnVkZGkyX19pbnN0YW5jZURldGFpbHM8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbnN0YW5jZV9pbmZvLmh0bWwjbzEiPnVkZGkyX190TW9kZWxJbnN0YW5jZUluZm86Omluc3RhbmNlRGV0YWlsczwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6aW5zdGFuY2VEZXRhaWxzLiANCis8cD4NCitPcHRpb25hbCBlbGVtZW50ICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8zIiBkb3h5dGFnPSJ1ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvOjpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbnN0YW5jZV9pbmZvLmh0bWwjbzMiPnNvYXA8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbnN0YW5jZV9pbmZvLmh0bWwjbzMiPnVkZGkyX190TW9kZWxJbnN0YW5jZUluZm86OnNvYXA8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJ1ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvOjp0TW9kZWxLZXkiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E1Ij51ZGRpMl9fdE1vZGVsS2V5PC9hPiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbnN0YW5jZV9pbmZvLmh0bWwjbzIiPnVkZGkyX190TW9kZWxJbnN0YW5jZUluZm86OnRNb2RlbEtleTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgdE1vZGVsS2V5IG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRNb2RlbEtleS4gDQorPHA+DQorUmVxdWlyZWQgYXR0cmlidXRlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3VkZGkyLzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCI+dWRkaV92Mi5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTc6MDAgMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX190X21vZGVsX2xpc3QtbWVtYmVycy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX190X21vZGVsX2xpc3QtbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYzdjZWMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3RfbW9kZWxfbGlzdC1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwxOCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+dWRkaTJfX3RNb2RlbExpc3QgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfbGlzdC5odG1sIj51ZGRpMl9fdE1vZGVsTGlzdDwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfbGlzdC5odG1sI28xIj5nZW5lcmljPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2xpc3QuaHRtbCI+dWRkaTJfX3RNb2RlbExpc3Q8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfbGlzdC5odG1sI28yIj5vcGVyYXRvcl88L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfbGlzdC5odG1sIj51ZGRpMl9fdE1vZGVsTGlzdDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9saXN0Lmh0bWwjbzQiPnNvYXA8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfbGlzdC5odG1sIj51ZGRpMl9fdE1vZGVsTGlzdDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9saXN0Lmh0bWwjbzAiPnRNb2RlbEluZm9zPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2xpc3QuaHRtbCI+dWRkaTJfX3RNb2RlbExpc3Q8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfbGlzdC5odG1sI28zIj50cnVuY2F0ZWQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfbGlzdC5odG1sIj51ZGRpMl9fdE1vZGVsTGlzdDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNzowMCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3RfbW9kZWxfbGlzdC5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX190X21vZGVsX2xpc3QuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGNjMWIyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX190X21vZGVsX2xpc3QuaHRtbApAQCAtMCwwICsxLDE2NyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogdWRkaTJfX3RNb2RlbExpc3QgQ2xhc3MgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX190TW9kZWxMaXN0IENsYXNzIFJlZmVyZW5jZTwvaDE+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InRNb2RlbExpc3QiLiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KKzxjb2RlPiNpbmNsdWRlICZsdDt1ZGRpX3YyLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KKzxhIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9saXN0LW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luZm9zLmh0bWwiPnVkZGkyX190TW9kZWxJbmZvczwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfbGlzdC5odG1sI28wIj50TW9kZWxJbmZvczwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+RWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRNb2RlbEluZm9zLiAgPGEgaHJlZj0iI28wIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9saXN0Lmh0bWwjbzEiPmdlbmVyaWM8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nLiAgPGEgaHJlZj0iI28xIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9saXN0Lmh0bWwjbzIiPm9wZXJhdG9yXzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIG9wZXJhdG9yIG9mIHR5cGUgeHM6c3RyaW5nLiAgPGEgaHJlZj0iI28yIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+ZW51bSA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQ4Ij51ZGRpMl9fdHJ1bmNhdGVkPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9saXN0Lmh0bWwjbzMiPnRydW5jYXRlZDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QXR0cmlidXRlIHRydW5jYXRlZCBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0cnVuY2F0ZWQuICA8YSBocmVmPSIjbzMiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9saXN0Lmh0bWwjbzQiPnNvYXA8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2xpc3QuaHRtbCNvNCI+c29hcDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UuICA8YSBocmVmPSIjbzQiPjwvYT48YnI+PC90ZD48L3RyPg0KKzwvdGFibGU+DQorPGhyPjxhIG5hbWU9Il9kZXRhaWxzIj48L2E+PGgyPkRldGFpbGVkIERlc2NyaXB0aW9uPC9oMj4NCitTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoidE1vZGVsTGlzdCIuIA0KKzxwPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9InVkZGkyX190TW9kZWxMaXN0OjpnZW5lcmljIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2xpc3QuaHRtbCNvMSI+dWRkaTJfX3RNb2RlbExpc3Q6OmdlbmVyaWM8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcuIA0KKzxwPg0KK1JlcXVpcmVkIGF0dHJpYnV0ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMiIgZG94eXRhZz0idWRkaTJfX3RNb2RlbExpc3Q6Om9wZXJhdG9yXyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9saXN0Lmh0bWwjbzIiPnVkZGkyX190TW9kZWxMaXN0OjpvcGVyYXRvcl88L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIG9wZXJhdG9yIG9mIHR5cGUgeHM6c3RyaW5nLiANCis8cD4NCitSZXF1aXJlZCBhdHRyaWJ1dGUgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzQiIGRveHl0YWc9InVkZGkyX190TW9kZWxMaXN0Ojpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9saXN0Lmh0bWwjbzQiPnNvYXA8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9saXN0Lmh0bWwjbzQiPnVkZGkyX190TW9kZWxMaXN0Ojpzb2FwPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0EgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0idWRkaTJfX3RNb2RlbExpc3Q6OnRNb2RlbEluZm9zIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luZm9zLmh0bWwiPnVkZGkyX190TW9kZWxJbmZvczwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2xpc3QuaHRtbCNvMCI+dWRkaTJfX3RNb2RlbExpc3Q6OnRNb2RlbEluZm9zPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0VsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0TW9kZWxJbmZvcy4gDQorPHA+DQorUmVxdWlyZWQgZWxlbWVudCAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMyIgZG94eXRhZz0idWRkaTJfX3RNb2RlbExpc3Q6OnRydW5jYXRlZCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBlbnVtIDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNDgiPnVkZGkyX190cnVuY2F0ZWQ8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9saXN0Lmh0bWwjbzMiPnVkZGkyX190TW9kZWxMaXN0Ojp0cnVuY2F0ZWQ8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQXR0cmlidXRlIHRydW5jYXRlZCBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0cnVuY2F0ZWQuIA0KKzxwPg0KK09wdGlvbmFsIGF0dHJpYnV0ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi88YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE3OjAwIDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fdmFsaWRhdGVfX191X3NfY19vX3JfZXZhbHVlcy1tZW1iZXJzLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3ZhbGlkYXRlX19fdV9zX2Nfb19yX2V2YWx1ZXMtbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxOTM1MjcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9jbGFzc3VkZGkyX19fX3ZhbGlkYXRlX19fdV9zX2Nfb19yX2V2YWx1ZXMtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTggQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPnVkZGkyX192YWxpZGF0ZV9VU0NPUkV2YWx1ZXMgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3ZhbGlkYXRlX19fdV9zX2Nfb19yX2V2YWx1ZXMuaHRtbCI+dWRkaTJfX3ZhbGlkYXRlX1VTQ09SRXZhbHVlczwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3ZhbGlkYXRlX19fdV9zX2Nfb19yX2V2YWx1ZXMuaHRtbCNvMCI+YnVzaW5lc3NFbnRpdHk8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3ZhbGlkYXRlX19fdV9zX2Nfb19yX2V2YWx1ZXMuaHRtbCI+dWRkaTJfX3ZhbGlkYXRlX1VTQ09SRXZhbHVlczwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdmFsaWRhdGVfX191X3NfY19vX3JfZXZhbHVlcy5odG1sI28xIj5idXNpbmVzc1NlcnZpY2U8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3ZhbGlkYXRlX19fdV9zX2Nfb19yX2V2YWx1ZXMuaHRtbCI+dWRkaTJfX3ZhbGlkYXRlX1VTQ09SRXZhbHVlczwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdmFsaWRhdGVfX191X3NfY19vX3JfZXZhbHVlcy5odG1sI28zIj5nZW5lcmljPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX192YWxpZGF0ZV9fX3Vfc19jX29fcl9ldmFsdWVzLmh0bWwiPnVkZGkyX192YWxpZGF0ZV9VU0NPUkV2YWx1ZXM8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3ZhbGlkYXRlX19fdV9zX2Nfb19yX2V2YWx1ZXMuaHRtbCNvNCI+c29hcDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdmFsaWRhdGVfX191X3NfY19vX3JfZXZhbHVlcy5odG1sIj51ZGRpMl9fdmFsaWRhdGVfVVNDT1JFdmFsdWVzPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX192YWxpZGF0ZV9fX3Vfc19jX29fcl9ldmFsdWVzLmh0bWwjbzIiPnRNb2RlbDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdmFsaWRhdGVfX191X3NfY19vX3JfZXZhbHVlcy5odG1sIj51ZGRpMl9fdmFsaWRhdGVfVVNDT1JFdmFsdWVzPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE3OjAwIDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fdmFsaWRhdGVfX191X3NfY19vX3JfZXZhbHVlcy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvY2xhc3N1ZGRpMl9fX192YWxpZGF0ZV9fX3Vfc19jX29fcl9ldmFsdWVzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThiOGE1NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2NsYXNzdWRkaTJfX19fdmFsaWRhdGVfX191X3NfY19vX3JfZXZhbHVlcy5odG1sCkBAIC0wLDAgKzEsMTY3IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiB1ZGRpMl9fdmFsaWRhdGVfVVNDT1JFdmFsdWVzIENsYXNzIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT51ZGRpMl9fdmFsaWRhdGVfVVNDT1JFdmFsdWVzIENsYXNzIFJlZmVyZW5jZTwvaDE+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InZhbGlkYXRlX3ZhbHVlcyIuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3VkZGlfdjIuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX192YWxpZGF0ZV9fX3Vfc19jX29fcl9ldmFsdWVzLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0ZDo6dmVjdG9yJmx0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5Lmh0bWwiPnVkZGkyX19idXNpbmVzc0VudGl0eTwvYT4gKiAmZ3Q7Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdmFsaWRhdGVfX191X3NfY19vX3JfZXZhbHVlcy5odG1sI28wIj5idXNpbmVzc0VudGl0eTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VmVjdG9yIG9mIHVkZGkyX19idXNpbmVzc0VudGl0eSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiAgPGEgaHJlZj0iI28wIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c3RkOjp2ZWN0b3ImbHQ7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlLmh0bWwiPnVkZGkyX19idXNpbmVzc1NlcnZpY2U8L2E+ICogJmd0OyZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3ZhbGlkYXRlX19fdV9zX2Nfb19yX2V2YWx1ZXMuaHRtbCNvMSI+YnVzaW5lc3NTZXJ2aWNlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5WZWN0b3Igb2YgdWRkaTJfX2J1c2luZXNzU2VydmljZSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiAgPGEgaHJlZj0iI28xIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c3RkOjp2ZWN0b3ImbHQ7IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsLmh0bWwiPnVkZGkyX190TW9kZWw8L2E+ICogJmd0OyZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3ZhbGlkYXRlX19fdV9zX2Nfb19yX2V2YWx1ZXMuaHRtbCNvMiI+dE1vZGVsPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5WZWN0b3Igb2YgdWRkaTJfX3RNb2RlbCogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkLiAgPGEgaHJlZj0iI28yIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdmFsaWRhdGVfX191X3NfY19vX3JfZXZhbHVlcy5odG1sI28zIj5nZW5lcmljPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZy4gIDxhIGhyZWY9IiNvMyI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX192YWxpZGF0ZV9fX3Vfc19jX29fcl9ldmFsdWVzLmh0bWwjbzQiPnNvYXA8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX192YWxpZGF0ZV9fX3Vfc19jX29fcl9ldmFsdWVzLmh0bWwjbzQiPnNvYXA8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlLiAgPGEgaHJlZj0iI280Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzxocj48YSBuYW1lPSJfZGV0YWlscyI+PC9hPjxoMj5EZXRhaWxlZCBEZXNjcmlwdGlvbjwvaDI+DQorU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InZhbGlkYXRlX3ZhbHVlcyIuIA0KKzxwPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InVkZGkyX192YWxpZGF0ZV9VU0NPUkV2YWx1ZXM6OmJ1c2luZXNzRW50aXR5IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0ZDo6dmVjdG9yJmx0OzxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHkuaHRtbCI+dWRkaTJfX2J1c2luZXNzRW50aXR5PC9hPiogJmd0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdmFsaWRhdGVfX191X3NfY19vX3JfZXZhbHVlcy5odG1sI28wIj51ZGRpMl9fdmFsaWRhdGVfVVNDT1JFdmFsdWVzOjpidXNpbmVzc0VudGl0eTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitWZWN0b3Igb2YgdWRkaTJfX2J1c2luZXNzRW50aXR5KiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJ1ZGRpMl9fdmFsaWRhdGVfVVNDT1JFdmFsdWVzOjpidXNpbmVzc1NlcnZpY2UiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RkOjp2ZWN0b3ImbHQ7PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2UuaHRtbCI+dWRkaTJfX2J1c2luZXNzU2VydmljZTwvYT4qJmd0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdmFsaWRhdGVfX191X3NfY19vX3JfZXZhbHVlcy5odG1sI28xIj51ZGRpMl9fdmFsaWRhdGVfVVNDT1JFdmFsdWVzOjpidXNpbmVzc1NlcnZpY2U8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVmVjdG9yIG9mIHVkZGkyX19idXNpbmVzc1NlcnZpY2UqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzMiIGRveHl0YWc9InVkZGkyX192YWxpZGF0ZV9VU0NPUkV2YWx1ZXM6OmdlbmVyaWMiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3ZhbGlkYXRlX19fdV9zX2Nfb19yX2V2YWx1ZXMuaHRtbCNvMyI+dWRkaTJfX3ZhbGlkYXRlX1VTQ09SRXZhbHVlczo6Z2VuZXJpYzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZy4gDQorPHA+DQorUmVxdWlyZWQgYXR0cmlidXRlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im80IiBkb3h5dGFnPSJ1ZGRpMl9fdmFsaWRhdGVfVVNDT1JFdmFsdWVzOjpzb2FwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdmFsaWRhdGVfX191X3NfY19vX3JfZXZhbHVlcy5odG1sI280Ij5zb2FwPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3ZhbGlkYXRlX19fdV9zX2Nfb19yX2V2YWx1ZXMuaHRtbCNvNCI+dWRkaTJfX3ZhbGlkYXRlX1VTQ09SRXZhbHVlczo6c29hcDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZS4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9InVkZGkyX192YWxpZGF0ZV9VU0NPUkV2YWx1ZXM6OnRNb2RlbCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdGQ6OnZlY3RvciZsdDs8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbC5odG1sIj51ZGRpMl9fdE1vZGVsPC9hPiogJmd0OyA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdmFsaWRhdGVfX191X3NfY19vX3JfZXZhbHVlcy5odG1sI28yIj51ZGRpMl9fdmFsaWRhdGVfVVNDT1JFdmFsdWVzOjp0TW9kZWw8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVmVjdG9yIG9mIHVkZGkyX190TW9kZWwqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZC4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvdWRkaTIvPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sIj51ZGRpX3YyLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNzowMCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9kb3h5Z2VuLmNzcyBiL2RvYy91ZGRpMi9odG1sL2RveHlnZW4uY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMmU1ODIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9kb3h5Z2VuLmNzcwpAQCAtMCwwICsxLDIxNiBAQAorSDEgeworCXRleHQtYWxpZ246IGNlbnRlcjsKKwlmb250LWZhbWlseTogR2VuZXZhLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOworfQorSDIgeworCWZvbnQtZmFtaWx5OiBHZW5ldmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Cit9CitDQVBUSU9OIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQorRElWLnFpbmRleCB7CisJd2lkdGg6IDEwMCU7CisJYmFja2dyb3VuZC1jb2xvcjogI2VlZWVmZjsKKwlib3JkZXI6IDFweCBzb2xpZCAjQjBCMEIwOworCXRleHQtYWxpZ246IGNlbnRlcjsKKwltYXJnaW46IDJweDsKKwlwYWRkaW5nOiAycHg7CisJbGluZS1oZWlnaHQ6IDEyMCU7Cit9CitBLnFpbmRleCB7CisgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgICAgIGNvbG9yOiAjMUE0MTlEOworICAgICAgIHBhZGRpbmc6IDJweDsKK30KK0EucWluZGV4OnZpc2l0ZWQgeworICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICAgICBjb2xvcjogIzFBNDE5RAorICAgICAgIHBhZGRpbmc6IDJweDsKK30KK0EucWluZGV4OmhvdmVyIHsKKwl0ZXh0LWRlY29yYXRpb246IG5vbmU7CisJYmFja2dyb3VuZC1jb2xvcjogI2RkZGRmZjsKKwlwYWRkaW5nOiAycHg7Cit9CitBLnFpbmRleEhMIHsKKwl0ZXh0LWRlY29yYXRpb246IG5vbmU7CisJZm9udC13ZWlnaHQ6IGJvbGQ7CisJYmFja2dyb3VuZC1jb2xvcjogIzY2NjZjYzsKKwljb2xvcjogI2ZmZmZmZjsKKwlwYWRkaW5nOiAycHggNnB4OworCWJvcmRlcjogMXB4IGRvdWJsZSAjOTI5NUMyOworfQorQS5xaW5kZXhITDpob3ZlciB7CisJdGV4dC1kZWNvcmF0aW9uOiBub25lOworCWJhY2tncm91bmQtY29sb3I6ICM2NjY2Y2M7CisJY29sb3I6ICNmZmZmZmY7CisJcGFkZGluZzogMnB4IDZweDsKK30KK0EucWluZGV4SEw6dmlzaXRlZCB7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgYmFja2dyb3VuZC1jb2xvcjogIzY2NjZjYzsgY29sb3I6ICNmZmZmZmYgfQorQS5lbCB7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC13ZWlnaHQ6IGJvbGQgfQorQS5lbFJlZiB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KK0EuY29kZSB7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgY29sb3I6ICMxQTQxOUR9CitBLmNvZGVSZWYgeyBmb250LXdlaWdodDogbm9ybWFsOyBjb2xvcjogIzFBNDE5RH0KK0E6aG92ZXIgeyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGJhY2tncm91bmQtY29sb3I6ICNmMmYyZmYgfQorREwuZWwgeyBtYXJnaW4tbGVmdDogLTFjbSB9CitQUkUuZnJhZ21lbnQgeworCWJvcmRlcjogMXB4IHNvbGlkICNDQ0NDQ0M7CisJYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTsKKwltYXJnaW4tdG9wOiA0cHg7CisJbWFyZ2luLWJvdHRvbTogNHB4OworCW1hcmdpbi1sZWZ0OiAycHg7CisJbWFyZ2luLXJpZ2h0OiA4cHg7CisJcGFkZGluZy1sZWZ0OiA2cHg7CisJcGFkZGluZy1yaWdodDogNnB4OworCXBhZGRpbmctdG9wOiA0cHg7CisJcGFkZGluZy1ib3R0b206IDRweDsKK30KK0RJVi5mcmFnbWVudCB7CisJYm9yZGVyOiAxcHggc29saWQgI0NDQ0NDQzsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1OworCXBhZGRpbmc6IDZweDsKK30KK0RJVi5haCB7IGJhY2tncm91bmQtY29sb3I6IGJsYWNrOyBmb250LXdlaWdodDogYm9sZDsgY29sb3I6ICNmZmZmZmY7IG1hcmdpbi1ib3R0b206IDNweDsgbWFyZ2luLXRvcDogM3B4IH0KK1RELm1kIHsgYmFja2dyb3VuZC1jb2xvcjogI0Y0RjRGQjsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KK1RELm1kbmFtZTEgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjRjRGNEZCOyBmb250LXdlaWdodDogYm9sZDsgY29sb3I6ICM2MDIwMjA7IH0KK1RELm1kbmFtZSB7IGJhY2tncm91bmQtY29sb3I6ICNGNEY0RkI7IGZvbnQtd2VpZ2h0OiBib2xkOyBjb2xvcjogIzYwMjAyMDsgd2lkdGg6IDYwMHB4OyB9CitESVYuZ3JvdXBIZWFkZXIgeworICAgICAgIG1hcmdpbi1sZWZ0OiAxNnB4OworICAgICAgIG1hcmdpbi10b3A6IDEycHg7CisgICAgICAgbWFyZ2luLWJvdHRvbTogNnB4OworICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworCWZvbnQtZmFtaWx5OiBHZW5ldmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Cit9CitESVYuZ3JvdXBUZXh0IHsgbWFyZ2luLWxlZnQ6IDE2cHg7IGZvbnQtc3R5bGU6IGl0YWxpYzsgZm9udC1zaXplOiAxNHB4IH0KK0JPRFkgeworCWJhY2tncm91bmQ6IHdoaXRlOworCWNvbG9yOiBibGFjazsKKwltYXJnaW4tcmlnaHQ6IDIwcHg7CisJbWFyZ2luLWxlZnQ6IDIwcHg7Cit9CitURC5pbmRleGtleSB7CisJYmFja2dyb3VuZC1jb2xvcjogI2VlZWVmZjsKKwlmb250LXdlaWdodDogYm9sZDsKKwlwYWRkaW5nLXJpZ2h0ICA6IDEwcHg7CisJcGFkZGluZy10b3AgICAgOiAycHg7CisJcGFkZGluZy1sZWZ0ICAgOiAxMHB4OworCXBhZGRpbmctYm90dG9tIDogMnB4OworCW1hcmdpbi1sZWZ0ICAgIDogMHB4OworCW1hcmdpbi1yaWdodCAgIDogMHB4OworCW1hcmdpbi10b3AgICAgIDogMnB4OworCW1hcmdpbi1ib3R0b20gIDogMnB4OworCWJvcmRlcjogMXB4IHNvbGlkICNDQ0NDQ0M7Cit9CitURC5pbmRleHZhbHVlIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWZmOworCWZvbnQtc3R5bGU6IGl0YWxpYzsKKwlwYWRkaW5nLXJpZ2h0ICA6IDEwcHg7CisJcGFkZGluZy10b3AgICAgOiAycHg7CisJcGFkZGluZy1sZWZ0ICAgOiAxMHB4OworCXBhZGRpbmctYm90dG9tIDogMnB4OworCW1hcmdpbi1sZWZ0ICAgIDogMHB4OworCW1hcmdpbi1yaWdodCAgIDogMHB4OworCW1hcmdpbi10b3AgICAgIDogMnB4OworCW1hcmdpbi1ib3R0b20gIDogMnB4OworCWJvcmRlcjogMXB4IHNvbGlkICNDQ0NDQ0M7Cit9CitUUi5tZW1saXN0IHsKKyAgIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7IAorfQorUC5mb3JtdWxhRHNwIHsgdGV4dC1hbGlnbjogY2VudGVyOyB9CitJTUcuZm9ybXVsYURzcCB7IH0KK0lNRy5mb3JtdWxhSW5sIHsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgfQorU1BBTi5rZXl3b3JkICAgICAgIHsgY29sb3I6ICMwMDgwMDAgfQorU1BBTi5rZXl3b3JkdHlwZSAgIHsgY29sb3I6ICM2MDQwMjAgfQorU1BBTi5rZXl3b3JkZmxvdyAgIHsgY29sb3I6ICNlMDgwMDAgfQorU1BBTi5jb21tZW50ICAgICAgIHsgY29sb3I6ICM4MDAwMDAgfQorU1BBTi5wcmVwcm9jZXNzb3IgIHsgY29sb3I6ICM4MDYwMjAgfQorU1BBTi5zdHJpbmdsaXRlcmFsIHsgY29sb3I6ICMwMDIwODAgfQorU1BBTi5jaGFybGl0ZXJhbCAgIHsgY29sb3I6ICMwMDgwODAgfQorLm1kVGFibGUgeworCWJvcmRlcjogMXB4IHNvbGlkICM4Njg2ODY7CisJYmFja2dyb3VuZC1jb2xvcjogI0Y0RjRGQjsKK30KKy5tZFJvdyB7CisJcGFkZGluZzogOHB4IDEwcHg7Cit9CisubWRlc2NMZWZ0IHsKKyAgICAgICBwYWRkaW5nOiAwcHggOHB4IDRweCA4cHg7CisJZm9udC1zaXplOiAxNHB4OworCWZvbnQtc3R5bGU6IGl0YWxpYzsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRkFGQUZBOworCWJvcmRlci10b3A6IDFweCBub25lICNFMEUwRTA7CisJYm9yZGVyLXJpZ2h0OiAxcHggbm9uZSAjRTBFMEUwOworCWJvcmRlci1ib3R0b206IDFweCBub25lICNFMEUwRTA7CisJYm9yZGVyLWxlZnQ6IDFweCBub25lICNFMEUwRTA7CisJbWFyZ2luOiAwcHg7Cit9CisubWRlc2NSaWdodCB7CisgICAgICAgcGFkZGluZzogMHB4IDhweCA0cHggOHB4OworCWZvbnQtc2l6ZTogMTRweDsKKwlmb250LXN0eWxlOiBpdGFsaWM7CisJYmFja2dyb3VuZC1jb2xvcjogI0ZBRkFGQTsKKwlib3JkZXItdG9wOiAxcHggbm9uZSAjRTBFMEUwOworCWJvcmRlci1yaWdodDogMXB4IG5vbmUgI0UwRTBFMDsKKwlib3JkZXItYm90dG9tOiAxcHggbm9uZSAjRTBFMEUwOworCWJvcmRlci1sZWZ0OiAxcHggbm9uZSAjRTBFMEUwOworCW1hcmdpbjogMHB4OworfQorLm1lbUl0ZW1MZWZ0IHsKKwlwYWRkaW5nOiAxcHggMHB4IDBweCA4cHg7CisJbWFyZ2luOiA0cHg7CisJYm9yZGVyLXRvcC13aWR0aDogMXB4OworCWJvcmRlci1yaWdodC13aWR0aDogMXB4OworCWJvcmRlci1ib3R0b20td2lkdGg6IDFweDsKKwlib3JkZXItbGVmdC13aWR0aDogMXB4OworCWJvcmRlci10b3Atc3R5bGU6IHNvbGlkOworCWJvcmRlci10b3AtY29sb3I6ICNFMEUwRTA7CisJYm9yZGVyLXJpZ2h0LWNvbG9yOiAjRTBFMEUwOworCWJvcmRlci1ib3R0b20tY29sb3I6ICNFMEUwRTA7CisJYm9yZGVyLWxlZnQtY29sb3I6ICNFMEUwRTA7CisJYm9yZGVyLXJpZ2h0LXN0eWxlOiBub25lOworCWJvcmRlci1ib3R0b20tc3R5bGU6IG5vbmU7CisJYm9yZGVyLWxlZnQtc3R5bGU6IG5vbmU7CisJYmFja2dyb3VuZC1jb2xvcjogI0ZBRkFGQTsKKwlmb250LWZhbWlseTogR2VuZXZhLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOworCWZvbnQtc2l6ZTogMTJweDsKK30KKy5tZW1JdGVtUmlnaHQgeworCXBhZGRpbmc6IDFweCA4cHggMHB4IDhweDsKKwltYXJnaW46IDRweDsKKwlib3JkZXItdG9wLXdpZHRoOiAxcHg7CisJYm9yZGVyLXJpZ2h0LXdpZHRoOiAxcHg7CisJYm9yZGVyLWJvdHRvbS13aWR0aDogMXB4OworCWJvcmRlci1sZWZ0LXdpZHRoOiAxcHg7CisJYm9yZGVyLXRvcC1zdHlsZTogc29saWQ7CisJYm9yZGVyLXRvcC1jb2xvcjogI0UwRTBFMDsKKwlib3JkZXItcmlnaHQtY29sb3I6ICNFMEUwRTA7CisJYm9yZGVyLWJvdHRvbS1jb2xvcjogI0UwRTBFMDsKKwlib3JkZXItbGVmdC1jb2xvcjogI0UwRTBFMDsKKwlib3JkZXItcmlnaHQtc3R5bGU6IG5vbmU7CisJYm9yZGVyLWJvdHRvbS1zdHlsZTogbm9uZTsKKwlib3JkZXItbGVmdC1zdHlsZTogbm9uZTsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRkFGQUZBOworCWZvbnQtZmFtaWx5OiBHZW5ldmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CisJZm9udC1zaXplOiAxM3B4OworfQorLnNlYXJjaCAgICAgeyBjb2xvcjogIzAwMzM5OTsKKyAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CitGT1JNLnNlYXJjaCB7CisgICAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDBweDsKKyAgICAgICAgICAgICAgbWFyZ2luLXRvcDogMHB4OworfQorSU5QVVQuc2VhcmNoIHsgZm9udC1zaXplOiA3NSU7CisgICAgICAgICAgICAgICBjb2xvcjogIzAwMDA4MDsKKyAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWZmOworfQorVEQudGlueSAgICAgIHsgZm9udC1zaXplOiA3NSU7Cit9CithIHsKKwljb2xvcjogIzI1MkU3ODsKK30KK2E6dmlzaXRlZCB7CisJY29sb3I6ICMzRDIxODU7Cit9CmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9kb3h5Z2VuLnBuZyBiL2RvYy91ZGRpMi9odG1sL2RveHlnZW4ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYTU1ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9kb3h5Z2VuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9leGFtcGxlMS5odG1sIGIvZG9jL3VkZGkyL2h0bWwvZXhhbXBsZTEuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmRkODM3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvZXhhbXBsZTEuaHRtbApAQCAtMCwwICsxLDY4IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiBDb2RlIEV4YW1wbGUgMTogRmluZGluZyBhIHNlcnZpY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iZXhhbXBsZTEiPkNvZGUgRXhhbXBsZSAxOiBGaW5kaW5nIGEgc2VydmljZTwvYT48L2gxPlRoaXMgZXhhbXBsZSBzaG93cyB5b3UgaG93IHRvIGZpbmQgV2ViIHNlcnZpY2VzLiBJbiB0aGlzIGNhc2UsIHRoZSBleGFtcGxlIGZpbmRzIFdlYiBzZXJ2aWNlcyB3aXRoIG5hbWVzIHRoYXQgYmVnaW4gd2l0aCB0aGUgd29yZCAibWFnaWMiLjxwPg0KKzxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPjxzcGFuIGNsYXNzPSJwcmVwcm9jZXNzb3IiPiNpbmNsdWRlICJpbnFILmgiPC9zcGFuPg0KKw0KKzxzcGFuIGNsYXNzPSJrZXl3b3JkdHlwZSI+aW50PC9zcGFuPiBtYWluKDxzcGFuIGNsYXNzPSJrZXl3b3JkdHlwZSI+aW50PC9zcGFuPiBhcmdjLCA8c3BhbiBjbGFzcz0ia2V5d29yZHR5cGUiPmNoYXI8L3NwYW4+ICoqYXJndikNCit7IA0KKyAgPHNwYW4gY2xhc3M9ImtleXdvcmR0eXBlIj5jaGFyPC9zcGFuPiAqc2VhcmNoX3N0cmluZyA9IDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4ibWFnaWMiPC9zcGFuPjsNCisNCisgIDxzcGFuIGNsYXNzPSJrZXl3b3JkZmxvdyI+aWY8L3NwYW4+IChhcmdjICZndDsgMSkNCisgICAgc2VhcmNoX3N0cmluZyA9IGFyZ3ZbMV07DQorDQorICA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gQ3JlYXRlIGEgZ1NPQVAgY29udGV4dDwvc3Bhbj4NCisgIDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5zdHJ1Y3QgPC9zcGFuPnNvYXAgKnNvYXAgPSBzb2FwX25ldygpOw0KKw0KKyAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIENyZWF0ZSBhbiBvYmplY3QgdG8gZmluZCBhIGJ1c2luZXNzPC9zcGFuPg0KKyAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sIj51ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlPC9hPiBmcyhzb2FwLCBzZWFyY2hfc3RyaW5nKTsNCisNCisgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBTZW5kIHRoZSByZXF1ZXN0PC9zcGFuPg0KKyAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9saXN0Lmh0bWwiPnVkZGkyX19zZXJ2aWNlTGlzdDwvYT4gKnNsID0gZnMuc2VuZCg8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+Imh0dHA6Ly91ZGRpLnhtZXRob2RzLm5ldC9pbnF1aXJlIjwvc3Bhbj4pOw0KKw0KKyAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIENoZWNrIGlmIHJlc3VsdCBpcyBPSzwvc3Bhbj4NCisgIDxzcGFuIGNsYXNzPSJrZXl3b3JkZmxvdyI+aWY8L3NwYW4+ICghc2wpDQorICAgIHNvYXBfcHJpbnRfZmF1bHQoc29hcCwgc3RkZXJyKTsNCisNCisgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBJZiBPSywgcmVwb3J0IHRoZSBzZXJ2aWNlIG5hbWUocykgYW5kIHVuaXF1ZSBpZGVudGlmaWNhdGlvbiBrZXlzPC9zcGFuPg0KKyAgPHNwYW4gY2xhc3M9ImtleXdvcmRmbG93Ij5lbHNlPC9zcGFuPiA8c3BhbiBjbGFzcz0ia2V5d29yZGZsb3ciPmlmPC9zcGFuPiAoc2wtJmd0OzxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfbGlzdC5odG1sI28wIj5zZXJ2aWNlSW5mb3M8L2E+KQ0KKyAgew0KKyAgICBzdGQ6OmNvdXQgJmx0OyZsdDsgPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJTZWFyY2ggcmVzdWx0cyBvbiAiPC9zcGFuPiAmbHQ7Jmx0OyBzZWFyY2hfc3RyaW5nICZsdDsmbHQ7IDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iOiI8L3NwYW4+ICZsdDsmbHQ7IHN0ZDo6ZW5kbCAmbHQ7Jmx0OyBzdGQ6OmVuZGw7DQorDQorICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkZmxvdyI+Zm9yPC9zcGFuPiAoc3RkOjp2ZWN0b3ImbHQ7dWRkaTJfX3NlcnZpY2VJbmZvKiZndDs6OmNvbnN0X2l0ZXJhdG9yIHNpID0gc2wtJmd0OzxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfbGlzdC5odG1sI28wIj5zZXJ2aWNlSW5mb3M8L2E+LSZndDs8YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2luZm9zLmh0bWwjbzAiPnNlcnZpY2VJbmZvPC9hPi5iZWdpbigpOyBzaSAhPSBzbC0mZ3Q7PGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9saXN0Lmh0bWwjbzAiPnNlcnZpY2VJbmZvczwvYT4tJmd0OzxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfaW5mb3MuaHRtbCNvMCI+c2VydmljZUluZm88L2E+LmVuZCgpOyArK3NpKQ0KKyAgICB7DQorICAgICAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIFJlcG9ydCBzZXJ2aWNlS2V5IGFuZCBidXNpbmVzc0tleTwvc3Bhbj4NCisgICAgICBzdGQ6OmNvdXQgJmx0OyZsdDsgPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJzZXJ2aWNlS2V5PSI8L3NwYW4+ICZsdDsmbHQ7ICgqc2kpLSZndDtzZXJ2aWNlS2V5ICZsdDsmbHQ7IHN0ZDo6ZW5kbCAmbHQ7Jmx0OyA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+ImJ1c2luZXNzS2V5PSI8L3NwYW4+ICZsdDsmbHQ7ICgqc2kpLSZndDtidXNpbmVzc0tleSAmbHQ7Jmx0OyBzdGQ6OmVuZGw7DQorDQorICAgICAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIFJlcG9ydCBuYW1lczwvc3Bhbj4NCisgICAgICA8c3BhbiBjbGFzcz0ia2V5d29yZGZsb3ciPmZvcjwvc3Bhbj4gKHN0ZDo6dmVjdG9yJmx0O3VkZGkyX19uYW1lKiZndDs6OmNvbnN0X2l0ZXJhdG9yIG4gPSAoKnNpKS0mZ3Q7bmFtZS5iZWdpbigpOyBuICE9ICgqc2kpLSZndDtuYW1lLmVuZCgpOyArK24pDQorICAgICAgICBzdGQ6OmNvdXQgJmx0OyZsdDsgPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJuYW1lPSI8L3NwYW4+ICZsdDsmbHQ7ICgqbiktJmd0O19faXRlbSAmbHQ7Jmx0OyBzdGQ6OmVuZGw7DQorDQorICAgICAgc3RkOjpjb3V0ICZsdDsmbHQ7IHN0ZDo6ZW5kbDsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIFJlbW92ZSBkZXNlcmlhbGl6ZWQgb2JqZWN0czwvc3Bhbj4NCisgIHNvYXBfZGVzdHJveShzb2FwKTsNCisNCisgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBSZW1vdmUgdGVtcG9yYXJ5IGRhdGE8L3NwYW4+DQorICBzb2FwX2VuZChzb2FwKTsNCisNCisgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBEZXRhY2ggYW5kIGZyZWUgY29udGV4dDwvc3Bhbj4NCisgIHNvYXBfZG9uZShzb2FwKTsNCisgIGZyZWUoc29hcCk7DQorDQorICA8c3BhbiBjbGFzcz0ia2V5d29yZGZsb3ciPnJldHVybjwvc3Bhbj4gMDsNCit9DQorPC9wcmU+PC9kaXY+PHA+DQorVG8gY29tcGlsZTo8dWw+DQorPGxpPndzZGwyaCAtdHVkZGkyLXR5cGVtYXAuZGF0IGlucXVpcmVfdjIud3NkbDwvbGk+PGxpPnNvYXBjcHAyIC1JLi4gLXBpbnEgaW5xdWlyZV92Mi5oPC9saT48bGk+ZysrIC1EV0lUSF9OT05BTUVTUEFDRVMgLUkuLiAtbyBleGFtcGxlMSBleGFtcGxlMS5jcHAgaW5xdWlyZV92Mi5jcHAgaW5xQy5jcHAgaW5xQ2xpZW50LmNwcCAuLi9zdGRzb2FwMi5jcHAgPC9saT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE3OjAwIDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2V4YW1wbGUyLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9leGFtcGxlMi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YjBlMmYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9leGFtcGxlMi5odG1sCkBAIC0wLDAgKzEsNjggQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IENvZGUgRXhhbXBsZSAyOiBGaW5kaW5nIGEgYnVzaW5lc3M8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iZXhhbXBsZTIiPkNvZGUgRXhhbXBsZSAyOiBGaW5kaW5nIGEgYnVzaW5lc3M8L2E+PC9oMT5UaGlzIGV4YW1wbGUgc2hvd3MgeW91IGhvdyB0byBmaW5kIGEgYnVzaW5lc3MgZnJvbSBhIFVEREkgc2VydmVyLjxwPg0KKzxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPjxzcGFuIGNsYXNzPSJwcmVwcm9jZXNzb3IiPiNpbmNsdWRlICJpbnFILmgiPC9zcGFuPg0KKw0KKzxzcGFuIGNsYXNzPSJrZXl3b3JkdHlwZSI+aW50PC9zcGFuPiBtYWluKDxzcGFuIGNsYXNzPSJrZXl3b3JkdHlwZSI+aW50PC9zcGFuPiBhcmdjLCA8c3BhbiBjbGFzcz0ia2V5d29yZHR5cGUiPmNoYXI8L3NwYW4+ICoqYXJndikNCit7IA0KKyAgPHNwYW4gY2xhc3M9ImtleXdvcmR0eXBlIj5jaGFyPC9zcGFuPiAqc2VhcmNoX3N0cmluZyA9IDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4ieG1ldGhvZHMiPC9zcGFuPjsNCisNCisgIDxzcGFuIGNsYXNzPSJrZXl3b3JkZmxvdyI+aWY8L3NwYW4+IChhcmdjICZndDsgMSkNCisgICAgc2VhcmNoX3N0cmluZyA9IGFyZ3ZbMV07DQorDQorICA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gQ3JlYXRlIGEgZ1NPQVAgY29udGV4dDwvc3Bhbj4NCisgIDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5zdHJ1Y3QgPC9zcGFuPnNvYXAgKnNvYXAgPSBzb2FwX25ldygpOw0KKw0KKyAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIENyZWF0ZSBhbiBvYmplY3QgdG8gZmluZCBhIGJ1c2luZXNzPC9zcGFuPg0KKyAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCI+dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M8L2E+IGZiKHNvYXAsIHNlYXJjaF9zdHJpbmcpOw0KKw0KKyAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIFNlbmQgdGhlIHJlcXVlc3Q8L3NwYW4+DQorICA8YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19saXN0Lmh0bWwiPnVkZGkyX19idXNpbmVzc0xpc3Q8L2E+ICpibCA9IGZiLnNlbmQoPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJodHRwOi8vdWRkaS54bWV0aG9kcy5uZXQvaW5xdWlyZSI8L3NwYW4+KTsNCisNCisgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBDaGVjayBpZiByZXN1bHQgaXMgT0s8L3NwYW4+DQorICA8c3BhbiBjbGFzcz0ia2V5d29yZGZsb3ciPmlmPC9zcGFuPiAoIWJsKQ0KKyAgICBzb2FwX3ByaW50X2ZhdWx0KHNvYXAsIHN0ZGVycik7DQorDQorICA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gSWYgT0ssIHJlcG9ydCB0aGUgYnVzaW5lc3MgbmFtZShzKSBhbmQgdW5pcXVlIGlkZW50aWZpY2F0aW9uIGtleXM8L3NwYW4+DQorICA8c3BhbiBjbGFzcz0ia2V5d29yZGZsb3ciPmVsc2U8L3NwYW4+IDxzcGFuIGNsYXNzPSJrZXl3b3JkZmxvdyI+aWY8L3NwYW4+IChibC0mZ3Q7PGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfbGlzdC5odG1sI28wIj5idXNpbmVzc0luZm9zPC9hPikNCisgIHsNCisgICAgc3RkOjpjb3V0ICZsdDsmbHQ7IDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iU2VhcmNoIHJlc3VsdHMgb24gIjwvc3Bhbj4gJmx0OyZsdDsgc2VhcmNoX3N0cmluZyAmbHQ7Jmx0OyA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+IjoiPC9zcGFuPiAmbHQ7Jmx0OyBzdGQ6OmVuZGwgJmx0OyZsdDsgc3RkOjplbmRsOw0KKw0KKyAgICA8c3BhbiBjbGFzcz0ia2V5d29yZGZsb3ciPmZvcjwvc3Bhbj4gKHN0ZDo6dmVjdG9yJmx0O3VkZGkyX19idXNpbmVzc0luZm8qJmd0Ozo6Y29uc3RfaXRlcmF0b3IgYmkgPSBibC0mZ3Q7PGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfbGlzdC5odG1sI28wIj5idXNpbmVzc0luZm9zPC9hPi0mZ3Q7PGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfaW5mb3MuaHRtbCNvMCI+YnVzaW5lc3NJbmZvPC9hPi5iZWdpbigpOyBiaSAhPSBibC0mZ3Q7PGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfbGlzdC5odG1sI28wIj5idXNpbmVzc0luZm9zPC9hPi0mZ3Q7PGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfaW5mb3MuaHRtbCNvMCI+YnVzaW5lc3NJbmZvPC9hPi5lbmQoKTsgKytiaSkNCisgICAgew0KKyAgICAgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBSZXBvcnQgYnVzaW5lc3NLZXk8L3NwYW4+DQorICAgICAgc3RkOjpjb3V0ICZsdDsmbHQ7IDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iYnVzaW5lc3NLZXk9Ijwvc3Bhbj4gJmx0OyZsdDsgKCpiaSktJmd0O2J1c2luZXNzS2V5ICZsdDsmbHQ7IHN0ZDo6ZW5kbDsNCisNCisgICAgICA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gUmVwb3J0IG5hbWVzPC9zcGFuPg0KKyAgICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkZmxvdyI+Zm9yPC9zcGFuPiAoc3RkOjp2ZWN0b3ImbHQ7dWRkaTJfX25hbWUqJmd0Ozo6Y29uc3RfaXRlcmF0b3IgbiA9ICgqYmkpLSZndDtuYW1lLmJlZ2luKCk7IG4gIT0gKCpiaSktJmd0O25hbWUuZW5kKCk7ICsrbikNCisgICAgICAgIHN0ZDo6Y291dCAmbHQ7Jmx0OyA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+Im5hbWU9Ijwvc3Bhbj4gJmx0OyZsdDsgKCpuKS0mZ3Q7X19pdGVtICZsdDsmbHQ7IHN0ZDo6ZW5kbDsNCisNCisgICAgICBzdGQ6OmNvdXQgJmx0OyZsdDsgc3RkOjplbmRsOw0KKyAgICB9DQorICB9DQorDQorICA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gUmVtb3ZlIGRlc2VyaWFsaXplZCBvYmplY3RzPC9zcGFuPg0KKyAgc29hcF9kZXN0cm95KHNvYXApOw0KKw0KKyAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIFJlbW92ZSB0ZW1wb3JhcnkgZGF0YTwvc3Bhbj4NCisgIHNvYXBfZW5kKHNvYXApOw0KKw0KKyAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIERldGFjaCBhbmQgZnJlZSBjb250ZXh0PC9zcGFuPg0KKyAgc29hcF9kb25lKHNvYXApOw0KKyAgZnJlZShzb2FwKTsNCisNCisgIDxzcGFuIGNsYXNzPSJrZXl3b3JkZmxvdyI+cmV0dXJuPC9zcGFuPiAwOw0KK30NCis8L3ByZT48L2Rpdj48cD4NCitUbyBjb21waWxlOjx1bD4NCis8bGk+d3NkbDJoIC10dWRkaTItdHlwZW1hcC5kYXQgaW5xdWlyZV92Mi53c2RsPC9saT48bGk+c29hcGNwcDIgLUkuLiAtcGlucSBpbnF1aXJlX3YyLmg8L2xpPjxsaT5nKysgLURXSVRIX05PTkFNRVNQQUNFUyAtSS4uIC1vIGV4YW1wbGUyIGV4YW1wbGUyLmNwcCBpbnF1aXJlX3YyLmNwcCBpbnFDLmNwcCBpbnFDbGllbnQuY3BwIC4uL3N0ZHNvYXAyLmNwcCA8L2xpPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTc6MDAgMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvZXhhbXBsZTMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2V4YW1wbGUzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJkYWExNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2V4YW1wbGUzLmh0bWwKQEAgLTAsMCArMSwxNTkgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IENvZGUgRXhhbXBsZSAzOiBQdWJsaXNoaW5nIGEgV1NETCBhbmQgc2VydmljZSBvbiBYTWV0aG9kczwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJleGFtcGxlMyI+Q29kZSBFeGFtcGxlIDM6IFB1Ymxpc2hpbmcgYSBXU0RMIGFuZCBzZXJ2aWNlIG9uIFhNZXRob2RzPC9hPjwvaDE+VGhpcyBleGFtcGxlIHNob3dzIHlvdSBob3cgdG8gcHVibGlzaCBhIFdlYiBzZXJ2aWNlLiBJbiB0aGlzIGNhc2UsIHRoZSBleGFtcGxlIHRlbXBsYXRlIGNvZGUgb2J0YWlucyBhbiBhdXRob3JpemF0aW9uIHRva2VuLCBzYXZlcyB0aGUgdE1vZGVsIHdpdGggdGhlIFdTREwgVVJMIGluIHRoZSBzZXJ2ZXIsIGFuZCBzYXZlcyB0aGUgYnVzaW5lc3Mgc2VydmljZSBpbmZvcm1hdGlvbiBpbiB0aGUgc2VydmVyLjxwPg0KKzxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPjxzcGFuIGNsYXNzPSJwcmVwcm9jZXNzb3IiPiNpbmNsdWRlICJwdWJILmgiPC9zcGFuPg0KKw0KKzxzcGFuIGNsYXNzPSJrZXl3b3JkIj5jb25zdDwvc3Bhbj4gPHNwYW4gY2xhc3M9ImtleXdvcmR0eXBlIj5jaGFyPC9zcGFuPiAqc2VydmVyID0gPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJodHRwczovL3VkZGkueG1ldGhvZHMubmV0L3B1Ymxpc2giPC9zcGFuPjsNCisNCis8c3BhbiBjbGFzcz0ia2V5d29yZCI+Y29uc3Q8L3NwYW4+IDxzcGFuIGNsYXNzPSJrZXl3b3JkdHlwZSI+Y2hhcjwvc3Bhbj4gKnVzZXJpZCA9IDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iLi4uIjwvc3Bhbj47IDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyB1c2VyIElEIHRvIGFjY2VzcyBVRERJIHNlcnZlcjwvc3Bhbj4NCis8c3BhbiBjbGFzcz0ia2V5d29yZCI+Y29uc3Q8L3NwYW4+IDxzcGFuIGNsYXNzPSJrZXl3b3JkdHlwZSI+Y2hhcjwvc3Bhbj4gKnBhc3N3ZCA9IDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iLi4uIjwvc3Bhbj47IDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBwYXNzd29yZCB0byBhY2Nlc3MgVURESSBzZXJ2ZXI8L3NwYW4+DQorDQorPHNwYW4gY2xhc3M9ImtleXdvcmR0eXBlIj5pbnQ8L3NwYW4+IG1haW4oPHNwYW4gY2xhc3M9ImtleXdvcmR0eXBlIj5pbnQ8L3NwYW4+IGFyZ2MsIDxzcGFuIGNsYXNzPSJrZXl3b3JkdHlwZSI+Y2hhcjwvc3Bhbj4gKiphcmd2KQ0KK3sgDQorICA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gQ3JlYXRlIGEgZ1NPQVAgY29udGV4dDwvc3Bhbj4NCisgIDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5zdHJ1Y3QgPC9zcGFuPnNvYXAgKnNvYXAgPSBzb2FwX25ldygpOw0KKw0KKyAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIFNldHVwIFNTTCBjb250ZXh0IChvcHRpb25hbCkgdG8gdmVyaWZ5IHNlcnZlcidzIGNyZWRlbnRpYWxzPC9zcGFuPg0KKyAgPHNwYW4gY2xhc3M9ImtleXdvcmRmbG93Ij5pZjwvc3Bhbj4gKHNvYXBfc3NsX2NsaWVudF9jb250ZXh0KHNvYXAsIFNPQVBfU1NMX0RFRkFVTFQsIE5VTEwsIE5VTEwsIDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iY2FjZXJ0cy5wZW0iPC9zcGFuPiwgTlVMTCwgTlVMTCkpDQorICB7IA0KKyAgICBzb2FwX3ByaW50X2ZhdWx0KHNvYXAsIHN0ZGVycik7DQorICAgIGV4aXQoMSk7DQorICB9DQorDQorICA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gU3RlcCAxOiBHZXQgYW4gYXV0aG9yaXphdGlvbiB0b2tlbiBmcm9tIHRoZSBVRERJIHNlcnZlcjwvc3Bhbj4NCisgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbjwvYT4gZ2V0X2F1dGhUb2tlbihzb2FwLCB1c2VyaWQsIHBhc3N3ZCk7DQorICA8YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hdXRoX3Rva2VuLmh0bWwiPnVkZGkyX19hdXRoVG9rZW48L2E+ICphdXRoVG9rZW4gPSBnZXRfYXV0aFRva2VuLnNlbmQoc2VydmVyKTsNCisNCisgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBDaGVjayBpZiBhdXRob3JpemVkPC9zcGFuPg0KKyAgPHNwYW4gY2xhc3M9ImtleXdvcmRmbG93Ij5pZjwvc3Bhbj4gKCFhdXRoVG9rZW4pDQorICB7DQorICAgIHNvYXBfcHJpbnRfZmF1bHQoc29hcCwgc3RkZXJyKTsNCisgICAgZXhpdCgxKTsNCisgIH0NCisNCisgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBBdXRob3JpemF0aW9uIGluZm8gcHJvdmlkZWQgYnkgc2VydmVyIGZvciB0aGlzIHNlc3Npb248L3NwYW4+DQorICA8c3BhbiBjbGFzcz0ia2V5d29yZHR5cGUiPmNoYXI8L3NwYW4+ICphdXRoSW5mbyA9IGF1dGhUb2tlbi0mZ3Q7PGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXV0aF90b2tlbi5odG1sI28wIj5hdXRoSW5mbzwvYT47DQorDQorICA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gU3RlcCAyOiBDcmVhdGUgYSB0TW9kZWwgZm9yIHRoZSBXU0RMIHRvIGJlIHB1Ymxpc2hlZDwvc3Bhbj4NCisgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWwuaHRtbCI+dWRkaTJfX3RNb2RlbDwvYT4gdE1vZGVsOw0KKyAgdE1vZGVsLnNvYXBfZGVmYXVsdChzb2FwKTsNCisNCisgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBDcmVhdGUgdGhlIHRNb2RlbCBhbmQgc2VydmljZSBuYW1lPC9zcGFuPg0KKyAgdE1vZGVsLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWwuaHRtbCNvMCI+bmFtZTwvYT4gPSBzb2FwX25ld191ZGRpMl9fbmFtZShzb2FwLCAtMSk7DQorICB0TW9kZWwuPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbC5odG1sI28wIj5uYW1lPC9hPi0mZ3Q7PGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fbmFtZS5odG1sI28wIj5fX2l0ZW08L2E+ID0gPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiIuLi4iPC9zcGFuPjsNCisgIHRNb2RlbC48YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsLmh0bWwjbzAiPm5hbWU8L2E+LSZndDs8YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19uYW1lLmh0bWwjbzEiPnhtbF9fbGFuZ188L2E+ID0gPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJlbiI8L3NwYW4+Ow0KKw0KKyAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIENyZWF0ZSBYTWV0aG9kcyBkZXNjcmlwdGlvbiBlbGVtZW50cyAoc2VlIGh0dHA6Ly93d3cueG1ldGhvZHMubmV0L3ZlMi9VRERJLnBvKTwvc3Bhbj4NCisgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rlc2NyaXB0aW9uLmh0bWwiPnVkZGkyX19kZXNjcmlwdGlvbjwvYT4gKmRlc2NyaXB0aW9uID0gc29hcF9uZXdfdWRkaTJfX2Rlc2NyaXB0aW9uKHNvYXAsIDYpOw0KKyAgZGVzY3JpcHRpb25bMF0uPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVzY3JpcHRpb24uaHRtbCNvMCI+X19pdGVtPC9hPiA9IDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iU0hPUlQgREVTQ1JJUFRJT046IC4uLiI8L3NwYW4+Ow0KKyAgZGVzY3JpcHRpb25bMF0uPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVzY3JpcHRpb24uaHRtbCNvMSI+eG1sX19sYW5nXzwvYT4gPSA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+ImVuIjwvc3Bhbj47DQorICBkZXNjcmlwdGlvblsxXS48YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZXNjcmlwdGlvbi5odG1sI28wIj5fX2l0ZW08L2E+ID0gPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJTSE9SVCBERVNDUklQVElPTjogLi4uIjwvc3Bhbj47DQorICBkZXNjcmlwdGlvblsxXS48YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZXNjcmlwdGlvbi5odG1sI28xIj54bWxfX2xhbmdfPC9hPiA9IDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iZW4iPC9zcGFuPjsNCisgIGRlc2NyaXB0aW9uWzJdLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rlc2NyaXB0aW9uLmh0bWwjbzAiPl9faXRlbTwvYT4gPSA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+IlVTQUdFIE5PVEVTOiAuLi4iPC9zcGFuPjsNCisgIGRlc2NyaXB0aW9uWzJdLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rlc2NyaXB0aW9uLmh0bWwjbzEiPnhtbF9fbGFuZ188L2E+ID0gPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJlbiI8L3NwYW4+Ow0KKyAgZGVzY3JpcHRpb25bM10uPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVzY3JpcHRpb24uaHRtbCNvMCI+X19pdGVtPC9hPiA9IDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iSE9NRVBBR0UgVVJMOiAuLi4iPC9zcGFuPjsNCisgIGRlc2NyaXB0aW9uWzNdLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rlc2NyaXB0aW9uLmh0bWwjbzEiPnhtbF9fbGFuZ188L2E+ID0gPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJlbiI8L3NwYW4+Ow0KKyAgZGVzY3JpcHRpb25bNF0uPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVzY3JpcHRpb24uaHRtbCNvMCI+X19pdGVtPC9hPiA9IDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iQ09OVEFDVCBFTUFJTDogLi4uIjwvc3Bhbj47DQorICBkZXNjcmlwdGlvbls0XS48YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZXNjcmlwdGlvbi5odG1sI28xIj54bWxfX2xhbmdfPC9hPiA9IDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iZW4iPC9zcGFuPjsNCisgIGRlc2NyaXB0aW9uWzVdLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rlc2NyaXB0aW9uLmh0bWwjbzAiPl9faXRlbTwvYT4gPSA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+IklNUExFTUVOVEFUSU9OOiAuLi4iPC9zcGFuPjsNCisgIGRlc2NyaXB0aW9uWzVdLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rlc2NyaXB0aW9uLmh0bWwjbzEiPnhtbF9fbGFuZ188L2E+ID0gPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJlbiI8L3NwYW4+Ow0KKw0KKyAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIEFkZCB0aGUgZm91ciBkZXNjcmlwdGlvbiBlbGVtZW50cyB0byB0aGUgdE1vZGVsPC9zcGFuPg0KKyAgdE1vZGVsLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWwuaHRtbCNvMSI+ZGVzY3JpcHRpb248L2E+LnB1c2hfYmFjayhkZXNjcmlwdGlvbiArIDApOw0KKyAgdE1vZGVsLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWwuaHRtbCNvMSI+ZGVzY3JpcHRpb248L2E+LnB1c2hfYmFjayhkZXNjcmlwdGlvbiArIDEpOw0KKyAgdE1vZGVsLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWwuaHRtbCNvMSI+ZGVzY3JpcHRpb248L2E+LnB1c2hfYmFjayhkZXNjcmlwdGlvbiArIDIpOw0KKyAgdE1vZGVsLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWwuaHRtbCNvMSI+ZGVzY3JpcHRpb248L2E+LnB1c2hfYmFjayhkZXNjcmlwdGlvbiArIDQpOw0KKw0KKyAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIEFkZCBhbiBvdmVydmlld0RvYyBlbGVtZW50IHdpdGggZGVzY3JpcHRpb24gYW5kIG92ZXJ2aWV3VVJMPC9zcGFuPg0KKyAgdE1vZGVsLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWwuaHRtbCNvMiI+b3ZlcnZpZXdEb2M8L2E+ID0gc29hcF9uZXdfdWRkaTJfX292ZXJ2aWV3RG9jKHNvYXAsIC0xKTsNCisgIHRNb2RlbC48YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsLmh0bWwjbzIiPm92ZXJ2aWV3RG9jPC9hPi0mZ3Q7c29hcF9kZWZhdWx0KHNvYXApOw0KKyAgdE1vZGVsLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWwuaHRtbCNvMiI+b3ZlcnZpZXdEb2M8L2E+LSZndDs8YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19vdmVydmlld19kb2MuaHRtbCNvMCI+ZGVzY3JpcHRpb248L2E+LnB1c2hfYmFjayhzb2FwX25ld191ZGRpMl9fZGVzY3JpcHRpb24oc29hcCwgLTEpKTsNCisgIHRNb2RlbC48YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsLmh0bWwjbzIiPm92ZXJ2aWV3RG9jPC9hPi0mZ3Q7PGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fb3ZlcnZpZXdfZG9jLmh0bWwjbzAiPmRlc2NyaXB0aW9uPC9hPlswXS0mZ3Q7X19pdGVtID0gPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJXU0RMIHNvdXJjZSBkb2N1bWVudCI8L3NwYW4+Ow0KKyAgdE1vZGVsLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWwuaHRtbCNvMiI+b3ZlcnZpZXdEb2M8L2E+LSZndDs8YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19vdmVydmlld19kb2MuaHRtbCNvMCI+ZGVzY3JpcHRpb248L2E+WzBdLSZndDt4bWxfX2xhbmdfID0gPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJlbiI8L3NwYW4+Ow0KKyAgdE1vZGVsLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWwuaHRtbCNvMiI+b3ZlcnZpZXdEb2M8L2E+LSZndDs8YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19vdmVydmlld19kb2MuaHRtbCNvMSI+b3ZlcnZpZXdVUkw8L2E+ID0gPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJodHRwOi8vLi4uL215LndzZGwjYmluZGluZ05hbWUiPC9zcGFuPjsNCisNCisgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBPbWl0IGlkZW50aWZpZXIgYmFnPC9zcGFuPg0KKyAgdE1vZGVsLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWwuaHRtbCNvMyI+aWRlbnRpZmllckJhZzwvYT4gPSBOVUxMOw0KKw0KKyAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIEFkZCBhIGNhdGVnb3J5IHdpdGggYSBXU0RMLXNwZWNpZmljIGtleWVkUmVmZXJlbmNlPC9zcGFuPg0KKyAgdE1vZGVsLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWwuaHRtbCNvNCI+Y2F0ZWdvcnlCYWc8L2E+ID0gc29hcF9uZXdfdWRkaTJfX2NhdGVnb3J5QmFnKHNvYXAsIC0xKTsNCisgIHRNb2RlbC48YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsLmh0bWwjbzQiPmNhdGVnb3J5QmFnPC9hPi0mZ3Q7c29hcF9kZWZhdWx0KHNvYXApOw0KKyAgdE1vZGVsLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWwuaHRtbCNvNCI+Y2F0ZWdvcnlCYWc8L2E+LSZndDs8YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19jYXRlZ29yeV9iYWcuaHRtbCNvMCI+a2V5ZWRSZWZlcmVuY2U8L2E+LnB1c2hfYmFjayhzb2FwX25ld191ZGRpMl9fa2V5ZWRSZWZlcmVuY2Uoc29hcCwgLTEpKTsNCisgIHRNb2RlbC48YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsLmh0bWwjbzQiPmNhdGVnb3J5QmFnPC9hPi0mZ3Q7PGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fY2F0ZWdvcnlfYmFnLmh0bWwjbzAiPmtleWVkUmVmZXJlbmNlPC9hPlswXS0mZ3Q7dE1vZGVsS2V5ID0gPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiIuLi4iPC9zcGFuPjsNCisgIHRNb2RlbC48YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsLmh0bWwjbzQiPmNhdGVnb3J5QmFnPC9hPi0mZ3Q7PGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fY2F0ZWdvcnlfYmFnLmh0bWwjbzAiPmtleWVkUmVmZXJlbmNlPC9hPlswXS0mZ3Q7a2V5TmFtZSA9IDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4idWRkaS1vcmc6dHlwZXMiPC9zcGFuPjsNCisgIHRNb2RlbC48YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsLmh0bWwjbzQiPmNhdGVnb3J5QmFnPC9hPi0mZ3Q7PGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fY2F0ZWdvcnlfYmFnLmh0bWwjbzAiPmtleWVkUmVmZXJlbmNlPC9hPlswXS0mZ3Q7a2V5VmFsdWUgPSA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+IndzZGxTcGVjIjwvc3Bhbj47DQorDQorICB0TW9kZWwuPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbC5odG1sI283Ij5hdXRob3JpemVkTmFtZTwvYT4gPSA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+Ii4uLiI8L3NwYW4+Ow0KKyAgdE1vZGVsLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWwuaHRtbCNvNiI+b3BlcmF0b3JfPC9hPiA9IDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iLi4uIjwvc3Bhbj47DQorICB0TW9kZWwuPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbC5odG1sI281Ij50TW9kZWxLZXk8L2E+ID0gPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiIuLi4iPC9zcGFuPjsNCisNCisgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBTYXZlIHRoZSB0TW9kZWw8L3NwYW4+DQorICA8YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwiPnVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbDwvYT4gc2F2ZV90TW9kZWwoc29hcCwgdE1vZGVsKTsNCisgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfZGV0YWlsLmh0bWwiPnVkZGkyX190TW9kZWxEZXRhaWw8L2E+ICp0TW9kZWxEZXRhaWwgPSBzYXZlX3RNb2RlbC5zZW5kKHNlcnZlciwgYXV0aEluZm8pOw0KKw0KKyAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIFN0ZXAgMzogQ3JlYXRlIGEgbmV3IHNlcnZpY2UgdG8gYmUgcHVibGlzaGVkPC9zcGFuPg0KKyAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3Nfc2VydmljZS5odG1sIj51ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlPC9hPiBzZXJ2aWNlOw0KKyAgc2VydmljZS5zb2FwX2RlZmF1bHQoc29hcCk7DQorDQorICA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gU2VydmljZSBuYW1lIGlzIHRoZSB0TW9kZWwgbmFtZSAoWE1ldGhvZHMpPC9zcGFuPg0KKyAgc2VydmljZS48YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlLmh0bWwjbzAiPm5hbWU8L2E+LnB1c2hfYmFjayh0TW9kZWwuPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbC5odG1sI28wIj5uYW1lPC9hPik7DQorDQorICA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gQWRkIHR3byBkZXNjcmlwdGlvbiBlbGVtZW50cyB0byB0aGUgc2VydmljZTwvc3Bhbj4NCisgIHNlcnZpY2UuPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3Nfc2VydmljZS5odG1sI28xIj5kZXNjcmlwdGlvbjwvYT4ucHVzaF9iYWNrKGRlc2NyaXB0aW9uICsgNCk7DQorICBzZXJ2aWNlLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2UuaHRtbCNvMSI+ZGVzY3JpcHRpb248L2E+LnB1c2hfYmFjayhkZXNjcmlwdGlvbiArIDUpOw0KKw0KKyAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIENyZWF0ZSBiaW5kaW5nIHRlbXBsYXRlPC9zcGFuPg0KKyAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZS5odG1sIj51ZGRpMl9fYmluZGluZ1RlbXBsYXRlPC9hPiBiaW5kaW5nVGVtcGxhdGU7DQorICBiaW5kaW5nVGVtcGxhdGUuc29hcF9kZWZhdWx0KHNvYXApOw0KKyAgYmluZGluZ1RlbXBsYXRlLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGUuaHRtbCNvMSI+dE1vZGVsSW5zdGFuY2VEZXRhaWxzPC9hPiA9IHNvYXBfbmV3X3VkZGkyX190TW9kZWxJbnN0YW5jZURldGFpbHMoc29hcCwgLTEpOw0KKyAgYmluZGluZ1RlbXBsYXRlLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGUuaHRtbCNvMSI+dE1vZGVsSW5zdGFuY2VEZXRhaWxzPC9hPi0mZ3Q7PGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbnN0YW5jZV9kZXRhaWxzLmh0bWwjbzAiPnRNb2RlbEluc3RhbmNlSW5mbzwvYT4ucHVzaF9iYWNrKHNvYXBfbmV3X3VkZGkyX190TW9kZWxJbnN0YW5jZUluZm8oc29hcCwgLTEpKTsNCisgIGJpbmRpbmdUZW1wbGF0ZS48YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX3RlbXBsYXRlLmh0bWwjbzEiPnRNb2RlbEluc3RhbmNlRGV0YWlsczwvYT4tJmd0OzxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5zdGFuY2VfZGV0YWlscy5odG1sI28wIj50TW9kZWxJbnN0YW5jZUluZm88L2E+WzBdLSZndDtpbnN0YW5jZURldGFpbHMgPSBOVUxMOw0KKyAgYmluZGluZ1RlbXBsYXRlLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGUuaHRtbCNvMSI+dE1vZGVsSW5zdGFuY2VEZXRhaWxzPC9hPi0mZ3Q7PGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbnN0YW5jZV9kZXRhaWxzLmh0bWwjbzAiPnRNb2RlbEluc3RhbmNlSW5mbzwvYT5bMF0tJmd0O3RNb2RlbEtleSA9IHRNb2RlbC48YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsLmh0bWwjbzUiPnRNb2RlbEtleTwvYT47DQorICBiaW5kaW5nVGVtcGxhdGUuPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZS5odG1sI28yIj5hY2Nlc3NQb2ludDwvYT4gPSBzb2FwX25ld191ZGRpMl9fYWNjZXNzUG9pbnQoc29hcCwgLTEpOw0KKyAgYmluZGluZ1RlbXBsYXRlLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGUuaHRtbCNvMiI+YWNjZXNzUG9pbnQ8L2E+LSZndDs8YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hY2Nlc3NfcG9pbnQuaHRtbCNvMCI+X19pdGVtPC9hPiA9IDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iLi4uIjwvc3Bhbj47DQorICBiaW5kaW5nVGVtcGxhdGUuPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZS5odG1sI28yIj5hY2Nlc3NQb2ludDwvYT4tJmd0OzxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX2FjY2Vzc19wb2ludC5odG1sI28xIj5VUkxUeXBlPC9hPiA9IDxhIGNsYXNzPSJjb2RlIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0OWExMSI+dWRkaTJfX1VSTFR5cGVfX2h0dHA8L2E+Ow0KKyAgYmluZGluZ1RlbXBsYXRlLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGUuaHRtbCNvMyI+aG9zdGluZ1JlZGlyZWN0b3I8L2E+ID0gTlVMTDsNCisgIGJpbmRpbmdUZW1wbGF0ZS48YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX3RlbXBsYXRlLmh0bWwjbzQiPnNlcnZpY2VLZXk8L2E+ID0gPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiIuLi4iPC9zcGFuPjsNCisgIGJpbmRpbmdUZW1wbGF0ZS48YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX3RlbXBsYXRlLmh0bWwjbzUiPmJpbmRpbmdLZXk8L2E+ID0gPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiIuLi4iPC9zcGFuPjsNCisNCisgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBBZGQgYmluZGluZyBUZW1wbGF0ZSB0byBzZXJ2aWNlPC9zcGFuPg0KKyAgc2VydmljZS48YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlLmh0bWwjbzIiPmJpbmRpbmdUZW1wbGF0ZXM8L2E+ID0gc29hcF9uZXdfdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZXMoc29hcCwgLTEpOw0KKyAgc2VydmljZS48YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlLmh0bWwjbzIiPmJpbmRpbmdUZW1wbGF0ZXM8L2E+LSZndDtzb2FwX2RlZmF1bHQoc29hcCk7DQorICBzZXJ2aWNlLjxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2UuaHRtbCNvMiI+YmluZGluZ1RlbXBsYXRlczwvYT4tJmd0OzxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGVzLmh0bWwjbzAiPmJpbmRpbmdUZW1wbGF0ZTwvYT4ucHVzaF9iYWNrKCZhbXA7YmluZGluZ1RlbXBsYXRlKTsNCisNCisgIHNlcnZpY2UuPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3Nfc2VydmljZS5odG1sI28zIj5jYXRlZ29yeUJhZzwvYT4gPSBOVUxMOw0KKyAgc2VydmljZS48YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlLmh0bWwjbzQiPnNlcnZpY2VLZXk8L2E+ID0gPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiIuLi4iPC9zcGFuPjsNCisgIHNlcnZpY2UuPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3Nfc2VydmljZS5odG1sI281Ij5idXNpbmVzc0tleTwvYT4gPSA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+Ii4uLiI8L3NwYW4+Ow0KKw0KKyAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIFNhdmUgdGhlIHNlcnZpY2U8L3NwYW4+DQorICA8YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwiPnVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2U8L2E+IHNhdmVfc2VydmljZShzb2FwLCBzZXJ2aWNlKTsNCisgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfZGV0YWlsLmh0bWwiPnVkZGkyX19zZXJ2aWNlRGV0YWlsPC9hPiAqc2VydmljZURldGFpbCA9IHNhdmVfc2VydmljZS5zZW5kKHNlcnZlciwgYXV0aEluZm8pOw0KKw0KKyAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIFN0ZXAgNDogRGlzY2FyZCBhdXRob3JpemF0aW9uIHRva2VuPC9zcGFuPg0KKyAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzY2FyZF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sIj51ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW48L2E+IGRpc2NhcmRfYXV0aFRva2VuKHNvYXAsIGF1dGhJbmZvKTsNCisgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sIj51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQ8L2E+ICpkaXNwb3NpdGlvblJlcG9ydCA9IGRpc2NhcmRfYXV0aFRva2VuLnNlbmQoc2VydmVyKTsNCisNCisgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBSZW1vdmUgZGVzZXJpYWxpemVkIG9iamVjdHM8L3NwYW4+DQorICBzb2FwX2Rlc3Ryb3koc29hcCk7DQorDQorICA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gUmVtb3ZlIHRlbXBvcmFyeSBkYXRhPC9zcGFuPg0KKyAgc29hcF9lbmQoc29hcCk7DQorDQorICA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gRGV0YWNoIGFuZCBmcmVlIGNvbnRleHQ8L3NwYW4+DQorICBzb2FwX2RvbmUoc29hcCk7DQorICBmcmVlKHNvYXApOw0KKw0KKyAgPHNwYW4gY2xhc3M9ImtleXdvcmRmbG93Ij5yZXR1cm48L3NwYW4+IDA7DQorfQ0KKzwvcHJlPjwvZGl2PlRvIGNvbXBpbGU6PHVsPg0KKzxsaT53c2RsMmggLXR1ZGRpMi10eXBlbWFwLmRhdCBwdWJsaXNoX3YyLndzZGw8L2xpPjxsaT5zb2FwY3BwMiAtSS4uIC1wcHViIHB1Ymxpc2hfdjIuaDwvbGk+PGxpPmcrKyAtRFdJVEhfT1BFTlNTTCAtRFdJVEhfTk9OQU1FU1BBQ0VTIC1JLi4gLW8gZXhhbXBsZTMgZXhhbXBsZTMuY3BwIHB1Ymxpc2hfdjIuY3BwIHB1YkMuY3BwIHB1YkNsaWVudC5jcHAgLi4vc3Rkc29hcDIuY3BwIDwvbGk+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNzowMCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9maWxlcy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvZmlsZXMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmY4M2UzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvZmlsZXMuaHRtbApAQCAtMCwwICsxLDE1IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiBGaWxlIEluZGV4PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXhITCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+Z1NPQVAgVURESSB2MiBGaWxlIExpc3Q8L2gxPkhlcmUgaXMgYSBsaXN0IG9mIGFsbCBmaWxlcyB3aXRoIGJyaWVmIGRlc2NyaXB0aW9uczo8dGFibGU+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3VkZGkyLzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCI+dWRkaV92Mi5oPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNjo1NyAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9mdHYyYmxhbmsucG5nIGIvZG9jL3VkZGkyL2h0bWwvZnR2MmJsYW5rLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTNjM2MwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvZnR2MmJsYW5rLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9mdHYyZG9jLnBuZyBiL2RvYy91ZGRpMi9odG1sL2Z0djJkb2MucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3Mjk5OWYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9mdHYyZG9jLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9mdHYyZm9sZGVyY2xvc2VkLnBuZyBiL2RvYy91ZGRpMi9odG1sL2Z0djJmb2xkZXJjbG9zZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZDA2MzQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9mdHYyZm9sZGVyY2xvc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9mdHYyZm9sZGVyb3Blbi5wbmcgYi9kb2MvdWRkaTIvaHRtbC9mdHYyZm9sZGVyb3Blbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJlMmM5MQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2Z0djJmb2xkZXJvcGVuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9mdHYybGFzdG5vZGUucG5nIGIvZG9jL3VkZGkyL2h0bWwvZnR2Mmxhc3Rub2RlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2I5YmE5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvZnR2Mmxhc3Rub2RlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9mdHYybGluay5wbmcgYi9kb2MvdWRkaTIvaHRtbC9mdHYybGluay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRmM2ZlZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2Z0djJsaW5rLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9mdHYybWxhc3Rub2RlLnBuZyBiL2RvYy91ZGRpMi9odG1sL2Z0djJtbGFzdG5vZGUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5Y2ViNmEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9mdHYybWxhc3Rub2RlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9mdHYybW5vZGUucG5nIGIvZG9jL3VkZGkyL2h0bWwvZnR2Mm1ub2RlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjU0YzA1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvZnR2Mm1ub2RlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9mdHYybm9kZS5wbmcgYi9kb2MvdWRkaTIvaHRtbC9mdHYybm9kZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlmMDZhNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2Z0djJub2RlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9mdHYycGxhc3Rub2RlLnBuZyBiL2RvYy91ZGRpMi9odG1sL2Z0djJwbGFzdG5vZGUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMDdlMDAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9mdHYycGxhc3Rub2RlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9mdHYycG5vZGUucG5nIGIvZG9jL3VkZGkyL2h0bWwvZnR2MnBub2RlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDAxYjc5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvZnR2MnBub2RlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9mdHYydmVydGxpbmUucG5nIGIvZG9jL3VkZGkyL2h0bWwvZnR2MnZlcnRsaW5lLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzMwZjNhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvZnR2MnZlcnRsaW5lLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9mdW5jdGlvbnMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2Z1bmN0aW9ucy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwN2UyNDcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9mdW5jdGlvbnMuaHRtbApAQCAtMCwwICsxLDE2MSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogQ2xhc3MgTWVtYmVyczwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4SEwiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4SEwiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5BbGw8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zX2Z1bmMuaHRtbCI+RnVuY3Rpb25zPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9uc192YXJzLmh0bWwiPlZhcmlhYmxlczwvYT48L2Rpdj4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9fIj5fPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9hIj5hPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9iIj5iPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9jIj5jPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9kIj5kPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9lIj5lPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9mIj5mPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9nIj5nPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9oIj5oPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9pIj5pPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9rIj5rPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9tIj5tPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9uIj5uPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9vIj5vPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9wIj5wPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9yIj5yPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9zIj5zPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF90Ij50PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF91Ij51PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF94Ij54PC9hPjwvZGl2Pg0KKw0KKzxwPg0KKw0KKzxwPg0KK0hlcmUgaXMgYSBsaXN0IG9mIGFsbCBjbGFzcyBtZW1iZXJzIHdpdGggbGlua3MgdG8gdGhlIGNsYXNzZXMgdGhleSBiZWxvbmcgdG86PGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X18iPi0gXyAtPC9hPjwvaDM+PHVsPg0KKzxsaT5fX2FueQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eV9leHQuaHRtbCNvMSI+dWRkaTJfX2J1c2luZXNzRW50aXR5RXh0PC9hPjxsaT5fX2l0ZW0NCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19waG9uZS5odG1sI28wIj51ZGRpMl9fcGhvbmU8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fbmFtZS5odG1sI28wIj51ZGRpMl9fbmFtZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19lcnJfaW5mby5odG1sI28wIj51ZGRpMl9fZXJySW5mbzwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19lbWFpbC5odG1sI28wIj51ZGRpMl9fZW1haWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzY292ZXJ5X3Vfcl9sLmh0bWwjbzAiPnVkZGkyX19kaXNjb3ZlcnlVUkw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVzY3JpcHRpb24uaHRtbCNvMCI+dWRkaTJfX2Rlc2NyaXB0aW9uPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FkZHJlc3NfbGluZS5odG1sI28wIj51ZGRpMl9fYWRkcmVzc0xpbmU8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWNjZXNzX3BvaW50Lmh0bWwjbzAiPnVkZGkyX19hY2Nlc3NQb2ludDwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF9hIj4tIGEgLTwvYT48L2gzPjx1bD4NCis8bGk+YWNjZXNzUG9pbnQNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX3RlbXBsYXRlLmh0bWwjbzIiPnVkZGkyX19iaW5kaW5nVGVtcGxhdGU8L2E+PGxpPmFkZHJlc3MNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19jb250YWN0Lmh0bWwjbzQiPnVkZGkyX19jb250YWN0PC9hPjxsaT5hZGRyZXNzTGluZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FkZHJlc3MuaHRtbCNvMCI+dWRkaTJfX2FkZHJlc3M8L2E+PGxpPmFzc2VydGlvblN0YXR1c0l0ZW0NCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sI28wIj51ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0PC9hPjxsaT5hdXRoSW5mbw0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2F1dGhfdG9rZW4uaHRtbCNvMCI+dWRkaTJfX2F1dGhUb2tlbjwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzAiPnVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzAiPnVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjbzAiPnVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2U8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvMCI+dWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI28wIj51ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lcmVnaXN0ZXJlZF9pbmZvLmh0bWwjbzAiPnVkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm88L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28wIj51ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2Vhc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sI28wIj51ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjYXJkX19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLmh0bWwjbzAiPnVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbjwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNvMCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjbzAiPnVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzAiPnVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzAiPnVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3M8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjbzAiPnVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZzwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzAiPnVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT48bGk+YXV0aG9yaXplZE5hbWUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19wdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28zIj51ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsLmh0bWwjbzciPnVkZGkyX190TW9kZWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5Lmh0bWwjbzkiPnVkZGkyX19idXNpbmVzc0VudGl0eTwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF9iIj4tIGIgLTwvYT48L2gzPjx1bD4NCis8bGk+YmluZGluZ0tleQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYmluZGluZ19kZXRhaWwuaHRtbCNvMCI+dWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI28xIj51ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmc8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19faG9zdGluZ19yZWRpcmVjdG9yLmh0bWwjbzAiPnVkZGkyX19ob3N0aW5nUmVkaXJlY3RvcjwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX3RlbXBsYXRlLmh0bWwjbzUiPnVkZGkyX19iaW5kaW5nVGVtcGxhdGU8L2E+PGxpPmJpbmRpbmdUZW1wbGF0ZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfZGV0YWlsLmh0bWwjbzAiPnVkZGkyX19iaW5kaW5nRGV0YWlsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNvMSI+dWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZzwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX3RlbXBsYXRlcy5odG1sI28wIj51ZGRpMl9fYmluZGluZ1RlbXBsYXRlczwvYT48bGk+YmluZGluZ1RlbXBsYXRlcw0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2UuaHRtbCNvMiI+dWRkaTJfX2J1c2luZXNzU2VydmljZTwvYT48bGk+YnVzaW5lc3NFbnRpdHkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWwuaHRtbCNvMCI+dWRkaTJfX2J1c2luZXNzRGV0YWlsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3ZhbGlkYXRlX19fdV9zX2Nfb19yX2V2YWx1ZXMuaHRtbCNvMCI+dWRkaTJfX3ZhbGlkYXRlX1VTQ09SRXZhbHVlczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI28xIj51ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHlfZXh0Lmh0bWwjbzAiPnVkZGkyX19idXNpbmVzc0VudGl0eUV4dDwvYT48bGk+YnVzaW5lc3NFbnRpdHlFeHQNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwjbzAiPnVkZGkyX19idXNpbmVzc0RldGFpbEV4dDwvYT48bGk+YnVzaW5lc3NJbmZvDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfaW5mb3MuaHRtbCNvMCI+dWRkaTJfX2J1c2luZXNzSW5mb3M8L2E+PGxpPmJ1c2luZXNzSW5mb3MNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWdpc3RlcmVkX2luZm8uaHRtbCNvMCI+dWRkaTJfX3JlZ2lzdGVyZWRJbmZvPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2xpc3QuaHRtbCNvMCI+dWRkaTJfX2J1c2luZXNzTGlzdDwvYT48bGk+YnVzaW5lc3NLZXkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzZXNfbGlzdC5odG1sI28wIj51ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsX2V4dC5odG1sI28wIj51ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsLmh0bWwjbzAiPnVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI282Ij51ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXJlbGF0ZWRfYnVzaW5lc3Nlcy5odG1sI28xIj51ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzEiPnVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3M8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9pbmZvLmh0bWwjbzIiPnVkZGkyX19zZXJ2aWNlSW5mbzwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzX2luZm8uaHRtbCNvMCI+dWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm88L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3Nfc2VydmljZS5odG1sI281Ij51ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2luZm8uaHRtbCNvMyI+dWRkaTJfX2J1c2luZXNzSW5mbzwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHkuaHRtbCNvNyI+dWRkaTJfX2J1c2luZXNzRW50aXR5PC9hPjxsaT5idXNpbmVzc1NlcnZpY2UNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2RldGFpbC5odG1sI28wIj51ZGRpMl9fc2VydmljZURldGFpbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX192YWxpZGF0ZV9fX3Vfc19jX29fcl9ldmFsdWVzLmh0bWwjbzEiPnVkZGkyX192YWxpZGF0ZV9VU0NPUkV2YWx1ZXM8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI28xIj51ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2VzLmh0bWwjbzAiPnVkZGkyX19idXNpbmVzc1NlcnZpY2VzPC9hPjxsaT5idXNpbmVzc1NlcnZpY2VzDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5Lmh0bWwjbzQiPnVkZGkyX19idXNpbmVzc0VudGl0eTwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF9jIj4tIGMgLTwvYT48L2gzPjx1bD4NCis8bGk+Y2F0ZWdvcnlCYWcNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzMiPnVkZGkyX19maW5kX1VTQ09SRXRNb2RlbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjbzIiPnVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2U8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvMyI+dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbC5odG1sI280Ij51ZGRpMl9fdE1vZGVsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2UuaHRtbCNvMyI+dWRkaTJfX2J1c2luZXNzU2VydmljZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHkuaHRtbCNvNiI+dWRkaTJfX2J1c2luZXNzRW50aXR5PC9hPjxsaT5jb21wbGV0aW9uU3RhdHVzDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2Vhc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sI28xIj51ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hc3NlcnRpb25fc3RhdHVzX2l0ZW0uaHRtbCNvNCI+dWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW08L2E+PGxpPmNvbnRhY3QNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19jb250YWN0cy5odG1sI28wIj51ZGRpMl9fY29udGFjdHM8L2E+PGxpPmNvbnRhY3RzDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5Lmh0bWwjbzMiPnVkZGkyX19idXNpbmVzc0VudGl0eTwvYT48bGk+Y3JlZA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sI28yIj51ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbjwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF9kIj4tIGQgLTwvYT48L2gzPjx1bD4NCis8bGk+ZGVzY3JpcHRpb24NCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luc3RhbmNlX2luZm8uaHRtbCNvMCI+dWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbzwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsLmh0bWwjbzEiPnVkZGkyX190TW9kZWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc19pbmZvLmh0bWwjbzIiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX292ZXJ2aWV3X2RvYy5odG1sI28wIj51ZGRpMl9fb3ZlcnZpZXdEb2M8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19faW5zdGFuY2VfZGV0YWlscy5odG1sI28wIj51ZGRpMl9faW5zdGFuY2VEZXRhaWxzPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NvbnRhY3QuaHRtbCNvMCI+dWRkaTJfX2NvbnRhY3Q8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3Nfc2VydmljZS5odG1sI28xIj51ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2luZm8uaHRtbCNvMSI+dWRkaTJfX2J1c2luZXNzSW5mbzwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHkuaHRtbCNvMiI+dWRkaTJfX2J1c2luZXNzRW50aXR5PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGUuaHRtbCNvMCI+dWRkaTJfX2JpbmRpbmdUZW1wbGF0ZTwvYT48bGk+ZGlyZWN0aW9uDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2hhcmVkX3JlbGF0aW9uc2hpcHMuaHRtbCNvMSI+dWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHM8L2E+PGxpPmRpc2NvdmVyeVVSTA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NvdmVyeV91X3JfbHMuaHRtbCNvMCI+dWRkaTJfX2Rpc2NvdmVyeVVSTHM8L2E+PGxpPmRpc2NvdmVyeVVSTHMNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI281Ij51ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHkuaHRtbCNvMCI+dWRkaTJfX2J1c2luZXNzRW50aXR5PC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X2UiPi0gZSAtPC9hPjwvaDM+PHVsPg0KKzxsaT5lbWFpbA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NvbnRhY3QuaHRtbCNvMyI+dWRkaTJfX2NvbnRhY3Q8L2E+PGxpPmVyckNvZGUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19lcnJfaW5mby5odG1sI28xIj51ZGRpMl9fZXJySW5mbzwvYT48bGk+ZXJySW5mbw0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3Jlc3VsdC5odG1sI28wIj51ZGRpMl9fcmVzdWx0PC9hPjxsaT5lcnJub18NCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZXN1bHQuaHRtbCNvMiI+dWRkaTJfX3Jlc3VsdDwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF9mIj4tIGYgLTwvYT48L2gzPjx1bD4NCis8bGk+ZmluZFF1YWxpZmllcg0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfcXVhbGlmaWVycy5odG1sI28wIj51ZGRpMl9fZmluZFF1YWxpZmllcnM8L2E+PGxpPmZpbmRRdWFsaWZpZXJzDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI28wIj51ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI28wIj51ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXJlbGF0ZWRfYnVzaW5lc3Nlcy5odG1sI28wIj51ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI28wIj51ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjbzAiPnVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmc8L2E+PGxpPmZyb21LZXkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19wdWJsaXNoZXJfYXNzZXJ0aW9uLmh0bWwjbzAiPnVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb248L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fa2V5c19vd25lZC5odG1sI28wIj51ZGRpMl9fa2V5c093bmVkPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfaXRlbS5odG1sI28wIj51ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbTwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF9nIj4tIGcgLTwvYT48L2gzPjx1bD4NCis8bGk+Z2VuZXJpYw0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfbGlzdC5odG1sI28xIj51ZGRpMl9fdE1vZGVsTGlzdDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2RldGFpbC5odG1sI28xIj51ZGRpMl9fdE1vZGVsRGV0YWlsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfbGlzdC5odG1sI28xIj51ZGRpMl9fc2VydmljZUxpc3Q8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9kZXRhaWwuaHRtbCNvMSI+dWRkaTJfX3NlcnZpY2VEZXRhaWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc2VzX2xpc3QuaHRtbCNvMiI+dWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWdpc3RlcmVkX2luZm8uaHRtbCNvMiI+dWRkaTJfX3JlZ2lzdGVyZWRJbmZvPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzEiPnVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2xpc3QuaHRtbCNvMSI+dWRkaTJfX2J1c2luZXNzTGlzdDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwjbzEiPnVkZGkyX19idXNpbmVzc0RldGFpbEV4dDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWwuaHRtbCNvMSI+dWRkaTJfX2J1c2luZXNzRGV0YWlsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfZGV0YWlsLmh0bWwjbzEiPnVkZGkyX19iaW5kaW5nRGV0YWlsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2F1dGhfdG9rZW4uaHRtbCNvMSI+dWRkaTJfX2F1dGhUb2tlbjwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sI28xIj51ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3ZhbGlkYXRlX19fdV9zX2Nfb19yX2V2YWx1ZXMuaHRtbCNvMyI+dWRkaTJfX3ZhbGlkYXRlX1VTQ09SRXZhbHVlczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzIiPnVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzMiPnVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjbzIiPnVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2U8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvMyI+dWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI28yIj51ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9ldF9tb2RlbF9kZXRhaWwuaHRtbCNvMSI+dWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VzZXJ2aWNlX2RldGFpbC5odG1sI28xIj51ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VyZWdpc3RlcmVkX2luZm8uaHRtbCNvMSI+dWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbzwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzEiPnVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbF9leHQuaHRtbCNvMSI+dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbC5odG1sI28xIj51ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYmluZGluZ19kZXRhaWwuaHRtbCNvMSI+dWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sI28wIj51ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbjwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWFzc2VydGlvbl9zdGF0dXNfcmVwb3J0Lmh0bWwjbzIiPnVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNvNCI+dWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvNCI+dWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VyZWxhdGVkX2J1c2luZXNzZXMuaHRtbCNvMyI+dWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXM8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvNiI+dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI28yIj51ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NhcmRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCNvMSI+dWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI28yIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvMiI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMiI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvMiI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNvMiI+dWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FkZF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMiI+dWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sI28xIj51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQ8L2E+PC91bD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfaCI+LSBoIC08L2E+PC9oMz48dWw+DQorPGxpPmhvc3RpbmdSZWRpcmVjdG9yDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZS5odG1sI28zIj51ZGRpMl9fYmluZGluZ1RlbXBsYXRlPC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X2kiPi0gaSAtPC9hPjwvaDM+PHVsPg0KKzxsaT5pZGVudGlmaWVyQmFnDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI28yIj51ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvMiI+dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbC5odG1sI28zIj51ZGRpMl9fdE1vZGVsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eS5odG1sI281Ij51ZGRpMl9fYnVzaW5lc3NFbnRpdHk8L2E+PGxpPmluc3RhbmNlRGV0YWlscw0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5zdGFuY2VfaW5mby5odG1sI28xIj51ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvPC9hPjxsaT5pbnN0YW5jZVBhcm1zDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19faW5zdGFuY2VfZGV0YWlscy5odG1sI28yIj51ZGRpMl9faW5zdGFuY2VEZXRhaWxzPC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X2siPi0gayAtPC9hPjwvaDM+PHVsPg0KKzxsaT5rZXllZFJlZmVyZW5jZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXJlbGF0ZWRfYnVzaW5lc3Nlcy5odG1sI28yIj51ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zaGFyZWRfcmVsYXRpb25zaGlwcy5odG1sI28wIj51ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19wdWJsaXNoZXJfYXNzZXJ0aW9uLmh0bWwjbzIiPnVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb248L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19faWRlbnRpZmllcl9iYWcuaHRtbCNvMCI+dWRkaTJfX2lkZW50aWZpZXJCYWc8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fY2F0ZWdvcnlfYmFnLmh0bWwjbzAiPnVkZGkyX19jYXRlZ29yeUJhZzwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hc3NlcnRpb25fc3RhdHVzX2l0ZW0uaHRtbCNvMiI+dWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW08L2E+PGxpPmtleU5hbWUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRyZXNzX2xpbmUuaHRtbCNvMSI+dWRkaTJfX2FkZHJlc3NMaW5lPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2tleWVkX3JlZmVyZW5jZS5odG1sI28xIj51ZGRpMl9fa2V5ZWRSZWZlcmVuY2U8L2E+PGxpPmtleXNPd25lZA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfaXRlbS5odG1sI28zIj51ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbTwvYT48bGk+a2V5VHlwZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3Jlc3VsdC5odG1sI28xIj51ZGRpMl9fcmVzdWx0PC9hPjxsaT5rZXlWYWx1ZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FkZHJlc3NfbGluZS5odG1sI28yIj51ZGRpMl9fYWRkcmVzc0xpbmU8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fa2V5ZWRfcmVmZXJlbmNlLmh0bWwjbzIiPnVkZGkyX19rZXllZFJlZmVyZW5jZTwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF9tIj4tIG0gLTwvYT48L2gzPjx1bD4NCis8bGk+bWF4Um93cw0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNvNSI+dWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvNSI+dWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VyZWxhdGVkX2J1c2luZXNzZXMuaHRtbCNvNCI+dWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXM8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvNyI+dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI28zIj51ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nPC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X24iPi0gbiAtPC9hPjwvaDM+PHVsPg0KKzxsaT5uYW1lDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI28xIj51ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI28xIj51ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzEiPnVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5mby5odG1sI28wIj51ZGRpMl9fdE1vZGVsSW5mbzwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsLmh0bWwjbzAiPnVkZGkyX190TW9kZWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9pbmZvLmh0bWwjbzAiPnVkZGkyX19zZXJ2aWNlSW5mbzwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzX2luZm8uaHRtbCNvMSI+dWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm88L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3Nfc2VydmljZS5odG1sI28wIj51ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2luZm8uaHRtbCNvMCI+dWRkaTJfX2J1c2luZXNzSW5mbzwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHkuaHRtbCNvMSI+dWRkaTJfX2J1c2luZXNzRW50aXR5PC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X28iPi0gbyAtPC9hPjwvaDM+PHVsPg0KKzxsaT5vcGVyYXRvcl8NCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2xpc3QuaHRtbCNvMiI+dWRkaTJfX3RNb2RlbExpc3Q8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9kZXRhaWwuaHRtbCNvMiI+dWRkaTJfX3RNb2RlbERldGFpbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2xpc3QuaHRtbCNvMiI+dWRkaTJfX3NlcnZpY2VMaXN0PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfZGV0YWlsLmh0bWwjbzIiPnVkZGkyX19zZXJ2aWNlRGV0YWlsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3Nlc19saXN0Lmh0bWwjbzMiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3Q8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVnaXN0ZXJlZF9pbmZvLmh0bWwjbzMiPnVkZGkyX19yZWdpc3RlcmVkSW5mbzwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19wdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28yIj51ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19saXN0Lmh0bWwjbzIiPnVkZGkyX19idXNpbmVzc0xpc3Q8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsX2V4dC5odG1sI28yIj51ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHQ8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsLmh0bWwjbzIiPnVkZGkyX19idXNpbmVzc0RldGFpbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX2RldGFpbC5odG1sI28yIj51ZGRpMl9fYmluZGluZ0RldGFpbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hdXRoX3Rva2VuLmh0bWwjbzIiPnVkZGkyX19hdXRoVG9rZW48L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXNzZXJ0aW9uX3N0YXR1c19yZXBvcnQuaHRtbCNvMiI+dWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsLmh0bWwjbzYiPnVkZGkyX190TW9kZWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwjbzIiPnVkZGkyX19kaXNwb3NpdGlvblJlcG9ydDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHkuaHRtbCNvOCI+dWRkaTJfX2J1c2luZXNzRW50aXR5PC9hPjxsaT5vdmVydmlld0RvYw0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWwuaHRtbCNvMiI+dWRkaTJfX3RNb2RlbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19pbnN0YW5jZV9kZXRhaWxzLmh0bWwjbzEiPnVkZGkyX19pbnN0YW5jZURldGFpbHM8L2E+PGxpPm92ZXJ2aWV3VVJMDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fb3ZlcnZpZXdfZG9jLmh0bWwjbzEiPnVkZGkyX19vdmVydmlld0RvYzwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF9wIj4tIHAgLTwvYT48L2gzPjx1bD4NCis8bGk+cGVyc29uTmFtZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NvbnRhY3QuaHRtbCNvMSI+dWRkaTJfX2NvbnRhY3Q8L2E+PGxpPnBob25lDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fY29udGFjdC5odG1sI28yIj51ZGRpMl9fY29udGFjdDwvYT48bGk+cHVibGlzaGVyQXNzZXJ0aW9uDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMCI+dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnM8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28xIj51ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28xIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28xIj51ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+PC91bD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfciI+LSByIC08L2E+PC9oMz48dWw+DQorPGxpPnJlbGF0ZWRCdXNpbmVzc0luZm8NCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzX2luZm9zLmh0bWwjbzAiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvczwvYT48bGk+cmVsYXRlZEJ1c2luZXNzSW5mb3MNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzZXNfbGlzdC5odG1sI28xIj51ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0PC9hPjxsaT5yZXN1bHQNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCNvMCI+dWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X3MiPi0gcyAtPC9hPjwvaDM+PHVsPg0KKzxsaT5zZW5kKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjYTIiPnVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjYTMiPnVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjYTMiPnVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2U8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNhMyI+dWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI2EzIj51ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9ldF9tb2RlbF9kZXRhaWwuaHRtbCNhMyI+dWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VzZXJ2aWNlX2RldGFpbC5odG1sI2EzIj51ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VyZWdpc3RlcmVkX2luZm8uaHRtbCNhMSI+dWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbzwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjYTEiPnVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbF9leHQuaHRtbCNhMyI+dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbC5odG1sI2EzIj51ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYmluZGluZ19kZXRhaWwuaHRtbCNhMyI+dWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sI2EyIj51ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbjwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWFzc2VydGlvbl9zdGF0dXNfcmVwb3J0Lmh0bWwjYTIiPnVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNhMyI+dWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNhNCI+dWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VyZWxhdGVkX2J1c2luZXNzZXMuaHRtbCNhMiI+dWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXM8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNhNCI+dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI2EzIj51ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NhcmRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCNhMiI+dWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI2EzIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNhMyI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNhMiI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNhMyI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNhMyI+dWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FkZF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNhMiI+dWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPjxsaT5zZXJ2aWNlSW5mbw0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfaW5mb3MuaHRtbCNvMCI+dWRkaTJfX3NlcnZpY2VJbmZvczwvYT48bGk+c2VydmljZUluZm9zDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9saXN0Lmh0bWwjbzAiPnVkZGkyX19zZXJ2aWNlTGlzdDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19pbmZvLmh0bWwjbzIiPnVkZGkyX19idXNpbmVzc0luZm88L2E+PGxpPnNlcnZpY2VLZXkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXNlcnZpY2VfZGV0YWlsLmh0bWwjbzAiPnVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjbzQiPnVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmc8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjbzEiPnVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2luZm8uaHRtbCNvMSI+dWRkaTJfX3NlcnZpY2VJbmZvPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2UuaHRtbCNvNCI+dWRkaTJfX2J1c2luZXNzU2VydmljZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX3RlbXBsYXRlLmh0bWwjbzQiPnVkZGkyX19iaW5kaW5nVGVtcGxhdGU8L2E+PGxpPnNoYXJlZFJlbGF0aW9uc2hpcHMNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzX2luZm8uaHRtbCNvMyI+dWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm88L2E+PGxpPnNvYXANCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3NfX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sI28xIj5fZGlzcG9zaXRpb25SZXBvcnQ8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcGhvbmUuaHRtbCNvMiI+dWRkaTJfX3Bob25lPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX25hbWUuaHRtbCNvMiI+dWRkaTJfX25hbWU8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZXJyX2luZm8uaHRtbCNvMiI+dWRkaTJfX2VyckluZm88L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZW1haWwuaHRtbCNvMiI+dWRkaTJfX2VtYWlsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NvdmVyeV91X3JfbC5odG1sI28yIj51ZGRpMl9fZGlzY292ZXJ5VVJMPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rlc2NyaXB0aW9uLmh0bWwjbzIiPnVkZGkyX19kZXNjcmlwdGlvbjwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRyZXNzX2xpbmUuaHRtbCNvMyI+dWRkaTJfX2FkZHJlc3NMaW5lPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FjY2Vzc19wb2ludC5odG1sI28yIj51ZGRpMl9fYWNjZXNzUG9pbnQ8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9saXN0Lmh0bWwjbzQiPnVkZGkyX190TW9kZWxMaXN0PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfZGV0YWlsLmh0bWwjbzQiPnVkZGkyX190TW9kZWxEZXRhaWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9saXN0Lmh0bWwjbzQiPnVkZGkyX19zZXJ2aWNlTGlzdDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2RldGFpbC5odG1sI280Ij51ZGRpMl9fc2VydmljZURldGFpbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzZXNfbGlzdC5odG1sI281Ij51ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlZ2lzdGVyZWRfaW5mby5odG1sI281Ij51ZGRpMl9fcmVnaXN0ZXJlZEluZm88L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvNCI+dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnM8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfbGlzdC5odG1sI280Ij51ZGRpMl9fYnVzaW5lc3NMaXN0PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2RldGFpbF9leHQuaHRtbCNvNCI+dWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2RldGFpbC5odG1sI280Ij51ZGRpMl9fYnVzaW5lc3NEZXRhaWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ19kZXRhaWwuaHRtbCNvNCI+dWRkaTJfX2JpbmRpbmdEZXRhaWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXV0aF90b2tlbi5odG1sI28zIj51ZGRpMl9fYXV0aFRva2VuPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfcmVwb3J0Lmh0bWwjbzMiPnVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQ8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdmFsaWRhdGVfX191X3NfY19vX3JfZXZhbHVlcy5odG1sI280Ij51ZGRpMl9fdmFsaWRhdGVfVVNDT1JFdmFsdWVzPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMyI+dWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNvNCI+dWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvMyI+dWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI280Ij51ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjbzMiPnVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmc8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2V0X21vZGVsX2RldGFpbC5odG1sI28yIj51ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXNlcnZpY2VfZGV0YWlsLmh0bWwjbzIiPnVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXJlZ2lzdGVyZWRfaW5mby5odG1sI28yIj51ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMiI+dWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsX2V4dC5odG1sI28yIj51ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsLmh0bWwjbzIiPnVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2ViaW5kaW5nX2RldGFpbC5odG1sI28yIj51ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLmh0bWwjbzMiPnVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXNzZXJ0aW9uX3N0YXR1c19yZXBvcnQuaHRtbCNvMyI+dWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQ8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI282Ij51ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI283Ij51ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXJlbGF0ZWRfYnVzaW5lc3Nlcy5odG1sI281Ij51ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI284Ij51ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjbzUiPnVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmc8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzY2FyZF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sI28yIj51ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW48L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzMiPnVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI28zIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2U8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28zIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI28zIj51ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI28zIj51ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmc8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28zIj51ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbnN0YW5jZV9pbmZvLmh0bWwjbzMiPnVkZGkyX190TW9kZWxJbnN0YW5jZUluZm88L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbnN0YW5jZV9kZXRhaWxzLmh0bWwjbzEiPnVkZGkyX190TW9kZWxJbnN0YW5jZURldGFpbHM8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbmZvcy5odG1sI28xIj51ZGRpMl9fdE1vZGVsSW5mb3M8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbmZvLmh0bWwjbzIiPnVkZGkyX190TW9kZWxJbmZvPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfYmFnLmh0bWwjbzEiPnVkZGkyX190TW9kZWxCYWc8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbC5odG1sI284Ij51ZGRpMl9fdE1vZGVsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NoYXJlZF9yZWxhdGlvbnNoaXBzLmh0bWwjbzIiPnVkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfaW5mb3MuaHRtbCNvMSI+dWRkaTJfX3NlcnZpY2VJbmZvczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2luZm8uaHRtbCNvMyI+dWRkaTJfX3NlcnZpY2VJbmZvPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3Jlc3VsdC5odG1sI28zIj51ZGRpMl9fcmVzdWx0PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3NfaW5mb3MuaHRtbCNvMSI+dWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3NfaW5mby5odG1sI280Ij51ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbzwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19wdWJsaXNoZXJfYXNzZXJ0aW9uLmh0bWwjbzMiPnVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb248L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fb3ZlcnZpZXdfZG9jLmh0bWwjbzIiPnVkZGkyX19vdmVydmlld0RvYzwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19rZXlzX293bmVkLmh0bWwjbzIiPnVkZGkyX19rZXlzT3duZWQ8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fa2V5ZWRfcmVmZXJlbmNlLmh0bWwjbzMiPnVkZGkyX19rZXllZFJlZmVyZW5jZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19pbnN0YW5jZV9kZXRhaWxzLmh0bWwjbzMiPnVkZGkyX19pbnN0YW5jZURldGFpbHM8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19faWRlbnRpZmllcl9iYWcuaHRtbCNvMSI+dWRkaTJfX2lkZW50aWZpZXJCYWc8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19faG9zdGluZ19yZWRpcmVjdG9yLmh0bWwjbzEiPnVkZGkyX19ob3N0aW5nUmVkaXJlY3RvcjwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX3F1YWxpZmllcnMuaHRtbCNvMSI+dWRkaTJfX2ZpbmRRdWFsaWZpZXJzPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sI280Ij51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQ8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzY292ZXJ5X3Vfcl9scy5odG1sI28xIj51ZGRpMl9fZGlzY292ZXJ5VVJMczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19jb250YWN0cy5odG1sI28xIj51ZGRpMl9fY29udGFjdHM8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fY29udGFjdC5odG1sI282Ij51ZGRpMl9fY29udGFjdDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19jYXRlZ29yeV9iYWcuaHRtbCNvMSI+dWRkaTJfX2NhdGVnb3J5QmFnPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2VzLmh0bWwjbzEiPnVkZGkyX19idXNpbmVzc1NlcnZpY2VzPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2UuaHRtbCNvNiI+dWRkaTJfX2J1c2luZXNzU2VydmljZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19pbmZvcy5odG1sI28xIj51ZGRpMl9fYnVzaW5lc3NJbmZvczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19pbmZvLmh0bWwjbzQiPnVkZGkyX19idXNpbmVzc0luZm88L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5X2V4dC5odG1sI28yIj51ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQ8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5Lmh0bWwjbzEwIj51ZGRpMl9fYnVzaW5lc3NFbnRpdHk8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZXMuaHRtbCNvMSI+dWRkaTJfX2JpbmRpbmdUZW1wbGF0ZXM8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZS5odG1sI282Ij51ZGRpMl9fYmluZGluZ1RlbXBsYXRlPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfaXRlbS5odG1sI281Ij51ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRyZXNzLmh0bWwjbzQiPnVkZGkyX19hZGRyZXNzPC9hPjxsaT5zb3J0Q29kZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FkZHJlc3MuaHRtbCNvMiI+dWRkaTJfX2FkZHJlc3M8L2E+PC91bD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfdCI+LSB0IC08L2E+PC9oMz48dWw+DQorPGxpPnRNb2RlbA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfZGV0YWlsLmh0bWwjbzAiPnVkZGkyX190TW9kZWxEZXRhaWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdmFsaWRhdGVfX191X3NfY19vX3JfZXZhbHVlcy5odG1sI28yIj51ZGRpMl9fdmFsaWRhdGVfVVNDT1JFdmFsdWVzPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNvMSI+dWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsPC9hPjxsaT50TW9kZWxCYWcNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjbzMiPnVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2U8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvNCI+dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI28xIj51ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nPC9hPjxsaT50TW9kZWxJbmZvDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbmZvcy5odG1sI28wIj51ZGRpMl9fdE1vZGVsSW5mb3M8L2E+PGxpPnRNb2RlbEluZm9zDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9saXN0Lmh0bWwjbzAiPnVkZGkyX190TW9kZWxMaXN0PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlZ2lzdGVyZWRfaW5mby5odG1sI28xIj51ZGRpMl9fcmVnaXN0ZXJlZEluZm88L2E+PGxpPnRNb2RlbEluc3RhbmNlRGV0YWlscw0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGUuaHRtbCNvMSI+dWRkaTJfX2JpbmRpbmdUZW1wbGF0ZTwvYT48bGk+dE1vZGVsSW5zdGFuY2VJbmZvDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbnN0YW5jZV9kZXRhaWxzLmh0bWwjbzAiPnVkZGkyX190TW9kZWxJbnN0YW5jZURldGFpbHM8L2E+PGxpPnRNb2RlbEtleQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9ldF9tb2RlbF9kZXRhaWwuaHRtbCNvMCI+dWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzEiPnVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5zdGFuY2VfaW5mby5odG1sI28yIj51ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5mby5odG1sI28xIj51ZGRpMl9fdE1vZGVsSW5mbzwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2JhZy5odG1sI28wIj51ZGRpMl9fdE1vZGVsQmFnPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWwuaHRtbCNvNSI+dWRkaTJfX3RNb2RlbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19rZXllZF9yZWZlcmVuY2UuaHRtbCNvMCI+dWRkaTJfX2tleWVkUmVmZXJlbmNlPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FkZHJlc3MuaHRtbCNvMyI+dWRkaTJfX2FkZHJlc3M8L2E+PGxpPnRvS2V5DQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbi5odG1sI28xIj51ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2tleXNfb3duZWQuaHRtbCNvMSI+dWRkaTJfX2tleXNPd25lZDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hc3NlcnRpb25fc3RhdHVzX2l0ZW0uaHRtbCNvMSI+dWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW08L2E+PGxpPnRydW5jYXRlZA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfbGlzdC5odG1sI28zIj51ZGRpMl9fdE1vZGVsTGlzdDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2RldGFpbC5odG1sI28zIj51ZGRpMl9fdE1vZGVsRGV0YWlsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfbGlzdC5odG1sI28zIj51ZGRpMl9fc2VydmljZUxpc3Q8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9kZXRhaWwuaHRtbCNvMyI+dWRkaTJfX3NlcnZpY2VEZXRhaWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc2VzX2xpc3QuaHRtbCNvNCI+dWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWdpc3RlcmVkX2luZm8uaHRtbCNvNCI+dWRkaTJfX3JlZ2lzdGVyZWRJbmZvPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2xpc3QuaHRtbCNvMyI+dWRkaTJfX2J1c2luZXNzTGlzdDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwjbzMiPnVkZGkyX19idXNpbmVzc0RldGFpbEV4dDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWwuaHRtbCNvMyI+dWRkaTJfX2J1c2luZXNzRGV0YWlsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfZGV0YWlsLmh0bWwjbzMiPnVkZGkyX19iaW5kaW5nRGV0YWlsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sI28zIj51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQ8L2E+PC91bD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfdSI+LSB1IC08L2E+PC9oMz48dWw+DQorPGxpPnVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucygpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI2ExIj51ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+PGxpPnVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZygpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjYTIiPnVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZzwvYT48bGk+dWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcygpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI2EyIj51ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzPC9hPjxsaT51ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNhMSI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPjxsaT51ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI2EyIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2U8L2E+PGxpPnVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNhMiI+dWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWw8L2E+PGxpPnVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbigpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzY2FyZF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sI2ExIj51ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW48L2E+PGxpPnVkZGkyX19kaXNwb3NpdGlvblJlcG9ydF8NCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3NfX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sI28wIj5fZGlzcG9zaXRpb25SZXBvcnQ8L2E+PGxpPnVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmcoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNhMiI+dWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZzwvYT48bGk+dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjYTMiPnVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzPC9hPjxsaT51ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcygpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lcmVsYXRlZF9idXNpbmVzc2VzLmh0bWwjYTEiPnVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzPC9hPjxsaT51ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjYTMiPnVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2U8L2E+PGxpPnVkZGkyX19maW5kX1VTQ09SRXRNb2RlbCgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI2EyIj51ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWw8L2E+PGxpPnVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWFzc2VydGlvbl9zdGF0dXNfcmVwb3J0Lmh0bWwjYTEiPnVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0PC9hPjxsaT51ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbigpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLmh0bWwjYTEiPnVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuPC9hPjxsaT51ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYmluZGluZ19kZXRhaWwuaHRtbCNhMiI+dWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsPC9hPjxsaT51ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbC5odG1sI2EyIj51ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsPC9hPjxsaT51ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0KCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbF9leHQuaHRtbCNhMiI+dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dDwvYT48bGk+dWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjYTAiPnVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT48bGk+dWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbygpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VyZWdpc3RlcmVkX2luZm8uaHRtbCNhMCI+dWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbzwvYT48bGk+dWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXNlcnZpY2VfZGV0YWlsLmh0bWwjYTIiPnVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbDwvYT48bGk+dWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9ldF9tb2RlbF9kZXRhaWwuaHRtbCNhMiI+dWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWw8L2E+PGxpPnVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNhMiI+dWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZzwvYT48bGk+dWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3MoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjYTIiPnVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzPC9hPjxsaT51ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjYTIiPnVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2U8L2E+PGxpPnVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbCgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI2EyIj51ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWw8L2E+PGxpPnVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucygpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI2ExIj51ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+PGxpPnVwbG9hZFJlZ2lzdGVyDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI28yIj51ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvMiI+dWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M8L2E+PGxpPlVSTFR5cGUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hY2Nlc3NfcG9pbnQuaHRtbCNvMSI+dWRkaTJfX2FjY2Vzc1BvaW50PC9hPjxsaT51c2VySUQNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCNvMSI+dWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW48L2E+PGxpPnVzZVR5cGUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19waG9uZS5odG1sI28xIj51ZGRpMl9fcGhvbmU8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZW1haWwuaHRtbCNvMSI+dWRkaTJfX2VtYWlsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NvdmVyeV91X3JfbC5odG1sI28xIj51ZGRpMl9fZGlzY292ZXJ5VVJMPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NvbnRhY3QuaHRtbCNvNSI+dWRkaTJfX2NvbnRhY3Q8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkcmVzcy5odG1sI28xIj51ZGRpMl9fYWRkcmVzczwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF94Ij4tIHggLTwvYT48L2gzPjx1bD4NCis8bGk+eG1sX19sYW5nXw0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX25hbWUuaHRtbCNvMSI+dWRkaTJfX25hbWU8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVzY3JpcHRpb24uaHRtbCNvMSI+dWRkaTJfX2Rlc2NyaXB0aW9uPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTY6NTggMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvZnVuY3Rpb25zX2Z1bmMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2Z1bmN0aW9uc19mdW5jLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE3NjIyOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2Z1bmN0aW9uc19mdW5jLmh0bWwKQEAgLTAsMCArMSw0NCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogQ2xhc3MgTWVtYmVycyAtIEZ1bmN0aW9uczwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4SEwiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+QWxsPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXhITCIgaHJlZj0iZnVuY3Rpb25zX2Z1bmMuaHRtbCI+RnVuY3Rpb25zPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9uc192YXJzLmh0bWwiPlZhcmlhYmxlczwvYT48L2Rpdj4NCisNCis8cD4NCis8dWw+DQorPGxpPnNlbmQoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNhMiI+dWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNhMyI+dWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNhMyI+dWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI2EzIj51ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjYTMiPnVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmc8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2V0X21vZGVsX2RldGFpbC5odG1sI2EzIj51ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXNlcnZpY2VfZGV0YWlsLmh0bWwjYTMiPnVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXJlZ2lzdGVyZWRfaW5mby5odG1sI2ExIj51ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNhMSI+dWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsX2V4dC5odG1sI2EzIj51ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsLmh0bWwjYTMiPnVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2ViaW5kaW5nX2RldGFpbC5odG1sI2EzIj51ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLmh0bWwjYTIiPnVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXNzZXJ0aW9uX3N0YXR1c19yZXBvcnQuaHRtbCNhMiI+dWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQ8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI2EzIj51ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI2E0Ij51ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXJlbGF0ZWRfYnVzaW5lc3Nlcy5odG1sI2EyIj51ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI2E0Ij51ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjYTMiPnVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmc8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzY2FyZF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sI2EyIj51ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW48L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjYTMiPnVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI2EzIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2U8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI2EyIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI2EzIj51ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI2EzIj51ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmc8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI2EyIj51ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+PGxpPnVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucygpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI2ExIj51ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+PGxpPnVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZygpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjYTIiPnVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZzwvYT48bGk+dWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcygpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI2EyIj51ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzPC9hPjxsaT51ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNhMSI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPjxsaT51ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI2EyIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2U8L2E+PGxpPnVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNhMiI+dWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWw8L2E+PGxpPnVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbigpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzY2FyZF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sI2ExIj51ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW48L2E+PGxpPnVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmcoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNhMiI+dWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZzwvYT48bGk+dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjYTMiPnVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzPC9hPjxsaT51ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcygpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lcmVsYXRlZF9idXNpbmVzc2VzLmh0bWwjYTEiPnVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzPC9hPjxsaT51ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjYTMiPnVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2U8L2E+PGxpPnVkZGkyX19maW5kX1VTQ09SRXRNb2RlbCgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI2EyIj51ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWw8L2E+PGxpPnVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWFzc2VydGlvbl9zdGF0dXNfcmVwb3J0Lmh0bWwjYTEiPnVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0PC9hPjxsaT51ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbigpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLmh0bWwjYTEiPnVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuPC9hPjxsaT51ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYmluZGluZ19kZXRhaWwuaHRtbCNhMiI+dWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsPC9hPjxsaT51ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbC5odG1sI2EyIj51ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsPC9hPjxsaT51ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0KCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbF9leHQuaHRtbCNhMiI+dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dDwvYT48bGk+dWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjYTAiPnVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT48bGk+dWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbygpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VyZWdpc3RlcmVkX2luZm8uaHRtbCNhMCI+dWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbzwvYT48bGk+dWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXNlcnZpY2VfZGV0YWlsLmh0bWwjYTIiPnVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbDwvYT48bGk+dWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9ldF9tb2RlbF9kZXRhaWwuaHRtbCNhMiI+dWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWw8L2E+PGxpPnVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNhMiI+dWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZzwvYT48bGk+dWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3MoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjYTIiPnVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzPC9hPjxsaT51ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjYTIiPnVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2U8L2E+PGxpPnVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbCgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI2EyIj51ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWw8L2E+PGxpPnVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucygpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI2ExIj51ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNjo1OCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9mdW5jdGlvbnNfdmFycy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvZnVuY3Rpb25zX3ZhcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGI2YTQxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvZnVuY3Rpb25zX3ZhcnMuaHRtbApAQCAtMCwwICsxLDEzNCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgVURESSB2MjogQ2xhc3MgTWVtYmVycyAtIFZhcmlhYmxlczwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4SEwiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+QWxsPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9uc19mdW5jLmh0bWwiPkZ1bmN0aW9uczwvYT4gfCA8YSBjbGFzcz0icWluZGV4SEwiIGhyZWY9ImZ1bmN0aW9uc192YXJzLmh0bWwiPlZhcmlhYmxlczwvYT48L2Rpdj4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9fIj5fPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9hIj5hPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9iIj5iPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9jIj5jPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9kIj5kPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9lIj5lPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9mIj5mPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9nIj5nPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9oIj5oPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9pIj5pPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9rIj5rPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9tIj5tPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9uIj5uPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9vIj5vPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9wIj5wPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9yIj5yPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9zIj5zPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF90Ij50PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF91Ij51PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF94Ij54PC9hPjwvZGl2Pg0KKw0KKzxwPg0KKw0KKzxwPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF9fIj4tIF8gLTwvYT48L2gzPjx1bD4NCis8bGk+X19hbnkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHlfZXh0Lmh0bWwjbzEiPnVkZGkyX19idXNpbmVzc0VudGl0eUV4dDwvYT48bGk+X19pdGVtDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcGhvbmUuaHRtbCNvMCI+dWRkaTJfX3Bob25lPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX25hbWUuaHRtbCNvMCI+dWRkaTJfX25hbWU8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZXJyX2luZm8uaHRtbCNvMCI+dWRkaTJfX2VyckluZm88L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZW1haWwuaHRtbCNvMCI+dWRkaTJfX2VtYWlsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NvdmVyeV91X3JfbC5odG1sI28wIj51ZGRpMl9fZGlzY292ZXJ5VVJMPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rlc2NyaXB0aW9uLmh0bWwjbzAiPnVkZGkyX19kZXNjcmlwdGlvbjwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRyZXNzX2xpbmUuaHRtbCNvMCI+dWRkaTJfX2FkZHJlc3NMaW5lPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FjY2Vzc19wb2ludC5odG1sI28wIj51ZGRpMl9fYWNjZXNzUG9pbnQ8L2E+PC91bD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfYSI+LSBhIC08L2E+PC9oMz48dWw+DQorPGxpPmFjY2Vzc1BvaW50DQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZS5odG1sI28yIj51ZGRpMl9fYmluZGluZ1RlbXBsYXRlPC9hPjxsaT5hZGRyZXNzDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fY29udGFjdC5odG1sI280Ij51ZGRpMl9fY29udGFjdDwvYT48bGk+YWRkcmVzc0xpbmUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRyZXNzLmh0bWwjbzAiPnVkZGkyX19hZGRyZXNzPC9hPjxsaT5hc3NlcnRpb25TdGF0dXNJdGVtDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXNzZXJ0aW9uX3N0YXR1c19yZXBvcnQuaHRtbCNvMCI+dWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydDwvYT48bGk+YXV0aEluZm8NCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hdXRoX3Rva2VuLmh0bWwjbzAiPnVkZGkyX19hdXRoVG9rZW48L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28wIj51ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI28wIj51ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI28wIj51ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzAiPnVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNvMCI+dWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZzwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXJlZ2lzdGVyZWRfaW5mby5odG1sI28wIj51ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMCI+dWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXNzZXJ0aW9uX3N0YXR1c19yZXBvcnQuaHRtbCNvMCI+dWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQ8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzY2FyZF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sI28wIj51ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW48L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzAiPnVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI28wIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2U8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28wIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI28wIj51ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI28wIj51ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmc8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28wIj51ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+PGxpPmF1dGhvcml6ZWROYW1lDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMyI+dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnM8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbC5odG1sI283Ij51ZGRpMl9fdE1vZGVsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eS5odG1sI285Ij51ZGRpMl9fYnVzaW5lc3NFbnRpdHk8L2E+PC91bD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfYiI+LSBiIC08L2E+PC9oMz48dWw+DQorPGxpPmJpbmRpbmdLZXkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJpbmRpbmdfZGV0YWlsLmh0bWwjbzAiPnVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNvMSI+dWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2hvc3RpbmdfcmVkaXJlY3Rvci5odG1sI28wIj51ZGRpMl9faG9zdGluZ1JlZGlyZWN0b3I8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZS5odG1sI281Ij51ZGRpMl9fYmluZGluZ1RlbXBsYXRlPC9hPjxsaT5iaW5kaW5nVGVtcGxhdGUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX2RldGFpbC5odG1sI28wIj51ZGRpMl9fYmluZGluZ0RldGFpbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjbzEiPnVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmc8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZXMuaHRtbCNvMCI+dWRkaTJfX2JpbmRpbmdUZW1wbGF0ZXM8L2E+PGxpPmJpbmRpbmdUZW1wbGF0ZXMNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlLmh0bWwjbzIiPnVkZGkyX19idXNpbmVzc1NlcnZpY2U8L2E+PGxpPmJ1c2luZXNzRW50aXR5DQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsLmh0bWwjbzAiPnVkZGkyX19idXNpbmVzc0RldGFpbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX192YWxpZGF0ZV9fX3Vfc19jX29fcl9ldmFsdWVzLmh0bWwjbzAiPnVkZGkyX192YWxpZGF0ZV9VU0NPUkV2YWx1ZXM8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvMSI+dWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5X2V4dC5odG1sI28wIj51ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQ8L2E+PGxpPmJ1c2luZXNzRW50aXR5RXh0DQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsX2V4dC5odG1sI28wIj51ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHQ8L2E+PGxpPmJ1c2luZXNzSW5mbw0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2luZm9zLmh0bWwjbzAiPnVkZGkyX19idXNpbmVzc0luZm9zPC9hPjxsaT5idXNpbmVzc0luZm9zDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVnaXN0ZXJlZF9pbmZvLmh0bWwjbzAiPnVkZGkyX19yZWdpc3RlcmVkSW5mbzwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19saXN0Lmh0bWwjbzAiPnVkZGkyX19idXNpbmVzc0xpc3Q8L2E+PGxpPmJ1c2luZXNzS2V5DQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc2VzX2xpc3QuaHRtbCNvMCI+dWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbF9leHQuaHRtbCNvMCI+dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbC5odG1sI28wIj51ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvNiI+dWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VyZWxhdGVkX2J1c2luZXNzZXMuaHRtbCNvMSI+dWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXM8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI28xIj51ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfaW5mby5odG1sI28yIj51ZGRpMl9fc2VydmljZUluZm88L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc19pbmZvLmh0bWwjbzAiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2UuaHRtbCNvNSI+dWRkaTJfX2J1c2luZXNzU2VydmljZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19pbmZvLmh0bWwjbzMiPnVkZGkyX19idXNpbmVzc0luZm88L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5Lmh0bWwjbzciPnVkZGkyX19idXNpbmVzc0VudGl0eTwvYT48bGk+YnVzaW5lc3NTZXJ2aWNlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9kZXRhaWwuaHRtbCNvMCI+dWRkaTJfX3NlcnZpY2VEZXRhaWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdmFsaWRhdGVfX191X3NfY19vX3JfZXZhbHVlcy5odG1sI28xIj51ZGRpMl9fdmFsaWRhdGVfVVNDT1JFdmFsdWVzPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvMSI+dWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlcy5odG1sI28wIj51ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlczwvYT48bGk+YnVzaW5lc3NTZXJ2aWNlcw0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eS5odG1sI280Ij51ZGRpMl9fYnVzaW5lc3NFbnRpdHk8L2E+PC91bD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfYyI+LSBjIC08L2E+PC9oMz48dWw+DQorPGxpPmNhdGVnb3J5QmFnDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI28zIj51ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI28yIj51ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzMiPnVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWwuaHRtbCNvNCI+dWRkaTJfX3RNb2RlbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlLmh0bWwjbzMiPnVkZGkyX19idXNpbmVzc1NlcnZpY2U8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5Lmh0bWwjbzYiPnVkZGkyX19idXNpbmVzc0VudGl0eTwvYT48bGk+Y29tcGxldGlvblN0YXR1cw0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXNzZXJ0aW9uX3N0YXR1c19yZXBvcnQuaHRtbCNvMSI+dWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQ8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXNzZXJ0aW9uX3N0YXR1c19pdGVtLmh0bWwjbzQiPnVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtPC9hPjxsaT5jb250YWN0DQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fY29udGFjdHMuaHRtbCNvMCI+dWRkaTJfX2NvbnRhY3RzPC9hPjxsaT5jb250YWN0cw0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eS5odG1sI28zIj51ZGRpMl9fYnVzaW5lc3NFbnRpdHk8L2E+PGxpPmNyZWQNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCNvMiI+dWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW48L2E+PC91bD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfZCI+LSBkIC08L2E+PC9oMz48dWw+DQorPGxpPmRlc2NyaXB0aW9uDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbnN0YW5jZV9pbmZvLmh0bWwjbzAiPnVkZGkyX190TW9kZWxJbnN0YW5jZUluZm88L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbC5odG1sI28xIj51ZGRpMl9fdE1vZGVsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3NfaW5mby5odG1sI28yIj51ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbzwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19vdmVydmlld19kb2MuaHRtbCNvMCI+dWRkaTJfX292ZXJ2aWV3RG9jPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2luc3RhbmNlX2RldGFpbHMuaHRtbCNvMCI+dWRkaTJfX2luc3RhbmNlRGV0YWlsczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19jb250YWN0Lmh0bWwjbzAiPnVkZGkyX19jb250YWN0PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2UuaHRtbCNvMSI+dWRkaTJfX2J1c2luZXNzU2VydmljZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19pbmZvLmh0bWwjbzEiPnVkZGkyX19idXNpbmVzc0luZm88L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5Lmh0bWwjbzIiPnVkZGkyX19idXNpbmVzc0VudGl0eTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX3RlbXBsYXRlLmh0bWwjbzAiPnVkZGkyX19iaW5kaW5nVGVtcGxhdGU8L2E+PGxpPmRpcmVjdGlvbg0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NoYXJlZF9yZWxhdGlvbnNoaXBzLmh0bWwjbzEiPnVkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzPC9hPjxsaT5kaXNjb3ZlcnlVUkwNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjb3ZlcnlfdV9yX2xzLmh0bWwjbzAiPnVkZGkyX19kaXNjb3ZlcnlVUkxzPC9hPjxsaT5kaXNjb3ZlcnlVUkxzDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvNSI+dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5Lmh0bWwjbzAiPnVkZGkyX19idXNpbmVzc0VudGl0eTwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF9lIj4tIGUgLTwvYT48L2gzPjx1bD4NCis8bGk+ZW1haWwNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19jb250YWN0Lmh0bWwjbzMiPnVkZGkyX19jb250YWN0PC9hPjxsaT5lcnJDb2RlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZXJyX2luZm8uaHRtbCNvMSI+dWRkaTJfX2VyckluZm88L2E+PGxpPmVyckluZm8NCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZXN1bHQuaHRtbCNvMCI+dWRkaTJfX3Jlc3VsdDwvYT48bGk+ZXJybm9fDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVzdWx0Lmh0bWwjbzIiPnVkZGkyX19yZXN1bHQ8L2E+PC91bD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfZiI+LSBmIC08L2E+PC9oMz48dWw+DQorPGxpPmZpbmRRdWFsaWZpZXINCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX3F1YWxpZmllcnMuaHRtbCNvMCI+dWRkaTJfX2ZpbmRRdWFsaWZpZXJzPC9hPjxsaT5maW5kUXVhbGlmaWVycw0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNvMCI+dWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvMCI+dWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VyZWxhdGVkX2J1c2luZXNzZXMuaHRtbCNvMCI+dWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXM8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvMCI+dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI28wIj51ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nPC9hPjxsaT5mcm9tS2V5DQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbi5odG1sI28wIj51ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2tleXNfb3duZWQuaHRtbCNvMCI+dWRkaTJfX2tleXNPd25lZDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hc3NlcnRpb25fc3RhdHVzX2l0ZW0uaHRtbCNvMCI+dWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW08L2E+PC91bD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfZyI+LSBnIC08L2E+PC9oMz48dWw+DQorPGxpPmdlbmVyaWMNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2xpc3QuaHRtbCNvMSI+dWRkaTJfX3RNb2RlbExpc3Q8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9kZXRhaWwuaHRtbCNvMSI+dWRkaTJfX3RNb2RlbERldGFpbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2xpc3QuaHRtbCNvMSI+dWRkaTJfX3NlcnZpY2VMaXN0PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfZGV0YWlsLmh0bWwjbzEiPnVkZGkyX19zZXJ2aWNlRGV0YWlsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3Nlc19saXN0Lmh0bWwjbzIiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3Q8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVnaXN0ZXJlZF9pbmZvLmh0bWwjbzIiPnVkZGkyX19yZWdpc3RlcmVkSW5mbzwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19wdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28xIj51ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19saXN0Lmh0bWwjbzEiPnVkZGkyX19idXNpbmVzc0xpc3Q8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsX2V4dC5odG1sI28xIj51ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHQ8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsLmh0bWwjbzEiPnVkZGkyX19idXNpbmVzc0RldGFpbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX2RldGFpbC5odG1sI28xIj51ZGRpMl9fYmluZGluZ0RldGFpbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hdXRoX3Rva2VuLmh0bWwjbzEiPnVkZGkyX19hdXRoVG9rZW48L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXNzZXJ0aW9uX3N0YXR1c19yZXBvcnQuaHRtbCNvMSI+dWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX192YWxpZGF0ZV9fX3Vfc19jX29fcl9ldmFsdWVzLmh0bWwjbzMiPnVkZGkyX192YWxpZGF0ZV9VU0NPUkV2YWx1ZXM8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28yIj51ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI28zIj51ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI28yIj51ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzMiPnVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNvMiI+dWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZzwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXRfbW9kZWxfZGV0YWlsLmh0bWwjbzEiPnVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lc2VydmljZV9kZXRhaWwuaHRtbCNvMSI+dWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lcmVnaXN0ZXJlZF9pbmZvLmh0bWwjbzEiPnVkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm88L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI28xIj51ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VidXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwjbzEiPnVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQ8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VidXNpbmVzc19kZXRhaWwuaHRtbCNvMSI+dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJpbmRpbmdfZGV0YWlsLmh0bWwjbzEiPnVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCNvMCI+dWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW48L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2Vhc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sI28yIj51ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzQiPnVkZGkyX19maW5kX1VTQ09SRXRNb2RlbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjbzQiPnVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2U8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lcmVsYXRlZF9idXNpbmVzc2VzLmh0bWwjbzMiPnVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzYiPnVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNvMiI+dWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZzwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjYXJkX19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLmh0bWwjbzEiPnVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbjwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNvMiI+dWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjbzIiPnVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzIiPnVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzIiPnVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3M8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjbzIiPnVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZzwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzIiPnVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCNvMSI+dWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X2giPi0gaCAtPC9hPjwvaDM+PHVsPg0KKzxsaT5ob3N0aW5nUmVkaXJlY3Rvcg0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGUuaHRtbCNvMyI+dWRkaTJfX2JpbmRpbmdUZW1wbGF0ZTwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF9pIj4tIGkgLTwvYT48L2gzPjx1bD4NCis8bGk+aWRlbnRpZmllckJhZw0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNvMiI+dWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzIiPnVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWwuaHRtbCNvMyI+dWRkaTJfX3RNb2RlbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHkuaHRtbCNvNSI+dWRkaTJfX2J1c2luZXNzRW50aXR5PC9hPjxsaT5pbnN0YW5jZURldGFpbHMNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luc3RhbmNlX2luZm8uaHRtbCNvMSI+dWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbzwvYT48bGk+aW5zdGFuY2VQYXJtcw0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2luc3RhbmNlX2RldGFpbHMuaHRtbCNvMiI+dWRkaTJfX2luc3RhbmNlRGV0YWlsczwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF9rIj4tIGsgLTwvYT48L2gzPjx1bD4NCis8bGk+a2V5ZWRSZWZlcmVuY2UNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VyZWxhdGVkX2J1c2luZXNzZXMuaHRtbCNvMiI+dWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXM8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2hhcmVkX3JlbGF0aW9uc2hpcHMuaHRtbCNvMCI+dWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHM8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbi5odG1sI28yIj51ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2lkZW50aWZpZXJfYmFnLmh0bWwjbzAiPnVkZGkyX19pZGVudGlmaWVyQmFnPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NhdGVnb3J5X2JhZy5odG1sI28wIj51ZGRpMl9fY2F0ZWdvcnlCYWc8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXNzZXJ0aW9uX3N0YXR1c19pdGVtLmh0bWwjbzIiPnVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtPC9hPjxsaT5rZXlOYW1lDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkcmVzc19saW5lLmh0bWwjbzEiPnVkZGkyX19hZGRyZXNzTGluZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19rZXllZF9yZWZlcmVuY2UuaHRtbCNvMSI+dWRkaTJfX2tleWVkUmVmZXJlbmNlPC9hPjxsaT5rZXlzT3duZWQNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hc3NlcnRpb25fc3RhdHVzX2l0ZW0uaHRtbCNvMyI+dWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW08L2E+PGxpPmtleVR5cGUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZXN1bHQuaHRtbCNvMSI+dWRkaTJfX3Jlc3VsdDwvYT48bGk+a2V5VmFsdWUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRyZXNzX2xpbmUuaHRtbCNvMiI+dWRkaTJfX2FkZHJlc3NMaW5lPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2tleWVkX3JlZmVyZW5jZS5odG1sI28yIj51ZGRpMl9fa2V5ZWRSZWZlcmVuY2U8L2E+PC91bD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfbSI+LSBtIC08L2E+PC9oMz48dWw+DQorPGxpPm1heFJvd3MNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzUiPnVkZGkyX19maW5kX1VTQ09SRXRNb2RlbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjbzUiPnVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2U8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lcmVsYXRlZF9idXNpbmVzc2VzLmh0bWwjbzQiPnVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzciPnVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNvMyI+dWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZzwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF9uIj4tIG4gLTwvYT48L2gzPjx1bD4NCis8bGk+bmFtZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNvMSI+dWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvMSI+dWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI28xIj51ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luZm8uaHRtbCNvMCI+dWRkaTJfX3RNb2RlbEluZm88L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbC5odG1sI28wIj51ZGRpMl9fdE1vZGVsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfaW5mby5odG1sI28wIj51ZGRpMl9fc2VydmljZUluZm88L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc19pbmZvLmh0bWwjbzEiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2UuaHRtbCNvMCI+dWRkaTJfX2J1c2luZXNzU2VydmljZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19pbmZvLmh0bWwjbzAiPnVkZGkyX19idXNpbmVzc0luZm88L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5Lmh0bWwjbzEiPnVkZGkyX19idXNpbmVzc0VudGl0eTwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF9vIj4tIG8gLTwvYT48L2gzPjx1bD4NCis8bGk+b3BlcmF0b3JfDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9saXN0Lmh0bWwjbzIiPnVkZGkyX190TW9kZWxMaXN0PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfZGV0YWlsLmh0bWwjbzIiPnVkZGkyX190TW9kZWxEZXRhaWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9saXN0Lmh0bWwjbzIiPnVkZGkyX19zZXJ2aWNlTGlzdDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2RldGFpbC5odG1sI28yIj51ZGRpMl9fc2VydmljZURldGFpbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzZXNfbGlzdC5odG1sI28zIj51ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlZ2lzdGVyZWRfaW5mby5odG1sI28zIj51ZGRpMl9fcmVnaXN0ZXJlZEluZm88L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMiI+dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnM8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfbGlzdC5odG1sI28yIj51ZGRpMl9fYnVzaW5lc3NMaXN0PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2RldGFpbF9leHQuaHRtbCNvMiI+dWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2RldGFpbC5odG1sI28yIj51ZGRpMl9fYnVzaW5lc3NEZXRhaWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ19kZXRhaWwuaHRtbCNvMiI+dWRkaTJfX2JpbmRpbmdEZXRhaWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXV0aF90b2tlbi5odG1sI28yIj51ZGRpMl9fYXV0aFRva2VuPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfcmVwb3J0Lmh0bWwjbzIiPnVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQ8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbC5odG1sI282Ij51ZGRpMl9fdE1vZGVsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sI28yIj51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQ8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5Lmh0bWwjbzgiPnVkZGkyX19idXNpbmVzc0VudGl0eTwvYT48bGk+b3ZlcnZpZXdEb2MNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsLmh0bWwjbzIiPnVkZGkyX190TW9kZWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19faW5zdGFuY2VfZGV0YWlscy5odG1sI28xIj51ZGRpMl9faW5zdGFuY2VEZXRhaWxzPC9hPjxsaT5vdmVydmlld1VSTA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX292ZXJ2aWV3X2RvYy5odG1sI28xIj51ZGRpMl9fb3ZlcnZpZXdEb2M8L2E+PC91bD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfcCI+LSBwIC08L2E+PC9oMz48dWw+DQorPGxpPnBlcnNvbk5hbWUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19jb250YWN0Lmh0bWwjbzEiPnVkZGkyX19jb250YWN0PC9hPjxsaT5waG9uZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NvbnRhY3QuaHRtbCNvMiI+dWRkaTJfX2NvbnRhY3Q8L2E+PGxpPnB1Ymxpc2hlckFzc2VydGlvbg0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzAiPnVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMSI+dWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMSI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FkZF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMSI+dWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X3IiPi0gciAtPC9hPjwvaDM+PHVsPg0KKzxsaT5yZWxhdGVkQnVzaW5lc3NJbmZvDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc19pbmZvcy5odG1sI28wIj51ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mb3M8L2E+PGxpPnJlbGF0ZWRCdXNpbmVzc0luZm9zDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc2VzX2xpc3QuaHRtbCNvMSI+dWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdDwvYT48bGk+cmVzdWx0DQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwjbzAiPnVkZGkyX19kaXNwb3NpdGlvblJlcG9ydDwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF9zIj4tIHMgLTwvYT48L2gzPjx1bD4NCis8bGk+c2VydmljZUluZm8NCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2luZm9zLmh0bWwjbzAiPnVkZGkyX19zZXJ2aWNlSW5mb3M8L2E+PGxpPnNlcnZpY2VJbmZvcw0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfbGlzdC5odG1sI28wIj51ZGRpMl9fc2VydmljZUxpc3Q8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfaW5mby5odG1sI28yIj51ZGRpMl9fYnVzaW5lc3NJbmZvPC9hPjxsaT5zZXJ2aWNlS2V5DQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VzZXJ2aWNlX2RldGFpbC5odG1sI28wIj51ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI280Ij51ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI28xIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2U8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9pbmZvLmh0bWwjbzEiPnVkZGkyX19zZXJ2aWNlSW5mbzwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlLmh0bWwjbzQiPnVkZGkyX19idXNpbmVzc1NlcnZpY2U8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZS5odG1sI280Ij51ZGRpMl9fYmluZGluZ1RlbXBsYXRlPC9hPjxsaT5zaGFyZWRSZWxhdGlvbnNoaXBzDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc19pbmZvLmh0bWwjbzMiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvPC9hPjxsaT5zb2FwDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCNvMSI+X2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3Bob25lLmh0bWwjbzIiPnVkZGkyX19waG9uZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19uYW1lLmh0bWwjbzIiPnVkZGkyX19uYW1lPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Vycl9pbmZvLmh0bWwjbzIiPnVkZGkyX19lcnJJbmZvPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2VtYWlsLmh0bWwjbzIiPnVkZGkyX19lbWFpbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjb3ZlcnlfdV9yX2wuaHRtbCNvMiI+dWRkaTJfX2Rpc2NvdmVyeVVSTDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZXNjcmlwdGlvbi5odG1sI28yIj51ZGRpMl9fZGVzY3JpcHRpb248L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkcmVzc19saW5lLmh0bWwjbzMiPnVkZGkyX19hZGRyZXNzTGluZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hY2Nlc3NfcG9pbnQuaHRtbCNvMiI+dWRkaTJfX2FjY2Vzc1BvaW50PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfbGlzdC5odG1sI280Ij51ZGRpMl9fdE1vZGVsTGlzdDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2RldGFpbC5odG1sI280Ij51ZGRpMl9fdE1vZGVsRGV0YWlsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfbGlzdC5odG1sI280Ij51ZGRpMl9fc2VydmljZUxpc3Q8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9kZXRhaWwuaHRtbCNvNCI+dWRkaTJfX3NlcnZpY2VEZXRhaWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc2VzX2xpc3QuaHRtbCNvNSI+dWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWdpc3RlcmVkX2luZm8uaHRtbCNvNSI+dWRkaTJfX3JlZ2lzdGVyZWRJbmZvPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzQiPnVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2xpc3QuaHRtbCNvNCI+dWRkaTJfX2J1c2luZXNzTGlzdDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwjbzQiPnVkZGkyX19idXNpbmVzc0RldGFpbEV4dDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWwuaHRtbCNvNCI+dWRkaTJfX2J1c2luZXNzRGV0YWlsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfZGV0YWlsLmh0bWwjbzQiPnVkZGkyX19iaW5kaW5nRGV0YWlsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2F1dGhfdG9rZW4uaHRtbCNvMyI+dWRkaTJfX2F1dGhUb2tlbjwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sI28zIj51ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3ZhbGlkYXRlX19fdV9zX2Nfb19yX2V2YWx1ZXMuaHRtbCNvNCI+dWRkaTJfX3ZhbGlkYXRlX1VTQ09SRXZhbHVlczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzMiPnVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzQiPnVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjbzMiPnVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2U8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvNCI+dWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI28zIj51ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9ldF9tb2RlbF9kZXRhaWwuaHRtbCNvMiI+dWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VzZXJ2aWNlX2RldGFpbC5odG1sI28yIj51ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VyZWdpc3RlcmVkX2luZm8uaHRtbCNvMiI+dWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbzwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjbzIiPnVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbF9leHQuaHRtbCNvMiI+dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbC5odG1sI28yIj51ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYmluZGluZ19kZXRhaWwuaHRtbCNvMiI+dWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sI28zIj51ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbjwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWFzc2VydGlvbl9zdGF0dXNfcmVwb3J0Lmh0bWwjbzMiPnVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNvNiI+dWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvNyI+dWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VyZWxhdGVkX2J1c2luZXNzZXMuaHRtbCNvNSI+dWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXM8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvOCI+dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI281Ij51ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NhcmRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCNvMiI+dWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI28zIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCNvMyI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMyI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNvMyI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNvMyI+dWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FkZF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCNvMyI+dWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5zdGFuY2VfaW5mby5odG1sI28zIj51ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5zdGFuY2VfZGV0YWlscy5odG1sI28xIj51ZGRpMl9fdE1vZGVsSW5zdGFuY2VEZXRhaWxzPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5mb3MuaHRtbCNvMSI+dWRkaTJfX3RNb2RlbEluZm9zPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5mby5odG1sI28yIj51ZGRpMl9fdE1vZGVsSW5mbzwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2JhZy5odG1sI28xIj51ZGRpMl9fdE1vZGVsQmFnPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWwuaHRtbCNvOCI+dWRkaTJfX3RNb2RlbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zaGFyZWRfcmVsYXRpb25zaGlwcy5odG1sI28yIj51ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2luZm9zLmh0bWwjbzEiPnVkZGkyX19zZXJ2aWNlSW5mb3M8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9pbmZvLmh0bWwjbzMiPnVkZGkyX19zZXJ2aWNlSW5mbzwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZXN1bHQuaHRtbCNvMyI+dWRkaTJfX3Jlc3VsdDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzX2luZm9zLmh0bWwjbzEiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzX2luZm8uaHRtbCNvNCI+dWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm88L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbi5odG1sI28zIj51ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX292ZXJ2aWV3X2RvYy5odG1sI28yIj51ZGRpMl9fb3ZlcnZpZXdEb2M8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fa2V5c19vd25lZC5odG1sI28yIj51ZGRpMl9fa2V5c093bmVkPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2tleWVkX3JlZmVyZW5jZS5odG1sI28zIj51ZGRpMl9fa2V5ZWRSZWZlcmVuY2U8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19faW5zdGFuY2VfZGV0YWlscy5odG1sI28zIj51ZGRpMl9faW5zdGFuY2VEZXRhaWxzPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2lkZW50aWZpZXJfYmFnLmh0bWwjbzEiPnVkZGkyX19pZGVudGlmaWVyQmFnPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2hvc3RpbmdfcmVkaXJlY3Rvci5odG1sI28xIj51ZGRpMl9faG9zdGluZ1JlZGlyZWN0b3I8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9xdWFsaWZpZXJzLmh0bWwjbzEiPnVkZGkyX19maW5kUXVhbGlmaWVyczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCNvNCI+dWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NvdmVyeV91X3JfbHMuaHRtbCNvMSI+dWRkaTJfX2Rpc2NvdmVyeVVSTHM8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fY29udGFjdHMuaHRtbCNvMSI+dWRkaTJfX2NvbnRhY3RzPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NvbnRhY3QuaHRtbCNvNiI+dWRkaTJfX2NvbnRhY3Q8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fY2F0ZWdvcnlfYmFnLmh0bWwjbzEiPnVkZGkyX19jYXRlZ29yeUJhZzwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlcy5odG1sI28xIj51ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlLmh0bWwjbzYiPnVkZGkyX19idXNpbmVzc1NlcnZpY2U8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfaW5mb3MuaHRtbCNvMSI+dWRkaTJfX2J1c2luZXNzSW5mb3M8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfaW5mby5odG1sI280Ij51ZGRpMl9fYnVzaW5lc3NJbmZvPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eV9leHQuaHRtbCNvMiI+dWRkaTJfX2J1c2luZXNzRW50aXR5RXh0PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2VudGl0eS5odG1sI28xMCI+dWRkaTJfX2J1c2luZXNzRW50aXR5PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGVzLmh0bWwjbzEiPnVkZGkyX19iaW5kaW5nVGVtcGxhdGVzPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfdGVtcGxhdGUuaHRtbCNvNiI+dWRkaTJfX2JpbmRpbmdUZW1wbGF0ZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hc3NlcnRpb25fc3RhdHVzX2l0ZW0uaHRtbCNvNSI+dWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW08L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkcmVzcy5odG1sI280Ij51ZGRpMl9fYWRkcmVzczwvYT48bGk+c29ydENvZGUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRyZXNzLmh0bWwjbzIiPnVkZGkyX19hZGRyZXNzPC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X3QiPi0gdCAtPC9hPjwvaDM+PHVsPg0KKzxsaT50TW9kZWwNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2RldGFpbC5odG1sI28wIj51ZGRpMl9fdE1vZGVsRGV0YWlsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3ZhbGlkYXRlX19fdV9zX2Nfb19yX2V2YWx1ZXMuaHRtbCNvMiI+dWRkaTJfX3ZhbGlkYXRlX1VTQ09SRXZhbHVlczwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwjbzEiPnVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbDwvYT48bGk+dE1vZGVsQmFnDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI28zIj51ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzQiPnVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNvMSI+dWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZzwvYT48bGk+dE1vZGVsSW5mbw0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5mb3MuaHRtbCNvMCI+dWRkaTJfX3RNb2RlbEluZm9zPC9hPjxsaT50TW9kZWxJbmZvcw0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfbGlzdC5odG1sI28wIj51ZGRpMl9fdE1vZGVsTGlzdDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWdpc3RlcmVkX2luZm8uaHRtbCNvMSI+dWRkaTJfX3JlZ2lzdGVyZWRJbmZvPC9hPjxsaT50TW9kZWxJbnN0YW5jZURldGFpbHMNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX3RlbXBsYXRlLmh0bWwjbzEiPnVkZGkyX19iaW5kaW5nVGVtcGxhdGU8L2E+PGxpPnRNb2RlbEluc3RhbmNlSW5mbw0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5zdGFuY2VfZGV0YWlscy5odG1sI28wIj51ZGRpMl9fdE1vZGVsSW5zdGFuY2VEZXRhaWxzPC9hPjxsaT50TW9kZWxLZXkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXRfbW9kZWxfZGV0YWlsLmh0bWwjbzAiPnVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sI28xIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luc3RhbmNlX2luZm8uaHRtbCNvMiI+dWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbzwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luZm8uaHRtbCNvMSI+dWRkaTJfX3RNb2RlbEluZm88L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9iYWcuaHRtbCNvMCI+dWRkaTJfX3RNb2RlbEJhZzwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsLmh0bWwjbzUiPnVkZGkyX190TW9kZWw8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fa2V5ZWRfcmVmZXJlbmNlLmh0bWwjbzAiPnVkZGkyX19rZXllZFJlZmVyZW5jZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRyZXNzLmh0bWwjbzMiPnVkZGkyX19hZGRyZXNzPC9hPjxsaT50b0tleQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb24uaHRtbCNvMSI+dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbjwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19rZXlzX293bmVkLmh0bWwjbzEiPnVkZGkyX19rZXlzT3duZWQ8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXNzZXJ0aW9uX3N0YXR1c19pdGVtLmh0bWwjbzEiPnVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtPC9hPjxsaT50cnVuY2F0ZWQNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2xpc3QuaHRtbCNvMyI+dWRkaTJfX3RNb2RlbExpc3Q8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9kZXRhaWwuaHRtbCNvMyI+dWRkaTJfX3RNb2RlbERldGFpbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2xpc3QuaHRtbCNvMyI+dWRkaTJfX3NlcnZpY2VMaXN0PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfZGV0YWlsLmh0bWwjbzMiPnVkZGkyX19zZXJ2aWNlRGV0YWlsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3Nlc19saXN0Lmh0bWwjbzQiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3Q8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVnaXN0ZXJlZF9pbmZvLmh0bWwjbzQiPnVkZGkyX19yZWdpc3RlcmVkSW5mbzwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19saXN0Lmh0bWwjbzMiPnVkZGkyX19idXNpbmVzc0xpc3Q8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsX2V4dC5odG1sI28zIj51ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHQ8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsLmh0bWwjbzMiPnVkZGkyX19idXNpbmVzc0RldGFpbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX2RldGFpbC5odG1sI28zIj51ZGRpMl9fYmluZGluZ0RldGFpbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCNvMyI+dWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X3UiPi0gdSAtPC9hPjwvaDM+PHVsPg0KKzxsaT51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnRfDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCNvMCI+X2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPjxsaT51cGxvYWRSZWdpc3Rlcg0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNvMiI+dWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwjbzIiPnVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzPC9hPjxsaT5VUkxUeXBlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWNjZXNzX3BvaW50Lmh0bWwjbzEiPnVkZGkyX19hY2Nlc3NQb2ludDwvYT48bGk+dXNlcklEDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLmh0bWwjbzEiPnVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuPC9hPjxsaT51c2VUeXBlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcGhvbmUuaHRtbCNvMSI+dWRkaTJfX3Bob25lPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2VtYWlsLmh0bWwjbzEiPnVkZGkyX19lbWFpbDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjb3ZlcnlfdV9yX2wuaHRtbCNvMSI+dWRkaTJfX2Rpc2NvdmVyeVVSTDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19jb250YWN0Lmh0bWwjbzUiPnVkZGkyX19jb250YWN0PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FkZHJlc3MuaHRtbCNvMSI+dWRkaTJfX2FkZHJlc3M8L2E+PC91bD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfeCI+LSB4IC08L2E+PC9oMz48dWw+DQorPGxpPnhtbF9fbGFuZ18NCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19uYW1lLmh0bWwjbzEiPnVkZGkyX19uYW1lPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rlc2NyaXB0aW9uLmh0bWwjbzEiPnVkZGkyX19kZXNjcmlwdGlvbjwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU4IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2dsb2JhbHMuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2dsb2JhbHMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmNiMDBjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvZ2xvYmFscy5odG1sCkBAIC0wLDAgKzEsNzUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IEZpbGUgTWVtYmVyczwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXhITCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4SEwiIGhyZWY9Imdsb2JhbHMuaHRtbCI+QWxsPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHNfZnVuYy5odG1sIj5GdW5jdGlvbnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFsc190eXBlLmh0bWwiPlR5cGVkZWZzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHNfZW51bS5odG1sIj5FbnVtZXJhdGlvbnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFsc19ldmFsLmh0bWwiPkVudW1lcmF0aW9uJm5ic3A7dmFsdWVzPC9hPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iI2luZGV4X18iPl88L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iI2luZGV4X3UiPnU8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iI2luZGV4X3giPng8L2E+PC9kaXY+DQorDQorPHA+DQorDQorPHA+DQorSGVyZSBpcyBhIGxpc3Qgb2YgYWxsIGZpbGUgbWVtYmVycyB3aXRoIGxpbmtzIHRvIHRoZSBmaWxlcyB0aGV5IGJlbG9uZyB0bzo8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfXyI+LSBfIC08L2E+PC9oMz48dWw+DQorPGxpPl9faW5xMl9fZmluZF9VU0NPUkViaW5kaW5nKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMjEiPnVkZGlfdjIuaDwvYT48bGk+X19pbnEyX19maW5kX1VTQ09SRWJ1c2luZXNzKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMjIiPnVkZGlfdjIuaDwvYT48bGk+X19pbnEyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMjMiPnVkZGlfdjIuaDwvYT48bGk+X19pbnEyX19maW5kX1VTQ09SRXNlcnZpY2UoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EyNCI+dWRkaV92Mi5oPC9hPjxsaT5fX2lucTJfX2ZpbmRfVVNDT1JFdE1vZGVsKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMjUiPnVkZGlfdjIuaDwvYT48bGk+X19pbnEyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbCgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTI2Ij51ZGRpX3YyLmg8L2E+PGxpPl9faW5xMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMjciPnVkZGlfdjIuaDwvYT48bGk+X19pbnEyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EyOCI+dWRkaV92Mi5oPC9hPjxsaT5fX2lucTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMjkiPnVkZGlfdjIuaDwvYT48bGk+X19pbnEyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMzAiPnVkZGlfdjIuaDwvYT48bGk+X19wdWIyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucygpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTMxIj51ZGRpX3YyLmg8L2E+PGxpPl9fcHViMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EzMiI+dWRkaV92Mi5oPC9hPjxsaT5fX3B1YjJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcygpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTMzIj51ZGRpX3YyLmg8L2E+PGxpPl9fcHViMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EzNCI+dWRkaV92Mi5oPC9hPjxsaT5fX3B1YjJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMzUiPnVkZGlfdjIuaDwvYT48bGk+X19wdWIyX19kZWxldGVfVVNDT1JFdE1vZGVsKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMzYiPnVkZGlfdjIuaDwvYT48bGk+X19wdWIyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbigpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTM3Ij51ZGRpX3YyLmg8L2E+PGxpPl9fcHViMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTM4Ij51ZGRpX3YyLmg8L2E+PGxpPl9fcHViMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbigpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTM5Ij51ZGRpX3YyLmg8L2E+PGxpPl9fcHViMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0MCI+dWRkaV92Mi5oPC9hPjxsaT5fX3B1YjJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbygpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQxIj51ZGRpX3YyLmg8L2E+PGxpPl9fcHViMl9fc2F2ZV9VU0NPUkViaW5kaW5nKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNDIiPnVkZGlfdjIuaDwvYT48bGk+X19wdWIyX19zYXZlX1VTQ09SRWJ1c2luZXNzKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNDMiPnVkZGlfdjIuaDwvYT48bGk+X19wdWIyX19zYXZlX1VTQ09SRXNlcnZpY2UoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0NCI+dWRkaV92Mi5oPC9hPjxsaT5fX3B1YjJfX3NhdmVfVVNDT1JFdE1vZGVsKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNDUiPnVkZGlfdjIuaDwvYT48bGk+X19wdWIyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucygpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQ2Ij51ZGRpX3YyLmg8L2E+PC91bD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfdSI+LSB1IC08L2E+PC9oMz48dWw+DQorPGxpPnVkZGkyX19iaW5kaW5nS2V5DQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTIiPnVkZGlfdjIuaDwvYT48bGk+dWRkaTJfX2J1c2luZXNzS2V5DQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTMiPnVkZGlfdjIuaDwvYT48bGk+dWRkaTJfX2RpcmVjdGlvbg0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0NyI+dWRkaV92Mi5oPC9hPjxsaT51ZGRpMl9fZGlyZWN0aW9uX19mcm9tS2V5DQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQ3YTYiPnVkZGlfdjIuaDwvYT48bGk+dWRkaTJfX2RpcmVjdGlvbl9fdG9LZXkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNDdhNyI+dWRkaV92Mi5oPC9hPjxsaT51ZGRpMl9fa2V5VHlwZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E1MCI+dWRkaV92Mi5oPC9hPjxsaT51ZGRpMl9fa2V5VHlwZV9fYmluZGluZ0tleQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E1MGEyMCI+dWRkaV92Mi5oPC9hPjxsaT51ZGRpMl9fa2V5VHlwZV9fYnVzaW5lc3NLZXkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNTBhMTciPnVkZGlfdjIuaDwvYT48bGk+dWRkaTJfX2tleVR5cGVfX3NlcnZpY2VLZXkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNTBhMTkiPnVkZGlfdjIuaDwvYT48bGk+dWRkaTJfX2tleVR5cGVfX3RNb2RlbEtleQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E1MGExOCI+dWRkaV92Mi5oPC9hPjxsaT51ZGRpMl9fc2VydmljZUtleQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0Ij51ZGRpX3YyLmg8L2E+PGxpPnVkZGkyX190TW9kZWxLZXkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNSI+dWRkaV92Mi5oPC9hPjxsaT51ZGRpMl9fdHJ1bmNhdGVkDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQ4Ij51ZGRpX3YyLmg8L2E+PGxpPnVkZGkyX190cnVuY2F0ZWRfX2ZhbHNlXw0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0OGE5Ij51ZGRpX3YyLmg8L2E+PGxpPnVkZGkyX190cnVuY2F0ZWRfX3RydWVfDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQ4YTgiPnVkZGlfdjIuaDwvYT48bGk+dWRkaTJfX1VSTFR5cGUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNDkiPnVkZGlfdjIuaDwvYT48bGk+dWRkaTJfX1VSTFR5cGVfX2ZheA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0OWExNCI+dWRkaV92Mi5oPC9hPjxsaT51ZGRpMl9fVVJMVHlwZV9fZnRwDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQ5YTEzIj51ZGRpX3YyLmg8L2E+PGxpPnVkZGkyX19VUkxUeXBlX19odHRwDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQ5YTExIj51ZGRpX3YyLmg8L2E+PGxpPnVkZGkyX19VUkxUeXBlX19odHRwcw0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0OWExMiI+dWRkaV92Mi5oPC9hPjxsaT51ZGRpMl9fVVJMVHlwZV9fbWFpbHRvDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQ5YTEwIj51ZGRpX3YyLmg8L2E+PGxpPnVkZGkyX19VUkxUeXBlX19vdGhlcg0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0OWExNiI+dWRkaV92Mi5oPC9hPjxsaT51ZGRpMl9fVVJMVHlwZV9fcGhvbmUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNDlhMTUiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF94Ij4tIHggLTwvYT48L2gzPjx1bD4NCis8bGk+eG1sX19sYW5nDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTEiPnVkZGlfdjIuaDwvYT48bGk+eHNkX19OTVRPS0VODQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTAiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE3OjAwIDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2dsb2JhbHNfZW51bS5odG1sIGIvZG9jL3VkZGkyL2h0bWwvZ2xvYmFsc19lbnVtLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU0NGU1ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2dsb2JhbHNfZW51bS5odG1sCkBAIC0wLDAgKzEsMjEgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IEZpbGUgTWVtYmVycyAtIEVudW1lcmF0aW9uczwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXhITCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkFsbDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzX2Z1bmMuaHRtbCI+RnVuY3Rpb25zPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHNfdHlwZS5odG1sIj5UeXBlZGVmczwvYT4gfCA8YSBjbGFzcz0icWluZGV4SEwiIGhyZWY9Imdsb2JhbHNfZW51bS5odG1sIj5FbnVtZXJhdGlvbnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFsc19ldmFsLmh0bWwiPkVudW1lcmF0aW9uJm5ic3A7dmFsdWVzPC9hPjwvZGl2Pg0KKw0KKzxwPg0KKzx1bD4NCis8bGk+dWRkaTJfX2RpcmVjdGlvbg0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0NyI+dWRkaV92Mi5oPC9hPjxsaT51ZGRpMl9fa2V5VHlwZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E1MCI+dWRkaV92Mi5oPC9hPjxsaT51ZGRpMl9fdHJ1bmNhdGVkDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQ4Ij51ZGRpX3YyLmg8L2E+PGxpPnVkZGkyX19VUkxUeXBlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQ5Ij51ZGRpX3YyLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNzowMCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9nbG9iYWxzX2V2YWwuaHRtbCBiL2RvYy91ZGRpMi9odG1sL2dsb2JhbHNfZXZhbC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NWVhZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9nbG9iYWxzX2V2YWwuaHRtbApAQCAtMCwwICsxLDMyIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiBGaWxlIE1lbWJlcnMgLSBFbnVtZXJhdGlvbiB2YWx1ZXM8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4SEwiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5BbGw8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFsc19mdW5jLmh0bWwiPkZ1bmN0aW9uczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzX3R5cGUuaHRtbCI+VHlwZWRlZnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFsc19lbnVtLmh0bWwiPkVudW1lcmF0aW9uczwvYT4gfCA8YSBjbGFzcz0icWluZGV4SEwiIGhyZWY9Imdsb2JhbHNfZXZhbC5odG1sIj5FbnVtZXJhdGlvbiZuYnNwO3ZhbHVlczwvYT48L2Rpdj4NCisNCis8cD4NCis8dWw+DQorPGxpPnVkZGkyX19kaXJlY3Rpb25fX2Zyb21LZXkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNDdhNiI+dWRkaV92Mi5oPC9hPjxsaT51ZGRpMl9fZGlyZWN0aW9uX190b0tleQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0N2E3Ij51ZGRpX3YyLmg8L2E+PGxpPnVkZGkyX19rZXlUeXBlX19iaW5kaW5nS2V5DQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTUwYTIwIj51ZGRpX3YyLmg8L2E+PGxpPnVkZGkyX19rZXlUeXBlX19idXNpbmVzc0tleQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E1MGExNyI+dWRkaV92Mi5oPC9hPjxsaT51ZGRpMl9fa2V5VHlwZV9fc2VydmljZUtleQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E1MGExOSI+dWRkaV92Mi5oPC9hPjxsaT51ZGRpMl9fa2V5VHlwZV9fdE1vZGVsS2V5DQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTUwYTE4Ij51ZGRpX3YyLmg8L2E+PGxpPnVkZGkyX190cnVuY2F0ZWRfX2ZhbHNlXw0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0OGE5Ij51ZGRpX3YyLmg8L2E+PGxpPnVkZGkyX190cnVuY2F0ZWRfX3RydWVfDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQ4YTgiPnVkZGlfdjIuaDwvYT48bGk+dWRkaTJfX1VSTFR5cGVfX2ZheA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0OWExNCI+dWRkaV92Mi5oPC9hPjxsaT51ZGRpMl9fVVJMVHlwZV9fZnRwDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQ5YTEzIj51ZGRpX3YyLmg8L2E+PGxpPnVkZGkyX19VUkxUeXBlX19odHRwDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQ5YTExIj51ZGRpX3YyLmg8L2E+PGxpPnVkZGkyX19VUkxUeXBlX19odHRwcw0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0OWExMiI+dWRkaV92Mi5oPC9hPjxsaT51ZGRpMl9fVVJMVHlwZV9fbWFpbHRvDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQ5YTEwIj51ZGRpX3YyLmg8L2E+PGxpPnVkZGkyX19VUkxUeXBlX19vdGhlcg0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0OWExNiI+dWRkaV92Mi5oPC9hPjxsaT51ZGRpMl9fVVJMVHlwZV9fcGhvbmUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNDlhMTUiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE3OjAwIDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2dsb2JhbHNfZnVuYy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvZ2xvYmFsc19mdW5jLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVjM2JhNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2dsb2JhbHNfZnVuYy5odG1sCkBAIC0wLDAgKzEsNDMgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IEZpbGUgTWVtYmVycyAtIEZ1bmN0aW9uczwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXhITCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkFsbDwvYT4gfCA8YSBjbGFzcz0icWluZGV4SEwiIGhyZWY9Imdsb2JhbHNfZnVuYy5odG1sIj5GdW5jdGlvbnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFsc190eXBlLmh0bWwiPlR5cGVkZWZzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHNfZW51bS5odG1sIj5FbnVtZXJhdGlvbnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFsc19ldmFsLmh0bWwiPkVudW1lcmF0aW9uJm5ic3A7dmFsdWVzPC9hPjwvZGl2Pg0KKw0KKzxwPg0KKzx1bD4NCis8bGk+X19pbnEyX19maW5kX1VTQ09SRWJpbmRpbmcoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EyMSI+dWRkaV92Mi5oPC9hPjxsaT5fX2lucTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EyMiI+dWRkaV92Mi5oPC9hPjxsaT5fX2lucTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EyMyI+dWRkaV92Mi5oPC9hPjxsaT5fX2lucTJfX2ZpbmRfVVNDT1JFc2VydmljZSgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTI0Ij51ZGRpX3YyLmg8L2E+PGxpPl9faW5xMl9fZmluZF9VU0NPUkV0TW9kZWwoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EyNSI+dWRkaV92Mi5oPC9hPjxsaT5fX2lucTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMjYiPnVkZGlfdjIuaDwvYT48bGk+X19pbnEyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EyNyI+dWRkaV92Mi5oPC9hPjxsaT5fX2lucTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dCgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTI4Ij51ZGRpX3YyLmg8L2E+PGxpPl9faW5xMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EyOSI+dWRkaV92Mi5oPC9hPjxsaT5fX2lucTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EzMCI+dWRkaV92Mi5oPC9hPjxsaT5fX3B1YjJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMzEiPnVkZGlfdjIuaDwvYT48bGk+X19wdWIyX19kZWxldGVfVVNDT1JFYmluZGluZygpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTMyIj51ZGRpX3YyLmg8L2E+PGxpPl9fcHViMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMzMiPnVkZGlfdjIuaDwvYT48bGk+X19wdWIyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucygpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTM0Ij51ZGRpX3YyLmg8L2E+PGxpPl9fcHViMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EzNSI+dWRkaV92Mi5oPC9hPjxsaT5fX3B1YjJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EzNiI+dWRkaV92Mi5oPC9hPjxsaT5fX3B1YjJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMzciPnVkZGlfdjIuaDwvYT48bGk+X19wdWIyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMzgiPnVkZGlfdjIuaDwvYT48bGk+X19wdWIyX19nZXRfVVNDT1JFYXV0aFRva2VuKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMzkiPnVkZGlfdjIuaDwvYT48bGk+X19wdWIyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucygpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQwIj51ZGRpX3YyLmg8L2E+PGxpPl9fcHViMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNDEiPnVkZGlfdjIuaDwvYT48bGk+X19wdWIyX19zYXZlX1VTQ09SRWJpbmRpbmcoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0MiI+dWRkaV92Mi5oPC9hPjxsaT5fX3B1YjJfX3NhdmVfVVNDT1JFYnVzaW5lc3MoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0MyI+dWRkaV92Mi5oPC9hPjxsaT5fX3B1YjJfX3NhdmVfVVNDT1JFc2VydmljZSgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQ0Ij51ZGRpX3YyLmg8L2E+PGxpPl9fcHViMl9fc2F2ZV9VU0NPUkV0TW9kZWwoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0NSI+dWRkaV92Mi5oPC9hPjxsaT5fX3B1YjJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNDYiPnVkZGlfdjIuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE3OjAwIDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2dsb2JhbHNfdHlwZS5odG1sIGIvZG9jL3VkZGkyL2h0bWwvZ2xvYmFsc190eXBlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNlOTIzMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL2dsb2JhbHNfdHlwZS5odG1sCkBAIC0wLDAgKzEsMjMgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IEZpbGUgTWVtYmVycyAtIFR5cGVkZWZzPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleEhMIiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+QWxsPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHNfZnVuYy5odG1sIj5GdW5jdGlvbnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleEhMIiBocmVmPSJnbG9iYWxzX3R5cGUuaHRtbCI+VHlwZWRlZnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFsc19lbnVtLmh0bWwiPkVudW1lcmF0aW9uczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzX2V2YWwuaHRtbCI+RW51bWVyYXRpb24mbmJzcDt2YWx1ZXM8L2E+PC9kaXY+DQorDQorPHA+DQorPHVsPg0KKzxsaT51ZGRpMl9fYmluZGluZ0tleQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EyIj51ZGRpX3YyLmg8L2E+PGxpPnVkZGkyX19idXNpbmVzc0tleQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EzIj51ZGRpX3YyLmg8L2E+PGxpPnVkZGkyX19zZXJ2aWNlS2V5DQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQiPnVkZGlfdjIuaDwvYT48bGk+dWRkaTJfX3RNb2RlbEtleQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E1Ij51ZGRpX3YyLmg8L2E+PGxpPnhtbF9fbGFuZw0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2ExIj51ZGRpX3YyLmg8L2E+PGxpPnhzZF9fTk1UT0tFTg0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EwIj51ZGRpX3YyLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjoxNzowMCAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9pbmRleC5odG1sIGIvZG9jL3VkZGkyL2h0bWwvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzI5ZGRkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvaW5kZXguaHRtbApAQCAtMCwwICsxLDI5IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiBnU09BUCBVRERJIHYyPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4SEwiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+Z1NPQVAgVURESSB2MiA8L2gxPg0KKzxwPg0KK1VuaXZlcnNhbCBEZXNjcmlwdGlvbiwgRGlzY292ZXJ5IGFuZCBJbnRlZ3JhdGlvbiwgb3IgVURESSwgaXMgdGhlIG5hbWUgb2YgYSBncm91cCBvZiB3ZWItYmFzZWQgcmVnaXN0cmllcyB0aGF0IGV4cG9zZSBpbmZvcm1hdGlvbiBhYm91dCBhIGJ1c2luZXNzIG9yIG90aGVyIGVudGl0eSBhbmQgaXRzIHRlY2huaWNhbCBpbnRlcmZhY2VzLjxwPg0KK1NlZSB0aGUgVURESSB2MiBzcGVjaWZpY2F0aW9uICA8YSBocmVmPSJodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0iPmh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bTwvYT4gZm9yIG1vcmUgZGV0YWlscy48aDI+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iVURESTJfQ0xBU1NFUyI+DQorQ2xhc3NlczwvYT48L2gyPg0KK1NlZSBSZWxhdGVkIFBhZ2VzIGZvciBleGFtcGxlcy48cD4NCitVRERJIElucXVpcmUgY2xhc3NlczxwPg0KKzx1bD4NCis8bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCI+dWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZzwvYT48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCI+dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M8L2E+PC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXJlbGF0ZWRfYnVzaW5lc3Nlcy5odG1sIj51ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlczwvYT48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sIj51ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwiPnVkZGkyX19maW5kX1VTQ09SRXRNb2RlbDwvYT48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2ViaW5kaW5nX2RldGFpbC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWw8L2E+PC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsLmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWw8L2E+PC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsX2V4dC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0PC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXNlcnZpY2VfZGV0YWlsLmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbDwvYT48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2V0X21vZGVsX2RldGFpbC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbDwvYT48L2xpPjwvdWw+DQorPHA+DQorVURESSBQdWJsaXNoIGNsYXNzZXM8cD4NCis8dWw+DQorPGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwiPnVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwiPnVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZzwvYT48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sIj51ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWw8L2E+PC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjYXJkX19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLmh0bWwiPnVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbjwvYT48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2Vhc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydDwvYT48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VyZWdpc3RlcmVkX2luZm8uaHRtbCI+dWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbzwvYT48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sIj51ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sIj51ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzczwvYT48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sIj51ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwiPnVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbDwvYT48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sIj51ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+PC9saT48L3VsPg0KKzxoMj48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJVRERJMl9CSU5ESU5HUyI+DQorQmluZGluZyBSZWZlcmVuY2U8L2E+PC9oMj4NCis8dWw+DQorPGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0iaW5xdWlyZXNvYXAuaHRtbCI+SW5xdWlyZVNvYXA8L2E+PC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJwdWJsaXNoc29hcC5odG1sIj5QdWJsaXNoU29hcDwvYT4gPC9saT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU3IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL2lucXVpcmVzb2FwLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9pbnF1aXJlc29hcC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0Mjc2ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9pbnF1aXJlc29hcC5odG1sCkBAIC0wLDAgKzEsMTggQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IEJpbmRpbmcgJnF1b3Q7SW5xdWlyZVNvYXAmcXVvdDs8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDI+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iSW5xdWlyZVNvYXBfb3BlcmF0aW9ucyI+DQorT3BlcmF0aW9ucyBvZiBCaW5kaW5nICAiSW5xdWlyZVNvYXAiPC9hPjwvaDI+DQorPHVsPg0KKzxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTIxIj5fX2lucTJfX2ZpbmRfVVNDT1JFYmluZGluZzwvYT48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTIyIj5fX2lucTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M8L2E+PC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EyMyI+X19pbnEyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMjQiPl9faW5xMl9fZmluZF9VU0NPUkVzZXJ2aWNlPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMjUiPl9faW5xMl9fZmluZF9VU0NPUkV0TW9kZWw8L2E+PC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EyNiI+X19pbnEyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbDwvYT48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTI3Ij5fX2lucTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbDwvYT48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTI4Ij5fX2lucTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dDwvYT48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTI5Ij5fX2lucTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMzAiPl9faW5xMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbDwvYT48L2xpPjwvdWw+DQorPGgyPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9IklucXVpcmVTb2FwX3BvcnRzIj4NCitFbmRwb2ludHMgb2YgQmluZGluZyAgIklucXVpcmVTb2FwIjwvYT48L2gyPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE3OjAwIDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL21haW4uaHRtbCBiL2RvYy91ZGRpMi9odG1sL21haW4uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGVhZjUxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvbWFpbi5odG1sCkBAIC0wLDAgKzEsMjkgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IGdTT0FQIFVEREkgdjI8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXhITCIgaHJlZj0ibWFpbi5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPmdTT0FQIFVEREkgdjIgPC9oMT4NCis8cD4NCitVbml2ZXJzYWwgRGVzY3JpcHRpb24sIERpc2NvdmVyeSBhbmQgSW50ZWdyYXRpb24sIG9yIFVEREksIGlzIHRoZSBuYW1lIG9mIGEgZ3JvdXAgb2Ygd2ViLWJhc2VkIHJlZ2lzdHJpZXMgdGhhdCBleHBvc2UgaW5mb3JtYXRpb24gYWJvdXQgYSBidXNpbmVzcyBvciBvdGhlciBlbnRpdHkgYW5kIGl0cyB0ZWNobmljYWwgaW50ZXJmYWNlcy48cD4NCitTZWUgdGhlIFVEREkgdjIgc3BlY2lmaWNhdGlvbiAgPGEgaHJlZj0iaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtIj5odHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG08L2E+IGZvciBtb3JlIGRldGFpbHMuPGgyPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9IlVEREkyX0NMQVNTRVMiPg0KK0NsYXNzZXM8L2E+PC9oMj4NCitTZWUgUmVsYXRlZCBQYWdlcyBmb3IgZXhhbXBsZXMuPHA+DQorVURESSBJbnF1aXJlIGNsYXNzZXM8cD4NCis8dWw+DQorPGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwiPnVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmc8L2E+PC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwiPnVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VyZWxhdGVkX2J1c2luZXNzZXMuaHRtbCI+dWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXM8L2E+PC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCI+dWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZTwvYT48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sIj51ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWw8L2E+PC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYmluZGluZ19kZXRhaWwuaHRtbCI+dWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbF9leHQuaHRtbCI+dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dDwvYT48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VzZXJ2aWNlX2RldGFpbC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWw8L2E+PC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9ldF9tb2RlbF9kZXRhaWwuaHRtbCI+dWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWw8L2E+PC9saT48L3VsPg0KKzxwPg0KK1VEREkgUHVibGlzaCBjbGFzc2VzPHA+DQorPHVsPg0KKzxsaT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sIj51ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+PC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sIj51ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmc8L2E+PC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzczwvYT48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwiPnVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZTwvYT48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwiPnVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwiPnVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzY2FyZF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sIj51ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW48L2E+PC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXNzZXJ0aW9uX3N0YXR1c19yZXBvcnQuaHRtbCI+dWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQ8L2E+PC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbjwvYT48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+PC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lcmVnaXN0ZXJlZF9pbmZvLmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm88L2E+PC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCI+dWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZzwvYT48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCI+dWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M8L2E+PC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCI+dWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZTwvYT48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sIj51ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWw8L2E+PC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCI+dWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPjwvbGk+PC91bD4NCis8aDI+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iVURESTJfQklORElOR1MiPg0KK0JpbmRpbmcgUmVmZXJlbmNlPC9hPjwvaDI+DQorPHVsPg0KKzxsaT48YSBjbGFzcz0iZWwiIGhyZWY9ImlucXVpcmVzb2FwLmh0bWwiPklucXVpcmVTb2FwPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0icHVibGlzaHNvYXAuaHRtbCI+UHVibGlzaFNvYXA8L2E+IDwvbGk+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gV2VkIEF1ZyAxNyAxNjowODozOSAyMDA1IGZvciBnU09BUCBVRERJIHYyIGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2MvdWRkaTIvaHRtbC9wYWdlcy5odG1sIGIvZG9jL3VkZGkyL2h0bWwvcGFnZXMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDIyMTM1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VkZGkyL2h0bWwvcGFnZXMuaHRtbApAQCAtMCwwICsxLDI0IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiBQYWdlIEluZGV4PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4SEwiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+Z1NPQVAgVURESSB2MiBSZWxhdGVkIFBhZ2VzPC9oMT5IZXJlIGlzIGEgbGlzdCBvZiBhbGwgcmVsYXRlZCBkb2N1bWVudGF0aW9uIHBhZ2VzOjx1bD4NCis8bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJleGFtcGxlMS5odG1sIj5Db2RlIEV4YW1wbGUgMTogRmluZGluZyBhIHNlcnZpY2U8L2E+DQorDQorPGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0iZXhhbXBsZTIuaHRtbCI+Q29kZSBFeGFtcGxlIDI6IEZpbmRpbmcgYSBidXNpbmVzczwvYT4NCisNCis8bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJleGFtcGxlMy5odG1sIj5Db2RlIEV4YW1wbGUgMzogUHVibGlzaGluZyBhIFdTREwgYW5kIHNlcnZpY2Ugb24gWE1ldGhvZHM8L2E+DQorDQorPGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0iaW5xdWlyZXNvYXAuaHRtbCI+QmluZGluZyAiSW5xdWlyZVNvYXAiPC9hPg0KKw0KKzxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InB1Ymxpc2hzb2FwLmh0bWwiPkJpbmRpbmcgIlB1Ymxpc2hTb2FwIjwvYT4NCisNCis8L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE3OjAwIDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy91ZGRpMi9odG1sL3B1Ymxpc2hzb2FwLmh0bWwgYi9kb2MvdWRkaTIvaHRtbC9wdWJsaXNoc29hcC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMmUxMmMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC9wdWJsaXNoc29hcC5odG1sCkBAIC0wLDAgKzEsMTggQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFVEREkgdjI6IEJpbmRpbmcgJnF1b3Q7UHVibGlzaFNvYXAmcXVvdDs8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDI+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iUHVibGlzaFNvYXBfb3BlcmF0aW9ucyI+DQorT3BlcmF0aW9ucyBvZiBCaW5kaW5nICAiUHVibGlzaFNvYXAiPC9hPjwvaDI+DQorPHVsPg0KKzxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTMxIj5fX3B1YjJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMzIiPl9fcHViMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmc8L2E+PC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EzMyI+X19wdWIyX19kZWxldGVfVVNDT1JFYnVzaW5lc3M8L2E+PC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EzNCI+X19wdWIyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTM1Ij5fX3B1YjJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMzYiPl9fcHViMl9fZGVsZXRlX1VTQ09SRXRNb2RlbDwvYT48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTM3Ij5fX3B1YjJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMzgiPl9fcHViMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydDwvYT48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTM5Ij5fX3B1YjJfX2dldF9VU0NPUkVhdXRoVG9rZW48L2E+PC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0MCI+X19wdWIyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQxIj5fX3B1YjJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbzwvYT48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQyIj5fX3B1YjJfX3NhdmVfVVNDT1JFYmluZGluZzwvYT48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQzIj5fX3B1YjJfX3NhdmVfVVNDT1JFYnVzaW5lc3M8L2E+PC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0NCI+X19wdWIyX19zYXZlX1VTQ09SRXNlcnZpY2U8L2E+PC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0NSI+X19wdWIyX19zYXZlX1VTQ09SRXRNb2RlbDwvYT48L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQ2Ij5fX3B1YjJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPjwvbGk+PC91bD4NCis8aDI+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iUHVibGlzaFNvYXBfcG9ydHMiPg0KK0VuZHBvaW50cyBvZiBCaW5kaW5nICAiUHVibGlzaFNvYXAiPC9hPjwvaDI+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIFdlZCBBdWcgMTcgMTY6MTc6MDAgMjAwNSBmb3IgZ1NPQVAgVURESSB2MiBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvdHJlZS5odG1sIGIvZG9jL3VkZGkyL2h0bWwvdHJlZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZGRhZTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWRkaTIvaHRtbC90cmVlLmh0bWwKQEAgLTAsMCArMSwyMTggQEAKKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4NCisgIDxoZWFkPg0KKyAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQveGh0bWw7Y2hhcnNldD0iaXNvLTg4NTktMSIgLz4NCisgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4NCisgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4iIC8+DQorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZG94eWdlbi5jc3MiPg0KKyAgICA8dGl0bGU+VHJlZVZpZXc8L3RpdGxlPg0KKyAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KKyAgICA8IS0tDQorICAgIC5kaXJlY3RvcnkgeyBmb250LXNpemU6IDEwcHQ7IGZvbnQtd2VpZ2h0OiBib2xkOyB9DQorICAgIC5kaXJlY3RvcnkgaDMgeyBtYXJnaW46IDBweDsgbWFyZ2luLXRvcDogMWVtOyBmb250LXNpemU6IDExcHQ7IH0NCisgICAgLmRpcmVjdG9yeSBwIHsgbWFyZ2luOiAwcHg7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCisgICAgLmRpcmVjdG9yeSBkaXYgeyBkaXNwbGF5OiBub25lOyBtYXJnaW46IDBweDsgfQ0KKyAgICAuZGlyZWN0b3J5IGltZyB7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IH0NCisgICAgLS0+DQorICAgIDwvc3R5bGU+DQorICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCisgICAgPCEtLSAvLyBIaWRlIHNjcmlwdCBmcm9tIG9sZCBicm93c2Vycw0KKyAgICANCisgICAgZnVuY3Rpb24gZmluZENoaWxkTm9kZShub2RlLCBuYW1lKSANCisgICAgew0KKyAgICAgIHZhciB0ZW1wOw0KKyAgICAgIGlmIChub2RlID09IG51bGwpIA0KKyAgICAgIHsNCisgICAgICAgIHJldHVybiBudWxsOw0KKyAgICAgIH0gDQorICAgICAgbm9kZSA9IG5vZGUuZmlyc3RDaGlsZDsNCisgICAgICB3aGlsZSAobm9kZSAhPSBudWxsKSANCisgICAgICB7DQorICAgICAgICBpZiAobm9kZS5ub2RlTmFtZSA9PSBuYW1lKSANCisgICAgICAgIHsNCisgICAgICAgICAgcmV0dXJuIG5vZGU7DQorICAgICAgICB9DQorICAgICAgICB0ZW1wID0gZmluZENoaWxkTm9kZShub2RlLCBuYW1lKTsNCisgICAgICAgIGlmICh0ZW1wICE9IG51bGwpIA0KKyAgICAgICAgew0KKyAgICAgICAgICByZXR1cm4gdGVtcDsNCisgICAgICAgIH0NCisgICAgICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gbnVsbDsNCisgICAgfQ0KKw0KKyAgICBmdW5jdGlvbiB0b2dnbGVGb2xkZXIoaWQsIGltYWdlTm9kZSkgDQorICAgIHsNCisgICAgICB2YXIgZm9sZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOw0KKyAgICAgIHZhciBsID0gMDsNCisgICAgICB2YXIgdmwgPSAiZnR2MnZlcnRsaW5lLnBuZyI7DQorICAgICAgaWYgKGltYWdlTm9kZSAhPSBudWxsICYmIGltYWdlTm9kZS5ub2RlTmFtZSAhPSAiSU1HIikgDQorICAgICAgew0KKyAgICAgICAgaW1hZ2VOb2RlID0gZmluZENoaWxkTm9kZShpbWFnZU5vZGUsICJJTUciKTsNCisgICAgICAgIGlmIChpbWFnZU5vZGUhPW51bGwpIGwgPSBpbWFnZU5vZGUuc3JjLmxlbmd0aDsNCisgICAgICB9DQorICAgICAgaWYgKGZvbGRlciA9PSBudWxsKSANCisgICAgICB7DQorICAgICAgfSANCisgICAgICBlbHNlIGlmIChmb2xkZXIuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKSANCisgICAgICB7DQorICAgICAgICB3aGlsZSAoaW1hZ2VOb2RlICE9IG51bGwgJiYgDQorICAgICAgICAgICAgICAgaW1hZ2VOb2RlLnNyYy5zdWJzdHJpbmcobC12bC5sZW5ndGgsbCkgPT0gdmwpDQorICAgICAgICB7DQorICAgICAgICAgIGltYWdlTm9kZSA9IGltYWdlTm9kZS5uZXh0U2libGluZzsNCisgICAgICAgICAgbCA9IGltYWdlTm9kZS5zcmMubGVuZ3RoOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGltYWdlTm9kZSAhPSBudWxsKSANCisgICAgICAgIHsNCisgICAgICAgICAgbCA9IGltYWdlTm9kZS5zcmMubGVuZ3RoOw0KKyAgICAgICAgICBpbWFnZU5vZGUubmV4dFNpYmxpbmcuc3JjID0gImZ0djJmb2xkZXJjbG9zZWQucG5nIjsNCisgICAgICAgICAgaWYgKGltYWdlTm9kZS5zcmMuc3Vic3RyaW5nKGwtMTMsbCkgPT0gImZ0djJtbm9kZS5wbmciKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgaW1hZ2VOb2RlLnNyYyA9ICJmdHYycG5vZGUucG5nIjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBlbHNlIGlmIChpbWFnZU5vZGUuc3JjLnN1YnN0cmluZyhsLTE3LGwpID09ICJmdHYybWxhc3Rub2RlLnBuZyIpDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBpbWFnZU5vZGUuc3JjID0gImZ0djJwbGFzdG5vZGUucG5nIjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgZm9sZGVyLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7DQorICAgICAgfSANCisgICAgICBlbHNlIA0KKyAgICAgIHsNCisgICAgICAgIHdoaWxlIChpbWFnZU5vZGUgIT0gbnVsbCAmJiANCisgICAgICAgICAgICAgICBpbWFnZU5vZGUuc3JjLnN1YnN0cmluZyhsLXZsLmxlbmd0aCxsKSA9PSB2bCkNCisgICAgICAgIHsNCisgICAgICAgICAgaW1hZ2VOb2RlID0gaW1hZ2VOb2RlLm5leHRTaWJsaW5nOw0KKyAgICAgICAgICBsID0gaW1hZ2VOb2RlLnNyYy5sZW5ndGg7DQorICAgICAgICB9DQorICAgICAgICBpZiAoaW1hZ2VOb2RlICE9IG51bGwpIA0KKyAgICAgICAgew0KKyAgICAgICAgICBsID0gaW1hZ2VOb2RlLnNyYy5sZW5ndGg7DQorICAgICAgICAgIGltYWdlTm9kZS5uZXh0U2libGluZy5zcmMgPSAiZnR2MmZvbGRlcm9wZW4ucG5nIjsNCisgICAgICAgICAgaWYgKGltYWdlTm9kZS5zcmMuc3Vic3RyaW5nKGwtMTMsbCkgPT0gImZ0djJwbm9kZS5wbmciKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgaW1hZ2VOb2RlLnNyYyA9ICJmdHYybW5vZGUucG5nIjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBlbHNlIGlmIChpbWFnZU5vZGUuc3JjLnN1YnN0cmluZyhsLTE3LGwpID09ICJmdHYycGxhc3Rub2RlLnBuZyIpDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBpbWFnZU5vZGUuc3JjID0gImZ0djJtbGFzdG5vZGUucG5nIjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgZm9sZGVyLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOw0KKyAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvLyBFbmQgc2NyaXB0IGhpZGluZyAtLT4gICAgICAgIA0KKyAgICA8L3NjcmlwdD4NCisgIDwvaGVhZD4NCisNCisgIDxib2R5Pg0KKyAgICA8ZGl2IGNsYXNzPSJkaXJlY3RvcnkiPg0KKyAgICAgIDxoMz5nU09BUCBVRERJIHYyPC9oMz4NCisgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBibG9jazsiPg0KKyAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJtYWluLmh0bWwiIHRhcmdldD0iYmFzZWZybSI+Z1NPQVAgVURESSB2MjwvYT48L3A+DQorICAgICAgICA8cD48aW1nIHNyYz0iZnR2MnBub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgb25jbGljaz0idG9nZ2xlRm9sZGVyKCdmb2xkZXIxJywgdGhpcykiLz48aW1nIHNyYz0iZnR2MmZvbGRlcmNsb3NlZC5wbmciIGFsdD0iKyIgd2lkdGg9MjQgaGVpZ2h0PTIyIG9uY2xpY2s9InRvZ2dsZUZvbGRlcignZm9sZGVyMScsIHRoaXMpIi8+PGEgY2xhc3M9ImVsIiBocmVmPSJmaWxlcy5odG1sIiB0YXJnZXQ9ImJhc2Vmcm0iPkZpbGUgTGlzdDwvYT48L3A+DQorICAgICAgICA8ZGl2IGlkPSJmb2xkZXIxIj4NCisgICAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJ2ZXJ0bGluZS5wbmciIGFsdD0ifCIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJsYXN0bm9kZS5wbmciIGFsdD0iXCIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJkb2MucG5nIiBhbHQ9IioiIHdpZHRoPTI0IGhlaWdodD0yMiAvPjxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvdWRkaTIvdWRkaV92Mi5oPC9hPjwvcD4NCisgICAgICAgIDwvZGl2Pg0KKyAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJwbm9kZS5wbmciIGFsdD0ibyIgd2lkdGg9MTYgaGVpZ2h0PTIyIG9uY2xpY2s9InRvZ2dsZUZvbGRlcignZm9sZGVyMicsIHRoaXMpIi8+PGltZyBzcmM9ImZ0djJmb2xkZXJjbG9zZWQucG5nIiBhbHQ9IisiIHdpZHRoPTI0IGhlaWdodD0yMiBvbmNsaWNrPSJ0b2dnbGVGb2xkZXIoJ2ZvbGRlcjInLCB0aGlzKSIvPjxhIGNsYXNzPSJlbCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiIHRhcmdldD0iYmFzZWZybSI+Q2xhc3MgTGlzdDwvYT48L3A+DQorICAgICAgICA8ZGl2IGlkPSJmb2xkZXIyIj4NCisgICAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJ2ZXJ0bGluZS5wbmciIGFsdD0ifCIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwiIHRhcmdldD0iYmFzZWZybSI+X2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPjwvcD4NCisgICAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJ2ZXJ0bGluZS5wbmciIGFsdD0ifCIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FjY2Vzc19wb2ludC5odG1sIiB0YXJnZXQ9ImJhc2Vmcm0iPnVkZGkyX19hY2Nlc3NQb2ludDwvYT48L3A+DQorICAgICAgICAgIDxwPjxpbWcgc3JjPSJmdHYydmVydGxpbmUucG5nIiBhbHQ9InwiIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYybm9kZS5wbmciIGFsdD0ibyIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJkb2MucG5nIiBhbHQ9IioiIHdpZHRoPTI0IGhlaWdodD0yMiAvPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwiIHRhcmdldD0iYmFzZWZybSI+dWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPjwvcD4NCisgICAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJ2ZXJ0bGluZS5wbmciIGFsdD0ifCIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FkZHJlc3MuaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj51ZGRpMl9fYWRkcmVzczwvYT48L3A+DQorICAgICAgICAgIDxwPjxpbWcgc3JjPSJmdHYydmVydGxpbmUucG5nIiBhbHQ9InwiIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYybm9kZS5wbmciIGFsdD0ibyIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJkb2MucG5nIiBhbHQ9IioiIHdpZHRoPTI0IGhlaWdodD0yMiAvPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRyZXNzX2xpbmUuaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj51ZGRpMl9fYWRkcmVzc0xpbmU8L2E+PC9wPg0KKyAgICAgICAgICA8cD48aW1nIHNyYz0iZnR2MnZlcnRsaW5lLnBuZyIgYWx0PSJ8IiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2Mm5vZGUucG5nIiBhbHQ9Im8iIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYyZG9jLnBuZyIgYWx0PSIqIiB3aWR0aD0yNCBoZWlnaHQ9MjIgLz48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXNzZXJ0aW9uX3N0YXR1c19pdGVtLmh0bWwiIHRhcmdldD0iYmFzZWZybSI+dWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW08L2E+PC9wPg0KKyAgICAgICAgICA8cD48aW1nIHNyYz0iZnR2MnZlcnRsaW5lLnBuZyIgYWx0PSJ8IiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2Mm5vZGUucG5nIiBhbHQ9Im8iIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYyZG9jLnBuZyIgYWx0PSIqIiB3aWR0aD0yNCBoZWlnaHQ9MjIgLz48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXNzZXJ0aW9uX3N0YXR1c19yZXBvcnQuaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj51ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0PC9hPjwvcD4NCisgICAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJ2ZXJ0bGluZS5wbmciIGFsdD0ifCIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2F1dGhfdG9rZW4uaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj51ZGRpMl9fYXV0aFRva2VuPC9hPjwvcD4NCisgICAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJ2ZXJ0bGluZS5wbmciIGFsdD0ifCIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfZGV0YWlsLmh0bWwiIHRhcmdldD0iYmFzZWZybSI+dWRkaTJfX2JpbmRpbmdEZXRhaWw8L2E+PC9wPg0KKyAgICAgICAgICA8cD48aW1nIHNyYz0iZnR2MnZlcnRsaW5lLnBuZyIgYWx0PSJ8IiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2Mm5vZGUucG5nIiBhbHQ9Im8iIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYyZG9jLnBuZyIgYWx0PSIqIiB3aWR0aD0yNCBoZWlnaHQ9MjIgLz48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZS5odG1sIiB0YXJnZXQ9ImJhc2Vmcm0iPnVkZGkyX19iaW5kaW5nVGVtcGxhdGU8L2E+PC9wPg0KKyAgICAgICAgICA8cD48aW1nIHNyYz0iZnR2MnZlcnRsaW5lLnBuZyIgYWx0PSJ8IiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2Mm5vZGUucG5nIiBhbHQ9Im8iIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYyZG9jLnBuZyIgYWx0PSIqIiB3aWR0aD0yNCBoZWlnaHQ9MjIgLz48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZXMuaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj51ZGRpMl9fYmluZGluZ1RlbXBsYXRlczwvYT48L3A+DQorICAgICAgICAgIDxwPjxpbWcgc3JjPSJmdHYydmVydGxpbmUucG5nIiBhbHQ9InwiIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYybm9kZS5wbmciIGFsdD0ibyIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJkb2MucG5nIiBhbHQ9IioiIHdpZHRoPTI0IGhlaWdodD0yMiAvPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWwuaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj51ZGRpMl9fYnVzaW5lc3NEZXRhaWw8L2E+PC9wPg0KKyAgICAgICAgICA8cD48aW1nIHNyYz0iZnR2MnZlcnRsaW5lLnBuZyIgYWx0PSJ8IiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2Mm5vZGUucG5nIiBhbHQ9Im8iIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYyZG9jLnBuZyIgYWx0PSIqIiB3aWR0aD0yNCBoZWlnaHQ9MjIgLz48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsX2V4dC5odG1sIiB0YXJnZXQ9ImJhc2Vmcm0iPnVkZGkyX19idXNpbmVzc0RldGFpbEV4dDwvYT48L3A+DQorICAgICAgICAgIDxwPjxpbWcgc3JjPSJmdHYydmVydGxpbmUucG5nIiBhbHQ9InwiIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYybm9kZS5wbmciIGFsdD0ibyIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJkb2MucG5nIiBhbHQ9IioiIHdpZHRoPTI0IGhlaWdodD0yMiAvPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHkuaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj51ZGRpMl9fYnVzaW5lc3NFbnRpdHk8L2E+PC9wPg0KKyAgICAgICAgICA8cD48aW1nIHNyYz0iZnR2MnZlcnRsaW5lLnBuZyIgYWx0PSJ8IiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2Mm5vZGUucG5nIiBhbHQ9Im8iIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYyZG9jLnBuZyIgYWx0PSIqIiB3aWR0aD0yNCBoZWlnaHQ9MjIgLz48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5X2V4dC5odG1sIiB0YXJnZXQ9ImJhc2Vmcm0iPnVkZGkyX19idXNpbmVzc0VudGl0eUV4dDwvYT48L3A+DQorICAgICAgICAgIDxwPjxpbWcgc3JjPSJmdHYydmVydGxpbmUucG5nIiBhbHQ9InwiIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYybm9kZS5wbmciIGFsdD0ibyIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJkb2MucG5nIiBhbHQ9IioiIHdpZHRoPTI0IGhlaWdodD0yMiAvPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19pbmZvLmh0bWwiIHRhcmdldD0iYmFzZWZybSI+dWRkaTJfX2J1c2luZXNzSW5mbzwvYT48L3A+DQorICAgICAgICAgIDxwPjxpbWcgc3JjPSJmdHYydmVydGxpbmUucG5nIiBhbHQ9InwiIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYybm9kZS5wbmciIGFsdD0ibyIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJkb2MucG5nIiBhbHQ9IioiIHdpZHRoPTI0IGhlaWdodD0yMiAvPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19pbmZvcy5odG1sIiB0YXJnZXQ9ImJhc2Vmcm0iPnVkZGkyX19idXNpbmVzc0luZm9zPC9hPjwvcD4NCisgICAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJ2ZXJ0bGluZS5wbmciIGFsdD0ifCIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2xpc3QuaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj51ZGRpMl9fYnVzaW5lc3NMaXN0PC9hPjwvcD4NCisgICAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJ2ZXJ0bGluZS5wbmciIGFsdD0ifCIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2UuaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj51ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlPC9hPjwvcD4NCisgICAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJ2ZXJ0bGluZS5wbmciIGFsdD0ifCIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2VzLmh0bWwiIHRhcmdldD0iYmFzZWZybSI+dWRkaTJfX2J1c2luZXNzU2VydmljZXM8L2E+PC9wPg0KKyAgICAgICAgICA8cD48aW1nIHNyYz0iZnR2MnZlcnRsaW5lLnBuZyIgYWx0PSJ8IiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2Mm5vZGUucG5nIiBhbHQ9Im8iIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYyZG9jLnBuZyIgYWx0PSIqIiB3aWR0aD0yNCBoZWlnaHQ9MjIgLz48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fY2F0ZWdvcnlfYmFnLmh0bWwiIHRhcmdldD0iYmFzZWZybSI+dWRkaTJfX2NhdGVnb3J5QmFnPC9hPjwvcD4NCisgICAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJ2ZXJ0bGluZS5wbmciIGFsdD0ifCIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NvbnRhY3QuaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj51ZGRpMl9fY29udGFjdDwvYT48L3A+DQorICAgICAgICAgIDxwPjxpbWcgc3JjPSJmdHYydmVydGxpbmUucG5nIiBhbHQ9InwiIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYybm9kZS5wbmciIGFsdD0ibyIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJkb2MucG5nIiBhbHQ9IioiIHdpZHRoPTI0IGhlaWdodD0yMiAvPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19jb250YWN0cy5odG1sIiB0YXJnZXQ9ImJhc2Vmcm0iPnVkZGkyX19jb250YWN0czwvYT48L3A+DQorICAgICAgICAgIDxwPjxpbWcgc3JjPSJmdHYydmVydGxpbmUucG5nIiBhbHQ9InwiIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYybm9kZS5wbmciIGFsdD0ibyIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJkb2MucG5nIiBhbHQ9IioiIHdpZHRoPTI0IGhlaWdodD0yMiAvPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj51ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmc8L2E+PC9wPg0KKyAgICAgICAgICA8cD48aW1nIHNyYz0iZnR2MnZlcnRsaW5lLnBuZyIgYWx0PSJ8IiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2Mm5vZGUucG5nIiBhbHQ9Im8iIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYyZG9jLnBuZyIgYWx0PSIqIiB3aWR0aD0yNCBoZWlnaHQ9MjIgLz48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sIiB0YXJnZXQ9ImJhc2Vmcm0iPnVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3M8L2E+PC9wPg0KKyAgICAgICAgICA8cD48aW1nIHNyYz0iZnR2MnZlcnRsaW5lLnBuZyIgYWx0PSJ8IiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2Mm5vZGUucG5nIiBhbHQ9Im8iIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYyZG9jLnBuZyIgYWx0PSIqIiB3aWR0aD0yNCBoZWlnaHQ9MjIgLz48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sIiB0YXJnZXQ9ImJhc2Vmcm0iPnVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT48L3A+DQorICAgICAgICAgIDxwPjxpbWcgc3JjPSJmdHYydmVydGxpbmUucG5nIiBhbHQ9InwiIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYybm9kZS5wbmciIGFsdD0ibyIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJkb2MucG5nIiBhbHQ9IioiIHdpZHRoPTI0IGhlaWdodD0yMiAvPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2U8L2E+PC9wPg0KKyAgICAgICAgICA8cD48aW1nIHNyYz0iZnR2MnZlcnRsaW5lLnBuZyIgYWx0PSJ8IiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2Mm5vZGUucG5nIiBhbHQ9Im8iIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYyZG9jLnBuZyIgYWx0PSIqIiB3aWR0aD0yNCBoZWlnaHQ9MjIgLz48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwiIHRhcmdldD0iYmFzZWZybSI+dWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWw8L2E+PC9wPg0KKyAgICAgICAgICA8cD48aW1nIHNyYz0iZnR2MnZlcnRsaW5lLnBuZyIgYWx0PSJ8IiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2Mm5vZGUucG5nIiBhbHQ9Im8iIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYyZG9jLnBuZyIgYWx0PSIqIiB3aWR0aD0yNCBoZWlnaHQ9MjIgLz48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVzY3JpcHRpb24uaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj51ZGRpMl9fZGVzY3JpcHRpb248L2E+PC9wPg0KKyAgICAgICAgICA8cD48aW1nIHNyYz0iZnR2MnZlcnRsaW5lLnBuZyIgYWx0PSJ8IiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2Mm5vZGUucG5nIiBhbHQ9Im8iIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYyZG9jLnBuZyIgYWx0PSIqIiB3aWR0aD0yNCBoZWlnaHQ9MjIgLz48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzY2FyZF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sIiB0YXJnZXQ9ImJhc2Vmcm0iPnVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbjwvYT48L3A+DQorICAgICAgICAgIDxwPjxpbWcgc3JjPSJmdHYydmVydGxpbmUucG5nIiBhbHQ9InwiIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYybm9kZS5wbmciIGFsdD0ibyIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJkb2MucG5nIiBhbHQ9IioiIHdpZHRoPTI0IGhlaWdodD0yMiAvPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjb3ZlcnlfdV9yX2wuaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj51ZGRpMl9fZGlzY292ZXJ5VVJMPC9hPjwvcD4NCisgICAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJ2ZXJ0bGluZS5wbmciIGFsdD0ifCIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NvdmVyeV91X3JfbHMuaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj51ZGRpMl9fZGlzY292ZXJ5VVJMczwvYT48L3A+DQorICAgICAgICAgIDxwPjxpbWcgc3JjPSJmdHYydmVydGxpbmUucG5nIiBhbHQ9InwiIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYybm9kZS5wbmciIGFsdD0ibyIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJkb2MucG5nIiBhbHQ9IioiIHdpZHRoPTI0IGhlaWdodD0yMiAvPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQ8L2E+PC9wPg0KKyAgICAgICAgICA8cD48aW1nIHNyYz0iZnR2MnZlcnRsaW5lLnBuZyIgYWx0PSJ8IiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2Mm5vZGUucG5nIiBhbHQ9Im8iIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYyZG9jLnBuZyIgYWx0PSIqIiB3aWR0aD0yNCBoZWlnaHQ9MjIgLz48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZW1haWwuaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj51ZGRpMl9fZW1haWw8L2E+PC9wPg0KKyAgICAgICAgICA8cD48aW1nIHNyYz0iZnR2MnZlcnRsaW5lLnBuZyIgYWx0PSJ8IiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2Mm5vZGUucG5nIiBhbHQ9Im8iIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYyZG9jLnBuZyIgYWx0PSIqIiB3aWR0aD0yNCBoZWlnaHQ9MjIgLz48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZXJyX2luZm8uaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj51ZGRpMl9fZXJySW5mbzwvYT48L3A+DQorICAgICAgICAgIDxwPjxpbWcgc3JjPSJmdHYydmVydGxpbmUucG5nIiBhbHQ9InwiIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYybm9kZS5wbmciIGFsdD0ibyIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJkb2MucG5nIiBhbHQ9IioiIHdpZHRoPTI0IGhlaWdodD0yMiAvPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwiIHRhcmdldD0iYmFzZWZybSI+dWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZzwvYT48L3A+DQorICAgICAgICAgIDxwPjxpbWcgc3JjPSJmdHYydmVydGxpbmUucG5nIiBhbHQ9InwiIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYybm9kZS5wbmciIGFsdD0ibyIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJkb2MucG5nIiBhbHQ9IioiIHdpZHRoPTI0IGhlaWdodD0yMiAvPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sIiB0YXJnZXQ9ImJhc2Vmcm0iPnVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzPC9hPjwvcD4NCisgICAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJ2ZXJ0bGluZS5wbmciIGFsdD0ifCIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXJlbGF0ZWRfYnVzaW5lc3Nlcy5odG1sIiB0YXJnZXQ9ImJhc2Vmcm0iPnVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzPC9hPjwvcD4NCisgICAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJ2ZXJ0bGluZS5wbmciIGFsdD0ifCIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj51ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlPC9hPjwvcD4NCisgICAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJ2ZXJ0bGluZS5wbmciIGFsdD0ifCIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj51ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWw8L2E+PC9wPg0KKyAgICAgICAgICA8cD48aW1nIHNyYz0iZnR2MnZlcnRsaW5lLnBuZyIgYWx0PSJ8IiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2Mm5vZGUucG5nIiBhbHQ9Im8iIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYyZG9jLnBuZyIgYWx0PSIqIiB3aWR0aD0yNCBoZWlnaHQ9MjIgLz48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9xdWFsaWZpZXJzLmh0bWwiIHRhcmdldD0iYmFzZWZybSI+dWRkaTJfX2ZpbmRRdWFsaWZpZXJzPC9hPjwvcD4NCisgICAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJ2ZXJ0bGluZS5wbmciIGFsdD0ifCIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXNzZXJ0aW9uX3N0YXR1c19yZXBvcnQuaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj51ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydDwvYT48L3A+DQorICAgICAgICAgIDxwPjxpbWcgc3JjPSJmdHYydmVydGxpbmUucG5nIiBhbHQ9InwiIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYybm9kZS5wbmciIGFsdD0ibyIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJkb2MucG5nIiBhbHQ9IioiIHdpZHRoPTI0IGhlaWdodD0yMiAvPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj51ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbjwvYT48L3A+DQorICAgICAgICAgIDxwPjxpbWcgc3JjPSJmdHYydmVydGxpbmUucG5nIiBhbHQ9InwiIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYybm9kZS5wbmciIGFsdD0ibyIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJkb2MucG5nIiBhbHQ9IioiIHdpZHRoPTI0IGhlaWdodD0yMiAvPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJpbmRpbmdfZGV0YWlsLmh0bWwiIHRhcmdldD0iYmFzZWZybSI+dWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsPC9hPjwvcD4NCisgICAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJ2ZXJ0bGluZS5wbmciIGFsdD0ifCIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsLmh0bWwiIHRhcmdldD0iYmFzZWZybSI+dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbDwvYT48L3A+DQorICAgICAgICAgIDxwPjxpbWcgc3JjPSJmdHYydmVydGxpbmUucG5nIiBhbHQ9InwiIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYybm9kZS5wbmciIGFsdD0ibyIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJkb2MucG5nIiBhbHQ9IioiIHdpZHRoPTI0IGhlaWdodD0yMiAvPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbF9leHQuaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj51ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0PC9hPjwvcD4NCisgICAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJ2ZXJ0bGluZS5wbmciIGFsdD0ifCIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj51ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+PC9wPg0KKyAgICAgICAgICA8cD48aW1nIHNyYz0iZnR2MnZlcnRsaW5lLnBuZyIgYWx0PSJ8IiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2Mm5vZGUucG5nIiBhbHQ9Im8iIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYyZG9jLnBuZyIgYWx0PSIqIiB3aWR0aD0yNCBoZWlnaHQ9MjIgLz48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VyZWdpc3RlcmVkX2luZm8uaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj51ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvPC9hPjwvcD4NCisgICAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJ2ZXJ0bGluZS5wbmciIGFsdD0ifCIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lc2VydmljZV9kZXRhaWwuaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj51ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWw8L2E+PC9wPg0KKyAgICAgICAgICA8cD48aW1nIHNyYz0iZnR2MnZlcnRsaW5lLnBuZyIgYWx0PSJ8IiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2Mm5vZGUucG5nIiBhbHQ9Im8iIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYyZG9jLnBuZyIgYWx0PSIqIiB3aWR0aD0yNCBoZWlnaHQ9MjIgLz48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2V0X21vZGVsX2RldGFpbC5odG1sIiB0YXJnZXQ9ImJhc2Vmcm0iPnVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsPC9hPjwvcD4NCisgICAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJ2ZXJ0bGluZS5wbmciIGFsdD0ifCIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2hvc3RpbmdfcmVkaXJlY3Rvci5odG1sIiB0YXJnZXQ9ImJhc2Vmcm0iPnVkZGkyX19ob3N0aW5nUmVkaXJlY3RvcjwvYT48L3A+DQorICAgICAgICAgIDxwPjxpbWcgc3JjPSJmdHYydmVydGxpbmUucG5nIiBhbHQ9InwiIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYybm9kZS5wbmciIGFsdD0ibyIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJkb2MucG5nIiBhbHQ9IioiIHdpZHRoPTI0IGhlaWdodD0yMiAvPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19pZGVudGlmaWVyX2JhZy5odG1sIiB0YXJnZXQ9ImJhc2Vmcm0iPnVkZGkyX19pZGVudGlmaWVyQmFnPC9hPjwvcD4NCisgICAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJ2ZXJ0bGluZS5wbmciIGFsdD0ifCIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2luc3RhbmNlX2RldGFpbHMuaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj51ZGRpMl9faW5zdGFuY2VEZXRhaWxzPC9hPjwvcD4NCisgICAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJ2ZXJ0bGluZS5wbmciIGFsdD0ifCIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2tleWVkX3JlZmVyZW5jZS5odG1sIiB0YXJnZXQ9ImJhc2Vmcm0iPnVkZGkyX19rZXllZFJlZmVyZW5jZTwvYT48L3A+DQorICAgICAgICAgIDxwPjxpbWcgc3JjPSJmdHYydmVydGxpbmUucG5nIiBhbHQ9InwiIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYybm9kZS5wbmciIGFsdD0ibyIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJkb2MucG5nIiBhbHQ9IioiIHdpZHRoPTI0IGhlaWdodD0yMiAvPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19rZXlzX293bmVkLmh0bWwiIHRhcmdldD0iYmFzZWZybSI+dWRkaTJfX2tleXNPd25lZDwvYT48L3A+DQorICAgICAgICAgIDxwPjxpbWcgc3JjPSJmdHYydmVydGxpbmUucG5nIiBhbHQ9InwiIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYybm9kZS5wbmciIGFsdD0ibyIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJkb2MucG5nIiBhbHQ9IioiIHdpZHRoPTI0IGhlaWdodD0yMiAvPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19uYW1lLmh0bWwiIHRhcmdldD0iYmFzZWZybSI+dWRkaTJfX25hbWU8L2E+PC9wPg0KKyAgICAgICAgICA8cD48aW1nIHNyYz0iZnR2MnZlcnRsaW5lLnBuZyIgYWx0PSJ8IiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2Mm5vZGUucG5nIiBhbHQ9Im8iIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYyZG9jLnBuZyIgYWx0PSIqIiB3aWR0aD0yNCBoZWlnaHQ9MjIgLz48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fb3ZlcnZpZXdfZG9jLmh0bWwiIHRhcmdldD0iYmFzZWZybSI+dWRkaTJfX292ZXJ2aWV3RG9jPC9hPjwvcD4NCisgICAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJ2ZXJ0bGluZS5wbmciIGFsdD0ifCIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3Bob25lLmh0bWwiIHRhcmdldD0iYmFzZWZybSI+dWRkaTJfX3Bob25lPC9hPjwvcD4NCisgICAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJ2ZXJ0bGluZS5wbmciIGFsdD0ifCIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb24uaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj51ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uPC9hPjwvcD4NCisgICAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJ2ZXJ0bGluZS5wbmciIGFsdD0ifCIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwiIHRhcmdldD0iYmFzZWZybSI+dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnM8L2E+PC9wPg0KKyAgICAgICAgICA8cD48aW1nIHNyYz0iZnR2MnZlcnRsaW5lLnBuZyIgYWx0PSJ8IiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2Mm5vZGUucG5nIiBhbHQ9Im8iIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYyZG9jLnBuZyIgYWx0PSIqIiB3aWR0aD0yNCBoZWlnaHQ9MjIgLz48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVnaXN0ZXJlZF9pbmZvLmh0bWwiIHRhcmdldD0iYmFzZWZybSI+dWRkaTJfX3JlZ2lzdGVyZWRJbmZvPC9hPjwvcD4NCisgICAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJ2ZXJ0bGluZS5wbmciIGFsdD0ifCIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3Nlc19saXN0Lmh0bWwiIHRhcmdldD0iYmFzZWZybSI+dWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdDwvYT48L3A+DQorICAgICAgICAgIDxwPjxpbWcgc3JjPSJmdHYydmVydGxpbmUucG5nIiBhbHQ9InwiIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYybm9kZS5wbmciIGFsdD0ibyIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJkb2MucG5nIiBhbHQ9IioiIHdpZHRoPTI0IGhlaWdodD0yMiAvPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzX2luZm8uaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj51ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbzwvYT48L3A+DQorICAgICAgICAgIDxwPjxpbWcgc3JjPSJmdHYydmVydGxpbmUucG5nIiBhbHQ9InwiIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYybm9kZS5wbmciIGFsdD0ibyIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJkb2MucG5nIiBhbHQ9IioiIHdpZHRoPTI0IGhlaWdodD0yMiAvPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzX2luZm9zLmh0bWwiIHRhcmdldD0iYmFzZWZybSI+dWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zPC9hPjwvcD4NCisgICAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJ2ZXJ0bGluZS5wbmciIGFsdD0ifCIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3Jlc3VsdC5odG1sIiB0YXJnZXQ9ImJhc2Vmcm0iPnVkZGkyX19yZXN1bHQ8L2E+PC9wPg0KKyAgICAgICAgICA8cD48aW1nIHNyYz0iZnR2MnZlcnRsaW5lLnBuZyIgYWx0PSJ8IiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2Mm5vZGUucG5nIiBhbHQ9Im8iIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYyZG9jLnBuZyIgYWx0PSIqIiB3aWR0aD0yNCBoZWlnaHQ9MjIgLz48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sIiB0YXJnZXQ9ImJhc2Vmcm0iPnVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmc8L2E+PC9wPg0KKyAgICAgICAgICA8cD48aW1nIHNyYz0iZnR2MnZlcnRsaW5lLnBuZyIgYWx0PSJ8IiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2Mm5vZGUucG5nIiBhbHQ9Im8iIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYyZG9jLnBuZyIgYWx0PSIqIiB3aWR0aD0yNCBoZWlnaHQ9MjIgLz48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj51ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzczwvYT48L3A+DQorICAgICAgICAgIDxwPjxpbWcgc3JjPSJmdHYydmVydGxpbmUucG5nIiBhbHQ9InwiIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYybm9kZS5wbmciIGFsdD0ibyIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJkb2MucG5nIiBhbHQ9IioiIHdpZHRoPTI0IGhlaWdodD0yMiAvPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwiIHRhcmdldD0iYmFzZWZybSI+dWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZTwvYT48L3A+DQorICAgICAgICAgIDxwPjxpbWcgc3JjPSJmdHYydmVydGxpbmUucG5nIiBhbHQ9InwiIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYybm9kZS5wbmciIGFsdD0ibyIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJkb2MucG5nIiBhbHQ9IioiIHdpZHRoPTI0IGhlaWdodD0yMiAvPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwiIHRhcmdldD0iYmFzZWZybSI+dWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsPC9hPjwvcD4NCisgICAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJ2ZXJ0bGluZS5wbmciIGFsdD0ifCIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfZGV0YWlsLmh0bWwiIHRhcmdldD0iYmFzZWZybSI+dWRkaTJfX3NlcnZpY2VEZXRhaWw8L2E+PC9wPg0KKyAgICAgICAgICA8cD48aW1nIHNyYz0iZnR2MnZlcnRsaW5lLnBuZyIgYWx0PSJ8IiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2Mm5vZGUucG5nIiBhbHQ9Im8iIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYyZG9jLnBuZyIgYWx0PSIqIiB3aWR0aD0yNCBoZWlnaHQ9MjIgLz48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9pbmZvLmh0bWwiIHRhcmdldD0iYmFzZWZybSI+dWRkaTJfX3NlcnZpY2VJbmZvPC9hPjwvcD4NCisgICAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJ2ZXJ0bGluZS5wbmciIGFsdD0ifCIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfaW5mb3MuaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj51ZGRpMl9fc2VydmljZUluZm9zPC9hPjwvcD4NCisgICAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJ2ZXJ0bGluZS5wbmciIGFsdD0ifCIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfbGlzdC5odG1sIiB0YXJnZXQ9ImJhc2Vmcm0iPnVkZGkyX19zZXJ2aWNlTGlzdDwvYT48L3A+DQorICAgICAgICAgIDxwPjxpbWcgc3JjPSJmdHYydmVydGxpbmUucG5nIiBhbHQ9InwiIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYybm9kZS5wbmciIGFsdD0ibyIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJkb2MucG5nIiBhbHQ9IioiIHdpZHRoPTI0IGhlaWdodD0yMiAvPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwiIHRhcmdldD0iYmFzZWZybSI+dWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPjwvcD4NCisgICAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJ2ZXJ0bGluZS5wbmciIGFsdD0ifCIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NoYXJlZF9yZWxhdGlvbnNoaXBzLmh0bWwiIHRhcmdldD0iYmFzZWZybSI+dWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHM8L2E+PC9wPg0KKyAgICAgICAgICA8cD48aW1nIHNyYz0iZnR2MnZlcnRsaW5lLnBuZyIgYWx0PSJ8IiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2Mm5vZGUucG5nIiBhbHQ9Im8iIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYyZG9jLnBuZyIgYWx0PSIqIiB3aWR0aD0yNCBoZWlnaHQ9MjIgLz48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbC5odG1sIiB0YXJnZXQ9ImJhc2Vmcm0iPnVkZGkyX190TW9kZWw8L2E+PC9wPg0KKyAgICAgICAgICA8cD48aW1nIHNyYz0iZnR2MnZlcnRsaW5lLnBuZyIgYWx0PSJ8IiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2Mm5vZGUucG5nIiBhbHQ9Im8iIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYyZG9jLnBuZyIgYWx0PSIqIiB3aWR0aD0yNCBoZWlnaHQ9MjIgLz48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9iYWcuaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj51ZGRpMl9fdE1vZGVsQmFnPC9hPjwvcD4NCisgICAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJ2ZXJ0bGluZS5wbmciIGFsdD0ifCIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfZGV0YWlsLmh0bWwiIHRhcmdldD0iYmFzZWZybSI+dWRkaTJfX3RNb2RlbERldGFpbDwvYT48L3A+DQorICAgICAgICAgIDxwPjxpbWcgc3JjPSJmdHYydmVydGxpbmUucG5nIiBhbHQ9InwiIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYybm9kZS5wbmciIGFsdD0ibyIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJkb2MucG5nIiBhbHQ9IioiIHdpZHRoPTI0IGhlaWdodD0yMiAvPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luZm8uaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj51ZGRpMl9fdE1vZGVsSW5mbzwvYT48L3A+DQorICAgICAgICAgIDxwPjxpbWcgc3JjPSJmdHYydmVydGxpbmUucG5nIiBhbHQ9InwiIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYybm9kZS5wbmciIGFsdD0ibyIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJkb2MucG5nIiBhbHQ9IioiIHdpZHRoPTI0IGhlaWdodD0yMiAvPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luZm9zLmh0bWwiIHRhcmdldD0iYmFzZWZybSI+dWRkaTJfX3RNb2RlbEluZm9zPC9hPjwvcD4NCisgICAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJ2ZXJ0bGluZS5wbmciIGFsdD0ifCIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5zdGFuY2VfZGV0YWlscy5odG1sIiB0YXJnZXQ9ImJhc2Vmcm0iPnVkZGkyX190TW9kZWxJbnN0YW5jZURldGFpbHM8L2E+PC9wPg0KKyAgICAgICAgICA8cD48aW1nIHNyYz0iZnR2MnZlcnRsaW5lLnBuZyIgYWx0PSJ8IiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2Mm5vZGUucG5nIiBhbHQ9Im8iIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYyZG9jLnBuZyIgYWx0PSIqIiB3aWR0aD0yNCBoZWlnaHQ9MjIgLz48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbnN0YW5jZV9pbmZvLmh0bWwiIHRhcmdldD0iYmFzZWZybSI+dWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbzwvYT48L3A+DQorICAgICAgICAgIDxwPjxpbWcgc3JjPSJmdHYydmVydGxpbmUucG5nIiBhbHQ9InwiIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYybm9kZS5wbmciIGFsdD0ibyIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJkb2MucG5nIiBhbHQ9IioiIHdpZHRoPTI0IGhlaWdodD0yMiAvPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2xpc3QuaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj51ZGRpMl9fdE1vZGVsTGlzdDwvYT48L3A+DQorICAgICAgICAgIDxwPjxpbWcgc3JjPSJmdHYydmVydGxpbmUucG5nIiBhbHQ9InwiIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYybGFzdG5vZGUucG5nIiBhbHQ9IlwiIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYyZG9jLnBuZyIgYWx0PSIqIiB3aWR0aD0yNCBoZWlnaHQ9MjIgLz48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdmFsaWRhdGVfX191X3NfY19vX3JfZXZhbHVlcy5odG1sIiB0YXJnZXQ9ImJhc2Vmcm0iPnVkZGkyX192YWxpZGF0ZV9VU0NPUkV2YWx1ZXM8L2E+PC9wPg0KKyAgICAgICAgPC9kaXY+DQorICAgICAgICA8cD48aW1nIHNyYz0iZnR2Mm5vZGUucG5nIiBhbHQ9Im8iIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYyZG9jLnBuZyIgYWx0PSIqIiB3aWR0aD0yNCBoZWlnaHQ9MjIgLz48YSBjbGFzcz0iZWwiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIiB0YXJnZXQ9ImJhc2Vmcm0iPkNsYXNzIE1lbWJlcnM8L2E+PC9wPg0KKyAgICAgICAgPHA+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJnbG9iYWxzLmh0bWwiIHRhcmdldD0iYmFzZWZybSI+RmlsZSBNZW1iZXJzPC9hPjwvcD4NCisgICAgICAgIDxwPjxpbWcgc3JjPSJmdHYycGxhc3Rub2RlLnBuZyIgYWx0PSJcIiB3aWR0aD0xNiBoZWlnaHQ9MjIgb25jbGljaz0idG9nZ2xlRm9sZGVyKCdmb2xkZXIzJywgdGhpcykiLz48aW1nIHNyYz0iZnR2MmZvbGRlcmNsb3NlZC5wbmciIGFsdD0iKyIgd2lkdGg9MjQgaGVpZ2h0PTIyIG9uY2xpY2s9InRvZ2dsZUZvbGRlcignZm9sZGVyMycsIHRoaXMpIi8+PGEgY2xhc3M9ImVsIiBocmVmPSJwYWdlcy5odG1sIiB0YXJnZXQ9ImJhc2Vmcm0iPlJlbGF0ZWQgUGFnZXM8L2E+PC9wPg0KKyAgICAgICAgPGRpdiBpZD0iZm9sZGVyMyI+DQorICAgICAgICAgIDxwPjxpbWcgc3JjPSJmdHYyYmxhbmsucG5nIiBhbHQ9IiZuYnNwOyIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJleGFtcGxlMS5odG1sIiB0YXJnZXQ9ImJhc2Vmcm0iPkNvZGUgRXhhbXBsZSAxOiBGaW5kaW5nIGEgc2VydmljZTwvYT48L3A+DQorICAgICAgICAgIDxwPjxpbWcgc3JjPSJmdHYyYmxhbmsucG5nIiBhbHQ9IiZuYnNwOyIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJub2RlLnBuZyIgYWx0PSJvIiB3aWR0aD0xNiBoZWlnaHQ9MjIgLz48aW1nIHNyYz0iZnR2MmRvYy5wbmciIGFsdD0iKiIgd2lkdGg9MjQgaGVpZ2h0PTIyIC8+PGEgY2xhc3M9ImVsIiBocmVmPSJleGFtcGxlMi5odG1sIiB0YXJnZXQ9ImJhc2Vmcm0iPkNvZGUgRXhhbXBsZSAyOiBGaW5kaW5nIGEgYnVzaW5lc3M8L2E+PC9wPg0KKyAgICAgICAgICA8cD48aW1nIHNyYz0iZnR2MmJsYW5rLnBuZyIgYWx0PSImbmJzcDsiIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYybm9kZS5wbmciIGFsdD0ibyIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJkb2MucG5nIiBhbHQ9IioiIHdpZHRoPTI0IGhlaWdodD0yMiAvPjxhIGNsYXNzPSJlbCIgaHJlZj0iZXhhbXBsZTMuaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj5Db2RlIEV4YW1wbGUgMzogUHVibGlzaGluZyBhIFdTREwgYW5kIHNlcnZpY2Ugb24gWE1ldGhvZHM8L2E+PC9wPg0KKyAgICAgICAgICA8cD48aW1nIHNyYz0iZnR2MmJsYW5rLnBuZyIgYWx0PSImbmJzcDsiIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYybm9kZS5wbmciIGFsdD0ibyIgd2lkdGg9MTYgaGVpZ2h0PTIyIC8+PGltZyBzcmM9ImZ0djJkb2MucG5nIiBhbHQ9IioiIHdpZHRoPTI0IGhlaWdodD0yMiAvPjxhIGNsYXNzPSJlbCIgaHJlZj0iaW5xdWlyZXNvYXAuaHRtbCIgdGFyZ2V0PSJiYXNlZnJtIj5CaW5kaW5nICJJbnF1aXJlU29hcCI8L2E+PC9wPg0KKyAgICAgICAgICA8cD48aW1nIHNyYz0iZnR2MmJsYW5rLnBuZyIgYWx0PSImbmJzcDsiIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYybGFzdG5vZGUucG5nIiBhbHQ9IlwiIHdpZHRoPTE2IGhlaWdodD0yMiAvPjxpbWcgc3JjPSJmdHYyZG9jLnBuZyIgYWx0PSIqIiB3aWR0aD0yNCBoZWlnaHQ9MjIgLz48YSBjbGFzcz0iZWwiIGhyZWY9InB1Ymxpc2hzb2FwLmh0bWwiIHRhcmdldD0iYmFzZWZybSI+QmluZGluZyAiUHVibGlzaFNvYXAiPC9hPjwvcD4NCisgICAgICAgIDwvZGl2Pg0KKyAgICAgIDwvZGl2Pg0KKyAgICA8L2Rpdj4NCisgIDwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3VkZGkyL2h0bWwvdWRkaV9fdjJfOGguaHRtbCBiL2RvYy91ZGRpMi9odG1sL3VkZGlfX3YyXzhoLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U5YWIxMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy91ZGRpMi9odG1sL3VkZGlfX3YyXzhoLmh0bWwKQEAgLTAsMCArMSwyMTc4IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBVRERJIHYyOiAvVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2MvdWRkaTIvdWRkaV92Mi5oIEZpbGUgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy91ZGRpMi91ZGRpX3YyLmggRmlsZSBSZWZlcmVuY2U8L2gxPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5DbGFzc2VzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNsYXNzICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FkZHJlc3MuaHRtbCI+dWRkaTJfX2FkZHJlc3M8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJhZGRyZXNzIi4gIDxhIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkcmVzcy5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNsYXNzICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfaXRlbS5odG1sIj51ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImFzc2VydGlvblN0YXR1c0l0ZW0iLiAgPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19hc3NlcnRpb25fc3RhdHVzX2l0ZW0uaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX3RlbXBsYXRlLmh0bWwiPnVkZGkyX19iaW5kaW5nVGVtcGxhdGU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJiaW5kaW5nVGVtcGxhdGUiLiAgPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX3RlbXBsYXRlLmh0bWwjX2RldGFpbHMiPk1vcmUuLi48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2xhc3MgJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZXMuaHRtbCI+dWRkaTJfX2JpbmRpbmdUZW1wbGF0ZXM8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJiaW5kaW5nVGVtcGxhdGVzIi4gIDxhIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ190ZW1wbGF0ZXMuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHkuaHRtbCI+dWRkaTJfX2J1c2luZXNzRW50aXR5PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYnVzaW5lc3NFbnRpdHkiLiAgPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHkuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19lbnRpdHlfZXh0Lmh0bWwiPnVkZGkyX19idXNpbmVzc0VudGl0eUV4dDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImJ1c2luZXNzRW50aXR5RXh0Ii4gIDxhIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZW50aXR5X2V4dC5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNsYXNzICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2luZm8uaHRtbCI+dWRkaTJfX2J1c2luZXNzSW5mbzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImJ1c2luZXNzSW5mbyIuICA8YSBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2luZm8uaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19pbmZvcy5odG1sIj51ZGRpMl9fYnVzaW5lc3NJbmZvczwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImJ1c2luZXNzSW5mb3MiLiAgPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19pbmZvcy5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNsYXNzICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2UuaHRtbCI+dWRkaTJfX2J1c2luZXNzU2VydmljZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImJ1c2luZXNzU2VydmljZSIuICA8YSBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX3NlcnZpY2UuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlcy5odG1sIj51ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlczwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImJ1c2luZXNzU2VydmljZXMiLiAgPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19zZXJ2aWNlcy5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNsYXNzICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NhdGVnb3J5X2JhZy5odG1sIj51ZGRpMl9fY2F0ZWdvcnlCYWc8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJjYXRlZ29yeUJhZyIuICA8YSBocmVmPSJjbGFzc3VkZGkyX19fX2NhdGVnb3J5X2JhZy5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNsYXNzICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NvbnRhY3QuaHRtbCI+dWRkaTJfX2NvbnRhY3Q8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJjb250YWN0Ii4gIDxhIGhyZWY9ImNsYXNzdWRkaTJfX19fY29udGFjdC5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNsYXNzICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2NvbnRhY3RzLmh0bWwiPnVkZGkyX19jb250YWN0czwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImNvbnRhY3RzIi4gIDxhIGhyZWY9ImNsYXNzdWRkaTJfX19fY29udGFjdHMuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjb3ZlcnlfdV9yX2xzLmh0bWwiPnVkZGkyX19kaXNjb3ZlcnlVUkxzPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZGlzY292ZXJ5VVJMcyIuICA8YSBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NvdmVyeV91X3JfbHMuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCI+dWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZGlzcG9zaXRpb25SZXBvcnQiLiAgPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX3F1YWxpZmllcnMuaHRtbCI+dWRkaTJfX2ZpbmRRdWFsaWZpZXJzPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZmluZFF1YWxpZmllcnMiLiAgPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX3F1YWxpZmllcnMuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19ob3N0aW5nX3JlZGlyZWN0b3IuaHRtbCI+dWRkaTJfX2hvc3RpbmdSZWRpcmVjdG9yPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiaG9zdGluZ1JlZGlyZWN0b3IiLiAgPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19ob3N0aW5nX3JlZGlyZWN0b3IuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19pZGVudGlmaWVyX2JhZy5odG1sIj51ZGRpMl9faWRlbnRpZmllckJhZzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImlkZW50aWZpZXJCYWciLiAgPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19pZGVudGlmaWVyX2JhZy5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNsYXNzICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2luc3RhbmNlX2RldGFpbHMuaHRtbCI+dWRkaTJfX2luc3RhbmNlRGV0YWlsczwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6Imluc3RhbmNlRGV0YWlscyIuICA8YSBocmVmPSJjbGFzc3VkZGkyX19fX2luc3RhbmNlX2RldGFpbHMuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19rZXllZF9yZWZlcmVuY2UuaHRtbCI+dWRkaTJfX2tleWVkUmVmZXJlbmNlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92Mjoia2V5ZWRSZWZlcmVuY2UiLiAgPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19rZXllZF9yZWZlcmVuY2UuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19rZXlzX293bmVkLmh0bWwiPnVkZGkyX19rZXlzT3duZWQ8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJrZXlzT3duZWQiLiAgPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19rZXlzX293bmVkLmh0bWwjX2RldGFpbHMiPk1vcmUuLi48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2xhc3MgJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fb3ZlcnZpZXdfZG9jLmh0bWwiPnVkZGkyX19vdmVydmlld0RvYzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6Im92ZXJ2aWV3RG9jIi4gIDxhIGhyZWY9ImNsYXNzdWRkaTJfX19fb3ZlcnZpZXdfZG9jLmh0bWwjX2RldGFpbHMiPk1vcmUuLi48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2xhc3MgJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbi5odG1sIj51ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoicHVibGlzaGVyQXNzZXJ0aW9uIi4gIDxhIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbi5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNsYXNzICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3NfaW5mby5odG1sIj51ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InJlbGF0ZWRCdXNpbmVzc0luZm8iLiAgPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzX2luZm8uaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzX2luZm9zLmh0bWwiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvczwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InJlbGF0ZWRCdXNpbmVzc0luZm9zIi4gIDxhIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVsYXRlZF9idXNpbmVzc19pbmZvcy5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNsYXNzICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3Jlc3VsdC5odG1sIj51ZGRpMl9fcmVzdWx0PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoicmVzdWx0Ii4gIDxhIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVzdWx0Lmh0bWwjX2RldGFpbHMiPk1vcmUuLi48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2xhc3MgJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9pbmZvLmh0bWwiPnVkZGkyX19zZXJ2aWNlSW5mbzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InNlcnZpY2VJbmZvIi4gIDxhIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9pbmZvLmh0bWwjX2RldGFpbHMiPk1vcmUuLi48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2xhc3MgJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9pbmZvcy5odG1sIj51ZGRpMl9fc2VydmljZUluZm9zPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92Mjoic2VydmljZUluZm9zIi4gIDxhIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9pbmZvcy5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNsYXNzICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NoYXJlZF9yZWxhdGlvbnNoaXBzLmh0bWwiPnVkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92Mjoic2hhcmVkUmVsYXRpb25zaGlwcyIuICA8YSBocmVmPSJjbGFzc3VkZGkyX19fX3NoYXJlZF9yZWxhdGlvbnNoaXBzLmh0bWwjX2RldGFpbHMiPk1vcmUuLi48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2xhc3MgJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbC5odG1sIj51ZGRpMl9fdE1vZGVsPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoidE1vZGVsIi4gIDxhIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbC5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNsYXNzICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfYmFnLmh0bWwiPnVkZGkyX190TW9kZWxCYWc8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJ0TW9kZWxCYWciLiAgPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2JhZy5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNsYXNzICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5mby5odG1sIj51ZGRpMl9fdE1vZGVsSW5mbzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InRNb2RlbEluZm8iLiAgPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luZm8uaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luZm9zLmh0bWwiPnVkZGkyX190TW9kZWxJbmZvczwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InRNb2RlbEluZm9zIi4gIDxhIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbmZvcy5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNsYXNzICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfaW5zdGFuY2VfZGV0YWlscy5odG1sIj51ZGRpMl9fdE1vZGVsSW5zdGFuY2VEZXRhaWxzPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoidE1vZGVsSW5zdGFuY2VEZXRhaWxzIi4gIDxhIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbnN0YW5jZV9kZXRhaWxzLmh0bWwjX2RldGFpbHMiPk1vcmUuLi48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2xhc3MgJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9pbnN0YW5jZV9pbmZvLmh0bWwiPnVkZGkyX190TW9kZWxJbnN0YW5jZUluZm88L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJ0TW9kZWxJbnN0YW5jZUluZm8iLiAgPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2luc3RhbmNlX2luZm8uaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hZGRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwiPnVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImFkZF9wdWJsaXNoZXJBc3NlcnRpb25zIi4gIDxhIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNsYXNzICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sIj51ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmc8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJkZWxldGVfYmluZGluZyIuICA8YSBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNsYXNzICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzczwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImRlbGV0ZV9idXNpbmVzcyIuICA8YSBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwiPnVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImRlbGV0ZV9wdWJsaXNoZXJBc3NlcnRpb25zIi4gIDxhIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNsYXNzICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2U8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJkZWxldGVfc2VydmljZSIuICA8YSBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNsYXNzICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImRlbGV0ZV90TW9kZWwiLiAgPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjYXJkX19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLmh0bWwiPnVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbjwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImRpc2NhcmRfYXV0aFRva2VuIi4gIDxhIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzY2FyZF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNsYXNzICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCI+dWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImZpbmRfYmluZGluZyIuICA8YSBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sIj51ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzczwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImZpbmRfYnVzaW5lc3MiLiAgPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VidXNpbmVzcy5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNsYXNzICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXJlbGF0ZWRfYnVzaW5lc3Nlcy5odG1sIj51ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlczwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImZpbmRfcmVsYXRlZEJ1c2luZXNzZXMiLiAgPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VyZWxhdGVkX2J1c2luZXNzZXMuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwiPnVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2U8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJmaW5kX3NlcnZpY2UiLiAgPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjX2RldGFpbHMiPk1vcmUuLi48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2xhc3MgJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sIj51ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWw8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJmaW5kX3RNb2RlbCIuICA8YSBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWFzc2VydGlvbl9zdGF0dXNfcmVwb3J0Lmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZ2V0X2Fzc2VydGlvblN0YXR1c1JlcG9ydCIuICA8YSBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXNzZXJ0aW9uX3N0YXR1c19yZXBvcnQuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCI+dWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW48L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJnZXRfYXV0aFRva2VuIi4gIDxhIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLmh0bWwjX2RldGFpbHMiPk1vcmUuLi48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2xhc3MgJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2ViaW5kaW5nX2RldGFpbC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWw8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJnZXRfYmluZGluZ0RldGFpbCIuICA8YSBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYmluZGluZ19kZXRhaWwuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZ2V0X2J1c2luZXNzRGV0YWlsIi4gIDxhIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VidXNpbmVzc19kZXRhaWwuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbF9leHQuaHRtbCI+dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImdldF9idXNpbmVzc0RldGFpbEV4dCIuICA8YSBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsX2V4dC5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNsYXNzICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCI+dWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZ2V0X3B1Ymxpc2hlckFzc2VydGlvbnMiLiAgPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwjX2RldGFpbHMiPk1vcmUuLi48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2xhc3MgJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VyZWdpc3RlcmVkX2luZm8uaHRtbCI+dWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImdldF9yZWdpc3RlcmVkSW5mbyIuICA8YSBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lcmVnaXN0ZXJlZF9pbmZvLmh0bWwjX2RldGFpbHMiPk1vcmUuLi48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2xhc3MgJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VzZXJ2aWNlX2RldGFpbC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWw8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJnZXRfc2VydmljZURldGFpbCIuICA8YSBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lc2VydmljZV9kZXRhaWwuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXRfbW9kZWxfZGV0YWlsLmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZ2V0X3RNb2RlbERldGFpbCIuICA8YSBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9ldF9tb2RlbF9kZXRhaWwuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwiPnVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmc8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJzYXZlX2JpbmRpbmciLiAgPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwjX2RldGFpbHMiPk1vcmUuLi48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2xhc3MgJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCI+dWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJzYXZlX2J1c2luZXNzIi4gIDxhIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwiPnVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2U8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJzYXZlX3NlcnZpY2UiLiAgPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2VzZXJ2aWNlLmh0bWwjX2RldGFpbHMiPk1vcmUuLi48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2xhc3MgJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sIj51ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWw8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJzYXZlX3RNb2RlbCIuICA8YSBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwiPnVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InNldF9wdWJsaXNoZXJBc3NlcnRpb25zIi4gIDxhIGhyZWY9ImNsYXNzdWRkaTJfX19fc2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNsYXNzICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3ZhbGlkYXRlX19fdV9zX2Nfb19yX2V2YWx1ZXMuaHRtbCI+dWRkaTJfX3ZhbGlkYXRlX1VTQ09SRXZhbHVlczwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InZhbGlkYXRlX3ZhbHVlcyIuICA8YSBocmVmPSJjbGFzc3VkZGkyX19fX3ZhbGlkYXRlX19fdV9zX2Nfb19yX2V2YWx1ZXMuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sIj51ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYXNzZXJ0aW9uU3RhdHVzUmVwb3J0Ii4gIDxhIGhyZWY9ImNsYXNzdWRkaTJfX19fYXNzZXJ0aW9uX3N0YXR1c19yZXBvcnQuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hdXRoX3Rva2VuLmh0bWwiPnVkZGkyX19hdXRoVG9rZW48L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJhdXRoVG9rZW4iLiAgPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19hdXRoX3Rva2VuLmh0bWwjX2RldGFpbHMiPk1vcmUuLi48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2xhc3MgJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ19kZXRhaWwuaHRtbCI+dWRkaTJfX2JpbmRpbmdEZXRhaWw8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJiaW5kaW5nRGV0YWlsIi4gIDxhIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ19kZXRhaWwuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWwuaHRtbCI+dWRkaTJfX2J1c2luZXNzRGV0YWlsPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYnVzaW5lc3NEZXRhaWwiLiAgPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWwuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwiPnVkZGkyX19idXNpbmVzc0RldGFpbEV4dDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImJ1c2luZXNzRGV0YWlsRXh0Ii4gIDxhIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsX2V4dC5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNsYXNzICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2xpc3QuaHRtbCI+dWRkaTJfX2J1c2luZXNzTGlzdDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImJ1c2luZXNzTGlzdCIuICA8YSBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2xpc3QuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19wdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sIj51ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uczwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InB1Ymxpc2hlckFzc2VydGlvbnMiLiAgPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19wdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNsYXNzICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlZ2lzdGVyZWRfaW5mby5odG1sIj51ZGRpMl9fcmVnaXN0ZXJlZEluZm88L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJyZWdpc3RlcmVkSW5mbyIuICA8YSBocmVmPSJjbGFzc3VkZGkyX19fX3JlZ2lzdGVyZWRfaW5mby5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNsYXNzICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3JlbGF0ZWRfYnVzaW5lc3Nlc19saXN0Lmh0bWwiPnVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3Q8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJyZWxhdGVkQnVzaW5lc3Nlc0xpc3QiLiAgPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzZXNfbGlzdC5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNsYXNzICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfZGV0YWlsLmh0bWwiPnVkZGkyX19zZXJ2aWNlRGV0YWlsPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92Mjoic2VydmljZURldGFpbCIuICA8YSBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfZGV0YWlsLmh0bWwjX2RldGFpbHMiPk1vcmUuLi48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2xhc3MgJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9saXN0Lmh0bWwiPnVkZGkyX19zZXJ2aWNlTGlzdDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InNlcnZpY2VMaXN0Ii4gIDxhIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9saXN0Lmh0bWwjX2RldGFpbHMiPk1vcmUuLi48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2xhc3MgJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9kZXRhaWwuaHRtbCI+dWRkaTJfX3RNb2RlbERldGFpbDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InRNb2RlbERldGFpbCIuICA8YSBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfZGV0YWlsLmh0bWwjX2RldGFpbHMiPk1vcmUuLi48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2xhc3MgJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fdF9tb2RlbF9saXN0Lmh0bWwiPnVkZGkyX190TW9kZWxMaXN0PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5TY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoidE1vZGVsTGlzdCIuICA8YSBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfbGlzdC5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNsYXNzICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FjY2Vzc19wb2ludC5odG1sIj51ZGRpMl9fYWNjZXNzUG9pbnQ8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJhY2Nlc3NQb2ludCIuICA8YSBocmVmPSJjbGFzc3VkZGkyX19fX2FjY2Vzc19wb2ludC5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNsYXNzICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2FkZHJlc3NfbGluZS5odG1sIj51ZGRpMl9fYWRkcmVzc0xpbmU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJhZGRyZXNzTGluZSIuICA8YSBocmVmPSJjbGFzc3VkZGkyX19fX2FkZHJlc3NfbGluZS5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNsYXNzICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rlc2NyaXB0aW9uLmh0bWwiPnVkZGkyX19kZXNjcmlwdGlvbjwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImRlc2NyaXB0aW9uIi4gIDxhIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVzY3JpcHRpb24uaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjb3ZlcnlfdV9yX2wuaHRtbCI+dWRkaTJfX2Rpc2NvdmVyeVVSTDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImRpc2NvdmVyeVVSTCIuICA8YSBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NvdmVyeV91X3JfbC5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNsYXNzICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2VtYWlsLmh0bWwiPnVkZGkyX19lbWFpbDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImVtYWlsIi4gIDxhIGhyZWY9ImNsYXNzdWRkaTJfX19fZW1haWwuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19lcnJfaW5mby5odG1sIj51ZGRpMl9fZXJySW5mbzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImVyckluZm8iLiAgPGEgaHJlZj0iY2xhc3N1ZGRpMl9fX19lcnJfaW5mby5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNsYXNzICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX25hbWUuaHRtbCI+dWRkaTJfX25hbWU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJuYW1lIi4gIDxhIGhyZWY9ImNsYXNzdWRkaTJfX19fbmFtZS5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNsYXNzICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3Bob25lLmh0bWwiPnVkZGkyX19waG9uZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InBob25lIi4gIDxhIGhyZWY9ImNsYXNzdWRkaTJfX19fcGhvbmUuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jbGFzcyAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3NfX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sIj5fZGlzcG9zaXRpb25SZXBvcnQ8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlRoZSBTT0FQIEZhdWx0IERldGFpbCBlbGVtZW50IGNvbnRhaW5zIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR5cGVzIHNlcmlhbGl6ZWQuICA8YSBocmVmPSJjbGFzc19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwjX2RldGFpbHMiPk1vcmUuLi48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlR5cGVkZWZzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnR5cGVkZWYgY2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTAiPnhzZF9fTk1UT0tFTjwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+UHJpbWl0aXZlIGJ1aWx0LWluIHR5cGUgInhzOk5NVE9LRU4iLiAgPGEgaHJlZj0iI2EwIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+dHlwZWRlZiBjaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMSI+eG1sX19sYW5nPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5CdWlsdC1pbiBhdHRyaWJ1dGUgInhtbDpsYW5nIi4gIDxhIGhyZWY9IiNhMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnR5cGVkZWYgY2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTIiPnVkZGkyX19iaW5kaW5nS2V5PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5TY2hlbWEgInVybjp1ZGRpLW9yZzphcGlfdjIiOmJpbmRpbmdLZXkgc2ltcGxlVHlwZSByZXN0cmljdGlvbiBvZiB4czpzdHJpbmcuICA8YSBocmVmPSIjYTIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD50eXBlZGVmIGNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EzIj51ZGRpMl9fYnVzaW5lc3NLZXk8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlNjaGVtYSAidXJuOnVkZGktb3JnOmFwaV92MiI6YnVzaW5lc3NLZXkgc2ltcGxlVHlwZSByZXN0cmljdGlvbiBvZiB4czpzdHJpbmcuICA8YSBocmVmPSIjYTMiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD50eXBlZGVmIGNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0Ij51ZGRpMl9fc2VydmljZUtleTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpzZXJ2aWNlS2V5IHNpbXBsZVR5cGUgcmVzdHJpY3Rpb24gb2YgeHM6c3RyaW5nLiAgPGEgaHJlZj0iI2E0Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+dHlwZWRlZiBjaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNSI+dWRkaTJfX3RNb2RlbEtleTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0TW9kZWxLZXkgc2ltcGxlVHlwZSByZXN0cmljdGlvbiBvZiB4czpzdHJpbmcuICA8YSBocmVmPSIjYTUiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+RW51bWVyYXRpb25zPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmVudW0gJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQ3Ij51ZGRpMl9fZGlyZWN0aW9uPC9hPiB7IDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNDdhNiI+dWRkaTJfX2RpcmVjdGlvbl9fZnJvbUtleTwvYT4sIA0KKzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNDdhNyI+dWRkaTJfX2RpcmVjdGlvbl9fdG9LZXk8L2E+DQorIH08L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpkaXJlY3Rpb24gc2ltcGxlVHlwZSByZXN0cmljdGlvbiBvZiB4czpOTVRPS0VOIE5vdGU6IGVudW0gdmFsdWVzIGFyZSBwcmVmaXhlZCB3aXRoICd1ZGRpMl9fZGlyZWN0aW9uJyB0byBhdm9pZCBuYW1lIGNsYXNoZXMsIHBsZWFzZSB1c2Ugd3NkbDJoIG9wdGlvbiAtZSB0byBvbWl0IHRoaXMgcHJlZml4LiAgPGEgaHJlZj0iI2E0NyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5lbnVtICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0OCI+dWRkaTJfX3RydW5jYXRlZDwvYT4geyA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQ4YTgiPnVkZGkyX190cnVuY2F0ZWRfX3RydWVfPC9hPiwgDQorPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0OGE5Ij51ZGRpMl9fdHJ1bmNhdGVkX19mYWxzZV88L2E+DQorIH08L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0cnVuY2F0ZWQgc2ltcGxlVHlwZSByZXN0cmljdGlvbiBvZiB4czpOTVRPS0VOIE5vdGU6IGVudW0gdmFsdWVzIGFyZSBwcmVmaXhlZCB3aXRoICd1ZGRpMl9fdHJ1bmNhdGVkJyB0byBhdm9pZCBuYW1lIGNsYXNoZXMsIHBsZWFzZSB1c2Ugd3NkbDJoIG9wdGlvbiAtZSB0byBvbWl0IHRoaXMgcHJlZml4LiAgPGEgaHJlZj0iI2E0OCI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5lbnVtICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0OSI+dWRkaTJfX1VSTFR5cGU8L2E+IHsgPGJyPg0KKyZuYnNwOyZuYnNwOzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNDlhMTAiPnVkZGkyX19VUkxUeXBlX19tYWlsdG88L2E+LCANCis8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQ5YTExIj51ZGRpMl9fVVJMVHlwZV9faHR0cDwvYT4sIA0KKzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNDlhMTIiPnVkZGkyX19VUkxUeXBlX19odHRwczwvYT4sIA0KKzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNDlhMTMiPnVkZGkyX19VUkxUeXBlX19mdHA8L2E+LCANCis8YnI+DQorJm5ic3A7Jm5ic3A7PGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0OWExNCI+dWRkaTJfX1VSTFR5cGVfX2ZheDwvYT4sIA0KKzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNDlhMTUiPnVkZGkyX19VUkxUeXBlX19waG9uZTwvYT4sIA0KKzxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNDlhMTYiPnVkZGkyX19VUkxUeXBlX19vdGhlcjwvYT4NCis8YnI+DQorIH08L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+U2NoZW1hICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpVUkxUeXBlIHNpbXBsZVR5cGUgcmVzdHJpY3Rpb24gb2YgeHM6Tk1UT0tFTiBOb3RlOiBlbnVtIHZhbHVlcyBhcmUgcHJlZml4ZWQgd2l0aCAndWRkaTJfX1VSTFR5cGUnIHRvIGF2b2lkIG5hbWUgY2xhc2hlcywgcGxlYXNlIHVzZSB3c2RsMmggb3B0aW9uIC1lIHRvIG9taXQgdGhpcyBwcmVmaXguICA8YSBocmVmPSIjYTQ5Ij5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmVudW0gJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTUwIj51ZGRpMl9fa2V5VHlwZTwvYT4geyA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTUwYTE3Ij51ZGRpMl9fa2V5VHlwZV9fYnVzaW5lc3NLZXk8L2E+LCANCis8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTUwYTE4Ij51ZGRpMl9fa2V5VHlwZV9fdE1vZGVsS2V5PC9hPiwgDQorPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E1MGExOSI+dWRkaTJfX2tleVR5cGVfX3NlcnZpY2VLZXk8L2E+LCANCis8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTUwYTIwIj51ZGRpMl9fa2V5VHlwZV9fYmluZGluZ0tleTwvYT4NCisgfTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5TY2hlbWEgInVybjp1ZGRpLW9yZzphcGlfdjIiOmtleVR5cGUgc2ltcGxlVHlwZSByZXN0cmljdGlvbiBvZiB4czpOTVRPS0VOIE5vdGU6IGVudW0gdmFsdWVzIGFyZSBwcmVmaXhlZCB3aXRoICd1ZGRpMl9fa2V5VHlwZScgdG8gYXZvaWQgbmFtZSBjbGFzaGVzLCBwbGVhc2UgdXNlIHdzZGwyaCBvcHRpb24gLWUgdG8gb21pdCB0aGlzIHByZWZpeC4gIDxhIGhyZWY9IiNhNTAiPk1vcmUuLi48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPkZ1bmN0aW9uczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMjEiPl9faW5xMl9fZmluZF9VU0NPUkViaW5kaW5nPC9hPiAoPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJpbmRpbmcuaHRtbCI+dWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZzwvYT4gKnVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmdfLCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYmluZGluZ19kZXRhaWwuaHRtbCI+dWRkaTJfX2JpbmRpbmdEZXRhaWw8L2E+ICp1ZGRpMl9fYmluZGluZ0RldGFpbF8pPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk9wZXJhdGlvbiAiX19pbnEyX19maW5kX1VTQ09SRWJpbmRpbmciIG9mIHNlcnZpY2UgYmluZGluZyAiSW5xdWlyZVNvYXAiLiAgPGEgaHJlZj0iI2EyMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EyMiI+X19pbnEyX19maW5kX1VTQ09SRWJ1c2luZXNzPC9hPiAoPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwiPnVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzPC9hPiAqdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3NfLCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfbGlzdC5odG1sIj51ZGRpMl9fYnVzaW5lc3NMaXN0PC9hPiAqdWRkaTJfX2J1c2luZXNzTGlzdF8pPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk9wZXJhdGlvbiAiX19pbnEyX19maW5kX1VTQ09SRWJ1c2luZXNzIiBvZiBzZXJ2aWNlIGJpbmRpbmcgIklucXVpcmVTb2FwIi4gIDxhIGhyZWY9IiNhMjIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMjMiPl9faW5xMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlczwvYT4gKDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VyZWxhdGVkX2J1c2luZXNzZXMuaHRtbCI+dWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXM8L2E+ICp1ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3Nlc18sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzZXNfbGlzdC5odG1sIj51ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0PC9hPiAqdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdF8pPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk9wZXJhdGlvbiAiX19pbnEyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzIiBvZiBzZXJ2aWNlIGJpbmRpbmcgIklucXVpcmVTb2FwIi4gIDxhIGhyZWY9IiNhMjMiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMjQiPl9faW5xMl9fZmluZF9VU0NPUkVzZXJ2aWNlPC9hPiAoPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCI+dWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZTwvYT4gKnVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2VfLCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9saXN0Lmh0bWwiPnVkZGkyX19zZXJ2aWNlTGlzdDwvYT4gKnVkZGkyX19zZXJ2aWNlTGlzdF8pPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk9wZXJhdGlvbiAiX19pbnEyX19maW5kX1VTQ09SRXNlcnZpY2UiIG9mIHNlcnZpY2UgYmluZGluZyAiSW5xdWlyZVNvYXAiLiAgPGEgaHJlZj0iI2EyNCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EyNSI+X19pbnEyX19maW5kX1VTQ09SRXRNb2RlbDwvYT4gKDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwiPnVkZGkyX19maW5kX1VTQ09SRXRNb2RlbDwvYT4gKnVkZGkyX19maW5kX1VTQ09SRXRNb2RlbF8sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2xpc3QuaHRtbCI+dWRkaTJfX3RNb2RlbExpc3Q8L2E+ICp1ZGRpMl9fdE1vZGVsTGlzdF8pPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk9wZXJhdGlvbiAiX19pbnEyX19maW5kX1VTQ09SRXRNb2RlbCIgb2Ygc2VydmljZSBiaW5kaW5nICJJbnF1aXJlU29hcCIuICA8YSBocmVmPSIjYTI1Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTI2Ij5fX2lucTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsPC9hPiAoPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYmluZGluZ19kZXRhaWwuaHRtbCI+dWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsPC9hPiAqdWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsXywgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfZGV0YWlsLmh0bWwiPnVkZGkyX19iaW5kaW5nRGV0YWlsPC9hPiAqdWRkaTJfX2JpbmRpbmdEZXRhaWxfKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5PcGVyYXRpb24gIl9faW5xMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwiIG9mIHNlcnZpY2UgYmluZGluZyAiSW5xdWlyZVNvYXAiLiAgPGEgaHJlZj0iI2EyNiI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EyNyI+X19pbnEyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWw8L2E+ICg8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VidXNpbmVzc19kZXRhaWwuaHRtbCI+dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbDwvYT4gKnVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxfLCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsLmh0bWwiPnVkZGkyX19idXNpbmVzc0RldGFpbDwvYT4gKnVkZGkyX19idXNpbmVzc0RldGFpbF8pPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk9wZXJhdGlvbiAiX19pbnEyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwiIG9mIHNlcnZpY2UgYmluZGluZyAiSW5xdWlyZVNvYXAiLiAgPGEgaHJlZj0iI2EyNyI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EyOCI+X19pbnEyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQ8L2E+ICg8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VidXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQ8L2E+ICp1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0XywgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2RldGFpbF9leHQuaHRtbCI+dWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0PC9hPiAqdWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0Xyk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+T3BlcmF0aW9uICJfX2lucTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dCIgb2Ygc2VydmljZSBiaW5kaW5nICJJbnF1aXJlU29hcCIuICA8YSBocmVmPSIjYTI4Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTI5Ij5fX2lucTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsPC9hPiAoPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lc2VydmljZV9kZXRhaWwuaHRtbCI+dWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsPC9hPiAqdWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsXywgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfZGV0YWlsLmh0bWwiPnVkZGkyX19zZXJ2aWNlRGV0YWlsPC9hPiAqdWRkaTJfX3NlcnZpY2VEZXRhaWxfKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5PcGVyYXRpb24gIl9faW5xMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwiIG9mIHNlcnZpY2UgYmluZGluZyAiSW5xdWlyZVNvYXAiLiAgPGEgaHJlZj0iI2EyOSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EzMCI+X19pbnEyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsPC9hPiAoPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9ldF9tb2RlbF9kZXRhaWwuaHRtbCI+dWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWw8L2E+ICp1ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbF8sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2RldGFpbC5odG1sIj51ZGRpMl9fdE1vZGVsRGV0YWlsPC9hPiAqdWRkaTJfX3RNb2RlbERldGFpbF8pPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk9wZXJhdGlvbiAiX19pbnEyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsIiBvZiBzZXJ2aWNlIGJpbmRpbmcgIklucXVpcmVTb2FwIi4gIDxhIGhyZWY9IiNhMzAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMzEiPl9fcHViMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+ICg8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sIj51ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+ICp1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnNfLCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwiPnVkZGkyX19kaXNwb3NpdGlvblJlcG9ydDwvYT4gKnVkZGkyX19kaXNwb3NpdGlvblJlcG9ydF8pPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk9wZXJhdGlvbiAiX19wdWIyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyIgb2Ygc2VydmljZSBiaW5kaW5nICJQdWJsaXNoU29hcCIuICA8YSBocmVmPSIjYTMxIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTMyIj5fX3B1YjJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nPC9hPiAoPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sIj51ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmc8L2E+ICp1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmdfLCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwiPnVkZGkyX19kaXNwb3NpdGlvblJlcG9ydDwvYT4gKnVkZGkyX19kaXNwb3NpdGlvblJlcG9ydF8pPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk9wZXJhdGlvbiAiX19wdWIyX19kZWxldGVfVVNDT1JFYmluZGluZyIgb2Ygc2VydmljZSBiaW5kaW5nICJQdWJsaXNoU29hcCIuICA8YSBocmVmPSIjYTMyIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTMzIj5fX3B1YjJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzczwvYT4gKDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwiPnVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3M8L2E+ICp1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzXywgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sIj51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQ8L2E+ICp1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnRfKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5PcGVyYXRpb24gIl9fcHViMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzIiBvZiBzZXJ2aWNlIGJpbmRpbmcgIlB1Ymxpc2hTb2FwIi4gIDxhIGhyZWY9IiNhMzMiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMzQiPl9fcHViMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+ICg8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+ICp1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnNfLCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwiPnVkZGkyX19kaXNwb3NpdGlvblJlcG9ydDwvYT4gKnVkZGkyX19kaXNwb3NpdGlvblJlcG9ydF8pPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk9wZXJhdGlvbiAiX19wdWIyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyIgb2Ygc2VydmljZSBiaW5kaW5nICJQdWJsaXNoU29hcCIuICA8YSBocmVmPSIjYTM0Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTM1Ij5fX3B1YjJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlPC9hPiAoPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2U8L2E+ICp1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2VfLCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwiPnVkZGkyX19kaXNwb3NpdGlvblJlcG9ydDwvYT4gKnVkZGkyX19kaXNwb3NpdGlvblJlcG9ydF8pPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk9wZXJhdGlvbiAiX19wdWIyX19kZWxldGVfVVNDT1JFc2VydmljZSIgb2Ygc2VydmljZSBiaW5kaW5nICJQdWJsaXNoU29hcCIuICA8YSBocmVmPSIjYTM1Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTM2Ij5fX3B1YjJfX2RlbGV0ZV9VU0NPUkV0TW9kZWw8L2E+ICg8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwiPnVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsPC9hPiAqdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWxfLCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwiPnVkZGkyX19kaXNwb3NpdGlvblJlcG9ydDwvYT4gKnVkZGkyX19kaXNwb3NpdGlvblJlcG9ydF8pPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk9wZXJhdGlvbiAiX19wdWIyX19kZWxldGVfVVNDT1JFdE1vZGVsIiBvZiBzZXJ2aWNlIGJpbmRpbmcgIlB1Ymxpc2hTb2FwIi4gIDxhIGhyZWY9IiNhMzYiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMzciPl9fcHViMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW48L2E+ICg8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzY2FyZF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sIj51ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW48L2E+ICp1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW5fLCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwiPnVkZGkyX19kaXNwb3NpdGlvblJlcG9ydDwvYT4gKnVkZGkyX19kaXNwb3NpdGlvblJlcG9ydF8pPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk9wZXJhdGlvbiAiX19wdWIyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbiIgb2Ygc2VydmljZSBiaW5kaW5nICJQdWJsaXNoU29hcCIuICA8YSBocmVmPSIjYTM3Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTM4Ij5fX3B1YjJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQ8L2E+ICg8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2Vhc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydDwvYT4gKnVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0XywgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfcmVwb3J0Lmh0bWwiPnVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQ8L2E+ICp1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0Xyk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+T3BlcmF0aW9uICJfX3B1YjJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQiIG9mIHNlcnZpY2UgYmluZGluZyAiUHVibGlzaFNvYXAiLiAgPGEgaHJlZj0iI2EzOCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EzOSI+X19wdWIyX19nZXRfVVNDT1JFYXV0aFRva2VuPC9hPiAoPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYXV0aF90b2tlbi5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbjwvYT4gKnVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuXywgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2F1dGhfdG9rZW4uaHRtbCI+dWRkaTJfX2F1dGhUb2tlbjwvYT4gKnVkZGkyX19hdXRoVG9rZW5fKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5PcGVyYXRpb24gIl9fcHViMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbiIgb2Ygc2VydmljZSBiaW5kaW5nICJQdWJsaXNoU29hcCIuICA8YSBocmVmPSIjYTM5Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQwIj5fX3B1YjJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPiAoPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCI+dWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPiAqdWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zXywgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwiPnVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zPC9hPiAqdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnNfKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5PcGVyYXRpb24gIl9fcHViMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMiIG9mIHNlcnZpY2UgYmluZGluZyAiUHVibGlzaFNvYXAiLiAgPGEgaHJlZj0iI2E0MCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0MSI+X19wdWIyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm88L2E+ICg8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VyZWdpc3RlcmVkX2luZm8uaHRtbCI+dWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbzwvYT4gKnVkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm9fLCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVnaXN0ZXJlZF9pbmZvLmh0bWwiPnVkZGkyX19yZWdpc3RlcmVkSW5mbzwvYT4gKnVkZGkyX19yZWdpc3RlcmVkSW5mb18pPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk9wZXJhdGlvbiAiX19wdWIyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8iIG9mIHNlcnZpY2UgYmluZGluZyAiUHVibGlzaFNvYXAiLiAgPGEgaHJlZj0iI2E0MSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0MiI+X19wdWIyX19zYXZlX1VTQ09SRWJpbmRpbmc8L2E+ICg8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYmluZGluZy5odG1sIj51ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nPC9hPiAqdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZ18sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX2RldGFpbC5odG1sIj51ZGRpMl9fYmluZGluZ0RldGFpbDwvYT4gKnVkZGkyX19iaW5kaW5nRGV0YWlsXyk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+T3BlcmF0aW9uICJfX3B1YjJfX3NhdmVfVVNDT1JFYmluZGluZyIgb2Ygc2VydmljZSBiaW5kaW5nICJQdWJsaXNoU29hcCIuICA8YSBocmVmPSIjYTQyIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQzIj5fX3B1YjJfX3NhdmVfVVNDT1JFYnVzaW5lc3M8L2E+ICg8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCI+dWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M8L2E+ICp1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzc18sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWwuaHRtbCI+dWRkaTJfX2J1c2luZXNzRGV0YWlsPC9hPiAqdWRkaTJfX2J1c2luZXNzRGV0YWlsXyk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+T3BlcmF0aW9uICJfX3B1YjJfX3NhdmVfVVNDT1JFYnVzaW5lc3MiIG9mIHNlcnZpY2UgYmluZGluZyAiUHVibGlzaFNvYXAiLiAgPGEgaHJlZj0iI2E0MyI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E0NCI+X19wdWIyX19zYXZlX1VTQ09SRXNlcnZpY2U8L2E+ICg8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sIj51ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlPC9hPiAqdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZV8sIDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2RldGFpbC5odG1sIj51ZGRpMl9fc2VydmljZURldGFpbDwvYT4gKnVkZGkyX19zZXJ2aWNlRGV0YWlsXyk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+T3BlcmF0aW9uICJfX3B1YjJfX3NhdmVfVVNDT1JFc2VydmljZSIgb2Ygc2VydmljZSBiaW5kaW5nICJQdWJsaXNoU29hcCIuICA8YSBocmVmPSIjYTQ0Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQ1Ij5fX3B1YjJfX3NhdmVfVVNDT1JFdE1vZGVsPC9hPiAoPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCI+dWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsPC9hPiAqdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsXywgPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfZGV0YWlsLmh0bWwiPnVkZGkyX190TW9kZWxEZXRhaWw8L2E+ICp1ZGRpMl9fdE1vZGVsRGV0YWlsXyk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+T3BlcmF0aW9uICJfX3B1YjJfX3NhdmVfVVNDT1JFdE1vZGVsIiBvZiBzZXJ2aWNlIGJpbmRpbmcgIlB1Ymxpc2hTb2FwIi4gIDxhIGhyZWY9IiNhNDUiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNDYiPl9fcHViMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+ICg8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2V0X19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sIj51ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+ICp1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnNfLCA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCI+dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnM8L2E+ICp1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uc18pPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk9wZXJhdGlvbiAiX19wdWIyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyIgb2Ygc2VydmljZSBiaW5kaW5nICJQdWJsaXNoU29hcCIuICA8YSBocmVmPSIjYTQ2Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzxocj48aDI+VHlwZWRlZiBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMiIgZG94eXRhZz0idWRkaV92Mi5oOjp1ZGRpMl9fYmluZGluZ0tleSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB0eXBlZGVmIGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhMiI+dWRkaTJfX2JpbmRpbmdLZXk8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorU2NoZW1hICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpiaW5kaW5nS2V5IHNpbXBsZVR5cGUgcmVzdHJpY3Rpb24gb2YgeHM6c3RyaW5nLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMyIgZG94eXRhZz0idWRkaV92Mi5oOjp1ZGRpMl9fYnVzaW5lc3NLZXkiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdHlwZWRlZiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTMiPnVkZGkyX19idXNpbmVzc0tleTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitTY2hlbWEgInVybjp1ZGRpLW9yZzphcGlfdjIiOmJ1c2luZXNzS2V5IHNpbXBsZVR5cGUgcmVzdHJpY3Rpb24gb2YgeHM6c3RyaW5nLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNCIgZG94eXRhZz0idWRkaV92Mi5oOjp1ZGRpMl9fc2VydmljZUtleSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB0eXBlZGVmIGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNCI+dWRkaTJfX3NlcnZpY2VLZXk8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorU2NoZW1hICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpzZXJ2aWNlS2V5IHNpbXBsZVR5cGUgcmVzdHJpY3Rpb24gb2YgeHM6c3RyaW5nLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNSIgZG94eXRhZz0idWRkaV92Mi5oOjp1ZGRpMl9fdE1vZGVsS2V5IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHR5cGVkZWYgY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2E1Ij51ZGRpMl9fdE1vZGVsS2V5PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1NjaGVtYSAidXJuOnVkZGktb3JnOmFwaV92MiI6dE1vZGVsS2V5IHNpbXBsZVR5cGUgcmVzdHJpY3Rpb24gb2YgeHM6c3RyaW5nLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMSIgZG94eXRhZz0idWRkaV92Mi5oOjp4bWxfX2xhbmciID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdHlwZWRlZiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTEiPnhtbF9fbGFuZzwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitCdWlsdC1pbiBhdHRyaWJ1dGUgInhtbDpsYW5nIi4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTAiIGRveHl0YWc9InVkZGlfdjIuaDo6eHNkX19OTVRPS0VOIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHR5cGVkZWYgY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJ1ZGRpX192Ml84aC5odG1sI2EwIj54c2RfX05NVE9LRU48L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorUHJpbWl0aXZlIGJ1aWx0LWluIHR5cGUgInhzOk5NVE9LRU4iLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+PGgyPkVudW1lcmF0aW9uIFR5cGUgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTQ3IiBkb3h5dGFnPSJ1ZGRpX3YyLmg6OnVkZGkyX19kaXJlY3Rpb24iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gZW51bSA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQ3Ij51ZGRpMl9fZGlyZWN0aW9uPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1NjaGVtYSAidXJuOnVkZGktb3JnOmFwaV92MiI6ZGlyZWN0aW9uIHNpbXBsZVR5cGUgcmVzdHJpY3Rpb24gb2YgeHM6Tk1UT0tFTiBOb3RlOiBlbnVtIHZhbHVlcyBhcmUgcHJlZml4ZWQgd2l0aCAndWRkaTJfX2RpcmVjdGlvbicgdG8gYXZvaWQgbmFtZSBjbGFzaGVzLCBwbGVhc2UgdXNlIHdzZGwyaCBvcHRpb24gLWUgdG8gb21pdCB0aGlzIHByZWZpeC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPkVudW1lcmF0aW9uIHZhbHVlczogPC9iPjwvZHQ+PGRkPg0KKzx0YWJsZSBib3JkZXI9MCBjZWxsc3BhY2luZz0yIGNlbGxwYWRkaW5nPTA+DQorPHRyPjx0ZCB2YWxpZ249dG9wPjxlbT48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNDdhNiIgZG94eXRhZz0idWRkaTJfX2RpcmVjdGlvbl9fZnJvbUtleSIgPjwvYT51ZGRpMl9fZGlyZWN0aW9uX19mcm9tS2V5PC9lbT4mbmJzcDs8L3RkPjx0ZD4NCit4czpOTVRPS0VOIHZhbHVlPSJmcm9tS2V5IiA8L3RkPjwvdHI+DQorPHRyPjx0ZCB2YWxpZ249dG9wPjxlbT48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNDdhNyIgZG94eXRhZz0idWRkaTJfX2RpcmVjdGlvbl9fdG9LZXkiID48L2E+dWRkaTJfX2RpcmVjdGlvbl9fdG9LZXk8L2VtPiZuYnNwOzwvdGQ+PHRkPg0KK3hzOk5NVE9LRU4gdmFsdWU9InRvS2V5IiA8L3RkPjwvdHI+DQorPC90YWJsZT4NCis8L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE1MCIgZG94eXRhZz0idWRkaV92Mi5oOjp1ZGRpMl9fa2V5VHlwZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBlbnVtIDxhIGNsYXNzPSJlbCIgaHJlZj0idWRkaV9fdjJfOGguaHRtbCNhNTAiPnVkZGkyX19rZXlUeXBlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1NjaGVtYSAidXJuOnVkZGktb3JnOmFwaV92MiI6a2V5VHlwZSBzaW1wbGVUeXBlIHJlc3RyaWN0aW9uIG9mIHhzOk5NVE9LRU4gTm90ZTogZW51bSB2YWx1ZXMgYXJlIHByZWZpeGVkIHdpdGggJ3VkZGkyX19rZXlUeXBlJyB0byBhdm9pZCBuYW1lIGNsYXNoZXMsIHBsZWFzZSB1c2Ugd3NkbDJoIG9wdGlvbiAtZSB0byBvbWl0IHRoaXMgcHJlZml4LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+RW51bWVyYXRpb24gdmFsdWVzOiA8L2I+PC9kdD48ZGQ+DQorPHRhYmxlIGJvcmRlcj0wIGNlbGxzcGFjaW5nPTIgY2VsbHBhZGRpbmc9MD4NCis8dHI+PHRkIHZhbGlnbj10b3A+PGVtPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE1MGExNyIgZG94eXRhZz0idWRkaTJfX2tleVR5cGVfX2J1c2luZXNzS2V5IiA+PC9hPnVkZGkyX19rZXlUeXBlX19idXNpbmVzc0tleTwvZW0+Jm5ic3A7PC90ZD48dGQ+DQoreHM6Tk1UT0tFTiB2YWx1ZT0iYnVzaW5lc3NLZXkiIDwvdGQ+PC90cj4NCis8dHI+PHRkIHZhbGlnbj10b3A+PGVtPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE1MGExOCIgZG94eXRhZz0idWRkaTJfX2tleVR5cGVfX3RNb2RlbEtleSIgPjwvYT51ZGRpMl9fa2V5VHlwZV9fdE1vZGVsS2V5PC9lbT4mbmJzcDs8L3RkPjx0ZD4NCit4czpOTVRPS0VOIHZhbHVlPSJ0TW9kZWxLZXkiIDwvdGQ+PC90cj4NCis8dHI+PHRkIHZhbGlnbj10b3A+PGVtPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE1MGExOSIgZG94eXRhZz0idWRkaTJfX2tleVR5cGVfX3NlcnZpY2VLZXkiID48L2E+dWRkaTJfX2tleVR5cGVfX3NlcnZpY2VLZXk8L2VtPiZuYnNwOzwvdGQ+PHRkPg0KK3hzOk5NVE9LRU4gdmFsdWU9InNlcnZpY2VLZXkiIDwvdGQ+PC90cj4NCis8dHI+PHRkIHZhbGlnbj10b3A+PGVtPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE1MGEyMCIgZG94eXRhZz0idWRkaTJfX2tleVR5cGVfX2JpbmRpbmdLZXkiID48L2E+dWRkaTJfX2tleVR5cGVfX2JpbmRpbmdLZXk8L2VtPiZuYnNwOzwvdGQ+PHRkPg0KK3hzOk5NVE9LRU4gdmFsdWU9ImJpbmRpbmdLZXkiIDwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzwvZGw+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTQ4IiBkb3h5dGFnPSJ1ZGRpX3YyLmg6OnVkZGkyX190cnVuY2F0ZWQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gZW51bSA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQ4Ij51ZGRpMl9fdHJ1bmNhdGVkPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1NjaGVtYSAidXJuOnVkZGktb3JnOmFwaV92MiI6dHJ1bmNhdGVkIHNpbXBsZVR5cGUgcmVzdHJpY3Rpb24gb2YgeHM6Tk1UT0tFTiBOb3RlOiBlbnVtIHZhbHVlcyBhcmUgcHJlZml4ZWQgd2l0aCAndWRkaTJfX3RydW5jYXRlZCcgdG8gYXZvaWQgbmFtZSBjbGFzaGVzLCBwbGVhc2UgdXNlIHdzZGwyaCBvcHRpb24gLWUgdG8gb21pdCB0aGlzIHByZWZpeC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPkVudW1lcmF0aW9uIHZhbHVlczogPC9iPjwvZHQ+PGRkPg0KKzx0YWJsZSBib3JkZXI9MCBjZWxsc3BhY2luZz0yIGNlbGxwYWRkaW5nPTA+DQorPHRyPjx0ZCB2YWxpZ249dG9wPjxlbT48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNDhhOCIgZG94eXRhZz0idWRkaTJfX3RydW5jYXRlZF9fdHJ1ZV8iID48L2E+dWRkaTJfX3RydW5jYXRlZF9fdHJ1ZV88L2VtPiZuYnNwOzwvdGQ+PHRkPg0KK3hzOk5NVE9LRU4gdmFsdWU9InRydWUiIDwvdGQ+PC90cj4NCis8dHI+PHRkIHZhbGlnbj10b3A+PGVtPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE0OGE5IiBkb3h5dGFnPSJ1ZGRpMl9fdHJ1bmNhdGVkX19mYWxzZV8iID48L2E+dWRkaTJfX3RydW5jYXRlZF9fZmFsc2VfPC9lbT4mbmJzcDs8L3RkPjx0ZD4NCit4czpOTVRPS0VOIHZhbHVlPSJmYWxzZSIgPC90ZD48L3RyPg0KKzwvdGFibGU+DQorPC9kbD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNDkiIGRveHl0YWc9InVkZGlfdjIuaDo6dWRkaTJfX1VSTFR5cGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gZW51bSA8YSBjbGFzcz0iZWwiIGhyZWY9InVkZGlfX3YyXzhoLmh0bWwjYTQ5Ij51ZGRpMl9fVVJMVHlwZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitTY2hlbWEgInVybjp1ZGRpLW9yZzphcGlfdjIiOlVSTFR5cGUgc2ltcGxlVHlwZSByZXN0cmljdGlvbiBvZiB4czpOTVRPS0VOIE5vdGU6IGVudW0gdmFsdWVzIGFyZSBwcmVmaXhlZCB3aXRoICd1ZGRpMl9fVVJMVHlwZScgdG8gYXZvaWQgbmFtZSBjbGFzaGVzLCBwbGVhc2UgdXNlIHdzZGwyaCBvcHRpb24gLWUgdG8gb21pdCB0aGlzIHByZWZpeC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPkVudW1lcmF0aW9uIHZhbHVlczogPC9iPjwvZHQ+PGRkPg0KKzx0YWJsZSBib3JkZXI9MCBjZWxsc3BhY2luZz0yIGNlbGxwYWRkaW5nPTA+DQorPHRyPjx0ZCB2YWxpZ249dG9wPjxlbT48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNDlhMTAiIGRveHl0YWc9InVkZGkyX19VUkxUeXBlX19tYWlsdG8iID48L2E+dWRkaTJfX1VSTFR5cGVfX21haWx0bzwvZW0+Jm5ic3A7PC90ZD48dGQ+DQoreHM6Tk1UT0tFTiB2YWx1ZT0ibWFpbHRvIiA8L3RkPjwvdHI+DQorPHRyPjx0ZCB2YWxpZ249dG9wPjxlbT48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNDlhMTEiIGRveHl0YWc9InVkZGkyX19VUkxUeXBlX19odHRwIiA+PC9hPnVkZGkyX19VUkxUeXBlX19odHRwPC9lbT4mbmJzcDs8L3RkPjx0ZD4NCit4czpOTVRPS0VOIHZhbHVlPSJodHRwIiA8L3RkPjwvdHI+DQorPHRyPjx0ZCB2YWxpZ249dG9wPjxlbT48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNDlhMTIiIGRveHl0YWc9InVkZGkyX19VUkxUeXBlX19odHRwcyIgPjwvYT51ZGRpMl9fVVJMVHlwZV9faHR0cHM8L2VtPiZuYnNwOzwvdGQ+PHRkPg0KK3hzOk5NVE9LRU4gdmFsdWU9Imh0dHBzIiA8L3RkPjwvdHI+DQorPHRyPjx0ZCB2YWxpZ249dG9wPjxlbT48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNDlhMTMiIGRveHl0YWc9InVkZGkyX19VUkxUeXBlX19mdHAiID48L2E+dWRkaTJfX1VSTFR5cGVfX2Z0cDwvZW0+Jm5ic3A7PC90ZD48dGQ+DQoreHM6Tk1UT0tFTiB2YWx1ZT0iZnRwIiA8L3RkPjwvdHI+DQorPHRyPjx0ZCB2YWxpZ249dG9wPjxlbT48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNDlhMTQiIGRveHl0YWc9InVkZGkyX19VUkxUeXBlX19mYXgiID48L2E+dWRkaTJfX1VSTFR5cGVfX2ZheDwvZW0+Jm5ic3A7PC90ZD48dGQ+DQoreHM6Tk1UT0tFTiB2YWx1ZT0iZmF4IiA8L3RkPjwvdHI+DQorPHRyPjx0ZCB2YWxpZ249dG9wPjxlbT48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNDlhMTUiIGRveHl0YWc9InVkZGkyX19VUkxUeXBlX19waG9uZSIgPjwvYT51ZGRpMl9fVVJMVHlwZV9fcGhvbmU8L2VtPiZuYnNwOzwvdGQ+PHRkPg0KK3hzOk5NVE9LRU4gdmFsdWU9InBob25lIiA8L3RkPjwvdHI+DQorPHRyPjx0ZCB2YWxpZ249dG9wPjxlbT48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNDlhMTYiIGRveHl0YWc9InVkZGkyX19VUkxUeXBlX19vdGhlciIgPjwvYT51ZGRpMl9fVVJMVHlwZV9fb3RoZXI8L2VtPiZuYnNwOzwvdGQ+PHRkPg0KK3hzOk5NVE9LRU4gdmFsdWU9Im90aGVyIiA8L3RkPjwvdHI+DQorPC90YWJsZT4NCis8L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj48aDI+RnVuY3Rpb24gRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTIxIiBkb3h5dGFnPSJ1ZGRpX3YyLmg6Ol9faW5xMl9fZmluZF9VU0NPUkViaW5kaW5nIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBfX2lucTJfX2ZpbmRfVVNDT1JFYmluZGluZyAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwiPnVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmc8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+dWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZ188L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfZGV0YWlsLmh0bWwiPnVkZGkyX19iaW5kaW5nRGV0YWlsPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnVkZGkyX19iaW5kaW5nRGV0YWlsXzwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitPcGVyYXRpb24gIl9faW5xMl9fZmluZF9VU0NPUkViaW5kaW5nIiBvZiBzZXJ2aWNlIGJpbmRpbmcgIklucXVpcmVTb2FwIi4gDQorPHA+DQorT3BlcmF0aW9uIGRldGFpbHM6PHA+DQorPHVsPg0KKzxsaT5TT0FQIGRvY3VtZW50L2xpdGVyYWwgc3R5bGU8L2xpPjxsaT5TT0FQIGFjdGlvbj0iZmluZF9iaW5kaW5nIjwvbGk+PGxpPlNPQVAgRmF1bHQ6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3NfX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sIj5fZGlzcG9zaXRpb25SZXBvcnQ8L2E+PC9saT48L3VsPg0KKzxwPg0KK0Mgc3R1YiBmdW5jdGlvbiAoZGVmaW5lZCBpbiBzb2FwQ2xpZW50LmNbcHBdKTogPGRpdiBjbGFzcz0iZnJhZ21lbnQiPjxwcmU+ICA8c3BhbiBjbGFzcz0ia2V5d29yZHR5cGUiPmludDwvc3Bhbj4gc29hcF9jYWxsX19faW5xMl9fZmluZF9VU0NPUkViaW5kaW5nKDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5zdHJ1Y3Q8L3NwYW4+IHNvYXAgKnNvYXAsDQorICAgIE5VTEwsIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBjaGFyICplbmRwb2ludCA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGVuZHBvaW50IGZvciB0aGlzIG9wZXJhdGlvbjwvc3Bhbj4NCisgICAgTlVMTCwgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIGNoYXIgKmFjdGlvbiA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGFjdGlvbiBmb3IgdGhpcyBvcGVyYXRpb248L3NwYW4+DQorICAgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyByZXF1ZXN0IHBhcmFtZXRlcnM6PC9zcGFuPg0KKyAgICA8YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwiPnVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmc8L2E+KiAgICAgICAgICB1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nXywNCisgICAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIHJlc3BvbnNlIHBhcmFtZXRlcnM6PC9zcGFuPg0KKyAgICA8YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX2RldGFpbC5odG1sIj51ZGRpMl9fYmluZGluZ0RldGFpbDwvYT4qICAgICAgICAgICAgICAgdWRkaTJfX2JpbmRpbmdEZXRhaWxfDQorICApOw0KKzwvcHJlPjwvZGl2PjxwPg0KK0MrKyBwcm94eSBjbGFzcyAoZGVmaW5lZCBpbiBzb2FwSW5xdWlyZVNvYXBQcm94eS5oKTogY2xhc3MgSW5xdWlyZVNvYXA7IDxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOiA8L2I+PC9kdD48ZGQ+DQorPHRhYmxlIGJvcmRlcj0wIGNlbGxzcGFjaW5nPTIgY2VsbHBhZGRpbmc9MD4NCis8dHI+PHRkIHZhbGlnbj10b3A+PGVtPnVkZGkyX19iaW5kaW5nRGV0YWlsXzwvZW0+Jm5ic3A7PC90ZD48dGQ+DQorcmVzcG9uc2UgcGFyYW1ldGVyIDwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzwvZGw+ICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTIyIiBkb3h5dGFnPSJ1ZGRpX3YyLmg6Ol9faW5xMl9fZmluZF9VU0NPUkVidXNpbmVzcyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgX19pbnEyX19maW5kX1VTQ09SRWJ1c2luZXNzICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwiPnVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzXzwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfbGlzdC5odG1sIj51ZGRpMl9fYnVzaW5lc3NMaXN0PC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnVkZGkyX19idXNpbmVzc0xpc3RfPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK09wZXJhdGlvbiAiX19pbnEyX19maW5kX1VTQ09SRWJ1c2luZXNzIiBvZiBzZXJ2aWNlIGJpbmRpbmcgIklucXVpcmVTb2FwIi4gDQorPHA+DQorT3BlcmF0aW9uIGRldGFpbHM6PHA+DQorPHVsPg0KKzxsaT5TT0FQIGRvY3VtZW50L2xpdGVyYWwgc3R5bGU8L2xpPjxsaT5TT0FQIGFjdGlvbj0iZmluZF9idXNpbmVzcyI8L2xpPjxsaT5TT0FQIEZhdWx0OiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCI+X2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPjwvbGk+PC91bD4NCis8cD4NCitDIHN0dWIgZnVuY3Rpb24gKGRlZmluZWQgaW4gc29hcENsaWVudC5jW3BwXSk6IDxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPiAgPHNwYW4gY2xhc3M9ImtleXdvcmR0eXBlIj5pbnQ8L3NwYW4+IHNvYXBfY2FsbF9fX2lucTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MoPHNwYW4gY2xhc3M9ImtleXdvcmQiPnN0cnVjdDwvc3Bhbj4gc29hcCAqc29hcCwNCisgICAgTlVMTCwgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIGNoYXIgKmVuZHBvaW50ID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgZW5kcG9pbnQgZm9yIHRoaXMgb3BlcmF0aW9uPC9zcGFuPg0KKyAgICBOVUxMLCA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gY2hhciAqYWN0aW9uID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgYWN0aW9uIGZvciB0aGlzIG9wZXJhdGlvbjwvc3Bhbj4NCisgICAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIHJlcXVlc3QgcGFyYW1ldGVyczo8L3NwYW4+DQorICAgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwiPnVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzPC9hPiogICAgICAgICB1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzc18sDQorICAgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyByZXNwb25zZSBwYXJhbWV0ZXJzOjwvc3Bhbj4NCisgICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfbGlzdC5odG1sIj51ZGRpMl9fYnVzaW5lc3NMaXN0PC9hPiogICAgICAgICAgICAgICAgdWRkaTJfX2J1c2luZXNzTGlzdF8NCisgICk7DQorPC9wcmU+PC9kaXY+PHA+DQorQysrIHByb3h5IGNsYXNzIChkZWZpbmVkIGluIHNvYXBJbnF1aXJlU29hcFByb3h5LmgpOiBjbGFzcyBJbnF1aXJlU29hcDsgPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6IDwvYj48L2R0PjxkZD4NCis8dGFibGUgYm9yZGVyPTAgY2VsbHNwYWNpbmc9MiBjZWxscGFkZGluZz0wPg0KKzx0cj48dGQgdmFsaWduPXRvcD48ZW0+dWRkaTJfX2J1c2luZXNzTGlzdF88L2VtPiZuYnNwOzwvdGQ+PHRkPg0KK3Jlc3BvbnNlIHBhcmFtZXRlciA8L3RkPjwvdHI+DQorPC90YWJsZT4NCis8L2RsPiAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEyMyIgZG94eXRhZz0idWRkaV92Mi5oOjpfX2lucTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IF9faW5xMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19maW5kX19fdV9zX2Nfb19yX2VyZWxhdGVkX2J1c2luZXNzZXMuaHRtbCI+dWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXM8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+dWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXNfPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzZXNfbGlzdC5odG1sIj51ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0PC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3RfPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK09wZXJhdGlvbiAiX19pbnEyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzIiBvZiBzZXJ2aWNlIGJpbmRpbmcgIklucXVpcmVTb2FwIi4gDQorPHA+DQorT3BlcmF0aW9uIGRldGFpbHM6PHA+DQorPHVsPg0KKzxsaT5TT0FQIGRvY3VtZW50L2xpdGVyYWwgc3R5bGU8L2xpPjxsaT5TT0FQIGFjdGlvbj0iZmluZF9yZWxhdGVkQnVzaW5lc3NlcyI8L2xpPjxsaT5TT0FQIEZhdWx0OiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCI+X2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPjwvbGk+PC91bD4NCis8cD4NCitDIHN0dWIgZnVuY3Rpb24gKGRlZmluZWQgaW4gc29hcENsaWVudC5jW3BwXSk6IDxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPiAgPHNwYW4gY2xhc3M9ImtleXdvcmR0eXBlIj5pbnQ8L3NwYW4+IHNvYXBfY2FsbF9fX2lucTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMoPHNwYW4gY2xhc3M9ImtleXdvcmQiPnN0cnVjdDwvc3Bhbj4gc29hcCAqc29hcCwNCisgICAgTlVMTCwgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIGNoYXIgKmVuZHBvaW50ID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgZW5kcG9pbnQgZm9yIHRoaXMgb3BlcmF0aW9uPC9zcGFuPg0KKyAgICBOVUxMLCA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gY2hhciAqYWN0aW9uID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgYWN0aW9uIGZvciB0aGlzIG9wZXJhdGlvbjwvc3Bhbj4NCisgICAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIHJlcXVlc3QgcGFyYW1ldGVyczo8L3NwYW4+DQorICAgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXJlbGF0ZWRfYnVzaW5lc3Nlcy5odG1sIj51ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlczwvYT4qIHVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzXywNCisgICAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIHJlc3BvbnNlIHBhcmFtZXRlcnM6PC9zcGFuPg0KKyAgICA8YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWxhdGVkX2J1c2luZXNzZXNfbGlzdC5odG1sIj51ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0PC9hPiogICAgICAgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdF8NCisgICk7DQorPC9wcmU+PC9kaXY+PHA+DQorQysrIHByb3h5IGNsYXNzIChkZWZpbmVkIGluIHNvYXBJbnF1aXJlU29hcFByb3h5LmgpOiBjbGFzcyBJbnF1aXJlU29hcDsgPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6IDwvYj48L2R0PjxkZD4NCis8dGFibGUgYm9yZGVyPTAgY2VsbHNwYWNpbmc9MiBjZWxscGFkZGluZz0wPg0KKzx0cj48dGQgdmFsaWduPXRvcD48ZW0+dWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdF88L2VtPiZuYnNwOzwvdGQ+PHRkPg0KK3Jlc3BvbnNlIHBhcmFtZXRlciA8L3RkPjwvdHI+DQorPC90YWJsZT4NCis8L2RsPiAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEyNCIgZG94eXRhZz0idWRkaV92Mi5oOjpfX2lucTJfX2ZpbmRfVVNDT1JFc2VydmljZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgX19pbnEyX19maW5kX1VTQ09SRXNlcnZpY2UgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sIj51ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2VfPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2xpc3QuaHRtbCI+dWRkaTJfX3NlcnZpY2VMaXN0PC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnVkZGkyX19zZXJ2aWNlTGlzdF88L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorT3BlcmF0aW9uICJfX2lucTJfX2ZpbmRfVVNDT1JFc2VydmljZSIgb2Ygc2VydmljZSBiaW5kaW5nICJJbnF1aXJlU29hcCIuIA0KKzxwPg0KK09wZXJhdGlvbiBkZXRhaWxzOjxwPg0KKzx1bD4NCis8bGk+U09BUCBkb2N1bWVudC9saXRlcmFsIHN0eWxlPC9saT48bGk+U09BUCBhY3Rpb249ImZpbmRfc2VydmljZSI8L2xpPjxsaT5TT0FQIEZhdWx0OiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCI+X2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPjwvbGk+PC91bD4NCis8cD4NCitDIHN0dWIgZnVuY3Rpb24gKGRlZmluZWQgaW4gc29hcENsaWVudC5jW3BwXSk6IDxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPiAgPHNwYW4gY2xhc3M9ImtleXdvcmR0eXBlIj5pbnQ8L3NwYW4+IHNvYXBfY2FsbF9fX2lucTJfX2ZpbmRfVVNDT1JFc2VydmljZSg8c3BhbiBjbGFzcz0ia2V5d29yZCI+c3RydWN0PC9zcGFuPiBzb2FwICpzb2FwLA0KKyAgICBOVUxMLCA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gY2hhciAqZW5kcG9pbnQgPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBlbmRwb2ludCBmb3IgdGhpcyBvcGVyYXRpb248L3NwYW4+DQorICAgIE5VTEwsIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBjaGFyICphY3Rpb24gPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBhY3Rpb24gZm9yIHRoaXMgb3BlcmF0aW9uPC9zcGFuPg0KKyAgICA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gcmVxdWVzdCBwYXJhbWV0ZXJzOjwvc3Bhbj4NCisgICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sIj51ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlPC9hPiogICAgICAgICAgdWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZV8sDQorICAgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyByZXNwb25zZSBwYXJhbWV0ZXJzOjwvc3Bhbj4NCisgICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9saXN0Lmh0bWwiPnVkZGkyX19zZXJ2aWNlTGlzdDwvYT4qICAgICAgICAgICAgICAgICB1ZGRpMl9fc2VydmljZUxpc3RfDQorICApOw0KKzwvcHJlPjwvZGl2PjxwPg0KK0MrKyBwcm94eSBjbGFzcyAoZGVmaW5lZCBpbiBzb2FwSW5xdWlyZVNvYXBQcm94eS5oKTogY2xhc3MgSW5xdWlyZVNvYXA7IDxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOiA8L2I+PC9kdD48ZGQ+DQorPHRhYmxlIGJvcmRlcj0wIGNlbGxzcGFjaW5nPTIgY2VsbHBhZGRpbmc9MD4NCis8dHI+PHRkIHZhbGlnbj10b3A+PGVtPnVkZGkyX19zZXJ2aWNlTGlzdF88L2VtPiZuYnNwOzwvdGQ+PHRkPg0KK3Jlc3BvbnNlIHBhcmFtZXRlciA8L3RkPjwvdHI+DQorPC90YWJsZT4NCis8L2RsPiAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEyNSIgZG94eXRhZz0idWRkaV92Mi5oOjpfX2lucTJfX2ZpbmRfVVNDT1JFdE1vZGVsIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBfX2lucTJfX2ZpbmRfVVNDT1JFdE1vZGVsICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2ZpbmRfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCI+dWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnVkZGkyX19maW5kX1VTQ09SRXRNb2RlbF88L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfbGlzdC5odG1sIj51ZGRpMl9fdE1vZGVsTGlzdDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT51ZGRpMl9fdE1vZGVsTGlzdF88L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorT3BlcmF0aW9uICJfX2lucTJfX2ZpbmRfVVNDT1JFdE1vZGVsIiBvZiBzZXJ2aWNlIGJpbmRpbmcgIklucXVpcmVTb2FwIi4gDQorPHA+DQorT3BlcmF0aW9uIGRldGFpbHM6PHA+DQorPHVsPg0KKzxsaT5TT0FQIGRvY3VtZW50L2xpdGVyYWwgc3R5bGU8L2xpPjxsaT5TT0FQIGFjdGlvbj0iZmluZF90TW9kZWwiPC9saT48bGk+U09BUCBGYXVsdDogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwiPl9kaXNwb3NpdGlvblJlcG9ydDwvYT48L2xpPjwvdWw+DQorPHA+DQorQyBzdHViIGZ1bmN0aW9uIChkZWZpbmVkIGluIHNvYXBDbGllbnQuY1twcF0pOiA8ZGl2IGNsYXNzPSJmcmFnbWVudCI+PHByZT4gIDxzcGFuIGNsYXNzPSJrZXl3b3JkdHlwZSI+aW50PC9zcGFuPiBzb2FwX2NhbGxfX19pbnEyX19maW5kX1VTQ09SRXRNb2RlbCg8c3BhbiBjbGFzcz0ia2V5d29yZCI+c3RydWN0PC9zcGFuPiBzb2FwICpzb2FwLA0KKyAgICBOVUxMLCA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gY2hhciAqZW5kcG9pbnQgPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBlbmRwb2ludCBmb3IgdGhpcyBvcGVyYXRpb248L3NwYW4+DQorICAgIE5VTEwsIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBjaGFyICphY3Rpb24gPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBhY3Rpb24gZm9yIHRoaXMgb3BlcmF0aW9uPC9zcGFuPg0KKyAgICA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gcmVxdWVzdCBwYXJhbWV0ZXJzOjwvc3Bhbj4NCisgICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fZmluZF9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sIj51ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWw8L2E+KiAgICAgICAgICAgdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsXywNCisgICAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIHJlc3BvbnNlIHBhcmFtZXRlcnM6PC9zcGFuPg0KKyAgICA8YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2xpc3QuaHRtbCI+dWRkaTJfX3RNb2RlbExpc3Q8L2E+KiAgICAgICAgICAgICAgICAgIHVkZGkyX190TW9kZWxMaXN0Xw0KKyAgKTsNCis8L3ByZT48L2Rpdj48cD4NCitDKysgcHJveHkgY2xhc3MgKGRlZmluZWQgaW4gc29hcElucXVpcmVTb2FwUHJveHkuaCk6IGNsYXNzIElucXVpcmVTb2FwOyA8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczogPC9iPjwvZHQ+PGRkPg0KKzx0YWJsZSBib3JkZXI9MCBjZWxsc3BhY2luZz0yIGNlbGxwYWRkaW5nPTA+DQorPHRyPjx0ZCB2YWxpZ249dG9wPjxlbT51ZGRpMl9fdE1vZGVsTGlzdF88L2VtPiZuYnNwOzwvdGQ+PHRkPg0KK3Jlc3BvbnNlIHBhcmFtZXRlciA8L3RkPjwvdHI+DQorPC90YWJsZT4NCis8L2RsPiAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEyNiIgZG94eXRhZz0idWRkaV92Mi5oOjpfX2lucTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBfX2lucTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYmluZGluZ19kZXRhaWwuaHRtbCI+dWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbF88L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfZGV0YWlsLmh0bWwiPnVkZGkyX19iaW5kaW5nRGV0YWlsPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnVkZGkyX19iaW5kaW5nRGV0YWlsXzwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitPcGVyYXRpb24gIl9faW5xMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwiIG9mIHNlcnZpY2UgYmluZGluZyAiSW5xdWlyZVNvYXAiLiANCis8cD4NCitPcGVyYXRpb24gZGV0YWlsczo8cD4NCis8dWw+DQorPGxpPlNPQVAgZG9jdW1lbnQvbGl0ZXJhbCBzdHlsZTwvbGk+PGxpPlNPQVAgYWN0aW9uPSJnZXRfYmluZGluZ0RldGFpbCI8L2xpPjxsaT5TT0FQIEZhdWx0OiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCI+X2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPjwvbGk+PC91bD4NCis8cD4NCitDIHN0dWIgZnVuY3Rpb24gKGRlZmluZWQgaW4gc29hcENsaWVudC5jW3BwXSk6IDxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPiAgPHNwYW4gY2xhc3M9ImtleXdvcmR0eXBlIj5pbnQ8L3NwYW4+IHNvYXBfY2FsbF9fX2lucTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsKDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5zdHJ1Y3Q8L3NwYW4+IHNvYXAgKnNvYXAsDQorICAgIE5VTEwsIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBjaGFyICplbmRwb2ludCA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGVuZHBvaW50IGZvciB0aGlzIG9wZXJhdGlvbjwvc3Bhbj4NCisgICAgTlVMTCwgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIGNoYXIgKmFjdGlvbiA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGFjdGlvbiBmb3IgdGhpcyBvcGVyYXRpb248L3NwYW4+DQorICAgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyByZXF1ZXN0IHBhcmFtZXRlcnM6PC9zcGFuPg0KKyAgICA8YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJpbmRpbmdfZGV0YWlsLmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbDwvYT4qICAgICB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWxfLA0KKyAgICA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gcmVzcG9uc2UgcGFyYW1ldGVyczo8L3NwYW4+DQorICAgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfZGV0YWlsLmh0bWwiPnVkZGkyX19iaW5kaW5nRGV0YWlsPC9hPiogICAgICAgICAgICAgICB1ZGRpMl9fYmluZGluZ0RldGFpbF8NCisgICk7DQorPC9wcmU+PC9kaXY+PHA+DQorQysrIHByb3h5IGNsYXNzIChkZWZpbmVkIGluIHNvYXBJbnF1aXJlU29hcFByb3h5LmgpOiBjbGFzcyBJbnF1aXJlU29hcDsgPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6IDwvYj48L2R0PjxkZD4NCis8dGFibGUgYm9yZGVyPTAgY2VsbHNwYWNpbmc9MiBjZWxscGFkZGluZz0wPg0KKzx0cj48dGQgdmFsaWduPXRvcD48ZW0+dWRkaTJfX2JpbmRpbmdEZXRhaWxfPC9lbT4mbmJzcDs8L3RkPjx0ZD4NCityZXNwb25zZSBwYXJhbWV0ZXIgPC90ZD48L3RyPg0KKzwvdGFibGU+DQorPC9kbD4gICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMjciIGRveHl0YWc9InVkZGlfdjIuaDo6X19pbnEyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IF9faW5xMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lYnVzaW5lc3NfZGV0YWlsLmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWw8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbF88L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2RldGFpbC5odG1sIj51ZGRpMl9fYnVzaW5lc3NEZXRhaWw8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+dWRkaTJfX2J1c2luZXNzRGV0YWlsXzwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitPcGVyYXRpb24gIl9faW5xMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsIiBvZiBzZXJ2aWNlIGJpbmRpbmcgIklucXVpcmVTb2FwIi4gDQorPHA+DQorT3BlcmF0aW9uIGRldGFpbHM6PHA+DQorPHVsPg0KKzxsaT5TT0FQIGRvY3VtZW50L2xpdGVyYWwgc3R5bGU8L2xpPjxsaT5TT0FQIGFjdGlvbj0iZ2V0X2J1c2luZXNzRGV0YWlsIjwvbGk+PGxpPlNPQVAgRmF1bHQ6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3NfX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sIj5fZGlzcG9zaXRpb25SZXBvcnQ8L2E+PC9saT48L3VsPg0KKzxwPg0KK0Mgc3R1YiBmdW5jdGlvbiAoZGVmaW5lZCBpbiBzb2FwQ2xpZW50LmNbcHBdKTogPGRpdiBjbGFzcz0iZnJhZ21lbnQiPjxwcmU+ICA8c3BhbiBjbGFzcz0ia2V5d29yZHR5cGUiPmludDwvc3Bhbj4gc29hcF9jYWxsX19faW5xMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsKDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5zdHJ1Y3Q8L3NwYW4+IHNvYXAgKnNvYXAsDQorICAgIE5VTEwsIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBjaGFyICplbmRwb2ludCA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGVuZHBvaW50IGZvciB0aGlzIG9wZXJhdGlvbjwvc3Bhbj4NCisgICAgTlVMTCwgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIGNoYXIgKmFjdGlvbiA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGFjdGlvbiBmb3IgdGhpcyBvcGVyYXRpb248L3NwYW4+DQorICAgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyByZXF1ZXN0IHBhcmFtZXRlcnM6PC9zcGFuPg0KKyAgICA8YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWJ1c2luZXNzX2RldGFpbC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsPC9hPiogICAgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbF8sDQorICAgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyByZXNwb25zZSBwYXJhbWV0ZXJzOjwvc3Bhbj4NCisgICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsLmh0bWwiPnVkZGkyX19idXNpbmVzc0RldGFpbDwvYT4qICAgICAgICAgICAgICB1ZGRpMl9fYnVzaW5lc3NEZXRhaWxfDQorICApOw0KKzwvcHJlPjwvZGl2PjxwPg0KK0MrKyBwcm94eSBjbGFzcyAoZGVmaW5lZCBpbiBzb2FwSW5xdWlyZVNvYXBQcm94eS5oKTogY2xhc3MgSW5xdWlyZVNvYXA7IDxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOiA8L2I+PC9kdD48ZGQ+DQorPHRhYmxlIGJvcmRlcj0wIGNlbGxzcGFjaW5nPTIgY2VsbHBhZGRpbmc9MD4NCis8dHI+PHRkIHZhbGlnbj10b3A+PGVtPnVkZGkyX19idXNpbmVzc0RldGFpbF88L2VtPiZuYnNwOzwvdGQ+PHRkPg0KK3Jlc3BvbnNlIHBhcmFtZXRlciA8L3RkPjwvdHI+DQorPC90YWJsZT4NCis8L2RsPiAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEyOCIgZG94eXRhZz0idWRkaV92Mi5oOjpfX2lucTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgX19pbnEyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VidXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQ8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dF88L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2J1c2luZXNzX2RldGFpbF9leHQuaHRtbCI+dWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0PC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnVkZGkyX19idXNpbmVzc0RldGFpbEV4dF88L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorT3BlcmF0aW9uICJfX2lucTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dCIgb2Ygc2VydmljZSBiaW5kaW5nICJJbnF1aXJlU29hcCIuIA0KKzxwPg0KK09wZXJhdGlvbiBkZXRhaWxzOjxwPg0KKzx1bD4NCis8bGk+U09BUCBkb2N1bWVudC9saXRlcmFsIHN0eWxlPC9saT48bGk+U09BUCBhY3Rpb249ImdldF9idXNpbmVzc0RldGFpbEV4dCI8L2xpPjxsaT5TT0FQIEZhdWx0OiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCI+X2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPjwvbGk+PC91bD4NCis8cD4NCitDIHN0dWIgZnVuY3Rpb24gKGRlZmluZWQgaW4gc29hcENsaWVudC5jW3BwXSk6IDxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPiAgPHNwYW4gY2xhc3M9ImtleXdvcmR0eXBlIj5pbnQ8L3NwYW4+IHNvYXBfY2FsbF9fX2lucTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dCg8c3BhbiBjbGFzcz0ia2V5d29yZCI+c3RydWN0PC9zcGFuPiBzb2FwICpzb2FwLA0KKyAgICBOVUxMLCA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gY2hhciAqZW5kcG9pbnQgPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBlbmRwb2ludCBmb3IgdGhpcyBvcGVyYXRpb248L3NwYW4+DQorICAgIE5VTEwsIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBjaGFyICphY3Rpb24gPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBhY3Rpb24gZm9yIHRoaXMgb3BlcmF0aW9uPC9zcGFuPg0KKyAgICA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gcmVxdWVzdCBwYXJhbWV0ZXJzOjwvc3Bhbj4NCisgICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VidXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQ8L2E+KiB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0XywNCisgICAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIHJlc3BvbnNlIHBhcmFtZXRlcnM6PC9zcGFuPg0KKyAgICA8YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19idXNpbmVzc19kZXRhaWxfZXh0Lmh0bWwiPnVkZGkyX19idXNpbmVzc0RldGFpbEV4dDwvYT4qICAgICAgICAgICB1ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHRfDQorICApOw0KKzwvcHJlPjwvZGl2PjxwPg0KK0MrKyBwcm94eSBjbGFzcyAoZGVmaW5lZCBpbiBzb2FwSW5xdWlyZVNvYXBQcm94eS5oKTogY2xhc3MgSW5xdWlyZVNvYXA7IDxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOiA8L2I+PC9kdD48ZGQ+DQorPHRhYmxlIGJvcmRlcj0wIGNlbGxzcGFjaW5nPTIgY2VsbHBhZGRpbmc9MD4NCis8dHI+PHRkIHZhbGlnbj10b3A+PGVtPnVkZGkyX19idXNpbmVzc0RldGFpbEV4dF88L2VtPiZuYnNwOzwvdGQ+PHRkPg0KK3Jlc3BvbnNlIHBhcmFtZXRlciA8L3RkPjwvdHI+DQorPC90YWJsZT4NCis8L2RsPiAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEyOSIgZG94eXRhZz0idWRkaV92Mi5oOjpfX2lucTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBfX2lucTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lc2VydmljZV9kZXRhaWwuaHRtbCI+dWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbF88L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfZGV0YWlsLmh0bWwiPnVkZGkyX19zZXJ2aWNlRGV0YWlsPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnVkZGkyX19zZXJ2aWNlRGV0YWlsXzwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitPcGVyYXRpb24gIl9faW5xMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwiIG9mIHNlcnZpY2UgYmluZGluZyAiSW5xdWlyZVNvYXAiLiANCis8cD4NCitPcGVyYXRpb24gZGV0YWlsczo8cD4NCis8dWw+DQorPGxpPlNPQVAgZG9jdW1lbnQvbGl0ZXJhbCBzdHlsZTwvbGk+PGxpPlNPQVAgYWN0aW9uPSJnZXRfc2VydmljZURldGFpbCI8L2xpPjxsaT5TT0FQIEZhdWx0OiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCI+X2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPjwvbGk+PC91bD4NCis8cD4NCitDIHN0dWIgZnVuY3Rpb24gKGRlZmluZWQgaW4gc29hcENsaWVudC5jW3BwXSk6IDxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPiAgPHNwYW4gY2xhc3M9ImtleXdvcmR0eXBlIj5pbnQ8L3NwYW4+IHNvYXBfY2FsbF9fX2lucTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsKDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5zdHJ1Y3Q8L3NwYW4+IHNvYXAgKnNvYXAsDQorICAgIE5VTEwsIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBjaGFyICplbmRwb2ludCA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGVuZHBvaW50IGZvciB0aGlzIG9wZXJhdGlvbjwvc3Bhbj4NCisgICAgTlVMTCwgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIGNoYXIgKmFjdGlvbiA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGFjdGlvbiBmb3IgdGhpcyBvcGVyYXRpb248L3NwYW4+DQorICAgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyByZXF1ZXN0IHBhcmFtZXRlcnM6PC9zcGFuPg0KKyAgICA8YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXNlcnZpY2VfZGV0YWlsLmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbDwvYT4qICAgICB1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWxfLA0KKyAgICA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gcmVzcG9uc2UgcGFyYW1ldGVyczo8L3NwYW4+DQorICAgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX3NlcnZpY2VfZGV0YWlsLmh0bWwiPnVkZGkyX19zZXJ2aWNlRGV0YWlsPC9hPiogICAgICAgICAgICAgICB1ZGRpMl9fc2VydmljZURldGFpbF8NCisgICk7DQorPC9wcmU+PC9kaXY+PHA+DQorQysrIHByb3h5IGNsYXNzIChkZWZpbmVkIGluIHNvYXBJbnF1aXJlU29hcFByb3h5LmgpOiBjbGFzcyBJbnF1aXJlU29hcDsgPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6IDwvYj48L2R0PjxkZD4NCis8dGFibGUgYm9yZGVyPTAgY2VsbHNwYWNpbmc9MiBjZWxscGFkZGluZz0wPg0KKzx0cj48dGQgdmFsaWduPXRvcD48ZW0+dWRkaTJfX3NlcnZpY2VEZXRhaWxfPC9lbT4mbmJzcDs8L3RkPjx0ZD4NCityZXNwb25zZSBwYXJhbWV0ZXIgPC90ZD48L3RyPg0KKzwvdGFibGU+DQorPC9kbD4gICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMzAiIGRveHl0YWc9InVkZGlfdjIuaDo6X19pbnEyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBfX2lucTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2V0X21vZGVsX2RldGFpbC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT51ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbF88L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfZGV0YWlsLmh0bWwiPnVkZGkyX190TW9kZWxEZXRhaWw8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+dWRkaTJfX3RNb2RlbERldGFpbF88L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorT3BlcmF0aW9uICJfX2lucTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwiIG9mIHNlcnZpY2UgYmluZGluZyAiSW5xdWlyZVNvYXAiLiANCis8cD4NCitPcGVyYXRpb24gZGV0YWlsczo8cD4NCis8dWw+DQorPGxpPlNPQVAgZG9jdW1lbnQvbGl0ZXJhbCBzdHlsZTwvbGk+PGxpPlNPQVAgYWN0aW9uPSJnZXRfdE1vZGVsRGV0YWlsIjwvbGk+PGxpPlNPQVAgRmF1bHQ6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3NfX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sIj5fZGlzcG9zaXRpb25SZXBvcnQ8L2E+PC9saT48L3VsPg0KKzxwPg0KK0Mgc3R1YiBmdW5jdGlvbiAoZGVmaW5lZCBpbiBzb2FwQ2xpZW50LmNbcHBdKTogPGRpdiBjbGFzcz0iZnJhZ21lbnQiPjxwcmU+ICA8c3BhbiBjbGFzcz0ia2V5d29yZHR5cGUiPmludDwvc3Bhbj4gc29hcF9jYWxsX19faW5xMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbCg8c3BhbiBjbGFzcz0ia2V5d29yZCI+c3RydWN0PC9zcGFuPiBzb2FwICpzb2FwLA0KKyAgICBOVUxMLCA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gY2hhciAqZW5kcG9pbnQgPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBlbmRwb2ludCBmb3IgdGhpcyBvcGVyYXRpb248L3NwYW4+DQorICAgIE5VTEwsIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBjaGFyICphY3Rpb24gPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBhY3Rpb24gZm9yIHRoaXMgb3BlcmF0aW9uPC9zcGFuPg0KKyAgICA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gcmVxdWVzdCBwYXJhbWV0ZXJzOjwvc3Bhbj4NCisgICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2V0X21vZGVsX2RldGFpbC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbDwvYT4qICAgICAgdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWxfLA0KKyAgICA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gcmVzcG9uc2UgcGFyYW1ldGVyczo8L3NwYW4+DQorICAgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfZGV0YWlsLmh0bWwiPnVkZGkyX190TW9kZWxEZXRhaWw8L2E+KiAgICAgICAgICAgICAgICB1ZGRpMl9fdE1vZGVsRGV0YWlsXw0KKyAgKTsNCis8L3ByZT48L2Rpdj48cD4NCitDKysgcHJveHkgY2xhc3MgKGRlZmluZWQgaW4gc29hcElucXVpcmVTb2FwUHJveHkuaCk6IGNsYXNzIElucXVpcmVTb2FwOyA8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczogPC9iPjwvZHQ+PGRkPg0KKzx0YWJsZSBib3JkZXI9MCBjZWxsc3BhY2luZz0yIGNlbGxwYWRkaW5nPTA+DQorPHRyPjx0ZCB2YWxpZ249dG9wPjxlbT51ZGRpMl9fdE1vZGVsRGV0YWlsXzwvZW0+Jm5ic3A7PC90ZD48dGQ+DQorcmVzcG9uc2UgcGFyYW1ldGVyIDwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzwvZGw+ICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTMxIiBkb3h5dGFnPSJ1ZGRpX3YyLmg6Ol9fcHViMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IF9fcHViMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYWRkX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sIj51ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+dWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zXzwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwiPnVkZGkyX19kaXNwb3NpdGlvblJlcG9ydDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnRfPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK09wZXJhdGlvbiAiX19wdWIyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyIgb2Ygc2VydmljZSBiaW5kaW5nICJQdWJsaXNoU29hcCIuIA0KKzxwPg0KK09wZXJhdGlvbiBkZXRhaWxzOjxwPg0KKzx1bD4NCis8bGk+U09BUCBkb2N1bWVudC9saXRlcmFsIHN0eWxlPC9saT48bGk+U09BUCBhY3Rpb249ImFkZF9wdWJsaXNoZXJBc3NlcnRpb25zIjwvbGk+PGxpPlNPQVAgRmF1bHQ6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3NfX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sIj5fZGlzcG9zaXRpb25SZXBvcnQ8L2E+PC9saT48L3VsPg0KKzxwPg0KK0Mgc3R1YiBmdW5jdGlvbiAoZGVmaW5lZCBpbiBzb2FwQ2xpZW50LmNbcHBdKTogPGRpdiBjbGFzcz0iZnJhZ21lbnQiPjxwcmU+ICA8c3BhbiBjbGFzcz0ia2V5d29yZHR5cGUiPmludDwvc3Bhbj4gc29hcF9jYWxsX19fcHViMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoPHNwYW4gY2xhc3M9ImtleXdvcmQiPnN0cnVjdDwvc3Bhbj4gc29hcCAqc29hcCwNCisgICAgTlVMTCwgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIGNoYXIgKmVuZHBvaW50ID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgZW5kcG9pbnQgZm9yIHRoaXMgb3BlcmF0aW9uPC9zcGFuPg0KKyAgICBOVUxMLCA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gY2hhciAqYWN0aW9uID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgYWN0aW9uIGZvciB0aGlzIG9wZXJhdGlvbjwvc3Bhbj4NCisgICAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIHJlcXVlc3QgcGFyYW1ldGVyczo8L3NwYW4+DQorICAgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX2FkZF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCI+dWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPiogdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zXywNCisgICAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIHJlc3BvbnNlIHBhcmFtZXRlcnM6PC9zcGFuPg0KKyAgICA8YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCI+dWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPiogICAgICAgICAgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydF8NCisgICk7DQorPC9wcmU+PC9kaXY+PHA+DQorQysrIHByb3h5IGNsYXNzIChkZWZpbmVkIGluIHNvYXBQdWJsaXNoU29hcFByb3h5LmgpOiBjbGFzcyBQdWJsaXNoU29hcDsgPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6IDwvYj48L2R0PjxkZD4NCis8dGFibGUgYm9yZGVyPTAgY2VsbHNwYWNpbmc9MiBjZWxscGFkZGluZz0wPg0KKzx0cj48dGQgdmFsaWduPXRvcD48ZW0+dWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0XzwvZW0+Jm5ic3A7PC90ZD48dGQ+DQorcmVzcG9uc2UgcGFyYW1ldGVyIDwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzwvZGw+ICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTMyIiBkb3h5dGFnPSJ1ZGRpX3YyLmg6Ol9fcHViMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmciID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IF9fcHViMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwiPnVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZzwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT51ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmdfPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCI+dWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnVkZGkyX19kaXNwb3NpdGlvblJlcG9ydF88L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorT3BlcmF0aW9uICJfX3B1YjJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nIiBvZiBzZXJ2aWNlIGJpbmRpbmcgIlB1Ymxpc2hTb2FwIi4gDQorPHA+DQorT3BlcmF0aW9uIGRldGFpbHM6PHA+DQorPHVsPg0KKzxsaT5TT0FQIGRvY3VtZW50L2xpdGVyYWwgc3R5bGU8L2xpPjxsaT5TT0FQIGFjdGlvbj0iZGVsZXRlX2JpbmRpbmciPC9saT48bGk+U09BUCBGYXVsdDogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwiPl9kaXNwb3NpdGlvblJlcG9ydDwvYT48L2xpPjwvdWw+DQorPHA+DQorQyBzdHViIGZ1bmN0aW9uIChkZWZpbmVkIGluIHNvYXBDbGllbnQuY1twcF0pOiA8ZGl2IGNsYXNzPSJmcmFnbWVudCI+PHByZT4gIDxzcGFuIGNsYXNzPSJrZXl3b3JkdHlwZSI+aW50PC9zcGFuPiBzb2FwX2NhbGxfX19wdWIyX19kZWxldGVfVVNDT1JFYmluZGluZyg8c3BhbiBjbGFzcz0ia2V5d29yZCI+c3RydWN0PC9zcGFuPiBzb2FwICpzb2FwLA0KKyAgICBOVUxMLCA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gY2hhciAqZW5kcG9pbnQgPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBlbmRwb2ludCBmb3IgdGhpcyBvcGVyYXRpb248L3NwYW4+DQorICAgIE5VTEwsIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBjaGFyICphY3Rpb24gPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBhY3Rpb24gZm9yIHRoaXMgb3BlcmF0aW9uPC9zcGFuPg0KKyAgICA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gcmVxdWVzdCBwYXJhbWV0ZXJzOjwvc3Bhbj4NCisgICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwiPnVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZzwvYT4qICAgICAgICB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmdfLA0KKyAgICA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gcmVzcG9uc2UgcGFyYW1ldGVyczo8L3NwYW4+DQorICAgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sIj51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQ8L2E+KiAgICAgICAgICAgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0Xw0KKyAgKTsNCis8L3ByZT48L2Rpdj48cD4NCitDKysgcHJveHkgY2xhc3MgKGRlZmluZWQgaW4gc29hcFB1Ymxpc2hTb2FwUHJveHkuaCk6IGNsYXNzIFB1Ymxpc2hTb2FwOyA8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczogPC9iPjwvZHQ+PGRkPg0KKzx0YWJsZSBib3JkZXI9MCBjZWxsc3BhY2luZz0yIGNlbGxwYWRkaW5nPTA+DQorPHRyPjx0ZCB2YWxpZ249dG9wPjxlbT51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnRfPC9lbT4mbmJzcDs8L3RkPjx0ZD4NCityZXNwb25zZSBwYXJhbWV0ZXIgPC90ZD48L3RyPg0KKzwvdGFibGU+DQorPC9kbD4gICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMzMiIGRveHl0YWc9InVkZGlfdjIuaDo6X19wdWIyX19kZWxldGVfVVNDT1JFYnVzaW5lc3MiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IF9fcHViMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzczwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT51ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzXzwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwiPnVkZGkyX19kaXNwb3NpdGlvblJlcG9ydDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnRfPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK09wZXJhdGlvbiAiX19wdWIyX19kZWxldGVfVVNDT1JFYnVzaW5lc3MiIG9mIHNlcnZpY2UgYmluZGluZyAiUHVibGlzaFNvYXAiLiANCis8cD4NCitPcGVyYXRpb24gZGV0YWlsczo8cD4NCis8dWw+DQorPGxpPlNPQVAgZG9jdW1lbnQvbGl0ZXJhbCBzdHlsZTwvbGk+PGxpPlNPQVAgYWN0aW9uPSJkZWxldGVfYnVzaW5lc3MiPC9saT48bGk+U09BUCBGYXVsdDogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwiPl9kaXNwb3NpdGlvblJlcG9ydDwvYT48L2xpPjwvdWw+DQorPHA+DQorQyBzdHViIGZ1bmN0aW9uIChkZWZpbmVkIGluIHNvYXBDbGllbnQuY1twcF0pOiA8ZGl2IGNsYXNzPSJmcmFnbWVudCI+PHByZT4gIDxzcGFuIGNsYXNzPSJrZXl3b3JkdHlwZSI+aW50PC9zcGFuPiBzb2FwX2NhbGxfX19wdWIyX19kZWxldGVfVVNDT1JFYnVzaW5lc3MoPHNwYW4gY2xhc3M9ImtleXdvcmQiPnN0cnVjdDwvc3Bhbj4gc29hcCAqc29hcCwNCisgICAgTlVMTCwgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIGNoYXIgKmVuZHBvaW50ID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgZW5kcG9pbnQgZm9yIHRoaXMgb3BlcmF0aW9uPC9zcGFuPg0KKyAgICBOVUxMLCA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gY2hhciAqYWN0aW9uID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgYWN0aW9uIGZvciB0aGlzIG9wZXJhdGlvbjwvc3Bhbj4NCisgICAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIHJlcXVlc3QgcGFyYW1ldGVyczo8L3NwYW4+DQorICAgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX2RlbGV0ZV9fX3Vfc19jX29fcl9lYnVzaW5lc3MuaHRtbCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzczwvYT4qICAgICAgIHVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3NfLA0KKyAgICA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gcmVzcG9uc2UgcGFyYW1ldGVyczo8L3NwYW4+DQorICAgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sIj51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQ8L2E+KiAgICAgICAgICAgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0Xw0KKyAgKTsNCis8L3ByZT48L2Rpdj48cD4NCitDKysgcHJveHkgY2xhc3MgKGRlZmluZWQgaW4gc29hcFB1Ymxpc2hTb2FwUHJveHkuaCk6IGNsYXNzIFB1Ymxpc2hTb2FwOyA8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczogPC9iPjwvZHQ+PGRkPg0KKzx0YWJsZSBib3JkZXI9MCBjZWxsc3BhY2luZz0yIGNlbGxwYWRkaW5nPTA+DQorPHRyPjx0ZCB2YWxpZ249dG9wPjxlbT51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnRfPC9lbT4mbmJzcDs8L3RkPjx0ZD4NCityZXNwb25zZSBwYXJhbWV0ZXIgPC90ZD48L3RyPg0KKzwvdGFibGU+DQorPC9kbD4gICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMzQiIGRveHl0YWc9InVkZGlfdjIuaDo6X19wdWIyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgX19wdWIyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwiPnVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT51ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnNfPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCI+dWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnVkZGkyX19kaXNwb3NpdGlvblJlcG9ydF88L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorT3BlcmF0aW9uICJfX3B1YjJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zIiBvZiBzZXJ2aWNlIGJpbmRpbmcgIlB1Ymxpc2hTb2FwIi4gDQorPHA+DQorT3BlcmF0aW9uIGRldGFpbHM6PHA+DQorPHVsPg0KKzxsaT5TT0FQIGRvY3VtZW50L2xpdGVyYWwgc3R5bGU8L2xpPjxsaT5TT0FQIGFjdGlvbj0iZGVsZXRlX3B1Ymxpc2hlckFzc2VydGlvbnMiPC9saT48bGk+U09BUCBGYXVsdDogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwiPl9kaXNwb3NpdGlvblJlcG9ydDwvYT48L2xpPjwvdWw+DQorPHA+DQorQyBzdHViIGZ1bmN0aW9uIChkZWZpbmVkIGluIHNvYXBDbGllbnQuY1twcF0pOiA8ZGl2IGNsYXNzPSJmcmFnbWVudCI+PHByZT4gIDxzcGFuIGNsYXNzPSJrZXl3b3JkdHlwZSI+aW50PC9zcGFuPiBzb2FwX2NhbGxfX19wdWIyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyg8c3BhbiBjbGFzcz0ia2V5d29yZCI+c3RydWN0PC9zcGFuPiBzb2FwICpzb2FwLA0KKyAgICBOVUxMLCA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gY2hhciAqZW5kcG9pbnQgPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBlbmRwb2ludCBmb3IgdGhpcyBvcGVyYXRpb248L3NwYW4+DQorICAgIE5VTEwsIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBjaGFyICphY3Rpb24gPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBhY3Rpb24gZm9yIHRoaXMgb3BlcmF0aW9uPC9zcGFuPg0KKyAgICA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gcmVxdWVzdCBwYXJhbWV0ZXJzOjwvc3Bhbj4NCisgICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2VwdWJsaXNoZXJfYXNzZXJ0aW9ucy5odG1sIj51ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM8L2E+KiB1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnNfLA0KKyAgICA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gcmVzcG9uc2UgcGFyYW1ldGVyczo8L3NwYW4+DQorICAgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sIj51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQ8L2E+KiAgICAgICAgICAgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0Xw0KKyAgKTsNCis8L3ByZT48L2Rpdj48cD4NCitDKysgcHJveHkgY2xhc3MgKGRlZmluZWQgaW4gc29hcFB1Ymxpc2hTb2FwUHJveHkuaCk6IGNsYXNzIFB1Ymxpc2hTb2FwOyA8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczogPC9iPjwvZHQ+PGRkPg0KKzx0YWJsZSBib3JkZXI9MCBjZWxsc3BhY2luZz0yIGNlbGxwYWRkaW5nPTA+DQorPHRyPjx0ZCB2YWxpZ249dG9wPjxlbT51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnRfPC9lbT4mbmJzcDs8L3RkPjx0ZD4NCityZXNwb25zZSBwYXJhbWV0ZXIgPC90ZD48L3RyPg0KKzwvdGFibGU+DQorPC9kbD4gICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMzUiIGRveHl0YWc9InVkZGlfdjIuaDo6X19wdWIyX19kZWxldGVfVVNDT1JFc2VydmljZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgX19wdWIyX19kZWxldGVfVVNDT1JFc2VydmljZSAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZV88L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sIj51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQ8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+dWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0XzwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitPcGVyYXRpb24gIl9fcHViMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UiIG9mIHNlcnZpY2UgYmluZGluZyAiUHVibGlzaFNvYXAiLiANCis8cD4NCitPcGVyYXRpb24gZGV0YWlsczo8cD4NCis8dWw+DQorPGxpPlNPQVAgZG9jdW1lbnQvbGl0ZXJhbCBzdHlsZTwvbGk+PGxpPlNPQVAgYWN0aW9uPSJkZWxldGVfc2VydmljZSI8L2xpPjxsaT5TT0FQIEZhdWx0OiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCI+X2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPjwvbGk+PC91bD4NCis8cD4NCitDIHN0dWIgZnVuY3Rpb24gKGRlZmluZWQgaW4gc29hcENsaWVudC5jW3BwXSk6IDxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPiAgPHNwYW4gY2xhc3M9ImtleXdvcmR0eXBlIj5pbnQ8L3NwYW4+IHNvYXBfY2FsbF9fX3B1YjJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlKDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5zdHJ1Y3Q8L3NwYW4+IHNvYXAgKnNvYXAsDQorICAgIE5VTEwsIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBjaGFyICplbmRwb2ludCA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGVuZHBvaW50IGZvciB0aGlzIG9wZXJhdGlvbjwvc3Bhbj4NCisgICAgTlVMTCwgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIGNoYXIgKmFjdGlvbiA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGFjdGlvbiBmb3IgdGhpcyBvcGVyYXRpb248L3NwYW4+DQorICAgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyByZXF1ZXN0IHBhcmFtZXRlcnM6PC9zcGFuPg0KKyAgICA8YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXNlcnZpY2UuaHRtbCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlPC9hPiogICAgICAgIHVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZV8sDQorICAgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyByZXNwb25zZSBwYXJhbWV0ZXJzOjwvc3Bhbj4NCisgICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwiPnVkZGkyX19kaXNwb3NpdGlvblJlcG9ydDwvYT4qICAgICAgICAgICB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnRfDQorICApOw0KKzwvcHJlPjwvZGl2PjxwPg0KK0MrKyBwcm94eSBjbGFzcyAoZGVmaW5lZCBpbiBzb2FwUHVibGlzaFNvYXBQcm94eS5oKTogY2xhc3MgUHVibGlzaFNvYXA7IDxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOiA8L2I+PC9kdD48ZGQ+DQorPHRhYmxlIGJvcmRlcj0wIGNlbGxzcGFjaW5nPTIgY2VsbHBhZGRpbmc9MD4NCis8dHI+PHRkIHZhbGlnbj10b3A+PGVtPnVkZGkyX19kaXNwb3NpdGlvblJlcG9ydF88L2VtPiZuYnNwOzwvdGQ+PHRkPg0KK3Jlc3BvbnNlIHBhcmFtZXRlciA8L3RkPjwvdHI+DQorPC90YWJsZT4NCis8L2RsPiAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEzNiIgZG94eXRhZz0idWRkaV92Mi5oOjpfX3B1YjJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IF9fcHViMl9fZGVsZXRlX1VTQ09SRXRNb2RlbCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kZWxldGVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCI+dWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWw8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+dWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWxfPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCI+dWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnVkZGkyX19kaXNwb3NpdGlvblJlcG9ydF88L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorT3BlcmF0aW9uICJfX3B1YjJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwiIG9mIHNlcnZpY2UgYmluZGluZyAiUHVibGlzaFNvYXAiLiANCis8cD4NCitPcGVyYXRpb24gZGV0YWlsczo8cD4NCis8dWw+DQorPGxpPlNPQVAgZG9jdW1lbnQvbGl0ZXJhbCBzdHlsZTwvbGk+PGxpPlNPQVAgYWN0aW9uPSJkZWxldGVfdE1vZGVsIjwvbGk+PGxpPlNPQVAgRmF1bHQ6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3NfX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sIj5fZGlzcG9zaXRpb25SZXBvcnQ8L2E+PC9saT48L3VsPg0KKzxwPg0KK0Mgc3R1YiBmdW5jdGlvbiAoZGVmaW5lZCBpbiBzb2FwQ2xpZW50LmNbcHBdKTogPGRpdiBjbGFzcz0iZnJhZ21lbnQiPjxwcmU+ICA8c3BhbiBjbGFzcz0ia2V5d29yZHR5cGUiPmludDwvc3Bhbj4gc29hcF9jYWxsX19fcHViMl9fZGVsZXRlX1VTQ09SRXRNb2RlbCg8c3BhbiBjbGFzcz0ia2V5d29yZCI+c3RydWN0PC9zcGFuPiBzb2FwICpzb2FwLA0KKyAgICBOVUxMLCA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gY2hhciAqZW5kcG9pbnQgPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBlbmRwb2ludCBmb3IgdGhpcyBvcGVyYXRpb248L3NwYW4+DQorICAgIE5VTEwsIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBjaGFyICphY3Rpb24gPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBhY3Rpb24gZm9yIHRoaXMgb3BlcmF0aW9uPC9zcGFuPg0KKyAgICA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gcmVxdWVzdCBwYXJhbWV0ZXJzOjwvc3Bhbj4NCisgICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGVsZXRlX19fdV9zX2Nfb19yX2V0X21vZGVsLmh0bWwiPnVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsPC9hPiogICAgICAgICB1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbF8sDQorICAgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyByZXNwb25zZSBwYXJhbWV0ZXJzOjwvc3Bhbj4NCisgICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwiPnVkZGkyX19kaXNwb3NpdGlvblJlcG9ydDwvYT4qICAgICAgICAgICB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnRfDQorICApOw0KKzwvcHJlPjwvZGl2PjxwPg0KK0MrKyBwcm94eSBjbGFzcyAoZGVmaW5lZCBpbiBzb2FwUHVibGlzaFNvYXBQcm94eS5oKTogY2xhc3MgUHVibGlzaFNvYXA7IDxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOiA8L2I+PC9kdD48ZGQ+DQorPHRhYmxlIGJvcmRlcj0wIGNlbGxzcGFjaW5nPTIgY2VsbHBhZGRpbmc9MD4NCis8dHI+PHRkIHZhbGlnbj10b3A+PGVtPnVkZGkyX19kaXNwb3NpdGlvblJlcG9ydF88L2VtPiZuYnNwOzwvdGQ+PHRkPg0KK3Jlc3BvbnNlIHBhcmFtZXRlciA8L3RkPjwvdHI+DQorPC90YWJsZT4NCis8L2RsPiAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEzNyIgZG94eXRhZz0idWRkaV92Mi5oOjpfX3B1YjJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBfX3B1YjJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc2NhcmRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCI+dWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbl88L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sIj51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQ8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+dWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0XzwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitPcGVyYXRpb24gIl9fcHViMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4iIG9mIHNlcnZpY2UgYmluZGluZyAiUHVibGlzaFNvYXAiLiANCis8cD4NCitPcGVyYXRpb24gZGV0YWlsczo8cD4NCis8dWw+DQorPGxpPlNPQVAgZG9jdW1lbnQvbGl0ZXJhbCBzdHlsZTwvbGk+PGxpPlNPQVAgYWN0aW9uPSJkaXNjYXJkX2F1dGhUb2tlbiI8L2xpPjxsaT5TT0FQIEZhdWx0OiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCI+X2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPjwvbGk+PC91bD4NCis8cD4NCitDIHN0dWIgZnVuY3Rpb24gKGRlZmluZWQgaW4gc29hcENsaWVudC5jW3BwXSk6IDxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPiAgPHNwYW4gY2xhc3M9ImtleXdvcmR0eXBlIj5pbnQ8L3NwYW4+IHNvYXBfY2FsbF9fX3B1YjJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuKDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5zdHJ1Y3Q8L3NwYW4+IHNvYXAgKnNvYXAsDQorICAgIE5VTEwsIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBjaGFyICplbmRwb2ludCA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGVuZHBvaW50IGZvciB0aGlzIG9wZXJhdGlvbjwvc3Bhbj4NCisgICAgTlVMTCwgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIGNoYXIgKmFjdGlvbiA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGFjdGlvbiBmb3IgdGhpcyBvcGVyYXRpb248L3NwYW4+DQorICAgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyByZXF1ZXN0IHBhcmFtZXRlcnM6PC9zcGFuPg0KKyAgICA8YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19kaXNjYXJkX19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLmh0bWwiPnVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbjwvYT4qICAgICB1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW5fLA0KKyAgICA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gcmVzcG9uc2UgcGFyYW1ldGVyczo8L3NwYW4+DQorICAgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sIj51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQ8L2E+KiAgICAgICAgICAgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0Xw0KKyAgKTsNCis8L3ByZT48L2Rpdj48cD4NCitDKysgcHJveHkgY2xhc3MgKGRlZmluZWQgaW4gc29hcFB1Ymxpc2hTb2FwUHJveHkuaCk6IGNsYXNzIFB1Ymxpc2hTb2FwOyA8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczogPC9iPjwvZHQ+PGRkPg0KKzx0YWJsZSBib3JkZXI9MCBjZWxsc3BhY2luZz0yIGNlbGxwYWRkaW5nPTA+DQorPHRyPjx0ZCB2YWxpZ249dG9wPjxlbT51ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnRfPC9lbT4mbmJzcDs8L3RkPjx0ZD4NCityZXNwb25zZSBwYXJhbWV0ZXIgPC90ZD48L3RyPg0KKzwvdGFibGU+DQorPC9kbD4gICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMzgiIGRveHl0YWc9InVkZGlfdjIuaDo6X19wdWIyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBfX3B1YjJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2Vhc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT51ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydF88L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2Fzc2VydGlvbl9zdGF0dXNfcmVwb3J0Lmh0bWwiPnVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQ8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+dWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydF88L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorT3BlcmF0aW9uICJfX3B1YjJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQiIG9mIHNlcnZpY2UgYmluZGluZyAiUHVibGlzaFNvYXAiLiANCis8cD4NCitPcGVyYXRpb24gZGV0YWlsczo8cD4NCis8dWw+DQorPGxpPlNPQVAgZG9jdW1lbnQvbGl0ZXJhbCBzdHlsZTwvbGk+PGxpPlNPQVAgYWN0aW9uPSJnZXRfYXNzZXJ0aW9uU3RhdHVzUmVwb3J0IjwvbGk+PGxpPlNPQVAgRmF1bHQ6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3NfX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sIj5fZGlzcG9zaXRpb25SZXBvcnQ8L2E+PC9saT48L3VsPg0KKzxwPg0KK0Mgc3R1YiBmdW5jdGlvbiAoZGVmaW5lZCBpbiBzb2FwQ2xpZW50LmNbcHBdKTogPGRpdiBjbGFzcz0iZnJhZ21lbnQiPjxwcmU+ICA8c3BhbiBjbGFzcz0ia2V5d29yZHR5cGUiPmludDwvc3Bhbj4gc29hcF9jYWxsX19fcHViMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCg8c3BhbiBjbGFzcz0ia2V5d29yZCI+c3RydWN0PC9zcGFuPiBzb2FwICpzb2FwLA0KKyAgICBOVUxMLCA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gY2hhciAqZW5kcG9pbnQgPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBlbmRwb2ludCBmb3IgdGhpcyBvcGVyYXRpb248L3NwYW4+DQorICAgIE5VTEwsIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBjaGFyICphY3Rpb24gPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBhY3Rpb24gZm9yIHRoaXMgb3BlcmF0aW9uPC9zcGFuPg0KKyAgICA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gcmVxdWVzdCBwYXJhbWV0ZXJzOjwvc3Bhbj4NCisgICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2Vhc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sIj51ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydDwvYT4qIHVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0XywNCisgICAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIHJlc3BvbnNlIHBhcmFtZXRlcnM6PC9zcGFuPg0KKyAgICA8YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hc3NlcnRpb25fc3RhdHVzX3JlcG9ydC5odG1sIj51ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0PC9hPiogICAgICAgdWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydF8NCisgICk7DQorPC9wcmU+PC9kaXY+PHA+DQorQysrIHByb3h5IGNsYXNzIChkZWZpbmVkIGluIHNvYXBQdWJsaXNoU29hcFByb3h5LmgpOiBjbGFzcyBQdWJsaXNoU29hcDsgPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6IDwvYj48L2R0PjxkZD4NCis8dGFibGUgYm9yZGVyPTAgY2VsbHNwYWNpbmc9MiBjZWxscGFkZGluZz0wPg0KKzx0cj48dGQgdmFsaWduPXRvcD48ZW0+dWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydF88L2VtPiZuYnNwOzwvdGQ+PHRkPg0KK3Jlc3BvbnNlIHBhcmFtZXRlciA8L3RkPjwvdHI+DQorPC90YWJsZT4NCis8L2RsPiAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEzOSIgZG94eXRhZz0idWRkaV92Mi5oOjpfX3B1YjJfX2dldF9VU0NPUkVhdXRoVG9rZW4iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IF9fcHViMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbiAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZWF1dGhfdG9rZW4uaHRtbCI+dWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW48L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+dWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW5fPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19hdXRoX3Rva2VuLmh0bWwiPnVkZGkyX19hdXRoVG9rZW48L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+dWRkaTJfX2F1dGhUb2tlbl88L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorT3BlcmF0aW9uICJfX3B1YjJfX2dldF9VU0NPUkVhdXRoVG9rZW4iIG9mIHNlcnZpY2UgYmluZGluZyAiUHVibGlzaFNvYXAiLiANCis8cD4NCitPcGVyYXRpb24gZGV0YWlsczo8cD4NCis8dWw+DQorPGxpPlNPQVAgZG9jdW1lbnQvbGl0ZXJhbCBzdHlsZTwvbGk+PGxpPlNPQVAgYWN0aW9uPSJnZXRfYXV0aFRva2VuIjwvbGk+PGxpPlNPQVAgRmF1bHQ6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3NfX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sIj5fZGlzcG9zaXRpb25SZXBvcnQ8L2E+PC9saT48L3VsPg0KKzxwPg0KK0Mgc3R1YiBmdW5jdGlvbiAoZGVmaW5lZCBpbiBzb2FwQ2xpZW50LmNbcHBdKTogPGRpdiBjbGFzcz0iZnJhZ21lbnQiPjxwcmU+ICA8c3BhbiBjbGFzcz0ia2V5d29yZHR5cGUiPmludDwvc3Bhbj4gc29hcF9jYWxsX19fcHViMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbig8c3BhbiBjbGFzcz0ia2V5d29yZCI+c3RydWN0PC9zcGFuPiBzb2FwICpzb2FwLA0KKyAgICBOVUxMLCA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gY2hhciAqZW5kcG9pbnQgPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBlbmRwb2ludCBmb3IgdGhpcyBvcGVyYXRpb248L3NwYW4+DQorICAgIE5VTEwsIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBjaGFyICphY3Rpb24gPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBhY3Rpb24gZm9yIHRoaXMgb3BlcmF0aW9uPC9zcGFuPg0KKyAgICA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gcmVxdWVzdCBwYXJhbWV0ZXJzOjwvc3Bhbj4NCisgICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VhdXRoX3Rva2VuLmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuPC9hPiogICAgICAgICB1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbl8sDQorICAgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyByZXNwb25zZSBwYXJhbWV0ZXJzOjwvc3Bhbj4NCisgICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fYXV0aF90b2tlbi5odG1sIj51ZGRpMl9fYXV0aFRva2VuPC9hPiogICAgICAgICAgICAgICAgICAgdWRkaTJfX2F1dGhUb2tlbl8NCisgICk7DQorPC9wcmU+PC9kaXY+PHA+DQorQysrIHByb3h5IGNsYXNzIChkZWZpbmVkIGluIHNvYXBQdWJsaXNoU29hcFByb3h5LmgpOiBjbGFzcyBQdWJsaXNoU29hcDsgPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6IDwvYj48L2R0PjxkZD4NCis8dGFibGUgYm9yZGVyPTAgY2VsbHNwYWNpbmc9MiBjZWxscGFkZGluZz0wPg0KKzx0cj48dGQgdmFsaWduPXRvcD48ZW0+dWRkaTJfX2F1dGhUb2tlbl88L2VtPiZuYnNwOzwvdGQ+PHRkPg0KK3Jlc3BvbnNlIHBhcmFtZXRlciA8L3RkPjwvdHI+DQorPC90YWJsZT4NCis8L2RsPiAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE0MCIgZG94eXRhZz0idWRkaV92Mi5oOjpfX3B1YjJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBfX3B1YjJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCI+dWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uc188L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwiPnVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zXzwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitPcGVyYXRpb24gIl9fcHViMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMiIG9mIHNlcnZpY2UgYmluZGluZyAiUHVibGlzaFNvYXAiLiANCis8cD4NCitPcGVyYXRpb24gZGV0YWlsczo8cD4NCis8dWw+DQorPGxpPlNPQVAgZG9jdW1lbnQvbGl0ZXJhbCBzdHlsZTwvbGk+PGxpPlNPQVAgYWN0aW9uPSJnZXRfcHVibGlzaGVyQXNzZXJ0aW9ucyI8L2xpPjxsaT5TT0FQIEZhdWx0OiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCI+X2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPjwvbGk+PC91bD4NCis8cD4NCitDIHN0dWIgZnVuY3Rpb24gKGRlZmluZWQgaW4gc29hcENsaWVudC5jW3BwXSk6IDxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPiAgPHNwYW4gY2xhc3M9ImtleXdvcmR0eXBlIj5pbnQ8L3NwYW4+IHNvYXBfY2FsbF9fX3B1YjJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5zdHJ1Y3Q8L3NwYW4+IHNvYXAgKnNvYXAsDQorICAgIE5VTEwsIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBjaGFyICplbmRwb2ludCA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGVuZHBvaW50IGZvciB0aGlzIG9wZXJhdGlvbjwvc3Bhbj4NCisgICAgTlVMTCwgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIGNoYXIgKmFjdGlvbiA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGFjdGlvbiBmb3IgdGhpcyBvcGVyYXRpb248L3NwYW4+DQorICAgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyByZXF1ZXN0IHBhcmFtZXRlcnM6PC9zcGFuPg0KKyAgICA8YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19nZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT4qIHVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uc18sDQorICAgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyByZXNwb25zZSBwYXJhbWV0ZXJzOjwvc3Bhbj4NCisgICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCI+dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnM8L2E+KiAgICAgICAgIHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zXw0KKyAgKTsNCis8L3ByZT48L2Rpdj48cD4NCitDKysgcHJveHkgY2xhc3MgKGRlZmluZWQgaW4gc29hcFB1Ymxpc2hTb2FwUHJveHkuaCk6IGNsYXNzIFB1Ymxpc2hTb2FwOyA8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczogPC9iPjwvZHQ+PGRkPg0KKzx0YWJsZSBib3JkZXI9MCBjZWxsc3BhY2luZz0yIGNlbGxwYWRkaW5nPTA+DQorPHRyPjx0ZCB2YWxpZ249dG9wPjxlbT51ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uc188L2VtPiZuYnNwOzwvdGQ+PHRkPg0KK3Jlc3BvbnNlIHBhcmFtZXRlciA8L3RkPjwvdHI+DQorPC90YWJsZT4NCis8L2RsPiAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE0MSIgZG94eXRhZz0idWRkaV92Mi5oOjpfX3B1YjJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgX19wdWIyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8gICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fZ2V0X19fdV9zX2Nfb19yX2VyZWdpc3RlcmVkX2luZm8uaHRtbCI+dWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbzwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT51ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvXzwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fcmVnaXN0ZXJlZF9pbmZvLmh0bWwiPnVkZGkyX19yZWdpc3RlcmVkSW5mbzwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT51ZGRpMl9fcmVnaXN0ZXJlZEluZm9fPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK09wZXJhdGlvbiAiX19wdWIyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8iIG9mIHNlcnZpY2UgYmluZGluZyAiUHVibGlzaFNvYXAiLiANCis8cD4NCitPcGVyYXRpb24gZGV0YWlsczo8cD4NCis8dWw+DQorPGxpPlNPQVAgZG9jdW1lbnQvbGl0ZXJhbCBzdHlsZTwvbGk+PGxpPlNPQVAgYWN0aW9uPSJnZXRfcmVnaXN0ZXJlZEluZm8iPC9saT48bGk+U09BUCBGYXVsdDogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwiPl9kaXNwb3NpdGlvblJlcG9ydDwvYT48L2xpPjwvdWw+DQorPHA+DQorQyBzdHViIGZ1bmN0aW9uIChkZWZpbmVkIGluIHNvYXBDbGllbnQuY1twcF0pOiA8ZGl2IGNsYXNzPSJmcmFnbWVudCI+PHByZT4gIDxzcGFuIGNsYXNzPSJrZXl3b3JkdHlwZSI+aW50PC9zcGFuPiBzb2FwX2NhbGxfX19wdWIyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8oPHNwYW4gY2xhc3M9ImtleXdvcmQiPnN0cnVjdDwvc3Bhbj4gc29hcCAqc29hcCwNCisgICAgTlVMTCwgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIGNoYXIgKmVuZHBvaW50ID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgZW5kcG9pbnQgZm9yIHRoaXMgb3BlcmF0aW9uPC9zcGFuPg0KKyAgICBOVUxMLCA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gY2hhciAqYWN0aW9uID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgYWN0aW9uIGZvciB0aGlzIG9wZXJhdGlvbjwvc3Bhbj4NCisgICAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIHJlcXVlc3QgcGFyYW1ldGVyczo8L3NwYW4+DQorICAgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX2dldF9fX3Vfc19jX29fcl9lcmVnaXN0ZXJlZF9pbmZvLmh0bWwiPnVkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm88L2E+KiAgICB1ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvXywNCisgICAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIHJlc3BvbnNlIHBhcmFtZXRlcnM6PC9zcGFuPg0KKyAgICA8YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19yZWdpc3RlcmVkX2luZm8uaHRtbCI+dWRkaTJfX3JlZ2lzdGVyZWRJbmZvPC9hPiogICAgICAgICAgICAgIHVkZGkyX19yZWdpc3RlcmVkSW5mb18NCisgICk7DQorPC9wcmU+PC9kaXY+PHA+DQorQysrIHByb3h5IGNsYXNzIChkZWZpbmVkIGluIHNvYXBQdWJsaXNoU29hcFByb3h5LmgpOiBjbGFzcyBQdWJsaXNoU29hcDsgPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6IDwvYj48L2R0PjxkZD4NCis8dGFibGUgYm9yZGVyPTAgY2VsbHNwYWNpbmc9MiBjZWxscGFkZGluZz0wPg0KKzx0cj48dGQgdmFsaWduPXRvcD48ZW0+dWRkaTJfX3JlZ2lzdGVyZWRJbmZvXzwvZW0+Jm5ic3A7PC90ZD48dGQ+DQorcmVzcG9uc2UgcGFyYW1ldGVyIDwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzwvZGw+ICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTQyIiBkb3h5dGFnPSJ1ZGRpX3YyLmg6Ol9fcHViMl9fc2F2ZV9VU0NPUkViaW5kaW5nIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBfX3B1YjJfX3NhdmVfVVNDT1JFYmluZGluZyAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwiPnVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmc8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+dWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZ188L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX2JpbmRpbmdfZGV0YWlsLmh0bWwiPnVkZGkyX19iaW5kaW5nRGV0YWlsPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnVkZGkyX19iaW5kaW5nRGV0YWlsXzwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitPcGVyYXRpb24gIl9fcHViMl9fc2F2ZV9VU0NPUkViaW5kaW5nIiBvZiBzZXJ2aWNlIGJpbmRpbmcgIlB1Ymxpc2hTb2FwIi4gDQorPHA+DQorT3BlcmF0aW9uIGRldGFpbHM6PHA+DQorPHVsPg0KKzxsaT5TT0FQIGRvY3VtZW50L2xpdGVyYWwgc3R5bGU8L2xpPjxsaT5TT0FQIGFjdGlvbj0ic2F2ZV9iaW5kaW5nIjwvbGk+PGxpPlNPQVAgRmF1bHQ6IDxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3NfX2Rpc3Bvc2l0aW9uX3JlcG9ydC5odG1sIj5fZGlzcG9zaXRpb25SZXBvcnQ8L2E+PC9saT48L3VsPg0KKzxwPg0KK0Mgc3R1YiBmdW5jdGlvbiAoZGVmaW5lZCBpbiBzb2FwQ2xpZW50LmNbcHBdKTogPGRpdiBjbGFzcz0iZnJhZ21lbnQiPjxwcmU+ICA8c3BhbiBjbGFzcz0ia2V5d29yZHR5cGUiPmludDwvc3Bhbj4gc29hcF9jYWxsX19fcHViMl9fc2F2ZV9VU0NPUkViaW5kaW5nKDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5zdHJ1Y3Q8L3NwYW4+IHNvYXAgKnNvYXAsDQorICAgIE5VTEwsIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBjaGFyICplbmRwb2ludCA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGVuZHBvaW50IGZvciB0aGlzIG9wZXJhdGlvbjwvc3Bhbj4NCisgICAgTlVMTCwgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIGNoYXIgKmFjdGlvbiA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGFjdGlvbiBmb3IgdGhpcyBvcGVyYXRpb248L3NwYW4+DQorICAgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyByZXF1ZXN0IHBhcmFtZXRlcnM6PC9zcGFuPg0KKyAgICA8YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zYXZlX19fdV9zX2Nfb19yX2ViaW5kaW5nLmh0bWwiPnVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmc8L2E+KiAgICAgICAgICB1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nXywNCisgICAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIHJlc3BvbnNlIHBhcmFtZXRlcnM6PC9zcGFuPg0KKyAgICA8YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19iaW5kaW5nX2RldGFpbC5odG1sIj51ZGRpMl9fYmluZGluZ0RldGFpbDwvYT4qICAgICAgICAgICAgICAgdWRkaTJfX2JpbmRpbmdEZXRhaWxfDQorICApOw0KKzwvcHJlPjwvZGl2PjxwPg0KK0MrKyBwcm94eSBjbGFzcyAoZGVmaW5lZCBpbiBzb2FwUHVibGlzaFNvYXBQcm94eS5oKTogY2xhc3MgUHVibGlzaFNvYXA7IDxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOiA8L2I+PC9kdD48ZGQ+DQorPHRhYmxlIGJvcmRlcj0wIGNlbGxzcGFjaW5nPTIgY2VsbHBhZGRpbmc9MD4NCis8dHI+PHRkIHZhbGlnbj10b3A+PGVtPnVkZGkyX19iaW5kaW5nRGV0YWlsXzwvZW0+Jm5ic3A7PC90ZD48dGQ+DQorcmVzcG9uc2UgcGFyYW1ldGVyIDwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzwvZGw+ICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTQzIiBkb3h5dGFnPSJ1ZGRpX3YyLmg6Ol9fcHViMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgX19wdWIyX19zYXZlX1VTQ09SRWJ1c2luZXNzICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwiPnVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzXzwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsLmh0bWwiPnVkZGkyX19idXNpbmVzc0RldGFpbDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT51ZGRpMl9fYnVzaW5lc3NEZXRhaWxfPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK09wZXJhdGlvbiAiX19wdWIyX19zYXZlX1VTQ09SRWJ1c2luZXNzIiBvZiBzZXJ2aWNlIGJpbmRpbmcgIlB1Ymxpc2hTb2FwIi4gDQorPHA+DQorT3BlcmF0aW9uIGRldGFpbHM6PHA+DQorPHVsPg0KKzxsaT5TT0FQIGRvY3VtZW50L2xpdGVyYWwgc3R5bGU8L2xpPjxsaT5TT0FQIGFjdGlvbj0ic2F2ZV9idXNpbmVzcyI8L2xpPjxsaT5TT0FQIEZhdWx0OiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCI+X2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPjwvbGk+PC91bD4NCis8cD4NCitDIHN0dWIgZnVuY3Rpb24gKGRlZmluZWQgaW4gc29hcENsaWVudC5jW3BwXSk6IDxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPiAgPHNwYW4gY2xhc3M9ImtleXdvcmR0eXBlIj5pbnQ8L3NwYW4+IHNvYXBfY2FsbF9fX3B1YjJfX3NhdmVfVVNDT1JFYnVzaW5lc3MoPHNwYW4gY2xhc3M9ImtleXdvcmQiPnN0cnVjdDwvc3Bhbj4gc29hcCAqc29hcCwNCisgICAgTlVMTCwgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIGNoYXIgKmVuZHBvaW50ID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgZW5kcG9pbnQgZm9yIHRoaXMgb3BlcmF0aW9uPC9zcGFuPg0KKyAgICBOVUxMLCA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gY2hhciAqYWN0aW9uID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgYWN0aW9uIGZvciB0aGlzIG9wZXJhdGlvbjwvc3Bhbj4NCisgICAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIHJlcXVlc3QgcGFyYW1ldGVyczo8L3NwYW4+DQorICAgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZWJ1c2luZXNzLmh0bWwiPnVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzPC9hPiogICAgICAgICB1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzc18sDQorICAgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyByZXNwb25zZSBwYXJhbWV0ZXJzOjwvc3Bhbj4NCisgICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fYnVzaW5lc3NfZGV0YWlsLmh0bWwiPnVkZGkyX19idXNpbmVzc0RldGFpbDwvYT4qICAgICAgICAgICAgICB1ZGRpMl9fYnVzaW5lc3NEZXRhaWxfDQorICApOw0KKzwvcHJlPjwvZGl2PjxwPg0KK0MrKyBwcm94eSBjbGFzcyAoZGVmaW5lZCBpbiBzb2FwUHVibGlzaFNvYXBQcm94eS5oKTogY2xhc3MgUHVibGlzaFNvYXA7IDxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOiA8L2I+PC9kdD48ZGQ+DQorPHRhYmxlIGJvcmRlcj0wIGNlbGxzcGFjaW5nPTIgY2VsbHBhZGRpbmc9MD4NCis8dHI+PHRkIHZhbGlnbj10b3A+PGVtPnVkZGkyX19idXNpbmVzc0RldGFpbF88L2VtPiZuYnNwOzwvdGQ+PHRkPg0KK3Jlc3BvbnNlIHBhcmFtZXRlciA8L3RkPjwvdHI+DQorPC90YWJsZT4NCis8L2RsPiAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE0NCIgZG94eXRhZz0idWRkaV92Mi5oOjpfX3B1YjJfX3NhdmVfVVNDT1JFc2VydmljZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgX19wdWIyX19zYXZlX1VTQ09SRXNlcnZpY2UgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj48YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sIj51ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2VfPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjxhIGNsYXNzPSJlbCIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXJ2aWNlX2RldGFpbC5odG1sIj51ZGRpMl9fc2VydmljZURldGFpbDwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT51ZGRpMl9fc2VydmljZURldGFpbF88L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorT3BlcmF0aW9uICJfX3B1YjJfX3NhdmVfVVNDT1JFc2VydmljZSIgb2Ygc2VydmljZSBiaW5kaW5nICJQdWJsaXNoU29hcCIuIA0KKzxwPg0KK09wZXJhdGlvbiBkZXRhaWxzOjxwPg0KKzx1bD4NCis8bGk+U09BUCBkb2N1bWVudC9saXRlcmFsIHN0eWxlPC9saT48bGk+U09BUCBhY3Rpb249InNhdmVfc2VydmljZSI8L2xpPjxsaT5TT0FQIEZhdWx0OiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCI+X2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPjwvbGk+PC91bD4NCis8cD4NCitDIHN0dWIgZnVuY3Rpb24gKGRlZmluZWQgaW4gc29hcENsaWVudC5jW3BwXSk6IDxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPiAgPHNwYW4gY2xhc3M9ImtleXdvcmR0eXBlIj5pbnQ8L3NwYW4+IHNvYXBfY2FsbF9fX3B1YjJfX3NhdmVfVVNDT1JFc2VydmljZSg8c3BhbiBjbGFzcz0ia2V5d29yZCI+c3RydWN0PC9zcGFuPiBzb2FwICpzb2FwLA0KKyAgICBOVUxMLCA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gY2hhciAqZW5kcG9pbnQgPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBlbmRwb2ludCBmb3IgdGhpcyBvcGVyYXRpb248L3NwYW4+DQorICAgIE5VTEwsIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBjaGFyICphY3Rpb24gPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBhY3Rpb24gZm9yIHRoaXMgb3BlcmF0aW9uPC9zcGFuPg0KKyAgICA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gcmVxdWVzdCBwYXJhbWV0ZXJzOjwvc3Bhbj4NCisgICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9lc2VydmljZS5odG1sIj51ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlPC9hPiogICAgICAgICAgdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZV8sDQorICAgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyByZXNwb25zZSBwYXJhbWV0ZXJzOjwvc3Bhbj4NCisgICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2VydmljZV9kZXRhaWwuaHRtbCI+dWRkaTJfX3NlcnZpY2VEZXRhaWw8L2E+KiAgICAgICAgICAgICAgIHVkZGkyX19zZXJ2aWNlRGV0YWlsXw0KKyAgKTsNCis8L3ByZT48L2Rpdj48cD4NCitDKysgcHJveHkgY2xhc3MgKGRlZmluZWQgaW4gc29hcFB1Ymxpc2hTb2FwUHJveHkuaCk6IGNsYXNzIFB1Ymxpc2hTb2FwOyA8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczogPC9iPjwvZHQ+PGRkPg0KKzx0YWJsZSBib3JkZXI9MCBjZWxsc3BhY2luZz0yIGNlbGxwYWRkaW5nPTA+DQorPHRyPjx0ZCB2YWxpZ249dG9wPjxlbT51ZGRpMl9fc2VydmljZURldGFpbF88L2VtPiZuYnNwOzwvdGQ+PHRkPg0KK3Jlc3BvbnNlIHBhcmFtZXRlciA8L3RkPjwvdHI+DQorPC90YWJsZT4NCis8L2RsPiAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE0NSIgZG94eXRhZz0idWRkaV92Mi5oOjpfX3B1YjJfX3NhdmVfVVNDT1JFdE1vZGVsIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBfX3B1YjJfX3NhdmVfVVNDT1JFdE1vZGVsICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NhdmVfX191X3NfY19vX3JfZXRfbW9kZWwuaHRtbCI+dWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbF88L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3RfbW9kZWxfZGV0YWlsLmh0bWwiPnVkZGkyX190TW9kZWxEZXRhaWw8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+dWRkaTJfX3RNb2RlbERldGFpbF88L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorT3BlcmF0aW9uICJfX3B1YjJfX3NhdmVfVVNDT1JFdE1vZGVsIiBvZiBzZXJ2aWNlIGJpbmRpbmcgIlB1Ymxpc2hTb2FwIi4gDQorPHA+DQorT3BlcmF0aW9uIGRldGFpbHM6PHA+DQorPHVsPg0KKzxsaT5TT0FQIGRvY3VtZW50L2xpdGVyYWwgc3R5bGU8L2xpPjxsaT5TT0FQIGFjdGlvbj0ic2F2ZV90TW9kZWwiPC9saT48bGk+U09BUCBGYXVsdDogPGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc19fZGlzcG9zaXRpb25fcmVwb3J0Lmh0bWwiPl9kaXNwb3NpdGlvblJlcG9ydDwvYT48L2xpPjwvdWw+DQorPHA+DQorQyBzdHViIGZ1bmN0aW9uIChkZWZpbmVkIGluIHNvYXBDbGllbnQuY1twcF0pOiA8ZGl2IGNsYXNzPSJmcmFnbWVudCI+PHByZT4gIDxzcGFuIGNsYXNzPSJrZXl3b3JkdHlwZSI+aW50PC9zcGFuPiBzb2FwX2NhbGxfX19wdWIyX19zYXZlX1VTQ09SRXRNb2RlbCg8c3BhbiBjbGFzcz0ia2V5d29yZCI+c3RydWN0PC9zcGFuPiBzb2FwICpzb2FwLA0KKyAgICBOVUxMLCA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gY2hhciAqZW5kcG9pbnQgPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBlbmRwb2ludCBmb3IgdGhpcyBvcGVyYXRpb248L3NwYW4+DQorICAgIE5VTEwsIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBjaGFyICphY3Rpb24gPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBhY3Rpb24gZm9yIHRoaXMgb3BlcmF0aW9uPC9zcGFuPg0KKyAgICA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gcmVxdWVzdCBwYXJhbWV0ZXJzOjwvc3Bhbj4NCisgICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fc2F2ZV9fX3Vfc19jX29fcl9ldF9tb2RlbC5odG1sIj51ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWw8L2E+KiAgICAgICAgICAgdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsXywNCisgICAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIHJlc3BvbnNlIHBhcmFtZXRlcnM6PC9zcGFuPg0KKyAgICA8YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX190X21vZGVsX2RldGFpbC5odG1sIj51ZGRpMl9fdE1vZGVsRGV0YWlsPC9hPiogICAgICAgICAgICAgICAgdWRkaTJfX3RNb2RlbERldGFpbF8NCisgICk7DQorPC9wcmU+PC9kaXY+PHA+DQorQysrIHByb3h5IGNsYXNzIChkZWZpbmVkIGluIHNvYXBQdWJsaXNoU29hcFByb3h5LmgpOiBjbGFzcyBQdWJsaXNoU29hcDsgPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6IDwvYj48L2R0PjxkZD4NCis8dGFibGUgYm9yZGVyPTAgY2VsbHNwYWNpbmc9MiBjZWxscGFkZGluZz0wPg0KKzx0cj48dGQgdmFsaWduPXRvcD48ZW0+dWRkaTJfX3RNb2RlbERldGFpbF88L2VtPiZuYnNwOzwvdGQ+PHRkPg0KK3Jlc3BvbnNlIHBhcmFtZXRlciA8L3RkPjwvdHI+DQorPC90YWJsZT4NCis8L2RsPiAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE0NiIgZG94eXRhZz0idWRkaV92Mi5oOjpfX3B1YjJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBfX3B1YjJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3NldF9fX3Vfc19jX29fcl9lcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCI+dWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uc188L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PGEgY2xhc3M9ImVsIiBocmVmPSJjbGFzc3VkZGkyX19fX3B1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwiPnVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zXzwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitPcGVyYXRpb24gIl9fcHViMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMiIG9mIHNlcnZpY2UgYmluZGluZyAiUHVibGlzaFNvYXAiLiANCis8cD4NCitPcGVyYXRpb24gZGV0YWlsczo8cD4NCis8dWw+DQorPGxpPlNPQVAgZG9jdW1lbnQvbGl0ZXJhbCBzdHlsZTwvbGk+PGxpPlNPQVAgYWN0aW9uPSJzZXRfcHVibGlzaGVyQXNzZXJ0aW9ucyI8L2xpPjxsaT5TT0FQIEZhdWx0OiA8YSBjbGFzcz0iZWwiIGhyZWY9ImNsYXNzX19kaXNwb3NpdGlvbl9yZXBvcnQuaHRtbCI+X2Rpc3Bvc2l0aW9uUmVwb3J0PC9hPjwvbGk+PC91bD4NCis8cD4NCitDIHN0dWIgZnVuY3Rpb24gKGRlZmluZWQgaW4gc29hcENsaWVudC5jW3BwXSk6IDxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPiAgPHNwYW4gY2xhc3M9ImtleXdvcmR0eXBlIj5pbnQ8L3NwYW4+IHNvYXBfY2FsbF9fX3B1YjJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5zdHJ1Y3Q8L3NwYW4+IHNvYXAgKnNvYXAsDQorICAgIE5VTEwsIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBjaGFyICplbmRwb2ludCA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGVuZHBvaW50IGZvciB0aGlzIG9wZXJhdGlvbjwvc3Bhbj4NCisgICAgTlVMTCwgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIGNoYXIgKmFjdGlvbiA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGFjdGlvbiBmb3IgdGhpcyBvcGVyYXRpb248L3NwYW4+DQorICAgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyByZXF1ZXN0IHBhcmFtZXRlcnM6PC9zcGFuPg0KKyAgICA8YSBjbGFzcz0iY29kZSIgaHJlZj0iY2xhc3N1ZGRpMl9fX19zZXRfX191X3NfY19vX3JfZXB1Ymxpc2hlcl9hc3NlcnRpb25zLmh0bWwiPnVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczwvYT4qIHVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uc18sDQorICAgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyByZXNwb25zZSBwYXJhbWV0ZXJzOjwvc3Bhbj4NCisgICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9ImNsYXNzdWRkaTJfX19fcHVibGlzaGVyX2Fzc2VydGlvbnMuaHRtbCI+dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnM8L2E+KiAgICAgICAgIHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zXw0KKyAgKTsNCis8L3ByZT48L2Rpdj48cD4NCitDKysgcHJveHkgY2xhc3MgKGRlZmluZWQgaW4gc29hcFB1Ymxpc2hTb2FwUHJveHkuaCk6IGNsYXNzIFB1Ymxpc2hTb2FwOyA8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczogPC9iPjwvZHQ+PGRkPg0KKzx0YWJsZSBib3JkZXI9MCBjZWxsc3BhY2luZz0yIGNlbGxwYWRkaW5nPTA+DQorPHRyPjx0ZCB2YWxpZ249dG9wPjxlbT51ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uc188L2VtPiZuYnNwOzwvdGQ+PHRkPg0KK3Jlc3BvbnNlIHBhcmFtZXRlciA8L3RkPjwvdHI+DQorPC90YWJsZT4NCis8L2RsPiAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBXZWQgQXVnIDE3IDE2OjE2OjU4IDIwMDUgZm9yIGdTT0FQIFVEREkgdjIgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvYW5ub3RhdGVkLmh0bWwgYi9kb2Mvd3NzZS9odG1sL2Fubm90YXRlZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYmM1NmIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL2Fubm90YXRlZC5odG1sCkBAIC0wLDAgKzEsNDMgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFdTLVNlY3VyaXR5OiBDbGFzcyBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4SEwiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+Z1NPQVAgV1MtU2VjdXJpdHkgQ2xhc3MgTGlzdDwvaDE+SGVyZSBhcmUgdGhlIGNsYXNzZXMsIHN0cnVjdHMsIHVuaW9ucyBhbmQgaW50ZXJmYWNlcyB3aXRoIGJyaWVmIGRlc2NyaXB0aW9uczo8dGFibGU+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX2MxNG5fX19fX2luY2x1c2l2ZV9uYW1lc3BhY2VzLmh0bWwiPl9jMTRuX19JbmNsdXNpdmVOYW1lc3BhY2VzPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj48L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2JpbmFyeV9zZWN1cml0eV90b2tlbi5odG1sIj5fd3NzZV9fQmluYXJ5U2VjdXJpdHlUb2tlbjwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+VGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIHdzc2U6QmluYXJ5U2VjdXJpdHlUb2tlbiBlbGVtZW50IHBlciBTZWN0aW9uIDQuMi4gSW1wb3J0ZWQgZWxlbWVudCBfd3NzZV9fQmluYXJ5U2VjdXJpdHlUb2tlbiBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQgPC90ZD48L3RyPg0KKyAgPHRyPjx0ZCBjbGFzcz0iaW5kZXhrZXkiPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19lbWJlZGRlZC5odG1sIj5fd3NzZV9fRW1iZWRkZWQ8L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPlRoaXMgZWxlbWVudCBkZWZpbmVzIGEgc2VjdXJpdHkgdG9rZW4gZW1iZWRkZWQgcmVmZXJlbmNlIEltcG9ydGVkIGVsZW1lbnQgX3dzc2VfX0VtYmVkZGVkIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdCA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2tleV9pZGVudGlmaWVyLmh0bWwiPl93c3NlX19LZXlJZGVudGlmaWVyPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj5UaGlzIGVsZW1lbnQgZGVmaW5lcyBhIGtleSBpZGVudGlmaWVyIHJlZmVyZW5jZSBJbXBvcnRlZCBlbGVtZW50IF93c3NlX19LZXlJZGVudGlmaWVyIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdCA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3Bhc3N3b3JkLmh0bWwiPl93c3NlX19QYXNzd29yZDwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+VGhpcyBlbGVtZW50IGNvbnRhaW5zIHByb3BlcnRpZXMgZm9yIHRyYW5zZm9ybWF0aW9ucyBmcm9tIGFueSBuYW1lc3BhY2UsIGluY2x1ZGluZyBEU0lHLiAnX3dzc2VfX1RyYW5zZm9ybWF0aW9uUGFyYW1ldGVycycgZWxlbWVudCBkZWZpbml0aW9uIGludGVudGlvbmFsbHkgbGVmdCBibGFuayA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3JlZmVyZW5jZS5odG1sIj5fd3NzZV9fUmVmZXJlbmNlPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj5UaGlzIGVsZW1lbnQgZGVmaW5lcyBhIHNlY3VyaXR5IHRva2VuIHJlZmVyZW5jZSBJbXBvcnRlZCBlbGVtZW50IF93c3NlX19SZWZlcmVuY2UgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0IDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHkuaHRtbCI+X3dzc2VfX1NlY3VyaXR5PC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj5UaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgd3NzZTpTZWN1cml0eSBTT0FQIGhlYWRlciBlbGVtZW50IHBlciBTZWN0aW9uIDQuIEltcG9ydGVkIGVsZW1lbnQgX3dzc2VfX1NlY3VyaXR5IGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdCA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5X3Rva2VuX3JlZmVyZW5jZS5odG1sIj5fd3NzZV9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZTwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+VGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIHdzc2U6U2VjdXJpdHlUb2tlblJlZmVyZW5jZSBwZXIgU2VjdGlvbiA0LjMuIEltcG9ydGVkIGVsZW1lbnQgX3dzc2VfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2UgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0IDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fdXNlcm5hbWVfdG9rZW4uaHRtbCI+X3dzc2VfX1VzZXJuYW1lVG9rZW48L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPlRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSB3c3NlOlVzZXJuYW1lVG9rZW4gZWxlbWVudCBwZXIgU2VjdGlvbiA0LjEuIEltcG9ydGVkIGVsZW1lbnQgX3dzc2VfX1VzZXJuYW1lVG9rZW4gZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0IDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3N1X19fX190aW1lc3RhbXAuaHRtbCI+X3dzdV9fVGltZXN0YW1wPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj5UaGlzIGVsZW1lbnQgYWxsb3dzIFRpbWVzdGFtcHMgdG8gYmUgYXBwbGllZCBhbnl3aGVyZSBlbGVtZW50IHdpbGRjYXJkcyBhcmUgcHJlc2VudCwgaW5jbHVkaW5nIGFzIGEgU09BUCBoZWFkZXIuIEltcG9ydGVkIGVsZW1lbnQgX3dzdV9fVGltZXN0YW1wIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdCA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fY2Fub25pY2FsaXphdGlvbl9tZXRob2RfdHlwZS5odG1sIj5kc19fQ2Fub25pY2FsaXphdGlvbk1ldGhvZFR5cGU8L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPiJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpDYW5vbmljYWxpemF0aW9uTWV0aG9kVHlwZSBpcyBhIGNvbXBsZXhUeXBlIDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19kaWdlc3RfbWV0aG9kX3R5cGUuaHRtbCI+ZHNfX0RpZ2VzdE1ldGhvZFR5cGU8L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPiJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpEaWdlc3RNZXRob2RUeXBlIGlzIGEgY29tcGxleFR5cGUgPC90ZD48L3RyPg0KKyAgPHRyPjx0ZCBjbGFzcz0iaW5kZXhrZXkiPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2Rfc19hX2tleV92YWx1ZV90eXBlLmh0bWwiPmRzX19EU0FLZXlWYWx1ZVR5cGU8L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPiJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpEU0FLZXlWYWx1ZVR5cGUgaXMgYSBjb21wbGV4VHlwZSA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fa2V5X2luZm9fdHlwZS5odG1sIj5kc19fS2V5SW5mb1R5cGU8L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPkltcG9ydGVkIGNvbXBsZXhUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpLZXlJbmZvVHlwZSBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQgPC90ZD48L3RyPg0KKyAgPHRyPjx0ZCBjbGFzcz0iaW5kZXhrZXkiPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2tleV92YWx1ZV90eXBlLmh0bWwiPmRzX19LZXlWYWx1ZVR5cGU8L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPiJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpLZXlWYWx1ZVR5cGUgaXMgYSBjb21wbGV4VHlwZSA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fcmVmZXJlbmNlX3R5cGUuaHRtbCI+ZHNfX1JlZmVyZW5jZVR5cGU8L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPiJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpSZWZlcmVuY2VUeXBlIGlzIGEgY29tcGxleFR5cGUgPC90ZD48L3RyPg0KKyAgPHRyPjx0ZCBjbGFzcz0iaW5kZXhrZXkiPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3JldHJpZXZhbF9tZXRob2RfdHlwZS5odG1sIj5kc19fUmV0cmlldmFsTWV0aG9kVHlwZTwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlJldHJpZXZhbE1ldGhvZFR5cGUgaXMgYSBjb21wbGV4VHlwZSA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fcl9zX2Ffa2V5X3ZhbHVlX3R5cGUuaHRtbCI+ZHNfX1JTQUtleVZhbHVlVHlwZTwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlJTQUtleVZhbHVlVHlwZSBpcyBhIGNvbXBsZXhUeXBlIDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduYXR1cmVfbWV0aG9kX3R5cGUuaHRtbCI+ZHNfX1NpZ25hdHVyZU1ldGhvZFR5cGU8L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPiJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpTaWduYXR1cmVNZXRob2RUeXBlIGlzIGEgY29tcGxleFR5cGUgPC90ZD48L3RyPg0KKyAgPHRyPjx0ZCBjbGFzcz0iaW5kZXhrZXkiPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25hdHVyZV90eXBlLmh0bWwiPmRzX19TaWduYXR1cmVUeXBlPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj5JbXBvcnRlZCBjb21wbGV4VHlwZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6U2lnbmF0dXJlVHlwZSBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQgPC90ZD48L3RyPg0KKyAgPHRyPjx0ZCBjbGFzcz0iaW5kZXhrZXkiPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGUuaHRtbCI+ZHNfX1NpZ25lZEluZm9UeXBlPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj4iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6U2lnbmVkSW5mb1R5cGUgaXMgYSBjb21wbGV4VHlwZSA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fdHJhbnNmb3Jtc190eXBlLmh0bWwiPmRzX19UcmFuc2Zvcm1zVHlwZTwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlRyYW5zZm9ybXNUeXBlIGlzIGEgY29tcGxleFR5cGUgPC90ZD48L3RyPg0KKyAgPHRyPjx0ZCBjbGFzcz0iaW5kZXhrZXkiPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3RyYW5zZm9ybV90eXBlLmh0bWwiPmRzX19UcmFuc2Zvcm1UeXBlPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj5JbXBvcnRlZCBjb21wbGV4VHlwZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6VHJhbnNmb3JtVHlwZSBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQgPC90ZD48L3RyPg0KKyAgPHRyPjx0ZCBjbGFzcz0iaW5kZXhrZXkiPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3g1MDlfZGF0YV90eXBlLmh0bWwiPmRzX19YNTA5RGF0YVR5cGU8L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPiJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpYNTA5RGF0YVR5cGUgaXMgYSBjb21wbGV4VHlwZSA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19feDUwOV9pc3N1ZXJfc2VyaWFsX3R5cGUuaHRtbCI+ZHNfX1g1MDlJc3N1ZXJTZXJpYWxUeXBlPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj4iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6WDUwOUlzc3VlclNlcmlhbFR5cGUgaXMgYSBjb21wbGV4VHlwZSA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19zbWRfX2RhdGEuaHRtbCI+c29hcF9zbWRfZGF0YTwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+VGhlIHNtZGV2cCBlbmdpbmUgY29udGV4dCBkYXRhIDwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RhdGEuaHRtbCI+c29hcF93c3NlX2RhdGE8L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPldzc2VwaSBwbHVnaW4gZGF0YSA8L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kaWdlc3QuaHRtbCI+c29hcF93c3NlX2RpZ2VzdDwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+RGlnZXN0IGRpY3Rpb25hcnk6IGxpbmtlZCBsaXN0IG9mIElELWhhc2ggcGFpcnMgPC90ZD48L3RyPg0KKyAgPHRyPjx0ZCBjbGFzcz0iaW5kZXhrZXkiPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fc2Vzc2lvbi5odG1sIj5zb2FwX3dzc2Vfc2Vzc2lvbjwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+RGlnZXN0IGF1dGhlbnRpY2F0aW9uIHNlc3Npb24gZGF0YSA8L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gRnJpIEF1ZyAxOSAxMDo0MTo0NSAyMDA1IGZvciBnU09BUCBXUy1TZWN1cml0eSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9jMTRuXzhoLmh0bWwgYi9kb2Mvd3NzZS9odG1sL2MxNG5fOGguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWQ2MWM3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9jMTRuXzhoLmh0bWwKQEAgLTAsMCArMSw0NSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgV1MtU2VjdXJpdHk6IC9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy93c3NlL2MxNG4uaCBGaWxlIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2Mvd3NzZS9jMTRuLmggRmlsZSBSZWZlcmVuY2U8L2gxPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5DbGFzc2VzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0cnVjdCAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X19jMTRuX19fX19pbmNsdXNpdmVfbmFtZXNwYWNlcy5odG1sIj5fYzE0bl9fSW5jbHVzaXZlTmFtZXNwYWNlczwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5UeXBlZGVmczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD50eXBlZGVmIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X19jMTRuX19fX19pbmNsdXNpdmVfbmFtZXNwYWNlcy5odG1sIj5fYzE0bl9fSW5jbHVzaXZlTmFtZXNwYWNlczwvYT4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iYzE0bl84aC5odG1sI2EwIj5fYzE0bl9fSW5jbHVzaXZlTmFtZXNwYWNlczwvYT48L3RkPjwvdHI+DQorDQorPC90YWJsZT4NCis8aHI+PGgyPlR5cGVkZWYgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTAiIGRveHl0YWc9ImMxNG4uaDo6X2MxNG5fX0luY2x1c2l2ZU5hbWVzcGFjZXMiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdHlwZWRlZiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX2MxNG5fX19fX2luY2x1c2l2ZV9uYW1lc3BhY2VzLmh0bWwiPl9jMTRuX19JbmNsdXNpdmVOYW1lc3BhY2VzPC9hPiAgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX2MxNG5fX19fX2luY2x1c2l2ZV9uYW1lc3BhY2VzLmh0bWwiPl9jMTRuX19JbmNsdXNpdmVOYW1lc3BhY2VzPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBGcmkgQXVnIDE5IDEwOjQxOjQ1IDIwMDUgZm9yIGdTT0FQIFdTLVNlY3VyaXR5IGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL2RveHlnZW4uY3NzIGIvZG9jL3dzc2UvaHRtbC9kb3h5Z2VuLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjJlNTgyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9kb3h5Z2VuLmNzcwpAQCAtMCwwICsxLDIxNiBAQAorSDEgeworCXRleHQtYWxpZ246IGNlbnRlcjsKKwlmb250LWZhbWlseTogR2VuZXZhLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOworfQorSDIgeworCWZvbnQtZmFtaWx5OiBHZW5ldmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Cit9CitDQVBUSU9OIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQorRElWLnFpbmRleCB7CisJd2lkdGg6IDEwMCU7CisJYmFja2dyb3VuZC1jb2xvcjogI2VlZWVmZjsKKwlib3JkZXI6IDFweCBzb2xpZCAjQjBCMEIwOworCXRleHQtYWxpZ246IGNlbnRlcjsKKwltYXJnaW46IDJweDsKKwlwYWRkaW5nOiAycHg7CisJbGluZS1oZWlnaHQ6IDEyMCU7Cit9CitBLnFpbmRleCB7CisgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgICAgIGNvbG9yOiAjMUE0MTlEOworICAgICAgIHBhZGRpbmc6IDJweDsKK30KK0EucWluZGV4OnZpc2l0ZWQgeworICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICAgICBjb2xvcjogIzFBNDE5RAorICAgICAgIHBhZGRpbmc6IDJweDsKK30KK0EucWluZGV4OmhvdmVyIHsKKwl0ZXh0LWRlY29yYXRpb246IG5vbmU7CisJYmFja2dyb3VuZC1jb2xvcjogI2RkZGRmZjsKKwlwYWRkaW5nOiAycHg7Cit9CitBLnFpbmRleEhMIHsKKwl0ZXh0LWRlY29yYXRpb246IG5vbmU7CisJZm9udC13ZWlnaHQ6IGJvbGQ7CisJYmFja2dyb3VuZC1jb2xvcjogIzY2NjZjYzsKKwljb2xvcjogI2ZmZmZmZjsKKwlwYWRkaW5nOiAycHggNnB4OworCWJvcmRlcjogMXB4IGRvdWJsZSAjOTI5NUMyOworfQorQS5xaW5kZXhITDpob3ZlciB7CisJdGV4dC1kZWNvcmF0aW9uOiBub25lOworCWJhY2tncm91bmQtY29sb3I6ICM2NjY2Y2M7CisJY29sb3I6ICNmZmZmZmY7CisJcGFkZGluZzogMnB4IDZweDsKK30KK0EucWluZGV4SEw6dmlzaXRlZCB7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgYmFja2dyb3VuZC1jb2xvcjogIzY2NjZjYzsgY29sb3I6ICNmZmZmZmYgfQorQS5lbCB7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC13ZWlnaHQ6IGJvbGQgfQorQS5lbFJlZiB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KK0EuY29kZSB7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgY29sb3I6ICMxQTQxOUR9CitBLmNvZGVSZWYgeyBmb250LXdlaWdodDogbm9ybWFsOyBjb2xvcjogIzFBNDE5RH0KK0E6aG92ZXIgeyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGJhY2tncm91bmQtY29sb3I6ICNmMmYyZmYgfQorREwuZWwgeyBtYXJnaW4tbGVmdDogLTFjbSB9CitQUkUuZnJhZ21lbnQgeworCWJvcmRlcjogMXB4IHNvbGlkICNDQ0NDQ0M7CisJYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTsKKwltYXJnaW4tdG9wOiA0cHg7CisJbWFyZ2luLWJvdHRvbTogNHB4OworCW1hcmdpbi1sZWZ0OiAycHg7CisJbWFyZ2luLXJpZ2h0OiA4cHg7CisJcGFkZGluZy1sZWZ0OiA2cHg7CisJcGFkZGluZy1yaWdodDogNnB4OworCXBhZGRpbmctdG9wOiA0cHg7CisJcGFkZGluZy1ib3R0b206IDRweDsKK30KK0RJVi5mcmFnbWVudCB7CisJYm9yZGVyOiAxcHggc29saWQgI0NDQ0NDQzsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1OworCXBhZGRpbmc6IDZweDsKK30KK0RJVi5haCB7IGJhY2tncm91bmQtY29sb3I6IGJsYWNrOyBmb250LXdlaWdodDogYm9sZDsgY29sb3I6ICNmZmZmZmY7IG1hcmdpbi1ib3R0b206IDNweDsgbWFyZ2luLXRvcDogM3B4IH0KK1RELm1kIHsgYmFja2dyb3VuZC1jb2xvcjogI0Y0RjRGQjsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KK1RELm1kbmFtZTEgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjRjRGNEZCOyBmb250LXdlaWdodDogYm9sZDsgY29sb3I6ICM2MDIwMjA7IH0KK1RELm1kbmFtZSB7IGJhY2tncm91bmQtY29sb3I6ICNGNEY0RkI7IGZvbnQtd2VpZ2h0OiBib2xkOyBjb2xvcjogIzYwMjAyMDsgd2lkdGg6IDYwMHB4OyB9CitESVYuZ3JvdXBIZWFkZXIgeworICAgICAgIG1hcmdpbi1sZWZ0OiAxNnB4OworICAgICAgIG1hcmdpbi10b3A6IDEycHg7CisgICAgICAgbWFyZ2luLWJvdHRvbTogNnB4OworICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworCWZvbnQtZmFtaWx5OiBHZW5ldmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Cit9CitESVYuZ3JvdXBUZXh0IHsgbWFyZ2luLWxlZnQ6IDE2cHg7IGZvbnQtc3R5bGU6IGl0YWxpYzsgZm9udC1zaXplOiAxNHB4IH0KK0JPRFkgeworCWJhY2tncm91bmQ6IHdoaXRlOworCWNvbG9yOiBibGFjazsKKwltYXJnaW4tcmlnaHQ6IDIwcHg7CisJbWFyZ2luLWxlZnQ6IDIwcHg7Cit9CitURC5pbmRleGtleSB7CisJYmFja2dyb3VuZC1jb2xvcjogI2VlZWVmZjsKKwlmb250LXdlaWdodDogYm9sZDsKKwlwYWRkaW5nLXJpZ2h0ICA6IDEwcHg7CisJcGFkZGluZy10b3AgICAgOiAycHg7CisJcGFkZGluZy1sZWZ0ICAgOiAxMHB4OworCXBhZGRpbmctYm90dG9tIDogMnB4OworCW1hcmdpbi1sZWZ0ICAgIDogMHB4OworCW1hcmdpbi1yaWdodCAgIDogMHB4OworCW1hcmdpbi10b3AgICAgIDogMnB4OworCW1hcmdpbi1ib3R0b20gIDogMnB4OworCWJvcmRlcjogMXB4IHNvbGlkICNDQ0NDQ0M7Cit9CitURC5pbmRleHZhbHVlIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWZmOworCWZvbnQtc3R5bGU6IGl0YWxpYzsKKwlwYWRkaW5nLXJpZ2h0ICA6IDEwcHg7CisJcGFkZGluZy10b3AgICAgOiAycHg7CisJcGFkZGluZy1sZWZ0ICAgOiAxMHB4OworCXBhZGRpbmctYm90dG9tIDogMnB4OworCW1hcmdpbi1sZWZ0ICAgIDogMHB4OworCW1hcmdpbi1yaWdodCAgIDogMHB4OworCW1hcmdpbi10b3AgICAgIDogMnB4OworCW1hcmdpbi1ib3R0b20gIDogMnB4OworCWJvcmRlcjogMXB4IHNvbGlkICNDQ0NDQ0M7Cit9CitUUi5tZW1saXN0IHsKKyAgIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7IAorfQorUC5mb3JtdWxhRHNwIHsgdGV4dC1hbGlnbjogY2VudGVyOyB9CitJTUcuZm9ybXVsYURzcCB7IH0KK0lNRy5mb3JtdWxhSW5sIHsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgfQorU1BBTi5rZXl3b3JkICAgICAgIHsgY29sb3I6ICMwMDgwMDAgfQorU1BBTi5rZXl3b3JkdHlwZSAgIHsgY29sb3I6ICM2MDQwMjAgfQorU1BBTi5rZXl3b3JkZmxvdyAgIHsgY29sb3I6ICNlMDgwMDAgfQorU1BBTi5jb21tZW50ICAgICAgIHsgY29sb3I6ICM4MDAwMDAgfQorU1BBTi5wcmVwcm9jZXNzb3IgIHsgY29sb3I6ICM4MDYwMjAgfQorU1BBTi5zdHJpbmdsaXRlcmFsIHsgY29sb3I6ICMwMDIwODAgfQorU1BBTi5jaGFybGl0ZXJhbCAgIHsgY29sb3I6ICMwMDgwODAgfQorLm1kVGFibGUgeworCWJvcmRlcjogMXB4IHNvbGlkICM4Njg2ODY7CisJYmFja2dyb3VuZC1jb2xvcjogI0Y0RjRGQjsKK30KKy5tZFJvdyB7CisJcGFkZGluZzogOHB4IDEwcHg7Cit9CisubWRlc2NMZWZ0IHsKKyAgICAgICBwYWRkaW5nOiAwcHggOHB4IDRweCA4cHg7CisJZm9udC1zaXplOiAxNHB4OworCWZvbnQtc3R5bGU6IGl0YWxpYzsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRkFGQUZBOworCWJvcmRlci10b3A6IDFweCBub25lICNFMEUwRTA7CisJYm9yZGVyLXJpZ2h0OiAxcHggbm9uZSAjRTBFMEUwOworCWJvcmRlci1ib3R0b206IDFweCBub25lICNFMEUwRTA7CisJYm9yZGVyLWxlZnQ6IDFweCBub25lICNFMEUwRTA7CisJbWFyZ2luOiAwcHg7Cit9CisubWRlc2NSaWdodCB7CisgICAgICAgcGFkZGluZzogMHB4IDhweCA0cHggOHB4OworCWZvbnQtc2l6ZTogMTRweDsKKwlmb250LXN0eWxlOiBpdGFsaWM7CisJYmFja2dyb3VuZC1jb2xvcjogI0ZBRkFGQTsKKwlib3JkZXItdG9wOiAxcHggbm9uZSAjRTBFMEUwOworCWJvcmRlci1yaWdodDogMXB4IG5vbmUgI0UwRTBFMDsKKwlib3JkZXItYm90dG9tOiAxcHggbm9uZSAjRTBFMEUwOworCWJvcmRlci1sZWZ0OiAxcHggbm9uZSAjRTBFMEUwOworCW1hcmdpbjogMHB4OworfQorLm1lbUl0ZW1MZWZ0IHsKKwlwYWRkaW5nOiAxcHggMHB4IDBweCA4cHg7CisJbWFyZ2luOiA0cHg7CisJYm9yZGVyLXRvcC13aWR0aDogMXB4OworCWJvcmRlci1yaWdodC13aWR0aDogMXB4OworCWJvcmRlci1ib3R0b20td2lkdGg6IDFweDsKKwlib3JkZXItbGVmdC13aWR0aDogMXB4OworCWJvcmRlci10b3Atc3R5bGU6IHNvbGlkOworCWJvcmRlci10b3AtY29sb3I6ICNFMEUwRTA7CisJYm9yZGVyLXJpZ2h0LWNvbG9yOiAjRTBFMEUwOworCWJvcmRlci1ib3R0b20tY29sb3I6ICNFMEUwRTA7CisJYm9yZGVyLWxlZnQtY29sb3I6ICNFMEUwRTA7CisJYm9yZGVyLXJpZ2h0LXN0eWxlOiBub25lOworCWJvcmRlci1ib3R0b20tc3R5bGU6IG5vbmU7CisJYm9yZGVyLWxlZnQtc3R5bGU6IG5vbmU7CisJYmFja2dyb3VuZC1jb2xvcjogI0ZBRkFGQTsKKwlmb250LWZhbWlseTogR2VuZXZhLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOworCWZvbnQtc2l6ZTogMTJweDsKK30KKy5tZW1JdGVtUmlnaHQgeworCXBhZGRpbmc6IDFweCA4cHggMHB4IDhweDsKKwltYXJnaW46IDRweDsKKwlib3JkZXItdG9wLXdpZHRoOiAxcHg7CisJYm9yZGVyLXJpZ2h0LXdpZHRoOiAxcHg7CisJYm9yZGVyLWJvdHRvbS13aWR0aDogMXB4OworCWJvcmRlci1sZWZ0LXdpZHRoOiAxcHg7CisJYm9yZGVyLXRvcC1zdHlsZTogc29saWQ7CisJYm9yZGVyLXRvcC1jb2xvcjogI0UwRTBFMDsKKwlib3JkZXItcmlnaHQtY29sb3I6ICNFMEUwRTA7CisJYm9yZGVyLWJvdHRvbS1jb2xvcjogI0UwRTBFMDsKKwlib3JkZXItbGVmdC1jb2xvcjogI0UwRTBFMDsKKwlib3JkZXItcmlnaHQtc3R5bGU6IG5vbmU7CisJYm9yZGVyLWJvdHRvbS1zdHlsZTogbm9uZTsKKwlib3JkZXItbGVmdC1zdHlsZTogbm9uZTsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRkFGQUZBOworCWZvbnQtZmFtaWx5OiBHZW5ldmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CisJZm9udC1zaXplOiAxM3B4OworfQorLnNlYXJjaCAgICAgeyBjb2xvcjogIzAwMzM5OTsKKyAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CitGT1JNLnNlYXJjaCB7CisgICAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDBweDsKKyAgICAgICAgICAgICAgbWFyZ2luLXRvcDogMHB4OworfQorSU5QVVQuc2VhcmNoIHsgZm9udC1zaXplOiA3NSU7CisgICAgICAgICAgICAgICBjb2xvcjogIzAwMDA4MDsKKyAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWZmOworfQorVEQudGlueSAgICAgIHsgZm9udC1zaXplOiA3NSU7Cit9CithIHsKKwljb2xvcjogIzI1MkU3ODsKK30KK2E6dmlzaXRlZCB7CisJY29sb3I6ICMzRDIxODU7Cit9CmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL2RveHlnZW4ucG5nIGIvZG9jL3dzc2UvaHRtbC9kb3h5Z2VuLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGE1NWY5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9kb3h5Z2VuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL2RzXzhoLmh0bWwgYi9kb2Mvd3NzZS9odG1sL2RzXzhoLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM2N2E5OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvZHNfOGguaHRtbApAQCAtMCwwICsxLDQ4MyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgV1MtU2VjdXJpdHk6IC9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy93c3NlL2RzLmggRmlsZSBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3dzc2UvZHMuaCBGaWxlIFJlZmVyZW5jZTwvaDE+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPkNsYXNzZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c3RydWN0ICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmF0dXJlX3R5cGUuaHRtbCI+ZHNfX1NpZ25hdHVyZVR5cGU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkltcG9ydGVkIGNvbXBsZXhUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpTaWduYXR1cmVUeXBlIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4gIDxhIGhyZWY9InN0cnVjdGRzX19fX19zaWduYXR1cmVfdHlwZS5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0cnVjdCAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3RyYW5zZm9ybV90eXBlLmh0bWwiPmRzX19UcmFuc2Zvcm1UeXBlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5JbXBvcnRlZCBjb21wbGV4VHlwZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6VHJhbnNmb3JtVHlwZSBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuICA8YSBocmVmPSJzdHJ1Y3Rkc19fX19fdHJhbnNmb3JtX3R5cGUuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zdHJ1Y3QgJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19rZXlfaW5mb190eXBlLmh0bWwiPmRzX19LZXlJbmZvVHlwZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+SW1wb3J0ZWQgY29tcGxleFR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOktleUluZm9UeXBlIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4gIDxhIGhyZWY9InN0cnVjdGRzX19fX19rZXlfaW5mb190eXBlLmh0bWwjX2RldGFpbHMiPk1vcmUuLi48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c3RydWN0ICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmVkX2luZm9fdHlwZS5odG1sIj5kc19fU2lnbmVkSW5mb1R5cGU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPiJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpTaWduZWRJbmZvVHlwZSBpcyBhIGNvbXBsZXhUeXBlLiAgPGEgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGUuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zdHJ1Y3QgJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19jYW5vbmljYWxpemF0aW9uX21ldGhvZF90eXBlLmh0bWwiPmRzX19DYW5vbmljYWxpemF0aW9uTWV0aG9kVHlwZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOkNhbm9uaWNhbGl6YXRpb25NZXRob2RUeXBlIGlzIGEgY29tcGxleFR5cGUuICA8YSBocmVmPSJzdHJ1Y3Rkc19fX19fY2Fub25pY2FsaXphdGlvbl9tZXRob2RfdHlwZS5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0cnVjdCAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25hdHVyZV9tZXRob2RfdHlwZS5odG1sIj5kc19fU2lnbmF0dXJlTWV0aG9kVHlwZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlNpZ25hdHVyZU1ldGhvZFR5cGUgaXMgYSBjb21wbGV4VHlwZS4gIDxhIGhyZWY9InN0cnVjdGRzX19fX19zaWduYXR1cmVfbWV0aG9kX3R5cGUuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zdHJ1Y3QgJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19yZWZlcmVuY2VfdHlwZS5odG1sIj5kc19fUmVmZXJlbmNlVHlwZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlJlZmVyZW5jZVR5cGUgaXMgYSBjb21wbGV4VHlwZS4gIDxhIGhyZWY9InN0cnVjdGRzX19fX19yZWZlcmVuY2VfdHlwZS5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0cnVjdCAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3RyYW5zZm9ybXNfdHlwZS5odG1sIj5kc19fVHJhbnNmb3Jtc1R5cGU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPiJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpUcmFuc2Zvcm1zVHlwZSBpcyBhIGNvbXBsZXhUeXBlLiAgPGEgaHJlZj0ic3RydWN0ZHNfX19fX3RyYW5zZm9ybXNfdHlwZS5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0cnVjdCAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2RpZ2VzdF9tZXRob2RfdHlwZS5odG1sIj5kc19fRGlnZXN0TWV0aG9kVHlwZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOkRpZ2VzdE1ldGhvZFR5cGUgaXMgYSBjb21wbGV4VHlwZS4gIDxhIGhyZWY9InN0cnVjdGRzX19fX19kaWdlc3RfbWV0aG9kX3R5cGUuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zdHJ1Y3QgJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19rZXlfdmFsdWVfdHlwZS5odG1sIj5kc19fS2V5VmFsdWVUeXBlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij4iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6S2V5VmFsdWVUeXBlIGlzIGEgY29tcGxleFR5cGUuICA8YSBocmVmPSJzdHJ1Y3Rkc19fX19fa2V5X3ZhbHVlX3R5cGUuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zdHJ1Y3QgJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19yZXRyaWV2YWxfbWV0aG9kX3R5cGUuaHRtbCI+ZHNfX1JldHJpZXZhbE1ldGhvZFR5cGU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPiJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpSZXRyaWV2YWxNZXRob2RUeXBlIGlzIGEgY29tcGxleFR5cGUuICA8YSBocmVmPSJzdHJ1Y3Rkc19fX19fcmV0cmlldmFsX21ldGhvZF90eXBlLmh0bWwjX2RldGFpbHMiPk1vcmUuLi48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c3RydWN0ICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19feDUwOV9kYXRhX3R5cGUuaHRtbCI+ZHNfX1g1MDlEYXRhVHlwZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlg1MDlEYXRhVHlwZSBpcyBhIGNvbXBsZXhUeXBlLiAgPGEgaHJlZj0ic3RydWN0ZHNfX19fX3g1MDlfZGF0YV90eXBlLmh0bWwjX2RldGFpbHMiPk1vcmUuLi48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c3RydWN0ICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19feDUwOV9pc3N1ZXJfc2VyaWFsX3R5cGUuaHRtbCI+ZHNfX1g1MDlJc3N1ZXJTZXJpYWxUeXBlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij4iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6WDUwOUlzc3VlclNlcmlhbFR5cGUgaXMgYSBjb21wbGV4VHlwZS4gIDxhIGhyZWY9InN0cnVjdGRzX19fX194NTA5X2lzc3Vlcl9zZXJpYWxfdHlwZS5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0cnVjdCAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2Rfc19hX2tleV92YWx1ZV90eXBlLmh0bWwiPmRzX19EU0FLZXlWYWx1ZVR5cGU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPiJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpEU0FLZXlWYWx1ZVR5cGUgaXMgYSBjb21wbGV4VHlwZS4gIDxhIGhyZWY9InN0cnVjdGRzX19fX19kX3NfYV9rZXlfdmFsdWVfdHlwZS5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0cnVjdCAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3Jfc19hX2tleV92YWx1ZV90eXBlLmh0bWwiPmRzX19SU0FLZXlWYWx1ZVR5cGU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPiJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpSU0FLZXlWYWx1ZVR5cGUgaXMgYSBjb21wbGV4VHlwZS4gIDxhIGhyZWY9InN0cnVjdGRzX19fX19yX3NfYV9rZXlfdmFsdWVfdHlwZS5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5UeXBlZGVmczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD50eXBlZGVmIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25hdHVyZV90eXBlLmh0bWwiPmRzX19TaWduYXR1cmVUeXBlPC9hPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJkc184aC5odG1sI2EwIj5kc19fU2lnbmF0dXJlVHlwZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+SW1wb3J0ZWQgY29tcGxleFR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlNpZ25hdHVyZVR5cGUgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2EwIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+dHlwZWRlZiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduZWRfaW5mb190eXBlLmh0bWwiPmRzX19TaWduZWRJbmZvVHlwZTwvYT4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iZHNfOGguaHRtbCNhMSI+ZHNfX1NpZ25lZEluZm9UeXBlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5UeXBlZGVmIHN5bm9ueW0gZm9yIHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduZWRfaW5mb190eXBlLmh0bWwiPmRzX19TaWduZWRJbmZvVHlwZTwvYT4uICA8YSBocmVmPSIjYTEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD50eXBlZGVmIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2Nhbm9uaWNhbGl6YXRpb25fbWV0aG9kX3R5cGUuaHRtbCI+ZHNfX0Nhbm9uaWNhbGl6YXRpb25NZXRob2RUeXBlPC9hPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJkc184aC5odG1sI2EyIj5kc19fQ2Fub25pY2FsaXphdGlvbk1ldGhvZFR5cGU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlR5cGVkZWYgc3lub255bSBmb3Igc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2Nhbm9uaWNhbGl6YXRpb25fbWV0aG9kX3R5cGUuaHRtbCI+ZHNfX0Nhbm9uaWNhbGl6YXRpb25NZXRob2RUeXBlPC9hPi4gIDxhIGhyZWY9IiNhMiI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnR5cGVkZWYgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmF0dXJlX21ldGhvZF90eXBlLmh0bWwiPmRzX19TaWduYXR1cmVNZXRob2RUeXBlPC9hPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJkc184aC5odG1sI2EzIj5kc19fU2lnbmF0dXJlTWV0aG9kVHlwZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VHlwZWRlZiBzeW5vbnltIGZvciBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmF0dXJlX21ldGhvZF90eXBlLmh0bWwiPmRzX19TaWduYXR1cmVNZXRob2RUeXBlPC9hPi4gIDxhIGhyZWY9IiNhMyI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnR5cGVkZWYgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fcmVmZXJlbmNlX3R5cGUuaHRtbCI+ZHNfX1JlZmVyZW5jZVR5cGU8L2E+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImRzXzhoLmh0bWwjYTQiPmRzX19SZWZlcmVuY2VUeXBlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5UeXBlZGVmIHN5bm9ueW0gZm9yIHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19yZWZlcmVuY2VfdHlwZS5odG1sIj5kc19fUmVmZXJlbmNlVHlwZTwvYT4uICA8YSBocmVmPSIjYTQiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD50eXBlZGVmIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3RyYW5zZm9ybXNfdHlwZS5odG1sIj5kc19fVHJhbnNmb3Jtc1R5cGU8L2E+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImRzXzhoLmh0bWwjYTUiPmRzX19UcmFuc2Zvcm1zVHlwZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VHlwZWRlZiBzeW5vbnltIGZvciBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fdHJhbnNmb3Jtc190eXBlLmh0bWwiPmRzX19UcmFuc2Zvcm1zVHlwZTwvYT4uICA8YSBocmVmPSIjYTUiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD50eXBlZGVmIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3RyYW5zZm9ybV90eXBlLmh0bWwiPmRzX19UcmFuc2Zvcm1UeXBlPC9hPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJkc184aC5odG1sI2E2Ij5kc19fVHJhbnNmb3JtVHlwZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+SW1wb3J0ZWQgY29tcGxleFR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlRyYW5zZm9ybVR5cGUgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2E2Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+dHlwZWRlZiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19kaWdlc3RfbWV0aG9kX3R5cGUuaHRtbCI+ZHNfX0RpZ2VzdE1ldGhvZFR5cGU8L2E+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImRzXzhoLmh0bWwjYTciPmRzX19EaWdlc3RNZXRob2RUeXBlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5UeXBlZGVmIHN5bm9ueW0gZm9yIHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19kaWdlc3RfbWV0aG9kX3R5cGUuaHRtbCI+ZHNfX0RpZ2VzdE1ldGhvZFR5cGU8L2E+LiAgPGEgaHJlZj0iI2E3Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+dHlwZWRlZiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19rZXlfaW5mb190eXBlLmh0bWwiPmRzX19LZXlJbmZvVHlwZTwvYT4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0iZHNfOGguaHRtbCNhOCI+ZHNfX0tleUluZm9UeXBlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5JbXBvcnRlZCBjb21wbGV4VHlwZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6S2V5SW5mb1R5cGUgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2E4Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+dHlwZWRlZiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19rZXlfdmFsdWVfdHlwZS5odG1sIj5kc19fS2V5VmFsdWVUeXBlPC9hPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJkc184aC5odG1sI2E5Ij5kc19fS2V5VmFsdWVUeXBlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5UeXBlZGVmIHN5bm9ueW0gZm9yIHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19rZXlfdmFsdWVfdHlwZS5odG1sIj5kc19fS2V5VmFsdWVUeXBlPC9hPi4gIDxhIGhyZWY9IiNhOSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnR5cGVkZWYgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fcmV0cmlldmFsX21ldGhvZF90eXBlLmh0bWwiPmRzX19SZXRyaWV2YWxNZXRob2RUeXBlPC9hPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJkc184aC5odG1sI2ExMCI+ZHNfX1JldHJpZXZhbE1ldGhvZFR5cGU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlR5cGVkZWYgc3lub255bSBmb3Igc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3JldHJpZXZhbF9tZXRob2RfdHlwZS5odG1sIj5kc19fUmV0cmlldmFsTWV0aG9kVHlwZTwvYT4uICA8YSBocmVmPSIjYTEwIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+dHlwZWRlZiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX194NTA5X2RhdGFfdHlwZS5odG1sIj5kc19fWDUwOURhdGFUeXBlPC9hPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJkc184aC5odG1sI2ExMSI+ZHNfX1g1MDlEYXRhVHlwZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VHlwZWRlZiBzeW5vbnltIGZvciBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19feDUwOV9kYXRhX3R5cGUuaHRtbCI+ZHNfX1g1MDlEYXRhVHlwZTwvYT4uICA8YSBocmVmPSIjYTExIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+dHlwZWRlZiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX194NTA5X2lzc3Vlcl9zZXJpYWxfdHlwZS5odG1sIj5kc19fWDUwOUlzc3VlclNlcmlhbFR5cGU8L2E+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9ImRzXzhoLmh0bWwjYTEyIj5kc19fWDUwOUlzc3VlclNlcmlhbFR5cGU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlR5cGVkZWYgc3lub255bSBmb3Igc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3g1MDlfaXNzdWVyX3NlcmlhbF90eXBlLmh0bWwiPmRzX19YNTA5SXNzdWVyU2VyaWFsVHlwZTwvYT4uICA8YSBocmVmPSIjYTEyIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+dHlwZWRlZiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19kX3NfYV9rZXlfdmFsdWVfdHlwZS5odG1sIj5kc19fRFNBS2V5VmFsdWVUeXBlPC9hPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJkc184aC5odG1sI2ExMyI+ZHNfX0RTQUtleVZhbHVlVHlwZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VHlwZWRlZiBzeW5vbnltIGZvciBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fZF9zX2Ffa2V5X3ZhbHVlX3R5cGUuaHRtbCI+ZHNfX0RTQUtleVZhbHVlVHlwZTwvYT4uICA8YSBocmVmPSIjYTEzIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+dHlwZWRlZiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19yX3NfYV9rZXlfdmFsdWVfdHlwZS5odG1sIj5kc19fUlNBS2V5VmFsdWVUeXBlPC9hPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJkc184aC5odG1sI2ExNCI+ZHNfX1JTQUtleVZhbHVlVHlwZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VHlwZWRlZiBzeW5vbnltIGZvciBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fcl9zX2Ffa2V5X3ZhbHVlX3R5cGUuaHRtbCI+ZHNfX1JTQUtleVZhbHVlVHlwZTwvYT4uICA8YSBocmVmPSIjYTE0Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzxocj48aDI+VHlwZWRlZiBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMiIgZG94eXRhZz0iZHMuaDo6ZHNfX0Nhbm9uaWNhbGl6YXRpb25NZXRob2RUeXBlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHR5cGVkZWYgc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2Nhbm9uaWNhbGl6YXRpb25fbWV0aG9kX3R5cGUuaHRtbCI+ZHNfX0Nhbm9uaWNhbGl6YXRpb25NZXRob2RUeXBlPC9hPiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19jYW5vbmljYWxpemF0aW9uX21ldGhvZF90eXBlLmh0bWwiPmRzX19DYW5vbmljYWxpemF0aW9uTWV0aG9kVHlwZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitUeXBlZGVmIHN5bm9ueW0gZm9yIHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19jYW5vbmljYWxpemF0aW9uX21ldGhvZF90eXBlLmh0bWwiPmRzX19DYW5vbmljYWxpemF0aW9uTWV0aG9kVHlwZTwvYT4uIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE3IiBkb3h5dGFnPSJkcy5oOjpkc19fRGlnZXN0TWV0aG9kVHlwZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB0eXBlZGVmIHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19kaWdlc3RfbWV0aG9kX3R5cGUuaHRtbCI+ZHNfX0RpZ2VzdE1ldGhvZFR5cGU8L2E+IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2RpZ2VzdF9tZXRob2RfdHlwZS5odG1sIj5kc19fRGlnZXN0TWV0aG9kVHlwZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitUeXBlZGVmIHN5bm9ueW0gZm9yIHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19kaWdlc3RfbWV0aG9kX3R5cGUuaHRtbCI+ZHNfX0RpZ2VzdE1ldGhvZFR5cGU8L2E+LiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMTMiIGRveHl0YWc9ImRzLmg6OmRzX19EU0FLZXlWYWx1ZVR5cGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdHlwZWRlZiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fZF9zX2Ffa2V5X3ZhbHVlX3R5cGUuaHRtbCI+ZHNfX0RTQUtleVZhbHVlVHlwZTwvYT4gPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fZF9zX2Ffa2V5X3ZhbHVlX3R5cGUuaHRtbCI+ZHNfX0RTQUtleVZhbHVlVHlwZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitUeXBlZGVmIHN5bm9ueW0gZm9yIHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19kX3NfYV9rZXlfdmFsdWVfdHlwZS5odG1sIj5kc19fRFNBS2V5VmFsdWVUeXBlPC9hPi4gDQorPHA+DQorSW1wb3J0ZWQgY29tcGxleFR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlNpZ25hdHVyZVByb3BlcnR5VHlwZSBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuIGNvbXBsZXhUeXBlIGRlZmluaXRpb24gaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhOCIgZG94eXRhZz0iZHMuaDo6ZHNfX0tleUluZm9UeXBlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHR5cGVkZWYgc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2tleV9pbmZvX3R5cGUuaHRtbCI+ZHNfX0tleUluZm9UeXBlPC9hPiAgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fa2V5X2luZm9fdHlwZS5odG1sIj5kc19fS2V5SW5mb1R5cGU8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorSW1wb3J0ZWQgY29tcGxleFR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOktleUluZm9UeXBlIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTkiIGRveHl0YWc9ImRzLmg6OmRzX19LZXlWYWx1ZVR5cGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdHlwZWRlZiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fa2V5X3ZhbHVlX3R5cGUuaHRtbCI+ZHNfX0tleVZhbHVlVHlwZTwvYT4gPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fa2V5X3ZhbHVlX3R5cGUuaHRtbCI+ZHNfX0tleVZhbHVlVHlwZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitUeXBlZGVmIHN5bm9ueW0gZm9yIHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19rZXlfdmFsdWVfdHlwZS5odG1sIj5kc19fS2V5VmFsdWVUeXBlPC9hPi4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTQiIGRveHl0YWc9ImRzLmg6OmRzX19SZWZlcmVuY2VUeXBlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHR5cGVkZWYgc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3JlZmVyZW5jZV90eXBlLmh0bWwiPmRzX19SZWZlcmVuY2VUeXBlPC9hPiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19yZWZlcmVuY2VfdHlwZS5odG1sIj5kc19fUmVmZXJlbmNlVHlwZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitUeXBlZGVmIHN5bm9ueW0gZm9yIHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19yZWZlcmVuY2VfdHlwZS5odG1sIj5kc19fUmVmZXJlbmNlVHlwZTwvYT4uIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExMCIgZG94eXRhZz0iZHMuaDo6ZHNfX1JldHJpZXZhbE1ldGhvZFR5cGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdHlwZWRlZiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fcmV0cmlldmFsX21ldGhvZF90eXBlLmh0bWwiPmRzX19SZXRyaWV2YWxNZXRob2RUeXBlPC9hPiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19yZXRyaWV2YWxfbWV0aG9kX3R5cGUuaHRtbCI+ZHNfX1JldHJpZXZhbE1ldGhvZFR5cGU8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVHlwZWRlZiBzeW5vbnltIGZvciBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fcmV0cmlldmFsX21ldGhvZF90eXBlLmh0bWwiPmRzX19SZXRyaWV2YWxNZXRob2RUeXBlPC9hPi4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTE0IiBkb3h5dGFnPSJkcy5oOjpkc19fUlNBS2V5VmFsdWVUeXBlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHR5cGVkZWYgc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3Jfc19hX2tleV92YWx1ZV90eXBlLmh0bWwiPmRzX19SU0FLZXlWYWx1ZVR5cGU8L2E+IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3Jfc19hX2tleV92YWx1ZV90eXBlLmh0bWwiPmRzX19SU0FLZXlWYWx1ZVR5cGU8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVHlwZWRlZiBzeW5vbnltIGZvciBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fcl9zX2Ffa2V5X3ZhbHVlX3R5cGUuaHRtbCI+ZHNfX1JTQUtleVZhbHVlVHlwZTwvYT4uIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEzIiBkb3h5dGFnPSJkcy5oOjpkc19fU2lnbmF0dXJlTWV0aG9kVHlwZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB0eXBlZGVmIHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduYXR1cmVfbWV0aG9kX3R5cGUuaHRtbCI+ZHNfX1NpZ25hdHVyZU1ldGhvZFR5cGU8L2E+IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25hdHVyZV9tZXRob2RfdHlwZS5odG1sIj5kc19fU2lnbmF0dXJlTWV0aG9kVHlwZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitUeXBlZGVmIHN5bm9ueW0gZm9yIHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduYXR1cmVfbWV0aG9kX3R5cGUuaHRtbCI+ZHNfX1NpZ25hdHVyZU1ldGhvZFR5cGU8L2E+LiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMCIgZG94eXRhZz0iZHMuaDo6ZHNfX1NpZ25hdHVyZVR5cGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdHlwZWRlZiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmF0dXJlX3R5cGUuaHRtbCI+ZHNfX1NpZ25hdHVyZVR5cGU8L2E+ICA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduYXR1cmVfdHlwZS5odG1sIj5kc19fU2lnbmF0dXJlVHlwZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitJbXBvcnRlZCBjb21wbGV4VHlwZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6U2lnbmF0dXJlVHlwZSBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExIiBkb3h5dGFnPSJkcy5oOjpkc19fU2lnbmVkSW5mb1R5cGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdHlwZWRlZiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmVkX2luZm9fdHlwZS5odG1sIj5kc19fU2lnbmVkSW5mb1R5cGU8L2E+IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGUuaHRtbCI+ZHNfX1NpZ25lZEluZm9UeXBlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1R5cGVkZWYgc3lub255bSBmb3Igc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGUuaHRtbCI+ZHNfX1NpZ25lZEluZm9UeXBlPC9hPi4gDQorPHA+DQorSW1wb3J0ZWQgY29tcGxleFR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlNpZ25hdHVyZVZhbHVlVHlwZSBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuIGNvbXBsZXhUeXBlIGRlZmluaXRpb24gaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNSIgZG94eXRhZz0iZHMuaDo6ZHNfX1RyYW5zZm9ybXNUeXBlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHR5cGVkZWYgc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3RyYW5zZm9ybXNfdHlwZS5odG1sIj5kc19fVHJhbnNmb3Jtc1R5cGU8L2E+IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3RyYW5zZm9ybXNfdHlwZS5odG1sIj5kc19fVHJhbnNmb3Jtc1R5cGU8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVHlwZWRlZiBzeW5vbnltIGZvciBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fdHJhbnNmb3Jtc190eXBlLmh0bWwiPmRzX19UcmFuc2Zvcm1zVHlwZTwvYT4uIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE2IiBkb3h5dGFnPSJkcy5oOjpkc19fVHJhbnNmb3JtVHlwZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB0eXBlZGVmIHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX190cmFuc2Zvcm1fdHlwZS5odG1sIj5kc19fVHJhbnNmb3JtVHlwZTwvYT4gIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3RyYW5zZm9ybV90eXBlLmh0bWwiPmRzX19UcmFuc2Zvcm1UeXBlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0ltcG9ydGVkIGNvbXBsZXhUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpUcmFuc2Zvcm1UeXBlIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTExIiBkb3h5dGFnPSJkcy5oOjpkc19fWDUwOURhdGFUeXBlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHR5cGVkZWYgc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3g1MDlfZGF0YV90eXBlLmh0bWwiPmRzX19YNTA5RGF0YVR5cGU8L2E+IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3g1MDlfZGF0YV90eXBlLmh0bWwiPmRzX19YNTA5RGF0YVR5cGU8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVHlwZWRlZiBzeW5vbnltIGZvciBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19feDUwOV9kYXRhX3R5cGUuaHRtbCI+ZHNfX1g1MDlEYXRhVHlwZTwvYT4uIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExMiIgZG94eXRhZz0iZHMuaDo6ZHNfX1g1MDlJc3N1ZXJTZXJpYWxUeXBlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHR5cGVkZWYgc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3g1MDlfaXNzdWVyX3NlcmlhbF90eXBlLmh0bWwiPmRzX19YNTA5SXNzdWVyU2VyaWFsVHlwZTwvYT4gPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19feDUwOV9pc3N1ZXJfc2VyaWFsX3R5cGUuaHRtbCI+ZHNfX1g1MDlJc3N1ZXJTZXJpYWxUeXBlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1R5cGVkZWYgc3lub255bSBmb3Igc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3g1MDlfaXNzdWVyX3NlcmlhbF90eXBlLmh0bWwiPmRzX19YNTA5SXNzdWVyU2VyaWFsVHlwZTwvYT4uIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBGcmkgQXVnIDE5IDEwOjQxOjQ1IDIwMDUgZm9yIGdTT0FQIFdTLVNlY3VyaXR5IGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL2ZpbGVzLmh0bWwgYi9kb2Mvd3NzZS9odG1sL2ZpbGVzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2ODBlNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvZmlsZXMuaHRtbApAQCAtMCwwICsxLDIyIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBXUy1TZWN1cml0eTogRmlsZSBJbmRleDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4SEwiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPmdTT0FQIFdTLVNlY3VyaXR5IEZpbGUgTGlzdDwvaDE+SGVyZSBpcyBhIGxpc3Qgb2YgYWxsIGZpbGVzIHdpdGggYnJpZWYgZGVzY3JpcHRpb25zOjx0YWJsZT4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2Mvd3NzZS88YSBjbGFzcz0iZWwiIGhyZWY9ImMxNG5fOGguaHRtbCI+YzE0bi5oPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj48L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3dzc2UvPGEgY2xhc3M9ImVsIiBocmVmPSJkc184aC5odG1sIj5kcy5oPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj48L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3dzc2UvPGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGMuaHRtbCI+c21kZXZwLmM8L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPjwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2Mvd3NzZS88YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84aC5odG1sIj5zbWRldnAuaDwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+PC90ZD48L3RyPg0KKyAgPHRyPjx0ZCBjbGFzcz0iaW5kZXhrZXkiPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy93c3NlLzxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZV84aC5odG1sIj53c3NlLmg8L2E+PC90ZD48dGQgY2xhc3M9ImluZGV4dmFsdWUiPjwvdGQ+PC90cj4NCisgIDx0cj48dGQgY2xhc3M9ImluZGV4a2V5Ij4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2Mvd3NzZS88YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCI+d3NzZWFwaS5jPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj48L3RkPjwvdHI+DQorICA8dHI+PHRkIGNsYXNzPSJpbmRleGtleSI+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3dzc2UvPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwiPndzc2VhcGkuaDwvYT48L3RkPjx0ZCBjbGFzcz0iaW5kZXh2YWx1ZSI+PC90ZD48L3RyPg0KKyAgPHRyPjx0ZCBjbGFzcz0iaW5kZXhrZXkiPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy93c3NlLzxhIGNsYXNzPSJlbCIgaHJlZj0id3N1XzhoLmh0bWwiPndzdS5oPC9hPjwvdGQ+PHRkIGNsYXNzPSJpbmRleHZhbHVlIj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gRnJpIEF1ZyAxOSAxMDo0MTo0NSAyMDA1IGZvciBnU09BUCBXUy1TZWN1cml0eSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9mdW5jdGlvbnMuaHRtbCBiL2RvYy93c3NlL2h0bWwvZnVuY3Rpb25zLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRiMWNlZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvZnVuY3Rpb25zLmh0bWwKQEAgLTAsMCArMSwxNTUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFdTLVNlY3VyaXR5OiBDbGFzcyBNZW1iZXJzPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXhITCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXhITCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkFsbDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnNfdmFycy5odG1sIj5WYXJpYWJsZXM8L2E+PC9kaXY+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfXyI+XzwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfYSI+YTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfYiI+YjwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfYyI+YzwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfZCI+ZDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfZSI+ZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfZiI+ZjwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfZyI+ZzwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfaCI+aDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfaSI+aTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfaiI+ajwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfayI+azwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfbCI+bDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfbSI+bTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfbiI+bjwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfcCI+cDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfcSI+cTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfciI+cjwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfcyI+czwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfdCI+dDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfdSI+dTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfdiI+djwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfdyI+dzwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfeCI+eDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfeSI+eTwvYT48L2Rpdj4NCisNCis8cD4NCisNCis8cD4NCitIZXJlIGlzIGEgbGlzdCBvZiBhbGwgY2xhc3MgbWVtYmVycyB3aXRoIGxpbmtzIHRvIHRoZSBjbGFzc2VzIHRoZXkgYmVsb25nIHRvOjxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF9fIj4tIF8gLTwvYT48L2gzPjx1bD4NCis8bGk+X19hbnkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3RyYW5zZm9ybV90eXBlLmh0bWwjbzEiPmRzX19UcmFuc2Zvcm1UeXBlPC9hPjxsaT5fX2l0ZW0NCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19wYXNzd29yZC5odG1sI28wIj5fd3NzZV9fUGFzc3dvcmQ8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fa2V5X2lkZW50aWZpZXIuaHRtbCNvMCI+X3dzc2VfX0tleUlkZW50aWZpZXI8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fYmluYXJ5X3NlY3VyaXR5X3Rva2VuLmh0bWwjbzAiPl93c3NlX19CaW5hcnlTZWN1cml0eVRva2VuPC9hPjxsaT5fX3NpemVSZWZlcmVuY2UNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGUuaHRtbCNvMiI+ZHNfX1NpZ25lZEluZm9UeXBlPC9hPjxsaT5fX3NpemVUcmFuc2Zvcm0NCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3RyYW5zZm9ybXNfdHlwZS5odG1sI28wIj5kc19fVHJhbnNmb3Jtc1R5cGU8L2E+PC91bD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfYSI+LSBhIC08L2E+PC9oMz48dWw+DQorPGxpPmFsZw0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19zbWRfX2RhdGEuaHRtbCNvMCI+c29hcF9zbWRfZGF0YTwvYT48bGk+QWxnb3JpdGhtDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19kaWdlc3RfbWV0aG9kX3R5cGUuaHRtbCNvMCI+ZHNfX0RpZ2VzdE1ldGhvZFR5cGU8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduYXR1cmVfbWV0aG9kX3R5cGUuaHRtbCNvMSI+ZHNfX1NpZ25hdHVyZU1ldGhvZFR5cGU8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19jYW5vbmljYWxpemF0aW9uX21ldGhvZF90eXBlLmh0bWwjbzAiPmRzX19DYW5vbmljYWxpemF0aW9uTWV0aG9kVHlwZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3RyYW5zZm9ybV90eXBlLmh0bWwjbzIiPmRzX19UcmFuc2Zvcm1UeXBlPC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X2IiPi0gYiAtPC9hPjwvaDM+PHVsPg0KKzxsaT5CaW5hcnlTZWN1cml0eVRva2VuDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHkuaHRtbCNvMiI+X3dzc2VfX1NlY3VyaXR5PC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X2MiPi0gYyAtPC9hPjwvaDM+PHVsPg0KKzxsaT5jMTRuX19JbmNsdXNpdmVOYW1lc3BhY2VzDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19jYW5vbmljYWxpemF0aW9uX21ldGhvZF90eXBlLmh0bWwjbzEiPmRzX19DYW5vbmljYWxpemF0aW9uTWV0aG9kVHlwZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3RyYW5zZm9ybV90eXBlLmh0bWwjbzAiPmRzX19UcmFuc2Zvcm1UeXBlPC9hPjxsaT5DYW5vbmljYWxpemF0aW9uTWV0aG9kDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduZWRfaW5mb190eXBlLmh0bWwjbzAiPmRzX19TaWduZWRJbmZvVHlwZTwvYT48bGk+Q3JlYXRlZA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzdV9fX19fdGltZXN0YW1wLmh0bWwjbzEiPl93c3VfX1RpbWVzdGFtcDwvYT48bGk+Y3R4DQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3NtZF9fZGF0YS5odG1sI28xIj5zb2FwX3NtZF9kYXRhPC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X2QiPi0gZCAtPC9hPjwvaDM+PHVsPg0KKzxsaT5kaWdlc3QNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fZGF0YS5odG1sI282Ij5zb2FwX3dzc2VfZGF0YTwvYT48bGk+RGlnZXN0TWV0aG9kDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19yZWZlcmVuY2VfdHlwZS5odG1sI28xIj5kc19fUmVmZXJlbmNlVHlwZTwvYT48bGk+RGlnZXN0VmFsdWUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3JlZmVyZW5jZV90eXBlLmh0bWwjbzIiPmRzX19SZWZlcmVuY2VUeXBlPC9hPjxsaT5kc19fU2lnbmF0dXJlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHkuaHRtbCNvMyI+X3dzc2VfX1NlY3VyaXR5PC9hPjxsaT5EU0FLZXlWYWx1ZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fa2V5X3ZhbHVlX3R5cGUuaHRtbCNvMCI+ZHNfX0tleVZhbHVlVHlwZTwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF9lIj4tIGUgLTwvYT48L2gzPjx1bD4NCis8bGk+RW1iZWRkZWQNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eV90b2tlbl9yZWZlcmVuY2UuaHRtbCNvMiI+X3dzc2VfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2U8L2E+PGxpPkVuY29kaW5nVHlwZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2tleV9pZGVudGlmaWVyLmh0bWwjbzMiPl93c3NlX19LZXlJZGVudGlmaWVyPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2JpbmFyeV9zZWN1cml0eV90b2tlbi5odG1sI28zIj5fd3NzZV9fQmluYXJ5U2VjdXJpdHlUb2tlbjwvYT48bGk+ZXhwaXJlZA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19zZXNzaW9uLmh0bWwjbzEiPnNvYXBfd3NzZV9zZXNzaW9uPC9hPjxsaT5FeHBpcmVzDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3N1X19fX190aW1lc3RhbXAuaHRtbCNvMiI+X3dzdV9fVGltZXN0YW1wPC9hPjxsaT5FeHBvbmVudA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fcl9zX2Ffa2V5X3ZhbHVlX3R5cGUuaHRtbCNvMSI+ZHNfX1JTQUtleVZhbHVlVHlwZTwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF9mIj4tIGYgLTwvYT48L2gzPjx1bD4NCis8bGk+ZmRpc2Nvbm5lY3QNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fZGF0YS5odG1sI28xMCI+c29hcF93c3NlX2RhdGE8L2E+PGxpPmZwcmVwYXJlZmluYWwNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fZGF0YS5odG1sI285Ij5zb2FwX3dzc2VfZGF0YTwvYT48bGk+ZnByZXBhcmVpbml0DQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RhdGEuaHRtbCNvNyI+c29hcF93c3NlX2RhdGE8L2E+PGxpPmZwcmVwYXJlc2VuZA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kYXRhLmh0bWwjbzgiPnNvYXBfd3NzZV9kYXRhPC9hPjxsaT5mcmVjdg0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19zbWRfX2RhdGEuaHRtbCNvNCI+c29hcF9zbWRfZGF0YTwvYT48bGk+ZnNlbmQNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fc21kX19kYXRhLmh0bWwjbzMiPnNvYXBfc21kX2RhdGE8L2E+PC91bD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfZyI+LSBnIC08L2E+PC9oMz48dWw+DQorPGxpPkcNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2Rfc19hX2tleV92YWx1ZV90eXBlLmh0bWwjbzAiPmRzX19EU0FLZXlWYWx1ZVR5cGU8L2E+PC91bD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfaCI+LSBoIC08L2E+PC9oMz48dWw+DQorPGxpPmhhc2gNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fZGlnZXN0Lmh0bWwjbzMiPnNvYXBfd3NzZV9kaWdlc3Q8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX3Nlc3Npb24uaHRtbCNvMiI+c29hcF93c3NlX3Nlc3Npb248L2E+PGxpPkhNQUNPdXRwdXRMZW5ndGgNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25hdHVyZV9tZXRob2RfdHlwZS5odG1sI28wIj5kc19fU2lnbmF0dXJlTWV0aG9kVHlwZTwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF9pIj4tIGkgLTwvYT48L2gzPjx1bD4NCis8bGk+aWQNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fZGlnZXN0Lmh0bWwjbzQiPnNvYXBfd3NzZV9kaWdlc3Q8L2E+PGxpPklkDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19yZWZlcmVuY2VfdHlwZS5odG1sI28zIj5kc19fUmVmZXJlbmNlVHlwZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGUuaHRtbCNvNCI+ZHNfX1NpZ25lZEluZm9UeXBlPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fa2V5X2luZm9fdHlwZS5odG1sI281Ij5kc19fS2V5SW5mb1R5cGU8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduYXR1cmVfdHlwZS5odG1sI28zIj5kc19fU2lnbmF0dXJlVHlwZTwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF9qIj4tIGogLTwvYT48L2gzPjx1bD4NCis8bGk+Sg0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fZF9zX2Ffa2V5X3ZhbHVlX3R5cGUuaHRtbCNvMiI+ZHNfX0RTQUtleVZhbHVlVHlwZTwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF9rIj4tIGsgLTwvYT48L2gzPjx1bD4NCis8bGk+a2V5DQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3NtZF9fZGF0YS5odG1sI28yIj5zb2FwX3NtZF9kYXRhPC9hPjxsaT5LZXlJZGVudGlmaWVyDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHlfdG9rZW5fcmVmZXJlbmNlLmh0bWwjbzEiPl93c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlPC9hPjxsaT5LZXlJbmZvDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduYXR1cmVfdHlwZS5odG1sI28yIj5kc19fU2lnbmF0dXJlVHlwZTwvYT48bGk+S2V5TmFtZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fa2V5X2luZm9fdHlwZS5odG1sI28wIj5kc19fS2V5SW5mb1R5cGU8L2E+PGxpPktleVZhbHVlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19rZXlfaW5mb190eXBlLmh0bWwjbzEiPmRzX19LZXlJbmZvVHlwZTwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF9sIj4tIGwgLTwvYT48L2gzPjx1bD4NCis8bGk+bGV2ZWwNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fZGlnZXN0Lmh0bWwjbzEiPnNvYXBfd3NzZV9kaWdlc3Q8L2E+PC91bD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfbSI+LSBtIC08L2E+PC9oMz48dWw+DQorPGxpPm1vZGUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fc21kX19kYXRhLmh0bWwjbzUiPnNvYXBfc21kX2RhdGE8L2E+PGxpPk1vZHVsdXMNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3Jfc19hX2tleV92YWx1ZV90eXBlLmh0bWwjbzAiPmRzX19SU0FLZXlWYWx1ZVR5cGU8L2E+PC91bD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfbiI+LSBuIC08L2E+PC9oMz48dWw+DQorPGxpPm5leHQNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fZGlnZXN0Lmh0bWwjbzAiPnNvYXBfd3NzZV9kaWdlc3Q8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX3Nlc3Npb24uaHRtbCNvMCI+c29hcF93c3NlX3Nlc3Npb248L2E+PGxpPm5vbmNlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX3Nlc3Npb24uaHRtbCNvMyI+c29hcF93c3NlX3Nlc3Npb248L2E+PGxpPk5vbmNlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fdXNlcm5hbWVfdG9rZW4uaHRtbCNvMiI+X3dzc2VfX1VzZXJuYW1lVG9rZW48L2E+PC91bD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfcCI+LSBwIC08L2E+PC9oMz48dWw+DQorPGxpPlANCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2Rfc19hX2tleV92YWx1ZV90eXBlLmh0bWwjbzMiPmRzX19EU0FLZXlWYWx1ZVR5cGU8L2E+PGxpPlBhc3N3b3JkDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fdXNlcm5hbWVfdG9rZW4uaHRtbCNvMSI+X3dzc2VfX1VzZXJuYW1lVG9rZW48L2E+PGxpPlBnZW5Db3VudGVyDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19kX3NfYV9rZXlfdmFsdWVfdHlwZS5odG1sI282Ij5kc19fRFNBS2V5VmFsdWVUeXBlPC9hPjxsaT5QcmVmaXhMaXN0DQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fYzE0bl9fX19faW5jbHVzaXZlX25hbWVzcGFjZXMuaHRtbCNvMCI+X2MxNG5fX0luY2x1c2l2ZU5hbWVzcGFjZXM8L2E+PC91bD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfcSI+LSBxIC08L2E+PC9oMz48dWw+DQorPGxpPlENCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2Rfc19hX2tleV92YWx1ZV90eXBlLmh0bWwjbzQiPmRzX19EU0FLZXlWYWx1ZVR5cGU8L2E+PC91bD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfciI+LSByIC08L2E+PC9oMz48dWw+DQorPGxpPlJlZmVyZW5jZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5X3Rva2VuX3JlZmVyZW5jZS5odG1sI28wIj5fd3NzZV9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGUuaHRtbCNvMyI+ZHNfX1NpZ25lZEluZm9UeXBlPC9hPjxsaT5SZXRyaWV2YWxNZXRob2QNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2tleV9pbmZvX3R5cGUuaHRtbCNvMiI+ZHNfX0tleUluZm9UeXBlPC9hPjxsaT5SU0FLZXlWYWx1ZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fa2V5X3ZhbHVlX3R5cGUuaHRtbCNvMSI+ZHNfX0tleVZhbHVlVHlwZTwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF9zIj4tIHMgLTwvYT48L2gzPjx1bD4NCis8bGk+U2VlZA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fZF9zX2Ffa2V5X3ZhbHVlX3R5cGUuaHRtbCNvNSI+ZHNfX0RTQUtleVZhbHVlVHlwZTwvYT48bGk+c2lnbl9hbGcNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fZGF0YS5odG1sI28wIj5zb2FwX3dzc2VfZGF0YTwvYT48bGk+c2lnbl9rZXkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fZGF0YS5odG1sI28xIj5zb2FwX3dzc2VfZGF0YTwvYT48bGk+c2lnbl9rZXlsZW4NCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fZGF0YS5odG1sI28yIj5zb2FwX3dzc2VfZGF0YTwvYT48bGk+U2lnbmF0dXJlTWV0aG9kDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduZWRfaW5mb190eXBlLmh0bWwjbzEiPmRzX19TaWduZWRJbmZvVHlwZTwvYT48bGk+U2lnbmF0dXJlVmFsdWUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25hdHVyZV90eXBlLmh0bWwjbzEiPmRzX19TaWduYXR1cmVUeXBlPC9hPjxsaT5TaWduZWRJbmZvDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduYXR1cmVfdHlwZS5odG1sI28wIj5kc19fU2lnbmF0dXJlVHlwZTwvYT48bGk+c21kDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RpZ2VzdC5odG1sI28yIj5zb2FwX3dzc2VfZGlnZXN0PC9hPjxsaT5TT0FQX0VOVl9fYWN0b3INCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eS5odG1sI280Ij5fd3NzZV9fU2VjdXJpdHk8L2E+PGxpPlNPQVBfRU5WX19yb2xlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHkuaHRtbCNvNSI+X3dzc2VfX1NlY3VyaXR5PC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X3QiPi0gdCAtPC9hPjwvaDM+PHVsPg0KKzxsaT5UcmFuc2Zvcm0NCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3RyYW5zZm9ybXNfdHlwZS5odG1sI28xIj5kc19fVHJhbnNmb3Jtc1R5cGU8L2E+PGxpPlRyYW5zZm9ybXMNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3JldHJpZXZhbF9tZXRob2RfdHlwZS5odG1sI28wIj5kc19fUmV0cmlldmFsTWV0aG9kVHlwZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3JlZmVyZW5jZV90eXBlLmh0bWwjbzAiPmRzX19SZWZlcmVuY2VUeXBlPC9hPjxsaT5UeXBlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fcGFzc3dvcmQuaHRtbCNvMSI+X3dzc2VfX1Bhc3N3b3JkPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fcmV0cmlldmFsX21ldGhvZF90eXBlLmh0bWwjbzIiPmRzX19SZXRyaWV2YWxNZXRob2RUeXBlPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fcmVmZXJlbmNlX3R5cGUuaHRtbCNvNSI+ZHNfX1JlZmVyZW5jZVR5cGU8L2E+PC91bD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfdSI+LSB1IC08L2E+PC9oMz48dWw+DQorPGxpPlVSSQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3JlZmVyZW5jZS5odG1sI28wIj5fd3NzZV9fUmVmZXJlbmNlPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fcmV0cmlldmFsX21ldGhvZF90eXBlLmh0bWwjbzEiPmRzX19SZXRyaWV2YWxNZXRob2RUeXBlPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fcmVmZXJlbmNlX3R5cGUuaHRtbCNvNCI+ZHNfX1JlZmVyZW5jZVR5cGU8L2E+PGxpPlVzYWdlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHlfdG9rZW5fcmVmZXJlbmNlLmh0bWwjbzQiPl93c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlPC9hPjxsaT51c2VyDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3NtZF9fZGF0YS5odG1sI282Ij5zb2FwX3NtZF9kYXRhPC9hPjxsaT5Vc2VybmFtZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3VzZXJuYW1lX3Rva2VuLmh0bWwjbzAiPl93c3NlX19Vc2VybmFtZVRva2VuPC9hPjxsaT5Vc2VybmFtZVRva2VuDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHkuaHRtbCNvMSI+X3dzc2VfX1NlY3VyaXR5PC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X3YiPi0gdiAtPC9hPjwvaDM+PHVsPg0KKzxsaT5WYWx1ZVR5cGUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19rZXlfaWRlbnRpZmllci5odG1sI28yIj5fd3NzZV9fS2V5SWRlbnRpZmllcjwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19lbWJlZGRlZC5odG1sI28xIj5fd3NzZV9fRW1iZWRkZWQ8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fcmVmZXJlbmNlLmh0bWwjbzEiPl93c3NlX19SZWZlcmVuY2U8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fYmluYXJ5X3NlY3VyaXR5X3Rva2VuLmh0bWwjbzIiPl93c3NlX19CaW5hcnlTZWN1cml0eVRva2VuPC9hPjxsaT52cmZ5X2FsZw0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kYXRhLmh0bWwjbzMiPnNvYXBfd3NzZV9kYXRhPC9hPjxsaT52cmZ5X2tleQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kYXRhLmh0bWwjbzQiPnNvYXBfd3NzZV9kYXRhPC9hPjxsaT52cmZ5X2tleWxlbg0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kYXRhLmh0bWwjbzUiPnNvYXBfd3NzZV9kYXRhPC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X3ciPi0gdyAtPC9hPjwvaDM+PHVsPg0KKzxsaT53c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19rZXlfaW5mb190eXBlLmh0bWwjbzQiPmRzX19LZXlJbmZvVHlwZTwvYT48bGk+d3N1X19DcmVhdGVkDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fdXNlcm5hbWVfdG9rZW4uaHRtbCNvMyI+X3dzc2VfX1VzZXJuYW1lVG9rZW48L2E+PGxpPndzdV9fSWQNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3VfX19fX3RpbWVzdGFtcC5odG1sI28wIj5fd3N1X19UaW1lc3RhbXA8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHlfdG9rZW5fcmVmZXJlbmNlLmh0bWwjbzMiPl93c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2tleV9pZGVudGlmaWVyLmh0bWwjbzEiPl93c3NlX19LZXlJZGVudGlmaWVyPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2VtYmVkZGVkLmh0bWwjbzAiPl93c3NlX19FbWJlZGRlZDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19iaW5hcnlfc2VjdXJpdHlfdG9rZW4uaHRtbCNvMSI+X3dzc2VfX0JpbmFyeVNlY3VyaXR5VG9rZW48L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fdXNlcm5hbWVfdG9rZW4uaHRtbCNvNCI+X3dzc2VfX1VzZXJuYW1lVG9rZW48L2E+PGxpPndzdV9fVGltZXN0YW1wDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHkuaHRtbCNvMCI+X3dzc2VfX1NlY3VyaXR5PC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X3giPi0geCAtPC9hPjwvaDM+PHVsPg0KKzxsaT5YNTA5Q2VydGlmaWNhdGUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3g1MDlfZGF0YV90eXBlLmh0bWwjbzMiPmRzX19YNTA5RGF0YVR5cGU8L2E+PGxpPlg1MDlDUkwNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3g1MDlfZGF0YV90eXBlLmh0bWwjbzQiPmRzX19YNTA5RGF0YVR5cGU8L2E+PGxpPlg1MDlEYXRhDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19rZXlfaW5mb190eXBlLmh0bWwjbzMiPmRzX19LZXlJbmZvVHlwZTwvYT48bGk+WDUwOUlzc3Vlck5hbWUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3g1MDlfaXNzdWVyX3NlcmlhbF90eXBlLmh0bWwjbzAiPmRzX19YNTA5SXNzdWVyU2VyaWFsVHlwZTwvYT48bGk+WDUwOUlzc3VlclNlcmlhbA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19feDUwOV9kYXRhX3R5cGUuaHRtbCNvMCI+ZHNfX1g1MDlEYXRhVHlwZTwvYT48bGk+WDUwOVNlcmlhbE51bWJlcg0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19feDUwOV9pc3N1ZXJfc2VyaWFsX3R5cGUuaHRtbCNvMSI+ZHNfX1g1MDlJc3N1ZXJTZXJpYWxUeXBlPC9hPjxsaT5YNTA5U0tJDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX194NTA5X2RhdGFfdHlwZS5odG1sI28xIj5kc19fWDUwOURhdGFUeXBlPC9hPjxsaT5YNTA5U3ViamVjdE5hbWUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3g1MDlfZGF0YV90eXBlLmh0bWwjbzIiPmRzX19YNTA5RGF0YVR5cGU8L2E+PC91bD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfeSI+LSB5IC08L2E+PC9oMz48dWw+DQorPGxpPlkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2Rfc19hX2tleV92YWx1ZV90eXBlLmh0bWwjbzEiPmRzX19EU0FLZXlWYWx1ZVR5cGU8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gRnJpIEF1ZyAxOSAxMDo0MTo0NSAyMDA1IGZvciBnU09BUCBXUy1TZWN1cml0eSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9mdW5jdGlvbnNfdmFycy5odG1sIGIvZG9jL3dzc2UvaHRtbC9mdW5jdGlvbnNfdmFycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZjJhYjAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL2Z1bmN0aW9uc192YXJzLmh0bWwKQEAgLTAsMCArMSwxNTUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFdTLVNlY3VyaXR5OiBDbGFzcyBNZW1iZXJzIC0gVmFyaWFibGVzPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXhITCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5BbGw8L2E+IHwgPGEgY2xhc3M9InFpbmRleEhMIiBocmVmPSJmdW5jdGlvbnNfdmFycy5odG1sIj5WYXJpYWJsZXM8L2E+PC9kaXY+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfXyI+XzwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfYSI+YTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfYiI+YjwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfYyI+YzwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfZCI+ZDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfZSI+ZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfZiI+ZjwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfZyI+ZzwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfaCI+aDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfaSI+aTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfaiI+ajwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfayI+azwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfbCI+bDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfbSI+bTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfbiI+bjwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfcCI+cDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfcSI+cTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfciI+cjwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfcyI+czwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfdCI+dDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfdSI+dTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfdiI+djwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfdyI+dzwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfeCI+eDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfeSI+eTwvYT48L2Rpdj4NCisNCis8cD4NCisNCis8cD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfXyI+LSBfIC08L2E+PC9oMz48dWw+DQorPGxpPl9fYW55DQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX190cmFuc2Zvcm1fdHlwZS5odG1sI28xIj5kc19fVHJhbnNmb3JtVHlwZTwvYT48bGk+X19pdGVtDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fcGFzc3dvcmQuaHRtbCNvMCI+X3dzc2VfX1Bhc3N3b3JkPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2tleV9pZGVudGlmaWVyLmh0bWwjbzAiPl93c3NlX19LZXlJZGVudGlmaWVyPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2JpbmFyeV9zZWN1cml0eV90b2tlbi5odG1sI28wIj5fd3NzZV9fQmluYXJ5U2VjdXJpdHlUb2tlbjwvYT48bGk+X19zaXplUmVmZXJlbmNlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduZWRfaW5mb190eXBlLmh0bWwjbzIiPmRzX19TaWduZWRJbmZvVHlwZTwvYT48bGk+X19zaXplVHJhbnNmb3JtDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX190cmFuc2Zvcm1zX3R5cGUuaHRtbCNvMCI+ZHNfX1RyYW5zZm9ybXNUeXBlPC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X2EiPi0gYSAtPC9hPjwvaDM+PHVsPg0KKzxsaT5hbGcNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fc21kX19kYXRhLmh0bWwjbzAiPnNvYXBfc21kX2RhdGE8L2E+PGxpPkFsZ29yaXRobQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fZGlnZXN0X21ldGhvZF90eXBlLmh0bWwjbzAiPmRzX19EaWdlc3RNZXRob2RUeXBlPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmF0dXJlX21ldGhvZF90eXBlLmh0bWwjbzEiPmRzX19TaWduYXR1cmVNZXRob2RUeXBlPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fY2Fub25pY2FsaXphdGlvbl9tZXRob2RfdHlwZS5odG1sI28wIj5kc19fQ2Fub25pY2FsaXphdGlvbk1ldGhvZFR5cGU8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX190cmFuc2Zvcm1fdHlwZS5odG1sI28yIj5kc19fVHJhbnNmb3JtVHlwZTwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF9iIj4tIGIgLTwvYT48L2gzPjx1bD4NCis8bGk+QmluYXJ5U2VjdXJpdHlUb2tlbg0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5Lmh0bWwjbzIiPl93c3NlX19TZWN1cml0eTwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF9jIj4tIGMgLTwvYT48L2gzPjx1bD4NCis8bGk+YzE0bl9fSW5jbHVzaXZlTmFtZXNwYWNlcw0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fY2Fub25pY2FsaXphdGlvbl9tZXRob2RfdHlwZS5odG1sI28xIj5kc19fQ2Fub25pY2FsaXphdGlvbk1ldGhvZFR5cGU8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX190cmFuc2Zvcm1fdHlwZS5odG1sI28wIj5kc19fVHJhbnNmb3JtVHlwZTwvYT48bGk+Q2Fub25pY2FsaXphdGlvbk1ldGhvZA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmVkX2luZm9fdHlwZS5odG1sI28wIj5kc19fU2lnbmVkSW5mb1R5cGU8L2E+PGxpPkNyZWF0ZWQNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3VfX19fX3RpbWVzdGFtcC5odG1sI28xIj5fd3N1X19UaW1lc3RhbXA8L2E+PGxpPmN0eA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19zbWRfX2RhdGEuaHRtbCNvMSI+c29hcF9zbWRfZGF0YTwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF9kIj4tIGQgLTwvYT48L2gzPjx1bD4NCis8bGk+ZGlnZXN0DQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RhdGEuaHRtbCNvNiI+c29hcF93c3NlX2RhdGE8L2E+PGxpPkRpZ2VzdE1ldGhvZA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fcmVmZXJlbmNlX3R5cGUuaHRtbCNvMSI+ZHNfX1JlZmVyZW5jZVR5cGU8L2E+PGxpPkRpZ2VzdFZhbHVlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19yZWZlcmVuY2VfdHlwZS5odG1sI28yIj5kc19fUmVmZXJlbmNlVHlwZTwvYT48bGk+ZHNfX1NpZ25hdHVyZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5Lmh0bWwjbzMiPl93c3NlX19TZWN1cml0eTwvYT48bGk+RFNBS2V5VmFsdWUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2tleV92YWx1ZV90eXBlLmh0bWwjbzAiPmRzX19LZXlWYWx1ZVR5cGU8L2E+PC91bD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfZSI+LSBlIC08L2E+PC9oMz48dWw+DQorPGxpPkVtYmVkZGVkDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHlfdG9rZW5fcmVmZXJlbmNlLmh0bWwjbzIiPl93c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlPC9hPjxsaT5FbmNvZGluZ1R5cGUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19rZXlfaWRlbnRpZmllci5odG1sI28zIj5fd3NzZV9fS2V5SWRlbnRpZmllcjwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19iaW5hcnlfc2VjdXJpdHlfdG9rZW4uaHRtbCNvMyI+X3dzc2VfX0JpbmFyeVNlY3VyaXR5VG9rZW48L2E+PGxpPmV4cGlyZWQNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fc2Vzc2lvbi5odG1sI28xIj5zb2FwX3dzc2Vfc2Vzc2lvbjwvYT48bGk+RXhwaXJlcw0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzdV9fX19fdGltZXN0YW1wLmh0bWwjbzIiPl93c3VfX1RpbWVzdGFtcDwvYT48bGk+RXhwb25lbnQNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3Jfc19hX2tleV92YWx1ZV90eXBlLmh0bWwjbzEiPmRzX19SU0FLZXlWYWx1ZVR5cGU8L2E+PC91bD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfZiI+LSBmIC08L2E+PC9oMz48dWw+DQorPGxpPmZkaXNjb25uZWN0DQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RhdGEuaHRtbCNvMTAiPnNvYXBfd3NzZV9kYXRhPC9hPjxsaT5mcHJlcGFyZWZpbmFsDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RhdGEuaHRtbCNvOSI+c29hcF93c3NlX2RhdGE8L2E+PGxpPmZwcmVwYXJlaW5pdA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kYXRhLmh0bWwjbzciPnNvYXBfd3NzZV9kYXRhPC9hPjxsaT5mcHJlcGFyZXNlbmQNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fZGF0YS5odG1sI284Ij5zb2FwX3dzc2VfZGF0YTwvYT48bGk+ZnJlY3YNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fc21kX19kYXRhLmh0bWwjbzQiPnNvYXBfc21kX2RhdGE8L2E+PGxpPmZzZW5kDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3NtZF9fZGF0YS5odG1sI28zIj5zb2FwX3NtZF9kYXRhPC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X2ciPi0gZyAtPC9hPjwvaDM+PHVsPg0KKzxsaT5HDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19kX3NfYV9rZXlfdmFsdWVfdHlwZS5odG1sI28wIj5kc19fRFNBS2V5VmFsdWVUeXBlPC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X2giPi0gaCAtPC9hPjwvaDM+PHVsPg0KKzxsaT5oYXNoDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RpZ2VzdC5odG1sI28zIj5zb2FwX3dzc2VfZGlnZXN0PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19zZXNzaW9uLmh0bWwjbzIiPnNvYXBfd3NzZV9zZXNzaW9uPC9hPjxsaT5ITUFDT3V0cHV0TGVuZ3RoDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduYXR1cmVfbWV0aG9kX3R5cGUuaHRtbCNvMCI+ZHNfX1NpZ25hdHVyZU1ldGhvZFR5cGU8L2E+PC91bD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfaSI+LSBpIC08L2E+PC9oMz48dWw+DQorPGxpPmlkDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RpZ2VzdC5odG1sI280Ij5zb2FwX3dzc2VfZGlnZXN0PC9hPjxsaT5JZA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fcmVmZXJlbmNlX3R5cGUuaHRtbCNvMyI+ZHNfX1JlZmVyZW5jZVR5cGU8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduZWRfaW5mb190eXBlLmh0bWwjbzQiPmRzX19TaWduZWRJbmZvVHlwZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2tleV9pbmZvX3R5cGUuaHRtbCNvNSI+ZHNfX0tleUluZm9UeXBlPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmF0dXJlX3R5cGUuaHRtbCNvMyI+ZHNfX1NpZ25hdHVyZVR5cGU8L2E+PC91bD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfaiI+LSBqIC08L2E+PC9oMz48dWw+DQorPGxpPkoNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2Rfc19hX2tleV92YWx1ZV90eXBlLmh0bWwjbzIiPmRzX19EU0FLZXlWYWx1ZVR5cGU8L2E+PC91bD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfayI+LSBrIC08L2E+PC9oMz48dWw+DQorPGxpPmtleQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19zbWRfX2RhdGEuaHRtbCNvMiI+c29hcF9zbWRfZGF0YTwvYT48bGk+S2V5SWRlbnRpZmllcg0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5X3Rva2VuX3JlZmVyZW5jZS5odG1sI28xIj5fd3NzZV9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZTwvYT48bGk+S2V5SW5mbw0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmF0dXJlX3R5cGUuaHRtbCNvMiI+ZHNfX1NpZ25hdHVyZVR5cGU8L2E+PGxpPktleU5hbWUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2tleV9pbmZvX3R5cGUuaHRtbCNvMCI+ZHNfX0tleUluZm9UeXBlPC9hPjxsaT5LZXlWYWx1ZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fa2V5X2luZm9fdHlwZS5odG1sI28xIj5kc19fS2V5SW5mb1R5cGU8L2E+PC91bD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfbCI+LSBsIC08L2E+PC9oMz48dWw+DQorPGxpPmxldmVsDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RpZ2VzdC5odG1sI28xIj5zb2FwX3dzc2VfZGlnZXN0PC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X20iPi0gbSAtPC9hPjwvaDM+PHVsPg0KKzxsaT5tb2RlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3NtZF9fZGF0YS5odG1sI281Ij5zb2FwX3NtZF9kYXRhPC9hPjxsaT5Nb2R1bHVzDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19yX3NfYV9rZXlfdmFsdWVfdHlwZS5odG1sI28wIj5kc19fUlNBS2V5VmFsdWVUeXBlPC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X24iPi0gbiAtPC9hPjwvaDM+PHVsPg0KKzxsaT5uZXh0DQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RpZ2VzdC5odG1sI28wIj5zb2FwX3dzc2VfZGlnZXN0PC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19zZXNzaW9uLmh0bWwjbzAiPnNvYXBfd3NzZV9zZXNzaW9uPC9hPjxsaT5ub25jZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19zZXNzaW9uLmh0bWwjbzMiPnNvYXBfd3NzZV9zZXNzaW9uPC9hPjxsaT5Ob25jZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3VzZXJuYW1lX3Rva2VuLmh0bWwjbzIiPl93c3NlX19Vc2VybmFtZVRva2VuPC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X3AiPi0gcCAtPC9hPjwvaDM+PHVsPg0KKzxsaT5QDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19kX3NfYV9rZXlfdmFsdWVfdHlwZS5odG1sI28zIj5kc19fRFNBS2V5VmFsdWVUeXBlPC9hPjxsaT5QYXNzd29yZA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3VzZXJuYW1lX3Rva2VuLmh0bWwjbzEiPl93c3NlX19Vc2VybmFtZVRva2VuPC9hPjxsaT5QZ2VuQ291bnRlcg0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fZF9zX2Ffa2V5X3ZhbHVlX3R5cGUuaHRtbCNvNiI+ZHNfX0RTQUtleVZhbHVlVHlwZTwvYT48bGk+UHJlZml4TGlzdA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX2MxNG5fX19fX2luY2x1c2l2ZV9uYW1lc3BhY2VzLmh0bWwjbzAiPl9jMTRuX19JbmNsdXNpdmVOYW1lc3BhY2VzPC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X3EiPi0gcSAtPC9hPjwvaDM+PHVsPg0KKzxsaT5RDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19kX3NfYV9rZXlfdmFsdWVfdHlwZS5odG1sI280Ij5kc19fRFNBS2V5VmFsdWVUeXBlPC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X3IiPi0gciAtPC9hPjwvaDM+PHVsPg0KKzxsaT5SZWZlcmVuY2UNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eV90b2tlbl9yZWZlcmVuY2UuaHRtbCNvMCI+X3dzc2VfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2U8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduZWRfaW5mb190eXBlLmh0bWwjbzMiPmRzX19TaWduZWRJbmZvVHlwZTwvYT48bGk+UmV0cmlldmFsTWV0aG9kDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19rZXlfaW5mb190eXBlLmh0bWwjbzIiPmRzX19LZXlJbmZvVHlwZTwvYT48bGk+UlNBS2V5VmFsdWUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2tleV92YWx1ZV90eXBlLmh0bWwjbzEiPmRzX19LZXlWYWx1ZVR5cGU8L2E+PC91bD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfcyI+LSBzIC08L2E+PC9oMz48dWw+DQorPGxpPlNlZWQNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2Rfc19hX2tleV92YWx1ZV90eXBlLmh0bWwjbzUiPmRzX19EU0FLZXlWYWx1ZVR5cGU8L2E+PGxpPnNpZ25fYWxnDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RhdGEuaHRtbCNvMCI+c29hcF93c3NlX2RhdGE8L2E+PGxpPnNpZ25fa2V5DQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RhdGEuaHRtbCNvMSI+c29hcF93c3NlX2RhdGE8L2E+PGxpPnNpZ25fa2V5bGVuDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RhdGEuaHRtbCNvMiI+c29hcF93c3NlX2RhdGE8L2E+PGxpPlNpZ25hdHVyZU1ldGhvZA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmVkX2luZm9fdHlwZS5odG1sI28xIj5kc19fU2lnbmVkSW5mb1R5cGU8L2E+PGxpPlNpZ25hdHVyZVZhbHVlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduYXR1cmVfdHlwZS5odG1sI28xIj5kc19fU2lnbmF0dXJlVHlwZTwvYT48bGk+U2lnbmVkSW5mbw0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmF0dXJlX3R5cGUuaHRtbCNvMCI+ZHNfX1NpZ25hdHVyZVR5cGU8L2E+PGxpPnNtZA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kaWdlc3QuaHRtbCNvMiI+c29hcF93c3NlX2RpZ2VzdDwvYT48bGk+U09BUF9FTlZfX2FjdG9yDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHkuaHRtbCNvNCI+X3dzc2VfX1NlY3VyaXR5PC9hPjxsaT5TT0FQX0VOVl9fcm9sZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5Lmh0bWwjbzUiPl93c3NlX19TZWN1cml0eTwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF90Ij4tIHQgLTwvYT48L2gzPjx1bD4NCis8bGk+VHJhbnNmb3JtDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX190cmFuc2Zvcm1zX3R5cGUuaHRtbCNvMSI+ZHNfX1RyYW5zZm9ybXNUeXBlPC9hPjxsaT5UcmFuc2Zvcm1zDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19yZXRyaWV2YWxfbWV0aG9kX3R5cGUuaHRtbCNvMCI+ZHNfX1JldHJpZXZhbE1ldGhvZFR5cGU8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19yZWZlcmVuY2VfdHlwZS5odG1sI28wIj5kc19fUmVmZXJlbmNlVHlwZTwvYT48bGk+VHlwZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3Bhc3N3b3JkLmh0bWwjbzEiPl93c3NlX19QYXNzd29yZDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3JldHJpZXZhbF9tZXRob2RfdHlwZS5odG1sI28yIj5kc19fUmV0cmlldmFsTWV0aG9kVHlwZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3JlZmVyZW5jZV90eXBlLmh0bWwjbzUiPmRzX19SZWZlcmVuY2VUeXBlPC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X3UiPi0gdSAtPC9hPjwvaDM+PHVsPg0KKzxsaT5VUkkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19yZWZlcmVuY2UuaHRtbCNvMCI+X3dzc2VfX1JlZmVyZW5jZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3JldHJpZXZhbF9tZXRob2RfdHlwZS5odG1sI28xIj5kc19fUmV0cmlldmFsTWV0aG9kVHlwZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3JlZmVyZW5jZV90eXBlLmh0bWwjbzQiPmRzX19SZWZlcmVuY2VUeXBlPC9hPjxsaT5Vc2FnZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5X3Rva2VuX3JlZmVyZW5jZS5odG1sI280Ij5fd3NzZV9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZTwvYT48bGk+dXNlcg0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19zbWRfX2RhdGEuaHRtbCNvNiI+c29hcF9zbWRfZGF0YTwvYT48bGk+VXNlcm5hbWUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX191c2VybmFtZV90b2tlbi5odG1sI28wIj5fd3NzZV9fVXNlcm5hbWVUb2tlbjwvYT48bGk+VXNlcm5hbWVUb2tlbg0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5Lmh0bWwjbzEiPl93c3NlX19TZWN1cml0eTwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF92Ij4tIHYgLTwvYT48L2gzPjx1bD4NCis8bGk+VmFsdWVUeXBlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fa2V5X2lkZW50aWZpZXIuaHRtbCNvMiI+X3dzc2VfX0tleUlkZW50aWZpZXI8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fZW1iZWRkZWQuaHRtbCNvMSI+X3dzc2VfX0VtYmVkZGVkPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3JlZmVyZW5jZS5odG1sI28xIj5fd3NzZV9fUmVmZXJlbmNlPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2JpbmFyeV9zZWN1cml0eV90b2tlbi5odG1sI28yIj5fd3NzZV9fQmluYXJ5U2VjdXJpdHlUb2tlbjwvYT48bGk+dnJmeV9hbGcNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fZGF0YS5odG1sI28zIj5zb2FwX3dzc2VfZGF0YTwvYT48bGk+dnJmeV9rZXkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fZGF0YS5odG1sI280Ij5zb2FwX3dzc2VfZGF0YTwvYT48bGk+dnJmeV9rZXlsZW4NCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fZGF0YS5odG1sI281Ij5zb2FwX3dzc2VfZGF0YTwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF93Ij4tIHcgLTwvYT48L2gzPjx1bD4NCis8bGk+d3NzZV9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fa2V5X2luZm9fdHlwZS5odG1sI280Ij5kc19fS2V5SW5mb1R5cGU8L2E+PGxpPndzdV9fQ3JlYXRlZA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3VzZXJuYW1lX3Rva2VuLmh0bWwjbzMiPl93c3NlX19Vc2VybmFtZVRva2VuPC9hPjxsaT53c3VfX0lkDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3N1X19fX190aW1lc3RhbXAuaHRtbCNvMCI+X3dzdV9fVGltZXN0YW1wPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5X3Rva2VuX3JlZmVyZW5jZS5odG1sI28zIj5fd3NzZV9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZTwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19rZXlfaWRlbnRpZmllci5odG1sI28xIj5fd3NzZV9fS2V5SWRlbnRpZmllcjwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19lbWJlZGRlZC5odG1sI28wIj5fd3NzZV9fRW1iZWRkZWQ8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fYmluYXJ5X3NlY3VyaXR5X3Rva2VuLmh0bWwjbzEiPl93c3NlX19CaW5hcnlTZWN1cml0eVRva2VuPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3VzZXJuYW1lX3Rva2VuLmh0bWwjbzQiPl93c3NlX19Vc2VybmFtZVRva2VuPC9hPjxsaT53c3VfX1RpbWVzdGFtcA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5Lmh0bWwjbzAiPl93c3NlX19TZWN1cml0eTwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF94Ij4tIHggLTwvYT48L2gzPjx1bD4NCis8bGk+WDUwOUNlcnRpZmljYXRlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX194NTA5X2RhdGFfdHlwZS5odG1sI28zIj5kc19fWDUwOURhdGFUeXBlPC9hPjxsaT5YNTA5Q1JMDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX194NTA5X2RhdGFfdHlwZS5odG1sI280Ij5kc19fWDUwOURhdGFUeXBlPC9hPjxsaT5YNTA5RGF0YQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fa2V5X2luZm9fdHlwZS5odG1sI28zIj5kc19fS2V5SW5mb1R5cGU8L2E+PGxpPlg1MDlJc3N1ZXJOYW1lDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX194NTA5X2lzc3Vlcl9zZXJpYWxfdHlwZS5odG1sI28wIj5kc19fWDUwOUlzc3VlclNlcmlhbFR5cGU8L2E+PGxpPlg1MDlJc3N1ZXJTZXJpYWwNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3g1MDlfZGF0YV90eXBlLmh0bWwjbzAiPmRzX19YNTA5RGF0YVR5cGU8L2E+PGxpPlg1MDlTZXJpYWxOdW1iZXINCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3g1MDlfaXNzdWVyX3NlcmlhbF90eXBlLmh0bWwjbzEiPmRzX19YNTA5SXNzdWVyU2VyaWFsVHlwZTwvYT48bGk+WDUwOVNLSQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19feDUwOV9kYXRhX3R5cGUuaHRtbCNvMSI+ZHNfX1g1MDlEYXRhVHlwZTwvYT48bGk+WDUwOVN1YmplY3ROYW1lDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX194NTA5X2RhdGFfdHlwZS5odG1sI28yIj5kc19fWDUwOURhdGFUeXBlPC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X3kiPi0geSAtPC9hPjwvaDM+PHVsPg0KKzxsaT5ZDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19kX3NfYV9rZXlfdmFsdWVfdHlwZS5odG1sI28xIj5kc19fRFNBS2V5VmFsdWVUeXBlPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIEZyaSBBdWcgMTkgMTA6NDE6NDUgMjAwNSBmb3IgZ1NPQVAgV1MtU2VjdXJpdHkgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvZ2xvYmFscy5odG1sIGIvZG9jL3dzc2UvaHRtbC9nbG9iYWxzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRlMzE5OAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvZ2xvYmFscy5odG1sCkBAIC0wLDAgKzEsMTY2IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBXUy1TZWN1cml0eTogRmlsZSBNZW1iZXJzPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleEhMIiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXhITCIgaHJlZj0iZ2xvYmFscy5odG1sIj5BbGw8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFsc19mdW5jLmh0bWwiPkZ1bmN0aW9uczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzX3ZhcnMuaHRtbCI+VmFyaWFibGVzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHNfdHlwZS5odG1sIj5UeXBlZGVmczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzX2VudW0uaHRtbCI+RW51bWVyYXRpb25zPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHNfZXZhbC5odG1sIj5FbnVtZXJhdGlvbiZuYnNwO3ZhbHVlczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzX2RlZnMuaHRtbCI+RGVmaW5lczwvYT48L2Rpdj4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9fIj5fPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9jIj5jPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9kIj5kPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF9zIj5zPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9IiNpbmRleF93Ij53PC9hPjwvZGl2Pg0KKw0KKzxwPg0KKw0KKzxwPg0KK0hlcmUgaXMgYSBsaXN0IG9mIGFsbCBmaWxlIG1lbWJlcnMgd2l0aCBsaW5rcyB0byB0aGUgZmlsZXMgdGhleSBiZWxvbmcgdG86PGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X18iPi0gXyAtPC9hPjwvaDM+PHVsPg0KKzxsaT5fYzE0bl9fSW5jbHVzaXZlTmFtZXNwYWNlcw0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJjMTRuXzhoLmh0bWwjYTAiPmMxNG4uaDwvYT48bGk+X3dzc2VfX0JpbmFyeVNlY3VyaXR5VG9rZW4NCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZV84aC5odG1sI2EyIj53c3NlLmg8L2E+PGxpPl93c3NlX19FbWJlZGRlZA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlXzhoLmh0bWwjYTQiPndzc2UuaDwvYT48bGk+X3dzc2VfX0tleUlkZW50aWZpZXINCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZV84aC5odG1sI2E1Ij53c3NlLmg8L2E+PGxpPl93c3NlX19QYXNzd29yZA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlXzhoLmh0bWwjYTgiPndzc2UuaDwvYT48bGk+X3dzc2VfX1JlZmVyZW5jZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlXzhoLmh0bWwjYTMiPndzc2UuaDwvYT48bGk+X3dzc2VfX1NlY3VyaXR5DQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VfOGguaHRtbCNhNyI+d3NzZS5oPC9hPjxsaT5fd3NzZV9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlXzhoLmh0bWwjYTYiPndzc2UuaDwvYT48bGk+X3dzc2VfX1VzZXJuYW1lVG9rZW4NCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZV84aC5odG1sI2ExIj53c3NlLmg8L2E+PGxpPl93c3VfX1RpbWVzdGFtcA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3VfOGguaHRtbCNhMSI+d3N1Lmg8L2E+PC91bD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfYyI+LSBjIC08L2E+PC9oMz48dWw+DQorPGxpPmMxNG5fVVJJDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhMTIiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2ExNSI+d3NzZWFwaS5jPC9hPjxsaT5jYWxjX2RpZ2VzdCgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMjEiPndzc2VhcGkuYzwvYT48bGk+Y2FsY19ub25jZSgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMjIiPndzc2VhcGkuYzwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF9kIj4tIGQgLTwvYT48L2gzPjx1bD4NCis8bGk+ZHNfX0Nhbm9uaWNhbGl6YXRpb25NZXRob2RUeXBlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImRzXzhoLmh0bWwjYTIiPmRzLmg8L2E+PGxpPmRzX19EaWdlc3RNZXRob2RUeXBlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImRzXzhoLmh0bWwjYTciPmRzLmg8L2E+PGxpPmRzX19EU0FLZXlWYWx1ZVR5cGUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iZHNfOGguaHRtbCNhMTMiPmRzLmg8L2E+PGxpPmRzX19LZXlJbmZvVHlwZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJkc184aC5odG1sI2E4Ij5kcy5oPC9hPjxsaT5kc19fS2V5VmFsdWVUeXBlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImRzXzhoLmh0bWwjYTkiPmRzLmg8L2E+PGxpPmRzX19SZWZlcmVuY2VUeXBlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImRzXzhoLmh0bWwjYTQiPmRzLmg8L2E+PGxpPmRzX19SZXRyaWV2YWxNZXRob2RUeXBlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImRzXzhoLmh0bWwjYTEwIj5kcy5oPC9hPjxsaT5kc19fUlNBS2V5VmFsdWVUeXBlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImRzXzhoLmh0bWwjYTE0Ij5kcy5oPC9hPjxsaT5kc19fU2lnbmF0dXJlTWV0aG9kVHlwZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJkc184aC5odG1sI2EzIj5kcy5oPC9hPjxsaT5kc19fU2lnbmF0dXJlVHlwZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJkc184aC5odG1sI2EwIj5kcy5oPC9hPjxsaT5kc19fU2lnbmVkSW5mb1R5cGUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iZHNfOGguaHRtbCNhMSI+ZHMuaDwvYT48bGk+ZHNfX1RyYW5zZm9ybXNUeXBlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImRzXzhoLmh0bWwjYTUiPmRzLmg8L2E+PGxpPmRzX19UcmFuc2Zvcm1UeXBlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImRzXzhoLmh0bWwjYTYiPmRzLmg8L2E+PGxpPmRzX19YNTA5RGF0YVR5cGUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iZHNfOGguaHRtbCNhMTEiPmRzLmg8L2E+PGxpPmRzX19YNTA5SXNzdWVyU2VyaWFsVHlwZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJkc184aC5odG1sI2ExMiI+ZHMuaDwvYT48bGk+ZHNfZHNhX3NoYTFVUkkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E5Ij53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMTIiPndzc2VhcGkuYzwvYT48bGk+ZHNfaG1hY19zaGExVVJJDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhOCI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTExIj53c3NlYXBpLmM8L2E+PGxpPmRzX3JzYV9zaGExVVJJDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhMTAiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2ExMyI+d3NzZWFwaS5jPC9hPjxsaT5kc19zaGExVVJJDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhNyI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTEwIj53c3NlYXBpLmM8L2E+PGxpPmRzX1VSSQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTExIj53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMTQiPndzc2VhcGkuYzwvYT48L3VsPg0KKzxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJpbmRleF9zIj4tIHMgLTwvYT48L2gzPjx1bD4NCis8bGk+c29hcF9zbWRfYmVnaW4oKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGguaHRtbCNhMTMiPnNtZGV2cC5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGMuaHRtbCNhNCI+c21kZXZwLmM8L2E+PGxpPnNvYXBfc21kX2NoZWNrKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic21kZXZwXzhjLmh0bWwjYTIiPnNtZGV2cC5jPC9hPjxsaT5TT0FQX1NNRF9ER1NUX01ENQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGguaHRtbCNhNSI+c21kZXZwLmg8L2E+PGxpPlNPQVBfU01EX0RHU1RfU0hBMQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGguaHRtbCNhNiI+c21kZXZwLmg8L2E+PGxpPnNvYXBfc21kX2VuZCgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84aC5odG1sI2ExNCI+c21kZXZwLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84Yy5odG1sI2E1Ij5zbWRldnAuYzwvYT48bGk+c29hcF9zbWRfZmluYWwoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGguaHRtbCNhMTciPnNtZGV2cC5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGMuaHRtbCNhOCI+c21kZXZwLmM8L2E+PGxpPlNPQVBfU01EX0hNQUNfU0hBMQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGguaHRtbCNhNyI+c21kZXZwLmg8L2E+PGxpPnNvYXBfc21kX2luaXQoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGguaHRtbCNhMTUiPnNtZGV2cC5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGMuaHRtbCNhNiI+c21kZXZwLmM8L2E+PGxpPlNPQVBfU01EX0tFWV9UWVBFDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84aC5odG1sI2EwIj5zbWRldnAuaDwvYT48bGk+U09BUF9TTURfTUFYX1NJWkUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic21kZXZwXzhoLmh0bWwjYTEiPnNtZGV2cC5oPC9hPjxsaT5TT0FQX1NNRF9NRDVfU0laRQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGguaHRtbCNhMiI+c21kZXZwLmg8L2E+PGxpPlNPQVBfU01EX05PTkUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic21kZXZwXzhoLmh0bWwjYTQiPnNtZGV2cC5oPC9hPjxsaT5zb2FwX3NtZF9yZWN2KCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic21kZXZwXzhjLmh0bWwjYTEiPnNtZGV2cC5jPC9hPjxsaT5zb2FwX3NtZF9zZW5kKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic21kZXZwXzhjLmh0bWwjYTAiPnNtZGV2cC5jPC9hPjxsaT5TT0FQX1NNRF9TSEExX1NJWkUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic21kZXZwXzhoLmh0bWwjYTMiPnNtZGV2cC5oPC9hPjxsaT5TT0FQX1NNRF9TSUdOX0RTQV9TSEExDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84aC5odG1sI2E4Ij5zbWRldnAuaDwvYT48bGk+U09BUF9TTURfU0lHTl9SU0FfU0hBMQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGguaHRtbCNhOSI+c21kZXZwLmg8L2E+PGxpPnNvYXBfc21kX3NpemUoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGguaHRtbCNhMTIiPnNtZGV2cC5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGMuaHRtbCNhMyI+c21kZXZwLmM8L2E+PGxpPnNvYXBfc21kX3VwZGF0ZSgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84aC5odG1sI2ExNiI+c21kZXZwLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84Yy5odG1sI2E3Ij5zbWRldnAuYzwvYT48bGk+U09BUF9TTURfVlJGWV9EU0FfU0hBMQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGguaHRtbCNhMTAiPnNtZGV2cC5oPC9hPjxsaT5TT0FQX1NNRF9WUkZZX1JTQV9TSEExDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84aC5odG1sI2ExMSI+c21kZXZwLmg8L2E+PGxpPnNvYXBfd3NzZSgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhNTgiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E3NSI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2VfYWRkX0JpbmFyeVNlY3VyaXR5VG9rZW4oKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTI5Ij53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNDYiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX2FkZF9CaW5hcnlTZWN1cml0eVRva2VuUEVNKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2EzMSI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTQ4Ij53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9hZGRfQmluYXJ5U2VjdXJpdHlUb2tlblg1MDkoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTMwIj53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNDciPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX2FkZF9LZXlJbmZvKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E0NSI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTYyIj53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9hZGRfS2V5SW5mb19LZXlOYW1lKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E0NyI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTY0Ij53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9hZGRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlRW1iZWRkZWQoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTU2Ij53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNzMiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX2FkZF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VLZXlJZGVudGlmaWVyKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E1MyI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTcwIj53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9hZGRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlVVJJKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E0OSI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTY2Ij53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9hZGRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlWDUwOSgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhNTAiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E2NyI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2VfYWRkX1NlY3VyaXR5KCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2ExNCI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTMxIj53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9hZGRfU2VjdXJpdHlfYWN0b3IoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTE1Ij53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMzIiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX2FkZF9TaWduYXR1cmUoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTE4Ij53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMzUiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX2FkZF9TaWduYXR1cmVWYWx1ZSgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhNDEiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E1OCI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2VfYWRkX1NpZ25lZEluZm8oKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTM2Ij53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNTMiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX2FkZF9TaWduZWRJbmZvX1JlZmVyZW5jZSgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhMzciPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E1NCI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2VfYWRkX1NpZ25lZEluZm9fU2lnbmF0dXJlTWV0aG9kKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2EzOCI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTU1Ij53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9hZGRfVGltZXN0YW1wKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2EyMSI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTM4Ij53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9hZGRfVXNlcm5hbWVUb2tlbkRpZ2VzdCgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhMjUiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E0MiI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2VfYWRkX1VzZXJuYW1lVG9rZW5UZXh0KCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2EyNCI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTQxIj53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9CaW5hcnlTZWN1cml0eVRva2VuKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2EzMiI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTQ5Ij53c3NlYXBpLmM8L2E+PGxpPlNPQVBfV1NTRV9DTEtTS0VXDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMSI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2VfY29weSgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMjQiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX2RlbGV0ZSgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMjUiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX2RlbGV0ZV9TZWN1cml0eSgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhMTYiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2EzMyI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2VfZGVsZXRlX1NpZ25hdHVyZSgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhMTkiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2EzNiI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2VfZGlzY29ubmVjdCgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMzAiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX2ZhdWx0KCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E1NyI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTc0Ij53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9nZXRfQmluYXJ5U2VjdXJpdHlUb2tlbigpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhMzMiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E1MCI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2VfZ2V0X0JpbmFyeVNlY3VyaXR5VG9rZW5YNTA5KCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2EzNCI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTUxIj53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9nZXRfS2V5SW5mb19LZXlOYW1lKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E0OCI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTY1Ij53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9nZXRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlS2V5SWRlbnRpZmllcigpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhNTUiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E3MiI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2VfZ2V0X0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZUtleUlkZW50aWZpZXJWYWx1ZVR5cGUoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTU0Ij53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNzEiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX2dldF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VVUkkoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTUxIj53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNjgiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX2dldF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VYNTA5KCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E1MiI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTY5Ij53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9nZXRfU2lnbmVkSW5mb19TaWduYXR1cmVNZXRob2QoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTQwIj53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNTciPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX2dldF9Vc2VybmFtZSgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhMjciPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E0NCI+d3NzZWFwaS5jPC9hPjxsaT5TT0FQX1dTU0VfSUQNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2EwIj53c3NlYXBpLmg8L2E+PGxpPnNvYXBfd3NzZV9pZA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTEiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E0Ij53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9pbml0KCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2EyMyI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2VfS2V5SW5mbygpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhNDYiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E2MyI+d3NzZWFwaS5jPC9hPjxsaT5TT0FQX1dTU0VfTUFYX1JFRg0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTAiPndzc2VhcGkuYzwvYT48bGk+U09BUF9XU1NFX05PTkNFTEVODQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMiI+d3NzZWFwaS5jPC9hPjxsaT5TT0FQX1dTU0VfTk9OQ0VUSU1FDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMyI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2VfcHJlcGFyZWNsZWFudXAoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTI5Ij53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9wcmVwYXJlZmluYWwoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTI4Ij53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9wcmVwYXJlaW5pdCgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMjYiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX3ByZXBhcmVzZW5kKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2EyNyI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2VfU2VjdXJpdHkoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTE3Ij53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMzQiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX3Nlc3Npb24NCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2ExNyI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2Vfc2Vzc2lvbl9jbGVhbnVwKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2EyMCI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2Vfc2Vzc2lvbl9sb2NrDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMTgiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX3Nlc3Npb25fdmVyaWZ5KCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2ExOSI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2Vfc2lnbigpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhNTkiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E3NiI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2Vfc2lnbl9ib2R5KCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E2MCI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTc3Ij53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9TaWduYXR1cmUoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTIwIj53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMzciPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX1NpZ25lZEluZm8oKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTM5Ij53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNTYiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX1RpbWVzdGFtcCgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhMjIiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2EzOSI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2VfVXNlcm5hbWVUb2tlbigpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhMjYiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E0MyI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2VfdmVyaWZ5X2F1dG8oKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTYyIj53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNzkiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX3ZlcmlmeV9kaWdlc3QoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTQ0Ij53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNjEiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX3ZlcmlmeV9kb25lKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E2MyI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTgwIj53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV92ZXJpZnlfaW5pdCgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhNjEiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E3OCI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2VfdmVyaWZ5X1Bhc3N3b3JkKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2EyOCI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTQ1Ij53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV92ZXJpZnlfU2lnbmF0dXJlVmFsdWUoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTQyIj53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNTkiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX3ZlcmlmeV9TaWduZWRJbmZvKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E0MyI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTYwIj53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV92ZXJpZnlfVGltZXN0YW1wKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2EyMyI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTQwIj53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV92ZXJpZnlfWDUwOSgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhMzUiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E1MiI+d3NzZWFwaS5jPC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X3ciPi0gdyAtPC9hPjwvaDM+PHVsPg0KKzxsaT53c3NlX19GYWlsZWRBdXRoZW50aWNhdGlvbg0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlXzhoLmh0bWwjYTE2YTEzIj53c3NlLmg8L2E+PGxpPndzc2VfX0ZhaWxlZENoZWNrDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VfOGguaHRtbCNhMTZhMTQiPndzc2UuaDwvYT48bGk+d3NzZV9fRmF1bHRjb2RlRW51bQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlXzhoLmh0bWwjYTE2Ij53c3NlLmg8L2E+PGxpPndzc2VfX0ludmFsaWRTZWN1cml0eQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlXzhoLmh0bWwjYTE2YTExIj53c3NlLmg8L2E+PGxpPndzc2VfX0ludmFsaWRTZWN1cml0eVRva2VuDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VfOGguaHRtbCNhMTZhMTIiPndzc2UuaDwvYT48bGk+d3NzZV9fU2VjdXJpdHlUb2tlblVuYXZhaWxhYmxlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VfOGguaHRtbCNhMTZhMTUiPndzc2UuaDwvYT48bGk+d3NzZV9fVW5zdXBwb3J0ZWRBbGdvcml0aG0NCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZV84aC5odG1sI2ExNmExMCI+d3NzZS5oPC9hPjxsaT53c3NlX19VbnN1cHBvcnRlZFNlY3VyaXR5VG9rZW4NCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZV84aC5odG1sI2ExNmE5Ij53c3NlLmg8L2E+PGxpPndzc2VfQmFzZTY0QmluYXJ5VVJJDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhNCI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTciPndzc2VhcGkuYzwvYT48bGk+d3NzZV9QYXNzd29yZERpZ2VzdFVSSQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTMiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E2Ij53c3NlYXBpLmM8L2E+PGxpPndzc2VfUGFzc3dvcmRUZXh0VVJJDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhMiI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTUiPndzc2VhcGkuYzwvYT48bGk+d3NzZV9YNTA5djNTdWJqZWN0S2V5SWRlbnRpZmllclVSSQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTYiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E5Ij53c3NlYXBpLmM8L2E+PGxpPndzc2VfWDUwOXYzVVJJDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhNSI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTgiPndzc2VhcGkuYzwvYT48bGk+d3N1X19NZXNzYWdlRXhwaXJlZA0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3VfOGguaHRtbCNhM2EyIj53c3UuaDwvYT48bGk+d3N1X190VGltZXN0YW1wRmF1bHQNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3N1XzhoLmh0bWwjYTMiPndzdS5oPC9hPjxsaT53c3VfVVJJDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhMTMiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2ExNiI+d3NzZWFwaS5jPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIEZyaSBBdWcgMTkgMTA6NDE6NDYgMjAwNSBmb3IgZ1NPQVAgV1MtU2VjdXJpdHkgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvZ2xvYmFsc19kZWZzLmh0bWwgYi9kb2Mvd3NzZS9odG1sL2dsb2JhbHNfZGVmcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MmFkYmYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL2dsb2JhbHNfZGVmcy5odG1sCkBAIC0wLDAgKzEsMzQgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFdTLVNlY3VyaXR5OiBGaWxlIE1lbWJlcnMgLSBEZWZpbmVzPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleEhMIiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+QWxsPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHNfZnVuYy5odG1sIj5GdW5jdGlvbnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFsc192YXJzLmh0bWwiPlZhcmlhYmxlczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzX3R5cGUuaHRtbCI+VHlwZWRlZnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFsc19lbnVtLmh0bWwiPkVudW1lcmF0aW9uczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzX2V2YWwuaHRtbCI+RW51bWVyYXRpb24mbmJzcDt2YWx1ZXM8L2E+IHwgPGEgY2xhc3M9InFpbmRleEhMIiBocmVmPSJnbG9iYWxzX2RlZnMuaHRtbCI+RGVmaW5lczwvYT48L2Rpdj4NCisNCis8cD4NCis8dWw+DQorPGxpPlNPQVBfU01EX0RHU1RfTUQ1DQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84aC5odG1sI2E1Ij5zbWRldnAuaDwvYT48bGk+U09BUF9TTURfREdTVF9TSEExDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84aC5odG1sI2E2Ij5zbWRldnAuaDwvYT48bGk+U09BUF9TTURfSE1BQ19TSEExDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84aC5odG1sI2E3Ij5zbWRldnAuaDwvYT48bGk+U09BUF9TTURfS0VZX1RZUEUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic21kZXZwXzhoLmh0bWwjYTAiPnNtZGV2cC5oPC9hPjxsaT5TT0FQX1NNRF9NQVhfU0laRQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGguaHRtbCNhMSI+c21kZXZwLmg8L2E+PGxpPlNPQVBfU01EX01ENV9TSVpFDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84aC5odG1sI2EyIj5zbWRldnAuaDwvYT48bGk+U09BUF9TTURfTk9ORQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGguaHRtbCNhNCI+c21kZXZwLmg8L2E+PGxpPlNPQVBfU01EX1NIQTFfU0laRQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGguaHRtbCNhMyI+c21kZXZwLmg8L2E+PGxpPlNPQVBfU01EX1NJR05fRFNBX1NIQTENCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0ic21kZXZwXzhoLmh0bWwjYTgiPnNtZGV2cC5oPC9hPjxsaT5TT0FQX1NNRF9TSUdOX1JTQV9TSEExDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84aC5odG1sI2E5Ij5zbWRldnAuaDwvYT48bGk+U09BUF9TTURfVlJGWV9EU0FfU0hBMQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGguaHRtbCNhMTAiPnNtZGV2cC5oPC9hPjxsaT5TT0FQX1NNRF9WUkZZX1JTQV9TSEExDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84aC5odG1sI2ExMSI+c21kZXZwLmg8L2E+PGxpPlNPQVBfV1NTRV9DTEtTS0VXDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMSI+d3NzZWFwaS5jPC9hPjxsaT5TT0FQX1dTU0VfSUQNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2EwIj53c3NlYXBpLmg8L2E+PGxpPlNPQVBfV1NTRV9NQVhfUkVGDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMCI+d3NzZWFwaS5jPC9hPjxsaT5TT0FQX1dTU0VfTk9OQ0VMRU4NCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2EyIj53c3NlYXBpLmM8L2E+PGxpPlNPQVBfV1NTRV9OT05DRVRJTUUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2EzIj53c3NlYXBpLmM8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gRnJpIEF1ZyAxOSAxMDo0MTo0NiAyMDA1IGZvciBnU09BUCBXUy1TZWN1cml0eSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9nbG9iYWxzX2VudW0uaHRtbCBiL2RvYy93c3NlL2h0bWwvZ2xvYmFsc19lbnVtLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJjYjI5NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvZ2xvYmFsc19lbnVtLmh0bWwKQEAgLTAsMCArMSwxOSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgV1MtU2VjdXJpdHk6IEZpbGUgTWVtYmVycyAtIEVudW1lcmF0aW9uczwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXhITCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkFsbDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzX2Z1bmMuaHRtbCI+RnVuY3Rpb25zPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHNfdmFycy5odG1sIj5WYXJpYWJsZXM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFsc190eXBlLmh0bWwiPlR5cGVkZWZzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXhITCIgaHJlZj0iZ2xvYmFsc19lbnVtLmh0bWwiPkVudW1lcmF0aW9uczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzX2V2YWwuaHRtbCI+RW51bWVyYXRpb24mbmJzcDt2YWx1ZXM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFsc19kZWZzLmh0bWwiPkRlZmluZXM8L2E+PC9kaXY+DQorDQorPHA+DQorPHVsPg0KKzxsaT53c3NlX19GYXVsdGNvZGVFbnVtDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VfOGguaHRtbCNhMTYiPndzc2UuaDwvYT48bGk+d3N1X190VGltZXN0YW1wRmF1bHQNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3N1XzhoLmh0bWwjYTMiPndzdS5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIEZyaSBBdWcgMTkgMTA6NDE6NDYgMjAwNSBmb3IgZ1NPQVAgV1MtU2VjdXJpdHkgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvZ2xvYmFsc19ldmFsLmh0bWwgYi9kb2Mvd3NzZS9odG1sL2dsb2JhbHNfZXZhbC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMGVjNmIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL2dsb2JhbHNfZXZhbC5odG1sCkBAIC0wLDAgKzEsMjUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFdTLVNlY3VyaXR5OiBGaWxlIE1lbWJlcnMgLSBFbnVtZXJhdGlvbiB2YWx1ZXM8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4SEwiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5BbGw8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFsc19mdW5jLmh0bWwiPkZ1bmN0aW9uczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzX3ZhcnMuaHRtbCI+VmFyaWFibGVzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHNfdHlwZS5odG1sIj5UeXBlZGVmczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzX2VudW0uaHRtbCI+RW51bWVyYXRpb25zPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXhITCIgaHJlZj0iZ2xvYmFsc19ldmFsLmh0bWwiPkVudW1lcmF0aW9uJm5ic3A7dmFsdWVzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHNfZGVmcy5odG1sIj5EZWZpbmVzPC9hPjwvZGl2Pg0KKw0KKzxwPg0KKzx1bD4NCis8bGk+d3NzZV9fRmFpbGVkQXV0aGVudGljYXRpb24NCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZV84aC5odG1sI2ExNmExMyI+d3NzZS5oPC9hPjxsaT53c3NlX19GYWlsZWRDaGVjaw0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlXzhoLmh0bWwjYTE2YTE0Ij53c3NlLmg8L2E+PGxpPndzc2VfX0ludmFsaWRTZWN1cml0eQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlXzhoLmh0bWwjYTE2YTExIj53c3NlLmg8L2E+PGxpPndzc2VfX0ludmFsaWRTZWN1cml0eVRva2VuDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VfOGguaHRtbCNhMTZhMTIiPndzc2UuaDwvYT48bGk+d3NzZV9fU2VjdXJpdHlUb2tlblVuYXZhaWxhYmxlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VfOGguaHRtbCNhMTZhMTUiPndzc2UuaDwvYT48bGk+d3NzZV9fVW5zdXBwb3J0ZWRBbGdvcml0aG0NCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZV84aC5odG1sI2ExNmExMCI+d3NzZS5oPC9hPjxsaT53c3NlX19VbnN1cHBvcnRlZFNlY3VyaXR5VG9rZW4NCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZV84aC5odG1sI2ExNmE5Ij53c3NlLmg8L2E+PGxpPndzdV9fTWVzc2FnZUV4cGlyZWQNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3N1XzhoLmh0bWwjYTNhMiI+d3N1Lmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gRnJpIEF1ZyAxOSAxMDo0MTo0NiAyMDA1IGZvciBnU09BUCBXUy1TZWN1cml0eSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9nbG9iYWxzX2Z1bmMuaHRtbCBiL2RvYy93c3NlL2h0bWwvZ2xvYmFsc19mdW5jLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFjMjZjYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvZ2xvYmFsc19mdW5jLmh0bWwKQEAgLTAsMCArMSw5MyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgV1MtU2VjdXJpdHk6IEZpbGUgTWVtYmVycyAtIEZ1bmN0aW9uczwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXhITCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkFsbDwvYT4gfCA8YSBjbGFzcz0icWluZGV4SEwiIGhyZWY9Imdsb2JhbHNfZnVuYy5odG1sIj5GdW5jdGlvbnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFsc192YXJzLmh0bWwiPlZhcmlhYmxlczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzX3R5cGUuaHRtbCI+VHlwZWRlZnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFsc19lbnVtLmh0bWwiPkVudW1lcmF0aW9uczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzX2V2YWwuaHRtbCI+RW51bWVyYXRpb24mbmJzcDt2YWx1ZXM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFsc19kZWZzLmh0bWwiPkRlZmluZXM8L2E+PC9kaXY+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfYyI+YzwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSIjaW5kZXhfcyI+czwvYT48L2Rpdj4NCisNCis8cD4NCisNCis8cD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iaW5kZXhfYyI+LSBjIC08L2E+PC9oMz48dWw+DQorPGxpPmNhbGNfZGlnZXN0KCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2EyMSI+d3NzZWFwaS5jPC9hPjxsaT5jYWxjX25vbmNlKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2EyMiI+d3NzZWFwaS5jPC9hPjwvdWw+DQorPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImluZGV4X3MiPi0gcyAtPC9hPjwvaDM+PHVsPg0KKzxsaT5zb2FwX3NtZF9iZWdpbigpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84aC5odG1sI2ExMyI+c21kZXZwLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84Yy5odG1sI2E0Ij5zbWRldnAuYzwvYT48bGk+c29hcF9zbWRfY2hlY2soKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGMuaHRtbCNhMiI+c21kZXZwLmM8L2E+PGxpPnNvYXBfc21kX2VuZCgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84aC5odG1sI2ExNCI+c21kZXZwLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84Yy5odG1sI2E1Ij5zbWRldnAuYzwvYT48bGk+c29hcF9zbWRfZmluYWwoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGguaHRtbCNhMTciPnNtZGV2cC5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGMuaHRtbCNhOCI+c21kZXZwLmM8L2E+PGxpPnNvYXBfc21kX2luaXQoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGguaHRtbCNhMTUiPnNtZGV2cC5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGMuaHRtbCNhNiI+c21kZXZwLmM8L2E+PGxpPnNvYXBfc21kX3JlY3YoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGMuaHRtbCNhMSI+c21kZXZwLmM8L2E+PGxpPnNvYXBfc21kX3NlbmQoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGMuaHRtbCNhMCI+c21kZXZwLmM8L2E+PGxpPnNvYXBfc21kX3NpemUoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGguaHRtbCNhMTIiPnNtZGV2cC5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGMuaHRtbCNhMyI+c21kZXZwLmM8L2E+PGxpPnNvYXBfc21kX3VwZGF0ZSgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84aC5odG1sI2ExNiI+c21kZXZwLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84Yy5odG1sI2E3Ij5zbWRldnAuYzwvYT48bGk+c29hcF93c3NlKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E1OCI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTc1Ij53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9hZGRfQmluYXJ5U2VjdXJpdHlUb2tlbigpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhMjkiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E0NiI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2VfYWRkX0JpbmFyeVNlY3VyaXR5VG9rZW5QRU0oKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTMxIj53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNDgiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX2FkZF9CaW5hcnlTZWN1cml0eVRva2VuWDUwOSgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhMzAiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E0NyI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2VfYWRkX0tleUluZm8oKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTQ1Ij53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNjIiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX2FkZF9LZXlJbmZvX0tleU5hbWUoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTQ3Ij53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNjQiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX2FkZF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VFbWJlZGRlZCgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhNTYiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E3MyI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2VfYWRkX0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZUtleUlkZW50aWZpZXIoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTUzIj53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNzAiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX2FkZF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VVUkkoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTQ5Ij53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNjYiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX2FkZF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VYNTA5KCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E1MCI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTY3Ij53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9hZGRfU2VjdXJpdHkoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTE0Ij53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMzEiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX2FkZF9TZWN1cml0eV9hY3RvcigpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhMTUiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2EzMiI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2VfYWRkX1NpZ25hdHVyZSgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhMTgiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2EzNSI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2VfYWRkX1NpZ25hdHVyZVZhbHVlKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E0MSI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTU4Ij53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9hZGRfU2lnbmVkSW5mbygpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhMzYiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E1MyI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2VfYWRkX1NpZ25lZEluZm9fUmVmZXJlbmNlKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2EzNyI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTU0Ij53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9hZGRfU2lnbmVkSW5mb19TaWduYXR1cmVNZXRob2QoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTM4Ij53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNTUiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX2FkZF9UaW1lc3RhbXAoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTIxIj53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMzgiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX2FkZF9Vc2VybmFtZVRva2VuRGlnZXN0KCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2EyNSI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTQyIj53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9hZGRfVXNlcm5hbWVUb2tlblRleHQoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTI0Ij53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNDEiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX0JpbmFyeVNlY3VyaXR5VG9rZW4oKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTMyIj53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNDkiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX2NvcHkoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTI0Ij53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9kZWxldGUoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTI1Ij53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9kZWxldGVfU2VjdXJpdHkoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTE2Ij53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMzMiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX2RlbGV0ZV9TaWduYXR1cmUoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTE5Ij53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMzYiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX2Rpc2Nvbm5lY3QoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTMwIj53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9mYXVsdCgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhNTciPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E3NCI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2VfZ2V0X0JpbmFyeVNlY3VyaXR5VG9rZW4oKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTMzIj53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNTAiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX2dldF9CaW5hcnlTZWN1cml0eVRva2VuWDUwOSgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhMzQiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E1MSI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2VfZ2V0X0tleUluZm9fS2V5TmFtZSgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhNDgiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E2NSI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2VfZ2V0X0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZUtleUlkZW50aWZpZXIoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTU1Ij53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNzIiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX2dldF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VLZXlJZGVudGlmaWVyVmFsdWVUeXBlKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E1NCI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTcxIj53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9nZXRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlVVJJKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E1MSI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTY4Ij53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9nZXRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlWDUwOSgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhNTIiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E2OSI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2VfZ2V0X1NpZ25lZEluZm9fU2lnbmF0dXJlTWV0aG9kKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E0MCI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTU3Ij53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9nZXRfVXNlcm5hbWUoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTI3Ij53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNDQiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX2luaXQoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTIzIj53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9LZXlJbmZvKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E0NiI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTYzIj53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9wcmVwYXJlY2xlYW51cCgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMjkiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX3ByZXBhcmVmaW5hbCgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMjgiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX3ByZXBhcmVpbml0KCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2EyNiI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2VfcHJlcGFyZXNlbmQoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTI3Ij53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9TZWN1cml0eSgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhMTciPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2EzNCI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2Vfc2Vzc2lvbl9jbGVhbnVwKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2EyMCI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2Vfc2Vzc2lvbl92ZXJpZnkoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTE5Ij53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9zaWduKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E1OSI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTc2Ij53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9zaWduX2JvZHkoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTYwIj53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNzciPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX1NpZ25hdHVyZSgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhMjAiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2EzNyI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2VfU2lnbmVkSW5mbygpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhMzkiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E1NiI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2VfVGltZXN0YW1wKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2EyMiI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTM5Ij53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9Vc2VybmFtZVRva2VuKCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2EyNiI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTQzIj53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV92ZXJpZnlfYXV0bygpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhNjIiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E3OSI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2VfdmVyaWZ5X2RpZ2VzdCgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhNDQiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E2MSI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2VfdmVyaWZ5X2RvbmUoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTYzIj53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhODAiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX3ZlcmlmeV9pbml0KCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E2MSI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTc4Ij53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV92ZXJpZnlfUGFzc3dvcmQoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTI4Ij53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNDUiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX3ZlcmlmeV9TaWduYXR1cmVWYWx1ZSgpDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhNDIiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E1OSI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2VfdmVyaWZ5X1NpZ25lZEluZm8oKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTQzIj53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNjAiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX3ZlcmlmeV9UaW1lc3RhbXAoKQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTIzIj53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNDAiPndzc2VhcGkuYzwvYT48bGk+c29hcF93c3NlX3ZlcmlmeV9YNTA5KCkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2EzNSI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTUyIj53c3NlYXBpLmM8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gRnJpIEF1ZyAxOSAxMDo0MTo0NiAyMDA1IGZvciBnU09BUCBXUy1TZWN1cml0eSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9nbG9iYWxzX3R5cGUuaHRtbCBiL2RvYy93c3NlL2h0bWwvZ2xvYmFsc190eXBlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcwNmFhOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvZ2xvYmFsc190eXBlLmh0bWwKQEAgLTAsMCArMSw0NCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgV1MtU2VjdXJpdHk6IEZpbGUgTWVtYmVycyAtIFR5cGVkZWZzPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleEhMIiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+QWxsPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHNfZnVuYy5odG1sIj5GdW5jdGlvbnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFsc192YXJzLmh0bWwiPlZhcmlhYmxlczwvYT4gfCA8YSBjbGFzcz0icWluZGV4SEwiIGhyZWY9Imdsb2JhbHNfdHlwZS5odG1sIj5UeXBlZGVmczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzX2VudW0uaHRtbCI+RW51bWVyYXRpb25zPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHNfZXZhbC5odG1sIj5FbnVtZXJhdGlvbiZuYnNwO3ZhbHVlczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzX2RlZnMuaHRtbCI+RGVmaW5lczwvYT48L2Rpdj4NCisNCis8cD4NCis8dWw+DQorPGxpPl9jMTRuX19JbmNsdXNpdmVOYW1lc3BhY2VzDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImMxNG5fOGguaHRtbCNhMCI+YzE0bi5oPC9hPjxsaT5fd3NzZV9fQmluYXJ5U2VjdXJpdHlUb2tlbg0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlXzhoLmh0bWwjYTIiPndzc2UuaDwvYT48bGk+X3dzc2VfX0VtYmVkZGVkDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VfOGguaHRtbCNhNCI+d3NzZS5oPC9hPjxsaT5fd3NzZV9fS2V5SWRlbnRpZmllcg0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlXzhoLmh0bWwjYTUiPndzc2UuaDwvYT48bGk+X3dzc2VfX1Bhc3N3b3JkDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VfOGguaHRtbCNhOCI+d3NzZS5oPC9hPjxsaT5fd3NzZV9fUmVmZXJlbmNlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VfOGguaHRtbCNhMyI+d3NzZS5oPC9hPjxsaT5fd3NzZV9fU2VjdXJpdHkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZV84aC5odG1sI2E3Ij53c3NlLmg8L2E+PGxpPl93c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VfOGguaHRtbCNhNiI+d3NzZS5oPC9hPjxsaT5fd3NzZV9fVXNlcm5hbWVUb2tlbg0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlXzhoLmh0bWwjYTEiPndzc2UuaDwvYT48bGk+X3dzdV9fVGltZXN0YW1wDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9IndzdV84aC5odG1sI2ExIj53c3UuaDwvYT48bGk+ZHNfX0Nhbm9uaWNhbGl6YXRpb25NZXRob2RUeXBlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImRzXzhoLmh0bWwjYTIiPmRzLmg8L2E+PGxpPmRzX19EaWdlc3RNZXRob2RUeXBlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImRzXzhoLmh0bWwjYTciPmRzLmg8L2E+PGxpPmRzX19EU0FLZXlWYWx1ZVR5cGUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iZHNfOGguaHRtbCNhMTMiPmRzLmg8L2E+PGxpPmRzX19LZXlJbmZvVHlwZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJkc184aC5odG1sI2E4Ij5kcy5oPC9hPjxsaT5kc19fS2V5VmFsdWVUeXBlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImRzXzhoLmh0bWwjYTkiPmRzLmg8L2E+PGxpPmRzX19SZWZlcmVuY2VUeXBlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImRzXzhoLmh0bWwjYTQiPmRzLmg8L2E+PGxpPmRzX19SZXRyaWV2YWxNZXRob2RUeXBlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImRzXzhoLmh0bWwjYTEwIj5kcy5oPC9hPjxsaT5kc19fUlNBS2V5VmFsdWVUeXBlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImRzXzhoLmh0bWwjYTE0Ij5kcy5oPC9hPjxsaT5kc19fU2lnbmF0dXJlTWV0aG9kVHlwZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJkc184aC5odG1sI2EzIj5kcy5oPC9hPjxsaT5kc19fU2lnbmF0dXJlVHlwZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJkc184aC5odG1sI2EwIj5kcy5oPC9hPjxsaT5kc19fU2lnbmVkSW5mb1R5cGUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iZHNfOGguaHRtbCNhMSI+ZHMuaDwvYT48bGk+ZHNfX1RyYW5zZm9ybXNUeXBlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImRzXzhoLmh0bWwjYTUiPmRzLmg8L2E+PGxpPmRzX19UcmFuc2Zvcm1UeXBlDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9ImRzXzhoLmh0bWwjYTYiPmRzLmg8L2E+PGxpPmRzX19YNTA5RGF0YVR5cGUNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0iZHNfOGguaHRtbCNhMTEiPmRzLmg8L2E+PGxpPmRzX19YNTA5SXNzdWVyU2VyaWFsVHlwZQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJkc184aC5odG1sI2ExMiI+ZHMuaDwvYT48bGk+d3NzZV9fRmF1bHRjb2RlRW51bQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlXzhoLmh0bWwjYTE2Ij53c3NlLmg8L2E+PGxpPndzdV9fdFRpbWVzdGFtcEZhdWx0DQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9IndzdV84aC5odG1sI2EzIj53c3UuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBGcmkgQXVnIDE5IDEwOjQxOjQ2IDIwMDUgZm9yIGdTT0FQIFdTLVNlY3VyaXR5IGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL2dsb2JhbHNfdmFycy5odG1sIGIvZG9jL3dzc2UvaHRtbC9nbG9iYWxzX3ZhcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGUwNzRiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9nbG9iYWxzX3ZhcnMuaHRtbApAQCAtMCwwICsxLDMyIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBXUy1TZWN1cml0eTogRmlsZSBNZW1iZXJzIC0gVmFyaWFibGVzPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleEhMIiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+QWxsPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHNfZnVuYy5odG1sIj5GdW5jdGlvbnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleEhMIiBocmVmPSJnbG9iYWxzX3ZhcnMuaHRtbCI+VmFyaWFibGVzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHNfdHlwZS5odG1sIj5UeXBlZGVmczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzX2VudW0uaHRtbCI+RW51bWVyYXRpb25zPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHNfZXZhbC5odG1sIj5FbnVtZXJhdGlvbiZuYnNwO3ZhbHVlczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzX2RlZnMuaHRtbCI+RGVmaW5lczwvYT48L2Rpdj4NCisNCis8cD4NCis8dWw+DQorPGxpPmMxNG5fVVJJDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhMTIiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2ExNSI+d3NzZWFwaS5jPC9hPjxsaT5kc19kc2Ffc2hhMVVSSQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTkiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2ExMiI+d3NzZWFwaS5jPC9hPjxsaT5kc19obWFjX3NoYTFVUkkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E4Ij53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMTEiPndzc2VhcGkuYzwvYT48bGk+ZHNfcnNhX3NoYTFVUkkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2ExMCI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTEzIj53c3NlYXBpLmM8L2E+PGxpPmRzX3NoYTFVUkkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E3Ij53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMTAiPndzc2VhcGkuYzwvYT48bGk+ZHNfVVJJDQorOiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhMTEiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2ExNCI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2VfaWQNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2ExIj53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNCI+d3NzZWFwaS5jPC9hPjxsaT5zb2FwX3dzc2Vfc2Vzc2lvbg0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTE3Ij53c3NlYXBpLmM8L2E+PGxpPnNvYXBfd3NzZV9zZXNzaW9uX2xvY2sNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2ExOCI+d3NzZWFwaS5jPC9hPjxsaT53c3NlX0Jhc2U2NEJpbmFyeVVSSQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTQiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E3Ij53c3NlYXBpLmM8L2E+PGxpPndzc2VfUGFzc3dvcmREaWdlc3RVUkkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2EzIj53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNiI+d3NzZWFwaS5jPC9hPjxsaT53c3NlX1Bhc3N3b3JkVGV4dFVSSQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTIiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E1Ij53c3NlYXBpLmM8L2E+PGxpPndzc2VfWDUwOXYzU3ViamVjdEtleUlkZW50aWZpZXJVUkkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E2Ij53c3NlYXBpLmg8L2E+LCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhOSI+d3NzZWFwaS5jPC9hPjxsaT53c3NlX1g1MDl2M1VSSQ0KKzogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTUiPndzc2VhcGkuaDwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E4Ij53c3NlYXBpLmM8L2E+PGxpPndzdV9VUkkNCis6IDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2ExMyI+d3NzZWFwaS5oPC9hPiwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTE2Ij53c3NlYXBpLmM8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gRnJpIEF1ZyAxOSAxMDo0MTo0NiAyMDA1IGZvciBnU09BUCBXUy1TZWN1cml0eSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9ncmFwaF9sZWdlbmQuZG90IGIvZG9jL3dzc2UvaHRtbC9ncmFwaF9sZWdlbmQuZG90Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MjA5MjcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL2dyYXBoX2xlZ2VuZC5kb3QKQEAgLTAsMCArMSwyMiBAQAorZGlncmFwaCBHCit7CisgIGVkZ2UgW2ZvbnRuYW1lPSJIZWx2ZXRpY2EiLGZvbnRzaXplPTEwLGxhYmVsZm9udG5hbWU9IkhlbHZldGljYSIsbGFiZWxmb250c2l6ZT0xMF07CisgIG5vZGUgW2ZvbnRuYW1lPSJIZWx2ZXRpY2EiLGZvbnRzaXplPTEwLHNoYXBlPXJlY29yZF07CisgIE5vZGU5IFtzaGFwZT0iYm94IixsYWJlbD0iSW5oZXJpdGVkIixmb250c2l6ZT0xMCxoZWlnaHQ9MC4yLHdpZHRoPTAuNCxmb250bmFtZT0iSGVsdmV0aWNhIixjb2xvcj0iYmxhY2siLHN0eWxlPSJmaWxsZWQiIGZvbnRjb2xvcj0id2hpdGUiXTsKKyAgTm9kZTEwIC0+IE5vZGU5IFtkaXI9YmFjayxjb2xvcj0ibWlkbmlnaHRibHVlIixmb250c2l6ZT0xMCxzdHlsZT0ic29saWQiLGZvbnRuYW1lPSJIZWx2ZXRpY2EiXTsKKyAgTm9kZTEwIFtzaGFwZT0iYm94IixsYWJlbD0iUHVibGljQmFzZSIsZm9udHNpemU9MTAsaGVpZ2h0PTAuMix3aWR0aD0wLjQsZm9udG5hbWU9IkhlbHZldGljYSIsY29sb3I9ImJsYWNrIixVUkw9IiRjbGFzc1B1YmxpY0Jhc2UuaHRtbCJdOworICBOb2RlMTEgLT4gTm9kZTEwIFtkaXI9YmFjayxjb2xvcj0ibWlkbmlnaHRibHVlIixmb250c2l6ZT0xMCxzdHlsZT0ic29saWQiLGZvbnRuYW1lPSJIZWx2ZXRpY2EiXTsKKyAgTm9kZTExIFtzaGFwZT0iYm94IixsYWJlbD0iVHJ1bmNhdGVkIixmb250c2l6ZT0xMCxoZWlnaHQ9MC4yLHdpZHRoPTAuNCxmb250bmFtZT0iSGVsdmV0aWNhIixjb2xvcj0icmVkIixVUkw9IiRjbGFzc1RydW5jYXRlZC5odG1sIl07CisgIE5vZGUxMyAtPiBOb2RlOSBbZGlyPWJhY2ssY29sb3I9ImRhcmtncmVlbiIsZm9udHNpemU9MTAsc3R5bGU9InNvbGlkIixmb250bmFtZT0iSGVsdmV0aWNhIl07CisgIE5vZGUxMyBbc2hhcGU9ImJveCIsbGFiZWw9IlByb3RlY3RlZEJhc2UiLGZvbnRzaXplPTEwLGhlaWdodD0wLjIsd2lkdGg9MC40LGZvbnRuYW1lPSJIZWx2ZXRpY2EiLGNvbG9yPSJibGFjayIsVVJMPSIkY2xhc3NQcm90ZWN0ZWRCYXNlLmh0bWwiXTsKKyAgTm9kZTE0IC0+IE5vZGU5IFtkaXI9YmFjayxjb2xvcj0iZmlyZWJyaWNrNCIsZm9udHNpemU9MTAsc3R5bGU9InNvbGlkIixmb250bmFtZT0iSGVsdmV0aWNhIl07CisgIE5vZGUxNCBbc2hhcGU9ImJveCIsbGFiZWw9IlByaXZhdGVCYXNlIixmb250c2l6ZT0xMCxoZWlnaHQ9MC4yLHdpZHRoPTAuNCxmb250bmFtZT0iSGVsdmV0aWNhIixjb2xvcj0iYmxhY2siLFVSTD0iJGNsYXNzUHJpdmF0ZUJhc2UuaHRtbCJdOworICBOb2RlMTUgLT4gTm9kZTkgW2Rpcj1iYWNrLGNvbG9yPSJtaWRuaWdodGJsdWUiLGZvbnRzaXplPTEwLHN0eWxlPSJzb2xpZCIsZm9udG5hbWU9IkhlbHZldGljYSJdOworICBOb2RlMTUgW3NoYXBlPSJib3giLGxhYmVsPSJVbmRvY3VtZW50ZWQiLGZvbnRzaXplPTEwLGhlaWdodD0wLjIsd2lkdGg9MC40LGZvbnRuYW1lPSJIZWx2ZXRpY2EiLGNvbG9yPSJncmV5NzUiXTsKKyAgTm9kZTE2IC0+IE5vZGU5IFtkaXI9YmFjayxjb2xvcj0ibWlkbmlnaHRibHVlIixmb250c2l6ZT0xMCxzdHlsZT0ic29saWQiLGZvbnRuYW1lPSJIZWx2ZXRpY2EiXTsKKyAgTm9kZTE2IFtzaGFwZT0iYm94IixsYWJlbD0iVGVtcGw8IGludCA+Iixmb250c2l6ZT0xMCxoZWlnaHQ9MC4yLHdpZHRoPTAuNCxmb250bmFtZT0iSGVsdmV0aWNhIixjb2xvcj0iYmxhY2siLFVSTD0iJGNsYXNzVGVtcGwuaHRtbCJdOworICBOb2RlMTcgLT4gTm9kZTE2IFtkaXI9YmFjayxjb2xvcj0ib3JhbmdlIixmb250c2l6ZT0xMCxzdHlsZT0iZGFzaGVkIixsYWJlbD0iPCBpbnQgPiIsZm9udG5hbWU9IkhlbHZldGljYSJdOworICBOb2RlMTcgW3NoYXBlPSJib3giLGxhYmVsPSJUZW1wbDwgVCA+Iixmb250c2l6ZT0xMCxoZWlnaHQ9MC4yLHdpZHRoPTAuNCxmb250bmFtZT0iSGVsdmV0aWNhIixjb2xvcj0iYmxhY2siLFVSTD0iJGNsYXNzVGVtcGwuaHRtbCJdOworICBOb2RlMTggLT4gTm9kZTkgW2Rpcj1iYWNrLGNvbG9yPSJkYXJrb3JjaGlkMyIsZm9udHNpemU9MTAsc3R5bGU9ImRhc2hlZCIsbGFiZWw9Im1fdXNlZENsYXNzIixmb250bmFtZT0iSGVsdmV0aWNhIl07CisgIE5vZGUxOCBbc2hhcGU9ImJveCIsbGFiZWw9IlVzZWQiLGZvbnRzaXplPTEwLGhlaWdodD0wLjIsd2lkdGg9MC40LGZvbnRuYW1lPSJIZWx2ZXRpY2EiLGNvbG9yPSJibGFjayIsVVJMPSIkY2xhc3NVc2VkLmh0bWwiXTsKK30KZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvZ3JhcGhfbGVnZW5kLmh0bWwgYi9kb2Mvd3NzZS9odG1sL2dyYXBoX2xlZ2VuZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YmU2YmYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL2dyYXBoX2xlZ2VuZC5odG1sCkBAIC0wLDAgKzEsNzQgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFdTLVNlY3VyaXR5OiBHcmFwaCBMZWdlbmQ8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+R3JhcGggTGVnZW5kPC9oMT5UaGlzIHBhZ2UgZXhwbGFpbnMgaG93IHRvIGludGVycHJldCB0aGUgZ3JhcGhzIHRoYXQgYXJlIGdlbmVyYXRlZCBieSBkb3h5Z2VuLjxwPg0KK0NvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZXhhbXBsZTogPGRpdiBjbGFzcz0iZnJhZ21lbnQiPjxwcmU+PHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8qISBJbnZpc2libGUgY2xhc3MgYmVjYXVzZSBvZiB0cnVuY2F0aW9uICovPC9zcGFuPg0KKzxzcGFuIGNsYXNzPSJrZXl3b3JkIj5jbGFzcyA8L3NwYW4+SW52aXNpYmxlIHsgfTsNCis8c3BhbiBjbGFzcz0iY29tbWVudCI+PC9zcGFuPg0KKzxzcGFuIGNsYXNzPSJjb21tZW50Ij4vKiEgVHJ1bmNhdGVkIGNsYXNzLCBpbmhlcml0YW5jZSByZWxhdGlvbiBpcyBoaWRkZW4gKi88L3NwYW4+DQorPHNwYW4gY2xhc3M9ImtleXdvcmQiPmNsYXNzIDwvc3Bhbj5UcnVuY2F0ZWQgOiA8c3BhbiBjbGFzcz0ia2V5d29yZCI+cHVibGljPC9zcGFuPiBJbnZpc2libGUgeyB9Ow0KKw0KKzxzcGFuIGNsYXNzPSJjb21tZW50Ij4vKiBDbGFzcyBub3QgZG9jdW1lbnRlZCB3aXRoIGRveHlnZW4gY29tbWVudHMgKi88L3NwYW4+DQorPHNwYW4gY2xhc3M9ImtleXdvcmQiPmNsYXNzIDwvc3Bhbj5VbmRvY3VtZW50ZWQgeyB9Ow0KKzxzcGFuIGNsYXNzPSJjb21tZW50Ij48L3NwYW4+DQorPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8qISBDbGFzcyB0aGF0IGlzIGluaGVyaXRlZCB1c2luZyBwdWJsaWMgaW5oZXJpdGFuY2UgKi88L3NwYW4+DQorPHNwYW4gY2xhc3M9ImtleXdvcmQiPmNsYXNzIDwvc3Bhbj5QdWJsaWNCYXNlIDogPHNwYW4gY2xhc3M9ImtleXdvcmQiPnB1YmxpYzwvc3Bhbj4gVHJ1bmNhdGVkIHsgfTsNCis8c3BhbiBjbGFzcz0iY29tbWVudCI+PC9zcGFuPg0KKzxzcGFuIGNsYXNzPSJjb21tZW50Ij4vKiEgQSB0ZW1wbGF0ZSBjbGFzcyAqLzwvc3Bhbj4NCis8c3BhbiBjbGFzcz0ia2V5d29yZCI+dGVtcGxhdGU8L3NwYW4+Jmx0OzxzcGFuIGNsYXNzPSJrZXl3b3JkIj5jbGFzczwvc3Bhbj4gVCZndDsgPHNwYW4gY2xhc3M9ImtleXdvcmQiPmNsYXNzIDwvc3Bhbj5UZW1wbCB7IH07DQorPHNwYW4gY2xhc3M9ImNvbW1lbnQiPjwvc3Bhbj4NCis8c3BhbiBjbGFzcz0iY29tbWVudCI+LyohIENsYXNzIHRoYXQgaXMgaW5oZXJpdGVkIHVzaW5nIHByb3RlY3RlZCBpbmhlcml0YW5jZSAqLzwvc3Bhbj4NCis8c3BhbiBjbGFzcz0ia2V5d29yZCI+Y2xhc3MgPC9zcGFuPlByb3RlY3RlZEJhc2UgeyB9Ow0KKzxzcGFuIGNsYXNzPSJjb21tZW50Ij48L3NwYW4+DQorPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8qISBDbGFzcyB0aGF0IGlzIGluaGVyaXRlZCB1c2luZyBwcml2YXRlIGluaGVyaXRhbmNlICovPC9zcGFuPg0KKzxzcGFuIGNsYXNzPSJrZXl3b3JkIj5jbGFzcyA8L3NwYW4+UHJpdmF0ZUJhc2UgeyB9Ow0KKzxzcGFuIGNsYXNzPSJjb21tZW50Ij48L3NwYW4+DQorPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8qISBDbGFzcyB0aGF0IGlzIHVzZWQgYnkgdGhlIEluaGVyaXRlZCBjbGFzcyAqLzwvc3Bhbj4NCis8c3BhbiBjbGFzcz0ia2V5d29yZCI+Y2xhc3MgPC9zcGFuPlVzZWQgeyB9Ow0KKzxzcGFuIGNsYXNzPSJjb21tZW50Ij48L3NwYW4+DQorPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8qISBTdXBlciBjbGFzcyB0aGF0IGluaGVyaXRzIGEgbnVtYmVyIG9mIG90aGVyIGNsYXNzZXMgKi88L3NwYW4+DQorPHNwYW4gY2xhc3M9ImtleXdvcmQiPmNsYXNzIDwvc3Bhbj5Jbmhlcml0ZWQgOiA8c3BhbiBjbGFzcz0ia2V5d29yZCI+cHVibGljPC9zcGFuPiBQdWJsaWNCYXNlLA0KKyAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5wcm90ZWN0ZWQ8L3NwYW4+IFByb3RlY3RlZEJhc2UsDQorICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImtleXdvcmQiPnByaXZhdGU8L3NwYW4+IFByaXZhdGVCYXNlLA0KKyAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5wdWJsaWM8L3NwYW4+IFVuZG9jdW1lbnRlZA0KKyAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5wdWJsaWM8L3NwYW4+IFRlbXBsJmx0O2ludCZndDsNCit7DQorICA8c3BhbiBjbGFzcz0ia2V5d29yZCI+cHJpdmF0ZTwvc3Bhbj46DQorICAgIFVzZWQgKm1fdXNlZENsYXNzOw0KK307DQorPC9wcmU+PC9kaXY+SWYgdGhlIDxjb2RlPk1BWF9ET1RfR1JBUEhfSEVJR0hUPC9jb2RlPiB0YWcgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBzZXQgdG8gMjQwIHRoaXMgd2lsbCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBncmFwaDo8cD4NCis8Y2VudGVyPjxkaXYgYWxpZ249ImNlbnRlciI+DQorPGltZyBzcmM9ImdyYXBoX2xlZ2VuZC5wbmciIGFsdD0iZ3JhcGhfbGVnZW5kLnBuZyIgYWx0Pg0KKzwvZGl2Pg0KKzwvY2VudGVyPiA8cD4NCitUaGUgYm94ZXMgaW4gdGhlIGFib3ZlIGdyYXBoIGhhdmUgdGhlIGZvbGxvd2luZyBtZWFuaW5nOiA8dWw+DQorPGxpPg0KK0EgZmlsbGVkIGJsYWNrIGJveCByZXByZXNlbnRzIHRoZSBzdHJ1Y3Qgb3IgY2xhc3MgZm9yIHdoaWNoIHRoZSBncmFwaCBpcyBnZW5lcmF0ZWQuIDwvbGk+DQorPGxpPg0KK0EgYm94IHdpdGggYSBibGFjayBib3JkZXIgZGVub3RlcyBhIGRvY3VtZW50ZWQgc3RydWN0IG9yIGNsYXNzLiA8L2xpPg0KKzxsaT4NCitBIGJveCB3aXRoIGEgZ3JleSBib3JkZXIgZGVub3RlcyBhbiB1bmRvY3VtZW50ZWQgc3RydWN0IG9yIGNsYXNzLiA8L2xpPg0KKzxsaT4NCitBIGJveCB3aXRoIGEgcmVkIGJvcmRlciBkZW5vdGVzIGEgZG9jdW1lbnRlZCBzdHJ1Y3Qgb3IgY2xhc3MgZm9yd2hpY2ggbm90IGFsbCBpbmhlcml0YW5jZS9jb250YWlubWVudCByZWxhdGlvbnMgYXJlIHNob3duLiBBIGdyYXBoIGlzIHRydW5jYXRlZCBpZiBpdCBkb2VzIG5vdCBmaXQgd2l0aGluIHRoZSBzcGVjaWZpZWQgYm91bmRhcmllcy4gPC9saT4NCis8L3VsPg0KK1RoZSBhcnJvd3MgaGF2ZSB0aGUgZm9sbG93aW5nIG1lYW5pbmc6IDx1bD4NCis8bGk+DQorQSBkYXJrIGJsdWUgYXJyb3cgaXMgdXNlZCB0byB2aXN1YWxpemUgYSBwdWJsaWMgaW5oZXJpdGFuY2UgcmVsYXRpb24gYmV0d2VlbiB0d28gY2xhc3Nlcy4gPC9saT4NCis8bGk+DQorQSBkYXJrIGdyZWVuIGFycm93IGlzIHVzZWQgZm9yIHByb3RlY3RlZCBpbmhlcml0YW5jZS4gPC9saT4NCis8bGk+DQorQSBkYXJrIHJlZCBhcnJvdyBpcyB1c2VkIGZvciBwcml2YXRlIGluaGVyaXRhbmNlLiA8L2xpPg0KKzxsaT4NCitBIHB1cnBsZSBkYXNoZWQgYXJyb3cgaXMgdXNlZCBpZiBhIGNsYXNzIGlzIGNvbnRhaW5lZCBvciB1c2VkIGJ5IGFub3RoZXIgY2xhc3MuIFRoZSBhcnJvdyBpcyBsYWJlbGVkIHdpdGggdGhlIHZhcmlhYmxlKHMpIHRocm91Z2ggd2hpY2ggdGhlIHBvaW50ZWQgY2xhc3Mgb3Igc3RydWN0IGlzIGFjY2Vzc2libGUuIDwvbGk+DQorPGxpPg0KK0EgeWVsbG93IGRhc2hlZCBhcnJvdyBkZW5vdGVzIGEgcmVsYXRpb24gYmV0d2VlbiBhIHRlbXBsYXRlIGluc3RhbmNlIGFuZCB0aGUgdGVtcGxhdGUgY2xhc3MgaXQgd2FzIGluc3RhbnRpYXRlZCBmcm9tLiBUaGUgYXJyb3cgaXMgbGFiZWxlZCB3aXRoIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIG9mIHRoZSBpbnN0YW5jZS4gPC9saT4NCis8L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBGcmkgQXVnIDE5IDEwOjQxOjQ2IDIwMDUgZm9yIGdTT0FQIFdTLVNlY3VyaXR5IGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL2dyYXBoX2xlZ2VuZC5wbmcgYi9kb2Mvd3NzZS9odG1sL2dyYXBoX2xlZ2VuZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkzNDJiNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvZ3JhcGhfbGVnZW5kLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL2luZGV4Lmh0bWwgYi9kb2Mvd3NzZS9odG1sL2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUzZDIxMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvaW5kZXguaHRtbApAQCAtMCwwICsxLDE2IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBXUy1TZWN1cml0eTogTWFpbiBQYWdlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4SEwiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+Z1NPQVAgV1MtU2VjdXJpdHkgRG9jdW1lbnRhdGlvbjwvaDE+DQorPHA+DQorPGgzIGFsaWduPSJjZW50ZXIiPkJldGEgcmVsZWFzZSA8L2gzPjx1bD4NCis8bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlLmh0bWwiPlRoZSB3c3NlIHBsdWdpbjwvYT4gZG9jdW1lbnRzIHRoZSB3c3NlIHBsdWdpbiBmb3IgV1MtU2VjdXJpdHkgMS4wIHN1cHBvcnQuPC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnAuaHRtbCI+VGhlIHNtZGV2cCBlbmdpbmU8L2E+IGRvY3VtZW50cyB0aGUgc21kZXZwIGVuZ2luZSB1c2VkIGJ5IHRoZSB3c3NlIHBsdWdpbi4gPC9saT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBGcmkgQXVnIDE5IDEwOjQxOjQ1IDIwMDUgZm9yIGdTT0FQIFdTLVNlY3VyaXR5IGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3BhZ2VzLmh0bWwgYi9kb2Mvd3NzZS9odG1sL3BhZ2VzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEwZWJjYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvcGFnZXMuaHRtbApAQCAtMCwwICsxLDE4IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBXUy1TZWN1cml0eTogUGFnZSBJbmRleDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleEhMIiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPmdTT0FQIFdTLVNlY3VyaXR5IFJlbGF0ZWQgUGFnZXM8L2gxPkhlcmUgaXMgYSBsaXN0IG9mIGFsbCByZWxhdGVkIGRvY3VtZW50YXRpb24gcGFnZXM6PHVsPg0KKzxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cC5odG1sIj5UaGUgc21kZXZwIGVuZ2luZTwvYT4NCisNCis8bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlLmh0bWwiPlRoZSB3c3NlIHBsdWdpbjwvYT4NCisNCis8L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBGcmkgQXVnIDE5IDEwOjQxOjQ2IDIwMDUgZm9yIGdTT0FQIFdTLVNlY3VyaXR5IGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3NtZGV2cC5odG1sIGIvZG9jL3dzc2UvaHRtbC9zbWRldnAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDhkYzAyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zbWRldnAuaHRtbApAQCAtMCwwICsxLDgzIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBXUy1TZWN1cml0eTogVGhlIHNtZGV2cCBlbmdpbmU8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ic21kZXZwIj5UaGUgc21kZXZwIGVuZ2luZTwvYT48L2gxPlRoZSBnU09BUCBzbWRldnAgZW5naW5lIGNvbXB1dGVzIChzaWduZWQpIG1lc3NhZ2UgZGlnZXN0cyBvdmVyIGFueSB0eXBlIG9mIGRhdGEgdXNpbmcgdGhlIEVWUCBpbnRlcmZhY2Ugb2YgT3BlblNTTC4gSXQgY3VycmVudGx5IHN1cHBvcnRzIE1ENSwgU0hBMSwgSE1BQ19TSEExLCBEU0FfU0hBMSwgYW5kIFJTQV9TSEExLjxwPg0KK0EgZGlnZXN0IG9yIHNpZ25hdHVyZSBhbGdvcml0aG0gaXMgc2VsZWN0ZWQgd2l0aCBvbmUgdGhlIGZvbGxvd2luZyBjb25zdGFudHM6PHA+DQorPHVsPg0KKzxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84aC5odG1sI2E1Ij5TT0FQX1NNRF9ER1NUX01ENTwvYT4gdG8gY29tcHV0ZSBNRDUgMTI4LWJpdCBkaWdlc3RzPC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGguaHRtbCNhNiI+U09BUF9TTURfREdTVF9TSEExPC9hPiB0byBjb21wdXRlIE1ENSAxNjAtYml0IGRpZ2VzdHM8L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84aC5odG1sI2E3Ij5TT0FQX1NNRF9ITUFDX1NIQTE8L2E+IHRvIGNvbXB1dGUgSE1BQy1TSEExIG1lc3NhZ2UgYXV0aGVudGljYXRpb24gY29kZTwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0ic21kZXZwXzhoLmh0bWwjYTgiPlNPQVBfU01EX1NJR05fRFNBX1NIQTE8L2E+IHRvIGNvbXB1dGUgRFNBLVNIQTEgc2lnbmF0dXJlczwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0ic21kZXZwXzhoLmh0bWwjYTkiPlNPQVBfU01EX1NJR05fUlNBX1NIQTE8L2E+IHRvIGNvbXB1dGUgUlNBLVNIQTEgc2lnbmF0dXJlczwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0ic21kZXZwXzhoLmh0bWwjYTEwIj5TT0FQX1NNRF9WUkZZX0RTQV9TSEExPC9hPiB0byB2ZXJpZnkgRFNBLVNIQTEgc2lnbmF0dXJlczwvbGk+PGxpPjxhIGNsYXNzPSJlbCIgaHJlZj0ic21kZXZwXzhoLmh0bWwjYTExIj5TT0FQX1NNRF9WUkZZX1JTQV9TSEExPC9hPiB0byB2ZXJpZnkgUlNBLVNIQTEgc2lnbmF0dXJlczwvbGk+PC91bD4NCis8cD4NCitUaGUgc21kZXZwIGVuZ2luZSB3cmFwcyB0aGUgRVZQIEFQSSB3aXRoIHRocmVlIG5ldyBmdW5jdGlvbnM6PHA+DQorPHVsPg0KKzxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84aC5odG1sI2ExNSI+c29hcF9zbWRfaW5pdDwvYT4gdG8gaW5pdGlhbGl6ZSB0aGUgZW5naW5lPC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGguaHRtbCNhMTYiPnNvYXBfc21kX3VwZGF0ZTwvYT4gdG8gdXBkYXRlIHRoZSBzdGF0ZSB3aXRoIGEgbWVzc2FnZSBwYXJ0PC9saT48bGk+PGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGguaHRtbCNhMTciPnNvYXBfc21kX2ZpbmFsPC9hPiB0byBjb21wdXRlIHRoZSBkaWdlc3QsIHNpZ25hdHVyZSwgb3IgdmVyaWZ5IGEgc2lnbmF0dXJlPC9saT48L3VsPg0KKzxwPg0KK0EgaGlnaGVyLWxldmVsIGludGVyZmFjZSBmb3IgY29tcHV0aW5nIChzaWduZWQpIG1lc3NhZ2UgZGlnZXN0cyBvdmVyIG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IHRoZSBnU09BUCBlbmdpbnJlIGlzIGRlZmluZWQgYnkgdHdvIG5ldyBmdW5jdGlvbnM6PHA+DQorPHVsPg0KKzxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84aC5odG1sI2ExMyI+c29hcF9zbWRfYmVnaW48L2E+IHRvIHN0YXJ0IGEgZGlnZXN0IG9yIHNpZ25hdHVyZSBjb21wdXRhdGlvbi92ZXJpZmljYXRpb248L2xpPjxsaT48YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84aC5odG1sI2ExNCI+c29hcF9zbWRfZW5kPC9hPiB0byBjb21wbGV0ZSBhIGRpZ2VzdC9zaWduYXR1cmUgY29tcHV0YXRpb24vdmVyaWZpY2F0aW9uPC9saT48L3VsPg0KKzxwPg0KK0hlcmUgaXMgYW4gZXhhbXBsZSB0byBzaWduIGFuIFhNTCBzZXJpYWxpemVkIEMrKyBvYmplY3QgdXNpbmcgYW4gUlNBIHByaXZhdGUga2V5IGFwcGxpZWQgdG8gdGhlIFNIQTEgZGlnZXN0IG9mIHRoZSBzZXJpYWxpemVkIG9iamVjdDo8cD4NCis8ZGl2IGNsYXNzPSJmcmFnbWVudCI+PHByZT4gICAgbnNfX09iamVjdCAqb2JqZWN0ID0gLi4uOw0KKyAgICA8c3BhbiBjbGFzcz0ia2V5d29yZHR5cGUiPmludDwvc3Bhbj4gYWxnID0gPGEgY2xhc3M9ImNvZGUiIGhyZWY9InNtZGV2cF84aC5odG1sI2E5Ij5TT0FQX1NNRF9TSUdOX1JTQV9TSEExPC9hPjsNCisgICAgRklMRSAqZmQgPSBmb3Blbig8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+ImtleS5wZW0iPC9zcGFuPiwgPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJyIjwvc3Bhbj4pOw0KKyAgICBFVlBfUEtFWSAqa2V5ID0gUEVNX3JlYWRfUHJpdmF0ZUtleShmZCwgTlVMTCwgTlVMTCwgPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJwYXNzd29yZCI8L3NwYW4+KTsNCisgICAgPHNwYW4gY2xhc3M9ImtleXdvcmR0eXBlIj5jaGFyPC9zcGFuPiAqc2lnID0gKDxzcGFuIGNsYXNzPSJrZXl3b3JkdHlwZSI+Y2hhcjwvc3Bhbj4qKVNPQVBfTUFMTE9DKHNvYXAsIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJzbWRldnBfOGMuaHRtbCNhMyI+c29hcF9zbWRfc2l6ZTwvYT4oYWxnLCBrZXkpKTsNCisgICAgPHNwYW4gY2xhc3M9ImtleXdvcmR0eXBlIj5pbnQ8L3NwYW4+IHNpZ2xlbjsNCisgICAgZmNsb3NlKGZkKTsNCisgICAgPHNwYW4gY2xhc3M9ImtleXdvcmRmbG93Ij5pZjwvc3Bhbj4gKDxhIGNsYXNzPSJjb2RlIiBocmVmPSJzbWRldnBfOGMuaHRtbCNhNCI+c29hcF9zbWRfYmVnaW48L2E+KHNvYXAsIGFsZywga2V5LCAwKQ0KKyAgICAgfHwgc29hcF9vdXRfbnNfX09iamVjdChzb2FwLCA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+Im5zOk9iamVjdCI8L3NwYW4+LCAwLCBvYmplY3QsIE5VTEwpDQorICAgICB8fCA8YSBjbGFzcz0iY29kZSIgaHJlZj0ic21kZXZwXzhjLmh0bWwjYTUiPnNvYXBfc21kX2VuZDwvYT4oc29hcCwgc2lnLCAmYW1wO3NpZ2xlbikpDQorICAgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOw0KKyAgICA8c3BhbiBjbGFzcz0ia2V5d29yZGZsb3ciPmVsc2U8L3NwYW4+DQorICAgICAgLi4uIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBzaWcgY29udGFpbnMgUlNBLVNIQTEgc2lnbmF0dXJlIG9mIGxlbmd0aCBzaWdsZW4gPC9zcGFuPg0KKzwvcHJlPjwvZGl2PjxwPg0KK1RvIHZlcmlmeSB0aGUgc2lnbmF0dXJlLCB3ZSB1c2UgdGhlIFJTQSBwdWJsaWMga2V5IGFuZCByZS1ydW4gdGhlIG9jdGV0IHN0cmVhbSAoYnkgcmUtc2VyaWFsaXphdGlvbiBpbiB0aGlzIGV4YW1wbGUpIHRocm91Z2ggdGhlIHNtZGV2cCBlbmdpbmUgdXNpbmcgdGhlIFNPQVBfU01EX1ZSRllfUlNBX1NIQTEgYWxnb3JpdGhtLiBOb3RlIHRoYXQgYSBQRU0gZmlsZSBtYXkgY29udGFpbiBib3RoIHRoZSAoZW5jcnlwdGVkKSBwcml2YXRlIGFuZCBwdWJsaWMga2V5cy48cD4NCis8ZGl2IGNsYXNzPSJmcmFnbWVudCI+PHByZT4gICAgPHNwYW4gY2xhc3M9ImtleXdvcmR0eXBlIj5jaGFyPC9zcGFuPiAqc2lnID0gLi4uOw0KKyAgICA8c3BhbiBjbGFzcz0ia2V5d29yZHR5cGUiPmludDwvc3Bhbj4gc2lnbGVuID0gLi4uOw0KKyAgICBuc19fT2JqZWN0ICpvYmplY3QgPSAuLi47DQorICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkdHlwZSI+aW50PC9zcGFuPiBhbGcgPSA8YSBjbGFzcz0iY29kZSIgaHJlZj0ic21kZXZwXzhoLmh0bWwjYTExIj5TT0FQX1NNRF9WUkZZX1JTQV9TSEExPC9hPjsNCisgICAgRklMRSAqZmQgPSBmb3Blbig8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+ImtleS5wZW0iPC9zcGFuPiwgPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJyIjwvc3Bhbj4pOw0KKyAgICBFVlBfUEtFWSAqa2V5ID0gUEVNX3JlYWRfUFVCS0VZKGZkLCBOVUxMLCBOVUxMLCBOVUxMKTsNCisgICAgZmNsb3NlKGZkKTsNCisgICAgPHNwYW4gY2xhc3M9ImtleXdvcmRmbG93Ij5pZjwvc3Bhbj4gKDxhIGNsYXNzPSJjb2RlIiBocmVmPSJzbWRldnBfOGMuaHRtbCNhNCI+c29hcF9zbWRfYmVnaW48L2E+KHNvYXAsIGFsZywga2V5LCAwKQ0KKyAgICAgfHwgc29hcF9vdXRfbnNfX09iamVjdChzb2FwLCA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+Im5zOk9iamVjdCI8L3NwYW4+LCAwLCBvYmplY3QsIE5VTEwpDQorICAgICB8fCA8YSBjbGFzcz0iY29kZSIgaHJlZj0ic21kZXZwXzhjLmh0bWwjYTUiPnNvYXBfc21kX2VuZDwvYT4oc29hcCwgc2lnLCAmYW1wO3NpZ2xlbikpDQorICAgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOw0KKyAgICA8c3BhbiBjbGFzcz0ia2V5d29yZGZsb3ciPmVsc2U8L3NwYW4+DQorICAgICAgLi4uIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBzaWcgdmVyaWZpZWQsIGkuZS4gc2lnbmVkIG9iamVjdCB3YXMgbm90IGNoYW5nZWQ8L3NwYW4+DQorPC9wcmU+PC9kaXY+PHA+DQorVGhlIEhNQUMgYWxnb3JpdGhtIHVzZXMgYSBzZWNyZXQga2V5ICh3aGljaCBib3RoIHRoZSBzZW5kZXIgYW5kIHJlY2VpdmVyIG11c3Qga2VlcCBzZWNyZXQpIHRvIHNpZ24gYW5kIHZlcmlmeSBhIG1lc3NhZ2U6PHA+DQorPGRpdiBjbGFzcz0iZnJhZ21lbnQiPjxwcmU+ICAgIG5zX19PYmplY3QgKm9iamVjdCA9IC4uLjsNCisgICAgPHNwYW4gY2xhc3M9ImtleXdvcmR0eXBlIj5pbnQ8L3NwYW4+IGFsZyA9IDxhIGNsYXNzPSJjb2RlIiBocmVmPSJzbWRldnBfOGguaHRtbCNhNyI+U09BUF9TTURfSE1BQ19TSEExPC9hPjsNCisgICAgPHNwYW4gY2xhc3M9ImtleXdvcmQiPnN0YXRpYzwvc3Bhbj4gPHNwYW4gY2xhc3M9ImtleXdvcmR0eXBlIj5jaGFyPC9zcGFuPiBrZXlbMTZdID0NCisgICAgeyAweGZmLCAweGVlLCAweGRkLCAweGNjLCAweGJiLCAweGFhLCAweDk5LCAweDg4LA0KKyAgICAgIDB4NzcsIDB4NjYsIDB4NTUsIDB4NDQsIDB4MzMsIDB4MjIsIDB4MTEsIDB4MDAgfTsNCisgICAgPHNwYW4gY2xhc3M9ImtleXdvcmR0eXBlIj5jaGFyPC9zcGFuPiAqc2lnID0gKDxzcGFuIGNsYXNzPSJrZXl3b3JkdHlwZSI+Y2hhcjwvc3Bhbj4qKVNPQVBfTUFMTE9DKHNvYXAsIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJzbWRldnBfOGMuaHRtbCNhMyI+c29hcF9zbWRfc2l6ZTwvYT4oYWxnLCBOVUxMKSk7DQorICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkdHlwZSI+aW50PC9zcGFuPiBzaWdsZW47DQorICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkZmxvdyI+aWY8L3NwYW4+ICg8YSBjbGFzcz0iY29kZSIgaHJlZj0ic21kZXZwXzhjLmh0bWwjYTQiPnNvYXBfc21kX2JlZ2luPC9hPihzb2FwLCBhbGcsIGtleSwgPHNwYW4gY2xhc3M9ImtleXdvcmQiPnNpemVvZjwvc3Bhbj4oa2V5KSkNCisgICAgIHx8IHNvYXBfb3V0X25zX19PYmplY3Qoc29hcCwgPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJuczpPYmplY3QiPC9zcGFuPiwgMCwgb2JqZWN0LCBOVUxMKQ0KKyAgICAgfHwgPGEgY2xhc3M9ImNvZGUiIGhyZWY9InNtZGV2cF84Yy5odG1sI2E1Ij5zb2FwX3NtZF9lbmQ8L2E+KHNvYXAsIHNpZywgJmFtcDtzaWdsZW4pKQ0KKyAgICAgIHNvYXBfcHJpbnRfZmF1bHQoc29hcCwgc3RkZXJyKTsNCisgICAgPHNwYW4gY2xhc3M9ImtleXdvcmRmbG93Ij5lbHNlPC9zcGFuPg0KKyAgICAgIC4uLiA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gc2lnIGhvbGRzIHRoZSBzaWduYXR1cmU8L3NwYW4+DQorPC9wcmU+PC9kaXY+PHA+DQorTm90ZTogSE1BQyBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIHByb2NlZWRzIGJ5IHJlY29tcHV0aW5nIHRoZSBzaWduYXR1cmUgdmFsdWUgZm9yIGNvbXBhcmlzb24uPHA+DQorQSBkaWdlc3QgaXMgYSBoYXNoIHZhbHVlIG9mIGFuIG9jdGV0IHN0cmVhbSBjb21wdXRlZCB1c2luZyB0aGUgTUQ1IG9yIFNIQTEgYWxnb3JpdGhtczo8cD4NCis8ZGl2IGNsYXNzPSJmcmFnbWVudCI+PHByZT4gICAgbnNfX09iamVjdCAqb2JqZWN0ID0gLi4uOw0KKyAgICA8c3BhbiBjbGFzcz0ia2V5d29yZHR5cGUiPmludDwvc3Bhbj4gYWxnID0gPGEgY2xhc3M9ImNvZGUiIGhyZWY9InNtZGV2cF84aC5odG1sI2E2Ij5TT0FQX1NNRF9ER1NUX1NIQTE8L2E+Ow0KKyAgICA8c3BhbiBjbGFzcz0ia2V5d29yZHR5cGUiPmNoYXI8L3NwYW4+ICpkaWdlc3QgPSAoPHNwYW4gY2xhc3M9ImtleXdvcmR0eXBlIj5jaGFyPC9zcGFuPiopU09BUF9NQUxMT0Moc29hcCwgPGEgY2xhc3M9ImNvZGUiIGhyZWY9InNtZGV2cF84Yy5odG1sI2EzIj5zb2FwX3NtZF9zaXplPC9hPihhbGcsIE5VTEwpKTsNCisgICAgPHNwYW4gY2xhc3M9ImtleXdvcmR0eXBlIj5pbnQ8L3NwYW4+IGRpZ2VzdGxlbjsNCisgICAgPHNwYW4gY2xhc3M9ImtleXdvcmRmbG93Ij5pZjwvc3Bhbj4gKDxhIGNsYXNzPSJjb2RlIiBocmVmPSJzbWRldnBfOGMuaHRtbCNhNCI+c29hcF9zbWRfYmVnaW48L2E+KHNvYXAsIGFsZywgTlVMTCwgMCkNCisgICAgIHx8IHNvYXBfb3V0X25zX19PYmplY3Qoc29hcCwgPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJuczpPYmplY3QiPC9zcGFuPiwgMCwgb2JqZWN0LCBOVUxMKQ0KKyAgICAgfHwgPGEgY2xhc3M9ImNvZGUiIGhyZWY9InNtZGV2cF84Yy5odG1sI2E1Ij5zb2FwX3NtZF9lbmQ8L2E+KHNvYXAsIGRpZ2VzdCwgJmFtcDtkaWdlc3RsZW4pKQ0KKyAgICAgIHNvYXBfcHJpbnRfZmF1bHQoc29hcCwgc3RkZXJyKTsNCisgICAgPHNwYW4gY2xhc3M9ImtleXdvcmRmbG93Ij5lbHNlPC9zcGFuPg0KKyAgICAgIC4uLiA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gZGlnZXN0IGhvbGRzIGhhc2ggdmFsdWUgb2Ygc2VyaWFsaXplZCBvYmplY3Q8L3NwYW4+DQorPC9wcmU+PC9kaXY+PHA+DQorTm90ZSB0aGF0IGluZGVudGF0aW9uIChTT0FQX1hNTF9JTkRFTlQpIGFuZCBleGMtYzE0biBjYW5vbmljYWxpemF0aW9uIChTT0FQX1hNTF9DQU5PTklDQUwpIGFmZmVjdHMgdGhlIFhNTCBzZXJpYWxpemF0aW9uIGZvcm1hdCBhbmQsIHRoZXJlZm9yZSwgdGhlIGRpZ2VzdCBvciBzaWduYXR1cmUgcHJvZHVjZWQuIDxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBGcmkgQXVnIDE5IDEwOjQxOjQ2IDIwMDUgZm9yIGdTT0FQIFdTLVNlY3VyaXR5IGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3NtZGV2cF84Yy5odG1sIGIvZG9jL3dzc2UvaHRtbC9zbWRldnBfOGMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTQ1NTVmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zbWRldnBfOGMuaHRtbApAQCAtMCwwICsxLDU2MSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgV1MtU2VjdXJpdHk6IC9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy93c3NlL3NtZGV2cC5jIEZpbGUgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy93c3NlL3NtZGV2cC5jIEZpbGUgUmVmZXJlbmNlPC9oMT48Y29kZT4jaW5jbHVkZSAiPGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGguaHRtbCI+c21kZXZwLmg8L2E+IjwvY29kZT48YnI+DQorDQorPHA+DQorSW5jbHVkZSBkZXBlbmRlbmN5IGdyYXBoIGZvciBzbWRldnAuYzo8cD48Y2VudGVyPjxpbWcgc3JjPSJzbWRldnBfOGNfX2luY2wucG5nIiBib3JkZXI9IjAiIHVzZW1hcD0iI3NtZGV2cC5jX21hcCIgYWx0PSJJbmNsdWRlIGRlcGVuZGVuY3kgZ3JhcGgiPjwvY2VudGVyPg0KKzxtYXAgbmFtZT0ic21kZXZwLmNfbWFwIj4NCis8YXJlYSBocmVmPSJzbWRldnBfOGguaHRtbCIgc2hhcGU9InJlY3QiIGNvb3Jkcz0iMTEsOTIsNzcsMTE4IiBhbHQ9IiI+DQorPC9tYXA+DQorPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPkZ1bmN0aW9uczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic21kZXZwXzhjLmh0bWwjYTAiPnNvYXBfc21kX3NlbmQ8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5DYWxsYmFjayB0byBpbnRlcmNlcHQgbWVzc2FnZXMgZm9yIGRpZ2VzdCBvciBzaWduYXR1cmUgY29tcHV0YXRpb24uICA8YSBocmVmPSIjYTAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zaXplX3QmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic21kZXZwXzhjLmh0bWwjYTEiPnNvYXBfc21kX3JlY3Y8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqYnVmLCBzaXplX3QgbGVuKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5EdW1teSBjYWxsYmFjayB0byBhdm9pZCByZWFkIG9wZXJhdGlvbnMgZnJvbSBibG9ja2luZy4gIDxhIGhyZWY9IiNhMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGMuaHRtbCNhMiI+c29hcF9zbWRfY2hlY2s8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fc21kX19kYXRhLmh0bWwiPnNvYXBfc21kX2RhdGE8L2E+ICpkYXRhLCBpbnQgZXJyLCBjb25zdCBjaGFyICptc2cpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkNoZWNrIHJlc3VsdCBvZiBpbml0L3VwZGF0ZS9maW5hbCBzbWRldnAgZW5naW5lIG9wZXJhdGlvbnMuICA8YSBocmVmPSIjYTIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zaXplX3QmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic21kZXZwXzhjLmh0bWwjYTMiPnNvYXBfc21kX3NpemU8L2E+IChpbnQgYWxnLCBjb25zdCB2b2lkICprZXkpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlJldHVybnMgdGhlIG51bWJlciBvZiBvY3RldHMgbmVlZGVkIHRvIHN0b3JlIHRoZSBkaWdlc3Qgb3Igc2lnbmF0dXJlIHJldHVybmVkIGJ5IHNvYXBfc21kX2VuZC4gIDxhIGhyZWY9IiNhMyI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGMuaHRtbCNhNCI+c29hcF9zbWRfYmVnaW48L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGFsZywgY29uc3Qgdm9pZCAqa2V5LCBpbnQga2V5bGVuKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5Jbml0aWF0ZXMgYSBkaWdlc3Qgb3Igc2lnbmF0dXJlIGNvbXB1dGF0aW9uLiAgPGEgaHJlZj0iI2E0Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84Yy5odG1sI2E1Ij5zb2FwX3NtZF9lbmQ8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqYnVmLCBpbnQgKmxlbik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+Q29tcGxldGVzIGEgZGlnZXN0IG9yIHNpZ25hdHVyZSBjb21wdXRhdGlvbi4gIDxhIGhyZWY9IiNhNSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGMuaHRtbCNhNiI+c29hcF9zbWRfaW5pdDwvYT4gKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19zbWRfX2RhdGEuaHRtbCI+c29hcF9zbWRfZGF0YTwvYT4gKmRhdGEsIGludCBhbGcsIGNvbnN0IHZvaWQgKmtleSwgaW50IGtleWxlbik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+SW5pdGlhdGVzIGEgKHNpZ25lZCkgZGlnZXN0IGNvbXB1dGF0aW9uLiAgPGEgaHJlZj0iI2E2Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84Yy5odG1sI2E3Ij5zb2FwX3NtZF91cGRhdGU8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fc21kX19kYXRhLmh0bWwiPnNvYXBfc21kX2RhdGE8L2E+ICpkYXRhLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlVwZGF0ZXMgKHNpZ25lZCkgZGlnZXN0IGNvbXB1dGF0aW9uIHdpdGggbWVzc2FnZSBwYXJ0LiAgPGEgaHJlZj0iI2E3Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84Yy5odG1sI2E4Ij5zb2FwX3NtZF9maW5hbDwvYT4gKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19zbWRfX2RhdGEuaHRtbCI+c29hcF9zbWRfZGF0YTwvYT4gKmRhdGEsIGNoYXIgKmJ1ZiwgaW50ICpsZW4pPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkZpbmFsaXplcyAoc2lnbmVkKSBkaWdlc3QgY29tcHV0YXRpb24gYW5kIHJldHVybnMgZGlnZXN0IG9yIHNpZ25hdHVyZS4gIDxhIGhyZWY9IiNhOCI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGgyPkZ1bmN0aW9uIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE0IiBkb3h5dGFnPSJzbWRldnAuYzo6c29hcF9zbWRfYmVnaW4iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IHNvYXBfc21kX2JlZ2luICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmludCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5hbGc8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3Qgdm9pZCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmtleTwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5pbnQmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+a2V5bGVuPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0luaXRpYXRlcyBhIGRpZ2VzdCBvciBzaWduYXR1cmUgY29tcHV0YXRpb24uIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmFsZzwvZW0+Jm5ic3A7PC90ZD48dGQ+aXMgdGhlIGRpZ2VzdCBvciBzaWduYXR1cmUgKHNpZ24vdmVyaWZpY2F0aW9uKSBhbGdvcml0aG0gdXNlZCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmtleTwvZW0+Jm5ic3A7PC90ZD48dGQ+aXMgYSBITUFDIGtleSBvciBwb2ludGVyIHRvIEVWUF9QS0VZIG9iamVjdCBvciBOVUxMIGZvciBkaWdlc3RzIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+a2V5bGVuPC9lbT4mbmJzcDs8L3RkPjx0ZD5pcyB0aGUgbGVuZ3RoIG9mIHRoZSBITUFDIGtleSBvciAwIDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+U09BUF9PSywgU09BUF9FT00sIG9yIFNPQVBfU1NMX0VSUk9SIDwvZGQ+PC9kbD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMiIgZG94eXRhZz0ic21kZXZwLmM6OnNvYXBfc21kX2NoZWNrIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBzb2FwX3NtZF9jaGVjayAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19zbWRfX2RhdGEuaHRtbCI+c29hcF9zbWRfZGF0YTwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5kYXRhPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmludCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5lcnI8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPm1zZzwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PGNvZGU+IFtzdGF0aWNdPC9jb2RlPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQ2hlY2sgcmVzdWx0IG9mIGluaXQvdXBkYXRlL2ZpbmFsIHNtZGV2cCBlbmdpbmUgb3BlcmF0aW9ucy4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luLG91dF08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmRhdGE8L2VtPiZuYnNwOzwvdGQ+PHRkPnNtZGV2cCBlbmdpbmUgY29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmVycjwvZW0+Jm5ic3A7PC90ZD48dGQ+T3BlblNTTCBlcnJvciB2YWx1ZSA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPm1zZzwvZW0+Jm5ic3A7PC90ZD48dGQ+ZXJyb3IgbWVzc2FnZSA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPlNPQVBfT0sgb3IgU09BUF9TU0xfRVJST1IgPC9kZD48L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE1IiBkb3h5dGFnPSJzbWRldnAuYzo6c29hcF9zbWRfZW5kIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBzb2FwX3NtZF9lbmQgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmJ1ZjwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5pbnQgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5sZW48L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQ29tcGxldGVzIGEgZGlnZXN0IG9yIHNpZ25hdHVyZSBjb21wdXRhdGlvbi4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+YnVmPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250YWlucyBzaWduYXR1cmUgZm9yIHZlcmlmaWNhdGlvbiAod2hlbiB1c2luZyBhIFNPQVBfU01EX1ZSRlkgYWxnb3JpdGhtKSA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0PltvdXRdPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5idWY8L2VtPiZuYnNwOzwvdGQ+PHRkPmlzIHBvcHVsYXRlZCB3aXRoIHRoZSBkaWdlc3Qgb3Igc2lnbmF0dXJlIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+bGVuPC9lbT4mbmJzcDs8L3RkPjx0ZD5wb2ludHMgdG8gbGVuZ3RoIG9mIHNpZ25hdHVyZSB0byB2ZXJpZnkgKHdoZW4gdXNpbmcgYSBTT0FQX1NNRF9WUkZZIGFsZ29yaXRobSkgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5bb3V0XTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+bGVuPC9lbT4mbmJzcDs8L3RkPjx0ZD5wb2ludHMgdG8gbGVuZ3RoIG9mIHN0b3JlZCBkaWdlc3Qgb3Igc2lnbmF0dXJlICh3aGVuIG5vdCBOVUxMKSA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPlNPQVBfT0ssIFNPQVBfVVNFUl9FUlJPUiwgb3IgU09BUF9TU0xfRVJST1IgPC9kZD48L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE4IiBkb3h5dGFnPSJzbWRldnAuYzo6c29hcF9zbWRfZmluYWwiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IHNvYXBfc21kX2ZpbmFsICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPnN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3NtZF9fZGF0YS5odG1sIj5zb2FwX3NtZF9kYXRhPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmRhdGE8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmJ1ZjwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5pbnQgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5sZW48L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorRmluYWxpemVzIChzaWduZWQpIGRpZ2VzdCBjb21wdXRhdGlvbiBhbmQgcmV0dXJucyBkaWdlc3Qgb3Igc2lnbmF0dXJlLiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW4sb3V0XTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+ZGF0YTwvZW0+Jm5ic3A7PC90ZD48dGQ+c21kZXZwIGVuZ2luZSBjb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+YnVmPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250YWlucyBzaWduYXR1cmUgZm9yIHZlcmlmaWNhdGlvbiAoU09BUF9TTURfVlJGWSBhbGdvcml0aG1zKSA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0PltvdXRdPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5idWY8L2VtPiZuYnNwOzwvdGQ+PHRkPmlzIHBvcHVsYXRlZCB3aXRoIHRoZSBkaWdlc3Qgb3Igc2lnbmF0dXJlIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+bGVuPC9lbT4mbmJzcDs8L3RkPjx0ZD5wb2ludHMgdG8gbGVuZ3RoIG9mIHNpZ25hdHVyZSB0byB2ZXJpZnkgKFNPQVBfU01EX1ZSRlkgYWxnb3JpdGhtcykgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5bb3V0XTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+bGVuPC9lbT4mbmJzcDs8L3RkPjx0ZD5wb2ludHMgdG8gbGVuZ3RoIG9mIHN0b3JlZCBkaWdlc3Qgb3Igc2lnbmF0dXJlIChwYXNzIE5VTEwgaWYgeW91IGFyZSBub3QgaW50ZXJlc3RlZCBpbiB0aGlzIHZhbHVlKSA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPlNPQVBfT0sgb3IgU09BUF9TU0xfRVJST1IgPC9kZD48L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE2IiBkb3h5dGFnPSJzbWRldnAuYzo6c29hcF9zbWRfaW5pdCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgc29hcF9zbWRfaW5pdCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19zbWRfX2RhdGEuaHRtbCI+c29hcF9zbWRfZGF0YTwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5kYXRhPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmludCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5hbGc8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3Qgdm9pZCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmtleTwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5pbnQmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+a2V5bGVuPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0luaXRpYXRlcyBhIChzaWduZWQpIGRpZ2VzdCBjb21wdXRhdGlvbi4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luLG91dF08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmRhdGE8L2VtPiZuYnNwOzwvdGQ+PHRkPnNtZGV2cCBlbmdpbmUgY29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmFsZzwvZW0+Jm5ic3A7PC90ZD48dGQ+aXMgYWxnb3JpdGhtIHRvIHVzZSA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmtleTwvZW0+Jm5ic3A7PC90ZD48dGQ+aXMga2V5IHRvIHVzZSBvciBOVUxMIGZvciBkaWdlc3RzIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+a2V5bGVuPC9lbT4mbmJzcDs8L3RkPjx0ZD5pcyBsZW5ndGggb2YgSE1BQyBrZXkgKHdoZW4gcHJvdmlkZWQpIDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+U09BUF9PSyBvciBTT0FQX1NTTF9FUlJPUiA8L2RkPjwvZGw+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTEiIGRveHl0YWc9InNtZGV2cC5jOjpzb2FwX3NtZF9yZWN2IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHNpemVfdCBzb2FwX3NtZF9yZWN2ICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5idWY8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+c2l6ZV90Jm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmxlbjwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PGNvZGU+IFtzdGF0aWNdPC9jb2RlPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorRHVtbXkgY2FsbGJhY2sgdG8gYXZvaWQgcmVhZCBvcGVyYXRpb25zIGZyb20gYmxvY2tpbmcuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD4wIDwvZGQ+PC9kbD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMCIgZG94eXRhZz0ic21kZXZwLmM6OnNvYXBfc21kX3NlbmQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IHNvYXBfc21kX3NlbmQgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmJ1ZjwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5zaXplX3QmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+bGVuPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48Y29kZT4gW3N0YXRpY108L2NvZGU+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitDYWxsYmFjayB0byBpbnRlcmNlcHQgbWVzc2FnZXMgZm9yIGRpZ2VzdCBvciBzaWduYXR1cmUgY29tcHV0YXRpb24uIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmJ1ZjwvZW0+Jm5ic3A7PC90ZD48dGQ+bWVzc2FnZSA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmxlbjwvZW0+Jm5ic3A7PC90ZD48dGQ+bWVzc2FnZSBsZW5ndGggPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5TT0FQX09LIG9yIFNPQVBfU1NMX0VSUk9SIDwvZGQ+PC9kbD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMyIgZG94eXRhZz0ic21kZXZwLmM6OnNvYXBfc21kX3NpemUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc2l6ZV90IHNvYXBfc21kX3NpemUgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5pbnQmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+YWxnPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IHZvaWQgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5rZXk8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorUmV0dXJucyB0aGUgbnVtYmVyIG9mIG9jdGV0cyBuZWVkZWQgdG8gc3RvcmUgdGhlIGRpZ2VzdCBvciBzaWduYXR1cmUgcmV0dXJuZWQgYnkgc29hcF9zbWRfZW5kLiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5hbGc8L2VtPiZuYnNwOzwvdGQ+PHRkPmlzIHRoZSBkaWdlc3Qgb3Igc2lnbmF0dXJlIGFsZ29yaXRobSB0byBiZSB1c2VkIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+a2V5PC9lbT4mbmJzcDs8L3RkPjx0ZD5pcyBhIHBvaW50ZXIgdG8gYW4gRVZQX1BLRVkgb2JqZWN0IGZvciBSU0EvRFNBIHNpZ25hdHVyZXMgb3IgTlVMTCBmb3IgZGlnZXN0cyBhbmQgSE1BQyA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPnNpemVfdCBudW1iZXIgb2Ygb2N0ZXRzIHRoYXQgaXMgbmVlZGVkIHRvIGhvbGQgZGlnZXN0IG9yIHNpZ25hdHVyZSA8L2RkPjwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlNlZSBhbHNvOjwvYj48L2R0PjxkZD48YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84aC5odG1sI2ExNCI+c29hcF9zbWRfZW5kPC9hPjwvZGQ+PC9kbD4NCitUaGUgdmFsdWVzIHJldHVybmVkIGZvciBkaWdlc3RzIGFyZSBTT0FQX1NNRF9NRDVfU0laRSBhbmQgU09BUF9TTURfU0hBMV9TSVpFLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNyIgZG94eXRhZz0ic21kZXZwLmM6OnNvYXBfc21kX3VwZGF0ZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgc29hcF9zbWRfdXBkYXRlICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPnN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3NtZF9fZGF0YS5odG1sIj5zb2FwX3NtZF9kYXRhPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmRhdGE8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmJ1ZjwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5zaXplX3QmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+bGVuPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1VwZGF0ZXMgKHNpZ25lZCkgZGlnZXN0IGNvbXB1dGF0aW9uIHdpdGggbWVzc2FnZSBwYXJ0LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW4sb3V0XTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+ZGF0YTwvZW0+Jm5ic3A7PC90ZD48dGQ+c21kZXZwIGVuZ2luZSBjb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+YnVmPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250YWlucyBtZXNzYWdlIHBhcnQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5sZW48L2VtPiZuYnNwOzwvdGQ+PHRkPm9mIG1lc3NhZ2UgcGFydCA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPlNPQVBfT0sgb3IgU09BUF9TU0xfRVJST1IgPC9kZD48L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBGcmkgQXVnIDE5IDEwOjQxOjQ1IDIwMDUgZm9yIGdTT0FQIFdTLVNlY3VyaXR5IGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3NtZGV2cF84Y19faW5jbC5tYXAgYi9kb2Mvd3NzZS9odG1sL3NtZGV2cF84Y19faW5jbC5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI3MTJlZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc21kZXZwXzhjX19pbmNsLm1hcApAQCAtMCwwICsxLDIgQEAKK2Jhc2UgcmVmZXJlcgorcmVjdCAkc21kZXZwXzhoLmh0bWwgMTEsOTIgNzcsMTE4CmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3NtZGV2cF84Y19faW5jbC5tZDUgYi9kb2Mvd3NzZS9odG1sL3NtZGV2cF84Y19faW5jbC5tZDUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE2YzJmZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc21kZXZwXzhjX19pbmNsLm1kNQpAQCAtMCwwICsxIEBACitkZWNkMzQ1NDEyZjQ3ZDZkYzA3ZTUyMmEyZDRlYmEwMwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc21kZXZwXzhjX19pbmNsLnBuZyBiL2RvYy93c3NlL2h0bWwvc21kZXZwXzhjX19pbmNsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWQxYzRiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zbWRldnBfOGNfX2luY2wucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc21kZXZwXzhoLmh0bWwgYi9kb2Mvd3NzZS9odG1sL3NtZGV2cF84aC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNjRlNTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3NtZGV2cF84aC5odG1sCkBAIC0wLDAgKzEsNzA0IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBXUy1TZWN1cml0eTogL1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3dzc2Uvc21kZXZwLmggRmlsZSBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3dzc2Uvc21kZXZwLmggRmlsZSBSZWZlcmVuY2U8L2gxPjxjb2RlPiNpbmNsdWRlICJzdGRzb2FwMi5oIjwvY29kZT48YnI+DQorDQorPHA+DQorSW5jbHVkZSBkZXBlbmRlbmN5IGdyYXBoIGZvciBzbWRldnAuaDo8cD48Y2VudGVyPjxpbWcgc3JjPSJzbWRldnBfOGhfX2luY2wucG5nIiBib3JkZXI9IjAiIHVzZW1hcD0iI3NtZGV2cC5oX21hcCIgYWx0PSJJbmNsdWRlIGRlcGVuZGVuY3kgZ3JhcGgiPjwvY2VudGVyPg0KKw0KKzxwPg0KK1RoaXMgZ3JhcGggc2hvd3Mgd2hpY2ggZmlsZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbmNsdWRlIHRoaXMgZmlsZTo8cD48Y2VudGVyPjxpbWcgc3JjPSJzbWRldnBfOGhfX2RlcF9faW5jbC5wbmciIGJvcmRlcj0iMCIgdXNlbWFwPSIjc21kZXZwLmhkZXBfbWFwIiBhbHQ9IkluY2x1ZGVkIGJ5IGRlcGVuZGVuY3kgZ3JhcGgiPjwvY2VudGVyPg0KKzxtYXAgbmFtZT0ic21kZXZwLmhkZXBfbWFwIj4NCis8YXJlYSBocmVmPSJzbWRldnBfOGMuaHRtbCIgc2hhcGU9InJlY3QiIGNvb3Jkcz0iNiw5Miw3NiwxMTgiIGFsdD0iIj4NCis8YXJlYSBocmVmPSJ3c3NlYXBpXzhoLmh0bWwiIHNoYXBlPSJyZWN0IiBjb29yZHM9IjE1MCw5MiwyMjAsMTE4IiBhbHQ9IiI+DQorPGFyZWEgaHJlZj0id3NzZWFwaV84Yy5odG1sIiBzaGFwZT0icmVjdCIgY29vcmRzPSIxMTQsMTcsMTg0LDQ0IiBhbHQ9IiI+DQorPC9tYXA+DQorPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPkNsYXNzZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c3RydWN0ICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19zbWRfX2RhdGEuaHRtbCI+c29hcF9zbWRfZGF0YTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VGhlIHNtZGV2cCBlbmdpbmUgY29udGV4dCBkYXRhLiAgPGEgaHJlZj0ic3RydWN0c29hcF9fc21kX19kYXRhLmh0bWwjX2RldGFpbHMiPk1vcmUuLi48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPkRlZmluZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+I2RlZmluZSZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGguaHRtbCNhMCI+U09BUF9TTURfS0VZX1RZUEU8L2E+Jm5ic3A7Jm5ic3A7Jm5ic3A7RVZQX1BLRVk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPiNkZWZpbmUmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic21kZXZwXzhoLmh0bWwjYTEiPlNPQVBfU01EX01BWF9TSVpFPC9hPiZuYnNwOyZuYnNwOyZuYnNwO0VWUF9NQVhfTURfU0laRTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+I2RlZmluZSZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGguaHRtbCNhMiI+U09BUF9TTURfTUQ1X1NJWkU8L2E+Jm5ic3A7Jm5ic3A7Jm5ic3A7KDE2KTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+I2RlZmluZSZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGguaHRtbCNhMyI+U09BUF9TTURfU0hBMV9TSVpFPC9hPiZuYnNwOyZuYnNwOyZuYnNwOygyMCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPiNkZWZpbmUmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic21kZXZwXzhoLmh0bWwjYTQiPlNPQVBfU01EX05PTkU8L2E+Jm5ic3A7Jm5ic3A7Jm5ic3A7KDApPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4jZGVmaW5lJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84aC5odG1sI2E1Ij5TT0FQX1NNRF9ER1NUX01ENTwvYT4mbmJzcDsmbmJzcDsmbmJzcDsoMSk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPiNkZWZpbmUmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic21kZXZwXzhoLmh0bWwjYTYiPlNPQVBfU01EX0RHU1RfU0hBMTwvYT4mbmJzcDsmbmJzcDsmbmJzcDsoMik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPiNkZWZpbmUmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic21kZXZwXzhoLmh0bWwjYTciPlNPQVBfU01EX0hNQUNfU0hBMTwvYT4mbmJzcDsmbmJzcDsmbmJzcDsoMyk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPiNkZWZpbmUmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic21kZXZwXzhoLmh0bWwjYTgiPlNPQVBfU01EX1NJR05fRFNBX1NIQTE8L2E+Jm5ic3A7Jm5ic3A7Jm5ic3A7KDQpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4jZGVmaW5lJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84aC5odG1sI2E5Ij5TT0FQX1NNRF9TSUdOX1JTQV9TSEExPC9hPiZuYnNwOyZuYnNwOyZuYnNwOyg1KTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+I2RlZmluZSZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGguaHRtbCNhMTAiPlNPQVBfU01EX1ZSRllfRFNBX1NIQTE8L2E+Jm5ic3A7Jm5ic3A7Jm5ic3A7KDYpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4jZGVmaW5lJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84aC5odG1sI2ExMSI+U09BUF9TTURfVlJGWV9SU0FfU0hBMTwvYT4mbmJzcDsmbmJzcDsmbmJzcDsoNyk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5GdW5jdGlvbnM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c2l6ZV90Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84aC5odG1sI2ExMiI+c29hcF9zbWRfc2l6ZTwvYT4gKGludCBhbGcsIGNvbnN0IHZvaWQgKmtleSk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+UmV0dXJucyB0aGUgbnVtYmVyIG9mIG9jdGV0cyBuZWVkZWQgdG8gc3RvcmUgdGhlIGRpZ2VzdCBvciBzaWduYXR1cmUgcmV0dXJuZWQgYnkgc29hcF9zbWRfZW5kLiAgPGEgaHJlZj0iI2ExMiI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGguaHRtbCNhMTMiPnNvYXBfc21kX2JlZ2luPC9hPiAoc3RydWN0IHNvYXAgKnNvYXAsIGludCBhbGcsIGNvbnN0IHZvaWQgKmtleSwgaW50IGtleWxlbik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+SW5pdGlhdGVzIGEgZGlnZXN0IG9yIHNpZ25hdHVyZSBjb21wdXRhdGlvbi4gIDxhIGhyZWY9IiNhMTMiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic21kZXZwXzhoLmh0bWwjYTE0Ij5zb2FwX3NtZF9lbmQ8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqYnVmLCBpbnQgKmxlbik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+Q29tcGxldGVzIGEgZGlnZXN0IG9yIHNpZ25hdHVyZSBjb21wdXRhdGlvbi4gIDxhIGhyZWY9IiNhMTQiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic21kZXZwXzhoLmh0bWwjYTE1Ij5zb2FwX3NtZF9pbml0PC9hPiAoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3NtZF9fZGF0YS5odG1sIj5zb2FwX3NtZF9kYXRhPC9hPiAqZGF0YSwgaW50IGFsZywgY29uc3Qgdm9pZCAqa2V5LCBpbnQga2V5bGVuKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5Jbml0aWF0ZXMgYSAoc2lnbmVkKSBkaWdlc3QgY29tcHV0YXRpb24uICA8YSBocmVmPSIjYTE1Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84aC5odG1sI2ExNiI+c29hcF9zbWRfdXBkYXRlPC9hPiAoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3NtZF9fZGF0YS5odG1sIj5zb2FwX3NtZF9kYXRhPC9hPiAqZGF0YSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5VcGRhdGVzIChzaWduZWQpIGRpZ2VzdCBjb21wdXRhdGlvbiB3aXRoIG1lc3NhZ2UgcGFydC4gIDxhIGhyZWY9IiNhMTYiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic21kZXZwXzhoLmh0bWwjYTE3Ij5zb2FwX3NtZF9maW5hbDwvYT4gKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19zbWRfX2RhdGEuaHRtbCI+c29hcF9zbWRfZGF0YTwvYT4gKmRhdGEsIGNoYXIgKmJ1ZiwgaW50ICpsZW4pPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkZpbmFsaXplcyAoc2lnbmVkKSBkaWdlc3QgY29tcHV0YXRpb24gYW5kIHJldHVybnMgZGlnZXN0IG9yIHNpZ25hdHVyZS4gIDxhIGhyZWY9IiNhMTciPjwvYT48YnI+PC90ZD48L3RyPg0KKzwvdGFibGU+DQorPGhyPjxoMj5EZWZpbmUgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTUiIGRveHl0YWc9InNtZGV2cC5oOjpTT0FQX1NNRF9ER1NUX01ENSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiAjZGVmaW5lIFNPQVBfU01EX0RHU1RfTUQ1Jm5ic3A7Jm5ic3A7Jm5ic3A7KDEpICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTUQ1IGRpZ2VzdCBhbGdvcml0aG0gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTYiIGRveHl0YWc9InNtZGV2cC5oOjpTT0FQX1NNRF9ER1NUX1NIQTEiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gI2RlZmluZSBTT0FQX1NNRF9ER1NUX1NIQTEmbmJzcDsmbmJzcDsmbmJzcDsoMikgICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitTSEExIGRpZ2VzdCBhbGdvcml0aG0gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTciIGRveHl0YWc9InNtZGV2cC5oOjpTT0FQX1NNRF9ITUFDX1NIQTEiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gI2RlZmluZSBTT0FQX1NNRF9ITUFDX1NIQTEmbmJzcDsmbmJzcDsmbmJzcDsoMykgICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitITUFDLVNIQTEgc2hhcmVkIGtleSBzaWduYXR1cmUgYWxnb3JpdGhtICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEwIiBkb3h5dGFnPSJzbWRldnAuaDo6U09BUF9TTURfS0VZX1RZUEUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gI2RlZmluZSBTT0FQX1NNRF9LRVlfVFlQRSZuYnNwOyZuYnNwOyZuYnNwO0VWUF9QS0VZICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorRXhwb3NlIEVWUF9QS0VZIGluIGEgcG9ydGFibGUgcmVwcmVzZW50YXRpb24gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTEiIGRveHl0YWc9InNtZGV2cC5oOjpTT0FQX1NNRF9NQVhfU0laRSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiAjZGVmaW5lIFNPQVBfU01EX01BWF9TSVpFJm5ic3A7Jm5ic3A7Jm5ic3A7RVZQX01BWF9NRF9TSVpFICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorRXhwb3NlIEVWUF9NQVhfTURfU0laRSBpbiBhIHBvcnRhYmxlIHJlcHJlc2VudGF0aW9uICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEyIiBkb3h5dGFnPSJzbWRldnAuaDo6U09BUF9TTURfTUQ1X1NJWkUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gI2RlZmluZSBTT0FQX1NNRF9NRDVfU0laRSZuYnNwOyZuYnNwOyZuYnNwOygxNikgICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitNRDUgZGlnZXN0IHNpemUgaW4gb2N0ZXRzICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE0IiBkb3h5dGFnPSJzbWRldnAuaDo6U09BUF9TTURfTk9ORSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiAjZGVmaW5lIFNPQVBfU01EX05PTkUmbmJzcDsmbmJzcDsmbmJzcDsoMCkgICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMyIgZG94eXRhZz0ic21kZXZwLmg6OlNPQVBfU01EX1NIQTFfU0laRSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiAjZGVmaW5lIFNPQVBfU01EX1NIQTFfU0laRSZuYnNwOyZuYnNwOyZuYnNwOygyMCkgICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitTSEExIGRpZ2VzdCBzaXplIGluIG9jdGV0cyAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhOCIgZG94eXRhZz0ic21kZXZwLmg6OlNPQVBfU01EX1NJR05fRFNBX1NIQTEiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gI2RlZmluZSBTT0FQX1NNRF9TSUdOX0RTQV9TSEExJm5ic3A7Jm5ic3A7Jm5ic3A7KDQpICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorRFNBLVNIQTEgc2VjcmV0IGtleSBzaWduYXR1cmUgYWxnb3JpdGhtICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE5IiBkb3h5dGFnPSJzbWRldnAuaDo6U09BUF9TTURfU0lHTl9SU0FfU0hBMSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiAjZGVmaW5lIFNPQVBfU01EX1NJR05fUlNBX1NIQTEmbmJzcDsmbmJzcDsmbmJzcDsoNSkgICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitSU0EtU0hBMSBzZWNyZXQga2V5IHNpZ25hdHVyZSBhbGdvcml0aG0gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTEwIiBkb3h5dGFnPSJzbWRldnAuaDo6U09BUF9TTURfVlJGWV9EU0FfU0hBMSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiAjZGVmaW5lIFNPQVBfU01EX1ZSRllfRFNBX1NIQTEmbmJzcDsmbmJzcDsmbmJzcDsoNikgICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitEU0EtU0hBMSBzZWNyZXQga2V5IHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gYWxnb3JpdGhtICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExMSIgZG94eXRhZz0ic21kZXZwLmg6OlNPQVBfU01EX1ZSRllfUlNBX1NIQTEiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gI2RlZmluZSBTT0FQX1NNRF9WUkZZX1JTQV9TSEExJm5ic3A7Jm5ic3A7Jm5ic3A7KDcpICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorUlNBLVNIQTEgc2VjcmV0IGtleSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGFsZ29yaXRobSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+PGgyPkZ1bmN0aW9uIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExMyIgZG94eXRhZz0ic21kZXZwLmg6OnNvYXBfc21kX2JlZ2luIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBzb2FwX3NtZF9iZWdpbiAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5pbnQmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+YWxnPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IHZvaWQgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5rZXk8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+aW50Jm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmtleWxlbjwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitJbml0aWF0ZXMgYSBkaWdlc3Qgb3Igc2lnbmF0dXJlIGNvbXB1dGF0aW9uLiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5hbGc8L2VtPiZuYnNwOzwvdGQ+PHRkPmlzIHRoZSBkaWdlc3Qgb3Igc2lnbmF0dXJlIChzaWduL3ZlcmlmaWNhdGlvbikgYWxnb3JpdGhtIHVzZWQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5rZXk8L2VtPiZuYnNwOzwvdGQ+PHRkPmlzIGEgSE1BQyBrZXkgb3IgcG9pbnRlciB0byBFVlBfUEtFWSBvYmplY3Qgb3IgTlVMTCBmb3IgZGlnZXN0cyA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmtleWxlbjwvZW0+Jm5ic3A7PC90ZD48dGQ+aXMgdGhlIGxlbmd0aCBvZiB0aGUgSE1BQyBrZXkgb3IgMCA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPlNPQVBfT0ssIFNPQVBfRU9NLCBvciBTT0FQX1NTTF9FUlJPUiA8L2RkPjwvZGw+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTE0IiBkb3h5dGFnPSJzbWRldnAuaDo6c29hcF9zbWRfZW5kIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBzb2FwX3NtZF9lbmQgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmJ1ZjwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5pbnQgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5sZW48L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQ29tcGxldGVzIGEgZGlnZXN0IG9yIHNpZ25hdHVyZSBjb21wdXRhdGlvbi4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+YnVmPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250YWlucyBzaWduYXR1cmUgZm9yIHZlcmlmaWNhdGlvbiAod2hlbiB1c2luZyBhIFNPQVBfU01EX1ZSRlkgYWxnb3JpdGhtKSA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0PltvdXRdPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5idWY8L2VtPiZuYnNwOzwvdGQ+PHRkPmlzIHBvcHVsYXRlZCB3aXRoIHRoZSBkaWdlc3Qgb3Igc2lnbmF0dXJlIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+bGVuPC9lbT4mbmJzcDs8L3RkPjx0ZD5wb2ludHMgdG8gbGVuZ3RoIG9mIHNpZ25hdHVyZSB0byB2ZXJpZnkgKHdoZW4gdXNpbmcgYSBTT0FQX1NNRF9WUkZZIGFsZ29yaXRobSkgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5bb3V0XTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+bGVuPC9lbT4mbmJzcDs8L3RkPjx0ZD5wb2ludHMgdG8gbGVuZ3RoIG9mIHN0b3JlZCBkaWdlc3Qgb3Igc2lnbmF0dXJlICh3aGVuIG5vdCBOVUxMKSA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPlNPQVBfT0ssIFNPQVBfVVNFUl9FUlJPUiwgb3IgU09BUF9TU0xfRVJST1IgPC9kZD48L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExNyIgZG94eXRhZz0ic21kZXZwLmg6OnNvYXBfc21kX2ZpbmFsIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBzb2FwX3NtZF9maW5hbCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19zbWRfX2RhdGEuaHRtbCI+c29hcF9zbWRfZGF0YTwvYT4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5kYXRhPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5idWY8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+aW50ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+bGVuPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0ZpbmFsaXplcyAoc2lnbmVkKSBkaWdlc3QgY29tcHV0YXRpb24gYW5kIHJldHVybnMgZGlnZXN0IG9yIHNpZ25hdHVyZS4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luLG91dF08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmRhdGE8L2VtPiZuYnNwOzwvdGQ+PHRkPnNtZGV2cCBlbmdpbmUgY29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmJ1ZjwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGFpbnMgc2lnbmF0dXJlIGZvciB2ZXJpZmljYXRpb24gKFNPQVBfU01EX1ZSRlkgYWxnb3JpdGhtcykgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5bb3V0XTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+YnVmPC9lbT4mbmJzcDs8L3RkPjx0ZD5pcyBwb3B1bGF0ZWQgd2l0aCB0aGUgZGlnZXN0IG9yIHNpZ25hdHVyZSA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmxlbjwvZW0+Jm5ic3A7PC90ZD48dGQ+cG9pbnRzIHRvIGxlbmd0aCBvZiBzaWduYXR1cmUgdG8gdmVyaWZ5IChTT0FQX1NNRF9WUkZZIGFsZ29yaXRobXMpIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W291dF08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmxlbjwvZW0+Jm5ic3A7PC90ZD48dGQ+cG9pbnRzIHRvIGxlbmd0aCBvZiBzdG9yZWQgZGlnZXN0IG9yIHNpZ25hdHVyZSAocGFzcyBOVUxMIGlmIHlvdSBhcmUgbm90IGludGVyZXN0ZWQgaW4gdGhpcyB2YWx1ZSkgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5TT0FQX09LIG9yIFNPQVBfU1NMX0VSUk9SIDwvZGQ+PC9kbD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMTUiIGRveHl0YWc9InNtZGV2cC5oOjpzb2FwX3NtZF9pbml0IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBzb2FwX3NtZF9pbml0ICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPnN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3NtZF9fZGF0YS5odG1sIj5zb2FwX3NtZF9kYXRhPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmRhdGE8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+aW50Jm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmFsZzwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCB2b2lkICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+a2V5PC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmludCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5rZXlsZW48L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorSW5pdGlhdGVzIGEgKHNpZ25lZCkgZGlnZXN0IGNvbXB1dGF0aW9uLiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW4sb3V0XTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+ZGF0YTwvZW0+Jm5ic3A7PC90ZD48dGQ+c21kZXZwIGVuZ2luZSBjb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+YWxnPC9lbT4mbmJzcDs8L3RkPjx0ZD5pcyBhbGdvcml0aG0gdG8gdXNlIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+a2V5PC9lbT4mbmJzcDs8L3RkPjx0ZD5pcyBrZXkgdG8gdXNlIG9yIE5VTEwgZm9yIGRpZ2VzdHMgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5rZXlsZW48L2VtPiZuYnNwOzwvdGQ+PHRkPmlzIGxlbmd0aCBvZiBITUFDIGtleSAod2hlbiBwcm92aWRlZCkgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5TT0FQX09LIG9yIFNPQVBfU1NMX0VSUk9SIDwvZGQ+PC9kbD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMTIiIGRveHl0YWc9InNtZGV2cC5oOjpzb2FwX3NtZF9zaXplIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHNpemVfdCBzb2FwX3NtZF9zaXplICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+aW50Jm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmFsZzwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCB2b2lkICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+a2V5PC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1JldHVybnMgdGhlIG51bWJlciBvZiBvY3RldHMgbmVlZGVkIHRvIHN0b3JlIHRoZSBkaWdlc3Qgb3Igc2lnbmF0dXJlIHJldHVybmVkIGJ5IHNvYXBfc21kX2VuZC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+YWxnPC9lbT4mbmJzcDs8L3RkPjx0ZD5pcyB0aGUgZGlnZXN0IG9yIHNpZ25hdHVyZSBhbGdvcml0aG0gdG8gYmUgdXNlZCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmtleTwvZW0+Jm5ic3A7PC90ZD48dGQ+aXMgYSBwb2ludGVyIHRvIGFuIEVWUF9QS0VZIG9iamVjdCBmb3IgUlNBL0RTQSBzaWduYXR1cmVzIG9yIE5VTEwgZm9yIGRpZ2VzdHMgYW5kIEhNQUMgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5zaXplX3QgbnVtYmVyIG9mIG9jdGV0cyB0aGF0IGlzIG5lZWRlZCB0byBob2xkIGRpZ2VzdCBvciBzaWduYXR1cmUgPC9kZD48L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5TZWUgYWxzbzo8L2I+PC9kdD48ZGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGguaHRtbCNhMTQiPnNvYXBfc21kX2VuZDwvYT48L2RkPjwvZGw+DQorVGhlIHZhbHVlcyByZXR1cm5lZCBmb3IgZGlnZXN0cyBhcmUgU09BUF9TTURfTUQ1X1NJWkUgYW5kIFNPQVBfU01EX1NIQTFfU0laRS4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTE2IiBkb3h5dGFnPSJzbWRldnAuaDo6c29hcF9zbWRfdXBkYXRlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBzb2FwX3NtZF91cGRhdGUgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+c3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fc21kX19kYXRhLmh0bWwiPnNvYXBfc21kX2RhdGE8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+ZGF0YTwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+YnVmPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPnNpemVfdCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5sZW48L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVXBkYXRlcyAoc2lnbmVkKSBkaWdlc3QgY29tcHV0YXRpb24gd2l0aCBtZXNzYWdlIHBhcnQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0PltpbixvdXRdPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5kYXRhPC9lbT4mbmJzcDs8L3RkPjx0ZD5zbWRldnAgZW5naW5lIGNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5idWY8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRhaW5zIG1lc3NhZ2UgcGFydCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmxlbjwvZW0+Jm5ic3A7PC90ZD48dGQ+b2YgbWVzc2FnZSBwYXJ0IDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+U09BUF9PSyBvciBTT0FQX1NTTF9FUlJPUiA8L2RkPjwvZGw+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIEZyaSBBdWcgMTkgMTA6NDE6NDUgMjAwNSBmb3IgZ1NPQVAgV1MtU2VjdXJpdHkgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc21kZXZwXzhoX19kZXBfX2luY2wubWFwIGIvZG9jL3dzc2UvaHRtbC9zbWRldnBfOGhfX2RlcF9faW5jbC5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRkMjg1OAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc21kZXZwXzhoX19kZXBfX2luY2wubWFwCkBAIC0wLDAgKzEsNCBAQAorYmFzZSByZWZlcmVyCityZWN0ICRzbWRldnBfOGMuaHRtbCA2LDkyIDc2LDExOAorcmVjdCAkd3NzZWFwaV84aC5odG1sIDE1MCw5MiAyMjAsMTE4CityZWN0ICR3c3NlYXBpXzhjLmh0bWwgMTE0LDE3IDE4NCw0NApkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zbWRldnBfOGhfX2RlcF9faW5jbC5tZDUgYi9kb2Mvd3NzZS9odG1sL3NtZGV2cF84aF9fZGVwX19pbmNsLm1kNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDA1NjBjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zbWRldnBfOGhfX2RlcF9faW5jbC5tZDUKQEAgLTAsMCArMSBAQAorOTVhN2UwYzNkNTc5YjlmZTY1ZTdiN2NiMTAyYTBjY2IKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3NtZGV2cF84aF9fZGVwX19pbmNsLnBuZyBiL2RvYy93c3NlL2h0bWwvc21kZXZwXzhoX19kZXBfX2luY2wucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMDE0NzUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3NtZGV2cF84aF9fZGVwX19pbmNsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3NtZGV2cF84aF9faW5jbC5tYXAgYi9kb2Mvd3NzZS9odG1sL3NtZGV2cF84aF9faW5jbC5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWExNDc3OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc21kZXZwXzhoX19pbmNsLm1hcApAQCAtMCwwICsxIEBACitiYXNlIHJlZmVyZXIKZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc21kZXZwXzhoX19pbmNsLm1kNSBiL2RvYy93c3NlL2h0bWwvc21kZXZwXzhoX19pbmNsLm1kNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTNjOTc0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zbWRldnBfOGhfX2luY2wubWQ1CkBAIC0wLDAgKzEgQEAKKzJlZWZiZDdhZjIyYzFlOGUwNDA4MDk3MjE0OTBhMzZiClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zbWRldnBfOGhfX2luY2wucG5nIGIvZG9jL3dzc2UvaHRtbC9zbWRldnBfOGhfX2luY2wucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZTI1Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3NtZGV2cF84aF9faW5jbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3RfX2MxNG5fX19fX2luY2x1c2l2ZV9uYW1lc3BhY2VzLW1lbWJlcnMuaHRtbCBiL2RvYy93c3NlL2h0bWwvc3RydWN0X19jMTRuX19fX19pbmNsdXNpdmVfbmFtZXNwYWNlcy1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNhYTdmMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0X19jMTRuX19fX19pbmNsdXNpdmVfbmFtZXNwYWNlcy1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwxNCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgV1MtU2VjdXJpdHk6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPl9jMTRuX19JbmNsdXNpdmVOYW1lc3BhY2VzIE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X19jMTRuX19fX19pbmNsdXNpdmVfbmFtZXNwYWNlcy5odG1sIj5fYzE0bl9fSW5jbHVzaXZlTmFtZXNwYWNlczwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX2MxNG5fX19fX2luY2x1c2l2ZV9uYW1lc3BhY2VzLmh0bWwjbzAiPlByZWZpeExpc3Q8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX2MxNG5fX19fX2luY2x1c2l2ZV9uYW1lc3BhY2VzLmh0bWwiPl9jMTRuX19JbmNsdXNpdmVOYW1lc3BhY2VzPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBGcmkgQXVnIDE5IDEwOjQxOjQ1IDIwMDUgZm9yIGdTT0FQIFdTLVNlY3VyaXR5IGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3N0cnVjdF9fYzE0bl9fX19faW5jbHVzaXZlX25hbWVzcGFjZXMuaHRtbCBiL2RvYy93c3NlL2h0bWwvc3RydWN0X19jMTRuX19fX19pbmNsdXNpdmVfbmFtZXNwYWNlcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYmY0ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdF9fYzE0bl9fX19faW5jbHVzaXZlX25hbWVzcGFjZXMuaHRtbApAQCAtMCwwICsxLDQ2IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBXUy1TZWN1cml0eTogX2MxNG5fX0luY2x1c2l2ZU5hbWVzcGFjZXMgU3RydWN0IFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT5fYzE0bl9fSW5jbHVzaXZlTmFtZXNwYWNlcyBTdHJ1Y3QgUmVmZXJlbmNlPC9oMT48Y29kZT4jaW5jbHVkZSAmbHQ7YzE0bi5oJmd0OzwvY29kZT4NCis8cD4NCis8YSBocmVmPSJzdHJ1Y3RfX2MxNG5fX19fX2luY2x1c2l2ZV9uYW1lc3BhY2VzLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX2MxNG5fX19fX2luY2x1c2l2ZV9uYW1lc3BhY2VzLmh0bWwjbzAiPlByZWZpeExpc3Q8L2E+PC90ZD48L3RyPg0KKw0KKzwvdGFibGU+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0iX2MxNG5fX0luY2x1c2l2ZU5hbWVzcGFjZXM6OlByZWZpeExpc3QiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX2MxNG5fX19fX2luY2x1c2l2ZV9uYW1lc3BhY2VzLmh0bWwjbzAiPl9jMTRuX19JbmNsdXNpdmVOYW1lc3BhY2VzOjpQcmVmaXhMaXN0PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBzdHJ1Y3Qgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy93c3NlLzxhIGNsYXNzPSJlbCIgaHJlZj0iYzE0bl84aC5odG1sIj5jMTRuLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gRnJpIEF1ZyAxOSAxMDo0MTo0NSAyMDA1IGZvciBnU09BUCBXUy1TZWN1cml0eSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3RfX3dzc2VfX19fX2JpbmFyeV9zZWN1cml0eV90b2tlbi1tZW1iZXJzLmh0bWwgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdF9fd3NzZV9fX19fYmluYXJ5X3NlY3VyaXR5X3Rva2VuLW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjljN2RiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3RfX3dzc2VfX19fX2JpbmFyeV9zZWN1cml0eV90b2tlbi1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwxNyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgV1MtU2VjdXJpdHk6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPl93c3NlX19CaW5hcnlTZWN1cml0eVRva2VuIE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19iaW5hcnlfc2VjdXJpdHlfdG9rZW4uaHRtbCI+X3dzc2VfX0JpbmFyeVNlY3VyaXR5VG9rZW48L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19iaW5hcnlfc2VjdXJpdHlfdG9rZW4uaHRtbCNvMCI+X19pdGVtPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19iaW5hcnlfc2VjdXJpdHlfdG9rZW4uaHRtbCI+X3dzc2VfX0JpbmFyeVNlY3VyaXR5VG9rZW48L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2JpbmFyeV9zZWN1cml0eV90b2tlbi5odG1sI28zIj5FbmNvZGluZ1R5cGU8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2JpbmFyeV9zZWN1cml0eV90b2tlbi5odG1sIj5fd3NzZV9fQmluYXJ5U2VjdXJpdHlUb2tlbjwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fYmluYXJ5X3NlY3VyaXR5X3Rva2VuLmh0bWwjbzIiPlZhbHVlVHlwZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fYmluYXJ5X3NlY3VyaXR5X3Rva2VuLmh0bWwiPl93c3NlX19CaW5hcnlTZWN1cml0eVRva2VuPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19iaW5hcnlfc2VjdXJpdHlfdG9rZW4uaHRtbCNvMSI+d3N1X19JZDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fYmluYXJ5X3NlY3VyaXR5X3Rva2VuLmh0bWwiPl93c3NlX19CaW5hcnlTZWN1cml0eVRva2VuPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBGcmkgQXVnIDE5IDEwOjQxOjQ1IDIwMDUgZm9yIGdTT0FQIFdTLVNlY3VyaXR5IGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3N0cnVjdF9fd3NzZV9fX19fYmluYXJ5X3NlY3VyaXR5X3Rva2VuLmh0bWwgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdF9fd3NzZV9fX19fYmluYXJ5X3NlY3VyaXR5X3Rva2VuLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg4ZjNkMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0X193c3NlX19fX19iaW5hcnlfc2VjdXJpdHlfdG9rZW4uaHRtbApAQCAtMCwwICsxLDEyOSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgV1MtU2VjdXJpdHk6IF93c3NlX19CaW5hcnlTZWN1cml0eVRva2VuIFN0cnVjdCBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+X3dzc2VfX0JpbmFyeVNlY3VyaXR5VG9rZW4gU3RydWN0IFJlZmVyZW5jZTwvaDE+VGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIHdzc2U6QmluYXJ5U2VjdXJpdHlUb2tlbiBlbGVtZW50IHBlciBTZWN0aW9uIDQuMi4gSW1wb3J0ZWQgZWxlbWVudCBfd3NzZV9fQmluYXJ5U2VjdXJpdHlUb2tlbiBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3dzc2UuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0ic3RydWN0X193c3NlX19fX19iaW5hcnlfc2VjdXJpdHlfdG9rZW4tbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fYmluYXJ5X3NlY3VyaXR5X3Rva2VuLmh0bWwjbzAiPl9faXRlbTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2JpbmFyeV9zZWN1cml0eV90b2tlbi5odG1sI28xIj53c3VfX0lkPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fYmluYXJ5X3NlY3VyaXR5X3Rva2VuLmh0bWwjbzIiPlZhbHVlVHlwZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2JpbmFyeV9zZWN1cml0eV90b2tlbi5odG1sI28zIj5FbmNvZGluZ1R5cGU8L2E+PC90ZD48L3RyPg0KKw0KKzwvdGFibGU+DQorPGhyPjxhIG5hbWU9Il9kZXRhaWxzIj48L2E+PGgyPkRldGFpbGVkIERlc2NyaXB0aW9uPC9oMj4NCitUaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgd3NzZTpCaW5hcnlTZWN1cml0eVRva2VuIGVsZW1lbnQgcGVyIFNlY3Rpb24gNC4yLiBJbXBvcnRlZCBlbGVtZW50IF93c3NlX19CaW5hcnlTZWN1cml0eVRva2VuIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4gDQorPHA+DQorRWxlbWVudCAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpCaW5hcnlTZWN1cml0eVRva2VuIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOkJpbmFyeVNlY3VyaXR5VG9rZW5UeXBlLiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJfd3NzZV9fQmluYXJ5U2VjdXJpdHlUb2tlbjo6X19pdGVtIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19iaW5hcnlfc2VjdXJpdHlfdG9rZW4uaHRtbCNvMCI+X3dzc2VfX0JpbmFyeVNlY3VyaXR5VG9rZW46Ol9faXRlbTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMyIgZG94eXRhZz0iX3dzc2VfX0JpbmFyeVNlY3VyaXR5VG9rZW46OkVuY29kaW5nVHlwZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fYmluYXJ5X3NlY3VyaXR5X3Rva2VuLmh0bWwjbzMiPl93c3NlX19CaW5hcnlTZWN1cml0eVRva2VuOjpFbmNvZGluZ1R5cGU8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9Il93c3NlX19CaW5hcnlTZWN1cml0eVRva2VuOjpWYWx1ZVR5cGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2JpbmFyeV9zZWN1cml0eV90b2tlbi5odG1sI28yIj5fd3NzZV9fQmluYXJ5U2VjdXJpdHlUb2tlbjo6VmFsdWVUeXBlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJfd3NzZV9fQmluYXJ5U2VjdXJpdHlUb2tlbjo6d3N1X19JZCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fYmluYXJ5X3NlY3VyaXR5X3Rva2VuLmh0bWwjbzEiPl93c3NlX19CaW5hcnlTZWN1cml0eVRva2VuOjp3c3VfX0lkPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBzdHJ1Y3Qgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy93c3NlLzxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZV84aC5odG1sIj53c3NlLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gRnJpIEF1ZyAxOSAxMDo0MTo0NSAyMDA1IGZvciBnU09BUCBXUy1TZWN1cml0eSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3RfX3dzc2VfX19fX2VtYmVkZGVkLW1lbWJlcnMuaHRtbCBiL2RvYy93c3NlL2h0bWwvc3RydWN0X193c3NlX19fX19lbWJlZGRlZC1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IzMTA0YgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0X193c3NlX19fX19lbWJlZGRlZC1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwxNSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgV1MtU2VjdXJpdHk6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPl93c3NlX19FbWJlZGRlZCBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fZW1iZWRkZWQuaHRtbCI+X3dzc2VfX0VtYmVkZGVkPC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fZW1iZWRkZWQuaHRtbCNvMSI+VmFsdWVUeXBlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19lbWJlZGRlZC5odG1sIj5fd3NzZV9fRW1iZWRkZWQ8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2VtYmVkZGVkLmh0bWwjbzAiPndzdV9fSWQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2VtYmVkZGVkLmh0bWwiPl93c3NlX19FbWJlZGRlZDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gRnJpIEF1ZyAxOSAxMDo0MTo0NSAyMDA1IGZvciBnU09BUCBXUy1TZWN1cml0eSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3RfX3dzc2VfX19fX2VtYmVkZGVkLmh0bWwgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdF9fd3NzZV9fX19fZW1iZWRkZWQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODM5N2MxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3RfX3dzc2VfX19fX2VtYmVkZGVkLmh0bWwKQEAgLTAsMCArMSw3OSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgV1MtU2VjdXJpdHk6IF93c3NlX19FbWJlZGRlZCBTdHJ1Y3QgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPl93c3NlX19FbWJlZGRlZCBTdHJ1Y3QgUmVmZXJlbmNlPC9oMT5UaGlzIGVsZW1lbnQgZGVmaW5lcyBhIHNlY3VyaXR5IHRva2VuIGVtYmVkZGVkIHJlZmVyZW5jZSBJbXBvcnRlZCBlbGVtZW50IF93c3NlX19FbWJlZGRlZCBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3dzc2UuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0ic3RydWN0X193c3NlX19fX19lbWJlZGRlZC1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgQXR0cmlidXRlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19lbWJlZGRlZC5odG1sI28wIj53c3VfX0lkPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fZW1iZWRkZWQuaHRtbCNvMSI+VmFsdWVUeXBlPC9hPjwvdGQ+PC90cj4NCisNCis8L3RhYmxlPg0KKzxocj48YSBuYW1lPSJfZGV0YWlscyI+PC9hPjxoMj5EZXRhaWxlZCBEZXNjcmlwdGlvbjwvaDI+DQorVGhpcyBlbGVtZW50IGRlZmluZXMgYSBzZWN1cml0eSB0b2tlbiBlbWJlZGRlZCByZWZlcmVuY2UgSW1wb3J0ZWQgZWxlbWVudCBfd3NzZV9fRW1iZWRkZWQgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LiANCis8cD4NCitFbGVtZW50ICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOkVtYmVkZGVkIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOkVtYmVkZGVkVHlwZS4gDQorPHA+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0iX3dzc2VfX0VtYmVkZGVkOjpWYWx1ZVR5cGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2VtYmVkZGVkLmh0bWwjbzEiPl93c3NlX19FbWJlZGRlZDo6VmFsdWVUeXBlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJfd3NzZV9fRW1iZWRkZWQ6OndzdV9fSWQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2VtYmVkZGVkLmh0bWwjbzAiPl93c3NlX19FbWJlZGRlZDo6d3N1X19JZDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgc3RydWN0IHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2Mvd3NzZS88YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VfOGguaHRtbCI+d3NzZS5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIEZyaSBBdWcgMTkgMTA6NDE6NDUgMjAwNSBmb3IgZ1NPQVAgV1MtU2VjdXJpdHkgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0X193c3NlX19fX19rZXlfaWRlbnRpZmllci1tZW1iZXJzLmh0bWwgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdF9fd3NzZV9fX19fa2V5X2lkZW50aWZpZXItbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YmFhMTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdF9fd3NzZV9fX19fa2V5X2lkZW50aWZpZXItbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTcgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFdTLVNlY3VyaXR5OiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT5fd3NzZV9fS2V5SWRlbnRpZmllciBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fa2V5X2lkZW50aWZpZXIuaHRtbCI+X3dzc2VfX0tleUlkZW50aWZpZXI8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19rZXlfaWRlbnRpZmllci5odG1sI28wIj5fX2l0ZW08L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2tleV9pZGVudGlmaWVyLmh0bWwiPl93c3NlX19LZXlJZGVudGlmaWVyPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19rZXlfaWRlbnRpZmllci5odG1sI28zIj5FbmNvZGluZ1R5cGU8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2tleV9pZGVudGlmaWVyLmh0bWwiPl93c3NlX19LZXlJZGVudGlmaWVyPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19rZXlfaWRlbnRpZmllci5odG1sI28yIj5WYWx1ZVR5cGU8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2tleV9pZGVudGlmaWVyLmh0bWwiPl93c3NlX19LZXlJZGVudGlmaWVyPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19rZXlfaWRlbnRpZmllci5odG1sI28xIj53c3VfX0lkPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19rZXlfaWRlbnRpZmllci5odG1sIj5fd3NzZV9fS2V5SWRlbnRpZmllcjwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gRnJpIEF1ZyAxOSAxMDo0MTo0NSAyMDA1IGZvciBnU09BUCBXUy1TZWN1cml0eSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3RfX3dzc2VfX19fX2tleV9pZGVudGlmaWVyLmh0bWwgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdF9fd3NzZV9fX19fa2V5X2lkZW50aWZpZXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjM0YTYwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3RfX3dzc2VfX19fX2tleV9pZGVudGlmaWVyLmh0bWwKQEAgLTAsMCArMSwxMjkgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFdTLVNlY3VyaXR5OiBfd3NzZV9fS2V5SWRlbnRpZmllciBTdHJ1Y3QgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPl93c3NlX19LZXlJZGVudGlmaWVyIFN0cnVjdCBSZWZlcmVuY2U8L2gxPlRoaXMgZWxlbWVudCBkZWZpbmVzIGEga2V5IGlkZW50aWZpZXIgcmVmZXJlbmNlIEltcG9ydGVkIGVsZW1lbnQgX3dzc2VfX0tleUlkZW50aWZpZXIgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KKzxjb2RlPiNpbmNsdWRlICZsdDt3c3NlLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KKzxhIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fa2V5X2lkZW50aWZpZXItbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fa2V5X2lkZW50aWZpZXIuaHRtbCNvMCI+X19pdGVtPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fa2V5X2lkZW50aWZpZXIuaHRtbCNvMSI+d3N1X19JZDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2tleV9pZGVudGlmaWVyLmh0bWwjbzIiPlZhbHVlVHlwZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2tleV9pZGVudGlmaWVyLmh0bWwjbzMiPkVuY29kaW5nVHlwZTwvYT48L3RkPjwvdHI+DQorDQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1RoaXMgZWxlbWVudCBkZWZpbmVzIGEga2V5IGlkZW50aWZpZXIgcmVmZXJlbmNlIEltcG9ydGVkIGVsZW1lbnQgX3dzc2VfX0tleUlkZW50aWZpZXIgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LiANCis8cD4NCitFbGVtZW50ICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOktleUlkZW50aWZpZXIgb2YgY29tcGxleFR5cGUgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6S2V5SWRlbnRpZmllclR5cGUuIA0KKzxwPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9Il93c3NlX19LZXlJZGVudGlmaWVyOjpfX2l0ZW0iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2tleV9pZGVudGlmaWVyLmh0bWwjbzAiPl93c3NlX19LZXlJZGVudGlmaWVyOjpfX2l0ZW08L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzMiIGRveHl0YWc9Il93c3NlX19LZXlJZGVudGlmaWVyOjpFbmNvZGluZ1R5cGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2tleV9pZGVudGlmaWVyLmh0bWwjbzMiPl93c3NlX19LZXlJZGVudGlmaWVyOjpFbmNvZGluZ1R5cGU8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9Il93c3NlX19LZXlJZGVudGlmaWVyOjpWYWx1ZVR5cGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2tleV9pZGVudGlmaWVyLmh0bWwjbzIiPl93c3NlX19LZXlJZGVudGlmaWVyOjpWYWx1ZVR5cGU8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9Il93c3NlX19LZXlJZGVudGlmaWVyOjp3c3VfX0lkIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19rZXlfaWRlbnRpZmllci5odG1sI28xIj5fd3NzZV9fS2V5SWRlbnRpZmllcjo6d3N1X19JZDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgc3RydWN0IHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2Mvd3NzZS88YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VfOGguaHRtbCI+d3NzZS5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIEZyaSBBdWcgMTkgMTA6NDE6NDUgMjAwNSBmb3IgZ1NPQVAgV1MtU2VjdXJpdHkgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0X193c3NlX19fX19wYXNzd29yZC1tZW1iZXJzLmh0bWwgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdF9fd3NzZV9fX19fcGFzc3dvcmQtbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MDMyMzUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdF9fd3NzZV9fX19fcGFzc3dvcmQtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFdTLVNlY3VyaXR5OiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT5fd3NzZV9fUGFzc3dvcmQgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3Bhc3N3b3JkLmh0bWwiPl93c3NlX19QYXNzd29yZDwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3Bhc3N3b3JkLmh0bWwjbzAiPl9faXRlbTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fcGFzc3dvcmQuaHRtbCI+X3dzc2VfX1Bhc3N3b3JkPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19wYXNzd29yZC5odG1sI28xIj5UeXBlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19wYXNzd29yZC5odG1sIj5fd3NzZV9fUGFzc3dvcmQ8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIEZyaSBBdWcgMTkgMTA6NDE6NDUgMjAwNSBmb3IgZ1NPQVAgV1MtU2VjdXJpdHkgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0X193c3NlX19fX19wYXNzd29yZC5odG1sIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3RfX3dzc2VfX19fX3Bhc3N3b3JkLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYwMDQ2OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0X193c3NlX19fX19wYXNzd29yZC5odG1sCkBAIC0wLDAgKzEsNzkgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFdTLVNlY3VyaXR5OiBfd3NzZV9fUGFzc3dvcmQgU3RydWN0IFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT5fd3NzZV9fUGFzc3dvcmQgU3RydWN0IFJlZmVyZW5jZTwvaDE+VGhpcyBlbGVtZW50IGNvbnRhaW5zIHByb3BlcnRpZXMgZm9yIHRyYW5zZm9ybWF0aW9ucyBmcm9tIGFueSBuYW1lc3BhY2UsIGluY2x1ZGluZyBEU0lHLiAnX3dzc2VfX1RyYW5zZm9ybWF0aW9uUGFyYW1ldGVycycgZWxlbWVudCBkZWZpbml0aW9uIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7d3NzZS5oJmd0OzwvY29kZT4NCis8cD4NCis8YSBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3Bhc3N3b3JkLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3Bhc3N3b3JkLmh0bWwjbzAiPl9faXRlbTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3Bhc3N3b3JkLmh0bWwjbzEiPlR5cGU8L2E+PC90ZD48L3RyPg0KKw0KKzwvdGFibGU+DQorPGhyPjxhIG5hbWU9Il9kZXRhaWxzIj48L2E+PGgyPkRldGFpbGVkIERlc2NyaXB0aW9uPC9oMj4NCitUaGlzIGVsZW1lbnQgY29udGFpbnMgcHJvcGVydGllcyBmb3IgdHJhbnNmb3JtYXRpb25zIGZyb20gYW55IG5hbWVzcGFjZSwgaW5jbHVkaW5nIERTSUcuICdfd3NzZV9fVHJhbnNmb3JtYXRpb25QYXJhbWV0ZXJzJyBlbGVtZW50IGRlZmluaXRpb24gaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rLiANCis8cD4NCitFbGVtZW50ICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOlBhc3N3b3JkIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOlBhc3N3b3JkU3RyaW5nLiBJbXBvcnRlZCBlbGVtZW50IF93c3NlX19QYXNzd29yZCBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9Il93c3NlX19QYXNzd29yZDo6X19pdGVtIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19wYXNzd29yZC5odG1sI28wIj5fd3NzZV9fUGFzc3dvcmQ6Ol9faXRlbTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0iX3dzc2VfX1Bhc3N3b3JkOjpUeXBlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19wYXNzd29yZC5odG1sI28xIj5fd3NzZV9fUGFzc3dvcmQ6OlR5cGU8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIHN0cnVjdCB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3dzc2UvPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlXzhoLmh0bWwiPndzc2UuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBGcmkgQXVnIDE5IDEwOjQxOjQ1IDIwMDUgZm9yIGdTT0FQIFdTLVNlY3VyaXR5IGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3N0cnVjdF9fd3NzZV9fX19fcmVmZXJlbmNlLW1lbWJlcnMuaHRtbCBiL2RvYy93c3NlL2h0bWwvc3RydWN0X193c3NlX19fX19yZWZlcmVuY2UtbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MGU3NTYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdF9fd3NzZV9fX19fcmVmZXJlbmNlLW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDE1IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBXUy1TZWN1cml0eTogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+X3dzc2VfX1JlZmVyZW5jZSBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fcmVmZXJlbmNlLmh0bWwiPl93c3NlX19SZWZlcmVuY2U8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19yZWZlcmVuY2UuaHRtbCNvMCI+VVJJPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19yZWZlcmVuY2UuaHRtbCI+X3dzc2VfX1JlZmVyZW5jZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fcmVmZXJlbmNlLmh0bWwjbzEiPlZhbHVlVHlwZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fcmVmZXJlbmNlLmh0bWwiPl93c3NlX19SZWZlcmVuY2U8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIEZyaSBBdWcgMTkgMTA6NDE6NDUgMjAwNSBmb3IgZ1NPQVAgV1MtU2VjdXJpdHkgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0X193c3NlX19fX19yZWZlcmVuY2UuaHRtbCBiL2RvYy93c3NlL2h0bWwvc3RydWN0X193c3NlX19fX19yZWZlcmVuY2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWU1Nzg4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3RfX3dzc2VfX19fX3JlZmVyZW5jZS5odG1sCkBAIC0wLDAgKzEsNzkgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFdTLVNlY3VyaXR5OiBfd3NzZV9fUmVmZXJlbmNlIFN0cnVjdCBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+X3dzc2VfX1JlZmVyZW5jZSBTdHJ1Y3QgUmVmZXJlbmNlPC9oMT5UaGlzIGVsZW1lbnQgZGVmaW5lcyBhIHNlY3VyaXR5IHRva2VuIHJlZmVyZW5jZSBJbXBvcnRlZCBlbGVtZW50IF93c3NlX19SZWZlcmVuY2UgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KKzxjb2RlPiNpbmNsdWRlICZsdDt3c3NlLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KKzxhIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fcmVmZXJlbmNlLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3JlZmVyZW5jZS5odG1sI28wIj5VUkk8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19yZWZlcmVuY2UuaHRtbCNvMSI+VmFsdWVUeXBlPC9hPjwvdGQ+PC90cj4NCisNCis8L3RhYmxlPg0KKzxocj48YSBuYW1lPSJfZGV0YWlscyI+PC9hPjxoMj5EZXRhaWxlZCBEZXNjcmlwdGlvbjwvaDI+DQorVGhpcyBlbGVtZW50IGRlZmluZXMgYSBzZWN1cml0eSB0b2tlbiByZWZlcmVuY2UgSW1wb3J0ZWQgZWxlbWVudCBfd3NzZV9fUmVmZXJlbmNlIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4gDQorPHA+DQorRWxlbWVudCAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpSZWZlcmVuY2Ugb2YgY29tcGxleFR5cGUgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6UmVmZXJlbmNlVHlwZS4gDQorPHA+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0iX3dzc2VfX1JlZmVyZW5jZTo6VVJJIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19yZWZlcmVuY2UuaHRtbCNvMCI+X3dzc2VfX1JlZmVyZW5jZTo6VVJJPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJfd3NzZV9fUmVmZXJlbmNlOjpWYWx1ZVR5cGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3JlZmVyZW5jZS5odG1sI28xIj5fd3NzZV9fUmVmZXJlbmNlOjpWYWx1ZVR5cGU8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIHN0cnVjdCB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3dzc2UvPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlXzhoLmh0bWwiPndzc2UuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBGcmkgQXVnIDE5IDEwOjQxOjQ1IDIwMDUgZm9yIGdTT0FQIFdTLVNlY3VyaXR5IGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3N0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHktbWVtYmVycy5odG1sIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5LW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTJjNzhkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5LW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDE5IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBXUy1TZWN1cml0eTogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+X3dzc2VfX1NlY3VyaXR5IE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eS5odG1sIj5fd3NzZV9fU2VjdXJpdHk8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eS5odG1sI28yIj5CaW5hcnlTZWN1cml0eVRva2VuPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eS5odG1sIj5fd3NzZV9fU2VjdXJpdHk8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5Lmh0bWwjbzMiPmRzX19TaWduYXR1cmU8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5Lmh0bWwiPl93c3NlX19TZWN1cml0eTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHkuaHRtbCNvNCI+U09BUF9FTlZfX2FjdG9yPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eS5odG1sIj5fd3NzZV9fU2VjdXJpdHk8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5Lmh0bWwjbzUiPlNPQVBfRU5WX19yb2xlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eS5odG1sIj5fd3NzZV9fU2VjdXJpdHk8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5Lmh0bWwjbzEiPlVzZXJuYW1lVG9rZW48L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5Lmh0bWwiPl93c3NlX19TZWN1cml0eTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHkuaHRtbCNvMCI+d3N1X19UaW1lc3RhbXA8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5Lmh0bWwiPl93c3NlX19TZWN1cml0eTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gRnJpIEF1ZyAxOSAxMDo0MTo0NSAyMDA1IGZvciBnU09BUCBXUy1TZWN1cml0eSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5Lmh0bWwgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHkuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDY3NDUzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5Lmh0bWwKQEAgLTAsMCArMSwxODkgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFdTLVNlY3VyaXR5OiBfd3NzZV9fU2VjdXJpdHkgU3RydWN0IFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT5fd3NzZV9fU2VjdXJpdHkgU3RydWN0IFJlZmVyZW5jZTwvaDE+VGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIHdzc2U6U2VjdXJpdHkgU09BUCBoZWFkZXIgZWxlbWVudCBwZXIgU2VjdGlvbiA0LiBJbXBvcnRlZCBlbGVtZW50IF93c3NlX19TZWN1cml0eSBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O3dzc2UuaCZndDs8L2NvZGU+DQorPHA+DQorQ29sbGFib3JhdGlvbiBkaWFncmFtIGZvciBfd3NzZV9fU2VjdXJpdHk6PHA+PGNlbnRlcj48aW1nIHNyYz0ic3RydWN0X193c3NlX19fX19zZWN1cml0eV9fY29sbF9fZ3JhcGgucG5nIiBib3JkZXI9IjAiIHVzZW1hcD0iI19fd3NzZV9fX19fc2VjdXJpdHlfX2NvbGxfX21hcCIgYWx0PSJDb2xsYWJvcmF0aW9uIGdyYXBoIj48L2NlbnRlcj4NCis8bWFwIG5hbWU9Il9fd3NzZV9fX19fc2VjdXJpdHlfX2NvbGxfX21hcCI+DQorPGFyZWEgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25hdHVyZV90eXBlLmh0bWwiIHNoYXBlPSJyZWN0IiBjb29yZHM9Ijg0LDEwOCwyMDksMTM0IiBhbHQ9IiI+DQorPGFyZWEgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGUuaHRtbCIgc2hhcGU9InJlY3QiIGNvb3Jkcz0iNywxNywxNDAsNDQiIGFsdD0iIj4NCis8YXJlYSBocmVmPSJzdHJ1Y3Rkc19fX19fa2V5X2luZm9fdHlwZS5odG1sIiBzaGFwZT0icmVjdCIgY29vcmRzPSIxNjQsMTcsMjc5LDQ0IiBhbHQ9IiI+DQorPGFyZWEgaHJlZj0ic3RydWN0X193c3NlX19fX19iaW5hcnlfc2VjdXJpdHlfdG9rZW4uaHRtbCIgc2hhcGU9InJlY3QiIGNvb3Jkcz0iMjMzLDEwOCw0MTcsMTM0IiBhbHQ9IiI+DQorPGFyZWEgaHJlZj0ic3RydWN0X193c3NlX19fX191c2VybmFtZV90b2tlbi5odG1sIiBzaGFwZT0icmVjdCIgY29vcmRzPSI0NDEsMTA4LDYwMSwxMzQiIGFsdD0iIj4NCis8YXJlYSBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3Bhc3N3b3JkLmh0bWwiIHNoYXBlPSJyZWN0IiBjb29yZHM9IjQ2MCwxNyw1ODMsNDQiIGFsdD0iIj4NCis8YXJlYSBocmVmPSJzdHJ1Y3RfX3dzdV9fX19fdGltZXN0YW1wLmh0bWwiIHNoYXBlPSJyZWN0IiBjb29yZHM9IjYyNSwxMDgsNzQ4LDEzNCIgYWx0PSIiPg0KKzwvbWFwPg0KKzxjZW50ZXI+PGZvbnQgc2l6ZT0iMiI+WzxhIGhyZWY9ImdyYXBoX2xlZ2VuZC5odG1sIj5sZWdlbmQ8L2E+XTwvZm9udD48L2NlbnRlcj48YSBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5LW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3VfX19fX3RpbWVzdGFtcC5odG1sIj5fd3N1X19UaW1lc3RhbXA8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eS5odG1sI28wIj53c3VfX1RpbWVzdGFtcDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX191c2VybmFtZV90b2tlbi5odG1sIj5fd3NzZV9fVXNlcm5hbWVUb2tlbjwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5Lmh0bWwjbzEiPlVzZXJuYW1lVG9rZW48L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fYmluYXJ5X3NlY3VyaXR5X3Rva2VuLmh0bWwiPl93c3NlX19CaW5hcnlTZWN1cml0eVRva2VuPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHkuaHRtbCNvMiI+QmluYXJ5U2VjdXJpdHlUb2tlbjwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25hdHVyZV90eXBlLmh0bWwiPmRzX19TaWduYXR1cmVUeXBlPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHkuaHRtbCNvMyI+ZHNfX1NpZ25hdHVyZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5Lmh0bWwjbzQiPlNPQVBfRU5WX19hY3RvcjwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5Lmh0bWwjbzUiPlNPQVBfRU5WX19yb2xlPC9hPjwvdGQ+PC90cj4NCisNCis8L3RhYmxlPg0KKzxocj48YSBuYW1lPSJfZGV0YWlscyI+PC9hPjxoMj5EZXRhaWxlZCBEZXNjcmlwdGlvbjwvaDI+DQorVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIHdzc2U6U2VjdXJpdHkgU09BUCBoZWFkZXIgZWxlbWVudCBwZXIgU2VjdGlvbiA0LiBJbXBvcnRlZCBlbGVtZW50IF93c3NlX19TZWN1cml0eSBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuIA0KKzxwPg0KK0VsZW1lbnQgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6U2VjdXJpdHkgb2YgY29tcGxleFR5cGUgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6U2VjdXJpdHlIZWFkZXJUeXBlLiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJfd3NzZV9fU2VjdXJpdHk6OkJpbmFyeVNlY3VyaXR5VG9rZW4iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19iaW5hcnlfc2VjdXJpdHlfdG9rZW4uaHRtbCI+X3dzc2VfX0JpbmFyeVNlY3VyaXR5VG9rZW48L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHkuaHRtbCNvMiI+X3dzc2VfX1NlY3VyaXR5OjpCaW5hcnlTZWN1cml0eVRva2VuPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8zIiBkb3h5dGFnPSJfd3NzZV9fU2VjdXJpdHk6OmRzX19TaWduYXR1cmUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25hdHVyZV90eXBlLmh0bWwiPmRzX19TaWduYXR1cmVUeXBlPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5Lmh0bWwjbzMiPl93c3NlX19TZWN1cml0eTo6ZHNfX1NpZ25hdHVyZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNCIgZG94eXRhZz0iX3dzc2VfX1NlY3VyaXR5OjpTT0FQX0VOVl9fYWN0b3IiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5Lmh0bWwjbzQiPl93c3NlX19TZWN1cml0eTo6U09BUF9FTlZfX2FjdG9yPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im81IiBkb3h5dGFnPSJfd3NzZV9fU2VjdXJpdHk6OlNPQVBfRU5WX19yb2xlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eS5odG1sI281Ij5fd3NzZV9fU2VjdXJpdHk6OlNPQVBfRU5WX19yb2xlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJfd3NzZV9fU2VjdXJpdHk6OlVzZXJuYW1lVG9rZW4iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX191c2VybmFtZV90b2tlbi5odG1sIj5fd3NzZV9fVXNlcm5hbWVUb2tlbjwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eS5odG1sI28xIj5fd3NzZV9fU2VjdXJpdHk6OlVzZXJuYW1lVG9rZW48L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9Il93c3NlX19TZWN1cml0eTo6d3N1X19UaW1lc3RhbXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3VfX19fX3RpbWVzdGFtcC5odG1sIj5fd3N1X19UaW1lc3RhbXA8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHkuaHRtbCNvMCI+X3dzc2VfX1NlY3VyaXR5Ojp3c3VfX1RpbWVzdGFtcDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgc3RydWN0IHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2Mvd3NzZS88YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VfOGguaHRtbCI+d3NzZS5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIEZyaSBBdWcgMTkgMTA6NDE6NDUgMjAwNSBmb3IgZ1NPQVAgV1MtU2VjdXJpdHkgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0X193c3NlX19fX19zZWN1cml0eV9fY29sbF9fZ3JhcGgubWFwIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5X19jb2xsX19ncmFwaC5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYyY2I0YwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0X193c3NlX19fX19zZWN1cml0eV9fY29sbF9fZ3JhcGgubWFwCkBAIC0wLDAgKzEsOCBAQAorYmFzZSByZWZlcmVyCityZWN0ICRzdHJ1Y3Rkc19fX19fc2lnbmF0dXJlX3R5cGUuaHRtbCA4NCwxMDggMjA5LDEzNAorcmVjdCAkc3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGUuaHRtbCA3LDE3IDE0MCw0NAorcmVjdCAkc3RydWN0ZHNfX19fX2tleV9pbmZvX3R5cGUuaHRtbCAxNjQsMTcgMjc5LDQ0CityZWN0ICRzdHJ1Y3RfX3dzc2VfX19fX2JpbmFyeV9zZWN1cml0eV90b2tlbi5odG1sIDIzMywxMDggNDE3LDEzNAorcmVjdCAkc3RydWN0X193c3NlX19fX191c2VybmFtZV90b2tlbi5odG1sIDQ0MSwxMDggNjAxLDEzNAorcmVjdCAkc3RydWN0X193c3NlX19fX19wYXNzd29yZC5odG1sIDQ2MCwxNyA1ODMsNDQKK3JlY3QgJHN0cnVjdF9fd3N1X19fX190aW1lc3RhbXAuaHRtbCA2MjUsMTA4IDc0OCwxMzQKZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0X193c3NlX19fX19zZWN1cml0eV9fY29sbF9fZ3JhcGgubWQ1IGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5X19jb2xsX19ncmFwaC5tZDUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE0NDY3NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0X193c3NlX19fX19zZWN1cml0eV9fY29sbF9fZ3JhcGgubWQ1CkBAIC0wLDAgKzEgQEAKKzc1ZDA2ZjcwYWY4ODlhMzY4ODExMjQxNTViM2JlZjcxClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5X19jb2xsX19ncmFwaC5wbmcgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHlfX2NvbGxfX2dyYXBoLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWU3YWRkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5X19jb2xsX19ncmFwaC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5X3Rva2VuX3JlZmVyZW5jZS1tZW1iZXJzLmh0bWwgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHlfdG9rZW5fcmVmZXJlbmNlLW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjRjNTgwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5X3Rva2VuX3JlZmVyZW5jZS1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwxOCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgV1MtU2VjdXJpdHk6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPl93c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlIE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eV90b2tlbl9yZWZlcmVuY2UuaHRtbCI+X3dzc2VfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2U8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eV90b2tlbl9yZWZlcmVuY2UuaHRtbCNvMiI+RW1iZWRkZWQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5X3Rva2VuX3JlZmVyZW5jZS5odG1sIj5fd3NzZV9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHlfdG9rZW5fcmVmZXJlbmNlLmh0bWwjbzEiPktleUlkZW50aWZpZXI8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5X3Rva2VuX3JlZmVyZW5jZS5odG1sIj5fd3NzZV9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHlfdG9rZW5fcmVmZXJlbmNlLmh0bWwjbzAiPlJlZmVyZW5jZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHlfdG9rZW5fcmVmZXJlbmNlLmh0bWwiPl93c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eV90b2tlbl9yZWZlcmVuY2UuaHRtbCNvNCI+VXNhZ2U8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5X3Rva2VuX3JlZmVyZW5jZS5odG1sIj5fd3NzZV9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHlfdG9rZW5fcmVmZXJlbmNlLmh0bWwjbzMiPndzdV9fSWQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5X3Rva2VuX3JlZmVyZW5jZS5odG1sIj5fd3NzZV9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gRnJpIEF1ZyAxOSAxMDo0MTo0NSAyMDA1IGZvciBnU09BUCBXUy1TZWN1cml0eSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5X3Rva2VuX3JlZmVyZW5jZS5odG1sIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5X3Rva2VuX3JlZmVyZW5jZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZjcwOWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHlfdG9rZW5fcmVmZXJlbmNlLmh0bWwKQEAgLTAsMCArMSwxNjAgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFdTLVNlY3VyaXR5OiBfd3NzZV9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZSBTdHJ1Y3QgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPl93c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlIFN0cnVjdCBSZWZlcmVuY2U8L2gxPlRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSB3c3NlOlNlY3VyaXR5VG9rZW5SZWZlcmVuY2UgcGVyIFNlY3Rpb24gNC4zLiBJbXBvcnRlZCBlbGVtZW50IF93c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7d3NzZS5oJmd0OzwvY29kZT4NCis8cD4NCitDb2xsYWJvcmF0aW9uIGRpYWdyYW0gZm9yIF93c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlOjxwPjxjZW50ZXI+PGltZyBzcmM9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHlfdG9rZW5fcmVmZXJlbmNlX19jb2xsX19ncmFwaC5wbmciIGJvcmRlcj0iMCIgdXNlbWFwPSIjX193c3NlX19fX19zZWN1cml0eV90b2tlbl9yZWZlcmVuY2VfX2NvbGxfX21hcCIgYWx0PSJDb2xsYWJvcmF0aW9uIGdyYXBoIj48L2NlbnRlcj4NCis8bWFwIG5hbWU9Il9fd3NzZV9fX19fc2VjdXJpdHlfdG9rZW5fcmVmZXJlbmNlX19jb2xsX19tYXAiPg0KKzxhcmVhIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fZW1iZWRkZWQuaHRtbCIgc2hhcGU9InJlY3QiIGNvb3Jkcz0iNywxNywxMzcsNDQiIGFsdD0iIj4NCis8YXJlYSBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2tleV9pZGVudGlmaWVyLmh0bWwiIHNoYXBlPSJyZWN0IiBjb29yZHM9IjE2MSwxNywzMDAsNDQiIGFsdD0iIj4NCis8YXJlYSBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3JlZmVyZW5jZS5odG1sIiBzaGFwZT0icmVjdCIgY29vcmRzPSIzMjQsMTcsNDQ5LDQ0IiBhbHQ9IiI+DQorPC9tYXA+DQorPGNlbnRlcj48Zm9udCBzaXplPSIyIj5bPGEgaHJlZj0iZ3JhcGhfbGVnZW5kLmh0bWwiPmxlZ2VuZDwvYT5dPC9mb250PjwvY2VudGVyPjxhIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHlfdG9rZW5fcmVmZXJlbmNlLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19yZWZlcmVuY2UuaHRtbCI+X3dzc2VfX1JlZmVyZW5jZTwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5X3Rva2VuX3JlZmVyZW5jZS5odG1sI28wIj5SZWZlcmVuY2U8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fa2V5X2lkZW50aWZpZXIuaHRtbCI+X3dzc2VfX0tleUlkZW50aWZpZXI8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eV90b2tlbl9yZWZlcmVuY2UuaHRtbCNvMSI+S2V5SWRlbnRpZmllcjwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19lbWJlZGRlZC5odG1sIj5fd3NzZV9fRW1iZWRkZWQ8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eV90b2tlbl9yZWZlcmVuY2UuaHRtbCNvMiI+RW1iZWRkZWQ8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eV90b2tlbl9yZWZlcmVuY2UuaHRtbCNvMyI+d3N1X19JZDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5X3Rva2VuX3JlZmVyZW5jZS5odG1sI280Ij5Vc2FnZTwvYT48L3RkPjwvdHI+DQorDQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK1RoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSB3c3NlOlNlY3VyaXR5VG9rZW5SZWZlcmVuY2UgcGVyIFNlY3Rpb24gNC4zLiBJbXBvcnRlZCBlbGVtZW50IF93c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4gDQorPHA+DQorRWxlbWVudCAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpTZWN1cml0eVRva2VuUmVmZXJlbmNlIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOlNlY3VyaXR5VG9rZW5SZWZlcmVuY2VUeXBlLiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJfd3NzZV9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZTo6RW1iZWRkZWQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19lbWJlZGRlZC5odG1sIj5fd3NzZV9fRW1iZWRkZWQ8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHlfdG9rZW5fcmVmZXJlbmNlLmh0bWwjbzIiPl93c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlOjpFbWJlZGRlZDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0iX3dzc2VfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2U6OktleUlkZW50aWZpZXIiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19rZXlfaWRlbnRpZmllci5odG1sIj5fd3NzZV9fS2V5SWRlbnRpZmllcjwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eV90b2tlbl9yZWZlcmVuY2UuaHRtbCNvMSI+X3dzc2VfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2U6OktleUlkZW50aWZpZXI8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9Il93c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlOjpSZWZlcmVuY2UiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19yZWZlcmVuY2UuaHRtbCI+X3dzc2VfX1JlZmVyZW5jZTwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eV90b2tlbl9yZWZlcmVuY2UuaHRtbCNvMCI+X3dzc2VfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2U6OlJlZmVyZW5jZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNCIgZG94eXRhZz0iX3dzc2VfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2U6OlVzYWdlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eV90b2tlbl9yZWZlcmVuY2UuaHRtbCNvNCI+X3dzc2VfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2U6OlVzYWdlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8zIiBkb3h5dGFnPSJfd3NzZV9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZTo6d3N1X19JZCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHlfdG9rZW5fcmVmZXJlbmNlLmh0bWwjbzMiPl93c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlOjp3c3VfX0lkPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBzdHJ1Y3Qgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy93c3NlLzxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZV84aC5odG1sIj53c3NlLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gRnJpIEF1ZyAxOSAxMDo0MTo0NSAyMDA1IGZvciBnU09BUCBXUy1TZWN1cml0eSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5X3Rva2VuX3JlZmVyZW5jZV9fY29sbF9fZ3JhcGgubWFwIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5X3Rva2VuX3JlZmVyZW5jZV9fY29sbF9fZ3JhcGgubWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MzIyODkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHlfdG9rZW5fcmVmZXJlbmNlX19jb2xsX19ncmFwaC5tYXAKQEAgLTAsMCArMSw0IEBACitiYXNlIHJlZmVyZXIKK3JlY3QgJHN0cnVjdF9fd3NzZV9fX19fZW1iZWRkZWQuaHRtbCA3LDE3IDEzNyw0NAorcmVjdCAkc3RydWN0X193c3NlX19fX19rZXlfaWRlbnRpZmllci5odG1sIDE2MSwxNyAzMDAsNDQKK3JlY3QgJHN0cnVjdF9fd3NzZV9fX19fcmVmZXJlbmNlLmh0bWwgMzI0LDE3IDQ0OSw0NApkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5X3Rva2VuX3JlZmVyZW5jZV9fY29sbF9fZ3JhcGgubWQ1IGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5X3Rva2VuX3JlZmVyZW5jZV9fY29sbF9fZ3JhcGgubWQ1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1M2JhYTQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHlfdG9rZW5fcmVmZXJlbmNlX19jb2xsX19ncmFwaC5tZDUKQEAgLTAsMCArMSBAQAorYThlNWM5OTFlN2VlYjY3Mjg4ODEzMjU5MTJmNGFlMTMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3N0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHlfdG9rZW5fcmVmZXJlbmNlX19jb2xsX19ncmFwaC5wbmcgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHlfdG9rZW5fcmVmZXJlbmNlX19jb2xsX19ncmFwaC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlmMjUyMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0X193c3NlX19fX19zZWN1cml0eV90b2tlbl9yZWZlcmVuY2VfX2NvbGxfX2dyYXBoLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3N0cnVjdF9fd3NzZV9fX19fdXNlcm5hbWVfdG9rZW4tbWVtYmVycy5odG1sIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3RfX3dzc2VfX19fX3VzZXJuYW1lX3Rva2VuLW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODA3NGY0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3RfX3dzc2VfX19fX3VzZXJuYW1lX3Rva2VuLW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDE4IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBXUy1TZWN1cml0eTogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+X3dzc2VfX1VzZXJuYW1lVG9rZW4gTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3VzZXJuYW1lX3Rva2VuLmh0bWwiPl93c3NlX19Vc2VybmFtZVRva2VuPC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fdXNlcm5hbWVfdG9rZW4uaHRtbCNvMiI+Tm9uY2U8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3VzZXJuYW1lX3Rva2VuLmh0bWwiPl93c3NlX19Vc2VybmFtZVRva2VuPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX191c2VybmFtZV90b2tlbi5odG1sI28xIj5QYXNzd29yZDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fdXNlcm5hbWVfdG9rZW4uaHRtbCI+X3dzc2VfX1VzZXJuYW1lVG9rZW48L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3VzZXJuYW1lX3Rva2VuLmh0bWwjbzAiPlVzZXJuYW1lPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX191c2VybmFtZV90b2tlbi5odG1sIj5fd3NzZV9fVXNlcm5hbWVUb2tlbjwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fdXNlcm5hbWVfdG9rZW4uaHRtbCNvMyI+d3N1X19DcmVhdGVkPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX191c2VybmFtZV90b2tlbi5odG1sIj5fd3NzZV9fVXNlcm5hbWVUb2tlbjwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fdXNlcm5hbWVfdG9rZW4uaHRtbCNvNCI+d3N1X19JZDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fdXNlcm5hbWVfdG9rZW4uaHRtbCI+X3dzc2VfX1VzZXJuYW1lVG9rZW48L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIEZyaSBBdWcgMTkgMTA6NDE6NDUgMjAwNSBmb3IgZ1NPQVAgV1MtU2VjdXJpdHkgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0X193c3NlX19fX191c2VybmFtZV90b2tlbi5odG1sIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3RfX3dzc2VfX19fX3VzZXJuYW1lX3Rva2VuLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE3NzNlZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0X193c3NlX19fX191c2VybmFtZV90b2tlbi5odG1sCkBAIC0wLDAgKzEsMTU4IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBXUy1TZWN1cml0eTogX3dzc2VfX1VzZXJuYW1lVG9rZW4gU3RydWN0IFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT5fd3NzZV9fVXNlcm5hbWVUb2tlbiBTdHJ1Y3QgUmVmZXJlbmNlPC9oMT5UaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgd3NzZTpVc2VybmFtZVRva2VuIGVsZW1lbnQgcGVyIFNlY3Rpb24gNC4xLiBJbXBvcnRlZCBlbGVtZW50IF93c3NlX19Vc2VybmFtZVRva2VuIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7d3NzZS5oJmd0OzwvY29kZT4NCis8cD4NCitDb2xsYWJvcmF0aW9uIGRpYWdyYW0gZm9yIF93c3NlX19Vc2VybmFtZVRva2VuOjxwPjxjZW50ZXI+PGltZyBzcmM9InN0cnVjdF9fd3NzZV9fX19fdXNlcm5hbWVfdG9rZW5fX2NvbGxfX2dyYXBoLnBuZyIgYm9yZGVyPSIwIiB1c2VtYXA9IiNfX3dzc2VfX19fX3VzZXJuYW1lX3Rva2VuX19jb2xsX19tYXAiIGFsdD0iQ29sbGFib3JhdGlvbiBncmFwaCI+PC9jZW50ZXI+DQorPG1hcCBuYW1lPSJfX3dzc2VfX19fX3VzZXJuYW1lX3Rva2VuX19jb2xsX19tYXAiPg0KKzxhcmVhIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fcGFzc3dvcmQuaHRtbCIgc2hhcGU9InJlY3QiIGNvb3Jkcz0iMjUsMTcsMTQ4LDQ0IiBhbHQ9IiI+DQorPC9tYXA+DQorPGNlbnRlcj48Zm9udCBzaXplPSIyIj5bPGEgaHJlZj0iZ3JhcGhfbGVnZW5kLmh0bWwiPmxlZ2VuZDwvYT5dPC9mb250PjwvY2VudGVyPjxhIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fdXNlcm5hbWVfdG9rZW4tbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fdXNlcm5hbWVfdG9rZW4uaHRtbCNvMCI+VXNlcm5hbWU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fcGFzc3dvcmQuaHRtbCI+X3dzc2VfX1Bhc3N3b3JkPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fdXNlcm5hbWVfdG9rZW4uaHRtbCNvMSI+UGFzc3dvcmQ8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX191c2VybmFtZV90b2tlbi5odG1sI28yIj5Ob25jZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3VzZXJuYW1lX3Rva2VuLmh0bWwjbzMiPndzdV9fQ3JlYXRlZDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3VzZXJuYW1lX3Rva2VuLmh0bWwjbzQiPndzdV9fSWQ8L2E+PC90ZD48L3RyPg0KKw0KKzwvdGFibGU+DQorPGhyPjxhIG5hbWU9Il9kZXRhaWxzIj48L2E+PGgyPkRldGFpbGVkIERlc2NyaXB0aW9uPC9oMj4NCitUaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgd3NzZTpVc2VybmFtZVRva2VuIGVsZW1lbnQgcGVyIFNlY3Rpb24gNC4xLiBJbXBvcnRlZCBlbGVtZW50IF93c3NlX19Vc2VybmFtZVRva2VuIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4gDQorPHA+DQorRWxlbWVudCAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpVc2VybmFtZVRva2VuIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOlVzZXJuYW1lVG9rZW5UeXBlLiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJfd3NzZV9fVXNlcm5hbWVUb2tlbjo6Tm9uY2UiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3VzZXJuYW1lX3Rva2VuLmh0bWwjbzIiPl93c3NlX19Vc2VybmFtZVRva2VuOjpOb25jZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0iX3dzc2VfX1VzZXJuYW1lVG9rZW46OlBhc3N3b3JkIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fcGFzc3dvcmQuaHRtbCI+X3dzc2VfX1Bhc3N3b3JkPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3VzZXJuYW1lX3Rva2VuLmh0bWwjbzEiPl93c3NlX19Vc2VybmFtZVRva2VuOjpQYXNzd29yZDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0iX3dzc2VfX1VzZXJuYW1lVG9rZW46OlVzZXJuYW1lIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX191c2VybmFtZV90b2tlbi5odG1sI28wIj5fd3NzZV9fVXNlcm5hbWVUb2tlbjo6VXNlcm5hbWU8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzMiIGRveHl0YWc9Il93c3NlX19Vc2VybmFtZVRva2VuOjp3c3VfX0NyZWF0ZWQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3VzZXJuYW1lX3Rva2VuLmh0bWwjbzMiPl93c3NlX19Vc2VybmFtZVRva2VuOjp3c3VfX0NyZWF0ZWQ8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzQiIGRveHl0YWc9Il93c3NlX19Vc2VybmFtZVRva2VuOjp3c3VfX0lkIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX191c2VybmFtZV90b2tlbi5odG1sI280Ij5fd3NzZV9fVXNlcm5hbWVUb2tlbjo6d3N1X19JZDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgc3RydWN0IHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2Mvd3NzZS88YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VfOGguaHRtbCI+d3NzZS5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIEZyaSBBdWcgMTkgMTA6NDE6NDUgMjAwNSBmb3IgZ1NPQVAgV1MtU2VjdXJpdHkgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0X193c3NlX19fX191c2VybmFtZV90b2tlbl9fY29sbF9fZ3JhcGgubWFwIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3RfX3dzc2VfX19fX3VzZXJuYW1lX3Rva2VuX19jb2xsX19ncmFwaC5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlYjFjYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0X193c3NlX19fX191c2VybmFtZV90b2tlbl9fY29sbF9fZ3JhcGgubWFwCkBAIC0wLDAgKzEsMiBAQAorYmFzZSByZWZlcmVyCityZWN0ICRzdHJ1Y3RfX3dzc2VfX19fX3Bhc3N3b3JkLmh0bWwgMjUsMTcgMTQ4LDQ0CmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3N0cnVjdF9fd3NzZV9fX19fdXNlcm5hbWVfdG9rZW5fX2NvbGxfX2dyYXBoLm1kNSBiL2RvYy93c3NlL2h0bWwvc3RydWN0X193c3NlX19fX191c2VybmFtZV90b2tlbl9fY29sbF9fZ3JhcGgubWQ1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMmEwNGUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdF9fd3NzZV9fX19fdXNlcm5hbWVfdG9rZW5fX2NvbGxfX2dyYXBoLm1kNQpAQCAtMCwwICsxIEBACithODFhYjY1OTEyMTA1MjFhYmQzYWEzYmYyMmY2Y2E5OQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0X193c3NlX19fX191c2VybmFtZV90b2tlbl9fY29sbF9fZ3JhcGgucG5nIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3RfX3dzc2VfX19fX3VzZXJuYW1lX3Rva2VuX19jb2xsX19ncmFwaC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZiNjRhZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0X193c3NlX19fX191c2VybmFtZV90b2tlbl9fY29sbF9fZ3JhcGgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0X193c3VfX19fX3RpbWVzdGFtcC1tZW1iZXJzLmh0bWwgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdF9fd3N1X19fX190aW1lc3RhbXAtbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMzEzZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdF9fd3N1X19fX190aW1lc3RhbXAtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTYgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFdTLVNlY3VyaXR5OiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT5fd3N1X19UaW1lc3RhbXAgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzdV9fX19fdGltZXN0YW1wLmh0bWwiPl93c3VfX1RpbWVzdGFtcDwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzdV9fX19fdGltZXN0YW1wLmh0bWwjbzEiPkNyZWF0ZWQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzdV9fX19fdGltZXN0YW1wLmh0bWwiPl93c3VfX1RpbWVzdGFtcDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3N1X19fX190aW1lc3RhbXAuaHRtbCNvMiI+RXhwaXJlczwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3N1X19fX190aW1lc3RhbXAuaHRtbCI+X3dzdV9fVGltZXN0YW1wPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3VfX19fX3RpbWVzdGFtcC5odG1sI28wIj53c3VfX0lkPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3VfX19fX3RpbWVzdGFtcC5odG1sIj5fd3N1X19UaW1lc3RhbXA8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIEZyaSBBdWcgMTkgMTA6NDE6NDUgMjAwNSBmb3IgZ1NPQVAgV1MtU2VjdXJpdHkgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0X193c3VfX19fX3RpbWVzdGFtcC5odG1sIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3RfX3dzdV9fX19fdGltZXN0YW1wLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI3NzUzYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0X193c3VfX19fX3RpbWVzdGFtcC5odG1sCkBAIC0wLDAgKzEsMTA0IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBXUy1TZWN1cml0eTogX3dzdV9fVGltZXN0YW1wIFN0cnVjdCBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+X3dzdV9fVGltZXN0YW1wIFN0cnVjdCBSZWZlcmVuY2U8L2gxPlRoaXMgZWxlbWVudCBhbGxvd3MgVGltZXN0YW1wcyB0byBiZSBhcHBsaWVkIGFueXdoZXJlIGVsZW1lbnQgd2lsZGNhcmRzIGFyZSBwcmVzZW50LCBpbmNsdWRpbmcgYXMgYSBTT0FQIGhlYWRlci4gSW1wb3J0ZWQgZWxlbWVudCBfd3N1X19UaW1lc3RhbXAgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KKzxjb2RlPiNpbmNsdWRlICZsdDt3c3UuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0ic3RydWN0X193c3VfX19fX3RpbWVzdGFtcC1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgQXR0cmlidXRlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3VfX19fX3RpbWVzdGFtcC5odG1sI28wIj53c3VfX0lkPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3N1X19fX190aW1lc3RhbXAuaHRtbCNvMSI+Q3JlYXRlZDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzdV9fX19fdGltZXN0YW1wLmh0bWwjbzIiPkV4cGlyZXM8L2E+PC90ZD48L3RyPg0KKw0KKzwvdGFibGU+DQorPGhyPjxhIG5hbWU9Il9kZXRhaWxzIj48L2E+PGgyPkRldGFpbGVkIERlc2NyaXB0aW9uPC9oMj4NCitUaGlzIGVsZW1lbnQgYWxsb3dzIFRpbWVzdGFtcHMgdG8gYmUgYXBwbGllZCBhbnl3aGVyZSBlbGVtZW50IHdpbGRjYXJkcyBhcmUgcHJlc2VudCwgaW5jbHVkaW5nIGFzIGEgU09BUCBoZWFkZXIuIEltcG9ydGVkIGVsZW1lbnQgX3dzdV9fVGltZXN0YW1wIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4gDQorPHA+DQorRWxlbWVudCAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXV0aWxpdHktMS4wLnhzZCI6VGltZXN0YW1wIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktdXRpbGl0eS0xLjAueHNkIjpUaW1lc3RhbXBUeXBlLiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJfd3N1X19UaW1lc3RhbXA6OkNyZWF0ZWQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzdV9fX19fdGltZXN0YW1wLmh0bWwjbzEiPl93c3VfX1RpbWVzdGFtcDo6Q3JlYXRlZDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMiIgZG94eXRhZz0iX3dzdV9fVGltZXN0YW1wOjpFeHBpcmVzIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3VfX19fX3RpbWVzdGFtcC5odG1sI28yIj5fd3N1X19UaW1lc3RhbXA6OkV4cGlyZXM8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9Il93c3VfX1RpbWVzdGFtcDo6d3N1X19JZCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3N1X19fX190aW1lc3RhbXAuaHRtbCNvMCI+X3dzdV9fVGltZXN0YW1wOjp3c3VfX0lkPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBzdHJ1Y3Qgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy93c3NlLzxhIGNsYXNzPSJlbCIgaHJlZj0id3N1XzhoLmh0bWwiPndzdS5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIEZyaSBBdWcgMTkgMTA6NDE6NDUgMjAwNSBmb3IgZ1NPQVAgV1MtU2VjdXJpdHkgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX2Nhbm9uaWNhbGl6YXRpb25fbWV0aG9kX3R5cGUtbWVtYmVycy5odG1sIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fY2Fub25pY2FsaXphdGlvbl9tZXRob2RfdHlwZS1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIyZGU2NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX2Nhbm9uaWNhbGl6YXRpb25fbWV0aG9kX3R5cGUtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFdTLVNlY3VyaXR5OiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT5kc19fQ2Fub25pY2FsaXphdGlvbk1ldGhvZFR5cGUgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fY2Fub25pY2FsaXphdGlvbl9tZXRob2RfdHlwZS5odG1sIj5kc19fQ2Fub25pY2FsaXphdGlvbk1ldGhvZFR5cGU8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2Nhbm9uaWNhbGl6YXRpb25fbWV0aG9kX3R5cGUuaHRtbCNvMCI+QWxnb3JpdGhtPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2Nhbm9uaWNhbGl6YXRpb25fbWV0aG9kX3R5cGUuaHRtbCI+ZHNfX0Nhbm9uaWNhbGl6YXRpb25NZXRob2RUeXBlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2Nhbm9uaWNhbGl6YXRpb25fbWV0aG9kX3R5cGUuaHRtbCNvMSI+YzE0bl9fSW5jbHVzaXZlTmFtZXNwYWNlczwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19jYW5vbmljYWxpemF0aW9uX21ldGhvZF90eXBlLmh0bWwiPmRzX19DYW5vbmljYWxpemF0aW9uTWV0aG9kVHlwZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gRnJpIEF1ZyAxOSAxMDo0MTo0NSAyMDA1IGZvciBnU09BUCBXUy1TZWN1cml0eSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fY2Fub25pY2FsaXphdGlvbl9tZXRob2RfdHlwZS5odG1sIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fY2Fub25pY2FsaXphdGlvbl9tZXRob2RfdHlwZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlY2Y5MjAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19jYW5vbmljYWxpemF0aW9uX21ldGhvZF90eXBlLmh0bWwKQEAgLTAsMCArMSw4NCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgV1MtU2VjdXJpdHk6IGRzX19DYW5vbmljYWxpemF0aW9uTWV0aG9kVHlwZSBTdHJ1Y3QgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPmRzX19DYW5vbmljYWxpemF0aW9uTWV0aG9kVHlwZSBTdHJ1Y3QgUmVmZXJlbmNlPC9oMT4iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6Q2Fub25pY2FsaXphdGlvbk1ldGhvZFR5cGUgaXMgYSBjb21wbGV4VHlwZS4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7ZHMuaCZndDs8L2NvZGU+DQorPHA+DQorQ29sbGFib3JhdGlvbiBkaWFncmFtIGZvciBkc19fQ2Fub25pY2FsaXphdGlvbk1ldGhvZFR5cGU6PHA+PGNlbnRlcj48aW1nIHNyYz0ic3RydWN0ZHNfX19fX2Nhbm9uaWNhbGl6YXRpb25fbWV0aG9kX3R5cGVfX2NvbGxfX2dyYXBoLnBuZyIgYm9yZGVyPSIwIiB1c2VtYXA9IiNkc19fX19fY2Fub25pY2FsaXphdGlvbl9tZXRob2RfdHlwZV9fY29sbF9fbWFwIiBhbHQ9IkNvbGxhYm9yYXRpb24gZ3JhcGgiPjwvY2VudGVyPg0KKzxtYXAgbmFtZT0iZHNfX19fX2Nhbm9uaWNhbGl6YXRpb25fbWV0aG9kX3R5cGVfX2NvbGxfX21hcCI+DQorPGFyZWEgaHJlZj0ic3RydWN0X19jMTRuX19fX19pbmNsdXNpdmVfbmFtZXNwYWNlcy5odG1sIiBzaGFwZT0icmVjdCIgY29vcmRzPSIxNCwxNywyMDksNDQiIGFsdD0iIj4NCis8L21hcD4NCis8Y2VudGVyPjxmb250IHNpemU9IjIiPls8YSBocmVmPSJncmFwaF9sZWdlbmQuaHRtbCI+bGVnZW5kPC9hPl08L2ZvbnQ+PC9jZW50ZXI+PGEgaHJlZj0ic3RydWN0ZHNfX19fX2Nhbm9uaWNhbGl6YXRpb25fbWV0aG9kX3R5cGUtbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19jYW5vbmljYWxpemF0aW9uX21ldGhvZF90eXBlLmh0bWwjbzAiPkFsZ29yaXRobTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X19jMTRuX19fX19pbmNsdXNpdmVfbmFtZXNwYWNlcy5odG1sIj5fYzE0bl9fSW5jbHVzaXZlTmFtZXNwYWNlczwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fY2Fub25pY2FsaXphdGlvbl9tZXRob2RfdHlwZS5odG1sI28xIj5jMTRuX19JbmNsdXNpdmVOYW1lc3BhY2VzPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5NZW1iZXIgZGVjbGFyZWQgaW4gV1MvV1MtdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjbzEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzwvdGFibGU+DQorPGhyPjxhIG5hbWU9Il9kZXRhaWxzIj48L2E+PGgyPkRldGFpbGVkIERlc2NyaXB0aW9uPC9oMj4NCisiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6Q2Fub25pY2FsaXphdGlvbk1ldGhvZFR5cGUgaXMgYSBjb21wbGV4VHlwZS4gDQorPHA+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0iZHNfX0Nhbm9uaWNhbGl6YXRpb25NZXRob2RUeXBlOjpBbGdvcml0aG0iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fY2Fub25pY2FsaXphdGlvbl9tZXRob2RfdHlwZS5odG1sI28wIj5kc19fQ2Fub25pY2FsaXphdGlvbk1ldGhvZFR5cGU6OkFsZ29yaXRobTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitSZXF1aXJlZCBhdHRyaWJ1dGUuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJkc19fQ2Fub25pY2FsaXphdGlvbk1ldGhvZFR5cGU6OmMxNG5fX0luY2x1c2l2ZU5hbWVzcGFjZXMiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX2MxNG5fX19fX2luY2x1c2l2ZV9uYW1lc3BhY2VzLmh0bWwiPl9jMTRuX19JbmNsdXNpdmVOYW1lc3BhY2VzPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fY2Fub25pY2FsaXphdGlvbl9tZXRob2RfdHlwZS5odG1sI28xIj5kc19fQ2Fub25pY2FsaXphdGlvbk1ldGhvZFR5cGU6OmMxNG5fX0luY2x1c2l2ZU5hbWVzcGFjZXM8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTWVtYmVyIGRlY2xhcmVkIGluIFdTL1dTLXR5cGVtYXAuZGF0LiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgc3RydWN0IHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2Mvd3NzZS88YSBjbGFzcz0iZWwiIGhyZWY9ImRzXzhoLmh0bWwiPmRzLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gRnJpIEF1ZyAxOSAxMDo0MTo0NSAyMDA1IGZvciBnU09BUCBXUy1TZWN1cml0eSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fY2Fub25pY2FsaXphdGlvbl9tZXRob2RfdHlwZV9fY29sbF9fZ3JhcGgubWFwIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fY2Fub25pY2FsaXphdGlvbl9tZXRob2RfdHlwZV9fY29sbF9fZ3JhcGgubWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZDcxNTAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19jYW5vbmljYWxpemF0aW9uX21ldGhvZF90eXBlX19jb2xsX19ncmFwaC5tYXAKQEAgLTAsMCArMSwyIEBACitiYXNlIHJlZmVyZXIKK3JlY3QgJHN0cnVjdF9fYzE0bl9fX19faW5jbHVzaXZlX25hbWVzcGFjZXMuaHRtbCAxNCwxNyAyMDksNDQKZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX2Nhbm9uaWNhbGl6YXRpb25fbWV0aG9kX3R5cGVfX2NvbGxfX2dyYXBoLm1kNSBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX2Nhbm9uaWNhbGl6YXRpb25fbWV0aG9kX3R5cGVfX2NvbGxfX2dyYXBoLm1kNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzI1NzY0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fY2Fub25pY2FsaXphdGlvbl9tZXRob2RfdHlwZV9fY29sbF9fZ3JhcGgubWQ1CkBAIC0wLDAgKzEgQEAKKzdkNTI2ODJiNWE5MGRjNGE2NGVjZWY1Y2RkNjA3MTMwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fY2Fub25pY2FsaXphdGlvbl9tZXRob2RfdHlwZV9fY29sbF9fZ3JhcGgucG5nIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fY2Fub25pY2FsaXphdGlvbl9tZXRob2RfdHlwZV9fY29sbF9fZ3JhcGgucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NGY0MmUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19jYW5vbmljYWxpemF0aW9uX21ldGhvZF90eXBlX19jb2xsX19ncmFwaC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fZF9zX2Ffa2V5X3ZhbHVlX3R5cGUtbWVtYmVycy5odG1sIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fZF9zX2Ffa2V5X3ZhbHVlX3R5cGUtbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MzEyMjkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19kX3NfYV9rZXlfdmFsdWVfdHlwZS1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwyMCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgV1MtU2VjdXJpdHk6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPmRzX19EU0FLZXlWYWx1ZVR5cGUgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fZF9zX2Ffa2V5X3ZhbHVlX3R5cGUuaHRtbCI+ZHNfX0RTQUtleVZhbHVlVHlwZTwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fZF9zX2Ffa2V5X3ZhbHVlX3R5cGUuaHRtbCNvMCI+RzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19kX3NfYV9rZXlfdmFsdWVfdHlwZS5odG1sIj5kc19fRFNBS2V5VmFsdWVUeXBlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2Rfc19hX2tleV92YWx1ZV90eXBlLmh0bWwjbzIiPko8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fZF9zX2Ffa2V5X3ZhbHVlX3R5cGUuaHRtbCI+ZHNfX0RTQUtleVZhbHVlVHlwZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19kX3NfYV9rZXlfdmFsdWVfdHlwZS5odG1sI28zIj5QPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2Rfc19hX2tleV92YWx1ZV90eXBlLmh0bWwiPmRzX19EU0FLZXlWYWx1ZVR5cGU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fZF9zX2Ffa2V5X3ZhbHVlX3R5cGUuaHRtbCNvNiI+UGdlbkNvdW50ZXI8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fZF9zX2Ffa2V5X3ZhbHVlX3R5cGUuaHRtbCI+ZHNfX0RTQUtleVZhbHVlVHlwZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19kX3NfYV9rZXlfdmFsdWVfdHlwZS5odG1sI280Ij5RPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2Rfc19hX2tleV92YWx1ZV90eXBlLmh0bWwiPmRzX19EU0FLZXlWYWx1ZVR5cGU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fZF9zX2Ffa2V5X3ZhbHVlX3R5cGUuaHRtbCNvNSI+U2VlZDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19kX3NfYV9rZXlfdmFsdWVfdHlwZS5odG1sIj5kc19fRFNBS2V5VmFsdWVUeXBlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2Rfc19hX2tleV92YWx1ZV90eXBlLmh0bWwjbzEiPlk8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fZF9zX2Ffa2V5X3ZhbHVlX3R5cGUuaHRtbCI+ZHNfX0RTQUtleVZhbHVlVHlwZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gRnJpIEF1ZyAxOSAxMDo0MTo0NiAyMDA1IGZvciBnU09BUCBXUy1TZWN1cml0eSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fZF9zX2Ffa2V5X3ZhbHVlX3R5cGUuaHRtbCBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX2Rfc19hX2tleV92YWx1ZV90eXBlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc4ZTZkZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX2Rfc19hX2tleV92YWx1ZV90eXBlLmh0bWwKQEAgLTAsMCArMSwyMjMgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFdTLVNlY3VyaXR5OiBkc19fRFNBS2V5VmFsdWVUeXBlIFN0cnVjdCBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+ZHNfX0RTQUtleVZhbHVlVHlwZSBTdHJ1Y3QgUmVmZXJlbmNlPC9oMT4iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6RFNBS2V5VmFsdWVUeXBlIGlzIGEgY29tcGxleFR5cGUuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O2RzLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KKzxhIGhyZWY9InN0cnVjdGRzX19fX19kX3NfYV9rZXlfdmFsdWVfdHlwZS1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgQXR0cmlidXRlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2Rfc19hX2tleV92YWx1ZV90eXBlLmh0bWwjbzAiPkc8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkVsZW1lbnQgRyBvZiB0eXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpDcnlwdG9CaW5hcnkuICA8YSBocmVmPSIjbzAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2Rfc19hX2tleV92YWx1ZV90eXBlLmh0bWwjbzEiPlk8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkVsZW1lbnQgWSBvZiB0eXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpDcnlwdG9CaW5hcnkuICA8YSBocmVmPSIjbzEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2Rfc19hX2tleV92YWx1ZV90eXBlLmh0bWwjbzIiPko8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkVsZW1lbnQgSiBvZiB0eXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpDcnlwdG9CaW5hcnkuICA8YSBocmVmPSIjbzIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2Rfc19hX2tleV92YWx1ZV90eXBlLmh0bWwjbzMiPlA8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkVsZW1lbnQgUCBvZiB0eXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpDcnlwdG9CaW5hcnkuICA8YSBocmVmPSIjbzMiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2Rfc19hX2tleV92YWx1ZV90eXBlLmh0bWwjbzQiPlE8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkVsZW1lbnQgUSBvZiB0eXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpDcnlwdG9CaW5hcnkuICA8YSBocmVmPSIjbzQiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2Rfc19hX2tleV92YWx1ZV90eXBlLmh0bWwjbzUiPlNlZWQ8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkVsZW1lbnQgU2VlZCBvZiB0eXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpDcnlwdG9CaW5hcnkuICA8YSBocmVmPSIjbzUiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2Rfc19hX2tleV92YWx1ZV90eXBlLmh0bWwjbzYiPlBnZW5Db3VudGVyPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5SZXF1aXJlZCBlbGVtZW50LiAgPGEgaHJlZj0iI282Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzxocj48YSBuYW1lPSJfZGV0YWlscyI+PC9hPjxoMj5EZXRhaWxlZCBEZXNjcmlwdGlvbjwvaDI+DQorImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOkRTQUtleVZhbHVlVHlwZSBpcyBhIGNvbXBsZXhUeXBlLiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJkc19fRFNBS2V5VmFsdWVUeXBlOjpHIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2Rfc19hX2tleV92YWx1ZV90eXBlLmh0bWwjbzAiPmRzX19EU0FLZXlWYWx1ZVR5cGU6Okc8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorRWxlbWVudCBHIG9mIHR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOkNyeXB0b0JpbmFyeS4gDQorPHA+DQorT3B0aW9uYWwgZWxlbWVudC4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9ImRzX19EU0FLZXlWYWx1ZVR5cGU6OkoiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fZF9zX2Ffa2V5X3ZhbHVlX3R5cGUuaHRtbCNvMiI+ZHNfX0RTQUtleVZhbHVlVHlwZTo6SjwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IEogb2YgdHlwZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6Q3J5cHRvQmluYXJ5LiANCis8cD4NCitPcHRpb25hbCBlbGVtZW50LiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMyIgZG94eXRhZz0iZHNfX0RTQUtleVZhbHVlVHlwZTo6UCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19kX3NfYV9rZXlfdmFsdWVfdHlwZS5odG1sI28zIj5kc19fRFNBS2V5VmFsdWVUeXBlOjpQPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0VsZW1lbnQgUCBvZiB0eXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpDcnlwdG9CaW5hcnkuIA0KKzxwPg0KK1JlcXVpcmVkIGVsZW1lbnQuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im82IiBkb3h5dGFnPSJkc19fRFNBS2V5VmFsdWVUeXBlOjpQZ2VuQ291bnRlciIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19kX3NfYV9rZXlfdmFsdWVfdHlwZS5odG1sI282Ij5kc19fRFNBS2V5VmFsdWVUeXBlOjpQZ2VuQ291bnRlcjwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitSZXF1aXJlZCBlbGVtZW50LiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNCIgZG94eXRhZz0iZHNfX0RTQUtleVZhbHVlVHlwZTo6USIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19kX3NfYV9rZXlfdmFsdWVfdHlwZS5odG1sI280Ij5kc19fRFNBS2V5VmFsdWVUeXBlOjpRPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0VsZW1lbnQgUSBvZiB0eXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpDcnlwdG9CaW5hcnkuIA0KKzxwPg0KK1JlcXVpcmVkIGVsZW1lbnQuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im81IiBkb3h5dGFnPSJkc19fRFNBS2V5VmFsdWVUeXBlOjpTZWVkIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2Rfc19hX2tleV92YWx1ZV90eXBlLmh0bWwjbzUiPmRzX19EU0FLZXlWYWx1ZVR5cGU6OlNlZWQ8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorRWxlbWVudCBTZWVkIG9mIHR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOkNyeXB0b0JpbmFyeS4gDQorPHA+DQorUmVxdWlyZWQgZWxlbWVudC4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9ImRzX19EU0FLZXlWYWx1ZVR5cGU6OlkiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fZF9zX2Ffa2V5X3ZhbHVlX3R5cGUuaHRtbCNvMSI+ZHNfX0RTQUtleVZhbHVlVHlwZTo6WTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IFkgb2YgdHlwZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6Q3J5cHRvQmluYXJ5LiANCis8cD4NCitSZXF1aXJlZCBlbGVtZW50LiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgc3RydWN0IHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2Mvd3NzZS88YSBjbGFzcz0iZWwiIGhyZWY9ImRzXzhoLmh0bWwiPmRzLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gRnJpIEF1ZyAxOSAxMDo0MTo0NSAyMDA1IGZvciBnU09BUCBXUy1TZWN1cml0eSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fZGlnZXN0X21ldGhvZF90eXBlLW1lbWJlcnMuaHRtbCBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX2RpZ2VzdF9tZXRob2RfdHlwZS1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc0N2VjZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX2RpZ2VzdF9tZXRob2RfdHlwZS1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwxNCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgV1MtU2VjdXJpdHk6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPmRzX19EaWdlc3RNZXRob2RUeXBlIE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2RpZ2VzdF9tZXRob2RfdHlwZS5odG1sIj5kc19fRGlnZXN0TWV0aG9kVHlwZTwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fZGlnZXN0X21ldGhvZF90eXBlLmh0bWwjbzAiPkFsZ29yaXRobTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19kaWdlc3RfbWV0aG9kX3R5cGUuaHRtbCI+ZHNfX0RpZ2VzdE1ldGhvZFR5cGU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIEZyaSBBdWcgMTkgMTA6NDE6NDUgMjAwNSBmb3IgZ1NPQVAgV1MtU2VjdXJpdHkgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX2RpZ2VzdF9tZXRob2RfdHlwZS5odG1sIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fZGlnZXN0X21ldGhvZF90eXBlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM5OGExMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX2RpZ2VzdF9tZXRob2RfdHlwZS5odG1sCkBAIC0wLDAgKzEsNTUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFdTLVNlY3VyaXR5OiBkc19fRGlnZXN0TWV0aG9kVHlwZSBTdHJ1Y3QgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPmRzX19EaWdlc3RNZXRob2RUeXBlIFN0cnVjdCBSZWZlcmVuY2U8L2gxPiJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpEaWdlc3RNZXRob2RUeXBlIGlzIGEgY29tcGxleFR5cGUuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O2RzLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KKzxhIGhyZWY9InN0cnVjdGRzX19fX19kaWdlc3RfbWV0aG9kX3R5cGUtbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19kaWdlc3RfbWV0aG9kX3R5cGUuaHRtbCNvMCI+QWxnb3JpdGhtPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5SZXF1aXJlZCBhdHRyaWJ1dGUuICA8YSBocmVmPSIjbzAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzwvdGFibGU+DQorPGhyPjxhIG5hbWU9Il9kZXRhaWxzIj48L2E+PGgyPkRldGFpbGVkIERlc2NyaXB0aW9uPC9oMj4NCisiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6RGlnZXN0TWV0aG9kVHlwZSBpcyBhIGNvbXBsZXhUeXBlLiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJkc19fRGlnZXN0TWV0aG9kVHlwZTo6QWxnb3JpdGhtIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2RpZ2VzdF9tZXRob2RfdHlwZS5odG1sI28wIj5kc19fRGlnZXN0TWV0aG9kVHlwZTo6QWxnb3JpdGhtPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1JlcXVpcmVkIGF0dHJpYnV0ZS4gDQorPHA+DQorVE9ETzogJmx0O2FueSBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbm9jY3Vycz0iMCIgbWF4b2NjdXJzPSJ1bmJvdW5kZWQiJmd0OyBTY2hlbWEgZXh0ZW5zaWJpbGl0eSBpcyB1c2VyLWRlZmluYWJsZS4gQ29uc3VsdCB0aGUgcHJvdG9jb2wgZG9jdW1lbnRhdGlvbiB0byBjaGFuZ2UgYW5kL29yIGluc2VydCBkZWNsYXJhdGlvbnMuIFVzZSB3c2RsMmggb3B0aW9uIC14IHRvIHJlbW92ZSB0aGlzIGVsZW1lbnQuIEF0dHJpYnV0ZSBBbGdvcml0aG0gb2YgdHlwZSB4czphbnlVUkkuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBzdHJ1Y3Qgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy93c3NlLzxhIGNsYXNzPSJlbCIgaHJlZj0iZHNfOGguaHRtbCI+ZHMuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBGcmkgQXVnIDE5IDEwOjQxOjQ1IDIwMDUgZm9yIGdTT0FQIFdTLVNlY3VyaXR5IGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19rZXlfaW5mb190eXBlLW1lbWJlcnMuaHRtbCBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX2tleV9pbmZvX3R5cGUtbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyM2E0ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19rZXlfaW5mb190eXBlLW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDE5IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBXUy1TZWN1cml0eTogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+ZHNfX0tleUluZm9UeXBlIE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2tleV9pbmZvX3R5cGUuaHRtbCI+ZHNfX0tleUluZm9UeXBlPC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19rZXlfaW5mb190eXBlLmh0bWwjbzUiPklkPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2tleV9pbmZvX3R5cGUuaHRtbCI+ZHNfX0tleUluZm9UeXBlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2tleV9pbmZvX3R5cGUuaHRtbCNvMCI+S2V5TmFtZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19rZXlfaW5mb190eXBlLmh0bWwiPmRzX19LZXlJbmZvVHlwZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19rZXlfaW5mb190eXBlLmh0bWwjbzEiPktleVZhbHVlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2tleV9pbmZvX3R5cGUuaHRtbCI+ZHNfX0tleUluZm9UeXBlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2tleV9pbmZvX3R5cGUuaHRtbCNvMiI+UmV0cmlldmFsTWV0aG9kPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2tleV9pbmZvX3R5cGUuaHRtbCI+ZHNfX0tleUluZm9UeXBlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2tleV9pbmZvX3R5cGUuaHRtbCNvNCI+d3NzZV9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19rZXlfaW5mb190eXBlLmh0bWwiPmRzX19LZXlJbmZvVHlwZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19rZXlfaW5mb190eXBlLmh0bWwjbzMiPlg1MDlEYXRhPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2tleV9pbmZvX3R5cGUuaHRtbCI+ZHNfX0tleUluZm9UeXBlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBGcmkgQXVnIDE5IDEwOjQxOjQ2IDIwMDUgZm9yIGdTT0FQIFdTLVNlY3VyaXR5IGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19rZXlfaW5mb190eXBlLmh0bWwgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19rZXlfaW5mb190eXBlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgwMjQ3YwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX2tleV9pbmZvX3R5cGUuaHRtbApAQCAtMCwwICsxLDE4NCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgV1MtU2VjdXJpdHk6IGRzX19LZXlJbmZvVHlwZSBTdHJ1Y3QgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPmRzX19LZXlJbmZvVHlwZSBTdHJ1Y3QgUmVmZXJlbmNlPC9oMT5JbXBvcnRlZCBjb21wbGV4VHlwZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6S2V5SW5mb1R5cGUgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KKzxjb2RlPiNpbmNsdWRlICZsdDtkcy5oJmd0OzwvY29kZT4NCis8cD4NCitDb2xsYWJvcmF0aW9uIGRpYWdyYW0gZm9yIGRzX19LZXlJbmZvVHlwZTo8cD48Y2VudGVyPjxpbWcgc3JjPSJzdHJ1Y3Rkc19fX19fa2V5X2luZm9fdHlwZV9fY29sbF9fZ3JhcGgucG5nIiBib3JkZXI9IjAiIHVzZW1hcD0iI2RzX19fX19rZXlfaW5mb190eXBlX19jb2xsX19tYXAiIGFsdD0iQ29sbGFib3JhdGlvbiBncmFwaCI+PC9jZW50ZXI+DQorPG1hcCBuYW1lPSJkc19fX19fa2V5X2luZm9fdHlwZV9fY29sbF9fbWFwIj4NCis8YXJlYSBocmVmPSJzdHJ1Y3Rkc19fX19fa2V5X3ZhbHVlX3R5cGUuaHRtbCIgc2hhcGU9InJlY3QiIGNvb3Jkcz0iNiwxNywxMzQsNDQiIGFsdD0iIj4NCis8YXJlYSBocmVmPSJzdHJ1Y3Rkc19fX19fcmV0cmlldmFsX21ldGhvZF90eXBlLmh0bWwiIHNoYXBlPSJyZWN0IiBjb29yZHM9IjE1OCwxNywzMjQsNDQiIGFsdD0iIj4NCis8YXJlYSBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5X3Rva2VuX3JlZmVyZW5jZS5odG1sIiBzaGFwZT0icmVjdCIgY29vcmRzPSIzNDgsMTcsNTU4LDQ0IiBhbHQ9IiI+DQorPGFyZWEgaHJlZj0ic3RydWN0ZHNfX19fX3g1MDlfZGF0YV90eXBlLmh0bWwiIHNoYXBlPSJyZWN0IiBjb29yZHM9IjYwNSwxNyw3MzYsNDQiIGFsdD0iIj4NCis8L21hcD4NCis8Y2VudGVyPjxmb250IHNpemU9IjIiPls8YSBocmVmPSJncmFwaF9sZWdlbmQuaHRtbCI+bGVnZW5kPC9hPl08L2ZvbnQ+PC9jZW50ZXI+PGEgaHJlZj0ic3RydWN0ZHNfX19fX2tleV9pbmZvX3R5cGUtbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19rZXlfaW5mb190eXBlLmh0bWwjbzAiPktleU5hbWU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19rZXlfdmFsdWVfdHlwZS5odG1sIj5kc19fS2V5VmFsdWVUeXBlPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19rZXlfaW5mb190eXBlLmh0bWwjbzEiPktleVZhbHVlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fcmV0cmlldmFsX21ldGhvZF90eXBlLmh0bWwiPmRzX19SZXRyaWV2YWxNZXRob2RUeXBlPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19rZXlfaW5mb190eXBlLmh0bWwjbzIiPlJldHJpZXZhbE1ldGhvZDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3g1MDlfZGF0YV90eXBlLmh0bWwiPmRzX19YNTA5RGF0YVR5cGU8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2tleV9pbmZvX3R5cGUuaHRtbCNvMyI+WDUwOURhdGE8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHlfdG9rZW5fcmVmZXJlbmNlLmh0bWwiPl93c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19rZXlfaW5mb190eXBlLmh0bWwjbzQiPndzc2VfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2U8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2tleV9pbmZvX3R5cGUuaHRtbCNvNSI+SWQ8L2E+PC90ZD48L3RyPg0KKw0KKzwvdGFibGU+DQorPGhyPjxhIG5hbWU9Il9kZXRhaWxzIj48L2E+PGgyPkRldGFpbGVkIERlc2NyaXB0aW9uPC9oMj4NCitJbXBvcnRlZCBjb21wbGV4VHlwZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6S2V5SW5mb1R5cGUgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im81IiBkb3h5dGFnPSJkc19fS2V5SW5mb1R5cGU6OklkIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2tleV9pbmZvX3R5cGUuaHRtbCNvNSI+ZHNfX0tleUluZm9UeXBlOjpJZDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0iZHNfX0tleUluZm9UeXBlOjpLZXlOYW1lIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2tleV9pbmZvX3R5cGUuaHRtbCNvMCI+ZHNfX0tleUluZm9UeXBlOjpLZXlOYW1lPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJkc19fS2V5SW5mb1R5cGU6OktleVZhbHVlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19rZXlfdmFsdWVfdHlwZS5odG1sIj5kc19fS2V5VmFsdWVUeXBlPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fa2V5X2luZm9fdHlwZS5odG1sI28xIj5kc19fS2V5SW5mb1R5cGU6OktleVZhbHVlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJkc19fS2V5SW5mb1R5cGU6OlJldHJpZXZhbE1ldGhvZCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fcmV0cmlldmFsX21ldGhvZF90eXBlLmh0bWwiPmRzX19SZXRyaWV2YWxNZXRob2RUeXBlPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fa2V5X2luZm9fdHlwZS5odG1sI28yIj5kc19fS2V5SW5mb1R5cGU6OlJldHJpZXZhbE1ldGhvZDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNCIgZG94eXRhZz0iZHNfX0tleUluZm9UeXBlOjp3c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHlfdG9rZW5fcmVmZXJlbmNlLmh0bWwiPl93c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fa2V5X2luZm9fdHlwZS5odG1sI280Ij5kc19fS2V5SW5mb1R5cGU6Ondzc2VfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2U8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzMiIGRveHl0YWc9ImRzX19LZXlJbmZvVHlwZTo6WDUwOURhdGEiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3g1MDlfZGF0YV90eXBlLmh0bWwiPmRzX19YNTA5RGF0YVR5cGU8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19rZXlfaW5mb190eXBlLmh0bWwjbzMiPmRzX19LZXlJbmZvVHlwZTo6WDUwOURhdGE8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIHN0cnVjdCB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3dzc2UvPGEgY2xhc3M9ImVsIiBocmVmPSJkc184aC5odG1sIj5kcy5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIEZyaSBBdWcgMTkgMTA6NDE6NDYgMjAwNSBmb3IgZ1NPQVAgV1MtU2VjdXJpdHkgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX2tleV9pbmZvX3R5cGVfX2NvbGxfX2dyYXBoLm1hcCBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX2tleV9pbmZvX3R5cGVfX2NvbGxfX2dyYXBoLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTI5MmU0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fa2V5X2luZm9fdHlwZV9fY29sbF9fZ3JhcGgubWFwCkBAIC0wLDAgKzEsNSBAQAorYmFzZSByZWZlcmVyCityZWN0ICRzdHJ1Y3Rkc19fX19fa2V5X3ZhbHVlX3R5cGUuaHRtbCA2LDE3IDEzNCw0NAorcmVjdCAkc3RydWN0ZHNfX19fX3JldHJpZXZhbF9tZXRob2RfdHlwZS5odG1sIDE1OCwxNyAzMjQsNDQKK3JlY3QgJHN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHlfdG9rZW5fcmVmZXJlbmNlLmh0bWwgMzQ4LDE3IDU1OCw0NAorcmVjdCAkc3RydWN0ZHNfX19fX3g1MDlfZGF0YV90eXBlLmh0bWwgNjA1LDE3IDczNiw0NApkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fa2V5X2luZm9fdHlwZV9fY29sbF9fZ3JhcGgubWQ1IGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fa2V5X2luZm9fdHlwZV9fY29sbF9fZ3JhcGgubWQ1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNTcwZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19rZXlfaW5mb190eXBlX19jb2xsX19ncmFwaC5tZDUKQEAgLTAsMCArMSBAQAorM2Y1ZDUzOGZkMTc3YmYxMzNhZWY5NDliMDY1NzAxMzkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19rZXlfaW5mb190eXBlX19jb2xsX19ncmFwaC5wbmcgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19rZXlfaW5mb190eXBlX19jb2xsX19ncmFwaC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdlMmRkMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX2tleV9pbmZvX3R5cGVfX2NvbGxfX2dyYXBoLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19rZXlfdmFsdWVfdHlwZS1tZW1iZXJzLmh0bWwgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19rZXlfdmFsdWVfdHlwZS1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y3N2UwZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX2tleV92YWx1ZV90eXBlLW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDE1IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBXUy1TZWN1cml0eTogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+ZHNfX0tleVZhbHVlVHlwZSBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19rZXlfdmFsdWVfdHlwZS5odG1sIj5kc19fS2V5VmFsdWVUeXBlPC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19rZXlfdmFsdWVfdHlwZS5odG1sI28wIj5EU0FLZXlWYWx1ZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19rZXlfdmFsdWVfdHlwZS5odG1sIj5kc19fS2V5VmFsdWVUeXBlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2tleV92YWx1ZV90eXBlLmh0bWwjbzEiPlJTQUtleVZhbHVlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2tleV92YWx1ZV90eXBlLmh0bWwiPmRzX19LZXlWYWx1ZVR5cGU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIEZyaSBBdWcgMTkgMTA6NDE6NDYgMjAwNSBmb3IgZ1NPQVAgV1MtU2VjdXJpdHkgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX2tleV92YWx1ZV90eXBlLmh0bWwgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19rZXlfdmFsdWVfdHlwZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwODVlMmQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19rZXlfdmFsdWVfdHlwZS5odG1sCkBAIC0wLDAgKzEsODUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFdTLVNlY3VyaXR5OiBkc19fS2V5VmFsdWVUeXBlIFN0cnVjdCBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+ZHNfX0tleVZhbHVlVHlwZSBTdHJ1Y3QgUmVmZXJlbmNlPC9oMT4iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6S2V5VmFsdWVUeXBlIGlzIGEgY29tcGxleFR5cGUuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O2RzLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KK0NvbGxhYm9yYXRpb24gZGlhZ3JhbSBmb3IgZHNfX0tleVZhbHVlVHlwZTo8cD48Y2VudGVyPjxpbWcgc3JjPSJzdHJ1Y3Rkc19fX19fa2V5X3ZhbHVlX3R5cGVfX2NvbGxfX2dyYXBoLnBuZyIgYm9yZGVyPSIwIiB1c2VtYXA9IiNkc19fX19fa2V5X3ZhbHVlX3R5cGVfX2NvbGxfX21hcCIgYWx0PSJDb2xsYWJvcmF0aW9uIGdyYXBoIj48L2NlbnRlcj4NCis8bWFwIG5hbWU9ImRzX19fX19rZXlfdmFsdWVfdHlwZV9fY29sbF9fbWFwIj4NCis8YXJlYSBocmVmPSJzdHJ1Y3Rkc19fX19fcl9zX2Ffa2V5X3ZhbHVlX3R5cGUuaHRtbCIgc2hhcGU9InJlY3QiIGNvb3Jkcz0iNiwxNywxNjEsNDQiIGFsdD0iIj4NCis8YXJlYSBocmVmPSJzdHJ1Y3Rkc19fX19fZF9zX2Ffa2V5X3ZhbHVlX3R5cGUuaHRtbCIgc2hhcGU9InJlY3QiIGNvb3Jkcz0iMTg1LDE3LDM0MCw0NCIgYWx0PSIiPg0KKzwvbWFwPg0KKzxjZW50ZXI+PGZvbnQgc2l6ZT0iMiI+WzxhIGhyZWY9ImdyYXBoX2xlZ2VuZC5odG1sIj5sZWdlbmQ8L2E+XTwvZm9udD48L2NlbnRlcj48YSBocmVmPSJzdHJ1Y3Rkc19fX19fa2V5X3ZhbHVlX3R5cGUtbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fZF9zX2Ffa2V5X3ZhbHVlX3R5cGUuaHRtbCI+ZHNfX0RTQUtleVZhbHVlVHlwZTwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fa2V5X3ZhbHVlX3R5cGUuaHRtbCNvMCI+RFNBS2V5VmFsdWU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19yX3NfYV9rZXlfdmFsdWVfdHlwZS5odG1sIj5kc19fUlNBS2V5VmFsdWVUeXBlPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19rZXlfdmFsdWVfdHlwZS5odG1sI28xIj5SU0FLZXlWYWx1ZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+RWxlbWVudCByZWZlcmVuY2UgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlJTQUtleVZhbHVlLiAgPGEgaHJlZj0iI28xIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzxocj48YSBuYW1lPSJfZGV0YWlscyI+PC9hPjxoMj5EZXRhaWxlZCBEZXNjcmlwdGlvbjwvaDI+DQorImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOktleVZhbHVlVHlwZSBpcyBhIGNvbXBsZXhUeXBlLiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJkc19fS2V5VmFsdWVUeXBlOjpEU0FLZXlWYWx1ZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fZF9zX2Ffa2V5X3ZhbHVlX3R5cGUuaHRtbCI+ZHNfX0RTQUtleVZhbHVlVHlwZTwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2tleV92YWx1ZV90eXBlLmh0bWwjbzAiPmRzX19LZXlWYWx1ZVR5cGU6OkRTQUtleVZhbHVlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1JlcXVpcmVkIGVsZW1lbnQuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJkc19fS2V5VmFsdWVUeXBlOjpSU0FLZXlWYWx1ZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fcl9zX2Ffa2V5X3ZhbHVlX3R5cGUuaHRtbCI+ZHNfX1JTQUtleVZhbHVlVHlwZTwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2tleV92YWx1ZV90eXBlLmh0bWwjbzEiPmRzX19LZXlWYWx1ZVR5cGU6OlJTQUtleVZhbHVlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0VsZW1lbnQgcmVmZXJlbmNlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpSU0FLZXlWYWx1ZS4gDQorPHA+DQorUmVxdWlyZWQgZWxlbWVudC4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIHN0cnVjdCB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3dzc2UvPGEgY2xhc3M9ImVsIiBocmVmPSJkc184aC5odG1sIj5kcy5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIEZyaSBBdWcgMTkgMTA6NDE6NDYgMjAwNSBmb3IgZ1NPQVAgV1MtU2VjdXJpdHkgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX2tleV92YWx1ZV90eXBlX19jb2xsX19ncmFwaC5tYXAgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19rZXlfdmFsdWVfdHlwZV9fY29sbF9fZ3JhcGgubWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMDZjNjEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19rZXlfdmFsdWVfdHlwZV9fY29sbF9fZ3JhcGgubWFwCkBAIC0wLDAgKzEsMyBAQAorYmFzZSByZWZlcmVyCityZWN0ICRzdHJ1Y3Rkc19fX19fcl9zX2Ffa2V5X3ZhbHVlX3R5cGUuaHRtbCA2LDE3IDE2MSw0NAorcmVjdCAkc3RydWN0ZHNfX19fX2Rfc19hX2tleV92YWx1ZV90eXBlLmh0bWwgMTg1LDE3IDM0MCw0NApkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fa2V5X3ZhbHVlX3R5cGVfX2NvbGxfX2dyYXBoLm1kNSBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX2tleV92YWx1ZV90eXBlX19jb2xsX19ncmFwaC5tZDUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU0NGYyMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX2tleV92YWx1ZV90eXBlX19jb2xsX19ncmFwaC5tZDUKQEAgLTAsMCArMSBAQAorOGEzYjA0ZThkMjc5ODFjYTQ3OGY5M2MxZTkyOTk5YWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19rZXlfdmFsdWVfdHlwZV9fY29sbF9fZ3JhcGgucG5nIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fa2V5X3ZhbHVlX3R5cGVfX2NvbGxfX2dyYXBoLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjExYzFmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fa2V5X3ZhbHVlX3R5cGVfX2NvbGxfX2dyYXBoLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19yX3NfYV9rZXlfdmFsdWVfdHlwZS1tZW1iZXJzLmh0bWwgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19yX3NfYV9rZXlfdmFsdWVfdHlwZS1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU0OWY4NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3Jfc19hX2tleV92YWx1ZV90eXBlLW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDE1IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBXUy1TZWN1cml0eTogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+ZHNfX1JTQUtleVZhbHVlVHlwZSBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19yX3NfYV9rZXlfdmFsdWVfdHlwZS5odG1sIj5kc19fUlNBS2V5VmFsdWVUeXBlPC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19yX3NfYV9rZXlfdmFsdWVfdHlwZS5odG1sI28xIj5FeHBvbmVudDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19yX3NfYV9rZXlfdmFsdWVfdHlwZS5odG1sIj5kc19fUlNBS2V5VmFsdWVUeXBlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3Jfc19hX2tleV92YWx1ZV90eXBlLmh0bWwjbzAiPk1vZHVsdXM8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fcl9zX2Ffa2V5X3ZhbHVlX3R5cGUuaHRtbCI+ZHNfX1JTQUtleVZhbHVlVHlwZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gRnJpIEF1ZyAxOSAxMDo0MTo0NiAyMDA1IGZvciBnU09BUCBXUy1TZWN1cml0eSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fcl9zX2Ffa2V5X3ZhbHVlX3R5cGUuaHRtbCBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3Jfc19hX2tleV92YWx1ZV90eXBlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVjMWEzZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3Jfc19hX2tleV92YWx1ZV90eXBlLmh0bWwKQEAgLTAsMCArMSw4MyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgV1MtU2VjdXJpdHk6IGRzX19SU0FLZXlWYWx1ZVR5cGUgU3RydWN0IFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT5kc19fUlNBS2V5VmFsdWVUeXBlIFN0cnVjdCBSZWZlcmVuY2U8L2gxPiJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpSU0FLZXlWYWx1ZVR5cGUgaXMgYSBjb21wbGV4VHlwZS4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7ZHMuaCZndDs8L2NvZGU+DQorPHA+DQorPGEgaHJlZj0ic3RydWN0ZHNfX19fX3Jfc19hX2tleV92YWx1ZV90eXBlLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fcl9zX2Ffa2V5X3ZhbHVlX3R5cGUuaHRtbCNvMCI+TW9kdWx1czwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+RWxlbWVudCBNb2R1bHVzIG9mIHR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOkNyeXB0b0JpbmFyeS4gIDxhIGhyZWY9IiNvMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fcl9zX2Ffa2V5X3ZhbHVlX3R5cGUuaHRtbCNvMSI+RXhwb25lbnQ8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlJlcXVpcmVkIGVsZW1lbnQuICA8YSBocmVmPSIjbzEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzwvdGFibGU+DQorPGhyPjxhIG5hbWU9Il9kZXRhaWxzIj48L2E+PGgyPkRldGFpbGVkIERlc2NyaXB0aW9uPC9oMj4NCisiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6UlNBS2V5VmFsdWVUeXBlIGlzIGEgY29tcGxleFR5cGUuIA0KKzxwPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9ImRzX19SU0FLZXlWYWx1ZVR5cGU6OkV4cG9uZW50IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3Jfc19hX2tleV92YWx1ZV90eXBlLmh0bWwjbzEiPmRzX19SU0FLZXlWYWx1ZVR5cGU6OkV4cG9uZW50PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1JlcXVpcmVkIGVsZW1lbnQuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJkc19fUlNBS2V5VmFsdWVUeXBlOjpNb2R1bHVzIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3Jfc19hX2tleV92YWx1ZV90eXBlLmh0bWwjbzAiPmRzX19SU0FLZXlWYWx1ZVR5cGU6Ok1vZHVsdXM8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorRWxlbWVudCBNb2R1bHVzIG9mIHR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOkNyeXB0b0JpbmFyeS4gDQorPHA+DQorUmVxdWlyZWQgZWxlbWVudC4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIHN0cnVjdCB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3dzc2UvPGEgY2xhc3M9ImVsIiBocmVmPSJkc184aC5odG1sIj5kcy5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIEZyaSBBdWcgMTkgMTA6NDE6NDYgMjAwNSBmb3IgZ1NPQVAgV1MtU2VjdXJpdHkgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3JlZmVyZW5jZV90eXBlLW1lbWJlcnMuaHRtbCBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3JlZmVyZW5jZV90eXBlLW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWIwNTNmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fcmVmZXJlbmNlX3R5cGUtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTkgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFdTLVNlY3VyaXR5OiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT5kc19fUmVmZXJlbmNlVHlwZSBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19yZWZlcmVuY2VfdHlwZS5odG1sIj5kc19fUmVmZXJlbmNlVHlwZTwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fcmVmZXJlbmNlX3R5cGUuaHRtbCNvMSI+RGlnZXN0TWV0aG9kPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3JlZmVyZW5jZV90eXBlLmh0bWwiPmRzX19SZWZlcmVuY2VUeXBlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3JlZmVyZW5jZV90eXBlLmh0bWwjbzIiPkRpZ2VzdFZhbHVlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3JlZmVyZW5jZV90eXBlLmh0bWwiPmRzX19SZWZlcmVuY2VUeXBlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3JlZmVyZW5jZV90eXBlLmh0bWwjbzMiPklkPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3JlZmVyZW5jZV90eXBlLmh0bWwiPmRzX19SZWZlcmVuY2VUeXBlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3JlZmVyZW5jZV90eXBlLmh0bWwjbzAiPlRyYW5zZm9ybXM8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fcmVmZXJlbmNlX3R5cGUuaHRtbCI+ZHNfX1JlZmVyZW5jZVR5cGU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fcmVmZXJlbmNlX3R5cGUuaHRtbCNvNSI+VHlwZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19yZWZlcmVuY2VfdHlwZS5odG1sIj5kc19fUmVmZXJlbmNlVHlwZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19yZWZlcmVuY2VfdHlwZS5odG1sI280Ij5VUkk8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fcmVmZXJlbmNlX3R5cGUuaHRtbCI+ZHNfX1JlZmVyZW5jZVR5cGU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIEZyaSBBdWcgMTkgMTA6NDE6NDYgMjAwNSBmb3IgZ1NPQVAgV1MtU2VjdXJpdHkgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3JlZmVyZW5jZV90eXBlLmh0bWwgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19yZWZlcmVuY2VfdHlwZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NzNjZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19yZWZlcmVuY2VfdHlwZS5odG1sCkBAIC0wLDAgKzEsMjAyIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBXUy1TZWN1cml0eTogZHNfX1JlZmVyZW5jZVR5cGUgU3RydWN0IFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT5kc19fUmVmZXJlbmNlVHlwZSBTdHJ1Y3QgUmVmZXJlbmNlPC9oMT4iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6UmVmZXJlbmNlVHlwZSBpcyBhIGNvbXBsZXhUeXBlLiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KKzxjb2RlPiNpbmNsdWRlICZsdDtkcy5oJmd0OzwvY29kZT4NCis8cD4NCitDb2xsYWJvcmF0aW9uIGRpYWdyYW0gZm9yIGRzX19SZWZlcmVuY2VUeXBlOjxwPjxjZW50ZXI+PGltZyBzcmM9InN0cnVjdGRzX19fX19yZWZlcmVuY2VfdHlwZV9fY29sbF9fZ3JhcGgucG5nIiBib3JkZXI9IjAiIHVzZW1hcD0iI2RzX19fX19yZWZlcmVuY2VfdHlwZV9fY29sbF9fbWFwIiBhbHQ9IkNvbGxhYm9yYXRpb24gZ3JhcGgiPjwvY2VudGVyPg0KKzxtYXAgbmFtZT0iZHNfX19fX3JlZmVyZW5jZV90eXBlX19jb2xsX19tYXAiPg0KKzxhcmVhIGhyZWY9InN0cnVjdGRzX19fX19kaWdlc3RfbWV0aG9kX3R5cGUuaHRtbCIgc2hhcGU9InJlY3QiIGNvb3Jkcz0iNywxOTksMTU5LDIyNSIgYWx0PSIiPg0KKzxhcmVhIGhyZWY9InN0cnVjdGRzX19fX190cmFuc2Zvcm1zX3R5cGUuaHRtbCIgc2hhcGU9InJlY3QiIGNvb3Jkcz0iMTgzLDE5OSwzMTYsMjI1IiBhbHQ9IiI+DQorPGFyZWEgaHJlZj0ic3RydWN0ZHNfX19fX3RyYW5zZm9ybV90eXBlLmh0bWwiIHNoYXBlPSJyZWN0IiBjb29yZHM9IjE4NSwxMDgsMzEzLDEzNSIgYWx0PSIiPg0KKzxhcmVhIGhyZWY9InN0cnVjdF9fYzE0bl9fX19faW5jbHVzaXZlX25hbWVzcGFjZXMuaHRtbCIgc2hhcGU9InJlY3QiIGNvb3Jkcz0iMTUyLDE3LDM0Nyw0NCIgYWx0PSIiPg0KKzwvbWFwPg0KKzxjZW50ZXI+PGZvbnQgc2l6ZT0iMiI+WzxhIGhyZWY9ImdyYXBoX2xlZ2VuZC5odG1sIj5sZWdlbmQ8L2E+XTwvZm9udD48L2NlbnRlcj48YSBocmVmPSJzdHJ1Y3Rkc19fX19fcmVmZXJlbmNlX3R5cGUtbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fdHJhbnNmb3Jtc190eXBlLmh0bWwiPmRzX19UcmFuc2Zvcm1zVHlwZTwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fcmVmZXJlbmNlX3R5cGUuaHRtbCNvMCI+VHJhbnNmb3JtczwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+RWxlbWVudCByZWZlcmVuY2UgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlRyYW5zZm9ybXMuICA8YSBocmVmPSIjbzAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19kaWdlc3RfbWV0aG9kX3R5cGUuaHRtbCI+ZHNfX0RpZ2VzdE1ldGhvZFR5cGU8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3JlZmVyZW5jZV90eXBlLmh0bWwjbzEiPkRpZ2VzdE1ldGhvZDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+RWxlbWVudCByZWZlcmVuY2UgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOkRpZ2VzdE1ldGhvZC4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fcmVmZXJlbmNlX3R5cGUuaHRtbCNvMiI+RGlnZXN0VmFsdWU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkVsZW1lbnQgcmVmZXJlbmNlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpEaWdlc3RWYWx1ZS4gIDxhIGhyZWY9IiNvMiI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fcmVmZXJlbmNlX3R5cGUuaHRtbCNvMyI+SWQ8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkF0dHJpYnV0ZSBJZCBvZiB0eXBlIHhzOklELiAgPGEgaHJlZj0iI28zIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19yZWZlcmVuY2VfdHlwZS5odG1sI280Ij5VUkk8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkF0dHJpYnV0ZSBVUkkgb2YgdHlwZSB4czphbnlVUkkuICA8YSBocmVmPSIjbzQiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3JlZmVyZW5jZV90eXBlLmh0bWwjbzUiPlR5cGU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk9wdGlvbmFsIGF0dHJpYnV0ZS4gIDxhIGhyZWY9IiNvNSI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KKyJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpSZWZlcmVuY2VUeXBlIGlzIGEgY29tcGxleFR5cGUuIA0KKzxwPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9ImRzX19SZWZlcmVuY2VUeXBlOjpEaWdlc3RNZXRob2QiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2RpZ2VzdF9tZXRob2RfdHlwZS5odG1sIj5kc19fRGlnZXN0TWV0aG9kVHlwZTwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3JlZmVyZW5jZV90eXBlLmh0bWwjbzEiPmRzX19SZWZlcmVuY2VUeXBlOjpEaWdlc3RNZXRob2Q8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorRWxlbWVudCByZWZlcmVuY2UgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOkRpZ2VzdE1ldGhvZC4gDQorPHA+DQorUmVxdWlyZWQgZWxlbWVudC4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9ImRzX19SZWZlcmVuY2VUeXBlOjpEaWdlc3RWYWx1ZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19yZWZlcmVuY2VfdHlwZS5odG1sI28yIj5kc19fUmVmZXJlbmNlVHlwZTo6RGlnZXN0VmFsdWU8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorRWxlbWVudCByZWZlcmVuY2UgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOkRpZ2VzdFZhbHVlLiANCis8cD4NCitSZXF1aXJlZCBlbGVtZW50LiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMyIgZG94eXRhZz0iZHNfX1JlZmVyZW5jZVR5cGU6OklkIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3JlZmVyZW5jZV90eXBlLmh0bWwjbzMiPmRzX19SZWZlcmVuY2VUeXBlOjpJZDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgSWQgb2YgdHlwZSB4czpJRC4gDQorPHA+DQorT3B0aW9uYWwgYXR0cmlidXRlLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0iZHNfX1JlZmVyZW5jZVR5cGU6OlRyYW5zZm9ybXMiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3RyYW5zZm9ybXNfdHlwZS5odG1sIj5kc19fVHJhbnNmb3Jtc1R5cGU8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19yZWZlcmVuY2VfdHlwZS5odG1sI28wIj5kc19fUmVmZXJlbmNlVHlwZTo6VHJhbnNmb3JtczwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IHJlZmVyZW5jZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6VHJhbnNmb3Jtcy4gDQorPHA+DQorT3B0aW9uYWwgZWxlbWVudC4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzUiIGRveHl0YWc9ImRzX19SZWZlcmVuY2VUeXBlOjpUeXBlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3JlZmVyZW5jZV90eXBlLmh0bWwjbzUiPmRzX19SZWZlcmVuY2VUeXBlOjpUeXBlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK09wdGlvbmFsIGF0dHJpYnV0ZS4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzQiIGRveHl0YWc9ImRzX19SZWZlcmVuY2VUeXBlOjpVUkkiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fcmVmZXJlbmNlX3R5cGUuaHRtbCNvNCI+ZHNfX1JlZmVyZW5jZVR5cGU6OlVSSTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBdHRyaWJ1dGUgVVJJIG9mIHR5cGUgeHM6YW55VVJJLiANCis8cD4NCitPcHRpb25hbCBhdHRyaWJ1dGUuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBzdHJ1Y3Qgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy93c3NlLzxhIGNsYXNzPSJlbCIgaHJlZj0iZHNfOGguaHRtbCI+ZHMuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBGcmkgQXVnIDE5IDEwOjQxOjQ2IDIwMDUgZm9yIGdTT0FQIFdTLVNlY3VyaXR5IGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19yZWZlcmVuY2VfdHlwZV9fY29sbF9fZ3JhcGgubWFwIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fcmVmZXJlbmNlX3R5cGVfX2NvbGxfX2dyYXBoLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjQ5MjE3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fcmVmZXJlbmNlX3R5cGVfX2NvbGxfX2dyYXBoLm1hcApAQCAtMCwwICsxLDUgQEAKK2Jhc2UgcmVmZXJlcgorcmVjdCAkc3RydWN0ZHNfX19fX2RpZ2VzdF9tZXRob2RfdHlwZS5odG1sIDcsMTk5IDE1OSwyMjUKK3JlY3QgJHN0cnVjdGRzX19fX190cmFuc2Zvcm1zX3R5cGUuaHRtbCAxODMsMTk5IDMxNiwyMjUKK3JlY3QgJHN0cnVjdGRzX19fX190cmFuc2Zvcm1fdHlwZS5odG1sIDE4NSwxMDggMzEzLDEzNQorcmVjdCAkc3RydWN0X19jMTRuX19fX19pbmNsdXNpdmVfbmFtZXNwYWNlcy5odG1sIDE1MiwxNyAzNDcsNDQKZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3JlZmVyZW5jZV90eXBlX19jb2xsX19ncmFwaC5tZDUgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19yZWZlcmVuY2VfdHlwZV9fY29sbF9fZ3JhcGgubWQ1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ODM5YzEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19yZWZlcmVuY2VfdHlwZV9fY29sbF9fZ3JhcGgubWQ1CkBAIC0wLDAgKzEgQEAKK2M3NTkxZjZlODZlZDAyNThkMWRhMWJmOTBmZTJkMjI0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fcmVmZXJlbmNlX3R5cGVfX2NvbGxfX2dyYXBoLnBuZyBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3JlZmVyZW5jZV90eXBlX19jb2xsX19ncmFwaC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY1YTZlMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3JlZmVyZW5jZV90eXBlX19jb2xsX19ncmFwaC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fcmV0cmlldmFsX21ldGhvZF90eXBlLW1lbWJlcnMuaHRtbCBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3JldHJpZXZhbF9tZXRob2RfdHlwZS1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIyZmRjNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3JldHJpZXZhbF9tZXRob2RfdHlwZS1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwxNiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgV1MtU2VjdXJpdHk6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPmRzX19SZXRyaWV2YWxNZXRob2RUeXBlIE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3JldHJpZXZhbF9tZXRob2RfdHlwZS5odG1sIj5kc19fUmV0cmlldmFsTWV0aG9kVHlwZTwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fcmV0cmlldmFsX21ldGhvZF90eXBlLmh0bWwjbzAiPlRyYW5zZm9ybXM8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fcmV0cmlldmFsX21ldGhvZF90eXBlLmh0bWwiPmRzX19SZXRyaWV2YWxNZXRob2RUeXBlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3JldHJpZXZhbF9tZXRob2RfdHlwZS5odG1sI28yIj5UeXBlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3JldHJpZXZhbF9tZXRob2RfdHlwZS5odG1sIj5kc19fUmV0cmlldmFsTWV0aG9kVHlwZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19yZXRyaWV2YWxfbWV0aG9kX3R5cGUuaHRtbCNvMSI+VVJJPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3JldHJpZXZhbF9tZXRob2RfdHlwZS5odG1sIj5kc19fUmV0cmlldmFsTWV0aG9kVHlwZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gRnJpIEF1ZyAxOSAxMDo0MTo0NiAyMDA1IGZvciBnU09BUCBXUy1TZWN1cml0eSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fcmV0cmlldmFsX21ldGhvZF90eXBlLmh0bWwgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19yZXRyaWV2YWxfbWV0aG9kX3R5cGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmI0NWM0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fcmV0cmlldmFsX21ldGhvZF90eXBlLmh0bWwKQEAgLTAsMCArMSwxMTcgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFdTLVNlY3VyaXR5OiBkc19fUmV0cmlldmFsTWV0aG9kVHlwZSBTdHJ1Y3QgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPmRzX19SZXRyaWV2YWxNZXRob2RUeXBlIFN0cnVjdCBSZWZlcmVuY2U8L2gxPiJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpSZXRyaWV2YWxNZXRob2RUeXBlIGlzIGEgY29tcGxleFR5cGUuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O2RzLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KK0NvbGxhYm9yYXRpb24gZGlhZ3JhbSBmb3IgZHNfX1JldHJpZXZhbE1ldGhvZFR5cGU6PHA+PGNlbnRlcj48aW1nIHNyYz0ic3RydWN0ZHNfX19fX3JldHJpZXZhbF9tZXRob2RfdHlwZV9fY29sbF9fZ3JhcGgucG5nIiBib3JkZXI9IjAiIHVzZW1hcD0iI2RzX19fX19yZXRyaWV2YWxfbWV0aG9kX3R5cGVfX2NvbGxfX21hcCIgYWx0PSJDb2xsYWJvcmF0aW9uIGdyYXBoIj48L2NlbnRlcj4NCis8bWFwIG5hbWU9ImRzX19fX19yZXRyaWV2YWxfbWV0aG9kX3R5cGVfX2NvbGxfX21hcCI+DQorPGFyZWEgaHJlZj0ic3RydWN0ZHNfX19fX3RyYW5zZm9ybXNfdHlwZS5odG1sIiBzaGFwZT0icmVjdCIgY29vcmRzPSIzNywxOTksMTcwLDIyNSIgYWx0PSIiPg0KKzxhcmVhIGhyZWY9InN0cnVjdGRzX19fX190cmFuc2Zvcm1fdHlwZS5odG1sIiBzaGFwZT0icmVjdCIgY29vcmRzPSI0MCwxMDgsMTY4LDEzNSIgYWx0PSIiPg0KKzxhcmVhIGhyZWY9InN0cnVjdF9fYzE0bl9fX19faW5jbHVzaXZlX25hbWVzcGFjZXMuaHRtbCIgc2hhcGU9InJlY3QiIGNvb3Jkcz0iNiwxNywyMDEsNDQiIGFsdD0iIj4NCis8L21hcD4NCis8Y2VudGVyPjxmb250IHNpemU9IjIiPls8YSBocmVmPSJncmFwaF9sZWdlbmQuaHRtbCI+bGVnZW5kPC9hPl08L2ZvbnQ+PC9jZW50ZXI+PGEgaHJlZj0ic3RydWN0ZHNfX19fX3JldHJpZXZhbF9tZXRob2RfdHlwZS1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgQXR0cmlidXRlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX190cmFuc2Zvcm1zX3R5cGUuaHRtbCI+ZHNfX1RyYW5zZm9ybXNUeXBlPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19yZXRyaWV2YWxfbWV0aG9kX3R5cGUuaHRtbCNvMCI+VHJhbnNmb3JtczwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+RWxlbWVudCByZWZlcmVuY2UgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlRyYW5zZm9ybXMuICA8YSBocmVmPSIjbzAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3JldHJpZXZhbF9tZXRob2RfdHlwZS5odG1sI28xIj5VUkk8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkF0dHJpYnV0ZSBVUkkgb2YgdHlwZSB4czphbnlVUkkuICA8YSBocmVmPSIjbzEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3JldHJpZXZhbF9tZXRob2RfdHlwZS5odG1sI28yIj5UeXBlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5PcHRpb25hbCBhdHRyaWJ1dGUuICA8YSBocmVmPSIjbzIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzwvdGFibGU+DQorPGhyPjxhIG5hbWU9Il9kZXRhaWxzIj48L2E+PGgyPkRldGFpbGVkIERlc2NyaXB0aW9uPC9oMj4NCisiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6UmV0cmlldmFsTWV0aG9kVHlwZSBpcyBhIGNvbXBsZXhUeXBlLiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJkc19fUmV0cmlldmFsTWV0aG9kVHlwZTo6VHJhbnNmb3JtcyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fdHJhbnNmb3Jtc190eXBlLmh0bWwiPmRzX19UcmFuc2Zvcm1zVHlwZTwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3JldHJpZXZhbF9tZXRob2RfdHlwZS5odG1sI28wIj5kc19fUmV0cmlldmFsTWV0aG9kVHlwZTo6VHJhbnNmb3JtczwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IHJlZmVyZW5jZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6VHJhbnNmb3Jtcy4gDQorPHA+DQorT3B0aW9uYWwgZWxlbWVudC4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9ImRzX19SZXRyaWV2YWxNZXRob2RUeXBlOjpUeXBlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3JldHJpZXZhbF9tZXRob2RfdHlwZS5odG1sI28yIj5kc19fUmV0cmlldmFsTWV0aG9kVHlwZTo6VHlwZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitPcHRpb25hbCBhdHRyaWJ1dGUuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJkc19fUmV0cmlldmFsTWV0aG9kVHlwZTo6VVJJIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3JldHJpZXZhbF9tZXRob2RfdHlwZS5odG1sI28xIj5kc19fUmV0cmlldmFsTWV0aG9kVHlwZTo6VVJJPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0F0dHJpYnV0ZSBVUkkgb2YgdHlwZSB4czphbnlVUkkuIA0KKzxwPg0KK09wdGlvbmFsIGF0dHJpYnV0ZS4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIHN0cnVjdCB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3dzc2UvPGEgY2xhc3M9ImVsIiBocmVmPSJkc184aC5odG1sIj5kcy5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIEZyaSBBdWcgMTkgMTA6NDE6NDYgMjAwNSBmb3IgZ1NPQVAgV1MtU2VjdXJpdHkgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3JldHJpZXZhbF9tZXRob2RfdHlwZV9fY29sbF9fZ3JhcGgubWFwIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fcmV0cmlldmFsX21ldGhvZF90eXBlX19jb2xsX19ncmFwaC5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjllYTlkNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3JldHJpZXZhbF9tZXRob2RfdHlwZV9fY29sbF9fZ3JhcGgubWFwCkBAIC0wLDAgKzEsNCBAQAorYmFzZSByZWZlcmVyCityZWN0ICRzdHJ1Y3Rkc19fX19fdHJhbnNmb3Jtc190eXBlLmh0bWwgMzcsMTk5IDE3MCwyMjUKK3JlY3QgJHN0cnVjdGRzX19fX190cmFuc2Zvcm1fdHlwZS5odG1sIDQwLDEwOCAxNjgsMTM1CityZWN0ICRzdHJ1Y3RfX2MxNG5fX19fX2luY2x1c2l2ZV9uYW1lc3BhY2VzLmh0bWwgNiwxNyAyMDEsNDQKZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3JldHJpZXZhbF9tZXRob2RfdHlwZV9fY29sbF9fZ3JhcGgubWQ1IGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fcmV0cmlldmFsX21ldGhvZF90eXBlX19jb2xsX19ncmFwaC5tZDUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNjNTNjYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3JldHJpZXZhbF9tZXRob2RfdHlwZV9fY29sbF9fZ3JhcGgubWQ1CkBAIC0wLDAgKzEgQEAKKzg2ZmZmN2U1M2Q4ZjM5YzdiMmQ1N2Q4Yzk4ZmVjZDAwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fcmV0cmlldmFsX21ldGhvZF90eXBlX19jb2xsX19ncmFwaC5wbmcgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19yZXRyaWV2YWxfbWV0aG9kX3R5cGVfX2NvbGxfX2dyYXBoLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTBkZWY2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fcmV0cmlldmFsX21ldGhvZF90eXBlX19jb2xsX19ncmFwaC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fc2lnbmF0dXJlX21ldGhvZF90eXBlLW1lbWJlcnMuaHRtbCBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3NpZ25hdHVyZV9tZXRob2RfdHlwZS1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRkOGQzYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3NpZ25hdHVyZV9tZXRob2RfdHlwZS1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwxNSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgV1MtU2VjdXJpdHk6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPmRzX19TaWduYXR1cmVNZXRob2RUeXBlIE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25hdHVyZV9tZXRob2RfdHlwZS5odG1sIj5kc19fU2lnbmF0dXJlTWV0aG9kVHlwZTwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmF0dXJlX21ldGhvZF90eXBlLmh0bWwjbzEiPkFsZ29yaXRobTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduYXR1cmVfbWV0aG9kX3R5cGUuaHRtbCI+ZHNfX1NpZ25hdHVyZU1ldGhvZFR5cGU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmF0dXJlX21ldGhvZF90eXBlLmh0bWwjbzAiPkhNQUNPdXRwdXRMZW5ndGg8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmF0dXJlX21ldGhvZF90eXBlLmh0bWwiPmRzX19TaWduYXR1cmVNZXRob2RUeXBlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBGcmkgQXVnIDE5IDEwOjQxOjQ2IDIwMDUgZm9yIGdTT0FQIFdTLVNlY3VyaXR5IGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19zaWduYXR1cmVfbWV0aG9kX3R5cGUuaHRtbCBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3NpZ25hdHVyZV9tZXRob2RfdHlwZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1N2MyY2YKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19zaWduYXR1cmVfbWV0aG9kX3R5cGUuaHRtbApAQCAtMCwwICsxLDgzIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBXUy1TZWN1cml0eTogZHNfX1NpZ25hdHVyZU1ldGhvZFR5cGUgU3RydWN0IFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT5kc19fU2lnbmF0dXJlTWV0aG9kVHlwZSBTdHJ1Y3QgUmVmZXJlbmNlPC9oMT4iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6U2lnbmF0dXJlTWV0aG9kVHlwZSBpcyBhIGNvbXBsZXhUeXBlLiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KKzxjb2RlPiNpbmNsdWRlICZsdDtkcy5oJmd0OzwvY29kZT4NCis8cD4NCis8YSBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmF0dXJlX21ldGhvZF90eXBlLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduYXR1cmVfbWV0aG9kX3R5cGUuaHRtbCNvMCI+SE1BQ091dHB1dExlbmd0aDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+RWxlbWVudCBITUFDT3V0cHV0TGVuZ3RoIG9mIHR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOkhNQUNPdXRwdXRMZW5ndGhUeXBlLiAgPGEgaHJlZj0iI28wIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduYXR1cmVfbWV0aG9kX3R5cGUuaHRtbCNvMSI+QWxnb3JpdGhtPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5SZXF1aXJlZCBhdHRyaWJ1dGUuICA8YSBocmVmPSIjbzEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzwvdGFibGU+DQorPGhyPjxhIG5hbWU9Il9kZXRhaWxzIj48L2E+PGgyPkRldGFpbGVkIERlc2NyaXB0aW9uPC9oMj4NCisiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6U2lnbmF0dXJlTWV0aG9kVHlwZSBpcyBhIGNvbXBsZXhUeXBlLiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJkc19fU2lnbmF0dXJlTWV0aG9kVHlwZTo6QWxnb3JpdGhtIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25hdHVyZV9tZXRob2RfdHlwZS5odG1sI28xIj5kc19fU2lnbmF0dXJlTWV0aG9kVHlwZTo6QWxnb3JpdGhtPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1JlcXVpcmVkIGF0dHJpYnV0ZS4gDQorPHA+DQorVE9ETzogJmx0O2FueSBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbm9jY3Vycz0iMCIgbWF4b2NjdXJzPSJ1bmJvdW5kZWQiJmd0OyBTY2hlbWEgZXh0ZW5zaWJpbGl0eSBpcyB1c2VyLWRlZmluYWJsZS4gQ29uc3VsdCB0aGUgcHJvdG9jb2wgZG9jdW1lbnRhdGlvbiB0byBjaGFuZ2UgYW5kL29yIGluc2VydCBkZWNsYXJhdGlvbnMuIFVzZSB3c2RsMmggb3B0aW9uIC14IHRvIHJlbW92ZSB0aGlzIGVsZW1lbnQuIEF0dHJpYnV0ZSBBbGdvcml0aG0gb2YgdHlwZSB4czphbnlVUkkuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJkc19fU2lnbmF0dXJlTWV0aG9kVHlwZTo6SE1BQ091dHB1dExlbmd0aCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25hdHVyZV9tZXRob2RfdHlwZS5odG1sI28wIj5kc19fU2lnbmF0dXJlTWV0aG9kVHlwZTo6SE1BQ091dHB1dExlbmd0aDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IEhNQUNPdXRwdXRMZW5ndGggb2YgdHlwZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6SE1BQ091dHB1dExlbmd0aFR5cGUuIA0KKzxwPg0KK09wdGlvbmFsIGVsZW1lbnQuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBzdHJ1Y3Qgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy93c3NlLzxhIGNsYXNzPSJlbCIgaHJlZj0iZHNfOGguaHRtbCI+ZHMuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBGcmkgQXVnIDE5IDEwOjQxOjQ2IDIwMDUgZm9yIGdTT0FQIFdTLVNlY3VyaXR5IGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19zaWduYXR1cmVfdHlwZS1tZW1iZXJzLmh0bWwgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19zaWduYXR1cmVfdHlwZS1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYzZGM2NAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3NpZ25hdHVyZV90eXBlLW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDE3IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBXUy1TZWN1cml0eTogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+ZHNfX1NpZ25hdHVyZVR5cGUgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmF0dXJlX3R5cGUuaHRtbCI+ZHNfX1NpZ25hdHVyZVR5cGU8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25hdHVyZV90eXBlLmh0bWwjbzMiPklkPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25hdHVyZV90eXBlLmh0bWwiPmRzX19TaWduYXR1cmVUeXBlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25hdHVyZV90eXBlLmh0bWwjbzIiPktleUluZm88L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmF0dXJlX3R5cGUuaHRtbCI+ZHNfX1NpZ25hdHVyZVR5cGU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmF0dXJlX3R5cGUuaHRtbCNvMSI+U2lnbmF0dXJlVmFsdWU8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmF0dXJlX3R5cGUuaHRtbCI+ZHNfX1NpZ25hdHVyZVR5cGU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmF0dXJlX3R5cGUuaHRtbCNvMCI+U2lnbmVkSW5mbzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduYXR1cmVfdHlwZS5odG1sIj5kc19fU2lnbmF0dXJlVHlwZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gRnJpIEF1ZyAxOSAxMDo0MTo0NiAyMDA1IGZvciBnU09BUCBXUy1TZWN1cml0eSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fc2lnbmF0dXJlX3R5cGUuaHRtbCBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3NpZ25hdHVyZV90eXBlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY0MGMxZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3NpZ25hdHVyZV90eXBlLmh0bWwKQEAgLTAsMCArMSwxMzIgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFdTLVNlY3VyaXR5OiBkc19fU2lnbmF0dXJlVHlwZSBTdHJ1Y3QgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPmRzX19TaWduYXR1cmVUeXBlIFN0cnVjdCBSZWZlcmVuY2U8L2gxPkltcG9ydGVkIGNvbXBsZXhUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpTaWduYXR1cmVUeXBlIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7ZHMuaCZndDs8L2NvZGU+DQorPHA+DQorQ29sbGFib3JhdGlvbiBkaWFncmFtIGZvciBkc19fU2lnbmF0dXJlVHlwZTo8cD48Y2VudGVyPjxpbWcgc3JjPSJzdHJ1Y3Rkc19fX19fc2lnbmF0dXJlX3R5cGVfX2NvbGxfX2dyYXBoLnBuZyIgYm9yZGVyPSIwIiB1c2VtYXA9IiNkc19fX19fc2lnbmF0dXJlX3R5cGVfX2NvbGxfX21hcCIgYWx0PSJDb2xsYWJvcmF0aW9uIGdyYXBoIj48L2NlbnRlcj4NCis8bWFwIG5hbWU9ImRzX19fX19zaWduYXR1cmVfdHlwZV9fY29sbF9fbWFwIj4NCis8YXJlYSBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmVkX2luZm9fdHlwZS5odG1sIiBzaGFwZT0icmVjdCIgY29vcmRzPSI3LDE3LDE0MCw0NCIgYWx0PSIiPg0KKzxhcmVhIGhyZWY9InN0cnVjdGRzX19fX19rZXlfaW5mb190eXBlLmh0bWwiIHNoYXBlPSJyZWN0IiBjb29yZHM9IjE2NCwxNywyNzksNDQiIGFsdD0iIj4NCis8L21hcD4NCis8Y2VudGVyPjxmb250IHNpemU9IjIiPls8YSBocmVmPSJncmFwaF9sZWdlbmQuaHRtbCI+bGVnZW5kPC9hPl08L2ZvbnQ+PC9jZW50ZXI+PGEgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25hdHVyZV90eXBlLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGUuaHRtbCI+ZHNfX1NpZ25lZEluZm9UeXBlPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduYXR1cmVfdHlwZS5odG1sI28wIj5TaWduZWRJbmZvPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduYXR1cmVfdHlwZS5odG1sI28xIj5TaWduYXR1cmVWYWx1ZTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2tleV9pbmZvX3R5cGUuaHRtbCI+ZHNfX0tleUluZm9UeXBlPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduYXR1cmVfdHlwZS5odG1sI28yIj5LZXlJbmZvPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduYXR1cmVfdHlwZS5odG1sI28zIj5JZDwvYT48L3RkPjwvdHI+DQorDQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK0ltcG9ydGVkIGNvbXBsZXhUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpTaWduYXR1cmVUeXBlIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4gDQorPHA+DQorPGhyPjxoMj5NZW1iZXIgRGF0YSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMyIgZG94eXRhZz0iZHNfX1NpZ25hdHVyZVR5cGU6OklkIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25hdHVyZV90eXBlLmh0bWwjbzMiPmRzX19TaWduYXR1cmVUeXBlOjpJZDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMiIgZG94eXRhZz0iZHNfX1NpZ25hdHVyZVR5cGU6OktleUluZm8iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2tleV9pbmZvX3R5cGUuaHRtbCI+ZHNfX0tleUluZm9UeXBlPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmF0dXJlX3R5cGUuaHRtbCNvMiI+ZHNfX1NpZ25hdHVyZVR5cGU6OktleUluZm88L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9ImRzX19TaWduYXR1cmVUeXBlOjpTaWduYXR1cmVWYWx1ZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduYXR1cmVfdHlwZS5odG1sI28xIj5kc19fU2lnbmF0dXJlVHlwZTo6U2lnbmF0dXJlVmFsdWU8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9ImRzX19TaWduYXR1cmVUeXBlOjpTaWduZWRJbmZvIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduZWRfaW5mb190eXBlLmh0bWwiPmRzX19TaWduZWRJbmZvVHlwZTwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25hdHVyZV90eXBlLmh0bWwjbzAiPmRzX19TaWduYXR1cmVUeXBlOjpTaWduZWRJbmZvPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBzdHJ1Y3Qgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy93c3NlLzxhIGNsYXNzPSJlbCIgaHJlZj0iZHNfOGguaHRtbCI+ZHMuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBGcmkgQXVnIDE5IDEwOjQxOjQ2IDIwMDUgZm9yIGdTT0FQIFdTLVNlY3VyaXR5IGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19zaWduYXR1cmVfdHlwZV9fY29sbF9fZ3JhcGgubWFwIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fc2lnbmF0dXJlX3R5cGVfX2NvbGxfX2dyYXBoLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjhhYzE3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fc2lnbmF0dXJlX3R5cGVfX2NvbGxfX2dyYXBoLm1hcApAQCAtMCwwICsxLDMgQEAKK2Jhc2UgcmVmZXJlcgorcmVjdCAkc3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGUuaHRtbCA3LDE3IDE0MCw0NAorcmVjdCAkc3RydWN0ZHNfX19fX2tleV9pbmZvX3R5cGUuaHRtbCAxNjQsMTcgMjc5LDQ0CmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19zaWduYXR1cmVfdHlwZV9fY29sbF9fZ3JhcGgubWQ1IGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fc2lnbmF0dXJlX3R5cGVfX2NvbGxfX2dyYXBoLm1kNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2Y3NGMzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fc2lnbmF0dXJlX3R5cGVfX2NvbGxfX2dyYXBoLm1kNQpAQCAtMCwwICsxIEBACis1MTc2ZmJjM2FkZjJhMTNkOWFkZDg4NzFkM2E5MDQwOApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3NpZ25hdHVyZV90eXBlX19jb2xsX19ncmFwaC5wbmcgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19zaWduYXR1cmVfdHlwZV9fY29sbF9fZ3JhcGgucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMDA2YWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19zaWduYXR1cmVfdHlwZV9fY29sbF9fZ3JhcGgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGUtbWVtYmVycy5odG1sIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fc2lnbmVkX2luZm9fdHlwZS1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTliOTMyOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGUtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTggQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFdTLVNlY3VyaXR5OiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT5kc19fU2lnbmVkSW5mb1R5cGUgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmVkX2luZm9fdHlwZS5odG1sIj5kc19fU2lnbmVkSW5mb1R5cGU8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGUuaHRtbCNvMiI+X19zaXplUmVmZXJlbmNlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGUuaHRtbCI+ZHNfX1NpZ25lZEluZm9UeXBlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGUuaHRtbCNvMCI+Q2Fub25pY2FsaXphdGlvbk1ldGhvZDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduZWRfaW5mb190eXBlLmh0bWwiPmRzX19TaWduZWRJbmZvVHlwZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduZWRfaW5mb190eXBlLmh0bWwjbzQiPklkPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGUuaHRtbCI+ZHNfX1NpZ25lZEluZm9UeXBlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGUuaHRtbCNvMyI+UmVmZXJlbmNlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGUuaHRtbCI+ZHNfX1NpZ25lZEluZm9UeXBlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGUuaHRtbCNvMSI+U2lnbmF0dXJlTWV0aG9kPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGUuaHRtbCI+ZHNfX1NpZ25lZEluZm9UeXBlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBGcmkgQXVnIDE5IDEwOjQxOjQ2IDIwMDUgZm9yIGdTT0FQIFdTLVNlY3VyaXR5IGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19zaWduZWRfaW5mb190eXBlLmh0bWwgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19zaWduZWRfaW5mb190eXBlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRlZmI2YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGUuaHRtbApAQCAtMCwwICsxLDE3OSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgV1MtU2VjdXJpdHk6IGRzX19TaWduZWRJbmZvVHlwZSBTdHJ1Y3QgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPmRzX19TaWduZWRJbmZvVHlwZSBTdHJ1Y3QgUmVmZXJlbmNlPC9oMT4iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6U2lnbmVkSW5mb1R5cGUgaXMgYSBjb21wbGV4VHlwZS4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7ZHMuaCZndDs8L2NvZGU+DQorPHA+DQorQ29sbGFib3JhdGlvbiBkaWFncmFtIGZvciBkc19fU2lnbmVkSW5mb1R5cGU6PHA+PGNlbnRlcj48aW1nIHNyYz0ic3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGVfX2NvbGxfX2dyYXBoLnBuZyIgYm9yZGVyPSIwIiB1c2VtYXA9IiNkc19fX19fc2lnbmVkX2luZm9fdHlwZV9fY29sbF9fbWFwIiBhbHQ9IkNvbGxhYm9yYXRpb24gZ3JhcGgiPjwvY2VudGVyPg0KKzxtYXAgbmFtZT0iZHNfX19fX3NpZ25lZF9pbmZvX3R5cGVfX2NvbGxfX21hcCI+DQorPGFyZWEgaHJlZj0ic3RydWN0ZHNfX19fX3JlZmVyZW5jZV90eXBlLmh0bWwiIHNoYXBlPSJyZWN0IiBjb29yZHM9IjE4NCwzMDAsMzE0LDMyNiIgYWx0PSIiPg0KKzxhcmVhIGhyZWY9InN0cnVjdGRzX19fX19kaWdlc3RfbWV0aG9kX3R5cGUuaHRtbCIgc2hhcGU9InJlY3QiIGNvb3Jkcz0iNiwyMDksMTU4LDIzNiIgYWx0PSIiPg0KKzxhcmVhIGhyZWY9InN0cnVjdGRzX19fX190cmFuc2Zvcm1zX3R5cGUuaHRtbCIgc2hhcGU9InJlY3QiIGNvb3Jkcz0iMTgyLDIwOSwzMTYsMjM2IiBhbHQ9IiI+DQorPGFyZWEgaHJlZj0ic3RydWN0ZHNfX19fX3RyYW5zZm9ybV90eXBlLmh0bWwiIHNoYXBlPSJyZWN0IiBjb29yZHM9IjE2OCwxMDgsMjk2LDEzNCIgYWx0PSIiPg0KKzxhcmVhIGhyZWY9InN0cnVjdF9fYzE0bl9fX19faW5jbHVzaXZlX25hbWVzcGFjZXMuaHRtbCIgc2hhcGU9InJlY3QiIGNvb3Jkcz0iMjQyLDE3LDQzNyw0NCIgYWx0PSIiPg0KKzxhcmVhIGhyZWY9InN0cnVjdGRzX19fX19jYW5vbmljYWxpemF0aW9uX21ldGhvZF90eXBlLmh0bWwiIHNoYXBlPSJyZWN0IiBjb29yZHM9IjM0MCwxNTgsNTUwLDE4NSIgYWx0PSIiPg0KKzxhcmVhIGhyZWY9InN0cnVjdGRzX19fX19zaWduYXR1cmVfbWV0aG9kX3R5cGUuaHRtbCIgc2hhcGU9InJlY3QiIGNvb3Jkcz0iNDU0LDMwMCw2MjUsMzI2IiBhbHQ9IiI+DQorPC9tYXA+DQorPGNlbnRlcj48Zm9udCBzaXplPSIyIj5bPGEgaHJlZj0iZ3JhcGhfbGVnZW5kLmh0bWwiPmxlZ2VuZDwvYT5dPC9mb250PjwvY2VudGVyPjxhIGhyZWY9InN0cnVjdGRzX19fX19zaWduZWRfaW5mb190eXBlLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2Nhbm9uaWNhbGl6YXRpb25fbWV0aG9kX3R5cGUuaHRtbCI+ZHNfX0Nhbm9uaWNhbGl6YXRpb25NZXRob2RUeXBlPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduZWRfaW5mb190eXBlLmh0bWwjbzAiPkNhbm9uaWNhbGl6YXRpb25NZXRob2Q8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkVsZW1lbnQgcmVmZXJlbmNlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpDYW5vbmljYWxpemF0aW9uTWV0aG9kLiAgPGEgaHJlZj0iI28wIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmF0dXJlX21ldGhvZF90eXBlLmh0bWwiPmRzX19TaWduYXR1cmVNZXRob2RUeXBlPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduZWRfaW5mb190eXBlLmh0bWwjbzEiPlNpZ25hdHVyZU1ldGhvZDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+RWxlbWVudCByZWZlcmVuY2UgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlNpZ25hdHVyZU1ldGhvZC4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmVkX2luZm9fdHlwZS5odG1sI28yIj5fX3NpemVSZWZlcmVuY2U8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlNpemUgb2YgdGhlIGR5bmFtaWMgYXJyYXkgb2Ygc3RydWN0IGRzX19SZWZlcmVuY2VUeXBlKiBpcyAwLi51bmJvdW5kZWQuICA8YSBocmVmPSIjbzIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19yZWZlcmVuY2VfdHlwZS5odG1sIj5kc19fUmVmZXJlbmNlVHlwZTwvYT4gKiombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGUuaHRtbCNvMyI+UmVmZXJlbmNlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5Qb2ludGVyIHRvIGFycmF5IG9mIHN0cnVjdCBkc19fUmVmZXJlbmNlVHlwZSouICA8YSBocmVmPSIjbzMiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGUuaHRtbCNvNCI+SWQ8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPk9wdGlvbmFsIGF0dHJpYnV0ZS4gIDxhIGhyZWY9IiNvNCI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KKyJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpTaWduZWRJbmZvVHlwZSBpcyBhIGNvbXBsZXhUeXBlLiANCis8cD4NCitJbXBvcnRlZCBzaW1wbGVUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpITUFDT3V0cHV0TGVuZ3RoVHlwZSBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuIHNpbXBsZVR5cGUgZGVmaW5pdGlvbiBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsuIA0KKzxwPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9ImRzX19TaWduZWRJbmZvVHlwZTo6X19zaXplUmVmZXJlbmNlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduZWRfaW5mb190eXBlLmh0bWwjbzIiPmRzX19TaWduZWRJbmZvVHlwZTo6X19zaXplUmVmZXJlbmNlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1NpemUgb2YgdGhlIGR5bmFtaWMgYXJyYXkgb2Ygc3RydWN0IGRzX19SZWZlcmVuY2VUeXBlKiBpcyAwLi51bmJvdW5kZWQuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJkc19fU2lnbmVkSW5mb1R5cGU6OkNhbm9uaWNhbGl6YXRpb25NZXRob2QiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2Nhbm9uaWNhbGl6YXRpb25fbWV0aG9kX3R5cGUuaHRtbCI+ZHNfX0Nhbm9uaWNhbGl6YXRpb25NZXRob2RUeXBlPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmVkX2luZm9fdHlwZS5odG1sI28wIj5kc19fU2lnbmVkSW5mb1R5cGU6OkNhbm9uaWNhbGl6YXRpb25NZXRob2Q8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorRWxlbWVudCByZWZlcmVuY2UgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOkNhbm9uaWNhbGl6YXRpb25NZXRob2QuIA0KKzxwPg0KK1JlcXVpcmVkIGVsZW1lbnQuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im80IiBkb3h5dGFnPSJkc19fU2lnbmVkSW5mb1R5cGU6OklkIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGUuaHRtbCNvNCI+ZHNfX1NpZ25lZEluZm9UeXBlOjpJZDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitPcHRpb25hbCBhdHRyaWJ1dGUuIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8zIiBkb3h5dGFnPSJkc19fU2lnbmVkSW5mb1R5cGU6OlJlZmVyZW5jZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fcmVmZXJlbmNlX3R5cGUuaHRtbCI+ZHNfX1JlZmVyZW5jZVR5cGU8L2E+KiAqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGUuaHRtbCNvMyI+ZHNfX1NpZ25lZEluZm9UeXBlOjpSZWZlcmVuY2U8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorUG9pbnRlciB0byBhcnJheSBvZiBzdHJ1Y3QgZHNfX1JlZmVyZW5jZVR5cGUqLiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0iZHNfX1NpZ25lZEluZm9UeXBlOjpTaWduYXR1cmVNZXRob2QiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25hdHVyZV9tZXRob2RfdHlwZS5odG1sIj5kc19fU2lnbmF0dXJlTWV0aG9kVHlwZTwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGUuaHRtbCNvMSI+ZHNfX1NpZ25lZEluZm9UeXBlOjpTaWduYXR1cmVNZXRob2Q8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorRWxlbWVudCByZWZlcmVuY2UgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlNpZ25hdHVyZU1ldGhvZC4gDQorPHA+DQorUmVxdWlyZWQgZWxlbWVudC4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIHN0cnVjdCB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3dzc2UvPGEgY2xhc3M9ImVsIiBocmVmPSJkc184aC5odG1sIj5kcy5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIEZyaSBBdWcgMTkgMTA6NDE6NDYgMjAwNSBmb3IgZ1NPQVAgV1MtU2VjdXJpdHkgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGVfX2NvbGxfX2dyYXBoLm1hcCBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGVfX2NvbGxfX2dyYXBoLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjIzNThlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fc2lnbmVkX2luZm9fdHlwZV9fY29sbF9fZ3JhcGgubWFwCkBAIC0wLDAgKzEsOCBAQAorYmFzZSByZWZlcmVyCityZWN0ICRzdHJ1Y3Rkc19fX19fcmVmZXJlbmNlX3R5cGUuaHRtbCAxODQsMzAwIDMxNCwzMjYKK3JlY3QgJHN0cnVjdGRzX19fX19kaWdlc3RfbWV0aG9kX3R5cGUuaHRtbCA2LDIwOSAxNTgsMjM2CityZWN0ICRzdHJ1Y3Rkc19fX19fdHJhbnNmb3Jtc190eXBlLmh0bWwgMTgyLDIwOSAzMTYsMjM2CityZWN0ICRzdHJ1Y3Rkc19fX19fdHJhbnNmb3JtX3R5cGUuaHRtbCAxNjgsMTA4IDI5NiwxMzQKK3JlY3QgJHN0cnVjdF9fYzE0bl9fX19faW5jbHVzaXZlX25hbWVzcGFjZXMuaHRtbCAyNDIsMTcgNDM3LDQ0CityZWN0ICRzdHJ1Y3Rkc19fX19fY2Fub25pY2FsaXphdGlvbl9tZXRob2RfdHlwZS5odG1sIDM0MCwxNTggNTUwLDE4NQorcmVjdCAkc3RydWN0ZHNfX19fX3NpZ25hdHVyZV9tZXRob2RfdHlwZS5odG1sIDQ1NCwzMDAgNjI1LDMyNgpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fc2lnbmVkX2luZm9fdHlwZV9fY29sbF9fZ3JhcGgubWQ1IGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fc2lnbmVkX2luZm9fdHlwZV9fY29sbF9fZ3JhcGgubWQ1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MGQ2ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19zaWduZWRfaW5mb190eXBlX19jb2xsX19ncmFwaC5tZDUKQEAgLTAsMCArMSBAQAorYjkwYjI4NTc0NGMxZWYzNjQ1YWZiODUxOWExZWQxYzIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19zaWduZWRfaW5mb190eXBlX19jb2xsX19ncmFwaC5wbmcgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX19zaWduZWRfaW5mb190eXBlX19jb2xsX19ncmFwaC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc2Mjc4ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGVfX2NvbGxfX2dyYXBoLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX190cmFuc2Zvcm1fdHlwZS1tZW1iZXJzLmh0bWwgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX190cmFuc2Zvcm1fdHlwZS1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg1MDY1YgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3RyYW5zZm9ybV90eXBlLW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDE2IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBXUy1TZWN1cml0eTogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+ZHNfX1RyYW5zZm9ybVR5cGUgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fdHJhbnNmb3JtX3R5cGUuaHRtbCI+ZHNfX1RyYW5zZm9ybVR5cGU8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3RyYW5zZm9ybV90eXBlLmh0bWwjbzEiPl9fYW55PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3RyYW5zZm9ybV90eXBlLmh0bWwiPmRzX19UcmFuc2Zvcm1UeXBlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3RyYW5zZm9ybV90eXBlLmh0bWwjbzIiPkFsZ29yaXRobTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX190cmFuc2Zvcm1fdHlwZS5odG1sIj5kc19fVHJhbnNmb3JtVHlwZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX190cmFuc2Zvcm1fdHlwZS5odG1sI28wIj5jMTRuX19JbmNsdXNpdmVOYW1lc3BhY2VzPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3RyYW5zZm9ybV90eXBlLmh0bWwiPmRzX19UcmFuc2Zvcm1UeXBlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBGcmkgQXVnIDE5IDEwOjQxOjQ2IDIwMDUgZm9yIGdTT0FQIFdTLVNlY3VyaXR5IGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX190cmFuc2Zvcm1fdHlwZS5odG1sIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fdHJhbnNmb3JtX3R5cGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTk0MGIwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fdHJhbnNmb3JtX3R5cGUuaHRtbApAQCAtMCwwICsxLDEwNiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgV1MtU2VjdXJpdHk6IGRzX19UcmFuc2Zvcm1UeXBlIFN0cnVjdCBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+ZHNfX1RyYW5zZm9ybVR5cGUgU3RydWN0IFJlZmVyZW5jZTwvaDE+SW1wb3J0ZWQgY29tcGxleFR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlRyYW5zZm9ybVR5cGUgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KKzxjb2RlPiNpbmNsdWRlICZsdDtkcy5oJmd0OzwvY29kZT4NCis8cD4NCitDb2xsYWJvcmF0aW9uIGRpYWdyYW0gZm9yIGRzX19UcmFuc2Zvcm1UeXBlOjxwPjxjZW50ZXI+PGltZyBzcmM9InN0cnVjdGRzX19fX190cmFuc2Zvcm1fdHlwZV9fY29sbF9fZ3JhcGgucG5nIiBib3JkZXI9IjAiIHVzZW1hcD0iI2RzX19fX190cmFuc2Zvcm1fdHlwZV9fY29sbF9fbWFwIiBhbHQ9IkNvbGxhYm9yYXRpb24gZ3JhcGgiPjwvY2VudGVyPg0KKzxtYXAgbmFtZT0iZHNfX19fX3RyYW5zZm9ybV90eXBlX19jb2xsX19tYXAiPg0KKzxhcmVhIGhyZWY9InN0cnVjdF9fYzE0bl9fX19faW5jbHVzaXZlX25hbWVzcGFjZXMuaHRtbCIgc2hhcGU9InJlY3QiIGNvb3Jkcz0iNiwxNywyMDEsNDQiIGFsdD0iIj4NCis8L21hcD4NCis8Y2VudGVyPjxmb250IHNpemU9IjIiPls8YSBocmVmPSJncmFwaF9sZWdlbmQuaHRtbCI+bGVnZW5kPC9hPl08L2ZvbnQ+PC9jZW50ZXI+PGEgaHJlZj0ic3RydWN0ZHNfX19fX3RyYW5zZm9ybV90eXBlLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X19jMTRuX19fX19pbmNsdXNpdmVfbmFtZXNwYWNlcy5odG1sIj5fYzE0bl9fSW5jbHVzaXZlTmFtZXNwYWNlczwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fdHJhbnNmb3JtX3R5cGUuaHRtbCNvMCI+YzE0bl9fSW5jbHVzaXZlTmFtZXNwYWNlczwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPl9YTUwmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3RyYW5zZm9ybV90eXBlLmh0bWwjbzEiPl9fYW55PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX190cmFuc2Zvcm1fdHlwZS5odG1sI28yIj5BbGdvcml0aG08L2E+PC90ZD48L3RyPg0KKw0KKzwvdGFibGU+DQorPGhyPjxhIG5hbWU9Il9kZXRhaWxzIj48L2E+PGgyPkRldGFpbGVkIERlc2NyaXB0aW9uPC9oMj4NCitJbXBvcnRlZCBjb21wbGV4VHlwZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6VHJhbnNmb3JtVHlwZSBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuIA0KKzxwPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9ImRzX19UcmFuc2Zvcm1UeXBlOjpfX2FueSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBfWE1MIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3RyYW5zZm9ybV90eXBlLmh0bWwjbzEiPmRzX19UcmFuc2Zvcm1UeXBlOjpfX2FueTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMiIgZG94eXRhZz0iZHNfX1RyYW5zZm9ybVR5cGU6OkFsZ29yaXRobSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX190cmFuc2Zvcm1fdHlwZS5odG1sI28yIj5kc19fVHJhbnNmb3JtVHlwZTo6QWxnb3JpdGhtPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJkc19fVHJhbnNmb3JtVHlwZTo6YzE0bl9fSW5jbHVzaXZlTmFtZXNwYWNlcyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fYzE0bl9fX19faW5jbHVzaXZlX25hbWVzcGFjZXMuaHRtbCI+X2MxNG5fX0luY2x1c2l2ZU5hbWVzcGFjZXM8L2E+KiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX190cmFuc2Zvcm1fdHlwZS5odG1sI28wIj5kc19fVHJhbnNmb3JtVHlwZTo6YzE0bl9fSW5jbHVzaXZlTmFtZXNwYWNlczwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgc3RydWN0IHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2Mvd3NzZS88YSBjbGFzcz0iZWwiIGhyZWY9ImRzXzhoLmh0bWwiPmRzLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gRnJpIEF1ZyAxOSAxMDo0MTo0NiAyMDA1IGZvciBnU09BUCBXUy1TZWN1cml0eSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fdHJhbnNmb3JtX3R5cGVfX2NvbGxfX2dyYXBoLm1hcCBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3RyYW5zZm9ybV90eXBlX19jb2xsX19ncmFwaC5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY4NzRmYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3RyYW5zZm9ybV90eXBlX19jb2xsX19ncmFwaC5tYXAKQEAgLTAsMCArMSwyIEBACitiYXNlIHJlZmVyZXIKK3JlY3QgJHN0cnVjdF9fYzE0bl9fX19faW5jbHVzaXZlX25hbWVzcGFjZXMuaHRtbCA2LDE3IDIwMSw0NApkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fdHJhbnNmb3JtX3R5cGVfX2NvbGxfX2dyYXBoLm1kNSBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3RyYW5zZm9ybV90eXBlX19jb2xsX19ncmFwaC5tZDUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUwZWQ0YgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3RyYW5zZm9ybV90eXBlX19jb2xsX19ncmFwaC5tZDUKQEAgLTAsMCArMSBAQAorMTAzYWY0ZTZkMWRiNmEyOTM4YWI1MGJkZmE4OWMwZDcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX190cmFuc2Zvcm1fdHlwZV9fY29sbF9fZ3JhcGgucG5nIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fdHJhbnNmb3JtX3R5cGVfX2NvbGxfX2dyYXBoLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjFmMzU5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fdHJhbnNmb3JtX3R5cGVfX2NvbGxfX2dyYXBoLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX190cmFuc2Zvcm1zX3R5cGUtbWVtYmVycy5odG1sIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fdHJhbnNmb3Jtc190eXBlLW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGI4NGFiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fdHJhbnNmb3Jtc190eXBlLW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDE1IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBXUy1TZWN1cml0eTogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+ZHNfX1RyYW5zZm9ybXNUeXBlIE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3RyYW5zZm9ybXNfdHlwZS5odG1sIj5kc19fVHJhbnNmb3Jtc1R5cGU8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3RyYW5zZm9ybXNfdHlwZS5odG1sI28wIj5fX3NpemVUcmFuc2Zvcm08L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fdHJhbnNmb3Jtc190eXBlLmh0bWwiPmRzX19UcmFuc2Zvcm1zVHlwZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX190cmFuc2Zvcm1zX3R5cGUuaHRtbCNvMSI+VHJhbnNmb3JtPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3RyYW5zZm9ybXNfdHlwZS5odG1sIj5kc19fVHJhbnNmb3Jtc1R5cGU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIEZyaSBBdWcgMTkgMTA6NDE6NDYgMjAwNSBmb3IgZ1NPQVAgV1MtU2VjdXJpdHkgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3RyYW5zZm9ybXNfdHlwZS5odG1sIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fdHJhbnNmb3Jtc190eXBlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM2ODdlZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3RyYW5zZm9ybXNfdHlwZS5odG1sCkBAIC0wLDAgKzEsODggQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFdTLVNlY3VyaXR5OiBkc19fVHJhbnNmb3Jtc1R5cGUgU3RydWN0IFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT5kc19fVHJhbnNmb3Jtc1R5cGUgU3RydWN0IFJlZmVyZW5jZTwvaDE+Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlRyYW5zZm9ybXNUeXBlIGlzIGEgY29tcGxleFR5cGUuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O2RzLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KK0NvbGxhYm9yYXRpb24gZGlhZ3JhbSBmb3IgZHNfX1RyYW5zZm9ybXNUeXBlOjxwPjxjZW50ZXI+PGltZyBzcmM9InN0cnVjdGRzX19fX190cmFuc2Zvcm1zX3R5cGVfX2NvbGxfX2dyYXBoLnBuZyIgYm9yZGVyPSIwIiB1c2VtYXA9IiNkc19fX19fdHJhbnNmb3Jtc190eXBlX19jb2xsX19tYXAiIGFsdD0iQ29sbGFib3JhdGlvbiBncmFwaCI+PC9jZW50ZXI+DQorPG1hcCBuYW1lPSJkc19fX19fdHJhbnNmb3Jtc190eXBlX19jb2xsX19tYXAiPg0KKzxhcmVhIGhyZWY9InN0cnVjdGRzX19fX190cmFuc2Zvcm1fdHlwZS5odG1sIiBzaGFwZT0icmVjdCIgY29vcmRzPSI0MCwxMDgsMTY4LDEzNCIgYWx0PSIiPg0KKzxhcmVhIGhyZWY9InN0cnVjdF9fYzE0bl9fX19faW5jbHVzaXZlX25hbWVzcGFjZXMuaHRtbCIgc2hhcGU9InJlY3QiIGNvb3Jkcz0iNiwxNywyMDEsNDQiIGFsdD0iIj4NCis8L21hcD4NCis8Y2VudGVyPjxmb250IHNpemU9IjIiPls8YSBocmVmPSJncmFwaF9sZWdlbmQuaHRtbCI+bGVnZW5kPC9hPl08L2ZvbnQ+PC9jZW50ZXI+PGEgaHJlZj0ic3RydWN0ZHNfX19fX3RyYW5zZm9ybXNfdHlwZS1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgQXR0cmlidXRlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3RyYW5zZm9ybXNfdHlwZS5odG1sI28wIj5fX3NpemVUcmFuc2Zvcm08L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlNpemUgb2YgdGhlIGR5bmFtaWMgYXJyYXkgb2YgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fdHJhbnNmb3JtX3R5cGUuaHRtbCI+ZHNfX1RyYW5zZm9ybVR5cGU8L2E+IGlzIDAuLnVuYm91bmRlZC4gIDxhIGhyZWY9IiNvMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3RyYW5zZm9ybV90eXBlLmh0bWwiPmRzX19UcmFuc2Zvcm1UeXBlPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX190cmFuc2Zvcm1zX3R5cGUuaHRtbCNvMSI+VHJhbnNmb3JtPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5Qb2ludGVyIHRvIGFycmF5IG9mIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3RyYW5zZm9ybV90eXBlLmh0bWwiPmRzX19UcmFuc2Zvcm1UeXBlPC9hPi4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KKyJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpUcmFuc2Zvcm1zVHlwZSBpcyBhIGNvbXBsZXhUeXBlLiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJkc19fVHJhbnNmb3Jtc1R5cGU6Ol9fc2l6ZVRyYW5zZm9ybSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fdHJhbnNmb3Jtc190eXBlLmh0bWwjbzAiPmRzX19UcmFuc2Zvcm1zVHlwZTo6X19zaXplVHJhbnNmb3JtPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1NpemUgb2YgdGhlIGR5bmFtaWMgYXJyYXkgb2YgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fdHJhbnNmb3JtX3R5cGUuaHRtbCI+ZHNfX1RyYW5zZm9ybVR5cGU8L2E+IGlzIDAuLnVuYm91bmRlZC4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9ImRzX19UcmFuc2Zvcm1zVHlwZTo6VHJhbnNmb3JtIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3RyYW5zZm9ybV90eXBlLmh0bWwiPmRzX19UcmFuc2Zvcm1UeXBlPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fdHJhbnNmb3Jtc190eXBlLmh0bWwjbzEiPmRzX19UcmFuc2Zvcm1zVHlwZTo6VHJhbnNmb3JtPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1BvaW50ZXIgdG8gYXJyYXkgb2YgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fdHJhbnNmb3JtX3R5cGUuaHRtbCI+ZHNfX1RyYW5zZm9ybVR5cGU8L2E+LiANCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgc3RydWN0IHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2Mvd3NzZS88YSBjbGFzcz0iZWwiIGhyZWY9ImRzXzhoLmh0bWwiPmRzLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gRnJpIEF1ZyAxOSAxMDo0MTo0NiAyMDA1IGZvciBnU09BUCBXUy1TZWN1cml0eSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fdHJhbnNmb3Jtc190eXBlX19jb2xsX19ncmFwaC5tYXAgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX190cmFuc2Zvcm1zX3R5cGVfX2NvbGxfX2dyYXBoLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTEzMjBmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fdHJhbnNmb3Jtc190eXBlX19jb2xsX19ncmFwaC5tYXAKQEAgLTAsMCArMSwzIEBACitiYXNlIHJlZmVyZXIKK3JlY3QgJHN0cnVjdGRzX19fX190cmFuc2Zvcm1fdHlwZS5odG1sIDQwLDEwOCAxNjgsMTM0CityZWN0ICRzdHJ1Y3RfX2MxNG5fX19fX2luY2x1c2l2ZV9uYW1lc3BhY2VzLmh0bWwgNiwxNyAyMDEsNDQKZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3RyYW5zZm9ybXNfdHlwZV9fY29sbF9fZ3JhcGgubWQ1IGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fdHJhbnNmb3Jtc190eXBlX19jb2xsX19ncmFwaC5tZDUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI5NzBlNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3RyYW5zZm9ybXNfdHlwZV9fY29sbF9fZ3JhcGgubWQ1CkBAIC0wLDAgKzEgQEAKK2M5ZDlmZjVhMTJmNzQ5NGE3YTYwNTU5MGU5MmE5MjAwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fdHJhbnNmb3Jtc190eXBlX19jb2xsX19ncmFwaC5wbmcgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX190cmFuc2Zvcm1zX3R5cGVfX2NvbGxfX2dyYXBoLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWU2YTllCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19fdHJhbnNmb3Jtc190eXBlX19jb2xsX19ncmFwaC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19feDUwOV9kYXRhX3R5cGUtbWVtYmVycy5odG1sIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19feDUwOV9kYXRhX3R5cGUtbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MmFhMGMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX194NTA5X2RhdGFfdHlwZS1tZW1iZXJzLmh0bWwKQEAgLTAsMCArMSwxOCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgV1MtU2VjdXJpdHk6IE1lbWJlciBMaXN0PC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPmRzX19YNTA5RGF0YVR5cGUgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19feDUwOV9kYXRhX3R5cGUuaHRtbCI+ZHNfX1g1MDlEYXRhVHlwZTwvYT4sIGluY2x1ZGluZyBhbGwgaW5oZXJpdGVkIG1lbWJlcnMuPHA+PHRhYmxlPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19feDUwOV9kYXRhX3R5cGUuaHRtbCNvMyI+WDUwOUNlcnRpZmljYXRlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3g1MDlfZGF0YV90eXBlLmh0bWwiPmRzX19YNTA5RGF0YVR5cGU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19feDUwOV9kYXRhX3R5cGUuaHRtbCNvNCI+WDUwOUNSTDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX194NTA5X2RhdGFfdHlwZS5odG1sIj5kc19fWDUwOURhdGFUeXBlPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3g1MDlfZGF0YV90eXBlLmh0bWwjbzAiPlg1MDlJc3N1ZXJTZXJpYWw8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19feDUwOV9kYXRhX3R5cGUuaHRtbCI+ZHNfX1g1MDlEYXRhVHlwZTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX194NTA5X2RhdGFfdHlwZS5odG1sI28xIj5YNTA5U0tJPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3g1MDlfZGF0YV90eXBlLmh0bWwiPmRzX19YNTA5RGF0YVR5cGU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19feDUwOV9kYXRhX3R5cGUuaHRtbCNvMiI+WDUwOVN1YmplY3ROYW1lPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3g1MDlfZGF0YV90eXBlLmh0bWwiPmRzX19YNTA5RGF0YVR5cGU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIEZyaSBBdWcgMTkgMTA6NDE6NDYgMjAwNSBmb3IgZ1NPQVAgV1MtU2VjdXJpdHkgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3g1MDlfZGF0YV90eXBlLmh0bWwgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX194NTA5X2RhdGFfdHlwZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMmZiNzMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX194NTA5X2RhdGFfdHlwZS5odG1sCkBAIC0wLDAgKzEsMTY4IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBXUy1TZWN1cml0eTogZHNfX1g1MDlEYXRhVHlwZSBTdHJ1Y3QgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPmRzX19YNTA5RGF0YVR5cGUgU3RydWN0IFJlZmVyZW5jZTwvaDE+Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlg1MDlEYXRhVHlwZSBpcyBhIGNvbXBsZXhUeXBlLiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KKzxjb2RlPiNpbmNsdWRlICZsdDtkcy5oJmd0OzwvY29kZT4NCis8cD4NCitDb2xsYWJvcmF0aW9uIGRpYWdyYW0gZm9yIGRzX19YNTA5RGF0YVR5cGU6PHA+PGNlbnRlcj48aW1nIHNyYz0ic3RydWN0ZHNfX19fX3g1MDlfZGF0YV90eXBlX19jb2xsX19ncmFwaC5wbmciIGJvcmRlcj0iMCIgdXNlbWFwPSIjZHNfX19fX3g1MDlfZGF0YV90eXBlX19jb2xsX19tYXAiIGFsdD0iQ29sbGFib3JhdGlvbiBncmFwaCI+PC9jZW50ZXI+DQorPG1hcCBuYW1lPSJkc19fX19feDUwOV9kYXRhX3R5cGVfX2NvbGxfX21hcCI+DQorPGFyZWEgaHJlZj0ic3RydWN0ZHNfX19fX3g1MDlfaXNzdWVyX3NlcmlhbF90eXBlLmh0bWwiIHNoYXBlPSJyZWN0IiBjb29yZHM9IjYsMTcsMTgwLDQ0IiBhbHQ9IiI+DQorPC9tYXA+DQorPGNlbnRlcj48Zm9udCBzaXplPSIyIj5bPGEgaHJlZj0iZ3JhcGhfbGVnZW5kLmh0bWwiPmxlZ2VuZDwvYT5dPC9mb250PjwvY2VudGVyPjxhIGhyZWY9InN0cnVjdGRzX19fX194NTA5X2RhdGFfdHlwZS1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgQXR0cmlidXRlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX194NTA5X2lzc3Vlcl9zZXJpYWxfdHlwZS5odG1sIj5kc19fWDUwOUlzc3VlclNlcmlhbFR5cGU8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3g1MDlfZGF0YV90eXBlLmh0bWwjbzAiPlg1MDlJc3N1ZXJTZXJpYWw8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3g1MDlfZGF0YV90eXBlLmh0bWwjbzEiPlg1MDlTS0k8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkVsZW1lbnQgWDUwOVNLSSBvZiB0eXBlIHhzOmJhc2U2NEJpbmFyeS4gIDxhIGhyZWY9IiNvMSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19feDUwOV9kYXRhX3R5cGUuaHRtbCNvMiI+WDUwOVN1YmplY3ROYW1lPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5FbGVtZW50IFg1MDlTdWJqZWN0TmFtZSBvZiB0eXBlIHhzOnN0cmluZy4gIDxhIGhyZWY9IiNvMiI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19feDUwOV9kYXRhX3R5cGUuaHRtbCNvMyI+WDUwOUNlcnRpZmljYXRlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5FbGVtZW50IFg1MDlDZXJ0aWZpY2F0ZSBvZiB0eXBlIHhzOmJhc2U2NEJpbmFyeS4gIDxhIGhyZWY9IiNvMyI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19feDUwOV9kYXRhX3R5cGUuaHRtbCNvNCI+WDUwOUNSTDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+RWxlbWVudCBYNTA5Q1JMIG9mIHR5cGUgeHM6YmFzZTY0QmluYXJ5LiAgPGEgaHJlZj0iI280Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzxocj48YSBuYW1lPSJfZGV0YWlscyI+PC9hPjxoMj5EZXRhaWxlZCBEZXNjcmlwdGlvbjwvaDI+DQorImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlg1MDlEYXRhVHlwZSBpcyBhIGNvbXBsZXhUeXBlLiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8zIiBkb3h5dGFnPSJkc19fWDUwOURhdGFUeXBlOjpYNTA5Q2VydGlmaWNhdGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19feDUwOV9kYXRhX3R5cGUuaHRtbCNvMyI+ZHNfX1g1MDlEYXRhVHlwZTo6WDUwOUNlcnRpZmljYXRlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0VsZW1lbnQgWDUwOUNlcnRpZmljYXRlIG9mIHR5cGUgeHM6YmFzZTY0QmluYXJ5LiANCis8cD4NCitSZXF1aXJlZCBlbGVtZW50LiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNCIgZG94eXRhZz0iZHNfX1g1MDlEYXRhVHlwZTo6WDUwOUNSTCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX194NTA5X2RhdGFfdHlwZS5odG1sI280Ij5kc19fWDUwOURhdGFUeXBlOjpYNTA5Q1JMPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0VsZW1lbnQgWDUwOUNSTCBvZiB0eXBlIHhzOmJhc2U2NEJpbmFyeS4gDQorPHA+DQorUmVxdWlyZWQgZWxlbWVudC4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9ImRzX19YNTA5RGF0YVR5cGU6Olg1MDlJc3N1ZXJTZXJpYWwiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3g1MDlfaXNzdWVyX3NlcmlhbF90eXBlLmh0bWwiPmRzX19YNTA5SXNzdWVyU2VyaWFsVHlwZTwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3g1MDlfZGF0YV90eXBlLmh0bWwjbzAiPmRzX19YNTA5RGF0YVR5cGU6Olg1MDlJc3N1ZXJTZXJpYWw8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorUmVxdWlyZWQgZWxlbWVudC4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9ImRzX19YNTA5RGF0YVR5cGU6Olg1MDlTS0kiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19feDUwOV9kYXRhX3R5cGUuaHRtbCNvMSI+ZHNfX1g1MDlEYXRhVHlwZTo6WDUwOVNLSTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IFg1MDlTS0kgb2YgdHlwZSB4czpiYXNlNjRCaW5hcnkuIA0KKzxwPg0KK1JlcXVpcmVkIGVsZW1lbnQuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJkc19fWDUwOURhdGFUeXBlOjpYNTA5U3ViamVjdE5hbWUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19feDUwOV9kYXRhX3R5cGUuaHRtbCNvMiI+ZHNfX1g1MDlEYXRhVHlwZTo6WDUwOVN1YmplY3ROYW1lPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0VsZW1lbnQgWDUwOVN1YmplY3ROYW1lIG9mIHR5cGUgeHM6c3RyaW5nLiANCis8cD4NCitSZXF1aXJlZCBlbGVtZW50LiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgc3RydWN0IHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2Mvd3NzZS88YSBjbGFzcz0iZWwiIGhyZWY9ImRzXzhoLmh0bWwiPmRzLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gRnJpIEF1ZyAxOSAxMDo0MTo0NiAyMDA1IGZvciBnU09BUCBXUy1TZWN1cml0eSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19feDUwOV9kYXRhX3R5cGVfX2NvbGxfX2dyYXBoLm1hcCBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3g1MDlfZGF0YV90eXBlX19jb2xsX19ncmFwaC5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNkYmJhMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3g1MDlfZGF0YV90eXBlX19jb2xsX19ncmFwaC5tYXAKQEAgLTAsMCArMSwyIEBACitiYXNlIHJlZmVyZXIKK3JlY3QgJHN0cnVjdGRzX19fX194NTA5X2lzc3Vlcl9zZXJpYWxfdHlwZS5odG1sIDYsMTcgMTgwLDQ0CmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX194NTA5X2RhdGFfdHlwZV9fY29sbF9fZ3JhcGgubWQ1IGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19feDUwOV9kYXRhX3R5cGVfX2NvbGxfX2dyYXBoLm1kNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTM0ZGZiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19feDUwOV9kYXRhX3R5cGVfX2NvbGxfX2dyYXBoLm1kNQpAQCAtMCwwICsxIEBACitjYzliMmE0MTMxYWYxY2RjMmEzMzIxZWIwYTFjMTlmNwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3g1MDlfZGF0YV90eXBlX19jb2xsX19ncmFwaC5wbmcgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX194NTA5X2RhdGFfdHlwZV9fY29sbF9fZ3JhcGgucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNGJjNGEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX194NTA5X2RhdGFfdHlwZV9fY29sbF9fZ3JhcGgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3g1MDlfaXNzdWVyX3NlcmlhbF90eXBlLW1lbWJlcnMuaHRtbCBiL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3g1MDlfaXNzdWVyX3NlcmlhbF90eXBlLW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTFlNGZjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rkc19fX19feDUwOV9pc3N1ZXJfc2VyaWFsX3R5cGUtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFdTLVNlY3VyaXR5OiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT5kc19fWDUwOUlzc3VlclNlcmlhbFR5cGUgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19feDUwOV9pc3N1ZXJfc2VyaWFsX3R5cGUuaHRtbCI+ZHNfX1g1MDlJc3N1ZXJTZXJpYWxUeXBlPC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX194NTA5X2lzc3Vlcl9zZXJpYWxfdHlwZS5odG1sI28wIj5YNTA5SXNzdWVyTmFtZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX194NTA5X2lzc3Vlcl9zZXJpYWxfdHlwZS5odG1sIj5kc19fWDUwOUlzc3VlclNlcmlhbFR5cGU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19feDUwOV9pc3N1ZXJfc2VyaWFsX3R5cGUuaHRtbCNvMSI+WDUwOVNlcmlhbE51bWJlcjwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX194NTA5X2lzc3Vlcl9zZXJpYWxfdHlwZS5odG1sIj5kc19fWDUwOUlzc3VlclNlcmlhbFR5cGU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIEZyaSBBdWcgMTkgMTA6NDE6NDYgMjAwNSBmb3IgZ1NPQVAgV1MtU2VjdXJpdHkgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0ZHNfX19fX3g1MDlfaXNzdWVyX3NlcmlhbF90eXBlLmh0bWwgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX194NTA5X2lzc3Vlcl9zZXJpYWxfdHlwZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MGU1YTQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdGRzX19fX194NTA5X2lzc3Vlcl9zZXJpYWxfdHlwZS5odG1sCkBAIC0wLDAgKzEsODMgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFdTLVNlY3VyaXR5OiBkc19fWDUwOUlzc3VlclNlcmlhbFR5cGUgU3RydWN0IFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT5kc19fWDUwOUlzc3VlclNlcmlhbFR5cGUgU3RydWN0IFJlZmVyZW5jZTwvaDE+Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlg1MDlJc3N1ZXJTZXJpYWxUeXBlIGlzIGEgY29tcGxleFR5cGUuICANCis8YSBocmVmPSIjX2RldGFpbHMiPk1vcmUuLi48L2E+DQorPHA+DQorPGNvZGU+I2luY2x1ZGUgJmx0O2RzLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KKzxhIGhyZWY9InN0cnVjdGRzX19fX194NTA5X2lzc3Vlcl9zZXJpYWxfdHlwZS1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgQXR0cmlidXRlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3g1MDlfaXNzdWVyX3NlcmlhbF90eXBlLmh0bWwjbzAiPlg1MDlJc3N1ZXJOYW1lPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5FbGVtZW50IFg1MDlJc3N1ZXJOYW1lIG9mIHR5cGUgeHM6c3RyaW5nLiAgPGEgaHJlZj0iI28wIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX194NTA5X2lzc3Vlcl9zZXJpYWxfdHlwZS5odG1sI28xIj5YNTA5U2VyaWFsTnVtYmVyPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5SZXF1aXJlZCBlbGVtZW50LiAgPGEgaHJlZj0iI28xIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzxocj48YSBuYW1lPSJfZGV0YWlscyI+PC9hPjxoMj5EZXRhaWxlZCBEZXNjcmlwdGlvbjwvaDI+DQorImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlg1MDlJc3N1ZXJTZXJpYWxUeXBlIGlzIGEgY29tcGxleFR5cGUuIA0KKzxwPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9ImRzX19YNTA5SXNzdWVyU2VyaWFsVHlwZTo6WDUwOUlzc3Vlck5hbWUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19feDUwOV9pc3N1ZXJfc2VyaWFsX3R5cGUuaHRtbCNvMCI+ZHNfX1g1MDlJc3N1ZXJTZXJpYWxUeXBlOjpYNTA5SXNzdWVyTmFtZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFbGVtZW50IFg1MDlJc3N1ZXJOYW1lIG9mIHR5cGUgeHM6c3RyaW5nLiANCis8cD4NCitSZXF1aXJlZCBlbGVtZW50LiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMSIgZG94eXRhZz0iZHNfX1g1MDlJc3N1ZXJTZXJpYWxUeXBlOjpYNTA5U2VyaWFsTnVtYmVyIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX194NTA5X2lzc3Vlcl9zZXJpYWxfdHlwZS5odG1sI28xIj5kc19fWDUwOUlzc3VlclNlcmlhbFR5cGU6Olg1MDlTZXJpYWxOdW1iZXI8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorUmVxdWlyZWQgZWxlbWVudC4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIHN0cnVjdCB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3dzc2UvPGEgY2xhc3M9ImVsIiBocmVmPSJkc184aC5odG1sIj5kcy5oPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIEZyaSBBdWcgMTkgMTA6NDE6NDYgMjAwNSBmb3IgZ1NPQVAgV1MtU2VjdXJpdHkgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0c29hcF9fc21kX19kYXRhLW1lbWJlcnMuaHRtbCBiL2RvYy93c3NlL2h0bWwvc3RydWN0c29hcF9fc21kX19kYXRhLW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmQ2ZWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rzb2FwX19zbWRfX2RhdGEtbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMjAgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFdTLVNlY3VyaXR5OiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT5zb2FwX3NtZF9kYXRhIE1lbWJlciBMaXN0PC9oMT5UaGlzIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgZm9yIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fc21kX19kYXRhLmh0bWwiPnNvYXBfc21kX2RhdGE8L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fc21kX19kYXRhLmh0bWwjbzAiPmFsZzwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3NtZF9fZGF0YS5odG1sIj5zb2FwX3NtZF9kYXRhPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fc21kX19kYXRhLmh0bWwjbzEiPmN0eDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3NtZF9fZGF0YS5odG1sIj5zb2FwX3NtZF9kYXRhPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fc21kX19kYXRhLmh0bWwjbzQiPmZyZWN2PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fc21kX19kYXRhLmh0bWwiPnNvYXBfc21kX2RhdGE8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19zbWRfX2RhdGEuaHRtbCNvMyI+ZnNlbmQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19zbWRfX2RhdGEuaHRtbCI+c29hcF9zbWRfZGF0YTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3NtZF9fZGF0YS5odG1sI28yIj5rZXk8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19zbWRfX2RhdGEuaHRtbCI+c29hcF9zbWRfZGF0YTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3NtZF9fZGF0YS5odG1sI281Ij5tb2RlPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fc21kX19kYXRhLmh0bWwiPnNvYXBfc21kX2RhdGE8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19zbWRfX2RhdGEuaHRtbCNvNiI+dXNlcjwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3NtZF9fZGF0YS5odG1sIj5zb2FwX3NtZF9kYXRhPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCis8L3RhYmxlPjxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBGcmkgQXVnIDE5IDEwOjQxOjQ2IDIwMDUgZm9yIGdTT0FQIFdTLVNlY3VyaXR5IGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3N0cnVjdHNvYXBfX3NtZF9fZGF0YS5odG1sIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rzb2FwX19zbWRfX2RhdGEuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjQ4OWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rzb2FwX19zbWRfX2RhdGEuaHRtbApAQCAtMCwwICsxLDIwMiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgV1MtU2VjdXJpdHk6IHNvYXBfc21kX2RhdGEgU3RydWN0IFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT5zb2FwX3NtZF9kYXRhIFN0cnVjdCBSZWZlcmVuY2U8L2gxPlRoZSBzbWRldnAgZW5naW5lIGNvbnRleHQgZGF0YS4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7c21kZXZwLmgmZ3Q7PC9jb2RlPg0KKzxwPg0KKzxhIGhyZWY9InN0cnVjdHNvYXBfX3NtZF9fZGF0YS1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgQXR0cmlidXRlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fc21kX19kYXRhLmh0bWwjbzAiPmFsZzwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnZvaWQgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19zbWRfX2RhdGEuaHRtbCNvMSI+Y3R4PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y29uc3Qgdm9pZCAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3NtZF9fZGF0YS5odG1sI28yIj5rZXk8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQoKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19zbWRfX2RhdGEuaHRtbCNvMyI+ZnNlbmQ8L2E+ICkoc3RydWN0IHNvYXAgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zaXplX3QoKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19zbWRfX2RhdGEuaHRtbCNvNCI+ZnJlY3Y8L2E+ICkoc3RydWN0IHNvYXAgKiwgY2hhciAqLCBzaXplX3QpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zb2FwX21vZGUmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fc21kX19kYXRhLmh0bWwjbzUiPm1vZGU8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD52b2lkICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fc21kX19kYXRhLmh0bWwjbzYiPnVzZXI8L2E+PC90ZD48L3RyPg0KKw0KKzwvdGFibGU+DQorPGhyPjxhIG5hbWU9Il9kZXRhaWxzIj48L2E+PGgyPkRldGFpbGVkIERlc2NyaXB0aW9uPC9oMj4NCitUaGUgc21kZXZwIGVuZ2luZSBjb250ZXh0IGRhdGEuIA0KKzxwPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzAiIGRveHl0YWc9InNvYXBfc21kX2RhdGE6OmFsZyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19zbWRfX2RhdGEuaHRtbCNvMCI+c29hcF9zbWRfZGF0YTo6YWxnPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1RoZSBkaWdlc3Qgb3Igc2lnbmF0dXJlIGFsZ29yaXRobSB1c2VkICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJzb2FwX3NtZF9kYXRhOjpjdHgiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdm9pZCogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19zbWRfX2RhdGEuaHRtbCNvMSI+c29hcF9zbWRfZGF0YTo6Y3R4PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0VWUF9NRF9DVFggb3IgSE1BQ19DVFggICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzQiIGRveHl0YWc9InNvYXBfc21kX2RhdGE6OmZyZWN2IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHNpemVfdCgqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fc21kX19kYXRhLmh0bWwjbzQiPnNvYXBfc21kX2RhdGE6OmZyZWN2PC9hPikoc3RydWN0IHNvYXAgKiwgY2hhciAqLCBzaXplX3QpICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzMiIGRveHl0YWc9InNvYXBfc21kX2RhdGE6OmZzZW5kIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCgqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fc21kX19kYXRhLmh0bWwjbzMiPnNvYXBfc21kX2RhdGE6OmZzZW5kPC9hPikoc3RydWN0IHNvYXAgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzIiIGRveHl0YWc9InNvYXBfc21kX2RhdGE6OmtleSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjb25zdCB2b2lkKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3NtZF9fZGF0YS5odG1sI28yIj5zb2FwX3NtZF9kYXRhOjprZXk8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorRVZQX1BLRVkgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzUiIGRveHl0YWc9InNvYXBfc21kX2RhdGE6Om1vZGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc29hcF9tb2RlIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fc21kX19kYXRhLmh0bWwjbzUiPnNvYXBfc21kX2RhdGE6Om1vZGU8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzYiIGRveHl0YWc9InNvYXBfc21kX2RhdGE6OnVzZXIiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdm9pZCogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX19zbWRfX2RhdGEuaHRtbCNvNiI+c29hcF9zbWRfZGF0YTo6dXNlcjwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgc3RydWN0IHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2Mvd3NzZS88YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84aC5odG1sIj5zbWRldnAuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBGcmkgQXVnIDE5IDEwOjQxOjQ2IDIwMDUgZm9yIGdTT0FQIFdTLVNlY3VyaXR5IGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3N0cnVjdHNvYXBfX3dzc2VfX2RhdGEtbWVtYmVycy5odG1sIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rzb2FwX193c3NlX19kYXRhLW1lbWJlcnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGJlYzE4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rzb2FwX193c3NlX19kYXRhLW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDI0IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBXUy1TZWN1cml0eTogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+c29hcF93c3NlX2RhdGEgTWVtYmVyIExpc3Q8L2gxPlRoaXMgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgbWVtYmVycyBmb3IgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kYXRhLmh0bWwiPnNvYXBfd3NzZV9kYXRhPC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RhdGEuaHRtbCNvNiI+ZGlnZXN0PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fZGF0YS5odG1sIj5zb2FwX3dzc2VfZGF0YTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RhdGEuaHRtbCNvMTAiPmZkaXNjb25uZWN0PC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fZGF0YS5odG1sIj5zb2FwX3dzc2VfZGF0YTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RhdGEuaHRtbCNvOSI+ZnByZXBhcmVmaW5hbDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RhdGEuaHRtbCI+c29hcF93c3NlX2RhdGE8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kYXRhLmh0bWwjbzciPmZwcmVwYXJlaW5pdDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RhdGEuaHRtbCI+c29hcF93c3NlX2RhdGE8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kYXRhLmh0bWwjbzgiPmZwcmVwYXJlc2VuZDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RhdGEuaHRtbCI+c29hcF93c3NlX2RhdGE8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kYXRhLmh0bWwjbzAiPnNpZ25fYWxnPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fZGF0YS5odG1sIj5zb2FwX3dzc2VfZGF0YTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RhdGEuaHRtbCNvMSI+c2lnbl9rZXk8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kYXRhLmh0bWwiPnNvYXBfd3NzZV9kYXRhPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fZGF0YS5odG1sI28yIj5zaWduX2tleWxlbjwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RhdGEuaHRtbCI+c29hcF93c3NlX2RhdGE8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kYXRhLmh0bWwjbzMiPnZyZnlfYWxnPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fZGF0YS5odG1sIj5zb2FwX3dzc2VfZGF0YTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RhdGEuaHRtbCNvNCI+dnJmeV9rZXk8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kYXRhLmh0bWwiPnNvYXBfd3NzZV9kYXRhPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fZGF0YS5odG1sI281Ij52cmZ5X2tleWxlbjwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RhdGEuaHRtbCI+c29hcF93c3NlX2RhdGE8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIEZyaSBBdWcgMTkgMTA6NDE6NDYgMjAwNSBmb3IgZ1NPQVAgV1MtU2VjdXJpdHkgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0c29hcF9fd3NzZV9fZGF0YS5odG1sIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rzb2FwX193c3NlX19kYXRhLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZjNWMxMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0c29hcF9fd3NzZV9fZGF0YS5odG1sCkBAIC0wLDAgKzEsMzA5IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBXUy1TZWN1cml0eTogc29hcF93c3NlX2RhdGEgU3RydWN0IFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT5zb2FwX3dzc2VfZGF0YSBTdHJ1Y3QgUmVmZXJlbmNlPC9oMT53c3NlcGkgcGx1Z2luIGRhdGEgIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7d3NzZWFwaS5oJmd0OzwvY29kZT4NCis8cD4NCitDb2xsYWJvcmF0aW9uIGRpYWdyYW0gZm9yIHNvYXBfd3NzZV9kYXRhOjxwPjxjZW50ZXI+PGltZyBzcmM9InN0cnVjdHNvYXBfX3dzc2VfX2RhdGFfX2NvbGxfX2dyYXBoLnBuZyIgYm9yZGVyPSIwIiB1c2VtYXA9IiNzb2FwX193c3NlX19kYXRhX19jb2xsX19tYXAiIGFsdD0iQ29sbGFib3JhdGlvbiBncmFwaCI+PC9jZW50ZXI+DQorPG1hcCBuYW1lPSJzb2FwX193c3NlX19kYXRhX19jb2xsX19tYXAiPg0KKzxhcmVhIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RpZ2VzdC5odG1sIiBzaGFwZT0icmVjdCIgY29vcmRzPSI3LDEwOCwxMzIsMTM0IiBhbHQ9IiI+DQorPGFyZWEgaHJlZj0ic3RydWN0c29hcF9fc21kX19kYXRhLmh0bWwiIHNoYXBlPSJyZWN0IiBjb29yZHM9IjE1LDE3LDEyNCw0NCIgYWx0PSIiPg0KKzwvbWFwPg0KKzxjZW50ZXI+PGZvbnQgc2l6ZT0iMiI+WzxhIGhyZWY9ImdyYXBoX2xlZ2VuZC5odG1sIj5sZWdlbmQ8L2E+XTwvZm9udD48L2NlbnRlcj48YSBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kYXRhLW1lbWJlcnMuaHRtbCI+TGlzdCBvZiBhbGwgbWVtYmVycy48L2E+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlB1YmxpYyBBdHRyaWJ1dGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kYXRhLmh0bWwjbzAiPnNpZ25fYWxnPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y29uc3Qgdm9pZCAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RhdGEuaHRtbCNvMSI+c2lnbl9rZXk8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fZGF0YS5odG1sI28yIj5zaWduX2tleWxlbjwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kYXRhLmh0bWwjbzMiPnZyZnlfYWxnPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y29uc3Qgdm9pZCAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RhdGEuaHRtbCNvNCI+dnJmeV9rZXk8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fZGF0YS5odG1sI281Ij52cmZ5X2tleWxlbjwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fZGlnZXN0Lmh0bWwiPnNvYXBfd3NzZV9kaWdlc3Q8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fZGF0YS5odG1sI282Ij5kaWdlc3Q8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQoKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kYXRhLmh0bWwjbzciPmZwcmVwYXJlaW5pdDwvYT4gKShzdHJ1Y3Qgc29hcCAqKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50KCombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fZGF0YS5odG1sI284Ij5mcHJlcGFyZXNlbmQ8L2E+ICkoc3RydWN0IHNvYXAgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQoKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kYXRhLmh0bWwjbzkiPmZwcmVwYXJlZmluYWw8L2E+ICkoc3RydWN0IHNvYXAgKik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCgqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RhdGEuaHRtbCNvMTAiPmZkaXNjb25uZWN0PC9hPiApKHN0cnVjdCBzb2FwICopPC90ZD48L3RyPg0KKw0KKzwvdGFibGU+DQorPGhyPjxhIG5hbWU9Il9kZXRhaWxzIj48L2E+PGgyPkRldGFpbGVkIERlc2NyaXB0aW9uPC9oMj4NCit3c3NlcGkgcGx1Z2luIGRhdGEgDQorPHA+DQorVGhlIHNpZ25hdHVyZSBrZXkgKHByaXZhdGUpIGFuZCB2ZXJpZmljYXRpb24ga2V5IChwdWJsaWMpIGFyZSBrZXB0IHNlcGFyYXRlLiANCis8cD4NCis8aHI+PGgyPk1lbWJlciBEYXRhIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im82IiBkb3h5dGFnPSJzb2FwX3dzc2VfZGF0YTo6ZGlnZXN0IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RpZ2VzdC5odG1sIj5zb2FwX3dzc2VfZGlnZXN0PC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kYXRhLmh0bWwjbzYiPnNvYXBfd3NzZV9kYXRhOjpkaWdlc3Q8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTGlzdCBvZiBJRC1oYXNoIHBhaXJzICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xMCIgZG94eXRhZz0ic29hcF93c3NlX2RhdGE6OmZkaXNjb25uZWN0IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCgqIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fZGF0YS5odG1sI28xMCI+c29hcF93c3NlX2RhdGE6OmZkaXNjb25uZWN0PC9hPikoc3RydWN0IHNvYXAgKikgICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvOSIgZG94eXRhZz0ic29hcF93c3NlX2RhdGE6OmZwcmVwYXJlZmluYWwiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50KCogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kYXRhLmh0bWwjbzkiPnNvYXBfd3NzZV9kYXRhOjpmcHJlcGFyZWZpbmFsPC9hPikoc3RydWN0IHNvYXAgKikgICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNyIgZG94eXRhZz0ic29hcF93c3NlX2RhdGE6OmZwcmVwYXJlaW5pdCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQoKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RhdGEuaHRtbCNvNyI+c29hcF93c3NlX2RhdGE6OmZwcmVwYXJlaW5pdDwvYT4pKHN0cnVjdCBzb2FwICopICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzgiIGRveHl0YWc9InNvYXBfd3NzZV9kYXRhOjpmcHJlcGFyZXNlbmQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50KCogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kYXRhLmh0bWwjbzgiPnNvYXBfd3NzZV9kYXRhOjpmcHJlcGFyZXNlbmQ8L2E+KShzdHJ1Y3Qgc29hcCAqLCBjb25zdCBjaGFyICosIHNpemVfdCkgICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0ic29hcF93c3NlX2RhdGE6OnNpZ25fYWxnIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RhdGEuaHRtbCNvMCI+c29hcF93c3NlX2RhdGE6OnNpZ25fYWxnPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1RoZSBkaWdlc3Qgb3Igc2lnbmF0dXJlIGFsZ29yaXRobSB1c2VkICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJzb2FwX3dzc2VfZGF0YTo6c2lnbl9rZXkiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY29uc3Qgdm9pZCogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kYXRhLmh0bWwjbzEiPnNvYXBfd3NzZV9kYXRhOjpzaWduX2tleTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitFVlBfUEtFWSBvciBrZXkgc3RyaW5nIGZvciBITUFDICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJzb2FwX3dzc2VfZGF0YTo6c2lnbl9rZXlsZW4iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fZGF0YS5odG1sI28yIj5zb2FwX3dzc2VfZGF0YTo6c2lnbl9rZXlsZW48L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorSE1BQyBrZXkgbGVuZ3RoICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8zIiBkb3h5dGFnPSJzb2FwX3dzc2VfZGF0YTo6dnJmeV9hbGciID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fZGF0YS5odG1sI28zIj5zb2FwX3dzc2VfZGF0YTo6dnJmeV9hbGc8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVGhlIHNpZ25hdHVyZSB2ZXJpZnkgYWxnb3JpdGhtIHVzZWQgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzQiIGRveHl0YWc9InNvYXBfd3NzZV9kYXRhOjp2cmZ5X2tleSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjb25zdCB2b2lkKiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RhdGEuaHRtbCNvNCI+c29hcF93c3NlX2RhdGE6OnZyZnlfa2V5PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0VWUF9QS0VZIG9yIGtleSBzdHJpbmcgZm9yIEhNQUMgdmVyaWZ5ICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im81IiBkb3h5dGFnPSJzb2FwX3dzc2VfZGF0YTo6dnJmeV9rZXlsZW4iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fZGF0YS5odG1sI281Ij5zb2FwX3dzc2VfZGF0YTo6dnJmeV9rZXlsZW48L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorSE1BQyBrZXkgbGVuZ3RoICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj5UaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBzdHJ1Y3Qgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZmlsZTo8dWw+DQorPGxpPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy93c3NlLzxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sIj53c3NlYXBpLmg8L2E+PC91bD4NCis8aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gRnJpIEF1ZyAxOSAxMDo0MTo0NiAyMDA1IGZvciBnU09BUCBXUy1TZWN1cml0eSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rzb2FwX193c3NlX19kYXRhX19jb2xsX19ncmFwaC5tYXAgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdHNvYXBfX3dzc2VfX2RhdGFfX2NvbGxfX2dyYXBoLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzdkZjExCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rzb2FwX193c3NlX19kYXRhX19jb2xsX19ncmFwaC5tYXAKQEAgLTAsMCArMSwzIEBACitiYXNlIHJlZmVyZXIKK3JlY3QgJHN0cnVjdHNvYXBfX3dzc2VfX2RpZ2VzdC5odG1sIDcsMTA4IDEzMiwxMzQKK3JlY3QgJHN0cnVjdHNvYXBfX3NtZF9fZGF0YS5odG1sIDE1LDE3IDEyNCw0NApkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rzb2FwX193c3NlX19kYXRhX19jb2xsX19ncmFwaC5tZDUgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdHNvYXBfX3dzc2VfX2RhdGFfX2NvbGxfX2dyYXBoLm1kNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTk4ODVkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rzb2FwX193c3NlX19kYXRhX19jb2xsX19ncmFwaC5tZDUKQEAgLTAsMCArMSBAQAorOTU4NzNhOTFiYjJmODMxZDIzMzM2MzdiMzljNjUzNzQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3N0cnVjdHNvYXBfX3dzc2VfX2RhdGFfX2NvbGxfX2dyYXBoLnBuZyBiL2RvYy93c3NlL2h0bWwvc3RydWN0c29hcF9fd3NzZV9fZGF0YV9fY29sbF9fZ3JhcGgucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NDc2ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdHNvYXBfX3dzc2VfX2RhdGFfX2NvbGxfX2dyYXBoLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3N0cnVjdHNvYXBfX3dzc2VfX2RpZ2VzdC1tZW1iZXJzLmh0bWwgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdHNvYXBfX3dzc2VfX2RpZ2VzdC1tZW1iZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk4MTk3MwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0c29hcF9fd3NzZV9fZGlnZXN0LW1lbWJlcnMuaHRtbApAQCAtMCwwICsxLDE4IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBXUy1TZWN1cml0eTogTWVtYmVyIExpc3Q8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+c29hcF93c3NlX2RpZ2VzdCBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RpZ2VzdC5odG1sIj5zb2FwX3dzc2VfZGlnZXN0PC9hPiwgaW5jbHVkaW5nIGFsbCBpbmhlcml0ZWQgbWVtYmVycy48cD48dGFibGU+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RpZ2VzdC5odG1sI28zIj5oYXNoPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fZGlnZXN0Lmh0bWwiPnNvYXBfd3NzZV9kaWdlc3Q8L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kaWdlc3QuaHRtbCNvNCI+aWQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kaWdlc3QuaHRtbCI+c29hcF93c3NlX2RpZ2VzdDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RpZ2VzdC5odG1sI28xIj5sZXZlbDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RpZ2VzdC5odG1sIj5zb2FwX3dzc2VfZGlnZXN0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fZGlnZXN0Lmh0bWwjbzAiPm5leHQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kaWdlc3QuaHRtbCI+c29hcF93c3NlX2RpZ2VzdDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RpZ2VzdC5odG1sI28yIj5zbWQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kaWdlc3QuaHRtbCI+c29hcF93c3NlX2RpZ2VzdDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorPC90YWJsZT48aHIgc2l6ZT0iMSI+PGFkZHJlc3Mgc3R5bGU9ImFsaWduOiByaWdodDsiPjxzbWFsbD5HZW5lcmF0ZWQgb24gRnJpIEF1ZyAxOSAxMDo0MTo0NiAyMDA1IGZvciBnU09BUCBXUy1TZWN1cml0eSBieQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZG94eWdlbi5vcmcvaW5kZXguaHRtbCI+DQorPGltZyBzcmM9ImRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iIGFsaWduPSJtaWRkbGUiIGJvcmRlcj0wID48L2E+IDEuMy44IDwvc21hbGw+PC9hZGRyZXNzPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rzb2FwX193c3NlX19kaWdlc3QuaHRtbCBiL2RvYy93c3NlL2h0bWwvc3RydWN0c29hcF9fd3NzZV9fZGlnZXN0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIyZjVjNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0c29hcF9fd3NzZV9fZGlnZXN0Lmh0bWwKQEAgLTAsMCArMSwxNTggQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFdTLVNlY3VyaXR5OiBzb2FwX3dzc2VfZGlnZXN0IFN0cnVjdCBSZWZlcmVuY2U8L3RpdGxlPg0KKzxsaW5rIGhyZWY9ImRveHlnZW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCis8L2hlYWQ+PGJvZHk+DQorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4NCis8ZGl2IGNsYXNzPSJxaW5kZXgiPjxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImluZGV4Lmh0bWwiPk1haW4mbmJzcDtQYWdlPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImFubm90YXRlZC5odG1sIj5DbGFzcyZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZmlsZXMuaHRtbCI+RmlsZSZuYnNwO0xpc3Q8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZnVuY3Rpb25zLmh0bWwiPkNsYXNzJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJnbG9iYWxzLmh0bWwiPkZpbGUmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9InBhZ2VzLmh0bWwiPlJlbGF0ZWQmbmJzcDtQYWdlczwvYT48L2Rpdj4NCis8aDE+c29hcF93c3NlX2RpZ2VzdCBTdHJ1Y3QgUmVmZXJlbmNlPC9oMT5EaWdlc3QgZGljdGlvbmFyeTogbGlua2VkIGxpc3Qgb2YgSUQtaGFzaCBwYWlycy4gIA0KKzxhIGhyZWY9IiNfZGV0YWlscyI+TW9yZS4uLjwvYT4NCis8cD4NCis8Y29kZT4jaW5jbHVkZSAmbHQ7d3NzZWFwaS5oJmd0OzwvY29kZT4NCis8cD4NCitDb2xsYWJvcmF0aW9uIGRpYWdyYW0gZm9yIHNvYXBfd3NzZV9kaWdlc3Q6PHA+PGNlbnRlcj48aW1nIHNyYz0ic3RydWN0c29hcF9fd3NzZV9fZGlnZXN0X19jb2xsX19ncmFwaC5wbmciIGJvcmRlcj0iMCIgdXNlbWFwPSIjc29hcF9fd3NzZV9fZGlnZXN0X19jb2xsX19tYXAiIGFsdD0iQ29sbGFib3JhdGlvbiBncmFwaCI+PC9jZW50ZXI+DQorPG1hcCBuYW1lPSJzb2FwX193c3NlX19kaWdlc3RfX2NvbGxfX21hcCI+DQorPGFyZWEgaHJlZj0ic3RydWN0c29hcF9fc21kX19kYXRhLmh0bWwiIHNoYXBlPSJyZWN0IiBjb29yZHM9IjE1LDE3LDEyNCw0NCIgYWx0PSIiPg0KKzwvbWFwPg0KKzxjZW50ZXI+PGZvbnQgc2l6ZT0iMiI+WzxhIGhyZWY9ImdyYXBoX2xlZ2VuZC5odG1sIj5sZWdlbmQ8L2E+XTwvZm9udD48L2NlbnRlcj48YSBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kaWdlc3QtbWVtYmVycy5odG1sIj5MaXN0IG9mIGFsbCBtZW1iZXJzLjwvYT48dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+UHVibGljIEF0dHJpYnV0ZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kaWdlc3QuaHRtbCI+c29hcF93c3NlX2RpZ2VzdDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kaWdlc3QuaHRtbCNvMCI+bmV4dDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnVuc2lnbmVkIGludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kaWdlc3QuaHRtbCNvMSI+bGV2ZWw8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3NtZF9fZGF0YS5odG1sIj5zb2FwX3NtZF9kYXRhPC9hPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kaWdlc3QuaHRtbCNvMiI+c21kPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+dW5zaWduZWQgY2hhciZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kaWdlc3QuaHRtbCNvMyI+aGFzaDwvYT4gW1NPQVBfU01EX01BWF9TSVpFXTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kaWdlc3QuaHRtbCNvNCI+aWQ8L2E+IFsxXTwvdGQ+PC90cj4NCisNCis8L3RhYmxlPg0KKzxocj48YSBuYW1lPSJfZGV0YWlscyI+PC9hPjxoMj5EZXRhaWxlZCBEZXNjcmlwdGlvbjwvaDI+DQorRGlnZXN0IGRpY3Rpb25hcnk6IGxpbmtlZCBsaXN0IG9mIElELWhhc2ggcGFpcnMuIA0KKzxwPg0KK1RoZSBkaWdlc3QgZGljdGlvbmFyeSBpcyBwb3B1bGF0ZWQgYnkgdGhlIHNvYXBfd3NzZV9wcmVwYXJlc2VuZCBjYWxsYmFjay4gVGhlIGNhbGxiYWNrIGludGVyY2VwdHMgWE1MIGVsZW1lbnRzIHdpdGggd3N1OklkIGF0dHJpYnV0ZXMgYW5kIGNvbXB1dGVzIHRoZSBkaWdlc3QgZHVyaW5nIHRoZSBwcmVwcm9jZXNzaW5nIG9mIGEgbWVzc2FnZSB0cmFuc21pc3Npb24uIFRoZSAnbGV2ZWwnIGZpZWxkIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZW4gdGhlIGVuZCBvZiBhbiBlbGVtZW50IGlzIHJlYWNoZWQuIA0KKzxwPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzMiIGRveHl0YWc9InNvYXBfd3NzZV9kaWdlc3Q6Omhhc2giID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdW5zaWduZWQgY2hhciA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RpZ2VzdC5odG1sI28zIj5zb2FwX3dzc2VfZGlnZXN0OjpoYXNoPC9hPltTT0FQX1NNRF9NQVhfU0laRV0gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitEaWdlc3QgaGFzaCB2YWx1ZSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvNCIgZG94eXRhZz0ic29hcF93c3NlX2RpZ2VzdDo6aWQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RpZ2VzdC5odG1sI280Ij5zb2FwX3dzc2VfZGlnZXN0OjppZDwvYT5bMV0gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitTdHJpbmcgZmxvd3MgZG93biB0aGUgc3RydWN0ICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8xIiBkb3h5dGFnPSJzb2FwX3dzc2VfZGlnZXN0OjpsZXZlbCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB1bnNpZ25lZCBpbnQgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kaWdlc3QuaHRtbCNvMSI+c29hcF93c3NlX2RpZ2VzdDo6bGV2ZWw8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorWE1MIHBhcnNlciBkZXB0aCBsZXZlbCAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJvMCIgZG94eXRhZz0ic29hcF93c3NlX2RpZ2VzdDo6bmV4dCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kaWdlc3QuaHRtbCI+c29hcF93c3NlX2RpZ2VzdDwvYT4qIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fZGlnZXN0Lmh0bWwjbzAiPnNvYXBfd3NzZV9kaWdlc3Q6Om5leHQ8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorTmV4dCBpbiBsaXN0ICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJzb2FwX3dzc2VfZGlnZXN0OjpzbWQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fc21kX19kYXRhLmh0bWwiPnNvYXBfc21kX2RhdGE8L2E+IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fZGlnZXN0Lmh0bWwjbzIiPnNvYXBfd3NzZV9kaWdlc3Q6OnNtZDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitzbWRldnAgZW5naW5lIGNvbnRleHQgICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPlRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIHN0cnVjdCB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBmaWxlOjx1bD4NCis8bGk+L1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3dzc2UvPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwiPndzc2VhcGkuaDwvYT48L3VsPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBGcmkgQXVnIDE5IDEwOjQxOjQ2IDIwMDUgZm9yIGdTT0FQIFdTLVNlY3VyaXR5IGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3N0cnVjdHNvYXBfX3dzc2VfX2RpZ2VzdF9fY29sbF9fZ3JhcGgubWFwIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rzb2FwX193c3NlX19kaWdlc3RfX2NvbGxfX2dyYXBoLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTIwNDkxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rzb2FwX193c3NlX19kaWdlc3RfX2NvbGxfX2dyYXBoLm1hcApAQCAtMCwwICsxLDIgQEAKK2Jhc2UgcmVmZXJlcgorcmVjdCAkc3RydWN0c29hcF9fc21kX19kYXRhLmh0bWwgMTUsMTcgMTI0LDQ0CmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3N0cnVjdHNvYXBfX3dzc2VfX2RpZ2VzdF9fY29sbF9fZ3JhcGgubWQ1IGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rzb2FwX193c3NlX19kaWdlc3RfX2NvbGxfX2dyYXBoLm1kNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODBhNWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rzb2FwX193c3NlX19kaWdlc3RfX2NvbGxfX2dyYXBoLm1kNQpAQCAtMCwwICsxIEBACis1MTM0YTJjMmQ1ZTA1M2IwYmUwNmVlODRkZjJjY2I2YwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0c29hcF9fd3NzZV9fZGlnZXN0X19jb2xsX19ncmFwaC5wbmcgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdHNvYXBfX3dzc2VfX2RpZ2VzdF9fY29sbF9fZ3JhcGgucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NjMxNzUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdHNvYXBfX3dzc2VfX2RpZ2VzdF9fY29sbF9fZ3JhcGgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0c29hcF9fd3NzZV9fc2Vzc2lvbi1tZW1iZXJzLmh0bWwgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdHNvYXBfX3dzc2VfX3Nlc3Npb24tbWVtYmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMjQyODIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdHNvYXBfX3dzc2VfX3Nlc3Npb24tbWVtYmVycy5odG1sCkBAIC0wLDAgKzEsMTcgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFdTLVNlY3VyaXR5OiBNZW1iZXIgTGlzdDwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT5zb2FwX3dzc2Vfc2Vzc2lvbiBNZW1iZXIgTGlzdDwvaDE+VGhpcyBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIGZvciA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX3Nlc3Npb24uaHRtbCI+c29hcF93c3NlX3Nlc3Npb248L2E+LCBpbmNsdWRpbmcgYWxsIGluaGVyaXRlZCBtZW1iZXJzLjxwPjx0YWJsZT4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fc2Vzc2lvbi5odG1sI28xIj5leHBpcmVkPC9hPjwvdGQ+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fc2Vzc2lvbi5odG1sIj5zb2FwX3dzc2Vfc2Vzc2lvbjwvYT48L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8dHIgY2xhc3M9Im1lbWxpc3QiPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX3Nlc3Npb24uaHRtbCNvMiI+aGFzaDwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX3Nlc3Npb24uaHRtbCI+c29hcF93c3NlX3Nlc3Npb248L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKyAgPHRyIGNsYXNzPSJtZW1saXN0Ij48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19zZXNzaW9uLmh0bWwjbzAiPm5leHQ8L2E+PC90ZD48dGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19zZXNzaW9uLmh0bWwiPnNvYXBfd3NzZV9zZXNzaW9uPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4NCisgIDx0ciBjbGFzcz0ibWVtbGlzdCI+PHRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fc2Vzc2lvbi5odG1sI28zIj5ub25jZTwvYT48L3RkPjx0ZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX3Nlc3Npb24uaHRtbCI+c29hcF93c3NlX3Nlc3Npb248L2E+PC90ZD48dGQ+PC90ZD48L3RyPg0KKzwvdGFibGU+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIEZyaSBBdWcgMTkgMTA6NDE6NDYgMjAwNSBmb3IgZ1NPQVAgV1MtU2VjdXJpdHkgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0c29hcF9fd3NzZV9fc2Vzc2lvbi5odG1sIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rzb2FwX193c3NlX19zZXNzaW9uLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYyMzkwNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0c29hcF9fd3NzZV9fc2Vzc2lvbi5odG1sCkBAIC0wLDAgKzEsMTI2IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBXUy1TZWN1cml0eTogc29hcF93c3NlX3Nlc3Npb24gU3RydWN0IFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT5zb2FwX3dzc2Vfc2Vzc2lvbiBTdHJ1Y3QgUmVmZXJlbmNlPC9oMT5EaWdlc3QgYXV0aGVudGljYXRpb24gc2Vzc2lvbiBkYXRhLiAgDQorPGEgaHJlZj0iI19kZXRhaWxzIj5Nb3JlLi4uPC9hPg0KKzxwPg0KK0NvbGxhYm9yYXRpb24gZGlhZ3JhbSBmb3Igc29hcF93c3NlX3Nlc3Npb246PHA+PGNlbnRlcj48aW1nIHNyYz0ic3RydWN0c29hcF9fd3NzZV9fc2Vzc2lvbl9fY29sbF9fZ3JhcGgucG5nIiBib3JkZXI9IjAiIHVzZW1hcD0iI3NvYXBfX3dzc2VfX3Nlc3Npb25fX2NvbGxfX21hcCIgYWx0PSJDb2xsYWJvcmF0aW9uIGdyYXBoIj48L2NlbnRlcj4NCis8Y2VudGVyPjxmb250IHNpemU9IjIiPls8YSBocmVmPSJncmFwaF9sZWdlbmQuaHRtbCI+bGVnZW5kPC9hPl08L2ZvbnQ+PC9jZW50ZXI+PGEgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fc2Vzc2lvbi1tZW1iZXJzLmh0bWwiPkxpc3Qgb2YgYWxsIG1lbWJlcnMuPC9hPjx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+DQorPHRyPjx0ZD48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5QdWJsaWMgQXR0cmlidXRlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX3Nlc3Npb24uaHRtbCI+c29hcF93c3NlX3Nlc3Npb248L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fc2Vzc2lvbi5odG1sI28wIj5uZXh0PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+dGltZV90Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX3Nlc3Npb24uaHRtbCNvMSI+ZXhwaXJlZDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNoYXImbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fc2Vzc2lvbi5odG1sI28yIj5oYXNoPC9hPiBbU09BUF9TTURfU0hBMV9TSVpFXTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y2hhciZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19zZXNzaW9uLmh0bWwjbzMiPm5vbmNlPC9hPiBbMV08L3RkPjwvdHI+DQorDQorPC90YWJsZT4NCis8aHI+PGEgbmFtZT0iX2RldGFpbHMiPjwvYT48aDI+RGV0YWlsZWQgRGVzY3JpcHRpb248L2gyPg0KK0RpZ2VzdCBhdXRoZW50aWNhdGlvbiBzZXNzaW9uIGRhdGEuIA0KKzxwPg0KKzxocj48aDI+TWVtYmVyIERhdGEgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0ibzEiIGRveHl0YWc9InNvYXBfd3NzZV9zZXNzaW9uOjpleHBpcmVkIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHRpbWVfdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX3Nlc3Npb24uaHRtbCNvMSI+c29hcF93c3NlX3Nlc3Npb246OmV4cGlyZWQ8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorU2Vzc2lvbiBleHBpcmF0aW9uICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8yIiBkb3h5dGFnPSJzb2FwX3dzc2Vfc2Vzc2lvbjo6aGFzaCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjaGFyIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fc2Vzc2lvbi5odG1sI28yIj5zb2FwX3dzc2Vfc2Vzc2lvbjo6aGFzaDwvYT5bU09BUF9TTURfU0hBMV9TSVpFXSAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1NIQTEgZGlnZXN0ICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8wIiBkb3h5dGFnPSJzb2FwX3dzc2Vfc2Vzc2lvbjo6bmV4dCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19zZXNzaW9uLmh0bWwiPnNvYXBfd3NzZV9zZXNzaW9uPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19zZXNzaW9uLmh0bWwjbzAiPnNvYXBfd3NzZV9zZXNzaW9uOjpuZXh0PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK05leHQgc2Vzc2lvbiBpbiBsaXN0ICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Im8zIiBkb3h5dGFnPSJzb2FwX3dzc2Vfc2Vzc2lvbjo6bm9uY2UiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY2hhciA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX3Nlc3Npb24uaHRtbCNvMyI+c29hcF93c3NlX3Nlc3Npb246Om5vbmNlPC9hPlsxXSAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK05vbmNlIHN0cmluZyBmbG93cyBpbnRvIHJlZ2lvbiBiZWxvdyB0aGlzIHN0cnVjdCAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+VGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgc3RydWN0IHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIGZpbGU6PHVsPg0KKzxsaT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2Mvd3NzZS88YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCI+d3NzZWFwaS5jPC9hPjwvdWw+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIEZyaSBBdWcgMTkgMTA6NDE6NDYgMjAwNSBmb3IgZ1NPQVAgV1MtU2VjdXJpdHkgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvc3RydWN0c29hcF9fd3NzZV9fc2Vzc2lvbl9fY29sbF9fZ3JhcGgubWFwIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rzb2FwX193c3NlX19zZXNzaW9uX19jb2xsX19ncmFwaC5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWExNDc3OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvc3RydWN0c29hcF9fd3NzZV9fc2Vzc2lvbl9fY29sbF9fZ3JhcGgubWFwCkBAIC0wLDAgKzEgQEAKK2Jhc2UgcmVmZXJlcgpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rzb2FwX193c3NlX19zZXNzaW9uX19jb2xsX19ncmFwaC5tZDUgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdHNvYXBfX3dzc2VfX3Nlc3Npb25fX2NvbGxfX2dyYXBoLm1kNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzA5MWRhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC9zdHJ1Y3Rzb2FwX193c3NlX19zZXNzaW9uX19jb2xsX19ncmFwaC5tZDUKQEAgLTAsMCArMSBAQAorODNkYWI5MzlmMzAzZDYwMDNjZDEyNThhMGQ1ZjFkM2EKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3N0cnVjdHNvYXBfX3dzc2VfX3Nlc3Npb25fX2NvbGxfX2dyYXBoLnBuZyBiL2RvYy93c3NlL2h0bWwvc3RydWN0c29hcF9fd3NzZV9fc2Vzc2lvbl9fY29sbF9fZ3JhcGgucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiY2RhZTAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3N0cnVjdHNvYXBfX3dzc2VfX3Nlc3Npb25fX2NvbGxfX2dyYXBoLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3dzc2UuaHRtbCBiL2RvYy93c3NlL2h0bWwvd3NzZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNDJiYjQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3dzc2UuaHRtbApAQCAtMCwwICsxLDI5NyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgV1MtU2VjdXJpdHk6IFRoZSB3c3NlIHBsdWdpbjwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJ3c3NlIj5UaGUgd3NzZSBwbHVnaW48L2E+PC9oMT48aDI+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0id3NzZV81Ij4NCitTZWN1cml0eSBIZWFkZXI8L2E+PC9oMj4NCitUaGUgbWF0ZXJpYWwgaW4gdGhpcyBzZWN0aW9uIHJlbGF0ZXMgdG8gdGhlIFdTLVNlY3VyaXR5IHNwZWNpZmljYXRpb24gc2VjdGlvbiA1LjxwPg0KK1RvIHVzZSB0aGUgd3NzZSBwbHVnaW46PG9sPg0KKzxsaT5SdW4gd3NkbDJoIC10IHR5cGVtYXAuZGF0IG9uIGEgV1NETCBvZiBhIHNlcnZpY2UgdGhhdCByZXF1aXJlcyBXUy1TZWN1cml0eSBoZWFkZXJzLiBUaGUgdHlwZW1hcC5kYXQgZmlsZSBpcyB1c2VkIHRvIHJlY29nbml6ZSBhbmQgdHJhbnNsYXRlIFNlY3VyaXR5IGhlYWRlciBibG9ja3MuPC9saT48bGk+UnVuIHNvYXBjcHAyIG9uIHRoZSBoZWFkZXIgZmlsZSBwcm9kdWNlZCBieSB3c2RsMmguPC9saT48bGk+KFJlLSljb21waWxlIHN0ZHNvYXAyLmMvcHAsIGRvbS5jL3BwLCA8YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84Yy5odG1sIj5zbWRldnAuYzwvYT4sIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sIj53c3NlYXBpLmM8L2E+IGFuZCB0aGUgZ2VuZXJhdGVkIHNvdXJjZSBmaWxlcyB3aXRoIHRoZSAtRFdJVEhfRE9NIGFuZCAtRFdJVEhfT1BFTlNTTCBjb21waWxlIGZsYWdzIHNldC4gVGhlIDxhIGNsYXNzPSJlbCIgaHJlZj0ic21kZXZwXzhjLmh0bWwiPnNtZGV2cC5jPC9hPiBhbmQgd3NzYXBpLmMgZmlsZXMgYXJlIGxvY2F0ZWQgaW4gdGhlICdwbHVnaW4nIGRpcmVjdG9yeS48L2xpPjxsaT5Vc2UgdGhlIHdzc2UgcGx1Z2luIEFQSSBmdW5jdGlvbnMgZGVzY3JpYmVkIGJlbG93IHRvIGFkZCBhbmQgdmVyaWZ5IFNlY3VyaXR5IGhlYWRlcnMuPC9saT48L29sPg0KKzxwPg0KK0FuIGV4YW1wbGUgd3NzZSBjbGllbnQvc2VydmVyIGFwcGxpY2F0aW9uIGNhbiBiZSBmb3VuZCBpbiBzYW1wbGVzL3dzc2UuPHA+DQorVGhlIFNlY3VyaXR5IGhlYWRlciBibG9jayB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIFdTLVNlY3VyaXR5IHNjaGVtYSB3aXRoIHRoZSB3c2RsMmggdG9vbCBhbmQgV1MvV1MtdHlwZW1hcC5kYXQ6PHA+DQorPGRpdiBjbGFzcz0iZnJhZ21lbnQiPjxwcmU+ICAgICQgd3NkbDJoIC1jZWd4eSAtbyB3c3NlLmggLXQgV1MvV1MtdHlwZW1hcC5kYXQgV1Mvd3NzZS54c2QNCis8L3ByZT48L2Rpdj48cD4NCitUaGUgc2FtZSBwcm9jZXNzIHdhcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBoZWFkZXIgZmlsZSA8YSBjbGFzcz0iZWwiIGhyZWY9ImRzXzhoLmh0bWwiPmRzLmg8L2E+IGZyb20gdGhlIFhNTCBkaWdpdGFsIHNpZ25hdHVyZXMgY29yZSBzY2hlbWEuPHA+DQorVGhlIGltcG9ydC93c3NlLmggZmlsZSBoYXMgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uIGZvciB0aGUgU2VjdXJpdHkgaGVhZGVyIGJsb2NrOjxwPg0KKzxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj50eXBlZGVmPC9zcGFuPiA8c3BhbiBjbGFzcz0ia2V5d29yZCI+c3RydWN0IDwvc3Bhbj48YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eS5odG1sIj5fd3NzZV9fU2VjdXJpdHk8L2E+DQoreyAgICAgICA8c3BhbiBjbGFzcz0ia2V5d29yZCI+c3RydWN0IDwvc3Bhbj48YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0X193c3VfX19fX3RpbWVzdGFtcC5odG1sIj5fd3N1X19UaW1lc3RhbXA8L2E+KiAgICAgICAgICAgICAgICAgd3N1X19UaW1lc3RhbXA7DQorICAgICAgICA8c3BhbiBjbGFzcz0ia2V5d29yZCI+c3RydWN0IDwvc3Bhbj48YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0X193c3NlX19fX191c2VybmFtZV90b2tlbi5odG1sIj5fd3NzZV9fVXNlcm5hbWVUb2tlbjwvYT4qICAgICAgICAgICAgVXNlcm5hbWVUb2tlbjsNCisgICAgICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5zdHJ1Y3QgPC9zcGFuPjxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2JpbmFyeV9zZWN1cml0eV90b2tlbi5odG1sIj5fd3NzZV9fQmluYXJ5U2VjdXJpdHlUb2tlbjwvYT4qICAgICAgQmluYXJ5U2VjdXJpdHlUb2tlbjsNCisgICAgICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5zdHJ1Y3QgPC9zcGFuPjxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmF0dXJlX3R5cGUuaHRtbCI+ZHNfX1NpZ25hdHVyZVR5cGU8L2E+KiAgICAgICAgICAgICAgIGRzX19TaWduYXR1cmU7DQorICAgICAgICBAPHNwYW4gY2xhc3M9ImtleXdvcmR0eXBlIj5jaGFyPC9zcGFuPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUF9FTlZfX2FjdG9yOw0KKyAgICAgICAgQDxzcGFuIGNsYXNzPSJrZXl3b3JkdHlwZSI+Y2hhcjwvc3Bhbj4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBfRU5WX19yb2xlOw0KK30gPGEgY2xhc3M9ImNvZGUiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHkuaHRtbCI+X3dzc2VfX1NlY3VyaXR5PC9hPjsNCis8L3ByZT48L2Rpdj48cD4NCitUbyBhZGQgYW4gZW1wdHkgU2VjdXJpdHkgaGVhZGVyIGJsb2NrIHRvIHRoZSBTT0FQIGhlYWRlciwgdXNlOjxwPg0KKzxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPiAgICA8YSBjbGFzcz0iY29kZSIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2EzMSI+c29hcF93c3NlX2FkZF9TZWN1cml0eTwvYT4oc29hcCk7DQorPC9wcmU+PC9kaXY+PHA+DQorVG8gZGVsZXRlIGEgU2VjdXJpdHkgaGVhZGVyLCB1c2U6PHA+DQorPGRpdiBjbGFzcz0iZnJhZ21lbnQiPjxwcmU+ICAgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTMzIj5zb2FwX3dzc2VfZGVsZXRlX1NlY3VyaXR5PC9hPihzb2FwKTsNCis8L3ByZT48L2Rpdj48cD4NCitBZGRpbmcgYW4gZW1wdHkgU2VjdXJpdHkgaGVhZGVyIGJsb2NrIGlzIG5vdCB2ZXJ5IHVzZWZ1bC4gV2Ugd2lsbCBtYWlubHkgbWFrZSB1c2Ugb2YgdGhlIGhpZ2hlci1sZXZlbCBmdW5jdGlvbnMgb2YgdGhlIHdzc2UgcGx1Z2luIHRvIHBvcHVsYXRlIGFuZCB2ZXJpZnkgU2VjdXJpdHkgaGVhZGVyIGNvbnRlbnQuPHA+DQorTm90ZTogVGhlIHNvYXAgY29udGV4dCBpbmNsdWRlcyBhbiBhY3RvciB2YWx1ZSBzb2FwLmFjdG9yIHRoYXQgaXMgcG9wdWxhdGVkIGFuZCByZW5kZXJlZCBhcyB0aGUgU09BUC1FTlY6YWN0b3IgKFNPQVAgMS4xKSBvciBTT0FQLUVOVjpyb2xlIChTT0FQIDEuMikgYXR0cmlidXRlIGluIFhNTCB3aXRoaW4gdGhlIGdlbmVyaWMgU09BUCBIZWFkZXIuIFRoZSBhdHRyaWJ1dGUgaXMgb3B0aW9uYWwsIGJ1dCBzaG91bGQgYmUgdXNlZCB0byB0YXJnZXQgYSByZWNpcGllbnQgc3VjaCBhcyBhbiBpbnRlcm1lZGlhdGUgbm9kZSB0byBwcm9jZXNzIHRoZSBTT0FQIGhlYWRlci4gSW4gY29udHJhc3QsIGFjdG9yIG9yIHJvbGUgYXR0cmlidXRlcyB3aXRoaW4gU2VjdXJpdHkgaGVhZGVyIGJsb2NrcyB0YXJnZXQgc3BlY2lmaWMgcmVjaXBpZW50cyB0byBwcm9jZXNzIHRoZSBTZWN1cml0eSBoZWFkZXIgYmxvY2suIFRoZSBnU09BUCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBhdXRvbWF0ZSB0aGlzIGZlYXR1cmUgYW5kIGFwcGxpY2F0aW9uIHNob3VsZCBzZXQgYW5kIGNoZWNrIHRoZSBhY3Rvci9yb2xlIGF0dHJpYnV0ZSB3aGVuIG5lY2Vzc2FyeS4gSW4gYWRkaXRpb24sIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIHRoZSBpbmNsdXNpb24gb2YgYSBzaW5nbGUgU2VjdXJpdHkgaGVhZGVyIGJsb2NrIGluIHRoZSBTT0FQIGhlYWRlci48cD4NCitUbyBwb3B1bGF0ZSB0aGUgU09BUC1FTlY6YWN0b3Igb3IgU09BUC1FTlY6cm9sZSBhdHRyaWJ1dGUgd2l0aGluIHRoZSBTZWN1cml0eSBoZWFkZXIsIHVzZTo8cD4NCis8ZGl2IGNsYXNzPSJmcmFnbWVudCI+PHByZT4gICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMzIiPnNvYXBfd3NzZV9hZGRfU2VjdXJpdHlfYWN0b3I8L2E+KHNvYXAsIDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4icmVjaXBpZW50Ijwvc3Bhbj4pOw0KKzwvcHJlPjwvZGl2PjxwPg0KK1RvIG9idGFpbiB0aGUgYWN0b3Igb3Igcm9sZSB2YWx1ZSAoZS5nLiBhZnRlciByZWNlaXZpbmcgYSBtZXNzYWdlKSwgdXNlOjxwPg0KKzxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPiAgICA8YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eS5odG1sIj5fd3NzZV9fU2VjdXJpdHk8L2E+ICpzZWN1cml0eSA9IDxhIGNsYXNzPSJjb2RlIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTM0Ij5zb2FwX3dzc2VfU2VjdXJpdHk8L2E+KHNvYXApOw0KKyAgICA8c3BhbiBjbGFzcz0ia2V5d29yZGZsb3ciPmlmPC9zcGFuPiAoc2VjdXJpdHkpDQorICAgIHsgLi4uID0gc2VjdXJpdHktJmd0OzxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5Lmh0bWwjbzQiPlNPQVBfRU5WX19hY3RvcjwvYT47IDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBTT0FQIDEuMTwvc3Bhbj4NCisgICAgICAuLi4gPSBzZWN1cml0eS0mZ3Q7PGEgY2xhc3M9ImNvZGUiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHkuaHRtbCNvNSI+U09BUF9FTlZfX3JvbGU8L2E+OyAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIFNPQVAgMS4yPC9zcGFuPg0KKzwvcHJlPjwvZGl2PjxwPg0KK1RoZSBTT0FQLUVOVjptdXN0VW5kZXJzdGFuZCBhdHRyaWJ1dGUgaXMgYXV0b21hdGljYWxseSBhZGRlZCBhbmQgY2hlY2tlZCBieSB0aGUgZ1NPQVAgZW5naW5lLiBBIGdTT0FQIGFwcGxpY2F0aW9uIGNvbXBpbGVkIHdpdGhvdXQgU2VjdXJpdHkgc3VwcG9ydCB3aWxsIHJlamVjdCBTZWN1cml0eSBoZWFkZXJzLjxwPg0KK1NlY3VyaXR5IGhlYWRlciBibG9ja3MgYXJlIGF0dGFjaGVkIHRvIHRoZSBzb2FwIGNvbnRleHQsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGluZm9ybWF0aW9uIHdpbGwgYmUgYXV0b21hdGljYWxseSBrZXB0IHRvIHN1cHBvcnQgbXVsdGlwbGUgaW52b2NhdGlvbnMuPGgyPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Indzc2VfNiI+DQorU2VjdXJpdHkgVG9rZW5zPC9hPjwvaDI+DQorVGhlIG1hdGVyaWFsIGluIHRoaXMgc2VjdGlvbiByZWxhdGVzIHRvIHRoZSBXUy1TZWN1cml0eSBzcGVjaWZpY2F0aW9uIHNlY3Rpb24gNi48aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0id3NzZV82XzIiPg0KK1VzZXIgTmFtZSBUb2tlbjwvYT48L2gzPg0KK1RvIGFkZCBhIHVzZXIgbmFtZSB0b2tlbiB0byB0aGUgU2VjdXJpdHkgaGVhZGVyIGJsb2NrLCB1c2U6PHA+DQorPGRpdiBjbGFzcz0iZnJhZ21lbnQiPjxwcmU+ICAgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTQxIj5zb2FwX3dzc2VfYWRkX1VzZXJuYW1lVG9rZW5UZXh0PC9hPihzb2FwLCA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+IklkIjwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4idXNlcm5hbWUiPC9zcGFuPiwgTlVMTCk7DQorPC9wcmU+PC9kaXY+PHA+DQorVGhlIElkIHZhbHVlIGlzIG9wdGlvbmFsLiBXaGVuIG5vbi1OVUxMIHRoZSB1c2VyIG5hbWUgdG9rZW4gaXMgaW5jbHVkZWQgaW4gdGhlIGRpZ2l0YWwgc2lnbmF0dXJlIHRvIHByb3RlY3QgaXRzIGludGVncml0eS4gSXQgaXMgY29tbW9uIGZvciB0aGUgd3NzZSBwbHVnaW4gZnVuY3Rpb25zIHRvIGFjY2VwdCBzdWNoIElkcywgd2hpY2ggYXJlIHNlcmlhbGl6ZWQgYXMgd3N1OklkIGlkZW50aWZpZXJzIGZvciBjcm9zcy1yZWZlcmVuY2luZyBYTUwgZWxlbWVudHMuIFRoZSBzaWduYXR1cmUgZW5naW5lIG9mIHRoZSB3c3NlIHBsdWdpbiBpcyBkZXNpZ25lZCB0byBhdXRvbWF0aWNhbGx5IHNpZ24gYWxsIHdzdTpJZCBhdHRyaWJ1dGVkIGVsZW1lbnRzIHRvIHNpbXBsaWZ5IHRoZSBjb2RlIHlvdSBuZWVkIHRvIHdyaXRlIHRvIGltcGxlbWVudCB0aGUgc2lnbmluZyBwcm9jZXNzLjxwPg0KK1RvIGFkZCBhIHVzZXIgbmFtZSB0b2tlbiB3aXRoIGNsZWFyIHRleHQgcGFzc3dvcmQsIHVzZTo8cD4NCis8ZGl2IGNsYXNzPSJmcmFnbWVudCI+PHByZT4gICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNDEiPnNvYXBfd3NzZV9hZGRfVXNlcm5hbWVUb2tlblRleHQ8L2E+KHNvYXAsIDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iSWQiPC9zcGFuPiwgPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJ1c2VybmFtZSI8L3NwYW4+LCA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+InBhc3N3b3JkIjwvc3Bhbj4pOw0KKzwvcHJlPjwvZGl2PjxwPg0KK0l0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIHVzZSA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhMjQiPnNvYXBfd3NzZV9hZGRfVXNlcm5hbWVUb2tlblRleHQ8L2E+IG9ubHkgaW4gY29tYmluYXRpb24gd2l0aCBIVFRQUyBlbmNyeXB0ZWQgdHJhbnNtaXNzaW9uIG9yIG5vdCBhdCBhbGwuIEEgYmV0dGVyIGFsdGVybmF0aXZlIGlzIHRvIHVzZSBwYXNzd29yZCBkaWdlc3RzLiBXaXRoIHBhc3N3b3JkIGRpZ2VzdCBhdXRoZW50aWNhdGlvbiwgdGhlIGRpZ2VzdCB2YWx1ZSBvZiBhIHBhc3N3b3JkICh3aXRoIG1lc3NhZ2UgY3JlYXRpb24gdGltZSBhbmQgYSByYW5kb20gbm9uY2UpIGlzIGNvbXBhcmVkIG9uIGJvdGggc2lkZXMsIHRodXMgZWxpbWluYXRpbmcgdGhlIG5lZWQgdG8gZXhjaGFuZ2UgYSBwYXNzd29yZCBvdmVyIHRoZSB3aXJlLjxwPg0KK1RvIGFkZCBhIHVzZXIgbmFtZSB0b2tlbiB3aXRoIHBhc3N3b3JkIGRpZ2VzdCwgdXNlOjxwPg0KKzxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPiAgICA8YSBjbGFzcz0iY29kZSIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E0MiI+c29hcF93c3NlX2FkZF9Vc2VybmFtZVRva2VuRGlnZXN0PC9hPihzb2FwLCA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+IklkIjwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4idXNlcm5hbWUiPC9zcGFuPiwgPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJwYXNzd29yZCI8L3NwYW4+KTsNCis8L3ByZT48L2Rpdj48cD4NCitBbHRob3VnaCB0aGUgcGFzc3dvcmQgc3RyaW5nIGlzIHBhc3NlZCB0byB0aGlzIGZ1bmN0aW9uLCBpdCBpcyBub3QgcmVuZGVyZWQgaW4gWE1MIG9yIHN0b3JlZCBpbiBhIG1lc3NhZ2UgbG9nLiBJdCBoYXMgYmVlbiBhcmd1ZWQgdGhhdCB0aGlzIGFwcHJvYWNoIGFkb3B0ZWQgYnkgdGhlIFdTLVNlY3VyaXR5IHByb3RvY29sIGlzIHN0aWxsIHZ1bG5lcmFibGUgc2luY2UgdGhlIGFwcGxpY2F0aW9uIHJldHJpZXZlcyB0aGUgcGFzc3dvcmQgaW4gdGV4dCBmb3JtIHJlcXVpcmluZyBhIGRhdGFiYXNlIHRvIHN0b3JlIHBhc3N3b3JkcyBpbiBjbGVhciB0ZXh0LiBIb3dldmVyLCBhIGRpZ2VzdCBhbGdvcml0aG0gY2FuIGJlIHVzZWQgdG8gaGFzaCB0aGUgcGFzc3dvcmRzIGFuZCBzdG9yZSB0aGVpciBkaWdlc3RzIGluc3RlYWQsIHdoaWNoIGVsaW1pbmF0ZXMgdGhlIG5lZWQgdG8gc3RvcmUgY2xlYXItdGV4dCBwYXNzd29yZHMuIE5vdGUgdGhhdCB0aGlzIGlzIGEgY29tbW9uIGFwcHJvYWNoIGFkb3B0ZWQgYnkgVW5peCBmb3IgZGVjYWRlcy48cD4NCitCeSBzZXR0aW5nIHRoZSBJZCB2YWx1ZSB0byBhIHVuaXF1ZSBzdHJpbmcsIHRoZSB1c2VyIG5hbWUgdG9rZW4gaXMgYWxzbyBkaWdpdGFsbHkgc2lnbmVkIGJ5IHRoZSBzaWduYXR1cmUgZW5naW5lIGZ1cnRoZXIgcHJldmVudGluZyB0YW1wZXJpbmcgd2l0aCBpdHMgdmFsdWUuPHA+DQorWW91IG11c3QgdXNlIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2EyNSI+c29hcF93c3NlX2FkZF9Vc2VybmFtZVRva2VuRGlnZXN0PC9hPiBmb3IgZWFjaCBtZXNzYWdlIGV4Y2hhbmdlIHRvIHJlZnJlc2ggdGhlIHBhc3N3b3JkIGRpZ2VzdCBldmVuIHdoZW4gdGhlIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgYXJlIG5vdCBjaGFuZ2VkLiBPdGhlcndpc2UsIHRoZSByZWNlaXZlciBtaWdodCBmbGFnIHRoZSBtZXNzYWdlIGFzIGEgcmVwbGF5IGF0dGFjay48cD4NCitDbGVhci10ZXh0IHBhc3N3b3JkcyBhbmQgcGFzc3dvcmQgZGlnZXN0cyBhcmUgdmVyaWZpZWQgd2l0aCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhMjgiPnNvYXBfd3NzZV92ZXJpZnlfUGFzc3dvcmQ8L2E+LiBUbyB2ZXJpZnkgYSBwYXNzd29yZCBhdCB0aGUgcmVjZWl2aW5nIHNpZGUgdG8gYXV0aG9yaXplIGEgcmVxdWVzdCAoZS5nLiB3aXRoaW4gYSBXZWIgc2VydmljZSBvcGVyYXRpb24pLCB1c2U6PHA+DQorPGRpdiBjbGFzcz0iZnJhZ21lbnQiPjxwcmU+ICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkdHlwZSI+aW50PC9zcGFuPiBuc19fbXlNZXRob2QoPHNwYW4gY2xhc3M9ImtleXdvcmQiPnN0cnVjdDwvc3Bhbj4gc29hcCAqc29hcCwgLi4uKQ0KKyAgICB7IDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5jb25zdDwvc3Bhbj4gPHNwYW4gY2xhc3M9ImtleXdvcmR0eXBlIj5jaGFyPC9zcGFuPiAqdXNlcm5hbWUgPSA8YSBjbGFzcz0iY29kZSIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E0NCI+c29hcF93c3NlX2dldF9Vc2VybmFtZTwvYT4oc29hcCk7DQorICAgICAgPHNwYW4gY2xhc3M9ImtleXdvcmQiPmNvbnN0PC9zcGFuPiA8c3BhbiBjbGFzcz0ia2V5d29yZHR5cGUiPmNoYXI8L3NwYW4+ICpwYXNzd29yZDsNCisgICAgICA8c3BhbiBjbGFzcz0ia2V5d29yZGZsb3ciPmlmPC9zcGFuPiAoIXVzZXJuYW1lKQ0KKyAgICAgICAgPHNwYW4gY2xhc3M9ImtleXdvcmRmbG93Ij5yZXR1cm48L3NwYW4+IHNvYXAtJmd0O2Vycm9yOyA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gbm8gdXNlcm5hbWU6IHJldHVybiBGYWlsZWRBdXRoZW50aWNhdGlvbjwvc3Bhbj4NCisgICAgICBwYXNzd29yZCA9IC4uLjsgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIGxvb2t1cCBwYXNzd29yZCBvZiB1c2VybmFtZTwvc3Bhbj4NCisgICAgICA8c3BhbiBjbGFzcz0ia2V5d29yZGZsb3ciPmlmPC9zcGFuPiAoPGEgY2xhc3M9ImNvZGUiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNDUiPnNvYXBfd3NzZV92ZXJpZnlfUGFzc3dvcmQ8L2E+KHNvYXAsIHBhc3N3b3JkKSkNCisgICAgICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkZmxvdyI+cmV0dXJuPC9zcGFuPiBzb2FwLSZndDtlcnJvcjsgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIHBhc3N3b3JkIHZlcmlmaWNhdGlvbiBmYWlsZWQ6IHJldHVybiBGYWlsZWRBdXRoZW50aWNhdGlvbjwvc3Bhbj4NCisgICAgICAuLi4gPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIHByb2Nlc3MgcmVxdWVzdDwvc3Bhbj4NCisgICAgICA8c3BhbiBjbGFzcz0ia2V5d29yZGZsb3ciPnJldHVybjwvc3Bhbj4gU09BUF9PSzsNCisgICAgfQ0KKzwvcHJlPjwvZGl2PjxwPg0KK05vdGUgdGhhdCB0aGUgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTI3Ij5zb2FwX3dzc2VfZ2V0X1VzZXJuYW1lPC9hPiBmdW5jdGlvbnMgc2V0cyB0aGUgd3NzZTpGYWlsZWRBdXRoZW50aWNhdGlvbiBmYXVsdC4gSXQgaXMgY29tbW9uIGZvciB0aGUgd3NzZSBwbHVnaW4gZnVuY3Rpb25zIHRvIHJldHVybiBTT0FQX09LIG9yIGEgd3NzZSBmYXVsdCB0aGF0IHNob3VsZCBiZSBwYXNzZWQgdG8gdGhlIHNlbmRlciBieSByZXR1cm5pbmcgc29hcC0mZ3Q7ZXJyb3IgZnJvbSBzZXJ2aWNlIG9wZXJhdGlvbnMuIFRoZSBmYXVsdCBpcyBkaXNwbGF5ZWQgd2l0aCB0aGUgc29hcF9wcmludF9mYXVsdCBmdW5jdGlvbi48cD4NCitQYXNzd29yZCBkaWdlc3QgYXV0aGVudGljYXRpb24gcHJldmVudHMgbWVzc2FnZSByZXBsYXkgYXR0YWNrcy4gVGhlIHdzc2UgcGx1Z2luIGtlZXBzIGEgZGF0YWJhc2Ugb2YgcGFzc3dvcmQgZGlnZXN0cyB0byB0aHdhcnQgcmVwbGF5IGF0dGFja3MuIFRoaXMgaXMgdGhlIG9ubHkgcGFydCBpbiB0aGUgcGx1Z2luIGNvZGUgdGhhdCByZXF1aXJlcyBtdXRleCBwcm92aWRlZCBieSB0aHJlYWRzLmguIE9mIGNvdXJzZSwgdGhpcyBvbmx5IHdvcmtzIGNvcnJlY3RseSBpZiB0aGUgc2VydmVyIGlzIHBlcnNpc3RlbnQsIHN1Y2ggYXMgYSBzdGFuZC1hbG9uZSBzZXJ2aWNlLiBOb3RlIHRoYXQgQ0dJLWJhc2VkIHNlcnZpY2VzIGRvIG5vdCBrZWVwIHN0YXRlLiBNYWNoaW5lIGNsb2NrcyBtdXN0IGJlIHN5bmNocm9uaXplZCBhbmQgY2xvY2sgc2tldyBzaG91bGQgbm90IGV4Y2VlZCA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMSI+U09BUF9XU1NFX0NMS1NLRVc8L2E+IGF0IHRoZSBzZXJ2ZXIgc2lkZS48aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0id3NzZV82XzMiPg0KK0JpbmFyeSBTZWN1cml0eSBUb2tlbnM8L2E+PC9oMz4NCitYNTA5IGNlcnRpZmljYXRlcyBhcmUgY29tbW9ubHkgaW5jbHVkZWQgaW4gU2VjdXJpdHkgaGVhZGVyIGJsb2NrcyBhcyBiaW5hcnkgc2VjdXJpdHkgdG9rZW5zLiBBIGNlcnRpZmljYXRlIGlzIHVzZWQgdG8gdmVyaWZ5IHRoZSBkaWdpdGFsIHNpZ25hdHVyZSBvZiBhIGRpZ2l0YWxseSBzaWduZWQgbWVzc2FnZSB1c2luZyB0aGUgcHVibGljIGtleSBlbWJlZGRlZCB3aXRoaW4gdGhlIGNlcnRpZmljYXRlLiBUaGUgY2VydGlmaWNhdGUgaXRzZWxmIGlzIHNpZ25lZCBieSBhIGNlcnRpZmljYXRlIGF1dGhvcml0eSAoQ0EpIHRoYXQgdm91Y2hlcyBmb3IgdGhlIGF1dGhlbnRpY2l0eSBvZiB0aGUgY2VydGlmaWNhdGUsIGkuZS4gdG8gcHJvdmUgdGhlIGlkZW50aWZ5IG9mIHRoZSBtZXNzYWdlIG9yaWdpbmF0b3IuIFRoaXMgdmVyaWZpY2F0aW9uIHByb2Nlc3MgaXMgaW1wb3J0YW50LCBiZWNhdXNlIGRpZ2l0YWwgc2lnbmF0dXJlcyBhcmUgdXNlbGVzcyB3aXRob3V0IHZlcmlmaWNhdGlvbjogYW4gYXR0YWNrZXIgY291bGQgc2ltcGx5IHJlcGxhY2UgdGhlIG1lc3NhZ2UsIHNpZ24gaXQsIGFuZCByZXBsYWNlIHRoZSBjZXJ0aWZpY2F0ZS48cD4NCitDZXJ0aWZpY2F0ZXMgYXJlIGF1dG9tYXRpY2FsbHkgdmVyaWZpZWQgYnkgdGhlIHdzc2UgcGx1Z2luIHNpZ25hdHVyZSBlbmdpbmUgd2hlbiByZWNlaXZlZCBhbmQgYWNjZXNzZWQsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGNlcnRpZmljYXRlcyBvZiB0aGUgQ0FzIG11c3QgYmUgbWFkZSBhY2Nlc3NpYmxlIHRvIHRoZSB3c3NlIHBsdWdpbiBhcyBmb2xsb3dzOjxwPg0KKzxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPiAgICBzb2FwLSZndDtjYWZpbGUgPSA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+ImNhY2VydHMucGVtIjwvc3Bhbj47ICA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gdXNlIHRoaXM8L3NwYW4+DQorICAgIHNvYXAtJmd0O2NhcGF0aCA9IDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iZGlyL3RvL2NlcnRzIjwvc3Bhbj47IDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBhbmQvb3IgcG9pbnQgdG8gQ0EgY2VydHM8L3NwYW4+DQorICAgIHNvYXAtJmd0O2NybGZpbGUgPSA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+InJldm9rZWQucGVtIjwvc3Bhbj47IDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyB1c2UgQ1JMIChvcHRpb25hbCk8L3NwYW4+DQorPC9wcmU+PC9kaXY+PHA+DQorVGhlIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2EzNSI+c29hcF93c3NlX3ZlcmlmeV9YNTA5PC9hPiBmdW5jdGlvbiBjaGVja3MgdGhlIHZhbGlkaXR5IG9mIGEgY2VydGlmaWNhdGUuIFRoZSBjaGVjayBpcyBhdXRvbWF0aWNhbGx5IHBlcmZvcm1lZC4gVGhlIGNoZWNrIGlzIGFsc28gcGVyZm9ybWVkIHdoZW4gcmV0cmlldmluZyB0aGUgY2VydGlmaWNhdGUgZnJvbSBhIFNlY3VyaXR5IGhlYWRlciBibG9jaywgZWl0aGVyIGF1dG9tYXRpY2FsbHkgYnkgdGhlIHdzc2UgcGx1Z2luJ3Mgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBlbmdpbmUgb3IgbWFudWFsbHkgYXMgZm9sbG93czo8cD4NCis8ZGl2IGNsYXNzPSJmcmFnbWVudCI+PHByZT4gICAgWDUwOSAqY2VydCA9IDxhIGNsYXNzPSJjb2RlIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTUxIj5zb2FwX3dzc2VfZ2V0X0JpbmFyeVNlY3VyaXR5VG9rZW5YNTA5PC9hPihzb2FwLCA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+IklkIjwvc3Bhbj4pOw0KKzwvcHJlPjwvZGl2PjxwPg0KK3doZXJlIElkIGlzIHRoZSBpZGVudGlmaWNhdGlvbiBzdHJpbmcgb2YgdGhlIGJpbmFyeSBzZWN1cml0eSB0b2tlbiBvciBOVUxMLjxwPg0KK1RoZSB2ZXJpZmljYXRpb24gaXMgYW4gZXhwZW5zaXZlIHByb2Nlc3MgdGhhdCB3aWxsIGJlIG9wdGltaXplZCBpbiBmdXR1cmUgcmVsZWFzZXMgYnkgY2FjaGluZyB0aGUgY2VydGlmaWNhdGUgY2hhaW4uPHA+DQorVG8gYXR0YWNoIGEgYmluYXJ5IHNlY3VyaXR5IHRva2VuIHN0b3JlZCBpbiBhIFBFTSBmaWxlIHRvIGEgU2VjdXJpdHkgaGVhZGVyIGJsb2NrIGZvciB0cmFuc21pc3Npb24sIHVzZTo8cD4NCis8ZGl2IGNsYXNzPSJmcmFnbWVudCI+PHByZT4gICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNDgiPnNvYXBfd3NzZV9hZGRfQmluYXJ5U2VjdXJpdHlUb2tlblBFTTwvYT4oc29hcCwgTlVMTCwgPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJteWNlcnQucGVtIjwvc3Bhbj4pDQorPC9wcmU+PC9kaXY+PHA+DQorQSBiaW5hcnkgc2VjdXJpdHkgdG9rZW4gY2FuIGJlIGF1dG9tYXRpY2FsbHkgc2lnbmVkIGJ5IHNldHRpbmcgaXRzIElkIGF0dHJpYnV0ZTo8cD4NCis8ZGl2IGNsYXNzPSJmcmFnbWVudCI+PHByZT4gICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNDgiPnNvYXBfd3NzZV9hZGRfQmluYXJ5U2VjdXJpdHlUb2tlblBFTTwvYT4oc29hcCwgPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJYNTA5VG9rZW4iPC9zcGFuPiwgPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJteWNlcnQucGVtIjwvc3Bhbj4pDQorPC9wcmU+PC9kaXY+PHA+DQorUmVwZWF0ZWRseSBsb2FkaW5nIGEgY2VydGlmaWNhdGUgZnJvbSBhIFBFTSBmaWxlIGlzIGluZWZmaWNpZW50LiBUbyByZXVzZSBhIGNlcnRpZmljYXRlIGxvYWRlZCBmcm9tIGEgUEVNIGZpbGUgZm9yIG11bHRpcGxlIGludm9jYXRpb25zLCB1c2U6PHA+DQorPGRpdiBjbGFzcz0iZnJhZ21lbnQiPjxwcmU+ICAgIEZJTEUgKmZkID0gZm9wZW4oPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJteWNlcnQucGVtIjwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iciI8L3NwYW4+KTsNCisgICAgWDUwOSAqY2VydCA9IFBFTV9yZWFkX1g1MDkoZmQsIE5VTEwsIE5VTEwsIE5VTEwpOw0KKyAgICBmY2xvc2UoZmQpOw0KKyAgICA8c3BhbiBjbGFzcz0ia2V5d29yZGZsb3ciPmlmPC9zcGFuPiAoPGEgY2xhc3M9ImNvZGUiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNDciPnNvYXBfd3NzZV9hZGRfQmluYXJ5U2VjdXJpdHlUb2tlblg1MDk8L2E+KHNvYXAsIDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iWDUwOVRva2VuIjwvc3Bhbj4sIGNlcnQpKQ0KKyAgICAgIC4uLiA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gYW4gZXJyb3Igb2NjdXJyZWQ8L3NwYW4+DQorPC9wcmU+PC9kaXY+PHA+DQorT3RoZXIgdHlwZXMgb2YgYmluYXJ5IHNlY3VyaXR5IHRva2VucyBjYW4gYmUgYWRkZWQgdG8gdGhlIFNlY3VyaXR5IGhlYWRlciBibG9jayB1c2luZzo8cD4NCis8ZGl2IGNsYXNzPSJmcmFnbWVudCI+PHByZT4gICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNDYiPnNvYXBfd3NzZV9hZGRfQmluYXJ5U2VjdXJpdHlUb2tlbjwvYT4oc29hcCwgPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJJZCI8L3NwYW4+LCA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+InZhbHVlVHlwZSI8L3NwYW4+LCBkYXRhLCBkYXRhbGVuKTsNCis8L3ByZT48L2Rpdj48aDI+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0id3NzZV82XzQiPg0KK1hNTCBUb2tlbnM8L2E+PC9oMj4NCitUaGUgdXNlIGFuZCBwcm9jZXNzaW5nIHJ1bGVzIGZvciBYTUwgdG9rZW5zIHN1Y2ggYXMgU0FNTCBhc3NlcnRpb25zIGlzIHNwZWNpZmljIHRvIGFuIGFwcGxpY2F0aW9uLiBUaGUgd3NzZSBwbHVnaW4gZG9lcyBub3QgYXV0b21hdGUgdGhlIHVzZSBvZiBYTUwgdG9rZW5zLiBUaGUgZGV2ZWxvcGVyIGlzIGVuY291cmFnZWQgdG8gZ2VuZXJhdGUgY29kZSBmb3IgdGhlIFNBTUwgc2NoZW1hIHdpdGggd3NkbDJoIGFuZCBhZGQgdGhlIG5lY2Vzc2FyeSBhc3NlcnRpb25zIHRvIHRoZSBTZWN1cml0eSBoZWFkZXIgYmxvY2s6PHA+DQorPGRpdiBjbGFzcz0iZnJhZ21lbnQiPjxwcmU+PHNwYW4gY2xhc3M9ImtleXdvcmQiPnR5cGVkZWY8L3NwYW4+IDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5zdHJ1Y3QgPC9zcGFuPjxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5Lmh0bWwiPl93c3NlX19TZWN1cml0eTwvYT4NCit7ICAgICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5zdHJ1Y3QgPC9zcGFuPjxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3RfX3dzdV9fX19fdGltZXN0YW1wLmh0bWwiPl93c3VfX1RpbWVzdGFtcDwvYT4qICAgICAgICAgICAgICAgICB3c3VfX1RpbWVzdGFtcDsNCisgICAgICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5zdHJ1Y3QgPC9zcGFuPjxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3VzZXJuYW1lX3Rva2VuLmh0bWwiPl93c3NlX19Vc2VybmFtZVRva2VuPC9hPiogICAgICAgICAgICBVc2VybmFtZVRva2VuOw0KKyAgICAgICAgPHNwYW4gY2xhc3M9ImtleXdvcmQiPnN0cnVjdCA8L3NwYW4+PGEgY2xhc3M9ImNvZGUiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fYmluYXJ5X3NlY3VyaXR5X3Rva2VuLmh0bWwiPl93c3NlX19CaW5hcnlTZWN1cml0eVRva2VuPC9hPiogICAgICBCaW5hcnlTZWN1cml0eVRva2VuOw0KKyAgICAgICAgPHNwYW4gY2xhc3M9ImtleXdvcmQiPnN0cnVjdCA8L3NwYW4+X3NhbWxfX0Fzc2VydGlvbiogICAgICAgICAgICAgICAgc2FtbF9fQXNzZXJ0aW9uOyA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gYWRkZWQ8L3NwYW4+DQorICAgICAgICA8c3BhbiBjbGFzcz0ia2V5d29yZCI+c3RydWN0IDwvc3Bhbj48YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25hdHVyZV90eXBlLmh0bWwiPmRzX19TaWduYXR1cmVUeXBlPC9hPiogICAgICAgICAgICAgICBkc19fU2lnbmF0dXJlOw0KKyAgICAgICAgQDxzcGFuIGNsYXNzPSJrZXl3b3JkdHlwZSI+Y2hhcjwvc3Bhbj4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBfRU5WX19hY3RvcjsNCisgICAgICAgIEA8c3BhbiBjbGFzcz0ia2V5d29yZHR5cGUiPmNoYXI8L3NwYW4+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQX0VOVl9fcm9sZTsNCit9IDxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5Lmh0bWwiPl93c3NlX19TZWN1cml0eTwvYT47DQorPC9wcmU+PC9kaXY+PHA+DQorQWx0ZXJuYXRpdmVseSwgYSBET00gY2FuIGJlIHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIFhNTCB0b2tlbnM6PHA+DQorPGRpdiBjbGFzcz0iZnJhZ21lbnQiPjxwcmU+PHNwYW4gY2xhc3M9InByZXByb2Nlc3NvciI+I2ltcG9ydCAiZG9tLmgiPC9zcGFuPg0KKzxzcGFuIGNsYXNzPSJrZXl3b3JkIj50eXBlZGVmPC9zcGFuPiA8c3BhbiBjbGFzcz0ia2V5d29yZCI+c3RydWN0IDwvc3Bhbj48YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eS5odG1sIj5fd3NzZV9fU2VjdXJpdHk8L2E+DQoreyAgICAgICA8c3BhbiBjbGFzcz0ia2V5d29yZCI+c3RydWN0IDwvc3Bhbj48YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0X193c3VfX19fX3RpbWVzdGFtcC5odG1sIj5fd3N1X19UaW1lc3RhbXA8L2E+KiAgICAgICAgICAgICAgICAgd3N1X19UaW1lc3RhbXA7DQorICAgICAgICA8c3BhbiBjbGFzcz0ia2V5d29yZCI+c3RydWN0IDwvc3Bhbj48YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0X193c3NlX19fX191c2VybmFtZV90b2tlbi5odG1sIj5fd3NzZV9fVXNlcm5hbWVUb2tlbjwvYT4qICAgICAgICAgICAgVXNlcm5hbWVUb2tlbjsNCisgICAgICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5zdHJ1Y3QgPC9zcGFuPjxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2JpbmFyeV9zZWN1cml0eV90b2tlbi5odG1sIj5fd3NzZV9fQmluYXJ5U2VjdXJpdHlUb2tlbjwvYT4qICAgICAgQmluYXJ5U2VjdXJpdHlUb2tlbjsNCisgICAgICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5zdHJ1Y3QgPC9zcGFuPjxhIGNsYXNzPSJjb2RlIiBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmF0dXJlX3R5cGUuaHRtbCI+ZHNfX1NpZ25hdHVyZVR5cGU8L2E+KiAgICAgICAgICAgICAgIGRzX19TaWduYXR1cmU7DQorICAgICAgICA8c3BhbiBjbGFzcz0ia2V5d29yZHR5cGUiPmludDwvc3Bhbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zaXplOw0KKyAgICAgICAgeHNkX19hbnlUeXBlKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueTsNCisgICAgICAgIEA8c3BhbiBjbGFzcz0ia2V5d29yZHR5cGUiPmNoYXI8L3NwYW4+KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQX0VOVl9fYWN0b3I7DQorICAgICAgICBAPHNwYW4gY2xhc3M9ImtleXdvcmR0eXBlIj5jaGFyPC9zcGFuPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUF9FTlZfX3JvbGU7DQorfSA8YSBjbGFzcz0iY29kZSIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eS5odG1sIj5fd3NzZV9fU2VjdXJpdHk8L2E+Ow0KKzwvcHJlPjwvZGl2PjxoMj48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJ3c3NlXzciPg0KK1Rva2VuIFJlZmVyZW5jZXM8L2E+PC9oMj4NCitUaGUgbWF0ZXJpYWwgaW4gdGhpcyBzZWN0aW9uIHJlbGF0ZXMgdG8gdGhlIFdTLVNlY3VyaXR5IHNwZWNpZmljYXRpb24gc2VjdGlvbiA3LjxwPg0KK1RvIHVzZSBhIGNlcnRpZmljYXRlIGZvciBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLCBhZGQgYSBkaXJlY3Qgc2VjdXJpdHkgdG9rZW4gcmVmZXJlbmNlIFVSSSBmb3IgdGhlIHRva2VuIHRvIHRoZSBLZXlJbmZvLCBmb3IgZXhhbXBsZTo8cD4NCis8ZGl2IGNsYXNzPSJmcmFnbWVudCI+PHByZT4gICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNjYiPnNvYXBfd3NzZV9hZGRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlVVJJPC9hPihzb2FwLCA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+IlVSSSI8L3NwYW4+LCA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+InZhbHVlVHlwZSI8L3NwYW4+KTsNCis8L3ByZT48L2Rpdj48cD4NCithbmQ6PHA+DQorPGRpdiBjbGFzcz0iZnJhZ21lbnQiPjxwcmU+ICAgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTY3Ij5zb2FwX3dzc2VfYWRkX0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZVg1MDk8L2E+KHNvYXAsIDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iVVJJIjwvc3Bhbj4pOw0KKzwvcHJlPjwvZGl2PjxwPg0KK0ZvciBYNTA5IGNlcnRpZmljYXRlcyB3ZSB1c2UgdGhpcyB0byBhZGQgYSBiaW5hcnkgc2VjdXJpdHkgdG9rZW4gd2l0aCB0aGUgY2VydGlmaWNhdGUgYW5kIGEgcmVmZXJlbmNlIHRvIHRoZSBsb2NhbCB0b2tlbjo8cD4NCis8ZGl2IGNsYXNzPSJmcmFnbWVudCI+PHByZT4gICAgPHNwYW4gY2xhc3M9ImtleXdvcmRmbG93Ij5pZjwvc3Bhbj4gKDxhIGNsYXNzPSJjb2RlIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTQ3Ij5zb2FwX3dzc2VfYWRkX0JpbmFyeVNlY3VyaXR5VG9rZW5YNTA5PC9hPihzb2FwLCA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+Ilg1MDlUb2tlbiI8L3NwYW4+LCBjZXJ0KQ0KKyAgICAgfHwgPGEgY2xhc3M9ImNvZGUiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNjciPnNvYXBfd3NzZV9hZGRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlWDUwOTwvYT4oc29hcCwgPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiIjWDUwOVRva2VuIjwvc3Bhbj4pKQ0KKyAgICAgIC4uLiA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gYW4gZXJyb3Igb2NjdXJyZWQ8L3NwYW4+DQorPC9wcmU+PC9kaXY+PHA+DQorVGhpcyBmb2xsb3dzIHRoZSByZWNvbW1lbmRlZCBwcmFjdGljZSB0byBwbGFjZSBTZWN1cml0eSB0b2tlbiByZWZlcmVuY2VzIGluIHRoZSBLZXlJbmZvIGVsZW1lbnQgb2YgYSBTaWduYXR1cmUuIFRoZSBLZXlJbmZvIGlzIHVzZWQgdG8gdmVyaWZ5IHRoZSB2YWxpZGl0eSBvZiBhIHNpZ25hdHVyZSB2YWx1ZS48cD4NCitLZXkgaWRlbnRpZmllcnMgY2FuIGJlIHVzZWQgYXMgd2VsbDo8cD4NCis8ZGl2IGNsYXNzPSJmcmFnbWVudCI+PHByZT4gICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNzAiPnNvYXBfd3NzZV9hZGRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlS2V5SWRlbnRpZmllcjwvYT4oc29hcCwgPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJJZCI8L3NwYW4+LCA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+InZhbHVlVHlwZSI8L3NwYW4+LCBkYXRhLCBkYXRhbGVuKTsNCis8L3ByZT48L2Rpdj48cD4NCitFbWJlZGRlZCByZWZlcmVuY2VzIGFyZSBhZGRlZCB3aXRoOjxwPg0KKzxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPiAgICA8YSBjbGFzcz0iY29kZSIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E3MyI+c29hcF93c3NlX2FkZF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VFbWJlZGRlZDwvYT4oc29hcCwgPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJJZCI8L3NwYW4+LCA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+InZhbHVlVHlwZSI8L3NwYW4+KTsNCis8L3ByZT48L2Rpdj48cD4NCitUT0RPIGl0ZW06IGZ1bGwgc3VwcG9ydCBmb3IgZW1iZWRkZWQgcmVmZXJlbmNlIGlzIGN1cnJlbnRseSB1bmRlciBjb25zdHJ1Y3Rpb24uPHA+DQorVGhlIHVzZSBvZiBrZXkgbmFtZXMgaXMgbm90IHJlY29tbWVuZGVkLCBidXQgaW4gY2FzZSB0aGV5IGFyZSByZXF1aXJlZCB0aGV5IGNhbiBiZSBhZGRlZCB3aXRoOjxwPg0KKzxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPiAgICA8YSBjbGFzcz0iY29kZSIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E2NCI+c29hcF93c3NlX2FkZF9LZXlJbmZvX0tleU5hbWU8L2E+KHNvYXAsIDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4ibmFtZSI8L3NwYW4+KTsNCis8L3ByZT48L2Rpdj48aDI+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0id3NzZV84Ij4NCitTaWduYXR1cmVzPC9hPjwvaDI+DQorVGhlIG1hdGVyaWFsIGluIHRoaXMgc2VjdGlvbiByZWxhdGVzIHRvIHRoZSBXUy1TZWN1cml0eSBzcGVjaWZpY2F0aW9uIHNlY3Rpb24gOC48cD4NCitUaGUgd3NzZSBwbHVnaW4gbXVzdCBiZSByZWdpc3RlcmVkIHRvIHNpZ24gYW5kIHZlcmlmeSBtZXNzYWdlczo8cD4NCis8ZGl2IGNsYXNzPSJmcmFnbWVudCI+PHByZT4gICAgc29hcF9yZWdpc3Rlcl9wbHVnaW4oc29hcCwgc29hcF93c3NlKTsNCis8L3ByZT48L2Rpdj48cD4NCitYTUwgc2lnbmF0dXJlcyBhcmUgdXN1YWxseSBjb21wdXRlZCBvdmVyIG5vcm1hbGl6ZWQgWE1MICh0byBlbnN1cmUgdGhlIFhNTCBwcm9jZXNzb3JzIG9mIGludGVybWVkaWF0ZSBub2RlcyBjYW4gYWNjdXJhdGVseSByZXByb2R1Y2UgdGhlIFhNTCkuIFRvIHRoaXMgZW5kLCB0aGUgZXhjbHVzaXZlIGNhbm9uaWNhbCBYTUwgc3RhbmRhcmQgKGV4Yy1jMTRuKSBpcyByZXF1aXJlZCwgd2hpY2ggaXMgc2V0IHVzaW5nIHRoZSBTT0FQX1hNTF9DQU5PTklDQUwgZmxhZzo8cD4NCis8ZGl2IGNsYXNzPSJmcmFnbWVudCI+PHByZT4gICAgPHNwYW4gY2xhc3M9ImtleXdvcmQiPnN0cnVjdCA8L3NwYW4+c29hcCAqc29hcCA9IHNvYXBfbmV3MShTT0FQX1hNTF9DQU5PTklDQUwpOw0KKyAgICBzb2FwX3JlZ2lzdGVyX3BsdWdpbihzb2FwLCBzb2FwX3dzc2UpOw0KKzwvcHJlPjwvZGl2PjxwPg0KK0lmIHlvdSBwcmVmZXIgWE1MIGluZGVudGF0aW9uLCB1c2U6PHA+DQorPGRpdiBjbGFzcz0iZnJhZ21lbnQiPjxwcmU+ICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5zdHJ1Y3QgPC9zcGFuPnNvYXAgKnNvYXAgPSBzb2FwX25ldzEoU09BUF9YTUxfQ0FOT05JQ0FMIHwgU09BUF9YTUxfSU5ERU5UKTsNCisgICAgc29hcF9yZWdpc3Rlcl9wbHVnaW4oc29hcCwgc29hcF93c3NlKTsNCis8L3ByZT48L2Rpdj48cD4NCitOZXh0LCB3ZSBkZWNpZGUgd2hpY2ggc2lnbmF0dXJlIGFsZ29yaXRobSBpcyBhcHByb3ByaWF0ZSB0byB1c2U6PHVsPg0KKzxsaT5ITUFDLVNIQTEgdXNlcyBhIHNlY3JldCBrZXkgKGFsc28ga25vd24gYXMgYSBzaGFyZWQga2V5IGluIHN5bW1ldHJpYyBjcnlwdG9ncmFwaHkpIHRvIHNpZ24gdGhlIFNIQTEgZGlnZXN0IG9mIHRoZSBTaWduZWRJbmZvIGVsZW1lbnQuPC9saT48bGk+RFNBLVNIQTEgdXNlcyBhIERTQSBwcml2YXRlIGtleSB0byBzaWduIHRoZSBTSEExIGRpZ2VzdCBvZiB0aGUgU2lnbmVkSW5mbyBlbGVtZW50LjwvbGk+PGxpPlJTQS1TSEExIHVzZXMgYSBSU0EgcHJpdmF0ZSBrZXkgdG8gc2lnbiB0aGUgU0hBMSBkaWdlc3Qgb2YgdGhlIFNpZ25lZEluZm8gZWxlbWVudC48L2xpPjwvdWw+DQorPHA+DQorSE1BQy1TSEExIGlzIHRoZSBzaW1wbGVzdCBtZXRob2QsIGJ1dCByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCB5b3UgaGF2ZSB0byBtYWtlIGFic29sdXRlbHkgc3VyZSB0aGUga2V5IGlzIGtlcHQgc2VjcmV0IG9uIGJvdGggdGhlIHNlbmRpbmcgYW5kIHJlY2VpdmluZyBzaWRlLiBBcyBsb25nIGFzIHRoZSBzZWNyZXQga2V5IGlzIGNvbmZpZGVudGlhbCwgbWVzc2FnZXMgYXJlIHNlY3VyZWx5IHNpZ25lZC4gSG93ZXZlciwgdGhpcyBpcyB2aXJ0dWFsbHkgaW1wb3NzaWJsZSB3aGVuIGV4Y2hhbmdpbmcgbWVzc2FnZXMgd2l0aCB1bnRydXN0ZWQgZGlzcGFyYXRlIHBhcnRpZXMuIFRoZSBhZHZhbnRhZ2Ugb2YgSE1BQy1TSEExIGlzIHRoZSBzcGVlZCBieSB3aGljaCBtZXNzYWdlcyBhcmUgc2lnbmVkIGFuZCB2ZXJpZmllZC48cD4NCitEU0EtU0hBMSBhbmQgUlNBLVNIQTEgcmVseSBvbiBwdWJsaWMga2V5IGNyeXB0b2dyYXBoeS4gSW4gc2ltcGxpZmllZCB0ZXJtcywgYSBtZXNzYWdlIGlzIHNpZ25lZCB1c2luZyB0aGUgKGNvbmZpZGVudGlhbCEpIHByaXZhdGUga2V5LiBUaGUgcHVibGljIGtleSBpcyB1c2VkIHRvIHZlcmlmeSB0aGUgc2lnbmF0dXJlLiBTaW5jZSBvbmx5IHRoZSBvcmlnaW5hdGluZyBwYXJ0eSBjb3VsZCBoYXZlIHVzZWQgaXRzIHByaXZhdGUga2V5IHRvIHNpZ24gdGhlIG1lc3NhZ2UsIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIG1lc3NhZ2UgaXMgZ3VhcmFudGVlZC4gT2YgY291cnNlLCB3ZSBtdXN0IHRydXN0IHRoZSBwdWJsaWMga2V5IGNhbWUgZnJvbSB0aGUgb3JpZ2luYXRvciAoaXQgaXMgb2Z0ZW4gaW5jbHVkZWQgYXMgYW4gWDUwOSBjZXJ0aWZpY2F0ZSBpbiB0aGUgbWVzc2FnZSkuIFRvIHRoaXMgZW5kLCBhIHRydXN0ZWQgY2VydGlmaWNhdGUgYXV0aG9yaXR5IHNob3VsZCBoYXZlIHNpZ25lZCB0aGUgcHVibGljIGtleSwgdGhlcmVieSBjcmVhdGluZyBhIFg1MDkgY2VydGlmaWNhdGUgdGhhdCBjb250YWlucyB0aGUgcHVibGljIGtleSBhbmQgdGhlIGlkZW50aXR5IG9mIHRoZSBtZXNzYWdlIG9yaWdpbmF0b3IuPGgzPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Indzc2VfOF8yYSI+DQorU2lnbmluZyBNZXNzYWdlczwvYT48L2gzPg0KK0FmdGVyIHRoZSBwbHVnaW4gaXMgcmVnaXN0ZXJlZCBhbmQgYSBzaWduYXR1cmUgYWxnb3JpdGhtIHNlbGVjdGVkLCB0aGUgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTU5Ij5zb2FwX3dzc2Vfc2lnbjwvYT4gZnVuY3Rpb24gb3IgdGhlIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E2MCI+c29hcF93c3NlX3NpZ25fYm9keTwvYT4gZnVuY3Rpb24gaXMgdXNlZCB0byBpbml0aWF0ZSB0aGUgc2lnbmF0dXJlIGVuZ2luZSB0byBhdXRvbWF0aWNhbGx5IHNpZ24gb3V0Ym91bmQgbWVzc2FnZXMuPHA+DQorVGhlIGNvZGUgdG8gc2lnbiB0aGUgU09BUCBCb2R5IG9mIGEgbWVzc2FnZSB1c2luZyBITUFDLVNIQTEgaXM6PHA+DQorPGRpdiBjbGFzcz0iZnJhZ21lbnQiPjxwcmU+ICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5zdGF0aWM8L3NwYW4+IDxzcGFuIGNsYXNzPSJrZXl3b3JkdHlwZSI+Y2hhcjwvc3Bhbj4gaG1hY19rZXlbMTZdID0NCisgICAgeyAweGZmLCAweGVlLCAweGRkLCAweGNjLCAweGJiLCAweGFhLCAweDk5LCAweDg4LA0KKyAgICAgIDB4NzcsIDB4NjYsIDB4NTUsIDB4NDQsIDB4MzMsIDB4MjIsIDB4MTEsIDB4MDAgfTsNCisgICAgPHNwYW4gY2xhc3M9ImtleXdvcmQiPnN0cnVjdCA8L3NwYW4+c29hcCAqc29hcCA9IHNvYXBfbmV3MShTT0FQX1hNTF9DQU5PTklDQUwgfCBTT0FQX1hNTF9JTkRFTlQpOw0KKyAgICBzb2FwX3JlZ2lzdGVyX3BsdWdpbihzb2FwLCBzb2FwX3dzc2UpOw0KKyAgICA8c3BhbiBjbGFzcz0ia2V5d29yZGZsb3ciPmlmPC9zcGFuPiAoPGEgY2xhc3M9ImNvZGUiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNzciPnNvYXBfd3NzZV9zaWduX2JvZHk8L2E+KHNvYXAsIFNPQVBfU01EX0hNQUNfU0hBMSwgaG1hY19rZXksIDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5zaXplb2Y8L3NwYW4+KGhtYWNfa2V5KSkNCisgICAgICAuLi4gPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIGFuIGVycm9yIG9jY3VycmVkPC9zcGFuPg0KKyAgICA8c3BhbiBjbGFzcz0ia2V5d29yZGZsb3ciPmVsc2U8L3NwYW4+IDxzcGFuIGNsYXNzPSJrZXl3b3JkZmxvdyI+aWY8L3NwYW4+IChzb2FwX2NhbGxfbnNfX215TWV0aG9kKHNvYXAsIC4uLikpDQorICAgICAgLi4uIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBhIHRyYW5zbWlzc2lvbiBlcnJvciBvY2N1cnJlZDwvc3Bhbj4NCis8L3ByZT48L2Rpdj48cD4NCitUaGUgaG1hY19rZXkgaXMgc29tZSBzZWNyZXQga2V5IHlvdSBnZW5lcmF0ZWQgZm9yIHRoZSBzZW5kaW5nIHNpZGUgYW5kIHJlY2VpdmluZyBzaWRlIChkb24ndCB1c2UgdGhlIG9uZSBzaG93biBoZXJlKS48cD4NCitBcyBhbHdheXMsIHVzZSBzb2FwX3ByaW50X2ZhdWx0IHRvIGRpc3BsYXkgdGhlIGVycm9yIG1lc3NhZ2UuPHA+DQorVG8gc2lnbiB0aGUgYm9keSBvZiBhbiBvdXRib3VuZCBTT0FQIG1lc3NhZ2UgdXNpbmcgUlNBLVNIQTEgKERTQS1TSEExIGlzIHNpbWlsYXIpLCB3ZSBpbmNsdWRlIHRoZSBYNTA5IGNlcnRpZmljYXRlIHdpdGggdGhlIHB1YmxpYyBrZXkgYXMgYSBCaW5hcnlTZWN1cml0eVRva2VuIGluIHRoZSBoZWFkZXIgYW5kIGEgS2V5SW5mbyByZWZlcmVuY2UgdG8gdGhlIHRva2VuIHRvIGxldCByZWNlaXZlcnMgdXNlIHRoZSBwdWJsaWMga2V5IGluIHRoZSBjZXJ0aWZpY2F0ZSB0byB2ZXJpZnkgdGhlIGF1dGhlbnRpY2l0eSBvZiB0aGUgbWVzc2FnZTo8cD4NCis8ZGl2IGNsYXNzPSJmcmFnbWVudCI+PHByZT4gICAgRklMRSAqZmQ7DQorICAgIEVWUF9QS0VZICpyc2FfcHJpdmF0ZV9rZXk7DQorICAgIFg1MDkgKmNlcnQ7DQorICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5zdHJ1Y3QgPC9zcGFuPnNvYXAgKnNvYXAgPSBzb2FwX25ldzEoU09BUF9YTUxfQ0FOT05JQ0FMIHwgU09BUF9YTUxfSU5ERU5UKTsNCisgICAgc29hcF9yZWdpc3Rlcl9wbHVnaW4oc29hcCwgc29hcF93c3NlKTsNCisgICAgZmQgPSBmb3Blbig8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+InByaXZrZXkucGVtIjwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iciI8L3NwYW4+KTsNCisgICAgcnNhX3ByaXZhdGVfa2V5ID0gUEVNX3JlYWRfUHJpdmF0ZUtleShmZCwgTlVMTCwgTlVMTCwgPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJwYXNzd29yZCI8L3NwYW4+KTsNCisgICAgZmNsb3NlKGZkKTsNCisgICAgZmQgPSBmb3Blbig8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+ImNlcnQucGVtIjwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iciI8L3NwYW4+KTsNCisgICAgWDUwOSAqY2VydCA9IFBFTV9yZWFkX1g1MDkoZmQsIE5VTEwsIE5VTEwsIE5VTEwpOw0KKyAgICBmY2xvc2UoZmQpOw0KKyAgICA8c3BhbiBjbGFzcz0ia2V5d29yZGZsb3ciPmlmPC9zcGFuPiAoPGEgY2xhc3M9ImNvZGUiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNDciPnNvYXBfd3NzZV9hZGRfQmluYXJ5U2VjdXJpdHlUb2tlblg1MDk8L2E+KHNvYXAsIDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iWDUwOVRva2VuIjwvc3Bhbj4sIGNlcnQpDQorICAgICB8fCA8YSBjbGFzcz0iY29kZSIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E2NyI+c29hcF93c3NlX2FkZF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VYNTA5PC9hPihzb2FwLCA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+IiNYNTA5VG9rZW4iPC9zcGFuPikNCisgICAgIHx8IDxhIGNsYXNzPSJjb2RlIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTc3Ij5zb2FwX3dzc2Vfc2lnbl9ib2R5PC9hPihzb2FwLCBTT0FQX1NNRF9TSUdOX1JTQV9TSEExLCByc2FfcHJpdmF0ZV9rZXksIDApKQ0KKyAgICAgIC4uLiA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gYW4gZXJyb3Igb2NjdXJyZWQ8L3NwYW4+DQorICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkZmxvdyI+ZWxzZTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImtleXdvcmRmbG93Ij5pZjwvc3Bhbj4gKHNvYXBfY2FsbF9uc19fbXlNZXRob2Qoc29hcCwgLi4uKSkNCisgICAgICAuLi4gPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIGEgdHJhbnNtaXNzaW9uIGVycm9yIG9jY3VycmVkPC9zcGFuPg0KKzwvcHJlPjwvZGl2PjxwPg0KK1RoZSBwcml2YXRlIGtleSBhbmQgaXRzIGNlcnRpZmljYXRlIGFyZSBvZnRlbiBwbGFjZWQgaW4gdGhlIHNhbWUgZmlsZSwgc2VlIGUuZy4gc2VydmVyLnBlbSBpbiB0aGUgcGFja2FnZS48cD4NCitUbyBzdW1tYXJpemUgdGhlIHNpZ25pbmcgcHJvY2Vzczo8b2w+DQorPGxpPlJlZ2lzdGVyIHRoZSB3c3NlIHBsdWdpbi48L2xpPjxsaT5PYnRhaW4gYW4gSE1BQyBzZWNyZXQga2V5IG9yIGEgRFNBIG9yIFJTQSBwcml2YXRlIGtleS48L2xpPjxsaT5Gb3IgRFNBIG9yIFJTQSwgb2J0YWluIHRoZSBYNTA5IGNlcnRpZmljYXRlIHdpdGggdGhlIHB1YmxpYyBrZXkgc2lnbmVkIGJ5IGEgY2VydGlmaWNhdGUgYXV0aG9yaXR5LjwvbGk+PGxpPkFkZCB0aGUgWDUwOSBjZXJ0aWZpY2F0ZSBhcyBhIEJpbmFyeVNlY3VyaXR5VG9rZW4gdG8gdGhlIGhlYWRlci48L2xpPjxsaT5BZGQgYSBLZXlJbmZvIEJpbmFyeVNlY3VyaXR5VG9rZW5SZWZlcmVuY2UuPC9saT48bGk+SW52b2tlIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E1OSI+c29hcF93c3NlX3NpZ248L2E+IG9yIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E2MCI+c29hcF93c3NlX3NpZ25fYm9keTwvYT4gdG8gc2lnbiB0aGUgbWVzc2FnZS48L2xpPjxsaT5BbHdheXMgY2hlY2sgdGhlIGZ1bmN0aW9uIHJldHVybiB2YWx1ZXMgZm9yIGVycm9ycy4gWW91IGRvbid0IHdhbnQgdG8gcHJvZHVjZSBhbmQgYWNjZXB0IG1lc3NhZ2VzIHdpdGggYW4gaW52YWxpZCBTZWN1cml0eSBoZWFkZXJzLjwvbGk+PC9vbD4NCis8aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0id3NzZV84XzJiIj4NCitTaWduaW5nIE1lc3NhZ2UgUGFydHM8L2E+PC9oMz4NCitUaGUgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTYwIj5zb2FwX3dzc2Vfc2lnbl9ib2R5PC9hPiBmdW5jdGlvbiBzaWducyB0aGUgZW50aXJlIFNPQVAgYm9keS4gSWYgaXQgaXMgZGVzaXJhYmxlIHRvIHNpZ24gaW5kaXZpZHVhbCBwYXJ0cyBvZiBhIG1lc3NhZ2UgdGhlIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E1OSI+c29hcF93c3NlX3NpZ248L2E+IGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkLiBNZXNzYWdlIHBhcnRzIHdpdGggd3N1OklkIGF0dHJpYnV0ZXMgYXJlIHNpZ25lZC4gVGhlc2UgbWVzc2FnZSBwYXJ0cyBzaG91bGQgbm90IGJlIG5lc3RlZCAobmVzdGVkIGVsZW1lbnRzIHdpbGwgbm90IGJlIHNlcGFyYXRlbHkgc2lnbmVkKS48cD4NCitGb3IgZXhhbXBsZSwgY29uc2lkZXIgYSB0cmFuc2FjdGlvbiBpbiB3aGljaCB3ZSBvbmx5IHdhbnQgdG8gc2lnbiBhIGNvbnRyYWN0IGluIHRoZSBTT0FQIEJvZHkuIFRoaXMgYWxsb3dzIHVzIHRvIG1vZGlmeSB0aGUgcmVzdCBvZiB0aGUgbWVzc2FnZSBvciBleHRyYWN0IHRoZSBjb250cmFjdCBpbiBYTUwgYW5kIHBhc3MgaXQgb24gd2l0aCB0aGUgc2lnbmF0dXJlLjxwPg0KK1RoZSBnU09BUCBoZWFkZXIgZmlsZSBpbmNsdWRlcyBhIG15Q29udHJhY3QgZGVjbGFyYXRpb246PHA+DQorPGRpdiBjbGFzcz0iZnJhZ21lbnQiPjxwcmU+ICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5zdHJ1Y3QgPC9zcGFuPm5zX19teUNvbnRyYWN0DQorICAgIHsgQDxzcGFuIGNsYXNzPSJrZXl3b3JkdHlwZSI+Y2hhcjwvc3Bhbj4qIHdzdV9JZCA9IDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iQ29udHJhY3QiPC9zcGFuPjsNCisgICAgICA8c3BhbiBjbGFzcz0ia2V5d29yZHR5cGUiPmNoYXI8L3NwYW4+KiBuYW1lOw0KKyAgICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkdHlwZSI+Y2hhcjwvc3Bhbj4qIHRpdGxlOw0KKyAgICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkdHlwZSI+Y2hhcjwvc3Bhbj4qIHRlcm1zOw0KKyAgICB9Ow0KKyAgICA8c3BhbiBjbGFzcz0ia2V5d29yZHR5cGUiPmludDwvc3Bhbj4gbnNfX215TWV0aG9kKDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5zdHJ1Y3Q8L3NwYW4+IG5zX19teUNvbnRyYWN0IGFncmVlbWVudCwgPHNwYW4gY2xhc3M9ImtleXdvcmR0eXBlIj5ib29sPC9zcGFuPiogYWNjZXB0ZWQpOw0KKzwvcHJlPjwvZGl2PjxwPg0KK1RoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSB3c3U6SWQgaXMgIkNvbnRyYWN0IiBzbyB0aGF0IHdlIGNhbiBpbnN0YW50aWF0ZSB0aGUgc3RydWN0LCBhdXRvbWF0aWNhbGx5IHNpZ24gaXQsIGFuZCBzZW5kIGl0IGFzIGZvbGxvd3M6PHA+DQorPGRpdiBjbGFzcz0iZnJhZ21lbnQiPjxwcmU+ICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5zdHJ1Y3QgPC9zcGFuPm5zX19teUNvbnRyYWN0IGNvbnRyYWN0Ow0KKyAgICA8c3BhbiBjbGFzcz0ia2V5d29yZHR5cGUiPmJvb2w8L3NwYW4+IGFjY2VwdDsNCisgICAgc29hcF9kZWZhdWx0X25zX19teUNvbnRyYWN0KHNvYXAsICZhbXA7Y29udHJhY3QpOw0KKyAgICBjb250cmFjdC5uYW1lID0gLi4uOw0KKyAgICBjb250cmFjdC50aXRsZSA9IC4uLjsNCisgICAgY29udHJhY3QudGVybXMgPSAuLi47DQorICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkZmxvdyI+aWY8L3NwYW4+ICg8YSBjbGFzcz0iY29kZSIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E0NyI+c29hcF93c3NlX2FkZF9CaW5hcnlTZWN1cml0eVRva2VuWDUwOTwvYT4oc29hcCwgPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJYNTA5VG9rZW4iPC9zcGFuPiwgY2VydCkNCisgICAgIHx8IDxhIGNsYXNzPSJjb2RlIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTY3Ij5zb2FwX3dzc2VfYWRkX0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZVg1MDk8L2E+KHNvYXAsIDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iI1g1MDlUb2tlbiI8L3NwYW4+KQ0KKyAgICAgfHwgPGEgY2xhc3M9ImNvZGUiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNzYiPnNvYXBfd3NzZV9zaWduPC9hPihzb2FwLCBTT0FQX1NNRF9TSUdOX1JTQV9TSEExLCByc2FfcHJpdmF0ZV9rZXksIDApKQ0KKyAgICAgIC4uLiA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gYW4gZXJyb3Igb2NjdXJyZWQ8L3NwYW4+DQorICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkZmxvdyI+ZWxzZTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImtleXdvcmRmbG93Ij5pZjwvc3Bhbj4gKHNvYXBfY2FsbF9uc19fbXlNZXRob2Qoc29hcCwgY29udHJhY3QsICZhbXA7YWNjZXB0KSkNCisgICAgICAuLi4gPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIGEgdHJhbnNtaXNzaW9uIGVycm9yIG9jY3VycmVkPC9zcGFuPg0KKzwvcHJlPjwvZGl2PjxoMz48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJ3c3NlXzhfMyI+DQorU2lnbmluZyBUb2tlbnM8L2E+PC9oMz4NCitUbyBzaWduIHNlY3VyaXR5IHRva2VucyBzdWNoIGFzIHVzZXIgbmFtZXMsIHBhc3N3b3JkcywgYW5kIGJpbmFyeSBzZWN1cml0eSB0b2tlbnMsIGp1c3QgYXNzaWduIHRoZWlyIElkIHZhbHVlcyB3aXRoIGEgdW5pcXVlIHN0cmluZywgc3VjaCBhcyAiVGltZSIgZm9yIHRpbWVzdGFtcHMgYW5kICJVc2VyIiBmb3IgdXNlciBuYW1lcy4gRm9yIGV4YW1wbGU6PHA+DQorPGRpdiBjbGFzcz0iZnJhZ21lbnQiPjxwcmU+ICAgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTM4Ij5zb2FwX3dzc2VfYWRkX1RpbWVzdGFtcDwvYT4oc29hcCwgPHNwYW4gY2xhc3M9InN0cmluZ2xpdGVyYWwiPiJUaW1lIjwvc3Bhbj4sIDYwMCk7DQorICAgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTQyIj5zb2FwX3dzc2VfYWRkX1VzZXJuYW1lVG9rZW5EaWdlc3Q8L2E+KHNvYXAsIDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iVXNlciI8L3NwYW4+LCA8c3BhbiBjbGFzcz0ic3RyaW5nbGl0ZXJhbCI+InVzZXJuYW1lIjwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4icGFzc3dvcmQiPC9zcGFuPik7DQorICAgIC4uLiA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gdGhlIHJlc3Qgb2YgdGhlIHNpZ25pbmcgY29kZTwvc3Bhbj4NCis8L3ByZT48L2Rpdj48aDM+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0id3NzZV84XzQiPg0KK1NpZ25hdHVyZSBWYWxpZGF0aW9uPC9hPjwvaDM+DQorVG8gYXV0b21hdGljYWxseSB2ZXJpZnkgdGhlIHNpZ25hdHVyZSBvZiBhbiBpbmJvdW5kIG1lc3NhZ2Ugc2lnbmVkIHdpdGggRFNBIG9yIFJTQSBhbGdvcml0aG1zLCBhc3N1bWluZyB0aGUgbWVzc2FnZSBjb250YWlucyB0aGUgWDUwOSBjZXJ0aWZpY2F0ZSBhcyBhIGJpbmFyeSBzZWN1cml0eSB0b2tlbiwgdXNlOjxwPg0KKzxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPiAgICA8c3BhbiBjbGFzcz0ia2V5d29yZCI+c3RydWN0IDwvc3Bhbj5zb2FwICpzb2FwID0gc29hcF9uZXcxKFNPQVBfWE1MX0NBTk9OSUNBTCB8IFNPQVBfWE1MX0lOREVOVCk7DQorICAgIHNvYXBfcmVnaXN0ZXJfcGx1Z2luKHNvYXAsIHNvYXBfd3NzZSk7DQorICAgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTc5Ij5zb2FwX3dzc2VfdmVyaWZ5X2F1dG88L2E+KHNvYXAsIFNPQVBfU01EX05PTkUsIE5VTEwsIDApOw0KKw0KKyAgICA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gc2VydmVyOjwvc3Bhbj4NCisgICAgPHNwYW4gY2xhc3M9ImtleXdvcmRmbG93Ij5pZjwvc3Bhbj4gKHNvYXBfc2VydmUoc29hcCkpDQorICAgICAgLi4uIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBhbiBlcnJvciBvY2N1cnJlZDwvc3Bhbj4NCisNCisgICAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIGNsaWVudDo8L3NwYW4+DQorICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkZmxvdyI+aWY8L3NwYW4+IChzb2FwX2NhbGxfbnNfX215TWV0aG9kKHNvYXAsIC4uLikpDQorICAgICAgLi4uIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBhbiBlcnJvciBvY2N1cnJlZDwvc3Bhbj4NCis8L3ByZT48L2Rpdj48cD4NCitBbGwgbG9jYWxseSByZWZlcmVuY2VkIGVsZW1lbnRzIGluIHRoZSBzaWduZWQgbWVzc2FnZSB3aWxsIGJlIHZlcmlmaWVkLiBFbGVtZW50cyByZWZlcmVuY2VkIHdpdGggYWJzb2x1dGUgVVJJcyBhcmUgbm90IGF1dG9tYXRpY2FsbHkgdmVyaWZpZWQuIFRoZSByZWNlaXZlZCBtZXNzYWdlIGlzIHN0b3JlZCBpbiBhIERPTSBhY2Nlc3NpYmxlIHdpdGggc29hcC0mZ3Q7ZG9tLiBUaGlzIGVuYWJsZXMgZnVydGhlciBhbmFseXNpcyBvZiB0aGUgbWVzc2FnZSBjb250ZW50LjxwPg0KK1RoZSA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhNjIiPnNvYXBfd3NzZV92ZXJpZnlfYXV0bzwvYT4gZnVuY3Rpb24ga2VlcHMgcHJvY2Vzc2luZyBzaWduZWQgKGFuZCB1bnNpZ25lZCkgbWVzc2FnZXMgYXMgdGhleSBhcnJpdmUuIEZvciB1bnNpZ25lZCBtZXNzYWdlcyB0aGlzIGNhbiBiZSBleHBlbnNpdmUgYW5kIHRoZSB2ZXJpZmljYXRpb24gZW5naW5lIHNob3VsZCBiZSBzaHV0IGRvd24gdXNpbmcgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTYzIj5zb2FwX3dzc2VfdmVyaWZ5X2RvbmU8L2E+LjxwPg0KK1RvIHZlcmlmeSB0aGUgSE1BQyBzaWduYXR1cmUgb2YgYW4gaW5ib3VuZCBtZXNzYWdlLCB0aGUgSE1BQyBrZXkgbXVzdCBiZSBzdXBwbGllZDo8cD4NCis8ZGl2IGNsYXNzPSJmcmFnbWVudCI+PHByZT4gICAgPHNwYW4gY2xhc3M9ImtleXdvcmQiPnN0YXRpYzwvc3Bhbj4gPHNwYW4gY2xhc3M9ImtleXdvcmR0eXBlIj5jaGFyPC9zcGFuPiBobWFjX2tleVsxNl0gPSA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gdGhlIHNhbWUgc2VjcmV0IGtleSB0aGF0IHdhcyB1c2VkIHRvIHNpZ248L3NwYW4+DQorICAgIHsgMHhmZiwgMHhlZSwgMHhkZCwgMHhjYywgMHhiYiwgMHhhYSwgMHg5OSwgMHg4OCwNCisgICAgICAweDc3LCAweDY2LCAweDU1LCAweDQ0LCAweDMzLCAweDIyLCAweDExLCAweDAwIH07DQorICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5zdHJ1Y3QgPC9zcGFuPnNvYXAgKnNvYXAgPSBzb2FwX25ldzEoU09BUF9YTUxfQ0FOT05JQ0FMIHwgU09BUF9YTUxfSU5ERU5UKTsNCisgICAgc29hcF9yZWdpc3Rlcl9wbHVnaW4oc29hcCwgc29hcF93c3NlKTsNCisgICAgPGEgY2xhc3M9ImNvZGUiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNzkiPnNvYXBfd3NzZV92ZXJpZnlfYXV0bzwvYT4oc29hcCwgU09BUF9TTURfSE1BQ19TSEExLCBobWFjX2tleSwgPHNwYW4gY2xhc3M9ImtleXdvcmQiPnNpemVvZjwvc3Bhbj4oaG1hY19rZXkpKTsNCisNCisgICAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIHNlcnZlcjo8L3NwYW4+DQorICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkZmxvdyI+aWY8L3NwYW4+IChzb2FwX3NlcnZlKHNvYXApKQ0KKyAgICAgIC4uLiA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gYW4gZXJyb3Igb2NjdXJyZWQ8L3NwYW4+DQorDQorICAgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBjbGllbnQ6PC9zcGFuPg0KKyAgICA8c3BhbiBjbGFzcz0ia2V5d29yZGZsb3ciPmlmPC9zcGFuPiAoc29hcF9jYWxsX25zX19teU1ldGhvZChzb2FwLCAuLi4pKQ0KKyAgICAgIC4uLiA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gYW4gZXJyb3Igb2NjdXJyZWQ8L3NwYW4+DQorPC9wcmU+PC9kaXY+PHA+DQorVG8gc3VtbWFyaXplIHRoZSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIHByb2Nlc3M6PG9sPg0KKzxsaT5SZWdpc3RlciB0aGUgd3NzZSBwbHVnaW4uPC9saT48bGk+Rm9yIEhNQUMsIG9idGFpbiB0aGUgSE1BQyBzZWNyZXQga2V5PC9saT48bGk+VXNlIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E2MiI+c29hcF93c3NlX3ZlcmlmeV9hdXRvPC9hPiB0byB2ZXJpZnkgaW5ib3VuZCBtZXNzYWdlcy48L2xpPjxsaT5BZnRlciByZWNlaXZpbmcgYSBtZXNzYWdlLCB0aGUgRE9NIGluIHNvYXAtJmd0O2RvbSBjYW4gYmUgdHJhdmVyc2VkIGZvciBmdXJ0aGVyIGFuYWx5c2lzLjwvbGk+PGxpPkFsd2F5cyBjaGVjayB0aGUgZnVuY3Rpb24gcmV0dXJuIHZhbHVlcyBmb3IgZXJyb3JzLiBZb3UgZG9uJ3Qgd2FudCB0byBhY2NlcHQgYSByZXF1ZXN0IG9yIHJlc3BvbnNlIG1lc3NhZ2Ugd2l0aCBhbiBpbnZhbGlkIFNlY3VyaXR5IGhlYWRlci48L2xpPjxsaT5Vc2UgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTYzIj5zb2FwX3dzc2VfdmVyaWZ5X2RvbmU8L2E+IHRvIHRlcm1pbmF0ZSB2ZXJpZmljYXRpb24sIGUuZy4gdG8gY29uc3VtZSBwbGFpbiBtZXNzYWdlcyBtb3JlIGVmZmljaWVudGx5LjwvbGk+PC9vbD4NCis8aDI+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0id3NzZV85Ij4NCitFbmNyeXB0aW9uPC9hPjwvaDI+DQorVGhlIG1hdGVyaWFsIGluIHRoaXMgc2VjdGlvbiByZWxhdGVzIHRvIHRoZSBXUy1TZWN1cml0eSBzcGVjaWZpY2F0aW9uIHNlY3Rpb24gOS48cD4NCitUT0RPIGl0ZW06IGVuY3J5cHRpb24gc3VwcG9ydCBpcyB1bmRlciBjb25zdHJ1Y3Rpb24uPGgyPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9Indzc2VfMTAiPg0KK1NlY3VyaXR5IFRpbWVzdGFtcHM8L2E+PC9oMj4NCitUaGUgbWF0ZXJpYWwgaW4gdGhpcyBzZWN0aW9uIHJlbGF0ZXMgdG8gdGhlIFdTLVNlY3VyaXR5IHNwZWNpZmljYXRpb24gc2VjdGlvbiAxMC48cD4NCitUbyBhZGQgYSB0aW1lc3RhbXAgd2l0aCB0aGUgY3JlYXRpb24gdGltZSB0byB0aGUgU2VjdXJpdHkgaGVhZGVyLCB1c2U6PHA+DQorPGRpdiBjbGFzcz0iZnJhZ21lbnQiPjxwcmU+ICAgIDxhIGNsYXNzPSJjb2RlIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTM4Ij5zb2FwX3dzc2VfYWRkX1RpbWVzdGFtcDwvYT4oc29hcCwgTlVMTCwgMCk7IDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBubyBleHBpcmF0aW9uPC9zcGFuPg0KKzwvcHJlPjwvZGl2PjxwPg0KK1RoZSBsaWZldGltZSBvZiBhIG1lc3NhZ2UgKGluIHNlY29uZHMpIGlzIHBhc3NlZCBhcyB0aGUgdGhpcmQgYXJndW1lbnQsIHdoaWNoIHdpbGwgYmUgZGlzcGxheWVkIGFzIHRoZSB0aW1lc3RhbXAgZXhwaXJhdGlvbiB0aW1lOjxwPg0KKzxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPiAgICA8YSBjbGFzcz0iY29kZSIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2EzOCI+c29hcF93c3NlX2FkZF9UaW1lc3RhbXA8L2E+KHNvYXAsIE5VTEwsIDEwKTsgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIDEwIHNlY29uZHMgbGlmZXRpbWU8L3NwYW4+DQorPC9wcmU+PC9kaXY+PHA+DQorVGltZXN0YW1wcywgbGlrZSBvdGhlciBoZWFkZXIgZWxlbWVudHMsIGFyZSBub3QgYXV0b21hdGljYWxseSBzZWN1cmVkIHdpdGggYSBkaWdpdGFsIHNpZ25hdHVyZS4gVG8gc2VjdXJlIGEgdGltZXN0YW1wLCB3ZSBhZGQgYW4gaWRlbnRpZmllciAod3N1OklkKSB0byBlYWNoIGVsZW1lbnQgd2Ugd2FudCB0aGUgV1MtU2VjdXJpdHkgcGx1Z2luIHRvIHNpZ24gdGhlcmVieSBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3Igc29tZW9uZSB0byB0YW1wZXIgd2l0aCB0aGF0IHBhcnQgb2YgdGhlIG1lc3NhZ2UuIFRvIGRvIHRoaXMgZm9yIHRoZSB0aW1lc3RhbXAsIHdlIHNpbXBseSBwYXNzIGEgdW5pcXVlIGlkZW50aWZpY2F0aW9uIHN0cmluZyBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50OjxwPg0KKzxkaXYgY2xhc3M9ImZyYWdtZW50Ij48cHJlPiAgICA8YSBjbGFzcz0iY29kZSIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2EzOCI+c29hcF93c3NlX2FkZF9UaW1lc3RhbXA8L2E+KHNvYXAsIDxzcGFuIGNsYXNzPSJzdHJpbmdsaXRlcmFsIj4iVGltZSI8L3NwYW4+LCAxMCk7IDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyB0aW1lc3RhbXAgd2lsbCBiZSBzaWduZWQ8L3NwYW4+DQorPC9wcmU+PC9kaXY+PGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIEZyaSBBdWcgMTkgMTA6NDE6NDYgMjAwNSBmb3IgZ1NPQVAgV1MtU2VjdXJpdHkgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvd3NzZV84aC5odG1sIGIvZG9jL3dzc2UvaHRtbC93c3NlXzhoLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFiODlhMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvd3NzZV84aC5odG1sCkBAIC0wLDAgKzEsMzUyIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBXUy1TZWN1cml0eTogL1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3dzc2Uvd3NzZS5oIEZpbGUgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy93c3NlL3dzc2UuaCBGaWxlIFJlZmVyZW5jZTwvaDE+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPkNsYXNzZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c3RydWN0ICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3VzZXJuYW1lX3Rva2VuLmh0bWwiPl93c3NlX19Vc2VybmFtZVRva2VuPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5UaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgd3NzZTpVc2VybmFtZVRva2VuIGVsZW1lbnQgcGVyIFNlY3Rpb24gNC4xLiBJbXBvcnRlZCBlbGVtZW50IF93c3NlX19Vc2VybmFtZVRva2VuIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4gIDxhIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fdXNlcm5hbWVfdG9rZW4uaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zdHJ1Y3QgJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fYmluYXJ5X3NlY3VyaXR5X3Rva2VuLmh0bWwiPl93c3NlX19CaW5hcnlTZWN1cml0eVRva2VuPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5UaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgd3NzZTpCaW5hcnlTZWN1cml0eVRva2VuIGVsZW1lbnQgcGVyIFNlY3Rpb24gNC4yLiBJbXBvcnRlZCBlbGVtZW50IF93c3NlX19CaW5hcnlTZWN1cml0eVRva2VuIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4gIDxhIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fYmluYXJ5X3NlY3VyaXR5X3Rva2VuLmh0bWwjX2RldGFpbHMiPk1vcmUuLi48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c3RydWN0ICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3JlZmVyZW5jZS5odG1sIj5fd3NzZV9fUmVmZXJlbmNlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5UaGlzIGVsZW1lbnQgZGVmaW5lcyBhIHNlY3VyaXR5IHRva2VuIHJlZmVyZW5jZSBJbXBvcnRlZCBlbGVtZW50IF93c3NlX19SZWZlcmVuY2UgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0ic3RydWN0X193c3NlX19fX19yZWZlcmVuY2UuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zdHJ1Y3QgJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fZW1iZWRkZWQuaHRtbCI+X3dzc2VfX0VtYmVkZGVkPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5UaGlzIGVsZW1lbnQgZGVmaW5lcyBhIHNlY3VyaXR5IHRva2VuIGVtYmVkZGVkIHJlZmVyZW5jZSBJbXBvcnRlZCBlbGVtZW50IF93c3NlX19FbWJlZGRlZCBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuICA8YSBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2VtYmVkZGVkLmh0bWwjX2RldGFpbHMiPk1vcmUuLi48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c3RydWN0ICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2tleV9pZGVudGlmaWVyLmh0bWwiPl93c3NlX19LZXlJZGVudGlmaWVyPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5UaGlzIGVsZW1lbnQgZGVmaW5lcyBhIGtleSBpZGVudGlmaWVyIHJlZmVyZW5jZSBJbXBvcnRlZCBlbGVtZW50IF93c3NlX19LZXlJZGVudGlmaWVyIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4gIDxhIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fa2V5X2lkZW50aWZpZXIuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zdHJ1Y3QgJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHlfdG9rZW5fcmVmZXJlbmNlLmh0bWwiPl93c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5UaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgd3NzZTpTZWN1cml0eVRva2VuUmVmZXJlbmNlIHBlciBTZWN0aW9uIDQuMy4gSW1wb3J0ZWQgZWxlbWVudCBfd3NzZV9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZSBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuICA8YSBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5X3Rva2VuX3JlZmVyZW5jZS5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0cnVjdCAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eS5odG1sIj5fd3NzZV9fU2VjdXJpdHk8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSB3c3NlOlNlY3VyaXR5IFNPQVAgaGVhZGVyIGVsZW1lbnQgcGVyIFNlY3Rpb24gNC4gSW1wb3J0ZWQgZWxlbWVudCBfd3NzZV9fU2VjdXJpdHkgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eS5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnN0cnVjdCAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19wYXNzd29yZC5odG1sIj5fd3NzZV9fUGFzc3dvcmQ8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlRoaXMgZWxlbWVudCBjb250YWlucyBwcm9wZXJ0aWVzIGZvciB0cmFuc2Zvcm1hdGlvbnMgZnJvbSBhbnkgbmFtZXNwYWNlLCBpbmNsdWRpbmcgRFNJRy4gJ193c3NlX19UcmFuc2Zvcm1hdGlvblBhcmFtZXRlcnMnIGVsZW1lbnQgZGVmaW5pdGlvbiBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsuICA8YSBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3Bhc3N3b3JkLmh0bWwjX2RldGFpbHMiPk1vcmUuLi48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlR5cGVkZWZzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnR5cGVkZWYgZW51bSA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VfOGguaHRtbCNhMCI+d3NzZV9fRmF1bHRjb2RlRW51bTwvYT4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZV84aC5odG1sI2EwIj53c3NlX19GYXVsdGNvZGVFbnVtPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5UeXBlZGVmIHN5bm9ueW0gZm9yIGVudW0gd3NzZV9fRmF1bHRjb2RlRW51bS4gIDxhIGhyZWY9IiNhMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnR5cGVkZWYgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3VzZXJuYW1lX3Rva2VuLmh0bWwiPl93c3NlX19Vc2VybmFtZVRva2VuPC9hPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlXzhoLmh0bWwjYTEiPl93c3NlX19Vc2VybmFtZVRva2VuPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5UaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgd3NzZTpVc2VybmFtZVRva2VuIGVsZW1lbnQgcGVyIFNlY3Rpb24gNC4xLiBJbXBvcnRlZCBlbGVtZW50IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX191c2VybmFtZV90b2tlbi5odG1sIj5fd3NzZV9fVXNlcm5hbWVUb2tlbjwvYT4gZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2ExIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+dHlwZWRlZiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fYmluYXJ5X3NlY3VyaXR5X3Rva2VuLmh0bWwiPl93c3NlX19CaW5hcnlTZWN1cml0eVRva2VuPC9hPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlXzhoLmh0bWwjYTIiPl93c3NlX19CaW5hcnlTZWN1cml0eVRva2VuPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5UaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgd3NzZTpCaW5hcnlTZWN1cml0eVRva2VuIGVsZW1lbnQgcGVyIFNlY3Rpb24gNC4yLiBJbXBvcnRlZCBlbGVtZW50IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19iaW5hcnlfc2VjdXJpdHlfdG9rZW4uaHRtbCI+X3dzc2VfX0JpbmFyeVNlY3VyaXR5VG9rZW48L2E+IGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4gIDxhIGhyZWY9IiNhMiI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnR5cGVkZWYgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3JlZmVyZW5jZS5odG1sIj5fd3NzZV9fUmVmZXJlbmNlPC9hPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlXzhoLmh0bWwjYTMiPl93c3NlX19SZWZlcmVuY2U8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlRoaXMgZWxlbWVudCBkZWZpbmVzIGEgc2VjdXJpdHkgdG9rZW4gcmVmZXJlbmNlIEltcG9ydGVkIGVsZW1lbnQgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3JlZmVyZW5jZS5odG1sIj5fd3NzZV9fUmVmZXJlbmNlPC9hPiBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTMiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD50eXBlZGVmIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19lbWJlZGRlZC5odG1sIj5fd3NzZV9fRW1iZWRkZWQ8L2E+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VfOGguaHRtbCNhNCI+X3dzc2VfX0VtYmVkZGVkPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5UaGlzIGVsZW1lbnQgZGVmaW5lcyBhIHNlY3VyaXR5IHRva2VuIGVtYmVkZGVkIHJlZmVyZW5jZSBJbXBvcnRlZCBlbGVtZW50IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19lbWJlZGRlZC5odG1sIj5fd3NzZV9fRW1iZWRkZWQ8L2E+IGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4gIDxhIGhyZWY9IiNhNCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnR5cGVkZWYgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2tleV9pZGVudGlmaWVyLmh0bWwiPl93c3NlX19LZXlJZGVudGlmaWVyPC9hPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlXzhoLmh0bWwjYTUiPl93c3NlX19LZXlJZGVudGlmaWVyPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5UaGlzIGVsZW1lbnQgZGVmaW5lcyBhIGtleSBpZGVudGlmaWVyIHJlZmVyZW5jZSBJbXBvcnRlZCBlbGVtZW50IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19rZXlfaWRlbnRpZmllci5odG1sIj5fd3NzZV9fS2V5SWRlbnRpZmllcjwvYT4gZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2E1Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+dHlwZWRlZiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHlfdG9rZW5fcmVmZXJlbmNlLmh0bWwiPl93c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlPC9hPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlXzhoLmh0bWwjYTYiPl93c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5UaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgd3NzZTpTZWN1cml0eVRva2VuUmVmZXJlbmNlIHBlciBTZWN0aW9uIDQuMy4gSW1wb3J0ZWQgZWxlbWVudCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHlfdG9rZW5fcmVmZXJlbmNlLmh0bWwiPl93c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlPC9hPiBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTYiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD50eXBlZGVmIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eS5odG1sIj5fd3NzZV9fU2VjdXJpdHk8L2E+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VfOGguaHRtbCNhNyI+X3dzc2VfX1NlY3VyaXR5PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5UaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgd3NzZTpTZWN1cml0eSBTT0FQIGhlYWRlciBlbGVtZW50IHBlciBTZWN0aW9uIDQuIEltcG9ydGVkIGVsZW1lbnQgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5Lmh0bWwiPl93c3NlX19TZWN1cml0eTwvYT4gZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LiAgPGEgaHJlZj0iI2E3Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+dHlwZWRlZiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fcGFzc3dvcmQuaHRtbCI+X3dzc2VfX1Bhc3N3b3JkPC9hPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlXzhoLmh0bWwjYTgiPl93c3NlX19QYXNzd29yZDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VGhpcyBlbGVtZW50IGNvbnRhaW5zIHByb3BlcnRpZXMgZm9yIHRyYW5zZm9ybWF0aW9ucyBmcm9tIGFueSBuYW1lc3BhY2UsIGluY2x1ZGluZyBEU0lHLiAnX3dzc2VfX1RyYW5zZm9ybWF0aW9uUGFyYW1ldGVycycgZWxlbWVudCBkZWZpbml0aW9uIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4gIDxhIGhyZWY9IiNhOCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5FbnVtZXJhdGlvbnM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+ZW51bSAmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZV84aC5odG1sI2ExNiI+d3NzZV9fRmF1bHRjb2RlRW51bTwvYT4geyA8YnI+DQorJm5ic3A7Jm5ic3A7PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlXzhoLmh0bWwjYTE2YTkiPndzc2VfX1Vuc3VwcG9ydGVkU2VjdXJpdHlUb2tlbjwvYT4sIA0KKzxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZV84aC5odG1sI2ExNmExMCI+d3NzZV9fVW5zdXBwb3J0ZWRBbGdvcml0aG08L2E+LCANCis8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VfOGguaHRtbCNhMTZhMTEiPndzc2VfX0ludmFsaWRTZWN1cml0eTwvYT4sIA0KKzxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZV84aC5odG1sI2ExNmExMiI+d3NzZV9fSW52YWxpZFNlY3VyaXR5VG9rZW48L2E+LCANCis8YnI+DQorJm5ic3A7Jm5ic3A7PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlXzhoLmh0bWwjYTE2YTEzIj53c3NlX19GYWlsZWRBdXRoZW50aWNhdGlvbjwvYT4sIA0KKzxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZV84aC5odG1sI2ExNmExNCI+d3NzZV9fRmFpbGVkQ2hlY2s8L2E+LCANCis8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VfOGguaHRtbCNhMTZhMTUiPndzc2VfX1NlY3VyaXR5VG9rZW5VbmF2YWlsYWJsZTwvYT4NCis8YnI+DQorIH08L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6RmF1bHRjb2RlRW51bSBpcyBhIHNpbXBsZVR5cGUgcmVzdHJpY3Rpb24gb2YgeHM6UU5hbWUuICA8YSBocmVmPSIjYTE2Ij5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPC90YWJsZT4NCis8aHI+PGgyPlR5cGVkZWYgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTIiIGRveHl0YWc9Indzc2UuaDo6X3dzc2VfX0JpbmFyeVNlY3VyaXR5VG9rZW4iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdHlwZWRlZiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2JpbmFyeV9zZWN1cml0eV90b2tlbi5odG1sIj5fd3NzZV9fQmluYXJ5U2VjdXJpdHlUb2tlbjwvYT4gIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19iaW5hcnlfc2VjdXJpdHlfdG9rZW4uaHRtbCI+X3dzc2VfX0JpbmFyeVNlY3VyaXR5VG9rZW48L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIHdzc2U6QmluYXJ5U2VjdXJpdHlUb2tlbiBlbGVtZW50IHBlciBTZWN0aW9uIDQuMi4gSW1wb3J0ZWQgZWxlbWVudCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fYmluYXJ5X3NlY3VyaXR5X3Rva2VuLmh0bWwiPl93c3NlX19CaW5hcnlTZWN1cml0eVRva2VuPC9hPiBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuIA0KKzxwPg0KK0VsZW1lbnQgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6QmluYXJ5U2VjdXJpdHlUb2tlbiBvZiBjb21wbGV4VHlwZSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpCaW5hcnlTZWN1cml0eVRva2VuVHlwZS4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTQiIGRveHl0YWc9Indzc2UuaDo6X3dzc2VfX0VtYmVkZGVkIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHR5cGVkZWYgc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19lbWJlZGRlZC5odG1sIj5fd3NzZV9fRW1iZWRkZWQ8L2E+ICA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fZW1iZWRkZWQuaHRtbCI+X3dzc2VfX0VtYmVkZGVkPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1RoaXMgZWxlbWVudCBkZWZpbmVzIGEgc2VjdXJpdHkgdG9rZW4gZW1iZWRkZWQgcmVmZXJlbmNlIEltcG9ydGVkIGVsZW1lbnQgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2VtYmVkZGVkLmh0bWwiPl93c3NlX19FbWJlZGRlZDwvYT4gZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LiANCis8cD4NCitFbGVtZW50ICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOkVtYmVkZGVkIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOkVtYmVkZGVkVHlwZS4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTUiIGRveHl0YWc9Indzc2UuaDo6X3dzc2VfX0tleUlkZW50aWZpZXIiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdHlwZWRlZiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2tleV9pZGVudGlmaWVyLmh0bWwiPl93c3NlX19LZXlJZGVudGlmaWVyPC9hPiAgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2tleV9pZGVudGlmaWVyLmh0bWwiPl93c3NlX19LZXlJZGVudGlmaWVyPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1RoaXMgZWxlbWVudCBkZWZpbmVzIGEga2V5IGlkZW50aWZpZXIgcmVmZXJlbmNlIEltcG9ydGVkIGVsZW1lbnQgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2tleV9pZGVudGlmaWVyLmh0bWwiPl93c3NlX19LZXlJZGVudGlmaWVyPC9hPiBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuIA0KKzxwPg0KK0VsZW1lbnQgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6S2V5SWRlbnRpZmllciBvZiBjb21wbGV4VHlwZSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpLZXlJZGVudGlmaWVyVHlwZS4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTgiIGRveHl0YWc9Indzc2UuaDo6X3dzc2VfX1Bhc3N3b3JkIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHR5cGVkZWYgc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19wYXNzd29yZC5odG1sIj5fd3NzZV9fUGFzc3dvcmQ8L2E+ICA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fcGFzc3dvcmQuaHRtbCI+X3dzc2VfX1Bhc3N3b3JkPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1RoaXMgZWxlbWVudCBjb250YWlucyBwcm9wZXJ0aWVzIGZvciB0cmFuc2Zvcm1hdGlvbnMgZnJvbSBhbnkgbmFtZXNwYWNlLCBpbmNsdWRpbmcgRFNJRy4gJ193c3NlX19UcmFuc2Zvcm1hdGlvblBhcmFtZXRlcnMnIGVsZW1lbnQgZGVmaW5pdGlvbiBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsuIA0KKzxwPg0KK0VsZW1lbnQgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6UGFzc3dvcmQgb2YgY29tcGxleFR5cGUgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6UGFzc3dvcmRTdHJpbmcuIEltcG9ydGVkIGVsZW1lbnQgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3Bhc3N3b3JkLmh0bWwiPl93c3NlX19QYXNzd29yZDwvYT4gZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMyIgZG94eXRhZz0id3NzZS5oOjpfd3NzZV9fUmVmZXJlbmNlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHR5cGVkZWYgc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19yZWZlcmVuY2UuaHRtbCI+X3dzc2VfX1JlZmVyZW5jZTwvYT4gIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19yZWZlcmVuY2UuaHRtbCI+X3dzc2VfX1JlZmVyZW5jZTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitUaGlzIGVsZW1lbnQgZGVmaW5lcyBhIHNlY3VyaXR5IHRva2VuIHJlZmVyZW5jZSBJbXBvcnRlZCBlbGVtZW50IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19yZWZlcmVuY2UuaHRtbCI+X3dzc2VfX1JlZmVyZW5jZTwvYT4gZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LiANCis8cD4NCitFbGVtZW50ICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOlJlZmVyZW5jZSBvZiBjb21wbGV4VHlwZSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpSZWZlcmVuY2VUeXBlLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNyIgZG94eXRhZz0id3NzZS5oOjpfd3NzZV9fU2VjdXJpdHkiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdHlwZWRlZiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5Lmh0bWwiPl93c3NlX19TZWN1cml0eTwvYT4gIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eS5odG1sIj5fd3NzZV9fU2VjdXJpdHk8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIHdzc2U6U2VjdXJpdHkgU09BUCBoZWFkZXIgZWxlbWVudCBwZXIgU2VjdGlvbiA0LiBJbXBvcnRlZCBlbGVtZW50IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eS5odG1sIj5fd3NzZV9fU2VjdXJpdHk8L2E+IGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4gDQorPHA+DQorRWxlbWVudCAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpTZWN1cml0eSBvZiBjb21wbGV4VHlwZSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpTZWN1cml0eUhlYWRlclR5cGUuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE2IiBkb3h5dGFnPSJ3c3NlLmg6Ol93c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHR5cGVkZWYgc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eV90b2tlbl9yZWZlcmVuY2UuaHRtbCI+X3dzc2VfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2U8L2E+ICA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHlfdG9rZW5fcmVmZXJlbmNlLmh0bWwiPl93c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1RoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSB3c3NlOlNlY3VyaXR5VG9rZW5SZWZlcmVuY2UgcGVyIFNlY3Rpb24gNC4zLiBJbXBvcnRlZCBlbGVtZW50IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eV90b2tlbl9yZWZlcmVuY2UuaHRtbCI+X3dzc2VfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2U8L2E+IGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4gDQorPHA+DQorRWxlbWVudCAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpTZWN1cml0eVRva2VuUmVmZXJlbmNlIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOlNlY3VyaXR5VG9rZW5SZWZlcmVuY2VUeXBlLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMSIgZG94eXRhZz0id3NzZS5oOjpfd3NzZV9fVXNlcm5hbWVUb2tlbiIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB0eXBlZGVmIHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fdXNlcm5hbWVfdG9rZW4uaHRtbCI+X3dzc2VfX1VzZXJuYW1lVG9rZW48L2E+ICA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fdXNlcm5hbWVfdG9rZW4uaHRtbCI+X3dzc2VfX1VzZXJuYW1lVG9rZW48L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIHdzc2U6VXNlcm5hbWVUb2tlbiBlbGVtZW50IHBlciBTZWN0aW9uIDQuMS4gSW1wb3J0ZWQgZWxlbWVudCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fdXNlcm5hbWVfdG9rZW4uaHRtbCI+X3dzc2VfX1VzZXJuYW1lVG9rZW48L2E+IGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4gDQorPHA+DQorRWxlbWVudCAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpVc2VybmFtZVRva2VuIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOlVzZXJuYW1lVG9rZW5UeXBlLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMCIgZG94eXRhZz0id3NzZS5oOjp3c3NlX19GYXVsdGNvZGVFbnVtIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHR5cGVkZWYgZW51bSA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VfOGguaHRtbCNhMCI+d3NzZV9fRmF1bHRjb2RlRW51bTwvYT4gPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlXzhoLmh0bWwjYTAiPndzc2VfX0ZhdWx0Y29kZUVudW08L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVHlwZWRlZiBzeW5vbnltIGZvciBlbnVtIHdzc2VfX0ZhdWx0Y29kZUVudW0uIA0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj48aDI+RW51bWVyYXRpb24gVHlwZSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMTYiIGRveHl0YWc9Indzc2UuaDo6d3NzZV9fRmF1bHRjb2RlRW51bSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBlbnVtIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZV84aC5odG1sI2EwIj53c3NlX19GYXVsdGNvZGVFbnVtPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOkZhdWx0Y29kZUVudW0gaXMgYSBzaW1wbGVUeXBlIHJlc3RyaWN0aW9uIG9mIHhzOlFOYW1lLiANCis8cD4NCitJbXBvcnRlZCBzaW1wbGVUeXBlICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOnRVc2FnZSBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuIDxkbCBjb21wYWN0PjxkdD48Yj5FbnVtZXJhdGlvbiB2YWx1ZXM6IDwvYj48L2R0PjxkZD4NCis8dGFibGUgYm9yZGVyPTAgY2VsbHNwYWNpbmc9MiBjZWxscGFkZGluZz0wPg0KKzx0cj48dGQgdmFsaWduPXRvcD48ZW0+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTE2YTkiIGRveHl0YWc9Indzc2VfX1Vuc3VwcG9ydGVkU2VjdXJpdHlUb2tlbiIgPjwvYT53c3NlX19VbnN1cHBvcnRlZFNlY3VyaXR5VG9rZW48L2VtPiZuYnNwOzwvdGQ+PHRkPg0KK3hzOlFOYW1lIHZhbHVlPSIiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpVbnN1cHBvcnRlZFNlY3VyaXR5VG9rZW4iIDwvdGQ+PC90cj4NCis8dHI+PHRkIHZhbGlnbj10b3A+PGVtPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExNmExMCIgZG94eXRhZz0id3NzZV9fVW5zdXBwb3J0ZWRBbGdvcml0aG0iID48L2E+d3NzZV9fVW5zdXBwb3J0ZWRBbGdvcml0aG08L2VtPiZuYnNwOzwvdGQ+PHRkPg0KK3hzOlFOYW1lIHZhbHVlPSIiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpVbnN1cHBvcnRlZEFsZ29yaXRobSIgPC90ZD48L3RyPg0KKzx0cj48dGQgdmFsaWduPXRvcD48ZW0+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTE2YTExIiBkb3h5dGFnPSJ3c3NlX19JbnZhbGlkU2VjdXJpdHkiID48L2E+d3NzZV9fSW52YWxpZFNlY3VyaXR5PC9lbT4mbmJzcDs8L3RkPjx0ZD4NCit4czpRTmFtZSB2YWx1ZT0iImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6SW52YWxpZFNlY3VyaXR5IiA8L3RkPjwvdHI+DQorPHRyPjx0ZCB2YWxpZ249dG9wPjxlbT48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMTZhMTIiIGRveHl0YWc9Indzc2VfX0ludmFsaWRTZWN1cml0eVRva2VuIiA+PC9hPndzc2VfX0ludmFsaWRTZWN1cml0eVRva2VuPC9lbT4mbmJzcDs8L3RkPjx0ZD4NCit4czpRTmFtZSB2YWx1ZT0iImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6SW52YWxpZFNlY3VyaXR5VG9rZW4iIDwvdGQ+PC90cj4NCis8dHI+PHRkIHZhbGlnbj10b3A+PGVtPjxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExNmExMyIgZG94eXRhZz0id3NzZV9fRmFpbGVkQXV0aGVudGljYXRpb24iID48L2E+d3NzZV9fRmFpbGVkQXV0aGVudGljYXRpb248L2VtPiZuYnNwOzwvdGQ+PHRkPg0KK3hzOlFOYW1lIHZhbHVlPSIiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpGYWlsZWRBdXRoZW50aWNhdGlvbiIgPC90ZD48L3RyPg0KKzx0cj48dGQgdmFsaWduPXRvcD48ZW0+PGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTE2YTE0IiBkb3h5dGFnPSJ3c3NlX19GYWlsZWRDaGVjayIgPjwvYT53c3NlX19GYWlsZWRDaGVjazwvZW0+Jm5ic3A7PC90ZD48dGQ+DQoreHM6UU5hbWUgdmFsdWU9IiJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOkZhaWxlZENoZWNrIiA8L3RkPjwvdHI+DQorPHRyPjx0ZCB2YWxpZ249dG9wPjxlbT48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMTZhMTUiIGRveHl0YWc9Indzc2VfX1NlY3VyaXR5VG9rZW5VbmF2YWlsYWJsZSIgPjwvYT53c3NlX19TZWN1cml0eVRva2VuVW5hdmFpbGFibGU8L2VtPiZuYnNwOzwvdGQ+PHRkPg0KK3hzOlFOYW1lIHZhbHVlPSIiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpTZWN1cml0eVRva2VuVW5hdmFpbGFibGUiIDwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzwvZGw+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIEZyaSBBdWcgMTkgMTA6NDE6NDUgMjAwNSBmb3IgZ1NPQVAgV1MtU2VjdXJpdHkgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvd3NzZWFwaV84Yy5odG1sIGIvZG9jL3dzc2UvaHRtbC93c3NlYXBpXzhjLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY1ZDFjZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvd3NzZWFwaV84Yy5odG1sCkBAIC0wLDAgKzEsMzYxMyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIj4NCis8dGl0bGU+Z1NPQVAgV1MtU2VjdXJpdHk6IC9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy93c3NlL3dzc2VhcGkuYyBGaWxlIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2Mvd3NzZS93c3NlYXBpLmMgRmlsZSBSZWZlcmVuY2U8L2gxPjxjb2RlPiNpbmNsdWRlICI8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCI+d3NzZWFwaS5oPC9hPiI8L2NvZGU+PGJyPg0KKzxjb2RlPiNpbmNsdWRlICI8YSBjbGFzcz0iZWwiIGhyZWY9InNtZGV2cF84aC5odG1sIj5zbWRldnAuaDwvYT4iPC9jb2RlPjxicj4NCis8Y29kZT4jaW5jbHVkZSAidGhyZWFkcy5oIjwvY29kZT48YnI+DQorDQorPHA+DQorSW5jbHVkZSBkZXBlbmRlbmN5IGdyYXBoIGZvciB3c3NlYXBpLmM6PHA+PGNlbnRlcj48aW1nIHNyYz0id3NzZWFwaV84Y19faW5jbC5wbmciIGJvcmRlcj0iMCIgdXNlbWFwPSIjd3NzZWFwaS5jX21hcCIgYWx0PSJJbmNsdWRlIGRlcGVuZGVuY3kgZ3JhcGgiPjwvY2VudGVyPg0KKzxtYXAgbmFtZT0id3NzZWFwaS5jX21hcCI+DQorPGFyZWEgaHJlZj0id3NzZWFwaV84aC5odG1sIiBzaGFwZT0icmVjdCIgY29vcmRzPSIxNiwxNjcsODUsMTkzIiBhbHQ9IiI+DQorPGFyZWEgaHJlZj0ic21kZXZwXzhoLmh0bWwiIHNoYXBlPSJyZWN0IiBjb29yZHM9Ijg5LDkyLDE1NiwxMTkiIGFsdD0iIj4NCis8L21hcD4NCis8dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPg0KKzx0cj48dGQ+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+Q2xhc3NlczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zdHJ1Y3QgJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX3Nlc3Npb24uaHRtbCI+c29hcF93c3NlX3Nlc3Npb248L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkRpZ2VzdCBhdXRoZW50aWNhdGlvbiBzZXNzaW9uIGRhdGEuICA8YSBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19zZXNzaW9uLmh0bWwjX2RldGFpbHMiPk1vcmUuLi48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPkRlZmluZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+I2RlZmluZSZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTAiPlNPQVBfV1NTRV9NQVhfUkVGPC9hPiZuYnNwOyZuYnNwOyZuYnNwOygxMDApPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD4jZGVmaW5lJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMSI+U09BUF9XU1NFX0NMS1NLRVc8L2E+Jm5ic3A7Jm5ic3A7Jm5ic3A7KDYwMCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPiNkZWZpbmUmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2EyIj5TT0FQX1dTU0VfTk9OQ0VMRU48L2E+Jm5ic3A7Jm5ic3A7Jm5ic3A7KDIwKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+I2RlZmluZSZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTMiPlNPQVBfV1NTRV9OT05DRVRJTUU8L2E+Jm5ic3A7Jm5ic3A7Jm5ic3A7KFNPQVBfV1NTRV9DTEtTS0VXICsgMjQwKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPkZ1bmN0aW9uczwvaDI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2ExOSI+c29hcF93c3NlX3Nlc3Npb25fdmVyaWZ5PC9hPiAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgaGFzaFtTT0FQX1NNRF9TSEExX1NJWkVdLCBjb25zdCBjaGFyICpjcmVhdGVkLCBjb25zdCBjaGFyICpub25jZSk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VmVyaWZpZXMgYW5kIHVwZGF0ZXMgdGhlIGRpZ2VzdCwgbm9uY2UsIGFuZCBjcmVhdGlvbiB0aW1lIGFnYWluc3QgdGhlIGRpZ2VzdCBhdXRoZW50aWNhdGlvbiBzZXNzaW9uIGRhdGFiYXNlIHRvIHByZXZlbnQgcmVwbGF5IGF0dGFja3MuICA8YSBocmVmPSIjYTE5Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+dm9pZCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTIwIj5zb2FwX3dzc2Vfc2Vzc2lvbl9jbGVhbnVwPC9hPiAoc3RydWN0IHNvYXAgKnNvYXApPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlJlbW92ZXMgZXhwaXJlZCBhdXRoZW50aWNhdGlvbiBkYXRhIGZyb20gdGhlIGRpZ2VzdCBhdXRoZW50aWNhdGlvbiBzZXNzaW9uIGRhdGFiYXNlLiAgPGEgaHJlZj0iI2EyMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnZvaWQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2EyMSI+Y2FsY19kaWdlc3Q8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqY3JlYXRlZCwgY29uc3QgY2hhciAqbm9uY2UsIGludCBub25jZWxlbiwgY29uc3QgY2hhciAqcGFzc3dvcmQsIGNoYXIgaGFzaFtTT0FQX1NNRF9TSEExX1NJWkVdKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5DYWxjdWxhdGVzIGRpZ2VzdCB2YWx1ZSBTSEExKGNyZWF0ZWQsIG5vbmNlLCBwYXNzd29yZCkuICA8YSBocmVmPSIjYTIxIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+dm9pZCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTIyIj5jYWxjX25vbmNlPC9hPiAoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgbm9uY2VbU09BUF9XU1NFX05PTkNFTEVOXSk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+Q2FsY3VsYXRlcyByYW5kb21pemVkIG5vbmNlLiAgPGEgaHJlZj0iI2EyMiI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTIzIj5zb2FwX3dzc2VfaW5pdDwvYT4gKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kYXRhLmh0bWwiPnNvYXBfd3NzZV9kYXRhPC9hPiAqZGF0YSk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+SW5pdGlhbGl6ZXMgcGx1Z2luIGRhdGEuICA8YSBocmVmPSIjYTIzIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMjQiPnNvYXBfd3NzZV9jb3B5PC9hPiAoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3BsdWdpbiAqZHN0LCBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnNyYyk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+Q29waWVzIHBsdWdpbiBkYXRhIHRvIGxvY2FsaXplIHBsdWdpbiBkYXRhIGZvciB0aHJlYWRzLiAgPGEgaHJlZj0iI2EyNCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnZvaWQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2EyNSI+c29hcF93c3NlX2RlbGV0ZTwvYT4gKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnApPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkRlbGV0ZXMgcGx1Z2luIGRhdGEuICA8YSBocmVmPSIjYTI1Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMjYiPnNvYXBfd3NzZV9wcmVwYXJlaW5pdDwvYT4gKHN0cnVjdCBzb2FwICpzb2FwKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5Jbml0aWF0ZXMgbWVzc2FnZSBwcmVwcm9jZXNzaW5nIHdpdGggZ1NPQVAgZW5naW5lJ3MgcHJlcGFyZWluaXQgY2FsbGJhY2suICA8YSBocmVmPSIjYTI2Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMjciPnNvYXBfd3NzZV9wcmVwYXJlc2VuZDwvYT4gKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlRha2VzIGEgcGllY2Ugb2YgdGhlIFhNTCBtZXNzYWdlICh0b2tlbml6ZWQpIHRvIGNvbXB1dGUgZGlnZXN0LiAgPGEgaHJlZj0iI2EyNyI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTI4Ij5zb2FwX3dzc2VfcHJlcGFyZWZpbmFsPC9hPiAoc3RydWN0IHNvYXAgKnNvYXApPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkNvbGxlY3RzIHRoZSBkaWdlc3RzIG9mIGFsbCB0aGUgd3N1OklkIGVsZW1lbnRzIGFuZCBwb3B1bGF0ZXMgdGhlIFNpZ25lZEluZm8uICA8YSBocmVmPSIjYTI4Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+dm9pZCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTI5Ij5zb2FwX3dzc2VfcHJlcGFyZWNsZWFudXA8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fZGF0YS5odG1sIj5zb2FwX3dzc2VfZGF0YTwvYT4gKmRhdGEpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlJlc3RvcmVzIGVuZ2luZSBzdGF0ZS4gIDxhIGhyZWY9IiNhMjkiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2EzMCI+c29hcF93c3NlX2Rpc2Nvbm5lY3Q8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VmVyaWZ5IHNpZ25hdHVyZSBhbmQgU2lnbmVkSW5mbyBkaWdlc3RzIGluaXRpYXRlZCB3aXRoIHNvYXBfd3NzZV92ZXJpZnlfYXV0by4gIDxhIGhyZWY9IiNhMzAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHkuaHRtbCI+X3dzc2VfX1NlY3VyaXR5PC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMzEiPnNvYXBfd3NzZV9hZGRfU2VjdXJpdHk8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QWRkcyBTZWN1cml0eSBoZWFkZXIgZWxlbWVudC4gIDxhIGhyZWY9IiNhMzEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHkuaHRtbCI+X3dzc2VfX1NlY3VyaXR5PC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMzIiPnNvYXBfd3NzZV9hZGRfU2VjdXJpdHlfYWN0b3I8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqYWN0b3IpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkFkZHMgU2VjdXJpdHkgaGVhZGVyIGVsZW1lbnQgd2l0aCBhY3RvciBvciByb2xlIGF0dHJpYnV0ZS4gIDxhIGhyZWY9IiNhMzIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD52b2lkJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMzMiPnNvYXBfd3NzZV9kZWxldGVfU2VjdXJpdHk8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+RGVsZXRlcyBTZWN1cml0eSBoZWFkZXIgZWxlbWVudC4gIDxhIGhyZWY9IiNhMzMiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHkuaHRtbCI+X3dzc2VfX1NlY3VyaXR5PC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMzQiPnNvYXBfd3NzZV9TZWN1cml0eTwvYT4gKHN0cnVjdCBzb2FwICpzb2FwKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5SZXR1cm5zIFNlY3VyaXR5IGhlYWRlciBlbGVtZW50IGlmIHByZXNlbnQuICA8YSBocmVmPSIjYTM0Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmF0dXJlX3R5cGUuaHRtbCI+ZHNfX1NpZ25hdHVyZVR5cGU8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2EzNSI+c29hcF93c3NlX2FkZF9TaWduYXR1cmU8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QWRkcyBTaWduYXR1cmUgaGVhZGVyIGVsZW1lbnQuICA8YSBocmVmPSIjYTM1Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+dm9pZCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTM2Ij5zb2FwX3dzc2VfZGVsZXRlX1NpZ25hdHVyZTwvYT4gKHN0cnVjdCBzb2FwICpzb2FwKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5EZWxldGVzIFNpZ25hdHVyZSBoZWFkZXIgZWxlbWVudC4gIDxhIGhyZWY9IiNhMzYiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduYXR1cmVfdHlwZS5odG1sIj5kc19fU2lnbmF0dXJlVHlwZTwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTM3Ij5zb2FwX3dzc2VfU2lnbmF0dXJlPC9hPiAoc3RydWN0IHNvYXAgKnNvYXApPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlJldHVybnMgU2lnbmF0dXJlIGhlYWRlciBlbGVtZW50IGlmIHByZXNlbnQuICA8YSBocmVmPSIjYTM3Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMzgiPnNvYXBfd3NzZV9hZGRfVGltZXN0YW1wPC9hPiAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCB0aW1lX3QgbGlmZXRpbWUpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkFkZHMgVGltZXN0YW1wIGVsZW1lbnQgd2l0aCBvcHRpb25hbCBleHBpcmF0aW9uIGRhdGUrdGltZSAobGlmZXRpbWUpLiAgPGEgaHJlZj0iI2EzOCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3VfX19fX3RpbWVzdGFtcC5odG1sIj5fd3N1X19UaW1lc3RhbXA8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2EzOSI+c29hcF93c3NlX1RpbWVzdGFtcDwvYT4gKHN0cnVjdCBzb2FwICpzb2FwKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5SZXR1cm5zIFRpbWVzdGFtcCBlbGVtZW50IGlmIHByZXNlbnQuICA8YSBocmVmPSIjYTM5Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNDAiPnNvYXBfd3NzZV92ZXJpZnlfVGltZXN0YW1wPC9hPiAoc3RydWN0IHNvYXAgKnNvYXApPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlZlcmlmaWVzIHRoZSBUaW1lc3RhbXAvRXhwaXJlcyBlbGVtZW50IGFnYWluc3QgdGhlIGN1cnJlbnQgdGltZS4gIDxhIGhyZWY9IiNhNDAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E0MSI+c29hcF93c3NlX2FkZF9Vc2VybmFtZVRva2VuVGV4dDwvYT4gKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqdXNlcm5hbWUsIGNvbnN0IGNoYXIgKnBhc3N3b3JkKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BZGRzIFVzZXJuYW1lVG9rZW4gZWxlbWVudCB3aXRoIG9wdGlvbmFsIGNsZWFyLXRleHQgcGFzc3dvcmQuICA8YSBocmVmPSIjYTQxIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNDIiPnNvYXBfd3NzZV9hZGRfVXNlcm5hbWVUb2tlbkRpZ2VzdDwvYT4gKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqdXNlcm5hbWUsIGNvbnN0IGNoYXIgKnBhc3N3b3JkKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BZGRzIFVzZXJuYW1lVG9rZW4gZWxlbWVudCBmb3IgZGlnZXN0IGF1dGhlbnRpY2F0aW9uLiAgPGEgaHJlZj0iI2E0MiI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX191c2VybmFtZV90b2tlbi5odG1sIj5fd3NzZV9fVXNlcm5hbWVUb2tlbjwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTQzIj5zb2FwX3dzc2VfVXNlcm5hbWVUb2tlbjwvYT4gKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+UmV0dXJucyBVc2VybmFtZVRva2VuIGVsZW1lbnQgaWYgcHJlc2VudC4gIDxhIGhyZWY9IiNhNDMiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jb25zdCBjaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E0NCI+c29hcF93c3NlX2dldF9Vc2VybmFtZTwvYT4gKHN0cnVjdCBzb2FwICpzb2FwKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5SZXR1cm5zIFVzZXJuYW1lVG9rZW4vdXNlcm5hbWUgc3RyaW5nIG9yIHdzc2U6RmFpbGVkQXV0aGVudGljYXRpb24gZmF1bHQuICA8YSBocmVmPSIjYTQ0Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNDUiPnNvYXBfd3NzZV92ZXJpZnlfUGFzc3dvcmQ8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcGFzc3dvcmQpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlZlcmlmaWVzIHRoZSBzdXBwbGllZCBwYXNzd29yZCBvciBzZXRzIHdzc2U6RmFpbGVkQXV0aGVudGljYXRpb24gZmF1bHQuICA8YSBocmVmPSIjYTQ1Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNDYiPnNvYXBfd3NzZV9hZGRfQmluYXJ5U2VjdXJpdHlUb2tlbjwvYT4gKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqdmFsdWVUeXBlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgc2l6ZSk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QWRkcyBCaW5hcnlTZWN1cml0eVRva2VuIGVsZW1lbnQuICA8YSBocmVmPSIjYTQ2Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNDciPnNvYXBfd3NzZV9hZGRfQmluYXJ5U2VjdXJpdHlUb2tlblg1MDk8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIFg1MDkgKmNlcnQpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkFkZHMgQmluYXJ5U2VjdXJpdHlUb2tlbiBlbGVtZW50IHdpdGggWDUwOSBjZXJ0aWZpY2F0ZS4gIDxhIGhyZWY9IiNhNDciPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E0OCI+c29hcF93c3NlX2FkZF9CaW5hcnlTZWN1cml0eVRva2VuUEVNPC9hPiAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICpmaWxlbmFtZSk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QWRkcyBCaW5hcnlTZWN1cml0eVRva2VuIGVsZW1lbnQgZnJvbSBhIFBFTSBmaWxlLiAgPGEgaHJlZj0iI2E0OCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19iaW5hcnlfc2VjdXJpdHlfdG9rZW4uaHRtbCI+X3dzc2VfX0JpbmFyeVNlY3VyaXR5VG9rZW48L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E0OSI+c29hcF93c3NlX0JpbmFyeVNlY3VyaXR5VG9rZW48L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlJldHVybnMgQmluYXJ5U2VjdXJpdHlUb2tlbiBlbGVtZW50IGlmIHByZXNlbnQuICA8YSBocmVmPSIjYTQ5Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNTAiPnNvYXBfd3NzZV9nZXRfQmluYXJ5U2VjdXJpdHlUb2tlbjwvYT4gKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgY2hhciAqKnZhbHVlVHlwZSwgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCAqc2l6ZSk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+R2V0IHdzc2U6QmluYXJ5U2VjdXJpdHlUb2tlbiBlbGVtZW50IHRva2VuIGRhdGEgaW4gYmluYXJ5IGZvcm0uICA8YSBocmVmPSIjYTUwIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+WDUwOSAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNTEiPnNvYXBfd3NzZV9nZXRfQmluYXJ5U2VjdXJpdHlUb2tlblg1MDk8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkdldCBYNTA5IHdzc2U6QmluYXJ5U2VjdXJpdHlUb2tlbiBjZXJ0aWZpY2F0ZSBhbmQgdmVyaWZ5IGl0cyBjb250ZW50LiAgPGEgaHJlZj0iI2E1MSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTUyIj5zb2FwX3dzc2VfdmVyaWZ5X1g1MDk8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCwgWDUwOSAqY2VydCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VmVyaWZpZXMgWDUwOSBjZXJ0aWZpY2F0ZSBhZ2FpbnN0IHNvYXAtJmd0O2NhZmlsZSwgc29hcC0mZ3Q7Y2FwYXRoLCBhbmQgc29hcC0mZ3Q7Y3JsZmlsZS4gIDxhIGhyZWY9IiNhNTIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduZWRfaW5mb190eXBlLmh0bWwiPmRzX19TaWduZWRJbmZvVHlwZTwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTUzIj5zb2FwX3dzc2VfYWRkX1NpZ25lZEluZm88L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QWRkcyBTaWduZWRJbmZvIGVsZW1lbnQuICA8YSBocmVmPSIjYTUzIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNTQiPnNvYXBfd3NzZV9hZGRfU2lnbmVkSW5mb19SZWZlcmVuY2U8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqVVJJLCBjb25zdCBjaGFyICp0cmFuc2Zvcm0sIGNvbnN0IGNoYXIgKmluY2x1c2l2ZU5hbWVzcGFjZXMsIGNvbnN0IGNoYXIgKkhBKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BZGRzIFNpZ25lZEluZm8gZWxlbWVudCB3aXRoIFJlZmVyZW5jZSBVUkksIHRyYW5zZm9ybSBhbGdvcml0aG0gdXNlZCwgYW5kIGRpZ2VzdCB2YWx1ZS4gIDxhIGhyZWY9IiNhNTQiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E1NSI+c29hcF93c3NlX2FkZF9TaWduZWRJbmZvX1NpZ25hdHVyZU1ldGhvZDwvYT4gKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICptZXRob2QsIGludCBjYW5vbmljYWwpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkFkZHMgU2lnbmVkSW5mbyBlbGVtZW50IHdpdGggU2lnbmF0dXJlTWV0aG9kLiAgPGEgaHJlZj0iI2E1NSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGUuaHRtbCI+ZHNfX1NpZ25lZEluZm9UeXBlPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNTYiPnNvYXBfd3NzZV9TaWduZWRJbmZvPC9hPiAoc3RydWN0IHNvYXAgKnNvYXApPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlJldHVybnMgU2lnbmVkSW5mbyBlbGVtZW50IGlmIHByZXNlbnQuICA8YSBocmVmPSIjYTU2Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNTciPnNvYXBfd3NzZV9nZXRfU2lnbmVkSW5mb19TaWduYXR1cmVNZXRob2Q8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50ICphbGcpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkdldCBTaWduYXR1cmVNZXRob2QgYWxnb3JpdGhtLiAgPGEgaHJlZj0iI2E1NyI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTU4Ij5zb2FwX3dzc2VfYWRkX1NpZ25hdHVyZVZhbHVlPC9hPiAoc3RydWN0IHNvYXAgKnNvYXAsIGludCBhbGcsIGNvbnN0IHZvaWQgKmtleSwgaW50IGtleWxlbik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QWRkcyBTaWduZWRJbmZvL1NpZ25hdHVyZU1ldGhvZCBlbGVtZW50LCBzaWducyB0aGUgU2lnbmVkSW5mbyBlbGVtZW50LCBhbmQgYWRkcyB0aGUgcmVzdWx0aW5nIFNpZ25hdHVyZVZhbHVlIGVsZW1lbnQuICA8YSBocmVmPSIjYTU4Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNTkiPnNvYXBfd3NzZV92ZXJpZnlfU2lnbmF0dXJlVmFsdWU8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGFsZywgY29uc3Qgdm9pZCAqa2V5LCBpbnQga2V5bGVuKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5WZXJpZmllcyB0aGUgU2lnbmF0dXJlVmFsdWUgb2YgYSBTaWduZWRJbmZvIGVsZW1lbnQuICA8YSBocmVmPSIjYTU5Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNjAiPnNvYXBfd3NzZV92ZXJpZnlfU2lnbmVkSW5mbzwvYT4gKHN0cnVjdCBzb2FwICpzb2FwKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5WZXJpZmllcyB0aGUgZGlnZXN0IHZhbHVlcyBvZiB0aGUgWE1MIGVsZW1lbnRzIHJlZmVyZW5jZWQgYnkgdGhlIFNpZ25lZEluZm8gUmVmZXJlbmNlcy4gIDxhIGhyZWY9IiNhNjAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E2MSI+c29hcF93c3NlX3ZlcmlmeV9kaWdlc3Q8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGFsZywgY29uc3QgY2hhciAqaWQsIHVuc2lnbmVkIGNoYXIgaGFzaFtTT0FQX1NNRF9NQVhfU0laRV0pPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlZlcmlmaWVzIHRoZSBkaWdlc3QgdmFsdWUgb2YgYW4gWE1MIGVsZW1lbnQgcmVmZXJlbmNlZCBieSBpZCBhZ2FpbnN0IHRoZSBoYXNoLiAgPGEgaHJlZj0iI2E2MSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2tleV9pbmZvX3R5cGUuaHRtbCI+ZHNfX0tleUluZm9UeXBlPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNjIiPnNvYXBfd3NzZV9hZGRfS2V5SW5mbzwvYT4gKHN0cnVjdCBzb2FwICpzb2FwKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BZGRzIEtleUluZm8gZWxlbWVudC4gIDxhIGhyZWY9IiNhNjIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19rZXlfaW5mb190eXBlLmh0bWwiPmRzX19LZXlJbmZvVHlwZTwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTYzIj5zb2FwX3dzc2VfS2V5SW5mbzwvYT4gKHN0cnVjdCBzb2FwICpzb2FwKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5SZXR1cm5zIEtleUluZm8gZWxlbWVudCBpZiBwcmVzZW50LiAgPGEgaHJlZj0iI2E2MyI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTY0Ij5zb2FwX3dzc2VfYWRkX0tleUluZm9fS2V5TmFtZTwvYT4gKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BZGRzIEtleU5hbWUgZWxlbWVudC4gIDxhIGhyZWY9IiNhNjQiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jb25zdCBjaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E2NSI+c29hcF93c3NlX2dldF9LZXlJbmZvX0tleU5hbWU8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+UmV0dXJucyBLZXlOYW1lIGVsZW1lbnQgaWYgcHJlc2VudC4gIDxhIGhyZWY9IiNhNjUiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E2NiI+c29hcF93c3NlX2FkZF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VVUkk8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqVVJJLCBjb25zdCBjaGFyICp2YWx1ZVR5cGUpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkFkZHMgS2V5SW5mbyBlbGVtZW50IHdpdGggU2VjdXJpdHlUb2tlblJlZmVyZW5jZSBVUkkuICA8YSBocmVmPSIjYTY2Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNjciPnNvYXBfd3NzZV9hZGRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlWDUwOTwvYT4gKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpVUkkpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkFkZHMgS2V5SW5mbyBlbGVtZW50IHdpdGggU2VjdXJpdHlUb2tlblJlZmVyZW5jZSBVUkkgdG8gYW4gWDUwOSBjZXJ0LiAgPGEgaHJlZj0iI2E2NyI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTY4Ij5zb2FwX3dzc2VfZ2V0X0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZVVSSTwvYT4gKHN0cnVjdCBzb2FwICpzb2FwKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5SZXR1cm5zIGEgU2VjdXJpdHlUb2tlblJlZmVyZW5jZSBVUkkgaWYgcHJlc2VudC4gIDxhIGhyZWY9IiNhNjgiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5YNTA5ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E2OSI+c29hcF93c3NlX2dldF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VYNTA5PC9hPiAoc3RydWN0IHNvYXAgKnNvYXApPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlJldHVybnMgYSBYNTA5IGNlcnRpZmljYXRlIGlmIHByZXNlbnQgYXMgYSBCaW5hcnlTZWN1cml0eSB0b2tlbi4gIDxhIGhyZWY9IiNhNjkiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E3MCI+c29hcF93c3NlX2FkZF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VLZXlJZGVudGlmaWVyPC9hPiAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICp2YWx1ZVR5cGUsIHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBzaXplKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BZGRzIEtleUluZm8gZWxlbWVudCB3aXRoIFNlY3VyaXR5VG9rZW5SZWZlcmVuY2UvS2V5SWRlbnRpZmllciBiaW5hcnkgZGF0YS4gIDxhIGhyZWY9IiNhNzAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jb25zdCBjaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E3MSI+c29hcF93c3NlX2dldF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VLZXlJZGVudGlmaWVyVmFsdWVUeXBlPC9hPiAoc3RydWN0IHNvYXAgKnNvYXApPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlJldHVybnMgS2V5SW5mby9TZWN1cml0eVRva2VuUmVmZXJlbmNlL0tleUlkZW50aWZpZXIvVmFsdWVUeXBlIGlmIHByZXNlbnQuICA8YSBocmVmPSIjYTcxIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y29uc3QgdW5zaWduZWQgY2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNzIiPnNvYXBfd3NzZV9nZXRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlS2V5SWRlbnRpZmllcjwvYT4gKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgKnNpemUpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlJldHVybnMgS2V5SW5mby9TZWN1cml0eVRva2VuUmVmZXJlbmNlL0tleUlkZW50aWZpZXIgYmluYXJ5IGRhdGEuICA8YSBocmVmPSIjYTcyIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNzMiPnNvYXBfd3NzZV9hZGRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlRW1iZWRkZWQ8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKnZhbHVlVHlwZSk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QWRkcyBLZXlJbmZvIGVsZW1lbnQgd2l0aCBFbWJlZGRlZCBTZWN1cml0eVRva2VuUmVmZXJlbmNlLiAgPGEgaHJlZj0iI2E3MyI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTc0Ij5zb2FwX3dzc2VfZmF1bHQ8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCwgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlXzhoLmh0bWwjYTAiPndzc2VfX0ZhdWx0Y29kZUVudW08L2E+IGZhdWx0LCBjb25zdCBjaGFyICpkZXRhaWwpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlNldHMgU09BUCBGYXVsdCAoc3ViKWNvZGUgZm9yIHNlcnZlciByZXNwb25zZS4gIDxhIGhyZWY9IiNhNzQiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E3NSI+c29hcF93c3NlPC9hPiAoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3BsdWdpbiAqcCwgdm9pZCAqYXJnKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5QbHVnaW4gcmVnaXN0cnkgZnVuY3Rpb24sIHVzZWQgd2l0aCBzb2FwX3JlZ2lzdGVyX3BsdWdpbi4gIDxhIGhyZWY9IiNhNzUiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E3NiI+c29hcF93c3NlX3NpZ248L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGFsZywgY29uc3Qgdm9pZCAqa2V5LCBpbnQga2V5bGVuKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5Vc2VzIHRoZSB3c3NlIHBsdWdpbiB0byBzaWduIGFsbCB3c3U6SWQgYXR0cmlidXRlZCBlbGVtZW50cy4gIDxhIGhyZWY9IiNhNzYiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E3NyI+c29hcF93c3NlX3NpZ25fYm9keTwvYT4gKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgYWxnLCBjb25zdCB2b2lkICprZXksIGludCBrZXlsZW4pPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlVzZXMgdGhlIHdzc2UgcGx1Z2luIHRvIHNpZ24gYWxsIHdzdTpJZCBhdHRyaWJ1dGVkIGVsZW1lbnRzLCBpbmNsdWRpbmcgdGhlIFNPQVAgQm9keSAoYnkgYWRkaW5nIGEgd3N1OklkPSJCb2R5IiBhdHRyaWJ1dGUpLiAgPGEgaHJlZj0iI2E3NyI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTc4Ij5zb2FwX3dzc2VfdmVyaWZ5X2luaXQ8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VXNlcyB0aGUgd3NzZSBwbHVnaW4gdG8gaW5pdGlhdGUgdGhlIHZlcmlmaWNhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIGFuZCBTaWduZWRJbmZvIFJlZmVyZW5jZSBkaWdlc3RzLiAgPGEgaHJlZj0iI2E3OCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTc5Ij5zb2FwX3dzc2VfdmVyaWZ5X2F1dG88L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGFsZywgY29uc3Qgdm9pZCAqa2V5LCBzaXplX3Qga2V5bGVuKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5Vc2VzIHRoZSB3c3NlIHBsdWdpbiB0byBpbml0aWF0ZSB0aGUgYXV0b21hdGljIHZlcmlmaWNhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIGFuZCBTaWduZWRJbmZvIFJlZmVyZW5jZSBkaWdlc3RzLiAgPGEgaHJlZj0iI2E3OSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTgwIj5zb2FwX3dzc2VfdmVyaWZ5X2RvbmU8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VGVybWluYXRlcyB0aGUgYXV0b21hdGljIHZlcmlmaWNhdGlvbiBvZiBzaWduYXR1cmVzLiAgPGEgaHJlZj0iI2E4MCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5WYXJpYWJsZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y29uc3QgY2hhciZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTQiPnNvYXBfd3NzZV9pZDwvYT4gWzE0XSA9IFNPQVBfV1NTRV9JRDwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNSI+d3NzZV9QYXNzd29yZFRleHRVUkk8L2E+ID0gImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3MtdXNlcm5hbWUtdG9rZW4tcHJvZmlsZS0xLjAjUGFzc3dvcmRUZXh0IjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhNiI+d3NzZV9QYXNzd29yZERpZ2VzdFVSSTwvYT4gPSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy11c2VybmFtZS10b2tlbi1wcm9maWxlLTEuMCNQYXNzd29yZERpZ2VzdCI8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTciPndzc2VfQmFzZTY0QmluYXJ5VVJJPC9hPiA9ICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXNvYXAtbWVzc2FnZS1zZWN1cml0eS0xLjAjQmFzZTY0QmluYXJ5IjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhOCI+d3NzZV9YNTA5djNVUkk8L2E+ID0gImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3MteDUwOS10b2tlbi1wcm9maWxlLTEuMCNYNTA5djMiPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jb25zdCBjaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2E5Ij53c3NlX1g1MDl2M1N1YmplY3RLZXlJZGVudGlmaWVyVVJJPC9hPiA9ICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXg1MDktdG9rZW4tcHJvZmlsZS0xLjAjWDUwOVN1YmplY3RLZXlJZGVudGlmaWVyIjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMTAiPmRzX3NoYTFVUkk8L2E+ID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMTEiPmRzX2htYWNfc2hhMVVSSTwvYT4gPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2htYWMtc2hhMSI8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTEyIj5kc19kc2Ffc2hhMVVSSTwvYT4gPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2RzYS1zaGExIjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMTMiPmRzX3JzYV9zaGExVVJJPC9hPiA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjcnNhLXNoYTEiPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jb25zdCBjaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2ExNCI+ZHNfVVJJPC9hPiA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMTUiPmMxNG5fVVJJPC9hPiA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jb25zdCBjaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84Yy5odG1sI2ExNiI+d3N1X1VSSTwvYT4gPSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXV0aWxpdHktMS4wLnhzZCI8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0c29hcF9fd3NzZV9fc2Vzc2lvbi5odG1sIj5zb2FwX3dzc2Vfc2Vzc2lvbjwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTE3Ij5zb2FwX3dzc2Vfc2Vzc2lvbjwvYT4gPSBOVUxMPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5NVVRFWF9UWVBFJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGMuaHRtbCNhMTgiPnNvYXBfd3NzZV9zZXNzaW9uX2xvY2s8L2E+PC90ZD48L3RyPg0KKw0KKzwvdGFibGU+DQorPGhyPjxoMj5EZWZpbmUgRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTEiIGRveHl0YWc9Indzc2VhcGkuYzo6U09BUF9XU1NFX0NMS1NLRVciID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gI2RlZmluZSBTT0FQX1dTU0VfQ0xLU0tFVyZuYnNwOyZuYnNwOyZuYnNwOyg2MDApICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQ2xvY2sgc2tldyBiZXR3ZWVuIG1hY2hpbmVzIChpbiBzZWMpIHRvIGZpdCBtZXNzYWdlIGV4cGlyYXRpb24gaW4gd2luZG93ICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEwIiBkb3h5dGFnPSJ3c3NlYXBpLmM6OlNPQVBfV1NTRV9NQVhfUkVGIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+ICNkZWZpbmUgU09BUF9XU1NFX01BWF9SRUYmbmJzcDsmbmJzcDsmbmJzcDsoMTAwKSAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK01heGltdW0gbnVtYmVyIG9mIFNpZ25lZEluZm8gUmVmZXJlbmNlcyAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMiIgZG94eXRhZz0id3NzZWFwaS5jOjpTT0FQX1dTU0VfTk9OQ0VMRU4iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gI2RlZmluZSBTT0FQX1dTU0VfTk9OQ0VMRU4mbmJzcDsmbmJzcDsmbmJzcDsoMjApICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorU2l6ZSBvZiB0aGUgcmFuZG9tIG5vbmNlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEzIiBkb3h5dGFnPSJ3c3NlYXBpLmM6OlNPQVBfV1NTRV9OT05DRVRJTUUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gI2RlZmluZSBTT0FQX1dTU0VfTk9OQ0VUSU1FJm5ic3A7Jm5ic3A7Jm5ic3A7KFNPQVBfV1NTRV9DTEtTS0VXICsgMjQwKSAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0RpZ2VzdCBhdXRoZW50aWNhdGlvbiBhY2NlcHRzIG1lc3NhZ2VzIHRoYXQgYXJlIG5vdCBvbGRlciB0aGFuIGNyZWF0aW9uIHRpbWUgKyBTT0FQX1dTU0VfTk9OQ0VUSU1FICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxocj48aDI+RnVuY3Rpb24gRG9jdW1lbnRhdGlvbjwvaDI+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTIxIiBkb3h5dGFnPSJ3c3NlYXBpLmM6OmNhbGNfZGlnZXN0IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHZvaWQgY2FsY19kaWdlc3QgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmNyZWF0ZWQ8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPm5vbmNlPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmludCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5ub25jZWxlbjwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+cGFzc3dvcmQ8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y2hhciZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5oYXNoPC9lbT5bU09BUF9TTURfU0hBMV9TSVpFXTwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjxjb2RlPiBbc3RhdGljXTwvY29kZT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0NhbGN1bGF0ZXMgZGlnZXN0IHZhbHVlIFNIQTEoY3JlYXRlZCwgbm9uY2UsIHBhc3N3b3JkKS4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+Y3JlYXRlZDwvZW0+Jm5ic3A7PC90ZD48dGQ+c3RyaW5nIChYU0QgZGF0ZVRpbWUgZm9ybWF0KSA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPm5vbmNlPC9lbT4mbmJzcDs8L3RkPjx0ZD52YWx1ZSA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPm5vbmNlbGVuPC9lbT4mbmJzcDs8L3RkPjx0ZD5sZW5ndGggb2Ygbm9uY2UgdmFsdWUgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5wYXNzd29yZDwvZW0+Jm5ic3A7PC90ZD48dGQ+c3RyaW5nIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W291dF08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmhhc2g8L2VtPiZuYnNwOzwvdGQ+PHRkPlNIQTEgZGlnZXN0IDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMjIiIGRveHl0YWc9Indzc2VhcGkuYzo6Y2FsY19ub25jZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB2b2lkIGNhbGNfbm9uY2UgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y2hhciZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5ub25jZTwvZW0+W1NPQVBfV1NTRV9OT05DRUxFTl08L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48Y29kZT4gW3N0YXRpY108L2NvZGU+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitDYWxjdWxhdGVzIHJhbmRvbWl6ZWQgbm9uY2UuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0PltvdXRdPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5ub25jZTwvZW0+Jm5ic3A7PC90ZD48dGQ+dmFsdWUgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE3NSIgZG94eXRhZz0id3NzZWFwaS5jOjpzb2FwX3dzc2UiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IHNvYXBfd3NzZSAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5zdHJ1Y3Qgc29hcF9wbHVnaW4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5wPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPnZvaWQgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5hcmc8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorUGx1Z2luIHJlZ2lzdHJ5IGZ1bmN0aW9uLCB1c2VkIHdpdGggc29hcF9yZWdpc3Rlcl9wbHVnaW4uIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0PltpbixvdXRdPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5wPC9lbT4mbmJzcDs8L3RkPjx0ZD5wbHVnaW4gY3JlYXRlZCBpbiByZWdpc3RyeSA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmFyZzwvZW0+Jm5ic3A7PC90ZD48dGQ+cGFzc2VkIGZyb20gc29hcF9yZWdpc3Rlcl9wbHVnaW5fYXJnIDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+U09BUF9PSyA8L2RkPjwvZGw+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTQ2IiBkb3h5dGFnPSJ3c3NlYXBpLmM6OnNvYXBfd3NzZV9hZGRfQmluYXJ5U2VjdXJpdHlUb2tlbiIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgc29hcF93c3NlX2FkZF9CaW5hcnlTZWN1cml0eVRva2VuICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5pZDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+dmFsdWVUeXBlPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IHVuc2lnbmVkIGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5kYXRhPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmludCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zaXplPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0FkZHMgQmluYXJ5U2VjdXJpdHlUb2tlbiBlbGVtZW50LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5pZDwvZW0+Jm5ic3A7PC90ZD48dGQ+c3RyaW5nIGZvciBzaWduYXR1cmUgcmVmZXJlbmNpbmcgb3IgTlVMTCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnZhbHVlVHlwZTwvZW0+Jm5ic3A7PC90ZD48dGQ+c3RyaW5nIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+ZGF0YTwvZW0+Jm5ic3A7PC90ZD48dGQ+cG9pbnRzIHRvIGJpbmFyeSB0b2tlbiBkYXRhIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c2l6ZTwvZW0+Jm5ic3A7PC90ZD48dGQ+aXMgbGVuZ3RoIG9mIGJpbmFyeSB0b2tlbiA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPlNPQVBfT0sgPC9kZD48L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE0OCIgZG94eXRhZz0id3NzZWFwaS5jOjpzb2FwX3dzc2VfYWRkX0JpbmFyeVNlY3VyaXR5VG9rZW5QRU0iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IHNvYXBfd3NzZV9hZGRfQmluYXJ5U2VjdXJpdHlUb2tlblBFTSAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+aWQ8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmZpbGVuYW1lPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0FkZHMgQmluYXJ5U2VjdXJpdHlUb2tlbiBlbGVtZW50IGZyb20gYSBQRU0gZmlsZS4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+aWQ8L2VtPiZuYnNwOzwvdGQ+PHRkPnN0cmluZyBmb3Igc2lnbmF0dXJlIHJlZmVyZW5jZSA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmZpbGVuYW1lPC9lbT4mbmJzcDs8L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPlNPQVBfT0sgb3IgU09BUF9GQVVMVCB3aXRoIHdzc2VfX0ludmFsaWRTZWN1cml0eSBmYXVsdCB3aGVuIGZpbGUgY2Fubm90IGJlIHJlYWQgb3IgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIGNlcnRpZmljYXRlPC9kZD48L2RsPg0KK1RoaXMgZnVuY3Rpb24gdXNlcyBQRU1fcmVhZF9YNTA5IGZyb20gdGhlIHRoZSBPcGVuU1NMIGxpYnJhcnkgdG8gcmVhZCBhIGNlcnRpZmljYXRlIGZyb20gYSBQRU0gZm9ybWF0dGVkIGZpbGUuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE0NyIgZG94eXRhZz0id3NzZWFwaS5jOjpzb2FwX3dzc2VfYWRkX0JpbmFyeVNlY3VyaXR5VG9rZW5YNTA5IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBzb2FwX3dzc2VfYWRkX0JpbmFyeVNlY3VyaXR5VG9rZW5YNTA5ICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5pZDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5YNTA5ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+Y2VydDwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBZGRzIEJpbmFyeVNlY3VyaXR5VG9rZW4gZWxlbWVudCB3aXRoIFg1MDkgY2VydGlmaWNhdGUuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmlkPC9lbT4mbmJzcDs8L3RkPjx0ZD5zdHJpbmcgZm9yIHNpZ25hdHVyZSByZWZlcmVuY2UgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5jZXJ0PC9lbT4mbmJzcDs8L3RkPjx0ZD5wb2ludHMgdG8gdGhlIFg1MDkgY2VydGlmaWNhdGUgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5TT0FQX09LIG9yIFNPQVBfRU9NPC9kZD48L2RsPg0KK1RoaXMgZnVuY3Rpb24gdXNlcyBpMmRfWDUwOSBmcm9tIHRoZSB0aGUgT3BlblNTTCBsaWJyYXJ5IHRvIGNvbnZlcnQgYW4gWDUwOSBvYmplY3QgdG8gYmluYXJ5IERFUiBmb3JtYXQuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE2MiIgZG94eXRhZz0id3NzZWFwaS5jOjpzb2FwX3dzc2VfYWRkX0tleUluZm8iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fa2V5X2luZm9fdHlwZS5odG1sIj5kc19fS2V5SW5mb1R5cGU8L2E+ICogc29hcF93c3NlX2FkZF9LZXlJbmZvICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0FkZHMgS2V5SW5mbyBlbGVtZW50LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5kc19fS2V5SW5mbyBvYmplY3QgPC9kZD48L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE2NCIgZG94eXRhZz0id3NzZWFwaS5jOjpzb2FwX3dzc2VfYWRkX0tleUluZm9fS2V5TmFtZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgc29hcF93c3NlX2FkZF9LZXlJbmZvX0tleU5hbWUgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPm5hbWU8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQWRkcyBLZXlOYW1lIGVsZW1lbnQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPm5hbWU8L2VtPiZuYnNwOzwvdGQ+PHRkPnN0cmluZyBvZiB0aGUgS2V5TmFtZSA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPlNPQVBfT0s8L2RkPjwvZGw+DQorTm90ZTogdGhlIHJlY29tbWVuZGVkIG1ldGhvZCB0byBhZGQgS2V5IGluZm9ybWF0aW9uIGlzIHRvIHV0aWxpemUgS2V5SWRlbnRpZmllciBpbnN0ZWFkIG9mIEtleU5hbWUuIEEgS2V5TmFtZSBpcyB1c2VmdWwgbWFpbmx5IGZvciBpbnRlcm5hbCB1c2UuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE3MyIgZG94eXRhZz0id3NzZWFwaS5jOjpzb2FwX3dzc2VfYWRkX0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZUVtYmVkZGVkIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBzb2FwX3dzc2VfYWRkX0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZUVtYmVkZGVkICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5pZDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+dmFsdWVUeXBlPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0FkZHMgS2V5SW5mbyBlbGVtZW50IHdpdGggRW1iZWRkZWQgU2VjdXJpdHlUb2tlblJlZmVyZW5jZS4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+aWQ8L2VtPiZuYnNwOzwvdGQ+PHRkPnN0cmluZyBmb3Igc2lnbmF0dXJlIHJlZmVyZW5jZSA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnZhbHVlVHlwZTwvZW0+Jm5ic3A7PC90ZD48dGQ+c3RyaW5nIDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+U09BUF9PSzwvZGQ+PC9kbD4NCitOb3RlOiB0aGlzIGZ1bmN0aW9uIGlzIHVuZGVyIGNvbnN0cnVjdGlvbiBhbmQgdGhlIHJlc3VsdCBkZXBlbmRzIG9uIHVzYWdlIHNjZW5hcmlvcyBkZXBsb3llZCBpbiBwcmFjdGljZS4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTcwIiBkb3h5dGFnPSJ3c3NlYXBpLmM6OnNvYXBfd3NzZV9hZGRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlS2V5SWRlbnRpZmllciIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgc29hcF93c3NlX2FkZF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VLZXlJZGVudGlmaWVyICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5pZDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+dmFsdWVUeXBlPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPnVuc2lnbmVkIGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5kYXRhPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmludCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zaXplPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0FkZHMgS2V5SW5mbyBlbGVtZW50IHdpdGggU2VjdXJpdHlUb2tlblJlZmVyZW5jZS9LZXlJZGVudGlmaWVyIGJpbmFyeSBkYXRhLiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5pZDwvZW0+Jm5ic3A7PC90ZD48dGQ+c3RyaW5nIGZvciBzaWduYXR1cmUgcmVmZXJlbmNlIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+dmFsdWVUeXBlPC9lbT4mbmJzcDs8L3RkPjx0ZD5zdHJpbmcgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5kYXRhPC9lbT4mbmJzcDs8L3RkPjx0ZD5iaW5hcnkgZGF0YSA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNpemU8L2VtPiZuYnNwOzwvdGQ+PHRkPm9mIGJpbmFyeSBkYXRhIDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+U09BUF9PSyA8L2RkPjwvZGw+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTY2IiBkb3h5dGFnPSJ3c3NlYXBpLmM6OnNvYXBfd3NzZV9hZGRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlVVJJIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBzb2FwX3dzc2VfYWRkX0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZVVSSSAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+VVJJPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT52YWx1ZVR5cGU8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQWRkcyBLZXlJbmZvIGVsZW1lbnQgd2l0aCBTZWN1cml0eVRva2VuUmVmZXJlbmNlIFVSSS4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+VVJJPC9lbT4mbmJzcDs8L3RkPjx0ZD5zdHJpbmcgcmVmZXJlbmNpbmcgYSBzZWN1cml0eSB0b2tlbiA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnZhbHVlVHlwZTwvZW0+Jm5ic3A7PC90ZD48dGQ+c3RyaW5nIG9yIE5VTEwgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5TT0FQX09LIDwvZGQ+PC9kbD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNjciIGRveHl0YWc9Indzc2VhcGkuYzo6c29hcF93c3NlX2FkZF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VYNTA5IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBzb2FwX3dzc2VfYWRkX0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZVg1MDkgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPlVSSTwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBZGRzIEtleUluZm8gZWxlbWVudCB3aXRoIFNlY3VyaXR5VG9rZW5SZWZlcmVuY2UgVVJJIHRvIGFuIFg1MDkgY2VydC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+VVJJPC9lbT4mbmJzcDs8L3RkPjx0ZD5zdHJpbmcgcmVmZXJlbmNpbmcgYW4gWDUwOSBjZXJ0aWZpY2F0ZSA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPlNPQVBfT0sgPC9kZD48L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEzMSIgZG94eXRhZz0id3NzZWFwaS5jOjpzb2FwX3dzc2VfYWRkX1NlY3VyaXR5IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eS5odG1sIj5fd3NzZV9fU2VjdXJpdHk8L2E+ICogc29hcF93c3NlX2FkZF9TZWN1cml0eSAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBZGRzIFNlY3VyaXR5IGhlYWRlciBlbGVtZW50LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHkuaHRtbCI+X3dzc2VfX1NlY3VyaXR5PC9hPiBvYmplY3QgPC9kZD48L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEzMiIgZG94eXRhZz0id3NzZWFwaS5jOjpzb2FwX3dzc2VfYWRkX1NlY3VyaXR5X2FjdG9yIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eS5odG1sIj5fd3NzZV9fU2VjdXJpdHk8L2E+ICogc29hcF93c3NlX2FkZF9TZWN1cml0eV9hY3RvciAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+YWN0b3I8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQWRkcyBTZWN1cml0eSBoZWFkZXIgZWxlbWVudCB3aXRoIGFjdG9yIG9yIHJvbGUgYXR0cmlidXRlLiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmFjdG9yPC9lbT4mbmJzcDs8L3RkPjx0ZD5zdHJpbmcgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHkuaHRtbCI+X3dzc2VfX1NlY3VyaXR5PC9hPiBvYmplY3QgPC9kZD48L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEzNSIgZG94eXRhZz0id3NzZWFwaS5jOjpzb2FwX3dzc2VfYWRkX1NpZ25hdHVyZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduYXR1cmVfdHlwZS5odG1sIj5kc19fU2lnbmF0dXJlVHlwZTwvYT4gKiBzb2FwX3dzc2VfYWRkX1NpZ25hdHVyZSAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBZGRzIFNpZ25hdHVyZSBoZWFkZXIgZWxlbWVudC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmF0dXJlX3R5cGUuaHRtbCI+ZHNfX1NpZ25hdHVyZVR5cGU8L2E+IG9iamVjdCA8L2RkPjwvZGw+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTU4IiBkb3h5dGFnPSJ3c3NlYXBpLmM6OnNvYXBfd3NzZV9hZGRfU2lnbmF0dXJlVmFsdWUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IHNvYXBfd3NzZV9hZGRfU2lnbmF0dXJlVmFsdWUgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+aW50Jm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmFsZzwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCB2b2lkICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+a2V5PC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmludCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5rZXlsZW48L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQWRkcyBTaWduZWRJbmZvL1NpZ25hdHVyZU1ldGhvZCBlbGVtZW50LCBzaWducyB0aGUgU2lnbmVkSW5mbyBlbGVtZW50LCBhbmQgYWRkcyB0aGUgcmVzdWx0aW5nIFNpZ25hdHVyZVZhbHVlIGVsZW1lbnQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmFsZzwvZW0+Jm5ic3A7PC90ZD48dGQ+aXMgU09BUF9TTURfSE1BQ19TSEExLCBTT0FQX1NNRF9TSUdOX0RTQV9TSEExLCBvciBTT0FQX1NNRF9TSUdOX1JTQV9TSEExIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+a2V5PC9lbT4mbmJzcDs8L3RkPjx0ZD50byB1c2UgdG8gc2lnbiAoSE1BQyBvciBFVlBfUEtFWSkgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5rZXlsZW48L2VtPiZuYnNwOzwvdGQ+PHRkPmxlbmd0aCBvZiBITUFDIGtleSA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPlNPQVBfT0ssIFNPQVBfRU9NLCBvciBmYXVsdDwvZGQ+PC9kbD4NCitUbyBzaWduIHRoZSBTaWduZWRJbmZvIGVsZW1lbnQgd2l0aCB0aGlzIGZ1bmN0aW9uLCBwb3B1bGF0ZSBTaWduZWRJbmZvIHdpdGggUmVmZXJlbmNlIGVsZW1lbnRzIGZpcnN0IHVzaW5nIHNvYXBfd3NzZV9hZGRfU2lnbmVkSW5mb19SZWZlcmVuY2UuIFRoZSBTaWduZWRJbmZvIGVsZW1lbnQgbXVzdCBub3QgYmUgbW9kaWZpZWQgYWZ0ZXIgc2lnbmluZy48cD4NCitUaGUgU09BUF9YTUxfSU5ERU5UIGFuZCBTT0FQX1hNTF9DQU5PTklDQUwgZmxhZ3MgYXJlIHVzZWQgdG8gc2VyaWFsaXplIHRoZSBTaWduZWRJbmZvIHRvIGNvbXB1dGUgdGhlIHNpZ25hdHVyZS4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTUzIiBkb3h5dGFnPSJ3c3NlYXBpLmM6OnNvYXBfd3NzZV9hZGRfU2lnbmVkSW5mbyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduZWRfaW5mb190eXBlLmh0bWwiPmRzX19TaWduZWRJbmZvVHlwZTwvYT4gKiBzb2FwX3dzc2VfYWRkX1NpZ25lZEluZm8gICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiA8ZW0+c29hcDwvZW0+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQWRkcyBTaWduZWRJbmZvIGVsZW1lbnQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGUuaHRtbCI+ZHNfX1NpZ25lZEluZm9UeXBlPC9hPiBvYmplY3QgPC9kZD48L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE1NCIgZG94eXRhZz0id3NzZWFwaS5jOjpzb2FwX3dzc2VfYWRkX1NpZ25lZEluZm9fUmVmZXJlbmNlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBzb2FwX3dzc2VfYWRkX1NpZ25lZEluZm9fUmVmZXJlbmNlICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5VUkk8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnRyYW5zZm9ybTwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+aW5jbHVzaXZlTmFtZXNwYWNlczwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+SEE8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQWRkcyBTaWduZWRJbmZvIGVsZW1lbnQgd2l0aCBSZWZlcmVuY2UgVVJJLCB0cmFuc2Zvcm0gYWxnb3JpdGhtIHVzZWQsIGFuZCBkaWdlc3QgdmFsdWUuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPlVSSTwvZW0+Jm5ic3A7PC90ZD48dGQ+cmVmZXJlbmNlIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+dHJhbnNmb3JtPC9lbT4mbmJzcDs8L3RkPjx0ZD5zdHJpbmcgc2hvdWxkIGJlIGMxNG5fVVJJIGZvciBleGMtYzE0biBvciBOVUxMIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+aW5jbHVzaXZlTmFtZXNwYWNlczwvZW0+Jm5ic3A7PC90ZD48dGQ+dXNlZCBieSB0aGUgZXhjLWMxNG4gdHJhbnNmb3JtIG9yIE5VTEwgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5IQTwvZW0+Jm5ic3A7PC90ZD48dGQ+aXMgdGhlIFNIQTEgZGlnZXN0IGluIGJpbmFyeSBmb3JtIChsZW5ndGg9U09BUF9TTURfU0hBMV9TSVpFKSA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPlNPQVBfT0sgb3IgU09BUF9FT00gd2hlbiByZWZlcmVuY2VzIGV4Y2VlZCBTT0FQX1dTU0VfTUFYX1JFRjwvZGQ+PC9kbD4NCitUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgdG8gYWRkIG1vcmUgcmVmZXJlbmNlcyB0byB0aGUgd3NzZTpTaWduZWRJbmZvIGVsZW1lbnQuIEEgbWF4aW11bSBudW1iZXIgb2YgU09BUF9XU1NFX01BWF9SRUYgcmVmZXJlbmNlcyBjYW4gYmUgYWRkZWQuIFRoZSBkaWdlc3QgbWV0aG9kIGlzIGFsd2F5cyBTSEExLiBOb3RlOiBYUGF0aCB0cmFuc2Zvcm1zIGNhbm5vdCBiZSBzcGVjaWZpZWQgaW4gdGhpcyByZWxlYXNlLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNTUiIGRveHl0YWc9Indzc2VhcGkuYzo6c29hcF93c3NlX2FkZF9TaWduZWRJbmZvX1NpZ25hdHVyZU1ldGhvZCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgc29hcF93c3NlX2FkZF9TaWduZWRJbmZvX1NpZ25hdHVyZU1ldGhvZCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+bWV0aG9kPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmludCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5jYW5vbmljYWw8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQWRkcyBTaWduZWRJbmZvIGVsZW1lbnQgd2l0aCBTaWduYXR1cmVNZXRob2QuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPm1ldGhvZDwvZW0+Jm5ic3A7PC90ZD48dGQ+aXMgdGhlIFVSSSBvZiB0aGUgc2lnbmF0dXJlIGFsZ29yaXRobSAoZS5nLiBkc19yc2Ffc2hhMSkgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5jYW5vbmljYWw8L2VtPiZuYnNwOzwvdGQ+PHRkPmZsYWcgaW5kaWNhdGluZyB0aGF0IFNpZ25lZEluZm8gaXMgc2lnbmVkIGluIGV4Yy1jMTRuIGZvcm0gPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5TT0FQX09LPC9kZD48L2RsPg0KK05vdGU6IHRoZSBjMTRuOkluY2x1c2l2ZU5hbWVzcGFjZXMvUHJlZml4TGlzdCBpcyBzZXQgdG8gIlNPQVAtRU5WIHdzc2UiLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMzgiIGRveHl0YWc9Indzc2VhcGkuYzo6c29hcF93c3NlX2FkZF9UaW1lc3RhbXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IHNvYXBfd3NzZV9hZGRfVGltZXN0YW1wICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5pZDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD50aW1lX3QmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+bGlmZXRpbWU8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQWRkcyBUaW1lc3RhbXAgZWxlbWVudCB3aXRoIG9wdGlvbmFsIGV4cGlyYXRpb24gZGF0ZSt0aW1lIChsaWZldGltZSkuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5pZDwvZW0+Jm5ic3A7PC90ZD48dGQ+Zm9yIHNpZ25hdHVyZSByZWZlcmVuY2luZyBvciBOVUxMIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+bGlmZXRpbWU8L2VtPiZuYnNwOzwvdGQ+PHRkPmV4cHJlc3NlZCBpbiB0aW1lX3QgdW5pdHMsIG9yIDAgZm9yIG5vIGV4cGlyYXRpb24gPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5TT0FQX09LIDwvZGQ+PC9kbD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNDIiIGRveHl0YWc9Indzc2VhcGkuYzo6c29hcF93c3NlX2FkZF9Vc2VybmFtZVRva2VuRGlnZXN0IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBzb2FwX3dzc2VfYWRkX1VzZXJuYW1lVG9rZW5EaWdlc3QgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmlkPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT51c2VybmFtZTwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+cGFzc3dvcmQ8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQWRkcyBVc2VybmFtZVRva2VuIGVsZW1lbnQgZm9yIGRpZ2VzdCBhdXRoZW50aWNhdGlvbi4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+aWQ8L2VtPiZuYnNwOzwvdGQ+PHRkPnN0cmluZyBmb3Igc2lnbmF0dXJlIHJlZmVyZW5jaW5nIG9yIE5VTEwgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT51c2VybmFtZTwvZW0+Jm5ic3A7PC90ZD48dGQ+c3RyaW5nIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+cGFzc3dvcmQ8L2VtPiZuYnNwOzwvdGQ+PHRkPnN0cmluZyA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPlNPQVBfT0s8L2RkPjwvZGw+DQorQ29tcHV0ZXMgU0hBMSBkaWdlc3Qgb2YgdGhlIHRpbWUgc3RhbXAsIGEgbm9uY2UsIGFuZCB0aGUgcGFzc3dvcmQuIFRoZSBkaWdlc3QgcHJvdmlkZXMgdGhlIGF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzLiBQYXNzd29yZHMgYXJlIE5PVCBzZW50IGluIHRoZSBjbGVhci4gTm90ZTogdGhpcyByZWxlYXNlIHN1cHBvcnRzIHRoZSB1c2Ugb2YgYXQgbW9zdCBvbmUgVXNlcm5hbWVUb2tlbiBpbiB0aGUgaGVhZGVyLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNDEiIGRveHl0YWc9Indzc2VhcGkuYzo6c29hcF93c3NlX2FkZF9Vc2VybmFtZVRva2VuVGV4dCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgc29hcF93c3NlX2FkZF9Vc2VybmFtZVRva2VuVGV4dCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+aWQ8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnVzZXJuYW1lPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5wYXNzd29yZDwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBZGRzIFVzZXJuYW1lVG9rZW4gZWxlbWVudCB3aXRoIG9wdGlvbmFsIGNsZWFyLXRleHQgcGFzc3dvcmQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmlkPC9lbT4mbmJzcDs8L3RkPjx0ZD5zdHJpbmcgZm9yIHNpZ25hdHVyZSByZWZlcmVuY2luZyBvciBOVUxMIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+dXNlcm5hbWU8L2VtPiZuYnNwOzwvdGQ+PHRkPnN0cmluZyA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnBhc3N3b3JkPC9lbT4mbmJzcDs8L3RkPjx0ZD5zdHJpbmcgb3IgTlVMTCB0byBvbWl0IHRoZSBwYXNzd29yZCA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPlNPQVBfT0s8L2RkPjwvZGw+DQorUGFzc3dvcmRzIGFyZSBzZW50IGluIHRoZSBjbGVhciwgc28gdHJhbnNwb3J0LWxldmVsIGVuY3J5cHRpb24gaXMgcmVxdWlyZWQuIE5vdGU6IHRoaXMgcmVsZWFzZSBzdXBwb3J0cyB0aGUgdXNlIG9mIGF0IG1vc3Qgb25lIFVzZXJuYW1lVG9rZW4gaW4gdGhlIGhlYWRlci4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTQ5IiBkb3h5dGFnPSJ3c3NlYXBpLmM6OnNvYXBfd3NzZV9CaW5hcnlTZWN1cml0eVRva2VuIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19iaW5hcnlfc2VjdXJpdHlfdG9rZW4uaHRtbCI+X3dzc2VfX0JpbmFyeVNlY3VyaXR5VG9rZW48L2E+ICogc29hcF93c3NlX0JpbmFyeVNlY3VyaXR5VG9rZW4gICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmlkPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1JldHVybnMgQmluYXJ5U2VjdXJpdHlUb2tlbiBlbGVtZW50IGlmIHByZXNlbnQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmlkPC9lbT4mbmJzcDs8L3RkPjx0ZD5zdHJpbmcgb2YgdG9rZW4gdG8gZ2V0IG9yIE5VTEwgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fYmluYXJ5X3NlY3VyaXR5X3Rva2VuLmh0bWwiPl93c3NlX19CaW5hcnlTZWN1cml0eVRva2VuPC9hPiBvYmplY3Qgb3IgTlVMTCA8L2RkPjwvZGw+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTI0IiBkb3h5dGFnPSJ3c3NlYXBpLmM6OnNvYXBfd3NzZV9jb3B5IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBzb2FwX3dzc2VfY29weSAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5zdHJ1Y3Qgc29hcF9wbHVnaW4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5kc3Q8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+c3RydWN0IHNvYXBfcGx1Z2luICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c3JjPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48Y29kZT4gW3N0YXRpY108L2NvZGU+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitDb3BpZXMgcGx1Z2luIGRhdGEgdG8gbG9jYWxpemUgcGx1Z2luIGRhdGEgZm9yIHRocmVhZHMuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0PltvdXRdPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5kc3Q8L2VtPiZuYnNwOzwvdGQ+PHRkPnRhcmdldCBwbHVnaW4gPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zcmM8L2VtPiZuYnNwOzwvdGQ+PHRkPnNvdXJjZSBwbHVnaW4gPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5TT0FQX09LIDwvZGQ+PC9kbD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMjUiIGRveHl0YWc9Indzc2VhcGkuYzo6c29hcF93c3NlX2RlbGV0ZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB2b2lkIHNvYXBfd3NzZV9kZWxldGUgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+c3RydWN0IHNvYXBfcGx1Z2luICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+cDwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PGNvZGU+IFtzdGF0aWNdPC9jb2RlPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorRGVsZXRlcyBwbHVnaW4gZGF0YS4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luLG91dF08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnA8L2VtPiZuYnNwOzwvdGQ+PHRkPnBsdWdpbiA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPlNPQVBfT0sgPC9kZD48L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEzMyIgZG94eXRhZz0id3NzZWFwaS5jOjpzb2FwX3dzc2VfZGVsZXRlX1NlY3VyaXR5IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHZvaWQgc29hcF93c3NlX2RlbGV0ZV9TZWN1cml0eSAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitEZWxldGVzIFNlY3VyaXR5IGhlYWRlciBlbGVtZW50LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEzNiIgZG94eXRhZz0id3NzZWFwaS5jOjpzb2FwX3dzc2VfZGVsZXRlX1NpZ25hdHVyZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB2b2lkIHNvYXBfd3NzZV9kZWxldGVfU2lnbmF0dXJlICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0RlbGV0ZXMgU2lnbmF0dXJlIGhlYWRlciBlbGVtZW50LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEzMCIgZG94eXRhZz0id3NzZWFwaS5jOjpzb2FwX3dzc2VfZGlzY29ubmVjdCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgc29hcF93c3NlX2Rpc2Nvbm5lY3QgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiA8ZW0+c29hcDwvZW0+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjxjb2RlPiBbc3RhdGljXTwvY29kZT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1ZlcmlmeSBzaWduYXR1cmUgYW5kIFNpZ25lZEluZm8gZGlnZXN0cyBpbml0aWF0ZWQgd2l0aCBzb2FwX3dzc2VfdmVyaWZ5X2F1dG8uIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPlNPQVBfT0sgb3IgZmF1bHQgPC9kZD48L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5TZWUgYWxzbzo8L2I+PC9kdD48ZGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTYyIj5zb2FwX3dzc2VfdmVyaWZ5X2F1dG88L2E+PC9kZD48L2RsPg0KK1RoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBqdXN0IGFmdGVyIGEgbWVzc2FnZSB3YXMgcmVjZWl2ZWQuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE3NCIgZG94eXRhZz0id3NzZWFwaS5jOjpzb2FwX3dzc2VfZmF1bHQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IHNvYXBfd3NzZV9mYXVsdCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VfOGguaHRtbCNhMCI+d3NzZV9fRmF1bHRjb2RlRW51bTwvYT4mbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+ZmF1bHQ8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmRldGFpbDwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitTZXRzIFNPQVAgRmF1bHQgKHN1Yiljb2RlIGZvciBzZXJ2ZXIgcmVzcG9uc2UuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmZhdWx0PC9lbT4mbmJzcDs8L3RkPjx0ZD5pcyBvbmUgb2Ygd3NzZTpGYXVsdGNvZGVFbnVtIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+ZGV0YWlsPC9lbT4mbmJzcDs8L3RkPjx0ZD5zdHJpbmcgd2l0aCBvcHRpb25hbCB0ZXh0IG1lc3NhZ2UgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5TT0FQX0ZBVUxUIDwvZGQ+PC9kbD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNTAiIGRveHl0YWc9Indzc2VhcGkuYzo6c29hcF93c3NlX2dldF9CaW5hcnlTZWN1cml0eVRva2VuIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBzb2FwX3dzc2VfZ2V0X0JpbmFyeVNlY3VyaXR5VG9rZW4gICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmlkPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNoYXIgKiombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+dmFsdWVUeXBlPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPnVuc2lnbmVkIGNoYXIgKiombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+ZGF0YTwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5pbnQgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zaXplPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0dldCB3c3NlOkJpbmFyeVNlY3VyaXR5VG9rZW4gZWxlbWVudCB0b2tlbiBkYXRhIGluIGJpbmFyeSBmb3JtLiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5pZDwvZW0+Jm5ic3A7PC90ZD48dGQ+c3RyaW5nIG9mIHRva2VuIHRvIGdldCBvciBOVUxMIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W291dF08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnZhbHVlVHlwZTwvZW0+Jm5ic3A7PC90ZD48dGQ+c3RyaW5nIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W291dF08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmRhdGE8L2VtPiZuYnNwOzwvdGQ+PHRkPnBvaW50cyB0byBiaW5hcnkgdG9rZW4gZGF0YSA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0PltvdXRdPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zaXplPC9lbT4mbmJzcDs8L3RkPjx0ZD5pcyBsZW5ndGggb2YgYmluYXJ5IHRva2VuIDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+U09BUF9PSyBvciBTT0FQX0ZBVUxUIHdpdGggd3NzZTpTZWN1cml0eVRva2VuVW5hdmFpbGFibGUgZmF1bHQgPC9kZD48L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE1MSIgZG94eXRhZz0id3NzZWFwaS5jOjpzb2FwX3dzc2VfZ2V0X0JpbmFyeVNlY3VyaXR5VG9rZW5YNTA5IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IFg1MDkgKiBzb2FwX3dzc2VfZ2V0X0JpbmFyeVNlY3VyaXR5VG9rZW5YNTA5ICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5pZDwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitHZXQgWDUwOSB3c3NlOkJpbmFyeVNlY3VyaXR5VG9rZW4gY2VydGlmaWNhdGUgYW5kIHZlcmlmeSBpdHMgY29udGVudC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+aWQ8L2VtPiZuYnNwOzwvdGQ+PHRkPnN0cmluZyBvZiB0b2tlbiB0byBnZXQgb3IgTlVMTCA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPlg1MDkgY2VydGlmaWNhdGUgKGR5bmFtaWNhbGx5IGFsbG9jYXRlZCkgb3IgTlVMTCB3aXRoIHdzc2U6U2VjdXJpdHlUb2tlblVuYXZhaWxhYmxlIGZhdWx0IDwvZGQ+PC9kbD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNjUiIGRveHl0YWc9Indzc2VhcGkuYzo6c29hcF93c3NlX2dldF9LZXlJbmZvX0tleU5hbWUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IHNvYXBfd3NzZV9nZXRfS2V5SW5mb19LZXlOYW1lICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1JldHVybnMgS2V5TmFtZSBlbGVtZW50IGlmIHByZXNlbnQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPnN0cmluZyBvciBOVUxMIDwvZGQ+PC9kbD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNzIiIGRveHl0YWc9Indzc2VhcGkuYzo6c29hcF93c3NlX2dldF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VLZXlJZGVudGlmaWVyIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBzb2FwX3dzc2VfZ2V0X0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZUtleUlkZW50aWZpZXIgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+aW50ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c2l6ZTwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitSZXR1cm5zIEtleUluZm8vU2VjdXJpdHlUb2tlblJlZmVyZW5jZS9LZXlJZGVudGlmaWVyIGJpbmFyeSBkYXRhLiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5bb3V0XTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c2l6ZTwvZW0+Jm5ic3A7PC90ZD48dGQ+aXMgc2V0IHRvIHRoZSBzaXplIG9mIHRoZSBkZWNvZGVkIGRhdGEgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5kYXRhIG9yIE5VTEwgPC9kZD48L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE3MSIgZG94eXRhZz0id3NzZWFwaS5jOjpzb2FwX3dzc2VfZ2V0X0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZUtleUlkZW50aWZpZXJWYWx1ZVR5cGUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY29uc3QgY2hhciAqIHNvYXBfd3NzZV9nZXRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlS2V5SWRlbnRpZmllclZhbHVlVHlwZSAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitSZXR1cm5zIEtleUluZm8vU2VjdXJpdHlUb2tlblJlZmVyZW5jZS9LZXlJZGVudGlmaWVyL1ZhbHVlVHlwZSBpZiBwcmVzZW50LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5zdHJpbmcgb3IgTlVMTCA8L2RkPjwvZGw+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTY4IiBkb3h5dGFnPSJ3c3NlYXBpLmM6OnNvYXBfd3NzZV9nZXRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlVVJJIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNvbnN0IGNoYXIgKiBzb2FwX3dzc2VfZ2V0X0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZVVSSSAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitSZXR1cm5zIGEgU2VjdXJpdHlUb2tlblJlZmVyZW5jZSBVUkkgaWYgcHJlc2VudC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+c3RyaW5nIG9yIE5VTEwgPC9kZD48L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE2OSIgZG94eXRhZz0id3NzZWFwaS5jOjpzb2FwX3dzc2VfZ2V0X0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZVg1MDkiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gWDUwOSAqIHNvYXBfd3NzZV9nZXRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlWDUwOSAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitSZXR1cm5zIGEgWDUwOSBjZXJ0aWZpY2F0ZSBpZiBwcmVzZW50IGFzIGEgQmluYXJ5U2VjdXJpdHkgdG9rZW4uIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPlg1MDkgb2JqZWN0IG9yIE5VTEwgd2l0aCB3c3NlOlNlY3VyaXR5VG9rZW5VbmF2YWlsYWJsZSBmYXVsdCA8L2RkPjwvZGw+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTU3IiBkb3h5dGFnPSJ3c3NlYXBpLmM6OnNvYXBfd3NzZV9nZXRfU2lnbmVkSW5mb19TaWduYXR1cmVNZXRob2QiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IHNvYXBfd3NzZV9nZXRfU2lnbmVkSW5mb19TaWduYXR1cmVNZXRob2QgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+aW50ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+YWxnPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0dldCBTaWduYXR1cmVNZXRob2QgYWxnb3JpdGhtLiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5bb3V0XTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+YWxnPC9lbT4mbmJzcDs8L3RkPjx0ZD5pcyBTT0FQX1NNRF9ITUFDX1NIQTEsIFNPQVBfU01EX1ZSRllfRFNBX1NIQTEsIG9yIFNPQVBfU01EX1ZSRllfUlNBX1NIQTEgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5TT0FQX09LIG9yIFNPQVBfRkFVTFQgd2l0aCB3c3NlOlVuc3VwcG9ydGVkQWxnb3JpdGhtIG9yIHdzc2U6RmFpbGVkQ2hlY2sgZmF1bHQgPC9kZD48L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE0NCIgZG94eXRhZz0id3NzZWFwaS5jOjpzb2FwX3dzc2VfZ2V0X1VzZXJuYW1lIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNvbnN0IGNoYXIgKiBzb2FwX3dzc2VfZ2V0X1VzZXJuYW1lICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1JldHVybnMgVXNlcm5hbWVUb2tlbi91c2VybmFtZSBzdHJpbmcgb3Igd3NzZTpGYWlsZWRBdXRoZW50aWNhdGlvbiBmYXVsdC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+VXNlcm5hbWVUb2tlbi91c2VybmFtZSBzdHJpbmcgb3IgTlVMTCB3aXRoIHdzc2U6RmFpbGVkQXV0aGVudGljYXRpb24gZmF1bHQgZXJyb3Igc2V0IDwvZGQ+PC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+U2VlIGFsc286PC9iPjwvZHQ+PGRkPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2EyOCI+c29hcF93c3NlX3ZlcmlmeV9QYXNzd29yZDwvYT48L2RkPjwvZGw+DQorVGhlIHJldHVybmVkIHVzZXJuYW1lIHNob3VsZCBiZSB1c2VkIHRvIGxvb2t1cCB0aGUgdXNlcidzIHBhc3N3b3JkIGluIGEgZGljdGlvbmFyeSBvciBkYXRhYmFzZSBmb3Igc2VydmVyLXNpZGUgYXV0aGVudGljYXRpb24gd2l0aCBzb2FwX3dzc2VfdmVyaWZ5X1Bhc3N3b3JkLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMjMiIGRveHl0YWc9Indzc2VhcGkuYzo6c29hcF93c3NlX2luaXQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IHNvYXBfd3NzZV9pbml0ICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPnN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RhdGEuaHRtbCI+c29hcF93c3NlX2RhdGE8L2E+ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+ZGF0YTwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PGNvZGU+IFtzdGF0aWNdPC9jb2RlPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorSW5pdGlhbGl6ZXMgcGx1Z2luIGRhdGEuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0PltpbixvdXRdPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5kYXRhPC9lbT4mbmJzcDs8L3RkPjx0ZD5wbHVnaW4gZGF0YSA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPlNPQVBfT0sgPC9kZD48L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE2MyIgZG94eXRhZz0id3NzZWFwaS5jOjpzb2FwX3dzc2VfS2V5SW5mbyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19rZXlfaW5mb190eXBlLmh0bWwiPmRzX19LZXlJbmZvVHlwZTwvYT4gKiBzb2FwX3dzc2VfS2V5SW5mbyAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitSZXR1cm5zIEtleUluZm8gZWxlbWVudCBpZiBwcmVzZW50LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5kc19fS2V5SW5mbyBvYmplY3Qgb3IgTlVMTCA8L2RkPjwvZGw+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTI5IiBkb3h5dGFnPSJ3c3NlYXBpLmM6OnNvYXBfd3NzZV9wcmVwYXJlY2xlYW51cCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB2b2lkIHNvYXBfd3NzZV9wcmVwYXJlY2xlYW51cCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5zdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kYXRhLmh0bWwiPnNvYXBfd3NzZV9kYXRhPC9hPiAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmRhdGE8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjxjb2RlPiBbc3RhdGljXTwvY29kZT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1Jlc3RvcmVzIGVuZ2luZSBzdGF0ZS4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luLG91dF08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmRhdGE8L2VtPiZuYnNwOzwvdGQ+PHRkPnBsdWdpbiBkYXRhIDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMjgiIGRveHl0YWc9Indzc2VhcGkuYzo6c29hcF93c3NlX3ByZXBhcmVmaW5hbCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgc29hcF93c3NlX3ByZXBhcmVmaW5hbCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PGNvZGU+IFtzdGF0aWNdPC9jb2RlPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQ29sbGVjdHMgdGhlIGRpZ2VzdHMgb2YgYWxsIHRoZSB3c3U6SWQgZWxlbWVudHMgYW5kIHBvcHVsYXRlcyB0aGUgU2lnbmVkSW5mby4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+U09BUF9PSyBvciBmYXVsdDwvZGQ+PC9kbD4NCitUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQganVzdCBiZWZvcmUgdGhlIG1lc3NhZ2UgaXMgc2VuZC4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTI2IiBkb3h5dGFnPSJ3c3NlYXBpLmM6OnNvYXBfd3NzZV9wcmVwYXJlaW5pdCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgc29hcF93c3NlX3ByZXBhcmVpbml0ICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48Y29kZT4gW3N0YXRpY108L2NvZGU+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitJbml0aWF0ZXMgbWVzc2FnZSBwcmVwcm9jZXNzaW5nIHdpdGggZ1NPQVAgZW5naW5lJ3MgcHJlcGFyZWluaXQgY2FsbGJhY2suIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPlNPQVBfT0sgb3IgZmF1bHQ8L2RkPjwvZGw+DQorVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIHRvIGFuYWx5emUgYSBtZXNzYWdlIGJlZm9yZSB0cmFuc21pc3Npb24uICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEyNyIgZG94eXRhZz0id3NzZWFwaS5jOjpzb2FwX3dzc2VfcHJlcGFyZXNlbmQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IHNvYXBfd3NzZV9wcmVwYXJlc2VuZCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+YnVmPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPnNpemVfdCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5sZW48L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjxjb2RlPiBbc3RhdGljXTwvY29kZT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1Rha2VzIGEgcGllY2Ugb2YgdGhlIFhNTCBtZXNzYWdlICh0b2tlbml6ZWQpIHRvIGNvbXB1dGUgZGlnZXN0LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5idWY8L2VtPiZuYnNwOzwvdGQ+PHRkPnN0cmluZyAoWE1MICJ0b2tlbml6ZWQiKSB0byBiZSBzZW5kIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+bGVuPC9lbT4mbmJzcDs8L3RkPjx0ZD5idWYgbGVuZ3RoIDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+U09BUF9PSyBvciBmYXVsdDwvZGQ+PC9kbD4NCitUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgdG8gYW5hbHl6ZSBhIG1lc3NhZ2UgKHVzdWFsbHkgZHVyaW5nIHRoZSBIVFRQIGNvbnRlbnQgbGVuZ3RoIHBoYXNlKS4gTm90ZTogbmVzdGVkIGVsZW1lbnRzIHdpdGggd3N1OklkIGF0dHJpYnV0ZXMgY2Fubm90IGJlIGluZGl2aWR1YWxseSBzaWduZWQgaW4gdGhpcyByZWxlYXNlLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMzQiIGRveHl0YWc9Indzc2VhcGkuYzo6c29hcF93c3NlX1NlY3VyaXR5IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eS5odG1sIj5fd3NzZV9fU2VjdXJpdHk8L2E+ICogc29hcF93c3NlX1NlY3VyaXR5ICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1JldHVybnMgU2VjdXJpdHkgaGVhZGVyIGVsZW1lbnQgaWYgcHJlc2VudC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3NlY3VyaXR5Lmh0bWwiPl93c3NlX19TZWN1cml0eTwvYT4gb2JqZWN0IG9yIE5VTEwgPC9kZD48L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEyMCIgZG94eXRhZz0id3NzZWFwaS5jOjpzb2FwX3dzc2Vfc2Vzc2lvbl9jbGVhbnVwIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHZvaWQgc29hcF93c3NlX3Nlc3Npb25fY2xlYW51cCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PGNvZGU+IFtzdGF0aWNdPC9jb2RlPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorUmVtb3ZlcyBleHBpcmVkIGF1dGhlbnRpY2F0aW9uIGRhdGEgZnJvbSB0aGUgZGlnZXN0IGF1dGhlbnRpY2F0aW9uIHNlc3Npb24gZGF0YWJhc2UuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTE5IiBkb3h5dGFnPSJ3c3NlYXBpLmM6OnNvYXBfd3NzZV9zZXNzaW9uX3ZlcmlmeSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgc29hcF93c3NlX3Nlc3Npb25fdmVyaWZ5ICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXImbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+aGFzaDwvZW0+W1NPQVBfU01EX1NIQTFfU0laRV0sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5jcmVhdGVkPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5ub25jZTwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PGNvZGU+IFtzdGF0aWNdPC9jb2RlPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVmVyaWZpZXMgYW5kIHVwZGF0ZXMgdGhlIGRpZ2VzdCwgbm9uY2UsIGFuZCBjcmVhdGlvbiB0aW1lIGFnYWluc3QgdGhlIGRpZ2VzdCBhdXRoZW50aWNhdGlvbiBzZXNzaW9uIGRhdGFiYXNlIHRvIHByZXZlbnQgcmVwbGF5IGF0dGFja3MuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmhhc2g8L2VtPiZuYnNwOzwvdGQ+PHRkPmJpbmFyeSBkaWdlc3QgdmFsdWUgb2YgUGFzc3dvcmREaWdlc3QgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5jcmVhdGVkPC9lbT4mbmJzcDs8L3RkPjx0ZD5zdHJpbmcgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5ub25jZTwvZW0+Jm5ic3A7PC90ZD48dGQ+c3RyaW5nIChiYXNlNjQpIDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+U09BUF9PSyBvciBTT0FQX0ZBVUxUIDwvZGQ+PC9kbD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNzYiIGRveHl0YWc9Indzc2VhcGkuYzo6c29hcF93c3NlX3NpZ24iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IHNvYXBfd3NzZV9zaWduICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmludCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5hbGc8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3Qgdm9pZCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmtleTwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5pbnQmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+a2V5bGVuPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1VzZXMgdGhlIHdzc2UgcGx1Z2luIHRvIHNpZ24gYWxsIHdzdTpJZCBhdHRyaWJ1dGVkIGVsZW1lbnRzLiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5hbGc8L2VtPiZuYnNwOzwvdGQ+PHRkPmlzIHRoZSBzaWduYXR1cmUgYWxnb3JpdGhtIFNPQVBfU01EX0hNQUNfU0hBMSwgU09BUF9TTURfU0lHTl9EU0FfU0hBMSwgb3IgU09BUF9TTURfU0lHTl9SU0FfU0hBMSA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmtleTwvZW0+Jm5ic3A7PC90ZD48dGQ+aXMgdGhlIEhNQUMgc2VjcmV0IGtleSBvciBEU0EvUlNBIHByaXZhdGUgRVZQX1BLRVkgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5rZXlsZW48L2VtPiZuYnNwOzwvdGQ+PHRkPmlzIHRoZSBITUFDIGtleSBsZW5ndGggPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5TT0FQX09LIG9yIGZhdWx0PC9kZD48L2RsPg0KK1RoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWN0dWFsbHkgc2lnbiB0aGUgbWVzc2FnZSwgYnV0IGluaXRpYXRlcyB0aGUgcGx1Z2luJ3Mgc2lnbmF0dXJlIGFsZ29yaXRobSB0byBzaWduIHRoZSBtZXNzYWdlIHVwb24gbWVzc2FnZSB0cmFuc2Zlci4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTc3IiBkb3h5dGFnPSJ3c3NlYXBpLmM6OnNvYXBfd3NzZV9zaWduX2JvZHkiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IHNvYXBfd3NzZV9zaWduX2JvZHkgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+aW50Jm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmFsZzwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCB2b2lkICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+a2V5PC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmludCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5rZXlsZW48L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVXNlcyB0aGUgd3NzZSBwbHVnaW4gdG8gc2lnbiBhbGwgd3N1OklkIGF0dHJpYnV0ZWQgZWxlbWVudHMsIGluY2x1ZGluZyB0aGUgU09BUCBCb2R5IChieSBhZGRpbmcgYSB3c3U6SWQ9IkJvZHkiIGF0dHJpYnV0ZSkuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmFsZzwvZW0+Jm5ic3A7PC90ZD48dGQ+aXMgdGhlIHNpZ25hdHVyZSBhbGdvcml0aG0gU09BUF9TTURfSE1BQ19TSEExLCBTT0FQX1NNRF9TSUdOX0RTQV9TSEExLCBvciBTT0FQX1NNRF9TSUdOX1JTQV9TSEExIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+a2V5PC9lbT4mbmJzcDs8L3RkPjx0ZD5pcyB0aGUgSE1BQyBzZWNyZXQga2V5IG9yIERTQS9SU0EgcHJpdmF0ZSBFVlBfUEtFWSA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmtleWxlbjwvZW0+Jm5ic3A7PC90ZD48dGQ+aXMgdGhlIEhNQUMga2V5IGxlbmd0aCA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPlNPQVBfT0s8L2RkPjwvZGw+DQorVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBhY3R1YWxseSBzaWduIHRoZSBtZXNzYWdlLCBidXQgaW5pdGlhdGVzIHRoZSBwbHVnaW4ncyBzaWduYXR1cmUgYWxnb3JpdGhtIHRvIHNpZ24gdGhlIG1lc3NhZ2UgdXBvbiBtZXNzYWdlIHRyYW5zZmVyLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMzciIGRveHl0YWc9Indzc2VhcGkuYzo6c29hcF93c3NlX1NpZ25hdHVyZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduYXR1cmVfdHlwZS5odG1sIj5kc19fU2lnbmF0dXJlVHlwZTwvYT4gKiBzb2FwX3dzc2VfU2lnbmF0dXJlICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1JldHVybnMgU2lnbmF0dXJlIGhlYWRlciBlbGVtZW50IGlmIHByZXNlbnQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25hdHVyZV90eXBlLmh0bWwiPmRzX19TaWduYXR1cmVUeXBlPC9hPiBvYmplY3Qgb3IgTlVMTCA8L2RkPjwvZGw+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTU2IiBkb3h5dGFnPSJ3c3NlYXBpLmM6OnNvYXBfd3NzZV9TaWduZWRJbmZvIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGUuaHRtbCI+ZHNfX1NpZ25lZEluZm9UeXBlPC9hPiAqIHNvYXBfd3NzZV9TaWduZWRJbmZvICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1JldHVybnMgU2lnbmVkSW5mbyBlbGVtZW50IGlmIHByZXNlbnQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGUuaHRtbCI+ZHNfX1NpZ25lZEluZm9UeXBlPC9hPiBvYmplY3Qgb3IgTlVMTCA8L2RkPjwvZGw+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTM5IiBkb3h5dGFnPSJ3c3NlYXBpLmM6OnNvYXBfd3NzZV9UaW1lc3RhbXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzdV9fX19fdGltZXN0YW1wLmh0bWwiPl93c3VfX1RpbWVzdGFtcDwvYT4gKiBzb2FwX3dzc2VfVGltZXN0YW1wICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1JldHVybnMgVGltZXN0YW1wIGVsZW1lbnQgaWYgcHJlc2VudC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzdV9fX19fdGltZXN0YW1wLmh0bWwiPl93c3VfX1RpbWVzdGFtcDwvYT4gb2JqZWN0IG9yIE5VTEwgPC9kZD48L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE0MyIgZG94eXRhZz0id3NzZWFwaS5jOjpzb2FwX3dzc2VfVXNlcm5hbWVUb2tlbiIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fdXNlcm5hbWVfdG9rZW4uaHRtbCI+X3dzc2VfX1VzZXJuYW1lVG9rZW48L2E+ICogc29hcF93c3NlX1VzZXJuYW1lVG9rZW4gICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmlkPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1JldHVybnMgVXNlcm5hbWVUb2tlbiBlbGVtZW50IGlmIHByZXNlbnQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmlkPC9lbT4mbmJzcDs8L3RkPjx0ZD5zdHJpbmcgb2YgVXNlcm5hbWVUb2tlbiBvciBOVUxMIDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3VzZXJuYW1lX3Rva2VuLmh0bWwiPl93c3NlX19Vc2VybmFtZVRva2VuPC9hPiBvYmplY3Qgb3IgTlVMTDwvZGQ+PC9kbD4NCitOb3RlOiB0aGlzIHJlbGVhc2Ugc3VwcG9ydHMgdGhlIHVzZSBvZiBhdCBtb3N0IG9uZSBVc2VybmFtZVRva2VuIGluIHRoZSBoZWFkZXIuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE3OSIgZG94eXRhZz0id3NzZWFwaS5jOjpzb2FwX3dzc2VfdmVyaWZ5X2F1dG8iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IHNvYXBfd3NzZV92ZXJpZnlfYXV0byAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5pbnQmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+YWxnPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IHZvaWQgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5rZXk8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+c2l6ZV90Jm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmtleWxlbjwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitVc2VzIHRoZSB3c3NlIHBsdWdpbiB0byBpbml0aWF0ZSB0aGUgYXV0b21hdGljIHZlcmlmaWNhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIGFuZCBTaWduZWRJbmZvIFJlZmVyZW5jZSBkaWdlc3RzLiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5hbGc8L2VtPiZuYnNwOzwvdGQ+PHRkPnRvIHZlcmlmeSBzaWduYXR1cmUgaWYgc2lnbmF0dXJlIGhhcyBubyBzZWNyZXQgb3IgcHVibGljIGtleSwgdXNlIFNPQVBfU01EX05PTkUgdG8gb21pdCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmtleTwvZW0+Jm5ic3A7PC90ZD48dGQ+aXMgSE1BQyBrZXkgb3IgRVZQX1BLRVkgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5rZXlsZW48L2VtPiZuYnNwOzwvdGQ+PHRkPmlzIEhNQUMga2V5IGxlbmd0aCA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPlNPQVBfT0s8L2RkPjwvZGw+DQorVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBhY3R1YWxseSB2ZXJpZnkgdGhlIG1lc3NhZ2UsIGJ1dCBpbml0aWF0ZXMgdGhlIHBsdWdpbidzIGFsZ29yaXRobSB0byBzdG9yZSB0aGUgbWVzc2FnZSBpbiBhIERPTSB0byBhdXRvbWF0aWNhbGx5IHZlcmlmeSB0aGUgc2lnbmF0dXJlIGFuZCBkaWdlc3Rlcy4gSWYgdGhlIG1lc3NhZ2UgZG9lcyBub3QgY29udGFpbiBhIGtleSB0byB2ZXJpZnkgdGhlIHNpZ25hdHVyZSwgdGhlIGFsZywga2V5LCBhbmQga2V5bGVuIHBhcmFtZXRlcnMgYXJlIHVzZWQuIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoZSBYNTA5IGNlcnRpZmljYXRlIHVzZWQgdG8gdmVyaWZ5IHRoZSBzaWduYXR1cmUgaXMgdmVyaWZpZWQsIHdoaWNoIHJlcXVpcmVzIHNvYXAtJmd0O2NhZmlsZSBhbmQvb3Igc29hcC0mZ3Q7Y2FwYXRoIHRvIGJlIHNldC4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTYxIiBkb3h5dGFnPSJ3c3NlYXBpLmM6OnNvYXBfd3NzZV92ZXJpZnlfZGlnZXN0IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBzb2FwX3dzc2VfdmVyaWZ5X2RpZ2VzdCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5pbnQmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+YWxnPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5pZDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD51bnNpZ25lZCBjaGFyJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmhhc2g8L2VtPltTT0FQX1NNRF9NQVhfU0laRV08L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1ZlcmlmaWVzIHRoZSBkaWdlc3QgdmFsdWUgb2YgYW4gWE1MIGVsZW1lbnQgcmVmZXJlbmNlZCBieSBpZCBhZ2FpbnN0IHRoZSBoYXNoLiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5hbGc8L2VtPiZuYnNwOzwvdGQ+PHRkPmRpZ2VzdCBhbGdvcml0aG0gPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5pZDwvZW0+Jm5ic3A7PC90ZD48dGQ+c3RyaW5nIG9mIHRoZSBYTUwgZWxlbWVudCB0byB2ZXJpZnkgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5oYXNoPC9lbT4mbmJzcDs8L3RkPjx0ZD5kaWdlc3QgdmFsdWUgdG8gdmVyaWZ5IGFnYWluc3QgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5TT0FQX09LIG9yIGZhdWx0IDwvZGQ+PC9kbD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhODAiIGRveHl0YWc9Indzc2VhcGkuYzo6c29hcF93c3NlX3ZlcmlmeV9kb25lIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBzb2FwX3dzc2VfdmVyaWZ5X2RvbmUgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiA8ZW0+c29hcDwvZW0+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVGVybWluYXRlcyB0aGUgYXV0b21hdGljIHZlcmlmaWNhdGlvbiBvZiBzaWduYXR1cmVzLiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5TT0FQX09LIDwvZGQ+PC9kbD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNzgiIGRveHl0YWc9Indzc2VhcGkuYzo6c29hcF93c3NlX3ZlcmlmeV9pbml0IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBzb2FwX3dzc2VfdmVyaWZ5X2luaXQgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiA8ZW0+c29hcDwvZW0+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVXNlcyB0aGUgd3NzZSBwbHVnaW4gdG8gaW5pdGlhdGUgdGhlIHZlcmlmaWNhdGlvbiBvZiB0aGUgc2lnbmF0dXJlIGFuZCBTaWduZWRJbmZvIFJlZmVyZW5jZSBkaWdlc3RzLiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5TT0FQX09LPC9kZD48L2RsPg0KK1RoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWN0dWFsbHkgdmVyaWZ5IHRoZSBtZXNzYWdlLCBidXQgaW5pdGlhdGVzIHRoZSBwbHVnaW4ncyBkYXRhIHRvIHN0b3JlIHRoZSBtZXNzYWdlIGluIGEgRE9NIHRvIHZlcmlmeSB0aGUgc2lnbmF0dXJlLiBUaGUgc2lnbmF0dXJlIGFuZCBkaWdlc3RzIGluIHRoZSBET00gbXVzdCBiZSB2ZXJpZmllZCBtYW51YWxseS4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTQ1IiBkb3h5dGFnPSJ3c3NlYXBpLmM6OnNvYXBfd3NzZV92ZXJpZnlfUGFzc3dvcmQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IHNvYXBfd3NzZV92ZXJpZnlfUGFzc3dvcmQgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnBhc3N3b3JkPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1ZlcmlmaWVzIHRoZSBzdXBwbGllZCBwYXNzd29yZCBvciBzZXRzIHdzc2U6RmFpbGVkQXV0aGVudGljYXRpb24gZmF1bHQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnBhc3N3b3JkPC9lbT4mbmJzcDs8L3RkPjx0ZD5zdHJpbmcgdG8gdmVyaWZ5IGFnYWluc3QgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5TT0FQX09LIChhdXRob3JpemVkKSBvciBTT0FQX0ZBVUxUIHdpdGggd3NzZTpGYWlsZWRBdXRoZW50aWNhdGlvbiBmYXVsdDwvZGQ+PC9kbD4NCitUaGUgdmVyaWZpY2F0aW9uIHN1cHBvcnRzIGJvdGggY2xlYXItdGV4dCBwYXNzd29yZCB2ZXJpZmljYXRpb24gYW5kIGRpZ2VzdCBwYXNzd29yZCBhdXRoZW50aWNhdGlvbi4gRm9yIGRpZ2VzdCBhdXRoZW50aWNhdGlvbiBhIGhpc3RvcnkgbWVjaGFuaXNtIHdpdGggYSBkaWdlc3QgYXV0aGVudGljYXRpb24gc2Vzc2lvbiBkYXRhYmFzZSBlbnN1cmVzIHByb3RlY3Rpb24gYWdhaW5zdCByZXBsYXkgYXR0YWNrcy4gTm90ZTogdGhpcyByZWxlYXNlIHN1cHBvcnRzIHRoZSB1c2Ugb2YgYXQgbW9zdCBvbmUgVXNlcm5hbWVUb2tlbiBpbiB0aGUgaGVhZGVyLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNTkiIGRveHl0YWc9Indzc2VhcGkuYzo6c29hcF93c3NlX3ZlcmlmeV9TaWduYXR1cmVWYWx1ZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgc29hcF93c3NlX3ZlcmlmeV9TaWduYXR1cmVWYWx1ZSAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5pbnQmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+YWxnPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IHZvaWQgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5rZXk8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+aW50Jm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmtleWxlbjwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitWZXJpZmllcyB0aGUgU2lnbmF0dXJlVmFsdWUgb2YgYSBTaWduZWRJbmZvIGVsZW1lbnQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmFsZzwvZW0+Jm5ic3A7PC90ZD48dGQ+aXMgU09BUF9TTURfSE1BQ19TSEExLCBTT0FQX1NNRF9WUkZZX0RTQV9TSEExLCBvciBTT0FQX1NNRF9WUkZZX1JTQV9TSEExIGRldGVybWluZWQgYnkgdGhlIFNpZ25lZEluZm8vU2lnbmF0dXJlTWV0aG9kIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+a2V5PC9lbT4mbmJzcDs8L3RkPjx0ZD50byB1c2UgdG8gdmVyaWZ5IChITUFDIG9yIEVWUF9QS0VZKSA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmtleWxlbjwvZW0+Jm5ic3A7PC90ZD48dGQ+bGVuZ3RoIG9mIEhNQUMga2V5IDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+U09BUF9PSywgU09BUF9FT00sIG9yIGZhdWx0PC9kZD48L2RsPg0KK1RoaXMgZnVuY3Rpb24gc2VhcmNoZXMgZm9yIHRoZSBTaWduZWRJbmZvIGVsZW1lbnQgaW4gdGhlIHNvYXAtJmd0O2RvbSBET00gdHJlZSB0byB2ZXJpZnkgdGhlIHNpZ25hdHVyZSBpbiB0aGUgU2lnbmF0dXJlVmFsdWUgZWxlbWVudC4gVXNpbmcgdGhlIERPTSBlbnN1cmVzIHdlIHdpbGwgdmVyaWZ5IHRoZSBzaWduYXR1cmUgb2YgYSBTaWduZWRJbmZvIGFzIGl0IHdhcyBleGFjdGx5IHJlY2VpdmVkIGJ5IHRoZSBwYXJzZXIsIGJ5IHVzaW5nIHRoZSAtRFdJVEhfRE9NIGNvbXBpbGUgZmxhZyBhbmQgU09BUF9YTUxfRE9NIHJ1bnRpbWUgZmxhZy4gSWYgdGhlcmUgaXMgbm8gRE9NLCBpdCB2ZXJpZmllcyB0aGUgc2lnbmF0dXJlIG9mIHRoZSBkZXNlcmlhbGl6ZWQgU2lnbmVkSW5mbyBlbGVtZW50IGluIHRoZSBTT0FQIEhlYWRlci4gSG93ZXZlciwgc2VyaWFsaXppbmcgZGVzZXJpYWxpemVkIGRhdGEgbWF5IGNoYW5nZSB0aGUgb2N0ZXQgc3RyZWFtIHRoYXQgd2FzIHNpZ25lZCwgdW5sZXNzIHdlJ3JlIHVzaW5nIGdTT0FQIGFzIHByb2R1Y2VycyBhbmQgY29uc3VtZXJzICh3aXRoIHRoZSBTT0FQX1hNTF9JTkRFTlQgZmxhZyByZXNldCkuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE2MCIgZG94eXRhZz0id3NzZWFwaS5jOjpzb2FwX3dzc2VfdmVyaWZ5X1NpZ25lZEluZm8iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IHNvYXBfd3NzZV92ZXJpZnlfU2lnbmVkSW5mbyAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitWZXJpZmllcyB0aGUgZGlnZXN0IHZhbHVlcyBvZiB0aGUgWE1MIGVsZW1lbnRzIHJlZmVyZW5jZWQgYnkgdGhlIFNpZ25lZEluZm8gUmVmZXJlbmNlcy4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+U09BUF9PSyBvciBmYXVsdDwvZGQ+PC9kbD4NCitUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciB0aGUgU2lnbmVkSW5mbyBlbGVtZW50IGluIHRoZSBzb2FwLSZndDtkb20gRE9NIHRyZWUgdG8gdmVyaWZ5IHRoZSBkaWdlc3RzIGNvbnRhaW5lZCB0aGVyZWluLiBVc2luZyB0aGUgRE9NIGVuc3VyZXMgd2Ugd2lsbCB2ZXJpZnkgdGhlIGRpZ2VzdHMgb2YgdGhlIGxvY2FsbHkgc2lnbmVkIGVsZW1lbnRzIGFzIHRoZXkgd2VyZSBleGFjdGx5IHJlY2VpdmVkIGJ5IHRoZSBwYXJzZXIsIGJ5IHVzaW5nIHRoZSAtRFdJVEhfRE9NIGNvbXBpbGUgZmxhZyBhbmQgU09BUF9YTUxfRE9NIHJ1bnRpbWUgZmxhZy4gSWYgdGhlcmUgaXMgbm8gRE9NLCB0aGUgZnVuY3Rpb24gZmFpbHMuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE0MCIgZG94eXRhZz0id3NzZWFwaS5jOjpzb2FwX3dzc2VfdmVyaWZ5X1RpbWVzdGFtcCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgc29hcF93c3NlX3ZlcmlmeV9UaW1lc3RhbXAgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiA8ZW0+c29hcDwvZW0+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVmVyaWZpZXMgdGhlIFRpbWVzdGFtcC9FeHBpcmVzIGVsZW1lbnQgYWdhaW5zdCB0aGUgY3VycmVudCB0aW1lLiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5TT0FQX09LIG9yIFNPQVBfRkFVTFQgd2l0aCB3c3NlOkZhaWxlZEF1dGhlbnRpY2F0aW9uIGZhdWx0PC9kZD48L2RsPg0KK1NldHMgd3NzZTpGYWlsZWRBdXRoZW50aWNhdGlvbiBmYXVsdCBpZiB3c3U6VGltZXN0YW1wIGlzIGV4cGlyZWQuIFRoZSBTT0FQX1dTU0VfQ0xLU0tFVyB2YWx1ZSBpcyB1c2VkIGFzIGEgbWFyZ2luIHRvIG1pdGlnYXRlIGNsb2NrIHNrZXcuIEtlZXBzIHNpbGVudCB3aGVuIG5vIHRpbWVzdGFtcCBpcyBzdXBwbGllZCBvciBubyBleHBpcmF0aW9uIGRhdGUgaXMgaW5jbHVkZWQgaW4gdGhlIHdzdTpUaW1lc3RhbXAgZWxlbWVudC4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTUyIiBkb3h5dGFnPSJ3c3NlYXBpLmM6OnNvYXBfd3NzZV92ZXJpZnlfWDUwOSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgc29hcF93c3NlX3ZlcmlmeV9YNTA5ICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPlg1MDkgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5jZXJ0PC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1ZlcmlmaWVzIFg1MDkgY2VydGlmaWNhdGUgYWdhaW5zdCBzb2FwLSZndDtjYWZpbGUsIHNvYXAtJmd0O2NhcGF0aCwgYW5kIHNvYXAtJmd0O2NybGZpbGUuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmNlcnQ8L2VtPiZuYnNwOzwvdGQ+PHRkPlg1MDkgY2VydGlmaWNhdGUgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5TT0FQX09LIG9yIGZhdWx0PC9kZD48L2RsPg0KK1RoaXMgaXMgYW4gZXhwZW5zaXZlIG9wZXJhdGlvbiwgc2luY2Ugd2UgcmVhZCB0aGUgY2FmaWxlIGFuZCBjcmVhdGUgdGhlIG9iamVjdHMgZXZlcnkgdGltZSB3ZSBuZWVkIHRvIHZlcmlmeSBhIGNlcnRpZmljYXRlLiBGb3IgZnV0dXJlIHJlbGVhc2VzLCB3ZSBzaG91bGQgc3RvcmUgdGhpcyBkYXRhIHBlcm1hbmVudGx5IGluIHRoZSBnU09BUCBlbmdpbmUgb3IgcGx1Z2luLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+PGgyPlZhcmlhYmxlIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExNSIgZG94eXRhZz0id3NzZWFwaS5jOjpjMTRuX1VSSSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjb25zdCBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhMTIiPmMxNG5fVVJJPC9hPiA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTEyIiBkb3h5dGFnPSJ3c3NlYXBpLmM6OmRzX2RzYV9zaGExVVJJIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNvbnN0IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E5Ij5kc19kc2Ffc2hhMVVSSTwvYT4gPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2RzYS1zaGExIiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExMSIgZG94eXRhZz0id3NzZWFwaS5jOjpkc19obWFjX3NoYTFVUkkiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY29uc3QgY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTgiPmRzX2htYWNfc2hhMVVSSTwvYT4gPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2htYWMtc2hhMSIgICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMTMiIGRveHl0YWc9Indzc2VhcGkuYzo6ZHNfcnNhX3NoYTFVUkkiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY29uc3QgY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTEwIj5kc19yc2Ffc2hhMVVSSTwvYT4gPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3JzYS1zaGExIiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExMCIgZG94eXRhZz0id3NzZWFwaS5jOjpkc19zaGExVVJJIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNvbnN0IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E3Ij5kc19zaGExVVJJPC9hPiA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMTQiIGRveHl0YWc9Indzc2VhcGkuYzo6ZHNfVVJJIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNvbnN0IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2ExMSI+ZHNfVVJJPC9hPiA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE0IiBkb3h5dGFnPSJ3c3NlYXBpLmM6OnNvYXBfd3NzZV9pZCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjb25zdCBjaGFyIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2ExIj5zb2FwX3dzc2VfaWQ8L2E+WzE0XSA9IFNPQVBfV1NTRV9JRCAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1BsdWdpbiBpZGVudGlmaWNhdGlvbiBmb3IgcGx1Z2luIHJlZ2lzdHJ5ICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExNyIgZG94eXRhZz0id3NzZWFwaS5jOjpzb2FwX3dzc2Vfc2Vzc2lvbiIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19zZXNzaW9uLmh0bWwiPnNvYXBfd3NzZV9zZXNzaW9uPC9hPiogPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19zZXNzaW9uLmh0bWwiPnNvYXBfd3NzZV9zZXNzaW9uPC9hPiA9IE5VTEw8Y29kZT4gW3N0YXRpY108L2NvZGU+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVGhlIGRpZ2VzdCBhdXRoZW50aWNhdGlvbiBzZXNzaW9uIGRhdGFiYXNlICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExOCIgZG94eXRhZz0id3NzZWFwaS5jOjpzb2FwX3dzc2Vfc2Vzc2lvbl9sb2NrIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IE1VVEVYX1RZUEUgPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhjLmh0bWwjYTE4Ij5zb2FwX3dzc2Vfc2Vzc2lvbl9sb2NrPC9hPjxjb2RlPiBbc3RhdGljXTwvY29kZT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitMb2NrIGZvciBkaWdlc3QgYXV0aGVudGljYXRpb24gc2Vzc2lvbiBkYXRhYmFzZSBleGNsdXNpdmUgYWNjZXNzICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE3IiBkb3h5dGFnPSJ3c3NlYXBpLmM6Ondzc2VfQmFzZTY0QmluYXJ5VVJJIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNvbnN0IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E0Ij53c3NlX0Jhc2U2NEJpbmFyeVVSSTwvYT4gPSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy1zb2FwLW1lc3NhZ2Utc2VjdXJpdHktMS4wI0Jhc2U2NEJpbmFyeSIgICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNiIgZG94eXRhZz0id3NzZWFwaS5jOjp3c3NlX1Bhc3N3b3JkRGlnZXN0VVJJIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNvbnN0IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2EzIj53c3NlX1Bhc3N3b3JkRGlnZXN0VVJJPC9hPiA9ICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXVzZXJuYW1lLXRva2VuLXByb2ZpbGUtMS4wI1Bhc3N3b3JkRGlnZXN0IiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE1IiBkb3h5dGFnPSJ3c3NlYXBpLmM6Ondzc2VfUGFzc3dvcmRUZXh0VVJJIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNvbnN0IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2EyIj53c3NlX1Bhc3N3b3JkVGV4dFVSSTwvYT4gPSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy11c2VybmFtZS10b2tlbi1wcm9maWxlLTEuMCNQYXNzd29yZFRleHQiICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTkiIGRveHl0YWc9Indzc2VhcGkuYzo6d3NzZV9YNTA5djNTdWJqZWN0S2V5SWRlbnRpZmllclVSSSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjb25zdCBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhNiI+d3NzZV9YNTA5djNTdWJqZWN0S2V5SWRlbnRpZmllclVSSTwvYT4gPSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy14NTA5LXRva2VuLXByb2ZpbGUtMS4wI1g1MDlTdWJqZWN0S2V5SWRlbnRpZmllciIgICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhOCIgZG94eXRhZz0id3NzZWFwaS5jOjp3c3NlX1g1MDl2M1VSSSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjb25zdCBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhNSI+d3NzZV9YNTA5djNVUkk8L2E+ID0gImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3MteDUwOS10b2tlbi1wcm9maWxlLTEuMCNYNTA5djMiICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTE2IiBkb3h5dGFnPSJ3c3NlYXBpLmM6OndzdV9VUkkiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY29uc3QgY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTEzIj53c3VfVVJJPC9hPiA9ICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktdXRpbGl0eS0xLjAueHNkIiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBGcmkgQXVnIDE5IDEwOjQxOjQ1IDIwMDUgZm9yIGdTT0FQIFdTLVNlY3VyaXR5IGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3dzc2VhcGlfOGNfX2luY2wubWFwIGIvZG9jL3dzc2UvaHRtbC93c3NlYXBpXzhjX19pbmNsLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTg2NjE2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC93c3NlYXBpXzhjX19pbmNsLm1hcApAQCAtMCwwICsxLDMgQEAKK2Jhc2UgcmVmZXJlcgorcmVjdCAkd3NzZWFwaV84aC5odG1sIDE2LDE2NyA4NSwxOTMKK3JlY3QgJHNtZGV2cF84aC5odG1sIDg5LDkyIDE1NiwxMTkKZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvd3NzZWFwaV84Y19faW5jbC5tZDUgYi9kb2Mvd3NzZS9odG1sL3dzc2VhcGlfOGNfX2luY2wubWQ1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MDAyODUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3dzc2VhcGlfOGNfX2luY2wubWQ1CkBAIC0wLDAgKzEgQEAKK2M0MTZmMWQ3YTIxZGIyNzFhOWI5ODFhOGFlMGUwZDlkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC93c3NlYXBpXzhjX19pbmNsLnBuZyBiL2RvYy93c3NlL2h0bWwvd3NzZWFwaV84Y19faW5jbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTExZTdiYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvd3NzZWFwaV84Y19faW5jbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC93c3NlYXBpXzhoLmh0bWwgYi9kb2Mvd3NzZS9odG1sL3dzc2VhcGlfOGguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTIyNTczCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC93c3NlYXBpXzhoLmh0bWwKQEAgLTAsMCArMSwyODgzIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPg0KKzx0aXRsZT5nU09BUCBXUy1TZWN1cml0eTogL1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvZ3NvYXAvZG9jL3dzc2Uvd3NzZWFwaS5oIEZpbGUgUmVmZXJlbmNlPC90aXRsZT4NCis8bGluayBocmVmPSJkb3h5Z2VuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQorPC9oZWFkPjxib2R5Pg0KKzwhLS0gR2VuZXJhdGVkIGJ5IERveHlnZW4gMS4zLjggLS0+DQorPGRpdiBjbGFzcz0icWluZGV4Ij48YSBjbGFzcz0icWluZGV4IiBocmVmPSJpbmRleC5odG1sIj5NYWluJm5ic3A7UGFnZTwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJhbm5vdGF0ZWQuaHRtbCI+Q2xhc3MmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZpbGVzLmh0bWwiPkZpbGUmbmJzcDtMaXN0PC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9ImZ1bmN0aW9ucy5odG1sIj5DbGFzcyZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iZ2xvYmFscy5odG1sIj5GaWxlJm5ic3A7TWVtYmVyczwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJwYWdlcy5odG1sIj5SZWxhdGVkJm5ic3A7UGFnZXM8L2E+PC9kaXY+DQorPGgxPi9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL2dzb2FwL2RvYy93c3NlL3dzc2VhcGkuaCBGaWxlIFJlZmVyZW5jZTwvaDE+PGNvZGU+I2luY2x1ZGUgInNvYXBILmgiPC9jb2RlPjxicj4NCis8Y29kZT4jaW5jbHVkZSAiPGEgY2xhc3M9ImVsIiBocmVmPSJzbWRldnBfOGguaHRtbCI+c21kZXZwLmg8L2E+IjwvY29kZT48YnI+DQorDQorPHA+DQorSW5jbHVkZSBkZXBlbmRlbmN5IGdyYXBoIGZvciB3c3NlYXBpLmg6PHA+PGNlbnRlcj48aW1nIHNyYz0id3NzZWFwaV84aF9faW5jbC5wbmciIGJvcmRlcj0iMCIgdXNlbWFwPSIjd3NzZWFwaS5oX21hcCIgYWx0PSJJbmNsdWRlIGRlcGVuZGVuY3kgZ3JhcGgiPjwvY2VudGVyPg0KKzxtYXAgbmFtZT0id3NzZWFwaS5oX21hcCI+DQorPGFyZWEgaHJlZj0ic21kZXZwXzhoLmh0bWwiIHNoYXBlPSJyZWN0IiBjb29yZHM9Ijg5LDkyLDE1NiwxMTgiIGFsdD0iIj4NCis8L21hcD4NCisNCis8cD4NCitUaGlzIGdyYXBoIHNob3dzIHdoaWNoIGZpbGVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5jbHVkZSB0aGlzIGZpbGU6PHA+PGNlbnRlcj48aW1nIHNyYz0id3NzZWFwaV84aF9fZGVwX19pbmNsLnBuZyIgYm9yZGVyPSIwIiB1c2VtYXA9IiN3c3NlYXBpLmhkZXBfbWFwIiBhbHQ9IkluY2x1ZGVkIGJ5IGRlcGVuZGVuY3kgZ3JhcGgiPjwvY2VudGVyPg0KKzxtYXAgbmFtZT0id3NzZWFwaS5oZGVwX21hcCI+DQorPGFyZWEgaHJlZj0id3NzZWFwaV84Yy5odG1sIiBzaGFwZT0icmVjdCIgY29vcmRzPSI2LDE3LDc2LDQ0IiBhbHQ9IiI+DQorPC9tYXA+DQorPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPkNsYXNzZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c3RydWN0ICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rzb2FwX193c3NlX19kYXRhLmh0bWwiPnNvYXBfd3NzZV9kYXRhPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij53c3NlcGkgcGx1Z2luIGRhdGEgIDxhIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RhdGEuaHRtbCNfZGV0YWlscyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5zdHJ1Y3QgJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RpZ2VzdC5odG1sIj5zb2FwX3dzc2VfZGlnZXN0PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5EaWdlc3QgZGljdGlvbmFyeTogbGlua2VkIGxpc3Qgb2YgSUQtaGFzaCBwYWlycy4gIDxhIGhyZWY9InN0cnVjdHNvYXBfX3dzc2VfX2RpZ2VzdC5odG1sI19kZXRhaWxzIj5Nb3JlLi4uPC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjb2xzcGFuPTI+PGJyPjxoMj5EZWZpbmVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPiNkZWZpbmUmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2EwIj5TT0FQX1dTU0VfSUQ8L2E+Jm5ic3A7Jm5ic3A7Jm5ic3A7IlNPQVAtV1NTRS0wLjkiPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+RnVuY3Rpb25zPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eS5odG1sIj5fd3NzZV9fU2VjdXJpdHk8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2ExNCI+c29hcF93c3NlX2FkZF9TZWN1cml0eTwvYT4gKHN0cnVjdCBzb2FwICpzb2FwKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BZGRzIFNlY3VyaXR5IGhlYWRlciBlbGVtZW50LiAgPGEgaHJlZj0iI2ExNCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eS5odG1sIj5fd3NzZV9fU2VjdXJpdHk8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2ExNSI+c29hcF93c3NlX2FkZF9TZWN1cml0eV9hY3RvcjwvYT4gKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICphY3Rvcik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QWRkcyBTZWN1cml0eSBoZWFkZXIgZWxlbWVudCB3aXRoIGFjdG9yIG9yIHJvbGUgYXR0cmlidXRlLiAgPGEgaHJlZj0iI2ExNSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnZvaWQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2ExNiI+c29hcF93c3NlX2RlbGV0ZV9TZWN1cml0eTwvYT4gKHN0cnVjdCBzb2FwICpzb2FwKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5EZWxldGVzIFNlY3VyaXR5IGhlYWRlciBlbGVtZW50LiAgPGEgaHJlZj0iI2ExNiI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eS5odG1sIj5fd3NzZV9fU2VjdXJpdHk8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2ExNyI+c29hcF93c3NlX1NlY3VyaXR5PC9hPiAoc3RydWN0IHNvYXAgKnNvYXApPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlJldHVybnMgU2VjdXJpdHkgaGVhZGVyIGVsZW1lbnQgaWYgcHJlc2VudC4gIDxhIGhyZWY9IiNhMTciPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduYXR1cmVfdHlwZS5odG1sIj5kc19fU2lnbmF0dXJlVHlwZTwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTE4Ij5zb2FwX3dzc2VfYWRkX1NpZ25hdHVyZTwvYT4gKHN0cnVjdCBzb2FwICpzb2FwKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BZGRzIFNpZ25hdHVyZSBoZWFkZXIgZWxlbWVudC4gIDxhIGhyZWY9IiNhMTgiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD52b2lkJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhMTkiPnNvYXBfd3NzZV9kZWxldGVfU2lnbmF0dXJlPC9hPiAoc3RydWN0IHNvYXAgKnNvYXApPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkRlbGV0ZXMgU2lnbmF0dXJlIGhlYWRlciBlbGVtZW50LiAgPGEgaHJlZj0iI2ExOSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25hdHVyZV90eXBlLmh0bWwiPmRzX19TaWduYXR1cmVUeXBlPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhMjAiPnNvYXBfd3NzZV9TaWduYXR1cmU8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+UmV0dXJucyBTaWduYXR1cmUgaGVhZGVyIGVsZW1lbnQgaWYgcHJlc2VudC4gIDxhIGhyZWY9IiNhMjAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2EyMSI+c29hcF93c3NlX2FkZF9UaW1lc3RhbXA8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIHRpbWVfdCBsaWZldGltZSk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QWRkcyBUaW1lc3RhbXAgZWxlbWVudCB3aXRoIG9wdGlvbmFsIGV4cGlyYXRpb24gZGF0ZSt0aW1lIChsaWZldGltZSkuICA8YSBocmVmPSIjYTIxIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzdV9fX19fdGltZXN0YW1wLmh0bWwiPl93c3VfX1RpbWVzdGFtcDwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTIyIj5zb2FwX3dzc2VfVGltZXN0YW1wPC9hPiAoc3RydWN0IHNvYXAgKnNvYXApPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlJldHVybnMgVGltZXN0YW1wIGVsZW1lbnQgaWYgcHJlc2VudC4gIDxhIGhyZWY9IiNhMjIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2EyMyI+c29hcF93c3NlX3ZlcmlmeV9UaW1lc3RhbXA8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VmVyaWZpZXMgdGhlIFRpbWVzdGFtcC9FeHBpcmVzIGVsZW1lbnQgYWdhaW5zdCB0aGUgY3VycmVudCB0aW1lLiAgPGEgaHJlZj0iI2EyMyI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTI0Ij5zb2FwX3dzc2VfYWRkX1VzZXJuYW1lVG9rZW5UZXh0PC9hPiAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICp1c2VybmFtZSwgY29uc3QgY2hhciAqcGFzc3dvcmQpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkFkZHMgVXNlcm5hbWVUb2tlbiBlbGVtZW50IHdpdGggb3B0aW9uYWwgY2xlYXItdGV4dCBwYXNzd29yZC4gIDxhIGhyZWY9IiNhMjQiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2EyNSI+c29hcF93c3NlX2FkZF9Vc2VybmFtZVRva2VuRGlnZXN0PC9hPiAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICp1c2VybmFtZSwgY29uc3QgY2hhciAqcGFzc3dvcmQpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkFkZHMgVXNlcm5hbWVUb2tlbiBlbGVtZW50IGZvciBkaWdlc3QgYXV0aGVudGljYXRpb24uICA8YSBocmVmPSIjYTI1Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX3VzZXJuYW1lX3Rva2VuLmh0bWwiPl93c3NlX19Vc2VybmFtZVRva2VuPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhMjYiPnNvYXBfd3NzZV9Vc2VybmFtZVRva2VuPC9hPiAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5SZXR1cm5zIFVzZXJuYW1lVG9rZW4gZWxlbWVudCBpZiBwcmVzZW50LiAgPGEgaHJlZj0iI2EyNiI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTI3Ij5zb2FwX3dzc2VfZ2V0X1VzZXJuYW1lPC9hPiAoc3RydWN0IHNvYXAgKnNvYXApPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlJldHVybnMgVXNlcm5hbWVUb2tlbi91c2VybmFtZSBzdHJpbmcgb3Igd3NzZTpGYWlsZWRBdXRoZW50aWNhdGlvbiBmYXVsdC4gIDxhIGhyZWY9IiNhMjciPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2EyOCI+c29hcF93c3NlX3ZlcmlmeV9QYXNzd29yZDwvYT4gKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpwYXNzd29yZCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VmVyaWZpZXMgdGhlIHN1cHBsaWVkIHBhc3N3b3JkIG9yIHNldHMgd3NzZTpGYWlsZWRBdXRoZW50aWNhdGlvbiBmYXVsdC4gIDxhIGhyZWY9IiNhMjgiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2EyOSI+c29hcF93c3NlX2FkZF9CaW5hcnlTZWN1cml0eVRva2VuPC9hPiAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICp2YWx1ZVR5cGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBzaXplKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BZGRzIEJpbmFyeVNlY3VyaXR5VG9rZW4gZWxlbWVudC4gIDxhIGhyZWY9IiNhMjkiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2EzMCI+c29hcF93c3NlX2FkZF9CaW5hcnlTZWN1cml0eVRva2VuWDUwOTwvYT4gKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgWDUwOSAqY2VydCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QWRkcyBCaW5hcnlTZWN1cml0eVRva2VuIGVsZW1lbnQgd2l0aCBYNTA5IGNlcnRpZmljYXRlLiAgPGEgaHJlZj0iI2EzMCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTMxIj5zb2FwX3dzc2VfYWRkX0JpbmFyeVNlY3VyaXR5VG9rZW5QRU08L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BZGRzIEJpbmFyeVNlY3VyaXR5VG9rZW4gZWxlbWVudCBmcm9tIGEgUEVNIGZpbGUuICA8YSBocmVmPSIjYTMxIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzc2VfX19fX2JpbmFyeV9zZWN1cml0eV90b2tlbi5odG1sIj5fd3NzZV9fQmluYXJ5U2VjdXJpdHlUb2tlbjwvYT4gKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTMyIj5zb2FwX3dzc2VfQmluYXJ5U2VjdXJpdHlUb2tlbjwvYT4gKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+UmV0dXJucyBCaW5hcnlTZWN1cml0eVRva2VuIGVsZW1lbnQgaWYgcHJlc2VudC4gIDxhIGhyZWY9IiNhMzIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2EzMyI+c29hcF93c3NlX2dldF9CaW5hcnlTZWN1cml0eVRva2VuPC9hPiAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCBjaGFyICoqdmFsdWVUeXBlLCB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50ICpzaXplKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5HZXQgd3NzZTpCaW5hcnlTZWN1cml0eVRva2VuIGVsZW1lbnQgdG9rZW4gZGF0YSBpbiBiaW5hcnkgZm9ybS4gIDxhIGhyZWY9IiNhMzMiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5YNTA5ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2EzNCI+c29hcF93c3NlX2dldF9CaW5hcnlTZWN1cml0eVRva2VuWDUwOTwvYT4gKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+R2V0IFg1MDkgd3NzZTpCaW5hcnlTZWN1cml0eVRva2VuIGNlcnRpZmljYXRlIGFuZCB2ZXJpZnkgaXRzIGNvbnRlbnQuICA8YSBocmVmPSIjYTM0Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhMzUiPnNvYXBfd3NzZV92ZXJpZnlfWDUwOTwvYT4gKHN0cnVjdCBzb2FwICpzb2FwLCBYNTA5ICpjZXJ0KTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5WZXJpZmllcyBYNTA5IGNlcnRpZmljYXRlIGFnYWluc3Qgc29hcC0mZ3Q7Y2FmaWxlLCBzb2FwLSZndDtjYXBhdGgsIGFuZCBzb2FwLSZndDtjcmxmaWxlLiAgPGEgaHJlZj0iI2EzNSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGUuaHRtbCI+ZHNfX1NpZ25lZEluZm9UeXBlPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhMzYiPnNvYXBfd3NzZV9hZGRfU2lnbmVkSW5mbzwvYT4gKHN0cnVjdCBzb2FwICpzb2FwKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BZGRzIFNpZ25lZEluZm8gZWxlbWVudC4gIDxhIGhyZWY9IiNhMzYiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2EzNyI+c29hcF93c3NlX2FkZF9TaWduZWRJbmZvX1JlZmVyZW5jZTwvYT4gKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpVUkksIGNvbnN0IGNoYXIgKnRyYW5zZm9ybSwgY29uc3QgY2hhciAqaW5jbHVzaXZlTmFtZXNwYWNlcywgY29uc3QgY2hhciAqSEEpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkFkZHMgU2lnbmVkSW5mbyBlbGVtZW50IHdpdGggUmVmZXJlbmNlIFVSSSwgdHJhbnNmb3JtIGFsZ29yaXRobSB1c2VkLCBhbmQgZGlnZXN0IHZhbHVlLiAgPGEgaHJlZj0iI2EzNyI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTM4Ij5zb2FwX3dzc2VfYWRkX1NpZ25lZEluZm9fU2lnbmF0dXJlTWV0aG9kPC9hPiAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm1ldGhvZCwgaW50IGNhbm9uaWNhbCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QWRkcyBTaWduZWRJbmZvIGVsZW1lbnQgd2l0aCBTaWduYXR1cmVNZXRob2QuICA8YSBocmVmPSIjYTM4Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmVkX2luZm9fdHlwZS5odG1sIj5kc19fU2lnbmVkSW5mb1R5cGU8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2EzOSI+c29hcF93c3NlX1NpZ25lZEluZm88L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+UmV0dXJucyBTaWduZWRJbmZvIGVsZW1lbnQgaWYgcHJlc2VudC4gIDxhIGhyZWY9IiNhMzkiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E0MCI+c29hcF93c3NlX2dldF9TaWduZWRJbmZvX1NpZ25hdHVyZU1ldGhvZDwvYT4gKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgKmFsZyk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+R2V0IFNpZ25hdHVyZU1ldGhvZCBhbGdvcml0aG0uICA8YSBocmVmPSIjYTQwIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhNDEiPnNvYXBfd3NzZV9hZGRfU2lnbmF0dXJlVmFsdWU8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGFsZywgY29uc3Qgdm9pZCAqa2V5LCBpbnQga2V5bGVuKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BZGRzIFNpZ25lZEluZm8vU2lnbmF0dXJlTWV0aG9kIGVsZW1lbnQsIHNpZ25zIHRoZSBTaWduZWRJbmZvIGVsZW1lbnQsIGFuZCBhZGRzIHRoZSByZXN1bHRpbmcgU2lnbmF0dXJlVmFsdWUgZWxlbWVudC4gIDxhIGhyZWY9IiNhNDEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E0MiI+c29hcF93c3NlX3ZlcmlmeV9TaWduYXR1cmVWYWx1ZTwvYT4gKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgYWxnLCBjb25zdCB2b2lkICprZXksIGludCBrZXlsZW4pPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlZlcmlmaWVzIHRoZSBTaWduYXR1cmVWYWx1ZSBvZiBhIFNpZ25lZEluZm8gZWxlbWVudC4gIDxhIGhyZWY9IiNhNDIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E0MyI+c29hcF93c3NlX3ZlcmlmeV9TaWduZWRJbmZvPC9hPiAoc3RydWN0IHNvYXAgKnNvYXApPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlZlcmlmaWVzIHRoZSBkaWdlc3QgdmFsdWVzIG9mIHRoZSBYTUwgZWxlbWVudHMgcmVmZXJlbmNlZCBieSB0aGUgU2lnbmVkSW5mbyBSZWZlcmVuY2VzLiAgPGEgaHJlZj0iI2E0MyI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTQ0Ij5zb2FwX3dzc2VfdmVyaWZ5X2RpZ2VzdDwvYT4gKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgYWxnLCBjb25zdCBjaGFyICppZCwgdW5zaWduZWQgY2hhciBoYXNoW1NPQVBfU01EX01BWF9TSVpFXSk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VmVyaWZpZXMgdGhlIGRpZ2VzdCB2YWx1ZSBvZiBhbiBYTUwgZWxlbWVudCByZWZlcmVuY2VkIGJ5IGlkIGFnYWluc3QgdGhlIGhhc2guICA8YSBocmVmPSIjYTQ0Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fa2V5X2luZm9fdHlwZS5odG1sIj5kc19fS2V5SW5mb1R5cGU8L2E+ICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E0NSI+c29hcF93c3NlX2FkZF9LZXlJbmZvPC9hPiAoc3RydWN0IHNvYXAgKnNvYXApPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkFkZHMgS2V5SW5mbyBlbGVtZW50LiAgPGEgaHJlZj0iI2E0NSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2tleV9pbmZvX3R5cGUuaHRtbCI+ZHNfX0tleUluZm9UeXBlPC9hPiAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhNDYiPnNvYXBfd3NzZV9LZXlJbmZvPC9hPiAoc3RydWN0IHNvYXAgKnNvYXApPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlJldHVybnMgS2V5SW5mbyBlbGVtZW50IGlmIHByZXNlbnQuICA8YSBocmVmPSIjYTQ2Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhNDciPnNvYXBfd3NzZV9hZGRfS2V5SW5mb19LZXlOYW1lPC9hPiAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkFkZHMgS2V5TmFtZSBlbGVtZW50LiAgPGEgaHJlZj0iI2E0NyI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTQ4Ij5zb2FwX3dzc2VfZ2V0X0tleUluZm9fS2V5TmFtZTwvYT4gKHN0cnVjdCBzb2FwICpzb2FwKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5SZXR1cm5zIEtleU5hbWUgZWxlbWVudCBpZiBwcmVzZW50LiAgPGEgaHJlZj0iI2E0OCI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTQ5Ij5zb2FwX3dzc2VfYWRkX0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZVVSSTwvYT4gKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpVUkksIGNvbnN0IGNoYXIgKnZhbHVlVHlwZSk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QWRkcyBLZXlJbmZvIGVsZW1lbnQgd2l0aCBTZWN1cml0eVRva2VuUmVmZXJlbmNlIFVSSS4gIDxhIGhyZWY9IiNhNDkiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E1MCI+c29hcF93c3NlX2FkZF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VYNTA5PC9hPiAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKlVSSSk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+QWRkcyBLZXlJbmZvIGVsZW1lbnQgd2l0aCBTZWN1cml0eVRva2VuUmVmZXJlbmNlIFVSSSB0byBhbiBYNTA5IGNlcnQuICA8YSBocmVmPSIjYTUwIj48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhNTEiPnNvYXBfd3NzZV9nZXRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlVVJJPC9hPiAoc3RydWN0IHNvYXAgKnNvYXApPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlJldHVybnMgYSBTZWN1cml0eVRva2VuUmVmZXJlbmNlIFVSSSBpZiBwcmVzZW50LiAgPGEgaHJlZj0iI2E1MSI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPlg1MDkgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTUyIj5zb2FwX3dzc2VfZ2V0X0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZVg1MDk8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+UmV0dXJucyBhIFg1MDkgY2VydGlmaWNhdGUgaWYgcHJlc2VudCBhcyBhIEJpbmFyeVNlY3VyaXR5IHRva2VuLiAgPGEgaHJlZj0iI2E1MiI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmludCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTUzIj5zb2FwX3dzc2VfYWRkX0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZUtleUlkZW50aWZpZXI8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKnZhbHVlVHlwZSwgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IHNpemUpPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPkFkZHMgS2V5SW5mbyBlbGVtZW50IHdpdGggU2VjdXJpdHlUb2tlblJlZmVyZW5jZS9LZXlJZGVudGlmaWVyIGJpbmFyeSBkYXRhLiAgPGEgaHJlZj0iI2E1MyI+PC9hPjxicj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTU0Ij5zb2FwX3dzc2VfZ2V0X0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZUtleUlkZW50aWZpZXJWYWx1ZVR5cGU8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+UmV0dXJucyBLZXlJbmZvL1NlY3VyaXR5VG9rZW5SZWZlcmVuY2UvS2V5SWRlbnRpZmllci9WYWx1ZVR5cGUgaWYgcHJlc2VudC4gIDxhIGhyZWY9IiNhNTQiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jb25zdCB1bnNpZ25lZCBjaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E1NSI+c29hcF93c3NlX2dldF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VLZXlJZGVudGlmaWVyPC9hPiAoc3RydWN0IHNvYXAgKnNvYXAsIGludCAqc2l6ZSk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+UmV0dXJucyBLZXlJbmZvL1NlY3VyaXR5VG9rZW5SZWZlcmVuY2UvS2V5SWRlbnRpZmllciBiaW5hcnkgZGF0YS4gIDxhIGhyZWY9IiNhNTUiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E1NiI+c29hcF93c3NlX2FkZF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VFbWJlZGRlZDwvYT4gKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqdmFsdWVUeXBlKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5BZGRzIEtleUluZm8gZWxlbWVudCB3aXRoIEVtYmVkZGVkIFNlY3VyaXR5VG9rZW5SZWZlcmVuY2UuICA8YSBocmVmPSIjYTU2Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhNTciPnNvYXBfd3NzZV9mYXVsdDwvYT4gKHN0cnVjdCBzb2FwICpzb2FwLCBlbnVtIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZV84aC5odG1sI2EwIj53c3NlX19GYXVsdGNvZGVFbnVtPC9hPiBmYXVsdCwgY29uc3QgY2hhciAqZGV0YWlsKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhNTgiPnNvYXBfd3NzZTwvYT4gKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnAsIHZvaWQgKmFyZyk8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+UGx1Z2luIHJlZ2lzdHJ5IGZ1bmN0aW9uLCB1c2VkIHdpdGggc29hcF9yZWdpc3Rlcl9wbHVnaW4uICA8YSBocmVmPSIjYTU4Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhNTkiPnNvYXBfd3NzZV9zaWduPC9hPiAoc3RydWN0IHNvYXAgKnNvYXAsIGludCBhbGcsIGNvbnN0IHZvaWQgKmtleSwgaW50IGtleWxlbik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VXNlcyB0aGUgd3NzZSBwbHVnaW4gdG8gc2lnbiBhbGwgd3N1OklkIGF0dHJpYnV0ZWQgZWxlbWVudHMuICA8YSBocmVmPSIjYTU5Ij48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+aW50Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhNjAiPnNvYXBfd3NzZV9zaWduX2JvZHk8L2E+IChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGFsZywgY29uc3Qgdm9pZCAqa2V5LCBpbnQga2V5bGVuKTwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5Vc2VzIHRoZSB3c3NlIHBsdWdpbiB0byBzaWduIGFsbCB3c3U6SWQgYXR0cmlidXRlZCBlbGVtZW50cywgaW5jbHVkaW5nIHRoZSBTT0FQIEJvZHkgKGJ5IGFkZGluZyBhIHdzdTpJZD0iQm9keSIgYXR0cmlidXRlKS4gIDxhIGhyZWY9IiNhNjAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E2MSI+c29hcF93c3NlX3ZlcmlmeV9pbml0PC9hPiAoc3RydWN0IHNvYXAgKnNvYXApPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlVzZXMgdGhlIHdzc2UgcGx1Z2luIHRvIGluaXRpYXRlIHRoZSB2ZXJpZmljYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBhbmQgU2lnbmVkSW5mbyBSZWZlcmVuY2UgZGlnZXN0cy4gIDxhIGhyZWY9IiNhNjEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E2MiI+c29hcF93c3NlX3ZlcmlmeV9hdXRvPC9hPiAoc3RydWN0IHNvYXAgKnNvYXAsIGludCBhbGcsIGNvbnN0IHZvaWQgKmtleSwgc2l6ZV90IGtleWxlbik8L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VXNlcyB0aGUgd3NzZSBwbHVnaW4gdG8gaW5pdGlhdGUgdGhlIGF1dG9tYXRpYyB2ZXJpZmljYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBhbmQgU2lnbmVkSW5mbyBSZWZlcmVuY2UgZGlnZXN0cy4gIDxhIGhyZWY9IiNhNjIiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5pbnQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E2MyI+c29hcF93c3NlX3ZlcmlmeV9kb25lPC9hPiAoc3RydWN0IHNvYXAgKnNvYXApPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlRlcm1pbmF0ZXMgdGhlIGF1dG9tYXRpYyB2ZXJpZmljYXRpb24gb2Ygc2lnbmF0dXJlcy4gIDxhIGhyZWY9IiNhNjMiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+VmFyaWFibGVzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNvbnN0IGNoYXImbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2ExIj5zb2FwX3dzc2VfaWQ8L2E+IFtdPC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jb25zdCBjaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2EyIj53c3NlX1Bhc3N3b3JkVGV4dFVSSTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTMiPndzc2VfUGFzc3dvcmREaWdlc3RVUkk8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jb25zdCBjaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E0Ij53c3NlX0Jhc2U2NEJpbmFyeVVSSTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTUiPndzc2VfWDUwOXYzVVJJPC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhNiI+d3NzZV9YNTA5djNTdWJqZWN0S2V5SWRlbnRpZmllclVSSTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTciPmRzX3NoYTFVUkk8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jb25zdCBjaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E4Ij5kc19obWFjX3NoYTFVUkk8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jb25zdCBjaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E5Ij5kc19kc2Ffc2hhMVVSSTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTEwIj5kc19yc2Ffc2hhMVVSSTwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTExIj5kc19VUkk8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jb25zdCBjaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2ExMiI+YzE0bl9VUkk8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD5jb25zdCBjaGFyICombmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2ExMyI+d3N1X1VSSTwvYT48L3RkPjwvdHI+DQorDQorPC90YWJsZT4NCis8aHI+PGgyPkRlZmluZSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMCIgZG94eXRhZz0id3NzZWFwaS5oOjpTT0FQX1dTU0VfSUQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gI2RlZmluZSBTT0FQX1dTU0VfSUQmbmJzcDsmbmJzcDsmbmJzcDsiU09BUC1XU1NFLTAuOSIgICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitwbHVnaW4gaWRlbnRpZmljYXRpb24gZm9yIHBsdWdpbiByZWdpc3RyeSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8aHI+PGgyPkZ1bmN0aW9uIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE1OCIgZG94eXRhZz0id3NzZWFwaS5oOjpzb2FwX3dzc2UiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IHNvYXBfd3NzZSAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5zdHJ1Y3Qgc29hcF9wbHVnaW4gKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5wPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPnZvaWQgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5hcmc8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorUGx1Z2luIHJlZ2lzdHJ5IGZ1bmN0aW9uLCB1c2VkIHdpdGggc29hcF9yZWdpc3Rlcl9wbHVnaW4uIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0PltpbixvdXRdPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5wPC9lbT4mbmJzcDs8L3RkPjx0ZD5wbHVnaW4gY3JlYXRlZCBpbiByZWdpc3RyeSA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmFyZzwvZW0+Jm5ic3A7PC90ZD48dGQ+cGFzc2VkIGZyb20gc29hcF9yZWdpc3Rlcl9wbHVnaW5fYXJnIDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+U09BUF9PSyA8L2RkPjwvZGw+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTI5IiBkb3h5dGFnPSJ3c3NlYXBpLmg6OnNvYXBfd3NzZV9hZGRfQmluYXJ5U2VjdXJpdHlUb2tlbiIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgc29hcF93c3NlX2FkZF9CaW5hcnlTZWN1cml0eVRva2VuICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5pZDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+dmFsdWVUeXBlPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IHVuc2lnbmVkIGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5kYXRhPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmludCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zaXplPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0FkZHMgQmluYXJ5U2VjdXJpdHlUb2tlbiBlbGVtZW50LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5pZDwvZW0+Jm5ic3A7PC90ZD48dGQ+c3RyaW5nIGZvciBzaWduYXR1cmUgcmVmZXJlbmNpbmcgb3IgTlVMTCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnZhbHVlVHlwZTwvZW0+Jm5ic3A7PC90ZD48dGQ+c3RyaW5nIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+ZGF0YTwvZW0+Jm5ic3A7PC90ZD48dGQ+cG9pbnRzIHRvIGJpbmFyeSB0b2tlbiBkYXRhIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c2l6ZTwvZW0+Jm5ic3A7PC90ZD48dGQ+aXMgbGVuZ3RoIG9mIGJpbmFyeSB0b2tlbiA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPlNPQVBfT0sgPC9kZD48L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEzMSIgZG94eXRhZz0id3NzZWFwaS5oOjpzb2FwX3dzc2VfYWRkX0JpbmFyeVNlY3VyaXR5VG9rZW5QRU0iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IHNvYXBfd3NzZV9hZGRfQmluYXJ5U2VjdXJpdHlUb2tlblBFTSAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+aWQ8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmZpbGVuYW1lPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0FkZHMgQmluYXJ5U2VjdXJpdHlUb2tlbiBlbGVtZW50IGZyb20gYSBQRU0gZmlsZS4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+aWQ8L2VtPiZuYnNwOzwvdGQ+PHRkPnN0cmluZyBmb3Igc2lnbmF0dXJlIHJlZmVyZW5jZSA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmZpbGVuYW1lPC9lbT4mbmJzcDs8L3RkPjx0ZD48L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPlNPQVBfT0sgb3IgU09BUF9GQVVMVCB3aXRoIHdzc2VfX0ludmFsaWRTZWN1cml0eSBmYXVsdCB3aGVuIGZpbGUgY2Fubm90IGJlIHJlYWQgb3IgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIGNlcnRpZmljYXRlPC9kZD48L2RsPg0KK1RoaXMgZnVuY3Rpb24gdXNlcyBQRU1fcmVhZF9YNTA5IGZyb20gdGhlIHRoZSBPcGVuU1NMIGxpYnJhcnkgdG8gcmVhZCBhIGNlcnRpZmljYXRlIGZyb20gYSBQRU0gZm9ybWF0dGVkIGZpbGUuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEzMCIgZG94eXRhZz0id3NzZWFwaS5oOjpzb2FwX3dzc2VfYWRkX0JpbmFyeVNlY3VyaXR5VG9rZW5YNTA5IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBzb2FwX3dzc2VfYWRkX0JpbmFyeVNlY3VyaXR5VG9rZW5YNTA5ICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5pZDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5YNTA5ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+Y2VydDwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBZGRzIEJpbmFyeVNlY3VyaXR5VG9rZW4gZWxlbWVudCB3aXRoIFg1MDkgY2VydGlmaWNhdGUuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmlkPC9lbT4mbmJzcDs8L3RkPjx0ZD5zdHJpbmcgZm9yIHNpZ25hdHVyZSByZWZlcmVuY2UgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5jZXJ0PC9lbT4mbmJzcDs8L3RkPjx0ZD5wb2ludHMgdG8gdGhlIFg1MDkgY2VydGlmaWNhdGUgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5TT0FQX09LIG9yIFNPQVBfRU9NPC9kZD48L2RsPg0KK1RoaXMgZnVuY3Rpb24gdXNlcyBpMmRfWDUwOSBmcm9tIHRoZSB0aGUgT3BlblNTTCBsaWJyYXJ5IHRvIGNvbnZlcnQgYW4gWDUwOSBvYmplY3QgdG8gYmluYXJ5IERFUiBmb3JtYXQuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE0NSIgZG94eXRhZz0id3NzZWFwaS5oOjpzb2FwX3dzc2VfYWRkX0tleUluZm8iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2tleV9pbmZvX3R5cGUuaHRtbCI+ZHNfX0tleUluZm9UeXBlPC9hPiogc29hcF93c3NlX2FkZF9LZXlJbmZvICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0FkZHMgS2V5SW5mbyBlbGVtZW50LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5kc19fS2V5SW5mbyBvYmplY3QgPC9kZD48L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE0NyIgZG94eXRhZz0id3NzZWFwaS5oOjpzb2FwX3dzc2VfYWRkX0tleUluZm9fS2V5TmFtZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgc29hcF93c3NlX2FkZF9LZXlJbmZvX0tleU5hbWUgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPm5hbWU8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQWRkcyBLZXlOYW1lIGVsZW1lbnQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPm5hbWU8L2VtPiZuYnNwOzwvdGQ+PHRkPnN0cmluZyBvZiB0aGUgS2V5TmFtZSA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPlNPQVBfT0s8L2RkPjwvZGw+DQorTm90ZTogdGhlIHJlY29tbWVuZGVkIG1ldGhvZCB0byBhZGQgS2V5IGluZm9ybWF0aW9uIGlzIHRvIHV0aWxpemUgS2V5SWRlbnRpZmllciBpbnN0ZWFkIG9mIEtleU5hbWUuIEEgS2V5TmFtZSBpcyB1c2VmdWwgbWFpbmx5IGZvciBpbnRlcm5hbCB1c2UuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE1NiIgZG94eXRhZz0id3NzZWFwaS5oOjpzb2FwX3dzc2VfYWRkX0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZUVtYmVkZGVkIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBzb2FwX3dzc2VfYWRkX0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZUVtYmVkZGVkICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5pZDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+dmFsdWVUeXBlPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0FkZHMgS2V5SW5mbyBlbGVtZW50IHdpdGggRW1iZWRkZWQgU2VjdXJpdHlUb2tlblJlZmVyZW5jZS4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+aWQ8L2VtPiZuYnNwOzwvdGQ+PHRkPnN0cmluZyBmb3Igc2lnbmF0dXJlIHJlZmVyZW5jZSA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnZhbHVlVHlwZTwvZW0+Jm5ic3A7PC90ZD48dGQ+c3RyaW5nIDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+U09BUF9PSzwvZGQ+PC9kbD4NCitOb3RlOiB0aGlzIGZ1bmN0aW9uIGlzIHVuZGVyIGNvbnN0cnVjdGlvbiBhbmQgdGhlIHJlc3VsdCBkZXBlbmRzIG9uIHVzYWdlIHNjZW5hcmlvcyBkZXBsb3llZCBpbiBwcmFjdGljZS4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTUzIiBkb3h5dGFnPSJ3c3NlYXBpLmg6OnNvYXBfd3NzZV9hZGRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlS2V5SWRlbnRpZmllciIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgc29hcF93c3NlX2FkZF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VLZXlJZGVudGlmaWVyICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5pZDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+dmFsdWVUeXBlPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPnVuc2lnbmVkIGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5kYXRhPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmludCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zaXplPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0FkZHMgS2V5SW5mbyBlbGVtZW50IHdpdGggU2VjdXJpdHlUb2tlblJlZmVyZW5jZS9LZXlJZGVudGlmaWVyIGJpbmFyeSBkYXRhLiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5pZDwvZW0+Jm5ic3A7PC90ZD48dGQ+c3RyaW5nIGZvciBzaWduYXR1cmUgcmVmZXJlbmNlIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+dmFsdWVUeXBlPC9lbT4mbmJzcDs8L3RkPjx0ZD5zdHJpbmcgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5kYXRhPC9lbT4mbmJzcDs8L3RkPjx0ZD5iaW5hcnkgZGF0YSA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNpemU8L2VtPiZuYnNwOzwvdGQ+PHRkPm9mIGJpbmFyeSBkYXRhIDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+U09BUF9PSyA8L2RkPjwvZGw+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTQ5IiBkb3h5dGFnPSJ3c3NlYXBpLmg6OnNvYXBfd3NzZV9hZGRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlVVJJIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBzb2FwX3dzc2VfYWRkX0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZVVSSSAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+VVJJPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT52YWx1ZVR5cGU8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQWRkcyBLZXlJbmZvIGVsZW1lbnQgd2l0aCBTZWN1cml0eVRva2VuUmVmZXJlbmNlIFVSSS4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+VVJJPC9lbT4mbmJzcDs8L3RkPjx0ZD5zdHJpbmcgcmVmZXJlbmNpbmcgYSBzZWN1cml0eSB0b2tlbiA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnZhbHVlVHlwZTwvZW0+Jm5ic3A7PC90ZD48dGQ+c3RyaW5nIG9yIE5VTEwgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5TT0FQX09LIDwvZGQ+PC9kbD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNTAiIGRveHl0YWc9Indzc2VhcGkuaDo6c29hcF93c3NlX2FkZF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VYNTA5IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBzb2FwX3dzc2VfYWRkX0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZVg1MDkgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPlVSSTwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBZGRzIEtleUluZm8gZWxlbWVudCB3aXRoIFNlY3VyaXR5VG9rZW5SZWZlcmVuY2UgVVJJIHRvIGFuIFg1MDkgY2VydC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+VVJJPC9lbT4mbmJzcDs8L3RkPjx0ZD5zdHJpbmcgcmVmZXJlbmNpbmcgYW4gWDUwOSBjZXJ0aWZpY2F0ZSA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPlNPQVBfT0sgPC9kZD48L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExNCIgZG94eXRhZz0id3NzZWFwaS5oOjpzb2FwX3dzc2VfYWRkX1NlY3VyaXR5IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHkuaHRtbCI+X3dzc2VfX1NlY3VyaXR5PC9hPiogc29hcF93c3NlX2FkZF9TZWN1cml0eSAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBZGRzIFNlY3VyaXR5IGhlYWRlciBlbGVtZW50LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHkuaHRtbCI+X3dzc2VfX1NlY3VyaXR5PC9hPiBvYmplY3QgPC9kZD48L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExNSIgZG94eXRhZz0id3NzZWFwaS5oOjpzb2FwX3dzc2VfYWRkX1NlY3VyaXR5X2FjdG9yIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHkuaHRtbCI+X3dzc2VfX1NlY3VyaXR5PC9hPiogc29hcF93c3NlX2FkZF9TZWN1cml0eV9hY3RvciAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+YWN0b3I8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQWRkcyBTZWN1cml0eSBoZWFkZXIgZWxlbWVudCB3aXRoIGFjdG9yIG9yIHJvbGUgYXR0cmlidXRlLiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmFjdG9yPC9lbT4mbmJzcDs8L3RkPjx0ZD5zdHJpbmcgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHkuaHRtbCI+X3dzc2VfX1NlY3VyaXR5PC9hPiBvYmplY3QgPC9kZD48L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExOCIgZG94eXRhZz0id3NzZWFwaS5oOjpzb2FwX3dzc2VfYWRkX1NpZ25hdHVyZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmF0dXJlX3R5cGUuaHRtbCI+ZHNfX1NpZ25hdHVyZVR5cGU8L2E+KiBzb2FwX3dzc2VfYWRkX1NpZ25hdHVyZSAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBZGRzIFNpZ25hdHVyZSBoZWFkZXIgZWxlbWVudC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmF0dXJlX3R5cGUuaHRtbCI+ZHNfX1NpZ25hdHVyZVR5cGU8L2E+IG9iamVjdCA8L2RkPjwvZGw+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTQxIiBkb3h5dGFnPSJ3c3NlYXBpLmg6OnNvYXBfd3NzZV9hZGRfU2lnbmF0dXJlVmFsdWUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IHNvYXBfd3NzZV9hZGRfU2lnbmF0dXJlVmFsdWUgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+aW50Jm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmFsZzwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCB2b2lkICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+a2V5PC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmludCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5rZXlsZW48L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQWRkcyBTaWduZWRJbmZvL1NpZ25hdHVyZU1ldGhvZCBlbGVtZW50LCBzaWducyB0aGUgU2lnbmVkSW5mbyBlbGVtZW50LCBhbmQgYWRkcyB0aGUgcmVzdWx0aW5nIFNpZ25hdHVyZVZhbHVlIGVsZW1lbnQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmFsZzwvZW0+Jm5ic3A7PC90ZD48dGQ+aXMgU09BUF9TTURfSE1BQ19TSEExLCBTT0FQX1NNRF9TSUdOX0RTQV9TSEExLCBvciBTT0FQX1NNRF9TSUdOX1JTQV9TSEExIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+a2V5PC9lbT4mbmJzcDs8L3RkPjx0ZD50byB1c2UgdG8gc2lnbiAoSE1BQyBvciBFVlBfUEtFWSkgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5rZXlsZW48L2VtPiZuYnNwOzwvdGQ+PHRkPmxlbmd0aCBvZiBITUFDIGtleSA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPlNPQVBfT0ssIFNPQVBfRU9NLCBvciBmYXVsdDwvZGQ+PC9kbD4NCitUbyBzaWduIHRoZSBTaWduZWRJbmZvIGVsZW1lbnQgd2l0aCB0aGlzIGZ1bmN0aW9uLCBwb3B1bGF0ZSBTaWduZWRJbmZvIHdpdGggUmVmZXJlbmNlIGVsZW1lbnRzIGZpcnN0IHVzaW5nIHNvYXBfd3NzZV9hZGRfU2lnbmVkSW5mb19SZWZlcmVuY2UuIFRoZSBTaWduZWRJbmZvIGVsZW1lbnQgbXVzdCBub3QgYmUgbW9kaWZpZWQgYWZ0ZXIgc2lnbmluZy48cD4NCitUaGUgU09BUF9YTUxfSU5ERU5UIGFuZCBTT0FQX1hNTF9DQU5PTklDQUwgZmxhZ3MgYXJlIHVzZWQgdG8gc2VyaWFsaXplIHRoZSBTaWduZWRJbmZvIHRvIGNvbXB1dGUgdGhlIHNpZ25hdHVyZS4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTM2IiBkb3h5dGFnPSJ3c3NlYXBpLmg6OnNvYXBfd3NzZV9hZGRfU2lnbmVkSW5mbyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmVkX2luZm9fdHlwZS5odG1sIj5kc19fU2lnbmVkSW5mb1R5cGU8L2E+KiBzb2FwX3dzc2VfYWRkX1NpZ25lZEluZm8gICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiA8ZW0+c29hcDwvZW0+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQWRkcyBTaWduZWRJbmZvIGVsZW1lbnQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25lZF9pbmZvX3R5cGUuaHRtbCI+ZHNfX1NpZ25lZEluZm9UeXBlPC9hPiBvYmplY3QgPC9kZD48L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEzNyIgZG94eXRhZz0id3NzZWFwaS5oOjpzb2FwX3dzc2VfYWRkX1NpZ25lZEluZm9fUmVmZXJlbmNlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBzb2FwX3dzc2VfYWRkX1NpZ25lZEluZm9fUmVmZXJlbmNlICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5VUkk8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnRyYW5zZm9ybTwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+aW5jbHVzaXZlTmFtZXNwYWNlczwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+SEE8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQWRkcyBTaWduZWRJbmZvIGVsZW1lbnQgd2l0aCBSZWZlcmVuY2UgVVJJLCB0cmFuc2Zvcm0gYWxnb3JpdGhtIHVzZWQsIGFuZCBkaWdlc3QgdmFsdWUuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPlVSSTwvZW0+Jm5ic3A7PC90ZD48dGQ+cmVmZXJlbmNlIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+dHJhbnNmb3JtPC9lbT4mbmJzcDs8L3RkPjx0ZD5zdHJpbmcgc2hvdWxkIGJlIGMxNG5fVVJJIGZvciBleGMtYzE0biBvciBOVUxMIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+aW5jbHVzaXZlTmFtZXNwYWNlczwvZW0+Jm5ic3A7PC90ZD48dGQ+dXNlZCBieSB0aGUgZXhjLWMxNG4gdHJhbnNmb3JtIG9yIE5VTEwgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5IQTwvZW0+Jm5ic3A7PC90ZD48dGQ+aXMgdGhlIFNIQTEgZGlnZXN0IGluIGJpbmFyeSBmb3JtIChsZW5ndGg9U09BUF9TTURfU0hBMV9TSVpFKSA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPlNPQVBfT0sgb3IgU09BUF9FT00gd2hlbiByZWZlcmVuY2VzIGV4Y2VlZCBTT0FQX1dTU0VfTUFYX1JFRjwvZGQ+PC9kbD4NCitUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgdG8gYWRkIG1vcmUgcmVmZXJlbmNlcyB0byB0aGUgd3NzZTpTaWduZWRJbmZvIGVsZW1lbnQuIEEgbWF4aW11bSBudW1iZXIgb2YgU09BUF9XU1NFX01BWF9SRUYgcmVmZXJlbmNlcyBjYW4gYmUgYWRkZWQuIFRoZSBkaWdlc3QgbWV0aG9kIGlzIGFsd2F5cyBTSEExLiBOb3RlOiBYUGF0aCB0cmFuc2Zvcm1zIGNhbm5vdCBiZSBzcGVjaWZpZWQgaW4gdGhpcyByZWxlYXNlLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMzgiIGRveHl0YWc9Indzc2VhcGkuaDo6c29hcF93c3NlX2FkZF9TaWduZWRJbmZvX1NpZ25hdHVyZU1ldGhvZCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgc29hcF93c3NlX2FkZF9TaWduZWRJbmZvX1NpZ25hdHVyZU1ldGhvZCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+bWV0aG9kPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmludCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5jYW5vbmljYWw8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQWRkcyBTaWduZWRJbmZvIGVsZW1lbnQgd2l0aCBTaWduYXR1cmVNZXRob2QuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPm1ldGhvZDwvZW0+Jm5ic3A7PC90ZD48dGQ+aXMgdGhlIFVSSSBvZiB0aGUgc2lnbmF0dXJlIGFsZ29yaXRobSAoZS5nLiBkc19yc2Ffc2hhMSkgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5jYW5vbmljYWw8L2VtPiZuYnNwOzwvdGQ+PHRkPmZsYWcgaW5kaWNhdGluZyB0aGF0IFNpZ25lZEluZm8gaXMgc2lnbmVkIGluIGV4Yy1jMTRuIGZvcm0gPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5TT0FQX09LPC9kZD48L2RsPg0KK05vdGU6IHRoZSBjMTRuOkluY2x1c2l2ZU5hbWVzcGFjZXMvUHJlZml4TGlzdCBpcyBzZXQgdG8gIlNPQVAtRU5WIHdzc2UiLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMjEiIGRveHl0YWc9Indzc2VhcGkuaDo6c29hcF93c3NlX2FkZF9UaW1lc3RhbXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IHNvYXBfd3NzZV9hZGRfVGltZXN0YW1wICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5pZDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD50aW1lX3QmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+bGlmZXRpbWU8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQWRkcyBUaW1lc3RhbXAgZWxlbWVudCB3aXRoIG9wdGlvbmFsIGV4cGlyYXRpb24gZGF0ZSt0aW1lIChsaWZldGltZSkuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5pZDwvZW0+Jm5ic3A7PC90ZD48dGQ+Zm9yIHNpZ25hdHVyZSByZWZlcmVuY2luZyBvciBOVUxMIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+bGlmZXRpbWU8L2VtPiZuYnNwOzwvdGQ+PHRkPmV4cHJlc3NlZCBpbiB0aW1lX3QgdW5pdHMsIG9yIDAgZm9yIG5vIGV4cGlyYXRpb24gPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5TT0FQX09LIDwvZGQ+PC9kbD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMjUiIGRveHl0YWc9Indzc2VhcGkuaDo6c29hcF93c3NlX2FkZF9Vc2VybmFtZVRva2VuRGlnZXN0IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBzb2FwX3dzc2VfYWRkX1VzZXJuYW1lVG9rZW5EaWdlc3QgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmlkPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT51c2VybmFtZTwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+cGFzc3dvcmQ8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorQWRkcyBVc2VybmFtZVRva2VuIGVsZW1lbnQgZm9yIGRpZ2VzdCBhdXRoZW50aWNhdGlvbi4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+aWQ8L2VtPiZuYnNwOzwvdGQ+PHRkPnN0cmluZyBmb3Igc2lnbmF0dXJlIHJlZmVyZW5jaW5nIG9yIE5VTEwgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT51c2VybmFtZTwvZW0+Jm5ic3A7PC90ZD48dGQ+c3RyaW5nIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+cGFzc3dvcmQ8L2VtPiZuYnNwOzwvdGQ+PHRkPnN0cmluZyA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPlNPQVBfT0s8L2RkPjwvZGw+DQorQ29tcHV0ZXMgU0hBMSBkaWdlc3Qgb2YgdGhlIHRpbWUgc3RhbXAsIGEgbm9uY2UsIGFuZCB0aGUgcGFzc3dvcmQuIFRoZSBkaWdlc3QgcHJvdmlkZXMgdGhlIGF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzLiBQYXNzd29yZHMgYXJlIE5PVCBzZW50IGluIHRoZSBjbGVhci4gTm90ZTogdGhpcyByZWxlYXNlIHN1cHBvcnRzIHRoZSB1c2Ugb2YgYXQgbW9zdCBvbmUgVXNlcm5hbWVUb2tlbiBpbiB0aGUgaGVhZGVyLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMjQiIGRveHl0YWc9Indzc2VhcGkuaDo6c29hcF93c3NlX2FkZF9Vc2VybmFtZVRva2VuVGV4dCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgc29hcF93c3NlX2FkZF9Vc2VybmFtZVRva2VuVGV4dCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+aWQ8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnVzZXJuYW1lPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5wYXNzd29yZDwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitBZGRzIFVzZXJuYW1lVG9rZW4gZWxlbWVudCB3aXRoIG9wdGlvbmFsIGNsZWFyLXRleHQgcGFzc3dvcmQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmlkPC9lbT4mbmJzcDs8L3RkPjx0ZD5zdHJpbmcgZm9yIHNpZ25hdHVyZSByZWZlcmVuY2luZyBvciBOVUxMIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+dXNlcm5hbWU8L2VtPiZuYnNwOzwvdGQ+PHRkPnN0cmluZyA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnBhc3N3b3JkPC9lbT4mbmJzcDs8L3RkPjx0ZD5zdHJpbmcgb3IgTlVMTCB0byBvbWl0IHRoZSBwYXNzd29yZCA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPlNPQVBfT0s8L2RkPjwvZGw+DQorUGFzc3dvcmRzIGFyZSBzZW50IGluIHRoZSBjbGVhciwgc28gdHJhbnNwb3J0LWxldmVsIGVuY3J5cHRpb24gaXMgcmVxdWlyZWQuIE5vdGU6IHRoaXMgcmVsZWFzZSBzdXBwb3J0cyB0aGUgdXNlIG9mIGF0IG1vc3Qgb25lIFVzZXJuYW1lVG9rZW4gaW4gdGhlIGhlYWRlci4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTMyIiBkb3h5dGFnPSJ3c3NlYXBpLmg6OnNvYXBfd3NzZV9CaW5hcnlTZWN1cml0eVRva2VuIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fYmluYXJ5X3NlY3VyaXR5X3Rva2VuLmh0bWwiPl93c3NlX19CaW5hcnlTZWN1cml0eVRva2VuPC9hPiogc29hcF93c3NlX0JpbmFyeVNlY3VyaXR5VG9rZW4gICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3QgY2hhciAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmlkPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1JldHVybnMgQmluYXJ5U2VjdXJpdHlUb2tlbiBlbGVtZW50IGlmIHByZXNlbnQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmlkPC9lbT4mbmJzcDs8L3RkPjx0ZD5zdHJpbmcgb2YgdG9rZW4gdG8gZ2V0IG9yIE5VTEwgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fYmluYXJ5X3NlY3VyaXR5X3Rva2VuLmh0bWwiPl93c3NlX19CaW5hcnlTZWN1cml0eVRva2VuPC9hPiBvYmplY3Qgb3IgTlVMTCA8L2RkPjwvZGw+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTE2IiBkb3h5dGFnPSJ3c3NlYXBpLmg6OnNvYXBfd3NzZV9kZWxldGVfU2VjdXJpdHkiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gdm9pZCBzb2FwX3dzc2VfZGVsZXRlX1NlY3VyaXR5ICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK0RlbGV0ZXMgU2VjdXJpdHkgaGVhZGVyIGVsZW1lbnQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTE5IiBkb3h5dGFnPSJ3c3NlYXBpLmg6OnNvYXBfd3NzZV9kZWxldGVfU2lnbmF0dXJlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHZvaWQgc29hcF93c3NlX2RlbGV0ZV9TaWduYXR1cmUgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiA8ZW0+c29hcDwvZW0+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorRGVsZXRlcyBTaWduYXR1cmUgaGVhZGVyIGVsZW1lbnQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTU3IiBkb3h5dGFnPSJ3c3NlYXBpLmg6OnNvYXBfd3NzZV9mYXVsdCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgc29hcF93c3NlX2ZhdWx0ICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmVudW0gPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlXzhoLmh0bWwjYTAiPndzc2VfX0ZhdWx0Y29kZUVudW08L2E+Jm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmZhdWx0PC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5kZXRhaWw8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTMzIiBkb3h5dGFnPSJ3c3NlYXBpLmg6OnNvYXBfd3NzZV9nZXRfQmluYXJ5U2VjdXJpdHlUb2tlbiIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgc29hcF93c3NlX2dldF9CaW5hcnlTZWN1cml0eVRva2VuICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5pZDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jaGFyICoqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnZhbHVlVHlwZTwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD51bnNpZ25lZCBjaGFyICoqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmRhdGE8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+aW50ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c2l6ZTwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitHZXQgd3NzZTpCaW5hcnlTZWN1cml0eVRva2VuIGVsZW1lbnQgdG9rZW4gZGF0YSBpbiBiaW5hcnkgZm9ybS4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+aWQ8L2VtPiZuYnNwOzwvdGQ+PHRkPnN0cmluZyBvZiB0b2tlbiB0byBnZXQgb3IgTlVMTCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0PltvdXRdPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT52YWx1ZVR5cGU8L2VtPiZuYnNwOzwvdGQ+PHRkPnN0cmluZyA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0PltvdXRdPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5kYXRhPC9lbT4mbmJzcDs8L3RkPjx0ZD5wb2ludHMgdG8gYmluYXJ5IHRva2VuIGRhdGEgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5bb3V0XTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c2l6ZTwvZW0+Jm5ic3A7PC90ZD48dGQ+aXMgbGVuZ3RoIG9mIGJpbmFyeSB0b2tlbiA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPlNPQVBfT0sgb3IgU09BUF9GQVVMVCB3aXRoIHdzc2U6U2VjdXJpdHlUb2tlblVuYXZhaWxhYmxlIGZhdWx0IDwvZGQ+PC9kbD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMzQiIGRveHl0YWc9Indzc2VhcGkuaDo6c29hcF93c3NlX2dldF9CaW5hcnlTZWN1cml0eVRva2VuWDUwOSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBYNTA5KiBzb2FwX3dzc2VfZ2V0X0JpbmFyeVNlY3VyaXR5VG9rZW5YNTA5ICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5pZDwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitHZXQgWDUwOSB3c3NlOkJpbmFyeVNlY3VyaXR5VG9rZW4gY2VydGlmaWNhdGUgYW5kIHZlcmlmeSBpdHMgY29udGVudC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+aWQ8L2VtPiZuYnNwOzwvdGQ+PHRkPnN0cmluZyBvZiB0b2tlbiB0byBnZXQgb3IgTlVMTCA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPlg1MDkgY2VydGlmaWNhdGUgKGR5bmFtaWNhbGx5IGFsbG9jYXRlZCkgb3IgTlVMTCB3aXRoIHdzc2U6U2VjdXJpdHlUb2tlblVuYXZhaWxhYmxlIGZhdWx0IDwvZGQ+PC9kbD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNDgiIGRveHl0YWc9Indzc2VhcGkuaDo6c29hcF93c3NlX2dldF9LZXlJbmZvX0tleU5hbWUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY29uc3QgY2hhciogc29hcF93c3NlX2dldF9LZXlJbmZvX0tleU5hbWUgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiA8ZW0+c29hcDwvZW0+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorUmV0dXJucyBLZXlOYW1lIGVsZW1lbnQgaWYgcHJlc2VudC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+c3RyaW5nIG9yIE5VTEwgPC9kZD48L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE1NSIgZG94eXRhZz0id3NzZWFwaS5oOjpzb2FwX3dzc2VfZ2V0X0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZUtleUlkZW50aWZpZXIiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY29uc3QgdW5zaWduZWQgY2hhciogc29hcF93c3NlX2dldF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VLZXlJZGVudGlmaWVyICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmludCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNpemU8L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorUmV0dXJucyBLZXlJbmZvL1NlY3VyaXR5VG9rZW5SZWZlcmVuY2UvS2V5SWRlbnRpZmllciBiaW5hcnkgZGF0YS4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W291dF08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNpemU8L2VtPiZuYnNwOzwvdGQ+PHRkPmlzIHNldCB0byB0aGUgc2l6ZSBvZiB0aGUgZGVjb2RlZCBkYXRhIDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+ZGF0YSBvciBOVUxMIDwvZGQ+PC9kbD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNTQiIGRveHl0YWc9Indzc2VhcGkuaDo6c29hcF93c3NlX2dldF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VLZXlJZGVudGlmaWVyVmFsdWVUeXBlIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNvbnN0IGNoYXIqIHNvYXBfd3NzZV9nZXRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlS2V5SWRlbnRpZmllclZhbHVlVHlwZSAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitSZXR1cm5zIEtleUluZm8vU2VjdXJpdHlUb2tlblJlZmVyZW5jZS9LZXlJZGVudGlmaWVyL1ZhbHVlVHlwZSBpZiBwcmVzZW50LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5zdHJpbmcgb3IgTlVMTCA8L2RkPjwvZGw+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTUxIiBkb3h5dGFnPSJ3c3NlYXBpLmg6OnNvYXBfd3NzZV9nZXRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlVVJJIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNvbnN0IGNoYXIqIHNvYXBfd3NzZV9nZXRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlVVJJICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1JldHVybnMgYSBTZWN1cml0eVRva2VuUmVmZXJlbmNlIFVSSSBpZiBwcmVzZW50LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5zdHJpbmcgb3IgTlVMTCA8L2RkPjwvZGw+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTUyIiBkb3h5dGFnPSJ3c3NlYXBpLmg6OnNvYXBfd3NzZV9nZXRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlWDUwOSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBYNTA5KiBzb2FwX3dzc2VfZ2V0X0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZVg1MDkgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiA8ZW0+c29hcDwvZW0+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorUmV0dXJucyBhIFg1MDkgY2VydGlmaWNhdGUgaWYgcHJlc2VudCBhcyBhIEJpbmFyeVNlY3VyaXR5IHRva2VuLiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5YNTA5IG9iamVjdCBvciBOVUxMIHdpdGggd3NzZTpTZWN1cml0eVRva2VuVW5hdmFpbGFibGUgZmF1bHQgPC9kZD48L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE0MCIgZG94eXRhZz0id3NzZWFwaS5oOjpzb2FwX3dzc2VfZ2V0X1NpZ25lZEluZm9fU2lnbmF0dXJlTWV0aG9kIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBzb2FwX3dzc2VfZ2V0X1NpZ25lZEluZm9fU2lnbmF0dXJlTWV0aG9kICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmludCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmFsZzwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitHZXQgU2lnbmF0dXJlTWV0aG9kIGFsZ29yaXRobS4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W291dF08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmFsZzwvZW0+Jm5ic3A7PC90ZD48dGQ+aXMgU09BUF9TTURfSE1BQ19TSEExLCBTT0FQX1NNRF9WUkZZX0RTQV9TSEExLCBvciBTT0FQX1NNRF9WUkZZX1JTQV9TSEExIDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+U09BUF9PSyBvciBTT0FQX0ZBVUxUIHdpdGggd3NzZTpVbnN1cHBvcnRlZEFsZ29yaXRobSBvciB3c3NlOkZhaWxlZENoZWNrIGZhdWx0IDwvZGQ+PC9kbD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMjciIGRveHl0YWc9Indzc2VhcGkuaDo6c29hcF93c3NlX2dldF9Vc2VybmFtZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjb25zdCBjaGFyKiBzb2FwX3dzc2VfZ2V0X1VzZXJuYW1lICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1JldHVybnMgVXNlcm5hbWVUb2tlbi91c2VybmFtZSBzdHJpbmcgb3Igd3NzZTpGYWlsZWRBdXRoZW50aWNhdGlvbiBmYXVsdC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+VXNlcm5hbWVUb2tlbi91c2VybmFtZSBzdHJpbmcgb3IgTlVMTCB3aXRoIHdzc2U6RmFpbGVkQXV0aGVudGljYXRpb24gZmF1bHQgZXJyb3Igc2V0IDwvZGQ+PC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+U2VlIGFsc286PC9iPjwvZHQ+PGRkPjxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2EyOCI+c29hcF93c3NlX3ZlcmlmeV9QYXNzd29yZDwvYT48L2RkPjwvZGw+DQorVGhlIHJldHVybmVkIHVzZXJuYW1lIHNob3VsZCBiZSB1c2VkIHRvIGxvb2t1cCB0aGUgdXNlcidzIHBhc3N3b3JkIGluIGEgZGljdGlvbmFyeSBvciBkYXRhYmFzZSBmb3Igc2VydmVyLXNpZGUgYXV0aGVudGljYXRpb24gd2l0aCBzb2FwX3dzc2VfdmVyaWZ5X1Bhc3N3b3JkLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNDYiIGRveHl0YWc9Indzc2VhcGkuaDo6c29hcF93c3NlX0tleUluZm8iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX2tleV9pbmZvX3R5cGUuaHRtbCI+ZHNfX0tleUluZm9UeXBlPC9hPiogc29hcF93c3NlX0tleUluZm8gICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiA8ZW0+c29hcDwvZW0+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorUmV0dXJucyBLZXlJbmZvIGVsZW1lbnQgaWYgcHJlc2VudC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+ZHNfX0tleUluZm8gb2JqZWN0IG9yIE5VTEwgPC9kZD48L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExNyIgZG94eXRhZz0id3NzZWFwaS5oOjpzb2FwX3dzc2VfU2VjdXJpdHkiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX19zZWN1cml0eS5odG1sIj5fd3NzZV9fU2VjdXJpdHk8L2E+KiBzb2FwX3dzc2VfU2VjdXJpdHkgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiA8ZW0+c29hcDwvZW0+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorUmV0dXJucyBTZWN1cml0eSBoZWFkZXIgZWxlbWVudCBpZiBwcmVzZW50LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3NzZV9fX19fc2VjdXJpdHkuaHRtbCI+X3dzc2VfX1NlY3VyaXR5PC9hPiBvYmplY3Qgb3IgTlVMTCA8L2RkPjwvZGw+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTU5IiBkb3h5dGFnPSJ3c3NlYXBpLmg6OnNvYXBfd3NzZV9zaWduIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBzb2FwX3dzc2Vfc2lnbiAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5pbnQmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+YWxnPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IHZvaWQgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5rZXk8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+aW50Jm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmtleWxlbjwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitVc2VzIHRoZSB3c3NlIHBsdWdpbiB0byBzaWduIGFsbCB3c3U6SWQgYXR0cmlidXRlZCBlbGVtZW50cy4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+YWxnPC9lbT4mbmJzcDs8L3RkPjx0ZD5pcyB0aGUgc2lnbmF0dXJlIGFsZ29yaXRobSBTT0FQX1NNRF9ITUFDX1NIQTEsIFNPQVBfU01EX1NJR05fRFNBX1NIQTEsIG9yIFNPQVBfU01EX1NJR05fUlNBX1NIQTEgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5rZXk8L2VtPiZuYnNwOzwvdGQ+PHRkPmlzIHRoZSBITUFDIHNlY3JldCBrZXkgb3IgRFNBL1JTQSBwcml2YXRlIEVWUF9QS0VZIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+a2V5bGVuPC9lbT4mbmJzcDs8L3RkPjx0ZD5pcyB0aGUgSE1BQyBrZXkgbGVuZ3RoIDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+U09BUF9PSyBvciBmYXVsdDwvZGQ+PC9kbD4NCitUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGFjdHVhbGx5IHNpZ24gdGhlIG1lc3NhZ2UsIGJ1dCBpbml0aWF0ZXMgdGhlIHBsdWdpbidzIHNpZ25hdHVyZSBhbGdvcml0aG0gdG8gc2lnbiB0aGUgbWVzc2FnZSB1cG9uIG1lc3NhZ2UgdHJhbnNmZXIuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE2MCIgZG94eXRhZz0id3NzZWFwaS5oOjpzb2FwX3dzc2Vfc2lnbl9ib2R5IiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBzb2FwX3dzc2Vfc2lnbl9ib2R5ICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmludCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5hbGc8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+Y29uc3Qgdm9pZCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmtleTwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5pbnQmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+a2V5bGVuPC9lbT48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiPikmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBjb2xzcGFuPSIyIj48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1VzZXMgdGhlIHdzc2UgcGx1Z2luIHRvIHNpZ24gYWxsIHdzdTpJZCBhdHRyaWJ1dGVkIGVsZW1lbnRzLCBpbmNsdWRpbmcgdGhlIFNPQVAgQm9keSAoYnkgYWRkaW5nIGEgd3N1OklkPSJCb2R5IiBhdHRyaWJ1dGUpLiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5hbGc8L2VtPiZuYnNwOzwvdGQ+PHRkPmlzIHRoZSBzaWduYXR1cmUgYWxnb3JpdGhtIFNPQVBfU01EX0hNQUNfU0hBMSwgU09BUF9TTURfU0lHTl9EU0FfU0hBMSwgb3IgU09BUF9TTURfU0lHTl9SU0FfU0hBMSA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmtleTwvZW0+Jm5ic3A7PC90ZD48dGQ+aXMgdGhlIEhNQUMgc2VjcmV0IGtleSBvciBEU0EvUlNBIHByaXZhdGUgRVZQX1BLRVkgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5rZXlsZW48L2VtPiZuYnNwOzwvdGQ+PHRkPmlzIHRoZSBITUFDIGtleSBsZW5ndGggPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5TT0FQX09LPC9kZD48L2RsPg0KK1RoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWN0dWFsbHkgc2lnbiB0aGUgbWVzc2FnZSwgYnV0IGluaXRpYXRlcyB0aGUgcGx1Z2luJ3Mgc2lnbmF0dXJlIGFsZ29yaXRobSB0byBzaWduIHRoZSBtZXNzYWdlIHVwb24gbWVzc2FnZSB0cmFuc2Zlci4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTIwIiBkb3h5dGFnPSJ3c3NlYXBpLmg6OnNvYXBfd3NzZV9TaWduYXR1cmUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0ZHNfX19fX3NpZ25hdHVyZV90eXBlLmh0bWwiPmRzX19TaWduYXR1cmVUeXBlPC9hPiogc29hcF93c3NlX1NpZ25hdHVyZSAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitSZXR1cm5zIFNpZ25hdHVyZSBoZWFkZXIgZWxlbWVudCBpZiBwcmVzZW50LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduYXR1cmVfdHlwZS5odG1sIj5kc19fU2lnbmF0dXJlVHlwZTwvYT4gb2JqZWN0IG9yIE5VTEwgPC9kZD48L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEzOSIgZG94eXRhZz0id3NzZWFwaS5oOjpzb2FwX3dzc2VfU2lnbmVkSW5mbyIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBzdHJ1Y3QgPGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3Rkc19fX19fc2lnbmVkX2luZm9fdHlwZS5odG1sIj5kc19fU2lnbmVkSW5mb1R5cGU8L2E+KiBzb2FwX3dzc2VfU2lnbmVkSW5mbyAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitSZXR1cm5zIFNpZ25lZEluZm8gZWxlbWVudCBpZiBwcmVzZW50LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD48YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdGRzX19fX19zaWduZWRfaW5mb190eXBlLmh0bWwiPmRzX19TaWduZWRJbmZvVHlwZTwvYT4gb2JqZWN0IG9yIE5VTEwgPC9kZD48L2RsPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEyMiIgZG94eXRhZz0id3NzZWFwaS5oOjpzb2FwX3dzc2VfVGltZXN0YW1wIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHN0cnVjdCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3N1X19fX190aW1lc3RhbXAuaHRtbCI+X3dzdV9fVGltZXN0YW1wPC9hPiogc29hcF93c3NlX1RpbWVzdGFtcCAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZTEiIHZhbGlnbj0idG9wIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4gICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPiZuYnNwOykmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitSZXR1cm5zIFRpbWVzdGFtcCBlbGVtZW50IGlmIHByZXNlbnQuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3VfX19fX3RpbWVzdGFtcC5odG1sIj5fd3N1X19UaW1lc3RhbXA8L2E+IG9iamVjdCBvciBOVUxMIDwvZGQ+PC9kbD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMjYiIGRveHl0YWc9Indzc2VhcGkuaDo6c29hcF93c3NlX1VzZXJuYW1lVG9rZW4iID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX191c2VybmFtZV90b2tlbi5odG1sIj5fd3NzZV9fVXNlcm5hbWVUb2tlbjwvYT4qIHNvYXBfd3NzZV9Vc2VybmFtZVRva2VuICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5pZDwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitSZXR1cm5zIFVzZXJuYW1lVG9rZW4gZWxlbWVudCBpZiBwcmVzZW50LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5pZDwvZW0+Jm5ic3A7PC90ZD48dGQ+c3RyaW5nIG9mIFVzZXJuYW1lVG9rZW4gb3IgTlVMTCA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPjxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3NlX19fX191c2VybmFtZV90b2tlbi5odG1sIj5fd3NzZV9fVXNlcm5hbWVUb2tlbjwvYT4gb2JqZWN0IG9yIE5VTEw8L2RkPjwvZGw+DQorTm90ZTogdGhpcyByZWxlYXNlIHN1cHBvcnRzIHRoZSB1c2Ugb2YgYXQgbW9zdCBvbmUgVXNlcm5hbWVUb2tlbiBpbiB0aGUgaGVhZGVyLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNjIiIGRveHl0YWc9Indzc2VhcGkuaDo6c29hcF93c3NlX3ZlcmlmeV9hdXRvIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBzb2FwX3dzc2VfdmVyaWZ5X2F1dG8gICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+aW50Jm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmFsZzwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCB2b2lkICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+a2V5PC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPnNpemVfdCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5rZXlsZW48L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVXNlcyB0aGUgd3NzZSBwbHVnaW4gdG8gaW5pdGlhdGUgdGhlIGF1dG9tYXRpYyB2ZXJpZmljYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBhbmQgU2lnbmVkSW5mbyBSZWZlcmVuY2UgZGlnZXN0cy4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+YWxnPC9lbT4mbmJzcDs8L3RkPjx0ZD50byB2ZXJpZnkgc2lnbmF0dXJlIGlmIHNpZ25hdHVyZSBoYXMgbm8gc2VjcmV0IG9yIHB1YmxpYyBrZXksIHVzZSBTT0FQX1NNRF9OT05FIHRvIG9taXQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5rZXk8L2VtPiZuYnNwOzwvdGQ+PHRkPmlzIEhNQUMga2V5IG9yIEVWUF9QS0VZIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+a2V5bGVuPC9lbT4mbmJzcDs8L3RkPjx0ZD5pcyBITUFDIGtleSBsZW5ndGggPC90ZD48L3RyPg0KKyAgPC90YWJsZT4NCis8L2RsPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5SZXR1cm5zOjwvYj48L2R0PjxkZD5TT0FQX09LPC9kZD48L2RsPg0KK1RoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWN0dWFsbHkgdmVyaWZ5IHRoZSBtZXNzYWdlLCBidXQgaW5pdGlhdGVzIHRoZSBwbHVnaW4ncyBhbGdvcml0aG0gdG8gc3RvcmUgdGhlIG1lc3NhZ2UgaW4gYSBET00gdG8gYXV0b21hdGljYWxseSB2ZXJpZnkgdGhlIHNpZ25hdHVyZSBhbmQgZGlnZXN0ZXMuIElmIHRoZSBtZXNzYWdlIGRvZXMgbm90IGNvbnRhaW4gYSBrZXkgdG8gdmVyaWZ5IHRoZSBzaWduYXR1cmUsIHRoZSBhbGcsIGtleSwgYW5kIGtleWxlbiBwYXJhbWV0ZXJzIGFyZSB1c2VkLiBJdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGUgWDUwOSBjZXJ0aWZpY2F0ZSB1c2VkIHRvIHZlcmlmeSB0aGUgc2lnbmF0dXJlIGlzIHZlcmlmaWVkLCB3aGljaCByZXF1aXJlcyBzb2FwLSZndDtjYWZpbGUgYW5kL29yIHNvYXAtJmd0O2NhcGF0aCB0byBiZSBzZXQuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImE0NCIgZG94eXRhZz0id3NzZWFwaS5oOjpzb2FwX3dzc2VfdmVyaWZ5X2RpZ2VzdCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgc29hcF93c3NlX3ZlcmlmeV9kaWdlc3QgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+aW50Jm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmFsZzwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCBjaGFyICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+aWQ8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+dW5zaWduZWQgY2hhciZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5oYXNoPC9lbT5bU09BUF9TTURfTUFYX1NJWkVdPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitWZXJpZmllcyB0aGUgZGlnZXN0IHZhbHVlIG9mIGFuIFhNTCBlbGVtZW50IHJlZmVyZW5jZWQgYnkgaWQgYWdhaW5zdCB0aGUgaGFzaC4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+YWxnPC9lbT4mbmJzcDs8L3RkPjx0ZD5kaWdlc3QgYWxnb3JpdGhtIDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+aWQ8L2VtPiZuYnNwOzwvdGQ+PHRkPnN0cmluZyBvZiB0aGUgWE1MIGVsZW1lbnQgdG8gdmVyaWZ5IDwvdGQ+PC90cj4NCisgICAgPHRyPjx0ZD48dHQ+W2luXTwvdHQ+Jm5ic3A7PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+aGFzaDwvZW0+Jm5ic3A7PC90ZD48dGQ+ZGlnZXN0IHZhbHVlIHRvIHZlcmlmeSBhZ2FpbnN0IDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+U09BUF9PSyBvciBmYXVsdCA8L2RkPjwvZGw+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTYzIiBkb3h5dGFnPSJ3c3NlYXBpLmg6OnNvYXBfd3NzZV92ZXJpZnlfZG9uZSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgc29hcF93c3NlX3ZlcmlmeV9kb25lICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1Rlcm1pbmF0ZXMgdGhlIGF1dG9tYXRpYyB2ZXJpZmljYXRpb24gb2Ygc2lnbmF0dXJlcy4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+U09BUF9PSyA8L2RkPjwvZGw+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTYxIiBkb3h5dGFnPSJ3c3NlYXBpLmg6OnNvYXBfd3NzZV92ZXJpZnlfaW5pdCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBpbnQgc29hcF93c3NlX3ZlcmlmeV9pbml0ICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1VzZXMgdGhlIHdzc2UgcGx1Z2luIHRvIGluaXRpYXRlIHRoZSB2ZXJpZmljYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBhbmQgU2lnbmVkSW5mbyBSZWZlcmVuY2UgZGlnZXN0cy4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+U09BUF9PSzwvZGQ+PC9kbD4NCitUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGFjdHVhbGx5IHZlcmlmeSB0aGUgbWVzc2FnZSwgYnV0IGluaXRpYXRlcyB0aGUgcGx1Z2luJ3MgZGF0YSB0byBzdG9yZSB0aGUgbWVzc2FnZSBpbiBhIERPTSB0byB2ZXJpZnkgdGhlIHNpZ25hdHVyZS4gVGhlIHNpZ25hdHVyZSBhbmQgZGlnZXN0cyBpbiB0aGUgRE9NIG11c3QgYmUgdmVyaWZpZWQgbWFudWFsbHkuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEyOCIgZG94eXRhZz0id3NzZWFwaS5oOjpzb2FwX3dzc2VfdmVyaWZ5X1Bhc3N3b3JkIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBzb2FwX3dzc2VfdmVyaWZ5X1Bhc3N3b3JkICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5zb2FwPC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmNvbnN0IGNoYXIgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5wYXNzd29yZDwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitWZXJpZmllcyB0aGUgc3VwcGxpZWQgcGFzc3dvcmQgb3Igc2V0cyB3c3NlOkZhaWxlZEF1dGhlbnRpY2F0aW9uIGZhdWx0LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5wYXNzd29yZDwvZW0+Jm5ic3A7PC90ZD48dGQ+c3RyaW5nIHRvIHZlcmlmeSBhZ2FpbnN0IDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+U09BUF9PSyAoYXV0aG9yaXplZCkgb3IgU09BUF9GQVVMVCB3aXRoIHdzc2U6RmFpbGVkQXV0aGVudGljYXRpb24gZmF1bHQ8L2RkPjwvZGw+DQorVGhlIHZlcmlmaWNhdGlvbiBzdXBwb3J0cyBib3RoIGNsZWFyLXRleHQgcGFzc3dvcmQgdmVyaWZpY2F0aW9uIGFuZCBkaWdlc3QgcGFzc3dvcmQgYXV0aGVudGljYXRpb24uIEZvciBkaWdlc3QgYXV0aGVudGljYXRpb24gYSBoaXN0b3J5IG1lY2hhbmlzbSB3aXRoIGEgZGlnZXN0IGF1dGhlbnRpY2F0aW9uIHNlc3Npb24gZGF0YWJhc2UgZW5zdXJlcyBwcm90ZWN0aW9uIGFnYWluc3QgcmVwbGF5IGF0dGFja3MuIE5vdGU6IHRoaXMgcmVsZWFzZSBzdXBwb3J0cyB0aGUgdXNlIG9mIGF0IG1vc3Qgb25lIFVzZXJuYW1lVG9rZW4gaW4gdGhlIGhlYWRlci4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTQyIiBkb3h5dGFnPSJ3c3NlYXBpLmg6OnNvYXBfd3NzZV92ZXJpZnlfU2lnbmF0dXJlVmFsdWUiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IHNvYXBfd3NzZV92ZXJpZnlfU2lnbmF0dXJlVmFsdWUgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiwgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCBhbGlnbj0icmlnaHQiPjwvdGQ+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXA+aW50Jm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUiIG5vd3JhcD4gPGVtPmFsZzwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5jb25zdCB2b2lkICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+a2V5PC9lbT4sIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgYWxpZ249InJpZ2h0Ij48L3RkPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPmludCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lIiBub3dyYXA+IDxlbT5rZXlsZW48L2VtPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQ+PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCI+KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIGNvbHNwYW49IjIiPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVmVyaWZpZXMgdGhlIFNpZ25hdHVyZVZhbHVlIG9mIGEgU2lnbmVkSW5mbyBlbGVtZW50LiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5hbGc8L2VtPiZuYnNwOzwvdGQ+PHRkPmlzIFNPQVBfU01EX0hNQUNfU0hBMSwgU09BUF9TTURfVlJGWV9EU0FfU0hBMSwgb3IgU09BUF9TTURfVlJGWV9SU0FfU0hBMSBkZXRlcm1pbmVkIGJ5IHRoZSBTaWduZWRJbmZvL1NpZ25hdHVyZU1ldGhvZCA8L3RkPjwvdHI+DQorICAgIDx0cj48dGQ+PHR0Pltpbl08L3R0PiZuYnNwOzwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPmtleTwvZW0+Jm5ic3A7PC90ZD48dGQ+dG8gdXNlIHRvIHZlcmlmeSAoSE1BQyBvciBFVlBfUEtFWSkgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5rZXlsZW48L2VtPiZuYnNwOzwvdGQ+PHRkPmxlbmd0aCBvZiBITUFDIGtleSA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPlNPQVBfT0ssIFNPQVBfRU9NLCBvciBmYXVsdDwvZGQ+PC9kbD4NCitUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciB0aGUgU2lnbmVkSW5mbyBlbGVtZW50IGluIHRoZSBzb2FwLSZndDtkb20gRE9NIHRyZWUgdG8gdmVyaWZ5IHRoZSBzaWduYXR1cmUgaW4gdGhlIFNpZ25hdHVyZVZhbHVlIGVsZW1lbnQuIFVzaW5nIHRoZSBET00gZW5zdXJlcyB3ZSB3aWxsIHZlcmlmeSB0aGUgc2lnbmF0dXJlIG9mIGEgU2lnbmVkSW5mbyBhcyBpdCB3YXMgZXhhY3RseSByZWNlaXZlZCBieSB0aGUgcGFyc2VyLCBieSB1c2luZyB0aGUgLURXSVRIX0RPTSBjb21waWxlIGZsYWcgYW5kIFNPQVBfWE1MX0RPTSBydW50aW1lIGZsYWcuIElmIHRoZXJlIGlzIG5vIERPTSwgaXQgdmVyaWZpZXMgdGhlIHNpZ25hdHVyZSBvZiB0aGUgZGVzZXJpYWxpemVkIFNpZ25lZEluZm8gZWxlbWVudCBpbiB0aGUgU09BUCBIZWFkZXIuIEhvd2V2ZXIsIHNlcmlhbGl6aW5nIGRlc2VyaWFsaXplZCBkYXRhIG1heSBjaGFuZ2UgdGhlIG9jdGV0IHN0cmVhbSB0aGF0IHdhcyBzaWduZWQsIHVubGVzcyB3ZSdyZSB1c2luZyBnU09BUCBhcyBwcm9kdWNlcnMgYW5kIGNvbnN1bWVycyAod2l0aCB0aGUgU09BUF9YTUxfSU5ERU5UIGZsYWcgcmVzZXQpLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNDMiIGRveHl0YWc9Indzc2VhcGkuaDo6c29hcF93c3NlX3ZlcmlmeV9TaWduZWRJbmZvIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGludCBzb2FwX3dzc2VfdmVyaWZ5X1NpZ25lZEluZm8gICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4oJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj5zdHJ1Y3Qgc29hcCAqJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZG5hbWUxIiB2YWxpZ249InRvcCIgbm93cmFwPiA8ZW0+c29hcDwvZW0+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIHZhbGlnbj0idG9wIj4mbmJzcDspJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwPjwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorVmVyaWZpZXMgdGhlIGRpZ2VzdCB2YWx1ZXMgb2YgdGhlIFhNTCBlbGVtZW50cyByZWZlcmVuY2VkIGJ5IHRoZSBTaWduZWRJbmZvIFJlZmVyZW5jZXMuIA0KKzxwPg0KKzxkbCBjb21wYWN0PjxkdD48Yj5QYXJhbWV0ZXJzOjwvYj48L2R0PjxkZD4NCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMCI+DQorICAgIDx0cj48dGQ+PC90ZD48dGQgdmFsaWduPXRvcD48ZW0+c29hcDwvZW0+Jm5ic3A7PC90ZD48dGQ+Y29udGV4dCA8L3RkPjwvdHI+DQorICA8L3RhYmxlPg0KKzwvZGw+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlJldHVybnM6PC9iPjwvZHQ+PGRkPlNPQVBfT0sgb3IgZmF1bHQ8L2RkPjwvZGw+DQorVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgdGhlIFNpZ25lZEluZm8gZWxlbWVudCBpbiB0aGUgc29hcC0mZ3Q7ZG9tIERPTSB0cmVlIHRvIHZlcmlmeSB0aGUgZGlnZXN0cyBjb250YWluZWQgdGhlcmVpbi4gVXNpbmcgdGhlIERPTSBlbnN1cmVzIHdlIHdpbGwgdmVyaWZ5IHRoZSBkaWdlc3RzIG9mIHRoZSBsb2NhbGx5IHNpZ25lZCBlbGVtZW50cyBhcyB0aGV5IHdlcmUgZXhhY3RseSByZWNlaXZlZCBieSB0aGUgcGFyc2VyLCBieSB1c2luZyB0aGUgLURXSVRIX0RPTSBjb21waWxlIGZsYWcgYW5kIFNPQVBfWE1MX0RPTSBydW50aW1lIGZsYWcuIElmIHRoZXJlIGlzIG5vIERPTSwgdGhlIGZ1bmN0aW9uIGZhaWxzLiAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMjMiIGRveHl0YWc9Indzc2VhcGkuaDo6c29hcF93c3NlX3ZlcmlmeV9UaW1lc3RhbXAiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IHNvYXBfd3NzZV92ZXJpZnlfVGltZXN0YW1wICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+KCZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+c3RydWN0IHNvYXAgKiZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWRuYW1lMSIgdmFsaWduPSJ0b3AiIG5vd3JhcD4gPGVtPnNvYXA8L2VtPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiB2YWxpZ249InRvcCI+Jm5ic3A7KSZuYnNwOzwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD48L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1ZlcmlmaWVzIHRoZSBUaW1lc3RhbXAvRXhwaXJlcyBlbGVtZW50IGFnYWluc3QgdGhlIGN1cnJlbnQgdGltZS4gDQorPHA+DQorPGRsIGNvbXBhY3Q+PGR0PjxiPlBhcmFtZXRlcnM6PC9iPjwvZHQ+PGRkPg0KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSIwIj4NCisgICAgPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5zb2FwPC9lbT4mbmJzcDs8L3RkPjx0ZD5jb250ZXh0IDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+U09BUF9PSyBvciBTT0FQX0ZBVUxUIHdpdGggd3NzZTpGYWlsZWRBdXRoZW50aWNhdGlvbiBmYXVsdDwvZGQ+PC9kbD4NCitTZXRzIHdzc2U6RmFpbGVkQXV0aGVudGljYXRpb24gZmF1bHQgaWYgd3N1OlRpbWVzdGFtcCBpcyBleHBpcmVkLiBUaGUgU09BUF9XU1NFX0NMS1NLRVcgdmFsdWUgaXMgdXNlZCBhcyBhIG1hcmdpbiB0byBtaXRpZ2F0ZSBjbG9jayBza2V3LiBLZWVwcyBzaWxlbnQgd2hlbiBubyB0aW1lc3RhbXAgaXMgc3VwcGxpZWQgb3Igbm8gZXhwaXJhdGlvbiBkYXRlIGlzIGluY2x1ZGVkIGluIHRoZSB3c3U6VGltZXN0YW1wIGVsZW1lbnQuICAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEzNSIgZG94eXRhZz0id3NzZWFwaS5oOjpzb2FwX3dzc2VfdmVyaWZ5X1g1MDkiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gaW50IHNvYXBfd3NzZV92ZXJpZnlfWDUwOSAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgdmFsaWduPSJ0b3AiPigmbmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPnN0cnVjdCBzb2FwICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+c29hcDwvZW0+LCA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIGFsaWduPSJyaWdodCI+PC90ZD4NCisgICAgICAgICAgPHRkPjwvdGQ+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcD5YNTA5ICombmJzcDs8L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kbmFtZSIgbm93cmFwPiA8ZW0+Y2VydDwvZW0+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIj4pJm5ic3A7PC90ZD4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgY29sc3Bhbj0iMiI+PC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitWZXJpZmllcyBYNTA5IGNlcnRpZmljYXRlIGFnYWluc3Qgc29hcC0mZ3Q7Y2FmaWxlLCBzb2FwLSZndDtjYXBhdGgsIGFuZCBzb2FwLSZndDtjcmxmaWxlLiANCis8cD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UGFyYW1ldGVyczo8L2I+PC9kdD48ZGQ+DQorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMiIgY2VsbHBhZGRpbmc9IjAiPg0KKyAgICA8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj10b3A+PGVtPnNvYXA8L2VtPiZuYnNwOzwvdGQ+PHRkPmNvbnRleHQgPC90ZD48L3RyPg0KKyAgICA8dHI+PHRkPjx0dD5baW5dPC90dD4mbmJzcDs8L3RkPjx0ZCB2YWxpZ249dG9wPjxlbT5jZXJ0PC9lbT4mbmJzcDs8L3RkPjx0ZD5YNTA5IGNlcnRpZmljYXRlIDwvdGQ+PC90cj4NCisgIDwvdGFibGU+DQorPC9kbD4NCis8ZGwgY29tcGFjdD48ZHQ+PGI+UmV0dXJuczo8L2I+PC9kdD48ZGQ+U09BUF9PSyBvciBmYXVsdDwvZGQ+PC9kbD4NCitUaGlzIGlzIGFuIGV4cGVuc2l2ZSBvcGVyYXRpb24sIHNpbmNlIHdlIHJlYWQgdGhlIGNhZmlsZSBhbmQgY3JlYXRlIHRoZSBvYmplY3RzIGV2ZXJ5IHRpbWUgd2UgbmVlZCB0byB2ZXJpZnkgYSBjZXJ0aWZpY2F0ZS4gRm9yIGZ1dHVyZSByZWxlYXNlcywgd2Ugc2hvdWxkIHN0b3JlIHRoaXMgZGF0YSBwZXJtYW5lbnRseSBpbiB0aGUgZ1NPQVAgZW5naW5lIG9yIHBsdWdpbi4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPjxoMj5WYXJpYWJsZSBEb2N1bWVudGF0aW9uPC9oMj4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMTIiIGRveHl0YWc9Indzc2VhcGkuaDo6YzE0bl9VUkkiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY29uc3QgY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTEyIj5jMTRuX1VSSTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhOSIgZG94eXRhZz0id3NzZWFwaS5oOjpkc19kc2Ffc2hhMVVSSSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjb25zdCBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhOSI+ZHNfZHNhX3NoYTFVUkk8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTgiIGRveHl0YWc9Indzc2VhcGkuaDo6ZHNfaG1hY19zaGExVVJJIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNvbnN0IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2E4Ij5kc19obWFjX3NoYTFVUkk8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTEwIiBkb3h5dGFnPSJ3c3NlYXBpLmg6OmRzX3JzYV9zaGExVVJJIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNvbnN0IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2ExMCI+ZHNfcnNhX3NoYTFVUkk8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTciIGRveHl0YWc9Indzc2VhcGkuaDo6ZHNfc2hhMVVSSSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjb25zdCBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhNyI+ZHNfc2hhMVVSSTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMTEiIGRveHl0YWc9Indzc2VhcGkuaDo6ZHNfVVJJIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IGNvbnN0IGNoYXIqIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2ExMSI+ZHNfVVJJPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExIiBkb3h5dGFnPSJ3c3NlYXBpLmg6OnNvYXBfd3NzZV9pZCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjb25zdCBjaGFyIDxhIGNsYXNzPSJlbCIgaHJlZj0id3NzZWFwaV84aC5odG1sI2ExIj5zb2FwX3dzc2VfaWQ8L2E+W10gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitQbHVnaW4gaWRlbnRpZmljYXRpb24gZm9yIHBsdWdpbiByZWdpc3RyeSAgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNCIgZG94eXRhZz0id3NzZWFwaS5oOjp3c3NlX0Jhc2U2NEJpbmFyeVVSSSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjb25zdCBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhNCI+d3NzZV9CYXNlNjRCaW5hcnlVUkk8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTMiIGRveHl0YWc9Indzc2VhcGkuaDo6d3NzZV9QYXNzd29yZERpZ2VzdFVSSSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjb25zdCBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhMyI+d3NzZV9QYXNzd29yZERpZ2VzdFVSSTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhMiIgZG94eXRhZz0id3NzZWFwaS5oOjp3c3NlX1Bhc3N3b3JkVGV4dFVSSSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjb25zdCBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhMiI+d3NzZV9QYXNzd29yZFRleHRVUkk8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTYiIGRveHl0YWc9Indzc2VhcGkuaDo6d3NzZV9YNTA5djNTdWJqZWN0S2V5SWRlbnRpZmllclVSSSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjb25zdCBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhNiI+d3NzZV9YNTA5djNTdWJqZWN0S2V5SWRlbnRpZmllclVSSTwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhNSIgZG94eXRhZz0id3NzZWFwaS5oOjp3c3NlX1g1MDl2M1VSSSIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiBjb25zdCBjaGFyKiA8YSBjbGFzcz0iZWwiIGhyZWY9Indzc2VhcGlfOGguaHRtbCNhNSI+d3NzZV9YNTA5djNVUkk8L2E+ICAgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgIDwvdGFibGU+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPHRhYmxlIGNlbGxzcGFjaW5nPTUgY2VsbHBhZGRpbmc9MCBib3JkZXI9MD4NCisgIDx0cj4NCisgICAgPHRkPg0KKyAgICAgICZuYnNwOw0KKyAgICA8L3RkPg0KKyAgICA8dGQ+DQorDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTEzIiBkb3h5dGFnPSJ3c3NlYXBpLmg6OndzdV9VUkkiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gY29uc3QgY2hhciogPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3NlYXBpXzhoLmh0bWwjYTEzIj53c3VfVVJJPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzxociBzaXplPSIxIj48YWRkcmVzcyBzdHlsZT0iYWxpZ246IHJpZ2h0OyI+PHNtYWxsPkdlbmVyYXRlZCBvbiBGcmkgQXVnIDE5IDEwOjQxOjQ1IDIwMDUgZm9yIGdTT0FQIFdTLVNlY3VyaXR5IGJ5DQorPGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4NCis8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTAgPjwvYT4gMS4zLjggPC9zbWFsbD48L2FkZHJlc3M+DQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9kb2Mvd3NzZS9odG1sL3dzc2VhcGlfOGhfX2RlcF9faW5jbC5tYXAgYi9kb2Mvd3NzZS9odG1sL3dzc2VhcGlfOGhfX2RlcF9faW5jbC5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM4NDY3MgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvd3NzZWFwaV84aF9fZGVwX19pbmNsLm1hcApAQCAtMCwwICsxLDIgQEAKK2Jhc2UgcmVmZXJlcgorcmVjdCAkd3NzZWFwaV84Yy5odG1sIDYsMTcgNzYsNDQKZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvd3NzZWFwaV84aF9fZGVwX19pbmNsLm1kNSBiL2RvYy93c3NlL2h0bWwvd3NzZWFwaV84aF9fZGVwX19pbmNsLm1kNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTAyM2I2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3dzc2UvaHRtbC93c3NlYXBpXzhoX19kZXBfX2luY2wubWQ1CkBAIC0wLDAgKzEgQEAKKzdiY2QxMTY0NDJhNDRjN2IxOWNkNmI5Y2ZlYTE4YWY3ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC93c3NlYXBpXzhoX19kZXBfX2luY2wucG5nIGIvZG9jL3dzc2UvaHRtbC93c3NlYXBpXzhoX19kZXBfX2luY2wucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNGZlZjIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3dzc2VhcGlfOGhfX2RlcF9faW5jbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC93c3NlYXBpXzhoX19pbmNsLm1hcCBiL2RvYy93c3NlL2h0bWwvd3NzZWFwaV84aF9faW5jbC5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ2N2MyMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvd3NzZWFwaV84aF9faW5jbC5tYXAKQEAgLTAsMCArMSwyIEBACitiYXNlIHJlZmVyZXIKK3JlY3QgJHNtZGV2cF84aC5odG1sIDg5LDkyIDE1NiwxMTgKZGlmZiAtLWdpdCBhL2RvYy93c3NlL2h0bWwvd3NzZWFwaV84aF9faW5jbC5tZDUgYi9kb2Mvd3NzZS9odG1sL3dzc2VhcGlfOGhfX2luY2wubWQ1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYTkxNWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvd3NzZS9odG1sL3dzc2VhcGlfOGhfX2luY2wubWQ1CkBAIC0wLDAgKzEgQEAKK2NmZmM5NGY2YTdhYWVjNTg5YzU2NTIyMWQzYTNkMDMxClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC93c3NlYXBpXzhoX19pbmNsLnBuZyBiL2RvYy93c3NlL2h0bWwvd3NzZWFwaV84aF9faW5jbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ4MTIwYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvd3NzZWFwaV84aF9faW5jbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL3dzc2UvaHRtbC93c3VfOGguaHRtbCBiL2RvYy93c3NlL2h0bWwvd3N1XzhoLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEyMjM1MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy93c3NlL2h0bWwvd3N1XzhoLmh0bWwKQEAgLTAsMCArMSwxMTQgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSI+DQorPHRpdGxlPmdTT0FQIFdTLVNlY3VyaXR5OiAvVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2Mvd3NzZS93c3UuaCBGaWxlIFJlZmVyZW5jZTwvdGl0bGU+DQorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPg0KKzwvaGVhZD48Ym9keT4NCis8IS0tIEdlbmVyYXRlZCBieSBEb3h5Z2VuIDEuMy44IC0tPg0KKzxkaXYgY2xhc3M9InFpbmRleCI+PGEgY2xhc3M9InFpbmRleCIgaHJlZj0iaW5kZXguaHRtbCI+TWFpbiZuYnNwO1BhZ2U8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0iYW5ub3RhdGVkLmh0bWwiPkNsYXNzJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmaWxlcy5odG1sIj5GaWxlJm5ic3A7TGlzdDwvYT4gfCA8YSBjbGFzcz0icWluZGV4IiBocmVmPSJmdW5jdGlvbnMuaHRtbCI+Q2xhc3MmbmJzcDtNZW1iZXJzPC9hPiB8IDxhIGNsYXNzPSJxaW5kZXgiIGhyZWY9Imdsb2JhbHMuaHRtbCI+RmlsZSZuYnNwO01lbWJlcnM8L2E+IHwgPGEgY2xhc3M9InFpbmRleCIgaHJlZj0icGFnZXMuaHRtbCI+UmVsYXRlZCZuYnNwO1BhZ2VzPC9hPjwvZGl2Pg0KKzxoMT4vVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9nc29hcC9kb2Mvd3NzZS93c3UuaCBGaWxlIFJlZmVyZW5jZTwvaDE+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4NCis8dHI+PHRkPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPkNsYXNzZXM8L2gyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNsYXNzPSJtZW1JdGVtTGVmdCIgbm93cmFwIGFsaWduPXJpZ2h0IHZhbGlnbj10b3A+c3RydWN0ICZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZW1JdGVtUmlnaHQiIHZhbGlnbj1ib3R0b20+PGEgY2xhc3M9ImVsIiBocmVmPSJzdHJ1Y3RfX3dzdV9fX19fdGltZXN0YW1wLmh0bWwiPl93c3VfX1RpbWVzdGFtcDwvYT48L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VGhpcyBlbGVtZW50IGFsbG93cyBUaW1lc3RhbXBzIHRvIGJlIGFwcGxpZWQgYW55d2hlcmUgZWxlbWVudCB3aWxkY2FyZHMgYXJlIHByZXNlbnQsIGluY2x1ZGluZyBhcyBhIFNPQVAgaGVhZGVyLiBJbXBvcnRlZCBlbGVtZW50IF93c3VfX1RpbWVzdGFtcCBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuICA8YSBocmVmPSJzdHJ1Y3RfX3dzdV9fX19fdGltZXN0YW1wLmh0bWwjX2RldGFpbHMiPk1vcmUuLi48L2E+PGJyPjwvdGQ+PC90cj4NCis8dHI+PHRkIGNvbHNwYW49Mj48YnI+PGgyPlR5cGVkZWZzPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPnR5cGVkZWYgZW51bSA8YSBjbGFzcz0iZWwiIGhyZWY9IndzdV84aC5odG1sI2EwIj53c3VfX3RUaW1lc3RhbXBGYXVsdDwvYT4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWVtSXRlbVJpZ2h0IiB2YWxpZ249Ym90dG9tPjxhIGNsYXNzPSJlbCIgaHJlZj0id3N1XzhoLmh0bWwjYTAiPndzdV9fdFRpbWVzdGFtcEZhdWx0PC9hPjwvdGQ+PC90cj4NCisNCis8dHI+PHRkIGNsYXNzPSJtZGVzY0xlZnQiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJtZGVzY1JpZ2h0Ij5UeXBlZGVmIHN5bm9ueW0gZm9yIGVudW0gd3N1X190VGltZXN0YW1wRmF1bHQuICA8YSBocmVmPSIjYTAiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY2xhc3M9Im1lbUl0ZW1MZWZ0IiBub3dyYXAgYWxpZ249cmlnaHQgdmFsaWduPXRvcD50eXBlZGVmIDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3VfX19fX3RpbWVzdGFtcC5odG1sIj5fd3N1X19UaW1lc3RhbXA8L2E+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9IndzdV84aC5odG1sI2ExIj5fd3N1X19UaW1lc3RhbXA8L2E+PC90ZD48L3RyPg0KKw0KKzx0cj48dGQgY2xhc3M9Im1kZXNjTGVmdCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im1kZXNjUmlnaHQiPlRoaXMgZWxlbWVudCBhbGxvd3MgVGltZXN0YW1wcyB0byBiZSBhcHBsaWVkIGFueXdoZXJlIGVsZW1lbnQgd2lsZGNhcmRzIGFyZSBwcmVzZW50LCBpbmNsdWRpbmcgYXMgYSBTT0FQIGhlYWRlci4gSW1wb3J0ZWQgZWxlbWVudCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3N1X19fX190aW1lc3RhbXAuaHRtbCI+X3dzdV9fVGltZXN0YW1wPC9hPiBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuICA8YSBocmVmPSIjYTEiPjwvYT48YnI+PC90ZD48L3RyPg0KKzx0cj48dGQgY29sc3Bhbj0yPjxicj48aDI+RW51bWVyYXRpb25zPC9oMj48L3RkPjwvdHI+DQorPHRyPjx0ZCBjbGFzcz0ibWVtSXRlbUxlZnQiIG5vd3JhcCBhbGlnbj1yaWdodCB2YWxpZ249dG9wPmVudW0gJm5ic3A7PC90ZD48dGQgY2xhc3M9Im1lbUl0ZW1SaWdodCIgdmFsaWduPWJvdHRvbT48YSBjbGFzcz0iZWwiIGhyZWY9IndzdV84aC5odG1sI2EzIj53c3VfX3RUaW1lc3RhbXBGYXVsdDwvYT4geyA8YSBjbGFzcz0iZWwiIGhyZWY9IndzdV84aC5odG1sI2EzYTIiPndzdV9fTWVzc2FnZUV4cGlyZWQ8L2E+DQorIH08L3RkPjwvdHI+DQorDQorPHRyPjx0ZCBjbGFzcz0ibWRlc2NMZWZ0Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibWRlc2NSaWdodCI+VGhpcyB0eXBlIGlzIGZvciBlbGVtZW50cyB3aG9zZSBbY2hpbGRyZW5dIGlzIGEgcHN1ZWRvLWRhdGVUaW1lIGFuZCBjYW4gaGF2ZSBhcmJpdHJhcnkgYXR0cmlidXRlcy4gY29tcGxleFR5cGUgZGVmaW5pdGlvbiBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsuIFRoaXMgdHlwZSBpcyBmb3IgZWxlbWVudHMgd2hvc2UgW2NoaWxkcmVuXSBpcyBhbiBhbnlVUkkgYW5kIGNhbiBoYXZlIGFyYml0cmFyeSBhdHRyaWJ1dGVzLiBjb21wbGV4VHlwZSBkZWZpbml0aW9uIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4gVGhpcyBjb21wbGV4IHR5cGUgdGllcyB0b2dldGhlciB0aGUgdGltZXN0YW1wIHJlbGF0ZWQgZWxlbWVudHMgaW50byBhIGNvbXBvc2l0ZSB0eXBlLiBjb21wbGV4VHlwZSBkZWZpbml0aW9uIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4gVGhpcyB0eXBlIGRlZmluZXMgdGhlIGZhdWx0IGNvZGUgdmFsdWUgZm9yIFRpbWVzdGFtcCBtZXNzYWdlIGV4cGlyYXRpb24uIE5vdGU6IGVudW0gdmFsdWVzIGFyZSBwcmVmaXhlZCB3aXRoICd3c3VfX3RUaW1lc3RhbXBGYXVsdCcgdG8gYXZvaWQgbmFtZSBjbGFzaGVzLCBwbGVhc2UgdXNlIHdzZGwyaCBvcHRpb24gLWUgdG8gb21pdCB0aGlzIHByZWZpeC4gIDxhIGhyZWY9IiNhMyI+TW9yZS4uLjwvYT48YnI+PC90ZD48L3RyPg0KKzwvdGFibGU+DQorPGhyPjxoMj5UeXBlZGVmIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImExIiBkb3h5dGFnPSJ3c3UuaDo6X3dzdV9fVGltZXN0YW1wIiA+PC9hPjxwPg0KKzx0YWJsZSBjbGFzcz0ibWRUYWJsZSIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+DQorICA8dHI+DQorICAgIDx0ZCBjbGFzcz0ibWRSb3ciPg0KKyAgICAgIDx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCI+DQorICAgICAgICA8dHI+DQorICAgICAgICAgIDx0ZCBjbGFzcz0ibWQiIG5vd3JhcCB2YWxpZ249InRvcCI+IHR5cGVkZWYgc3RydWN0IDxhIGNsYXNzPSJlbCIgaHJlZj0ic3RydWN0X193c3VfX19fX3RpbWVzdGFtcC5odG1sIj5fd3N1X19UaW1lc3RhbXA8L2E+ICA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3N1X19fX190aW1lc3RhbXAuaHRtbCI+X3dzdV9fVGltZXN0YW1wPC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1RoaXMgZWxlbWVudCBhbGxvd3MgVGltZXN0YW1wcyB0byBiZSBhcHBsaWVkIGFueXdoZXJlIGVsZW1lbnQgd2lsZGNhcmRzIGFyZSBwcmVzZW50LCBpbmNsdWRpbmcgYXMgYSBTT0FQIGhlYWRlci4gSW1wb3J0ZWQgZWxlbWVudCA8YSBjbGFzcz0iZWwiIGhyZWY9InN0cnVjdF9fd3N1X19fX190aW1lc3RhbXAuaHRtbCI+X3dzdV9fVGltZXN0YW1wPC9hPiBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuIA0KKzxwPg0KK0VsZW1lbnQgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS11dGlsaXR5LTEuMC54c2QiOlRpbWVzdGFtcCBvZiBjb21wbGV4VHlwZSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXV0aWxpdHktMS4wLnhzZCI6VGltZXN0YW1wVHlwZS4gICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGEgY2xhc3M9ImFuY2hvciIgbmFtZT0iYTAiIGRveHl0YWc9IndzdS5oOjp3c3VfX3RUaW1lc3RhbXBGYXVsdCIgPjwvYT48cD4NCis8dGFibGUgY2xhc3M9Im1kVGFibGUiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPg0KKyAgPHRyPg0KKyAgICA8dGQgY2xhc3M9Im1kUm93Ij4NCisgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPg0KKyAgICAgICAgPHRyPg0KKyAgICAgICAgICA8dGQgY2xhc3M9Im1kIiBub3dyYXAgdmFsaWduPSJ0b3AiPiB0eXBlZGVmIGVudW0gPGEgY2xhc3M9ImVsIiBocmVmPSJ3c3VfOGguaHRtbCNhMCI+d3N1X190VGltZXN0YW1wRmF1bHQ8L2E+IDxhIGNsYXNzPSJlbCIgaHJlZj0id3N1XzhoLmh0bWwjYTAiPndzdV9fdFRpbWVzdGFtcEZhdWx0PC9hPiAgICAgICAgICA8L3RkPg0KKyAgICAgICAgPC90cj4NCisgICAgICA8L3RhYmxlPg0KKyAgICA8L3RkPg0KKyAgPC90cj4NCis8L3RhYmxlPg0KKzx0YWJsZSBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+DQorICA8dHI+DQorICAgIDx0ZD4NCisgICAgICAmbmJzcDsNCisgICAgPC90ZD4NCisgICAgPHRkPg0KKw0KKzxwPg0KK1R5cGVkZWYgc3lub255bSBmb3IgZW51bSB3c3VfX3RUaW1lc3RhbXBGYXVsdC4gDQorPHA+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyPjxoMj5FbnVtZXJhdGlvbiBUeXBlIERvY3VtZW50YXRpb248L2gyPg0KKzxhIGNsYXNzPSJhbmNob3IiIG5hbWU9ImEzIiBkb3h5dGFnPSJ3c3UuaDo6d3N1X190VGltZXN0YW1wRmF1bHQiID48L2E+PHA+DQorPHRhYmxlIGNsYXNzPSJtZFRhYmxlIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4NCisgIDx0cj4NCisgICAgPHRkIGNsYXNzPSJtZFJvdyI+DQorICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIj4NCisgICAgICAgIDx0cj4NCisgICAgICAgICAgPHRkIGNsYXNzPSJtZCIgbm93cmFwIHZhbGlnbj0idG9wIj4gZW51bSA8YSBjbGFzcz0iZWwiIGhyZWY9IndzdV84aC5odG1sI2EwIj53c3VfX3RUaW1lc3RhbXBGYXVsdDwvYT4gICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgPC90YWJsZT4NCisgICAgPC90ZD4NCisgIDwvdHI+DQorPC90YWJsZT4NCis8dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPg0KKyAgPHRyPg0KKyAgICA8dGQ+DQorICAgICAgJm5ic3A7DQorICAgIDwvdGQ+DQorICAgIDx0ZD4NCisNCis8cD4NCitUaGlzIHR5cGUgaXMgZm9yIGVsZW1lbnRzIHdob3NlIFtjaGlsZHJlbl0gaXMgYSBwc3VlZG8tZGF0ZVRpbWUgYW5kIGNhbiBoYXZlIGFyYml0cmFyeSBhdHRyaWJ1dGVzLiBjb21wbGV4VHlwZSBkZWZpbml0aW9uIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4gVGhpcyB0eXBlIGlzIGZvciBlbGVtZW50cyB3aG9zZSBbY2hpbGRyZW5dIGlzIGFuIGFueVVSSSBhbmQgY2FuIGhhdmUgYXJiaXRyYXJ5IGF0dHJpYnV0ZXMuIGNvbXBsZXhUeXBlIGRlZmluaXRpb24gaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rLiBUaGlzIGNvbXBsZXggdHlwZSB0aWVzIHRvZ2V0aGVyIHRoZSB0aW1lc3RhbXAgcmVsYXRlZCBlbGVtZW50cyBpbnRvIGEgY29tcG9zaXRlIHR5cGUuIGNvbXBsZXhUeXBlIGRlZmluaXRpb24gaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rLiBUaGlzIHR5cGUgZGVmaW5lcyB0aGUgZmF1bHQgY29kZSB2YWx1ZSBmb3IgVGltZXN0YW1wIG1lc3NhZ2UgZXhwaXJhdGlvbi4gTm90ZTogZW51bSB2YWx1ZXMgYXJlIHByZWZpeGVkIHdpdGggJ3dzdV9fdFRpbWVzdGFtcEZhdWx0JyB0byBhdm9pZCBuYW1lIGNsYXNoZXMsIHBsZWFzZSB1c2Ugd3NkbDJoIG9wdGlvbiAtZSB0byBvbWl0IHRoaXMgcHJlZml4LiANCis8cD4NCisiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXV0aWxpdHktMS4wLnhzZCI6dFRpbWVzdGFtcEZhdWx0IGlzIGEgc2ltcGxlVHlwZSByZXN0cmljdGlvbiBvZiB4czpRTmFtZS4gPGRsIGNvbXBhY3Q+PGR0PjxiPkVudW1lcmF0aW9uIHZhbHVlczogPC9iPjwvZHQ+PGRkPg0KKzx0YWJsZSBib3JkZXI9MCBjZWxsc3BhY2luZz0yIGNlbGxwYWRkaW5nPTA+DQorPHRyPjx0ZCB2YWxpZ249dG9wPjxlbT48YSBjbGFzcz0iYW5jaG9yIiBuYW1lPSJhM2EyIiBkb3h5dGFnPSJ3c3VfX01lc3NhZ2VFeHBpcmVkIiA+PC9hPndzdV9fTWVzc2FnZUV4cGlyZWQ8L2VtPiZuYnNwOzwvdGQ+PHRkPg0KK3hzOlFOYW1lIHZhbHVlPSIiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXV0aWxpdHktMS4wLnhzZCI6TWVzc2FnZUV4cGlyZWQiIDwvdGQ+PC90cj4NCis8L3RhYmxlPg0KKzwvZGw+DQorICAgIDwvdGQ+DQorICA8L3RyPg0KKzwvdGFibGU+DQorPGhyIHNpemU9IjEiPjxhZGRyZXNzIHN0eWxlPSJhbGlnbjogcmlnaHQ7Ij48c21hbGw+R2VuZXJhdGVkIG9uIEZyaSBBdWcgMTkgMTA6NDE6NDUgMjAwNSBmb3IgZ1NPQVAgV1MtU2VjdXJpdHkgYnkNCis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPg0KKzxpbWcgc3JjPSJkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIiBhbGlnbj0ibWlkZGxlIiBib3JkZXI9MCA+PC9hPiAxLjMuOCA8L3NtYWxsPjwvYWRkcmVzcz4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvbS5jIGIvZG9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIxNDk5NgotLS0gL2Rldi9udWxsCisrKyBiL2RvbS5jCkBAIC0wLDAgKzEsOTA5IEBACisvKgorCitkb20uY1twcF0KKworZ1NPQVAgRE9NIGltcGxlbWVudGF0aW9uCisKK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMS0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgcGFydCBvZiB0aGUgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXM6CitHUEwsIHRoZSBnU09BUCBwdWJsaWMgbGljZW5zZSwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIHB1YmxpYyBsaWNlbnNlLgorCitUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBnU09BUCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMworKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCitMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK2h0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9zb2FwbGljZW5zZS5odG1sCitTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAorV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCitmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLgorQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLCBHZW5pdmlhIGluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlEZXZlbG9wbWVudCBub3RlOgorCVJldXNlZCB0aGUgZ1NPQVAgc3RydWN0IHNvYXAgaWQgaGFzaCB0YWJsZSBmb3IgaGFuZGxpbmcgbmFtZXNwYWNlCisJYmluZGluZ3Mgd2hlbiB0cmFuc21pdHRpbmcgRE9NcworCitDaGFuZ2VzOgorCVJlbmFtZWQgX190eXBlIHRvIHR5cGUgKGNvcnJlY3Rpb24pCisJZG9tLmMsIGRvbSsrLmNwcCwgYW5kIGRvbS5jcHAgYXJlIGVxdWl2YWxlbnQKKwlSZW5hbWVkIFNPQVBfWE1MX1RSRUUgdG8gU09BUF9ET01fVFJFRQorCVJlbmFtZWQgU09BUF9YTUxfR1JBUEggdG8gU09BUF9ET01fTk9ERQorCUFkZGVkIFNPQVBfRE9NX0FTSVMKKworVE9ETzoJSW1wcm92ZSBtaXhlZCBjb250ZW50IGhhbmRsaW5nCisqLworCisjaW5jbHVkZSAic3Rkc29hcDIuaCIKKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfeHNkX19hbnlUeXBlKHN0cnVjdCBzb2FwKiwgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgY29uc3QqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfZGVmYXVsdF94c2RfX2FueVR5cGUoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfeHNkX19hbnlUeXBlKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRfeHNkX19hbnlUeXBlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfeHNkX19hbnlUeXBlKHN0cnVjdCBzb2FwKiwgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKiBTT0FQX0ZNQUMyIHNvYXBfaW5feHNkX19hbnlUeXBlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9tYXJrZWxlbWVudChzdHJ1Y3Qgc29hcCosIGNvbnN0IHZvaWQqLCBpbnQpOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dGVsZW1lbnQoc3RydWN0IHNvYXAqLCBjb25zdCB2b2lkKiwgY29uc3QgY2hhciosIGludCwgaW50KTsKK1NPQVBfRk1BQzMgdm9pZCAqU09BUF9GTUFDNCBzb2FwX2dldGVsZW1lbnQoc3RydWN0IHNvYXAqLCBpbnQqKTsKKworLyogZm9ybWF0IHN0cmluZyBmb3IgZ2VuZXJhdGluZyBET00gbmFtZXNwYWNlIHByZWZpeGVzICg8PSAxNiBjaGFycyB0b3RhbCkgKi8KKyNkZWZpbmUgU09BUF9ET01JRF9GT1JNQVQgImRvbSVkIgorCisvKiBuYW1lc3BhY2UgbmFtZSAoVVJJKSBsb29rdXAgYW5kIHN0b3JlIHJvdXRpbmVzICovCitzdGF0aWMgc3RydWN0IHNvYXBfaWxpc3QgKnNvYXBfbG9va3VwX25zKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworc3RhdGljIHN0cnVjdCBzb2FwX2lsaXN0ICpzb2FwX2VudGVyX25zKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglET00gY3VzdG9tIChkZSlzZXJpYWxpemVycworICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2VyaWFsaXplX3hzZF9fYW55VHlwZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKm5vZGUpCit7IGlmIChub2RlKQorICB7IGlmIChub2RlLT50eXBlICYmIG5vZGUtPm5vZGUpCisgICAgICBzb2FwX21hcmtlbGVtZW50KHNvYXAsIG5vZGUtPm5vZGUsIG5vZGUtPnR5cGUpOworICAgIGVsc2UKKyAgICB7IGNvbnN0IHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICplbHQ7CisgICAgICBmb3IgKGVsdCA9IG5vZGUtPmVsdHM7IGVsdDsgZWx0ID0gZWx0LT5uZXh0KQorICAgICAgICBzb2FwX3NlcmlhbGl6ZV94c2RfX2FueVR5cGUoc29hcCwgZWx0KTsKKyAgICB9CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZGVmYXVsdF94c2RfX2FueVR5cGUoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICpub2RlKQoreyBub2RlLT5uZXh0ID0gTlVMTDsKKyAgbm9kZS0+cHJudCA9IE5VTEw7CisgIG5vZGUtPmVsdHMgPSBOVUxMOworICBub2RlLT5hdHRzID0gTlVMTDsKKyAgbm9kZS0+bnN0ciA9IE5VTEw7CisgIG5vZGUtPm5hbWUgPSBOVUxMOworICBub2RlLT5kYXRhID0gTlVMTDsKKyAgbm9kZS0+d2lkZSA9IE5VTEw7CisgIG5vZGUtPm5vZGUgPSBOVUxMOworICBub2RlLT50eXBlID0gMDsKKyAgbm9kZS0+aGVhZCA9IE5VTEw7CisgIG5vZGUtPnRhaWwgPSBOVUxMOworICBub2RlLT5zb2FwID0gc29hcDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgCitvdXRfZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKm5vZGUsIGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqbnN0cikKK3sgaWYgKG5vZGUtPmhlYWQgJiYgc29hcF9zZW5kKHNvYXAsIG5vZGUtPmhlYWQpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKCFwcmVmaXgpCisgIHsgaWYgKG5vZGUtPnR5cGUgJiYgbm9kZS0+bm9kZSkKKyAgICAgIHJldHVybiBzb2FwX3B1dGVsZW1lbnQoc29hcCwgbm9kZS0+bm9kZSwgbmFtZSwgMCwgbm9kZS0+dHlwZSk7CisgICAgcmV0dXJuIHNvYXBfZWxlbWVudChzb2FwLCBuYW1lLCAwLCBOVUxMKTsgLyogZWxlbWVudCgpICovCisgIH0KKyAgaWYgKG5vZGUtPnR5cGUgJiYgbm9kZS0+bm9kZSkKKyAgeyBjaGFyICpzID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihwcmVmaXgpICsgc3RybGVuKG5hbWUpICsgMik7CisgICAgaWYgKCFzKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgc3ByaW50ZihzLCAiJXM6JXMiLCBwcmVmaXgsIG5hbWUpOworICAgIHNvYXBfcHV0ZWxlbWVudChzb2FwLCBub2RlLT5ub2RlLCBzLCAwLCBub2RlLT50eXBlKTsKKyAgICBTT0FQX0ZSRUUoc29hcCwgcyk7CisgIH0KKyAgZWxzZQorICB7IGNoYXIgKnM7CisgICAgaWYgKHN0cmxlbihwcmVmaXgpICsgc3RybGVuKG5hbWUpIDwgc2l6ZW9mKHNvYXAtPm1zZ2J1ZikpCisgICAgICBzID0gc29hcC0+bXNnYnVmOworICAgIGVsc2UKKyAgICB7IHMgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHByZWZpeCkgKyBzdHJsZW4obmFtZSkgKyAyKTsKKyAgICAgIGlmICghcykKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgfQorICAgIHNwcmludGYocywgIiVzOiVzIiwgcHJlZml4LCBuYW1lKTsKKyAgICBpZiAoc29hcF9lbGVtZW50KHNvYXAsIHMsIDAsIE5VTEwpKSAvKiBlbGVtZW50KCkgKi8KKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAobnN0cikKKyAgICB7IHNwcmludGYocywgInhtbG5zOiVzIiwgcHJlZml4KTsKKyAgICAgIHNvYXBfYXR0cmlidXRlKHNvYXAsIHMsIG5zdHIpOworICAgIH0KKyAgICBpZiAocyAhPSBzb2FwLT5tc2didWYpCisgICAgICBTT0FQX0ZSRUUoc29hcCwgcyk7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAorb3V0X2F0dHJpYnV0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkYXRhKQoreyBjaGFyICpzOworICBjb25zdCBjaGFyICp0OworICBpZiAoIXByZWZpeCkKKyAgICByZXR1cm4gc29hcF9hdHRyaWJ1dGUoc29hcCwgbmFtZSwgZGF0YSk7CisgIHQgPSBzdHJjaHIobmFtZSwgJzonKTsKKyAgaWYgKHQpCisgICAgdCsrOworICBlbHNlCisgICAgdCA9IG5hbWU7CisgIGlmIChzdHJsZW4ocHJlZml4KSArIHN0cmxlbih0KSA8IHNpemVvZihzb2FwLT5tc2didWYpKQorICAgIHMgPSBzb2FwLT5tc2didWY7CisgIGVsc2UKKyAgeyBzID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihwcmVmaXgpICsgc3RybGVuKHQpICsgMik7CisgICAgaWYgKCFzKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgIH0gCisgIHNwcmludGYocywgIiVzOiVzIiwgcHJlZml4LCB0KTsKKyAgc29hcF9hdHRyaWJ1dGUoc29hcCwgcywgZGF0YSk7CisgIGlmIChzICE9IHNvYXAtPm1zZ2J1ZikKKyAgICBTT0FQX0ZSRUUoc29hcCwgcyk7CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRfeHNkX19hbnlUeXBlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKm5vZGUsIGNvbnN0IGNoYXIgKnR5cGUpCit7IGlmIChub2RlKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICpwID0gTlVMTDsKKyAgICBjb25zdCBjaGFyICpwcmVmaXg7CQkvKiBuYW1lc3BhY2UgcHJlZml4LCBpZiBuYW1lc3BhY2UgaXMgcHJlc2VudCAqLworICAgIHNpemVfdCBjb2xvbjsKKyAgICBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9ET01fQVNJUykpCisgICAgeyBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICphdHQ7CisgICAgICBmb3IgKGF0dCA9IG5vZGUtPmF0dHM7IGF0dDsgYXR0ID0gYXR0LT5uZXh0KQorICAgICAgeyBpZiAoYXR0LT5uYW1lICYmIGF0dC0+bnN0cikKKyAgICAgICAgeyBpZiAoKHByZWZpeCA9IHN0cmNocihhdHQtPm5hbWUsICc6JykpKQorICAgICAgICAgIHsgY29sb24gPSBwcmVmaXggLSBhdHQtPm5hbWUgKyAxOworICAgICAgICAgICAgaWYgKGNvbG9uID4gc2l6ZW9mKHNvYXAtPnRhZykpCisgICAgICAgICAgICAgIGNvbG9uID0gc2l6ZW9mKHNvYXAtPnRhZyk7CisJICAgIHN0cm5jcHkoc29hcC0+dGFnLCBhdHQtPm5hbWUsIGNvbG9uIC0gMSk7CisgICAgICAgICAgICBzb2FwLT50YWdbY29sb24gLSAxXSA9ICdcMCc7CisgICAgICAgICAgICBpZiAoIShzb2FwX2VudGVyX25zKHNvYXAsIHNvYXAtPnRhZywgYXR0LT5uc3RyKSkpCisgICAgICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAobm9kZS0+bmFtZSkKKyAgICAgIHRhZyA9IG5vZGUtPm5hbWU7CisgICAgZWxzZSBpZiAoIXRhZykKKyAgICAgIHRhZyA9ICItIjsKKyAgICBpZiAoKHByZWZpeCA9IHN0cmNocih0YWcsICc6JykpKQorICAgIHsgY29sb24gPSBwcmVmaXggLSB0YWcgKyAxOworICAgICAgaWYgKGNvbG9uID4gc2l6ZW9mKHNvYXAtPnRhZykpCisgICAgICAgIGNvbG9uID0gc2l6ZW9mKHNvYXAtPnRhZyk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGNvbG9uID0gMDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRPTSBub2RlICclcydcbiIsIHRhZykpOworICAgIHByZWZpeCA9IE5VTEw7CisgICAgaWYgKG5vZGUtPm5zdHIgJiYgIShzb2FwLT5tb2RlICYgU09BUF9ET01fQVNJUykpCisgICAgeyBpZiAoY29sb24pCisgICAgICB7IHN0cm5jcHkoc29hcC0+dGFnLCB0YWcsIGNvbG9uIC0gMSk7CisgICAgICAgIHNvYXAtPnRhZ1tjb2xvbiAtIDFdID0gJ1wwJzsKKyAgICAgICAgaWYgKCEocCA9IHNvYXBfZW50ZXJfbnMoc29hcCwgc29hcC0+dGFnLCBub2RlLT5uc3RyKSkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICAgIHByZWZpeCA9IHAtPmlkOworICAgICAgICBpZiAob3V0X2VsZW1lbnQoc29hcCwgbm9kZSwgcHJlZml4LCB0YWcgKyBjb2xvbiwgbm9kZS0+bnN0cikpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBzdHJ1Y3QgTmFtZXNwYWNlICpuczsKKyAgICAgICAgZm9yIChucyA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXM7IG5zICYmIG5zLT5pZDsgbnMrKykKKyAgICAgICAgeyBpZiAobnMtPm5zID09IG5vZGUtPm5zdHIgfHwgIXN0cmNtcChucy0+bnMsIG5vZGUtPm5zdHIpKQorICAgICAgICAgIHsgLyogaWYgKHNvYXAtPmVuY29kaW5nU3R5bGUgfHwgbnMgPT0gc29hcC0+bG9jYWxfbmFtZXNwYWNlcykgKi8KKyAgICAgICAgICAgICAgcHJlZml4ID0gbnMtPmlkOworICAgICAgICAgICAgaWYgKG91dF9lbGVtZW50KHNvYXAsIG5vZGUsIG5zLT5pZCwgdGFnICsgY29sb24sIE5VTEwpKQorICAgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisJfQorICAgICAgICBpZiAoIW5zIHx8ICFucy0+aWQpCisgICAgICAgIHsgaWYgKChwID0gc29hcF9sb29rdXBfbnMoc29hcCwgbm9kZS0+bnN0cikpKQorICAgICAgICAgIHsgcHJlZml4ID0gcC0+aWQ7CisgICAgICAgICAgICBwID0gTlVMTDsKKyAgICAgICAgICAgIGlmIChvdXRfZWxlbWVudChzb2FwLCBub2RlLCBwcmVmaXgsIHRhZyArIGNvbG9uLCBOVUxMKSkKKyAgICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICAgIH0KKwkgIGVsc2UKKyAgICAgICAgICB7IHNwcmludGYoc29hcC0+dGFnLCBTT0FQX0RPTUlEX0ZPUk1BVCwgc29hcC0+aWRudW0rKyk7CisgICAgICAgICAgICBpZiAoIShwID0gc29hcF9lbnRlcl9ucyhzb2FwLCBzb2FwLT50YWcsIG5vZGUtPm5zdHIpKSkKKyAgICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICAgICAgICBwcmVmaXggPSBwLT5pZDsKKyAgICAgICAgICAgIGlmIChvdXRfZWxlbWVudChzb2FwLCBub2RlLCBwcmVmaXgsIHRhZyArIGNvbG9uLCBub2RlLT5uc3RyKSkKKyAgICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworCSAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7IGNvbG9uID0gMDsKKyAgICAgIGlmIChvdXRfZWxlbWVudChzb2FwLCBub2RlLCBOVUxMLCB0YWcsIE5VTEwpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIGlmICghbm9kZS0+dHlwZSB8fCAhbm9kZS0+bm9kZSkKKyAgICB7IHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgKmF0dDsKKyAgICAgIGZvciAoYXR0ID0gbm9kZS0+YXR0czsgYXR0OyBhdHQgPSBhdHQtPm5leHQpCisgICAgICB7IGlmIChhdHQtPm5hbWUpCisgICAgICAgIHsgaWYgKGF0dC0+bnN0cikKKyAgICAgICAgICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICpxOworICAgICAgICAgICAgaWYgKChhdHQtPm5zdHIgPT0gbm9kZS0+bnN0ciB8fCAobm9kZS0+bnN0ciAmJiAhc3RyY21wKGF0dC0+bnN0ciwgbm9kZS0+bnN0cikpKSAmJiBwcmVmaXgpCisJICAgIHsgaWYgKG91dF9hdHRyaWJ1dGUoc29hcCwgcHJlZml4LCBhdHQtPm5hbWUsIGF0dC0+ZGF0YSkpCisJICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoKHEgPSBzb2FwX2xvb2t1cF9ucyhzb2FwLCBhdHQtPm5zdHIpKSkKKwkgICAgeyBpZiAob3V0X2F0dHJpYnV0ZShzb2FwLCBxLT5pZCwgYXR0LT5uYW1lLCBhdHQtPmRhdGEpKQorCSAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworCSAgICB9CisJICAgIGVsc2UKKyAgICAgICAgICAgIHsgc3RydWN0IE5hbWVzcGFjZSAqbnM7CisJICAgICAgZm9yIChucyA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXM7IG5zICYmIG5zLT5pZDsgbnMrKykKKyAgICAgICAgICAgICAgeyBpZiAobnMtPm5zID09IGF0dC0+bnN0ciB8fCAhc3RyY21wKG5zLT5ucywgYXR0LT5uc3RyKSkKKwkgICAgICAgIHsgaWYgKG91dF9hdHRyaWJ1dGUoc29hcCwgbnMtPmlkLCBhdHQtPm5hbWUsIGF0dC0+ZGF0YSkpCisJICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworCSAgICAgICAgICBicmVhazsKKwkgICAgICAgIH0KKwkgICAgICB9CisJICAgICAgaWYgKCFucyB8fCAhbnMtPmlkKQorICAgICAgICAgICAgICB7IHNwcmludGYoc29hcC0+bXNnYnVmLCAieG1sbnM6IlNPQVBfRE9NSURfRk9STUFULCBzb2FwLT5pZG51bSsrKTsKKwkgICAgICAgIGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCBzb2FwLT5tc2didWYsIGF0dC0+bnN0cikpCisJICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKwkgICAgICAgIHN0cmNhdChzb2FwLT5tc2didWYsICI6Iik7CisJICAgICAgICBzdHJjYXQoc29hcC0+bXNnYnVmLCBhdHQtPm5hbWUpOworCSAgICAgICAgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsIHNvYXAtPm1zZ2J1ZiArIDYsIGF0dC0+ZGF0YSkpCisJICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKwkgIGVsc2UgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsIGF0dC0+bmFtZSwgYXR0LT5kYXRhKSkKKyAgICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHNvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHNvYXAsIE5VTEwpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqZWx0OworICAgICAgaWYgKG5vZGUtPmRhdGEpCisgICAgICB7IGlmIChzb2FwX3N0cmluZ19vdXQoc29hcCwgbm9kZS0+ZGF0YSwgMCkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgICAgZWxzZSBpZiAobm9kZS0+d2lkZSkKKyAgICAgIHsgaWYgKHNvYXBfd3N0cmluZ19vdXQoc29hcCwgbm9kZS0+d2lkZSwgMCkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgICAgZm9yIChlbHQgPSBub2RlLT5lbHRzOyBlbHQ7IGVsdCA9IGVsdC0+bmV4dCkKKyAgICAgIHsgaWYgKHNvYXBfb3V0X3hzZF9fYW55VHlwZShzb2FwLCB0YWcsIDAsIGVsdCwgTlVMTCkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgICAgaWYgKG5vZGUtPnRhaWwgJiYgc29hcF9zZW5kKHNvYXAsIG5vZGUtPnRhaWwpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBpZiAoIXByZWZpeCkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgb2YgRE9NIG5vZGUgJyVzJ1xuIiwgdGFnICsgY29sb24pKTsKKyAgICAgICAgaWYgKHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyArIGNvbG9uKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IGNoYXIgKnM7CisgICAgICAgIGlmIChzdHJsZW4ocHJlZml4KSArIHN0cmxlbih0YWcgKyBjb2xvbikgPCBzaXplb2Yoc29hcC0+bXNnYnVmKSkKKwkgIHMgPSBzb2FwLT5tc2didWY7CisJZWxzZQorCXsgcyA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4ocHJlZml4KSArIHN0cmxlbih0YWcgKyBjb2xvbikgKyAyKTsKKyAgICAgICAgICBpZiAoIXMpCisgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKwl9CisJc3ByaW50ZihzLCAiJXM6JXMiLCBwcmVmaXgsIHRhZyArIGNvbG9uKTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgb2YgRE9NIG5vZGUgJyVzJ1xuIiwgcykpOworICAgICAgICBpZiAoc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgcykpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBpZiAocyAhPSBzb2FwLT5tc2didWYpCisJICBTT0FQX0ZSRUUoc29hcCwgcyk7CisgICAgICB9CisgICAgICBpZiAocCkKKyAgICAgICAgcC0+bGV2ZWwgPSAwOyAvKiB4bWxucyBiaW5kaW5nIGlzIG91dCBvZiBzY29wZSAqLworICAgIH0KKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5feHNkX19hbnlUeXBlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICpub2RlLCBjb25zdCBjaGFyICp0eXBlKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKnRwOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICoqYXR0OworICBpZiAoc29hcF9wZWVrX2VsZW1lbnQoc29hcCkpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmICghbm9kZSkKKyAgeyBpZiAoIShub2RlID0gKHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50Kilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQpKSkpCisgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9CisgIHNvYXBfZGVmYXVsdF94c2RfX2FueVR5cGUoc29hcCwgbm9kZSk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRE9NIG5vZGUgJXNcbiIsIHNvYXAtPnRhZykpOworICBub2RlLT5uc3RyID0gc29hcF9jdXJyZW50X25hbWVzcGFjZShzb2FwLCBzb2FwLT50YWcpOworICBub2RlLT5uYW1lID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+dGFnKTsKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9ET01fTk9ERSkgfHwgKCEoc29hcC0+bW9kZSAmIFNPQVBfRE9NX1RSRUUpICYmICpzb2FwLT5pZCkpCisgIHsgaWYgKChub2RlLT5ub2RlID0gc29hcF9nZXRlbGVtZW50KHNvYXAsICZub2RlLT50eXBlKSkpCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRPTSBub2RlIGNvbnRhaW5zIHR5cGUgJWQgZnJvbSB4c2k6dHlwZVxuIiwgbm9kZS0+dHlwZSkpOworICAgICAgcmV0dXJuIG5vZGU7CisgICAgfQorICAgIGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgICBlbHNlCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBhdHQgPSAmbm9kZS0+YXR0czsKKyAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICB7IGlmICh0cC0+dmlzaWJsZSkKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRE9NIG5vZGUgYXR0cmlidXRlPSclcydcbiIsIHRwLT5uYW1lKSk7CisgICAgICAqYXR0ID0gKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlKSk7CisgICAgICBpZiAoISphdHQpCisgICAgICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgKCphdHQpLT5uZXh0ID0gTlVMTDsKKyAgICAgICgqYXR0KS0+bnN0ciA9IHNvYXBfY3VycmVudF9uYW1lc3BhY2Uoc29hcCwgdHAtPm5hbWUpOworICAgICAgKCphdHQpLT5uYW1lID0gc29hcF9zdHJkdXAoc29hcCwgdHAtPm5hbWUpOworICAgICAgaWYgKHRwLT52aXNpYmxlID09IDIpCisgICAgICAgICgqYXR0KS0+ZGF0YSA9IHNvYXBfc3RyZHVwKHNvYXAsIHRwLT52YWx1ZSk7CisgICAgICBlbHNlCisgICAgICAgICgqYXR0KS0+ZGF0YSA9IE5VTEw7CisgICAgICAoKmF0dCktPndpZGUgPSBOVUxMOworICAgICAgKCphdHQpLT5zb2FwID0gc29hcDsKKyAgICAgIGF0dCA9ICYoKmF0dCktPm5leHQ7CisgICAgICB0cC0+dmlzaWJsZSA9IDA7CisgICAgfQorICB9CisgIHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCBOVUxMLCAxKTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJET00gbm9kZSAnJXMnIGFjY2VwdGVkXG4iLCBub2RlLT5uYW1lKSk7CisgIGlmIChzb2FwLT5ib2R5KQorICB7IGlmICghc29hcF9wZWVrX2VsZW1lbnQoc29hcCkpCisgICAgeyBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqKmVsdDsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRE9NIG5vZGUgJyVzJyBoYXMgc3ViZWxlbWVudHNcbiIsIG5vZGUtPm5hbWUpKTsKKyAgICAgIGVsdCA9ICZub2RlLT5lbHRzOworICAgICAgZm9yICg7OykKKyAgICAgIHsgaWYgKCEoKmVsdCA9IHNvYXBfaW5feHNkX19hbnlUeXBlKHNvYXAsIE5VTEwsIE5VTEwsIE5VTEwpKSkKKyAgICAgICAgeyBpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcpCisgICAgICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwkoKmVsdCktPnBybnQgPSBub2RlOworICAgICAgICBlbHQgPSAmKCplbHQpLT5uZXh0OworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRE9NIG5vZGUgJyVzJyBoYXMgY2RhdGFcbiIsIG5vZGUtPm5hbWUpKTsKKyAgICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfQ19VVEZTVFJJTkcpIHx8IChzb2FwLT5tb2RlICYgU09BUF9DX01CU1RSSU5HKSkKKyAgICAgIHsgaWYgKCEobm9kZS0+ZGF0YSA9IHNvYXBfc3RyaW5nX2luKHNvYXAsIDEsIC0xLCAtMSkpKQorICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIShub2RlLT53aWRlID0gc29hcF93c3RyaW5nX2luKHNvYXAsIDEsIC0xLCAtMSkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgbm9kZS0+bmFtZSkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBvZiBET00gbm9kZSAnJXMnXG4iLCBub2RlLT5uYW1lKSk7CisgIH0KKyAgcmV0dXJuIG5vZGU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJRE9NIHRyYXZlcnNpbmcKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqCitTT0FQX0ZNQUMyCitzb2FwX2RvbV9uZXh0X2VsZW1lbnQoc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKmVsdCkKK3sgaWYgKGVsdC0+ZWx0cykKKyAgICByZXR1cm4gZWx0LT5lbHRzOworICBpZiAoZWx0LT5uZXh0KQorICAgIHJldHVybiBlbHQtPm5leHQ7CisgIGRvIGVsdCA9IGVsdC0+cHJudDsKKyAgd2hpbGUgKGVsdCAmJiAhZWx0LT5uZXh0KTsKKyAgaWYgKGVsdCkKKyAgICBlbHQgPSBlbHQtPm5leHQ7CisgIHJldHVybiBlbHQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICpzb2FwX2RvbV9uZXh0X2F0dHJpYnV0ZShzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICphdHQpCit7IHJldHVybiBhdHQtPm5leHQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJTmFtZXNwYWNlIHByZWZpeCBsb29rdXAvc3RvcmUKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IHNvYXBfaWxpc3QgKgorc29hcF9sb29rdXBfbnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5zdHIpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgZm9yIChpcCA9IHNvYXAtPmlodFtzb2FwX2hhc2gobnN0cildOyBpcDsgaXAgPSBpcC0+bmV4dCkKKyAgICBpZiAoIXN0cmNtcCgoY2hhciopaXAtPnB0ciwgbnN0cikgJiYgaXAtPmxldmVsKQorICAgICAgcmV0dXJuIGlwOworICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3Qgc29hcF9pbGlzdCAqCitzb2FwX2VudGVyX25zKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKm5zdHIpCit7IGludCBoOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIGZvciAoaXAgPSBzb2FwLT5paHRbc29hcF9oYXNoKG5zdHIpXTsgaXA7IGlwID0gaXAtPm5leHQpCisgIHsgaWYgKCFzdHJjbXAoKGNoYXIqKWlwLT5wdHIsIG5zdHIpICYmICFpcC0+bGV2ZWwpCisgICAgeyBzdHJjcHkoaXAtPmlkLCBwcmVmaXgpOworICAgICAgaXAtPmxldmVsID0gMTsKKyAgICAgIHJldHVybiBpcDsKKyAgICB9CisgIH0KKyAgaXAgPSAoc3RydWN0IHNvYXBfaWxpc3QqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9pbGlzdCkgKyBzdHJsZW4obnN0cikgKyBTT0FQX1RBR0xFTik7CisgIGlmIChpcCkKKyAgeyBoID0gc29hcF9oYXNoKG5zdHIpOworICAgIHN0cmNweShpcC0+aWQsIHByZWZpeCk7CisgICAgaXAtPnB0ciA9IGlwLT5pZCArIFNPQVBfVEFHTEVOOworICAgIHN0cmNweSgoY2hhciopaXAtPnB0ciwgbnN0cik7CisgICAgaXAtPm5leHQgPSBzb2FwLT5paHRbaF07CisgICAgc29hcC0+aWh0W2hdID0gaXA7CisgICAgaXAtPmZsaXN0ID0gTlVMTDsKKyAgICBpcC0+Y29weSA9IE5VTEw7CisgICAgaXAtPmxldmVsID0gMTsKKyAgICByZXR1cm4gaXA7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqCXNvYXBfZG9tX2VsZW1lbnQgY2xhc3MKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzb2FwX2RvbV9lbGVtZW50Ojpzb2FwX2RvbV9lbGVtZW50KCkKK3sgc29hcF9kZWZhdWx0X3hzZF9fYW55VHlwZShOVUxMLCB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2VsZW1lbnQ6OnNvYXBfZG9tX2VsZW1lbnQoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXBfZGVmYXVsdF94c2RfX2FueVR5cGUoc29hcCwgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzb2FwX2RvbV9lbGVtZW50Ojpzb2FwX2RvbV9lbGVtZW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuc3RyLCBjb25zdCBjaGFyICpuYW1lKQoreyBzb2FwX2RlZmF1bHRfeHNkX19hbnlUeXBlKHNvYXAsIHRoaXMpOworICB0aGlzLT5uc3RyID0gc29hcF9zdHJkdXAoc29hcCwgbnN0cik7CisgIHRoaXMtPm5hbWUgPSBzb2FwX3N0cmR1cChzb2FwLCBuYW1lKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2VsZW1lbnQ6OnNvYXBfZG9tX2VsZW1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5zdHIsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRhdGEpCit7IHNvYXBfZGVmYXVsdF94c2RfX2FueVR5cGUoc29hcCwgdGhpcyk7CisgIHRoaXMtPm5zdHIgPSBzb2FwX3N0cmR1cChzb2FwLCBuc3RyKTsKKyAgdGhpcy0+bmFtZSA9IHNvYXBfc3RyZHVwKHNvYXAsIG5hbWUpOworICB0aGlzLT5kYXRhID0gc29hcF9zdHJkdXAoc29hcCwgZGF0YSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzb2FwX2RvbV9lbGVtZW50Ojpzb2FwX2RvbV9lbGVtZW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuc3RyLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpub2RlLCBpbnQgdHlwZSkKK3sgc29hcF9kZWZhdWx0X3hzZF9fYW55VHlwZShzb2FwLCB0aGlzKTsKKyAgdGhpcy0+bnN0ciA9IHNvYXBfc3RyZHVwKHNvYXAsIG5zdHIpOworICB0aGlzLT5uYW1lID0gc29hcF9zdHJkdXAoc29hcCwgbmFtZSk7CisgIHRoaXMtPm5vZGUgPSBub2RlOworICB0aGlzLT50eXBlID0gdHlwZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2VsZW1lbnQ6On5zb2FwX2RvbV9lbGVtZW50KCkKK3sgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc29hcF9kb21fZWxlbWVudCAmc29hcF9kb21fZWxlbWVudDo6c2V0KGNvbnN0IGNoYXIgKm5zdHIsIGNvbnN0IGNoYXIgKm5hbWUpCit7IHRoaXMtPm5zdHIgPSBzb2FwX3N0cmR1cChzb2FwLCBuc3RyKTsKKyAgdGhpcy0+bmFtZSA9IHNvYXBfc3RyZHVwKHNvYXAsIG5hbWUpOworICByZXR1cm4gKnRoaXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzb2FwX2RvbV9lbGVtZW50ICZzb2FwX2RvbV9lbGVtZW50OjpzZXQoY29uc3QgY2hhciAqZGF0YSkKK3sgdGhpcy0+ZGF0YSA9IHNvYXBfc3RyZHVwKHNvYXAsIGRhdGEpOworICByZXR1cm4gKnRoaXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzb2FwX2RvbV9lbGVtZW50ICZzb2FwX2RvbV9lbGVtZW50OjpzZXQodm9pZCAqbm9kZSwgaW50IHR5cGUpCit7IHRoaXMtPm5vZGUgPSBub2RlOworICB0aGlzLT50eXBlID0gdHlwZTsKKyAgcmV0dXJuICp0aGlzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc29hcF9kb21fZWxlbWVudCAmc29hcF9kb21fZWxlbWVudDo6YWRkKHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICplbHQpCit7IGVsdC0+cHJudCA9IHRoaXM7CisgIGZvciAoc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKmUgPSBlbHRzOyBlOyBlID0gZS0+bmV4dCkKKyAgeyBpZiAoIWUtPm5leHQpCisgICAgeyBlLT5uZXh0ID0gZWx0OworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgfQorICBlbHRzID0gZWx0OworICByZXR1cm4gKnRoaXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzb2FwX2RvbV9lbGVtZW50ICZzb2FwX2RvbV9lbGVtZW50OjphZGQoc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgJmVsdCkKK3sgcmV0dXJuIGFkZCgmZWx0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2VsZW1lbnQgJnNvYXBfZG9tX2VsZW1lbnQ6OmFkZChzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICphdHQpCit7IGZvciAoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAqYSA9IGF0dHM7IGE7IGEgPSBhLT5uZXh0KQorICB7IGlmICghYS0+bmV4dCkKKyAgICB7IGEtPm5leHQgPSBhdHQ7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICB9CisgIGF0dHMgPSBhdHQ7CisgIHJldHVybiAqdGhpczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2VsZW1lbnQgJnNvYXBfZG9tX2VsZW1lbnQ6OmFkZChzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICZhdHQpCit7IHJldHVybiBhZGQoJmF0dCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yIHNvYXBfZG9tX2VsZW1lbnQ6OmJlZ2luKCkKK3sgc29hcF9kb21fZWxlbWVudF9pdGVyYXRvciBpdGVyKHRoaXMpOworICByZXR1cm4gaXRlcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3Igc29hcF9kb21fZWxlbWVudDo6ZW5kKCkKK3sgc29hcF9kb21fZWxlbWVudF9pdGVyYXRvciBpdGVyKE5VTEwpOworICByZXR1cm4gaXRlcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3Igc29hcF9kb21fZWxlbWVudDo6ZmluZChjb25zdCBjaGFyICpuc3RyLCBjb25zdCBjaGFyICpuYW1lKQoreyBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yIGl0ZXIodGhpcyk7CisgIGl0ZXIubnN0ciA9IG5zdHI7CisgIGl0ZXIubmFtZSA9IG5hbWU7CisgIGlmIChuYW1lICYmIHNvYXBfdGFnX2NtcCh0aGlzLT5uYW1lLCBuYW1lKSkKKyAgICByZXR1cm4gKytpdGVyOworICBpZiAobnN0ciAmJiB0aGlzLT5uc3RyICYmIHNvYXBfdGFnX2NtcCh0aGlzLT5uc3RyLCBuc3RyKSkKKyAgICByZXR1cm4gKytpdGVyOworICByZXR1cm4gaXRlcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3Igc29hcF9kb21fZWxlbWVudDo6ZmluZChpbnQgdHlwZSkKK3sgc29hcF9kb21fZWxlbWVudF9pdGVyYXRvciBpdGVyKHRoaXMpOworICBpdGVyLnR5cGUgPSB0eXBlOworICBpZiAodGhpcy0+dHlwZSAhPSB0eXBlKQorICAgIHJldHVybiArK2l0ZXI7CisgIHJldHVybiBpdGVyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBzb2FwX2RvbV9lbGVtZW50Ojp1bmxpbmsoKQoreyBzb2FwX3VubGluayhzb2FwLCB0aGlzKTsKKyAgc29hcF91bmxpbmsoc29hcCwgbnN0cik7CisgIHNvYXBfdW5saW5rKHNvYXAsIG5hbWUpOworICBzb2FwX3VubGluayhzb2FwLCBkYXRhKTsKKyAgc29hcF91bmxpbmsoc29hcCwgd2lkZSk7CisgIGlmIChlbHRzKQorICAgIGVsdHMtPnVubGluaygpOworICBpZiAoYXR0cykKKyAgICBlbHRzLT51bmxpbmsoKTsKKyAgaWYgKG5leHQpCisgICAgbmV4dC0+dW5saW5rKCk7CisgIG5vZGUgPSBOVUxMOworICB0eXBlID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglzb2FwX2RvbV9hdHRyaWJ1dGUgY2xhc3MKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzb2FwX2RvbV9hdHRyaWJ1dGU6OnNvYXBfZG9tX2F0dHJpYnV0ZSgpCit7IHRoaXMtPnNvYXAgPSBOVUxMOworICB0aGlzLT5uZXh0ID0gTlVMTDsKKyAgdGhpcy0+bnN0ciA9IE5VTEw7CisgIHRoaXMtPm5hbWUgPSBOVUxMOworICB0aGlzLT5kYXRhID0gTlVMTDsKKyAgdGhpcy0+d2lkZSA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzb2FwX2RvbV9hdHRyaWJ1dGU6OnNvYXBfZG9tX2F0dHJpYnV0ZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgdGhpcy0+c29hcCA9IHNvYXA7CisgIHRoaXMtPm5leHQgPSBOVUxMOworICB0aGlzLT5uc3RyID0gTlVMTDsKKyAgdGhpcy0+bmFtZSA9IE5VTEw7CisgIHRoaXMtPmRhdGEgPSBOVUxMOworICB0aGlzLT53aWRlID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2F0dHJpYnV0ZTo6c29hcF9kb21fYXR0cmlidXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuc3RyLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkYXRhKQoreyB0aGlzLT5zb2FwID0gc29hcDsKKyAgdGhpcy0+bmV4dCA9IE5VTEw7CisgIHRoaXMtPm5zdHIgPSBzb2FwX3N0cmR1cChzb2FwLCBuc3RyKTsKKyAgdGhpcy0+bmFtZSA9IHNvYXBfc3RyZHVwKHNvYXAsIG5hbWUpOworICB0aGlzLT5kYXRhID0gc29hcF9zdHJkdXAoc29hcCwgZGF0YSk7CisgIHRoaXMtPndpZGUgPSBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc29hcF9kb21fYXR0cmlidXRlOjp+c29hcF9kb21fYXR0cmlidXRlKCkKK3sgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yIHNvYXBfZG9tX2F0dHJpYnV0ZTo6YmVnaW4oKQoreyBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IgaXRlcih0aGlzKTsKKyAgcmV0dXJuIGl0ZXI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3Igc29hcF9kb21fYXR0cmlidXRlOjplbmQoKQoreyBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IgaXRlcihOVUxMKTsKKyAgcmV0dXJuIGl0ZXI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3Igc29hcF9kb21fYXR0cmlidXRlOjpmaW5kKGNvbnN0IGNoYXIgKm5zdHIsIGNvbnN0IGNoYXIgKm5hbWUpCit7IHNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvciBpdGVyKHRoaXMpOworICBpdGVyLm5zdHIgPSBuc3RyOworICBpdGVyLm5hbWUgPSBuYW1lOworICBpZiAobmFtZSAmJiBzb2FwX3RhZ19jbXAodGhpcy0+bmFtZSwgbmFtZSkpCisgICAgcmV0dXJuICsraXRlcjsKKyAgaWYgKG5zdHIgJiYgdGhpcy0+bnN0ciAmJiBzb2FwX3RhZ19jbXAodGhpcy0+bnN0ciwgbnN0cikpCisgICAgcmV0dXJuICsraXRlcjsKKyAgcmV0dXJuIGl0ZXI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHNvYXBfZG9tX2F0dHJpYnV0ZTo6dW5saW5rKCkKK3sgc29hcF91bmxpbmsoc29hcCwgdGhpcyk7CisgIHNvYXBfdW5saW5rKHNvYXAsIG5zdHIpOworICBzb2FwX3VubGluayhzb2FwLCBuYW1lKTsKKyAgc29hcF91bmxpbmsoc29hcCwgZGF0YSk7CisgIHNvYXBfdW5saW5rKHNvYXAsIHdpZGUpOworICBpZiAobmV4dCkKKyAgICBuZXh0LT51bmxpbmsoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yIGNsYXNzCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc29hcF9kb21fZWxlbWVudF9pdGVyYXRvcjo6c29hcF9kb21fZWxlbWVudF9pdGVyYXRvcigpCit7IGVsdCA9IE5VTEw7CisgIG5zdHIgPSBOVUxMOworICBuYW1lID0gTlVMTDsKKyAgdHlwZSA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yOjpzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yKHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICplbHQpCit7IHRoaXMtPmVsdCA9IGVsdDsKKyAgbnN0ciA9IE5VTEw7CisgIG5hbWUgPSBOVUxMOworICB0eXBlID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3I6On5zb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yKCkKK3sgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYm9vbCBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yOjpvcGVyYXRvcj09KGNvbnN0IHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IgJml0ZXIpIGNvbnN0Cit7IHJldHVybiB0aGlzLT5lbHQgPT0gaXRlci5lbHQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitib29sIHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3I6Om9wZXJhdG9yIT0oY29uc3Qgc29hcF9kb21fZWxlbWVudF9pdGVyYXRvciAmaXRlcikgY29uc3QKK3sgcmV0dXJuIHRoaXMtPmVsdCAhPSBpdGVyLmVsdDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICZzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yOjpvcGVyYXRvciooKSBjb25zdAoreyByZXR1cm4gKnRoaXMtPmVsdDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IgJnNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3I6Om9wZXJhdG9yKysoKQoreyB3aGlsZSAoZWx0KQorICB7IGVsdCA9IHNvYXBfZG9tX25leHRfZWxlbWVudChlbHQpOworICAgIGlmICghZWx0KQorICAgICAgYnJlYWs7CisgICAgaWYgKG5hbWUgJiYgZWx0LT5uYW1lKQorICAgIHsgaWYgKCFzb2FwX3RhZ19jbXAoZWx0LT5uYW1lLCBuYW1lKSkKKyAgICAgIHsgaWYgKG5zdHIgJiYgZWx0LT5uc3RyKQorICAgICAgICB7IGlmICghc29hcF90YWdfY21wKGVsdC0+bnN0ciwgbnN0cikpCisJICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAodHlwZSkKKyAgICB7IGlmIChlbHQtPnR5cGUgPT0gdHlwZSkKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiAqdGhpczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IgY2xhc3MKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I6OnNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcigpCit7IGF0dCA9IE5VTEw7CisgIG5zdHIgPSBOVUxMOworICBuYW1lID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjo6c29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgKmF0dCkKK3sgdGhpcy0+YXR0ID0gYXR0OworICBuc3RyID0gTlVMTDsKKyAgbmFtZSA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I6On5zb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IoKQoreyB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitib29sIHNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjo6b3BlcmF0b3I9PShjb25zdCBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IgJml0ZXIpIGNvbnN0Cit7IHJldHVybiB0aGlzLT5hdHQgPT0gaXRlci5hdHQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitib29sIHNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjo6b3BlcmF0b3IhPShjb25zdCBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IgJml0ZXIpIGNvbnN0Cit7IHJldHVybiB0aGlzLT5hdHQgIT0gaXRlci5hdHQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICZzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I6Om9wZXJhdG9yKigpIGNvbnN0Cit7IHJldHVybiAqdGhpcy0+YXR0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yICZzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I6Om9wZXJhdG9yKysoKQoreyB3aGlsZSAoYXR0KQorICB7IGF0dCA9IHNvYXBfZG9tX25leHRfYXR0cmlidXRlKGF0dCk7CisgICAgaWYgKCFhdHQpCisgICAgICBicmVhazsKKyAgICBpZiAobmFtZSAmJiBhdHQtPm5hbWUpCisgICAgeyBpZiAoIXNvYXBfdGFnX2NtcChhdHQtPm5hbWUsIG5hbWUpKQorICAgICAgeyBpZiAobnN0ciAmJiBhdHQtPm5zdHIpCisgICAgICAgIHsgaWYgKCFzb2FwX3RhZ19jbXAoYXR0LT5uc3RyLCBuc3RyKSkKKwkgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gKnRoaXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJSS9PCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBVTkRFUl9DRQorCitzdGQ6Om9zdHJlYW0gJm9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtICZvLCBjb25zdCBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAmZSkKK3sgaWYgKCFlLnNvYXApCisgIHsgc3RydWN0IHNvYXAgc29hcDsKKyAgICBzb2FwX2luaXQyKCZzb2FwLCBTT0FQX0lPX0RFRkFVTFQsIFNPQVBfWE1MX0dSQVBIKTsKKyAgICBzb2FwX3NlcmlhbGl6ZV94c2RfX2FueVR5cGUoJnNvYXAsICZlKTsKKyAgICBzb2FwX2JlZ2luX3NlbmQoJnNvYXApOworICAgIHNvYXBfb3V0X3hzZF9fYW55VHlwZSgmc29hcCwgTlVMTCwgMCwgJmUsIE5VTEwpOworICAgIHNvYXBfZW5kX3NlbmQoJnNvYXApOworICAgIHNvYXBfZW5kKCZzb2FwKTsKKyAgICBzb2FwX2RvbmUoJnNvYXApOworICB9CisgIGVsc2UKKyAgeyBzdGQ6Om9zdHJlYW0gKm9zID0gZS5zb2FwLT5vczsKKyAgICBlLnNvYXAtPm9zID0gJm87CisgICAgc2hvcnQgb21vZGUgPSBlLnNvYXAtPm9tb2RlOworICAgIHNvYXBfc2V0X29tb2RlKGUuc29hcCwgU09BUF9YTUxfR1JBUEgpOworICAgIHNvYXBfc2VyaWFsaXplX3hzZF9fYW55VHlwZShlLnNvYXAsICZlKTsKKyAgICBzb2FwX2JlZ2luX3NlbmQoZS5zb2FwKTsKKyAgICBzb2FwX291dF94c2RfX2FueVR5cGUoZS5zb2FwLCBOVUxMLCAwLCAmZSwgTlVMTCk7CisgICAgc29hcF9lbmRfc2VuZChlLnNvYXApOworICAgIGUuc29hcC0+b3MgPSBvczsKKyAgICBlLnNvYXAtPm9tb2RlID0gb21vZGU7CisgIH0KKyAgcmV0dXJuIG87Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGQ6OmlzdHJlYW0gJm9wZXJhdG9yPj4oc3RkOjppc3RyZWFtICZpLCBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAmZSkKK3sgaWYgKCFlLnNvYXApCisgICAgZS5zb2FwID0gc29hcF9uZXcoKTsKKyAgc3RkOjppc3RyZWFtICppcyA9IGUuc29hcC0+aXM7CisgIGUuc29hcC0+aXMgPSAmaTsKKyAgaWYgKHNvYXBfYmVnaW5fcmVjdihlLnNvYXApCisgICB8fCAhc29hcF9pbl94c2RfX2FueVR5cGUoZS5zb2FwLCBOVUxMLCAmZSwgTlVMTCkKKyAgIHx8IHNvYXBfZW5kX3JlY3YoZS5zb2FwKSkKKyAgICA7IC8qIGhhbmRsZSBlcnJvcj8gTm90ZTogZS5zb2FwLT5lcnJvciBpcyBzZXQgYW5kIGFwcCBzaG91bGQgY2hlY2sgKi8KKyAgZS5zb2FwLT5pcyA9IGlzOworICByZXR1cm4gaTsKK30KKworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZG9tLmNwcCBiL2RvbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIxNDk5NgotLS0gL2Rldi9udWxsCisrKyBiL2RvbS5jcHAKQEAgLTAsMCArMSw5MDkgQEAKKy8qCisKK2RvbS5jW3BwXQorCitnU09BUCBET00gaW1wbGVtZW50YXRpb24KKworZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlczoKK0dQTCwgdGhlIGdTT0FQIHB1YmxpYyBsaWNlbnNlLCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgcHVibGljIGxpY2Vuc2UuCisKK1RoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGdTT0FQIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4zCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKK0xpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoraHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL3NvYXBsaWNlbnNlLmh0bWwKK1NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCitXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKK2ZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK1RoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4uCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4sIEdlbml2aWEgaW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCURldmVsb3BtZW50IG5vdGU6CisJUmV1c2VkIHRoZSBnU09BUCBzdHJ1Y3Qgc29hcCBpZCBoYXNoIHRhYmxlIGZvciBoYW5kbGluZyBuYW1lc3BhY2UKKwliaW5kaW5ncyB3aGVuIHRyYW5zbWl0dGluZyBET01zCisKK0NoYW5nZXM6CisJUmVuYW1lZCBfX3R5cGUgdG8gdHlwZSAoY29ycmVjdGlvbikKKwlkb20uYywgZG9tKysuY3BwLCBhbmQgZG9tLmNwcCBhcmUgZXF1aXZhbGVudAorCVJlbmFtZWQgU09BUF9YTUxfVFJFRSB0byBTT0FQX0RPTV9UUkVFCisJUmVuYW1lZCBTT0FQX1hNTF9HUkFQSCB0byBTT0FQX0RPTV9OT0RFCisJQWRkZWQgU09BUF9ET01fQVNJUworCitUT0RPOglJbXByb3ZlIG1peGVkIGNvbnRlbnQgaGFuZGxpbmcKKyovCisKKyNpbmNsdWRlICJzdGRzb2FwMi5oIgorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV94c2RfX2FueVR5cGUoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCBjb25zdCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9kZWZhdWx0X3hzZF9fYW55VHlwZShzdHJ1Y3Qgc29hcCosIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF94c2RfX2FueVR5cGUoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dF94c2RfX2FueVR5cGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICogU09BUF9GTUFDNCBzb2FwX2dldF94c2RfX2FueVR5cGUoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqIFNPQVBfRk1BQzIgc29hcF9pbl94c2RfX2FueVR5cGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX21hcmtlbGVtZW50KHN0cnVjdCBzb2FwKiwgY29uc3Qgdm9pZCosIGludCk7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0ZWxlbWVudChzdHJ1Y3Qgc29hcCosIGNvbnN0IHZvaWQqLCBjb25zdCBjaGFyKiwgaW50LCBpbnQpOworU09BUF9GTUFDMyB2b2lkICpTT0FQX0ZNQUM0IHNvYXBfZ2V0ZWxlbWVudChzdHJ1Y3Qgc29hcCosIGludCopOworCisvKiBmb3JtYXQgc3RyaW5nIGZvciBnZW5lcmF0aW5nIERPTSBuYW1lc3BhY2UgcHJlZml4ZXMgKDw9IDE2IGNoYXJzIHRvdGFsKSAqLworI2RlZmluZSBTT0FQX0RPTUlEX0ZPUk1BVCAiZG9tJWQiCisKKy8qIG5hbWVzcGFjZSBuYW1lIChVUkkpIGxvb2t1cCBhbmQgc3RvcmUgcm91dGluZXMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29hcF9pbGlzdCAqc29hcF9sb29rdXBfbnMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKik7CitzdGF0aWMgc3RydWN0IHNvYXBfaWxpc3QgKnNvYXBfZW50ZXJfbnMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqCURPTSBjdXN0b20gKGRlKXNlcmlhbGl6ZXJzCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXJpYWxpemVfeHNkX19hbnlUeXBlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqbm9kZSkKK3sgaWYgKG5vZGUpCisgIHsgaWYgKG5vZGUtPnR5cGUgJiYgbm9kZS0+bm9kZSkKKyAgICAgIHNvYXBfbWFya2VsZW1lbnQoc29hcCwgbm9kZS0+bm9kZSwgbm9kZS0+dHlwZSk7CisgICAgZWxzZQorICAgIHsgY29uc3Qgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKmVsdDsKKyAgICAgIGZvciAoZWx0ID0gbm9kZS0+ZWx0czsgZWx0OyBlbHQgPSBlbHQtPm5leHQpCisgICAgICAgIHNvYXBfc2VyaWFsaXplX3hzZF9fYW55VHlwZShzb2FwLCBlbHQpOworICAgIH0KKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9kZWZhdWx0X3hzZF9fYW55VHlwZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKm5vZGUpCit7IG5vZGUtPm5leHQgPSBOVUxMOworICBub2RlLT5wcm50ID0gTlVMTDsKKyAgbm9kZS0+ZWx0cyA9IE5VTEw7CisgIG5vZGUtPmF0dHMgPSBOVUxMOworICBub2RlLT5uc3RyID0gTlVMTDsKKyAgbm9kZS0+bmFtZSA9IE5VTEw7CisgIG5vZGUtPmRhdGEgPSBOVUxMOworICBub2RlLT53aWRlID0gTlVMTDsKKyAgbm9kZS0+bm9kZSA9IE5VTEw7CisgIG5vZGUtPnR5cGUgPSAwOworICBub2RlLT5oZWFkID0gTlVMTDsKKyAgbm9kZS0+dGFpbCA9IE5VTEw7CisgIG5vZGUtPnNvYXAgPSBzb2FwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCAKK291dF9lbGVtZW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqbm9kZSwgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpuc3RyKQoreyBpZiAobm9kZS0+aGVhZCAmJiBzb2FwX3NlbmQoc29hcCwgbm9kZS0+aGVhZCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoIXByZWZpeCkKKyAgeyBpZiAobm9kZS0+dHlwZSAmJiBub2RlLT5ub2RlKQorICAgICAgcmV0dXJuIHNvYXBfcHV0ZWxlbWVudChzb2FwLCBub2RlLT5ub2RlLCBuYW1lLCAwLCBub2RlLT50eXBlKTsKKyAgICByZXR1cm4gc29hcF9lbGVtZW50KHNvYXAsIG5hbWUsIDAsIE5VTEwpOyAvKiBlbGVtZW50KCkgKi8KKyAgfQorICBpZiAobm9kZS0+dHlwZSAmJiBub2RlLT5ub2RlKQorICB7IGNoYXIgKnMgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHByZWZpeCkgKyBzdHJsZW4obmFtZSkgKyAyKTsKKyAgICBpZiAoIXMpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICBzcHJpbnRmKHMsICIlczolcyIsIHByZWZpeCwgbmFtZSk7CisgICAgc29hcF9wdXRlbGVtZW50KHNvYXAsIG5vZGUtPm5vZGUsIHMsIDAsIG5vZGUtPnR5cGUpOworICAgIFNPQVBfRlJFRShzb2FwLCBzKTsKKyAgfQorICBlbHNlCisgIHsgY2hhciAqczsKKyAgICBpZiAoc3RybGVuKHByZWZpeCkgKyBzdHJsZW4obmFtZSkgPCBzaXplb2Yoc29hcC0+bXNnYnVmKSkKKyAgICAgIHMgPSBzb2FwLT5tc2didWY7CisgICAgZWxzZQorICAgIHsgcyA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4ocHJlZml4KSArIHN0cmxlbihuYW1lKSArIDIpOworICAgICAgaWYgKCFzKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICB9CisgICAgc3ByaW50ZihzLCAiJXM6JXMiLCBwcmVmaXgsIG5hbWUpOworICAgIGlmIChzb2FwX2VsZW1lbnQoc29hcCwgcywgMCwgTlVMTCkpIC8qIGVsZW1lbnQoKSAqLworICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmIChuc3RyKQorICAgIHsgc3ByaW50ZihzLCAieG1sbnM6JXMiLCBwcmVmaXgpOworICAgICAgc29hcF9hdHRyaWJ1dGUoc29hcCwgcywgbnN0cik7CisgICAgfQorICAgIGlmIChzICE9IHNvYXAtPm1zZ2J1ZikKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBzKTsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitvdXRfYXR0cmlidXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRhdGEpCit7IGNoYXIgKnM7CisgIGNvbnN0IGNoYXIgKnQ7CisgIGlmICghcHJlZml4KQorICAgIHJldHVybiBzb2FwX2F0dHJpYnV0ZShzb2FwLCBuYW1lLCBkYXRhKTsKKyAgdCA9IHN0cmNocihuYW1lLCAnOicpOworICBpZiAodCkKKyAgICB0Kys7CisgIGVsc2UKKyAgICB0ID0gbmFtZTsKKyAgaWYgKHN0cmxlbihwcmVmaXgpICsgc3RybGVuKHQpIDwgc2l6ZW9mKHNvYXAtPm1zZ2J1ZikpCisgICAgcyA9IHNvYXAtPm1zZ2J1ZjsKKyAgZWxzZQorICB7IHMgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHByZWZpeCkgKyBzdHJsZW4odCkgKyAyKTsKKyAgICBpZiAoIXMpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgfSAKKyAgc3ByaW50ZihzLCAiJXM6JXMiLCBwcmVmaXgsIHQpOworICBzb2FwX2F0dHJpYnV0ZShzb2FwLCBzLCBkYXRhKTsKKyAgaWYgKHMgIT0gc29hcC0+bXNnYnVmKQorICAgIFNPQVBfRlJFRShzb2FwLCBzKTsKKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dF94c2RfX2FueVR5cGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqbm9kZSwgY29uc3QgY2hhciAqdHlwZSkKK3sgaWYgKG5vZGUpCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfaWxpc3QgKnAgPSBOVUxMOworICAgIGNvbnN0IGNoYXIgKnByZWZpeDsJCS8qIG5hbWVzcGFjZSBwcmVmaXgsIGlmIG5hbWVzcGFjZSBpcyBwcmVzZW50ICovCisgICAgc2l6ZV90IGNvbG9uOworICAgIGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0RPTV9BU0lTKSkKKyAgICB7IHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgKmF0dDsKKyAgICAgIGZvciAoYXR0ID0gbm9kZS0+YXR0czsgYXR0OyBhdHQgPSBhdHQtPm5leHQpCisgICAgICB7IGlmIChhdHQtPm5hbWUgJiYgYXR0LT5uc3RyKQorICAgICAgICB7IGlmICgocHJlZml4ID0gc3RyY2hyKGF0dC0+bmFtZSwgJzonKSkpCisgICAgICAgICAgeyBjb2xvbiA9IHByZWZpeCAtIGF0dC0+bmFtZSArIDE7CisgICAgICAgICAgICBpZiAoY29sb24gPiBzaXplb2Yoc29hcC0+dGFnKSkKKyAgICAgICAgICAgICAgY29sb24gPSBzaXplb2Yoc29hcC0+dGFnKTsKKwkgICAgc3RybmNweShzb2FwLT50YWcsIGF0dC0+bmFtZSwgY29sb24gLSAxKTsKKyAgICAgICAgICAgIHNvYXAtPnRhZ1tjb2xvbiAtIDFdID0gJ1wwJzsKKyAgICAgICAgICAgIGlmICghKHNvYXBfZW50ZXJfbnMoc29hcCwgc29hcC0+dGFnLCBhdHQtPm5zdHIpKSkKKyAgICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmIChub2RlLT5uYW1lKQorICAgICAgdGFnID0gbm9kZS0+bmFtZTsKKyAgICBlbHNlIGlmICghdGFnKQorICAgICAgdGFnID0gIi0iOworICAgIGlmICgocHJlZml4ID0gc3RyY2hyKHRhZywgJzonKSkpCisgICAgeyBjb2xvbiA9IHByZWZpeCAtIHRhZyArIDE7CisgICAgICBpZiAoY29sb24gPiBzaXplb2Yoc29hcC0+dGFnKSkKKyAgICAgICAgY29sb24gPSBzaXplb2Yoc29hcC0+dGFnKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgY29sb24gPSAwOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRE9NIG5vZGUgJyVzJ1xuIiwgdGFnKSk7CisgICAgcHJlZml4ID0gTlVMTDsKKyAgICBpZiAobm9kZS0+bnN0ciAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX0RPTV9BU0lTKSkKKyAgICB7IGlmIChjb2xvbikKKyAgICAgIHsgc3RybmNweShzb2FwLT50YWcsIHRhZywgY29sb24gLSAxKTsKKyAgICAgICAgc29hcC0+dGFnW2NvbG9uIC0gMV0gPSAnXDAnOworICAgICAgICBpZiAoIShwID0gc29hcF9lbnRlcl9ucyhzb2FwLCBzb2FwLT50YWcsIG5vZGUtPm5zdHIpKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgICAgcHJlZml4ID0gcC0+aWQ7CisgICAgICAgIGlmIChvdXRfZWxlbWVudChzb2FwLCBub2RlLCBwcmVmaXgsIHRhZyArIGNvbG9uLCBub2RlLT5uc3RyKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IHN0cnVjdCBOYW1lc3BhY2UgKm5zOworICAgICAgICBmb3IgKG5zID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlczsgbnMgJiYgbnMtPmlkOyBucysrKQorICAgICAgICB7IGlmIChucy0+bnMgPT0gbm9kZS0+bnN0ciB8fCAhc3RyY21wKG5zLT5ucywgbm9kZS0+bnN0cikpCisgICAgICAgICAgeyAvKiBpZiAoc29hcC0+ZW5jb2RpbmdTdHlsZSB8fCBucyA9PSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzKSAqLworICAgICAgICAgICAgICBwcmVmaXggPSBucy0+aWQ7CisgICAgICAgICAgICBpZiAob3V0X2VsZW1lbnQoc29hcCwgbm9kZSwgbnMtPmlkLCB0YWcgKyBjb2xvbiwgTlVMTCkpCisgICAgICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKwl9CisgICAgICAgIGlmICghbnMgfHwgIW5zLT5pZCkKKyAgICAgICAgeyBpZiAoKHAgPSBzb2FwX2xvb2t1cF9ucyhzb2FwLCBub2RlLT5uc3RyKSkpCisgICAgICAgICAgeyBwcmVmaXggPSBwLT5pZDsKKyAgICAgICAgICAgIHAgPSBOVUxMOworICAgICAgICAgICAgaWYgKG91dF9lbGVtZW50KHNvYXAsIG5vZGUsIHByZWZpeCwgdGFnICsgY29sb24sIE5VTEwpKQorICAgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgICAgfQorCSAgZWxzZQorICAgICAgICAgIHsgc3ByaW50Zihzb2FwLT50YWcsIFNPQVBfRE9NSURfRk9STUFULCBzb2FwLT5pZG51bSsrKTsKKyAgICAgICAgICAgIGlmICghKHAgPSBzb2FwX2VudGVyX25zKHNvYXAsIHNvYXAtPnRhZywgbm9kZS0+bnN0cikpKQorICAgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgICAgICAgIHByZWZpeCA9IHAtPmlkOworICAgICAgICAgICAgaWYgKG91dF9lbGVtZW50KHNvYXAsIG5vZGUsIHByZWZpeCwgdGFnICsgY29sb24sIG5vZGUtPm5zdHIpKQorICAgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisJICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgY29sb24gPSAwOworICAgICAgaWYgKG91dF9lbGVtZW50KHNvYXAsIG5vZGUsIE5VTEwsIHRhZywgTlVMTCkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgaWYgKCFub2RlLT50eXBlIHx8ICFub2RlLT5ub2RlKQorICAgIHsgc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAqYXR0OworICAgICAgZm9yIChhdHQgPSBub2RlLT5hdHRzOyBhdHQ7IGF0dCA9IGF0dC0+bmV4dCkKKyAgICAgIHsgaWYgKGF0dC0+bmFtZSkKKyAgICAgICAgeyBpZiAoYXR0LT5uc3RyKQorICAgICAgICAgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfaWxpc3QgKnE7CisgICAgICAgICAgICBpZiAoKGF0dC0+bnN0ciA9PSBub2RlLT5uc3RyIHx8IChub2RlLT5uc3RyICYmICFzdHJjbXAoYXR0LT5uc3RyLCBub2RlLT5uc3RyKSkpICYmIHByZWZpeCkKKwkgICAgeyBpZiAob3V0X2F0dHJpYnV0ZShzb2FwLCBwcmVmaXgsIGF0dC0+bmFtZSwgYXR0LT5kYXRhKSkKKwkgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKwkgICAgfQorCSAgICBlbHNlIGlmICgocSA9IHNvYXBfbG9va3VwX25zKHNvYXAsIGF0dC0+bnN0cikpKQorCSAgICB7IGlmIChvdXRfYXR0cmlidXRlKHNvYXAsIHEtPmlkLCBhdHQtPm5hbWUsIGF0dC0+ZGF0YSkpCisJICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisJICAgIH0KKwkgICAgZWxzZQorICAgICAgICAgICAgeyBzdHJ1Y3QgTmFtZXNwYWNlICpuczsKKwkgICAgICBmb3IgKG5zID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlczsgbnMgJiYgbnMtPmlkOyBucysrKQorICAgICAgICAgICAgICB7IGlmIChucy0+bnMgPT0gYXR0LT5uc3RyIHx8ICFzdHJjbXAobnMtPm5zLCBhdHQtPm5zdHIpKQorCSAgICAgICAgeyBpZiAob3V0X2F0dHJpYnV0ZShzb2FwLCBucy0+aWQsIGF0dC0+bmFtZSwgYXR0LT5kYXRhKSkKKwkgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisJICAgICAgICAgIGJyZWFrOworCSAgICAgICAgfQorCSAgICAgIH0KKwkgICAgICBpZiAoIW5zIHx8ICFucy0+aWQpCisgICAgICAgICAgICAgIHsgc3ByaW50Zihzb2FwLT5tc2didWYsICJ4bWxuczoiU09BUF9ET01JRF9GT1JNQVQsIHNvYXAtPmlkbnVtKyspOworCSAgICAgICAgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsIHNvYXAtPm1zZ2J1ZiwgYXR0LT5uc3RyKSkKKwkgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworCSAgICAgICAgc3RyY2F0KHNvYXAtPm1zZ2J1ZiwgIjoiKTsKKwkgICAgICAgIHN0cmNhdChzb2FwLT5tc2didWYsIGF0dC0+bmFtZSk7CisJICAgICAgICBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgc29hcC0+bXNnYnVmICsgNiwgYXR0LT5kYXRhKSkKKwkgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCSAgZWxzZSBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgYXR0LT5uYW1lLCBhdHQtPmRhdGEpKQorICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoc29hcF9lbGVtZW50X3N0YXJ0X2VuZF9vdXQoc29hcCwgTlVMTCkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICplbHQ7CisgICAgICBpZiAobm9kZS0+ZGF0YSkKKyAgICAgIHsgaWYgKHNvYXBfc3RyaW5nX291dChzb2FwLCBub2RlLT5kYXRhLCAwKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB9CisgICAgICBlbHNlIGlmIChub2RlLT53aWRlKQorICAgICAgeyBpZiAoc29hcF93c3RyaW5nX291dChzb2FwLCBub2RlLT53aWRlLCAwKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB9CisgICAgICBmb3IgKGVsdCA9IG5vZGUtPmVsdHM7IGVsdDsgZWx0ID0gZWx0LT5uZXh0KQorICAgICAgeyBpZiAoc29hcF9vdXRfeHNkX19hbnlUeXBlKHNvYXAsIHRhZywgMCwgZWx0LCBOVUxMKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB9CisgICAgICBpZiAobm9kZS0+dGFpbCAmJiBzb2FwX3NlbmQoc29hcCwgbm9kZS0+dGFpbCkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIGlmICghcHJlZml4KQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBvZiBET00gbm9kZSAnJXMnXG4iLCB0YWcgKyBjb2xvbikpOworICAgICAgICBpZiAoc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnICsgY29sb24pKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgY2hhciAqczsKKyAgICAgICAgaWYgKHN0cmxlbihwcmVmaXgpICsgc3RybGVuKHRhZyArIGNvbG9uKSA8IHNpemVvZihzb2FwLT5tc2didWYpKQorCSAgcyA9IHNvYXAtPm1zZ2J1ZjsKKwllbHNlCisJeyBzID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihwcmVmaXgpICsgc3RybGVuKHRhZyArIGNvbG9uKSArIDIpOworICAgICAgICAgIGlmICghcykKKyAgICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworCX0KKwlzcHJpbnRmKHMsICIlczolcyIsIHByZWZpeCwgdGFnICsgY29sb24pOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBvZiBET00gbm9kZSAnJXMnXG4iLCBzKSk7CisgICAgICAgIGlmIChzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCBzKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIGlmIChzICE9IHNvYXAtPm1zZ2J1ZikKKwkgIFNPQVBfRlJFRShzb2FwLCBzKTsKKyAgICAgIH0KKyAgICAgIGlmIChwKQorICAgICAgICBwLT5sZXZlbCA9IDA7IC8qIHhtbG5zIGJpbmRpbmcgaXMgb3V0IG9mIHNjb3BlICovCisgICAgfQorICB9CisgIHJldHVybiBTT0FQX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQorc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKgorU09BUF9GTUFDMgorc29hcF9pbl94c2RfX2FueVR5cGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKm5vZGUsIGNvbnN0IGNoYXIgKnR5cGUpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqdHA7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgKiphdHQ7CisgIGlmIChzb2FwX3BlZWtfZWxlbWVudChzb2FwKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKCFub2RlKQorICB7IGlmICghKG5vZGUgPSAoc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCkpKSkKKyAgICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIH0KKyAgc29hcF9kZWZhdWx0X3hzZF9fYW55VHlwZShzb2FwLCBub2RlKTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJET00gbm9kZSAlc1xuIiwgc29hcC0+dGFnKSk7CisgIG5vZGUtPm5zdHIgPSBzb2FwX2N1cnJlbnRfbmFtZXNwYWNlKHNvYXAsIHNvYXAtPnRhZyk7CisgIG5vZGUtPm5hbWUgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT50YWcpOworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0RPTV9OT0RFKSB8fCAoIShzb2FwLT5tb2RlICYgU09BUF9ET01fVFJFRSkgJiYgKnNvYXAtPmlkKSkKKyAgeyBpZiAoKG5vZGUtPm5vZGUgPSBzb2FwX2dldGVsZW1lbnQoc29hcCwgJm5vZGUtPnR5cGUpKSkKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRE9NIG5vZGUgY29udGFpbnMgdHlwZSAlZCBmcm9tIHhzaTp0eXBlXG4iLCBub2RlLT50eXBlKSk7CisgICAgICByZXR1cm4gbm9kZTsKKyAgICB9CisgICAgaWYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICAgIGVsc2UKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGF0dCA9ICZub2RlLT5hdHRzOworICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgIHsgaWYgKHRwLT52aXNpYmxlKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJET00gbm9kZSBhdHRyaWJ1dGU9JyVzJ1xuIiwgdHAtPm5hbWUpKTsKKyAgICAgICphdHQgPSAoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUpKTsKKyAgICAgIGlmICghKmF0dCkKKyAgICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICAoKmF0dCktPm5leHQgPSBOVUxMOworICAgICAgKCphdHQpLT5uc3RyID0gc29hcF9jdXJyZW50X25hbWVzcGFjZShzb2FwLCB0cC0+bmFtZSk7CisgICAgICAoKmF0dCktPm5hbWUgPSBzb2FwX3N0cmR1cChzb2FwLCB0cC0+bmFtZSk7CisgICAgICBpZiAodHAtPnZpc2libGUgPT0gMikKKyAgICAgICAgKCphdHQpLT5kYXRhID0gc29hcF9zdHJkdXAoc29hcCwgdHAtPnZhbHVlKTsKKyAgICAgIGVsc2UKKyAgICAgICAgKCphdHQpLT5kYXRhID0gTlVMTDsKKyAgICAgICgqYXR0KS0+d2lkZSA9IE5VTEw7CisgICAgICAoKmF0dCktPnNvYXAgPSBzb2FwOworICAgICAgYXR0ID0gJigqYXR0KS0+bmV4dDsKKyAgICAgIHRwLT52aXNpYmxlID0gMDsKKyAgICB9CisgIH0KKyAgc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIE5VTEwsIDEpOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRPTSBub2RlICclcycgYWNjZXB0ZWRcbiIsIG5vZGUtPm5hbWUpKTsKKyAgaWYgKHNvYXAtPmJvZHkpCisgIHsgaWYgKCFzb2FwX3BlZWtfZWxlbWVudChzb2FwKSkKKyAgICB7IHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICoqZWx0OworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJET00gbm9kZSAnJXMnIGhhcyBzdWJlbGVtZW50c1xuIiwgbm9kZS0+bmFtZSkpOworICAgICAgZWx0ID0gJm5vZGUtPmVsdHM7CisgICAgICBmb3IgKDs7KQorICAgICAgeyBpZiAoISgqZWx0ID0gc29hcF9pbl94c2RfX2FueVR5cGUoc29hcCwgTlVMTCwgTlVMTCwgTlVMTCkpKQorICAgICAgICB7IGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykKKyAgICAgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCSgqZWx0KS0+cHJudCA9IG5vZGU7CisgICAgICAgIGVsdCA9ICYoKmVsdCktPm5leHQ7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHNvYXAtPmVycm9yID09IFNPQVBfTk9fVEFHKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJET00gbm9kZSAnJXMnIGhhcyBjZGF0YVxuIiwgbm9kZS0+bmFtZSkpOworICAgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9DX1VURlNUUklORykgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX0NfTUJTVFJJTkcpKQorICAgICAgeyBpZiAoIShub2RlLT5kYXRhID0gc29hcF9zdHJpbmdfaW4oc29hcCwgMSwgLTEsIC0xKSkpCisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICBlbHNlIGlmICghKG5vZGUtPndpZGUgPSBzb2FwX3dzdHJpbmdfaW4oc29hcCwgMSwgLTEsIC0xKSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCBub2RlLT5uYW1lKSkKKyAgICAgIHJldHVybiBOVUxMOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIG9mIERPTSBub2RlICclcydcbiIsIG5vZGUtPm5hbWUpKTsKKyAgfQorICByZXR1cm4gbm9kZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglET00gdHJhdmVyc2luZworICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICoKK1NPQVBfRk1BQzIKK3NvYXBfZG9tX25leHRfZWxlbWVudChzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqZWx0KQoreyBpZiAoZWx0LT5lbHRzKQorICAgIHJldHVybiBlbHQtPmVsdHM7CisgIGlmIChlbHQtPm5leHQpCisgICAgcmV0dXJuIGVsdC0+bmV4dDsKKyAgZG8gZWx0ID0gZWx0LT5wcm50OworICB3aGlsZSAoZWx0ICYmICFlbHQtPm5leHQpOworICBpZiAoZWx0KQorICAgIGVsdCA9IGVsdC0+bmV4dDsKKyAgcmV0dXJuIGVsdDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgKnNvYXBfZG9tX25leHRfYXR0cmlidXRlKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgKmF0dCkKK3sgcmV0dXJuIGF0dC0+bmV4dDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglOYW1lc3BhY2UgcHJlZml4IGxvb2t1cC9zdG9yZQorICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3Qgc29hcF9pbGlzdCAqCitzb2FwX2xvb2t1cF9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbnN0cikKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworICBmb3IgKGlwID0gc29hcC0+aWh0W3NvYXBfaGFzaChuc3RyKV07IGlwOyBpcCA9IGlwLT5uZXh0KQorICAgIGlmICghc3RyY21wKChjaGFyKilpcC0+cHRyLCBuc3RyKSAmJiBpcC0+bGV2ZWwpCisgICAgICByZXR1cm4gaXA7CisgIHJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHN0cnVjdCBzb2FwX2lsaXN0ICoKK3NvYXBfZW50ZXJfbnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqbnN0cikKK3sgaW50IGg7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgZm9yIChpcCA9IHNvYXAtPmlodFtzb2FwX2hhc2gobnN0cildOyBpcDsgaXAgPSBpcC0+bmV4dCkKKyAgeyBpZiAoIXN0cmNtcCgoY2hhciopaXAtPnB0ciwgbnN0cikgJiYgIWlwLT5sZXZlbCkKKyAgICB7IHN0cmNweShpcC0+aWQsIHByZWZpeCk7CisgICAgICBpcC0+bGV2ZWwgPSAxOworICAgICAgcmV0dXJuIGlwOworICAgIH0KKyAgfQorICBpcCA9IChzdHJ1Y3Qgc29hcF9pbGlzdCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2lsaXN0KSArIHN0cmxlbihuc3RyKSArIFNPQVBfVEFHTEVOKTsKKyAgaWYgKGlwKQorICB7IGggPSBzb2FwX2hhc2gobnN0cik7CisgICAgc3RyY3B5KGlwLT5pZCwgcHJlZml4KTsKKyAgICBpcC0+cHRyID0gaXAtPmlkICsgU09BUF9UQUdMRU47CisgICAgc3RyY3B5KChjaGFyKilpcC0+cHRyLCBuc3RyKTsKKyAgICBpcC0+bmV4dCA9IHNvYXAtPmlodFtoXTsKKyAgICBzb2FwLT5paHRbaF0gPSBpcDsKKyAgICBpcC0+Zmxpc3QgPSBOVUxMOworICAgIGlwLT5jb3B5ID0gTlVMTDsKKyAgICBpcC0+bGV2ZWwgPSAxOworICAgIHJldHVybiBpcDsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworI2lmZGVmIF9fY3BsdXNwbHVzCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJc29hcF9kb21fZWxlbWVudCBjbGFzcworICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3NvYXBfZG9tX2VsZW1lbnQ6OnNvYXBfZG9tX2VsZW1lbnQoKQoreyBzb2FwX2RlZmF1bHRfeHNkX19hbnlUeXBlKE5VTEwsIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc29hcF9kb21fZWxlbWVudDo6c29hcF9kb21fZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcF9kZWZhdWx0X3hzZF9fYW55VHlwZShzb2FwLCB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2VsZW1lbnQ6OnNvYXBfZG9tX2VsZW1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5zdHIsIGNvbnN0IGNoYXIgKm5hbWUpCit7IHNvYXBfZGVmYXVsdF94c2RfX2FueVR5cGUoc29hcCwgdGhpcyk7CisgIHRoaXMtPm5zdHIgPSBzb2FwX3N0cmR1cChzb2FwLCBuc3RyKTsKKyAgdGhpcy0+bmFtZSA9IHNvYXBfc3RyZHVwKHNvYXAsIG5hbWUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc29hcF9kb21fZWxlbWVudDo6c29hcF9kb21fZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbnN0ciwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZGF0YSkKK3sgc29hcF9kZWZhdWx0X3hzZF9fYW55VHlwZShzb2FwLCB0aGlzKTsKKyAgdGhpcy0+bnN0ciA9IHNvYXBfc3RyZHVwKHNvYXAsIG5zdHIpOworICB0aGlzLT5uYW1lID0gc29hcF9zdHJkdXAoc29hcCwgbmFtZSk7CisgIHRoaXMtPmRhdGEgPSBzb2FwX3N0cmR1cChzb2FwLCBkYXRhKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2VsZW1lbnQ6OnNvYXBfZG9tX2VsZW1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5zdHIsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKm5vZGUsIGludCB0eXBlKQoreyBzb2FwX2RlZmF1bHRfeHNkX19hbnlUeXBlKHNvYXAsIHRoaXMpOworICB0aGlzLT5uc3RyID0gc29hcF9zdHJkdXAoc29hcCwgbnN0cik7CisgIHRoaXMtPm5hbWUgPSBzb2FwX3N0cmR1cChzb2FwLCBuYW1lKTsKKyAgdGhpcy0+bm9kZSA9IG5vZGU7CisgIHRoaXMtPnR5cGUgPSB0eXBlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc29hcF9kb21fZWxlbWVudDo6fnNvYXBfZG9tX2VsZW1lbnQoKQoreyB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzb2FwX2RvbV9lbGVtZW50ICZzb2FwX2RvbV9lbGVtZW50OjpzZXQoY29uc3QgY2hhciAqbnN0ciwgY29uc3QgY2hhciAqbmFtZSkKK3sgdGhpcy0+bnN0ciA9IHNvYXBfc3RyZHVwKHNvYXAsIG5zdHIpOworICB0aGlzLT5uYW1lID0gc29hcF9zdHJkdXAoc29hcCwgbmFtZSk7CisgIHJldHVybiAqdGhpczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2VsZW1lbnQgJnNvYXBfZG9tX2VsZW1lbnQ6OnNldChjb25zdCBjaGFyICpkYXRhKQoreyB0aGlzLT5kYXRhID0gc29hcF9zdHJkdXAoc29hcCwgZGF0YSk7CisgIHJldHVybiAqdGhpczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2VsZW1lbnQgJnNvYXBfZG9tX2VsZW1lbnQ6OnNldCh2b2lkICpub2RlLCBpbnQgdHlwZSkKK3sgdGhpcy0+bm9kZSA9IG5vZGU7CisgIHRoaXMtPnR5cGUgPSB0eXBlOworICByZXR1cm4gKnRoaXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzb2FwX2RvbV9lbGVtZW50ICZzb2FwX2RvbV9lbGVtZW50OjphZGQoc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKmVsdCkKK3sgZWx0LT5wcm50ID0gdGhpczsKKyAgZm9yIChzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqZSA9IGVsdHM7IGU7IGUgPSBlLT5uZXh0KQorICB7IGlmICghZS0+bmV4dCkKKyAgICB7IGUtPm5leHQgPSBlbHQ7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICB9CisgIGVsdHMgPSBlbHQ7CisgIHJldHVybiAqdGhpczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2VsZW1lbnQgJnNvYXBfZG9tX2VsZW1lbnQ6OmFkZChzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAmZWx0KQoreyByZXR1cm4gYWRkKCZlbHQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc29hcF9kb21fZWxlbWVudCAmc29hcF9kb21fZWxlbWVudDo6YWRkKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgKmF0dCkKK3sgZm9yIChzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICphID0gYXR0czsgYTsgYSA9IGEtPm5leHQpCisgIHsgaWYgKCFhLT5uZXh0KQorICAgIHsgYS0+bmV4dCA9IGF0dDsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgIH0KKyAgYXR0cyA9IGF0dDsKKyAgcmV0dXJuICp0aGlzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc29hcF9kb21fZWxlbWVudCAmc29hcF9kb21fZWxlbWVudDo6YWRkKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgJmF0dCkKK3sgcmV0dXJuIGFkZCgmYXR0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3Igc29hcF9kb21fZWxlbWVudDo6YmVnaW4oKQoreyBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yIGl0ZXIodGhpcyk7CisgIHJldHVybiBpdGVyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc29hcF9kb21fZWxlbWVudF9pdGVyYXRvciBzb2FwX2RvbV9lbGVtZW50OjplbmQoKQoreyBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yIGl0ZXIoTlVMTCk7CisgIHJldHVybiBpdGVyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc29hcF9kb21fZWxlbWVudF9pdGVyYXRvciBzb2FwX2RvbV9lbGVtZW50OjpmaW5kKGNvbnN0IGNoYXIgKm5zdHIsIGNvbnN0IGNoYXIgKm5hbWUpCit7IHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IgaXRlcih0aGlzKTsKKyAgaXRlci5uc3RyID0gbnN0cjsKKyAgaXRlci5uYW1lID0gbmFtZTsKKyAgaWYgKG5hbWUgJiYgc29hcF90YWdfY21wKHRoaXMtPm5hbWUsIG5hbWUpKQorICAgIHJldHVybiArK2l0ZXI7CisgIGlmIChuc3RyICYmIHRoaXMtPm5zdHIgJiYgc29hcF90YWdfY21wKHRoaXMtPm5zdHIsIG5zdHIpKQorICAgIHJldHVybiArK2l0ZXI7CisgIHJldHVybiBpdGVyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc29hcF9kb21fZWxlbWVudF9pdGVyYXRvciBzb2FwX2RvbV9lbGVtZW50OjpmaW5kKGludCB0eXBlKQoreyBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yIGl0ZXIodGhpcyk7CisgIGl0ZXIudHlwZSA9IHR5cGU7CisgIGlmICh0aGlzLT50eXBlICE9IHR5cGUpCisgICAgcmV0dXJuICsraXRlcjsKKyAgcmV0dXJuIGl0ZXI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHNvYXBfZG9tX2VsZW1lbnQ6OnVubGluaygpCit7IHNvYXBfdW5saW5rKHNvYXAsIHRoaXMpOworICBzb2FwX3VubGluayhzb2FwLCBuc3RyKTsKKyAgc29hcF91bmxpbmsoc29hcCwgbmFtZSk7CisgIHNvYXBfdW5saW5rKHNvYXAsIGRhdGEpOworICBzb2FwX3VubGluayhzb2FwLCB3aWRlKTsKKyAgaWYgKGVsdHMpCisgICAgZWx0cy0+dW5saW5rKCk7CisgIGlmIChhdHRzKQorICAgIGVsdHMtPnVubGluaygpOworICBpZiAobmV4dCkKKyAgICBuZXh0LT51bmxpbmsoKTsKKyAgbm9kZSA9IE5VTEw7CisgIHR5cGUgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqCXNvYXBfZG9tX2F0dHJpYnV0ZSBjbGFzcworICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3NvYXBfZG9tX2F0dHJpYnV0ZTo6c29hcF9kb21fYXR0cmlidXRlKCkKK3sgdGhpcy0+c29hcCA9IE5VTEw7CisgIHRoaXMtPm5leHQgPSBOVUxMOworICB0aGlzLT5uc3RyID0gTlVMTDsKKyAgdGhpcy0+bmFtZSA9IE5VTEw7CisgIHRoaXMtPmRhdGEgPSBOVUxMOworICB0aGlzLT53aWRlID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2F0dHJpYnV0ZTo6c29hcF9kb21fYXR0cmlidXRlKHN0cnVjdCBzb2FwICpzb2FwKQoreyB0aGlzLT5zb2FwID0gc29hcDsKKyAgdGhpcy0+bmV4dCA9IE5VTEw7CisgIHRoaXMtPm5zdHIgPSBOVUxMOworICB0aGlzLT5uYW1lID0gTlVMTDsKKyAgdGhpcy0+ZGF0YSA9IE5VTEw7CisgIHRoaXMtPndpZGUgPSBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc29hcF9kb21fYXR0cmlidXRlOjpzb2FwX2RvbV9hdHRyaWJ1dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5zdHIsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRhdGEpCit7IHRoaXMtPnNvYXAgPSBzb2FwOworICB0aGlzLT5uZXh0ID0gTlVMTDsKKyAgdGhpcy0+bnN0ciA9IHNvYXBfc3RyZHVwKHNvYXAsIG5zdHIpOworICB0aGlzLT5uYW1lID0gc29hcF9zdHJkdXAoc29hcCwgbmFtZSk7CisgIHRoaXMtPmRhdGEgPSBzb2FwX3N0cmR1cChzb2FwLCBkYXRhKTsKKyAgdGhpcy0+d2lkZSA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzb2FwX2RvbV9hdHRyaWJ1dGU6On5zb2FwX2RvbV9hdHRyaWJ1dGUoKQoreyB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3Igc29hcF9kb21fYXR0cmlidXRlOjpiZWdpbigpCit7IHNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvciBpdGVyKHRoaXMpOworICByZXR1cm4gaXRlcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvciBzb2FwX2RvbV9hdHRyaWJ1dGU6OmVuZCgpCit7IHNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvciBpdGVyKE5VTEwpOworICByZXR1cm4gaXRlcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvciBzb2FwX2RvbV9hdHRyaWJ1dGU6OmZpbmQoY29uc3QgY2hhciAqbnN0ciwgY29uc3QgY2hhciAqbmFtZSkKK3sgc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yIGl0ZXIodGhpcyk7CisgIGl0ZXIubnN0ciA9IG5zdHI7CisgIGl0ZXIubmFtZSA9IG5hbWU7CisgIGlmIChuYW1lICYmIHNvYXBfdGFnX2NtcCh0aGlzLT5uYW1lLCBuYW1lKSkKKyAgICByZXR1cm4gKytpdGVyOworICBpZiAobnN0ciAmJiB0aGlzLT5uc3RyICYmIHNvYXBfdGFnX2NtcCh0aGlzLT5uc3RyLCBuc3RyKSkKKyAgICByZXR1cm4gKytpdGVyOworICByZXR1cm4gaXRlcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgc29hcF9kb21fYXR0cmlidXRlOjp1bmxpbmsoKQoreyBzb2FwX3VubGluayhzb2FwLCB0aGlzKTsKKyAgc29hcF91bmxpbmsoc29hcCwgbnN0cik7CisgIHNvYXBfdW5saW5rKHNvYXAsIG5hbWUpOworICBzb2FwX3VubGluayhzb2FwLCBkYXRhKTsKKyAgc29hcF91bmxpbmsoc29hcCwgd2lkZSk7CisgIGlmIChuZXh0KQorICAgIG5leHQtPnVubGluaygpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqCXNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IgY2xhc3MKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yOjpzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yKCkKK3sgZWx0ID0gTlVMTDsKKyAgbnN0ciA9IE5VTEw7CisgIG5hbWUgPSBOVUxMOworICB0eXBlID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3I6OnNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3Ioc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKmVsdCkKK3sgdGhpcy0+ZWx0ID0gZWx0OworICBuc3RyID0gTlVMTDsKKyAgbmFtZSA9IE5VTEw7CisgIHR5cGUgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc29hcF9kb21fZWxlbWVudF9pdGVyYXRvcjo6fnNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IoKQoreyB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitib29sIHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3I6Om9wZXJhdG9yPT0oY29uc3Qgc29hcF9kb21fZWxlbWVudF9pdGVyYXRvciAmaXRlcikgY29uc3QKK3sgcmV0dXJuIHRoaXMtPmVsdCA9PSBpdGVyLmVsdDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2Jvb2wgc29hcF9kb21fZWxlbWVudF9pdGVyYXRvcjo6b3BlcmF0b3IhPShjb25zdCBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yICZpdGVyKSBjb25zdAoreyByZXR1cm4gdGhpcy0+ZWx0ICE9IGl0ZXIuZWx0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgJnNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3I6Om9wZXJhdG9yKigpIGNvbnN0Cit7IHJldHVybiAqdGhpcy0+ZWx0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc29hcF9kb21fZWxlbWVudF9pdGVyYXRvciAmc29hcF9kb21fZWxlbWVudF9pdGVyYXRvcjo6b3BlcmF0b3IrKygpCit7IHdoaWxlIChlbHQpCisgIHsgZWx0ID0gc29hcF9kb21fbmV4dF9lbGVtZW50KGVsdCk7CisgICAgaWYgKCFlbHQpCisgICAgICBicmVhazsKKyAgICBpZiAobmFtZSAmJiBlbHQtPm5hbWUpCisgICAgeyBpZiAoIXNvYXBfdGFnX2NtcChlbHQtPm5hbWUsIG5hbWUpKQorICAgICAgeyBpZiAobnN0ciAmJiBlbHQtPm5zdHIpCisgICAgICAgIHsgaWYgKCFzb2FwX3RhZ19jbXAoZWx0LT5uc3RyLCBuc3RyKSkKKwkgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh0eXBlKQorICAgIHsgaWYgKGVsdC0+dHlwZSA9PSB0eXBlKQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgZWxzZQorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuICp0aGlzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqCXNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvciBjbGFzcworICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3NvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjo6c29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yKCkKK3sgYXR0ID0gTlVMTDsKKyAgbnN0ciA9IE5VTEw7CisgIG5hbWUgPSBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yOjpzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3Ioc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAqYXR0KQoreyB0aGlzLT5hdHQgPSBhdHQ7CisgIG5zdHIgPSBOVUxMOworICBuYW1lID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjo6fnNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcigpCit7IH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2Jvb2wgc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yOjpvcGVyYXRvcj09KGNvbnN0IHNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvciAmaXRlcikgY29uc3QKK3sgcmV0dXJuIHRoaXMtPmF0dCA9PSBpdGVyLmF0dDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2Jvb2wgc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yOjpvcGVyYXRvciE9KGNvbnN0IHNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvciAmaXRlcikgY29uc3QKK3sgcmV0dXJuIHRoaXMtPmF0dCAhPSBpdGVyLmF0dDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgJnNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjo6b3BlcmF0b3IqKCkgY29uc3QKK3sgcmV0dXJuICp0aGlzLT5hdHQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IgJnNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjo6b3BlcmF0b3IrKygpCit7IHdoaWxlIChhdHQpCisgIHsgYXR0ID0gc29hcF9kb21fbmV4dF9hdHRyaWJ1dGUoYXR0KTsKKyAgICBpZiAoIWF0dCkKKyAgICAgIGJyZWFrOworICAgIGlmIChuYW1lICYmIGF0dC0+bmFtZSkKKyAgICB7IGlmICghc29hcF90YWdfY21wKGF0dC0+bmFtZSwgbmFtZSkpCisgICAgICB7IGlmIChuc3RyICYmIGF0dC0+bnN0cikKKyAgICAgICAgeyBpZiAoIXNvYXBfdGFnX2NtcChhdHQtPm5zdHIsIG5zdHIpKQorCSAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiAqdGhpczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglJL08KKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFVOREVSX0NFCisKK3N0ZDo6b3N0cmVhbSAmb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0gJm8sIGNvbnN0IHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICZlKQoreyBpZiAoIWUuc29hcCkKKyAgeyBzdHJ1Y3Qgc29hcCBzb2FwOworICAgIHNvYXBfaW5pdDIoJnNvYXAsIFNPQVBfSU9fREVGQVVMVCwgU09BUF9YTUxfR1JBUEgpOworICAgIHNvYXBfc2VyaWFsaXplX3hzZF9fYW55VHlwZSgmc29hcCwgJmUpOworICAgIHNvYXBfYmVnaW5fc2VuZCgmc29hcCk7CisgICAgc29hcF9vdXRfeHNkX19hbnlUeXBlKCZzb2FwLCBOVUxMLCAwLCAmZSwgTlVMTCk7CisgICAgc29hcF9lbmRfc2VuZCgmc29hcCk7CisgICAgc29hcF9lbmQoJnNvYXApOworICAgIHNvYXBfZG9uZSgmc29hcCk7CisgIH0KKyAgZWxzZQorICB7IHN0ZDo6b3N0cmVhbSAqb3MgPSBlLnNvYXAtPm9zOworICAgIGUuc29hcC0+b3MgPSAmbzsKKyAgICBzaG9ydCBvbW9kZSA9IGUuc29hcC0+b21vZGU7CisgICAgc29hcF9zZXRfb21vZGUoZS5zb2FwLCBTT0FQX1hNTF9HUkFQSCk7CisgICAgc29hcF9zZXJpYWxpemVfeHNkX19hbnlUeXBlKGUuc29hcCwgJmUpOworICAgIHNvYXBfYmVnaW5fc2VuZChlLnNvYXApOworICAgIHNvYXBfb3V0X3hzZF9fYW55VHlwZShlLnNvYXAsIE5VTEwsIDAsICZlLCBOVUxMKTsKKyAgICBzb2FwX2VuZF9zZW5kKGUuc29hcCk7CisgICAgZS5zb2FwLT5vcyA9IG9zOworICAgIGUuc29hcC0+b21vZGUgPSBvbW9kZTsKKyAgfQorICByZXR1cm4gbzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0ZDo6aXN0cmVhbSAmb3BlcmF0b3I+PihzdGQ6OmlzdHJlYW0gJmksIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICZlKQoreyBpZiAoIWUuc29hcCkKKyAgICBlLnNvYXAgPSBzb2FwX25ldygpOworICBzdGQ6OmlzdHJlYW0gKmlzID0gZS5zb2FwLT5pczsKKyAgZS5zb2FwLT5pcyA9ICZpOworICBpZiAoc29hcF9iZWdpbl9yZWN2KGUuc29hcCkKKyAgIHx8ICFzb2FwX2luX3hzZF9fYW55VHlwZShlLnNvYXAsIE5VTEwsICZlLCBOVUxMKQorICAgfHwgc29hcF9lbmRfcmVjdihlLnNvYXApKQorICAgIDsgLyogaGFuZGxlIGVycm9yPyBOb3RlOiBlLnNvYXAtPmVycm9yIGlzIHNldCBhbmQgYXBwIHNob3VsZCBjaGVjayAqLworICBlLnNvYXAtPmlzID0gaXM7CisgIHJldHVybiBpOworfQorCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9leHRyYXMvUkVBRE1FLnR4dCBiL2V4dHJhcy9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNjJiZTgKLS0tIC9kZXYvbnVsbAorKysgYi9leHRyYXMvUkVBRE1FLnR4dApAQCAtMCwwICsxLDE2IEBACisKK1RoZSAnZXh0cmFzJyBkaXJlY3RvcnkgY29udGFpbnMgY29udHJpYnV0aW9ucyBhbmQgb3RoZXIgdXNlZnVsIGFkZGl0aW9ucy4KKworQWxsIGNvbnRyaWJ1dGlvbnMgYXJlIGNvdmVyZWQgYnkgdGhlIGdTT0FQIHB1YmxpYyBsaWNlbnNlLCB1bmxlc3Mgc3BlY2lmaWNhbGx5CitzdGF0ZWQgb3RoZXJ3aXNlIGluIHRoZSBzb3VyY2UuIFRoZSBmb2xsb3dpbmcgYXV0aG9ycyBwcm92aWRlZCB0aGUKK2NvbnRyaWJ1dGlvbnMgaW5jbHVkZWQgaW4gdGhpcyBkaXJlY3Rvcnk6CisKK2NrZGIuaCBja2RiLmMJCQlTaW1wbGUgQ29va2llIGRhdGFiYXNlIG1hbmFnZXIgKHN0b3JlL2xvYWQpCitja2RidGVzdC5oIGNrZGJ0ZXN0LmMJCVRlc3QgY29kZSBmb3IgU2ltcGxlIENvb2tpZSBkYXRhYmFzZSBtYW5hZ2VyCitmYXVsdC5jcHAJCQlQcmludCBTT0FQIEZhdWx0IG1lc3NhZ2VzIHRvIEMrKyBzdHJlYW1zCitsb2dnaW5nLmNwcAkJCUxvZyBzZW5kLCByZWNlaXZlLCBhbmQgdHJhY2UgbWVzc2FnZXMgb24gc3RyZWFtcworCitmYXVsdC5jcHAgY29udHJpYnV0ZWQgYnkgQS4gS2VsbHkKK2xvZ2dpbmcuY3BwIGNvbnRyaWJ1dGVkIGJ5IE0uIEhlbG1pY2sKKworVGhlIHNvYXBkZWZzLmggZmlsZSBjb250YWlucyBzdXBwb3J0aW5nIGRlY2xhcmF0aW9ucyAoc2VlIG5vdGVzIGluIHRoZSBzb3VyY2VzKS4KZGlmZiAtLWdpdCBhL2V4dHJhcy9ja2RiLmMgYi9leHRyYXMvY2tkYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZWEyNDIKLS0tIC9kZXYvbnVsbAorKysgYi9leHRyYXMvY2tkYi5jCkBAIC0wLDAgKzEsODcgQEAKKy8qCWNrZGIuYworCisJSFRUUCBjb29raWUgZGF0YWJhc2UgbWFuYWdlci4KKworVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZ1NPQVAgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcGxpY2Vuc2UuaHRtbAorU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKK1dJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQorZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFJvYmVydCBBLiB2YW4gRW5nZWxlbi4KK0NvcHlyaWdodCAoQykgMjAwMC0yMDAyIFJvYmVydCBBLiB2YW4gRW5nZWxlbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworMS4gQ29tcGlsZSBja2RiLmg6CisgICBzb2FwY3BwMiAtY3Bja2RiIGNrZGIuaAorMi4gQ29tcGlsZSBja2RiLmM6CisgICBnY2MgLURXSVRIX0NPT0tJRVMgLURXSVRIX05PR0xPQkFMIC1jIGNrZGIuYworMy4gQ29tcGlsZSBhbmQgbGluayB3aXRoIG1haW4gcHJvZ3JhbSwgZS5nLiBja2RidGVzdC5jOgorICAgc29hcGNwcDIgLWMgY2tkYnRlc3QuaAorICAgZ2NjIC1EV0lUSF9DT09LSUVTIGNrZGJ0ZXN0LmMgY2tkYi5vIHN0ZHNvYXAyLmMgc29hcEMuYyBzb2FwQ2xpZW50LmMKKworKi8KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSAic3Rkc29hcDIuaCIKKyN1bmRlZiBTT0FQX0ZNQUMxCisjZGVmaW5lIFNPQVBfRk1BQzEgc3RhdGljCisjaW5jbHVkZSAiY2tkYkMuYyIKKworaW50IHNvYXBfc2F2ZV9jb29raWVzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpwYXRobmFtZSkKK3sgaW50IHNvY2tldCA9IHNvYXAtPnNvY2tldDsKKyAgaW50IHNlbmRmZCA9IHNvYXAtPnNlbmRmZDsKKyAgc29hcF9iZWdpbihzb2FwKTsKKyAgc29hcC0+c29ja2V0ID0gLTE7CS8qIG1ha2Ugc3VyZSBwbGFpbiBJL08gaXMgdXNlZCAqLworICBzb2FwLT5zZW5kZmQgPSBvcGVuKHBhdGhuYW1lLCBPX0NSRUFUfE9fVFJVTkN8T19XUk9OTFksIFNfSVJFQUR8U19JV1JJVEUpOworICBpZiAoc29hcC0+c2VuZGZkID49IDApCisgIHsgc29hcF9zZXJpYWxpemVfY29va2llKHNvYXAsIChzdHJ1Y3QgY29va2llKilzb2FwLT5jb29raWVzKTsKKyAgICBzb2FwX2JlZ2luX3NlbmQoc29hcCk7CisgICAgc29hcF9wdXRfY29va2llKHNvYXAsIChzdHJ1Y3QgY29va2llKilzb2FwLT5jb29raWVzLCAiamFyIiwgTlVMTCk7CisgICAgc29hcF9lbmRfc2VuZChzb2FwKTsKKyAgICBjbG9zZShzb2FwLT5zZW5kZmQpOworICAgIHNvYXAtPnNvY2tldCA9IHNvY2tldDsKKyAgICBzb2FwLT5zZW5kZmQgPSBzZW5kZmQ7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgc29hcC0+c29ja2V0ID0gc29ja2V0OworICBzb2FwLT5zZW5kZmQgPSBzZW5kZmQ7CisgIHJldHVybiBTT0FQX0VPRjsKK30KKworaW50IHNvYXBfbG9hZF9jb29raWVzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpwYXRobmFtZSkKK3sgaW50IHNvY2tldCA9IHNvYXAtPnNvY2tldDsKKyAgaW50IHJlY3ZmZCA9IHNvYXAtPnJlY3ZmZDsKKyAgc29hcF9iZWdpbihzb2FwKTsKKyAgc29hcC0+c29ja2V0ID0gLTE7CS8qIG1ha2Ugc3VyZSBwbGFpbiBJL08gaXMgdXNlZCAqLworICBzb2FwLT5yZWN2ZmQgPSBvcGVuKHBhdGhuYW1lLCBPX1JET05MWSk7CisgIGlmIChzb2FwLT5yZWN2ZmQgPj0gMCkKKyAgeyBpZiAoc29hcF9iZWdpbl9yZWN2KHNvYXApKQorICAgIHsgY2xvc2Uoc29hcC0+cmVjdmZkKTsKKyAgICAgIHNvYXAtPnNvY2tldCA9IHNvY2tldDsKKyAgICAgIHNvYXAtPnJlY3ZmZCA9IHJlY3ZmZDsKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgc29hcC0+Y29va2llcyA9IChzdHJ1Y3Qgc29hcF9jb29raWUqKXNvYXBfZ2V0X2Nvb2tpZShzb2FwLCBOVUxMLCAiamFyIiwgTlVMTCk7CisgICAgaWYgKCFzb2FwLT5jb29raWVzICYmIHNvYXAtPmVycm9yKQorICAgIHsgY2xvc2Uoc29hcC0+cmVjdmZkKTsKKyAgICAgIHNvYXAtPnNvY2tldCA9IHNvY2tldDsKKyAgICAgIHNvYXAtPnJlY3ZmZCA9IHJlY3ZmZDsKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgaWYgKHNvYXBfZW5kX3JlY3Yoc29hcCkpCisgICAgeyBjbG9zZShzb2FwLT5yZWN2ZmQpOworICAgICAgc29hcC0+c29ja2V0ID0gc29ja2V0OworICAgICAgc29hcC0+cmVjdmZkID0gcmVjdmZkOworICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBjbG9zZShzb2FwLT5yZWN2ZmQpOworICAgIHNvYXAtPnNvY2tldCA9IHNvY2tldDsKKyAgICBzb2FwLT5yZWN2ZmQgPSByZWN2ZmQ7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgc29hcC0+c29ja2V0ID0gc29ja2V0OworICBzb2FwLT5yZWN2ZmQgPSByZWN2ZmQ7CisgIHJldHVybiBTT0FQX0VPRjsKK30KZGlmZiAtLWdpdCBhL2V4dHJhcy9ja2RiLmggYi9leHRyYXMvY2tkYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZGZlMmUKLS0tIC9kZXYvbnVsbAorKysgYi9leHRyYXMvY2tkYi5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCWNrZGIuaAorCisJSFRUUCBjb29raWUgZGF0YWJhc2UgbWFuYWdlci4gU2VlIGNrZGIuYyBmb3IgbW9yZSBkZXRhaWxzLgorCitUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBnU09BUCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCitMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK2h0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9zb2FwbGljZW5zZS5odG1sCitTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAorV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCitmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLgorQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisqLworCisvKiBzdHJ1Y3QgY29va2llIG11c3QgYmUgYSBtaXJyb3IgaW1hZ2Ugb2Ygc3RydWN0IHNvYXBfY29va2llIGluIHN0ZHNvYXAyLmggKi8KK3N0cnVjdCBjb29raWUKK3sgc3RydWN0IGNvb2tpZSAqbmV4dDsKKyAgY2hhciAqbmFtZTsKKyAgY2hhciAqdmFsdWU7CisgIGNoYXIgKmRvbWFpbjsKKyAgY2hhciAqcGF0aDsKKyAgbG9uZyBleHBpcmU7CisgIHVuc2lnbmVkIGludCB2ZXJzaW9uOworICBzaG9ydCBzZWN1cmU7CisgIFsKKyAgc2hvcnQgc2Vzc2lvbjsJLyogdHJhbnNpZW50OiBkbyBub3QgKGRlKXNlcmlhbGl6ZSAqLworICBzaG9ydCBlbnY7CQkvKiB0cmFuc2llbnQ6IGRvIG5vdCAoZGUpc2VyaWFsaXplICovCisgIHNob3J0IG1vZGlmaWVkOwkvKiB0cmFuc2llbnQ6IGRvIG5vdCAoZGUpc2VyaWFsaXplICovCisgIF0KK307CmRpZmYgLS1naXQgYS9leHRyYXMvY2tkYnRlc3QuYyBiL2V4dHJhcy9ja2RidGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZWVjMzMKLS0tIC9kZXYvbnVsbAorKysgYi9leHRyYXMvY2tkYnRlc3QuYwpAQCAtMCwwICsxLDUyIEBACisvKglja2RidGVzdC5jCisKKwlUZXN0IGNsaWVudCBmb3IgSFRUUCBjb29raWUgZGF0YWJhc2UgbWFuYWdlci4KKworCUNvcHlyaWdodCAoQykgMjAwMC0yMDAyIFJvYmVydCBBLiB2YW4gRW5nZWxlbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworMS4gQ29tcGlsZSBja2RiLmg6CisgICBzb2FwY3BwMiAtY3Bja2RiIGNrZGIuaAorMi4gQ29tcGlsZSBja2RiLmM6CisgICBnY2MgLURXSVRIX0NPT0tJRVMgLURXSVRIX05PR0xPQkFMIC1jIGNrZGIuYworMy4gQ29tcGlsZSBhbmQgbGluayBja2RidGVzdC5jOgorICAgc29hcGNwcDIgLWMgY2tkYnRlc3QuaAorICAgZ2NjIC1EV0lUSF9DT09LSUVTIGNrZGJ0ZXN0LmMgY2tkYi5vIHN0ZHNvYXAyLmMgc29hcEMuYyBzb2FwQ2xpZW50LmMKKzQuIEV4ZWN1dGUKKyAgIENvb2tpZXMgd2lsbCBiZSBzdG9yZWQgaW4gJ2phci54bWwnCisKKyovCisKKyNpbmNsdWRlICJzb2FwSC5oIgorI2luY2x1ZGUgImNrZGJ0ZXN0Lm5zbWFwIgorCitjaGFyIGNrc2VydmVyW10gPSAiaHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL2NrLmNnaSI7CisKK2ludCBtYWluKCkKK3sgc3RydWN0IHNvYXAgc29hcDsKKyAgY2hhciAqcjsKKyAgc29hcF9pbml0KCZzb2FwKTsKKyAgaWYgKHNvYXBfY2FsbF9ja19fZGVtbygmc29hcCwgY2tzZXJ2ZXIsIE5VTEwsICZyKSkKKyAgeyBzb2FwX3ByaW50X2ZhdWx0KCZzb2FwLCBzdGRlcnIpOworICAgIHNvYXBfcHJpbnRfZmF1bHRfbG9jYXRpb24oJnNvYXAsIHN0ZGVycik7CisgICAgZXhpdCgtMSk7CisgIH0KKyAgcHJpbnRmKCJUaGUgc2VydmVyIHJlc3BvbmRlZCB3aXRoOiAlc1xuIiwgcik7CisgIGlmIChzb2FwX3NhdmVfY29va2llcygmc29hcCwgImphci54bWwiKSkKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBzdG9yZSBjb29raWVzXG4iKTsKKyAgc29hcF9mcmVlX2Nvb2tpZXMoJnNvYXApOworICBpZiAoc29hcF9sb2FkX2Nvb2tpZXMoJnNvYXAsICJqYXIueG1sIikpCisgICAgZnByaW50ZihzdGRlcnIsICJDYW5ub3QgcmVzdG9yZSBjb29raWVzXG4iKTsKKyAgZWxzZQorICAgIHByaW50ZigiR290IGNvb2tpZXMgKCVzPSVzKVxuIiwgc29hcC5jb29raWVzLT5uYW1lLCBzb2FwLmNvb2tpZXMtPnZhbHVlKTsKKyAgaWYgKHNvYXBfY2FsbF9ja19fZGVtbygmc29hcCwgY2tzZXJ2ZXIsIE5VTEwsICZyKSkKKyAgeyBzb2FwX3ByaW50X2ZhdWx0KCZzb2FwLCBzdGRlcnIpOworICAgIHNvYXBfcHJpbnRfZmF1bHRfbG9jYXRpb24oJnNvYXAsIHN0ZGVycik7CisgICAgZXhpdCgtMSk7CisgIH0KKyAgcHJpbnRmKCJUaGUgc2VydmVyIHJlc3BvbmRlZCB3aXRoOiAlc1xuIiwgcik7CisgIGlmIChzb2FwX3NhdmVfY29va2llcygmc29hcCwgImphci54bWwiKSkKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBzdG9yZSBjb29raWVzXG4iKTsKKyAgc29hcF9lbmQoJnNvYXApOwkvKiBUaGlzIHdpbGwgZGVsZXRlIHRoZSBkZXNlcmlhbGl6ZWQgY29va2llcyB0b28hICovCisgIHNvYXAuY29va2llcyA9IE5VTEw7CS8qIHNvIG1ha2Ugc3VyZSB0aGlzIGlzIE5VTEwgKi8KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9leHRyYXMvY2tkYnRlc3QuaCBiL2V4dHJhcy9ja2RidGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMzU2ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9leHRyYXMvY2tkYnRlc3QuaApAQCAtMCwwICsxLDYgQEAKKy8vZ3NvYXAgY2sgc2VydmljZSBuYW1lOiBja2RidGVzdAorLy9nc29hcCBjayBzZXJ2aWNlIGxvY2F0aW9uOiBodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4KKy8vZ3NvYXAgY2sgc2VydmljZSBuYW1lc3BhY2U6IGh0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9jay53c2RsCisvL2dzb2FwIGNrIHNlcnZpY2UgZW5jb2Rpbmc6IGVuY29kZWQKKy8vZ3NvYXAgY2sgc2NoZW1hICBuYW1lc3BhY2U6IHVybjpjaworaW50IGNrX19kZW1vKGNoYXIgKipyKTsKZGlmZiAtLWdpdCBhL2V4dHJhcy9mYXVsdC5jcHAgYi9leHRyYXMvZmF1bHQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NmU0ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9leHRyYXMvZmF1bHQuY3BwCkBAIC0wLDAgKzEsNDcgQEAKKy8qCUNvbnRyaWJ1dGVkIGJ5IEFsbGFuIEtlbGx5LCBKdW5lIDE3LCAyMDAyCisJUHJvdmlkZXMgQysrIGFsdGVybmF0aXZlcyBmb3IKKwlzb2FwX3ByaW50X2ZhdWx0IGFuZCBzb2FwX3ByaW50X2ZhdWx0X2xvY2F0aW9uIGZ1bmN0aW9ucworKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9wcmludF9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjpvc3RyZWFtJiBtc2cpCit7IGlmIChzb2FwLT5lcnJvcikKKyAgeyBpZiAoISpzb2FwX2ZhdWx0Y29kZShzb2FwKSkKKyAgICAgIHNvYXBfc2V0X2ZhdWx0KHNvYXApOworICAgIGlmICghKnNvYXBfZmF1bHRzdHJpbmcoc29hcCkpCisgICAgICAqc29hcF9mYXVsdHN0cmluZyhzb2FwKSA9ICIiOworICAgIG1zZyA8PCAiU09BUCBGQVVMVDogIgorICAgICAgICA8PCAqc29hcF9mYXVsdGNvZGUoc29hcCkgPDwgc3RkOjplbmRsCisgICAgICAgIDw8ICJcIiIgPDwgKnNvYXBfZmF1bHRzdHJpbmcoc29hcCkgPDwgIlwiIiA8PCBzdGQ6OmVuZGw7CisgICAgaWYgKCpzb2FwX2ZhdWx0ZGV0YWlsKHNvYXApKQorICAgICAgbXNnIDw8ICJEZXRhaWw6ICIgPDwgKnNvYXBfZmF1bHRkZXRhaWwoc29hcCkgPDwgc3RkOjplbmRsOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfcHJpbnRfZmF1bHRfbG9jYXRpb24oc3RydWN0IHNvYXAgKnNvYXAsIHN0ZDo6b3N0cmVhbSYgbXNnKQoreyBpbnQgYzsKKyAgaWYgKHNvYXAtPmVycm9yICYmIHNvYXAtPmJ1ZmxlbiA+IDApCisgIHsgaWYgKHNvYXAtPmJ1ZmlkeCA9PSAwKQorICAgICAgc29hcC0+YnVmaWR4ID0gMTsKKyAgICBjID0gc29hcC0+YnVmW3NvYXAtPmJ1ZmlkeC0xXTsKKyAgICBzb2FwLT5idWZbc29hcC0+YnVmaWR4LTFdID0gJ1wwJzsKKyAgICBpZiAoc29hcC0+YnVmaWR4IDwgc29hcC0+YnVmbGVuKQorICAgICAgbXNnIDw8IHNvYXAtPmJ1ZiA8PCBzdGF0aWNfY2FzdDxjaGFyPiAoYykgPDwgc3RkOjplbmRsCisgICAgICAgICAgPDwgIioqIEhFUkUgKioiIDw8IHN0ZDo6ZW5kbCA8PCBzb2FwLT5idWYrc29hcC0+YnVmaWR4CisgICAgICAgICAgPDwgc3RkOjplbmRsOworICAgIGVsc2UKKyAgICAgIG1zZyA8PCBzb2FwLT5idWYgPDwgc3RhdGljX2Nhc3Q8Y2hhcj4gKGMpIDw8IHN0ZDo6ZW5kbAorICAgICAgICAgIDw8ICIqKiBIRVJFICoqIiA8PCBzdGQ6OmVuZGw7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2V4dHJhcy9sb2dnaW5nLmNwcCBiL2V4dHJhcy9sb2dnaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWRhMTczCi0tLSAvZGV2L251bGwKKysrIGIvZXh0cmFzL2xvZ2dpbmcuY3BwCkBAIC0wLDAgKzEsNjQgQEAKKy8vCWxvZ2dpbmcuY3BwCisvLworLy8JUGxhY2UgdGhpcyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjb3J5IGFzIHN0ZHNvYXAyLmgKKy8vCVJlcXVpcmVzIHNvYXBkZWZzLmggKGNvbXBpbGUgc3Rkc29hcDIuY3BwIHdpdGggLURXSVRIX1NPQVBERUZTX0gKKy8vCWFuZCAtRERFQlVHX0NBTExCQUNLUykKKy8vCisvLwlSdW50aW1lL0N1c3RvbWVyIGxvZ2dpbmcgYnkgTWlrZSBIZWxtaWNrCisvLwlDb3B5cmlnaHQgKGMpIDIwMDIgLSBNaWtlIEhlbG1pY2suIENvbnZlcmd5cyBJTUcuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLwlUaGlzIGNvbnRyaWJ1dGVkIGNvZGUgaXMgY292ZXJlZCB1bmRlciB0aGUgTVBMIDEuMSBsaWNlbnNlCisKKyNpbmNsdWRlICJzdGRzb2FwMi5oIgkvLyBpbmNsdWRlcyAic29hcGRlZnMuaCIgd2hlbiBjb21waWxlZCB3aXRoIC1EV0lUSF9TT0FQREVGU19ICisKK3ZvaWQgc29hcF9yZWN2X2NhbGxiYWNrKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHNpemVfdCBsZW4pOwordm9pZCBzb2FwX3NlbnRfY2FsbGJhY2soc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc2l6ZV90IGxlbik7Cit2b2lkIHNvYXBfdGVzdF9jYWxsYmFjayhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaXplX3QgbGVuKTsKKwordm9pZAorc29hcF9kaXNwYXRjaF9jYWxsYmFjayhzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGlkeCwgY29uc3QgY2hhciAqbXNnLCBzaXplX3QgbGVuKQorewlpZiAoIXNvYXAtPnVzZXIpCisJewkvLyB5b3UgY2FuIHNldCBzdHVmZiB1cCBoZXJlLCBzdHJlYW1zIGV0Yy4KKwkJLy8gc29hcC0+dXNlciBpcyB1c2VkIHRvIHBhc3MgdXNlci1kZWZpbmVkIGRhdGEKKwkJLy8gc29hcC0+dXNlciBpcyBuZXZlciBzZXQgbm9yIGNsZWFyZWQgYnkgZ1NPQVAKKwkJc29hcC0+dXNlciA9ICh2b2lkKikmY291dDsKKwkJLy8gZG9uJ3QgZm9yZ2V0IHRvIGNsZWFuIHVwIHRoZSBzdHJlYW1zIGluIHRoZSBtYWluIGNvZGUKKwkJLy8gKGJlZm9yZSBkaXNjYXJkaW5nIHRoZSBzb2FwIHJ1bnRpbWUgZW52aXJvbm1lbnQpCisJfQorCXN3aXRjaCAoaWR4KQorCXsJY2FzZSBTT0FQX0lOREVYX1JFQ1Y6CisJCQlzb2FwX3JlY3ZfY2FsbGJhY2soc29hcCwgbXNnLCBsZW4pOworCQkJYnJlYWs7CisJIAljYXNlIFNPQVBfSU5ERVhfU0VOVDoKKwkJCXNvYXBfc2VudF9jYWxsYmFjayhzb2FwLCBtc2csIGxlbik7CisJCQlicmVhazsKKwkgCWNhc2UgU09BUF9JTkRFWF9URVNUOgorCQkJc29hcF90ZXN0X2NhbGxiYWNrKHNvYXAsIG1zZywgbGVuKTsKKwkJCWJyZWFrOworCX0KK30KKworLy8gTm90ZTogJ21zZycgaXMgbm90IDAtdGVybWluYXRlZCEKK3ZvaWQKK3NvYXBfcmVjdl9jYWxsYmFjayhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbXNnLCBzaXplX3QgbGVuKQoreyBvc3RyZWFtJiBvcyA9ICoob3N0cmVhbSopc29hcC0+dXNlcjsKKyAgb3MgPDwgZW5kbAorCTw8ICJSZWNlaXZlZDoiIDw8IGVuZGwKKwk8PCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgPDwgZW5kbDsKKyAgb3Mud3JpdGUobXNnLCBsZW4pOworICBvcyA8PCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgPDwgZW5kbDsKK30KKwordm9pZAorc29hcF9zZW50X2NhbGxiYWNrKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICptc2csIHNpemVfdCBsZW4pCit7IG9zdHJlYW0mIG9zID0gKihvc3RyZWFtKilzb2FwLT51c2VyOworICBvcyA8PCBlbmRsCisJPDwgIlNlbnQ6IiA8PCBlbmRsCisJPDwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIDw8IGVuZGw7CisgIG9zLndyaXRlKG1zZywgbGVuKTsKKyAgb3MgPDwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIDw8IGVuZGw7Cit9CisKK3ZvaWQKK3NvYXBfdGVzdF9jYWxsYmFjayhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbXNnLCBzaXplX3QgbGVuKQoreyAoKihvc3RyZWFtKilzb2FwLT51c2VyIDw8ICJUcmFjZTogIikud3JpdGUobXNnLCBsZW4pOworfQpkaWZmIC0tZ2l0IGEvZXh0cmFzL3NvYXBkZWZzLmggYi9leHRyYXMvc29hcGRlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmMwOGExCi0tLSAvZGV2L251bGwKKysrIGIvZXh0cmFzL3NvYXBkZWZzLmgKQEAgLTAsMCArMSwyOCBAQAorLy8Jc29hcGRlZnMuaAorLy8JUGxhY2UgdGhpcyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyBzdGRzb2FwMi5oCisvLwlUaGlzIGZpbGUgd2lsbCBiZSBpbmNsdWRlZCBpbiBzdGRzb2FwMi5oIHdoZW4gY29tcGlsaW5nIHdpdGgKKy8vCS1EV0lUSF9TT0FQREVGU19IIChzZWUgc3Rkc29hcDIuaCBsaW5lIDE2KQorLy8JU2VlIGV4dHJhcy9sb2dnaW5nLmNwcCBmb3IgY3VzdG9tZXIgbG9nZ2luZworLy8JCisvLwlSdW50aW1lL0N1c3RvbWVyIGxvZ2dpbmcgYnkgTWlrZSBIZWxtaWNrCisvLwlDb3B5cmlnaHQgKGMpIDIwMDIgLSBNaWtlIEhlbG1pY2suIENvbnZlcmd5cyBJTUcuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLwlUaGlzIGNvbnRyaWJ1dGVkIGNvZGUgc2kgY292ZXJlZCB1bmRlciB0aGUgTVBMIDEuMSBsaWNlbnNlCisKKyNpZm5kZWYgU09BUERFRlNfSAorI2RlZmluZSBTT0FQREVGU19ICisKKyNpZmRlZiBERUJVR19DQUxMQkFDS1MKKyNpZm5kZWYgREVCVUcKKyNkZWZpbmUgREVCVUcKKyNlbmRpZgorI2RlZmluZSBTT0FQX01FU1NBR0Ugc3ByaW50ZgorI2RlZmluZSBEQkdMT0coREJHRklMRSwgQ01EKSBcCit7IGNoYXIgZmRlYnVnW1NPQVBfQlVGTEVOKzFdO1wKKyAgQ01EO1wKKyAgc29hcF9kaXNwYXRjaF9jYWxsYmFjayhzb2FwLCBTT0FQX0lOREVYXyMjREJHRklMRSwgZmRlYnVnLCBzdHJsZW4oZmRlYnVnKSk7XAorfQorI2RlZmluZSBEQkdNU0coREJHRklMRSwgTVNHLCBMRU4pIHNvYXBfZGlzcGF0Y2hfY2FsbGJhY2soc29hcCwgU09BUF9JTkRFWF8jI0RCR0ZJTEUsIE1TRywgTEVOKTsKK3ZvaWQgc29hcF9kaXNwYXRjaF9jYWxsYmFjayhzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIHNpemVfdCk7CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9ncGwudHh0IGIvZ3BsLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzQyMzdhCi0tLSAvZGV2L251bGwKKysrIGIvZ3BsLnR4dApAQCAtMCwwICsxLDMwOSBAQAorVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpCisKK1ZlcnNpb24gMiwgSnVuZSAxOTkxCisKK0NvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZQorMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0V2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGlzIGxpY2Vuc2UKK2RvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKK1ByZWFtYmxlCisKK1RoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIgZnJlZWRvbSB0byBzaGFyZQorYW5kIGNoYW5nZSBpdC4gQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbnRlbmRlZCB0bworZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUgc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUKK3NvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuIFRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3QKK29mIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UKK2F1dGhvcnMgY29tbWl0IHRvIHVzaW5nIGl0LiAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMKK2NvdmVyZWQgYnkgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdCBwcmljZS4gT3VyCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgdGhlIGZyZWVkb20gdG8KK2Rpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yIHRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksCit0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQgaWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UKK3RoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0IGluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UKK2NhbiBkbyB0aGVzZSB0aGluZ3MuCisKK1RvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQgYW55b25lIHRvIGRlbnkKK3lvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4gVGhlc2UgcmVzdHJpY3Rpb25zCit0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKK0ZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIgZ3JhdGlzIG9yIGZvcgorYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdCB5b3UgaGF2ZS4gWW91IG11c3QgbWFrZQorc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZSBzb3VyY2UgY29kZS4gQW5kIHlvdSBtdXN0IHNob3cgdGhlbQordGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KKworV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZCAoMikKK29mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZQorYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCisKK0Fsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluIHRoYXQKK2V2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZSBzb2Z0d2FyZS4gSWYgdGhlCitzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2Ugd2FudCBpdHMgcmVjaXBpZW50cyB0bwora25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvIHRoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQKK2J5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbCBhdXRob3JzJyByZXB1dGF0aW9ucy4KKworRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUgcGF0ZW50cy4gV2Ugd2lzaAordG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZSBwcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5CitvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZSBwcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudAordGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55IHBhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzCitmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgorCitUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24KK2ZvbGxvdy4KKworVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKzAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMgYSBub3RpY2UKK3BsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZgordGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiBUaGUgIlByb2dyYW0iLCBiZWxvdywgcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0KK29yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIiBtZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55CitkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzogdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZQorUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsIGVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yCit0cmFuc2xhdGVkIGludG8gYW5vdGhlciBsYW5ndWFnZS4gKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0CitsaW1pdGF0aW9uIGluIHRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCisKK0FjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90IGNvdmVyZWQgYnkKK3RoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuIFRoZSBhY3Qgb2YgcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QKK3Jlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0gaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cworY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkKK3J1bm5pbmcgdGhlIFByb2dyYW0pLiBXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KKworMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzIHNvdXJjZSBjb2RlIGFzCit5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UgY29uc3BpY3VvdXNseSBhbmQKK2FwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQKK2Rpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZQorYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsgYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlCitQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KKworWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kIHlvdSBtYXkKK2F0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgorCisyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uIG9mIGl0LCB0aHVzCitmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kIGRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zCitvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEgYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YKK3RoZXNlIGNvbmRpdGlvbnM6CisKK2EpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQKK3lvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluIHdob2xlIG9yIGluCitwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkgcGFydCB0aGVyZW9mLCB0byBiZQorbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMKK0xpY2Vuc2UuCisKK2MpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkgd2hlbiBydW4sIHlvdQorbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2ggaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0CitvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4gYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZQorY29weXJpZ2h0IG5vdGljZSBhbmQgYSBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQKK3lvdSBwcm92aWRlIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIgdGhlc2UKK2NvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuCisoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0IGRvZXMgbm90IG5vcm1hbGx5IHByaW50CitzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludAorYW4gYW5ub3VuY2VtZW50LikKKworVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuIElmIGlkZW50aWZpYWJsZQorc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLCBhbmQgY2FuIGJlIHJlYXNvbmFibHkKK2NvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluIHRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQKK2l0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlIHNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZQord29ya3MuIEJ1dCB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhCit3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcworb2YgdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUgZW50aXJlCit3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0IHlvdXIKK3JpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8gZXhlcmNpc2UgdGhlCityaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvciBjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uCit0aGUgUHJvZ3JhbS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbSB3aXRoIHRoZQorUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mIGEgc3RvcmFnZSBvcgorZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlciB0aGUgc2NvcGUgb2YgdGhpcworTGljZW5zZS4KKworMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsIHVuZGVyCitTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQKKzIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSwKK3doaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KK2N1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUgeWVhcnMsIHRvIGdpdmUKK2FueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nCitzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZworc291cmNlIGNvZGUsIHRvIGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEKK21lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKK2MpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyIHRvIGRpc3RyaWJ1dGUKK2NvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuIChUaGlzIGFsdGVybmF0aXZlIGlzIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbAorZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdSByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlCitmb3JtIHdpdGggc3VjaCBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKKworVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvciBtYWtpbmcKK21vZGlmaWNhdGlvbnMgdG8gaXQuIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG1lYW5zIGFsbCB0aGUKK3NvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkgYXNzb2NpYXRlZCBpbnRlcmZhY2UKK2RlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0byBjb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24KK29mIHRoZSBleGVjdXRhYmxlLiBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQKK25lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvcgorYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCitvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudCBpdHNlbGYKK2FjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgorCitJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5Citmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UKK2NvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMgZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2gKK3RoaXJkIHBhcnRpZXMgYXJlIG5vdCBjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorCis0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gZXhjZXB0IGFzCitleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiBBbnkgYXR0ZW1wdCBvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LAorc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlCit5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuIEhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvcgorcmlnaHRzLCBmcm9tIHlvdSB1bmRlciB0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvCitsb25nIGFzIHN1Y2ggcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCis1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3Qgc2lnbmVkIGl0LgorSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQorb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuIFRoZXNlIGFjdGlvbnMgYXJlIHByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QKK2FjY2VwdCB0aGlzIExpY2Vuc2UuIFRoZXJlZm9yZSwgYnkgbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IKK2FueSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8KK2RvIHNvLCBhbmQgYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKzYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSksCit0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlIG9yaWdpbmFsIGxpY2Vuc29yIHRvCitjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLgorWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyIHJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlCityaWdodHMgZ3JhbnRlZCBoZXJlaW4uIFlvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieQordGhpcmQgcGFydGllcyB0byB0aGlzIExpY2Vuc2UuCisKKzcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksIGNvbmRpdGlvbnMKK2FyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yIG90aGVyd2lzZSkgdGhhdAorY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90IGV4Y3VzZSB5b3UgZnJvbSB0aGUKK2NvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiBJZiB5b3UgY2Fubm90IGRpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeQorc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIExpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQKK29ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91IG1heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuCitGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQgbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbgorb2YgdGhlIFByb2dyYW0gYnkgYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2gKK3lvdSwgdGhlbiB0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55CitwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHkgYW5kCit0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyIGNpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkgcGF0ZW50cyBvcgorb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55IHN1Y2ggY2xhaW1zOyB0aGlzCitzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlIGludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZQorZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMgaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiBNYW55CitwZW9wbGUgaGF2ZSBtYWRlIGdlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHRocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nIHRvCitkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QgaW1wb3NlIHRoYXQKK2Nob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvIGJlIGEKK2NvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKworOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4gY2VydGFpbgorY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZSBvcmlnaW5hbAorY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZSBtYXkgYWRkIGFuIGV4cGxpY2l0CitnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nIHRob3NlIGNvdW50cmllcywgc28gdGhhdAorZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nIGNvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluCitzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMgdGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keQorb2YgdGhpcyBMaWNlbnNlLgorCis5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucyBvZiB0aGUKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwgYmUgc2ltaWxhciBpbgorc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0byBhZGRyZXNzIG5ldyBwcm9ibGVtcworb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBJZiB0aGUgUHJvZ3JhbSBzcGVjaWZpZXMKK2EgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkgbGF0ZXIgdmVyc2lvbiIsCit5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQKK3ZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBJZgordGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UKK2FueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKzEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUgcHJvZ3JhbXMKK3dob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IgdG8gYXNrIGZvcgorcGVybWlzc2lvbi4gRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCit3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMgbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLgorT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YKK2FsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZgorc29mdHdhcmUgZ2VuZXJhbGx5LgorCitOTyBXQVJSQU5UWQorCisxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkgRk9SCitUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuIEVYQ0VQVCBXSEVOIE9USEVSV0lTRQorU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTIFBST1ZJREUgVEhFCitQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELAorSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQKK1BFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiBTSE9VTEQgVEhFIFBST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UKK0FTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKzEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcgV0lMTAorQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IgUkVESVNUUklCVVRFIFRIRQorUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkKK0dFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IKK0lOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEKK0JFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCitGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSCitPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKK0VORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCitIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKKworSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdCBwb3NzaWJsZQordXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdCBmcmVlIHNvZnR3YXJlCit3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKK1RvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiBJdCBpcyBzYWZlc3QgdG8gYXR0YWNoCit0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkgY29udmV5IHRoZSBleGNsdXNpb24KK29mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHRoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhCitwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDA0LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWw6CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCisKK0lmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMgd2hlbiBpdAorc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKK2dTT0FQIHZlcnNpb24gWC5ZLlosIENvcHlyaWdodCAoQykgMjAwMS0yMDA0LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEsIEluYy4KK2dTT0FQIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4gVGhpcyBpcworZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOwordHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkgYmUKK2NhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQorbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KKworVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvCitwcm9wcmlldGFyeSBwcm9ncmFtcy4gSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5IGNvbnNpZGVyCitpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUgbGlicmFyeS4gSWYKK3RoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQKK29mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2dzb2FwLXBhbG0vUkVBRE1FLnR4dCBiL2dzb2FwLXBhbG0vUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWYzNzc2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3NvYXAtcGFsbS9SRUFETUUudHh0CkBAIC0wLDAgKzEsNDQgQEAKK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIFBhbG0gT1Mgc3VwcG9ydC4KKworVHdvIGV4YW1wbGUgYXBwbGljYXRpb25zIGFyZSBpbmNsdWRlZCBpbiB0aGUgJ2ludGVyb3AnIGFuZCAnc3RvY2txdW90ZScKK2RpcmVjdG9yaWVzLiBNZXRyb1dlcmtzIENvZGVXYXJyaW9yIHByb2plY3QgZmlsZXMgYXJlIGluY2x1ZGVkLgorCitUaGUgJ2ludGVyb3AnIGV4YW1wbGUgcGVyZm9ybXMgaW50ZXJvcCBjaGVja3Mgd2l0aCBTT0FQIFJQQyAxLjEgcm91bmQgMiBBL0IvQwordGVzdHMgYWdhaW5zdCBpbnRlcm9wIHNlcnZlcnMuIChOb3RlOiB0aGUgZGVidWcgbW9kZSByZXBvcnRzIGEgbWVtb3J5IGxlYWssCit3aGljaCBpcyBpbiB0aGUgZGlzcGxheVRleHQoKSBmdW5jdGlvbiBmb3IgdGhlIEdVSSBhbmQgbm90IGhhcm1mdWwuKQorCitUaGUgJ3N0b2NrcXVvdGUnIGV4YW1wbGUgcmVwb3J0cyB0aGUgdmFsdWUgb2YgYSBzdG9jayAodGlja2VyIHN5bWJvbCkuCisKK1RoZSBzdGRzb2FwMi5jLy5jcHAgcnVudGltZSBsaWJyYXJ5IGZpdHMgaW4gYSA2NEsgc2VnbWVudC4gU29tZSBmdW5jdGlvbmFsaXR5CitpcyBub3QgYXZhaWxhYmxlIChpbXBsaWNpdGx5IGRpc2FibGVkIHdpdGggdGhlIFdJVEhfTEVBTiBjb21waWxlciBvcHRpb24pOiBubworSFRUUCBrZWVwLWFsaXZlLCBubyBIVFRQIGNvb2tpZXMsIG5vIEhUVFAgYXV0aGVudGljYXRpb24sIG5vIG1lc3NhZ2UgbG9nZ2luZywKK2xpbWl0ZWQgZXJyb3IgZGlhZ25vc3RpY3MsIG5vIHNlbmQvcmVjdiB0aW1lb3V0cywgYW5kIG5vIHRpbWVfdCwgdW5zaWduZWQKK3Nob3J0LCBvciBJbnQ2NCBzZXJpYWxpemF0aW9uLiBUbyBtYWtlIHRoZSBmb290cHJpbnQgYXMgc21hbGwgYXMgcG9zc2libGUsCitjb21waWxlIHRoZSBzb3VyY2VzIHdpdGggdGhlIC9EV0lUSF9MRUFORVIgY29tcGlsZSBvcHRpb24uIFRoaXMgZGlzYWJsZXMgTUlNRQorYW5kIERJTUUgc3VwcG9ydC4KKworVG8gaGVscCBkZXZlbG9wIG11bHRpLXNlZ21lbnRlZCBhcHBsaWNhdGlvbnMsIHRoZSBzdGRzb2FwMi5jLy5jcHAgaXMgc3BsaXQgaW4KK3R3byBwYXJ0czogcGFsbXNvYXAxLmMvLmNwcCBhbmQgcGFsbXNvYXAyLmMvLmNwcC4gWW91IHNob3VsZCB1c2UgdGhlc2UgaW5zdGVhZAorb2Ygc3Rkc29hcDIuYy8uY3BwLgorCitUbyBkZXZlbG9wIGFuIGFwcGxpY2F0aW9uIGZyb20gYSBXU0RMLCBydW4gd3NkbDJoLmV4ZSAob3IgYSB3c2RsMmggZXhlY3V0YWJsZQorZm9yIGFueSBvdGhlciBwbGF0Zm9ybSkgb24gdGhlIFdTREwgZmlsZS4gTWluZCB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMuIEZvcgorZXhhbXBsZSwgd3NkbDJoLmV4ZSAtYyBnZW5lcmF0ZXMgQyBjb2RlIGFuZCB3c2RsMmguZXhlIC1zIGdlbmVyYXRlcyBDKysgY29kZQord2l0aG91dCByZXF1aXJpbmcgU1RMLiBUaGlzIGNvbW1hbmQgZ2VuZXJhdGVkIGEgQyBvciBDKysgaGVhZGVyIGZpbGUuCisKK1RvIGdlbmVyYXRlIHNlcmlhbGl6ZXJzIGFuZCBzdHViIHJvdXRpbmVzLCBydW4gc29hcGNwcDIuZXhlIChvciBhIHNvYXBjcHAyCitleGVjdXRhYmxlIGZvciBhbnkgb3RoZXIgcGxhdGZvcm0pIG9uIHRoZSBoZWFkZXIgZmlsZS4gVGhlIHNvYXBjcHAyLmV4ZQorZ2VuZXJhdGVzIHBsYXRmb3JtLWluZGVwZW5kZW50IGNvZGUsIGluY2x1ZGluZzoKK3NvYXBILmgJCWhlYWRlciBmaWxlIGZvciBzZXJpYWxpemVycworc29hcEMuY3BwCXNlcmlhbGl6ZXJzCitzb2FwU3R1Yi5oCWhlYWRlciBmaWxlIGZvciBzdHVicworc29hcENsaWVudC5jcHAJc3R1YnMKKworVGhlICdpbnRlcm9wJyBhbmQgJ3N0b2NrcXVvdGUnIGV4YW1wbGVzIGFscmVhZHkgaW5jbHVkZWQgdGhlc2UgZmlsZXMuCisKK0JlY2F1c2UgdGhlIGdlbmVyYXRlZCBjb2RlIGlzIHBsYXRmb3JtLWluZGVwZW5kZW50LCBpdCBpcyBzdHJvbmdseSBhZHZpc2VkIHRvCit0cnkgdG8gYnVpbGQgYSBzaW1wbGUgdGVzdCBhcHBsaWNhdGlvbiBvbiBhIG5vbi1QYWxtIHBsYXRmb3JtIGZpcnN0IHRvIHZlcmlmeQoraW50ZXJvcGVyYWJpbGl0eSBhbmQgZGF0YSBleGNoYW5nZS4gQmVjYXVzZSBsb2dnaW5nIGlzIGRpc2FibGVkIG9uIFBhbG0sIGl0Cit3aWxsIGJlIGhhcmQgdG8gZmluZCB0aGUgc291cmNlIG9mIGFuIGludGVyb3AgcHJvYmxlbS4gQWZ0ZXIgdGVzdGluZyB0aGUKK2FwcGxpY2F0aW9uLCB5b3UgY2FuIHVzZSB0aGUgc2FtZSBzb3VyY2VzIHRvIGJ1aWxkIGEgUGFsbSBPUyBhcHBsaWNhdGlvbi4KKwpkaWZmIC0tZ2l0IGEvZ3NvYXAtcGFsbS9pbnRlcm9wL011bHRpLVNlZ21lbnQgUmVhZCBNZS50eHQgYi9nc29hcC1wYWxtL2ludGVyb3AvTXVsdGktU2VnbWVudCBSZWFkIE1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWNjNWRiCi0tLSAvZGV2L251bGwKKysrIGIvZ3NvYXAtcGFsbS9pbnRlcm9wL011bHRpLVNlZ21lbnQgUmVhZCBNZS50eHQKQEAgLTAsMCArMSwzNiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMCBQYWxtLCBJbmMuIG9yIGl0cyBzdWJzaWRpYXJpZXMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIEZpbGU6IE11bHRpLVNlZ21lbnQgUmVhZCBNZS50eHQKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworVGhpcyBpcyBhIHN0YXRpb25lcnkgcHJvamVjdCBmb3IgYSBtdWx0aS1zZWdtZW50IGFwcGxpY2F0aW9uIHRoYXQgCitydW5zIG9uIFBhbG0gT1MgZGV2aWNlcy4gIEV2ZW4gdGhvdWdoIHlvdSBjYW4gY3JlYXRlIGFwcGxpY2F0aW9ucyAKK3dpdGggbXVsdGlwbGUgc2VnbWVudHMsIHlvdSBtdXN0IGZvbGxvdyB0aGUgZXhhbXBsZSB1c2VkIGluIHRoaXMKK3Byb2plY3QuICBTZWUgdGhlICJUYXJnZXR0aW5nIFBhbG0gT1MiIG1hbnVhbCBpbiB0aGUgQ29kZVdhcnJpb3IgCitEb2N1bWVudGF0aW9uIGZvbGRlciBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB3b3JraW5nIHdpdGggbXVsdGktCitzZWdtZW50IGFwcGxpY2F0aW9ucy4KKworU2VnbWVudHMgYXJlIG51bWJlcmVkIGZyb20gMC4gIFNlZ21lbnQgMCBjb250YWlucyBpbmZvcm1hdGlvbiBmb3IgCit0aGUgc2VnbWVudCBsb2FkZXIgYW5kIGlzIGNyZWF0ZWQgYnkgdGhlIGxpbmtlci4gIFNlZ21lbnQgMSBjb250YWlucyAKK3lvdXIgYXBwbGljYXRpb24gY29kZSBhbmQgdGhlIHN0YXJ0dXAgY29kZS4gIFRoaXMgc2VnbWVudCBfX211c3RfXyAKK2NvbnRhaW4gIk1TTCBSdW50aW1lIFBhbG0gT1MgKHh4KS5saWIiLCBQaWxvdE1haW4oKSwgYW5kIGFueSBjb2RlIHRoYXQgCitpcyBleGVjdXRlZCB3aGVuIFBpbG90TWFpbigpIHJlY2VpdmVzIGEgbGF1bmNoIGNvbW1hbmQgb3RoZXIgdGhhbiAKK3N5c0FwcExhdW5jaENtZE5vcm1hbExhdW5jaC4gIFRoaXMgc3RpcHVsYXRpb24gaXMgY2F1c2VkIGJ5IHRoZSBmYWN0IAordGhhdCBBNS1yZWxhdGl2ZSBkYXRhIGlzIG5vdCByZWxvY2F0ZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gaXMgY2FsbGVkIAord2l0aCBhbnkgb3RoZXIgbGF1bmNoIGNvZGUsIHRodXMgYWxsIGdsb2JhbCB2YXJpYWJsZSBhZGRyZXNzZXMgd2lsbCBiZQord3JvbmcgYW5kIGNhdXNlIGEgY3Jhc2guCisKK1RoZSBiZXN0IHdheSB0byBkZXRlcm1pbmUgd2hhdCBmaWxlcyBjYW4gZ28gaW50byBzZWdtZW50cyBvdGhlcgordGhhbiAxIGlzIHRvIGNvbW1lbnQgb3V0IHRoZSBjb2RlIGluIFBpbG90TWFpbigpIHRoYXQgaGFuZGxlcyB0aGUKK3N5c0FwcExhdW5jaENtZE5vcm1hbExhdW5jaCBjb21tYW5kLCBzZWxlY3QgdGhlICJMaW5rIE1hcCIgb3B0aW9uCitmcm9tIHRoZSA2OEsgTGlua2VyIHByZWZlcmVuY2VzLCBhbmQgcmVidWlsZC4gIEFueSBmaWxlIHRoYXQgc2hvd3MKK3VwIGluIHRoZSBsaW5rIG1hcCBvbiBhIGxpbmUgYmVnaW5uaW5nIHdpdGggIkNvZGU6IiBtdXN0IGJlIGluIHRoZQorZmlyc3Qgc2VnbWVudC4gIAorCitJZiB5b3UgZm9sbG93IHRoZSBjb2Rpbmcgc3R5bGUgdXNlZCBieSB0aGUgUGFsbSBPUyBleGFtcGxlcywgZm9ybSAKK2hhbmRsZXJzIGFuZCB0aGUgc3RhdGljIGZ1bmN0aW9ucyBjYWxsZWQgYnkgdGhlIGZvcm0gaGFuZGxlcnMgYXJlCitnb29kIGNhbmRpZGF0ZXMgdG8gYmUgcGxhY2VkIGluIHNlY29uZGFyeSBzZWdtZW50cy4KZGlmZiAtLWdpdCBhL2dzb2FwLXBhbG0vaW50ZXJvcC9pbnRlcm9wLm1jcCBiL2dzb2FwLXBhbG0vaW50ZXJvcC9pbnRlcm9wLm1jcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmM2Zjc0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3NvYXAtcGFsbS9pbnRlcm9wL2ludGVyb3AubWNwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dzb2FwLXBhbG0vaW50ZXJvcC9pbnRlcm9wX2RhdGEvQ1dTZXR0aW5nc1dpbmRvd3Muc3RnIGIvZ3NvYXAtcGFsbS9pbnRlcm9wL2ludGVyb3BfZGF0YS9DV1NldHRpbmdzV2luZG93cy5zdGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA3NTkyYgotLS0gL2Rldi9udWxsCisrKyBiL2dzb2FwLXBhbG0vaW50ZXJvcC9pbnRlcm9wX2RhdGEvQ1dTZXR0aW5nc1dpbmRvd3Muc3RnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dzb2FwLXBhbG0vaW50ZXJvcC9pbnRlcm9wX2RhdGEvc3RhcnRlci1kZWJ1Zy9UYXJnZXREYXRhV2luZG93cy50ZHQgYi9nc29hcC1wYWxtL2ludGVyb3AvaW50ZXJvcF9kYXRhL3N0YXJ0ZXItZGVidWcvVGFyZ2V0RGF0YVdpbmRvd3MudGR0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ODA5OTcKLS0tIC9kZXYvbnVsbAorKysgYi9nc29hcC1wYWxtL2ludGVyb3AvaW50ZXJvcF9kYXRhL3N0YXJ0ZXItZGVidWcvVGFyZ2V0RGF0YVdpbmRvd3MudGR0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dzb2FwLXBhbG0vaW50ZXJvcC9pbnRlcm9wX2RhdGEvc3RhcnRlci1yZWxlYXNlL1RhcmdldERhdGFXaW5kb3dzLnRkdCBiL2dzb2FwLXBhbG0vaW50ZXJvcC9pbnRlcm9wX2RhdGEvc3RhcnRlci1yZWxlYXNlL1RhcmdldERhdGFXaW5kb3dzLnRkdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjU2MGUxCi0tLSAvZGV2L251bGwKKysrIGIvZ3NvYXAtcGFsbS9pbnRlcm9wL2ludGVyb3BfZGF0YS9zdGFydGVyLXJlbGVhc2UvVGFyZ2V0RGF0YVdpbmRvd3MudGR0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dzb2FwLXBhbG0vaW50ZXJvcC9vYmovU3RhcnRlci1kLnRtcCBiL2dzb2FwLXBhbG0vaW50ZXJvcC9vYmovU3RhcnRlci1kLnRtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3NvYXAtcGFsbS9pbnRlcm9wL29iai9TdGFydGVyLWQudG1wCmRpZmYgLS1naXQgYS9nc29hcC1wYWxtL2ludGVyb3Avb2JqL1N0YXJ0ZXIucHJjIGIvZ3NvYXAtcGFsbS9pbnRlcm9wL29iai9TdGFydGVyLnByYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODYyYjY4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3NvYXAtcGFsbS9pbnRlcm9wL29iai9TdGFydGVyLnByYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9nc29hcC1wYWxtL2ludGVyb3Avb2JqL1N0YXJ0ZXIucHJjLnBzeW0gYi9nc29hcC1wYWxtL2ludGVyb3Avb2JqL1N0YXJ0ZXIucHJjLnBzeW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJjM2M3YgotLS0gL2Rldi9udWxsCisrKyBiL2dzb2FwLXBhbG0vaW50ZXJvcC9vYmovU3RhcnRlci5wcmMucHN5bQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9nc29hcC1wYWxtL2ludGVyb3Avb2JqL1N0YXJ0ZXIudG1wIGIvZ3NvYXAtcGFsbS9pbnRlcm9wL29iai9TdGFydGVyLnRtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3NvYXAtcGFsbS9pbnRlcm9wL29iai9TdGFydGVyLnRtcApkaWZmIC0tZ2l0IGEvZ3NvYXAtcGFsbS9pbnRlcm9wL29iai9yZXNvdXJjZS5mcmsvU3RhcnRlci1kLnRtcCBiL2dzb2FwLXBhbG0vaW50ZXJvcC9vYmovcmVzb3VyY2UuZnJrL1N0YXJ0ZXItZC50bXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ4NGUyNQotLS0gL2Rldi9udWxsCisrKyBiL2dzb2FwLXBhbG0vaW50ZXJvcC9vYmovcmVzb3VyY2UuZnJrL1N0YXJ0ZXItZC50bXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3NvYXAtcGFsbS9pbnRlcm9wL29iai9yZXNvdXJjZS5mcmsvU3RhcnRlci50bXAgYi9nc29hcC1wYWxtL2ludGVyb3Avb2JqL3Jlc291cmNlLmZyay9TdGFydGVyLnRtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmEyMjA2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3NvYXAtcGFsbS9pbnRlcm9wL29iai9yZXNvdXJjZS5mcmsvU3RhcnRlci50bXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3NvYXAtcGFsbS9pbnRlcm9wL3JzYy9TdGFydGVyLnJzcmMgYi9nc29hcC1wYWxtL2ludGVyb3AvcnNjL1N0YXJ0ZXIucnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3NvYXAtcGFsbS9pbnRlcm9wL3JzYy9TdGFydGVyLnJzcmMKZGlmZiAtLWdpdCBhL2dzb2FwLXBhbG0vaW50ZXJvcC9yc2MvU3RhcnRlclJzYy5oIGIvZ3NvYXAtcGFsbS9pbnRlcm9wL3JzYy9TdGFydGVyUnNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc1ODYxZQotLS0gL2Rldi9udWxsCisrKyBiL2dzb2FwLXBhbG0vaW50ZXJvcC9yc2MvU3RhcnRlclJzYy5oCkBAIC0wLDAgKzEsOTAgQEAKKy8vCUhlYWRlciBnZW5lcmF0ZWQgYnkgQ29uc3RydWN0b3IgZm9yIFBhbG0gT1MgKFIpIDEuOAorLy8KKy8vCUdlbmVyYXRlZCBhdCA5OjE0OjM0IEFNIG9uIFdlZG5lc2RheSwgRmVicnVhcnkgMjUsIDIwMDQKKy8vCisvLwlHZW5lcmF0ZWQgZm9yIGZpbGU6IEM6XGdzb2FwLjIuNS4yXGludGVyb3BcY3dcUnNjXFN0YXJ0ZXIucnNyYworLy8KKy8vCVRISVMgSVMgQU4gQVVUT01BVElDQUxMWSBHRU5FUkFURUQgSEVBREVSIEZJTEUKKy8vCURPIE5PVCBFRElUIC0gQ0hBTkdFUyBNQURFIFRPIFRISVMgRklMRSBXSUxMIEJFIExPU1QKKy8vCisvLwlQYWxtIEFwcCBOYW1lOiAgIAkJImludGVyb3B0QSIKKy8vCisvLwlQYWxtIEFwcCBWZXJzaW9uOgkJIjEuMCIKKworCisvLwlSZXNvdXJjZTogdEZSTSAxMDAwCisjZGVmaW5lIE1haW5Gb3JtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAJLy8oTGVmdCBPcmlnaW4gPSAwLCBUb3AgT3JpZ2luID0gMCwgV2lkdGggPSAxNjAsIEhlaWdodCA9IDE2MCwgVXNhYmxlID0gMSwgTW9kYWwgPSAwLCBTYXZlIEJlaGluZCA9IDAsIEhlbHAgSUQgPSAwLCBNZW51IEJhciBJRCA9IDEwMDAsIERlZmF1bHQgQnV0dG9uIElEID0gMCkKKyNkZWZpbmUgTWFpblJ1bkFCdXR0b24gICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMQkvLyhMZWZ0IE9yaWdpbiA9IDksIFRvcCBPcmlnaW4gPSAxNDUsIFdpZHRoID0gNDAsIEhlaWdodCA9IDE0LCBVc2FibGUgPSAxLCBBbmNob3IgTGVmdCA9IDEsIEZyYW1lID0gMSwgTm9uLWJvbGQgRnJhbWUgPSAxLCBGb250ID0gU3RhbmRhcmQpCisjZGVmaW5lIE1haW5SdW5CQnV0dG9uICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDQJLy8oTGVmdCBPcmlnaW4gPSA2NSwgVG9wIE9yaWdpbiA9IDE0NSwgV2lkdGggPSA0MCwgSGVpZ2h0ID0gMTQsIFVzYWJsZSA9IDEsIEFuY2hvciBMZWZ0ID0gMSwgRnJhbWUgPSAxLCBOb24tYm9sZCBGcmFtZSA9IDEsIEZvbnQgPSBTdGFuZGFyZCkKKyNkZWZpbmUgTWFpblJ1bkNCdXR0b24gICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwNQkvLyhMZWZ0IE9yaWdpbiA9IDExMywgVG9wIE9yaWdpbiA9IDE0NSwgV2lkdGggPSA0MCwgSGVpZ2h0ID0gMTQsIFVzYWJsZSA9IDEsIEFuY2hvciBMZWZ0ID0gMSwgRnJhbWUgPSAxLCBOb24tYm9sZCBGcmFtZSA9IDEsIEZvbnQgPSBTdGFuZGFyZCkKKyNkZWZpbmUgTWFpblVubmFtZWQxMDAzTGFiZWwgICAgICAgICAgICAgICAgICAgICAgMTAwMwkvLyhMZWZ0IE9yaWdpbiA9IDgsIFRvcCBPcmlnaW4gPSAxNiwgVXNhYmxlID0gMSwgRm9udCA9IFN0YW5kYXJkKQorI2RlZmluZSBNYWluVW5uYW1lZDEwMDZMYWJlbCAgICAgICAgICAgICAgICAgICAgICAxMDA2CS8vKExlZnQgT3JpZ2luID0gOCwgVG9wIE9yaWdpbiA9IDExMiwgVXNhYmxlID0gMSwgRm9udCA9IFN0YW5kYXJkKQorI2RlZmluZSBNYWluUmVzdWx0c0xpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAyCS8vKExlZnQgT3JpZ2luID0gOCwgVG9wIE9yaWdpbiA9IDMzLCBXaWR0aCA9IDE1MCwgVXNhYmxlID0gMSwgRm9udCA9IFN0YW5kYXJkLCBWaXNpYmxlIEl0ZW1zID0gNykKKyNkZWZpbmUgTWFpblVSTExpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwOAkvLyhMZWZ0IE9yaWdpbiA9IDksIFRvcCBPcmlnaW4gPSA3MywgV2lkdGggPSAxNDIsIFVzYWJsZSA9IDAsIEZvbnQgPSBTdGFuZGFyZCwgVmlzaWJsZSBJdGVtcyA9IDYpCisjZGVmaW5lIE1haW5VUkxQb3BUcmlnZ2VyICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDcJLy8oTGVmdCBPcmlnaW4gPSA4LCBUb3AgT3JpZ2luID0gMTI4LCBXaWR0aCA9IDE1MiwgSGVpZ2h0ID0gMTYsIFVzYWJsZSA9IDEsIEFuY2hvciBMZWZ0ID0gMSwgRm9udCA9IFN0YW5kYXJkLCBMaXN0IElEID0gMTAwOCkKKworLy8JUmVzb3VyY2U6IHRGUk0gMTEwMAorI2RlZmluZSBBYm91dEZvcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAwCS8vKExlZnQgT3JpZ2luID0gMiwgVG9wIE9yaWdpbiA9IDIsIFdpZHRoID0gMTU2LCBIZWlnaHQgPSAxNTYsIFVzYWJsZSA9IDEsIE1vZGFsID0gMSwgU2F2ZSBCZWhpbmQgPSAxLCBIZWxwIElEID0gMCwgTWVudSBCYXIgSUQgPSAwLCBEZWZhdWx0IEJ1dHRvbiBJRCA9IDApCisjZGVmaW5lIEFib3V0T0tCdXR0b24gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDUJLy8oTGVmdCBPcmlnaW4gPSA1OCwgVG9wIE9yaWdpbiA9IDEzMywgV2lkdGggPSA0MCwgSGVpZ2h0ID0gMTIsIFVzYWJsZSA9IDEsIEFuY2hvciBMZWZ0ID0gMSwgRnJhbWUgPSAxLCBOb24tYm9sZCBGcmFtZSA9IDEsIEZvbnQgPSBTdGFuZGFyZCkKKyNkZWZpbmUgQWJvdXRUaXRsZUxhYmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMgkvLyhMZWZ0IE9yaWdpbiA9IDQ2LCBUb3AgT3JpZ2luID0gMjIsIFVzYWJsZSA9IDEsIEZvbnQgPSBMYXJnZSkKKyNkZWZpbmUgQWJvdXRUZXh0MUxhYmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMwkvLyhMZWZ0IE9yaWdpbiA9IDIzLCBUb3AgT3JpZ2luID0gNTQsIFVzYWJsZSA9IDEsIEZvbnQgPSBTdGFuZGFyZCkKKyNkZWZpbmUgQWJvdXRUZXh0MkxhYmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwNAkvLyhMZWZ0IE9yaWdpbiA9IDUwLCBUb3AgT3JpZ2luID0gMTA0LCBVc2FibGUgPSAxLCBGb250ID0gQm9sZCkKKworCisvLwlSZXNvdXJjZTogVGFsdCAxMDAxCisjZGVmaW5lIFJvbUluY29tcGF0aWJsZUFsZXJ0ICAgICAgICAgICAgICAgICAgICAgIDEwMDEKKyNkZWZpbmUgUm9tSW5jb21wYXRpYmxlT0sgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisKKy8vCVJlc291cmNlOiBNQkFSIDEwMDAKKyNkZWZpbmUgTWFpbkZvcm1NZW51QmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMAorCisKKy8vCVJlc291cmNlOiBNRU5VIDEwMDAKKyNkZWZpbmUgTWFpbk9wdGlvbnNNZW51ICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMAorI2RlZmluZSBNYWluT3B0aW9uc0Fib3V0U3RhcnRlckFwcCAgICAgICAgICAgICAgICAxMDAwCisKKworLy8JUmVzb3VyY2U6IFBJQ1QgMTAwMQorI2RlZmluZSBMYXJnZWljb24xYml0Qml0bWFwICAgICAgICAgICAgICAgICAgICAgICAxMDAxCisKKy8vCVJlc291cmNlOiBQSUNUIDEwMDIKKyNkZWZpbmUgTGFyZ2VpY29uMmJpdEJpdG1hcCAgICAgICAgICAgICAgICAgICAgICAgMTAwMgorCisvLwlSZXNvdXJjZTogUElDVCAxMDA4CisjZGVmaW5lIExhcmdlaWNvbjhiaXRCaXRtYXAgICAgICAgICAgICAgICAgICAgICAgIDEwMDgKKworLy8JUmVzb3VyY2U6IFBJQ1QgMTAxMQorI2RlZmluZSBTbWFsbGljb24xYml0Qml0bWFwICAgICAgICAgICAgICAgICAgICAgICAxMDExCisKKy8vCVJlc291cmNlOiBQSUNUIDEwMTIKKyNkZWZpbmUgU21hbGxpY29uMmJpdEJpdG1hcCAgICAgICAgICAgICAgICAgICAgICAgMTAxMgorCisvLwlSZXNvdXJjZTogUElDVCAxMDE4CisjZGVmaW5lIFNtYWxsaWNvbjhiaXRCaXRtYXAgICAgICAgICAgICAgICAgICAgICAgIDEwMTgKKworLy8JUmVzb3VyY2U6IFBJQ1QgMjEwMDEKKyNkZWZpbmUgTGFyZ2VpY29uWDIxYml0Qml0bWFwICAgICAgICAgICAgICAgICAgICAgMjEwMDEKKworLy8JUmVzb3VyY2U6IFBJQ1QgMjEwMDIKKyNkZWZpbmUgTGFyZ2VpY29uWDIyYml0Qml0bWFwICAgICAgICAgICAgICAgICAgICAgMjEwMDIKKworLy8JUmVzb3VyY2U6IFBJQ1QgMjEwMDgKKyNkZWZpbmUgTGFyZ2VpY29uWDI4Yml0Qml0bWFwICAgICAgICAgICAgICAgICAgICAgMjEwMDgKKworLy8JUmVzb3VyY2U6IFBJQ1QgMjEwMTEKKyNkZWZpbmUgU21hbGxpY29uWDIxYml0Qml0bWFwICAgICAgICAgICAgICAgICAgICAgMjEwMTEKKworLy8JUmVzb3VyY2U6IFBJQ1QgMjEwMTgKKyNkZWZpbmUgU21hbGxpY29uWDI4Yml0Qml0bWFwICAgICAgICAgICAgICAgICAgICAgMjEwMTgKKworLy8JUmVzb3VyY2U6IFBJQ1QgMjEwMTIKKyNkZWZpbmUgU21hbGxpY29uWDIyYml0Qml0bWFwICAgICAgICAgICAgICAgICAgICAgMjEwMTIKKworCisvLwlSZXNvdXJjZTogdGFpZiAxMDAwCisjZGVmaW5lIExhcmdlaWNvbnMxMmFuZDhiaXRzQXBwSWNvbkZhbWlseSAgICAgICAgIDEwMDAKKworLy8JUmVzb3VyY2U6IHRhaWYgMTAwMQorI2RlZmluZSBTbWFsbGljb25zMTJhbmQ4Yml0c0FwcEljb25GYW1pbHkgICAgICAgICAxMDAxCisKZGlmZiAtLWdpdCBhL2dzb2FwLXBhbG0vaW50ZXJvcC9yc2MvcmVzb3VyY2UuZnJrL1N0YXJ0ZXIucnNyYyBiL2dzb2FwLXBhbG0vaW50ZXJvcC9yc2MvcmVzb3VyY2UuZnJrL1N0YXJ0ZXIucnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGRkYjA0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3NvYXAtcGFsbS9pbnRlcm9wL3JzYy9yZXNvdXJjZS5mcmsvU3RhcnRlci5yc3JjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dzb2FwLXBhbG0vaW50ZXJvcC9zcmMvU3RhcnRlci5jcHAgYi9nc29hcC1wYWxtL2ludGVyb3Avc3JjL1N0YXJ0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYjBkODcKLS0tIC9kZXYvbnVsbAorKysgYi9nc29hcC1wYWxtL2ludGVyb3Avc3JjL1N0YXJ0ZXIuY3BwCkBAIC0wLDAgKzEsNTg2IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gICAgKEMpIENPUFlSSUdIVCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuLCAyMDAyIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKy8vICAgIExpY2Vuc2VkIE1hdGVyaWFscyAtIFByb3BlcnR5IG9mIElCTQorLy8gICAgVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IKKy8vICAgIGRpc2Nsb3N1cmUgcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuCisvLworLy8gICAgSUJNIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKKy8vICAgIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKy8vICAgIFBVUlBPU0UuIElOIE5PIEVWRU5UIFNIQUxMIElCTSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorLy8gICAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorLy8gICAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisvLyAgICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFCisvLyAgICBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorLy8KKy8vICAgIFRoZSBwcm9ncmFtIG1heSBiZSB1c2VkLCBleGVjdXRlZCwgY29waWVkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkCisvLyAgICB3aXRob3V0IHJveWFsdHkgZm9yIHRoZSBwdXJwb3NlIG9mIGRldmVsb3BpbmcsIHVzaW5nLCBtYXJrZXRpbmcsIG9yIGRpc3RyaWJ1dGluZy4KKy8vIAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgUGFsbSBDb21wdXRpbmcsIEluYy4gb3IgaXRzIHN1YnNpZGlhcmllcy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRmlsZTogU3RhcnRlci5jcHAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8UGFsbU9TLmg+CisjaW5jbHVkZSAiU3RhcnRlclJzYy5oIgorI2luY2x1ZGUgPHVuaXhfc3RyaW5nLmg+CisjaW5jbHVkZSA8dW5peF9zdGRsaWIuaD4KKworLy8jaW5jbHVkZSAiaW50ZXJvcDJILmgiICAgIC8vIGluY2x1ZGUgdGhlIGdlbmVyYXRlZCBwcm94eQorLy8jaW5jbHVkZSAiaW50ZXJvcDJCSC5oIiAgICAvLyBpbmNsdWRlIHRoZSBnZW5lcmF0ZWQgcHJveHkKKy8vI2luY2x1ZGUgImludGVyb3AyQ0guaCIgICAgLy8gaW5jbHVkZSB0aGUgZ2VuZXJhdGVkIHByb3h5CisKK2V4dGVybiAiQyIgaW50IGludGVyb3B0QShjb25zdCBjaGFyICpzaXRlKTsKK2V4dGVybiAiQyIgaW50IGludGVyb3BCKGNvbnN0IGNoYXIgKnNpdGUpOworZXh0ZXJuICJDIiBpbnQgaW50ZXJvcEMoY29uc3QgY2hhciAqc2l0ZSk7CitleHRlcm4gIkMiIHZvaWQgZGlzcGxheVRleHQoY2hhciAqdGV4dCk7Cit2b2lkIGluaXRVUkxMaXN0KCk7CitjaGFyICpnZXRTaXRlKGNoYXIgdHlwZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCUVudHJ5IFBvaW50cworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglJbnRlcm5hbCBTdHJ1Y3R1cmVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QgCisJeworCVVJbnQ4IHJlcGxhY2VtZTsKKwl9IFN0YXJ0ZXJQcmVmZXJlbmNlVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgCisJeworCVVJbnQ4IHJlcGxhY2VtZTsKKwl9IFN0YXJ0ZXJBcHBJbmZvVHlwZTsKKwordHlwZWRlZiBTdGFydGVyQXBwSW5mb1R5cGUqIFN0YXJ0ZXJBcHBJbmZvUHRyOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCUdsb2JhbCB2YXJpYWJsZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvL3N0YXRpYyBCb29sZWFuIEhpZGVTZWNyZXRSZWNvcmRzOworCitjaGFyICoqcmVzdWx0VGV4dCA7CitpbnQgcmVzdWx0TGluZXM9MDsKKworI2RlZmluZSBVUkxfQ09VTlQgNgorIGNoYXIgKiB0cnlVUkxzQVtdPXsKKyAgICJodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vaW50ZXJvcDIuY2dpIiwKKyAgICJodHRwOi8vc2VydmljZXMuc29hcGxpdGUuY29tL2ludGVyb3AuY2dpIiwKKyAgICJodHRwOi8vaW50ZXJvcC5jYXBlY2xlYXIuY29tL2NjeC9zb2FwYnVpbGRlcnMtcm91bmQyIiwKKwkiaHR0cDovL25hZ295YS5hcGFjaGUub3JnOjUwNDkvYXhpcy9zZXJ2aWNlcy9lY2hvQSIsCisJImh0dHA6Ly9lYXN5c29hcC5zb3VyY2Vmb3JnZS5uZXQvY2dpLWJpbi9pbnRlcm9wc2VydmVyIiwKKwkiaHR0cDovL3NvYXBpbnRlcm9wLnNpbWRiLmNvbS9yb3VuZDIiLAorIH07CisKKyBjaGFyICogdHJ5VVJMc0JbXT17CisgICAiaHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL2ludGVyb3AyQi5jZ2kiLAorICAgImh0dHA6Ly9zZXJ2aWNlcy5zb2FwbGl0ZS5jb20vaW50ZXJvcC5jZ2kiLAorICAgImh0dHA6Ly9pbnRlcm9wLmNhcGVjbGVhci5jb20vY2N4L3NvYXBidWlsZGVycy1yb3VuZDIiLAorICAgImh0dHA6Ly9uYWdveWEuYXBhY2hlLm9yZzo1MDQ5L2F4aXMvc2VydmljZXMvZWNob0IiLAorCSJodHRwOi8vZWFzeXNvYXAuc291cmNlZm9yZ2UubmV0L2NnaS1iaW4vaW50ZXJvcHNlcnZlciIsCisJImh0dHA6Ly9zb2FwaW50ZXJvcC5zaW1kYi5jb20vcm91bmQyQiIsCisgfTsKKworIGNoYXIgKiB0cnlVUkxzQ1tdPXsKKyAgICJodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vaW50ZXJvcDJDLmNnaSIsCisgICAiaHR0cDovL3NlcnZpY2VzLnNvYXBsaXRlLmNvbS9pbnRlcm9wLmNnaSIsCisgICAiaHR0cDovL2ludGVyb3AuY2FwZWNsZWFyLmNvbS9jY3gvc29hcGJ1aWxkZXJzLXJvdW5kMiIsCisgICAiaHR0cDovL25hZ295YS5hcGFjaGUub3JnOjUwNDkvYXhpcy9zZXJ2aWNlcy9lY2hvQiIsCisJImh0dHA6Ly9lYXN5c29hcC5zb3VyY2Vmb3JnZS5uZXQvY2dpLWJpbi9pbnRlcm9wc2VydmVyIiwKKwkiaHR0cDovL3NvYXBpbnRlcm9wLnNpbWRiLmNvbS9yb3VuZDJCIiwKKyB9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCUludGVybmFsIENvbnN0YW50cworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgYXBwRmlsZUNyZWF0b3IJCQknU1RSVCcJLy8gcmVnaXN0ZXIgeW91ciBvd24gYXQgaHR0cDovL3d3dy5wYWxtb3MuY29tL2Rldi9jcmVhdG9yaWQvCisjZGVmaW5lIGFwcFZlcnNpb25OdW0JCQkweDAxCisjZGVmaW5lIGFwcFByZWZJRAkJCQkweDAwCisjZGVmaW5lIGFwcFByZWZWZXJzaW9uTnVtCQkweDAxCisKKy8vIERlZmluZSB0aGUgbWluaW11bSBPUyB2ZXJzaW9uIHdlIHN1cHBvcnQgKDIuMCBmb3Igbm93KS4KKyNkZWZpbmUga091ck1pblZlcnNpb24Jc3lzTWFrZVJPTVZlcnNpb24oMiwwLDAsc3lzUk9NU3RhZ2VSZWxlYXNlLDApCisjZGVmaW5lIGtQYWxtT1MxMFZlcnNpb24Jc3lzTWFrZVJPTVZlcnNpb24oMSwwLDAsc3lzUk9NU3RhZ2VSZWxlYXNlLDApCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJSW50ZXJuYWwgRnVuY3Rpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgUm9tVmVyc2lvbkNvbXBhdGlibGUKKyAqCisgKiBERVNDUklQVElPTjogVGhpcyByb3V0aW5lIGNoZWNrcyB0aGF0IGEgUk9NIHZlcnNpb24gaXMgbWVldCB5b3VyCisgKiAgICAgICAgICAgICAgbWluaW11bSByZXF1aXJlbWVudC4KKyAqCisgKiBQQVJBTUVURVJTOiAgcmVxdWlyZWRWZXJzaW9uIC0gbWluaW11bSByb20gdmVyc2lvbiByZXF1aXJlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWUgc3lzRnRyTnVtUk9NVmVyc2lvbiBpbiBTeXN0ZW1NZ3IuaCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZm9ybWF0KQorICogICAgICAgICAgICAgIGxhdW5jaEZsYWdzICAgICAtIGZsYWdzIHRoYXQgaW5kaWNhdGUgaWYgdGhlIGFwcGxpY2F0aW9uIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJIGlzIGluaXRpYWxpemVkLgorICoKKyAqIFJFVFVSTkVEOiAgICBlcnJvciBjb2RlIG9yIHplcm8gaWYgcm9tIGlzIGNvbXBhdGlibGUKKyAqCisgKiBSRVZJU0lPTiBISVNUT1JZOgorICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgRXJyIFJvbVZlcnNpb25Db21wYXRpYmxlKFVJbnQzMiByZXF1aXJlZFZlcnNpb24sIFVJbnQxNiBsYXVuY2hGbGFncykKK3sKKwlVSW50MzIgcm9tVmVyc2lvbjsKKwkvLyBTZWUgaWYgd2UncmUgb24gaW4gbWluaW11bSByZXF1aXJlZCB2ZXJzaW9uIG9mIHRoZSBST00gb3IgbGF0ZXIuCisJRnRyR2V0KHN5c0Z0ckNyZWF0b3IsIHN5c0Z0ck51bVJPTVZlcnNpb24sICZyb21WZXJzaW9uKTsKKwlpZiAocm9tVmVyc2lvbiA8IHJlcXVpcmVkVmVyc2lvbikKKwkJeworCQlpZiAoKGxhdW5jaEZsYWdzICYgKHN5c0FwcExhdW5jaEZsYWdOZXdHbG9iYWxzIHwgc3lzQXBwTGF1bmNoRmxhZ1VJQXBwKSkgPT0KKwkJCShzeXNBcHBMYXVuY2hGbGFnTmV3R2xvYmFscyB8IHN5c0FwcExhdW5jaEZsYWdVSUFwcCkpCisJCQl7CisJCQlGcm1BbGVydCAoUm9tSW5jb21wYXRpYmxlQWxlcnQpOworCQkKKwkJCS8vIFBhbG0gT1MgMS4wIHdpbGwgY29udGludW91c2x5IHJlbGF1bmNoIHRoaXMgYXBwIHVubGVzcyB3ZSBzd2l0Y2ggdG8gCisJCQkvLyBhbm90aGVyIHNhZmUgb25lLgorCQkJaWYgKHJvbVZlcnNpb24gPD0ga1BhbG1PUzEwVmVyc2lvbikKKwkJCQl7CisJCQkJQXBwTGF1bmNoV2l0aENvbW1hbmQoc3lzRmlsZUNEZWZhdWx0QXBwLCBzeXNBcHBMYXVuY2hDbWROb3JtYWxMYXVuY2gsIE5VTEwpOworCQkJCX0KKwkJCX0KKwkJCisJCXJldHVybiBzeXNFcnJSb21JbmNvbXBhdGlibGU7CisJCX0KKworCXJldHVybiBlcnJOb25lOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBHZXRPYmplY3RQdHIKKyAqCisgKiBERVNDUklQVElPTjogVGhpcyByb3V0aW5lIHJldHVybnMgYSBwb2ludGVyIHRvIGFuIG9iamVjdCBpbiB0aGUgY3VycmVudAorICogICAgICAgICAgICAgIGZvcm0uCisgKgorICogUEFSQU1FVEVSUzogIGZvcm1JZCAtIGlkIG9mIHRoZSBmb3JtIHRvIGRpc3BsYXkKKyAqCisgKiBSRVRVUk5FRDogICAgdm9pZCAqCisgKgorICogUkVWSVNJT04gSElTVE9SWToKKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgKiBHZXRPYmplY3RQdHIoVUludDE2IG9iamVjdElEKQoreworCUZvcm1QdHIgZnJtUDsKKworCWZybVAgPSBGcm1HZXRBY3RpdmVGb3JtKCk7CisJcmV0dXJuIEZybUdldE9iamVjdFB0cihmcm1QLCBGcm1HZXRPYmplY3RJbmRleChmcm1QLCBvYmplY3RJRCkpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBNYWluRm9ybUluaXQKKyAqCisgKiBERVNDUklQVElPTjogVGhpcyByb3V0aW5lIGluaXRpYWxpemVzIHRoZSBNYWluRm9ybSBmb3JtLgorICoKKyAqIFBBUkFNRVRFUlM6ICBmcm0gLSBwb2ludGVyIHRvIHRoZSBNYWluRm9ybSBmb3JtLgorICoKKyAqIFJFVFVSTkVEOiAgICBub3RoaW5nCisgKgorICogUkVWSVNJT04gSElTVE9SWToKKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgTWFpbkZvcm1Jbml0KEZvcm1QdHIgLypmcm1QKi8pCit7CisgaW5pdFVSTExpc3QoKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgTWFpbkZvcm1Eb0NvbW1hbmQKKyAqCisgKiBERVNDUklQVElPTjogVGhpcyByb3V0aW5lIHBlcmZvcm1zIHRoZSBtZW51IGNvbW1hbmQgc3BlY2lmaWVkLgorICoKKyAqIFBBUkFNRVRFUlM6ICBjb21tYW5kICAtIG1lbnUgaXRlbSBpZAorICoKKyAqIFJFVFVSTkVEOiAgICBub3RoaW5nCisgKgorICogUkVWSVNJT04gSElTVE9SWToKKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEJvb2xlYW4gTWFpbkZvcm1Eb0NvbW1hbmQoVUludDE2IGNvbW1hbmQpCit7CisJQm9vbGVhbiBoYW5kbGVkID0gZmFsc2U7CisJRm9ybVB0ciBmcm1QOworCisJc3dpdGNoIChjb21tYW5kKQorCQl7CisJCWNhc2UgTWFpbk9wdGlvbnNBYm91dFN0YXJ0ZXJBcHA6CisJCQlNZW51RXJhc2VTdGF0dXMoMCk7CQkJCQkvLyBDbGVhciB0aGUgbWVudSBzdGF0dXMgZnJvbSB0aGUgZGlzcGxheS4KKwkJCWZybVAgPSBGcm1Jbml0Rm9ybSAoQWJvdXRGb3JtKTsKKwkJCUZybURvRGlhbG9nIChmcm1QKTsJCQkJCS8vIERpc3BsYXkgdGhlIEFib3V0IEJveC4KKwkJCUZybURlbGV0ZUZvcm0gKGZybVApOworCQkJaGFuZGxlZCA9IHRydWU7CisJCQlicmVhazsKKworCQl9CisJCisJcmV0dXJuIGhhbmRsZWQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIE1haW5Gb3JtSGFuZGxlRXZlbnQKKyAqCisgKiBERVNDUklQVElPTjogVGhpcyByb3V0aW5lIGlzIHRoZSBldmVudCBoYW5kbGVyIGZvciB0aGUgCisgKiAgICAgICAgICAgICAgIk1haW5Gb3JtIiBvZiB0aGlzIGFwcGxpY2F0aW9uLgorICoKKyAqIFBBUkFNRVRFUlM6ICBldmVudFAgIC0gYSBwb2ludGVyIHRvIGFuIEV2ZW50VHlwZSBzdHJ1Y3R1cmUKKyAqCisgKiBSRVRVUk5FRDogICAgdHJ1ZSBpZiB0aGUgZXZlbnQgaGFzIGhhbmRsZSBhbmQgc2hvdWxkIG5vdCBiZSBwYXNzZWQKKyAqICAgICAgICAgICAgICB0byBhIGhpZ2hlciBsZXZlbCBoYW5kbGVyLgorICoKKyAqIFJFVklTSU9OIEhJU1RPUlk6CisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBCb29sZWFuIE1haW5Gb3JtSGFuZGxlRXZlbnQoRXZlbnRQdHIgZXZlbnRQKQoreworCUJvb2xlYW4gaGFuZGxlZCA9IGZhbHNlOworCUZvcm1QdHIgZnJtUDsKKworCXN3aXRjaCAoZXZlbnRQLT5lVHlwZSkgCisJCXsKKwkJY2FzZSBtZW51RXZlbnQ6CisJCQlyZXR1cm4gTWFpbkZvcm1Eb0NvbW1hbmQoZXZlbnRQLT5kYXRhLm1lbnUuaXRlbUlEKTsKKworCQljYXNlIGZybU9wZW5FdmVudDoKKwkJCWZybVAgPSBGcm1HZXRBY3RpdmVGb3JtKCk7CisJCQlNYWluRm9ybUluaXQoIGZybVApOworCQkJRnJtRHJhd0Zvcm0gKCBmcm1QKTsKKwkJCWhhbmRsZWQgPSB0cnVlOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBmcm1VcGRhdGVFdmVudDoKKwkJCS8vIFRvIGRvIGFueSBjdXN0b20gZHJhd2luZyBoZXJlLCBmaXJzdCBjYWxsIEZybURyYXdGb3JtKCksIHRoZW4gZG8geW91cgorCQkJLy8gZHJhd2luZywgYW5kIHRoZW4gc2V0IGhhbmRsZWQgdG8gdHJ1ZS4KKwkJCWJyZWFrOworCisJCWNhc2UgY3RsU2VsZWN0RXZlbnQ6CisJCQlzd2l0Y2ggKGV2ZW50UC0+ZGF0YS5jdGxTZWxlY3QuY29udHJvbElEKQorCQkJeworCQkJCWNhc2UgTWFpblJ1bkFCdXR0b246CisJCQkJCWludGVyb3B0QShnZXRTaXRlKCdBJykpOworCQkJCQlicmVhazsKKwkJCQljYXNlIE1haW5SdW5CQnV0dG9uOgorCQkJCQlpbnRlcm9wQihnZXRTaXRlKCdCJykpOworCQkJCQlicmVhazsKKwkJCQljYXNlIE1haW5SdW5DQnV0dG9uOgorCQkJCQlpbnRlcm9wQyhnZXRTaXRlKCdDJykpOworCQkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJCisJCX0KKwkKKwlyZXR1cm4gaGFuZGxlZDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgQXBwSGFuZGxlRXZlbnQKKyAqCisgKiBERVNDUklQVElPTjogVGhpcyByb3V0aW5lIGxvYWRzIGZvcm0gcmVzb3VyY2VzIGFuZCBzZXQgdGhlIGV2ZW50CisgKiAgICAgICAgICAgICAgaGFuZGxlciBmb3IgdGhlIGZvcm0gbG9hZGVkLgorICoKKyAqIFBBUkFNRVRFUlM6ICBldmVudCAgLSBhIHBvaW50ZXIgdG8gYW4gRXZlbnRUeXBlIHN0cnVjdHVyZQorICoKKyAqIFJFVFVSTkVEOiAgICB0cnVlIGlmIHRoZSBldmVudCBoYXMgaGFuZGxlIGFuZCBzaG91bGQgbm90IGJlIHBhc3NlZAorICogICAgICAgICAgICAgIHRvIGEgaGlnaGVyIGxldmVsIGhhbmRsZXIuCisgKgorICogUkVWSVNJT04gSElTVE9SWToKKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEJvb2xlYW4gQXBwSGFuZGxlRXZlbnQoRXZlbnRQdHIgZXZlbnRQKQoreworCVVJbnQxNiBmb3JtSWQ7CisJRm9ybVB0ciBmcm1QOworCisJaWYgKGV2ZW50UC0+ZVR5cGUgPT0gZnJtTG9hZEV2ZW50KQorCQl7CisJCS8vIExvYWQgdGhlIGZvcm0gcmVzb3VyY2UuCisJCWZvcm1JZCA9IGV2ZW50UC0+ZGF0YS5mcm1Mb2FkLmZvcm1JRDsKKwkJZnJtUCA9IEZybUluaXRGb3JtKGZvcm1JZCk7CisJCUZybVNldEFjdGl2ZUZvcm0oZnJtUCk7CisKKwkJLy8gU2V0IHRoZSBldmVudCBoYW5kbGVyIGZvciB0aGUgZm9ybS4gIFRoZSBoYW5kbGVyIG9mIHRoZSBjdXJyZW50bHkKKwkJLy8gYWN0aXZlIGZvcm0gaXMgY2FsbGVkIGJ5IEZybUhhbmRsZUV2ZW50IGVhY2ggdGltZSBpcyByZWNlaXZlcyBhbgorCQkvLyBldmVudC4KKwkJc3dpdGNoIChmb3JtSWQpCisJCQl7CisJCQljYXNlIE1haW5Gb3JtOgorCQkJCisJCQkgICAgc3dpdGNoIChldmVudFAtPmRhdGEuY3RsU2VsZWN0LmNvbnRyb2xJRCkKKwkJICAgICAgICB7CisvLwkJCSAgICAgICAgY2FzZSBJbnRlcm9wdEFSdW5BbGw6CisvLwkJCSAgICAgICAgaW50ZXJvcHRBKDEpOworLy8JCQkJICAgIGJyZWFrOworCQkgICAgICAgIH0KKwkJCQorCQkJCUZybVNldEV2ZW50SGFuZGxlcihmcm1QLCBNYWluRm9ybUhhbmRsZUV2ZW50KTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKy8vCQkJCUVyckZhdGFsRGlzcGxheSgiSW52YWxpZCBGb3JtIExvYWQgRXZlbnQiKTsKKwkJCQlicmVhazsKKworCQkJfQorCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQorCXJldHVybiBmYWxzZTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgQXBwRXZlbnRMb29wCisgKgorICogREVTQ1JJUFRJT046IFRoaXMgcm91dGluZSBpcyB0aGUgZXZlbnQgbG9vcCBmb3IgdGhlIGFwcGxpY2F0aW9uLiAgCisgKgorICogUEFSQU1FVEVSUzogIG5vdGhpbmcKKyAqCisgKiBSRVRVUk5FRDogICAgbm90aGluZworICoKKyAqIFJFVklTSU9OIEhJU1RPUlk6CisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIEFwcEV2ZW50TG9vcCh2b2lkKQoreworCVVJbnQxNiBlcnJvcjsKKwlFdmVudFR5cGUgZXZlbnQ7CisKKwlkbyB7CisJCUV2dEdldEV2ZW50KCZldmVudCwgZXZ0V2FpdEZvcmV2ZXIpOworCisJCWlmICghIFN5c0hhbmRsZUV2ZW50KCZldmVudCkpCisJCQlpZiAoISBNZW51SGFuZGxlRXZlbnQoMCwgJmV2ZW50LCAmZXJyb3IpKQorCQkJCWlmICghIEFwcEhhbmRsZUV2ZW50KCZldmVudCkpCisJCQkJCUZybURpc3BhdGNoRXZlbnQoJmV2ZW50KTsKKworCX0gd2hpbGUgKGV2ZW50LmVUeXBlICE9IGFwcFN0b3BFdmVudCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgICBBcHBTdGFydAorICoKKyAqIERFU0NSSVBUSU9OOiAgR2V0IHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uJ3MgcHJlZmVyZW5jZXMuCisgKgorICogUEFSQU1FVEVSUzogICBub3RoaW5nCisgKgorICogUkVUVVJORUQ6ICAgICBFcnIgdmFsdWUgMCBpZiBub3RoaW5nIHdlbnQgd3JvbmcKKyAqCisgKiBSRVZJU0lPTiBISVNUT1JZOgorICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgRXJyIEFwcFN0YXJ0KHZvaWQpCit7CisJU3RhcnRlclByZWZlcmVuY2VUeXBlIHByZWZzOworCVVJbnQxNiBwcmVmc1NpemU7CisKKwkvLyBSZWFkIHRoZSBzYXZlZCBwcmVmZXJlbmNlcyAvIHNhdmVkLXN0YXRlIGluZm9ybWF0aW9uLgorCXByZWZzU2l6ZSA9IHNpemVvZihTdGFydGVyUHJlZmVyZW5jZVR5cGUpOworCWlmIChQcmVmR2V0QXBwUHJlZmVyZW5jZXMoYXBwRmlsZUNyZWF0b3IsIGFwcFByZWZJRCwgJnByZWZzLCAmcHJlZnNTaXplLCB0cnVlKSAhPSAKKwkJbm9QcmVmZXJlbmNlRm91bmQpCisJCXsKKwkJfQorCQorCXJldHVybiBlcnJOb25lOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBBcHBTdG9wCisgKgorICogREVTQ1JJUFRJT046IFNhdmUgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGFwcGxpY2F0aW9uLgorICoKKyAqIFBBUkFNRVRFUlM6ICBub3RoaW5nCisgKgorICogUkVUVVJORUQ6ICAgIG5vdGhpbmcKKyAqCisgKiBSRVZJU0lPTiBISVNUT1JZOgorICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBBcHBTdG9wKHZvaWQpCit7CisJU3RhcnRlclByZWZlcmVuY2VUeXBlIHByZWZzOworCisJLy8gV3JpdGUgdGhlIHNhdmVkIHByZWZlcmVuY2VzIC8gc2F2ZWQtc3RhdGUgaW5mb3JtYXRpb24uICBUaGlzIGRhdGEgCisJLy8gd2lsbCBzYXZlZCBkdXJpbmcgYSBIb3RTeW5jIGJhY2t1cC4KKwlQcmVmU2V0QXBwUHJlZmVyZW5jZXMgKGFwcEZpbGVDcmVhdG9yLCBhcHBQcmVmSUQsIGFwcFByZWZWZXJzaW9uTnVtLCAKKwkJJnByZWZzLCBzaXplb2YgKHByZWZzKSwgdHJ1ZSk7CisJCQorCS8vIENsb3NlIGFsbCB0aGUgb3BlbiBmb3Jtcy4KKwlGcm1DbG9zZUFsbEZvcm1zICgpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBTdGFydGVyUGFsbU1haW4KKyAqCisgKiBERVNDUklQVElPTjogVGhpcyBpcyB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIGFwcGxpY2F0aW9uLgorICoKKyAqIFBBUkFNRVRFUlM6ICBjbWQgLSB3b3JkIHZhbHVlIHNwZWNpZnlpbmcgdGhlIGxhdW5jaCBjb2RlLiAKKyAqICAgICAgICAgICAgICBjbWRQQiAtIHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGxhdW5jaCBjb2RlLiAKKyAqICAgICAgICAgICAgICBsYXVuY2hGbGFncyAtICB3b3JkIHZhbHVlIHByb3ZpZGluZyBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbGF1bmNoLgorICoKKyAqIFJFVFVSTkVEOiAgICBSZXN1bHQgb2YgbGF1bmNoCisgKgorICogUkVWSVNJT04gSElTVE9SWToKKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFVJbnQzMiBTdGFydGVyUGFsbU1haW4oVUludDE2IGNtZCwgTWVtUHRyIC8qY21kUEJQKi8sIFVJbnQxNiBsYXVuY2hGbGFncykKK3sKKwlFcnIgZXJyb3I7CisKKwllcnJvciA9IFJvbVZlcnNpb25Db21wYXRpYmxlIChrT3VyTWluVmVyc2lvbiwgbGF1bmNoRmxhZ3MpOworCWlmIChlcnJvcikgcmV0dXJuIChlcnJvcik7CisKKwlzd2l0Y2ggKGNtZCkKKwkJeworCQljYXNlIHN5c0FwcExhdW5jaENtZE5vcm1hbExhdW5jaDoKKwkJCWVycm9yID0gQXBwU3RhcnQoKTsKKwkJCWlmIChlcnJvcikgCisJCQkJcmV0dXJuIGVycm9yOworCQkJCQorCQkJRnJtR290b0Zvcm0oTWFpbkZvcm0pOworCQkJQXBwRXZlbnRMb29wKCk7CisJCQlBcHBTdG9wKCk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisKKwkJfQorCQorCXJldHVybiBlcnJOb25lOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBQaWxvdE1haW4KKyAqCisgKiBERVNDUklQVElPTjogVGhpcyBpcyB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIGFwcGxpY2F0aW9uLgorICoKKyAqIFBBUkFNRVRFUlM6ICBjbWQgLSB3b3JkIHZhbHVlIHNwZWNpZnlpbmcgdGhlIGxhdW5jaCBjb2RlLiAKKyAqICAgICAgICAgICAgICBjbWRQQiAtIHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGxhdW5jaCBjb2RlLiAKKyAqICAgICAgICAgICAgICBsYXVuY2hGbGFncyAtICB3b3JkIHZhbHVlIHByb3ZpZGluZyBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbGF1bmNoLgorICogUkVUVVJORUQ6ICAgIFJlc3VsdCBvZiBsYXVuY2gKKyAqCisgKiBSRVZJU0lPTiBISVNUT1JZOgorICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitVSW50MzIgUGlsb3RNYWluKCBVSW50MTYgY21kLCBNZW1QdHIgY21kUEJQLCBVSW50MTYgbGF1bmNoRmxhZ3MpCit7CisvLyBpbnQgaTE9c2l6ZW9mKHNpemVfdCk7CisvLyBpbnQgaTI9c2l6ZW9mKGludCk7CisvLyBpbnQgaTM9c2l6ZW9mKHN0cnVjdCB4c2RfX2Jhc2U2NEJpbmFyeSk7CisJcmV0dXJuIFN0YXJ0ZXJQYWxtTWFpbihjbWQsIGNtZFBCUCwgbGF1bmNoRmxhZ3MpOworfQorCit2b2lkIGRpc3BsYXlUZXh0KGNoYXIgKnRleHQpCit7CisJTGlzdFB0ciBsc3Q7CisgICBjaGFyICoqIG5ld1RleHQ7CisgICBjaGFyICpzdHIgPShjaGFyKikgbWFsbG9jKDErU3RyTGVuKHRleHQpKTsKKyAgIHN0cmNweShzdHIsdGV4dCk7CisgIGludCBpPTA7CisgIGlmIChyZXN1bHRMaW5lcz09MCkKKyAgeworICAgIG5ld1RleHQgPSAoY2hhcioqKW1hbGxvYyhzaXplb2Yodm9pZCopKTsKKyAgfSAKKyAgZWxzZQorICB7CisgICAgaW50IHNpemU9ICByZXN1bHRMaW5lcypzaXplb2Yodm9pZCopOworICAgIG5ld1RleHQgPShjaGFyKiopIG1hbGxvYyhzaXplK3NpemVvZih2b2lkKikpOworICAgIG1lbWNweShuZXdUZXh0LHJlc3VsdFRleHQsc2l6ZSk7CisgIH0KKyAgCisgIG5ld1RleHRbcmVzdWx0TGluZXNdPXN0cjsKKyAgcmVzdWx0TGluZXMrKzsKKyAgcmVzdWx0VGV4dD1uZXdUZXh0OworCisJbHN0ID0gKExpc3RQdHIpIEdldE9iamVjdFB0cihNYWluUmVzdWx0c0xpc3QpOworCisJTHN0U2V0TGlzdENob2ljZXMobHN0LCByZXN1bHRUZXh0LCByZXN1bHRMaW5lcyk7CisJaWYgKHJlc3VsdExpbmVzPjUpCisJICBMc3RTZXRUb3BJdGVtKGxzdCxyZXN1bHRMaW5lcy01KTsKKwlMc3REcmF3TGlzdChsc3QpOworCit9CisKKworY2hhciAqZ2V0U2l0ZShjaGFyIHR5cGUpCit7CisgIGludCBsaXN0SW5kZXg7CisgIGxpc3RJbmRleCA9IExzdEdldFNlbGVjdGlvbigoTGlzdFB0cilHZXRPYmplY3RQdHIoTWFpblVSTExpc3QpKTsKKyAgaWYgKHR5cGU9PSdBJykgcmV0dXJuIHRyeVVSTHNBW2xpc3RJbmRleF07CisgIGlmICh0eXBlPT0nQicpIHJldHVybiB0cnlVUkxzQltsaXN0SW5kZXhdOworICBpZiAodHlwZT09J0MnKSByZXR1cm4gdHJ5VVJMc0NbbGlzdEluZGV4XTsKKyAgCisgIC8vIFNob3VsZG4ndCBldmVyIGdldCB0byB0aGlzIHBvaW50LiBKdXN0IHJldHVybiBBIGxpc3QKKyAgcmV0dXJuIHRyeVVSTHNBW2xpc3RJbmRleF07Cit9CisKK3ZvaWQgaW5pdFVSTExpc3QoKQoreworCUNvbnRyb2xQdHIgY3RsOworCUxpc3RQdHIgbHN0OworLy8JVUludDMyCWRlZmF1bHRJRDsKKworCWN0bCA9IChDb250cm9sUHRyKUdldE9iamVjdFB0cihNYWluVVJMUG9wVHJpZ2dlcik7CisJbHN0ID0gKExpc3RQdHIpR2V0T2JqZWN0UHRyKE1haW5VUkxMaXN0KTsKKworCUxzdFNldExpc3RDaG9pY2VzKGxzdCwgdHJ5VVJMc0EsIFVSTF9DT1VOVCk7CisJTHN0U2V0SGVpZ2h0KGxzdCwgMTApOworCUN0bFNldExhYmVsIChjdGwsIHRyeVVSTHNBWzBdKTsKK30KKwpkaWZmIC0tZ2l0IGEvZ3NvYXAtcGFsbS9pbnRlcm9wL3NyYy9pbnRlcm9wMkJ0ZXN0LmNwcCBiL2dzb2FwLXBhbG0vaW50ZXJvcC9zcmMvaW50ZXJvcDJCdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U4MGZjNgotLS0gL2Rldi9udWxsCisrKyBiL2dzb2FwLXBhbG0vaW50ZXJvcC9zcmMvaW50ZXJvcDJCdGVzdC5jcHAKQEAgLTAsMCArMSwyMTEgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyAgICAoQykgQ09QWVJJR0hUIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDIgQWxsIFJpZ2h0cyBSZXNlcnZlZAorLy8gICAgTGljZW5zZWQgTWF0ZXJpYWxzIC0gUHJvcGVydHkgb2YgSUJNCisvLyAgICBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvcgorLy8gICAgZGlzY2xvc3VyZSByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KKy8vCisvLyAgICBJQk0gRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORworLy8gICAgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorLy8gICAgUFVSUE9TRS4gSU4gTk8gRVZFTlQgU0hBTEwgSUJNIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisvLyAgICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisvLyAgICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKy8vICAgIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UKKy8vICAgIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisvLworLy8gICAgVGhlIHByb2dyYW0gbWF5IGJlIHVzZWQsIGV4ZWN1dGVkLCBjb3BpZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQKKy8vICAgIHdpdGhvdXQgcm95YWx0eSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGV2ZWxvcGluZywgdXNpbmcsIG1hcmtldGluZywgb3IgZGlzdHJpYnV0aW5nLgorLy8gCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gZ1NPQVAgdjIgSW50ZXJvcCBCIHRlc3Qgcm91bmQgMgorI2luY2x1ZGUgInNvYXBILmgiCitleHRlcm4gIkMiIHZvaWQgZGlzcGxheVRleHQoY2hhciAqdGV4dCk7CitleHRlcm4gIkMiIGludCBpbnRlcm9wQihjb25zdCBjaGFyICpzaXRlKTsKKworaW50IGludGVyb3BCKGNvbnN0IGNoYXIgKnVybCkKK3sKKyAgc3RydWN0IHNvYXAgKnNvYXA7CisgIGNoYXIgKnNpdGU9KGNoYXIqKXVybDsKKy8vICBjaGFyKiBzaXRlID0iaHR0cDovL3dlYnNydi5jcy5mc3UuZWR1L35lbmdlbGVuL2ludGVyb3AyQi5jZ2kiOworICBjaGFyKiBhY3Rpb24gPSAiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iOworICAKKyAgYm9vbCBvaz10cnVlOworICBpbnQgaSwgZzsKKyAgeHNkX19zdHJpbmcgcyA9ICJIZWxsbyBXb3JsZCEgPD4mIjsKKyAgeHNkX19pbnQgbiA9IDIxNDc0ODM2NDc7CisgIHhzZF9fZmxvYXQgZiA9IDMuNDAyODJlKzM4OworICBzdHJ1Y3QgQXJyYXlPZnN0cmluZyBhOworICBzdHJ1Y3QgQXJyYXlPZnN0cmluZzJEIGFhaTsKKyAgc3RydWN0IEFycmF5T2ZzdHJpbmcyRCBhYW87CisKKyAgc3RydWN0IHNfX1NPQVBTdHJ1Y3Qgc3RpOworICBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBc1NpbXBsZVR5cGVzUmVzcG9uc2UgUm87CisgIHN0cnVjdCBuc19fZWNob1NpbXBsZVR5cGVzQXNTdHJ1Y3RSZXNwb25zZSBSc3RvOworICBzdHJ1Y3Qgc19fU09BUFN0cnVjdFN0cnVjdCBzc3RpOworICBzdHJ1Y3QgbnNfX2VjaG9OZXN0ZWRTdHJ1Y3RSZXNwb25zZSBSc3N0bzsKKyAgc3RydWN0IHNfX1NPQVBBcnJheVN0cnVjdCBzYXRpOworICBzdHJ1Y3QgbnNfX2VjaG9OZXN0ZWRBcnJheVJlc3BvbnNlIFJzYXRvOworCisgIGRpc3BsYXlUZXh0KCJydW5uaW5nIHRlc3QgQiBvbiIpOworICBkaXNwbGF5VGV4dCgoY2hhciopdXJsKTsKKyAgc29hcCA9IHNvYXBfbmV3KCk7CisgIHNvYXAtPm5hbWVzcGFjZXMgPSAoc3RydWN0IE5hbWVzcGFjZSAqKW5hbWVzcGFjZXM7CisKKy8vICBGSUxFICpmZCA9IGZvcGVuKCJpbnRlcm9wMkJmYXVsdHMuaHRtbCIsICJhIik7CisKKy8vICBzb2FwX2luaXQoJnNvYXApOworCisgIHNvYXAtPnNlbmRfdGltZW91dCA9IDMwOworICBzb2FwLT5yZWN2X3RpbWVvdXQgPSAzMDsKKworICBzdGkudmFyU3RyaW5nID0gIkhlbGxvIjsKKyAgc3RpLnZhckludCA9ICZuOworICBzdGkudmFyRmxvYXQgPSAmZjsKKworICBzc3RpLnZhclN0cmluZyA9ICJTT0FQISI7CisgIHNzdGkudmFySW50ID0gJm47CisgIHNzdGkudmFyRmxvYXQgPSAmZjsKKyAgc3N0aS52YXJTdHJ1Y3QgPSAmc3RpOworCisgIGEuX19zaXplID0gNTsKKyAgYS5fX29mZnNldCA9IDI7CisgIGEuX19wdHIgPSAoY2hhcioqKW1hbGxvYyhhLl9fc2l6ZSpzaXplb2YoY2hhciopKTsKKyAgYS5fX3B0clswXSA9ICJJbnRlcm9wIjsKKyAgYS5fX3B0clsxXSA9ICJUZXN0IjsKKyAgYS5fX3B0clsyXSA9ICJSb3VuZCI7CisgIGEuX19wdHJbM10gPSAiMiI7CisgIGEuX19wdHJbNF0gPSBhLl9fcHRyWzFdOworCisgIGFhaS5fX3NpemVbMF0gPSAyOworICBhYWkuX19zaXplWzFdID0gMzsKKyAgYWFpLl9fb2Zmc2V0WzBdID0gMDsKKyAgYWFpLl9fb2Zmc2V0WzFdID0gMDsKKyAgYWFpLl9fcHRyID0gKGNoYXIqKiltYWxsb2MoYWFpLl9fc2l6ZVswXSphYWkuX19zaXplWzFdKnNpemVvZihjaGFyKikpOworICBhYWkuX19wdHJbMF0gPSAiSW50ZXJvcCBUZXN0IjsKKyAgYWFpLl9fcHRyWzFdID0gTlVMTDsKKyAgYWFpLl9fcHRyWzJdID0gIlJvdW5kIjsKKyAgYWFpLl9fcHRyWzNdID0gIjIiOworICBhYWkuX19wdHJbNF0gPSBhLl9fcHRyWzFdOworICBhYWkuX19wdHJbNV0gPSBOVUxMOworCisgIHNhdGkudmFyU3RyaW5nID0gYS5fX3B0clswXTsKKyAgc2F0aS52YXJJbnQgPSAmbjsKKyAgc2F0aS52YXJGbG9hdCA9ICZmOworICBzYXRpLnZhckFycmF5ID0gYTsKKyAgIAorICBpZiAoc29hcF9jYWxsX25zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlcyhzb2FwLCBzaXRlLCAiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLCBzdGksIFJvKSkKKyAgeyAKKyAgICBkaXNwbGF5VGV4dCgiZWNob1N0cnVjdEFzU2ltcGxlVHlwZXMgZmFpbGVkIik7CisgICAgb2s9ZmFsc2U7CisgIH0gIGVsc2UgaWYgKCFSby5fb3V0cHV0U3RyaW5nIHx8IHN0cmNtcChzdGkudmFyU3RyaW5nLCBSby5fb3V0cHV0U3RyaW5nKSB8fCAhUm8uX291dHB1dEludGVnZXIgfHwgKnN0aS52YXJJbnQgIT0gKlJvLl9vdXRwdXRJbnRlZ2VyCisgIHx8ICFSby5fb3V0cHV0RmxvYXQgfHwgKnN0aS52YXJGbG9hdCAhPSAqUm8uX291dHB1dEZsb2F0KQorICB7CisgIAlkaXNwbGF5VGV4dCgiZWNob1N0cnVjdEFzU2ltcGxlVHlwZXMgbWlzbWF0Y2hlZCIpOworICAgIG9rPWZhbHNlOworICB9CisgIGVsc2UKKyAgCWRpc3BsYXlUZXh0KCJlY2hvU3RydWN0QXNTaW1wbGVUeXBlcyBwYXNzZWQiKTsKKworICBpZiAoc29hcF9jYWxsX25zX19lY2hvU2ltcGxlVHlwZXNBc1N0cnVjdChzb2FwLCBzaXRlLCAiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLCBzLCAmbiwgJmYsIFJzdG8pKQorICB7IAorICAgIGRpc3BsYXlUZXh0KCJlY2hvU2ltcGxlVHlwZXNBc1N0cnVjdCBmYWlsZWQiKTsKKyAgICBvaz1mYWxzZTsKKyAgfQorICBlbHNlIGlmICghUnN0by5fcmV0dXJuLnZhclN0cmluZyB8fCBzdHJjbXAocywgUnN0by5fcmV0dXJuLnZhclN0cmluZykgfHwgIVJzdG8uX3JldHVybi52YXJJbnQgfHwgbiAhPSAqUnN0by5fcmV0dXJuLnZhckludCB8fCAhUnN0by5fcmV0dXJuLnZhckZsb2F0IHx8IGYgIT0gKlJzdG8uX3JldHVybi52YXJGbG9hdCkKKyAgeworICAJZGlzcGxheVRleHQoImVjaG9TaW1wbGVUeXBlc0FzU3RydWN0IG1pc21hdGNoZWQiKTsKKyAgICBvaz1mYWxzZTsKKyAgfQorICBlbHNlCisgIAlkaXNwbGF5VGV4dCgiZWNob1NpbXBsZVR5cGVzQXNTdHJ1Y3QgcGFzc2VkIik7CisKKyAgaWYgKHNvYXBfY2FsbF9uc19fZWNobzJEU3RyaW5nQXJyYXkoc29hcCxzaXRlLCAiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLCBhYWksIGFhbykpCisgIHsgCisgICAgZGlzcGxheVRleHQoImVjaG8yRFN0cmluZ0FycmF5IGZhaWxlZCIpOworICAgIG9rPWZhbHNlOworICB9CisgIGVsc2UKKyAgeyBnID0gMDsKKyAgICBpZiAoYWFpLl9fc2l6ZVswXSAhPSBhYW8uX19zaXplWzBdIHx8IGFhaS5fX3NpemVbMV0gIT0gYWFvLl9fc2l6ZVsxXSB8fCAhYWFvLl9fcHRyKQorICAgICAgZyA9IDE7CisgICAgZWxzZQorICAgICAgZm9yIChpID0gMDsgaSA8IGFhaS5fX3NpemVbMF0qYWFpLl9fc2l6ZVsxXTsgaSsrKQorICAgICAgICBpZiAoYWFpLl9fcHRyW2ldICYmICghYWFvLl9fcHRyW2ldIHx8IHN0cmNtcChhYWkuX19wdHJbaV0sIGFhby5fX3B0cltpXSkpKQorCSAgZyA9IDE7CisgICAgaWYgKGcpCisgICAgeworICAgIAlkaXNwbGF5VGV4dCgiZWNobzJEU3RyaW5nQXJyYXkgbWlzbWF0Y2hlZCIpOworICAgIG9rPWZhbHNlOworICAgIH0KKyAgICBlbHNlCisJICAJZGlzcGxheVRleHQoImVjaG8yRFN0cmluZ0FycmF5IHBhc3NlZCIpOworICB9CisKKyAgaWYgKHNvYXBfY2FsbF9uc19fZWNob05lc3RlZFN0cnVjdChzb2FwLCBzaXRlLCAiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLCBzc3RpLCBSc3N0bykpCisgIHsgCisgICAgZGlzcGxheVRleHQoImVjaG9OZXN0ZWRTdHJ1Y3QgZmFpbGVkIik7CisgICAgb2s9ZmFsc2U7CisgIH0KKyAgZWxzZSBpZiAoIVJzc3RvLl9yZXR1cm4udmFyU3RyaW5nIHx8IHN0cmNtcChzc3RpLnZhclN0cmluZywgUnNzdG8uX3JldHVybi52YXJTdHJpbmcpIHx8CisgICFSc3N0by5fcmV0dXJuLnZhckludCB8fCAqc3N0aS52YXJJbnQgIT0gKlJzc3RvLl9yZXR1cm4udmFySW50IHx8CisgICFSc3N0by5fcmV0dXJuLnZhckZsb2F0IHx8ICpzc3RpLnZhckZsb2F0ICE9ICpSc3N0by5fcmV0dXJuLnZhckZsb2F0IHx8CisgICFSc3N0by5fcmV0dXJuLnZhclN0cnVjdCB8fCAKKyAgIVJzc3RvLl9yZXR1cm4udmFyU3RydWN0LT52YXJTdHJpbmcgfHwgc3RyY21wKHNzdGkudmFyU3RydWN0LT52YXJTdHJpbmcsIFJzc3RvLl9yZXR1cm4udmFyU3RydWN0LT52YXJTdHJpbmcpIHx8CisgICFSc3N0by5fcmV0dXJuLnZhclN0cnVjdC0+dmFySW50IHx8ICpzc3RpLnZhclN0cnVjdC0+dmFySW50ICE9ICpSc3N0by5fcmV0dXJuLnZhclN0cnVjdC0+dmFySW50IHx8IAorICAhUnNzdG8uX3JldHVybi52YXJTdHJ1Y3QtPnZhckZsb2F0IHx8ICpzc3RpLnZhclN0cnVjdC0+dmFyRmxvYXQgIT0gKlJzc3RvLl9yZXR1cm4udmFyU3RydWN0LT52YXJGbG9hdCkKKyAgICB7CisgICAgCWRpc3BsYXlUZXh0KCJlY2hvTmVzdGVkU3RydWN0IG1pc21hdGNoZWQiKTsKKyAgICBvaz1mYWxzZTsKKyAgfQorICBlbHNlCisgIAlkaXNwbGF5VGV4dCgiZWNob05lc3RlZFN0cnVjdCBwYXNzZWQiKTsKKworICBpZiAoc29hcF9jYWxsX25zX19lY2hvTmVzdGVkQXJyYXkoc29hcCwgc2l0ZSwgImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiwgc2F0aSwgUnNhdG8pKQorICB7IAorICAgIGRpc3BsYXlUZXh0KCJlY2hvTmVzdGVkQXJyYXkgZmFpbGVkIik7CisgICAgb2s9ZmFsc2U7CisgIH0KKyAgZWxzZSBpZiAoIVJzYXRvLl9yZXR1cm4udmFyU3RyaW5nIHx8IHN0cmNtcChzYXRpLnZhclN0cmluZywgUnNhdG8uX3JldHVybi52YXJTdHJpbmcpIHx8CisgICFSc2F0by5fcmV0dXJuLnZhckludCB8fCAqc2F0aS52YXJJbnQgIT0gKlJzYXRvLl9yZXR1cm4udmFySW50IHx8CisgICFSc2F0by5fcmV0dXJuLnZhckZsb2F0IHx8ICpzYXRpLnZhckZsb2F0ICE9ICpSc2F0by5fcmV0dXJuLnZhckZsb2F0IHx8CisgIHNhdGkudmFyQXJyYXkuX19zaXplK3NhdGkudmFyQXJyYXkuX19vZmZzZXQgIT0gUnNhdG8uX3JldHVybi52YXJBcnJheS5fX3NpemUrUnNhdG8uX3JldHVybi52YXJBcnJheS5fX29mZnNldCkKKyAgICB7CisgICAgCWRpc3BsYXlUZXh0KCJlY2hvTmVzdGVkQXJyYXkgbWlzbWF0Y2hlZCIpOworICAgIG9rPWZhbHNlOworICB9CisgIGVsc2UKKyAgeyBnID0gMDsKKyAgICBmb3IgKGkgPSBzYXRpLnZhckFycmF5Ll9fb2Zmc2V0OyBpIDwgc2F0aS52YXJBcnJheS5fX3NpemUrc2F0aS52YXJBcnJheS5fX29mZnNldDsgaSsrKQorICAgICAgaWYgKCFSc2F0by5fcmV0dXJuLnZhckFycmF5Ll9fcHRyW2ktUnNhdG8uX3JldHVybi52YXJBcnJheS5fX29mZnNldF0gfHwKKyAgICAgICAgICBzdHJjbXAoc2F0aS52YXJBcnJheS5fX3B0cltpLXNhdGkudmFyQXJyYXkuX19vZmZzZXRdLCBSc2F0by5fcmV0dXJuLnZhckFycmF5Ll9fcHRyW2ktUnNhdG8uX3JldHVybi52YXJBcnJheS5fX29mZnNldF0pKQorICAgICAgICAgIGcgPSAxOworICAgIGlmIChnKQorICAgIHsKKyAgICAJZGlzcGxheVRleHQoImVjaG9OZXN0ZWRBcnJheSBtaXNtYXRjaGVkIik7CisJICAgIG9rPWZhbHNlOworICAgIH0KKyAgICBlbHNlCisJICAJZGlzcGxheVRleHQoImVjaG9OZXN0ZWRBcnJheSBwYXNzZWQiKTsKKyAgfQorCisgIHNvYXBfZW5kKHNvYXApOworICBpZiAob2spCisgIAlkaXNwbGF5VGV4dCgiQWxsIFBhc3NlZCIpOworICAJZWxzZQorCSAgZGlzcGxheVRleHQoIkZBSUxVUkVTIik7CisKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgTmFtZXNwYWNlIG5hbWVzcGFjZXNbXSA9Cit7CisgIHsiU09BUC1FTlYiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8ifSwKKyAgeyJTT0FQLUVOQyIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyJ9LAorICAvL3siU09BUC1FTlYiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMi8wNi9zb2FwLWVudmVsb3BlIn0sCS8vIFNPQVAgMS4yCisgIC8veyJTT0FQLUVOQyIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAyLzA2L3NvYXAtZW5jb2RpbmcifSwJLy8gU09BUCAxLjIKKyAgeyJ4c2kiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCAiaHR0cDovL3d3dy53My5vcmcvKi9YTUxTY2hlbWEtaW5zdGFuY2UifSwKKyAgeyJ4c2QiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLCAiaHR0cDovL3d3dy53My5vcmcvKi9YTUxTY2hlbWEifSwKKyAgeyJucyIsICJodHRwOi8vc29hcGludGVyb3Aub3JnLyJ9LAorICB7InMiLCAiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QifSwKKyAge05VTEwsIE5VTEx9Cit9OwpkaWZmIC0tZ2l0IGEvZ3NvYXAtcGFsbS9pbnRlcm9wL3NyYy9pbnRlcm9wMkN0ZXN0LmNwcCBiL2dzb2FwLXBhbG0vaW50ZXJvcC9zcmMvaW50ZXJvcDJDdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ5NDNkNQotLS0gL2Rldi9udWxsCisrKyBiL2dzb2FwLXBhbG0vaW50ZXJvcC9zcmMvaW50ZXJvcDJDdGVzdC5jcHAKQEAgLTAsMCArMSwxNzkgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyAgICAoQykgQ09QWVJJR0hUIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDIgQWxsIFJpZ2h0cyBSZXNlcnZlZAorLy8gICAgTGljZW5zZWQgTWF0ZXJpYWxzIC0gUHJvcGVydHkgb2YgSUJNCisvLyAgICBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvcgorLy8gICAgZGlzY2xvc3VyZSByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KKy8vCisvLyAgICBJQk0gRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORworLy8gICAgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorLy8gICAgUFVSUE9TRS4gSU4gTk8gRVZFTlQgU0hBTEwgSUJNIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisvLyAgICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisvLyAgICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKy8vICAgIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UKKy8vICAgIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisvLworLy8gICAgVGhlIHByb2dyYW0gbWF5IGJlIHVzZWQsIGV4ZWN1dGVkLCBjb3BpZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQKKy8vICAgIHdpdGhvdXQgcm95YWx0eSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGV2ZWxvcGluZywgdXNpbmcsIG1hcmtldGluZywgb3IgZGlzdHJpYnV0aW5nLgorLy8gCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gZ1NPQVAgdjIgSW50ZXJvcCBCIHRlc3Qgcm91bmQgMgorI2luY2x1ZGUgInNvYXBILmgiCitleHRlcm4gIkMiIHZvaWQgZGlzcGxheVRleHQoY2hhciAqdGV4dCk7CitleHRlcm4gIkMiIGludCBpbnRlcm9wQyhjb25zdCBjaGFyICpzaXRlKTsKKworCitzdHJ1Y3QgTmFtZXNwYWNlIG5hbWVzcGFjZXNDW10gPQoreyB7IlNPQVAtRU5WIiwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIn0sCisgIHsiU09BUC1FTkMiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8ifSwKKyAgeyJ4c2kiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCAiaHR0cDovL3d3dy53My5vcmcvKi9YTUxTY2hlbWEtaW5zdGFuY2UifSwKKyAgeyJ4c2QiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLCAiaHR0cDovL3d3dy53My5vcmcvKi9YTUxTY2hlbWEifSwKKyAgeyJtIiwgImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIn0sCisgIHsicyIsICJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZCJ9LAorICB7ImEiLCAiaHR0cDovL3htbC5hcGFjaGUub3JnL3htbC1zb2FwIn0sCisgIHsiaCIsICJodHRwOi8vc29hcGludGVyb3Aub3JnL2VjaG9oZWFkZXIvIn0sCisgIHtOVUxMLCBOVUxMfQorfTsKK2ludCBpbnRlcm9wQyhjb25zdCBjaGFyICp1cmwpCit7IHN0cnVjdCBzb2FwICpzb2FwOworICBjaGFyICpzaXRlPShjaGFyKil1cmw7CisgIGJvb2wgb2s9dHJ1ZTsKKyAgeHNkX19pbnQgbiA9IDQyOworICBmbG9hdCBmICA9IDMuNDAyODJlKzM4OworICBzdHJ1Y3QgU09BUF9FTlZfX0hlYWRlciBoOworICBzdHJ1Y3QgbV9fZWNob1ZvaWRSZXNwb25zZSByOworICBzdHJ1Y3Qgc19fU09BUFN0cnVjdCBzOworCisgIGguaF9fZWNob01lU3RyaW5nUmVxdWVzdCA9IE5VTEw7CisgIGguaF9fZWNob01lU3RyaW5nUmVxdWVzdF8gPSBOVUxMOworICBoLmhfX2VjaG9NZVN0cmluZ1Jlc3BvbnNlID0gTlVMTDsKKyAgaC5oX19lY2hvTWVTdHJ1Y3RSZXF1ZXN0ID0gTlVMTDsKKyAgaC5oX19lY2hvTWVTdHJ1Y3RSZXF1ZXN0XyA9IE5VTEw7CisgIGguaF9fZWNob01lU3RydWN0UmVzcG9uc2UgPSBOVUxMOworICBoLmhfX3NvbWVVbmtub3duUmVxdWVzdCA9IE5VTEw7CisgIGguaF9fc29tZVVua25vd25SZXF1ZXN0XyA9IE5VTEw7CisgIHMudmFyU3RyaW5nID0gImhlbGxvIHdvcmxkIjsKKyAgcy52YXJJbnQgPSAmbjsKKyAgcy52YXJGbG9hdCA9ICZmOworCisKKyAgZGlzcGxheVRleHQoInJ1bm5pbmcgdGVzdCBDIG9uIik7CisgIGRpc3BsYXlUZXh0KChjaGFyKil1cmwpOworICBzb2FwID0gc29hcF9uZXcoKTsKKyAgc29hcC0+bmFtZXNwYWNlcyA9IChzdHJ1Y3QgTmFtZXNwYWNlICopbmFtZXNwYWNlc0M7CisKKyAgc29hcC0+c2VuZF90aW1lb3V0ID0gMzAwOworICBzb2FwLT5yZWN2X3RpbWVvdXQgPSAzMDA7CisKKyAgLy8gcmVxdWVzdCBmcm9tIGNsaWVudCAod2l0aCBtdXN0VW5kZXJzdGFuZD0iMCIsIHJlY2lwaWVudCBpcyB0YXJnZXQpCisgIGguaF9fZWNob01lU3RyaW5nUmVxdWVzdCA9ICJoZWxsbyB3b3JsZCI7CisgIHNvYXAtPmhlYWRlciA9ICZoOworICBzb2FwLT5hY3RvciA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2FjdG9yL25leHQiOworICBpZiAoc29hcF9jYWxsX21fX2VjaG9Wb2lkKHNvYXAsIHNpdGUsICJodHRwOi8vc29hcGludGVyb3Aub3JnLyIsIHIpKQorICB7IAorICAgIGRpc3BsYXlUZXh0KCJlY2hvMSBmYWlsZWQiKTsKKyAgICBvaz1mYWxzZTsKKyAgfQorICBlbHNlCisgICAgZGlzcGxheVRleHQoImVjaG8xIHBhc3NlZCIpOworCisgIC8vIHJlcXVlc3QgZnJvbSBjbGllbnQgKHdpdGggbXVzdFVuZGVyc3RhbmQ9IjAiLCByZWNpcGllbnQgaXMgbm90IHRhcmdldCkKKyAgc29hcC0+aGVhZGVyID0gJmg7CisgIHNvYXAtPmFjdG9yID0gImh0dHA6Ly9zb21lL290aGVyL2FjdG9yIjsKKyAgaWYgKHNvYXBfY2FsbF9tX19lY2hvVm9pZChzb2FwLCBzaXRlLCAiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLCByKSkKKyAgeyAKKyAgICBkaXNwbGF5VGV4dCgiZWNobzIgZmFpbGVkIik7CisgICAgb2s9ZmFsc2U7CisgIH0KKyAgZWxzZQorICAgIGRpc3BsYXlUZXh0KCJlY2hvMiBwYXNzZWQiKTsKKworICAvLyByZXF1ZXN0IGZyb20gY2xpZW50ICh3aXRoIG11c3RVbmRlcnN0YW5kPSIxIiwgcmVjaXBpZW50IGlzIHRhcmdldCkKKyAgaC5oX19lY2hvTWVTdHJpbmdSZXF1ZXN0ID0gTlVMTDsKKyAgaC5oX19lY2hvTWVTdHJ1Y3RSZXF1ZXN0XyA9ICZzOworICBzb2FwLT5oZWFkZXIgPSAmaDsKKyAgc29hcC0+YWN0b3IgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9hY3Rvci9uZXh0IjsKKyAgaWYgKHNvYXBfY2FsbF9tX19lY2hvVm9pZChzb2FwLCBzaXRlLCAiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLCByKSkKKyAgeyAKKyAgICBkaXNwbGF5VGV4dCgiZWNobzMgZmFpbGVkIik7CisgICAgb2s9ZmFsc2U7CisgIH0KKyAgZWxzZQorICAgIGRpc3BsYXlUZXh0KCJlY2hvMyBwYXNzZWQiKTsKKworICAvLyByZXF1ZXN0IGZyb20gY2xpZW50ICh3aXRoIG11c3RVbmRlcnN0YW5kPSIxIiwgcmVjaXBpZW50IGlzIG5vdCB0YXJnZXQpCisgIHNvYXAtPmhlYWRlciA9ICZoOworICBzb2FwLT5hY3RvciA9ICJodHRwOi8vc29tZS9vdGhlci9hY3RvciI7CisgIGlmIChzb2FwX2NhbGxfbV9fZWNob1ZvaWQoc29hcCxzaXRlLCAiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLCByKSkKKyAgeyAKKyAgICBkaXNwbGF5VGV4dCgiZWNobzQgZmFpbGVkIik7CisgICAgb2s9ZmFsc2U7CisgIH0KKyAgZWxzZSBpZiAoc29hcC0+aGVhZGVyICYmIHNvYXAtPmhlYWRlci0+aF9fZWNob01lU3RydWN0UmVzcG9uc2UpCisgIHsgCisgICAgZGlzcGxheVRleHQoImVjaG80IHNob3VsZCBiZSBubyByZXNwb25zZSBoZWFkZXIiKTsKKyAgICBvaz1mYWxzZTsKKyAgIH0KKyAgZWxzZQorICAgIGRpc3BsYXlUZXh0KCJlY2hvNCBwYXNzZWQiKTsKKworICAvLyBVbmtub3duIGhlYWRlciBlbGVtZW50OiByZXF1ZXN0IGZyb20gY2xpZW50ICh3aXRoIG11c3RVbmRlcnN0YW5kPSIwIiwgcmVjaXBpZW50IGlzIHRhcmdldCkKKyAgaC5oX19lY2hvTWVTdHJ1Y3RSZXF1ZXN0XyA9IE5VTEw7CisgIGguaF9fc29tZVVua25vd25SZXF1ZXN0ID0gIlhZWiI7CisgIHNvYXAtPmhlYWRlciA9ICZoOworICBzb2FwLT5hY3RvciA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2FjdG9yL25leHQiOworICBpZiAoc29hcF9jYWxsX21fX2VjaG9Wb2lkKHNvYXAsIHNpdGUsICJodHRwOi8vc29hcGludGVyb3Aub3JnLyIsIHIpKQorICB7IAorICAgIGRpc3BsYXlUZXh0KCJlY2hvNSBmYWlsZWQiKTsKKyAgICBvaz1mYWxzZTsKKyAgfQorICBlbHNlCisgICAgZGlzcGxheVRleHQoImVjaG81IHBhc3NlZCIpOworCisgIC8vIFVua25vd24gaGVhZGVyIGVsZW1lbnQ6IHJlcXVlc3QgZnJvbSBjbGllbnQgKHdpdGggbXVzdFVuZGVyc3RhbmQ9IjEiLCByZWNpcGllbnQgaXMgdGFyZ2V0KQorICBoLmhfX3NvbWVVbmtub3duUmVxdWVzdCA9IE5VTEw7CisgIGguaF9fc29tZVVua25vd25SZXF1ZXN0XyA9ICJYWVoiOworICBzb2FwLT5oZWFkZXIgPSAmaDsKKyAgc29hcC0+YWN0b3IgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9hY3Rvci9uZXh0IjsKKyAgaWYgKHNvYXBfY2FsbF9tX19lY2hvVm9pZChzb2FwLCBzaXRlLCAiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLCByKSAhPSBTT0FQX01VU1RVTkRFUlNUQU5EKQorICB7IAorICAgIGRpc3BsYXlUZXh0KCJlY2hvNiBmYWlsZWQiKTsKKyAgICBvaz1mYWxzZTsKKyAgfQorICBlbHNlCisgICAgZGlzcGxheVRleHQoImVjaG82IHBhc3NlZCIpOworCisgIC8vIFVua25vd24gaGVhZGVyIGVsZW1lbnQ6IHJlcXVlc3QgZnJvbSBjbGllbnQgKHdpdGggbXVzdFVuZGVyc3RhbmQ9IjAiLCByZWNpcGllbnQgaXMgbm90IHRhcmdldCkKKyAgaC5oX19zb21lVW5rbm93blJlcXVlc3RfID0gTlVMTDsKKyAgaC5oX19zb21lVW5rbm93blJlcXVlc3QgPSAiWFlaIjsKKyAgc29hcC0+aGVhZGVyID0gJmg7CisgIHNvYXAtPmFjdG9yID0gImh0dHA6Ly9zb21lL290aGVyL2FjdG9yIjsKKyAgaWYgKHNvYXBfY2FsbF9tX19lY2hvVm9pZChzb2FwLCBzaXRlLCAiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLCByKSkKKyAgeyAKKyAgICBkaXNwbGF5VGV4dCgiZWNobzcgZmFpbGVkIik7CisgICAgb2s9ZmFsc2U7CisgIH0KKyAgZWxzZQorICAgIGRpc3BsYXlUZXh0KCJlY2hvNyBwYXNzZWQiKTsKKworICAvLyBVbmtub3duIGhlYWRlciBlbGVtZW50OiByZXF1ZXN0IGZyb20gY2xpZW50ICh3aXRoIG11c3RVbmRlcnN0YW5kPSIxIiwgcmVjaXBpZW50IGlzIG5vdCB0YXJnZXQpCisgIGguaF9fc29tZVVua25vd25SZXF1ZXN0ID0gTlVMTDsKKyAgaC5oX19zb21lVW5rbm93blJlcXVlc3RfID0gIlhZWiI7CisgIHNvYXAtPmhlYWRlciA9ICZoOworICBzb2FwLT5hY3RvciA9ICJodHRwOi8vc29tZS9vdGhlci9hY3RvciI7CisgIGlmIChzb2FwX2NhbGxfbV9fZWNob1ZvaWQoc29hcCwgc2l0ZSwgImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiwgcikpCisgIHsgCisgICAgZGlzcGxheVRleHQoImVjaG84IGZhaWxlZCIpOworICAgIG9rPWZhbHNlOworICB9CisgIGVsc2UKKyAgICBkaXNwbGF5VGV4dCgiZWNobzggcGFzc2VkIik7CisKKyAgc29hcF9lbmQoc29hcCk7CisgIGlmIChvaykKKyAgCWRpc3BsYXlUZXh0KCJBbGwgUGFzc2VkIik7CisgIGVsc2UKKwkgIGRpc3BsYXlUZXh0KCJGQUlMVVJFUyIpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ3NvYXAtcGFsbS9pbnRlcm9wL3NyYy9pbnRlcm9wMnRlc3QuY3BwIGIvZ3NvYXAtcGFsbS9pbnRlcm9wL3NyYy9pbnRlcm9wMnRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNTFiMzkKLS0tIC9kZXYvbnVsbAorKysgYi9nc29hcC1wYWxtL2ludGVyb3Avc3JjL2ludGVyb3AydGVzdC5jcHAKQEAgLTAsMCArMSwzODcgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyAgICAoQykgQ09QWVJJR0hUIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDIgQWxsIFJpZ2h0cyBSZXNlcnZlZAorLy8gICAgTGljZW5zZWQgTWF0ZXJpYWxzIC0gUHJvcGVydHkgb2YgSUJNCisvLyAgICBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvcgorLy8gICAgZGlzY2xvc3VyZSByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KKy8vCisvLyAgICBJQk0gRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORworLy8gICAgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorLy8gICAgUFVSUE9TRS4gSU4gTk8gRVZFTlQgU0hBTEwgSUJNIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisvLyAgICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisvLyAgICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKy8vICAgIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UKKy8vICAgIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisvLworLy8gICAgVGhlIHByb2dyYW0gbWF5IGJlIHVzZWQsIGV4ZWN1dGVkLCBjb3BpZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQKKy8vICAgIHdpdGhvdXQgcm95YWx0eSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGV2ZWxvcGluZywgdXNpbmcsIG1hcmtldGluZywgb3IgZGlzdHJpYnV0aW5nLgorLy8gCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gZ1NPQVAgdjIgSW50ZXJvcCB0ZXN0IHJvdW5kIDIgYmFzZQorLy8jaW5jbHVkZSAiaW50ZXJvcHRBLmgiCisjaW5jbHVkZSAic29hcEguaCIgCisKK2V4dGVybiAiQyIgdm9pZCBkaXNwbGF5VGV4dChjaGFyICp0ZXh0KTsKK2V4dGVybiAiQyIgaW50IGludGVyb3B0QShjb25zdCBjaGFyICp1cmwpOworCit2b2lkIGR1bXBIZXgoY2hhciAqcmVzdWx0LCBjb25zdCB2b2lkICpwLGludCBjb3VudCk7Cit2b2lkIGR1bXBIZXgoY2hhciAqcmVzdWx0LCBjb25zdCB2b2lkICpwLGludCBjb3VudCkKK3sKKyAgdW5zaWduZWQgY2hhciAqcHRyID0gKHVuc2lnbmVkIGNoYXIgKilwOworICBpbnQgaT0wOworICBmb3IgKGk9MDsgaTxjb3VudDsgaSsrKQorICB7IHVuc2lnbmVkIGNoYXIgYyA9ICpwdHI7IAorICAgIHB0cisrOworICAJc3ByaW50ZihyZXN1bHQsIiAlMngiLGMpOworICAJcmVzdWx0Kz1zdHJsZW4ocmVzdWx0KTsKKyAgfQorICAKK30KKworaW50IGludGVyb3B0QShjb25zdCBjaGFyICp1cmwpCit7IAorICBzdHJ1Y3Qgc29hcCAqc29hcDsKKyAgaW50IGksIGc7CisgIHhzZF9fc3RyaW5nIHNvLCBzaSA9ICJIZWxsbyBXb3JsZCEgPD4mIjsKKyAgc3RydWN0IEFycmF5T2ZzdHJpbmcgQXNpLCBBc287CisgIHhzZF9faW50IG5vLCBuaSA9IDEyMzQ1Njc4OTA7CisgIHhzZF9faW50IG4gPSAyMTQ3NDgzNjQ3OworICBzdHJ1Y3QgQXJyYXlPZmludCBBbmksIEFubzsKKyAgeHNkX19mbG9hdCBmMSA9IDEyMy41Njc4OworICB4c2RfX2Zsb2F0IGYyID0gMy4xNDsKKyAgeHNkX19mbG9hdCBmbywgZmkgPSAxMjMuNTsKKyNpZmRlZiBTWU1CSUFOCisgIGNvbnN0IHN0cnVjdCBzb2FwX2RvdWJsZV9uYW4geyB1bnNpZ25lZCBpbnQgbjEsIG4yOyB9IHNvYXBfZG91YmxlX25hbjsKKyNlbmRpZgorICB4c2RfX2Zsb2F0IG5hbiA9IEZMVF9OQU4sIGluZiA9IEZMVF9QSU5GVFksIG5pbmYgPSBGTFRfTklORlRZOworICBzdHJ1Y3QgQXJyYXlPZmZsb2F0IEFmaSwgQWZvOworICBzdHJ1Y3Qgc19fU09BUFN0cnVjdCBzdGksICpwOworICBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RSZXNwb25zZSBzdG87CisgIHN0cnVjdCBBcnJheU9mU09BUFN0cnVjdCBBc3RpLCBBc3RvOworICBzdHJ1Y3QgbnNfX2VjaG9Wb2lkUmVzcG9uc2UgUnY7CisgIHN0cnVjdCB4c2RfX2Jhc2U2NEJpbmFyeSBiNjRpLCBiNjRvOworICB4c2RfX2RhdGVUaW1lIGR0bywgZHRpID0gIjE5NjctMTItMjlUMDE6MDI6MDMiOworICBzdHJ1Y3QgeHNkX19oZXhCaW5hcnkgaGJpLCBoYm87CisgIHhzZF9fZGVjaW1hbCBEbywgRGkgPSAiMTIzNDU2Nzg5MC4xMjM0NTY3ODkiOworICB4c2RfX2Jvb2xlYW4gYm8sIGJpID0gdHJ1ZTsKKyAgZGlzcGxheVRleHQoInJ1bm5pbmcgdGVzdCBBIG9uIik7CisgIGRpc3BsYXlUZXh0KChjaGFyKil1cmwpOworICBzb2FwID0gc29hcF9uZXcoKTsKKyAgc29hcC0+bmFtZXNwYWNlcyA9IChzdHJ1Y3QgTmFtZXNwYWNlICopbmFtZXNwYWNlczsKKworLy8gIHNvYXAuc2VuZF90aW1lb3V0ID0gMzA7CisvLyAgc29hcC5yZWN2X3RpbWVvdXQgPSAzMDsKKworCisgIEFzaS5fX3NpemUgPSA4OworICBBc2kuX19vZmZzZXQgPSAwOworICBBc2kuX19wdHIgPSAoeHNkX19zdHJpbmcqKW1hbGxvYyhBc2kuX19zaXplKnNpemVvZih4c2RfX3N0cmluZykpOworICBBc2kuX19wdHJbMF0gPSBOVUxMOworICBBc2kuX19wdHJbMV0gPSAiIEhlbGxvXHRXb3JsZCI7CisgIEFzaS5fX3B0clsyXSA9IE5VTEw7CisgIEFzaS5fX3B0clszXSA9ICIhICI7CisgIEFzaS5fX3B0cls0XSA9IE5VTEw7CisgIEFzaS5fX3B0cls1XSA9IHNpOworICBBc2kuX19wdHJbNl0gPSBOVUxMOworICBBc2kuX19wdHJbN10gPSBzaTsKKworICBBbmkuX19zaXplID0gMDsKKyAgQW5pLl9fb2Zmc2V0ID0gMDsKKyAgQW5pLl9fcHRyID0gTlVMTDsgLy8gKHhzZF9faW50KiltYWxsb2MoQW5pLl9fc2l6ZSpzaXplb2YoeHNkX19pbnQpKTsKKworICBBZmkuX19zaXplID0gNTsKKyAgQWZpLl9fb2Zmc2V0ID0gMDsKKyAgQWZpLl9fcHRyID0gKHhzZF9fZmxvYXQqKiltYWxsb2MoQWZpLl9fc2l6ZSpzaXplb2YoeHNkX19mbG9hdCopKTsKKyAgQWZpLl9fcHRyWzBdID0gJmYxOworICBBZmkuX19wdHJbMV0gPSAmZjE7IC8vIEZMVF9OQU47CisgIEFmaS5fX3B0clsyXSA9ICZpbmY7IC8vIEZMVF9QSU5GVFk7CisgIEFmaS5fX3B0clszXSA9ICZuaW5mOyAvLyBGTFRfTklORlRZOworICBBZmkuX19wdHJbNF0gPSAmZjI7CisKKyAgc3RpLnZhclN0cmluZyA9ICJIZWxsbyI7CisgIHN0aS52YXJJbnQgPSAmbjsKKyAgc3RpLnZhckZsb2F0ID0gJmYxOworCisgIEFzdGkuX19zaXplID0gMzsKKyAgQXN0aS5fX29mZnNldCA9IDI7CisgIEFzdGkuX19wdHIgPSAoc3RydWN0IHNfX1NPQVBTdHJ1Y3QqKiltYWxsb2MoKEFzdGkuX19zaXplKzEpKnNpemVvZihzdHJ1Y3Qgc19fU09BUFN0cnVjdCopKTsKKyAgcCA9IChzdHJ1Y3Qgc19fU09BUFN0cnVjdCopbWFsbG9jKEFzdGkuX19zaXplKnNpemVvZihzdHJ1Y3Qgc19fU09BUFN0cnVjdCkpOworICBBc3RpLl9fcHRyWzBdID0gcDsKKyAgQXN0aS5fX3B0clsxXSA9IHArMTsKKyAgQXN0aS5fX3B0clsyXSA9IHArMjsKKyAgQXN0aS5fX3B0clszXSA9IHA7CisgIEFzdGkuX19wdHJbMF0tPnZhclN0cmluZyA9ICJIZWxsbyI7CisgIEFzdGkuX19wdHJbMF0tPnZhckludCA9ICZuOworICBBc3RpLl9fcHRyWzBdLT52YXJGbG9hdCA9ICZmMTsKKyAgQXN0aS5fX3B0clsxXS0+dmFyU3RyaW5nID0gIldvcmxkIjsKKyAgQXN0aS5fX3B0clsxXS0+dmFySW50ID0gJm47CisgIEFzdGkuX19wdHJbMV0tPnZhckZsb2F0ID0gJmYyOworICBBc3RpLl9fcHRyWzJdLT52YXJTdHJpbmcgPSAiISI7CisgIEFzdGkuX19wdHJbMl0tPnZhckludCA9ICZuOworICBBc3RpLl9fcHRyWzJdLT52YXJGbG9hdCA9ICZmMjsKKworICB1bnNpZ25lZCBjaGFyIGI2NGRhdGFbNF09ezB4ODAsIDB4ODEsIDB4ODIsIDB4ODN9OworICBiNjRpLl9fcHRyID0gYjY0ZGF0YTsKKyAgYjY0aS5fX3NpemUgPSA0OworCisgIGhiaS5fX3B0ciA9ICh1bnNpZ25lZCBjaGFyKikiVGhpcyBpcyBhbiBleGFtcGxlIEhleEJpbmFyeSBlbmNvZGVkIHN0cmluZyI7CisgIGhiaS5fX3NpemUgPSBzdHJsZW4oKGNoYXIqKWhiaS5fX3B0cikrMTsKKyAgY2hhciAqc2l0ZT0oY2hhciopdXJsOworICBjaGFyKiBhY3Rpb24gPSAiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iOworICAKKyAgYm9vbCBvaz10cnVlOworICAKKyAgaWYgKHNvYXBfY2FsbF9uc19fZWNob1N0cmluZyhzb2FwLCBzaXRlLCBhY3Rpb24sIHNpLCBzbykpCisgIHsgCisgICAgZGlzcGxheVRleHQoImVjaG9TdHJpbmcgZmFpbGVkIik7CisgICAgb2s9ZmFsc2U7CisgIH0KKyAgZWxzZSBpZiAoIXNvIHx8IHN0cmNtcChzaSwgc28pKQorICB7IAorICAgIG9rPWZhbHNlOworICAgIGRpc3BsYXlUZXh0KCJlY2hvU3RyaW5nIG1pc21hdGNoIik7CisgIH0KKyAgZWxzZQorICAgIGRpc3BsYXlUZXh0KCJlY2hvU3RyaW5nIHBhc3MiKTsKKyAKKworICBpZiAoc29hcF9jYWxsX25zX19lY2hvSW50ZWdlcihzb2FwLCBzaXRlLCAiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLCBuaSwgbm8pKQorICB7IAorICAgIG9rPWZhbHNlOworICAgIGRpc3BsYXlUZXh0KCJlY2hvSW50ZWdlciBmYWlsIik7CisgIH0KKyAgZWxzZSBpZiAobmkgIT0gbm8pCisgIHsgIAorICAgIG9rPWZhbHNlOworICAgIGRpc3BsYXlUZXh0KCJlY2hvSW50ZWdlciBtaXNtYXRjaCIpOworICB9CisgIGVsc2UKKyAgICBkaXNwbGF5VGV4dCgiZWNob0ludGVnZXIgcGFzcyIpOworCisgIGlmIChzb2FwX2NhbGxfbnNfX2VjaG9GbG9hdChzb2FwLCBzaXRlLCAiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLCBmaSwgZm8pKQorICB7IAorICAgIG9rPWZhbHNlOworICAgIGRpc3BsYXlUZXh0KCJlY2hvRmxvYXQgZmFpbCIpOworICB9CisgIGVsc2UgaWYgKGZpICE9IGZvKQorICB7ICAKKyAgICBvaz1mYWxzZTsKKyAgICBkaXNwbGF5VGV4dCgiZWNob0Zsb2F0IG1pc21hdGNoIik7CisgIH0KKyAgZWxzZQorICAgIGRpc3BsYXlUZXh0KCJlY2hvRmxvYXQgcGFzcyIpOworCisgIGlmIChzb2FwX2NhbGxfbnNfX2VjaG9TdHJ1Y3Qoc29hcCwgc2l0ZSwgImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiwgc3RpLCBzdG8pKQorICB7IAorICAgIG9rPWZhbHNlOworICBkaXNwbGF5VGV4dCgiZWNob1N0cnVjdCBmYWlsIik7CisgIH0KKyAgZWxzZSBpZiAoIXN0by5fcmV0dXJuLnZhclN0cmluZyB8fCBzdHJjbXAoc3RpLnZhclN0cmluZywgc3RvLl9yZXR1cm4udmFyU3RyaW5nKQorICAJIHx8ICFzdG8uX3JldHVybi52YXJJbnQgfHwgKnN0aS52YXJJbnQgIT0gKnN0by5fcmV0dXJuLnZhckludCAKKyAgCSB8fCAhc3RvLl9yZXR1cm4udmFyRmxvYXQgfHwgKnN0aS52YXJGbG9hdCAhPSAqc3RvLl9yZXR1cm4udmFyRmxvYXQpCisgIHsgCisgICAgb2s9ZmFsc2U7CisJICBkaXNwbGF5VGV4dCgiZWNob1N0cnVjdCBtaXNtYXRjaCIpOworICB9CisgIGVsc2UgCisgICAgZGlzcGxheVRleHQoImVjaG9TdHJ1Y3QgcGFzcyIpOworCisgIGlmIChzb2FwX2NhbGxfbnNfX2VjaG9TdHJpbmdBcnJheShzb2FwLCBzaXRlLCAiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLCBBc2ksIEFzbykpCisgIHsKKyAgICAgc29hcF9zZXRfZmF1bHQoc29hcCk7IAorICAgIHNvYXBfZmF1bHRkZXRhaWwoc29hcCk7CisgICAgb2s9ZmFsc2U7CisgIGRpc3BsYXlUZXh0KCJlY2hvU3RyaW5nQXJyYXkgZmFpbCIpOworICB9CisgIGVsc2UKKyAgeyBnID0gMDsKKyAgICBpZiAoQXNpLl9fc2l6ZSAhPSBBc28uX19zaXplKQorICAgICAgZyA9IDE7CisgICAgZWxzZQorICAgICAgZm9yIChpID0gMDsgaSA8IEFzaS5fX3NpemU7IGkrKykKKyAgICAgICAgaWYgKEFzaS5fX3B0cltpXSAmJiBBc28uX19wdHJbaV0gJiYgc3RyY21wKEFzaS5fX3B0cltpXSwgQXNvLl9fcHRyW2ldKSkKKyAgICAgICAgICBnID0gMTsKKyAgICAgICAgZWxzZSBpZiAoIUFzaS5fX3B0cltpXSkKKwkgIDsKKyAgICAgICAgZWxzZSBpZiAoQXNpLl9fcHRyW2ldICYmICFBc28uX19wdHJbaV0pCisJICBnID0gMTsKKyAgICBpZiAoZykKKyAgICB7CisgICAgb2s9ZmFsc2U7CisgICAgZGlzcGxheVRleHQoImVjaG9TdHJpbmdBcnJheSBtaXNtYXRjaCIpOyAKKyAgICB9CisgICAgZWxzZQorICAgICBkaXNwbGF5VGV4dCgiZWNob1N0cmluZ0FycmF5IHBhc3MiKTsKKyAgfQorCisgIGlmIChzb2FwX2NhbGxfbnNfX2VjaG9JbnRlZ2VyQXJyYXkoc29hcCwgc2l0ZSwgImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiwgQW5pLCBBbm8pKQorICB7IGRpc3BsYXlUZXh0KCJlY2hvSW50ZWdlckFycmF5IGZhaWwiKTsKKyAgICBvaz1mYWxzZTsKKyAgfQorICBlbHNlCisgIHsgZyA9IDA7CisgICAgaWYgKEFuaS5fX3NpemUgIT0gQW5vLl9fc2l6ZSkKKyAgICAgIGcgPSAxOworICAgIGVsc2UKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBBbmkuX19zaXplOyBpKyspCisgICAgICAgIGlmIChBbmkuX19wdHJbaV0gJiYgKCFBbm8uX19wdHJbaV0gfHwgKkFuaS5fX3B0cltpXSAhPSAqQW5vLl9fcHRyW2ldKSkKKyAgICAgICAgICBnID0gMTsKKyAgICBpZiAoZykKKyAgICB7IGRpc3BsYXlUZXh0KCJlY2hvSW50ZWdlckFycmF5IG1pc21hdGNoIik7CisgICAgb2s9ZmFsc2U7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGRpc3BsYXlUZXh0KCJlY2hvSW50ZWdlckFycmF5IHBhc3MiKTsKKyAgfQorCisgIGlmIChzb2FwX2NhbGxfbnNfX2VjaG9GbG9hdEFycmF5KHNvYXAsIHNpdGUsICJodHRwOi8vc29hcGludGVyb3Aub3JnLyIsIEFmaSwgQWZvKSkKKyAgeyBkaXNwbGF5VGV4dCgiZWNob0Zsb2F0QXJyYXkgZmFpbCIpOworICAgIG9rPWZhbHNlOworICB9CisgIGVsc2UKKyAgeyBnID0gMDsKKyAgICBpZiAoQWZpLl9fc2l6ZSAhPSBBZm8uX19zaXplKQorICAgICAgZyA9IDE7CisgICAgZWxzZQorICAgICAgZm9yIChpID0gMDsgaSA8IEFmaS5fX3NpemU7IGkrKykKKyAgICAgICAgaWYgKEFmaS5fX3B0cltpXSAmJiBBZm8uX19wdHJbaV0gJiYgc29hcF9pc25hbigqQWZpLl9fcHRyW2ldKSAmJiBzb2FwX2lzbmFuKCpBZm8uX19wdHJbaV0pKQorICAgICAgICAgIDsKKyAgICAgICAgZWxzZSBpZiAoQWZpLl9fcHRyW2ldICYmICghQWZvLl9fcHRyW2ldIHx8ICpBZmkuX19wdHJbaV0gIT0gKkFmby5fX3B0cltpXSkpCisgICAgICAgICAgZyA9IDE7CisgICAgaWYgKGcpCisgICAgeyBkaXNwbGF5VGV4dCgiZWNob0Zsb2F0QXJyYXkgbWlzbWF0Y2giKTsKKyAgICBvaz1mYWxzZTsKKyAgICB9CisgICAgZWxzZQorICAgICBkaXNwbGF5VGV4dCgiZWNob0Zsb2F0QXJyYXkgcGFzcyIpOworICB9CisKKyAgaWYgKHNvYXBfY2FsbF9uc19fZWNob1N0cnVjdEFycmF5KHNvYXAsIHNpdGUsICJodHRwOi8vc29hcGludGVyb3Aub3JnLyIsIEFzdGksIEFzdG8pKQorICB7IGRpc3BsYXlUZXh0KCJlY2hvU3RydWN0QXJyYXkgZmFpbCIpOworICAgIG9rPWZhbHNlOworICB9CisgIGVsc2UKKyAgeyBnID0gMDsKKyAgICBpZiAoQXN0aS5fX3NpemUrQXN0aS5fX29mZnNldCAhPSBBc3RvLl9fc2l6ZStBc3RvLl9fb2Zmc2V0KQorICAgICAgZyA9IDE7CisgICAgZWxzZQorICAgICAgZm9yIChpID0gQXN0aS5fX29mZnNldDsgaSA8IEFzdGkuX19zaXplK0FzdGkuX19vZmZzZXQ7IGkrKykKKyAgICAgICAgaWYgKCFBc3RvLl9fcHRyW2ktQXN0by5fX29mZnNldF0gfHwKKwkhQXN0by5fX3B0cltpLUFzdG8uX19vZmZzZXRdLT52YXJTdHJpbmcgfHwKKwlzdHJjbXAoQXN0aS5fX3B0cltpLUFzdGkuX19vZmZzZXRdLT52YXJTdHJpbmcsIEFzdG8uX19wdHJbaS1Bc3RvLl9fb2Zmc2V0XS0+dmFyU3RyaW5nKSB8fAorCSFBc3RvLl9fcHRyW2ktQXN0by5fX29mZnNldF0tPnZhckludCB8fAorCSpBc3RpLl9fcHRyW2ktQXN0aS5fX29mZnNldF0tPnZhckludCAhPSAqQXN0by5fX3B0cltpLUFzdG8uX19vZmZzZXRdLT52YXJJbnQgfHwKKwkhQXN0by5fX3B0cltpLUFzdG8uX19vZmZzZXRdLT52YXJGbG9hdCB8fAorCSpBc3RpLl9fcHRyW2ktQXN0aS5fX29mZnNldF0tPnZhckZsb2F0ICE9ICpBc3RvLl9fcHRyW2ktQXN0by5fX29mZnNldF0tPnZhckZsb2F0KQorICAgICAgICAgIGcgPSAxOworICAgIGlmIChnKQorICAgIHsgZGlzcGxheVRleHQoImVjaG9TdHJ1Y3RBcnJheSBtaXNtYXRjaCIpOworICAgIG9rPWZhbHNlOworICAgIH0KKyAgICBlbHNlCisgICAgICBkaXNwbGF5VGV4dCgiZWNob1N0cnVjdEFycmF5IHBhc3MiKTsKKyAgfQorCisgIGlmIChzb2FwX2NhbGxfbnNfX2VjaG9Wb2lkKHNvYXAsIHNpdGUsICJodHRwOi8vc29hcGludGVyb3Aub3JnLyIsIFJ2KSkKKyAgeyBkaXNwbGF5VGV4dCgiZWNob1ZvaWQgZmFpbCIpOworICAgIG9rPWZhbHNlOworICB9CisgIGVsc2UKKyAgICBkaXNwbGF5VGV4dCgiZWNob1ZvaWQgcGFzcyIpOworICAKKyAgeworICAgIGludCBTMT1zaXplb2YoaW50KTsKKyAgICBpbnQgUzI9IHNpemVvZiAoc2l6ZV90KTsKKyAgICBpbnQgUzM9c2l6ZW9mKDApOworICAgIH0KKworICBpZiAoc29hcF9jYWxsX25zX19lY2hvQmFzZTY0KHNvYXAsIHNpdGUsICJodHRwOi8vc29hcGludGVyb3Aub3JnLyIsIGI2NGksIGI2NG8pKQorICB7IGRpc3BsYXlUZXh0KCJlY2hvQmFzZTY0IGZhaWwiKTsKKyAgICBvaz1mYWxzZTsKKyAgfQorICBlbHNlIGlmICgoYjY0aS5fX3NpemUrMikvMyAhPSAoYjY0by5fX3NpemUrMikvMyB8fCBzdHJuY21wKChjaGFyKiliNjRpLl9fcHRyLCAoY2hhciopYjY0by5fX3B0cixiNjRpLl9fc2l6ZSkpCisgIHsgCisgIGRpc3BsYXlUZXh0KCJlY2hvQmFzZTY0IG1pc21hdGNoIik7CisgICAgb2s9ZmFsc2U7CisgIH0KKyAgZWxzZQorICAgZGlzcGxheVRleHQoImVjaG9CYXNlNjQgcGFzcyIpOworCisgIGlmIChzb2FwX2NhbGxfbnNfX2VjaG9EYXRlKHNvYXAsIHNpdGUsICJodHRwOi8vc29hcGludGVyb3Aub3JnLyIsIGR0aSwgZHRvKSkKKyAgeyAKKyAgZGlzcGxheVRleHQoImVjaG9EYXRlIGZhaWwiKTsKKyAgICBvaz1mYWxzZTsKKyAgfQorICBlbHNlIGlmICghZHRvIHx8IHN0cm5jbXAoZHRpLCBkdG8sIDE5KSkKKyAgeyAKKyAgZGlzcGxheVRleHQoImVjaG9EYXRlIG1pc21hdGNoIik7CisgICAgb2s9ZmFsc2U7CisgIH0KKyAgZWxzZQorICAgIGRpc3BsYXlUZXh0KCJlY2hvRGF0ZSBwYXNzIik7CisgCisKKyAgaWYgKHNvYXBfY2FsbF9uc19fZWNob0hleEJpbmFyeShzb2FwLCBzaXRlLCAiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLCBoYmksIGhibykpCisgIHsgCisgICAgb2s9ZmFsc2U7CisgIGRpc3BsYXlUZXh0KCJlY2hvSGV4QmluYXJ5IGZhaWwiKTsKKyAgfQorICBlbHNlIGlmIChoYmkuX19zaXplICE9IGhiby5fX3NpemUgfHwgc3RyY21wKChjaGFyKiloYmkuX19wdHIsIChjaGFyKiloYm8uX19wdHIpKQorICB7IAorICAgIG9rPWZhbHNlOworICBkaXNwbGF5VGV4dCgiZWNob0hleEJpbmFyeSBtaXNtYXRjaCIpOworICB9CisgIGVsc2UKKyAgICBkaXNwbGF5VGV4dCgiZWNob0hleEJpbmFyeSBwYXNzIik7CisgCisKKyAgaWYgKHNvYXBfY2FsbF9uc19fZWNob0RlY2ltYWwoc29hcCwgc2l0ZSwgImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiwgRGksIERvKSkKKyAgeyAKKyAgICBvaz1mYWxzZTsKKyAgZGlzcGxheVRleHQoImVjaG9EZWNpbWFsIHBhc3MiKTsKKyAgfQorICBlbHNlIGlmIChzdHJjbXAoRGksIERvKSkKKyAgeyAKKyAgICBvaz1mYWxzZTsKKyAgZGlzcGxheVRleHQoImVjaG9EZWNpbWFsIG1pc21hdGNoIik7CisgIH0KKyAgZWxzZQorICAgIGRpc3BsYXlUZXh0KCJlY2hvRGVjaW1hbCBwYXNzIik7CisgIAorCisgIGlmIChzb2FwX2NhbGxfbnNfX2VjaG9Cb29sZWFuKHNvYXAsIHNpdGUsICJodHRwOi8vc29hcGludGVyb3Aub3JnLyIsIGJpLCBibykpCisgIHsgCisgICAgb2s9ZmFsc2U7CisgICAgZGlzcGxheVRleHQoImVjaG9Cb29sZWFuIGZhaWwiKTsKKyAgfQorICBlbHNlIGlmIChiaSAhPSBibykKKyAgeyAKKyAgICBvaz1mYWxzZTsKKyAgICBkaXNwbGF5VGV4dCgiZWNob0Jvb2xlYW4gbWlzbWF0Y2giKTsKKyAgfQorICBlbHNlCisgICAgZGlzcGxheVRleHQoImVjaG9Cb29sZWFuIHBhc3MiKTsKKworICBzb2FwX2VuZChzb2FwKTsKKyAgc29hcF9kb25lKHNvYXApOworICBpZiAob2spCisgIAlkaXNwbGF5VGV4dCgiQUxMIFBBU1MiKTsKKyAgZWxzZQorCWRpc3BsYXlUZXh0KCJGQUlMVVJFUyIpOworICByZXR1cm4gMDsKKyAgCitlbmQ6CisgIHJldHVybiAxOworfQorCitzdHJ1Y3QgTmFtZXNwYWNlIG5hbWVzcGFjZXNbXSA9Cit7IHsiU09BUC1FTlYiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8ifSwKKyAgeyJTT0FQLUVOQyIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyJ9LAorICB7InhzaSIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsICJodHRwOi8vd3d3LnczLm9yZy8qL1hNTFNjaGVtYS1pbnN0YW5jZSJ9LAorICB7InhzZCIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsICJodHRwOi8vd3d3LnczLm9yZy8qL1hNTFNjaGVtYSJ9LAorICB7Im5zIiwgImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIn0sCisgIHsicyIsICJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZCJ9LAorICB7ImEiLCAiaHR0cDovL3htbC5hcGFjaGUub3JnL3htbC1zb2FwIn0sCisgIHsiaCIsICJodHRwOi8vc29hcGludGVyb3Aub3JnL2VjaG9oZWFkZXIvIn0sCisgIHtOVUxMLCBOVUxMfQorfTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nc29hcC1wYWxtL2ludGVyb3Avc3JjL2ludGVyb3BfYWxsLmggYi9nc29hcC1wYWxtL2ludGVyb3Avc3JjL2ludGVyb3BfYWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM5OGFmMQotLS0gL2Rldi9udWxsCisrKyBiL2dzb2FwLXBhbG0vaW50ZXJvcC9zcmMvaW50ZXJvcF9hbGwuaApAQCAtMCwwICsxLDEzNiBAQAorLy8gSW50ZXJvcCB0ZXN0IGJhc2Ugcm91bmQgMgorCisvL2dzb2FwIG5zIHNlcnZpY2UgbmFtZToJaW50ZXJvcDIKKy8vZ3NvYXAgbnMgc2VydmljZSBzdHlsZToJcnBjCisvL2dzb2FwIG5zIHNlcnZpY2UgZW5jb2Rpbmc6CWVuY29kZWQKKy8vZ3NvYXAgbnMgc2VydmljZSBuYW1lc3BhY2U6CWh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvd3NkbAorCisvL2dzb2FwIG5zIHNjaGVtYSBuYW1lc3BhY2U6IGh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvCisvL2dzb2FwIHMgc2NoZW1hIG5hbWVzcGFjZTogaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QKKy8vZ3NvYXAgYSBzY2hlbWEgbmFtZXNwYWNlOiBodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAKKwordHlwZWRlZiBjaGFyICp4c2RfX3N0cmluZzsKK25zX19lY2hvU3RyaW5nKHhzZF9fc3RyaW5nIGlucHV0U3RyaW5nLCB4c2RfX3N0cmluZyAmX3JldHVybik7CisKK3N0cnVjdCBBcnJheU9mc3RyaW5nIHsgeHNkX19zdHJpbmcgKl9fcHRyOyBpbnQgX19zaXplOyBpbnQgX19vZmZzZXQ7IH07Cituc19fZWNob1N0cmluZ0FycmF5KHN0cnVjdCBBcnJheU9mc3RyaW5nIGlucHV0U3RyaW5nQXJyYXksIHN0cnVjdCBBcnJheU9mc3RyaW5nICZfcmV0dXJuKTsKKwordHlwZWRlZiBsb25nIHhzZF9faW50OworbnNfX2VjaG9JbnRlZ2VyKHhzZF9faW50IGlucHV0SW50ZWdlciwgeHNkX19pbnQgJl9yZXR1cm4pOworCitzdHJ1Y3QgQXJyYXlPZmludCB7IHhzZF9faW50ICoqX19wdHI7IGludCBfX3NpemU7IGludCBfX29mZnNldDsgfTsKK25zX19lY2hvSW50ZWdlckFycmF5KHN0cnVjdCBBcnJheU9maW50IGlucHV0SW50ZWdlckFycmF5LCBzdHJ1Y3QgQXJyYXlPZmludCAmX3JldHVybik7CisKK3R5cGVkZWYgZmxvYXQgeHNkX19mbG9hdDsKK25zX19lY2hvRmxvYXQoeHNkX19mbG9hdCBpbnB1dEZsb2F0LCB4c2RfX2Zsb2F0ICZfcmV0dXJuKTsKKworc3RydWN0IEFycmF5T2ZmbG9hdCB7IHhzZF9fZmxvYXQgKipfX3B0cjsgaW50IF9fc2l6ZTsgaW50IF9fb2Zmc2V0OyB9OworbnNfX2VjaG9GbG9hdEFycmF5KHN0cnVjdCBBcnJheU9mZmxvYXQgaW5wdXRGbG9hdEFycmF5LCBzdHJ1Y3QgQXJyYXlPZmZsb2F0ICZfcmV0dXJuKTsKKworc3RydWN0IHNfX1NPQVBTdHJ1Y3QKK3sgeHNkX19zdHJpbmcgdmFyU3RyaW5nOworICB4c2RfX2ludCAqdmFySW50OworICB4c2RfX2Zsb2F0ICp2YXJGbG9hdDsKK307Cituc19fZWNob1N0cnVjdChzdHJ1Y3Qgc19fU09BUFN0cnVjdCBfaW5wdXRTdHJ1Y3QsIHN0cnVjdCBuc19fZWNob1N0cnVjdFJlc3BvbnNlIHsgc3RydWN0IHNfX1NPQVBTdHJ1Y3QgX3JldHVybjsgfSAmcmVzdWx0KTsKKworc3RydWN0IEFycmF5T2ZTT0FQU3RydWN0IHsgc3RydWN0IHNfX1NPQVBTdHJ1Y3QgKipfX3B0cjsgaW50IF9fc2l6ZTsgaW50IF9fb2Zmc2V0OyB9OworbnNfX2VjaG9TdHJ1Y3RBcnJheShzdHJ1Y3QgQXJyYXlPZlNPQVBTdHJ1Y3QgaW5wdXRTdHJ1Y3RBcnJheSwgc3RydWN0IEFycmF5T2ZTT0FQU3RydWN0ICZfcmV0dXJuKTsKKworbnNfX2VjaG9Wb2lkKHN0cnVjdCBuc19fZWNob1ZvaWRSZXNwb25zZSB7IH0gJnJlc3VsdCk7CisKK3N0cnVjdCB4c2RfX2Jhc2U2NEJpbmFyeSB7IHVuc2lnbmVkIGNoYXIgKl9fcHRyOyBpbnQgX19zaXplOyB9OworbnNfX2VjaG9CYXNlNjQoc3RydWN0IHhzZF9fYmFzZTY0QmluYXJ5IGlucHV0QmFzZTY0LCBzdHJ1Y3QgeHNkX19iYXNlNjRCaW5hcnkgJl9yZXR1cm4pOworCit0eXBlZGVmIGNoYXIgKnhzZF9fZGF0ZVRpbWU7Cituc19fZWNob0RhdGUoeHNkX19kYXRlVGltZSBpbnB1dERhdGUsIHhzZF9fZGF0ZVRpbWUgJl9yZXR1cm4pOworCitzdHJ1Y3QgeHNkX19oZXhCaW5hcnkgeyB1bnNpZ25lZCBjaGFyICpfX3B0cjsgaW50IF9fc2l6ZTsgfTsKK25zX19lY2hvSGV4QmluYXJ5KHN0cnVjdCB4c2RfX2hleEJpbmFyeSBpbnB1dEhleEJpbmFyeSwgc3RydWN0IHhzZF9faGV4QmluYXJ5ICZfcmV0dXJuKTsKKwordHlwZWRlZiBjaGFyICp4c2RfX2RlY2ltYWw7Cituc19fZWNob0RlY2ltYWwoeHNkX19kZWNpbWFsIGlucHV0RGVjaW1hbCwgeHNkX19kZWNpbWFsICZfcmV0dXJuKTsKKwordHlwZWRlZiBib29sIHhzZF9fYm9vbGVhbjsKK25zX19lY2hvQm9vbGVhbih4c2RfX2Jvb2xlYW4gaW5wdXRCb29sZWFuLCB4c2RfX2Jvb2xlYW4gJl9yZXR1cm4pOworCisvLyBJbnRlcm9wIHRlc3QgQiByb3VuZCAyCisKK25zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlcworKAlzdHJ1Y3QJc19fU09BUFN0cnVjdCBfaW5wdXRTdHJ1Y3QsCisJc3RydWN0CW5zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlc1Jlc3BvbnNlCisJewl4c2RfX3N0cmluZwlfb3V0cHV0U3RyaW5nOworCQl4c2RfX2ludAkqX291dHB1dEludGVnZXI7CisJCXhzZF9fZmxvYXQJKl9vdXRwdXRGbG9hdDsKKwl9ICYJcmVzdWx0CispOworCituc19fZWNob1NpbXBsZVR5cGVzQXNTdHJ1Y3QKKygJeHNkX19zdHJpbmcJaW5wdXRTdHJpbmcsCisJeHNkX19pbnQJKmlucHV0SW50ZWdlciwKKwl4c2RfX2Zsb2F0CSppbnB1dEZsb2F0LAorCXN0cnVjdAluc19fZWNob1NpbXBsZVR5cGVzQXNTdHJ1Y3RSZXNwb25zZQorCXsJc3RydWN0CXNfX1NPQVBTdHJ1Y3QJX3JldHVybjsKKwl9ICYJcmVzdWx0CispOworCitzdHJ1Y3QJQXJyYXlPZnN0cmluZzJECit7CXhzZF9fc3RyaW5nICoJX19wdHI7CisJaW50CQlfX3NpemVbMl07CisJaW50CQlfX29mZnNldFsyXTsKK307CisKK25zX19lY2hvMkRTdHJpbmdBcnJheShzdHJ1Y3QgQXJyYXlPZnN0cmluZzJEIF9pbnB1dDJEU3RyaW5nQXJyYXksIHN0cnVjdCBBcnJheU9mc3RyaW5nMkQgJl9yZXR1cm4pOworCitzdHJ1Y3QJc19fU09BUFN0cnVjdFN0cnVjdAorewl4c2RfX3N0cmluZwkJdmFyU3RyaW5nOworCXhzZF9faW50ICoJCXZhckludDsKKwl4c2RfX2Zsb2F0ICoJCXZhckZsb2F0OworCXN0cnVjdAlzX19TT0FQU3RydWN0ICoJdmFyU3RydWN0OworfTsKKworbnNfX2VjaG9OZXN0ZWRTdHJ1Y3QKKygJc3RydWN0CXNfX1NPQVBTdHJ1Y3RTdHJ1Y3QJX2lucHV0U3RydWN0LAorCXN0cnVjdAluc19fZWNob05lc3RlZFN0cnVjdFJlc3BvbnNlCisJewlzdHJ1Y3QJc19fU09BUFN0cnVjdFN0cnVjdAlfcmV0dXJuOworCX0gJglyZXN1bHQKKyk7CisKK3N0cnVjdAlzX19TT0FQQXJyYXlTdHJ1Y3QKK3sJeHNkX19zdHJpbmcJCXZhclN0cmluZzsKKwl4c2RfX2ludCAqCQl2YXJJbnQ7CisJeHNkX19mbG9hdCAqCQl2YXJGbG9hdDsKKwlzdHJ1Y3QJQXJyYXlPZnN0cmluZwl2YXJBcnJheTsKK307CisKK25zX19lY2hvTmVzdGVkQXJyYXkKKygJc3RydWN0CXNfX1NPQVBBcnJheVN0cnVjdAlfaW5wdXRTdHJ1Y3QsCisJc3RydWN0CW5zX19lY2hvTmVzdGVkQXJyYXlSZXNwb25zZQorCXsJc3RydWN0CXNfX1NPQVBBcnJheVN0cnVjdAlfcmV0dXJuOworCX0gJglyZXN1bHQKKyk7CisKKy8vIEludGVyb3AgdGVzdCBDIHJvdW5kIDIKKworLy9nc29hcCBoIHNjaGVtYSBuYW1lc3BhY2U6IGh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvZWNob2hlYWRlci8KK3N0cnVjdCBTT0FQX0VOVl9fSGVhZGVyCit7CWNoYXIgKgkJCQkJaF9fZWNob01lU3RyaW5nUmVxdWVzdDsKKwltdXN0VW5kZXJzdGFuZCBjaGFyICoJCQloX19lY2hvTWVTdHJpbmdSZXF1ZXN0XzsKKwljaGFyICoJCQkJCWhfX2VjaG9NZVN0cmluZ1Jlc3BvbnNlOworCXN0cnVjdCBzX19TT0FQU3RydWN0ICoJCQloX19lY2hvTWVTdHJ1Y3RSZXF1ZXN0OworCW11c3RVbmRlcnN0YW5kIHN0cnVjdCBzX19TT0FQU3RydWN0ICoJaF9fZWNob01lU3RydWN0UmVxdWVzdF87CisJc3RydWN0IHNfX1NPQVBTdHJ1Y3QgKgkJCWhfX2VjaG9NZVN0cnVjdFJlc3BvbnNlOworCWNoYXIgKgkJCQkJaF9fc29tZVVua25vd25SZXF1ZXN0OwkvLyBkbyBub3QgaW5jbHVkZSBpbiBzZXJ2ZXIKKwltdXN0VW5kZXJzdGFuZCBjaGFyICoJCQloX19zb21lVW5rbm93blJlcXVlc3RfOwkvLyBkbyBub3QgaW5jbHVkZSBpbiBzZXJ2ZXIKK307CisKKy8vZ3NvYXAgbSBzZXJ2aWNlIG5hbWU6IGludGVyb3AyQworLy9nc29hcCBtIHNlcnZpY2Ugc3R5bGU6IHJwYworLy9nc29hcCBtIHNlcnZpY2UgZW5jb2Rpbmc6IGVuY29kZWQKKy8vZ3NvYXAgbSBzZXJ2aWNlIHBvcnQ6IGh0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9pbnRlcm9wMkMuY2dpCisvL2dzb2FwIG0gc2VydmljZSBuYW1lc3BhY2U6IGh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvCisvL2dzb2FwIG0gc2VydmljZSBtZXRob2QtaW5wdXQtaGVhZGVyLXBhcnQ6IGVjaG9Wb2lkIGhfX2VjaG9NZVN0cmluZ1JlcXVlc3QKKy8vZ3NvYXAgbSBzZXJ2aWNlIG1ldGhvZC1pbnB1dC1oZWFkZXItcGFydDogZWNob1ZvaWQgaF9fZWNob01lU3RydWN0UmVxdWVzdAorLy9nc29hcCBtIHNlcnZpY2UgbWV0aG9kLW91dHB1dC1oZWFkZXItcGFydDogZWNob1ZvaWQgaF9fZWNob01lU3RyaW5nUmVzcG9uc2UKKy8vZ3NvYXAgbSBzZXJ2aWNlIG1ldGhvZC1vdXRwdXQtaGVhZGVyLXBhcnQ6IGVjaG9Wb2lkIGhfX2VjaG9NZVN0cnVjdFJlc3BvbnNlCitpbnQgbV9fZWNob1ZvaWQoc3RydWN0IG1fX2VjaG9Wb2lkUmVzcG9uc2UgeyB9ICZyZXN1bHQpOwpkaWZmIC0tZ2l0IGEvZ3NvYXAtcGFsbS9pbnRlcm9wL3NyYy9zb2FwQzIuY3BwIGIvZ3NvYXAtcGFsbS9pbnRlcm9wL3NyYy9zb2FwQzIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3M2Y1YzAKLS0tIC9kZXYvbnVsbAorKysgYi9nc29hcC1wYWxtL2ludGVyb3Avc3JjL3NvYXBDMi5jcHAKQEAgLTAsMCArMSwzMTE0IEBACisKKyNpbmNsdWRlICJzb2FwSC5oIgorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9uc19fZWNob05lc3RlZEFycmF5KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG9OZXN0ZWRBcnJheSAqYSkKK3sKKwkodm9pZClzb2FwOyAodm9pZClhOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8KKwlzb2FwX3NlcmlhbGl6ZV9zX19TT0FQQXJyYXlTdHJ1Y3Qoc29hcCwgJmEtPl9pbnB1dFN0cnVjdCk7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9uc19fZWNob05lc3RlZEFycmF5KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2VjaG9OZXN0ZWRBcnJheSAqYSkKK3sKKwkodm9pZClzb2FwOyAodm9pZClhOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8KKwlzb2FwX2RlZmF1bHRfc19fU09BUEFycmF5U3RydWN0KHNvYXAsICZhLT5faW5wdXRTdHJ1Y3QpOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X25zX19lY2hvTmVzdGVkQXJyYXkoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBuc19fZWNob05lc3RlZEFycmF5ICphLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmVnaXN0ZXIgaW50IGlkID0gc29hcF9lbWJlZChzb2FwLCAodm9pZCopYSwgTlVMTCwgMCwgdGFnLCBTT0FQX1RZUEVfbnNfX2VjaG9OZXN0ZWRBcnJheSk7CisJaWYgKHNvYXBfb3V0X25zX19lY2hvTmVzdGVkQXJyYXkoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9uc19fZWNob05lc3RlZEFycmF5KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgc3RydWN0IG5zX19lY2hvTmVzdGVkQXJyYXkgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIGEsIFNPQVBfVFlQRV9uc19fZWNob05lc3RlZEFycmF5KSwgdHlwZSk7CisJc29hcF9vdXRfc19fU09BUEFycmF5U3RydWN0KHNvYXAsICJpbnB1dFN0cnVjdCIsIC0xLCAmYS0+X2lucHV0U3RydWN0LCAiIik7CisJc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKKwlyZXR1cm4gU09BUF9PSzsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9OZXN0ZWRBcnJheSAqIFNPQVBfRk1BQzQgc29hcF9nZXRfbnNfX2VjaG9OZXN0ZWRBcnJheShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvTmVzdGVkQXJyYXkgKnAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoKHAgPSBzb2FwX2luX25zX19lY2hvTmVzdGVkQXJyYXkoc29hcCwgdGFnLCBwLCB0eXBlKSkpCisJCXNvYXBfZ2V0aW5kZXBlbmRlbnQoc29hcCk7CisJcmV0dXJuIHA7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvTmVzdGVkQXJyYXkgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fbnNfX2VjaG9OZXN0ZWRBcnJheShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzdHJ1Y3QgbnNfX2VjaG9OZXN0ZWRBcnJheSAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlzaG9ydCBzb2FwX2ZsYWdfX2lucHV0U3RydWN0ID0gMTsKKwlpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisJCXJldHVybiBOVUxMOworCWlmICgqc29hcC0+dHlwZSAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKSkKKwl7CXNvYXAtPmVycm9yID0gU09BUF9UWVBFOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYSA9IChzdHJ1Y3QgbnNfX2VjaG9OZXN0ZWRBcnJheSAqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIGEsIFNPQVBfVFlQRV9uc19fZWNob05lc3RlZEFycmF5LCBzaXplb2Yoc3RydWN0IG5zX19lY2hvTmVzdGVkQXJyYXkpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwlpZiAoIWEpCisJCXJldHVybiBOVUxMOworCXNvYXBfZGVmYXVsdF9uc19fZWNob05lc3RlZEFycmF5KHNvYXAsIGEpOworCWlmIChzb2FwLT5ib2R5ICYmICEqc29hcC0+aHJlZikKKwl7CisJCWZvciAoOzspCisJCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RBR19NSVNNQVRDSDsKKwkJCWlmIChzb2FwX2ZsYWdfX2lucHV0U3RydWN0ICYmIHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCWlmIChzb2FwX2luX3NfX1NPQVBBcnJheVN0cnVjdChzb2FwLCBOVUxMLCAmYS0+X2lucHV0U3RydWN0LCAiczpTT0FQQXJyYXlTdHJ1Y3QiKSkKKwkJCQl7CXNvYXBfZmxhZ19faW5wdXRTdHJ1Y3QtLTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCXNvYXAtPmVycm9yID0gc29hcF9pZ25vcmVfZWxlbWVudChzb2FwKTsKKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykKKwkJCQlicmVhazsKKwkJCWlmIChzb2FwLT5lcnJvcikKKwkJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIChzb2FwX2ZsYWdfX2lucHV0U3RydWN0ID4gMCkpCisJCXsJc29hcC0+ZXJyb3IgPSBTT0FQX09DQ1VSUzsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWlmIChzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJZWxzZQorCXsJYSA9IChzdHJ1Y3QgbnNfX2VjaG9OZXN0ZWRBcnJheSAqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCAodm9pZCoqKWEsIDAsIFNPQVBfVFlQRV9uc19fZWNob05lc3RlZEFycmF5LCAwLCBzaXplb2Yoc3RydWN0IG5zX19lY2hvTmVzdGVkQXJyYXkpLCAwLCBOVUxMKTsKKwkJaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBhOworfQorCitTT0FQX0ZNQUM1IHN0cnVjdCBuc19fZWNob05lc3RlZEFycmF5ICogU09BUF9GTUFDNiBzb2FwX25ld19uc19fZWNob05lc3RlZEFycmF5KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbikKK3sJcmV0dXJuIHNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG9OZXN0ZWRBcnJheShzb2FwLCBuLCBOVUxMLCBOVUxMLCBOVUxMKTsKK30KKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfbnNfX2VjaG9OZXN0ZWRBcnJheShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvTmVzdGVkQXJyYXkgKnApCit7CXNvYXBfZGVsZXRlKHNvYXAsIHApOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob05lc3RlZEFycmF5ICogU09BUF9GTUFDNCBzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvTmVzdGVkQXJyYXkoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICphcnJheVR5cGUsIHNpemVfdCAqc2l6ZSkKK3sKKwlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgInNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG9OZXN0ZWRBcnJheSglZCwgJXMsICVzKVxuIiwgbiwgdHlwZT90eXBlOiIiLCBhcnJheVR5cGU/YXJyYXlUeXBlOiIiKSk7CisJc3RydWN0IHNvYXBfY2xpc3QgKmNwID0gc29hcF9saW5rKHNvYXAsIE5VTEwsIFNPQVBfVFlQRV9uc19fZWNob05lc3RlZEFycmF5LCBuLCBzb2FwX2ZkZWxldGUpOworCWlmICghY3ApCisJCXJldHVybiBOVUxMOworCWlmIChuIDwgMCkKKwl7CWNwLT5wdHIgPSAodm9pZCopbmV3IHN0cnVjdCBuc19fZWNob05lc3RlZEFycmF5OworCQlpZiAoc2l6ZSkKKwkJCSpzaXplID0gc2l6ZW9mKHN0cnVjdCBuc19fZWNob05lc3RlZEFycmF5KTsKKwl9CisJZWxzZQorCXsJY3AtPnB0ciA9ICh2b2lkKiluZXcgc3RydWN0IG5zX19lY2hvTmVzdGVkQXJyYXlbbl07CisJCWlmIChzaXplKQorCQkJKnNpemUgPSBuICogc2l6ZW9mKHN0cnVjdCBuc19fZWNob05lc3RlZEFycmF5KTsKKwl9CisJCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5zdGFudGlhdGVkIGxvY2F0aW9uPSVwXG4iLCBjcC0+cHRyKSk7CisJcmV0dXJuIChzdHJ1Y3QgbnNfX2VjaG9OZXN0ZWRBcnJheSopY3AtPnB0cjsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9jb3B5X25zX19lY2hvTmVzdGVkQXJyYXkoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdCwgaW50IHR0LCB2b2lkICpwLCBzaXplX3QgbGVuLCBjb25zdCB2b2lkICpxLCBzaXplX3QgbikKK3sKKwlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHlpbmcgc3RydWN0IG5zX19lY2hvTmVzdGVkQXJyYXkgJXAgLT4gJXBcbiIsIHEsIHApKTsKKwkqKHN0cnVjdCBuc19fZWNob05lc3RlZEFycmF5KilwID0gKihzdHJ1Y3QgbnNfX2VjaG9OZXN0ZWRBcnJheSopcTsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfbnNfX2VjaG9OZXN0ZWRBcnJheVJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG9OZXN0ZWRBcnJheVJlc3BvbnNlICphKQoreworCSh2b2lkKXNvYXA7ICh2b2lkKWE7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLworCXNvYXBfc2VyaWFsaXplX3NfX1NPQVBBcnJheVN0cnVjdChzb2FwLCAmYS0+X3JldHVybik7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9uc19fZWNob05lc3RlZEFycmF5UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob05lc3RlZEFycmF5UmVzcG9uc2UgKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisJc29hcF9kZWZhdWx0X3NfX1NPQVBBcnJheVN0cnVjdChzb2FwLCAmYS0+X3JldHVybik7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfbnNfX2VjaG9OZXN0ZWRBcnJheVJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG9OZXN0ZWRBcnJheVJlc3BvbnNlICphLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmVnaXN0ZXIgaW50IGlkID0gc29hcF9lbWJlZChzb2FwLCAodm9pZCopYSwgTlVMTCwgMCwgdGFnLCBTT0FQX1RZUEVfbnNfX2VjaG9OZXN0ZWRBcnJheVJlc3BvbnNlKTsKKwlpZiAoc29hcF9vdXRfbnNfX2VjaG9OZXN0ZWRBcnJheVJlc3BvbnNlKHNvYXAsIHRhZywgaWQsIGEsIHR5cGUpKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJcmV0dXJuIHNvYXBfcHV0aW5kZXBlbmRlbnQoc29hcCk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfbnNfX2VjaG9OZXN0ZWRBcnJheVJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgc3RydWN0IG5zX19lY2hvTmVzdGVkQXJyYXlSZXNwb25zZSAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgYSwgU09BUF9UWVBFX25zX19lY2hvTmVzdGVkQXJyYXlSZXNwb25zZSksIHR5cGUpOworCXNvYXBfZWxlbWVudF9yZXN1bHQoc29hcCwgInJldHVybiIpOworCXNvYXBfb3V0X3NfX1NPQVBBcnJheVN0cnVjdChzb2FwLCAicmV0dXJuIiwgLTEsICZhLT5fcmV0dXJuLCAiIik7CisJc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKKwlyZXR1cm4gU09BUF9PSzsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9OZXN0ZWRBcnJheVJlc3BvbnNlICogU09BUF9GTUFDNCBzb2FwX2dldF9uc19fZWNob05lc3RlZEFycmF5UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob05lc3RlZEFycmF5UmVzcG9uc2UgKnAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoKHAgPSBzb2FwX2luX25zX19lY2hvTmVzdGVkQXJyYXlSZXNwb25zZShzb2FwLCB0YWcsIHAsIHR5cGUpKSkKKwkJc29hcF9nZXRpbmRlcGVuZGVudChzb2FwKTsKKwlyZXR1cm4gcDsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9OZXN0ZWRBcnJheVJlc3BvbnNlICogU09BUF9GTUFDNCBzb2FwX2luX25zX19lY2hvTmVzdGVkQXJyYXlSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzdHJ1Y3QgbnNfX2VjaG9OZXN0ZWRBcnJheVJlc3BvbnNlICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXNob3J0IHNvYXBfZmxhZ19fcmV0dXJuID0gMTsKKwlpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisJCXJldHVybiBOVUxMOworCWlmICgqc29hcC0+dHlwZSAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKSkKKwl7CXNvYXAtPmVycm9yID0gU09BUF9UWVBFOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYSA9IChzdHJ1Y3QgbnNfX2VjaG9OZXN0ZWRBcnJheVJlc3BvbnNlICopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgYSwgU09BUF9UWVBFX25zX19lY2hvTmVzdGVkQXJyYXlSZXNwb25zZSwgc2l6ZW9mKHN0cnVjdCBuc19fZWNob05lc3RlZEFycmF5UmVzcG9uc2UpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwlpZiAoIWEpCisJCXJldHVybiBOVUxMOworCXNvYXBfZGVmYXVsdF9uc19fZWNob05lc3RlZEFycmF5UmVzcG9uc2Uoc29hcCwgYSk7CisJaWYgKHNvYXAtPmJvZHkgJiYgISpzb2FwLT5ocmVmKQorCXsKKwkJZm9yICg7OykKKwkJewlzb2FwLT5lcnJvciA9IFNPQVBfVEFHX01JU01BVENIOworCQkJaWYgKHNvYXBfZmxhZ19fcmV0dXJuICYmIHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCWlmIChzb2FwX2luX3NfX1NPQVBBcnJheVN0cnVjdChzb2FwLCBOVUxMLCAmYS0+X3JldHVybiwgInM6U09BUEFycmF5U3RydWN0IikpCisJCQkJewlzb2FwX2ZsYWdfX3JldHVybi0tOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQlpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJc29hcC0+ZXJyb3IgPSBzb2FwX2lnbm9yZV9lbGVtZW50KHNvYXApOworCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfTk9fVEFHKQorCQkJCWJyZWFrOworCQkJaWYgKHNvYXAtPmVycm9yKQorCQkJCXJldHVybiBOVUxMOworCQl9CisJCWlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgKHNvYXBfZmxhZ19fcmV0dXJuID4gMCkpCisJCXsJc29hcC0+ZXJyb3IgPSBTT0FQX09DQ1VSUzsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWlmIChzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJZWxzZQorCXsJYSA9IChzdHJ1Y3QgbnNfX2VjaG9OZXN0ZWRBcnJheVJlc3BvbnNlICopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopYSwgMCwgU09BUF9UWVBFX25zX19lY2hvTmVzdGVkQXJyYXlSZXNwb25zZSwgMCwgc2l6ZW9mKHN0cnVjdCBuc19fZWNob05lc3RlZEFycmF5UmVzcG9uc2UpLCAwLCBOVUxMKTsKKwkJaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBhOworfQorCitTT0FQX0ZNQUM1IHN0cnVjdCBuc19fZWNob05lc3RlZEFycmF5UmVzcG9uc2UgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X25zX19lY2hvTmVzdGVkQXJyYXlSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4pCit7CXJldHVybiBzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvTmVzdGVkQXJyYXlSZXNwb25zZShzb2FwLCBuLCBOVUxMLCBOVUxMLCBOVUxMKTsKK30KKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfbnNfX2VjaG9OZXN0ZWRBcnJheVJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2VjaG9OZXN0ZWRBcnJheVJlc3BvbnNlICpwKQorewlzb2FwX2RlbGV0ZShzb2FwLCBwKTsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9OZXN0ZWRBcnJheVJlc3BvbnNlICogU09BUF9GTUFDNCBzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvTmVzdGVkQXJyYXlSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4sIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmFycmF5VHlwZSwgc2l6ZV90ICpzaXplKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAic29hcF9pbnN0YW50aWF0ZV9uc19fZWNob05lc3RlZEFycmF5UmVzcG9uc2UoJWQsICVzLCAlcylcbiIsIG4sIHR5cGU/dHlwZToiIiwgYXJyYXlUeXBlP2FycmF5VHlwZToiIikpOworCXN0cnVjdCBzb2FwX2NsaXN0ICpjcCA9IHNvYXBfbGluayhzb2FwLCBOVUxMLCBTT0FQX1RZUEVfbnNfX2VjaG9OZXN0ZWRBcnJheVJlc3BvbnNlLCBuLCBzb2FwX2ZkZWxldGUpOworCWlmICghY3ApCisJCXJldHVybiBOVUxMOworCWlmIChuIDwgMCkKKwl7CWNwLT5wdHIgPSAodm9pZCopbmV3IHN0cnVjdCBuc19fZWNob05lc3RlZEFycmF5UmVzcG9uc2U7CisJCWlmIChzaXplKQorCQkJKnNpemUgPSBzaXplb2Yoc3RydWN0IG5zX19lY2hvTmVzdGVkQXJyYXlSZXNwb25zZSk7CisJfQorCWVsc2UKKwl7CWNwLT5wdHIgPSAodm9pZCopbmV3IHN0cnVjdCBuc19fZWNob05lc3RlZEFycmF5UmVzcG9uc2Vbbl07CisJCWlmIChzaXplKQorCQkJKnNpemUgPSBuICogc2l6ZW9mKHN0cnVjdCBuc19fZWNob05lc3RlZEFycmF5UmVzcG9uc2UpOworCX0KKwkJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbnN0YW50aWF0ZWQgbG9jYXRpb249JXBcbiIsIGNwLT5wdHIpKTsKKwlyZXR1cm4gKHN0cnVjdCBuc19fZWNob05lc3RlZEFycmF5UmVzcG9uc2UqKWNwLT5wdHI7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfY29weV9uc19fZWNob05lc3RlZEFycmF5UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdCwgaW50IHR0LCB2b2lkICpwLCBzaXplX3QgbGVuLCBjb25zdCB2b2lkICpxLCBzaXplX3QgbikKK3sKKwlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHlpbmcgc3RydWN0IG5zX19lY2hvTmVzdGVkQXJyYXlSZXNwb25zZSAlcCAtPiAlcFxuIiwgcSwgcCkpOworCSooc3RydWN0IG5zX19lY2hvTmVzdGVkQXJyYXlSZXNwb25zZSopcCA9ICooc3RydWN0IG5zX19lY2hvTmVzdGVkQXJyYXlSZXNwb25zZSopcTsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfc19fU09BUEFycmF5U3RydWN0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3Qgc19fU09BUEFycmF5U3RydWN0ICphKQoreworCSh2b2lkKXNvYXA7ICh2b2lkKWE7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLworCXNvYXBfc2VyaWFsaXplX3hzZF9fc3RyaW5nKHNvYXAsICZhLT52YXJTdHJpbmcpOworCXNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3hzZF9faW50KHNvYXAsICZhLT52YXJJbnQpOworCXNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3hzZF9fZmxvYXQoc29hcCwgJmEtPnZhckZsb2F0KTsKKwlzb2FwX3NlcmlhbGl6ZV9BcnJheU9mc3RyaW5nKHNvYXAsICZhLT52YXJBcnJheSk7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9zX19TT0FQQXJyYXlTdHJ1Y3Qoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzX19TT0FQQXJyYXlTdHJ1Y3QgKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisJc29hcF9kZWZhdWx0X3hzZF9fc3RyaW5nKHNvYXAsICZhLT52YXJTdHJpbmcpOworCWEtPnZhckludCA9IE5VTEw7CisJYS0+dmFyRmxvYXQgPSBOVUxMOworCXNvYXBfZGVmYXVsdF9BcnJheU9mc3RyaW5nKHNvYXAsICZhLT52YXJBcnJheSk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfc19fU09BUEFycmF5U3RydWN0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3Qgc19fU09BUEFycmF5U3RydWN0ICphLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmVnaXN0ZXIgaW50IGlkID0gc29hcF9lbWJlZChzb2FwLCAodm9pZCopYSwgTlVMTCwgMCwgdGFnLCBTT0FQX1RZUEVfc19fU09BUEFycmF5U3RydWN0KTsKKwlpZiAoc29hcF9vdXRfc19fU09BUEFycmF5U3RydWN0KHNvYXAsIHRhZywgaWQsIGEsIHR5cGUpKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJcmV0dXJuIHNvYXBfcHV0aW5kZXBlbmRlbnQoc29hcCk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfc19fU09BUEFycmF5U3RydWN0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgc3RydWN0IHNfX1NPQVBBcnJheVN0cnVjdCAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgYSwgU09BUF9UWVBFX3NfX1NPQVBBcnJheVN0cnVjdCksIHR5cGUpOworCXNvYXBfb3V0X3hzZF9fc3RyaW5nKHNvYXAsICJ2YXJTdHJpbmciLCAtMSwgJmEtPnZhclN0cmluZywgIiIpOworCXNvYXBfb3V0X1BvaW50ZXJUb3hzZF9faW50KHNvYXAsICJ2YXJJbnQiLCAtMSwgJmEtPnZhckludCwgIiIpOworCXNvYXBfb3V0X1BvaW50ZXJUb3hzZF9fZmxvYXQoc29hcCwgInZhckZsb2F0IiwgLTEsICZhLT52YXJGbG9hdCwgIiIpOworCXNvYXBfb3V0X0FycmF5T2ZzdHJpbmcoc29hcCwgInZhckFycmF5IiwgLTEsICZhLT52YXJBcnJheSwgIiIpOworCXNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7CisJcmV0dXJuIFNPQVBfT0s7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IHNfX1NPQVBBcnJheVN0cnVjdCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfc19fU09BUEFycmF5U3RydWN0KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc19fU09BUEFycmF5U3RydWN0ICpwLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKChwID0gc29hcF9pbl9zX19TT0FQQXJyYXlTdHJ1Y3Qoc29hcCwgdGFnLCBwLCB0eXBlKSkpCisJCXNvYXBfZ2V0aW5kZXBlbmRlbnQoc29hcCk7CisJcmV0dXJuIHA7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IHNfX1NPQVBBcnJheVN0cnVjdCAqIFNPQVBfRk1BQzQgc29hcF9pbl9zX19TT0FQQXJyYXlTdHJ1Y3Qoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc3RydWN0IHNfX1NPQVBBcnJheVN0cnVjdCAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlzaG9ydCBzb2FwX2ZsYWdfdmFyU3RyaW5nID0gMSwgc29hcF9mbGFnX3ZhckludCA9IDEsIHNvYXBfZmxhZ192YXJGbG9hdCA9IDEsIHNvYXBfZmxhZ192YXJBcnJheSA9IDE7CisJaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoKnNvYXAtPnR5cGUgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkpCisJewlzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWEgPSAoc3RydWN0IHNfX1NPQVBBcnJheVN0cnVjdCAqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIGEsIFNPQVBfVFlQRV9zX19TT0FQQXJyYXlTdHJ1Y3QsIHNpemVvZihzdHJ1Y3Qgc19fU09BUEFycmF5U3RydWN0KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJaWYgKCFhKQorCQlyZXR1cm4gTlVMTDsKKwlzb2FwX2RlZmF1bHRfc19fU09BUEFycmF5U3RydWN0KHNvYXAsIGEpOworCWlmIChzb2FwLT5ib2R5ICYmICEqc29hcC0+aHJlZikKKwl7CisJCWZvciAoOzspCisJCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RBR19NSVNNQVRDSDsKKwkJCWlmIChzb2FwX2ZsYWdfdmFyU3RyaW5nICYmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCB8fCBzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykpCisJCQkJaWYgKHNvYXBfaW5feHNkX19zdHJpbmcoc29hcCwgInZhclN0cmluZyIsICZhLT52YXJTdHJpbmcsICJ4c2Q6c3RyaW5nIikpCisJCQkJewlzb2FwX2ZsYWdfdmFyU3RyaW5nLS07CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCWlmIChzb2FwX2ZsYWdfdmFySW50ICYmIHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCWlmIChzb2FwX2luX1BvaW50ZXJUb3hzZF9faW50KHNvYXAsICJ2YXJJbnQiLCAmYS0+dmFySW50LCAieHNkOmludCIpKQorCQkJCXsJc29hcF9mbGFnX3ZhckludC0tOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQlpZiAoc29hcF9mbGFnX3ZhckZsb2F0ICYmIHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCWlmIChzb2FwX2luX1BvaW50ZXJUb3hzZF9fZmxvYXQoc29hcCwgInZhckZsb2F0IiwgJmEtPnZhckZsb2F0LCAieHNkOmZsb2F0IikpCisJCQkJewlzb2FwX2ZsYWdfdmFyRmxvYXQtLTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXBfZmxhZ192YXJBcnJheSAmJiBzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlpZiAoc29hcF9pbl9BcnJheU9mc3RyaW5nKHNvYXAsICJ2YXJBcnJheSIsICZhLT52YXJBcnJheSwgInhzZDpzdHJpbmciKSkKKwkJCQl7CXNvYXBfZmxhZ192YXJBcnJheS0tOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQlpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJc29hcC0+ZXJyb3IgPSBzb2FwX2lnbm9yZV9lbGVtZW50KHNvYXApOworCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfTk9fVEFHKQorCQkJCWJyZWFrOworCQkJaWYgKHNvYXAtPmVycm9yKQorCQkJCXJldHVybiBOVUxMOworCQl9CisJCWlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgKHNvYXBfZmxhZ192YXJBcnJheSA+IDApKQorCQl7CXNvYXAtPmVycm9yID0gU09BUF9PQ0NVUlM7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCWVsc2UKKwl7CWEgPSAoc3RydWN0IHNfX1NPQVBBcnJheVN0cnVjdCAqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCAodm9pZCoqKWEsIDAsIFNPQVBfVFlQRV9zX19TT0FQQXJyYXlTdHJ1Y3QsIDAsIHNpemVvZihzdHJ1Y3Qgc19fU09BUEFycmF5U3RydWN0KSwgMCwgTlVMTCk7CisJCWlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gYTsKK30KKworU09BUF9GTUFDNSBzdHJ1Y3Qgc19fU09BUEFycmF5U3RydWN0ICogU09BUF9GTUFDNiBzb2FwX25ld19zX19TT0FQQXJyYXlTdHJ1Y3Qoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuKQorewlyZXR1cm4gc29hcF9pbnN0YW50aWF0ZV9zX19TT0FQQXJyYXlTdHJ1Y3Qoc29hcCwgbiwgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3NfX1NPQVBBcnJheVN0cnVjdChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNfX1NPQVBBcnJheVN0cnVjdCAqcCkKK3sJc29hcF9kZWxldGUoc29hcCwgcCk7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IHNfX1NPQVBBcnJheVN0cnVjdCAqIFNPQVBfRk1BQzQgc29hcF9pbnN0YW50aWF0ZV9zX19TT0FQQXJyYXlTdHJ1Y3Qoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICphcnJheVR5cGUsIHNpemVfdCAqc2l6ZSkKK3sKKwlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgInNvYXBfaW5zdGFudGlhdGVfc19fU09BUEFycmF5U3RydWN0KCVkLCAlcywgJXMpXG4iLCBuLCB0eXBlP3R5cGU6IiIsIGFycmF5VHlwZT9hcnJheVR5cGU6IiIpKTsKKwlzdHJ1Y3Qgc29hcF9jbGlzdCAqY3AgPSBzb2FwX2xpbmsoc29hcCwgTlVMTCwgU09BUF9UWVBFX3NfX1NPQVBBcnJheVN0cnVjdCwgbiwgc29hcF9mZGVsZXRlKTsKKwlpZiAoIWNwKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAobiA8IDApCisJewljcC0+cHRyID0gKHZvaWQqKW5ldyBzdHJ1Y3Qgc19fU09BUEFycmF5U3RydWN0OworCQlpZiAoc2l6ZSkKKwkJCSpzaXplID0gc2l6ZW9mKHN0cnVjdCBzX19TT0FQQXJyYXlTdHJ1Y3QpOworCX0KKwllbHNlCisJewljcC0+cHRyID0gKHZvaWQqKW5ldyBzdHJ1Y3Qgc19fU09BUEFycmF5U3RydWN0W25dOworCQlpZiAoc2l6ZSkKKwkJCSpzaXplID0gbiAqIHNpemVvZihzdHJ1Y3Qgc19fU09BUEFycmF5U3RydWN0KTsKKwl9CisJCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5zdGFudGlhdGVkIGxvY2F0aW9uPSVwXG4iLCBjcC0+cHRyKSk7CisJcmV0dXJuIChzdHJ1Y3Qgc19fU09BUEFycmF5U3RydWN0KiljcC0+cHRyOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2NvcHlfc19fU09BUEFycmF5U3RydWN0KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3QsIGludCB0dCwgdm9pZCAqcCwgc2l6ZV90IGxlbiwgY29uc3Qgdm9pZCAqcSwgc2l6ZV90IG4pCit7CisJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5aW5nIHN0cnVjdCBzX19TT0FQQXJyYXlTdHJ1Y3QgJXAgLT4gJXBcbiIsIHEsIHApKTsKKwkqKHN0cnVjdCBzX19TT0FQQXJyYXlTdHJ1Y3QqKXAgPSAqKHN0cnVjdCBzX19TT0FQQXJyYXlTdHJ1Y3QqKXE7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX25zX19lY2hvTmVzdGVkU3RydWN0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG9OZXN0ZWRTdHJ1Y3QgKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisJc29hcF9zZXJpYWxpemVfc19fU09BUFN0cnVjdFN0cnVjdChzb2FwLCAmYS0+X2lucHV0U3RydWN0KTsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X25zX19lY2hvTmVzdGVkU3RydWN0KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2VjaG9OZXN0ZWRTdHJ1Y3QgKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisJc29hcF9kZWZhdWx0X3NfX1NPQVBTdHJ1Y3RTdHJ1Y3Qoc29hcCwgJmEtPl9pbnB1dFN0cnVjdCk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfbnNfX2VjaG9OZXN0ZWRTdHJ1Y3Qoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBuc19fZWNob05lc3RlZFN0cnVjdCAqYSwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCXJlZ2lzdGVyIGludCBpZCA9IHNvYXBfZW1iZWQoc29hcCwgKHZvaWQqKWEsIE5VTEwsIDAsIHRhZywgU09BUF9UWVBFX25zX19lY2hvTmVzdGVkU3RydWN0KTsKKwlpZiAoc29hcF9vdXRfbnNfX2VjaG9OZXN0ZWRTdHJ1Y3Qoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9uc19fZWNob05lc3RlZFN0cnVjdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHN0cnVjdCBuc19fZWNob05lc3RlZFN0cnVjdCAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgYSwgU09BUF9UWVBFX25zX19lY2hvTmVzdGVkU3RydWN0KSwgdHlwZSk7CisJc29hcF9vdXRfc19fU09BUFN0cnVjdFN0cnVjdChzb2FwLCAiaW5wdXRTdHJ1Y3QiLCAtMSwgJmEtPl9pbnB1dFN0cnVjdCwgIiIpOworCXNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7CisJcmV0dXJuIFNPQVBfT0s7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvTmVzdGVkU3RydWN0ICogU09BUF9GTUFDNCBzb2FwX2dldF9uc19fZWNob05lc3RlZFN0cnVjdChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvTmVzdGVkU3RydWN0ICpwLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKChwID0gc29hcF9pbl9uc19fZWNob05lc3RlZFN0cnVjdChzb2FwLCB0YWcsIHAsIHR5cGUpKSkKKwkJc29hcF9nZXRpbmRlcGVuZGVudChzb2FwKTsKKwlyZXR1cm4gcDsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9OZXN0ZWRTdHJ1Y3QgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fbnNfX2VjaG9OZXN0ZWRTdHJ1Y3Qoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc3RydWN0IG5zX19lY2hvTmVzdGVkU3RydWN0ICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXNob3J0IHNvYXBfZmxhZ19faW5wdXRTdHJ1Y3QgPSAxOworCWlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCpzb2FwLT50eXBlICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpKQorCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisJCXJldHVybiBOVUxMOworCX0KKwlhID0gKHN0cnVjdCBuc19fZWNob05lc3RlZFN0cnVjdCAqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIGEsIFNPQVBfVFlQRV9uc19fZWNob05lc3RlZFN0cnVjdCwgc2l6ZW9mKHN0cnVjdCBuc19fZWNob05lc3RlZFN0cnVjdCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworCWlmICghYSkKKwkJcmV0dXJuIE5VTEw7CisJc29hcF9kZWZhdWx0X25zX19lY2hvTmVzdGVkU3RydWN0KHNvYXAsIGEpOworCWlmIChzb2FwLT5ib2R5ICYmICEqc29hcC0+aHJlZikKKwl7CisJCWZvciAoOzspCisJCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RBR19NSVNNQVRDSDsKKwkJCWlmIChzb2FwX2ZsYWdfX2lucHV0U3RydWN0ICYmIHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCWlmIChzb2FwX2luX3NfX1NPQVBTdHJ1Y3RTdHJ1Y3Qoc29hcCwgTlVMTCwgJmEtPl9pbnB1dFN0cnVjdCwgInM6U09BUFN0cnVjdFN0cnVjdCIpKQorCQkJCXsJc29hcF9mbGFnX19pbnB1dFN0cnVjdC0tOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQlpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJc29hcC0+ZXJyb3IgPSBzb2FwX2lnbm9yZV9lbGVtZW50KHNvYXApOworCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfTk9fVEFHKQorCQkJCWJyZWFrOworCQkJaWYgKHNvYXAtPmVycm9yKQorCQkJCXJldHVybiBOVUxMOworCQl9CisJCWlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgKHNvYXBfZmxhZ19faW5wdXRTdHJ1Y3QgPiAwKSkKKwkJewlzb2FwLT5lcnJvciA9IFNPQVBfT0NDVVJTOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwllbHNlCisJewlhID0gKHN0cnVjdCBuc19fZWNob05lc3RlZFN0cnVjdCAqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCAodm9pZCoqKWEsIDAsIFNPQVBfVFlQRV9uc19fZWNob05lc3RlZFN0cnVjdCwgMCwgc2l6ZW9mKHN0cnVjdCBuc19fZWNob05lc3RlZFN0cnVjdCksIDAsIE5VTEwpOworCQlpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGE7Cit9CisKK1NPQVBfRk1BQzUgc3RydWN0IG5zX19lY2hvTmVzdGVkU3RydWN0ICogU09BUF9GTUFDNiBzb2FwX25ld19uc19fZWNob05lc3RlZFN0cnVjdChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4pCit7CXJldHVybiBzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvTmVzdGVkU3RydWN0KHNvYXAsIG4sIE5VTEwsIE5VTEwsIE5VTEwpOworfQorCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9uc19fZWNob05lc3RlZFN0cnVjdChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvTmVzdGVkU3RydWN0ICpwKQorewlzb2FwX2RlbGV0ZShzb2FwLCBwKTsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9OZXN0ZWRTdHJ1Y3QgKiBTT0FQX0ZNQUM0IHNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG9OZXN0ZWRTdHJ1Y3Qoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICphcnJheVR5cGUsIHNpemVfdCAqc2l6ZSkKK3sKKwlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgInNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG9OZXN0ZWRTdHJ1Y3QoJWQsICVzLCAlcylcbiIsIG4sIHR5cGU/dHlwZToiIiwgYXJyYXlUeXBlP2FycmF5VHlwZToiIikpOworCXN0cnVjdCBzb2FwX2NsaXN0ICpjcCA9IHNvYXBfbGluayhzb2FwLCBOVUxMLCBTT0FQX1RZUEVfbnNfX2VjaG9OZXN0ZWRTdHJ1Y3QsIG4sIHNvYXBfZmRlbGV0ZSk7CisJaWYgKCFjcCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKG4gPCAwKQorCXsJY3AtPnB0ciA9ICh2b2lkKiluZXcgc3RydWN0IG5zX19lY2hvTmVzdGVkU3RydWN0OworCQlpZiAoc2l6ZSkKKwkJCSpzaXplID0gc2l6ZW9mKHN0cnVjdCBuc19fZWNob05lc3RlZFN0cnVjdCk7CisJfQorCWVsc2UKKwl7CWNwLT5wdHIgPSAodm9pZCopbmV3IHN0cnVjdCBuc19fZWNob05lc3RlZFN0cnVjdFtuXTsKKwkJaWYgKHNpemUpCisJCQkqc2l6ZSA9IG4gKiBzaXplb2Yoc3RydWN0IG5zX19lY2hvTmVzdGVkU3RydWN0KTsKKwl9CisJCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5zdGFudGlhdGVkIGxvY2F0aW9uPSVwXG4iLCBjcC0+cHRyKSk7CisJcmV0dXJuIChzdHJ1Y3QgbnNfX2VjaG9OZXN0ZWRTdHJ1Y3QqKWNwLT5wdHI7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfY29weV9uc19fZWNob05lc3RlZFN0cnVjdChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0LCBpbnQgdHQsIHZvaWQgKnAsIHNpemVfdCBsZW4sIGNvbnN0IHZvaWQgKnEsIHNpemVfdCBuKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weWluZyBzdHJ1Y3QgbnNfX2VjaG9OZXN0ZWRTdHJ1Y3QgJXAgLT4gJXBcbiIsIHEsIHApKTsKKwkqKHN0cnVjdCBuc19fZWNob05lc3RlZFN0cnVjdCopcCA9ICooc3RydWN0IG5zX19lY2hvTmVzdGVkU3RydWN0KilxOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9uc19fZWNob05lc3RlZFN0cnVjdFJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG9OZXN0ZWRTdHJ1Y3RSZXNwb25zZSAqYSkKK3sKKwkodm9pZClzb2FwOyAodm9pZClhOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8KKwlzb2FwX3NlcmlhbGl6ZV9zX19TT0FQU3RydWN0U3RydWN0KHNvYXAsICZhLT5fcmV0dXJuKTsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X25zX19lY2hvTmVzdGVkU3RydWN0UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob05lc3RlZFN0cnVjdFJlc3BvbnNlICphKQoreworCSh2b2lkKXNvYXA7ICh2b2lkKWE7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLworCXNvYXBfZGVmYXVsdF9zX19TT0FQU3RydWN0U3RydWN0KHNvYXAsICZhLT5fcmV0dXJuKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9uc19fZWNob05lc3RlZFN0cnVjdFJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG9OZXN0ZWRTdHJ1Y3RSZXNwb25zZSAqYSwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCXJlZ2lzdGVyIGludCBpZCA9IHNvYXBfZW1iZWQoc29hcCwgKHZvaWQqKWEsIE5VTEwsIDAsIHRhZywgU09BUF9UWVBFX25zX19lY2hvTmVzdGVkU3RydWN0UmVzcG9uc2UpOworCWlmIChzb2FwX291dF9uc19fZWNob05lc3RlZFN0cnVjdFJlc3BvbnNlKHNvYXAsIHRhZywgaWQsIGEsIHR5cGUpKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJcmV0dXJuIHNvYXBfcHV0aW5kZXBlbmRlbnQoc29hcCk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfbnNfX2VjaG9OZXN0ZWRTdHJ1Y3RSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHN0cnVjdCBuc19fZWNob05lc3RlZFN0cnVjdFJlc3BvbnNlICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBhLCBTT0FQX1RZUEVfbnNfX2VjaG9OZXN0ZWRTdHJ1Y3RSZXNwb25zZSksIHR5cGUpOworCXNvYXBfZWxlbWVudF9yZXN1bHQoc29hcCwgInJldHVybiIpOworCXNvYXBfb3V0X3NfX1NPQVBTdHJ1Y3RTdHJ1Y3Qoc29hcCwgInJldHVybiIsIC0xLCAmYS0+X3JldHVybiwgIiIpOworCXNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7CisJcmV0dXJuIFNPQVBfT0s7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvTmVzdGVkU3RydWN0UmVzcG9uc2UgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X25zX19lY2hvTmVzdGVkU3RydWN0UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob05lc3RlZFN0cnVjdFJlc3BvbnNlICpwLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKChwID0gc29hcF9pbl9uc19fZWNob05lc3RlZFN0cnVjdFJlc3BvbnNlKHNvYXAsIHRhZywgcCwgdHlwZSkpKQorCQlzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOworCXJldHVybiBwOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob05lc3RlZFN0cnVjdFJlc3BvbnNlICogU09BUF9GTUFDNCBzb2FwX2luX25zX19lY2hvTmVzdGVkU3RydWN0UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc3RydWN0IG5zX19lY2hvTmVzdGVkU3RydWN0UmVzcG9uc2UgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc2hvcnQgc29hcF9mbGFnX19yZXR1cm4gPSAxOworCWlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCpzb2FwLT50eXBlICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpKQorCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisJCXJldHVybiBOVUxMOworCX0KKwlhID0gKHN0cnVjdCBuc19fZWNob05lc3RlZFN0cnVjdFJlc3BvbnNlICopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgYSwgU09BUF9UWVBFX25zX19lY2hvTmVzdGVkU3RydWN0UmVzcG9uc2UsIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9OZXN0ZWRTdHJ1Y3RSZXNwb25zZSksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworCWlmICghYSkKKwkJcmV0dXJuIE5VTEw7CisJc29hcF9kZWZhdWx0X25zX19lY2hvTmVzdGVkU3RydWN0UmVzcG9uc2Uoc29hcCwgYSk7CisJaWYgKHNvYXAtPmJvZHkgJiYgISpzb2FwLT5ocmVmKQorCXsKKwkJZm9yICg7OykKKwkJewlzb2FwLT5lcnJvciA9IFNPQVBfVEFHX01JU01BVENIOworCQkJaWYgKHNvYXBfZmxhZ19fcmV0dXJuICYmIHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCWlmIChzb2FwX2luX3NfX1NPQVBTdHJ1Y3RTdHJ1Y3Qoc29hcCwgTlVMTCwgJmEtPl9yZXR1cm4sICJzOlNPQVBTdHJ1Y3RTdHJ1Y3QiKSkKKwkJCQl7CXNvYXBfZmxhZ19fcmV0dXJuLS07CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlzb2FwLT5lcnJvciA9IHNvYXBfaWdub3JlX2VsZW1lbnQoc29hcCk7CisJCQlpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcpCisJCQkJYnJlYWs7CisJCQlpZiAoc29hcC0+ZXJyb3IpCisJCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiAoc29hcF9mbGFnX19yZXR1cm4gPiAwKSkKKwkJewlzb2FwLT5lcnJvciA9IFNPQVBfT0NDVVJTOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwllbHNlCisJewlhID0gKHN0cnVjdCBuc19fZWNob05lc3RlZFN0cnVjdFJlc3BvbnNlICopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopYSwgMCwgU09BUF9UWVBFX25zX19lY2hvTmVzdGVkU3RydWN0UmVzcG9uc2UsIDAsIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9OZXN0ZWRTdHJ1Y3RSZXNwb25zZSksIDAsIE5VTEwpOworCQlpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGE7Cit9CisKK1NPQVBfRk1BQzUgc3RydWN0IG5zX19lY2hvTmVzdGVkU3RydWN0UmVzcG9uc2UgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X25zX19lY2hvTmVzdGVkU3RydWN0UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuKQorewlyZXR1cm4gc29hcF9pbnN0YW50aWF0ZV9uc19fZWNob05lc3RlZFN0cnVjdFJlc3BvbnNlKHNvYXAsIG4sIE5VTEwsIE5VTEwsIE5VTEwpOworfQorCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9uc19fZWNob05lc3RlZFN0cnVjdFJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2VjaG9OZXN0ZWRTdHJ1Y3RSZXNwb25zZSAqcCkKK3sJc29hcF9kZWxldGUoc29hcCwgcCk7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvTmVzdGVkU3RydWN0UmVzcG9uc2UgKiBTT0FQX0ZNQUM0IHNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG9OZXN0ZWRTdHJ1Y3RSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4sIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmFycmF5VHlwZSwgc2l6ZV90ICpzaXplKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAic29hcF9pbnN0YW50aWF0ZV9uc19fZWNob05lc3RlZFN0cnVjdFJlc3BvbnNlKCVkLCAlcywgJXMpXG4iLCBuLCB0eXBlP3R5cGU6IiIsIGFycmF5VHlwZT9hcnJheVR5cGU6IiIpKTsKKwlzdHJ1Y3Qgc29hcF9jbGlzdCAqY3AgPSBzb2FwX2xpbmsoc29hcCwgTlVMTCwgU09BUF9UWVBFX25zX19lY2hvTmVzdGVkU3RydWN0UmVzcG9uc2UsIG4sIHNvYXBfZmRlbGV0ZSk7CisJaWYgKCFjcCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKG4gPCAwKQorCXsJY3AtPnB0ciA9ICh2b2lkKiluZXcgc3RydWN0IG5zX19lY2hvTmVzdGVkU3RydWN0UmVzcG9uc2U7CisJCWlmIChzaXplKQorCQkJKnNpemUgPSBzaXplb2Yoc3RydWN0IG5zX19lY2hvTmVzdGVkU3RydWN0UmVzcG9uc2UpOworCX0KKwllbHNlCisJewljcC0+cHRyID0gKHZvaWQqKW5ldyBzdHJ1Y3QgbnNfX2VjaG9OZXN0ZWRTdHJ1Y3RSZXNwb25zZVtuXTsKKwkJaWYgKHNpemUpCisJCQkqc2l6ZSA9IG4gKiBzaXplb2Yoc3RydWN0IG5zX19lY2hvTmVzdGVkU3RydWN0UmVzcG9uc2UpOworCX0KKwkJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbnN0YW50aWF0ZWQgbG9jYXRpb249JXBcbiIsIGNwLT5wdHIpKTsKKwlyZXR1cm4gKHN0cnVjdCBuc19fZWNob05lc3RlZFN0cnVjdFJlc3BvbnNlKiljcC0+cHRyOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2NvcHlfbnNfX2VjaG9OZXN0ZWRTdHJ1Y3RSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0LCBpbnQgdHQsIHZvaWQgKnAsIHNpemVfdCBsZW4sIGNvbnN0IHZvaWQgKnEsIHNpemVfdCBuKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weWluZyBzdHJ1Y3QgbnNfX2VjaG9OZXN0ZWRTdHJ1Y3RSZXNwb25zZSAlcCAtPiAlcFxuIiwgcSwgcCkpOworCSooc3RydWN0IG5zX19lY2hvTmVzdGVkU3RydWN0UmVzcG9uc2UqKXAgPSAqKHN0cnVjdCBuc19fZWNob05lc3RlZFN0cnVjdFJlc3BvbnNlKilxOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9zX19TT0FQU3RydWN0U3RydWN0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3Qgc19fU09BUFN0cnVjdFN0cnVjdCAqYSkKK3sKKwkodm9pZClzb2FwOyAodm9pZClhOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8KKwlzb2FwX3NlcmlhbGl6ZV94c2RfX3N0cmluZyhzb2FwLCAmYS0+dmFyU3RyaW5nKTsKKwlzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG94c2RfX2ludChzb2FwLCAmYS0+dmFySW50KTsKKwlzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG94c2RfX2Zsb2F0KHNvYXAsICZhLT52YXJGbG9hdCk7CisJc29hcF9zZXJpYWxpemVfUG9pbnRlclRvc19fU09BUFN0cnVjdChzb2FwLCAmYS0+dmFyU3RydWN0KTsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X3NfX1NPQVBTdHJ1Y3RTdHJ1Y3Qoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzX19TT0FQU3RydWN0U3RydWN0ICphKQoreworCSh2b2lkKXNvYXA7ICh2b2lkKWE7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLworCXNvYXBfZGVmYXVsdF94c2RfX3N0cmluZyhzb2FwLCAmYS0+dmFyU3RyaW5nKTsKKwlhLT52YXJJbnQgPSBOVUxMOworCWEtPnZhckZsb2F0ID0gTlVMTDsKKwlhLT52YXJTdHJ1Y3QgPSBOVUxMOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X3NfX1NPQVBTdHJ1Y3RTdHJ1Y3Qoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBzX19TT0FQU3RydWN0U3RydWN0ICphLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmVnaXN0ZXIgaW50IGlkID0gc29hcF9lbWJlZChzb2FwLCAodm9pZCopYSwgTlVMTCwgMCwgdGFnLCBTT0FQX1RZUEVfc19fU09BUFN0cnVjdFN0cnVjdCk7CisJaWYgKHNvYXBfb3V0X3NfX1NPQVBTdHJ1Y3RTdHJ1Y3Qoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9zX19TT0FQU3RydWN0U3RydWN0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgc3RydWN0IHNfX1NPQVBTdHJ1Y3RTdHJ1Y3QgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIGEsIFNPQVBfVFlQRV9zX19TT0FQU3RydWN0U3RydWN0KSwgdHlwZSk7CisJc29hcF9vdXRfeHNkX19zdHJpbmcoc29hcCwgInZhclN0cmluZyIsIC0xLCAmYS0+dmFyU3RyaW5nLCAiIik7CisJc29hcF9vdXRfUG9pbnRlclRveHNkX19pbnQoc29hcCwgInZhckludCIsIC0xLCAmYS0+dmFySW50LCAiIik7CisJc29hcF9vdXRfUG9pbnRlclRveHNkX19mbG9hdChzb2FwLCAidmFyRmxvYXQiLCAtMSwgJmEtPnZhckZsb2F0LCAiIik7CisJc29hcF9vdXRfUG9pbnRlclRvc19fU09BUFN0cnVjdChzb2FwLCAidmFyU3RydWN0IiwgLTEsICZhLT52YXJTdHJ1Y3QsICIiKTsKKwlzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworCXJldHVybiBTT0FQX09LOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBzX19TT0FQU3RydWN0U3RydWN0ICogU09BUF9GTUFDNCBzb2FwX2dldF9zX19TT0FQU3RydWN0U3RydWN0KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc19fU09BUFN0cnVjdFN0cnVjdCAqcCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmICgocCA9IHNvYXBfaW5fc19fU09BUFN0cnVjdFN0cnVjdChzb2FwLCB0YWcsIHAsIHR5cGUpKSkKKwkJc29hcF9nZXRpbmRlcGVuZGVudChzb2FwKTsKKwlyZXR1cm4gcDsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3Qgc19fU09BUFN0cnVjdFN0cnVjdCAqIFNPQVBfRk1BQzQgc29hcF9pbl9zX19TT0FQU3RydWN0U3RydWN0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHN0cnVjdCBzX19TT0FQU3RydWN0U3RydWN0ICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXNob3J0IHNvYXBfZmxhZ192YXJTdHJpbmcgPSAxLCBzb2FwX2ZsYWdfdmFySW50ID0gMSwgc29hcF9mbGFnX3ZhckZsb2F0ID0gMSwgc29hcF9mbGFnX3ZhclN0cnVjdCA9IDE7CisJaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoKnNvYXAtPnR5cGUgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkpCisJewlzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWEgPSAoc3RydWN0IHNfX1NPQVBTdHJ1Y3RTdHJ1Y3QgKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBhLCBTT0FQX1RZUEVfc19fU09BUFN0cnVjdFN0cnVjdCwgc2l6ZW9mKHN0cnVjdCBzX19TT0FQU3RydWN0U3RydWN0KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJaWYgKCFhKQorCQlyZXR1cm4gTlVMTDsKKwlzb2FwX2RlZmF1bHRfc19fU09BUFN0cnVjdFN0cnVjdChzb2FwLCBhKTsKKwlpZiAoc29hcC0+Ym9keSAmJiAhKnNvYXAtPmhyZWYpCisJeworCQlmb3IgKDs7KQorCQl7CXNvYXAtPmVycm9yID0gU09BUF9UQUdfTUlTTUFUQ0g7CisJCQlpZiAoc29hcF9mbGFnX3ZhclN0cmluZyAmJiAoc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0ggfHwgc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcpKQorCQkJCWlmIChzb2FwX2luX3hzZF9fc3RyaW5nKHNvYXAsICJ2YXJTdHJpbmciLCAmYS0+dmFyU3RyaW5nLCAieHNkOnN0cmluZyIpKQorCQkJCXsJc29hcF9mbGFnX3ZhclN0cmluZy0tOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQlpZiAoc29hcF9mbGFnX3ZhckludCAmJiBzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlpZiAoc29hcF9pbl9Qb2ludGVyVG94c2RfX2ludChzb2FwLCAidmFySW50IiwgJmEtPnZhckludCwgInhzZDppbnQiKSkKKwkJCQl7CXNvYXBfZmxhZ192YXJJbnQtLTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXBfZmxhZ192YXJGbG9hdCAmJiBzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlpZiAoc29hcF9pbl9Qb2ludGVyVG94c2RfX2Zsb2F0KHNvYXAsICJ2YXJGbG9hdCIsICZhLT52YXJGbG9hdCwgInhzZDpmbG9hdCIpKQorCQkJCXsJc29hcF9mbGFnX3ZhckZsb2F0LS07CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCWlmIChzb2FwX2ZsYWdfdmFyU3RydWN0ICYmIHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCWlmIChzb2FwX2luX1BvaW50ZXJUb3NfX1NPQVBTdHJ1Y3Qoc29hcCwgInZhclN0cnVjdCIsICZhLT52YXJTdHJ1Y3QsICJzOlNPQVBTdHJ1Y3QiKSkKKwkJCQl7CXNvYXBfZmxhZ192YXJTdHJ1Y3QtLTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCXNvYXAtPmVycm9yID0gc29hcF9pZ25vcmVfZWxlbWVudChzb2FwKTsKKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykKKwkJCQlicmVhazsKKwkJCWlmIChzb2FwLT5lcnJvcikKKwkJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCWVsc2UKKwl7CWEgPSAoc3RydWN0IHNfX1NPQVBTdHJ1Y3RTdHJ1Y3QgKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilhLCAwLCBTT0FQX1RZUEVfc19fU09BUFN0cnVjdFN0cnVjdCwgMCwgc2l6ZW9mKHN0cnVjdCBzX19TT0FQU3RydWN0U3RydWN0KSwgMCwgTlVMTCk7CisJCWlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gYTsKK30KKworU09BUF9GTUFDNSBzdHJ1Y3Qgc19fU09BUFN0cnVjdFN0cnVjdCAqIFNPQVBfRk1BQzYgc29hcF9uZXdfc19fU09BUFN0cnVjdFN0cnVjdChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4pCit7CXJldHVybiBzb2FwX2luc3RhbnRpYXRlX3NfX1NPQVBTdHJ1Y3RTdHJ1Y3Qoc29hcCwgbiwgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3NfX1NPQVBTdHJ1Y3RTdHJ1Y3Qoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzX19TT0FQU3RydWN0U3RydWN0ICpwKQorewlzb2FwX2RlbGV0ZShzb2FwLCBwKTsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3Qgc19fU09BUFN0cnVjdFN0cnVjdCAqIFNPQVBfRk1BQzQgc29hcF9pbnN0YW50aWF0ZV9zX19TT0FQU3RydWN0U3RydWN0KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbiwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqYXJyYXlUeXBlLCBzaXplX3QgKnNpemUpCit7CisJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJzb2FwX2luc3RhbnRpYXRlX3NfX1NPQVBTdHJ1Y3RTdHJ1Y3QoJWQsICVzLCAlcylcbiIsIG4sIHR5cGU/dHlwZToiIiwgYXJyYXlUeXBlP2FycmF5VHlwZToiIikpOworCXN0cnVjdCBzb2FwX2NsaXN0ICpjcCA9IHNvYXBfbGluayhzb2FwLCBOVUxMLCBTT0FQX1RZUEVfc19fU09BUFN0cnVjdFN0cnVjdCwgbiwgc29hcF9mZGVsZXRlKTsKKwlpZiAoIWNwKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAobiA8IDApCisJewljcC0+cHRyID0gKHZvaWQqKW5ldyBzdHJ1Y3Qgc19fU09BUFN0cnVjdFN0cnVjdDsKKwkJaWYgKHNpemUpCisJCQkqc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc19fU09BUFN0cnVjdFN0cnVjdCk7CisJfQorCWVsc2UKKwl7CWNwLT5wdHIgPSAodm9pZCopbmV3IHN0cnVjdCBzX19TT0FQU3RydWN0U3RydWN0W25dOworCQlpZiAoc2l6ZSkKKwkJCSpzaXplID0gbiAqIHNpemVvZihzdHJ1Y3Qgc19fU09BUFN0cnVjdFN0cnVjdCk7CisJfQorCQlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluc3RhbnRpYXRlZCBsb2NhdGlvbj0lcFxuIiwgY3AtPnB0cikpOworCXJldHVybiAoc3RydWN0IHNfX1NPQVBTdHJ1Y3RTdHJ1Y3QqKWNwLT5wdHI7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfY29weV9zX19TT0FQU3RydWN0U3RydWN0KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3QsIGludCB0dCwgdm9pZCAqcCwgc2l6ZV90IGxlbiwgY29uc3Qgdm9pZCAqcSwgc2l6ZV90IG4pCit7CisJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5aW5nIHN0cnVjdCBzX19TT0FQU3RydWN0U3RydWN0ICVwIC0+ICVwXG4iLCBxLCBwKSk7CisJKihzdHJ1Y3Qgc19fU09BUFN0cnVjdFN0cnVjdCopcCA9ICooc3RydWN0IHNfX1NPQVBTdHJ1Y3RTdHJ1Y3QqKXE7Cit9CisKKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfbnNfX2VjaG8yRFN0cmluZ0FycmF5KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG8yRFN0cmluZ0FycmF5ICphKQoreworCSh2b2lkKXNvYXA7ICh2b2lkKWE7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLworCXNvYXBfc2VyaWFsaXplX0FycmF5T2ZzdHJpbmcyRChzb2FwLCAmYS0+X2lucHV0MkRTdHJpbmdBcnJheSk7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9uc19fZWNobzJEU3RyaW5nQXJyYXkoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNobzJEU3RyaW5nQXJyYXkgKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisJc29hcF9kZWZhdWx0X0FycmF5T2ZzdHJpbmcyRChzb2FwLCAmYS0+X2lucHV0MkRTdHJpbmdBcnJheSk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfbnNfX2VjaG8yRFN0cmluZ0FycmF5KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG8yRFN0cmluZ0FycmF5ICphLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmVnaXN0ZXIgaW50IGlkID0gc29hcF9lbWJlZChzb2FwLCAodm9pZCopYSwgTlVMTCwgMCwgdGFnLCBTT0FQX1RZUEVfbnNfX2VjaG8yRFN0cmluZ0FycmF5KTsKKwlpZiAoc29hcF9vdXRfbnNfX2VjaG8yRFN0cmluZ0FycmF5KHNvYXAsIHRhZywgaWQsIGEsIHR5cGUpKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJcmV0dXJuIHNvYXBfcHV0aW5kZXBlbmRlbnQoc29hcCk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfbnNfX2VjaG8yRFN0cmluZ0FycmF5KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgc3RydWN0IG5zX19lY2hvMkRTdHJpbmdBcnJheSAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgYSwgU09BUF9UWVBFX25zX19lY2hvMkRTdHJpbmdBcnJheSksIHR5cGUpOworCXNvYXBfb3V0X0FycmF5T2ZzdHJpbmcyRChzb2FwLCAiaW5wdXQyRFN0cmluZ0FycmF5IiwgLTEsICZhLT5faW5wdXQyRFN0cmluZ0FycmF5LCAiIik7CisJc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKKwlyZXR1cm4gU09BUF9PSzsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG8yRFN0cmluZ0FycmF5ICogU09BUF9GTUFDNCBzb2FwX2dldF9uc19fZWNobzJEU3RyaW5nQXJyYXkoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNobzJEU3RyaW5nQXJyYXkgKnAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoKHAgPSBzb2FwX2luX25zX19lY2hvMkRTdHJpbmdBcnJheShzb2FwLCB0YWcsIHAsIHR5cGUpKSkKKwkJc29hcF9nZXRpbmRlcGVuZGVudChzb2FwKTsKKwlyZXR1cm4gcDsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG8yRFN0cmluZ0FycmF5ICogU09BUF9GTUFDNCBzb2FwX2luX25zX19lY2hvMkRTdHJpbmdBcnJheShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzdHJ1Y3QgbnNfX2VjaG8yRFN0cmluZ0FycmF5ICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXNob3J0IHNvYXBfZmxhZ19faW5wdXQyRFN0cmluZ0FycmF5ID0gMTsKKwlpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisJCXJldHVybiBOVUxMOworCWlmICgqc29hcC0+dHlwZSAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKSkKKwl7CXNvYXAtPmVycm9yID0gU09BUF9UWVBFOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYSA9IChzdHJ1Y3QgbnNfX2VjaG8yRFN0cmluZ0FycmF5ICopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgYSwgU09BUF9UWVBFX25zX19lY2hvMkRTdHJpbmdBcnJheSwgc2l6ZW9mKHN0cnVjdCBuc19fZWNobzJEU3RyaW5nQXJyYXkpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwlpZiAoIWEpCisJCXJldHVybiBOVUxMOworCXNvYXBfZGVmYXVsdF9uc19fZWNobzJEU3RyaW5nQXJyYXkoc29hcCwgYSk7CisJaWYgKHNvYXAtPmJvZHkgJiYgISpzb2FwLT5ocmVmKQorCXsKKwkJZm9yICg7OykKKwkJewlzb2FwLT5lcnJvciA9IFNPQVBfVEFHX01JU01BVENIOworCQkJaWYgKHNvYXBfZmxhZ19faW5wdXQyRFN0cmluZ0FycmF5ICYmIHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCWlmIChzb2FwX2luX0FycmF5T2ZzdHJpbmcyRChzb2FwLCBOVUxMLCAmYS0+X2lucHV0MkRTdHJpbmdBcnJheSwgInhzZDpzdHJpbmciKSkKKwkJCQl7CXNvYXBfZmxhZ19faW5wdXQyRFN0cmluZ0FycmF5LS07CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlzb2FwLT5lcnJvciA9IHNvYXBfaWdub3JlX2VsZW1lbnQoc29hcCk7CisJCQlpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcpCisJCQkJYnJlYWs7CisJCQlpZiAoc29hcC0+ZXJyb3IpCisJCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiAoc29hcF9mbGFnX19pbnB1dDJEU3RyaW5nQXJyYXkgPiAwKSkKKwkJewlzb2FwLT5lcnJvciA9IFNPQVBfT0NDVVJTOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwllbHNlCisJewlhID0gKHN0cnVjdCBuc19fZWNobzJEU3RyaW5nQXJyYXkgKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilhLCAwLCBTT0FQX1RZUEVfbnNfX2VjaG8yRFN0cmluZ0FycmF5LCAwLCBzaXplb2Yoc3RydWN0IG5zX19lY2hvMkRTdHJpbmdBcnJheSksIDAsIE5VTEwpOworCQlpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGE7Cit9CisKK1NPQVBfRk1BQzUgc3RydWN0IG5zX19lY2hvMkRTdHJpbmdBcnJheSAqIFNPQVBfRk1BQzYgc29hcF9uZXdfbnNfX2VjaG8yRFN0cmluZ0FycmF5KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbikKK3sJcmV0dXJuIHNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG8yRFN0cmluZ0FycmF5KHNvYXAsIG4sIE5VTEwsIE5VTEwsIE5VTEwpOworfQorCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9uc19fZWNobzJEU3RyaW5nQXJyYXkoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNobzJEU3RyaW5nQXJyYXkgKnApCit7CXNvYXBfZGVsZXRlKHNvYXAsIHApOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNobzJEU3RyaW5nQXJyYXkgKiBTT0FQX0ZNQUM0IHNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG8yRFN0cmluZ0FycmF5KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbiwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqYXJyYXlUeXBlLCBzaXplX3QgKnNpemUpCit7CisJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvMkRTdHJpbmdBcnJheSglZCwgJXMsICVzKVxuIiwgbiwgdHlwZT90eXBlOiIiLCBhcnJheVR5cGU/YXJyYXlUeXBlOiIiKSk7CisJc3RydWN0IHNvYXBfY2xpc3QgKmNwID0gc29hcF9saW5rKHNvYXAsIE5VTEwsIFNPQVBfVFlQRV9uc19fZWNobzJEU3RyaW5nQXJyYXksIG4sIHNvYXBfZmRlbGV0ZSk7CisJaWYgKCFjcCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKG4gPCAwKQorCXsJY3AtPnB0ciA9ICh2b2lkKiluZXcgc3RydWN0IG5zX19lY2hvMkRTdHJpbmdBcnJheTsKKwkJaWYgKHNpemUpCisJCQkqc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbnNfX2VjaG8yRFN0cmluZ0FycmF5KTsKKwl9CisJZWxzZQorCXsJY3AtPnB0ciA9ICh2b2lkKiluZXcgc3RydWN0IG5zX19lY2hvMkRTdHJpbmdBcnJheVtuXTsKKwkJaWYgKHNpemUpCisJCQkqc2l6ZSA9IG4gKiBzaXplb2Yoc3RydWN0IG5zX19lY2hvMkRTdHJpbmdBcnJheSk7CisJfQorCQlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluc3RhbnRpYXRlZCBsb2NhdGlvbj0lcFxuIiwgY3AtPnB0cikpOworCXJldHVybiAoc3RydWN0IG5zX19lY2hvMkRTdHJpbmdBcnJheSopY3AtPnB0cjsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9jb3B5X25zX19lY2hvMkRTdHJpbmdBcnJheShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0LCBpbnQgdHQsIHZvaWQgKnAsIHNpemVfdCBsZW4sIGNvbnN0IHZvaWQgKnEsIHNpemVfdCBuKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weWluZyBzdHJ1Y3QgbnNfX2VjaG8yRFN0cmluZ0FycmF5ICVwIC0+ICVwXG4iLCBxLCBwKSk7CisJKihzdHJ1Y3QgbnNfX2VjaG8yRFN0cmluZ0FycmF5KilwID0gKihzdHJ1Y3QgbnNfX2VjaG8yRFN0cmluZ0FycmF5KilxOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9uc19fZWNobzJEU3RyaW5nQXJyYXlSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IG5zX19lY2hvMkRTdHJpbmdBcnJheVJlc3BvbnNlICphKQoreworCSh2b2lkKXNvYXA7ICh2b2lkKWE7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLworCXNvYXBfc2VyaWFsaXplX0FycmF5T2ZzdHJpbmcyRChzb2FwLCAmYS0+X3JldHVybik7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9uc19fZWNobzJEU3RyaW5nQXJyYXlSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvMkRTdHJpbmdBcnJheVJlc3BvbnNlICphKQoreworCSh2b2lkKXNvYXA7ICh2b2lkKWE7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLworCXNvYXBfZGVmYXVsdF9BcnJheU9mc3RyaW5nMkQoc29hcCwgJmEtPl9yZXR1cm4pOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X25zX19lY2hvMkRTdHJpbmdBcnJheVJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG8yRFN0cmluZ0FycmF5UmVzcG9uc2UgKmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZWdpc3RlciBpbnQgaWQgPSBzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCBOVUxMLCAwLCB0YWcsIFNPQVBfVFlQRV9uc19fZWNobzJEU3RyaW5nQXJyYXlSZXNwb25zZSk7CisJaWYgKHNvYXBfb3V0X25zX19lY2hvMkRTdHJpbmdBcnJheVJlc3BvbnNlKHNvYXAsIHRhZywgaWQsIGEsIHR5cGUpKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJcmV0dXJuIHNvYXBfcHV0aW5kZXBlbmRlbnQoc29hcCk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfbnNfX2VjaG8yRFN0cmluZ0FycmF5UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG8yRFN0cmluZ0FycmF5UmVzcG9uc2UgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIGEsIFNPQVBfVFlQRV9uc19fZWNobzJEU3RyaW5nQXJyYXlSZXNwb25zZSksIHR5cGUpOworCXNvYXBfZWxlbWVudF9yZXN1bHQoc29hcCwgInJldHVybiIpOworCXNvYXBfb3V0X0FycmF5T2ZzdHJpbmcyRChzb2FwLCAicmV0dXJuIiwgLTEsICZhLT5fcmV0dXJuLCAiIik7CisJc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKKwlyZXR1cm4gU09BUF9PSzsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG8yRFN0cmluZ0FycmF5UmVzcG9uc2UgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X25zX19lY2hvMkRTdHJpbmdBcnJheVJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2VjaG8yRFN0cmluZ0FycmF5UmVzcG9uc2UgKnAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoKHAgPSBzb2FwX2luX25zX19lY2hvMkRTdHJpbmdBcnJheVJlc3BvbnNlKHNvYXAsIHRhZywgcCwgdHlwZSkpKQorCQlzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOworCXJldHVybiBwOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNobzJEU3RyaW5nQXJyYXlSZXNwb25zZSAqIFNPQVBfRk1BQzQgc29hcF9pbl9uc19fZWNobzJEU3RyaW5nQXJyYXlSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzdHJ1Y3QgbnNfX2VjaG8yRFN0cmluZ0FycmF5UmVzcG9uc2UgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc2hvcnQgc29hcF9mbGFnX19yZXR1cm4gPSAxOworCWlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCpzb2FwLT50eXBlICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpKQorCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisJCXJldHVybiBOVUxMOworCX0KKwlhID0gKHN0cnVjdCBuc19fZWNobzJEU3RyaW5nQXJyYXlSZXNwb25zZSAqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIGEsIFNPQVBfVFlQRV9uc19fZWNobzJEU3RyaW5nQXJyYXlSZXNwb25zZSwgc2l6ZW9mKHN0cnVjdCBuc19fZWNobzJEU3RyaW5nQXJyYXlSZXNwb25zZSksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworCWlmICghYSkKKwkJcmV0dXJuIE5VTEw7CisJc29hcF9kZWZhdWx0X25zX19lY2hvMkRTdHJpbmdBcnJheVJlc3BvbnNlKHNvYXAsIGEpOworCWlmIChzb2FwLT5ib2R5ICYmICEqc29hcC0+aHJlZikKKwl7CisJCWZvciAoOzspCisJCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RBR19NSVNNQVRDSDsKKwkJCWlmIChzb2FwX2ZsYWdfX3JldHVybiAmJiBzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlpZiAoc29hcF9pbl9BcnJheU9mc3RyaW5nMkQoc29hcCwgTlVMTCwgJmEtPl9yZXR1cm4sICJ4c2Q6c3RyaW5nIikpCisJCQkJewlzb2FwX2ZsYWdfX3JldHVybi0tOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQlpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJc29hcC0+ZXJyb3IgPSBzb2FwX2lnbm9yZV9lbGVtZW50KHNvYXApOworCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfTk9fVEFHKQorCQkJCWJyZWFrOworCQkJaWYgKHNvYXAtPmVycm9yKQorCQkJCXJldHVybiBOVUxMOworCQl9CisJCWlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgKHNvYXBfZmxhZ19fcmV0dXJuID4gMCkpCisJCXsJc29hcC0+ZXJyb3IgPSBTT0FQX09DQ1VSUzsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWlmIChzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJZWxzZQorCXsJYSA9IChzdHJ1Y3QgbnNfX2VjaG8yRFN0cmluZ0FycmF5UmVzcG9uc2UgKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilhLCAwLCBTT0FQX1RZUEVfbnNfX2VjaG8yRFN0cmluZ0FycmF5UmVzcG9uc2UsIDAsIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG8yRFN0cmluZ0FycmF5UmVzcG9uc2UpLCAwLCBOVUxMKTsKKwkJaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBhOworfQorCitTT0FQX0ZNQUM1IHN0cnVjdCBuc19fZWNobzJEU3RyaW5nQXJyYXlSZXNwb25zZSAqIFNPQVBfRk1BQzYgc29hcF9uZXdfbnNfX2VjaG8yRFN0cmluZ0FycmF5UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuKQorewlyZXR1cm4gc29hcF9pbnN0YW50aWF0ZV9uc19fZWNobzJEU3RyaW5nQXJyYXlSZXNwb25zZShzb2FwLCBuLCBOVUxMLCBOVUxMLCBOVUxMKTsKK30KKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfbnNfX2VjaG8yRFN0cmluZ0FycmF5UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNobzJEU3RyaW5nQXJyYXlSZXNwb25zZSAqcCkKK3sJc29hcF9kZWxldGUoc29hcCwgcCk7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvMkRTdHJpbmdBcnJheVJlc3BvbnNlICogU09BUF9GTUFDNCBzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvMkRTdHJpbmdBcnJheVJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbiwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqYXJyYXlUeXBlLCBzaXplX3QgKnNpemUpCit7CisJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvMkRTdHJpbmdBcnJheVJlc3BvbnNlKCVkLCAlcywgJXMpXG4iLCBuLCB0eXBlP3R5cGU6IiIsIGFycmF5VHlwZT9hcnJheVR5cGU6IiIpKTsKKwlzdHJ1Y3Qgc29hcF9jbGlzdCAqY3AgPSBzb2FwX2xpbmsoc29hcCwgTlVMTCwgU09BUF9UWVBFX25zX19lY2hvMkRTdHJpbmdBcnJheVJlc3BvbnNlLCBuLCBzb2FwX2ZkZWxldGUpOworCWlmICghY3ApCisJCXJldHVybiBOVUxMOworCWlmIChuIDwgMCkKKwl7CWNwLT5wdHIgPSAodm9pZCopbmV3IHN0cnVjdCBuc19fZWNobzJEU3RyaW5nQXJyYXlSZXNwb25zZTsKKwkJaWYgKHNpemUpCisJCQkqc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbnNfX2VjaG8yRFN0cmluZ0FycmF5UmVzcG9uc2UpOworCX0KKwllbHNlCisJewljcC0+cHRyID0gKHZvaWQqKW5ldyBzdHJ1Y3QgbnNfX2VjaG8yRFN0cmluZ0FycmF5UmVzcG9uc2Vbbl07CisJCWlmIChzaXplKQorCQkJKnNpemUgPSBuICogc2l6ZW9mKHN0cnVjdCBuc19fZWNobzJEU3RyaW5nQXJyYXlSZXNwb25zZSk7CisJfQorCQlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluc3RhbnRpYXRlZCBsb2NhdGlvbj0lcFxuIiwgY3AtPnB0cikpOworCXJldHVybiAoc3RydWN0IG5zX19lY2hvMkRTdHJpbmdBcnJheVJlc3BvbnNlKiljcC0+cHRyOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2NvcHlfbnNfX2VjaG8yRFN0cmluZ0FycmF5UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdCwgaW50IHR0LCB2b2lkICpwLCBzaXplX3QgbGVuLCBjb25zdCB2b2lkICpxLCBzaXplX3QgbikKK3sKKwlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHlpbmcgc3RydWN0IG5zX19lY2hvMkRTdHJpbmdBcnJheVJlc3BvbnNlICVwIC0+ICVwXG4iLCBxLCBwKSk7CisJKihzdHJ1Y3QgbnNfX2VjaG8yRFN0cmluZ0FycmF5UmVzcG9uc2UqKXAgPSAqKHN0cnVjdCBuc19fZWNobzJEU3RyaW5nQXJyYXlSZXNwb25zZSopcTsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfQXJyYXlPZnN0cmluZzJEKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgQXJyYXlPZnN0cmluZzJEIGNvbnN0KmEpCit7CisJaW50IGk7CisJaWYgKGEtPl9fcHRyICYmICFzb2FwX2FycmF5X3JlZmVyZW5jZShzb2FwLCBhLCAoc3RydWN0IHNvYXBfYXJyYXkqKSZhLT5fX3B0ciwgMiwgU09BUF9UWVBFX0FycmF5T2ZzdHJpbmcyRCkpCisJCWZvciAoaSA9IDA7IGkgPCBzb2FwX3NpemUoYS0+X19zaXplLCAyKTsgaSsrKQorCQl7CisJCQlzb2FwX3NlcmlhbGl6ZV94c2RfX3N0cmluZyhzb2FwLCBhLT5fX3B0ciArIGkpOworCQl9Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9BcnJheU9mc3RyaW5nMkQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBBcnJheU9mc3RyaW5nMkQgKmEpCit7CisJYS0+X19wdHIgPSBOVUxMOworCWEtPl9fc2l6ZVswXSA9IDA7CisJYS0+X19vZmZzZXRbMF0gPSAwOworCWEtPl9fc2l6ZVsxXSA9IDA7CisJYS0+X19vZmZzZXRbMV0gPSAwOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X0FycmF5T2ZzdHJpbmcyRChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IEFycmF5T2ZzdHJpbmcyRCAqYSwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCXJlZ2lzdGVyIGludCBpZCA9IHNvYXBfZW1iZWQoc29hcCwgKHZvaWQqKWEsIChzdHJ1Y3Qgc29hcF9hcnJheSopJmEtPl9fcHRyLCAyLCB0YWcsIFNPQVBfVFlQRV9BcnJheU9mc3RyaW5nMkQpOworCWlmIChzb2FwX291dF9BcnJheU9mc3RyaW5nMkQoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9BcnJheU9mc3RyaW5nMkQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzdHJ1Y3QgQXJyYXlPZnN0cmluZzJEICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCWludCBpLCBuID0gc29hcF9zaXplKGEtPl9fc2l6ZSwgMik7CisJY2hhciAqdCA9IHNvYXBfcHV0c2l6ZXNvZmZzZXRzKHNvYXAsICJ4c2Q6c3RyaW5nIiwgYS0+X19zaXplLCBhLT5fX29mZnNldCwgMik7CisJaWQgPSBzb2FwX2VsZW1lbnRfaWQoc29hcCwgdGFnLCBpZCwgYSwgKHN0cnVjdCBzb2FwX2FycmF5KikmYS0+X19wdHIsIDIsIHR5cGUsIFNPQVBfVFlQRV9BcnJheU9mc3RyaW5nMkQpOworCWlmIChpZCA8IDApCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlzb2FwX2FycmF5X2JlZ2luX291dChzb2FwLCB0YWcsIGlkLCB0LCBzb2FwX3B1dG9mZnNldHMoc29hcCwgYS0+X19vZmZzZXQsIDIpKTsKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorCXsKKwkJc29hcC0+cG9zaXRpb24gPSAyOworCQlzb2FwLT5wb3NpdGlvbnNbMF0gPSBpL2EtPl9fc2l6ZVsxXSVhLT5fX3NpemVbMF07CisJCXNvYXAtPnBvc2l0aW9uc1sxXSA9IGklYS0+X19zaXplWzFdOworCQlzb2FwX291dF94c2RfX3N0cmluZyhzb2FwLCAiaXRlbSIsIC0xLCAmYS0+X19wdHJbaV0sICIiKTsKKwl9CisJc29hcC0+cG9zaXRpb24gPSAwOworCXNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7CisJcmV0dXJuIFNPQVBfT0s7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IEFycmF5T2ZzdHJpbmcyRCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfQXJyYXlPZnN0cmluZzJEKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgQXJyYXlPZnN0cmluZzJEICpwLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKChwID0gc29hcF9pbl9BcnJheU9mc3RyaW5nMkQoc29hcCwgdGFnLCBwLCB0eXBlKSkpCisJCXNvYXBfZ2V0aW5kZXBlbmRlbnQoc29hcCk7CisJcmV0dXJuIHA7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IEFycmF5T2ZzdHJpbmcyRCAqIFNPQVBfRk1BQzQgc29hcF9pbl9BcnJheU9mc3RyaW5nMkQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc3RydWN0IEFycmF5T2ZzdHJpbmcyRCAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sJaW50IGksIGosIG47CisJY2hhciAqKnA7CisJaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDEpKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoc29hcF9tYXRjaF9hcnJheShzb2FwLCB0eXBlKSkKKwl7CXNvYXAtPmVycm9yID0gU09BUF9UWVBFOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYSA9IChzdHJ1Y3QgQXJyYXlPZnN0cmluZzJEICopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgYSwgU09BUF9UWVBFX0FycmF5T2ZzdHJpbmcyRCwgc2l6ZW9mKHN0cnVjdCBBcnJheU9mc3RyaW5nMkQpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwlpZiAoIWEpCisJCXJldHVybiBOVUxMOworCXNvYXBfZGVmYXVsdF9BcnJheU9mc3RyaW5nMkQoc29hcCwgYSk7CisJaWYgKHNvYXAtPmJvZHkgJiYgISpzb2FwLT5ocmVmKQorCXsKKwkJbiA9IHNvYXBfZ2V0c2l6ZXMoc29hcC0+YXJyYXlTaXplLCBhLT5fX3NpemUsIDIpOworCQluIC09IGogPSBzb2FwX2dldG9mZnNldHMoc29hcC0+YXJyYXlPZmZzZXQsIGEtPl9fc2l6ZSwgYS0+X19vZmZzZXQsIDIpOworCQlpZiAobiA+PSAwKQorCQl7CWEtPl9fcHRyID0gKGNoYXIgKiopc29hcF9tYWxsb2Moc29hcCwgbipzaXplb2YoY2hhciAqKSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorCQkJCWEtPl9fcHRyW2ldID0gTlVMTDsKKwkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCQl7CXNvYXBfcGVla19lbGVtZW50KHNvYXApOworCQkJCWlmIChzb2FwLT5wb3NpdGlvbiA9PSAyKQorCQkJCXsJaSA9IHNvYXAtPnBvc2l0aW9uc1swXSphLT5fX3NpemVbMV0rc29hcC0+cG9zaXRpb25zWzFdLWo7CisJCQkJCWlmIChpIDwgMCB8fCBpID49IG4pCisJCQkJCXsJc29hcC0+ZXJyb3IgPSBTT0FQX0lPQjsKKwkJCQkJCXJldHVybiBOVUxMOworCQkJCQl9CisJCQkJfQorCQkJCWlmICghc29hcF9pbl94c2RfX3N0cmluZyhzb2FwLCBOVUxMLCBhLT5fX3B0ciArIGksICJ4c2Q6c3RyaW5nIikpCisJCQkJewlpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9OT19UQUcpCisJCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQkJc29hcC0+ZXJyb3IgPSBTT0FQX09LOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CXNvYXBfbmV3X2Jsb2NrKHNvYXApOworCQkJZm9yIChhLT5fX3NpemVbMF0gPSAwOyA7IGEtPl9fc2l6ZVswXSsrKQorCQkJewlwID0gKGNoYXIgKiopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIHNpemVvZihjaGFyICopKTsKKwkJCQlpZiAoIXApCisJCQkJCXJldHVybiBOVUxMOworCQkJCSpwID0gTlVMTDsKKwkJCQlpZiAoIXNvYXBfaW5feHNkX19zdHJpbmcoc29hcCwgTlVMTCwgcCwgInhzZDpzdHJpbmciKSkKKwkJCQl7CWlmIChzb2FwLT5lcnJvciAhPSBTT0FQX05PX1RBRykKKwkJCQkJCXJldHVybiBOVUxMOworCQkJCQlzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCXNvYXBfcG9wX2Jsb2NrKHNvYXApOworCQkJYS0+X19wdHIgPSAoY2hhciAqKilzb2FwX21hbGxvYyhzb2FwLCBzb2FwLT5ibGlzdC0+c2l6ZSk7CisJCQlzb2FwX3NhdmVfYmxvY2soc29hcCwgKGNoYXIqKWEtPl9fcHRyLCAxKTsKKwkJfQorCQlpZiAoc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCWVsc2UKKwl7CWEgPSAoc3RydWN0IEFycmF5T2ZzdHJpbmcyRCAqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCAodm9pZCoqKWEsIDAsIFNPQVBfVFlQRV9BcnJheU9mc3RyaW5nMkQsIDAsIHNpemVvZihzdHJ1Y3QgQXJyYXlPZnN0cmluZzJEKSwgMCwgTlVMTCk7CisJCWlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gYTsKK30KKworU09BUF9GTUFDNSBzdHJ1Y3QgQXJyYXlPZnN0cmluZzJEICogU09BUF9GTUFDNiBzb2FwX25ld19BcnJheU9mc3RyaW5nMkQoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuKQorewlyZXR1cm4gc29hcF9pbnN0YW50aWF0ZV9BcnJheU9mc3RyaW5nMkQoc29hcCwgbiwgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX0FycmF5T2ZzdHJpbmcyRChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IEFycmF5T2ZzdHJpbmcyRCAqcCkKK3sJc29hcF9kZWxldGUoc29hcCwgcCk7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IEFycmF5T2ZzdHJpbmcyRCAqIFNPQVBfRk1BQzQgc29hcF9pbnN0YW50aWF0ZV9BcnJheU9mc3RyaW5nMkQoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICphcnJheVR5cGUsIHNpemVfdCAqc2l6ZSkKK3sKKwlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgInNvYXBfaW5zdGFudGlhdGVfQXJyYXlPZnN0cmluZzJEKCVkLCAlcywgJXMpXG4iLCBuLCB0eXBlP3R5cGU6IiIsIGFycmF5VHlwZT9hcnJheVR5cGU6IiIpKTsKKwlzdHJ1Y3Qgc29hcF9jbGlzdCAqY3AgPSBzb2FwX2xpbmsoc29hcCwgTlVMTCwgU09BUF9UWVBFX0FycmF5T2ZzdHJpbmcyRCwgbiwgc29hcF9mZGVsZXRlKTsKKwlpZiAoIWNwKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAobiA8IDApCisJewljcC0+cHRyID0gKHZvaWQqKW5ldyBzdHJ1Y3QgQXJyYXlPZnN0cmluZzJEOworCQlpZiAoc2l6ZSkKKwkJCSpzaXplID0gc2l6ZW9mKHN0cnVjdCBBcnJheU9mc3RyaW5nMkQpOworCX0KKwllbHNlCisJewljcC0+cHRyID0gKHZvaWQqKW5ldyBzdHJ1Y3QgQXJyYXlPZnN0cmluZzJEW25dOworCQlpZiAoc2l6ZSkKKwkJCSpzaXplID0gbiAqIHNpemVvZihzdHJ1Y3QgQXJyYXlPZnN0cmluZzJEKTsKKwl9CisJCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5zdGFudGlhdGVkIGxvY2F0aW9uPSVwXG4iLCBjcC0+cHRyKSk7CisJcmV0dXJuIChzdHJ1Y3QgQXJyYXlPZnN0cmluZzJEKiljcC0+cHRyOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2NvcHlfQXJyYXlPZnN0cmluZzJEKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3QsIGludCB0dCwgdm9pZCAqcCwgc2l6ZV90IGxlbiwgY29uc3Qgdm9pZCAqcSwgc2l6ZV90IG4pCit7CisJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5aW5nIHN0cnVjdCBBcnJheU9mc3RyaW5nMkQgJXAgLT4gJXBcbiIsIHEsIHApKTsKKwkqKHN0cnVjdCBBcnJheU9mc3RyaW5nMkQqKXAgPSAqKHN0cnVjdCBBcnJheU9mc3RyaW5nMkQqKXE7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX25zX19lY2hvU2ltcGxlVHlwZXNBc1N0cnVjdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IG5zX19lY2hvU2ltcGxlVHlwZXNBc1N0cnVjdCAqYSkKK3sKKwkodm9pZClzb2FwOyAodm9pZClhOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8KKwlzb2FwX3NlcmlhbGl6ZV94c2RfX3N0cmluZyhzb2FwLCAmYS0+aW5wdXRTdHJpbmcpOworCXNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3hzZF9faW50KHNvYXAsICZhLT5pbnB1dEludGVnZXIpOworCXNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3hzZF9fZmxvYXQoc29hcCwgJmEtPmlucHV0RmxvYXQpOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0ICphKQoreworCSh2b2lkKXNvYXA7ICh2b2lkKWE7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLworCXNvYXBfZGVmYXVsdF94c2RfX3N0cmluZyhzb2FwLCAmYS0+aW5wdXRTdHJpbmcpOworCWEtPmlucHV0SW50ZWdlciA9IE5VTEw7CisJYS0+aW5wdXRGbG9hdCA9IE5VTEw7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0ICphLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmVnaXN0ZXIgaW50IGlkID0gc29hcF9lbWJlZChzb2FwLCAodm9pZCopYSwgTlVMTCwgMCwgdGFnLCBTT0FQX1RZUEVfbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0KTsKKwlpZiAoc29hcF9vdXRfbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0KHNvYXAsIHRhZywgaWQsIGEsIHR5cGUpKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJcmV0dXJuIHNvYXBfcHV0aW5kZXBlbmRlbnQoc29hcCk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgc3RydWN0IG5zX19lY2hvU2ltcGxlVHlwZXNBc1N0cnVjdCAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgYSwgU09BUF9UWVBFX25zX19lY2hvU2ltcGxlVHlwZXNBc1N0cnVjdCksIHR5cGUpOworCXNvYXBfb3V0X3hzZF9fc3RyaW5nKHNvYXAsICJpbnB1dFN0cmluZyIsIC0xLCAmYS0+aW5wdXRTdHJpbmcsICIiKTsKKwlzb2FwX291dF9Qb2ludGVyVG94c2RfX2ludChzb2FwLCAiaW5wdXRJbnRlZ2VyIiwgLTEsICZhLT5pbnB1dEludGVnZXIsICIiKTsKKwlzb2FwX291dF9Qb2ludGVyVG94c2RfX2Zsb2F0KHNvYXAsICJpbnB1dEZsb2F0IiwgLTEsICZhLT5pbnB1dEZsb2F0LCAiIik7CisJc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKKwlyZXR1cm4gU09BUF9PSzsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0ICogU09BUF9GTUFDNCBzb2FwX2dldF9uc19fZWNob1NpbXBsZVR5cGVzQXNTdHJ1Y3Qoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob1NpbXBsZVR5cGVzQXNTdHJ1Y3QgKnAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoKHAgPSBzb2FwX2luX25zX19lY2hvU2ltcGxlVHlwZXNBc1N0cnVjdChzb2FwLCB0YWcsIHAsIHR5cGUpKSkKKwkJc29hcF9nZXRpbmRlcGVuZGVudChzb2FwKTsKKwlyZXR1cm4gcDsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0ICogU09BUF9GTUFDNCBzb2FwX2luX25zX19lY2hvU2ltcGxlVHlwZXNBc1N0cnVjdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzdHJ1Y3QgbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0ICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXNob3J0IHNvYXBfZmxhZ19pbnB1dFN0cmluZyA9IDEsIHNvYXBfZmxhZ19pbnB1dEludGVnZXIgPSAxLCBzb2FwX2ZsYWdfaW5wdXRGbG9hdCA9IDE7CisJaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoKnNvYXAtPnR5cGUgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkpCisJewlzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWEgPSAoc3RydWN0IG5zX19lY2hvU2ltcGxlVHlwZXNBc1N0cnVjdCAqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIGEsIFNPQVBfVFlQRV9uc19fZWNob1NpbXBsZVR5cGVzQXNTdHJ1Y3QsIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJaWYgKCFhKQorCQlyZXR1cm4gTlVMTDsKKwlzb2FwX2RlZmF1bHRfbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0KHNvYXAsIGEpOworCWlmIChzb2FwLT5ib2R5ICYmICEqc29hcC0+aHJlZikKKwl7CisJCWZvciAoOzspCisJCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RBR19NSVNNQVRDSDsKKwkJCWlmIChzb2FwX2ZsYWdfaW5wdXRTdHJpbmcgJiYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIIHx8IHNvYXAtPmVycm9yID09IFNPQVBfTk9fVEFHKSkKKwkJCQlpZiAoc29hcF9pbl94c2RfX3N0cmluZyhzb2FwLCAiaW5wdXRTdHJpbmciLCAmYS0+aW5wdXRTdHJpbmcsICJ4c2Q6c3RyaW5nIikpCisJCQkJewlzb2FwX2ZsYWdfaW5wdXRTdHJpbmctLTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXBfZmxhZ19pbnB1dEludGVnZXIgJiYgc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJaWYgKHNvYXBfaW5fUG9pbnRlclRveHNkX19pbnQoc29hcCwgImlucHV0SW50ZWdlciIsICZhLT5pbnB1dEludGVnZXIsICJ4c2Q6aW50IikpCisJCQkJewlzb2FwX2ZsYWdfaW5wdXRJbnRlZ2VyLS07CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCWlmIChzb2FwX2ZsYWdfaW5wdXRGbG9hdCAmJiBzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlpZiAoc29hcF9pbl9Qb2ludGVyVG94c2RfX2Zsb2F0KHNvYXAsICJpbnB1dEZsb2F0IiwgJmEtPmlucHV0RmxvYXQsICJ4c2Q6ZmxvYXQiKSkKKwkJCQl7CXNvYXBfZmxhZ19pbnB1dEZsb2F0LS07CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlzb2FwLT5lcnJvciA9IHNvYXBfaWdub3JlX2VsZW1lbnQoc29hcCk7CisJCQlpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcpCisJCQkJYnJlYWs7CisJCQlpZiAoc29hcC0+ZXJyb3IpCisJCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwllbHNlCisJewlhID0gKHN0cnVjdCBuc19fZWNob1NpbXBsZVR5cGVzQXNTdHJ1Y3QgKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilhLCAwLCBTT0FQX1RZUEVfbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0LCAwLCBzaXplb2Yoc3RydWN0IG5zX19lY2hvU2ltcGxlVHlwZXNBc1N0cnVjdCksIDAsIE5VTEwpOworCQlpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGE7Cit9CisKK1NPQVBfRk1BQzUgc3RydWN0IG5zX19lY2hvU2ltcGxlVHlwZXNBc1N0cnVjdCAqIFNPQVBfRk1BQzYgc29hcF9uZXdfbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbikKK3sJcmV0dXJuIHNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0KHNvYXAsIG4sIE5VTEwsIE5VTEwsIE5VTEwpOworfQorCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9uc19fZWNob1NpbXBsZVR5cGVzQXNTdHJ1Y3Qoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob1NpbXBsZVR5cGVzQXNTdHJ1Y3QgKnApCit7CXNvYXBfZGVsZXRlKHNvYXAsIHApOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob1NpbXBsZVR5cGVzQXNTdHJ1Y3QgKiBTT0FQX0ZNQUM0IHNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbiwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqYXJyYXlUeXBlLCBzaXplX3QgKnNpemUpCit7CisJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvU2ltcGxlVHlwZXNBc1N0cnVjdCglZCwgJXMsICVzKVxuIiwgbiwgdHlwZT90eXBlOiIiLCBhcnJheVR5cGU/YXJyYXlUeXBlOiIiKSk7CisJc3RydWN0IHNvYXBfY2xpc3QgKmNwID0gc29hcF9saW5rKHNvYXAsIE5VTEwsIFNPQVBfVFlQRV9uc19fZWNob1NpbXBsZVR5cGVzQXNTdHJ1Y3QsIG4sIHNvYXBfZmRlbGV0ZSk7CisJaWYgKCFjcCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKG4gPCAwKQorCXsJY3AtPnB0ciA9ICh2b2lkKiluZXcgc3RydWN0IG5zX19lY2hvU2ltcGxlVHlwZXNBc1N0cnVjdDsKKwkJaWYgKHNpemUpCisJCQkqc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0KTsKKwl9CisJZWxzZQorCXsJY3AtPnB0ciA9ICh2b2lkKiluZXcgc3RydWN0IG5zX19lY2hvU2ltcGxlVHlwZXNBc1N0cnVjdFtuXTsKKwkJaWYgKHNpemUpCisJCQkqc2l6ZSA9IG4gKiBzaXplb2Yoc3RydWN0IG5zX19lY2hvU2ltcGxlVHlwZXNBc1N0cnVjdCk7CisJfQorCQlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluc3RhbnRpYXRlZCBsb2NhdGlvbj0lcFxuIiwgY3AtPnB0cikpOworCXJldHVybiAoc3RydWN0IG5zX19lY2hvU2ltcGxlVHlwZXNBc1N0cnVjdCopY3AtPnB0cjsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9jb3B5X25zX19lY2hvU2ltcGxlVHlwZXNBc1N0cnVjdChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0LCBpbnQgdHQsIHZvaWQgKnAsIHNpemVfdCBsZW4sIGNvbnN0IHZvaWQgKnEsIHNpemVfdCBuKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weWluZyBzdHJ1Y3QgbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0ICVwIC0+ICVwXG4iLCBxLCBwKSk7CisJKihzdHJ1Y3QgbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0KilwID0gKihzdHJ1Y3QgbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0KilxOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9uc19fZWNob1NpbXBsZVR5cGVzQXNTdHJ1Y3RSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IG5zX19lY2hvU2ltcGxlVHlwZXNBc1N0cnVjdFJlc3BvbnNlICphKQoreworCSh2b2lkKXNvYXA7ICh2b2lkKWE7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLworCXNvYXBfZW1iZWRkZWQoc29hcCwgJmEtPl9yZXR1cm4sIFNPQVBfVFlQRV9zX19TT0FQU3RydWN0KTsKKwlzb2FwX3NlcmlhbGl6ZV9zX19TT0FQU3RydWN0KHNvYXAsICZhLT5fcmV0dXJuKTsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X25zX19lY2hvU2ltcGxlVHlwZXNBc1N0cnVjdFJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0UmVzcG9uc2UgKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisJc29hcF9kZWZhdWx0X3NfX1NPQVBTdHJ1Y3Qoc29hcCwgJmEtPl9yZXR1cm4pOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X25zX19lY2hvU2ltcGxlVHlwZXNBc1N0cnVjdFJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0UmVzcG9uc2UgKmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZWdpc3RlciBpbnQgaWQgPSBzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCBOVUxMLCAwLCB0YWcsIFNPQVBfVFlQRV9uc19fZWNob1NpbXBsZVR5cGVzQXNTdHJ1Y3RSZXNwb25zZSk7CisJaWYgKHNvYXBfb3V0X25zX19lY2hvU2ltcGxlVHlwZXNBc1N0cnVjdFJlc3BvbnNlKHNvYXAsIHRhZywgaWQsIGEsIHR5cGUpKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJcmV0dXJuIHNvYXBfcHV0aW5kZXBlbmRlbnQoc29hcCk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0UmVzcG9uc2UgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIGEsIFNPQVBfVFlQRV9uc19fZWNob1NpbXBsZVR5cGVzQXNTdHJ1Y3RSZXNwb25zZSksIHR5cGUpOworCXNvYXBfZWxlbWVudF9yZXN1bHQoc29hcCwgInJldHVybiIpOworCXNvYXBfb3V0X3NfX1NPQVBTdHJ1Y3Qoc29hcCwgInJldHVybiIsIC0xLCAmYS0+X3JldHVybiwgIiIpOworCXNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7CisJcmV0dXJuIFNPQVBfT0s7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvU2ltcGxlVHlwZXNBc1N0cnVjdFJlc3BvbnNlICogU09BUF9GTUFDNCBzb2FwX2dldF9uc19fZWNob1NpbXBsZVR5cGVzQXNTdHJ1Y3RSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvU2ltcGxlVHlwZXNBc1N0cnVjdFJlc3BvbnNlICpwLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKChwID0gc29hcF9pbl9uc19fZWNob1NpbXBsZVR5cGVzQXNTdHJ1Y3RSZXNwb25zZShzb2FwLCB0YWcsIHAsIHR5cGUpKSkKKwkJc29hcF9nZXRpbmRlcGVuZGVudChzb2FwKTsKKwlyZXR1cm4gcDsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0UmVzcG9uc2UgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc3RydWN0IG5zX19lY2hvU2ltcGxlVHlwZXNBc1N0cnVjdFJlc3BvbnNlICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXNob3J0IHNvYXBfZmxhZ19fcmV0dXJuID0gMTsKKwlpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisJCXJldHVybiBOVUxMOworCWlmICgqc29hcC0+dHlwZSAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKSkKKwl7CXNvYXAtPmVycm9yID0gU09BUF9UWVBFOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYSA9IChzdHJ1Y3QgbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0UmVzcG9uc2UgKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBhLCBTT0FQX1RZUEVfbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0UmVzcG9uc2UsIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0UmVzcG9uc2UpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwlpZiAoIWEpCisJCXJldHVybiBOVUxMOworCXNvYXBfZGVmYXVsdF9uc19fZWNob1NpbXBsZVR5cGVzQXNTdHJ1Y3RSZXNwb25zZShzb2FwLCBhKTsKKwlpZiAoc29hcC0+Ym9keSAmJiAhKnNvYXAtPmhyZWYpCisJeworCQlmb3IgKDs7KQorCQl7CXNvYXAtPmVycm9yID0gU09BUF9UQUdfTUlTTUFUQ0g7CisJCQlpZiAoc29hcF9mbGFnX19yZXR1cm4gJiYgc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJaWYgKHNvYXBfaW5fc19fU09BUFN0cnVjdChzb2FwLCBOVUxMLCAmYS0+X3JldHVybiwgInM6U09BUFN0cnVjdCIpKQorCQkJCXsJc29hcF9mbGFnX19yZXR1cm4tLTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCXNvYXAtPmVycm9yID0gc29hcF9pZ25vcmVfZWxlbWVudChzb2FwKTsKKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykKKwkJCQlicmVhazsKKwkJCWlmIChzb2FwLT5lcnJvcikKKwkJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIChzb2FwX2ZsYWdfX3JldHVybiA+IDApKQorCQl7CXNvYXAtPmVycm9yID0gU09BUF9PQ0NVUlM7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCWVsc2UKKwl7CWEgPSAoc3RydWN0IG5zX19lY2hvU2ltcGxlVHlwZXNBc1N0cnVjdFJlc3BvbnNlICopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopYSwgMCwgU09BUF9UWVBFX25zX19lY2hvU2ltcGxlVHlwZXNBc1N0cnVjdFJlc3BvbnNlLCAwLCBzaXplb2Yoc3RydWN0IG5zX19lY2hvU2ltcGxlVHlwZXNBc1N0cnVjdFJlc3BvbnNlKSwgMCwgTlVMTCk7CisJCWlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gYTsKK30KKworU09BUF9GTUFDNSBzdHJ1Y3QgbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0UmVzcG9uc2UgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X25zX19lY2hvU2ltcGxlVHlwZXNBc1N0cnVjdFJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbikKK3sJcmV0dXJuIHNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0UmVzcG9uc2Uoc29hcCwgbiwgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX25zX19lY2hvU2ltcGxlVHlwZXNBc1N0cnVjdFJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0UmVzcG9uc2UgKnApCit7CXNvYXBfZGVsZXRlKHNvYXAsIHApOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob1NpbXBsZVR5cGVzQXNTdHJ1Y3RSZXNwb25zZSAqIFNPQVBfRk1BQzQgc29hcF9pbnN0YW50aWF0ZV9uc19fZWNob1NpbXBsZVR5cGVzQXNTdHJ1Y3RSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4sIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmFycmF5VHlwZSwgc2l6ZV90ICpzaXplKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAic29hcF9pbnN0YW50aWF0ZV9uc19fZWNob1NpbXBsZVR5cGVzQXNTdHJ1Y3RSZXNwb25zZSglZCwgJXMsICVzKVxuIiwgbiwgdHlwZT90eXBlOiIiLCBhcnJheVR5cGU/YXJyYXlUeXBlOiIiKSk7CisJc3RydWN0IHNvYXBfY2xpc3QgKmNwID0gc29hcF9saW5rKHNvYXAsIE5VTEwsIFNPQVBfVFlQRV9uc19fZWNob1NpbXBsZVR5cGVzQXNTdHJ1Y3RSZXNwb25zZSwgbiwgc29hcF9mZGVsZXRlKTsKKwlpZiAoIWNwKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAobiA8IDApCisJewljcC0+cHRyID0gKHZvaWQqKW5ldyBzdHJ1Y3QgbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0UmVzcG9uc2U7CisJCWlmIChzaXplKQorCQkJKnNpemUgPSBzaXplb2Yoc3RydWN0IG5zX19lY2hvU2ltcGxlVHlwZXNBc1N0cnVjdFJlc3BvbnNlKTsKKwl9CisJZWxzZQorCXsJY3AtPnB0ciA9ICh2b2lkKiluZXcgc3RydWN0IG5zX19lY2hvU2ltcGxlVHlwZXNBc1N0cnVjdFJlc3BvbnNlW25dOworCQlpZiAoc2l6ZSkKKwkJCSpzaXplID0gbiAqIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0UmVzcG9uc2UpOworCX0KKwkJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbnN0YW50aWF0ZWQgbG9jYXRpb249JXBcbiIsIGNwLT5wdHIpKTsKKwlyZXR1cm4gKHN0cnVjdCBuc19fZWNob1NpbXBsZVR5cGVzQXNTdHJ1Y3RSZXNwb25zZSopY3AtPnB0cjsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9jb3B5X25zX19lY2hvU2ltcGxlVHlwZXNBc1N0cnVjdFJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3QsIGludCB0dCwgdm9pZCAqcCwgc2l6ZV90IGxlbiwgY29uc3Qgdm9pZCAqcSwgc2l6ZV90IG4pCit7CisJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5aW5nIHN0cnVjdCBuc19fZWNob1NpbXBsZVR5cGVzQXNTdHJ1Y3RSZXNwb25zZSAlcCAtPiAlcFxuIiwgcSwgcCkpOworCSooc3RydWN0IG5zX19lY2hvU2ltcGxlVHlwZXNBc1N0cnVjdFJlc3BvbnNlKilwID0gKihzdHJ1Y3QgbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0UmVzcG9uc2UqKXE7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX25zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IG5zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlcyAqYSkKK3sKKwkodm9pZClzb2FwOyAodm9pZClhOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8KKwlzb2FwX2VtYmVkZGVkKHNvYXAsICZhLT5faW5wdXRTdHJ1Y3QsIFNPQVBfVFlQRV9zX19TT0FQU3RydWN0KTsKKwlzb2FwX3NlcmlhbGl6ZV9zX19TT0FQU3RydWN0KHNvYXAsICZhLT5faW5wdXRTdHJ1Y3QpOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfbnNfX2VjaG9TdHJ1Y3RBc1NpbXBsZVR5cGVzKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBc1NpbXBsZVR5cGVzICphKQoreworCSh2b2lkKXNvYXA7ICh2b2lkKWE7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLworCXNvYXBfZGVmYXVsdF9zX19TT0FQU3RydWN0KHNvYXAsICZhLT5faW5wdXRTdHJ1Y3QpOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X25zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IG5zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlcyAqYSwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCXJlZ2lzdGVyIGludCBpZCA9IHNvYXBfZW1iZWQoc29hcCwgKHZvaWQqKWEsIE5VTEwsIDAsIHRhZywgU09BUF9UWVBFX25zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlcyk7CisJaWYgKHNvYXBfb3V0X25zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlcyhzb2FwLCB0YWcsIGlkLCBhLCB0eXBlKSkKKwkJcmV0dXJuIHNvYXAtPmVycm9yOworCXJldHVybiBzb2FwX3B1dGluZGVwZW5kZW50KHNvYXApOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X25zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHN0cnVjdCBuc19fZWNob1N0cnVjdEFzU2ltcGxlVHlwZXMgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIGEsIFNPQVBfVFlQRV9uc19fZWNob1N0cnVjdEFzU2ltcGxlVHlwZXMpLCB0eXBlKTsKKwlzb2FwX291dF9zX19TT0FQU3RydWN0KHNvYXAsICJpbnB1dFN0cnVjdCIsIC0xLCAmYS0+X2lucHV0U3RydWN0LCAiIik7CisJc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKKwlyZXR1cm4gU09BUF9PSzsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBc1NpbXBsZVR5cGVzICogU09BUF9GTUFDNCBzb2FwX2dldF9uc19fZWNob1N0cnVjdEFzU2ltcGxlVHlwZXMoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob1N0cnVjdEFzU2ltcGxlVHlwZXMgKnAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoKHAgPSBzb2FwX2luX25zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlcyhzb2FwLCB0YWcsIHAsIHR5cGUpKSkKKwkJc29hcF9nZXRpbmRlcGVuZGVudChzb2FwKTsKKwlyZXR1cm4gcDsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBc1NpbXBsZVR5cGVzICogU09BUF9GTUFDNCBzb2FwX2luX25zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBc1NpbXBsZVR5cGVzICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXNob3J0IHNvYXBfZmxhZ19faW5wdXRTdHJ1Y3QgPSAxOworCWlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCpzb2FwLT50eXBlICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpKQorCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisJCXJldHVybiBOVUxMOworCX0KKwlhID0gKHN0cnVjdCBuc19fZWNob1N0cnVjdEFzU2ltcGxlVHlwZXMgKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBhLCBTT0FQX1RZUEVfbnNfX2VjaG9TdHJ1Y3RBc1NpbXBsZVR5cGVzLCBzaXplb2Yoc3RydWN0IG5zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlcyksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworCWlmICghYSkKKwkJcmV0dXJuIE5VTEw7CisJc29hcF9kZWZhdWx0X25zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlcyhzb2FwLCBhKTsKKwlpZiAoc29hcC0+Ym9keSAmJiAhKnNvYXAtPmhyZWYpCisJeworCQlmb3IgKDs7KQorCQl7CXNvYXAtPmVycm9yID0gU09BUF9UQUdfTUlTTUFUQ0g7CisJCQlpZiAoc29hcF9mbGFnX19pbnB1dFN0cnVjdCAmJiBzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlpZiAoc29hcF9pbl9zX19TT0FQU3RydWN0KHNvYXAsIE5VTEwsICZhLT5faW5wdXRTdHJ1Y3QsICJzOlNPQVBTdHJ1Y3QiKSkKKwkJCQl7CXNvYXBfZmxhZ19faW5wdXRTdHJ1Y3QtLTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCXNvYXAtPmVycm9yID0gc29hcF9pZ25vcmVfZWxlbWVudChzb2FwKTsKKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykKKwkJCQlicmVhazsKKwkJCWlmIChzb2FwLT5lcnJvcikKKwkJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIChzb2FwX2ZsYWdfX2lucHV0U3RydWN0ID4gMCkpCisJCXsJc29hcC0+ZXJyb3IgPSBTT0FQX09DQ1VSUzsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWlmIChzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJZWxzZQorCXsJYSA9IChzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBc1NpbXBsZVR5cGVzICopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopYSwgMCwgU09BUF9UWVBFX25zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlcywgMCwgc2l6ZW9mKHN0cnVjdCBuc19fZWNob1N0cnVjdEFzU2ltcGxlVHlwZXMpLCAwLCBOVUxMKTsKKwkJaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBhOworfQorCitTT0FQX0ZNQUM1IHN0cnVjdCBuc19fZWNob1N0cnVjdEFzU2ltcGxlVHlwZXMgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X25zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlcyhzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4pCit7CXJldHVybiBzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlcyhzb2FwLCBuLCBOVUxMLCBOVUxMLCBOVUxMKTsKK30KKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfbnNfX2VjaG9TdHJ1Y3RBc1NpbXBsZVR5cGVzKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBc1NpbXBsZVR5cGVzICpwKQorewlzb2FwX2RlbGV0ZShzb2FwLCBwKTsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBc1NpbXBsZVR5cGVzICogU09BUF9GTUFDNCBzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlcyhzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4sIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmFycmF5VHlwZSwgc2l6ZV90ICpzaXplKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAic29hcF9pbnN0YW50aWF0ZV9uc19fZWNob1N0cnVjdEFzU2ltcGxlVHlwZXMoJWQsICVzLCAlcylcbiIsIG4sIHR5cGU/dHlwZToiIiwgYXJyYXlUeXBlP2FycmF5VHlwZToiIikpOworCXN0cnVjdCBzb2FwX2NsaXN0ICpjcCA9IHNvYXBfbGluayhzb2FwLCBOVUxMLCBTT0FQX1RZUEVfbnNfX2VjaG9TdHJ1Y3RBc1NpbXBsZVR5cGVzLCBuLCBzb2FwX2ZkZWxldGUpOworCWlmICghY3ApCisJCXJldHVybiBOVUxMOworCWlmIChuIDwgMCkKKwl7CWNwLT5wdHIgPSAodm9pZCopbmV3IHN0cnVjdCBuc19fZWNob1N0cnVjdEFzU2ltcGxlVHlwZXM7CisJCWlmIChzaXplKQorCQkJKnNpemUgPSBzaXplb2Yoc3RydWN0IG5zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlcyk7CisJfQorCWVsc2UKKwl7CWNwLT5wdHIgPSAodm9pZCopbmV3IHN0cnVjdCBuc19fZWNob1N0cnVjdEFzU2ltcGxlVHlwZXNbbl07CisJCWlmIChzaXplKQorCQkJKnNpemUgPSBuICogc2l6ZW9mKHN0cnVjdCBuc19fZWNob1N0cnVjdEFzU2ltcGxlVHlwZXMpOworCX0KKwkJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbnN0YW50aWF0ZWQgbG9jYXRpb249JXBcbiIsIGNwLT5wdHIpKTsKKwlyZXR1cm4gKHN0cnVjdCBuc19fZWNob1N0cnVjdEFzU2ltcGxlVHlwZXMqKWNwLT5wdHI7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfY29weV9uc19fZWNob1N0cnVjdEFzU2ltcGxlVHlwZXMoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdCwgaW50IHR0LCB2b2lkICpwLCBzaXplX3QgbGVuLCBjb25zdCB2b2lkICpxLCBzaXplX3QgbikKK3sKKwlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHlpbmcgc3RydWN0IG5zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlcyAlcCAtPiAlcFxuIiwgcSwgcCkpOworCSooc3RydWN0IG5zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlcyopcCA9ICooc3RydWN0IG5zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlcyopcTsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfbnNfX2VjaG9TdHJ1Y3RBc1NpbXBsZVR5cGVzUmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBuc19fZWNob1N0cnVjdEFzU2ltcGxlVHlwZXNSZXNwb25zZSAqYSkKK3sKKwkodm9pZClzb2FwOyAodm9pZClhOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8KKwlzb2FwX3NlcmlhbGl6ZV94c2RfX3N0cmluZyhzb2FwLCAmYS0+X291dHB1dFN0cmluZyk7CisJc29hcF9zZXJpYWxpemVfUG9pbnRlclRveHNkX19pbnQoc29hcCwgJmEtPl9vdXRwdXRJbnRlZ2VyKTsKKwlzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG94c2RfX2Zsb2F0KHNvYXAsICZhLT5fb3V0cHV0RmxvYXQpOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfbnNfX2VjaG9TdHJ1Y3RBc1NpbXBsZVR5cGVzUmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob1N0cnVjdEFzU2ltcGxlVHlwZXNSZXNwb25zZSAqYSkKK3sKKwkodm9pZClzb2FwOyAodm9pZClhOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8KKwlzb2FwX2RlZmF1bHRfeHNkX19zdHJpbmcoc29hcCwgJmEtPl9vdXRwdXRTdHJpbmcpOworCWEtPl9vdXRwdXRJbnRlZ2VyID0gTlVMTDsKKwlhLT5fb3V0cHV0RmxvYXQgPSBOVUxMOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X25zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlc1Jlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBc1NpbXBsZVR5cGVzUmVzcG9uc2UgKmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZWdpc3RlciBpbnQgaWQgPSBzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCBOVUxMLCAwLCB0YWcsIFNPQVBfVFlQRV9uc19fZWNob1N0cnVjdEFzU2ltcGxlVHlwZXNSZXNwb25zZSk7CisJaWYgKHNvYXBfb3V0X25zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlc1Jlc3BvbnNlKHNvYXAsIHRhZywgaWQsIGEsIHR5cGUpKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJcmV0dXJuIHNvYXBfcHV0aW5kZXBlbmRlbnQoc29hcCk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfbnNfX2VjaG9TdHJ1Y3RBc1NpbXBsZVR5cGVzUmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBc1NpbXBsZVR5cGVzUmVzcG9uc2UgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIGEsIFNPQVBfVFlQRV9uc19fZWNob1N0cnVjdEFzU2ltcGxlVHlwZXNSZXNwb25zZSksIHR5cGUpOworCWlmIChhLT5fb3V0cHV0U3RyaW5nKQorCQlzb2FwX2VsZW1lbnRfcmVzdWx0KHNvYXAsICJvdXRwdXRTdHJpbmciKTsKKwlzb2FwX291dF94c2RfX3N0cmluZyhzb2FwLCAib3V0cHV0U3RyaW5nIiwgLTEsICZhLT5fb3V0cHV0U3RyaW5nLCAiIik7CisJc29hcF9vdXRfUG9pbnRlclRveHNkX19pbnQoc29hcCwgIm91dHB1dEludGVnZXIiLCAtMSwgJmEtPl9vdXRwdXRJbnRlZ2VyLCAiIik7CisJc29hcF9vdXRfUG9pbnRlclRveHNkX19mbG9hdChzb2FwLCAib3V0cHV0RmxvYXQiLCAtMSwgJmEtPl9vdXRwdXRGbG9hdCwgIiIpOworCXNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7CisJcmV0dXJuIFNPQVBfT0s7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlc1Jlc3BvbnNlICogU09BUF9GTUFDNCBzb2FwX2dldF9uc19fZWNob1N0cnVjdEFzU2ltcGxlVHlwZXNSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlc1Jlc3BvbnNlICpwLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKChwID0gc29hcF9pbl9uc19fZWNob1N0cnVjdEFzU2ltcGxlVHlwZXNSZXNwb25zZShzb2FwLCB0YWcsIHAsIHR5cGUpKSkKKwkJc29hcF9nZXRpbmRlcGVuZGVudChzb2FwKTsKKwlyZXR1cm4gcDsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBc1NpbXBsZVR5cGVzUmVzcG9uc2UgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fbnNfX2VjaG9TdHJ1Y3RBc1NpbXBsZVR5cGVzUmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc3RydWN0IG5zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlc1Jlc3BvbnNlICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXNob3J0IHNvYXBfZmxhZ19fb3V0cHV0U3RyaW5nID0gMSwgc29hcF9mbGFnX19vdXRwdXRJbnRlZ2VyID0gMSwgc29hcF9mbGFnX19vdXRwdXRGbG9hdCA9IDE7CisJaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoKnNvYXAtPnR5cGUgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkpCisJewlzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWEgPSAoc3RydWN0IG5zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlc1Jlc3BvbnNlICopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgYSwgU09BUF9UWVBFX25zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlc1Jlc3BvbnNlLCBzaXplb2Yoc3RydWN0IG5zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlc1Jlc3BvbnNlKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJaWYgKCFhKQorCQlyZXR1cm4gTlVMTDsKKwlzb2FwX2RlZmF1bHRfbnNfX2VjaG9TdHJ1Y3RBc1NpbXBsZVR5cGVzUmVzcG9uc2Uoc29hcCwgYSk7CisJaWYgKHNvYXAtPmJvZHkgJiYgISpzb2FwLT5ocmVmKQorCXsKKwkJZm9yICg7OykKKwkJewlzb2FwLT5lcnJvciA9IFNPQVBfVEFHX01JU01BVENIOworCQkJaWYgKHNvYXBfZmxhZ19fb3V0cHV0U3RyaW5nICYmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCB8fCBzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykpCisJCQkJaWYgKHNvYXBfaW5feHNkX19zdHJpbmcoc29hcCwgTlVMTCwgJmEtPl9vdXRwdXRTdHJpbmcsICJ4c2Q6c3RyaW5nIikpCisJCQkJewlzb2FwX2ZsYWdfX291dHB1dFN0cmluZy0tOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQlpZiAoc29hcF9mbGFnX19vdXRwdXRJbnRlZ2VyICYmIHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCWlmIChzb2FwX2luX1BvaW50ZXJUb3hzZF9faW50KHNvYXAsIE5VTEwsICZhLT5fb3V0cHV0SW50ZWdlciwgInhzZDppbnQiKSkKKwkJCQl7CXNvYXBfZmxhZ19fb3V0cHV0SW50ZWdlci0tOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQlpZiAoc29hcF9mbGFnX19vdXRwdXRGbG9hdCAmJiBzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlpZiAoc29hcF9pbl9Qb2ludGVyVG94c2RfX2Zsb2F0KHNvYXAsIE5VTEwsICZhLT5fb3V0cHV0RmxvYXQsICJ4c2Q6ZmxvYXQiKSkKKwkJCQl7CXNvYXBfZmxhZ19fb3V0cHV0RmxvYXQtLTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCXNvYXAtPmVycm9yID0gc29hcF9pZ25vcmVfZWxlbWVudChzb2FwKTsKKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykKKwkJCQlicmVhazsKKwkJCWlmIChzb2FwLT5lcnJvcikKKwkJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCWVsc2UKKwl7CWEgPSAoc3RydWN0IG5zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlc1Jlc3BvbnNlICopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopYSwgMCwgU09BUF9UWVBFX25zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlc1Jlc3BvbnNlLCAwLCBzaXplb2Yoc3RydWN0IG5zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlc1Jlc3BvbnNlKSwgMCwgTlVMTCk7CisJCWlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gYTsKK30KKworU09BUF9GTUFDNSBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBc1NpbXBsZVR5cGVzUmVzcG9uc2UgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X25zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlc1Jlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbikKK3sJcmV0dXJuIHNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG9TdHJ1Y3RBc1NpbXBsZVR5cGVzUmVzcG9uc2Uoc29hcCwgbiwgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX25zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlc1Jlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBc1NpbXBsZVR5cGVzUmVzcG9uc2UgKnApCit7CXNvYXBfZGVsZXRlKHNvYXAsIHApOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob1N0cnVjdEFzU2ltcGxlVHlwZXNSZXNwb25zZSAqIFNPQVBfRk1BQzQgc29hcF9pbnN0YW50aWF0ZV9uc19fZWNob1N0cnVjdEFzU2ltcGxlVHlwZXNSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4sIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmFycmF5VHlwZSwgc2l6ZV90ICpzaXplKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAic29hcF9pbnN0YW50aWF0ZV9uc19fZWNob1N0cnVjdEFzU2ltcGxlVHlwZXNSZXNwb25zZSglZCwgJXMsICVzKVxuIiwgbiwgdHlwZT90eXBlOiIiLCBhcnJheVR5cGU/YXJyYXlUeXBlOiIiKSk7CisJc3RydWN0IHNvYXBfY2xpc3QgKmNwID0gc29hcF9saW5rKHNvYXAsIE5VTEwsIFNPQVBfVFlQRV9uc19fZWNob1N0cnVjdEFzU2ltcGxlVHlwZXNSZXNwb25zZSwgbiwgc29hcF9mZGVsZXRlKTsKKwlpZiAoIWNwKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAobiA8IDApCisJewljcC0+cHRyID0gKHZvaWQqKW5ldyBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBc1NpbXBsZVR5cGVzUmVzcG9uc2U7CisJCWlmIChzaXplKQorCQkJKnNpemUgPSBzaXplb2Yoc3RydWN0IG5zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlc1Jlc3BvbnNlKTsKKwl9CisJZWxzZQorCXsJY3AtPnB0ciA9ICh2b2lkKiluZXcgc3RydWN0IG5zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlc1Jlc3BvbnNlW25dOworCQlpZiAoc2l6ZSkKKwkJCSpzaXplID0gbiAqIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBc1NpbXBsZVR5cGVzUmVzcG9uc2UpOworCX0KKwkJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbnN0YW50aWF0ZWQgbG9jYXRpb249JXBcbiIsIGNwLT5wdHIpKTsKKwlyZXR1cm4gKHN0cnVjdCBuc19fZWNob1N0cnVjdEFzU2ltcGxlVHlwZXNSZXNwb25zZSopY3AtPnB0cjsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9jb3B5X25zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlc1Jlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3QsIGludCB0dCwgdm9pZCAqcCwgc2l6ZV90IGxlbiwgY29uc3Qgdm9pZCAqcSwgc2l6ZV90IG4pCit7CisJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5aW5nIHN0cnVjdCBuc19fZWNob1N0cnVjdEFzU2ltcGxlVHlwZXNSZXNwb25zZSAlcCAtPiAlcFxuIiwgcSwgcCkpOworCSooc3RydWN0IG5zX19lY2hvU3RydWN0QXNTaW1wbGVUeXBlc1Jlc3BvbnNlKilwID0gKihzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBc1NpbXBsZVR5cGVzUmVzcG9uc2UqKXE7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX25zX19lY2hvQm9vbGVhbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IG5zX19lY2hvQm9vbGVhbiAqYSkKK3sKKwkodm9pZClzb2FwOyAodm9pZClhOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8KK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X25zX19lY2hvQm9vbGVhbihzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvQm9vbGVhbiAqYSkKK3sKKwkodm9pZClzb2FwOyAodm9pZClhOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8KKwlzb2FwX2RlZmF1bHRfeHNkX19ib29sZWFuKHNvYXAsICZhLT5pbnB1dEJvb2xlYW4pOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X25zX19lY2hvQm9vbGVhbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IG5zX19lY2hvQm9vbGVhbiAqYSwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCXJlZ2lzdGVyIGludCBpZCA9IHNvYXBfZW1iZWQoc29hcCwgKHZvaWQqKWEsIE5VTEwsIDAsIHRhZywgU09BUF9UWVBFX25zX19lY2hvQm9vbGVhbik7CisJaWYgKHNvYXBfb3V0X25zX19lY2hvQm9vbGVhbihzb2FwLCB0YWcsIGlkLCBhLCB0eXBlKSkKKwkJcmV0dXJuIHNvYXAtPmVycm9yOworCXJldHVybiBzb2FwX3B1dGluZGVwZW5kZW50KHNvYXApOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X25zX19lY2hvQm9vbGVhbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHN0cnVjdCBuc19fZWNob0Jvb2xlYW4gKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIGEsIFNPQVBfVFlQRV9uc19fZWNob0Jvb2xlYW4pLCB0eXBlKTsKKwlzb2FwX291dF94c2RfX2Jvb2xlYW4oc29hcCwgImlucHV0Qm9vbGVhbiIsIC0xLCAmYS0+aW5wdXRCb29sZWFuLCAiIik7CisJc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKKwlyZXR1cm4gU09BUF9PSzsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9Cb29sZWFuICogU09BUF9GTUFDNCBzb2FwX2dldF9uc19fZWNob0Jvb2xlYW4oc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob0Jvb2xlYW4gKnAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoKHAgPSBzb2FwX2luX25zX19lY2hvQm9vbGVhbihzb2FwLCB0YWcsIHAsIHR5cGUpKSkKKwkJc29hcF9nZXRpbmRlcGVuZGVudChzb2FwKTsKKwlyZXR1cm4gcDsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9Cb29sZWFuICogU09BUF9GTUFDNCBzb2FwX2luX25zX19lY2hvQm9vbGVhbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzdHJ1Y3QgbnNfX2VjaG9Cb29sZWFuICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXNob3J0IHNvYXBfZmxhZ19pbnB1dEJvb2xlYW4gPSAxOworCWlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCpzb2FwLT50eXBlICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpKQorCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisJCXJldHVybiBOVUxMOworCX0KKwlhID0gKHN0cnVjdCBuc19fZWNob0Jvb2xlYW4gKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBhLCBTT0FQX1RZUEVfbnNfX2VjaG9Cb29sZWFuLCBzaXplb2Yoc3RydWN0IG5zX19lY2hvQm9vbGVhbiksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworCWlmICghYSkKKwkJcmV0dXJuIE5VTEw7CisJc29hcF9kZWZhdWx0X25zX19lY2hvQm9vbGVhbihzb2FwLCBhKTsKKwlpZiAoc29hcC0+Ym9keSAmJiAhKnNvYXAtPmhyZWYpCisJeworCQlmb3IgKDs7KQorCQl7CXNvYXAtPmVycm9yID0gU09BUF9UQUdfTUlTTUFUQ0g7CisJCQlpZiAoc29hcF9mbGFnX2lucHV0Qm9vbGVhbiAmJiBzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlpZiAoc29hcF9pbl94c2RfX2Jvb2xlYW4oc29hcCwgImlucHV0Qm9vbGVhbiIsICZhLT5pbnB1dEJvb2xlYW4sICJ4c2Q6Ym9vbGVhbiIpKQorCQkJCXsJc29hcF9mbGFnX2lucHV0Qm9vbGVhbi0tOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQlpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJc29hcC0+ZXJyb3IgPSBzb2FwX2lnbm9yZV9lbGVtZW50KHNvYXApOworCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfTk9fVEFHKQorCQkJCWJyZWFrOworCQkJaWYgKHNvYXAtPmVycm9yKQorCQkJCXJldHVybiBOVUxMOworCQl9CisJCWlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgKHNvYXBfZmxhZ19pbnB1dEJvb2xlYW4gPiAwKSkKKwkJewlzb2FwLT5lcnJvciA9IFNPQVBfT0NDVVJTOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwllbHNlCisJewlhID0gKHN0cnVjdCBuc19fZWNob0Jvb2xlYW4gKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilhLCAwLCBTT0FQX1RZUEVfbnNfX2VjaG9Cb29sZWFuLCAwLCBzaXplb2Yoc3RydWN0IG5zX19lY2hvQm9vbGVhbiksIDAsIE5VTEwpOworCQlpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGE7Cit9CisKK1NPQVBfRk1BQzUgc3RydWN0IG5zX19lY2hvQm9vbGVhbiAqIFNPQVBfRk1BQzYgc29hcF9uZXdfbnNfX2VjaG9Cb29sZWFuKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbikKK3sJcmV0dXJuIHNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG9Cb29sZWFuKHNvYXAsIG4sIE5VTEwsIE5VTEwsIE5VTEwpOworfQorCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9uc19fZWNob0Jvb2xlYW4oc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob0Jvb2xlYW4gKnApCit7CXNvYXBfZGVsZXRlKHNvYXAsIHApOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob0Jvb2xlYW4gKiBTT0FQX0ZNQUM0IHNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG9Cb29sZWFuKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbiwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqYXJyYXlUeXBlLCBzaXplX3QgKnNpemUpCit7CisJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvQm9vbGVhbiglZCwgJXMsICVzKVxuIiwgbiwgdHlwZT90eXBlOiIiLCBhcnJheVR5cGU/YXJyYXlUeXBlOiIiKSk7CisJc3RydWN0IHNvYXBfY2xpc3QgKmNwID0gc29hcF9saW5rKHNvYXAsIE5VTEwsIFNPQVBfVFlQRV9uc19fZWNob0Jvb2xlYW4sIG4sIHNvYXBfZmRlbGV0ZSk7CisJaWYgKCFjcCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKG4gPCAwKQorCXsJY3AtPnB0ciA9ICh2b2lkKiluZXcgc3RydWN0IG5zX19lY2hvQm9vbGVhbjsKKwkJaWYgKHNpemUpCisJCQkqc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9Cb29sZWFuKTsKKwl9CisJZWxzZQorCXsJY3AtPnB0ciA9ICh2b2lkKiluZXcgc3RydWN0IG5zX19lY2hvQm9vbGVhbltuXTsKKwkJaWYgKHNpemUpCisJCQkqc2l6ZSA9IG4gKiBzaXplb2Yoc3RydWN0IG5zX19lY2hvQm9vbGVhbik7CisJfQorCQlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluc3RhbnRpYXRlZCBsb2NhdGlvbj0lcFxuIiwgY3AtPnB0cikpOworCXJldHVybiAoc3RydWN0IG5zX19lY2hvQm9vbGVhbiopY3AtPnB0cjsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9jb3B5X25zX19lY2hvQm9vbGVhbihzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0LCBpbnQgdHQsIHZvaWQgKnAsIHNpemVfdCBsZW4sIGNvbnN0IHZvaWQgKnEsIHNpemVfdCBuKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weWluZyBzdHJ1Y3QgbnNfX2VjaG9Cb29sZWFuICVwIC0+ICVwXG4iLCBxLCBwKSk7CisJKihzdHJ1Y3QgbnNfX2VjaG9Cb29sZWFuKilwID0gKihzdHJ1Y3QgbnNfX2VjaG9Cb29sZWFuKilxOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9uc19fZWNob0Jvb2xlYW5SZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IG5zX19lY2hvQm9vbGVhblJlc3BvbnNlICphKQoreworCSh2b2lkKXNvYXA7ICh2b2lkKWE7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfbnNfX2VjaG9Cb29sZWFuUmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob0Jvb2xlYW5SZXNwb25zZSAqYSkKK3sKKwkodm9pZClzb2FwOyAodm9pZClhOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8KKwlzb2FwX2RlZmF1bHRfeHNkX19ib29sZWFuKHNvYXAsICZhLT5fcmV0dXJuKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9uc19fZWNob0Jvb2xlYW5SZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IG5zX19lY2hvQm9vbGVhblJlc3BvbnNlICphLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmVnaXN0ZXIgaW50IGlkID0gc29hcF9lbWJlZChzb2FwLCAodm9pZCopYSwgTlVMTCwgMCwgdGFnLCBTT0FQX1RZUEVfbnNfX2VjaG9Cb29sZWFuUmVzcG9uc2UpOworCWlmIChzb2FwX291dF9uc19fZWNob0Jvb2xlYW5SZXNwb25zZShzb2FwLCB0YWcsIGlkLCBhLCB0eXBlKSkKKwkJcmV0dXJuIHNvYXAtPmVycm9yOworCXJldHVybiBzb2FwX3B1dGluZGVwZW5kZW50KHNvYXApOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X25zX19lY2hvQm9vbGVhblJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgc3RydWN0IG5zX19lY2hvQm9vbGVhblJlc3BvbnNlICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBhLCBTT0FQX1RZUEVfbnNfX2VjaG9Cb29sZWFuUmVzcG9uc2UpLCB0eXBlKTsKKwlzb2FwX2VsZW1lbnRfcmVzdWx0KHNvYXAsICJyZXR1cm4iKTsKKwlzb2FwX291dF94c2RfX2Jvb2xlYW4oc29hcCwgInJldHVybiIsIC0xLCAmYS0+X3JldHVybiwgIiIpOworCXNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7CisJcmV0dXJuIFNPQVBfT0s7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvQm9vbGVhblJlc3BvbnNlICogU09BUF9GTUFDNCBzb2FwX2dldF9uc19fZWNob0Jvb2xlYW5SZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvQm9vbGVhblJlc3BvbnNlICpwLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKChwID0gc29hcF9pbl9uc19fZWNob0Jvb2xlYW5SZXNwb25zZShzb2FwLCB0YWcsIHAsIHR5cGUpKSkKKwkJc29hcF9nZXRpbmRlcGVuZGVudChzb2FwKTsKKwlyZXR1cm4gcDsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9Cb29sZWFuUmVzcG9uc2UgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fbnNfX2VjaG9Cb29sZWFuUmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc3RydWN0IG5zX19lY2hvQm9vbGVhblJlc3BvbnNlICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXNob3J0IHNvYXBfZmxhZ19fcmV0dXJuID0gMTsKKwlpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisJCXJldHVybiBOVUxMOworCWlmICgqc29hcC0+dHlwZSAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKSkKKwl7CXNvYXAtPmVycm9yID0gU09BUF9UWVBFOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYSA9IChzdHJ1Y3QgbnNfX2VjaG9Cb29sZWFuUmVzcG9uc2UgKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBhLCBTT0FQX1RZUEVfbnNfX2VjaG9Cb29sZWFuUmVzcG9uc2UsIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9Cb29sZWFuUmVzcG9uc2UpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwlpZiAoIWEpCisJCXJldHVybiBOVUxMOworCXNvYXBfZGVmYXVsdF9uc19fZWNob0Jvb2xlYW5SZXNwb25zZShzb2FwLCBhKTsKKwlpZiAoc29hcC0+Ym9keSAmJiAhKnNvYXAtPmhyZWYpCisJeworCQlmb3IgKDs7KQorCQl7CXNvYXAtPmVycm9yID0gU09BUF9UQUdfTUlTTUFUQ0g7CisJCQlpZiAoc29hcF9mbGFnX19yZXR1cm4gJiYgc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJaWYgKHNvYXBfaW5feHNkX19ib29sZWFuKHNvYXAsIE5VTEwsICZhLT5fcmV0dXJuLCAieHNkOmJvb2xlYW4iKSkKKwkJCQl7CXNvYXBfZmxhZ19fcmV0dXJuLS07CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlzb2FwLT5lcnJvciA9IHNvYXBfaWdub3JlX2VsZW1lbnQoc29hcCk7CisJCQlpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcpCisJCQkJYnJlYWs7CisJCQlpZiAoc29hcC0+ZXJyb3IpCisJCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiAoc29hcF9mbGFnX19yZXR1cm4gPiAwKSkKKwkJewlzb2FwLT5lcnJvciA9IFNPQVBfT0NDVVJTOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwllbHNlCisJewlhID0gKHN0cnVjdCBuc19fZWNob0Jvb2xlYW5SZXNwb25zZSAqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCAodm9pZCoqKWEsIDAsIFNPQVBfVFlQRV9uc19fZWNob0Jvb2xlYW5SZXNwb25zZSwgMCwgc2l6ZW9mKHN0cnVjdCBuc19fZWNob0Jvb2xlYW5SZXNwb25zZSksIDAsIE5VTEwpOworCQlpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGE7Cit9CisKK1NPQVBfRk1BQzUgc3RydWN0IG5zX19lY2hvQm9vbGVhblJlc3BvbnNlICogU09BUF9GTUFDNiBzb2FwX25ld19uc19fZWNob0Jvb2xlYW5SZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4pCit7CXJldHVybiBzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvQm9vbGVhblJlc3BvbnNlKHNvYXAsIG4sIE5VTEwsIE5VTEwsIE5VTEwpOworfQorCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9uc19fZWNob0Jvb2xlYW5SZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvQm9vbGVhblJlc3BvbnNlICpwKQorewlzb2FwX2RlbGV0ZShzb2FwLCBwKTsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9Cb29sZWFuUmVzcG9uc2UgKiBTT0FQX0ZNQUM0IHNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG9Cb29sZWFuUmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICphcnJheVR5cGUsIHNpemVfdCAqc2l6ZSkKK3sKKwlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgInNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG9Cb29sZWFuUmVzcG9uc2UoJWQsICVzLCAlcylcbiIsIG4sIHR5cGU/dHlwZToiIiwgYXJyYXlUeXBlP2FycmF5VHlwZToiIikpOworCXN0cnVjdCBzb2FwX2NsaXN0ICpjcCA9IHNvYXBfbGluayhzb2FwLCBOVUxMLCBTT0FQX1RZUEVfbnNfX2VjaG9Cb29sZWFuUmVzcG9uc2UsIG4sIHNvYXBfZmRlbGV0ZSk7CisJaWYgKCFjcCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKG4gPCAwKQorCXsJY3AtPnB0ciA9ICh2b2lkKiluZXcgc3RydWN0IG5zX19lY2hvQm9vbGVhblJlc3BvbnNlOworCQlpZiAoc2l6ZSkKKwkJCSpzaXplID0gc2l6ZW9mKHN0cnVjdCBuc19fZWNob0Jvb2xlYW5SZXNwb25zZSk7CisJfQorCWVsc2UKKwl7CWNwLT5wdHIgPSAodm9pZCopbmV3IHN0cnVjdCBuc19fZWNob0Jvb2xlYW5SZXNwb25zZVtuXTsKKwkJaWYgKHNpemUpCisJCQkqc2l6ZSA9IG4gKiBzaXplb2Yoc3RydWN0IG5zX19lY2hvQm9vbGVhblJlc3BvbnNlKTsKKwl9CisJCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5zdGFudGlhdGVkIGxvY2F0aW9uPSVwXG4iLCBjcC0+cHRyKSk7CisJcmV0dXJuIChzdHJ1Y3QgbnNfX2VjaG9Cb29sZWFuUmVzcG9uc2UqKWNwLT5wdHI7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfY29weV9uc19fZWNob0Jvb2xlYW5SZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0LCBpbnQgdHQsIHZvaWQgKnAsIHNpemVfdCBsZW4sIGNvbnN0IHZvaWQgKnEsIHNpemVfdCBuKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weWluZyBzdHJ1Y3QgbnNfX2VjaG9Cb29sZWFuUmVzcG9uc2UgJXAgLT4gJXBcbiIsIHEsIHApKTsKKwkqKHN0cnVjdCBuc19fZWNob0Jvb2xlYW5SZXNwb25zZSopcCA9ICooc3RydWN0IG5zX19lY2hvQm9vbGVhblJlc3BvbnNlKilxOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9uc19fZWNob0RlY2ltYWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBuc19fZWNob0RlY2ltYWwgKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisJc29hcF9zZXJpYWxpemVfeHNkX19kZWNpbWFsKHNvYXAsICZhLT5pbnB1dERlY2ltYWwpOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfbnNfX2VjaG9EZWNpbWFsKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2VjaG9EZWNpbWFsICphKQoreworCSh2b2lkKXNvYXA7ICh2b2lkKWE7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLworCXNvYXBfZGVmYXVsdF94c2RfX2RlY2ltYWwoc29hcCwgJmEtPmlucHV0RGVjaW1hbCk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfbnNfX2VjaG9EZWNpbWFsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG9EZWNpbWFsICphLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmVnaXN0ZXIgaW50IGlkID0gc29hcF9lbWJlZChzb2FwLCAodm9pZCopYSwgTlVMTCwgMCwgdGFnLCBTT0FQX1RZUEVfbnNfX2VjaG9EZWNpbWFsKTsKKwlpZiAoc29hcF9vdXRfbnNfX2VjaG9EZWNpbWFsKHNvYXAsIHRhZywgaWQsIGEsIHR5cGUpKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJcmV0dXJuIHNvYXBfcHV0aW5kZXBlbmRlbnQoc29hcCk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfbnNfX2VjaG9EZWNpbWFsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgc3RydWN0IG5zX19lY2hvRGVjaW1hbCAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgYSwgU09BUF9UWVBFX25zX19lY2hvRGVjaW1hbCksIHR5cGUpOworCXNvYXBfb3V0X3hzZF9fZGVjaW1hbChzb2FwLCAiaW5wdXREZWNpbWFsIiwgLTEsICZhLT5pbnB1dERlY2ltYWwsICIiKTsKKwlzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworCXJldHVybiBTT0FQX09LOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob0RlY2ltYWwgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X25zX19lY2hvRGVjaW1hbChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvRGVjaW1hbCAqcCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmICgocCA9IHNvYXBfaW5fbnNfX2VjaG9EZWNpbWFsKHNvYXAsIHRhZywgcCwgdHlwZSkpKQorCQlzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOworCXJldHVybiBwOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob0RlY2ltYWwgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fbnNfX2VjaG9EZWNpbWFsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHN0cnVjdCBuc19fZWNob0RlY2ltYWwgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc2hvcnQgc29hcF9mbGFnX2lucHV0RGVjaW1hbCA9IDE7CisJaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoKnNvYXAtPnR5cGUgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkpCisJewlzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWEgPSAoc3RydWN0IG5zX19lY2hvRGVjaW1hbCAqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIGEsIFNPQVBfVFlQRV9uc19fZWNob0RlY2ltYWwsIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9EZWNpbWFsKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJaWYgKCFhKQorCQlyZXR1cm4gTlVMTDsKKwlzb2FwX2RlZmF1bHRfbnNfX2VjaG9EZWNpbWFsKHNvYXAsIGEpOworCWlmIChzb2FwLT5ib2R5ICYmICEqc29hcC0+aHJlZikKKwl7CisJCWZvciAoOzspCisJCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RBR19NSVNNQVRDSDsKKwkJCWlmIChzb2FwX2ZsYWdfaW5wdXREZWNpbWFsICYmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCB8fCBzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykpCisJCQkJaWYgKHNvYXBfaW5feHNkX19kZWNpbWFsKHNvYXAsICJpbnB1dERlY2ltYWwiLCAmYS0+aW5wdXREZWNpbWFsLCAieHNkOmRlY2ltYWwiKSkKKwkJCQl7CXNvYXBfZmxhZ19pbnB1dERlY2ltYWwtLTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCXNvYXAtPmVycm9yID0gc29hcF9pZ25vcmVfZWxlbWVudChzb2FwKTsKKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykKKwkJCQlicmVhazsKKwkJCWlmIChzb2FwLT5lcnJvcikKKwkJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCWVsc2UKKwl7CWEgPSAoc3RydWN0IG5zX19lY2hvRGVjaW1hbCAqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCAodm9pZCoqKWEsIDAsIFNPQVBfVFlQRV9uc19fZWNob0RlY2ltYWwsIDAsIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9EZWNpbWFsKSwgMCwgTlVMTCk7CisJCWlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gYTsKK30KKworU09BUF9GTUFDNSBzdHJ1Y3QgbnNfX2VjaG9EZWNpbWFsICogU09BUF9GTUFDNiBzb2FwX25ld19uc19fZWNob0RlY2ltYWwoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuKQorewlyZXR1cm4gc29hcF9pbnN0YW50aWF0ZV9uc19fZWNob0RlY2ltYWwoc29hcCwgbiwgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX25zX19lY2hvRGVjaW1hbChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvRGVjaW1hbCAqcCkKK3sJc29hcF9kZWxldGUoc29hcCwgcCk7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvRGVjaW1hbCAqIFNPQVBfRk1BQzQgc29hcF9pbnN0YW50aWF0ZV9uc19fZWNob0RlY2ltYWwoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICphcnJheVR5cGUsIHNpemVfdCAqc2l6ZSkKK3sKKwlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgInNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG9EZWNpbWFsKCVkLCAlcywgJXMpXG4iLCBuLCB0eXBlP3R5cGU6IiIsIGFycmF5VHlwZT9hcnJheVR5cGU6IiIpKTsKKwlzdHJ1Y3Qgc29hcF9jbGlzdCAqY3AgPSBzb2FwX2xpbmsoc29hcCwgTlVMTCwgU09BUF9UWVBFX25zX19lY2hvRGVjaW1hbCwgbiwgc29hcF9mZGVsZXRlKTsKKwlpZiAoIWNwKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAobiA8IDApCisJewljcC0+cHRyID0gKHZvaWQqKW5ldyBzdHJ1Y3QgbnNfX2VjaG9EZWNpbWFsOworCQlpZiAoc2l6ZSkKKwkJCSpzaXplID0gc2l6ZW9mKHN0cnVjdCBuc19fZWNob0RlY2ltYWwpOworCX0KKwllbHNlCisJewljcC0+cHRyID0gKHZvaWQqKW5ldyBzdHJ1Y3QgbnNfX2VjaG9EZWNpbWFsW25dOworCQlpZiAoc2l6ZSkKKwkJCSpzaXplID0gbiAqIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9EZWNpbWFsKTsKKwl9CisJCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5zdGFudGlhdGVkIGxvY2F0aW9uPSVwXG4iLCBjcC0+cHRyKSk7CisJcmV0dXJuIChzdHJ1Y3QgbnNfX2VjaG9EZWNpbWFsKiljcC0+cHRyOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2NvcHlfbnNfX2VjaG9EZWNpbWFsKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3QsIGludCB0dCwgdm9pZCAqcCwgc2l6ZV90IGxlbiwgY29uc3Qgdm9pZCAqcSwgc2l6ZV90IG4pCit7CisJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5aW5nIHN0cnVjdCBuc19fZWNob0RlY2ltYWwgJXAgLT4gJXBcbiIsIHEsIHApKTsKKwkqKHN0cnVjdCBuc19fZWNob0RlY2ltYWwqKXAgPSAqKHN0cnVjdCBuc19fZWNob0RlY2ltYWwqKXE7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX25zX19lY2hvRGVjaW1hbFJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG9EZWNpbWFsUmVzcG9uc2UgKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisJc29hcF9zZXJpYWxpemVfeHNkX19kZWNpbWFsKHNvYXAsICZhLT5fcmV0dXJuKTsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X25zX19lY2hvRGVjaW1hbFJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2VjaG9EZWNpbWFsUmVzcG9uc2UgKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisJc29hcF9kZWZhdWx0X3hzZF9fZGVjaW1hbChzb2FwLCAmYS0+X3JldHVybik7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfbnNfX2VjaG9EZWNpbWFsUmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBuc19fZWNob0RlY2ltYWxSZXNwb25zZSAqYSwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCXJlZ2lzdGVyIGludCBpZCA9IHNvYXBfZW1iZWQoc29hcCwgKHZvaWQqKWEsIE5VTEwsIDAsIHRhZywgU09BUF9UWVBFX25zX19lY2hvRGVjaW1hbFJlc3BvbnNlKTsKKwlpZiAoc29hcF9vdXRfbnNfX2VjaG9EZWNpbWFsUmVzcG9uc2Uoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9uc19fZWNob0RlY2ltYWxSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHN0cnVjdCBuc19fZWNob0RlY2ltYWxSZXNwb25zZSAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgYSwgU09BUF9UWVBFX25zX19lY2hvRGVjaW1hbFJlc3BvbnNlKSwgdHlwZSk7CisJaWYgKGEtPl9yZXR1cm4pCisJCXNvYXBfZWxlbWVudF9yZXN1bHQoc29hcCwgInJldHVybiIpOworCXNvYXBfb3V0X3hzZF9fZGVjaW1hbChzb2FwLCAicmV0dXJuIiwgLTEsICZhLT5fcmV0dXJuLCAiIik7CisJc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKKwlyZXR1cm4gU09BUF9PSzsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9EZWNpbWFsUmVzcG9uc2UgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X25zX19lY2hvRGVjaW1hbFJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2VjaG9EZWNpbWFsUmVzcG9uc2UgKnAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoKHAgPSBzb2FwX2luX25zX19lY2hvRGVjaW1hbFJlc3BvbnNlKHNvYXAsIHRhZywgcCwgdHlwZSkpKQorCQlzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOworCXJldHVybiBwOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob0RlY2ltYWxSZXNwb25zZSAqIFNPQVBfRk1BQzQgc29hcF9pbl9uc19fZWNob0RlY2ltYWxSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzdHJ1Y3QgbnNfX2VjaG9EZWNpbWFsUmVzcG9uc2UgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc2hvcnQgc29hcF9mbGFnX19yZXR1cm4gPSAxOworCWlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCpzb2FwLT50eXBlICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpKQorCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisJCXJldHVybiBOVUxMOworCX0KKwlhID0gKHN0cnVjdCBuc19fZWNob0RlY2ltYWxSZXNwb25zZSAqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIGEsIFNPQVBfVFlQRV9uc19fZWNob0RlY2ltYWxSZXNwb25zZSwgc2l6ZW9mKHN0cnVjdCBuc19fZWNob0RlY2ltYWxSZXNwb25zZSksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworCWlmICghYSkKKwkJcmV0dXJuIE5VTEw7CisJc29hcF9kZWZhdWx0X25zX19lY2hvRGVjaW1hbFJlc3BvbnNlKHNvYXAsIGEpOworCWlmIChzb2FwLT5ib2R5ICYmICEqc29hcC0+aHJlZikKKwl7CisJCWZvciAoOzspCisJCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RBR19NSVNNQVRDSDsKKwkJCWlmIChzb2FwX2ZsYWdfX3JldHVybiAmJiAoc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0ggfHwgc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcpKQorCQkJCWlmIChzb2FwX2luX3hzZF9fZGVjaW1hbChzb2FwLCBOVUxMLCAmYS0+X3JldHVybiwgInhzZDpkZWNpbWFsIikpCisJCQkJewlzb2FwX2ZsYWdfX3JldHVybi0tOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQlpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJc29hcC0+ZXJyb3IgPSBzb2FwX2lnbm9yZV9lbGVtZW50KHNvYXApOworCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfTk9fVEFHKQorCQkJCWJyZWFrOworCQkJaWYgKHNvYXAtPmVycm9yKQorCQkJCXJldHVybiBOVUxMOworCQl9CisJCWlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgKHNvYXBfZmxhZ19fcmV0dXJuID4gMCkpCisJCXsJc29hcC0+ZXJyb3IgPSBTT0FQX09DQ1VSUzsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWlmIChzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJZWxzZQorCXsJYSA9IChzdHJ1Y3QgbnNfX2VjaG9EZWNpbWFsUmVzcG9uc2UgKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilhLCAwLCBTT0FQX1RZUEVfbnNfX2VjaG9EZWNpbWFsUmVzcG9uc2UsIDAsIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9EZWNpbWFsUmVzcG9uc2UpLCAwLCBOVUxMKTsKKwkJaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBhOworfQorCitTT0FQX0ZNQUM1IHN0cnVjdCBuc19fZWNob0RlY2ltYWxSZXNwb25zZSAqIFNPQVBfRk1BQzYgc29hcF9uZXdfbnNfX2VjaG9EZWNpbWFsUmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuKQorewlyZXR1cm4gc29hcF9pbnN0YW50aWF0ZV9uc19fZWNob0RlY2ltYWxSZXNwb25zZShzb2FwLCBuLCBOVUxMLCBOVUxMLCBOVUxMKTsKK30KKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfbnNfX2VjaG9EZWNpbWFsUmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob0RlY2ltYWxSZXNwb25zZSAqcCkKK3sJc29hcF9kZWxldGUoc29hcCwgcCk7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvRGVjaW1hbFJlc3BvbnNlICogU09BUF9GTUFDNCBzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvRGVjaW1hbFJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbiwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqYXJyYXlUeXBlLCBzaXplX3QgKnNpemUpCit7CisJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvRGVjaW1hbFJlc3BvbnNlKCVkLCAlcywgJXMpXG4iLCBuLCB0eXBlP3R5cGU6IiIsIGFycmF5VHlwZT9hcnJheVR5cGU6IiIpKTsKKwlzdHJ1Y3Qgc29hcF9jbGlzdCAqY3AgPSBzb2FwX2xpbmsoc29hcCwgTlVMTCwgU09BUF9UWVBFX25zX19lY2hvRGVjaW1hbFJlc3BvbnNlLCBuLCBzb2FwX2ZkZWxldGUpOworCWlmICghY3ApCisJCXJldHVybiBOVUxMOworCWlmIChuIDwgMCkKKwl7CWNwLT5wdHIgPSAodm9pZCopbmV3IHN0cnVjdCBuc19fZWNob0RlY2ltYWxSZXNwb25zZTsKKwkJaWYgKHNpemUpCisJCQkqc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9EZWNpbWFsUmVzcG9uc2UpOworCX0KKwllbHNlCisJewljcC0+cHRyID0gKHZvaWQqKW5ldyBzdHJ1Y3QgbnNfX2VjaG9EZWNpbWFsUmVzcG9uc2Vbbl07CisJCWlmIChzaXplKQorCQkJKnNpemUgPSBuICogc2l6ZW9mKHN0cnVjdCBuc19fZWNob0RlY2ltYWxSZXNwb25zZSk7CisJfQorCQlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluc3RhbnRpYXRlZCBsb2NhdGlvbj0lcFxuIiwgY3AtPnB0cikpOworCXJldHVybiAoc3RydWN0IG5zX19lY2hvRGVjaW1hbFJlc3BvbnNlKiljcC0+cHRyOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2NvcHlfbnNfX2VjaG9EZWNpbWFsUmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdCwgaW50IHR0LCB2b2lkICpwLCBzaXplX3QgbGVuLCBjb25zdCB2b2lkICpxLCBzaXplX3QgbikKK3sKKwlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHlpbmcgc3RydWN0IG5zX19lY2hvRGVjaW1hbFJlc3BvbnNlICVwIC0+ICVwXG4iLCBxLCBwKSk7CisJKihzdHJ1Y3QgbnNfX2VjaG9EZWNpbWFsUmVzcG9uc2UqKXAgPSAqKHN0cnVjdCBuc19fZWNob0RlY2ltYWxSZXNwb25zZSopcTsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfbnNfX2VjaG9IZXhCaW5hcnkoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBuc19fZWNob0hleEJpbmFyeSAqYSkKK3sKKwkodm9pZClzb2FwOyAodm9pZClhOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8KKwlzb2FwX3NlcmlhbGl6ZV94c2RfX2hleEJpbmFyeShzb2FwLCAmYS0+aW5wdXRIZXhCaW5hcnkpOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfbnNfX2VjaG9IZXhCaW5hcnkoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob0hleEJpbmFyeSAqYSkKK3sKKwkodm9pZClzb2FwOyAodm9pZClhOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8KKwlzb2FwX2RlZmF1bHRfeHNkX19oZXhCaW5hcnkoc29hcCwgJmEtPmlucHV0SGV4QmluYXJ5KTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9uc19fZWNob0hleEJpbmFyeShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IG5zX19lY2hvSGV4QmluYXJ5ICphLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmVnaXN0ZXIgaW50IGlkID0gc29hcF9lbWJlZChzb2FwLCAodm9pZCopYSwgTlVMTCwgMCwgdGFnLCBTT0FQX1RZUEVfbnNfX2VjaG9IZXhCaW5hcnkpOworCWlmIChzb2FwX291dF9uc19fZWNob0hleEJpbmFyeShzb2FwLCB0YWcsIGlkLCBhLCB0eXBlKSkKKwkJcmV0dXJuIHNvYXAtPmVycm9yOworCXJldHVybiBzb2FwX3B1dGluZGVwZW5kZW50KHNvYXApOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X25zX19lY2hvSGV4QmluYXJ5KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgc3RydWN0IG5zX19lY2hvSGV4QmluYXJ5ICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBhLCBTT0FQX1RZUEVfbnNfX2VjaG9IZXhCaW5hcnkpLCB0eXBlKTsKKwlzb2FwX291dF94c2RfX2hleEJpbmFyeShzb2FwLCAiaW5wdXRIZXhCaW5hcnkiLCAtMSwgJmEtPmlucHV0SGV4QmluYXJ5LCAiIik7CisJc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKKwlyZXR1cm4gU09BUF9PSzsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9IZXhCaW5hcnkgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X25zX19lY2hvSGV4QmluYXJ5KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2VjaG9IZXhCaW5hcnkgKnAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoKHAgPSBzb2FwX2luX25zX19lY2hvSGV4QmluYXJ5KHNvYXAsIHRhZywgcCwgdHlwZSkpKQorCQlzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOworCXJldHVybiBwOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob0hleEJpbmFyeSAqIFNPQVBfRk1BQzQgc29hcF9pbl9uc19fZWNob0hleEJpbmFyeShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzdHJ1Y3QgbnNfX2VjaG9IZXhCaW5hcnkgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc2hvcnQgc29hcF9mbGFnX2lucHV0SGV4QmluYXJ5ID0gMTsKKwlpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisJCXJldHVybiBOVUxMOworCWlmICgqc29hcC0+dHlwZSAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKSkKKwl7CXNvYXAtPmVycm9yID0gU09BUF9UWVBFOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYSA9IChzdHJ1Y3QgbnNfX2VjaG9IZXhCaW5hcnkgKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBhLCBTT0FQX1RZUEVfbnNfX2VjaG9IZXhCaW5hcnksIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9IZXhCaW5hcnkpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwlpZiAoIWEpCisJCXJldHVybiBOVUxMOworCXNvYXBfZGVmYXVsdF9uc19fZWNob0hleEJpbmFyeShzb2FwLCBhKTsKKwlpZiAoc29hcC0+Ym9keSAmJiAhKnNvYXAtPmhyZWYpCisJeworCQlmb3IgKDs7KQorCQl7CXNvYXAtPmVycm9yID0gU09BUF9UQUdfTUlTTUFUQ0g7CisJCQlpZiAoc29hcF9mbGFnX2lucHV0SGV4QmluYXJ5ICYmIHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCWlmIChzb2FwX2luX3hzZF9faGV4QmluYXJ5KHNvYXAsICJpbnB1dEhleEJpbmFyeSIsICZhLT5pbnB1dEhleEJpbmFyeSwgInhzZDpoZXhCaW5hcnkiKSkKKwkJCQl7CXNvYXBfZmxhZ19pbnB1dEhleEJpbmFyeS0tOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQlpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJc29hcC0+ZXJyb3IgPSBzb2FwX2lnbm9yZV9lbGVtZW50KHNvYXApOworCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfTk9fVEFHKQorCQkJCWJyZWFrOworCQkJaWYgKHNvYXAtPmVycm9yKQorCQkJCXJldHVybiBOVUxMOworCQl9CisJCWlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgKHNvYXBfZmxhZ19pbnB1dEhleEJpbmFyeSA+IDApKQorCQl7CXNvYXAtPmVycm9yID0gU09BUF9PQ0NVUlM7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCWVsc2UKKwl7CWEgPSAoc3RydWN0IG5zX19lY2hvSGV4QmluYXJ5ICopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopYSwgMCwgU09BUF9UWVBFX25zX19lY2hvSGV4QmluYXJ5LCAwLCBzaXplb2Yoc3RydWN0IG5zX19lY2hvSGV4QmluYXJ5KSwgMCwgTlVMTCk7CisJCWlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gYTsKK30KKworU09BUF9GTUFDNSBzdHJ1Y3QgbnNfX2VjaG9IZXhCaW5hcnkgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X25zX19lY2hvSGV4QmluYXJ5KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbikKK3sJcmV0dXJuIHNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG9IZXhCaW5hcnkoc29hcCwgbiwgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX25zX19lY2hvSGV4QmluYXJ5KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2VjaG9IZXhCaW5hcnkgKnApCit7CXNvYXBfZGVsZXRlKHNvYXAsIHApOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob0hleEJpbmFyeSAqIFNPQVBfRk1BQzQgc29hcF9pbnN0YW50aWF0ZV9uc19fZWNob0hleEJpbmFyeShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4sIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmFycmF5VHlwZSwgc2l6ZV90ICpzaXplKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAic29hcF9pbnN0YW50aWF0ZV9uc19fZWNob0hleEJpbmFyeSglZCwgJXMsICVzKVxuIiwgbiwgdHlwZT90eXBlOiIiLCBhcnJheVR5cGU/YXJyYXlUeXBlOiIiKSk7CisJc3RydWN0IHNvYXBfY2xpc3QgKmNwID0gc29hcF9saW5rKHNvYXAsIE5VTEwsIFNPQVBfVFlQRV9uc19fZWNob0hleEJpbmFyeSwgbiwgc29hcF9mZGVsZXRlKTsKKwlpZiAoIWNwKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAobiA8IDApCisJewljcC0+cHRyID0gKHZvaWQqKW5ldyBzdHJ1Y3QgbnNfX2VjaG9IZXhCaW5hcnk7CisJCWlmIChzaXplKQorCQkJKnNpemUgPSBzaXplb2Yoc3RydWN0IG5zX19lY2hvSGV4QmluYXJ5KTsKKwl9CisJZWxzZQorCXsJY3AtPnB0ciA9ICh2b2lkKiluZXcgc3RydWN0IG5zX19lY2hvSGV4QmluYXJ5W25dOworCQlpZiAoc2l6ZSkKKwkJCSpzaXplID0gbiAqIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9IZXhCaW5hcnkpOworCX0KKwkJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbnN0YW50aWF0ZWQgbG9jYXRpb249JXBcbiIsIGNwLT5wdHIpKTsKKwlyZXR1cm4gKHN0cnVjdCBuc19fZWNob0hleEJpbmFyeSopY3AtPnB0cjsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9jb3B5X25zX19lY2hvSGV4QmluYXJ5KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3QsIGludCB0dCwgdm9pZCAqcCwgc2l6ZV90IGxlbiwgY29uc3Qgdm9pZCAqcSwgc2l6ZV90IG4pCit7CisJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5aW5nIHN0cnVjdCBuc19fZWNob0hleEJpbmFyeSAlcCAtPiAlcFxuIiwgcSwgcCkpOworCSooc3RydWN0IG5zX19lY2hvSGV4QmluYXJ5KilwID0gKihzdHJ1Y3QgbnNfX2VjaG9IZXhCaW5hcnkqKXE7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX25zX19lY2hvSGV4QmluYXJ5UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBuc19fZWNob0hleEJpbmFyeVJlc3BvbnNlICphKQoreworCSh2b2lkKXNvYXA7ICh2b2lkKWE7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLworCXNvYXBfc2VyaWFsaXplX3hzZF9faGV4QmluYXJ5KHNvYXAsICZhLT5fcmV0dXJuKTsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X25zX19lY2hvSGV4QmluYXJ5UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob0hleEJpbmFyeVJlc3BvbnNlICphKQoreworCSh2b2lkKXNvYXA7ICh2b2lkKWE7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLworCXNvYXBfZGVmYXVsdF94c2RfX2hleEJpbmFyeShzb2FwLCAmYS0+X3JldHVybik7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfbnNfX2VjaG9IZXhCaW5hcnlSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IG5zX19lY2hvSGV4QmluYXJ5UmVzcG9uc2UgKmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZWdpc3RlciBpbnQgaWQgPSBzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCBOVUxMLCAwLCB0YWcsIFNPQVBfVFlQRV9uc19fZWNob0hleEJpbmFyeVJlc3BvbnNlKTsKKwlpZiAoc29hcF9vdXRfbnNfX2VjaG9IZXhCaW5hcnlSZXNwb25zZShzb2FwLCB0YWcsIGlkLCBhLCB0eXBlKSkKKwkJcmV0dXJuIHNvYXAtPmVycm9yOworCXJldHVybiBzb2FwX3B1dGluZGVwZW5kZW50KHNvYXApOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X25zX19lY2hvSGV4QmluYXJ5UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG9IZXhCaW5hcnlSZXNwb25zZSAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgYSwgU09BUF9UWVBFX25zX19lY2hvSGV4QmluYXJ5UmVzcG9uc2UpLCB0eXBlKTsKKwlzb2FwX2VsZW1lbnRfcmVzdWx0KHNvYXAsICJyZXR1cm4iKTsKKwlzb2FwX291dF94c2RfX2hleEJpbmFyeShzb2FwLCAicmV0dXJuIiwgLTEsICZhLT5fcmV0dXJuLCAiIik7CisJc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKKwlyZXR1cm4gU09BUF9PSzsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9IZXhCaW5hcnlSZXNwb25zZSAqIFNPQVBfRk1BQzQgc29hcF9nZXRfbnNfX2VjaG9IZXhCaW5hcnlSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvSGV4QmluYXJ5UmVzcG9uc2UgKnAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoKHAgPSBzb2FwX2luX25zX19lY2hvSGV4QmluYXJ5UmVzcG9uc2Uoc29hcCwgdGFnLCBwLCB0eXBlKSkpCisJCXNvYXBfZ2V0aW5kZXBlbmRlbnQoc29hcCk7CisJcmV0dXJuIHA7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvSGV4QmluYXJ5UmVzcG9uc2UgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fbnNfX2VjaG9IZXhCaW5hcnlSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzdHJ1Y3QgbnNfX2VjaG9IZXhCaW5hcnlSZXNwb25zZSAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlzaG9ydCBzb2FwX2ZsYWdfX3JldHVybiA9IDE7CisJaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoKnNvYXAtPnR5cGUgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkpCisJewlzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWEgPSAoc3RydWN0IG5zX19lY2hvSGV4QmluYXJ5UmVzcG9uc2UgKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBhLCBTT0FQX1RZUEVfbnNfX2VjaG9IZXhCaW5hcnlSZXNwb25zZSwgc2l6ZW9mKHN0cnVjdCBuc19fZWNob0hleEJpbmFyeVJlc3BvbnNlKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJaWYgKCFhKQorCQlyZXR1cm4gTlVMTDsKKwlzb2FwX2RlZmF1bHRfbnNfX2VjaG9IZXhCaW5hcnlSZXNwb25zZShzb2FwLCBhKTsKKwlpZiAoc29hcC0+Ym9keSAmJiAhKnNvYXAtPmhyZWYpCisJeworCQlmb3IgKDs7KQorCQl7CXNvYXAtPmVycm9yID0gU09BUF9UQUdfTUlTTUFUQ0g7CisJCQlpZiAoc29hcF9mbGFnX19yZXR1cm4gJiYgc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJaWYgKHNvYXBfaW5feHNkX19oZXhCaW5hcnkoc29hcCwgTlVMTCwgJmEtPl9yZXR1cm4sICJ4c2Q6aGV4QmluYXJ5IikpCisJCQkJewlzb2FwX2ZsYWdfX3JldHVybi0tOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQlpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJc29hcC0+ZXJyb3IgPSBzb2FwX2lnbm9yZV9lbGVtZW50KHNvYXApOworCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfTk9fVEFHKQorCQkJCWJyZWFrOworCQkJaWYgKHNvYXAtPmVycm9yKQorCQkJCXJldHVybiBOVUxMOworCQl9CisJCWlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgKHNvYXBfZmxhZ19fcmV0dXJuID4gMCkpCisJCXsJc29hcC0+ZXJyb3IgPSBTT0FQX09DQ1VSUzsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWlmIChzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJZWxzZQorCXsJYSA9IChzdHJ1Y3QgbnNfX2VjaG9IZXhCaW5hcnlSZXNwb25zZSAqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCAodm9pZCoqKWEsIDAsIFNPQVBfVFlQRV9uc19fZWNob0hleEJpbmFyeVJlc3BvbnNlLCAwLCBzaXplb2Yoc3RydWN0IG5zX19lY2hvSGV4QmluYXJ5UmVzcG9uc2UpLCAwLCBOVUxMKTsKKwkJaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBhOworfQorCitTT0FQX0ZNQUM1IHN0cnVjdCBuc19fZWNob0hleEJpbmFyeVJlc3BvbnNlICogU09BUF9GTUFDNiBzb2FwX25ld19uc19fZWNob0hleEJpbmFyeVJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbikKK3sJcmV0dXJuIHNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG9IZXhCaW5hcnlSZXNwb25zZShzb2FwLCBuLCBOVUxMLCBOVUxMLCBOVUxMKTsKK30KKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfbnNfX2VjaG9IZXhCaW5hcnlSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvSGV4QmluYXJ5UmVzcG9uc2UgKnApCit7CXNvYXBfZGVsZXRlKHNvYXAsIHApOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob0hleEJpbmFyeVJlc3BvbnNlICogU09BUF9GTUFDNCBzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvSGV4QmluYXJ5UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICphcnJheVR5cGUsIHNpemVfdCAqc2l6ZSkKK3sKKwlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgInNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG9IZXhCaW5hcnlSZXNwb25zZSglZCwgJXMsICVzKVxuIiwgbiwgdHlwZT90eXBlOiIiLCBhcnJheVR5cGU/YXJyYXlUeXBlOiIiKSk7CisJc3RydWN0IHNvYXBfY2xpc3QgKmNwID0gc29hcF9saW5rKHNvYXAsIE5VTEwsIFNPQVBfVFlQRV9uc19fZWNob0hleEJpbmFyeVJlc3BvbnNlLCBuLCBzb2FwX2ZkZWxldGUpOworCWlmICghY3ApCisJCXJldHVybiBOVUxMOworCWlmIChuIDwgMCkKKwl7CWNwLT5wdHIgPSAodm9pZCopbmV3IHN0cnVjdCBuc19fZWNob0hleEJpbmFyeVJlc3BvbnNlOworCQlpZiAoc2l6ZSkKKwkJCSpzaXplID0gc2l6ZW9mKHN0cnVjdCBuc19fZWNob0hleEJpbmFyeVJlc3BvbnNlKTsKKwl9CisJZWxzZQorCXsJY3AtPnB0ciA9ICh2b2lkKiluZXcgc3RydWN0IG5zX19lY2hvSGV4QmluYXJ5UmVzcG9uc2Vbbl07CisJCWlmIChzaXplKQorCQkJKnNpemUgPSBuICogc2l6ZW9mKHN0cnVjdCBuc19fZWNob0hleEJpbmFyeVJlc3BvbnNlKTsKKwl9CisJCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5zdGFudGlhdGVkIGxvY2F0aW9uPSVwXG4iLCBjcC0+cHRyKSk7CisJcmV0dXJuIChzdHJ1Y3QgbnNfX2VjaG9IZXhCaW5hcnlSZXNwb25zZSopY3AtPnB0cjsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9jb3B5X25zX19lY2hvSGV4QmluYXJ5UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdCwgaW50IHR0LCB2b2lkICpwLCBzaXplX3QgbGVuLCBjb25zdCB2b2lkICpxLCBzaXplX3QgbikKK3sKKwlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHlpbmcgc3RydWN0IG5zX19lY2hvSGV4QmluYXJ5UmVzcG9uc2UgJXAgLT4gJXBcbiIsIHEsIHApKTsKKwkqKHN0cnVjdCBuc19fZWNob0hleEJpbmFyeVJlc3BvbnNlKilwID0gKihzdHJ1Y3QgbnNfX2VjaG9IZXhCaW5hcnlSZXNwb25zZSopcTsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfeHNkX19oZXhCaW5hcnkoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCB4c2RfX2hleEJpbmFyeSBjb25zdCphKQoreworCWlmIChhLT5fX3B0cikKKwkJc29hcF9hcnJheV9yZWZlcmVuY2Uoc29hcCwgYSwgKHN0cnVjdCBzb2FwX2FycmF5KikmYS0+X19wdHIsIDEsIFNPQVBfVFlQRV94c2RfX2hleEJpbmFyeSk7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF94c2RfX2hleEJpbmFyeShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHhzZF9faGV4QmluYXJ5ICphKQoreworCWEtPl9fc2l6ZSA9IDA7CisJYS0+X19wdHIgPSBOVUxMOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X3hzZF9faGV4QmluYXJ5KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3QgeHNkX19oZXhCaW5hcnkgKmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZWdpc3RlciBpbnQgaWQgPSBzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCAoc3RydWN0IHNvYXBfYXJyYXkqKSZhLT5fX3B0ciwgMSwgdGFnLCBTT0FQX1RZUEVfeHNkX19oZXhCaW5hcnkpOworCWlmIChzb2FwX291dF94c2RfX2hleEJpbmFyeShzb2FwLCB0YWcsIGlkLCBhLCB0eXBlKSkKKwkJcmV0dXJuIHNvYXAtPmVycm9yOworCXJldHVybiBzb2FwX3B1dGluZGVwZW5kZW50KHNvYXApOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3hzZF9faGV4QmluYXJ5KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgc3RydWN0IHhzZF9faGV4QmluYXJ5ICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlkID0gc29hcF9lbGVtZW50X2lkKHNvYXAsIHRhZywgaWQsIGEsIChzdHJ1Y3Qgc29hcF9hcnJheSopJmEtPl9fcHRyLCAxLCB0eXBlLCBTT0FQX1RZUEVfeHNkX19oZXhCaW5hcnkpOworCWlmIChpZCA8IDApCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgaWQsIHR5cGUpOworCXNvYXBfcHV0aGV4KHNvYXAsIGEtPl9fcHRyLCBhLT5fX3NpemUpOworCXNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7CisJcmV0dXJuIFNPQVBfT0s7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IHhzZF9faGV4QmluYXJ5ICogU09BUF9GTUFDNCBzb2FwX2dldF94c2RfX2hleEJpbmFyeShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHhzZF9faGV4QmluYXJ5ICpwLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKChwID0gc29hcF9pbl94c2RfX2hleEJpbmFyeShzb2FwLCB0YWcsIHAsIHR5cGUpKSkKKwkJc29hcF9nZXRpbmRlcGVuZGVudChzb2FwKTsKKwlyZXR1cm4gcDsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgeHNkX19oZXhCaW5hcnkgKiBTT0FQX0ZNQUM0IHNvYXBfaW5feHNkX19oZXhCaW5hcnkoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc3RydWN0IHhzZF9faGV4QmluYXJ5ICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAxKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCpzb2FwLT50eXBlICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6aGV4QmluYXJ5IikpCisJewlzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWEgPSAoc3RydWN0IHhzZF9faGV4QmluYXJ5ICopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgYSwgU09BUF9UWVBFX3hzZF9faGV4QmluYXJ5LCBzaXplb2Yoc3RydWN0IHhzZF9faGV4QmluYXJ5KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJaWYgKCFhKQorCQlyZXR1cm4gTlVMTDsKKwlzb2FwX2RlZmF1bHRfeHNkX19oZXhCaW5hcnkoc29hcCwgYSk7CisJaWYgKHNvYXAtPmJvZHkgJiYgISpzb2FwLT5ocmVmKQorCXsKKwkJYS0+X19wdHIgPSBzb2FwX2dldGhleChzb2FwLCAmYS0+X19zaXplKTsKKwkJaWYgKCghYS0+X19wdHIgJiYgc29hcC0+ZXJyb3IpIHx8IHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwllbHNlCisJewlhID0gKHN0cnVjdCB4c2RfX2hleEJpbmFyeSAqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCAodm9pZCoqKWEsIDAsIFNPQVBfVFlQRV94c2RfX2hleEJpbmFyeSwgMCwgc2l6ZW9mKHN0cnVjdCB4c2RfX2hleEJpbmFyeSksIDAsIE5VTEwpOworCQlpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGE7Cit9CisKK1NPQVBfRk1BQzUgc3RydWN0IHhzZF9faGV4QmluYXJ5ICogU09BUF9GTUFDNiBzb2FwX25ld194c2RfX2hleEJpbmFyeShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4pCit7CXJldHVybiBzb2FwX2luc3RhbnRpYXRlX3hzZF9faGV4QmluYXJ5KHNvYXAsIG4sIE5VTEwsIE5VTEwsIE5VTEwpOworfQorCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV94c2RfX2hleEJpbmFyeShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHhzZF9faGV4QmluYXJ5ICpwKQorewlzb2FwX2RlbGV0ZShzb2FwLCBwKTsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgeHNkX19oZXhCaW5hcnkgKiBTT0FQX0ZNQUM0IHNvYXBfaW5zdGFudGlhdGVfeHNkX19oZXhCaW5hcnkoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICphcnJheVR5cGUsIHNpemVfdCAqc2l6ZSkKK3sKKwlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgInNvYXBfaW5zdGFudGlhdGVfeHNkX19oZXhCaW5hcnkoJWQsICVzLCAlcylcbiIsIG4sIHR5cGU/dHlwZToiIiwgYXJyYXlUeXBlP2FycmF5VHlwZToiIikpOworCXN0cnVjdCBzb2FwX2NsaXN0ICpjcCA9IHNvYXBfbGluayhzb2FwLCBOVUxMLCBTT0FQX1RZUEVfeHNkX19oZXhCaW5hcnksIG4sIHNvYXBfZmRlbGV0ZSk7CisJaWYgKCFjcCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKG4gPCAwKQorCXsJY3AtPnB0ciA9ICh2b2lkKiluZXcgc3RydWN0IHhzZF9faGV4QmluYXJ5OworCQlpZiAoc2l6ZSkKKwkJCSpzaXplID0gc2l6ZW9mKHN0cnVjdCB4c2RfX2hleEJpbmFyeSk7CisJfQorCWVsc2UKKwl7CWNwLT5wdHIgPSAodm9pZCopbmV3IHN0cnVjdCB4c2RfX2hleEJpbmFyeVtuXTsKKwkJaWYgKHNpemUpCisJCQkqc2l6ZSA9IG4gKiBzaXplb2Yoc3RydWN0IHhzZF9faGV4QmluYXJ5KTsKKwl9CisJCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5zdGFudGlhdGVkIGxvY2F0aW9uPSVwXG4iLCBjcC0+cHRyKSk7CisJcmV0dXJuIChzdHJ1Y3QgeHNkX19oZXhCaW5hcnkqKWNwLT5wdHI7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfY29weV94c2RfX2hleEJpbmFyeShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0LCBpbnQgdHQsIHZvaWQgKnAsIHNpemVfdCBsZW4sIGNvbnN0IHZvaWQgKnEsIHNpemVfdCBuKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weWluZyBzdHJ1Y3QgeHNkX19oZXhCaW5hcnkgJXAgLT4gJXBcbiIsIHEsIHApKTsKKwkqKHN0cnVjdCB4c2RfX2hleEJpbmFyeSopcCA9ICooc3RydWN0IHhzZF9faGV4QmluYXJ5KilxOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9uc19fZWNob0RhdGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBuc19fZWNob0RhdGUgKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisJc29hcF9zZXJpYWxpemVfeHNkX19kYXRlVGltZShzb2FwLCAmYS0+aW5wdXREYXRlKTsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X25zX19lY2hvRGF0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvRGF0ZSAqYSkKK3sKKwkodm9pZClzb2FwOyAodm9pZClhOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8KKwlzb2FwX2RlZmF1bHRfeHNkX19kYXRlVGltZShzb2FwLCAmYS0+aW5wdXREYXRlKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9uc19fZWNob0RhdGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBuc19fZWNob0RhdGUgKmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZWdpc3RlciBpbnQgaWQgPSBzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCBOVUxMLCAwLCB0YWcsIFNPQVBfVFlQRV9uc19fZWNob0RhdGUpOworCWlmIChzb2FwX291dF9uc19fZWNob0RhdGUoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9uc19fZWNob0RhdGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG9EYXRlICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBhLCBTT0FQX1RZUEVfbnNfX2VjaG9EYXRlKSwgdHlwZSk7CisJc29hcF9vdXRfeHNkX19kYXRlVGltZShzb2FwLCAiaW5wdXREYXRlIiwgLTEsICZhLT5pbnB1dERhdGUsICIiKTsKKwlzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworCXJldHVybiBTT0FQX09LOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob0RhdGUgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X25zX19lY2hvRGF0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvRGF0ZSAqcCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmICgocCA9IHNvYXBfaW5fbnNfX2VjaG9EYXRlKHNvYXAsIHRhZywgcCwgdHlwZSkpKQorCQlzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOworCXJldHVybiBwOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob0RhdGUgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fbnNfX2VjaG9EYXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHN0cnVjdCBuc19fZWNob0RhdGUgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc2hvcnQgc29hcF9mbGFnX2lucHV0RGF0ZSA9IDE7CisJaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoKnNvYXAtPnR5cGUgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkpCisJewlzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWEgPSAoc3RydWN0IG5zX19lY2hvRGF0ZSAqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIGEsIFNPQVBfVFlQRV9uc19fZWNob0RhdGUsIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9EYXRlKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJaWYgKCFhKQorCQlyZXR1cm4gTlVMTDsKKwlzb2FwX2RlZmF1bHRfbnNfX2VjaG9EYXRlKHNvYXAsIGEpOworCWlmIChzb2FwLT5ib2R5ICYmICEqc29hcC0+aHJlZikKKwl7CisJCWZvciAoOzspCisJCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RBR19NSVNNQVRDSDsKKwkJCWlmIChzb2FwX2ZsYWdfaW5wdXREYXRlICYmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCB8fCBzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykpCisJCQkJaWYgKHNvYXBfaW5feHNkX19kYXRlVGltZShzb2FwLCAiaW5wdXREYXRlIiwgJmEtPmlucHV0RGF0ZSwgInhzZDpkYXRlVGltZSIpKQorCQkJCXsJc29hcF9mbGFnX2lucHV0RGF0ZS0tOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQlpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJc29hcC0+ZXJyb3IgPSBzb2FwX2lnbm9yZV9lbGVtZW50KHNvYXApOworCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfTk9fVEFHKQorCQkJCWJyZWFrOworCQkJaWYgKHNvYXAtPmVycm9yKQorCQkJCXJldHVybiBOVUxMOworCQl9CisJCWlmIChzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJZWxzZQorCXsJYSA9IChzdHJ1Y3QgbnNfX2VjaG9EYXRlICopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopYSwgMCwgU09BUF9UWVBFX25zX19lY2hvRGF0ZSwgMCwgc2l6ZW9mKHN0cnVjdCBuc19fZWNob0RhdGUpLCAwLCBOVUxMKTsKKwkJaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBhOworfQorCitTT0FQX0ZNQUM1IHN0cnVjdCBuc19fZWNob0RhdGUgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X25zX19lY2hvRGF0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4pCit7CXJldHVybiBzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvRGF0ZShzb2FwLCBuLCBOVUxMLCBOVUxMLCBOVUxMKTsKK30KKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfbnNfX2VjaG9EYXRlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2VjaG9EYXRlICpwKQorewlzb2FwX2RlbGV0ZShzb2FwLCBwKTsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9EYXRlICogU09BUF9GTUFDNCBzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvRGF0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4sIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmFycmF5VHlwZSwgc2l6ZV90ICpzaXplKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAic29hcF9pbnN0YW50aWF0ZV9uc19fZWNob0RhdGUoJWQsICVzLCAlcylcbiIsIG4sIHR5cGU/dHlwZToiIiwgYXJyYXlUeXBlP2FycmF5VHlwZToiIikpOworCXN0cnVjdCBzb2FwX2NsaXN0ICpjcCA9IHNvYXBfbGluayhzb2FwLCBOVUxMLCBTT0FQX1RZUEVfbnNfX2VjaG9EYXRlLCBuLCBzb2FwX2ZkZWxldGUpOworCWlmICghY3ApCisJCXJldHVybiBOVUxMOworCWlmIChuIDwgMCkKKwl7CWNwLT5wdHIgPSAodm9pZCopbmV3IHN0cnVjdCBuc19fZWNob0RhdGU7CisJCWlmIChzaXplKQorCQkJKnNpemUgPSBzaXplb2Yoc3RydWN0IG5zX19lY2hvRGF0ZSk7CisJfQorCWVsc2UKKwl7CWNwLT5wdHIgPSAodm9pZCopbmV3IHN0cnVjdCBuc19fZWNob0RhdGVbbl07CisJCWlmIChzaXplKQorCQkJKnNpemUgPSBuICogc2l6ZW9mKHN0cnVjdCBuc19fZWNob0RhdGUpOworCX0KKwkJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbnN0YW50aWF0ZWQgbG9jYXRpb249JXBcbiIsIGNwLT5wdHIpKTsKKwlyZXR1cm4gKHN0cnVjdCBuc19fZWNob0RhdGUqKWNwLT5wdHI7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfY29weV9uc19fZWNob0RhdGUoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdCwgaW50IHR0LCB2b2lkICpwLCBzaXplX3QgbGVuLCBjb25zdCB2b2lkICpxLCBzaXplX3QgbikKK3sKKwlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHlpbmcgc3RydWN0IG5zX19lY2hvRGF0ZSAlcCAtPiAlcFxuIiwgcSwgcCkpOworCSooc3RydWN0IG5zX19lY2hvRGF0ZSopcCA9ICooc3RydWN0IG5zX19lY2hvRGF0ZSopcTsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfbnNfX2VjaG9EYXRlUmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBuc19fZWNob0RhdGVSZXNwb25zZSAqYSkKK3sKKwkodm9pZClzb2FwOyAodm9pZClhOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8KKwlzb2FwX3NlcmlhbGl6ZV94c2RfX2RhdGVUaW1lKHNvYXAsICZhLT5fcmV0dXJuKTsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X25zX19lY2hvRGF0ZVJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2VjaG9EYXRlUmVzcG9uc2UgKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisJc29hcF9kZWZhdWx0X3hzZF9fZGF0ZVRpbWUoc29hcCwgJmEtPl9yZXR1cm4pOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X25zX19lY2hvRGF0ZVJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG9EYXRlUmVzcG9uc2UgKmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZWdpc3RlciBpbnQgaWQgPSBzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCBOVUxMLCAwLCB0YWcsIFNPQVBfVFlQRV9uc19fZWNob0RhdGVSZXNwb25zZSk7CisJaWYgKHNvYXBfb3V0X25zX19lY2hvRGF0ZVJlc3BvbnNlKHNvYXAsIHRhZywgaWQsIGEsIHR5cGUpKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJcmV0dXJuIHNvYXBfcHV0aW5kZXBlbmRlbnQoc29hcCk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfbnNfX2VjaG9EYXRlUmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG9EYXRlUmVzcG9uc2UgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIGEsIFNPQVBfVFlQRV9uc19fZWNob0RhdGVSZXNwb25zZSksIHR5cGUpOworCWlmIChhLT5fcmV0dXJuKQorCQlzb2FwX2VsZW1lbnRfcmVzdWx0KHNvYXAsICJyZXR1cm4iKTsKKwlzb2FwX291dF94c2RfX2RhdGVUaW1lKHNvYXAsICJyZXR1cm4iLCAtMSwgJmEtPl9yZXR1cm4sICIiKTsKKwlzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworCXJldHVybiBTT0FQX09LOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob0RhdGVSZXNwb25zZSAqIFNPQVBfRk1BQzQgc29hcF9nZXRfbnNfX2VjaG9EYXRlUmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob0RhdGVSZXNwb25zZSAqcCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmICgocCA9IHNvYXBfaW5fbnNfX2VjaG9EYXRlUmVzcG9uc2Uoc29hcCwgdGFnLCBwLCB0eXBlKSkpCisJCXNvYXBfZ2V0aW5kZXBlbmRlbnQoc29hcCk7CisJcmV0dXJuIHA7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvRGF0ZVJlc3BvbnNlICogU09BUF9GTUFDNCBzb2FwX2luX25zX19lY2hvRGF0ZVJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHN0cnVjdCBuc19fZWNob0RhdGVSZXNwb25zZSAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlzaG9ydCBzb2FwX2ZsYWdfX3JldHVybiA9IDE7CisJaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoKnNvYXAtPnR5cGUgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkpCisJewlzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWEgPSAoc3RydWN0IG5zX19lY2hvRGF0ZVJlc3BvbnNlICopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgYSwgU09BUF9UWVBFX25zX19lY2hvRGF0ZVJlc3BvbnNlLCBzaXplb2Yoc3RydWN0IG5zX19lY2hvRGF0ZVJlc3BvbnNlKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJaWYgKCFhKQorCQlyZXR1cm4gTlVMTDsKKwlzb2FwX2RlZmF1bHRfbnNfX2VjaG9EYXRlUmVzcG9uc2Uoc29hcCwgYSk7CisJaWYgKHNvYXAtPmJvZHkgJiYgISpzb2FwLT5ocmVmKQorCXsKKwkJZm9yICg7OykKKwkJewlzb2FwLT5lcnJvciA9IFNPQVBfVEFHX01JU01BVENIOworCQkJaWYgKHNvYXBfZmxhZ19fcmV0dXJuICYmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCB8fCBzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykpCisJCQkJaWYgKHNvYXBfaW5feHNkX19kYXRlVGltZShzb2FwLCBOVUxMLCAmYS0+X3JldHVybiwgInhzZDpkYXRlVGltZSIpKQorCQkJCXsJc29hcF9mbGFnX19yZXR1cm4tLTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCXNvYXAtPmVycm9yID0gc29hcF9pZ25vcmVfZWxlbWVudChzb2FwKTsKKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykKKwkJCQlicmVhazsKKwkJCWlmIChzb2FwLT5lcnJvcikKKwkJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIChzb2FwX2ZsYWdfX3JldHVybiA+IDApKQorCQl7CXNvYXAtPmVycm9yID0gU09BUF9PQ0NVUlM7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCWVsc2UKKwl7CWEgPSAoc3RydWN0IG5zX19lY2hvRGF0ZVJlc3BvbnNlICopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopYSwgMCwgU09BUF9UWVBFX25zX19lY2hvRGF0ZVJlc3BvbnNlLCAwLCBzaXplb2Yoc3RydWN0IG5zX19lY2hvRGF0ZVJlc3BvbnNlKSwgMCwgTlVMTCk7CisJCWlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gYTsKK30KKworU09BUF9GTUFDNSBzdHJ1Y3QgbnNfX2VjaG9EYXRlUmVzcG9uc2UgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X25zX19lY2hvRGF0ZVJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbikKK3sJcmV0dXJuIHNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG9EYXRlUmVzcG9uc2Uoc29hcCwgbiwgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX25zX19lY2hvRGF0ZVJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2VjaG9EYXRlUmVzcG9uc2UgKnApCit7CXNvYXBfZGVsZXRlKHNvYXAsIHApOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob0RhdGVSZXNwb25zZSAqIFNPQVBfRk1BQzQgc29hcF9pbnN0YW50aWF0ZV9uc19fZWNob0RhdGVSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4sIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmFycmF5VHlwZSwgc2l6ZV90ICpzaXplKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAic29hcF9pbnN0YW50aWF0ZV9uc19fZWNob0RhdGVSZXNwb25zZSglZCwgJXMsICVzKVxuIiwgbiwgdHlwZT90eXBlOiIiLCBhcnJheVR5cGU/YXJyYXlUeXBlOiIiKSk7CisJc3RydWN0IHNvYXBfY2xpc3QgKmNwID0gc29hcF9saW5rKHNvYXAsIE5VTEwsIFNPQVBfVFlQRV9uc19fZWNob0RhdGVSZXNwb25zZSwgbiwgc29hcF9mZGVsZXRlKTsKKwlpZiAoIWNwKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAobiA8IDApCisJewljcC0+cHRyID0gKHZvaWQqKW5ldyBzdHJ1Y3QgbnNfX2VjaG9EYXRlUmVzcG9uc2U7CisJCWlmIChzaXplKQorCQkJKnNpemUgPSBzaXplb2Yoc3RydWN0IG5zX19lY2hvRGF0ZVJlc3BvbnNlKTsKKwl9CisJZWxzZQorCXsJY3AtPnB0ciA9ICh2b2lkKiluZXcgc3RydWN0IG5zX19lY2hvRGF0ZVJlc3BvbnNlW25dOworCQlpZiAoc2l6ZSkKKwkJCSpzaXplID0gbiAqIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9EYXRlUmVzcG9uc2UpOworCX0KKwkJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbnN0YW50aWF0ZWQgbG9jYXRpb249JXBcbiIsIGNwLT5wdHIpKTsKKwlyZXR1cm4gKHN0cnVjdCBuc19fZWNob0RhdGVSZXNwb25zZSopY3AtPnB0cjsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9jb3B5X25zX19lY2hvRGF0ZVJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3QsIGludCB0dCwgdm9pZCAqcCwgc2l6ZV90IGxlbiwgY29uc3Qgdm9pZCAqcSwgc2l6ZV90IG4pCit7CisJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5aW5nIHN0cnVjdCBuc19fZWNob0RhdGVSZXNwb25zZSAlcCAtPiAlcFxuIiwgcSwgcCkpOworCSooc3RydWN0IG5zX19lY2hvRGF0ZVJlc3BvbnNlKilwID0gKihzdHJ1Y3QgbnNfX2VjaG9EYXRlUmVzcG9uc2UqKXE7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX25zX19lY2hvQmFzZTY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG9CYXNlNjQgKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisJc29hcF9zZXJpYWxpemVfeHNkX19iYXNlNjRCaW5hcnkoc29hcCwgJmEtPmlucHV0QmFzZTY0KTsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X25zX19lY2hvQmFzZTY0KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2VjaG9CYXNlNjQgKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisJc29hcF9kZWZhdWx0X3hzZF9fYmFzZTY0QmluYXJ5KHNvYXAsICZhLT5pbnB1dEJhc2U2NCk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfbnNfX2VjaG9CYXNlNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBuc19fZWNob0Jhc2U2NCAqYSwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCXJlZ2lzdGVyIGludCBpZCA9IHNvYXBfZW1iZWQoc29hcCwgKHZvaWQqKWEsIE5VTEwsIDAsIHRhZywgU09BUF9UWVBFX25zX19lY2hvQmFzZTY0KTsKKwlpZiAoc29hcF9vdXRfbnNfX2VjaG9CYXNlNjQoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9uc19fZWNob0Jhc2U2NChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHN0cnVjdCBuc19fZWNob0Jhc2U2NCAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgYSwgU09BUF9UWVBFX25zX19lY2hvQmFzZTY0KSwgdHlwZSk7CisJc29hcF9vdXRfeHNkX19iYXNlNjRCaW5hcnkoc29hcCwgImlucHV0QmFzZTY0IiwgLTEsICZhLT5pbnB1dEJhc2U2NCwgIiIpOworCXNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7CisJcmV0dXJuIFNPQVBfT0s7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvQmFzZTY0ICogU09BUF9GTUFDNCBzb2FwX2dldF9uc19fZWNob0Jhc2U2NChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvQmFzZTY0ICpwLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKChwID0gc29hcF9pbl9uc19fZWNob0Jhc2U2NChzb2FwLCB0YWcsIHAsIHR5cGUpKSkKKwkJc29hcF9nZXRpbmRlcGVuZGVudChzb2FwKTsKKwlyZXR1cm4gcDsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9CYXNlNjQgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fbnNfX2VjaG9CYXNlNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc3RydWN0IG5zX19lY2hvQmFzZTY0ICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXNob3J0IHNvYXBfZmxhZ19pbnB1dEJhc2U2NCA9IDE7CisJaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoKnNvYXAtPnR5cGUgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkpCisJewlzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWEgPSAoc3RydWN0IG5zX19lY2hvQmFzZTY0ICopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgYSwgU09BUF9UWVBFX25zX19lY2hvQmFzZTY0LCBzaXplb2Yoc3RydWN0IG5zX19lY2hvQmFzZTY0KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJaWYgKCFhKQorCQlyZXR1cm4gTlVMTDsKKwlzb2FwX2RlZmF1bHRfbnNfX2VjaG9CYXNlNjQoc29hcCwgYSk7CisJaWYgKHNvYXAtPmJvZHkgJiYgISpzb2FwLT5ocmVmKQorCXsKKwkJZm9yICg7OykKKwkJewlzb2FwLT5lcnJvciA9IFNPQVBfVEFHX01JU01BVENIOworCQkJaWYgKHNvYXBfZmxhZ19pbnB1dEJhc2U2NCAmJiBzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlpZiAoc29hcF9pbl94c2RfX2Jhc2U2NEJpbmFyeShzb2FwLCAiaW5wdXRCYXNlNjQiLCAmYS0+aW5wdXRCYXNlNjQsICJ4c2Q6YmFzZTY0QmluYXJ5IikpCisJCQkJewlzb2FwX2ZsYWdfaW5wdXRCYXNlNjQtLTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCXNvYXAtPmVycm9yID0gc29hcF9pZ25vcmVfZWxlbWVudChzb2FwKTsKKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykKKwkJCQlicmVhazsKKwkJCWlmIChzb2FwLT5lcnJvcikKKwkJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIChzb2FwX2ZsYWdfaW5wdXRCYXNlNjQgPiAwKSkKKwkJewlzb2FwLT5lcnJvciA9IFNPQVBfT0NDVVJTOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwllbHNlCisJewlhID0gKHN0cnVjdCBuc19fZWNob0Jhc2U2NCAqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCAodm9pZCoqKWEsIDAsIFNPQVBfVFlQRV9uc19fZWNob0Jhc2U2NCwgMCwgc2l6ZW9mKHN0cnVjdCBuc19fZWNob0Jhc2U2NCksIDAsIE5VTEwpOworCQlpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGE7Cit9CisKK1NPQVBfRk1BQzUgc3RydWN0IG5zX19lY2hvQmFzZTY0ICogU09BUF9GTUFDNiBzb2FwX25ld19uc19fZWNob0Jhc2U2NChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4pCit7CXJldHVybiBzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvQmFzZTY0KHNvYXAsIG4sIE5VTEwsIE5VTEwsIE5VTEwpOworfQorCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9uc19fZWNob0Jhc2U2NChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvQmFzZTY0ICpwKQorewlzb2FwX2RlbGV0ZShzb2FwLCBwKTsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9CYXNlNjQgKiBTT0FQX0ZNQUM0IHNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG9CYXNlNjQoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICphcnJheVR5cGUsIHNpemVfdCAqc2l6ZSkKK3sKKwlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgInNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG9CYXNlNjQoJWQsICVzLCAlcylcbiIsIG4sIHR5cGU/dHlwZToiIiwgYXJyYXlUeXBlP2FycmF5VHlwZToiIikpOworCXN0cnVjdCBzb2FwX2NsaXN0ICpjcCA9IHNvYXBfbGluayhzb2FwLCBOVUxMLCBTT0FQX1RZUEVfbnNfX2VjaG9CYXNlNjQsIG4sIHNvYXBfZmRlbGV0ZSk7CisJaWYgKCFjcCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKG4gPCAwKQorCXsJY3AtPnB0ciA9ICh2b2lkKiluZXcgc3RydWN0IG5zX19lY2hvQmFzZTY0OworCQlpZiAoc2l6ZSkKKwkJCSpzaXplID0gc2l6ZW9mKHN0cnVjdCBuc19fZWNob0Jhc2U2NCk7CisJfQorCWVsc2UKKwl7CWNwLT5wdHIgPSAodm9pZCopbmV3IHN0cnVjdCBuc19fZWNob0Jhc2U2NFtuXTsKKwkJaWYgKHNpemUpCisJCQkqc2l6ZSA9IG4gKiBzaXplb2Yoc3RydWN0IG5zX19lY2hvQmFzZTY0KTsKKwl9CisJCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5zdGFudGlhdGVkIGxvY2F0aW9uPSVwXG4iLCBjcC0+cHRyKSk7CisJcmV0dXJuIChzdHJ1Y3QgbnNfX2VjaG9CYXNlNjQqKWNwLT5wdHI7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfY29weV9uc19fZWNob0Jhc2U2NChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0LCBpbnQgdHQsIHZvaWQgKnAsIHNpemVfdCBsZW4sIGNvbnN0IHZvaWQgKnEsIHNpemVfdCBuKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weWluZyBzdHJ1Y3QgbnNfX2VjaG9CYXNlNjQgJXAgLT4gJXBcbiIsIHEsIHApKTsKKwkqKHN0cnVjdCBuc19fZWNob0Jhc2U2NCopcCA9ICooc3RydWN0IG5zX19lY2hvQmFzZTY0KilxOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9uc19fZWNob0Jhc2U2NFJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG9CYXNlNjRSZXNwb25zZSAqYSkKK3sKKwkodm9pZClzb2FwOyAodm9pZClhOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8KKwlzb2FwX3NlcmlhbGl6ZV94c2RfX2Jhc2U2NEJpbmFyeShzb2FwLCAmYS0+X3JldHVybik7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9uc19fZWNob0Jhc2U2NFJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2VjaG9CYXNlNjRSZXNwb25zZSAqYSkKK3sKKwkodm9pZClzb2FwOyAodm9pZClhOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8KKwlzb2FwX2RlZmF1bHRfeHNkX19iYXNlNjRCaW5hcnkoc29hcCwgJmEtPl9yZXR1cm4pOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X25zX19lY2hvQmFzZTY0UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBuc19fZWNob0Jhc2U2NFJlc3BvbnNlICphLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmVnaXN0ZXIgaW50IGlkID0gc29hcF9lbWJlZChzb2FwLCAodm9pZCopYSwgTlVMTCwgMCwgdGFnLCBTT0FQX1RZUEVfbnNfX2VjaG9CYXNlNjRSZXNwb25zZSk7CisJaWYgKHNvYXBfb3V0X25zX19lY2hvQmFzZTY0UmVzcG9uc2Uoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9uc19fZWNob0Jhc2U2NFJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgc3RydWN0IG5zX19lY2hvQmFzZTY0UmVzcG9uc2UgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIGEsIFNPQVBfVFlQRV9uc19fZWNob0Jhc2U2NFJlc3BvbnNlKSwgdHlwZSk7CisJc29hcF9lbGVtZW50X3Jlc3VsdChzb2FwLCAicmV0dXJuIik7CisJc29hcF9vdXRfeHNkX19iYXNlNjRCaW5hcnkoc29hcCwgInJldHVybiIsIC0xLCAmYS0+X3JldHVybiwgIiIpOworCXNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7CisJcmV0dXJuIFNPQVBfT0s7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvQmFzZTY0UmVzcG9uc2UgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X25zX19lY2hvQmFzZTY0UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob0Jhc2U2NFJlc3BvbnNlICpwLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKChwID0gc29hcF9pbl9uc19fZWNob0Jhc2U2NFJlc3BvbnNlKHNvYXAsIHRhZywgcCwgdHlwZSkpKQorCQlzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOworCXJldHVybiBwOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob0Jhc2U2NFJlc3BvbnNlICogU09BUF9GTUFDNCBzb2FwX2luX25zX19lY2hvQmFzZTY0UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc3RydWN0IG5zX19lY2hvQmFzZTY0UmVzcG9uc2UgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc2hvcnQgc29hcF9mbGFnX19yZXR1cm4gPSAxOworCWlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCpzb2FwLT50eXBlICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpKQorCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisJCXJldHVybiBOVUxMOworCX0KKwlhID0gKHN0cnVjdCBuc19fZWNob0Jhc2U2NFJlc3BvbnNlICopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgYSwgU09BUF9UWVBFX25zX19lY2hvQmFzZTY0UmVzcG9uc2UsIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9CYXNlNjRSZXNwb25zZSksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworCWlmICghYSkKKwkJcmV0dXJuIE5VTEw7CisJc29hcF9kZWZhdWx0X25zX19lY2hvQmFzZTY0UmVzcG9uc2Uoc29hcCwgYSk7CisJaWYgKHNvYXAtPmJvZHkgJiYgISpzb2FwLT5ocmVmKQorCXsKKwkJZm9yICg7OykKKwkJewlzb2FwLT5lcnJvciA9IFNPQVBfVEFHX01JU01BVENIOworCQkJaWYgKHNvYXBfZmxhZ19fcmV0dXJuICYmIHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCWlmIChzb2FwX2luX3hzZF9fYmFzZTY0QmluYXJ5KHNvYXAsIE5VTEwsICZhLT5fcmV0dXJuLCAieHNkOmJhc2U2NEJpbmFyeSIpKQorCQkJCXsJc29hcF9mbGFnX19yZXR1cm4tLTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCXNvYXAtPmVycm9yID0gc29hcF9pZ25vcmVfZWxlbWVudChzb2FwKTsKKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykKKwkJCQlicmVhazsKKwkJCWlmIChzb2FwLT5lcnJvcikKKwkJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIChzb2FwX2ZsYWdfX3JldHVybiA+IDApKQorCQl7CXNvYXAtPmVycm9yID0gU09BUF9PQ0NVUlM7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCWVsc2UKKwl7CWEgPSAoc3RydWN0IG5zX19lY2hvQmFzZTY0UmVzcG9uc2UgKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilhLCAwLCBTT0FQX1RZUEVfbnNfX2VjaG9CYXNlNjRSZXNwb25zZSwgMCwgc2l6ZW9mKHN0cnVjdCBuc19fZWNob0Jhc2U2NFJlc3BvbnNlKSwgMCwgTlVMTCk7CisJCWlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gYTsKK30KKworU09BUF9GTUFDNSBzdHJ1Y3QgbnNfX2VjaG9CYXNlNjRSZXNwb25zZSAqIFNPQVBfRk1BQzYgc29hcF9uZXdfbnNfX2VjaG9CYXNlNjRSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4pCit7CXJldHVybiBzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvQmFzZTY0UmVzcG9uc2Uoc29hcCwgbiwgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX25zX19lY2hvQmFzZTY0UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob0Jhc2U2NFJlc3BvbnNlICpwKQorewlzb2FwX2RlbGV0ZShzb2FwLCBwKTsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9CYXNlNjRSZXNwb25zZSAqIFNPQVBfRk1BQzQgc29hcF9pbnN0YW50aWF0ZV9uc19fZWNob0Jhc2U2NFJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbiwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqYXJyYXlUeXBlLCBzaXplX3QgKnNpemUpCit7CisJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvQmFzZTY0UmVzcG9uc2UoJWQsICVzLCAlcylcbiIsIG4sIHR5cGU/dHlwZToiIiwgYXJyYXlUeXBlP2FycmF5VHlwZToiIikpOworCXN0cnVjdCBzb2FwX2NsaXN0ICpjcCA9IHNvYXBfbGluayhzb2FwLCBOVUxMLCBTT0FQX1RZUEVfbnNfX2VjaG9CYXNlNjRSZXNwb25zZSwgbiwgc29hcF9mZGVsZXRlKTsKKwlpZiAoIWNwKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAobiA8IDApCisJewljcC0+cHRyID0gKHZvaWQqKW5ldyBzdHJ1Y3QgbnNfX2VjaG9CYXNlNjRSZXNwb25zZTsKKwkJaWYgKHNpemUpCisJCQkqc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9CYXNlNjRSZXNwb25zZSk7CisJfQorCWVsc2UKKwl7CWNwLT5wdHIgPSAodm9pZCopbmV3IHN0cnVjdCBuc19fZWNob0Jhc2U2NFJlc3BvbnNlW25dOworCQlpZiAoc2l6ZSkKKwkJCSpzaXplID0gbiAqIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9CYXNlNjRSZXNwb25zZSk7CisJfQorCQlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluc3RhbnRpYXRlZCBsb2NhdGlvbj0lcFxuIiwgY3AtPnB0cikpOworCXJldHVybiAoc3RydWN0IG5zX19lY2hvQmFzZTY0UmVzcG9uc2UqKWNwLT5wdHI7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfY29weV9uc19fZWNob0Jhc2U2NFJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3QsIGludCB0dCwgdm9pZCAqcCwgc2l6ZV90IGxlbiwgY29uc3Qgdm9pZCAqcSwgc2l6ZV90IG4pCit7CisJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5aW5nIHN0cnVjdCBuc19fZWNob0Jhc2U2NFJlc3BvbnNlICVwIC0+ICVwXG4iLCBxLCBwKSk7CisJKihzdHJ1Y3QgbnNfX2VjaG9CYXNlNjRSZXNwb25zZSopcCA9ICooc3RydWN0IG5zX19lY2hvQmFzZTY0UmVzcG9uc2UqKXE7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX3hzZF9fYmFzZTY0QmluYXJ5KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgeHNkX19iYXNlNjRCaW5hcnkgY29uc3QqYSkKK3sKKwlpZiAoYS0+X19wdHIpCisJCXNvYXBfYXJyYXlfcmVmZXJlbmNlKHNvYXAsIGEsIChzdHJ1Y3Qgc29hcF9hcnJheSopJmEtPl9fcHRyLCAxLCBTT0FQX1RZUEVfeHNkX19iYXNlNjRCaW5hcnkpOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfeHNkX19iYXNlNjRCaW5hcnkoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCB4c2RfX2Jhc2U2NEJpbmFyeSAqYSkKK3sKKwlhLT5fX3NpemUgPSAwOworCWEtPl9fcHRyID0gTlVMTDsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF94c2RfX2Jhc2U2NEJpbmFyeShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IHhzZF9fYmFzZTY0QmluYXJ5ICphLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmVnaXN0ZXIgaW50IGlkID0gc29hcF9lbWJlZChzb2FwLCAodm9pZCopYSwgKHN0cnVjdCBzb2FwX2FycmF5KikmYS0+X19wdHIsIDEsIHRhZywgU09BUF9UWVBFX3hzZF9fYmFzZTY0QmluYXJ5KTsKKwlpZiAoc29hcF9vdXRfeHNkX19iYXNlNjRCaW5hcnkoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF94c2RfX2Jhc2U2NEJpbmFyeShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHN0cnVjdCB4c2RfX2Jhc2U2NEJpbmFyeSAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZCA9IHNvYXBfZWxlbWVudF9pZChzb2FwLCB0YWcsIGlkLCBhLCAoc3RydWN0IHNvYXBfYXJyYXkqKSZhLT5fX3B0ciwgMSwgdHlwZSwgU09BUF9UWVBFX3hzZF9fYmFzZTY0QmluYXJ5KTsKKwlpZiAoaWQgPCAwKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIGlkLCB0eXBlKTsKKwlzb2FwX3B1dGJhc2U2NChzb2FwLCBhLT5fX3B0ciwgYS0+X19zaXplKTsKKwlzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworCXJldHVybiBTT0FQX09LOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCB4c2RfX2Jhc2U2NEJpbmFyeSAqIFNPQVBfRk1BQzQgc29hcF9nZXRfeHNkX19iYXNlNjRCaW5hcnkoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCB4c2RfX2Jhc2U2NEJpbmFyeSAqcCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmICgocCA9IHNvYXBfaW5feHNkX19iYXNlNjRCaW5hcnkoc29hcCwgdGFnLCBwLCB0eXBlKSkpCisJCXNvYXBfZ2V0aW5kZXBlbmRlbnQoc29hcCk7CisJcmV0dXJuIHA7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IHhzZF9fYmFzZTY0QmluYXJ5ICogU09BUF9GTUFDNCBzb2FwX2luX3hzZF9fYmFzZTY0QmluYXJ5KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHN0cnVjdCB4c2RfX2Jhc2U2NEJpbmFyeSAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMSkpCisJCXJldHVybiBOVUxMOworCWlmICgqc29hcC0+dHlwZSAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKSAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmJhc2U2NEJpbmFyeSIpICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6YmFzZTY0IikpCisJewlzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWEgPSAoc3RydWN0IHhzZF9fYmFzZTY0QmluYXJ5ICopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgYSwgU09BUF9UWVBFX3hzZF9fYmFzZTY0QmluYXJ5LCBzaXplb2Yoc3RydWN0IHhzZF9fYmFzZTY0QmluYXJ5KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJaWYgKCFhKQorCQlyZXR1cm4gTlVMTDsKKwlzb2FwX2RlZmF1bHRfeHNkX19iYXNlNjRCaW5hcnkoc29hcCwgYSk7CisJaWYgKHNvYXAtPmJvZHkgJiYgISpzb2FwLT5ocmVmKQorCXsKKwkJYS0+X19wdHIgPSBzb2FwX2dldGJhc2U2NChzb2FwLCAmYS0+X19zaXplLCAwKTsKKwkJaWYgKCghYS0+X19wdHIgJiYgc29hcC0+ZXJyb3IpIHx8IHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwllbHNlCisJewlhID0gKHN0cnVjdCB4c2RfX2Jhc2U2NEJpbmFyeSAqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCAodm9pZCoqKWEsIDAsIFNPQVBfVFlQRV94c2RfX2Jhc2U2NEJpbmFyeSwgMCwgc2l6ZW9mKHN0cnVjdCB4c2RfX2Jhc2U2NEJpbmFyeSksIDAsIE5VTEwpOworCQlpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGE7Cit9CisKK1NPQVBfRk1BQzUgc3RydWN0IHhzZF9fYmFzZTY0QmluYXJ5ICogU09BUF9GTUFDNiBzb2FwX25ld194c2RfX2Jhc2U2NEJpbmFyeShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4pCit7CXJldHVybiBzb2FwX2luc3RhbnRpYXRlX3hzZF9fYmFzZTY0QmluYXJ5KHNvYXAsIG4sIE5VTEwsIE5VTEwsIE5VTEwpOworfQorCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV94c2RfX2Jhc2U2NEJpbmFyeShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHhzZF9fYmFzZTY0QmluYXJ5ICpwKQorewlzb2FwX2RlbGV0ZShzb2FwLCBwKTsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgeHNkX19iYXNlNjRCaW5hcnkgKiBTT0FQX0ZNQUM0IHNvYXBfaW5zdGFudGlhdGVfeHNkX19iYXNlNjRCaW5hcnkoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICphcnJheVR5cGUsIHNpemVfdCAqc2l6ZSkKK3sKKwlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgInNvYXBfaW5zdGFudGlhdGVfeHNkX19iYXNlNjRCaW5hcnkoJWQsICVzLCAlcylcbiIsIG4sIHR5cGU/dHlwZToiIiwgYXJyYXlUeXBlP2FycmF5VHlwZToiIikpOworCXN0cnVjdCBzb2FwX2NsaXN0ICpjcCA9IHNvYXBfbGluayhzb2FwLCBOVUxMLCBTT0FQX1RZUEVfeHNkX19iYXNlNjRCaW5hcnksIG4sIHNvYXBfZmRlbGV0ZSk7CisJaWYgKCFjcCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKG4gPCAwKQorCXsJY3AtPnB0ciA9ICh2b2lkKiluZXcgc3RydWN0IHhzZF9fYmFzZTY0QmluYXJ5OworCQlpZiAoc2l6ZSkKKwkJCSpzaXplID0gc2l6ZW9mKHN0cnVjdCB4c2RfX2Jhc2U2NEJpbmFyeSk7CisJfQorCWVsc2UKKwl7CWNwLT5wdHIgPSAodm9pZCopbmV3IHN0cnVjdCB4c2RfX2Jhc2U2NEJpbmFyeVtuXTsKKwkJaWYgKHNpemUpCisJCQkqc2l6ZSA9IG4gKiBzaXplb2Yoc3RydWN0IHhzZF9fYmFzZTY0QmluYXJ5KTsKKwl9CisJCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5zdGFudGlhdGVkIGxvY2F0aW9uPSVwXG4iLCBjcC0+cHRyKSk7CisJcmV0dXJuIChzdHJ1Y3QgeHNkX19iYXNlNjRCaW5hcnkqKWNwLT5wdHI7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfY29weV94c2RfX2Jhc2U2NEJpbmFyeShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0LCBpbnQgdHQsIHZvaWQgKnAsIHNpemVfdCBsZW4sIGNvbnN0IHZvaWQgKnEsIHNpemVfdCBuKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weWluZyBzdHJ1Y3QgeHNkX19iYXNlNjRCaW5hcnkgJXAgLT4gJXBcbiIsIHEsIHApKTsKKwkqKHN0cnVjdCB4c2RfX2Jhc2U2NEJpbmFyeSopcCA9ICooc3RydWN0IHhzZF9fYmFzZTY0QmluYXJ5KilxOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9uc19fZWNob1ZvaWQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBuc19fZWNob1ZvaWQgKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9uc19fZWNob1ZvaWQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob1ZvaWQgKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfbnNfX2VjaG9Wb2lkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG9Wb2lkICphLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmVnaXN0ZXIgaW50IGlkID0gc29hcF9lbWJlZChzb2FwLCAodm9pZCopYSwgTlVMTCwgMCwgdGFnLCBTT0FQX1RZUEVfbnNfX2VjaG9Wb2lkKTsKKwlpZiAoc29hcF9vdXRfbnNfX2VjaG9Wb2lkKHNvYXAsIHRhZywgaWQsIGEsIHR5cGUpKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJcmV0dXJuIHNvYXBfcHV0aW5kZXBlbmRlbnQoc29hcCk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfbnNfX2VjaG9Wb2lkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgc3RydWN0IG5zX19lY2hvVm9pZCAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgYSwgU09BUF9UWVBFX25zX19lY2hvVm9pZCksIHR5cGUpOworCXNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7CisJcmV0dXJuIFNPQVBfT0s7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvVm9pZCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfbnNfX2VjaG9Wb2lkKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2VjaG9Wb2lkICpwLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKChwID0gc29hcF9pbl9uc19fZWNob1ZvaWQoc29hcCwgdGFnLCBwLCB0eXBlKSkpCisJCXNvYXBfZ2V0aW5kZXBlbmRlbnQoc29hcCk7CisJcmV0dXJuIHA7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvVm9pZCAqIFNPQVBfRk1BQzQgc29hcF9pbl9uc19fZWNob1ZvaWQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc3RydWN0IG5zX19lY2hvVm9pZCAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3s7CisJaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoKnNvYXAtPnR5cGUgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkpCisJewlzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWEgPSAoc3RydWN0IG5zX19lY2hvVm9pZCAqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIGEsIFNPQVBfVFlQRV9uc19fZWNob1ZvaWQsIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9Wb2lkKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJaWYgKCFhKQorCQlyZXR1cm4gTlVMTDsKKwlzb2FwX2RlZmF1bHRfbnNfX2VjaG9Wb2lkKHNvYXAsIGEpOworCWlmIChzb2FwLT5ib2R5ICYmICEqc29hcC0+aHJlZikKKwl7CisJCWZvciAoOzspCisJCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RBR19NSVNNQVRDSDsKKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlzb2FwLT5lcnJvciA9IHNvYXBfaWdub3JlX2VsZW1lbnQoc29hcCk7CisJCQlpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcpCisJCQkJYnJlYWs7CisJCQlpZiAoc29hcC0+ZXJyb3IpCisJCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwllbHNlCisJewlhID0gKHN0cnVjdCBuc19fZWNob1ZvaWQgKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilhLCAwLCBTT0FQX1RZUEVfbnNfX2VjaG9Wb2lkLCAwLCBzaXplb2Yoc3RydWN0IG5zX19lY2hvVm9pZCksIDAsIE5VTEwpOworCQlpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGE7Cit9CisKK1NPQVBfRk1BQzUgc3RydWN0IG5zX19lY2hvVm9pZCAqIFNPQVBfRk1BQzYgc29hcF9uZXdfbnNfX2VjaG9Wb2lkKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbikKK3sJcmV0dXJuIHNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG9Wb2lkKHNvYXAsIG4sIE5VTEwsIE5VTEwsIE5VTEwpOworfQorCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9uc19fZWNob1ZvaWQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob1ZvaWQgKnApCit7CXNvYXBfZGVsZXRlKHNvYXAsIHApOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob1ZvaWQgKiBTT0FQX0ZNQUM0IHNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG9Wb2lkKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbiwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqYXJyYXlUeXBlLCBzaXplX3QgKnNpemUpCit7CisJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvVm9pZCglZCwgJXMsICVzKVxuIiwgbiwgdHlwZT90eXBlOiIiLCBhcnJheVR5cGU/YXJyYXlUeXBlOiIiKSk7CisJc3RydWN0IHNvYXBfY2xpc3QgKmNwID0gc29hcF9saW5rKHNvYXAsIE5VTEwsIFNPQVBfVFlQRV9uc19fZWNob1ZvaWQsIG4sIHNvYXBfZmRlbGV0ZSk7CisJaWYgKCFjcCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKG4gPCAwKQorCXsJY3AtPnB0ciA9ICh2b2lkKiluZXcgc3RydWN0IG5zX19lY2hvVm9pZDsKKwkJaWYgKHNpemUpCisJCQkqc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9Wb2lkKTsKKwl9CisJZWxzZQorCXsJY3AtPnB0ciA9ICh2b2lkKiluZXcgc3RydWN0IG5zX19lY2hvVm9pZFtuXTsKKwkJaWYgKHNpemUpCisJCQkqc2l6ZSA9IG4gKiBzaXplb2Yoc3RydWN0IG5zX19lY2hvVm9pZCk7CisJfQorCQlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluc3RhbnRpYXRlZCBsb2NhdGlvbj0lcFxuIiwgY3AtPnB0cikpOworCXJldHVybiAoc3RydWN0IG5zX19lY2hvVm9pZCopY3AtPnB0cjsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9jb3B5X25zX19lY2hvVm9pZChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0LCBpbnQgdHQsIHZvaWQgKnAsIHNpemVfdCBsZW4sIGNvbnN0IHZvaWQgKnEsIHNpemVfdCBuKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weWluZyBzdHJ1Y3QgbnNfX2VjaG9Wb2lkICVwIC0+ICVwXG4iLCBxLCBwKSk7CisJKihzdHJ1Y3QgbnNfX2VjaG9Wb2lkKilwID0gKihzdHJ1Y3QgbnNfX2VjaG9Wb2lkKilxOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9uc19fZWNob1ZvaWRSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IG5zX19lY2hvVm9pZFJlc3BvbnNlICphKQoreworCSh2b2lkKXNvYXA7ICh2b2lkKWE7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfbnNfX2VjaG9Wb2lkUmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob1ZvaWRSZXNwb25zZSAqYSkKK3sKKwkodm9pZClzb2FwOyAodm9pZClhOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8KK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9uc19fZWNob1ZvaWRSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IG5zX19lY2hvVm9pZFJlc3BvbnNlICphLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmVnaXN0ZXIgaW50IGlkID0gc29hcF9lbWJlZChzb2FwLCAodm9pZCopYSwgTlVMTCwgMCwgdGFnLCBTT0FQX1RZUEVfbnNfX2VjaG9Wb2lkUmVzcG9uc2UpOworCWlmIChzb2FwX291dF9uc19fZWNob1ZvaWRSZXNwb25zZShzb2FwLCB0YWcsIGlkLCBhLCB0eXBlKSkKKwkJcmV0dXJuIHNvYXAtPmVycm9yOworCXJldHVybiBzb2FwX3B1dGluZGVwZW5kZW50KHNvYXApOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X25zX19lY2hvVm9pZFJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgc3RydWN0IG5zX19lY2hvVm9pZFJlc3BvbnNlICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBhLCBTT0FQX1RZUEVfbnNfX2VjaG9Wb2lkUmVzcG9uc2UpLCB0eXBlKTsKKwlzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworCXJldHVybiBTT0FQX09LOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob1ZvaWRSZXNwb25zZSAqIFNPQVBfRk1BQzQgc29hcF9nZXRfbnNfX2VjaG9Wb2lkUmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob1ZvaWRSZXNwb25zZSAqcCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmICgocCA9IHNvYXBfaW5fbnNfX2VjaG9Wb2lkUmVzcG9uc2Uoc29hcCwgdGFnLCBwLCB0eXBlKSkpCisJCXNvYXBfZ2V0aW5kZXBlbmRlbnQoc29hcCk7CisJcmV0dXJuIHA7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvVm9pZFJlc3BvbnNlICogU09BUF9GTUFDNCBzb2FwX2luX25zX19lY2hvVm9pZFJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHN0cnVjdCBuc19fZWNob1ZvaWRSZXNwb25zZSAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3s7CisJaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoKnNvYXAtPnR5cGUgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkpCisJewlzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWEgPSAoc3RydWN0IG5zX19lY2hvVm9pZFJlc3BvbnNlICopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgYSwgU09BUF9UWVBFX25zX19lY2hvVm9pZFJlc3BvbnNlLCBzaXplb2Yoc3RydWN0IG5zX19lY2hvVm9pZFJlc3BvbnNlKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJaWYgKCFhKQorCQlyZXR1cm4gTlVMTDsKKwlzb2FwX2RlZmF1bHRfbnNfX2VjaG9Wb2lkUmVzcG9uc2Uoc29hcCwgYSk7CisJaWYgKHNvYXAtPmJvZHkgJiYgISpzb2FwLT5ocmVmKQorCXsKKwkJZm9yICg7OykKKwkJewlzb2FwLT5lcnJvciA9IFNPQVBfVEFHX01JU01BVENIOworCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCXNvYXAtPmVycm9yID0gc29hcF9pZ25vcmVfZWxlbWVudChzb2FwKTsKKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykKKwkJCQlicmVhazsKKwkJCWlmIChzb2FwLT5lcnJvcikKKwkJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCWVsc2UKKwl7CWEgPSAoc3RydWN0IG5zX19lY2hvVm9pZFJlc3BvbnNlICopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopYSwgMCwgU09BUF9UWVBFX25zX19lY2hvVm9pZFJlc3BvbnNlLCAwLCBzaXplb2Yoc3RydWN0IG5zX19lY2hvVm9pZFJlc3BvbnNlKSwgMCwgTlVMTCk7CisJCWlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gYTsKK30KKworU09BUF9GTUFDNSBzdHJ1Y3QgbnNfX2VjaG9Wb2lkUmVzcG9uc2UgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X25zX19lY2hvVm9pZFJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbikKK3sJcmV0dXJuIHNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG9Wb2lkUmVzcG9uc2Uoc29hcCwgbiwgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX25zX19lY2hvVm9pZFJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2VjaG9Wb2lkUmVzcG9uc2UgKnApCit7CXNvYXBfZGVsZXRlKHNvYXAsIHApOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob1ZvaWRSZXNwb25zZSAqIFNPQVBfRk1BQzQgc29hcF9pbnN0YW50aWF0ZV9uc19fZWNob1ZvaWRSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4sIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmFycmF5VHlwZSwgc2l6ZV90ICpzaXplKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAic29hcF9pbnN0YW50aWF0ZV9uc19fZWNob1ZvaWRSZXNwb25zZSglZCwgJXMsICVzKVxuIiwgbiwgdHlwZT90eXBlOiIiLCBhcnJheVR5cGU/YXJyYXlUeXBlOiIiKSk7CisJc3RydWN0IHNvYXBfY2xpc3QgKmNwID0gc29hcF9saW5rKHNvYXAsIE5VTEwsIFNPQVBfVFlQRV9uc19fZWNob1ZvaWRSZXNwb25zZSwgbiwgc29hcF9mZGVsZXRlKTsKKwlpZiAoIWNwKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAobiA8IDApCisJewljcC0+cHRyID0gKHZvaWQqKW5ldyBzdHJ1Y3QgbnNfX2VjaG9Wb2lkUmVzcG9uc2U7CisJCWlmIChzaXplKQorCQkJKnNpemUgPSBzaXplb2Yoc3RydWN0IG5zX19lY2hvVm9pZFJlc3BvbnNlKTsKKwl9CisJZWxzZQorCXsJY3AtPnB0ciA9ICh2b2lkKiluZXcgc3RydWN0IG5zX19lY2hvVm9pZFJlc3BvbnNlW25dOworCQlpZiAoc2l6ZSkKKwkJCSpzaXplID0gbiAqIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9Wb2lkUmVzcG9uc2UpOworCX0KKwkJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbnN0YW50aWF0ZWQgbG9jYXRpb249JXBcbiIsIGNwLT5wdHIpKTsKKwlyZXR1cm4gKHN0cnVjdCBuc19fZWNob1ZvaWRSZXNwb25zZSopY3AtPnB0cjsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9jb3B5X25zX19lY2hvVm9pZFJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3QsIGludCB0dCwgdm9pZCAqcCwgc2l6ZV90IGxlbiwgY29uc3Qgdm9pZCAqcSwgc2l6ZV90IG4pCit7CisJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5aW5nIHN0cnVjdCBuc19fZWNob1ZvaWRSZXNwb25zZSAlcCAtPiAlcFxuIiwgcSwgcCkpOworCSooc3RydWN0IG5zX19lY2hvVm9pZFJlc3BvbnNlKilwID0gKihzdHJ1Y3QgbnNfX2VjaG9Wb2lkUmVzcG9uc2UqKXE7Cit9CisKZGlmZiAtLWdpdCBhL2dzb2FwLXBhbG0vaW50ZXJvcC9zcmMvc29hcEMzLmNwcCBiL2dzb2FwLXBhbG0vaW50ZXJvcC9zcmMvc29hcEMzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzU0ODA1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3NvYXAtcGFsbS9pbnRlcm9wL3NyYy9zb2FwQzMuY3BwCkBAIC0wLDAgKzEsMzM2OSBAQAorCisjaW5jbHVkZSAic29hcEguaCIKKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfbnNfX2VjaG9TdHJ1Y3RBcnJheShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IG5zX19lY2hvU3RydWN0QXJyYXkgKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisJc29hcF9zZXJpYWxpemVfQXJyYXlPZlNPQVBTdHJ1Y3Qoc29hcCwgJmEtPmlucHV0U3RydWN0QXJyYXkpOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfbnNfX2VjaG9TdHJ1Y3RBcnJheShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvU3RydWN0QXJyYXkgKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisJc29hcF9kZWZhdWx0X0FycmF5T2ZTT0FQU3RydWN0KHNvYXAsICZhLT5pbnB1dFN0cnVjdEFycmF5KTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9uc19fZWNob1N0cnVjdEFycmF5KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBcnJheSAqYSwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCXJlZ2lzdGVyIGludCBpZCA9IHNvYXBfZW1iZWQoc29hcCwgKHZvaWQqKWEsIE5VTEwsIDAsIHRhZywgU09BUF9UWVBFX25zX19lY2hvU3RydWN0QXJyYXkpOworCWlmIChzb2FwX291dF9uc19fZWNob1N0cnVjdEFycmF5KHNvYXAsIHRhZywgaWQsIGEsIHR5cGUpKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJcmV0dXJuIHNvYXBfcHV0aW5kZXBlbmRlbnQoc29hcCk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfbnNfX2VjaG9TdHJ1Y3RBcnJheShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHN0cnVjdCBuc19fZWNob1N0cnVjdEFycmF5ICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBhLCBTT0FQX1RZUEVfbnNfX2VjaG9TdHJ1Y3RBcnJheSksIHR5cGUpOworCXNvYXBfb3V0X0FycmF5T2ZTT0FQU3RydWN0KHNvYXAsICJpbnB1dFN0cnVjdEFycmF5IiwgLTEsICZhLT5pbnB1dFN0cnVjdEFycmF5LCAiIik7CisJc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKKwlyZXR1cm4gU09BUF9PSzsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBcnJheSAqIFNPQVBfRk1BQzQgc29hcF9nZXRfbnNfX2VjaG9TdHJ1Y3RBcnJheShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvU3RydWN0QXJyYXkgKnAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoKHAgPSBzb2FwX2luX25zX19lY2hvU3RydWN0QXJyYXkoc29hcCwgdGFnLCBwLCB0eXBlKSkpCisJCXNvYXBfZ2V0aW5kZXBlbmRlbnQoc29hcCk7CisJcmV0dXJuIHA7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvU3RydWN0QXJyYXkgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fbnNfX2VjaG9TdHJ1Y3RBcnJheShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBcnJheSAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlzaG9ydCBzb2FwX2ZsYWdfaW5wdXRTdHJ1Y3RBcnJheSA9IDE7CisJaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoKnNvYXAtPnR5cGUgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkpCisJewlzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWEgPSAoc3RydWN0IG5zX19lY2hvU3RydWN0QXJyYXkgKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBhLCBTT0FQX1RZUEVfbnNfX2VjaG9TdHJ1Y3RBcnJheSwgc2l6ZW9mKHN0cnVjdCBuc19fZWNob1N0cnVjdEFycmF5KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJaWYgKCFhKQorCQlyZXR1cm4gTlVMTDsKKwlzb2FwX2RlZmF1bHRfbnNfX2VjaG9TdHJ1Y3RBcnJheShzb2FwLCBhKTsKKwlpZiAoc29hcC0+Ym9keSAmJiAhKnNvYXAtPmhyZWYpCisJeworCQlmb3IgKDs7KQorCQl7CXNvYXAtPmVycm9yID0gU09BUF9UQUdfTUlTTUFUQ0g7CisJCQlpZiAoc29hcF9mbGFnX2lucHV0U3RydWN0QXJyYXkgJiYgc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJaWYgKHNvYXBfaW5fQXJyYXlPZlNPQVBTdHJ1Y3Qoc29hcCwgImlucHV0U3RydWN0QXJyYXkiLCAmYS0+aW5wdXRTdHJ1Y3RBcnJheSwgInM6U09BUFN0cnVjdCIpKQorCQkJCXsJc29hcF9mbGFnX2lucHV0U3RydWN0QXJyYXktLTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCXNvYXAtPmVycm9yID0gc29hcF9pZ25vcmVfZWxlbWVudChzb2FwKTsKKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykKKwkJCQlicmVhazsKKwkJCWlmIChzb2FwLT5lcnJvcikKKwkJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIChzb2FwX2ZsYWdfaW5wdXRTdHJ1Y3RBcnJheSA+IDApKQorCQl7CXNvYXAtPmVycm9yID0gU09BUF9PQ0NVUlM7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCWVsc2UKKwl7CWEgPSAoc3RydWN0IG5zX19lY2hvU3RydWN0QXJyYXkgKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilhLCAwLCBTT0FQX1RZUEVfbnNfX2VjaG9TdHJ1Y3RBcnJheSwgMCwgc2l6ZW9mKHN0cnVjdCBuc19fZWNob1N0cnVjdEFycmF5KSwgMCwgTlVMTCk7CisJCWlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gYTsKK30KKworU09BUF9GTUFDNSBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBcnJheSAqIFNPQVBfRk1BQzYgc29hcF9uZXdfbnNfX2VjaG9TdHJ1Y3RBcnJheShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4pCit7CXJldHVybiBzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvU3RydWN0QXJyYXkoc29hcCwgbiwgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX25zX19lY2hvU3RydWN0QXJyYXkoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob1N0cnVjdEFycmF5ICpwKQorewlzb2FwX2RlbGV0ZShzb2FwLCBwKTsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBcnJheSAqIFNPQVBfRk1BQzQgc29hcF9pbnN0YW50aWF0ZV9uc19fZWNob1N0cnVjdEFycmF5KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbiwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqYXJyYXlUeXBlLCBzaXplX3QgKnNpemUpCit7CisJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvU3RydWN0QXJyYXkoJWQsICVzLCAlcylcbiIsIG4sIHR5cGU/dHlwZToiIiwgYXJyYXlUeXBlP2FycmF5VHlwZToiIikpOworCXN0cnVjdCBzb2FwX2NsaXN0ICpjcCA9IHNvYXBfbGluayhzb2FwLCBOVUxMLCBTT0FQX1RZUEVfbnNfX2VjaG9TdHJ1Y3RBcnJheSwgbiwgc29hcF9mZGVsZXRlKTsKKwlpZiAoIWNwKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAobiA8IDApCisJewljcC0+cHRyID0gKHZvaWQqKW5ldyBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBcnJheTsKKwkJaWYgKHNpemUpCisJCQkqc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBcnJheSk7CisJfQorCWVsc2UKKwl7CWNwLT5wdHIgPSAodm9pZCopbmV3IHN0cnVjdCBuc19fZWNob1N0cnVjdEFycmF5W25dOworCQlpZiAoc2l6ZSkKKwkJCSpzaXplID0gbiAqIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBcnJheSk7CisJfQorCQlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluc3RhbnRpYXRlZCBsb2NhdGlvbj0lcFxuIiwgY3AtPnB0cikpOworCXJldHVybiAoc3RydWN0IG5zX19lY2hvU3RydWN0QXJyYXkqKWNwLT5wdHI7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfY29weV9uc19fZWNob1N0cnVjdEFycmF5KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3QsIGludCB0dCwgdm9pZCAqcCwgc2l6ZV90IGxlbiwgY29uc3Qgdm9pZCAqcSwgc2l6ZV90IG4pCit7CisJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5aW5nIHN0cnVjdCBuc19fZWNob1N0cnVjdEFycmF5ICVwIC0+ICVwXG4iLCBxLCBwKSk7CisJKihzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBcnJheSopcCA9ICooc3RydWN0IG5zX19lY2hvU3RydWN0QXJyYXkqKXE7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX25zX19lY2hvU3RydWN0QXJyYXlSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IG5zX19lY2hvU3RydWN0QXJyYXlSZXNwb25zZSAqYSkKK3sKKwkodm9pZClzb2FwOyAodm9pZClhOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8KKwlzb2FwX3NlcmlhbGl6ZV9BcnJheU9mU09BUFN0cnVjdChzb2FwLCAmYS0+X3JldHVybik7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9uc19fZWNob1N0cnVjdEFycmF5UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob1N0cnVjdEFycmF5UmVzcG9uc2UgKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisJc29hcF9kZWZhdWx0X0FycmF5T2ZTT0FQU3RydWN0KHNvYXAsICZhLT5fcmV0dXJuKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9uc19fZWNob1N0cnVjdEFycmF5UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBuc19fZWNob1N0cnVjdEFycmF5UmVzcG9uc2UgKmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZWdpc3RlciBpbnQgaWQgPSBzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCBOVUxMLCAwLCB0YWcsIFNPQVBfVFlQRV9uc19fZWNob1N0cnVjdEFycmF5UmVzcG9uc2UpOworCWlmIChzb2FwX291dF9uc19fZWNob1N0cnVjdEFycmF5UmVzcG9uc2Uoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9uc19fZWNob1N0cnVjdEFycmF5UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBcnJheVJlc3BvbnNlICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBhLCBTT0FQX1RZUEVfbnNfX2VjaG9TdHJ1Y3RBcnJheVJlc3BvbnNlKSwgdHlwZSk7CisJc29hcF9lbGVtZW50X3Jlc3VsdChzb2FwLCAicmV0dXJuIik7CisJc29hcF9vdXRfQXJyYXlPZlNPQVBTdHJ1Y3Qoc29hcCwgInJldHVybiIsIC0xLCAmYS0+X3JldHVybiwgIiIpOworCXNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7CisJcmV0dXJuIFNPQVBfT0s7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvU3RydWN0QXJyYXlSZXNwb25zZSAqIFNPQVBfRk1BQzQgc29hcF9nZXRfbnNfX2VjaG9TdHJ1Y3RBcnJheVJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBcnJheVJlc3BvbnNlICpwLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKChwID0gc29hcF9pbl9uc19fZWNob1N0cnVjdEFycmF5UmVzcG9uc2Uoc29hcCwgdGFnLCBwLCB0eXBlKSkpCisJCXNvYXBfZ2V0aW5kZXBlbmRlbnQoc29hcCk7CisJcmV0dXJuIHA7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvU3RydWN0QXJyYXlSZXNwb25zZSAqIFNPQVBfRk1BQzQgc29hcF9pbl9uc19fZWNob1N0cnVjdEFycmF5UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc3RydWN0IG5zX19lY2hvU3RydWN0QXJyYXlSZXNwb25zZSAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlzaG9ydCBzb2FwX2ZsYWdfX3JldHVybiA9IDE7CisJaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoKnNvYXAtPnR5cGUgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkpCisJewlzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWEgPSAoc3RydWN0IG5zX19lY2hvU3RydWN0QXJyYXlSZXNwb25zZSAqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIGEsIFNPQVBfVFlQRV9uc19fZWNob1N0cnVjdEFycmF5UmVzcG9uc2UsIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBcnJheVJlc3BvbnNlKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJaWYgKCFhKQorCQlyZXR1cm4gTlVMTDsKKwlzb2FwX2RlZmF1bHRfbnNfX2VjaG9TdHJ1Y3RBcnJheVJlc3BvbnNlKHNvYXAsIGEpOworCWlmIChzb2FwLT5ib2R5ICYmICEqc29hcC0+aHJlZikKKwl7CisJCWZvciAoOzspCisJCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RBR19NSVNNQVRDSDsKKwkJCWlmIChzb2FwX2ZsYWdfX3JldHVybiAmJiBzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlpZiAoc29hcF9pbl9BcnJheU9mU09BUFN0cnVjdChzb2FwLCBOVUxMLCAmYS0+X3JldHVybiwgInM6U09BUFN0cnVjdCIpKQorCQkJCXsJc29hcF9mbGFnX19yZXR1cm4tLTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCXNvYXAtPmVycm9yID0gc29hcF9pZ25vcmVfZWxlbWVudChzb2FwKTsKKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykKKwkJCQlicmVhazsKKwkJCWlmIChzb2FwLT5lcnJvcikKKwkJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIChzb2FwX2ZsYWdfX3JldHVybiA+IDApKQorCQl7CXNvYXAtPmVycm9yID0gU09BUF9PQ0NVUlM7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCWVsc2UKKwl7CWEgPSAoc3RydWN0IG5zX19lY2hvU3RydWN0QXJyYXlSZXNwb25zZSAqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCAodm9pZCoqKWEsIDAsIFNPQVBfVFlQRV9uc19fZWNob1N0cnVjdEFycmF5UmVzcG9uc2UsIDAsIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBcnJheVJlc3BvbnNlKSwgMCwgTlVMTCk7CisJCWlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gYTsKK30KKworU09BUF9GTUFDNSBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBcnJheVJlc3BvbnNlICogU09BUF9GTUFDNiBzb2FwX25ld19uc19fZWNob1N0cnVjdEFycmF5UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuKQorewlyZXR1cm4gc29hcF9pbnN0YW50aWF0ZV9uc19fZWNob1N0cnVjdEFycmF5UmVzcG9uc2Uoc29hcCwgbiwgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX25zX19lY2hvU3RydWN0QXJyYXlSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvU3RydWN0QXJyYXlSZXNwb25zZSAqcCkKK3sJc29hcF9kZWxldGUoc29hcCwgcCk7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvU3RydWN0QXJyYXlSZXNwb25zZSAqIFNPQVBfRk1BQzQgc29hcF9pbnN0YW50aWF0ZV9uc19fZWNob1N0cnVjdEFycmF5UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICphcnJheVR5cGUsIHNpemVfdCAqc2l6ZSkKK3sKKwlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgInNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG9TdHJ1Y3RBcnJheVJlc3BvbnNlKCVkLCAlcywgJXMpXG4iLCBuLCB0eXBlP3R5cGU6IiIsIGFycmF5VHlwZT9hcnJheVR5cGU6IiIpKTsKKwlzdHJ1Y3Qgc29hcF9jbGlzdCAqY3AgPSBzb2FwX2xpbmsoc29hcCwgTlVMTCwgU09BUF9UWVBFX25zX19lY2hvU3RydWN0QXJyYXlSZXNwb25zZSwgbiwgc29hcF9mZGVsZXRlKTsKKwlpZiAoIWNwKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAobiA8IDApCisJewljcC0+cHRyID0gKHZvaWQqKW5ldyBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBcnJheVJlc3BvbnNlOworCQlpZiAoc2l6ZSkKKwkJCSpzaXplID0gc2l6ZW9mKHN0cnVjdCBuc19fZWNob1N0cnVjdEFycmF5UmVzcG9uc2UpOworCX0KKwllbHNlCisJewljcC0+cHRyID0gKHZvaWQqKW5ldyBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBcnJheVJlc3BvbnNlW25dOworCQlpZiAoc2l6ZSkKKwkJCSpzaXplID0gbiAqIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBcnJheVJlc3BvbnNlKTsKKwl9CisJCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5zdGFudGlhdGVkIGxvY2F0aW9uPSVwXG4iLCBjcC0+cHRyKSk7CisJcmV0dXJuIChzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBcnJheVJlc3BvbnNlKiljcC0+cHRyOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2NvcHlfbnNfX2VjaG9TdHJ1Y3RBcnJheVJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3QsIGludCB0dCwgdm9pZCAqcCwgc2l6ZV90IGxlbiwgY29uc3Qgdm9pZCAqcSwgc2l6ZV90IG4pCit7CisJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5aW5nIHN0cnVjdCBuc19fZWNob1N0cnVjdEFycmF5UmVzcG9uc2UgJXAgLT4gJXBcbiIsIHEsIHApKTsKKwkqKHN0cnVjdCBuc19fZWNob1N0cnVjdEFycmF5UmVzcG9uc2UqKXAgPSAqKHN0cnVjdCBuc19fZWNob1N0cnVjdEFycmF5UmVzcG9uc2UqKXE7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX0FycmF5T2ZTT0FQU3RydWN0KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgQXJyYXlPZlNPQVBTdHJ1Y3QgY29uc3QqYSkKK3sKKwlpbnQgaTsKKwlpZiAoYS0+X19wdHIgJiYgIXNvYXBfYXJyYXlfcmVmZXJlbmNlKHNvYXAsIGEsIChzdHJ1Y3Qgc29hcF9hcnJheSopJmEtPl9fcHRyLCAxLCBTT0FQX1RZUEVfQXJyYXlPZlNPQVBTdHJ1Y3QpKQorCQlmb3IgKGkgPSAwOyBpIDwgYS0+X19zaXplOyBpKyspCisJCXsKKwkJCXNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3NfX1NPQVBTdHJ1Y3Qoc29hcCwgYS0+X19wdHIgKyBpKTsKKwkJfQorfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfQXJyYXlPZlNPQVBTdHJ1Y3Qoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBBcnJheU9mU09BUFN0cnVjdCAqYSkKK3sKKwlhLT5fX3NpemUgPSAwOworCWEtPl9fcHRyID0gTlVMTDsKKwlhLT5fX29mZnNldCA9IDA7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfQXJyYXlPZlNPQVBTdHJ1Y3Qoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBBcnJheU9mU09BUFN0cnVjdCAqYSwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCXJlZ2lzdGVyIGludCBpZCA9IHNvYXBfZW1iZWQoc29hcCwgKHZvaWQqKWEsIChzdHJ1Y3Qgc29hcF9hcnJheSopJmEtPl9fcHRyLCAxLCB0YWcsIFNPQVBfVFlQRV9BcnJheU9mU09BUFN0cnVjdCk7CisJaWYgKHNvYXBfb3V0X0FycmF5T2ZTT0FQU3RydWN0KHNvYXAsIHRhZywgaWQsIGEsIHR5cGUpKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJcmV0dXJuIHNvYXBfcHV0aW5kZXBlbmRlbnQoc29hcCk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfQXJyYXlPZlNPQVBTdHJ1Y3Qoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzdHJ1Y3QgQXJyYXlPZlNPQVBTdHJ1Y3QgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaW50IGksIG4gPSBhLT5fX3NpemU7CisJY2hhciAqdCA9IHNvYXBfcHV0c2l6ZShzb2FwLCAiczpTT0FQU3RydWN0IiwgbiArIGEtPl9fb2Zmc2V0KTsKKwlpZCA9IHNvYXBfZWxlbWVudF9pZChzb2FwLCB0YWcsIGlkLCBhLCAoc3RydWN0IHNvYXBfYXJyYXkqKSZhLT5fX3B0ciwgMSwgdHlwZSwgU09BUF9UWVBFX0FycmF5T2ZTT0FQU3RydWN0KTsKKwlpZiAoaWQgPCAwKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJc29hcF9hcnJheV9iZWdpbl9vdXQoc29hcCwgdGFnLCBpZCwgdCwgc29hcF9wdXRvZmZzZXQoc29hcCwgYS0+X19vZmZzZXQpKTsKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorCXsKKwkJc29hcC0+cG9zaXRpb24gPSAxOworCQlzb2FwLT5wb3NpdGlvbnNbMF0gPSBpOworCQlzb2FwX291dF9Qb2ludGVyVG9zX19TT0FQU3RydWN0KHNvYXAsICJpdGVtIiwgLTEsICZhLT5fX3B0cltpXSwgIiIpOworCX0KKwlzb2FwLT5wb3NpdGlvbiA9IDA7CisJc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKKwlyZXR1cm4gU09BUF9PSzsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgQXJyYXlPZlNPQVBTdHJ1Y3QgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X0FycmF5T2ZTT0FQU3RydWN0KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgQXJyYXlPZlNPQVBTdHJ1Y3QgKnAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoKHAgPSBzb2FwX2luX0FycmF5T2ZTT0FQU3RydWN0KHNvYXAsIHRhZywgcCwgdHlwZSkpKQorCQlzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOworCXJldHVybiBwOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBBcnJheU9mU09BUFN0cnVjdCAqIFNPQVBfRk1BQzQgc29hcF9pbl9BcnJheU9mU09BUFN0cnVjdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzdHJ1Y3QgQXJyYXlPZlNPQVBTdHJ1Y3QgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CWludCBpLCBqOworCXN0cnVjdCBzX19TT0FQU3RydWN0ICoqcDsKKwlpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMSkpCisJCXJldHVybiBOVUxMOworCWlmIChzb2FwX21hdGNoX2FycmF5KHNvYXAsIHR5cGUpKQorCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisJCXJldHVybiBOVUxMOworCX0KKwlhID0gKHN0cnVjdCBBcnJheU9mU09BUFN0cnVjdCAqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIGEsIFNPQVBfVFlQRV9BcnJheU9mU09BUFN0cnVjdCwgc2l6ZW9mKHN0cnVjdCBBcnJheU9mU09BUFN0cnVjdCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworCWlmICghYSkKKwkJcmV0dXJuIE5VTEw7CisJc29hcF9kZWZhdWx0X0FycmF5T2ZTT0FQU3RydWN0KHNvYXAsIGEpOworCWlmIChzb2FwLT5ib2R5ICYmICEqc29hcC0+aHJlZikKKwl7CisJCWEtPl9fc2l6ZSA9IHNvYXBfZ2V0c2l6ZShzb2FwLT5hcnJheVNpemUsIHNvYXAtPmFycmF5T2Zmc2V0LCAmaik7CisJCWEtPl9fb2Zmc2V0ID0gajsKKwkJaWYgKGEtPl9fc2l6ZSA+PSAwKQorCQl7CWEtPl9fcHRyID0gKHN0cnVjdCBzX19TT0FQU3RydWN0ICoqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc19fU09BUFN0cnVjdCAqKSAqIGEtPl9fc2l6ZSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgYS0+X19zaXplOyBpKyspCisJCQkJYS0+X19wdHJbaV0gPSBOVUxMOworCQkJZm9yIChpID0gMDsgaSA8IGEtPl9fc2l6ZTsgaSsrKQorCQkJewlzb2FwX3BlZWtfZWxlbWVudChzb2FwKTsKKwkJCQlpZiAoc29hcC0+cG9zaXRpb24pCisJCQkJewlpID0gc29hcC0+cG9zaXRpb25zWzBdLWo7CisJCQkJCWlmIChpIDwgMCB8fCBpID49IGEtPl9fc2l6ZSkKKwkJCQkJewlzb2FwLT5lcnJvciA9IFNPQVBfSU9COworCQkJCQkJcmV0dXJuIE5VTEw7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKCFzb2FwX2luX1BvaW50ZXJUb3NfX1NPQVBTdHJ1Y3Qoc29hcCwgTlVMTCwgYS0+X19wdHIgKyBpLCAiczpTT0FQU3RydWN0IikpCisJCQkJewlpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9OT19UQUcpCisJCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQkJc29hcC0+ZXJyb3IgPSBTT0FQX09LOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CXNvYXBfbmV3X2Jsb2NrKHNvYXApOworCQkJZm9yIChhLT5fX3NpemUgPSAwOyA7IGEtPl9fc2l6ZSsrKQorCQkJewlwID0gKHN0cnVjdCBzX19TT0FQU3RydWN0ICoqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBzaXplb2Yoc3RydWN0IHNfX1NPQVBTdHJ1Y3QgKikpOworCQkJCWlmICghcCkKKwkJCQkJcmV0dXJuIE5VTEw7CisJCQkJKnAgPSBOVUxMOworCQkJCWlmICghc29hcF9pbl9Qb2ludGVyVG9zX19TT0FQU3RydWN0KHNvYXAsIE5VTEwsIHAsICJzOlNPQVBTdHJ1Y3QiKSkKKwkJCQl7CWlmIChzb2FwLT5lcnJvciAhPSBTT0FQX05PX1RBRykKKwkJCQkJCXJldHVybiBOVUxMOworCQkJCQlzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCXNvYXBfcG9wX2Jsb2NrKHNvYXApOworCQkJYS0+X19wdHIgPSAoc3RydWN0IHNfX1NPQVBTdHJ1Y3QgKiopc29hcF9tYWxsb2Moc29hcCwgc29hcC0+Ymxpc3QtPnNpemUpOworCQkJc29hcF9zYXZlX2Jsb2NrKHNvYXAsIChjaGFyKilhLT5fX3B0ciwgMSk7CisJCX0KKwkJaWYgKHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwllbHNlCisJewlhID0gKHN0cnVjdCBBcnJheU9mU09BUFN0cnVjdCAqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCAodm9pZCoqKWEsIDAsIFNPQVBfVFlQRV9BcnJheU9mU09BUFN0cnVjdCwgMCwgc2l6ZW9mKHN0cnVjdCBBcnJheU9mU09BUFN0cnVjdCksIDAsIE5VTEwpOworCQlpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGE7Cit9CisKK1NPQVBfRk1BQzUgc3RydWN0IEFycmF5T2ZTT0FQU3RydWN0ICogU09BUF9GTUFDNiBzb2FwX25ld19BcnJheU9mU09BUFN0cnVjdChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4pCit7CXJldHVybiBzb2FwX2luc3RhbnRpYXRlX0FycmF5T2ZTT0FQU3RydWN0KHNvYXAsIG4sIE5VTEwsIE5VTEwsIE5VTEwpOworfQorCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9BcnJheU9mU09BUFN0cnVjdChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IEFycmF5T2ZTT0FQU3RydWN0ICpwKQorewlzb2FwX2RlbGV0ZShzb2FwLCBwKTsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgQXJyYXlPZlNPQVBTdHJ1Y3QgKiBTT0FQX0ZNQUM0IHNvYXBfaW5zdGFudGlhdGVfQXJyYXlPZlNPQVBTdHJ1Y3Qoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICphcnJheVR5cGUsIHNpemVfdCAqc2l6ZSkKK3sKKwlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgInNvYXBfaW5zdGFudGlhdGVfQXJyYXlPZlNPQVBTdHJ1Y3QoJWQsICVzLCAlcylcbiIsIG4sIHR5cGU/dHlwZToiIiwgYXJyYXlUeXBlP2FycmF5VHlwZToiIikpOworCXN0cnVjdCBzb2FwX2NsaXN0ICpjcCA9IHNvYXBfbGluayhzb2FwLCBOVUxMLCBTT0FQX1RZUEVfQXJyYXlPZlNPQVBTdHJ1Y3QsIG4sIHNvYXBfZmRlbGV0ZSk7CisJaWYgKCFjcCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKG4gPCAwKQorCXsJY3AtPnB0ciA9ICh2b2lkKiluZXcgc3RydWN0IEFycmF5T2ZTT0FQU3RydWN0OworCQlpZiAoc2l6ZSkKKwkJCSpzaXplID0gc2l6ZW9mKHN0cnVjdCBBcnJheU9mU09BUFN0cnVjdCk7CisJfQorCWVsc2UKKwl7CWNwLT5wdHIgPSAodm9pZCopbmV3IHN0cnVjdCBBcnJheU9mU09BUFN0cnVjdFtuXTsKKwkJaWYgKHNpemUpCisJCQkqc2l6ZSA9IG4gKiBzaXplb2Yoc3RydWN0IEFycmF5T2ZTT0FQU3RydWN0KTsKKwl9CisJCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5zdGFudGlhdGVkIGxvY2F0aW9uPSVwXG4iLCBjcC0+cHRyKSk7CisJcmV0dXJuIChzdHJ1Y3QgQXJyYXlPZlNPQVBTdHJ1Y3QqKWNwLT5wdHI7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfY29weV9BcnJheU9mU09BUFN0cnVjdChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0LCBpbnQgdHQsIHZvaWQgKnAsIHNpemVfdCBsZW4sIGNvbnN0IHZvaWQgKnEsIHNpemVfdCBuKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weWluZyBzdHJ1Y3QgQXJyYXlPZlNPQVBTdHJ1Y3QgJXAgLT4gJXBcbiIsIHEsIHApKTsKKwkqKHN0cnVjdCBBcnJheU9mU09BUFN0cnVjdCopcCA9ICooc3RydWN0IEFycmF5T2ZTT0FQU3RydWN0KilxOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9uc19fZWNob1N0cnVjdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IG5zX19lY2hvU3RydWN0ICphKQoreworCSh2b2lkKXNvYXA7ICh2b2lkKWE7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLworCXNvYXBfZW1iZWRkZWQoc29hcCwgJmEtPl9pbnB1dFN0cnVjdCwgU09BUF9UWVBFX3NfX1NPQVBTdHJ1Y3QpOworCXNvYXBfc2VyaWFsaXplX3NfX1NPQVBTdHJ1Y3Qoc29hcCwgJmEtPl9pbnB1dFN0cnVjdCk7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9uc19fZWNob1N0cnVjdChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvU3RydWN0ICphKQoreworCSh2b2lkKXNvYXA7ICh2b2lkKWE7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLworCXNvYXBfZGVmYXVsdF9zX19TT0FQU3RydWN0KHNvYXAsICZhLT5faW5wdXRTdHJ1Y3QpOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X25zX19lY2hvU3RydWN0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3QgKmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZWdpc3RlciBpbnQgaWQgPSBzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCBOVUxMLCAwLCB0YWcsIFNPQVBfVFlQRV9uc19fZWNob1N0cnVjdCk7CisJaWYgKHNvYXBfb3V0X25zX19lY2hvU3RydWN0KHNvYXAsIHRhZywgaWQsIGEsIHR5cGUpKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJcmV0dXJuIHNvYXBfcHV0aW5kZXBlbmRlbnQoc29hcCk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfbnNfX2VjaG9TdHJ1Y3Qoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3QgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIGEsIFNPQVBfVFlQRV9uc19fZWNob1N0cnVjdCksIHR5cGUpOworCXNvYXBfb3V0X3NfX1NPQVBTdHJ1Y3Qoc29hcCwgImlucHV0U3RydWN0IiwgLTEsICZhLT5faW5wdXRTdHJ1Y3QsICIiKTsKKwlzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworCXJldHVybiBTT0FQX09LOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob1N0cnVjdCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfbnNfX2VjaG9TdHJ1Y3Qoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob1N0cnVjdCAqcCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmICgocCA9IHNvYXBfaW5fbnNfX2VjaG9TdHJ1Y3Qoc29hcCwgdGFnLCBwLCB0eXBlKSkpCisJCXNvYXBfZ2V0aW5kZXBlbmRlbnQoc29hcCk7CisJcmV0dXJuIHA7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvU3RydWN0ICogU09BUF9GTUFDNCBzb2FwX2luX25zX19lY2hvU3RydWN0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHN0cnVjdCBuc19fZWNob1N0cnVjdCAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlzaG9ydCBzb2FwX2ZsYWdfX2lucHV0U3RydWN0ID0gMTsKKwlpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisJCXJldHVybiBOVUxMOworCWlmICgqc29hcC0+dHlwZSAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKSkKKwl7CXNvYXAtPmVycm9yID0gU09BUF9UWVBFOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYSA9IChzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3QgKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBhLCBTT0FQX1RZUEVfbnNfX2VjaG9TdHJ1Y3QsIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3QpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwlpZiAoIWEpCisJCXJldHVybiBOVUxMOworCXNvYXBfZGVmYXVsdF9uc19fZWNob1N0cnVjdChzb2FwLCBhKTsKKwlpZiAoc29hcC0+Ym9keSAmJiAhKnNvYXAtPmhyZWYpCisJeworCQlmb3IgKDs7KQorCQl7CXNvYXAtPmVycm9yID0gU09BUF9UQUdfTUlTTUFUQ0g7CisJCQlpZiAoc29hcF9mbGFnX19pbnB1dFN0cnVjdCAmJiBzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlpZiAoc29hcF9pbl9zX19TT0FQU3RydWN0KHNvYXAsIE5VTEwsICZhLT5faW5wdXRTdHJ1Y3QsICJzOlNPQVBTdHJ1Y3QiKSkKKwkJCQl7CXNvYXBfZmxhZ19faW5wdXRTdHJ1Y3QtLTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCXNvYXAtPmVycm9yID0gc29hcF9pZ25vcmVfZWxlbWVudChzb2FwKTsKKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykKKwkJCQlicmVhazsKKwkJCWlmIChzb2FwLT5lcnJvcikKKwkJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIChzb2FwX2ZsYWdfX2lucHV0U3RydWN0ID4gMCkpCisJCXsJc29hcC0+ZXJyb3IgPSBTT0FQX09DQ1VSUzsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWlmIChzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJZWxzZQorCXsJYSA9IChzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3QgKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilhLCAwLCBTT0FQX1RZUEVfbnNfX2VjaG9TdHJ1Y3QsIDAsIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3QpLCAwLCBOVUxMKTsKKwkJaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBhOworfQorCitTT0FQX0ZNQUM1IHN0cnVjdCBuc19fZWNob1N0cnVjdCAqIFNPQVBfRk1BQzYgc29hcF9uZXdfbnNfX2VjaG9TdHJ1Y3Qoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuKQorewlyZXR1cm4gc29hcF9pbnN0YW50aWF0ZV9uc19fZWNob1N0cnVjdChzb2FwLCBuLCBOVUxMLCBOVUxMLCBOVUxMKTsKK30KKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfbnNfX2VjaG9TdHJ1Y3Qoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob1N0cnVjdCAqcCkKK3sJc29hcF9kZWxldGUoc29hcCwgcCk7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvU3RydWN0ICogU09BUF9GTUFDNCBzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvU3RydWN0KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbiwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqYXJyYXlUeXBlLCBzaXplX3QgKnNpemUpCit7CisJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvU3RydWN0KCVkLCAlcywgJXMpXG4iLCBuLCB0eXBlP3R5cGU6IiIsIGFycmF5VHlwZT9hcnJheVR5cGU6IiIpKTsKKwlzdHJ1Y3Qgc29hcF9jbGlzdCAqY3AgPSBzb2FwX2xpbmsoc29hcCwgTlVMTCwgU09BUF9UWVBFX25zX19lY2hvU3RydWN0LCBuLCBzb2FwX2ZkZWxldGUpOworCWlmICghY3ApCisJCXJldHVybiBOVUxMOworCWlmIChuIDwgMCkKKwl7CWNwLT5wdHIgPSAodm9pZCopbmV3IHN0cnVjdCBuc19fZWNob1N0cnVjdDsKKwkJaWYgKHNpemUpCisJCQkqc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3QpOworCX0KKwllbHNlCisJewljcC0+cHRyID0gKHZvaWQqKW5ldyBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3Rbbl07CisJCWlmIChzaXplKQorCQkJKnNpemUgPSBuICogc2l6ZW9mKHN0cnVjdCBuc19fZWNob1N0cnVjdCk7CisJfQorCQlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluc3RhbnRpYXRlZCBsb2NhdGlvbj0lcFxuIiwgY3AtPnB0cikpOworCXJldHVybiAoc3RydWN0IG5zX19lY2hvU3RydWN0KiljcC0+cHRyOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2NvcHlfbnNfX2VjaG9TdHJ1Y3Qoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdCwgaW50IHR0LCB2b2lkICpwLCBzaXplX3QgbGVuLCBjb25zdCB2b2lkICpxLCBzaXplX3QgbikKK3sKKwlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHlpbmcgc3RydWN0IG5zX19lY2hvU3RydWN0ICVwIC0+ICVwXG4iLCBxLCBwKSk7CisJKihzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3QqKXAgPSAqKHN0cnVjdCBuc19fZWNob1N0cnVjdCopcTsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfbnNfX2VjaG9TdHJ1Y3RSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IG5zX19lY2hvU3RydWN0UmVzcG9uc2UgKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisJc29hcF9lbWJlZGRlZChzb2FwLCAmYS0+X3JldHVybiwgU09BUF9UWVBFX3NfX1NPQVBTdHJ1Y3QpOworCXNvYXBfc2VyaWFsaXplX3NfX1NPQVBTdHJ1Y3Qoc29hcCwgJmEtPl9yZXR1cm4pOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfbnNfX2VjaG9TdHJ1Y3RSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvU3RydWN0UmVzcG9uc2UgKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisJc29hcF9kZWZhdWx0X3NfX1NPQVBTdHJ1Y3Qoc29hcCwgJmEtPl9yZXR1cm4pOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X25zX19lY2hvU3RydWN0UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBuc19fZWNob1N0cnVjdFJlc3BvbnNlICphLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmVnaXN0ZXIgaW50IGlkID0gc29hcF9lbWJlZChzb2FwLCAodm9pZCopYSwgTlVMTCwgMCwgdGFnLCBTT0FQX1RZUEVfbnNfX2VjaG9TdHJ1Y3RSZXNwb25zZSk7CisJaWYgKHNvYXBfb3V0X25zX19lY2hvU3RydWN0UmVzcG9uc2Uoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9uc19fZWNob1N0cnVjdFJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgc3RydWN0IG5zX19lY2hvU3RydWN0UmVzcG9uc2UgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIGEsIFNPQVBfVFlQRV9uc19fZWNob1N0cnVjdFJlc3BvbnNlKSwgdHlwZSk7CisJc29hcF9lbGVtZW50X3Jlc3VsdChzb2FwLCAicmV0dXJuIik7CisJc29hcF9vdXRfc19fU09BUFN0cnVjdChzb2FwLCAicmV0dXJuIiwgLTEsICZhLT5fcmV0dXJuLCAiIik7CisJc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKKwlyZXR1cm4gU09BUF9PSzsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RSZXNwb25zZSAqIFNPQVBfRk1BQzQgc29hcF9nZXRfbnNfX2VjaG9TdHJ1Y3RSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvU3RydWN0UmVzcG9uc2UgKnAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoKHAgPSBzb2FwX2luX25zX19lY2hvU3RydWN0UmVzcG9uc2Uoc29hcCwgdGFnLCBwLCB0eXBlKSkpCisJCXNvYXBfZ2V0aW5kZXBlbmRlbnQoc29hcCk7CisJcmV0dXJuIHA7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvU3RydWN0UmVzcG9uc2UgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fbnNfX2VjaG9TdHJ1Y3RSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RSZXNwb25zZSAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlzaG9ydCBzb2FwX2ZsYWdfX3JldHVybiA9IDE7CisJaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoKnNvYXAtPnR5cGUgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkpCisJewlzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWEgPSAoc3RydWN0IG5zX19lY2hvU3RydWN0UmVzcG9uc2UgKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBhLCBTT0FQX1RZUEVfbnNfX2VjaG9TdHJ1Y3RSZXNwb25zZSwgc2l6ZW9mKHN0cnVjdCBuc19fZWNob1N0cnVjdFJlc3BvbnNlKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJaWYgKCFhKQorCQlyZXR1cm4gTlVMTDsKKwlzb2FwX2RlZmF1bHRfbnNfX2VjaG9TdHJ1Y3RSZXNwb25zZShzb2FwLCBhKTsKKwlpZiAoc29hcC0+Ym9keSAmJiAhKnNvYXAtPmhyZWYpCisJeworCQlmb3IgKDs7KQorCQl7CXNvYXAtPmVycm9yID0gU09BUF9UQUdfTUlTTUFUQ0g7CisJCQlpZiAoc29hcF9mbGFnX19yZXR1cm4gJiYgc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJaWYgKHNvYXBfaW5fc19fU09BUFN0cnVjdChzb2FwLCBOVUxMLCAmYS0+X3JldHVybiwgInM6U09BUFN0cnVjdCIpKQorCQkJCXsJc29hcF9mbGFnX19yZXR1cm4tLTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCXNvYXAtPmVycm9yID0gc29hcF9pZ25vcmVfZWxlbWVudChzb2FwKTsKKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykKKwkJCQlicmVhazsKKwkJCWlmIChzb2FwLT5lcnJvcikKKwkJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIChzb2FwX2ZsYWdfX3JldHVybiA+IDApKQorCQl7CXNvYXAtPmVycm9yID0gU09BUF9PQ0NVUlM7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCWVsc2UKKwl7CWEgPSAoc3RydWN0IG5zX19lY2hvU3RydWN0UmVzcG9uc2UgKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilhLCAwLCBTT0FQX1RZUEVfbnNfX2VjaG9TdHJ1Y3RSZXNwb25zZSwgMCwgc2l6ZW9mKHN0cnVjdCBuc19fZWNob1N0cnVjdFJlc3BvbnNlKSwgMCwgTlVMTCk7CisJCWlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gYTsKK30KKworU09BUF9GTUFDNSBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RSZXNwb25zZSAqIFNPQVBfRk1BQzYgc29hcF9uZXdfbnNfX2VjaG9TdHJ1Y3RSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4pCit7CXJldHVybiBzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvU3RydWN0UmVzcG9uc2Uoc29hcCwgbiwgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX25zX19lY2hvU3RydWN0UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob1N0cnVjdFJlc3BvbnNlICpwKQorewlzb2FwX2RlbGV0ZShzb2FwLCBwKTsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RSZXNwb25zZSAqIFNPQVBfRk1BQzQgc29hcF9pbnN0YW50aWF0ZV9uc19fZWNob1N0cnVjdFJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbiwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqYXJyYXlUeXBlLCBzaXplX3QgKnNpemUpCit7CisJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvU3RydWN0UmVzcG9uc2UoJWQsICVzLCAlcylcbiIsIG4sIHR5cGU/dHlwZToiIiwgYXJyYXlUeXBlP2FycmF5VHlwZToiIikpOworCXN0cnVjdCBzb2FwX2NsaXN0ICpjcCA9IHNvYXBfbGluayhzb2FwLCBOVUxMLCBTT0FQX1RZUEVfbnNfX2VjaG9TdHJ1Y3RSZXNwb25zZSwgbiwgc29hcF9mZGVsZXRlKTsKKwlpZiAoIWNwKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAobiA8IDApCisJewljcC0+cHRyID0gKHZvaWQqKW5ldyBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RSZXNwb25zZTsKKwkJaWYgKHNpemUpCisJCQkqc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RSZXNwb25zZSk7CisJfQorCWVsc2UKKwl7CWNwLT5wdHIgPSAodm9pZCopbmV3IHN0cnVjdCBuc19fZWNob1N0cnVjdFJlc3BvbnNlW25dOworCQlpZiAoc2l6ZSkKKwkJCSpzaXplID0gbiAqIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RSZXNwb25zZSk7CisJfQorCQlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluc3RhbnRpYXRlZCBsb2NhdGlvbj0lcFxuIiwgY3AtPnB0cikpOworCXJldHVybiAoc3RydWN0IG5zX19lY2hvU3RydWN0UmVzcG9uc2UqKWNwLT5wdHI7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfY29weV9uc19fZWNob1N0cnVjdFJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3QsIGludCB0dCwgdm9pZCAqcCwgc2l6ZV90IGxlbiwgY29uc3Qgdm9pZCAqcSwgc2l6ZV90IG4pCit7CisJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5aW5nIHN0cnVjdCBuc19fZWNob1N0cnVjdFJlc3BvbnNlICVwIC0+ICVwXG4iLCBxLCBwKSk7CisJKihzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RSZXNwb25zZSopcCA9ICooc3RydWN0IG5zX19lY2hvU3RydWN0UmVzcG9uc2UqKXE7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX3NfX1NPQVBTdHJ1Y3Qoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBzX19TT0FQU3RydWN0ICphKQoreworCSh2b2lkKXNvYXA7ICh2b2lkKWE7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLworCXNvYXBfc2VyaWFsaXplX3hzZF9fc3RyaW5nKHNvYXAsICZhLT52YXJTdHJpbmcpOworCXNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3hzZF9faW50KHNvYXAsICZhLT52YXJJbnQpOworCXNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3hzZF9fZmxvYXQoc29hcCwgJmEtPnZhckZsb2F0KTsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X3NfX1NPQVBTdHJ1Y3Qoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzX19TT0FQU3RydWN0ICphKQoreworCSh2b2lkKXNvYXA7ICh2b2lkKWE7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLworCXNvYXBfZGVmYXVsdF94c2RfX3N0cmluZyhzb2FwLCAmYS0+dmFyU3RyaW5nKTsKKwlhLT52YXJJbnQgPSBOVUxMOworCWEtPnZhckZsb2F0ID0gTlVMTDsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9zX19TT0FQU3RydWN0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3Qgc19fU09BUFN0cnVjdCAqYSwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCXJlZ2lzdGVyIGludCBpZCA9IHNvYXBfZW1iZWQoc29hcCwgKHZvaWQqKWEsIE5VTEwsIDAsIHRhZywgU09BUF9UWVBFX3NfX1NPQVBTdHJ1Y3QpOworCWlmIChzb2FwX291dF9zX19TT0FQU3RydWN0KHNvYXAsIHRhZywgaWQsIGEsIHR5cGUpKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJcmV0dXJuIHNvYXBfcHV0aW5kZXBlbmRlbnQoc29hcCk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfc19fU09BUFN0cnVjdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHN0cnVjdCBzX19TT0FQU3RydWN0ICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBhLCBTT0FQX1RZUEVfc19fU09BUFN0cnVjdCksIHR5cGUpOworCXNvYXBfb3V0X3hzZF9fc3RyaW5nKHNvYXAsICJ2YXJTdHJpbmciLCAtMSwgJmEtPnZhclN0cmluZywgIiIpOworCXNvYXBfb3V0X1BvaW50ZXJUb3hzZF9faW50KHNvYXAsICJ2YXJJbnQiLCAtMSwgJmEtPnZhckludCwgIiIpOworCXNvYXBfb3V0X1BvaW50ZXJUb3hzZF9fZmxvYXQoc29hcCwgInZhckZsb2F0IiwgLTEsICZhLT52YXJGbG9hdCwgIiIpOworCXNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7CisJcmV0dXJuIFNPQVBfT0s7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IHNfX1NPQVBTdHJ1Y3QgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3NfX1NPQVBTdHJ1Y3Qoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzX19TT0FQU3RydWN0ICpwLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKChwID0gc29hcF9pbl9zX19TT0FQU3RydWN0KHNvYXAsIHRhZywgcCwgdHlwZSkpKQorCQlzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOworCXJldHVybiBwOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBzX19TT0FQU3RydWN0ICogU09BUF9GTUFDNCBzb2FwX2luX3NfX1NPQVBTdHJ1Y3Qoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc3RydWN0IHNfX1NPQVBTdHJ1Y3QgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc2hvcnQgc29hcF9mbGFnX3ZhclN0cmluZyA9IDEsIHNvYXBfZmxhZ192YXJJbnQgPSAxLCBzb2FwX2ZsYWdfdmFyRmxvYXQgPSAxOworCWlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCpzb2FwLT50eXBlICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpKQorCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisJCXJldHVybiBOVUxMOworCX0KKwlhID0gKHN0cnVjdCBzX19TT0FQU3RydWN0ICopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgYSwgU09BUF9UWVBFX3NfX1NPQVBTdHJ1Y3QsIHNpemVvZihzdHJ1Y3Qgc19fU09BUFN0cnVjdCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworCWlmICghYSkKKwkJcmV0dXJuIE5VTEw7CisJc29hcF9kZWZhdWx0X3NfX1NPQVBTdHJ1Y3Qoc29hcCwgYSk7CisJaWYgKHNvYXAtPmJvZHkgJiYgISpzb2FwLT5ocmVmKQorCXsKKwkJZm9yICg7OykKKwkJewlzb2FwLT5lcnJvciA9IFNPQVBfVEFHX01JU01BVENIOworCQkJaWYgKHNvYXBfZmxhZ192YXJTdHJpbmcgJiYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIIHx8IHNvYXAtPmVycm9yID09IFNPQVBfTk9fVEFHKSkKKwkJCQlpZiAoc29hcF9pbl94c2RfX3N0cmluZyhzb2FwLCAidmFyU3RyaW5nIiwgJmEtPnZhclN0cmluZywgInhzZDpzdHJpbmciKSkKKwkJCQl7CXNvYXBfZmxhZ192YXJTdHJpbmctLTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXBfZmxhZ192YXJJbnQgJiYgc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJaWYgKHNvYXBfaW5fUG9pbnRlclRveHNkX19pbnQoc29hcCwgInZhckludCIsICZhLT52YXJJbnQsICJ4c2Q6aW50IikpCisJCQkJewlzb2FwX2ZsYWdfdmFySW50LS07CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCWlmIChzb2FwX2ZsYWdfdmFyRmxvYXQgJiYgc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJaWYgKHNvYXBfaW5fUG9pbnRlclRveHNkX19mbG9hdChzb2FwLCAidmFyRmxvYXQiLCAmYS0+dmFyRmxvYXQsICJ4c2Q6ZmxvYXQiKSkKKwkJCQl7CXNvYXBfZmxhZ192YXJGbG9hdC0tOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQlpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJc29hcC0+ZXJyb3IgPSBzb2FwX2lnbm9yZV9lbGVtZW50KHNvYXApOworCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfTk9fVEFHKQorCQkJCWJyZWFrOworCQkJaWYgKHNvYXAtPmVycm9yKQorCQkJCXJldHVybiBOVUxMOworCQl9CisJCWlmIChzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJZWxzZQorCXsJYSA9IChzdHJ1Y3Qgc19fU09BUFN0cnVjdCAqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCAodm9pZCoqKWEsIDAsIFNPQVBfVFlQRV9zX19TT0FQU3RydWN0LCAwLCBzaXplb2Yoc3RydWN0IHNfX1NPQVBTdHJ1Y3QpLCAwLCBOVUxMKTsKKwkJaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBhOworfQorCitTT0FQX0ZNQUM1IHN0cnVjdCBzX19TT0FQU3RydWN0ICogU09BUF9GTUFDNiBzb2FwX25ld19zX19TT0FQU3RydWN0KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbikKK3sJcmV0dXJuIHNvYXBfaW5zdGFudGlhdGVfc19fU09BUFN0cnVjdChzb2FwLCBuLCBOVUxMLCBOVUxMLCBOVUxMKTsKK30KKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfc19fU09BUFN0cnVjdChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNfX1NPQVBTdHJ1Y3QgKnApCit7CXNvYXBfZGVsZXRlKHNvYXAsIHApOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBzX19TT0FQU3RydWN0ICogU09BUF9GTUFDNCBzb2FwX2luc3RhbnRpYXRlX3NfX1NPQVBTdHJ1Y3Qoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICphcnJheVR5cGUsIHNpemVfdCAqc2l6ZSkKK3sKKwlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgInNvYXBfaW5zdGFudGlhdGVfc19fU09BUFN0cnVjdCglZCwgJXMsICVzKVxuIiwgbiwgdHlwZT90eXBlOiIiLCBhcnJheVR5cGU/YXJyYXlUeXBlOiIiKSk7CisJc3RydWN0IHNvYXBfY2xpc3QgKmNwID0gc29hcF9saW5rKHNvYXAsIE5VTEwsIFNPQVBfVFlQRV9zX19TT0FQU3RydWN0LCBuLCBzb2FwX2ZkZWxldGUpOworCWlmICghY3ApCisJCXJldHVybiBOVUxMOworCWlmIChuIDwgMCkKKwl7CWNwLT5wdHIgPSAodm9pZCopbmV3IHN0cnVjdCBzX19TT0FQU3RydWN0OworCQlpZiAoc2l6ZSkKKwkJCSpzaXplID0gc2l6ZW9mKHN0cnVjdCBzX19TT0FQU3RydWN0KTsKKwl9CisJZWxzZQorCXsJY3AtPnB0ciA9ICh2b2lkKiluZXcgc3RydWN0IHNfX1NPQVBTdHJ1Y3Rbbl07CisJCWlmIChzaXplKQorCQkJKnNpemUgPSBuICogc2l6ZW9mKHN0cnVjdCBzX19TT0FQU3RydWN0KTsKKwl9CisJCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5zdGFudGlhdGVkIGxvY2F0aW9uPSVwXG4iLCBjcC0+cHRyKSk7CisJcmV0dXJuIChzdHJ1Y3Qgc19fU09BUFN0cnVjdCopY3AtPnB0cjsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9jb3B5X3NfX1NPQVBTdHJ1Y3Qoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdCwgaW50IHR0LCB2b2lkICpwLCBzaXplX3QgbGVuLCBjb25zdCB2b2lkICpxLCBzaXplX3QgbikKK3sKKwlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHlpbmcgc3RydWN0IHNfX1NPQVBTdHJ1Y3QgJXAgLT4gJXBcbiIsIHEsIHApKTsKKwkqKHN0cnVjdCBzX19TT0FQU3RydWN0KilwID0gKihzdHJ1Y3Qgc19fU09BUFN0cnVjdCopcTsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfbnNfX2VjaG9GbG9hdEFycmF5KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG9GbG9hdEFycmF5ICphKQoreworCSh2b2lkKXNvYXA7ICh2b2lkKWE7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLworCXNvYXBfc2VyaWFsaXplX0FycmF5T2ZmbG9hdChzb2FwLCAmYS0+aW5wdXRGbG9hdEFycmF5KTsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X25zX19lY2hvRmxvYXRBcnJheShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvRmxvYXRBcnJheSAqYSkKK3sKKwkodm9pZClzb2FwOyAodm9pZClhOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8KKwlzb2FwX2RlZmF1bHRfQXJyYXlPZmZsb2F0KHNvYXAsICZhLT5pbnB1dEZsb2F0QXJyYXkpOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X25zX19lY2hvRmxvYXRBcnJheShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IG5zX19lY2hvRmxvYXRBcnJheSAqYSwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCXJlZ2lzdGVyIGludCBpZCA9IHNvYXBfZW1iZWQoc29hcCwgKHZvaWQqKWEsIE5VTEwsIDAsIHRhZywgU09BUF9UWVBFX25zX19lY2hvRmxvYXRBcnJheSk7CisJaWYgKHNvYXBfb3V0X25zX19lY2hvRmxvYXRBcnJheShzb2FwLCB0YWcsIGlkLCBhLCB0eXBlKSkKKwkJcmV0dXJuIHNvYXAtPmVycm9yOworCXJldHVybiBzb2FwX3B1dGluZGVwZW5kZW50KHNvYXApOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X25zX19lY2hvRmxvYXRBcnJheShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHN0cnVjdCBuc19fZWNob0Zsb2F0QXJyYXkgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIGEsIFNPQVBfVFlQRV9uc19fZWNob0Zsb2F0QXJyYXkpLCB0eXBlKTsKKwlzb2FwX291dF9BcnJheU9mZmxvYXQoc29hcCwgImlucHV0RmxvYXRBcnJheSIsIC0xLCAmYS0+aW5wdXRGbG9hdEFycmF5LCAiIik7CisJc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKKwlyZXR1cm4gU09BUF9PSzsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9GbG9hdEFycmF5ICogU09BUF9GTUFDNCBzb2FwX2dldF9uc19fZWNob0Zsb2F0QXJyYXkoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob0Zsb2F0QXJyYXkgKnAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoKHAgPSBzb2FwX2luX25zX19lY2hvRmxvYXRBcnJheShzb2FwLCB0YWcsIHAsIHR5cGUpKSkKKwkJc29hcF9nZXRpbmRlcGVuZGVudChzb2FwKTsKKwlyZXR1cm4gcDsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9GbG9hdEFycmF5ICogU09BUF9GTUFDNCBzb2FwX2luX25zX19lY2hvRmxvYXRBcnJheShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzdHJ1Y3QgbnNfX2VjaG9GbG9hdEFycmF5ICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXNob3J0IHNvYXBfZmxhZ19pbnB1dEZsb2F0QXJyYXkgPSAxOworCWlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCpzb2FwLT50eXBlICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpKQorCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisJCXJldHVybiBOVUxMOworCX0KKwlhID0gKHN0cnVjdCBuc19fZWNob0Zsb2F0QXJyYXkgKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBhLCBTT0FQX1RZUEVfbnNfX2VjaG9GbG9hdEFycmF5LCBzaXplb2Yoc3RydWN0IG5zX19lY2hvRmxvYXRBcnJheSksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworCWlmICghYSkKKwkJcmV0dXJuIE5VTEw7CisJc29hcF9kZWZhdWx0X25zX19lY2hvRmxvYXRBcnJheShzb2FwLCBhKTsKKwlpZiAoc29hcC0+Ym9keSAmJiAhKnNvYXAtPmhyZWYpCisJeworCQlmb3IgKDs7KQorCQl7CXNvYXAtPmVycm9yID0gU09BUF9UQUdfTUlTTUFUQ0g7CisJCQlpZiAoc29hcF9mbGFnX2lucHV0RmxvYXRBcnJheSAmJiBzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlpZiAoc29hcF9pbl9BcnJheU9mZmxvYXQoc29hcCwgImlucHV0RmxvYXRBcnJheSIsICZhLT5pbnB1dEZsb2F0QXJyYXksICJ4c2Q6ZmxvYXQiKSkKKwkJCQl7CXNvYXBfZmxhZ19pbnB1dEZsb2F0QXJyYXktLTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCXNvYXAtPmVycm9yID0gc29hcF9pZ25vcmVfZWxlbWVudChzb2FwKTsKKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykKKwkJCQlicmVhazsKKwkJCWlmIChzb2FwLT5lcnJvcikKKwkJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIChzb2FwX2ZsYWdfaW5wdXRGbG9hdEFycmF5ID4gMCkpCisJCXsJc29hcC0+ZXJyb3IgPSBTT0FQX09DQ1VSUzsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWlmIChzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJZWxzZQorCXsJYSA9IChzdHJ1Y3QgbnNfX2VjaG9GbG9hdEFycmF5ICopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopYSwgMCwgU09BUF9UWVBFX25zX19lY2hvRmxvYXRBcnJheSwgMCwgc2l6ZW9mKHN0cnVjdCBuc19fZWNob0Zsb2F0QXJyYXkpLCAwLCBOVUxMKTsKKwkJaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBhOworfQorCitTT0FQX0ZNQUM1IHN0cnVjdCBuc19fZWNob0Zsb2F0QXJyYXkgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X25zX19lY2hvRmxvYXRBcnJheShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4pCit7CXJldHVybiBzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvRmxvYXRBcnJheShzb2FwLCBuLCBOVUxMLCBOVUxMLCBOVUxMKTsKK30KKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfbnNfX2VjaG9GbG9hdEFycmF5KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2VjaG9GbG9hdEFycmF5ICpwKQorewlzb2FwX2RlbGV0ZShzb2FwLCBwKTsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9GbG9hdEFycmF5ICogU09BUF9GTUFDNCBzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvRmxvYXRBcnJheShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4sIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmFycmF5VHlwZSwgc2l6ZV90ICpzaXplKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAic29hcF9pbnN0YW50aWF0ZV9uc19fZWNob0Zsb2F0QXJyYXkoJWQsICVzLCAlcylcbiIsIG4sIHR5cGU/dHlwZToiIiwgYXJyYXlUeXBlP2FycmF5VHlwZToiIikpOworCXN0cnVjdCBzb2FwX2NsaXN0ICpjcCA9IHNvYXBfbGluayhzb2FwLCBOVUxMLCBTT0FQX1RZUEVfbnNfX2VjaG9GbG9hdEFycmF5LCBuLCBzb2FwX2ZkZWxldGUpOworCWlmICghY3ApCisJCXJldHVybiBOVUxMOworCWlmIChuIDwgMCkKKwl7CWNwLT5wdHIgPSAodm9pZCopbmV3IHN0cnVjdCBuc19fZWNob0Zsb2F0QXJyYXk7CisJCWlmIChzaXplKQorCQkJKnNpemUgPSBzaXplb2Yoc3RydWN0IG5zX19lY2hvRmxvYXRBcnJheSk7CisJfQorCWVsc2UKKwl7CWNwLT5wdHIgPSAodm9pZCopbmV3IHN0cnVjdCBuc19fZWNob0Zsb2F0QXJyYXlbbl07CisJCWlmIChzaXplKQorCQkJKnNpemUgPSBuICogc2l6ZW9mKHN0cnVjdCBuc19fZWNob0Zsb2F0QXJyYXkpOworCX0KKwkJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbnN0YW50aWF0ZWQgbG9jYXRpb249JXBcbiIsIGNwLT5wdHIpKTsKKwlyZXR1cm4gKHN0cnVjdCBuc19fZWNob0Zsb2F0QXJyYXkqKWNwLT5wdHI7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfY29weV9uc19fZWNob0Zsb2F0QXJyYXkoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdCwgaW50IHR0LCB2b2lkICpwLCBzaXplX3QgbGVuLCBjb25zdCB2b2lkICpxLCBzaXplX3QgbikKK3sKKwlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHlpbmcgc3RydWN0IG5zX19lY2hvRmxvYXRBcnJheSAlcCAtPiAlcFxuIiwgcSwgcCkpOworCSooc3RydWN0IG5zX19lY2hvRmxvYXRBcnJheSopcCA9ICooc3RydWN0IG5zX19lY2hvRmxvYXRBcnJheSopcTsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfbnNfX2VjaG9GbG9hdEFycmF5UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBuc19fZWNob0Zsb2F0QXJyYXlSZXNwb25zZSAqYSkKK3sKKwkodm9pZClzb2FwOyAodm9pZClhOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8KKwlzb2FwX3NlcmlhbGl6ZV9BcnJheU9mZmxvYXQoc29hcCwgJmEtPl9yZXR1cm4pOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfbnNfX2VjaG9GbG9hdEFycmF5UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob0Zsb2F0QXJyYXlSZXNwb25zZSAqYSkKK3sKKwkodm9pZClzb2FwOyAodm9pZClhOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8KKwlzb2FwX2RlZmF1bHRfQXJyYXlPZmZsb2F0KHNvYXAsICZhLT5fcmV0dXJuKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9uc19fZWNob0Zsb2F0QXJyYXlSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IG5zX19lY2hvRmxvYXRBcnJheVJlc3BvbnNlICphLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmVnaXN0ZXIgaW50IGlkID0gc29hcF9lbWJlZChzb2FwLCAodm9pZCopYSwgTlVMTCwgMCwgdGFnLCBTT0FQX1RZUEVfbnNfX2VjaG9GbG9hdEFycmF5UmVzcG9uc2UpOworCWlmIChzb2FwX291dF9uc19fZWNob0Zsb2F0QXJyYXlSZXNwb25zZShzb2FwLCB0YWcsIGlkLCBhLCB0eXBlKSkKKwkJcmV0dXJuIHNvYXAtPmVycm9yOworCXJldHVybiBzb2FwX3B1dGluZGVwZW5kZW50KHNvYXApOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X25zX19lY2hvRmxvYXRBcnJheVJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgc3RydWN0IG5zX19lY2hvRmxvYXRBcnJheVJlc3BvbnNlICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBhLCBTT0FQX1RZUEVfbnNfX2VjaG9GbG9hdEFycmF5UmVzcG9uc2UpLCB0eXBlKTsKKwlzb2FwX2VsZW1lbnRfcmVzdWx0KHNvYXAsICJyZXR1cm4iKTsKKwlzb2FwX291dF9BcnJheU9mZmxvYXQoc29hcCwgInJldHVybiIsIC0xLCAmYS0+X3JldHVybiwgIiIpOworCXNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7CisJcmV0dXJuIFNPQVBfT0s7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvRmxvYXRBcnJheVJlc3BvbnNlICogU09BUF9GTUFDNCBzb2FwX2dldF9uc19fZWNob0Zsb2F0QXJyYXlSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvRmxvYXRBcnJheVJlc3BvbnNlICpwLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKChwID0gc29hcF9pbl9uc19fZWNob0Zsb2F0QXJyYXlSZXNwb25zZShzb2FwLCB0YWcsIHAsIHR5cGUpKSkKKwkJc29hcF9nZXRpbmRlcGVuZGVudChzb2FwKTsKKwlyZXR1cm4gcDsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9GbG9hdEFycmF5UmVzcG9uc2UgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fbnNfX2VjaG9GbG9hdEFycmF5UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc3RydWN0IG5zX19lY2hvRmxvYXRBcnJheVJlc3BvbnNlICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXNob3J0IHNvYXBfZmxhZ19fcmV0dXJuID0gMTsKKwlpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisJCXJldHVybiBOVUxMOworCWlmICgqc29hcC0+dHlwZSAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKSkKKwl7CXNvYXAtPmVycm9yID0gU09BUF9UWVBFOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYSA9IChzdHJ1Y3QgbnNfX2VjaG9GbG9hdEFycmF5UmVzcG9uc2UgKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBhLCBTT0FQX1RZUEVfbnNfX2VjaG9GbG9hdEFycmF5UmVzcG9uc2UsIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9GbG9hdEFycmF5UmVzcG9uc2UpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwlpZiAoIWEpCisJCXJldHVybiBOVUxMOworCXNvYXBfZGVmYXVsdF9uc19fZWNob0Zsb2F0QXJyYXlSZXNwb25zZShzb2FwLCBhKTsKKwlpZiAoc29hcC0+Ym9keSAmJiAhKnNvYXAtPmhyZWYpCisJeworCQlmb3IgKDs7KQorCQl7CXNvYXAtPmVycm9yID0gU09BUF9UQUdfTUlTTUFUQ0g7CisJCQlpZiAoc29hcF9mbGFnX19yZXR1cm4gJiYgc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJaWYgKHNvYXBfaW5fQXJyYXlPZmZsb2F0KHNvYXAsIE5VTEwsICZhLT5fcmV0dXJuLCAieHNkOmZsb2F0IikpCisJCQkJewlzb2FwX2ZsYWdfX3JldHVybi0tOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQlpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJc29hcC0+ZXJyb3IgPSBzb2FwX2lnbm9yZV9lbGVtZW50KHNvYXApOworCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfTk9fVEFHKQorCQkJCWJyZWFrOworCQkJaWYgKHNvYXAtPmVycm9yKQorCQkJCXJldHVybiBOVUxMOworCQl9CisJCWlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgKHNvYXBfZmxhZ19fcmV0dXJuID4gMCkpCisJCXsJc29hcC0+ZXJyb3IgPSBTT0FQX09DQ1VSUzsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWlmIChzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJZWxzZQorCXsJYSA9IChzdHJ1Y3QgbnNfX2VjaG9GbG9hdEFycmF5UmVzcG9uc2UgKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilhLCAwLCBTT0FQX1RZUEVfbnNfX2VjaG9GbG9hdEFycmF5UmVzcG9uc2UsIDAsIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9GbG9hdEFycmF5UmVzcG9uc2UpLCAwLCBOVUxMKTsKKwkJaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBhOworfQorCitTT0FQX0ZNQUM1IHN0cnVjdCBuc19fZWNob0Zsb2F0QXJyYXlSZXNwb25zZSAqIFNPQVBfRk1BQzYgc29hcF9uZXdfbnNfX2VjaG9GbG9hdEFycmF5UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuKQorewlyZXR1cm4gc29hcF9pbnN0YW50aWF0ZV9uc19fZWNob0Zsb2F0QXJyYXlSZXNwb25zZShzb2FwLCBuLCBOVUxMLCBOVUxMLCBOVUxMKTsKK30KKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfbnNfX2VjaG9GbG9hdEFycmF5UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob0Zsb2F0QXJyYXlSZXNwb25zZSAqcCkKK3sJc29hcF9kZWxldGUoc29hcCwgcCk7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvRmxvYXRBcnJheVJlc3BvbnNlICogU09BUF9GTUFDNCBzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvRmxvYXRBcnJheVJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbiwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqYXJyYXlUeXBlLCBzaXplX3QgKnNpemUpCit7CisJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvRmxvYXRBcnJheVJlc3BvbnNlKCVkLCAlcywgJXMpXG4iLCBuLCB0eXBlP3R5cGU6IiIsIGFycmF5VHlwZT9hcnJheVR5cGU6IiIpKTsKKwlzdHJ1Y3Qgc29hcF9jbGlzdCAqY3AgPSBzb2FwX2xpbmsoc29hcCwgTlVMTCwgU09BUF9UWVBFX25zX19lY2hvRmxvYXRBcnJheVJlc3BvbnNlLCBuLCBzb2FwX2ZkZWxldGUpOworCWlmICghY3ApCisJCXJldHVybiBOVUxMOworCWlmIChuIDwgMCkKKwl7CWNwLT5wdHIgPSAodm9pZCopbmV3IHN0cnVjdCBuc19fZWNob0Zsb2F0QXJyYXlSZXNwb25zZTsKKwkJaWYgKHNpemUpCisJCQkqc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9GbG9hdEFycmF5UmVzcG9uc2UpOworCX0KKwllbHNlCisJewljcC0+cHRyID0gKHZvaWQqKW5ldyBzdHJ1Y3QgbnNfX2VjaG9GbG9hdEFycmF5UmVzcG9uc2Vbbl07CisJCWlmIChzaXplKQorCQkJKnNpemUgPSBuICogc2l6ZW9mKHN0cnVjdCBuc19fZWNob0Zsb2F0QXJyYXlSZXNwb25zZSk7CisJfQorCQlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluc3RhbnRpYXRlZCBsb2NhdGlvbj0lcFxuIiwgY3AtPnB0cikpOworCXJldHVybiAoc3RydWN0IG5zX19lY2hvRmxvYXRBcnJheVJlc3BvbnNlKiljcC0+cHRyOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2NvcHlfbnNfX2VjaG9GbG9hdEFycmF5UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdCwgaW50IHR0LCB2b2lkICpwLCBzaXplX3QgbGVuLCBjb25zdCB2b2lkICpxLCBzaXplX3QgbikKK3sKKwlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHlpbmcgc3RydWN0IG5zX19lY2hvRmxvYXRBcnJheVJlc3BvbnNlICVwIC0+ICVwXG4iLCBxLCBwKSk7CisJKihzdHJ1Y3QgbnNfX2VjaG9GbG9hdEFycmF5UmVzcG9uc2UqKXAgPSAqKHN0cnVjdCBuc19fZWNob0Zsb2F0QXJyYXlSZXNwb25zZSopcTsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfQXJyYXlPZmZsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgQXJyYXlPZmZsb2F0IGNvbnN0KmEpCit7CisJaW50IGk7CisJaWYgKGEtPl9fcHRyICYmICFzb2FwX2FycmF5X3JlZmVyZW5jZShzb2FwLCBhLCAoc3RydWN0IHNvYXBfYXJyYXkqKSZhLT5fX3B0ciwgMSwgU09BUF9UWVBFX0FycmF5T2ZmbG9hdCkpCisJCWZvciAoaSA9IDA7IGkgPCBhLT5fX3NpemU7IGkrKykKKwkJeworCQkJc29hcF9zZXJpYWxpemVfUG9pbnRlclRveHNkX19mbG9hdChzb2FwLCBhLT5fX3B0ciArIGkpOworCQl9Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9BcnJheU9mZmxvYXQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBBcnJheU9mZmxvYXQgKmEpCit7CisJYS0+X19zaXplID0gMDsKKwlhLT5fX3B0ciA9IE5VTEw7CisJYS0+X19vZmZzZXQgPSAwOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X0FycmF5T2ZmbG9hdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IEFycmF5T2ZmbG9hdCAqYSwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCXJlZ2lzdGVyIGludCBpZCA9IHNvYXBfZW1iZWQoc29hcCwgKHZvaWQqKWEsIChzdHJ1Y3Qgc29hcF9hcnJheSopJmEtPl9fcHRyLCAxLCB0YWcsIFNPQVBfVFlQRV9BcnJheU9mZmxvYXQpOworCWlmIChzb2FwX291dF9BcnJheU9mZmxvYXQoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9BcnJheU9mZmxvYXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzdHJ1Y3QgQXJyYXlPZmZsb2F0ICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCWludCBpLCBuID0gYS0+X19zaXplOworCWNoYXIgKnQgPSBzb2FwX3B1dHNpemUoc29hcCwgInhzZDpmbG9hdCIsIG4gKyBhLT5fX29mZnNldCk7CisJaWQgPSBzb2FwX2VsZW1lbnRfaWQoc29hcCwgdGFnLCBpZCwgYSwgKHN0cnVjdCBzb2FwX2FycmF5KikmYS0+X19wdHIsIDEsIHR5cGUsIFNPQVBfVFlQRV9BcnJheU9mZmxvYXQpOworCWlmIChpZCA8IDApCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlzb2FwX2FycmF5X2JlZ2luX291dChzb2FwLCB0YWcsIGlkLCB0LCBzb2FwX3B1dG9mZnNldChzb2FwLCBhLT5fX29mZnNldCkpOworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJeworCQlzb2FwLT5wb3NpdGlvbiA9IDE7CisJCXNvYXAtPnBvc2l0aW9uc1swXSA9IGk7CisJCXNvYXBfb3V0X1BvaW50ZXJUb3hzZF9fZmxvYXQoc29hcCwgIml0ZW0iLCAtMSwgJmEtPl9fcHRyW2ldLCAiIik7CisJfQorCXNvYXAtPnBvc2l0aW9uID0gMDsKKwlzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworCXJldHVybiBTT0FQX09LOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBBcnJheU9mZmxvYXQgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X0FycmF5T2ZmbG9hdChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IEFycmF5T2ZmbG9hdCAqcCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmICgocCA9IHNvYXBfaW5fQXJyYXlPZmZsb2F0KHNvYXAsIHRhZywgcCwgdHlwZSkpKQorCQlzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOworCXJldHVybiBwOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBBcnJheU9mZmxvYXQgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fQXJyYXlPZmZsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHN0cnVjdCBBcnJheU9mZmxvYXQgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CWludCBpLCBqOworCWZsb2F0ICoqcDsKKwlpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMSkpCisJCXJldHVybiBOVUxMOworCWlmIChzb2FwX21hdGNoX2FycmF5KHNvYXAsIHR5cGUpKQorCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisJCXJldHVybiBOVUxMOworCX0KKwlhID0gKHN0cnVjdCBBcnJheU9mZmxvYXQgKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBhLCBTT0FQX1RZUEVfQXJyYXlPZmZsb2F0LCBzaXplb2Yoc3RydWN0IEFycmF5T2ZmbG9hdCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworCWlmICghYSkKKwkJcmV0dXJuIE5VTEw7CisJc29hcF9kZWZhdWx0X0FycmF5T2ZmbG9hdChzb2FwLCBhKTsKKwlpZiAoc29hcC0+Ym9keSAmJiAhKnNvYXAtPmhyZWYpCisJeworCQlhLT5fX3NpemUgPSBzb2FwX2dldHNpemUoc29hcC0+YXJyYXlTaXplLCBzb2FwLT5hcnJheU9mZnNldCwgJmopOworCQlhLT5fX29mZnNldCA9IGo7CisJCWlmIChhLT5fX3NpemUgPj0gMCkKKwkJewlhLT5fX3B0ciA9IChmbG9hdCAqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2YoZmxvYXQgKikgKiBhLT5fX3NpemUpOworCQkJZm9yIChpID0gMDsgaSA8IGEtPl9fc2l6ZTsgaSsrKQorCQkJCWEtPl9fcHRyW2ldID0gTlVMTDsKKwkJCWZvciAoaSA9IDA7IGkgPCBhLT5fX3NpemU7IGkrKykKKwkJCXsJc29hcF9wZWVrX2VsZW1lbnQoc29hcCk7CisJCQkJaWYgKHNvYXAtPnBvc2l0aW9uKQorCQkJCXsJaSA9IHNvYXAtPnBvc2l0aW9uc1swXS1qOworCQkJCQlpZiAoaSA8IDAgfHwgaSA+PSBhLT5fX3NpemUpCisJCQkJCXsJc29hcC0+ZXJyb3IgPSBTT0FQX0lPQjsKKwkJCQkJCXJldHVybiBOVUxMOworCQkJCQl9CisJCQkJfQorCQkJCWlmICghc29hcF9pbl9Qb2ludGVyVG94c2RfX2Zsb2F0KHNvYXAsIE5VTEwsIGEtPl9fcHRyICsgaSwgInhzZDpmbG9hdCIpKQorCQkJCXsJaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfTk9fVEFHKQorCQkJCQkJcmV0dXJuIE5VTEw7CisJCQkJCXNvYXAtPmVycm9yID0gU09BUF9PSzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJewlzb2FwX25ld19ibG9jayhzb2FwKTsKKwkJCWZvciAoYS0+X19zaXplID0gMDsgOyBhLT5fX3NpemUrKykKKwkJCXsJcCA9IChmbG9hdCAqKilzb2FwX3B1c2hfYmxvY2soc29hcCwgc2l6ZW9mKGZsb2F0ICopKTsKKwkJCQlpZiAoIXApCisJCQkJCXJldHVybiBOVUxMOworCQkJCSpwID0gTlVMTDsKKwkJCQlpZiAoIXNvYXBfaW5fUG9pbnRlclRveHNkX19mbG9hdChzb2FwLCBOVUxMLCBwLCAieHNkOmZsb2F0IikpCisJCQkJewlpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9OT19UQUcpCisJCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQkJc29hcC0+ZXJyb3IgPSBTT0FQX09LOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlzb2FwX3BvcF9ibG9jayhzb2FwKTsKKwkJCWEtPl9fcHRyID0gKGZsb2F0ICoqKXNvYXBfbWFsbG9jKHNvYXAsIHNvYXAtPmJsaXN0LT5zaXplKTsKKwkJCXNvYXBfc2F2ZV9ibG9jayhzb2FwLCAoY2hhciopYS0+X19wdHIsIDEpOworCQl9CisJCWlmIChzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJZWxzZQorCXsJYSA9IChzdHJ1Y3QgQXJyYXlPZmZsb2F0ICopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopYSwgMCwgU09BUF9UWVBFX0FycmF5T2ZmbG9hdCwgMCwgc2l6ZW9mKHN0cnVjdCBBcnJheU9mZmxvYXQpLCAwLCBOVUxMKTsKKwkJaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBhOworfQorCitTT0FQX0ZNQUM1IHN0cnVjdCBBcnJheU9mZmxvYXQgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X0FycmF5T2ZmbG9hdChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4pCit7CXJldHVybiBzb2FwX2luc3RhbnRpYXRlX0FycmF5T2ZmbG9hdChzb2FwLCBuLCBOVUxMLCBOVUxMLCBOVUxMKTsKK30KKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfQXJyYXlPZmZsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgQXJyYXlPZmZsb2F0ICpwKQorewlzb2FwX2RlbGV0ZShzb2FwLCBwKTsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgQXJyYXlPZmZsb2F0ICogU09BUF9GTUFDNCBzb2FwX2luc3RhbnRpYXRlX0FycmF5T2ZmbG9hdChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4sIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmFycmF5VHlwZSwgc2l6ZV90ICpzaXplKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAic29hcF9pbnN0YW50aWF0ZV9BcnJheU9mZmxvYXQoJWQsICVzLCAlcylcbiIsIG4sIHR5cGU/dHlwZToiIiwgYXJyYXlUeXBlP2FycmF5VHlwZToiIikpOworCXN0cnVjdCBzb2FwX2NsaXN0ICpjcCA9IHNvYXBfbGluayhzb2FwLCBOVUxMLCBTT0FQX1RZUEVfQXJyYXlPZmZsb2F0LCBuLCBzb2FwX2ZkZWxldGUpOworCWlmICghY3ApCisJCXJldHVybiBOVUxMOworCWlmIChuIDwgMCkKKwl7CWNwLT5wdHIgPSAodm9pZCopbmV3IHN0cnVjdCBBcnJheU9mZmxvYXQ7CisJCWlmIChzaXplKQorCQkJKnNpemUgPSBzaXplb2Yoc3RydWN0IEFycmF5T2ZmbG9hdCk7CisJfQorCWVsc2UKKwl7CWNwLT5wdHIgPSAodm9pZCopbmV3IHN0cnVjdCBBcnJheU9mZmxvYXRbbl07CisJCWlmIChzaXplKQorCQkJKnNpemUgPSBuICogc2l6ZW9mKHN0cnVjdCBBcnJheU9mZmxvYXQpOworCX0KKwkJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbnN0YW50aWF0ZWQgbG9jYXRpb249JXBcbiIsIGNwLT5wdHIpKTsKKwlyZXR1cm4gKHN0cnVjdCBBcnJheU9mZmxvYXQqKWNwLT5wdHI7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfY29weV9BcnJheU9mZmxvYXQoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdCwgaW50IHR0LCB2b2lkICpwLCBzaXplX3QgbGVuLCBjb25zdCB2b2lkICpxLCBzaXplX3QgbikKK3sKKwlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHlpbmcgc3RydWN0IEFycmF5T2ZmbG9hdCAlcCAtPiAlcFxuIiwgcSwgcCkpOworCSooc3RydWN0IEFycmF5T2ZmbG9hdCopcCA9ICooc3RydWN0IEFycmF5T2ZmbG9hdCopcTsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfbnNfX2VjaG9GbG9hdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IG5zX19lY2hvRmxvYXQgKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisJc29hcF9lbWJlZGRlZChzb2FwLCAmYS0+aW5wdXRGbG9hdCwgU09BUF9UWVBFX3hzZF9fZmxvYXQpOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfbnNfX2VjaG9GbG9hdChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvRmxvYXQgKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisJc29hcF9kZWZhdWx0X3hzZF9fZmxvYXQoc29hcCwgJmEtPmlucHV0RmxvYXQpOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X25zX19lY2hvRmxvYXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBuc19fZWNob0Zsb2F0ICphLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmVnaXN0ZXIgaW50IGlkID0gc29hcF9lbWJlZChzb2FwLCAodm9pZCopYSwgTlVMTCwgMCwgdGFnLCBTT0FQX1RZUEVfbnNfX2VjaG9GbG9hdCk7CisJaWYgKHNvYXBfb3V0X25zX19lY2hvRmxvYXQoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9uc19fZWNob0Zsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgc3RydWN0IG5zX19lY2hvRmxvYXQgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIGEsIFNPQVBfVFlQRV9uc19fZWNob0Zsb2F0KSwgdHlwZSk7CisJc29hcF9vdXRfeHNkX19mbG9hdChzb2FwLCAiaW5wdXRGbG9hdCIsIC0xLCAmYS0+aW5wdXRGbG9hdCwgIiIpOworCXNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7CisJcmV0dXJuIFNPQVBfT0s7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvRmxvYXQgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X25zX19lY2hvRmxvYXQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob0Zsb2F0ICpwLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKChwID0gc29hcF9pbl9uc19fZWNob0Zsb2F0KHNvYXAsIHRhZywgcCwgdHlwZSkpKQorCQlzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOworCXJldHVybiBwOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob0Zsb2F0ICogU09BUF9GTUFDNCBzb2FwX2luX25zX19lY2hvRmxvYXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc3RydWN0IG5zX19lY2hvRmxvYXQgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc2hvcnQgc29hcF9mbGFnX2lucHV0RmxvYXQgPSAxOworCWlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCpzb2FwLT50eXBlICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpKQorCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisJCXJldHVybiBOVUxMOworCX0KKwlhID0gKHN0cnVjdCBuc19fZWNob0Zsb2F0ICopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgYSwgU09BUF9UWVBFX25zX19lY2hvRmxvYXQsIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9GbG9hdCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworCWlmICghYSkKKwkJcmV0dXJuIE5VTEw7CisJc29hcF9kZWZhdWx0X25zX19lY2hvRmxvYXQoc29hcCwgYSk7CisJaWYgKHNvYXAtPmJvZHkgJiYgISpzb2FwLT5ocmVmKQorCXsKKwkJZm9yICg7OykKKwkJewlzb2FwLT5lcnJvciA9IFNPQVBfVEFHX01JU01BVENIOworCQkJaWYgKHNvYXBfZmxhZ19pbnB1dEZsb2F0ICYmIHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCWlmIChzb2FwX2luX3hzZF9fZmxvYXQoc29hcCwgImlucHV0RmxvYXQiLCAmYS0+aW5wdXRGbG9hdCwgInhzZDpmbG9hdCIpKQorCQkJCXsJc29hcF9mbGFnX2lucHV0RmxvYXQtLTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCXNvYXAtPmVycm9yID0gc29hcF9pZ25vcmVfZWxlbWVudChzb2FwKTsKKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykKKwkJCQlicmVhazsKKwkJCWlmIChzb2FwLT5lcnJvcikKKwkJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIChzb2FwX2ZsYWdfaW5wdXRGbG9hdCA+IDApKQorCQl7CXNvYXAtPmVycm9yID0gU09BUF9PQ0NVUlM7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCWVsc2UKKwl7CWEgPSAoc3RydWN0IG5zX19lY2hvRmxvYXQgKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilhLCAwLCBTT0FQX1RZUEVfbnNfX2VjaG9GbG9hdCwgMCwgc2l6ZW9mKHN0cnVjdCBuc19fZWNob0Zsb2F0KSwgMCwgTlVMTCk7CisJCWlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gYTsKK30KKworU09BUF9GTUFDNSBzdHJ1Y3QgbnNfX2VjaG9GbG9hdCAqIFNPQVBfRk1BQzYgc29hcF9uZXdfbnNfX2VjaG9GbG9hdChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4pCit7CXJldHVybiBzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvRmxvYXQoc29hcCwgbiwgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX25zX19lY2hvRmxvYXQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob0Zsb2F0ICpwKQorewlzb2FwX2RlbGV0ZShzb2FwLCBwKTsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9GbG9hdCAqIFNPQVBfRk1BQzQgc29hcF9pbnN0YW50aWF0ZV9uc19fZWNob0Zsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbiwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqYXJyYXlUeXBlLCBzaXplX3QgKnNpemUpCit7CisJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvRmxvYXQoJWQsICVzLCAlcylcbiIsIG4sIHR5cGU/dHlwZToiIiwgYXJyYXlUeXBlP2FycmF5VHlwZToiIikpOworCXN0cnVjdCBzb2FwX2NsaXN0ICpjcCA9IHNvYXBfbGluayhzb2FwLCBOVUxMLCBTT0FQX1RZUEVfbnNfX2VjaG9GbG9hdCwgbiwgc29hcF9mZGVsZXRlKTsKKwlpZiAoIWNwKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAobiA8IDApCisJewljcC0+cHRyID0gKHZvaWQqKW5ldyBzdHJ1Y3QgbnNfX2VjaG9GbG9hdDsKKwkJaWYgKHNpemUpCisJCQkqc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9GbG9hdCk7CisJfQorCWVsc2UKKwl7CWNwLT5wdHIgPSAodm9pZCopbmV3IHN0cnVjdCBuc19fZWNob0Zsb2F0W25dOworCQlpZiAoc2l6ZSkKKwkJCSpzaXplID0gbiAqIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9GbG9hdCk7CisJfQorCQlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluc3RhbnRpYXRlZCBsb2NhdGlvbj0lcFxuIiwgY3AtPnB0cikpOworCXJldHVybiAoc3RydWN0IG5zX19lY2hvRmxvYXQqKWNwLT5wdHI7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfY29weV9uc19fZWNob0Zsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3QsIGludCB0dCwgdm9pZCAqcCwgc2l6ZV90IGxlbiwgY29uc3Qgdm9pZCAqcSwgc2l6ZV90IG4pCit7CisJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5aW5nIHN0cnVjdCBuc19fZWNob0Zsb2F0ICVwIC0+ICVwXG4iLCBxLCBwKSk7CisJKihzdHJ1Y3QgbnNfX2VjaG9GbG9hdCopcCA9ICooc3RydWN0IG5zX19lY2hvRmxvYXQqKXE7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX25zX19lY2hvRmxvYXRSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IG5zX19lY2hvRmxvYXRSZXNwb25zZSAqYSkKK3sKKwkodm9pZClzb2FwOyAodm9pZClhOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8KKwlzb2FwX2VtYmVkZGVkKHNvYXAsICZhLT5fcmV0dXJuLCBTT0FQX1RZUEVfeHNkX19mbG9hdCk7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9uc19fZWNob0Zsb2F0UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob0Zsb2F0UmVzcG9uc2UgKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisJc29hcF9kZWZhdWx0X3hzZF9fZmxvYXQoc29hcCwgJmEtPl9yZXR1cm4pOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X25zX19lY2hvRmxvYXRSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IG5zX19lY2hvRmxvYXRSZXNwb25zZSAqYSwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCXJlZ2lzdGVyIGludCBpZCA9IHNvYXBfZW1iZWQoc29hcCwgKHZvaWQqKWEsIE5VTEwsIDAsIHRhZywgU09BUF9UWVBFX25zX19lY2hvRmxvYXRSZXNwb25zZSk7CisJaWYgKHNvYXBfb3V0X25zX19lY2hvRmxvYXRSZXNwb25zZShzb2FwLCB0YWcsIGlkLCBhLCB0eXBlKSkKKwkJcmV0dXJuIHNvYXAtPmVycm9yOworCXJldHVybiBzb2FwX3B1dGluZGVwZW5kZW50KHNvYXApOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X25zX19lY2hvRmxvYXRSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHN0cnVjdCBuc19fZWNob0Zsb2F0UmVzcG9uc2UgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIGEsIFNPQVBfVFlQRV9uc19fZWNob0Zsb2F0UmVzcG9uc2UpLCB0eXBlKTsKKwlzb2FwX2VsZW1lbnRfcmVzdWx0KHNvYXAsICJyZXR1cm4iKTsKKwlzb2FwX291dF94c2RfX2Zsb2F0KHNvYXAsICJyZXR1cm4iLCAtMSwgJmEtPl9yZXR1cm4sICIiKTsKKwlzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworCXJldHVybiBTT0FQX09LOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob0Zsb2F0UmVzcG9uc2UgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X25zX19lY2hvRmxvYXRSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvRmxvYXRSZXNwb25zZSAqcCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmICgocCA9IHNvYXBfaW5fbnNfX2VjaG9GbG9hdFJlc3BvbnNlKHNvYXAsIHRhZywgcCwgdHlwZSkpKQorCQlzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOworCXJldHVybiBwOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob0Zsb2F0UmVzcG9uc2UgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fbnNfX2VjaG9GbG9hdFJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHN0cnVjdCBuc19fZWNob0Zsb2F0UmVzcG9uc2UgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc2hvcnQgc29hcF9mbGFnX19yZXR1cm4gPSAxOworCWlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCpzb2FwLT50eXBlICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpKQorCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisJCXJldHVybiBOVUxMOworCX0KKwlhID0gKHN0cnVjdCBuc19fZWNob0Zsb2F0UmVzcG9uc2UgKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBhLCBTT0FQX1RZUEVfbnNfX2VjaG9GbG9hdFJlc3BvbnNlLCBzaXplb2Yoc3RydWN0IG5zX19lY2hvRmxvYXRSZXNwb25zZSksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworCWlmICghYSkKKwkJcmV0dXJuIE5VTEw7CisJc29hcF9kZWZhdWx0X25zX19lY2hvRmxvYXRSZXNwb25zZShzb2FwLCBhKTsKKwlpZiAoc29hcC0+Ym9keSAmJiAhKnNvYXAtPmhyZWYpCisJeworCQlmb3IgKDs7KQorCQl7CXNvYXAtPmVycm9yID0gU09BUF9UQUdfTUlTTUFUQ0g7CisJCQlpZiAoc29hcF9mbGFnX19yZXR1cm4gJiYgc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJaWYgKHNvYXBfaW5feHNkX19mbG9hdChzb2FwLCBOVUxMLCAmYS0+X3JldHVybiwgInhzZDpmbG9hdCIpKQorCQkJCXsJc29hcF9mbGFnX19yZXR1cm4tLTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCXNvYXAtPmVycm9yID0gc29hcF9pZ25vcmVfZWxlbWVudChzb2FwKTsKKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykKKwkJCQlicmVhazsKKwkJCWlmIChzb2FwLT5lcnJvcikKKwkJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIChzb2FwX2ZsYWdfX3JldHVybiA+IDApKQorCQl7CXNvYXAtPmVycm9yID0gU09BUF9PQ0NVUlM7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCWVsc2UKKwl7CWEgPSAoc3RydWN0IG5zX19lY2hvRmxvYXRSZXNwb25zZSAqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCAodm9pZCoqKWEsIDAsIFNPQVBfVFlQRV9uc19fZWNob0Zsb2F0UmVzcG9uc2UsIDAsIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9GbG9hdFJlc3BvbnNlKSwgMCwgTlVMTCk7CisJCWlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gYTsKK30KKworU09BUF9GTUFDNSBzdHJ1Y3QgbnNfX2VjaG9GbG9hdFJlc3BvbnNlICogU09BUF9GTUFDNiBzb2FwX25ld19uc19fZWNob0Zsb2F0UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuKQorewlyZXR1cm4gc29hcF9pbnN0YW50aWF0ZV9uc19fZWNob0Zsb2F0UmVzcG9uc2Uoc29hcCwgbiwgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX25zX19lY2hvRmxvYXRSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvRmxvYXRSZXNwb25zZSAqcCkKK3sJc29hcF9kZWxldGUoc29hcCwgcCk7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvRmxvYXRSZXNwb25zZSAqIFNPQVBfRk1BQzQgc29hcF9pbnN0YW50aWF0ZV9uc19fZWNob0Zsb2F0UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICphcnJheVR5cGUsIHNpemVfdCAqc2l6ZSkKK3sKKwlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgInNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG9GbG9hdFJlc3BvbnNlKCVkLCAlcywgJXMpXG4iLCBuLCB0eXBlP3R5cGU6IiIsIGFycmF5VHlwZT9hcnJheVR5cGU6IiIpKTsKKwlzdHJ1Y3Qgc29hcF9jbGlzdCAqY3AgPSBzb2FwX2xpbmsoc29hcCwgTlVMTCwgU09BUF9UWVBFX25zX19lY2hvRmxvYXRSZXNwb25zZSwgbiwgc29hcF9mZGVsZXRlKTsKKwlpZiAoIWNwKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAobiA8IDApCisJewljcC0+cHRyID0gKHZvaWQqKW5ldyBzdHJ1Y3QgbnNfX2VjaG9GbG9hdFJlc3BvbnNlOworCQlpZiAoc2l6ZSkKKwkJCSpzaXplID0gc2l6ZW9mKHN0cnVjdCBuc19fZWNob0Zsb2F0UmVzcG9uc2UpOworCX0KKwllbHNlCisJewljcC0+cHRyID0gKHZvaWQqKW5ldyBzdHJ1Y3QgbnNfX2VjaG9GbG9hdFJlc3BvbnNlW25dOworCQlpZiAoc2l6ZSkKKwkJCSpzaXplID0gbiAqIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9GbG9hdFJlc3BvbnNlKTsKKwl9CisJCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5zdGFudGlhdGVkIGxvY2F0aW9uPSVwXG4iLCBjcC0+cHRyKSk7CisJcmV0dXJuIChzdHJ1Y3QgbnNfX2VjaG9GbG9hdFJlc3BvbnNlKiljcC0+cHRyOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2NvcHlfbnNfX2VjaG9GbG9hdFJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3QsIGludCB0dCwgdm9pZCAqcCwgc2l6ZV90IGxlbiwgY29uc3Qgdm9pZCAqcSwgc2l6ZV90IG4pCit7CisJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5aW5nIHN0cnVjdCBuc19fZWNob0Zsb2F0UmVzcG9uc2UgJXAgLT4gJXBcbiIsIHEsIHApKTsKKwkqKHN0cnVjdCBuc19fZWNob0Zsb2F0UmVzcG9uc2UqKXAgPSAqKHN0cnVjdCBuc19fZWNob0Zsb2F0UmVzcG9uc2UqKXE7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX25zX19lY2hvSW50ZWdlckFycmF5KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG9JbnRlZ2VyQXJyYXkgKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisJc29hcF9zZXJpYWxpemVfQXJyYXlPZmludChzb2FwLCAmYS0+aW5wdXRJbnRlZ2VyQXJyYXkpOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfbnNfX2VjaG9JbnRlZ2VyQXJyYXkoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob0ludGVnZXJBcnJheSAqYSkKK3sKKwkodm9pZClzb2FwOyAodm9pZClhOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8KKwlzb2FwX2RlZmF1bHRfQXJyYXlPZmludChzb2FwLCAmYS0+aW5wdXRJbnRlZ2VyQXJyYXkpOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X25zX19lY2hvSW50ZWdlckFycmF5KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG9JbnRlZ2VyQXJyYXkgKmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZWdpc3RlciBpbnQgaWQgPSBzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCBOVUxMLCAwLCB0YWcsIFNPQVBfVFlQRV9uc19fZWNob0ludGVnZXJBcnJheSk7CisJaWYgKHNvYXBfb3V0X25zX19lY2hvSW50ZWdlckFycmF5KHNvYXAsIHRhZywgaWQsIGEsIHR5cGUpKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJcmV0dXJuIHNvYXBfcHV0aW5kZXBlbmRlbnQoc29hcCk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfbnNfX2VjaG9JbnRlZ2VyQXJyYXkoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG9JbnRlZ2VyQXJyYXkgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIGEsIFNPQVBfVFlQRV9uc19fZWNob0ludGVnZXJBcnJheSksIHR5cGUpOworCXNvYXBfb3V0X0FycmF5T2ZpbnQoc29hcCwgImlucHV0SW50ZWdlckFycmF5IiwgLTEsICZhLT5pbnB1dEludGVnZXJBcnJheSwgIiIpOworCXNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7CisJcmV0dXJuIFNPQVBfT0s7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvSW50ZWdlckFycmF5ICogU09BUF9GTUFDNCBzb2FwX2dldF9uc19fZWNob0ludGVnZXJBcnJheShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvSW50ZWdlckFycmF5ICpwLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKChwID0gc29hcF9pbl9uc19fZWNob0ludGVnZXJBcnJheShzb2FwLCB0YWcsIHAsIHR5cGUpKSkKKwkJc29hcF9nZXRpbmRlcGVuZGVudChzb2FwKTsKKwlyZXR1cm4gcDsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9JbnRlZ2VyQXJyYXkgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fbnNfX2VjaG9JbnRlZ2VyQXJyYXkoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc3RydWN0IG5zX19lY2hvSW50ZWdlckFycmF5ICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXNob3J0IHNvYXBfZmxhZ19pbnB1dEludGVnZXJBcnJheSA9IDE7CisJaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoKnNvYXAtPnR5cGUgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkpCisJewlzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWEgPSAoc3RydWN0IG5zX19lY2hvSW50ZWdlckFycmF5ICopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgYSwgU09BUF9UWVBFX25zX19lY2hvSW50ZWdlckFycmF5LCBzaXplb2Yoc3RydWN0IG5zX19lY2hvSW50ZWdlckFycmF5KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJaWYgKCFhKQorCQlyZXR1cm4gTlVMTDsKKwlzb2FwX2RlZmF1bHRfbnNfX2VjaG9JbnRlZ2VyQXJyYXkoc29hcCwgYSk7CisJaWYgKHNvYXAtPmJvZHkgJiYgISpzb2FwLT5ocmVmKQorCXsKKwkJZm9yICg7OykKKwkJewlzb2FwLT5lcnJvciA9IFNPQVBfVEFHX01JU01BVENIOworCQkJaWYgKHNvYXBfZmxhZ19pbnB1dEludGVnZXJBcnJheSAmJiBzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlpZiAoc29hcF9pbl9BcnJheU9maW50KHNvYXAsICJpbnB1dEludGVnZXJBcnJheSIsICZhLT5pbnB1dEludGVnZXJBcnJheSwgInhzZDppbnQiKSkKKwkJCQl7CXNvYXBfZmxhZ19pbnB1dEludGVnZXJBcnJheS0tOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQlpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJc29hcC0+ZXJyb3IgPSBzb2FwX2lnbm9yZV9lbGVtZW50KHNvYXApOworCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfTk9fVEFHKQorCQkJCWJyZWFrOworCQkJaWYgKHNvYXAtPmVycm9yKQorCQkJCXJldHVybiBOVUxMOworCQl9CisJCWlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgKHNvYXBfZmxhZ19pbnB1dEludGVnZXJBcnJheSA+IDApKQorCQl7CXNvYXAtPmVycm9yID0gU09BUF9PQ0NVUlM7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCWVsc2UKKwl7CWEgPSAoc3RydWN0IG5zX19lY2hvSW50ZWdlckFycmF5ICopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopYSwgMCwgU09BUF9UWVBFX25zX19lY2hvSW50ZWdlckFycmF5LCAwLCBzaXplb2Yoc3RydWN0IG5zX19lY2hvSW50ZWdlckFycmF5KSwgMCwgTlVMTCk7CisJCWlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gYTsKK30KKworU09BUF9GTUFDNSBzdHJ1Y3QgbnNfX2VjaG9JbnRlZ2VyQXJyYXkgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X25zX19lY2hvSW50ZWdlckFycmF5KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbikKK3sJcmV0dXJuIHNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG9JbnRlZ2VyQXJyYXkoc29hcCwgbiwgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX25zX19lY2hvSW50ZWdlckFycmF5KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2VjaG9JbnRlZ2VyQXJyYXkgKnApCit7CXNvYXBfZGVsZXRlKHNvYXAsIHApOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob0ludGVnZXJBcnJheSAqIFNPQVBfRk1BQzQgc29hcF9pbnN0YW50aWF0ZV9uc19fZWNob0ludGVnZXJBcnJheShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4sIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmFycmF5VHlwZSwgc2l6ZV90ICpzaXplKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAic29hcF9pbnN0YW50aWF0ZV9uc19fZWNob0ludGVnZXJBcnJheSglZCwgJXMsICVzKVxuIiwgbiwgdHlwZT90eXBlOiIiLCBhcnJheVR5cGU/YXJyYXlUeXBlOiIiKSk7CisJc3RydWN0IHNvYXBfY2xpc3QgKmNwID0gc29hcF9saW5rKHNvYXAsIE5VTEwsIFNPQVBfVFlQRV9uc19fZWNob0ludGVnZXJBcnJheSwgbiwgc29hcF9mZGVsZXRlKTsKKwlpZiAoIWNwKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAobiA8IDApCisJewljcC0+cHRyID0gKHZvaWQqKW5ldyBzdHJ1Y3QgbnNfX2VjaG9JbnRlZ2VyQXJyYXk7CisJCWlmIChzaXplKQorCQkJKnNpemUgPSBzaXplb2Yoc3RydWN0IG5zX19lY2hvSW50ZWdlckFycmF5KTsKKwl9CisJZWxzZQorCXsJY3AtPnB0ciA9ICh2b2lkKiluZXcgc3RydWN0IG5zX19lY2hvSW50ZWdlckFycmF5W25dOworCQlpZiAoc2l6ZSkKKwkJCSpzaXplID0gbiAqIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9JbnRlZ2VyQXJyYXkpOworCX0KKwkJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbnN0YW50aWF0ZWQgbG9jYXRpb249JXBcbiIsIGNwLT5wdHIpKTsKKwlyZXR1cm4gKHN0cnVjdCBuc19fZWNob0ludGVnZXJBcnJheSopY3AtPnB0cjsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9jb3B5X25zX19lY2hvSW50ZWdlckFycmF5KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3QsIGludCB0dCwgdm9pZCAqcCwgc2l6ZV90IGxlbiwgY29uc3Qgdm9pZCAqcSwgc2l6ZV90IG4pCit7CisJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5aW5nIHN0cnVjdCBuc19fZWNob0ludGVnZXJBcnJheSAlcCAtPiAlcFxuIiwgcSwgcCkpOworCSooc3RydWN0IG5zX19lY2hvSW50ZWdlckFycmF5KilwID0gKihzdHJ1Y3QgbnNfX2VjaG9JbnRlZ2VyQXJyYXkqKXE7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX25zX19lY2hvSW50ZWdlckFycmF5UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBuc19fZWNob0ludGVnZXJBcnJheVJlc3BvbnNlICphKQoreworCSh2b2lkKXNvYXA7ICh2b2lkKWE7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLworCXNvYXBfc2VyaWFsaXplX0FycmF5T2ZpbnQoc29hcCwgJmEtPl9yZXR1cm4pOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfbnNfX2VjaG9JbnRlZ2VyQXJyYXlSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvSW50ZWdlckFycmF5UmVzcG9uc2UgKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisJc29hcF9kZWZhdWx0X0FycmF5T2ZpbnQoc29hcCwgJmEtPl9yZXR1cm4pOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X25zX19lY2hvSW50ZWdlckFycmF5UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBuc19fZWNob0ludGVnZXJBcnJheVJlc3BvbnNlICphLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmVnaXN0ZXIgaW50IGlkID0gc29hcF9lbWJlZChzb2FwLCAodm9pZCopYSwgTlVMTCwgMCwgdGFnLCBTT0FQX1RZUEVfbnNfX2VjaG9JbnRlZ2VyQXJyYXlSZXNwb25zZSk7CisJaWYgKHNvYXBfb3V0X25zX19lY2hvSW50ZWdlckFycmF5UmVzcG9uc2Uoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9uc19fZWNob0ludGVnZXJBcnJheVJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgc3RydWN0IG5zX19lY2hvSW50ZWdlckFycmF5UmVzcG9uc2UgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIGEsIFNPQVBfVFlQRV9uc19fZWNob0ludGVnZXJBcnJheVJlc3BvbnNlKSwgdHlwZSk7CisJc29hcF9lbGVtZW50X3Jlc3VsdChzb2FwLCAicmV0dXJuIik7CisJc29hcF9vdXRfQXJyYXlPZmludChzb2FwLCAicmV0dXJuIiwgLTEsICZhLT5fcmV0dXJuLCAiIik7CisJc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKKwlyZXR1cm4gU09BUF9PSzsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9JbnRlZ2VyQXJyYXlSZXNwb25zZSAqIFNPQVBfRk1BQzQgc29hcF9nZXRfbnNfX2VjaG9JbnRlZ2VyQXJyYXlSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvSW50ZWdlckFycmF5UmVzcG9uc2UgKnAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoKHAgPSBzb2FwX2luX25zX19lY2hvSW50ZWdlckFycmF5UmVzcG9uc2Uoc29hcCwgdGFnLCBwLCB0eXBlKSkpCisJCXNvYXBfZ2V0aW5kZXBlbmRlbnQoc29hcCk7CisJcmV0dXJuIHA7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvSW50ZWdlckFycmF5UmVzcG9uc2UgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fbnNfX2VjaG9JbnRlZ2VyQXJyYXlSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzdHJ1Y3QgbnNfX2VjaG9JbnRlZ2VyQXJyYXlSZXNwb25zZSAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlzaG9ydCBzb2FwX2ZsYWdfX3JldHVybiA9IDE7CisJaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoKnNvYXAtPnR5cGUgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkpCisJewlzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWEgPSAoc3RydWN0IG5zX19lY2hvSW50ZWdlckFycmF5UmVzcG9uc2UgKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBhLCBTT0FQX1RZUEVfbnNfX2VjaG9JbnRlZ2VyQXJyYXlSZXNwb25zZSwgc2l6ZW9mKHN0cnVjdCBuc19fZWNob0ludGVnZXJBcnJheVJlc3BvbnNlKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJaWYgKCFhKQorCQlyZXR1cm4gTlVMTDsKKwlzb2FwX2RlZmF1bHRfbnNfX2VjaG9JbnRlZ2VyQXJyYXlSZXNwb25zZShzb2FwLCBhKTsKKwlpZiAoc29hcC0+Ym9keSAmJiAhKnNvYXAtPmhyZWYpCisJeworCQlmb3IgKDs7KQorCQl7CXNvYXAtPmVycm9yID0gU09BUF9UQUdfTUlTTUFUQ0g7CisJCQlpZiAoc29hcF9mbGFnX19yZXR1cm4gJiYgc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJaWYgKHNvYXBfaW5fQXJyYXlPZmludChzb2FwLCBOVUxMLCAmYS0+X3JldHVybiwgInhzZDppbnQiKSkKKwkJCQl7CXNvYXBfZmxhZ19fcmV0dXJuLS07CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlzb2FwLT5lcnJvciA9IHNvYXBfaWdub3JlX2VsZW1lbnQoc29hcCk7CisJCQlpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcpCisJCQkJYnJlYWs7CisJCQlpZiAoc29hcC0+ZXJyb3IpCisJCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiAoc29hcF9mbGFnX19yZXR1cm4gPiAwKSkKKwkJewlzb2FwLT5lcnJvciA9IFNPQVBfT0NDVVJTOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwllbHNlCisJewlhID0gKHN0cnVjdCBuc19fZWNob0ludGVnZXJBcnJheVJlc3BvbnNlICopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopYSwgMCwgU09BUF9UWVBFX25zX19lY2hvSW50ZWdlckFycmF5UmVzcG9uc2UsIDAsIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9JbnRlZ2VyQXJyYXlSZXNwb25zZSksIDAsIE5VTEwpOworCQlpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGE7Cit9CisKK1NPQVBfRk1BQzUgc3RydWN0IG5zX19lY2hvSW50ZWdlckFycmF5UmVzcG9uc2UgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X25zX19lY2hvSW50ZWdlckFycmF5UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuKQorewlyZXR1cm4gc29hcF9pbnN0YW50aWF0ZV9uc19fZWNob0ludGVnZXJBcnJheVJlc3BvbnNlKHNvYXAsIG4sIE5VTEwsIE5VTEwsIE5VTEwpOworfQorCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9uc19fZWNob0ludGVnZXJBcnJheVJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2VjaG9JbnRlZ2VyQXJyYXlSZXNwb25zZSAqcCkKK3sJc29hcF9kZWxldGUoc29hcCwgcCk7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvSW50ZWdlckFycmF5UmVzcG9uc2UgKiBTT0FQX0ZNQUM0IHNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG9JbnRlZ2VyQXJyYXlSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4sIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmFycmF5VHlwZSwgc2l6ZV90ICpzaXplKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAic29hcF9pbnN0YW50aWF0ZV9uc19fZWNob0ludGVnZXJBcnJheVJlc3BvbnNlKCVkLCAlcywgJXMpXG4iLCBuLCB0eXBlP3R5cGU6IiIsIGFycmF5VHlwZT9hcnJheVR5cGU6IiIpKTsKKwlzdHJ1Y3Qgc29hcF9jbGlzdCAqY3AgPSBzb2FwX2xpbmsoc29hcCwgTlVMTCwgU09BUF9UWVBFX25zX19lY2hvSW50ZWdlckFycmF5UmVzcG9uc2UsIG4sIHNvYXBfZmRlbGV0ZSk7CisJaWYgKCFjcCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKG4gPCAwKQorCXsJY3AtPnB0ciA9ICh2b2lkKiluZXcgc3RydWN0IG5zX19lY2hvSW50ZWdlckFycmF5UmVzcG9uc2U7CisJCWlmIChzaXplKQorCQkJKnNpemUgPSBzaXplb2Yoc3RydWN0IG5zX19lY2hvSW50ZWdlckFycmF5UmVzcG9uc2UpOworCX0KKwllbHNlCisJewljcC0+cHRyID0gKHZvaWQqKW5ldyBzdHJ1Y3QgbnNfX2VjaG9JbnRlZ2VyQXJyYXlSZXNwb25zZVtuXTsKKwkJaWYgKHNpemUpCisJCQkqc2l6ZSA9IG4gKiBzaXplb2Yoc3RydWN0IG5zX19lY2hvSW50ZWdlckFycmF5UmVzcG9uc2UpOworCX0KKwkJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbnN0YW50aWF0ZWQgbG9jYXRpb249JXBcbiIsIGNwLT5wdHIpKTsKKwlyZXR1cm4gKHN0cnVjdCBuc19fZWNob0ludGVnZXJBcnJheVJlc3BvbnNlKiljcC0+cHRyOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2NvcHlfbnNfX2VjaG9JbnRlZ2VyQXJyYXlSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0LCBpbnQgdHQsIHZvaWQgKnAsIHNpemVfdCBsZW4sIGNvbnN0IHZvaWQgKnEsIHNpemVfdCBuKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weWluZyBzdHJ1Y3QgbnNfX2VjaG9JbnRlZ2VyQXJyYXlSZXNwb25zZSAlcCAtPiAlcFxuIiwgcSwgcCkpOworCSooc3RydWN0IG5zX19lY2hvSW50ZWdlckFycmF5UmVzcG9uc2UqKXAgPSAqKHN0cnVjdCBuc19fZWNob0ludGVnZXJBcnJheVJlc3BvbnNlKilxOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9BcnJheU9maW50KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgQXJyYXlPZmludCBjb25zdCphKQoreworCWludCBpOworCWlmIChhLT5fX3B0ciAmJiAhc29hcF9hcnJheV9yZWZlcmVuY2Uoc29hcCwgYSwgKHN0cnVjdCBzb2FwX2FycmF5KikmYS0+X19wdHIsIDEsIFNPQVBfVFlQRV9BcnJheU9maW50KSkKKwkJZm9yIChpID0gMDsgaSA8IGEtPl9fc2l6ZTsgaSsrKQorCQl7CisJCQlzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG94c2RfX2ludChzb2FwLCBhLT5fX3B0ciArIGkpOworCQl9Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9BcnJheU9maW50KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgQXJyYXlPZmludCAqYSkKK3sKKwlhLT5fX3NpemUgPSAwOworCWEtPl9fcHRyID0gTlVMTDsKKwlhLT5fX29mZnNldCA9IDA7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfQXJyYXlPZmludChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IEFycmF5T2ZpbnQgKmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZWdpc3RlciBpbnQgaWQgPSBzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCAoc3RydWN0IHNvYXBfYXJyYXkqKSZhLT5fX3B0ciwgMSwgdGFnLCBTT0FQX1RZUEVfQXJyYXlPZmludCk7CisJaWYgKHNvYXBfb3V0X0FycmF5T2ZpbnQoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9BcnJheU9maW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgc3RydWN0IEFycmF5T2ZpbnQgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaW50IGksIG4gPSBhLT5fX3NpemU7CisJY2hhciAqdCA9IHNvYXBfcHV0c2l6ZShzb2FwLCAieHNkOmludCIsIG4gKyBhLT5fX29mZnNldCk7CisJaWQgPSBzb2FwX2VsZW1lbnRfaWQoc29hcCwgdGFnLCBpZCwgYSwgKHN0cnVjdCBzb2FwX2FycmF5KikmYS0+X19wdHIsIDEsIHR5cGUsIFNPQVBfVFlQRV9BcnJheU9maW50KTsKKwlpZiAoaWQgPCAwKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJc29hcF9hcnJheV9iZWdpbl9vdXQoc29hcCwgdGFnLCBpZCwgdCwgc29hcF9wdXRvZmZzZXQoc29hcCwgYS0+X19vZmZzZXQpKTsKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorCXsKKwkJc29hcC0+cG9zaXRpb24gPSAxOworCQlzb2FwLT5wb3NpdGlvbnNbMF0gPSBpOworCQlzb2FwX291dF9Qb2ludGVyVG94c2RfX2ludChzb2FwLCAiaXRlbSIsIC0xLCAmYS0+X19wdHJbaV0sICIiKTsKKwl9CisJc29hcC0+cG9zaXRpb24gPSAwOworCXNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7CisJcmV0dXJuIFNPQVBfT0s7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IEFycmF5T2ZpbnQgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X0FycmF5T2ZpbnQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBBcnJheU9maW50ICpwLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKChwID0gc29hcF9pbl9BcnJheU9maW50KHNvYXAsIHRhZywgcCwgdHlwZSkpKQorCQlzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOworCXJldHVybiBwOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBBcnJheU9maW50ICogU09BUF9GTUFDNCBzb2FwX2luX0FycmF5T2ZpbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc3RydWN0IEFycmF5T2ZpbnQgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CWludCBpLCBqOworCWxvbmcgKipwOworCWlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAxKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKHNvYXBfbWF0Y2hfYXJyYXkoc29hcCwgdHlwZSkpCisJewlzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWEgPSAoc3RydWN0IEFycmF5T2ZpbnQgKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBhLCBTT0FQX1RZUEVfQXJyYXlPZmludCwgc2l6ZW9mKHN0cnVjdCBBcnJheU9maW50KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJaWYgKCFhKQorCQlyZXR1cm4gTlVMTDsKKwlzb2FwX2RlZmF1bHRfQXJyYXlPZmludChzb2FwLCBhKTsKKwlpZiAoc29hcC0+Ym9keSAmJiAhKnNvYXAtPmhyZWYpCisJeworCQlhLT5fX3NpemUgPSBzb2FwX2dldHNpemUoc29hcC0+YXJyYXlTaXplLCBzb2FwLT5hcnJheU9mZnNldCwgJmopOworCQlhLT5fX29mZnNldCA9IGo7CisJCWlmIChhLT5fX3NpemUgPj0gMCkKKwkJewlhLT5fX3B0ciA9IChsb25nICoqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihsb25nICopICogYS0+X19zaXplKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBhLT5fX3NpemU7IGkrKykKKwkJCQlhLT5fX3B0cltpXSA9IE5VTEw7CisJCQlmb3IgKGkgPSAwOyBpIDwgYS0+X19zaXplOyBpKyspCisJCQl7CXNvYXBfcGVla19lbGVtZW50KHNvYXApOworCQkJCWlmIChzb2FwLT5wb3NpdGlvbikKKwkJCQl7CWkgPSBzb2FwLT5wb3NpdGlvbnNbMF0tajsKKwkJCQkJaWYgKGkgPCAwIHx8IGkgPj0gYS0+X19zaXplKQorCQkJCQl7CXNvYXAtPmVycm9yID0gU09BUF9JT0I7CisJCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoIXNvYXBfaW5fUG9pbnRlclRveHNkX19pbnQoc29hcCwgTlVMTCwgYS0+X19wdHIgKyBpLCAieHNkOmludCIpKQorCQkJCXsJaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfTk9fVEFHKQorCQkJCQkJcmV0dXJuIE5VTEw7CisJCQkJCXNvYXAtPmVycm9yID0gU09BUF9PSzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJewlzb2FwX25ld19ibG9jayhzb2FwKTsKKwkJCWZvciAoYS0+X19zaXplID0gMDsgOyBhLT5fX3NpemUrKykKKwkJCXsJcCA9IChsb25nICoqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBzaXplb2YobG9uZyAqKSk7CisJCQkJaWYgKCFwKQorCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQkqcCA9IE5VTEw7CisJCQkJaWYgKCFzb2FwX2luX1BvaW50ZXJUb3hzZF9faW50KHNvYXAsIE5VTEwsIHAsICJ4c2Q6aW50IikpCisJCQkJewlpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9OT19UQUcpCisJCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQkJc29hcC0+ZXJyb3IgPSBTT0FQX09LOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlzb2FwX3BvcF9ibG9jayhzb2FwKTsKKwkJCWEtPl9fcHRyID0gKGxvbmcgKiopc29hcF9tYWxsb2Moc29hcCwgc29hcC0+Ymxpc3QtPnNpemUpOworCQkJc29hcF9zYXZlX2Jsb2NrKHNvYXAsIChjaGFyKilhLT5fX3B0ciwgMSk7CisJCX0KKwkJaWYgKHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwllbHNlCisJewlhID0gKHN0cnVjdCBBcnJheU9maW50ICopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopYSwgMCwgU09BUF9UWVBFX0FycmF5T2ZpbnQsIDAsIHNpemVvZihzdHJ1Y3QgQXJyYXlPZmludCksIDAsIE5VTEwpOworCQlpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGE7Cit9CisKK1NPQVBfRk1BQzUgc3RydWN0IEFycmF5T2ZpbnQgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X0FycmF5T2ZpbnQoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuKQorewlyZXR1cm4gc29hcF9pbnN0YW50aWF0ZV9BcnJheU9maW50KHNvYXAsIG4sIE5VTEwsIE5VTEwsIE5VTEwpOworfQorCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9BcnJheU9maW50KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgQXJyYXlPZmludCAqcCkKK3sJc29hcF9kZWxldGUoc29hcCwgcCk7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IEFycmF5T2ZpbnQgKiBTT0FQX0ZNQUM0IHNvYXBfaW5zdGFudGlhdGVfQXJyYXlPZmludChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4sIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmFycmF5VHlwZSwgc2l6ZV90ICpzaXplKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAic29hcF9pbnN0YW50aWF0ZV9BcnJheU9maW50KCVkLCAlcywgJXMpXG4iLCBuLCB0eXBlP3R5cGU6IiIsIGFycmF5VHlwZT9hcnJheVR5cGU6IiIpKTsKKwlzdHJ1Y3Qgc29hcF9jbGlzdCAqY3AgPSBzb2FwX2xpbmsoc29hcCwgTlVMTCwgU09BUF9UWVBFX0FycmF5T2ZpbnQsIG4sIHNvYXBfZmRlbGV0ZSk7CisJaWYgKCFjcCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKG4gPCAwKQorCXsJY3AtPnB0ciA9ICh2b2lkKiluZXcgc3RydWN0IEFycmF5T2ZpbnQ7CisJCWlmIChzaXplKQorCQkJKnNpemUgPSBzaXplb2Yoc3RydWN0IEFycmF5T2ZpbnQpOworCX0KKwllbHNlCisJewljcC0+cHRyID0gKHZvaWQqKW5ldyBzdHJ1Y3QgQXJyYXlPZmludFtuXTsKKwkJaWYgKHNpemUpCisJCQkqc2l6ZSA9IG4gKiBzaXplb2Yoc3RydWN0IEFycmF5T2ZpbnQpOworCX0KKwkJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbnN0YW50aWF0ZWQgbG9jYXRpb249JXBcbiIsIGNwLT5wdHIpKTsKKwlyZXR1cm4gKHN0cnVjdCBBcnJheU9maW50KiljcC0+cHRyOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2NvcHlfQXJyYXlPZmludChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0LCBpbnQgdHQsIHZvaWQgKnAsIHNpemVfdCBsZW4sIGNvbnN0IHZvaWQgKnEsIHNpemVfdCBuKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weWluZyBzdHJ1Y3QgQXJyYXlPZmludCAlcCAtPiAlcFxuIiwgcSwgcCkpOworCSooc3RydWN0IEFycmF5T2ZpbnQqKXAgPSAqKHN0cnVjdCBBcnJheU9maW50KilxOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9uc19fZWNob0ludGVnZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBuc19fZWNob0ludGVnZXIgKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisJc29hcF9lbWJlZGRlZChzb2FwLCAmYS0+aW5wdXRJbnRlZ2VyLCBTT0FQX1RZUEVfeHNkX19pbnQpOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfbnNfX2VjaG9JbnRlZ2VyKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2VjaG9JbnRlZ2VyICphKQoreworCSh2b2lkKXNvYXA7ICh2b2lkKWE7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLworCXNvYXBfZGVmYXVsdF94c2RfX2ludChzb2FwLCAmYS0+aW5wdXRJbnRlZ2VyKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9uc19fZWNob0ludGVnZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBuc19fZWNob0ludGVnZXIgKmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZWdpc3RlciBpbnQgaWQgPSBzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCBOVUxMLCAwLCB0YWcsIFNPQVBfVFlQRV9uc19fZWNob0ludGVnZXIpOworCWlmIChzb2FwX291dF9uc19fZWNob0ludGVnZXIoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9uc19fZWNob0ludGVnZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG9JbnRlZ2VyICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBhLCBTT0FQX1RZUEVfbnNfX2VjaG9JbnRlZ2VyKSwgdHlwZSk7CisJc29hcF9vdXRfeHNkX19pbnQoc29hcCwgImlucHV0SW50ZWdlciIsIC0xLCAmYS0+aW5wdXRJbnRlZ2VyLCAiIik7CisJc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKKwlyZXR1cm4gU09BUF9PSzsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9JbnRlZ2VyICogU09BUF9GTUFDNCBzb2FwX2dldF9uc19fZWNob0ludGVnZXIoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob0ludGVnZXIgKnAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoKHAgPSBzb2FwX2luX25zX19lY2hvSW50ZWdlcihzb2FwLCB0YWcsIHAsIHR5cGUpKSkKKwkJc29hcF9nZXRpbmRlcGVuZGVudChzb2FwKTsKKwlyZXR1cm4gcDsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9JbnRlZ2VyICogU09BUF9GTUFDNCBzb2FwX2luX25zX19lY2hvSW50ZWdlcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzdHJ1Y3QgbnNfX2VjaG9JbnRlZ2VyICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXNob3J0IHNvYXBfZmxhZ19pbnB1dEludGVnZXIgPSAxOworCWlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCpzb2FwLT50eXBlICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpKQorCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisJCXJldHVybiBOVUxMOworCX0KKwlhID0gKHN0cnVjdCBuc19fZWNob0ludGVnZXIgKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBhLCBTT0FQX1RZUEVfbnNfX2VjaG9JbnRlZ2VyLCBzaXplb2Yoc3RydWN0IG5zX19lY2hvSW50ZWdlciksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworCWlmICghYSkKKwkJcmV0dXJuIE5VTEw7CisJc29hcF9kZWZhdWx0X25zX19lY2hvSW50ZWdlcihzb2FwLCBhKTsKKwlpZiAoc29hcC0+Ym9keSAmJiAhKnNvYXAtPmhyZWYpCisJeworCQlmb3IgKDs7KQorCQl7CXNvYXAtPmVycm9yID0gU09BUF9UQUdfTUlTTUFUQ0g7CisJCQlpZiAoc29hcF9mbGFnX2lucHV0SW50ZWdlciAmJiBzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlpZiAoc29hcF9pbl94c2RfX2ludChzb2FwLCAiaW5wdXRJbnRlZ2VyIiwgJmEtPmlucHV0SW50ZWdlciwgInhzZDppbnQiKSkKKwkJCQl7CXNvYXBfZmxhZ19pbnB1dEludGVnZXItLTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCXNvYXAtPmVycm9yID0gc29hcF9pZ25vcmVfZWxlbWVudChzb2FwKTsKKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykKKwkJCQlicmVhazsKKwkJCWlmIChzb2FwLT5lcnJvcikKKwkJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIChzb2FwX2ZsYWdfaW5wdXRJbnRlZ2VyID4gMCkpCisJCXsJc29hcC0+ZXJyb3IgPSBTT0FQX09DQ1VSUzsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWlmIChzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJZWxzZQorCXsJYSA9IChzdHJ1Y3QgbnNfX2VjaG9JbnRlZ2VyICopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopYSwgMCwgU09BUF9UWVBFX25zX19lY2hvSW50ZWdlciwgMCwgc2l6ZW9mKHN0cnVjdCBuc19fZWNob0ludGVnZXIpLCAwLCBOVUxMKTsKKwkJaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBhOworfQorCitTT0FQX0ZNQUM1IHN0cnVjdCBuc19fZWNob0ludGVnZXIgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X25zX19lY2hvSW50ZWdlcihzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4pCit7CXJldHVybiBzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvSW50ZWdlcihzb2FwLCBuLCBOVUxMLCBOVUxMLCBOVUxMKTsKK30KKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfbnNfX2VjaG9JbnRlZ2VyKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2VjaG9JbnRlZ2VyICpwKQorewlzb2FwX2RlbGV0ZShzb2FwLCBwKTsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2VjaG9JbnRlZ2VyICogU09BUF9GTUFDNCBzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvSW50ZWdlcihzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4sIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmFycmF5VHlwZSwgc2l6ZV90ICpzaXplKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAic29hcF9pbnN0YW50aWF0ZV9uc19fZWNob0ludGVnZXIoJWQsICVzLCAlcylcbiIsIG4sIHR5cGU/dHlwZToiIiwgYXJyYXlUeXBlP2FycmF5VHlwZToiIikpOworCXN0cnVjdCBzb2FwX2NsaXN0ICpjcCA9IHNvYXBfbGluayhzb2FwLCBOVUxMLCBTT0FQX1RZUEVfbnNfX2VjaG9JbnRlZ2VyLCBuLCBzb2FwX2ZkZWxldGUpOworCWlmICghY3ApCisJCXJldHVybiBOVUxMOworCWlmIChuIDwgMCkKKwl7CWNwLT5wdHIgPSAodm9pZCopbmV3IHN0cnVjdCBuc19fZWNob0ludGVnZXI7CisJCWlmIChzaXplKQorCQkJKnNpemUgPSBzaXplb2Yoc3RydWN0IG5zX19lY2hvSW50ZWdlcik7CisJfQorCWVsc2UKKwl7CWNwLT5wdHIgPSAodm9pZCopbmV3IHN0cnVjdCBuc19fZWNob0ludGVnZXJbbl07CisJCWlmIChzaXplKQorCQkJKnNpemUgPSBuICogc2l6ZW9mKHN0cnVjdCBuc19fZWNob0ludGVnZXIpOworCX0KKwkJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbnN0YW50aWF0ZWQgbG9jYXRpb249JXBcbiIsIGNwLT5wdHIpKTsKKwlyZXR1cm4gKHN0cnVjdCBuc19fZWNob0ludGVnZXIqKWNwLT5wdHI7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfY29weV9uc19fZWNob0ludGVnZXIoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdCwgaW50IHR0LCB2b2lkICpwLCBzaXplX3QgbGVuLCBjb25zdCB2b2lkICpxLCBzaXplX3QgbikKK3sKKwlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHlpbmcgc3RydWN0IG5zX19lY2hvSW50ZWdlciAlcCAtPiAlcFxuIiwgcSwgcCkpOworCSooc3RydWN0IG5zX19lY2hvSW50ZWdlciopcCA9ICooc3RydWN0IG5zX19lY2hvSW50ZWdlciopcTsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfbnNfX2VjaG9JbnRlZ2VyUmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBuc19fZWNob0ludGVnZXJSZXNwb25zZSAqYSkKK3sKKwkodm9pZClzb2FwOyAodm9pZClhOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8KKwlzb2FwX2VtYmVkZGVkKHNvYXAsICZhLT5fcmV0dXJuLCBTT0FQX1RZUEVfeHNkX19pbnQpOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfbnNfX2VjaG9JbnRlZ2VyUmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob0ludGVnZXJSZXNwb25zZSAqYSkKK3sKKwkodm9pZClzb2FwOyAodm9pZClhOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8KKwlzb2FwX2RlZmF1bHRfeHNkX19pbnQoc29hcCwgJmEtPl9yZXR1cm4pOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X25zX19lY2hvSW50ZWdlclJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG9JbnRlZ2VyUmVzcG9uc2UgKmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZWdpc3RlciBpbnQgaWQgPSBzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCBOVUxMLCAwLCB0YWcsIFNPQVBfVFlQRV9uc19fZWNob0ludGVnZXJSZXNwb25zZSk7CisJaWYgKHNvYXBfb3V0X25zX19lY2hvSW50ZWdlclJlc3BvbnNlKHNvYXAsIHRhZywgaWQsIGEsIHR5cGUpKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJcmV0dXJuIHNvYXBfcHV0aW5kZXBlbmRlbnQoc29hcCk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfbnNfX2VjaG9JbnRlZ2VyUmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG9JbnRlZ2VyUmVzcG9uc2UgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIGEsIFNPQVBfVFlQRV9uc19fZWNob0ludGVnZXJSZXNwb25zZSksIHR5cGUpOworCXNvYXBfZWxlbWVudF9yZXN1bHQoc29hcCwgInJldHVybiIpOworCXNvYXBfb3V0X3hzZF9faW50KHNvYXAsICJyZXR1cm4iLCAtMSwgJmEtPl9yZXR1cm4sICIiKTsKKwlzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworCXJldHVybiBTT0FQX09LOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob0ludGVnZXJSZXNwb25zZSAqIFNPQVBfRk1BQzQgc29hcF9nZXRfbnNfX2VjaG9JbnRlZ2VyUmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob0ludGVnZXJSZXNwb25zZSAqcCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmICgocCA9IHNvYXBfaW5fbnNfX2VjaG9JbnRlZ2VyUmVzcG9uc2Uoc29hcCwgdGFnLCBwLCB0eXBlKSkpCisJCXNvYXBfZ2V0aW5kZXBlbmRlbnQoc29hcCk7CisJcmV0dXJuIHA7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvSW50ZWdlclJlc3BvbnNlICogU09BUF9GTUFDNCBzb2FwX2luX25zX19lY2hvSW50ZWdlclJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHN0cnVjdCBuc19fZWNob0ludGVnZXJSZXNwb25zZSAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlzaG9ydCBzb2FwX2ZsYWdfX3JldHVybiA9IDE7CisJaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoKnNvYXAtPnR5cGUgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkpCisJewlzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWEgPSAoc3RydWN0IG5zX19lY2hvSW50ZWdlclJlc3BvbnNlICopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgYSwgU09BUF9UWVBFX25zX19lY2hvSW50ZWdlclJlc3BvbnNlLCBzaXplb2Yoc3RydWN0IG5zX19lY2hvSW50ZWdlclJlc3BvbnNlKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJaWYgKCFhKQorCQlyZXR1cm4gTlVMTDsKKwlzb2FwX2RlZmF1bHRfbnNfX2VjaG9JbnRlZ2VyUmVzcG9uc2Uoc29hcCwgYSk7CisJaWYgKHNvYXAtPmJvZHkgJiYgISpzb2FwLT5ocmVmKQorCXsKKwkJZm9yICg7OykKKwkJewlzb2FwLT5lcnJvciA9IFNPQVBfVEFHX01JU01BVENIOworCQkJaWYgKHNvYXBfZmxhZ19fcmV0dXJuICYmIHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCWlmIChzb2FwX2luX3hzZF9faW50KHNvYXAsIE5VTEwsICZhLT5fcmV0dXJuLCAieHNkOmludCIpKQorCQkJCXsJc29hcF9mbGFnX19yZXR1cm4tLTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCXNvYXAtPmVycm9yID0gc29hcF9pZ25vcmVfZWxlbWVudChzb2FwKTsKKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykKKwkJCQlicmVhazsKKwkJCWlmIChzb2FwLT5lcnJvcikKKwkJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIChzb2FwX2ZsYWdfX3JldHVybiA+IDApKQorCQl7CXNvYXAtPmVycm9yID0gU09BUF9PQ0NVUlM7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCWVsc2UKKwl7CWEgPSAoc3RydWN0IG5zX19lY2hvSW50ZWdlclJlc3BvbnNlICopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopYSwgMCwgU09BUF9UWVBFX25zX19lY2hvSW50ZWdlclJlc3BvbnNlLCAwLCBzaXplb2Yoc3RydWN0IG5zX19lY2hvSW50ZWdlclJlc3BvbnNlKSwgMCwgTlVMTCk7CisJCWlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gYTsKK30KKworU09BUF9GTUFDNSBzdHJ1Y3QgbnNfX2VjaG9JbnRlZ2VyUmVzcG9uc2UgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X25zX19lY2hvSW50ZWdlclJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbikKK3sJcmV0dXJuIHNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG9JbnRlZ2VyUmVzcG9uc2Uoc29hcCwgbiwgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX25zX19lY2hvSW50ZWdlclJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2VjaG9JbnRlZ2VyUmVzcG9uc2UgKnApCit7CXNvYXBfZGVsZXRlKHNvYXAsIHApOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob0ludGVnZXJSZXNwb25zZSAqIFNPQVBfRk1BQzQgc29hcF9pbnN0YW50aWF0ZV9uc19fZWNob0ludGVnZXJSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4sIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmFycmF5VHlwZSwgc2l6ZV90ICpzaXplKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAic29hcF9pbnN0YW50aWF0ZV9uc19fZWNob0ludGVnZXJSZXNwb25zZSglZCwgJXMsICVzKVxuIiwgbiwgdHlwZT90eXBlOiIiLCBhcnJheVR5cGU/YXJyYXlUeXBlOiIiKSk7CisJc3RydWN0IHNvYXBfY2xpc3QgKmNwID0gc29hcF9saW5rKHNvYXAsIE5VTEwsIFNPQVBfVFlQRV9uc19fZWNob0ludGVnZXJSZXNwb25zZSwgbiwgc29hcF9mZGVsZXRlKTsKKwlpZiAoIWNwKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAobiA8IDApCisJewljcC0+cHRyID0gKHZvaWQqKW5ldyBzdHJ1Y3QgbnNfX2VjaG9JbnRlZ2VyUmVzcG9uc2U7CisJCWlmIChzaXplKQorCQkJKnNpemUgPSBzaXplb2Yoc3RydWN0IG5zX19lY2hvSW50ZWdlclJlc3BvbnNlKTsKKwl9CisJZWxzZQorCXsJY3AtPnB0ciA9ICh2b2lkKiluZXcgc3RydWN0IG5zX19lY2hvSW50ZWdlclJlc3BvbnNlW25dOworCQlpZiAoc2l6ZSkKKwkJCSpzaXplID0gbiAqIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9JbnRlZ2VyUmVzcG9uc2UpOworCX0KKwkJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbnN0YW50aWF0ZWQgbG9jYXRpb249JXBcbiIsIGNwLT5wdHIpKTsKKwlyZXR1cm4gKHN0cnVjdCBuc19fZWNob0ludGVnZXJSZXNwb25zZSopY3AtPnB0cjsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9jb3B5X25zX19lY2hvSW50ZWdlclJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3QsIGludCB0dCwgdm9pZCAqcCwgc2l6ZV90IGxlbiwgY29uc3Qgdm9pZCAqcSwgc2l6ZV90IG4pCit7CisJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5aW5nIHN0cnVjdCBuc19fZWNob0ludGVnZXJSZXNwb25zZSAlcCAtPiAlcFxuIiwgcSwgcCkpOworCSooc3RydWN0IG5zX19lY2hvSW50ZWdlclJlc3BvbnNlKilwID0gKihzdHJ1Y3QgbnNfX2VjaG9JbnRlZ2VyUmVzcG9uc2UqKXE7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX25zX19lY2hvU3RyaW5nQXJyYXkoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBuc19fZWNob1N0cmluZ0FycmF5ICphKQoreworCSh2b2lkKXNvYXA7ICh2b2lkKWE7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLworCXNvYXBfc2VyaWFsaXplX0FycmF5T2ZzdHJpbmcoc29hcCwgJmEtPmlucHV0U3RyaW5nQXJyYXkpOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfbnNfX2VjaG9TdHJpbmdBcnJheShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvU3RyaW5nQXJyYXkgKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisJc29hcF9kZWZhdWx0X0FycmF5T2ZzdHJpbmcoc29hcCwgJmEtPmlucHV0U3RyaW5nQXJyYXkpOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X25zX19lY2hvU3RyaW5nQXJyYXkoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBuc19fZWNob1N0cmluZ0FycmF5ICphLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmVnaXN0ZXIgaW50IGlkID0gc29hcF9lbWJlZChzb2FwLCAodm9pZCopYSwgTlVMTCwgMCwgdGFnLCBTT0FQX1RZUEVfbnNfX2VjaG9TdHJpbmdBcnJheSk7CisJaWYgKHNvYXBfb3V0X25zX19lY2hvU3RyaW5nQXJyYXkoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9uc19fZWNob1N0cmluZ0FycmF5KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgc3RydWN0IG5zX19lY2hvU3RyaW5nQXJyYXkgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIGEsIFNPQVBfVFlQRV9uc19fZWNob1N0cmluZ0FycmF5KSwgdHlwZSk7CisJc29hcF9vdXRfQXJyYXlPZnN0cmluZyhzb2FwLCAiaW5wdXRTdHJpbmdBcnJheSIsIC0xLCAmYS0+aW5wdXRTdHJpbmdBcnJheSwgIiIpOworCXNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7CisJcmV0dXJuIFNPQVBfT0s7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvU3RyaW5nQXJyYXkgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X25zX19lY2hvU3RyaW5nQXJyYXkoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob1N0cmluZ0FycmF5ICpwLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKChwID0gc29hcF9pbl9uc19fZWNob1N0cmluZ0FycmF5KHNvYXAsIHRhZywgcCwgdHlwZSkpKQorCQlzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOworCXJldHVybiBwOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob1N0cmluZ0FycmF5ICogU09BUF9GTUFDNCBzb2FwX2luX25zX19lY2hvU3RyaW5nQXJyYXkoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc3RydWN0IG5zX19lY2hvU3RyaW5nQXJyYXkgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc2hvcnQgc29hcF9mbGFnX2lucHV0U3RyaW5nQXJyYXkgPSAxOworCWlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCpzb2FwLT50eXBlICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpKQorCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisJCXJldHVybiBOVUxMOworCX0KKwlhID0gKHN0cnVjdCBuc19fZWNob1N0cmluZ0FycmF5ICopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgYSwgU09BUF9UWVBFX25zX19lY2hvU3RyaW5nQXJyYXksIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9TdHJpbmdBcnJheSksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworCWlmICghYSkKKwkJcmV0dXJuIE5VTEw7CisJc29hcF9kZWZhdWx0X25zX19lY2hvU3RyaW5nQXJyYXkoc29hcCwgYSk7CisJaWYgKHNvYXAtPmJvZHkgJiYgISpzb2FwLT5ocmVmKQorCXsKKwkJZm9yICg7OykKKwkJewlzb2FwLT5lcnJvciA9IFNPQVBfVEFHX01JU01BVENIOworCQkJaWYgKHNvYXBfZmxhZ19pbnB1dFN0cmluZ0FycmF5ICYmIHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCWlmIChzb2FwX2luX0FycmF5T2ZzdHJpbmcoc29hcCwgImlucHV0U3RyaW5nQXJyYXkiLCAmYS0+aW5wdXRTdHJpbmdBcnJheSwgInhzZDpzdHJpbmciKSkKKwkJCQl7CXNvYXBfZmxhZ19pbnB1dFN0cmluZ0FycmF5LS07CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlzb2FwLT5lcnJvciA9IHNvYXBfaWdub3JlX2VsZW1lbnQoc29hcCk7CisJCQlpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcpCisJCQkJYnJlYWs7CisJCQlpZiAoc29hcC0+ZXJyb3IpCisJCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiAoc29hcF9mbGFnX2lucHV0U3RyaW5nQXJyYXkgPiAwKSkKKwkJewlzb2FwLT5lcnJvciA9IFNPQVBfT0NDVVJTOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwllbHNlCisJewlhID0gKHN0cnVjdCBuc19fZWNob1N0cmluZ0FycmF5ICopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopYSwgMCwgU09BUF9UWVBFX25zX19lY2hvU3RyaW5nQXJyYXksIDAsIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9TdHJpbmdBcnJheSksIDAsIE5VTEwpOworCQlpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGE7Cit9CisKK1NPQVBfRk1BQzUgc3RydWN0IG5zX19lY2hvU3RyaW5nQXJyYXkgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X25zX19lY2hvU3RyaW5nQXJyYXkoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuKQorewlyZXR1cm4gc29hcF9pbnN0YW50aWF0ZV9uc19fZWNob1N0cmluZ0FycmF5KHNvYXAsIG4sIE5VTEwsIE5VTEwsIE5VTEwpOworfQorCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9uc19fZWNob1N0cmluZ0FycmF5KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2VjaG9TdHJpbmdBcnJheSAqcCkKK3sJc29hcF9kZWxldGUoc29hcCwgcCk7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvU3RyaW5nQXJyYXkgKiBTT0FQX0ZNQUM0IHNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG9TdHJpbmdBcnJheShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4sIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmFycmF5VHlwZSwgc2l6ZV90ICpzaXplKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAic29hcF9pbnN0YW50aWF0ZV9uc19fZWNob1N0cmluZ0FycmF5KCVkLCAlcywgJXMpXG4iLCBuLCB0eXBlP3R5cGU6IiIsIGFycmF5VHlwZT9hcnJheVR5cGU6IiIpKTsKKwlzdHJ1Y3Qgc29hcF9jbGlzdCAqY3AgPSBzb2FwX2xpbmsoc29hcCwgTlVMTCwgU09BUF9UWVBFX25zX19lY2hvU3RyaW5nQXJyYXksIG4sIHNvYXBfZmRlbGV0ZSk7CisJaWYgKCFjcCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKG4gPCAwKQorCXsJY3AtPnB0ciA9ICh2b2lkKiluZXcgc3RydWN0IG5zX19lY2hvU3RyaW5nQXJyYXk7CisJCWlmIChzaXplKQorCQkJKnNpemUgPSBzaXplb2Yoc3RydWN0IG5zX19lY2hvU3RyaW5nQXJyYXkpOworCX0KKwllbHNlCisJewljcC0+cHRyID0gKHZvaWQqKW5ldyBzdHJ1Y3QgbnNfX2VjaG9TdHJpbmdBcnJheVtuXTsKKwkJaWYgKHNpemUpCisJCQkqc2l6ZSA9IG4gKiBzaXplb2Yoc3RydWN0IG5zX19lY2hvU3RyaW5nQXJyYXkpOworCX0KKwkJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbnN0YW50aWF0ZWQgbG9jYXRpb249JXBcbiIsIGNwLT5wdHIpKTsKKwlyZXR1cm4gKHN0cnVjdCBuc19fZWNob1N0cmluZ0FycmF5KiljcC0+cHRyOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2NvcHlfbnNfX2VjaG9TdHJpbmdBcnJheShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0LCBpbnQgdHQsIHZvaWQgKnAsIHNpemVfdCBsZW4sIGNvbnN0IHZvaWQgKnEsIHNpemVfdCBuKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weWluZyBzdHJ1Y3QgbnNfX2VjaG9TdHJpbmdBcnJheSAlcCAtPiAlcFxuIiwgcSwgcCkpOworCSooc3RydWN0IG5zX19lY2hvU3RyaW5nQXJyYXkqKXAgPSAqKHN0cnVjdCBuc19fZWNob1N0cmluZ0FycmF5KilxOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9uc19fZWNob1N0cmluZ0FycmF5UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBuc19fZWNob1N0cmluZ0FycmF5UmVzcG9uc2UgKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisJc29hcF9zZXJpYWxpemVfQXJyYXlPZnN0cmluZyhzb2FwLCAmYS0+X3JldHVybik7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9uc19fZWNob1N0cmluZ0FycmF5UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob1N0cmluZ0FycmF5UmVzcG9uc2UgKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisJc29hcF9kZWZhdWx0X0FycmF5T2ZzdHJpbmcoc29hcCwgJmEtPl9yZXR1cm4pOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X25zX19lY2hvU3RyaW5nQXJyYXlSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IG5zX19lY2hvU3RyaW5nQXJyYXlSZXNwb25zZSAqYSwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCXJlZ2lzdGVyIGludCBpZCA9IHNvYXBfZW1iZWQoc29hcCwgKHZvaWQqKWEsIE5VTEwsIDAsIHRhZywgU09BUF9UWVBFX25zX19lY2hvU3RyaW5nQXJyYXlSZXNwb25zZSk7CisJaWYgKHNvYXBfb3V0X25zX19lY2hvU3RyaW5nQXJyYXlSZXNwb25zZShzb2FwLCB0YWcsIGlkLCBhLCB0eXBlKSkKKwkJcmV0dXJuIHNvYXAtPmVycm9yOworCXJldHVybiBzb2FwX3B1dGluZGVwZW5kZW50KHNvYXApOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X25zX19lY2hvU3RyaW5nQXJyYXlSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHN0cnVjdCBuc19fZWNob1N0cmluZ0FycmF5UmVzcG9uc2UgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIGEsIFNPQVBfVFlQRV9uc19fZWNob1N0cmluZ0FycmF5UmVzcG9uc2UpLCB0eXBlKTsKKwlzb2FwX2VsZW1lbnRfcmVzdWx0KHNvYXAsICJyZXR1cm4iKTsKKwlzb2FwX291dF9BcnJheU9mc3RyaW5nKHNvYXAsICJyZXR1cm4iLCAtMSwgJmEtPl9yZXR1cm4sICIiKTsKKwlzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworCXJldHVybiBTT0FQX09LOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob1N0cmluZ0FycmF5UmVzcG9uc2UgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X25zX19lY2hvU3RyaW5nQXJyYXlSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvU3RyaW5nQXJyYXlSZXNwb25zZSAqcCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmICgocCA9IHNvYXBfaW5fbnNfX2VjaG9TdHJpbmdBcnJheVJlc3BvbnNlKHNvYXAsIHRhZywgcCwgdHlwZSkpKQorCQlzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOworCXJldHVybiBwOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob1N0cmluZ0FycmF5UmVzcG9uc2UgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fbnNfX2VjaG9TdHJpbmdBcnJheVJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHN0cnVjdCBuc19fZWNob1N0cmluZ0FycmF5UmVzcG9uc2UgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc2hvcnQgc29hcF9mbGFnX19yZXR1cm4gPSAxOworCWlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCpzb2FwLT50eXBlICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpKQorCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisJCXJldHVybiBOVUxMOworCX0KKwlhID0gKHN0cnVjdCBuc19fZWNob1N0cmluZ0FycmF5UmVzcG9uc2UgKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBhLCBTT0FQX1RZUEVfbnNfX2VjaG9TdHJpbmdBcnJheVJlc3BvbnNlLCBzaXplb2Yoc3RydWN0IG5zX19lY2hvU3RyaW5nQXJyYXlSZXNwb25zZSksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworCWlmICghYSkKKwkJcmV0dXJuIE5VTEw7CisJc29hcF9kZWZhdWx0X25zX19lY2hvU3RyaW5nQXJyYXlSZXNwb25zZShzb2FwLCBhKTsKKwlpZiAoc29hcC0+Ym9keSAmJiAhKnNvYXAtPmhyZWYpCisJeworCQlmb3IgKDs7KQorCQl7CXNvYXAtPmVycm9yID0gU09BUF9UQUdfTUlTTUFUQ0g7CisJCQlpZiAoc29hcF9mbGFnX19yZXR1cm4gJiYgc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJaWYgKHNvYXBfaW5fQXJyYXlPZnN0cmluZyhzb2FwLCBOVUxMLCAmYS0+X3JldHVybiwgInhzZDpzdHJpbmciKSkKKwkJCQl7CXNvYXBfZmxhZ19fcmV0dXJuLS07CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlzb2FwLT5lcnJvciA9IHNvYXBfaWdub3JlX2VsZW1lbnQoc29hcCk7CisJCQlpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcpCisJCQkJYnJlYWs7CisJCQlpZiAoc29hcC0+ZXJyb3IpCisJCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiAoc29hcF9mbGFnX19yZXR1cm4gPiAwKSkKKwkJewlzb2FwLT5lcnJvciA9IFNPQVBfT0NDVVJTOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwllbHNlCisJewlhID0gKHN0cnVjdCBuc19fZWNob1N0cmluZ0FycmF5UmVzcG9uc2UgKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilhLCAwLCBTT0FQX1RZUEVfbnNfX2VjaG9TdHJpbmdBcnJheVJlc3BvbnNlLCAwLCBzaXplb2Yoc3RydWN0IG5zX19lY2hvU3RyaW5nQXJyYXlSZXNwb25zZSksIDAsIE5VTEwpOworCQlpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGE7Cit9CisKK1NPQVBfRk1BQzUgc3RydWN0IG5zX19lY2hvU3RyaW5nQXJyYXlSZXNwb25zZSAqIFNPQVBfRk1BQzYgc29hcF9uZXdfbnNfX2VjaG9TdHJpbmdBcnJheVJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbikKK3sJcmV0dXJuIHNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG9TdHJpbmdBcnJheVJlc3BvbnNlKHNvYXAsIG4sIE5VTEwsIE5VTEwsIE5VTEwpOworfQorCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9uc19fZWNob1N0cmluZ0FycmF5UmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob1N0cmluZ0FycmF5UmVzcG9uc2UgKnApCit7CXNvYXBfZGVsZXRlKHNvYXAsIHApOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob1N0cmluZ0FycmF5UmVzcG9uc2UgKiBTT0FQX0ZNQUM0IHNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG9TdHJpbmdBcnJheVJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbiwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqYXJyYXlUeXBlLCBzaXplX3QgKnNpemUpCit7CisJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvU3RyaW5nQXJyYXlSZXNwb25zZSglZCwgJXMsICVzKVxuIiwgbiwgdHlwZT90eXBlOiIiLCBhcnJheVR5cGU/YXJyYXlUeXBlOiIiKSk7CisJc3RydWN0IHNvYXBfY2xpc3QgKmNwID0gc29hcF9saW5rKHNvYXAsIE5VTEwsIFNPQVBfVFlQRV9uc19fZWNob1N0cmluZ0FycmF5UmVzcG9uc2UsIG4sIHNvYXBfZmRlbGV0ZSk7CisJaWYgKCFjcCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKG4gPCAwKQorCXsJY3AtPnB0ciA9ICh2b2lkKiluZXcgc3RydWN0IG5zX19lY2hvU3RyaW5nQXJyYXlSZXNwb25zZTsKKwkJaWYgKHNpemUpCisJCQkqc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9TdHJpbmdBcnJheVJlc3BvbnNlKTsKKwl9CisJZWxzZQorCXsJY3AtPnB0ciA9ICh2b2lkKiluZXcgc3RydWN0IG5zX19lY2hvU3RyaW5nQXJyYXlSZXNwb25zZVtuXTsKKwkJaWYgKHNpemUpCisJCQkqc2l6ZSA9IG4gKiBzaXplb2Yoc3RydWN0IG5zX19lY2hvU3RyaW5nQXJyYXlSZXNwb25zZSk7CisJfQorCQlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluc3RhbnRpYXRlZCBsb2NhdGlvbj0lcFxuIiwgY3AtPnB0cikpOworCXJldHVybiAoc3RydWN0IG5zX19lY2hvU3RyaW5nQXJyYXlSZXNwb25zZSopY3AtPnB0cjsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9jb3B5X25zX19lY2hvU3RyaW5nQXJyYXlSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0LCBpbnQgdHQsIHZvaWQgKnAsIHNpemVfdCBsZW4sIGNvbnN0IHZvaWQgKnEsIHNpemVfdCBuKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weWluZyBzdHJ1Y3QgbnNfX2VjaG9TdHJpbmdBcnJheVJlc3BvbnNlICVwIC0+ICVwXG4iLCBxLCBwKSk7CisJKihzdHJ1Y3QgbnNfX2VjaG9TdHJpbmdBcnJheVJlc3BvbnNlKilwID0gKihzdHJ1Y3QgbnNfX2VjaG9TdHJpbmdBcnJheVJlc3BvbnNlKilxOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9BcnJheU9mc3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgQXJyYXlPZnN0cmluZyBjb25zdCphKQoreworCWludCBpOworCWlmIChhLT5fX3B0ciAmJiAhc29hcF9hcnJheV9yZWZlcmVuY2Uoc29hcCwgYSwgKHN0cnVjdCBzb2FwX2FycmF5KikmYS0+X19wdHIsIDEsIFNPQVBfVFlQRV9BcnJheU9mc3RyaW5nKSkKKwkJZm9yIChpID0gMDsgaSA8IGEtPl9fc2l6ZTsgaSsrKQorCQl7CisJCQlzb2FwX3NlcmlhbGl6ZV94c2RfX3N0cmluZyhzb2FwLCBhLT5fX3B0ciArIGkpOworCQl9Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9BcnJheU9mc3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgQXJyYXlPZnN0cmluZyAqYSkKK3sKKwlhLT5fX3NpemUgPSAwOworCWEtPl9fcHRyID0gTlVMTDsKKwlhLT5fX29mZnNldCA9IDA7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfQXJyYXlPZnN0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IEFycmF5T2ZzdHJpbmcgKmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZWdpc3RlciBpbnQgaWQgPSBzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCAoc3RydWN0IHNvYXBfYXJyYXkqKSZhLT5fX3B0ciwgMSwgdGFnLCBTT0FQX1RZUEVfQXJyYXlPZnN0cmluZyk7CisJaWYgKHNvYXBfb3V0X0FycmF5T2ZzdHJpbmcoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9BcnJheU9mc3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgc3RydWN0IEFycmF5T2ZzdHJpbmcgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaW50IGksIG4gPSBhLT5fX3NpemU7CisJY2hhciAqdCA9IHNvYXBfcHV0c2l6ZShzb2FwLCAieHNkOnN0cmluZyIsIG4gKyBhLT5fX29mZnNldCk7CisJaWQgPSBzb2FwX2VsZW1lbnRfaWQoc29hcCwgdGFnLCBpZCwgYSwgKHN0cnVjdCBzb2FwX2FycmF5KikmYS0+X19wdHIsIDEsIHR5cGUsIFNPQVBfVFlQRV9BcnJheU9mc3RyaW5nKTsKKwlpZiAoaWQgPCAwKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJc29hcF9hcnJheV9iZWdpbl9vdXQoc29hcCwgdGFnLCBpZCwgdCwgc29hcF9wdXRvZmZzZXQoc29hcCwgYS0+X19vZmZzZXQpKTsKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorCXsKKwkJc29hcC0+cG9zaXRpb24gPSAxOworCQlzb2FwLT5wb3NpdGlvbnNbMF0gPSBpOworCQlzb2FwX291dF94c2RfX3N0cmluZyhzb2FwLCAiaXRlbSIsIC0xLCAmYS0+X19wdHJbaV0sICIiKTsKKwl9CisJc29hcC0+cG9zaXRpb24gPSAwOworCXNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7CisJcmV0dXJuIFNPQVBfT0s7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IEFycmF5T2ZzdHJpbmcgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X0FycmF5T2ZzdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBBcnJheU9mc3RyaW5nICpwLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKChwID0gc29hcF9pbl9BcnJheU9mc3RyaW5nKHNvYXAsIHRhZywgcCwgdHlwZSkpKQorCQlzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOworCXJldHVybiBwOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBBcnJheU9mc3RyaW5nICogU09BUF9GTUFDNCBzb2FwX2luX0FycmF5T2ZzdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc3RydWN0IEFycmF5T2ZzdHJpbmcgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CWludCBpLCBqOworCWNoYXIgKipwOworCWlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAxKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKHNvYXBfbWF0Y2hfYXJyYXkoc29hcCwgdHlwZSkpCisJewlzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWEgPSAoc3RydWN0IEFycmF5T2ZzdHJpbmcgKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBhLCBTT0FQX1RZUEVfQXJyYXlPZnN0cmluZywgc2l6ZW9mKHN0cnVjdCBBcnJheU9mc3RyaW5nKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJaWYgKCFhKQorCQlyZXR1cm4gTlVMTDsKKwlzb2FwX2RlZmF1bHRfQXJyYXlPZnN0cmluZyhzb2FwLCBhKTsKKwlpZiAoc29hcC0+Ym9keSAmJiAhKnNvYXAtPmhyZWYpCisJeworCQlhLT5fX3NpemUgPSBzb2FwX2dldHNpemUoc29hcC0+YXJyYXlTaXplLCBzb2FwLT5hcnJheU9mZnNldCwgJmopOworCQlhLT5fX29mZnNldCA9IGo7CisJCWlmIChhLT5fX3NpemUgPj0gMCkKKwkJewlhLT5fX3B0ciA9IChjaGFyICoqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihjaGFyICopICogYS0+X19zaXplKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBhLT5fX3NpemU7IGkrKykKKwkJCQlhLT5fX3B0cltpXSA9IE5VTEw7CisJCQlmb3IgKGkgPSAwOyBpIDwgYS0+X19zaXplOyBpKyspCisJCQl7CXNvYXBfcGVla19lbGVtZW50KHNvYXApOworCQkJCWlmIChzb2FwLT5wb3NpdGlvbikKKwkJCQl7CWkgPSBzb2FwLT5wb3NpdGlvbnNbMF0tajsKKwkJCQkJaWYgKGkgPCAwIHx8IGkgPj0gYS0+X19zaXplKQorCQkJCQl7CXNvYXAtPmVycm9yID0gU09BUF9JT0I7CisJCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoIXNvYXBfaW5feHNkX19zdHJpbmcoc29hcCwgTlVMTCwgYS0+X19wdHIgKyBpLCAieHNkOnN0cmluZyIpKQorCQkJCXsJaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfTk9fVEFHKQorCQkJCQkJcmV0dXJuIE5VTEw7CisJCQkJCXNvYXAtPmVycm9yID0gU09BUF9PSzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJewlzb2FwX25ld19ibG9jayhzb2FwKTsKKwkJCWZvciAoYS0+X19zaXplID0gMDsgOyBhLT5fX3NpemUrKykKKwkJCXsJcCA9IChjaGFyICoqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBzaXplb2YoY2hhciAqKSk7CisJCQkJaWYgKCFwKQorCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQkqcCA9IE5VTEw7CisJCQkJaWYgKCFzb2FwX2luX3hzZF9fc3RyaW5nKHNvYXAsIE5VTEwsIHAsICJ4c2Q6c3RyaW5nIikpCisJCQkJewlpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9OT19UQUcpCisJCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQkJc29hcC0+ZXJyb3IgPSBTT0FQX09LOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlzb2FwX3BvcF9ibG9jayhzb2FwKTsKKwkJCWEtPl9fcHRyID0gKGNoYXIgKiopc29hcF9tYWxsb2Moc29hcCwgc29hcC0+Ymxpc3QtPnNpemUpOworCQkJc29hcF9zYXZlX2Jsb2NrKHNvYXAsIChjaGFyKilhLT5fX3B0ciwgMSk7CisJCX0KKwkJaWYgKHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwllbHNlCisJewlhID0gKHN0cnVjdCBBcnJheU9mc3RyaW5nICopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopYSwgMCwgU09BUF9UWVBFX0FycmF5T2ZzdHJpbmcsIDAsIHNpemVvZihzdHJ1Y3QgQXJyYXlPZnN0cmluZyksIDAsIE5VTEwpOworCQlpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGE7Cit9CisKK1NPQVBfRk1BQzUgc3RydWN0IEFycmF5T2ZzdHJpbmcgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X0FycmF5T2ZzdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuKQorewlyZXR1cm4gc29hcF9pbnN0YW50aWF0ZV9BcnJheU9mc3RyaW5nKHNvYXAsIG4sIE5VTEwsIE5VTEwsIE5VTEwpOworfQorCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9BcnJheU9mc3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgQXJyYXlPZnN0cmluZyAqcCkKK3sJc29hcF9kZWxldGUoc29hcCwgcCk7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IEFycmF5T2ZzdHJpbmcgKiBTT0FQX0ZNQUM0IHNvYXBfaW5zdGFudGlhdGVfQXJyYXlPZnN0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4sIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmFycmF5VHlwZSwgc2l6ZV90ICpzaXplKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAic29hcF9pbnN0YW50aWF0ZV9BcnJheU9mc3RyaW5nKCVkLCAlcywgJXMpXG4iLCBuLCB0eXBlP3R5cGU6IiIsIGFycmF5VHlwZT9hcnJheVR5cGU6IiIpKTsKKwlzdHJ1Y3Qgc29hcF9jbGlzdCAqY3AgPSBzb2FwX2xpbmsoc29hcCwgTlVMTCwgU09BUF9UWVBFX0FycmF5T2ZzdHJpbmcsIG4sIHNvYXBfZmRlbGV0ZSk7CisJaWYgKCFjcCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKG4gPCAwKQorCXsJY3AtPnB0ciA9ICh2b2lkKiluZXcgc3RydWN0IEFycmF5T2ZzdHJpbmc7CisJCWlmIChzaXplKQorCQkJKnNpemUgPSBzaXplb2Yoc3RydWN0IEFycmF5T2ZzdHJpbmcpOworCX0KKwllbHNlCisJewljcC0+cHRyID0gKHZvaWQqKW5ldyBzdHJ1Y3QgQXJyYXlPZnN0cmluZ1tuXTsKKwkJaWYgKHNpemUpCisJCQkqc2l6ZSA9IG4gKiBzaXplb2Yoc3RydWN0IEFycmF5T2ZzdHJpbmcpOworCX0KKwkJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbnN0YW50aWF0ZWQgbG9jYXRpb249JXBcbiIsIGNwLT5wdHIpKTsKKwlyZXR1cm4gKHN0cnVjdCBBcnJheU9mc3RyaW5nKiljcC0+cHRyOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2NvcHlfQXJyYXlPZnN0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0LCBpbnQgdHQsIHZvaWQgKnAsIHNpemVfdCBsZW4sIGNvbnN0IHZvaWQgKnEsIHNpemVfdCBuKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weWluZyBzdHJ1Y3QgQXJyYXlPZnN0cmluZyAlcCAtPiAlcFxuIiwgcSwgcCkpOworCSooc3RydWN0IEFycmF5T2ZzdHJpbmcqKXAgPSAqKHN0cnVjdCBBcnJheU9mc3RyaW5nKilxOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9uc19fZWNob1N0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IG5zX19lY2hvU3RyaW5nICphKQoreworCSh2b2lkKXNvYXA7ICh2b2lkKWE7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLworCXNvYXBfc2VyaWFsaXplX3hzZF9fc3RyaW5nKHNvYXAsICZhLT5pbnB1dFN0cmluZyk7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9uc19fZWNob1N0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvU3RyaW5nICphKQoreworCSh2b2lkKXNvYXA7ICh2b2lkKWE7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLworCXNvYXBfZGVmYXVsdF94c2RfX3N0cmluZyhzb2FwLCAmYS0+aW5wdXRTdHJpbmcpOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X25zX19lY2hvU3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG9TdHJpbmcgKmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZWdpc3RlciBpbnQgaWQgPSBzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCBOVUxMLCAwLCB0YWcsIFNPQVBfVFlQRV9uc19fZWNob1N0cmluZyk7CisJaWYgKHNvYXBfb3V0X25zX19lY2hvU3RyaW5nKHNvYXAsIHRhZywgaWQsIGEsIHR5cGUpKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJcmV0dXJuIHNvYXBfcHV0aW5kZXBlbmRlbnQoc29hcCk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfbnNfX2VjaG9TdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG9TdHJpbmcgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIGEsIFNPQVBfVFlQRV9uc19fZWNob1N0cmluZyksIHR5cGUpOworCXNvYXBfb3V0X3hzZF9fc3RyaW5nKHNvYXAsICJpbnB1dFN0cmluZyIsIC0xLCAmYS0+aW5wdXRTdHJpbmcsICIiKTsKKwlzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworCXJldHVybiBTT0FQX09LOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob1N0cmluZyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfbnNfX2VjaG9TdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob1N0cmluZyAqcCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmICgocCA9IHNvYXBfaW5fbnNfX2VjaG9TdHJpbmcoc29hcCwgdGFnLCBwLCB0eXBlKSkpCisJCXNvYXBfZ2V0aW5kZXBlbmRlbnQoc29hcCk7CisJcmV0dXJuIHA7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvU3RyaW5nICogU09BUF9GTUFDNCBzb2FwX2luX25zX19lY2hvU3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHN0cnVjdCBuc19fZWNob1N0cmluZyAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlzaG9ydCBzb2FwX2ZsYWdfaW5wdXRTdHJpbmcgPSAxOworCWlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCpzb2FwLT50eXBlICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpKQorCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisJCXJldHVybiBOVUxMOworCX0KKwlhID0gKHN0cnVjdCBuc19fZWNob1N0cmluZyAqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIGEsIFNPQVBfVFlQRV9uc19fZWNob1N0cmluZywgc2l6ZW9mKHN0cnVjdCBuc19fZWNob1N0cmluZyksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworCWlmICghYSkKKwkJcmV0dXJuIE5VTEw7CisJc29hcF9kZWZhdWx0X25zX19lY2hvU3RyaW5nKHNvYXAsIGEpOworCWlmIChzb2FwLT5ib2R5ICYmICEqc29hcC0+aHJlZikKKwl7CisJCWZvciAoOzspCisJCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RBR19NSVNNQVRDSDsKKwkJCWlmIChzb2FwX2ZsYWdfaW5wdXRTdHJpbmcgJiYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIIHx8IHNvYXAtPmVycm9yID09IFNPQVBfTk9fVEFHKSkKKwkJCQlpZiAoc29hcF9pbl94c2RfX3N0cmluZyhzb2FwLCAiaW5wdXRTdHJpbmciLCAmYS0+aW5wdXRTdHJpbmcsICJ4c2Q6c3RyaW5nIikpCisJCQkJewlzb2FwX2ZsYWdfaW5wdXRTdHJpbmctLTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCXNvYXAtPmVycm9yID0gc29hcF9pZ25vcmVfZWxlbWVudChzb2FwKTsKKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykKKwkJCQlicmVhazsKKwkJCWlmIChzb2FwLT5lcnJvcikKKwkJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCWVsc2UKKwl7CWEgPSAoc3RydWN0IG5zX19lY2hvU3RyaW5nICopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopYSwgMCwgU09BUF9UWVBFX25zX19lY2hvU3RyaW5nLCAwLCBzaXplb2Yoc3RydWN0IG5zX19lY2hvU3RyaW5nKSwgMCwgTlVMTCk7CisJCWlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gYTsKK30KKworU09BUF9GTUFDNSBzdHJ1Y3QgbnNfX2VjaG9TdHJpbmcgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X25zX19lY2hvU3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbikKK3sJcmV0dXJuIHNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG9TdHJpbmcoc29hcCwgbiwgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX25zX19lY2hvU3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2VjaG9TdHJpbmcgKnApCit7CXNvYXBfZGVsZXRlKHNvYXAsIHApOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob1N0cmluZyAqIFNPQVBfRk1BQzQgc29hcF9pbnN0YW50aWF0ZV9uc19fZWNob1N0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4sIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmFycmF5VHlwZSwgc2l6ZV90ICpzaXplKQoreworCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAic29hcF9pbnN0YW50aWF0ZV9uc19fZWNob1N0cmluZyglZCwgJXMsICVzKVxuIiwgbiwgdHlwZT90eXBlOiIiLCBhcnJheVR5cGU/YXJyYXlUeXBlOiIiKSk7CisJc3RydWN0IHNvYXBfY2xpc3QgKmNwID0gc29hcF9saW5rKHNvYXAsIE5VTEwsIFNPQVBfVFlQRV9uc19fZWNob1N0cmluZywgbiwgc29hcF9mZGVsZXRlKTsKKwlpZiAoIWNwKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAobiA8IDApCisJewljcC0+cHRyID0gKHZvaWQqKW5ldyBzdHJ1Y3QgbnNfX2VjaG9TdHJpbmc7CisJCWlmIChzaXplKQorCQkJKnNpemUgPSBzaXplb2Yoc3RydWN0IG5zX19lY2hvU3RyaW5nKTsKKwl9CisJZWxzZQorCXsJY3AtPnB0ciA9ICh2b2lkKiluZXcgc3RydWN0IG5zX19lY2hvU3RyaW5nW25dOworCQlpZiAoc2l6ZSkKKwkJCSpzaXplID0gbiAqIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9TdHJpbmcpOworCX0KKwkJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbnN0YW50aWF0ZWQgbG9jYXRpb249JXBcbiIsIGNwLT5wdHIpKTsKKwlyZXR1cm4gKHN0cnVjdCBuc19fZWNob1N0cmluZyopY3AtPnB0cjsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9jb3B5X25zX19lY2hvU3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3QsIGludCB0dCwgdm9pZCAqcCwgc2l6ZV90IGxlbiwgY29uc3Qgdm9pZCAqcSwgc2l6ZV90IG4pCit7CisJREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5aW5nIHN0cnVjdCBuc19fZWNob1N0cmluZyAlcCAtPiAlcFxuIiwgcSwgcCkpOworCSooc3RydWN0IG5zX19lY2hvU3RyaW5nKilwID0gKihzdHJ1Y3QgbnNfX2VjaG9TdHJpbmcqKXE7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX25zX19lY2hvU3RyaW5nUmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBuc19fZWNob1N0cmluZ1Jlc3BvbnNlICphKQoreworCSh2b2lkKXNvYXA7ICh2b2lkKWE7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLworCXNvYXBfc2VyaWFsaXplX3hzZF9fc3RyaW5nKHNvYXAsICZhLT5fcmV0dXJuKTsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X25zX19lY2hvU3RyaW5nUmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob1N0cmluZ1Jlc3BvbnNlICphKQoreworCSh2b2lkKXNvYXA7ICh2b2lkKWE7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLworCXNvYXBfZGVmYXVsdF94c2RfX3N0cmluZyhzb2FwLCAmYS0+X3JldHVybik7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfbnNfX2VjaG9TdHJpbmdSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IG5zX19lY2hvU3RyaW5nUmVzcG9uc2UgKmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZWdpc3RlciBpbnQgaWQgPSBzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCBOVUxMLCAwLCB0YWcsIFNPQVBfVFlQRV9uc19fZWNob1N0cmluZ1Jlc3BvbnNlKTsKKwlpZiAoc29hcF9vdXRfbnNfX2VjaG9TdHJpbmdSZXNwb25zZShzb2FwLCB0YWcsIGlkLCBhLCB0eXBlKSkKKwkJcmV0dXJuIHNvYXAtPmVycm9yOworCXJldHVybiBzb2FwX3B1dGluZGVwZW5kZW50KHNvYXApOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X25zX19lY2hvU3RyaW5nUmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzdHJ1Y3QgbnNfX2VjaG9TdHJpbmdSZXNwb25zZSAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgYSwgU09BUF9UWVBFX25zX19lY2hvU3RyaW5nUmVzcG9uc2UpLCB0eXBlKTsKKwlpZiAoYS0+X3JldHVybikKKwkJc29hcF9lbGVtZW50X3Jlc3VsdChzb2FwLCAicmV0dXJuIik7CisJc29hcF9vdXRfeHNkX19zdHJpbmcoc29hcCwgInJldHVybiIsIC0xLCAmYS0+X3JldHVybiwgIiIpOworCXNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7CisJcmV0dXJuIFNPQVBfT0s7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19lY2hvU3RyaW5nUmVzcG9uc2UgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X25zX19lY2hvU3RyaW5nUmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZWNob1N0cmluZ1Jlc3BvbnNlICpwLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKChwID0gc29hcF9pbl9uc19fZWNob1N0cmluZ1Jlc3BvbnNlKHNvYXAsIHRhZywgcCwgdHlwZSkpKQorCQlzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOworCXJldHVybiBwOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob1N0cmluZ1Jlc3BvbnNlICogU09BUF9GTUFDNCBzb2FwX2luX25zX19lY2hvU3RyaW5nUmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc3RydWN0IG5zX19lY2hvU3RyaW5nUmVzcG9uc2UgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc2hvcnQgc29hcF9mbGFnX19yZXR1cm4gPSAxOworCWlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCpzb2FwLT50eXBlICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpKQorCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisJCXJldHVybiBOVUxMOworCX0KKwlhID0gKHN0cnVjdCBuc19fZWNob1N0cmluZ1Jlc3BvbnNlICopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgYSwgU09BUF9UWVBFX25zX19lY2hvU3RyaW5nUmVzcG9uc2UsIHNpemVvZihzdHJ1Y3QgbnNfX2VjaG9TdHJpbmdSZXNwb25zZSksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworCWlmICghYSkKKwkJcmV0dXJuIE5VTEw7CisJc29hcF9kZWZhdWx0X25zX19lY2hvU3RyaW5nUmVzcG9uc2Uoc29hcCwgYSk7CisJaWYgKHNvYXAtPmJvZHkgJiYgISpzb2FwLT5ocmVmKQorCXsKKwkJZm9yICg7OykKKwkJewlzb2FwLT5lcnJvciA9IFNPQVBfVEFHX01JU01BVENIOworCQkJaWYgKHNvYXBfZmxhZ19fcmV0dXJuICYmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCB8fCBzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykpCisJCQkJaWYgKHNvYXBfaW5feHNkX19zdHJpbmcoc29hcCwgTlVMTCwgJmEtPl9yZXR1cm4sICJ4c2Q6c3RyaW5nIikpCisJCQkJewlzb2FwX2ZsYWdfX3JldHVybi0tOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQlpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJc29hcC0+ZXJyb3IgPSBzb2FwX2lnbm9yZV9lbGVtZW50KHNvYXApOworCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfTk9fVEFHKQorCQkJCWJyZWFrOworCQkJaWYgKHNvYXAtPmVycm9yKQorCQkJCXJldHVybiBOVUxMOworCQl9CisJCWlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgKHNvYXBfZmxhZ19fcmV0dXJuID4gMCkpCisJCXsJc29hcC0+ZXJyb3IgPSBTT0FQX09DQ1VSUzsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWlmIChzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJZWxzZQorCXsJYSA9IChzdHJ1Y3QgbnNfX2VjaG9TdHJpbmdSZXNwb25zZSAqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCAodm9pZCoqKWEsIDAsIFNPQVBfVFlQRV9uc19fZWNob1N0cmluZ1Jlc3BvbnNlLCAwLCBzaXplb2Yoc3RydWN0IG5zX19lY2hvU3RyaW5nUmVzcG9uc2UpLCAwLCBOVUxMKTsKKwkJaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBhOworfQorCitTT0FQX0ZNQUM1IHN0cnVjdCBuc19fZWNob1N0cmluZ1Jlc3BvbnNlICogU09BUF9GTUFDNiBzb2FwX25ld19uc19fZWNob1N0cmluZ1Jlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbikKK3sJcmV0dXJuIHNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG9TdHJpbmdSZXNwb25zZShzb2FwLCBuLCBOVUxMLCBOVUxMLCBOVUxMKTsKK30KKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfbnNfX2VjaG9TdHJpbmdSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19lY2hvU3RyaW5nUmVzcG9uc2UgKnApCit7CXNvYXBfZGVsZXRlKHNvYXAsIHApOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZWNob1N0cmluZ1Jlc3BvbnNlICogU09BUF9GTUFDNCBzb2FwX2luc3RhbnRpYXRlX25zX19lY2hvU3RyaW5nUmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICphcnJheVR5cGUsIHNpemVfdCAqc2l6ZSkKK3sKKwlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgInNvYXBfaW5zdGFudGlhdGVfbnNfX2VjaG9TdHJpbmdSZXNwb25zZSglZCwgJXMsICVzKVxuIiwgbiwgdHlwZT90eXBlOiIiLCBhcnJheVR5cGU/YXJyYXlUeXBlOiIiKSk7CisJc3RydWN0IHNvYXBfY2xpc3QgKmNwID0gc29hcF9saW5rKHNvYXAsIE5VTEwsIFNPQVBfVFlQRV9uc19fZWNob1N0cmluZ1Jlc3BvbnNlLCBuLCBzb2FwX2ZkZWxldGUpOworCWlmICghY3ApCisJCXJldHVybiBOVUxMOworCWlmIChuIDwgMCkKKwl7CWNwLT5wdHIgPSAodm9pZCopbmV3IHN0cnVjdCBuc19fZWNob1N0cmluZ1Jlc3BvbnNlOworCQlpZiAoc2l6ZSkKKwkJCSpzaXplID0gc2l6ZW9mKHN0cnVjdCBuc19fZWNob1N0cmluZ1Jlc3BvbnNlKTsKKwl9CisJZWxzZQorCXsJY3AtPnB0ciA9ICh2b2lkKiluZXcgc3RydWN0IG5zX19lY2hvU3RyaW5nUmVzcG9uc2Vbbl07CisJCWlmIChzaXplKQorCQkJKnNpemUgPSBuICogc2l6ZW9mKHN0cnVjdCBuc19fZWNob1N0cmluZ1Jlc3BvbnNlKTsKKwl9CisJCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5zdGFudGlhdGVkIGxvY2F0aW9uPSVwXG4iLCBjcC0+cHRyKSk7CisJcmV0dXJuIChzdHJ1Y3QgbnNfX2VjaG9TdHJpbmdSZXNwb25zZSopY3AtPnB0cjsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9jb3B5X25zX19lY2hvU3RyaW5nUmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdCwgaW50IHR0LCB2b2lkICpwLCBzaXplX3QgbGVuLCBjb25zdCB2b2lkICpxLCBzaXplX3QgbikKK3sKKwlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHlpbmcgc3RydWN0IG5zX19lY2hvU3RyaW5nUmVzcG9uc2UgJXAgLT4gJXBcbiIsIHEsIHApKTsKKwkqKHN0cnVjdCBuc19fZWNob1N0cmluZ1Jlc3BvbnNlKilwID0gKihzdHJ1Y3QgbnNfX2VjaG9TdHJpbmdSZXNwb25zZSopcTsKK30KKworI2lmbmRlZiBXSVRIX05PR0xPQkFMCisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb1NPQVBfRU5WX19SZWFzb24oc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBTT0FQX0VOVl9fUmVhc29uICpjb25zdCphKQoreworCWlmICghc29hcF9yZWZlcmVuY2Uoc29hcCwgKmEsIFNPQVBfVFlQRV9TT0FQX0VOVl9fUmVhc29uKSkKKwkJc29hcF9zZXJpYWxpemVfU09BUF9FTlZfX1JlYXNvbihzb2FwLCAqYSk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvU09BUF9FTlZfX1JlYXNvbihzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IFNPQVBfRU5WX19SZWFzb24gKmNvbnN0KmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZWdpc3RlciBpbnQgaWQgPSBzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCBOVUxMLCAwLCB0YWcsIFNPQVBfVFlQRV9Qb2ludGVyVG9TT0FQX0VOVl9fUmVhc29uKTsKKwlpZiAoc29hcF9vdXRfUG9pbnRlclRvU09BUF9FTlZfX1JlYXNvbihzb2FwLCB0YWcsIGlkLCBhLCB0eXBlKSkKKwkJcmV0dXJuIHNvYXAtPmVycm9yOworCXJldHVybiBzb2FwX3B1dGluZGVwZW5kZW50KHNvYXApOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb1NPQVBfRU5WX19SZWFzb24oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBzdHJ1Y3QgU09BUF9FTlZfX1JlYXNvbiAqY29uc3QqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZCA9IHNvYXBfZWxlbWVudF9pZChzb2FwLCB0YWcsIGlkLCAqYSwgTlVMTCwgMCwgdHlwZSwgU09BUF9UWVBFX1NPQVBfRU5WX19SZWFzb24pOworCWlmIChpZCA8IDApCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9vdXRfU09BUF9FTlZfX1JlYXNvbihzb2FwLCB0YWcsIGlkLCAqYSwgdHlwZSk7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IFNPQVBfRU5WX19SZWFzb24gKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG9TT0FQX0VOVl9fUmVhc29uKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgU09BUF9FTlZfX1JlYXNvbiAqKnAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoKHAgPSBzb2FwX2luX1BvaW50ZXJUb1NPQVBfRU5WX19SZWFzb24oc29hcCwgdGFnLCBwLCB0eXBlKSkpCisJCXNvYXBfZ2V0aW5kZXBlbmRlbnQoc29hcCk7CisJcmV0dXJuIHA7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IFNPQVBfRU5WX19SZWFzb24gKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb1NPQVBfRU5WX19SZWFzb24oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc3RydWN0IFNPQVBfRU5WX19SZWFzb24gKiphLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAxKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCFhKQorCQlpZiAoIShhID0gKHN0cnVjdCBTT0FQX0VOVl9fUmVhc29uICoqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3QgU09BUF9FTlZfX1JlYXNvbiAqKSkpKQorCQkJcmV0dXJuIE5VTEw7CisJKmEgPSBOVUxMOworCWlmICghc29hcC0+bnVsbCAmJiAqc29hcC0+aHJlZiAhPSAnIycpCisJewlzb2FwX3JldmVydChzb2FwKTsKKwkJaWYgKCEoKmEgPSBzb2FwX2luX1NPQVBfRU5WX19SZWFzb24oc29hcCwgdGFnLCAqYSwgdHlwZSkpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCWVsc2UKKwl7CWEgPSAoc3RydWN0IFNPQVBfRU5WX19SZWFzb24gKiopc29hcF9pZF9sb29rdXAoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilhLCBTT0FQX1RZUEVfU09BUF9FTlZfX1JlYXNvbiwgc2l6ZW9mKHN0cnVjdCBTT0FQX0VOVl9fUmVhc29uKSwgMCk7CisJCWlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gYTsKK30KKworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9OT0dMT0JBTAorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG9TT0FQX0VOVl9fRGV0YWlsKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgU09BUF9FTlZfX0RldGFpbCAqY29uc3QqYSkKK3sKKwlpZiAoIXNvYXBfcmVmZXJlbmNlKHNvYXAsICphLCBTT0FQX1RZUEVfU09BUF9FTlZfX0RldGFpbCkpCisJCXNvYXBfc2VyaWFsaXplX1NPQVBfRU5WX19EZXRhaWwoc29hcCwgKmEpOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb1NPQVBfRU5WX19EZXRhaWwoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBTT0FQX0VOVl9fRGV0YWlsICpjb25zdCphLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmVnaXN0ZXIgaW50IGlkID0gc29hcF9lbWJlZChzb2FwLCAodm9pZCopYSwgTlVMTCwgMCwgdGFnLCBTT0FQX1RZUEVfUG9pbnRlclRvU09BUF9FTlZfX0RldGFpbCk7CisJaWYgKHNvYXBfb3V0X1BvaW50ZXJUb1NPQVBfRU5WX19EZXRhaWwoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG9TT0FQX0VOVl9fRGV0YWlsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgc3RydWN0IFNPQVBfRU5WX19EZXRhaWwgKmNvbnN0KmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWQgPSBzb2FwX2VsZW1lbnRfaWQoc29hcCwgdGFnLCBpZCwgKmEsIE5VTEwsIDAsIHR5cGUsIFNPQVBfVFlQRV9TT0FQX0VOVl9fRGV0YWlsKTsKKwlpZiAoaWQgPCAwKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJcmV0dXJuIHNvYXBfb3V0X1NPQVBfRU5WX19EZXRhaWwoc29hcCwgdGFnLCBpZCwgKmEsIHR5cGUpOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBTT0FQX0VOVl9fRGV0YWlsICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvU09BUF9FTlZfX0RldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IFNPQVBfRU5WX19EZXRhaWwgKipwLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKChwID0gc29hcF9pbl9Qb2ludGVyVG9TT0FQX0VOVl9fRGV0YWlsKHNvYXAsIHRhZywgcCwgdHlwZSkpKQorCQlzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOworCXJldHVybiBwOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBTT0FQX0VOVl9fRGV0YWlsICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG9TT0FQX0VOVl9fRGV0YWlsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHN0cnVjdCBTT0FQX0VOVl9fRGV0YWlsICoqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMSkpCisJCXJldHVybiBOVUxMOworCWlmICghYSkKKwkJaWYgKCEoYSA9IChzdHJ1Y3QgU09BUF9FTlZfX0RldGFpbCAqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IFNPQVBfRU5WX19EZXRhaWwgKikpKSkKKwkJCXJldHVybiBOVUxMOworCSphID0gTlVMTDsKKwlpZiAoIXNvYXAtPm51bGwgJiYgKnNvYXAtPmhyZWYgIT0gJyMnKQorCXsJc29hcF9yZXZlcnQoc29hcCk7CisJCWlmICghKCphID0gc29hcF9pbl9TT0FQX0VOVl9fRGV0YWlsKHNvYXAsIHRhZywgKmEsIHR5cGUpKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwllbHNlCisJewlhID0gKHN0cnVjdCBTT0FQX0VOVl9fRGV0YWlsICoqKXNvYXBfaWRfbG9va3VwKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopYSwgU09BUF9UWVBFX1NPQVBfRU5WX19EZXRhaWwsIHNpemVvZihzdHJ1Y3QgU09BUF9FTlZfX0RldGFpbCksIDApOworCQlpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGE7Cit9CisKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9HTE9CQUwKKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvU09BUF9FTlZfX0NvZGUoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBTT0FQX0VOVl9fQ29kZSAqY29uc3QqYSkKK3sKKwlpZiAoIXNvYXBfcmVmZXJlbmNlKHNvYXAsICphLCBTT0FQX1RZUEVfU09BUF9FTlZfX0NvZGUpKQorCQlzb2FwX3NlcmlhbGl6ZV9TT0FQX0VOVl9fQ29kZShzb2FwLCAqYSk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvU09BUF9FTlZfX0NvZGUoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBTT0FQX0VOVl9fQ29kZSAqY29uc3QqYSwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCXJlZ2lzdGVyIGludCBpZCA9IHNvYXBfZW1iZWQoc29hcCwgKHZvaWQqKWEsIE5VTEwsIDAsIHRhZywgU09BUF9UWVBFX1BvaW50ZXJUb1NPQVBfRU5WX19Db2RlKTsKKwlpZiAoc29hcF9vdXRfUG9pbnRlclRvU09BUF9FTlZfX0NvZGUoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG9TT0FQX0VOVl9fQ29kZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIHN0cnVjdCBTT0FQX0VOVl9fQ29kZSAqY29uc3QqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZCA9IHNvYXBfZWxlbWVudF9pZChzb2FwLCB0YWcsIGlkLCAqYSwgTlVMTCwgMCwgdHlwZSwgU09BUF9UWVBFX1NPQVBfRU5WX19Db2RlKTsKKwlpZiAoaWQgPCAwKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJcmV0dXJuIHNvYXBfb3V0X1NPQVBfRU5WX19Db2RlKHNvYXAsIHRhZywgaWQsICphLCB0eXBlKTsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgU09BUF9FTlZfX0NvZGUgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG9TT0FQX0VOVl9fQ29kZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IFNPQVBfRU5WX19Db2RlICoqcCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmICgocCA9IHNvYXBfaW5fUG9pbnRlclRvU09BUF9FTlZfX0NvZGUoc29hcCwgdGFnLCBwLCB0eXBlKSkpCisJCXNvYXBfZ2V0aW5kZXBlbmRlbnQoc29hcCk7CisJcmV0dXJuIHA7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IFNPQVBfRU5WX19Db2RlICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG9TT0FQX0VOVl9fQ29kZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzdHJ1Y3QgU09BUF9FTlZfX0NvZGUgKiphLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAxKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCFhKQorCQlpZiAoIShhID0gKHN0cnVjdCBTT0FQX0VOVl9fQ29kZSAqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IFNPQVBfRU5WX19Db2RlICopKSkpCisJCQlyZXR1cm4gTlVMTDsKKwkqYSA9IE5VTEw7CisJaWYgKCFzb2FwLT5udWxsICYmICpzb2FwLT5ocmVmICE9ICcjJykKKwl7CXNvYXBfcmV2ZXJ0KHNvYXApOworCQlpZiAoISgqYSA9IHNvYXBfaW5fU09BUF9FTlZfX0NvZGUoc29hcCwgdGFnLCAqYSwgdHlwZSkpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCWVsc2UKKwl7CWEgPSAoc3RydWN0IFNPQVBfRU5WX19Db2RlICoqKXNvYXBfaWRfbG9va3VwKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopYSwgU09BUF9UWVBFX1NPQVBfRU5WX19Db2RlLCBzaXplb2Yoc3RydWN0IFNPQVBfRU5WX19Db2RlKSwgMCk7CisJCWlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gYTsKK30KKworI2VuZGlmCisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF94c2RfX2RlY2ltYWwoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKiphKQorewlzb2FwX2RlZmF1bHRfc3RyaW5nKHNvYXAsIGEpOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV94c2RfX2RlY2ltYWwoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKmNvbnN0KmEpCit7CXNvYXBfc2VyaWFsaXplX3N0cmluZyhzb2FwLCBhKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF94c2RfX2RlY2ltYWwoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKmNvbnN0KmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZWdpc3RlciBpbnQgaWQgPSBzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCBOVUxMLCAwLCB0YWcsIFNPQVBfVFlQRV94c2RfX2RlY2ltYWwpOworCWlmIChzb2FwX291dF94c2RfX2RlY2ltYWwoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF94c2RfX2RlY2ltYWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjaGFyICpjb25zdCphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXJldHVybiBzb2FwX291dHN0cmluZyhzb2FwLCB0YWcsIGlkLCBhLCB0eXBlLCBTT0FQX1RZUEVfeHNkX19kZWNpbWFsKTsKK30KKworU09BUF9GTUFDMyBjaGFyICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfeHNkX19kZWNpbWFsKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICoqcCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmICgocCA9IHNvYXBfaW5feHNkX19kZWNpbWFsKHNvYXAsIHRhZywgcCwgdHlwZSkpKQorCQlzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOworCXJldHVybiBwOworfQorCitTT0FQX0ZNQUMzIGNoYXIgKiAqIFNPQVBfRk1BQzQgc29hcF9pbl94c2RfX2RlY2ltYWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgY2hhciAqKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmV0dXJuIHNvYXBfaW5zdHJpbmcoc29hcCwgdGFnLCBhLCB0eXBlLCBTT0FQX1RZUEVfeHNkX19kZWNpbWFsLCAxLCAtMSwgLTEpOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfeHNkX19kYXRlVGltZShzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqKmEpCit7CXNvYXBfZGVmYXVsdF9zdHJpbmcoc29hcCwgYSk7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX3hzZF9fZGF0ZVRpbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKmNvbnN0KmEpCit7CXNvYXBfc2VyaWFsaXplX3N0cmluZyhzb2FwLCBhKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF94c2RfX2RhdGVUaW1lKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpjb25zdCphLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmVnaXN0ZXIgaW50IGlkID0gc29hcF9lbWJlZChzb2FwLCAodm9pZCopYSwgTlVMTCwgMCwgdGFnLCBTT0FQX1RZUEVfeHNkX19kYXRlVGltZSk7CisJaWYgKHNvYXBfb3V0X3hzZF9fZGF0ZVRpbWUoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF94c2RfX2RhdGVUaW1lKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY2hhciAqY29uc3QqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZXR1cm4gc29hcF9vdXRzdHJpbmcoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSwgU09BUF9UWVBFX3hzZF9fZGF0ZVRpbWUpOworfQorCitTT0FQX0ZNQUMzIGNoYXIgKiogU09BUF9GTUFDNCBzb2FwX2dldF94c2RfX2RhdGVUaW1lKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICoqcCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmICgocCA9IHNvYXBfaW5feHNkX19kYXRlVGltZShzb2FwLCB0YWcsIHAsIHR5cGUpKSkKKwkJc29hcF9nZXRpbmRlcGVuZGVudChzb2FwKTsKKwlyZXR1cm4gcDsKK30KKworU09BUF9GTUFDMyBjaGFyICogKiBTT0FQX0ZNQUM0IHNvYXBfaW5feHNkX19kYXRlVGltZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBjaGFyICoqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZXR1cm4gc29hcF9pbnN0cmluZyhzb2FwLCB0YWcsIGEsIHR5cGUsIFNPQVBfVFlQRV94c2RfX2RhdGVUaW1lLCAxLCAtMSwgLTEpOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91bnNpZ25lZEJ5dGUoc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIGNoYXIgKmNvbnN0KmEpCit7CisJc29hcF9yZWZlcmVuY2Uoc29hcCwgKmEsIFNPQVBfVFlQRV91bnNpZ25lZEJ5dGUpOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3Vuc2lnbmVkQnl0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgY2hhciAqY29uc3QqYSwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCXJlZ2lzdGVyIGludCBpZCA9IHNvYXBfZW1iZWQoc29hcCwgKHZvaWQqKWEsIE5VTEwsIDAsIHRhZywgU09BUF9UWVBFX1BvaW50ZXJUb3Vuc2lnbmVkQnl0ZSk7CisJaWYgKHNvYXBfb3V0X1BvaW50ZXJUb3Vuc2lnbmVkQnl0ZShzb2FwLCB0YWcsIGlkLCBhLCB0eXBlKSkKKwkJcmV0dXJuIHNvYXAtPmVycm9yOworCXJldHVybiBzb2FwX3B1dGluZGVwZW5kZW50KHNvYXApOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3Vuc2lnbmVkQnl0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIHVuc2lnbmVkIGNoYXIgKmNvbnN0KmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWQgPSBzb2FwX2VsZW1lbnRfaWQoc29hcCwgdGFnLCBpZCwgKmEsIE5VTEwsIDAsIHR5cGUsIFNPQVBfVFlQRV91bnNpZ25lZEJ5dGUpOworCWlmIChpZCA8IDApCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9vdXRfdW5zaWduZWRCeXRlKHNvYXAsIHRhZywgaWQsICphLCB0eXBlKTsKK30KKworU09BUF9GTUFDMyB1bnNpZ25lZCBjaGFyICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdW5zaWduZWRCeXRlKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBjaGFyICoqcCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmICgocCA9IHNvYXBfaW5fUG9pbnRlclRvdW5zaWduZWRCeXRlKHNvYXAsIHRhZywgcCwgdHlwZSkpKQorCQlzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOworCXJldHVybiBwOworfQorCitTT0FQX0ZNQUMzIHVuc2lnbmVkIGNoYXIgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3Vuc2lnbmVkQnl0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB1bnNpZ25lZCBjaGFyICoqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMSkpCisJCXJldHVybiBOVUxMOworCWlmICghYSkKKwkJaWYgKCEoYSA9ICh1bnNpZ25lZCBjaGFyICoqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZih1bnNpZ25lZCBjaGFyICopKSkpCisJCQlyZXR1cm4gTlVMTDsKKwkqYSA9IE5VTEw7CisJaWYgKCFzb2FwLT5udWxsICYmICpzb2FwLT5ocmVmICE9ICcjJykKKwl7CXNvYXBfcmV2ZXJ0KHNvYXApOworCQlpZiAoISgqYSA9IHNvYXBfaW5fdW5zaWduZWRCeXRlKHNvYXAsIHRhZywgKmEsIHR5cGUpKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwllbHNlCisJewlhID0gKHVuc2lnbmVkIGNoYXIgKiopc29hcF9pZF9sb29rdXAoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilhLCBTT0FQX1RZUEVfdW5zaWduZWRCeXRlLCBzaXplb2YodW5zaWduZWQgY2hhciksIDApOworCQlpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGE7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb1BvaW50ZXJUb3NfX1NPQVBTdHJ1Y3Qoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzX19TT0FQU3RydWN0ICoqY29uc3QqYSkKK3sKKwlpZiAoIXNvYXBfcmVmZXJlbmNlKHNvYXAsICphLCBTT0FQX1RZUEVfUG9pbnRlclRvc19fU09BUFN0cnVjdCkpCisJCXNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3NfX1NPQVBTdHJ1Y3Qoc29hcCwgKmEpOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb1BvaW50ZXJUb3NfX1NPQVBTdHJ1Y3Qoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzX19TT0FQU3RydWN0ICoqY29uc3QqYSwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCXJlZ2lzdGVyIGludCBpZCA9IHNvYXBfZW1iZWQoc29hcCwgKHZvaWQqKWEsIE5VTEwsIDAsIHRhZywgU09BUF9UWVBFX1BvaW50ZXJUb1BvaW50ZXJUb3NfX1NPQVBTdHJ1Y3QpOworCWlmIChzb2FwX291dF9Qb2ludGVyVG9Qb2ludGVyVG9zX19TT0FQU3RydWN0KHNvYXAsIHRhZywgaWQsIGEsIHR5cGUpKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJcmV0dXJuIHNvYXBfcHV0aW5kZXBlbmRlbnQoc29hcCk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvUG9pbnRlclRvc19fU09BUFN0cnVjdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIHN0cnVjdCBzX19TT0FQU3RydWN0ICoqY29uc3QqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZCA9IHNvYXBfZWxlbWVudF9pZChzb2FwLCB0YWcsIGlkLCAqYSwgTlVMTCwgMCwgdHlwZSwgU09BUF9UWVBFX1BvaW50ZXJUb3NfX1NPQVBTdHJ1Y3QpOworCWlmIChpZCA8IDApCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9vdXRfUG9pbnRlclRvc19fU09BUFN0cnVjdChzb2FwLCB0YWcsIGlkLCAqYSwgdHlwZSk7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IHNfX1NPQVBTdHJ1Y3QgKioqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvUG9pbnRlclRvc19fU09BUFN0cnVjdChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNfX1NPQVBTdHJ1Y3QgKioqcCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmICgocCA9IHNvYXBfaW5fUG9pbnRlclRvUG9pbnRlclRvc19fU09BUFN0cnVjdChzb2FwLCB0YWcsIHAsIHR5cGUpKSkKKwkJc29hcF9nZXRpbmRlcGVuZGVudChzb2FwKTsKKwlyZXR1cm4gcDsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3Qgc19fU09BUFN0cnVjdCAqKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb1BvaW50ZXJUb3NfX1NPQVBTdHJ1Y3Qoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc3RydWN0IHNfX1NPQVBTdHJ1Y3QgKioqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMSkpCisJCXJldHVybiBOVUxMOworCWlmICghYSkKKwkJaWYgKCEoYSA9IChzdHJ1Y3Qgc19fU09BUFN0cnVjdCAqKiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzX19TT0FQU3RydWN0ICoqKSkpKQorCQkJcmV0dXJuIE5VTEw7CisJKmEgPSBOVUxMOworCWlmICghc29hcC0+bnVsbCAmJiAqc29hcC0+aHJlZiAhPSAnIycpCisJewlzb2FwX3JldmVydChzb2FwKTsKKwkJaWYgKCEoKmEgPSBzb2FwX2luX1BvaW50ZXJUb3NfX1NPQVBTdHJ1Y3Qoc29hcCwgdGFnLCAqYSwgdHlwZSkpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCWVsc2UKKwl7CWEgPSAoc3RydWN0IHNfX1NPQVBTdHJ1Y3QgKioqKXNvYXBfaWRfbG9va3VwKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopYSwgU09BUF9UWVBFX1BvaW50ZXJUb3NfX1NPQVBTdHJ1Y3QsIHNpemVvZihzdHJ1Y3Qgc19fU09BUFN0cnVjdCAqKSwgMSk7CisJCWlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gYTsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvc19fU09BUFN0cnVjdChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNfX1NPQVBTdHJ1Y3QgKmNvbnN0KmEpCit7CisJaWYgKCFzb2FwX3JlZmVyZW5jZShzb2FwLCAqYSwgU09BUF9UWVBFX3NfX1NPQVBTdHJ1Y3QpKQorCQlzb2FwX3NlcmlhbGl6ZV9zX19TT0FQU3RydWN0KHNvYXAsICphKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG9zX19TT0FQU3RydWN0KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc19fU09BUFN0cnVjdCAqY29uc3QqYSwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCXJlZ2lzdGVyIGludCBpZCA9IHNvYXBfZW1iZWQoc29hcCwgKHZvaWQqKWEsIE5VTEwsIDAsIHRhZywgU09BUF9UWVBFX1BvaW50ZXJUb3NfX1NPQVBTdHJ1Y3QpOworCWlmIChzb2FwX291dF9Qb2ludGVyVG9zX19TT0FQU3RydWN0KHNvYXAsIHRhZywgaWQsIGEsIHR5cGUpKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJcmV0dXJuIHNvYXBfcHV0aW5kZXBlbmRlbnQoc29hcCk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvc19fU09BUFN0cnVjdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIHN0cnVjdCBzX19TT0FQU3RydWN0ICpjb25zdCphLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlkID0gc29hcF9lbGVtZW50X2lkKHNvYXAsIHRhZywgaWQsICphLCBOVUxMLCAwLCB0eXBlLCBTT0FQX1RZUEVfc19fU09BUFN0cnVjdCk7CisJaWYgKGlkIDwgMCkKKwkJcmV0dXJuIHNvYXAtPmVycm9yOworCXJldHVybiBzb2FwX291dF9zX19TT0FQU3RydWN0KHNvYXAsIHRhZywgaWQsICphLCB0eXBlKTsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3Qgc19fU09BUFN0cnVjdCAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3NfX1NPQVBTdHJ1Y3Qoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzX19TT0FQU3RydWN0ICoqcCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmICgocCA9IHNvYXBfaW5fUG9pbnRlclRvc19fU09BUFN0cnVjdChzb2FwLCB0YWcsIHAsIHR5cGUpKSkKKwkJc29hcF9nZXRpbmRlcGVuZGVudChzb2FwKTsKKwlyZXR1cm4gcDsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3Qgc19fU09BUFN0cnVjdCAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvc19fU09BUFN0cnVjdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzdHJ1Y3Qgc19fU09BUFN0cnVjdCAqKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDEpKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoIWEpCisJCWlmICghKGEgPSAoc3RydWN0IHNfX1NPQVBTdHJ1Y3QgKiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzX19TT0FQU3RydWN0ICopKSkpCisJCQlyZXR1cm4gTlVMTDsKKwkqYSA9IE5VTEw7CisJaWYgKCFzb2FwLT5udWxsICYmICpzb2FwLT5ocmVmICE9ICcjJykKKwl7CXNvYXBfcmV2ZXJ0KHNvYXApOworCQlpZiAoISgqYSA9IHNvYXBfaW5fc19fU09BUFN0cnVjdChzb2FwLCB0YWcsICphLCB0eXBlKSkpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJZWxzZQorCXsJYSA9IChzdHJ1Y3Qgc19fU09BUFN0cnVjdCAqKilzb2FwX2lkX2xvb2t1cChzb2FwLCBzb2FwLT5ocmVmLCAodm9pZCoqKWEsIFNPQVBfVFlQRV9zX19TT0FQU3RydWN0LCBzaXplb2Yoc3RydWN0IHNfX1NPQVBTdHJ1Y3QpLCAwKTsKKwkJaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBhOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG9Qb2ludGVyVG94c2RfX2Zsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBmbG9hdCAqKmNvbnN0KmEpCit7CisJaWYgKCFzb2FwX3JlZmVyZW5jZShzb2FwLCAqYSwgU09BUF9UWVBFX1BvaW50ZXJUb3hzZF9fZmxvYXQpKQorCQlzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG94c2RfX2Zsb2F0KHNvYXAsICphKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG9Qb2ludGVyVG94c2RfX2Zsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBmbG9hdCAqKmNvbnN0KmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZWdpc3RlciBpbnQgaWQgPSBzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCBOVUxMLCAwLCB0YWcsIFNPQVBfVFlQRV9Qb2ludGVyVG9Qb2ludGVyVG94c2RfX2Zsb2F0KTsKKwlpZiAoc29hcF9vdXRfUG9pbnRlclRvUG9pbnRlclRveHNkX19mbG9hdChzb2FwLCB0YWcsIGlkLCBhLCB0eXBlKSkKKwkJcmV0dXJuIHNvYXAtPmVycm9yOworCXJldHVybiBzb2FwX3B1dGluZGVwZW5kZW50KHNvYXApOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb1BvaW50ZXJUb3hzZF9fZmxvYXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBmbG9hdCAqKmNvbnN0KmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWQgPSBzb2FwX2VsZW1lbnRfaWQoc29hcCwgdGFnLCBpZCwgKmEsIE5VTEwsIDAsIHR5cGUsIFNPQVBfVFlQRV9Qb2ludGVyVG94c2RfX2Zsb2F0KTsKKwlpZiAoaWQgPCAwKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJcmV0dXJuIHNvYXBfb3V0X1BvaW50ZXJUb3hzZF9fZmxvYXQoc29hcCwgdGFnLCBpZCwgKmEsIHR5cGUpOworfQorCitTT0FQX0ZNQUMzIGZsb2F0ICoqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb1BvaW50ZXJUb3hzZF9fZmxvYXQoc3RydWN0IHNvYXAgKnNvYXAsIGZsb2F0ICoqKnAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoKHAgPSBzb2FwX2luX1BvaW50ZXJUb1BvaW50ZXJUb3hzZF9fZmxvYXQoc29hcCwgdGFnLCBwLCB0eXBlKSkpCisJCXNvYXBfZ2V0aW5kZXBlbmRlbnQoc29hcCk7CisJcmV0dXJuIHA7Cit9CisKK1NPQVBfRk1BQzMgZmxvYXQgKioqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG9Qb2ludGVyVG94c2RfX2Zsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGZsb2F0ICoqKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDEpKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoIWEpCisJCWlmICghKGEgPSAoZmxvYXQgKioqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihmbG9hdCAqKikpKSkKKwkJCXJldHVybiBOVUxMOworCSphID0gTlVMTDsKKwlpZiAoIXNvYXAtPm51bGwgJiYgKnNvYXAtPmhyZWYgIT0gJyMnKQorCXsJc29hcF9yZXZlcnQoc29hcCk7CisJCWlmICghKCphID0gc29hcF9pbl9Qb2ludGVyVG94c2RfX2Zsb2F0KHNvYXAsIHRhZywgKmEsIHR5cGUpKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwllbHNlCisJewlhID0gKGZsb2F0ICoqKilzb2FwX2lkX2xvb2t1cChzb2FwLCBzb2FwLT5ocmVmLCAodm9pZCoqKWEsIFNPQVBfVFlQRV9Qb2ludGVyVG94c2RfX2Zsb2F0LCBzaXplb2YoZmxvYXQgKiksIDEpOworCQlpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGE7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3hzZF9fZmxvYXQoc3RydWN0IHNvYXAgKnNvYXAsIGZsb2F0ICpjb25zdCphKQoreworCXNvYXBfcmVmZXJlbmNlKHNvYXAsICphLCBTT0FQX1RZUEVfeHNkX19mbG9hdCk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRveHNkX19mbG9hdChzdHJ1Y3Qgc29hcCAqc29hcCwgZmxvYXQgKmNvbnN0KmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZWdpc3RlciBpbnQgaWQgPSBzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCBOVUxMLCAwLCB0YWcsIFNPQVBfVFlQRV9Qb2ludGVyVG94c2RfX2Zsb2F0KTsKKwlpZiAoc29hcF9vdXRfUG9pbnRlclRveHNkX19mbG9hdChzb2FwLCB0YWcsIGlkLCBhLCB0eXBlKSkKKwkJcmV0dXJuIHNvYXAtPmVycm9yOworCXJldHVybiBzb2FwX3B1dGluZGVwZW5kZW50KHNvYXApOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3hzZF9fZmxvYXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBmbG9hdCAqY29uc3QqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZCA9IHNvYXBfZWxlbWVudF9pZChzb2FwLCB0YWcsIGlkLCAqYSwgTlVMTCwgMCwgdHlwZSwgU09BUF9UWVBFX3hzZF9fZmxvYXQpOworCWlmIChpZCA8IDApCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9vdXRfeHNkX19mbG9hdChzb2FwLCB0YWcsIGlkLCAqYSwgdHlwZSk7Cit9CisKK1NPQVBfRk1BQzMgZmxvYXQgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG94c2RfX2Zsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBmbG9hdCAqKnAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoKHAgPSBzb2FwX2luX1BvaW50ZXJUb3hzZF9fZmxvYXQoc29hcCwgdGFnLCBwLCB0eXBlKSkpCisJCXNvYXBfZ2V0aW5kZXBlbmRlbnQoc29hcCk7CisJcmV0dXJuIHA7Cit9CisKK1NPQVBfRk1BQzMgZmxvYXQgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3hzZF9fZmxvYXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgZmxvYXQgKiphLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAxKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCFhKQorCQlpZiAoIShhID0gKGZsb2F0ICoqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihmbG9hdCAqKSkpKQorCQkJcmV0dXJuIE5VTEw7CisJKmEgPSBOVUxMOworCWlmICghc29hcC0+bnVsbCAmJiAqc29hcC0+aHJlZiAhPSAnIycpCisJewlzb2FwX3JldmVydChzb2FwKTsKKwkJaWYgKCEoKmEgPSBzb2FwX2luX3hzZF9fZmxvYXQoc29hcCwgdGFnLCAqYSwgdHlwZSkpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCWVsc2UKKwl7CWEgPSAoZmxvYXQgKiopc29hcF9pZF9sb29rdXAoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilhLCBTT0FQX1RZUEVfeHNkX19mbG9hdCwgc2l6ZW9mKGZsb2F0KSwgMCk7CisJCWlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gYTsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvUG9pbnRlclRveHNkX19pbnQoc3RydWN0IHNvYXAgKnNvYXAsIGxvbmcgKipjb25zdCphKQoreworCWlmICghc29hcF9yZWZlcmVuY2Uoc29hcCwgKmEsIFNPQVBfVFlQRV9Qb2ludGVyVG94c2RfX2ludCkpCisJCXNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3hzZF9faW50KHNvYXAsICphKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG9Qb2ludGVyVG94c2RfX2ludChzdHJ1Y3Qgc29hcCAqc29hcCwgbG9uZyAqKmNvbnN0KmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZWdpc3RlciBpbnQgaWQgPSBzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCBOVUxMLCAwLCB0YWcsIFNPQVBfVFlQRV9Qb2ludGVyVG9Qb2ludGVyVG94c2RfX2ludCk7CisJaWYgKHNvYXBfb3V0X1BvaW50ZXJUb1BvaW50ZXJUb3hzZF9faW50KHNvYXAsIHRhZywgaWQsIGEsIHR5cGUpKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJcmV0dXJuIHNvYXBfcHV0aW5kZXBlbmRlbnQoc29hcCk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvUG9pbnRlclRveHNkX19pbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBsb25nICoqY29uc3QqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZCA9IHNvYXBfZWxlbWVudF9pZChzb2FwLCB0YWcsIGlkLCAqYSwgTlVMTCwgMCwgdHlwZSwgU09BUF9UWVBFX1BvaW50ZXJUb3hzZF9faW50KTsKKwlpZiAoaWQgPCAwKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJcmV0dXJuIHNvYXBfb3V0X1BvaW50ZXJUb3hzZF9faW50KHNvYXAsIHRhZywgaWQsICphLCB0eXBlKTsKK30KKworU09BUF9GTUFDMyBsb25nICoqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb1BvaW50ZXJUb3hzZF9faW50KHN0cnVjdCBzb2FwICpzb2FwLCBsb25nICoqKnAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoKHAgPSBzb2FwX2luX1BvaW50ZXJUb1BvaW50ZXJUb3hzZF9faW50KHNvYXAsIHRhZywgcCwgdHlwZSkpKQorCQlzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOworCXJldHVybiBwOworfQorCitTT0FQX0ZNQUMzIGxvbmcgKioqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG9Qb2ludGVyVG94c2RfX2ludChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBsb25nICoqKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDEpKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoIWEpCisJCWlmICghKGEgPSAobG9uZyAqKiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKGxvbmcgKiopKSkpCisJCQlyZXR1cm4gTlVMTDsKKwkqYSA9IE5VTEw7CisJaWYgKCFzb2FwLT5udWxsICYmICpzb2FwLT5ocmVmICE9ICcjJykKKwl7CXNvYXBfcmV2ZXJ0KHNvYXApOworCQlpZiAoISgqYSA9IHNvYXBfaW5fUG9pbnRlclRveHNkX19pbnQoc29hcCwgdGFnLCAqYSwgdHlwZSkpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCWVsc2UKKwl7CWEgPSAobG9uZyAqKiopc29hcF9pZF9sb29rdXAoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilhLCBTT0FQX1RZUEVfUG9pbnRlclRveHNkX19pbnQsIHNpemVvZihsb25nICopLCAxKTsKKwkJaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBhOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG94c2RfX2ludChzdHJ1Y3Qgc29hcCAqc29hcCwgbG9uZyAqY29uc3QqYSkKK3sKKwlzb2FwX3JlZmVyZW5jZShzb2FwLCAqYSwgU09BUF9UWVBFX3hzZF9faW50KTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG94c2RfX2ludChzdHJ1Y3Qgc29hcCAqc29hcCwgbG9uZyAqY29uc3QqYSwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCXJlZ2lzdGVyIGludCBpZCA9IHNvYXBfZW1iZWQoc29hcCwgKHZvaWQqKWEsIE5VTEwsIDAsIHRhZywgU09BUF9UWVBFX1BvaW50ZXJUb3hzZF9faW50KTsKKwlpZiAoc29hcF9vdXRfUG9pbnRlclRveHNkX19pbnQoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG94c2RfX2ludChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGxvbmcgKmNvbnN0KmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWQgPSBzb2FwX2VsZW1lbnRfaWQoc29hcCwgdGFnLCBpZCwgKmEsIE5VTEwsIDAsIHR5cGUsIFNPQVBfVFlQRV94c2RfX2ludCk7CisJaWYgKGlkIDwgMCkKKwkJcmV0dXJuIHNvYXAtPmVycm9yOworCXJldHVybiBzb2FwX291dF94c2RfX2ludChzb2FwLCB0YWcsIGlkLCAqYSwgdHlwZSk7Cit9CisKK1NPQVBfRk1BQzMgbG9uZyAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3hzZF9faW50KHN0cnVjdCBzb2FwICpzb2FwLCBsb25nICoqcCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmICgocCA9IHNvYXBfaW5fUG9pbnRlclRveHNkX19pbnQoc29hcCwgdGFnLCBwLCB0eXBlKSkpCisJCXNvYXBfZ2V0aW5kZXBlbmRlbnQoc29hcCk7CisJcmV0dXJuIHA7Cit9CisKK1NPQVBfRk1BQzMgbG9uZyAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRveHNkX19pbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgbG9uZyAqKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDEpKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoIWEpCisJCWlmICghKGEgPSAobG9uZyAqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2YobG9uZyAqKSkpKQorCQkJcmV0dXJuIE5VTEw7CisJKmEgPSBOVUxMOworCWlmICghc29hcC0+bnVsbCAmJiAqc29hcC0+aHJlZiAhPSAnIycpCisJewlzb2FwX3JldmVydChzb2FwKTsKKwkJaWYgKCEoKmEgPSBzb2FwX2luX3hzZF9faW50KHNvYXAsIHRhZywgKmEsIHR5cGUpKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwllbHNlCisJewlhID0gKGxvbmcgKiopc29hcF9pZF9sb29rdXAoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilhLCBTT0FQX1RZUEVfeHNkX19pbnQsIHNpemVvZihsb25nKSwgMCk7CisJCWlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gYTsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRveHNkX19zdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKipjb25zdCphKQoreworCWlmICghc29hcF9yZWZlcmVuY2Uoc29hcCwgKmEsIFNPQVBfVFlQRV94c2RfX3N0cmluZykpCisJCXNvYXBfc2VyaWFsaXplX3hzZF9fc3RyaW5nKHNvYXAsICphKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG94c2RfX3N0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqKmNvbnN0KmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZWdpc3RlciBpbnQgaWQgPSBzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCBOVUxMLCAwLCB0YWcsIFNPQVBfVFlQRV9Qb2ludGVyVG94c2RfX3N0cmluZyk7CisJaWYgKHNvYXBfb3V0X1BvaW50ZXJUb3hzZF9fc3RyaW5nKHNvYXAsIHRhZywgaWQsIGEsIHR5cGUpKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJcmV0dXJuIHNvYXBfcHV0aW5kZXBlbmRlbnQoc29hcCk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRveHNkX19zdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjaGFyICoqY29uc3QqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZCA9IHNvYXBfZWxlbWVudF9pZChzb2FwLCB0YWcsIGlkLCAqYSwgTlVMTCwgMCwgdHlwZSwgU09BUF9UWVBFX3hzZF9fc3RyaW5nKTsKKwlpZiAoaWQgPCAwKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJcmV0dXJuIHNvYXBfb3V0X3hzZF9fc3RyaW5nKHNvYXAsIHRhZywgaWQsICphLCB0eXBlKTsKK30KKworU09BUF9GTUFDMyBjaGFyICoqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3hzZF9fc3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICoqKnAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoKHAgPSBzb2FwX2luX1BvaW50ZXJUb3hzZF9fc3RyaW5nKHNvYXAsIHRhZywgcCwgdHlwZSkpKQorCQlzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOworCXJldHVybiBwOworfQorCitTT0FQX0ZNQUMzIGNoYXIgKioqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG94c2RfX3N0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBjaGFyICoqKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDEpKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoIWEpCisJCWlmICghKGEgPSAoY2hhciAqKiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKGNoYXIgKiopKSkpCisJCQlyZXR1cm4gTlVMTDsKKwkqYSA9IE5VTEw7CisJaWYgKCFzb2FwLT5udWxsICYmICpzb2FwLT5ocmVmICE9ICcjJykKKwl7CXNvYXBfcmV2ZXJ0KHNvYXApOworCQlpZiAoISgqYSA9IHNvYXBfaW5feHNkX19zdHJpbmcoc29hcCwgdGFnLCAqYSwgdHlwZSkpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCWVsc2UKKwl7CWEgPSAoY2hhciAqKiopc29hcF9pZF9sb29rdXAoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilhLCBTT0FQX1RZUEVfeHNkX19zdHJpbmcsIHNpemVvZihjaGFyICopLCAxKTsKKwkJaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBhOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfeHNkX19zdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKiphKQorewlzb2FwX2RlZmF1bHRfc3RyaW5nKHNvYXAsIGEpOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV94c2RfX3N0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqY29uc3QqYSkKK3sJc29hcF9zZXJpYWxpemVfc3RyaW5nKHNvYXAsIGEpOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X3hzZF9fc3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpjb25zdCphLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmVnaXN0ZXIgaW50IGlkID0gc29hcF9lbWJlZChzb2FwLCAodm9pZCopYSwgTlVMTCwgMCwgdGFnLCBTT0FQX1RZUEVfeHNkX19zdHJpbmcpOworCWlmIChzb2FwX291dF94c2RfX3N0cmluZyhzb2FwLCB0YWcsIGlkLCBhLCB0eXBlKSkKKwkJcmV0dXJuIHNvYXAtPmVycm9yOworCXJldHVybiBzb2FwX3B1dGluZGVwZW5kZW50KHNvYXApOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3hzZF9fc3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY2hhciAqY29uc3QqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZXR1cm4gc29hcF9vdXRzdHJpbmcoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSwgU09BUF9UWVBFX3hzZF9fc3RyaW5nKTsKK30KKworU09BUF9GTUFDMyBjaGFyICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfeHNkX19zdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKipwLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKChwID0gc29hcF9pbl94c2RfX3N0cmluZyhzb2FwLCB0YWcsIHAsIHR5cGUpKSkKKwkJc29hcF9nZXRpbmRlcGVuZGVudChzb2FwKTsKKwlyZXR1cm4gcDsKK30KKworU09BUF9GTUFDMyBjaGFyICogKiBTT0FQX0ZNQUM0IHNvYXBfaW5feHNkX19zdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgY2hhciAqKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmV0dXJuIHNvYXBfaW5zdHJpbmcoc29hcCwgdGFnLCBhLCB0eXBlLCBTT0FQX1RZUEVfeHNkX19zdHJpbmcsIDEsIC0xLCAtMSk7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9fUU5hbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKiphKQorewlzb2FwX2RlZmF1bHRfc3RyaW5nKHNvYXAsIGEpOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9fUU5hbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKmNvbnN0KmEpCit7CXNvYXBfc2VyaWFsaXplX3N0cmluZyhzb2FwLCBhKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9fUU5hbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKmNvbnN0KmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZWdpc3RlciBpbnQgaWQgPSBzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCBOVUxMLCAwLCB0YWcsIFNPQVBfVFlQRV9fUU5hbWUpOworCWlmIChzb2FwX291dF9fUU5hbWUoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9fUU5hbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjaGFyICpjb25zdCphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXJldHVybiBzb2FwX291dHN0cmluZyhzb2FwLCB0YWcsIGlkLCBhLCB0eXBlLCBTT0FQX1RZUEVfX1FOYW1lKTsKK30KKworU09BUF9GTUFDMyBjaGFyICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfX1FOYW1lKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICoqcCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmICgocCA9IHNvYXBfaW5fX1FOYW1lKHNvYXAsIHRhZywgcCwgdHlwZSkpKQorCQlzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOworCXJldHVybiBwOworfQorCitTT0FQX0ZNQUMzIGNoYXIgKiAqIFNPQVBfRk1BQzQgc29hcF9pbl9fUU5hbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgY2hhciAqKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmV0dXJuIHNvYXBfaW5zdHJpbmcoc29hcCwgdGFnLCBhLCB0eXBlLCBTT0FQX1RZUEVfX1FOYW1lLCAyLCAtMSwgLTEpOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfc3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICoqYSkKK3sJKHZvaWQpc29hcDsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisjaWZkZWYgU09BUF9ERUZBVUxUX3N0cmluZworCSphID0gU09BUF9ERUZBVUxUX3N0cmluZzsKKyNlbHNlCisJKmEgPSAoY2hhciAqKTA7CisjZW5kaWYKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfc3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpjb25zdCphKQoreworCXNvYXBfcmVmZXJlbmNlKHNvYXAsICphLCBTT0FQX1RZUEVfc3RyaW5nKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9zdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKmNvbnN0KmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZWdpc3RlciBpbnQgaWQgPSBzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCBOVUxMLCAwLCB0YWcsIFNPQVBfVFlQRV9zdHJpbmcpOworCWlmIChzb2FwX291dF9zdHJpbmcoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9zdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjaGFyICpjb25zdCphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXJldHVybiBzb2FwX291dHN0cmluZyhzb2FwLCB0YWcsIGlkLCBhLCB0eXBlLCBTT0FQX1RZUEVfc3RyaW5nKTsKK30KKworU09BUF9GTUFDMyBjaGFyICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfc3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICoqcCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmICgocCA9IHNvYXBfaW5fc3RyaW5nKHNvYXAsIHRhZywgcCwgdHlwZSkpKQorCQlzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOworCXJldHVybiBwOworfQorCitTT0FQX0ZNQUMzIGNoYXIgKiAqIFNPQVBfRk1BQzQgc29hcF9pbl9zdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgY2hhciAqKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmV0dXJuIHNvYXBfaW5zdHJpbmcoc29hcCwgdGFnLCBhLCB0eXBlLCBTT0FQX1RZUEVfc3RyaW5nLCAxLCAtMSwgLTEpOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9BcnJheTJPZmludChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGNvbnN0IGFbMl0pCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9BcnJheTJPZmludChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGFbMl0pCit7CisJaW50IGk7CisJKHZvaWQpc29hcDsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwlzb2FwX2RlZmF1bHRfaW50KHNvYXAsIGEraSk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfQXJyYXkyT2ZpbnQoc3RydWN0IHNvYXAgKnNvYXAsIGludCBjb25zdCBhWzJdLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmVnaXN0ZXIgaW50IGlkID0gc29hcF9lbWJlZChzb2FwLCAodm9pZCopYSwgTlVMTCwgMCwgdGFnLCBTT0FQX1RZUEVfQXJyYXkyT2ZpbnQpOworCWlmIChzb2FwX291dF9BcnJheTJPZmludChzb2FwLCB0YWcsIGlkLCBhLCB0eXBlKSkKKwkJcmV0dXJuIHNvYXAtPmVycm9yOworCXJldHVybiBzb2FwX3B1dGluZGVwZW5kZW50KHNvYXApOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X0FycmF5Mk9maW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgaW50IGNvbnN0IGFbMl0sIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaW50IGk7CisJc29hcF9hcnJheV9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBhLCBTT0FQX1RZUEVfQXJyYXkyT2ZpbnQpLCAieHNkOmludFsyXSIsIDApOworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJeworCQlzb2FwX291dF9pbnQoc29hcCwgIml0ZW0iLCAtMSwgYStpLCAiIik7CisJfQorCXNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7CisJcmV0dXJuIFNPQVBfT0s7Cit9CisKK1NPQVBfRk1BQzMgaW50ICogU09BUF9GTUFDNCBzb2FwX2dldF9BcnJheTJPZmludChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGFbMl0sIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sJaW50ICgqcCk7CisJaWYgKChwID0gc29hcF9pbl9BcnJheTJPZmludChzb2FwLCB0YWcsIGEsIHR5cGUpKSkKKwkJc29hcF9nZXRpbmRlcGVuZGVudChzb2FwKTsKKwlyZXR1cm4gcDsKK30KKworU09BUF9GTUFDMyBpbnQgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fQXJyYXkyT2ZpbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGFbMl0sIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoc29hcF9tYXRjaF9hcnJheShzb2FwLCB0eXBlKSkKKwl7CXNvYXAtPmVycm9yID0gU09BUF9UWVBFOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYSA9IChpbnQgKCopKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIGEsIFNPQVBfVFlQRV9BcnJheTJPZmludCwgc2l6ZW9mKGludFsyXSksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworCWlmICghYSkKKwkJcmV0dXJuIE5VTEw7CisJc29hcF9kZWZhdWx0X0FycmF5Mk9maW50KHNvYXAsIGEpOworCWlmIChzb2FwLT5ib2R5ICYmICEqc29hcC0+aHJlZikKKwl7CWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCQl7CXNvYXBfcGVla19lbGVtZW50KHNvYXApOworCQkJaWYgKHNvYXAtPnBvc2l0aW9uKQorCQkJewlpID0gc29hcC0+cG9zaXRpb25zWzBdOworCQkJCWlmIChpIDwgMCB8fCBpID49IDIpCisJCQkJewlzb2FwLT5lcnJvciA9IFNPQVBfSU9COworCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQl9CisJCQl9CisJCQlpZiAoIXNvYXBfaW5faW50KHNvYXAsIE5VTEwsIGEraSwgInhzZDppbnQiKSkKKwkJCXsJaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfTk9fVEFHKQorCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQlzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0NfTk9JT0IpCisJCQl3aGlsZSAoc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpID09IFNPQVBfU1lOVEFYX0VSUk9SKQorCQkJewlzb2FwLT5wZWVrZWQgPSAxOworCQkJCXNvYXBfaWdub3JlX2VsZW1lbnQoc29hcCk7CisJCQl9CisJCWVsc2UgaWYgKHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJewlpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9TWU5UQVhfRVJST1IpCisJCQkJc29hcC0+ZXJyb3IgPSBTT0FQX0lPQjsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCWVsc2UKKwl7CWEgPSAoaW50ICgqKSlzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBhLCBTT0FQX1RZUEVfQXJyYXkyT2ZpbnQsIHNpemVvZihpbnRbMl0pLCAwLCBOVUxMLCBOVUxMLCBOVUxMKSwgMCwgU09BUF9UWVBFX0FycmF5Mk9maW50LCAwLCBzaXplb2YoaW50WzJdKSwgMCwgTlVMTCk7CisJCWlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gKGludCAqKWE7Cit9CmRpZmYgLS1naXQgYS9nc29hcC1wYWxtL3BhbG1GdW5jdGlvbnMuYyBiL2dzb2FwLXBhbG0vcGFsbUZ1bmN0aW9ucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MWEyNTYKLS0tIC9kZXYvbnVsbAorKysgYi9nc29hcC1wYWxtL3BhbG1GdW5jdGlvbnMuYwpAQCAtMCwwICsxLDE0NiBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vICAgIChDKSBDT1BZUklHSFQgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwMiBBbGwgUmlnaHRzIFJlc2VydmVkCisvLyAgICBMaWNlbnNlZCBNYXRlcmlhbHMgLSBQcm9wZXJ0eSBvZiBJQk0KKy8vICAgIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yCisvLyAgICBkaXNjbG9zdXJlIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLgorLy8KKy8vICAgIElCTSBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCisvLyAgICBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisvLyAgICBQVVJQT1NFLiBJTiBOTyBFVkVOVCBTSEFMTCBJQk0gQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKy8vICAgIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKKy8vICAgIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorLy8gICAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRQorLy8gICAgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4gCisvLworLy8gICAgVGhlIHByb2dyYW0gbWF5IGJlIHVzZWQsIGV4ZWN1dGVkLCBjb3BpZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQKKy8vICAgIHdpdGhvdXQgcm95YWx0eSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGV2ZWxvcGluZywgdXNpbmcsIG1hcmtldGluZywgb3IgZGlzdHJpYnV0aW5nLgorLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8qCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhLCBJbmMuLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorKi8KKworI2luY2x1ZGUgInN0ZGxpYi5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHZhX2xpc3QuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxTdHJpbmdNZ3IuaD4KKyNpbmNsdWRlICJQYWxtRnVuY3Rpb25zLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworaW50IEFwcE5ldE9wZW5Db3VudCA9IDA7CitleHRlcm4gVUludDE2IEFwcE5ldFJlZm51bTsKK2V4dGVybglJbnQzMiBBcHBOZXRUaW1lb3V0OworZXh0ZXJuIEVyciAJTmV0VUluaXQgKHZvaWQpOworCitjaGFyICogUGFsbVN0cmVycm9yKGludCBlcnIpCit7CisgICAgc3RhdGljIGNoYXIgc3RyWzQwXTsKKworICAgIFN5c0VyclN0cmluZyhlcnIsc3RyLDQwKTsKKworICAgIHJldHVybiBzdHI7Cit9CisKK2RvdWJsZSBzdHJ0b2QoY29uc3QgY2hhciAqcywgY2hhciAqKmVuZHB0cikgeworCisJY2hhciAqcCA9IFN0ckNocihzLCdFJyk7CisgICAJRmxwQ29tcERvdWJsZSByZXN1bHQ7CisgICAJKmVuZHB0ciA9ICgoY2hhciopcykrU3RyTGVuKHMpOworICAgCWlmIChwKSAgICAgICAvLyBjaGFuZ2UgRSB0byBlIGFuZCByZW1vdmUgJysnCisgICAJeworICAgIAkqcD0nZSc7CisgICAgCWlmICgqKHArMSk9PScrJykKKyAgICAgIAlTdHJDb3B5KHArMSxwKzIpOworICAgCX0KKyAgIAlGbHBCdWZmZXJBVG9GICgmcmVzdWx0LmZkLCBzKTsKKworICAgcmV0dXJuIHJlc3VsdC5kOworfQorCit2b2lkIHBhbG1TcHJpbnRmKGNoYXIgKnN0ciwgY29uc3QgY2hhciAqY29udiwgLi4uKQoreworICAgIGludCByZXRWYWx1ZSA9IDE7CisgICAgc2l6ZV90IG4gPSBzdHJsZW4oY29udik7CisgICAgdmFfbGlzdCBhcmdzOworICAgIHZhX3N0YXJ0KGFyZ3MsIGNvbnYpOworCisgICAgLy8gQ2F0Y2ggdGhlIGZsb2F0IAorCisgICAgaWYobiA8IDYgJiYgY29udlswXSA9PSAnJScgJiYgKGNvbnZbbi0xXSA9PSAnZycgfHwgY29udltuLTFdID09ICdHJyB8fCBjb252W24tMV0gPT0gJ2YnIHx8IGNvbnZbbi0xXSA9PSAnRicpKQorICAgIHsgIAorICAgICAgICBGbHBDb21wRG91YmxlIGZscDsKKyAgICAgICAgZmxwLmQgPSAoZG91YmxlKSB2YV9hcmcoYXJncywgZG91YmxlKTsKKyAgICAgICAgRmxwRlRvQShmbHAuZmQsc3RyKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIFN0clZQcmludEYoc3RyLChjb25zdCBDaGFyICopY29udixhcmdzKTsKKyAgICBlbmQ6CisgICAgICB2YV9lbmQoYXJncyk7Cit9CisKK0VyciBwYWxtTmV0TGliT3BlbigpIAoreworCUVyciBlcnJvciA9IDA7CisJVUludDE2IGlmRXJyczsKKwkKKwlpZiAoIUFwcE5ldE9wZW5Db3VudCkKKwl7CisJCQorCQllcnJvciA9IE5ldFVJbml0KCk7CisJCWlmIChlcnJvcikgcmV0dXJuIGVycm9yOworCQkKKwkJZXJyb3IgPSBOZXRMaWJPcGVuKEFwcE5ldFJlZm51bSwgJmlmRXJycyk7CisJCQorCQlpZiAoZXJyb3IgPT0gbmV0RXJyQWxyZWFkeU9wZW4pICB7CisJCWVycm9yID0gMDsKKwkJfQorCQkKKwl9CisJCisJaWYgKCFlcnJvcikgQXBwTmV0T3BlbkNvdW50Kys7CisJcmV0dXJuIGVycm9yOworCit9CitFcnIgcGFsbU5ldExpYkNsb3NlKCkKK3sKKworCUVyciBlcnJvciA9IDA7CisJCisJaWYgKEFwcE5ldE9wZW5Db3VudCkKKwl7CisJCQorCQlBcHBOZXRPcGVuQ291bnQtLTsKKwkJZXJyb3IgPSBOZXRMaWJDbG9zZShBcHBOZXRSZWZudW0sIGZhbHNlKTsKKwl9CisJCisJcmV0dXJuIGVycm9yOworCit9CisKK2ludCBwYWxtUmFuZCgpCit7CisvKiBDb21wdXRlIHggPSAoN141ICogeCkgbW9kICgyXjMxIC0gMSkKKyAqIHdpdGhvdXQgb3ZlcmZsb3dpbmcgMzEgYml0czoKKyAqICAgICAgKDJeMzEgLSAxKSA9IDEyNzc3MyAqICg3XjUpICsgMjgzNgorICogRnJvbSAiUmFuZG9tIG51bWJlciBnZW5lcmF0b3JzOiBnb29kIG9uZXMgYXJlIGhhcmQgdG8gZmluZCIsCisgKiBQYXJrIGFuZCBNaWxsZXIsIENvbW11bmljYXRpb25zIG9mIHRoZSBBQ00sIHZvbC4gMzEsIG5vLiAxMCwKKyAqIE9jdG9iZXIgMTk4OCwgcC4gMTE5NS4KKyAqLworICAgICAgIHN0YXRpYyBpbnQgc2VlZCA9IDB4MTk2MTA5MTA7CisgICAgICAgaW50IGhpID0gc2VlZCAvIDEyNzc3M0w7CisgICAgICAgaW50IGxvID0gc2VlZCAlIDEyNzc3M0w7CisgICAgICAgaW50IHggPSAxNjgwN0wgKiBsbyAtIDI4MzZMICogaGk7CisgICAgICAgaWYgKHggPD0gMCkKKyAgICAgICAgICAgICAgIHggKz0gMHg3ZmZmZmZmZkw7CisgICAgICAgcmV0dXJuICgoc2VlZCA9IHgpICUgMHg4RkZGRkZGRik7Cit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9nc29hcC1wYWxtL3BhbG1GdW5jdGlvbnMuaCBiL2dzb2FwLXBhbG0vcGFsbUZ1bmN0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MWZmM2UKLS0tIC9kZXYvbnVsbAorKysgYi9nc29hcC1wYWxtL3BhbG1GdW5jdGlvbnMuaApAQCAtMCwwICsxLDQ5IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gICAgKEMpIENPUFlSSUdIVCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuLCAyMDAyIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKy8vICAgIExpY2Vuc2VkIE1hdGVyaWFscyAtIFByb3BlcnR5IG9mIElCTQorLy8gICAgVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IKKy8vICAgIGRpc2Nsb3N1cmUgcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuCisvLworLy8gICAgSUJNIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKKy8vICAgIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKy8vICAgIFBVUlBPU0UuIElOIE5PIEVWRU5UIFNIQUxMIElCTSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorLy8gICAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorLy8gICAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisvLyAgICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFCisvLyAgICBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorLy8KKy8vICAgIFRoZSBwcm9ncmFtIG1heSBiZSB1c2VkLCBleGVjdXRlZCwgY29waWVkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkCisvLyAgICB3aXRob3V0IHJveWFsdHkgZm9yIHRoZSBwdXJwb3NlIG9mIGRldmVsb3BpbmcsIHVzaW5nLCBtYXJrZXRpbmcsIG9yIGRpc3RyaWJ1dGluZy4KKy8vIAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNpZm5kZWYgX1BBTE1GVU5DVElPTlNfSAorI2RlZmluZSBfUEFMTUZVTkNUSU9OU19ICisKKyNpbmNsdWRlIDxGbG9hdE1nci5oPgorI2luY2x1ZGUgPHN5c190eXBlcy5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworRXJyIHBhbG1OZXRMaWJPcGVuKCk7CitFcnIgcGFsbU5ldExpYkNsb3NlKCk7CisKK3ZvaWQgcGFsbVNwcmludGYoY2hhciAqc3RyLCBjb25zdCBjaGFyICpjb252LCAuLi4pOworI3VuZGVmIHNwcmludGYKKyNkZWZpbmUgc3ByaW50ZiBwYWxtU3ByaW50ZgorI2RlZmluZSBzdHJuY21wIFN0ck5Db21wYXJlCisjZGVmaW5lIHN0cm5jYXQgU3RyTkNhdCAKKyNkZWZpbmUgc3RyZXJyb3IgUGFsbVN0cmVycm9yIAorY2hhciAqIFBhbG1TdHJlcnJvcihpbnQgZXJybnVtKTsKK2RvdWJsZSBzdHJ0b2QoY29uc3QgY2hhciAqcywgY2hhciAqKmVuZHB0cik7CitpbnQgcGFsbVJhbmQodm9pZCk7CisjZGVmaW5lIHJhbmQgcGFsbVJhbmQKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9nc29hcC1wYWxtL3BhbG1zb2FwMS5jIGIvZ3NvYXAtcGFsbS9wYWxtc29hcDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTI1ZjJlCi0tLSAvZGV2L251bGwKKysrIGIvZ3NvYXAtcGFsbS9wYWxtc29hcDEuYwpAQCAtMCwwICsxLDEzNDQ5IEBACisjZGVmaW5lIFBBTE1fMQorLyoKKworc3Rkc29hcDIuY1twcF0gMi43LjZlCisKK2dTT0FQIHJ1bnRpbWUKKworZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlczoKK0dQTCwgdGhlIGdTT0FQIHB1YmxpYyBsaWNlbnNlLCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ29udHJpYnV0b3JzOgorCitXaW5kIFJpdmVyIFN5c3RlbXMgSW5jLiwgZm9yIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25zIHVuZGVyIGdTT0FQIHB1YmxpYyBsaWNlbnNlOgorICAtIHZ4V29ya3MgY29tcGF0aWJsZQkoI2RlZmluZSBWWFdPUktTKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIHB1YmxpYyBsaWNlbnNlLgorCitUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBnU09BUCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMworKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCitMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK2h0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9zb2FwbGljZW5zZS5odG1sCitTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAorV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCitmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLgorQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSW5zdGFsbGF0aW9uIG5vdGU6CisKK1dpbjMyIGJ1aWxkIG5lZWRzIHdpbnNvY2suZGxsIChWaXN1YWwgQysrICJ3c29jazMyLmxpYiIpCitUbyBkbyB0aGlzIGluIFZpc3VhbCBDKysgNi4wLCBnbyB0byAiUHJvamVjdCIsICJzZXR0aW5ncyIsIHNlbGVjdCB0aGUgIkxpbmsiCit0YWIgKHRoZSBwcm9qZWN0IGZpbGUgbmVlZHMgdG8gYmUgc2VsZWN0ZWQgaW4gdGhlIGZpbGUgdmlldykgYW5kIGFkZAorIndzb2NrMzIubGliIiB0byB0aGUgIk9iamVjdC9saWJyYXJ5IG1vZHVsZXMiIGVudHJ5CisKK09uIE1hYyBPUyBYIHdpdGggZ2NjIChHQ0MpIDMuMSAyMDAyMDQyMCAocHJlcmVsZWFzZSkgeW91IE1VU1QgY29tcGlsZSB3aXRoCistZnN0YWNrX2NoZWNrIHdoZW4gdXNpbmcgLU8yIGJlY2F1c2UgZ2NjIDMuMSBoYXMgYSBidWcgdGhhdCBzbWFzaGVzIHRoZSBzdGFjaword2hlbiBsb2NhbGx5IGFsbG9jYXRlZCBkYXRhIGV4Y2VlZHMgNjRLLgorCisqLworCisjaWZkZWYgQVM0MDAKKyMgcHJhZ21hIGNvbnZlcnQoODE5KQkvKiBFQkNESUMgdG8gQVNDSUkgKi8KKyNlbmRpZgorCisjaW5jbHVkZSAic3Rkc29hcDIuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitTT0FQX1NPVVJDRV9TVEFNUCgiQCgjKSBzdGRzb2FwMi5jcHAgdmVyIDIuNy42ZSAyMDA2LTAyLTE4IDEyOjAwOjAwIEdNVCIpCitleHRlcm4gIkMiIHsKKyNlbHNlCitTT0FQX1NPVVJDRV9TVEFNUCgiQCgjKSBzdGRzb2FwMi5jIHZlciAyLjcuNmUgMjAwNi0wMi0xOCAxMjowMDowMCBHTVQiKQorI2VuZGlmCisKKy8qIDhiaXQgY2hhcmFjdGVyIHJlcHJlc2VudGluZyB1bmtub3duL25vbnJlcHJlc2VudGFibGUgY2hhcmFjdGVyIGRhdGEgKGUuZy4gbm90IHN1cHBvcnRlZCBieSBjdXJyZW50IGxvY2FsZSB3aXRoIG11bHRpYnl0ZSBzdXBwb3J0IGVuYWJsZWQpICovCisjaWZuZGVmIFNPQVBfVU5LTk9XTl9DSEFSCisjZGVmaW5lIFNPQVBfVU5LTk9XTl9DSEFSICgxMjcpCisjZW5kaWYKKworLyogICAgICBFT0Y9LTEgKi8KKyNkZWZpbmUgU09BUF9MVCAoc29hcF93Y2hhcikoLTIpIC8qIFhNTCBjaGFyYWN0ZXIgJzwnICovCisjZGVmaW5lIFNPQVBfVFQgKHNvYXBfd2NoYXIpKC0zKSAvKiBYTUwgY2hhcmFjdGVyICc8LycgKi8KKyNkZWZpbmUgU09BUF9HVCAoc29hcF93Y2hhcikoLTQpIC8qIFhNTCBjaGFyYWN0ZXIgJz4nICovCisjZGVmaW5lIFNPQVBfUVQgKHNvYXBfd2NoYXIpKC01KSAvKiBYTUwgY2hhcmFjdGVyICciJyAqLworI2RlZmluZSBTT0FQX0FQIChzb2FwX3djaGFyKSgtNikgLyogWE1MIGNoYXJhY3RlciAnJycgKi8KKworI2RlZmluZSBzb2FwX2JsYW5rKGMpCQkoKGMpID49IDAgJiYgKGMpIDw9IDMyKQorI2RlZmluZSBzb2FwX25vdGJsYW5rKGMpCSgoYykgPiAzMikKKyNkZWZpbmUgc29hcF9oYXNoX3B0cihwKQkoKCh1bnNpZ25lZCBsb25nKShwKSA+PiAzKSAmIChTT0FQX1BUUkhBU0ggLSAxKSkKKworI2lmZGVmIFNPQVBfREVCVUcKK3N0YXRpYyB2b2lkIHNvYXBfaW5pdF9sb2dzKHN0cnVjdCBzb2FwKik7CitzdGF0aWMgdm9pZCBzb2FwX2Nsb3NlX2xvZ2ZpbGUoc3RydWN0IHNvYXAqLCBpbnQpOworc3RhdGljIHZvaWQgc29hcF9zZXRfbG9nZmlsZShzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciopOworc3RhdGljIHZvaWQgc29hcF9mcmVlX21odChzdHJ1Y3Qgc29hcCopOworc3RhdGljIHZvaWQgc29hcF90cmFja191bmxpbmsoc3RydWN0IHNvYXAqLCBjb25zdCB2b2lkKik7CisjZW5kaWYKKworI2lmbmRlZiBQQUxNXzIKK3N0YXRpYyBpbnQgc29hcF9zZXRfZXJyb3Ioc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgaW50KTsKK3N0YXRpYyBpbnQgc29hcF9jb3B5X2ZhdWx0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworc3RhdGljIGludCBzb2FwX2dldGF0dHJ2YWwoc3RydWN0IHNvYXAqLCBjaGFyKiwgc2l6ZV90LCBzb2FwX3djaGFyKTsKKyNlbmRpZgorCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHNvYXBfd2NoYXIgc29hcF9jaGFyKHN0cnVjdCBzb2FwKik7CitzdGF0aWMgc29hcF93Y2hhciBzb2FwX2dldF9waShzdHJ1Y3Qgc29hcCopOworc3RhdGljIGludCBzb2FwX2lzeGRpZ2l0KGludCk7CitzdGF0aWMgdm9pZCAqZnBsdWdpbihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCitzdGF0aWMgdm9pZCBzb2FwX3VwZGF0ZV9wdHJzKHN0cnVjdCBzb2FwKiwgY2hhciosIGNoYXIqLCBjaGFyKiwgY2hhciopOworc3RhdGljIGludCBzb2FwX2hhc19jb3BpZXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworc3RhdGljIHZvaWQgc29hcF9pbml0X2lodChzdHJ1Y3Qgc29hcCopOworc3RhdGljIHZvaWQgc29hcF9mcmVlX2lodChzdHJ1Y3Qgc29hcCopOworc3RhdGljIHZvaWQgc29hcF9pbml0X3BodChzdHJ1Y3Qgc29hcCopOworc3RhdGljIHZvaWQgc29hcF9mcmVlX3BodChzdHJ1Y3Qgc29hcCopOworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBjb25zdCBjaGFyICpzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyBpbnQgc29hcF9pc251bWVyaWMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKik7CitzdGF0aWMgdGltZV90IHNvYXBfdGltZWdtKHN0cnVjdCB0bSopOworc3RhdGljIHN0cnVjdCBzb2FwX25saXN0ICpzb2FwX2xvb2t1cF9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzaXplX3Qgbik7CitzdGF0aWMgc3RydWN0IHNvYXBfbmxpc3QgKnNvYXBfcHVzaF9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKm5zLCBzaG9ydCB1dGlsaXplZCk7CitzdGF0aWMgdm9pZCBzb2FwX3BvcF9ucyhzdHJ1Y3Qgc29hcCAqc29hcCk7CitzdGF0aWMgdm9pZCBzb2FwX3V0aWxpemVfbnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc2l6ZV90IG4pOworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpzb2FwX25ld19tdWx0aXBhcnQoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKiwgc3RydWN0IHNvYXBfbXVsdGlwYXJ0KiosIGNoYXIqLCBzaXplX3QpOworc3RhdGljIGludCBzb2FwX3B1dGRpbWVmaWVsZChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworc3RhdGljIGNoYXIgKnNvYXBfZ2V0ZGltZWZpZWxkKHN0cnVjdCBzb2FwKiwgc2l6ZV90KTsKK3N0YXRpYyB2b2lkIHNvYXBfc2VsZWN0X21pbWVfYm91bmRhcnkoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBpbnQgc29hcF92YWxpZF9taW1lX2JvdW5kYXJ5KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgaW50IHNvYXBfbWF0Y2hfY2lkKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyB2b2lkIHNvYXBfcmVzb2x2ZV9hdHRhY2htZW50KHN0cnVjdCBzb2FwKiwgc3RydWN0IHNvYXBfbXVsdGlwYXJ0Kik7CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgV0lUSF9HWklQCitzdGF0aWMgaW50IHNvYXBfZ2V0Z3ppcGhkcihzdHJ1Y3Qgc29hcCopOworI2VuZGlmCisKKyNpZmRlZiBXSVRIX09QRU5TU0wKK3N0YXRpYyBpbnQgc3NsX2luaXRfZG9uZSA9IDA7CitzdGF0aWMgaW50IHNzbF9hdXRoX2luaXQoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBpbnQgc3NsX3ZlcmlmeV9jYWxsYmFjayhpbnQsIFg1MDlfU1RPUkVfQ1RYKik7CitzdGF0aWMgaW50IHNzbF9wYXNzd29yZChjaGFyKiwgaW50LCBpbnQsIHZvaWQgKik7CitzdGF0aWMgY29uc3QgY2hhciAqc3NsX2Vycm9yKHN0cnVjdCBzb2FwKiwgaW50KTsKKy8qIFRoaXMgY2FsbGJhY2sgaXMgaW5jbHVkZWQgZm9yIGZ1dHVyZSByZWZlcmVuY2VzLiBJdCBzaG91bGQgbm90IGJlIGRlbGV0ZWQKK3N0YXRpYyBESCAqc3NsX3RtcF9kaChTU0wqLCBpbnQsIGludCk7CisqLworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChXSVRIX05PSFRUUCkgfHwgIWRlZmluZWQoV0lUSF9MRUFORVIpCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNvbnN0IGNoYXIgKnNvYXBfZGVjb2RlKGNoYXIqLCBzaXplX3QsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHNvYXBfd2NoYXIgc29hcF9nZXRjaHVua2NoYXIoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBjb25zdCBjaGFyICpodHRwX2Vycm9yKHN0cnVjdCBzb2FwKiwgaW50KTsKK3N0YXRpYyBpbnQgaHR0cF9wb3N0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90KTsKK3N0YXRpYyBpbnQgaHR0cF9nZXQoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBpbnQgaHR0cF9zZW5kX2hlYWRlcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyBpbnQgaHR0cF9wb3N0X2hlYWRlcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitzdGF0aWMgaW50IGh0dHBfcmVzcG9uc2Uoc3RydWN0IHNvYXAqLCBpbnQsIHNpemVfdCk7CitzdGF0aWMgaW50IGh0dHBfcGFyc2Uoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBpbnQgaHR0cF9wYXJzZV9oZWFkZXIoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50IGZzZW5kKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHNpemVfdCk7CitzdGF0aWMgc2l6ZV90IGZyZWN2KHN0cnVjdCBzb2FwKiwgY2hhciosIHNpemVfdCk7CitzdGF0aWMgaW50IHRjcF9pbml0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgY29uc3QgY2hhciAqdGNwX2Vycm9yKHN0cnVjdCBzb2FwKik7CisjaWZuZGVmIFdJVEhfSVBWNgorc3RhdGljIGludCB0Y3BfZ2V0aG9zdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKmFkZHIsIHN0cnVjdCBpbl9hZGRyICppbmFkZHIpOworI2VuZGlmCitzdGF0aWMgaW50IHRjcF9jb25uZWN0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqZW5kcG9pbnQsIGNvbnN0IGNoYXIgKmhvc3QsIGludCBwb3J0KTsKK3N0YXRpYyBpbnQgdGNwX2FjY2VwdChzdHJ1Y3Qgc29hcCosIGludCwgc3RydWN0IHNvY2thZGRyKiwgaW50Kik7CitzdGF0aWMgaW50IHRjcF9kaXNjb25uZWN0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgaW50IHRjcF9jbG9zZXNvY2tldChzdHJ1Y3Qgc29hcCosIFNPQVBfU09DS0VUKTsKK3N0YXRpYyBpbnQgdGNwX3NodXRkb3duc29ja2V0KHN0cnVjdCBzb2FwKiwgU09BUF9TT0NLRVQsIGludCk7CitzdGF0aWMgY29uc3QgY2hhciAqc29hcF9zdHJlcnJvcihzdHJ1Y3Qgc29hcCopOworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoUEFMTSkgJiYgIWRlZmluZWQoUEFMTV8yKQordW5zaWduZWQgc2hvcnQgZXJybm87CisjZW5kaWYKKworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfZW52MVs0Ml0gPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iOworc3RhdGljIGNvbnN0IGNoYXIgc29hcF9lbmMxWzQyXSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI7CitzdGF0aWMgY29uc3QgY2hhciBzb2FwX2VudjJbNDBdID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI7CitzdGF0aWMgY29uc3QgY2hhciBzb2FwX2VuYzJbNDBdID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbmNvZGluZyI7CitzdGF0aWMgY29uc3QgY2hhciBzb2FwX3JwY1szNV0gPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLXJwYyI7CisjZW5kaWYKKworI2lmbmRlZiBQQUxNXzEKK2NvbnN0IHN0cnVjdCBzb2FwX2RvdWJsZV9uYW4gc29hcF9kb3VibGVfbmFuID0gezB4RkZGRkZGRkYsIDB4RkZGRkZGRkZ9Oworc3RhdGljIGNvbnN0IGNoYXIgc29hcF9iYXNlNjRvWzY1XSA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfYmFzZTY0aVs4MV0gPSAiXDc2WFhYXDc3XDY0XDY1XDY2XDY3XDcwXDcxXDcyXDczXDc0XDc1WFhYWFhYWFwwMFwwMVwwMlwwM1wwNFwwNVwwNlwwN1wxMFwxMVwxMlwxM1wxNFwxNVwxNlwxN1wyMFwyMVwyMlwyM1wyNFwyNVwyNlwyN1wzMFwzMVhYWFhYWFwzMlwzM1wzNFwzNVwzNlwzN1w0MFw0MVw0Mlw0M1w0NFw0NVw0Nlw0N1w1MFw1MVw1Mlw1M1w1NFw1NVw1Nlw1N1w2MFw2MVw2Mlw2MyI7CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfaW5kZW50WzExXSA9ICJcblx0XHRcdFx0XHRcdFx0XHRcdCI7CisvKiBBbHRlcm5hdGl2ZSBpbmRlbnRhdGlvbiBmb3JtIGZvciBTT0FQX1hNTF9JTkRFTlQ6CitzdGF0aWMgY29uc3QgY2hhciBzb2FwX2luZGVudFsyMV0gPSAiXG4gICAgICAgICAgICAgICAgICAgIjsKKyovCisjZW5kaWYKKworc3RhdGljIGNvbnN0IGNoYXIgc29hcF9wYWRkaW5nWzRdID0gIlwwXDBcMCI7CisjZGVmaW5lIFNPQVBfU1RSX1BBRERJTkcgKHNvYXBfcGFkZGluZykKKyNkZWZpbmUgU09BUF9TVFJfRU9TIChzb2FwX3BhZGRpbmcpCisjZGVmaW5lIFNPQVBfTk9OX05VTEwgKHNvYXBfcGFkZGluZykKKworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCBodG1sX2VudGl0eV9jb2Rlc1tdID0gLyogZW50aXRpZXMgZm9yIFhIVE1MIHBhcnNpbmcgKi8KK3sgeyAxNjAsICJuYnNwIiB9LAorICB7IDE2MSwgImlleGNsIiB9LAorICB7IDE2MiwgImNlbnQiIH0sCisgIHsgMTYzLCAicG91bmQiIH0sCisgIHsgMTY0LCAiY3VycmVuIiB9LAorICB7IDE2NSwgInllbiIgfSwKKyAgeyAxNjYsICJicnZiYXIiIH0sCisgIHsgMTY3LCAic2VjdCIgfSwKKyAgeyAxNjgsICJ1bWwiIH0sCisgIHsgMTY5LCAiY29weSIgfSwKKyAgeyAxNzAsICJvcmRmIiB9LAorICB7IDE3MSwgImxhcXVvIiB9LAorICB7IDE3MiwgIm5vdCIgfSwKKyAgeyAxNzMsICJzaHkiIH0sCisgIHsgMTc0LCAicmVnIiB9LAorICB7IDE3NSwgIm1hY3IiIH0sCisgIHsgMTc2LCAiZGVnIiB9LAorICB7IDE3NywgInBsdXNtbiIgfSwKKyAgeyAxNzgsICJzdXAyIiB9LAorICB7IDE3OSwgInN1cDMiIH0sCisgIHsgMTgwLCAiYWN1dGUiIH0sCisgIHsgMTgxLCAibWljcm8iIH0sCisgIHsgMTgyLCAicGFyYSIgfSwKKyAgeyAxODMsICJtaWRkb3QiIH0sCisgIHsgMTg0LCAiY2VkaWwiIH0sCisgIHsgMTg1LCAic3VwMSIgfSwKKyAgeyAxODYsICJvcmRtIiB9LAorICB7IDE4NywgInJhcXVvIiB9LAorICB7IDE4OCwgImZyYWMxNCIgfSwKKyAgeyAxODksICJmcmFjMTIiIH0sCisgIHsgMTkwLCAiZnJhYzM0IiB9LAorICB7IDE5MSwgImlxdWVzdCIgfSwKKyAgeyAxOTIsICJBZ3JhdmUiIH0sCisgIHsgMTkzLCAiQWFjdXRlIiB9LAorICB7IDE5NCwgIkFjaXJjIiB9LAorICB7IDE5NSwgIkF0aWxkZSIgfSwKKyAgeyAxOTYsICJBdW1sIiB9LAorICB7IDE5NywgIkFyaW5nIiB9LAorICB7IDE5OCwgIkFFbGlnIiB9LAorICB7IDE5OSwgIkNjZWRpbCIgfSwKKyAgeyAyMDAsICJFZ3JhdmUiIH0sCisgIHsgMjAxLCAiRWFjdXRlIiB9LAorICB7IDIwMiwgIkVjaXJjIiB9LAorICB7IDIwMywgIkV1bWwiIH0sCisgIHsgMjA0LCAiSWdyYXZlIiB9LAorICB7IDIwNSwgIklhY3V0ZSIgfSwKKyAgeyAyMDYsICJJY2lyYyIgfSwKKyAgeyAyMDcsICJJdW1sIiB9LAorICB7IDIwOCwgIkVUSCIgfSwKKyAgeyAyMDksICJOdGlsZGUiIH0sCisgIHsgMjEwLCAiT2dyYXZlIiB9LAorICB7IDIxMSwgIk9hY3V0ZSIgfSwKKyAgeyAyMTIsICJPY2lyYyIgfSwKKyAgeyAyMTMsICJPdGlsZGUiIH0sCisgIHsgMjE0LCAiT3VtbCIgfSwKKyAgeyAyMTUsICJ0aW1lcyIgfSwKKyAgeyAyMTYsICJPc2xhc2giIH0sCisgIHsgMjE3LCAiVWdyYXZlIiB9LAorICB7IDIxOCwgIlVhY3V0ZSIgfSwKKyAgeyAyMTksICJVY2lyYyIgfSwKKyAgeyAyMjAsICJVdW1sIiB9LAorICB7IDIyMSwgIllhY3V0ZSIgfSwKKyAgeyAyMjIsICJUSE9STiIgfSwKKyAgeyAyMjMsICJzemxpZyIgfSwKKyAgeyAyMjQsICJhZ3JhdmUiIH0sCisgIHsgMjI1LCAiYWFjdXRlIiB9LAorICB7IDIyNiwgImFjaXJjIiB9LAorICB7IDIyNywgImF0aWxkZSIgfSwKKyAgeyAyMjgsICJhdW1sIiB9LAorICB7IDIyOSwgImFyaW5nIiB9LAorICB7IDIzMCwgImFlbGlnIiB9LAorICB7IDIzMSwgImNjZWRpbCIgfSwKKyAgeyAyMzIsICJlZ3JhdmUiIH0sCisgIHsgMjMzLCAiZWFjdXRlIiB9LAorICB7IDIzNCwgImVjaXJjIiB9LAorICB7IDIzNSwgImV1bWwiIH0sCisgIHsgMjM2LCAiaWdyYXZlIiB9LAorICB7IDIzNywgImlhY3V0ZSIgfSwKKyAgeyAyMzgsICJpY2lyYyIgfSwKKyAgeyAyMzksICJpdW1sIiB9LAorICB7IDI0MCwgImV0aCIgfSwKKyAgeyAyNDEsICJudGlsZGUiIH0sCisgIHsgMjQyLCAib2dyYXZlIiB9LAorICB7IDI0MywgIm9hY3V0ZSIgfSwKKyAgeyAyNDQsICJvY2lyYyIgfSwKKyAgeyAyNDUsICJvdGlsZGUiIH0sCisgIHsgMjQ2LCAib3VtbCIgfSwKKyAgeyAyNDcsICJkaXZpZGUiIH0sCisgIHsgMjQ4LCAib3NsYXNoIiB9LAorICB7IDI0OSwgInVncmF2ZSIgfSwKKyAgeyAyNTAsICJ1YWN1dGUiIH0sCisgIHsgMjUxLCAidWNpcmMiIH0sCisgIHsgMjUyLCAidXVtbCIgfSwKKyAgeyAyNTMsICJ5YWN1dGUiIH0sCisgIHsgMjU0LCAidGhvcm4iIH0sCisgIHsgMjU1LCAieXVtbCIgfSwKKyAgeyAgIDAsIE5VTEwgfQorfTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCBoX2Vycm9yX2NvZGVzW10gPQoreworI2lmZGVmIEhPU1RfTk9UX0ZPVU5EICAgCisgIHsgSE9TVF9OT1RfRk9VTkQsICJIb3N0IG5vdCBmb3VuZCIgfSwKKyNlbmRpZgorI2lmZGVmIFRSWV9BR0FJTgorICB7IFRSWV9BR0FJTiwgIlRyeSBBZ2FpbiIgfSwKKyNlbmRpZgorI2lmZGVmIE5PX1JFQ09WRVJZICAKKyAgeyBOT19SRUNPVkVSWSwgIk5vIFJlY292ZXJ5IiB9LAorI2VuZGlmCisjaWZkZWYgTk9fREFUQQorICB7IE5PX0RBVEEsICJObyBEYXRhIiB9LAorI2VuZGlmCisjaWZkZWYgTk9fQUREUkVTUworICB7IE5PX0FERFJFU1MsICJObyBBZGRyZXNzIiB9LAorI2VuZGlmCisgIHsgMCwgTlVMTCB9Cit9OworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCBoX2h0dHBfZXJyb3JfY29kZXNbXSA9Cit7IHsgMjAxLCAiQ3JlYXRlZCIgfSwKKyAgeyAyMDIsICJBY2NlcHRlZCIgfSwKKyAgeyAyMDMsICJOb24tQXV0aG9yaXRhdGl2ZSBJbmZvcm1hdGlvbiIgfSwKKyAgeyAyMDQsICJObyBDb250ZW50IiB9LAorICB7IDIwNSwgIlJlc2V0IENvbnRlbnQiIH0sCisgIHsgMjA2LCAiUGFydGlhbCBDb250ZW50IiB9LAorICB7IDMwMCwgIk11bHRpcGxlIENob2ljZXMiIH0sCisgIHsgMzAxLCAiTW92ZWQgUGVybWFuZW50bHkiIH0sCisgIHsgMzAyLCAiRm91bmQiIH0sCisgIHsgMzAzLCAiU2VlIE90aGVyIiB9LAorICB7IDMwNCwgIk5vdCBNb2RpZmllZCIgfSwKKyAgeyAzMDUsICJVc2UgUHJveHkiIH0sCisgIHsgMzA3LCAiVGVtcG9yYXJ5IFJlZGlyZWN0IiB9LAorICB7IDQwMCwgIkJhZCBSZXF1ZXN0IiB9LAorICB7IDQwMSwgIlVuYXV0aG9yaXplZCIgfSwKKyAgeyA0MDIsICJQYXltZW50IFJlcXVpcmVkIiB9LAorICB7IDQwMywgIkZvcmJpZGRlbiIgfSwKKyAgeyA0MDQsICJOb3QgRm91bmQiIH0sCisgIHsgNDA1LCAiTWV0aG9kIE5vdCBBbGxvd2VkIiB9LAorICB7IDQwNiwgIk5vdCBBY2NlcHRhYmxlIiB9LAorICB7IDQwNywgIlByb3h5IEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkIiB9LAorICB7IDQwOCwgIlJlcXVlc3QgVGltZS1vdXQiIH0sCisgIHsgNDA5LCAiQ29uZmxpY3QiIH0sCisgIHsgNDEwLCAiR29uZSIgfSwKKyAgeyA0MTEsICJMZW5ndGggUmVxdWlyZWQiIH0sCisgIHsgNDEyLCAiUHJlY29uZGl0aW9uIEZhaWxlZCIgfSwKKyAgeyA0MTMsICJSZXF1ZXN0IEVudGl0eSBUb28gTGFyZ2UiIH0sCisgIHsgNDE0LCAiUmVxdWVzdC1VUkkgVG9vIExhcmdlIiB9LAorICB7IDQxNSwgIlVuc3VwcG9ydGVkIE1lZGlhIFR5cGUiIH0sCisgIHsgNDE2LCAiUmVxdWVzdGVkIHJhbmdlIG5vdCBzYXRpc2ZpYWJsZSIgfSwKKyAgeyA0MTcsICJFeHBlY3RhdGlvbiBGYWlsZWQiIH0sCisgIHsgNTAwLCAiSW50ZXJuYWwgU2VydmVyIEVycm9yIiB9LAorICB7IDUwMSwgIk5vdCBJbXBsZW1lbnRlZCIgfSwKKyAgeyA1MDIsICJCYWQgR2F0ZXdheSIgfSwKKyAgeyA1MDMsICJTZXJ2aWNlIFVuYXZhaWxhYmxlIiB9LAorICB7IDUwNCwgIkdhdGV3YXkgVGltZS1vdXQiIH0sCisgIHsgNTA1LCAiSFRUUCBWZXJzaW9uIG5vdCBzdXBwb3J0ZWQiIH0sCisgIHsgICAwLCBOVUxMIH0KK307CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgV0lUSF9PUEVOU1NMCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgaF9zc2xfZXJyb3JfY29kZXNbXSA9Cit7CisjZGVmaW5lIF9TU0xfRVJST1IoZSkgeyBlLCAjZSB9CisgIF9TU0xfRVJST1IoU1NMX0VSUk9SX1NTTCksCisgIF9TU0xfRVJST1IoU1NMX0VSUk9SX1pFUk9fUkVUVVJOKSwKKyAgX1NTTF9FUlJPUihTU0xfRVJST1JfV0FOVF9SRUFEKSwKKyAgX1NTTF9FUlJPUihTU0xfRVJST1JfV0FOVF9XUklURSksCisgIF9TU0xfRVJST1IoU1NMX0VSUk9SX1dBTlRfQ09OTkVDVCksCisgIF9TU0xfRVJST1IoU1NMX0VSUk9SX1dBTlRfWDUwOV9MT09LVVApLAorICBfU1NMX0VSUk9SKFNTTF9FUlJPUl9TWVNDQUxMKSwKKyAgeyAwLCBOVUxMIH0KK307CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU5FUgorc3RhdGljIGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwIG1pbWVfY29kZXNbXSA9Cit7IHsgU09BUF9NSU1FXzdCSVQsCQkiN2JpdCIgfSwKKyAgeyBTT0FQX01JTUVfOEJJVCwJCSI4Yml0IiB9LAorICB7IFNPQVBfTUlNRV9CSU5BUlksCQkiYmluYXJ5IiB9LAorICB7IFNPQVBfTUlNRV9RVU9URURfUFJJTlRBQkxFLCAicXVvdGVkLXByaW50YWJsZSIgfSwKKyAgeyBTT0FQX01JTUVfQkFTRTY0LAkJImJhc2U2NCIgfSwKKyAgeyBTT0FQX01JTUVfSUVURl9UT0tFTiwJImlldGYtdG9rZW4iIH0sCisgIHsgU09BUF9NSU1FX1hfVE9LRU4sCQkieC10b2tlbiIgfSwKKyAgeyAwLAkJCQlOVUxMIH0KK307CisjZW5kaWYKKworI2lmZGVmIFdJTjMyCitzdGF0aWMgaW50IHRjcF9kb25lID0gMDsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citmc2VuZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgc2l6ZV90IG4pCit7IHJlZ2lzdGVyIGludCBud3JpdHRlbjsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiAhZGVmaW5lZChXSVRIX0xFQU4pCisgIGlmIChzb2FwLT5vcykKKyAgeyBzb2FwLT5vcy0+d3JpdGUocywgbik7CisgICAgaWYgKHNvYXAtPm9zLT5nb29kKCkpCisgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICByZXR1cm4gU09BUF9FT0Y7CisgIH0KKyNlbmRpZgorICB3aGlsZSAobikKKyAgeyBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgICB7IAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIGlmIChzb2FwLT5zZW5kX3RpbWVvdXQpCisgICAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICAgIGZkX3NldCBmZDsKKyAgICAgICAgaWYgKHNvYXAtPnNlbmRfdGltZW91dCA+IDApCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSBzb2FwLT5zZW5kX3RpbWVvdXQ7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSAtc29hcC0+c2VuZF90aW1lb3V0LzEwMDAwMDA7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gLXNvYXAtPnNlbmRfdGltZW91dCUxMDAwMDAwOworICAgICAgICB9CisgICAgICAgIEZEX1pFUk8oJmZkKTsKKyAgICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZmZCk7CisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsgcmVnaXN0ZXIgaW50IHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgTlVMTCwgJmZkLCAmZmQsICZ0aW1lb3V0KTsKKyAgICAgICAgICBpZiAociA+IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBpZiAoIXIpCisgICAgICAgICAgeyBzb2FwLT5lcnJudW0gPSAwOworICAgICAgICAgICAgcmV0dXJuIFNPQVBfRU9GOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUiAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VBR0FJTikKKyAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgICAgcmV0dXJuIFNPQVBfRU9GOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisjaWZkZWYgV0lUSF9PUEVOU1NMCisgICAgICBpZiAoc29hcC0+c3NsKQorICAgICAgICBud3JpdHRlbiA9IFNTTF93cml0ZShzb2FwLT5zc2wsIHMsIG4pOworICAgICAgZWxzZSBpZiAoc29hcC0+YmlvKQorICAgICAgICBud3JpdHRlbiA9IEJJT193cml0ZShzb2FwLT5iaW8sIHMsIG4pOworICAgICAgZWxzZQorI2VuZGlmCisjaWZkZWYgV0lUSF9VRFAKKyAgICAgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgICB7IGlmIChzb2FwLT5wZWVybGVuKQorCSAgbndyaXR0ZW4gPSBzZW5kdG8oKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgcywgbiwgc29hcC0+c29ja2V0X2ZsYWdzLCAoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlciwgc29hcC0+cGVlcmxlbik7CisgICAgICAgIGVsc2UKKwkgIG53cml0dGVuID0gc2VuZCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MpOworCS8qIHJldHJ5IGFuZCBiYWNrLW9mZiBhbGdvcml0aG0gKi8KKwkvKiBUT0RPOiB0aGlzIGlzIG5vdCB2ZXJ5IGNsZWFyIGZyb20gc3BlY3Mgc28gdmVyaWZ5IGFuZCBsaW1pdCBjb25kaXRpb25zIHVuZGVyIHdoaWNoIHdlIHNob3VsZCBsb29wIChlLmcuIEVOT0JVRlMpICovCisJaWYgKG53cml0dGVuIDwgMCkKKyAgICAgICAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgICAgICAgIGZkX3NldCBmZDsKKwkgIGludCB1ZHBfcmVwZWF0OworCSAgaW50IHVkcF9kZWxheTsKKyAgICAgICAgICBpZiAoKHNvYXAtPmNvbm5lY3RfZmxhZ3MgJiBTT19CUk9BRENBU1QpKQorCSAgICB1ZHBfcmVwZWF0ID0gMzsgLyogU09BUC1vdmVyLVVEUCBNVUxUSUNBU1RfVURQX1JFUEVBVCAtIDEgKi8KKyAgICAgICAgICBlbHNlCisJICAgIHVkcF9yZXBlYXQgPSAxOyAvKiBTT0FQLW92ZXItVURQIFVOSUNBU1RfVURQX1JFUEVBVCAtIDEgKi8KKwkgIHVkcF9kZWxheSA9IChzb2FwX3JhbmRvbSAlIDIwMSkgKyA1MDsgLyogVURQX01JTl9ERUxBWSAuLiBVRFBfTUFYX0RFTEFZICovCisJICBkbworICAgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSAwOworICAgICAgICAgICAgdGltZW91dC50dl91c2VjID0gMTAwMCAqIHVkcF9kZWxheTsgLyogbXMgKi8KKyAgICAgICAgICAgIEZEX1pFUk8oJmZkKTsKKyAgICAgICAgICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmZmQpOworICAgICAgICAgICAgc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksIE5VTEwsIE5VTEwsICZmZCwgJnRpbWVvdXQpOworCSAgICBpZiAoc29hcC0+cGVlcmxlbikKKwkgICAgICBud3JpdHRlbiA9IHNlbmR0bygoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyLCBzb2FwLT5wZWVybGVuKTsKKyAgICAgICAgICAgIGVsc2UKKwkgICAgICBud3JpdHRlbiA9IHNlbmQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgcywgbiwgc29hcC0+c29ja2V0X2ZsYWdzKTsKKwkgICAgdWRwX2RlbGF5IDw8PSAxOworCSAgICBpZiAodWRwX2RlbGF5ID4gNTAwKSAvKiBVRFBfVVBQRVJfREVMQVkgKi8KKwkgICAgICB1ZHBfZGVsYXkgPSA1MDA7CisJICB9CisJICB3aGlsZSAobndyaXR0ZW4gPCAwICYmIC0tdWRwX3JlcGVhdCA+IDApOworCX0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyNlbmRpZgorI2lmICFkZWZpbmVkKFBBTE0pICYmICFkZWZpbmVkKEFTNDAwKQorICAgICAgICBud3JpdHRlbiA9IHNlbmQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgcywgbiwgc29hcC0+c29ja2V0X2ZsYWdzKTsKKyNlbHNlCisgICAgICAgIG53cml0dGVuID0gc2VuZCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAodm9pZCopcywgbiwgc29hcC0+c29ja2V0X2ZsYWdzKTsKKyNlbmRpZgorICAgICAgaWYgKG53cml0dGVuIDw9IDApCisgICAgICB7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisJaW50IGVycjsKKyAgICAgICAgaWYgKHNvYXAtPnNzbCAmJiAoZXJyID0gU1NMX2dldF9lcnJvcihzb2FwLT5zc2wsIG53cml0dGVuKSkgIT0gU1NMX0VSUk9SX05PTkUgJiYgZXJyICE9IFNTTF9FUlJPUl9XQU5UX1JFQUQgJiYgZXJyICE9IFNTTF9FUlJPUl9XQU5UX1dSSVRFKQorICAgICAgICAgIHJldHVybiBTT0FQX0VPRjsKKyNlbmRpZgorICAgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUiAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VXT1VMREJMT0NLICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUFHQUlOKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgIHJldHVybiBTT0FQX0VPRjsKKyAgICAgICAgfQorICAgICAgICBud3JpdHRlbiA9IDA7IC8qIGFuZCBjYWxsIHdyaXRlKCkgYWdhaW4gKi8KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyNpZmRlZiBXSVRIX0ZBU1RDR0kKKyAgICAgIG53cml0dGVuID0gZndyaXRlKCh2b2lkKilzLCAxLCBuLCBzdGRvdXQpOworICAgICAgZmZsdXNoKHN0ZG91dCk7CisjZWxzZQorI2lmZGVmIFVOREVSX0NFCisgICAgICBud3JpdHRlbiA9IGZ3cml0ZShzLCAxLCBuLCBzb2FwLT5zZW5kZmQpOworI2Vsc2UKKyNpZmRlZiBWWFdPUktTCisjaWZkZWYgV01XX1JQTV9JTworICAgICAgaWYgKHNvYXAtPnJwbXJlcWlkKQorICAgICAgICBud3JpdHRlbiA9IChodHRwQmxvY2tQdXQoc29hcC0+cnBtcmVxaWQsIHMsIG4pID09IDApID8gbiA6IC0xOyAKKyAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICBud3JpdHRlbiA9IGZ3cml0ZShzLCBzaXplb2YoY2hhciksIG4sIGZkb3Blbihzb2FwLT5zZW5kZmQsICJ3IikpOworI2Vsc2UKKyAgICAgIG53cml0dGVuID0gd3JpdGUoKFNPQVBfU09DS0VUKXNvYXAtPnNlbmRmZCwgcywgbik7CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisgICAgICBpZiAobndyaXR0ZW4gPD0gMCkKKyAgICAgIHsgaWYgKHNvYXBfZXJybm8gIT0gU09BUF9FSU5UUiAmJiBzb2FwX2Vycm5vICE9IFNPQVBfRVdPVUxEQkxPQ0sgJiYgc29hcF9lcnJubyAhPSBTT0FQX0VBR0FJTikKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX2Vycm5vOworICAgICAgICAgIHJldHVybiBTT0FQX0VPRjsKKyAgICAgICAgfQorICAgICAgICBud3JpdHRlbiA9IDA7IC8qIGFuZCBjYWxsIHdyaXRlKCkgYWdhaW4gKi8KKyAgICAgIH0KKyAgICB9CisgICAgbiAtPSBud3JpdHRlbjsKKyAgICBzICs9IG53cml0dGVuOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2VuZF9yYXcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBuKQoreyBpZiAoIW4pCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgIHsgc29hcC0+Y291bnQgKz0gbjsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgICBpZiAoc29hcC0+ZnByZXBhcmVzZW5kICYmIChzb2FwLT5tb2RlICYgU09BUF9JTykgIT0gU09BUF9JT19TVE9SRSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IHNvYXAtPmZwcmVwYXJlc2VuZChzb2FwLCBzLCBuKTsKKyNlbmRpZgorICAgIHJldHVybiBTT0FQX09LOworICB9CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JTykKKyAgeyByZWdpc3RlciBzaXplX3QgaSA9IFNPQVBfQlVGTEVOIC0gc29hcC0+YnVmaWR4OworICAgIHdoaWxlIChuID49IGkpCisgICAgeyBtZW1jcHkoc29hcC0+YnVmICsgc29hcC0+YnVmaWR4LCBzLCBpKTsKKyAgICAgIHNvYXAtPmJ1ZmlkeCA9IFNPQVBfQlVGTEVOOworICAgICAgaWYgKHNvYXBfZmx1c2goc29hcCkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHMgKz0gaTsKKyAgICAgIG4gLT0gaTsKKyAgICAgIGkgPSBTT0FQX0JVRkxFTjsKKyAgICB9CisgICAgbWVtY3B5KHNvYXAtPmJ1ZiArIHNvYXAtPmJ1ZmlkeCwgcywgbik7CisgICAgc29hcC0+YnVmaWR4ICs9IG47CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgcmV0dXJuIHNvYXBfZmx1c2hfcmF3KHNvYXAsIHMsIG4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2ZsdXNoKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgbiA9IHNvYXAtPmJ1ZmlkeDsKKyAgaWYgKG4pCisgIHsgc29hcC0+YnVmaWR4ID0gMDsKKyNpZmRlZiBXSVRIX1pMSUIKKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIpCisgICAgeyBzb2FwLT5kX3N0cmVhbS5uZXh0X2luID0gKEJ5dGUqKXNvYXAtPmJ1ZjsKKyAgICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luID0gKHVuc2lnbmVkIGludCluOworI2lmZGVmIFdJVEhfR1pJUAorICAgICAgc29hcC0+el9jcmMgPSBjcmMzMihzb2FwLT56X2NyYywgKEJ5dGUqKXNvYXAtPmJ1ZiwgKHVuc2lnbmVkIGludCluKTsKKyNlbmRpZgorICAgICAgZG8KKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJEZWZsYXRpbmcgJXUgYnl0ZXNcbiIsIHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luKSk7CisgICAgICAgIGlmIChkZWZsYXRlKCZzb2FwLT5kX3N0cmVhbSwgWl9OT19GTFVTSCkgIT0gWl9PSykKKyAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVuYWJsZSB0byBkZWZsYXRlOiAlc1xuIiwgc29hcC0+ZF9zdHJlYW0ubXNnP3NvYXAtPmRfc3RyZWFtLm1zZzoiIikpOworICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCkKKyAgICAgICAgeyBpZiAoc29hcF9mbHVzaF9yYXcoc29hcCwgc29hcC0+el9idWYsIFNPQVBfQlVGTEVOKSkKKyAgICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IChCeXRlKilzb2FwLT56X2J1ZjsKKyAgICAgICAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgPSBTT0FQX0JVRkxFTjsKKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAoc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4pOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICAgIHJldHVybiBzb2FwX2ZsdXNoX3Jhdyhzb2FwLCBzb2FwLT5idWYsIG4pOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2ZsdXNoX3JhdyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgc2l6ZV90IG4pCit7IGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fU1RPUkUpCisgIHsgcmVnaXN0ZXIgY2hhciAqdDsKKyAgICBpZiAoISh0ID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBuKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICBtZW1jcHkodCwgcywgbik7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgICAgaWYgKHNvYXAtPmZwcmVwYXJlc2VuZCkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IHNvYXAtPmZwcmVwYXJlc2VuZChzb2FwLCBzLCBuKTsKKyNlbmRpZgorICAgIHJldHVybiBTT0FQX09LOworICB9CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgIHsgY2hhciB0WzE2XTsKKyAgICBzcHJpbnRmKHQsICJcclxuJWxYXHJcbiIgKyAoc29hcC0+Y2h1bmtzaXplID8gMCA6IDIpLCAodW5zaWduZWQgbG9uZyluKTsKKyAgICBEQkdNU0coU0VOVCwgdCwgc3RybGVuKHQpKTsKKyAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnNlbmQoc29hcCwgdCwgc3RybGVuKHQpKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgc29hcC0+Y2h1bmtzaXplICs9IG47CisgIH0KKyAgREJHTVNHKFNFTlQsIHMsIG4pOworI2VuZGlmCisgIHJldHVybiBzb2FwLT5lcnJvciA9IHNvYXAtPmZzZW5kKHNvYXAsIHMsIG4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMpCit7IGlmIChzKQorICAgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHN0cmxlbihzKSk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmQyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpCit7IGlmIChzb2FwX3NlbmQoc29hcCwgczEpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfc2VuZChzb2FwLCBzMik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZW5kMyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBjb25zdCBjaGFyICpzMykKK3sgaWYgKHNvYXBfc2VuZChzb2FwLCBzMSkKKyAgIHx8IHNvYXBfc2VuZChzb2FwLCBzMikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9zZW5kKHNvYXAsIHMzKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzaXplX3QKK2ZyZWN2KHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpzLCBzaXplX3QgbikKK3sgcmVnaXN0ZXIgaW50IHI7CisgIHNvYXAtPmVycm51bSA9IDA7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgIWRlZmluZWQoV0lUSF9MRUFOKQorICBpZiAoc29hcC0+aXMpCisgIHsgaWYgKHNvYXAtPmlzLT5nb29kKCkpCisgICAgICByZXR1cm4gc29hcC0+aXMtPnJlYWQocywgbikuZ2NvdW50KCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyNlbmRpZgorICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgeyBmb3IgKDs7KQorICAgIHsgCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgaWYgKHNvYXAtPnJlY3ZfdGltZW91dCkKKyAgICAgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgICAgZmRfc2V0IGZkOworICAgICAgICBpZiAoc29hcC0+cmVjdl90aW1lb3V0ID4gMCkKKyAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IHNvYXAtPnJlY3ZfdGltZW91dDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IC1zb2FwLT5yZWN2X3RpbWVvdXQvMTAwMDAwMDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAtc29hcC0+cmVjdl90aW1lb3V0JTEwMDAwMDA7CisgICAgICAgIH0KKyAgICAgICAgRkRfWkVSTygmZmQpOworICAgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJmZkKTsKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeyByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksICZmZCwgTlVMTCwgJmZkLCAmdGltZW91dCk7CisgICAgICAgICAgaWYgKHIgPiAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgaWYgKCFyKQorCSAgeyBzb2FwLT5lcnJudW0gPSAwOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUFHQUlOKQorCSAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisjaWZkZWYgV0lUSF9PUEVOU1NMCisgICAgICBpZiAoc29hcC0+c3NsKQorICAgICAgeyBpbnQgZXJyOworCXIgPSBTU0xfcmVhZChzb2FwLT5zc2wsIHMsIG4pOworICAgICAgICBpZiAociA+IDApCisgICAgICAgICAgcmV0dXJuIChzaXplX3QpcjsKKwllcnIgPSBTU0xfZ2V0X2Vycm9yKHNvYXAtPnNzbCwgcik7CisJaWYgKGVyciAhPSBTU0xfRVJST1JfTk9ORSAmJiBlcnIgIT0gU1NMX0VSUk9SX1dBTlRfUkVBRCAmJiBlcnIgIT0gU1NMX0VSUk9SX1dBTlRfV1JJVEUpCisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBlbHNlIGlmIChzb2FwLT5iaW8pCisgICAgICB7IHIgPSBCSU9fcmVhZChzb2FwLT5iaW8sIHMsIG4pOworICAgICAgICBpZiAociA+IDApCisgICAgICAgICAgcmV0dXJuIChzaXplX3QpcjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBlbHNlCisjZW5kaWYKKyAgICAgIHsgCisjaWZkZWYgV0lUSF9VRFAKKyAgICAgICAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICAgICAgeyBTT0FQX1NPQ0tMRU5fVCBrID0gKFNPQVBfU09DS0xFTl9UKXNpemVvZihzb2FwLT5wZWVyKTsKKwkgIG1lbXNldCgodm9pZCopJnNvYXAtPnBlZXIsIDAsIHNpemVvZihzb2FwLT5wZWVyKSk7CisgICAgICAgICAgciA9IHJlY3Zmcm9tKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHMsIG4sIHNvYXAtPnNvY2tldF9mbGFncywgKHN0cnVjdCBzb2NrYWRkciopJnNvYXAtPnBlZXIsICZrKTsJLyogcG9ydGFiaWxpdHkgbm90ZTogc2VlIFNPQVBfU09DS0xFTl9UIGRlZmluaXRpb24gaW4gc3Rkc29hcDIuaCAqLworCSAgc29hcC0+cGVlcmxlbiA9IChzaXplX3QpazsKKyNpZm5kZWYgV0lUSF9JUFY2CisgICAgICAgICAgc29hcC0+aXAgPSBudG9obChzb2FwLT5wZWVyLnNpbl9hZGRyLnNfYWRkcik7CisgICAgICAgICAgc29hcC0+cG9ydCA9IChpbnQpbnRvaHMoc29hcC0+cGVlci5zaW5fcG9ydCk7CisjZW5kaWYKKyAgICAgICAgfQorCWVsc2UKKyNlbmRpZgorICAgICAgICAgIHIgPSByZWN2KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHMsIG4sIHNvYXAtPnNvY2tldF9mbGFncyk7CisgICAgICAgIGlmIChyID49IDApCisgICAgICAgICAgcmV0dXJuIChzaXplX3QpcjsKKyAgICAgICAgaWYgKHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FQUdBSU4gJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FV09VTERCTE9DSykKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgfQorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgICAgZmRfc2V0IGZkOworICAgICAgICB0aW1lb3V0LnR2X3NlYyA9IDA7CisgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDEwMDAwOworICAgICAgICBGRF9aRVJPKCZmZCk7CisgICAgICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmZmQpOworI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgICAgICBpZiAoc29hcC0+c3NsICYmIFNTTF9nZXRfZXJyb3Ioc29hcC0+c3NsLCByKSA9PSBTU0xfRVJST1JfV0FOVF9XUklURSkKKyAgICAgICAgICByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksIE5VTEwsICZmZCwgJmZkLCAmdGltZW91dCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksICZmZCwgTlVMTCwgJmZkLCAmdGltZW91dCk7CisjZWxzZQorICAgICAgICByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksICZmZCwgTlVMTCwgJmZkLCAmdGltZW91dCk7CisjZW5kaWYKKyAgICAgICAgaWYgKHIgPCAwICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIpCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgfQorI2lmZGVmIFdJVEhfRkFTVENHSQorICByZXR1cm4gZnJlYWQocywgMSwgbiwgc3RkaW4pOworI2Vsc2UKKyNpZmRlZiBVTkRFUl9DRQorICByZXR1cm4gZnJlYWQocywgMSwgbiwgc29hcC0+cmVjdmZkKTsKKyNlbHNlCisjaWZkZWYgV01XX1JQTV9JTworICBpZiAoc29hcC0+cnBtcmVxaWQpCisgICAgciA9IGh0dHBCbG9ja1JlYWQoc29hcC0+cnBtcmVxaWQsIHMsIG4pOworICBlbHNlCisjZW5kaWYKKyAgciA9IHJlYWQoKFNPQVBfU09DS0VUKXNvYXAtPnJlY3ZmZCwgcywgbik7CisgIGlmIChyID49IDApCisgICAgcmV0dXJuIChzaXplX3QpcjsKKyAgc29hcC0+ZXJybnVtID0gc29hcF9lcnJubzsKKyAgcmV0dXJuIDA7CisjZW5kaWYKKyNlbmRpZgorfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc29hcF93Y2hhcgorc29hcF9nZXRjaHVua2NoYXIoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwLT5idWZpZHggPCBzb2FwLT5idWZsZW4pCisgICAgcmV0dXJuIHNvYXAtPmJ1Zltzb2FwLT5idWZpZHgrK107CisgIHNvYXAtPmJ1ZmlkeCA9IDA7CisgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmNodW5rYnVmbGVuID0gc29hcC0+ZnJlY3Yoc29hcCwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTik7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVhZCAldSBieXRlcyBmcm9tIHNvY2tldCAlZFxuIiwgKHVuc2lnbmVkIGludClzb2FwLT5idWZsZW4sIHNvYXAtPnNvY2tldCkpOworICBEQkdNU0coUkVDViwgc29hcC0+YnVmLCBzb2FwLT5idWZsZW4pOworICBpZiAoc29hcC0+YnVmbGVuKQorICAgIHJldHVybiBzb2FwLT5idWZbc29hcC0+YnVmaWR4KytdOworICByZXR1cm4gRU9GOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzb2FwX2lzeGRpZ2l0KGludCBjKQoreyByZXR1cm4gKGMgPj0gJzAnICYmIGMgPD0gJzknKSB8fCAoYyA+PSAnQScgJiYgYyA8PSAnRicpIHx8IChjID49ICdhJyAmJiBjIDw9ICdmJyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVjdl9yYXcoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNpemVfdCByZXQ7CisjaWZkZWYgV0lUSF9aTElCCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQikKKyAgeyBpZiAoc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPT0gWl9OVUxMKQorICAgICAgcmV0dXJuIEVPRjsKKyAgICBpZiAoc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4gfHwgIXNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCkKKyAgICB7IHJlZ2lzdGVyIGludCByOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbmZsYXRpbmdcbiIpKTsKKyAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gKEJ5dGUqKXNvYXAtPmJ1ZjsKKyAgICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCA9IFNPQVBfQlVGTEVOOworICAgICAgciA9IGluZmxhdGUoJnNvYXAtPmRfc3RyZWFtLCBaX05PX0ZMVVNIKTsKKyAgICAgIGlmIChyID09IFpfT0sgfHwgciA9PSBaX1NUUkVBTV9FTkQpCisgICAgICB7IHNvYXAtPmJ1ZmlkeCA9IDA7CisgICAgICAgIHNvYXAtPmJ1ZmxlbiA9IFNPQVBfQlVGTEVOIC0gc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0OworICAgICAgICBpZiAoc29hcC0+emxpYl9pbiA9PSBTT0FQX1pMSUJfR1pJUCkKKyAgICAgICAgICBzb2FwLT56X2NyYyA9IGNyYzMyKHNvYXAtPnpfY3JjLCAoQnl0ZSopc29hcC0+YnVmLCAodW5zaWduZWQgaW50KXNvYXAtPmJ1Zmxlbik7CisgICAgICAgIGlmIChyID09IFpfU1RSRUFNX0VORCkKKyAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluZmxhdGVkICVsdS0+JWx1IGJ5dGVzXG4iLCBzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiwgc29hcC0+ZF9zdHJlYW0udG90YWxfb3V0KSk7CisgICAgICAgICAgc29hcC0+el9yYXRpb19pbiA9IChmbG9hdClzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiAvIChmbG9hdClzb2FwLT5kX3N0cmVhbS50b3RhbF9vdXQ7CisgICAgICAgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSBaX05VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvYXAtPmJ1ZmxlbikKKyAgICAgICAgeyBzb2FwLT5jb3VudCArPSBzb2FwLT5idWZsZW47CisgICAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHIgIT0gWl9CVUZfRVJST1IpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5mbGF0ZSBlcnJvcjogJXNcbiIsIHNvYXAtPmRfc3RyZWFtLm1zZz9zb2FwLT5kX3N0cmVhbS5tc2c6IiIpKTsKKyAgICAgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSBaX05VTEw7CisJc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgICAgIHJldHVybiBFT0Y7CisgICAgICB9CisgICAgfQoremxpYl9hZ2FpbjoKKyAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LICYmICFzb2FwLT5jaHVua3NpemUpCisgICAgeyBtZW1jcHkoc29hcC0+YnVmLCBzb2FwLT56X2J1ZiwgU09BUF9CVUZMRU4pOworICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+el9idWZsZW47CisgICAgfQorICB9CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykgLyogcmVhZCBIVFRQIGNodW5rZWQgdHJhbnNmZXIgKi8KKyAgeyAKK2NodW5rX2FnYWluOgorICAgIGlmIChzb2FwLT5jaHVua3NpemUpCisgICAgeyBzb2FwLT5idWZsZW4gPSByZXQgPSBzb2FwLT5mcmVjdihzb2FwLCBzb2FwLT5idWYsIHNvYXAtPmNodW5rc2l6ZSA+IFNPQVBfQlVGTEVOID8gU09BUF9CVUZMRU4gOiBzb2FwLT5jaHVua3NpemUpOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHZXR0aW5nIGNodW5rOiByZWFkICV1IGJ5dGVzXG4iLCAodW5zaWduZWQgaW50KXJldCkpOworICAgICAgREJHTVNHKFJFQ1YsIHNvYXAtPmJ1ZiwgcmV0KTsKKyAgICAgIHNvYXAtPmJ1ZmlkeCA9IDA7CisgICAgICBzb2FwLT5jaHVua3NpemUgLT0gcmV0OworICAgIH0KKyAgICBlbHNlCisgICAgeyByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgICAgICBjaGFyICp0LCB0bXBbOF07CisgICAgICB0ID0gdG1wOworICAgICAgaWYgKCFzb2FwLT5jaHVua2J1ZmxlbikKKyAgICAgIHsgc29hcC0+Y2h1bmtidWZsZW4gPSByZXQgPSBzb2FwLT5mcmVjdihzb2FwLCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOKTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWFkICV1IGJ5dGVzIChjaHVua2VkKSBmcm9tIHNvY2tldCAlZFxuIiwgKHVuc2lnbmVkIGludClyZXQsIHNvYXAtPnNvY2tldCkpOworICAgICAgICBEQkdNU0coUkVDViwgc29hcC0+YnVmLCByZXQpOworICAgICAgICBzb2FwLT5idWZpZHggPSAwOworICAgICAgICBpZiAoIXJldCkKKyAgICAgICAgICByZXR1cm4gc29hcC0+YWhlYWQgPSBFT0Y7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHNvYXAtPmJ1ZmlkeCA9IHNvYXAtPmJ1ZmxlbjsKKyAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmNodW5rYnVmbGVuOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHZXR0aW5nIGNodW5rIHNpemUgKGlkeD0ldSBsZW49JXUpXG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmJ1ZmlkeCwgKHVuc2lnbmVkIGludClzb2FwLT5idWZsZW4pKTsKKyAgICAgIHdoaWxlICghc29hcF9pc3hkaWdpdCgoaW50KShjID0gc29hcF9nZXRjaHVua2NoYXIoc29hcCkpKSkKKyAgICAgICAgaWYgKChpbnQpYyA9PSBFT0YpCisJICByZXR1cm4gc29hcC0+YWhlYWQgPSBFT0Y7CisgICAgICBkbworICAgICAgICAqdCsrID0gKGNoYXIpYzsKKyAgICAgIHdoaWxlIChzb2FwX2lzeGRpZ2l0KChpbnQpKGMgPSBzb2FwX2dldGNodW5rY2hhcihzb2FwKSkpICYmIHQgLSB0bXAgPCA3KTsKKyAgICAgIHdoaWxlICgoaW50KWMgIT0gRU9GICYmIGMgIT0gJ1xuJykKKyAgICAgICAgYyA9IHNvYXBfZ2V0Y2h1bmtjaGFyKHNvYXApOworICAgICAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgIHJldHVybiBzb2FwLT5haGVhZCA9IEVPRjsKKyAgICAgICp0ID0gJ1wwJzsKKyAgICAgIHNvYXAtPmNodW5rc2l6ZSA9IHNvYXBfc3RydG91bCh0bXAsICZ0LCAxNik7CisgICAgICBpZiAoIXNvYXAtPmNodW5rc2l6ZSkKKyAgICAgIHsgc29hcC0+Y2h1bmtidWZsZW4gPSAwOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBvZiBjaHVua2VkIG1lc3NhZ2VcbiIpKTsKKwl3aGlsZSAoKGludCljICE9IEVPRiAmJiBjICE9ICdcbicpCisgICAgICAgICAgYyA9IHNvYXBfZ2V0Y2h1bmtjaGFyKHNvYXApOworICAgICAgICByZXR1cm4gc29hcC0+YWhlYWQgPSBFT0Y7CisgICAgICB9CisgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5idWZpZHggKyBzb2FwLT5jaHVua3NpemU7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk1vdmluZyBidWYgbGVuIHRvIGlkeD0ldSBsZW49JXUgKCVzKVxuIiwgKHVuc2lnbmVkIGludClzb2FwLT5idWZpZHgsICh1bnNpZ25lZCBpbnQpc29hcC0+YnVmbGVuLCB0bXApKTsKKyAgICAgIGlmIChzb2FwLT5idWZsZW4gPiBzb2FwLT5jaHVua2J1ZmxlbikKKyAgICAgIHsgc29hcC0+YnVmbGVuID0gc29hcC0+Y2h1bmtidWZsZW47CisgICAgICAgIHNvYXAtPmNodW5rc2l6ZSAtPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgICAgIHNvYXAtPmNodW5rYnVmbGVuID0gMDsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQYXNzZWQgZW5kIG9mIGJ1ZmZlciBmb3IgY2h1bmtlZCBIVFRQICgldSBieXRlcyBsZWZ0KVxuIiwgKHVuc2lnbmVkIGludCkoc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4KSkpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoc29hcC0+Y2h1bmtidWZsZW4pCisgICAgICAgIHNvYXAtPmNodW5rc2l6ZSA9IDA7CisgICAgICByZXQgPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgICBpZiAoIXJldCkKKyAgICAgICAgZ290byBjaHVua19hZ2FpbjsKKyAgICB9CisgIH0KKyAgZWxzZQorI2VuZGlmCisgIHsgc29hcC0+YnVmaWR4ID0gMDsKKyAgICBzb2FwLT5idWZsZW4gPSByZXQgPSBzb2FwLT5mcmVjdihzb2FwLCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOKTsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlYWQgJXUgYnl0ZXMgZnJvbSBzb2NrZXQgJWRcbiIsICh1bnNpZ25lZCBpbnQpcmV0LCBzb2FwLT5zb2NrZXQpKTsKKyAgICBEQkdNU0coUkVDViwgc29hcC0+YnVmLCByZXQpOworICB9CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5mcHJlcGFyZXJlY3YgJiYgKHNvYXAtPmVycm9yID0gc29hcC0+ZnByZXBhcmVyZWN2KHNvYXAsIHNvYXAtPmJ1ZiwgcmV0KSkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2VuZGlmCisjaWZkZWYgV0lUSF9aTElCCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQikKKyAgeyByZWdpc3RlciBpbnQgcjsKKyAgICBtZW1jcHkoc29hcC0+el9idWYsIHNvYXAtPmJ1ZiwgU09BUF9CVUZMRU4pOworICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfaW4gPSAoQnl0ZSopKHNvYXAtPnpfYnVmICsgc29hcC0+YnVmaWR4KTsKKyAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbiA9ICh1bnNpZ25lZCBpbnQpcmV0OworICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gKEJ5dGUqKXNvYXAtPmJ1ZjsKKyAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgPSBTT0FQX0JVRkxFTjsKKyAgICByID0gaW5mbGF0ZSgmc29hcC0+ZF9zdHJlYW0sIFpfTk9fRkxVU0gpOworICAgIGlmIChyID09IFpfT0sgfHwgciA9PSBaX1NUUkVBTV9FTkQpCisgICAgeyBzb2FwLT5idWZpZHggPSAwOworICAgICAgc29hcC0+el9idWZsZW4gPSBzb2FwLT5idWZsZW47CisgICAgICBzb2FwLT5idWZsZW4gPSByZXQgPSBTT0FQX0JVRkxFTiAtIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dDsKKyAgICAgIGlmIChzb2FwLT56bGliX2luID09IFNPQVBfWkxJQl9HWklQKQorICAgICAgICBzb2FwLT56X2NyYyA9IGNyYzMyKHNvYXAtPnpfY3JjLCAoQnl0ZSopc29hcC0+YnVmLCAodW5zaWduZWQgaW50KXNvYXAtPmJ1Zmxlbik7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluZmxhdGVkICV1IGJ5dGVzXG4iLCAodW5zaWduZWQgaW50KXJldCkpOworICAgICAgaWYgKCFyZXQpCisgICAgICAgIGdvdG8gemxpYl9hZ2FpbjsKKyAgICAgIGlmIChyID09IFpfU1RSRUFNX0VORCkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbmZsYXRlZCAlbHUtPiVsdSBieXRlc1xuIiwgc29hcC0+ZF9zdHJlYW0udG90YWxfaW4sIHNvYXAtPmRfc3RyZWFtLnRvdGFsX291dCkpOworICAgICAgICBzb2FwLT56X3JhdGlvX2luID0gKGZsb2F0KXNvYXAtPmRfc3RyZWFtLnRvdGFsX2luIC8gKGZsb2F0KXNvYXAtPmRfc3RyZWFtLnRvdGFsX291dDsKKyAgICAgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSBaX05VTEw7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVW5hYmxlIHRvIGluZmxhdGU6ICglZCkgJXNcbiIsIHIsIHNvYXAtPmRfc3RyZWFtLm1zZz9zb2FwLT5kX3N0cmVhbS5tc2c6IiIpKTsKKyAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gWl9OVUxMOworICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgICByZXR1cm4gRU9GOworICAgIH0KKyAgfQorI2VuZGlmCisgIHNvYXAtPmNvdW50ICs9IHJldDsKKyAgcmV0dXJuICFyZXQ7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVjdihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkKKyAgeyBpZiAoc29hcC0+ZGltZS5idWZsZW4pCisgICAgeyBjaGFyICpzOworICAgICAgaW50IGk7CisgICAgICB1bnNpZ25lZCBjaGFyIHRtcFsxMl07CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRJTUUgaGRyIGZvciBjaHVua2VkIERJTUUgaXMgaW4gYnVmZmVyXG4iKSk7CisgICAgICBzb2FwLT5jb3VudCArPSBzb2FwLT5kaW1lLmJ1ZmxlbiAtIHNvYXAtPmJ1ZmxlbjsKKyAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmRpbWUuYnVmbGVuOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTa2lwIHBhZGRpbmcgKCVsZCBieXRlcylcbiIsIC0obG9uZylzb2FwLT5kaW1lLnNpemUmMykpOworICAgICAgZm9yIChpID0gLShsb25nKXNvYXAtPmRpbWUuc2l6ZSYzOyBpID4gMDsgaS0tKQorICAgICAgeyBzb2FwLT5idWZpZHgrKzsKKyAgICAgICAgaWYgKHNvYXAtPmJ1ZmlkeCA+PSBzb2FwLT5idWZsZW4pCisgICAgICAgICAgaWYgKHNvYXBfcmVjdl9yYXcoc29hcCkpCisgICAgICAgICAgICByZXR1cm4gRU9GOworICAgICAgfQorICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHZXQgRElNRSBoZHIgZm9yIG5leHQgY2h1bmtcbiIpKTsKKyAgICAgIHMgPSAoY2hhciopdG1wOworICAgICAgZm9yIChpID0gMTI7IGkgPiAwOyBpLS0pCisgICAgICB7ICpzKysgPSBzb2FwLT5idWZbc29hcC0+YnVmaWR4KytdOworICAgICAgICBpZiAoc29hcC0+YnVmaWR4ID49IHNvYXAtPmJ1ZmxlbikKKyAgICAgICAgICBpZiAoc29hcF9yZWN2X3Jhdyhzb2FwKSkKKyAgICAgICAgICAgIHJldHVybiBFT0Y7CisgICAgICB9CisgICAgICBzb2FwLT5kaW1lLmZsYWdzID0gdG1wWzBdICYgMHg3OworICAgICAgc29hcC0+ZGltZS5zaXplID0gKChzaXplX3QpdG1wWzhdIDw8IDI0KSB8ICgoc2l6ZV90KXRtcFs5XSA8PCAxNikgfCAoKHNpemVfdCl0bXBbMTBdIDw8IDgpIHwgKChzaXplX3QpdG1wWzExXSk7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdldCBESU1FIGNodW5rICgldSBieXRlcylcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+ZGltZS5zaXplKSk7CisgICAgICBpZiAoc29hcC0+ZGltZS5mbGFncyAmIFNPQVBfRElNRV9DRikKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJNb3JlIGNodW5raW5nXG4iKSk7CisgICAgICAgIHNvYXAtPmRpbWUuY2h1bmtzaXplID0gc29hcC0+ZGltZS5zaXplOworICAgICAgICBpZiAoc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4ID49IHNvYXAtPmRpbWUuc2l6ZSkKKyAgICAgICAgeyBzb2FwLT5kaW1lLmJ1ZmxlbiA9IHNvYXAtPmJ1ZmxlbjsKKyAgICAgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5idWZpZHggKyBzb2FwLT5kaW1lLmNodW5rc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgc29hcC0+ZGltZS5jaHVua3NpemUgLT0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkxhc3QgY2h1bmtcbiIpKTsKKyAgICAgICAgc29hcC0+ZGltZS5idWZsZW4gPSAwOworICAgICAgICBzb2FwLT5kaW1lLmNodW5rc2l6ZSA9IDA7CisgICAgICB9CisgICAgICBzb2FwLT5jb3VudCA9IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiJXUgYnl0ZXMgcmVtYWluaW5nXG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmNvdW50KSk7CisgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICB9CisgICAgaWYgKHNvYXAtPmRpbWUuY2h1bmtzaXplKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHZXQgbmV4dCBESU1FIGhkciBmb3IgY2h1bmtlZCBESU1FICgldSBieXRlcyBjaHVuaylcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+ZGltZS5jaHVua3NpemUpKTsKKyAgICAgIGlmIChzb2FwX3JlY3ZfcmF3KHNvYXApKQorICAgICAgICByZXR1cm4gRU9GOworICAgICAgaWYgKHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeCA+PSBzb2FwLT5kaW1lLmNodW5rc2l6ZSkKKyAgICAgIHsgc29hcC0+ZGltZS5idWZsZW4gPSBzb2FwLT5idWZsZW47CisgICAgICAgIHNvYXAtPmNvdW50IC09IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeCAtIHNvYXAtPmRpbWUuY2h1bmtzaXplOworICAgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5idWZpZHggKyBzb2FwLT5kaW1lLmNodW5rc2l6ZTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgc29hcC0+ZGltZS5jaHVua3NpemUgLT0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIlbHUgYnl0ZXMgcmVtYWluaW5nLCBjb3VudD0ldVxuIiwgKHVuc2lnbmVkIGxvbmcpKHNvYXAtPmJ1Zmxlbi1zb2FwLT5idWZpZHgpLCAodW5zaWduZWQgaW50KXNvYXAtPmNvdW50KSk7CisgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICB9CisgIH0KKyNlbmRpZgorICByZXR1cm4gc29hcF9yZWN2X3Jhdyhzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3NvYXBfd2NoYXIKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0Y2hhcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICBjID0gc29hcC0+YWhlYWQ7CisgIGlmIChjKQorICB7IGlmIChjICE9IEVPRikKKyAgICAgIHNvYXAtPmFoZWFkID0gMDsKKyAgICByZXR1cm4gYzsKKyAgfQorICByZXR1cm4gc29hcF9nZXQxKHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAqCitTT0FQX0ZNQUMyCitzb2FwX2NvZGUoY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgKm1hcCwgY29uc3QgY2hhciAqc3RyKQoreyBpZiAoc3RyKQorICB7IHdoaWxlIChtYXAtPnN0cmluZykKKyAgICB7IGlmICghc3RyY21wKHN0ciwgbWFwLT5zdHJpbmcpKSAvKiBjYXNlIHNlbnNpdGl2ZSAqLworICAgICAgICByZXR1cm4gbWFwOworICAgICAgbWFwKys7CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorbG9uZworU09BUF9GTUFDMgorc29hcF9pbnRfY29kZShjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCAqbWFwLCBjb25zdCBjaGFyICpzdHIsIGxvbmcgb3RoZXIpCit7IHdoaWxlIChtYXAtPnN0cmluZykKKyAgeyBpZiAoIXNvYXBfdGFnX2NtcChzdHIsIG1hcC0+c3RyaW5nKSkgLyogY2FzZSBpbnNlbnNpdGl2ZSAqLworICAgICAgcmV0dXJuIG1hcC0+Y29kZTsKKyAgICBtYXArKzsKKyAgfQorICByZXR1cm4gb3RoZXI7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9zdHJfY29kZShjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCAqbWFwLCBsb25nIGNvZGUpCit7IHdoaWxlIChtYXAtPmNvZGUgIT0gY29kZSAmJiBtYXAtPnN0cmluZykKKyAgICBtYXArKzsKKyAgcmV0dXJuIG1hcC0+c3RyaW5nOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHNvYXBfd2NoYXIKK3NvYXBfY2hhcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgY2hhciB0bXBbOF07CisgIHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIHJlZ2lzdGVyIGNoYXIgKnMgPSB0bXA7CisgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspCisgIHsgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICBpZiAoYyA9PSAnOycgfHwgKGludCljID09IEVPRikKKyAgICAgIGJyZWFrOworICAgICpzKysgPSAoY2hhciljOworICB9CisgICpzID0gJ1wwJzsKKyAgaWYgKCp0bXAgPT0gJyMnKQorICB7IGlmICh0bXBbMV0gPT0gJ3gnIHx8IHRtcFsxXSA9PSAnWCcpCisgICAgICByZXR1cm4gc29hcF9zdHJ0b2wodG1wICsgMiwgTlVMTCwgMTYpOworICAgIHJldHVybiBhdG9sKHRtcCArIDEpOworICB9CisgIGlmICghc3RyY21wKHRtcCwgImx0IikpCisgICAgcmV0dXJuICc8JzsKKyAgaWYgKCFzdHJjbXAodG1wLCAiZ3QiKSkKKyAgICByZXR1cm4gJz4nOworICBpZiAoIXN0cmNtcCh0bXAsICJhbXAiKSkKKyAgICByZXR1cm4gJyYnOworICBpZiAoIXN0cmNtcCh0bXAsICJxdW90IikpCisgICAgcmV0dXJuICciJzsKKyAgaWYgKCFzdHJjbXAodG1wLCAiYXBvcyIpKQorICAgIHJldHVybiAnXCcnOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgcmV0dXJuIChzb2FwX3djaGFyKXNvYXBfaW50X2NvZGUoaHRtbF9lbnRpdHlfY29kZXMsIHRtcCwgU09BUF9VTktOT1dOX0NIQVIpOworI2Vsc2UKKyAgcmV0dXJuIFNPQVBfVU5LTk9XTl9DSEFSOyAvKiB1c2UgdGhpcyB0byByZXByZXNlbnQgdW5rbm93biBjb2RlICovCisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFdJVEhfTEVBTgorc29hcF93Y2hhcgorc29hcF9nZXQwKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcC0+YnVmaWR4ID49IHNvYXAtPmJ1ZmxlbiAmJiBzb2FwX3JlY3Yoc29hcCkpCisgICAgcmV0dXJuIEVPRjsKKyAgcmV0dXJuICh1bnNpZ25lZCBjaGFyKXNvYXAtPmJ1Zltzb2FwLT5idWZpZHhdOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgV0lUSF9MRUFOCitzb2FwX3djaGFyCitzb2FwX2dldDEoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwLT5idWZpZHggPj0gc29hcC0+YnVmbGVuICYmIHNvYXBfcmVjdihzb2FwKSkKKyAgICByZXR1cm4gRU9GOworICByZXR1cm4gKHVuc2lnbmVkIGNoYXIpc29hcC0+YnVmW3NvYXAtPmJ1ZmlkeCsrXTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3NvYXBfd2NoYXIKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIGMgPSBzb2FwLT5haGVhZDsKKyAgaWYgKGMpCisgIHsgaWYgKGMgIT0gRU9GKQorICAgICAgc29hcC0+YWhlYWQgPSAwOworICB9CisgIGVsc2UKKyAgICBjID0gc29hcF9nZXQxKHNvYXApOworICBmb3IgKDs7KQorICB7IGlmIChzb2FwLT5jZGF0YSkKKyAgICB7IGlmIChjID09ICddJykKKyAgICAgIHsgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgICAgaWYgKGMgPT0gJ10nKQorICAgICAgICB7IHNvYXAtPmNkYXRhID0gMDsKKyAgICAgICAgICBzb2FwX2dldDEoc29hcCk7IC8qIHNraXAgPiAqLworICAgICAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICAgIH0KKwllbHNlCisgICAgICAgIHsgc29hcF9yZXZnZXQxKHNvYXApOworICAgICAgICAgIHJldHVybiAnXSc7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGM7CisgICAgfQorICAgIHN3aXRjaCAoYykKKyAgICB7IGNhc2UgJzwnOgorICAgICAgICBkbyBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgICB3aGlsZSAoc29hcF9ibGFuayhjKSk7CisgICAgICAgIGlmIChjID09ICchJyB8fCBjID09ICc/JyB8fCBjID09ICclJykKKyAgICAgICAgeyByZWdpc3RlciBpbnQgayA9IDE7CisJICBpZiAoYyA9PSAnIScpCisgICAgICAgICAgeyBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgICAgICAgaWYgKGMgPT0gJ1snKQorICAgICAgICAgICAgeyBkbyBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgICAgICAgICB3aGlsZSAoKGludCljICE9IEVPRiAmJiBjICE9ICdbJyk7CisgICAgICAgICAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBzb2FwLT5jZGF0YSA9IDE7CisgICAgICAgICAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisJICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYyA9PSAnLScgJiYgKGMgPSBzb2FwX2dldDEoc29hcCkpID09ICctJykKKyAgICAgICAgICAgIHsgZG8KKyAgICAgICAgICAgICAgeyBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgICAgICAgICAgIGlmIChjID09ICctJyAmJiAoYyA9IHNvYXBfZ2V0MShzb2FwKSkgPT0gJy0nKQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0gd2hpbGUgKChpbnQpYyAhPSBFT0YpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKwkgIGVsc2UgaWYgKGMgPT0gJz8nKQorICAgICAgICAgICAgYyA9IHNvYXBfZ2V0X3BpKHNvYXApOworICAgICAgICAgIHdoaWxlICgoaW50KWMgIT0gRU9GKQorICAgICAgICAgIHsgaWYgKGMgPT0gJzwnKQorCSAgICAgIGsrKzsKKwkgICAgZWxzZSBpZiAoYyA9PSAnPicpCisJICAgIHsgaWYgKC0tayA8PSAwKQorCSAgICAgICAgYnJlYWs7CisJICAgIH0KKwkgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKwkgIH0KKwkgIGlmICgoaW50KWMgPT0gRU9GKQorCSAgICBicmVhazsKKyAgICAgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChjID09ICcvJykKKyAgICAgICAgICByZXR1cm4gU09BUF9UVDsKKyAgICAgICAgc29hcF9yZXZnZXQxKHNvYXApOworICAgICAgICByZXR1cm4gU09BUF9MVDsKKyAgICAgIGNhc2UgJz4nOgorICAgICAgICByZXR1cm4gU09BUF9HVDsKKyAgICAgIGNhc2UgJyInOgorICAgICAgICByZXR1cm4gU09BUF9RVDsKKyAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgcmV0dXJuIFNPQVBfQVA7CisgICAgICBjYXNlICcmJzoKKyAgICAgICAgcmV0dXJuIHNvYXBfY2hhcihzb2FwKSB8IDB4ODAwMDAwMDA7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIHJldHVybiBjOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHNvYXBfd2NoYXIKK3NvYXBfZ2V0X3BpKHN0cnVjdCBzb2FwICpzb2FwKQoreyBjaGFyIGJ1Zls2NF07CisgIHJlZ2lzdGVyIGNoYXIgKnMgPSBidWY7CisgIHJlZ2lzdGVyIGludCBpID0gc2l6ZW9mKGJ1Zik7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgLyogVGhpcyBpcyBhIHF1aWNrIHdheSB0byBwYXJzZSBYTUwgUEkgYW5kIHdlIGNvdWxkIHVzZSBhIGNhbGxiYWNrIGluc3RlYWQgdG8KKyAgICogZW5hYmxlIGFwcGxpY2F0aW9ucyB0byBpbnRlcmNlcHQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgKi8KKyAgd2hpbGUgKChpbnQpYyAhPSBFT0YgJiYgYyAhPSAnPycpCisgIHsgaWYgKC0taSA+IDApCisgICAgeyBpZiAoc29hcF9ibGFuayhjKSkKKyAgICAgICAgYyA9ICcgJzsKKyAgICAgICpzKysgPSAoY2hhciljOworICAgIH0KKyAgICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICB9CisgICpzID0gJ1wwJzsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJYTUwgUEkgPD8lcz8+XG4iLCBidWYpKTsKKyAgaWYgKCFzdHJuY21wKGJ1ZiwgInhtbCAiLCA0KSkKKyAgeyBzID0gc3Ryc3RyKGJ1ZiwgIiBlbmNvZGluZz0iKTsKKyAgICBpZiAocyAmJiBzWzEwXSkKKyAgICB7IGlmICghc29hcF90YWdfY21wKHMgKyAxMSwgImlzby04ODU5LTEqIikKKyAgICAgICB8fCAhc29hcF90YWdfY21wKHMgKyAxMSwgImxhdGluMSoiKSkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTd2l0Y2hpbmcgdG8gbGF0aW4xIGVuY29kaW5nXG4iKSk7CisgICAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfTEFUSU47CisgICAgICB9CisgICAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHMgKyAxMSwgInV0Zi04KiIpKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlN3aXRjaGluZyB0byB1dGYtOCBlbmNvZGluZ1xuIikpOworICAgICAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0VOQ19MQVRJTjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKChpbnQpYyAhPSBFT0YpCisgICAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgcmV0dXJuIGM7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfbW92ZShzdHJ1Y3Qgc29hcCAqc29hcCwgbG9uZyBuKQoreyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk1vdmluZyAlbGQgYnl0ZXMgZm9yd2FyZFxuIiwgKGxvbmcpbikpOworICBmb3IgKDsgbiA+IDA7IG4tLSkKKyAgICBpZiAoKGludClzb2FwX2dldGNoYXIoc29hcCkgPT0gRU9GKQorICAgICAgcmV0dXJuIFNPQVBfRU9GOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc2l6ZV90CitTT0FQX0ZNQUMyCitzb2FwX3RlbGwoc3RydWN0IHNvYXAgKnNvYXApCit7IHJldHVybiBzb2FwLT5jb3VudCAtIHNvYXAtPmJ1ZmxlbiArIHNvYXAtPmJ1ZmlkeCAtIChzb2FwLT5haGVhZCAhPSAwKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dHV0Zjgoc3RydWN0IHNvYXAgKnNvYXAsIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgYykKK3sgY2hhciB0bXBbMTZdOworICBpZiAoYyA+IDAgJiYgYyA8IDB4ODApCisgIHsgKnRtcCA9IChjaGFyKWM7CisgICAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgdG1wLCAxKTsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgIHsgcmVnaXN0ZXIgY2hhciAqdCA9IHRtcDsKKyAgICBpZiAoYyA8IDB4MDgwMCkKKyAgICAgICp0KysgPSAoY2hhcikoMHhDMCB8ICgoYyA+PiA2KSAmIDB4MUYpKTsKKyAgICBlbHNlCisgICAgeyBpZiAoYyA8IDB4MDEwMDAwKQorICAgICAgICAqdCsrID0gKGNoYXIpKDB4RTAgfCAoKGMgPj4gMTIpICYgMHgwRikpOworICAgICAgZWxzZQorICAgICAgeyBpZiAoYyA8IDB4MjAwMDAwKQorICAgICAgICAgICp0KysgPSAoY2hhcikoMHhGMCB8ICgoYyA+PiAxOCkgJiAweDA3KSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyBpZiAoYyA8IDB4MDQwMDAwMDApCisgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjggfCAoKGMgPj4gMjQpICYgMHgwMykpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7ICp0KysgPSAoY2hhcikoMHhGQyB8ICgoYyA+PiAzMCkgJiAweDAxKSk7CisgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMjQpICYgMHgzRikpOworICAgICAgICAgIH0KKyAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTgpICYgMHgzRikpOworICAgICAgICB9ICAgICAKKyAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDEyKSAmIDB4M0YpKTsKKyAgICAgIH0KKyAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpKTsKKyAgICB9CisgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKGMgJiAweDNGKSk7CisgICAgKnQgPSAnXDAnOworICB9CisgIGVsc2UKKyNlbmRpZgorICAgIHNwcmludGYodG1wLCAiJiMlbHU7IiwgYyk7CisgIHJldHVybiBzb2FwX3NlbmQoc29hcCwgdG1wKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3NvYXBfd2NoYXIKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0dXRmOChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjLCBjMSwgYzIsIGMzLCBjNDsKKyAgYyA9IHNvYXAtPmFoZWFkOworICBpZiAoYyA+IDB4RkYpCisgIHsgc29hcC0+YWhlYWQgPSAwOworICAgIHJldHVybiBjOworICB9CithZ2FpbjoKKyAgYyA9IHNvYXBfZ2V0KHNvYXApOworICBpZiAoYyA8IDB4ODAgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19MQVRJTikpCisgICAgcmV0dXJuIGM7CisgIGMxID0gc29hcF9nZXQxKHNvYXApOworICBpZiAoYzEgPCAweDgwKQorICB7IHNvYXBfcmV2Z2V0MShzb2FwKTsgLyogZG9lc24ndCBsb29rIGxpa2UgdGhpcyBpcyBVVEY4ICovCisgICAgcmV0dXJuIGM7CisgIH0KKyAgYzEgJj0gMHgzRjsKKyAgaWYgKGMgPCAweEUwKQorICAgIHJldHVybiAoKHNvYXBfd2NoYXIpKGMgJiAweDFGKSA8PCA2KSB8IGMxOworICBjMiA9IChzb2FwX3djaGFyKXNvYXBfZ2V0MShzb2FwKSAmIDB4M0Y7CisgIGlmIChjID09IDB4RUYgJiYgYzEgPT0gMHgzQiAmJiBjMiA9PSAweDNGKQkvKiBpZ25vcmUgVVRGLTggQk9NICovCisgICAgZ290byBhZ2FpbjsKKyAgaWYgKGMgPCAweEYwKQorICAgIHJldHVybiAoKHNvYXBfd2NoYXIpKGMgJiAweDBGKSA8PCAxMikgfCAoYzEgPDwgNikgfCBjMjsKKyAgYzMgPSAoc29hcF93Y2hhcilzb2FwX2dldDEoc29hcCkgJiAweDNGOworICBpZiAoYyA8IDB4RjgpCisgICAgcmV0dXJuICgoc29hcF93Y2hhcikoYyAmIDB4MDcpIDw8IDE4KSB8IChjMSA8PCAxMikgfCAoYzIgPDwgNikgfCBjMzsKKyAgYzQgPSAoc29hcF93Y2hhcilzb2FwX2dldDEoc29hcCkgJiAweDNGOworICBpZiAoYyA8IDB4RkMpCisgICAgcmV0dXJuICgoc29hcF93Y2hhcikoYyAmIDB4MDMpIDw8IDI0KSB8IChjMSA8PCAxOCkgfCAoYzIgPDwgMTIpIHwgKGMzIDw8IDYpIHwgYzQ7CisgIHJldHVybiAoKHNvYXBfd2NoYXIpKGMgJiAweDAxKSA8PCAzMCkgfCAoYzEgPDwgMjQpIHwgKGMyIDw8IDE4KSB8IChjMyA8PCAxMikgfCAoYzQgPDwgNikgfCAoc29hcF93Y2hhcikoc29hcF9nZXQxKHNvYXApICYgMHgzRik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0aGV4KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzLCBpbnQgbikKK3sgY2hhciBkWzJdOworICByZWdpc3RlciBpbnQgaTsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBpZiAoIShzb2FwLT5kb20tPmRhdGEgPSBzb2FwX3MyaGV4KHNvYXAsIHMsIE5VTEwsIG4pKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2VuZGlmCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgIHsgcmVnaXN0ZXIgaW50IG0gPSAqcysrOworICAgIGRbMF0gPSAoY2hhcikoKG0gPj4gNCkgKyAobSA+IDE1OSA/ICc3JyA6ICcwJykpOworICAgIG0gJj0gMHgwRjsKKyAgICBkWzFdID0gKGNoYXIpKG0gKyAobSA+IDkgPyAnNycgOiAnMCcpKTsKKyAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBkLCAyKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3Vuc2lnbmVkIGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2dldGhleChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50ICpuKQoreworI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IHNvYXAtPmRvbS0+ZGF0YSA9IHNvYXBfc3RyaW5nX2luKHNvYXAsIDAsIC0xLCAtMSk7CisgICAgcmV0dXJuICh1bnNpZ25lZCBjaGFyKilzb2FwX2hleDJzKHNvYXAsIHNvYXAtPmRvbS0+ZGF0YSwgTlVMTCwgMCwgbik7CisgIH0KKyNlbmRpZgorI2lmZGVmIFdJVEhfRkFTVAorICBzb2FwLT5sYWJpZHggPSAwOworICBmb3IgKDs7KQorICB7IHJlZ2lzdGVyIGNoYXIgKnM7CisgICAgcmVnaXN0ZXIgaW50IGksIGs7CisgICAgaWYgKHNvYXBfYXBwZW5kX2xhYihzb2FwLCBOVUxMLCAwKSkKKyAgICAgIHJldHVybiBOVUxMOworICAgIHMgPSBzb2FwLT5sYWJidWYgKyBzb2FwLT5sYWJpZHg7CisgICAgayA9IHNvYXAtPmxhYmxlbiAtIHNvYXAtPmxhYmlkeDsKKyAgICBzb2FwLT5sYWJpZHggPSBzb2FwLT5sYWJsZW47CisgICAgZm9yIChpID0gMDsgaSA8IGs7IGkrKykKKyAgICB7IHJlZ2lzdGVyIGNoYXIgZDEsIGQyOworICAgICAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICAgICAgYyA9IHNvYXBfZ2V0KHNvYXApOworICAgICAgaWYgKHNvYXBfaXN4ZGlnaXQoYykpCisgICAgICB7IGQxID0gKGNoYXIpYzsKKyAgICAgICAgYyA9IHNvYXBfZ2V0KHNvYXApOyAKKwlpZiAoc29hcF9pc3hkaWdpdChjKSkKKyAgICAgICAgICBkMiA9IChjaGFyKWM7CisgICAgICAgIGVsc2UgCisgICAgICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgdW5zaWduZWQgY2hhciAqcDsKKyAgICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgaWYgKG4pCisgICAgICAgICAgKm4gPSAoaW50KShzb2FwLT5sYWJsZW4gLSBrICsgaSk7CisgICAgICAgIHAgPSAodW5zaWduZWQgY2hhciopc29hcF9tYWxsb2Moc29hcCwgc29hcC0+bGFibGVuIC0gayArIGkpOworCWlmIChwKQorCSAgbWVtY3B5KHAsIHNvYXAtPmxhYmJ1Ziwgc29hcC0+bGFibGVuIC0gayArIGkpOworICAgICAgICByZXR1cm4gcDsKKyAgICAgIH0KKyAgICAgICpzKysgPSAoKGQxID49ICdBJyA/IChkMSAmIDB4NykgKyA5IDogZDEgLSAnMCcpIDw8IDQpICsgKGQyID49ICdBJyA/IChkMiAmIDB4NykgKyA5IDogZDIgLSAnMCcpOworICAgIH0KKyAgfQorI2Vsc2UKKyAgaWYgKHNvYXBfbmV3X2Jsb2NrKHNvYXApKQorICAgIHJldHVybiBOVUxMOworICBmb3IgKDs7KQorICB7IHJlZ2lzdGVyIGludCBpOworICAgIHJlZ2lzdGVyIGNoYXIgKnMgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIFNPQVBfQkxLTEVOKTsKKyAgICBpZiAoIXMpCisgICAgeyBzb2FwX2VuZF9ibG9jayhzb2FwKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgU09BUF9CTEtMRU47IGkrKykKKyAgICB7IHJlZ2lzdGVyIGNoYXIgZDEsIGQyOworICAgICAgcmVnaXN0ZXIgc29hcF93Y2hhciBjID0gc29hcF9nZXQoc29hcCk7CisgICAgICBpZiAoc29hcF9pc3hkaWdpdChjKSkKKyAgICAgIHsgZDEgPSAoY2hhciljOworICAgICAgICBjID0gc29hcF9nZXQoc29hcCk7IAorCWlmIChzb2FwX2lzeGRpZ2l0KGMpKQorICAgICAgICAgIGQyID0gKGNoYXIpYzsKKyAgICAgICAgZWxzZSAKKyAgICAgICAgeyBzb2FwX2VuZF9ibG9jayhzb2FwKTsKKwkgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IHVuc2lnbmVkIGNoYXIgKnA7CisgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgIGlmIChuKQorICAgICAgICAgICpuID0gc29hcF9zaXplX2Jsb2NrKHNvYXAsIGkpOworICAgICAgICBwID0gKHVuc2lnbmVkIGNoYXIqKXNvYXBfc2F2ZV9ibG9jayhzb2FwLCBOVUxMLCAwKTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgICB9CisgICAgICAqcysrID0gKChkMSA+PSAnQScgPyAoZDEgJiAweDcpICsgOSA6IGQxIC0gJzAnKSA8PCA0KSArIChkMiA+PSAnQScgPyAoZDIgJiAweDcpICsgOSA6IGQyIC0gJzAnKTsKKyAgICB9CisgIH0KKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dGJhc2U2NChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgdW5zaWduZWQgY2hhciAqcywgaW50IG4pCit7IHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIG07CisgIGNoYXIgZFs0XTsKKyAgaWYgKCFzKQorICAgIHJldHVybiBTT0FQX09LOworI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IGlmICghKHNvYXAtPmRvbS0+ZGF0YSA9IHNvYXBfczJiYXNlNjQoc29hcCwgcywgTlVMTCwgbikpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIHJldHVybiBTT0FQX09LOworICB9CisjZW5kaWYKKyAgZm9yICg7IG4gPiAyOyBuIC09IDMsIHMgKz0gMykKKyAgeyBtID0gc1swXTsKKyAgICBtID0gKG0gPDwgOCkgfCBzWzFdOworICAgIG0gPSAobSA8PCA4KSB8IHNbMl07CisgICAgZm9yIChpID0gNDsgaSA+IDA7IG0gPj49IDYpCisgICAgICBkWy0taV0gPSBzb2FwX2Jhc2U2NG9bbSAmIDB4M0ZdOworICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIGQsIDQpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmIChuID4gMCkKKyAgeyBtID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgbSA9IChtIDw8IDgpIHwgKnMrKzsKKyAgICBmb3IgKDsgaSA8IDM7IGkrKykKKyAgICAgIG0gPDw9IDg7CisgICAgZm9yIChpKys7IGkgPiAwOyBtID4+PSA2KQorICAgICAgZFstLWldID0gc29hcF9iYXNlNjRvW20gJiAweDNGXTsKKyAgICBmb3IgKGkgPSAzOyBpID4gbjsgaS0tKQorICAgICAgZFtpXSA9ICc9JzsKKyAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBkLCA0KSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3Vuc2lnbmVkIGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2dldGJhc2U2NChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50ICpuLCBpbnQgbWFsbG9jX2ZsYWcpCit7IAorI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IHNvYXAtPmRvbS0+ZGF0YSA9IHNvYXBfc3RyaW5nX2luKHNvYXAsIDAsIC0xLCAtMSk7CisgICAgcmV0dXJuICh1bnNpZ25lZCBjaGFyKilzb2FwX2Jhc2U2NDJzKHNvYXAsIHNvYXAtPmRvbS0+ZGF0YSwgTlVMTCwgMCwgbik7CisgIH0KKyNlbmRpZgorI2lmZGVmIFdJVEhfRkFTVAorICBzb2FwLT5sYWJpZHggPSAwOworICBmb3IgKDs7KQorICB7IHJlZ2lzdGVyIGludCBpLCBrOworICAgIHJlZ2lzdGVyIGNoYXIgKnM7CisgICAgaWYgKHNvYXBfYXBwZW5kX2xhYihzb2FwLCBOVUxMLCAyKSkKKyAgICAgIHJldHVybiBOVUxMOworICAgIHMgPSBzb2FwLT5sYWJidWYgKyBzb2FwLT5sYWJpZHg7CisgICAgayA9IHNvYXAtPmxhYmxlbiAtIHNvYXAtPmxhYmlkeDsKKyAgICBzb2FwLT5sYWJpZHggPSAzICogKHNvYXAtPmxhYmxlbiAvIDMpOworICAgIGlmICghcykKKyAgICAgIHJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCBrIC0gMjsgaSArPSAzKQorICAgIHsgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBtID0gMDsKKyAgICAgIHJlZ2lzdGVyIGludCBqID0gMDsKKyAgICAgIGRvCisgICAgICB7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IHNvYXBfZ2V0KHNvYXApOworICAgICAgICBpZiAoYyA9PSAnPScgfHwgYyA8IDApCisgICAgICAgIHsgdW5zaWduZWQgY2hhciAqcDsKKyAgICAgICAgICBzd2l0Y2ggKGopCisgICAgICAgICAgeyBjYXNlIDI6CisgICAgICAgICAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gNCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiAxMCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiAyKSAmIDB4RkYpOworICAgICAgICAgICAgICBpICs9IDI7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChuKQorICAgICAgICAgICAgKm4gPSAoaW50KShzb2FwLT5sYWJsZW4gLSBrICsgaSk7CisgICAgICAgICAgcCA9ICh1bnNpZ25lZCBjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzb2FwLT5sYWJsZW4gLSBrICsgaSk7CisJICBpZiAocCkKKwkgICAgbWVtY3B5KHAsIHNvYXAtPmxhYmJ1Ziwgc29hcC0+bGFibGVuIC0gayArIGkpOworICAgICAgICAgIGlmIChjID49IDApCisgICAgICAgICAgeyB3aGlsZSAoKGludCkoKGMgPSBzb2FwX2dldChzb2FwKSkgIT0gRU9GKSAmJiBjICE9IFNPQVBfTFQgJiYgYyAhPSBTT0FQX1RUKQorICAgICAgICAgICAgICA7CisJICB9CisgICAgICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgfQorICAgICAgICBjIC09ICcrJzsKKyAgICAgICAgaWYgKGMgPj0gMCAmJiBjIDw9IDc5KQorICAgICAgICB7IG0gPSAobSA8PCA2KSArIHNvYXBfYmFzZTY0aVtjXTsKKyAgICAgICAgICBqKys7CisgICAgICAgIH0KKyAgICAgIH0gd2hpbGUgKGogPCA0KTsKKyAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gMTYpICYgMHhGRik7CisgICAgICAqcysrID0gKGNoYXIpKChtID4+IDgpICYgMHhGRik7CisgICAgICAqcysrID0gKGNoYXIpKG0gJiAweEZGKTsKKyAgICB9CisgIH0KKyNlbHNlCisgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgZm9yICg7OykKKyAgeyByZWdpc3RlciBpbnQgaTsKKyAgICByZWdpc3RlciBjaGFyICpzID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCAzICogU09BUF9CTEtMRU4pOyAvKiBtdXN0IGJlIG11bHRpcGxlIG9mIDMgKi8KKyAgICBpZiAoIXMpCisgICAgeyBzb2FwX2VuZF9ibG9jayhzb2FwKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgU09BUF9CTEtMRU47IGkrKykKKyAgICB7IHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbSA9IDA7CisgICAgICByZWdpc3RlciBpbnQgaiA9IDA7CisgICAgICBkbworICAgICAgeyByZWdpc3RlciBzb2FwX3djaGFyIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgICAgICAgaWYgKGMgPT0gJz0nIHx8IGMgPCAwKQorICAgICAgICB7IHVuc2lnbmVkIGNoYXIgKnA7CisgICAgICAgICAgaSAqPSAzOworICAgICAgICAgIHN3aXRjaCAoaikKKyAgICAgICAgICB7IGNhc2UgMjoKKyAgICAgICAgICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiA0KSAmIDB4RkYpOworICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAqcysrID0gKGNoYXIpKChtID4+IDEwKSAmIDB4RkYpOworICAgICAgICAgICAgICAqcysrID0gKGNoYXIpKChtID4+IDIpICYgMHhGRik7CisgICAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG4pCisJICAgICpuID0gKGludClzb2FwX3NpemVfYmxvY2soc29hcCwgaSk7CisgICAgICAgICAgcCA9ICh1bnNpZ25lZCBjaGFyKilzb2FwX3NhdmVfYmxvY2soc29hcCwgTlVMTCwgMCk7CisgICAgICAgICAgaWYgKGMgPj0gMCkKKyAgICAgICAgICB7IHdoaWxlICgoaW50KSgoYyA9IHNvYXBfZ2V0KHNvYXApKSAhPSBFT0YpICYmIGMgIT0gU09BUF9MVCAmJiBjICE9IFNPQVBfVFQpCisgICAgICAgICAgICAgIDsKKwkgIH0KKyAgICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICAgIHJldHVybiBwOworICAgICAgICB9CisgICAgICAgIGMgLT0gJysnOworICAgICAgICBpZiAoYyA+PSAwICYmIGMgPD0gNzkpCisgICAgICAgIHsgbSA9IChtIDw8IDYpICsgc29hcF9iYXNlNjRpW2NdOworICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAoaiA8IDQpOworICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiAxNikgJiAweEZGKTsKKyAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gOCkgJiAweEZGKTsKKyAgICAgICpzKysgPSAoY2hhcikobSAmIDB4RkYpOworICAgIH0KKyAgfQorI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfeG9wX2ZvcndhcmQoc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIGNoYXIgKipwdHIsIGludCAqc2l6ZSwgY2hhciAqKmlkLCBjaGFyICoqdHlwZSwgY2hhciAqKm9wdGlvbnMpCit7IC8qIENoZWNrIE1UT00geG9wOkluY2x1ZGUgZWxlbWVudCAod2l0aGluIGhleC9iYXNlNjRCaW5hcnkpICovCisgIC8qIFRPRE86IHRoaXMgY29kZSB0byBiZSBvYnNvbGV0ZWQgd2l0aCBuZXcgaW1wb3J0L3hvcC5oIGNvbnZlbnRpb25zICovCisgIGludCBib2R5ID0gc29hcC0+Ym9keTsgLyogc2hvdWxkIHNhdmUgdHlwZSB0b28/ICovCisgIGlmICghc29hcF9wZWVrX2VsZW1lbnQoc29hcCkpCisgIHsgaWYgKCFzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgInhvcDpJbmNsdWRlIiwgMCkgJiYgKnNvYXAtPmhyZWYpCisgICAgeyBpZiAoc29hcF9kaW1lX2ZvcndhcmQoc29hcCwgcHRyLCBzaXplLCBpZCwgdHlwZSwgb3B0aW9ucykpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCBOVUxMKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBzb2FwLT5ib2R5ID0gYm9keTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9kaW1lX2ZvcndhcmQoc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIGNoYXIgKipwdHIsIGludCAqc2l6ZSwgY2hhciAqKmlkLCBjaGFyICoqdHlwZSwgY2hhciAqKm9wdGlvbnMpCit7IHN0cnVjdCBzb2FwX3hsaXN0ICp4cCA9IChzdHJ1Y3Qgc29hcF94bGlzdCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX3hsaXN0KSk7CisgICpwdHIgPSBOVUxMOworICAqc2l6ZSA9IDA7CisgICppZCA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPmhyZWYpOworICAqdHlwZSA9IE5VTEw7CisgICpvcHRpb25zID0gTlVMTDsKKyAgaWYgKCF4cCkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgeHAtPm5leHQgPSBzb2FwLT54bGlzdDsKKyAgeHAtPnB0ciA9IHB0cjsKKyAgeHAtPnNpemUgPSBzaXplOworICB4cC0+aWQgPSAqaWQ7CisgIHhwLT50eXBlID0gdHlwZTsKKyAgeHAtPm9wdGlvbnMgPSBvcHRpb25zOworICBzb2FwLT54bGlzdCA9IHhwOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3N0cmR1cChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcykKK3sgY2hhciAqdCA9IE5VTEw7CisgIGlmIChzICYmICh0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihzKSArIDEpKSkKKyAgICBzdHJjcHkodCwgcyk7CisgIHJldHVybiB0OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX25ld19ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfYmxpc3QgKnA7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTmV3IGJsb2NrIHNlcXVlbmNlIChwcmV2PSVwKVxuIiwgc29hcC0+Ymxpc3QpKTsKKyAgaWYgKCEocCA9IChzdHJ1Y3Qgc29hcF9ibGlzdCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2JsaXN0KSkpKQorICAgIHJldHVybiBTT0FQX0VPTTsgICAKKyAgcC0+bmV4dCA9IHNvYXAtPmJsaXN0OyAKKyAgcC0+cHRyID0gTlVMTDsKKyAgcC0+c2l6ZSA9IDA7CisgIHNvYXAtPmJsaXN0ID0gcDsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkKgorU09BUF9GTUFDMgorc29hcF9wdXNoX2Jsb2NrKHN0cnVjdCBzb2FwICpzb2FwLCBzaXplX3QgbikKK3sgY2hhciAqcDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQdXNoIGJsb2NrIG9mICV1IGJ5dGVzICgldSBieXRlcyB0b3RhbClcbiIsICh1bnNpZ25lZCBpbnQpbiwgKHVuc2lnbmVkIGludClzb2FwLT5ibGlzdC0+c2l6ZSArICh1bnNpZ25lZCBpbnQpbikpOworICBpZiAoIShwID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIG4gKyBzaXplb2YoY2hhciopICsgc2l6ZW9mKHNpemVfdCkpKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHJldHVybiBOVUxMOworICB9CisgICooY2hhcioqKXAgPSBzb2FwLT5ibGlzdC0+cHRyOworICAqKHNpemVfdCopKHAgKyBzaXplb2YoY2hhciopKSA9IG47CisgIHNvYXAtPmJsaXN0LT5wdHIgPSBwOworICBzb2FwLT5ibGlzdC0+c2l6ZSArPSBuOworICByZXR1cm4gcCArIHNpemVvZihjaGFyKikgKyBzaXplb2Yoc2l6ZV90KTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfcG9wX2Jsb2NrKHN0cnVjdCBzb2FwICpzb2FwKQoreyBjaGFyICpwOworICBpZiAoIXNvYXAtPmJsaXN0LT5wdHIpCisgICAgcmV0dXJuOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlBvcCBibG9ja1xuIikpOworICBwID0gc29hcC0+Ymxpc3QtPnB0cjsKKyAgc29hcC0+Ymxpc3QtPnNpemUgLT0gKihzaXplX3QqKShwICsgc2l6ZW9mKGNoYXIqKSk7CisgIHNvYXAtPmJsaXN0LT5wdHIgPSAqKGNoYXIqKilwOworICBTT0FQX0ZSRUUoc29hcCwgcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQKK3NvYXBfdXBkYXRlX3B0cnMoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnN0YXJ0LCBjaGFyICplbmQsIGNoYXIgKnAxLCBjaGFyICpwMikKK3sgaW50IGk7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZmxpc3QgKmZwOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICByZWdpc3RlciBzdHJ1Y3Qgc29hcF94bGlzdCAqeHA7CisjZW5kaWYKKyAgcmVnaXN0ZXIgdm9pZCAqcCwgKipxOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9JREhBU0g7IGkrKykKKyAgeyBmb3IgKGlwID0gc29hcC0+aWh0W2ldOyBpcDsgaXAgPSBpcC0+bmV4dCkKKyAgICB7IGlmIChpcC0+cHRyICYmIChjaGFyKilpcC0+cHRyID49IHN0YXJ0ICYmIChjaGFyKilpcC0+cHRyIDwgZW5kKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVwZGF0ZSBpZD0nJXMnICVwIC0+ICVwXG4iLCBpcC0+aWQsIGlwLT5wdHIsIChjaGFyKilpcC0+cHRyICsgKHAxLXAyKSkpOworICAgICAgICBpcC0+cHRyID0gKGNoYXIqKWlwLT5wdHIgKyAocDEtcDIpOworICAgICAgfQorICAgICAgZm9yIChxID0gJmlwLT5saW5rOyBxOyBxID0gKHZvaWQqKilwKQorICAgICAgeyBwID0gKnE7CisgICAgICAgIGlmIChwICYmIChjaGFyKilwID49IHN0YXJ0ICYmIChjaGFyKilwIDwgZW5kKQorICAgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTGluayB1cGRhdGUgaWQ9JyVzJyAlcFxuIiwgaXAtPmlkLCBwKSk7CisgICAgICAgICAgKnEgPSAoY2hhciopcCArIChwMS1wMik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZvciAocSA9ICZpcC0+Y29weTsgcTsgcSA9ICh2b2lkKiopcCkKKyAgICAgIHsgcCA9ICpxOworICAgICAgICBpZiAocCAmJiAoY2hhciopcCA+PSBzdGFydCAmJiAoY2hhciopcCA8IGVuZCkKKyAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHkgY2hhaW4gdXBkYXRlIGlkPSclcycgJXBcbiIsIGlwLT5pZCwgcCkpOworICAgICAgICAgICpxID0gKGNoYXIqKXAgKyAocDEtcDIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBmb3IgKGZwID0gaXAtPmZsaXN0OyBmcDsgZnAgPSBmcC0+bmV4dCkKKyAgICAgIHsgaWYgKChjaGFyKilmcC0+cHRyID49IHN0YXJ0ICYmIChjaGFyKilmcC0+cHRyIDwgZW5kKQorICAgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weSBsaXN0IHVwZGF0ZSBpZD0nJXMnICVwXG4iLCBpcC0+aWQsIGZwKSk7CisgICAgICAgICAgZnAtPnB0ciA9IChjaGFyKilmcC0+cHRyICsgKHAxLXAyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBmb3IgKHhwID0gc29hcC0+eGxpc3Q7IHhwOyB4cCA9IHhwLT5uZXh0KQorICB7IGlmICh4cC0+cHRyICYmIChjaGFyKil4cC0+cHRyID49IHN0YXJ0ICYmIChjaGFyKil4cC0+cHRyIDwgZW5kKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVcGRhdGUgaWQ9JyVzJyAlcCAtPiAlcFxuIiwgeHAtPmlkP3hwLT5pZDoiIiwgeHAtPnB0ciwgKGNoYXIqKXhwLT5wdHIgKyAocDEtcDIpKSk7CisgICAgICB4cC0+cHRyID0gKHVuc2lnbmVkIGNoYXIqKikoKGNoYXIqKXhwLT5wdHIgKyAocDEtcDIpKTsKKyAgICAgIHhwLT5zaXplID0gKGludCopKChjaGFyKil4cC0+c2l6ZSArIChwMS1wMikpOworICAgICAgeHAtPnR5cGUgPSAoY2hhcioqKSgoY2hhciopeHAtPnR5cGUgKyAocDEtcDIpKTsKKyAgICAgIHhwLT5vcHRpb25zID0gKGNoYXIqKikoKGNoYXIqKXhwLT5vcHRpb25zICsgKHAxLXAyKSk7CisgICAgfQorICB9CisjZW5kaWYKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NvYXBfaGFzX2NvcGllcyhzdHJ1Y3Qgc29hcCAqc29hcCwgcmVnaXN0ZXIgY29uc3QgY2hhciAqc3RhcnQsIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKmVuZCkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZmxpc3QgKmZwOworICByZWdpc3RlciBjb25zdCBjaGFyICpwOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9JREhBU0g7IGkrKykKKyAgeyBmb3IgKGlwID0gc29hcC0+aWh0W2ldOyBpcDsgaXAgPSBpcC0+bmV4dCkKKyAgICB7IGZvciAocCA9IChjb25zdCBjaGFyKilpcC0+Y29weTsgcDsgcCA9ICooY29uc3QgY2hhcioqKXApCisgICAgICAgIGlmIChwID49IHN0YXJ0ICYmIHAgPCBlbmQpCisgICAgICAgICAgcmV0dXJuIFNPQVBfRVJSOworICAgICAgZm9yIChmcCA9IGlwLT5mbGlzdDsgZnA7IGZwID0gZnAtPm5leHQpCisgICAgICAgIGlmICgoY29uc3QgY2hhciopZnAtPnB0ciA+PSBzdGFydCAmJiAoY29uc3QgY2hhciopZnAtPnB0ciA8IGVuZCkKKwkgIHJldHVybiBTT0FQX0VSUjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVzb2x2ZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZmxpc3QgKmZwOworICBzaG9ydCBmbGFnOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc29sdmluZyBmb3J3YXJkZWQgZGF0YVxuIikpOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9JREhBU0g7IGkrKykKKyAgeyBmb3IgKGlwID0gc29hcC0+aWh0W2ldOyBpcDsgaXAgPSBpcC0+bmV4dCkKKyAgICB7IGlmIChpcC0+cHRyKQorICAgICAgeyByZWdpc3RlciB2b2lkICpwLCAqKnEsICpyOworICAgICAgICBxID0gKHZvaWQqKilpcC0+bGluazsKKyAgICAgICAgaXAtPmxpbmsgPSBOVUxMOworICAgICAgICByID0gaXAtPnB0cjsKKyAgICAgICAgREJHTE9HKFRFU1QsIGlmIChxKSBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVHJhdmVyc2luZyBsaW5rIGNoYWluIHRvIHJlc29sdmUgaWQ9JyVzJ1xuIiwgaXAtPmlkKSk7CisgICAgICAgIHdoaWxlIChxKQorICAgICAgICB7IHAgPSAqcTsKKyAgICAgICAgICAqcSA9IHI7CisgICAgICAgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIi4uLiBsaW5rICVwIC0+ICVwXG4iLCBxLCByKSk7CisgICAgICAgICAgcSA9ICh2b2lkKiopcDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSBpZiAoKmlwLT5pZCA9PSAnIycpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTWlzc2luZyBkYXRhIGZvciBpZD0nJXMnXG4iLCBpcC0+aWQpKTsKKyAgICAgICAgc3RyY3B5KHNvYXAtPmlkLCBpcC0+aWQgKyAxKTsKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9NSVNTSU5HX0lEOworICAgICAgfQorICAgIH0KKyAgfQorICBkbworICB7IGZsYWcgPSAwOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x1dGlvbiBwaGFzZVxuIikpOworICAgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0lESEFTSDsgaSsrKQorICAgIHsgZm9yIChpcCA9IHNvYXAtPmlodFtpXTsgaXA7IGlwID0gaXAtPm5leHQpCisgICAgICB7IGlmIChpcC0+cHRyICYmICFzb2FwX2hhc19jb3BpZXMoc29hcCwgKGNvbnN0IGNoYXIqKWlwLT5wdHIsIChjb25zdCBjaGFyKilpcC0+cHRyICsgaXAtPnNpemUpKQorICAgICAgICB7IGlmIChpcC0+Y29weSkKKyAgICAgICAgICB7IHJlZ2lzdGVyIHZvaWQgKnAsICoqcSA9ICh2b2lkKiopaXAtPmNvcHk7CisgICAgICAgICAgICBEQkdMT0coVEVTVCwgaWYgKHEpIFNPQVBfTUVTU0FHRShmZGVidWcsICJUcmF2ZXJzaW5nIGNvcHkgY2hhaW4gdG8gcmVzb2x2ZSBpZD0nJXMnXG4iLCBpcC0+aWQpKTsKKyAgICAgICAgICAgIGlwLT5jb3B5ID0gTlVMTDsKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiLi4uIGNvcHkgJXAgLT4gJXAgKCV1IGJ5dGVzKVxuIiwgaXAtPnB0ciwgcSwgKHVuc2lnbmVkIGludClpcC0+c2l6ZSkpOworCSAgICAgIHAgPSAqcTsKKyAgICAgICAgICAgICAgbWVtY3B5KHEsIGlwLT5wdHIsIGlwLT5zaXplKTsKKyAgICAgICAgICAgICAgcSA9ICh2b2lkKiopcDsKKyAgICAgICAgICAgIH0gd2hpbGUgKHEpOworCSAgICBmbGFnID0gMTsKKwkgIH0KKyAgICAgICAgICBmb3IgKGZwID0gaXAtPmZsaXN0OyBmcDsgZnAgPSBpcC0+Zmxpc3QpCisgICAgICAgICAgeyByZWdpc3RlciB1bnNpZ25lZCBpbnQgayA9IGZwLT5sZXZlbDsKKwkgICAgcmVnaXN0ZXIgdm9pZCAqcCA9IGlwLT5wdHI7CisgICAgICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc29sdmluZyBmb3J3YXJkZWQgZGF0YSB0eXBlPSVkIGxvY2F0aW9uPSVwIGxldmVsPSV1LCV1IGlkPSclcydcbiIsIGlwLT50eXBlLCBwLCBpcC0+bGV2ZWwsIGZwLT5sZXZlbCwgaXAtPmlkKSk7CisJICAgIHdoaWxlIChpcC0+bGV2ZWwgPCBrKQorICAgICAgICAgICAgeyByZWdpc3RlciB2b2lkICoqcSA9ICh2b2lkKiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHZvaWQqKSk7ICAKKwkgICAgICBpZiAoIXEpCisJICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisJICAgICAgKnEgPSBwOworICAgICAgICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlc2NlbmRpbmcgb25lIGxldmVsLCBuZXcgbG9jYXRpb249JXAgaG9sZHM9JXAuLi5cbiIsIHEsICpxKSk7CisgICAgICAgICAgICAgIHAgPSAodm9pZCopcTsKKyAgICAgICAgICAgICAgay0tOworICAgICAgICAgICAgfQorCSAgICBpZiAoZnAtPmZjb3B5KQorCSAgICAgIGZwLT5mY29weShzb2FwLCBpcC0+dHlwZSwgZnAtPnR5cGUsIGZwLT5wdHIsIGZwLT5sZW4sIHAsIGlwLT5zaXplKTsKKwkgICAgZWxzZQorCSAgICAgIHNvYXBfZmNvcHkoc29hcCwgaXAtPnR5cGUsIGZwLT50eXBlLCBmcC0+cHRyLCBmcC0+bGVuLCBwLCBpcC0+c2l6ZSk7CisJICAgIGlwLT5mbGlzdCA9IGZwLT5uZXh0OworCSAgICBTT0FQX0ZSRUUoc29hcCwgZnApOworCSAgICBmbGFnID0gMTsKKwkgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSB3aGlsZSAoZmxhZyk7CisjaWZkZWYgU09BUF9ERUJVRworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9JREhBU0g7IGkrKykKKyAgeyBmb3IgKGlwID0gc29hcC0+aWh0W2ldOyBpcDsgaXAgPSBpcC0+bmV4dCkKKyAgICB7IGlmIChpcC0+Y29weSB8fCBpcC0+Zmxpc3QpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x1dGlvbiBlcnJvcjogZm9yd2FyZGVkIGRhdGEgZm9yIGlkPSclcycgY291bGQgbm90IGJlIHByb3BhZ2F0ZWQsIHBsZWFzZSByZXBvcnQgdGhpcyBwcm9ibGVtIHRvIHRoZSBkZXZlbG9wZXJzXG4iLCBpcC0+aWQpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyNlbmRpZgorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc29sdXRpb24gZG9uZVxuIikpOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc2l6ZV90CitTT0FQX0ZNQUMyCitzb2FwX3NpemVfYmxvY2soc3RydWN0IHNvYXAgKnNvYXAsIHNpemVfdCBuKQoreyBpZiAoc29hcC0+Ymxpc3QtPnB0cikKKyAgeyBzb2FwLT5ibGlzdC0+c2l6ZSAtPSAqKHNpemVfdCopKHNvYXAtPmJsaXN0LT5wdHIgKyBzaXplb2YoY2hhciopKSAtIG47CisgICAgKihzaXplX3QqKShzb2FwLT5ibGlzdC0+cHRyICsgc2l6ZW9mKGNoYXIqKSkgPSBuOworICB9CisgIHJldHVybiBzb2FwLT5ibGlzdC0+c2l6ZTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2ZpcnN0X2Jsb2NrKHN0cnVjdCBzb2FwICpzb2FwKQoreyBjaGFyICpwLCAqcSwgKnI7CisgIHAgPSBzb2FwLT5ibGlzdC0+cHRyOworICBpZiAoIXApCisgICAgcmV0dXJuIE5VTEw7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRmlyc3QgYmxvY2tcbiIpKTsKKyAgciA9IE5VTEw7CisgIGRvCisgIHsgcSA9ICooY2hhcioqKXA7CisgICAgKihjaGFyKiopcCA9IHI7CisgICAgciA9IHA7CisgICAgcCA9IHE7CisgIH0gd2hpbGUgKHApOworICBzb2FwLT5ibGlzdC0+cHRyID0gcjsKKyAgcmV0dXJuIHIgKyBzaXplb2YoY2hhciopICsgc2l6ZW9mKHNpemVfdCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjaGFyKgorU09BUF9GTUFDMgorc29hcF9uZXh0X2Jsb2NrKHN0cnVjdCBzb2FwICpzb2FwKQoreyBjaGFyICpwOworICBwID0gc29hcC0+Ymxpc3QtPnB0cjsKKyAgaWYgKHApCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJOZXh0IGJsb2NrXG4iKSk7CisgICAgc29hcC0+Ymxpc3QtPnB0ciA9ICooY2hhcioqKXA7CisgICAgU09BUF9GUkVFKHNvYXAsIHApOworICAgIGlmIChzb2FwLT5ibGlzdC0+cHRyKQorICAgICAgcmV0dXJuIHNvYXAtPmJsaXN0LT5wdHIgKyBzaXplb2YoY2hhciopICsgc2l6ZW9mKHNpemVfdCk7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzaXplX3QKK1NPQVBfRk1BQzIKK3NvYXBfYmxvY2tfc2l6ZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmV0dXJuICooc2l6ZV90Kikoc29hcC0+Ymxpc3QtPnB0ciArIHNpemVvZihjaGFyKikpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9lbmRfYmxvY2soc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX2JsaXN0ICpicDsKKyAgY2hhciAqcCwgKnE7CisgIGJwID0gc29hcC0+Ymxpc3Q7CisgIGlmIChicCkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBvZiBibG9jayBzZXF1ZW5jZSwgZnJlZSBhbGwgcmVtYWluaW5nIGJsb2Nrc1xuIikpOworICAgIGZvciAocCA9IGJwLT5wdHI7IHA7IHAgPSBxKQorICAgIHsgcSA9ICooY2hhcioqKXA7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgcCk7CisgICAgfQorICAgIHNvYXAtPmJsaXN0ID0gYnAtPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIGJwKTsKKyAgfQorICBEQkdMT0coVEVTVCwgaWYgKHNvYXAtPmJsaXN0KSBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzdG9yZSBwcmV2aW91cyBibG9jayBzZXF1ZW5jZVxuIikpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfc2F2ZV9ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqcCwgaW50IGZsYWcpCit7IHJlZ2lzdGVyIHNpemVfdCBuOworICByZWdpc3RlciBjaGFyICpxLCAqczsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTYXZlIGFsbCBibG9ja3MgaW4gY29udGlndW91cyBtZW1vcnkgc3BhY2Ugb2YgJXUgYnl0ZXMgKCVwLT4lcClcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+Ymxpc3QtPnNpemUsIHNvYXAtPmJsaXN0LT5wdHIsIHApKTsKKyAgaWYgKHNvYXAtPmJsaXN0LT5zaXplKQorICB7IGlmICghcCkKKyAgICAgIHAgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc29hcC0+Ymxpc3QtPnNpemUpOworICAgIGlmIChwKQorICAgIHsgZm9yIChzID0gcCwgcSA9IHNvYXBfZmlyc3RfYmxvY2soc29hcCk7IHE7IHEgPSBzb2FwX25leHRfYmxvY2soc29hcCkpCisgICAgICB7IG4gPSBzb2FwX2Jsb2NrX3NpemUoc29hcCk7CisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICAgICAgICBpZiAoZmxhZykKKwkgIHNvYXBfdXBkYXRlX3B0cnMoc29hcCwgcSwgcSArIG4sIHMsIHEpOworI2VuZGlmCisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weSAldSBieXRlcyBmcm9tICVwIHRvICVwXG4iLCAodW5zaWduZWQgaW50KW4sIHEsIHMpKTsKKyAgICAgICAgbWVtY3B5KHMsIHEsIG4pOworICAgICAgICBzICs9IG47CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgIH0KKyAgc29hcF9lbmRfYmxvY2soc29hcCk7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3B1dHNpemUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBzaXplKQoreyByZXR1cm4gc29hcF9wdXRzaXplcyhzb2FwLCB0eXBlLCAmc2l6ZSwgMSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfcHV0c2l6ZXMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGludCAqc2l6ZSwgaW50IGRpbSkKK3sgcmV0dXJuIHNvYXBfcHV0c2l6ZXNvZmZzZXRzKHNvYXAsIHR5cGUsIHNpemUsIE5VTEwsIGRpbSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfcHV0c2l6ZXNvZmZzZXRzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBpbnQgKnNpemUsIGNvbnN0IGludCAqb2Zmc2V0LCBpbnQgZGltKQoreyBpbnQgaTsKKyAgaWYgKCF0eXBlKQorICAgIHJldHVybiBOVUxMOworICBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICB7IHNwcmludGYoc29hcC0+dHlwZSwgIiVzWyVkIiwgdHlwZSwgc2l6ZVswXSk7CisgICAgZm9yIChpID0gMTsgaSA8IGRpbTsgaSsrKQorICAgICAgc3ByaW50Zihzb2FwLT50eXBlICsgc3RybGVuKHNvYXAtPnR5cGUpLCAiICVkIiwgc2l6ZVtpXSk7CisgIH0KKyAgZWxzZQorICB7IGlmIChvZmZzZXQpCisgICAgeyBzcHJpbnRmKHNvYXAtPnR5cGUsICIlc1slZCIsIHR5cGUsIHNpemVbMF0gKyBvZmZzZXRbMF0pOworICAgICAgZm9yIChpID0gMTsgaSA8IGRpbTsgaSsrKQorICAgICAgICBzcHJpbnRmKHNvYXAtPnR5cGUgKyBzdHJsZW4oc29hcC0+dHlwZSksICIsJWQiLCBzaXplW2ldICsgb2Zmc2V0W2ldKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgc3ByaW50Zihzb2FwLT50eXBlLCAiJXNbJWQiLCB0eXBlLCBzaXplWzBdKTsKKyAgICAgIGZvciAoaSA9IDE7IGkgPCBkaW07IGkrKykKKyAgICAgICAgc3ByaW50Zihzb2FwLT50eXBlICsgc3RybGVuKHNvYXAtPnR5cGUpLCAiLCVkIiwgc2l6ZVtpXSk7CisgICAgfQorICAgIHN0cmNhdChzb2FwLT50eXBlLCAiXSIpOworICB9CisgIHJldHVybiBzb2FwLT50eXBlOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3B1dG9mZnNldChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG9mZnNldCkKK3sgcmV0dXJuIHNvYXBfcHV0b2Zmc2V0cyhzb2FwLCAmb2Zmc2V0LCAxKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9wdXRvZmZzZXRzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBpbnQgKm9mZnNldCwgaW50IGRpbSkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHNwcmludGYoc29hcC0+YXJyYXlPZmZzZXQsICJbJWQiLCBvZmZzZXRbMF0pOworICBmb3IgKGkgPSAxOyBpIDwgZGltOyBpKyspCisgICAgc3ByaW50Zihzb2FwLT5hcnJheU9mZnNldCArIHN0cmxlbihzb2FwLT5hcnJheU9mZnNldCksICIsJWQiLCBvZmZzZXRbaV0pOworICBzdHJjYXQoc29hcC0+YXJyYXlPZmZzZXQsICJdIik7CisgIHJldHVybiBzb2FwLT5hcnJheU9mZnNldDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zaXplKGNvbnN0IGludCAqc2l6ZSwgaW50IGRpbSkKK3sgcmVnaXN0ZXIgaW50IGksIG4gPSBzaXplWzBdOworICBmb3IgKGkgPSAxOyBpIDwgZGltOyBpKyspCisgICAgbiAqPSBzaXplW2ldOworICByZXR1cm4gbjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRvZmZzZXRzKGNvbnN0IGNoYXIgKmF0dHIsIGNvbnN0IGludCAqc2l6ZSwgaW50ICpvZmZzZXQsIGludCBkaW0pCit7IHJlZ2lzdGVyIGludCBpLCBqID0gMDsKKyAgaWYgKG9mZnNldCkKKyAgICBmb3IgKGkgPSAwOyBpIDwgZGltICYmIGF0dHIgJiYgKmF0dHI7IGkrKykKKyAgICB7IGF0dHIrKzsKKyAgICAgIGogKj0gc2l6ZVtpXTsKKyAgICAgIGogKz0gb2Zmc2V0W2ldID0gKGludClhdG9sKGF0dHIpOworICAgICAgYXR0ciA9IHN0cmNocihhdHRyLCAnLCcpOworICAgIH0KKyAgZWxzZQorICAgIGZvciAoaSA9IDA7IGkgPCBkaW0gJiYgYXR0ciAmJiAqYXR0cjsgaSsrKQorICAgIHsgYXR0cisrOworICAgICAgaiAqPSBzaXplW2ldOworICAgICAgaiArPSAoaW50KWF0b2woYXR0cik7CisgICAgICBhdHRyID0gc3RyY2hyKGF0dHIsICcsJyk7CisgICAgfQorICByZXR1cm4gajsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRzaXplKGNvbnN0IGNoYXIgKmF0dHIxLCBjb25zdCBjaGFyICphdHRyMiwgaW50ICpqKQoreyByZWdpc3RlciBpbnQgbiwgazsKKyAgY2hhciAqczsKKyAgKmogPSAwOworICBpZiAoISphdHRyMSkKKyAgICByZXR1cm4gLTE7CisgIGlmICgqYXR0cjEgPT0gJ1snKQorICAgIGF0dHIxKys7CisgIG4gPSAxOworICBmb3IgKDs7KQorICB7IGsgPSAoaW50KXNvYXBfc3RydG9sKGF0dHIxLCAmcywgMTApOworICAgIG4gKj0gazsKKyAgICBpZiAoayA8IDAgfHwgbiA+IFNPQVBfTUFYQVJSQVlTSVpFIHx8IHMgPT0gYXR0cjEpCisgICAgICByZXR1cm4gLTE7CisgICAgYXR0cjEgPSBzdHJjaHIocywgJywnKTsKKyAgICBpZiAoIWF0dHIxKQorICAgICAgYXR0cjEgPSBzdHJjaHIocywgJyAnKTsKKyAgICBpZiAoYXR0cjIgJiYgKmF0dHIyKQorICAgIHsgYXR0cjIrKzsKKyAgICAgICpqICo9IGs7CisgICAgICBrID0gKGludClzb2FwX3N0cnRvbChhdHRyMiwgJnMsIDEwKTsKKyAgICAgICpqICs9IGs7CisgICAgICBpZiAoayA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGF0dHIyID0gczsKKyAgICB9CisgICAgaWYgKCFhdHRyMSkKKyAgICAgIGJyZWFrOworICAgIGF0dHIxKys7CisgIH0KKyAgcmV0dXJuIG4gLSAqajsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRzaXplcyhjb25zdCBjaGFyICphdHRyLCBpbnQgKnNpemUsIGludCBkaW0pCit7IHJlZ2lzdGVyIGludCBpLCBrLCBuOworICBpZiAoISphdHRyKQorICAgIHJldHVybiAtMTsKKyAgaSA9IHN0cmxlbihhdHRyKTsKKyAgbiA9IDE7CisgIGRvCisgIHsgZm9yIChpID0gaS0xOyBpID49IDA7IGktLSkKKyAgICAgIGlmIChhdHRyW2ldID09ICdbJyB8fCBhdHRyW2ldID09ICcsJyB8fCBhdHRyW2ldID09ICcgJykKKyAgICAgICAgYnJlYWs7CisgICAgayA9IChpbnQpYXRvbChhdHRyICsgaSArIDEpOworICAgIG4gKj0gc2l6ZVstLWRpbV0gPSBrOworICAgIGlmIChrIDwgMCB8fCBuID4gU09BUF9NQVhBUlJBWVNJWkUpCisgICAgICByZXR1cm4gLTE7CisgIH0gd2hpbGUgKGkgPj0gMCAmJiBhdHRyW2ldICE9ICdbJyk7CisgIHJldHVybiBuOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldHBvc2l0aW9uKGNvbnN0IGNoYXIgKmF0dHIsIGludCAqcG9zKQoreyByZWdpc3RlciBpbnQgaSwgbjsKKyAgaWYgKCEqYXR0cikKKyAgICByZXR1cm4gLTE7CisgIG4gPSAwOworICBpID0gMTsKKyAgZG8KKyAgeyBwb3NbbisrXSA9IChpbnQpYXRvbChhdHRyICsgaSk7CisgICAgd2hpbGUgKGF0dHJbaV0gJiYgYXR0cltpXSAhPSAnLCcgJiYgYXR0cltpXSAhPSAnXScpCisgICAgICBpKys7CisgICAgaWYgKGF0dHJbaV0gPT0gJywnKQorICAgICAgaSsrOworICB9IHdoaWxlIChuIDwgU09BUF9NQVhESU1TICYmIGF0dHJbaV0gJiYgYXR0cltpXSAhPSAnXScpOworICByZXR1cm4gbjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXNoX25hbWVzcGFjZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKm5zKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnA7CisgIHJlZ2lzdGVyIHN0cnVjdCBOYW1lc3BhY2UgKnA7CisgIHJlZ2lzdGVyIHNob3J0IGkgPSAtMTsKKyAgcmVnaXN0ZXIgc2l6ZV90IG4sIGs7CisgIG4gPSBzdHJsZW4oaWQpOworICBrID0gc3RybGVuKG5zKSArIDE7CisgIHAgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzOworICBpZiAocCkKKyAgeyBmb3IgKGkgPSAwOyBwLT5pZDsgcCsrLCBpKyspCisgICAgeyBpZiAocC0+bnMgJiYgIXN0cmNtcChucywgcC0+bnMpKQorICAgICAgeyBpZiAocC0+b3V0KQorICAgICAgICB7IFNPQVBfRlJFRShzb2FwLCBwLT5vdXQpOworICAgICAgICAgIHAtPm91dCA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAocC0+b3V0KQorICAgICAgeyBpZiAoIXN0cmNtcChucywgcC0+b3V0KSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHAtPmluKQorICAgICAgeyBpZiAoIXNvYXBfdGFnX2NtcChucywgcC0+aW4pKQorICAgICAgICB7IGlmICgocC0+b3V0ID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIGspKSkKKyAgICAgICAgICAgIHN0cmNweShwLT5vdXQsIG5zKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAoIXAgfHwgIXAtPmlkKQorICAgICAgaSA9IC0xOworICB9CisgIGlmIChpID49IDApCisgICAgayA9IDA7CisgIG5wID0gKHN0cnVjdCBzb2FwX25saXN0KilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfbmxpc3QpICsgbiArIGspOworICBpZiAoIW5wKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICBucC0+bmV4dCA9IHNvYXAtPm5saXN0OworICBzb2FwLT5ubGlzdCA9IG5wOworICBucC0+bGV2ZWwgPSBzb2FwLT5sZXZlbDsKKyAgbnAtPmluZGV4ID0gaTsKKyAgc3RyY3B5KG5wLT5pZCwgaWQpOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlB1c2ggbmFtZXNwYWNlIGJpbmRpbmcgKGxldmVsPSV1KSAnJXMnICclcydcbiIsIHNvYXAtPmxldmVsLCBpZCwgbnMpKTsKKyAgaWYgKGkgPCAwKQorICB7IG5wLT5ucyA9IG5wLT5pZCArIG4gKyAxOworICAgIHN0cmNweShucC0+bnMsIG5zKTsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlB1c2ggTk9UIE9LOiBubyBtYXRjaCBmb3VuZCBmb3IgJyVzJyBpbiBuYW1lc3BhY2UgbWFwcGluZyB0YWJsZSAoYWRkZWQgdG8gc3RhY2sgYW55d2F5KVxuIiwgbnMpKTsKKyAgfQorICBlbHNlCisgIHsgbnAtPm5zID0gTlVMTDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlB1c2ggT0sgKCclcycgbWF0Y2hlcyAnJXMnIGluIG5hbWVzcGFjZSB0YWJsZSlcbiIsIGlkLCBwLT5pZCkpOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9wb3BfbmFtZXNwYWNlKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnA7CisgIHdoaWxlIChzb2FwLT5ubGlzdCAmJiBzb2FwLT5ubGlzdC0+bGV2ZWwgPj0gc29hcC0+bGV2ZWwpCisgIHsgbnAgPSBzb2FwLT5ubGlzdC0+bmV4dDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlBvcHBlZCBuYW1lc3BhY2UgYmluZGluZyAobGV2ZWw9JXUpICclcydcbiIsIHNvYXAtPmxldmVsLCBzb2FwLT5ubGlzdC0+aWQpKTsKKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+bmxpc3QpOworICAgIHNvYXAtPm5saXN0ID0gbnA7CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9tYXRjaF9uYW1lc3BhY2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkMSwgY29uc3QgY2hhciAqaWQyLCBpbnQgbjEsIGludCBuMikgCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucCA9IHNvYXAtPm5saXN0OworICB3aGlsZSAobnAgJiYgKHN0cm5jbXAobnAtPmlkLCBpZDEsIG4xKSB8fCBucC0+aWRbbjFdKSkKKyAgICBucCA9IG5wLT5uZXh0OworICBpZiAobnApCisgIHsgaWYgKG5wLT5pbmRleCA8IDAKKyAgICAgfHwgKHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbbnAtPmluZGV4XS5pZAorICAgICAgJiYgKHN0cm5jbXAoc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tucC0+aW5kZXhdLmlkLCBpZDIsIG4yKQorICAgICAgIHx8IHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbbnAtPmluZGV4XS5pZFtuMl0pKSkKKyAgICAgIHJldHVybiBTT0FQX05BTUVTUEFDRTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICBpZiAobjEgPT0gMyAmJiBuMSA9PSBuMiAmJiAhc3RyY21wKGlkMSwgInhtbCIpICYmICFzdHJjbXAoaWQxLCBpZDIpKQorICAgIHJldHVybiBTT0FQX09LOworICByZXR1cm4gU09BUF9TWU5UQVhfRVJST1I7IAorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfY3VycmVudF9uYW1lc3BhY2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZykKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wOworICByZWdpc3RlciBjb25zdCBjaGFyICpzOworICBucCA9IHNvYXAtPm5saXN0OworICBpZiAoIShzID0gc3RyY2hyKHRhZywgJzonKSkpCisgIHsgd2hpbGUgKG5wICYmICpucC0+aWQpIC8qIGZpbmQgZGVmYXVsdCBuYW1lc3BhY2UsIGlmIHByZXNlbnQgKi8KKyAgICAgIG5wID0gbnAtPm5leHQ7CisgIH0KKyAgZWxzZQorICB7IHdoaWxlIChucCAmJiAoc3RybmNtcChucC0+aWQsIHRhZywgcyAtIHRhZykgfHwgbnAtPmlkW3MgLSB0YWddKSkKKyAgICAgIG5wID0gbnAtPm5leHQ7CisgICAgaWYgKCFucCkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9OQU1FU1BBQ0U7CisgIH0KKyAgaWYgKG5wKQorICB7IGlmIChucC0+aW5kZXggPj0gMCkKKyAgICAgIHJldHVybiBzb2FwLT5uYW1lc3BhY2VzW25wLT5pbmRleF0ubnM7CisgICAgaWYgKG5wLT5ucykKKyAgICAgIHJldHVybiBzb2FwX3N0cmR1cChzb2FwLCBucC0+bnMpOworICB9CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3RhZ19jbXAoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqdCkKK3sgZm9yICg7OykKKyAgeyByZWdpc3RlciBpbnQgYzEgPSAqczsKKyAgICByZWdpc3RlciBpbnQgYzIgPSAqdDsKKyAgICBpZiAoIWMxIHx8IGMxID09ICciJykKKyAgICAgIGJyZWFrOworICAgIGlmIChjMiAhPSAnLScpCisgICAgeyBpZiAoYzEgIT0gYzIpCisgICAgICB7IGlmIChjMSA+PSAnQScgJiYgYzEgPD0gJ1onKQorICAgICAgICAgIGMxICs9ICdhJyAtICdBJzsKKyAgICAgICAgaWYgKGMyID49ICdBJyAmJiBjMiA8PSAnWicpCisgICAgICAgICAgYzIgKz0gJ2EnIC0gJ0EnOworICAgICAgfQorICAgICAgaWYgKGMxICE9IGMyKQorICAgICAgeyBpZiAoYzIgIT0gJyonKQorICAgICAgICAgIHJldHVybiAxOworCWMyID0gKisrdDsKKyAgICAgICAgaWYgKCFjMikKKwkgIHJldHVybiAwOworICAgICAgICBpZiAoYzIgPj0gJ0EnICYmIGMyIDw9ICdaJykKKyAgICAgICAgICBjMiArPSAnYScgLSAnQSc7CisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsgYzEgPSAqczsKKwkgIGlmICghYzEgfHwgYzEgPT0gJyInKQorCSAgICBicmVhazsKKwkgIGlmIChjMSA+PSAnQScgJiYgYzEgPD0gJ1onKQorICAgICAgICAgICAgYzEgKz0gJ2EnIC0gJ0EnOworICAgICAgICAgIGlmIChjMSA9PSBjMiAmJiAhc29hcF90YWdfY21wKHMgKyAxLCB0ICsgMSkpCisgICAgICAgICAgICByZXR1cm4gMDsKKwkgIHMrKzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgcysrOworICAgIHQrKzsKKyAgfQorICBpZiAoKnQgPT0gJyonICYmICF0WzFdKQorICAgIHJldHVybiAwOworICByZXR1cm4gKnQ7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfbWF0Y2hfdGFnKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcxLCBjb25zdCBjaGFyICp0YWcyKQoreyByZWdpc3RlciBjb25zdCBjaGFyICpzLCAqdDsKKyAgaWYgKCF0YWcxIHx8ICF0YWcyIHx8ICEqdGFnMikKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgcyA9IHN0cmNocih0YWcxLCAnOicpOworICB0ID0gc3RyY2hyKHRhZzIsICc6Jyk7CisgIGlmICh0KQorICB7IGlmIChzKQorICAgIHsgaWYgKHRbMV0gJiYgU09BUF9TVFJDTVAocyArIDEsIHQgKyAxKSkKKyAgICAgICAgcmV0dXJuIFNPQVBfVEFHX01JU01BVENIOworICAgICAgaWYgKHQgIT0gdGFnMiAmJiBzb2FwX21hdGNoX25hbWVzcGFjZShzb2FwLCB0YWcxLCB0YWcyLCBzIC0gdGFnMSwgdCAtIHRhZzIpKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlRhZ3MgJyVzJyBhbmQgJyVzJyBtYXRjaCBidXQgbmFtZXNwYWNlcyBkaWZmZXJcbiIsIHRhZzEsIHRhZzIpKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfVEFHX01JU01BVENIOworICAgICAgfQorICAgIH0gCisgICAgZWxzZSBpZiAoU09BUF9TVFJDTVAodGFnMSwgdCArIDEpKQorICAgICAgcmV0dXJuIFNPQVBfVEFHX01JU01BVENIOworICAgIGVsc2UgaWYgKHQgIT0gdGFnMiAmJiBzb2FwX21hdGNoX25hbWVzcGFjZShzb2FwLCB0YWcxLCB0YWcyLCAwLCB0IC0gdGFnMikpCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlRhZ3MgJyVzJyBhbmQgJyVzJyBtYXRjaCBidXQgbmFtZXNwYWNlcyBkaWZmZXJcbiIsIHRhZzEsIHRhZzIpKTsKKyAgICAgIHJldHVybiBTT0FQX1RBR19NSVNNQVRDSDsKKyAgICB9CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJUYWdzIGFuZCAoZGVmYXVsdCkgbmFtZXNwYWNlcyBtYXRjaDogJyVzJyAnJXMnXG4iLCB0YWcxLCB0YWcyKSk7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgaWYgKHMpCisgIHsgaWYgKFNPQVBfU1RSQ01QKHMgKyAxLCB0YWcyKSkKKyAgICAgIHJldHVybiBTT0FQX1RBR19NSVNNQVRDSDsKKyAgfQorICBlbHNlIGlmIChTT0FQX1NUUkNNUCh0YWcxLCB0YWcyKSkKKyAgICByZXR1cm4gU09BUF9UQUdfTUlTTUFUQ0g7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVGFncyBtYXRjaDogJyVzJyAnJXMnXG4iLCB0YWcxLCB0YWcyKSk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX21hdGNoX2FycmF5KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0eXBlKQoreyBpZiAoKnNvYXAtPmFycmF5VHlwZSkKKyAgICBpZiAoc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+YXJyYXlUeXBlLCB0eXBlKQorICAgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT5hcnJheVR5cGUsICJ4c2Q6YW55VHlwZSIpCisgICAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPmFycmF5VHlwZSwgInhzZDp1ci10eXBlIikKKyAgICApCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFycmF5IHR5cGUgbWlzbWF0Y2g6ICclcycgJyVzJ1xuIiwgc29hcC0+YXJyYXlUeXBlLCB0eXBlKSk7CisgICAgICByZXR1cm4gU09BUF9UQUdfTUlTTUFUQ0g7CisgICAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqCVNTTAorICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBXSVRIX09QRU5TU0wKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JhbmQoKQoreyB1bnNpZ25lZCBjaGFyIGJ1Zls0XTsKKyAgaWYgKCFzc2xfaW5pdF9kb25lKQorICAgIHNvYXBfc3NsX2luaXQoKTsKKyAgUkFORF9wc2V1ZG9fYnl0ZXMoYnVmLCA0KTsKKyAgcmV0dXJuICooaW50KilidWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc3NsX3NlcnZlcl9jb250ZXh0KHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBzaG9ydCBmbGFncywgY29uc3QgY2hhciAqa2V5ZmlsZSwgY29uc3QgY2hhciAqcGFzc3dvcmQsIGNvbnN0IGNoYXIgKmNhZmlsZSwgY29uc3QgY2hhciAqY2FwYXRoLCBjb25zdCBjaGFyICpkaGZpbGUsIGNvbnN0IGNoYXIgKnJhbmRmaWxlLCBjb25zdCBjaGFyICpzaWQpCit7IGludCBlcnI7CisgIHNvYXAtPmtleWZpbGUgPSBrZXlmaWxlOworICBzb2FwLT5wYXNzd29yZCA9IHBhc3N3b3JkOworICBzb2FwLT5jYWZpbGUgPSBjYWZpbGU7CisgIHNvYXAtPmNhcGF0aCA9IGNhcGF0aDsKKyAgaWYgKGRoZmlsZSkKKyAgeyBzb2FwLT5kaGZpbGUgPSBkaGZpbGU7CisgICAgc29hcC0+cnNhID0gMDsKKyAgfQorICBlbHNlCisgIHsgc29hcC0+ZGhmaWxlID0gTlVMTDsKKyAgICBzb2FwLT5yc2EgPSAxOworICB9CisgIHNvYXAtPnJhbmRmaWxlID0gcmFuZGZpbGU7CisgIHNvYXAtPnJlcXVpcmVfY2xpZW50X2F1dGggPSAoZmxhZ3MgJiBTT0FQX1NTTF9SRVFVSVJFX0NMSUVOVF9BVVRIRU5USUNBVElPTik7CisgIGlmICghKGVyciA9IHNvYXAtPmZzc2xhdXRoKHNvYXApKSkKKyAgeyBpZiAoc2lkKQorICAgICAgU1NMX0NUWF9zZXRfc2Vzc2lvbl9pZF9jb250ZXh0KHNvYXAtPmN0eCwgKHVuc2lnbmVkIGNoYXIqKXNpZCwgc3RybGVuKHNpZCkpOworICB9CisgIHJldHVybiBlcnI7IAorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NzbF9jbGllbnRfY29udGV4dChzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgc2hvcnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmtleWZpbGUsIGNvbnN0IGNoYXIgKnBhc3N3b3JkLCBjb25zdCBjaGFyICpjYWZpbGUsIGNvbnN0IGNoYXIgKmNhcGF0aCwgY29uc3QgY2hhciAqcmFuZGZpbGUpCit7IHNvYXAtPmtleWZpbGUgPSBrZXlmaWxlOworICBzb2FwLT5wYXNzd29yZCA9IHBhc3N3b3JkOworICBzb2FwLT5jYWZpbGUgPSBjYWZpbGU7CisgIHNvYXAtPmNhcGF0aCA9IGNhcGF0aDsKKyAgc29hcC0+ZGhmaWxlID0gTlVMTDsKKyAgc29hcC0+cnNhID0gMDsKKyAgc29hcC0+cmFuZGZpbGUgPSByYW5kZmlsZTsKKyAgc29hcC0+cmVxdWlyZV9zZXJ2ZXJfYXV0aCA9IChmbGFncyAmIFNPQVBfU1NMX1JFUVVJUkVfU0VSVkVSX0FVVEhFTlRJQ0FUSU9OKTsKKyAgcmV0dXJuIHNvYXAtPmZzc2xhdXRoKHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zc2xfaW5pdCgpCit7IC8qIE5vdGU6IGZvciBNVCBzeXN0ZW1zLCB0aGUgbWFpbiBwcm9ncmFtIE1VU1QgY2FsbCBzb2FwX3NzbF9pbml0KCkgYmVmb3JlIGFueSB0aHJlYWRzIGFyZSBzdGFydGVkICovCisgIGlmICghc3NsX2luaXRfZG9uZSkKKyAgeyBzc2xfaW5pdF9kb25lID0gMTsKKyAgICBTU0xfbGlicmFyeV9pbml0KCk7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIFNTTF9sb2FkX2Vycm9yX3N0cmluZ3MoKTsKKyNlbmRpZgorICAgIGlmICghUkFORF9sb2FkX2ZpbGUoIi9kZXYvdXJhbmRvbSIsIDEwMjQpKQorICAgIHsgY2hhciBidWZbMTAyNF07CisgICAgICBSQU5EX3NlZWQoYnVmLCBzaXplb2YoYnVmKSk7CisgICAgICB3aGlsZSAoIVJBTkRfc3RhdHVzKCkpCisgICAgICB7IGludCByID0gcmFuZCgpOworICAgICAgICBSQU5EX3NlZWQoJnIsIHNpemVvZihpbnQpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBjb25zdCBjaGFyICoKK3NzbF9lcnJvcihzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHJldCkKK3sgaW50IGVyciA9IFNTTF9nZXRfZXJyb3Ioc29hcC0+c3NsLCByZXQpOworICBjb25zdCBjaGFyICptc2cgPSBzb2FwX3N0cl9jb2RlKGhfc3NsX2Vycm9yX2NvZGVzLCBlcnIpOworICBpZiAobXNnKQorICAgIHN0cmNweShzb2FwLT5tc2didWYsIG1zZyk7CisgIGVsc2UKKyAgICByZXR1cm4gRVJSX2Vycm9yX3N0cmluZyhlcnIsIHNvYXAtPm1zZ2J1Zik7CisgIGlmIChFUlJfcGVla19lcnJvcigpKQorICB7IHVuc2lnbmVkIGxvbmcgcjsKKyAgICBzdHJjYXQoc29hcC0+bXNnYnVmLCAiXG4iKTsKKyAgICB3aGlsZSAoKHIgPSBFUlJfZ2V0X2Vycm9yKCkpKQorICAgICAgRVJSX2Vycm9yX3N0cmluZ19uKHIsIHNvYXAtPm1zZ2J1ZiArIHN0cmxlbihzb2FwLT5tc2didWYpLCBzaXplb2Yoc29hcC0+bXNnYnVmKSAtIHN0cmxlbihzb2FwLT5tc2didWYpKTsKKyAgfSAKKyAgZWxzZQorICB7IHN3aXRjaCAocmV0KQorICAgIHsgY2FzZSAwOgorICAgICAgICBzdHJjcHkoc29hcC0+bXNnYnVmLCAiRU9GIHdhcyBvYnNlcnZlZCB0aGF0IHZpb2xhdGVzIHRoZSBwcm90b2NvbC4gVGhlIGNsaWVudCBwcm9iYWJseSBwcm92aWRlZCBpbnZhbGlkIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uLiIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgLTE6CisgICAgICAgIHNwcmludGYoc29hcC0+bXNnYnVmLCAiRXJyb3Igb2JzZXJ2ZWQgYnkgdW5kZXJseWluZyBCSU86ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsgIAorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXAtPm1zZ2J1ZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NzbF9wYXNzd29yZChjaGFyICpidWYsIGludCBudW0sIGludCByd2ZsYWcsIHZvaWQgKnVzZXJkYXRhKQoreyBpZiAobnVtIDwgKGludClzdHJsZW4oKGNoYXIqKXVzZXJkYXRhKSArIDEpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiBzdHJsZW4oc3RyY3B5KGJ1ZiwgKGNoYXIqKXVzZXJkYXRhKSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRoaXMgY2FsbGJhY2sgaXMgaW5jbHVkZWQgZm9yIGZ1dHVyZSByZWZlcmVuY2VzLiBJdCBzaG91bGQgbm90IGJlIGRlbGV0ZWQKKyNpZm5kZWYgUEFMTV8yCitzdGF0aWMgREggKgorc3NsX3RtcF9kaChTU0wgKnNzbCwgaW50IGlzX2V4cG9ydCwgaW50IGtleWxlbmd0aCkKK3sgc3RhdGljIERIICpkaDUxMiA9IE5VTEw7CisgIHN0YXRpYyBESCAqZGgxMDI0ID0gTlVMTDsKKyAgREggKmRoOworICBzd2l0Y2ggKGtleWxlbmd0aCkKKyAgeyBjYXNlIDUxMjoKKyAgICAgIGlmICghZGg1MTIpCisgICAgICB7IEJJTyAqYmlvID0gQklPX25ld19maWxlKCJkaDUxMi5wZW0iLCAiciIpOworICAgICAgICBpZiAoYmlvKQorICAgICAgICB7IGRoNTEyID0gUEVNX3JlYWRfYmlvX0RIcGFyYW1zKGJpbywgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgQklPX2ZyZWUoYmlvKTsKKyAgICAgICAgICByZXR1cm4gZGg1MTI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGRoNTEyOworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoIWRoMTAyNCkKKyAgICAgIHsgQklPICpiaW8gPSBCSU9fbmV3X2ZpbGUoImRoMTAyNC5wZW0iLCAiciIpOworICAgICAgICBpZiAoYmlvKQorICAgICAgICB7IGRoMTAyNCA9IFBFTV9yZWFkX2Jpb19ESHBhcmFtcyhiaW8sIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgICAgIEJJT19mcmVlKGJpbyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGRoID0gZGgxMDI0OworICB9CisgIHJldHVybiBkaDsKK30KKyNlbmRpZgorKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzc2xfYXV0aF9pbml0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoIXNzbF9pbml0X2RvbmUpCisgICAgc29hcF9zc2xfaW5pdCgpOworICBpZiAoIXNvYXAtPmN0eCkKKyAgeyBpZiAoIShzb2FwLT5jdHggPSBTU0xfQ1RYX25ldyhTU0x2MjNfbWV0aG9kKCkpKSkKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHNldHVwIGNvbnRleHQiLCBTT0FQX1NTTF9FUlJPUik7CisgIH0KKyAgaWYgKHNvYXAtPnJhbmRmaWxlKQorICB7IGlmICghUkFORF9sb2FkX2ZpbGUoc29hcC0+cmFuZGZpbGUsIC0xKSkKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IGxvYWQgcmFuZG9tbmVzcyIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgfQorICBpZiAoc29hcC0+Y2FmaWxlIHx8IHNvYXAtPmNhcGF0aCkKKyAgeyBpZiAoIVNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKHNvYXAtPmN0eCwgc29hcC0+Y2FmaWxlLCBzb2FwLT5jYXBhdGgpKQorICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3QgcmVhZCBDQSBmaWxlIGFuZCBkaXJlY3RvcnkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgaWYgKHNvYXAtPmNhZmlsZSAmJiBzb2FwLT5yZXF1aXJlX2NsaWVudF9hdXRoKQorICAgICAgU1NMX0NUWF9zZXRfY2xpZW50X0NBX2xpc3Qoc29hcC0+Y3R4LCBTU0xfbG9hZF9jbGllbnRfQ0FfZmlsZShzb2FwLT5jYWZpbGUpKTsKKyAgfQorICBpZiAoIVNTTF9DVFhfc2V0X2RlZmF1bHRfdmVyaWZ5X3BhdGhzKHNvYXAtPmN0eCkpCisgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3QgcmVhZCBkZWZhdWx0IENBIGZpbGUgYW5kL29yIGRpcmVjdG9yeSIsIFNPQVBfU1NMX0VSUk9SKTsKKy8qIFNlZSBiZWxvdyAqLworICBpZiAoc29hcC0+a2V5ZmlsZSkKKyAgeyBpZiAoIVNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoc29hcC0+Y3R4LCBzb2FwLT5rZXlmaWxlKSkKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHJlYWQgY2VydGlmaWNhdGUga2V5IGZpbGUiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgaWYgKHNvYXAtPnBhc3N3b3JkKQorICAgIHsgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2JfdXNlcmRhdGEoc29hcC0+Y3R4LCAodm9pZCopc29hcC0+cGFzc3dvcmQpOworICAgICAgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2Ioc29hcC0+Y3R4LCBzc2xfcGFzc3dvcmQpOworICAgIH0KKyAgICBpZiAoIVNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfZmlsZShzb2FwLT5jdHgsIHNvYXAtPmtleWZpbGUsIFNTTF9GSUxFVFlQRV9QRU0pKQorICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3QgcmVhZCBrZXkgZmlsZSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgfQorLyogU3VnZ2VzdGVkIGFsdGVybmF0aXZlIGFwcHJvYWNoIHRvIGNoZWNrIGNhZmlsZSBmaXJzdCBiZWZvcmUgdGhlIGtleSBmaWxlOgorICBpZiAoc29hcC0+cGFzc3dvcmQpCisgIHsgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2JfdXNlcmRhdGEoc29hcC0+Y3R4LCAodm9pZCopc29hcC0+cGFzc3dvcmQpOworICAgIFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiKHNvYXAtPmN0eCwgc3NsX3Bhc3N3b3JkKTsKKyAgfQorICBpZiAoIXNvYXAtPmNhZmlsZSB8fCAhU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZShzb2FwLT5jdHgsIHNvYXAtPmNhZmlsZSkpCisgIHsgaWYgKHNvYXAtPmtleWZpbGUpCisgICAgeyBpZiAoIVNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoc29hcC0+Y3R4LCBzb2FwLT5rZXlmaWxlKSkKKyAgICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3QgcmVhZCBjZXJ0aWZpY2F0ZSBvciBrZXkgZmlsZSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICAgIGlmICghU1NMX0NUWF91c2VfUHJpdmF0ZUtleV9maWxlKHNvYXAtPmN0eCwgc29hcC0+a2V5ZmlsZSwgU1NMX0ZJTEVUWVBFX1BFTSkpCisgICAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHJlYWQga2V5IGZpbGUiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgfQorICB9CisqLworICBpZiAoc29hcC0+cnNhKQorICB7IFJTQSAqcnNhID0gUlNBX2dlbmVyYXRlX2tleSgxMDI0LCBSU0FfRjQsIE5VTEwsIE5VTEwpOworICAgIGlmICghU1NMX0NUWF9zZXRfdG1wX3JzYShzb2FwLT5jdHgsIHJzYSkpCisgICAgeyBpZiAocnNhKQorICAgICAgICBSU0FfZnJlZShyc2EpOworICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3Qgc2V0IFJTQSBrZXkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgfQorICAgIFJTQV9mcmVlKHJzYSk7CisgIH0KKyAgZWxzZSBpZiAoc29hcC0+ZGhmaWxlKQorICB7IERIICpkaCA9IDA7CisgICAgQklPICpiaW87CisgICAgYmlvID0gQklPX25ld19maWxlKHNvYXAtPmRoZmlsZSwgInIiKTsKKyAgICBpZiAoIWJpbykKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHJlYWQgREggZmlsZSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICBkaCA9IFBFTV9yZWFkX2Jpb19ESHBhcmFtcyhiaW8sIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIEJJT19mcmVlKGJpbyk7CisgICAgaWYgKFNTTF9DVFhfc2V0X3RtcF9kaChzb2FwLT5jdHgsIGRoKSA8IDApCisgICAgeyBpZiAoZGgpCisgICAgICAgIERIX2ZyZWUoZGgpOworICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3Qgc2V0IERIIHBhcmFtZXRlcnMiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgfQorICAgIERIX2ZyZWUoZGgpOworICB9CisgIFNTTF9DVFhfc2V0X29wdGlvbnMoc29hcC0+Y3R4LCBTU0xfT1BfQUxMIHwgU1NMX09QX05PX1NTTHYyKTsKKyAgU1NMX0NUWF9zZXRfdmVyaWZ5KHNvYXAtPmN0eCwgc29hcC0+cmVxdWlyZV9jbGllbnRfYXV0aCA/IChTU0xfVkVSSUZZX1BFRVIgfCBTU0xfVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJUKSA6IHNvYXAtPnJlcXVpcmVfc2VydmVyX2F1dGggPyBTU0xfVkVSSUZZX1BFRVIgOiBTU0xfVkVSSUZZX05PTkUsIHNvYXAtPmZzc2x2ZXJpZnkpOworI2lmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgMHgwMDkwNTEwMEwpCisgIFNTTF9DVFhfc2V0X3ZlcmlmeV9kZXB0aChzb2FwLT5jdHgsIDEpOyAKKyNlbHNlCisgIFNTTF9DVFhfc2V0X3ZlcmlmeV9kZXB0aChzb2FwLT5jdHgsIDkpOyAKKyNlbmRpZiAgCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc3NsX3ZlcmlmeV9jYWxsYmFjayhpbnQgb2ssIFg1MDlfU1RPUkVfQ1RYICpzdG9yZSkKK3sKKyNpZmRlZiBTT0FQX0RFQlVHCisgIGlmICghb2spIAorICB7IGNoYXIgZGF0YVsyNTZdOworICAgIFg1MDkgKmNlcnQgPSBYNTA5X1NUT1JFX0NUWF9nZXRfY3VycmVudF9jZXJ0KHN0b3JlKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlNTTCB2ZXJpZnkgZXJyb3Igb3Igd2FybmluZyB3aXRoIGNlcnRpZmljYXRlIGF0IGRlcHRoICVkOiAlc1xuIiwgWDUwOV9TVE9SRV9DVFhfZ2V0X2Vycm9yX2RlcHRoKHN0b3JlKSwgWDUwOV92ZXJpZnlfY2VydF9lcnJvcl9zdHJpbmcoWDUwOV9TVE9SRV9DVFhfZ2V0X2Vycm9yKHN0b3JlKSkpOworICAgIFg1MDlfTkFNRV9vbmVsaW5lKFg1MDlfZ2V0X2lzc3Vlcl9uYW1lKGNlcnQpLCBkYXRhLCBzaXplb2YoZGF0YSkpOworICAgIGZwcmludGYoc3RkZXJyLCAiY2VydGlmaWNhdGUgaXNzdWVyICVzXG4iLCBkYXRhKTsKKyAgICBYNTA5X05BTUVfb25lbGluZShYNTA5X2dldF9zdWJqZWN0X25hbWUoY2VydCksIGRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgZnByaW50ZihzdGRlcnIsICJjZXJ0aWZpY2F0ZSBzdWJqZWN0ICVzXG4iLCBkYXRhKTsKKyAgfQorI2VuZGlmCisgIC8qIE5vdGU6IHJldHVybiAxIHRvIGNvbnRpbnVlLCBidXQgdW5zYWZlIHByb2dyZXNzIHdpbGwgYmUgdGVybWluYXRlZCBieSBTU0wgKi8KKyAgcmV0dXJuIG9rOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NzbF9hY2NlcHQoc3RydWN0IHNvYXAgKnNvYXApCit7IEJJTyAqYmlvOworICBpbnQgaSwgcjsKKyAgaWYgKCFzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIk5vIHNvY2tldCBpbiBzb2FwX3NzbF9hY2NlcHQoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgaWYgKCFzb2FwLT5jdHggJiYgKHNvYXAtPmVycm9yID0gc29hcC0+ZnNzbGF1dGgoc29hcCkpKQorICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICBpZiAoIXNvYXAtPnNzbCkKKyAgeyBzb2FwLT5zc2wgPSBTU0xfbmV3KHNvYXAtPmN0eCk7CisgICAgaWYgKCFzb2FwLT5zc2wpCisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJTU0xfbmV3KCkgZmFpbGVkIGluIHNvYXBfc3NsX2FjY2VwdCgpIiwgU09BUF9TU0xfRVJST1IpOworICB9CisgIGVsc2UKKyAgICBTU0xfY2xlYXIoc29hcC0+c3NsKTsKKyAgc29hcC0+aW1vZGUgfD0gU09BUF9FTkNfU1NMOworICBzb2FwLT5vbW9kZSB8PSBTT0FQX0VOQ19TU0w7CisjaWYgZGVmaW5lZChXSU4zMikKKyAgeyB1X2xvbmcgbm9uYmxvY2tpbmcgPSAxOworICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZJT05CSU8sICZub25ibG9ja2luZyk7CisgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgeyB1X2xvbmcgbm9uYmxvY2tpbmcgPSAxOworICAgIGlvY3RsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZJT05CSU8sIChpbnQpJm5vbmJsb2NraW5nKTsKKyAgfQorI2Vsc2UKKyAgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRl9HRVRGTCl8T19OT05CTE9DSyk7CisjZW5kaWYKKyAgYmlvID0gQklPX25ld19zb2NrZXQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgQklPX05PQ0xPU0UpOworICBTU0xfc2V0X2Jpbyhzb2FwLT5zc2wsIGJpbywgYmlvKTsKKyAgaSA9IDEwMDsgLyogMTAwICogMC4xIG1zIHJldHJpZXMgKi8KKyAgd2hpbGUgKChyID0gU1NMX2FjY2VwdChzb2FwLT5zc2wpKSA8PSAwKQorICB7IGludCBlcnIgPSBTU0xfZ2V0X2Vycm9yKHNvYXAtPnNzbCwgcik7CisgICAgaWYgKGVyciA9PSBTU0xfRVJST1JfV0FOVF9SRUFEIHx8IGVyciA9PSBTU0xfRVJST1JfV0FOVF9XUklURSkKKyAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICBmZF9zZXQgZmQ7CisgICAgICBpZiAoaS0tIDw9IDApCisgICAgICAgIGJyZWFrOworICAgICAgdGltZW91dC50dl9zZWMgPSAwOworICAgICAgdGltZW91dC50dl91c2VjID0gMTAwMDAwOworICAgICAgRkRfWkVSTygmZmQpOworICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZmZCk7CisgICAgICByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksICZmZCwgTlVMTCwgJmZkLCAmdGltZW91dCk7CisgICAgICBpZiAociA8IDAgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUikKKyAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgIHJldHVybiBTT0FQX0VPRjsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgc29hcC0+ZXJybnVtID0gZXJyOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisjaWYgZGVmaW5lZChXSU4zMikKKyAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZJT05CSU8sICZibG9ja2luZyk7CisgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgIGlvY3RsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZJT05CSU8sIChpbnQpJmJsb2NraW5nKTsKKyAgfQorI2Vsc2UKKyAgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRl9HRVRGTCkmfk9fTk9OQkxPQ0spOworI2VuZGlmCisgIGlmIChyIDw9IDApCisgIHsgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgc3NsX2Vycm9yKHNvYXAsIHIpLCAiU1NMX2FjY2VwdCgpIGZhaWxlZCBpbiBzb2FwX3NzbF9hY2NlcHQoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICByZXR1cm4gU09BUF9TU0xfRVJST1I7CisgIH0KKyAgaWYgKHNvYXAtPnJlcXVpcmVfY2xpZW50X2F1dGgpCisgIHsgWDUwOSAqcGVlcjsKKyAgICBpbnQgZXJyOworICAgIGlmICgoZXJyID0gU1NMX2dldF92ZXJpZnlfcmVzdWx0KHNvYXAtPnNzbCkpICE9IFg1MDlfVl9PSykKKyAgICB7IHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgcmV0dXJuIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCBYNTA5X3ZlcmlmeV9jZXJ0X2Vycm9yX3N0cmluZyhlcnIpLCAiU1NMIGNlcnRpZmljYXRlIHByZXNlbnRlZCBieSBwZWVyIGNhbm5vdCBiZSB2ZXJpZmllZCBpbiBzb2FwX3NzbF9hY2NlcHQoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICB9CisgICAgcGVlciA9IFNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZShzb2FwLT5zc2wpOworICAgIGlmICghcGVlcikKKyAgICB7IHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgcmV0dXJuIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIk5vIFNTTCBjZXJ0aWZpY2F0ZSB3YXMgcHJlc2VudGVkIGJ5IHRoZSBwZWVyIGluIHNvYXBfc3NsX2FjY2VwdCgpIiwgU09BUF9TU0xfRVJST1IpOworICAgIH0KKyAgICBYNTA5X2ZyZWUocGVlcik7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNlbmRpZiAvKiBXSVRIX09QRU5TU0wgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAordGNwX2luaXQoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPmVycm1vZGUgPSAxOworI2lmZGVmIFdJTjMyCisgIGlmICh0Y3BfZG9uZSkKKyAgICByZXR1cm4gMDsKKyAgZWxzZQorICB7IFdTQURBVEEgdzsKKyAgICBpZiAoV1NBU3RhcnR1cChNQUtFV09SRCgxLCAxKSwgJncpKQorICAgICAgcmV0dXJuIC0xOworICAgIHRjcF9kb25lID0gMTsKKyAgfQorI2VuZGlmCisgIHJldHVybiAwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2RvbmUoc3RydWN0IHNvYXAgKnNvYXApCit7IAorI2lmZGVmIFNPQVBfREVCVUcKKyAgaW50IGk7CisjZW5kaWYKKyAgaWYgKHNvYXBfY2hlY2tfc3RhdGUoc29hcCkpCisgICAgcmV0dXJuOworICBzb2FwX2ZyZWUoc29hcCk7CisgIHdoaWxlIChzb2FwLT5jbGlzdCkKKyAgeyBzdHJ1Y3Qgc29hcF9jbGlzdCAqcCA9IHNvYXAtPmNsaXN0LT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5jbGlzdCk7CisgICAgc29hcC0+Y2xpc3QgPSBwOworICB9CisgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOyAvKiB0byBmb3JjZSBjbG9zZSB0aGUgc29ja2V0ICovCisgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworI2lmZGVmIFdJVEhfQ09PS0lFUworICBzb2FwX2ZyZWVfY29va2llcyhzb2FwKTsKKyNlbmRpZgorICB3aGlsZSAoc29hcC0+cGx1Z2lucykKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnAgPSBzb2FwLT5wbHVnaW5zLT5uZXh0OworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVtb3ZpbmcgcGx1Z2luICclcydcbiIsIHNvYXAtPnBsdWdpbnMtPmlkKSk7CisgICAgaWYgKHNvYXAtPnBsdWdpbnMtPmZjb3B5IHx8IHNvYXAtPnN0YXRlID09IFNPQVBfSU5JVCkKKyAgICAgIHNvYXAtPnBsdWdpbnMtPmZkZWxldGUoc29hcCwgc29hcC0+cGx1Z2lucyk7CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPnBsdWdpbnMpOworICAgIHNvYXAtPnBsdWdpbnMgPSBwOworICB9CisgIHNvYXAtPmZwbHVnaW4gPSBmcGx1Z2luOworI2lmbmRlZiBXSVRIX05PSFRUUAorICBzb2FwLT5mcG9zdCA9IGh0dHBfcG9zdDsKKyAgc29hcC0+ZmdldCA9IGh0dHBfZ2V0OworICBzb2FwLT5mZm9ybSA9IE5VTEw7CisgIHNvYXAtPmZwb3N0aGRyID0gaHR0cF9wb3N0X2hlYWRlcjsKKyAgc29hcC0+ZnJlc3BvbnNlID0gaHR0cF9yZXNwb25zZTsKKyAgc29hcC0+ZnBhcnNlID0gaHR0cF9wYXJzZTsKKyAgc29hcC0+ZnBhcnNlaGRyID0gaHR0cF9wYXJzZV9oZWFkZXI7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfSVBWNgorICBzb2FwLT5mcmVzb2x2ZSA9IHRjcF9nZXRob3N0OworI2Vsc2UKKyAgc29hcC0+ZnJlc29sdmUgPSBOVUxMOworI2VuZGlmCisgIHNvYXAtPmZhY2NlcHQgPSB0Y3BfYWNjZXB0OworICBzb2FwLT5mb3BlbiA9IHRjcF9jb25uZWN0OworICBzb2FwLT5mY2xvc2UgPSB0Y3BfZGlzY29ubmVjdDsKKyAgc29hcC0+ZmNsb3Nlc29ja2V0ID0gdGNwX2Nsb3Nlc29ja2V0OworICBzb2FwLT5mc2h1dGRvd25zb2NrZXQgPSB0Y3Bfc2h1dGRvd25zb2NrZXQ7CisgIHNvYXAtPmZzZW5kID0gZnNlbmQ7CisgIHNvYXAtPmZyZWN2ID0gZnJlY3Y7CisgIHNvYXAtPmZwb2xsID0gc29hcF9wb2xsOworI2Vsc2UKKyAgc29hcC0+Zm9wZW4gPSBOVUxMOworICBzb2FwLT5mY2xvc2UgPSBOVUxMOworICBzb2FwLT5mcG9sbCA9IE5VTEw7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcC0+ZnByZXBhcmVpbml0ID0gTlVMTDsKKyAgc29hcC0+ZnByZXBhcmVzZW5kID0gTlVMTDsKKyAgc29hcC0+ZnByZXBhcmVyZWN2ID0gTlVMTDsKKyAgc29hcC0+ZnByZXBhcmVmaW5hbCA9IE5VTEw7CisjZW5kaWYKKyAgc29hcC0+ZnNldGVycm9yID0gTlVMTDsKKyAgc29hcC0+Zmlnbm9yZSA9IE5VTEw7CisgIHNvYXAtPmZzZXJ2ZWxvb3AgPSBOVUxMOworI2lmZGVmIFdJVEhfT1BFTlNTTAorICBpZiAoc29hcC0+c2Vzc2lvbikKKyAgeyBTU0xfU0VTU0lPTl9mcmVlKHNvYXAtPnNlc3Npb24pOworICAgIHNvYXAtPnNlc3Npb24gPSBOVUxMOworICB9CisjZW5kaWYKKyAgaWYgKHNvYXAtPnN0YXRlID09IFNPQVBfSU5JVCkKKyAgeyBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSkKKyAgICB7IHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyKTsKKyAgICAgIHNvYXAtPm1hc3RlciA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgIGlmIChzb2FwLT5jdHgpCisgICAgeyBTU0xfQ1RYX2ZyZWUoc29hcC0+Y3R4KTsKKyAgICAgIHNvYXAtPmN0eCA9IE5VTEw7CisgICAgfQorI2VuZGlmCisgIH0KKyNpZmRlZiBTT0FQX0RFQlVHCisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZSBsb2dmaWxlc1xuIikpOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9NQVhMT0dTOyBpKyspCisgIHsgaWYgKHNvYXAtPmxvZ2ZpbGVbaV0pCisgICAgeyBTT0FQX0ZSRUUoc29hcCwgKHZvaWQqKXNvYXAtPmxvZ2ZpbGVbaV0pOworICAgICAgc29hcC0+bG9nZmlsZVtpXSA9IE5VTEw7CisgICAgfQorICAgIHNvYXBfY2xvc2VfbG9nZmlsZShzb2FwLCBpKTsKKyAgfQorICBzb2FwX2ZyZWVfbWh0KHNvYXApOworICBzb2FwLT5zdGF0ZSA9IDA7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2NsZWFudXAoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXBfZG9uZShzb2FwKTsKKyNpZmRlZiBXSU4zMgorICBpZiAoIXRjcF9kb25lKQorICAgIHJldHVybjsKKyAgdGNwX2RvbmUgPSAwOworICBXU0FDbGVhbnVwKCk7CisjZW5kaWYKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBjb25zdCBjaGFyKgordGNwX2Vycm9yKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBjb25zdCBjaGFyICptc2cgPSBOVUxMOworICBzd2l0Y2ggKHNvYXAtPmVycm1vZGUpCisgIHsgY2FzZSAwOgorICAgICAgbXNnID0gc29hcF9zdHJlcnJvcihzb2FwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIG1zZyA9ICJXU0FTdGFydHVwIGZhaWxlZCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgeworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIG1zZyA9IHNvYXBfc3RyX2NvZGUoaF9lcnJvcl9jb2Rlcywgc29hcC0+ZXJybnVtKTsKKyAgICAgIGlmICghbXNnKQorI2VuZGlmCisgICAgICB7IHNwcmludGYoc29hcC0+bXNnYnVmLCAiVENQL1VEUCBJUCBlcnJvciAlZCIsIHNvYXAtPmVycm51bSk7CisgICAgICAgIG1zZyA9IHNvYXAtPm1zZ2J1ZjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIG1zZzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNvbnN0IGNoYXIqCitodHRwX2Vycm9yKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3RhdHVzKQoreyByZWdpc3RlciBjb25zdCBjaGFyICptc2cgPSBTT0FQX1NUUl9FT1M7CisjaWZuZGVmIFdJVEhfTEVBTgorICBtc2cgPSBzb2FwX3N0cl9jb2RlKGhfaHR0cF9lcnJvcl9jb2Rlcywgc3RhdHVzKTsKKyAgaWYgKCFtc2cpCisgICAgbXNnID0gU09BUF9TVFJfRU9TOworI2VuZGlmCisgIHJldHVybiBtc2c7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0lQVjYKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAordGNwX2dldGhvc3Qoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmFkZHIsIHN0cnVjdCBpbl9hZGRyICppbmFkZHIpCit7IHNvYXBfaW50MzIgaWFkZCA9IC0xOworICBzdHJ1Y3QgaG9zdGVudCBob3N0ZW50LCAqaG9zdCA9ICZob3N0ZW50OworI2lmZGVmIFZYV09SS1MKKyAgaW50IGhvc3RpbnQ7CisgIC8qIGluZXRfYWRkcigpLCBhbmQgaG9zdEdldEJ5TmFtZSgpIGV4cGVjdCAiY2hhciAqIjsgYWRkciBpcyBhICJjb25zdCBjaGFyICoiLiAqLworICBpYWRkID0gaW5ldF9hZGRyKChjaGFyKilhZGRyKTsKKyNlbHNlCisjaWYgZGVmaW5lZChfQUlYVkVSU0lPTl80MzEpIHx8IGRlZmluZWQoVFJVNjQpCisgIHN0cnVjdCBob3N0ZW50X2RhdGEgaHRfZGF0YTsKKyNlbmRpZgorI2lmZGVmIEFTNDAwCisgIGlhZGQgPSBpbmV0X2FkZHIoKHZvaWQqKWFkZHIpOworI2Vsc2UKKyAgaWFkZCA9IGluZXRfYWRkcihhZGRyKTsKKyNlbmRpZgorI2VuZGlmCisgIGlmIChpYWRkICE9IC0xKQorICB7IG1lbWNweShpbmFkZHIsICZpYWRkLCBzaXplb2YoaWFkZCkpOworICAgIHJldHVybiBTT0FQX09LOworICB9CisjaWYgZGVmaW5lZChfX0dMSUJDX18pCisgIGlmIChnZXRob3N0YnluYW1lX3IoYWRkciwgJmhvc3RlbnQsIHNvYXAtPmJ1ZiwgU09BUF9CVUZMRU4sICZob3N0LCAmc29hcC0+ZXJybnVtKSA8IDApCisgICAgaG9zdCA9IE5VTEw7CisjZWxpZiBkZWZpbmVkKF9BSVhWRVJTSU9OXzQzMSkgfHwgZGVmaW5lZChUUlU2NCkKKyAgbWVtc2V0KCh2b2lkKikmaHRfZGF0YSwgMCwgc2l6ZW9mKGh0X2RhdGEpKTsKKyAgaWYgKGdldGhvc3RieW5hbWVfcihhZGRyLCAmaG9zdGVudCwgJmh0X2RhdGEpIDwgMCkKKyAgeyBob3N0ID0gTlVMTDsKKyAgICBzb2FwLT5lcnJudW0gPSBoX2Vycm5vOworICB9CisjZWxpZiBkZWZpbmVkKEhBVkVfR0VUSE9TVEJZTkFNRV9SKQorICBob3N0ID0gZ2V0aG9zdGJ5bmFtZV9yKGFkZHIsICZob3N0ZW50LCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOLCAmc29hcC0+ZXJybnVtKTsKKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgLyogSWYgdGhlIEROUyByZXNvbHZlciBsaWJyYXJ5IHJlc29sdkxpYiBoYXMgYmVlbiBjb25maWd1cmVkIGluIHRoZSB2eFdvcmtzCisgICAqIGltYWdlLCBhIHF1ZXJ5IGZvciB0aGUgaG9zdCBJUCBhZGRyZXNzIGlzIHNlbnQgdG8gdGhlIEROUyBzZXJ2ZXIsIGlmIHRoZQorICAgKiBuYW1lIHdhcyBub3QgZm91bmQgaW4gdGhlIGxvY2FsIGhvc3QgdGFibGUuICovCisgIGhvc3RpbnQgPSBob3N0R2V0QnlOYW1lKChjaGFyKilhZGRyKTsKKyAgaWYgKGhvc3RpbnQgPT0gRVJST1IpCisgIHsgaG9zdCA9IE5VTEw7CisgICAgc29hcC0+ZXJybnVtID0gc29hcF9lcnJubzsgCisgIH0KKyNlbHNlCisjaWZkZWYgQVM0MDAKKyAgaWYgKCEoaG9zdCA9IGdldGhvc3RieW5hbWUoKHZvaWQqKWFkZHIpKSkKKyAgICBzb2FwLT5lcnJudW0gPSBoX2Vycm5vOworI2Vsc2UKKyAgaWYgKCEoaG9zdCA9IGdldGhvc3RieW5hbWUoYWRkcikpKQorICAgIHNvYXAtPmVycm51bSA9IGhfZXJybm87CisjZW5kaWYKKyNlbmRpZgorICBpZiAoIWhvc3QpCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJIb3N0IG5hbWUgbm90IGZvdW5kXG4iKSk7CisgICAgcmV0dXJuIFNPQVBfRVJSOworICB9CisjaWZkZWYgVlhXT1JLUworICBpbmFkZHItPnNfYWRkciA9IGhvc3RpbnQ7CisjZWxzZQorICBtZW1jcHkoaW5hZGRyLCBob3N0LT5oX2FkZHIsIGhvc3QtPmhfbGVuZ3RoKTsKKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAordGNwX2Nvbm5lY3Qoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjb25zdCBjaGFyICpob3N0LCBpbnQgcG9ydCkKK3sKKyNpZmRlZiBXSVRIX0lQVjYKKyAgc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqcmVzLCAqcmVzc2F2ZTsKKyAgaW50IGVycjsKKyNlbmRpZgorICByZWdpc3RlciBpbnQgZmQ7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpbnQgbGVuID0gU09BUF9CVUZMRU47CisgIGludCBzZXQgPSAxOworI2VuZGlmCisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0KTsKKyAgc29hcC0+c29ja2V0ID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgaWYgKHRjcF9pbml0KHNvYXApKQorICB7IHNvYXAtPmVycm51bSA9IDA7CisgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgIlRDUCBpbml0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIHNvYXAtPmVycm1vZGUgPSAwOworI2lmZGVmIFdJVEhfSVBWNgorICBtZW1zZXQoKHZvaWQqKSZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisgIGhpbnRzLmFpX2ZhbWlseSA9IFBGX1VOU1BFQzsKKyNpZmRlZiBXSVRIX1VEUAorICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19ER1JBTTsKKyAgZWxzZQorI2VuZGlmCisgICAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKyAgc29hcC0+ZXJybW9kZSA9IDI7CisgIGlmIChzb2FwLT5wcm94eV9ob3N0KQorICAgIGVyciA9IGdldGFkZHJpbmZvKHNvYXAtPnByb3h5X2hvc3QsIHNvYXBfaW50MnMoc29hcCwgc29hcC0+cHJveHlfcG9ydCksICZoaW50cywgJnJlcyk7CisgIGVsc2UKKyAgICBlcnIgPSBnZXRhZGRyaW5mbyhob3N0LCBzb2FwX2ludDJzKHNvYXAsIHBvcnQpLCAmaGludHMsICZyZXMpOworICBpZiAoZXJyKQorICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCBnYWlfc3RyZXJyb3IoZXJyKSwgImdldGFkZHJpbmZvIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIHJlc3NhdmUgPSByZXM7CithZ2FpbjoKKyAgZmQgPSAoaW50KXNvY2tldChyZXMtPmFpX2ZhbWlseSwgcmVzLT5haV9zb2NrdHlwZSwgcmVzLT5haV9wcm90b2NvbCk7CisgIHNvYXAtPmVycm1vZGUgPSAwOworI2Vsc2UKKyNpZmRlZiBXSVRIX1VEUAorICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIGZkID0gKGludClzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisgIGVsc2UKKyNlbmRpZgorICAgIGZkID0gKGludClzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOworI2VuZGlmCisgIGlmIChmZCA8IDApCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNvY2tldCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorI2lmZGVmIFNPQ0tFVF9DTE9TRV9PTl9FWEVDCisjaWZkZWYgV0lOMzIKKyNpZm5kZWYgVU5ERVJfQ0UKKyAgU2V0SGFuZGxlSW5mb3JtYXRpb24oKEhBTkRMRSlmZCwgSEFORExFX0ZMQUdfSU5IRVJJVCwgMCk7CisjZW5kaWYKKyNlbHNlCisgIGZjbnRsKGZkLCBGX1NFVEZELCAxKTsKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+Y29ubmVjdF9mbGFncyAmIFNPX0xJTkdFUikKKyAgeyBzdHJ1Y3QgbGluZ2VyIGxpbmdlcjsKKyAgICBtZW1zZXQoKHZvaWQqKSZsaW5nZXIsIDAsIHNpemVvZihsaW5nZXIpKTsKKyAgICBsaW5nZXIubF9vbm9mZiA9IDE7CisgICAgbGluZ2VyLmxfbGluZ2VyID0gMDsKKyAgICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpZmQsIFNPTF9TT0NLRVQsIFNPX0xJTkdFUiwgKGNoYXIqKSZsaW5nZXIsIHNpemVvZihzdHJ1Y3QgbGluZ2VyKSkpCisgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX0xJTkdFUiBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorICB9CisgIGlmICgoc29hcC0+Y29ubmVjdF9mbGFncyAmIH5TT19MSU5HRVIpICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKWZkLCBTT0xfU09DS0VULCBzb2FwLT5jb25uZWN0X2ZsYWdzICYgflNPX0xJTkdFUiwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBpZiAoc29hcC0+a2VlcF9hbGl2ZSAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClmZCwgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX0tFRVBBTElWRSBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpZmQsIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwgKGNoYXIqKSZsZW4sIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19TTkRCVUYgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKWZkLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsIChjaGFyKikmbGVuLCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fUkNWQlVGIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisjaWZkZWYgVENQX05PREVMQVkKKyAgaWYgKCEoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpZmQsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBUQ1BfTk9ERUxBWSBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorI2VuZGlmCisjZW5kaWYKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk9wZW5pbmcgc29ja2V0ICVkIHRvIGhvc3Q9JyVzJyBwb3J0PSVkXG4iLCBmZCwgaG9zdCwgcG9ydCkpOworI2lmbmRlZiBXSVRIX0lQVjYKKyAgc29hcC0+cGVlcmxlbiA9IHNpemVvZihzb2FwLT5wZWVyKTsKKyAgbWVtc2V0KCh2b2lkKikmc29hcC0+cGVlciwgMCwgc2l6ZW9mKHNvYXAtPnBlZXIpKTsKKyAgc29hcC0+cGVlci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgc29hcC0+ZXJybW9kZSA9IDI7CisgIGlmIChzb2FwLT5wcm94eV9ob3N0KQorICB7IGlmIChzb2FwLT5mcmVzb2x2ZShzb2FwLCBzb2FwLT5wcm94eV9ob3N0LCAmc29hcC0+cGVlci5zaW5fYWRkcikpCisgICAgeyBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiZ2V0IHByb3h5IGhvc3QgYnkgbmFtZSBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorICAgIHNvYXAtPnBlZXIuc2luX3BvcnQgPSBodG9ucygoc2hvcnQpc29hcC0+cHJveHlfcG9ydCk7CisgIH0KKyAgZWxzZQorICB7IGlmIChzb2FwLT5mcmVzb2x2ZShzb2FwLCBob3N0LCAmc29hcC0+cGVlci5zaW5fYWRkcikpCisgICAgeyBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiZ2V0IGhvc3QgYnkgbmFtZSBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorICAgIHNvYXAtPnBlZXIuc2luX3BvcnQgPSBodG9ucygoc2hvcnQpcG9ydCk7CisgIH0KKyAgc29hcC0+ZXJybW9kZSA9IDA7CisgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgcmV0dXJuIGZkOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0KQorI2lmIGRlZmluZWQoV0lOMzIpCisgIHsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sICZub25ibG9ja2luZyk7CisgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgeyB1X2xvbmcgbm9uYmxvY2tpbmcgPSAxOworICAgIGlvY3RsKChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgKGludCkoJm5vbmJsb2NraW5nKSk7IC8qIG1vZGlmaWVkIHRvIHVzZSBmZCAqLworICB9CisjZWxzZQorICAgIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX0dFVEZMKXxPX05PTkJMT0NLKTsKKyNlbmRpZgorICBlbHNlCisjaWYgZGVmaW5lZChXSU4zMikKKyAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgJmJsb2NraW5nKTsKKyAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgaW9jdGwoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAoaW50KSgmYmxvY2tpbmcpKTsKKyAgfQorI2Vsc2UKKyAgICBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9HRVRGTCkmfk9fTk9OQkxPQ0spOworI2VuZGlmCisjZW5kaWYKKyAgZm9yICg7OykKKyAgeyAKKyNpZmRlZiBXSVRIX0lQVjYKKyAgICBpZiAoY29ubmVjdCgoU09BUF9TT0NLRVQpZmQsIHJlcy0+YWlfYWRkciwgcmVzLT5haV9hZGRybGVuKSkKKyNlbHNlCisgICAgaWYgKGNvbm5lY3QoKFNPQVBfU09DS0VUKWZkLCAoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlciwgc2l6ZW9mKHNvYXAtPnBlZXIpKSkKKyNlbmRpZgorICAgIHsgCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgaWYgKHNvYXAtPmNvbm5lY3RfdGltZW91dCAmJiAoc29hcF9zb2NrZXRfZXJybm8gPT0gU09BUF9FSU5QUk9HUkVTUyB8fCBzb2FwX3NvY2tldF9lcnJubyA9PSBTT0FQX0VXT1VMREJMT0NLKSkKKyAgICAgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgICAgU09BUF9TT0NLTEVOX1QgazsKKyAgICAgICAgZmRfc2V0IGZkczsKKyAgICAgICAgaWYgKHNvYXAtPmNvbm5lY3RfdGltZW91dCA+IDApCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSBzb2FwLT5jb25uZWN0X3RpbWVvdXQ7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSAtc29hcC0+Y29ubmVjdF90aW1lb3V0LzEwMDAwMDA7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gLXNvYXAtPmNvbm5lY3RfdGltZW91dCUxMDAwMDAwOworICAgICAgICB9CisgICAgICAgIEZEX1pFUk8oJmZkcyk7CisgICAgICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpZmQsICZmZHMpOworICAgICAgICBmb3IgKDs7KQorICAgICAgICB7IGludCByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoZmQgKyAxKSwgTlVMTCwgJmZkcywgTlVMTCwgJnRpbWVvdXQpOworICAgICAgICAgIGlmIChyID4gMCkKKwkgICAgYnJlYWs7CisgICAgICAgICAgaWYgKCFyKQorICAgICAgICAgIHsgc29hcC0+ZXJybnVtID0gMDsKKyAgICAgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29ubmVjdCB0aW1lb3V0XG4iKSk7CisgICAgICAgICAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgIlRpbWVvdXQiLCAiY29ubmVjdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSKQorICAgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBjb25uZWN0IHRvIGhvc3RcbiIpKTsKKyAgICAgICAgICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJjb25uZWN0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKwlrID0gKFNPQVBfU09DS0xFTl9UKXNpemVvZihzb2FwLT5lcnJudW0pOworICAgICAgICBpZiAoIWdldHNvY2tvcHQoKFNPQVBfU09DS0VUKWZkLCBTT0xfU09DS0VULCBTT19FUlJPUiwgKGNoYXIqKSZzb2FwLT5lcnJudW0sICZrKSAmJiAhc29hcC0+ZXJybnVtKQkvKiBwb3J0YWJpbGl0eSBub3RlOiBzZWUgU09BUF9TT0NLTEVOX1QgZGVmaW5pdGlvbiBpbiBzdGRzb2FwMi5oICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IGNvbm5lY3QgdG8gaG9zdFxuIikpOworICAgICAgICBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImNvbm5lY3QgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyNlbmRpZgorI2lmZGVmIFdJVEhfSVBWNgorICAgICAgaWYgKHJlcy0+YWlfbmV4dCkKKyAgICAgIHsgcmVzID0gcmVzLT5haV9uZXh0OworICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgaWYgKHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIpCisgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBjb25uZWN0IHRvIGhvc3RcbiIpKTsKKyAgICAgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImNvbm5lY3QgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyAgICB9ICAKKyAgICBlbHNlCisgICAgICBicmVhazsKKyAgfQorI2lmZGVmIFdJVEhfSVBWNgorICBzb2FwLT5wZWVybGVuID0gMDsgLyogSVB2NjogYWxyZWFkeSBjb25uZWN0ZWQgc28gdXNlIHNlbmQoKSAqLworICBmcmVlYWRkcmluZm8ocmVzc2F2ZSk7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQpCisjaWYgZGVmaW5lZChXSU4zMikKKyAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgJmJsb2NraW5nKTsKKyAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgaW9jdGwoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAoaW50KSgmYmxvY2tpbmcpKTsKKyAgfQorI2Vsc2UKKyAgICBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9HRVRGTCkmfk9fTk9OQkxPQ0spOworI2VuZGlmCisjZW5kaWYKKyAgc29hcC0+c29ja2V0ID0gZmQ7CisgIHNvYXAtPmltb2RlICY9IH5TT0FQX0VOQ19TU0w7CisgIHNvYXAtPm9tb2RlICY9IH5TT0FQX0VOQ19TU0w7CisgIGlmICghc3RybmNtcChlbmRwb2ludCwgImh0dHBzOiIsIDYpKQorICB7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgICAgQklPICpiaW87CisgICAgaW50IHI7CisgICAgaWYgKHNvYXAtPnByb3h5X2hvc3QpCisgICAgeyBzaG9ydCB2OworICAgICAgdW5zaWduZWQgaW50IGsgPSBzb2FwLT5vbW9kZTsgLyogbWFrZSBzdXJlIHdlIG9ubHkgcGFyc2UgSFRUUCAqLworICAgICAgc2l6ZV90IG4gPSBzb2FwLT5jb3VudDsgLyogc2F2ZSB0aGUgY29udGVudCBsZW5ndGggKi8KKyAgICAgIGNoYXIgKnVzZXJpZCwgKnBhc3N3ZDsKKyAgICAgIHNvYXAtPm9tb2RlICY9IH5TT0FQX0VOQzsgLyogbWFzayBJTyBhbmQgRU5DICovCisgICAgICBzb2FwLT5vbW9kZSB8PSBTT0FQX0lPX0JVRkZFUjsKKyAgICAgIHNvYXBfYmVnaW5fc2VuZChzb2FwKTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29ubmVjdGluZyB0byBwcm94eSBzZXJ2ZXJcbiIpKTsKKyAgICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiQ09OTkVDVCAlczolZCBIVFRQLyVzIiwgaG9zdCwgcG9ydCwgc29hcC0+aHR0cF92ZXJzaW9uKTsKKyAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCBzb2FwLT50bXBidWYsIE5VTEwpKSkKKyAgICAgIHsgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIGlmIChzb2FwLT5wcm94eV91c2VyaWQgJiYgc29hcC0+cHJveHlfcGFzc3dkICYmIHN0cmxlbihzb2FwLT5wcm94eV91c2VyaWQpICsgc3RybGVuKHNvYXAtPnByb3h5X3Bhc3N3ZCkgPCA3NjEpCisgICAgICB7IHNwcmludGYoc29hcC0+dG1wYnVmICsgMjYyLCAiJXM6JXMiLCBzb2FwLT5wcm94eV91c2VyaWQsIHNvYXAtPnByb3h5X3Bhc3N3ZCk7CisgICAgICAgIHN0cmNweShzb2FwLT50bXBidWYsICJCYXNpYyAiKTsKKyAgICAgICAgc29hcF9zMmJhc2U2NChzb2FwLCAoY29uc3QgdW5zaWduZWQgY2hhciopKHNvYXAtPnRtcGJ1ZiArIDI2MiksIHNvYXAtPnRtcGJ1ZiArIDYsIHN0cmxlbihzb2FwLT50bXBidWYgKyAyNjIpKTsKKyAgICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJQcm94eS1BdXRob3JpemF0aW9uIiwgc29hcC0+dG1wYnVmKSkpCisgICAgICAgIHsgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKyAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCBOVUxMLCBOVUxMKSkKKyAgICAgICB8fCBzb2FwX2ZsdXNoKHNvYXApKQorICAgICAgeyBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgICBzb2FwLT5vbW9kZSA9IGs7CisgICAgICBrID0gc29hcC0+aW1vZGU7CisgICAgICBzb2FwLT5pbW9kZSAmPSB+U09BUF9FTkM7IC8qIG1hc2sgSU8gYW5kIEVOQyAqLworICAgICAgdiA9IHNvYXAtPnZlcnNpb247IC8qIHByZXNlcnZlICovCisgICAgICB1c2VyaWQgPSBzb2FwLT51c2VyaWQ7IC8qIHByZXNlcnZlICovCisgICAgICBwYXNzd2QgPSBzb2FwLT5wYXNzd2Q7IC8qIHByZXNlcnZlICovCisgICAgICBpZiAoc29hcF9iZWdpbl9yZWN2KHNvYXApKQorICAgICAgeyBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgICBzb2FwLT51c2VyaWQgPSB1c2VyaWQ7IC8qIHJlc3RvcmUgKi8KKyAgICAgIHNvYXAtPnBhc3N3ZCA9IHBhc3N3ZDsgLyogcmVzdG9yZSAqLworICAgICAgc29hcC0+dmVyc2lvbiA9IHY7IC8qIHJlc3RvcmUgKi8KKyAgICAgIHNvYXAtPmltb2RlID0gazsgLyogcmVzdG9yZSAqLworICAgICAgc29hcC0+Y291bnQgPSBuOyAvKiByZXN0b3JlICovCisgICAgICBzb2FwX2JlZ2luX3NlbmQoc29hcCk7CisgICAgfQorICAgIGlmICghc29hcC0+Y3R4ICYmIChzb2FwLT5lcnJvciA9IHNvYXAtPmZzc2xhdXRoKHNvYXApKSkKKyAgICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIlNTTCBhdXRoZW50aWNhdGlvbiBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKTogY2hlY2sgcGFzc3dvcmQsIGtleSBmaWxlLCBhbmQgY2EgZmlsZS4iLCBTT0FQX1NTTF9FUlJPUik7CisgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgIH0KKyAgICBzb2FwLT5zc2wgPSBTU0xfbmV3KHNvYXAtPmN0eCk7CisgICAgaWYgKCFzb2FwLT5zc2wpCisgICAgeyBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9TU0xfRVJST1I7CisgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisgICAgaWYgKHNvYXAtPnNlc3Npb24pCisgICAgeyBpZiAoIXN0cmNtcChzb2FwLT5zZXNzaW9uX2hvc3QsIGhvc3QpICYmIHNvYXAtPnNlc3Npb25fcG9ydCA9PSBwb3J0KQorICAgICAgICBTU0xfc2V0X3Nlc3Npb24oc29hcC0+c3NsLCBzb2FwLT5zZXNzaW9uKTsKKyAgICAgIFNTTF9TRVNTSU9OX2ZyZWUoc29hcC0+c2Vzc2lvbik7CisgICAgICBzb2FwLT5zZXNzaW9uID0gTlVMTDsKKyAgICB9CisgICAgc29hcC0+aW1vZGUgfD0gU09BUF9FTkNfU1NMOworICAgIHNvYXAtPm9tb2RlIHw9IFNPQVBfRU5DX1NTTDsKKyAgICBiaW8gPSBCSU9fbmV3X3NvY2tldCgoU09BUF9TT0NLRVQpZmQsIEJJT19OT0NMT1NFKTsKKyAgICBTU0xfc2V0X2Jpbyhzb2FwLT5zc2wsIGJpbywgYmlvKTsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKHNvYXAtPmNvbm5lY3RfdGltZW91dCkKKyNpZiBkZWZpbmVkKFdJTjMyKQorICAgIHsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgJm5vbmJsb2NraW5nKTsKKyAgICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgICAgeyB1X2xvbmcgbm9uYmxvY2tpbmcgPSAxOworICAgICAgaW9jdGwoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAoaW50KSgmbm9uYmxvY2tpbmcpKTsKKyAgICB9CisjZWxzZQorICAgICAgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfR0VURkwpfE9fTk9OQkxPQ0spOworI2VuZGlmCisjZW5kaWYKKyAgICBmb3IgKDs7KQorICAgIHsgaWYgKChyID0gU1NMX2Nvbm5lY3Qoc29hcC0+c3NsKSkgPD0gMCkKKyAgICAgIHsgaW50IGVyciA9IFNTTF9nZXRfZXJyb3Ioc29hcC0+c3NsLCByKTsKKyAgICAgICAgaWYgKGVyciAhPSBTU0xfRVJST1JfTk9ORSAmJiBlcnIgIT0gU1NMX0VSUk9SX1dBTlRfUkVBRCAmJiBlcnIgIT0gU1NMX0VSUk9SX1dBTlRfV1JJVEUpCisgICAgICAgIHsgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHNzbF9lcnJvcihzb2FwLCByKSwgIlNTTCBjb25uZWN0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9TU0xfRVJST1IpOworICAgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICB9CisgICAgICAgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQpCisgICAgICAgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgICAgICBmZF9zZXQgZmRzOworICAgICAgICAgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQgPiAwKQorICAgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSBzb2FwLT5jb25uZWN0X3RpbWVvdXQ7CisgICAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IC1zb2FwLT5jb25uZWN0X3RpbWVvdXQvMTAwMDAwMDsKKyAgICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IC1zb2FwLT5jb25uZWN0X3RpbWVvdXQlMTAwMDAwMDsKKyAgICAgICAgICB9CisgICAgICAgICAgRkRfWkVSTygmZmRzKTsKKyAgICAgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKWZkLCAmZmRzKTsKKyAgICAgICAgICBmb3IgKDs7KQorICAgICAgICAgIHsgaW50IHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShmZCArIDEpLCAmZmRzLCBOVUxMLCAmZmRzLCAmdGltZW91dCk7CisgICAgICAgICAgICBpZiAociA+IDApCisJICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoIXIpCisgICAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IDA7CisgICAgICAgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29ubmVjdCB0aW1lb3V0XG4iKSk7CisgICAgICAgICAgICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCAiVGltZW91dCIsICJjb25uZWN0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCSAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKHNvYXAtPmNvbm5lY3RfdGltZW91dCkKKyNpZmRlZiBXSU4zMgorICAgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgJmJsb2NraW5nKTsKKyAgICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgICAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgICAgaW9jdGwoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAoaW50KSgmYmxvY2tpbmcpKTsKKyAgICB9CisjZWxzZQorICAgICAgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfR0VURkwpJn5PX05PTkJMT0NLKTsKKyNlbmRpZgorI2VuZGlmCisgICAgaWYgKHNvYXAtPnJlcXVpcmVfc2VydmVyX2F1dGgpCisgICAgeyBYNTA5ICpwZWVyOworICAgICAgaW50IGVycjsKKyAgICAgIGlmICgoZXJyID0gU1NMX2dldF92ZXJpZnlfcmVzdWx0KHNvYXAtPnNzbCkpICE9IFg1MDlfVl9PSykKKyAgICAgIHsgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIFg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKGVyciksICJTU0wgY2VydGlmaWNhdGUgcHJlc2VudGVkIGJ5IHBlZXIgY2Fubm90IGJlIHZlcmlmaWVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyAgICAgIHBlZXIgPSBTU0xfZ2V0X3BlZXJfY2VydGlmaWNhdGUoc29hcC0+c3NsKTsKKyAgICAgIGlmICghcGVlcikKKyAgICAgIHsgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiTm8gU1NMIGNlcnRpZmljYXRlIHdhcyBwcmVzZW50ZWQgYnkgdGhlIHBlZXIgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgICAgWDUwOV9OQU1FX2dldF90ZXh0X2J5X05JRChYNTA5X2dldF9zdWJqZWN0X25hbWUocGVlciksIE5JRF9jb21tb25OYW1lLCBzb2FwLT5tc2didWYsIHNpemVvZihzb2FwLT5tc2didWYpKTsKKyAgICAgIFg1MDlfZnJlZShwZWVyKTsKKyAgICAgIGlmIChzb2FwX3RhZ19jbXAoc29hcC0+bXNnYnVmLCBob3N0KSkKKyAgICAgIHsgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiU1NMIGNlcnRpZmljYXRlIGhvc3QgbmFtZSBtaXNtYXRjaCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9TU0xfRVJST1IpOworICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfU1NMX0VSUk9SOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworI2VuZGlmCisgIH0KKyAgcmV0dXJuIGZkOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JpbmQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmhvc3QsIGludCBwb3J0LCBpbnQgYmFja2xvZykKK3sKKyNpZmRlZiBXSVRIX0lQVjYKKyAgc3RydWN0IGFkZHJpbmZvICphZGRyaW5mbyA9IE5VTEw7CisgIHN0cnVjdCBhZGRyaW5mbyBoaW50czsKKyAgc3RydWN0IGFkZHJpbmZvIHJlczsKKyAgaW50IGVycjsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaW50IGxlbiA9IFNPQVBfQlVGTEVOOworICBpbnQgc2V0ID0gMTsKKyNlbmRpZgorICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSkKKyAgeyBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKXNvYXAtPm1hc3Rlcik7CisgICAgc29hcC0+bWFzdGVyID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBzb2FwLT5zb2NrZXQgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICBzb2FwLT5lcnJtb2RlID0gMTsKKyAgaWYgKHRjcF9pbml0KHNvYXApKQorICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgIlRDUCBpbml0IGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorI2lmZGVmIFdJVEhfSVBWNgorICBtZW1zZXQoKHZvaWQqKSZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisgIGhpbnRzLmFpX2ZhbWlseSA9IFBGX1VOU1BFQzsKKyNpZmRlZiBXSVRIX1VEUAorICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19ER1JBTTsKKyAgZWxzZQorI2VuZGlmCisgICAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKyAgaGludHMuYWlfZmxhZ3MgPSBBSV9QQVNTSVZFOworICBzb2FwLT5lcnJtb2RlID0gMjsKKyAgZXJyID0gZ2V0YWRkcmluZm8oaG9zdCwgc29hcF9pbnQycyhzb2FwLCBwb3J0KSwgJmhpbnRzLCAmYWRkcmluZm8pOworICBpZiAoYWRkcmluZm8pCisgIHsgcmVzID0gKmFkZHJpbmZvOworICAgIHNvYXAtPnBlZXIgPSAqKChzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSopYWRkcmluZm8tPmFpX2FkZHIpOworICAgIHNvYXAtPnBlZXJsZW4gPSBhZGRyaW5mby0+YWlfYWRkcmxlbjsKKyAgICByZXMuYWlfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyOworICAgIHJlcy5haV9hZGRybGVuID0gc29hcC0+cGVlcmxlbjsKKyAgICBmcmVlYWRkcmluZm8oYWRkcmluZm8pOworICB9CisgIGlmIChlcnIpCisgIHsgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgZ2FpX3N0cmVycm9yKGVyciksICJnZXRhZGRyaW5mbyBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgc29hcC0+bWFzdGVyID0gc29ja2V0KHJlcy5haV9mYW1pbHksIHJlcy5haV9zb2NrdHlwZSwgcmVzLmFpX3Byb3RvY29sKTsKKyNlbHNlCisjaWZkZWYgV0lUSF9VRFAKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICBzb2FwLT5tYXN0ZXIgPSAoaW50KXNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKyAgZWxzZQorI2VuZGlmCisgICAgc29hcC0+bWFzdGVyID0gKGludClzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOworI2VuZGlmCisgIHNvYXAtPmVycm1vZGUgPSAwOworICBpZiAoIXNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic29ja2V0IGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorI2lmZGVmIFdJVEhfVURQCisgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgc29hcC0+c29ja2V0ID0gc29hcC0+bWFzdGVyOworI2VuZGlmCisjaWZkZWYgU09DS0VUX0NMT1NFX09OX0VYRUMKKyNpZmRlZiBXSU4zMgorI2lmbmRlZiBVTkRFUl9DRQorICBTZXRIYW5kbGVJbmZvcm1hdGlvbigoSEFORExFKXNvYXAtPm1hc3RlciwgSEFORExFX0ZMQUdfSU5IRVJJVCwgMCk7CisjZW5kaWYKKyNlbHNlCisgIGZjbnRsKHNvYXAtPm1hc3RlciwgRl9TRVRGRCwgMSk7CisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPmJpbmRfZmxhZ3MgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBTT0xfU09DS0VULCBzb2FwLT5iaW5kX2ZsYWdzLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIGlmICgoKHNvYXAtPmltb2RlIHwgc29hcC0+b21vZGUpICYgU09BUF9JT19LRUVQQUxJVkUpICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fS0VFUEFMSVZFIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBTT0xfU09DS0VULCBTT19TTkRCVUYsIChjaGFyKikmbGVuLCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19TTkRCVUYgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIGlmIChzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgKGNoYXIqKSZsZW4sIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX1JDVkJVRiBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNpZmRlZiBUQ1BfTk9ERUxBWQorICBpZiAoIShzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFRDUF9OT0RFTEFZIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBXSVRIX0lQVjYKKyAgc29hcC0+ZXJybW9kZSA9IDA7CisgIGlmIChiaW5kKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIHJlcy5haV9hZGRyLCByZXMuYWlfYWRkcmxlbikpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgYmluZCB0byBob3N0XG4iKSk7CisgICAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiYmluZCBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0gIAorI2Vsc2UKKyAgc29hcC0+cGVlcmxlbiA9IHNpemVvZihzb2FwLT5wZWVyKTsKKyAgbWVtc2V0KCh2b2lkKikmc29hcC0+cGVlciwgMCwgc2l6ZW9mKHNvYXAtPnBlZXIpKTsKKyAgc29hcC0+cGVlci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgc29hcC0+ZXJybW9kZSA9IDI7CisgIGlmIChob3N0KQorICB7IGlmIChzb2FwLT5mcmVzb2x2ZShzb2FwLCBob3N0LCAmc29hcC0+cGVlci5zaW5fYWRkcikpCisgICAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJnZXQgaG9zdCBieSBuYW1lIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgIH0KKyAgfQorICBlbHNlCisgICAgc29hcC0+cGVlci5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfQU5ZKTsKKyAgc29hcC0+cGVlci5zaW5fcG9ydCA9IGh0b25zKChzaG9ydClwb3J0KTsKKyAgc29hcC0+ZXJybW9kZSA9IDA7CisgIGlmIChiaW5kKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyLCBzb2FwLT5wZWVybGVuKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBiaW5kIHRvIGhvc3RcbiIpKTsKKyAgICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJiaW5kIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorI2VuZGlmCisgIGlmICghKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApICYmIGxpc3RlbigoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBiYWNrbG9nKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBiaW5kIHRvIGhvc3RcbiIpKTsKKyAgICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJsaXN0ZW4gZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9ICAKKyAgcmV0dXJuIHNvYXAtPm1hc3RlcjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wb2xsKHN0cnVjdCBzb2FwICpzb2FwKQoreyAKKyNpZm5kZWYgV0lUSF9MRUFOCisgIHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgIGZkX3NldCByZmQsIHNmZCwgeGZkOworICBpbnQgcjsKKyAgdGltZW91dC50dl9zZWMgPSAwOworICB0aW1lb3V0LnR2X3VzZWMgPSAwOworICBGRF9aRVJPKCZyZmQpOworICBGRF9aRVJPKCZzZmQpOworICBGRF9aRVJPKCZ4ZmQpOworICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgeyBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnJmZCk7CisgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZzZmQpOworICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmeGZkKTsKKyAgICByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksICZyZmQsICZzZmQsICZ4ZmQsICZ0aW1lb3V0KTsKKyAgICBpZiAociA+IDAgJiYgRkRfSVNTRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnhmZCkpCisgICAgICByID0gLTE7CisgIH0KKyAgZWxzZSBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSkKKyAgeyBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgJnNmZCk7CisgICAgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPm1hc3RlciArIDEpLCBOVUxMLCAmc2ZkLCBOVUxMLCAmdGltZW91dCk7CisgIH0KKyAgZWxzZQorICAgIHJldHVybiBTT0FQX09LOworICBpZiAociA+IDApCisgIHsKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICBpZiAoc29hcC0+aW1vZGUgJiBTT0FQX0VOQ19TU0wpCisgICAgeworICAgICAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkKKyAgICAgICAmJiBGRF9JU1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmc2ZkKQorICAgICAgICYmICghRkRfSVNTRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnJmZCkKKyAgICAgICAgfHwgU1NMX3BlZWsoc29hcC0+c3NsLCBzb2FwLT50bXBidWYsIDEpID4gMCkpCisgICAgICAgIHJldHVybiBTT0FQX09LOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICAgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpCisgICAgICAgJiYgRkRfSVNTRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnNmZCkKKyAgICAgICAmJiAoIUZEX0lTU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZyZmQpCisgICAgICAgIHx8IHJlY3YoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgc29hcC0+dG1wYnVmLCAxLCBNU0dfUEVFSykgPiAwKSkKKyAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgZWxzZSBpZiAociA8IDApCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgaWYgKChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpIHx8IHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIpCisgICAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZWxlY3QgZmFpbGVkIGluIHNvYXBfcG9sbCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9UQ1BfRVJST1I7CisgICAgfQorICB9CisgIGVsc2UKKyAgICBzb2FwLT5lcnJudW0gPSAwOworICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiUG9sbGluZzogb3RoZXIgZW5kIGRvd24gb24gc29ja2V0PSVkIHNlbGVjdD0lZFxuIiwgc29hcC0+c29ja2V0LCByKSk7CisgIHJldHVybiBTT0FQX0VPRjsKKyNlbHNlCisgIHJldHVybiBTT0FQX09LOworI2VuZGlmCit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Cit0Y3BfYWNjZXB0KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgcywgc3RydWN0IHNvY2thZGRyICphLCBpbnQgKm4pCit7IGludCBmZDsKKyAgZmQgPSAoaW50KWFjY2VwdCgoU09BUF9TT0NLRVQpcywgYSwgKFNPQVBfU09DS0xFTl9UKiluKTsJLyogcG9ydGFiaWxpdHkgbm90ZTogc2VlIFNPQVBfU09DS0xFTl9UIGRlZmluaXRpb24gaW4gc3Rkc29hcDIuaCAqLworI2lmZGVmIFNPQ0tFVF9DTE9TRV9PTl9FWEVDCisjaWZkZWYgV0lOMzIKKyNpZm5kZWYgVU5ERVJfQ0UKKyAgU2V0SGFuZGxlSW5mb3JtYXRpb24oKEhBTkRMRSlmZCwgSEFORExFX0ZMQUdfSU5IRVJJVCwgMCk7CisjZW5kaWYKKyNlbHNlCisgIGZjbnRsKGZkLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKKyNlbmRpZgorI2VuZGlmCisgIHJldHVybiBmZDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9hY2NlcHQoc3RydWN0IHNvYXAgKnNvYXApCit7IGludCBuID0gKGludClzaXplb2Yoc29hcC0+cGVlcik7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpbnQgbGVuID0gU09BUF9CVUZMRU47CisgIGludCBzZXQgPSAxOworI2VuZGlmCisgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyNpZmRlZiBXSVRIX1VEUAorICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIHJldHVybiBzb2FwLT5zb2NrZXQgPSBzb2FwLT5tYXN0ZXI7CisjZW5kaWYKKyAgbWVtc2V0KCh2b2lkKikmc29hcC0+cGVlciwgMCwgc2l6ZW9mKHNvYXAtPnBlZXIpKTsKKyAgc29hcC0+c29ja2V0ID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgc29hcC0+ZXJybW9kZSA9IDA7CisgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOworICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSkKKyAgeyBmb3IgKDs7KQorICAgIHsgCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgaWYgKHNvYXAtPmFjY2VwdF90aW1lb3V0KQorICAgICAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgICAgICBmZF9zZXQgZmQ7CisgICAgICAgIGlmIChzb2FwLT5hY2NlcHRfdGltZW91dCA+IDApCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSBzb2FwLT5hY2NlcHRfdGltZW91dDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IC1zb2FwLT5hY2NlcHRfdGltZW91dC8xMDAwMDAwOworICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IC1zb2FwLT5hY2NlcHRfdGltZW91dCUxMDAwMDAwOworICAgICAgICB9CisgICAgICAgIEZEX1pFUk8oJmZkKTsKKyAgICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsICZmZCk7CisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsgaW50IHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5tYXN0ZXIgKyAxKSwgJmZkLCAmZmQsIE5VTEwsICZ0aW1lb3V0KTsKKyAgICAgICAgICBpZiAociA+IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBpZiAoIXIpCisgICAgICAgICAgeyBzb2FwLT5lcnJudW0gPSAwOworICAgICAgICAgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlRpbWVvdXQiLCAiYWNjZXB0IGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSKQorICAgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJhY2NlcHQgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyNpZiBkZWZpbmVkKFdJTjMyKQorCXsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICAgICAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGSU9OQklPLCAmbm9uYmxvY2tpbmcpOworICAgICAgICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgICAgICAgIHsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICAgICAgICBpb2N0bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGSU9OQklPLCAoaW50KSgmbm9uYmxvY2tpbmcpKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRl9HRVRGTCl8T19OT05CTE9DSyk7CisjZW5kaWYKKyAgICAgIH0KKyAgICAgIGVsc2UKKyNpZiBkZWZpbmVkKFdJTjMyKQorICAgICAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgICAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGSU9OQklPLCAmYmxvY2tpbmcpOworICAgICAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICAgICAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgICAgICBpb2N0bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGSU9OQklPLCAoaW50KSgmYmxvY2tpbmcpKTsKKyAgICAgIH0KKyNlbHNlCisgICAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfR0VURkwpJn5PX05PTkJMT0NLKTsKKyNlbmRpZgorI2VuZGlmCisgICAgICBzb2FwLT5zb2NrZXQgPSBzb2FwLT5mYWNjZXB0KHNvYXAsIHNvYXAtPm1hc3RlciwgKHN0cnVjdCBzb2NrYWRkciopJnNvYXAtPnBlZXIsICZuKTsKKyAgICAgIHNvYXAtPnBlZXJsZW4gPSAoc2l6ZV90KW47CisgICAgICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgICAgIHsKKyNpZmRlZiBXSVRIX0lQVjYKKy8qIFVzZSBzb2FwLT5ob3N0IHRvIHN0b3JlIHRoZSBudW1lcmljIGZvcm0gb2YgdGhlIHJlbW90ZSBob3N0ICovCisgICAgICAgIGdldG5hbWVpbmZvKChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyLCBuLCBzb2FwLT5ob3N0LCBzaXplb2Yoc29hcC0+aG9zdCksIE5VTEwsIDAsIE5JX05VTUVSSUNIT1NUIHwgTklfTlVNRVJJQ1NFUlYpOyAKKyAgICAgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFjY2VwdCBzb2NrZXQgJWQgZnJvbSAlc1xuIiwgc29hcC0+c29ja2V0LCBzb2FwLT5ob3N0KSk7CisgICAgICAgIHNvYXAtPmlwID0gMDsgLyogaW5mbyBzdG9yZWQgaW4gc29hcC0+cGVlciBhbmQgc29hcC0+aG9zdCAqLworICAgICAgICBzb2FwLT5wb3J0ID0gMDsgLyogaW5mbyBzdG9yZWQgaW4gc29hcC0+cGVlciBhbmQgc29hcC0+aG9zdCAqLworI2Vsc2UKKyAgICAgICAgc29hcC0+aXAgPSBudG9obChzb2FwLT5wZWVyLnNpbl9hZGRyLnNfYWRkcik7CisgICAgICAgIHNvYXAtPnBvcnQgPSAoaW50KW50b2hzKHNvYXAtPnBlZXIuc2luX3BvcnQpOyAvKiBkb2VzIG5vdCByZXR1cm4gcG9ydCBudW1iZXIgb24gc29tZSBzeXN0ZW1zICovCisgICAgICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJBY2NlcHQgc29ja2V0ICVkIGF0IHBvcnQgJWQgZnJvbSBJUCAlZC4lZC4lZC4lZFxuIiwgc29hcC0+c29ja2V0LCBzb2FwLT5wb3J0LCAoaW50KShzb2FwLT5pcD4+MjQpJjB4RkYsIChpbnQpKHNvYXAtPmlwPj4xNikmMHhGRiwgKGludCkoc29hcC0+aXA+PjgpJjB4RkYsIChpbnQpc29hcC0+aXAmMHhGRikpOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorCWlmIChzb2FwLT5hY2NlcHRfZmxhZ3MgJiBTT19MSU5HRVIpCisgICAgICAgIHsgc3RydWN0IGxpbmdlciBsaW5nZXI7CisgICAgICAgICAgbWVtc2V0KCh2b2lkKikmbGluZ2VyLCAwLCBzaXplb2YobGluZ2VyKSk7CisgICAgICAgICAgbGluZ2VyLmxfb25vZmYgPSAxOworICAgICAgICAgIGxpbmdlci5sX2xpbmdlciA9IDA7CisJICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBTT0xfU09DS0VULCBTT19MSU5HRVIsIChjaGFyKikmbGluZ2VyLCBzaXplb2Yoc3RydWN0IGxpbmdlcikpKQorICAgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisJICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fTElOR0VSIGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworCSAgICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworCSAgfQorICAgICAgICB9CisgICAgICAgIGlmICgoc29hcC0+YWNjZXB0X2ZsYWdzICYgflNPX0xJTkdFUikgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBTT0xfU09DS0VULCBzb2FwLT5hY2NlcHRfZmxhZ3MgJiB+U09fTElOR0VSLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisJICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKChzb2FwLT5pbW9kZSB8IHNvYXAtPm9tb2RlKSAmIFNPQVBfSU9fS0VFUEFMSVZFKSAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX0tFRVBBTElWRSBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKwkgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICB9CisgICAgICAgIGlmIChzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwgKGNoYXIqKSZsZW4sIHNpemVvZihpbnQpKSkKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX1NOREJVRiBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKwkgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICB9CisgICAgICAgIGlmIChzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgKGNoYXIqKSZsZW4sIHNpemVvZihpbnQpKSkKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX1JDVkJVRiBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKwkgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICB9CisjaWZkZWYgVENQX05PREVMQVkKKyAgICAgICAgaWYgKCEoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBUQ1BfTk9ERUxBWSBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKwkgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICB9CisjZW5kaWYKKyNlbmRpZgorICAgICAgICBpZiAoc29hcC0+YWNjZXB0X3RpbWVvdXQpCisgICAgICAgIHsKKyNpZiBkZWZpbmVkKFdJTjMyKQorICAgICAgICAgIHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgICAgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRklPTkJJTywgJmJsb2NraW5nKTsKKyAgICAgICAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGSU9OQklPLCAmYmxvY2tpbmcpOworI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICAgICAgICAgIHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgICAgICAgaW9jdGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRklPTkJJTywgKGludCkoJmJsb2NraW5nKSk7CisgICAgICAgICAgaW9jdGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRklPTkJJTywgKGludCkoJmJsb2NraW5nKSk7CisjZWxpZiBkZWZpbmVkKFBBTE0pCisgICAgICAgICAgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRl9HRVRGTCwwKSZ+T19OT05CTE9DSyk7CisgICAgICAgICAgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRl9HRVRGTCwwKSZ+T19OT05CTE9DSyk7CisjZWxpZiBkZWZpbmVkKFNZTUJJQU4pCisgICAgICAgICAgbG9uZyBibG9ja2luZyA9IDA7CisgICAgICAgICAgaW9jdGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgMC8qRklPTkJJTyovLCAmYmxvY2tpbmcpOworI2Vsc2UKKyAgICAgICAgICBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGX0dFVEZMKSZ+T19OT05CTE9DSyk7CisgICAgICAgICAgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRl9HRVRGTCkmfk9fTk9OQkxPQ0spOworI2VuZGlmCisJfQorICAgICAgICBzb2FwLT5rZWVwX2FsaXZlID0gKCgoc29hcC0+aW1vZGUgfCBzb2FwLT5vbW9kZSkgJiBTT0FQX0lPX0tFRVBBTElWRSkgIT0gMCk7CisgICAgICAgIHJldHVybiBzb2FwLT5zb2NrZXQ7CisgICAgICB9CisgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUiAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VBR0FJTikKKyAgICAgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFjY2VwdCBmYWlsZWQgZnJvbSAlc1xuIiwgc29hcC0+aG9zdCkpOworICAgICAgICBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiYWNjZXB0IGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworCXNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZQorICB7IHNvYXAtPmVycm51bSA9IDA7CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAibm8gbWFzdGVyIHNvY2tldCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Cit0Y3BfZGlzY29ubmVjdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgaWYgKHNvYXAtPnNzbCkKKyAgeyBpbnQgciwgcyA9IDA7CisgICAgaWYgKHNvYXAtPnNlc3Npb24pCisgICAgICBTU0xfU0VTU0lPTl9mcmVlKHNvYXAtPnNlc3Npb24pOworICAgIGlmICgqc29hcC0+aG9zdCkKKyAgICB7IHNvYXAtPnNlc3Npb24gPSBTU0xfZ2V0MV9zZXNzaW9uKHNvYXAtPnNzbCk7CisgICAgICBpZiAoc29hcC0+c2Vzc2lvbikKKyAgICAgIHsgc3RyY3B5KHNvYXAtPnNlc3Npb25faG9zdCwgc29hcC0+aG9zdCk7CisgICAgICAgIHNvYXAtPnNlc3Npb25fcG9ydCA9IHNvYXAtPnBvcnQ7CisgICAgICB9CisgICAgfQorICAgIHIgPSBTU0xfc2h1dGRvd24oc29hcC0+c3NsKTsKKyAgICBpZiAociAhPSAxKQorICAgIHsgcyA9IEVSUl9nZXRfZXJyb3IoKTsKKyAgICAgIGlmIChzKQorICAgICAgeyBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgICAgICAgeyBzb2FwLT5mc2h1dGRvd25zb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgMSk7CisgICAgICAgICAgc29hcC0+c29ja2V0ID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgfQorICAgICAgICByID0gU1NMX3NodXRkb3duKHNvYXAtPnNzbCk7CisgICAgICB9CisgICAgfQorICAgIERCR0xPRyhURVNULCBpZiAocykgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNodXRkb3duIGZhaWxlZDogJWRcbiIsIFNTTF9nZXRfZXJyb3Ioc29hcC0+c3NsLCByKSkpOworICAgIFNTTF9mcmVlKHNvYXAtPnNzbCk7CisgICAgc29hcC0+c3NsID0gTlVMTDsKKyAgICBpZiAocykKKyAgICAgIHJldHVybiBTT0FQX1NTTF9FUlJPUjsKKyAgICBFUlJfcmVtb3ZlX3N0YXRlKDApOworICB9CisjZW5kaWYKKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkgJiYgIShzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgeyBzb2FwLT5mc2h1dGRvd25zb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgMik7CisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQpOworICAgIHNvYXAtPnNvY2tldCA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Cit0Y3BfY2xvc2Vzb2NrZXQoc3RydWN0IHNvYXAgKnNvYXAsIFNPQVBfU09DS0VUIGZkKQoreyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNsb3NlIHNvY2tldCAlZFxuIiwgKGludClmZCkpOworICByZXR1cm4gY2xvc2Vzb2NrZXQoZmQpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAordGNwX3NodXRkb3duc29ja2V0KHN0cnVjdCBzb2FwICpzb2FwLCBTT0FQX1NPQ0tFVCBmZCwgaW50IGhvdykKK3sgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTaHV0ZG93biBzb2NrZXQgJWQgaG93PSVkXG4iLCAoaW50KWZkLCBob3cpKTsKKyAgcmV0dXJuIHNodXRkb3duKGZkLCBob3cpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfY2xvc2Vzb2NrKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgc3RhdHVzID0gc29hcC0+ZXJyb3I7CisgIGlmIChzdGF0dXMgPT0gU09BUF9FT0YgfHwgc3RhdHVzID09IFNPQVBfVENQX0VSUk9SIHx8IHN0YXR1cyA9PSBTT0FQX1NTTF9FUlJPUiB8fCAhc29hcC0+a2VlcF9hbGl2ZSkKKyAgeyBpZiAoc29hcC0+ZmNsb3NlICYmIChzb2FwLT5lcnJvciA9IHNvYXAtPmZjbG9zZShzb2FwKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7CisgIH0KKyNpZmRlZiBXSVRIX1pMSUIKKyAgaWYgKHNvYXAtPnpsaWJfc3RhdGUgPT0gU09BUF9aTElCX0RFRkxBVEUpCisgICAgZGVmbGF0ZUVuZCgmc29hcC0+ZF9zdHJlYW0pOworICBlbHNlIGlmIChzb2FwLT56bGliX3N0YXRlID09IFNPQVBfWkxJQl9JTkZMQVRFKQorICAgIGluZmxhdGVFbmQoJnNvYXAtPmRfc3RyZWFtKTsKKyAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9OT05FOworI2VuZGlmCisgIHJldHVybiBzb2FwLT5lcnJvciA9IHN0YXR1czsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitzaXplX3QKK1NPQVBfRk1BQzIKK3NvYXBfaGFzaChyZWdpc3RlciBjb25zdCBjaGFyICpzKQoreyByZWdpc3RlciBzaXplX3QgaCA9IDA7CisgIHdoaWxlICgqcykKKyAgICBoID0gNjU1OTkqaCArICpzKys7CisgIHJldHVybiBoICUgU09BUF9JREhBU0g7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZAorc29hcF9pbml0X3BodChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5pdGlhbGl6aW5nIHBvaW50ZXIgaGFzaHRhYmxlXG4iKSk7CisgIHNvYXAtPnBibGsgPSBOVUxMOworICBzb2FwLT5waWR4ID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IChpbnQpU09BUF9QVFJIQVNIOyBpKyspCisgICAgc29hcC0+cGh0W2ldID0gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc3RydWN0IHNvYXAqCitTT0FQX0ZNQUMyCitzb2FwX25ldzEoc29hcF9tb2RlIG1vZGUpCit7IHJldHVybiBzb2FwX25ldzIobW9kZSwgbW9kZSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcCoKK1NPQVBfRk1BQzIKK3NvYXBfbmV3KCkKK3sgcmV0dXJuIHNvYXBfbmV3MihTT0FQX0lPX0RFRkFVTFQsIFNPQVBfSU9fREVGQVVMVCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcCoKK1NPQVBfRk1BQzIKK3NvYXBfbmV3Mihzb2FwX21vZGUgaW1vZGUsIHNvYXBfbW9kZSBvbW9kZSkKK3sgc3RydWN0IHNvYXAgKnNvYXAgPSAoc3RydWN0IHNvYXAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHNvYXApKTsKKyAgaWYgKHNvYXApCisgICAgc29hcF9pbml0Mihzb2FwLCBpbW9kZSwgb21vZGUpOworICByZXR1cm4gc29hcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZGVsKHN0cnVjdCBzb2FwICpzb2FwKQoreyBmcmVlKHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyB2b2lkCitzb2FwX2ZyZWVfcGh0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wYmxrICpwYiwgKm5leHQ7CisgIHJlZ2lzdGVyIGludCBpOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWUgcG9pbnRlciBoYXNodGFibGVcbiIpKTsKKyAgZm9yIChwYiA9IHNvYXAtPnBibGs7IHBiOyBwYiA9IG5leHQpCisgIHsgbmV4dCA9IHBiLT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBwYik7CisgIH0KKyAgc29hcC0+cGJsayA9IE5VTEw7CisgIHNvYXAtPnBpZHggPSAwOworICBmb3IgKGkgPSAwOyBpIDwgKGludClTT0FQX1BUUkhBU0g7IGkrKykKKyAgICBzb2FwLT5waHRbaV0gPSBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VtYmVkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGNvbnN0IGNoYXIgKnRhZywgaW50IHR5cGUpCit7IHJlZ2lzdGVyIGludCBpOworICBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgIGlmIChzb2FwLT52ZXJzaW9uICE9IDEpCisgICAgc29hcC0+ZW5jb2RpbmcgPSAxOworICBpZiAoYSkKKyAgICBpID0gc29hcF9hcnJheV9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCBhLCBuLCB0eXBlLCAmcHApOworICBlbHNlCisgICAgaSA9IHNvYXBfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgdHlwZSwgJnBwKTsKKyAgaWYgKGkpCisgIHsgaWYgKHNvYXBfaXNfZW1iZWRkZWQoc29hcCwgcHApCisgICAgIHx8IHNvYXBfaXNfc2luZ2xlKHNvYXAsIHBwKSkKKyAgICAgIHJldHVybiAwOworICAgIHNvYXBfc2V0X2VtYmVkZGVkKHNvYXAsIHBwKTsKKyAgfQorICByZXR1cm4gaTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wb2ludGVyX2xvb2t1cChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCwgaW50IHR5cGUsIHN0cnVjdCBzb2FwX3BsaXN0ICoqcHBwKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgICpwcHAgPSBOVUxMOworICBpZiAocCkKKyAgeyBmb3IgKHBwID0gc29hcC0+cGh0W3NvYXBfaGFzaF9wdHIocCldOyBwcDsgcHAgPSBwcC0+bmV4dCkKKyAgICB7IGlmIChwcC0+cHRyID09IHAgJiYgcHAtPnR5cGUgPT0gdHlwZSkKKyAgICAgIHsgKnBwcCA9IHBwOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkxvb2t1cCBsb2NhdGlvbj0lcCB0eXBlPSVkIGlkPSVkXG4iLCBwLCB0eXBlLCBwcC0+aWQpKTsKKyAgICAgICAgcmV0dXJuIHBwLT5pZDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJMb29rdXAgbG9jYXRpb249JXAgdHlwZT0lZDogbm90IGZvdW5kXG4iLCBwLCB0eXBlKSk7CisgIHJldHVybiAwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3BvaW50ZXJfZW50ZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgbiwgaW50IHR5cGUsIHN0cnVjdCBzb2FwX3BsaXN0ICoqcHBwKQoreyByZWdpc3RlciBpbnQgaDsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICBpZiAoIXNvYXAtPnBibGsgfHwgc29hcC0+cGlkeCA+PSBTT0FQX1BUUkJMSykKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wYmxrICpwYiA9IChzdHJ1Y3Qgc29hcF9wYmxrKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfcGJsaykpOworICAgIGlmICghcGIpCisgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHBiLT5uZXh0ID0gc29hcC0+cGJsazsKKyAgICBzb2FwLT5wYmxrID0gcGI7CisgICAgc29hcC0+cGlkeCA9IDA7CisgIH0KKyAgKnBwcCA9IHBwID0gJnNvYXAtPnBibGstPnBsaXN0W3NvYXAtPnBpZHgrK107CisgIGlmIChhKQorICAgIGggPSBzb2FwX2hhc2hfcHRyKGEtPl9fcHRyKTsKKyAgZWxzZQorICAgIGggPSBzb2FwX2hhc2hfcHRyKHApOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlBvaW50ZXIgZW50ZXIgbG9jYXRpb249JXAgYXJyYXk9JXAgc2l6ZT0lZCBkaW09JWQgdHlwZT0lZCBpZD0lZFxuIiwgcCwgYT9hLT5fX3B0cjpOVUxMLCBhP2EtPl9fc2l6ZTowLCBuLCB0eXBlLCBzb2FwLT5pZG51bSsxKSk7CisgIHBwLT5uZXh0ID0gc29hcC0+cGh0W2hdOworICBwcC0+dHlwZSA9IHR5cGU7CisgIHBwLT5tYXJrMSA9IDA7CisgIHBwLT5tYXJrMiA9IDA7CisgIHBwLT5wdHIgPSBwOworICBwcC0+YXJyYXkgPSBhOworICBzb2FwLT5waHRbaF0gPSBwcDsKKyAgcHAtPmlkID0gKytzb2FwLT5pZG51bTsKKyAgcmV0dXJuIHBwLT5pZDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9hcnJheV9wb2ludGVyX2xvb2t1cChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCwgY29uc3Qgc3RydWN0IHNvYXBfYXJyYXkgKmEsIGludCBuLCBpbnQgdHlwZSwgc3RydWN0IHNvYXBfcGxpc3QgKipwcHApCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgKnBwcCA9IE5VTEw7CisgIGlmICghcCB8fCAhYS0+X19wdHIpCisgICAgcmV0dXJuIDA7CisgIGZvciAocHAgPSBzb2FwLT5waHRbc29hcF9oYXNoX3B0cihhLT5fX3B0cildOyBwcDsgcHAgPSBwcC0+bmV4dCkKKyAgeyBpZiAocHAtPnR5cGUgPT0gdHlwZSAmJiBwcC0+YXJyYXkgJiYgcHAtPmFycmF5LT5fX3B0ciA9PSBhLT5fX3B0cikKKyAgICB7IHJlZ2lzdGVyIGludCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgaWYgKCgoY29uc3QgaW50KikmcHAtPmFycmF5LT5fX3NpemUpW2ldICE9ICgoY29uc3QgaW50KikmYS0+X19zaXplKVtpXSkKKwkgIGJyZWFrOworICAgICAgaWYgKGkgPT0gbikKKyAgICAgIHsgKnBwcCA9IHBwOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFycmF5IGxvb2t1cCBsb2NhdGlvbj0lcCB0eXBlPSVkIGlkPSVkXG4iLCBhLT5fX3B0ciwgdHlwZSwgcHAtPmlkKSk7CisgICAgICAgIHJldHVybiBwcC0+aWQ7CisgICAgICB9CisgICAgfQorICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQXJyYXkgbG9va3VwIGxvY2F0aW9uPSVwIHR5cGU9JWQ6IG5vdCBmb3VuZFxuIiwgYS0+X19wdHIsIHR5cGUpKTsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9iZWdpbl9jb3VudChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcF9jbHJfYXR0cihzb2FwKTsKKyAgc29hcF9zZXRfbG9jYWxfbmFtZXNwYWNlcyhzb2FwKTsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkgfHwgKHNvYXAtPm9tb2RlICYgU09BUF9FTkNfRElNRSkpCisgICAgc29hcC0+bW9kZSA9IHNvYXAtPm9tb2RlIHwgU09BUF9JT19MRU5HVEggfCBTT0FQX0VOQ19ESU1FOworICBlbHNlCisjZW5kaWYKKyAgeyBzb2FwLT5tb2RlID0gc29hcC0+b21vZGU7CisgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19TVE9SRQorICAgICB8fCAoKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSyB8fCAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1hNTCkpCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgICAgICAmJiAhc29hcC0+ZnByZXBhcmVzZW5kCisjZW5kaWYKKyAgICAgICkpCisgICAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0lPX0xFTkdUSDsKKyAgICBlbHNlCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fTEVOR1RIOworICB9CisjaWZkZWYgV0lUSF9aTElCCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIpICYmIChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19GTFVTSCkKKyAgeyBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkpCisgICAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0lPX0xFTkdUSDsKKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1hNTCkKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19CVUZGRVI7CisgICAgZWxzZQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX1NUT1JFOworICB9CisjZW5kaWYKKyAgaWYgKCFzb2FwLT5lbmNvZGluZ1N0eWxlICYmICEoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0dSQVBIKSkKKyAgICBzb2FwLT5tb2RlIHw9IFNPQVBfWE1MX1RSRUU7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pICYmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkpCisgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19NSU1FOworICBlbHNlCisgICAgc29hcC0+bW9kZSAmPSB+U09BUF9FTkNfTVRPTTsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKQorICAgIHNvYXBfc2VsZWN0X21pbWVfYm91bmRhcnkoc29hcCk7CisgIHNvYXAtPmRpbWUubGlzdCA9IHNvYXAtPmRpbWUubGFzdDsJLyoga2VlcCB0cmFjayBvZiBsYXN0IERJTUUgYXR0YWNobWVudCAqLworI2VuZGlmCisgIHNvYXAtPmNvdW50ID0gMDsKKyAgc29hcC0+bnMgPSAwOworICBzb2FwLT5udWxsID0gMDsKKyAgc29hcC0+cG9zaXRpb24gPSAwOworICBzb2FwLT5tdXN0VW5kZXJzdGFuZCA9IDA7CisgIHNvYXAtPmVuY29kaW5nID0gMDsKKyAgc29hcC0+cGFydCA9IFNPQVBfQkVHSU47CisgIHNvYXAtPmlkbnVtID0gMDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJCZWdpbiBjb3VudCBwaGFzZSAoc29ja2V0PSVkIG1vZGU9MHgleCBjb3VudD0lbHUpXG4iLCBzb2FwLT5zb2NrZXQsIHNvYXAtPm1vZGUsICh1bnNpZ25lZCBsb25nKXNvYXAtPmNvdW50KSk7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXAtPmRpbWUuY291bnQgPSAwOyAvKiBjb3VudCAjIG9mIGF0dGFjaG1lbnRzICovCisgIHNvYXAtPmRpbWUuc2l6ZSA9IDA7IC8qIGFjY3VtdWxhdGUgdG90YWwgc2l6ZSBvZiBhdHRhY2htZW50cyAqLworICBpZiAoc29hcC0+ZnByZXBhcmVpbml0ICYmIChzb2FwLT5tb2RlICYgU09BUF9JTykgIT0gU09BUF9JT19TVE9SRSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBzb2FwLT5mcHJlcGFyZWluaXQoc29hcCk7ICAgCisjZW5kaWYKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW5kX2NvdW50KHN0cnVjdCBzb2FwICpzb2FwKQoreyAKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPmZwcmVwYXJlZmluYWwpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gc29hcC0+ZnByZXBhcmVmaW5hbChzb2FwKTsKKyNlbmRpZgorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBvZiBjb3VudCBwaGFzZVxuIikpOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9iZWdpbl9zZW5kKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIHNvYXBfY2xyX2F0dHIoc29hcCk7CisgIHNvYXBfc2V0X2xvY2FsX25hbWVzcGFjZXMoc29hcCk7CisgIHNvYXAtPm1vZGUgPSBzb2FwLT5vbW9kZSB8IChzb2FwLT5tb2RlICYgKFNPQVBfSU9fTEVOR1RIIHwgU09BUF9FTkNfRElNRSkpOworI2lmZGVmIFdJVEhfWkxJQgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fRkxVU0gpCisgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fQlVGRkVSOworICAgIGVsc2UKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19TVE9SRTsKKyAgfQorI2VuZGlmCisjaWZkZWYgV0lUSF9VRFAKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JT19VRFApKQorICB7IHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfWE1MOworICAgIGlmIChzb2FwLT5jb3VudCA+IFNPQVBfQlVGTEVOKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9VRFBfRVJST1I7CisgIH0KKyNlbmRpZgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0ZMVVNIICYmIHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgIHsgaWYgKHNvYXAtPmNvdW50IHx8IChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpIHx8IChzb2FwLT5tb2RlICYgU09BUF9FTkNfWE1MKSkKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19CVUZGRVI7CisgICAgZWxzZQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX1NUT1JFOworICB9CisgIHNvYXAtPm1vZGUgJj0gflNPQVBfSU9fTEVOR1RIOworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX1NUT1JFKQorICAgIHNvYXBfbmV3X2Jsb2NrKHNvYXApOworICBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9JT19LRUVQQUxJVkUpKQorICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOworICBpZiAoIXNvYXAtPmVuY29kaW5nU3R5bGUgJiYgIShzb2FwLT5tb2RlICYgU09BUF9YTUxfR1JBUEgpKQorICAgIHNvYXAtPm1vZGUgfD0gU09BUF9YTUxfVFJFRTsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSkKKyAgeyBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX01JTUU7CisgICAgc29hcC0+bW9kZSAmPSB+U09BUF9FTkNfRElNRTsKKyAgfQorICBlbHNlCisgICAgc29hcC0+bW9kZSAmPSB+U09BUF9FTkNfTVRPTTsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKQorICAgIHNvYXBfc2VsZWN0X21pbWVfYm91bmRhcnkoc29hcCk7CisjaWZkZWYgV0lOMzIKKyNpZm5kZWYgVU5ERVJfQ0UKKyNpZm5kZWYgV0lUSF9GQVNUQ0dJCisgIGlmICghc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkgLyogU2V0IHdpbjMyIHN0ZG91dCBvciBzb2FwLT5zZW5kZmQgdG8gQklOQVJZLCBlLmcuIHRvIHN1cHBvcnQgRElNRSAqLworI2lmZGVmIF9fQk9STEFORENfXworICAgIHNldG1vZGUoKFNPQVBfU09DS0VUKXNvYXAtPnNlbmRmZCwgT19CSU5BUlkpOworI2Vsc2UKKyAgICBfc2V0bW9kZSgoU09BUF9TT0NLRVQpc29hcC0+c2VuZGZkLCBfT19CSU5BUlkpOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKQorICB7IHNvYXAtPmJ1ZmlkeCA9IDA7CisgICAgc29hcC0+YnVmbGVuID0gMDsKKyAgfQorICBzb2FwLT5jaHVua3NpemUgPSAwOworICBzb2FwLT5ucyA9IDA7CisgIHNvYXAtPm51bGwgPSAwOworICBzb2FwLT5wb3NpdGlvbiA9IDA7CisgIHNvYXAtPm11c3RVbmRlcnN0YW5kID0gMDsKKyAgc29hcC0+ZW5jb2RpbmcgPSAwOworICBzb2FwLT5pZG51bSA9IDA7CisgIHNvYXAtPmxldmVsID0gMDsKKyNpZmRlZiBXSVRIX1pMSUIKKyAgc29hcC0+el9yYXRpb19vdXQgPSAxLjA7CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIpICYmIHNvYXAtPnpsaWJfc3RhdGUgIT0gU09BUF9aTElCX0RFRkxBVEUpCisgIHsKKyNpZmRlZiBXSVRIX0daSVAKKyAgICBtZW1jcHkoc29hcC0+el9idWYsICJcMzdcMjEzXDEwXDBcMFwwXDBcMFwwXDM3NyIsIDEwKTsKKyAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IChCeXRlKilzb2FwLT56X2J1ZiArIDEwOworICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCA9IFNPQVBfQlVGTEVOIC0gMTA7CisgICAgc29hcC0+el9jcmMgPSBjcmMzMigwTCwgTlVMTCwgMCk7CisgICAgaWYgKGRlZmxhdGVJbml0Migmc29hcC0+ZF9zdHJlYW0sIHNvYXAtPnpfbGV2ZWwsIFpfREVGTEFURUQsIC1NQVhfV0JJVFMsIDgsIFpfREVGQVVMVF9TVFJBVEVHWSkgIT0gWl9PSykKKyNlbHNlCisgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZSopc29hcC0+el9idWY7CisgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0ID0gU09BUF9CVUZMRU47CisgICAgaWYgKGRlZmxhdGVJbml0KCZzb2FwLT5kX3N0cmVhbSwgc29hcC0+el9sZXZlbCkgIT0gWl9PSykKKyNlbmRpZgorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVmbGF0ZSBpbml0aWFsaXplZFxuIikpOworICAgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfREVGTEFURTsKKyAgfQorI2VuZGlmCisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQmVnaW4gc2VuZCBwaGFzZSAoc29ja2V0PSVkIG1vZGU9MHgleCBjb3VudD0lbHUpXG4iLCBzb2FwLT5zb2NrZXQsIHNvYXAtPm1vZGUsICh1bnNpZ25lZCBsb25nKXNvYXAtPmNvdW50KSk7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0JFR0lOOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+ZnByZXBhcmVpbml0ICYmIChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19TVE9SRSkKKyAgICBzb2FwLT5mcHJlcGFyZWluaXQoc29hcCk7ICAgCisjZW5kaWYKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9lbWJlZGRlZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCwgaW50IHQpCit7IHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgaWYgKHNvYXBfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgdCwgJnBwKSkKKyAgeyBwcC0+bWFyazEgPSAxOworICAgIHBwLT5tYXJrMiA9IDE7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbWJlZGRlZCAlcCB0eXBlPSVkIG1hcmsgc2V0IHRvIDFcbiIsIHAsIHQpKTsKKyAgfQorfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlZmVyZW5jZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCwgaW50IHQpCit7IHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgaWYgKCFwIHx8IChzb2FwLT5tb2RlICYgU09BUF9YTUxfVFJFRSkpCisgICAgcmV0dXJuIDE7CisgIGlmIChzb2FwX3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIHQsICZwcCkpCisgIHsgaWYgKHBwLT5tYXJrMSA9PSAwKQorICAgIHsgcHAtPm1hcmsxID0gMjsKKyAgICAgIHBwLT5tYXJrMiA9IDI7CisgICAgfQorICB9CisgIGVsc2UgaWYgKHNvYXBfcG9pbnRlcl9lbnRlcihzb2FwLCBwLCBOVUxMLCAwLCB0LCAmcHApKQorICB7IHBwLT5tYXJrMSA9IDA7CisgICAgcHAtPm1hcmsyID0gMDsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIDE7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVmZXJlbmNlICVwIHR5cGU9JWQgKCVkICVkKVxuIiwgcCwgdCwgKGludClwcC0+bWFyazEsIChpbnQpcHAtPm1hcmsyKSk7CisgIHJldHVybiBwcC0+bWFyazE7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYXJyYXlfcmVmZXJlbmNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGludCB0KQoreyByZWdpc3RlciBpbnQgaTsKKyAgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICBpZiAoIXAgfHwgIWEtPl9fcHRyKQorICAgIHJldHVybiAxOworICBpID0gc29hcF9hcnJheV9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCBhLCBuLCB0LCAmcHApOworICBpZiAoaSkKKyAgeyBpZiAocHAtPm1hcmsxID09IDApCisgICAgeyBwcC0+bWFyazEgPSAyOworICAgICAgcHAtPm1hcmsyID0gMjsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoIXNvYXBfcG9pbnRlcl9lbnRlcihzb2FwLCBwLCBhLCBuLCB0LCAmcHApKQorICAgIHJldHVybiAxOworICBlbHNlCisgIHsgcHAtPm1hcmsxID0gMDsKKyAgICBwcC0+bWFyazIgPSAwOworICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQXJyYXkgcmVmZXJlbmNlICVwIHB0cj0lcCBkaW09JWQgdHlwZT0lZCAoJWQgJWQpXG4iLCBwLCBhLT5fX3B0ciwgbiwgdCwgKGludClwcC0+bWFyazEsIChpbnQpcHAtPm1hcmsyKSk7CisgIHJldHVybiBwcC0+bWFyazE7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW1iZWRkZWRfaWQoc3RydWN0IHNvYXAgKnNvYXAsIGludCBpZCwgY29uc3Qgdm9pZCAqcCwgaW50IHQpCit7IHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9UUkVFKQorICAgIHJldHVybiBpZDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbWJlZGRlZF9pZCAlcCB0eXBlPSVkIGlkPSVkXG4iLCBwLCB0LCBpZCkpOworICBpZiAoc29hcC0+dmVyc2lvbiA9PSAxICYmIHNvYXAtPmVuY29kaW5nU3R5bGUgJiYgIShzb2FwLT5tb2RlICYgU09BUF9YTUxfR1JBUEgpICYmIHNvYXAtPnBhcnQgIT0gU09BUF9JTl9IRUFERVIpCisgIHsgaWYgKGlkIDwgMCkKKyAgICB7IGlkID0gc29hcF9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCB0LCAmcHApOworICAgICAgaWYgKGlkKQorICAgICAgeyBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICAgICAgICAgIHBwLT5tYXJrMSA9IDI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwcC0+bWFyazIgPSAyOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVtYmVkZGVkX2lkIG11bHRpcmVmIGlkPSVkICVwIHR5cGU9JWQgPSAoJWQgJWQpXG4iLCBpZCwgcCwgdCwgKGludClwcC0+bWFyazEsIChpbnQpcHAtPm1hcmsyKSk7CisgICAgICB9CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBpZDsKKyAgfQorICBpZiAoaWQgPCAwKQorICAgIGlkID0gc29hcF9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCB0LCAmcHApOworICBlbHNlIGlmIChpZCAmJiAhc29hcF9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCB0LCAmcHApKQorICAgIHJldHVybiAwOworICBpZiAoaWQgJiYgcHApCisgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICAgIHBwLT5tYXJrMSA9IDE7CisgICAgZWxzZQorICAgICAgcHAtPm1hcmsyID0gMTsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVtYmVkZGVkX2lkIGVtYmVkZGVkIHJlZiBpZD0lZCAlcCB0eXBlPSVkID0gKCVkICVkKVxuIiwgaWQsIHAsIHQsIChpbnQpcHAtPm1hcmsxLCAoaW50KXBwLT5tYXJrMikpOworICB9CisgIHJldHVybiBpZDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9pc19lbWJlZGRlZChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGxpc3QgKnBwKQoreyBpZiAoIXBwKQorICAgIHJldHVybiAwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIklzIGVtYmVkZGVkPyAlZCAlZFxuIiwgKGludClwcC0+bWFyazEsIChpbnQpcHAtPm1hcmsyKSk7CisgIGlmIChzb2FwLT52ZXJzaW9uID09IDEgJiYgc29hcC0+ZW5jb2RpbmdTdHlsZSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9HUkFQSCkgJiYgc29hcC0+cGFydCAhPSBTT0FQX0lOX0hFQURFUikKKyAgeyBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICAgICAgcmV0dXJuIHBwLT5tYXJrMSAhPSAwOworICAgIHJldHVybiBwcC0+bWFyazIgIT0gMDsKKyAgfQorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICAgIHJldHVybiBwcC0+bWFyazEgPT0gMTsKKyAgcmV0dXJuIHBwLT5tYXJrMiA9PSAxOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2lzX3NpbmdsZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGxpc3QgKnBwKQoreyBpZiAoc29hcC0+cGFydCA9PSBTT0FQX0lOX0hFQURFUikKKyAgICByZXR1cm4gMTsKKyAgaWYgKCFwcCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICByZXR1cm4gcHAtPm1hcmsxID09IDA7CisgIHJldHVybiBwcC0+bWFyazIgPT0gMDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2VtYmVkZGVkKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHApCit7IGlmICghcHApCisgICAgcmV0dXJuOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICAgIHBwLT5tYXJrMSA9IDE7CisgIGVsc2UKKyAgICBwcC0+bWFyazIgPSAxOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2F0dGFjaG1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgY29uc3QgY2hhciAqYWlkLCBjb25zdCBjaGFyICphdHlwZSwgY29uc3QgY2hhciAqYW9wdGlvbnMsIGludCBuLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkgCit7IHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgaW50IGk7CisgIGlmICghcCB8fCAhYS0+X19wdHIgfHwgKCFhaWQgJiYgIWF0eXBlKSkKKyAgICByZXR1cm4gc29hcF9lbGVtZW50X2lkKHNvYXAsIHRhZywgaWQsIHAsIGEsIG4sIHR5cGUsIHQpOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkF0dGFjaG1lbnQgdGFnPSclcycgaWQ9JyVzJyAoJWQpIHR5cGU9JyVzJ1xuIiwgdGFnLCBhaWQ/YWlkOiIiLCBpZCwgYXR5cGU/YXR5cGU6IiIpKTsKKyAgaSA9IHNvYXBfYXJyYXlfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgYSwgbiwgdCwgJnBwKTsKKyAgaWYgKCFpKQorICB7IGkgPSBzb2FwX3BvaW50ZXJfZW50ZXIoc29hcCwgcCwgYSwgbiwgdCwgJnBwKTsKKyAgICBpZiAoIWkpCisgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorICBpZiAoaWQgPD0gMCkKKyAgICBpZCA9IGk7CisgIGlmICghYWlkKQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCBzb2FwLT5kaW1lX2lkX2Zvcm1hdCwgaWQpOworICAgIGFpZCA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPnRtcGJ1Zik7CisgIH0KKyAgLyogQWRkIE1UT00geG9wOkluY2x1ZGUgZWxlbWVudCB3aGVuIG5lY2Vzc2FyeSAqLworICAvKiBUT0RPOiB0aGlzIGNvZGUgdG8gYmUgb2Jzb2xldGVkIHdpdGggbmV3IGltcG9ydC94b3AuaCBjb252ZW50aW9ucyAqLworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKSAmJiBzdHJjbXAodGFnLCAieG9wOkluY2x1ZGUiKSkKKyAgeyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIDAsIHR5cGUpCisgICAgIHx8IHNvYXBfZWxlbWVudF9ocmVmKHNvYXAsICJ4b3A6SW5jbHVkZSIsIDAsICJocmVmIiwgYWlkKQorICAgICB8fCBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGVsc2UgaWYgKHNvYXBfZWxlbWVudF9ocmVmKHNvYXAsIHRhZywgMCwgImhyZWYiLCBhaWQpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgeyBpZiAocHAtPm1hcmsxICE9IDMpCisgICAgeyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgICAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pCisgICAgICAgIGNvbnRlbnQgPSBzb2FwX25ld19tdWx0aXBhcnQoc29hcCwgJnNvYXAtPm1pbWUuZmlyc3QsICZzb2FwLT5taW1lLmxhc3QsIChjaGFyKilhLT5fX3B0ciwgYS0+X19zaXplKTsKKyAgICAgIGVsc2UKKyAgICAgICAgY29udGVudCA9IHNvYXBfbmV3X211bHRpcGFydChzb2FwLCAmc29hcC0+ZGltZS5maXJzdCwgJnNvYXAtPmRpbWUubGFzdCwgKGNoYXIqKWEtPl9fcHRyLCBhLT5fX3NpemUpOworICAgICAgaWYgKCFjb250ZW50KQorICAgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBpZiAoIXN0cm5jbXAoYWlkLCAiY2lkOiIsIDQpKSAvKiBSRkMgMjExMSAqLworICAgICAgeyBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pCisgICAgICAgIHsgY2hhciAqcyA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzdHJsZW4oYWlkKSAtIDEpOworCSAgaWYgKHMpCisJICB7ICpzID0gJzwnOworCSAgICBzdHJjcHkocyArIDEsIGFpZCArIDQpOworCSAgICBzdHJjYXQocywgIj4iKTsKKwkgICAgY29udGVudC0+aWQgPSBzOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgY29udGVudC0+aWQgPSBhaWQgKyA0OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBjb250ZW50LT5pZCA9IGFpZDsKKyAgICAgIGNvbnRlbnQtPnR5cGUgPSBhdHlwZTsKKyAgICAgIGNvbnRlbnQtPm9wdGlvbnMgPSBhb3B0aW9uczsKKyAgICAgIGNvbnRlbnQtPmVuY29kaW5nID0gU09BUF9NSU1FX0JJTkFSWTsKKyAgICAgIHBwLT5tYXJrMSA9IDM7CisgICAgfQorICB9CisgIGVsc2UKKyAgICBwcC0+bWFyazIgPSAzOworICByZXR1cm4gLTE7Cit9CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyB2b2lkCitzb2FwX2luaXRfaWh0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgaTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbml0aWFsaXppbmcgSUQgaGFzaHRhYmxlXG4iKSk7CisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0lESEFTSDsgaSsrKQorICAgIHNvYXAtPmlodFtpXSA9IE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZAorc29hcF9mcmVlX2lodChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICppcCwgKnA7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2ZsaXN0ICpmcCwgKmZxOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWUgSUQgaGFzaHRhYmxlXG4iKSk7CisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0lESEFTSDsgaSsrKQorICB7IGZvciAoaXAgPSBzb2FwLT5paHRbaV07IGlwOyBpcCA9IHApCisgICAgeyBmb3IgKGZwID0gaXAtPmZsaXN0OyBmcDsgZnAgPSBmcSkKKyAgICAgIHsgZnEgPSBmcC0+bmV4dDsKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIGZwKTsKKyAgICAgIH0KKyAgICAgIHAgPSBpcC0+bmV4dDsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBpcCk7CisgICAgfQorICAgIHNvYXAtPmlodFtpXSA9IE5VTEw7CisgIH0KK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwX2lsaXN0ICoKK1NPQVBfRk1BQzIKK3NvYXBfbG9va3VwKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworICBmb3IgKGlwID0gc29hcC0+aWh0W3NvYXBfaGFzaChpZCldOyBpcDsgaXAgPSBpcC0+bmV4dCkKKyAgICBpZiAoIXN0cmNtcChpcC0+aWQsIGlkKSkKKyAgICAgIHJldHVybiBpcDsKKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcF9pbGlzdCAqCitTT0FQX0ZNQUMyCitzb2FwX2VudGVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCkKK3sgcmVnaXN0ZXIgc2l6ZV90IGg7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgaXAgPSAoc3RydWN0IHNvYXBfaWxpc3QqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9pbGlzdCkgKyBzdHJsZW4oaWQpKTsKKyAgaWYgKGlwKQorICB7IGggPSBzb2FwX2hhc2goaWQpOworICAgIHN0cmNweShpcC0+aWQsIGlkKTsKKyAgICBpcC0+bmV4dCA9IHNvYXAtPmlodFtoXTsKKyAgICBzb2FwLT5paHRbaF0gPSBpcDsKKyAgICByZXR1cm4gaXA7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQqCitTT0FQX0ZNQUMyCitzb2FwX21hbGxvYyhzdHJ1Y3Qgc29hcCAqc29hcCwgc2l6ZV90IG4pCit7IHJlZ2lzdGVyIGNoYXIgKnA7CisgIGlmICghbikKKyAgICByZXR1cm4gKHZvaWQqKVNPQVBfTk9OX05VTEw7CisgIGlmICghc29hcCkKKyAgICByZXR1cm4gU09BUF9NQUxMT0Moc29hcCwgbik7CisgIG4gKz0gKC0obG9uZyluKSAmIChzaXplb2Yodm9pZCopLTEpOyAvKiBhbGlnbiBhdCA0LSwgOC0gb3IgMTYtYnl0ZSBib3VuZGFyeSAqLworICBpZiAoIShwID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIG4gKyBzaXplb2Yodm9pZCopICsgc2l6ZW9mKHNpemVfdCkpKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHJldHVybiBOVUxMOworICB9CisgIC8qIGtlZXAgY2hhaW4gb2YgYWxsb2NlZCBjZWxscyBmb3IgbGF0ZXIgZGVzdHJ1Y3Rpb24gKi8KKyAgc29hcC0+YWxsb2NlZCA9IDE7CisgICoodm9pZCoqKShwICsgbikgPSBzb2FwLT5hbGlzdDsKKyAgKihzaXplX3QqKShwICsgbiArIHNpemVvZih2b2lkKikpID0gbjsKKyAgc29hcC0+YWxpc3QgPSBwICsgbjsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitzdGF0aWMgdm9pZAorc29hcF9pbml0X21odChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCAoaW50KVNPQVBfUFRSSEFTSDsgaSsrKQorICAgIHNvYXAtPm1odFtpXSA9IE5VTEw7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitzdGF0aWMgdm9pZAorc29hcF9mcmVlX21odChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX21saXN0ICptcCwgKm1xOworICBmb3IgKGkgPSAwOyBpIDwgKGludClTT0FQX1BUUkhBU0g7IGkrKykKKyAgeyBmb3IgKG1wID0gc29hcC0+bWh0W2ldOyBtcDsgbXAgPSBtcSkKKyAgICB7IG1xID0gbXAtPm5leHQ7CisgICAgICBpZiAobXAtPmxpdmUpCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMoJWQpOiBtYWxsb2MoKSA9ICVwIG5vdCBmcmVlZCAobWVtb3J5IGxlYWsgb3IgZm9yZ290IHRvIGNhbGwgc29hcF9lbmQoKT8pXG4iLCBtcC0+ZmlsZSwgbXAtPmxpbmUsIG1wLT5wdHIpOworICAgICAgZnJlZShtcCk7CisgICAgfQorICAgIHNvYXAtPm1odFtpXSA9IE5VTEw7CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK1NPQVBfRk1BQzEKK3ZvaWQqCitTT0FQX0ZNQUMyCitzb2FwX3RyYWNrX21hbGxvYyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIHNpemVfdCBzaXplKQoreyByZWdpc3RlciB2b2lkICpwID0gbWFsbG9jKHNpemUpOworICBpZiAoc29hcCkKKyAgeyByZWdpc3RlciBpbnQgaCA9IHNvYXBfaGFzaF9wdHIocCk7CisgICAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbWxpc3QgKm1wID0gKHN0cnVjdCBzb2FwX21saXN0KiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2FwX21saXN0KSk7CisgICAgaWYgKHNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYX1RFU1RdKQorICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIlcyglZCk6IG1hbGxvYyglbHUpID0gJXBcbiIsIGZpbGUsIGxpbmUsICh1bnNpZ25lZCBsb25nKXNpemUsIHApKTsKKyAgICBtcC0+bmV4dCA9IHNvYXAtPm1odFtoXTsKKyAgICBtcC0+cHRyID0gcDsKKyAgICBtcC0+ZmlsZSA9IGZpbGU7CisgICAgbXAtPmxpbmUgPSBsaW5lOworICAgIG1wLT5saXZlID0gMTsKKyAgICBzb2FwLT5taHRbaF0gPSBtcDsKKyAgfQorICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfdHJhY2tfZnJlZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIHZvaWQgKnApCit7IHJlZ2lzdGVyIGludCBoID0gc29hcF9oYXNoX3B0cihwKTsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbWxpc3QgKm1wOworICBmb3IgKG1wID0gc29hcC0+bWh0W2hdOyBtcDsgbXAgPSBtcC0+bmV4dCkKKyAgICBpZiAobXAtPnB0ciA9PSBwKQorICAgICAgYnJlYWs7CisgIGlmIChtcCkKKyAgeyBpZiAobXAtPmxpdmUpCisgICAgeyBmcmVlKHApOworICAgICAgaWYgKHNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYX1RFU1RdKQorICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIiVzKCVkKTogZnJlZSglcClcbiIsIGZpbGUsIGxpbmUsIHApKTsKKyAgICAgIG1wLT5saXZlID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgICAgZnByaW50ZihzdGRlcnIsICIlcyglZCk6IGZyZWUoJXApIGRvdWJsZSBmcmVlIG9mIHBvaW50ZXIgbWFsbG9jZWQgYXQgJXMoJWQpXG4iLCBmaWxlLCBsaW5lLCBwLCBtcC0+ZmlsZSwgbXAtPmxpbmUpOworICB9CisgIGVsc2UKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzKCVkKTogZnJlZSglcCkgcG9pbnRlciBub3QgbWFsbG9jZWRcbiIsIGZpbGUsIGxpbmUsIHApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworc3RhdGljIHZvaWQKK3NvYXBfdHJhY2tfdW5saW5rKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwKQoreyByZWdpc3RlciBpbnQgaCA9IHNvYXBfaGFzaF9wdHIocCk7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX21saXN0ICptcDsKKyAgZm9yIChtcCA9IHNvYXAtPm1odFtoXTsgbXA7IG1wID0gbXAtPm5leHQpCisgICAgaWYgKG1wLT5wdHIgPT0gcCkKKyAgICAgIGJyZWFrOworICBpZiAobXApCisgICAgbXAtPmxpdmUgPSAwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9kZWFsbG9jKHN0cnVjdCBzb2FwICpzb2FwLCB2b2lkICpwKQoreyBpZiAoIXNvYXApCisgICAgcmV0dXJuOworICBpZiAocCkKKyAgeyByZWdpc3RlciBjaGFyICoqcTsKKyAgICBmb3IgKHEgPSAoY2hhcioqKSZzb2FwLT5hbGlzdDsgKnE7IHEgPSAqKGNoYXIqKiopcSkKKyAgICB7IGlmIChwID09ICh2b2lkKikoKnEgLSAqKHNpemVfdCopKCpxICsgc2l6ZW9mKHZvaWQqKSkpKQorICAgICAgeyAqcSA9ICoqKGNoYXIqKiopcTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlZCBkYXRhIGF0ICVwXG4iLCBwKSk7CisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgICBzb2FwX2RlbGV0ZShzb2FwLCBwKTsKKyAgfQorICBlbHNlCisgIHsgcmVnaXN0ZXIgY2hhciAqcTsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWUgYWxsIHNvYXBfbWFsbG9jKCkgZGF0YVxuIikpOworICAgIHdoaWxlIChzb2FwLT5hbGlzdCkKKyAgICB7IHEgPSAoY2hhciopc29hcC0+YWxpc3Q7CisgICAgICBzb2FwLT5hbGlzdCA9ICoodm9pZCoqKXE7CisgICAgICBxIC09ICooc2l6ZV90KikocSArIHNpemVvZih2b2lkKikpOworICAgICAgU09BUF9GUkVFKHNvYXAsIHEpOworICAgIH0KKyAgfQorICAvKiB3ZSBtdXN0IGFzc3VtZSB0aGVzZSB3ZXJlIGRlYWxsb2NhdGVkOiAqLworICBzb2FwLT5hY3Rpb24gPSBOVUxMOworICBzb2FwLT5mYXVsdCA9IE5VTEw7CisgIHNvYXAtPmhlYWRlciA9IE5VTEw7CisgIHNvYXAtPnVzZXJpZCA9IE5VTEw7CisgIHNvYXAtPnBhc3N3ZCA9IE5VTEw7CisgIHNvYXAtPmF1dGhyZWFsbSA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXBfY2xyX21pbWUoc29hcCk7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZGVsZXRlKHN0cnVjdCBzb2FwICpzb2FwLCB2b2lkICpwKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9jbGlzdCAqKmNwOworICBpZiAoc29hcF9jaGVja19zdGF0ZShzb2FwKSkKKyAgICByZXR1cm47CisgIGNwID0gJnNvYXAtPmNsaXN0OworICBpZiAocCkKKyAgeyB3aGlsZSAoKmNwKQorICAgIHsgaWYgKHAgPT0gKCpjcCktPnB0cikKKyAgICAgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfY2xpc3QgKnEgPSAqY3A7CisgICAgICAgICpjcCA9IHEtPm5leHQ7CisgICAgICAgIHEtPmZkZWxldGUocSk7CisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBxKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgY3AgPSAmKCpjcCktPm5leHQ7CisgICAgfQorICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IGRlYWxsb2MgZGF0YSAlcDogYWRkcmVzcyBub3QgaW4gbGlzdFxuIiwgcCkpOworICB9CisgIGVsc2UKKyAgeyB3aGlsZSAoKmNwKQorICAgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfY2xpc3QgKnEgPSAqY3A7CisgICAgICAqY3AgPSBxLT5uZXh0OworICAgICAgaWYgKHEtPnB0ciA9PSAodm9pZCopc29hcC0+ZmF1bHQpCisgICAgICAgIHNvYXAtPmZhdWx0ID0gTlVMTDsgLyogdGhpcyB3YXMgZGVhbGxvY2F0ZWQgKi8KKyAgICAgIGVsc2UgaWYgKHEtPnB0ciA9PSAodm9pZCopc29hcC0+aGVhZGVyKQorICAgICAgICBzb2FwLT5oZWFkZXIgPSBOVUxMOyAvKiB0aGlzIHdhcyBkZWFsbG9jYXRlZCAqLworICAgICAgcS0+ZmRlbGV0ZShxKTsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBxKTsKKyAgICB9CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwX2NsaXN0ICoKK1NPQVBfRk1BQzIKK3NvYXBfbGluayhzdHJ1Y3Qgc29hcCAqc29hcCwgdm9pZCAqcCwgaW50IHQsIGludCBuLCB2b2lkICgqZmRlbGV0ZSkoc3RydWN0IHNvYXBfY2xpc3QqKSkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfY2xpc3QgKmNwOworICBpZiAoKGNwID0gKHN0cnVjdCBzb2FwX2NsaXN0KilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfY2xpc3QpKSkpCisgIHsgY3AtPm5leHQgPSBzb2FwLT5jbGlzdDsKKyAgICBjcC0+dHlwZSA9IHQ7CisgICAgY3AtPnNpemUgPSBuOyAKKyAgICBjcC0+cHRyID0gcDsKKyAgICBjcC0+ZmRlbGV0ZSA9IGZkZWxldGU7CisgICAgc29hcC0+Y2xpc3QgPSBjcDsKKyAgfQorICByZXR1cm4gY3A7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3VubGluayhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCkKK3sgcmVnaXN0ZXIgY2hhciAqKnE7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2NsaXN0ICoqY3A7CisgIGlmICghc29hcCB8fCAhcCkKKyAgICByZXR1cm47CisgIGZvciAocSA9IChjaGFyKiopJnNvYXAtPmFsaXN0OyAqcTsgcSA9ICooY2hhcioqKilxKQorICB7IGlmIChwID09ICh2b2lkKikoKnEgLSAqKHNpemVfdCopKCpxICsgc2l6ZW9mKHZvaWQqKSkpKQorICAgIHsgKnEgPSAqKihjaGFyKioqKXE7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVubGlua2VkIGRhdGEgJXBcbiIsIHApKTsKKyNpZmRlZiBTT0FQX0RFQlVHCisgICAgICBzb2FwX3RyYWNrX3VubGluayhzb2FwLCBwKTsKKyNlbmRpZgorICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBmb3IgKGNwID0gJnNvYXAtPmNsaXN0OyAqY3A7IGNwID0gJigqY3ApLT5uZXh0KQorICB7IGlmIChwID09ICgqY3ApLT5wdHIpCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVubGlua2VkIGNsYXNzIGluc3RhbmNlICVwXG4iLCBwKSk7CisgICAgICBxID0gKGNoYXIqKikqY3A7CisgICAgICAqY3AgPSAoKmNwKS0+bmV4dDsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBxKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfbG9va3VwX3R5cGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIGlmIChpZCAmJiAqaWQpCisgIHsgaXAgPSBzb2FwX2xvb2t1cChzb2FwLCBpZCk7CisgICAgaWYgKGlwKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJMb29rdXAgaWQ9JyVzJyB0eXBlPSVkXG4iLCBpZCwgaXAtPnR5cGUpKTsKKyAgICAgIHJldHVybiBpcC0+dHlwZTsKKyAgICB9CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJsb29rdXAgdHlwZSBpZD0nJXMnIE5PVCBGT1VORCEgTmVlZCB0byBnZXQgaXQgZnJvbSB4c2k6dHlwZVxuIiwgaWQpKTsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkKgorU09BUF9GTUFDMgorc29hcF9pZF9sb29rdXAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCB2b2lkICoqcCwgaW50IHQsIHNpemVfdCBuLCB1bnNpZ25lZCBpbnQgaykKK3sgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworICB2b2lkICoqcTsKKyAgaWYgKCFwIHx8ICFpZCB8fCAhKmlkKQorICAgIHJldHVybiBwOworICBpcCA9IHNvYXBfbG9va3VwKHNvYXAsIGlkKTsgLyogbG9va3VwIHBvaW50ZXIgdG8gaGFzaCB0YWJsZSBlbnRyeSBmb3Igc3RyaW5nIGlkICovCisgIGlmICghaXApCisgIHsgaXAgPSBzb2FwX2VudGVyKHNvYXAsIGlkKTsgLyogbmV3IGhhc2ggdGFibGUgZW50cnkgZm9yIHN0cmluZyBpZCAqLworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRm9yd2FyZGluZyBmaXJzdCBocmVmPSclcycgdHlwZT0lZCAlcCAoJXUgYnl0ZXMpXG4iLCBpZCwgdCwgcCwgKHVuc2lnbmVkIGludCluKSk7CisgICAgaXAtPnR5cGUgPSB0OworICAgIGlwLT5zaXplID0gbjsgCisgICAgaXAtPmxpbmsgPSBwOworICAgIGlwLT5jb3B5ID0gTlVMTDsKKyAgICBpcC0+Zmxpc3QgPSBOVUxMOworICAgIGlwLT5wdHIgPSBOVUxMOworICAgIGlwLT5sZXZlbCA9IGs7CisgICAgKnAgPSBOVUxMOworICB9CisgIGVsc2UgaWYgKGlwLT5wdHIpCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHZlZCBocmVmPSclcycgdHlwZT0lZCBsb2NhdGlvbj0lcCAoJXUgYnl0ZXMpXG4iLCBpZCwgdCwgaXAtPnB0ciwgKHVuc2lnbmVkIGludCluKSk7CisgICAgaWYgKGlwLT50eXBlICE9IHQpCisgICAgeyBzdHJjcHkoc29hcC0+aWQsIGlkKTsKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9IUkVGOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJUeXBlIGluY29tcGF0aWJpbGl0eTogaWQgdHlwZT0lZCBocmVmIHR5cGU9JWRcbiIsIGlwLT50eXBlLCB0KSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgd2hpbGUgKGlwLT5sZXZlbCA8IGspCisgICAgeyBxID0gKHZvaWQqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yodm9pZCopKTsgIAorICAgICAgaWYgKCFxKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICpwID0gKHZvaWQqKXE7CisgICAgICBwID0gcTsKKyAgICAgIGstLTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVzY2VuZGluZyBvbmUgbGV2ZWwuLi5cbiIpKTsKKyAgICB9CisgICAgKnAgPSBpcC0+cHRyOworICB9CisgIGVsc2UgaWYgKGlwLT5sZXZlbCA+IGspCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHZpbmcgbGV2ZWwgJXUgcG9pbnRlcnMgdG8gaHJlZj0nJXMnXG4iLCBpcC0+bGV2ZWwsIGlkKSk7CisgICAgd2hpbGUgKGlwLT5sZXZlbCA+IGspCisgICAgeyB2b2lkICpzLCAqKnIgPSAmaXAtPmxpbms7CisgICAgICBxID0gKHZvaWQqKilpcC0+bGluazsKKyAgICAgIHdoaWxlIChxKQorICAgICAgeyAqciA9ICh2b2lkKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yodm9pZCopKTsKKyAgICAgICAgcyA9ICpxOworICAgICAgICAqcSA9ICpyOworICAgICAgICByID0gKHZvaWQqKikqcjsKKyAgICAgICAgcSA9ICh2b2lkKiopczsKKyAgICAgIH0KKyAgICAgICpyID0gTlVMTDsKKyAgICAgIGlwLT5zaXplID0gbjsgCisgICAgICBpcC0+Y29weSA9IE5VTEw7CisgICAgICBpcC0+bGV2ZWwgPSBpcC0+bGV2ZWwgLSAxOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJEZXNjZW5kaW5nIG9uZSBsZXZlbC4uLlxuIikpOworICAgIH0KKyAgICBxID0gKHZvaWQqKilpcC0+bGluazsKKyAgICBpcC0+bGluayA9IHA7CisgICAgKnAgPSAodm9pZCopcTsKKyAgfQorICBlbHNlCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGb3J3YXJkZWQgaHJlZj0nJXMnIHR5cGU9JWQgbG9jYXRpb249JXAgKCV1IGJ5dGVzKVxuIiwgaWQsIHQsIHAsICh1bnNpZ25lZCBpbnQpbikpOworICAgIHdoaWxlIChpcC0+bGV2ZWwgPCBrKQorICAgIHsgcSA9ICh2b2lkKiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHZvaWQqKSk7ICAKKyAgICAgICpwID0gcTsKKyAgICAgIHAgPSBxOworICAgICAgay0tOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJEZXNjZW5kaW5nIG9uZSBsZXZlbC4uLlxuIikpOworICAgIH0KKyAgICBxID0gKHZvaWQqKilpcC0+bGluazsKKyAgICBpcC0+bGluayA9IHA7CisgICAgKnAgPSAodm9pZCopcTsKKyAgfQorICByZXR1cm4gcDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQqCitTT0FQX0ZNQUMyCitzb2FwX2lkX2ZvcndhcmQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmhyZWYsIHZvaWQgKnAsIHNpemVfdCBsZW4sIGludCBzdCwgaW50IHR0LCBzaXplX3QgbiwgdW5zaWduZWQgaW50IGssIHZvaWQgKCpmY29weSkoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIHNpemVfdCwgY29uc3Qgdm9pZCosIHNpemVfdCkpCit7IHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgaWYgKCFwIHx8ICFocmVmIHx8ICEqaHJlZikKKyAgICByZXR1cm4gcDsKKyAgaXAgPSBzb2FwX2xvb2t1cChzb2FwLCBocmVmKTsgLyogbG9va3VwIHBvaW50ZXIgdG8gaGFzaCB0YWJsZSBlbnRyeSBmb3Igc3RyaW5nIGlkICovCisgIGlmICghaXApCisgIHsgaXAgPSBzb2FwX2VudGVyKHNvYXAsIGhyZWYpOyAvKiBuZXcgaGFzaCB0YWJsZSBlbnRyeSBmb3Igc3RyaW5nIGlkICovCisgICAgaXAtPnR5cGUgPSBzdDsKKyAgICBpcC0+c2l6ZSA9IG47CisgICAgaXAtPmxpbmsgPSBOVUxMOworICAgIGlwLT5jb3B5ID0gTlVMTDsKKyAgICBpcC0+cHRyID0gTlVMTDsKKyAgICBpcC0+bGV2ZWwgPSAwOworICAgIGlwLT5mbGlzdCA9IE5VTEw7CisgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk5ldyBlbnRyeSBocmVmPSclcycgdHlwZT0lZCBzaXplPSVsdSBsZXZlbD0lZCBsb2NhdGlvbj0lcFxuIiwgaHJlZiwgc3QsICh1bnNpZ25lZCBsb25nKW4sIGssIHApKTsKKyAgfQorICBlbHNlIGlmIChpcC0+dHlwZSAhPSBzdCB8fCAoaXAtPmxldmVsID09IGsgJiYgaXAtPnNpemUgIT0gbikpCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJUeXBlIGluY29tcGF0aWJpbGl0eSBpZD0nJXMnIGV4cGVjdCB0eXBlPSVkIHNpemU9JWx1IGxldmVsPSV1IGdvdCB0eXBlPSVkIHNpemU9JWx1XG4iLCBocmVmLCBpcC0+dHlwZSwgKHVuc2lnbmVkIGxvbmcpaXAtPnNpemUsIGssIHN0LCAodW5zaWduZWQgbG9uZyluKSk7CisgICAgc3RyY3B5KHNvYXAtPmlkLCBocmVmKTsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfSFJFRjsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoZmNvcHkgfHwgbiA8IHNpemVvZih2b2lkKikgfHwgKmhyZWYgIT0gJyMnKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2ZsaXN0ICpmcCA9IChzdHJ1Y3Qgc29hcF9mbGlzdCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2ZsaXN0KSk7CisgICAgaWYgKCFmcCkKKyAgICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZnAtPm5leHQgPSBpcC0+Zmxpc3Q7CisgICAgZnAtPnR5cGUgPSB0dDsKKyAgICBmcC0+cHRyID0gcDsKKyAgICBmcC0+bGV2ZWwgPSBrOworICAgIGZwLT5sZW4gPSBsZW47CisgICAgaWYgKGZjb3B5KQorICAgICAgZnAtPmZjb3B5ID0gZmNvcHk7CisgICAgZWxzZQorICAgICAgZnAtPmZjb3B5ID0gc29hcF9mY29weTsKKyAgICBpcC0+Zmxpc3QgPSBmcDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZvcndhcmRpbmcgdHlwZT0lZCAodGFyZ2V0IHR5cGU9JWQpIHNpemU9JWx1IGxvY2F0aW9uPSVwIGxldmVsPSV1IGxlbj0lbHUgaHJlZj0nJXMnXG4iLCBzdCwgdHQsICh1bnNpZ25lZCBsb25nKW4sIHAsIGssICh1bnNpZ25lZCBsb25nKWxlbiwgaHJlZikpOworICB9CisgIGVsc2UKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZvcndhcmRpbmcgY29weWluZyBhZGRyZXNzICVwIGZvciB0eXBlPSVkIGhyZWY9JyVzJ1xuIiwgcCwgc3QsIGhyZWYpKTsKKyAgICAqKHZvaWQqKilwID0gaXAtPmNvcHk7CisgICAgaXAtPmNvcHkgPSBwOworICB9CisgIHJldHVybiBwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkKgorU09BUF9GTUFDMgorc29hcF9pZF9lbnRlcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIHZvaWQgKnAsIGludCB0LCBzaXplX3QgbiwgdW5zaWduZWQgaW50IGssIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmFycmF5VHlwZSwgdm9pZCAqKCpmaW5zdGFudGlhdGUpKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopKQoreworI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworI2VuZGlmCisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJFbnRlciBpZD0nJXMnIHR5cGU9JWQgbG9jPSVwIHNpemU9JWx1IGxldmVsPSV1XG4iLCBpZCwgdCwgcCwgKHVuc2lnbmVkIGxvbmcpbiwgaykpOworICBzb2FwLT5hbGxvY2VkID0gMDsKKyAgaWYgKCFwKQorICB7IGlmIChmaW5zdGFudGlhdGUpCisgICAgICBwID0gZmluc3RhbnRpYXRlKHNvYXAsIHQsIHR5cGUsIGFycmF5VHlwZSwgJm4pOworICAgIGVsc2UKKyAgICAgIHAgPSBzb2FwX21hbGxvYyhzb2FwLCBuKTsKKyAgICBpZiAocCkKKyAgICAgIHNvYXAtPmFsbG9jZWQgPSAxOworICB9CisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICBpZiAoIWlkIHx8ICEqaWQpCisjZW5kaWYKKyAgICByZXR1cm4gcDsKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgIGlwID0gc29hcF9sb29rdXAoc29hcCwgaWQpOyAvKiBsb29rdXAgcG9pbnRlciB0byBoYXNoIHRhYmxlIGVudHJ5IGZvciBzdHJpbmcgaWQgKi8KKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkxvb2t1cCBlbnRyeSBpZD0nJXMgZm9yIGxvY2F0aW9uPSVwJ1xuIiwgaWQsIHApKTsKKyAgaWYgKCFpcCkKKyAgeyBpcCA9IHNvYXBfZW50ZXIoc29hcCwgaWQpOyAvKiBuZXcgaGFzaCB0YWJsZSBlbnRyeSBmb3Igc3RyaW5nIGlkICovCisgICAgaXAtPnR5cGUgPSB0OworICAgIGlwLT5saW5rID0gTlVMTDsKKyAgICBpcC0+Y29weSA9IE5VTEw7CisgICAgaXAtPmZsaXN0ID0gTlVMTDsKKyAgICBpcC0+c2l6ZSA9IG47CisgICAgaXAtPnB0ciA9IHA7CisgICAgaXAtPmxldmVsID0gazsKKyAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiTmV3IGVudHJ5IGlkPSclcycgdHlwZT0lZCBzaXplPSVsdSBsZXZlbD0ldSBsb2NhdGlvbj0lcFxuIiwgaWQsIHQsICh1bnNpZ25lZCBsb25nKW4sIGssIHApKTsKKyAgfQorICBlbHNlIGlmICgoaXAtPnR5cGUgIT0gdCB8fCAoaXAtPmxldmVsID09IGsgJiYgaXAtPnNpemUgIT0gbikpICYmIChpcC0+Y29weSB8fCBpcC0+Zmxpc3QpKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVHlwZSBpbmNvbXBhdGliaWxpdHkgaWQ9JyVzJyBleHBlY3QgdHlwZT0lZCBzaXplPSVsdSBsZXZlbD0ldSBnb3QgdHlwZT0lZCBzaXplPSVsdVxuIiwgaWQsIGlwLT50eXBlLCAodW5zaWduZWQgbG9uZylpcC0+c2l6ZSwgaywgdCwgKHVuc2lnbmVkIGxvbmcpbikpOworICAgIHN0cmNweShzb2FwLT5pZCwgaWQpOworICAgIHNvYXAtPmVycm9yID0gU09BUF9IUkVGOworICAgIHJldHVybiBOVUxMOworICB9CisgIGVsc2UgaWYgKGlwLT5wdHIpCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJNdWx0aXBseSBkZWZpbmVkIGlkPSclcydcbiIsIGlkKSk7CisgICAgc3RyY3B5KHNvYXAtPmlkLCBpZCk7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0RVUExJQ0FURV9JRDsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBlbHNlIAorICB7IGlwLT5zaXplID0gbjsKKyAgICBpcC0+cHRyID0gcDsKKyAgICBpcC0+bGV2ZWwgPSBrOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVXBkYXRlIGVudHJ5IGlkPSclcycgdHlwZT0lZCBsb2NhdGlvbj0lcCBzaXplPSVsdSBsZXZlbD0ldVxuIiwgaWQsIHQsIHAsICh1bnNpZ25lZCBsb25nKW4sIGspKTsKKyAgfQorICByZXR1cm4gaXAtPnB0cjsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9mY29weShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0LCBpbnQgdHQsIHZvaWQgKnAsIHNpemVfdCBsZW4sIGNvbnN0IHZvaWQgKnEsIHNpemVfdCBuKQoreyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weWluZyBkYXRhIHR5cGU9JWQgKHRhcmdldCB0eXBlPSVkKSAlcCAtPiAlcCAoJWx1IGJ5dGVzKVxuIiwgc3QsIHR0LCBxLCBwLCAodW5zaWduZWQgbG9uZyluKSk7CisgIG1lbWNweShwLCBxLCBuKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbmRfc2VuZChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5kaW1lLmxpc3QpCisgIHsgLyogU09BUCBib2R5IHJlZmVyZW5jZWQgYXR0YWNobWVudHMgbXVzdCBhcHBlYXIgZmlyc3QgKi8KKyAgICBzb2FwLT5kaW1lLmxhc3QtPm5leHQgPSBzb2FwLT5kaW1lLmZpcnN0OworICAgIHNvYXAtPmRpbWUuZmlyc3QgPSBzb2FwLT5kaW1lLmxpc3QtPm5leHQ7CisgICAgc29hcC0+ZGltZS5saXN0LT5uZXh0ID0gTlVMTDsKKyAgICBzb2FwLT5kaW1lLmxhc3QgPSBzb2FwLT5kaW1lLmxpc3Q7CisgIH0KKyAgaWYgKHNvYXBfcHV0ZGltZShzb2FwKSB8fCBzb2FwX3B1dG1pbWUoc29hcCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBzb2FwLT5taW1lLmxpc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5sYXN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5saXN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGFzdCA9IE5VTEw7CisjZW5kaWYKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgc2VuZFxuIikpOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pIC8qIG5lZWQgdG8gZmx1c2ggdGhlIHJlbWFpbmluZyBkYXRhIGluIGJ1ZmZlciAqLworICB7IGlmIChzb2FwX2ZsdXNoKHNvYXApKQorI2lmZGVmIFdJVEhfWkxJQgorICAgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCICYmIHNvYXAtPnpsaWJfc3RhdGUgPT0gU09BUF9aTElCX0RFRkxBVEUpCisgICAgICB7IHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfTk9ORTsKKyAgICAgICAgZGVmbGF0ZUVuZCgmc29hcC0+ZF9zdHJlYW0pOworICAgICAgfQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyNlbHNlCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjZW5kaWYKKyNpZmRlZiBXSVRIX1pMSUIKKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIpCisgICAgeyBpbnQgcjsKKyAgICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luID0gMDsKKyAgICAgIGRvCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVmbGF0aW5nIHJlbWFpbmRlclxuIikpOworICAgICAgICByID0gZGVmbGF0ZSgmc29hcC0+ZF9zdHJlYW0sIFpfRklOSVNIKTsKKyAgICAgICAgaWYgKHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCAhPSBTT0FQX0JVRkxFTikKKyAgICAgICAgeyBpZiAoc29hcF9mbHVzaF9yYXcoc29hcCwgc29hcC0+el9idWYsIFNPQVBfQlVGTEVOIC0gc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0KSkKKyAgICAgICAgICB7IHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfTk9ORTsKKyAgICAgICAgICAgIGRlZmxhdGVFbmQoJnNvYXAtPmRfc3RyZWFtKTsKKyAgICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKwkgIH0KKyAgICAgICAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IChCeXRlKilzb2FwLT56X2J1ZjsKKyAgICAgICAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgPSBTT0FQX0JVRkxFTjsKKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAociA9PSBaX09LKTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVmbGF0ZWQgJWx1LT4lbHUgYnl0ZXNcbiIsIHNvYXAtPmRfc3RyZWFtLnRvdGFsX2luLCBzb2FwLT5kX3N0cmVhbS50b3RhbF9vdXQpKTsKKyAgICAgIHNvYXAtPnpfcmF0aW9fb3V0ID0gKGZsb2F0KXNvYXAtPmRfc3RyZWFtLnRvdGFsX291dCAvIChmbG9hdClzb2FwLT5kX3N0cmVhbS50b3RhbF9pbjsKKyAgICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX1pMSUI7CisgICAgICBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX05PTkU7CisgICAgICBpZiAoZGVmbGF0ZUVuZCgmc29hcC0+ZF9zdHJlYW0pICE9IFpfT0sgfHwgciAhPSBaX1NUUkVBTV9FTkQpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVW5hYmxlIHRvIGVuZCBkZWZsYXRlOiAlc1xuIiwgc29hcC0+ZF9zdHJlYW0ubXNnP3NvYXAtPmRfc3RyZWFtLm1zZzoiIikpOworICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgICB9CisjaWZkZWYgV0lUSF9HWklQCisgICAgICBzb2FwLT56X2J1ZlswXSA9IHNvYXAtPnpfY3JjICYgMHhGRjsKKyAgICAgIHNvYXAtPnpfYnVmWzFdID0gKHNvYXAtPnpfY3JjID4+IDgpICYgMHhGRjsKKyAgICAgIHNvYXAtPnpfYnVmWzJdID0gKHNvYXAtPnpfY3JjID4+IDE2KSAmIDB4RkY7CisgICAgICBzb2FwLT56X2J1ZlszXSA9IChzb2FwLT56X2NyYyA+PiAyNCkgJiAweEZGOworICAgICAgc29hcC0+el9idWZbNF0gPSBzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiAmIDB4RkY7CisgICAgICBzb2FwLT56X2J1Zls1XSA9IChzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiA+PiA4KSAmIDB4RkY7CisgICAgICBzb2FwLT56X2J1Zls2XSA9IChzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiA+PiAxNikgJiAweEZGOworICAgICAgc29hcC0+el9idWZbN10gPSAoc29hcC0+ZF9zdHJlYW0udG90YWxfaW4gPj4gMjQpICYgMHhGRjsKKyAgICAgIGlmIChzb2FwX2ZsdXNoX3Jhdyhzb2FwLCBzb2FwLT56X2J1ZiwgOCkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZ3ppcCBjcmMzMj0lbHVcbiIsICh1bnNpZ25lZCBsb25nKXNvYXAtPnpfY3JjKSk7CisjZW5kaWYKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX1NUT1JFKQorICAgIHsgY2hhciAqcDsKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyAgICAgIGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpKQorICAgICAgeyBzb2FwLT5tb2RlLS07CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2VuZGluZyBidWZmZXJlZCBtZXNzYWdlIG9mIGxlbmd0aCAldVxuIiwgKHVuc2lnbmVkIGludClzb2FwLT5ibGlzdC0+c2l6ZSkpOworICAgICAgICBpZiAoc29hcC0+c3RhdHVzID49IFNPQVBfUE9TVCkKKyAgICAgICAgICBzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0KHNvYXAsIHNvYXAtPmVuZHBvaW50LCBzb2FwLT5ob3N0LCBzb2FwLT5wb3J0LCBzb2FwLT5wYXRoLCBzb2FwLT5hY3Rpb24sIHNvYXAtPmJsaXN0LT5zaXplKTsKKyAgICAgICAgZWxzZSBpZiAoc29hcC0+c3RhdHVzICE9IFNPQVBfU1RPUCkKKyAgICAgICAgICBzb2FwLT5lcnJvciA9IHNvYXAtPmZyZXNwb25zZShzb2FwLCBzb2FwLT5zdGF0dXMsIHNvYXAtPmJsaXN0LT5zaXplKTsKKyAgICAgICAgaWYgKHNvYXAtPmVycm9yIHx8IHNvYXBfZmx1c2goc29hcCkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBzb2FwLT5tb2RlKys7CisgICAgICB9CisjZW5kaWYKKyAgICAgIGZvciAocCA9IHNvYXBfZmlyc3RfYmxvY2soc29hcCk7IHA7IHAgPSBzb2FwX25leHRfYmxvY2soc29hcCkpCisgICAgICB7IERCR01TRyhTRU5ULCBwLCBzb2FwX2Jsb2NrX3NpemUoc29hcCkpOworICAgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnNlbmQoc29hcCwgcCwgc29hcF9ibG9ja19zaXplKHNvYXApKSkpCisgICAgICAgIHsgc29hcF9lbmRfYmxvY2soc29hcCk7CisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICB9CisgICAgICB9CisgICAgICBzb2FwX2VuZF9ibG9jayhzb2FwKTsKKyAgICB9CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgICAgZWxzZSBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKQorICAgIHsgREJHTVNHKFNFTlQsICJcclxuMFxyXG5cclxuIiwgNyk7CisgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnNlbmQoc29hcCwgIlxyXG4wXHJcblxyXG4iLCA3KSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisjZW5kaWYKKyAgfQorI2lmZGVmIFdJVEhfVENQRklOCisjaWZkZWYgV0lUSF9PUEVOU1NMCisgIGlmICghc29hcC0+c3NsICYmIHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkgJiYgIXNvYXAtPmtlZXBfYWxpdmUgJiYgIShzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICBzb2FwLT5mc2h1dGRvd25zb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgMSk7IC8qIFNlbmQgVENQIEZJTiAqLworI2Vsc2UKKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkgJiYgIXNvYXAtPmtlZXBfYWxpdmUgJiYgIShzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICBzb2FwLT5mc2h1dGRvd25zb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgMSk7IC8qIFNlbmQgVENQIEZJTiAqLworI2VuZGlmCisjZW5kaWYKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgb2Ygc2VuZCBwaGFzZVxuIikpOworICBzb2FwLT5vbW9kZSAmPSB+U09BUF9YTUxfU0VDOworICBzb2FwLT5jb3VudCA9IDA7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0VORDsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW5kX3JlY3Yoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPnBhcnQgPSBTT0FQX0VORDsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkgJiYgc29hcF9nZXRkaW1lKHNvYXApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgc29hcC0+ZGltZS5saXN0ID0gc29hcC0+ZGltZS5maXJzdDsKKyAgc29hcC0+ZGltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGFzdCA9IE5VTEw7CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01JTUUpICYmIHNvYXBfZ2V0bWltZShzb2FwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHNvYXAtPm1pbWUubGlzdCA9IHNvYXAtPm1pbWUuZmlyc3Q7CisgIHNvYXAtPm1pbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmxhc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gTlVMTDsKKyNlbmRpZgorICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIG9mIHJlY2VpdmUgbWVzc2FnZSBva1xuIikpOworI2lmZGVmIFdJVEhfWkxJQgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIpCisgIHsgc29hcC0+bW9kZSAmPSB+U09BUF9FTkNfWkxJQjsKKyAgICBtZW1jcHkoc29hcC0+YnVmLCBzb2FwLT56X2J1ZiwgU09BUF9CVUZMRU4pOworICAgIHNvYXAtPmJ1ZmlkeCA9IChjaGFyKilzb2FwLT5kX3N0cmVhbS5uZXh0X2luIC0gc29hcC0+el9idWY7CisgICAgc29hcC0+YnVmbGVuID0gc29hcC0+el9idWZsZW47CisgICAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9OT05FOworICAgIGlmIChpbmZsYXRlRW5kKCZzb2FwLT5kX3N0cmVhbSkgIT0gWl9PSykKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyNpZmRlZiBXSVRIX0daSVAKKyAgICBpZiAoc29hcC0+emxpYl9pbiA9PSBTT0FQX1pMSUJfR1pJUCkKKyAgICB7IHNvYXBfd2NoYXIgYzsKKyAgICAgIHNob3J0IGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgeyBpZiAoKGludCkoYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKSkgPT0gRU9GKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgICAgICBzb2FwLT56X2J1ZltpXSA9IChjaGFyKWM7CisgICAgICB9CisgICAgICBpZiAoc29hcC0+el9jcmMgIT0gKCh1TG9uZykodW5zaWduZWQgY2hhcilzb2FwLT56X2J1ZlswXSB8ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbMV0gPDwgOCkgfCAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzJdIDw8IDE2KSB8ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbM10gPDwgMjQpKSkKKyAgICAgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkd6aXAgZXJyb3I6IGNyYyBjaGVjayBmYWlsZWQsIG1lc3NhZ2UgY29ycnVwdGVkPyAoY3JjMzI9JWx1KVxuIiwgKHVuc2lnbmVkIGxvbmcpc29hcC0+el9jcmMpKTsKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgfQorICAgICAgaWYgKHNvYXAtPmRfc3RyZWFtLnRvdGFsX291dCAhPSAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzRdIHwgKCh1TG9uZykodW5zaWduZWQgY2hhcilzb2FwLT56X2J1Zls1XSA8PCA4KSB8ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbNl0gPDwgMTYpIHwgKCh1TG9uZykodW5zaWduZWQgY2hhcilzb2FwLT56X2J1Zls3XSA8PCAyNCkpKQorICAgICAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiR3ppcCBlcnJvcjogaW5jb3JyZWN0IG1lc3NhZ2UgbGVuZ3RoXG4iKSk7CisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgfQorI2VuZGlmCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgICAgd2hpbGUgKChpbnQpc29hcF9nZXRjaGFyKHNvYXApICE9IEVPRikgLyogYWR2YW5jZSB0byBsYXN0IGNodW5rICovCisgICAgICA7CisgIGlmIChzb2FwLT5mZGlzY29ubmVjdCAmJiAoc29hcC0+ZXJyb3IgPSBzb2FwLT5mZGlzY29ubmVjdChzb2FwKSkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgcmV0dXJuIHNvYXBfcmVzb2x2ZShzb2FwKTsKKyNlbHNlCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT54bGlzdCkKKyAgeyBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX01JTUVfSFJFRjsKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0RJTUVfSFJFRjsKKyAgfQorI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2ZyZWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHN0cnVjdCBOYW1lc3BhY2UgKm5zOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWUgbmFtZXNwYWNlIHN0YWNrXG4iKSk7CisgIHdoaWxlIChzb2FwLT5ubGlzdCkKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnAgPSBzb2FwLT5ubGlzdC0+bmV4dDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+bmxpc3QpOworICAgIHNvYXAtPm5saXN0ID0gbnA7CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIGFueSByZW1haW5pbmcgdGVtcCBibG9ja3NcbiIpKTsKKyAgd2hpbGUgKHNvYXAtPmJsaXN0KQorICAgIHNvYXBfZW5kX2Jsb2NrKHNvYXApOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWUgYXR0cmlidXRlIHN0b3JhZ2VcbiIpKTsKKyAgd2hpbGUgKHNvYXAtPmF0dHJpYnV0ZXMpCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfYXR0cmlidXRlICp0cCA9IHNvYXAtPmF0dHJpYnV0ZXMtPm5leHQ7CisgICAgaWYgKHNvYXAtPmF0dHJpYnV0ZXMtPnZhbHVlKQorICAgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPmF0dHJpYnV0ZXMtPnZhbHVlKTsKKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+YXR0cmlidXRlcyk7CisgICAgc29hcC0+YXR0cmlidXRlcyA9IHRwOworICB9CisjaWZkZWYgV0lUSF9GQVNUCisgIGlmIChzb2FwLT5sYWJidWYpCisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPmxhYmJ1Zik7CisgIHNvYXAtPmxhYmJ1ZiA9IE5VTEw7CisgIHNvYXAtPmxhYmxlbiA9IDA7CisgIHNvYXAtPmxhYmlkeCA9IDA7CisjZW5kaWYKKyAgbnMgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzOworICBpZiAobnMpCisgIHsgZm9yICg7IG5zLT5pZDsgbnMrKykKKyAgICB7IGlmIChucy0+b3V0KQorICAgICAgeyBpZiAoc29hcC0+ZW5jb2RpbmdTdHlsZSA9PSBucy0+b3V0KQorICAgICAgICAgIHNvYXAtPmVuY29kaW5nU3R5bGUgPSBTT0FQX1NUUl9FT1M7CisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBucy0+b3V0KTsKKyAgICAgICAgbnMtPm91dCA9IE5VTEw7CisgICAgICB9CisgICAgICBpZiAoc29hcC0+ZW5jb2RpbmdTdHlsZSA9PSBucy0+bnMpCisgICAgICAgIHNvYXAtPmVuY29kaW5nU3R5bGUgPSBTT0FQX1NUUl9FT1M7CisgICAgfQorICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzKTsKKyAgICBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzID0gTlVMTDsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICB3aGlsZSAoc29hcC0+eGxpc3QpCisgIHsgc3RydWN0IHNvYXBfeGxpc3QgKnhwID0gc29hcC0+eGxpc3QtPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPnhsaXN0KTsKKyAgICBzb2FwLT54bGlzdCA9IHhwOworICB9CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgIHNvYXBfZnJlZV9waHQoc29hcCk7CisgIHNvYXBfZnJlZV9paHQoc29hcCk7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK3N0YXRpYyB2b2lkCitzb2FwX2luaXRfbG9ncyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX01BWExPR1M7IGkrKykKKyAgeyBzb2FwLT5sb2dmaWxlW2ldID0gTlVMTDsKKyAgICBzb2FwLT5mZGVidWdbaV0gPSBOVUxMOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAhZGVmaW5lZChXSVRIX0xFQU4pIHx8IGRlZmluZWQoU09BUF9ERUJVRykKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfb3Blbl9sb2dmaWxlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgaSkKK3sgaWYgKHNvYXAtPmxvZ2ZpbGVbaV0pCisgICAgc29hcC0+ZmRlYnVnW2ldID0gZm9wZW4oc29hcC0+bG9nZmlsZVtpXSwgaSA8IDIgPyAiYWIiIDogImEiKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK3N0YXRpYyB2b2lkCitzb2FwX2Nsb3NlX2xvZ2ZpbGUoc3RydWN0IHNvYXAgKnNvYXAsIGludCBpKQoreyBpZiAoc29hcC0+ZmRlYnVnW2ldKQorICB7IGZjbG9zZShzb2FwLT5mZGVidWdbaV0pOworICAgIHNvYXAtPmZkZWJ1Z1tpXSA9IE5VTEw7CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfY2xvc2VfbG9nZmlsZXMoc3RydWN0IHNvYXAgKnNvYXApCit7IGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9NQVhMT0dTOyBpKyspCisgICAgc29hcF9jbG9zZV9sb2dmaWxlKHNvYXAsIGkpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworc3RhdGljIHZvaWQKK3NvYXBfc2V0X2xvZ2ZpbGUoc3RydWN0IHNvYXAgKnNvYXAsIGludCBpLCBjb25zdCBjaGFyICpsb2dmaWxlKQoreyBjaGFyICpzID0gTlVMTDsKKyAgc29hcF9jbG9zZV9sb2dmaWxlKHNvYXAsIGkpOworICBpZiAoc29hcC0+bG9nZmlsZVtpXSkKKyAgICBTT0FQX0ZSRUUoc29hcCwgKHZvaWQqKXNvYXAtPmxvZ2ZpbGVbaV0pOworICBpZiAobG9nZmlsZSkKKyAgICBpZiAoKHMgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKGxvZ2ZpbGUpICsgMSkpKQorICAgICAgc3RyY3B5KHMsIGxvZ2ZpbGUpOworICBzb2FwLT5sb2dmaWxlW2ldID0gczsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X3JlY3ZfbG9nZmlsZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbG9nZmlsZSkKK3sgc29hcF9zZXRfbG9nZmlsZShzb2FwLCBTT0FQX0lOREVYX1JFQ1YsIGxvZ2ZpbGUpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfc2VudF9sb2dmaWxlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpsb2dmaWxlKQoreyBzb2FwX3NldF9sb2dmaWxlKHNvYXAsIFNPQVBfSU5ERVhfU0VOVCwgbG9nZmlsZSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF90ZXN0X2xvZ2ZpbGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmxvZ2ZpbGUpCit7IHNvYXBfc2V0X2xvZ2ZpbGUoc29hcCwgU09BUF9JTkRFWF9URVNULCBsb2dmaWxlKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwKgorU09BUF9GTUFDMgorc29hcF9jb3B5KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZXR1cm4gc29hcF9jb3B5X2NvbnRleHQoKHN0cnVjdCBzb2FwKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2FwKSksIHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc3RydWN0IHNvYXAqCitTT0FQX0ZNQUMyCitzb2FwX2NvcHlfY29udGV4dChzdHJ1Y3Qgc29hcCAqY29weSwgc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwX2NoZWNrX3N0YXRlKHNvYXApKQorICAgIHJldHVybiBOVUxMOworICBpZiAoY29weSkKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnA7CisgICAgbWVtY3B5KGNvcHksIHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcCkpOworICAgIGNvcHktPnN0YXRlID0gU09BUF9DT1BZOworICAgIGNvcHktPnVzZXIgPSBOVUxMOworICAgIGNvcHktPmVycm9yID0gU09BUF9PSzsKKyAgICBjb3B5LT51c2VyaWQgPSBOVUxMOworICAgIGNvcHktPnBhc3N3ZCA9IE5VTEw7CisgICAgY29weS0+bmxpc3QgPSBOVUxMOworICAgIGNvcHktPmJsaXN0ID0gTlVMTDsKKyAgICBjb3B5LT5jbGlzdCA9IE5VTEw7CisgICAgY29weS0+YWxpc3QgPSBOVUxMOworICAgIGNvcHktPmF0dHJpYnV0ZXMgPSBOVUxMOworI2lmZGVmIFdJVEhfRkFTVAorICAgIGNvcHktPmxhYmJ1ZiA9IE5VTEw7CisgICAgY29weS0+bGFibGVuID0gMDsKKyAgICBjb3B5LT5sYWJpZHggPSAwOworI2VuZGlmCisjaWZkZWYgU09BUF9ERUJVRworICAgIHNvYXBfaW5pdF9taHQoY29weSk7CisjZW5kaWYKKyAgICBjb3B5LT5sb2NhbF9uYW1lc3BhY2VzID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgICAgc29hcF9pbml0X2lodChjb3B5KTsKKyAgICBzb2FwX2luaXRfcGh0KGNvcHkpOworI2VuZGlmCisgICAgY29weS0+aGVhZGVyID0gTlVMTDsKKyAgICBjb3B5LT5mYXVsdCA9IE5VTEw7CisgICAgY29weS0+YWN0aW9uID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisjaWZkZWYgV0lUSF9DT09LSUVTCisgICAgY29weS0+Y29va2llcyA9IHNvYXBfY29weV9jb29raWVzKGNvcHkpOworI2Vsc2UKKyAgICBjb3B5LT5jb29raWVzID0gTlVMTDsKKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgU09BUF9ERUJVRworICAgIHNvYXBfaW5pdF9sb2dzKGNvcHkpOworICAgIHNvYXBfc2V0X3JlY3ZfbG9nZmlsZShjb3B5LCBzb2FwLT5sb2dmaWxlW1NPQVBfSU5ERVhfUkVDVl0pOworICAgIHNvYXBfc2V0X3NlbnRfbG9nZmlsZShjb3B5LCBzb2FwLT5sb2dmaWxlW1NPQVBfSU5ERVhfU0VOVF0pOworICAgIHNvYXBfc2V0X3Rlc3RfbG9nZmlsZShjb3B5LCBzb2FwLT5sb2dmaWxlW1NPQVBfSU5ERVhfVEVTVF0pOworI2VuZGlmCisgICAgY29weS0+cGx1Z2lucyA9IE5VTEw7CisgICAgZm9yIChwID0gc29hcC0+cGx1Z2luczsgcDsgcCA9IHAtPm5leHQpCisgICAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnEgPSAoc3RydWN0IHNvYXBfcGx1Z2luKilTT0FQX01BTExPQyhjb3B5LCBzaXplb2Yoc3RydWN0IHNvYXBfcGx1Z2luKSk7CisgICAgICBpZiAoIXEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5aW5nIHBsdWdpbiAnJXMnXG4iLCBwLT5pZCkpOworICAgICAgKnEgPSAqcDsKKyAgICAgIGlmIChwLT5mY29weSAmJiAoc29hcC0+ZXJyb3IgPSBwLT5mY29weShjb3B5LCBxLCBwKSkpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IGNvcHkgcGx1Z2luICclcydcbiIsIHAtPmlkKSk7CisgICAgICAgIFNPQVBfRlJFRShjb3B5LCBxKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICBxLT5uZXh0ID0gY29weS0+cGx1Z2luczsKKyAgICAgIGNvcHktPnBsdWdpbnMgPSBxOworICAgIH0KKyAgfQorICBlbHNlCisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgcmV0dXJuIGNvcHk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2luaXQoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPnN0YXRlID0gU09BUF9JTklUOworICBzb2FwLT52ZXJzaW9uID0gMDsKKyAgc29hcF9pbW9kZShzb2FwLCBTT0FQX0lPX0RFRkFVTFQpOworICBzb2FwX29tb2RlKHNvYXAsIFNPQVBfSU9fREVGQVVMVCk7CisgIHNvYXAtPnBsdWdpbnMgPSBOVUxMOworICBzb2FwLT51c2VyID0gTlVMTDsKKyAgc29hcC0+dXNlcmlkID0gTlVMTDsKKyAgc29hcC0+cGFzc3dkID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyAgc29hcC0+ZnBvc3QgPSBodHRwX3Bvc3Q7CisgIHNvYXAtPmZnZXQgPSBodHRwX2dldDsKKyAgc29hcC0+ZmZvcm0gPSBOVUxMOworICBzb2FwLT5mcG9zdGhkciA9IGh0dHBfcG9zdF9oZWFkZXI7CisgIHNvYXAtPmZyZXNwb25zZSA9IGh0dHBfcmVzcG9uc2U7CisgIHNvYXAtPmZwYXJzZSA9IGh0dHBfcGFyc2U7CisgIHNvYXAtPmZwYXJzZWhkciA9IGh0dHBfcGFyc2VfaGVhZGVyOworI2VuZGlmCisgIHNvYXAtPmZjb25uZWN0ID0gTlVMTDsKKyAgc29hcC0+ZmRpc2Nvbm5lY3QgPSBOVUxMOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9JUFY2CisgIHNvYXAtPmZyZXNvbHZlID0gdGNwX2dldGhvc3Q7CisjZWxzZQorICBzb2FwLT5mcmVzb2x2ZSA9IE5VTEw7CisjZW5kaWYKKyAgc29hcC0+ZmFjY2VwdCA9IHRjcF9hY2NlcHQ7CisgIHNvYXAtPmZvcGVuID0gdGNwX2Nvbm5lY3Q7CisgIHNvYXAtPmZjbG9zZSA9IHRjcF9kaXNjb25uZWN0OworICBzb2FwLT5mY2xvc2Vzb2NrZXQgPSB0Y3BfY2xvc2Vzb2NrZXQ7CisgIHNvYXAtPmZzaHV0ZG93bnNvY2tldCA9IHRjcF9zaHV0ZG93bnNvY2tldDsKKyAgc29hcC0+ZnNlbmQgPSBmc2VuZDsKKyAgc29hcC0+ZnJlY3YgPSBmcmVjdjsKKyAgc29hcC0+ZnBvbGwgPSBzb2FwX3BvbGw7CisjZWxzZQorICBzb2FwLT5mb3BlbiA9IE5VTEw7CisgIHNvYXAtPmZjbG9zZSA9IE5VTEw7CisgIHNvYXAtPmZwb2xsID0gTlVMTDsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzb2FwLT5mcHJlcGFyZWluaXQgPSBOVUxMOworICBzb2FwLT5mcHJlcGFyZXNlbmQgPSBOVUxMOworICBzb2FwLT5mcHJlcGFyZXJlY3YgPSBOVUxMOworICBzb2FwLT5mcHJlcGFyZWZpbmFsID0gTlVMTDsKKyNlbmRpZgorICBzb2FwLT5mc2V0ZXJyb3IgPSBOVUxMOworICBzb2FwLT5maWdub3JlID0gTlVMTDsKKyAgc29hcC0+ZnNlcnZlbG9vcCA9IE5VTEw7CisgIHNvYXAtPmZwbHVnaW4gPSBmcGx1Z2luOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzb2FwLT5mZGltZXJlYWRvcGVuID0gTlVMTDsKKyAgc29hcC0+ZmRpbWV3cml0ZW9wZW4gPSBOVUxMOworICBzb2FwLT5mZGltZXJlYWRjbG9zZSA9IE5VTEw7CisgIHNvYXAtPmZkaW1ld3JpdGVjbG9zZSA9IE5VTEw7CisgIHNvYXAtPmZkaW1lcmVhZCA9IE5VTEw7CisgIHNvYXAtPmZkaW1ld3JpdGUgPSBOVUxMOworI2VuZGlmCisgIHNvYXAtPmZsb2F0X2Zvcm1hdCA9ICIlLjhnIjsgLyogLjggcHJlc2VydmVzIHNpbmdsZSBGUCBwcmVjaXNpb24gYXMgbXVjaCBhcyBwb3NzaWJsZSwgYnV0IG1pZ2h0IG5vdCBiZSB2ZXJ5IGVmZmljaWVudCAqLworICBzb2FwLT5kb3VibGVfZm9ybWF0ID0gIiUuMTdsZyI7IC8qIC4xNyBwcmVzZXJ2ZXMgZG91YmxlIEZQIHByZWNpc2lvbiBhcyBtdWNoIGFzIHBvc3NpYmxlLCBidXQgbWlnaHQgbm90IGJlIHZlcnkgZWZmaWNpZW50ICovCisgIHNvYXAtPmRpbWVfaWRfZm9ybWF0ID0gImNpZDppZCVkIjsgLyogZGVmYXVsdCBESU1FIGlkIGZvcm1hdCAqLworICBzb2FwLT5odHRwX3ZlcnNpb24gPSAiMS4xIjsKKyAgc29hcC0+YWN0b3IgPSBOVUxMOworICBzb2FwLT5tYXhfa2VlcF9hbGl2ZSA9IFNPQVBfTUFYS0VFUEFMSVZFOworICBzb2FwLT5rZWVwX2FsaXZlID0gMDsKKyAgc29hcC0+cmVjdl90aW1lb3V0ID0gMDsKKyAgc29hcC0+c2VuZF90aW1lb3V0ID0gMDsKKyAgc29hcC0+Y29ubmVjdF90aW1lb3V0ID0gMDsKKyAgc29hcC0+YWNjZXB0X3RpbWVvdXQgPSAwOworICBzb2FwLT5zb2NrZXRfZmxhZ3MgPSAwOworICBzb2FwLT5jb25uZWN0X2ZsYWdzID0gMDsKKyAgc29hcC0+YmluZF9mbGFncyA9IDA7CisgIHNvYXAtPmFjY2VwdF9mbGFncyA9IDA7CisgIHNvYXAtPmlwID0gMDsKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgc29hcC0+bGFiYnVmID0gTlVMTDsKKyAgc29hcC0+bGFibGVuID0gMDsKKyAgc29hcC0+bGFiaWR4ID0gMDsKKyNlbmRpZgorICBzb2FwLT5lbmNvZGluZ1N0eWxlID0gU09BUF9TVFJfRU9TOworI2lmbmRlZiBXSVRIX05PTkFNRVNQQUNFUworICBzb2FwLT5uYW1lc3BhY2VzID0gbmFtZXNwYWNlczsKKyNlbHNlCisgIHNvYXAtPm5hbWVzcGFjZXMgPSBOVUxMOworI2VuZGlmCisgIHNvYXAtPmxvY2FsX25hbWVzcGFjZXMgPSBOVUxMOworICBzb2FwLT5ubGlzdCA9IE5VTEw7CisgIHNvYXAtPmJsaXN0ID0gTlVMTDsKKyAgc29hcC0+Y2xpc3QgPSBOVUxMOworICBzb2FwLT5hbGlzdCA9IE5VTEw7CisgIHNvYXAtPmF0dHJpYnV0ZXMgPSBOVUxMOworICBzb2FwLT5oZWFkZXIgPSBOVUxMOworICBzb2FwLT5mYXVsdCA9IE5VTEw7CisgIHNvYXAtPm1hc3RlciA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIHNvYXAtPnNvY2tldCA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIHNvYXAtPm9zID0gTlVMTDsKKyAgc29hcC0+aXMgPSBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzb2FwLT5kb20gPSBOVUxMOworICBzb2FwLT5kaW1lLmxpc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5sYXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5saXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuYm91bmRhcnkgPSBOVUxMOworICBzb2FwLT5taW1lLnN0YXJ0ID0gTlVMTDsKKyAgc29hcC0+eGxpc3QgPSBOVUxMOworI2VuZGlmCisjaWZuZGVmIFVOREVSX0NFCisgIHNvYXAtPnJlY3ZmZCA9IDA7CisgIHNvYXAtPnNlbmRmZCA9IDE7CisjZWxzZQorICBzb2FwLT5yZWN2ZmQgPSBzdGRpbjsKKyAgc29hcC0+c2VuZGZkID0gc3Rkb3V0OworI2VuZGlmIAorICBzb2FwLT5ob3N0WzBdID0gJ1wwJzsKKyAgc29hcC0+cG9ydCA9IDA7CisgIHNvYXAtPmFjdGlvbiA9IE5VTEw7CisgIHNvYXAtPnByb3h5X2hvc3QgPSBOVUxMOworICBzb2FwLT5wcm94eV9wb3J0ID0gODA4MDsKKyAgc29hcC0+cHJveHlfdXNlcmlkID0gTlVMTDsKKyAgc29hcC0+cHJveHlfcGFzc3dkID0gTlVMTDsKKyAgc29hcC0+YXV0aHJlYWxtID0gTlVMTDsKKyAgc29hcC0+cHJvbG9nID0gTlVMTDsKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgaWYgKCFzc2xfaW5pdF9kb25lKQorICAgIHNvYXBfc3NsX2luaXQoKTsKKyAgc29hcC0+ZnNzbGF1dGggPSBzc2xfYXV0aF9pbml0OworICBzb2FwLT5mc3NsdmVyaWZ5ID0gc3NsX3ZlcmlmeV9jYWxsYmFjazsKKyAgc29hcC0+YmlvID0gTlVMTDsKKyAgc29hcC0+c3NsID0gTlVMTDsKKyAgc29hcC0+Y3R4ID0gTlVMTDsKKyAgc29hcC0+cmVxdWlyZV9zZXJ2ZXJfYXV0aCA9IDA7CisgIHNvYXAtPnJlcXVpcmVfY2xpZW50X2F1dGggPSAwOworICBzb2FwLT5yc2EgPSAwOworICBzb2FwLT5rZXlmaWxlID0gTlVMTDsKKyAgc29hcC0+cGFzc3dvcmQgPSBOVUxMOworICBzb2FwLT5kaGZpbGUgPSBOVUxMOworICBzb2FwLT5jYWZpbGUgPSBOVUxMOworICBzb2FwLT5jYXBhdGggPSBOVUxMOworICBzb2FwLT5jcmxmaWxlID0gTlVMTDsKKyAgc29hcC0+cmFuZGZpbGUgPSBOVUxMOworICBzb2FwLT5zZXNzaW9uID0gTlVMTDsKKyNlbmRpZgorI2lmZGVmIFdJVEhfWkxJQgorICBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX05PTkU7CisgIHNvYXAtPnpsaWJfaW4gPSBTT0FQX1pMSUJfTk9ORTsKKyAgc29hcC0+emxpYl9vdXQgPSBTT0FQX1pMSUJfTk9ORTsKKyAgc29hcC0+ZF9zdHJlYW0uemFsbG9jID0gTlVMTDsKKyAgc29hcC0+ZF9zdHJlYW0uemZyZWUgPSBOVUxMOworICBzb2FwLT5kX3N0cmVhbS5vcGFxdWUgPSBOVUxMOworICBzb2FwLT56X2xldmVsID0gNjsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgc29hcC0+YzE0bmluY2x1ZGUgPSBOVUxMOworICBzb2FwLT5jMTRuZXhjbHVkZSA9IE5VTEw7CisgIHNvYXAtPmNvb2tpZXMgPSBOVUxMOworICBzb2FwLT5jb29raWVfZG9tYWluID0gTlVMTDsKKyAgc29hcC0+Y29va2llX3BhdGggPSBOVUxMOworICBzb2FwLT5jb29raWVfbWF4ID0gMzI7CisjZW5kaWYKKyNpZmRlZiBTT0FQX0RFQlVHCisgIHNvYXBfaW5pdF9taHQoc29hcCk7CisgIHNvYXBfaW5pdF9sb2dzKHNvYXApOworICBzb2FwX3NldF9yZWN2X2xvZ2ZpbGUoc29hcCwgIlJFQ1YubG9nIik7CisgIHNvYXBfc2V0X3NlbnRfbG9nZmlsZShzb2FwLCAiU0VOVC5sb2ciKTsKKyAgc29hcF9zZXRfdGVzdF9sb2dmaWxlKHNvYXAsIE5VTEwpOworI2VuZGlmCisjaWZkZWYgV01XX1JQTV9JTworICBzb2FwLT5ycG1yZXFpZCA9IE5VTEw7CisjZW5kaWYKKyNpZmRlZiBQQUxNCisgIHBhbG1OZXRMaWJPcGVuKCk7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgIHNvYXBfaW5pdF9paHQoc29hcCk7CisgIHNvYXBfaW5pdF9waHQoc29hcCk7CisjZW5kaWYKKyAgc29hcF9iZWdpbihzb2FwKTsKKyNpZmRlZiBTT0FQX0RFQlVHCisgIHNvYXBfc2V0X3Rlc3RfbG9nZmlsZShzb2FwLCAiVEVTVC5sb2ciKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9pbml0MShzdHJ1Y3Qgc29hcCAqc29hcCwgc29hcF9tb2RlIG1vZGUpCit7IHNvYXBfaW5pdDIoc29hcCwgbW9kZSwgbW9kZSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2luaXQyKHN0cnVjdCBzb2FwICpzb2FwLCBzb2FwX21vZGUgaW1vZGUsIHNvYXBfbW9kZSBvbW9kZSkKK3sgc29hcF9pbml0KHNvYXApOworICBzb2FwX2ltb2RlKHNvYXAsIGltb2RlKTsKKyAgc29hcF9vbW9kZShzb2FwLCBvbW9kZSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2JlZ2luKHN0cnVjdCBzb2FwICpzb2FwKQoreyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluaXRpYWxpemluZ1xuIikpOworICBpZiAoIXNvYXAtPmtlZXBfYWxpdmUpCisgIHsgc29hcC0+YnVmbGVuID0gMDsKKyAgICBzb2FwLT5idWZpZHggPSAwOworICB9CisgIHNvYXAtPmtlZXBfYWxpdmUgPSAoKChzb2FwLT5pbW9kZSB8IHNvYXAtPm9tb2RlKSAmIFNPQVBfSU9fS0VFUEFMSVZFKSAhPSAwKTsKKyAgc29hcC0+bnVsbCA9IDA7CisgIHNvYXAtPnBvc2l0aW9uID0gMDsKKyAgc29hcC0+ZW5jb2RpbmcgPSAwOworICBzb2FwLT5tdXN0VW5kZXJzdGFuZCA9IDA7CisgIHNvYXAtPm1vZGUgPSAwOworICBzb2FwLT5ucyA9IDA7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0VORDsKKyAgc29hcC0+YWxsb2NlZCA9IDA7CisgIHNvYXAtPmNvdW50ID0gMDsKKyAgc29hcC0+bGVuZ3RoID0gMDsKKyAgc29hcC0+Y2RhdGEgPSAwOworICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIHNvYXAtPnBlZWtlZCA9IDA7CisgIHNvYXAtPmFoZWFkID0gMDsKKyAgc29hcC0+aWRudW0gPSAwOworICBzb2FwLT5sZXZlbCA9IDA7CisgIHNvYXAtPmVuZHBvaW50WzBdID0gJ1wwJzsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcC0+ZGltZS5jaHVua3NpemUgPSAwOworICBzb2FwLT5kaW1lLmJ1ZmxlbiA9IDA7CisjZW5kaWYKKyAgc29hcF9mcmVlKHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9lbmQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2NsaXN0ICpjcDsKKyAgaWYgKHNvYXBfY2hlY2tfc3RhdGUoc29hcCkpCisgICAgcmV0dXJuOworICBzb2FwX2ZyZWUoc29hcCk7CisgIHNvYXBfZGVhbGxvYyhzb2FwLCBOVUxMKTsKKyAgd2hpbGUgKHNvYXAtPmNsaXN0KQorICB7IGNwID0gc29hcC0+Y2xpc3QtPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPmNsaXN0KTsKKyAgICBzb2FwLT5jbGlzdCA9IGNwOworICB9CisgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworI2lmZGVmIFNPQVBfREVCVUcKKyAgc29hcF9jbG9zZV9sb2dmaWxlcyhzb2FwKTsKKyNlbmRpZgorI2lmZGVmIFBBTE0KKyAgcGFsbU5ldExpYkNsb3NlKCk7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZXRfbmFtZXNwYWNlcyhzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IE5hbWVzcGFjZSAqcCkKK3sgcmVnaXN0ZXIgc3RydWN0IE5hbWVzcGFjZSAqbnMgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnAsICpucSwgKm5yOworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgbGV2ZWwgPSBzb2FwLT5sZXZlbDsKKyAgc29hcC0+bmFtZXNwYWNlcyA9IHA7CisgIHNvYXAtPmxvY2FsX25hbWVzcGFjZXMgPSBOVUxMOworICBzb2FwX3NldF9sb2NhbF9uYW1lc3BhY2VzKHNvYXApOworICAvKiByZXZlcnNlIHRoZSBuYW1lc3BhY2UgbGlzdCAqLworICBucCA9IHNvYXAtPm5saXN0OworICBzb2FwLT5ubGlzdCA9IE5VTEw7CisgIGlmIChucCkKKyAgeyBucSA9IG5wLT5uZXh0OworICAgIG5wLT5uZXh0ID0gTlVMTDsKKyAgICB3aGlsZSAobnEpCisgICAgeyBuciA9IG5xLT5uZXh0OworICAgICAgbnEtPm5leHQgPSBucDsKKyAgICAgIG5wID0gbnE7CisgICAgICBucSA9IG5yOworICAgIH0KKyAgfQorICAvKiB0aGVuIHB1c2ggb24gbmV3IHN0YWNrICovCisgIHdoaWxlIChucCkKKyAgeyByZWdpc3RlciBjb25zdCBjaGFyICpzOworICAgIHNvYXAtPmxldmVsID0gbnAtPmxldmVsOyAvKiBwcmVzZXJ2ZSBlbGVtZW50IG5lc3RpbmcgbGV2ZWwgKi8KKyAgICBzID0gbnAtPm5zOworICAgIGlmICghcyAmJiBucC0+aW5kZXggPj0gMCAmJiBucykKKyAgICB7IHMgPSBuc1tucC0+aW5kZXhdLm91dDsKKyAgICAgIGlmICghcykKKyAgICAgICAgcyA9IG5zW25wLT5pbmRleF0ubnM7CisgICAgfQorICAgIGlmIChzICYmIHNvYXBfcHVzaF9uYW1lc3BhY2Uoc29hcCwgbnAtPmlkLCBzKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBucSA9IG5wOworICAgIG5wID0gbnAtPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIG5xKTsKKyAgfQorICBpZiAobnMpCisgIHsgcmVnaXN0ZXIgaW50IGk7CisgICAgZm9yIChpID0gMDsgbnNbaV0uaWQ7IGkrKykKKyAgICB7IGlmIChuc1tpXS5vdXQpCisgICAgICB7IFNPQVBfRlJFRShzb2FwLCBuc1tpXS5vdXQpOworICAgICAgICBuc1tpXS5vdXQgPSBOVUxMOworICAgICAgfQorICAgIH0KKyAgICBTT0FQX0ZSRUUoc29hcCwgbnMpOworICB9CisgIHNvYXAtPmxldmVsID0gbGV2ZWw7IC8qIHJlc3RvcmUgbGV2ZWwgKi8KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9sb2NhbF9uYW1lc3BhY2VzKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcC0+bmFtZXNwYWNlcyAmJiAhc29hcC0+bG9jYWxfbmFtZXNwYWNlcykKKyAgeyByZWdpc3RlciBjb25zdCBzdHJ1Y3QgTmFtZXNwYWNlICpuczE7CisgICAgcmVnaXN0ZXIgc3RydWN0IE5hbWVzcGFjZSAqbnMyOworICAgIHJlZ2lzdGVyIHNpemVfdCBuID0gMTsKKyAgICBmb3IgKG5zMSA9IHNvYXAtPm5hbWVzcGFjZXM7IG5zMS0+aWQ7IG5zMSsrKQorICAgICAgbisrOworICAgIG4gKj0gc2l6ZW9mKHN0cnVjdCBOYW1lc3BhY2UpOworICAgIG5zMiA9IChzdHJ1Y3QgTmFtZXNwYWNlKilTT0FQX01BTExPQyhzb2FwLCBuKTsKKyAgICBpZiAobnMyKQorICAgIHsgbWVtY3B5KG5zMiwgc29hcC0+bmFtZXNwYWNlcywgbik7CisgICAgICBpZiAobnMyWzBdLm5zKQorICAgICAgeyBpZiAoIXN0cmNtcChuczJbMF0ubnMsIHNvYXBfZW52MSkpCisgICAgICAgICAgc29hcC0+dmVyc2lvbiA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzb2FwLT52ZXJzaW9uID0gMjsKKyAgICAgIH0KKyAgICAgIHNvYXAtPmxvY2FsX25hbWVzcGFjZXMgPSBuczI7CisgICAgfQorICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY29uc3QgY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3N0cnNlYXJjaChjb25zdCBjaGFyICpiaWcsIGNvbnN0IGNoYXIgKmxpdHRsZSkKK3sgc2l6ZV90IG4gPSBzdHJsZW4obGl0dGxlKTsKKyAgY29uc3QgY2hhciAqcyA9IGJpZzsKKyAgd2hpbGUgKHMpIAorICB7IGlmICghc3RybmNtcChzLCBsaXR0bGUsIG4pICYmIChzW25dID09ICdcMCcgfHwgc1tuXSA9PSAnICcpKQorICAgICAgcmV0dXJuIHM7CisgICAgcyA9IHN0cmNocihzLCAnICcpOworICAgIGlmIChzKQorICAgICAgcysrOworICB9CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgc3RydWN0IHNvYXBfbmxpc3QgKgorc29hcF9sb29rdXBfbnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc2l6ZV90IG4pCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucDsKKyAgZm9yIChucCA9IHNvYXAtPm5saXN0OyBucDsgbnAgPSBucC0+bmV4dCkKKyAgeyBpZiAoIXN0cm5jbXAobnAtPmlkLCB0YWcsIG4pICYmICFucC0+aWRbbl0pCisgICAgICByZXR1cm4gbnA7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgc3RydWN0IHNvYXBfbmxpc3QgKgorc29hcF9wdXNoX25zKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqbnMsIHNob3J0IHV0aWxpemVkKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnA7CisgIHNpemVfdCBuLCBrOworICBpZiAoc29hcF9zdHJzZWFyY2goc29hcC0+YzE0bmV4Y2x1ZGUsIGlkKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQdXNoIG5hbWVzcGFjZSBiaW5kaW5nIChsZXZlbD0ldSkgJyVzJyAnJXMnXG4iLCBzb2FwLT5sZXZlbCwgaWQsIG5zP25zOiIiKSk7CisgIGlmICghdXRpbGl6ZWQpCisgIHsgZm9yIChucCA9IHNvYXAtPm5saXN0OyBucDsgbnAgPSBucC0+bmV4dCkKKyAgICB7IGlmICghc3RyY21wKG5wLT5pZCwgaWQpICYmICghbnAtPm5zIHx8ICFzdHJjbXAobnAtPm5zLCBucykpKQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKG5wKQorICAgIHsgaWYgKG5wLT5pbmRleCA9PSAxKQorICAgICAgICB1dGlsaXplZCA9IG5wLT5pbmRleDsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9CisgIG4gPSBzdHJsZW4oaWQpOworICBpZiAobnMpCisgICAgayA9IHN0cmxlbihucyk7CisgIGVsc2UKKyAgICBrID0gMDsKKyAgbnAgPSAoc3RydWN0IHNvYXBfbmxpc3QqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9ubGlzdCkgKyBuICsgayArIDEpOworICBpZiAoIW5wKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgbnAtPm5leHQgPSBzb2FwLT5ubGlzdDsKKyAgc29hcC0+bmxpc3QgPSBucDsKKyAgc3RyY3B5KG5wLT5pZCwgaWQpOworICBpZiAobnMpCisgIHsgbnAtPm5zID0gbnAtPmlkICsgbiArIDE7CisgICAgc3RyY3B5KG5wLT5ucywgbnMpOworICB9CisgIGVsc2UKKyAgICBucC0+bnMgPSBOVUxMOworICBucC0+bGV2ZWwgPSBzb2FwLT5sZXZlbDsKKyAgbnAtPmluZGV4ID0gdXRpbGl6ZWQ7CisgIHJldHVybiBucDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyB2b2lkCitzb2FwX3V0aWxpemVfbnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc2l6ZV90IG4pCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucCA9IHNvYXBfbG9va3VwX25zKHNvYXAsIHRhZywgbik7CisgIGlmIChucCkKKyAgeyBpZiAobnAtPmluZGV4ID09IDApCisgICAgICBzb2FwX3B1c2hfbnMoc29hcCwgbnAtPmlkLCBucC0+bnMsIDEpOworICB9CisgIGVsc2UKKyAgeyBzdHJuY3B5KHNvYXAtPnRtcGJ1ZiwgdGFnLCBuKTsKKyAgICBzb2FwLT50bXBidWZbbl0gPSAnXDAnOworICAgIHNvYXBfcHVzaF9ucyhzb2FwLCBzb2FwLT50bXBidWYsIE5VTEwsIDEpOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgdm9pZAorc29hcF9wb3BfbnMoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXBfcG9wX25hbWVzcGFjZShzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgY2hhciAqdHlwZSkKK3sgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbGVtZW50IGJlZ2luIHRhZz0nJXMnIGlkPSclZCcgdHlwZT0nJXMnXG4iLCB0YWcsIGlkLCB0eXBlP3R5cGU6IiIpKTsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqZWx0ID0gKHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50Kilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQpKTsKKyAgICBpZiAoIWVsdCkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIGVsdC0+c29hcCA9IHNvYXA7CisgICAgZWx0LT5uZXh0ID0gTlVMTDsKKyAgICBlbHQtPnBybnQgPSBzb2FwLT5kb207CisgICAgZWx0LT5uYW1lID0gc29hcF9zdHJkdXAoc29hcCwgdGFnKTsKKyAgICBlbHQtPmVsdHMgPSBOVUxMOworICAgIGVsdC0+YXR0cyA9IE5VTEw7CisgICAgZWx0LT5uc3RyID0gTlVMTDsKKyAgICBlbHQtPmRhdGEgPSBOVUxMOworICAgIGVsdC0+d2lkZSA9IE5VTEw7CisgICAgZWx0LT5ub2RlID0gTlVMTDsKKyAgICBlbHQtPnR5cGUgPSAwOworICAgIGVsdC0+aGVhZCA9IE5VTEw7CisgICAgZWx0LT50YWlsID0gTlVMTDsKKyAgICBpZiAoc29hcC0+ZG9tKQorICAgIHsgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKnAgPSBzb2FwLT5kb20tPmVsdHM7CisgICAgICBpZiAocCkKKyAgICAgIHsgd2hpbGUgKHAtPm5leHQpCisgICAgICAgICAgcCA9IHAtPm5leHQ7CisgICAgICAgIHAtPm5leHQgPSBlbHQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHNvYXAtPmRvbS0+ZWx0cyA9IGVsdDsKKyAgICB9CisgICAgc29hcC0+ZG9tID0gZWx0OworICB9CisgIGVsc2UKKyAgeworI2VuZGlmCisgICAgc29hcC0+bGV2ZWwrKzsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKCFzb2FwLT5ucykKKyAgICB7IGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgICAgICAgJiYgc29hcF9zZW5kKHNvYXAsIHNvYXAtPnByb2xvZyA/IHNvYXAtPnByb2xvZyA6ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiIpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIGVsc2UgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9JTkRFTlQpCisgICAgeyBpZiAoc29hcC0+bnMgPT0gMSAmJiBzb2FwX3NlbmRfcmF3KHNvYXAsIHNvYXBfaW5kZW50LCBzb2FwLT5sZXZlbCA8IHNpemVvZihzb2FwX2luZGVudCkgPyBzb2FwLT5sZXZlbCA6IHNpemVvZihzb2FwX2luZGVudCkgLSAxKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgc29hcC0+Ym9keSA9IDE7CisgICAgfQorI2VuZGlmCisgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgIjwiLCAxKQorICAgICB8fCBzb2FwX3NlbmQoc29hcCwgdGFnKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZmRlZiBXSVRIX0RPTQorICB9CisjZW5kaWYKKyAgaWYgKCFzb2FwLT5ucykKKyAgeyBzdHJ1Y3QgTmFtZXNwYWNlICpuczsKKyAgICBmb3IgKG5zID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlczsgbnMgJiYgbnMtPmlkOyBucysrKQorICAgIHsgaWYgKCpucy0+aWQgJiYgKG5zLT5vdXQgfHwgbnMtPm5zKSkKKyAgICAgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJ4bWxuczolcyIsIG5zLT5pZCk7CisgICAgICAgIGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCBzb2FwLT50bXBidWYsIG5zLT5vdXQgPyBucy0+b3V0IDogbnMtPm5zKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB9CisgICAgfSAgIAorICB9CisgIHNvYXAtPm5zID0gMTsgLyogc3RhcnQgd2l0aCAwIG9yIDIsIGJ1dCBzaG91bGQgYmUgb25lIHRvIGNvbnRpbnVlICovCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgeyBjb25zdCBjaGFyICpzID0gc3RyY2hyKHRhZywgJzonKTsKKyAgICBpZiAocykKKyAgICAgIHNvYXBfdXRpbGl6ZV9ucyhzb2FwLCB0YWcsIHMgLSB0YWcpOworICB9CisjZW5kaWYKKyAgaWYgKGlkID4gMCkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIl8lZCIsIGlkKTsKKyAgICBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgImlkIiwgc29hcC0+dG1wYnVmKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAodHlwZSAmJiAqdHlwZSkKKyAgeyBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgInhzaTp0eXBlIiwgdHlwZSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICAgIHsgY29uc3QgY2hhciAqcyA9IHN0cmNocih0eXBlLCAnOicpOworICAgICAgaWYgKHMpCisgICAgICAgIHNvYXBfdXRpbGl6ZV9ucyhzb2FwLCB0eXBlLCBzIC0gdHlwZSk7CisgICAgfQorI2VuZGlmCisgIH0KKyAgaWYgKHNvYXAtPm51bGwgJiYgc29hcC0+cG9zaXRpb24gPiAwKQorICB7IGludCBpOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiWyVkIiwgc29hcC0+cG9zaXRpb25zWzBdKTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgc29hcC0+cG9zaXRpb247IGkrKykKKyAgICAgIHNwcmludGYoc29hcC0+dG1wYnVmICsgc3RybGVuKHNvYXAtPnRtcGJ1ZiksICIsJWQiLCBzb2FwLT5wb3NpdGlvbnNbaV0pOworICAgIHN0cmNhdChzb2FwLT50bXBidWYsICJdIik7CisgICAgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJTT0FQLUVOQzpwb3NpdGlvbiIsIHNvYXAtPnRtcGJ1ZikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHNvYXAtPm11c3RVbmRlcnN0YW5kKQorICB7IGlmIChzb2FwLT5hY3RvciAmJiAqc29hcC0+YWN0b3IpCisgICAgeyBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgc29hcC0+dmVyc2lvbiA9PSAyID8gIlNPQVAtRU5WOnJvbGUiIDogIlNPQVAtRU5WOmFjdG9yIiwgc29hcC0+YWN0b3IpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAiU09BUC1FTlY6bXVzdFVuZGVyc3RhbmQiLCBzb2FwLT52ZXJzaW9uID09IDIgPyAidHJ1ZSIgOiAiMSIpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIHNvYXAtPm11c3RVbmRlcnN0YW5kID0gMDsKKyAgfQorICBpZiAoc29hcC0+ZW5jb2RpbmcpCisgIHsgaWYgKHNvYXAtPmVuY29kaW5nU3R5bGUgJiYgc29hcC0+bG9jYWxfbmFtZXNwYWNlcykKKyAgICB7IGlmICghKnNvYXAtPmVuY29kaW5nU3R5bGUpCisgICAgICB7IGlmIChzb2FwLT5sb2NhbF9uYW1lc3BhY2VzWzFdLm91dCkKKyAgICAgICAgICBzb2FwLT5lbmNvZGluZ1N0eWxlID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlc1sxXS5vdXQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzb2FwLT5lbmNvZGluZ1N0eWxlID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlc1sxXS5uczsKKyAgICAgIH0KKyAgICAgIGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAiU09BUC1FTlY6ZW5jb2RpbmdTdHlsZSIsIHNvYXAtPmVuY29kaW5nU3R5bGUpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIHNvYXAtPmVuY29kaW5nID0gMDsKKyAgfQorICBzb2FwLT5udWxsID0gMDsKKyAgc29hcC0+cG9zaXRpb24gPSAwOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X2JlZ2luX291dChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnR5cGUpCit7IGlmICgqdGFnID09ICctJykKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgaWYgKHNvYXBfZWxlbWVudChzb2FwLCB0YWcsIGlkLCB0eXBlKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzb2FwLCBOVUxMKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKKyNpZm5kZWYgSEFWRV9TVFJSQ0hSCitTT0FQX0ZNQUMxCitjaGFyKgorU09BUF9GTUFDMgorc29hcF9zdHJyY2hyKGNvbnN0IGNoYXIgKnMsIGludCB0KQoreyByZWdpc3RlciBjaGFyICpyID0gTlVMTDsKKyAgd2hpbGUgKCpzKQorICAgIGlmICgqcysrID09IHQpCisgICAgICByID0gKGNoYXIqKXMgLSAxOworICByZXR1cm4gcjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorI2lmbmRlZiBIQVZFX1NUUlRPTAorU09BUF9GTUFDMQorbG9uZworU09BUF9GTUFDMgorc29hcF9zdHJ0b2woY29uc3QgY2hhciAqcywgY2hhciAqKnQsIGludCBiKQoreyByZWdpc3RlciBsb25nIG4gPSAwOworICByZWdpc3RlciBpbnQgYzsKKyAgd2hpbGUgKCpzID4gMCAmJiAqcyA8PSAzMikKKyAgICBzKys7CisgIGlmIChiID09IDEwKQorICB7IHNob3J0IG5lZyA9IDA7CisgICAgaWYgKCpzID09ICctJykKKyAgICB7IHMrKzsKKyAgICAgIG5lZyA9IDE7CisgICAgfQorICAgIGVsc2UgaWYgKCpzID09ICcrJykKKyAgICAgIHMrKzsKKyAgICB3aGlsZSAoKGMgPSAqcykgJiYgYyA+PSAnMCcgJiYgYyA8PSAnOScpCisgICAgeyBpZiAobiA+PSAyMTQ3NDgzNjQgJiYgKG4gPiAyMTQ3NDgzNjQgfHwgYyA+PSAnOCcpKQorICAgICAgICBicmVhazsKKyAgICAgIG4gKj0gMTA7CisgICAgICBuICs9IGMgLSAnMCc7CisgICAgICBzKys7CisgICAgfQorICAgIGlmIChuZWcpCisgICAgICBuID0gLW47CisgIH0KKyAgZWxzZSAvKiBiID09IDE2IGFuZCB2YWx1ZSBpcyBhbHdheXMgcG9zaXRpdmUgKi8KKyAgeyB3aGlsZSAoKGMgPSAqcykpCisgICAgeyBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCisgICAgICAgIGMgLT0gJzAnOworICAgICAgZWxzZSBpZiAoYyA+PSAnQScgJiYgYyA8PSAnRicpCisgICAgICAgIGMgLT0gJ0EnIC0gMTA7CisgICAgICBlbHNlIGlmIChjID49ICdhJyAmJiBjIDw9ICdmJykKKyAgICAgICAgYyAtPSAnYScgLSAxMDsKKyAgICAgIGlmIChuID4gMHgwN0ZGRkZGRikKKyAgICAgICAgYnJlYWs7CisgICAgICBuIDw8PSA0OworICAgICAgbiArPSBjOworICAgICAgcysrOworICAgIH0KKyAgfQorICBpZiAodCkKKyAgICAqdCA9IChjaGFyKilzOworICByZXR1cm4gbjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorI2lmbmRlZiBIQVZFX1NUUlRPVUwKK1NPQVBfRk1BQzEKK3Vuc2lnbmVkIGxvbmcKK1NPQVBfRk1BQzIKK3NvYXBfc3RydG91bChjb25zdCBjaGFyICpzLCBjaGFyICoqdCwgaW50IGIpCit7IHVuc2lnbmVkIGxvbmcgbiA9IDA7CisgIHJlZ2lzdGVyIGludCBjOworICB3aGlsZSAoKnMgPiAwICYmICpzIDw9IDMyKQorICAgIHMrKzsKKyAgaWYgKGIgPT0gMTApCisgIHsgaWYgKCpzID09ICcrJykKKyAgICAgIHMrKzsKKyAgICB3aGlsZSAoKGMgPSAqcykgJiYgYyA+PSAnMCcgJiYgYyA8PSAnOScpCisgICAgeyBpZiAobiA+PSA0Mjk0OTY3MjkgJiYgKG4gPiA0Mjk0OTY3MjkgfHwgYyA+PSAnNicpKQorICAgICAgICBicmVhazsKKyAgICAgIG4gKj0gMTA7CisgICAgICBuICs9IGMgLSAnMCc7CisgICAgICBzKys7CisgICAgfQorICB9CisgIGVsc2UgLyogYiA9PSAxNiAqLworICB7IHdoaWxlICgoYyA9ICpzKSkKKyAgICB7IGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKKyAgICAgICAgYyAtPSAnMCc7CisgICAgICBlbHNlIGlmIChjID49ICdBJyAmJiBjIDw9ICdGJykKKyAgICAgICAgYyAtPSAnQScgLSAxMDsKKyAgICAgIGVsc2UgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQorICAgICAgICBjIC09ICdhJyAtIDEwOworICAgICAgaWYgKG4gPiAweDBGRkZGRkZGKQorICAgICAgICBicmVhazsKKyAgICAgIG4gPDw9IDQ7CisgICAgICBuICs9IGM7CisgICAgICBzKys7CisgICAgfQorICB9CisgIGlmICh0KQorICAgICp0ID0gKGNoYXIqKXM7CisgIHJldHVybiBuOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYXJyYXlfYmVnaW5fb3V0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqb2Zmc2V0KQoreyBpZiAoc29hcF9lbGVtZW50KHNvYXAsIHRhZywgaWQsICJTT0FQLUVOQzpBcnJheSIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgeyBjb25zdCBjaGFyICpzOworICAgIHMgPSBzb2FwX3N0cnJjaHIodHlwZSwgJ1snKTsKKyAgICBpZiAoKHNpemVfdCkocyAtIHR5cGUpIDwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZikpCisgICAgeyBzdHJuY3B5KHNvYXAtPnRtcGJ1ZiwgdHlwZSwgcyAtIHR5cGUpOworICAgICAgc29hcC0+dG1wYnVmW3MgLSB0eXBlXSA9ICdcMCc7CisgICAgICBpZiAodHlwZSAmJiAqdHlwZSAmJiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgIlNPQVAtRU5DOml0ZW1UeXBlIiwgc29hcC0+dG1wYnVmKSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIGlmIChzICYmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAiU09BUC1FTkM6YXJyYXlTaXplIiwgcyArIDEpKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgfQorICBlbHNlCisgIHsgaWYgKG9mZnNldCAmJiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgIlNPQVAtRU5DOm9mZnNldCIsIG9mZnNldCkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmICh0eXBlICYmICp0eXBlICYmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAiU09BUC1FTkM6YXJyYXlUeXBlIiwgdHlwZSkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAodHlwZSAmJiAqdHlwZSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkpCisgIHsgY29uc3QgY2hhciAqcyA9IHN0cmNocih0eXBlLCAnOicpOworICAgIGlmIChzKQorICAgICAgc29hcF91dGlsaXplX25zKHNvYXAsIHR5cGUsIHMgLSB0eXBlKTsKKyAgfQorI2VuZGlmCisgIHJldHVybiBzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzb2FwLCBOVUxMKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X3N0YXJ0X2VuZF9vdXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZykKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfYXR0cmlidXRlICp0cDsKKyNpZmRlZiBXSVRIX0RPTQorICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICoqYXR0OworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBhdHQgPSAmc29hcC0+ZG9tLT5hdHRzOworICAgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgICB7IGlmICh0cC0+dmlzaWJsZSkKKyAgICAgIHsgKmF0dCA9IChzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSkpOworCWlmICghKmF0dCkKKwkgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworCSgqYXR0KS0+bmV4dCA9IE5VTEw7CisgICAgICAgICgqYXR0KS0+bnN0ciA9IE5VTEw7CisgICAgICAgICgqYXR0KS0+bmFtZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHRwLT5uYW1lKTsKKyAgICAgICAgKCphdHQpLT5kYXRhID0gc29hcF9zdHJkdXAoc29hcCwgdHAtPnZhbHVlKTsKKyAgICAgICAgKCphdHQpLT53aWRlID0gTlVMTDsKKyAgICAgICAgKCphdHQpLT5zb2FwID0gc29hcDsKKyAgICAgICAgdHAtPnZpc2libGUgPSAwOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgeyBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnA7CisgICAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICAgIHsgaWYgKHRwLT52aXNpYmxlICYmIHRwLT5uYW1lKQorICAgICAgeyBjb25zdCBjaGFyICpzID0gc3RyY2hyKHRwLT5uYW1lLCAnOicpOworICAgICAgICBpZiAocykKKyAgICAgICAgICBzb2FwX3V0aWxpemVfbnMoc29hcCwgdHAtPm5hbWUsIHMgLSB0cC0+bmFtZSk7CisgICAgICB9CisgICAgfQorICAgIGZvciAobnAgPSBzb2FwLT5ubGlzdDsgbnA7IG5wID0gbnAtPm5leHQpCisgICAgeyBpZiAobnAtPmluZGV4ID09IDEgJiYgbnAtPm5zKQorICAgICAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgInhtbG5zOiVzIiwgbnAtPmlkKTsKKyAgICAgICAgc29hcF9zZXRfYXR0cihzb2FwLCBzb2FwLT50bXBidWYsIG5wLT5ucyk7CisgICAgICAgIG5wLT5pbmRleCA9IDI7CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYKKyAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICB7IGlmICh0cC0+dmlzaWJsZSkKKyAgICB7IGlmIChzb2FwX3NlbmQoc29hcCwgIiAiKSB8fCBzb2FwX3NlbmQoc29hcCwgdHAtPm5hbWUpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBpZiAodHAtPnZpc2libGUgPT0gMiAmJiB0cC0+dmFsdWUpCisgICAgICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsICI9XCIiLCAyKQorCSB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgdHAtPnZhbHVlLCAxKQorCSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICJcIiIsIDEpKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHRwLT52aXNpYmxlID0gMDsKKyAgICB9CisgIH0KKyAgaWYgKHRhZykKKyAgeyAKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAiPiIsIDEpCisgICAgICAgfHwgc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICBzb2FwLT5sZXZlbC0tOwkvKiBkZWNyZW1lbnQgbGV2ZWwganVzdCBiZWZvcmUgLz4gKi8KKyAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAiLz4iLCAyKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCAiPiIsIDEpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfZW5kX291dChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnKQoreyBpZiAoKnRhZyA9PSAnLScpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRWxlbWVudCBlbmRpbmcgdGFnPSclcydcbiIsIHRhZykpOworI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IGlmIChzb2FwLT5kb20tPnBybnQpCisgICAgICBzb2FwLT5kb20gPSBzb2FwLT5kb20tPnBybnQ7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgICAgc29hcF9wb3BfbnMoc29hcCk7CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfSU5ERU5UKQorICB7IGlmICghc29hcC0+Ym9keSkKKyAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHNvYXBfaW5kZW50LCBzb2FwLT5sZXZlbCA8IHNpemVvZihzb2FwX2luZGVudCkgPyBzb2FwLT5sZXZlbCA6IHNpemVvZihzb2FwX2luZGVudCkgLSAxKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBzb2FwLT5ib2R5ID0gMDsKKyAgfQorI2VuZGlmCisgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsICI8LyIsIDIpCisgICB8fCBzb2FwX3NlbmQoc29hcCwgdGFnKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHNvYXAtPmxldmVsLS07CS8qIGRlY3JlbWVudCBsZXZlbCBqdXN0IGJlZm9yZSA+ICovCisgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsICI+IiwgMSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9yZWYoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBpbnQgaHJlZikKK3sgcmVnaXN0ZXIgaW50IG4gPSAwOworICBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICAgIG4gPSAxOworICBzcHJpbnRmKHNvYXAtPmhyZWYsICIjXyVkIiwgaHJlZik7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfaHJlZihzb2FwLCB0YWcsIGlkLCAiaHJlZiIgKyBuLCBzb2FwLT5ocmVmICsgbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9ocmVmKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgY2hhciAqcmVmLCBjb25zdCBjaGFyICp2YWwpCit7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRWxlbWVudCAnJXMnIHJlZmVyZW5jZSAlcz0nJXMnXG4iLCB0YWcsIHJlZiwgdmFsKSk7CisgIGlmIChzb2FwX2VsZW1lbnQoc29hcCwgdGFnLCBpZCwgTlVMTCkKKyAgIHx8IHNvYXBfYXR0cmlidXRlKHNvYXAsIHJlZiwgdmFsKQorICAgfHwgc29hcF9lbGVtZW50X3N0YXJ0X2VuZF9vdXQoc29hcCwgdGFnKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfbnVsbChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnR5cGUpCit7IHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqdHA7CisgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgICBpZiAodHAtPnZpc2libGUpCisgICAgICBicmVhazsKKyAgaWYgKHRwIHx8IChzb2FwLT52ZXJzaW9uID09IDIgJiYgc29hcC0+cG9zaXRpb24gPiAwKSB8fCBpZCA+IDAgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9OSUwpKQorICB7IGlmIChzb2FwX2VsZW1lbnQoc29hcCwgdGFnLCBpZCwgdHlwZSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHNvYXAtPnBhcnQgIT0gU09BUF9JTl9IRUFERVIgJiYgc29hcC0+ZW5jb2RpbmdTdHlsZSkKKyAgICAgIGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAieHNpOm5pbCIsICJ0cnVlIikpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICByZXR1cm4gc29hcF9lbGVtZW50X3N0YXJ0X2VuZF9vdXQoc29hcCwgdGFnKTsKKyAgfQorICBzb2FwLT5udWxsID0gMTsKKyAgc29hcC0+cG9zaXRpb24gPSAwOworICBzb2FwLT5tdXN0VW5kZXJzdGFuZCA9IDA7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfaWQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KSAKK3sgaWYgKCFwIHx8IChhICYmICFhLT5fX3B0cikpCisgIHsgc29hcF9lbGVtZW50X251bGwoc29hcCwgdGFnLCBpZCwgdHlwZSk7CisgICAgcmV0dXJuIC0xOworICB9CisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1RSRUUpCisgICAgcmV0dXJuIDA7CisgIGlmIChpZCA8IDApCisgIHsgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICAgIGlmIChhKQorICAgICAgaWQgPSBzb2FwX2FycmF5X3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIGEsIG4sIHQsICZwcCk7CisgICAgZWxzZQorICAgICAgaWQgPSBzb2FwX3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIHQsICZwcCk7CisgICAgaWYgKGlkKQorICAgIHsgaWYgKHNvYXBfaXNfZW1iZWRkZWQoc29hcCwgcHApKQorICAgICAgeyBzb2FwX2VsZW1lbnRfcmVmKHNvYXAsIHRhZywgMCwgaWQpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBpZiAoc29hcF9pc19zaW5nbGUoc29hcCwgcHApKQorICAgICAgICByZXR1cm4gMDsKKyAgICAgIHNvYXBfc2V0X2VtYmVkZGVkKHNvYXAsIHBwKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGlkOworI2Vsc2UKKyAgcmV0dXJuIDA7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X3Jlc3VsdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnKQoreyBpZiAoc29hcC0+dmVyc2lvbiA9PSAyICYmIHNvYXAtPmVuY29kaW5nU3R5bGUpCisgICAgaWYgKHNvYXBfZWxlbWVudChzb2FwLCAiU09BUC1SUEM6cmVzdWx0IiwgMCwgTlVMTCkKKyAgICAgfHwgc29hcF9hdHRyaWJ1dGUoc29hcCwgInhtbG5zOlNPQVAtUlBDIiwgc29hcF9ycGMpCisgICAgIHx8IHNvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHNvYXAsIE5VTEwpCisgICAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCB0YWcsIDApCisgICAgIHx8IHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsICJTT0FQLVJQQzpyZXN1bHQiKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYXR0cmlidXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sgCisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAqYSA9IChzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSkpOworICAgIGEtPm5leHQgPSBzb2FwLT5kb20tPmF0dHM7CisgICAgYS0+bnN0ciA9IE5VTEw7CisgICAgYS0+bmFtZSA9IHNvYXBfc3RyZHVwKHNvYXAsIG5hbWUpOworICAgIGEtPmRhdGEgPSBzb2FwX3N0cmR1cChzb2FwLCB2YWx1ZSk7CisgICAgYS0+d2lkZSA9IE5VTEw7CisgICAgYS0+c29hcCA9IHNvYXA7CisgICAgc29hcC0+ZG9tLT5hdHRzID0gYTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgeyAvKiBUT0RPOiBjb25zaWRlciB1c2luZyB0aGlzIGNvZGUgdG8gaGFuZGxlIGRlZmF1bHQgbmFtZXNwYWNlCisgICAgaWYgKCFzdHJuY21wKG5hbWUsICJ4bWxucyIsIDUpICYmIChuYW1lWzVdID09ICc6JyB8fCBuYW1lWzVdID09ICdcMCcpKQorICAgIHsgaWYgKG5hbWVbNV0gPT0gJzonKQorICAgICAgICBzb2FwX3B1c2hfbnMoc29hcCwgbmFtZSArIDYsIHZhbHVlLCAwKTsKKyAgICAgIGVsc2UKKyAgICAgICAgc29hcF9wdXNoX25zKHNvYXAsICIiLCB2YWx1ZSwgMCk7CisgICAgfQorICAgICovCisgICAgaWYgKCFzdHJuY21wKG5hbWUsICJ4bWxuczoiLCA2KSkKKyAgICAgIHNvYXBfcHVzaF9ucyhzb2FwLCBuYW1lICsgNiwgdmFsdWUsIDApOworICAgIGVsc2UgaWYgKHNvYXBfc2V0X2F0dHIoc29hcCwgbmFtZSwgdmFsdWUpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGVsc2UKKyNlbmRpZgorICB7IGlmIChzb2FwX3NlbmQoc29hcCwgIiAiKSB8fCBzb2FwX3NlbmQoc29hcCwgbmFtZSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHZhbHVlKQorICAgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgIj1cIiIsIDIpCisgICAgICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHZhbHVlLCAxKQorICAgICAgIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIlwiIiwgMSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X2JlZ2luX2luKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBuaWxsYWJsZSkKK3sgaWYgKCFzb2FwX3BlZWtfZWxlbWVudChzb2FwKSkKKyAgeyBpZiAoc29hcC0+b3RoZXIpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1RBR19NSVNNQVRDSDsKKyAgICBpZiAodGFnICYmICp0YWcgPT0gJy0nKQorICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgaWYgKCEoc29hcC0+ZXJyb3IgPSBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50YWcsIHRhZykpKQorICAgIHsgc29hcC0+cGVla2VkID0gMDsKKyAgICAgIGlmIChzb2FwLT5ib2R5KQorICAgICAgICBzb2FwLT5sZXZlbCsrOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJCZWdpbiBlbGVtZW50IGZvdW5kIChsZXZlbD0ldSkgJyVzJz0nJXMnXG4iLCBzb2FwLT5sZXZlbCwgc29hcC0+dGFnLCB0YWc/dGFnOiIiICkpOworICAgICAgaWYgKCFuaWxsYWJsZSAmJiBzb2FwLT5udWxsICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9OVUxMOworICAgIH0KKyAgfQorICBlbHNlIGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRyAmJiB0YWcgJiYgKnRhZyA9PSAnLScpCisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9lbmRfaW4oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZykgIAoreyByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIHJlZ2lzdGVyIGNoYXIgKnM7CisgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnQ7CisgIHJlZ2lzdGVyIGludCBuID0gMDsKKyAgaWYgKHRhZyAmJiAqdGFnID09ICctJykKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgc29hcC0+bGV2ZWwtLTsKKyAgc29hcF9wb3BfbmFtZXNwYWNlKHNvYXApOworI2lmZGVmIFdJVEhfRE9NCisgIC8qIHRoaXMgd2hpdGVzcGFjZSBvciBtaXhlZCBjb250ZW50IGlzIG5vdCBpbnNpZ25pZmljYW50IGZvciBET00gKi8KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgaWYgKCFzb2FwLT5wZWVrZWQgJiYgIXNvYXBfc3RyaW5nX2luKHNvYXAsIDMsIC0xLCAtMSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHNvYXAtPmRvbS0+cHJudCkKKyAgICAgIHNvYXAtPmRvbSA9IHNvYXAtPmRvbS0+cHJudDsKKyAgfQorI2VuZGlmCisgIGlmIChzb2FwLT5wZWVrZWQpCisgIHsgaWYgKHNvYXAtPmVycm9yID09IFNPQVBfTk9fVEFHKQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICAgIGlmICgqc29hcC0+dGFnKQorICAgICAgbisrOworICAgIHNvYXAtPnBlZWtlZCA9IDA7CisgIH0KKyAgZG8KKyAgeyB3aGlsZSAoKChjID0gc29hcF9nZXQoc29hcCkpICE9IFNPQVBfVFQpKQorICAgIHsgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgICAgaWYgKGMgPT0gU09BUF9MVCkKKyAgICAgICAgbisrOworICAgICAgZWxzZSBpZiAoYyA9PSAnLycpCisgICAgICB7IGMgPSBzb2FwX2dldChzb2FwKTsKKyAgICAgICAgaWYgKGMgPT0gU09BUF9HVCkKKwkgIG4tLTsKKyAgICAgICAgZWxzZQorCSAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgIH0KKyAgICB9CisgIH0gd2hpbGUgKG4tLSk7CisgIHMgPSBzb2FwLT50YWc7CisgIHdoaWxlIChzb2FwX25vdGJsYW5rKGMgPSBzb2FwX2dldChzb2FwKSkpCisgICAgKnMrKyA9IChjaGFyKWM7CisgICpzID0gJ1wwJzsKKyAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIHdoaWxlIChzb2FwX2JsYW5rKGMpKQorICAgIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgaWYgKGMgIT0gU09BUF9HVCkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1NZTlRBWF9FUlJPUjsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgZWxlbWVudCBmb3VuZCAobGV2ZWw9JXUpICclcyc9JyVzJ1xuIiwgc29hcC0+bGV2ZWwsIHNvYXAtPnRhZywgdGFnP3RhZzoiIikpOworICBpZiAoIXRhZyB8fCAhKnRhZykKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgaWYgKChzID0gc3RyY2hyKHNvYXAtPnRhZywgJzonKSkpCisgICAgcysrOworICBlbHNlCisgICAgcyA9IHNvYXAtPnRhZzsKKyAgaWYgKCh0ID0gc3RyY2hyKHRhZywgJzonKSkpCisgICAgdCsrOworICBlbHNlCisgICAgdCA9IHRhZzsKKyAgaWYgKCFTT0FQX1NUUkNNUChzLCB0KSkKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgZWxlbWVudCB0YWcgbmFtZSBkb2VzIG5vdCBtYXRjaFxuIikpOworICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1NZTlRBWF9FUlJPUjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIgKgorU09BUF9GTUFDMgorc29hcF9hdHRyX3ZhbHVlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgZmxhZykKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfYXR0cmlidXRlICp0cDsKKyAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICAgIGlmICghc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsIG5hbWUpKQorICAgICAgYnJlYWs7CisgIGlmICh0cCAmJiB0cC0+dmlzaWJsZSA9PSAyKQorICB7IGlmIChmbGFnID09IDIgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1BST0hJQklURUQ7CisgICAgZWxzZQorICAgICAgcmV0dXJuIHRwLT52YWx1ZTsKKyAgfQorICBlbHNlIGlmIChmbGFnID09IDEgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKQorICAgIHNvYXAtPmVycm9yID0gU09BUF9SRVFVSVJFRDsKKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2F0dHIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKnRwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNldCBhdHRyaWJ1dGUgJXM9JyVzJ1xuIiwgbmFtZSwgdmFsdWU/dmFsdWU6IiIpKTsKKyAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICB7IGlmICghc3RyY21wKHRwLT5uYW1lLCBuYW1lKSkKKyAgICAgIGJyZWFrOworICB9CisgIGlmICghdHApCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJBbGxvY2F0ZSBhdHRyaWJ1dGUgJXNcbiIsIG5hbWUpKTsKKyAgICBpZiAoISh0cCA9IChzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUpICsgc3RybGVuKG5hbWUpKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICB0cC0+bnMgPSBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgICB7IHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqKnRwcCA9ICZzb2FwLT5hdHRyaWJ1dGVzOworICAgICAgY29uc3QgY2hhciAqcyA9IHN0cmNocihuYW1lLCAnOicpOworICAgICAgaWYgKCFzdHJuY21wKG5hbWUsICJ4bWxucyIsIDUpKQorICAgICAgeyBmb3IgKDsgKnRwcDsgdHBwID0gJigqdHBwKS0+bmV4dCkKKyAgICAgICAgICBpZiAoc3RybmNtcCgoKnRwcCktPm5hbWUsICJ4bWxucyIsIDUpIHx8IHN0cmNtcCgoKnRwcCktPm5hbWUgKyA1LCBuYW1lICsgNSkgPiAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlbHNlIGlmICghcykKKyAgICAgIHsgZm9yICg7ICp0cHA7IHRwcCA9ICYoKnRwcCktPm5leHQpCisgICAgICAgICAgaWYgKHN0cm5jbXAoKCp0cHApLT5uYW1lLCAieG1sbnMiLCA1KSAmJiAoKCp0cHApLT5ucyB8fCBzdHJjbXAoKCp0cHApLT5uYW1lLCBuYW1lKSA+IDApKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IGludCBrOworICAgICAgICBmb3IgKDsgKnRwcDsgdHBwID0gJigqdHBwKS0+bmV4dCkKKwl7IGlmICghc3RybmNtcCgoKnRwcCktPm5hbWUsICJ4bWxuczoiLCA2KSAmJiAhc3RybmNtcCgoKnRwcCktPm5hbWUgKyA2LCBuYW1lLCBzIC0gbmFtZSkgJiYgISgqdHBwKS0+bmFtZVs2ICsgcyAtIG5hbWVdKQorCSAgeyBpZiAoIXRwLT5ucykKKyAgICAgICAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDYW5vbmljYWxpemF0aW9uOiBwcmVmaXggJXM9JXAoJXMpXG4iLCBuYW1lLCAoKnRwcCktPm5zLCAoKnRwcCktPm5zKSk7CisJICAgICAgdHAtPm5zID0gKCp0cHApLT5uczsKKwkgICAgfQorCSAgfQorICAgICAgICAgIGVsc2UgaWYgKHN0cm5jbXAoKCp0cHApLT5uYW1lLCAieG1sbnMiLCA1KSAmJiAoKnRwcCktPm5zICYmIHRwLT5ucyAmJiAoKGsgPSBzdHJjbXAoKCp0cHApLT5ucywgdHAtPm5zKSkgPiAwIHx8ICghayAmJiBzdHJjbXAoKCp0cHApLT5uYW1lLCBuYW1lKSA+IDApKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICB0cC0+bmV4dCA9ICp0cHA7CisgICAgICAqdHBwID0gdHA7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHsgdHAtPm5leHQgPSBzb2FwLT5hdHRyaWJ1dGVzOworICAgICAgc29hcC0+YXR0cmlidXRlcyA9IHRwOworICAgIH0KKyAgICBzdHJjcHkodHAtPm5hbWUsIG5hbWUpOworICAgIHRwLT52YWx1ZSA9IE5VTEw7CisgIH0KKyAgZWxzZSBpZiAodHAtPnZpc2libGUpCisgIHsgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgZWxzZSBpZiAodmFsdWUgJiYgdHAtPnZhbHVlICYmIHRwLT5zaXplIDw9IHN0cmxlbih2YWx1ZSkpCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIGF0dHJpYnV0ZSB2YWx1ZSBvZiAlcyAoZnJlZSAlcClcbiIsIG5hbWUsIHRwLT52YWx1ZSkpOworICAgIFNPQVBfRlJFRShzb2FwLCB0cC0+dmFsdWUpOworICAgIHRwLT52YWx1ZSA9IE5VTEw7CisgICAgdHAtPm5zID0gTlVMTDsKKyAgfQorICBpZiAodmFsdWUpCisgIHsgaWYgKCF0cC0+dmFsdWUpCisgICAgeyB0cC0+c2l6ZSA9IHN0cmxlbih2YWx1ZSkgKyAxOworICAgICAgaWYgKCEodHAtPnZhbHVlID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHRwLT5zaXplKSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJBbGxvY2F0ZSBhdHRyaWJ1dGUgdmFsdWUgb2YgJXMgKCVwKVxuIiwgdHAtPm5hbWUsIHRwLT52YWx1ZSkpOworICAgIH0KKyAgICBzdHJjcHkodHAtPnZhbHVlLCB2YWx1ZSk7CisgICAgaWYgKCFzdHJuY21wKHRwLT5uYW1lLCAieG1sbnM6IiwgNikpCisgICAgICB0cC0+bnMgPSB0cC0+dmFsdWU7CisgICAgdHAtPnZpc2libGUgPSAyOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBpZiAoIXN0cmNtcChuYW1lLCAid3N1OklkIikpCisgICAgeyBzb2FwLT5wYXJ0ID0gU09BUF9CRUdJTl9TRUNVUklUWTsKKyAgICAgIHN0cm5jcHkoc29hcC0+aWQsIHZhbHVlLCBzaXplb2Yoc29hcC0+aWQpKTsKKyAgICAgIHNvYXAtPmlkW3NpemVvZihzb2FwLT5pZCktMV0gPSAnXDAnOworICAgIH0KKyNlbmRpZgorICB9CisgIGVsc2UKKyAgICB0cC0+dmlzaWJsZSA9IDE7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9jbHJfYXR0cihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfYXR0cmlidXRlICp0cDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkpCisgIHsgd2hpbGUgKHNvYXAtPmF0dHJpYnV0ZXMpCisgICAgeyB0cCA9IHNvYXAtPmF0dHJpYnV0ZXMtPm5leHQ7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+YXR0cmlidXRlcy0+dmFsdWUpOworICAgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPmF0dHJpYnV0ZXMpOworICAgICAgc29hcC0+YXR0cmlidXRlcyA9IHRwOworICAgIH0KKyAgfQorICBlbHNlCisjZW5kaWYKKyAgeyBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgICAgICB0cC0+dmlzaWJsZSA9IDA7CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK3N0YXRpYyBpbnQKK3NvYXBfZ2V0YXR0cnZhbChzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqcywgc2l6ZV90IG4sIHNvYXBfd2NoYXIgZCkKK3sgcmVnaXN0ZXIgc2l6ZV90IGk7CisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgIHsgcmVnaXN0ZXIgc29hcF93Y2hhciBjID0gc29hcF9nZXQoc29hcCk7CisgICAgc3dpdGNoIChjKQorICAgIHsKKyAgICBjYXNlIFNPQVBfVFQ6CisgICAgICAqcysrID0gJzwnOworICAgICAgc29hcF91bmdldChzb2FwLCAnLycpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0xUOgorICAgICAgKnMrKyA9ICc8JzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9HVDoKKyAgICAgIGlmIChkID09ICcgJykKKyAgICAgIHsgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgKnMgPSAnXDAnOworICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICAgIH0KKyAgICAgICpzKysgPSAnPic7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfUVQ6CisgICAgICBpZiAoYyA9PSBkKQorICAgICAgeyAqcyA9ICdcMCc7CisgICAgICAgIHJldHVybiBTT0FQX09LOworICAgICAgfQorICAgICAgKnMrKyA9ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9BUDoKKyAgICAgIGlmIChjID09IGQpCisgICAgICB7ICpzID0gJ1wwJzsKKyAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgICB9CisgICAgICAqcysrID0gJ1wnJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1x0JzoKKyAgICBjYXNlICdcbic6CisgICAgY2FzZSAnXHInOgorICAgIGNhc2UgJyAnOgorICAgIGNhc2UgJy8nOgorICAgICAgaWYgKGQgPT0gJyAnKQorICAgICAgeyBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICAqcyA9ICdcMCc7CisgICAgICAgIHJldHVybiBTT0FQX09LOworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgICAqcysrID0gKGNoYXIpYzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBXSVRIX0ZBU1QKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc3RvcmVfbGFiKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBzaXplX3QgbikKK3sgc29hcC0+bGFiaWR4ID0gMDsKKyAgcmV0dXJuIHNvYXBfYXBwZW5kX2xhYihzb2FwLCBzLCBuKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgV0lUSF9GQVNUCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2FwcGVuZF9sYWIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBuKQoreyBpZiAoc29hcC0+bGFiaWR4ICsgbiA+PSBzb2FwLT5sYWJsZW4pCisgIHsgcmVnaXN0ZXIgY2hhciAqdCA9IHNvYXAtPmxhYmJ1ZjsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVubGFyZ2luZyBsb29rLWFzaWRlIGJ1ZmZlciB0byBhcHBlbmQgZGF0YSwgb2xkIHNpemU9JWx1IiwgKHVuc2lnbmVkIGxvbmcpc29hcC0+bGFibGVuKSk7CisgICAgaWYgKHNvYXAtPmxhYmxlbiA9PSAwKQorICAgICAgc29hcC0+bGFibGVuID0gU09BUF9MQUJMRU47CisgICAgd2hpbGUgKHNvYXAtPmxhYmlkeCArIG4gPj0gc29hcC0+bGFibGVuKQorICAgICAgc29hcC0+bGFibGVuIDw8PSAxOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiLCBuZXcgc2l6ZT0lbHVcbiIsICh1bnNpZ25lZCBsb25nKXNvYXAtPmxhYmxlbikpOworICAgIHNvYXAtPmxhYmJ1ZiA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzb2FwLT5sYWJsZW4pOworICAgIGlmICghc29hcC0+bGFiYnVmKQorICAgIHsgaWYgKHQpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCB0KTsKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIH0KKyAgICBpZiAodCkKKyAgICB7IG1lbWNweShzb2FwLT5sYWJidWYsIHQsIHNvYXAtPmxhYmlkeCk7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgdCk7CisgICAgfQorICB9CisgIGlmIChzKQorICB7IG1lbWNweShzb2FwLT5sYWJidWYgKyBzb2FwLT5sYWJpZHgsIHMsIG4pOworICAgIHNvYXAtPmxhYmlkeCArPSBuOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcGVla19lbGVtZW50KHN0cnVjdCBzb2FwICpzb2FwKQoreworI2lmZGVmIFdJVEhfRE9NCisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgKiphdHQgPSBOVUxMOworICByZWdpc3RlciBjaGFyICpsZWFkID0gTlVMTDsKKyNlbmRpZgorICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKnRwOworICBjb25zdCBjaGFyICp0OworICByZWdpc3RlciBjaGFyICpzOworICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIHJlZ2lzdGVyIGludCBpOworICBpZiAoc29hcC0+cGVla2VkKQorICB7IGlmICghKnNvYXAtPnRhZykKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTk9fVEFHOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIHNvYXAtPnBlZWtlZCA9IDE7CisgIGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisjaWZkZWYgV0lUSF9ET00KKyAgLyogd2hpdGVzcGFjZSBsZWFkaW5nIHRvIHN0YXJ0IHRhZyBpcyBub3QgaW5zaWduaWZpY2FudCBmb3IgRE9NICovCisgIGlmIChzb2FwX2JsYW5rKGMpKQorICB7IHNvYXAtPmxhYmlkeCA9IDA7CisgICAgZG8KKyAgICB7IGlmIChzb2FwX2FwcGVuZF9sYWIoc29hcCwgTlVMTCwgMCkpCisgICAgICAgIHJldHVybiBTT0FQX0VPTTsKKyAgICAgIHMgPSBzb2FwLT5sYWJidWYgKyBzb2FwLT5sYWJpZHg7CisgICAgICBpID0gc29hcC0+bGFibGVuIC0gc29hcC0+bGFiaWR4OworICAgICAgc29hcC0+bGFiaWR4ID0gc29hcC0+bGFibGVuOworICAgICAgd2hpbGUgKHNvYXBfYmxhbmsoYykgJiYgaS0tKQorICAgICAgeyAqcysrID0gYzsKKyAgICAgICAgYyA9IHNvYXBfZ2V0dXRmOChzb2FwKTsKKyAgICAgIH0KKyAgICB9CisgICAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworICAgICpzID0gJ1wwJzsKKyAgICBsZWFkID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+bGFiYnVmKTsKKyAgfQorI2Vsc2UKKyAgd2hpbGUgKHNvYXBfYmxhbmsoYykpCisgICAgYyA9IHNvYXBfZ2V0dXRmOChzb2FwKTsKKyNlbmRpZgorICBpZiAoYyAhPSBTT0FQX0xUKQorICB7ICpzb2FwLT50YWcgPSAnXDAnOworICAgIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyNpZmRlZiBXSVRIX0RPTQorICAgIC8qIHdoaXRlc3BhY2UgbGVhZGluZyB0byBlbmQgdGFnIGlzIG5vdCBpbnNpZ25pZmljYW50IGZvciBET00gKi8KKyAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgICAgIHNvYXAtPmRvbS0+dGFpbCA9IHNvYXBfc3RyZHVwKHNvYXAsIGxlYWQpOworI2VuZGlmCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9OT19UQUc7CisgIH0KKyAgcyA9IHNvYXAtPnRhZzsKKyAgZG8gYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworICBpID0gc2l6ZW9mKHNvYXAtPnRhZyk7CisgIHdoaWxlIChjICE9ICc+JyAmJiBjICE9ICcvJyAmJiBzb2FwX25vdGJsYW5rKGMpKQorICB7IGlmICgtLWkgPiAwKQorICAgICAgKnMrKyA9IChjaGFyKWM7CisgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgfQorICB3aGlsZSAoc29hcF9ibGFuayhjKSkKKyAgICBjID0gc29hcF9nZXQxKHNvYXApOworICAqcyA9ICdcMCc7CisgIHNvYXAtPmlkWzBdID0gJ1wwJzsKKyAgc29hcC0+aHJlZlswXSA9ICdcMCc7CisgIHNvYXAtPnR5cGVbMF0gPSAnXDAnOworICBzb2FwLT5hcnJheVR5cGVbMF0gPSAnXDAnOworICBzb2FwLT5hcnJheVNpemVbMF0gPSAnXDAnOworICBzb2FwLT5hcnJheU9mZnNldFswXSA9ICdcMCc7CisgIHNvYXAtPm90aGVyID0gMDsKKyAgc29hcC0+cm9vdCA9IC0xOworICBzb2FwLT5wb3NpdGlvbiA9IDA7CisgIHNvYXAtPm51bGwgPSAwOworICBzb2FwLT5tdXN0VW5kZXJzdGFuZCA9IDA7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKmVsdDsKKyAgICBlbHQgPSAoc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCkpOworICAgIGlmICghZWx0KQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgZWx0LT5uZXh0ID0gTlVMTDsKKyAgICBlbHQtPm5zdHIgPSBOVUxMOworICAgIGVsdC0+bmFtZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPnRhZyk7CisgICAgZWx0LT5wcm50ID0gc29hcC0+ZG9tOworICAgIGVsdC0+ZWx0cyA9IE5VTEw7CisgICAgZWx0LT5hdHRzID0gTlVMTDsKKyAgICBlbHQtPmRhdGEgPSBOVUxMOworICAgIGVsdC0+d2lkZSA9IE5VTEw7CisgICAgZWx0LT50eXBlID0gMDsKKyAgICBlbHQtPm5vZGUgPSBOVUxMOworICAgIGVsdC0+aGVhZCA9IGxlYWQ7CisgICAgZWx0LT50YWlsID0gTlVMTDsKKyAgICBlbHQtPnNvYXAgPSBzb2FwOworICAgIGlmIChzb2FwLT5kb20pCisgICAgeyBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqcCA9IHNvYXAtPmRvbS0+ZWx0czsKKyAgICAgIGlmIChwKQorICAgICAgeyB3aGlsZSAocC0+bmV4dCkKKyAgICAgICAgICBwID0gcC0+bmV4dDsKKyAgICAgICAgcC0+bmV4dCA9IGVsdDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgc29hcC0+ZG9tLT5lbHRzID0gZWx0OworICAgIH0KKyAgICBzb2FwLT5kb20gPSBlbHQ7CisgICAgYXR0ID0gJmVsdC0+YXR0czsKKyAgfQorI2VuZGlmCisgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgICB0cC0+dmlzaWJsZSA9IDA7CisgIHdoaWxlICgoaW50KWMgIT0gRU9GICYmIGMgIT0gJz4nICYmIGMgIT0gJy8nKQorICB7IHMgPSBzb2FwLT50bXBidWY7CisgICAgaSA9IHNpemVvZihzb2FwLT50bXBidWYpOworICAgIHdoaWxlIChjICE9ICc9JyAmJiBjICE9ICc+JyAmJiBjICE9ICcvJyAmJiBzb2FwX25vdGJsYW5rKGMpKQorICAgIHsgaWYgKC0taSA+IDApCisgICAgICAgICpzKysgPSAoY2hhciljOworICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICB9CisgICAgKnMgPSAnXDAnOworICAgIGlmIChpID09IHNpemVvZihzb2FwLT50bXBidWYpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9TWU5UQVhfRVJST1I7CisjaWZkZWYgV0lUSF9ET00KKyAgICAvKiBhZGQgYXR0cmlidXRlIG5hbWUgdG8gZG9tICovCisgICAgaWYgKGF0dCkKKyAgICB7ICphdHQgPSAoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUpKTsKKyAgICAgICBpZiAoISphdHQpCisgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgICAoKmF0dCktPm5leHQgPSBOVUxMOworICAgICAgICgqYXR0KS0+bnN0ciA9IE5VTEw7CisgICAgICAgKCphdHQpLT5uYW1lID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+dG1wYnVmKTsKKyAgICAgICAoKmF0dCktPmRhdGEgPSBOVUxMOworICAgICAgICgqYXR0KS0+d2lkZSA9IE5VTEw7CisgICAgICAgKCphdHQpLT5zb2FwID0gc29hcDsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoIXN0cm5jbXAoc29hcC0+dG1wYnVmLCAieG1sbnMiLCA1KSkKKyAgICB7IGlmIChzb2FwLT50bXBidWZbNV0gPT0gJzonKQorICAgICAgeyBzb2FwLT50bXBidWZbNV0gPSAnXDAnOworICAgICAgICB0ID0gc29hcC0+dG1wYnVmICsgNjsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHNvYXAtPnRtcGJ1Zls1XSkKKyAgICAgICAgdCA9IE5VTEw7CisgICAgICBlbHNlCisgICAgICAgIHQgPSBTT0FQX1NUUl9FT1M7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHQgPSBOVUxMOworICAgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgICB7IGlmICghU09BUF9TVFJDTVAodHAtPm5hbWUsIHNvYXAtPnRtcGJ1ZikpCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIXRwKQorICAgIHsgdHAgPSAoc3RydWN0IHNvYXBfYXR0cmlidXRlKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfYXR0cmlidXRlKSArIHN0cmxlbihzb2FwLT50bXBidWYpKTsKKyAgICAgIGlmICghdHApCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgc3RyY3B5KHRwLT5uYW1lLCBzb2FwLT50bXBidWYpOworICAgICAgdHAtPnZhbHVlID0gTlVMTDsKKyAgICAgIHRwLT5zaXplID0gMDsKKyAgICAgIHRwLT5uZXh0ID0gc29hcC0+YXR0cmlidXRlczsKKyAgICAgIHNvYXAtPmF0dHJpYnV0ZXMgPSB0cDsKKyAgICB9CisgICAgd2hpbGUgKHNvYXBfYmxhbmsoYykpCisgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworICAgIGlmIChjID09ICc9JykKKyAgICB7IGRvIGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisgICAgICB3aGlsZSAoc29hcF9ibGFuayhjKSk7CisgICAgICBpZiAoYyAhPSBTT0FQX1FUICYmIGMgIT0gU09BUF9BUCkKKyAgICAgIHsgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgYyA9ICcgJzsgLyogYmxhbmsgZGVsaW1pdGVyICovCisgICAgICB9CisgICAgICBpZiAoc29hcF9nZXRhdHRydmFsKHNvYXAsIHRwLT52YWx1ZSwgdHAtPnNpemUsIGMpKQorICAgICAgeworI2lmZGVmIFdJVEhfRkFTVAorICAgICAgICBpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9FT00pCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisJaWYgKHNvYXBfc3RvcmVfbGFiKHNvYXAsIHRwLT52YWx1ZSwgdHAtPnNpemUpKQorCSAgcmV0dXJuIHNvYXAtPmVycm9yOworCWlmICh0cC0+dmFsdWUpCisJICBTT0FQX0ZSRUUoc29hcCwgdHAtPnZhbHVlKTsKKwlmb3IgKDs7KQorCXsgaWYgKHNvYXBfZ2V0YXR0cnZhbChzb2FwLCBzb2FwLT5sYWJidWYgKyBzb2FwLT5sYWJpZHgsIHNvYXAtPmxhYmxlbiAtIHNvYXAtPmxhYmlkeCwgYykpCisJICB7IGlmIChzb2FwLT5lcnJvciAhPSBTT0FQX0VPTSkKKwkgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisJICAgIHNvYXAtPmxhYmlkeCA9IHNvYXAtPmxhYmxlbjsKKwkgICAgaWYgKHNvYXBfYXBwZW5kX2xhYihzb2FwLCBOVUxMLCAwKSkKKwkgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisJICB9CisJICBlbHNlCisJICAgIGJyZWFrOworCX0KKwlpZiAoc29hcC0+bGFiaWR4KQorICAgICAgICAgIHRwLT5zaXplID0gc29hcC0+bGFibGVuOworCWVsc2UKKwl7IHRwLT5zaXplID0gc3RybGVuKHNvYXAtPmxhYmJ1ZikgKyAxOworICAgICAgICAgIGlmICh0cC0+c2l6ZSA8IFNPQVBfTEFCTEVOKQorCSAgICB0cC0+c2l6ZSA9IFNPQVBfTEFCTEVOOworICAgICAgICB9CisJaWYgKCEodHAtPnZhbHVlID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHRwLT5zaXplKSkpCisJICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgICAgc3RyY3B5KHRwLT52YWx1ZSwgc29hcC0+bGFiYnVmKTsKKyNlbHNlCisJc2l6ZV90IG47CisgICAgICAgIGlmIChzb2FwLT5lcnJvciAhPSBTT0FQX0VPTSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgICAgICAgaWYgKHNvYXBfbmV3X2Jsb2NrKHNvYXApKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeyBpZiAoIShzID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBTT0FQX0JMS0xFTikpKQorICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICAgIGlmIChzb2FwX2dldGF0dHJ2YWwoc29hcCwgcywgU09BUF9CTEtMRU4sIGMpKQorICAgICAgICAgIHsgaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfRU9NKQorICAgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisJbiA9IHRwLT5zaXplICsgc29hcC0+Ymxpc3QtPnNpemU7CisgICAgICAgIGlmICghKHMgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgbikpKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgICBpZiAodHAtPnZhbHVlKQorICAgICAgICB7IG1lbWNweShzLCB0cC0+dmFsdWUsIHRwLT5zaXplKTsKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgdHAtPnZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBzb2FwX3NhdmVfYmxvY2soc29hcCwgcyArIHRwLT5zaXplLCAwKTsKKyAgICAgICAgdHAtPnZhbHVlID0gczsKKyAgICAgICAgdHAtPnNpemUgPSBuOworI2VuZGlmCisgICAgICB9CisgICAgICBkbyBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworICAgICAgdHAtPnZpc2libGUgPSAyOyAvKiBzZWVuIHRoaXMgYXR0cmlidXRlIHcvIHZhbHVlICovCisjaWZkZWYgV0lUSF9ET00KKyAgICAgIGlmIChhdHQpCisgICAgICAgICgqYXR0KS0+ZGF0YSA9IHNvYXBfc3RyZHVwKHNvYXAsIHRwLT52YWx1ZSk7CisjZW5kaWYKKyAgICB9CisgICAgZWxzZQorICAgICAgdHAtPnZpc2libGUgPSAxOyAvKiBzZWVuIHRoaXMgYXR0cmlidXRlIHcvbyB2YWx1ZSAqLworI2lmZGVmIFdJVEhfRE9NCisgICAgaWYgKGF0dCkKKyAgICAgIGF0dCA9ICYoKmF0dCktPm5leHQ7CisjZW5kaWYKKyAgICBpZiAodCAmJiB0cC0+dmFsdWUpCisgICAgeyBpZiAoc29hcF9wdXNoX25hbWVzcGFjZShzb2FwLCB0LCB0cC0+dmFsdWUpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB0cC0+dmlzaWJsZSA9IDA7CisgICAgfQorICB9CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKGF0dCkKKyAgeyBzb2FwLT5kb20tPm5zdHIgPSBzb2FwX2N1cnJlbnRfbmFtZXNwYWNlKHNvYXAsIHNvYXAtPnRhZyk7CisgICAgZm9yIChhdHQgPSAmc29hcC0+ZG9tLT5hdHRzOyAqYXR0OyBhdHQgPSAmKCphdHQpLT5uZXh0KQorICAgICAgKCphdHQpLT5uc3RyID0gc29hcF9jdXJyZW50X25hbWVzcGFjZShzb2FwLCAoKmF0dCktPm5hbWUpOworICB9CisjZW5kaWYKKyAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIGlmICghKHNvYXAtPmJvZHkgPSAoYyAhPSAnLycpKSkKKyAgICBkbyBjID0gc29hcF9nZXQxKHNvYXApOworICAgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkKKyAgeyBpZiAoIXNvYXAtPmJvZHkgJiYgc29hcC0+ZG9tLT5wcm50KQorICAgICAgc29hcC0+ZG9tID0gc29hcC0+ZG9tLT5wcm50OworICB9CisjZW5kaWYKKyAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICB7IGlmICh0cC0+dmlzaWJsZSAmJiB0cC0+dmFsdWUpCisgICAgeyBpZiAoIXN0cmNtcCh0cC0+bmFtZSwgImlkIikpCisgICAgICB7ICpzb2FwLT5pZCA9ICcjJzsKKyAgICAgICAgc3RybmNweShzb2FwLT5pZCArIDEsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPmlkKSAtIDIpOworICAgICAgICBzb2FwLT5pZFtzaXplb2Yoc29hcC0+aWQpLTFdID0gJ1wwJzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAodHAtPm5hbWUsICJocmVmIikpCisgICAgICB7IHN0cm5jcHkoc29hcC0+aHJlZiwgdHAtPnZhbHVlLCBzaXplb2Yoc29hcC0+aHJlZikgLSAxKTsKKyAgICAgICAgc29hcC0+aHJlZltzaXplb2Yoc29hcC0+aHJlZiktMV0gPSAnXDAnOworICAgICAgfQorICAgICAgZWxzZSBpZiAoKHNvYXAtPnZlcnNpb24gPT0gMiB8fCAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0dSQVBIKSkgJiYgIXN0cmNtcCh0cC0+bmFtZSwgInJlZiIpKQorICAgICAgeyAqc29hcC0+aHJlZiA9ICcjJzsKKyAgICAgICAgc3RybmNweShzb2FwLT5ocmVmICsgMSwgdHAtPnZhbHVlLCBzaXplb2Yoc29hcC0+aHJlZikgLSAyKTsKKyAgICAgICAgc29hcC0+aHJlZltzaXplb2Yoc29hcC0+aHJlZiktMV0gPSAnXDAnOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAieHNpOnR5cGUiKSkKKyAgICAgIHsgc3RybmNweShzb2FwLT50eXBlLCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT50eXBlKSAtIDEpOworICAgICAgICBzb2FwLT50eXBlW3NpemVvZihzb2FwLT50eXBlKS0xXSA9ICdcMCc7CisgICAgICB9CisgICAgICBlbHNlIGlmIChzb2FwLT52ZXJzaW9uID09IDEgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTkM6YXJyYXlUeXBlIikpCisgICAgICB7IHMgPSBzb2FwX3N0cnJjaHIodHAtPnZhbHVlLCAnWycpOworICAgICAgICBpZiAocyAmJiAoc2l6ZV90KShzIC0gdHAtPnZhbHVlKSA8IHNpemVvZihzb2FwLT5hcnJheVR5cGUpKQorICAgICAgICB7IHN0cm5jcHkoc29hcC0+YXJyYXlUeXBlLCB0cC0+dmFsdWUsIHMgLSB0cC0+dmFsdWUpOworICAgICAgICAgIHNvYXAtPmFycmF5VHlwZVtzIC0gdHAtPnZhbHVlXSA9ICdcMCc7CisgICAgICAgICAgc3RybmNweShzb2FwLT5hcnJheVNpemUsIHMsIHNpemVvZihzb2FwLT5hcnJheVNpemUpIC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHN0cm5jcHkoc29hcC0+YXJyYXlUeXBlLCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT5hcnJheVR5cGUpIC0gMSk7CisgICAgICAgIHNvYXAtPmFycmF5U2l6ZVtzaXplb2Yoc29hcC0+YXJyYXlUeXBlKS0xXSA9ICdcMCc7CisgICAgICAgIHNvYXAtPmFycmF5VHlwZVtzaXplb2Yoc29hcC0+YXJyYXlUeXBlKS0xXSA9ICdcMCc7CisgICAgICB9CisgICAgICBlbHNlIGlmIChzb2FwLT52ZXJzaW9uID09IDIgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTkM6aXRlbVR5cGUiKSkKKyAgICAgICAgc3RybmNweShzb2FwLT5hcnJheVR5cGUsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPmFycmF5VHlwZSkgLSAxKTsKKyAgICAgIGVsc2UgaWYgKHNvYXAtPnZlcnNpb24gPT0gMiAmJiAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOQzphcnJheVNpemUiKSkKKyAgICAgICAgc3RybmNweShzb2FwLT5hcnJheVNpemUsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPmFycmF5U2l6ZSkgLSAxKTsKKyAgICAgIGVsc2UgaWYgKHNvYXAtPnZlcnNpb24gPT0gMSAmJiAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOQzpvZmZzZXQiKSkKKyAgICAgICAgc3RybmNweShzb2FwLT5hcnJheU9mZnNldCwgdHAtPnZhbHVlLCBzaXplb2Yoc29hcC0+YXJyYXlPZmZzZXQpKTsKKyAgICAgIGVsc2UgaWYgKHNvYXAtPnZlcnNpb24gPT0gMSAmJiAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOQzpwb3NpdGlvbiIpKQorICAgICAgICBzb2FwLT5wb3NpdGlvbiA9IHNvYXBfZ2V0cG9zaXRpb24odHAtPnZhbHVlLCBzb2FwLT5wb3NpdGlvbnMpOworICAgICAgZWxzZSBpZiAoc29hcC0+dmVyc2lvbiA9PSAxICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5DOnJvb3QiKSkKKyAgICAgICAgc29hcC0+cm9vdCA9ICgoIXN0cmNtcCh0cC0+dmFsdWUsICIxIikgfHwgIXN0cmNtcCh0cC0+dmFsdWUsICJ0cnVlIikpKTsKKyAgICAgIGVsc2UgaWYgKChzb2FwLT52ZXJzaW9uID09IDEgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTlY6YWN0b3IiKSkKKyAgICAgICAgICAgIHx8IChzb2FwLT52ZXJzaW9uID09IDIgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTlY6cm9sZSIpKSkKKyAgICAgIHsgaWYgKCghc29hcC0+YWN0b3IgfHwgc3RyY21wKHNvYXAtPmFjdG9yLCB0cC0+dmFsdWUpKQorICAgICAgICAgJiYgc3RyY21wKHRwLT52YWx1ZSwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvYWN0b3IvbmV4dCIpCisgICAgICAgICAmJiBzdHJjbXAodHAtPnZhbHVlLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlL3JvbGUvbmV4dCIpKQorICAgICAgICAgIHNvYXAtPm90aGVyID0gMTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5WOm11c3RVbmRlcnN0YW5kIikKKyAgICAgICAgICAgICYmICghc3RyY21wKHRwLT52YWx1ZSwgIjEiKSB8fCAhc3RyY21wKHRwLT52YWx1ZSwgInRydWUiKSkpCisgICAgICAgIHNvYXAtPm11c3RVbmRlcnN0YW5kID0gMTsKKyAgICAgIGVsc2UgaWYgKCghc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJ4c2k6bnVsbCIpCisgICAgICAgICAgICAgfHwgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAieHNpOm5pbCIpKQorICAgICAgICAgICAgJiYgKCFzdHJjbXAodHAtPnZhbHVlLCAiMSIpCisgICAgICAgICAgICAgfHwgIXN0cmNtcCh0cC0+dmFsdWUsICJ0cnVlIikpKQorICAgICAgICBzb2FwLT5udWxsID0gMTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfcmV0cnkoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgc29hcF9yZXZlcnQoc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3JldmVydChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKCFzb2FwLT5wZWVrZWQpCisgIHsgc29hcC0+cGVla2VkID0gMTsKKyAgICBpZiAoc29hcC0+Ym9keSkKKyAgICAgIHNvYXAtPmxldmVsLS07CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXZlcnRpbmcgbGFzdCBlbGVtZW50IChsZXZlbD0ldSlcbiIsIHNvYXAtPmxldmVsKSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc3RyaW5nX291dChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgaW50IGZsYWcpCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnQ7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBtYXNrID0gMHhGRkZGRkY4MFVMOworI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IHNvYXAtPmRvbS0+ZGF0YSA9IHNvYXBfc3RyZHVwKHNvYXAsIHMpOworICAgIHJldHVybiBTT0FQX09LOworICB9CisjZW5kaWYKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0NfVVRGU1RSSU5HKQorICAgIG1hc2sgPSAwOworICB0ID0gczsKKyAgd2hpbGUgKChjID0gKnQrKykpCisgIHsgc3dpdGNoIChjKQorICAgIHsgCisgICAgY2FzZSA5OgorICAgICAgaWYgKGZsYWcpCisgICAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiJiN4OTsiLCA1KSkKKwkgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgcyA9IHQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDEwOgorICAgICAgaWYgKGZsYWcgfHwgIShzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKSkKKyAgICAgIHsgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICImI3hBOyIsIDUpKQorCSAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBzID0gdDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTM6CisgICAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIiYjeEQ7IiwgNSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHMgPSB0OworICAgICAgYnJlYWs7CisgICAgY2FzZSAnJic6CisgICAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIiZhbXA7IiwgNSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHMgPSB0OworICAgICAgYnJlYWs7CisgICAgY2FzZSAnPCc6CisgICAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIiZsdDsiLCA0KSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgcyA9IHQ7CisgICAgICBicmVhazsKKyAgICBjYXNlICc+JzoKKyAgICAgIGlmICghZmxhZykKKyAgICAgIHsgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICImZ3Q7IiwgNCkpCisJICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHMgPSB0OworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnIic6CisgICAgICBpZiAoZmxhZykKKyAgICAgIHsgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICImcXVvdDsiLCA2KSkKKwkgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgcyA9IHQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmZGVmIEhBVkVfTUJUT1dDCisgICAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfQ19NQlNUUklORykKKyAgICAgIHsgd2NoYXJfdCB3YzsKKyAgICAgICAgcmVnaXN0ZXIgaW50IG0gPSBtYnRvd2MoJndjLCB0IC0gMSwgTUJfQ1VSX01BWCk7CisgICAgICAgIGlmIChtID4gMCAmJiB3YyAhPSBjKQorICAgICAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9wdXR1dGY4KHNvYXAsIHdjKSkKKyAgICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKwkgIHMgPSB0ICs9IG0gLSAxOworCSAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyNlbmRpZgorI2VuZGlmCisgICAgICBpZiAoYyAmIG1hc2spCisgICAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9wdXR1dGY4KHNvYXAsICh1bnNpZ25lZCBjaGFyKWMpKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgcyA9IHQ7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfc3RyaW5nX2luKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgZmxhZywgbG9uZyBtaW5sZW4sIGxvbmcgbWF4bGVuKQoreyByZWdpc3RlciBjaGFyICpzOworICBjaGFyICp0ID0gTlVMTDsKKyAgcmVnaXN0ZXIgc2l6ZV90IGk7CisgIHJlZ2lzdGVyIGxvbmcgbCA9IDA7CisgIHJlZ2lzdGVyIGludCBuID0gMDsKKyAgcmVnaXN0ZXIgaW50IG0gPSAwOworICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisjaWYgIWRlZmluZWQoV0lUSF9MRUFORVIpICYmIGRlZmluZWQoSEFWRV9XQ1RPTUIpCisgIGNoYXIgYnVmW01CX0xFTl9NQVggPiA4ID8gTUJfTEVOX01BWCA6IDhdOworI2Vsc2UKKyAgY2hhciBidWZbOF07CisjZW5kaWYKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlYWRpbmcgc3RyaW5nIGNvbnRlbnRcbiIpKTsKKyAgaWYgKHNvYXAtPnBlZWtlZCkKKyAgeyBpZiAoIXNvYXAtPmJvZHkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKnNvYXAtPnRhZykKKyAgICB7IG4gPSAxOworICAgICAgc29hcC0+cGVla2VkID0gMDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICB0ID0gc29hcC0+dG1wYnVmOworICAgICAgdFswXSA9ICc8JzsKKyAgICAgIHN0cm5jcHkodCArIDEsIHNvYXAtPnRhZywgc2l6ZW9mKHNvYXAtPnRtcGJ1ZikgLSAxKTsKKyAgICAgIHN0cm5jYXQodCwgIj4iLCBzaXplb2Yoc29hcC0+dG1wYnVmKSk7CisgICAgICBtID0gc3RybGVuKHNvYXAtPnRhZykgKyAyOworI2VuZGlmCisgICAgfQorICB9CisjaWZkZWYgV0lUSF9DREFUQQorICBpZiAoIWZsYWcpCisgIHsgcmVnaXN0ZXIgaW50IHN0YXRlID0gMDsKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgICBzb2FwLT5sYWJpZHggPSAwOwkJCS8qIHVzZSBsb29rLWFzaWRlIGJ1ZmZlciAqLworI2Vsc2UKKyAgICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICAgIGZvciAoOzspCisgICAgeyAKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgICAgIHJlZ2lzdGVyIHNpemVfdCBrOworICAgICAgaWYgKHNvYXBfYXBwZW5kX2xhYihzb2FwLCBOVUxMLCAwKSkJLyogYWxsb2NhdGUgbW9yZSBzcGFjZSBpbiBsb29rLWFzaWRlIGJ1ZmZlciBpZiBuZWNlc3NhcnkgKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICBzID0gc29hcC0+bGFiYnVmICsgc29hcC0+bGFiaWR4OwkvKiBzcGFjZSB0byBwb3B1bGF0ZSAqLworICAgICAgayA9IHNvYXAtPmxhYmxlbiAtIHNvYXAtPmxhYmlkeDsJLyogbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSAqLworICAgICAgc29hcC0+bGFiaWR4ID0gc29hcC0+bGFibGVuOwkvKiBjbGFpbSB0aGlzIHNwYWNlICovCisjZWxzZQorICAgICAgcmVnaXN0ZXIgc2l6ZV90IGsgPSBTT0FQX0JMS0xFTjsKKyAgICAgIGlmICghKHMgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIGspKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBrOyBpKyspCisgICAgICB7IGlmIChtID4gMCkKKyAgICAgICAgeyAqcysrID0gKnQrKzsJLyogY29weSBtdWx0aWJ5dGUgY2hhcmFjdGVycyAqLworCSAgbS0tOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisJaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIGlmIChjID49IDB4ODAgJiYgIShzb2FwLT5tb2RlICYgU09BUF9FTkNfTEFUSU4pKQorICAgICAgICB7IHNvYXBfdW5nZXQoc29hcCwgYyk7CisJICBjID0gc29hcF9nZXR1dGY4KHNvYXApOworCSAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0NfVVRGU1RSSU5HKQorICAgICAgICAgIHsgaWYgKChjICYgMHg4MDAwMDAwMCkgJiYgYyA+PSAtMHg3RkZGRkY4MCAmJiBjIDwgU09BUF9BUCkKKyAgICAgICAgICAgIHsgYyAmPSAweDdGRkZGRkZGOworICAgICAgICAgICAgICB0ID0gYnVmOworICAgICAgICAgICAgICBpZiAoYyA8IDB4MDgwMCkKKyAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4QzAgfCAoKGMgPj4gNikgJiAweDFGKSk7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeyBpZiAoYyA8IDB4MDEwMDAwKQorICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEUwIHwgKChjID4+IDEyKSAmIDB4MEYpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeyBpZiAoYyA8IDB4MjAwMDAwKQorICAgICAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjAgfCAoKGMgPj4gMTgpICYgMHgwNykpOworICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgeyBpZiAoYyA8IDB4MDQwMDAwMDApCisgICAgICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEY4IHwgKChjID4+IDI0KSAmIDB4MDMpKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7ICp0KysgPSAoY2hhcikoMHhGQyB8ICgoYyA+PiAzMCkgJiAweDAxKSk7CisgICAgICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDI0KSAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTgpICYgMHgzRikpOworICAgICAgICAgICAgICAgICAgfSAgICAgCisgICAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTIpICYgMHgzRikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gNikgJiAweDNGKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKGMgJiAweDNGKSk7CisJICAgICAgbSA9IChpbnQpKHQgLSBidWYpIC0gMTsKKyAgICAgICAgICAgICAgdCA9IGJ1ZjsKKyAgICAgICAgICAgICAgKnMrKyA9ICp0Kys7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworCSAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisJc3dpdGNoIChzdGF0ZSkKKyAgICAgICAgeyBjYXNlIDE6CisgICAgICAgICAgICBpZiAoYyA9PSAnXScpCisJICAgICAgc3RhdGUgPSA0OworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisJICBjYXNlIDI6CisJICAgIGlmIChjID09ICctJykKKyAgICAgICAgICAgICAgc3RhdGUgPSA2OworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisJICBjYXNlIDM6CisJICAgIGlmIChjID09ICc/JykKKwkgICAgICBzdGF0ZSA9IDg7CisJICAgICpzKysgPSBjOworCSAgICBjb250aW51ZTsKKyAgICAgICAgICAvKiBDREFUQSAqLworCSAgY2FzZSA0OgorCSAgICBpZiAoYyA9PSAnXScpCisgICAgICAgICAgICAgIHN0YXRlID0gNTsKKwkgICAgZWxzZQorCSAgICAgIHN0YXRlID0gMTsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworCSAgY2FzZSA1OgorCSAgICBpZiAoYyA9PSAnPicpCisJICAgICAgc3RhdGUgPSAwOworCSAgICBlbHNlCisJICAgICAgc3RhdGUgPSAxOworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisgICAgICAgICAgLyogY29tbWVudCAqLworICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIGlmIChjID09ICctJykKKwkgICAgICBzdGF0ZSA9IDc7CisJICAgIGVsc2UKKwkgICAgICBzdGF0ZSA9IDI7CisJICAgICpzKysgPSBjOworCSAgICBjb250aW51ZTsKKyAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICBpZiAoYyA9PSAnPicpCisJICAgICAgc3RhdGUgPSAwOworCSAgICBlbHNlCisJICAgICAgc3RhdGUgPSAyOworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisgICAgICAgICAgLyogUEkgKi8KKwkgIGNhc2UgODoKKyAgICAgICAgICAgIGlmIChjID09ICc+JykKKwkgICAgICBzdGF0ZSA9IDA7CisJICAgIGVsc2UKKwkgICAgICBzdGF0ZSA9IDM7CisJICAgICpzKysgPSBjOworCSAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGMpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAnLyc6CisgICAgICAgICAgaWYgKG4gPiAwKQorICAgICAgICAgIHsgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgICAgICAgICAgIGlmIChjID09ICc+JykKKyAgICAgICAgICAgICAgbi0tOworICAgICAgICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgICB9CisgICAgICAgICAgKnMrKyA9ICcvJzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnPCc6CisJICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworCSAgaWYgKGMgPT0gJy8nKQorCSAgeyBpZiAobiA9PSAwKQorCSAgICB7IGMgPSBTT0FQX1RUOworCSAgICAgIGdvdG8gZW5kOworCSAgICB9CisJICAgIG4tLTsKKwkgIH0KKwkgIGVsc2UgaWYgKGMgPT0gJyEnKQorCSAgeyBjID0gc29hcF9nZXRjaGFyKHNvYXApOworCSAgICBpZiAoYyA9PSAnWycpCisgICAgICAgICAgICB7IGRvIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgICAgICAgICAgICAgIHdoaWxlICgoaW50KWMgIT0gRU9GICYmIGMgIT0gJ1snKTsKKyAgICAgICAgICAgICAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworCSAgICAgIHQgPSAoY2hhciopIiFbQ0RBVEFbIjsKKwkgICAgICBtID0gODsKKwkgICAgICBzdGF0ZSA9IDE7CisJICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJy0nKQorCSAgICB7IGlmICgoYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKSkgPT0gJy0nKQorCSAgICAgICAgc3RhdGUgPSAyOworCSAgICAgIHQgPSAoY2hhciopIiEtIjsKKwkgICAgICBtID0gMjsKKwkgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeyB0ID0gKGNoYXIqKSIhIjsKKwkgICAgICBtID0gMTsKKwkgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworCSAgICB9CisJICAgICpzKysgPSAnPCc7CisJICAgIGJyZWFrOworCSAgfQorCSAgZWxzZSBpZiAoYyA9PSAnPycpCisJICAgIHN0YXRlID0gMzsKKwkgIGVsc2UKKwkgICAgbisrOworICAgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgICAgKnMrKyA9ICc8JzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnPic6CisgICAgICAgICAgKnMrKyA9ICc+JzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnIic6CisgICAgICAgICAgKnMrKyA9ICciJzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZmRlZiBIQVZFX1dDVE9NQgorICAgICAgICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9DX01CU1RSSU5HKQorICAgICAgICAgIHsgbSA9IHdjdG9tYihidWYsIGMgJiAweDdGRkZGRkZGKTsKKyAgICAgICAgICAgIGlmIChtID49IDEgJiYgbSA8PSAoaW50KU1CX0NVUl9NQVgpCisgICAgICAgICAgICB7IHQgPSBidWY7CisgICAgICAgICAgICAgICpzKysgPSAqdCsrOworICAgICAgICAgICAgICBtLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7ICpzKysgPSBTT0FQX1VOS05PV05fQ0hBUjsKKwkgICAgICBtID0gMDsKKwkgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisjZW5kaWYKKyNlbmRpZgorICAgICAgICAgICAgKnMrKyA9IChjaGFyKShjICYgMHhGRik7CisgICAgICAgIH0KKwlsKys7CisgICAgICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgbWF4bGVuID49IDAgJiYgbCA+IG1heGxlbikKKyAgICAgICAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiU3RyaW5nIHRvbyBsb25nOiBtYXhsZW49JWxkXG4iLCBtYXhsZW4pKTsKKyAgICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfTEVOR1RIOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgc29hcC0+bGFiaWR4ID0gMDsJCQkvKiB1c2UgbG9vay1hc2lkZSBidWZmZXIgKi8KKyNlbHNlCisgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICBmb3IgKDs7KQorICB7IAorI2lmZGVmIFdJVEhfRkFTVAorICAgIHJlZ2lzdGVyIHNpemVfdCBrOworICAgIGlmIChzb2FwX2FwcGVuZF9sYWIoc29hcCwgTlVMTCwgMCkpCS8qIGFsbG9jYXRlIG1vcmUgc3BhY2UgaW4gbG9vay1hc2lkZSBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBzID0gc29hcC0+bGFiYnVmICsgc29hcC0+bGFiaWR4OwkvKiBzcGFjZSB0byBwb3B1bGF0ZSAqLworICAgIGsgPSBzb2FwLT5sYWJsZW4gLSBzb2FwLT5sYWJpZHg7CS8qIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgKi8KKyAgICBzb2FwLT5sYWJpZHggPSBzb2FwLT5sYWJsZW47CS8qIGNsYWltIHRoaXMgc3BhY2UgKi8KKyNlbHNlCisgICAgcmVnaXN0ZXIgc2l6ZV90IGsgPSBTT0FQX0JMS0xFTjsKKyAgICBpZiAoIShzID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBrKSkpCisgICAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICAgIGZvciAoaSA9IDA7IGkgPCBrOyBpKyspCisgICAgeyBpZiAobSA+IDApCisgICAgICB7ICpzKysgPSAqdCsrOwkvKiBjb3B5IG11bHRpYnl0ZSBjaGFyYWN0ZXJzICovCisgICAgICAgIG0tLTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfQ19VVEZTVFJJTkcpCisgICAgICB7IGlmICgoKGMgPSBzb2FwX2dldChzb2FwKSkgJiAweDgwMDAwMDAwKSAmJiBjID49IC0weDdGRkZGRjgwICYmIGMgPCBTT0FQX0FQKQorICAgICAgICB7IGMgJj0gMHg3RkZGRkZGRjsKKyAgICAgICAgICB0ID0gYnVmOworICAgICAgICAgIGlmIChjIDwgMHgwODAwKQorICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEMwIHwgKChjID4+IDYpICYgMHgxRikpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7IGlmIChjIDwgMHgwMTAwMDApCisgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhFMCB8ICgoYyA+PiAxMikgJiAweDBGKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7IGlmIChjIDwgMHgyMDAwMDApCisgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEYwIHwgKChjID4+IDE4KSAmIDB4MDcpKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7IGlmIChjIDwgMHgwNDAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhGOCB8ICgoYyA+PiAyNCkgJiAweDAzKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsgKnQrKyA9IChjaGFyKSgweEZDIHwgKChjID4+IDMwKSAmIDB4MDEpKTsKKyAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAyNCkgJiAweDNGKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAxOCkgJiAweDNGKSk7CisgICAgICAgICAgICAgIH0gICAgIAorICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTIpICYgMHgzRikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDYpICYgMHgzRikpOworICAgICAgICAgIH0KKyAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoYyAmIDB4M0YpKTsKKwkgIG0gPSAoaW50KSh0IC0gYnVmKSAtIDE7CisgICAgICAgICAgdCA9IGJ1ZjsKKyAgICAgICAgICAqcysrID0gKnQrKzsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBjID0gc29hcF9nZXR1dGY4KHNvYXApOworICAgICAgc3dpdGNoIChjKQorICAgICAgeworICAgICAgY2FzZSBTT0FQX1RUOgorICAgICAgICBpZiAobiA9PSAwKQorICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICBuLS07CisgICAgICAgICpzKysgPSAnPCc7CisgICAgICAgIHQgPSAoY2hhciopIi8iOworCW0gPSAxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9MVDoKKyAgICAgICAgbisrOworICAgICAgICAqcysrID0gJzwnOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9HVDoKKyAgICAgICAgKnMrKyA9ICc+JzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfUVQ6CisgICAgICAgICpzKysgPSAnIic7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTT0FQX0FQOgorICAgICAgICAqcysrID0gJ1wnJzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICcvJzoKKyAgICAgICAgaWYgKG4gPiAwKQorICAgICAgICB7IGMgPSBzb2FwX2dldChzb2FwKTsKKyAgICAgICAgICBpZiAoYyA9PSBTT0FQX0dUKQorICAgICAgICAgICAgbi0tOworICAgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgIH0KKyAgICAgICAgKnMrKyA9ICcvJzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICc8JyB8IDB4ODAwMDAwMDA6CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICpzKysgPSAnPCc7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAqcysrID0gJyYnOworICAgICAgICAgIHQgPSAoY2hhciopImx0OyI7CisJICBtID0gMzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJz4nIHwgMHg4MDAwMDAwMDoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9ICc+JzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAnJic7CisgICAgICAgICAgdCA9IChjaGFyKikiZ3Q7IjsKKwkgIG0gPSAzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnJicgfCAweDgwMDAwMDAwOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gJyYnOworICAgICAgICBlbHNlCisgICAgICAgIHsgKnMrKyA9ICcmJzsKKyAgICAgICAgICB0ID0gKGNoYXIqKSJhbXA7IjsKKwkgIG0gPSA0OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnIicgfCAweDgwMDAwMDAwOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gJyInOworICAgICAgICBlbHNlCisgICAgICAgIHsgKnMrKyA9ICcmJzsKKyAgICAgICAgICB0ID0gKGNoYXIqKSJxdW90OyI7CisJICBtID0gNTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ1wnJyB8IDB4ODAwMDAwMDA6CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICpzKysgPSAnXCcnOworICAgICAgICBlbHNlCisgICAgICAgIHsgKnMrKyA9ICcmJzsKKyAgICAgICAgICB0ID0gKGNoYXIqKSJhcG9zOyI7CisJICBtID0gNTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICAgIGdvdG8gZW5kOworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmZGVmIEhBVkVfV0NUT01CCisgICAgICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9DX01CU1RSSU5HKQorICAgICAgICB7IG0gPSB3Y3RvbWIoYnVmLCBjICYgMHg3RkZGRkZGRik7CisgICAgICAgICAgaWYgKG0gPj0gMSAmJiBtIDw9IChpbnQpTUJfQ1VSX01BWCkKKyAgICAgICAgICB7IHQgPSBidWY7CisgICAgICAgICAgICAqcysrID0gKnQrKzsKKyAgICAgICAgICAgIG0tLTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsgKnMrKyA9IFNPQVBfVU5LTk9XTl9DSEFSOworCSAgICBtID0gMDsKKwkgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYKKyNlbmRpZgorICAgICAgICAgICpzKysgPSAoY2hhcikoYyAmIDB4RkYpOworICAgICAgfQorICAgICAgbCsrOworICAgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiBtYXhsZW4gPj0gMCAmJiBsID4gbWF4bGVuKQorICAgICAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiU3RyaW5nIHRvbyBsb25nOiBtYXhsZW49JWxkXG4iLCBtYXhsZW4pKTsKKyAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0xFTkdUSDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgfQorICB9CitlbmQ6CisgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICpzID0gJ1wwJzsKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgdCA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPmxhYmJ1Zik7CisjZWxzZQorICBzb2FwX3NpemVfYmxvY2soc29hcCwgaSsxKTsKKyAgdCA9IHNvYXBfc2F2ZV9ibG9jayhzb2FwLCBOVUxMLCAwKTsKKyNlbmRpZgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIGwgPCBtaW5sZW4pCisgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlN0cmluZyB0b28gc2hvcnQ6ICVsZCBjaGFycywgbWlubGVuPSVsZFxuIiwgbCwgbWlubGVuKSk7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0xFTkdUSDsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IGlmIChmbGFnID09IDMpCisgICAgICBzb2FwLT5kb20tPnRhaWwgPSB0OworICAgIGVsc2UKKyAgICAgIHNvYXAtPmRvbS0+ZGF0YSA9IHQ7CisgIH0KKyNlbmRpZgorICBpZiAoZmxhZyA9PSAyKQorICAgIGlmIChzb2FwX3MyUU5hbWUoc29hcCwgdCwgJnQpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiB0OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3dzdHJpbmdfb3V0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB3Y2hhcl90ICpzLCBpbnQgZmxhZykKK3sgY29uc3QgY2hhciAqdDsKKyAgY2hhciB0bXA7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyB3Y2hhcl90ICpyID0gKHdjaGFyX3QqKXM7CisgICAgaW50IG4gPSAxOworICAgIHdoaWxlICgqcisrKQorICAgICAgbisrOworICAgIHNvYXAtPmRvbS0+d2lkZSA9IHIgPSAod2NoYXJfdCopc29hcF9tYWxsb2Moc29hcCwgbiAqIHNpemVvZih3Y2hhcl90KSk7CisgICAgd2hpbGUgKG4tLSkKKyAgICAgICpyKysgPSAqcysrOworICAgIHJldHVybiBTT0FQX09LOworICB9CisjZW5kaWYKKyAgd2hpbGUgKChjID0gKnMrKykpCisgIHsgc3dpdGNoIChjKQorICAgIHsgCisgICAgY2FzZSA5OgorICAgICAgaWYgKGZsYWcpCisgICAgICAgIHQgPSAiJiN4OTsiOworICAgICAgZWxzZQorICAgICAgICB0ID0gIlx0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTA6CisgICAgICBpZiAoZmxhZyB8fCAhKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpKQorICAgICAgICB0ID0gIiYjeEE7IjsKKyAgICAgIGVsc2UKKyAgICAgICAgdCA9ICJcbiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEzOgorICAgICAgdCA9ICImI3hEOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICcmJzoKKyAgICAgIHQgPSAiJmFtcDsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnPCc6CisgICAgICB0ID0gIiZsdDsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnPic6CisgICAgICBpZiAoZmxhZykKKyAgICAgICAgdCA9ICI+IjsKKyAgICAgIGVsc2UKKwl0ID0gIiZndDsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnIic6CisgICAgICBpZiAoZmxhZykKKyAgICAgICAgdCA9ICImcXVvdDsiOworICAgICAgZWxzZQorICAgICAgICB0ID0gIlwiIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoYyA+IDAgJiYgYyA8IDB4ODApCisgICAgICB7IHRtcCA9IChjaGFyKWM7CisgICAgICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsICZ0bXAsIDEpKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHNvYXBfcHV0dXRmOChzb2FwLCAodW5zaWduZWQgbG9uZyljKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChzb2FwX3NlbmQoc29hcCwgdCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3djaGFyX3QgKgorU09BUF9GTUFDMgorc29hcF93c3RyaW5nX2luKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgZmxhZywgbG9uZyBtaW5sZW4sIGxvbmcgbWF4bGVuKQoreyB3Y2hhcl90ICpzOworICByZWdpc3RlciBpbnQgaSwgbiA9IDA7CisgIHJlZ2lzdGVyIGxvbmcgbCA9IDA7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgY29uc3QgY2hhciAqdCA9IE5VTEw7CisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWFkaW5nIHdpZGUgc3RyaW5nIGNvbnRlbnRcbiIpKTsKKyAgaWYgKHNvYXAtPnBlZWtlZCkKKyAgeyBpZiAoIXNvYXAtPmJvZHkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKnNvYXAtPnRhZykKKyAgICB7IG4gPSAxOworICAgICAgc29hcC0+cGVla2VkID0gMDsKKyAgICB9CisgIH0KKyAgaWYgKHNvYXBfbmV3X2Jsb2NrKHNvYXApKQorICAgIHJldHVybiBOVUxMOworICBmb3IgKDs7KQorICB7IGlmICghKHMgPSAod2NoYXJfdCopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIHNpemVvZih3Y2hhcl90KSpTT0FQX0JMS0xFTikpKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IFNPQVBfQkxLTEVOOyBpKyspCisgICAgeyBpZiAodCkKKyAgICAgIHsgKnMrKyA9ICh3Y2hhcl90KSp0Kys7CisgICAgICAgIGlmICghKnQpCisgICAgICAgICAgdCA9IE5VTEw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgYyA9IHNvYXBfZ2V0dXRmOChzb2FwKTsKKyAgICAgIHN3aXRjaCAoYykKKyAgICAgIHsKKyAgICAgIGNhc2UgU09BUF9UVDoKKyAgICAgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgbi0tOworICAgICAgICAqcysrID0gJzwnOworICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsICcvJyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTT0FQX0xUOgorICAgICAgICBuKys7CisgICAgICAgICpzKysgPSAnPCc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTT0FQX0dUOgorICAgICAgICAqcysrID0gJz4nOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9RVDoKKyAgICAgICAgKnMrKyA9ICciJzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfQVA6CisgICAgICAgICpzKysgPSAnXCcnOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJy8nOgorICAgICAgICBpZiAobiA+IDApCisgICAgICAgIHsgYyA9IHNvYXBfZ2V0dXRmOChzb2FwKTsKKyAgICAgICAgICBpZiAoYyA9PSBTT0FQX0dUKQorICAgICAgICAgICAgbi0tOworICAgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgIH0KKyAgICAgICAgKnMrKyA9ICcvJzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICc8JzoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9IChzb2FwX3djaGFyKSc8JzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAoc29hcF93Y2hhciknJic7CisgICAgICAgICAgdCA9ICJsdDsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnPic6CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICpzKysgPSAoc29hcF93Y2hhciknPic7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAqcysrID0gKHNvYXBfd2NoYXIpJyYnOworICAgICAgICAgIHQgPSAiZ3Q7IjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJyInOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gKHNvYXBfd2NoYXIpJyInOworICAgICAgICBlbHNlCisgICAgICAgIHsgKnMrKyA9IChzb2FwX3djaGFyKScmJzsKKyAgICAgICAgICB0ID0gInF1b3Q7IjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAqcysrID0gKHdjaGFyX3QpYyAmIDB4N0ZGRkZGRkY7CisgICAgICB9CisgICAgICBsKys7CisgICAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIG1heGxlbiA+PSAwICYmIGwgPiBtYXhsZW4pCisgICAgICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJTdHJpbmcgdG9vIGxvbmc6IG1heGxlbj0lbGRcbiIsIG1heGxlbikpOworICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfTEVOR1RIOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICB9CisgIH0KK2VuZDoKKyAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgKnMgPSAnXDAnOworICBzb2FwX3NpemVfYmxvY2soc29hcCwgc2l6ZW9mKHdjaGFyX3QpICogKGkgKyAxKSk7CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgbCA8IG1pbmxlbikKKyAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiU3RyaW5nIHRvbyBzaG9ydDogJWxkIGNoYXJzLCBtaW5sZW49JWxkXG4iLCBsLCBtaW5sZW4pKTsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfTEVOR1RIOworICAgIHJldHVybiBOVUxMOworICB9CisgIHMgPSAod2NoYXJfdCopc29hcF9zYXZlX2Jsb2NrKHNvYXAsIE5VTEwsIDApOworI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICAgIHNvYXAtPmRvbS0+d2lkZSA9IHM7CisjZW5kaWYKKyAgcmV0dXJuIHM7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2ludDJzKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbikKK3sgcmV0dXJuIHNvYXBfbG9uZzJzKHNvYXAsIChsb25nKW4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dGludChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGludCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9sb25nMnMoc29hcCwgKGxvbmcpKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MyaW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBpbnQgKnApCit7IGlmIChzKQorICB7IGNoYXIgKnI7CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBzb2FwX3Jlc2V0X2Vycm5vOworI2VuZGlmCisjZW5kaWYKKyAgICAqcCA9IChpbnQpc29hcF9zdHJ0b2wocywgJnIsIDEwKTsKKyAgICBpZiAoKHMgPT0gciAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpIHx8ICpyCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgfHwgc29hcF9lcnJubyA9PSBTT0FQX0VSQU5HRQorI2VuZGlmCisjZW5kaWYKKyAgICApCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQgKgorU09BUF9GTUFDMgorc29hcF9pbmludChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6Ynl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9IChpbnQqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihpbnQpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAoaW50Kilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKGludCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MyaW50KHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2xvbmcycyhzdHJ1Y3Qgc29hcCAqc29hcCwgbG9uZyBuKQoreyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIiVsZCIsIG4pOworICByZXR1cm4gc29hcC0+dG1wYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dGxvbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBsb25nICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX2xvbmcycyhzb2FwLCAqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJsb25nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBsb25nICpwKQoreyBpZiAocykKKyAgeyBjaGFyICpyOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgc29hcF9yZXNldF9lcnJubzsKKyNlbmRpZgorI2VuZGlmCisgICAgKnAgPSBzb2FwX3N0cnRvbChzLCAmciwgMTApOworICAgIGlmICgocyA9PSByICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkgfHwgKnIKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICB8fCBzb2FwX2Vycm5vID09IFNPQVBfRVJBTkdFCisjZW5kaWYKKyNlbmRpZgorICAgICkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2xvbmcgKgorU09BUF9GTUFDMgorc29hcF9pbmxvbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgbG9uZyAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6aW50IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6c2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpieXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKGxvbmcqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihsb25nKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKGxvbmcqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YobG9uZyksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MybG9uZyhzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9MT05HNjQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgTE9ORzY0IG4pCit7IHNwcmludGYoc29hcC0+dG1wYnVmLCBTT0FQX0xPTkdfRk9STUFULCBuKTsKKyAgcmV0dXJuIHNvYXAtPnRtcGJ1ZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRMT05HNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBMT05HNjQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfTE9ORzY0MnMoc29hcCwgKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MyTE9ORzY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBMT05HNjQgKnApCit7IGlmIChzKQorICB7CisjaWZkZWYgSEFWRV9TVFJUT0xMCisgICAgY2hhciAqcjsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgIHNvYXBfcmVzZXRfZXJybm87CisjZW5kaWYKKyNlbmRpZgorICAgICpwID0gc3RydG9sbChzLCAmciwgMTApOworICAgIGlmICgocyA9PSByICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkgfHwgKnIKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgIHx8IHNvYXBfZXJybm8gPT0gU09BUF9FUkFOR0UKKyNlbmRpZgorI2VuZGlmCisgICAgICApCisjZWxzZQorIyBpZmRlZiBIQVZFX1NTQ0FORgorICAgIGlmIChzc2NhbmYocywgU09BUF9MT05HX0ZPUk1BVCwgcCkgIT0gMSkKKyMgZW5kaWYKKyNlbmRpZgorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorTE9ORzY0ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5MT05HNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgTE9ORzY0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjppbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6cG9zaXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bmVnYXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bm9uUG9zaXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bm9uTmVnYXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bG9uZyIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6Ynl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9IChMT05HNjQqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihMT05HNjQpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAoTE9ORzY0Kilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKExPTkc2NCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MyTE9ORzY0KHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2J5dGUycyhzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciBuKQoreyByZXR1cm4gc29hcF9sb25nMnMoc29hcCwgKGxvbmcpbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0Ynl0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfbG9uZzJzKHNvYXAsIChsb25nKSpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMmJ5dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGNoYXIgKnApCit7IGlmIChzKQorICB7IGxvbmcgbjsKKyAgICBjaGFyICpyOworICAgIG4gPSBzb2FwX3N0cnRvbChzLCAmciwgMTApOworICAgIGlmIChzID09IHIgfHwgKnIgfHwgbiA8IC0xMjggfHwgbiA+IDEyNykKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgICpwID0gKGNoYXIpbjsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5ieXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGNoYXIgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAoY2hhciopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKGNoYXIpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAoY2hhciopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihjaGFyKSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJieXRlKHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3Nob3J0MnMoc3RydWN0IHNvYXAgKnNvYXAsIHNob3J0IG4pCit7IHJldHVybiBzb2FwX2xvbmcycyhzb2FwLCAobG9uZyluKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRzaG9ydChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHNob3J0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX2xvbmcycyhzb2FwLCAobG9uZykqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJzaG9ydChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgc2hvcnQgKnApCit7IGlmIChzKQorICB7IGxvbmcgbjsKKyAgICBjaGFyICpyOworICAgIG4gPSBzb2FwX3N0cnRvbChzLCAmciwgMTApOworICAgIGlmIChzID09IHIgfHwgKnIgfHwgbiA8IC0zMjc2OCB8fCBuID4gMzI3NjcpCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICAqcCA9IChzaG9ydCluOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3Nob3J0ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5zaG9ydChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzaG9ydCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6c2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpieXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKHNob3J0Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2Yoc2hvcnQpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAoc2hvcnQqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2Yoc2hvcnQpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMnNob3J0KHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2Zsb2F0MnMoc3RydWN0IHNvYXAgKnNvYXAsIGZsb2F0IG4pCit7IGNvbnN0IGNoYXIgKnM7CisgIGlmIChzb2FwX2lzbmFuKChkb3VibGUpbikpCisgICAgcyA9ICJOYU4iOworICBlbHNlIGlmIChzb2FwX2lzcGluZmYobikpCisgICAgcyA9ICJJTkYiOworICBlbHNlIGlmIChzb2FwX2lzbmluZmYobikpCisgICAgcyA9ICItSU5GIjsKKyAgZWxzZQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCBzb2FwLT5mbG9hdF9mb3JtYXQsIG4pOworICAgIHMgPSBzb2FwLT50bXBidWY7CisgIH0KKyAgcmV0dXJuIHM7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0ZmxvYXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBmbG9hdCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9mbG9hdDJzKHNvYXAsICpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMmZsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBmbG9hdCAqcCkKK3sgaWYgKHMpCisgIHsgaWYgKCEqcykKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBpZiAoIXNvYXBfdGFnX2NtcChzLCAiSU5GIikpCisgICAgICAqcCA9IEZMVF9QSU5GVFk7CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChzLCAiK0lORiIpKQorICAgICAgKnAgPSBGTFRfUElORlRZOworICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAocywgIi1JTkYiKSkKKyAgICAgICpwID0gRkxUX05JTkZUWTsKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHMsICJOYU4iKSkKKyAgICAgICpwID0gRkxUX05BTjsKKyAgICBlbHNlCisgICAgeworLyogT24gc29tZSBzeXN0ZW1zLCBzdHJ0b2YgYXBwZWFycyB0byBiZSBicm9rZW4gb3IgZG9lc24ndCBsaW5rOiB1c2Ugd2l0aCBjYXV0aW9uICovCisjaWYgZGVmaW5lZChIQVZFX1NUUlRPRikKKyAgICAgIGNoYXIgKnI7CisgICAgICAqcCA9IHN0cnRvZigoY2hhciopcywgJnIpOworICAgICAgaWYgKCpyKQorI2VsaWYgZGVmaW5lZChIQVZFX1NUUlRPRCkKKyAgICAgIGNoYXIgKnI7CisgICAgICAqcCA9IChmbG9hdClzdHJ0b2QocywgJnIpOworICAgICAgaWYgKCpyKQorI2VuZGlmCisjaWZkZWYgSEFWRV9TU0NBTkYKKyAgICAgICAgaWYgKHNzY2FuZihzLCAiJWciLCBwKSAhPSAxKQorICAgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworI2Vsc2UKKyAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisjZW5kaWYKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIGludCBzb2FwX2lzbnVtZXJpYyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdHlwZSkKK3sgaWYgKHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmZsb2F0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6ZG91YmxlIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6ZGVjaW1hbCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpwb3NpdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpuZWdhdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpub25Qb3NpdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpub25OZWdhdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpsb25nIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6aW50IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6c2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpieXRlIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRMb25nIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRJbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZFNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRCeXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIFNPQVBfRVJSOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorZmxvYXQgKgorU09BUF9GTUFDMgorc29hcF9pbmZsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGZsb2F0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlICE9ICdcMCcgJiYgc29hcF9pc251bWVyaWMoc29hcCwgdHlwZSkpCisgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgcCA9IChmbG9hdCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKGZsb2F0KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKGZsb2F0Kilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKGZsb2F0KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJmbG9hdChzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9kb3VibGUycyhzdHJ1Y3Qgc29hcCAqc29hcCwgZG91YmxlIG4pCit7IGNvbnN0IGNoYXIgKnM7CisgIGlmIChzb2FwX2lzbmFuKG4pKQorICAgIHMgPSAiTmFOIjsKKyAgZWxzZSBpZiAoc29hcF9pc3BpbmZkKG4pKQorICAgIHMgPSAiSU5GIjsKKyAgZWxzZSBpZiAoc29hcF9pc25pbmZkKG4pKQorICAgIHMgPSAiLUlORiI7CisgIGVsc2UKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1Ziwgc29hcC0+ZG91YmxlX2Zvcm1hdCwgbik7CisgICAgcyA9IHNvYXAtPnRtcGJ1ZjsKKyAgfQorICByZXR1cm4gczsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRkb3VibGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBkb3VibGUgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfZG91YmxlMnMoc29hcCwgKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MyZG91YmxlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBkb3VibGUgKnApCit7IGlmIChzKQorICB7IGlmICghKnMpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgaWYgKCFzb2FwX3RhZ19jbXAocywgIklORiIpKQorICAgICAgKnAgPSBEQkxfUElORlRZOworICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAocywgIitJTkYiKSkKKyAgICAgICpwID0gREJMX1BJTkZUWTsKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHMsICItSU5GIikpCisgICAgICAqcCA9IERCTF9OSU5GVFk7CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChzLCAiTmFOIikpCisgICAgICAqcCA9IERCTF9OQU47CisgICAgZWxzZQorICAgIHsKKyNpZmRlZiBIQVZFX1NUUlRPRAorICAgICAgY2hhciAqcjsKKyAgICAgICpwID0gc3RydG9kKHMsICZyKTsKKyAgICAgIGlmICgqcikKKyNlbmRpZgorI2lmZGVmIEhBVkVfU1NDQU5GCisgICAgICAgIGlmIChzc2NhbmYocywgIiVsZyIsIHApICE9IDEpCisgICAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisjZWxzZQorICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyNlbmRpZgorICAgIH0KKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitkb3VibGUgKgorU09BUF9GTUFDMgorc29hcF9pbmRvdWJsZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBkb3VibGUgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUgIT0gJ1wwJyAmJiBzb2FwX2lzbnVtZXJpYyhzb2FwLCB0eXBlKSkKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICBwID0gKGRvdWJsZSopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKGRvdWJsZSksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChkb3VibGUqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YoZG91YmxlKSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJkb3VibGUoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfdW5zaWduZWRCeXRlMnMoc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIGNoYXIgbikKK3sgcmV0dXJuIHNvYXBfdW5zaWduZWRMb25nMnMoc29hcCwgKHVuc2lnbmVkIGxvbmcpbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0dW5zaWduZWRCeXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgdW5zaWduZWQgY2hhciAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF91bnNpZ25lZExvbmcycyhzb2FwLCAodW5zaWduZWQgbG9uZykqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJ1bnNpZ25lZEJ5dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGNoYXIgKnApCit7IGlmIChzKQorICB7IHVuc2lnbmVkIGxvbmcgbjsKKyAgICBjaGFyICpyOworICAgIG4gPSBzb2FwX3N0cnRvdWwocywgJnIsIDEwKTsKKyAgICBpZiAocyA9PSByIHx8ICpyIHx8IG4gPiAyNTUpCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICAqcCA9ICh1bnNpZ25lZCBjaGFyKW47CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordW5zaWduZWQgY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX2ludW5zaWduZWRCeXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIGNoYXIgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkQnl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9ICh1bnNpZ25lZCBjaGFyKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YodW5zaWduZWQgY2hhciksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9ICh1bnNpZ25lZCBjaGFyKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMnVuc2lnbmVkQnl0ZShzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF91bnNpZ25lZFNob3J0MnMoc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIHNob3J0IG4pCit7IHJldHVybiBzb2FwX3Vuc2lnbmVkTG9uZzJzKHNvYXAsICh1bnNpZ25lZCBsb25nKW4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHVuc2lnbmVkU2hvcnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCB1bnNpZ25lZCBzaG9ydCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF91bnNpZ25lZExvbmcycyhzb2FwLCAodW5zaWduZWQgbG9uZykqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJ1bnNpZ25lZFNob3J0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBzaG9ydCAqcCkKK3sgaWYgKHMpCisgIHsgdW5zaWduZWQgbG9uZyBuOworICAgIGNoYXIgKnI7CisgICAgbiA9IHNvYXBfc3RydG91bChzLCAmciwgMTApOworICAgIGlmIChzID09IHIgfHwgKnIgfHwgbiA+IDY1NTM1KQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgKnAgPSAodW5zaWduZWQgc2hvcnQpbjsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit1bnNpZ25lZCBzaG9ydCAqCitTT0FQX0ZNQUMyCitzb2FwX2ludW5zaWduZWRTaG9ydChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB1bnNpZ25lZCBzaG9ydCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRTaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkQnl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9ICh1bnNpZ25lZCBzaG9ydCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKHVuc2lnbmVkIHNob3J0Kilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJ1bnNpZ25lZFNob3J0KHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3Vuc2lnbmVkSW50MnMoc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIGludCBuKQoreyByZXR1cm4gc29hcF91bnNpZ25lZExvbmcycyhzb2FwLCAodW5zaWduZWQgbG9uZyluKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXR1bnNpZ25lZEludChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIGludCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF91bnNpZ25lZExvbmcycyhzb2FwLCAodW5zaWduZWQgbG9uZykqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJ1bnNpZ25lZEludChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50ICpwKQoreyBpZiAocykKKyAgeyBjaGFyICpyOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgc29hcF9yZXNldF9lcnJubzsKKyNlbmRpZgorI2VuZGlmCisgICAgKnAgPSAodW5zaWduZWQgaW50KXNvYXBfc3RydG91bChzLCAmciwgMTApOworICAgIGlmICgocyA9PSByICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkgfHwgKnIKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICB8fCBzb2FwX2Vycm5vID09IFNPQVBfRVJBTkdFCisjZW5kaWYKKyNlbmRpZgorICAgICkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3Vuc2lnbmVkIGludCAqCitTT0FQX0ZNQUMyCitzb2FwX2ludW5zaWduZWRJbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgdW5zaWduZWQgaW50ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkU2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAodW5zaWduZWQgaW50Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YodW5zaWduZWQgaW50KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKHVuc2lnbmVkIGludCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZih1bnNpZ25lZCBpbnQpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMnVuc2lnbmVkSW50KHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3Vuc2lnbmVkTG9uZzJzKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBsb25nIG4pCit7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiJWx1Iiwgbik7CisgIHJldHVybiBzb2FwLT50bXBidWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0dW5zaWduZWRMb25nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgdW5zaWduZWQgbG9uZyAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF91bnNpZ25lZExvbmcycyhzb2FwLCAqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJ1bnNpZ25lZExvbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGxvbmcgKnApCit7IGlmIChzKQorICB7IGNoYXIgKnI7CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBzb2FwX3Jlc2V0X2Vycm5vOworI2VuZGlmCisjZW5kaWYKKyAgICAqcCA9IHNvYXBfc3RydG91bChzLCAmciwgMTApOworICAgIGlmICgocyA9PSByICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkgfHwgKnIKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICB8fCBzb2FwX2Vycm5vID09IFNPQVBfRVJBTkdFCisjZW5kaWYKKyNlbmRpZgorICAgICkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3Vuc2lnbmVkIGxvbmcgKgorU09BUF9GTUFDMgorc29hcF9pbnVuc2lnbmVkTG9uZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB1bnNpZ25lZCBsb25nICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkU2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAodW5zaWduZWQgbG9uZyopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAodW5zaWduZWQgbG9uZyopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZih1bnNpZ25lZCBsb25nKSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJ1bnNpZ25lZExvbmcoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfVUxPTkc2NDJzKHN0cnVjdCBzb2FwICpzb2FwLCBVTE9ORzY0IG4pCit7IHNwcmludGYoc29hcC0+dG1wYnVmLCBTT0FQX1VMT05HX0ZPUk1BVCwgbik7CisgIHJldHVybiBzb2FwLT50bXBidWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0VUxPTkc2NChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IFVMT05HNjQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfVUxPTkc2NDJzKHNvYXAsICpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMlVMT05HNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIFVMT05HNjQgKnApCit7IGlmIChzKQorICB7CisjaWZkZWYgSEFWRV9TVFJUT1VMTAorICAgIGNoYXIgKnI7CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBzb2FwX3Jlc2V0X2Vycm5vOworI2VuZGlmCisjZW5kaWYKKyAgICAqcCA9IHN0cnRvdWxsKHMsICZyLCAxMCk7CisgICAgaWYgKChzID09IHIgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKSB8fCAqcgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICAgfHwgc29hcF9lcnJubyA9PSBTT0FQX0VSQU5HRQorI2VuZGlmCisjZW5kaWYKKyAgICAgICkKKyNlbHNlCisjIGlmZGVmIEhBVkVfU1NDQU5GCisgICAgaWYgKHNzY2FuZihzLCBTT0FQX1VMT05HX0ZPUk1BVCwgcCkgIT0gMSkKKyMgZW5kaWYKKyNlbmRpZgorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorVUxPTkc2NCAqCitTT0FQX0ZNQUMyCitzb2FwX2luVUxPTkc2NChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBVTE9ORzY0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnBvc2l0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOm5vbk5lZ2F0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkTG9uZyIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkSW50IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRTaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkQnl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisgIHAgPSAoVUxPTkc2NCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKFVMT05HNjQpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAoVUxPTkc2NCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihVTE9ORzY0KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJVTE9ORzY0KHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMnN0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgY2hhciAqKnQpCit7ICp0ID0gTlVMTDsKKyAgaWYgKHMpCisgIHsgaWYgKCEoKnQgPSBzb2FwX3N0cmR1cChzb2FwLCBzKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICBpZiAoIShzb2FwLT5tb2RlICYgKFNPQVBfRU5DX0xBVElOIHwgU09BUF9DX1VURlNUUklORykpKQorICAgIHsgLyogVE9ETzogY29uc2lkZXIgdHJ1bmNhdGluZyBVVEY4IHRvIEFTQ0lJIGZvciByZWd1bGFyIFhNTCBhdHRyaWJ1dGUgc3RyaW5ncz8gKi8KKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MyUU5hbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGNoYXIgKip0KQoreyBpZiAocykKKyAgeyBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnA7CisgICAgY29uc3QgY2hhciAqcDsKKyAgICBpZiAoIXN0cm5jbXAocywgInhtbDoiLCA0KSkKKyAgICB7ICp0ID0gc29hcF9zdHJkdXAoc29hcCwgcyk7CisgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICB9CisgICAgbnAgPSBzb2FwLT5ubGlzdDsKKyAgICBwID0gc3RyY2hyKHMsICc6Jyk7CisgICAgaWYgKHApCisgICAgeyByZWdpc3RlciBpbnQgbiA9IHAgLSBzOworICAgICAgd2hpbGUgKG5wICYmIChzdHJuY21wKG5wLT5pZCwgcywgbikgfHwgbnAtPmlkW25dKSkKKyAgICAgICAgbnAgPSBucC0+bmV4dDsKKyAgICAgIHArKzsKKyAgICB9CisgICAgZWxzZQorICAgIHsgd2hpbGUgKG5wICYmICpucC0+aWQpCisgICAgICAgIG5wID0gbnAtPm5leHQ7CisgICAgICBwID0gczsKKyAgICB9CisgICAgaWYgKG5wKQorICAgIHsgaWYgKG5wLT5pbmRleCA+PSAwICYmIHNvYXAtPmxvY2FsX25hbWVzcGFjZXMpCisgICAgICB7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnEgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW25wLT5pbmRleF0uaWQ7CisgICAgICAgIGlmIChxKQorICAgICAgICB7IGlmICgoKnQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc3RybGVuKHApICsgc3RybGVuKHEpICsgMikpKQorICAgICAgICAgICAgc3ByaW50ZigqdCwgIiVzOiVzIiwgcSwgcCk7CisgICAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChucC0+bnMpCisgICAgICB7IGlmICgoKnQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc3RybGVuKHApICsgc3RybGVuKG5wLT5ucykgKyA0KSkpCisgICAgICAgICAgc3ByaW50ZigqdCwgIlwiJXNcIjolcyIsIG5wLT5ucywgcCk7CisgICAgICAgIHJldHVybiBTT0FQX09LOworICAgICAgfQorICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJOYW1lc3BhY2UgcHJlZml4IG9mICclcycgbm90IGRlZmluZWQgKGluZGV4PSVkLCBVUkk9JXMpXG4iLCBzLCBucC0+aW5kZXgsIG5wLT5ucz9ucC0+bnM6IiIpKTsKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTkFNRVNQQUNFOyAKKyAgICB9CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJOYW1lc3BhY2UgcHJlZml4IG9mICclcycgbm90IGRlZmluZWQsIGFzc3VtaW5nIGVtcHR5IG5hbWVzcGFjZVxuIiwgcykpOworICAgIGlmICgoKnQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc3RybGVuKHApICsgNCkpKQorICAgICAgc3ByaW50ZigqdCwgIlwiXCI6JXMiLCBwKTsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9RTmFtZTJzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzKQoreyBzdHJ1Y3QgTmFtZXNwYWNlICpwOworICBjaGFyICp0OworICBpbnQgbjsKKyAgaWYgKCFzIHx8ICpzICE9ICciJykKKyAgeworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBpZiAocyAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkpCisgICAgeyB0ID0gKGNoYXIqKXN0cmNocihzLCAnOicpOworICAgICAgaWYgKHQpCisgICAgICAgIHNvYXBfdXRpbGl6ZV9ucyhzb2FwLCBzLCB0IC0gcyk7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIHM7CisgIH0KKyAgcysrOworICBpZiAoKHAgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzKSkKKyAgeyBmb3IgKDsgcC0+aWQ7IHArKykKKyAgICB7IGlmIChwLT5ucykKKyAgICAgICAgaWYgKCFzb2FwX3RhZ19jbXAocywgcC0+bnMpKQorICAgICAgICAgIGJyZWFrOworICAgICAgaWYgKHAtPmluKQorICAgICAgICBpZiAoIXNvYXBfdGFnX2NtcChzLCBwLT5pbikpCisgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChwICYmIHAtPmlkKQorICAgIHsgcyA9IHN0cmNocihzLCAnIicpOworICAgICAgaWYgKHMpCisgICAgICB7IHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc3RybGVuKHAtPmlkKSArIHN0cmxlbihzKSk7CisgICAgICAgIHN0cmNweSh0LCBwLT5pZCk7CisJc3RyY2F0KHQsIHMgKyAxKTsKKyAgICAgICAgcmV0dXJuIHQ7CisgICAgICB9CisgICAgfQorICB9CisgIHQgPSAoY2hhciopc3RyY2hyKHMsICciJyk7CisgIGlmICh0KQorICAgIG4gPSB0IC0gczsKKyAgZWxzZQorICAgIG4gPSAwOworICB0ID0gc29hcF9zdHJkdXAoc29hcCwgcyk7CisgIHRbbl0gPSAnXDAnOworICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgInhtbG5zOl8lZCIsIHNvYXAtPmlkbnVtKyspOworICBzb2FwX3NldF9hdHRyKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgdCk7CisgIHMgPSBzdHJjaHIocywgJyInKTsKKyAgaWYgKHMpCisgIHsgdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzdHJsZW4oc29hcC0+dG1wYnVmKSArIHN0cmxlbihzKSAtIDYpOworICAgIHN0cmNweSh0LCBzb2FwLT50bXBidWYgKyA2KTsKKyAgICBzdHJjYXQodCwgcyArIDEpOworICB9CisgIHJldHVybiB0OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3Myd2NoYXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHdjaGFyX3QgKip0KQoreyB3Y2hhcl90ICpyOworICBpZiAoIXMpCisgICAgKnQgPSBOVUxMOworICBlbHNlCisgIHsgKnQgPSByID0gKHdjaGFyX3QqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZih3Y2hhcl90KSAqIChzdHJsZW4ocykgKyAxKSk7CisgICAgaWYgKCFyKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTEFUSU4pCisgICAgeyB3aGlsZSAoKnMpCisgICAgICAgICpyKysgPSAod2NoYXJfdCkqcysrOworICAgIH0KKyAgICBlbHNlCisgICAgeyAvKiBDb252ZXJ0IFVURjggdG8gd2NoYXIgKi8KKyAgICAgIHdoaWxlICgqcykKKyAgICAgIHsgcmVnaXN0ZXIgc29hcF93Y2hhciBjLCBjMSwgYzIsIGMzLCBjNDsKKyAgICAgICAgYyA9ICpzKys7CisgICAgICAgIGlmIChjIDwgMHg4MCkKKwkgICpyKysgPSAod2NoYXJfdCljOworCWVsc2UKKyAgICAgICAgeyBjMSA9IChzb2FwX3djaGFyKSpzKysgJiAweDNGOworICAgICAgICAgIGlmIChjIDwgMHhFMCkKKyAgICAgICAgICAgICpyKysgPSAod2NoYXJfdCkoKChzb2FwX3djaGFyKShjICYgMHgxRikgPDwgNikgfCBjMSk7CisgICAgICAgICAgZWxzZQorCSAgeyBjMiA9IChzb2FwX3djaGFyKSpzKysgJiAweDNGOworICAgICAgICAgICAgaWYgKGMgPCAweEYwKQorICAgICAgICAgICAgICAqcisrID0gKHdjaGFyX3QpKCgoc29hcF93Y2hhcikoYyAmIDB4MEYpIDw8IDEyKSB8IChjMSA8PCA2KSB8IGMyKTsKKyAgICAgICAgICAgIGVsc2UKKwkgICAgeyBjMyA9IChzb2FwX3djaGFyKSpzKysgJiAweDNGOworICAgICAgICAgICAgICBpZiAoYyA8IDB4RjgpCisgICAgICAgICAgICAgICAgKnIrKyA9ICh3Y2hhcl90KSgoKHNvYXBfd2NoYXIpKGMgJiAweDA3KSA8PCAxOCkgfCAoYzEgPDwgMTIpIHwgKGMyIDw8IDYpIHwgYzMpOworICAgICAgICAgICAgICBlbHNlCisJICAgICAgeyBjNCA9IChzb2FwX3djaGFyKSpzKysgJiAweDNGOworICAgICAgICAgICAgICAgIGlmIChjIDwgMHhGQykKKyAgICAgICAgICAgICAgICAgICpyKysgPSAod2NoYXJfdCkoKChzb2FwX3djaGFyKShjICYgMHgwMykgPDwgMjQpIHwgKGMxIDw8IDE4KSB8IChjMiA8PCAxMikgfCAoYzMgPDwgNikgfCBjNCk7CisgICAgICAgICAgICAgICAgZWxzZQorCQkgICpyKysgPSAod2NoYXJfdCkoKChzb2FwX3djaGFyKShjICYgMHgwMSkgPDwgMzApIHwgKGMxIDw8IDI0KSB8IChjMiA8PCAxOCkgfCAoYzMgPDwgMTIpIHwgKGM0IDw8IDYpIHwgKHNvYXBfd2NoYXIpKCpzKysgJiAweDNGKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgKnIgPSBMJ1wwJzsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3djaGFyMnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHdjaGFyX3QgKnMpCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgcmVnaXN0ZXIgY2hhciAqciwgKnQ7CisgIGNvbnN0IHdjaGFyX3QgKnEgPSBzOworICBzaXplX3QgbiA9IDA7CisgIHdoaWxlICgoYyA9ICpxKyspKQorICB7IGlmIChjID4gMCAmJiBjIDwgMHg4MCkKKyAgICAgIG4rKzsKKyAgICBlbHNlCisgICAgICBuICs9IDY7CisgIH0KKyAgciA9IHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgbiArIDEpOworICBpZiAocikKKyAgeyAvKiBDb252ZXJ0IHdjaGFyIHRvIFVURjggKi8KKyAgICB3aGlsZSAoKGMgPSAqcysrKSkKKyAgICB7IGlmIChjID4gMCAmJiBjIDwgMHg4MCkKKyAgICAgICAgKnQrKyA9IChjaGFyKWM7CisgICAgICBlbHNlCisgICAgICB7IGlmIChjIDwgMHgwODAwKQorICAgICAgICAgICp0KysgPSAoY2hhcikoMHhDMCB8ICgoYyA+PiA2KSAmIDB4MUYpKTsKKyAgICAgICAgZWxzZQorICAgICAgICB7IGlmIChjIDwgMHgwMTAwMDApCisgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RTAgfCAoKGMgPj4gMTIpICYgMHgwRikpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7IGlmIChjIDwgMHgyMDAwMDApCisgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhGMCB8ICgoYyA+PiAxOCkgJiAweDA3KSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7IGlmIChjIDwgMHgwNDAwMDAwMCkKKyAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjggfCAoKGMgPj4gMjQpICYgMHgwMykpOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsgKnQrKyA9IChjaGFyKSgweEZDIHwgKChjID4+IDMwKSAmIDB4MDEpKTsKKyAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMjQpICYgMHgzRikpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAxOCkgJiAweDNGKSk7CisgICAgICAgICAgICB9ICAgICAKKyAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAxMikgJiAweDNGKSk7CisgICAgICAgICAgfQorICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpKTsKKyAgICAgICAgfQorICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoYyAmIDB4M0YpKTsKKyAgICAgIH0KKyAgICB9CisgICAgKnQgPSAnXDAnOworICB9CisgIHJldHVybiByOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHN0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNoYXIgKmNvbnN0KnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKSAKK3sgaWQgPSBzb2FwX2VsZW1lbnRfaWQoc29hcCwgdGFnLCBpZCwgKnAsIE5VTEwsIDAsIHR5cGUsIG4pOworICBpZiAoaWQgPCAwCisgICB8fCBzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgaWQsIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgKnAsIDApCisgICB8fCBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoqCitTT0FQX0ZNQUMyCitzb2FwX2luc3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGNoYXIgKipwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCwgaW50IGZsYWcsIGxvbmcgbWlubGVuLCBsb25nIG1heGxlbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDEpKQorICB7IGlmICghdGFnIHx8ICp0YWcgIT0gJy0nIHx8IHNvYXAtPmVycm9yICE9IFNPQVBfTk9fVEFHKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICB9CisgIGlmICghcCkKKyAgICBpZiAoIShwID0gKGNoYXIqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2YoY2hhciopKSkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgaWYgKHNvYXAtPmJvZHkpCisgIHsgKnAgPSBzb2FwX3N0cmluZ19pbihzb2FwLCBmbGFnLCBtaW5sZW4sIG1heGxlbik7CisgICAgaWYgKCEqcCB8fCAhKGNoYXIqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsICpwLCB0LCBzaXplb2YoY2hhciopLCAwLCBOVUxMLCBOVUxMLCBOVUxMKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGVsc2UgaWYgKHNvYXAtPm51bGwpCisgICAgKnAgPSBOVUxMOworICBlbHNlCisgICAgKnAgPSAoY2hhciopU09BUF9TVFJfRU9TOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChjaGFyKiopc29hcF9pZF9sb29rdXAoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilwLCB0LCBzaXplb2YoY2hhcioqKSwgMCk7CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0d3N0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIHdjaGFyX3QgKmNvbnN0KnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKSAKK3sgaWQgPSBzb2FwX2VsZW1lbnRfaWQoc29hcCwgdGFnLCBpZCwgKnAsIE5VTEwsIDAsIHR5cGUsIG4pOworICBpZiAoaWQgPCAwCisgICB8fCBzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgaWQsIHR5cGUpCisgICB8fCBzb2FwX3dzdHJpbmdfb3V0KHNvYXAsICpwLCAwKQorICAgfHwgc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit3Y2hhcl90ICoqCitTT0FQX0ZNQUMyCitzb2FwX2lud3N0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB3Y2hhcl90ICoqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQsIGxvbmcgbWlubGVuLCBsb25nIG1heGxlbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDEpKQorICB7IGlmICghdGFnIHx8ICp0YWcgIT0gJy0nIHx8IHNvYXAtPmVycm9yICE9IFNPQVBfTk9fVEFHKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICB9CisgIGlmICghcCkKKyAgICBpZiAoIShwID0gKHdjaGFyX3QqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yod2NoYXJfdCopKSkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgaWYgKHNvYXAtPmJvZHkpCisgIHsgKnAgPSBzb2FwX3dzdHJpbmdfaW4oc29hcCwgMSwgbWlubGVuLCBtYXhsZW4pOworICAgIGlmICghKnAgfHwgISh3Y2hhcl90Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCAqcCwgdCwgc2l6ZW9mKHdjaGFyX3QqKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBlbHNlIGlmIChzb2FwLT5udWxsKQorICAgICpwID0gTlVMTDsKKyAgZWxzZQorICAgICpwID0gKHdjaGFyX3QqKVNPQVBfU1RSX0VPUzsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAod2NoYXJfdCoqKXNvYXBfaWRfbG9va3VwKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopcCwgdCwgc2l6ZW9mKHdjaGFyX3QqKiksIDApOworICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgdGltZV90Citzb2FwX3RpbWVnbShzdHJ1Y3QgdG0gKlQpCit7CisjaWYgZGVmaW5lZChIQVZFX1RJTUVHTSkKKyAgcmV0dXJuIHRpbWVnbShUKTsKKyNlbHNlCisgIHRpbWVfdCB0LCBnLCB6OworI2lmZGVmIEhBVkVfR01USU1FX1IKKyAgc3RydWN0IHRtIHRtLCAqdG1wID0gJnRtOworI2Vsc2UKKyAgc3RydWN0IHRtICp0bXA7CisjZW5kaWYKKyAgdCA9IG1rdGltZShUKTsKKyAgaWYgKHQgPT0gLTEpCisgICAgcmV0dXJuIC0xOworI2lmZGVmIEhBVkVfR01USU1FX1IKKyAgZ210aW1lX3IoJnQsIHRtcCk7CisjZWxzZQorICB0bXAgPSBnbXRpbWUoJnQpOworI2VuZGlmCisgIHRtcC0+dG1faXNkc3QgPSAwOworICBnID0gbWt0aW1lKHRtcCk7CisgIGlmIChnID09IC0xKQorICAgIHJldHVybiAtMTsKKyAgeiA9IGcgLSB0OworICByZXR1cm4gdCAtIHo7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2RhdGVUaW1lMnMoc3RydWN0IHNvYXAgKnNvYXAsIHRpbWVfdCBuKQoreyBzdHJ1Y3QgdG0gVCwgKnBUID0gJlQ7CisjaWYgZGVmaW5lZChIQVZFX0dNVElNRV9SKQorICBpZiAoZ210aW1lX3IoJm4sIHBUKSkKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVNaIiwgcFQpOworICAvKiBUaGUgZm9sbG93aW5nIGRlZmluZXMgd2VyZSBhZGRlZCBmb3IgVnhXb3JrcyovCisjZWxpZiBkZWZpbmVkKEhBVkVfUEdNVElNRV9SKQorICBpZiAoZ210aW1lX3IoJm4sIHBUKSkKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVNaIiwgcFQpOworI2VsaWYgZGVmaW5lZChIQVZFX1BHTVRJTUUpCisgIGlmIChnbXRpbWUoJm4sIHBUKSkKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVNaIiwgcFQpOworI2VsaWYgZGVmaW5lZChIQVZFX0dNVElNRSkKKyAgaWYgKChwVCA9IGdtdGltZSgmbikpKQorICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolU1oiLCBwVCk7CisjZWxpZiBkZWZpbmVkKEhBVkVfR0VUVElNRU9GREFZKQorICBzdHJ1Y3QgdGltZXpvbmUgdHo7CisgIG1lbXNldCgodm9pZCopJnR6LCAwLCBzaXplb2YodHopKTsKKyMgaWYgZGVmaW5lZChIQVZFX0xPQ0FMVElNRV9SKQorICBpZiAobG9jYWx0aW1lX3IoJm4sIHBUKSkKKyAgeyBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICBnZXR0aW1lb2ZkYXkoJnR2LCAmdHopOworICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIHN0cmxlbihzb2FwLT50bXBidWYpLCAiJSswM2Q6JTAyZCIsIC10ei50el9taW51dGVzd2VzdC82MCsocFQtPnRtX2lzZHN0IT0wKSwgYWJzKHR6LnR6X21pbnV0ZXN3ZXN0KSU2MCk7CisgIH0KKyMgZWxzZQorICBpZiAoKHBUID0gbG9jYWx0aW1lKCZuKSkpCisgIHsgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgZ2V0dGltZW9mZGF5KCZ0diwgJnR6KTsKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwVCk7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYgKyBzdHJsZW4oc29hcC0+dG1wYnVmKSwgIiUrMDNkOiUwMmQiLCAtdHoudHpfbWludXRlc3dlc3QvNjArKHBULT50bV9pc2RzdCE9MCksIGFicyh0ei50el9taW51dGVzd2VzdCklNjApOworICB9CisjZW5kaWYKKyNlbGlmIGRlZmluZWQoSEFWRV9GVElNRSkKKyAgc3RydWN0IHRpbWViIHQ7CisgIG1lbXNldCgodm9pZCopJnQsIDAsIHNpemVvZih0KSk7CisjIGlmIGRlZmluZWQoSEFWRV9MT0NBTFRJTUVfUikKKyAgaWYgKGxvY2FsdGltZV9yKCZuLCBwVCkpCisgIHsgZnRpbWUoJnQpOworICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIHN0cmxlbihzb2FwLT50bXBidWYpLCAiJSswM2Q6JTAyZCIsIC10LnRpbWV6b25lLzYwKyhwVC0+dG1faXNkc3QhPTApLCBhYnModC50aW1lem9uZSklNjApOworICB9CisgIC8qIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyB3ZXJlIGFkZGVkIGZvciBWeFdvcmtzKi8KKyMgZWxpZiBkZWZpbmVkKEhBVkVfUExPQ0FMVElNRV9SKQorICBpZiAobG9jYWx0aW1lX3IoJm4sIHBUKSkKKyAgeyBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwVCk7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYrc3RybGVuKHNvYXAtPnRtcGJ1ZiksICIlKzAzZDolMDJkIiwgdC50aW1lem9uZS82MCwgYWJzKHQudGltZXpvbmUpJTYwKTsKKyAgfQorIyBlbHNlCisgIGlmICgocFQgPSBsb2NhbHRpbWUoJm4pKSkKKyAgeyBmdGltZSgmdCk7CisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmICsgc3RybGVuKHNvYXAtPnRtcGJ1ZiksICIlKzAzZDolMDJkIiwgLXQudGltZXpvbmUvNjArKHBULT50bV9pc2RzdCE9MCksIGFicyh0LnRpbWV6b25lKSU2MCk7CisgIH0KKyMgZW5kaWYKKyNlbGlmIGRlZmluZWQoSEFWRV9MT0NBTFRJTUVfUikKKyAgaWYgKGxvY2FsdGltZV9yKCZuLCBwVCkpCisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworICAvKiBUaGUgZm9sbG93aW5nIGRlZmluZXMgd2VyZSBhZGRlZCBmb3IgVnhXb3JrcyovCisjZWxpZiBkZWZpbmVkKEhBVkVfUExPQ0FMVElNRV9SKQorICBpZiAobG9jYWx0aW1lX3IoJm4sIHBUKSkKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwVCk7CisjZWxzZQorICBpZiAoKHBUID0gbG9jYWx0aW1lKCZuKSkpCisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworI2VuZGlmCisgIGVsc2UKKyAgICBzdHJjcHkoc29hcC0+dG1wYnVmLCAiMTk2OS0xMi0zMVQyMzo1OTo1OVoiKTsKKyAgcmV0dXJuIHNvYXAtPnRtcGJ1ZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRkYXRlVGltZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHRpbWVfdCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9kYXRlVGltZTJzKHNvYXAsICpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMmRhdGVUaW1lKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCB0aW1lX3QgKnApCit7IGlmIChzKQorICB7IHN0cnVjdCB0bSBUOworICAgIGNoYXIgem9uZVsxNl07CisgICAgY29uc3QgY2hhciAqdDsKKyAgICBtZW1zZXQoKHZvaWQqKSZULCAwLCBzaXplb2YoVCkpOworICAgIHpvbmVbc2l6ZW9mKHpvbmUpLTFdID0gJ1wwJzsKKyAgICBpZiAoc3RyY2hyKHMsICctJykpCisgICAgICB0ID0gIiVkLSVkLSVkVCVkOiVkOiVkJTE1cyI7CisgICAgZWxzZSBpZiAoc3RyY2hyKHMsICc6JykpCisgICAgICB0ID0gIiU0ZCUyZCUyZFQlZDolZDolZCUxNXMiOworICAgIGVsc2UgLyogcGFyc2Ugbm9uLVhTRC1zdGFuZGFyZCBhbHRlcm5hdGl2ZSBJU08gODYwMSBmb3JtYXQgKi8KKyAgICAgIHQgPSAiJTRkJTJkJTJkVCUyZCUyZCUyZCUxNXMiOworICAgIHNzY2FuZihzLCB0LCAmVC50bV95ZWFyLCAmVC50bV9tb24sICZULnRtX21kYXksICZULnRtX2hvdXIsICZULnRtX21pbiwgJlQudG1fc2VjLCB6b25lKTsKKyAgICBpZiAoVC50bV95ZWFyID09IDEpCisgICAgICBULnRtX3llYXIgPSA3MDsKKyAgICBlbHNlCisgICAgICBULnRtX3llYXIgLT0gMTkwMDsKKyAgICBULnRtX21vbi0tOworICAgIGlmICgqem9uZSkKKyAgICB7IGlmICgqem9uZSA9PSAnLicpCisgICAgICB7IGZvciAocyA9IHpvbmUgKyAxOyAqczsgcysrKQorICAgICAgICAgIGlmICgqcyA8ICcwJyB8fCAqcyA+ICc5JykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBzID0gem9uZTsKKyAgICAgIGlmICgqcyA9PSAnKycgfHwgKnMgPT0gJy0nKQorICAgICAgeyBpbnQgaCA9IDAsIG0gPSAwOworICAgICAgICBpZiAoc1szXSA9PSAnOicpCisJeyBzc2NhbmYocywgIiVkOiVkIiwgJmgsICZtKTsKKwkgIGlmIChoIDwgMCkKKwkgICAgbSA9IC1tOworCX0KKwllbHNlCisJeyBtID0gKGludClhdG9sKHMpOworCSAgaCA9IG0gLyAxMDA7CisJICBtID0gbSAlIDEwMDsKKwl9CisgICAgICAgIFQudG1faG91ciAtPSBoOworICAgICAgICBULnRtX21pbiAtPSBtOworICAgICAgfQorICAgICAgVC50bV9pc2RzdCA9IDA7CisgICAgICAqcCA9IHNvYXBfdGltZWdtKCZUKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgVC50bV9pc2RzdCA9IC0xOworICAgICAgKnAgPSBta3RpbWUoJlQpOyAvKiBubyB0aW1lIHpvbmU6IHN1cHBvc2UgaXQgaXMgbG9jYWx0aW1lPyAqLworICAgIH0KKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCit0aW1lX3QgKgorU09BUF9GTUFDMgorc29hcF9pbmRhdGVUaW1lKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHRpbWVfdCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpkYXRlVGltZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisgIHAgPSAodGltZV90Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YodGltZV90KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKHRpbWVfdCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZih0aW1lX3QpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMmRhdGVUaW1lKHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRsaXRlcmFsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGNoYXIgKmNvbnN0KnApCit7IGludCBpOworICBjb25zdCBjaGFyICp0ID0gTlVMTDsKKyAgaWYgKHRhZyAmJiAqdGFnICE9ICctJykKKyAgeyBpZiAoc29hcC0+bG9jYWxfbmFtZXNwYWNlcyAmJiAodCA9IHN0cmNocih0YWcsICc6JykpKQorICAgIHsgc3RybmNweShzb2FwLT50bXBidWYsIHRhZywgdC10YWcpOworICAgICAgc29hcC0+dG1wYnVmW3QtdGFnXSA9ICdcMCc7CisgICAgICBmb3IgKGkgPSAwOyBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW2ldLmlkOyBpKyspCisgICAgICAgIGlmICghc3RyY21wKHNvYXAtPnRtcGJ1Ziwgc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tpXS5pZCkpCisgICAgICAgICAgYnJlYWs7CisgICAgICB0Kys7CisgICAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIjwlcyB4bWxucz1cIiVzXCI+IiwgdCwgc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tpXS5ucyA/IHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0ubnMgOiBTT0FQX1NUUl9FT1MpOworICAgIH0KKyAgICBlbHNlCisgICAgeyB0ID0gdGFnOworICAgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICI8JXM+IiwgdGFnKTsKKyAgICB9CisgICAgaWYgKHNvYXBfc2VuZChzb2FwLCBzb2FwLT50bXBidWYpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmIChwICYmICpwKQorICB7IGlmIChzb2FwX3NlbmQoc29hcCwgKnApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmICh0KQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiPC8lcz4iLCB0KTsKKyAgICByZXR1cm4gc29hcF9zZW5kKHNvYXAsIHNvYXAtPnRtcGJ1Zik7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoqCitTT0FQX0ZNQUMyCitzb2FwX2lubGl0ZXJhbChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBjaGFyICoqcCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDEpKQorICB7IGlmIChzb2FwLT5lcnJvciAhPSBTT0FQX05PX1RBRyB8fCBzb2FwX3VuZ2V0KHNvYXAsIHNvYXBfZ2V0KHNvYXApKSA9PSBTT0FQX1RUKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICB9CisgIGlmICghcCkKKyAgICBpZiAoIShwID0gKGNoYXIqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2YoY2hhciopKSkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgaWYgKHNvYXAtPmJvZHkpCisgICAgKnAgPSBzb2FwX3N0cmluZ19pbihzb2FwLCAwLCAtMSwgLTEpOworICBlbHNlIGlmIChzb2FwLT5udWxsKQorICAgICpwID0gTlVMTDsKKyAgZWxzZQorICAgICpwID0gKGNoYXIqKVNPQVBfU1RSX0VPUzsKKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXR3bGl0ZXJhbChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB3Y2hhcl90ICpjb25zdCpwKQoreyBpbnQgaTsKKyAgY29uc3QgY2hhciAqdCA9IE5VTEw7CisgIHdjaGFyX3QgYzsKKyAgY29uc3Qgd2NoYXJfdCAqczsKKyAgaWYgKHRhZyAmJiAqdGFnICE9ICctJykKKyAgeyBpZiAoc29hcC0+bG9jYWxfbmFtZXNwYWNlcyAmJiAodCA9IHN0cmNocih0YWcsICc6JykpKQorICAgIHsgc3RybmNweShzb2FwLT50bXBidWYsIHRhZywgdC10YWcpOworICAgICAgc29hcC0+dG1wYnVmW3QtdGFnXSA9ICdcMCc7CisgICAgICBmb3IgKGkgPSAwOyBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW2ldLmlkOyBpKyspCisgICAgICAgIGlmICghc3RyY21wKHNvYXAtPnRtcGJ1Ziwgc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tpXS5pZCkpCisgICAgICAgICAgYnJlYWs7CisgICAgICB0Kys7CisgICAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIjwlcyB4bWxucz1cIiVzXCI+IiwgdCwgc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tpXS5ucyA/IHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0ubnMgOiBTT0FQX1NUUl9FT1MpOworICAgIH0KKyAgICBlbHNlCisgICAgeyB0ID0gdGFnOworICAgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICI8JXM+IiwgdGFnKTsKKyAgICB9CisgICAgaWYgKHNvYXBfc2VuZChzb2FwLCBzb2FwLT50bXBidWYpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmIChwKQorICB7IHMgPSAqcDsKKyAgICB3aGlsZSAoKGMgPSAqcysrKSkKKyAgICAgIGlmIChzb2FwX3B1dHV0Zjgoc29hcCwgKHVuc2lnbmVkIGNoYXIpYykpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAodCkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIjwvJXM+IiwgdCk7CisgICAgcmV0dXJuIHNvYXBfc2VuZChzb2FwLCBzb2FwLT50bXBidWYpOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit3Y2hhcl90ICoqCitTT0FQX0ZNQUMyCitzb2FwX2lud2xpdGVyYWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgd2NoYXJfdCAqKnApCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAxKSkKKyAgeyBpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9OT19UQUcgfHwgc29hcF91bmdldChzb2FwLCBzb2FwX2dldChzb2FwKSkgPT0gU09BUF9UVCkKKyAgICAgIHJldHVybiBOVUxMOworICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgfQorICBpZiAoIXApCisgICAgaWYgKCEocCA9ICh3Y2hhcl90Kiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHdjaGFyX3QqKSkpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIGlmIChzb2FwLT5ib2R5KQorICAgICpwID0gc29hcF93c3RyaW5nX2luKHNvYXAsIDAsIC0xLCAtMSk7CisgIGVsc2UgaWYgKHNvYXAtPm51bGwpCisgICAgKnAgPSBOVUxMOworICBlbHNlCisgICAgKnAgPSAod2NoYXJfdCopU09BUF9TVFJfRU9TOworICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfdG9rZW4oc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNpemVfdCBpOworICByZWdpc3RlciBzb2FwX3djaGFyIGMgPSAwOworICByZWdpc3RlciBjaGFyICpzID0gc29hcC0+dG1wYnVmOworICBpZiAoIXNvYXAtPmJvZHkpCisgICAgcmV0dXJuIFNPQVBfU1RSX0VPUzsKKyAgZG8gYyA9IHNvYXBfZ2V0KHNvYXApOworICB3aGlsZSAoc29hcF9ibGFuayhjKSk7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc29hcC0+dG1wYnVmKSAtIDE7IGkrKykKKyAgeyBpZiAoYyA9PSBTT0FQX1RUIHx8IChpbnQpYyA9PSBFT0YgfHwgc29hcF9ibGFuayhjKSkKKyAgICAgIGJyZWFrOworICAgICpzKysgPSAoY2hhciljOworICAgIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgfQorICBpZiAoKGludCljID09IEVPRiB8fCBjID09IFNPQVBfVFQpCisgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgKnMgPSAnXDAnOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVsZW1lbnQgY29udGVudCB2YWx1ZT0nJXMnXG4iLCBzb2FwLT50bXBidWYpKTsKKyAgcmV0dXJuIHNvYXAtPnRtcGJ1ZjsgLyogcmV0dXJuIG5vbi1udWxsIHBvaW50ZXIgKi8KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIgKgorU09BUF9GTUFDMgorc29hcF92YWx1ZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc2l6ZV90IGk7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IDA7CisgIHJlZ2lzdGVyIGNoYXIgKnMgPSBzb2FwLT50bXBidWY7CisgIGlmICghc29hcC0+Ym9keSkKKyAgICByZXR1cm4gU09BUF9TVFJfRU9TOworICBkbyBjID0gc29hcF9nZXQoc29hcCk7CisgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZihzb2FwLT50bXBidWYpIC0gMTsgaSsrKQorICB7IGlmIChjID09IFNPQVBfVFQgfHwgKGludCljID09IEVPRikKKyAgICAgIGJyZWFrOworICAgICpzKysgPSAoY2hhciljOworICAgIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgfQorICBmb3IgKHMtLTsgaSA+IDA7IGktLSwgcy0tKQorICAgIGlmICghc29hcF9ibGFuaygqcykpCisgICAgICBicmVhazsKKyAgc1sxXSA9ICdcMCc7CisgIGlmICgoaW50KWMgPT0gRU9GIHx8IGMgPT0gU09BUF9UVCkKKyAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVsZW1lbnQgY29udGVudCB2YWx1ZT0nJXMnXG4iLCBzb2FwLT50bXBidWYpKTsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgICBzb2FwLT5kb20tPmRhdGEgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT50bXBidWYpOworI2VuZGlmCisgIHJldHVybiBzb2FwLT50bXBidWY7IC8qIHJldHVybiBub24tbnVsbCBwb2ludGVyICovCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAhZGVmaW5lZChXSVRIX0xFQU5FUikgfHwgIWRlZmluZWQoV0lUSF9OT0hUVFApCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldGxpbmUoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnMsIGludCBsZW4pCit7IGludCBpID0gbGVuOworICBzb2FwX3djaGFyIGMgPSAwOworICBmb3IgKDs7KQorICB7IHdoaWxlICgtLWkgPiAwKQorICAgIHsgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgICAgIGlmIChjID09ICdccicgfHwgYyA9PSAnXG4nKQorICAgICAgICBicmVhazsKKyAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAgICpzKysgPSAoY2hhciljOworICAgIH0KKyAgICBpZiAoYyAhPSAnXG4nKQorICAgICAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsgLyogZ290IFxyLCBub3cgZ2V0IFxuICovCisgICAgaWYgKGMgPT0gJ1xuJykKKyAgICB7ICpzID0gJ1wwJzsKKyAgICAgIGlmIChpKzEgPT0gbGVuKSAvKiBlbXB0eSBsaW5lOiBlbmQgb2YgSFRUUC9NSU1FIGhlYWRlciAqLworICAgICAgICBicmVhazsKKyAgICAgIGMgPSBzb2FwX3VuZ2V0KHNvYXAsIHNvYXBfZ2V0Y2hhcihzb2FwKSk7CisgICAgICBpZiAoYyAhPSAnICcgJiYgYyAhPSAnXHQnKSAvKiBIVFRQIGxpbmUgY29udGludWF0aW9uPyAqLworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZWxzZSBpZiAoKGludCljID09IEVPRikKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc2l6ZV90Citzb2FwX2NvdW50X2F0dGFjaG1lbnRzKHN0cnVjdCBzb2FwICpzb2FwKQoreyAKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICByZWdpc3RlciBzaXplX3QgY291bnQgPSBzb2FwLT5jb3VudDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDYWxjdWxhdGluZyB0aGUgbWVzc2FnZSBzaXplIHdpdGggYXR0YWNobWVudHMsIGN1cnJlbnQgY291bnQ9JWx1XG4iLCAodW5zaWduZWQgbG9uZyljb3VudCkpOworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKSkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNhbGN1bGF0aW5nIHRoZSBzaXplIG9mIERJTUUgYXR0YWNobWVudHNcbiIpKTsKKyAgICBmb3IgKGNvbnRlbnQgPSBzb2FwLT5kaW1lLmZpcnN0OyBjb250ZW50OyBjb250ZW50ID0gY29udGVudC0+bmV4dCkKKyAgICB7IGNvdW50ICs9IDEyICsgKChjb250ZW50LT5zaXplKzMpJih+MykpOworICAgICAgaWYgKGNvbnRlbnQtPmlkKQorICAgICAgICBjb3VudCArPSAoKHN0cmxlbihjb250ZW50LT5pZCkrMykmKH4zKSk7CisgICAgICBpZiAoY29udGVudC0+dHlwZSkKKyAgICAgICAgY291bnQgKz0gKChzdHJsZW4oY29udGVudC0+dHlwZSkrMykmKH4zKSk7CisgICAgICBpZiAoY29udGVudC0+b3B0aW9ucykKKyAgICAgICAgY291bnQgKz0gKCgoKHVuc2lnbmVkIGNoYXIpY29udGVudC0+b3B0aW9uc1syXSA8PCA4KSB8ICgodW5zaWduZWQgY2hhciljb250ZW50LT5vcHRpb25zWzNdKSkrNykmKH4zKTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2l6ZSBvZiBESU1FIGF0dGFjaG1lbnQgY29udGVudCBpcyAlbHUgYnl0ZXNcbiIsICh1bnNpZ25lZCBsb25nKWNvbnRlbnQtPnNpemUpKTsKKyAgICB9CisgIH0KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkgJiYgc29hcC0+bWltZS5ib3VuZGFyeSkKKyAgeyByZWdpc3RlciBzaXplX3QgbiA9IHN0cmxlbihzb2FwLT5taW1lLmJvdW5kYXJ5KTsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNhbGN1bGF0aW5nIHRoZSBzaXplIG9mIE1JTUUgYXR0YWNobWVudHNcbiIpKTsKKyAgICBmb3IgKGNvbnRlbnQgPSBzb2FwLT5taW1lLmZpcnN0OyBjb250ZW50OyBjb250ZW50ID0gY29udGVudC0+bmV4dCkKKyAgICB7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnM7CisgICAgICAvKiBjb3VudCBcclxuLS1ib3VuZGFyeVxyXG4gKi8KKyAgICAgIGNvdW50ICs9IDYgKyBuOworICAgICAgLyogY291bnQgQ29udGVudC1UeXBlOiAuLi5cclxuICovCisgICAgICBpZiAoY29udGVudC0+dHlwZSkKKyAgICAgICAgY291bnQgKz0gMTYgKyBzdHJsZW4oY29udGVudC0+dHlwZSk7CisgICAgICAvKiBjb3VudCBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiAuLi5cclxuICovCisgICAgICBzID0gc29hcF9zdHJfY29kZShtaW1lX2NvZGVzLCBjb250ZW50LT5lbmNvZGluZyk7CisgICAgICBpZiAocykKKyAgICAgICAgY291bnQgKz0gMjkgKyBzdHJsZW4ocyk7CisgICAgICAvKiBjb3VudCBDb250ZW50LUlEOiAuLi5cclxuICovCisgICAgICBpZiAoY29udGVudC0+aWQpCisgICAgICAgIGNvdW50ICs9IDE0ICsgc3RybGVuKGNvbnRlbnQtPmlkKTsKKyAgICAgIC8qIGNvdW50IENvbnRlbnQtTG9jYXRpb246IC4uLlxyXG4gKi8KKyAgICAgIGlmIChjb250ZW50LT5sb2NhdGlvbikKKyAgICAgICAgY291bnQgKz0gMjAgKyBzdHJsZW4oY29udGVudC0+bG9jYXRpb24pOworICAgICAgLyogY291bnQgQ29udGVudC1EZXNjcmlwdGlvbjogLi4uXHJcbiAqLworICAgICAgaWYgKGNvbnRlbnQtPmRlc2NyaXB0aW9uKQorICAgICAgICBjb3VudCArPSAyMyArIHN0cmxlbihjb250ZW50LT5sb2NhdGlvbik7CisgICAgICAvKiBjb3VudCBcclxuLi4uY29udGVudCAqLworICAgICAgY291bnQgKz0gMiArIGNvbnRlbnQtPnNpemU7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNpemUgb2YgTUlNRSBhdHRhY2htZW50IGNvbnRlbnQgaXMgJWx1IGJ5dGVzXG4iLCAodW5zaWduZWQgbG9uZyljb250ZW50LT5zaXplKSk7CisgICAgfQorICAgIC8qIGNvdW50IFxyXG4tLWJvdW5kYXJ5LS0gKi8KKyAgICBjb3VudCArPSA2ICsgbjsKKyAgfQorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk5ldyBjb3VudCBpcyAlbHUgYnl0ZXNcbiIsICh1bnNpZ25lZCBsb25nKWNvdW50KSk7CisgIHJldHVybiBjb3VudDsKKyNlbHNlCisgIHJldHVybiBzb2FwLT5jb3VudDsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc29hcF9wdXRkaW1lZmllbGQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBuKQoreyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCBuKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsIFNPQVBfU1RSX1BBRERJTkcsIC0obG9uZyluJjMpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfZGltZV9vcHRpb24oc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIHNob3J0IG9wdHlwZSwgY29uc3QgY2hhciAqb3B0aW9uKQoreyBzaXplX3QgbjsKKyAgY2hhciAqcyA9IE5VTEw7CisgIGlmIChvcHRpb24pCisgIHsgbiA9IHN0cmxlbihvcHRpb24pOworICAgIHMgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgbiArIDUpOworICAgIGlmIChzKQorICAgIHsgc1swXSA9IG9wdHlwZSA+PiA4OworICAgICAgc1sxXSA9IG9wdHlwZSAmIDB4RkY7CisgICAgICBzWzJdID0gbiA+PiA4OworICAgICAgc1szXSA9IG4gJiAweEZGOworICAgICAgc3RyY3B5KHMgKyA0LCBvcHRpb24pOworICAgIH0KKyAgfQorICByZXR1cm4gczsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dGRpbWVoZHIoc3RydWN0IHNvYXAgKnNvYXApCit7IHVuc2lnbmVkIGNoYXIgdG1wWzEyXTsKKyAgc2l6ZV90IG9wdGxlbiA9IDAsIGlkbGVuID0gMCwgdHlwZWxlbiA9IDA7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUHV0IERJTUUgaGVhZGVyIGlkPSclcydcbiIsIHNvYXAtPmRpbWUuaWQ/c29hcC0+ZGltZS5pZDoiIikpOworICBpZiAoc29hcC0+ZGltZS5vcHRpb25zKQorICAgIG9wdGxlbiA9ICgoKHVuc2lnbmVkIGNoYXIpc29hcC0+ZGltZS5vcHRpb25zWzJdIDw8IDgpIHwgKCh1bnNpZ25lZCBjaGFyKXNvYXAtPmRpbWUub3B0aW9uc1szXSkpICsgNDsKKyAgaWYgKHNvYXAtPmRpbWUuaWQpCisgICAgaWRsZW4gPSBzdHJsZW4oc29hcC0+ZGltZS5pZCk7CisgIGlmIChzb2FwLT5kaW1lLnR5cGUpCisgICAgdHlwZWxlbiA9IHN0cmxlbihzb2FwLT5kaW1lLnR5cGUpOworICB0bXBbMF0gPSBTT0FQX0RJTUVfVkVSU0lPTiB8IChzb2FwLT5kaW1lLmZsYWdzICYgMHg3KTsKKyAgdG1wWzFdID0gc29hcC0+ZGltZS5mbGFncyAmIDB4RjA7CisgIHRtcFsyXSA9IG9wdGxlbiA+PiA4OworICB0bXBbM10gPSBvcHRsZW4gJiAweEZGOworICB0bXBbNF0gPSBpZGxlbiA+PiA4OworICB0bXBbNV0gPSBpZGxlbiAmIDB4RkY7CisgIHRtcFs2XSA9IHR5cGVsZW4gPj4gODsKKyAgdG1wWzddID0gdHlwZWxlbiAmIDB4RkY7CisgIHRtcFs4XSA9IHNvYXAtPmRpbWUuc2l6ZSA+PiAyNDsKKyAgdG1wWzldID0gKHNvYXAtPmRpbWUuc2l6ZSA+PiAxNikgJiAweEZGOworICB0bXBbMTBdID0gKHNvYXAtPmRpbWUuc2l6ZSA+PiA4KSAmIDB4RkY7CisgIHRtcFsxMV0gPSBzb2FwLT5kaW1lLnNpemUgJiAweEZGOworICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAoY2hhciopdG1wLCAxMikKKyAgIHx8IHNvYXBfcHV0ZGltZWZpZWxkKHNvYXAsIHNvYXAtPmRpbWUub3B0aW9ucywgb3B0bGVuKQorICAgfHwgc29hcF9wdXRkaW1lZmllbGQoc29hcCwgc29hcC0+ZGltZS5pZCwgaWRsZW4pCisgICB8fCBzb2FwX3B1dGRpbWVmaWVsZChzb2FwLCBzb2FwLT5kaW1lLnR5cGUsIHR5cGVsZW4pKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRkaW1lKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgIGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSkKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgZm9yIChjb250ZW50ID0gc29hcC0+ZGltZS5maXJzdDsgY29udGVudDsgY29udGVudCA9IGNvbnRlbnQtPm5leHQpCisgIHsgdm9pZCAqaGFuZGxlOworICAgIHNvYXAtPmRpbWUuc2l6ZSA9IGNvbnRlbnQtPnNpemU7CisgICAgc29hcC0+ZGltZS5pZCA9IGNvbnRlbnQtPmlkOworICAgIHNvYXAtPmRpbWUudHlwZSA9IGNvbnRlbnQtPnR5cGU7CisgICAgc29hcC0+ZGltZS5vcHRpb25zID0gY29udGVudC0+b3B0aW9uczsKKyAgICBzb2FwLT5kaW1lLmZsYWdzID0gU09BUF9ESU1FX1ZFUlNJT04gfCBTT0FQX0RJTUVfTUVESUE7CisgICAgaWYgKHNvYXAtPmZkaW1lcmVhZG9wZW4gJiYgKChoYW5kbGUgPSBzb2FwLT5mZGltZXJlYWRvcGVuKHNvYXAsICh2b2lkKiljb250ZW50LT5wdHIsIGNvbnRlbnQtPmlkLCBjb250ZW50LT50eXBlLCBjb250ZW50LT5vcHRpb25zKSkgfHwgc29hcC0+ZXJyb3IpKQorICAgIHsgc2l6ZV90IHNpemUgPSBjb250ZW50LT5zaXplOworICAgICAgaWYgKCFoYW5kbGUpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZmRpbWVyZWFkb3BlbiBmYWlsZWRcbiIpKTsKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgICAgaWYgKCFjb250ZW50LT5zaXplICYmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1hNTCkgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LIHx8IChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19TVE9SRSkpCisgICAgICB7IHNpemVfdCBjaHVua3NpemUgPSBzaXplb2Yoc29hcC0+dG1wYnVmKTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDaHVua2VkIHN0cmVhbWluZyBESU1FXG4iKSk7CisgICAgICAgIGRvIAorICAgICAgICB7IHNpemUgPSBzb2FwLT5mZGltZXJlYWQoc29hcCwgaGFuZGxlLCBzb2FwLT50bXBidWYsIGNodW5rc2l6ZSk7CisgICAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJmZGltZXJlYWQgcmV0dXJuZWQgJWx1IGJ5dGVzXG4iLCAodW5zaWduZWQgbG9uZylzaXplKSk7CisgICAgICAgICAgaWYgKHNpemUgPCBjaHVua3NpemUpCisgCSAgeyBzb2FwLT5kaW1lLmZsYWdzICY9IH5TT0FQX0RJTUVfQ0Y7CisgICAgICAgICAgICBpZiAoIWNvbnRlbnQtPm5leHQpCisgICAgICAgICAgICAgIHNvYXAtPmRpbWUuZmxhZ3MgfD0gU09BUF9ESU1FX01FOworCSAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNvYXAtPmRpbWUuZmxhZ3MgfD0gU09BUF9ESU1FX0NGOworCSAgc29hcC0+ZGltZS5zaXplID0gc2l6ZTsKKyAgICAgICAgICBpZiAoc29hcF9wdXRkaW1laGRyKHNvYXApCisJICAgfHwgc29hcF9wdXRkaW1lZmllbGQoc29hcCwgc29hcC0+dG1wYnVmLCBzaXplKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGlmIChzb2FwLT5kaW1lLmlkKQorIAkgIHsgc29hcC0+ZGltZS5mbGFncyAmPSB+KFNPQVBfRElNRV9NQiB8IFNPQVBfRElNRV9NRURJQSk7CisgICAgICAgICAgICBzb2FwLT5kaW1lLmlkID0gTlVMTDsKKyAgICAgICAgICAgIHNvYXAtPmRpbWUudHlwZSA9IE5VTEw7CisgICAgICAgICAgICBzb2FwLT5kaW1lLm9wdGlvbnMgPSBOVUxMOworICAgICAgICAgIH0gIAorICAgICAgICB9IHdoaWxlIChzaXplID49IGNodW5rc2l6ZSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IGlmICghY29udGVudC0+bmV4dCkKKyAgICAgICAgICBzb2FwLT5kaW1lLmZsYWdzIHw9IFNPQVBfRElNRV9NRTsKKyAgICAgICAgaWYgKHNvYXBfcHV0ZGltZWhkcihzb2FwKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIGRvCisgICAgICAgIHsgc2l6ZV90IGJ1ZnNpemU7CisJICBpZiAoc2l6ZSA8IHNpemVvZihzb2FwLT50bXBidWYpKQorICAgICAgICAgICAgYnVmc2l6ZSA9IHNpemU7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgYnVmc2l6ZSA9IHNpemVvZihzb2FwLT50bXBidWYpOworICAgICAgICAgIGlmICghKGJ1ZnNpemUgPSBzb2FwLT5mZGltZXJlYWQoc29hcCwgaGFuZGxlLCBzb2FwLT50bXBidWYsIGJ1ZnNpemUpKSkKKyAgICAgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZmRpbWVyZWFkIGZhaWxlZDogaW5zdWZmaWNpZW50IGRhdGEgKCVsdSBieXRlcyByZW1haW5pbmcgZnJvbSAlbHUgYnl0ZXMpXG4iLCAodW5zaWduZWQgbG9uZylzaXplLCAodW5zaWduZWQgbG9uZylzb2FwLT5kaW1lLnNpemUpKTsKKyAgICAgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisJICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzb2FwLT50bXBidWYsIGJ1ZnNpemUpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgc2l6ZSAtPSBidWZzaXplOworICAgICAgICB9IHdoaWxlIChzaXplKTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJmZGltZXJlYWRjbG9zZVxuIikpOworICAgICAgICBzb2FwX3NlbmRfcmF3KHNvYXAsIFNPQVBfU1RSX1BBRERJTkcsIC0obG9uZylzb2FwLT5kaW1lLnNpemUmMyk7CisgICAgICB9CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImZkaW1lcmVhZGNsb3NlXG4iKSk7CisgICAgICBpZiAoc29hcC0+ZmRpbWVyZWFkY2xvc2UpCisgICAgICAgIHNvYXAtPmZkaW1lcmVhZGNsb3NlKHNvYXAsIGhhbmRsZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IGlmICghY29udGVudC0+bmV4dCkKKyAgICAgICAgc29hcC0+ZGltZS5mbGFncyB8PSBTT0FQX0RJTUVfTUU7CisgICAgICBpZiAoc29hcF9wdXRkaW1laGRyKHNvYXApCisgICAgICAgfHwgc29hcF9wdXRkaW1lZmllbGQoc29hcCwgKGNoYXIqKWNvbnRlbnQtPnB0ciwgY29udGVudC0+c2l6ZSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBjaGFyICoKK3NvYXBfZ2V0ZGltZWZpZWxkKHN0cnVjdCBzb2FwICpzb2FwLCBzaXplX3QgbikKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgY2hhciAqczsKKyAgY2hhciAqcCA9IE5VTEw7CisgIGlmIChuKQorICB7IHAgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgbiArIDEpOworICAgIGlmIChwKQorICAgIHsgcyA9IHA7CisgICAgICBmb3IgKGkgPSBuOyBpID4gMDsgaS0tKQorICAgICAgeyBpZiAoKGludCkoYyA9IHNvYXBfZ2V0MShzb2FwKSkgPT0gRU9GKQorICAgICAgICB7IHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgKnMrKyA9IChjaGFyKWM7CisgICAgICB9CisgICAgICAqcyA9ICdcMCc7CisgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcF9tb3ZlKHNvYXAsIC0obG9uZyluJjMpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgIH0KKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRkaW1laGRyKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIHJlZ2lzdGVyIGNoYXIgKnM7CisgIHJlZ2lzdGVyIGludCBpOworICB1bnNpZ25lZCBjaGFyIHRtcFsxMl07CisgIHNpemVfdCBvcHRsZW4sIGlkbGVuLCB0eXBlbGVuOworICBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9ESU1FX0VORDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHZXQgRElNRSBoZWFkZXJcbiIpKTsKKyAgaWYgKHNvYXAtPmRpbWUuYnVmbGVuIHx8IHNvYXAtPmRpbWUuY2h1bmtzaXplKQorICB7IGlmIChzb2FwX21vdmUoc29hcCwgKGxvbmcpKHNvYXAtPmRpbWUuc2l6ZSAtIHNvYXBfdGVsbChzb2FwKSkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgc29hcF91bmdldChzb2FwLCBzb2FwX2dldGNoYXIoc29hcCkpOyAvKiBza2lwIHBhZGRpbmcgYW5kIGdldCBoZHIgKi8KKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIi4uLiBGcm9tIGNodW5rZWRcbiIpKTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICBzID0gKGNoYXIqKXRtcDsKKyAgZm9yIChpID0gMTI7IGkgPiAwOyBpLS0pCisgIHsgaWYgKChpbnQpKGMgPSBzb2FwX2dldGNoYXIoc29hcCkpID09IEVPRikKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgICpzKysgPSAoY2hhciljOworICB9CisgIGlmICgodG1wWzBdICYgMHhGOCkgIT0gU09BUF9ESU1FX1ZFUlNJT04pCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9ESU1FX01JU01BVENIOworICBzb2FwLT5kaW1lLmZsYWdzID0gKHRtcFswXSAmIDB4NykgfCAodG1wWzFdICYgMHhGMCk7CisgIG9wdGxlbiA9ICh0bXBbMl0gPDwgOCkgfCB0bXBbM107CisgIGlkbGVuID0gKHRtcFs0XSA8PCA4KSB8IHRtcFs1XTsKKyAgdHlwZWxlbiA9ICh0bXBbNl0gPDwgOCkgfCB0bXBbN107CisgIHNvYXAtPmRpbWUuc2l6ZSA9ICh0bXBbOF0gPDwgMjQpIHwgKHRtcFs5XSA8PCAxNikgfCAodG1wWzEwXSA8PCA4KSB8IHRtcFsxMV07CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRElNRSBzaXplPSVsdSBmbGFncz0weCVYXG4iLCAodW5zaWduZWQgbG9uZylzb2FwLT5kaW1lLnNpemUsIHNvYXAtPmRpbWUuZmxhZ3MpKTsKKyAgaWYgKCEoc29hcC0+ZGltZS5vcHRpb25zID0gc29hcF9nZXRkaW1lZmllbGQoc29hcCwgb3B0bGVuKSkgJiYgc29hcC0+ZXJyb3IpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoIShzb2FwLT5kaW1lLmlkID0gc29hcF9nZXRkaW1lZmllbGQoc29hcCwgaWRsZW4pKSAmJiBzb2FwLT5lcnJvcikKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmICghKHNvYXAtPmRpbWUudHlwZSA9IHNvYXBfZ2V0ZGltZWZpZWxkKHNvYXAsIHR5cGVsZW4pKSAmJiBzb2FwLT5lcnJvcikKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRElNRSBpZD0lcywgdHlwZT0lcywgb3B0aW9ucz0lc1xuIiwgc29hcC0+ZGltZS5pZD9zb2FwLT5kaW1lLmlkOiIiLCBzb2FwLT5kaW1lLnR5cGU/c29hcC0+ZGltZS50eXBlOiIiLCBzb2FwLT5kaW1lLm9wdGlvbnM/c29hcC0+ZGltZS5vcHRpb25zKzQ6IiIpKTsKKyAgaWYgKHNvYXAtPmRpbWUuZmxhZ3MgJiBTT0FQX0RJTUVfTUUpCisgICAgc29hcC0+bW9kZSAmPSB+U09BUF9FTkNfRElNRTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRkaW1lKHN0cnVjdCBzb2FwICpzb2FwKQoreyB3aGlsZSAoc29hcC0+ZGltZS5mbGFncyAmIFNPQVBfRElNRV9DRikKKyAgeyBpZiAoc29hcF9nZXRkaW1laGRyKHNvYXApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmIChzb2FwX21vdmUoc29hcCwgc29hcC0+ZGltZS5zaXplKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICB9CisgIGlmIChzb2FwX21vdmUoc29hcCwgKChzb2FwLT5kaW1lLnNpemUrMykmKH4zKSktc29hcF90ZWxsKHNvYXApKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgZm9yICg7OykKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgICAgaWYgKHNvYXBfZ2V0ZGltZWhkcihzb2FwKSkKKyAgICAgIGJyZWFrOworICAgIGlmIChzb2FwLT5mZGltZXdyaXRlb3BlbiAmJiAoKHNvYXAtPmRpbWUucHRyID0gKGNoYXIqKXNvYXAtPmZkaW1ld3JpdGVvcGVuKHNvYXAsIHNvYXAtPmRpbWUuaWQsIHNvYXAtPmRpbWUudHlwZSwgc29hcC0+ZGltZS5vcHRpb25zKSkgfHwgc29hcC0+ZXJyb3IpKQorICAgIHsgY29uc3QgY2hhciAqaWQsICp0eXBlLCAqb3B0aW9uczsKKyAgICAgIHNpemVfdCBzaXplLCBuOworICAgICAgaWYgKCFzb2FwLT5kaW1lLnB0cikKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgaWQgPSBzb2FwLT5kaW1lLmlkOworICAgICAgdHlwZSA9IHNvYXAtPmRpbWUudHlwZTsKKyAgICAgIG9wdGlvbnMgPSBzb2FwLT5kaW1lLm9wdGlvbnM7CisgICAgICBmb3IgKDs7KQorICAgICAgeyBzaXplID0gc29hcC0+ZGltZS5zaXplOworICAgICAgICBmb3IgKDs7KQorICAgICAgICB7IG4gPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgICAgICAgaWYgKHNpemUgPCBuKQorICAgICAgICAgICAgbiA9IHNpemU7CisgICAgICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZkaW1ld3JpdGUoc29hcCwgKHZvaWQqKXNvYXAtPmRpbWUucHRyLCBzb2FwLT5idWYgKyBzb2FwLT5idWZpZHgsIG4pKSkKKyAgICAgICAgICAgIGJyZWFrOworCSAgc2l6ZSAtPSBuOworCSAgaWYgKCFzaXplKQorCSAgeyBzb2FwLT5idWZpZHggKz0gbjsKKwkgICAgYnJlYWs7CisJICB9CisJICBpZiAoc29hcF9yZWN2KHNvYXApKQorICAgICAgICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKwkgICAgZ290byBlbmQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzb2FwX21vdmUoc29hcCwgLShsb25nKXNvYXAtPmRpbWUuc2l6ZSYzKSkKKyAgICAgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworCSAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEoc29hcC0+ZGltZS5mbGFncyAmIFNPQVBfRElNRV9DRikpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChzb2FwX2dldGRpbWVoZHIoc29hcCkpCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CitlbmQ6CisgICAgICBpZiAoc29hcC0+ZmRpbWV3cml0ZWNsb3NlKQorICAgICAgICBzb2FwLT5mZGltZXdyaXRlY2xvc2Uoc29hcCwgKHZvaWQqKXNvYXAtPmRpbWUucHRyKTsKKyAgICAgIHNvYXAtPmRpbWUuc2l6ZSA9IDA7CisgICAgICBzb2FwLT5kaW1lLmlkID0gaWQ7CisgICAgICBzb2FwLT5kaW1lLnR5cGUgPSB0eXBlOworICAgICAgc29hcC0+ZGltZS5vcHRpb25zID0gb3B0aW9uczsKKyAgICB9CisgICAgZWxzZSBpZiAoc29hcC0+ZGltZS5mbGFncyAmIFNPQVBfRElNRV9DRikKKyAgICB7IGNvbnN0IGNoYXIgKmlkLCAqdHlwZSwgKm9wdGlvbnM7CisgICAgICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgICAgICByZWdpc3RlciBjaGFyICpzOworICAgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgICBpZCA9IHNvYXAtPmRpbWUuaWQ7CisgICAgICB0eXBlID0gc29hcC0+ZGltZS50eXBlOworICAgICAgb3B0aW9ucyA9IHNvYXAtPmRpbWUub3B0aW9uczsKKyAgICAgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICAgICAgcmV0dXJuIFNPQVBfRU9NOworICAgICAgZm9yICg7OykKKyAgICAgIHsgcyA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgc29hcC0+ZGltZS5zaXplKTsKKyAgICAgICAgaWYgKCFzKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgICBmb3IgKGkgPSBzb2FwLT5kaW1lLnNpemU7IGkgPiAwOyBpLS0pCisgICAgICAgIHsgaWYgKChpbnQpKGMgPSBzb2FwX2dldDEoc29hcCkpID09IEVPRikKKyAgICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgICAgICAgICpzKysgPSAoY2hhciljOworICAgICAgICB9CisgICAgICAgIGlmIChzb2FwX21vdmUoc29hcCwgLShsb25nKXNvYXAtPmRpbWUuc2l6ZSYzKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAgICAgaWYgKCEoc29hcC0+ZGltZS5mbGFncyAmIFNPQVBfRElNRV9DRikpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChzb2FwX2dldGRpbWVoZHIoc29hcCkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgICAgc29hcC0+ZGltZS5zaXplID0gc29hcC0+Ymxpc3QtPnNpemUrKzsgLyogYWxsb2NhdGUgb25lIG1vcmUgZm9yICdcMCcgKi8KKyAgICAgIGlmICghKHNvYXAtPmRpbWUucHRyID0gc29hcF9zYXZlX2Jsb2NrKHNvYXAsIE5VTEwsIDApKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgc29hcC0+ZGltZS5wdHJbc29hcC0+ZGltZS5zaXplXSA9ICdcMCc7IC8qIGZvcmNlIDAtdGVybWluYXRlZCAqLworICAgICAgc29hcC0+ZGltZS5pZCA9IGlkOworICAgICAgc29hcC0+ZGltZS50eXBlID0gdHlwZTsKKyAgICAgIHNvYXAtPmRpbWUub3B0aW9ucyA9IG9wdGlvbnM7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHNvYXAtPmRpbWUucHRyID0gc29hcF9nZXRkaW1lZmllbGQoc29hcCwgc29hcC0+ZGltZS5zaXplKTsKKyAgICBjb250ZW50ID0gc29hcF9uZXdfbXVsdGlwYXJ0KHNvYXAsICZzb2FwLT5kaW1lLmZpcnN0LCAmc29hcC0+ZGltZS5sYXN0LCBzb2FwLT5kaW1lLnB0ciwgc29hcC0+ZGltZS5zaXplKTsKKyAgICBpZiAoIWNvbnRlbnQpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICBjb250ZW50LT5pZCA9IHNvYXAtPmRpbWUuaWQ7CisgICAgY29udGVudC0+dHlwZSA9IHNvYXAtPmRpbWUudHlwZTsKKyAgICBjb250ZW50LT5vcHRpb25zID0gc29hcC0+ZGltZS5vcHRpb25zOworICAgIHNvYXBfcmVzb2x2ZV9hdHRhY2htZW50KHNvYXAsIGNvbnRlbnQpOworICAgIGlmIChzb2FwLT5lcnJvcikKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9ESU1FX0VORCkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRtaW1laGRyKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgIGRvCisgIHsgaWYgKHNvYXBfZ2V0bGluZShzb2FwLCBzb2FwLT5tc2didWYsIHNpemVvZihzb2FwLT5tc2didWYpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICB3aGlsZSAoISpzb2FwLT5tc2didWYpOworICBpZiAoc29hcC0+bXNnYnVmWzBdID09ICctJyAmJiBzb2FwLT5tc2didWZbMV0gPT0gJy0nKQorICB7IGNoYXIgKnMgPSBzb2FwLT5tc2didWYgKyBzdHJsZW4oc29hcC0+bXNnYnVmKSAtIDE7CisgICAgLyogcmVtb3ZlIHdoaXRlIHNwYWNlICovCisgICAgd2hpbGUgKHNvYXBfYmxhbmsoKnMpKQorICAgICAgcy0tOworICAgIHNbMV0gPSAnXDAnOworICAgIGlmIChzb2FwLT5taW1lLmJvdW5kYXJ5KQorICAgIHsgaWYgKHN0cmNtcChzb2FwLT5tc2didWYgKyAyLCBzb2FwLT5taW1lLmJvdW5kYXJ5KSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9NSU1FX0VSUk9SOworICAgIH0KKyAgICBlbHNlCisgICAgICBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+bXNnYnVmICsgMik7CisgICAgaWYgKHNvYXBfZ2V0bGluZShzb2FwLCBzb2FwLT5tc2didWYsIHNpemVvZihzb2FwLT5tc2didWYpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAoc29hcF9zZXRfbWltZV9hdHRhY2htZW50KHNvYXAsIE5VTEwsIDAsIFNPQVBfTUlNRV9OT05FLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgY29udGVudCA9IHNvYXAtPm1pbWUubGFzdDsKKyAgZm9yICg7OykKKyAgeyByZWdpc3RlciBjaGFyICprZXkgPSBzb2FwLT5tc2didWY7CisgICAgcmVnaXN0ZXIgY2hhciAqdmFsOworICAgIGlmICghKmtleSkKKyAgICAgIGJyZWFrOworICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJNSU1FIGhlYWRlcjogJXNcbiIsIGtleSkpOworICAgIHZhbCA9IHN0cmNocihzb2FwLT5tc2didWYsICc6Jyk7CisgICAgaWYgKHZhbCkKKyAgICB7ICp2YWwgPSAnXDAnOworICAgICAgZG8gdmFsKys7CisgICAgICB3aGlsZSAoKnZhbCAmJiAqdmFsIDw9IDMyKTsKKyAgICAgIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtSUQiKSkKKyAgICAgICAgY29udGVudC0+aWQgPSBzb2FwX3N0cmR1cChzb2FwLCB2YWwpOworICAgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LUxvY2F0aW9uIikpCisgICAgICAgIGNvbnRlbnQtPmxvY2F0aW9uID0gc29hcF9zdHJkdXAoc29hcCwgdmFsKTsKKyAgICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1EaXNwb3NpdGlvbiIpKQorICAgICAgICBjb250ZW50LT5pZCA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAibmFtZSIpKTsKKyAgICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1UeXBlIikpCisgICAgICAgIGNvbnRlbnQtPnR5cGUgPSBzb2FwX3N0cmR1cChzb2FwLCB2YWwpOworICAgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LURlc2NyaXB0aW9uIikpCisgICAgICAgIGNvbnRlbnQtPmRlc2NyaXB0aW9uID0gc29hcF9zdHJkdXAoc29hcCwgdmFsKTsKKyAgICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyIpKQorICAgICAgICBjb250ZW50LT5lbmNvZGluZyA9IChlbnVtIHNvYXBfbWltZV9lbmNvZGluZylzb2FwX2ludF9jb2RlKG1pbWVfY29kZXMsIHZhbCwgKGxvbmcpU09BUF9NSU1FX05PTkUpOworICAgIH0KKyAgICBpZiAoc29hcF9nZXRsaW5lKHNvYXAsIGtleSwgc2l6ZW9mKHNvYXAtPm1zZ2J1ZikpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0bWltZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjID0gMDsKKyAgaWYgKCFzb2FwLT5taW1lLmxhc3QpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIGZvciAoOzspCisgIHsgcmVnaXN0ZXIgc2l6ZV90IGksIG0gPSAwOworICAgIHJlZ2lzdGVyIGNoYXIgKnMsICp0ID0gTlVMTDsKKyAgICBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQgPSBzb2FwLT5taW1lLmxhc3Q7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQYXJzaW5nIE1JTUUgY29udGVudCBpZD0lcyB0eXBlPSVzXG4iLCBjb250ZW50LT5pZD9jb250ZW50LT5pZDoiIiwgY29udGVudC0+dHlwZT9jb250ZW50LT50eXBlOiIiKSk7CisgICAgaWYgKHNvYXBfbmV3X2Jsb2NrKHNvYXApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgZm9yICg7OykKKyAgICB7IHJlZ2lzdGVyIHNob3J0IGZsYWcgPSAwOworICAgICAgaWYgKCEocyA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgU09BUF9CTEtMRU4pKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICBmb3IgKGkgPSAwOyBpIDwgU09BUF9CTEtMRU47IGkrKykKKyAgICAgIHsgaWYgKG0gPiAwKQorICAgICAgICB7ICpzKysgPSAqdCsrOworCSAgbS0tOworCX0KKwllbHNlCisgICAgICAgIHsgaWYgKCFmbGFnKQorCSAgeyBjID0gc29hcF9nZXQxKHNvYXApOworCSAgICBpZiAoKGludCljID09IEVPRikKKwkgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKwkgIH0KKwkgIGlmIChmbGFnIHx8IGMgPT0gJ1xyJykKKwkgIHsgdCA9IHNvYXAtPnRtcGJ1ZjsKKwkgICAgbWVtc2V0KHQsIDAsIHNpemVvZihzb2FwLT50bXBidWYpKTsKKyAgICAgICAgICAgIHN0cmNweSh0LCAiXG4tLSIpOworICAgICAgICAgICAgaWYgKHNvYXAtPm1pbWUuYm91bmRhcnkpCisJICAgICAgc3RybmNhdCh0LCBzb2FwLT5taW1lLmJvdW5kYXJ5LCBzaXplb2Yoc29hcC0+dG1wYnVmKS00KTsKKwkgICAgZG8gYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKwkgICAgd2hpbGUgKGMgPT0gKnQrKyk7CisJICAgIGlmICgoaW50KWMgPT0gRU9GKQorCSAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworCSAgICBpZiAoISotLXQpCisJICAgICAgZ290byBlbmQ7CisJICAgICp0ID0gKGNoYXIpYzsKKwkgICAgZmxhZyA9IChjID09ICdccicpOworCSAgICBtID0gdCAtIHNvYXAtPnRtcGJ1ZiArIDEgLSBmbGFnOworCSAgICB0ID0gc29hcC0+dG1wYnVmOworCSAgICBjID0gJ1xyJzsKKwkgIH0KKwkgICpzKysgPSAoY2hhciljOworICAgICAgICB9CisgICAgICB9CisgICAgfQorZW5kOgorICAgICpzID0gJ1wwJzsgLyogZm9yY2UgMC10ZXJtaW5hdGVkICovCisgICAgY29udGVudC0+c2l6ZSA9IHNvYXBfc2l6ZV9ibG9jayhzb2FwLCBpKzEpLTE7CisgICAgY29udGVudC0+cHRyID0gc29hcF9zYXZlX2Jsb2NrKHNvYXAsIE5VTEwsIDApOworICAgIHNvYXBfcmVzb2x2ZV9hdHRhY2htZW50KHNvYXAsIGNvbnRlbnQpOworICAgIGlmIChjID09ICctJyAmJiBzb2FwX2dldGNoYXIoc29hcCkgPT0gJy0nKQorICAgICAgYnJlYWs7CisgICAgd2hpbGUgKGMgIT0gJ1xyJyAmJiAoaW50KWMgIT0gRU9GICYmIHNvYXBfYmxhbmsoYykpCisgICAgICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICAgIGlmIChjICE9ICdccicgfHwgc29hcF9nZXRjaGFyKHNvYXApICE9ICdcbicpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX01JTUVfRVJST1I7CisgICAgaWYgKHNvYXBfZ2V0bWltZWhkcihzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc29hcF9tYXRjaF9jaWQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKnQpCit7IHJlZ2lzdGVyIHNpemVfdCBuOworICBpZiAoIXMpCisgICAgcmV0dXJuIDE7CisgIGlmICghc3RyY21wKHMsIHQpKQorICAgIHJldHVybiAwOworICBpZiAoIXN0cm5jbXAocywgImNpZDoiLCA0KSkKKyAgICBzICs9IDQ7CisgIG4gPSBzdHJsZW4odCk7CisgIGlmICgqdCA9PSAnPCcpCisgIHsgdCsrOworICAgIG4gLT0gMjsKKyAgfQorICBpZiAoIXN0cm5jbXAocywgdCwgbikgJiYgIXNbbl0pCisgICAgcmV0dXJuIDA7CisgIHNvYXBfZGVjb2RlKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksIHMsIFNPQVBfU1RSX0VPUyk7CisgIGlmICghc3RybmNtcChzb2FwLT50bXBidWYsIHQsIG4pICYmICFzb2FwLT50bXBidWZbbl0pCisgICAgcmV0dXJuIDA7CisgIHJldHVybiAxOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZAorc29hcF9yZXNvbHZlX2F0dGFjaG1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudCkKK3sgaWYgKGNvbnRlbnQtPmlkKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3hsaXN0ICoqeHAgPSAmc29hcC0+eGxpc3Q7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHZpbmcgYXR0YWNobWVudCBkYXRhIGZvciBpZD0lc1xuIiwgY29udGVudC0+aWQpKTsKKyAgICB3aGlsZSAoKnhwKQorICAgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfeGxpc3QgKnhxID0gKnhwOworICAgICAgaWYgKCFzb2FwX21hdGNoX2NpZChzb2FwLCB4cS0+aWQsIGNvbnRlbnQtPmlkKSkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGb3VuZCBtYXRjaGluZyBhdHRhY2htZW50ICVzIGZvciBjb250ZW50IGlkPSVzXG4iLCB4cS0+aWQsIGNvbnRlbnQtPmlkKSk7CisJKnhwID0geHEtPm5leHQ7CisgICAgICAgICp4cS0+cHRyID0gKHVuc2lnbmVkIGNoYXIqKWNvbnRlbnQtPnB0cjsKKyAgICAgICAgKnhxLT5zaXplID0gKGludCljb250ZW50LT5zaXplOworICAgICAgICAqeHEtPnR5cGUgPSAoY2hhciopY29udGVudC0+dHlwZTsKKwlpZiAoY29udGVudC0+b3B0aW9ucykKKyAgICAgICAgICAqeHEtPm9wdGlvbnMgPSAoY2hhciopY29udGVudC0+b3B0aW9uczsKKyAgICAgICAgZWxzZQorICAgICAgICAgICp4cS0+b3B0aW9ucyA9IChjaGFyKiljb250ZW50LT5kZXNjcmlwdGlvbjsKKwlTT0FQX0ZSRUUoc29hcCwgeHEpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB4cCA9ICYoKnhwKS0+bmV4dDsKKyAgICB9CisgIH0KK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dG1pbWVoZHIoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudCkKK3sgY29uc3QgY2hhciAqczsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJNSU1FIGF0dGFjaG1lbnQgdHlwZT0lc1xuIiwgY29udGVudC0+dHlwZT9jb250ZW50LT50eXBlOiIiKSk7CisgIGlmIChzb2FwX3NlbmQzKHNvYXAsICJcclxuLS0iLCBzb2FwLT5taW1lLmJvdW5kYXJ5LCAiXHJcbiIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKGNvbnRlbnQtPnR5cGUgJiYgc29hcF9zZW5kMyhzb2FwLCAiQ29udGVudC1UeXBlOiAiLCBjb250ZW50LT50eXBlLCAiXHJcbiIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcyA9IHNvYXBfc3RyX2NvZGUobWltZV9jb2RlcywgY29udGVudC0+ZW5jb2RpbmcpOworICBpZiAocyAmJiBzb2FwX3NlbmQzKHNvYXAsICJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiAiLCBzLCAiXHJcbiIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKGNvbnRlbnQtPmlkICYmIHNvYXBfc2VuZDMoc29hcCwgIkNvbnRlbnQtSUQ6ICIsIGNvbnRlbnQtPmlkLCAiXHJcbiIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKGNvbnRlbnQtPmxvY2F0aW9uICYmIHNvYXBfc2VuZDMoc29hcCwgIkNvbnRlbnQtTG9jYXRpb246ICIsIGNvbnRlbnQtPmxvY2F0aW9uLCAiXHJcbiIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKGNvbnRlbnQtPmRlc2NyaXB0aW9uICYmIHNvYXBfc2VuZDMoc29hcCwgIkNvbnRlbnQtRGVzY3JpcHRpb246ICIsIGNvbnRlbnQtPmRlc2NyaXB0aW9uLCAiXHJcbiIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgIlxyXG4iLCAyKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dG1pbWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01JTUUpIHx8ICFzb2FwLT5taW1lLmJvdW5kYXJ5KQorICAgIHJldHVybiBTT0FQX09LOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNlbmRpbmcgTUlNRSBhdHRhY2htZW50c1xuIikpOworICBmb3IgKGNvbnRlbnQgPSBzb2FwLT5taW1lLmZpcnN0OyBjb250ZW50OyBjb250ZW50ID0gY29udGVudC0+bmV4dCkKKyAgICBpZiAoc29hcF9wdXRtaW1laGRyKHNvYXAsIGNvbnRlbnQpCisgICAgIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgY29udGVudC0+cHRyLCBjb250ZW50LT5zaXplKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfc2VuZDMoc29hcCwgIlxyXG4tLSIsIHNvYXAtPm1pbWUuYm91bmRhcnksICItLSIpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9kaW1lKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5vbW9kZSB8PSBTT0FQX0VOQ19ESU1FOworICBzb2FwLT5kaW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5sYXN0ID0gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfbWltZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqYm91bmRhcnksIGNvbnN0IGNoYXIgKnN0YXJ0KQoreyBzb2FwLT5vbW9kZSB8PSBTT0FQX0VOQ19NSU1FOworICBzb2FwLT5taW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5sYXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5ib3VuZGFyeSA9IHNvYXBfc3RyZHVwKHNvYXAsIGJvdW5kYXJ5KTsKKyAgc29hcC0+bWltZS5zdGFydCA9IHNvYXBfc3RyZHVwKHNvYXAsIHN0YXJ0KTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9jbHJfZGltZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+b21vZGUgJj0gflNPQVBfRU5DX0RJTUU7CisgIHNvYXAtPmRpbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmxhc3QgPSBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2Nscl9taW1lKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5vbW9kZSAmPSB+U09BUF9FTkNfTUlNRTsKKyAgc29hcC0+bWltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuYm91bmRhcnkgPSBOVUxMOworICBzb2FwLT5taW1lLnN0YXJ0ID0gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHN0cnVjdCBzb2FwX211bHRpcGFydCoKK3NvYXBfbmV3X211bHRpcGFydChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICoqZmlyc3QsIHN0cnVjdCBzb2FwX211bHRpcGFydCAqKmxhc3QsIGNoYXIgKnB0ciwgc2l6ZV90IHNpemUpCit7IHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgY29udGVudCA9IChzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQpKTsKKyAgaWYgKGNvbnRlbnQpCisgIHsgY29udGVudC0+bmV4dCA9IE5VTEw7CisgICAgY29udGVudC0+cHRyID0gcHRyOworICAgIGNvbnRlbnQtPnNpemUgPSBzaXplOworICAgIGNvbnRlbnQtPmlkID0gTlVMTDsKKyAgICBjb250ZW50LT50eXBlID0gTlVMTDsKKyAgICBjb250ZW50LT5vcHRpb25zID0gTlVMTDsKKyAgICBjb250ZW50LT5lbmNvZGluZyA9IFNPQVBfTUlNRV9OT05FOworICAgIGNvbnRlbnQtPmxvY2F0aW9uID0gTlVMTDsKKyAgICBjb250ZW50LT5kZXNjcmlwdGlvbiA9IE5VTEw7CisgICAgaWYgKCEqZmlyc3QpCisgICAgICAqZmlyc3QgPSBjb250ZW50OworICAgIGlmICgqbGFzdCkKKyAgICAgICgqbGFzdCktPm5leHQgPSBjb250ZW50OworICAgICpsYXN0ID0gY29udGVudDsKKyAgfQorICByZXR1cm4gY29udGVudDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NldF9kaW1lX2F0dGFjaG1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnB0ciwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmlkLCB1bnNpZ25lZCBzaG9ydCBvcHR5cGUsIGNvbnN0IGNoYXIgKm9wdGlvbikKK3sgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50ID0gc29hcF9uZXdfbXVsdGlwYXJ0KHNvYXAsICZzb2FwLT5kaW1lLmZpcnN0LCAmc29hcC0+ZGltZS5sYXN0LCBwdHIsIHNpemUpOworICBpZiAoIWNvbnRlbnQpCisgICAgcmV0dXJuIFNPQVBfRU9NOworICBjb250ZW50LT5pZCA9IHNvYXBfc3RyZHVwKHNvYXAsIGlkKTsKKyAgY29udGVudC0+dHlwZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHR5cGUpOworICBjb250ZW50LT5vcHRpb25zID0gc29hcF9kaW1lX29wdGlvbihzb2FwLCBvcHR5cGUsIG9wdGlvbik7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X21pbWVfYXR0YWNobWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqcHRyLCBzaXplX3Qgc2l6ZSwgZW51bSBzb2FwX21pbWVfZW5jb2RpbmcgZW5jb2RpbmcsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICpsb2NhdGlvbiwgY29uc3QgY2hhciAqZGVzY3JpcHRpb24pCit7IHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudCA9IHNvYXBfbmV3X211bHRpcGFydChzb2FwLCAmc29hcC0+bWltZS5maXJzdCwgJnNvYXAtPm1pbWUubGFzdCwgcHRyLCBzaXplKTsKKyAgaWYgKCFjb250ZW50KQorICAgIHJldHVybiBTT0FQX0VPTTsKKyAgY29udGVudC0+aWQgPSBzb2FwX3N0cmR1cChzb2FwLCBpZCk7CisgIGNvbnRlbnQtPnR5cGUgPSBzb2FwX3N0cmR1cChzb2FwLCB0eXBlKTsKKyAgY29udGVudC0+ZW5jb2RpbmcgPSBlbmNvZGluZzsKKyAgY29udGVudC0+bG9jYXRpb24gPSBzb2FwX3N0cmR1cChzb2FwLCBsb2NhdGlvbik7CisgIGNvbnRlbnQtPmRlc2NyaXB0aW9uID0gc29hcF9zdHJkdXAoc29hcCwgZGVzY3JpcHRpb24pOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc3RydWN0IHNvYXBfbXVsdGlwYXJ0KgorU09BUF9GTUFDMgorc29hcF9uZXh0X211bHRpcGFydChzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQpCit7IGlmIChjb250ZW50KQorICAgIHJldHVybiBjb250ZW50LT5uZXh0OworICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQKK3NvYXBfc2VsZWN0X21pbWVfYm91bmRhcnkoc3RydWN0IHNvYXAgKnNvYXApCit7IHdoaWxlICghc29hcC0+bWltZS5ib3VuZGFyeSB8fCBzb2FwX3ZhbGlkX21pbWVfYm91bmRhcnkoc29hcCkpCisgIHsgcmVnaXN0ZXIgY2hhciAqcyA9IHNvYXAtPm1pbWUuYm91bmRhcnk7CisgICAgcmVnaXN0ZXIgc2l6ZV90IG4gPSAwOworICAgIGlmIChzKQorICAgICAgbiA9IHN0cmxlbihzKTsKKyAgICBpZiAobiA8IDE2KQorICAgIHsgbiA9IDY0OworICAgICAgcyA9IHNvYXAtPm1pbWUuYm91bmRhcnkgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgbiArIDEpOworICAgICAgaWYgKCFzKQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0cmNweShzLCAiPT0iKTsKKyAgICBzICs9IDI7CisgICAgbiAtPSA0OworICAgIHdoaWxlIChuKQorICAgIHsgKnMrKyA9IHNvYXBfYmFzZTY0b1tzb2FwX3JhbmRvbSAmIDB4M0ZdOworICAgICAgbi0tOworICAgIH0KKyAgICBzdHJjcHkocywgIj09Iik7CisgIH0KKyAgaWYgKCFzb2FwLT5taW1lLnN0YXJ0KQorICAgIHNvYXAtPm1pbWUuc3RhcnQgPSAiPFNPQVAtRU5WOkVudmVsb3BlPiI7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NvYXBfdmFsaWRfbWltZV9ib3VuZGFyeShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICByZWdpc3RlciBzaXplX3QgayA9IHN0cmxlbihzb2FwLT5taW1lLmJvdW5kYXJ5KTsKKyAgZm9yIChjb250ZW50ID0gc29hcC0+bWltZS5maXJzdDsgY29udGVudDsgY29udGVudCA9IGNvbnRlbnQtPm5leHQpCisgIHsgaWYgKGNvbnRlbnQtPnB0ciAmJiBjb250ZW50LT5zaXplID49IGspCisgICAgeyByZWdpc3RlciBjb25zdCBjaGFyICpwID0gKGNvbnN0IGNoYXIqKWNvbnRlbnQtPnB0cjsgCisgICAgICByZWdpc3RlciBzaXplX3QgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjb250ZW50LT5zaXplIC0gazsgaSsrLCBwKyspCisgICAgICAgIGlmICghc3RybmNtcChwLCBzb2FwLT5taW1lLmJvdW5kYXJ5LCBrKSkKKyAgICAgICAgICByZXR1cm4gU09BUF9FUlI7CisgICAgfQorICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglIVFRQIGNvb2tpZSBoYW5kbGluZworICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBXSVRIX0NPT0tJRVMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitzaXplX3QKK1NPQVBfRk1BQzIKK3NvYXBfZW5jb2RlX2Nvb2tpZShjb25zdCBjaGFyICpzLCBjaGFyICp0LCBzaXplX3QgbGVuKQoreyByZWdpc3RlciBpbnQgYzsKKyAgcmVnaXN0ZXIgc2l6ZV90IG4gPSBsZW47CisgIHdoaWxlICgoYyA9ICpzKyspICYmIC0tbiA+IDApCisgIHsgaWYgKGMgPiAnICcgJiYgYyA8IDEyOCAmJiAhc3RyY2hyKCIoKTw+QCw7OlxcXCIvW10/PXt9IiwgYykpCisgICAgICAqdCsrID0gYzsKKyAgICBlbHNlIGlmIChuID4gMikKKyAgICB7ICp0KysgPSAnJSc7CisgICAgICAqdCsrID0gKGMgPj4gNCkgKyAoYyA+IDE1OSA/ICc3JyA6ICcwJyk7CisgICAgICBjICY9IDB4RjsKKyAgICAgICp0KysgPSBjICsgKGMgPiA5ID8gJzcnIDogJzAnKTsKKyAgICAgIG4gLT0gMjsKKyAgICB9CisgICAgZWxzZQorICAgICAgYnJlYWs7CisgIH0KKyAgKnQgPSAnXDAnOworICByZXR1cm4gbGVuIC0gbjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwX2Nvb2tpZSoKK1NPQVBfRk1BQzIKK3NvYXBfY29va2llKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgc2l6ZV90IG47CisgIGlmICghZG9tYWluKQorICAgIGRvbWFpbiA9IHNvYXAtPmNvb2tpZV9kb21haW47CisgIGlmICghcGF0aCkKKyAgICBwYXRoID0gc29hcC0+Y29va2llX3BhdGg7CisgIGlmICgqcGF0aCA9PSAnLycpCisgICAgcGF0aCsrOworICBuID0gc3RybGVuKHBhdGgpOworICBmb3IgKHAgPSBzb2FwLT5jb29raWVzOyBwOyBwID0gcC0+bmV4dCkKKyAgICBpZiAoIXN0cmNtcChwLT5uYW1lLCBuYW1lKQorICAgICAmJiBkb21haW4KKyAgICAgJiYgcC0+ZG9tYWluCisgICAgICYmICFzdHJjbXAocC0+ZG9tYWluLCBkb21haW4pCisgICAgICYmICFzdHJuY21wKHAtPnBhdGgsIHBhdGgsIG4pKQorICAgICAgYnJlYWs7CisgIHJldHVybiBwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQorc3RydWN0IHNvYXBfY29va2llKgorU09BUF9GTUFDMgorc29hcF9zZXRfY29va2llKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKipwLCAqcTsKKyAgaW50IG47CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2V0IGNvb2tpZTogJXM9JXMgZG9tYWluPSVzIHBhdGg9JXNcbiIsIG5hbWUsIHZhbHVlP3ZhbHVlOiIiLCBkb21haW4/ZG9tYWluOiIiLCBwYXRoP3BhdGg6IiIpKTsKKyAgaWYgKCFkb21haW4pCisgICAgZG9tYWluID0gc29hcC0+Y29va2llX2RvbWFpbjsKKyAgaWYgKCFwYXRoKQorICAgIHBhdGggPSBzb2FwLT5jb29raWVfcGF0aDsKKyAgaWYgKCFwYXRoKQorICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJDb29raWUgcGF0aCBub3Qgc2V0IiwgTlVMTCwgU09BUF9IVFRQX0VSUk9SKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoKnBhdGggPT0gJy8nKQorICAgIHBhdGgrKzsKKyAgcSA9IHNvYXBfY29va2llKHNvYXAsIG5hbWUsIGRvbWFpbiwgcGF0aCk7CisgIGlmICghcSkKKyAgeyBpZiAoKHEgPSAoc3RydWN0IHNvYXBfY29va2llKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfY29va2llKSkpKQorICAgIHsgaWYgKChxLT5uYW1lID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihuYW1lKSsxKSkpCisgICAgICAgIHN0cmNweShxLT5uYW1lLCBuYW1lKTsKKyAgICAgIHEtPnZhbHVlID0gTlVMTDsKKyAgICAgIHEtPmRvbWFpbiA9IE5VTEw7CisgICAgICBxLT5wYXRoID0gTlVMTDsKKyAgICAgIHEtPmV4cGlyZSA9IC0xOworICAgICAgcS0+dmVyc2lvbiA9IDA7CisgICAgICBxLT5zZWN1cmUgPSAwOworICAgICAgcS0+bW9kaWZpZWQgPSAwOworICAgICAgZm9yIChwID0gJnNvYXAtPmNvb2tpZXMsIG4gPSBzb2FwLT5jb29raWVfbWF4OyAqcCAmJiBuOyBwID0gJigqcCktPm5leHQsIG4tLSkKKyAgICAgICAgaWYgKCFzdHJjbXAoKCpwKS0+bmFtZSwgbmFtZSkgJiYgKCpwKS0+cGF0aCAmJiBzdHJjbXAoKCpwKS0+cGF0aCwgcGF0aCkgPCAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgaWYgKG4pCisgICAgICB7IHEtPm5leHQgPSAqcDsKKyAgICAgICAgKnAgPSBxOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBTT0FQX0ZSRUUoc29hcCwgcS0+bmFtZSk7CisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBxKTsKKyAgICAgICAgcSA9IE5VTEw7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyAgICBxLT5tb2RpZmllZCA9IDE7CisgIGlmIChxKQorICB7IGlmIChxLT52YWx1ZSkKKyAgICB7IFNPQVBfRlJFRShzb2FwLCBxLT52YWx1ZSk7CisgICAgICBxLT52YWx1ZSA9IE5VTEw7CisgICAgfQorICAgIGlmIChxLT5kb21haW4pCisgICAgeyBTT0FQX0ZSRUUoc29hcCwgcS0+ZG9tYWluKTsKKyAgICAgIHEtPmRvbWFpbiA9IE5VTEw7CisgICAgfQorICAgIGlmIChxLT5wYXRoKQorICAgIHsgU09BUF9GUkVFKHNvYXAsIHEtPnBhdGgpOworICAgICAgcS0+cGF0aCA9IE5VTEw7CisgICAgfQorICAgIGlmICh2YWx1ZSAmJiAqdmFsdWUgJiYgKHEtPnZhbHVlID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbih2YWx1ZSkrMSkpKQorICAgICAgc3RyY3B5KHEtPnZhbHVlLCB2YWx1ZSk7CisgICAgaWYgKGRvbWFpbiAmJiAqZG9tYWluICYmIChxLT5kb21haW4gPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKGRvbWFpbikrMSkpKQorICAgICAgc3RyY3B5KHEtPmRvbWFpbiwgZG9tYWluKTsKKyAgICBpZiAocGF0aCAmJiAqcGF0aCAmJiAocS0+cGF0aCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4ocGF0aCkrMSkpKQorICAgICAgc3RyY3B5KHEtPnBhdGgsIHBhdGgpOworICAgIHEtPnNlc3Npb24gPSAxOworICAgIHEtPmVudiA9IDA7CisgIH0KKyAgcmV0dXJuIHE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2Nscl9jb29raWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICoqcCwgKnE7CisgIGlmICghZG9tYWluKQorICAgIGRvbWFpbiA9IHNvYXAtPmNvb2tpZV9kb21haW47CisgIGlmICghZG9tYWluKQorICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJDb29raWUgZG9tYWluIG5vdCBzZXQiLCBOVUxMLCBTT0FQX0hUVFBfRVJST1IpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoIXBhdGgpCisgICAgcGF0aCA9IHNvYXAtPmNvb2tpZV9wYXRoOworICBpZiAoIXBhdGgpCisgIHsgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIkNvb2tpZSBwYXRoIG5vdCBzZXQiLCBOVUxMLCBTT0FQX0hUVFBfRVJST1IpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoKnBhdGggPT0gJy8nKQorICAgIHBhdGgrKzsKKyAgZm9yIChwID0gJnNvYXAtPmNvb2tpZXMsIHEgPSAqcDsgcTsgcSA9ICpwKQorICAgIGlmICghc3RyY21wKHEtPm5hbWUsIG5hbWUpICYmICFzdHJjbXAocS0+ZG9tYWluLCBkb21haW4pICYmICFzdHJuY21wKHEtPnBhdGgsIHBhdGgsIHN0cmxlbihxLT5wYXRoKSkpCisgICAgeyBpZiAocS0+dmFsdWUpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBxLT52YWx1ZSk7CisgICAgICBpZiAocS0+ZG9tYWluKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcS0+ZG9tYWluKTsKKyAgICAgIGlmIChxLT5wYXRoKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcS0+cGF0aCk7CisgICAgICAqcCA9IHEtPm5leHQ7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgcSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHAgPSAmcS0+bmV4dDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9jb29raWVfdmFsdWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBpZiAoKHAgPSBzb2FwX2Nvb2tpZShzb2FwLCBuYW1lLCBkb21haW4sIHBhdGgpKSkKKyAgICByZXR1cm4gcC0+dmFsdWU7CisgIHJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX2Vudl9jb29raWVfdmFsdWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBpZiAoKHAgPSBzb2FwX2Nvb2tpZShzb2FwLCBuYW1lLCBkb21haW4sIHBhdGgpKSAmJiBwLT5lbnYpCisgICAgcmV0dXJuIHAtPnZhbHVlOworICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2xvbmcKK1NPQVBfRk1BQzIKK3NvYXBfY29va2llX2V4cGlyZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGlmICgocCA9IHNvYXBfY29va2llKHNvYXAsIG5hbWUsIGRvbWFpbiwgcGF0aCkpKQorICAgIHJldHVybiBwLT5leHBpcmU7CisgIHJldHVybiAtMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZXRfY29va2llX2V4cGlyZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgbG9uZyBleHBpcmUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBpZiAoKHAgPSBzb2FwX2Nvb2tpZShzb2FwLCBuYW1lLCBkb21haW4sIHBhdGgpKSkKKyAgeyBwLT5leHBpcmUgPSBleHBpcmU7CisgICAgcC0+bW9kaWZpZWQgPSAxOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIHJldHVybiBTT0FQX0VSUjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZXRfY29va2llX3Nlc3Npb24oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBpZiAoKHAgPSBzb2FwX2Nvb2tpZShzb2FwLCBuYW1lLCBkb21haW4sIHBhdGgpKSkKKyAgeyBwLT5zZXNzaW9uID0gMTsKKyAgICBwLT5tb2RpZmllZCA9IDE7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgcmV0dXJuIFNPQVBfRVJSOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2Nscl9jb29raWVfc2Vzc2lvbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGlmICgocCA9IHNvYXBfY29va2llKHNvYXAsIG5hbWUsIGRvbWFpbiwgcGF0aCkpKQorICB7IHAtPnNlc3Npb24gPSAwOworICAgIHAtPm1vZGlmaWVkID0gMTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICByZXR1cm4gU09BUF9FUlI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0c2V0Y29va2llcyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBjaGFyICpzLCB0bXBbNDA5Nl07CisgIGNvbnN0IGNoYXIgKnQ7CisgIGZvciAocCA9IHNvYXAtPmNvb2tpZXM7IHA7IHAgPSBwLT5uZXh0KQorICB7IGlmIChwLT5tb2RpZmllZCB8fCAhcC0+ZW52KQorICAgIHsgcyA9IHRtcDsKKyAgICAgIGlmIChwLT5uYW1lKQorICAgICAgICBzICs9IHNvYXBfZW5jb2RlX2Nvb2tpZShwLT5uYW1lLCBzLCB0bXAtcys0MDY0KTsKKyAgICAgIGlmIChwLT52YWx1ZSAmJiAqcC0+dmFsdWUpCisgICAgICB7ICpzKysgPSAnPSc7CisgICAgICAgIHMgKz0gc29hcF9lbmNvZGVfY29va2llKHAtPnZhbHVlLCBzLCB0bXAtcys0MDY0KTsKKyAgICAgIH0KKyAgICAgIGlmIChwLT5kb21haW4gJiYgKGludClzdHJsZW4ocC0+ZG9tYWluKSA8IHRtcC1zKzQwNjQpCisgICAgICAgIHNwcmludGYocywgIjtEb21haW49XCIlc1wiIiwgcC0+ZG9tYWluKTsKKyAgICAgIGVsc2UgaWYgKHNvYXAtPmNvb2tpZV9kb21haW4gJiYgKGludClzdHJsZW4oc29hcC0+Y29va2llX2RvbWFpbikgPCB0bXAtcys0MDY0KQorICAgICAgICBzcHJpbnRmKHMsICI7RG9tYWluPVwiJXNcIiIsIHNvYXAtPmNvb2tpZV9kb21haW4pOworICAgICAgc3RyY2F0KHMsICI7UGF0aD1cIi8iKTsKKyAgICAgIGlmIChwLT5wYXRoKQorICAgICAgICB0ID0gcC0+cGF0aDsKKyAgICAgIGVsc2UKKyAgICAgICAgdCA9IHNvYXAtPmNvb2tpZV9wYXRoOworICAgICAgaWYgKHQpCisgICAgICB7IGlmICgqdCA9PSAnLycpCisgICAgICAgICAgdCsrOworICAgICAgICBpZiAoKGludClzdHJsZW4odCkgPCB0bXAtcys0MDY0KQorICAgICAgICAgIHN0cmNhdChzLCB0KTsKKyAgICAgIH0KKyAgICAgIHMgKz0gc3RybGVuKHMpOworICAgICAgKnMrKyA9ICciJzsKKyAgICAgIGlmIChwLT52ZXJzaW9uID4gMCkKKyAgICAgICAgc3ByaW50ZihzLCAiO1ZlcnNpb249JXUiLCBwLT52ZXJzaW9uKTsKKyAgICAgIGlmIChwLT5leHBpcmUgPj0gMCkKKyAgICAgICAgc3ByaW50ZihzLCAiO01heC1BZ2U9JWxkIiwgcC0+ZXhwaXJlKTsKKyAgICAgIGlmIChwLT5zZWN1cmUpCisgICAgICAgIHN0cmNhdChzLCAiO1NlY3VyZSIpOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTZXQtQ29va2llOiAlc1xuIiwgdG1wKSk7CisgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlNldC1Db29raWUiLCB0bXApKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRjb29raWVzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgsIGludCBzZWN1cmUpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqKnAsICpxOworICB1bnNpZ25lZCBpbnQgdmVyc2lvbiA9IDA7CisgIHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOworICBjaGFyICpzLCB0bXBbNDA5Nl07CisgIHAgPSAmc29hcC0+Y29va2llczsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTZW5kaW5nIGNvb2tpZXMgZm9yIGRvbWFpbj0lcyBwYXRoPSVzXG4iLCBkb21haW4sIHBhdGgpKTsKKyAgaWYgKCpwYXRoID09ICcvJykKKyAgICBwYXRoKys7CisgIHdoaWxlICgocSA9ICpwKSkKKyAgeyBpZiAocS0+ZXhwaXJlICYmIG5vdyA+IHEtPmV4cGlyZSkKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29va2llICVzIGV4cGlyZWRcbiIsIHEtPm5hbWUpKTsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBxLT5uYW1lKTsKKyAgICAgIGlmIChxLT52YWx1ZSkKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHEtPnZhbHVlKTsKKyAgICAgIGlmIChxLT5kb21haW4pCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBxLT5kb21haW4pOworICAgICAgaWYgKHEtPnBhdGgpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBxLT5wYXRoKTsKKyAgICAgICpwID0gcS0+bmV4dDsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBxKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgc2l6ZV90IGRvbWxlbiA9IDA7CisgICAgICBpZiAocS0+ZG9tYWluKQorICAgICAgeyBjb25zdCBjaGFyICpzID0gc3RyY2hyKHEtPmRvbWFpbiwgJzonKTsKKyAgICAgICAgaWYgKHMpCisJICBkb21sZW4gPSBzIC0gcS0+ZG9tYWluOworCWVsc2UKKyAgICAgICAgICBkb21sZW4gPSBzdHJsZW4ocS0+ZG9tYWluKTsKKyAgICAgIH0KKyAgICAgIGlmICgoIXEtPmRvbWFpbiB8fCAhc3RybmNtcChxLT5kb21haW4sIGRvbWFpbiwgZG9tbGVuKSkKKyAgICAgICAgICAmJiAoIXEtPnBhdGggfHwgIXN0cm5jbXAocS0+cGF0aCwgcGF0aCwgc3RybGVuKHEtPnBhdGgpKSkKKyAgICAgICAgICAmJiAoIXEtPnNlY3VyZSB8fCBzZWN1cmUpKQorICAgICAgeyBzID0gdG1wOworICAgICAgICBpZiAocS0+dmVyc2lvbiAhPSB2ZXJzaW9uKQorICAgICAgICB7IHNwcmludGYocywgIiRWZXJzaW9uPSV1OyIsIHEtPnZlcnNpb24pOworICAgICAgICAgIHZlcnNpb24gPSBxLT52ZXJzaW9uOworICAgICAgICB9CisgICAgICAgIGlmIChxLT5uYW1lKQorICAgICAgICAgIHMgKz0gc29hcF9lbmNvZGVfY29va2llKHEtPm5hbWUsIHMsIHRtcC1zKzQwODApOworICAgICAgICBpZiAocS0+dmFsdWUgJiYgKnEtPnZhbHVlKQorICAgICAgICB7ICpzKysgPSAnPSc7CisgICAgICAgICAgcyArPSBzb2FwX2VuY29kZV9jb29raWUocS0+dmFsdWUsIHMsIHRtcC1zKzQwODApOworICAgICAgICB9CisgICAgICAgIGlmIChxLT5wYXRoICYmIChpbnQpc3RybGVuKHEtPnBhdGgpIDwgdG1wLXMrNDA4MCkKKyAgICAgICAgeyBzcHJpbnRmKHMsICI7JFBhdGg9XCIvJXNcIiIsICgqcS0+cGF0aCA9PSAnLycgPyBxLT5wYXRoICsgMSA6IHEtPnBhdGgpKTsKKyAgICAgICAgICBzICs9IHN0cmxlbihzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocS0+ZG9tYWluICYmIChpbnQpc3RybGVuKHEtPmRvbWFpbikgPCB0bXAtcys0MDgwKQorICAgICAgICAgIHNwcmludGYocywgIjskRG9tYWluPVwiJXNcIiIsIHEtPmRvbWFpbik7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29va2llOiAlc1xuIiwgdG1wKSk7CisgICAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQ29va2llIiwgdG1wKSkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgICAgcCA9ICZxLT5uZXh0OworICAgIH0KKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0Y29va2llcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdmFsKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnAgPSBOVUxMLCAqcTsKKyAgY29uc3QgY2hhciAqczsKKyAgY2hhciAqdCwgdG1wWzQwOTZdOyAvKiBjb29raWUgc2l6ZSBpcyB1cCB0byA0MDk2IGJ5dGVzIFtSRkMyMTA5XSAqLworICBjaGFyICpkb21haW4gPSBOVUxMOworICBjaGFyICpwYXRoID0gTlVMTDsKKyAgdW5zaWduZWQgaW50IHZlcnNpb24gPSAwOworICB0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKKyAgaWYgKCF2YWwpCisgICAgcmV0dXJuOworICBzID0gdmFsOworICB3aGlsZSAoKnMpCisgIHsgcyA9IHNvYXBfZGVjb2RlX2tleSh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICBpZiAoIXNvYXBfdGFnX2NtcCh0bXAsICIkVmVyc2lvbiIpKQorICAgIHsgaWYgKChzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpKSkKKyAgICAgIHsgaWYgKHApCisgICAgICAgICAgcC0+dmVyc2lvbiA9IChpbnQpYXRvbCh0bXApOworICAgICAgICBlbHNlCisgICAgICAgICAgdmVyc2lvbiA9IChpbnQpYXRvbCh0bXApOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHRtcCwgIiRQYXRoIikpCisgICAgeyBzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgICAgaWYgKCp0bXApCisgICAgICB7IGlmICgodCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4odG1wKSsxKSkpCisgICAgICAgICAgc3RyY3B5KHQsIHRtcCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHQgPSBOVUxMOworICAgICAgaWYgKHApCisgICAgICB7IGlmIChwLT5wYXRoKQorICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5wYXRoKTsKKyAgICAgICAgcC0+cGF0aCA9IHQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IGlmIChwYXRoKQorICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwYXRoKTsKKyAgICAgICAgcGF0aCA9IHQ7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAodG1wLCAiJERvbWFpbiIpKQorICAgIHsgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgIGlmICgqdG1wKQorICAgICAgeyBpZiAoKHQgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHRtcCkrMSkpKQorICAgICAgICAgIHN0cmNweSh0LCB0bXApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB0ID0gTlVMTDsKKyAgICAgIGlmIChwKQorICAgICAgeyBpZiAocC0+ZG9tYWluKQorICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5kb21haW4pOworCXAtPmRvbWFpbiA9IHQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IGlmIChkb21haW4pCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIGRvbWFpbik7CisgICAgICAgIGRvbWFpbiA9IHQ7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHAgJiYgIXNvYXBfdGFnX2NtcCh0bXAsICJQYXRoIikpCisgICAgeyBpZiAocC0+cGF0aCkKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnBhdGgpOworICAgICAgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgIGlmICgqdG1wKQorICAgICAgeyBpZiAoKHAtPnBhdGggPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHRtcCkrMSkpKQorICAgICAgICAgIHN0cmNweShwLT5wYXRoLCB0bXApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBwLT5wYXRoID0gTlVMTDsKKyAgICB9CisgICAgZWxzZSBpZiAocCAmJiAhc29hcF90YWdfY21wKHRtcCwgIkRvbWFpbiIpKQorICAgIHsgaWYgKHAtPmRvbWFpbikKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPmRvbWFpbik7CisgICAgICBzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgICAgaWYgKCp0bXApCisgICAgICB7IGlmICgocC0+ZG9tYWluID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbih0bXApKzEpKSkKKyAgICAgICAgICBzdHJjcHkocC0+ZG9tYWluLCB0bXApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBwLT5kb21haW4gPSBOVUxMOworICAgIH0KKyAgICBlbHNlIGlmIChwICYmICFzb2FwX3RhZ19jbXAodG1wLCAiVmVyc2lvbiIpKQorICAgIHsgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgIHAtPnZlcnNpb24gPSAodW5zaWduZWQgaW50KWF0b2wodG1wKTsKKyAgICB9CisgICAgZWxzZSBpZiAocCAmJiAhc29hcF90YWdfY21wKHRtcCwgIk1heC1BZ2UiKSkKKyAgICB7IHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICBwLT5leHBpcmUgPSBub3cgKyBhdG9sKHRtcCk7CisgICAgfQorICAgIGVsc2UgaWYgKHAgJiYgIXNvYXBfdGFnX2NtcCh0bXAsICJFeHBpcmVzIikpCisgICAgeyBzdHJ1Y3QgdG0gVDsKKyAgICAgIGNoYXIgYVszXTsgCisgICAgICBzdGF0aWMgY29uc3QgY2hhciBtbnNbXSA9ICJhbmViYXJwcmF5dW51bHVnZXBjdG92ZWMiOworICAgICAgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgIGlmIChzdHJsZW4odG1wKSA+IDIwKQorICAgICAgeyBtZW1zZXQoKHZvaWQqKSZULCAwLCBzaXplb2YoVCkpOworICAgICAgICBhWzBdID0gdG1wWzRdOworICAgICAgICBhWzFdID0gdG1wWzVdOworICAgICAgICBhWzJdID0gJ1wwJzsKKyAgICAgICAgVC50bV9tZGF5ID0gKGludClhdG9sKGEpOworICAgICAgICBhWzBdID0gdG1wWzhdOworICAgICAgICBhWzFdID0gdG1wWzldOworICAgICAgICBULnRtX21vbiA9IChzdHJzdHIobW5zLCBhKSAtIG1ucykgLyAyOworICAgICAgICBhWzBdID0gdG1wWzExXTsKKyAgICAgICAgYVsxXSA9IHRtcFsxMl07CisgICAgICAgIFQudG1feWVhciA9IDEwMCArIChpbnQpYXRvbChhKTsKKyAgICAgICAgYVswXSA9IHRtcFsxM107CisgICAgICAgIGFbMV0gPSB0bXBbMTRdOworICAgICAgICBULnRtX2hvdXIgPSAoaW50KWF0b2woYSk7CisgICAgICAgIGFbMF0gPSB0bXBbMTZdOworICAgICAgICBhWzFdID0gdG1wWzE3XTsKKyAgICAgICAgVC50bV9taW4gPSAoaW50KWF0b2woYSk7CisgICAgICAgIGFbMF0gPSB0bXBbMTldOworICAgICAgICBhWzFdID0gdG1wWzIwXTsKKyAgICAgICAgVC50bV9zZWMgPSAoaW50KWF0b2woYSk7CisgICAgICAgIHAtPmV4cGlyZSA9IHNvYXBfdGltZWdtKCZUKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAocCAmJiAhc29hcF90YWdfY21wKHRtcCwgIlNlY3VyZSIpKQorICAgICAgcC0+c2VjdXJlID0gMTsKKyAgICBlbHNlCisgICAgeyBpZiAocCkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHb3QgZW52aXJvbm1lbnQgY29va2llICVzPSVzIGRvbWFpbj0lcyBwYXRoPSVzIGV4cGlyZT0lbGQgc2VjdXJlPSVkXG4iLCBwLT5uYW1lLCBwLT52YWx1ZT9wLT52YWx1ZToiIiwgcC0+ZG9tYWluP3AtPmRvbWFpbjoiIiwgcC0+cGF0aD9wLT5wYXRoOiIiLCBwLT5leHBpcmUsIHAtPnNlY3VyZSkpOworICAgICAgICBpZiAoKHEgPSBzb2FwX3NldF9jb29raWUoc29hcCwgcC0+bmFtZSwgcC0+dmFsdWUsIHAtPmRvbWFpbiwgcC0+cGF0aCkpKQorICAgICAgICB7IHEtPnZlcnNpb24gPSBwLT52ZXJzaW9uOworICAgICAgICAgIHEtPmV4cGlyZSA9IHAtPmV4cGlyZTsKKyAgICAgICAgICBxLT5zZWN1cmUgPSBwLT5zZWN1cmU7CisgICAgICAgICAgcS0+ZW52ID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAocC0+bmFtZSkKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+bmFtZSk7CisgICAgICAgIGlmIChwLT52YWx1ZSkKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+dmFsdWUpOworICAgICAgICBpZiAocC0+ZG9tYWluKQorICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5kb21haW4pOworICAgICAgICBpZiAocC0+cGF0aCkKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+cGF0aCk7CisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwKTsKKyAgICAgIH0KKyAgICAgIGlmICgocCA9IChzdHJ1Y3Qgc29hcF9jb29raWUqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9jb29raWUpKSkpCisgICAgICB7IHAtPm5hbWUgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHRtcCkrMSk7CisgICAgICAgIHN0cmNweShwLT5uYW1lLCB0bXApOworICAgICAgICBzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgICAgICBpZiAoKnRtcCkKKyAgICAgICAgeyBwLT52YWx1ZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4odG1wKSsxKTsKKyAgICAgICAgICBzdHJjcHkocC0+dmFsdWUsIHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHAtPnZhbHVlID0gTlVMTDsKKyAgICAgICAgcC0+ZG9tYWluID0gZG9tYWluOworICAgICAgICBwLT5wYXRoID0gcGF0aDsKKyAgICAgICAgcC0+ZXhwaXJlID0gMDsKKyAgICAgICAgcC0+c2VjdXJlID0gMDsKKyAgICAgICAgcC0+dmVyc2lvbiA9IHZlcnNpb247CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChwKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR290IGVudmlyb25tZW50IGNvb2tpZSAlcz0lcyBkb21haW49JXMgcGF0aD0lcyBleHBpcmU9JWxkIHNlY3VyZT0lZFxuIiwgcC0+bmFtZSwgcC0+dmFsdWU/cC0+dmFsdWU6IiIsIHAtPmRvbWFpbj9wLT5kb21haW46IiIsIHAtPnBhdGg/cC0+cGF0aDoiIiwgcC0+ZXhwaXJlLCBwLT5zZWN1cmUpKTsKKyAgICBpZiAoKHEgPSBzb2FwX3NldF9jb29raWUoc29hcCwgcC0+bmFtZSwgcC0+dmFsdWUsIHAtPmRvbWFpbiwgcC0+cGF0aCkpKQorICAgIHsgcS0+dmVyc2lvbiA9IHAtPnZlcnNpb247CisgICAgICBxLT5leHBpcmUgPSBwLT5leHBpcmU7CisgICAgICBxLT5zZWN1cmUgPSBwLT5zZWN1cmU7CisgICAgICBxLT5lbnYgPSAxOworICAgIH0KKyAgICBpZiAocC0+bmFtZSkKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5uYW1lKTsKKyAgICBpZiAocC0+dmFsdWUpCisgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+dmFsdWUpOworICAgIGlmIChwLT5kb21haW4pCisgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+ZG9tYWluKTsKKyAgICBpZiAocC0+cGF0aCkKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5wYXRoKTsKKyAgICBTT0FQX0ZSRUUoc29hcCwgcCk7CisgIH0KKyAgaWYgKGRvbWFpbikKKyAgICBTT0FQX0ZSRUUoc29hcCwgZG9tYWluKTsKKyAgaWYgKHBhdGgpCisgICAgU09BUF9GUkVFKHNvYXAsIHBhdGgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldGVudl9jb29raWVzKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGNvbnN0IGNoYXIgKnM7CisgIGNoYXIga2V5WzQwOTZdLCB2YWxbNDA5Nl07IC8qIGNvb2tpZSBzaXplIGlzIHVwIHRvIDQwOTYgYnl0ZXMgW1JGQzIxMDldICovCisgIGlmICghKHMgPSBnZXRlbnYoIkhUVFBfQ09PS0lFIikpKQorICAgIHJldHVybiBTT0FQX0VSUjsKKyAgZG8KKyAgeyBzID0gc29hcF9kZWNvZGVfa2V5KGtleSwgc2l6ZW9mKGtleSksIHMpOworICAgIHMgPSBzb2FwX2RlY29kZV92YWwodmFsLCBzaXplb2YodmFsKSwgcyk7CisgICAgcCA9IHNvYXBfc2V0X2Nvb2tpZShzb2FwLCBrZXksIHZhbCwgTlVMTCwgTlVMTCk7CisgICAgaWYgKHApCisgICAgICBwLT5lbnYgPSAxOworICB9IHdoaWxlICgqcyk7CisgIHJldHVybiBTT0FQX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQorc3RydWN0IHNvYXBfY29va2llKgorU09BUF9GTUFDMgorc29hcF9jb3B5X2Nvb2tpZXMoc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcCwgKipxLCAqcjsKKyAgcSA9ICZyOworICBmb3IgKHAgPSBzb2FwLT5jb29raWVzOyBwOyBwID0gcC0+bmV4dCkKKyAgeyBpZiAoISgqcSA9IChzdHJ1Y3Qgc29hcF9jb29raWUqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9jb29raWUpKSkpCisgICAgICByZXR1cm4gcjsKKyAgICAqKnEgPSAqcDsKKyAgICBpZiAocC0+bmFtZSkKKyAgICB7IGlmICgoKCpxKS0+bmFtZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4ocC0+bmFtZSkrMSkpKQorICAgICAgICBzdHJjcHkoKCpxKS0+bmFtZSwgcC0+bmFtZSk7CisgICAgfQorICAgIGlmIChwLT52YWx1ZSkKKyAgICB7IGlmICgoKCpxKS0+dmFsdWUgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHAtPnZhbHVlKSsxKSkpCisgICAgICAgIHN0cmNweSgoKnEpLT52YWx1ZSwgcC0+dmFsdWUpOworICAgIH0KKyAgICBpZiAocC0+ZG9tYWluKQorICAgIHsgaWYgKCgoKnEpLT5kb21haW4gPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHAtPmRvbWFpbikrMSkpKQorICAgICAgICBzdHJjcHkoKCpxKS0+ZG9tYWluLCBwLT5kb21haW4pOworICAgIH0KKyAgICBpZiAocC0+cGF0aCkKKyAgICB7IGlmICgoKCpxKS0+cGF0aCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4ocC0+cGF0aCkrMSkpKQorICAgICAgICBzdHJjcHkoKCpxKS0+cGF0aCwgcC0+cGF0aCk7CisgICAgfQorICAgIHEgPSAmKCpxKS0+bmV4dDsKKyAgfQorICAqcSA9IE5VTEw7CisgIHJldHVybiByOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9mcmVlX2Nvb2tpZXMoc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgZm9yIChwID0gc29hcC0+Y29va2llczsgcDsgcCA9IHNvYXAtPmNvb2tpZXMpCisgIHsgc29hcC0+Y29va2llcyA9IHAtPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIHAtPm5hbWUpOworICAgIGlmIChwLT52YWx1ZSkKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT52YWx1ZSk7CisgICAgaWYgKHAtPmRvbWFpbikKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5kb21haW4pOworICAgIGlmIChwLT5wYXRoKQorICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnBhdGgpOworICAgIFNPQVBfRlJFRShzb2FwLCBwKTsKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2VuZGlmIC8qIFdJVEhfQ09PS0lFUyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFdJVEhfR1pJUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NvYXBfZ2V0Z3ppcGhkcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaW50IGk7CisgIHNvYXBfd2NoYXIgYywgZiA9IDA7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR2V0IGd6aXAgaGVhZGVyXG4iKSk7CisgIGZvciAoaSA9IDA7IGkgPCA5OyBpKyspCisgIHsgaWYgKChpbnQpKGMgPSBzb2FwX2dldDEoc29hcCkgPT0gRU9GKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgIGlmIChpID09IDIpCisgICAgICBmID0gYzsKKyAgfQorICBpZiAoZiAmIDB4MDQpIC8qIEZFWFRSQSAqLworICB7IGZvciAoaSA9IHNvYXBfZ2V0MShzb2FwKSB8IChzb2FwX2dldDEoc29hcCkgPDwgOCk7IGk7IGktLSkKKyAgICAgIGlmICgoaW50KXNvYXBfZ2V0MShzb2FwKSA9PSBFT0YpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICB9CisgIGlmIChmICYgMHgwOCkgLyogRk5BTUUgKi8KKyAgICBkbworICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICB3aGlsZSAoYyAmJiAoaW50KWMgIT0gRU9GKTsKKyAgaWYgKChpbnQpYyAhPSBFT0YgJiYgKGYgJiAweDEwKSkgLyogRkNPTU1FTlQgKi8KKyAgICBkbworICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICB3aGlsZSAoYyAmJiAoaW50KWYgIT0gRU9GKTsKKyAgaWYgKChpbnQpYyAhPSBFT0YgJiYgKGYgJiAweDAxKSkgLyogRkhDUkMgKi8KKyAgeyBpZiAoKGludCkoYyA9IHNvYXBfZ2V0MShzb2FwKSkgIT0gRU9GKQorICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgfQorICBpZiAoKGludCljID09IEVPRikKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9iZWdpbl9yZWN2KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwX3djaGFyIGM7CisgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgc29hcF9mcmVlKHNvYXApOworICBzb2FwX3NldF9sb2NhbF9uYW1lc3BhY2VzKHNvYXApOworICBzb2FwLT52ZXJzaW9uID0gMDsJLyogZG9uJ3QgYXNzdW1lIHdlJ3JlIHBhcnNpbmcgU09BUCBjb250ZW50IGJ5IGRlZmF1bHQgKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgIHNvYXBfZnJlZV9paHQoc29hcCk7CisjZW5kaWYKKyAgaWYgKChzb2FwLT5pbW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgICAgc29hcC0+b21vZGUgfD0gU09BUF9JT19DSFVOSzsKKyAgc29hcC0+aW1vZGUgJj0gflNPQVBfSU87CisgIHNvYXAtPm1vZGUgPSBzb2FwLT5pbW9kZTsKKyAgaWYgKCFzb2FwLT5rZWVwX2FsaXZlKQorICB7IHNvYXAtPmJ1ZmxlbiA9IDA7CisgICAgc29hcC0+YnVmaWR4ID0gMDsKKyAgfQorICBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9JT19LRUVQQUxJVkUpKQorICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOworICBzb2FwLT5haGVhZCA9IDA7CisgIHNvYXAtPnBlZWtlZCA9IDA7CisgIHNvYXAtPmxldmVsID0gMDsKKyAgc29hcC0+cGFydCA9IFNPQVBfQkVHSU47CisgIHNvYXAtPmFsbG9jZWQgPSAwOworICBzb2FwLT5jb3VudCA9IDA7CisgIHNvYXAtPmxlbmd0aCA9IDA7CisgIHNvYXAtPmNkYXRhID0gMDsKKyAgKnNvYXAtPmVuZHBvaW50ID0gJ1wwJzsKKyAgc29hcC0+YWN0aW9uID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcC0+ZG9tID0gTlVMTDsKKyAgc29hcC0+ZGltZS5jaHVua3NpemUgPSAwOworICBzb2FwLT5kaW1lLmJ1ZmxlbiA9IDA7CisgIHNvYXAtPmRpbWUubGlzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmxhc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmxpc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5sYXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5ib3VuZGFyeSA9IE5VTEw7CisgIHNvYXAtPm1pbWUuc3RhcnQgPSBOVUxMOworICBzb2FwLT54bGlzdCA9IE5VTEw7CisjZW5kaWYKKyNpZmRlZiBXSU4zMgorI2lmbmRlZiBVTkRFUl9DRQorI2lmbmRlZiBXSVRIX0ZBU1RDR0kKKyAgaWYgKCFzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorI2lmZGVmIF9fQk9STEFORENfXworICAgIHNldG1vZGUoKFNPQVBfU09DS0VUKXNvYXAtPnJlY3ZmZCwgT19CSU5BUlkpOworI2Vsc2UKKyAgICBfc2V0bW9kZSgoU09BUF9TT0NLRVQpc29hcC0+cmVjdmZkLCBfT19CSU5BUlkpOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgV0lUSF9aTElCCisgIHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX1pMSUI7CisgIHNvYXAtPnpsaWJfaW4gPSBTT0FQX1pMSUJfTk9ORTsKKyAgc29hcC0+emxpYl9vdXQgPSBTT0FQX1pMSUJfTk9ORTsKKyAgc29hcC0+ZF9zdHJlYW0ubmV4dF9pbiA9IFpfTlVMTDsKKyAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4gPSAwOworICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IChCeXRlKilzb2FwLT5idWY7CisgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCA9IFNPQVBfQlVGTEVOOworICBzb2FwLT56X3JhdGlvX2luID0gMS4wOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5mcHJlcGFyZWluaXQpCisgICAgc29hcC0+ZnByZXBhcmVpbml0KHNvYXApOworI2VuZGlmCisgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisjaWZkZWYgV0lUSF9HWklQCisgIGlmIChjID09IDB4MUYpCisgIHsgaWYgKHNvYXBfZ2V0Z3ppcGhkcihzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAoaW5mbGF0ZUluaXQyKCZzb2FwLT5kX3N0cmVhbSwgLU1BWF9XQklUUykgIT0gWl9PSykKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX0lORkxBVEU7CisgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19aTElCOworICAgIHNvYXAtPnpsaWJfaW4gPSBTT0FQX1pMSUJfR1pJUDsKKyAgICBzb2FwLT56X2NyYyA9IGNyYzMyKDBMLCBOVUxMLCAwKTsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImd6aXAgaW5pdGlhbGl6ZWRcbiIpKTsKKyAgICBtZW1jcHkoc29hcC0+el9idWYsIHNvYXAtPmJ1ZiwgU09BUF9CVUZMRU4pOworICAgIC8qIHNob3VsZCBub3QgY2h1bmsgb3ZlciBwbGFpbiB0cmFuc3BvcnQsIHNvIHdoeSBib3RoZXIgdG8gY2hlY2s/ICovCisgICAgLyogaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykgKi8KKyAgICAvKiAgIHNvYXAtPnpfYnVmbGVuID0gc29hcC0+YnVmaWR4OyAqLworICAgIC8qIGVsc2UgKi8KKyAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X2luID0gKEJ5dGUqKShzb2FwLT56X2J1ZiArIHNvYXAtPmJ1ZmlkeCk7CisgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4gPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgc29hcC0+el9idWZsZW4gPSBzb2FwLT5idWZsZW47CisgICAgc29hcC0+YnVmbGVuID0gc29hcC0+YnVmaWR4OworICAgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgIH0gIAorI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChjID09ICctJyAmJiBzb2FwX2dldDAoc29hcCkgPT0gJy0nKQorICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfTUlNRTsKKyAgZWxzZSBpZiAoKGMgJiAweEZGRkMpID09IChTT0FQX0RJTUVfVkVSU0lPTiB8IFNPQVBfRElNRV9NQikgJiYgKHNvYXBfZ2V0MChzb2FwKSAmIDB4RkZGMCkgPT0gMHgyMCkKKyAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX0RJTUU7CisgIGVsc2UKKyNlbmRpZgorICB7IHdoaWxlIChzb2FwX2JsYW5rKGMpKQorICAgICAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgfQorICBpZiAoKGludCljID09IEVPRikKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgc29hcF91bmdldChzb2FwLCBjKTsKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyAgLyogaWYgbm90IFhNTCBvciAoc3RhcnQgb2YpQk9NIG9yIE1JTUUvRElNRS9aTElCLCBhc3N1bWUgSFRUUCBoZWFkZXIgKi8KKyAgaWYgKGMgIT0gJzwnICYmIGMgIT0gMHhFRiAmJiAhKHNvYXAtPm1vZGUgJiAoU09BUF9FTkNfTUlNRSB8IFNPQVBfRU5DX0RJTUUgfCBTT0FQX0VOQ19aTElCKSkpCisgIHsgc29hcC0+bW9kZSAmPSB+U09BUF9JTzsKKyAgICBzb2FwLT5lcnJvciA9IHNvYXAtPmZwYXJzZShzb2FwKTsKKyAgICBpZiAoc29hcC0+ZXJyb3IgJiYgc29hcC0+ZXJyb3IgPCBTT0FQX1NUT1ApCisgICAgeyBzb2FwLT5rZWVwX2FsaXZlID0gMDsgLyogZm9yY2UgY2xvc2UgbGF0ZXIgKi8KKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgICB7IHNvYXAtPmNodW5rYnVmbGVuID0gc29hcC0+YnVmbGVuOworICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+YnVmaWR4OworICAgICAgc29hcC0+Y2h1bmtzaXplID0gMDsKKyAgICB9CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgICAgZWxzZSBpZiAoc29hcC0+ZnByZXBhcmVyZWN2ICYmIHNvYXAtPmJ1ZmxlbiAhPSBzb2FwLT5idWZpZHgpCisgICAgICBzb2FwLT5mcHJlcGFyZXJlY3Yoc29hcCwgc29hcC0+YnVmICsgc29hcC0+YnVmaWR4LCBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHgpOworI2VuZGlmCisjaWZkZWYgV0lUSF9aTElCCisgICAgaWYgKHNvYXAtPnpsaWJfaW4gIT0gU09BUF9aTElCX05PTkUpCisgICAgeyAvKiBmcGFyc2Ugc2hvdWxkIG5vdCB1c2Ugc29hcF91bmdldCB0byBwdXNoIGJhY2sgbGFzdCBjaGFyICovCisjaWZkZWYgV0lUSF9HWklQCisgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgaWYgKGMgPT0gMHgxRikKKyAgICAgIHsgaWYgKHNvYXBfZ2V0Z3ppcGhkcihzb2FwKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIGlmIChpbmZsYXRlSW5pdDIoJnNvYXAtPmRfc3RyZWFtLCAtTUFYX1dCSVRTKSAhPSBaX09LKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICAgICAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9JTkZMQVRFOworICAgICAgICBzb2FwLT56X2NyYyA9IGNyYzMyKDBMLCBOVUxMLCAwKTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJnemlwIGluaXRpYWxpemVkXG4iKSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IHNvYXBfcmV2Z2V0MShzb2FwKTsKKyNlbHNlCisgICAgICB7CisjZW5kaWYKKyAgICAgICAgaWYgKGluZmxhdGVJbml0KCZzb2FwLT5kX3N0cmVhbSkgIT0gWl9PSykKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgICAgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfSU5GTEFURTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbmZsYXRlIGluaXRpYWxpemVkXG4iKSk7CisgICAgICB9CisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX1pMSUI7CisgICAgICBtZW1jcHkoc29hcC0+el9idWYsIHNvYXAtPmJ1ZiwgU09BUF9CVUZMRU4pOworICAgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9pbiA9IChCeXRlKikoc29hcC0+el9idWYgKyBzb2FwLT5idWZpZHgpOworICAgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4gPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgICBzb2FwLT56X2J1ZmxlbiA9IHNvYXAtPmJ1ZmxlbjsKKyAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmJ1ZmlkeDsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoc29hcC0+ZXJyb3IpCisgICAgeyBpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9GT1JNICYmIHNvYXAtPmZmb3JtKQorICAgICAgeyBzb2FwLT5lcnJvciA9IHNvYXAtPmZmb3JtKHNvYXApOworICAgICAgICBpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9PSykKKyAgICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfU1RPUDsgLyogcHJldmVudHMgZnVydGhlciBwcm9jZXNzaW5nICovCisgICAgICB9CisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICB9CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKQorICB7IGlmIChzb2FwX2dldG1pbWVoZHIoc29hcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgc29hcC0+bWltZS5maXJzdC0+dHlwZSwgImFwcGxpY2F0aW9uL2RpbWUiKSkKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfRElNRTsKKyAgfQorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpCisgIHsgaWYgKHNvYXBfZ2V0ZGltZWhkcihzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAoc29hcC0+ZGltZS5mbGFncyAmIFNPQVBfRElNRV9DRikKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ2h1bmtlZCBESU1FIFNPQVAgbWVzc2FnZVxuIikpOworICAgICAgc29hcC0+ZGltZS5jaHVua3NpemUgPSBzb2FwLT5kaW1lLnNpemU7CisgICAgICBpZiAoc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4ID49IHNvYXAtPmRpbWUuY2h1bmtzaXplKQorICAgICAgeyBzb2FwLT5kaW1lLmJ1ZmxlbiA9IHNvYXAtPmJ1ZmxlbjsKKyAgICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+YnVmaWR4ICsgc29hcC0+ZGltZS5jaHVua3NpemU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHNvYXAtPmRpbWUuY2h1bmtzaXplIC09IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICB9CisgICAgc29hcC0+Y291bnQgPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgIH0KKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK2h0dHBfcGFyc2Uoc3RydWN0IHNvYXAgKnNvYXApCit7IGNoYXIgaGVhZGVyW1NPQVBfSERSTEVOXSwgKnM7CisgIHVuc2lnbmVkIHNob3J0IGdldCA9IDAsIHN0YXR1cyA9IDAsIGsgPSAwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIldhaXRpbmcgZm9yIEhUVFAgcmVxdWVzdC9yZXNwb25zZS4uLlxuIikpOworICAqc29hcC0+ZW5kcG9pbnQgPSAnXDAnOworICBzb2FwLT5sZW5ndGggPSAwOworICBzb2FwLT51c2VyaWQgPSBOVUxMOworICBzb2FwLT5wYXNzd2QgPSBOVUxMOworICBzb2FwLT5hY3Rpb24gPSBOVUxMOworICBzb2FwLT5hdXRocmVhbG0gPSBOVUxMOworICBkbworICB7IGlmIChzb2FwX2dldGxpbmUoc29hcCwgc29hcC0+bXNnYnVmLCBzaXplb2Yoc29hcC0+bXNnYnVmKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkhUVFAgc3RhdHVzOiAlc1xuIiwgc29hcC0+bXNnYnVmKSk7CisgICAgZm9yICg7OykKKyAgICB7IGlmIChzb2FwX2dldGxpbmUoc29hcCwgaGVhZGVyLCBTT0FQX0hEUkxFTikpCisgICAgICB7IGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX0VPRikKKwl7IHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgICAgICAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiRU9GIGluIEhUVFAgaGVhZGVyLCBjb250aW51ZSBhbnl3YXlcbiIpKTsKKwkgIGJyZWFrOworCX0KKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgICAgaWYgKCEqaGVhZGVyKQorICAgICAgICBicmVhazsKKyAgICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJIVFRQIGhlYWRlcjogJXNcbiIsIGhlYWRlcikpOworICAgICAgcyA9IHN0cmNocihoZWFkZXIsICc6Jyk7CisgICAgICBpZiAocykKKyAgICAgIHsgKnMgPSAnXDAnOworICAgICAgICBkbyBzKys7CisgICAgICAgIHdoaWxlICgqcyAmJiAqcyA8PSAzMik7CisgICAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcGFyc2VoZHIoc29hcCwgaGVhZGVyLCBzKSkpCisgICAgICAgIHsgaWYgKHNvYXAtPmVycm9yIDwgU09BUF9TVE9QKQorCSAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisJICBzdGF0dXMgPSBzb2FwLT5lcnJvcjsKKwkgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAoKHMgPSBzdHJjaHIoc29hcC0+bXNnYnVmLCAnICcpKSkKKyAgICB7IGsgPSAodW5zaWduZWQgc2hvcnQpc29hcF9zdHJ0b3VsKHMsICZzLCAxMCk7CisgICAgICBpZiAoIXNvYXBfYmxhbmsoKnMpKQorICAgICAgICBrID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgICAgayA9IDA7CisgIH0gd2hpbGUgKGsgPT0gMTAwKTsKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZpbmlzaGVkIEhUVFAgaGVhZGVyIHBhcnNpbmdcbiIpKTsKKyAgcyA9IHN0cnN0cihzb2FwLT5tc2didWYsICJIVFRQLyIpOworICBpZiAocyAmJiBzWzddICE9ICcxJykKKyAgeyBpZiAoc29hcC0+a2VlcF9hbGl2ZSA9PSAxKQorICAgICAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7CisgICAgaWYgKGsgPT0gMCAmJiAoc29hcC0+b21vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKSAvKiBrID09IDAgZm9yIEhUVFAgcmVxdWVzdCAqLworICAgIHsgc29hcC0+aW1vZGUgfD0gU09BUF9JT19DSFVOSzsKKyAgICAgIHNvYXAtPm9tb2RlID0gKHNvYXAtPm9tb2RlICYgflNPQVBfSU8pIHwgU09BUF9JT19TVE9SRTsKKyAgICB9CisgIH0KKyAgaWYgKHNvYXAtPmtlZXBfYWxpdmUgPCAwKQorICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAxOworICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiS2VlcCBhbGl2ZSBjb25uZWN0aW9uID0gJWRcbiIsIHNvYXAtPmtlZXBfYWxpdmUpKTsKKyAgaWYgKHMgJiYgKCgoZ2V0ID0gIXN0cm5jbXAoc29hcC0+bXNnYnVmLCAiR0VUICIsIDQpKSkgfHwgIXN0cm5jbXAoc29hcC0+bXNnYnVmLCAiUE9TVCAiLCA1KSkpCisgIHsgc2l6ZV90IG0gPSBzdHJsZW4oc29hcC0+ZW5kcG9pbnQpOworICAgIHNpemVfdCBuID0gbSArIChzIC0gc29hcC0+bXNnYnVmKSAtIDUgLSAoIWdldCk7CisgICAgaWYgKG4gPj0gc2l6ZW9mKHNvYXAtPmVuZHBvaW50KSkKKyAgICAgIG4gPSBzaXplb2Yoc29hcC0+ZW5kcG9pbnQpIC0gMTsKKyAgICBzdHJuY3B5KHNvYXAtPnBhdGgsIHNvYXAtPm1zZ2J1ZiArIDQgKyAoIWdldCksIG4gLSBtKTsKKyAgICBzb2FwLT5wYXRoW24gLSBtXSA9ICdcMCc7CisgICAgc3RyY2F0KHNvYXAtPmVuZHBvaW50LCBzb2FwLT5wYXRoKTsKKyAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiVGFyZ2V0IGVuZHBvaW50PSclcydcbiIsIHNvYXAtPmVuZHBvaW50KSk7CisgICAgaWYgKGdldCkKKyAgICB7IHNvYXAtPmVycm9yID0gc29hcC0+ZmdldChzb2FwKTsKKyAgICAgIGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX09LKQorICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfU1RPUDsgLyogcHJldmVudHMgZnVydGhlciBwcm9jZXNzaW5nICovCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIGlmIChzdGF0dXMpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBzdGF0dXM7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgaWYgKGsgPT0gMCB8fCAoayA+PSAyMDAgJiYgayA8PSAyOTkpIHx8IGsgPT0gNDAwIHx8IGsgPT0gNTAwKQorICAgIHJldHVybiBTT0FQX09LOworICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiSFRUUCBlcnJvciAlZFxuIiwgaykpOworICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIkhUVFAgZXJyb3IiLCBzb2FwLT5tc2didWYsIGspOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50CitodHRwX3BhcnNlX2hlYWRlcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWwpCit7IGlmICghc29hcF90YWdfY21wKGtleSwgIkhvc3QiKSkKKyAgeyAKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICBpZiAoc29hcC0+aW1vZGUgJiBTT0FQX0VOQ19TU0wpCisgICAgICBzdHJjcHkoc29hcC0+ZW5kcG9pbnQsICJodHRwczovLyIpOworICAgIGVsc2UKKyNlbmRpZgorICAgICAgc3RyY3B5KHNvYXAtPmVuZHBvaW50LCAiaHR0cDovLyIpOworICAgIHN0cm5jYXQoc29hcC0+ZW5kcG9pbnQsIHZhbCwgc2l6ZW9mKHNvYXAtPmVuZHBvaW50KSAtIDgpOworICAgIHNvYXAtPmVuZHBvaW50W3NpemVvZihzb2FwLT5lbmRwb2ludCkgLSAxXSA9ICdcMCc7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LVR5cGUiKSkKKyAgeyBpZiAoc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwsICJhcHBsaWNhdGlvbi9kaW1lIikpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX0RJTUU7CisgICAgZWxzZSBpZiAoc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwsICJtdWx0aXBhcnQvcmVsYXRlZCIpCisgICAgICAgICAgfHwgc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwsICJtdWx0aXBhcnQvZm9ybS1kYXRhIikpCisgICAgeyBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gc29hcF9zdHJkdXAoc29hcCwgc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwsICJib3VuZGFyeSIpKTsKKyAgICAgIHNvYXAtPm1pbWUuc3RhcnQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCwgInN0YXJ0IikpOworICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19NSU1FOworICAgIH0KKyAgfQorI2VuZGlmCisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1MZW5ndGgiKSkKKyAgICBzb2FwLT5sZW5ndGggPSBzb2FwX3N0cnRvdWwodmFsLCBOVUxMLCAxMCk7CisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1FbmNvZGluZyIpKQorICB7IGlmICghc29hcF90YWdfY21wKHZhbCwgImRlZmxhdGUiKSkKKyNpZmRlZiBXSVRIX1pMSUIKKyAgICAgIHNvYXAtPnpsaWJfaW4gPSBTT0FQX1pMSUJfREVGTEFURTsKKyNlbHNlCisgICAgICByZXR1cm4gU09BUF9aTElCX0VSUk9SOworI2VuZGlmCisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcCh2YWwsICJnemlwIikpCisjaWZkZWYgV0lUSF9HWklQCisgICAgICBzb2FwLT56bGliX2luID0gU09BUF9aTElCX0daSVA7CisjZWxzZQorICAgICAgcmV0dXJuIFNPQVBfWkxJQl9FUlJPUjsKKyNlbmRpZgorICB9CisjaWZkZWYgV0lUSF9aTElCCisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQWNjZXB0LUVuY29kaW5nIikpCisgIHsKKyNpZmRlZiBXSVRIX0daSVAKKyAgICBpZiAoc3RyY2hyKHZhbCwgJyonKSB8fCBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCwgImd6aXAiKSkKKyAgICAgIHNvYXAtPnpsaWJfb3V0ID0gU09BUF9aTElCX0daSVA7CisgICAgZWxzZQorI2VuZGlmCisgICAgaWYgKHN0cmNocih2YWwsICcqJykgfHwgc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwsICJkZWZsYXRlIikpCisgICAgICBzb2FwLT56bGliX291dCA9IFNPQVBfWkxJQl9ERUZMQVRFOworICAgIGVsc2UKKyAgICAgIHNvYXAtPnpsaWJfb3V0ID0gU09BUF9aTElCX05PTkU7CisgIH0KKyNlbmRpZgorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIlRyYW5zZmVyLUVuY29kaW5nIikpCisgIHsgc29hcC0+bW9kZSAmPSB+U09BUF9JTzsKKyAgICBpZiAoIXNvYXBfdGFnX2NtcCh2YWwsICJjaHVua2VkIikpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fQ0hVTks7CisgIH0KKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb25uZWN0aW9uIikpCisgIHsgaWYgKCFzb2FwX3RhZ19jbXAodmFsLCAia2VlcC1hbGl2ZSIpKQorICAgICAgc29hcC0+a2VlcF9hbGl2ZSA9IC1zb2FwLT5rZWVwX2FsaXZlOworICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAodmFsLCAiY2xvc2UiKSkKKyAgICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOworICB9CisjaWZuZGVmIFdJVEhfTEVBTgorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkF1dGhvcml6YXRpb24iKSkKKyAgeyBpZiAoIXNvYXBfdGFnX2NtcCh2YWwsICJCYXNpYyAqIikpCisgICAgeyBpbnQgbjsKKyAgICAgIGNoYXIgKnM7CisgICAgICBzb2FwX2Jhc2U2NDJzKHNvYXAsIHZhbCArIDYsIHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZikgLSAxLCAmbik7CisgICAgICBzb2FwLT50bXBidWZbbl0gPSAnXDAnOworICAgICAgaWYgKChzID0gc3RyY2hyKHNvYXAtPnRtcGJ1ZiwgJzonKSkpCisgICAgICB7ICpzID0gJ1wwJzsKKwlzb2FwLT51c2VyaWQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT50bXBidWYpOworCXNvYXAtPnBhc3N3ZCA9IHNvYXBfc3RyZHVwKHNvYXAsIHMgKyAxKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJXV1ctQXV0aGVudGljYXRlIikpCisgICAgc29hcC0+YXV0aHJlYWxtID0gc29hcF9zdHJkdXAoc29hcCwgc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwgKyA2LCAicmVhbG0iKSk7CisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiRXhwZWN0IikpCisgIHsgaWYgKCFzb2FwX3RhZ19jbXAodmFsLCAiMTAwLWNvbnRpbnVlIikpCisgICAgeyBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkhUVFAvMS4xIDEwMCBDb250aW51ZSIsIE5VTEwpKQorICAgICAgIHx8IChzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsIE5VTEwsIE5VTEwpKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgfQorI2VuZGlmCisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiU09BUEFjdGlvbiIpKQorICB7IGlmICgqdmFsID09ICciJykKKyAgICB7IHNvYXAtPmFjdGlvbiA9IHNvYXBfc3RyZHVwKHNvYXAsIHZhbCArIDEpOworICAgICAgc29hcC0+YWN0aW9uW3N0cmxlbihzb2FwLT5hY3Rpb24pIC0gMV0gPSAnXDAnOworICAgIH0KKyAgfQorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkxvY2F0aW9uIikpCisgIHsgc3RybmNweShzb2FwLT5lbmRwb2ludCwgdmFsLCBzaXplb2Yoc29hcC0+ZW5kcG9pbnQpKTsKKyAgICBzb2FwLT5lbmRwb2ludFtzaXplb2Yoc29hcC0+ZW5kcG9pbnQpIC0gMV0gPSAnXDAnOworICB9CisjaWZkZWYgV0lUSF9DT09LSUVTCisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29va2llIikgfHwgIXNvYXBfdGFnX2NtcChrZXksICJTZXQtQ29va2llIikpCisgICAgc29hcF9nZXRjb29raWVzKHNvYXAsIHZhbCk7CisjZW5kaWYKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmICFkZWZpbmVkKFdJVEhfTk9IVFRQKSB8fCAhZGVmaW5lZChXSVRIX0xFQU5FUikKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbGluZSwgY29uc3QgY2hhciAqa2V5KQoreyByZWdpc3RlciBjb25zdCBjaGFyICpzID0gbGluZTsKKyAgaWYgKHMpCisgIHsgd2hpbGUgKCpzKQorICAgIHsgcmVnaXN0ZXIgc2hvcnQgZmxhZzsKKyAgICAgIHMgPSBzb2FwX2RlY29kZV9rZXkoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgcyk7CisgICAgICBmbGFnID0gc29hcF90YWdfY21wKHNvYXAtPnRtcGJ1Ziwga2V5KTsKKyAgICAgIHMgPSBzb2FwX2RlY29kZV92YWwoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgcyk7CisgICAgICBpZiAoIWZsYWcpCisgICAgICAgIHJldHVybiBzb2FwLT50bXBidWY7CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAhZGVmaW5lZChXSVRIX05PSFRUUCkgfHwgIWRlZmluZWQoV0lUSF9MRUFORVIpCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZGVjb2RlX2tleShjaGFyICpidWYsIHNpemVfdCBsZW4sIGNvbnN0IGNoYXIgKnZhbCkKK3sgcmV0dXJuIHNvYXBfZGVjb2RlKGJ1ZiwgbGVuLCB2YWwsICI9LDsiKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgIWRlZmluZWQoV0lUSF9OT0hUVFApIHx8ICFkZWZpbmVkKFdJVEhfTEVBTkVSKQorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2RlY29kZV92YWwoY2hhciAqYnVmLCBzaXplX3QgbGVuLCBjb25zdCBjaGFyICp2YWwpCit7IGlmICgqdmFsICE9ICc9JykKKyAgeyAqYnVmID0gJ1wwJzsKKyAgICByZXR1cm4gdmFsOworICB9CisgIHJldHVybiBzb2FwX2RlY29kZShidWYsIGxlbiwgdmFsICsgMSwgIiw7Iik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmICFkZWZpbmVkKFdJVEhfTk9IVFRQKSB8fCAhZGVmaW5lZChXSVRIX0xFQU5FUikKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY29uc3QgY2hhcioKK3NvYXBfZGVjb2RlKGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwgY29uc3QgY2hhciAqdmFsLCBjb25zdCBjaGFyICpzZXApCit7IGNvbnN0IGNoYXIgKnM7CisgIGNoYXIgKnQgPSBidWY7CisgIGZvciAocyA9IHZhbDsgKnM7IHMrKykKKyAgICBpZiAoKnMgIT0gJyAnICYmICpzICE9ICdcdCcgJiYgIXN0cmNocihzZXAsICpzKSkKKyAgICAgIGJyZWFrOworICBpZiAoKnMgPT0gJyInKQorICB7IHMrKzsKKyAgICB3aGlsZSAoKnMgJiYgKnMgIT0gJyInICYmIC0tbGVuKQorICAgICAgKnQrKyA9ICpzKys7CisgIH0KKyAgZWxzZQorICB7IHdoaWxlIChzb2FwX25vdGJsYW5rKCpzKSAmJiAhc3RyY2hyKHNlcCwgKnMpICYmIC0tbGVuKQorICAgIHsgaWYgKCpzID09ICclJykKKyAgICAgIHsgKnQrKyA9ICgoc1sxXSA+PSAnQScgPyAoc1sxXSAmIDB4NykgKyA5IDogc1sxXSAtICcwJykgPDwgNCkKKyAgICAgICAgICAgICAgKyAoc1syXSA+PSAnQScgPyAoc1syXSAmIDB4NykgKyA5IDogc1syXSAtICcwJyk7CisgICAgICAgIHMgKz0gMzsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgKnQrKyA9ICpzKys7CisgICAgfQorICB9CisgICp0ID0gJ1wwJzsKKyAgd2hpbGUgKCpzICYmICFzdHJjaHIoc2VwLCAqcykpCisgICAgcysrOworICByZXR1cm4gczsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VudmVsb3BlX2JlZ2luX291dChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc2l6ZV90IG4gPSAwOworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKSAmJiBzb2FwLT5taW1lLmJvdW5kYXJ5ICYmIHNvYXAtPm1pbWUuc3RhcnQpCisgIHsgY29uc3QgY2hhciAqczsKKyAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKSkKKyAgICAgIHMgPSAiYXBwbGljYXRpb24vZGltZSI7CisgICAgZWxzZSBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICAgICAgcyA9ICJhcHBsaWNhdGlvbi9zb2FwK3htbDsgY2hhcnNldD11dGYtOCI7CisgICAgZWxzZQorICAgICAgcyA9ICJ0ZXh0L3htbDsgY2hhcnNldD11dGYtOCI7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICItLSVzXHJcbkNvbnRlbnQtVHlwZTogJXNcclxuQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmluYXJ5XHJcbkNvbnRlbnQtSUQ6ICVzXHJcblxyXG4iLCBzb2FwLT5taW1lLmJvdW5kYXJ5LCBzLCBzb2FwLT5taW1lLnN0YXJ0KTsKKyAgICBuID0gc3RybGVuKHNvYXAtPnRtcGJ1Zik7CisgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgc29hcC0+dG1wYnVmLCBuKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICAgIHNvYXAtPmRpbWUuc2l6ZSA9IHNvYXAtPmNvdW50OwkvKiBESU1FIGluIE1JTUUgY29ycmVjdGlvbiAqLworICBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpICYmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkpCisgIHsgaWYgKHNvYXBfcHV0ZGltZWhkcihzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorI2VuZGlmCisgIHNvYXAtPnBhcnQgPSBTT0FQX0lOX0VOVkVMT1BFOworICByZXR1cm4gc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCAiU09BUC1FTlY6RW52ZWxvcGUiLCAwLCBOVUxMKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbnZlbG9wZV9lbmRfb3V0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgIlNPQVAtRU5WOkVudmVsb3BlIikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKSkKKyAgeyBzb2FwLT5kaW1lLnNpemUgPSBzb2FwLT5jb3VudCAtIHNvYXAtPmRpbWUuc2l6ZTsJLyogRElNRSBpbiBNSU1FIGNvcnJlY3Rpb24gKi8KKyAgICBzcHJpbnRmKHNvYXAtPmlkLCBzb2FwLT5kaW1lX2lkX2Zvcm1hdCwgMCk7CisgICAgc29hcC0+ZGltZS5pZCA9IHNvYXAtPmlkOworICAgIGlmIChzb2FwLT5sb2NhbF9uYW1lc3BhY2VzKQorICAgIHsgaWYgKHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbMF0ub3V0KQorICAgICAgICBzb2FwLT5kaW1lLnR5cGUgPSAoY2hhciopc29hcC0+bG9jYWxfbmFtZXNwYWNlc1swXS5vdXQ7CisgICAgICBlbHNlCisgICAgICAgIHNvYXAtPmRpbWUudHlwZSA9IChjaGFyKilzb2FwLT5sb2NhbF9uYW1lc3BhY2VzWzBdLm5zOworICAgIH0KKyAgICBzb2FwLT5kaW1lLm9wdGlvbnMgPSBOVUxMOworICAgIHNvYXAtPmRpbWUuZmxhZ3MgPSBTT0FQX0RJTUVfTUIgfCBTT0FQX0RJTUVfQUJTVVJJOworICAgIGlmICghc29hcC0+ZGltZS5maXJzdCkKKyAgICAgIHNvYXAtPmRpbWUuZmxhZ3MgfD0gU09BUF9ESU1FX01FOworICAgIHNvYXAtPmNvdW50ICs9IDEyICsgKChzdHJsZW4oc29hcC0+ZGltZS5pZCkrMykmKH4zKSkgKyAoKHN0cmxlbihzb2FwLT5kaW1lLnR5cGUpKzMpJih+MykpOworICB9CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpICYmICEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pKQorICAgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsIFNPQVBfU1RSX1BBRERJTkcsIC0obG9uZylzb2FwLT5kaW1lLnNpemUmMyk7CisjZW5kaWYKKyAgc29hcC0+cGFydCA9IFNPQVBfRU5EX0VOVkVMT1BFOworICByZXR1cm4gU09BUF9PSzsKK30gCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW52ZWxvcGVfYmVnaW5faW4oc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHN0cnVjdCBOYW1lc3BhY2UgKnA7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0lOX0VOVkVMT1BFOworICBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsICJTT0FQLUVOVjpFbnZlbG9wZSIsIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfVkVSU0lPTk1JU01BVENIOworICBwID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlczsKKyAgaWYgKHApCisgIHsgY29uc3QgY2hhciAqbnMgPSBwWzBdLm91dDsKKyAgICBpZiAoIW5zKQorICAgICAgbnMgPSBwWzBdLm5zOworICAgIGlmICghc3RyY21wKG5zLCBzb2FwX2VudjEpKQorICAgIHsgc29hcC0+dmVyc2lvbiA9IDE7IC8qIG1ha2Ugc3VyZSB3ZSB1c2UgU09BUCAxLjEgKi8KKyAgICAgIGlmIChwWzFdLm91dCkKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHBbMV0ub3V0KTsKKyAgICAgIGlmICgocFsxXS5vdXQgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHNvYXBfZW5jMSkpKSkKKyAgICAgICAgc3RyY3B5KHBbMV0ub3V0LCBzb2FwX2VuYzEpOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKG5zLCBzb2FwX2VudjIpKQorICAgIHsgc29hcC0+dmVyc2lvbiA9IDI7IC8qIG1ha2Ugc3VyZSB3ZSB1c2UgU09BUCAxLjIgKi8KKyAgICAgIGlmIChwWzFdLm91dCkKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHBbMV0ub3V0KTsKKyAgICAgIGlmICgocFsxXS5vdXQgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHNvYXBfZW5jMikpKSkKKyAgICAgICAgc3RyY3B5KHBbMV0ub3V0LCBzb2FwX2VuYzIpOworICAgIH0KKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbnZlbG9wZV9lbmRfaW4oc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPnBhcnQgPSBTT0FQX0VORF9FTlZFTE9QRTsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgIlNPQVAtRU5WOkVudmVsb3BlIik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYm9keV9iZWdpbl9vdXQoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPnBhcnQgPSBTT0FQX0lOX0JPRFk7CisgIGlmIChzb2FwLT52ZXJzaW9uID09IDEpCisgICAgc29hcC0+ZW5jb2RpbmcgPSAxOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU0VDKSAmJiBzb2FwX3NldF9hdHRyKHNvYXAsICJ3c3U6SWQiLCAiQm9keSIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNlbmRpZgorICBpZiAoc29hcF9lbGVtZW50KHNvYXAsICJTT0FQLUVOVjpCb2R5IiwgMCwgTlVMTCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X3N0YXJ0X2VuZF9vdXQoc29hcCwgTlVMTCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYm9keV9lbmRfb3V0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgIlNPQVAtRU5WOkJvZHkiKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0VORF9CT0RZOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9ib2R5X2JlZ2luX2luKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5wYXJ0ID0gU09BUF9JTl9CT0RZOworICBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsICJTT0FQLUVOVjpCb2R5IiwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoIXNvYXAtPmJvZHkpCisgICAgc29hcC0+cGFydCA9IFNPQVBfTk9fQk9EWTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYm9keV9lbmRfaW4oc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwLT5wYXJ0ID09IFNPQVBfTk9fQk9EWSkKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgc29hcC0+cGFydCA9IFNPQVBfRU5EX0JPRFk7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsICJTT0FQLUVOVjpCb2R5Iik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVjdl9oZWFkZXIoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwX2dldGhlYWRlcihzb2FwKSAmJiBzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2VuZHBvaW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICplbmRwb2ludCkKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKKyAgcmVnaXN0ZXIgc2l6ZV90IGksIG47CisgIHNvYXAtPmVuZHBvaW50WzBdID0gJ1wwJzsKKyAgc29hcC0+aG9zdFswXSA9ICdcMCc7CisgIHNvYXAtPnBhdGhbMF0gPSAnLyc7CisgIHNvYXAtPnBhdGhbMV0gPSAnXDAnOworICBzb2FwLT5wb3J0ID0gODA7CisgIGlmICghZW5kcG9pbnQgfHwgISplbmRwb2ludCkKKyAgICByZXR1cm47CisgIGlmICghc3RybmNtcChlbmRwb2ludCwgImh0dHBzOiIsIDYpKQorICAgIHNvYXAtPnBvcnQgPSA0NDM7CisgIHN0cm5jcHkoc29hcC0+ZW5kcG9pbnQsIGVuZHBvaW50LCBzaXplb2Yoc29hcC0+ZW5kcG9pbnQpIC0gMSk7CisgIHMgPSBzdHJjaHIoZW5kcG9pbnQsICc6Jyk7CisgIGlmIChzICYmIHNbMV0gPT0gJy8nICYmIHNbMl0gPT0gJy8nKQorICAgIHMgKz0gMzsKKyAgZWxzZQorICAgIHMgPSBlbmRwb2ludDsKKyAgbiA9IHN0cmxlbihzKTsKKyAgaWYgKG4gPj0gc2l6ZW9mKHNvYXAtPmhvc3QpKQorICAgIG4gPSBzaXplb2Yoc29hcC0+aG9zdCkgLSAxOworI2lmZGVmIFdJVEhfSVBWNgorICBpZiAoc1swXSA9PSAnWycpCisgIHsgcysrOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgeyBzb2FwLT5ob3N0W2ldID0gc1tpXTsKKyAgICAgIGlmIChzW2ldID09ICddJykKKyAgICAgIHsgcysrOworICAgICAgICBicmVhazsgCisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyAgeyBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIHsgc29hcC0+aG9zdFtpXSA9IHNbaV07CisgICAgICBpZiAoc1tpXSA9PSAnLycgfHwgc1tpXSA9PSAnOicpCisgICAgICAgIGJyZWFrOyAKKyAgICB9CisgIH0KKyNlbHNlCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgIHsgc29hcC0+aG9zdFtpXSA9IHNbaV07CisgICAgaWYgKHNbaV0gPT0gJy8nIHx8IHNbaV0gPT0gJzonKQorICAgICAgYnJlYWs7IAorICB9CisjZW5kaWYKKyAgc29hcC0+aG9zdFtpXSA9ICdcMCc7CisgIGlmIChzW2ldID09ICc6JykKKyAgeyBzb2FwLT5wb3J0ID0gKGludClhdG9sKHMgKyBpICsgMSk7CisgICAgZm9yIChpKys7IGkgPCBuOyBpKyspCisgICAgICBpZiAoc1tpXSA9PSAnLycpCisgICAgICAgIGJyZWFrOworICB9CisgIGlmIChzW2ldKQorICB7IHN0cm5jcHkoc29hcC0+cGF0aCwgcyArIGksIHNpemVvZihzb2FwLT5wYXRoKSk7CisgICAgc29hcC0+cGF0aFtzaXplb2Yoc29hcC0+cGF0aCkgLSAxXSA9ICdcMCc7CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9jb25uZWN0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICplbmRwb2ludCwgY29uc3QgY2hhciAqYWN0aW9uKQoreyByZXR1cm4gc29hcF9jb25uZWN0X2NvbW1hbmQoc29hcCwgU09BUF9QT1NULCBlbmRwb2ludCwgYWN0aW9uKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9jb25uZWN0X2NvbW1hbmQoc3RydWN0IHNvYXAgKnNvYXAsIGludCBodHRwX2NvbW1hbmQsIGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjb25zdCBjaGFyICphY3Rpb24pCit7IGNoYXIgaG9zdFtzaXplb2Yoc29hcC0+aG9zdCldOworICBpbnQgcG9ydDsKKyAgc2l6ZV90IGNvdW50OworICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIHN0cmNweShob3N0LCBzb2FwLT5ob3N0KTsgLyogc2F2ZSB0byBjb21wYXJlICovCisgIHBvcnQgPSBzb2FwLT5wb3J0OyAvKiBzYXZlIHRvIGNvbXBhcmUgKi8KKyAgc29hcF9zZXRfZW5kcG9pbnQoc29hcCwgZW5kcG9pbnQpOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+ZmNvbm5lY3QpCisgIHsgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZjb25uZWN0KHNvYXAsIGVuZHBvaW50LCBzb2FwLT5ob3N0LCBzb2FwLT5wb3J0KSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgZWxzZQorI2VuZGlmCisgIGlmIChzb2FwLT5mb3BlbiAmJiAqc29hcC0+aG9zdCkKKyAgeyBzb2FwLT5zdGF0dXMgPSBodHRwX2NvbW1hbmQ7CisgICAgaWYgKCFzb2FwLT5rZWVwX2FsaXZlIHx8ICFzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpIHx8IHN0cmNtcChzb2FwLT5ob3N0LCBob3N0KSB8fCBzb2FwLT5wb3J0ICE9IHBvcnQgfHwgIXNvYXAtPmZwb2xsIHx8IHNvYXAtPmZwb2xsKHNvYXApKQorICAgIHsgc29hcC0+a2VlcF9hbGl2ZSA9IDA7IC8qIHRvIGZvcmNlIGNsb3NlICovCisgICAgICBzb2FwLT5vbW9kZSAmPSB+U09BUF9JT19VRFA7IC8qIHRvIGZvcmNlIGNsb3NlICovCisgICAgICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJDb25uZWN0L3JlY29ubmVjdCB0byBob3N0PSclcycgcGF0aD0nJXMnIHBvcnQ9JWRcbiIsIHNvYXAtPmhvc3QsIHNvYXAtPnBhdGgsIHNvYXAtPnBvcnQpKTsKKyNpZmRlZiBXSVRIX1VEUAorICAgICAgaWYgKCFzdHJuY21wKGVuZHBvaW50LCAic29hcC51ZHA6IiwgOSkpCisgICAgICAgIHNvYXAtPm9tb2RlIHw9IFNPQVBfSU9fVURQOworI2VuZGlmCisgICAgICBzb2FwLT5zb2NrZXQgPSBzb2FwLT5mb3Blbihzb2FwLCBlbmRwb2ludCwgc29hcC0+aG9zdCwgc29hcC0+cG9ydCk7CisgICAgICBpZiAoc29hcC0+ZXJyb3IpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19LRUVQQUxJVkUpICE9IDApOworICAgIH0KKyAgfQorICBjb3VudCA9IHNvYXBfY291bnRfYXR0YWNobWVudHMoc29hcCk7CisgIGlmIChzb2FwX2JlZ2luX3NlbmQoc29hcCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmbmRlZiBXSVRIX05PSFRUUAorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSAhPSBTT0FQX0lPX1NUT1JFICYmICEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1hNTCkgJiYgZW5kcG9pbnQpCisgIHsgdW5zaWduZWQgaW50IGsgPSBzb2FwLT5tb2RlOworICAgIHNvYXAtPm1vZGUgJj0gfihTT0FQX0lPIHwgU09BUF9FTkNfWkxJQik7CisgICAgaWYgKChrICYgU09BUF9JTykgIT0gU09BUF9JT19GTFVTSCkKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19CVUZGRVI7CisgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0KHNvYXAsIGVuZHBvaW50LCBzb2FwLT5ob3N0LCBzb2FwLT5wb3J0LCBzb2FwLT5wYXRoLCBhY3Rpb24sIGNvdW50KSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgICAgaWYgKChrICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgICB7IGlmIChzb2FwX2ZsdXNoKHNvYXApKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorI2VuZGlmCisgICAgc29hcC0+bW9kZSA9IGs7CisgIH0KKyAgZWxzZSBpZiAoYWN0aW9uKQorICAgIHNvYXAtPmFjdGlvbiA9IHNvYXBfc3RyZHVwKHNvYXAsIGFjdGlvbik7CisgIGlmIChodHRwX2NvbW1hbmQgIT0gU09BUF9QT1NUKQorICAgIHJldHVybiBzb2FwX2VuZF9zZW5kKHNvYXApOworI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfczJiYXNlNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMsIGNoYXIgKnQsIGludCBuKQoreyByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBtOworICByZWdpc3RlciBjaGFyICpwOworICBpZiAoIXQpCisgICAgdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCAobiArIDIpIC8gMyAqIDQgKyAxKTsKKyAgaWYgKCF0KQorICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcCA9IHQ7CisgIHRbMF0gPSAnXDAnOworICBpZiAoIXMpCisgICAgcmV0dXJuIHA7CisgIGZvciAoOyBuID4gMjsgbiAtPSAzLCBzICs9IDMpCisgIHsgbSA9IHNbMF07CisgICAgbSA9IChtIDw8IDgpIHwgc1sxXTsKKyAgICBtID0gKG0gPDwgOCkgfCBzWzJdOworICAgIGZvciAoaSA9IDQ7IGkgPiAwOyBtID4+PSA2KQorICAgICAgdFstLWldID0gc29hcF9iYXNlNjRvW20gJiAweDNGXTsKKyAgICB0ICs9IDQ7CisgIH0KKyAgdFswXSA9ICdcMCc7CisgIGlmIChuID4gMCkKKyAgeyBtID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgbSA9IChtIDw8IDgpIHwgKnMrKzsKKyAgICBmb3IgKDsgaSA8IDM7IGkrKykKKyAgICAgIG0gPDw9IDg7CisgICAgZm9yIChpKys7IGkgPiAwOyBtID4+PSA2KQorICAgICAgdFstLWldID0gc29hcF9iYXNlNjRvW20gJiAweDNGXTsKKyAgICBmb3IgKGkgPSAzOyBpID4gbjsgaS0tKQorICAgICAgdFtpXSA9ICc9JzsKKyAgICB0WzRdID0gJ1wwJzsKKyAgfQorICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2Jhc2U2NDJzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBjaGFyICp0LCBzaXplX3QgbCwgaW50ICpuKQoreyByZWdpc3RlciBpbnQgaSwgaiwgYzsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBtOworICByZWdpc3RlciBjb25zdCBjaGFyICpwOworICBpZiAoIXMgfHwgISpzKQorICB7IGlmIChuKQorICAgICAgKm4gPSAwOworICAgIGlmIChzb2FwLT5lcnJvcikKKyAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBTT0FQX05PTl9OVUxMOworICB9CisgIGlmICghdCkKKyAgeyBsID0gKHN0cmxlbihzKSArIDMpIC8gNCAqIDM7CisgICAgdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBsKTsKKyAgfQorICBpZiAoIXQpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwID0gdDsKKyAgaWYgKG4pCisgICAgKm4gPSAwOworICBmb3IgKDs7KQorICB7IGZvciAoaSA9IDA7IGkgPCBTT0FQX0JMS0xFTjsgaSsrKQorICAgIHsgbSA9IDA7CisgICAgICBqID0gMDsKKyAgICAgIHdoaWxlIChqIDwgNCkKKyAgICAgIHsgYyA9ICpzKys7CisgICAgICAgIGlmIChjID09ICc9JyB8fCAhYykKKyAgICAgICAgeyBpICo9IDM7CisgICAgICAgICAgc3dpdGNoIChqKQorICAgICAgICAgIHsgY2FzZSAyOgorICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKChtID4+IDQpICYgMHhGRik7CisgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoKG0gPj4gMTApICYgMHhGRik7CisgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoKG0gPj4gMikgJiAweEZGKTsKKyAgICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobikKKwkgICAgKm4gKz0gaTsKKyAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgfQorICAgICAgICBjIC09ICcrJzsKKyAgICAgICAgaWYgKGMgPj0gMCAmJiBjIDw9IDc5KQorICAgICAgICB7IG0gPSAobSA8PCA2KSArIHNvYXBfYmFzZTY0aVtjXTsKKyAgICAgICAgICBqKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICp0KysgPSAoY2hhcikoKG0gPj4gMTYpICYgMHhGRik7CisgICAgICAqdCsrID0gKGNoYXIpKChtID4+IDgpICYgMHhGRik7CisgICAgICAqdCsrID0gKGNoYXIpKG0gJiAweEZGKTsKKyAgICAgIGlmIChsIDwgMykKKyAgICAgIHsgaWYgKG4pCisJICAqbiArPSBpOworICAgICAgICByZXR1cm4gcDsKKyAgICAgIH0KKyAgICAgIGwgLT0gMzsKKyAgICB9CisgICAgaWYgKG4pCisgICAgICAqbiArPSAzICogU09BUF9CTEtMRU47CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2NoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3MyaGV4KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzLCBjaGFyICp0LCBpbnQgbikKK3sgcmVnaXN0ZXIgY2hhciAqcDsKKyAgaWYgKCF0KQorICAgIHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgMiAqIG4gKyAxKTsKKyAgaWYgKCF0KQorICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcCA9IHQ7CisgIHRbMF0gPSAnXDAnOworICBpZiAocykKKyAgeyBmb3IgKDsgbiA+IDA7IG4tLSkKKyAgICB7IHJlZ2lzdGVyIGludCBtID0gKnMrKzsKKyAgICAgICp0KysgPSAoY2hhcikoKG0gPj4gNCkgKyAobSA+IDE1OSA/ICdhJyAtIDEwIDogJzAnKSk7CisgICAgICBtICY9IDB4MEY7CisgICAgICAqdCsrID0gKGNoYXIpKG0gKyAobSA+IDkgPyAnYScgLSAxMCA6ICcwJykpOworICAgIH0KKyAgfQorICAqdCsrID0gJ1wwJzsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9oZXgycyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgY2hhciAqdCwgc2l6ZV90IGwsIGludCAqbikKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqcDsKKyAgaWYgKCFzIHx8ICEqcykKKyAgeyBpZiAobikKKyAgICAgICpuID0gMDsKKyAgICBpZiAoc29hcC0+ZXJyb3IpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gU09BUF9OT05fTlVMTDsKKyAgfQorICBpZiAoIXQpCisgIHsgbCA9IHN0cmxlbihzKSAvIDI7CisgICAgdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBsKTsKKyAgfQorICBpZiAoIXQpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwID0gdDsKKyAgd2hpbGUgKGwpCisgIHsgcmVnaXN0ZXIgaW50IGQxLCBkMjsKKyAgICBkMSA9ICpzKys7CisgICAgaWYgKCFkMSkKKyAgICAgIGJyZWFrOworICAgIGQyID0gKnMrKzsKKyAgICBpZiAoIWQyKQorICAgICAgYnJlYWs7CisgICAgKnQrKyA9ICgoZDEgPj0gJ0EnID8gKGQxICYgMHg3KSArIDkgOiBkMSAtICcwJykgPDwgNCkgKyAoZDIgPj0gJ0EnID8gKGQyICYgMHg3KSArIDkgOiBkMiAtICcwJyk7CisgICAgbC0tOworICB9CisgIGlmIChuKQorICAgICpuID0gdCAtIHA7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dGh0dHBoZHIoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdGF0dXMsIHNpemVfdCBjb3VudCkKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqcyA9IE5VTEw7CisgIHJlZ2lzdGVyIGludCBlcnIgPSBTT0FQX09LOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICByZWdpc3RlciBjb25zdCBjaGFyICpyID0gTlVMTDsKKyNlbmRpZgorICBpZiAoc3RhdHVzID09IFNPQVBfRklMRSAmJiBzb2FwLT5odHRwX2NvbnRlbnQpCisgICAgcyA9IHNvYXAtPmh0dHBfY29udGVudDsKKyAgZWxzZSBpZiAoc3RhdHVzID09IFNPQVBfSFRNTCkKKyAgICBzID0gInRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI7CisgIGVsc2UgaWYgKGNvdW50IHx8ICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspKQorICB7IGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgICAgICBzID0gImFwcGxpY2F0aW9uL3NvYXAreG1sOyBjaGFyc2V0PXV0Zi04IjsKKyAgICBlbHNlCisgICAgICBzID0gInRleHQveG1sOyBjaGFyc2V0PXV0Zi04IjsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+bW9kZSAmIChTT0FQX0VOQ19ESU1FIHwgU09BUF9FTkNfTVRPTSkpCisgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKQorICAgIHsgciA9IHM7CisgICAgICBzID0gImFwcGxpY2F0aW9uL3hvcCt4bWw7IGNoYXJzZXQ9dXRmLTgiOworICAgIH0KKyAgICBlbHNlCisgICAgICBzID0gImFwcGxpY2F0aW9uL2RpbWUiOworICB9CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01JTUUpICYmIHNvYXAtPm1pbWUuYm91bmRhcnkgJiYgc29hcC0+c3RhdHVzICE9IFNPQVBfR0VUKQorICB7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnQgPSBzdHJjaHIocywgJzsnKTsKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIm11bHRpcGFydC9yZWxhdGVkOyBib3VuZGFyeT1cIiVzXCI7IHR5cGU9XCIiLCBzb2FwLT5taW1lLmJvdW5kYXJ5KTsKKyAgICBpZiAodCkKKyAgICAgIHN0cm5jYXQoc29hcC0+dG1wYnVmLCBzLCB0IC0gcyk7CisgICAgZWxzZQorICAgICAgc3RyY2F0KHNvYXAtPnRtcGJ1Ziwgcyk7CisgICAgaWYgKHNvYXAtPm1pbWUuc3RhcnQpCisgICAgeyBzdHJjYXQoc29hcC0+dG1wYnVmLCAiXCI7IHN0YXJ0PVwiIik7CisgICAgICBzdHJjYXQoc29hcC0+dG1wYnVmLCBzb2FwLT5taW1lLnN0YXJ0KTsKKyAgICB9CisgICAgc3RyY2F0KHNvYXAtPnRtcGJ1ZiwgIlwiIik7CisgICAgaWYgKHIpCisgICAgeyBzdHJjYXQoc29hcC0+dG1wYnVmLCAiOyBzdGFydC1pbmZvPVwiIik7CisgICAgICBzdHJjYXQoc29hcC0+dG1wYnVmLCByKTsKKyAgICAgIHN0cmNhdChzb2FwLT50bXBidWYsICJcIiIpOworICAgIH0KKyAgICBzID0gc29hcC0+dG1wYnVmOworICB9CisjZW5kaWYKKyAgaWYgKHMgJiYgKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJDb250ZW50LVR5cGUiLCBzKSkpCisgICAgcmV0dXJuIGVycjsKKyNpZmRlZiBXSVRIX1pMSUIKKyAgaWYgKHNvYXAtPm9tb2RlICYgU09BUF9FTkNfWkxJQikKKyAgeworI2lmZGVmIFdJVEhfR1pJUAorICAgIGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJDb250ZW50LUVuY29kaW5nIiwgImd6aXAiKTsKKyNlbHNlCisgICAgZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkNvbnRlbnQtRW5jb2RpbmciLCAiZGVmbGF0ZSIpOworI2VuZGlmCisgICAgaWYgKGVycikKKyAgICAgIHJldHVybiBlcnI7CisgIH0KKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgICBlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiVHJhbnNmZXItRW5jb2RpbmciLCAiY2h1bmtlZCIpOworICBlbHNlCisjZW5kaWYKKyAgaWYgKHNvYXAtPnN0YXR1cyAhPSBTT0FQX0dFVCkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIiVsdSIsICh1bnNpZ25lZCBsb25nKWNvdW50KTsKKyAgICBlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQ29udGVudC1MZW5ndGgiLCBzb2FwLT50bXBidWYpOworICB9CisgIGlmIChlcnIpCisgICAgcmV0dXJuIGVycjsKKyAgcmV0dXJuIHNvYXAtPmZwb3N0aGRyKHNvYXAsICJDb25uZWN0aW9uIiwgc29hcC0+a2VlcF9hbGl2ZSA/ICJrZWVwLWFsaXZlIiA6ICJjbG9zZSIpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50CitodHRwX2dldChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmV0dXJuIFNPQVBfR0VUX01FVEhPRDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAoraHR0cF9wb3N0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICplbmRwb2ludCwgY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQsIGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmFjdGlvbiwgc2l6ZV90IGNvdW50KQoreyByZWdpc3RlciBjb25zdCBjaGFyICpzOworICByZWdpc3RlciBpbnQgZXJyOworICBpZiAoc29hcC0+c3RhdHVzID09IFNPQVBfR0VUKQorICAgIHMgPSAiR0VUIjsKKyAgZWxzZQorICAgIHMgPSAiUE9TVCI7CisjaWZkZWYgUEFMTQorICBpZiAoIWVuZHBvaW50IHx8IChzdHJuY21wKGVuZHBvaW50LCAiaHR0cDoiLCA1KSAmJiBzdHJuY21wKGVuZHBvaW50LCAiaHR0cHM6IiwgNikgJiYgc3RybmNtcChlbmRwb2ludCwgImh0dHBnOiIsIDYpKSAmJiBzdHJuY21wKGVuZHBvaW50LCAiX2JlYW06IiwgNikgJiYgc3RybmNtcChlbmRwb2ludCwgIl9sb2NhbDoiLCA3KSAmJiBzdHJuY21wKGVuZHBvaW50LCAiX2J0b2JleDoiLCA4KSkKKyNlbHNlCisgIGlmICghZW5kcG9pbnQgfHwgKHN0cm5jbXAoZW5kcG9pbnQsICJodHRwOiIsIDUpICYmIHN0cm5jbXAoZW5kcG9pbnQsICJodHRwczoiLCA2KSAmJiBzdHJuY21wKGVuZHBvaW50LCAiaHR0cGc6IiwgNikpKQorI2VuZGlmCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIGlmIChzb2FwLT5wcm94eV9ob3N0ICYmIHN0cm5jbXAoZW5kcG9pbnQsICJodHRwczoiLCA2KSkKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIiVzICVzIEhUVFAvJXMiLCBzLCBlbmRwb2ludCwgc29hcC0+aHR0cF92ZXJzaW9uKTsKKyAgZWxzZQorICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiJXMgLyVzIEhUVFAvJXMiLCBzLCAoKnBhdGggPT0gJy8nID8gcGF0aCArIDEgOiBwYXRoKSwgc29hcC0+aHR0cF92ZXJzaW9uKTsKKyAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCBzb2FwLT50bXBidWYsIE5VTEwpKSkKKyAgICByZXR1cm4gZXJyOworICBpZiAocG9ydCAhPSA4MCkKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIiVzOiVkIiwgaG9zdCwgcG9ydCk7CisgIGVsc2UKKyAgICBzdHJjcHkoc29hcC0+dG1wYnVmLCBob3N0KTsgCisgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkhvc3QiLCBzb2FwLT50bXBidWYpKQorICAgfHwgKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJVc2VyLUFnZW50IiwgImdTT0FQLzIuNyIpKQorICAgfHwgKGVyciA9IHNvYXBfcHV0aHR0cGhkcihzb2FwLCBTT0FQX09LLCBjb3VudCkpKQorICAgIHJldHVybiBlcnI7CisjaWZkZWYgV0lUSF9aTElCCisjaWZkZWYgV0lUSF9HWklQCisgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkFjY2VwdC1FbmNvZGluZyIsICJnemlwLCBkZWZsYXRlIikpKQorI2Vsc2UKKyAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQWNjZXB0LUVuY29kaW5nIiwgImRlZmxhdGUiKSkpCisjZW5kaWYKKyAgICByZXR1cm4gZXJyOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+dXNlcmlkICYmIHNvYXAtPnBhc3N3ZCAmJiBzdHJsZW4oc29hcC0+dXNlcmlkKSArIHN0cmxlbihzb2FwLT5wYXNzd2QpIDwgNzYxKQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmICsgMjYyLCAiJXM6JXMiLCBzb2FwLT51c2VyaWQsIHNvYXAtPnBhc3N3ZCk7CisgICAgc3RyY3B5KHNvYXAtPnRtcGJ1ZiwgIkJhc2ljICIpOworICAgIHNvYXBfczJiYXNlNjQoc29hcCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKShzb2FwLT50bXBidWYgKyAyNjIpLCBzb2FwLT50bXBidWYgKyA2LCBzdHJsZW4oc29hcC0+dG1wYnVmICsgMjYyKSk7CisgICAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQXV0aG9yaXphdGlvbiIsIHNvYXAtPnRtcGJ1ZikpKQorICAgICAgcmV0dXJuIGVycjsKKyAgfQorICBpZiAoc29hcC0+cHJveHlfdXNlcmlkICYmIHNvYXAtPnByb3h5X3Bhc3N3ZCAmJiBzdHJsZW4oc29hcC0+cHJveHlfdXNlcmlkKSArIHN0cmxlbihzb2FwLT5wcm94eV9wYXNzd2QpIDwgNzYxKQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmICsgMjYyLCAiJXM6JXMiLCBzb2FwLT5wcm94eV91c2VyaWQsIHNvYXAtPnByb3h5X3Bhc3N3ZCk7CisgICAgc3RyY3B5KHNvYXAtPnRtcGJ1ZiwgIkJhc2ljICIpOworICAgIHNvYXBfczJiYXNlNjQoc29hcCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKShzb2FwLT50bXBidWYgKyAyNjIpLCBzb2FwLT50bXBidWYgKyA2LCBzdHJsZW4oc29hcC0+dG1wYnVmICsgMjYyKSk7CisgICAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiUHJveHktQXV0aG9yaXphdGlvbiIsIHNvYXAtPnRtcGJ1ZikpKQorICAgICAgcmV0dXJuIGVycjsKKyAgfQorI2VuZGlmCisjaWZkZWYgV0lUSF9DT09LSUVTCisjaWZkZWYgV0lUSF9PUEVOU1NMCisgIGlmIChzb2FwX3B1dGNvb2tpZXMoc29hcCwgaG9zdCwgcGF0aCwgc29hcC0+c3NsICE9IE5VTEwpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNlbHNlCisgIGlmIChzb2FwX3B1dGNvb2tpZXMoc29hcCwgaG9zdCwgcGF0aCwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2VuZGlmCisjZW5kaWYKKyAgaWYgKGFjdGlvbiAmJiBzb2FwLT52ZXJzaW9uID09IDEpCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJcIiVzXCIiLCBhY3Rpb24pOworICAgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlNPQVBBY3Rpb24iLCBzb2FwLT50bXBidWYpKSkKKyAgICAgIHJldHVybiBlcnI7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmZwb3N0aGRyKHNvYXAsIE5VTEwsIE5VTEwpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50CitodHRwX3NlbmRfaGVhZGVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzKQoreyByZWdpc3RlciBjb25zdCBjaGFyICp0OworICBkbworICB7IHQgPSBzdHJjaHIocywgJ1xuJyk7IC8qIGRpc2FsbG93IFxuIGluIEhUVFAgaGVhZGVycyAqLworICAgIGlmICghdCkKKyAgICAgIHQgPSBzICsgc3RybGVuKHMpOworICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBzID0gdCArIDE7CisgIH0gd2hpbGUgKCp0KTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK2h0dHBfcG9zdF9oZWFkZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsKQoreyBpZiAoa2V5KQorICB7IGlmIChodHRwX3NlbmRfaGVhZGVyKHNvYXAsIGtleSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHZhbCAmJiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAiOiAiLCAyKSB8fCBodHRwX3NlbmRfaGVhZGVyKHNvYXAsIHZhbCkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsICJcclxuIiwgMik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK2h0dHBfcmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdGF0dXMsIHNpemVfdCBjb3VudCkKK3sgcmVnaXN0ZXIgaW50IGVycjsKKyNpZmRlZiBXTVdfUlBNX0lPCisgIGlmIChzb2FwLT5ycG1yZXFpZCkKKyAgICBodHRwT3V0cHV0RW5hYmxlKHNvYXAtPnJwbXJlcWlkKTsKKyNlbmRpZgorICBpZiAoIXN0YXR1cyB8fCBzdGF0dXMgPT0gU09BUF9IVE1MIHx8IHN0YXR1cyA9PSBTT0FQX0ZJTEUpCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJPSyAyMDBcbiIpKTsKKyNpZmRlZiBXTVdfUlBNX0lPCisgICAgaWYgKHNvYXAtPnJwbXJlcWlkIHx8IHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikgfHwgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkgLyogUlBNIGJlaGF2ZXMgYXMgaWYgc3RhbmRhbG9uZSAqLworI2Vsc2UKKyAgICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSB8fCBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKSAvKiBzdGFuZGFsb25lIGFwcGxpY2F0aW9uICovCisjZW5kaWYKKyAgICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiSFRUUC8lcyAyMDAgT0siLCBzb2FwLT5odHRwX3ZlcnNpb24pOworICAgICAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCBzb2FwLT50bXBidWYsIE5VTEwpKSkKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgZWxzZSBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJTdGF0dXMiLCAiMjAwIE9LIikpKQorICAgICAgcmV0dXJuIGVycjsKKyAgfQorICBlbHNlIGlmIChzdGF0dXMgPiAyMDAgJiYgc3RhdHVzIDwgNjAwKQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiSFRUUC8lcyAlZCAlcyIsIHNvYXAtPmh0dHBfdmVyc2lvbiwgc3RhdHVzLCBodHRwX2Vycm9yKHNvYXAsIHN0YXR1cykpOworICAgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgc29hcC0+dG1wYnVmLCBOVUxMKSkpCisgICAgICByZXR1cm4gZXJyOworI2lmbmRlZiBXSVRIX0xFQU4gCisgICAgaWYgKHN0YXR1cyA9PSA0MDEpCisgICAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIkJhc2ljIHJlYWxtPVwiJXNcIiIsIHNvYXAtPmF1dGhyZWFsbSA/IHNvYXAtPmF1dGhyZWFsbSA6ICJnU09BUCBXZWIgU2VydmljZSIpOworICAgICAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiV1dXLUF1dGhlbnRpY2F0ZSIsIHNvYXAtPnRtcGJ1ZikpKQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBlbHNlIGlmICgoc3RhdHVzID49IDMwMSAmJiBzdGF0dXMgPD0gMzAzKSB8fCBzdGF0dXMgPT0gMzA3KQorICAgIHsgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiTG9jYXRpb24iLCBzb2FwLT5lbmRwb2ludCkpKQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyNlbmRpZgorICB9CisgIGVsc2UKKyAgeyBjb25zdCBjaGFyICpzID0gKnNvYXBfZmF1bHRjb2RlKHNvYXApOworICAgIGlmIChzb2FwLT52ZXJzaW9uID09IDIgJiYgIXN0cmNtcChzLCAiU09BUC1FTlY6U2VuZGVyIikpCisgICAgICBzID0gIjQwMCBCYWQgUmVxdWVzdCI7CisgICAgZWxzZQorICAgICAgcyA9ICI1MDAgSW50ZXJuYWwgU2VydmVyIEVycm9yIjsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVycm9yICVzIChzdGF0dXM9JWQpXG4iLCBzLCBzdGF0dXMpKTsKKyNpZmRlZiBXTVdfUlBNX0lPCisgICAgaWYgKHNvYXAtPnJwbXJlcWlkIHx8IHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikgfHwgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkgLyogUlBNIGJlaGF2ZXMgYXMgaWYgc3RhbmRhbG9uZSAqLworI2Vsc2UKKyAgICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSB8fCBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKSAvKiBzdGFuZGFsb25lIGFwcGxpY2F0aW9uICovCisjZW5kaWYKKyAgICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiSFRUUC8lcyAlcyIsIHNvYXAtPmh0dHBfdmVyc2lvbiwgcyk7CisgICAgICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgTlVMTCkpKQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBlbHNlIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlN0YXR1cyIsIHMpKSkKKyAgICAgIHJldHVybiBlcnI7CisgIH0KKyAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiU2VydmVyIiwgImdTT0FQLzIuNyIpKQorICAgfHwgKGVyciA9IHNvYXBfcHV0aHR0cGhkcihzb2FwLCBzdGF0dXMsIGNvdW50KSkpCisgICAgcmV0dXJuIGVycjsKKyNpZmRlZiBXSVRIX0NPT0tJRVMKKyAgaWYgKHNvYXBfcHV0c2V0Y29va2llcyhzb2FwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjZW5kaWYKKyAgcmV0dXJuIHNvYXAtPmZwb3N0aGRyKHNvYXAsIE5VTEwsIE5VTEwpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdGF0dXMpCit7IHJlZ2lzdGVyIHNpemVfdCBjb3VudDsKKyAgaWYgKCEoc29hcC0+b21vZGUgJiAoU09BUF9FTkNfWE1MIHwgU09BUF9JT19TVE9SRSAvKiB0aGlzIHRlc3RzIGZvciBjaHVua2luZyB0b28gKi8pKQorICAgJiYgKHN0YXR1cyA9PSBTT0FQX0hUTUwgfHwgc3RhdHVzID09IFNPQVBfRklMRSkpCisgIHsgc29hcC0+b21vZGUgJj0gflNPQVBfSU87CisgICAgc29hcC0+b21vZGUgfD0gU09BUF9JT19TVE9SRTsKKyAgfQorICBzb2FwLT5zdGF0dXMgPSBzdGF0dXM7CisgIGNvdW50ID0gc29hcF9jb3VudF9hdHRhY2htZW50cyhzb2FwKTsKKyAgaWYgKHNvYXBfYmVnaW5fc2VuZChzb2FwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjaWZuZGVmIFdJVEhfTk9IVFRQCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pICE9IFNPQVBfSU9fU1RPUkUgJiYgIShzb2FwLT5tb2RlICYgU09BUF9FTkNfWE1MKSkKKyAgeyByZWdpc3RlciBpbnQgbiA9IHNvYXAtPm1vZGU7CisgICAgc29hcC0+bW9kZSAmPSB+KFNPQVBfSU8gfCBTT0FQX0VOQ19aTElCKTsKKyAgICBpZiAoKG4gJiBTT0FQX0lPKSAhPSBTT0FQX0lPX0ZMVVNIKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX0JVRkZFUjsKKyAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnJlc3BvbnNlKHNvYXAsIHN0YXR1cywgY291bnQpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgICBpZiAoKG4gJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKQorICAgIHsgaWYgKHNvYXBfZmx1c2goc29hcCkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisjZW5kaWYKKyAgICBzb2FwLT5tb2RlID0gbjsKKyAgfQorI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIGNvbnN0IGNoYXIqCitzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICp0KQoreyBpZiAoKnNvYXAtPnRhZykKKyAgICBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIlZhbGlkYXRpb24gY29uc3RyYWludCB2aW9sYXRpb246ICVzJXMgaW4gZWxlbWVudCA8JXM+IiwgcywgdD90OlNPQVBfU1RSX0VPUywgc29hcC0+dGFnKTsKKyAgZWxzZQorICAgIHNwcmludGYoc29hcC0+bXNnYnVmLCAiVmFsaWRhdGlvbiBjb25zdHJhaW50IHZpb2xhdGlvbjogJXMlcyIsIHMsIHQ/dDpTT0FQX1NUUl9FT1MpOworICByZXR1cm4gc29hcC0+bXNnYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXApCit7IGNvbnN0IGNoYXIgKipjID0gc29hcF9mYXVsdGNvZGUoc29hcCk7CisgIGNvbnN0IGNoYXIgKipzID0gc29hcF9mYXVsdHN0cmluZyhzb2FwKTsKKyAgaWYgKCEqYyAmJiAhKnMgJiYgc29hcC0+ZnNldGVycm9yKQorICAgIHNvYXAtPmZzZXRlcnJvcihzb2FwLCBjLCBzKTsKKyAgaWYgKCEqYykKKyAgeyBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICAgICAgKmMgPSAiU09BUC1FTlY6U2VuZGVyIjsKKyAgICBlbHNlCisgICAgICAqYyA9ICJTT0FQLUVOVjpDbGllbnQiOworICB9CisgIGlmICgqcykKKyAgICByZXR1cm47CisgIHN3aXRjaCAoc29hcC0+ZXJyb3IpCisgIHsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgY2FzZSBTT0FQX0NMSV9GQVVMVDoKKyAgICAgICpzID0gIkNsaWVudCBmYXVsdCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfU1ZSX0ZBVUxUOgorICAgICAgKnMgPSAiU2VydmVyIGZhdWx0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9UQUdfTUlTTUFUQ0g6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgInRhZyBuYW1lIG9yIG5hbWVzcGFjZSBtaXNtYXRjaCIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1RZUEU6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgImRhdGEgdHlwZSBtaXNtYXRjaCAiLCBzb2FwLT50eXBlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9TWU5UQVhfRVJST1I6CisgICAgICAqcyA9ICJXZWxsLWZvcm1lZG5lc3MgdmlvbGF0aW9uIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9OT19UQUc6CisgICAgICAqcyA9ICJObyBYTUwgZWxlbWVudCB0YWciOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX01VU1RVTkRFUlNUQU5EOgorICAgICAgKmMgPSAiU09BUC1FTlY6TXVzdFVuZGVyc3RhbmQiOworICAgICAgc3ByaW50Zihzb2FwLT5tc2didWYsICJUaGUgZGF0YSBpbiBlbGVtZW50ICclcycgbXVzdCBiZSB1bmRlcnN0b29kIGJ1dCBjYW5ub3QgYmUgaGFuZGxlZCIsIHNvYXAtPnRhZyk7CisgICAgICAqcyA9IHNvYXAtPm1zZ2J1ZjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9WRVJTSU9OTUlTTUFUQ0g6CisgICAgICAqYyA9ICJTT0FQLUVOVjpWZXJzaW9uTWlzbWF0Y2giOworICAgICAgKnMgPSAiU09BUCB2ZXJzaW9uIG1pc21hdGNoIG9yIGludmFsaWQgU09BUCBtZXNzYWdlIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9EQVRBRU5DT0RJTkdVTktOT1dOOgorICAgICAgKmMgPSAiU09BUC1FTlY6RGF0YUVuY29kaW5nVW5rbm93biI7CisgICAgICAqcyA9ICJVbnN1cHBvcnRlZCBTT0FQIGRhdGEgZW5jb2RpbmciOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX05BTUVTUEFDRToKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAibmFtZXNwYWNlIG1pc21hdGNoIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfVVNFUl9FUlJPUjoKKyAgICAgICpzID0gIlVzZXIgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0ZBVEFMX0VSUk9SOgorICAgICAgKnMgPSAiRmF0YWwgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX05PX01FVEhPRDoKKyAgICAgIHNwcmludGYoc29hcC0+bXNnYnVmLCAiTWV0aG9kICclcycgbm90IGltcGxlbWVudGVkOiBtZXRob2QgbmFtZSBvciBuYW1lc3BhY2Ugbm90IHJlY29nbml6ZWQiLCBzb2FwLT50YWcpOworICAgICAgKnMgPSBzb2FwLT5tc2didWY7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfR0VUX01FVEhPRDoKKyAgICAgICpzID0gIkhUVFAgR0VUIG1ldGhvZCBub3QgaW1wbGVtZW50ZWQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0VPTToKKyAgICAgICpzID0gIk91dCBvZiBtZW1vcnkiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0lPQjoKKyAgICAgICpzID0gIkFycmF5IGluZGV4IG91dCBvZiBib3VuZHMiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX05VTEw6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgIm5pbCBub3QgYWxsb3dlZCIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0RVUExJQ0FURV9JRDoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAibXVsdGlwbGUgZGVmaW5pdGlvbnMgb2YgaWQgIiwgc29hcC0+aWQpOworICAgICAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgICAgICAgKnNvYXBfZmF1bHRzdWJjb2RlKHNvYXApID0gIlNPQVAtRU5DOkR1cGxpY2F0ZUlEIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9NSVNTSU5HX0lEOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJtaXNzaW5nIGlkIGZvciByZWYgIiwgc29hcC0+aWQpOworICAgICAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgICAgICAgKnNvYXBfZmF1bHRzdWJjb2RlKHNvYXApID0gIlNPQVAtRU5DOk1pc3NpbmdJRCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfSFJFRjoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAiaW5jb21wYXRpYmxlIG9iamVjdCByZWYgIiwgc29hcC0+aWQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0ZBVUxUOgorICAgICAgYnJlYWs7CisjaWZuZGVmIFdJVEhfTk9JTworICAgIGNhc2UgU09BUF9VRFBfRVJST1I6CisgICAgICAqcyA9ICJNZXNzYWdlIHRvbyBsYXJnZSBmb3IgVURQIHBhY2tldCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfVENQX0VSUk9SOgorICAgICAgKnMgPSB0Y3BfZXJyb3Ioc29hcCk7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgU09BUF9IVFRQX0VSUk9SOgorICAgICAgKnMgPSAiSFRUUCBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfU1NMX0VSUk9SOgorI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgICAgKnMgPSAiU1NMIGVycm9yIjsKKyNlbHNlCisgICAgICAqcyA9ICJPcGVuU1NMIG5vdCBpbnN0YWxsZWQ6IHJlY29tcGlsZSB3aXRoIC1EV0lUSF9PUEVOU1NMIjsKKyNlbmRpZgorICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1BMVUdJTl9FUlJPUjoKKyAgICAgICpzID0gIlBsdWdpbiByZWdpc3RyeSBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfRElNRV9FUlJPUjoKKyAgICAgICpzID0gIkRJTUUgZm9ybWF0IGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9ESU1FX0hSRUY6CisgICAgICAqcyA9ICJESU1FIGhyZWYgdG8gbWlzc2luZyBhdHRhY2htZW50IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9ESU1FX01JU01BVENIOgorICAgICAgKnMgPSAiRElNRSB2ZXJzaW9uL3RyYW5zbWlzc2lvbiBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfRElNRV9FTkQ6CisgICAgICAqcyA9ICJFbmQgb2YgRElNRSBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTUlNRV9FUlJPUjoKKyAgICAgICpzID0gIk1JTUUgZm9ybWF0IGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9NSU1FX0hSRUY6CisgICAgICAqcyA9ICJNSU1FIGhyZWYgdG8gbWlzc2luZyBhdHRhY2htZW50IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9NSU1FX0VORDoKKyAgICAgICpzID0gIkVuZCBvZiBNSU1FIGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9aTElCX0VSUk9SOgorI2lmZGVmIFdJVEhfWkxJQgorICAgICAgc3ByaW50Zihzb2FwLT5tc2didWYsICJabGliL2d6aXAgZXJyb3I6ICclcyciLCBzb2FwLT5kX3N0cmVhbS5tc2c/c29hcC0+ZF9zdHJlYW0ubXNnOiIiKTsKKyAgICAgICpzID0gc29hcC0+bXNnYnVmOworI2Vsc2UKKyAgICAgICpzID0gIlpsaWIvZ3ppcCBub3QgaW5zdGFsbGVkIGZvciAoZGUpY29tcHJlc3Npb246IHJlY29tcGlsZSB3aXRoIC1EV0lUSF9HWklQIjsKKyNlbmRpZgorICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1JFUVVJUkVEOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJtaXNzaW5nIHJlcXVpcmVkIGF0dHJpYnV0ZSIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1BST0hJQklURUQ6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgInByb2hpYml0ZWQgYXR0cmlidXRlIHByZXNlbnQiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9PQ0NVUlM6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgIm1pbi9tYXhPY2N1cnMgdmlvbGF0aW9uIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTEVOR1RIOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJjb250ZW50IGxlbmd0aCB2aW9sYXRpb24iLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9TVE9QOgorICAgICAgKnMgPSAiU3RvcHBlZDogbm8gcmVzcG9uc2Ugc2VudCI7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgU09BUF9FT0Y6CisjaWZuZGVmIFdJVEhfTk9JTworICAgICAgc3ByaW50Zihzb2FwLT5tc2didWYsICJFbmQgb2YgZmlsZSBvciBubyBpbnB1dDogJyVzJyIsIHNvYXBfc3RyZXJyb3Ioc29hcCkpOworICAgICAgKnMgPSBzb2FwLT5tc2didWY7CisgICAgICBicmVhazsKKyNlbHNlCisgICAgICAqcyA9ICJFbmQgb2YgZmlsZSBvciBubyBpbnB1dCI7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgaWYgKHNvYXAtPmVycm9yID4gMjAwICYmIHNvYXAtPmVycm9yIDwgNjAwKQorICAgICAgeyBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIkhUVFAgRXJyb3I6ICVkICVzIiwgc29hcC0+ZXJyb3IsIGh0dHBfZXJyb3Ioc29hcCwgc29hcC0+ZXJyb3IpKTsKKyAgICAgICAgKnMgPSBzb2FwLT5tc2didWY7CisgICAgICB9CisgICAgICBlbHNlCisjZW5kaWYKKyNlbmRpZgorICAgICAgeyBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIkVycm9yICVkIiwgc29hcC0+ZXJyb3IpOworICAgICAgICAqcyA9IHNvYXAtPm1zZ2J1ZjsKKyAgICAgIH0KKyAgICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2VuZF9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IHN0YXR1cyA9IHNvYXAtPmVycm9yOworICBpbnQgciA9IDE7CisgIGlmIChzdGF0dXMgPT0gU09BUF9TVE9QKQorICAgIHJldHVybiBzdGF0dXM7CisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJTZW5kaW5nIGJhY2sgZmF1bHQgc3RydWN0IGZvciBlcnJvciBjb2RlICVkXG4iLCBzb2FwLT5lcnJvcikpOworICBzb2FwLT5rZWVwX2FsaXZlID0gMDsgLyogdG8gdGVybWluYXRlIGNvbm5lY3Rpb24gKi8KKyAgc29hcF9zZXRfZmF1bHQoc29hcCk7CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICBmZF9zZXQgcmZkLCBzZmQ7CisgICAgdGltZW91dC50dl9zZWMgPSAwOworICAgIHRpbWVvdXQudHZfdXNlYyA9IDA7CisgICAgRkRfWkVSTygmcmZkKTsKKyAgICBGRF9aRVJPKCZzZmQpOworICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmcmZkKTsKKyAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnNmZCk7CisgICAgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCAmcmZkLCAmc2ZkLCBOVUxMLCAmdGltZW91dCk7CisgICAgaWYgKHIgPiAwKQorICAgIHsgaWYgKCFGRF9JU1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmc2ZkKQorICAgICAgIHx8IChGRF9JU1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmcmZkKQorICAgICAgICAmJiByZWN2KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHNvYXAtPnRtcGJ1ZiwgMSwgTVNHX1BFRUspIDwgMCkpCisgICAgICAgIHIgPSAwOworICAgIH0KKyAgfQorI2VuZGlmCisjZW5kaWYKKyAgaWYgKChzdGF0dXMgIT0gU09BUF9FT0YgfHwgKCFzb2FwLT5yZWN2X3RpbWVvdXQgJiYgIXNvYXAtPnNlbmRfdGltZW91dCkpICYmIHIgPiAwKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgICBzb2FwX3NlcmlhbGl6ZWhlYWRlcihzb2FwKTsKKyAgICBzb2FwX3NlcmlhbGl6ZWZhdWx0KHNvYXApOworICAgIHNvYXBfYmVnaW5fY291bnQoc29hcCk7CisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICB7IHNvYXBfZW52ZWxvcGVfYmVnaW5fb3V0KHNvYXApOworICAgICAgc29hcF9wdXRoZWFkZXIoc29hcCk7CisgICAgICBzb2FwX2JvZHlfYmVnaW5fb3V0KHNvYXApOworICAgICAgc29hcF9wdXRmYXVsdChzb2FwKTsKKyAgICAgIHNvYXBfYm9keV9lbmRfb3V0KHNvYXApOworICAgICAgc29hcF9lbnZlbG9wZV9lbmRfb3V0KHNvYXApOworICAgIH0KKyAgICBzb2FwX2VuZF9jb3VudChzb2FwKTsKKyAgICBpZiAoc29hcF9yZXNwb25zZShzb2FwLCBzdGF0dXMpCisgICAgIHx8IHNvYXBfZW52ZWxvcGVfYmVnaW5fb3V0KHNvYXApCisgICAgIHx8IHNvYXBfcHV0aGVhZGVyKHNvYXApCisgICAgIHx8IHNvYXBfYm9keV9iZWdpbl9vdXQoc29hcCkKKyAgICAgfHwgc29hcF9wdXRmYXVsdChzb2FwKQorICAgICB8fCBzb2FwX2JvZHlfZW5kX291dChzb2FwKQorICAgICB8fCBzb2FwX2VudmVsb3BlX2VuZF9vdXQoc29hcCkpCisgICAgICByZXR1cm4gc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgc29hcF9lbmRfc2VuZChzb2FwKTsKKyAgfQorICBzb2FwLT5lcnJvciA9IHN0YXR1czsKKyAgcmV0dXJuIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlY3ZfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBzdGF0dXMgPSBzb2FwLT5lcnJvcjsKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlY2VpdmluZyBTT0FQIEZhdWx0XG4iKSk7CisgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgaWYgKHNvYXBfZ2V0ZmF1bHQoc29hcCkpCisgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVycm9yOiBzb2FwX2dldF9zb2FwZmF1bHQoKSBmYWlsZWQuIElzIHRoaXMgYSBTT0FQIG1lc3NhZ2UgYXQgYWxsP1xuIikpOworICAgICpzb2FwX2ZhdWx0Y29kZShzb2FwKSA9IChzb2FwLT52ZXJzaW9uID09IDIgPyAiU09BUC1FTlY6U2VuZGVyIiA6ICJTT0FQLUVOVjpDbGllbnQiKTsKKyAgICBzb2FwLT5lcnJvciA9IHN0YXR1czsKKyAgICBzb2FwX3NldF9mYXVsdChzb2FwKTsKKyAgfQorICBlbHNlCisgIHsgcmVnaXN0ZXIgY29uc3QgY2hhciAqcyA9ICpzb2FwX2ZhdWx0Y29kZShzb2FwKTsKKyAgICBpZiAoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHMsICJTT0FQLUVOVjpTZXJ2ZXIiKSB8fCAhc29hcF9tYXRjaF90YWcoc29hcCwgcywgIlNPQVAtRU5WOlJlY2VpdmVyIikpCisgICAgICBzdGF0dXMgPSBTT0FQX1NWUl9GQVVMVDsgCisgICAgZWxzZSBpZiAoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHMsICJTT0FQLUVOVjpDbGllbnQiKSB8fCAhc29hcF9tYXRjaF90YWcoc29hcCwgcywgIlNPQVAtRU5WOlNlbmRlciIpKQorICAgICAgc3RhdHVzID0gU09BUF9DTElfRkFVTFQ7CisgICAgZWxzZSBpZiAoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHMsICJTT0FQLUVOVjpNdXN0VW5kZXJzdGFuZCIpKQorICAgICAgc3RhdHVzID0gU09BUF9NVVNUVU5ERVJTVEFORDsKKyAgICBlbHNlIGlmICghc29hcF9tYXRjaF90YWcoc29hcCwgcywgIlNPQVAtRU5WOlZlcnNpb25NaXNtYXRjaCIpKQorICAgICAgc3RhdHVzID0gU09BUF9WRVJTSU9OTUlTTUFUQ0g7CisgICAgZWxzZQorICAgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZhdWx0IGNvZGUgJXNcbiIsIHMpKTsKKyAgICAgIHN0YXR1cyA9IFNPQVBfRkFVTFQ7CisgICAgfQorICAgIGlmIChzb2FwX2JvZHlfZW5kX2luKHNvYXApCisgICAgIHx8IHNvYXBfZW52ZWxvcGVfZW5kX2luKHNvYXApCisgICAgIHx8IHNvYXBfZW5kX3JlY3Yoc29hcCkpCisgICAgICByZXR1cm4gc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgc29hcC0+ZXJyb3IgPSBzdGF0dXM7CisgIH0KKyAgcmV0dXJuIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmRfZW1wdHlfcmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPmNvdW50ID0gMDsKKyAgaWYgKHNvYXBfcmVzcG9uc2Uoc29hcCwgU09BUF9PSykgfHwgc29hcF9lbmRfc2VuZChzb2FwKSkKKyAgICByZXR1cm4gc29hcF9jbG9zZXNvY2soc29hcCk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVjdl9lbXB0eV9yZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXBfYmVnaW5fcmVjdihzb2FwKSB8fCBzb2FwX2VuZF9yZWN2KHNvYXApKQorICAgIHJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY29uc3QgY2hhcioKK3NvYXBfc3RyZXJyb3Ioc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBlcnIgPSBzb2FwLT5lcnJudW07CisgIGlmIChlcnIpCisgIHsKKyNpZm5kZWYgV0lOMzIKKyAgICByZXR1cm4gc3RyZXJyb3IoZXJyKTsKKyNlbHNlCisgICAgRm9ybWF0TWVzc2FnZShGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTXxGT1JNQVRfTUVTU0FHRV9JR05PUkVfSU5TRVJUUywgTlVMTCwgZXJyLCAwLCAoTFBUU1RSKSZzb2FwLT5lcnJvcnN0ciwgc2l6ZW9mKHNvYXAtPmVycm9yc3RyKSwgTlVMTCk7CisgICAgcmV0dXJuIHNvYXAtPmVycm9yc3RyOworI2VuZGlmCisgIH0KKyAgcmV0dXJuICJPcGVyYXRpb24gaW50ZXJydXB0ZWQgb3IgdGltZWQgb3V0IjsKK30KKyNlbmRpZgorI2VuZGlmIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK3N0YXRpYyBpbnQKK3NvYXBfc2V0X2Vycm9yKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdGNvZGUsIGNvbnN0IGNoYXIgKmZhdWx0c3ViY29kZSwgY29uc3QgY2hhciAqZmF1bHRzdHJpbmcsIGNvbnN0IGNoYXIgKmZhdWx0ZGV0YWlsLCBpbnQgc29hcGVycm9yKQoreyAqc29hcF9mYXVsdGNvZGUoc29hcCkgPSBmYXVsdGNvZGU7CisgIGlmIChmYXVsdHN1YmNvZGUpCisgICAgKnNvYXBfZmF1bHRzdWJjb2RlKHNvYXApID0gZmF1bHRzdWJjb2RlOworICAqc29hcF9mYXVsdHN0cmluZyhzb2FwKSA9IGZhdWx0c3RyaW5nOworICBpZiAoZmF1bHRkZXRhaWwgJiYgKmZhdWx0ZGV0YWlsKQorICB7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKipzID0gc29hcF9mYXVsdGRldGFpbChzb2FwKTsKKyAgICBpZiAocykKKyAgICAgICpzID0gZmF1bHRkZXRhaWw7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yID0gc29hcGVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCwgaW50IHNvYXBlcnJvcikKK3sgcmV0dXJuIHNvYXBfc2V0X2Vycm9yKHNvYXAsIHNvYXAtPnZlcnNpb24gPT0gMiA/ICJTT0FQLUVOVjpTZW5kZXIiIDogIlNPQVAtRU5WOkNsaWVudCIsIE5VTEwsIGZhdWx0c3RyaW5nLCBmYXVsdGRldGFpbCwgc29hcGVycm9yKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCwgaW50IHNvYXBlcnJvcikKK3sgcmV0dXJuIHNvYXBfc2V0X2Vycm9yKHNvYXAsIHNvYXAtPnZlcnNpb24gPT0gMiA/ICJTT0FQLUVOVjpSZWNlaXZlciIgOiAiU09BUC1FTlY6U2VydmVyIiwgTlVMTCwgZmF1bHRzdHJpbmcsIGZhdWx0ZGV0YWlsLCBzb2FwZXJyb3IpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorc3RhdGljIGludAorc29hcF9jb3B5X2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdGNvZGUsIGNvbnN0IGNoYXIgKmZhdWx0c3ViY29kZSwgY29uc3QgY2hhciAqZmF1bHRzdHJpbmcsIGNvbnN0IGNoYXIgKmZhdWx0ZGV0YWlsKQoreyBjaGFyICpyID0gTlVMTCwgKnMgPSBOVUxMLCAqdCA9IE5VTEw7CisgIGlmIChmYXVsdHN1YmNvZGUpCisgICAgciA9IHNvYXBfc3RyZHVwKHNvYXAsIGZhdWx0c3ViY29kZSk7CisgIGlmIChmYXVsdHN0cmluZykKKyAgICBzID0gc29hcF9zdHJkdXAoc29hcCwgZmF1bHRzdHJpbmcpOworICBpZiAoZmF1bHRkZXRhaWwpCisgICAgdCA9IHNvYXBfc3RyZHVwKHNvYXAsIGZhdWx0ZGV0YWlsKTsKKyAgcmV0dXJuIHNvYXBfc2V0X2Vycm9yKHNvYXAsIGZhdWx0Y29kZSwgciwgcywgdCwgU09BUF9GQVVMVCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2VuZGVyX2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdHN0cmluZywgY29uc3QgY2hhciAqZmF1bHRkZXRhaWwpCit7IHJldHVybiBzb2FwX3NlbmRlcl9mYXVsdF9zdWJjb2RlKHNvYXAsIE5VTEwsIGZhdWx0c3RyaW5nLCBmYXVsdGRldGFpbCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2VuZGVyX2ZhdWx0X3N1YmNvZGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZhdWx0c3ViY29kZSwgY29uc3QgY2hhciAqZmF1bHRzdHJpbmcsIGNvbnN0IGNoYXIgKmZhdWx0ZGV0YWlsKQoreyByZXR1cm4gc29hcF9jb3B5X2ZhdWx0KHNvYXAsIHNvYXAtPnZlcnNpb24gPT0gMiA/ICJTT0FQLUVOVjpTZW5kZXIiIDogIlNPQVAtRU5WOkNsaWVudCIsIGZhdWx0c3ViY29kZSwgZmF1bHRzdHJpbmcsIGZhdWx0ZGV0YWlsKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWNlaXZlcl9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRzdHJpbmcsIGNvbnN0IGNoYXIgKmZhdWx0ZGV0YWlsKQoreyByZXR1cm4gc29hcF9yZWNlaXZlcl9mYXVsdF9zdWJjb2RlKHNvYXAsIE5VTEwsIGZhdWx0c3RyaW5nLCBmYXVsdGRldGFpbCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVjZWl2ZXJfZmF1bHRfc3ViY29kZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRzdWJjb2RlLCBjb25zdCBjaGFyICpmYXVsdHN0cmluZywgY29uc3QgY2hhciAqZmF1bHRkZXRhaWwpCit7IHJldHVybiBzb2FwX2NvcHlfZmF1bHQoc29hcCwgc29hcC0+dmVyc2lvbiA9PSAyID8gIlNPQVAtRU5WOlJlY2VpdmVyIiA6ICJTT0FQLUVOVjpTZXJ2ZXIiLCBmYXVsdHN1YmNvZGUsIGZhdWx0c3RyaW5nLCBmYXVsdGRldGFpbCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCisjaWZuZGVmIFdJVEhfTk9TVERMSUIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfcHJpbnRfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXAsIEZJTEUgKmZkKQoreyBpZiAoc29hcF9jaGVja19zdGF0ZShzb2FwKSkKKyAgICBmcHJpbnRmKGZkLCAiRXJyb3I6IHNvYXAgc3RydWN0IG5vdCBpbml0aWFsaXplZFxuIik7CisgIGVsc2UgaWYgKHNvYXAtPmVycm9yKQorICB7IGNvbnN0IGNoYXIgKmMsICp2ID0gTlVMTCwgKnMsICoqZDsKKyAgICBkID0gc29hcF9mYXVsdGNvZGUoc29hcCk7CisgICAgaWYgKCEqZCkKKyAgICAgIHNvYXBfc2V0X2ZhdWx0KHNvYXApOworICAgIGMgPSAqZDsKKyAgICBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICAgICAgdiA9ICpzb2FwX2ZhdWx0c3ViY29kZShzb2FwKTsKKyAgICBzID0gKnNvYXBfZmF1bHRzdHJpbmcoc29hcCk7CisgICAgZCA9IHNvYXBfZmF1bHRkZXRhaWwoc29hcCk7CisgICAgZnByaW50ZihmZCwgIiVzJWQgZmF1bHQ6ICVzIFslc11cblwiJXNcIlxuRGV0YWlsOiAlc1xuIiwgc29hcC0+dmVyc2lvbiA/ICJTT0FQIDEuIiA6ICJFcnJvciAiLCBzb2FwLT52ZXJzaW9uID8gKGludClzb2FwLT52ZXJzaW9uIDogc29hcC0+ZXJyb3IsIGMsIHYgPyB2IDogIm5vIHN1YmNvZGUiLCBzID8gcyA6ICJbbm8gcmVhc29uXSIsIGQgJiYgKmQgPyAqZCA6ICJbbm8gZGV0YWlsXSIpOworICB9Cit9CisjZW5kaWYKKyNlbmRpZgorIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCisjaWZuZGVmIFdJVEhfTk9TVERMSUIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfcHJpbnRfZmF1bHRfbG9jYXRpb24oc3RydWN0IHNvYXAgKnNvYXAsIEZJTEUgKmZkKQoreyAKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGludCBpLCBqLCBjMSwgYzI7CisgIGlmIChzb2FwLT5lcnJvciAmJiBzb2FwLT5idWZsZW4gPiAwKQorICB7IGkgPSAoaW50KXNvYXAtPmJ1ZmlkeCAtIDE7CisgICAgaWYgKGkgPD0gMCkKKyAgICAgIGkgPSAwOworICAgIGMxID0gc29hcC0+YnVmW2ldOworICAgIHNvYXAtPmJ1ZltpXSA9ICdcMCc7CisgICAgaWYgKChpbnQpc29hcC0+YnVmbGVuID49IGkgKyAxMDI0KQorICAgICAgaiA9IGkgKyAxMDIzOworICAgIGVsc2UKKyAgICAgIGogPSAoaW50KXNvYXAtPmJ1ZmxlbiAtIDE7CisgICAgYzIgPSBzb2FwLT5idWZbal07CisgICAgc29hcC0+YnVmW2pdID0gJ1wwJzsKKyAgICBmcHJpbnRmKGZkLCAiJXMlY1xuKiogSEVSRSAqKlxuIiwgc29hcC0+YnVmLCBjMSk7CisgICAgaWYgKHNvYXAtPmJ1ZmlkeCA8IHNvYXAtPmJ1ZmxlbikKKyAgICAgIGZwcmludGYoZmQsICIlc1xuIiwgc29hcC0+YnVmICsgc29hcC0+YnVmaWR4KTsKKyAgICBzb2FwLT5idWZbaV0gPSBjMTsKKyAgICBzb2FwLT5idWZbal0gPSBjMjsKKyAgfQorI2VuZGlmCit9CisjZW5kaWYKKyNlbmRpZgorIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVnaXN0ZXJfcGx1Z2luX2FyZyhzdHJ1Y3Qgc29hcCAqc29hcCwgaW50ICgqZmNyZWF0ZSkoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9wbHVnaW4qLCB2b2lkKiksIHZvaWQgKmFyZykKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGx1Z2luICpwOworICByZWdpc3RlciBpbnQgcjsKKyAgaWYgKCEocCA9IChzdHJ1Y3Qgc29hcF9wbHVnaW4qKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9wbHVnaW4pKSkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgIHAtPmlkID0gTlVMTDsKKyAgcC0+ZGF0YSA9IE5VTEw7CisgIHAtPmZjb3B5ID0gTlVMTDsKKyAgcC0+ZmRlbGV0ZSA9IE5VTEw7CisgIHIgPSBmY3JlYXRlKHNvYXAsIHAsIGFyZyk7CisgIGlmICghciAmJiBwLT5mZGVsZXRlKQorICB7IHAtPm5leHQgPSBzb2FwLT5wbHVnaW5zOworICAgIHNvYXAtPnBsdWdpbnMgPSBwOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVnaXN0ZXJlZCAnJXMnIHBsdWdpblxuIiwgcC0+aWQpKTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCByZWdpc3RlciBwbHVnaW4gJyVzJzogcGx1Z2luIHJldHVybmVkIGVycm9yICVkIChvciBmZGVsZXRlIGNhbGxiYWNrIG5vdCBzZXQpXG4iLCBwLT5pZD9wLT5pZDoiPyIsIHIpKTsKKyAgU09BUF9GUkVFKHNvYXAsIHApOworICByZXR1cm4gcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyB2b2lkICoKK2ZwbHVnaW4oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnA7CisgIGZvciAocCA9IHNvYXAtPnBsdWdpbnM7IHA7IHAgPSBwLT5uZXh0KQorICAgIGlmIChwLT5pZCA9PSBpZCB8fCAhc3RyY21wKHAtPmlkLCBpZCkpCisgICAgICByZXR1cm4gcC0+ZGF0YTsKKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkICoKK1NPQVBfRk1BQzIKK3NvYXBfbG9va3VwX3BsdWdpbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQpCit7IHJldHVybiBzb2FwLT5mcGx1Z2luKHNvYXAsIGlkKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIF9fY3BsdXNwbHVzCisjaWZuZGVmIFdJVEhfTEVBTgorc29hcDo6c29hcCgpCit7IHNvYXBfaW5pdCh0aGlzKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJQysrIHNvYXAgc3RydWN0IG1ldGhvZHMKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIF9fY3BsdXNwbHVzCisjaWZuZGVmIFdJVEhfTEVBTgorc29hcDo6c29hcChzb2FwX21vZGUgbW9kZSkKK3sgc29hcF9pbml0MSh0aGlzLCBtb2RlKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpZm5kZWYgV0lUSF9MRUFOCitzb2FwOjpzb2FwKHNvYXBfbW9kZSBpbW9kZSwgc29hcF9tb2RlIG9tb2RlKQoreyBzb2FwX2luaXQyKHRoaXMsIGltb2RlLCBvbW9kZSk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIF9fY3BsdXNwbHVzCisjaWZuZGVmIFdJVEhfTEVBTgorc29hcDo6c29hcChzdHJ1Y3Qgc29hcCYgc29hcCkKK3sgc29hcF9jb3B5X2NvbnRleHQodGhpcywgJnNvYXApOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworI2lmbmRlZiBXSVRIX0xFQU4KK3NvYXA6On5zb2FwKCkKK3sgc29hcF9kZXN0cm95KHRoaXMpOworICBzb2FwX2VuZCh0aGlzKTsKKyAgc29hcF9kb25lKHRoaXMpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2dzb2FwLXBhbG0vcGFsbXNvYXAxLmNwcCBiL2dzb2FwLXBhbG0vcGFsbXNvYXAxLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTI1ZjJlCi0tLSAvZGV2L251bGwKKysrIGIvZ3NvYXAtcGFsbS9wYWxtc29hcDEuY3BwCkBAIC0wLDAgKzEsMTM0NDkgQEAKKyNkZWZpbmUgUEFMTV8xCisvKgorCitzdGRzb2FwMi5jW3BwXSAyLjcuNmUKKworZ1NPQVAgcnVudGltZQorCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHBhcnQgb2YgdGhlIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2VzOgorR1BMLCB0aGUgZ1NPQVAgcHVibGljIGxpY2Vuc2UsIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDb250cmlidXRvcnM6CisKK1dpbmQgUml2ZXIgU3lzdGVtcyBJbmMuLCBmb3IgdGhlIGZvbGxvd2luZyBhZGRpdGlvbnMgdW5kZXIgZ1NPQVAgcHVibGljIGxpY2Vuc2U6CisgIC0gdnhXb3JrcyBjb21wYXRpYmxlCSgjZGVmaW5lIFZYV09SS1MpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgcHVibGljIGxpY2Vuc2UuCisKK1RoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGdTT0FQIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4zCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKK0xpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoraHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL3NvYXBsaWNlbnNlLmh0bWwKK1NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCitXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKK2ZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK1RoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4uCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJbnN0YWxsYXRpb24gbm90ZToKKworV2luMzIgYnVpbGQgbmVlZHMgd2luc29jay5kbGwgKFZpc3VhbCBDKysgIndzb2NrMzIubGliIikKK1RvIGRvIHRoaXMgaW4gVmlzdWFsIEMrKyA2LjAsIGdvIHRvICJQcm9qZWN0IiwgInNldHRpbmdzIiwgc2VsZWN0IHRoZSAiTGluayIKK3RhYiAodGhlIHByb2plY3QgZmlsZSBuZWVkcyB0byBiZSBzZWxlY3RlZCBpbiB0aGUgZmlsZSB2aWV3KSBhbmQgYWRkCisid3NvY2szMi5saWIiIHRvIHRoZSAiT2JqZWN0L2xpYnJhcnkgbW9kdWxlcyIgZW50cnkKKworT24gTWFjIE9TIFggd2l0aCBnY2MgKEdDQykgMy4xIDIwMDIwNDIwIChwcmVyZWxlYXNlKSB5b3UgTVVTVCBjb21waWxlIHdpdGgKKy1mc3RhY2tfY2hlY2sgd2hlbiB1c2luZyAtTzIgYmVjYXVzZSBnY2MgMy4xIGhhcyBhIGJ1ZyB0aGF0IHNtYXNoZXMgdGhlIHN0YWNrCit3aGVuIGxvY2FsbHkgYWxsb2NhdGVkIGRhdGEgZXhjZWVkcyA2NEsuCisKKyovCisKKyNpZmRlZiBBUzQwMAorIyBwcmFnbWEgY29udmVydCg4MTkpCS8qIEVCQ0RJQyB0byBBU0NJSSAqLworI2VuZGlmCisKKyNpbmNsdWRlICJzdGRzb2FwMi5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK1NPQVBfU09VUkNFX1NUQU1QKCJAKCMpIHN0ZHNvYXAyLmNwcCB2ZXIgMi43LjZlIDIwMDYtMDItMTggMTI6MDA6MDAgR01UIikKK2V4dGVybiAiQyIgeworI2Vsc2UKK1NPQVBfU09VUkNFX1NUQU1QKCJAKCMpIHN0ZHNvYXAyLmMgdmVyIDIuNy42ZSAyMDA2LTAyLTE4IDEyOjAwOjAwIEdNVCIpCisjZW5kaWYKKworLyogOGJpdCBjaGFyYWN0ZXIgcmVwcmVzZW50aW5nIHVua25vd24vbm9ucmVwcmVzZW50YWJsZSBjaGFyYWN0ZXIgZGF0YSAoZS5nLiBub3Qgc3VwcG9ydGVkIGJ5IGN1cnJlbnQgbG9jYWxlIHdpdGggbXVsdGlieXRlIHN1cHBvcnQgZW5hYmxlZCkgKi8KKyNpZm5kZWYgU09BUF9VTktOT1dOX0NIQVIKKyNkZWZpbmUgU09BUF9VTktOT1dOX0NIQVIgKDEyNykKKyNlbmRpZgorCisvKiAgICAgIEVPRj0tMSAqLworI2RlZmluZSBTT0FQX0xUIChzb2FwX3djaGFyKSgtMikgLyogWE1MIGNoYXJhY3RlciAnPCcgKi8KKyNkZWZpbmUgU09BUF9UVCAoc29hcF93Y2hhcikoLTMpIC8qIFhNTCBjaGFyYWN0ZXIgJzwvJyAqLworI2RlZmluZSBTT0FQX0dUIChzb2FwX3djaGFyKSgtNCkgLyogWE1MIGNoYXJhY3RlciAnPicgKi8KKyNkZWZpbmUgU09BUF9RVCAoc29hcF93Y2hhcikoLTUpIC8qIFhNTCBjaGFyYWN0ZXIgJyInICovCisjZGVmaW5lIFNPQVBfQVAgKHNvYXBfd2NoYXIpKC02KSAvKiBYTUwgY2hhcmFjdGVyICcnJyAqLworCisjZGVmaW5lIHNvYXBfYmxhbmsoYykJCSgoYykgPj0gMCAmJiAoYykgPD0gMzIpCisjZGVmaW5lIHNvYXBfbm90YmxhbmsoYykJKChjKSA+IDMyKQorI2RlZmluZSBzb2FwX2hhc2hfcHRyKHApCSgoKHVuc2lnbmVkIGxvbmcpKHApID4+IDMpICYgKFNPQVBfUFRSSEFTSCAtIDEpKQorCisjaWZkZWYgU09BUF9ERUJVRworc3RhdGljIHZvaWQgc29hcF9pbml0X2xvZ3Moc3RydWN0IHNvYXAqKTsKK3N0YXRpYyB2b2lkIHNvYXBfY2xvc2VfbG9nZmlsZShzdHJ1Y3Qgc29hcCosIGludCk7CitzdGF0aWMgdm9pZCBzb2FwX3NldF9sb2dmaWxlKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKik7CitzdGF0aWMgdm9pZCBzb2FwX2ZyZWVfbWh0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgdm9pZCBzb2FwX3RyYWNrX3VubGluayhzdHJ1Y3Qgc29hcCosIGNvbnN0IHZvaWQqKTsKKyNlbmRpZgorCisjaWZuZGVmIFBBTE1fMgorc3RhdGljIGludCBzb2FwX3NldF9lcnJvcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBpbnQpOworc3RhdGljIGludCBzb2FwX2NvcHlfZmF1bHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitzdGF0aWMgaW50IHNvYXBfZ2V0YXR0cnZhbChzdHJ1Y3Qgc29hcCosIGNoYXIqLCBzaXplX3QsIHNvYXBfd2NoYXIpOworI2VuZGlmCisKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc29hcF93Y2hhciBzb2FwX2NoYXIoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBzb2FwX3djaGFyIHNvYXBfZ2V0X3BpKHN0cnVjdCBzb2FwKik7CitzdGF0aWMgaW50IHNvYXBfaXN4ZGlnaXQoaW50KTsKK3N0YXRpYyB2b2lkICpmcGx1Z2luKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworI2lmbmRlZiBXSVRIX05PSURSRUYKK3N0YXRpYyB2b2lkIHNvYXBfdXBkYXRlX3B0cnMoc3RydWN0IHNvYXAqLCBjaGFyKiwgY2hhciosIGNoYXIqLCBjaGFyKik7CitzdGF0aWMgaW50IHNvYXBfaGFzX2NvcGllcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitzdGF0aWMgdm9pZCBzb2FwX2luaXRfaWh0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgdm9pZCBzb2FwX2ZyZWVfaWh0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgdm9pZCBzb2FwX2luaXRfcGh0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgdm9pZCBzb2FwX2ZyZWVfcGh0KHN0cnVjdCBzb2FwKik7CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIGNvbnN0IGNoYXIgKnNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworc3RhdGljIGludCBzb2FwX2lzbnVtZXJpYyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyB0aW1lX3Qgc29hcF90aW1lZ20oc3RydWN0IHRtKik7CitzdGF0aWMgc3RydWN0IHNvYXBfbmxpc3QgKnNvYXBfbG9va3VwX25zKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHNpemVfdCBuKTsKK3N0YXRpYyBzdHJ1Y3Qgc29hcF9ubGlzdCAqc29hcF9wdXNoX25zKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqbnMsIHNob3J0IHV0aWxpemVkKTsKK3N0YXRpYyB2b2lkIHNvYXBfcG9wX25zKHN0cnVjdCBzb2FwICpzb2FwKTsKK3N0YXRpYyB2b2lkIHNvYXBfdXRpbGl6ZV9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzaXplX3Qgbik7CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKnNvYXBfbmV3X211bHRpcGFydChzdHJ1Y3Qgc29hcCosIHN0cnVjdCBzb2FwX211bHRpcGFydCoqLCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKiwgY2hhciosIHNpemVfdCk7CitzdGF0aWMgaW50IHNvYXBfcHV0ZGltZWZpZWxkKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHNpemVfdCk7CitzdGF0aWMgY2hhciAqc29hcF9nZXRkaW1lZmllbGQoc3RydWN0IHNvYXAqLCBzaXplX3QpOworc3RhdGljIHZvaWQgc29hcF9zZWxlY3RfbWltZV9ib3VuZGFyeShzdHJ1Y3Qgc29hcCopOworc3RhdGljIGludCBzb2FwX3ZhbGlkX21pbWVfYm91bmRhcnkoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBpbnQgc29hcF9tYXRjaF9jaWQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworc3RhdGljIHZvaWQgc29hcF9yZXNvbHZlX2F0dGFjaG1lbnQoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBXSVRIX0daSVAKK3N0YXRpYyBpbnQgc29hcF9nZXRnemlwaGRyKHN0cnVjdCBzb2FwKik7CisjZW5kaWYKKworI2lmZGVmIFdJVEhfT1BFTlNTTAorc3RhdGljIGludCBzc2xfaW5pdF9kb25lID0gMDsKK3N0YXRpYyBpbnQgc3NsX2F1dGhfaW5pdChzdHJ1Y3Qgc29hcCopOworc3RhdGljIGludCBzc2xfdmVyaWZ5X2NhbGxiYWNrKGludCwgWDUwOV9TVE9SRV9DVFgqKTsKK3N0YXRpYyBpbnQgc3NsX3Bhc3N3b3JkKGNoYXIqLCBpbnQsIGludCwgdm9pZCAqKTsKK3N0YXRpYyBjb25zdCBjaGFyICpzc2xfZXJyb3Ioc3RydWN0IHNvYXAqLCBpbnQpOworLyogVGhpcyBjYWxsYmFjayBpcyBpbmNsdWRlZCBmb3IgZnV0dXJlIHJlZmVyZW5jZXMuIEl0IHNob3VsZCBub3QgYmUgZGVsZXRlZAorc3RhdGljIERIICpzc2xfdG1wX2RoKFNTTCosIGludCwgaW50KTsKKyovCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFdJVEhfTk9IVFRQKSB8fCAhZGVmaW5lZChXSVRIX0xFQU5FUikKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY29uc3QgY2hhciAqc29hcF9kZWNvZGUoY2hhciosIHNpemVfdCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc29hcF93Y2hhciBzb2FwX2dldGNodW5rY2hhcihzdHJ1Y3Qgc29hcCopOworc3RhdGljIGNvbnN0IGNoYXIgKmh0dHBfZXJyb3Ioc3RydWN0IHNvYXAqLCBpbnQpOworc3RhdGljIGludCBodHRwX3Bvc3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworc3RhdGljIGludCBodHRwX2dldChzdHJ1Y3Qgc29hcCopOworc3RhdGljIGludCBodHRwX3NlbmRfaGVhZGVyKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworc3RhdGljIGludCBodHRwX3Bvc3RfaGVhZGVyKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyBpbnQgaHR0cF9yZXNwb25zZShzdHJ1Y3Qgc29hcCosIGludCwgc2l6ZV90KTsKK3N0YXRpYyBpbnQgaHR0cF9wYXJzZShzdHJ1Y3Qgc29hcCopOworc3RhdGljIGludCBodHRwX3BhcnNlX2hlYWRlcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQgZnNlbmQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc2l6ZV90KTsKK3N0YXRpYyBzaXplX3QgZnJlY3Yoc3RydWN0IHNvYXAqLCBjaGFyKiwgc2l6ZV90KTsKK3N0YXRpYyBpbnQgdGNwX2luaXQoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBjb25zdCBjaGFyICp0Y3BfZXJyb3Ioc3RydWN0IHNvYXAqKTsKKyNpZm5kZWYgV0lUSF9JUFY2CitzdGF0aWMgaW50IHRjcF9nZXRob3N0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqYWRkciwgc3RydWN0IGluX2FkZHIgKmluYWRkcik7CisjZW5kaWYKK3N0YXRpYyBpbnQgdGNwX2Nvbm5lY3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICplbmRwb2ludCwgY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQpOworc3RhdGljIGludCB0Y3BfYWNjZXB0KHN0cnVjdCBzb2FwKiwgaW50LCBzdHJ1Y3Qgc29ja2FkZHIqLCBpbnQqKTsKK3N0YXRpYyBpbnQgdGNwX2Rpc2Nvbm5lY3Qoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBpbnQgdGNwX2Nsb3Nlc29ja2V0KHN0cnVjdCBzb2FwKiwgU09BUF9TT0NLRVQpOworc3RhdGljIGludCB0Y3Bfc2h1dGRvd25zb2NrZXQoc3RydWN0IHNvYXAqLCBTT0FQX1NPQ0tFVCwgaW50KTsKK3N0YXRpYyBjb25zdCBjaGFyICpzb2FwX3N0cmVycm9yKHN0cnVjdCBzb2FwKik7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQQUxNKSAmJiAhZGVmaW5lZChQQUxNXzIpCit1bnNpZ25lZCBzaG9ydCBlcnJubzsKKyNlbmRpZgorCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNvbnN0IGNoYXIgc29hcF9lbnYxWzQyXSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI7CitzdGF0aWMgY29uc3QgY2hhciBzb2FwX2VuYzFbNDJdID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIjsKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfZW52Mls0MF0gPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIjsKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfZW5jMls0MF0gPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVuY29kaW5nIjsKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfcnBjWzM1XSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtcnBjIjsKKyNlbmRpZgorCisjaWZuZGVmIFBBTE1fMQorY29uc3Qgc3RydWN0IHNvYXBfZG91YmxlX25hbiBzb2FwX2RvdWJsZV9uYW4gPSB7MHhGRkZGRkZGRiwgMHhGRkZGRkZGRn07CitzdGF0aWMgY29uc3QgY2hhciBzb2FwX2Jhc2U2NG9bNjVdID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOworc3RhdGljIGNvbnN0IGNoYXIgc29hcF9iYXNlNjRpWzgxXSA9ICJcNzZYWFhcNzdcNjRcNjVcNjZcNjdcNzBcNzFcNzJcNzNcNzRcNzVYWFhYWFhYXDAwXDAxXDAyXDAzXDA0XDA1XDA2XDA3XDEwXDExXDEyXDEzXDE0XDE1XDE2XDE3XDIwXDIxXDIyXDIzXDI0XDI1XDI2XDI3XDMwXDMxWFhYWFhYXDMyXDMzXDM0XDM1XDM2XDM3XDQwXDQxXDQyXDQzXDQ0XDQ1XDQ2XDQ3XDUwXDUxXDUyXDUzXDU0XDU1XDU2XDU3XDYwXDYxXDYyXDYzIjsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIGNvbnN0IGNoYXIgc29hcF9pbmRlbnRbMTFdID0gIlxuXHRcdFx0XHRcdFx0XHRcdFx0IjsKKy8qIEFsdGVybmF0aXZlIGluZGVudGF0aW9uIGZvcm0gZm9yIFNPQVBfWE1MX0lOREVOVDoKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfaW5kZW50WzIxXSA9ICJcbiAgICAgICAgICAgICAgICAgICAiOworKi8KKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciBzb2FwX3BhZGRpbmdbNF0gPSAiXDBcMFwwIjsKKyNkZWZpbmUgU09BUF9TVFJfUEFERElORyAoc29hcF9wYWRkaW5nKQorI2RlZmluZSBTT0FQX1NUUl9FT1MgKHNvYXBfcGFkZGluZykKKyNkZWZpbmUgU09BUF9OT05fTlVMTCAoc29hcF9wYWRkaW5nKQorCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwIGh0bWxfZW50aXR5X2NvZGVzW10gPSAvKiBlbnRpdGllcyBmb3IgWEhUTUwgcGFyc2luZyAqLworeyB7IDE2MCwgIm5ic3AiIH0sCisgIHsgMTYxLCAiaWV4Y2wiIH0sCisgIHsgMTYyLCAiY2VudCIgfSwKKyAgeyAxNjMsICJwb3VuZCIgfSwKKyAgeyAxNjQsICJjdXJyZW4iIH0sCisgIHsgMTY1LCAieWVuIiB9LAorICB7IDE2NiwgImJydmJhciIgfSwKKyAgeyAxNjcsICJzZWN0IiB9LAorICB7IDE2OCwgInVtbCIgfSwKKyAgeyAxNjksICJjb3B5IiB9LAorICB7IDE3MCwgIm9yZGYiIH0sCisgIHsgMTcxLCAibGFxdW8iIH0sCisgIHsgMTcyLCAibm90IiB9LAorICB7IDE3MywgInNoeSIgfSwKKyAgeyAxNzQsICJyZWciIH0sCisgIHsgMTc1LCAibWFjciIgfSwKKyAgeyAxNzYsICJkZWciIH0sCisgIHsgMTc3LCAicGx1c21uIiB9LAorICB7IDE3OCwgInN1cDIiIH0sCisgIHsgMTc5LCAic3VwMyIgfSwKKyAgeyAxODAsICJhY3V0ZSIgfSwKKyAgeyAxODEsICJtaWNybyIgfSwKKyAgeyAxODIsICJwYXJhIiB9LAorICB7IDE4MywgIm1pZGRvdCIgfSwKKyAgeyAxODQsICJjZWRpbCIgfSwKKyAgeyAxODUsICJzdXAxIiB9LAorICB7IDE4NiwgIm9yZG0iIH0sCisgIHsgMTg3LCAicmFxdW8iIH0sCisgIHsgMTg4LCAiZnJhYzE0IiB9LAorICB7IDE4OSwgImZyYWMxMiIgfSwKKyAgeyAxOTAsICJmcmFjMzQiIH0sCisgIHsgMTkxLCAiaXF1ZXN0IiB9LAorICB7IDE5MiwgIkFncmF2ZSIgfSwKKyAgeyAxOTMsICJBYWN1dGUiIH0sCisgIHsgMTk0LCAiQWNpcmMiIH0sCisgIHsgMTk1LCAiQXRpbGRlIiB9LAorICB7IDE5NiwgIkF1bWwiIH0sCisgIHsgMTk3LCAiQXJpbmciIH0sCisgIHsgMTk4LCAiQUVsaWciIH0sCisgIHsgMTk5LCAiQ2NlZGlsIiB9LAorICB7IDIwMCwgIkVncmF2ZSIgfSwKKyAgeyAyMDEsICJFYWN1dGUiIH0sCisgIHsgMjAyLCAiRWNpcmMiIH0sCisgIHsgMjAzLCAiRXVtbCIgfSwKKyAgeyAyMDQsICJJZ3JhdmUiIH0sCisgIHsgMjA1LCAiSWFjdXRlIiB9LAorICB7IDIwNiwgIkljaXJjIiB9LAorICB7IDIwNywgIkl1bWwiIH0sCisgIHsgMjA4LCAiRVRIIiB9LAorICB7IDIwOSwgIk50aWxkZSIgfSwKKyAgeyAyMTAsICJPZ3JhdmUiIH0sCisgIHsgMjExLCAiT2FjdXRlIiB9LAorICB7IDIxMiwgIk9jaXJjIiB9LAorICB7IDIxMywgIk90aWxkZSIgfSwKKyAgeyAyMTQsICJPdW1sIiB9LAorICB7IDIxNSwgInRpbWVzIiB9LAorICB7IDIxNiwgIk9zbGFzaCIgfSwKKyAgeyAyMTcsICJVZ3JhdmUiIH0sCisgIHsgMjE4LCAiVWFjdXRlIiB9LAorICB7IDIxOSwgIlVjaXJjIiB9LAorICB7IDIyMCwgIlV1bWwiIH0sCisgIHsgMjIxLCAiWWFjdXRlIiB9LAorICB7IDIyMiwgIlRIT1JOIiB9LAorICB7IDIyMywgInN6bGlnIiB9LAorICB7IDIyNCwgImFncmF2ZSIgfSwKKyAgeyAyMjUsICJhYWN1dGUiIH0sCisgIHsgMjI2LCAiYWNpcmMiIH0sCisgIHsgMjI3LCAiYXRpbGRlIiB9LAorICB7IDIyOCwgImF1bWwiIH0sCisgIHsgMjI5LCAiYXJpbmciIH0sCisgIHsgMjMwLCAiYWVsaWciIH0sCisgIHsgMjMxLCAiY2NlZGlsIiB9LAorICB7IDIzMiwgImVncmF2ZSIgfSwKKyAgeyAyMzMsICJlYWN1dGUiIH0sCisgIHsgMjM0LCAiZWNpcmMiIH0sCisgIHsgMjM1LCAiZXVtbCIgfSwKKyAgeyAyMzYsICJpZ3JhdmUiIH0sCisgIHsgMjM3LCAiaWFjdXRlIiB9LAorICB7IDIzOCwgImljaXJjIiB9LAorICB7IDIzOSwgIml1bWwiIH0sCisgIHsgMjQwLCAiZXRoIiB9LAorICB7IDI0MSwgIm50aWxkZSIgfSwKKyAgeyAyNDIsICJvZ3JhdmUiIH0sCisgIHsgMjQzLCAib2FjdXRlIiB9LAorICB7IDI0NCwgIm9jaXJjIiB9LAorICB7IDI0NSwgIm90aWxkZSIgfSwKKyAgeyAyNDYsICJvdW1sIiB9LAorICB7IDI0NywgImRpdmlkZSIgfSwKKyAgeyAyNDgsICJvc2xhc2giIH0sCisgIHsgMjQ5LCAidWdyYXZlIiB9LAorICB7IDI1MCwgInVhY3V0ZSIgfSwKKyAgeyAyNTEsICJ1Y2lyYyIgfSwKKyAgeyAyNTIsICJ1dW1sIiB9LAorICB7IDI1MywgInlhY3V0ZSIgfSwKKyAgeyAyNTQsICJ0aG9ybiIgfSwKKyAgeyAyNTUsICJ5dW1sIiB9LAorICB7ICAgMCwgTlVMTCB9Cit9OworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwIGhfZXJyb3JfY29kZXNbXSA9Cit7CisjaWZkZWYgSE9TVF9OT1RfRk9VTkQgICAKKyAgeyBIT1NUX05PVF9GT1VORCwgIkhvc3Qgbm90IGZvdW5kIiB9LAorI2VuZGlmCisjaWZkZWYgVFJZX0FHQUlOCisgIHsgVFJZX0FHQUlOLCAiVHJ5IEFnYWluIiB9LAorI2VuZGlmCisjaWZkZWYgTk9fUkVDT1ZFUlkgIAorICB7IE5PX1JFQ09WRVJZLCAiTm8gUmVjb3ZlcnkiIH0sCisjZW5kaWYKKyNpZmRlZiBOT19EQVRBCisgIHsgTk9fREFUQSwgIk5vIERhdGEiIH0sCisjZW5kaWYKKyNpZmRlZiBOT19BRERSRVNTCisgIHsgTk9fQUREUkVTUywgIk5vIEFkZHJlc3MiIH0sCisjZW5kaWYKKyAgeyAwLCBOVUxMIH0KK307CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwIGhfaHR0cF9lcnJvcl9jb2Rlc1tdID0KK3sgeyAyMDEsICJDcmVhdGVkIiB9LAorICB7IDIwMiwgIkFjY2VwdGVkIiB9LAorICB7IDIwMywgIk5vbi1BdXRob3JpdGF0aXZlIEluZm9ybWF0aW9uIiB9LAorICB7IDIwNCwgIk5vIENvbnRlbnQiIH0sCisgIHsgMjA1LCAiUmVzZXQgQ29udGVudCIgfSwKKyAgeyAyMDYsICJQYXJ0aWFsIENvbnRlbnQiIH0sCisgIHsgMzAwLCAiTXVsdGlwbGUgQ2hvaWNlcyIgfSwKKyAgeyAzMDEsICJNb3ZlZCBQZXJtYW5lbnRseSIgfSwKKyAgeyAzMDIsICJGb3VuZCIgfSwKKyAgeyAzMDMsICJTZWUgT3RoZXIiIH0sCisgIHsgMzA0LCAiTm90IE1vZGlmaWVkIiB9LAorICB7IDMwNSwgIlVzZSBQcm94eSIgfSwKKyAgeyAzMDcsICJUZW1wb3JhcnkgUmVkaXJlY3QiIH0sCisgIHsgNDAwLCAiQmFkIFJlcXVlc3QiIH0sCisgIHsgNDAxLCAiVW5hdXRob3JpemVkIiB9LAorICB7IDQwMiwgIlBheW1lbnQgUmVxdWlyZWQiIH0sCisgIHsgNDAzLCAiRm9yYmlkZGVuIiB9LAorICB7IDQwNCwgIk5vdCBGb3VuZCIgfSwKKyAgeyA0MDUsICJNZXRob2QgTm90IEFsbG93ZWQiIH0sCisgIHsgNDA2LCAiTm90IEFjY2VwdGFibGUiIH0sCisgIHsgNDA3LCAiUHJveHkgQXV0aGVudGljYXRpb24gUmVxdWlyZWQiIH0sCisgIHsgNDA4LCAiUmVxdWVzdCBUaW1lLW91dCIgfSwKKyAgeyA0MDksICJDb25mbGljdCIgfSwKKyAgeyA0MTAsICJHb25lIiB9LAorICB7IDQxMSwgIkxlbmd0aCBSZXF1aXJlZCIgfSwKKyAgeyA0MTIsICJQcmVjb25kaXRpb24gRmFpbGVkIiB9LAorICB7IDQxMywgIlJlcXVlc3QgRW50aXR5IFRvbyBMYXJnZSIgfSwKKyAgeyA0MTQsICJSZXF1ZXN0LVVSSSBUb28gTGFyZ2UiIH0sCisgIHsgNDE1LCAiVW5zdXBwb3J0ZWQgTWVkaWEgVHlwZSIgfSwKKyAgeyA0MTYsICJSZXF1ZXN0ZWQgcmFuZ2Ugbm90IHNhdGlzZmlhYmxlIiB9LAorICB7IDQxNywgIkV4cGVjdGF0aW9uIEZhaWxlZCIgfSwKKyAgeyA1MDAsICJJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IiIH0sCisgIHsgNTAxLCAiTm90IEltcGxlbWVudGVkIiB9LAorICB7IDUwMiwgIkJhZCBHYXRld2F5IiB9LAorICB7IDUwMywgIlNlcnZpY2UgVW5hdmFpbGFibGUiIH0sCisgIHsgNTA0LCAiR2F0ZXdheSBUaW1lLW91dCIgfSwKKyAgeyA1MDUsICJIVFRQIFZlcnNpb24gbm90IHN1cHBvcnRlZCIgfSwKKyAgeyAgIDAsIE5VTEwgfQorfTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBXSVRIX09QRU5TU0wKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCBoX3NzbF9lcnJvcl9jb2Rlc1tdID0KK3sKKyNkZWZpbmUgX1NTTF9FUlJPUihlKSB7IGUsICNlIH0KKyAgX1NTTF9FUlJPUihTU0xfRVJST1JfU1NMKSwKKyAgX1NTTF9FUlJPUihTU0xfRVJST1JfWkVST19SRVRVUk4pLAorICBfU1NMX0VSUk9SKFNTTF9FUlJPUl9XQU5UX1JFQUQpLAorICBfU1NMX0VSUk9SKFNTTF9FUlJPUl9XQU5UX1dSSVRFKSwKKyAgX1NTTF9FUlJPUihTU0xfRVJST1JfV0FOVF9DT05ORUNUKSwKKyAgX1NTTF9FUlJPUihTU0xfRVJST1JfV0FOVF9YNTA5X0xPT0tVUCksCisgIF9TU0xfRVJST1IoU1NMX0VSUk9SX1NZU0NBTEwpLAorICB7IDAsIE5VTEwgfQorfTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTkVSCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgbWltZV9jb2Rlc1tdID0KK3sgeyBTT0FQX01JTUVfN0JJVCwJCSI3Yml0IiB9LAorICB7IFNPQVBfTUlNRV84QklULAkJIjhiaXQiIH0sCisgIHsgU09BUF9NSU1FX0JJTkFSWSwJCSJiaW5hcnkiIH0sCisgIHsgU09BUF9NSU1FX1FVT1RFRF9QUklOVEFCTEUsICJxdW90ZWQtcHJpbnRhYmxlIiB9LAorICB7IFNPQVBfTUlNRV9CQVNFNjQsCQkiYmFzZTY0IiB9LAorICB7IFNPQVBfTUlNRV9JRVRGX1RPS0VOLAkiaWV0Zi10b2tlbiIgfSwKKyAgeyBTT0FQX01JTUVfWF9UT0tFTiwJCSJ4LXRva2VuIiB9LAorICB7IDAsCQkJCU5VTEwgfQorfTsKKyNlbmRpZgorCisjaWZkZWYgV0lOMzIKK3N0YXRpYyBpbnQgdGNwX2RvbmUgPSAwOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK2ZzZW5kKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBzaXplX3QgbikKK3sgcmVnaXN0ZXIgaW50IG53cml0dGVuOworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpICYmICFkZWZpbmVkKFdJVEhfTEVBTikKKyAgaWYgKHNvYXAtPm9zKQorICB7IHNvYXAtPm9zLT53cml0ZShzLCBuKTsKKyAgICBpZiAoc29hcC0+b3MtPmdvb2QoKSkKKyAgICAgIHJldHVybiBTT0FQX09LOworICAgIHJldHVybiBTT0FQX0VPRjsKKyAgfQorI2VuZGlmCisgIHdoaWxlIChuKQorICB7IGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICAgIHsgCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgaWYgKHNvYXAtPnNlbmRfdGltZW91dCkKKyAgICAgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgICAgZmRfc2V0IGZkOworICAgICAgICBpZiAoc29hcC0+c2VuZF90aW1lb3V0ID4gMCkKKyAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IHNvYXAtPnNlbmRfdGltZW91dDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IC1zb2FwLT5zZW5kX3RpbWVvdXQvMTAwMDAwMDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAtc29hcC0+c2VuZF90aW1lb3V0JTEwMDAwMDA7CisgICAgICAgIH0KKyAgICAgICAgRkRfWkVSTygmZmQpOworICAgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJmZkKTsKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeyByZWdpc3RlciBpbnQgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCBOVUxMLCAmZmQsICZmZCwgJnRpbWVvdXQpOworICAgICAgICAgIGlmIChyID4gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGlmICghcikKKyAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IDA7CisgICAgICAgICAgICByZXR1cm4gU09BUF9FT0Y7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUFHQUlOKQorICAgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgICByZXR1cm4gU09BUF9FT0Y7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICAgIGlmIChzb2FwLT5zc2wpCisgICAgICAgIG53cml0dGVuID0gU1NMX3dyaXRlKHNvYXAtPnNzbCwgcywgbik7CisgICAgICBlbHNlIGlmIChzb2FwLT5iaW8pCisgICAgICAgIG53cml0dGVuID0gQklPX3dyaXRlKHNvYXAtPmJpbywgcywgbik7CisgICAgICBlbHNlCisjZW5kaWYKKyNpZmRlZiBXSVRIX1VEUAorICAgICAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICAgIHsgaWYgKHNvYXAtPnBlZXJsZW4pCisJICBud3JpdHRlbiA9IHNlbmR0bygoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyLCBzb2FwLT5wZWVybGVuKTsKKyAgICAgICAgZWxzZQorCSAgbndyaXR0ZW4gPSBzZW5kKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHMsIG4sIHNvYXAtPnNvY2tldF9mbGFncyk7CisJLyogcmV0cnkgYW5kIGJhY2stb2ZmIGFsZ29yaXRobSAqLworCS8qIFRPRE86IHRoaXMgaXMgbm90IHZlcnkgY2xlYXIgZnJvbSBzcGVjcyBzbyB2ZXJpZnkgYW5kIGxpbWl0IGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggd2Ugc2hvdWxkIGxvb3AgKGUuZy4gRU5PQlVGUykgKi8KKwlpZiAobndyaXR0ZW4gPCAwKQorICAgICAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICAgICAgZmRfc2V0IGZkOworCSAgaW50IHVkcF9yZXBlYXQ7CisJICBpbnQgdWRwX2RlbGF5OworICAgICAgICAgIGlmICgoc29hcC0+Y29ubmVjdF9mbGFncyAmIFNPX0JST0FEQ0FTVCkpCisJICAgIHVkcF9yZXBlYXQgPSAzOyAvKiBTT0FQLW92ZXItVURQIE1VTFRJQ0FTVF9VRFBfUkVQRUFUIC0gMSAqLworICAgICAgICAgIGVsc2UKKwkgICAgdWRwX3JlcGVhdCA9IDE7IC8qIFNPQVAtb3Zlci1VRFAgVU5JQ0FTVF9VRFBfUkVQRUFUIC0gMSAqLworCSAgdWRwX2RlbGF5ID0gKHNvYXBfcmFuZG9tICUgMjAxKSArIDUwOyAvKiBVRFBfTUlOX0RFTEFZIC4uIFVEUF9NQVhfREVMQVkgKi8KKwkgIGRvCisgICAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IDA7CisgICAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAxMDAwICogdWRwX2RlbGF5OyAvKiBtcyAqLworICAgICAgICAgICAgRkRfWkVSTygmZmQpOworICAgICAgICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZmZCk7CisgICAgICAgICAgICBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgTlVMTCwgTlVMTCwgJmZkLCAmdGltZW91dCk7CisJICAgIGlmIChzb2FwLT5wZWVybGVuKQorCSAgICAgIG53cml0dGVuID0gc2VuZHRvKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHMsIG4sIHNvYXAtPnNvY2tldF9mbGFncywgKHN0cnVjdCBzb2NrYWRkciopJnNvYXAtPnBlZXIsIHNvYXAtPnBlZXJsZW4pOworICAgICAgICAgICAgZWxzZQorCSAgICAgIG53cml0dGVuID0gc2VuZCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MpOworCSAgICB1ZHBfZGVsYXkgPDw9IDE7CisJICAgIGlmICh1ZHBfZGVsYXkgPiA1MDApIC8qIFVEUF9VUFBFUl9ERUxBWSAqLworCSAgICAgIHVkcF9kZWxheSA9IDUwMDsKKwkgIH0KKwkgIHdoaWxlIChud3JpdHRlbiA8IDAgJiYgLS11ZHBfcmVwZWF0ID4gMCk7CisJfQorICAgICAgfQorICAgICAgZWxzZQorI2VuZGlmCisjaWYgIWRlZmluZWQoUEFMTSkgJiYgIWRlZmluZWQoQVM0MDApCisgICAgICAgIG53cml0dGVuID0gc2VuZCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MpOworI2Vsc2UKKyAgICAgICAgbndyaXR0ZW4gPSBzZW5kKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICh2b2lkKilzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MpOworI2VuZGlmCisgICAgICBpZiAobndyaXR0ZW4gPD0gMCkKKyAgICAgIHsKKyNpZmRlZiBXSVRIX09QRU5TU0wKKwlpbnQgZXJyOworICAgICAgICBpZiAoc29hcC0+c3NsICYmIChlcnIgPSBTU0xfZ2V0X2Vycm9yKHNvYXAtPnNzbCwgbndyaXR0ZW4pKSAhPSBTU0xfRVJST1JfTk9ORSAmJiBlcnIgIT0gU1NMX0VSUk9SX1dBTlRfUkVBRCAmJiBlcnIgIT0gU1NMX0VSUk9SX1dBTlRfV1JJVEUpCisgICAgICAgICAgcmV0dXJuIFNPQVBfRU9GOworI2VuZGlmCisgICAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRVdPVUxEQkxPQ0sgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FQUdBSU4pCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgcmV0dXJuIFNPQVBfRU9GOworICAgICAgICB9CisgICAgICAgIG53cml0dGVuID0gMDsgLyogYW5kIGNhbGwgd3JpdGUoKSBhZ2FpbiAqLworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworI2lmZGVmIFdJVEhfRkFTVENHSQorICAgICAgbndyaXR0ZW4gPSBmd3JpdGUoKHZvaWQqKXMsIDEsIG4sIHN0ZG91dCk7CisgICAgICBmZmx1c2goc3Rkb3V0KTsKKyNlbHNlCisjaWZkZWYgVU5ERVJfQ0UKKyAgICAgIG53cml0dGVuID0gZndyaXRlKHMsIDEsIG4sIHNvYXAtPnNlbmRmZCk7CisjZWxzZQorI2lmZGVmIFZYV09SS1MKKyNpZmRlZiBXTVdfUlBNX0lPCisgICAgICBpZiAoc29hcC0+cnBtcmVxaWQpCisgICAgICAgIG53cml0dGVuID0gKGh0dHBCbG9ja1B1dChzb2FwLT5ycG1yZXFpZCwgcywgbikgPT0gMCkgPyBuIDogLTE7IAorICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgIG53cml0dGVuID0gZndyaXRlKHMsIHNpemVvZihjaGFyKSwgbiwgZmRvcGVuKHNvYXAtPnNlbmRmZCwgInciKSk7CisjZWxzZQorICAgICAgbndyaXR0ZW4gPSB3cml0ZSgoU09BUF9TT0NLRVQpc29hcC0+c2VuZGZkLCBzLCBuKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyAgICAgIGlmIChud3JpdHRlbiA8PSAwKQorICAgICAgeyBpZiAoc29hcF9lcnJubyAhPSBTT0FQX0VJTlRSICYmIHNvYXBfZXJybm8gIT0gU09BUF9FV09VTERCTE9DSyAmJiBzb2FwX2Vycm5vICE9IFNPQVBfRUFHQUlOKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfZXJybm87CisgICAgICAgICAgcmV0dXJuIFNPQVBfRU9GOworICAgICAgICB9CisgICAgICAgIG53cml0dGVuID0gMDsgLyogYW5kIGNhbGwgd3JpdGUoKSBhZ2FpbiAqLworICAgICAgfQorICAgIH0KKyAgICBuIC09IG53cml0dGVuOworICAgIHMgKz0gbndyaXR0ZW47CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZW5kX3JhdyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgc2l6ZV90IG4pCit7IGlmICghbikKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgeyBzb2FwLT5jb3VudCArPSBuOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICAgIGlmIChzb2FwLT5mcHJlcGFyZXNlbmQgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSAhPSBTT0FQX0lPX1NUT1JFKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gc29hcC0+ZnByZXBhcmVzZW5kKHNvYXAsIHMsIG4pOworI2VuZGlmCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKQorICB7IHJlZ2lzdGVyIHNpemVfdCBpID0gU09BUF9CVUZMRU4gLSBzb2FwLT5idWZpZHg7CisgICAgd2hpbGUgKG4gPj0gaSkKKyAgICB7IG1lbWNweShzb2FwLT5idWYgKyBzb2FwLT5idWZpZHgsIHMsIGkpOworICAgICAgc29hcC0+YnVmaWR4ID0gU09BUF9CVUZMRU47CisgICAgICBpZiAoc29hcF9mbHVzaChzb2FwKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgcyArPSBpOworICAgICAgbiAtPSBpOworICAgICAgaSA9IFNPQVBfQlVGTEVOOworICAgIH0KKyAgICBtZW1jcHkoc29hcC0+YnVmICsgc29hcC0+YnVmaWR4LCBzLCBuKTsKKyAgICBzb2FwLT5idWZpZHggKz0gbjsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICByZXR1cm4gc29hcF9mbHVzaF9yYXcoc29hcCwgcywgbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZmx1c2goc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBuID0gc29hcC0+YnVmaWR4OworICBpZiAobikKKyAgeyBzb2FwLT5idWZpZHggPSAwOworI2lmZGVmIFdJVEhfWkxJQgorICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQikKKyAgICB7IHNvYXAtPmRfc3RyZWFtLm5leHRfaW4gPSAoQnl0ZSopc29hcC0+YnVmOworICAgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4gPSAodW5zaWduZWQgaW50KW47CisjaWZkZWYgV0lUSF9HWklQCisgICAgICBzb2FwLT56X2NyYyA9IGNyYzMyKHNvYXAtPnpfY3JjLCAoQnl0ZSopc29hcC0+YnVmLCAodW5zaWduZWQgaW50KW4pOworI2VuZGlmCisgICAgICBkbworICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlZmxhdGluZyAldSBieXRlc1xuIiwgc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4pKTsKKyAgICAgICAgaWYgKGRlZmxhdGUoJnNvYXAtPmRfc3RyZWFtLCBaX05PX0ZMVVNIKSAhPSBaX09LKQorICAgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVW5hYmxlIHRvIGRlZmxhdGU6ICVzXG4iLCBzb2FwLT5kX3N0cmVhbS5tc2c/c29hcC0+ZF9zdHJlYW0ubXNnOiIiKSk7CisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGlmICghc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0KQorICAgICAgICB7IGlmIChzb2FwX2ZsdXNoX3Jhdyhzb2FwLCBzb2FwLT56X2J1ZiwgU09BUF9CVUZMRU4pKQorICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gKEJ5dGUqKXNvYXAtPnpfYnVmOworICAgICAgICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCA9IFNPQVBfQlVGTEVOOworICAgICAgICB9CisgICAgICB9IHdoaWxlIChzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbik7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgICAgcmV0dXJuIHNvYXBfZmx1c2hfcmF3KHNvYXAsIHNvYXAtPmJ1Ziwgbik7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZmx1c2hfcmF3KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBzaXplX3QgbikKK3sgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19TVE9SRSkKKyAgeyByZWdpc3RlciBjaGFyICp0OworICAgIGlmICghKHQgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIG4pKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIG1lbWNweSh0LCBzLCBuKTsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgICBpZiAoc29hcC0+ZnByZXBhcmVzZW5kKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gc29hcC0+ZnByZXBhcmVzZW5kKHNvYXAsIHMsIG4pOworI2VuZGlmCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgeyBjaGFyIHRbMTZdOworICAgIHNwcmludGYodCwgIlxyXG4lbFhcclxuIiArIChzb2FwLT5jaHVua3NpemUgPyAwIDogMiksICh1bnNpZ25lZCBsb25nKW4pOworICAgIERCR01TRyhTRU5ULCB0LCBzdHJsZW4odCkpOworICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mc2VuZChzb2FwLCB0LCBzdHJsZW4odCkpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBzb2FwLT5jaHVua3NpemUgKz0gbjsKKyAgfQorICBEQkdNU0coU0VOVCwgcywgbik7CisjZW5kaWYKKyAgcmV0dXJuIHNvYXAtPmVycm9yID0gc29hcC0+ZnNlbmQoc29hcCwgcywgbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2VuZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcykKK3sgaWYgKHMpCisgICAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgcywgc3RybGVuKHMpKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2VuZDIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMikKK3sgaWYgKHNvYXBfc2VuZChzb2FwLCBzMSkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9zZW5kKHNvYXAsIHMyKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmQzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIGNvbnN0IGNoYXIgKnMzKQoreyBpZiAoc29hcF9zZW5kKHNvYXAsIHMxKQorICAgfHwgc29hcF9zZW5kKHNvYXAsIHMyKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX3NlbmQoc29hcCwgczMpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHNpemVfdAorZnJlY3Yoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnMsIHNpemVfdCBuKQoreyByZWdpc3RlciBpbnQgcjsKKyAgc29hcC0+ZXJybnVtID0gMDsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiAhZGVmaW5lZChXSVRIX0xFQU4pCisgIGlmIChzb2FwLT5pcykKKyAgeyBpZiAoc29hcC0+aXMtPmdvb2QoKSkKKyAgICAgIHJldHVybiBzb2FwLT5pcy0+cmVhZChzLCBuKS5nY291bnQoKTsKKyAgICByZXR1cm4gMDsKKyAgfQorI2VuZGlmCisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICB7IGZvciAoOzspCisgICAgeyAKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICBpZiAoc29hcC0+cmVjdl90aW1lb3V0KQorICAgICAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgICAgICBmZF9zZXQgZmQ7CisgICAgICAgIGlmIChzb2FwLT5yZWN2X3RpbWVvdXQgPiAwKQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gc29hcC0+cmVjdl90aW1lb3V0OworICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gLXNvYXAtPnJlY3ZfdGltZW91dC8xMDAwMDAwOworICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IC1zb2FwLT5yZWN2X3RpbWVvdXQlMTAwMDAwMDsKKyAgICAgICAgfQorICAgICAgICBGRF9aRVJPKCZmZCk7CisgICAgICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmZmQpOworICAgICAgICBmb3IgKDs7KQorICAgICAgICB7IHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgJmZkLCBOVUxMLCAmZmQsICZ0aW1lb3V0KTsKKyAgICAgICAgICBpZiAociA+IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBpZiAoIXIpCisJICB7IHNvYXAtPmVycm51bSA9IDA7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FQUdBSU4pCisJICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICAgIGlmIChzb2FwLT5zc2wpCisgICAgICB7IGludCBlcnI7CisJciA9IFNTTF9yZWFkKHNvYXAtPnNzbCwgcywgbik7CisgICAgICAgIGlmIChyID4gMCkKKyAgICAgICAgICByZXR1cm4gKHNpemVfdClyOworCWVyciA9IFNTTF9nZXRfZXJyb3Ioc29hcC0+c3NsLCByKTsKKwlpZiAoZXJyICE9IFNTTF9FUlJPUl9OT05FICYmIGVyciAhPSBTU0xfRVJST1JfV0FOVF9SRUFEICYmIGVyciAhPSBTU0xfRVJST1JfV0FOVF9XUklURSkKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHNvYXAtPmJpbykKKyAgICAgIHsgciA9IEJJT19yZWFkKHNvYXAtPmJpbywgcywgbik7CisgICAgICAgIGlmIChyID4gMCkKKyAgICAgICAgICByZXR1cm4gKHNpemVfdClyOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgeyAKKyNpZmRlZiBXSVRIX1VEUAorICAgICAgICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgICAgICB7IFNPQVBfU09DS0xFTl9UIGsgPSAoU09BUF9TT0NLTEVOX1Qpc2l6ZW9mKHNvYXAtPnBlZXIpOworCSAgbWVtc2V0KCh2b2lkKikmc29hcC0+cGVlciwgMCwgc2l6ZW9mKHNvYXAtPnBlZXIpKTsKKyAgICAgICAgICByID0gcmVjdmZyb20oKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgcywgbiwgc29hcC0+c29ja2V0X2ZsYWdzLCAoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlciwgJmspOwkvKiBwb3J0YWJpbGl0eSBub3RlOiBzZWUgU09BUF9TT0NLTEVOX1QgZGVmaW5pdGlvbiBpbiBzdGRzb2FwMi5oICovCisJICBzb2FwLT5wZWVybGVuID0gKHNpemVfdClrOworI2lmbmRlZiBXSVRIX0lQVjYKKyAgICAgICAgICBzb2FwLT5pcCA9IG50b2hsKHNvYXAtPnBlZXIuc2luX2FkZHIuc19hZGRyKTsKKyAgICAgICAgICBzb2FwLT5wb3J0ID0gKGludCludG9ocyhzb2FwLT5wZWVyLnNpbl9wb3J0KTsKKyNlbmRpZgorICAgICAgICB9CisJZWxzZQorI2VuZGlmCisgICAgICAgICAgciA9IHJlY3YoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgcywgbiwgc29hcC0+c29ja2V0X2ZsYWdzKTsKKyAgICAgICAgaWYgKHIgPj0gMCkKKyAgICAgICAgICByZXR1cm4gKHNpemVfdClyOworICAgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUiAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VBR0FJTiAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VXT1VMREJMT0NLKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICB9CisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgICAgICBmZF9zZXQgZmQ7CisgICAgICAgIHRpbWVvdXQudHZfc2VjID0gMDsKKyAgICAgICAgdGltZW91dC50dl91c2VjID0gMTAwMDA7CisgICAgICAgIEZEX1pFUk8oJmZkKTsKKyAgICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZmZCk7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgICAgICAgIGlmIChzb2FwLT5zc2wgJiYgU1NMX2dldF9lcnJvcihzb2FwLT5zc2wsIHIpID09IFNTTF9FUlJPUl9XQU5UX1dSSVRFKQorICAgICAgICAgIHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgTlVMTCwgJmZkLCAmZmQsICZ0aW1lb3V0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgJmZkLCBOVUxMLCAmZmQsICZ0aW1lb3V0KTsKKyNlbHNlCisgICAgICAgIHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgJmZkLCBOVUxMLCAmZmQsICZ0aW1lb3V0KTsKKyNlbmRpZgorICAgICAgICBpZiAociA8IDAgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUikKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisgICAgfQorICB9CisjaWZkZWYgV0lUSF9GQVNUQ0dJCisgIHJldHVybiBmcmVhZChzLCAxLCBuLCBzdGRpbik7CisjZWxzZQorI2lmZGVmIFVOREVSX0NFCisgIHJldHVybiBmcmVhZChzLCAxLCBuLCBzb2FwLT5yZWN2ZmQpOworI2Vsc2UKKyNpZmRlZiBXTVdfUlBNX0lPCisgIGlmIChzb2FwLT5ycG1yZXFpZCkKKyAgICByID0gaHR0cEJsb2NrUmVhZChzb2FwLT5ycG1yZXFpZCwgcywgbik7CisgIGVsc2UKKyNlbmRpZgorICByID0gcmVhZCgoU09BUF9TT0NLRVQpc29hcC0+cmVjdmZkLCBzLCBuKTsKKyAgaWYgKHIgPj0gMCkKKyAgICByZXR1cm4gKHNpemVfdClyOworICBzb2FwLT5lcnJudW0gPSBzb2FwX2Vycm5vOworICByZXR1cm4gMDsKKyNlbmRpZgorI2VuZGlmCit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzb2FwX3djaGFyCitzb2FwX2dldGNodW5rY2hhcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXAtPmJ1ZmlkeCA8IHNvYXAtPmJ1ZmxlbikKKyAgICByZXR1cm4gc29hcC0+YnVmW3NvYXAtPmJ1ZmlkeCsrXTsKKyAgc29hcC0+YnVmaWR4ID0gMDsKKyAgc29hcC0+YnVmbGVuID0gc29hcC0+Y2h1bmtidWZsZW4gPSBzb2FwLT5mcmVjdihzb2FwLCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOKTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWFkICV1IGJ5dGVzIGZyb20gc29ja2V0ICVkXG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmJ1Zmxlbiwgc29hcC0+c29ja2V0KSk7CisgIERCR01TRyhSRUNWLCBzb2FwLT5idWYsIHNvYXAtPmJ1Zmxlbik7CisgIGlmIChzb2FwLT5idWZsZW4pCisgICAgcmV0dXJuIHNvYXAtPmJ1Zltzb2FwLT5idWZpZHgrK107CisgIHJldHVybiBFT0Y7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NvYXBfaXN4ZGlnaXQoaW50IGMpCit7IHJldHVybiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHx8IChjID49ICdBJyAmJiBjIDw9ICdGJykgfHwgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWN2X3JhdyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc2l6ZV90IHJldDsKKyNpZmRlZiBXSVRIX1pMSUIKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKQorICB7IGlmIChzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9PSBaX05VTEwpCisgICAgICByZXR1cm4gRU9GOworICAgIGlmIChzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbiB8fCAhc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0KQorICAgIHsgcmVnaXN0ZXIgaW50IHI7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluZmxhdGluZ1xuIikpOworICAgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZSopc29hcC0+YnVmOworICAgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0ID0gU09BUF9CVUZMRU47CisgICAgICByID0gaW5mbGF0ZSgmc29hcC0+ZF9zdHJlYW0sIFpfTk9fRkxVU0gpOworICAgICAgaWYgKHIgPT0gWl9PSyB8fCByID09IFpfU1RSRUFNX0VORCkKKyAgICAgIHsgc29hcC0+YnVmaWR4ID0gMDsKKyAgICAgICAgc29hcC0+YnVmbGVuID0gU09BUF9CVUZMRU4gLSBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQ7CisgICAgICAgIGlmIChzb2FwLT56bGliX2luID09IFNPQVBfWkxJQl9HWklQKQorICAgICAgICAgIHNvYXAtPnpfY3JjID0gY3JjMzIoc29hcC0+el9jcmMsIChCeXRlKilzb2FwLT5idWYsICh1bnNpZ25lZCBpbnQpc29hcC0+YnVmbGVuKTsKKyAgICAgICAgaWYgKHIgPT0gWl9TVFJFQU1fRU5EKQorICAgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5mbGF0ZWQgJWx1LT4lbHUgYnl0ZXNcbiIsIHNvYXAtPmRfc3RyZWFtLnRvdGFsX2luLCBzb2FwLT5kX3N0cmVhbS50b3RhbF9vdXQpKTsKKyAgICAgICAgICBzb2FwLT56X3JhdGlvX2luID0gKGZsb2F0KXNvYXAtPmRfc3RyZWFtLnRvdGFsX2luIC8gKGZsb2F0KXNvYXAtPmRfc3RyZWFtLnRvdGFsX291dDsKKyAgICAgICAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IFpfTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc29hcC0+YnVmbGVuKQorICAgICAgICB7IHNvYXAtPmNvdW50ICs9IHNvYXAtPmJ1ZmxlbjsKKyAgICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSBpZiAociAhPSBaX0JVRl9FUlJPUikKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbmZsYXRlIGVycm9yOiAlc1xuIiwgc29hcC0+ZF9zdHJlYW0ubXNnP3NvYXAtPmRfc3RyZWFtLm1zZzoiIikpOworICAgICAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IFpfTlVMTDsKKwlzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEVPRjsKKyAgICAgIH0KKyAgICB9Cit6bGliX2FnYWluOgorICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTksgJiYgIXNvYXAtPmNodW5rc2l6ZSkKKyAgICB7IG1lbWNweShzb2FwLT5idWYsIHNvYXAtPnpfYnVmLCBTT0FQX0JVRkxFTik7CisgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT56X2J1ZmxlbjsKKyAgICB9CisgIH0KKyNlbmRpZgorI2lmbmRlZiBXSVRIX05PSFRUUAorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKSAvKiByZWFkIEhUVFAgY2h1bmtlZCB0cmFuc2ZlciAqLworICB7IAorY2h1bmtfYWdhaW46CisgICAgaWYgKHNvYXAtPmNodW5rc2l6ZSkKKyAgICB7IHNvYXAtPmJ1ZmxlbiA9IHJldCA9IHNvYXAtPmZyZWN2KHNvYXAsIHNvYXAtPmJ1Ziwgc29hcC0+Y2h1bmtzaXplID4gU09BUF9CVUZMRU4gPyBTT0FQX0JVRkxFTiA6IHNvYXAtPmNodW5rc2l6ZSk7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdldHRpbmcgY2h1bms6IHJlYWQgJXUgYnl0ZXNcbiIsICh1bnNpZ25lZCBpbnQpcmV0KSk7CisgICAgICBEQkdNU0coUkVDViwgc29hcC0+YnVmLCByZXQpOworICAgICAgc29hcC0+YnVmaWR4ID0gMDsKKyAgICAgIHNvYXAtPmNodW5rc2l6ZSAtPSByZXQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgICAgIGNoYXIgKnQsIHRtcFs4XTsKKyAgICAgIHQgPSB0bXA7CisgICAgICBpZiAoIXNvYXAtPmNodW5rYnVmbGVuKQorICAgICAgeyBzb2FwLT5jaHVua2J1ZmxlbiA9IHJldCA9IHNvYXAtPmZyZWN2KHNvYXAsIHNvYXAtPmJ1ZiwgU09BUF9CVUZMRU4pOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlYWQgJXUgYnl0ZXMgKGNodW5rZWQpIGZyb20gc29ja2V0ICVkXG4iLCAodW5zaWduZWQgaW50KXJldCwgc29hcC0+c29ja2V0KSk7CisgICAgICAgIERCR01TRyhSRUNWLCBzb2FwLT5idWYsIHJldCk7CisgICAgICAgIHNvYXAtPmJ1ZmlkeCA9IDA7CisgICAgICAgIGlmICghcmV0KQorICAgICAgICAgIHJldHVybiBzb2FwLT5haGVhZCA9IEVPRjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgc29hcC0+YnVmaWR4ID0gc29hcC0+YnVmbGVuOworICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+Y2h1bmtidWZsZW47CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdldHRpbmcgY2h1bmsgc2l6ZSAoaWR4PSV1IGxlbj0ldSlcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+YnVmaWR4LCAodW5zaWduZWQgaW50KXNvYXAtPmJ1ZmxlbikpOworICAgICAgd2hpbGUgKCFzb2FwX2lzeGRpZ2l0KChpbnQpKGMgPSBzb2FwX2dldGNodW5rY2hhcihzb2FwKSkpKQorICAgICAgICBpZiAoKGludCljID09IEVPRikKKwkgIHJldHVybiBzb2FwLT5haGVhZCA9IEVPRjsKKyAgICAgIGRvCisgICAgICAgICp0KysgPSAoY2hhciljOworICAgICAgd2hpbGUgKHNvYXBfaXN4ZGlnaXQoKGludCkoYyA9IHNvYXBfZ2V0Y2h1bmtjaGFyKHNvYXApKSkgJiYgdCAtIHRtcCA8IDcpOworICAgICAgd2hpbGUgKChpbnQpYyAhPSBFT0YgJiYgYyAhPSAnXG4nKQorICAgICAgICBjID0gc29hcF9nZXRjaHVua2NoYXIoc29hcCk7CisgICAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgcmV0dXJuIHNvYXAtPmFoZWFkID0gRU9GOworICAgICAgKnQgPSAnXDAnOworICAgICAgc29hcC0+Y2h1bmtzaXplID0gc29hcF9zdHJ0b3VsKHRtcCwgJnQsIDE2KTsKKyAgICAgIGlmICghc29hcC0+Y2h1bmtzaXplKQorICAgICAgeyBzb2FwLT5jaHVua2J1ZmxlbiA9IDA7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIG9mIGNodW5rZWQgbWVzc2FnZVxuIikpOworCXdoaWxlICgoaW50KWMgIT0gRU9GICYmIGMgIT0gJ1xuJykKKyAgICAgICAgICBjID0gc29hcF9nZXRjaHVua2NoYXIoc29hcCk7CisgICAgICAgIHJldHVybiBzb2FwLT5haGVhZCA9IEVPRjsKKyAgICAgIH0KKyAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmJ1ZmlkeCArIHNvYXAtPmNodW5rc2l6ZTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTW92aW5nIGJ1ZiBsZW4gdG8gaWR4PSV1IGxlbj0ldSAoJXMpXG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmJ1ZmlkeCwgKHVuc2lnbmVkIGludClzb2FwLT5idWZsZW4sIHRtcCkpOworICAgICAgaWYgKHNvYXAtPmJ1ZmxlbiA+IHNvYXAtPmNodW5rYnVmbGVuKQorICAgICAgeyBzb2FwLT5idWZsZW4gPSBzb2FwLT5jaHVua2J1ZmxlbjsKKyAgICAgICAgc29hcC0+Y2h1bmtzaXplIC09IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICAgICAgc29hcC0+Y2h1bmtidWZsZW4gPSAwOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlBhc3NlZCBlbmQgb2YgYnVmZmVyIGZvciBjaHVua2VkIEhUVFAgKCV1IGJ5dGVzIGxlZnQpXG4iLCAodW5zaWduZWQgaW50KShzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHgpKSk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChzb2FwLT5jaHVua2J1ZmxlbikKKyAgICAgICAgc29hcC0+Y2h1bmtzaXplID0gMDsKKyAgICAgIHJldCA9IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICAgIGlmICghcmV0KQorICAgICAgICBnb3RvIGNodW5rX2FnYWluOworICAgIH0KKyAgfQorICBlbHNlCisjZW5kaWYKKyAgeyBzb2FwLT5idWZpZHggPSAwOworICAgIHNvYXAtPmJ1ZmxlbiA9IHJldCA9IHNvYXAtPmZyZWN2KHNvYXAsIHNvYXAtPmJ1ZiwgU09BUF9CVUZMRU4pOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVhZCAldSBieXRlcyBmcm9tIHNvY2tldCAlZFxuIiwgKHVuc2lnbmVkIGludClyZXQsIHNvYXAtPnNvY2tldCkpOworICAgIERCR01TRyhSRUNWLCBzb2FwLT5idWYsIHJldCk7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPmZwcmVwYXJlcmVjdiAmJiAoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcHJlcGFyZXJlY3Yoc29hcCwgc29hcC0+YnVmLCByZXQpKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjZW5kaWYKKyNpZmRlZiBXSVRIX1pMSUIKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKQorICB7IHJlZ2lzdGVyIGludCByOworICAgIG1lbWNweShzb2FwLT56X2J1Ziwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTik7CisgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9pbiA9IChCeXRlKikoc29hcC0+el9idWYgKyBzb2FwLT5idWZpZHgpOworICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luID0gKHVuc2lnbmVkIGludClyZXQ7CisgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZSopc29hcC0+YnVmOworICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCA9IFNPQVBfQlVGTEVOOworICAgIHIgPSBpbmZsYXRlKCZzb2FwLT5kX3N0cmVhbSwgWl9OT19GTFVTSCk7CisgICAgaWYgKHIgPT0gWl9PSyB8fCByID09IFpfU1RSRUFNX0VORCkKKyAgICB7IHNvYXAtPmJ1ZmlkeCA9IDA7CisgICAgICBzb2FwLT56X2J1ZmxlbiA9IHNvYXAtPmJ1ZmxlbjsKKyAgICAgIHNvYXAtPmJ1ZmxlbiA9IHJldCA9IFNPQVBfQlVGTEVOIC0gc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0OworICAgICAgaWYgKHNvYXAtPnpsaWJfaW4gPT0gU09BUF9aTElCX0daSVApCisgICAgICAgIHNvYXAtPnpfY3JjID0gY3JjMzIoc29hcC0+el9jcmMsIChCeXRlKilzb2FwLT5idWYsICh1bnNpZ25lZCBpbnQpc29hcC0+YnVmbGVuKTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5mbGF0ZWQgJXUgYnl0ZXNcbiIsICh1bnNpZ25lZCBpbnQpcmV0KSk7CisgICAgICBpZiAoIXJldCkKKyAgICAgICAgZ290byB6bGliX2FnYWluOworICAgICAgaWYgKHIgPT0gWl9TVFJFQU1fRU5EKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluZmxhdGVkICVsdS0+JWx1IGJ5dGVzXG4iLCBzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiwgc29hcC0+ZF9zdHJlYW0udG90YWxfb3V0KSk7CisgICAgICAgIHNvYXAtPnpfcmF0aW9faW4gPSAoZmxvYXQpc29hcC0+ZF9zdHJlYW0udG90YWxfaW4gLyAoZmxvYXQpc29hcC0+ZF9zdHJlYW0udG90YWxfb3V0OworICAgICAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IFpfTlVMTDsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVbmFibGUgdG8gaW5mbGF0ZTogKCVkKSAlc1xuIiwgciwgc29hcC0+ZF9zdHJlYW0ubXNnP3NvYXAtPmRfc3RyZWFtLm1zZzoiIikpOworICAgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSBaX05VTEw7CisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICAgIHJldHVybiBFT0Y7CisgICAgfQorICB9CisjZW5kaWYKKyAgc29hcC0+Y291bnQgKz0gcmV0OworICByZXR1cm4gIXJldDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWN2KHN0cnVjdCBzb2FwICpzb2FwKQoreyAKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKQorICB7IGlmIChzb2FwLT5kaW1lLmJ1ZmxlbikKKyAgICB7IGNoYXIgKnM7CisgICAgICBpbnQgaTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgdG1wWzEyXTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRElNRSBoZHIgZm9yIGNodW5rZWQgRElNRSBpcyBpbiBidWZmZXJcbiIpKTsKKyAgICAgIHNvYXAtPmNvdW50ICs9IHNvYXAtPmRpbWUuYnVmbGVuIC0gc29hcC0+YnVmbGVuOworICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+ZGltZS5idWZsZW47CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNraXAgcGFkZGluZyAoJWxkIGJ5dGVzKVxuIiwgLShsb25nKXNvYXAtPmRpbWUuc2l6ZSYzKSk7CisgICAgICBmb3IgKGkgPSAtKGxvbmcpc29hcC0+ZGltZS5zaXplJjM7IGkgPiAwOyBpLS0pCisgICAgICB7IHNvYXAtPmJ1ZmlkeCsrOworICAgICAgICBpZiAoc29hcC0+YnVmaWR4ID49IHNvYXAtPmJ1ZmxlbikKKyAgICAgICAgICBpZiAoc29hcF9yZWN2X3Jhdyhzb2FwKSkKKyAgICAgICAgICAgIHJldHVybiBFT0Y7CisgICAgICB9CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdldCBESU1FIGhkciBmb3IgbmV4dCBjaHVua1xuIikpOworICAgICAgcyA9IChjaGFyKil0bXA7CisgICAgICBmb3IgKGkgPSAxMjsgaSA+IDA7IGktLSkKKyAgICAgIHsgKnMrKyA9IHNvYXAtPmJ1Zltzb2FwLT5idWZpZHgrK107CisgICAgICAgIGlmIChzb2FwLT5idWZpZHggPj0gc29hcC0+YnVmbGVuKQorICAgICAgICAgIGlmIChzb2FwX3JlY3ZfcmF3KHNvYXApKQorICAgICAgICAgICAgcmV0dXJuIEVPRjsKKyAgICAgIH0KKyAgICAgIHNvYXAtPmRpbWUuZmxhZ3MgPSB0bXBbMF0gJiAweDc7CisgICAgICBzb2FwLT5kaW1lLnNpemUgPSAoKHNpemVfdCl0bXBbOF0gPDwgMjQpIHwgKChzaXplX3QpdG1wWzldIDw8IDE2KSB8ICgoc2l6ZV90KXRtcFsxMF0gPDwgOCkgfCAoKHNpemVfdCl0bXBbMTFdKTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR2V0IERJTUUgY2h1bmsgKCV1IGJ5dGVzKVxuIiwgKHVuc2lnbmVkIGludClzb2FwLT5kaW1lLnNpemUpKTsKKyAgICAgIGlmIChzb2FwLT5kaW1lLmZsYWdzICYgU09BUF9ESU1FX0NGKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk1vcmUgY2h1bmtpbmdcbiIpKTsKKyAgICAgICAgc29hcC0+ZGltZS5jaHVua3NpemUgPSBzb2FwLT5kaW1lLnNpemU7CisgICAgICAgIGlmIChzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHggPj0gc29hcC0+ZGltZS5zaXplKQorICAgICAgICB7IHNvYXAtPmRpbWUuYnVmbGVuID0gc29hcC0+YnVmbGVuOworICAgICAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmJ1ZmlkeCArIHNvYXAtPmRpbWUuY2h1bmtzaXplOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzb2FwLT5kaW1lLmNodW5rc2l6ZSAtPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTGFzdCBjaHVua1xuIikpOworICAgICAgICBzb2FwLT5kaW1lLmJ1ZmxlbiA9IDA7CisgICAgICAgIHNvYXAtPmRpbWUuY2h1bmtzaXplID0gMDsKKyAgICAgIH0KKyAgICAgIHNvYXAtPmNvdW50ID0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIldSBieXRlcyByZW1haW5pbmdcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+Y291bnQpKTsKKyAgICAgIHJldHVybiBTT0FQX09LOworICAgIH0KKyAgICBpZiAoc29hcC0+ZGltZS5jaHVua3NpemUpCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdldCBuZXh0IERJTUUgaGRyIGZvciBjaHVua2VkIERJTUUgKCV1IGJ5dGVzIGNodW5rKVxuIiwgKHVuc2lnbmVkIGludClzb2FwLT5kaW1lLmNodW5rc2l6ZSkpOworICAgICAgaWYgKHNvYXBfcmVjdl9yYXcoc29hcCkpCisgICAgICAgIHJldHVybiBFT0Y7CisgICAgICBpZiAoc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4ID49IHNvYXAtPmRpbWUuY2h1bmtzaXplKQorICAgICAgeyBzb2FwLT5kaW1lLmJ1ZmxlbiA9IHNvYXAtPmJ1ZmxlbjsKKyAgICAgICAgc29hcC0+Y291bnQgLT0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4IC0gc29hcC0+ZGltZS5jaHVua3NpemU7CisgICAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmJ1ZmlkeCArIHNvYXAtPmRpbWUuY2h1bmtzaXplOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBzb2FwLT5kaW1lLmNodW5rc2l6ZSAtPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIiVsdSBieXRlcyByZW1haW5pbmcsIGNvdW50PSV1XG4iLCAodW5zaWduZWQgbG9uZykoc29hcC0+YnVmbGVuLXNvYXAtPmJ1ZmlkeCksICh1bnNpZ25lZCBpbnQpc29hcC0+Y291bnQpKTsKKyAgICAgIHJldHVybiBTT0FQX09LOworICAgIH0KKyAgfQorI2VuZGlmCisgIHJldHVybiBzb2FwX3JlY3ZfcmF3KHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc29hcF93Y2hhcgorU09BUF9GTUFDMgorc29hcF9nZXRjaGFyKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIGMgPSBzb2FwLT5haGVhZDsKKyAgaWYgKGMpCisgIHsgaWYgKGMgIT0gRU9GKQorICAgICAgc29hcC0+YWhlYWQgPSAwOworICAgIHJldHVybiBjOworICB9CisgIHJldHVybiBzb2FwX2dldDEoc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCoKK1NPQVBfRk1BQzIKK3NvYXBfY29kZShjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCAqbWFwLCBjb25zdCBjaGFyICpzdHIpCit7IGlmIChzdHIpCisgIHsgd2hpbGUgKG1hcC0+c3RyaW5nKQorICAgIHsgaWYgKCFzdHJjbXAoc3RyLCBtYXAtPnN0cmluZykpIC8qIGNhc2Ugc2Vuc2l0aXZlICovCisgICAgICAgIHJldHVybiBtYXA7CisgICAgICBtYXArKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitsb25nCitTT0FQX0ZNQUMyCitzb2FwX2ludF9jb2RlKGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwICptYXAsIGNvbnN0IGNoYXIgKnN0ciwgbG9uZyBvdGhlcikKK3sgd2hpbGUgKG1hcC0+c3RyaW5nKQorICB7IGlmICghc29hcF90YWdfY21wKHN0ciwgbWFwLT5zdHJpbmcpKSAvKiBjYXNlIGluc2Vuc2l0aXZlICovCisgICAgICByZXR1cm4gbWFwLT5jb2RlOworICAgIG1hcCsrOworICB9CisgIHJldHVybiBvdGhlcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3N0cl9jb2RlKGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwICptYXAsIGxvbmcgY29kZSkKK3sgd2hpbGUgKG1hcC0+Y29kZSAhPSBjb2RlICYmIG1hcC0+c3RyaW5nKQorICAgIG1hcCsrOworICByZXR1cm4gbWFwLT5zdHJpbmc7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc29hcF93Y2hhcgorc29hcF9jaGFyKHN0cnVjdCBzb2FwICpzb2FwKQoreyBjaGFyIHRtcFs4XTsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgcmVnaXN0ZXIgY2hhciAqcyA9IHRtcDsKKyAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykKKyAgeyBjID0gc29hcF9nZXQxKHNvYXApOworICAgIGlmIChjID09ICc7JyB8fCAoaW50KWMgPT0gRU9GKQorICAgICAgYnJlYWs7CisgICAgKnMrKyA9IChjaGFyKWM7CisgIH0KKyAgKnMgPSAnXDAnOworICBpZiAoKnRtcCA9PSAnIycpCisgIHsgaWYgKHRtcFsxXSA9PSAneCcgfHwgdG1wWzFdID09ICdYJykKKyAgICAgIHJldHVybiBzb2FwX3N0cnRvbCh0bXAgKyAyLCBOVUxMLCAxNik7CisgICAgcmV0dXJuIGF0b2wodG1wICsgMSk7CisgIH0KKyAgaWYgKCFzdHJjbXAodG1wLCAibHQiKSkKKyAgICByZXR1cm4gJzwnOworICBpZiAoIXN0cmNtcCh0bXAsICJndCIpKQorICAgIHJldHVybiAnPic7CisgIGlmICghc3RyY21wKHRtcCwgImFtcCIpKQorICAgIHJldHVybiAnJic7CisgIGlmICghc3RyY21wKHRtcCwgInF1b3QiKSkKKyAgICByZXR1cm4gJyInOworICBpZiAoIXN0cmNtcCh0bXAsICJhcG9zIikpCisgICAgcmV0dXJuICdcJyc7CisjaWZuZGVmIFdJVEhfTEVBTgorICByZXR1cm4gKHNvYXBfd2NoYXIpc29hcF9pbnRfY29kZShodG1sX2VudGl0eV9jb2RlcywgdG1wLCBTT0FQX1VOS05PV05fQ0hBUik7CisjZWxzZQorICByZXR1cm4gU09BUF9VTktOT1dOX0NIQVI7IC8qIHVzZSB0aGlzIHRvIHJlcHJlc2VudCB1bmtub3duIGNvZGUgKi8KKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgV0lUSF9MRUFOCitzb2FwX3djaGFyCitzb2FwX2dldDAoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwLT5idWZpZHggPj0gc29hcC0+YnVmbGVuICYmIHNvYXBfcmVjdihzb2FwKSkKKyAgICByZXR1cm4gRU9GOworICByZXR1cm4gKHVuc2lnbmVkIGNoYXIpc29hcC0+YnVmW3NvYXAtPmJ1ZmlkeF07Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBXSVRIX0xFQU4KK3NvYXBfd2NoYXIKK3NvYXBfZ2V0MShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXAtPmJ1ZmlkeCA+PSBzb2FwLT5idWZsZW4gJiYgc29hcF9yZWN2KHNvYXApKQorICAgIHJldHVybiBFT0Y7CisgIHJldHVybiAodW5zaWduZWQgY2hhcilzb2FwLT5idWZbc29hcC0+YnVmaWR4KytdOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc29hcF93Y2hhcgorU09BUF9GTUFDMgorc29hcF9nZXQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgYyA9IHNvYXAtPmFoZWFkOworICBpZiAoYykKKyAgeyBpZiAoYyAhPSBFT0YpCisgICAgICBzb2FwLT5haGVhZCA9IDA7CisgIH0KKyAgZWxzZQorICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgIGZvciAoOzspCisgIHsgaWYgKHNvYXAtPmNkYXRhKQorICAgIHsgaWYgKGMgPT0gJ10nKQorICAgICAgeyBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgICBpZiAoYyA9PSAnXScpCisgICAgICAgIHsgc29hcC0+Y2RhdGEgPSAwOworICAgICAgICAgIHNvYXBfZ2V0MShzb2FwKTsgLyogc2tpcCA+ICovCisgICAgICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgICAgfQorCWVsc2UKKyAgICAgICAgeyBzb2FwX3JldmdldDEoc29hcCk7CisgICAgICAgICAgcmV0dXJuICddJzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gYzsKKyAgICB9CisgICAgc3dpdGNoIChjKQorICAgIHsgY2FzZSAnPCc6CisgICAgICAgIGRvIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICAgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyAgICAgICAgaWYgKGMgPT0gJyEnIHx8IGMgPT0gJz8nIHx8IGMgPT0gJyUnKQorICAgICAgICB7IHJlZ2lzdGVyIGludCBrID0gMTsKKwkgIGlmIChjID09ICchJykKKyAgICAgICAgICB7IGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICAgICAgICBpZiAoYyA9PSAnWycpCisgICAgICAgICAgICB7IGRvIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICAgICAgICAgIHdoaWxlICgoaW50KWMgIT0gRU9GICYmIGMgIT0gJ1snKTsKKyAgICAgICAgICAgICAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIHNvYXAtPmNkYXRhID0gMTsKKyAgICAgICAgICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKwkgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjID09ICctJyAmJiAoYyA9IHNvYXBfZ2V0MShzb2FwKSkgPT0gJy0nKQorICAgICAgICAgICAgeyBkbworICAgICAgICAgICAgICB7IGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJy0nICYmIChjID0gc29hcF9nZXQxKHNvYXApKSA9PSAnLScpCisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfSB3aGlsZSAoKGludCljICE9IEVPRik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCSAgZWxzZSBpZiAoYyA9PSAnPycpCisgICAgICAgICAgICBjID0gc29hcF9nZXRfcGkoc29hcCk7CisgICAgICAgICAgd2hpbGUgKChpbnQpYyAhPSBFT0YpCisgICAgICAgICAgeyBpZiAoYyA9PSAnPCcpCisJICAgICAgaysrOworCSAgICBlbHNlIGlmIChjID09ICc+JykKKwkgICAgeyBpZiAoLS1rIDw9IDApCisJICAgICAgICBicmVhazsKKwkgICAgfQorCSAgICBjID0gc29hcF9nZXQxKHNvYXApOworCSAgfQorCSAgaWYgKChpbnQpYyA9PSBFT0YpCisJICAgIGJyZWFrOworICAgICAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMgPT0gJy8nKQorICAgICAgICAgIHJldHVybiBTT0FQX1RUOworICAgICAgICBzb2FwX3JldmdldDEoc29hcCk7CisgICAgICAgIHJldHVybiBTT0FQX0xUOworICAgICAgY2FzZSAnPic6CisgICAgICAgIHJldHVybiBTT0FQX0dUOworICAgICAgY2FzZSAnIic6CisgICAgICAgIHJldHVybiBTT0FQX1FUOworICAgICAgY2FzZSAnXCcnOgorICAgICAgICByZXR1cm4gU09BUF9BUDsKKyAgICAgIGNhc2UgJyYnOgorICAgICAgICByZXR1cm4gc29hcF9jaGFyKHNvYXApIHwgMHg4MDAwMDAwMDsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIGM7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc29hcF93Y2hhcgorc29hcF9nZXRfcGkoc3RydWN0IHNvYXAgKnNvYXApCit7IGNoYXIgYnVmWzY0XTsKKyAgcmVnaXN0ZXIgY2hhciAqcyA9IGJ1ZjsKKyAgcmVnaXN0ZXIgaW50IGkgPSBzaXplb2YoYnVmKTsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICAvKiBUaGlzIGlzIGEgcXVpY2sgd2F5IHRvIHBhcnNlIFhNTCBQSSBhbmQgd2UgY291bGQgdXNlIGEgY2FsbGJhY2sgaW5zdGVhZCB0bworICAgKiBlbmFibGUgYXBwbGljYXRpb25zIHRvIGludGVyY2VwdCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyAqLworICB3aGlsZSAoKGludCljICE9IEVPRiAmJiBjICE9ICc/JykKKyAgeyBpZiAoLS1pID4gMCkKKyAgICB7IGlmIChzb2FwX2JsYW5rKGMpKQorICAgICAgICBjID0gJyAnOworICAgICAgKnMrKyA9IChjaGFyKWM7CisgICAgfQorICAgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgIH0KKyAgKnMgPSAnXDAnOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlhNTCBQSSA8PyVzPz5cbiIsIGJ1ZikpOworICBpZiAoIXN0cm5jbXAoYnVmLCAieG1sICIsIDQpKQorICB7IHMgPSBzdHJzdHIoYnVmLCAiIGVuY29kaW5nPSIpOworICAgIGlmIChzICYmIHNbMTBdKQorICAgIHsgaWYgKCFzb2FwX3RhZ19jbXAocyArIDExLCAiaXNvLTg4NTktMSoiKQorICAgICAgIHx8ICFzb2FwX3RhZ19jbXAocyArIDExLCAibGF0aW4xKiIpKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlN3aXRjaGluZyB0byBsYXRpbjEgZW5jb2RpbmdcbiIpKTsKKyAgICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19MQVRJTjsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAocyArIDExLCAidXRmLTgqIikpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU3dpdGNoaW5nIHRvIHV0Zi04IGVuY29kaW5nXG4iKSk7CisgICAgICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX0xBVElOOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoKGludCljICE9IEVPRikKKyAgICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICByZXR1cm4gYzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9tb3ZlKHN0cnVjdCBzb2FwICpzb2FwLCBsb25nIG4pCit7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTW92aW5nICVsZCBieXRlcyBmb3J3YXJkXG4iLCAobG9uZyluKSk7CisgIGZvciAoOyBuID4gMDsgbi0tKQorICAgIGlmICgoaW50KXNvYXBfZ2V0Y2hhcihzb2FwKSA9PSBFT0YpCisgICAgICByZXR1cm4gU09BUF9FT0Y7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzaXplX3QKK1NPQVBfRk1BQzIKK3NvYXBfdGVsbChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmV0dXJuIHNvYXAtPmNvdW50IC0gc29hcC0+YnVmbGVuICsgc29hcC0+YnVmaWR4IC0gKHNvYXAtPmFoZWFkICE9IDApOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0dXRmOChzdHJ1Y3Qgc29hcCAqc29hcCwgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBjKQoreyBjaGFyIHRtcFsxNl07CisgIGlmIChjID4gMCAmJiBjIDwgMHg4MCkKKyAgeyAqdG1wID0gKGNoYXIpYzsKKyAgICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCB0bXAsIDEpOworICB9CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgeyByZWdpc3RlciBjaGFyICp0ID0gdG1wOworICAgIGlmIChjIDwgMHgwODAwKQorICAgICAgKnQrKyA9IChjaGFyKSgweEMwIHwgKChjID4+IDYpICYgMHgxRikpOworICAgIGVsc2UKKyAgICB7IGlmIChjIDwgMHgwMTAwMDApCisgICAgICAgICp0KysgPSAoY2hhcikoMHhFMCB8ICgoYyA+PiAxMikgJiAweDBGKSk7CisgICAgICBlbHNlCisgICAgICB7IGlmIChjIDwgMHgyMDAwMDApCisgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEYwIHwgKChjID4+IDE4KSAmIDB4MDcpKTsKKyAgICAgICAgZWxzZQorICAgICAgICB7IGlmIChjIDwgMHgwNDAwMDAwMCkKKyAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhGOCB8ICgoYyA+PiAyNCkgJiAweDAzKSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsgKnQrKyA9IChjaGFyKSgweEZDIHwgKChjID4+IDMwKSAmIDB4MDEpKTsKKyAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAyNCkgJiAweDNGKSk7CisgICAgICAgICAgfQorICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAxOCkgJiAweDNGKSk7CisgICAgICAgIH0gICAgIAorICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTIpICYgMHgzRikpOworICAgICAgfQorICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDYpICYgMHgzRikpOworICAgIH0KKyAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoYyAmIDB4M0YpKTsKKyAgICAqdCA9ICdcMCc7CisgIH0KKyAgZWxzZQorI2VuZGlmCisgICAgc3ByaW50Zih0bXAsICImIyVsdTsiLCBjKTsKKyAgcmV0dXJuIHNvYXBfc2VuZChzb2FwLCB0bXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc29hcF93Y2hhcgorU09BUF9GTUFDMgorc29hcF9nZXR1dGY4KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzb2FwX3djaGFyIGMsIGMxLCBjMiwgYzMsIGM0OworICBjID0gc29hcC0+YWhlYWQ7CisgIGlmIChjID4gMHhGRikKKyAgeyBzb2FwLT5haGVhZCA9IDA7CisgICAgcmV0dXJuIGM7CisgIH0KK2FnYWluOgorICBjID0gc29hcF9nZXQoc29hcCk7CisgIGlmIChjIDwgMHg4MCB8fCAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0xBVElOKSkKKyAgICByZXR1cm4gYzsKKyAgYzEgPSBzb2FwX2dldDEoc29hcCk7CisgIGlmIChjMSA8IDB4ODApCisgIHsgc29hcF9yZXZnZXQxKHNvYXApOyAvKiBkb2Vzbid0IGxvb2sgbGlrZSB0aGlzIGlzIFVURjggKi8KKyAgICByZXR1cm4gYzsKKyAgfQorICBjMSAmPSAweDNGOworICBpZiAoYyA8IDB4RTApCisgICAgcmV0dXJuICgoc29hcF93Y2hhcikoYyAmIDB4MUYpIDw8IDYpIHwgYzE7CisgIGMyID0gKHNvYXBfd2NoYXIpc29hcF9nZXQxKHNvYXApICYgMHgzRjsKKyAgaWYgKGMgPT0gMHhFRiAmJiBjMSA9PSAweDNCICYmIGMyID09IDB4M0YpCS8qIGlnbm9yZSBVVEYtOCBCT00gKi8KKyAgICBnb3RvIGFnYWluOworICBpZiAoYyA8IDB4RjApCisgICAgcmV0dXJuICgoc29hcF93Y2hhcikoYyAmIDB4MEYpIDw8IDEyKSB8IChjMSA8PCA2KSB8IGMyOworICBjMyA9IChzb2FwX3djaGFyKXNvYXBfZ2V0MShzb2FwKSAmIDB4M0Y7CisgIGlmIChjIDwgMHhGOCkKKyAgICByZXR1cm4gKChzb2FwX3djaGFyKShjICYgMHgwNykgPDwgMTgpIHwgKGMxIDw8IDEyKSB8IChjMiA8PCA2KSB8IGMzOworICBjNCA9IChzb2FwX3djaGFyKXNvYXBfZ2V0MShzb2FwKSAmIDB4M0Y7CisgIGlmIChjIDwgMHhGQykKKyAgICByZXR1cm4gKChzb2FwX3djaGFyKShjICYgMHgwMykgPDwgMjQpIHwgKGMxIDw8IDE4KSB8IChjMiA8PCAxMikgfCAoYzMgPDwgNikgfCBjNDsKKyAgcmV0dXJuICgoc29hcF93Y2hhcikoYyAmIDB4MDEpIDw8IDMwKSB8IChjMSA8PCAyNCkgfCAoYzIgPDwgMTgpIHwgKGMzIDw8IDEyKSB8IChjNCA8PCA2KSB8IChzb2FwX3djaGFyKShzb2FwX2dldDEoc29hcCkgJiAweDNGKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRoZXgoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMsIGludCBuKQoreyBjaGFyIGRbMl07CisgIHJlZ2lzdGVyIGludCBpOworI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IGlmICghKHNvYXAtPmRvbS0+ZGF0YSA9IHNvYXBfczJoZXgoc29hcCwgcywgTlVMTCwgbikpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIHJldHVybiBTT0FQX09LOworICB9CisjZW5kaWYKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgeyByZWdpc3RlciBpbnQgbSA9ICpzKys7CisgICAgZFswXSA9IChjaGFyKSgobSA+PiA0KSArIChtID4gMTU5ID8gJzcnIDogJzAnKSk7CisgICAgbSAmPSAweDBGOworICAgIGRbMV0gPSAoY2hhcikobSArIChtID4gOSA/ICc3JyA6ICcwJykpOworICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIGQsIDIpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordW5zaWduZWQgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0aGV4KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgKm4pCit7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgc29hcC0+ZG9tLT5kYXRhID0gc29hcF9zdHJpbmdfaW4oc29hcCwgMCwgLTEsIC0xKTsKKyAgICByZXR1cm4gKHVuc2lnbmVkIGNoYXIqKXNvYXBfaGV4MnMoc29hcCwgc29hcC0+ZG9tLT5kYXRhLCBOVUxMLCAwLCBuKTsKKyAgfQorI2VuZGlmCisjaWZkZWYgV0lUSF9GQVNUCisgIHNvYXAtPmxhYmlkeCA9IDA7CisgIGZvciAoOzspCisgIHsgcmVnaXN0ZXIgY2hhciAqczsKKyAgICByZWdpc3RlciBpbnQgaSwgazsKKyAgICBpZiAoc29hcF9hcHBlbmRfbGFiKHNvYXAsIE5VTEwsIDApKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgcyA9IHNvYXAtPmxhYmJ1ZiArIHNvYXAtPmxhYmlkeDsKKyAgICBrID0gc29hcC0+bGFibGVuIC0gc29hcC0+bGFiaWR4OworICAgIHNvYXAtPmxhYmlkeCA9IHNvYXAtPmxhYmxlbjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgazsgaSsrKQorICAgIHsgcmVnaXN0ZXIgY2hhciBkMSwgZDI7CisgICAgICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgICAgICBjID0gc29hcF9nZXQoc29hcCk7CisgICAgICBpZiAoc29hcF9pc3hkaWdpdChjKSkKKyAgICAgIHsgZDEgPSAoY2hhciljOworICAgICAgICBjID0gc29hcF9nZXQoc29hcCk7IAorCWlmIChzb2FwX2lzeGRpZ2l0KGMpKQorICAgICAgICAgIGQyID0gKGNoYXIpYzsKKyAgICAgICAgZWxzZSAKKyAgICAgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyB1bnNpZ25lZCBjaGFyICpwOworICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICBpZiAobikKKyAgICAgICAgICAqbiA9IChpbnQpKHNvYXAtPmxhYmxlbiAtIGsgKyBpKTsKKyAgICAgICAgcCA9ICh1bnNpZ25lZCBjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzb2FwLT5sYWJsZW4gLSBrICsgaSk7CisJaWYgKHApCisJICBtZW1jcHkocCwgc29hcC0+bGFiYnVmLCBzb2FwLT5sYWJsZW4gLSBrICsgaSk7CisgICAgICAgIHJldHVybiBwOworICAgICAgfQorICAgICAgKnMrKyA9ICgoZDEgPj0gJ0EnID8gKGQxICYgMHg3KSArIDkgOiBkMSAtICcwJykgPDwgNCkgKyAoZDIgPj0gJ0EnID8gKGQyICYgMHg3KSArIDkgOiBkMiAtICcwJyk7CisgICAgfQorICB9CisjZWxzZQorICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgcmV0dXJuIE5VTEw7CisgIGZvciAoOzspCisgIHsgcmVnaXN0ZXIgaW50IGk7CisgICAgcmVnaXN0ZXIgY2hhciAqcyA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgU09BUF9CTEtMRU4pOworICAgIGlmICghcykKKyAgICB7IHNvYXBfZW5kX2Jsb2NrKHNvYXApOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0JMS0xFTjsgaSsrKQorICAgIHsgcmVnaXN0ZXIgY2hhciBkMSwgZDI7CisgICAgICByZWdpc3RlciBzb2FwX3djaGFyIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgICAgIGlmIChzb2FwX2lzeGRpZ2l0KGMpKQorICAgICAgeyBkMSA9IChjaGFyKWM7CisgICAgICAgIGMgPSBzb2FwX2dldChzb2FwKTsgCisJaWYgKHNvYXBfaXN4ZGlnaXQoYykpCisgICAgICAgICAgZDIgPSAoY2hhciljOworICAgICAgICBlbHNlIAorICAgICAgICB7IHNvYXBfZW5kX2Jsb2NrKHNvYXApOworCSAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgdW5zaWduZWQgY2hhciAqcDsKKyAgICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgaWYgKG4pCisgICAgICAgICAgKm4gPSBzb2FwX3NpemVfYmxvY2soc29hcCwgaSk7CisgICAgICAgIHAgPSAodW5zaWduZWQgY2hhciopc29hcF9zYXZlX2Jsb2NrKHNvYXAsIE5VTEwsIDApOworICAgICAgICByZXR1cm4gcDsKKyAgICAgIH0KKyAgICAgICpzKysgPSAoKGQxID49ICdBJyA/IChkMSAmIDB4NykgKyA5IDogZDEgLSAnMCcpIDw8IDQpICsgKGQyID49ICdBJyA/IChkMiAmIDB4NykgKyA5IDogZDIgLSAnMCcpOworICAgIH0KKyAgfQorI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0YmFzZTY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzLCBpbnQgbikKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbTsKKyAgY2hhciBkWzRdOworICBpZiAoIXMpCisgICAgcmV0dXJuIFNPQVBfT0s7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgaWYgKCEoc29hcC0+ZG9tLT5kYXRhID0gc29hcF9zMmJhc2U2NChzb2FwLCBzLCBOVUxMLCBuKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNlbmRpZgorICBmb3IgKDsgbiA+IDI7IG4gLT0gMywgcyArPSAzKQorICB7IG0gPSBzWzBdOworICAgIG0gPSAobSA8PCA4KSB8IHNbMV07CisgICAgbSA9IChtIDw8IDgpIHwgc1syXTsKKyAgICBmb3IgKGkgPSA0OyBpID4gMDsgbSA+Pj0gNikKKyAgICAgIGRbLS1pXSA9IHNvYXBfYmFzZTY0b1ttICYgMHgzRl07CisgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgZCwgNCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKG4gPiAwKQorICB7IG0gPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICBtID0gKG0gPDwgOCkgfCAqcysrOworICAgIGZvciAoOyBpIDwgMzsgaSsrKQorICAgICAgbSA8PD0gODsKKyAgICBmb3IgKGkrKzsgaSA+IDA7IG0gPj49IDYpCisgICAgICBkWy0taV0gPSBzb2FwX2Jhc2U2NG9bbSAmIDB4M0ZdOworICAgIGZvciAoaSA9IDM7IGkgPiBuOyBpLS0pCisgICAgICBkW2ldID0gJz0nOworICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIGQsIDQpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordW5zaWduZWQgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0YmFzZTY0KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgKm4sIGludCBtYWxsb2NfZmxhZykKK3sgCisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgc29hcC0+ZG9tLT5kYXRhID0gc29hcF9zdHJpbmdfaW4oc29hcCwgMCwgLTEsIC0xKTsKKyAgICByZXR1cm4gKHVuc2lnbmVkIGNoYXIqKXNvYXBfYmFzZTY0MnMoc29hcCwgc29hcC0+ZG9tLT5kYXRhLCBOVUxMLCAwLCBuKTsKKyAgfQorI2VuZGlmCisjaWZkZWYgV0lUSF9GQVNUCisgIHNvYXAtPmxhYmlkeCA9IDA7CisgIGZvciAoOzspCisgIHsgcmVnaXN0ZXIgaW50IGksIGs7CisgICAgcmVnaXN0ZXIgY2hhciAqczsKKyAgICBpZiAoc29hcF9hcHBlbmRfbGFiKHNvYXAsIE5VTEwsIDIpKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgcyA9IHNvYXAtPmxhYmJ1ZiArIHNvYXAtPmxhYmlkeDsKKyAgICBrID0gc29hcC0+bGFibGVuIC0gc29hcC0+bGFiaWR4OworICAgIHNvYXAtPmxhYmlkeCA9IDMgKiAoc29hcC0+bGFibGVuIC8gMyk7CisgICAgaWYgKCFzKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IGsgLSAyOyBpICs9IDMpCisgICAgeyByZWdpc3RlciB1bnNpZ25lZCBsb25nIG0gPSAwOworICAgICAgcmVnaXN0ZXIgaW50IGogPSAwOworICAgICAgZG8KKyAgICAgIHsgcmVnaXN0ZXIgc29hcF93Y2hhciBjID0gc29hcF9nZXQoc29hcCk7CisgICAgICAgIGlmIChjID09ICc9JyB8fCBjIDwgMCkKKyAgICAgICAgeyB1bnNpZ25lZCBjaGFyICpwOworICAgICAgICAgIHN3aXRjaCAoaikKKyAgICAgICAgICB7IGNhc2UgMjoKKyAgICAgICAgICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiA0KSAmIDB4RkYpOworICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAqcysrID0gKGNoYXIpKChtID4+IDEwKSAmIDB4RkYpOworICAgICAgICAgICAgICAqcysrID0gKGNoYXIpKChtID4+IDIpICYgMHhGRik7CisgICAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG4pCisgICAgICAgICAgICAqbiA9IChpbnQpKHNvYXAtPmxhYmxlbiAtIGsgKyBpKTsKKyAgICAgICAgICBwID0gKHVuc2lnbmVkIGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHNvYXAtPmxhYmxlbiAtIGsgKyBpKTsKKwkgIGlmIChwKQorCSAgICBtZW1jcHkocCwgc29hcC0+bGFiYnVmLCBzb2FwLT5sYWJsZW4gLSBrICsgaSk7CisgICAgICAgICAgaWYgKGMgPj0gMCkKKyAgICAgICAgICB7IHdoaWxlICgoaW50KSgoYyA9IHNvYXBfZ2V0KHNvYXApKSAhPSBFT0YpICYmIGMgIT0gU09BUF9MVCAmJiBjICE9IFNPQVBfVFQpCisgICAgICAgICAgICAgIDsKKwkgIH0KKyAgICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICAgIHJldHVybiBwOworICAgICAgICB9CisgICAgICAgIGMgLT0gJysnOworICAgICAgICBpZiAoYyA+PSAwICYmIGMgPD0gNzkpCisgICAgICAgIHsgbSA9IChtIDw8IDYpICsgc29hcF9iYXNlNjRpW2NdOworICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAoaiA8IDQpOworICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiAxNikgJiAweEZGKTsKKyAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gOCkgJiAweEZGKTsKKyAgICAgICpzKysgPSAoY2hhcikobSAmIDB4RkYpOworICAgIH0KKyAgfQorI2Vsc2UKKyAgaWYgKHNvYXBfbmV3X2Jsb2NrKHNvYXApKQorICAgIHJldHVybiBOVUxMOworICBmb3IgKDs7KQorICB7IHJlZ2lzdGVyIGludCBpOworICAgIHJlZ2lzdGVyIGNoYXIgKnMgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIDMgKiBTT0FQX0JMS0xFTik7IC8qIG11c3QgYmUgbXVsdGlwbGUgb2YgMyAqLworICAgIGlmICghcykKKyAgICB7IHNvYXBfZW5kX2Jsb2NrKHNvYXApOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0JMS0xFTjsgaSsrKQorICAgIHsgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBtID0gMDsKKyAgICAgIHJlZ2lzdGVyIGludCBqID0gMDsKKyAgICAgIGRvCisgICAgICB7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IHNvYXBfZ2V0KHNvYXApOworICAgICAgICBpZiAoYyA9PSAnPScgfHwgYyA8IDApCisgICAgICAgIHsgdW5zaWduZWQgY2hhciAqcDsKKyAgICAgICAgICBpICo9IDM7CisgICAgICAgICAgc3dpdGNoIChqKQorICAgICAgICAgIHsgY2FzZSAyOgorICAgICAgICAgICAgICAqcysrID0gKGNoYXIpKChtID4+IDQpICYgMHhGRik7CisgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gMTApICYgMHhGRik7CisgICAgICAgICAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gMikgJiAweEZGKTsKKyAgICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobikKKwkgICAgKm4gPSAoaW50KXNvYXBfc2l6ZV9ibG9jayhzb2FwLCBpKTsKKyAgICAgICAgICBwID0gKHVuc2lnbmVkIGNoYXIqKXNvYXBfc2F2ZV9ibG9jayhzb2FwLCBOVUxMLCAwKTsKKyAgICAgICAgICBpZiAoYyA+PSAwKQorICAgICAgICAgIHsgd2hpbGUgKChpbnQpKChjID0gc29hcF9nZXQoc29hcCkpICE9IEVPRikgJiYgYyAhPSBTT0FQX0xUICYmIGMgIT0gU09BUF9UVCkKKyAgICAgICAgICAgICAgOworCSAgfQorICAgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgIH0KKyAgICAgICAgYyAtPSAnKyc7CisgICAgICAgIGlmIChjID49IDAgJiYgYyA8PSA3OSkKKyAgICAgICAgeyBtID0gKG0gPDwgNikgKyBzb2FwX2Jhc2U2NGlbY107CisgICAgICAgICAgaisrOworICAgICAgICB9CisgICAgICB9IHdoaWxlIChqIDwgNCk7CisgICAgICAqcysrID0gKGNoYXIpKChtID4+IDE2KSAmIDB4RkYpOworICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiA4KSAmIDB4RkYpOworICAgICAgKnMrKyA9IChjaGFyKShtICYgMHhGRik7CisgICAgfQorICB9CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF94b3BfZm9yd2FyZChzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgY2hhciAqKnB0ciwgaW50ICpzaXplLCBjaGFyICoqaWQsIGNoYXIgKip0eXBlLCBjaGFyICoqb3B0aW9ucykKK3sgLyogQ2hlY2sgTVRPTSB4b3A6SW5jbHVkZSBlbGVtZW50ICh3aXRoaW4gaGV4L2Jhc2U2NEJpbmFyeSkgKi8KKyAgLyogVE9ETzogdGhpcyBjb2RlIHRvIGJlIG9ic29sZXRlZCB3aXRoIG5ldyBpbXBvcnQveG9wLmggY29udmVudGlvbnMgKi8KKyAgaW50IGJvZHkgPSBzb2FwLT5ib2R5OyAvKiBzaG91bGQgc2F2ZSB0eXBlIHRvbz8gKi8KKyAgaWYgKCFzb2FwX3BlZWtfZWxlbWVudChzb2FwKSkKKyAgeyBpZiAoIXNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCAieG9wOkluY2x1ZGUiLCAwKSAmJiAqc29hcC0+aHJlZikKKyAgICB7IGlmIChzb2FwX2RpbWVfZm9yd2FyZChzb2FwLCBwdHIsIHNpemUsIGlkLCB0eXBlLCBvcHRpb25zKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIE5VTEwpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHNvYXAtPmJvZHkgPSBib2R5OworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2RpbWVfZm9yd2FyZChzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgY2hhciAqKnB0ciwgaW50ICpzaXplLCBjaGFyICoqaWQsIGNoYXIgKip0eXBlLCBjaGFyICoqb3B0aW9ucykKK3sgc3RydWN0IHNvYXBfeGxpc3QgKnhwID0gKHN0cnVjdCBzb2FwX3hsaXN0KilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfeGxpc3QpKTsKKyAgKnB0ciA9IE5VTEw7CisgICpzaXplID0gMDsKKyAgKmlkID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+aHJlZik7CisgICp0eXBlID0gTlVMTDsKKyAgKm9wdGlvbnMgPSBOVUxMOworICBpZiAoIXhwKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICB4cC0+bmV4dCA9IHNvYXAtPnhsaXN0OworICB4cC0+cHRyID0gcHRyOworICB4cC0+c2l6ZSA9IHNpemU7CisgIHhwLT5pZCA9ICppZDsKKyAgeHAtPnR5cGUgPSB0eXBlOworICB4cC0+b3B0aW9ucyA9IG9wdGlvbnM7CisgIHNvYXAtPnhsaXN0ID0geHA7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfc3RyZHVwKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzKQoreyBjaGFyICp0ID0gTlVMTDsKKyAgaWYgKHMgJiYgKHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc3RybGVuKHMpICsgMSkpKQorICAgIHN0cmNweSh0LCBzKTsKKyAgcmV0dXJuIHQ7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfbmV3X2Jsb2NrKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9ibGlzdCAqcDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJOZXcgYmxvY2sgc2VxdWVuY2UgKHByZXY9JXApXG4iLCBzb2FwLT5ibGlzdCkpOworICBpZiAoIShwID0gKHN0cnVjdCBzb2FwX2JsaXN0KilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfYmxpc3QpKSkpCisgICAgcmV0dXJuIFNPQVBfRU9NOyAgIAorICBwLT5uZXh0ID0gc29hcC0+Ymxpc3Q7IAorICBwLT5wdHIgPSBOVUxMOworICBwLT5zaXplID0gMDsKKyAgc29hcC0+Ymxpc3QgPSBwOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQqCitTT0FQX0ZNQUMyCitzb2FwX3B1c2hfYmxvY2soc3RydWN0IHNvYXAgKnNvYXAsIHNpemVfdCBuKQoreyBjaGFyICpwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlB1c2ggYmxvY2sgb2YgJXUgYnl0ZXMgKCV1IGJ5dGVzIHRvdGFsKVxuIiwgKHVuc2lnbmVkIGludCluLCAodW5zaWduZWQgaW50KXNvYXAtPmJsaXN0LT5zaXplICsgKHVuc2lnbmVkIGludCluKSk7CisgIGlmICghKHAgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgbiArIHNpemVvZihjaGFyKikgKyBzaXplb2Yoc2l6ZV90KSkpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgKihjaGFyKiopcCA9IHNvYXAtPmJsaXN0LT5wdHI7CisgICooc2l6ZV90KikocCArIHNpemVvZihjaGFyKikpID0gbjsKKyAgc29hcC0+Ymxpc3QtPnB0ciA9IHA7CisgIHNvYXAtPmJsaXN0LT5zaXplICs9IG47CisgIHJldHVybiBwICsgc2l6ZW9mKGNoYXIqKSArIHNpemVvZihzaXplX3QpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9wb3BfYmxvY2soc3RydWN0IHNvYXAgKnNvYXApCit7IGNoYXIgKnA7CisgIGlmICghc29hcC0+Ymxpc3QtPnB0cikKKyAgICByZXR1cm47CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUG9wIGJsb2NrXG4iKSk7CisgIHAgPSBzb2FwLT5ibGlzdC0+cHRyOworICBzb2FwLT5ibGlzdC0+c2l6ZSAtPSAqKHNpemVfdCopKHAgKyBzaXplb2YoY2hhciopKTsKKyAgc29hcC0+Ymxpc3QtPnB0ciA9ICooY2hhcioqKXA7CisgIFNPQVBfRlJFRShzb2FwLCBwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZAorc29hcF91cGRhdGVfcHRycyhzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqc3RhcnQsIGNoYXIgKmVuZCwgY2hhciAqcDEsIGNoYXIgKnAyKQoreyBpbnQgaTsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9mbGlzdCAqZnA7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3hsaXN0ICp4cDsKKyNlbmRpZgorICByZWdpc3RlciB2b2lkICpwLCAqKnE7CisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0lESEFTSDsgaSsrKQorICB7IGZvciAoaXAgPSBzb2FwLT5paHRbaV07IGlwOyBpcCA9IGlwLT5uZXh0KQorICAgIHsgaWYgKGlwLT5wdHIgJiYgKGNoYXIqKWlwLT5wdHIgPj0gc3RhcnQgJiYgKGNoYXIqKWlwLT5wdHIgPCBlbmQpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVXBkYXRlIGlkPSclcycgJXAgLT4gJXBcbiIsIGlwLT5pZCwgaXAtPnB0ciwgKGNoYXIqKWlwLT5wdHIgKyAocDEtcDIpKSk7CisgICAgICAgIGlwLT5wdHIgPSAoY2hhciopaXAtPnB0ciArIChwMS1wMik7CisgICAgICB9CisgICAgICBmb3IgKHEgPSAmaXAtPmxpbms7IHE7IHEgPSAodm9pZCoqKXApCisgICAgICB7IHAgPSAqcTsKKyAgICAgICAgaWYgKHAgJiYgKGNoYXIqKXAgPj0gc3RhcnQgJiYgKGNoYXIqKXAgPCBlbmQpCisgICAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJMaW5rIHVwZGF0ZSBpZD0nJXMnICVwXG4iLCBpcC0+aWQsIHApKTsKKyAgICAgICAgICAqcSA9IChjaGFyKilwICsgKHAxLXAyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZm9yIChxID0gJmlwLT5jb3B5OyBxOyBxID0gKHZvaWQqKilwKQorICAgICAgeyBwID0gKnE7CisgICAgICAgIGlmIChwICYmIChjaGFyKilwID49IHN0YXJ0ICYmIChjaGFyKilwIDwgZW5kKQorICAgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weSBjaGFpbiB1cGRhdGUgaWQ9JyVzJyAlcFxuIiwgaXAtPmlkLCBwKSk7CisgICAgICAgICAgKnEgPSAoY2hhciopcCArIChwMS1wMik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZvciAoZnAgPSBpcC0+Zmxpc3Q7IGZwOyBmcCA9IGZwLT5uZXh0KQorICAgICAgeyBpZiAoKGNoYXIqKWZwLT5wdHIgPj0gc3RhcnQgJiYgKGNoYXIqKWZwLT5wdHIgPCBlbmQpCisgICAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5IGxpc3QgdXBkYXRlIGlkPSclcycgJXBcbiIsIGlwLT5pZCwgZnApKTsKKyAgICAgICAgICBmcC0+cHRyID0gKGNoYXIqKWZwLT5wdHIgKyAocDEtcDIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGZvciAoeHAgPSBzb2FwLT54bGlzdDsgeHA7IHhwID0geHAtPm5leHQpCisgIHsgaWYgKHhwLT5wdHIgJiYgKGNoYXIqKXhwLT5wdHIgPj0gc3RhcnQgJiYgKGNoYXIqKXhwLT5wdHIgPCBlbmQpCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVwZGF0ZSBpZD0nJXMnICVwIC0+ICVwXG4iLCB4cC0+aWQ/eHAtPmlkOiIiLCB4cC0+cHRyLCAoY2hhciopeHAtPnB0ciArIChwMS1wMikpKTsKKyAgICAgIHhwLT5wdHIgPSAodW5zaWduZWQgY2hhcioqKSgoY2hhciopeHAtPnB0ciArIChwMS1wMikpOworICAgICAgeHAtPnNpemUgPSAoaW50KikoKGNoYXIqKXhwLT5zaXplICsgKHAxLXAyKSk7CisgICAgICB4cC0+dHlwZSA9IChjaGFyKiopKChjaGFyKil4cC0+dHlwZSArIChwMS1wMikpOworICAgICAgeHAtPm9wdGlvbnMgPSAoY2hhcioqKSgoY2hhciopeHAtPm9wdGlvbnMgKyAocDEtcDIpKTsKKyAgICB9CisgIH0KKyNlbmRpZgorfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc29hcF9oYXNfY29waWVzKHN0cnVjdCBzb2FwICpzb2FwLCByZWdpc3RlciBjb25zdCBjaGFyICpzdGFydCwgcmVnaXN0ZXIgY29uc3QgY2hhciAqZW5kKQoreyByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9mbGlzdCAqZnA7CisgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnA7CisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0lESEFTSDsgaSsrKQorICB7IGZvciAoaXAgPSBzb2FwLT5paHRbaV07IGlwOyBpcCA9IGlwLT5uZXh0KQorICAgIHsgZm9yIChwID0gKGNvbnN0IGNoYXIqKWlwLT5jb3B5OyBwOyBwID0gKihjb25zdCBjaGFyKiopcCkKKyAgICAgICAgaWYgKHAgPj0gc3RhcnQgJiYgcCA8IGVuZCkKKyAgICAgICAgICByZXR1cm4gU09BUF9FUlI7CisgICAgICBmb3IgKGZwID0gaXAtPmZsaXN0OyBmcDsgZnAgPSBmcC0+bmV4dCkKKyAgICAgICAgaWYgKChjb25zdCBjaGFyKilmcC0+cHRyID49IHN0YXJ0ICYmIChjb25zdCBjaGFyKilmcC0+cHRyIDwgZW5kKQorCSAgcmV0dXJuIFNPQVBfRVJSOworICAgIH0KKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZXNvbHZlKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9mbGlzdCAqZnA7CisgIHNob3J0IGZsYWc7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x2aW5nIGZvcndhcmRlZCBkYXRhXG4iKSk7CisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0lESEFTSDsgaSsrKQorICB7IGZvciAoaXAgPSBzb2FwLT5paHRbaV07IGlwOyBpcCA9IGlwLT5uZXh0KQorICAgIHsgaWYgKGlwLT5wdHIpCisgICAgICB7IHJlZ2lzdGVyIHZvaWQgKnAsICoqcSwgKnI7CisgICAgICAgIHEgPSAodm9pZCoqKWlwLT5saW5rOworICAgICAgICBpcC0+bGluayA9IE5VTEw7CisgICAgICAgIHIgPSBpcC0+cHRyOworICAgICAgICBEQkdMT0coVEVTVCwgaWYgKHEpIFNPQVBfTUVTU0FHRShmZGVidWcsICJUcmF2ZXJzaW5nIGxpbmsgY2hhaW4gdG8gcmVzb2x2ZSBpZD0nJXMnXG4iLCBpcC0+aWQpKTsKKyAgICAgICAgd2hpbGUgKHEpCisgICAgICAgIHsgcCA9ICpxOworICAgICAgICAgICpxID0gcjsKKyAgICAgICAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiLi4uIGxpbmsgJXAgLT4gJXBcbiIsIHEsIHIpKTsKKyAgICAgICAgICBxID0gKHZvaWQqKilwOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmICgqaXAtPmlkID09ICcjJykKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJNaXNzaW5nIGRhdGEgZm9yIGlkPSclcydcbiIsIGlwLT5pZCkpOworICAgICAgICBzdHJjcHkoc29hcC0+aWQsIGlwLT5pZCArIDEpOworICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX01JU1NJTkdfSUQ7CisgICAgICB9CisgICAgfQorICB9CisgIGRvCisgIHsgZmxhZyA9IDA7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHV0aW9uIHBoYXNlXG4iKSk7CisgICAgZm9yIChpID0gMDsgaSA8IFNPQVBfSURIQVNIOyBpKyspCisgICAgeyBmb3IgKGlwID0gc29hcC0+aWh0W2ldOyBpcDsgaXAgPSBpcC0+bmV4dCkKKyAgICAgIHsgaWYgKGlwLT5wdHIgJiYgIXNvYXBfaGFzX2NvcGllcyhzb2FwLCAoY29uc3QgY2hhciopaXAtPnB0ciwgKGNvbnN0IGNoYXIqKWlwLT5wdHIgKyBpcC0+c2l6ZSkpCisgICAgICAgIHsgaWYgKGlwLT5jb3B5KQorICAgICAgICAgIHsgcmVnaXN0ZXIgdm9pZCAqcCwgKipxID0gKHZvaWQqKilpcC0+Y29weTsKKyAgICAgICAgICAgIERCR0xPRyhURVNULCBpZiAocSkgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlRyYXZlcnNpbmcgY29weSBjaGFpbiB0byByZXNvbHZlIGlkPSclcydcbiIsIGlwLT5pZCkpOworICAgICAgICAgICAgaXAtPmNvcHkgPSBOVUxMOworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIuLi4gY29weSAlcCAtPiAlcCAoJXUgYnl0ZXMpXG4iLCBpcC0+cHRyLCBxLCAodW5zaWduZWQgaW50KWlwLT5zaXplKSk7CisJICAgICAgcCA9ICpxOworICAgICAgICAgICAgICBtZW1jcHkocSwgaXAtPnB0ciwgaXAtPnNpemUpOworICAgICAgICAgICAgICBxID0gKHZvaWQqKilwOworICAgICAgICAgICAgfSB3aGlsZSAocSk7CisJICAgIGZsYWcgPSAxOworCSAgfQorICAgICAgICAgIGZvciAoZnAgPSBpcC0+Zmxpc3Q7IGZwOyBmcCA9IGlwLT5mbGlzdCkKKyAgICAgICAgICB7IHJlZ2lzdGVyIHVuc2lnbmVkIGludCBrID0gZnAtPmxldmVsOworCSAgICByZWdpc3RlciB2b2lkICpwID0gaXAtPnB0cjsKKyAgICAgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x2aW5nIGZvcndhcmRlZCBkYXRhIHR5cGU9JWQgbG9jYXRpb249JXAgbGV2ZWw9JXUsJXUgaWQ9JyVzJ1xuIiwgaXAtPnR5cGUsIHAsIGlwLT5sZXZlbCwgZnAtPmxldmVsLCBpcC0+aWQpKTsKKwkgICAgd2hpbGUgKGlwLT5sZXZlbCA8IGspCisgICAgICAgICAgICB7IHJlZ2lzdGVyIHZvaWQgKipxID0gKHZvaWQqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yodm9pZCopKTsgIAorCSAgICAgIGlmICghcSkKKwkgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKwkgICAgICAqcSA9IHA7CisgICAgICAgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVzY2VuZGluZyBvbmUgbGV2ZWwsIG5ldyBsb2NhdGlvbj0lcCBob2xkcz0lcC4uLlxuIiwgcSwgKnEpKTsKKyAgICAgICAgICAgICAgcCA9ICh2b2lkKilxOworICAgICAgICAgICAgICBrLS07CisgICAgICAgICAgICB9CisJICAgIGlmIChmcC0+ZmNvcHkpCisJICAgICAgZnAtPmZjb3B5KHNvYXAsIGlwLT50eXBlLCBmcC0+dHlwZSwgZnAtPnB0ciwgZnAtPmxlbiwgcCwgaXAtPnNpemUpOworCSAgICBlbHNlCisJICAgICAgc29hcF9mY29weShzb2FwLCBpcC0+dHlwZSwgZnAtPnR5cGUsIGZwLT5wdHIsIGZwLT5sZW4sIHAsIGlwLT5zaXplKTsKKwkgICAgaXAtPmZsaXN0ID0gZnAtPm5leHQ7CisJICAgIFNPQVBfRlJFRShzb2FwLCBmcCk7CisJICAgIGZsYWcgPSAxOworCSAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9IHdoaWxlIChmbGFnKTsKKyNpZmRlZiBTT0FQX0RFQlVHCisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0lESEFTSDsgaSsrKQorICB7IGZvciAoaXAgPSBzb2FwLT5paHRbaV07IGlwOyBpcCA9IGlwLT5uZXh0KQorICAgIHsgaWYgKGlwLT5jb3B5IHx8IGlwLT5mbGlzdCkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHV0aW9uIGVycm9yOiBmb3J3YXJkZWQgZGF0YSBmb3IgaWQ9JyVzJyBjb3VsZCBub3QgYmUgcHJvcGFnYXRlZCwgcGxlYXNlIHJlcG9ydCB0aGlzIHByb2JsZW0gdG8gdGhlIGRldmVsb3BlcnNcbiIsIGlwLT5pZCkpOworICAgICAgfQorICAgIH0KKyAgfQorI2VuZGlmCisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x1dGlvbiBkb25lXG4iKSk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzaXplX3QKK1NPQVBfRk1BQzIKK3NvYXBfc2l6ZV9ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCwgc2l6ZV90IG4pCit7IGlmIChzb2FwLT5ibGlzdC0+cHRyKQorICB7IHNvYXAtPmJsaXN0LT5zaXplIC09ICooc2l6ZV90Kikoc29hcC0+Ymxpc3QtPnB0ciArIHNpemVvZihjaGFyKikpIC0gbjsKKyAgICAqKHNpemVfdCopKHNvYXAtPmJsaXN0LT5wdHIgKyBzaXplb2YoY2hhciopKSA9IG47CisgIH0KKyAgcmV0dXJuIHNvYXAtPmJsaXN0LT5zaXplOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZmlyc3RfYmxvY2soc3RydWN0IHNvYXAgKnNvYXApCit7IGNoYXIgKnAsICpxLCAqcjsKKyAgcCA9IHNvYXAtPmJsaXN0LT5wdHI7CisgIGlmICghcCkKKyAgICByZXR1cm4gTlVMTDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGaXJzdCBibG9ja1xuIikpOworICByID0gTlVMTDsKKyAgZG8KKyAgeyBxID0gKihjaGFyKiopcDsKKyAgICAqKGNoYXIqKilwID0gcjsKKyAgICByID0gcDsKKyAgICBwID0gcTsKKyAgfSB3aGlsZSAocCk7CisgIHNvYXAtPmJsaXN0LT5wdHIgPSByOworICByZXR1cm4gciArIHNpemVvZihjaGFyKikgKyBzaXplb2Yoc2l6ZV90KTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NoYXIqCitTT0FQX0ZNQUMyCitzb2FwX25leHRfYmxvY2soc3RydWN0IHNvYXAgKnNvYXApCit7IGNoYXIgKnA7CisgIHAgPSBzb2FwLT5ibGlzdC0+cHRyOworICBpZiAocCkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk5leHQgYmxvY2tcbiIpKTsKKyAgICBzb2FwLT5ibGlzdC0+cHRyID0gKihjaGFyKiopcDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgcCk7CisgICAgaWYgKHNvYXAtPmJsaXN0LT5wdHIpCisgICAgICByZXR1cm4gc29hcC0+Ymxpc3QtPnB0ciArIHNpemVvZihjaGFyKikgKyBzaXplb2Yoc2l6ZV90KTsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3NpemVfdAorU09BUF9GTUFDMgorc29hcF9ibG9ja19zaXplKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZXR1cm4gKihzaXplX3QqKShzb2FwLT5ibGlzdC0+cHRyICsgc2l6ZW9mKGNoYXIqKSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2VuZF9ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfYmxpc3QgKmJwOworICBjaGFyICpwLCAqcTsKKyAgYnAgPSBzb2FwLT5ibGlzdDsKKyAgaWYgKGJwKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIG9mIGJsb2NrIHNlcXVlbmNlLCBmcmVlIGFsbCByZW1haW5pbmcgYmxvY2tzXG4iKSk7CisgICAgZm9yIChwID0gYnAtPnB0cjsgcDsgcCA9IHEpCisgICAgeyBxID0gKihjaGFyKiopcDsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBwKTsKKyAgICB9CisgICAgc29hcC0+Ymxpc3QgPSBicC0+bmV4dDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgYnApOworICB9CisgIERCR0xPRyhURVNULCBpZiAoc29hcC0+Ymxpc3QpIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXN0b3JlIHByZXZpb3VzIGJsb2NrIHNlcXVlbmNlXG4iKSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjaGFyKgorU09BUF9GTUFDMgorc29hcF9zYXZlX2Jsb2NrKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpwLCBpbnQgZmxhZykKK3sgcmVnaXN0ZXIgc2l6ZV90IG47CisgIHJlZ2lzdGVyIGNoYXIgKnEsICpzOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNhdmUgYWxsIGJsb2NrcyBpbiBjb250aWd1b3VzIG1lbW9yeSBzcGFjZSBvZiAldSBieXRlcyAoJXAtPiVwKVxuIiwgKHVuc2lnbmVkIGludClzb2FwLT5ibGlzdC0+c2l6ZSwgc29hcC0+Ymxpc3QtPnB0ciwgcCkpOworICBpZiAoc29hcC0+Ymxpc3QtPnNpemUpCisgIHsgaWYgKCFwKQorICAgICAgcCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzb2FwLT5ibGlzdC0+c2l6ZSk7CisgICAgaWYgKHApCisgICAgeyBmb3IgKHMgPSBwLCBxID0gc29hcF9maXJzdF9ibG9jayhzb2FwKTsgcTsgcSA9IHNvYXBfbmV4dF9ibG9jayhzb2FwKSkKKyAgICAgIHsgbiA9IHNvYXBfYmxvY2tfc2l6ZShzb2FwKTsKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgICAgICAgIGlmIChmbGFnKQorCSAgc29hcF91cGRhdGVfcHRycyhzb2FwLCBxLCBxICsgbiwgcywgcSk7CisjZW5kaWYKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5ICV1IGJ5dGVzIGZyb20gJXAgdG8gJXBcbiIsICh1bnNpZ25lZCBpbnQpbiwgcSwgcykpOworICAgICAgICBtZW1jcHkocywgcSwgbik7CisgICAgICAgIHMgKz0gbjsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgfQorICBzb2FwX2VuZF9ibG9jayhzb2FwKTsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfcHV0c2l6ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHNpemUpCit7IHJldHVybiBzb2FwX3B1dHNpemVzKHNvYXAsIHR5cGUsICZzaXplLCAxKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9wdXRzaXplcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgaW50ICpzaXplLCBpbnQgZGltKQoreyByZXR1cm4gc29hcF9wdXRzaXplc29mZnNldHMoc29hcCwgdHlwZSwgc2l6ZSwgTlVMTCwgZGltKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9wdXRzaXplc29mZnNldHMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGludCAqc2l6ZSwgY29uc3QgaW50ICpvZmZzZXQsIGludCBkaW0pCit7IGludCBpOworICBpZiAoIXR5cGUpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgIHsgc3ByaW50Zihzb2FwLT50eXBlLCAiJXNbJWQiLCB0eXBlLCBzaXplWzBdKTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgZGltOyBpKyspCisgICAgICBzcHJpbnRmKHNvYXAtPnR5cGUgKyBzdHJsZW4oc29hcC0+dHlwZSksICIgJWQiLCBzaXplW2ldKTsKKyAgfQorICBlbHNlCisgIHsgaWYgKG9mZnNldCkKKyAgICB7IHNwcmludGYoc29hcC0+dHlwZSwgIiVzWyVkIiwgdHlwZSwgc2l6ZVswXSArIG9mZnNldFswXSk7CisgICAgICBmb3IgKGkgPSAxOyBpIDwgZGltOyBpKyspCisgICAgICAgIHNwcmludGYoc29hcC0+dHlwZSArIHN0cmxlbihzb2FwLT50eXBlKSwgIiwlZCIsIHNpemVbaV0gKyBvZmZzZXRbaV0pOworICAgIH0KKyAgICBlbHNlCisgICAgeyBzcHJpbnRmKHNvYXAtPnR5cGUsICIlc1slZCIsIHR5cGUsIHNpemVbMF0pOworICAgICAgZm9yIChpID0gMTsgaSA8IGRpbTsgaSsrKQorICAgICAgICBzcHJpbnRmKHNvYXAtPnR5cGUgKyBzdHJsZW4oc29hcC0+dHlwZSksICIsJWQiLCBzaXplW2ldKTsKKyAgICB9CisgICAgc3RyY2F0KHNvYXAtPnR5cGUsICJdIik7CisgIH0KKyAgcmV0dXJuIHNvYXAtPnR5cGU7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfcHV0b2Zmc2V0KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgb2Zmc2V0KQoreyByZXR1cm4gc29hcF9wdXRvZmZzZXRzKHNvYXAsICZvZmZzZXQsIDEpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3B1dG9mZnNldHMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGludCAqb2Zmc2V0LCBpbnQgZGltKQoreyByZWdpc3RlciBpbnQgaTsKKyAgc3ByaW50Zihzb2FwLT5hcnJheU9mZnNldCwgIlslZCIsIG9mZnNldFswXSk7CisgIGZvciAoaSA9IDE7IGkgPCBkaW07IGkrKykKKyAgICBzcHJpbnRmKHNvYXAtPmFycmF5T2Zmc2V0ICsgc3RybGVuKHNvYXAtPmFycmF5T2Zmc2V0KSwgIiwlZCIsIG9mZnNldFtpXSk7CisgIHN0cmNhdChzb2FwLT5hcnJheU9mZnNldCwgIl0iKTsKKyAgcmV0dXJuIHNvYXAtPmFycmF5T2Zmc2V0OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NpemUoY29uc3QgaW50ICpzaXplLCBpbnQgZGltKQoreyByZWdpc3RlciBpbnQgaSwgbiA9IHNpemVbMF07CisgIGZvciAoaSA9IDE7IGkgPCBkaW07IGkrKykKKyAgICBuICo9IHNpemVbaV07CisgIHJldHVybiBuOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldG9mZnNldHMoY29uc3QgY2hhciAqYXR0ciwgY29uc3QgaW50ICpzaXplLCBpbnQgKm9mZnNldCwgaW50IGRpbSkKK3sgcmVnaXN0ZXIgaW50IGksIGogPSAwOworICBpZiAob2Zmc2V0KQorICAgIGZvciAoaSA9IDA7IGkgPCBkaW0gJiYgYXR0ciAmJiAqYXR0cjsgaSsrKQorICAgIHsgYXR0cisrOworICAgICAgaiAqPSBzaXplW2ldOworICAgICAgaiArPSBvZmZzZXRbaV0gPSAoaW50KWF0b2woYXR0cik7CisgICAgICBhdHRyID0gc3RyY2hyKGF0dHIsICcsJyk7CisgICAgfQorICBlbHNlCisgICAgZm9yIChpID0gMDsgaSA8IGRpbSAmJiBhdHRyICYmICphdHRyOyBpKyspCisgICAgeyBhdHRyKys7CisgICAgICBqICo9IHNpemVbaV07CisgICAgICBqICs9IChpbnQpYXRvbChhdHRyKTsKKyAgICAgIGF0dHIgPSBzdHJjaHIoYXR0ciwgJywnKTsKKyAgICB9CisgIHJldHVybiBqOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldHNpemUoY29uc3QgY2hhciAqYXR0cjEsIGNvbnN0IGNoYXIgKmF0dHIyLCBpbnQgKmopCit7IHJlZ2lzdGVyIGludCBuLCBrOworICBjaGFyICpzOworICAqaiA9IDA7CisgIGlmICghKmF0dHIxKQorICAgIHJldHVybiAtMTsKKyAgaWYgKCphdHRyMSA9PSAnWycpCisgICAgYXR0cjErKzsKKyAgbiA9IDE7CisgIGZvciAoOzspCisgIHsgayA9IChpbnQpc29hcF9zdHJ0b2woYXR0cjEsICZzLCAxMCk7CisgICAgbiAqPSBrOworICAgIGlmIChrIDwgMCB8fCBuID4gU09BUF9NQVhBUlJBWVNJWkUgfHwgcyA9PSBhdHRyMSkKKyAgICAgIHJldHVybiAtMTsKKyAgICBhdHRyMSA9IHN0cmNocihzLCAnLCcpOworICAgIGlmICghYXR0cjEpCisgICAgICBhdHRyMSA9IHN0cmNocihzLCAnICcpOworICAgIGlmIChhdHRyMiAmJiAqYXR0cjIpCisgICAgeyBhdHRyMisrOworICAgICAgKmogKj0gazsKKyAgICAgIGsgPSAoaW50KXNvYXBfc3RydG9sKGF0dHIyLCAmcywgMTApOworICAgICAgKmogKz0gazsKKyAgICAgIGlmIChrIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgYXR0cjIgPSBzOworICAgIH0KKyAgICBpZiAoIWF0dHIxKQorICAgICAgYnJlYWs7CisgICAgYXR0cjErKzsKKyAgfQorICByZXR1cm4gbiAtICpqOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldHNpemVzKGNvbnN0IGNoYXIgKmF0dHIsIGludCAqc2l6ZSwgaW50IGRpbSkKK3sgcmVnaXN0ZXIgaW50IGksIGssIG47CisgIGlmICghKmF0dHIpCisgICAgcmV0dXJuIC0xOworICBpID0gc3RybGVuKGF0dHIpOworICBuID0gMTsKKyAgZG8KKyAgeyBmb3IgKGkgPSBpLTE7IGkgPj0gMDsgaS0tKQorICAgICAgaWYgKGF0dHJbaV0gPT0gJ1snIHx8IGF0dHJbaV0gPT0gJywnIHx8IGF0dHJbaV0gPT0gJyAnKQorICAgICAgICBicmVhazsKKyAgICBrID0gKGludClhdG9sKGF0dHIgKyBpICsgMSk7CisgICAgbiAqPSBzaXplWy0tZGltXSA9IGs7CisgICAgaWYgKGsgPCAwIHx8IG4gPiBTT0FQX01BWEFSUkFZU0laRSkKKyAgICAgIHJldHVybiAtMTsKKyAgfSB3aGlsZSAoaSA+PSAwICYmIGF0dHJbaV0gIT0gJ1snKTsKKyAgcmV0dXJuIG47Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0cG9zaXRpb24oY29uc3QgY2hhciAqYXR0ciwgaW50ICpwb3MpCit7IHJlZ2lzdGVyIGludCBpLCBuOworICBpZiAoISphdHRyKQorICAgIHJldHVybiAtMTsKKyAgbiA9IDA7CisgIGkgPSAxOworICBkbworICB7IHBvc1tuKytdID0gKGludClhdG9sKGF0dHIgKyBpKTsKKyAgICB3aGlsZSAoYXR0cltpXSAmJiBhdHRyW2ldICE9ICcsJyAmJiBhdHRyW2ldICE9ICddJykKKyAgICAgIGkrKzsKKyAgICBpZiAoYXR0cltpXSA9PSAnLCcpCisgICAgICBpKys7CisgIH0gd2hpbGUgKG4gPCBTT0FQX01BWERJTVMgJiYgYXR0cltpXSAmJiBhdHRyW2ldICE9ICddJyk7CisgIHJldHVybiBuOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1c2hfbmFtZXNwYWNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqbnMpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucDsKKyAgcmVnaXN0ZXIgc3RydWN0IE5hbWVzcGFjZSAqcDsKKyAgcmVnaXN0ZXIgc2hvcnQgaSA9IC0xOworICByZWdpc3RlciBzaXplX3QgbiwgazsKKyAgbiA9IHN0cmxlbihpZCk7CisgIGsgPSBzdHJsZW4obnMpICsgMTsKKyAgcCA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXM7CisgIGlmIChwKQorICB7IGZvciAoaSA9IDA7IHAtPmlkOyBwKyssIGkrKykKKyAgICB7IGlmIChwLT5ucyAmJiAhc3RyY21wKG5zLCBwLT5ucykpCisgICAgICB7IGlmIChwLT5vdXQpCisgICAgICAgIHsgU09BUF9GUkVFKHNvYXAsIHAtPm91dCk7CisgICAgICAgICAgcC0+b3V0ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChwLT5vdXQpCisgICAgICB7IGlmICghc3RyY21wKG5zLCBwLT5vdXQpKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZWxzZSBpZiAocC0+aW4pCisgICAgICB7IGlmICghc29hcF90YWdfY21wKG5zLCBwLT5pbikpCisgICAgICAgIHsgaWYgKChwLT5vdXQgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgaykpKQorICAgICAgICAgICAgc3RyY3B5KHAtPm91dCwgbnMpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmICghcCB8fCAhcC0+aWQpCisgICAgICBpID0gLTE7CisgIH0KKyAgaWYgKGkgPj0gMCkKKyAgICBrID0gMDsKKyAgbnAgPSAoc3RydWN0IHNvYXBfbmxpc3QqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9ubGlzdCkgKyBuICsgayk7CisgIGlmICghbnApCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgIG5wLT5uZXh0ID0gc29hcC0+bmxpc3Q7CisgIHNvYXAtPm5saXN0ID0gbnA7CisgIG5wLT5sZXZlbCA9IHNvYXAtPmxldmVsOworICBucC0+aW5kZXggPSBpOworICBzdHJjcHkobnAtPmlkLCBpZCk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUHVzaCBuYW1lc3BhY2UgYmluZGluZyAobGV2ZWw9JXUpICclcycgJyVzJ1xuIiwgc29hcC0+bGV2ZWwsIGlkLCBucykpOworICBpZiAoaSA8IDApCisgIHsgbnAtPm5zID0gbnAtPmlkICsgbiArIDE7CisgICAgc3RyY3B5KG5wLT5ucywgbnMpOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUHVzaCBOT1QgT0s6IG5vIG1hdGNoIGZvdW5kIGZvciAnJXMnIGluIG5hbWVzcGFjZSBtYXBwaW5nIHRhYmxlIChhZGRlZCB0byBzdGFjayBhbnl3YXkpXG4iLCBucykpOworICB9CisgIGVsc2UKKyAgeyBucC0+bnMgPSBOVUxMOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUHVzaCBPSyAoJyVzJyBtYXRjaGVzICclcycgaW4gbmFtZXNwYWNlIHRhYmxlKVxuIiwgaWQsIHAtPmlkKSk7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3BvcF9uYW1lc3BhY2Uoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucDsKKyAgd2hpbGUgKHNvYXAtPm5saXN0ICYmIHNvYXAtPm5saXN0LT5sZXZlbCA+PSBzb2FwLT5sZXZlbCkKKyAgeyBucCA9IHNvYXAtPm5saXN0LT5uZXh0OworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUG9wcGVkIG5hbWVzcGFjZSBiaW5kaW5nIChsZXZlbD0ldSkgJyVzJ1xuIiwgc29hcC0+bGV2ZWwsIHNvYXAtPm5saXN0LT5pZCkpOworICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5ubGlzdCk7CisgICAgc29hcC0+bmxpc3QgPSBucDsKKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX21hdGNoX25hbWVzcGFjZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQxLCBjb25zdCBjaGFyICppZDIsIGludCBuMSwgaW50IG4yKSAKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wID0gc29hcC0+bmxpc3Q7CisgIHdoaWxlIChucCAmJiAoc3RybmNtcChucC0+aWQsIGlkMSwgbjEpIHx8IG5wLT5pZFtuMV0pKQorICAgIG5wID0gbnAtPm5leHQ7CisgIGlmIChucCkKKyAgeyBpZiAobnAtPmluZGV4IDwgMAorICAgICB8fCAoc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tucC0+aW5kZXhdLmlkCisgICAgICAmJiAoc3RybmNtcChzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW25wLT5pbmRleF0uaWQsIGlkMiwgbjIpCisgICAgICAgfHwgc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tucC0+aW5kZXhdLmlkW24yXSkpKQorICAgICAgcmV0dXJuIFNPQVBfTkFNRVNQQUNFOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIGlmIChuMSA9PSAzICYmIG4xID09IG4yICYmICFzdHJjbXAoaWQxLCAieG1sIikgJiYgIXN0cmNtcChpZDEsIGlkMikpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIHJldHVybiBTT0FQX1NZTlRBWF9FUlJPUjsgCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9jdXJyZW50X25hbWVzcGFjZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnA7CisgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnM7CisgIG5wID0gc29hcC0+bmxpc3Q7CisgIGlmICghKHMgPSBzdHJjaHIodGFnLCAnOicpKSkKKyAgeyB3aGlsZSAobnAgJiYgKm5wLT5pZCkgLyogZmluZCBkZWZhdWx0IG5hbWVzcGFjZSwgaWYgcHJlc2VudCAqLworICAgICAgbnAgPSBucC0+bmV4dDsKKyAgfQorICBlbHNlCisgIHsgd2hpbGUgKG5wICYmIChzdHJuY21wKG5wLT5pZCwgdGFnLCBzIC0gdGFnKSB8fCBucC0+aWRbcyAtIHRhZ10pKQorICAgICAgbnAgPSBucC0+bmV4dDsKKyAgICBpZiAoIW5wKQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX05BTUVTUEFDRTsKKyAgfQorICBpZiAobnApCisgIHsgaWYgKG5wLT5pbmRleCA+PSAwKQorICAgICAgcmV0dXJuIHNvYXAtPm5hbWVzcGFjZXNbbnAtPmluZGV4XS5uczsKKyAgICBpZiAobnAtPm5zKQorICAgICAgcmV0dXJuIHNvYXBfc3RyZHVwKHNvYXAsIG5wLT5ucyk7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfdGFnX2NtcChjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICp0KQoreyBmb3IgKDs7KQorICB7IHJlZ2lzdGVyIGludCBjMSA9ICpzOworICAgIHJlZ2lzdGVyIGludCBjMiA9ICp0OworICAgIGlmICghYzEgfHwgYzEgPT0gJyInKQorICAgICAgYnJlYWs7CisgICAgaWYgKGMyICE9ICctJykKKyAgICB7IGlmIChjMSAhPSBjMikKKyAgICAgIHsgaWYgKGMxID49ICdBJyAmJiBjMSA8PSAnWicpCisgICAgICAgICAgYzEgKz0gJ2EnIC0gJ0EnOworICAgICAgICBpZiAoYzIgPj0gJ0EnICYmIGMyIDw9ICdaJykKKyAgICAgICAgICBjMiArPSAnYScgLSAnQSc7CisgICAgICB9CisgICAgICBpZiAoYzEgIT0gYzIpCisgICAgICB7IGlmIChjMiAhPSAnKicpCisgICAgICAgICAgcmV0dXJuIDE7CisJYzIgPSAqKyt0OworICAgICAgICBpZiAoIWMyKQorCSAgcmV0dXJuIDA7CisgICAgICAgIGlmIChjMiA+PSAnQScgJiYgYzIgPD0gJ1onKQorICAgICAgICAgIGMyICs9ICdhJyAtICdBJzsKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeyBjMSA9ICpzOworCSAgaWYgKCFjMSB8fCBjMSA9PSAnIicpCisJICAgIGJyZWFrOworCSAgaWYgKGMxID49ICdBJyAmJiBjMSA8PSAnWicpCisgICAgICAgICAgICBjMSArPSAnYScgLSAnQSc7CisgICAgICAgICAgaWYgKGMxID09IGMyICYmICFzb2FwX3RhZ19jbXAocyArIDEsIHQgKyAxKSkKKyAgICAgICAgICAgIHJldHVybiAwOworCSAgcysrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBzKys7CisgICAgdCsrOworICB9CisgIGlmICgqdCA9PSAnKicgJiYgIXRbMV0pCisgICAgcmV0dXJuIDA7CisgIHJldHVybiAqdDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9tYXRjaF90YWcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZzEsIGNvbnN0IGNoYXIgKnRhZzIpCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnMsICp0OworICBpZiAoIXRhZzEgfHwgIXRhZzIgfHwgISp0YWcyKQorICAgIHJldHVybiBTT0FQX09LOworICBzID0gc3RyY2hyKHRhZzEsICc6Jyk7CisgIHQgPSBzdHJjaHIodGFnMiwgJzonKTsKKyAgaWYgKHQpCisgIHsgaWYgKHMpCisgICAgeyBpZiAodFsxXSAmJiBTT0FQX1NUUkNNUChzICsgMSwgdCArIDEpKQorICAgICAgICByZXR1cm4gU09BUF9UQUdfTUlTTUFUQ0g7CisgICAgICBpZiAodCAhPSB0YWcyICYmIHNvYXBfbWF0Y2hfbmFtZXNwYWNlKHNvYXAsIHRhZzEsIHRhZzIsIHMgLSB0YWcxLCB0IC0gdGFnMikpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVGFncyAnJXMnIGFuZCAnJXMnIG1hdGNoIGJ1dCBuYW1lc3BhY2VzIGRpZmZlclxuIiwgdGFnMSwgdGFnMikpOworICAgICAgICByZXR1cm4gU09BUF9UQUdfTUlTTUFUQ0g7CisgICAgICB9CisgICAgfSAKKyAgICBlbHNlIGlmIChTT0FQX1NUUkNNUCh0YWcxLCB0ICsgMSkpCisgICAgICByZXR1cm4gU09BUF9UQUdfTUlTTUFUQ0g7CisgICAgZWxzZSBpZiAodCAhPSB0YWcyICYmIHNvYXBfbWF0Y2hfbmFtZXNwYWNlKHNvYXAsIHRhZzEsIHRhZzIsIDAsIHQgLSB0YWcyKSkKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVGFncyAnJXMnIGFuZCAnJXMnIG1hdGNoIGJ1dCBuYW1lc3BhY2VzIGRpZmZlclxuIiwgdGFnMSwgdGFnMikpOworICAgICAgcmV0dXJuIFNPQVBfVEFHX01JU01BVENIOworICAgIH0KKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlRhZ3MgYW5kIChkZWZhdWx0KSBuYW1lc3BhY2VzIG1hdGNoOiAnJXMnICclcydcbiIsIHRhZzEsIHRhZzIpKTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICBpZiAocykKKyAgeyBpZiAoU09BUF9TVFJDTVAocyArIDEsIHRhZzIpKQorICAgICAgcmV0dXJuIFNPQVBfVEFHX01JU01BVENIOworICB9CisgIGVsc2UgaWYgKFNPQVBfU1RSQ01QKHRhZzEsIHRhZzIpKQorICAgIHJldHVybiBTT0FQX1RBR19NSVNNQVRDSDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJUYWdzIG1hdGNoOiAnJXMnICclcydcbiIsIHRhZzEsIHRhZzIpKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfbWF0Y2hfYXJyYXkoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnR5cGUpCit7IGlmICgqc29hcC0+YXJyYXlUeXBlKQorICAgIGlmIChzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT5hcnJheVR5cGUsIHR5cGUpCisgICAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPmFycmF5VHlwZSwgInhzZDphbnlUeXBlIikKKyAgICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+YXJyYXlUeXBlLCAieHNkOnVyLXR5cGUiKQorICAgICkKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQXJyYXkgdHlwZSBtaXNtYXRjaDogJyVzJyAnJXMnXG4iLCBzb2FwLT5hcnJheVR5cGUsIHR5cGUpKTsKKyAgICAgIHJldHVybiBTT0FQX1RBR19NSVNNQVRDSDsKKyAgICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJU1NMCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIFdJVEhfT1BFTlNTTAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmFuZCgpCit7IHVuc2lnbmVkIGNoYXIgYnVmWzRdOworICBpZiAoIXNzbF9pbml0X2RvbmUpCisgICAgc29hcF9zc2xfaW5pdCgpOworICBSQU5EX3BzZXVkb19ieXRlcyhidWYsIDQpOworICByZXR1cm4gKihpbnQqKWJ1ZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zc2xfc2VydmVyX2NvbnRleHQoc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIHNob3J0IGZsYWdzLCBjb25zdCBjaGFyICprZXlmaWxlLCBjb25zdCBjaGFyICpwYXNzd29yZCwgY29uc3QgY2hhciAqY2FmaWxlLCBjb25zdCBjaGFyICpjYXBhdGgsIGNvbnN0IGNoYXIgKmRoZmlsZSwgY29uc3QgY2hhciAqcmFuZGZpbGUsIGNvbnN0IGNoYXIgKnNpZCkKK3sgaW50IGVycjsKKyAgc29hcC0+a2V5ZmlsZSA9IGtleWZpbGU7CisgIHNvYXAtPnBhc3N3b3JkID0gcGFzc3dvcmQ7CisgIHNvYXAtPmNhZmlsZSA9IGNhZmlsZTsKKyAgc29hcC0+Y2FwYXRoID0gY2FwYXRoOworICBpZiAoZGhmaWxlKQorICB7IHNvYXAtPmRoZmlsZSA9IGRoZmlsZTsKKyAgICBzb2FwLT5yc2EgPSAwOworICB9CisgIGVsc2UKKyAgeyBzb2FwLT5kaGZpbGUgPSBOVUxMOworICAgIHNvYXAtPnJzYSA9IDE7CisgIH0KKyAgc29hcC0+cmFuZGZpbGUgPSByYW5kZmlsZTsKKyAgc29hcC0+cmVxdWlyZV9jbGllbnRfYXV0aCA9IChmbGFncyAmIFNPQVBfU1NMX1JFUVVJUkVfQ0xJRU5UX0FVVEhFTlRJQ0FUSU9OKTsKKyAgaWYgKCEoZXJyID0gc29hcC0+ZnNzbGF1dGgoc29hcCkpKQorICB7IGlmIChzaWQpCisgICAgICBTU0xfQ1RYX3NldF9zZXNzaW9uX2lkX2NvbnRleHQoc29hcC0+Y3R4LCAodW5zaWduZWQgY2hhciopc2lkLCBzdHJsZW4oc2lkKSk7CisgIH0KKyAgcmV0dXJuIGVycjsgCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc3NsX2NsaWVudF9jb250ZXh0KHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBzaG9ydCBmbGFncywgY29uc3QgY2hhciAqa2V5ZmlsZSwgY29uc3QgY2hhciAqcGFzc3dvcmQsIGNvbnN0IGNoYXIgKmNhZmlsZSwgY29uc3QgY2hhciAqY2FwYXRoLCBjb25zdCBjaGFyICpyYW5kZmlsZSkKK3sgc29hcC0+a2V5ZmlsZSA9IGtleWZpbGU7CisgIHNvYXAtPnBhc3N3b3JkID0gcGFzc3dvcmQ7CisgIHNvYXAtPmNhZmlsZSA9IGNhZmlsZTsKKyAgc29hcC0+Y2FwYXRoID0gY2FwYXRoOworICBzb2FwLT5kaGZpbGUgPSBOVUxMOworICBzb2FwLT5yc2EgPSAwOworICBzb2FwLT5yYW5kZmlsZSA9IHJhbmRmaWxlOworICBzb2FwLT5yZXF1aXJlX3NlcnZlcl9hdXRoID0gKGZsYWdzICYgU09BUF9TU0xfUkVRVUlSRV9TRVJWRVJfQVVUSEVOVElDQVRJT04pOworICByZXR1cm4gc29hcC0+ZnNzbGF1dGgoc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NzbF9pbml0KCkKK3sgLyogTm90ZTogZm9yIE1UIHN5c3RlbXMsIHRoZSBtYWluIHByb2dyYW0gTVVTVCBjYWxsIHNvYXBfc3NsX2luaXQoKSBiZWZvcmUgYW55IHRocmVhZHMgYXJlIHN0YXJ0ZWQgKi8KKyAgaWYgKCFzc2xfaW5pdF9kb25lKQorICB7IHNzbF9pbml0X2RvbmUgPSAxOworICAgIFNTTF9saWJyYXJ5X2luaXQoKTsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgU1NMX2xvYWRfZXJyb3Jfc3RyaW5ncygpOworI2VuZGlmCisgICAgaWYgKCFSQU5EX2xvYWRfZmlsZSgiL2Rldi91cmFuZG9tIiwgMTAyNCkpCisgICAgeyBjaGFyIGJ1ZlsxMDI0XTsKKyAgICAgIFJBTkRfc2VlZChidWYsIHNpemVvZihidWYpKTsKKyAgICAgIHdoaWxlICghUkFORF9zdGF0dXMoKSkKKyAgICAgIHsgaW50IHIgPSByYW5kKCk7CisgICAgICAgIFJBTkRfc2VlZCgmciwgc2l6ZW9mKGludCkpOworICAgICAgfQorICAgIH0KKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNvbnN0IGNoYXIgKgorc3NsX2Vycm9yKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgcmV0KQoreyBpbnQgZXJyID0gU1NMX2dldF9lcnJvcihzb2FwLT5zc2wsIHJldCk7CisgIGNvbnN0IGNoYXIgKm1zZyA9IHNvYXBfc3RyX2NvZGUoaF9zc2xfZXJyb3JfY29kZXMsIGVycik7CisgIGlmIChtc2cpCisgICAgc3RyY3B5KHNvYXAtPm1zZ2J1ZiwgbXNnKTsKKyAgZWxzZQorICAgIHJldHVybiBFUlJfZXJyb3Jfc3RyaW5nKGVyciwgc29hcC0+bXNnYnVmKTsKKyAgaWYgKEVSUl9wZWVrX2Vycm9yKCkpCisgIHsgdW5zaWduZWQgbG9uZyByOworICAgIHN0cmNhdChzb2FwLT5tc2didWYsICJcbiIpOworICAgIHdoaWxlICgociA9IEVSUl9nZXRfZXJyb3IoKSkpCisgICAgICBFUlJfZXJyb3Jfc3RyaW5nX24ociwgc29hcC0+bXNnYnVmICsgc3RybGVuKHNvYXAtPm1zZ2J1ZiksIHNpemVvZihzb2FwLT5tc2didWYpIC0gc3RybGVuKHNvYXAtPm1zZ2J1ZikpOworICB9IAorICBlbHNlCisgIHsgc3dpdGNoIChyZXQpCisgICAgeyBjYXNlIDA6CisgICAgICAgIHN0cmNweShzb2FwLT5tc2didWYsICJFT0Ygd2FzIG9ic2VydmVkIHRoYXQgdmlvbGF0ZXMgdGhlIHByb3RvY29sLiBUaGUgY2xpZW50IHByb2JhYmx5IHByb3ZpZGVkIGludmFsaWQgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24uIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAtMToKKyAgICAgICAgc3ByaW50Zihzb2FwLT5tc2didWYsICJFcnJvciBvYnNlcnZlZCBieSB1bmRlcmx5aW5nIEJJTzogJXMiLCBzdHJlcnJvcihlcnJubykpOyAgCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gc29hcC0+bXNnYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc3NsX3Bhc3N3b3JkKGNoYXIgKmJ1ZiwgaW50IG51bSwgaW50IHJ3ZmxhZywgdm9pZCAqdXNlcmRhdGEpCit7IGlmIChudW0gPCAoaW50KXN0cmxlbigoY2hhciopdXNlcmRhdGEpICsgMSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIHN0cmxlbihzdHJjcHkoYnVmLCAoY2hhciopdXNlcmRhdGEpKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVGhpcyBjYWxsYmFjayBpcyBpbmNsdWRlZCBmb3IgZnV0dXJlIHJlZmVyZW5jZXMuIEl0IHNob3VsZCBub3QgYmUgZGVsZXRlZAorI2lmbmRlZiBQQUxNXzIKK3N0YXRpYyBESCAqCitzc2xfdG1wX2RoKFNTTCAqc3NsLCBpbnQgaXNfZXhwb3J0LCBpbnQga2V5bGVuZ3RoKQoreyBzdGF0aWMgREggKmRoNTEyID0gTlVMTDsKKyAgc3RhdGljIERIICpkaDEwMjQgPSBOVUxMOworICBESCAqZGg7CisgIHN3aXRjaCAoa2V5bGVuZ3RoKQorICB7IGNhc2UgNTEyOgorICAgICAgaWYgKCFkaDUxMikKKyAgICAgIHsgQklPICpiaW8gPSBCSU9fbmV3X2ZpbGUoImRoNTEyLnBlbSIsICJyIik7CisgICAgICAgIGlmIChiaW8pCisgICAgICAgIHsgZGg1MTIgPSBQRU1fcmVhZF9iaW9fREhwYXJhbXMoYmlvLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICBCSU9fZnJlZShiaW8pOworICAgICAgICAgIHJldHVybiBkaDUxMjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gZGg1MTI7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmICghZGgxMDI0KQorICAgICAgeyBCSU8gKmJpbyA9IEJJT19uZXdfZmlsZSgiZGgxMDI0LnBlbSIsICJyIik7CisgICAgICAgIGlmIChiaW8pCisgICAgICAgIHsgZGgxMDI0ID0gUEVNX3JlYWRfYmlvX0RIcGFyYW1zKGJpbywgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgQklPX2ZyZWUoYmlvKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZGggPSBkaDEwMjQ7CisgIH0KKyAgcmV0dXJuIGRoOworfQorI2VuZGlmCisqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NzbF9hdXRoX2luaXQoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmICghc3NsX2luaXRfZG9uZSkKKyAgICBzb2FwX3NzbF9pbml0KCk7CisgIGlmICghc29hcC0+Y3R4KQorICB7IGlmICghKHNvYXAtPmN0eCA9IFNTTF9DVFhfbmV3KFNTTHYyM19tZXRob2QoKSkpKQorICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3Qgc2V0dXAgY29udGV4dCIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgfQorICBpZiAoc29hcC0+cmFuZGZpbGUpCisgIHsgaWYgKCFSQU5EX2xvYWRfZmlsZShzb2FwLT5yYW5kZmlsZSwgLTEpKQorICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3QgbG9hZCByYW5kb21uZXNzIiwgU09BUF9TU0xfRVJST1IpOworICB9CisgIGlmIChzb2FwLT5jYWZpbGUgfHwgc29hcC0+Y2FwYXRoKQorICB7IGlmICghU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoc29hcC0+Y3R4LCBzb2FwLT5jYWZpbGUsIHNvYXAtPmNhcGF0aCkpCisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCByZWFkIENBIGZpbGUgYW5kIGRpcmVjdG9yeSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICBpZiAoc29hcC0+Y2FmaWxlICYmIHNvYXAtPnJlcXVpcmVfY2xpZW50X2F1dGgpCisgICAgICBTU0xfQ1RYX3NldF9jbGllbnRfQ0FfbGlzdChzb2FwLT5jdHgsIFNTTF9sb2FkX2NsaWVudF9DQV9maWxlKHNvYXAtPmNhZmlsZSkpOworICB9CisgIGlmICghU1NMX0NUWF9zZXRfZGVmYXVsdF92ZXJpZnlfcGF0aHMoc29hcC0+Y3R4KSkKKyAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCByZWFkIGRlZmF1bHQgQ0EgZmlsZSBhbmQvb3IgZGlyZWN0b3J5IiwgU09BUF9TU0xfRVJST1IpOworLyogU2VlIGJlbG93ICovCisgIGlmIChzb2FwLT5rZXlmaWxlKQorICB7IGlmICghU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZShzb2FwLT5jdHgsIHNvYXAtPmtleWZpbGUpKQorICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3QgcmVhZCBjZXJ0aWZpY2F0ZSBrZXkgZmlsZSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICBpZiAoc29hcC0+cGFzc3dvcmQpCisgICAgeyBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYl91c2VyZGF0YShzb2FwLT5jdHgsICh2b2lkKilzb2FwLT5wYXNzd29yZCk7CisgICAgICBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYihzb2FwLT5jdHgsIHNzbF9wYXNzd29yZCk7CisgICAgfQorICAgIGlmICghU1NMX0NUWF91c2VfUHJpdmF0ZUtleV9maWxlKHNvYXAtPmN0eCwgc29hcC0+a2V5ZmlsZSwgU1NMX0ZJTEVUWVBFX1BFTSkpCisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCByZWFkIGtleSBmaWxlIiwgU09BUF9TU0xfRVJST1IpOworICB9CisvKiBTdWdnZXN0ZWQgYWx0ZXJuYXRpdmUgYXBwcm9hY2ggdG8gY2hlY2sgY2FmaWxlIGZpcnN0IGJlZm9yZSB0aGUga2V5IGZpbGU6CisgIGlmIChzb2FwLT5wYXNzd29yZCkKKyAgeyBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYl91c2VyZGF0YShzb2FwLT5jdHgsICh2b2lkKilzb2FwLT5wYXNzd29yZCk7CisgICAgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2Ioc29hcC0+Y3R4LCBzc2xfcGFzc3dvcmQpOworICB9CisgIGlmICghc29hcC0+Y2FmaWxlIHx8ICFTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKHNvYXAtPmN0eCwgc29hcC0+Y2FmaWxlKSkKKyAgeyBpZiAoc29hcC0+a2V5ZmlsZSkKKyAgICB7IGlmICghU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZShzb2FwLT5jdHgsIHNvYXAtPmtleWZpbGUpKQorICAgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCByZWFkIGNlcnRpZmljYXRlIG9yIGtleSBmaWxlIiwgU09BUF9TU0xfRVJST1IpOworICAgICAgaWYgKCFTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X2ZpbGUoc29hcC0+Y3R4LCBzb2FwLT5rZXlmaWxlLCBTU0xfRklMRVRZUEVfUEVNKSkKKyAgICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3QgcmVhZCBrZXkgZmlsZSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICB9CisgIH0KKyovCisgIGlmIChzb2FwLT5yc2EpCisgIHsgUlNBICpyc2EgPSBSU0FfZ2VuZXJhdGVfa2V5KDEwMjQsIFJTQV9GNCwgTlVMTCwgTlVMTCk7CisgICAgaWYgKCFTU0xfQ1RYX3NldF90bXBfcnNhKHNvYXAtPmN0eCwgcnNhKSkKKyAgICB7IGlmIChyc2EpCisgICAgICAgIFJTQV9mcmVlKHJzYSk7CisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCBzZXQgUlNBIGtleSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICB9CisgICAgUlNBX2ZyZWUocnNhKTsKKyAgfQorICBlbHNlIGlmIChzb2FwLT5kaGZpbGUpCisgIHsgREggKmRoID0gMDsKKyAgICBCSU8gKmJpbzsKKyAgICBiaW8gPSBCSU9fbmV3X2ZpbGUoc29hcC0+ZGhmaWxlLCAiciIpOworICAgIGlmICghYmlvKQorICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3QgcmVhZCBESCBmaWxlIiwgU09BUF9TU0xfRVJST1IpOworICAgIGRoID0gUEVNX3JlYWRfYmlvX0RIcGFyYW1zKGJpbywgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgQklPX2ZyZWUoYmlvKTsKKyAgICBpZiAoU1NMX0NUWF9zZXRfdG1wX2RoKHNvYXAtPmN0eCwgZGgpIDwgMCkKKyAgICB7IGlmIChkaCkKKyAgICAgICAgREhfZnJlZShkaCk7CisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCBzZXQgREggcGFyYW1ldGVycyIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICB9CisgICAgREhfZnJlZShkaCk7CisgIH0KKyAgU1NMX0NUWF9zZXRfb3B0aW9ucyhzb2FwLT5jdHgsIFNTTF9PUF9BTEwgfCBTU0xfT1BfTk9fU1NMdjIpOworICBTU0xfQ1RYX3NldF92ZXJpZnkoc29hcC0+Y3R4LCBzb2FwLT5yZXF1aXJlX2NsaWVudF9hdXRoID8gKFNTTF9WRVJJRllfUEVFUiB8IFNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQpIDogc29hcC0+cmVxdWlyZV9zZXJ2ZXJfYXV0aCA/IFNTTF9WRVJJRllfUEVFUiA6IFNTTF9WRVJJRllfTk9ORSwgc29hcC0+ZnNzbHZlcmlmeSk7CisjaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCAweDAwOTA1MTAwTCkKKyAgU1NMX0NUWF9zZXRfdmVyaWZ5X2RlcHRoKHNvYXAtPmN0eCwgMSk7IAorI2Vsc2UKKyAgU1NMX0NUWF9zZXRfdmVyaWZ5X2RlcHRoKHNvYXAtPmN0eCwgOSk7IAorI2VuZGlmICAKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzc2xfdmVyaWZ5X2NhbGxiYWNrKGludCBvaywgWDUwOV9TVE9SRV9DVFggKnN0b3JlKQoreworI2lmZGVmIFNPQVBfREVCVUcKKyAgaWYgKCFvaykgCisgIHsgY2hhciBkYXRhWzI1Nl07CisgICAgWDUwOSAqY2VydCA9IFg1MDlfU1RPUkVfQ1RYX2dldF9jdXJyZW50X2NlcnQoc3RvcmUpOworICAgIGZwcmludGYoc3RkZXJyLCAiU1NMIHZlcmlmeSBlcnJvciBvciB3YXJuaW5nIHdpdGggY2VydGlmaWNhdGUgYXQgZGVwdGggJWQ6ICVzXG4iLCBYNTA5X1NUT1JFX0NUWF9nZXRfZXJyb3JfZGVwdGgoc3RvcmUpLCBYNTA5X3ZlcmlmeV9jZXJ0X2Vycm9yX3N0cmluZyhYNTA5X1NUT1JFX0NUWF9nZXRfZXJyb3Ioc3RvcmUpKSk7CisgICAgWDUwOV9OQU1FX29uZWxpbmUoWDUwOV9nZXRfaXNzdWVyX25hbWUoY2VydCksIGRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgZnByaW50ZihzdGRlcnIsICJjZXJ0aWZpY2F0ZSBpc3N1ZXIgJXNcbiIsIGRhdGEpOworICAgIFg1MDlfTkFNRV9vbmVsaW5lKFg1MDlfZ2V0X3N1YmplY3RfbmFtZShjZXJ0KSwgZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImNlcnRpZmljYXRlIHN1YmplY3QgJXNcbiIsIGRhdGEpOworICB9CisjZW5kaWYKKyAgLyogTm90ZTogcmV0dXJuIDEgdG8gY29udGludWUsIGJ1dCB1bnNhZmUgcHJvZ3Jlc3Mgd2lsbCBiZSB0ZXJtaW5hdGVkIGJ5IFNTTCAqLworICByZXR1cm4gb2s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc3NsX2FjY2VwdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgQklPICpiaW87CisgIGludCBpLCByOworICBpZiAoIXNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiTm8gc29ja2V0IGluIHNvYXBfc3NsX2FjY2VwdCgpIiwgU09BUF9TU0xfRVJST1IpOworICBpZiAoIXNvYXAtPmN0eCAmJiAoc29hcC0+ZXJyb3IgPSBzb2FwLT5mc3NsYXV0aChzb2FwKSkpCisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIGlmICghc29hcC0+c3NsKQorICB7IHNvYXAtPnNzbCA9IFNTTF9uZXcoc29hcC0+Y3R4KTsKKyAgICBpZiAoIXNvYXAtPnNzbCkKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIlNTTF9uZXcoKSBmYWlsZWQgaW4gc29hcF9zc2xfYWNjZXB0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgIH0KKyAgZWxzZQorICAgIFNTTF9jbGVhcihzb2FwLT5zc2wpOworICBzb2FwLT5pbW9kZSB8PSBTT0FQX0VOQ19TU0w7CisgIHNvYXAtPm9tb2RlIHw9IFNPQVBfRU5DX1NTTDsKKyNpZiBkZWZpbmVkKFdJTjMyKQorICB7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRklPTkJJTywgJm5vbmJsb2NraW5nKTsKKyAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICB7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgaW9jdGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRklPTkJJTywgKGludCkmbm9uYmxvY2tpbmcpOworICB9CisjZWxzZQorICBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGX0dFVEZMKXxPX05PTkJMT0NLKTsKKyNlbmRpZgorICBiaW8gPSBCSU9fbmV3X3NvY2tldCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBCSU9fTk9DTE9TRSk7CisgIFNTTF9zZXRfYmlvKHNvYXAtPnNzbCwgYmlvLCBiaW8pOworICBpID0gMTAwOyAvKiAxMDAgKiAwLjEgbXMgcmV0cmllcyAqLworICB3aGlsZSAoKHIgPSBTU0xfYWNjZXB0KHNvYXAtPnNzbCkpIDw9IDApCisgIHsgaW50IGVyciA9IFNTTF9nZXRfZXJyb3Ioc29hcC0+c3NsLCByKTsKKyAgICBpZiAoZXJyID09IFNTTF9FUlJPUl9XQU5UX1JFQUQgfHwgZXJyID09IFNTTF9FUlJPUl9XQU5UX1dSSVRFKQorICAgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgIGZkX3NldCBmZDsKKyAgICAgIGlmIChpLS0gPD0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICB0aW1lb3V0LnR2X3NlYyA9IDA7CisgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAxMDAwMDA7CisgICAgICBGRF9aRVJPKCZmZCk7CisgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJmZkKTsKKyAgICAgIHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgJmZkLCBOVUxMLCAmZmQsICZ0aW1lb3V0KTsKKyAgICAgIGlmIChyIDwgMCAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSKQorICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgcmV0dXJuIFNPQVBfRU9GOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeyBzb2FwLT5lcnJudW0gPSBlcnI7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyNpZiBkZWZpbmVkKFdJTjMyKQorICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRklPTkJJTywgJmJsb2NraW5nKTsKKyAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgaW9jdGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRklPTkJJTywgKGludCkmYmxvY2tpbmcpOworICB9CisjZWxzZQorICBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGX0dFVEZMKSZ+T19OT05CTE9DSyk7CisjZW5kaWYKKyAgaWYgKHIgPD0gMCkKKyAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCBzc2xfZXJyb3Ioc29hcCwgciksICJTU0xfYWNjZXB0KCkgZmFpbGVkIGluIHNvYXBfc3NsX2FjY2VwdCgpIiwgU09BUF9TU0xfRVJST1IpOworICAgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgIHJldHVybiBTT0FQX1NTTF9FUlJPUjsKKyAgfQorICBpZiAoc29hcC0+cmVxdWlyZV9jbGllbnRfYXV0aCkKKyAgeyBYNTA5ICpwZWVyOworICAgIGludCBlcnI7CisgICAgaWYgKChlcnIgPSBTU0xfZ2V0X3ZlcmlmeV9yZXN1bHQoc29hcC0+c3NsKSkgIT0gWDUwOV9WX09LKQorICAgIHsgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICByZXR1cm4gc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIFg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKGVyciksICJTU0wgY2VydGlmaWNhdGUgcHJlc2VudGVkIGJ5IHBlZXIgY2Fubm90IGJlIHZlcmlmaWVkIGluIHNvYXBfc3NsX2FjY2VwdCgpIiwgU09BUF9TU0xfRVJST1IpOworICAgIH0KKyAgICBwZWVyID0gU1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKHNvYXAtPnNzbCk7CisgICAgaWYgKCFwZWVyKQorICAgIHsgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICByZXR1cm4gc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiTm8gU1NMIGNlcnRpZmljYXRlIHdhcyBwcmVzZW50ZWQgYnkgdGhlIHBlZXIgaW4gc29hcF9zc2xfYWNjZXB0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgfQorICAgIFg1MDlfZnJlZShwZWVyKTsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2VuZGlmIC8qIFdJVEhfT1BFTlNTTCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Cit0Y3BfaW5pdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+ZXJybW9kZSA9IDE7CisjaWZkZWYgV0lOMzIKKyAgaWYgKHRjcF9kb25lKQorICAgIHJldHVybiAwOworICBlbHNlCisgIHsgV1NBREFUQSB3OworICAgIGlmIChXU0FTdGFydHVwKE1BS0VXT1JEKDEsIDEpLCAmdykpCisgICAgICByZXR1cm4gLTE7CisgICAgdGNwX2RvbmUgPSAxOworICB9CisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZG9uZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgCisjaWZkZWYgU09BUF9ERUJVRworICBpbnQgaTsKKyNlbmRpZgorICBpZiAoc29hcF9jaGVja19zdGF0ZShzb2FwKSkKKyAgICByZXR1cm47CisgIHNvYXBfZnJlZShzb2FwKTsKKyAgd2hpbGUgKHNvYXAtPmNsaXN0KQorICB7IHN0cnVjdCBzb2FwX2NsaXN0ICpwID0gc29hcC0+Y2xpc3QtPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPmNsaXN0KTsKKyAgICBzb2FwLT5jbGlzdCA9IHA7CisgIH0KKyAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7IC8qIHRvIGZvcmNlIGNsb3NlIHRoZSBzb2NrZXQgKi8KKyAgc29hcF9jbG9zZXNvY2soc29hcCk7CisjaWZkZWYgV0lUSF9DT09LSUVTCisgIHNvYXBfZnJlZV9jb29raWVzKHNvYXApOworI2VuZGlmCisgIHdoaWxlIChzb2FwLT5wbHVnaW5zKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BsdWdpbiAqcCA9IHNvYXAtPnBsdWdpbnMtPm5leHQ7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZW1vdmluZyBwbHVnaW4gJyVzJ1xuIiwgc29hcC0+cGx1Z2lucy0+aWQpKTsKKyAgICBpZiAoc29hcC0+cGx1Z2lucy0+ZmNvcHkgfHwgc29hcC0+c3RhdGUgPT0gU09BUF9JTklUKQorICAgICAgc29hcC0+cGx1Z2lucy0+ZmRlbGV0ZShzb2FwLCBzb2FwLT5wbHVnaW5zKTsKKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+cGx1Z2lucyk7CisgICAgc29hcC0+cGx1Z2lucyA9IHA7CisgIH0KKyAgc29hcC0+ZnBsdWdpbiA9IGZwbHVnaW47CisjaWZuZGVmIFdJVEhfTk9IVFRQCisgIHNvYXAtPmZwb3N0ID0gaHR0cF9wb3N0OworICBzb2FwLT5mZ2V0ID0gaHR0cF9nZXQ7CisgIHNvYXAtPmZmb3JtID0gTlVMTDsKKyAgc29hcC0+ZnBvc3RoZHIgPSBodHRwX3Bvc3RfaGVhZGVyOworICBzb2FwLT5mcmVzcG9uc2UgPSBodHRwX3Jlc3BvbnNlOworICBzb2FwLT5mcGFyc2UgPSBodHRwX3BhcnNlOworICBzb2FwLT5mcGFyc2VoZHIgPSBodHRwX3BhcnNlX2hlYWRlcjsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9JUFY2CisgIHNvYXAtPmZyZXNvbHZlID0gdGNwX2dldGhvc3Q7CisjZWxzZQorICBzb2FwLT5mcmVzb2x2ZSA9IE5VTEw7CisjZW5kaWYKKyAgc29hcC0+ZmFjY2VwdCA9IHRjcF9hY2NlcHQ7CisgIHNvYXAtPmZvcGVuID0gdGNwX2Nvbm5lY3Q7CisgIHNvYXAtPmZjbG9zZSA9IHRjcF9kaXNjb25uZWN0OworICBzb2FwLT5mY2xvc2Vzb2NrZXQgPSB0Y3BfY2xvc2Vzb2NrZXQ7CisgIHNvYXAtPmZzaHV0ZG93bnNvY2tldCA9IHRjcF9zaHV0ZG93bnNvY2tldDsKKyAgc29hcC0+ZnNlbmQgPSBmc2VuZDsKKyAgc29hcC0+ZnJlY3YgPSBmcmVjdjsKKyAgc29hcC0+ZnBvbGwgPSBzb2FwX3BvbGw7CisjZWxzZQorICBzb2FwLT5mb3BlbiA9IE5VTEw7CisgIHNvYXAtPmZjbG9zZSA9IE5VTEw7CisgIHNvYXAtPmZwb2xsID0gTlVMTDsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzb2FwLT5mcHJlcGFyZWluaXQgPSBOVUxMOworICBzb2FwLT5mcHJlcGFyZXNlbmQgPSBOVUxMOworICBzb2FwLT5mcHJlcGFyZXJlY3YgPSBOVUxMOworICBzb2FwLT5mcHJlcGFyZWZpbmFsID0gTlVMTDsKKyNlbmRpZgorICBzb2FwLT5mc2V0ZXJyb3IgPSBOVUxMOworICBzb2FwLT5maWdub3JlID0gTlVMTDsKKyAgc29hcC0+ZnNlcnZlbG9vcCA9IE5VTEw7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgIGlmIChzb2FwLT5zZXNzaW9uKQorICB7IFNTTF9TRVNTSU9OX2ZyZWUoc29hcC0+c2Vzc2lvbik7CisgICAgc29hcC0+c2Vzc2lvbiA9IE5VTEw7CisgIH0KKyNlbmRpZgorICBpZiAoc29hcC0+c3RhdGUgPT0gU09BUF9JTklUKQorICB7IGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpKQorICAgIHsgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIpOworICAgICAgc29hcC0+bWFzdGVyID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgICAgaWYgKHNvYXAtPmN0eCkKKyAgICB7IFNTTF9DVFhfZnJlZShzb2FwLT5jdHgpOworICAgICAgc29hcC0+Y3R4ID0gTlVMTDsKKyAgICB9CisjZW5kaWYKKyAgfQorI2lmZGVmIFNPQVBfREVCVUcKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIGxvZ2ZpbGVzXG4iKSk7CisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX01BWExPR1M7IGkrKykKKyAgeyBpZiAoc29hcC0+bG9nZmlsZVtpXSkKKyAgICB7IFNPQVBfRlJFRShzb2FwLCAodm9pZCopc29hcC0+bG9nZmlsZVtpXSk7CisgICAgICBzb2FwLT5sb2dmaWxlW2ldID0gTlVMTDsKKyAgICB9CisgICAgc29hcF9jbG9zZV9sb2dmaWxlKHNvYXAsIGkpOworICB9CisgIHNvYXBfZnJlZV9taHQoc29hcCk7CisgIHNvYXAtPnN0YXRlID0gMDsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfY2xlYW51cChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcF9kb25lKHNvYXApOworI2lmZGVmIFdJTjMyCisgIGlmICghdGNwX2RvbmUpCisgICAgcmV0dXJuOworICB0Y3BfZG9uZSA9IDA7CisgIFdTQUNsZWFudXAoKTsKKyNlbmRpZgorfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNvbnN0IGNoYXIqCit0Y3BfZXJyb3Ioc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKm1zZyA9IE5VTEw7CisgIHN3aXRjaCAoc29hcC0+ZXJybW9kZSkKKyAgeyBjYXNlIDA6CisgICAgICBtc2cgPSBzb2FwX3N0cmVycm9yKHNvYXApOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgbXNnID0gIldTQVN0YXJ0dXAgZmFpbGVkIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICB7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgbXNnID0gc29hcF9zdHJfY29kZShoX2Vycm9yX2NvZGVzLCBzb2FwLT5lcnJudW0pOworICAgICAgaWYgKCFtc2cpCisjZW5kaWYKKyAgICAgIHsgc3ByaW50Zihzb2FwLT5tc2didWYsICJUQ1AvVURQIElQIGVycm9yICVkIiwgc29hcC0+ZXJybnVtKTsKKyAgICAgICAgbXNnID0gc29hcC0+bXNnYnVmOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gbXNnOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY29uc3QgY2hhcioKK2h0dHBfZXJyb3Ioc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdGF0dXMpCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKm1zZyA9IFNPQVBfU1RSX0VPUzsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIG1zZyA9IHNvYXBfc3RyX2NvZGUoaF9odHRwX2Vycm9yX2NvZGVzLCBzdGF0dXMpOworICBpZiAoIW1zZykKKyAgICBtc2cgPSBTT0FQX1NUUl9FT1M7CisjZW5kaWYKKyAgcmV0dXJuIG1zZzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfSVBWNgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Cit0Y3BfZ2V0aG9zdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqYWRkciwgc3RydWN0IGluX2FkZHIgKmluYWRkcikKK3sgc29hcF9pbnQzMiBpYWRkID0gLTE7CisgIHN0cnVjdCBob3N0ZW50IGhvc3RlbnQsICpob3N0ID0gJmhvc3RlbnQ7CisjaWZkZWYgVlhXT1JLUworICBpbnQgaG9zdGludDsKKyAgLyogaW5ldF9hZGRyKCksIGFuZCBob3N0R2V0QnlOYW1lKCkgZXhwZWN0ICJjaGFyICoiOyBhZGRyIGlzIGEgImNvbnN0IGNoYXIgKiIuICovCisgIGlhZGQgPSBpbmV0X2FkZHIoKGNoYXIqKWFkZHIpOworI2Vsc2UKKyNpZiBkZWZpbmVkKF9BSVhWRVJTSU9OXzQzMSkgfHwgZGVmaW5lZChUUlU2NCkKKyAgc3RydWN0IGhvc3RlbnRfZGF0YSBodF9kYXRhOworI2VuZGlmCisjaWZkZWYgQVM0MDAKKyAgaWFkZCA9IGluZXRfYWRkcigodm9pZCopYWRkcik7CisjZWxzZQorICBpYWRkID0gaW5ldF9hZGRyKGFkZHIpOworI2VuZGlmCisjZW5kaWYKKyAgaWYgKGlhZGQgIT0gLTEpCisgIHsgbWVtY3B5KGluYWRkciwgJmlhZGQsIHNpemVvZihpYWRkKSk7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNpZiBkZWZpbmVkKF9fR0xJQkNfXykKKyAgaWYgKGdldGhvc3RieW5hbWVfcihhZGRyLCAmaG9zdGVudCwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTiwgJmhvc3QsICZzb2FwLT5lcnJudW0pIDwgMCkKKyAgICBob3N0ID0gTlVMTDsKKyNlbGlmIGRlZmluZWQoX0FJWFZFUlNJT05fNDMxKSB8fCBkZWZpbmVkKFRSVTY0KQorICBtZW1zZXQoKHZvaWQqKSZodF9kYXRhLCAwLCBzaXplb2YoaHRfZGF0YSkpOworICBpZiAoZ2V0aG9zdGJ5bmFtZV9yKGFkZHIsICZob3N0ZW50LCAmaHRfZGF0YSkgPCAwKQorICB7IGhvc3QgPSBOVUxMOworICAgIHNvYXAtPmVycm51bSA9IGhfZXJybm87CisgIH0KKyNlbGlmIGRlZmluZWQoSEFWRV9HRVRIT1NUQllOQU1FX1IpCisgIGhvc3QgPSBnZXRob3N0YnluYW1lX3IoYWRkciwgJmhvc3RlbnQsIHNvYXAtPmJ1ZiwgU09BUF9CVUZMRU4sICZzb2FwLT5lcnJudW0pOworI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICAvKiBJZiB0aGUgRE5TIHJlc29sdmVyIGxpYnJhcnkgcmVzb2x2TGliIGhhcyBiZWVuIGNvbmZpZ3VyZWQgaW4gdGhlIHZ4V29ya3MKKyAgICogaW1hZ2UsIGEgcXVlcnkgZm9yIHRoZSBob3N0IElQIGFkZHJlc3MgaXMgc2VudCB0byB0aGUgRE5TIHNlcnZlciwgaWYgdGhlCisgICAqIG5hbWUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgbG9jYWwgaG9zdCB0YWJsZS4gKi8KKyAgaG9zdGludCA9IGhvc3RHZXRCeU5hbWUoKGNoYXIqKWFkZHIpOworICBpZiAoaG9zdGludCA9PSBFUlJPUikKKyAgeyBob3N0ID0gTlVMTDsKKyAgICBzb2FwLT5lcnJudW0gPSBzb2FwX2Vycm5vOyAKKyAgfQorI2Vsc2UKKyNpZmRlZiBBUzQwMAorICBpZiAoIShob3N0ID0gZ2V0aG9zdGJ5bmFtZSgodm9pZCopYWRkcikpKQorICAgIHNvYXAtPmVycm51bSA9IGhfZXJybm87CisjZWxzZQorICBpZiAoIShob3N0ID0gZ2V0aG9zdGJ5bmFtZShhZGRyKSkpCisgICAgc29hcC0+ZXJybnVtID0gaF9lcnJubzsKKyNlbmRpZgorI2VuZGlmCisgIGlmICghaG9zdCkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkhvc3QgbmFtZSBub3QgZm91bmRcbiIpKTsKKyAgICByZXR1cm4gU09BUF9FUlI7CisgIH0KKyNpZmRlZiBWWFdPUktTCisgIGluYWRkci0+c19hZGRyID0gaG9zdGludDsKKyNlbHNlCisgIG1lbWNweShpbmFkZHIsIGhvc3QtPmhfYWRkciwgaG9zdC0+aF9sZW5ndGgpOworI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Cit0Y3BfY29ubmVjdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZW5kcG9pbnQsIGNvbnN0IGNoYXIgKmhvc3QsIGludCBwb3J0KQoreworI2lmZGVmIFdJVEhfSVBWNgorICBzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpyZXMsICpyZXNzYXZlOworICBpbnQgZXJyOworI2VuZGlmCisgIHJlZ2lzdGVyIGludCBmZDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGludCBsZW4gPSBTT0FQX0JVRkxFTjsKKyAgaW50IHNldCA9IDE7CisjZW5kaWYKKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQpOworICBzb2FwLT5zb2NrZXQgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICBpZiAodGNwX2luaXQoc29hcCkpCisgIHsgc29hcC0+ZXJybnVtID0gMDsKKyAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiVENQIGluaXQgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgc29hcC0+ZXJybW9kZSA9IDA7CisjaWZkZWYgV0lUSF9JUFY2CisgIG1lbXNldCgodm9pZCopJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKyAgaGludHMuYWlfZmFtaWx5ID0gUEZfVU5TUEVDOworI2lmZGVmIFdJVEhfVURQCisgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX0RHUkFNOworICBlbHNlCisjZW5kaWYKKyAgICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworICBzb2FwLT5lcnJtb2RlID0gMjsKKyAgaWYgKHNvYXAtPnByb3h5X2hvc3QpCisgICAgZXJyID0gZ2V0YWRkcmluZm8oc29hcC0+cHJveHlfaG9zdCwgc29hcF9pbnQycyhzb2FwLCBzb2FwLT5wcm94eV9wb3J0KSwgJmhpbnRzLCAmcmVzKTsKKyAgZWxzZQorICAgIGVyciA9IGdldGFkZHJpbmZvKGhvc3QsIHNvYXBfaW50MnMoc29hcCwgcG9ydCksICZoaW50cywgJnJlcyk7CisgIGlmIChlcnIpCisgIHsgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIGdhaV9zdHJlcnJvcihlcnIpLCAiZ2V0YWRkcmluZm8gZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgcmVzc2F2ZSA9IHJlczsKK2FnYWluOgorICBmZCA9IChpbnQpc29ja2V0KHJlcy0+YWlfZmFtaWx5LCByZXMtPmFpX3NvY2t0eXBlLCByZXMtPmFpX3Byb3RvY29sKTsKKyAgc29hcC0+ZXJybW9kZSA9IDA7CisjZWxzZQorI2lmZGVmIFdJVEhfVURQCisgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgZmQgPSAoaW50KXNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKyAgZWxzZQorI2VuZGlmCisgICAgZmQgPSAoaW50KXNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisjZW5kaWYKKyAgaWYgKGZkIDwgMCkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic29ja2V0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisjaWZkZWYgU09DS0VUX0NMT1NFX09OX0VYRUMKKyNpZmRlZiBXSU4zMgorI2lmbmRlZiBVTkRFUl9DRQorICBTZXRIYW5kbGVJbmZvcm1hdGlvbigoSEFORExFKWZkLCBIQU5ETEVfRkxBR19JTkhFUklULCAwKTsKKyNlbmRpZgorI2Vsc2UKKyAgZmNudGwoZmQsIEZfU0VURkQsIDEpOworI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5jb25uZWN0X2ZsYWdzICYgU09fTElOR0VSKQorICB7IHN0cnVjdCBsaW5nZXIgbGluZ2VyOworICAgIG1lbXNldCgodm9pZCopJmxpbmdlciwgMCwgc2l6ZW9mKGxpbmdlcikpOworICAgIGxpbmdlci5sX29ub2ZmID0gMTsKKyAgICBsaW5nZXIubF9saW5nZXIgPSAwOworICAgIGlmIChzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClmZCwgU09MX1NPQ0tFVCwgU09fTElOR0VSLCAoY2hhciopJmxpbmdlciwgc2l6ZW9mKHN0cnVjdCBsaW5nZXIpKSkKKyAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fTElOR0VSIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisgIH0KKyAgaWYgKChzb2FwLT5jb25uZWN0X2ZsYWdzICYgflNPX0xJTkdFUikgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpZmQsIFNPTF9TT0NLRVQsIHNvYXAtPmNvbm5lY3RfZmxhZ3MgJiB+U09fTElOR0VSLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIGlmIChzb2FwLT5rZWVwX2FsaXZlICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKWZkLCBTT0xfU09DS0VULCBTT19LRUVQQUxJVkUsIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fS0VFUEFMSVZFIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIGlmIChzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClmZCwgU09MX1NPQ0tFVCwgU09fU05EQlVGLCAoY2hhciopJmxlbiwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX1NOREJVRiBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpZmQsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgKGNoYXIqKSZsZW4sIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19SQ1ZCVUYgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNpZmRlZiBUQ1BfTk9ERUxBWQorICBpZiAoIShzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClmZCwgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFRDUF9OT0RFTEFZIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisjZW5kaWYKKyNlbmRpZgorICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiT3BlbmluZyBzb2NrZXQgJWQgdG8gaG9zdD0nJXMnIHBvcnQ9JWRcbiIsIGZkLCBob3N0LCBwb3J0KSk7CisjaWZuZGVmIFdJVEhfSVBWNgorICBzb2FwLT5wZWVybGVuID0gc2l6ZW9mKHNvYXAtPnBlZXIpOworICBtZW1zZXQoKHZvaWQqKSZzb2FwLT5wZWVyLCAwLCBzaXplb2Yoc29hcC0+cGVlcikpOworICBzb2FwLT5wZWVyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICBzb2FwLT5lcnJtb2RlID0gMjsKKyAgaWYgKHNvYXAtPnByb3h5X2hvc3QpCisgIHsgaWYgKHNvYXAtPmZyZXNvbHZlKHNvYXAsIHNvYXAtPnByb3h5X2hvc3QsICZzb2FwLT5wZWVyLnNpbl9hZGRyKSkKKyAgICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJnZXQgcHJveHkgaG9zdCBieSBuYW1lIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisgICAgc29hcC0+cGVlci5zaW5fcG9ydCA9IGh0b25zKChzaG9ydClzb2FwLT5wcm94eV9wb3J0KTsKKyAgfQorICBlbHNlCisgIHsgaWYgKHNvYXAtPmZyZXNvbHZlKHNvYXAsIGhvc3QsICZzb2FwLT5wZWVyLnNpbl9hZGRyKSkKKyAgICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJnZXQgaG9zdCBieSBuYW1lIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisgICAgc29hcC0+cGVlci5zaW5fcG9ydCA9IGh0b25zKChzaG9ydClwb3J0KTsKKyAgfQorICBzb2FwLT5lcnJtb2RlID0gMDsKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICByZXR1cm4gZmQ7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQpCisjaWYgZGVmaW5lZChXSU4zMikKKyAgeyB1X2xvbmcgbm9uYmxvY2tpbmcgPSAxOworICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgJm5vbmJsb2NraW5nKTsKKyAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICB7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgaW9jdGwoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAoaW50KSgmbm9uYmxvY2tpbmcpKTsgLyogbW9kaWZpZWQgdG8gdXNlIGZkICovCisgIH0KKyNlbHNlCisgICAgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfR0VURkwpfE9fTk9OQkxPQ0spOworI2VuZGlmCisgIGVsc2UKKyNpZiBkZWZpbmVkKFdJTjMyKQorICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAmYmxvY2tpbmcpOworICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICBpb2N0bCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sIChpbnQpKCZibG9ja2luZykpOworICB9CisjZWxzZQorICAgIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX0dFVEZMKSZ+T19OT05CTE9DSyk7CisjZW5kaWYKKyNlbmRpZgorICBmb3IgKDs7KQorICB7IAorI2lmZGVmIFdJVEhfSVBWNgorICAgIGlmIChjb25uZWN0KChTT0FQX1NPQ0tFVClmZCwgcmVzLT5haV9hZGRyLCByZXMtPmFpX2FkZHJsZW4pKQorI2Vsc2UKKyAgICBpZiAoY29ubmVjdCgoU09BUF9TT0NLRVQpZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyLCBzaXplb2Yoc29hcC0+cGVlcikpKQorI2VuZGlmCisgICAgeyAKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0ICYmIChzb2FwX3NvY2tldF9lcnJubyA9PSBTT0FQX0VJTlBST0dSRVNTIHx8IHNvYXBfc29ja2V0X2Vycm5vID09IFNPQVBfRVdPVUxEQkxPQ0spKQorICAgICAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgICAgICBTT0FQX1NPQ0tMRU5fVCBrOworICAgICAgICBmZF9zZXQgZmRzOworICAgICAgICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0ID4gMCkKKyAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IHNvYXAtPmNvbm5lY3RfdGltZW91dDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IC1zb2FwLT5jb25uZWN0X3RpbWVvdXQvMTAwMDAwMDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAtc29hcC0+Y29ubmVjdF90aW1lb3V0JTEwMDAwMDA7CisgICAgICAgIH0KKyAgICAgICAgRkRfWkVSTygmZmRzKTsKKyAgICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClmZCwgJmZkcyk7CisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsgaW50IHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShmZCArIDEpLCBOVUxMLCAmZmRzLCBOVUxMLCAmdGltZW91dCk7CisgICAgICAgICAgaWYgKHIgPiAwKQorCSAgICBicmVhazsKKyAgICAgICAgICBpZiAoIXIpCisgICAgICAgICAgeyBzb2FwLT5lcnJudW0gPSAwOworICAgICAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb25uZWN0IHRpbWVvdXRcbiIpKTsKKyAgICAgICAgICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCAiVGltZW91dCIsICJjb25uZWN0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIpCisgICAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IGNvbm5lY3QgdG8gaG9zdFxuIikpOworICAgICAgICAgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImNvbm5lY3QgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICAgIH0KKyAgICAgICAgfQorCWsgPSAoU09BUF9TT0NLTEVOX1Qpc2l6ZW9mKHNvYXAtPmVycm51bSk7CisgICAgICAgIGlmICghZ2V0c29ja29wdCgoU09BUF9TT0NLRVQpZmQsIFNPTF9TT0NLRVQsIFNPX0VSUk9SLCAoY2hhciopJnNvYXAtPmVycm51bSwgJmspICYmICFzb2FwLT5lcnJudW0pCS8qIHBvcnRhYmlsaXR5IG5vdGU6IHNlZSBTT0FQX1NPQ0tMRU5fVCBkZWZpbml0aW9uIGluIHN0ZHNvYXAyLmggKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgY29ubmVjdCB0byBob3N0XG4iKSk7CisgICAgICAgIHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiY29ubmVjdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgICAgZWxzZQorI2VuZGlmCisjaWZkZWYgV0lUSF9JUFY2CisgICAgICBpZiAocmVzLT5haV9uZXh0KQorICAgICAgeyByZXMgPSByZXMtPmFpX25leHQ7CisgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICBnb3RvIGFnYWluOworICAgICAgfQorICAgICAgZWxzZQorI2VuZGlmCisgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUikKKyAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IGNvbm5lY3QgdG8gaG9zdFxuIikpOworICAgICAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiY29ubmVjdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgIH0gIAorICAgIGVsc2UKKyAgICAgIGJyZWFrOworICB9CisjaWZkZWYgV0lUSF9JUFY2CisgIHNvYXAtPnBlZXJsZW4gPSAwOyAvKiBJUHY2OiBhbHJlYWR5IGNvbm5lY3RlZCBzbyB1c2Ugc2VuZCgpICovCisgIGZyZWVhZGRyaW5mbyhyZXNzYXZlKTsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPmNvbm5lY3RfdGltZW91dCkKKyNpZiBkZWZpbmVkKFdJTjMyKQorICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAmYmxvY2tpbmcpOworICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICBpb2N0bCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sIChpbnQpKCZibG9ja2luZykpOworICB9CisjZWxzZQorICAgIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX0dFVEZMKSZ+T19OT05CTE9DSyk7CisjZW5kaWYKKyNlbmRpZgorICBzb2FwLT5zb2NrZXQgPSBmZDsKKyAgc29hcC0+aW1vZGUgJj0gflNPQVBfRU5DX1NTTDsKKyAgc29hcC0+b21vZGUgJj0gflNPQVBfRU5DX1NTTDsKKyAgaWYgKCFzdHJuY21wKGVuZHBvaW50LCAiaHR0cHM6IiwgNikpCisgIHsKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICBCSU8gKmJpbzsKKyAgICBpbnQgcjsKKyAgICBpZiAoc29hcC0+cHJveHlfaG9zdCkKKyAgICB7IHNob3J0IHY7CisgICAgICB1bnNpZ25lZCBpbnQgayA9IHNvYXAtPm9tb2RlOyAvKiBtYWtlIHN1cmUgd2Ugb25seSBwYXJzZSBIVFRQICovCisgICAgICBzaXplX3QgbiA9IHNvYXAtPmNvdW50OyAvKiBzYXZlIHRoZSBjb250ZW50IGxlbmd0aCAqLworICAgICAgY2hhciAqdXNlcmlkLCAqcGFzc3dkOworICAgICAgc29hcC0+b21vZGUgJj0gflNPQVBfRU5DOyAvKiBtYXNrIElPIGFuZCBFTkMgKi8KKyAgICAgIHNvYXAtPm9tb2RlIHw9IFNPQVBfSU9fQlVGRkVSOworICAgICAgc29hcF9iZWdpbl9zZW5kKHNvYXApOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb25uZWN0aW5nIHRvIHByb3h5IHNlcnZlclxuIikpOworICAgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICJDT05ORUNUICVzOiVkIEhUVFAvJXMiLCBob3N0LCBwb3J0LCBzb2FwLT5odHRwX3ZlcnNpb24pOworICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgTlVMTCkpKQorICAgICAgeyBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgaWYgKHNvYXAtPnByb3h5X3VzZXJpZCAmJiBzb2FwLT5wcm94eV9wYXNzd2QgJiYgc3RybGVuKHNvYXAtPnByb3h5X3VzZXJpZCkgKyBzdHJsZW4oc29hcC0+cHJveHlfcGFzc3dkKSA8IDc2MSkKKyAgICAgIHsgc3ByaW50Zihzb2FwLT50bXBidWYgKyAyNjIsICIlczolcyIsIHNvYXAtPnByb3h5X3VzZXJpZCwgc29hcC0+cHJveHlfcGFzc3dkKTsKKyAgICAgICAgc3RyY3B5KHNvYXAtPnRtcGJ1ZiwgIkJhc2ljICIpOworICAgICAgICBzb2FwX3MyYmFzZTY0KHNvYXAsIChjb25zdCB1bnNpZ25lZCBjaGFyKikoc29hcC0+dG1wYnVmICsgMjYyKSwgc29hcC0+dG1wYnVmICsgNiwgc3RybGVuKHNvYXAtPnRtcGJ1ZiArIDI2MikpOworICAgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlByb3h5LUF1dGhvcml6YXRpb24iLCBzb2FwLT50bXBidWYpKSkKKyAgICAgICAgeyBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKyNlbmRpZgorICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsIE5VTEwsIE5VTEwpKQorICAgICAgIHx8IHNvYXBfZmx1c2goc29hcCkpCisgICAgICB7IHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyAgICAgIHNvYXAtPm9tb2RlID0gazsKKyAgICAgIGsgPSBzb2FwLT5pbW9kZTsKKyAgICAgIHNvYXAtPmltb2RlICY9IH5TT0FQX0VOQzsgLyogbWFzayBJTyBhbmQgRU5DICovCisgICAgICB2ID0gc29hcC0+dmVyc2lvbjsgLyogcHJlc2VydmUgKi8KKyAgICAgIHVzZXJpZCA9IHNvYXAtPnVzZXJpZDsgLyogcHJlc2VydmUgKi8KKyAgICAgIHBhc3N3ZCA9IHNvYXAtPnBhc3N3ZDsgLyogcHJlc2VydmUgKi8KKyAgICAgIGlmIChzb2FwX2JlZ2luX3JlY3Yoc29hcCkpCisgICAgICB7IHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyAgICAgIHNvYXAtPnVzZXJpZCA9IHVzZXJpZDsgLyogcmVzdG9yZSAqLworICAgICAgc29hcC0+cGFzc3dkID0gcGFzc3dkOyAvKiByZXN0b3JlICovCisgICAgICBzb2FwLT52ZXJzaW9uID0gdjsgLyogcmVzdG9yZSAqLworICAgICAgc29hcC0+aW1vZGUgPSBrOyAvKiByZXN0b3JlICovCisgICAgICBzb2FwLT5jb3VudCA9IG47IC8qIHJlc3RvcmUgKi8KKyAgICAgIHNvYXBfYmVnaW5fc2VuZChzb2FwKTsKKyAgICB9CisgICAgaWYgKCFzb2FwLT5jdHggJiYgKHNvYXAtPmVycm9yID0gc29hcC0+ZnNzbGF1dGgoc29hcCkpKQorICAgIHsgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiU1NMIGF1dGhlbnRpY2F0aW9uIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpOiBjaGVjayBwYXNzd29yZCwga2V5IGZpbGUsIGFuZCBjYSBmaWxlLiIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorICAgIHNvYXAtPnNzbCA9IFNTTF9uZXcoc29hcC0+Y3R4KTsKKyAgICBpZiAoIXNvYXAtPnNzbCkKKyAgICB7IHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1NTTF9FUlJPUjsKKyAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgIH0KKyAgICBpZiAoc29hcC0+c2Vzc2lvbikKKyAgICB7IGlmICghc3RyY21wKHNvYXAtPnNlc3Npb25faG9zdCwgaG9zdCkgJiYgc29hcC0+c2Vzc2lvbl9wb3J0ID09IHBvcnQpCisgICAgICAgIFNTTF9zZXRfc2Vzc2lvbihzb2FwLT5zc2wsIHNvYXAtPnNlc3Npb24pOworICAgICAgU1NMX1NFU1NJT05fZnJlZShzb2FwLT5zZXNzaW9uKTsKKyAgICAgIHNvYXAtPnNlc3Npb24gPSBOVUxMOworICAgIH0KKyAgICBzb2FwLT5pbW9kZSB8PSBTT0FQX0VOQ19TU0w7CisgICAgc29hcC0+b21vZGUgfD0gU09BUF9FTkNfU1NMOworICAgIGJpbyA9IEJJT19uZXdfc29ja2V0KChTT0FQX1NPQ0tFVClmZCwgQklPX05PQ0xPU0UpOworICAgIFNTTF9zZXRfYmlvKHNvYXAtPnNzbCwgYmlvLCBiaW8pOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0KQorI2lmIGRlZmluZWQoV0lOMzIpCisgICAgeyB1X2xvbmcgbm9uYmxvY2tpbmcgPSAxOworICAgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAmbm9uYmxvY2tpbmcpOworICAgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgICB7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgICBpb2N0bCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sIChpbnQpKCZub25ibG9ja2luZykpOworICAgIH0KKyNlbHNlCisgICAgICBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9HRVRGTCl8T19OT05CTE9DSyk7CisjZW5kaWYKKyNlbmRpZgorICAgIGZvciAoOzspCisgICAgeyBpZiAoKHIgPSBTU0xfY29ubmVjdChzb2FwLT5zc2wpKSA8PSAwKQorICAgICAgeyBpbnQgZXJyID0gU1NMX2dldF9lcnJvcihzb2FwLT5zc2wsIHIpOworICAgICAgICBpZiAoZXJyICE9IFNTTF9FUlJPUl9OT05FICYmIGVyciAhPSBTU0xfRVJST1JfV0FOVF9SRUFEICYmIGVyciAhPSBTU0xfRVJST1JfV0FOVF9XUklURSkKKyAgICAgICAgeyBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgc3NsX2Vycm9yKHNvYXAsIHIpLCAiU1NMIGNvbm5lY3QgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvYXAtPmNvbm5lY3RfdGltZW91dCkKKyAgICAgICAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgICAgICAgIGZkX3NldCBmZHM7CisgICAgICAgICAgaWYgKHNvYXAtPmNvbm5lY3RfdGltZW91dCA+IDApCisgICAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IHNvYXAtPmNvbm5lY3RfdGltZW91dDsKKyAgICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gLXNvYXAtPmNvbm5lY3RfdGltZW91dC8xMDAwMDAwOworICAgICAgICAgICAgdGltZW91dC50dl91c2VjID0gLXNvYXAtPmNvbm5lY3RfdGltZW91dCUxMDAwMDAwOworICAgICAgICAgIH0KKyAgICAgICAgICBGRF9aRVJPKCZmZHMpOworICAgICAgICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpZmQsICZmZHMpOworICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgeyBpbnQgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKGZkICsgMSksICZmZHMsIE5VTEwsICZmZHMsICZ0aW1lb3V0KTsKKyAgICAgICAgICAgIGlmIChyID4gMCkKKwkgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmICghcikKKyAgICAgICAgICAgIHsgc29hcC0+ZXJybnVtID0gMDsKKyAgICAgICAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb25uZWN0IHRpbWVvdXRcbiIpKTsKKyAgICAgICAgICAgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsICJUaW1lb3V0IiwgImNvbm5lY3QgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICAgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisJICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0KQorI2lmZGVmIFdJTjMyCisgICAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAmYmxvY2tpbmcpOworICAgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgICBpb2N0bCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sIChpbnQpKCZibG9ja2luZykpOworICAgIH0KKyNlbHNlCisgICAgICBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9HRVRGTCkmfk9fTk9OQkxPQ0spOworI2VuZGlmCisjZW5kaWYKKyAgICBpZiAoc29hcC0+cmVxdWlyZV9zZXJ2ZXJfYXV0aCkKKyAgICB7IFg1MDkgKnBlZXI7CisgICAgICBpbnQgZXJyOworICAgICAgaWYgKChlcnIgPSBTU0xfZ2V0X3ZlcmlmeV9yZXN1bHQoc29hcC0+c3NsKSkgIT0gWDUwOV9WX09LKQorICAgICAgeyBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgWDUwOV92ZXJpZnlfY2VydF9lcnJvcl9zdHJpbmcoZXJyKSwgIlNTTCBjZXJ0aWZpY2F0ZSBwcmVzZW50ZWQgYnkgcGVlciBjYW5ub3QgYmUgdmVyaWZpZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgICAgcGVlciA9IFNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZShzb2FwLT5zc2wpOworICAgICAgaWYgKCFwZWVyKQorICAgICAgeyBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJObyBTU0wgY2VydGlmaWNhdGUgd2FzIHByZXNlbnRlZCBieSB0aGUgcGVlciBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9TU0xfRVJST1IpOworICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgICBYNTA5X05BTUVfZ2V0X3RleHRfYnlfTklEKFg1MDlfZ2V0X3N1YmplY3RfbmFtZShwZWVyKSwgTklEX2NvbW1vbk5hbWUsIHNvYXAtPm1zZ2J1Ziwgc2l6ZW9mKHNvYXAtPm1zZ2J1ZikpOworICAgICAgWDUwOV9mcmVlKHBlZXIpOworICAgICAgaWYgKHNvYXBfdGFnX2NtcChzb2FwLT5tc2didWYsIGhvc3QpKQorICAgICAgeyBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJTU0wgY2VydGlmaWNhdGUgaG9zdCBuYW1lIG1pc21hdGNoIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgIHNvYXAtPmVycm9yID0gU09BUF9TU0xfRVJST1I7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisjZW5kaWYKKyAgfQorICByZXR1cm4gZmQ7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYmluZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQsIGludCBiYWNrbG9nKQoreworI2lmZGVmIFdJVEhfSVBWNgorICBzdHJ1Y3QgYWRkcmluZm8gKmFkZHJpbmZvID0gTlVMTDsKKyAgc3RydWN0IGFkZHJpbmZvIGhpbnRzOworICBzdHJ1Y3QgYWRkcmluZm8gcmVzOworICBpbnQgZXJyOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpbnQgbGVuID0gU09BUF9CVUZMRU47CisgIGludCBzZXQgPSAxOworI2VuZGlmCisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpKQorICB7IHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyKTsKKyAgICBzb2FwLT5tYXN0ZXIgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIHNvYXAtPnNvY2tldCA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIHNvYXAtPmVycm1vZGUgPSAxOworICBpZiAodGNwX2luaXQoc29hcCkpCisgIHsgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiVENQIGluaXQgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisjaWZkZWYgV0lUSF9JUFY2CisgIG1lbXNldCgodm9pZCopJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKyAgaGludHMuYWlfZmFtaWx5ID0gUEZfVU5TUEVDOworI2lmZGVmIFdJVEhfVURQCisgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX0RHUkFNOworICBlbHNlCisjZW5kaWYKKyAgICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworICBoaW50cy5haV9mbGFncyA9IEFJX1BBU1NJVkU7CisgIHNvYXAtPmVycm1vZGUgPSAyOworICBlcnIgPSBnZXRhZGRyaW5mbyhob3N0LCBzb2FwX2ludDJzKHNvYXAsIHBvcnQpLCAmaGludHMsICZhZGRyaW5mbyk7CisgIGlmIChhZGRyaW5mbykKKyAgeyByZXMgPSAqYWRkcmluZm87CisgICAgc29hcC0+cGVlciA9ICooKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKilhZGRyaW5mby0+YWlfYWRkcik7CisgICAgc29hcC0+cGVlcmxlbiA9IGFkZHJpbmZvLT5haV9hZGRybGVuOworICAgIHJlcy5haV9hZGRyID0gKHN0cnVjdCBzb2NrYWRkciopJnNvYXAtPnBlZXI7CisgICAgcmVzLmFpX2FkZHJsZW4gPSBzb2FwLT5wZWVybGVuOworICAgIGZyZWVhZGRyaW5mbyhhZGRyaW5mbyk7CisgIH0KKyAgaWYgKGVycikKKyAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCBnYWlfc3RyZXJyb3IoZXJyKSwgImdldGFkZHJpbmZvIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBzb2FwLT5tYXN0ZXIgPSBzb2NrZXQocmVzLmFpX2ZhbWlseSwgcmVzLmFpX3NvY2t0eXBlLCByZXMuYWlfcHJvdG9jb2wpOworI2Vsc2UKKyNpZmRlZiBXSVRIX1VEUAorICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIHNvYXAtPm1hc3RlciA9IChpbnQpc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworICBlbHNlCisjZW5kaWYKKyAgICBzb2FwLT5tYXN0ZXIgPSAoaW50KXNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisjZW5kaWYKKyAgc29hcC0+ZXJybW9kZSA9IDA7CisgIGlmICghc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzb2NrZXQgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisjaWZkZWYgV0lUSF9VRFAKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICBzb2FwLT5zb2NrZXQgPSBzb2FwLT5tYXN0ZXI7CisjZW5kaWYKKyNpZmRlZiBTT0NLRVRfQ0xPU0VfT05fRVhFQworI2lmZGVmIFdJTjMyCisjaWZuZGVmIFVOREVSX0NFCisgIFNldEhhbmRsZUluZm9ybWF0aW9uKChIQU5ETEUpc29hcC0+bWFzdGVyLCBIQU5ETEVfRkxBR19JTkhFUklULCAwKTsKKyNlbmRpZgorI2Vsc2UKKyAgZmNudGwoc29hcC0+bWFzdGVyLCBGX1NFVEZELCAxKTsKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+YmluZF9mbGFncyAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIFNPTF9TT0NLRVQsIHNvYXAtPmJpbmRfZmxhZ3MsIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgaWYgKCgoc29hcC0+aW1vZGUgfCBzb2FwLT5vbW9kZSkgJiBTT0FQX0lPX0tFRVBBTElWRSkgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBTT0xfU09DS0VULCBTT19LRUVQQUxJVkUsIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19LRUVQQUxJVkUgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIGlmIChzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwgKGNoYXIqKSZsZW4sIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX1NOREJVRiBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgU09MX1NPQ0tFVCwgU09fUkNWQlVGLCAoY2hhciopJmxlbiwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fUkNWQlVGIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorI2lmZGVmIFRDUF9OT0RFTEFZCisgIGlmICghKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgVENQX05PREVMQVkgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIFdJVEhfSVBWNgorICBzb2FwLT5lcnJtb2RlID0gMDsKKyAgaWYgKGJpbmQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgcmVzLmFpX2FkZHIsIHJlcy5haV9hZGRybGVuKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBiaW5kIHRvIGhvc3RcbiIpKTsKKyAgICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJiaW5kIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfSAgCisjZWxzZQorICBzb2FwLT5wZWVybGVuID0gc2l6ZW9mKHNvYXAtPnBlZXIpOworICBtZW1zZXQoKHZvaWQqKSZzb2FwLT5wZWVyLCAwLCBzaXplb2Yoc29hcC0+cGVlcikpOworICBzb2FwLT5wZWVyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICBzb2FwLT5lcnJtb2RlID0gMjsKKyAgaWYgKGhvc3QpCisgIHsgaWYgKHNvYXAtPmZyZXNvbHZlKHNvYXAsIGhvc3QsICZzb2FwLT5wZWVyLnNpbl9hZGRyKSkKKyAgICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImdldCBob3N0IGJ5IG5hbWUgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorICB9CisgIGVsc2UKKyAgICBzb2FwLT5wZWVyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9BTlkpOworICBzb2FwLT5wZWVyLnNpbl9wb3J0ID0gaHRvbnMoKHNob3J0KXBvcnQpOworICBzb2FwLT5lcnJtb2RlID0gMDsKKyAgaWYgKGJpbmQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgKHN0cnVjdCBzb2NrYWRkciopJnNvYXAtPnBlZXIsIHNvYXAtPnBlZXJsZW4pKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IGJpbmQgdG8gaG9zdFxuIikpOworICAgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImJpbmQgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisjZW5kaWYKKyAgaWYgKCEoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkgJiYgbGlzdGVuKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIGJhY2tsb2cpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IGJpbmQgdG8gaG9zdFxuIikpOworICAgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImxpc3RlbiBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0gIAorICByZXR1cm4gc29hcC0+bWFzdGVyOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3BvbGwoc3RydWN0IHNvYXAgKnNvYXApCit7IAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgZmRfc2V0IHJmZCwgc2ZkLCB4ZmQ7CisgIGludCByOworICB0aW1lb3V0LnR2X3NlYyA9IDA7CisgIHRpbWVvdXQudHZfdXNlYyA9IDA7CisgIEZEX1pFUk8oJnJmZCk7CisgIEZEX1pFUk8oJnNmZCk7CisgIEZEX1pFUk8oJnhmZCk7CisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICB7IEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmcmZkKTsKKyAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnNmZCk7CisgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZ4ZmQpOworICAgIHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgJnJmZCwgJnNmZCwgJnhmZCwgJnRpbWVvdXQpOworICAgIGlmIChyID4gMCAmJiBGRF9JU1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmeGZkKSkKKyAgICAgIHIgPSAtMTsKKyAgfQorICBlbHNlIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpKQorICB7IEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCAmc2ZkKTsKKyAgICByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+bWFzdGVyICsgMSksIE5VTEwsICZzZmQsIE5VTEwsICZ0aW1lb3V0KTsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIGlmIChyID4gMCkKKyAgeworI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgIGlmIChzb2FwLT5pbW9kZSAmIFNPQVBfRU5DX1NTTCkKKyAgICB7CisgICAgICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KQorICAgICAgICYmIEZEX0lTU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZzZmQpCisgICAgICAgJiYgKCFGRF9JU1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmcmZkKQorICAgICAgICB8fCBTU0xfcGVlayhzb2FwLT5zc2wsIHNvYXAtPnRtcGJ1ZiwgMSkgPiAwKSkKKyAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgICAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkKKyAgICAgICAmJiBGRF9JU1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmc2ZkKQorICAgICAgICYmICghRkRfSVNTRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnJmZCkKKyAgICAgICAgfHwgcmVjdigoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzb2FwLT50bXBidWYsIDEsIE1TR19QRUVLKSA+IDApKQorICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICBlbHNlIGlmIChyIDwgMCkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBpZiAoKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikgfHwgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUikKKyAgICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNlbGVjdCBmYWlsZWQgaW4gc29hcF9wb2xsKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1RDUF9FUlJPUjsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIHNvYXAtPmVycm51bSA9IDA7CisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJQb2xsaW5nOiBvdGhlciBlbmQgZG93biBvbiBzb2NrZXQ9JWQgc2VsZWN0PSVkXG4iLCBzb2FwLT5zb2NrZXQsIHIpKTsKKyAgcmV0dXJuIFNPQVBfRU9GOworI2Vsc2UKKyAgcmV0dXJuIFNPQVBfT0s7CisjZW5kaWYKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3RjcF9hY2NlcHQoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzLCBzdHJ1Y3Qgc29ja2FkZHIgKmEsIGludCAqbikKK3sgaW50IGZkOworICBmZCA9IChpbnQpYWNjZXB0KChTT0FQX1NPQ0tFVClzLCBhLCAoU09BUF9TT0NLTEVOX1QqKW4pOwkvKiBwb3J0YWJpbGl0eSBub3RlOiBzZWUgU09BUF9TT0NLTEVOX1QgZGVmaW5pdGlvbiBpbiBzdGRzb2FwMi5oICovCisjaWZkZWYgU09DS0VUX0NMT1NFX09OX0VYRUMKKyNpZmRlZiBXSU4zMgorI2lmbmRlZiBVTkRFUl9DRQorICBTZXRIYW5kbGVJbmZvcm1hdGlvbigoSEFORExFKWZkLCBIQU5ETEVfRkxBR19JTkhFUklULCAwKTsKKyNlbmRpZgorI2Vsc2UKKyAgZmNudGwoZmQsIEZfU0VURkQsIEZEX0NMT0VYRUMpOworI2VuZGlmCisjZW5kaWYKKyAgcmV0dXJuIGZkOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2FjY2VwdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaW50IG4gPSAoaW50KXNpemVvZihzb2FwLT5wZWVyKTsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGludCBsZW4gPSBTT0FQX0JVRkxFTjsKKyAgaW50IHNldCA9IDE7CisjZW5kaWYKKyAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworI2lmZGVmIFdJVEhfVURQCisgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgcmV0dXJuIHNvYXAtPnNvY2tldCA9IHNvYXAtPm1hc3RlcjsKKyNlbmRpZgorICBtZW1zZXQoKHZvaWQqKSZzb2FwLT5wZWVyLCAwLCBzaXplb2Yoc29hcC0+cGVlcikpOworICBzb2FwLT5zb2NrZXQgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICBzb2FwLT5lcnJtb2RlID0gMDsKKyAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7CisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpKQorICB7IGZvciAoOzspCisgICAgeyAKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICBpZiAoc29hcC0+YWNjZXB0X3RpbWVvdXQpCisgICAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICAgIGZkX3NldCBmZDsKKyAgICAgICAgaWYgKHNvYXAtPmFjY2VwdF90aW1lb3V0ID4gMCkKKyAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IHNvYXAtPmFjY2VwdF90aW1lb3V0OworICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gLXNvYXAtPmFjY2VwdF90aW1lb3V0LzEwMDAwMDA7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gLXNvYXAtPmFjY2VwdF90aW1lb3V0JTEwMDAwMDA7CisgICAgICAgIH0KKyAgICAgICAgRkRfWkVSTygmZmQpOworICAgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgJmZkKTsKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeyBpbnQgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPm1hc3RlciArIDEpLCAmZmQsICZmZCwgTlVMTCwgJnRpbWVvdXQpOworICAgICAgICAgIGlmIChyID4gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGlmICghcikKKyAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IDA7CisgICAgICAgICAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiVGltZW91dCIsICJhY2NlcHQgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIpCisgICAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICAgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgICAgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImFjY2VwdCBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICAgIH0KKyAgICAgICAgfQorI2lmIGRlZmluZWQoV0lOMzIpCisJeyB1X2xvbmcgbm9uYmxvY2tpbmcgPSAxOworICAgICAgICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZJT05CSU8sICZub25ibG9ja2luZyk7CisgICAgICAgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgICAgICAgeyB1X2xvbmcgbm9uYmxvY2tpbmcgPSAxOworICAgICAgICAgIGlvY3RsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZJT05CSU8sIChpbnQpKCZub25ibG9ja2luZykpOworICAgICAgICB9CisjZWxzZQorICAgICAgICBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGX0dFVEZMKXxPX05PTkJMT0NLKTsKKyNlbmRpZgorICAgICAgfQorICAgICAgZWxzZQorI2lmIGRlZmluZWQoV0lOMzIpCisgICAgICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZJT05CSU8sICZibG9ja2luZyk7CisgICAgICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgICAgICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgICAgIGlvY3RsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZJT05CSU8sIChpbnQpKCZibG9ja2luZykpOworICAgICAgfQorI2Vsc2UKKyAgICAgICAgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRl9HRVRGTCkmfk9fTk9OQkxPQ0spOworI2VuZGlmCisjZW5kaWYKKyAgICAgIHNvYXAtPnNvY2tldCA9IHNvYXAtPmZhY2NlcHQoc29hcCwgc29hcC0+bWFzdGVyLCAoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlciwgJm4pOworICAgICAgc29hcC0+cGVlcmxlbiA9IChzaXplX3QpbjsKKyAgICAgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICAgICAgeworI2lmZGVmIFdJVEhfSVBWNgorLyogVXNlIHNvYXAtPmhvc3QgdG8gc3RvcmUgdGhlIG51bWVyaWMgZm9ybSBvZiB0aGUgcmVtb3RlIGhvc3QgKi8KKyAgICAgICAgZ2V0bmFtZWluZm8oKHN0cnVjdCBzb2NrYWRkciopJnNvYXAtPnBlZXIsIG4sIHNvYXAtPmhvc3QsIHNpemVvZihzb2FwLT5ob3N0KSwgTlVMTCwgMCwgTklfTlVNRVJJQ0hPU1QgfCBOSV9OVU1FUklDU0VSVik7IAorICAgICAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiQWNjZXB0IHNvY2tldCAlZCBmcm9tICVzXG4iLCBzb2FwLT5zb2NrZXQsIHNvYXAtPmhvc3QpKTsKKyAgICAgICAgc29hcC0+aXAgPSAwOyAvKiBpbmZvIHN0b3JlZCBpbiBzb2FwLT5wZWVyIGFuZCBzb2FwLT5ob3N0ICovCisgICAgICAgIHNvYXAtPnBvcnQgPSAwOyAvKiBpbmZvIHN0b3JlZCBpbiBzb2FwLT5wZWVyIGFuZCBzb2FwLT5ob3N0ICovCisjZWxzZQorICAgICAgICBzb2FwLT5pcCA9IG50b2hsKHNvYXAtPnBlZXIuc2luX2FkZHIuc19hZGRyKTsKKyAgICAgICAgc29hcC0+cG9ydCA9IChpbnQpbnRvaHMoc29hcC0+cGVlci5zaW5fcG9ydCk7IC8qIGRvZXMgbm90IHJldHVybiBwb3J0IG51bWJlciBvbiBzb21lIHN5c3RlbXMgKi8KKyAgICAgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFjY2VwdCBzb2NrZXQgJWQgYXQgcG9ydCAlZCBmcm9tIElQICVkLiVkLiVkLiVkXG4iLCBzb2FwLT5zb2NrZXQsIHNvYXAtPnBvcnQsIChpbnQpKHNvYXAtPmlwPj4yNCkmMHhGRiwgKGludCkoc29hcC0+aXA+PjE2KSYweEZGLCAoaW50KShzb2FwLT5pcD4+OCkmMHhGRiwgKGludClzb2FwLT5pcCYweEZGKSk7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisJaWYgKHNvYXAtPmFjY2VwdF9mbGFncyAmIFNPX0xJTkdFUikKKyAgICAgICAgeyBzdHJ1Y3QgbGluZ2VyIGxpbmdlcjsKKyAgICAgICAgICBtZW1zZXQoKHZvaWQqKSZsaW5nZXIsIDAsIHNpemVvZihsaW5nZXIpKTsKKyAgICAgICAgICBsaW5nZXIubF9vbm9mZiA9IDE7CisgICAgICAgICAgbGluZ2VyLmxfbGluZ2VyID0gMDsKKwkgIGlmIChzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIFNPTF9TT0NLRVQsIFNPX0xJTkdFUiwgKGNoYXIqKSZsaW5nZXIsIHNpemVvZihzdHJ1Y3QgbGluZ2VyKSkpCisgICAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKwkgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19MSU5HRVIgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisJICAgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisJICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChzb2FwLT5hY2NlcHRfZmxhZ3MgJiB+U09fTElOR0VSKSAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIFNPTF9TT0NLRVQsIHNvYXAtPmFjY2VwdF9mbGFncyAmIH5TT19MSU5HRVIsIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKwkgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICB9CisgICAgICAgIGlmICgoKHNvYXAtPmltb2RlIHwgc29hcC0+b21vZGUpICYgU09BUF9JT19LRUVQQUxJVkUpICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fS0VFUEFMSVZFIGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworCSAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgU09MX1NPQ0tFVCwgU09fU05EQlVGLCAoY2hhciopJmxlbiwgc2l6ZW9mKGludCkpKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fU05EQlVGIGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworCSAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgU09MX1NPQ0tFVCwgU09fUkNWQlVGLCAoY2hhciopJmxlbiwgc2l6ZW9mKGludCkpKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fUkNWQlVGIGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworCSAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgIH0KKyNpZmRlZiBUQ1BfTk9ERUxBWQorICAgICAgICBpZiAoIShzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFRDUF9OT0RFTEFZIGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworCSAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgIH0KKyNlbmRpZgorI2VuZGlmCisgICAgICAgIGlmIChzb2FwLT5hY2NlcHRfdGltZW91dCkKKyAgICAgICAgeworI2lmIGRlZmluZWQoV0lOMzIpCisgICAgICAgICAgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICAgICAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGSU9OQklPLCAmYmxvY2tpbmcpOworICAgICAgICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZJT05CSU8sICZibG9ja2luZyk7CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgICAgICAgICAgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICAgICAgICBpb2N0bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGSU9OQklPLCAoaW50KSgmYmxvY2tpbmcpKTsKKyAgICAgICAgICBpb2N0bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGSU9OQklPLCAoaW50KSgmYmxvY2tpbmcpKTsKKyNlbGlmIGRlZmluZWQoUEFMTSkKKyAgICAgICAgICBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGX0dFVEZMLDApJn5PX05PTkJMT0NLKTsKKyAgICAgICAgICBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGX0dFVEZMLDApJn5PX05PTkJMT0NLKTsKKyNlbGlmIGRlZmluZWQoU1lNQklBTikKKyAgICAgICAgICBsb25nIGJsb2NraW5nID0gMDsKKyAgICAgICAgICBpb2N0bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCAwLypGSU9OQklPKi8sICZibG9ja2luZyk7CisjZWxzZQorICAgICAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfR0VURkwpJn5PX05PTkJMT0NLKTsKKyAgICAgICAgICBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGX0dFVEZMKSZ+T19OT05CTE9DSyk7CisjZW5kaWYKKwl9CisgICAgICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAoKChzb2FwLT5pbW9kZSB8IHNvYXAtPm9tb2RlKSAmIFNPQVBfSU9fS0VFUEFMSVZFKSAhPSAwKTsKKyAgICAgICAgcmV0dXJuIHNvYXAtPnNvY2tldDsKKyAgICAgIH0KKyAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUFHQUlOKQorICAgICAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiQWNjZXB0IGZhaWxlZCBmcm9tICVzXG4iLCBzb2FwLT5ob3N0KSk7CisgICAgICAgIHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJhY2NlcHQgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisJc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsgc29hcC0+ZXJybnVtID0gMDsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJubyBtYXN0ZXIgc29ja2V0IGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3RjcF9kaXNjb25uZWN0KHN0cnVjdCBzb2FwICpzb2FwKQoreworI2lmZGVmIFdJVEhfT1BFTlNTTAorICBpZiAoc29hcC0+c3NsKQorICB7IGludCByLCBzID0gMDsKKyAgICBpZiAoc29hcC0+c2Vzc2lvbikKKyAgICAgIFNTTF9TRVNTSU9OX2ZyZWUoc29hcC0+c2Vzc2lvbik7CisgICAgaWYgKCpzb2FwLT5ob3N0KQorICAgIHsgc29hcC0+c2Vzc2lvbiA9IFNTTF9nZXQxX3Nlc3Npb24oc29hcC0+c3NsKTsKKyAgICAgIGlmIChzb2FwLT5zZXNzaW9uKQorICAgICAgeyBzdHJjcHkoc29hcC0+c2Vzc2lvbl9ob3N0LCBzb2FwLT5ob3N0KTsKKyAgICAgICAgc29hcC0+c2Vzc2lvbl9wb3J0ID0gc29hcC0+cG9ydDsKKyAgICAgIH0KKyAgICB9CisgICAgciA9IFNTTF9zaHV0ZG93bihzb2FwLT5zc2wpOworICAgIGlmIChyICE9IDEpCisgICAgeyBzID0gRVJSX2dldF9lcnJvcigpOworICAgICAgaWYgKHMpCisgICAgICB7IGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICAgICAgICB7IHNvYXAtPmZzaHV0ZG93bnNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAxKTsKKyAgICAgICAgICBzb2FwLT5zb2NrZXQgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICB9CisgICAgICAgIHIgPSBTU0xfc2h1dGRvd24oc29hcC0+c3NsKTsKKyAgICAgIH0KKyAgICB9CisgICAgREJHTE9HKFRFU1QsIGlmIChzKSBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2h1dGRvd24gZmFpbGVkOiAlZFxuIiwgU1NMX2dldF9lcnJvcihzb2FwLT5zc2wsIHIpKSk7CisgICAgU1NMX2ZyZWUoc29hcC0+c3NsKTsKKyAgICBzb2FwLT5zc2wgPSBOVUxMOworICAgIGlmIChzKQorICAgICAgcmV0dXJuIFNPQVBfU1NMX0VSUk9SOworICAgIEVSUl9yZW1vdmVfc3RhdGUoMCk7CisgIH0KKyNlbmRpZgorICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSAmJiAhKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICB7IHNvYXAtPmZzaHV0ZG93bnNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAyKTsKKyAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCk7CisgICAgc29hcC0+c29ja2V0ID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3RjcF9jbG9zZXNvY2tldChzdHJ1Y3Qgc29hcCAqc29hcCwgU09BUF9TT0NLRVQgZmQpCit7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ2xvc2Ugc29ja2V0ICVkXG4iLCAoaW50KWZkKSk7CisgIHJldHVybiBjbG9zZXNvY2tldChmZCk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Cit0Y3Bfc2h1dGRvd25zb2NrZXQoc3RydWN0IHNvYXAgKnNvYXAsIFNPQVBfU09DS0VUIGZkLCBpbnQgaG93KQoreyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNodXRkb3duIHNvY2tldCAlZCBob3c9JWRcbiIsIChpbnQpZmQsIGhvdykpOworICByZXR1cm4gc2h1dGRvd24oZmQsIGhvdyk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9jbG9zZXNvY2soc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBzdGF0dXMgPSBzb2FwLT5lcnJvcjsKKyAgaWYgKHN0YXR1cyA9PSBTT0FQX0VPRiB8fCBzdGF0dXMgPT0gU09BUF9UQ1BfRVJST1IgfHwgc3RhdHVzID09IFNPQVBfU1NMX0VSUk9SIHx8ICFzb2FwLT5rZWVwX2FsaXZlKQorICB7IGlmIChzb2FwLT5mY2xvc2UgJiYgKHNvYXAtPmVycm9yID0gc29hcC0+ZmNsb3NlKHNvYXApKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBzb2FwLT5rZWVwX2FsaXZlID0gMDsKKyAgfQorI2lmZGVmIFdJVEhfWkxJQgorICBpZiAoc29hcC0+emxpYl9zdGF0ZSA9PSBTT0FQX1pMSUJfREVGTEFURSkKKyAgICBkZWZsYXRlRW5kKCZzb2FwLT5kX3N0cmVhbSk7CisgIGVsc2UgaWYgKHNvYXAtPnpsaWJfc3RhdGUgPT0gU09BUF9aTElCX0lORkxBVEUpCisgICAgaW5mbGF0ZUVuZCgmc29hcC0+ZF9zdHJlYW0pOworICBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX05PTkU7CisjZW5kaWYKKyAgcmV0dXJuIHNvYXAtPmVycm9yID0gc3RhdHVzOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3NpemVfdAorU09BUF9GTUFDMgorc29hcF9oYXNoKHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnMpCit7IHJlZ2lzdGVyIHNpemVfdCBoID0gMDsKKyAgd2hpbGUgKCpzKQorICAgIGggPSA2NTU5OSpoICsgKnMrKzsKKyAgcmV0dXJuIGggJSBTT0FQX0lESEFTSDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyB2b2lkCitzb2FwX2luaXRfcGh0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgaTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbml0aWFsaXppbmcgcG9pbnRlciBoYXNodGFibGVcbiIpKTsKKyAgc29hcC0+cGJsayA9IE5VTEw7CisgIHNvYXAtPnBpZHggPSAwOworICBmb3IgKGkgPSAwOyBpIDwgKGludClTT0FQX1BUUkhBU0g7IGkrKykKKyAgICBzb2FwLT5waHRbaV0gPSBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcCoKK1NPQVBfRk1BQzIKK3NvYXBfbmV3MShzb2FwX21vZGUgbW9kZSkKK3sgcmV0dXJuIHNvYXBfbmV3Mihtb2RlLCBtb2RlKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwKgorU09BUF9GTUFDMgorc29hcF9uZXcoKQoreyByZXR1cm4gc29hcF9uZXcyKFNPQVBfSU9fREVGQVVMVCwgU09BUF9JT19ERUZBVUxUKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwKgorU09BUF9GTUFDMgorc29hcF9uZXcyKHNvYXBfbW9kZSBpbW9kZSwgc29hcF9tb2RlIG9tb2RlKQoreyBzdHJ1Y3Qgc29hcCAqc29hcCA9IChzdHJ1Y3Qgc29hcCopbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc29hcCkpOworICBpZiAoc29hcCkKKyAgICBzb2FwX2luaXQyKHNvYXAsIGltb2RlLCBvbW9kZSk7CisgIHJldHVybiBzb2FwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9kZWwoc3RydWN0IHNvYXAgKnNvYXApCit7IGZyZWUoc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQKK3NvYXBfZnJlZV9waHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BibGsgKnBiLCAqbmV4dDsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZSBwb2ludGVyIGhhc2h0YWJsZVxuIikpOworICBmb3IgKHBiID0gc29hcC0+cGJsazsgcGI7IHBiID0gbmV4dCkKKyAgeyBuZXh0ID0gcGItPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIHBiKTsKKyAgfQorICBzb2FwLT5wYmxrID0gTlVMTDsKKyAgc29hcC0+cGlkeCA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCAoaW50KVNPQVBfUFRSSEFTSDsgaSsrKQorICAgIHNvYXAtPnBodFtpXSA9IE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW1iZWQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgbiwgY29uc3QgY2hhciAqdGFnLCBpbnQgdHlwZSkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgaWYgKHNvYXAtPnZlcnNpb24gIT0gMSkKKyAgICBzb2FwLT5lbmNvZGluZyA9IDE7CisgIGlmIChhKQorICAgIGkgPSBzb2FwX2FycmF5X3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIGEsIG4sIHR5cGUsICZwcCk7CisgIGVsc2UKKyAgICBpID0gc29hcF9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCB0eXBlLCAmcHApOworICBpZiAoaSkKKyAgeyBpZiAoc29hcF9pc19lbWJlZGRlZChzb2FwLCBwcCkKKyAgICAgfHwgc29hcF9pc19zaW5nbGUoc29hcCwgcHApKQorICAgICAgcmV0dXJuIDA7CisgICAgc29hcF9zZXRfZW1iZWRkZWQoc29hcCwgcHApOworICB9CisgIHJldHVybiBpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3BvaW50ZXJfbG9va3VwKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBpbnQgdHlwZSwgc3RydWN0IHNvYXBfcGxpc3QgKipwcHApCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgKnBwcCA9IE5VTEw7CisgIGlmIChwKQorICB7IGZvciAocHAgPSBzb2FwLT5waHRbc29hcF9oYXNoX3B0cihwKV07IHBwOyBwcCA9IHBwLT5uZXh0KQorICAgIHsgaWYgKHBwLT5wdHIgPT0gcCAmJiBwcC0+dHlwZSA9PSB0eXBlKQorICAgICAgeyAqcHBwID0gcHA7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTG9va3VwIGxvY2F0aW9uPSVwIHR5cGU9JWQgaWQ9JWRcbiIsIHAsIHR5cGUsIHBwLT5pZCkpOworICAgICAgICByZXR1cm4gcHAtPmlkOworICAgICAgfQorICAgIH0KKyAgfQorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkxvb2t1cCBsb2NhdGlvbj0lcCB0eXBlPSVkOiBub3QgZm91bmRcbiIsIHAsIHR5cGUpKTsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcG9pbnRlcl9lbnRlcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCwgY29uc3Qgc3RydWN0IHNvYXBfYXJyYXkgKmEsIGludCBuLCBpbnQgdHlwZSwgc3RydWN0IHNvYXBfcGxpc3QgKipwcHApCit7IHJlZ2lzdGVyIGludCBoOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgIGlmICghc29hcC0+cGJsayB8fCBzb2FwLT5waWR4ID49IFNPQVBfUFRSQkxLKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BibGsgKnBiID0gKHN0cnVjdCBzb2FwX3BibGsqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9wYmxrKSk7CisgICAgaWYgKCFwYikKKyAgICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcGItPm5leHQgPSBzb2FwLT5wYmxrOworICAgIHNvYXAtPnBibGsgPSBwYjsKKyAgICBzb2FwLT5waWR4ID0gMDsKKyAgfQorICAqcHBwID0gcHAgPSAmc29hcC0+cGJsay0+cGxpc3Rbc29hcC0+cGlkeCsrXTsKKyAgaWYgKGEpCisgICAgaCA9IHNvYXBfaGFzaF9wdHIoYS0+X19wdHIpOworICBlbHNlCisgICAgaCA9IHNvYXBfaGFzaF9wdHIocCk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUG9pbnRlciBlbnRlciBsb2NhdGlvbj0lcCBhcnJheT0lcCBzaXplPSVkIGRpbT0lZCB0eXBlPSVkIGlkPSVkXG4iLCBwLCBhP2EtPl9fcHRyOk5VTEwsIGE/YS0+X19zaXplOjAsIG4sIHR5cGUsIHNvYXAtPmlkbnVtKzEpKTsKKyAgcHAtPm5leHQgPSBzb2FwLT5waHRbaF07CisgIHBwLT50eXBlID0gdHlwZTsKKyAgcHAtPm1hcmsxID0gMDsKKyAgcHAtPm1hcmsyID0gMDsKKyAgcHAtPnB0ciA9IHA7CisgIHBwLT5hcnJheSA9IGE7CisgIHNvYXAtPnBodFtoXSA9IHBwOworICBwcC0+aWQgPSArK3NvYXAtPmlkbnVtOworICByZXR1cm4gcHAtPmlkOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2FycmF5X3BvaW50ZXJfbG9va3VwKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGludCB0eXBlLCBzdHJ1Y3Qgc29hcF9wbGlzdCAqKnBwcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICAqcHBwID0gTlVMTDsKKyAgaWYgKCFwIHx8ICFhLT5fX3B0cikKKyAgICByZXR1cm4gMDsKKyAgZm9yIChwcCA9IHNvYXAtPnBodFtzb2FwX2hhc2hfcHRyKGEtPl9fcHRyKV07IHBwOyBwcCA9IHBwLT5uZXh0KQorICB7IGlmIChwcC0+dHlwZSA9PSB0eXBlICYmIHBwLT5hcnJheSAmJiBwcC0+YXJyYXktPl9fcHRyID09IGEtPl9fcHRyKQorICAgIHsgcmVnaXN0ZXIgaW50IGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICBpZiAoKChjb25zdCBpbnQqKSZwcC0+YXJyYXktPl9fc2l6ZSlbaV0gIT0gKChjb25zdCBpbnQqKSZhLT5fX3NpemUpW2ldKQorCSAgYnJlYWs7CisgICAgICBpZiAoaSA9PSBuKQorICAgICAgeyAqcHBwID0gcHA7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQXJyYXkgbG9va3VwIGxvY2F0aW9uPSVwIHR5cGU9JWQgaWQ9JWRcbiIsIGEtPl9fcHRyLCB0eXBlLCBwcC0+aWQpKTsKKyAgICAgICAgcmV0dXJuIHBwLT5pZDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJBcnJheSBsb29rdXAgbG9jYXRpb249JXAgdHlwZT0lZDogbm90IGZvdW5kXG4iLCBhLT5fX3B0ciwgdHlwZSkpOworICByZXR1cm4gMDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JlZ2luX2NvdW50KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwX2Nscl9hdHRyKHNvYXApOworICBzb2FwX3NldF9sb2NhbF9uYW1lc3BhY2VzKHNvYXApOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSB8fCAoc29hcC0+b21vZGUgJiBTT0FQX0VOQ19ESU1FKSkKKyAgICBzb2FwLT5tb2RlID0gc29hcC0+b21vZGUgfCBTT0FQX0lPX0xFTkdUSCB8IFNPQVBfRU5DX0RJTUU7CisgIGVsc2UKKyNlbmRpZgorICB7IHNvYXAtPm1vZGUgPSBzb2FwLT5vbW9kZTsKKyAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX1NUT1JFCisgICAgIHx8ICgoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LIHx8IChzb2FwLT5tb2RlICYgU09BUF9FTkNfWE1MKSkKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgICAgICYmICFzb2FwLT5mcHJlcGFyZXNlbmQKKyNlbmRpZgorICAgICAgKSkKKyAgICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfSU9fTEVOR1RIOworICAgIGVsc2UKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19MRU5HVEg7CisgIH0KKyNpZmRlZiBXSVRIX1pMSUIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQikgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0ZMVVNIKQorICB7IGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSkKKyAgICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfSU9fTEVOR1RIOworICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWE1MKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX0JVRkZFUjsKKyAgICBlbHNlCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fU1RPUkU7CisgIH0KKyNlbmRpZgorICBpZiAoIXNvYXAtPmVuY29kaW5nU3R5bGUgJiYgIShzb2FwLT5tb2RlICYgU09BUF9YTUxfR1JBUEgpKQorICAgIHNvYXAtPm1vZGUgfD0gU09BUF9YTUxfVFJFRTsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSkKKyAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX01JTUU7CisgIGVsc2UKKyAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0VOQ19NVE9NOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01JTUUpCisgICAgc29hcF9zZWxlY3RfbWltZV9ib3VuZGFyeShzb2FwKTsKKyAgc29hcC0+ZGltZS5saXN0ID0gc29hcC0+ZGltZS5sYXN0OwkvKiBrZWVwIHRyYWNrIG9mIGxhc3QgRElNRSBhdHRhY2htZW50ICovCisjZW5kaWYKKyAgc29hcC0+Y291bnQgPSAwOworICBzb2FwLT5ucyA9IDA7CisgIHNvYXAtPm51bGwgPSAwOworICBzb2FwLT5wb3NpdGlvbiA9IDA7CisgIHNvYXAtPm11c3RVbmRlcnN0YW5kID0gMDsKKyAgc29hcC0+ZW5jb2RpbmcgPSAwOworICBzb2FwLT5wYXJ0ID0gU09BUF9CRUdJTjsKKyAgc29hcC0+aWRudW0gPSAwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkJlZ2luIGNvdW50IHBoYXNlIChzb2NrZXQ9JWQgbW9kZT0weCV4IGNvdW50PSVsdSlcbiIsIHNvYXAtPnNvY2tldCwgc29hcC0+bW9kZSwgKHVuc2lnbmVkIGxvbmcpc29hcC0+Y291bnQpKTsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcC0+ZGltZS5jb3VudCA9IDA7IC8qIGNvdW50ICMgb2YgYXR0YWNobWVudHMgKi8KKyAgc29hcC0+ZGltZS5zaXplID0gMDsgLyogYWNjdW11bGF0ZSB0b3RhbCBzaXplIG9mIGF0dGFjaG1lbnRzICovCisgIGlmIChzb2FwLT5mcHJlcGFyZWluaXQgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSAhPSBTT0FQX0lPX1NUT1JFKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IHNvYXAtPmZwcmVwYXJlaW5pdChzb2FwKTsgICAKKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbmRfY291bnQoc3RydWN0IHNvYXAgKnNvYXApCit7IAorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+ZnByZXBhcmVmaW5hbCkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBzb2FwLT5mcHJlcGFyZWZpbmFsKHNvYXApOworI2VuZGlmCisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIG9mIGNvdW50IHBoYXNlXG4iKSk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JlZ2luX3NlbmQoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgc29hcF9jbHJfYXR0cihzb2FwKTsKKyAgc29hcF9zZXRfbG9jYWxfbmFtZXNwYWNlcyhzb2FwKTsKKyAgc29hcC0+bW9kZSA9IHNvYXAtPm9tb2RlIHwgKHNvYXAtPm1vZGUgJiAoU09BUF9JT19MRU5HVEggfCBTT0FQX0VOQ19ESU1FKSk7CisjaWZkZWYgV0lUSF9aTElCCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIpICYmIChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19GTFVTSCkKKyAgeyBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1hNTCkKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19CVUZGRVI7CisgICAgZWxzZQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX1NUT1JFOworICB9CisjZW5kaWYKKyNpZmRlZiBXSVRIX1VEUAorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPX1VEUCkpCisgIHsgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19YTUw7CisgICAgaWYgKHNvYXAtPmNvdW50ID4gU09BUF9CVUZMRU4pCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1VEUF9FUlJPUjsKKyAgfQorI2VuZGlmCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fRkxVU0ggJiYgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgeyBpZiAoc29hcC0+Y291bnQgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX0JVRkZFUjsKKyAgICBlbHNlCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fU1RPUkU7CisgIH0KKyAgc29hcC0+bW9kZSAmPSB+U09BUF9JT19MRU5HVEg7CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fU1RPUkUpCisgICAgc29hcF9uZXdfYmxvY2soc29hcCk7CisgIGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0tFRVBBTElWRSkpCisgICAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7CisgIGlmICghc29hcC0+ZW5jb2RpbmdTdHlsZSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9HUkFQSCkpCisgICAgc29hcC0+bW9kZSB8PSBTT0FQX1hNTF9UUkVFOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpKQorICB7IHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfTUlNRTsKKyAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0VOQ19ESU1FOworICB9CisgIGVsc2UKKyAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0VOQ19NVE9NOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01JTUUpCisgICAgc29hcF9zZWxlY3RfbWltZV9ib3VuZGFyeShzb2FwKTsKKyNpZmRlZiBXSU4zMgorI2lmbmRlZiBVTkRFUl9DRQorI2lmbmRlZiBXSVRIX0ZBU1RDR0kKKyAgaWYgKCFzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKSAvKiBTZXQgd2luMzIgc3Rkb3V0IG9yIHNvYXAtPnNlbmRmZCB0byBCSU5BUlksIGUuZy4gdG8gc3VwcG9ydCBESU1FICovCisjaWZkZWYgX19CT1JMQU5EQ19fCisgICAgc2V0bW9kZSgoU09BUF9TT0NLRVQpc29hcC0+c2VuZGZkLCBPX0JJTkFSWSk7CisjZWxzZQorICAgIF9zZXRtb2RlKChTT0FQX1NPQ0tFVClzb2FwLT5zZW5kZmQsIF9PX0JJTkFSWSk7CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pCisgIHsgc29hcC0+YnVmaWR4ID0gMDsKKyAgICBzb2FwLT5idWZsZW4gPSAwOworICB9CisgIHNvYXAtPmNodW5rc2l6ZSA9IDA7CisgIHNvYXAtPm5zID0gMDsKKyAgc29hcC0+bnVsbCA9IDA7CisgIHNvYXAtPnBvc2l0aW9uID0gMDsKKyAgc29hcC0+bXVzdFVuZGVyc3RhbmQgPSAwOworICBzb2FwLT5lbmNvZGluZyA9IDA7CisgIHNvYXAtPmlkbnVtID0gMDsKKyAgc29hcC0+bGV2ZWwgPSAwOworI2lmZGVmIFdJVEhfWkxJQgorICBzb2FwLT56X3JhdGlvX291dCA9IDEuMDsKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQikgJiYgc29hcC0+emxpYl9zdGF0ZSAhPSBTT0FQX1pMSUJfREVGTEFURSkKKyAgeworI2lmZGVmIFdJVEhfR1pJUAorICAgIG1lbWNweShzb2FwLT56X2J1ZiwgIlwzN1wyMTNcMTBcMFwwXDBcMFwwXDBcMzc3IiwgMTApOworICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gKEJ5dGUqKXNvYXAtPnpfYnVmICsgMTA7CisgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0ID0gU09BUF9CVUZMRU4gLSAxMDsKKyAgICBzb2FwLT56X2NyYyA9IGNyYzMyKDBMLCBOVUxMLCAwKTsKKyAgICBpZiAoZGVmbGF0ZUluaXQyKCZzb2FwLT5kX3N0cmVhbSwgc29hcC0+el9sZXZlbCwgWl9ERUZMQVRFRCwgLU1BWF9XQklUUywgOCwgWl9ERUZBVUxUX1NUUkFURUdZKSAhPSBaX09LKQorI2Vsc2UKKyAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IChCeXRlKilzb2FwLT56X2J1ZjsKKyAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgPSBTT0FQX0JVRkxFTjsKKyAgICBpZiAoZGVmbGF0ZUluaXQoJnNvYXAtPmRfc3RyZWFtLCBzb2FwLT56X2xldmVsKSAhPSBaX09LKQorI2VuZGlmCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJEZWZsYXRlIGluaXRpYWxpemVkXG4iKSk7CisgICAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9ERUZMQVRFOworICB9CisjZW5kaWYKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJCZWdpbiBzZW5kIHBoYXNlIChzb2NrZXQ9JWQgbW9kZT0weCV4IGNvdW50PSVsdSlcbiIsIHNvYXAtPnNvY2tldCwgc29hcC0+bW9kZSwgKHVuc2lnbmVkIGxvbmcpc29hcC0+Y291bnQpKTsKKyAgc29hcC0+cGFydCA9IFNPQVBfQkVHSU47CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5mcHJlcGFyZWluaXQgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX1NUT1JFKQorICAgIHNvYXAtPmZwcmVwYXJlaW5pdChzb2FwKTsgICAKKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2VtYmVkZGVkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBpbnQgdCkKK3sgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICBpZiAoc29hcF9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCB0LCAmcHApKQorICB7IHBwLT5tYXJrMSA9IDE7CisgICAgcHAtPm1hcmsyID0gMTsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVtYmVkZGVkICVwIHR5cGU9JWQgbWFyayBzZXQgdG8gMVxuIiwgcCwgdCkpOworICB9Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVmZXJlbmNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBpbnQgdCkKK3sgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICBpZiAoIXAgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9UUkVFKSkKKyAgICByZXR1cm4gMTsKKyAgaWYgKHNvYXBfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgdCwgJnBwKSkKKyAgeyBpZiAocHAtPm1hcmsxID09IDApCisgICAgeyBwcC0+bWFyazEgPSAyOworICAgICAgcHAtPm1hcmsyID0gMjsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoc29hcF9wb2ludGVyX2VudGVyKHNvYXAsIHAsIE5VTEwsIDAsIHQsICZwcCkpCisgIHsgcHAtPm1hcmsxID0gMDsKKyAgICBwcC0+bWFyazIgPSAwOworICB9CisgIGVsc2UKKyAgICByZXR1cm4gMTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWZlcmVuY2UgJXAgdHlwZT0lZCAoJWQgJWQpXG4iLCBwLCB0LCAoaW50KXBwLT5tYXJrMSwgKGludClwcC0+bWFyazIpKTsKKyAgcmV0dXJuIHBwLT5tYXJrMTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9hcnJheV9yZWZlcmVuY2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgbiwgaW50IHQpCit7IHJlZ2lzdGVyIGludCBpOworICBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgIGlmICghcCB8fCAhYS0+X19wdHIpCisgICAgcmV0dXJuIDE7CisgIGkgPSBzb2FwX2FycmF5X3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIGEsIG4sIHQsICZwcCk7CisgIGlmIChpKQorICB7IGlmIChwcC0+bWFyazEgPT0gMCkKKyAgICB7IHBwLT5tYXJrMSA9IDI7CisgICAgICBwcC0+bWFyazIgPSAyOworICAgIH0KKyAgfQorICBlbHNlIGlmICghc29hcF9wb2ludGVyX2VudGVyKHNvYXAsIHAsIGEsIG4sIHQsICZwcCkpCisgICAgcmV0dXJuIDE7CisgIGVsc2UKKyAgeyBwcC0+bWFyazEgPSAwOworICAgIHBwLT5tYXJrMiA9IDA7CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJBcnJheSByZWZlcmVuY2UgJXAgcHRyPSVwIGRpbT0lZCB0eXBlPSVkICglZCAlZClcbiIsIHAsIGEtPl9fcHRyLCBuLCB0LCAoaW50KXBwLT5tYXJrMSwgKGludClwcC0+bWFyazIpKTsKKyAgcmV0dXJuIHBwLT5tYXJrMTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbWJlZGRlZF9pZChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGlkLCBjb25zdCB2b2lkICpwLCBpbnQgdCkKK3sgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1RSRUUpCisgICAgcmV0dXJuIGlkOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVtYmVkZGVkX2lkICVwIHR5cGU9JWQgaWQ9JWRcbiIsIHAsIHQsIGlkKSk7CisgIGlmIChzb2FwLT52ZXJzaW9uID09IDEgJiYgc29hcC0+ZW5jb2RpbmdTdHlsZSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9HUkFQSCkgJiYgc29hcC0+cGFydCAhPSBTT0FQX0lOX0hFQURFUikKKyAgeyBpZiAoaWQgPCAwKQorICAgIHsgaWQgPSBzb2FwX3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIHQsICZwcCk7CisgICAgICBpZiAoaWQpCisgICAgICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgICAgICAgcHAtPm1hcmsxID0gMjsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHBwLT5tYXJrMiA9IDI7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW1iZWRkZWRfaWQgbXVsdGlyZWYgaWQ9JWQgJXAgdHlwZT0lZCA9ICglZCAlZClcbiIsIGlkLCBwLCB0LCAoaW50KXBwLT5tYXJrMSwgKGludClwcC0+bWFyazIpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIGlkOworICB9CisgIGlmIChpZCA8IDApCisgICAgaWQgPSBzb2FwX3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIHQsICZwcCk7CisgIGVsc2UgaWYgKGlkICYmICFzb2FwX3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIHQsICZwcCkpCisgICAgcmV0dXJuIDA7CisgIGlmIChpZCAmJiBwcCkKKyAgeyBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICAgICAgcHAtPm1hcmsxID0gMTsKKyAgICBlbHNlCisgICAgICBwcC0+bWFyazIgPSAxOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW1iZWRkZWRfaWQgZW1iZWRkZWQgcmVmIGlkPSVkICVwIHR5cGU9JWQgPSAoJWQgJWQpXG4iLCBpZCwgcCwgdCwgKGludClwcC0+bWFyazEsIChpbnQpcHAtPm1hcmsyKSk7CisgIH0KKyAgcmV0dXJuIGlkOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2lzX2VtYmVkZGVkKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHApCit7IGlmICghcHApCisgICAgcmV0dXJuIDA7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSXMgZW1iZWRkZWQ/ICVkICVkXG4iLCAoaW50KXBwLT5tYXJrMSwgKGludClwcC0+bWFyazIpKTsKKyAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMSAmJiBzb2FwLT5lbmNvZGluZ1N0eWxlICYmICEoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0dSQVBIKSAmJiBzb2FwLT5wYXJ0ICE9IFNPQVBfSU5fSEVBREVSKQorICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgICByZXR1cm4gcHAtPm1hcmsxICE9IDA7CisgICAgcmV0dXJuIHBwLT5tYXJrMiAhPSAwOworICB9CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgcmV0dXJuIHBwLT5tYXJrMSA9PSAxOworICByZXR1cm4gcHAtPm1hcmsyID09IDE7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfaXNfc2luZ2xlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHApCit7IGlmIChzb2FwLT5wYXJ0ID09IFNPQVBfSU5fSEVBREVSKQorICAgIHJldHVybiAxOworICBpZiAoIXBwKQorICAgIHJldHVybiAwOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICAgIHJldHVybiBwcC0+bWFyazEgPT0gMDsKKyAgcmV0dXJuIHBwLT5tYXJrMiA9PSAwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfZW1iZWRkZWQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3BsaXN0ICpwcCkKK3sgaWYgKCFwcCkKKyAgICByZXR1cm47CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgcHAtPm1hcmsxID0gMTsKKyAgZWxzZQorICAgIHBwLT5tYXJrMiA9IDE7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYXR0YWNobWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBjb25zdCBjaGFyICphaWQsIGNvbnN0IGNoYXIgKmF0eXBlLCBjb25zdCBjaGFyICphb3B0aW9ucywgaW50IG4sIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KSAKK3sgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICBpbnQgaTsKKyAgaWYgKCFwIHx8ICFhLT5fX3B0ciB8fCAoIWFpZCAmJiAhYXR5cGUpKQorICAgIHJldHVybiBzb2FwX2VsZW1lbnRfaWQoc29hcCwgdGFnLCBpZCwgcCwgYSwgbiwgdHlwZSwgdCk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQXR0YWNobWVudCB0YWc9JyVzJyBpZD0nJXMnICglZCkgdHlwZT0nJXMnXG4iLCB0YWcsIGFpZD9haWQ6IiIsIGlkLCBhdHlwZT9hdHlwZToiIikpOworICBpID0gc29hcF9hcnJheV9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCBhLCBuLCB0LCAmcHApOworICBpZiAoIWkpCisgIHsgaSA9IHNvYXBfcG9pbnRlcl9lbnRlcihzb2FwLCBwLCBhLCBuLCB0LCAmcHApOworICAgIGlmICghaSkKKyAgICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CisgIGlmIChpZCA8PSAwKQorICAgIGlkID0gaTsKKyAgaWYgKCFhaWQpCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsIHNvYXAtPmRpbWVfaWRfZm9ybWF0LCBpZCk7CisgICAgYWlkID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+dG1wYnVmKTsKKyAgfQorICAvKiBBZGQgTVRPTSB4b3A6SW5jbHVkZSBlbGVtZW50IHdoZW4gbmVjZXNzYXJ5ICovCisgIC8qIFRPRE86IHRoaXMgY29kZSB0byBiZSBvYnNvbGV0ZWQgd2l0aCBuZXcgaW1wb3J0L3hvcC5oIGNvbnZlbnRpb25zICovCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pICYmIHN0cmNtcCh0YWcsICJ4b3A6SW5jbHVkZSIpKQorICB7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgMCwgdHlwZSkKKyAgICAgfHwgc29hcF9lbGVtZW50X2hyZWYoc29hcCwgInhvcDpJbmNsdWRlIiwgMCwgImhyZWYiLCBhaWQpCisgICAgIHx8IHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZykpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgZWxzZSBpZiAoc29hcF9lbGVtZW50X2hyZWYoc29hcCwgdGFnLCAwLCAiaHJlZiIsIGFpZCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICB7IGlmIChwcC0+bWFyazEgIT0gMykKKyAgICB7IHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkKKyAgICAgICAgY29udGVudCA9IHNvYXBfbmV3X211bHRpcGFydChzb2FwLCAmc29hcC0+bWltZS5maXJzdCwgJnNvYXAtPm1pbWUubGFzdCwgKGNoYXIqKWEtPl9fcHRyLCBhLT5fX3NpemUpOworICAgICAgZWxzZQorICAgICAgICBjb250ZW50ID0gc29hcF9uZXdfbXVsdGlwYXJ0KHNvYXAsICZzb2FwLT5kaW1lLmZpcnN0LCAmc29hcC0+ZGltZS5sYXN0LCAoY2hhciopYS0+X19wdHIsIGEtPl9fc2l6ZSk7CisgICAgICBpZiAoIWNvbnRlbnQpCisgICAgICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGlmICghc3RybmNtcChhaWQsICJjaWQ6IiwgNCkpIC8qIFJGQyAyMTExICovCisgICAgICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkKKyAgICAgICAgeyBjaGFyICpzID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihhaWQpIC0gMSk7CisJICBpZiAocykKKwkgIHsgKnMgPSAnPCc7CisJICAgIHN0cmNweShzICsgMSwgYWlkICsgNCk7CisJICAgIHN0cmNhdChzLCAiPiIpOworCSAgICBjb250ZW50LT5pZCA9IHM7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBjb250ZW50LT5pZCA9IGFpZCArIDQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIGNvbnRlbnQtPmlkID0gYWlkOworICAgICAgY29udGVudC0+dHlwZSA9IGF0eXBlOworICAgICAgY29udGVudC0+b3B0aW9ucyA9IGFvcHRpb25zOworICAgICAgY29udGVudC0+ZW5jb2RpbmcgPSBTT0FQX01JTUVfQklOQVJZOworICAgICAgcHAtPm1hcmsxID0gMzsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIHBwLT5tYXJrMiA9IDM7CisgIHJldHVybiAtMTsKK30KKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQKK3NvYXBfaW5pdF9paHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBpOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluaXRpYWxpemluZyBJRCBoYXNodGFibGVcbiIpKTsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfSURIQVNIOyBpKyspCisgICAgc29hcC0+aWh0W2ldID0gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyB2b2lkCitzb2FwX2ZyZWVfaWh0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfaWxpc3QgKmlwLCAqcDsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZmxpc3QgKmZwLCAqZnE7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZSBJRCBoYXNodGFibGVcbiIpKTsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfSURIQVNIOyBpKyspCisgIHsgZm9yIChpcCA9IHNvYXAtPmlodFtpXTsgaXA7IGlwID0gcCkKKyAgICB7IGZvciAoZnAgPSBpcC0+Zmxpc3Q7IGZwOyBmcCA9IGZxKQorICAgICAgeyBmcSA9IGZwLT5uZXh0OworICAgICAgICBTT0FQX0ZSRUUoc29hcCwgZnApOworICAgICAgfQorICAgICAgcCA9IGlwLT5uZXh0OworICAgICAgU09BUF9GUkVFKHNvYXAsIGlwKTsKKyAgICB9CisgICAgc29hcC0+aWh0W2ldID0gTlVMTDsKKyAgfQorfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorc3RydWN0IHNvYXBfaWxpc3QgKgorU09BUF9GTUFDMgorc29hcF9sb29rdXAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIGZvciAoaXAgPSBzb2FwLT5paHRbc29hcF9oYXNoKGlkKV07IGlwOyBpcCA9IGlwLT5uZXh0KQorICAgIGlmICghc3RyY21wKGlwLT5pZCwgaWQpKQorICAgICAgcmV0dXJuIGlwOworICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwX2lsaXN0ICoKK1NPQVBfRk1BQzIKK3NvYXBfZW50ZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkKQoreyByZWdpc3RlciBzaXplX3QgaDsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworICBpcCA9IChzdHJ1Y3Qgc29hcF9pbGlzdCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2lsaXN0KSArIHN0cmxlbihpZCkpOworICBpZiAoaXApCisgIHsgaCA9IHNvYXBfaGFzaChpZCk7CisgICAgc3RyY3B5KGlwLT5pZCwgaWQpOworICAgIGlwLT5uZXh0ID0gc29hcC0+aWh0W2hdOworICAgIHNvYXAtPmlodFtoXSA9IGlwOworICAgIHJldHVybiBpcDsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZCoKK1NPQVBfRk1BQzIKK3NvYXBfbWFsbG9jKHN0cnVjdCBzb2FwICpzb2FwLCBzaXplX3QgbikKK3sgcmVnaXN0ZXIgY2hhciAqcDsKKyAgaWYgKCFuKQorICAgIHJldHVybiAodm9pZCopU09BUF9OT05fTlVMTDsKKyAgaWYgKCFzb2FwKQorICAgIHJldHVybiBTT0FQX01BTExPQyhzb2FwLCBuKTsKKyAgbiArPSAoLShsb25nKW4pICYgKHNpemVvZih2b2lkKiktMSk7IC8qIGFsaWduIGF0IDQtLCA4LSBvciAxNi1ieXRlIGJvdW5kYXJ5ICovCisgIGlmICghKHAgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgbiArIHNpemVvZih2b2lkKikgKyBzaXplb2Yoc2l6ZV90KSkpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgLyoga2VlcCBjaGFpbiBvZiBhbGxvY2VkIGNlbGxzIGZvciBsYXRlciBkZXN0cnVjdGlvbiAqLworICBzb2FwLT5hbGxvY2VkID0gMTsKKyAgKih2b2lkKiopKHAgKyBuKSA9IHNvYXAtPmFsaXN0OworICAqKHNpemVfdCopKHAgKyBuICsgc2l6ZW9mKHZvaWQqKSkgPSBuOworICBzb2FwLT5hbGlzdCA9IHAgKyBuOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK3N0YXRpYyB2b2lkCitzb2FwX2luaXRfbWh0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IChpbnQpU09BUF9QVFJIQVNIOyBpKyspCisgICAgc29hcC0+bWh0W2ldID0gTlVMTDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK3N0YXRpYyB2b2lkCitzb2FwX2ZyZWVfbWh0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbWxpc3QgKm1wLCAqbXE7CisgIGZvciAoaSA9IDA7IGkgPCAoaW50KVNPQVBfUFRSSEFTSDsgaSsrKQorICB7IGZvciAobXAgPSBzb2FwLT5taHRbaV07IG1wOyBtcCA9IG1xKQorICAgIHsgbXEgPSBtcC0+bmV4dDsKKyAgICAgIGlmIChtcC0+bGl2ZSkKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyglZCk6IG1hbGxvYygpID0gJXAgbm90IGZyZWVkIChtZW1vcnkgbGVhayBvciBmb3Jnb3QgdG8gY2FsbCBzb2FwX2VuZCgpPylcbiIsIG1wLT5maWxlLCBtcC0+bGluZSwgbXAtPnB0cik7CisgICAgICBmcmVlKG1wKTsKKyAgICB9CisgICAgc29hcC0+bWh0W2ldID0gTlVMTDsKKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworU09BUF9GTUFDMQordm9pZCoKK1NPQVBfRk1BQzIKK3NvYXBfdHJhY2tfbWFsbG9jKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgc2l6ZV90IHNpemUpCit7IHJlZ2lzdGVyIHZvaWQgKnAgPSBtYWxsb2Moc2l6ZSk7CisgIGlmIChzb2FwKQorICB7IHJlZ2lzdGVyIGludCBoID0gc29hcF9oYXNoX3B0cihwKTsKKyAgICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9tbGlzdCAqbXAgPSAoc3RydWN0IHNvYXBfbWxpc3QqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHNvYXBfbWxpc3QpKTsKKyAgICBpZiAoc29hcC0+ZmRlYnVnW1NPQVBfSU5ERVhfVEVTVF0pCisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIiVzKCVkKTogbWFsbG9jKCVsdSkgPSAlcFxuIiwgZmlsZSwgbGluZSwgKHVuc2lnbmVkIGxvbmcpc2l6ZSwgcCkpOworICAgIG1wLT5uZXh0ID0gc29hcC0+bWh0W2hdOworICAgIG1wLT5wdHIgPSBwOworICAgIG1wLT5maWxlID0gZmlsZTsKKyAgICBtcC0+bGluZSA9IGxpbmU7CisgICAgbXAtPmxpdmUgPSAxOworICAgIHNvYXAtPm1odFtoXSA9IG1wOworICB9CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF90cmFja19mcmVlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgdm9pZCAqcCkKK3sgcmVnaXN0ZXIgaW50IGggPSBzb2FwX2hhc2hfcHRyKHApOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9tbGlzdCAqbXA7CisgIGZvciAobXAgPSBzb2FwLT5taHRbaF07IG1wOyBtcCA9IG1wLT5uZXh0KQorICAgIGlmIChtcC0+cHRyID09IHApCisgICAgICBicmVhazsKKyAgaWYgKG1wKQorICB7IGlmIChtcC0+bGl2ZSkKKyAgICB7IGZyZWUocCk7CisgICAgICBpZiAoc29hcC0+ZmRlYnVnW1NPQVBfSU5ERVhfVEVTVF0pCisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiJXMoJWQpOiBmcmVlKCVwKVxuIiwgZmlsZSwgbGluZSwgcCkpOworICAgICAgbXAtPmxpdmUgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzKCVkKTogZnJlZSglcCkgZG91YmxlIGZyZWUgb2YgcG9pbnRlciBtYWxsb2NlZCBhdCAlcyglZClcbiIsIGZpbGUsIGxpbmUsIHAsIG1wLT5maWxlLCBtcC0+bGluZSk7CisgIH0KKyAgZWxzZQorICAgIGZwcmludGYoc3RkZXJyLCAiJXMoJWQpOiBmcmVlKCVwKSBwb2ludGVyIG5vdCBtYWxsb2NlZFxuIiwgZmlsZSwgbGluZSwgcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitzdGF0aWMgdm9pZAorc29hcF90cmFja191bmxpbmsoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnApCit7IHJlZ2lzdGVyIGludCBoID0gc29hcF9oYXNoX3B0cihwKTsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbWxpc3QgKm1wOworICBmb3IgKG1wID0gc29hcC0+bWh0W2hdOyBtcDsgbXAgPSBtcC0+bmV4dCkKKyAgICBpZiAobXAtPnB0ciA9PSBwKQorICAgICAgYnJlYWs7CisgIGlmIChtcCkKKyAgICBtcC0+bGl2ZSA9IDA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2RlYWxsb2Moc3RydWN0IHNvYXAgKnNvYXAsIHZvaWQgKnApCit7IGlmICghc29hcCkKKyAgICByZXR1cm47CisgIGlmIChwKQorICB7IHJlZ2lzdGVyIGNoYXIgKipxOworICAgIGZvciAocSA9IChjaGFyKiopJnNvYXAtPmFsaXN0OyAqcTsgcSA9ICooY2hhcioqKilxKQorICAgIHsgaWYgKHAgPT0gKHZvaWQqKSgqcSAtICooc2l6ZV90KikoKnEgKyBzaXplb2Yodm9pZCopKSkpCisgICAgICB7ICpxID0gKiooY2hhcioqKilxOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWVkIGRhdGEgYXQgJXBcbiIsIHApKTsKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHApOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICAgIHNvYXBfZGVsZXRlKHNvYXAsIHApOworICB9CisgIGVsc2UKKyAgeyByZWdpc3RlciBjaGFyICpxOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZSBhbGwgc29hcF9tYWxsb2MoKSBkYXRhXG4iKSk7CisgICAgd2hpbGUgKHNvYXAtPmFsaXN0KQorICAgIHsgcSA9IChjaGFyKilzb2FwLT5hbGlzdDsKKyAgICAgIHNvYXAtPmFsaXN0ID0gKih2b2lkKiopcTsKKyAgICAgIHEgLT0gKihzaXplX3QqKShxICsgc2l6ZW9mKHZvaWQqKSk7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgcSk7CisgICAgfQorICB9CisgIC8qIHdlIG11c3QgYXNzdW1lIHRoZXNlIHdlcmUgZGVhbGxvY2F0ZWQ6ICovCisgIHNvYXAtPmFjdGlvbiA9IE5VTEw7CisgIHNvYXAtPmZhdWx0ID0gTlVMTDsKKyAgc29hcC0+aGVhZGVyID0gTlVMTDsKKyAgc29hcC0+dXNlcmlkID0gTlVMTDsKKyAgc29hcC0+cGFzc3dkID0gTlVMTDsKKyAgc29hcC0+YXV0aHJlYWxtID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcF9jbHJfbWltZShzb2FwKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9kZWxldGUoc3RydWN0IHNvYXAgKnNvYXAsIHZvaWQgKnApCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2NsaXN0ICoqY3A7CisgIGlmIChzb2FwX2NoZWNrX3N0YXRlKHNvYXApKQorICAgIHJldHVybjsKKyAgY3AgPSAmc29hcC0+Y2xpc3Q7CisgIGlmIChwKQorICB7IHdoaWxlICgqY3ApCisgICAgeyBpZiAocCA9PSAoKmNwKS0+cHRyKQorICAgICAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9jbGlzdCAqcSA9ICpjcDsKKyAgICAgICAgKmNwID0gcS0+bmV4dDsKKyAgICAgICAgcS0+ZmRlbGV0ZShxKTsKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHEpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBjcCA9ICYoKmNwKS0+bmV4dDsKKyAgICB9CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgZGVhbGxvYyBkYXRhICVwOiBhZGRyZXNzIG5vdCBpbiBsaXN0XG4iLCBwKSk7CisgIH0KKyAgZWxzZQorICB7IHdoaWxlICgqY3ApCisgICAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9jbGlzdCAqcSA9ICpjcDsKKyAgICAgICpjcCA9IHEtPm5leHQ7CisgICAgICBpZiAocS0+cHRyID09ICh2b2lkKilzb2FwLT5mYXVsdCkKKyAgICAgICAgc29hcC0+ZmF1bHQgPSBOVUxMOyAvKiB0aGlzIHdhcyBkZWFsbG9jYXRlZCAqLworICAgICAgZWxzZSBpZiAocS0+cHRyID09ICh2b2lkKilzb2FwLT5oZWFkZXIpCisgICAgICAgIHNvYXAtPmhlYWRlciA9IE5VTEw7IC8qIHRoaXMgd2FzIGRlYWxsb2NhdGVkICovCisgICAgICBxLT5mZGVsZXRlKHEpOworICAgICAgU09BUF9GUkVFKHNvYXAsIHEpOworICAgIH0KKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorc3RydWN0IHNvYXBfY2xpc3QgKgorU09BUF9GTUFDMgorc29hcF9saW5rKHN0cnVjdCBzb2FwICpzb2FwLCB2b2lkICpwLCBpbnQgdCwgaW50IG4sIHZvaWQgKCpmZGVsZXRlKShzdHJ1Y3Qgc29hcF9jbGlzdCopKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9jbGlzdCAqY3A7CisgIGlmICgoY3AgPSAoc3RydWN0IHNvYXBfY2xpc3QqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9jbGlzdCkpKSkKKyAgeyBjcC0+bmV4dCA9IHNvYXAtPmNsaXN0OworICAgIGNwLT50eXBlID0gdDsKKyAgICBjcC0+c2l6ZSA9IG47IAorICAgIGNwLT5wdHIgPSBwOworICAgIGNwLT5mZGVsZXRlID0gZmRlbGV0ZTsKKyAgICBzb2FwLT5jbGlzdCA9IGNwOworICB9CisgIHJldHVybiBjcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfdW5saW5rKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwKQoreyByZWdpc3RlciBjaGFyICoqcTsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfY2xpc3QgKipjcDsKKyAgaWYgKCFzb2FwIHx8ICFwKQorICAgIHJldHVybjsKKyAgZm9yIChxID0gKGNoYXIqKikmc29hcC0+YWxpc3Q7ICpxOyBxID0gKihjaGFyKioqKXEpCisgIHsgaWYgKHAgPT0gKHZvaWQqKSgqcSAtICooc2l6ZV90KikoKnEgKyBzaXplb2Yodm9pZCopKSkpCisgICAgeyAqcSA9ICoqKGNoYXIqKiopcTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVW5saW5rZWQgZGF0YSAlcFxuIiwgcCkpOworI2lmZGVmIFNPQVBfREVCVUcKKyAgICAgIHNvYXBfdHJhY2tfdW5saW5rKHNvYXAsIHApOworI2VuZGlmCisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIGZvciAoY3AgPSAmc29hcC0+Y2xpc3Q7ICpjcDsgY3AgPSAmKCpjcCktPm5leHQpCisgIHsgaWYgKHAgPT0gKCpjcCktPnB0cikKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVW5saW5rZWQgY2xhc3MgaW5zdGFuY2UgJXBcbiIsIHApKTsKKyAgICAgIHEgPSAoY2hhcioqKSpjcDsKKyAgICAgICpjcCA9ICgqY3ApLT5uZXh0OworICAgICAgU09BUF9GUkVFKHNvYXAsIHEpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9sb29rdXBfdHlwZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgaWYgKGlkICYmICppZCkKKyAgeyBpcCA9IHNvYXBfbG9va3VwKHNvYXAsIGlkKTsKKyAgICBpZiAoaXApCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkxvb2t1cCBpZD0nJXMnIHR5cGU9JWRcbiIsIGlkLCBpcC0+dHlwZSkpOworICAgICAgcmV0dXJuIGlwLT50eXBlOworICAgIH0KKyAgfQorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImxvb2t1cCB0eXBlIGlkPSclcycgTk9UIEZPVU5EISBOZWVkIHRvIGdldCBpdCBmcm9tIHhzaTp0eXBlXG4iLCBpZCkpOworICByZXR1cm4gMDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQqCitTT0FQX0ZNQUMyCitzb2FwX2lkX2xvb2t1cChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIHZvaWQgKipwLCBpbnQgdCwgc2l6ZV90IG4sIHVuc2lnbmVkIGludCBrKQoreyBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIHZvaWQgKipxOworICBpZiAoIXAgfHwgIWlkIHx8ICEqaWQpCisgICAgcmV0dXJuIHA7CisgIGlwID0gc29hcF9sb29rdXAoc29hcCwgaWQpOyAvKiBsb29rdXAgcG9pbnRlciB0byBoYXNoIHRhYmxlIGVudHJ5IGZvciBzdHJpbmcgaWQgKi8KKyAgaWYgKCFpcCkKKyAgeyBpcCA9IHNvYXBfZW50ZXIoc29hcCwgaWQpOyAvKiBuZXcgaGFzaCB0YWJsZSBlbnRyeSBmb3Igc3RyaW5nIGlkICovCisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGb3J3YXJkaW5nIGZpcnN0IGhyZWY9JyVzJyB0eXBlPSVkICVwICgldSBieXRlcylcbiIsIGlkLCB0LCBwLCAodW5zaWduZWQgaW50KW4pKTsKKyAgICBpcC0+dHlwZSA9IHQ7CisgICAgaXAtPnNpemUgPSBuOyAKKyAgICBpcC0+bGluayA9IHA7CisgICAgaXAtPmNvcHkgPSBOVUxMOworICAgIGlwLT5mbGlzdCA9IE5VTEw7CisgICAgaXAtPnB0ciA9IE5VTEw7CisgICAgaXAtPmxldmVsID0gazsKKyAgICAqcCA9IE5VTEw7CisgIH0KKyAgZWxzZSBpZiAoaXAtPnB0cikKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc29sdmVkIGhyZWY9JyVzJyB0eXBlPSVkIGxvY2F0aW9uPSVwICgldSBieXRlcylcbiIsIGlkLCB0LCBpcC0+cHRyLCAodW5zaWduZWQgaW50KW4pKTsKKyAgICBpZiAoaXAtPnR5cGUgIT0gdCkKKyAgICB7IHN0cmNweShzb2FwLT5pZCwgaWQpOworICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0hSRUY7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlR5cGUgaW5jb21wYXRpYmlsaXR5OiBpZCB0eXBlPSVkIGhyZWYgdHlwZT0lZFxuIiwgaXAtPnR5cGUsIHQpKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB3aGlsZSAoaXAtPmxldmVsIDwgaykKKyAgICB7IHEgPSAodm9pZCoqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZih2b2lkKikpOyAgCisgICAgICBpZiAoIXEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgKnAgPSAodm9pZCopcTsKKyAgICAgIHAgPSBxOworICAgICAgay0tOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJEZXNjZW5kaW5nIG9uZSBsZXZlbC4uLlxuIikpOworICAgIH0KKyAgICAqcCA9IGlwLT5wdHI7CisgIH0KKyAgZWxzZSBpZiAoaXAtPmxldmVsID4gaykKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc29sdmluZyBsZXZlbCAldSBwb2ludGVycyB0byBocmVmPSclcydcbiIsIGlwLT5sZXZlbCwgaWQpKTsKKyAgICB3aGlsZSAoaXAtPmxldmVsID4gaykKKyAgICB7IHZvaWQgKnMsICoqciA9ICZpcC0+bGluazsKKyAgICAgIHEgPSAodm9pZCoqKWlwLT5saW5rOworICAgICAgd2hpbGUgKHEpCisgICAgICB7ICpyID0gKHZvaWQqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZih2b2lkKikpOworICAgICAgICBzID0gKnE7CisgICAgICAgICpxID0gKnI7CisgICAgICAgIHIgPSAodm9pZCoqKSpyOworICAgICAgICBxID0gKHZvaWQqKilzOworICAgICAgfQorICAgICAgKnIgPSBOVUxMOworICAgICAgaXAtPnNpemUgPSBuOyAKKyAgICAgIGlwLT5jb3B5ID0gTlVMTDsKKyAgICAgIGlwLT5sZXZlbCA9IGlwLT5sZXZlbCAtIDE7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlc2NlbmRpbmcgb25lIGxldmVsLi4uXG4iKSk7CisgICAgfQorICAgIHEgPSAodm9pZCoqKWlwLT5saW5rOworICAgIGlwLT5saW5rID0gcDsKKyAgICAqcCA9ICh2b2lkKilxOworICB9CisgIGVsc2UKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZvcndhcmRlZCBocmVmPSclcycgdHlwZT0lZCBsb2NhdGlvbj0lcCAoJXUgYnl0ZXMpXG4iLCBpZCwgdCwgcCwgKHVuc2lnbmVkIGludCluKSk7CisgICAgd2hpbGUgKGlwLT5sZXZlbCA8IGspCisgICAgeyBxID0gKHZvaWQqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yodm9pZCopKTsgIAorICAgICAgKnAgPSBxOworICAgICAgcCA9IHE7CisgICAgICBrLS07CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlc2NlbmRpbmcgb25lIGxldmVsLi4uXG4iKSk7CisgICAgfQorICAgIHEgPSAodm9pZCoqKWlwLT5saW5rOworICAgIGlwLT5saW5rID0gcDsKKyAgICAqcCA9ICh2b2lkKilxOworICB9CisgIHJldHVybiBwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZCoKK1NPQVBfRk1BQzIKK3NvYXBfaWRfZm9yd2FyZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaHJlZiwgdm9pZCAqcCwgc2l6ZV90IGxlbiwgaW50IHN0LCBpbnQgdHQsIHNpemVfdCBuLCB1bnNpZ25lZCBpbnQgaywgdm9pZCAoKmZjb3B5KShzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgc2l6ZV90LCBjb25zdCB2b2lkKiwgc2l6ZV90KSkKK3sgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworICBpZiAoIXAgfHwgIWhyZWYgfHwgISpocmVmKQorICAgIHJldHVybiBwOworICBpcCA9IHNvYXBfbG9va3VwKHNvYXAsIGhyZWYpOyAvKiBsb29rdXAgcG9pbnRlciB0byBoYXNoIHRhYmxlIGVudHJ5IGZvciBzdHJpbmcgaWQgKi8KKyAgaWYgKCFpcCkKKyAgeyBpcCA9IHNvYXBfZW50ZXIoc29hcCwgaHJlZik7IC8qIG5ldyBoYXNoIHRhYmxlIGVudHJ5IGZvciBzdHJpbmcgaWQgKi8KKyAgICBpcC0+dHlwZSA9IHN0OworICAgIGlwLT5zaXplID0gbjsKKyAgICBpcC0+bGluayA9IE5VTEw7CisgICAgaXAtPmNvcHkgPSBOVUxMOworICAgIGlwLT5wdHIgPSBOVUxMOworICAgIGlwLT5sZXZlbCA9IDA7CisgICAgaXAtPmZsaXN0ID0gTlVMTDsKKyAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiTmV3IGVudHJ5IGhyZWY9JyVzJyB0eXBlPSVkIHNpemU9JWx1IGxldmVsPSVkIGxvY2F0aW9uPSVwXG4iLCBocmVmLCBzdCwgKHVuc2lnbmVkIGxvbmcpbiwgaywgcCkpOworICB9CisgIGVsc2UgaWYgKGlwLT50eXBlICE9IHN0IHx8IChpcC0+bGV2ZWwgPT0gayAmJiBpcC0+c2l6ZSAhPSBuKSkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlR5cGUgaW5jb21wYXRpYmlsaXR5IGlkPSclcycgZXhwZWN0IHR5cGU9JWQgc2l6ZT0lbHUgbGV2ZWw9JXUgZ290IHR5cGU9JWQgc2l6ZT0lbHVcbiIsIGhyZWYsIGlwLT50eXBlLCAodW5zaWduZWQgbG9uZylpcC0+c2l6ZSwgaywgc3QsICh1bnNpZ25lZCBsb25nKW4pKTsKKyAgICBzdHJjcHkoc29hcC0+aWQsIGhyZWYpOworICAgIHNvYXAtPmVycm9yID0gU09BUF9IUkVGOworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChmY29weSB8fCBuIDwgc2l6ZW9mKHZvaWQqKSB8fCAqaHJlZiAhPSAnIycpCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZmxpc3QgKmZwID0gKHN0cnVjdCBzb2FwX2ZsaXN0KilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfZmxpc3QpKTsKKyAgICBpZiAoIWZwKQorICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmcC0+bmV4dCA9IGlwLT5mbGlzdDsKKyAgICBmcC0+dHlwZSA9IHR0OworICAgIGZwLT5wdHIgPSBwOworICAgIGZwLT5sZXZlbCA9IGs7CisgICAgZnAtPmxlbiA9IGxlbjsKKyAgICBpZiAoZmNvcHkpCisgICAgICBmcC0+ZmNvcHkgPSBmY29weTsKKyAgICBlbHNlCisgICAgICBmcC0+ZmNvcHkgPSBzb2FwX2Zjb3B5OworICAgIGlwLT5mbGlzdCA9IGZwOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRm9yd2FyZGluZyB0eXBlPSVkICh0YXJnZXQgdHlwZT0lZCkgc2l6ZT0lbHUgbG9jYXRpb249JXAgbGV2ZWw9JXUgbGVuPSVsdSBocmVmPSclcydcbiIsIHN0LCB0dCwgKHVuc2lnbmVkIGxvbmcpbiwgcCwgaywgKHVuc2lnbmVkIGxvbmcpbGVuLCBocmVmKSk7CisgIH0KKyAgZWxzZQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRm9yd2FyZGluZyBjb3B5aW5nIGFkZHJlc3MgJXAgZm9yIHR5cGU9JWQgaHJlZj0nJXMnXG4iLCBwLCBzdCwgaHJlZikpOworICAgICoodm9pZCoqKXAgPSBpcC0+Y29weTsKKyAgICBpcC0+Y29weSA9IHA7CisgIH0KKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQqCitTT0FQX0ZNQUMyCitzb2FwX2lkX2VudGVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgdm9pZCAqcCwgaW50IHQsIHNpemVfdCBuLCB1bnNpZ25lZCBpbnQgaywgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqYXJyYXlUeXBlLCB2b2lkICooKmZpbnN0YW50aWF0ZSkoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90KikpCit7CisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisjZW5kaWYKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVudGVyIGlkPSclcycgdHlwZT0lZCBsb2M9JXAgc2l6ZT0lbHUgbGV2ZWw9JXVcbiIsIGlkLCB0LCBwLCAodW5zaWduZWQgbG9uZyluLCBrKSk7CisgIHNvYXAtPmFsbG9jZWQgPSAwOworICBpZiAoIXApCisgIHsgaWYgKGZpbnN0YW50aWF0ZSkKKyAgICAgIHAgPSBmaW5zdGFudGlhdGUoc29hcCwgdCwgdHlwZSwgYXJyYXlUeXBlLCAmbik7CisgICAgZWxzZQorICAgICAgcCA9IHNvYXBfbWFsbG9jKHNvYXAsIG4pOworICAgIGlmIChwKQorICAgICAgc29hcC0+YWxsb2NlZCA9IDE7CisgIH0KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgIGlmICghaWQgfHwgISppZCkKKyNlbmRpZgorICAgIHJldHVybiBwOworI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgaXAgPSBzb2FwX2xvb2t1cChzb2FwLCBpZCk7IC8qIGxvb2t1cCBwb2ludGVyIHRvIGhhc2ggdGFibGUgZW50cnkgZm9yIHN0cmluZyBpZCAqLworICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiTG9va3VwIGVudHJ5IGlkPSclcyBmb3IgbG9jYXRpb249JXAnXG4iLCBpZCwgcCkpOworICBpZiAoIWlwKQorICB7IGlwID0gc29hcF9lbnRlcihzb2FwLCBpZCk7IC8qIG5ldyBoYXNoIHRhYmxlIGVudHJ5IGZvciBzdHJpbmcgaWQgKi8KKyAgICBpcC0+dHlwZSA9IHQ7CisgICAgaXAtPmxpbmsgPSBOVUxMOworICAgIGlwLT5jb3B5ID0gTlVMTDsKKyAgICBpcC0+Zmxpc3QgPSBOVUxMOworICAgIGlwLT5zaXplID0gbjsKKyAgICBpcC0+cHRyID0gcDsKKyAgICBpcC0+bGV2ZWwgPSBrOworICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJOZXcgZW50cnkgaWQ9JyVzJyB0eXBlPSVkIHNpemU9JWx1IGxldmVsPSV1IGxvY2F0aW9uPSVwXG4iLCBpZCwgdCwgKHVuc2lnbmVkIGxvbmcpbiwgaywgcCkpOworICB9CisgIGVsc2UgaWYgKChpcC0+dHlwZSAhPSB0IHx8IChpcC0+bGV2ZWwgPT0gayAmJiBpcC0+c2l6ZSAhPSBuKSkgJiYgKGlwLT5jb3B5IHx8IGlwLT5mbGlzdCkpCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJUeXBlIGluY29tcGF0aWJpbGl0eSBpZD0nJXMnIGV4cGVjdCB0eXBlPSVkIHNpemU9JWx1IGxldmVsPSV1IGdvdCB0eXBlPSVkIHNpemU9JWx1XG4iLCBpZCwgaXAtPnR5cGUsICh1bnNpZ25lZCBsb25nKWlwLT5zaXplLCBrLCB0LCAodW5zaWduZWQgbG9uZyluKSk7CisgICAgc3RyY3B5KHNvYXAtPmlkLCBpZCk7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0hSRUY7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZWxzZSBpZiAoaXAtPnB0cikKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk11bHRpcGx5IGRlZmluZWQgaWQ9JyVzJ1xuIiwgaWQpKTsKKyAgICBzdHJjcHkoc29hcC0+aWQsIGlkKTsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfRFVQTElDQVRFX0lEOworICAgIHJldHVybiBOVUxMOworICB9CisgIGVsc2UgCisgIHsgaXAtPnNpemUgPSBuOworICAgIGlwLT5wdHIgPSBwOworICAgIGlwLT5sZXZlbCA9IGs7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVcGRhdGUgZW50cnkgaWQ9JyVzJyB0eXBlPSVkIGxvY2F0aW9uPSVwIHNpemU9JWx1IGxldmVsPSV1XG4iLCBpZCwgdCwgcCwgKHVuc2lnbmVkIGxvbmcpbiwgaykpOworICB9CisgIHJldHVybiBpcC0+cHRyOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2Zjb3B5KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3QsIGludCB0dCwgdm9pZCAqcCwgc2l6ZV90IGxlbiwgY29uc3Qgdm9pZCAqcSwgc2l6ZV90IG4pCit7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5aW5nIGRhdGEgdHlwZT0lZCAodGFyZ2V0IHR5cGU9JWQpICVwIC0+ICVwICglbHUgYnl0ZXMpXG4iLCBzdCwgdHQsIHEsIHAsICh1bnNpZ25lZCBsb25nKW4pKTsKKyAgbWVtY3B5KHAsIHEsIG4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VuZF9zZW5kKHN0cnVjdCBzb2FwICpzb2FwKQoreyAKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPmRpbWUubGlzdCkKKyAgeyAvKiBTT0FQIGJvZHkgcmVmZXJlbmNlZCBhdHRhY2htZW50cyBtdXN0IGFwcGVhciBmaXJzdCAqLworICAgIHNvYXAtPmRpbWUubGFzdC0+bmV4dCA9IHNvYXAtPmRpbWUuZmlyc3Q7CisgICAgc29hcC0+ZGltZS5maXJzdCA9IHNvYXAtPmRpbWUubGlzdC0+bmV4dDsKKyAgICBzb2FwLT5kaW1lLmxpc3QtPm5leHQgPSBOVUxMOworICAgIHNvYXAtPmRpbWUubGFzdCA9IHNvYXAtPmRpbWUubGlzdDsKKyAgfQorICBpZiAoc29hcF9wdXRkaW1lKHNvYXApIHx8IHNvYXBfcHV0bWltZShzb2FwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHNvYXAtPm1pbWUubGlzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmxhc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmxpc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5sYXN0ID0gTlVMTDsKKyNlbmRpZgorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBzZW5kXG4iKSk7CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JTykgLyogbmVlZCB0byBmbHVzaCB0aGUgcmVtYWluaW5nIGRhdGEgaW4gYnVmZmVyICovCisgIHsgaWYgKHNvYXBfZmx1c2goc29hcCkpCisjaWZkZWYgV0lUSF9aTElCCisgICAgeyBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIgJiYgc29hcC0+emxpYl9zdGF0ZSA9PSBTT0FQX1pMSUJfREVGTEFURSkKKyAgICAgIHsgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9OT05FOworICAgICAgICBkZWZsYXRlRW5kKCZzb2FwLT5kX3N0cmVhbSk7CisgICAgICB9CisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorI2Vsc2UKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNlbmRpZgorI2lmZGVmIFdJVEhfWkxJQgorICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQikKKyAgICB7IGludCByOworICAgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4gPSAwOworICAgICAgZG8KKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJEZWZsYXRpbmcgcmVtYWluZGVyXG4iKSk7CisgICAgICAgIHIgPSBkZWZsYXRlKCZzb2FwLT5kX3N0cmVhbSwgWl9GSU5JU0gpOworICAgICAgICBpZiAoc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0ICE9IFNPQVBfQlVGTEVOKQorICAgICAgICB7IGlmIChzb2FwX2ZsdXNoX3Jhdyhzb2FwLCBzb2FwLT56X2J1ZiwgU09BUF9CVUZMRU4gLSBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQpKQorICAgICAgICAgIHsgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9OT05FOworICAgICAgICAgICAgZGVmbGF0ZUVuZCgmc29hcC0+ZF9zdHJlYW0pOworICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworCSAgfQorICAgICAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gKEJ5dGUqKXNvYXAtPnpfYnVmOworICAgICAgICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCA9IFNPQVBfQlVGTEVOOworICAgICAgICB9CisgICAgICB9IHdoaWxlIChyID09IFpfT0spOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJEZWZsYXRlZCAlbHUtPiVsdSBieXRlc1xuIiwgc29hcC0+ZF9zdHJlYW0udG90YWxfaW4sIHNvYXAtPmRfc3RyZWFtLnRvdGFsX291dCkpOworICAgICAgc29hcC0+el9yYXRpb19vdXQgPSAoZmxvYXQpc29hcC0+ZF9zdHJlYW0udG90YWxfb3V0IC8gKGZsb2F0KXNvYXAtPmRfc3RyZWFtLnRvdGFsX2luOworICAgICAgc29hcC0+bW9kZSAmPSB+U09BUF9FTkNfWkxJQjsKKyAgICAgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfTk9ORTsKKyAgICAgIGlmIChkZWZsYXRlRW5kKCZzb2FwLT5kX3N0cmVhbSkgIT0gWl9PSyB8fCByICE9IFpfU1RSRUFNX0VORCkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVbmFibGUgdG8gZW5kIGRlZmxhdGU6ICVzXG4iLCBzb2FwLT5kX3N0cmVhbS5tc2c/c29hcC0+ZF9zdHJlYW0ubXNnOiIiKSk7CisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICAgIH0KKyNpZmRlZiBXSVRIX0daSVAKKyAgICAgIHNvYXAtPnpfYnVmWzBdID0gc29hcC0+el9jcmMgJiAweEZGOworICAgICAgc29hcC0+el9idWZbMV0gPSAoc29hcC0+el9jcmMgPj4gOCkgJiAweEZGOworICAgICAgc29hcC0+el9idWZbMl0gPSAoc29hcC0+el9jcmMgPj4gMTYpICYgMHhGRjsKKyAgICAgIHNvYXAtPnpfYnVmWzNdID0gKHNvYXAtPnpfY3JjID4+IDI0KSAmIDB4RkY7CisgICAgICBzb2FwLT56X2J1Zls0XSA9IHNvYXAtPmRfc3RyZWFtLnRvdGFsX2luICYgMHhGRjsKKyAgICAgIHNvYXAtPnpfYnVmWzVdID0gKHNvYXAtPmRfc3RyZWFtLnRvdGFsX2luID4+IDgpICYgMHhGRjsKKyAgICAgIHNvYXAtPnpfYnVmWzZdID0gKHNvYXAtPmRfc3RyZWFtLnRvdGFsX2luID4+IDE2KSAmIDB4RkY7CisgICAgICBzb2FwLT56X2J1Zls3XSA9IChzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiA+PiAyNCkgJiAweEZGOworICAgICAgaWYgKHNvYXBfZmx1c2hfcmF3KHNvYXAsIHNvYXAtPnpfYnVmLCA4KSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJnemlwIGNyYzMyPSVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpc29hcC0+el9jcmMpKTsKKyNlbmRpZgorICAgIH0KKyNlbmRpZgorICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fU1RPUkUpCisgICAgeyBjaGFyICpwOworI2lmbmRlZiBXSVRIX05PSFRUUAorICAgICAgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1hNTCkpCisgICAgICB7IHNvYXAtPm1vZGUtLTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTZW5kaW5nIGJ1ZmZlcmVkIG1lc3NhZ2Ugb2YgbGVuZ3RoICV1XG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmJsaXN0LT5zaXplKSk7CisgICAgICAgIGlmIChzb2FwLT5zdGF0dXMgPj0gU09BUF9QT1NUKQorICAgICAgICAgIHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3Qoc29hcCwgc29hcC0+ZW5kcG9pbnQsIHNvYXAtPmhvc3QsIHNvYXAtPnBvcnQsIHNvYXAtPnBhdGgsIHNvYXAtPmFjdGlvbiwgc29hcC0+Ymxpc3QtPnNpemUpOworICAgICAgICBlbHNlIGlmIChzb2FwLT5zdGF0dXMgIT0gU09BUF9TVE9QKQorICAgICAgICAgIHNvYXAtPmVycm9yID0gc29hcC0+ZnJlc3BvbnNlKHNvYXAsIHNvYXAtPnN0YXR1cywgc29hcC0+Ymxpc3QtPnNpemUpOworICAgICAgICBpZiAoc29hcC0+ZXJyb3IgfHwgc29hcF9mbHVzaChzb2FwKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHNvYXAtPm1vZGUrKzsKKyAgICAgIH0KKyNlbmRpZgorICAgICAgZm9yIChwID0gc29hcF9maXJzdF9ibG9jayhzb2FwKTsgcDsgcCA9IHNvYXBfbmV4dF9ibG9jayhzb2FwKSkKKyAgICAgIHsgREJHTVNHKFNFTlQsIHAsIHNvYXBfYmxvY2tfc2l6ZShzb2FwKSk7CisgICAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mc2VuZChzb2FwLCBwLCBzb2FwX2Jsb2NrX3NpemUoc29hcCkpKSkKKyAgICAgICAgeyBzb2FwX2VuZF9ibG9jayhzb2FwKTsKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHNvYXBfZW5kX2Jsb2NrKHNvYXApOworICAgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgICBlbHNlIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgICAgeyBEQkdNU0coU0VOVCwgIlxyXG4wXHJcblxyXG4iLCA3KTsKKyAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mc2VuZChzb2FwLCAiXHJcbjBcclxuXHJcbiIsIDcpKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyNlbmRpZgorICB9CisjaWZkZWYgV0lUSF9UQ1BGSU4KKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgaWYgKCFzb2FwLT5zc2wgJiYgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSAmJiAhc29hcC0+a2VlcF9hbGl2ZSAmJiAhKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIHNvYXAtPmZzaHV0ZG93bnNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAxKTsgLyogU2VuZCBUQ1AgRklOICovCisjZWxzZQorICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSAmJiAhc29hcC0+a2VlcF9hbGl2ZSAmJiAhKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIHNvYXAtPmZzaHV0ZG93bnNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAxKTsgLyogU2VuZCBUQ1AgRklOICovCisjZW5kaWYKKyNlbmRpZgorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBvZiBzZW5kIHBoYXNlXG4iKSk7CisgIHNvYXAtPm9tb2RlICY9IH5TT0FQX1hNTF9TRUM7CisgIHNvYXAtPmNvdW50ID0gMDsKKyAgc29hcC0+cGFydCA9IFNPQVBfRU5EOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbmRfcmVjdihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+cGFydCA9IFNPQVBfRU5EOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSAmJiBzb2FwX2dldGRpbWUoc29hcCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBzb2FwLT5kaW1lLmxpc3QgPSBzb2FwLT5kaW1lLmZpcnN0OworICBzb2FwLT5kaW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5sYXN0ID0gTlVMTDsKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkgJiYgc29hcF9nZXRtaW1lKHNvYXApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgc29hcC0+bWltZS5saXN0ID0gc29hcC0+bWltZS5maXJzdDsKKyAgc29hcC0+bWltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuYm91bmRhcnkgPSBOVUxMOworI2VuZGlmCisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgb2YgcmVjZWl2ZSBtZXNzYWdlIG9rXG4iKSk7CisjaWZkZWYgV0lUSF9aTElCCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQikKKyAgeyBzb2FwLT5tb2RlICY9IH5TT0FQX0VOQ19aTElCOworICAgIG1lbWNweShzb2FwLT5idWYsIHNvYXAtPnpfYnVmLCBTT0FQX0JVRkxFTik7CisgICAgc29hcC0+YnVmaWR4ID0gKGNoYXIqKXNvYXAtPmRfc3RyZWFtLm5leHRfaW4gLSBzb2FwLT56X2J1ZjsKKyAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT56X2J1ZmxlbjsKKyAgICBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX05PTkU7CisgICAgaWYgKGluZmxhdGVFbmQoJnNvYXAtPmRfc3RyZWFtKSAhPSBaX09LKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworI2lmZGVmIFdJVEhfR1pJUAorICAgIGlmIChzb2FwLT56bGliX2luID09IFNPQVBfWkxJQl9HWklQKQorICAgIHsgc29hcF93Y2hhciBjOworICAgICAgc2hvcnQgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICB7IGlmICgoaW50KShjID0gc29hcF9nZXRjaGFyKHNvYXApKSA9PSBFT0YpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgICAgIHNvYXAtPnpfYnVmW2ldID0gKGNoYXIpYzsKKyAgICAgIH0KKyAgICAgIGlmIChzb2FwLT56X2NyYyAhPSAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzBdIHwgKCh1TG9uZykodW5zaWduZWQgY2hhcilzb2FwLT56X2J1ZlsxXSA8PCA4KSB8ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbMl0gPDwgMTYpIHwgKCh1TG9uZykodW5zaWduZWQgY2hhcilzb2FwLT56X2J1ZlszXSA8PCAyNCkpKQorICAgICAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiR3ppcCBlcnJvcjogY3JjIGNoZWNrIGZhaWxlZCwgbWVzc2FnZSBjb3JydXB0ZWQ/IChjcmMzMj0lbHUpXG4iLCAodW5zaWduZWQgbG9uZylzb2FwLT56X2NyYykpOworICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgICB9CisgICAgICBpZiAoc29hcC0+ZF9zdHJlYW0udG90YWxfb3V0ICE9ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbNF0gfCAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzVdIDw8IDgpIHwgKCh1TG9uZykodW5zaWduZWQgY2hhcilzb2FwLT56X2J1Zls2XSA8PCAxNikgfCAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzddIDw8IDI0KSkpCisgICAgICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJHemlwIGVycm9yOiBpbmNvcnJlY3QgbWVzc2FnZSBsZW5ndGhcbiIpKTsKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgfQorICAgIH0KKyNlbmRpZgorICB9CisjZW5kaWYKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgICB3aGlsZSAoKGludClzb2FwX2dldGNoYXIoc29hcCkgIT0gRU9GKSAvKiBhZHZhbmNlIHRvIGxhc3QgY2h1bmsgKi8KKyAgICAgIDsKKyAgaWYgKHNvYXAtPmZkaXNjb25uZWN0ICYmIChzb2FwLT5lcnJvciA9IHNvYXAtPmZkaXNjb25uZWN0KHNvYXApKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICByZXR1cm4gc29hcF9yZXNvbHZlKHNvYXApOworI2Vsc2UKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPnhsaXN0KQorICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTUlNRV9IUkVGOworICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRElNRV9IUkVGOworICB9CisjZW5kaWYKKyAgcmV0dXJuIFNPQVBfT0s7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZnJlZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc3RydWN0IE5hbWVzcGFjZSAqbnM7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZSBuYW1lc3BhY2Ugc3RhY2tcbiIpKTsKKyAgd2hpbGUgKHNvYXAtPm5saXN0KQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucCA9IHNvYXAtPm5saXN0LT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5ubGlzdCk7CisgICAgc29hcC0+bmxpc3QgPSBucDsKKyAgfQorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWUgYW55IHJlbWFpbmluZyB0ZW1wIGJsb2Nrc1xuIikpOworICB3aGlsZSAoc29hcC0+Ymxpc3QpCisgICAgc29hcF9lbmRfYmxvY2soc29hcCk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZSBhdHRyaWJ1dGUgc3RvcmFnZVxuIikpOworICB3aGlsZSAoc29hcC0+YXR0cmlidXRlcykKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKnRwID0gc29hcC0+YXR0cmlidXRlcy0+bmV4dDsKKyAgICBpZiAoc29hcC0+YXR0cmlidXRlcy0+dmFsdWUpCisgICAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+YXR0cmlidXRlcy0+dmFsdWUpOworICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5hdHRyaWJ1dGVzKTsKKyAgICBzb2FwLT5hdHRyaWJ1dGVzID0gdHA7CisgIH0KKyNpZmRlZiBXSVRIX0ZBU1QKKyAgaWYgKHNvYXAtPmxhYmJ1ZikKKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+bGFiYnVmKTsKKyAgc29hcC0+bGFiYnVmID0gTlVMTDsKKyAgc29hcC0+bGFibGVuID0gMDsKKyAgc29hcC0+bGFiaWR4ID0gMDsKKyNlbmRpZgorICBucyA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXM7CisgIGlmIChucykKKyAgeyBmb3IgKDsgbnMtPmlkOyBucysrKQorICAgIHsgaWYgKG5zLT5vdXQpCisgICAgICB7IGlmIChzb2FwLT5lbmNvZGluZ1N0eWxlID09IG5zLT5vdXQpCisgICAgICAgICAgc29hcC0+ZW5jb2RpbmdTdHlsZSA9IFNPQVBfU1RSX0VPUzsKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIG5zLT5vdXQpOworICAgICAgICBucy0+b3V0ID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGlmIChzb2FwLT5lbmNvZGluZ1N0eWxlID09IG5zLT5ucykKKyAgICAgICAgc29hcC0+ZW5jb2RpbmdTdHlsZSA9IFNPQVBfU1RSX0VPUzsKKyAgICB9CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPmxvY2FsX25hbWVzcGFjZXMpOworICAgIHNvYXAtPmxvY2FsX25hbWVzcGFjZXMgPSBOVUxMOworICB9CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHdoaWxlIChzb2FwLT54bGlzdCkKKyAgeyBzdHJ1Y3Qgc29hcF94bGlzdCAqeHAgPSBzb2FwLT54bGlzdC0+bmV4dDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+eGxpc3QpOworICAgIHNvYXAtPnhsaXN0ID0geHA7CisgIH0KKyNlbmRpZgorI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgc29hcF9mcmVlX3BodChzb2FwKTsKKyAgc29hcF9mcmVlX2lodChzb2FwKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworc3RhdGljIHZvaWQKK3NvYXBfaW5pdF9sb2dzKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfTUFYTE9HUzsgaSsrKQorICB7IHNvYXAtPmxvZ2ZpbGVbaV0gPSBOVUxMOworICAgIHNvYXAtPmZkZWJ1Z1tpXSA9IE5VTEw7CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmICFkZWZpbmVkKFdJVEhfTEVBTikgfHwgZGVmaW5lZChTT0FQX0RFQlVHKQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9vcGVuX2xvZ2ZpbGUoc3RydWN0IHNvYXAgKnNvYXAsIGludCBpKQoreyBpZiAoc29hcC0+bG9nZmlsZVtpXSkKKyAgICBzb2FwLT5mZGVidWdbaV0gPSBmb3Blbihzb2FwLT5sb2dmaWxlW2ldLCBpIDwgMiA/ICJhYiIgOiAiYSIpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworc3RhdGljIHZvaWQKK3NvYXBfY2xvc2VfbG9nZmlsZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGkpCit7IGlmIChzb2FwLT5mZGVidWdbaV0pCisgIHsgZmNsb3NlKHNvYXAtPmZkZWJ1Z1tpXSk7CisgICAgc29hcC0+ZmRlYnVnW2ldID0gTlVMTDsKKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9jbG9zZV9sb2dmaWxlcyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX01BWExPR1M7IGkrKykKKyAgICBzb2FwX2Nsb3NlX2xvZ2ZpbGUoc29hcCwgaSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitzdGF0aWMgdm9pZAorc29hcF9zZXRfbG9nZmlsZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGksIGNvbnN0IGNoYXIgKmxvZ2ZpbGUpCit7IGNoYXIgKnMgPSBOVUxMOworICBzb2FwX2Nsb3NlX2xvZ2ZpbGUoc29hcCwgaSk7CisgIGlmIChzb2FwLT5sb2dmaWxlW2ldKQorICAgIFNPQVBfRlJFRShzb2FwLCAodm9pZCopc29hcC0+bG9nZmlsZVtpXSk7CisgIGlmIChsb2dmaWxlKQorICAgIGlmICgocyA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4obG9nZmlsZSkgKyAxKSkpCisgICAgICBzdHJjcHkocywgbG9nZmlsZSk7CisgIHNvYXAtPmxvZ2ZpbGVbaV0gPSBzOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfcmVjdl9sb2dmaWxlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpsb2dmaWxlKQoreyBzb2FwX3NldF9sb2dmaWxlKHNvYXAsIFNPQVBfSU5ERVhfUkVDViwgbG9nZmlsZSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9zZW50X2xvZ2ZpbGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmxvZ2ZpbGUpCit7IHNvYXBfc2V0X2xvZ2ZpbGUoc29hcCwgU09BUF9JTkRFWF9TRU5ULCBsb2dmaWxlKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X3Rlc3RfbG9nZmlsZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbG9nZmlsZSkKK3sgc29hcF9zZXRfbG9nZmlsZShzb2FwLCBTT0FQX0lOREVYX1RFU1QsIGxvZ2ZpbGUpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc3RydWN0IHNvYXAqCitTT0FQX0ZNQUMyCitzb2FwX2NvcHkoc3RydWN0IHNvYXAgKnNvYXApCit7IHJldHVybiBzb2FwX2NvcHlfY29udGV4dCgoc3RydWN0IHNvYXAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHNvYXApKSwgc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcCoKK1NPQVBfRk1BQzIKK3NvYXBfY29weV9jb250ZXh0KHN0cnVjdCBzb2FwICpjb3B5LCBzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXBfY2hlY2tfc3RhdGUoc29hcCkpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmIChjb3B5KQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BsdWdpbiAqcDsKKyAgICBtZW1jcHkoY29weSwgc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwKSk7CisgICAgY29weS0+c3RhdGUgPSBTT0FQX0NPUFk7CisgICAgY29weS0+dXNlciA9IE5VTEw7CisgICAgY29weS0+ZXJyb3IgPSBTT0FQX09LOworICAgIGNvcHktPnVzZXJpZCA9IE5VTEw7CisgICAgY29weS0+cGFzc3dkID0gTlVMTDsKKyAgICBjb3B5LT5ubGlzdCA9IE5VTEw7CisgICAgY29weS0+Ymxpc3QgPSBOVUxMOworICAgIGNvcHktPmNsaXN0ID0gTlVMTDsKKyAgICBjb3B5LT5hbGlzdCA9IE5VTEw7CisgICAgY29weS0+YXR0cmlidXRlcyA9IE5VTEw7CisjaWZkZWYgV0lUSF9GQVNUCisgICAgY29weS0+bGFiYnVmID0gTlVMTDsKKyAgICBjb3B5LT5sYWJsZW4gPSAwOworICAgIGNvcHktPmxhYmlkeCA9IDA7CisjZW5kaWYKKyNpZmRlZiBTT0FQX0RFQlVHCisgICAgc29hcF9pbml0X21odChjb3B5KTsKKyNlbmRpZgorICAgIGNvcHktPmxvY2FsX25hbWVzcGFjZXMgPSBOVUxMOworI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgICBzb2FwX2luaXRfaWh0KGNvcHkpOworICAgIHNvYXBfaW5pdF9waHQoY29weSk7CisjZW5kaWYKKyAgICBjb3B5LT5oZWFkZXIgPSBOVUxMOworICAgIGNvcHktPmZhdWx0ID0gTlVMTDsKKyAgICBjb3B5LT5hY3Rpb24gPSBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyNpZmRlZiBXSVRIX0NPT0tJRVMKKyAgICBjb3B5LT5jb29raWVzID0gc29hcF9jb3B5X2Nvb2tpZXMoY29weSk7CisjZWxzZQorICAgIGNvcHktPmNvb2tpZXMgPSBOVUxMOworI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBTT0FQX0RFQlVHCisgICAgc29hcF9pbml0X2xvZ3MoY29weSk7CisgICAgc29hcF9zZXRfcmVjdl9sb2dmaWxlKGNvcHksIHNvYXAtPmxvZ2ZpbGVbU09BUF9JTkRFWF9SRUNWXSk7CisgICAgc29hcF9zZXRfc2VudF9sb2dmaWxlKGNvcHksIHNvYXAtPmxvZ2ZpbGVbU09BUF9JTkRFWF9TRU5UXSk7CisgICAgc29hcF9zZXRfdGVzdF9sb2dmaWxlKGNvcHksIHNvYXAtPmxvZ2ZpbGVbU09BUF9JTkRFWF9URVNUXSk7CisjZW5kaWYKKyAgICBjb3B5LT5wbHVnaW5zID0gTlVMTDsKKyAgICBmb3IgKHAgPSBzb2FwLT5wbHVnaW5zOyBwOyBwID0gcC0+bmV4dCkKKyAgICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BsdWdpbiAqcSA9IChzdHJ1Y3Qgc29hcF9wbHVnaW4qKVNPQVBfTUFMTE9DKGNvcHksIHNpemVvZihzdHJ1Y3Qgc29hcF9wbHVnaW4pKTsKKyAgICAgIGlmICghcSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHlpbmcgcGx1Z2luICclcydcbiIsIHAtPmlkKSk7CisgICAgICAqcSA9ICpwOworICAgICAgaWYgKHAtPmZjb3B5ICYmIChzb2FwLT5lcnJvciA9IHAtPmZjb3B5KGNvcHksIHEsIHApKSkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgY29weSBwbHVnaW4gJyVzJ1xuIiwgcC0+aWQpKTsKKyAgICAgICAgU09BUF9GUkVFKGNvcHksIHEpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIHEtPm5leHQgPSBjb3B5LT5wbHVnaW5zOworICAgICAgY29weS0+cGx1Z2lucyA9IHE7CisgICAgfQorICB9CisgIGVsc2UKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICByZXR1cm4gY29weTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfaW5pdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+c3RhdGUgPSBTT0FQX0lOSVQ7CisgIHNvYXAtPnZlcnNpb24gPSAwOworICBzb2FwX2ltb2RlKHNvYXAsIFNPQVBfSU9fREVGQVVMVCk7CisgIHNvYXBfb21vZGUoc29hcCwgU09BUF9JT19ERUZBVUxUKTsKKyAgc29hcC0+cGx1Z2lucyA9IE5VTEw7CisgIHNvYXAtPnVzZXIgPSBOVUxMOworICBzb2FwLT51c2VyaWQgPSBOVUxMOworICBzb2FwLT5wYXNzd2QgPSBOVUxMOworI2lmbmRlZiBXSVRIX05PSFRUUAorICBzb2FwLT5mcG9zdCA9IGh0dHBfcG9zdDsKKyAgc29hcC0+ZmdldCA9IGh0dHBfZ2V0OworICBzb2FwLT5mZm9ybSA9IE5VTEw7CisgIHNvYXAtPmZwb3N0aGRyID0gaHR0cF9wb3N0X2hlYWRlcjsKKyAgc29hcC0+ZnJlc3BvbnNlID0gaHR0cF9yZXNwb25zZTsKKyAgc29hcC0+ZnBhcnNlID0gaHR0cF9wYXJzZTsKKyAgc29hcC0+ZnBhcnNlaGRyID0gaHR0cF9wYXJzZV9oZWFkZXI7CisjZW5kaWYKKyAgc29hcC0+ZmNvbm5lY3QgPSBOVUxMOworICBzb2FwLT5mZGlzY29ubmVjdCA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0lQVjYKKyAgc29hcC0+ZnJlc29sdmUgPSB0Y3BfZ2V0aG9zdDsKKyNlbHNlCisgIHNvYXAtPmZyZXNvbHZlID0gTlVMTDsKKyNlbmRpZgorICBzb2FwLT5mYWNjZXB0ID0gdGNwX2FjY2VwdDsKKyAgc29hcC0+Zm9wZW4gPSB0Y3BfY29ubmVjdDsKKyAgc29hcC0+ZmNsb3NlID0gdGNwX2Rpc2Nvbm5lY3Q7CisgIHNvYXAtPmZjbG9zZXNvY2tldCA9IHRjcF9jbG9zZXNvY2tldDsKKyAgc29hcC0+ZnNodXRkb3duc29ja2V0ID0gdGNwX3NodXRkb3duc29ja2V0OworICBzb2FwLT5mc2VuZCA9IGZzZW5kOworICBzb2FwLT5mcmVjdiA9IGZyZWN2OworICBzb2FwLT5mcG9sbCA9IHNvYXBfcG9sbDsKKyNlbHNlCisgIHNvYXAtPmZvcGVuID0gTlVMTDsKKyAgc29hcC0+ZmNsb3NlID0gTlVMTDsKKyAgc29hcC0+ZnBvbGwgPSBOVUxMOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXAtPmZwcmVwYXJlaW5pdCA9IE5VTEw7CisgIHNvYXAtPmZwcmVwYXJlc2VuZCA9IE5VTEw7CisgIHNvYXAtPmZwcmVwYXJlcmVjdiA9IE5VTEw7CisgIHNvYXAtPmZwcmVwYXJlZmluYWwgPSBOVUxMOworI2VuZGlmCisgIHNvYXAtPmZzZXRlcnJvciA9IE5VTEw7CisgIHNvYXAtPmZpZ25vcmUgPSBOVUxMOworICBzb2FwLT5mc2VydmVsb29wID0gTlVMTDsKKyAgc29hcC0+ZnBsdWdpbiA9IGZwbHVnaW47CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXAtPmZkaW1lcmVhZG9wZW4gPSBOVUxMOworICBzb2FwLT5mZGltZXdyaXRlb3BlbiA9IE5VTEw7CisgIHNvYXAtPmZkaW1lcmVhZGNsb3NlID0gTlVMTDsKKyAgc29hcC0+ZmRpbWV3cml0ZWNsb3NlID0gTlVMTDsKKyAgc29hcC0+ZmRpbWVyZWFkID0gTlVMTDsKKyAgc29hcC0+ZmRpbWV3cml0ZSA9IE5VTEw7CisjZW5kaWYKKyAgc29hcC0+ZmxvYXRfZm9ybWF0ID0gIiUuOGciOyAvKiAuOCBwcmVzZXJ2ZXMgc2luZ2xlIEZQIHByZWNpc2lvbiBhcyBtdWNoIGFzIHBvc3NpYmxlLCBidXQgbWlnaHQgbm90IGJlIHZlcnkgZWZmaWNpZW50ICovCisgIHNvYXAtPmRvdWJsZV9mb3JtYXQgPSAiJS4xN2xnIjsgLyogLjE3IHByZXNlcnZlcyBkb3VibGUgRlAgcHJlY2lzaW9uIGFzIG11Y2ggYXMgcG9zc2libGUsIGJ1dCBtaWdodCBub3QgYmUgdmVyeSBlZmZpY2llbnQgKi8KKyAgc29hcC0+ZGltZV9pZF9mb3JtYXQgPSAiY2lkOmlkJWQiOyAvKiBkZWZhdWx0IERJTUUgaWQgZm9ybWF0ICovCisgIHNvYXAtPmh0dHBfdmVyc2lvbiA9ICIxLjEiOworICBzb2FwLT5hY3RvciA9IE5VTEw7CisgIHNvYXAtPm1heF9rZWVwX2FsaXZlID0gU09BUF9NQVhLRUVQQUxJVkU7CisgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOworICBzb2FwLT5yZWN2X3RpbWVvdXQgPSAwOworICBzb2FwLT5zZW5kX3RpbWVvdXQgPSAwOworICBzb2FwLT5jb25uZWN0X3RpbWVvdXQgPSAwOworICBzb2FwLT5hY2NlcHRfdGltZW91dCA9IDA7CisgIHNvYXAtPnNvY2tldF9mbGFncyA9IDA7CisgIHNvYXAtPmNvbm5lY3RfZmxhZ3MgPSAwOworICBzb2FwLT5iaW5kX2ZsYWdzID0gMDsKKyAgc29hcC0+YWNjZXB0X2ZsYWdzID0gMDsKKyAgc29hcC0+aXAgPSAwOworI2lmZGVmIFdJVEhfRkFTVAorICBzb2FwLT5sYWJidWYgPSBOVUxMOworICBzb2FwLT5sYWJsZW4gPSAwOworICBzb2FwLT5sYWJpZHggPSAwOworI2VuZGlmCisgIHNvYXAtPmVuY29kaW5nU3R5bGUgPSBTT0FQX1NUUl9FT1M7CisjaWZuZGVmIFdJVEhfTk9OQU1FU1BBQ0VTCisgIHNvYXAtPm5hbWVzcGFjZXMgPSBuYW1lc3BhY2VzOworI2Vsc2UKKyAgc29hcC0+bmFtZXNwYWNlcyA9IE5VTEw7CisjZW5kaWYKKyAgc29hcC0+bG9jYWxfbmFtZXNwYWNlcyA9IE5VTEw7CisgIHNvYXAtPm5saXN0ID0gTlVMTDsKKyAgc29hcC0+Ymxpc3QgPSBOVUxMOworICBzb2FwLT5jbGlzdCA9IE5VTEw7CisgIHNvYXAtPmFsaXN0ID0gTlVMTDsKKyAgc29hcC0+YXR0cmlidXRlcyA9IE5VTEw7CisgIHNvYXAtPmhlYWRlciA9IE5VTEw7CisgIHNvYXAtPmZhdWx0ID0gTlVMTDsKKyAgc29hcC0+bWFzdGVyID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgc29hcC0+c29ja2V0ID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgc29hcC0+b3MgPSBOVUxMOworICBzb2FwLT5pcyA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXAtPmRvbSA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGlzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmxhc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmxpc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5sYXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5ib3VuZGFyeSA9IE5VTEw7CisgIHNvYXAtPm1pbWUuc3RhcnQgPSBOVUxMOworICBzb2FwLT54bGlzdCA9IE5VTEw7CisjZW5kaWYKKyNpZm5kZWYgVU5ERVJfQ0UKKyAgc29hcC0+cmVjdmZkID0gMDsKKyAgc29hcC0+c2VuZGZkID0gMTsKKyNlbHNlCisgIHNvYXAtPnJlY3ZmZCA9IHN0ZGluOworICBzb2FwLT5zZW5kZmQgPSBzdGRvdXQ7CisjZW5kaWYgCisgIHNvYXAtPmhvc3RbMF0gPSAnXDAnOworICBzb2FwLT5wb3J0ID0gMDsKKyAgc29hcC0+YWN0aW9uID0gTlVMTDsKKyAgc29hcC0+cHJveHlfaG9zdCA9IE5VTEw7CisgIHNvYXAtPnByb3h5X3BvcnQgPSA4MDgwOworICBzb2FwLT5wcm94eV91c2VyaWQgPSBOVUxMOworICBzb2FwLT5wcm94eV9wYXNzd2QgPSBOVUxMOworICBzb2FwLT5hdXRocmVhbG0gPSBOVUxMOworICBzb2FwLT5wcm9sb2cgPSBOVUxMOworI2lmZGVmIFdJVEhfT1BFTlNTTAorICBpZiAoIXNzbF9pbml0X2RvbmUpCisgICAgc29hcF9zc2xfaW5pdCgpOworICBzb2FwLT5mc3NsYXV0aCA9IHNzbF9hdXRoX2luaXQ7CisgIHNvYXAtPmZzc2x2ZXJpZnkgPSBzc2xfdmVyaWZ5X2NhbGxiYWNrOworICBzb2FwLT5iaW8gPSBOVUxMOworICBzb2FwLT5zc2wgPSBOVUxMOworICBzb2FwLT5jdHggPSBOVUxMOworICBzb2FwLT5yZXF1aXJlX3NlcnZlcl9hdXRoID0gMDsKKyAgc29hcC0+cmVxdWlyZV9jbGllbnRfYXV0aCA9IDA7CisgIHNvYXAtPnJzYSA9IDA7CisgIHNvYXAtPmtleWZpbGUgPSBOVUxMOworICBzb2FwLT5wYXNzd29yZCA9IE5VTEw7CisgIHNvYXAtPmRoZmlsZSA9IE5VTEw7CisgIHNvYXAtPmNhZmlsZSA9IE5VTEw7CisgIHNvYXAtPmNhcGF0aCA9IE5VTEw7CisgIHNvYXAtPmNybGZpbGUgPSBOVUxMOworICBzb2FwLT5yYW5kZmlsZSA9IE5VTEw7CisgIHNvYXAtPnNlc3Npb24gPSBOVUxMOworI2VuZGlmCisjaWZkZWYgV0lUSF9aTElCCisgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfTk9ORTsKKyAgc29hcC0+emxpYl9pbiA9IFNPQVBfWkxJQl9OT05FOworICBzb2FwLT56bGliX291dCA9IFNPQVBfWkxJQl9OT05FOworICBzb2FwLT5kX3N0cmVhbS56YWxsb2MgPSBOVUxMOworICBzb2FwLT5kX3N0cmVhbS56ZnJlZSA9IE5VTEw7CisgIHNvYXAtPmRfc3RyZWFtLm9wYXF1ZSA9IE5VTEw7CisgIHNvYXAtPnpfbGV2ZWwgPSA2OworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBzb2FwLT5jMTRuaW5jbHVkZSA9IE5VTEw7CisgIHNvYXAtPmMxNG5leGNsdWRlID0gTlVMTDsKKyAgc29hcC0+Y29va2llcyA9IE5VTEw7CisgIHNvYXAtPmNvb2tpZV9kb21haW4gPSBOVUxMOworICBzb2FwLT5jb29raWVfcGF0aCA9IE5VTEw7CisgIHNvYXAtPmNvb2tpZV9tYXggPSAzMjsKKyNlbmRpZgorI2lmZGVmIFNPQVBfREVCVUcKKyAgc29hcF9pbml0X21odChzb2FwKTsKKyAgc29hcF9pbml0X2xvZ3Moc29hcCk7CisgIHNvYXBfc2V0X3JlY3ZfbG9nZmlsZShzb2FwLCAiUkVDVi5sb2ciKTsKKyAgc29hcF9zZXRfc2VudF9sb2dmaWxlKHNvYXAsICJTRU5ULmxvZyIpOworICBzb2FwX3NldF90ZXN0X2xvZ2ZpbGUoc29hcCwgTlVMTCk7CisjZW5kaWYKKyNpZmRlZiBXTVdfUlBNX0lPCisgIHNvYXAtPnJwbXJlcWlkID0gTlVMTDsKKyNlbmRpZgorI2lmZGVmIFBBTE0KKyAgcGFsbU5ldExpYk9wZW4oKTsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgc29hcF9pbml0X2lodChzb2FwKTsKKyAgc29hcF9pbml0X3BodChzb2FwKTsKKyNlbmRpZgorICBzb2FwX2JlZ2luKHNvYXApOworI2lmZGVmIFNPQVBfREVCVUcKKyAgc29hcF9zZXRfdGVzdF9sb2dmaWxlKHNvYXAsICJURVNULmxvZyIpOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2luaXQxKHN0cnVjdCBzb2FwICpzb2FwLCBzb2FwX21vZGUgbW9kZSkKK3sgc29hcF9pbml0Mihzb2FwLCBtb2RlLCBtb2RlKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfaW5pdDIoc3RydWN0IHNvYXAgKnNvYXAsIHNvYXBfbW9kZSBpbW9kZSwgc29hcF9tb2RlIG9tb2RlKQoreyBzb2FwX2luaXQoc29hcCk7CisgIHNvYXBfaW1vZGUoc29hcCwgaW1vZGUpOworICBzb2FwX29tb2RlKHNvYXAsIG9tb2RlKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfYmVnaW4oc3RydWN0IHNvYXAgKnNvYXApCit7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5pdGlhbGl6aW5nXG4iKSk7CisgIGlmICghc29hcC0+a2VlcF9hbGl2ZSkKKyAgeyBzb2FwLT5idWZsZW4gPSAwOworICAgIHNvYXAtPmJ1ZmlkeCA9IDA7CisgIH0KKyAgc29hcC0+a2VlcF9hbGl2ZSA9ICgoKHNvYXAtPmltb2RlIHwgc29hcC0+b21vZGUpICYgU09BUF9JT19LRUVQQUxJVkUpICE9IDApOworICBzb2FwLT5udWxsID0gMDsKKyAgc29hcC0+cG9zaXRpb24gPSAwOworICBzb2FwLT5lbmNvZGluZyA9IDA7CisgIHNvYXAtPm11c3RVbmRlcnN0YW5kID0gMDsKKyAgc29hcC0+bW9kZSA9IDA7CisgIHNvYXAtPm5zID0gMDsKKyAgc29hcC0+cGFydCA9IFNPQVBfRU5EOworICBzb2FwLT5hbGxvY2VkID0gMDsKKyAgc29hcC0+Y291bnQgPSAwOworICBzb2FwLT5sZW5ndGggPSAwOworICBzb2FwLT5jZGF0YSA9IDA7CisgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgc29hcC0+cGVla2VkID0gMDsKKyAgc29hcC0+YWhlYWQgPSAwOworICBzb2FwLT5pZG51bSA9IDA7CisgIHNvYXAtPmxldmVsID0gMDsKKyAgc29hcC0+ZW5kcG9pbnRbMF0gPSAnXDAnOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzb2FwLT5kaW1lLmNodW5rc2l6ZSA9IDA7CisgIHNvYXAtPmRpbWUuYnVmbGVuID0gMDsKKyNlbmRpZgorICBzb2FwX2ZyZWUoc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2VuZChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfY2xpc3QgKmNwOworICBpZiAoc29hcF9jaGVja19zdGF0ZShzb2FwKSkKKyAgICByZXR1cm47CisgIHNvYXBfZnJlZShzb2FwKTsKKyAgc29hcF9kZWFsbG9jKHNvYXAsIE5VTEwpOworICB3aGlsZSAoc29hcC0+Y2xpc3QpCisgIHsgY3AgPSBzb2FwLT5jbGlzdC0+bmV4dDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+Y2xpc3QpOworICAgIHNvYXAtPmNsaXN0ID0gY3A7CisgIH0KKyAgc29hcF9jbG9zZXNvY2soc29hcCk7CisjaWZkZWYgU09BUF9ERUJVRworICBzb2FwX2Nsb3NlX2xvZ2ZpbGVzKHNvYXApOworI2VuZGlmCisjaWZkZWYgUEFMTQorICBwYWxtTmV0TGliQ2xvc2UoKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NldF9uYW1lc3BhY2VzKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgTmFtZXNwYWNlICpwKQoreyByZWdpc3RlciBzdHJ1Y3QgTmFtZXNwYWNlICpucyA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXM7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucCwgKm5xLCAqbnI7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBsZXZlbCA9IHNvYXAtPmxldmVsOworICBzb2FwLT5uYW1lc3BhY2VzID0gcDsKKyAgc29hcC0+bG9jYWxfbmFtZXNwYWNlcyA9IE5VTEw7CisgIHNvYXBfc2V0X2xvY2FsX25hbWVzcGFjZXMoc29hcCk7CisgIC8qIHJldmVyc2UgdGhlIG5hbWVzcGFjZSBsaXN0ICovCisgIG5wID0gc29hcC0+bmxpc3Q7CisgIHNvYXAtPm5saXN0ID0gTlVMTDsKKyAgaWYgKG5wKQorICB7IG5xID0gbnAtPm5leHQ7CisgICAgbnAtPm5leHQgPSBOVUxMOworICAgIHdoaWxlIChucSkKKyAgICB7IG5yID0gbnEtPm5leHQ7CisgICAgICBucS0+bmV4dCA9IG5wOworICAgICAgbnAgPSBucTsKKyAgICAgIG5xID0gbnI7CisgICAgfQorICB9CisgIC8qIHRoZW4gcHVzaCBvbiBuZXcgc3RhY2sgKi8KKyAgd2hpbGUgKG5wKQorICB7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnM7CisgICAgc29hcC0+bGV2ZWwgPSBucC0+bGV2ZWw7IC8qIHByZXNlcnZlIGVsZW1lbnQgbmVzdGluZyBsZXZlbCAqLworICAgIHMgPSBucC0+bnM7CisgICAgaWYgKCFzICYmIG5wLT5pbmRleCA+PSAwICYmIG5zKQorICAgIHsgcyA9IG5zW25wLT5pbmRleF0ub3V0OworICAgICAgaWYgKCFzKQorICAgICAgICBzID0gbnNbbnAtPmluZGV4XS5uczsKKyAgICB9CisgICAgaWYgKHMgJiYgc29hcF9wdXNoX25hbWVzcGFjZShzb2FwLCBucC0+aWQsIHMpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIG5xID0gbnA7CisgICAgbnAgPSBucC0+bmV4dDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgbnEpOworICB9CisgIGlmIChucykKKyAgeyByZWdpc3RlciBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBuc1tpXS5pZDsgaSsrKQorICAgIHsgaWYgKG5zW2ldLm91dCkKKyAgICAgIHsgU09BUF9GUkVFKHNvYXAsIG5zW2ldLm91dCk7CisgICAgICAgIG5zW2ldLm91dCA9IE5VTEw7CisgICAgICB9CisgICAgfQorICAgIFNPQVBfRlJFRShzb2FwLCBucyk7CisgIH0KKyAgc29hcC0+bGV2ZWwgPSBsZXZlbDsgLyogcmVzdG9yZSBsZXZlbCAqLworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2xvY2FsX25hbWVzcGFjZXMoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwLT5uYW1lc3BhY2VzICYmICFzb2FwLT5sb2NhbF9uYW1lc3BhY2VzKQorICB7IHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBOYW1lc3BhY2UgKm5zMTsKKyAgICByZWdpc3RlciBzdHJ1Y3QgTmFtZXNwYWNlICpuczI7CisgICAgcmVnaXN0ZXIgc2l6ZV90IG4gPSAxOworICAgIGZvciAobnMxID0gc29hcC0+bmFtZXNwYWNlczsgbnMxLT5pZDsgbnMxKyspCisgICAgICBuKys7CisgICAgbiAqPSBzaXplb2Yoc3RydWN0IE5hbWVzcGFjZSk7CisgICAgbnMyID0gKHN0cnVjdCBOYW1lc3BhY2UqKVNPQVBfTUFMTE9DKHNvYXAsIG4pOworICAgIGlmIChuczIpCisgICAgeyBtZW1jcHkobnMyLCBzb2FwLT5uYW1lc3BhY2VzLCBuKTsKKyAgICAgIGlmIChuczJbMF0ubnMpCisgICAgICB7IGlmICghc3RyY21wKG5zMlswXS5ucywgc29hcF9lbnYxKSkKKyAgICAgICAgICBzb2FwLT52ZXJzaW9uID0gMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHNvYXAtPnZlcnNpb24gPSAyOworICAgICAgfQorICAgICAgc29hcC0+bG9jYWxfbmFtZXNwYWNlcyA9IG5zMjsKKyAgICB9CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfc3Ryc2VhcmNoKGNvbnN0IGNoYXIgKmJpZywgY29uc3QgY2hhciAqbGl0dGxlKQoreyBzaXplX3QgbiA9IHN0cmxlbihsaXR0bGUpOworICBjb25zdCBjaGFyICpzID0gYmlnOworICB3aGlsZSAocykgCisgIHsgaWYgKCFzdHJuY21wKHMsIGxpdHRsZSwgbikgJiYgKHNbbl0gPT0gJ1wwJyB8fCBzW25dID09ICcgJykpCisgICAgICByZXR1cm4gczsKKyAgICBzID0gc3RyY2hyKHMsICcgJyk7CisgICAgaWYgKHMpCisgICAgICBzKys7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBzdHJ1Y3Qgc29hcF9ubGlzdCAqCitzb2FwX2xvb2t1cF9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzaXplX3QgbikKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wOworICBmb3IgKG5wID0gc29hcC0+bmxpc3Q7IG5wOyBucCA9IG5wLT5uZXh0KQorICB7IGlmICghc3RybmNtcChucC0+aWQsIHRhZywgbikgJiYgIW5wLT5pZFtuXSkKKyAgICAgIHJldHVybiBucDsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBzdHJ1Y3Qgc29hcF9ubGlzdCAqCitzb2FwX3B1c2hfbnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICpucywgc2hvcnQgdXRpbGl6ZWQpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucDsKKyAgc2l6ZV90IG4sIGs7CisgIGlmIChzb2FwX3N0cnNlYXJjaChzb2FwLT5jMTRuZXhjbHVkZSwgaWQpKQorICAgIHJldHVybiBOVUxMOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlB1c2ggbmFtZXNwYWNlIGJpbmRpbmcgKGxldmVsPSV1KSAnJXMnICclcydcbiIsIHNvYXAtPmxldmVsLCBpZCwgbnM/bnM6IiIpKTsKKyAgaWYgKCF1dGlsaXplZCkKKyAgeyBmb3IgKG5wID0gc29hcC0+bmxpc3Q7IG5wOyBucCA9IG5wLT5uZXh0KQorICAgIHsgaWYgKCFzdHJjbXAobnAtPmlkLCBpZCkgJiYgKCFucC0+bnMgfHwgIXN0cmNtcChucC0+bnMsIG5zKSkpCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAobnApCisgICAgeyBpZiAobnAtPmluZGV4ID09IDEpCisgICAgICAgIHV0aWxpemVkID0gbnAtPmluZGV4OworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIH0KKyAgbiA9IHN0cmxlbihpZCk7CisgIGlmIChucykKKyAgICBrID0gc3RybGVuKG5zKTsKKyAgZWxzZQorICAgIGsgPSAwOworICBucCA9IChzdHJ1Y3Qgc29hcF9ubGlzdCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX25saXN0KSArIG4gKyBrICsgMSk7CisgIGlmICghbnApCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBucC0+bmV4dCA9IHNvYXAtPm5saXN0OworICBzb2FwLT5ubGlzdCA9IG5wOworICBzdHJjcHkobnAtPmlkLCBpZCk7CisgIGlmIChucykKKyAgeyBucC0+bnMgPSBucC0+aWQgKyBuICsgMTsKKyAgICBzdHJjcHkobnAtPm5zLCBucyk7CisgIH0KKyAgZWxzZQorICAgIG5wLT5ucyA9IE5VTEw7CisgIG5wLT5sZXZlbCA9IHNvYXAtPmxldmVsOworICBucC0+aW5kZXggPSB1dGlsaXplZDsKKyAgcmV0dXJuIG5wOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIHZvaWQKK3NvYXBfdXRpbGl6ZV9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzaXplX3QgbikKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wID0gc29hcF9sb29rdXBfbnMoc29hcCwgdGFnLCBuKTsKKyAgaWYgKG5wKQorICB7IGlmIChucC0+aW5kZXggPT0gMCkKKyAgICAgIHNvYXBfcHVzaF9ucyhzb2FwLCBucC0+aWQsIG5wLT5ucywgMSk7CisgIH0KKyAgZWxzZQorICB7IHN0cm5jcHkoc29hcC0+dG1wYnVmLCB0YWcsIG4pOworICAgIHNvYXAtPnRtcGJ1ZltuXSA9ICdcMCc7CisgICAgc29hcF9wdXNoX25zKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgTlVMTCwgMSk7CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyB2b2lkCitzb2FwX3BvcF9ucyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcF9wb3BfbmFtZXNwYWNlKHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICp0eXBlKQoreyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVsZW1lbnQgYmVnaW4gdGFnPSclcycgaWQ9JyVkJyB0eXBlPSclcydcbiIsIHRhZywgaWQsIHR5cGU/dHlwZToiIikpOworI2lmZGVmIFdJVEhfRE9NCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICplbHQgPSAoc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCkpOworICAgIGlmICghZWx0KQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgZWx0LT5zb2FwID0gc29hcDsKKyAgICBlbHQtPm5leHQgPSBOVUxMOworICAgIGVsdC0+cHJudCA9IHNvYXAtPmRvbTsKKyAgICBlbHQtPm5hbWUgPSBzb2FwX3N0cmR1cChzb2FwLCB0YWcpOworICAgIGVsdC0+ZWx0cyA9IE5VTEw7CisgICAgZWx0LT5hdHRzID0gTlVMTDsKKyAgICBlbHQtPm5zdHIgPSBOVUxMOworICAgIGVsdC0+ZGF0YSA9IE5VTEw7CisgICAgZWx0LT53aWRlID0gTlVMTDsKKyAgICBlbHQtPm5vZGUgPSBOVUxMOworICAgIGVsdC0+dHlwZSA9IDA7CisgICAgZWx0LT5oZWFkID0gTlVMTDsKKyAgICBlbHQtPnRhaWwgPSBOVUxMOworICAgIGlmIChzb2FwLT5kb20pCisgICAgeyBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqcCA9IHNvYXAtPmRvbS0+ZWx0czsKKyAgICAgIGlmIChwKQorICAgICAgeyB3aGlsZSAocC0+bmV4dCkKKyAgICAgICAgICBwID0gcC0+bmV4dDsKKyAgICAgICAgcC0+bmV4dCA9IGVsdDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgc29hcC0+ZG9tLT5lbHRzID0gZWx0OworICAgIH0KKyAgICBzb2FwLT5kb20gPSBlbHQ7CisgIH0KKyAgZWxzZQorICB7CisjZW5kaWYKKyAgICBzb2FwLT5sZXZlbCsrOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBpZiAoIXNvYXAtPm5zKQorICAgIHsgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgICAgICAmJiBzb2FwX3NlbmQoc29hcCwgc29hcC0+cHJvbG9nID8gc29hcC0+cHJvbG9nIDogIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIikpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgZWxzZSBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0lOREVOVCkKKyAgICB7IGlmIChzb2FwLT5ucyA9PSAxICYmIHNvYXBfc2VuZF9yYXcoc29hcCwgc29hcF9pbmRlbnQsIHNvYXAtPmxldmVsIDwgc2l6ZW9mKHNvYXBfaW5kZW50KSA/IHNvYXAtPmxldmVsIDogc2l6ZW9mKHNvYXBfaW5kZW50KSAtIDEpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBzb2FwLT5ib2R5ID0gMTsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAiPCIsIDEpCisgICAgIHx8IHNvYXBfc2VuZChzb2FwLCB0YWcpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmZGVmIFdJVEhfRE9NCisgIH0KKyNlbmRpZgorICBpZiAoIXNvYXAtPm5zKQorICB7IHN0cnVjdCBOYW1lc3BhY2UgKm5zOworICAgIGZvciAobnMgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzOyBucyAmJiBucy0+aWQ7IG5zKyspCisgICAgeyBpZiAoKm5zLT5pZCAmJiAobnMtPm91dCB8fCBucy0+bnMpKQorICAgICAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgInhtbG5zOiVzIiwgbnMtPmlkKTsKKyAgICAgICAgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgbnMtPm91dCA/IG5zLT5vdXQgOiBucy0+bnMpKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIH0KKyAgICB9ICAgCisgIH0KKyAgc29hcC0+bnMgPSAxOyAvKiBzdGFydCB3aXRoIDAgb3IgMiwgYnV0IHNob3VsZCBiZSBvbmUgdG8gY29udGludWUgKi8KKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICB7IGNvbnN0IGNoYXIgKnMgPSBzdHJjaHIodGFnLCAnOicpOworICAgIGlmIChzKQorICAgICAgc29hcF91dGlsaXplX25zKHNvYXAsIHRhZywgcyAtIHRhZyk7CisgIH0KKyNlbmRpZgorICBpZiAoaWQgPiAwKQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiXyVkIiwgaWQpOworICAgIGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAiaWQiLCBzb2FwLT50bXBidWYpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmICh0eXBlICYmICp0eXBlKQorICB7IGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAieHNpOnR5cGUiLCB0eXBlKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgICAgeyBjb25zdCBjaGFyICpzID0gc3RyY2hyKHR5cGUsICc6Jyk7CisgICAgICBpZiAocykKKyAgICAgICAgc29hcF91dGlsaXplX25zKHNvYXAsIHR5cGUsIHMgLSB0eXBlKTsKKyAgICB9CisjZW5kaWYKKyAgfQorICBpZiAoc29hcC0+bnVsbCAmJiBzb2FwLT5wb3NpdGlvbiA+IDApCisgIHsgaW50IGk7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICJbJWQiLCBzb2FwLT5wb3NpdGlvbnNbMF0pOworICAgIGZvciAoaSA9IDE7IGkgPCBzb2FwLT5wb3NpdGlvbjsgaSsrKQorICAgICAgc3ByaW50Zihzb2FwLT50bXBidWYgKyBzdHJsZW4oc29hcC0+dG1wYnVmKSwgIiwlZCIsIHNvYXAtPnBvc2l0aW9uc1tpXSk7CisgICAgc3RyY2F0KHNvYXAtPnRtcGJ1ZiwgIl0iKTsKKyAgICBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgIlNPQVAtRU5DOnBvc2l0aW9uIiwgc29hcC0+dG1wYnVmKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAoc29hcC0+bXVzdFVuZGVyc3RhbmQpCisgIHsgaWYgKHNvYXAtPmFjdG9yICYmICpzb2FwLT5hY3RvcikKKyAgICB7IGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCBzb2FwLT52ZXJzaW9uID09IDIgPyAiU09BUC1FTlY6cm9sZSIgOiAiU09BUC1FTlY6YWN0b3IiLCBzb2FwLT5hY3RvcikpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJTT0FQLUVOVjptdXN0VW5kZXJzdGFuZCIsIHNvYXAtPnZlcnNpb24gPT0gMiA/ICJ0cnVlIiA6ICIxIikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgc29hcC0+bXVzdFVuZGVyc3RhbmQgPSAwOworICB9CisgIGlmIChzb2FwLT5lbmNvZGluZykKKyAgeyBpZiAoc29hcC0+ZW5jb2RpbmdTdHlsZSAmJiBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzKQorICAgIHsgaWYgKCEqc29hcC0+ZW5jb2RpbmdTdHlsZSkKKyAgICAgIHsgaWYgKHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbMV0ub3V0KQorICAgICAgICAgIHNvYXAtPmVuY29kaW5nU3R5bGUgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzWzFdLm91dDsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHNvYXAtPmVuY29kaW5nU3R5bGUgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzWzFdLm5zOworICAgICAgfQorICAgICAgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJTT0FQLUVOVjplbmNvZGluZ1N0eWxlIiwgc29hcC0+ZW5jb2RpbmdTdHlsZSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgc29hcC0+ZW5jb2RpbmcgPSAwOworICB9CisgIHNvYXAtPm51bGwgPSAwOworICBzb2FwLT5wb3NpdGlvbiA9IDA7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgY2hhciAqdHlwZSkKK3sgaWYgKCp0YWcgPT0gJy0nKQorICAgIHJldHVybiBTT0FQX09LOworICBpZiAoc29hcF9lbGVtZW50KHNvYXAsIHRhZywgaWQsIHR5cGUpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHNvYXAsIE5VTEwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorI2lmbmRlZiBIQVZFX1NUUlJDSFIKK1NPQVBfRk1BQzEKK2NoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3N0cnJjaHIoY29uc3QgY2hhciAqcywgaW50IHQpCit7IHJlZ2lzdGVyIGNoYXIgKnIgPSBOVUxMOworICB3aGlsZSAoKnMpCisgICAgaWYgKCpzKysgPT0gdCkKKyAgICAgIHIgPSAoY2hhciopcyAtIDE7CisgIHJldHVybiByOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCisjaWZuZGVmIEhBVkVfU1RSVE9MCitTT0FQX0ZNQUMxCitsb25nCitTT0FQX0ZNQUMyCitzb2FwX3N0cnRvbChjb25zdCBjaGFyICpzLCBjaGFyICoqdCwgaW50IGIpCit7IHJlZ2lzdGVyIGxvbmcgbiA9IDA7CisgIHJlZ2lzdGVyIGludCBjOworICB3aGlsZSAoKnMgPiAwICYmICpzIDw9IDMyKQorICAgIHMrKzsKKyAgaWYgKGIgPT0gMTApCisgIHsgc2hvcnQgbmVnID0gMDsKKyAgICBpZiAoKnMgPT0gJy0nKQorICAgIHsgcysrOworICAgICAgbmVnID0gMTsKKyAgICB9CisgICAgZWxzZSBpZiAoKnMgPT0gJysnKQorICAgICAgcysrOworICAgIHdoaWxlICgoYyA9ICpzKSAmJiBjID49ICcwJyAmJiBjIDw9ICc5JykKKyAgICB7IGlmIChuID49IDIxNDc0ODM2NCAmJiAobiA+IDIxNDc0ODM2NCB8fCBjID49ICc4JykpCisgICAgICAgIGJyZWFrOworICAgICAgbiAqPSAxMDsKKyAgICAgIG4gKz0gYyAtICcwJzsKKyAgICAgIHMrKzsKKyAgICB9CisgICAgaWYgKG5lZykKKyAgICAgIG4gPSAtbjsKKyAgfQorICBlbHNlIC8qIGIgPT0gMTYgYW5kIHZhbHVlIGlzIGFsd2F5cyBwb3NpdGl2ZSAqLworICB7IHdoaWxlICgoYyA9ICpzKSkKKyAgICB7IGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKKyAgICAgICAgYyAtPSAnMCc7CisgICAgICBlbHNlIGlmIChjID49ICdBJyAmJiBjIDw9ICdGJykKKyAgICAgICAgYyAtPSAnQScgLSAxMDsKKyAgICAgIGVsc2UgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQorICAgICAgICBjIC09ICdhJyAtIDEwOworICAgICAgaWYgKG4gPiAweDA3RkZGRkZGKQorICAgICAgICBicmVhazsKKyAgICAgIG4gPDw9IDQ7CisgICAgICBuICs9IGM7CisgICAgICBzKys7CisgICAgfQorICB9CisgIGlmICh0KQorICAgICp0ID0gKGNoYXIqKXM7CisgIHJldHVybiBuOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCisjaWZuZGVmIEhBVkVfU1RSVE9VTAorU09BUF9GTUFDMQordW5zaWduZWQgbG9uZworU09BUF9GTUFDMgorc29hcF9zdHJ0b3VsKGNvbnN0IGNoYXIgKnMsIGNoYXIgKip0LCBpbnQgYikKK3sgdW5zaWduZWQgbG9uZyBuID0gMDsKKyAgcmVnaXN0ZXIgaW50IGM7CisgIHdoaWxlICgqcyA+IDAgJiYgKnMgPD0gMzIpCisgICAgcysrOworICBpZiAoYiA9PSAxMCkKKyAgeyBpZiAoKnMgPT0gJysnKQorICAgICAgcysrOworICAgIHdoaWxlICgoYyA9ICpzKSAmJiBjID49ICcwJyAmJiBjIDw9ICc5JykKKyAgICB7IGlmIChuID49IDQyOTQ5NjcyOSAmJiAobiA+IDQyOTQ5NjcyOSB8fCBjID49ICc2JykpCisgICAgICAgIGJyZWFrOworICAgICAgbiAqPSAxMDsKKyAgICAgIG4gKz0gYyAtICcwJzsKKyAgICAgIHMrKzsKKyAgICB9CisgIH0KKyAgZWxzZSAvKiBiID09IDE2ICovCisgIHsgd2hpbGUgKChjID0gKnMpKQorICAgIHsgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQorICAgICAgICBjIC09ICcwJzsKKyAgICAgIGVsc2UgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKQorICAgICAgICBjIC09ICdBJyAtIDEwOworICAgICAgZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCisgICAgICAgIGMgLT0gJ2EnIC0gMTA7CisgICAgICBpZiAobiA+IDB4MEZGRkZGRkYpCisgICAgICAgIGJyZWFrOworICAgICAgbiA8PD0gNDsKKyAgICAgIG4gKz0gYzsKKyAgICAgIHMrKzsKKyAgICB9CisgIH0KKyAgaWYgKHQpCisgICAgKnQgPSAoY2hhciopczsKKyAgcmV0dXJuIG47Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9hcnJheV9iZWdpbl9vdXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICpvZmZzZXQpCit7IGlmIChzb2FwX2VsZW1lbnQoc29hcCwgdGFnLCBpZCwgIlNPQVAtRU5DOkFycmF5IikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICB7IGNvbnN0IGNoYXIgKnM7CisgICAgcyA9IHNvYXBfc3RycmNocih0eXBlLCAnWycpOworICAgIGlmICgoc2l6ZV90KShzIC0gdHlwZSkgPCBzaXplb2Yoc29hcC0+dG1wYnVmKSkKKyAgICB7IHN0cm5jcHkoc29hcC0+dG1wYnVmLCB0eXBlLCBzIC0gdHlwZSk7CisgICAgICBzb2FwLT50bXBidWZbcyAtIHR5cGVdID0gJ1wwJzsKKyAgICAgIGlmICh0eXBlICYmICp0eXBlICYmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAiU09BUC1FTkM6aXRlbVR5cGUiLCBzb2FwLT50bXBidWYpKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgaWYgKHMgJiYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJTT0FQLUVOQzphcnJheVNpemUiLCBzICsgMSkpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICB9CisgIGVsc2UKKyAgeyBpZiAob2Zmc2V0ICYmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAiU09BUC1FTkM6b2Zmc2V0Iiwgb2Zmc2V0KSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHR5cGUgJiYgKnR5cGUgJiYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJTT0FQLUVOQzphcnJheVR5cGUiLCB0eXBlKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICh0eXBlICYmICp0eXBlICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKSkKKyAgeyBjb25zdCBjaGFyICpzID0gc3RyY2hyKHR5cGUsICc6Jyk7CisgICAgaWYgKHMpCisgICAgICBzb2FwX3V0aWxpemVfbnMoc29hcCwgdHlwZSwgcyAtIHR5cGUpOworICB9CisjZW5kaWYKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHNvYXAsIE5VTEwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKnRwOworI2lmZGVmIFdJVEhfRE9NCisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgKiphdHQ7CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IGF0dCA9ICZzb2FwLT5kb20tPmF0dHM7CisgICAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICAgIHsgaWYgKHRwLT52aXNpYmxlKQorICAgICAgeyAqYXR0ID0gKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlKSk7CisJaWYgKCEqYXR0KQorCSAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisJKCphdHQpLT5uZXh0ID0gTlVMTDsKKyAgICAgICAgKCphdHQpLT5uc3RyID0gTlVMTDsKKyAgICAgICAgKCphdHQpLT5uYW1lID0gc29hcF9zdHJkdXAoc29hcCwgdHAtPm5hbWUpOworICAgICAgICAoKmF0dCktPmRhdGEgPSBzb2FwX3N0cmR1cChzb2FwLCB0cC0+dmFsdWUpOworICAgICAgICAoKmF0dCktPndpZGUgPSBOVUxMOworICAgICAgICAoKmF0dCktPnNvYXAgPSBzb2FwOworICAgICAgICB0cC0+dmlzaWJsZSA9IDA7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBTT0FQX09LOworICB9CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICB7IHN0cnVjdCBzb2FwX25saXN0ICpucDsKKyAgICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgICAgeyBpZiAodHAtPnZpc2libGUgJiYgdHAtPm5hbWUpCisgICAgICB7IGNvbnN0IGNoYXIgKnMgPSBzdHJjaHIodHAtPm5hbWUsICc6Jyk7CisgICAgICAgIGlmIChzKQorICAgICAgICAgIHNvYXBfdXRpbGl6ZV9ucyhzb2FwLCB0cC0+bmFtZSwgcyAtIHRwLT5uYW1lKTsKKyAgICAgIH0KKyAgICB9CisgICAgZm9yIChucCA9IHNvYXAtPm5saXN0OyBucDsgbnAgPSBucC0+bmV4dCkKKyAgICB7IGlmIChucC0+aW5kZXggPT0gMSAmJiBucC0+bnMpCisgICAgICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAieG1sbnM6JXMiLCBucC0+aWQpOworICAgICAgICBzb2FwX3NldF9hdHRyKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgbnAtPm5zKTsKKyAgICAgICAgbnAtPmluZGV4ID0gMjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyNlbmRpZgorICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgIHsgaWYgKHRwLT52aXNpYmxlKQorICAgIHsgaWYgKHNvYXBfc2VuZChzb2FwLCAiICIpIHx8IHNvYXBfc2VuZChzb2FwLCB0cC0+bmFtZSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIGlmICh0cC0+dmlzaWJsZSA9PSAyICYmIHRwLT52YWx1ZSkKKyAgICAgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgIj1cIiIsIDIpCisJIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCB0cC0+dmFsdWUsIDEpCisJIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIlwiIiwgMSkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgdHAtPnZpc2libGUgPSAwOworICAgIH0KKyAgfQorICBpZiAodGFnKQorICB7IAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsICI+IiwgMSkKKyAgICAgICB8fCBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHNvYXAtPmxldmVsLS07CS8qIGRlY3JlbWVudCBsZXZlbCBqdXN0IGJlZm9yZSAvPiAqLworICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsICIvPiIsIDIpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsICI+IiwgMSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9lbmRfb3V0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcpCit7IGlmICgqdGFnID09ICctJykKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbGVtZW50IGVuZGluZyB0YWc9JyVzJ1xuIiwgdGFnKSk7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgaWYgKHNvYXAtPmRvbS0+cHJudCkKKyAgICAgIHNvYXAtPmRvbSA9IHNvYXAtPmRvbS0+cHJudDsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgICBzb2FwX3BvcF9ucyhzb2FwKTsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9JTkRFTlQpCisgIHsgaWYgKCFzb2FwLT5ib2R5KQorICAgIHsgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgc29hcF9pbmRlbnQsIHNvYXAtPmxldmVsIDwgc2l6ZW9mKHNvYXBfaW5kZW50KSA/IHNvYXAtPmxldmVsIDogc2l6ZW9mKHNvYXBfaW5kZW50KSAtIDEpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIHNvYXAtPmJvZHkgPSAwOworICB9CisjZW5kaWYKKyAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgIjwvIiwgMikKKyAgIHx8IHNvYXBfc2VuZChzb2FwLCB0YWcpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgc29hcC0+bGV2ZWwtLTsJLyogZGVjcmVtZW50IGxldmVsIGp1c3QgYmVmb3JlID4gKi8KKyAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgIj4iLCAxKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X3JlZihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGludCBocmVmKQoreyByZWdpc3RlciBpbnQgbiA9IDA7CisgIGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgICAgbiA9IDE7CisgIHNwcmludGYoc29hcC0+aHJlZiwgIiNfJWQiLCBocmVmKTsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9ocmVmKHNvYXAsIHRhZywgaWQsICJocmVmIiArIG4sIHNvYXAtPmhyZWYgKyBuKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X2hyZWYoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICpyZWYsIGNvbnN0IGNoYXIgKnZhbCkKK3sgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbGVtZW50ICclcycgcmVmZXJlbmNlICVzPSclcydcbiIsIHRhZywgcmVmLCB2YWwpKTsKKyAgaWYgKHNvYXBfZWxlbWVudChzb2FwLCB0YWcsIGlkLCBOVUxMKQorICAgfHwgc29hcF9hdHRyaWJ1dGUoc29hcCwgcmVmLCB2YWwpCisgICB8fCBzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzb2FwLCB0YWcpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9udWxsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgY2hhciAqdHlwZSkKK3sgc3RydWN0IHNvYXBfYXR0cmlidXRlICp0cDsKKyAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICAgIGlmICh0cC0+dmlzaWJsZSkKKyAgICAgIGJyZWFrOworICBpZiAodHAgfHwgKHNvYXAtPnZlcnNpb24gPT0gMiAmJiBzb2FwLT5wb3NpdGlvbiA+IDApIHx8IGlkID4gMCB8fCAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX05JTCkpCisgIHsgaWYgKHNvYXBfZWxlbWVudChzb2FwLCB0YWcsIGlkLCB0eXBlKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAoc29hcC0+cGFydCAhPSBTT0FQX0lOX0hFQURFUiAmJiBzb2FwLT5lbmNvZGluZ1N0eWxlKQorICAgICAgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJ4c2k6bmlsIiwgInRydWUiKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIHJldHVybiBzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzb2FwLCB0YWcpOworICB9CisgIHNvYXAtPm51bGwgPSAxOworICBzb2FwLT5wb3NpdGlvbiA9IDA7CisgIHNvYXAtPm11c3RVbmRlcnN0YW5kID0gMDsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9pZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgbiwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpIAoreyBpZiAoIXAgfHwgKGEgJiYgIWEtPl9fcHRyKSkKKyAgeyBzb2FwX2VsZW1lbnRfbnVsbChzb2FwLCB0YWcsIGlkLCB0eXBlKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfVFJFRSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKGlkIDwgMCkKKyAgeyBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgICAgaWYgKGEpCisgICAgICBpZCA9IHNvYXBfYXJyYXlfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgYSwgbiwgdCwgJnBwKTsKKyAgICBlbHNlCisgICAgICBpZCA9IHNvYXBfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgdCwgJnBwKTsKKyAgICBpZiAoaWQpCisgICAgeyBpZiAoc29hcF9pc19lbWJlZGRlZChzb2FwLCBwcCkpCisgICAgICB7IHNvYXBfZWxlbWVudF9yZWYoc29hcCwgdGFnLCAwLCBpZCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGlmIChzb2FwX2lzX3NpbmdsZShzb2FwLCBwcCkpCisgICAgICAgIHJldHVybiAwOworICAgICAgc29hcF9zZXRfZW1iZWRkZWQoc29hcCwgcHApOworICAgIH0KKyAgfQorICByZXR1cm4gaWQ7CisjZWxzZQorICByZXR1cm4gMDsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfcmVzdWx0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcpCit7IGlmIChzb2FwLT52ZXJzaW9uID09IDIgJiYgc29hcC0+ZW5jb2RpbmdTdHlsZSkKKyAgICBpZiAoc29hcF9lbGVtZW50KHNvYXAsICJTT0FQLVJQQzpyZXN1bHQiLCAwLCBOVUxMKQorICAgICB8fCBzb2FwX2F0dHJpYnV0ZShzb2FwLCAieG1sbnM6U09BUC1SUEMiLCBzb2FwX3JwYykKKyAgICAgfHwgc29hcF9lbGVtZW50X3N0YXJ0X2VuZF9vdXQoc29hcCwgTlVMTCkKKyAgICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHRhZywgMCkKKyAgICAgfHwgc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgIlNPQVAtUlBDOnJlc3VsdCIpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9hdHRyaWJ1dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKQoreyAKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICphID0gKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlKSk7CisgICAgYS0+bmV4dCA9IHNvYXAtPmRvbS0+YXR0czsKKyAgICBhLT5uc3RyID0gTlVMTDsKKyAgICBhLT5uYW1lID0gc29hcF9zdHJkdXAoc29hcCwgbmFtZSk7CisgICAgYS0+ZGF0YSA9IHNvYXBfc3RyZHVwKHNvYXAsIHZhbHVlKTsKKyAgICBhLT53aWRlID0gTlVMTDsKKyAgICBhLT5zb2FwID0gc29hcDsKKyAgICBzb2FwLT5kb20tPmF0dHMgPSBhOworICAgIHJldHVybiBTT0FQX09LOworICB9CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICB7IC8qIFRPRE86IGNvbnNpZGVyIHVzaW5nIHRoaXMgY29kZSB0byBoYW5kbGUgZGVmYXVsdCBuYW1lc3BhY2UKKyAgICBpZiAoIXN0cm5jbXAobmFtZSwgInhtbG5zIiwgNSkgJiYgKG5hbWVbNV0gPT0gJzonIHx8IG5hbWVbNV0gPT0gJ1wwJykpCisgICAgeyBpZiAobmFtZVs1XSA9PSAnOicpCisgICAgICAgIHNvYXBfcHVzaF9ucyhzb2FwLCBuYW1lICsgNiwgdmFsdWUsIDApOworICAgICAgZWxzZQorICAgICAgICBzb2FwX3B1c2hfbnMoc29hcCwgIiIsIHZhbHVlLCAwKTsKKyAgICB9CisgICAgKi8KKyAgICBpZiAoIXN0cm5jbXAobmFtZSwgInhtbG5zOiIsIDYpKQorICAgICAgc29hcF9wdXNoX25zKHNvYXAsIG5hbWUgKyA2LCB2YWx1ZSwgMCk7CisgICAgZWxzZSBpZiAoc29hcF9zZXRfYXR0cihzb2FwLCBuYW1lLCB2YWx1ZSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgZWxzZQorI2VuZGlmCisgIHsgaWYgKHNvYXBfc2VuZChzb2FwLCAiICIpIHx8IHNvYXBfc2VuZChzb2FwLCBuYW1lKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAodmFsdWUpCisgICAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAiPVwiIiwgMikKKyAgICAgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgdmFsdWUsIDEpCisgICAgICAgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiXCIiLCAxKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfYmVnaW5faW4oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IG5pbGxhYmxlKQoreyBpZiAoIXNvYXBfcGVla19lbGVtZW50KHNvYXApKQorICB7IGlmIChzb2FwLT5vdGhlcikKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfVEFHX01JU01BVENIOworICAgIGlmICh0YWcgJiYgKnRhZyA9PSAnLScpCisgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICBpZiAoIShzb2FwLT5lcnJvciA9IHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnRhZywgdGFnKSkpCisgICAgeyBzb2FwLT5wZWVrZWQgPSAwOworICAgICAgaWYgKHNvYXAtPmJvZHkpCisgICAgICAgIHNvYXAtPmxldmVsKys7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkJlZ2luIGVsZW1lbnQgZm91bmQgKGxldmVsPSV1KSAnJXMnPSclcydcbiIsIHNvYXAtPmxldmVsLCBzb2FwLT50YWcsIHRhZz90YWc6IiIgKSk7CisgICAgICBpZiAoIW5pbGxhYmxlICYmIHNvYXAtPm51bGwgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX05VTEw7CisgICAgfQorICB9CisgIGVsc2UgaWYgKHNvYXAtPmVycm9yID09IFNPQVBfTk9fVEFHICYmIHRhZyAmJiAqdGFnID09ICctJykKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X2VuZF9pbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnKSAgCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgcmVnaXN0ZXIgY2hhciAqczsKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqdDsKKyAgcmVnaXN0ZXIgaW50IG4gPSAwOworICBpZiAodGFnICYmICp0YWcgPT0gJy0nKQorICAgIHJldHVybiBTT0FQX09LOworICBzb2FwLT5sZXZlbC0tOworICBzb2FwX3BvcF9uYW1lc3BhY2Uoc29hcCk7CisjaWZkZWYgV0lUSF9ET00KKyAgLyogdGhpcyB3aGl0ZXNwYWNlIG9yIG1peGVkIGNvbnRlbnQgaXMgbm90IGluc2lnbmlmaWNhbnQgZm9yIERPTSAqLworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBpZiAoIXNvYXAtPnBlZWtlZCAmJiAhc29hcF9zdHJpbmdfaW4oc29hcCwgMywgLTEsIC0xKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAoc29hcC0+ZG9tLT5wcm50KQorICAgICAgc29hcC0+ZG9tID0gc29hcC0+ZG9tLT5wcm50OworICB9CisjZW5kaWYKKyAgaWYgKHNvYXAtPnBlZWtlZCkKKyAgeyBpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcpCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgICAgaWYgKCpzb2FwLT50YWcpCisgICAgICBuKys7CisgICAgc29hcC0+cGVla2VkID0gMDsKKyAgfQorICBkbworICB7IHdoaWxlICgoKGMgPSBzb2FwX2dldChzb2FwKSkgIT0gU09BUF9UVCkpCisgICAgeyBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgICBpZiAoYyA9PSBTT0FQX0xUKQorICAgICAgICBuKys7CisgICAgICBlbHNlIGlmIChjID09ICcvJykKKyAgICAgIHsgYyA9IHNvYXBfZ2V0KHNvYXApOworICAgICAgICBpZiAoYyA9PSBTT0FQX0dUKQorCSAgbi0tOworICAgICAgICBlbHNlCisJICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgfQorICAgIH0KKyAgfSB3aGlsZSAobi0tKTsKKyAgcyA9IHNvYXAtPnRhZzsKKyAgd2hpbGUgKHNvYXBfbm90YmxhbmsoYyA9IHNvYXBfZ2V0KHNvYXApKSkKKyAgICAqcysrID0gKGNoYXIpYzsKKyAgKnMgPSAnXDAnOworICBpZiAoKGludCljID09IEVPRikKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgd2hpbGUgKHNvYXBfYmxhbmsoYykpCisgICAgYyA9IHNvYXBfZ2V0KHNvYXApOworICBpZiAoYyAhPSBTT0FQX0dUKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfU1lOVEFYX0VSUk9SOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBlbGVtZW50IGZvdW5kIChsZXZlbD0ldSkgJyVzJz0nJXMnXG4iLCBzb2FwLT5sZXZlbCwgc29hcC0+dGFnLCB0YWc/dGFnOiIiKSk7CisgIGlmICghdGFnIHx8ICEqdGFnKQorICAgIHJldHVybiBTT0FQX09LOworICBpZiAoKHMgPSBzdHJjaHIoc29hcC0+dGFnLCAnOicpKSkKKyAgICBzKys7CisgIGVsc2UKKyAgICBzID0gc29hcC0+dGFnOworICBpZiAoKHQgPSBzdHJjaHIodGFnLCAnOicpKSkKKyAgICB0Kys7CisgIGVsc2UKKyAgICB0ID0gdGFnOworICBpZiAoIVNPQVBfU1RSQ01QKHMsIHQpKQorICAgIHJldHVybiBTT0FQX09LOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBlbGVtZW50IHRhZyBuYW1lIGRvZXMgbm90IG1hdGNoXG4iKSk7CisgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfU1lOVEFYX0VSUk9SOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX2F0dHJfdmFsdWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBmbGFnKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKnRwOworICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgICAgaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgbmFtZSkpCisgICAgICBicmVhazsKKyAgaWYgKHRwICYmIHRwLT52aXNpYmxlID09IDIpCisgIHsgaWYgKGZsYWcgPT0gMiAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfUFJPSElCSVRFRDsKKyAgICBlbHNlCisgICAgICByZXR1cm4gdHAtPnZhbHVlOworICB9CisgIGVsc2UgaWYgKGZsYWcgPT0gMSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpCisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1JFUVVJUkVEOworICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZXRfYXR0cihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqdHA7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2V0IGF0dHJpYnV0ZSAlcz0nJXMnXG4iLCBuYW1lLCB2YWx1ZT92YWx1ZToiIikpOworICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgIHsgaWYgKCFzdHJjbXAodHAtPm5hbWUsIG5hbWUpKQorICAgICAgYnJlYWs7CisgIH0KKyAgaWYgKCF0cCkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFsbG9jYXRlIGF0dHJpYnV0ZSAlc1xuIiwgbmFtZSkpOworICAgIGlmICghKHRwID0gKHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSkgKyBzdHJsZW4obmFtZSkpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHRwLT5ucyA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICAgIHsgc3RydWN0IHNvYXBfYXR0cmlidXRlICoqdHBwID0gJnNvYXAtPmF0dHJpYnV0ZXM7CisgICAgICBjb25zdCBjaGFyICpzID0gc3RyY2hyKG5hbWUsICc6Jyk7CisgICAgICBpZiAoIXN0cm5jbXAobmFtZSwgInhtbG5zIiwgNSkpCisgICAgICB7IGZvciAoOyAqdHBwOyB0cHAgPSAmKCp0cHApLT5uZXh0KQorICAgICAgICAgIGlmIChzdHJuY21wKCgqdHBwKS0+bmFtZSwgInhtbG5zIiwgNSkgfHwgc3RyY21wKCgqdHBwKS0+bmFtZSArIDUsIG5hbWUgKyA1KSA+IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzKQorICAgICAgeyBmb3IgKDsgKnRwcDsgdHBwID0gJigqdHBwKS0+bmV4dCkKKyAgICAgICAgICBpZiAoc3RybmNtcCgoKnRwcCktPm5hbWUsICJ4bWxucyIsIDUpICYmICgoKnRwcCktPm5zIHx8IHN0cmNtcCgoKnRwcCktPm5hbWUsIG5hbWUpID4gMCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgaW50IGs7CisgICAgICAgIGZvciAoOyAqdHBwOyB0cHAgPSAmKCp0cHApLT5uZXh0KQorCXsgaWYgKCFzdHJuY21wKCgqdHBwKS0+bmFtZSwgInhtbG5zOiIsIDYpICYmICFzdHJuY21wKCgqdHBwKS0+bmFtZSArIDYsIG5hbWUsIHMgLSBuYW1lKSAmJiAhKCp0cHApLT5uYW1lWzYgKyBzIC0gbmFtZV0pCisJICB7IGlmICghdHAtPm5zKQorICAgICAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNhbm9uaWNhbGl6YXRpb246IHByZWZpeCAlcz0lcCglcylcbiIsIG5hbWUsICgqdHBwKS0+bnMsICgqdHBwKS0+bnMpKTsKKwkgICAgICB0cC0+bnMgPSAoKnRwcCktPm5zOworCSAgICB9CisJICB9CisgICAgICAgICAgZWxzZSBpZiAoc3RybmNtcCgoKnRwcCktPm5hbWUsICJ4bWxucyIsIDUpICYmICgqdHBwKS0+bnMgJiYgdHAtPm5zICYmICgoayA9IHN0cmNtcCgoKnRwcCktPm5zLCB0cC0+bnMpKSA+IDAgfHwgKCFrICYmIHN0cmNtcCgoKnRwcCktPm5hbWUsIG5hbWUpID4gMCkpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHRwLT5uZXh0ID0gKnRwcDsKKyAgICAgICp0cHAgPSB0cDsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeyB0cC0+bmV4dCA9IHNvYXAtPmF0dHJpYnV0ZXM7CisgICAgICBzb2FwLT5hdHRyaWJ1dGVzID0gdHA7CisgICAgfQorICAgIHN0cmNweSh0cC0+bmFtZSwgbmFtZSk7CisgICAgdHAtPnZhbHVlID0gTlVMTDsKKyAgfQorICBlbHNlIGlmICh0cC0+dmlzaWJsZSkKKyAgeyByZXR1cm4gU09BUF9PSzsKKyAgfQorICBlbHNlIGlmICh2YWx1ZSAmJiB0cC0+dmFsdWUgJiYgdHAtPnNpemUgPD0gc3RybGVuKHZhbHVlKSkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWUgYXR0cmlidXRlIHZhbHVlIG9mICVzIChmcmVlICVwKVxuIiwgbmFtZSwgdHAtPnZhbHVlKSk7CisgICAgU09BUF9GUkVFKHNvYXAsIHRwLT52YWx1ZSk7CisgICAgdHAtPnZhbHVlID0gTlVMTDsKKyAgICB0cC0+bnMgPSBOVUxMOworICB9CisgIGlmICh2YWx1ZSkKKyAgeyBpZiAoIXRwLT52YWx1ZSkKKyAgICB7IHRwLT5zaXplID0gc3RybGVuKHZhbHVlKSArIDE7CisgICAgICBpZiAoISh0cC0+dmFsdWUgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgdHAtPnNpemUpKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFsbG9jYXRlIGF0dHJpYnV0ZSB2YWx1ZSBvZiAlcyAoJXApXG4iLCB0cC0+bmFtZSwgdHAtPnZhbHVlKSk7CisgICAgfQorICAgIHN0cmNweSh0cC0+dmFsdWUsIHZhbHVlKTsKKyAgICBpZiAoIXN0cm5jbXAodHAtPm5hbWUsICJ4bWxuczoiLCA2KSkKKyAgICAgIHRwLT5ucyA9IHRwLT52YWx1ZTsKKyAgICB0cC0+dmlzaWJsZSA9IDI7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmICghc3RyY21wKG5hbWUsICJ3c3U6SWQiKSkKKyAgICB7IHNvYXAtPnBhcnQgPSBTT0FQX0JFR0lOX1NFQ1VSSVRZOworICAgICAgc3RybmNweShzb2FwLT5pZCwgdmFsdWUsIHNpemVvZihzb2FwLT5pZCkpOworICAgICAgc29hcC0+aWRbc2l6ZW9mKHNvYXAtPmlkKS0xXSA9ICdcMCc7CisgICAgfQorI2VuZGlmCisgIH0KKyAgZWxzZQorICAgIHRwLT52aXNpYmxlID0gMTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2Nscl9hdHRyKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKnRwOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKSkKKyAgeyB3aGlsZSAoc29hcC0+YXR0cmlidXRlcykKKyAgICB7IHRwID0gc29hcC0+YXR0cmlidXRlcy0+bmV4dDsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5hdHRyaWJ1dGVzLT52YWx1ZSk7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+YXR0cmlidXRlcyk7CisgICAgICBzb2FwLT5hdHRyaWJ1dGVzID0gdHA7CisgICAgfQorICB9CisgIGVsc2UKKyNlbmRpZgorICB7IGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgICAgIHRwLT52aXNpYmxlID0gMDsKKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorc3RhdGljIGludAorc29hcF9nZXRhdHRydmFsKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpzLCBzaXplX3Qgbiwgc29hcF93Y2hhciBkKQoreyByZWdpc3RlciBzaXplX3QgaTsKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgeyByZWdpc3RlciBzb2FwX3djaGFyIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgICBzd2l0Y2ggKGMpCisgICAgeworICAgIGNhc2UgU09BUF9UVDoKKyAgICAgICpzKysgPSAnPCc7CisgICAgICBzb2FwX3VuZ2V0KHNvYXAsICcvJyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTFQ6CisgICAgICAqcysrID0gJzwnOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0dUOgorICAgICAgaWYgKGQgPT0gJyAnKQorICAgICAgeyBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICAqcyA9ICdcMCc7CisgICAgICAgIHJldHVybiBTT0FQX09LOworICAgICAgfQorICAgICAgKnMrKyA9ICc+JzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9RVDoKKyAgICAgIGlmIChjID09IGQpCisgICAgICB7ICpzID0gJ1wwJzsKKyAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgICB9CisgICAgICAqcysrID0gJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0FQOgorICAgICAgaWYgKGMgPT0gZCkKKyAgICAgIHsgKnMgPSAnXDAnOworICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICAgIH0KKyAgICAgICpzKysgPSAnXCcnOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnXHQnOgorICAgIGNhc2UgJ1xuJzoKKyAgICBjYXNlICdccic6CisgICAgY2FzZSAnICc6CisgICAgY2FzZSAnLyc6CisgICAgICBpZiAoZCA9PSAnICcpCisgICAgICB7IHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgICpzID0gJ1wwJzsKKyAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAgICpzKysgPSAoY2hhciljOworICAgIH0KKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFdJVEhfRkFTVAorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zdG9yZV9sYWIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBuKQoreyBzb2FwLT5sYWJpZHggPSAwOworICByZXR1cm4gc29hcF9hcHBlbmRfbGFiKHNvYXAsIHMsIG4pOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBXSVRIX0ZBU1QKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYXBwZW5kX2xhYihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgc2l6ZV90IG4pCit7IGlmIChzb2FwLT5sYWJpZHggKyBuID49IHNvYXAtPmxhYmxlbikKKyAgeyByZWdpc3RlciBjaGFyICp0ID0gc29hcC0+bGFiYnVmOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5sYXJnaW5nIGxvb2stYXNpZGUgYnVmZmVyIHRvIGFwcGVuZCBkYXRhLCBvbGQgc2l6ZT0lbHUiLCAodW5zaWduZWQgbG9uZylzb2FwLT5sYWJsZW4pKTsKKyAgICBpZiAoc29hcC0+bGFibGVuID09IDApCisgICAgICBzb2FwLT5sYWJsZW4gPSBTT0FQX0xBQkxFTjsKKyAgICB3aGlsZSAoc29hcC0+bGFiaWR4ICsgbiA+PSBzb2FwLT5sYWJsZW4pCisgICAgICBzb2FwLT5sYWJsZW4gPDw9IDE7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIsIG5ldyBzaXplPSVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpc29hcC0+bGFibGVuKSk7CisgICAgc29hcC0+bGFiYnVmID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHNvYXAtPmxhYmxlbik7CisgICAgaWYgKCFzb2FwLT5sYWJidWYpCisgICAgeyBpZiAodCkKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHQpOworICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgfQorICAgIGlmICh0KQorICAgIHsgbWVtY3B5KHNvYXAtPmxhYmJ1ZiwgdCwgc29hcC0+bGFiaWR4KTsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCB0KTsKKyAgICB9CisgIH0KKyAgaWYgKHMpCisgIHsgbWVtY3B5KHNvYXAtPmxhYmJ1ZiArIHNvYXAtPmxhYmlkeCwgcywgbik7CisgICAgc29hcC0+bGFiaWR4ICs9IG47CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wZWVrX2VsZW1lbnQoc3RydWN0IHNvYXAgKnNvYXApCit7CisjaWZkZWYgV0lUSF9ET00KKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAqKmF0dCA9IE5VTEw7CisgIHJlZ2lzdGVyIGNoYXIgKmxlYWQgPSBOVUxMOworI2VuZGlmCisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqdHA7CisgIGNvbnN0IGNoYXIgKnQ7CisgIHJlZ2lzdGVyIGNoYXIgKnM7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIGlmIChzb2FwLT5wZWVrZWQpCisgIHsgaWYgKCEqc29hcC0+dGFnKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9OT19UQUc7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgc29hcC0+cGVla2VkID0gMTsKKyAgYyA9IHNvYXBfZ2V0dXRmOChzb2FwKTsKKyNpZmRlZiBXSVRIX0RPTQorICAvKiB3aGl0ZXNwYWNlIGxlYWRpbmcgdG8gc3RhcnQgdGFnIGlzIG5vdCBpbnNpZ25pZmljYW50IGZvciBET00gKi8KKyAgaWYgKHNvYXBfYmxhbmsoYykpCisgIHsgc29hcC0+bGFiaWR4ID0gMDsKKyAgICBkbworICAgIHsgaWYgKHNvYXBfYXBwZW5kX2xhYihzb2FwLCBOVUxMLCAwKSkKKyAgICAgICAgcmV0dXJuIFNPQVBfRU9NOworICAgICAgcyA9IHNvYXAtPmxhYmJ1ZiArIHNvYXAtPmxhYmlkeDsKKyAgICAgIGkgPSBzb2FwLT5sYWJsZW4gLSBzb2FwLT5sYWJpZHg7CisgICAgICBzb2FwLT5sYWJpZHggPSBzb2FwLT5sYWJsZW47CisgICAgICB3aGlsZSAoc29hcF9ibGFuayhjKSAmJiBpLS0pCisgICAgICB7ICpzKysgPSBjOworICAgICAgICBjID0gc29hcF9nZXR1dGY4KHNvYXApOworICAgICAgfQorICAgIH0KKyAgICB3aGlsZSAoc29hcF9ibGFuayhjKSk7CisgICAgKnMgPSAnXDAnOworICAgIGxlYWQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT5sYWJidWYpOworICB9CisjZWxzZQorICB3aGlsZSAoc29hcF9ibGFuayhjKSkKKyAgICBjID0gc29hcF9nZXR1dGY4KHNvYXApOworI2VuZGlmCisgIGlmIChjICE9IFNPQVBfTFQpCisgIHsgKnNvYXAtPnRhZyA9ICdcMCc7CisgICAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworI2lmZGVmIFdJVEhfRE9NCisgICAgLyogd2hpdGVzcGFjZSBsZWFkaW5nIHRvIGVuZCB0YWcgaXMgbm90IGluc2lnbmlmaWNhbnQgZm9yIERPTSAqLworICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICAgICAgc29hcC0+ZG9tLT50YWlsID0gc29hcF9zdHJkdXAoc29hcCwgbGVhZCk7CisjZW5kaWYKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX05PX1RBRzsKKyAgfQorICBzID0gc29hcC0+dGFnOworICBkbyBjID0gc29hcF9nZXQxKHNvYXApOworICB3aGlsZSAoc29hcF9ibGFuayhjKSk7CisgIGkgPSBzaXplb2Yoc29hcC0+dGFnKTsKKyAgd2hpbGUgKGMgIT0gJz4nICYmIGMgIT0gJy8nICYmIHNvYXBfbm90YmxhbmsoYykpCisgIHsgaWYgKC0taSA+IDApCisgICAgICAqcysrID0gKGNoYXIpYzsKKyAgICBjID0gc29hcF9nZXQxKHNvYXApOworICB9CisgIHdoaWxlIChzb2FwX2JsYW5rKGMpKQorICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICpzID0gJ1wwJzsKKyAgc29hcC0+aWRbMF0gPSAnXDAnOworICBzb2FwLT5ocmVmWzBdID0gJ1wwJzsKKyAgc29hcC0+dHlwZVswXSA9ICdcMCc7CisgIHNvYXAtPmFycmF5VHlwZVswXSA9ICdcMCc7CisgIHNvYXAtPmFycmF5U2l6ZVswXSA9ICdcMCc7CisgIHNvYXAtPmFycmF5T2Zmc2V0WzBdID0gJ1wwJzsKKyAgc29hcC0+b3RoZXIgPSAwOworICBzb2FwLT5yb290ID0gLTE7CisgIHNvYXAtPnBvc2l0aW9uID0gMDsKKyAgc29hcC0+bnVsbCA9IDA7CisgIHNvYXAtPm11c3RVbmRlcnN0YW5kID0gMDsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqZWx0OworICAgIGVsdCA9IChzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50KSk7CisgICAgaWYgKCFlbHQpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICBlbHQtPm5leHQgPSBOVUxMOworICAgIGVsdC0+bnN0ciA9IE5VTEw7CisgICAgZWx0LT5uYW1lID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+dGFnKTsKKyAgICBlbHQtPnBybnQgPSBzb2FwLT5kb207CisgICAgZWx0LT5lbHRzID0gTlVMTDsKKyAgICBlbHQtPmF0dHMgPSBOVUxMOworICAgIGVsdC0+ZGF0YSA9IE5VTEw7CisgICAgZWx0LT53aWRlID0gTlVMTDsKKyAgICBlbHQtPnR5cGUgPSAwOworICAgIGVsdC0+bm9kZSA9IE5VTEw7CisgICAgZWx0LT5oZWFkID0gbGVhZDsKKyAgICBlbHQtPnRhaWwgPSBOVUxMOworICAgIGVsdC0+c29hcCA9IHNvYXA7CisgICAgaWYgKHNvYXAtPmRvbSkKKyAgICB7IHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICpwID0gc29hcC0+ZG9tLT5lbHRzOworICAgICAgaWYgKHApCisgICAgICB7IHdoaWxlIChwLT5uZXh0KQorICAgICAgICAgIHAgPSBwLT5uZXh0OworICAgICAgICBwLT5uZXh0ID0gZWx0OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBzb2FwLT5kb20tPmVsdHMgPSBlbHQ7CisgICAgfQorICAgIHNvYXAtPmRvbSA9IGVsdDsKKyAgICBhdHQgPSAmZWx0LT5hdHRzOworICB9CisjZW5kaWYKKyAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICAgIHRwLT52aXNpYmxlID0gMDsKKyAgd2hpbGUgKChpbnQpYyAhPSBFT0YgJiYgYyAhPSAnPicgJiYgYyAhPSAnLycpCisgIHsgcyA9IHNvYXAtPnRtcGJ1ZjsKKyAgICBpID0gc2l6ZW9mKHNvYXAtPnRtcGJ1Zik7CisgICAgd2hpbGUgKGMgIT0gJz0nICYmIGMgIT0gJz4nICYmIGMgIT0gJy8nICYmIHNvYXBfbm90YmxhbmsoYykpCisgICAgeyBpZiAoLS1pID4gMCkKKyAgICAgICAgKnMrKyA9IChjaGFyKWM7CisgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworICAgIH0KKyAgICAqcyA9ICdcMCc7CisgICAgaWYgKGkgPT0gc2l6ZW9mKHNvYXAtPnRtcGJ1ZikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1NZTlRBWF9FUlJPUjsKKyNpZmRlZiBXSVRIX0RPTQorICAgIC8qIGFkZCBhdHRyaWJ1dGUgbmFtZSB0byBkb20gKi8KKyAgICBpZiAoYXR0KQorICAgIHsgKmF0dCA9IChzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSkpOworICAgICAgIGlmICghKmF0dCkKKyAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgICgqYXR0KS0+bmV4dCA9IE5VTEw7CisgICAgICAgKCphdHQpLT5uc3RyID0gTlVMTDsKKyAgICAgICAoKmF0dCktPm5hbWUgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT50bXBidWYpOworICAgICAgICgqYXR0KS0+ZGF0YSA9IE5VTEw7CisgICAgICAgKCphdHQpLT53aWRlID0gTlVMTDsKKyAgICAgICAoKmF0dCktPnNvYXAgPSBzb2FwOworICAgIH0KKyNlbmRpZgorICAgIGlmICghc3RybmNtcChzb2FwLT50bXBidWYsICJ4bWxucyIsIDUpKQorICAgIHsgaWYgKHNvYXAtPnRtcGJ1Zls1XSA9PSAnOicpCisgICAgICB7IHNvYXAtPnRtcGJ1Zls1XSA9ICdcMCc7CisgICAgICAgIHQgPSBzb2FwLT50bXBidWYgKyA2OworICAgICAgfQorICAgICAgZWxzZSBpZiAoc29hcC0+dG1wYnVmWzVdKQorICAgICAgICB0ID0gTlVMTDsKKyAgICAgIGVsc2UKKyAgICAgICAgdCA9IFNPQVBfU1RSX0VPUzsKKyAgICB9CisgICAgZWxzZQorICAgICAgdCA9IE5VTEw7CisgICAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICAgIHsgaWYgKCFTT0FQX1NUUkNNUCh0cC0+bmFtZSwgc29hcC0+dG1wYnVmKSkKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghdHApCisgICAgeyB0cCA9IChzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUpICsgc3RybGVuKHNvYXAtPnRtcGJ1ZikpOworICAgICAgaWYgKCF0cCkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICBzdHJjcHkodHAtPm5hbWUsIHNvYXAtPnRtcGJ1Zik7CisgICAgICB0cC0+dmFsdWUgPSBOVUxMOworICAgICAgdHAtPnNpemUgPSAwOworICAgICAgdHAtPm5leHQgPSBzb2FwLT5hdHRyaWJ1dGVzOworICAgICAgc29hcC0+YXR0cmlidXRlcyA9IHRwOworICAgIH0KKyAgICB3aGlsZSAoc29hcF9ibGFuayhjKSkKKyAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgaWYgKGMgPT0gJz0nKQorICAgIHsgZG8gYyA9IHNvYXBfZ2V0dXRmOChzb2FwKTsKKyAgICAgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyAgICAgIGlmIChjICE9IFNPQVBfUVQgJiYgYyAhPSBTT0FQX0FQKQorICAgICAgeyBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICBjID0gJyAnOyAvKiBibGFuayBkZWxpbWl0ZXIgKi8KKyAgICAgIH0KKyAgICAgIGlmIChzb2FwX2dldGF0dHJ2YWwoc29hcCwgdHAtPnZhbHVlLCB0cC0+c2l6ZSwgYykpCisgICAgICB7CisjaWZkZWYgV0lUSF9GQVNUCisgICAgICAgIGlmIChzb2FwLT5lcnJvciAhPSBTT0FQX0VPTSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKwlpZiAoc29hcF9zdG9yZV9sYWIoc29hcCwgdHAtPnZhbHVlLCB0cC0+c2l6ZSkpCisJICByZXR1cm4gc29hcC0+ZXJyb3I7CisJaWYgKHRwLT52YWx1ZSkKKwkgIFNPQVBfRlJFRShzb2FwLCB0cC0+dmFsdWUpOworCWZvciAoOzspCisJeyBpZiAoc29hcF9nZXRhdHRydmFsKHNvYXAsIHNvYXAtPmxhYmJ1ZiArIHNvYXAtPmxhYmlkeCwgc29hcC0+bGFibGVuIC0gc29hcC0+bGFiaWR4LCBjKSkKKwkgIHsgaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfRU9NKQorCSAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKwkgICAgc29hcC0+bGFiaWR4ID0gc29hcC0+bGFibGVuOworCSAgICBpZiAoc29hcF9hcHBlbmRfbGFiKHNvYXAsIE5VTEwsIDApKQorCSAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKwkgIH0KKwkgIGVsc2UKKwkgICAgYnJlYWs7CisJfQorCWlmIChzb2FwLT5sYWJpZHgpCisgICAgICAgICAgdHAtPnNpemUgPSBzb2FwLT5sYWJsZW47CisJZWxzZQorCXsgdHAtPnNpemUgPSBzdHJsZW4oc29hcC0+bGFiYnVmKSArIDE7CisgICAgICAgICAgaWYgKHRwLT5zaXplIDwgU09BUF9MQUJMRU4pCisJICAgIHRwLT5zaXplID0gU09BUF9MQUJMRU47CisgICAgICAgIH0KKwlpZiAoISh0cC0+dmFsdWUgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgdHAtPnNpemUpKSkKKwkgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgICBzdHJjcHkodHAtPnZhbHVlLCBzb2FwLT5sYWJidWYpOworI2Vsc2UKKwlzaXplX3QgbjsKKyAgICAgICAgaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfRU9NKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICAgICAgICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBmb3IgKDs7KQorICAgICAgICB7IGlmICghKHMgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIFNPQVBfQkxLTEVOKSkpCisgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgICAgaWYgKHNvYXBfZ2V0YXR0cnZhbChzb2FwLCBzLCBTT0FQX0JMS0xFTiwgYykpCisgICAgICAgICAgeyBpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9FT00pCisgICAgICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwluID0gdHAtPnNpemUgKyBzb2FwLT5ibGlzdC0+c2l6ZTsKKyAgICAgICAgaWYgKCEocyA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBuKSkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICAgIGlmICh0cC0+dmFsdWUpCisgICAgICAgIHsgbWVtY3B5KHMsIHRwLT52YWx1ZSwgdHAtPnNpemUpOworICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCB0cC0+dmFsdWUpOworICAgICAgICB9CisgICAgICAgIHNvYXBfc2F2ZV9ibG9jayhzb2FwLCBzICsgdHAtPnNpemUsIDApOworICAgICAgICB0cC0+dmFsdWUgPSBzOworICAgICAgICB0cC0+c2l6ZSA9IG47CisjZW5kaWYKKyAgICAgIH0KKyAgICAgIGRvIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICB3aGlsZSAoc29hcF9ibGFuayhjKSk7CisgICAgICB0cC0+dmlzaWJsZSA9IDI7IC8qIHNlZW4gdGhpcyBhdHRyaWJ1dGUgdy8gdmFsdWUgKi8KKyNpZmRlZiBXSVRIX0RPTQorICAgICAgaWYgKGF0dCkKKyAgICAgICAgKCphdHQpLT5kYXRhID0gc29hcF9zdHJkdXAoc29hcCwgdHAtPnZhbHVlKTsKKyNlbmRpZgorICAgIH0KKyAgICBlbHNlCisgICAgICB0cC0+dmlzaWJsZSA9IDE7IC8qIHNlZW4gdGhpcyBhdHRyaWJ1dGUgdy9vIHZhbHVlICovCisjaWZkZWYgV0lUSF9ET00KKyAgICBpZiAoYXR0KQorICAgICAgYXR0ID0gJigqYXR0KS0+bmV4dDsKKyNlbmRpZgorICAgIGlmICh0ICYmIHRwLT52YWx1ZSkKKyAgICB7IGlmIChzb2FwX3B1c2hfbmFtZXNwYWNlKHNvYXAsIHQsIHRwLT52YWx1ZSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHRwLT52aXNpYmxlID0gMDsKKyAgICB9CisgIH0KKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoYXR0KQorICB7IHNvYXAtPmRvbS0+bnN0ciA9IHNvYXBfY3VycmVudF9uYW1lc3BhY2Uoc29hcCwgc29hcC0+dGFnKTsKKyAgICBmb3IgKGF0dCA9ICZzb2FwLT5kb20tPmF0dHM7ICphdHQ7IGF0dCA9ICYoKmF0dCktPm5leHQpCisgICAgICAoKmF0dCktPm5zdHIgPSBzb2FwX2N1cnJlbnRfbmFtZXNwYWNlKHNvYXAsICgqYXR0KS0+bmFtZSk7CisgIH0KKyNlbmRpZgorICBpZiAoKGludCljID09IEVPRikKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgaWYgKCEoc29hcC0+Ym9keSA9IChjICE9ICcvJykpKQorICAgIGRvIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworI2lmZGVmIFdJVEhfRE9NCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKQorICB7IGlmICghc29hcC0+Ym9keSAmJiBzb2FwLT5kb20tPnBybnQpCisgICAgICBzb2FwLT5kb20gPSBzb2FwLT5kb20tPnBybnQ7CisgIH0KKyNlbmRpZgorICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgIHsgaWYgKHRwLT52aXNpYmxlICYmIHRwLT52YWx1ZSkKKyAgICB7IGlmICghc3RyY21wKHRwLT5uYW1lLCAiaWQiKSkKKyAgICAgIHsgKnNvYXAtPmlkID0gJyMnOworICAgICAgICBzdHJuY3B5KHNvYXAtPmlkICsgMSwgdHAtPnZhbHVlLCBzaXplb2Yoc29hcC0+aWQpIC0gMik7CisgICAgICAgIHNvYXAtPmlkW3NpemVvZihzb2FwLT5pZCktMV0gPSAnXDAnOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIXN0cmNtcCh0cC0+bmFtZSwgImhyZWYiKSkKKyAgICAgIHsgc3RybmNweShzb2FwLT5ocmVmLCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT5ocmVmKSAtIDEpOworICAgICAgICBzb2FwLT5ocmVmW3NpemVvZihzb2FwLT5ocmVmKS0xXSA9ICdcMCc7CisgICAgICB9CisgICAgICBlbHNlIGlmICgoc29hcC0+dmVyc2lvbiA9PSAyIHx8IChzb2FwLT5tb2RlICYgU09BUF9YTUxfR1JBUEgpKSAmJiAhc3RyY21wKHRwLT5uYW1lLCAicmVmIikpCisgICAgICB7ICpzb2FwLT5ocmVmID0gJyMnOworICAgICAgICBzdHJuY3B5KHNvYXAtPmhyZWYgKyAxLCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT5ocmVmKSAtIDIpOworICAgICAgICBzb2FwLT5ocmVmW3NpemVvZihzb2FwLT5ocmVmKS0xXSA9ICdcMCc7CisgICAgICB9CisgICAgICBlbHNlIGlmICghc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJ4c2k6dHlwZSIpKQorICAgICAgeyBzdHJuY3B5KHNvYXAtPnR5cGUsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPnR5cGUpIC0gMSk7CisgICAgICAgIHNvYXAtPnR5cGVbc2l6ZW9mKHNvYXAtPnR5cGUpLTFdID0gJ1wwJzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHNvYXAtPnZlcnNpb24gPT0gMSAmJiAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOQzphcnJheVR5cGUiKSkKKyAgICAgIHsgcyA9IHNvYXBfc3RycmNocih0cC0+dmFsdWUsICdbJyk7CisgICAgICAgIGlmIChzICYmIChzaXplX3QpKHMgLSB0cC0+dmFsdWUpIDwgc2l6ZW9mKHNvYXAtPmFycmF5VHlwZSkpCisgICAgICAgIHsgc3RybmNweShzb2FwLT5hcnJheVR5cGUsIHRwLT52YWx1ZSwgcyAtIHRwLT52YWx1ZSk7CisgICAgICAgICAgc29hcC0+YXJyYXlUeXBlW3MgLSB0cC0+dmFsdWVdID0gJ1wwJzsKKyAgICAgICAgICBzdHJuY3B5KHNvYXAtPmFycmF5U2l6ZSwgcywgc2l6ZW9mKHNvYXAtPmFycmF5U2l6ZSkgLSAxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgc3RybmNweShzb2FwLT5hcnJheVR5cGUsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPmFycmF5VHlwZSkgLSAxKTsKKyAgICAgICAgc29hcC0+YXJyYXlTaXplW3NpemVvZihzb2FwLT5hcnJheVR5cGUpLTFdID0gJ1wwJzsKKyAgICAgICAgc29hcC0+YXJyYXlUeXBlW3NpemVvZihzb2FwLT5hcnJheVR5cGUpLTFdID0gJ1wwJzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHNvYXAtPnZlcnNpb24gPT0gMiAmJiAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOQzppdGVtVHlwZSIpKQorICAgICAgICBzdHJuY3B5KHNvYXAtPmFycmF5VHlwZSwgdHAtPnZhbHVlLCBzaXplb2Yoc29hcC0+YXJyYXlUeXBlKSAtIDEpOworICAgICAgZWxzZSBpZiAoc29hcC0+dmVyc2lvbiA9PSAyICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5DOmFycmF5U2l6ZSIpKQorICAgICAgICBzdHJuY3B5KHNvYXAtPmFycmF5U2l6ZSwgdHAtPnZhbHVlLCBzaXplb2Yoc29hcC0+YXJyYXlTaXplKSAtIDEpOworICAgICAgZWxzZSBpZiAoc29hcC0+dmVyc2lvbiA9PSAxICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5DOm9mZnNldCIpKQorICAgICAgICBzdHJuY3B5KHNvYXAtPmFycmF5T2Zmc2V0LCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT5hcnJheU9mZnNldCkpOworICAgICAgZWxzZSBpZiAoc29hcC0+dmVyc2lvbiA9PSAxICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5DOnBvc2l0aW9uIikpCisgICAgICAgIHNvYXAtPnBvc2l0aW9uID0gc29hcF9nZXRwb3NpdGlvbih0cC0+dmFsdWUsIHNvYXAtPnBvc2l0aW9ucyk7CisgICAgICBlbHNlIGlmIChzb2FwLT52ZXJzaW9uID09IDEgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTkM6cm9vdCIpKQorICAgICAgICBzb2FwLT5yb290ID0gKCghc3RyY21wKHRwLT52YWx1ZSwgIjEiKSB8fCAhc3RyY21wKHRwLT52YWx1ZSwgInRydWUiKSkpOworICAgICAgZWxzZSBpZiAoKHNvYXAtPnZlcnNpb24gPT0gMSAmJiAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOVjphY3RvciIpKQorICAgICAgICAgICAgfHwgKHNvYXAtPnZlcnNpb24gPT0gMiAmJiAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOVjpyb2xlIikpKQorICAgICAgeyBpZiAoKCFzb2FwLT5hY3RvciB8fCBzdHJjbXAoc29hcC0+YWN0b3IsIHRwLT52YWx1ZSkpCisgICAgICAgICAmJiBzdHJjbXAodHAtPnZhbHVlLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9hY3Rvci9uZXh0IikKKyAgICAgICAgICYmIHN0cmNtcCh0cC0+dmFsdWUsICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUvcm9sZS9uZXh0IikpCisgICAgICAgICAgc29hcC0+b3RoZXIgPSAxOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTlY6bXVzdFVuZGVyc3RhbmQiKQorICAgICAgICAgICAgJiYgKCFzdHJjbXAodHAtPnZhbHVlLCAiMSIpIHx8ICFzdHJjbXAodHAtPnZhbHVlLCAidHJ1ZSIpKSkKKyAgICAgICAgc29hcC0+bXVzdFVuZGVyc3RhbmQgPSAxOworICAgICAgZWxzZSBpZiAoKCFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgInhzaTpudWxsIikKKyAgICAgICAgICAgICB8fCAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJ4c2k6bmlsIikpCisgICAgICAgICAgICAmJiAoIXN0cmNtcCh0cC0+dmFsdWUsICIxIikKKyAgICAgICAgICAgICB8fCAhc3RyY21wKHRwLT52YWx1ZSwgInRydWUiKSkpCisgICAgICAgIHNvYXAtPm51bGwgPSAxOworICAgIH0KKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9yZXRyeShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICBzb2FwX3JldmVydChzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfcmV2ZXJ0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoIXNvYXAtPnBlZWtlZCkKKyAgeyBzb2FwLT5wZWVrZWQgPSAxOworICAgIGlmIChzb2FwLT5ib2R5KQorICAgICAgc29hcC0+bGV2ZWwtLTsKKyAgfQorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJldmVydGluZyBsYXN0IGVsZW1lbnQgKGxldmVsPSV1KVxuIiwgc29hcC0+bGV2ZWwpKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zdHJpbmdfb3V0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBpbnQgZmxhZykKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqdDsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICByZWdpc3RlciBzb2FwX3djaGFyIG1hc2sgPSAweEZGRkZGRjgwVUw7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgc29hcC0+ZG9tLT5kYXRhID0gc29hcF9zdHJkdXAoc29hcCwgcyk7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNlbmRpZgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfQ19VVEZTVFJJTkcpCisgICAgbWFzayA9IDA7CisgIHQgPSBzOworICB3aGlsZSAoKGMgPSAqdCsrKSkKKyAgeyBzd2l0Y2ggKGMpCisgICAgeyAKKyAgICBjYXNlIDk6CisgICAgICBpZiAoZmxhZykKKyAgICAgIHsgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICImI3g5OyIsIDUpKQorCSAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBzID0gdDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTA6CisgICAgICBpZiAoZmxhZyB8fCAhKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpKQorICAgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIiYjeEE7IiwgNSkpCisJICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHMgPSB0OworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAxMzoKKyAgICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiJiN4RDsiLCA1KSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgcyA9IHQ7CisgICAgICBicmVhazsKKyAgICBjYXNlICcmJzoKKyAgICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiJmFtcDsiLCA1KSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgcyA9IHQ7CisgICAgICBicmVhazsKKyAgICBjYXNlICc8JzoKKyAgICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiJmx0OyIsIDQpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBzID0gdDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJz4nOgorICAgICAgaWYgKCFmbGFnKQorICAgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIiZndDsiLCA0KSkKKwkgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgcyA9IHQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICciJzoKKyAgICAgIGlmIChmbGFnKQorICAgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIiZxdW90OyIsIDYpKQorCSAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBzID0gdDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZkZWYgSEFWRV9NQlRPV0MKKyAgICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9DX01CU1RSSU5HKQorICAgICAgeyB3Y2hhcl90IHdjOworICAgICAgICByZWdpc3RlciBpbnQgbSA9IG1idG93Yygmd2MsIHQgLSAxLCBNQl9DVVJfTUFYKTsKKyAgICAgICAgaWYgKG0gPiAwICYmIHdjICE9IGMpCisgICAgICAgIHsgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3B1dHV0Zjgoc29hcCwgd2MpKQorICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworCSAgcyA9IHQgKz0gbSAtIDE7CisJICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisjZW5kaWYKKyAgICAgIGlmIChjICYgbWFzaykKKyAgICAgIHsgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3B1dHV0Zjgoc29hcCwgKHVuc2lnbmVkIGNoYXIpYykpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBzID0gdDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9zdHJpbmdfaW4oc3RydWN0IHNvYXAgKnNvYXAsIGludCBmbGFnLCBsb25nIG1pbmxlbiwgbG9uZyBtYXhsZW4pCit7IHJlZ2lzdGVyIGNoYXIgKnM7CisgIGNoYXIgKnQgPSBOVUxMOworICByZWdpc3RlciBzaXplX3QgaTsKKyAgcmVnaXN0ZXIgbG9uZyBsID0gMDsKKyAgcmVnaXN0ZXIgaW50IG4gPSAwOworICByZWdpc3RlciBpbnQgbSA9IDA7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyNpZiAhZGVmaW5lZChXSVRIX0xFQU5FUikgJiYgZGVmaW5lZChIQVZFX1dDVE9NQikKKyAgY2hhciBidWZbTUJfTEVOX01BWCA+IDggPyBNQl9MRU5fTUFYIDogOF07CisjZWxzZQorICBjaGFyIGJ1Zls4XTsKKyNlbmRpZgorICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVhZGluZyBzdHJpbmcgY29udGVudFxuIikpOworICBpZiAoc29hcC0+cGVla2VkKQorICB7IGlmICghc29hcC0+Ym9keSkKKyAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgqc29hcC0+dGFnKQorICAgIHsgbiA9IDE7CisgICAgICBzb2FwLT5wZWVrZWQgPSAwOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIHQgPSBzb2FwLT50bXBidWY7CisgICAgICB0WzBdID0gJzwnOworICAgICAgc3RybmNweSh0ICsgMSwgc29hcC0+dGFnLCBzaXplb2Yoc29hcC0+dG1wYnVmKSAtIDEpOworICAgICAgc3RybmNhdCh0LCAiPiIsIHNpemVvZihzb2FwLT50bXBidWYpKTsKKyAgICAgIG0gPSBzdHJsZW4oc29hcC0+dGFnKSArIDI7CisjZW5kaWYKKyAgICB9CisgIH0KKyNpZmRlZiBXSVRIX0NEQVRBCisgIGlmICghZmxhZykKKyAgeyByZWdpc3RlciBpbnQgc3RhdGUgPSAwOworI2lmZGVmIFdJVEhfRkFTVAorICAgIHNvYXAtPmxhYmlkeCA9IDA7CQkJLyogdXNlIGxvb2stYXNpZGUgYnVmZmVyICovCisjZWxzZQorICAgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgICAgZm9yICg7OykKKyAgICB7IAorI2lmZGVmIFdJVEhfRkFTVAorICAgICAgcmVnaXN0ZXIgc2l6ZV90IGs7CisgICAgICBpZiAoc29hcF9hcHBlbmRfbGFiKHNvYXAsIE5VTEwsIDApKQkvKiBhbGxvY2F0ZSBtb3JlIHNwYWNlIGluIGxvb2stYXNpZGUgYnVmZmVyIGlmIG5lY2Vzc2FyeSAqLworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIHMgPSBzb2FwLT5sYWJidWYgKyBzb2FwLT5sYWJpZHg7CS8qIHNwYWNlIHRvIHBvcHVsYXRlICovCisgICAgICBrID0gc29hcC0+bGFibGVuIC0gc29hcC0+bGFiaWR4OwkvKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlICovCisgICAgICBzb2FwLT5sYWJpZHggPSBzb2FwLT5sYWJsZW47CS8qIGNsYWltIHRoaXMgc3BhY2UgKi8KKyNlbHNlCisgICAgICByZWdpc3RlciBzaXplX3QgayA9IFNPQVBfQkxLTEVOOworICAgICAgaWYgKCEocyA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgaykpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICAgICAgZm9yIChpID0gMDsgaSA8IGs7IGkrKykKKyAgICAgIHsgaWYgKG0gPiAwKQorICAgICAgICB7ICpzKysgPSAqdCsrOwkvKiBjb3B5IG11bHRpYnl0ZSBjaGFyYWN0ZXJzICovCisJICBtLS07CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKwlpZiAoKGludCljID09IEVPRikKKyAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgaWYgKGMgPj0gMHg4MCAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19MQVRJTikpCisgICAgICAgIHsgc29hcF91bmdldChzb2FwLCBjKTsKKwkgIGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisJICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfQ19VVEZTVFJJTkcpCisgICAgICAgICAgeyBpZiAoKGMgJiAweDgwMDAwMDAwKSAmJiBjID49IC0weDdGRkZGRjgwICYmIGMgPCBTT0FQX0FQKQorICAgICAgICAgICAgeyBjICY9IDB4N0ZGRkZGRkY7CisgICAgICAgICAgICAgIHQgPSBidWY7CisgICAgICAgICAgICAgIGlmIChjIDwgMHgwODAwKQorICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhDMCB8ICgoYyA+PiA2KSAmIDB4MUYpKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7IGlmIChjIDwgMHgwMTAwMDApCisgICAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RTAgfCAoKGMgPj4gMTIpICYgMHgwRikpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7IGlmIChjIDwgMHgyMDAwMDApCisgICAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhGMCB8ICgoYyA+PiAxOCkgJiAweDA3KSk7CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICB7IGlmIChjIDwgMHgwNDAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjggfCAoKGMgPj4gMjQpICYgMHgwMykpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsgKnQrKyA9IChjaGFyKSgweEZDIHwgKChjID4+IDMwKSAmIDB4MDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMjQpICYgMHgzRikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAxOCkgJiAweDNGKSk7CisgICAgICAgICAgICAgICAgICB9ICAgICAKKyAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAxMikgJiAweDNGKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoYyAmIDB4M0YpKTsKKwkgICAgICBtID0gKGludCkodCAtIGJ1ZikgLSAxOworICAgICAgICAgICAgICB0ID0gYnVmOworICAgICAgICAgICAgICAqcysrID0gKnQrKzsKKyAgICAgICAgICAgICAgY29udGludWU7CisJICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKwlzd2l0Y2ggKHN0YXRlKQorICAgICAgICB7IGNhc2UgMToKKyAgICAgICAgICAgIGlmIChjID09ICddJykKKwkgICAgICBzdGF0ZSA9IDQ7CisJICAgICpzKysgPSBjOworCSAgICBjb250aW51ZTsKKwkgIGNhc2UgMjoKKwkgICAgaWYgKGMgPT0gJy0nKQorICAgICAgICAgICAgICBzdGF0ZSA9IDY7CisJICAgICpzKysgPSBjOworCSAgICBjb250aW51ZTsKKwkgIGNhc2UgMzoKKwkgICAgaWYgKGMgPT0gJz8nKQorCSAgICAgIHN0YXRlID0gODsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworICAgICAgICAgIC8qIENEQVRBICovCisJICBjYXNlIDQ6CisJICAgIGlmIChjID09ICddJykKKyAgICAgICAgICAgICAgc3RhdGUgPSA1OworCSAgICBlbHNlCisJICAgICAgc3RhdGUgPSAxOworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisJICBjYXNlIDU6CisJICAgIGlmIChjID09ICc+JykKKwkgICAgICBzdGF0ZSA9IDA7CisJICAgIGVsc2UKKwkgICAgICBzdGF0ZSA9IDE7CisJICAgICpzKysgPSBjOworCSAgICBjb250aW51ZTsKKyAgICAgICAgICAvKiBjb21tZW50ICovCisgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgaWYgKGMgPT0gJy0nKQorCSAgICAgIHN0YXRlID0gNzsKKwkgICAgZWxzZQorCSAgICAgIHN0YXRlID0gMjsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIGlmIChjID09ICc+JykKKwkgICAgICBzdGF0ZSA9IDA7CisJICAgIGVsc2UKKwkgICAgICBzdGF0ZSA9IDI7CisJICAgICpzKysgPSBjOworCSAgICBjb250aW51ZTsKKyAgICAgICAgICAvKiBQSSAqLworCSAgY2FzZSA4OgorICAgICAgICAgICAgaWYgKGMgPT0gJz4nKQorCSAgICAgIHN0YXRlID0gMDsKKwkgICAgZWxzZQorCSAgICAgIHN0YXRlID0gMzsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoYykKKyAgICAgICAgeworICAgICAgICBjYXNlICcvJzoKKyAgICAgICAgICBpZiAobiA+IDApCisgICAgICAgICAgeyBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICAgICAgICAgICAgaWYgKGMgPT0gJz4nKQorICAgICAgICAgICAgICBuLS07CisgICAgICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICAgIH0KKyAgICAgICAgICAqcysrID0gJy8nOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICc8JzoKKwkgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisJICBpZiAoYyA9PSAnLycpCisJICB7IGlmIChuID09IDApCisJICAgIHsgYyA9IFNPQVBfVFQ7CisJICAgICAgZ290byBlbmQ7CisJICAgIH0KKwkgICAgbi0tOworCSAgfQorCSAgZWxzZSBpZiAoYyA9PSAnIScpCisJICB7IGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisJICAgIGlmIChjID09ICdbJykKKyAgICAgICAgICAgIHsgZG8gYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgICAgICAgICAgICAgd2hpbGUgKChpbnQpYyAhPSBFT0YgJiYgYyAhPSAnWycpOworICAgICAgICAgICAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgICAgICAgICAgZ290byBlbmQ7CisJICAgICAgdCA9IChjaGFyKikiIVtDREFUQVsiOworCSAgICAgIG0gPSA4OworCSAgICAgIHN0YXRlID0gMTsKKwkgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnLScpCisJICAgIHsgaWYgKChjID0gc29hcF9nZXRjaGFyKHNvYXApKSA9PSAnLScpCisJICAgICAgICBzdGF0ZSA9IDI7CisJICAgICAgdCA9IChjaGFyKikiIS0iOworCSAgICAgIG0gPSAyOworCSAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7IHQgPSAoY2hhciopIiEiOworCSAgICAgIG0gPSAxOworCSAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisJICAgIH0KKwkgICAgKnMrKyA9ICc8JzsKKwkgICAgYnJlYWs7CisJICB9CisJICBlbHNlIGlmIChjID09ICc/JykKKwkgICAgc3RhdGUgPSAzOworCSAgZWxzZQorCSAgICBuKys7CisgICAgICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgICAqcysrID0gJzwnOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICc+JzoKKyAgICAgICAgICAqcysrID0gJz4nOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICAqcysrID0gJyInOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmZGVmIEhBVkVfV0NUT01CCisgICAgICAgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0NfTUJTVFJJTkcpCisgICAgICAgICAgeyBtID0gd2N0b21iKGJ1ZiwgYyAmIDB4N0ZGRkZGRkYpOworICAgICAgICAgICAgaWYgKG0gPj0gMSAmJiBtIDw9IChpbnQpTUJfQ1VSX01BWCkKKyAgICAgICAgICAgIHsgdCA9IGJ1ZjsKKyAgICAgICAgICAgICAgKnMrKyA9ICp0Kys7CisgICAgICAgICAgICAgIG0tLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgKnMrKyA9IFNPQVBfVU5LTk9XTl9DSEFSOworCSAgICAgIG0gPSAwOworCSAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyNlbmRpZgorI2VuZGlmCisgICAgICAgICAgICAqcysrID0gKGNoYXIpKGMgJiAweEZGKTsKKyAgICAgICAgfQorCWwrKzsKKyAgICAgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiBtYXhsZW4gPj0gMCAmJiBsID4gbWF4bGVuKQorICAgICAgICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJTdHJpbmcgdG9vIGxvbmc6IG1heGxlbj0lbGRcbiIsIG1heGxlbikpOworICAgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9MRU5HVEg7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyNlbmRpZgorI2lmZGVmIFdJVEhfRkFTVAorICBzb2FwLT5sYWJpZHggPSAwOwkJCS8qIHVzZSBsb29rLWFzaWRlIGJ1ZmZlciAqLworI2Vsc2UKKyAgaWYgKHNvYXBfbmV3X2Jsb2NrKHNvYXApKQorICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgIGZvciAoOzspCisgIHsgCisjaWZkZWYgV0lUSF9GQVNUCisgICAgcmVnaXN0ZXIgc2l6ZV90IGs7CisgICAgaWYgKHNvYXBfYXBwZW5kX2xhYihzb2FwLCBOVUxMLCAwKSkJLyogYWxsb2NhdGUgbW9yZSBzcGFjZSBpbiBsb29rLWFzaWRlIGJ1ZmZlciBpZiBuZWNlc3NhcnkgKi8KKyAgICAgIHJldHVybiBOVUxMOworICAgIHMgPSBzb2FwLT5sYWJidWYgKyBzb2FwLT5sYWJpZHg7CS8qIHNwYWNlIHRvIHBvcHVsYXRlICovCisgICAgayA9IHNvYXAtPmxhYmxlbiAtIHNvYXAtPmxhYmlkeDsJLyogbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSAqLworICAgIHNvYXAtPmxhYmlkeCA9IHNvYXAtPmxhYmxlbjsJLyogY2xhaW0gdGhpcyBzcGFjZSAqLworI2Vsc2UKKyAgICByZWdpc3RlciBzaXplX3QgayA9IFNPQVBfQkxLTEVOOworICAgIGlmICghKHMgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIGspKSkKKyAgICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgICAgZm9yIChpID0gMDsgaSA8IGs7IGkrKykKKyAgICB7IGlmIChtID4gMCkKKyAgICAgIHsgKnMrKyA9ICp0Kys7CS8qIGNvcHkgbXVsdGlieXRlIGNoYXJhY3RlcnMgKi8KKyAgICAgICAgbS0tOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9DX1VURlNUUklORykKKyAgICAgIHsgaWYgKCgoYyA9IHNvYXBfZ2V0KHNvYXApKSAmIDB4ODAwMDAwMDApICYmIGMgPj0gLTB4N0ZGRkZGODAgJiYgYyA8IFNPQVBfQVApCisgICAgICAgIHsgYyAmPSAweDdGRkZGRkZGOworICAgICAgICAgIHQgPSBidWY7CisgICAgICAgICAgaWYgKGMgPCAweDA4MDApCisgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4QzAgfCAoKGMgPj4gNikgJiAweDFGKSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsgaWYgKGMgPCAweDAxMDAwMCkKKyAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEUwIHwgKChjID4+IDEyKSAmIDB4MEYpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgaWYgKGMgPCAweDIwMDAwMCkKKyAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjAgfCAoKGMgPj4gMTgpICYgMHgwNykpOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsgaWYgKGMgPCAweDA0MDAwMDAwKQorICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEY4IHwgKChjID4+IDI0KSAmIDB4MDMpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeyAqdCsrID0gKGNoYXIpKDB4RkMgfCAoKGMgPj4gMzApICYgMHgwMSkpOworICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDI0KSAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDE4KSAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgfSAgICAgCisgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAxMikgJiAweDNGKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gNikgJiAweDNGKSk7CisgICAgICAgICAgfQorICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8IChjICYgMHgzRikpOworCSAgbSA9IChpbnQpKHQgLSBidWYpIC0gMTsKKyAgICAgICAgICB0ID0gYnVmOworICAgICAgICAgICpzKysgPSAqdCsrOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisgICAgICBzd2l0Y2ggKGMpCisgICAgICB7CisgICAgICBjYXNlIFNPQVBfVFQ6CisgICAgICAgIGlmIChuID09IDApCisgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIG4tLTsKKyAgICAgICAgKnMrKyA9ICc8JzsKKyAgICAgICAgdCA9IChjaGFyKikiLyI7CisJbSA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTT0FQX0xUOgorICAgICAgICBuKys7CisgICAgICAgICpzKysgPSAnPCc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTT0FQX0dUOgorICAgICAgICAqcysrID0gJz4nOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9RVDoKKyAgICAgICAgKnMrKyA9ICciJzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfQVA6CisgICAgICAgICpzKysgPSAnXCcnOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJy8nOgorICAgICAgICBpZiAobiA+IDApCisgICAgICAgIHsgYyA9IHNvYXBfZ2V0KHNvYXApOworICAgICAgICAgIGlmIChjID09IFNPQVBfR1QpCisgICAgICAgICAgICBuLS07CisgICAgICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgfQorICAgICAgICAqcysrID0gJy8nOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJzwnIHwgMHg4MDAwMDAwMDoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9ICc8JzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAnJic7CisgICAgICAgICAgdCA9IChjaGFyKikibHQ7IjsKKwkgIG0gPSAzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnPicgfCAweDgwMDAwMDAwOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gJz4nOworICAgICAgICBlbHNlCisgICAgICAgIHsgKnMrKyA9ICcmJzsKKyAgICAgICAgICB0ID0gKGNoYXIqKSJndDsiOworCSAgbSA9IDM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICcmJyB8IDB4ODAwMDAwMDA6CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICpzKysgPSAnJic7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAqcysrID0gJyYnOworICAgICAgICAgIHQgPSAoY2hhciopImFtcDsiOworCSAgbSA9IDQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICciJyB8IDB4ODAwMDAwMDA6CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICpzKysgPSAnIic7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAqcysrID0gJyYnOworICAgICAgICAgIHQgPSAoY2hhciopInF1b3Q7IjsKKwkgIG0gPSA1OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnXCcnIHwgMHg4MDAwMDAwMDoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9ICdcJyc7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAqcysrID0gJyYnOworICAgICAgICAgIHQgPSAoY2hhciopImFwb3M7IjsKKwkgIG0gPSA1OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgICAgZ290byBlbmQ7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZkZWYgSEFWRV9XQ1RPTUIKKyAgICAgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0NfTUJTVFJJTkcpCisgICAgICAgIHsgbSA9IHdjdG9tYihidWYsIGMgJiAweDdGRkZGRkZGKTsKKyAgICAgICAgICBpZiAobSA+PSAxICYmIG0gPD0gKGludClNQl9DVVJfTUFYKQorICAgICAgICAgIHsgdCA9IGJ1ZjsKKyAgICAgICAgICAgICpzKysgPSAqdCsrOworICAgICAgICAgICAgbS0tOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeyAqcysrID0gU09BUF9VTktOT1dOX0NIQVI7CisJICAgIG0gPSAwOworCSAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZgorI2VuZGlmCisgICAgICAgICAgKnMrKyA9IChjaGFyKShjICYgMHhGRik7CisgICAgICB9CisgICAgICBsKys7CisgICAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIG1heGxlbiA+PSAwICYmIGwgPiBtYXhsZW4pCisgICAgICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJTdHJpbmcgdG9vIGxvbmc6IG1heGxlbj0lbGRcbiIsIG1heGxlbikpOworICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfTEVOR1RIOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICB9CisgIH0KK2VuZDoKKyAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgKnMgPSAnXDAnOworI2lmZGVmIFdJVEhfRkFTVAorICB0ID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+bGFiYnVmKTsKKyNlbHNlCisgIHNvYXBfc2l6ZV9ibG9jayhzb2FwLCBpKzEpOworICB0ID0gc29hcF9zYXZlX2Jsb2NrKHNvYXAsIE5VTEwsIDApOworI2VuZGlmCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgbCA8IG1pbmxlbikKKyAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiU3RyaW5nIHRvbyBzaG9ydDogJWxkIGNoYXJzLCBtaW5sZW49JWxkXG4iLCBsLCBtaW5sZW4pKTsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfTEVOR1RIOworICAgIHJldHVybiBOVUxMOworICB9CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgaWYgKGZsYWcgPT0gMykKKyAgICAgIHNvYXAtPmRvbS0+dGFpbCA9IHQ7CisgICAgZWxzZQorICAgICAgc29hcC0+ZG9tLT5kYXRhID0gdDsKKyAgfQorI2VuZGlmCisgIGlmIChmbGFnID09IDIpCisgICAgaWYgKHNvYXBfczJRTmFtZShzb2FwLCB0LCAmdCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHQ7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfd3N0cmluZ19vdXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHdjaGFyX3QgKnMsIGludCBmbGFnKQoreyBjb25zdCBjaGFyICp0OworICBjaGFyIHRtcDsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IHdjaGFyX3QgKnIgPSAod2NoYXJfdCopczsKKyAgICBpbnQgbiA9IDE7CisgICAgd2hpbGUgKCpyKyspCisgICAgICBuKys7CisgICAgc29hcC0+ZG9tLT53aWRlID0gciA9ICh3Y2hhcl90Kilzb2FwX21hbGxvYyhzb2FwLCBuICogc2l6ZW9mKHdjaGFyX3QpKTsKKyAgICB3aGlsZSAobi0tKQorICAgICAgKnIrKyA9ICpzKys7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNlbmRpZgorICB3aGlsZSAoKGMgPSAqcysrKSkKKyAgeyBzd2l0Y2ggKGMpCisgICAgeyAKKyAgICBjYXNlIDk6CisgICAgICBpZiAoZmxhZykKKyAgICAgICAgdCA9ICImI3g5OyI7CisgICAgICBlbHNlCisgICAgICAgIHQgPSAiXHQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMDoKKyAgICAgIGlmIChmbGFnIHx8ICEoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkpCisgICAgICAgIHQgPSAiJiN4QTsiOworICAgICAgZWxzZQorICAgICAgICB0ID0gIlxuIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTM6CisgICAgICB0ID0gIiYjeEQ7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJyYnOgorICAgICAgdCA9ICImYW1wOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICc8JzoKKyAgICAgIHQgPSAiJmx0OyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICc+JzoKKyAgICAgIGlmIChmbGFnKQorICAgICAgICB0ID0gIj4iOworICAgICAgZWxzZQorCXQgPSAiJmd0OyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICciJzoKKyAgICAgIGlmIChmbGFnKQorICAgICAgICB0ID0gIiZxdW90OyI7CisgICAgICBlbHNlCisgICAgICAgIHQgPSAiXCIiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChjID4gMCAmJiBjIDwgMHg4MCkKKyAgICAgIHsgdG1wID0gKGNoYXIpYzsKKyAgICAgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgJnRtcCwgMSkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgICAgZWxzZSBpZiAoc29hcF9wdXR1dGY4KHNvYXAsICh1bnNpZ25lZCBsb25nKWMpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKHNvYXBfc2VuZChzb2FwLCB0KSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQord2NoYXJfdCAqCitTT0FQX0ZNQUMyCitzb2FwX3dzdHJpbmdfaW4oc3RydWN0IHNvYXAgKnNvYXAsIGludCBmbGFnLCBsb25nIG1pbmxlbiwgbG9uZyBtYXhsZW4pCit7IHdjaGFyX3QgKnM7CisgIHJlZ2lzdGVyIGludCBpLCBuID0gMDsKKyAgcmVnaXN0ZXIgbG9uZyBsID0gMDsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICBjb25zdCBjaGFyICp0ID0gTlVMTDsKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlYWRpbmcgd2lkZSBzdHJpbmcgY29udGVudFxuIikpOworICBpZiAoc29hcC0+cGVla2VkKQorICB7IGlmICghc29hcC0+Ym9keSkKKyAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgqc29hcC0+dGFnKQorICAgIHsgbiA9IDE7CisgICAgICBzb2FwLT5wZWVrZWQgPSAwOworICAgIH0KKyAgfQorICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgcmV0dXJuIE5VTEw7CisgIGZvciAoOzspCisgIHsgaWYgKCEocyA9ICh3Y2hhcl90Kilzb2FwX3B1c2hfYmxvY2soc29hcCwgc2l6ZW9mKHdjaGFyX3QpKlNPQVBfQkxLTEVOKSkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgU09BUF9CTEtMRU47IGkrKykKKyAgICB7IGlmICh0KQorICAgICAgeyAqcysrID0gKHdjaGFyX3QpKnQrKzsKKyAgICAgICAgaWYgKCEqdCkKKyAgICAgICAgICB0ID0gTlVMTDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBjID0gc29hcF9nZXR1dGY4KHNvYXApOworICAgICAgc3dpdGNoIChjKQorICAgICAgeworICAgICAgY2FzZSBTT0FQX1RUOgorICAgICAgICBpZiAobiA9PSAwKQorICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICBuLS07CisgICAgICAgICpzKysgPSAnPCc7CisgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgJy8nKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfTFQ6CisgICAgICAgIG4rKzsKKyAgICAgICAgKnMrKyA9ICc8JzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfR1Q6CisgICAgICAgICpzKysgPSAnPic7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTT0FQX1FUOgorICAgICAgICAqcysrID0gJyInOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9BUDoKKyAgICAgICAgKnMrKyA9ICdcJyc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnLyc6CisgICAgICAgIGlmIChuID4gMCkKKyAgICAgICAgeyBjID0gc29hcF9nZXR1dGY4KHNvYXApOworICAgICAgICAgIGlmIChjID09IFNPQVBfR1QpCisgICAgICAgICAgICBuLS07CisgICAgICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgfQorICAgICAgICAqcysrID0gJy8nOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJzwnOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gKHNvYXBfd2NoYXIpJzwnOworICAgICAgICBlbHNlCisgICAgICAgIHsgKnMrKyA9IChzb2FwX3djaGFyKScmJzsKKyAgICAgICAgICB0ID0gImx0OyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICc+JzoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9IChzb2FwX3djaGFyKSc+JzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAoc29hcF93Y2hhciknJic7CisgICAgICAgICAgdCA9ICJndDsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnIic6CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICpzKysgPSAoc29hcF93Y2hhciknIic7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAqcysrID0gKHNvYXBfd2NoYXIpJyYnOworICAgICAgICAgIHQgPSAicXVvdDsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICpzKysgPSAod2NoYXJfdCljICYgMHg3RkZGRkZGRjsKKyAgICAgIH0KKyAgICAgIGwrKzsKKyAgICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgbWF4bGVuID49IDAgJiYgbCA+IG1heGxlbikKKyAgICAgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlN0cmluZyB0b28gbG9uZzogbWF4bGVuPSVsZFxuIiwgbWF4bGVuKSk7CisgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9MRU5HVEg7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgIH0KKyAgfQorZW5kOgorICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAqcyA9ICdcMCc7CisgIHNvYXBfc2l6ZV9ibG9jayhzb2FwLCBzaXplb2Yod2NoYXJfdCkgKiAoaSArIDEpKTsKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiBsIDwgbWlubGVuKQorICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJTdHJpbmcgdG9vIHNob3J0OiAlbGQgY2hhcnMsIG1pbmxlbj0lbGRcbiIsIGwsIG1pbmxlbikpOworICAgIHNvYXAtPmVycm9yID0gU09BUF9MRU5HVEg7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcyA9ICh3Y2hhcl90Kilzb2FwX3NhdmVfYmxvY2soc29hcCwgTlVMTCwgMCk7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgICAgc29hcC0+ZG9tLT53aWRlID0gczsKKyNlbmRpZgorICByZXR1cm4gczsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfaW50MnMoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuKQoreyByZXR1cm4gc29hcF9sb25nMnMoc29hcCwgKGxvbmcpbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0aW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgaW50ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX2xvbmcycyhzb2FwLCAobG9uZykqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJpbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGludCAqcCkKK3sgaWYgKHMpCisgIHsgY2hhciAqcjsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgIHNvYXBfcmVzZXRfZXJybm87CisjZW5kaWYKKyNlbmRpZgorICAgICpwID0gKGludClzb2FwX3N0cnRvbChzLCAmciwgMTApOworICAgIGlmICgocyA9PSByICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkgfHwgKnIKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICB8fCBzb2FwX2Vycm5vID09IFNPQVBfRVJBTkdFCisjZW5kaWYKKyNlbmRpZgorICAgICkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludCAqCitTT0FQX0ZNQUMyCitzb2FwX2luaW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6aW50IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6c2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpieXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKGludCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKGludCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChpbnQqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YoaW50KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJpbnQoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfbG9uZzJzKHN0cnVjdCBzb2FwICpzb2FwLCBsb25nIG4pCit7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiJWxkIiwgbik7CisgIHJldHVybiBzb2FwLT50bXBidWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0bG9uZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGxvbmcgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfbG9uZzJzKHNvYXAsICpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMmxvbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGxvbmcgKnApCit7IGlmIChzKQorICB7IGNoYXIgKnI7CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBzb2FwX3Jlc2V0X2Vycm5vOworI2VuZGlmCisjZW5kaWYKKyAgICAqcCA9IHNvYXBfc3RydG9sKHMsICZyLCAxMCk7CisgICAgaWYgKChzID09IHIgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKSB8fCAqcgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgIHx8IHNvYXBfZXJybm8gPT0gU09BUF9FUkFOR0UKKyNlbmRpZgorI2VuZGlmCisgICAgKQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorbG9uZyAqCitTT0FQX0ZNQUMyCitzb2FwX2lubG9uZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBsb25nICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjppbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpzaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAobG9uZyopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKGxvbmcpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAobG9uZyopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihsb25nKSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJsb25nKHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX0xPTkc2NDJzKHN0cnVjdCBzb2FwICpzb2FwLCBMT05HNjQgbikKK3sgc3ByaW50Zihzb2FwLT50bXBidWYsIFNPQVBfTE9OR19GT1JNQVQsIG4pOworICByZXR1cm4gc29hcC0+dG1wYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dExPTkc2NChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IExPTkc2NCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9MT05HNjQycyhzb2FwLCAqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJMT05HNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIExPTkc2NCAqcCkKK3sgaWYgKHMpCisgIHsKKyNpZmRlZiBIQVZFX1NUUlRPTEwKKyAgICBjaGFyICpyOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgc29hcF9yZXNldF9lcnJubzsKKyNlbmRpZgorI2VuZGlmCisgICAgKnAgPSBzdHJ0b2xsKHMsICZyLCAxMCk7CisgICAgaWYgKChzID09IHIgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKSB8fCAqcgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICAgfHwgc29hcF9lcnJubyA9PSBTT0FQX0VSQU5HRQorI2VuZGlmCisjZW5kaWYKKyAgICAgICkKKyNlbHNlCisjIGlmZGVmIEhBVkVfU1NDQU5GCisgICAgaWYgKHNzY2FuZihzLCBTT0FQX0xPTkdfRk9STUFULCBwKSAhPSAxKQorIyBlbmRpZgorI2VuZGlmCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitMT05HNjQgKgorU09BUF9GTUFDMgorc29hcF9pbkxPTkc2NChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBMT05HNjQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpwb3NpdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpuZWdhdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpub25Qb3NpdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpub25OZWdhdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpsb25nIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6aW50IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6c2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpieXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKExPTkc2NCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKExPTkc2NCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChMT05HNjQqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YoTE9ORzY0KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJMT05HNjQoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfYnl0ZTJzKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyIG4pCit7IHJldHVybiBzb2FwX2xvbmcycyhzb2FwLCAobG9uZyluKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRieXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgY2hhciAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9sb25nMnMoc29hcCwgKGxvbmcpKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MyYnl0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgY2hhciAqcCkKK3sgaWYgKHMpCisgIHsgbG9uZyBuOworICAgIGNoYXIgKnI7CisgICAgbiA9IHNvYXBfc3RydG9sKHMsICZyLCAxMCk7CisgICAgaWYgKHMgPT0gciB8fCAqciB8fCBuIDwgLTEyOCB8fCBuID4gMTI3KQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgKnAgPSAoY2hhciluOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9pbmJ5dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgY2hhciAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6Ynl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9IChjaGFyKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YoY2hhciksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChjaGFyKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKGNoYXIpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMmJ5dGUoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfc2hvcnQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgc2hvcnQgbikKK3sgcmV0dXJuIHNvYXBfbG9uZzJzKHNvYXAsIChsb25nKW4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHNob3J0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgc2hvcnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfbG9uZzJzKHNvYXAsIChsb25nKSpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMnNob3J0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBzaG9ydCAqcCkKK3sgaWYgKHMpCisgIHsgbG9uZyBuOworICAgIGNoYXIgKnI7CisgICAgbiA9IHNvYXBfc3RydG9sKHMsICZyLCAxMCk7CisgICAgaWYgKHMgPT0gciB8fCAqciB8fCBuIDwgLTMyNzY4IHx8IG4gPiAzMjc2NykKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgICpwID0gKHNob3J0KW47CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorc2hvcnQgKgorU09BUF9GTUFDMgorc29hcF9pbnNob3J0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHNob3J0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpzaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAoc2hvcnQqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihzaG9ydCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChzaG9ydCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihzaG9ydCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3Myc2hvcnQoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZmxvYXQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgZmxvYXQgbikKK3sgY29uc3QgY2hhciAqczsKKyAgaWYgKHNvYXBfaXNuYW4oKGRvdWJsZSluKSkKKyAgICBzID0gIk5hTiI7CisgIGVsc2UgaWYgKHNvYXBfaXNwaW5mZihuKSkKKyAgICBzID0gIklORiI7CisgIGVsc2UgaWYgKHNvYXBfaXNuaW5mZihuKSkKKyAgICBzID0gIi1JTkYiOworICBlbHNlCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsIHNvYXAtPmZsb2F0X2Zvcm1hdCwgbik7CisgICAgcyA9IHNvYXAtPnRtcGJ1ZjsKKyAgfQorICByZXR1cm4gczsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRmbG9hdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGZsb2F0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX2Zsb2F0MnMoc29hcCwgKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MyZmxvYXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGZsb2F0ICpwKQoreyBpZiAocykKKyAgeyBpZiAoISpzKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIGlmICghc29hcF90YWdfY21wKHMsICJJTkYiKSkKKyAgICAgICpwID0gRkxUX1BJTkZUWTsKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHMsICIrSU5GIikpCisgICAgICAqcCA9IEZMVF9QSU5GVFk7CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChzLCAiLUlORiIpKQorICAgICAgKnAgPSBGTFRfTklORlRZOworICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAocywgIk5hTiIpKQorICAgICAgKnAgPSBGTFRfTkFOOworICAgIGVsc2UKKyAgICB7CisvKiBPbiBzb21lIHN5c3RlbXMsIHN0cnRvZiBhcHBlYXJzIHRvIGJlIGJyb2tlbiBvciBkb2Vzbid0IGxpbms6IHVzZSB3aXRoIGNhdXRpb24gKi8KKyNpZiBkZWZpbmVkKEhBVkVfU1RSVE9GKQorICAgICAgY2hhciAqcjsKKyAgICAgICpwID0gc3RydG9mKChjaGFyKilzLCAmcik7CisgICAgICBpZiAoKnIpCisjZWxpZiBkZWZpbmVkKEhBVkVfU1RSVE9EKQorICAgICAgY2hhciAqcjsKKyAgICAgICpwID0gKGZsb2F0KXN0cnRvZChzLCAmcik7CisgICAgICBpZiAoKnIpCisjZW5kaWYKKyNpZmRlZiBIQVZFX1NTQ0FORgorICAgICAgICBpZiAoc3NjYW5mKHMsICIlZyIsIHApICE9IDEpCisgICAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisjZWxzZQorICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyNlbmRpZgorICAgIH0KKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgaW50IHNvYXBfaXNudW1lcmljKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0eXBlKQoreyBpZiAoc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6ZmxvYXQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpkb3VibGUiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpkZWNpbWFsIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6aW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnBvc2l0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOm5lZ2F0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOm5vblBvc2l0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOm5vbk5lZ2F0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmxvbmciKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjppbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpzaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmJ5dGUiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZExvbmciKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkU2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gU09BUF9FUlI7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitmbG9hdCAqCitTT0FQX0ZNQUMyCitzb2FwX2luZmxvYXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgZmxvYXQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUgIT0gJ1wwJyAmJiBzb2FwX2lzbnVtZXJpYyhzb2FwLCB0eXBlKSkKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICBwID0gKGZsb2F0Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YoZmxvYXQpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAoZmxvYXQqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YoZmxvYXQpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMmZsb2F0KHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2RvdWJsZTJzKHN0cnVjdCBzb2FwICpzb2FwLCBkb3VibGUgbikKK3sgY29uc3QgY2hhciAqczsKKyAgaWYgKHNvYXBfaXNuYW4obikpCisgICAgcyA9ICJOYU4iOworICBlbHNlIGlmIChzb2FwX2lzcGluZmQobikpCisgICAgcyA9ICJJTkYiOworICBlbHNlIGlmIChzb2FwX2lzbmluZmQobikpCisgICAgcyA9ICItSU5GIjsKKyAgZWxzZQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCBzb2FwLT5kb3VibGVfZm9ybWF0LCBuKTsKKyAgICBzID0gc29hcC0+dG1wYnVmOworICB9CisgIHJldHVybiBzOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dGRvdWJsZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGRvdWJsZSAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9kb3VibGUycyhzb2FwLCAqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJkb3VibGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGRvdWJsZSAqcCkKK3sgaWYgKHMpCisgIHsgaWYgKCEqcykKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBpZiAoIXNvYXBfdGFnX2NtcChzLCAiSU5GIikpCisgICAgICAqcCA9IERCTF9QSU5GVFk7CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChzLCAiK0lORiIpKQorICAgICAgKnAgPSBEQkxfUElORlRZOworICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAocywgIi1JTkYiKSkKKyAgICAgICpwID0gREJMX05JTkZUWTsKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHMsICJOYU4iKSkKKyAgICAgICpwID0gREJMX05BTjsKKyAgICBlbHNlCisgICAgeworI2lmZGVmIEhBVkVfU1RSVE9ECisgICAgICBjaGFyICpyOworICAgICAgKnAgPSBzdHJ0b2QocywgJnIpOworICAgICAgaWYgKCpyKQorI2VuZGlmCisjaWZkZWYgSEFWRV9TU0NBTkYKKyAgICAgICAgaWYgKHNzY2FuZihzLCAiJWxnIiwgcCkgIT0gMSkKKyAgICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyNlbHNlCisgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworI2VuZGlmCisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2RvdWJsZSAqCitTT0FQX0ZNQUMyCitzb2FwX2luZG91YmxlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGRvdWJsZSAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZSAhPSAnXDAnICYmIHNvYXBfaXNudW1lcmljKHNvYXAsIHR5cGUpKQorICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgIHAgPSAoZG91YmxlKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YoZG91YmxlKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKGRvdWJsZSopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihkb3VibGUpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMmRvdWJsZShzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF91bnNpZ25lZEJ5dGUycyhzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgY2hhciBuKQoreyByZXR1cm4gc29hcF91bnNpZ25lZExvbmcycyhzb2FwLCAodW5zaWduZWQgbG9uZyluKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXR1bnNpZ25lZEJ5dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX3Vuc2lnbmVkTG9uZzJzKHNvYXAsICh1bnNpZ25lZCBsb25nKSpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMnVuc2lnbmVkQnl0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgdW5zaWduZWQgY2hhciAqcCkKK3sgaWYgKHMpCisgIHsgdW5zaWduZWQgbG9uZyBuOworICAgIGNoYXIgKnI7CisgICAgbiA9IHNvYXBfc3RydG91bChzLCAmciwgMTApOworICAgIGlmIChzID09IHIgfHwgKnIgfHwgbiA+IDI1NSkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgICpwID0gKHVuc2lnbmVkIGNoYXIpbjsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit1bnNpZ25lZCBjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfaW51bnNpZ25lZEJ5dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgdW5zaWduZWQgY2hhciAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRCeXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKHVuc2lnbmVkIGNoYXIqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZih1bnNpZ25lZCBjaGFyKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKHVuc2lnbmVkIGNoYXIqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YodW5zaWduZWQgY2hhciksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MydW5zaWduZWRCeXRlKHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3Vuc2lnbmVkU2hvcnQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgc2hvcnQgbikKK3sgcmV0dXJuIHNvYXBfdW5zaWduZWRMb25nMnMoc29hcCwgKHVuc2lnbmVkIGxvbmcpbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0dW5zaWduZWRTaG9ydChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIHNob3J0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX3Vuc2lnbmVkTG9uZzJzKHNvYXAsICh1bnNpZ25lZCBsb25nKSpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMnVuc2lnbmVkU2hvcnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIHNob3J0ICpwKQoreyBpZiAocykKKyAgeyB1bnNpZ25lZCBsb25nIG47CisgICAgY2hhciAqcjsKKyAgICBuID0gc29hcF9zdHJ0b3VsKHMsICZyLCAxMCk7CisgICAgaWYgKHMgPT0gciB8fCAqciB8fCBuID4gNjU1MzUpCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICAqcCA9ICh1bnNpZ25lZCBzaG9ydCluOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3Vuc2lnbmVkIHNob3J0ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW51bnNpZ25lZFNob3J0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIHNob3J0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZFNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRCeXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKHVuc2lnbmVkIHNob3J0Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YodW5zaWduZWQgc2hvcnQpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAodW5zaWduZWQgc2hvcnQqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YodW5zaWduZWQgc2hvcnQpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMnVuc2lnbmVkU2hvcnQoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfdW5zaWduZWRJbnQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgaW50IG4pCit7IHJldHVybiBzb2FwX3Vuc2lnbmVkTG9uZzJzKHNvYXAsICh1bnNpZ25lZCBsb25nKW4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHVuc2lnbmVkSW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgdW5zaWduZWQgaW50ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX3Vuc2lnbmVkTG9uZzJzKHNvYXAsICh1bnNpZ25lZCBsb25nKSpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMnVuc2lnbmVkSW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBpbnQgKnApCit7IGlmIChzKQorICB7IGNoYXIgKnI7CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBzb2FwX3Jlc2V0X2Vycm5vOworI2VuZGlmCisjZW5kaWYKKyAgICAqcCA9ICh1bnNpZ25lZCBpbnQpc29hcF9zdHJ0b3VsKHMsICZyLCAxMCk7CisgICAgaWYgKChzID09IHIgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKSB8fCAqcgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgIHx8IHNvYXBfZXJybm8gPT0gU09BUF9FUkFOR0UKKyNlbmRpZgorI2VuZGlmCisgICAgKQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordW5zaWduZWQgaW50ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW51bnNpZ25lZEludChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB1bnNpZ25lZCBpbnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkSW50IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRTaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkQnl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9ICh1bnNpZ25lZCBpbnQqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZih1bnNpZ25lZCBpbnQpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAodW5zaWduZWQgaW50Kilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKHVuc2lnbmVkIGludCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MydW5zaWduZWRJbnQoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfdW5zaWduZWRMb25nMnMoc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIGxvbmcgbikKK3sgc3ByaW50Zihzb2FwLT50bXBidWYsICIlbHUiLCBuKTsKKyAgcmV0dXJuIHNvYXAtPnRtcGJ1ZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXR1bnNpZ25lZExvbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCB1bnNpZ25lZCBsb25nICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX3Vuc2lnbmVkTG9uZzJzKHNvYXAsICpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMnVuc2lnbmVkTG9uZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgdW5zaWduZWQgbG9uZyAqcCkKK3sgaWYgKHMpCisgIHsgY2hhciAqcjsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgIHNvYXBfcmVzZXRfZXJybm87CisjZW5kaWYKKyNlbmRpZgorICAgICpwID0gc29hcF9zdHJ0b3VsKHMsICZyLCAxMCk7CisgICAgaWYgKChzID09IHIgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKSB8fCAqcgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgIHx8IHNvYXBfZXJybm8gPT0gU09BUF9FUkFOR0UKKyNlbmRpZgorI2VuZGlmCisgICAgKQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordW5zaWduZWQgbG9uZyAqCitTT0FQX0ZNQUMyCitzb2FwX2ludW5zaWduZWRMb25nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIGxvbmcgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkSW50IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRTaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkQnl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9ICh1bnNpZ25lZCBsb25nKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YodW5zaWduZWQgbG9uZyksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9ICh1bnNpZ25lZCBsb25nKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMnVuc2lnbmVkTG9uZyhzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9VTE9ORzY0MnMoc3RydWN0IHNvYXAgKnNvYXAsIFVMT05HNjQgbikKK3sgc3ByaW50Zihzb2FwLT50bXBidWYsIFNPQVBfVUxPTkdfRk9STUFULCBuKTsKKyAgcmV0dXJuIHNvYXAtPnRtcGJ1ZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRVTE9ORzY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgVUxPTkc2NCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9VTE9ORzY0MnMoc29hcCwgKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MyVUxPTkc2NChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgVUxPTkc2NCAqcCkKK3sgaWYgKHMpCisgIHsKKyNpZmRlZiBIQVZFX1NUUlRPVUxMCisgICAgY2hhciAqcjsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgIHNvYXBfcmVzZXRfZXJybm87CisjZW5kaWYKKyNlbmRpZgorICAgICpwID0gc3RydG91bGwocywgJnIsIDEwKTsKKyAgICBpZiAoKHMgPT0gciAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpIHx8ICpyCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgICB8fCBzb2FwX2Vycm5vID09IFNPQVBfRVJBTkdFCisjZW5kaWYKKyNlbmRpZgorICAgICAgKQorI2Vsc2UKKyMgaWZkZWYgSEFWRV9TU0NBTkYKKyAgICBpZiAoc3NjYW5mKHMsIFNPQVBfVUxPTkdfRk9STUFULCBwKSAhPSAxKQorIyBlbmRpZgorI2VuZGlmCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitVTE9ORzY0ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5VTE9ORzY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIFVMT05HNjQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6cG9zaXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bm9uTmVnYXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRMb25nIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRJbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZFNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRCeXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcCA9IChVTE9ORzY0Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YoVUxPTkc2NCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChVTE9ORzY0Kilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKFVMT05HNjQpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMlVMT05HNjQoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3Myc3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBjaGFyICoqdCkKK3sgKnQgPSBOVUxMOworICBpZiAocykKKyAgeyBpZiAoISgqdCA9IHNvYXBfc3RyZHVwKHNvYXAsIHMpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIGlmICghKHNvYXAtPm1vZGUgJiAoU09BUF9FTkNfTEFUSU4gfCBTT0FQX0NfVVRGU1RSSU5HKSkpCisgICAgeyAvKiBUT0RPOiBjb25zaWRlciB0cnVuY2F0aW5nIFVURjggdG8gQVNDSUkgZm9yIHJlZ3VsYXIgWE1MIGF0dHJpYnV0ZSBzdHJpbmdzPyAqLworICAgIH0KKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJRTmFtZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgY2hhciAqKnQpCit7IGlmIChzKQorICB7IHN0cnVjdCBzb2FwX25saXN0ICpucDsKKyAgICBjb25zdCBjaGFyICpwOworICAgIGlmICghc3RybmNtcChzLCAieG1sOiIsIDQpKQorICAgIHsgKnQgPSBzb2FwX3N0cmR1cChzb2FwLCBzKTsKKyAgICAgIHJldHVybiBTT0FQX09LOworICAgIH0KKyAgICBucCA9IHNvYXAtPm5saXN0OworICAgIHAgPSBzdHJjaHIocywgJzonKTsKKyAgICBpZiAocCkKKyAgICB7IHJlZ2lzdGVyIGludCBuID0gcCAtIHM7CisgICAgICB3aGlsZSAobnAgJiYgKHN0cm5jbXAobnAtPmlkLCBzLCBuKSB8fCBucC0+aWRbbl0pKQorICAgICAgICBucCA9IG5wLT5uZXh0OworICAgICAgcCsrOworICAgIH0KKyAgICBlbHNlCisgICAgeyB3aGlsZSAobnAgJiYgKm5wLT5pZCkKKyAgICAgICAgbnAgPSBucC0+bmV4dDsKKyAgICAgIHAgPSBzOworICAgIH0KKyAgICBpZiAobnApCisgICAgeyBpZiAobnAtPmluZGV4ID49IDAgJiYgc29hcC0+bG9jYWxfbmFtZXNwYWNlcykKKyAgICAgIHsgcmVnaXN0ZXIgY29uc3QgY2hhciAqcSA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbbnAtPmluZGV4XS5pZDsKKyAgICAgICAgaWYgKHEpCisgICAgICAgIHsgaWYgKCgqdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzdHJsZW4ocCkgKyBzdHJsZW4ocSkgKyAyKSkpCisgICAgICAgICAgICBzcHJpbnRmKCp0LCAiJXM6JXMiLCBxLCBwKTsKKyAgICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKG5wLT5ucykKKyAgICAgIHsgaWYgKCgqdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzdHJsZW4ocCkgKyBzdHJsZW4obnAtPm5zKSArIDQpKSkKKyAgICAgICAgICBzcHJpbnRmKCp0LCAiXCIlc1wiOiVzIiwgbnAtPm5zLCBwKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgICB9CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk5hbWVzcGFjZSBwcmVmaXggb2YgJyVzJyBub3QgZGVmaW5lZCAoaW5kZXg9JWQsIFVSST0lcylcbiIsIHMsIG5wLT5pbmRleCwgbnAtPm5zP25wLT5uczoiIikpOworICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9OQU1FU1BBQ0U7IAorICAgIH0KKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk5hbWVzcGFjZSBwcmVmaXggb2YgJyVzJyBub3QgZGVmaW5lZCwgYXNzdW1pbmcgZW1wdHkgbmFtZXNwYWNlXG4iLCBzKSk7CisgICAgaWYgKCgqdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzdHJsZW4ocCkgKyA0KSkpCisgICAgICBzcHJpbnRmKCp0LCAiXCJcIjolcyIsIHApOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX1FOYW1lMnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMpCit7IHN0cnVjdCBOYW1lc3BhY2UgKnA7CisgIGNoYXIgKnQ7CisgIGludCBuOworICBpZiAoIXMgfHwgKnMgIT0gJyInKQorICB7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmIChzICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKSkKKyAgICB7IHQgPSAoY2hhciopc3RyY2hyKHMsICc6Jyk7CisgICAgICBpZiAodCkKKyAgICAgICAgc29hcF91dGlsaXplX25zKHNvYXAsIHMsIHQgLSBzKTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gczsKKyAgfQorICBzKys7CisgIGlmICgocCA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXMpKQorICB7IGZvciAoOyBwLT5pZDsgcCsrKQorICAgIHsgaWYgKHAtPm5zKQorICAgICAgICBpZiAoIXNvYXBfdGFnX2NtcChzLCBwLT5ucykpCisgICAgICAgICAgYnJlYWs7CisgICAgICBpZiAocC0+aW4pCisgICAgICAgIGlmICghc29hcF90YWdfY21wKHMsIHAtPmluKSkKKyAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHAgJiYgcC0+aWQpCisgICAgeyBzID0gc3RyY2hyKHMsICciJyk7CisgICAgICBpZiAocykKKyAgICAgIHsgdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzdHJsZW4ocC0+aWQpICsgc3RybGVuKHMpKTsKKyAgICAgICAgc3RyY3B5KHQsIHAtPmlkKTsKKwlzdHJjYXQodCwgcyArIDEpOworICAgICAgICByZXR1cm4gdDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgdCA9IChjaGFyKilzdHJjaHIocywgJyInKTsKKyAgaWYgKHQpCisgICAgbiA9IHQgLSBzOworICBlbHNlCisgICAgbiA9IDA7CisgIHQgPSBzb2FwX3N0cmR1cChzb2FwLCBzKTsKKyAgdFtuXSA9ICdcMCc7CisgIHNwcmludGYoc29hcC0+dG1wYnVmLCAieG1sbnM6XyVkIiwgc29hcC0+aWRudW0rKyk7CisgIHNvYXBfc2V0X2F0dHIoc29hcCwgc29hcC0+dG1wYnVmLCB0KTsKKyAgcyA9IHN0cmNocihzLCAnIicpOworICBpZiAocykKKyAgeyB0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihzb2FwLT50bXBidWYpICsgc3RybGVuKHMpIC0gNik7CisgICAgc3RyY3B5KHQsIHNvYXAtPnRtcGJ1ZiArIDYpOworICAgIHN0cmNhdCh0LCBzICsgMSk7CisgIH0KKyAgcmV0dXJuIHQ7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJ3Y2hhcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgd2NoYXJfdCAqKnQpCit7IHdjaGFyX3QgKnI7CisgIGlmICghcykKKyAgICAqdCA9IE5VTEw7CisgIGVsc2UKKyAgeyAqdCA9IHIgPSAod2NoYXJfdCopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHdjaGFyX3QpICogKHN0cmxlbihzKSArIDEpKTsKKyAgICBpZiAoIXIpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19MQVRJTikKKyAgICB7IHdoaWxlICgqcykKKyAgICAgICAgKnIrKyA9ICh3Y2hhcl90KSpzKys7CisgICAgfQorICAgIGVsc2UKKyAgICB7IC8qIENvbnZlcnQgVVRGOCB0byB3Y2hhciAqLworICAgICAgd2hpbGUgKCpzKQorICAgICAgeyByZWdpc3RlciBzb2FwX3djaGFyIGMsIGMxLCBjMiwgYzMsIGM0OworICAgICAgICBjID0gKnMrKzsKKyAgICAgICAgaWYgKGMgPCAweDgwKQorCSAgKnIrKyA9ICh3Y2hhcl90KWM7CisJZWxzZQorICAgICAgICB7IGMxID0gKHNvYXBfd2NoYXIpKnMrKyAmIDB4M0Y7CisgICAgICAgICAgaWYgKGMgPCAweEUwKQorICAgICAgICAgICAgKnIrKyA9ICh3Y2hhcl90KSgoKHNvYXBfd2NoYXIpKGMgJiAweDFGKSA8PCA2KSB8IGMxKTsKKyAgICAgICAgICBlbHNlCisJICB7IGMyID0gKHNvYXBfd2NoYXIpKnMrKyAmIDB4M0Y7CisgICAgICAgICAgICBpZiAoYyA8IDB4RjApCisgICAgICAgICAgICAgICpyKysgPSAod2NoYXJfdCkoKChzb2FwX3djaGFyKShjICYgMHgwRikgPDwgMTIpIHwgKGMxIDw8IDYpIHwgYzIpOworICAgICAgICAgICAgZWxzZQorCSAgICB7IGMzID0gKHNvYXBfd2NoYXIpKnMrKyAmIDB4M0Y7CisgICAgICAgICAgICAgIGlmIChjIDwgMHhGOCkKKyAgICAgICAgICAgICAgICAqcisrID0gKHdjaGFyX3QpKCgoc29hcF93Y2hhcikoYyAmIDB4MDcpIDw8IDE4KSB8IChjMSA8PCAxMikgfCAoYzIgPDwgNikgfCBjMyk7CisgICAgICAgICAgICAgIGVsc2UKKwkgICAgICB7IGM0ID0gKHNvYXBfd2NoYXIpKnMrKyAmIDB4M0Y7CisgICAgICAgICAgICAgICAgaWYgKGMgPCAweEZDKQorICAgICAgICAgICAgICAgICAgKnIrKyA9ICh3Y2hhcl90KSgoKHNvYXBfd2NoYXIpKGMgJiAweDAzKSA8PCAyNCkgfCAoYzEgPDwgMTgpIHwgKGMyIDw8IDEyKSB8IChjMyA8PCA2KSB8IGM0KTsKKyAgICAgICAgICAgICAgICBlbHNlCisJCSAgKnIrKyA9ICh3Y2hhcl90KSgoKHNvYXBfd2NoYXIpKGMgJiAweDAxKSA8PCAzMCkgfCAoYzEgPDwgMjQpIHwgKGMyIDw8IDE4KSB8IChjMyA8PCAxMikgfCAoYzQgPDwgNikgfCAoc29hcF93Y2hhcikoKnMrKyAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAqciA9IEwnXDAnOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfd2NoYXIycyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgd2NoYXJfdCAqcykKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICByZWdpc3RlciBjaGFyICpyLCAqdDsKKyAgY29uc3Qgd2NoYXJfdCAqcSA9IHM7CisgIHNpemVfdCBuID0gMDsKKyAgd2hpbGUgKChjID0gKnErKykpCisgIHsgaWYgKGMgPiAwICYmIGMgPCAweDgwKQorICAgICAgbisrOworICAgIGVsc2UKKyAgICAgIG4gKz0gNjsKKyAgfQorICByID0gdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBuICsgMSk7CisgIGlmIChyKQorICB7IC8qIENvbnZlcnQgd2NoYXIgdG8gVVRGOCAqLworICAgIHdoaWxlICgoYyA9ICpzKyspKQorICAgIHsgaWYgKGMgPiAwICYmIGMgPCAweDgwKQorICAgICAgICAqdCsrID0gKGNoYXIpYzsKKyAgICAgIGVsc2UKKyAgICAgIHsgaWYgKGMgPCAweDA4MDApCisgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEMwIHwgKChjID4+IDYpICYgMHgxRikpOworICAgICAgICBlbHNlCisgICAgICAgIHsgaWYgKGMgPCAweDAxMDAwMCkKKyAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhFMCB8ICgoYyA+PiAxMikgJiAweDBGKSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsgaWYgKGMgPCAweDIwMDAwMCkKKyAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEYwIHwgKChjID4+IDE4KSAmIDB4MDcpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgaWYgKGMgPCAweDA0MDAwMDAwKQorICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhGOCB8ICgoYyA+PiAyNCkgJiAweDAzKSk7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeyAqdCsrID0gKGNoYXIpKDB4RkMgfCAoKGMgPj4gMzApICYgMHgwMSkpOworICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAyNCkgJiAweDNGKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDE4KSAmIDB4M0YpKTsKKyAgICAgICAgICAgIH0gICAgIAorICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDEyKSAmIDB4M0YpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDYpICYgMHgzRikpOworICAgICAgICB9CisgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8IChjICYgMHgzRikpOworICAgICAgfQorICAgIH0KKyAgICAqdCA9ICdcMCc7CisgIH0KKyAgcmV0dXJuIHI7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0c3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY2hhciAqY29uc3QqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pIAoreyBpZCA9IHNvYXBfZWxlbWVudF9pZChzb2FwLCB0YWcsIGlkLCAqcCwgTlVMTCwgMCwgdHlwZSwgbik7CisgIGlmIChpZCA8IDAKKyAgIHx8IHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBpZCwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCAqcCwgMCkKKyAgIHx8IHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZykpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKioKK1NPQVBfRk1BQzIKK3NvYXBfaW5zdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgY2hhciAqKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0LCBpbnQgZmxhZywgbG9uZyBtaW5sZW4sIGxvbmcgbWF4bGVuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMSkpCisgIHsgaWYgKCF0YWcgfHwgKnRhZyAhPSAnLScgfHwgc29hcC0+ZXJyb3IgIT0gU09BUF9OT19UQUcpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIH0KKyAgaWYgKCFwKQorICAgIGlmICghKHAgPSAoY2hhcioqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihjaGFyKikpKSkKKyAgICAgIHJldHVybiBOVUxMOworICBpZiAoc29hcC0+Ym9keSkKKyAgeyAqcCA9IHNvYXBfc3RyaW5nX2luKHNvYXAsIGZsYWcsIG1pbmxlbiwgbWF4bGVuKTsKKyAgICBpZiAoISpwIHx8ICEoY2hhciopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgKnAsIHQsIHNpemVvZihjaGFyKiksIDAsIE5VTEwsIE5VTEwsIE5VTEwpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZWxzZSBpZiAoc29hcC0+bnVsbCkKKyAgICAqcCA9IE5VTEw7CisgIGVsc2UKKyAgICAqcCA9IChjaGFyKilTT0FQX1NUUl9FT1M7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKGNoYXIqKilzb2FwX2lkX2xvb2t1cChzb2FwLCBzb2FwLT5ocmVmLCAodm9pZCoqKXAsIHQsIHNpemVvZihjaGFyKiopLCAwKTsKKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXR3c3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgd2NoYXJfdCAqY29uc3QqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pIAoreyBpZCA9IHNvYXBfZWxlbWVudF9pZChzb2FwLCB0YWcsIGlkLCAqcCwgTlVMTCwgMCwgdHlwZSwgbik7CisgIGlmIChpZCA8IDAKKyAgIHx8IHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBpZCwgdHlwZSkKKyAgIHx8IHNvYXBfd3N0cmluZ19vdXQoc29hcCwgKnAsIDApCisgICB8fCBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3djaGFyX3QgKioKK1NPQVBfRk1BQzIKK3NvYXBfaW53c3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHdjaGFyX3QgKipwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCwgbG9uZyBtaW5sZW4sIGxvbmcgbWF4bGVuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMSkpCisgIHsgaWYgKCF0YWcgfHwgKnRhZyAhPSAnLScgfHwgc29hcC0+ZXJyb3IgIT0gU09BUF9OT19UQUcpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIH0KKyAgaWYgKCFwKQorICAgIGlmICghKHAgPSAod2NoYXJfdCoqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZih3Y2hhcl90KikpKSkKKyAgICAgIHJldHVybiBOVUxMOworICBpZiAoc29hcC0+Ym9keSkKKyAgeyAqcCA9IHNvYXBfd3N0cmluZ19pbihzb2FwLCAxLCBtaW5sZW4sIG1heGxlbik7CisgICAgaWYgKCEqcCB8fCAhKHdjaGFyX3QqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsICpwLCB0LCBzaXplb2Yod2NoYXJfdCopLCAwLCBOVUxMLCBOVUxMLCBOVUxMKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGVsc2UgaWYgKHNvYXAtPm51bGwpCisgICAgKnAgPSBOVUxMOworICBlbHNlCisgICAgKnAgPSAod2NoYXJfdCopU09BUF9TVFJfRU9TOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9ICh3Y2hhcl90Kiopc29hcF9pZF9sb29rdXAoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilwLCB0LCBzaXplb2Yod2NoYXJfdCoqKSwgMCk7CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyB0aW1lX3QKK3NvYXBfdGltZWdtKHN0cnVjdCB0bSAqVCkKK3sKKyNpZiBkZWZpbmVkKEhBVkVfVElNRUdNKQorICByZXR1cm4gdGltZWdtKFQpOworI2Vsc2UKKyAgdGltZV90IHQsIGcsIHo7CisjaWZkZWYgSEFWRV9HTVRJTUVfUgorICBzdHJ1Y3QgdG0gdG0sICp0bXAgPSAmdG07CisjZWxzZQorICBzdHJ1Y3QgdG0gKnRtcDsKKyNlbmRpZgorICB0ID0gbWt0aW1lKFQpOworICBpZiAodCA9PSAtMSkKKyAgICByZXR1cm4gLTE7CisjaWZkZWYgSEFWRV9HTVRJTUVfUgorICBnbXRpbWVfcigmdCwgdG1wKTsKKyNlbHNlCisgIHRtcCA9IGdtdGltZSgmdCk7CisjZW5kaWYKKyAgdG1wLT50bV9pc2RzdCA9IDA7CisgIGcgPSBta3RpbWUodG1wKTsKKyAgaWYgKGcgPT0gLTEpCisgICAgcmV0dXJuIC0xOworICB6ID0gZyAtIHQ7CisgIHJldHVybiB0IC0gejsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZGF0ZVRpbWUycyhzdHJ1Y3Qgc29hcCAqc29hcCwgdGltZV90IG4pCit7IHN0cnVjdCB0bSBULCAqcFQgPSAmVDsKKyNpZiBkZWZpbmVkKEhBVkVfR01USU1FX1IpCisgIGlmIChnbXRpbWVfcigmbiwgcFQpKQorICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolU1oiLCBwVCk7CisgIC8qIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyB3ZXJlIGFkZGVkIGZvciBWeFdvcmtzKi8KKyNlbGlmIGRlZmluZWQoSEFWRV9QR01USU1FX1IpCisgIGlmIChnbXRpbWVfcigmbiwgcFQpKQorICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolU1oiLCBwVCk7CisjZWxpZiBkZWZpbmVkKEhBVkVfUEdNVElNRSkKKyAgaWYgKGdtdGltZSgmbiwgcFQpKQorICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolU1oiLCBwVCk7CisjZWxpZiBkZWZpbmVkKEhBVkVfR01USU1FKQorICBpZiAoKHBUID0gZ210aW1lKCZuKSkpCisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTWiIsIHBUKTsKKyNlbGlmIGRlZmluZWQoSEFWRV9HRVRUSU1FT0ZEQVkpCisgIHN0cnVjdCB0aW1lem9uZSB0ejsKKyAgbWVtc2V0KCh2b2lkKikmdHosIDAsIHNpemVvZih0eikpOworIyBpZiBkZWZpbmVkKEhBVkVfTE9DQUxUSU1FX1IpCisgIGlmIChsb2NhbHRpbWVfcigmbiwgcFQpKQorICB7IHN0cnVjdCB0aW1ldmFsIHR2OworICAgIGdldHRpbWVvZmRheSgmdHYsICZ0eik7CisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmICsgc3RybGVuKHNvYXAtPnRtcGJ1ZiksICIlKzAzZDolMDJkIiwgLXR6LnR6X21pbnV0ZXN3ZXN0LzYwKyhwVC0+dG1faXNkc3QhPTApLCBhYnModHoudHpfbWludXRlc3dlc3QpJTYwKTsKKyAgfQorIyBlbHNlCisgIGlmICgocFQgPSBsb2NhbHRpbWUoJm4pKSkKKyAgeyBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICBnZXR0aW1lb2ZkYXkoJnR2LCAmdHopOworICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIHN0cmxlbihzb2FwLT50bXBidWYpLCAiJSswM2Q6JTAyZCIsIC10ei50el9taW51dGVzd2VzdC82MCsocFQtPnRtX2lzZHN0IT0wKSwgYWJzKHR6LnR6X21pbnV0ZXN3ZXN0KSU2MCk7CisgIH0KKyNlbmRpZgorI2VsaWYgZGVmaW5lZChIQVZFX0ZUSU1FKQorICBzdHJ1Y3QgdGltZWIgdDsKKyAgbWVtc2V0KCh2b2lkKikmdCwgMCwgc2l6ZW9mKHQpKTsKKyMgaWYgZGVmaW5lZChIQVZFX0xPQ0FMVElNRV9SKQorICBpZiAobG9jYWx0aW1lX3IoJm4sIHBUKSkKKyAgeyBmdGltZSgmdCk7CisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmICsgc3RybGVuKHNvYXAtPnRtcGJ1ZiksICIlKzAzZDolMDJkIiwgLXQudGltZXpvbmUvNjArKHBULT50bV9pc2RzdCE9MCksIGFicyh0LnRpbWV6b25lKSU2MCk7CisgIH0KKyAgLyogVGhlIGZvbGxvd2luZyBkZWZpbmVzIHdlcmUgYWRkZWQgZm9yIFZ4V29ya3MqLworIyBlbGlmIGRlZmluZWQoSEFWRV9QTE9DQUxUSU1FX1IpCisgIGlmIChsb2NhbHRpbWVfcigmbiwgcFQpKQorICB7IHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZitzdHJsZW4oc29hcC0+dG1wYnVmKSwgIiUrMDNkOiUwMmQiLCB0LnRpbWV6b25lLzYwLCBhYnModC50aW1lem9uZSklNjApOworICB9CisjIGVsc2UKKyAgaWYgKChwVCA9IGxvY2FsdGltZSgmbikpKQorICB7IGZ0aW1lKCZ0KTsKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwVCk7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYgKyBzdHJsZW4oc29hcC0+dG1wYnVmKSwgIiUrMDNkOiUwMmQiLCAtdC50aW1lem9uZS82MCsocFQtPnRtX2lzZHN0IT0wKSwgYWJzKHQudGltZXpvbmUpJTYwKTsKKyAgfQorIyBlbmRpZgorI2VsaWYgZGVmaW5lZChIQVZFX0xPQ0FMVElNRV9SKQorICBpZiAobG9jYWx0aW1lX3IoJm4sIHBUKSkKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwVCk7CisgIC8qIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyB3ZXJlIGFkZGVkIGZvciBWeFdvcmtzKi8KKyNlbGlmIGRlZmluZWQoSEFWRV9QTE9DQUxUSU1FX1IpCisgIGlmIChsb2NhbHRpbWVfcigmbiwgcFQpKQorICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyNlbHNlCisgIGlmICgocFQgPSBsb2NhbHRpbWUoJm4pKSkKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwVCk7CisjZW5kaWYKKyAgZWxzZQorICAgIHN0cmNweShzb2FwLT50bXBidWYsICIxOTY5LTEyLTMxVDIzOjU5OjU5WiIpOworICByZXR1cm4gc29hcC0+dG1wYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dGRhdGVUaW1lKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgdGltZV90ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX2RhdGVUaW1lMnMoc29hcCwgKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MyZGF0ZVRpbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHRpbWVfdCAqcCkKK3sgaWYgKHMpCisgIHsgc3RydWN0IHRtIFQ7CisgICAgY2hhciB6b25lWzE2XTsKKyAgICBjb25zdCBjaGFyICp0OworICAgIG1lbXNldCgodm9pZCopJlQsIDAsIHNpemVvZihUKSk7CisgICAgem9uZVtzaXplb2Yoem9uZSktMV0gPSAnXDAnOworICAgIGlmIChzdHJjaHIocywgJy0nKSkKKyAgICAgIHQgPSAiJWQtJWQtJWRUJWQ6JWQ6JWQlMTVzIjsKKyAgICBlbHNlIGlmIChzdHJjaHIocywgJzonKSkKKyAgICAgIHQgPSAiJTRkJTJkJTJkVCVkOiVkOiVkJTE1cyI7CisgICAgZWxzZSAvKiBwYXJzZSBub24tWFNELXN0YW5kYXJkIGFsdGVybmF0aXZlIElTTyA4NjAxIGZvcm1hdCAqLworICAgICAgdCA9ICIlNGQlMmQlMmRUJTJkJTJkJTJkJTE1cyI7CisgICAgc3NjYW5mKHMsIHQsICZULnRtX3llYXIsICZULnRtX21vbiwgJlQudG1fbWRheSwgJlQudG1faG91ciwgJlQudG1fbWluLCAmVC50bV9zZWMsIHpvbmUpOworICAgIGlmIChULnRtX3llYXIgPT0gMSkKKyAgICAgIFQudG1feWVhciA9IDcwOworICAgIGVsc2UKKyAgICAgIFQudG1feWVhciAtPSAxOTAwOworICAgIFQudG1fbW9uLS07CisgICAgaWYgKCp6b25lKQorICAgIHsgaWYgKCp6b25lID09ICcuJykKKyAgICAgIHsgZm9yIChzID0gem9uZSArIDE7ICpzOyBzKyspCisgICAgICAgICAgaWYgKCpzIDwgJzAnIHx8ICpzID4gJzknKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHMgPSB6b25lOworICAgICAgaWYgKCpzID09ICcrJyB8fCAqcyA9PSAnLScpCisgICAgICB7IGludCBoID0gMCwgbSA9IDA7CisgICAgICAgIGlmIChzWzNdID09ICc6JykKKwl7IHNzY2FuZihzLCAiJWQ6JWQiLCAmaCwgJm0pOworCSAgaWYgKGggPCAwKQorCSAgICBtID0gLW07CisJfQorCWVsc2UKKwl7IG0gPSAoaW50KWF0b2wocyk7CisJICBoID0gbSAvIDEwMDsKKwkgIG0gPSBtICUgMTAwOworCX0KKyAgICAgICAgVC50bV9ob3VyIC09IGg7CisgICAgICAgIFQudG1fbWluIC09IG07CisgICAgICB9CisgICAgICBULnRtX2lzZHN0ID0gMDsKKyAgICAgICpwID0gc29hcF90aW1lZ20oJlQpOworICAgIH0KKyAgICBlbHNlCisgICAgeyBULnRtX2lzZHN0ID0gLTE7CisgICAgICAqcCA9IG1rdGltZSgmVCk7IC8qIG5vIHRpbWUgem9uZTogc3VwcG9zZSBpdCBpcyBsb2NhbHRpbWU/ICovCisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK3RpbWVfdCAqCitTT0FQX0ZNQUMyCitzb2FwX2luZGF0ZVRpbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgdGltZV90ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmRhdGVUaW1lIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcCA9ICh0aW1lX3QqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZih0aW1lX3QpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAodGltZV90Kilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKHRpbWVfdCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MyZGF0ZVRpbWUoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dGxpdGVyYWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgY2hhciAqY29uc3QqcCkKK3sgaW50IGk7CisgIGNvbnN0IGNoYXIgKnQgPSBOVUxMOworICBpZiAodGFnICYmICp0YWcgIT0gJy0nKQorICB7IGlmIChzb2FwLT5sb2NhbF9uYW1lc3BhY2VzICYmICh0ID0gc3RyY2hyKHRhZywgJzonKSkpCisgICAgeyBzdHJuY3B5KHNvYXAtPnRtcGJ1ZiwgdGFnLCB0LXRhZyk7CisgICAgICBzb2FwLT50bXBidWZbdC10YWddID0gJ1wwJzsKKyAgICAgIGZvciAoaSA9IDA7IHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0uaWQ7IGkrKykKKyAgICAgICAgaWYgKCFzdHJjbXAoc29hcC0+dG1wYnVmLCBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW2ldLmlkKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIHQrKzsKKyAgICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiPCVzIHhtbG5zPVwiJXNcIj4iLCB0LCBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW2ldLm5zID8gc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tpXS5ucyA6IFNPQVBfU1RSX0VPUyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IHQgPSB0YWc7CisgICAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIjwlcz4iLCB0YWcpOworICAgIH0KKyAgICBpZiAoc29hcF9zZW5kKHNvYXAsIHNvYXAtPnRtcGJ1ZikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHAgJiYgKnApCisgIHsgaWYgKHNvYXBfc2VuZChzb2FwLCAqcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHQpCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICI8LyVzPiIsIHQpOworICAgIHJldHVybiBzb2FwX3NlbmQoc29hcCwgc29hcC0+dG1wYnVmKTsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKioKK1NPQVBfRk1BQzIKK3NvYXBfaW5saXRlcmFsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGNoYXIgKipwKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMSkpCisgIHsgaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfTk9fVEFHIHx8IHNvYXBfdW5nZXQoc29hcCwgc29hcF9nZXQoc29hcCkpID09IFNPQVBfVFQpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIH0KKyAgaWYgKCFwKQorICAgIGlmICghKHAgPSAoY2hhcioqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihjaGFyKikpKSkKKyAgICAgIHJldHVybiBOVUxMOworICBpZiAoc29hcC0+Ym9keSkKKyAgICAqcCA9IHNvYXBfc3RyaW5nX2luKHNvYXAsIDAsIC0xLCAtMSk7CisgIGVsc2UgaWYgKHNvYXAtPm51bGwpCisgICAgKnAgPSBOVUxMOworICBlbHNlCisgICAgKnAgPSAoY2hhciopU09BUF9TVFJfRU9TOworICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHdsaXRlcmFsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHdjaGFyX3QgKmNvbnN0KnApCit7IGludCBpOworICBjb25zdCBjaGFyICp0ID0gTlVMTDsKKyAgd2NoYXJfdCBjOworICBjb25zdCB3Y2hhcl90ICpzOworICBpZiAodGFnICYmICp0YWcgIT0gJy0nKQorICB7IGlmIChzb2FwLT5sb2NhbF9uYW1lc3BhY2VzICYmICh0ID0gc3RyY2hyKHRhZywgJzonKSkpCisgICAgeyBzdHJuY3B5KHNvYXAtPnRtcGJ1ZiwgdGFnLCB0LXRhZyk7CisgICAgICBzb2FwLT50bXBidWZbdC10YWddID0gJ1wwJzsKKyAgICAgIGZvciAoaSA9IDA7IHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0uaWQ7IGkrKykKKyAgICAgICAgaWYgKCFzdHJjbXAoc29hcC0+dG1wYnVmLCBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW2ldLmlkKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIHQrKzsKKyAgICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiPCVzIHhtbG5zPVwiJXNcIj4iLCB0LCBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW2ldLm5zID8gc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tpXS5ucyA6IFNPQVBfU1RSX0VPUyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IHQgPSB0YWc7CisgICAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIjwlcz4iLCB0YWcpOworICAgIH0KKyAgICBpZiAoc29hcF9zZW5kKHNvYXAsIHNvYXAtPnRtcGJ1ZikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHApCisgIHsgcyA9ICpwOworICAgIHdoaWxlICgoYyA9ICpzKyspKQorICAgICAgaWYgKHNvYXBfcHV0dXRmOChzb2FwLCAodW5zaWduZWQgY2hhciljKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmICh0KQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiPC8lcz4iLCB0KTsKKyAgICByZXR1cm4gc29hcF9zZW5kKHNvYXAsIHNvYXAtPnRtcGJ1Zik7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3djaGFyX3QgKioKK1NPQVBfRk1BQzIKK3NvYXBfaW53bGl0ZXJhbChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB3Y2hhcl90ICoqcCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDEpKQorICB7IGlmIChzb2FwLT5lcnJvciAhPSBTT0FQX05PX1RBRyB8fCBzb2FwX3VuZ2V0KHNvYXAsIHNvYXBfZ2V0KHNvYXApKSA9PSBTT0FQX1RUKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICB9CisgIGlmICghcCkKKyAgICBpZiAoIShwID0gKHdjaGFyX3QqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yod2NoYXJfdCopKSkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgaWYgKHNvYXAtPmJvZHkpCisgICAgKnAgPSBzb2FwX3dzdHJpbmdfaW4oc29hcCwgMCwgLTEsIC0xKTsKKyAgZWxzZSBpZiAoc29hcC0+bnVsbCkKKyAgICAqcCA9IE5VTEw7CisgIGVsc2UKKyAgICAqcCA9ICh3Y2hhcl90KilTT0FQX1NUUl9FT1M7CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIgKgorU09BUF9GTUFDMgorc29hcF90b2tlbihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc2l6ZV90IGk7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IDA7CisgIHJlZ2lzdGVyIGNoYXIgKnMgPSBzb2FwLT50bXBidWY7CisgIGlmICghc29hcC0+Ym9keSkKKyAgICByZXR1cm4gU09BUF9TVFJfRU9TOworICBkbyBjID0gc29hcF9nZXQoc29hcCk7CisgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZihzb2FwLT50bXBidWYpIC0gMTsgaSsrKQorICB7IGlmIChjID09IFNPQVBfVFQgfHwgKGludCljID09IEVPRiB8fCBzb2FwX2JsYW5rKGMpKQorICAgICAgYnJlYWs7CisgICAgKnMrKyA9IChjaGFyKWM7CisgICAgYyA9IHNvYXBfZ2V0KHNvYXApOworICB9CisgIGlmICgoaW50KWMgPT0gRU9GIHx8IGMgPT0gU09BUF9UVCkKKyAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAqcyA9ICdcMCc7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRWxlbWVudCBjb250ZW50IHZhbHVlPSclcydcbiIsIHNvYXAtPnRtcGJ1ZikpOworICByZXR1cm4gc29hcC0+dG1wYnVmOyAvKiByZXR1cm4gbm9uLW51bGwgcG9pbnRlciAqLworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3ZhbHVlKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzaXplX3QgaTsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjID0gMDsKKyAgcmVnaXN0ZXIgY2hhciAqcyA9IHNvYXAtPnRtcGJ1ZjsKKyAgaWYgKCFzb2FwLT5ib2R5KQorICAgIHJldHVybiBTT0FQX1NUUl9FT1M7CisgIGRvIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZikgLSAxOyBpKyspCisgIHsgaWYgKGMgPT0gU09BUF9UVCB8fCAoaW50KWMgPT0gRU9GKQorICAgICAgYnJlYWs7CisgICAgKnMrKyA9IChjaGFyKWM7CisgICAgYyA9IHNvYXBfZ2V0KHNvYXApOworICB9CisgIGZvciAocy0tOyBpID4gMDsgaS0tLCBzLS0pCisgICAgaWYgKCFzb2FwX2JsYW5rKCpzKSkKKyAgICAgIGJyZWFrOworICBzWzFdID0gJ1wwJzsKKyAgaWYgKChpbnQpYyA9PSBFT0YgfHwgYyA9PSBTT0FQX1RUKQorICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRWxlbWVudCBjb250ZW50IHZhbHVlPSclcydcbiIsIHNvYXAtPnRtcGJ1ZikpOworI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICAgIHNvYXAtPmRvbS0+ZGF0YSA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPnRtcGJ1Zik7CisjZW5kaWYKKyAgcmV0dXJuIHNvYXAtPnRtcGJ1ZjsgLyogcmV0dXJuIG5vbi1udWxsIHBvaW50ZXIgKi8KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmICFkZWZpbmVkKFdJVEhfTEVBTkVSKSB8fCAhZGVmaW5lZChXSVRIX05PSFRUUCkKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0bGluZShzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqcywgaW50IGxlbikKK3sgaW50IGkgPSBsZW47CisgIHNvYXBfd2NoYXIgYyA9IDA7CisgIGZvciAoOzspCisgIHsgd2hpbGUgKC0taSA+IDApCisgICAgeyBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICAgICAgaWYgKGMgPT0gJ1xyJyB8fCBjID09ICdcbicpCisgICAgICAgIGJyZWFrOworICAgICAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgICAgKnMrKyA9IChjaGFyKWM7CisgICAgfQorICAgIGlmIChjICE9ICdcbicpCisgICAgICBjID0gc29hcF9nZXRjaGFyKHNvYXApOyAvKiBnb3QgXHIsIG5vdyBnZXQgXG4gKi8KKyAgICBpZiAoYyA9PSAnXG4nKQorICAgIHsgKnMgPSAnXDAnOworICAgICAgaWYgKGkrMSA9PSBsZW4pIC8qIGVtcHR5IGxpbmU6IGVuZCBvZiBIVFRQL01JTUUgaGVhZGVyICovCisgICAgICAgIGJyZWFrOworICAgICAgYyA9IHNvYXBfdW5nZXQoc29hcCwgc29hcF9nZXRjaGFyKHNvYXApKTsKKyAgICAgIGlmIChjICE9ICcgJyAmJiBjICE9ICdcdCcpIC8qIEhUVFAgbGluZSBjb250aW51YXRpb24/ICovCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBlbHNlIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzaXplX3QKK3NvYXBfY291bnRfYXR0YWNobWVudHMoc3RydWN0IHNvYXAgKnNvYXApCit7IAorI2lmbmRlZiBXSVRIX0xFQU5FUgorICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgIHJlZ2lzdGVyIHNpemVfdCBjb3VudCA9IHNvYXAtPmNvdW50OworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNhbGN1bGF0aW5nIHRoZSBtZXNzYWdlIHNpemUgd2l0aCBhdHRhY2htZW50cywgY3VycmVudCBjb3VudD0lbHVcbiIsICh1bnNpZ25lZCBsb25nKWNvdW50KSk7CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpICYmICEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ2FsY3VsYXRpbmcgdGhlIHNpemUgb2YgRElNRSBhdHRhY2htZW50c1xuIikpOworICAgIGZvciAoY29udGVudCA9IHNvYXAtPmRpbWUuZmlyc3Q7IGNvbnRlbnQ7IGNvbnRlbnQgPSBjb250ZW50LT5uZXh0KQorICAgIHsgY291bnQgKz0gMTIgKyAoKGNvbnRlbnQtPnNpemUrMykmKH4zKSk7CisgICAgICBpZiAoY29udGVudC0+aWQpCisgICAgICAgIGNvdW50ICs9ICgoc3RybGVuKGNvbnRlbnQtPmlkKSszKSYofjMpKTsKKyAgICAgIGlmIChjb250ZW50LT50eXBlKQorICAgICAgICBjb3VudCArPSAoKHN0cmxlbihjb250ZW50LT50eXBlKSszKSYofjMpKTsKKyAgICAgIGlmIChjb250ZW50LT5vcHRpb25zKQorICAgICAgICBjb3VudCArPSAoKCgodW5zaWduZWQgY2hhciljb250ZW50LT5vcHRpb25zWzJdIDw8IDgpIHwgKCh1bnNpZ25lZCBjaGFyKWNvbnRlbnQtPm9wdGlvbnNbM10pKSs3KSYofjMpOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTaXplIG9mIERJTUUgYXR0YWNobWVudCBjb250ZW50IGlzICVsdSBieXRlc1xuIiwgKHVuc2lnbmVkIGxvbmcpY29udGVudC0+c2l6ZSkpOworICAgIH0KKyAgfQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKSAmJiBzb2FwLT5taW1lLmJvdW5kYXJ5KQorICB7IHJlZ2lzdGVyIHNpemVfdCBuID0gc3RybGVuKHNvYXAtPm1pbWUuYm91bmRhcnkpOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ2FsY3VsYXRpbmcgdGhlIHNpemUgb2YgTUlNRSBhdHRhY2htZW50c1xuIikpOworICAgIGZvciAoY29udGVudCA9IHNvYXAtPm1pbWUuZmlyc3Q7IGNvbnRlbnQ7IGNvbnRlbnQgPSBjb250ZW50LT5uZXh0KQorICAgIHsgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKKyAgICAgIC8qIGNvdW50IFxyXG4tLWJvdW5kYXJ5XHJcbiAqLworICAgICAgY291bnQgKz0gNiArIG47CisgICAgICAvKiBjb3VudCBDb250ZW50LVR5cGU6IC4uLlxyXG4gKi8KKyAgICAgIGlmIChjb250ZW50LT50eXBlKQorICAgICAgICBjb3VudCArPSAxNiArIHN0cmxlbihjb250ZW50LT50eXBlKTsKKyAgICAgIC8qIGNvdW50IENvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IC4uLlxyXG4gKi8KKyAgICAgIHMgPSBzb2FwX3N0cl9jb2RlKG1pbWVfY29kZXMsIGNvbnRlbnQtPmVuY29kaW5nKTsKKyAgICAgIGlmIChzKQorICAgICAgICBjb3VudCArPSAyOSArIHN0cmxlbihzKTsKKyAgICAgIC8qIGNvdW50IENvbnRlbnQtSUQ6IC4uLlxyXG4gKi8KKyAgICAgIGlmIChjb250ZW50LT5pZCkKKyAgICAgICAgY291bnQgKz0gMTQgKyBzdHJsZW4oY29udGVudC0+aWQpOworICAgICAgLyogY291bnQgQ29udGVudC1Mb2NhdGlvbjogLi4uXHJcbiAqLworICAgICAgaWYgKGNvbnRlbnQtPmxvY2F0aW9uKQorICAgICAgICBjb3VudCArPSAyMCArIHN0cmxlbihjb250ZW50LT5sb2NhdGlvbik7CisgICAgICAvKiBjb3VudCBDb250ZW50LURlc2NyaXB0aW9uOiAuLi5cclxuICovCisgICAgICBpZiAoY29udGVudC0+ZGVzY3JpcHRpb24pCisgICAgICAgIGNvdW50ICs9IDIzICsgc3RybGVuKGNvbnRlbnQtPmxvY2F0aW9uKTsKKyAgICAgIC8qIGNvdW50IFxyXG4uLi5jb250ZW50ICovCisgICAgICBjb3VudCArPSAyICsgY29udGVudC0+c2l6ZTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2l6ZSBvZiBNSU1FIGF0dGFjaG1lbnQgY29udGVudCBpcyAlbHUgYnl0ZXNcbiIsICh1bnNpZ25lZCBsb25nKWNvbnRlbnQtPnNpemUpKTsKKyAgICB9CisgICAgLyogY291bnQgXHJcbi0tYm91bmRhcnktLSAqLworICAgIGNvdW50ICs9IDYgKyBuOworICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTmV3IGNvdW50IGlzICVsdSBieXRlc1xuIiwgKHVuc2lnbmVkIGxvbmcpY291bnQpKTsKKyAgcmV0dXJuIGNvdW50OworI2Vsc2UKKyAgcmV0dXJuIHNvYXAtPmNvdW50OworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzb2FwX3B1dGRpbWVmaWVsZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgc2l6ZV90IG4pCit7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIG4pKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgU09BUF9TVFJfUEFERElORywgLShsb25nKW4mMyk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9kaW1lX29wdGlvbihzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgc2hvcnQgb3B0eXBlLCBjb25zdCBjaGFyICpvcHRpb24pCit7IHNpemVfdCBuOworICBjaGFyICpzID0gTlVMTDsKKyAgaWYgKG9wdGlvbikKKyAgeyBuID0gc3RybGVuKG9wdGlvbik7CisgICAgcyA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBuICsgNSk7CisgICAgaWYgKHMpCisgICAgeyBzWzBdID0gb3B0eXBlID4+IDg7CisgICAgICBzWzFdID0gb3B0eXBlICYgMHhGRjsKKyAgICAgIHNbMl0gPSBuID4+IDg7CisgICAgICBzWzNdID0gbiAmIDB4RkY7CisgICAgICBzdHJjcHkocyArIDQsIG9wdGlvbik7CisgICAgfQorICB9CisgIHJldHVybiBzOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0ZGltZWhkcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgdW5zaWduZWQgY2hhciB0bXBbMTJdOworICBzaXplX3Qgb3B0bGVuID0gMCwgaWRsZW4gPSAwLCB0eXBlbGVuID0gMDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQdXQgRElNRSBoZWFkZXIgaWQ9JyVzJ1xuIiwgc29hcC0+ZGltZS5pZD9zb2FwLT5kaW1lLmlkOiIiKSk7CisgIGlmIChzb2FwLT5kaW1lLm9wdGlvbnMpCisgICAgb3B0bGVuID0gKCgodW5zaWduZWQgY2hhcilzb2FwLT5kaW1lLm9wdGlvbnNbMl0gPDwgOCkgfCAoKHVuc2lnbmVkIGNoYXIpc29hcC0+ZGltZS5vcHRpb25zWzNdKSkgKyA0OworICBpZiAoc29hcC0+ZGltZS5pZCkKKyAgICBpZGxlbiA9IHN0cmxlbihzb2FwLT5kaW1lLmlkKTsKKyAgaWYgKHNvYXAtPmRpbWUudHlwZSkKKyAgICB0eXBlbGVuID0gc3RybGVuKHNvYXAtPmRpbWUudHlwZSk7CisgIHRtcFswXSA9IFNPQVBfRElNRV9WRVJTSU9OIHwgKHNvYXAtPmRpbWUuZmxhZ3MgJiAweDcpOworICB0bXBbMV0gPSBzb2FwLT5kaW1lLmZsYWdzICYgMHhGMDsKKyAgdG1wWzJdID0gb3B0bGVuID4+IDg7CisgIHRtcFszXSA9IG9wdGxlbiAmIDB4RkY7CisgIHRtcFs0XSA9IGlkbGVuID4+IDg7CisgIHRtcFs1XSA9IGlkbGVuICYgMHhGRjsKKyAgdG1wWzZdID0gdHlwZWxlbiA+PiA4OworICB0bXBbN10gPSB0eXBlbGVuICYgMHhGRjsKKyAgdG1wWzhdID0gc29hcC0+ZGltZS5zaXplID4+IDI0OworICB0bXBbOV0gPSAoc29hcC0+ZGltZS5zaXplID4+IDE2KSAmIDB4RkY7CisgIHRtcFsxMF0gPSAoc29hcC0+ZGltZS5zaXplID4+IDgpICYgMHhGRjsKKyAgdG1wWzExXSA9IHNvYXAtPmRpbWUuc2l6ZSAmIDB4RkY7CisgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIChjaGFyKil0bXAsIDEyKQorICAgfHwgc29hcF9wdXRkaW1lZmllbGQoc29hcCwgc29hcC0+ZGltZS5vcHRpb25zLCBvcHRsZW4pCisgICB8fCBzb2FwX3B1dGRpbWVmaWVsZChzb2FwLCBzb2FwLT5kaW1lLmlkLCBpZGxlbikKKyAgIHx8IHNvYXBfcHV0ZGltZWZpZWxkKHNvYXAsIHNvYXAtPmRpbWUudHlwZSwgdHlwZWxlbikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dGRpbWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpKQorICAgIHJldHVybiBTT0FQX09LOworICBmb3IgKGNvbnRlbnQgPSBzb2FwLT5kaW1lLmZpcnN0OyBjb250ZW50OyBjb250ZW50ID0gY29udGVudC0+bmV4dCkKKyAgeyB2b2lkICpoYW5kbGU7CisgICAgc29hcC0+ZGltZS5zaXplID0gY29udGVudC0+c2l6ZTsKKyAgICBzb2FwLT5kaW1lLmlkID0gY29udGVudC0+aWQ7CisgICAgc29hcC0+ZGltZS50eXBlID0gY29udGVudC0+dHlwZTsKKyAgICBzb2FwLT5kaW1lLm9wdGlvbnMgPSBjb250ZW50LT5vcHRpb25zOworICAgIHNvYXAtPmRpbWUuZmxhZ3MgPSBTT0FQX0RJTUVfVkVSU0lPTiB8IFNPQVBfRElNRV9NRURJQTsKKyAgICBpZiAoc29hcC0+ZmRpbWVyZWFkb3BlbiAmJiAoKGhhbmRsZSA9IHNvYXAtPmZkaW1lcmVhZG9wZW4oc29hcCwgKHZvaWQqKWNvbnRlbnQtPnB0ciwgY29udGVudC0+aWQsIGNvbnRlbnQtPnR5cGUsIGNvbnRlbnQtPm9wdGlvbnMpKSB8fCBzb2FwLT5lcnJvcikpCisgICAgeyBzaXplX3Qgc2l6ZSA9IGNvbnRlbnQtPnNpemU7CisgICAgICBpZiAoIWhhbmRsZSkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJmZGltZXJlYWRvcGVuIGZhaWxlZFxuIikpOworICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB9CisgICAgICBpZiAoIWNvbnRlbnQtPnNpemUgJiYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfWE1MKSB8fCAoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTksgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX1NUT1JFKSkKKyAgICAgIHsgc2l6ZV90IGNodW5rc2l6ZSA9IHNpemVvZihzb2FwLT50bXBidWYpOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNodW5rZWQgc3RyZWFtaW5nIERJTUVcbiIpKTsKKyAgICAgICAgZG8gCisgICAgICAgIHsgc2l6ZSA9IHNvYXAtPmZkaW1lcmVhZChzb2FwLCBoYW5kbGUsIHNvYXAtPnRtcGJ1ZiwgY2h1bmtzaXplKTsKKyAgICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImZkaW1lcmVhZCByZXR1cm5lZCAlbHUgYnl0ZXNcbiIsICh1bnNpZ25lZCBsb25nKXNpemUpKTsKKyAgICAgICAgICBpZiAoc2l6ZSA8IGNodW5rc2l6ZSkKKyAJICB7IHNvYXAtPmRpbWUuZmxhZ3MgJj0gflNPQVBfRElNRV9DRjsKKyAgICAgICAgICAgIGlmICghY29udGVudC0+bmV4dCkKKyAgICAgICAgICAgICAgc29hcC0+ZGltZS5mbGFncyB8PSBTT0FQX0RJTUVfTUU7CisJICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgc29hcC0+ZGltZS5mbGFncyB8PSBTT0FQX0RJTUVfQ0Y7CisJICBzb2FwLT5kaW1lLnNpemUgPSBzaXplOworICAgICAgICAgIGlmIChzb2FwX3B1dGRpbWVoZHIoc29hcCkKKwkgICB8fCBzb2FwX3B1dGRpbWVmaWVsZChzb2FwLCBzb2FwLT50bXBidWYsIHNpemUpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgaWYgKHNvYXAtPmRpbWUuaWQpCisgCSAgeyBzb2FwLT5kaW1lLmZsYWdzICY9IH4oU09BUF9ESU1FX01CIHwgU09BUF9ESU1FX01FRElBKTsKKyAgICAgICAgICAgIHNvYXAtPmRpbWUuaWQgPSBOVUxMOworICAgICAgICAgICAgc29hcC0+ZGltZS50eXBlID0gTlVMTDsKKyAgICAgICAgICAgIHNvYXAtPmRpbWUub3B0aW9ucyA9IE5VTEw7CisgICAgICAgICAgfSAgCisgICAgICAgIH0gd2hpbGUgKHNpemUgPj0gY2h1bmtzaXplKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgaWYgKCFjb250ZW50LT5uZXh0KQorICAgICAgICAgIHNvYXAtPmRpbWUuZmxhZ3MgfD0gU09BUF9ESU1FX01FOworICAgICAgICBpZiAoc29hcF9wdXRkaW1laGRyKHNvYXApKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgZG8KKyAgICAgICAgeyBzaXplX3QgYnVmc2l6ZTsKKwkgIGlmIChzaXplIDwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZikpCisgICAgICAgICAgICBidWZzaXplID0gc2l6ZTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBidWZzaXplID0gc2l6ZW9mKHNvYXAtPnRtcGJ1Zik7CisgICAgICAgICAgaWYgKCEoYnVmc2l6ZSA9IHNvYXAtPmZkaW1lcmVhZChzb2FwLCBoYW5kbGUsIHNvYXAtPnRtcGJ1ZiwgYnVmc2l6ZSkpKQorICAgICAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJmZGltZXJlYWQgZmFpbGVkOiBpbnN1ZmZpY2llbnQgZGF0YSAoJWx1IGJ5dGVzIHJlbWFpbmluZyBmcm9tICVsdSBieXRlcylcbiIsICh1bnNpZ25lZCBsb25nKXNpemUsICh1bnNpZ25lZCBsb25nKXNvYXAtPmRpbWUuc2l6ZSkpOworICAgICAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKwkgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHNvYXAtPnRtcGJ1ZiwgYnVmc2l6ZSkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBzaXplIC09IGJ1ZnNpemU7CisgICAgICAgIH0gd2hpbGUgKHNpemUpOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImZkaW1lcmVhZGNsb3NlXG4iKSk7CisgICAgICAgIHNvYXBfc2VuZF9yYXcoc29hcCwgU09BUF9TVFJfUEFERElORywgLShsb25nKXNvYXAtPmRpbWUuc2l6ZSYzKTsKKyAgICAgIH0KKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZmRpbWVyZWFkY2xvc2VcbiIpKTsKKyAgICAgIGlmIChzb2FwLT5mZGltZXJlYWRjbG9zZSkKKyAgICAgICAgc29hcC0+ZmRpbWVyZWFkY2xvc2Uoc29hcCwgaGFuZGxlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgaWYgKCFjb250ZW50LT5uZXh0KQorICAgICAgICBzb2FwLT5kaW1lLmZsYWdzIHw9IFNPQVBfRElNRV9NRTsKKyAgICAgIGlmIChzb2FwX3B1dGRpbWVoZHIoc29hcCkKKyAgICAgICB8fCBzb2FwX3B1dGRpbWVmaWVsZChzb2FwLCAoY2hhciopY29udGVudC0+cHRyLCBjb250ZW50LT5zaXplKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNoYXIgKgorc29hcF9nZXRkaW1lZmllbGQoc3RydWN0IHNvYXAgKnNvYXAsIHNpemVfdCBuKQoreyByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBjaGFyICpzOworICBjaGFyICpwID0gTlVMTDsKKyAgaWYgKG4pCisgIHsgcCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBuICsgMSk7CisgICAgaWYgKHApCisgICAgeyBzID0gcDsKKyAgICAgIGZvciAoaSA9IG47IGkgPiAwOyBpLS0pCisgICAgICB7IGlmICgoaW50KShjID0gc29hcF9nZXQxKHNvYXApKSA9PSBFT0YpCisgICAgICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICAqcysrID0gKGNoYXIpYzsKKyAgICAgIH0KKyAgICAgICpzID0gJ1wwJzsKKyAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwX21vdmUoc29hcCwgLShsb25nKW4mMykpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgfQorICByZXR1cm4gcDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldGRpbWVoZHIoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgcmVnaXN0ZXIgY2hhciAqczsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIHVuc2lnbmVkIGNoYXIgdG1wWzEyXTsKKyAgc2l6ZV90IG9wdGxlbiwgaWRsZW4sIHR5cGVsZW47CisgIGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0RJTUVfRU5EOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdldCBESU1FIGhlYWRlclxuIikpOworICBpZiAoc29hcC0+ZGltZS5idWZsZW4gfHwgc29hcC0+ZGltZS5jaHVua3NpemUpCisgIHsgaWYgKHNvYXBfbW92ZShzb2FwLCAobG9uZykoc29hcC0+ZGltZS5zaXplIC0gc29hcF90ZWxsKHNvYXApKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICBzb2FwX3VuZ2V0KHNvYXAsIHNvYXBfZ2V0Y2hhcihzb2FwKSk7IC8qIHNraXAgcGFkZGluZyBhbmQgZ2V0IGhkciAqLworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiLi4uIEZyb20gY2h1bmtlZFxuIikpOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIHMgPSAoY2hhciopdG1wOworICBmb3IgKGkgPSAxMjsgaSA+IDA7IGktLSkKKyAgeyBpZiAoKGludCkoYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKSkgPT0gRU9GKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgKnMrKyA9IChjaGFyKWM7CisgIH0KKyAgaWYgKCh0bXBbMF0gJiAweEY4KSAhPSBTT0FQX0RJTUVfVkVSU0lPTikKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0RJTUVfTUlTTUFUQ0g7CisgIHNvYXAtPmRpbWUuZmxhZ3MgPSAodG1wWzBdICYgMHg3KSB8ICh0bXBbMV0gJiAweEYwKTsKKyAgb3B0bGVuID0gKHRtcFsyXSA8PCA4KSB8IHRtcFszXTsKKyAgaWRsZW4gPSAodG1wWzRdIDw8IDgpIHwgdG1wWzVdOworICB0eXBlbGVuID0gKHRtcFs2XSA8PCA4KSB8IHRtcFs3XTsKKyAgc29hcC0+ZGltZS5zaXplID0gKHRtcFs4XSA8PCAyNCkgfCAodG1wWzldIDw8IDE2KSB8ICh0bXBbMTBdIDw8IDgpIHwgdG1wWzExXTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJESU1FIHNpemU9JWx1IGZsYWdzPTB4JVhcbiIsICh1bnNpZ25lZCBsb25nKXNvYXAtPmRpbWUuc2l6ZSwgc29hcC0+ZGltZS5mbGFncykpOworICBpZiAoIShzb2FwLT5kaW1lLm9wdGlvbnMgPSBzb2FwX2dldGRpbWVmaWVsZChzb2FwLCBvcHRsZW4pKSAmJiBzb2FwLT5lcnJvcikKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmICghKHNvYXAtPmRpbWUuaWQgPSBzb2FwX2dldGRpbWVmaWVsZChzb2FwLCBpZGxlbikpICYmIHNvYXAtPmVycm9yKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKCEoc29hcC0+ZGltZS50eXBlID0gc29hcF9nZXRkaW1lZmllbGQoc29hcCwgdHlwZWxlbikpICYmIHNvYXAtPmVycm9yKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJESU1FIGlkPSVzLCB0eXBlPSVzLCBvcHRpb25zPSVzXG4iLCBzb2FwLT5kaW1lLmlkP3NvYXAtPmRpbWUuaWQ6IiIsIHNvYXAtPmRpbWUudHlwZT9zb2FwLT5kaW1lLnR5cGU6IiIsIHNvYXAtPmRpbWUub3B0aW9ucz9zb2FwLT5kaW1lLm9wdGlvbnMrNDoiIikpOworICBpZiAoc29hcC0+ZGltZS5mbGFncyAmIFNPQVBfRElNRV9NRSkKKyAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0VOQ19ESU1FOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldGRpbWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHdoaWxlIChzb2FwLT5kaW1lLmZsYWdzICYgU09BUF9ESU1FX0NGKQorICB7IGlmIChzb2FwX2dldGRpbWVoZHIoc29hcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHNvYXBfbW92ZShzb2FwLCBzb2FwLT5kaW1lLnNpemUpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIH0KKyAgaWYgKHNvYXBfbW92ZShzb2FwLCAoKHNvYXAtPmRpbWUuc2l6ZSszKSYofjMpKS1zb2FwX3RlbGwoc29hcCkpKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICBmb3IgKDs7KQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgICBpZiAoc29hcF9nZXRkaW1laGRyKHNvYXApKQorICAgICAgYnJlYWs7CisgICAgaWYgKHNvYXAtPmZkaW1ld3JpdGVvcGVuICYmICgoc29hcC0+ZGltZS5wdHIgPSAoY2hhciopc29hcC0+ZmRpbWV3cml0ZW9wZW4oc29hcCwgc29hcC0+ZGltZS5pZCwgc29hcC0+ZGltZS50eXBlLCBzb2FwLT5kaW1lLm9wdGlvbnMpKSB8fCBzb2FwLT5lcnJvcikpCisgICAgeyBjb25zdCBjaGFyICppZCwgKnR5cGUsICpvcHRpb25zOworICAgICAgc2l6ZV90IHNpemUsIG47CisgICAgICBpZiAoIXNvYXAtPmRpbWUucHRyKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBpZCA9IHNvYXAtPmRpbWUuaWQ7CisgICAgICB0eXBlID0gc29hcC0+ZGltZS50eXBlOworICAgICAgb3B0aW9ucyA9IHNvYXAtPmRpbWUub3B0aW9uczsKKyAgICAgIGZvciAoOzspCisgICAgICB7IHNpemUgPSBzb2FwLT5kaW1lLnNpemU7CisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsgbiA9IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICAgICAgICBpZiAoc2l6ZSA8IG4pCisgICAgICAgICAgICBuID0gc2l6ZTsKKyAgICAgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZmRpbWV3cml0ZShzb2FwLCAodm9pZCopc29hcC0+ZGltZS5wdHIsIHNvYXAtPmJ1ZiArIHNvYXAtPmJ1ZmlkeCwgbikpKQorICAgICAgICAgICAgYnJlYWs7CisJICBzaXplIC09IG47CisJICBpZiAoIXNpemUpCisJICB7IHNvYXAtPmJ1ZmlkeCArPSBuOworCSAgICBicmVhazsKKwkgIH0KKwkgIGlmIChzb2FwX3JlY3Yoc29hcCkpCisgICAgICAgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworCSAgICBnb3RvIGVuZDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvYXBfbW92ZShzb2FwLCAtKGxvbmcpc29hcC0+ZGltZS5zaXplJjMpKQorICAgICAgICB7IHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisJICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShzb2FwLT5kaW1lLmZsYWdzICYgU09BUF9ESU1FX0NGKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKHNvYXBfZ2V0ZGltZWhkcihzb2FwKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KK2VuZDoKKyAgICAgIGlmIChzb2FwLT5mZGltZXdyaXRlY2xvc2UpCisgICAgICAgIHNvYXAtPmZkaW1ld3JpdGVjbG9zZShzb2FwLCAodm9pZCopc29hcC0+ZGltZS5wdHIpOworICAgICAgc29hcC0+ZGltZS5zaXplID0gMDsKKyAgICAgIHNvYXAtPmRpbWUuaWQgPSBpZDsKKyAgICAgIHNvYXAtPmRpbWUudHlwZSA9IHR5cGU7CisgICAgICBzb2FwLT5kaW1lLm9wdGlvbnMgPSBvcHRpb25zOworICAgIH0KKyAgICBlbHNlIGlmIChzb2FwLT5kaW1lLmZsYWdzICYgU09BUF9ESU1FX0NGKQorICAgIHsgY29uc3QgY2hhciAqaWQsICp0eXBlLCAqb3B0aW9uczsKKyAgICAgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgICAgIHJlZ2lzdGVyIGNoYXIgKnM7CisgICAgICByZWdpc3RlciBpbnQgaTsKKyAgICAgIGlkID0gc29hcC0+ZGltZS5pZDsKKyAgICAgIHR5cGUgPSBzb2FwLT5kaW1lLnR5cGU7CisgICAgICBvcHRpb25zID0gc29hcC0+ZGltZS5vcHRpb25zOworICAgICAgaWYgKHNvYXBfbmV3X2Jsb2NrKHNvYXApKQorICAgICAgICByZXR1cm4gU09BUF9FT007CisgICAgICBmb3IgKDs7KQorICAgICAgeyBzID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBzb2FwLT5kaW1lLnNpemUpOworICAgICAgICBpZiAoIXMpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICAgIGZvciAoaSA9IHNvYXAtPmRpbWUuc2l6ZTsgaSA+IDA7IGktLSkKKyAgICAgICAgeyBpZiAoKGludCkoYyA9IHNvYXBfZ2V0MShzb2FwKSkgPT0gRU9GKQorICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgICAgICAgKnMrKyA9IChjaGFyKWM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvYXBfbW92ZShzb2FwLCAtKGxvbmcpc29hcC0+ZGltZS5zaXplJjMpKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgICAgICBpZiAoIShzb2FwLT5kaW1lLmZsYWdzICYgU09BUF9ESU1FX0NGKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKHNvYXBfZ2V0ZGltZWhkcihzb2FwKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB9CisgICAgICBzb2FwLT5kaW1lLnNpemUgPSBzb2FwLT5ibGlzdC0+c2l6ZSsrOyAvKiBhbGxvY2F0ZSBvbmUgbW9yZSBmb3IgJ1wwJyAqLworICAgICAgaWYgKCEoc29hcC0+ZGltZS5wdHIgPSBzb2FwX3NhdmVfYmxvY2soc29hcCwgTlVMTCwgMCkpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBzb2FwLT5kaW1lLnB0cltzb2FwLT5kaW1lLnNpemVdID0gJ1wwJzsgLyogZm9yY2UgMC10ZXJtaW5hdGVkICovCisgICAgICBzb2FwLT5kaW1lLmlkID0gaWQ7CisgICAgICBzb2FwLT5kaW1lLnR5cGUgPSB0eXBlOworICAgICAgc29hcC0+ZGltZS5vcHRpb25zID0gb3B0aW9uczsKKyAgICB9CisgICAgZWxzZQorICAgICAgc29hcC0+ZGltZS5wdHIgPSBzb2FwX2dldGRpbWVmaWVsZChzb2FwLCBzb2FwLT5kaW1lLnNpemUpOworICAgIGNvbnRlbnQgPSBzb2FwX25ld19tdWx0aXBhcnQoc29hcCwgJnNvYXAtPmRpbWUuZmlyc3QsICZzb2FwLT5kaW1lLmxhc3QsIHNvYXAtPmRpbWUucHRyLCBzb2FwLT5kaW1lLnNpemUpOworICAgIGlmICghY29udGVudCkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIGNvbnRlbnQtPmlkID0gc29hcC0+ZGltZS5pZDsKKyAgICBjb250ZW50LT50eXBlID0gc29hcC0+ZGltZS50eXBlOworICAgIGNvbnRlbnQtPm9wdGlvbnMgPSBzb2FwLT5kaW1lLm9wdGlvbnM7CisgICAgc29hcF9yZXNvbHZlX2F0dGFjaG1lbnQoc29hcCwgY29udGVudCk7CisgICAgaWYgKHNvYXAtPmVycm9yKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmIChzb2FwLT5lcnJvciAhPSBTT0FQX0RJTUVfRU5EKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldG1pbWVoZHIoc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgZG8KKyAgeyBpZiAoc29hcF9nZXRsaW5lKHNvYXAsIHNvYXAtPm1zZ2J1Ziwgc2l6ZW9mKHNvYXAtPm1zZ2J1ZikpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHdoaWxlICghKnNvYXAtPm1zZ2J1Zik7CisgIGlmIChzb2FwLT5tc2didWZbMF0gPT0gJy0nICYmIHNvYXAtPm1zZ2J1ZlsxXSA9PSAnLScpCisgIHsgY2hhciAqcyA9IHNvYXAtPm1zZ2J1ZiArIHN0cmxlbihzb2FwLT5tc2didWYpIC0gMTsKKyAgICAvKiByZW1vdmUgd2hpdGUgc3BhY2UgKi8KKyAgICB3aGlsZSAoc29hcF9ibGFuaygqcykpCisgICAgICBzLS07CisgICAgc1sxXSA9ICdcMCc7CisgICAgaWYgKHNvYXAtPm1pbWUuYm91bmRhcnkpCisgICAgeyBpZiAoc3RyY21wKHNvYXAtPm1zZ2J1ZiArIDIsIHNvYXAtPm1pbWUuYm91bmRhcnkpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX01JTUVfRVJST1I7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHNvYXAtPm1pbWUuYm91bmRhcnkgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT5tc2didWYgKyAyKTsKKyAgICBpZiAoc29hcF9nZXRsaW5lKHNvYXAsIHNvYXAtPm1zZ2J1Ziwgc2l6ZW9mKHNvYXAtPm1zZ2J1ZikpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmIChzb2FwX3NldF9taW1lX2F0dGFjaG1lbnQoc29hcCwgTlVMTCwgMCwgU09BUF9NSU1FX05PTkUsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICBjb250ZW50ID0gc29hcC0+bWltZS5sYXN0OworICBmb3IgKDs7KQorICB7IHJlZ2lzdGVyIGNoYXIgKmtleSA9IHNvYXAtPm1zZ2J1ZjsKKyAgICByZWdpc3RlciBjaGFyICp2YWw7CisgICAgaWYgKCEqa2V5KQorICAgICAgYnJlYWs7CisgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk1JTUUgaGVhZGVyOiAlc1xuIiwga2V5KSk7CisgICAgdmFsID0gc3RyY2hyKHNvYXAtPm1zZ2J1ZiwgJzonKTsKKyAgICBpZiAodmFsKQorICAgIHsgKnZhbCA9ICdcMCc7CisgICAgICBkbyB2YWwrKzsKKyAgICAgIHdoaWxlICgqdmFsICYmICp2YWwgPD0gMzIpOworICAgICAgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1JRCIpKQorICAgICAgICBjb250ZW50LT5pZCA9IHNvYXBfc3RyZHVwKHNvYXAsIHZhbCk7CisgICAgICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtTG9jYXRpb24iKSkKKyAgICAgICAgY29udGVudC0+bG9jYXRpb24gPSBzb2FwX3N0cmR1cChzb2FwLCB2YWwpOworICAgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LURpc3Bvc2l0aW9uIikpCisgICAgICAgIGNvbnRlbnQtPmlkID0gc29hcF9zdHJkdXAoc29hcCwgc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwsICJuYW1lIikpOworICAgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LVR5cGUiKSkKKyAgICAgICAgY29udGVudC0+dHlwZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHZhbCk7CisgICAgICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtRGVzY3JpcHRpb24iKSkKKyAgICAgICAgY29udGVudC0+ZGVzY3JpcHRpb24gPSBzb2FwX3N0cmR1cChzb2FwLCB2YWwpOworICAgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIikpCisgICAgICAgIGNvbnRlbnQtPmVuY29kaW5nID0gKGVudW0gc29hcF9taW1lX2VuY29kaW5nKXNvYXBfaW50X2NvZGUobWltZV9jb2RlcywgdmFsLCAobG9uZylTT0FQX01JTUVfTk9ORSk7CisgICAgfQorICAgIGlmIChzb2FwX2dldGxpbmUoc29hcCwga2V5LCBzaXplb2Yoc29hcC0+bXNnYnVmKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRtaW1lKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzb2FwX3djaGFyIGMgPSAwOworICBpZiAoIXNvYXAtPm1pbWUubGFzdCkKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgZm9yICg7OykKKyAgeyByZWdpc3RlciBzaXplX3QgaSwgbSA9IDA7CisgICAgcmVnaXN0ZXIgY2hhciAqcywgKnQgPSBOVUxMOworICAgIHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudCA9IHNvYXAtPm1pbWUubGFzdDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlBhcnNpbmcgTUlNRSBjb250ZW50IGlkPSVzIHR5cGU9JXNcbiIsIGNvbnRlbnQtPmlkP2NvbnRlbnQtPmlkOiIiLCBjb250ZW50LT50eXBlP2NvbnRlbnQtPnR5cGU6IiIpKTsKKyAgICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICBmb3IgKDs7KQorICAgIHsgcmVnaXN0ZXIgc2hvcnQgZmxhZyA9IDA7CisgICAgICBpZiAoIShzID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBTT0FQX0JMS0xFTikpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0JMS0xFTjsgaSsrKQorICAgICAgeyBpZiAobSA+IDApCisgICAgICAgIHsgKnMrKyA9ICp0Kys7CisJICBtLS07CisJfQorCWVsc2UKKyAgICAgICAgeyBpZiAoIWZsYWcpCisJICB7IGMgPSBzb2FwX2dldDEoc29hcCk7CisJICAgIGlmICgoaW50KWMgPT0gRU9GKQorCSAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworCSAgfQorCSAgaWYgKGZsYWcgfHwgYyA9PSAnXHInKQorCSAgeyB0ID0gc29hcC0+dG1wYnVmOworCSAgICBtZW1zZXQodCwgMCwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZikpOworICAgICAgICAgICAgc3RyY3B5KHQsICJcbi0tIik7CisgICAgICAgICAgICBpZiAoc29hcC0+bWltZS5ib3VuZGFyeSkKKwkgICAgICBzdHJuY2F0KHQsIHNvYXAtPm1pbWUuYm91bmRhcnksIHNpemVvZihzb2FwLT50bXBidWYpLTQpOworCSAgICBkbyBjID0gc29hcF9nZXRjaGFyKHNvYXApOworCSAgICB3aGlsZSAoYyA9PSAqdCsrKTsKKwkgICAgaWYgKChpbnQpYyA9PSBFT0YpCisJICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisJICAgIGlmICghKi0tdCkKKwkgICAgICBnb3RvIGVuZDsKKwkgICAgKnQgPSAoY2hhciljOworCSAgICBmbGFnID0gKGMgPT0gJ1xyJyk7CisJICAgIG0gPSB0IC0gc29hcC0+dG1wYnVmICsgMSAtIGZsYWc7CisJICAgIHQgPSBzb2FwLT50bXBidWY7CisJICAgIGMgPSAnXHInOworCSAgfQorCSAgKnMrKyA9IChjaGFyKWM7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CitlbmQ6CisgICAgKnMgPSAnXDAnOyAvKiBmb3JjZSAwLXRlcm1pbmF0ZWQgKi8KKyAgICBjb250ZW50LT5zaXplID0gc29hcF9zaXplX2Jsb2NrKHNvYXAsIGkrMSktMTsKKyAgICBjb250ZW50LT5wdHIgPSBzb2FwX3NhdmVfYmxvY2soc29hcCwgTlVMTCwgMCk7CisgICAgc29hcF9yZXNvbHZlX2F0dGFjaG1lbnQoc29hcCwgY29udGVudCk7CisgICAgaWYgKGMgPT0gJy0nICYmIHNvYXBfZ2V0Y2hhcihzb2FwKSA9PSAnLScpCisgICAgICBicmVhazsKKyAgICB3aGlsZSAoYyAhPSAnXHInICYmIChpbnQpYyAhPSBFT0YgJiYgc29hcF9ibGFuayhjKSkKKyAgICAgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgICAgaWYgKGMgIT0gJ1xyJyB8fCBzb2FwX2dldGNoYXIoc29hcCkgIT0gJ1xuJykKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTUlNRV9FUlJPUjsKKyAgICBpZiAoc29hcF9nZXRtaW1laGRyKHNvYXApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzb2FwX21hdGNoX2NpZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqdCkKK3sgcmVnaXN0ZXIgc2l6ZV90IG47CisgIGlmICghcykKKyAgICByZXR1cm4gMTsKKyAgaWYgKCFzdHJjbXAocywgdCkpCisgICAgcmV0dXJuIDA7CisgIGlmICghc3RybmNtcChzLCAiY2lkOiIsIDQpKQorICAgIHMgKz0gNDsKKyAgbiA9IHN0cmxlbih0KTsKKyAgaWYgKCp0ID09ICc8JykKKyAgeyB0Kys7CisgICAgbiAtPSAyOworICB9CisgIGlmICghc3RybmNtcChzLCB0LCBuKSAmJiAhc1tuXSkKKyAgICByZXR1cm4gMDsKKyAgc29hcF9kZWNvZGUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgcywgU09BUF9TVFJfRU9TKTsKKyAgaWYgKCFzdHJuY21wKHNvYXAtPnRtcGJ1ZiwgdCwgbikgJiYgIXNvYXAtPnRtcGJ1ZltuXSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIDE7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyB2b2lkCitzb2FwX3Jlc29sdmVfYXR0YWNobWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50KQoreyBpZiAoY29udGVudC0+aWQpCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfeGxpc3QgKip4cCA9ICZzb2FwLT54bGlzdDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc29sdmluZyBhdHRhY2htZW50IGRhdGEgZm9yIGlkPSVzXG4iLCBjb250ZW50LT5pZCkpOworICAgIHdoaWxlICgqeHApCisgICAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF94bGlzdCAqeHEgPSAqeHA7CisgICAgICBpZiAoIXNvYXBfbWF0Y2hfY2lkKHNvYXAsIHhxLT5pZCwgY29udGVudC0+aWQpKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZvdW5kIG1hdGNoaW5nIGF0dGFjaG1lbnQgJXMgZm9yIGNvbnRlbnQgaWQ9JXNcbiIsIHhxLT5pZCwgY29udGVudC0+aWQpKTsKKwkqeHAgPSB4cS0+bmV4dDsKKyAgICAgICAgKnhxLT5wdHIgPSAodW5zaWduZWQgY2hhciopY29udGVudC0+cHRyOworICAgICAgICAqeHEtPnNpemUgPSAoaW50KWNvbnRlbnQtPnNpemU7CisgICAgICAgICp4cS0+dHlwZSA9IChjaGFyKiljb250ZW50LT50eXBlOworCWlmIChjb250ZW50LT5vcHRpb25zKQorICAgICAgICAgICp4cS0+b3B0aW9ucyA9IChjaGFyKiljb250ZW50LT5vcHRpb25zOworICAgICAgICBlbHNlCisgICAgICAgICAgKnhxLT5vcHRpb25zID0gKGNoYXIqKWNvbnRlbnQtPmRlc2NyaXB0aW9uOworCVNPQVBfRlJFRShzb2FwLCB4cSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHhwID0gJigqeHApLT5uZXh0OworICAgIH0KKyAgfQorfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0bWltZWhkcihzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50KQoreyBjb25zdCBjaGFyICpzOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk1JTUUgYXR0YWNobWVudCB0eXBlPSVzXG4iLCBjb250ZW50LT50eXBlP2NvbnRlbnQtPnR5cGU6IiIpKTsKKyAgaWYgKHNvYXBfc2VuZDMoc29hcCwgIlxyXG4tLSIsIHNvYXAtPm1pbWUuYm91bmRhcnksICJcclxuIikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoY29udGVudC0+dHlwZSAmJiBzb2FwX3NlbmQzKHNvYXAsICJDb250ZW50LVR5cGU6ICIsIGNvbnRlbnQtPnR5cGUsICJcclxuIikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBzID0gc29hcF9zdHJfY29kZShtaW1lX2NvZGVzLCBjb250ZW50LT5lbmNvZGluZyk7CisgIGlmIChzICYmIHNvYXBfc2VuZDMoc29hcCwgIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6ICIsIHMsICJcclxuIikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoY29udGVudC0+aWQgJiYgc29hcF9zZW5kMyhzb2FwLCAiQ29udGVudC1JRDogIiwgY29udGVudC0+aWQsICJcclxuIikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoY29udGVudC0+bG9jYXRpb24gJiYgc29hcF9zZW5kMyhzb2FwLCAiQ29udGVudC1Mb2NhdGlvbjogIiwgY29udGVudC0+bG9jYXRpb24sICJcclxuIikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoY29udGVudC0+ZGVzY3JpcHRpb24gJiYgc29hcF9zZW5kMyhzb2FwLCAiQ29udGVudC1EZXNjcmlwdGlvbjogIiwgY29udGVudC0+ZGVzY3JpcHRpb24sICJcclxuIikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCAiXHJcbiIsIDIpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0bWltZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkgfHwgIXNvYXAtPm1pbWUuYm91bmRhcnkpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2VuZGluZyBNSU1FIGF0dGFjaG1lbnRzXG4iKSk7CisgIGZvciAoY29udGVudCA9IHNvYXAtPm1pbWUuZmlyc3Q7IGNvbnRlbnQ7IGNvbnRlbnQgPSBjb250ZW50LT5uZXh0KQorICAgIGlmIChzb2FwX3B1dG1pbWVoZHIoc29hcCwgY29udGVudCkKKyAgICAgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCBjb250ZW50LT5wdHIsIGNvbnRlbnQtPnNpemUpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9zZW5kMyhzb2FwLCAiXHJcbi0tIiwgc29hcC0+bWltZS5ib3VuZGFyeSwgIi0tIik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2RpbWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPm9tb2RlIHw9IFNPQVBfRU5DX0RJTUU7CisgIHNvYXAtPmRpbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmxhc3QgPSBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9taW1lKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpib3VuZGFyeSwgY29uc3QgY2hhciAqc3RhcnQpCit7IHNvYXAtPm9tb2RlIHw9IFNPQVBfRU5DX01JTUU7CisgIHNvYXAtPm1pbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmxhc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gc29hcF9zdHJkdXAoc29hcCwgYm91bmRhcnkpOworICBzb2FwLT5taW1lLnN0YXJ0ID0gc29hcF9zdHJkdXAoc29hcCwgc3RhcnQpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2Nscl9kaW1lKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5vbW9kZSAmPSB+U09BUF9FTkNfRElNRTsKKyAgc29hcC0+ZGltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGFzdCA9IE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfY2xyX21pbWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPm9tb2RlICY9IH5TT0FQX0VOQ19NSU1FOworICBzb2FwLT5taW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5sYXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5ib3VuZGFyeSA9IE5VTEw7CisgIHNvYXAtPm1pbWUuc3RhcnQgPSBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc3RydWN0IHNvYXBfbXVsdGlwYXJ0Kgorc29hcF9uZXdfbXVsdGlwYXJ0KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKipmaXJzdCwgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICoqbGFzdCwgY2hhciAqcHRyLCBzaXplX3Qgc2l6ZSkKK3sgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICBjb250ZW50ID0gKHN0cnVjdCBzb2FwX211bHRpcGFydCopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX211bHRpcGFydCkpOworICBpZiAoY29udGVudCkKKyAgeyBjb250ZW50LT5uZXh0ID0gTlVMTDsKKyAgICBjb250ZW50LT5wdHIgPSBwdHI7CisgICAgY29udGVudC0+c2l6ZSA9IHNpemU7CisgICAgY29udGVudC0+aWQgPSBOVUxMOworICAgIGNvbnRlbnQtPnR5cGUgPSBOVUxMOworICAgIGNvbnRlbnQtPm9wdGlvbnMgPSBOVUxMOworICAgIGNvbnRlbnQtPmVuY29kaW5nID0gU09BUF9NSU1FX05PTkU7CisgICAgY29udGVudC0+bG9jYXRpb24gPSBOVUxMOworICAgIGNvbnRlbnQtPmRlc2NyaXB0aW9uID0gTlVMTDsKKyAgICBpZiAoISpmaXJzdCkKKyAgICAgICpmaXJzdCA9IGNvbnRlbnQ7CisgICAgaWYgKCpsYXN0KQorICAgICAgKCpsYXN0KS0+bmV4dCA9IGNvbnRlbnQ7CisgICAgKmxhc3QgPSBjb250ZW50OworICB9CisgIHJldHVybiBjb250ZW50OworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2RpbWVfYXR0YWNobWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqcHRyLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqaWQsIHVuc2lnbmVkIHNob3J0IG9wdHlwZSwgY29uc3QgY2hhciAqb3B0aW9uKQoreyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQgPSBzb2FwX25ld19tdWx0aXBhcnQoc29hcCwgJnNvYXAtPmRpbWUuZmlyc3QsICZzb2FwLT5kaW1lLmxhc3QsIHB0ciwgc2l6ZSk7CisgIGlmICghY29udGVudCkKKyAgICByZXR1cm4gU09BUF9FT007CisgIGNvbnRlbnQtPmlkID0gc29hcF9zdHJkdXAoc29hcCwgaWQpOworICBjb250ZW50LT50eXBlID0gc29hcF9zdHJkdXAoc29hcCwgdHlwZSk7CisgIGNvbnRlbnQtPm9wdGlvbnMgPSBzb2FwX2RpbWVfb3B0aW9uKHNvYXAsIG9wdHlwZSwgb3B0aW9uKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZXRfbWltZV9hdHRhY2htZW50KHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpwdHIsIHNpemVfdCBzaXplLCBlbnVtIHNvYXBfbWltZV9lbmNvZGluZyBlbmNvZGluZywgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKmxvY2F0aW9uLCBjb25zdCBjaGFyICpkZXNjcmlwdGlvbikKK3sgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50ID0gc29hcF9uZXdfbXVsdGlwYXJ0KHNvYXAsICZzb2FwLT5taW1lLmZpcnN0LCAmc29hcC0+bWltZS5sYXN0LCBwdHIsIHNpemUpOworICBpZiAoIWNvbnRlbnQpCisgICAgcmV0dXJuIFNPQVBfRU9NOworICBjb250ZW50LT5pZCA9IHNvYXBfc3RyZHVwKHNvYXAsIGlkKTsKKyAgY29udGVudC0+dHlwZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHR5cGUpOworICBjb250ZW50LT5lbmNvZGluZyA9IGVuY29kaW5nOworICBjb250ZW50LT5sb2NhdGlvbiA9IHNvYXBfc3RyZHVwKHNvYXAsIGxvY2F0aW9uKTsKKyAgY29udGVudC0+ZGVzY3JpcHRpb24gPSBzb2FwX3N0cmR1cChzb2FwLCBkZXNjcmlwdGlvbik7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqCitTT0FQX0ZNQUMyCitzb2FwX25leHRfbXVsdGlwYXJ0KHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudCkKK3sgaWYgKGNvbnRlbnQpCisgICAgcmV0dXJuIGNvbnRlbnQtPm5leHQ7CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZAorc29hcF9zZWxlY3RfbWltZV9ib3VuZGFyeShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgd2hpbGUgKCFzb2FwLT5taW1lLmJvdW5kYXJ5IHx8IHNvYXBfdmFsaWRfbWltZV9ib3VuZGFyeShzb2FwKSkKKyAgeyByZWdpc3RlciBjaGFyICpzID0gc29hcC0+bWltZS5ib3VuZGFyeTsKKyAgICByZWdpc3RlciBzaXplX3QgbiA9IDA7CisgICAgaWYgKHMpCisgICAgICBuID0gc3RybGVuKHMpOworICAgIGlmIChuIDwgMTYpCisgICAgeyBuID0gNjQ7CisgICAgICBzID0gc29hcC0+bWltZS5ib3VuZGFyeSA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBuICsgMSk7CisgICAgICBpZiAoIXMpCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RyY3B5KHMsICI9PSIpOworICAgIHMgKz0gMjsKKyAgICBuIC09IDQ7CisgICAgd2hpbGUgKG4pCisgICAgeyAqcysrID0gc29hcF9iYXNlNjRvW3NvYXBfcmFuZG9tICYgMHgzRl07CisgICAgICBuLS07CisgICAgfQorICAgIHN0cmNweShzLCAiPT0iKTsKKyAgfQorICBpZiAoIXNvYXAtPm1pbWUuc3RhcnQpCisgICAgc29hcC0+bWltZS5zdGFydCA9ICI8U09BUC1FTlY6RW52ZWxvcGU+IjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc29hcF92YWxpZF9taW1lX2JvdW5kYXJ5KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgIHJlZ2lzdGVyIHNpemVfdCBrID0gc3RybGVuKHNvYXAtPm1pbWUuYm91bmRhcnkpOworICBmb3IgKGNvbnRlbnQgPSBzb2FwLT5taW1lLmZpcnN0OyBjb250ZW50OyBjb250ZW50ID0gY29udGVudC0+bmV4dCkKKyAgeyBpZiAoY29udGVudC0+cHRyICYmIGNvbnRlbnQtPnNpemUgPj0gaykKKyAgICB7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnAgPSAoY29uc3QgY2hhciopY29udGVudC0+cHRyOyAKKyAgICAgIHJlZ2lzdGVyIHNpemVfdCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IGNvbnRlbnQtPnNpemUgLSBrOyBpKyssIHArKykKKyAgICAgICAgaWYgKCFzdHJuY21wKHAsIHNvYXAtPm1pbWUuYm91bmRhcnksIGspKQorICAgICAgICAgIHJldHVybiBTT0FQX0VSUjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqCUhUVFAgY29va2llIGhhbmRsaW5nCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIFdJVEhfQ09PS0lFUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3NpemVfdAorU09BUF9GTUFDMgorc29hcF9lbmNvZGVfY29va2llKGNvbnN0IGNoYXIgKnMsIGNoYXIgKnQsIHNpemVfdCBsZW4pCit7IHJlZ2lzdGVyIGludCBjOworICByZWdpc3RlciBzaXplX3QgbiA9IGxlbjsKKyAgd2hpbGUgKChjID0gKnMrKykgJiYgLS1uID4gMCkKKyAgeyBpZiAoYyA+ICcgJyAmJiBjIDwgMTI4ICYmICFzdHJjaHIoIigpPD5ALDs6XFxcIi9bXT89e30iLCBjKSkKKyAgICAgICp0KysgPSBjOworICAgIGVsc2UgaWYgKG4gPiAyKQorICAgIHsgKnQrKyA9ICclJzsKKyAgICAgICp0KysgPSAoYyA+PiA0KSArIChjID4gMTU5ID8gJzcnIDogJzAnKTsKKyAgICAgIGMgJj0gMHhGOworICAgICAgKnQrKyA9IGMgKyAoYyA+IDkgPyAnNycgOiAnMCcpOworICAgICAgbiAtPSAyOworICAgIH0KKyAgICBlbHNlCisgICAgICBicmVhazsKKyAgfQorICAqdCA9ICdcMCc7CisgIHJldHVybiBsZW4gLSBuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQorc3RydWN0IHNvYXBfY29va2llKgorU09BUF9GTUFDMgorc29hcF9jb29raWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBzaXplX3QgbjsKKyAgaWYgKCFkb21haW4pCisgICAgZG9tYWluID0gc29hcC0+Y29va2llX2RvbWFpbjsKKyAgaWYgKCFwYXRoKQorICAgIHBhdGggPSBzb2FwLT5jb29raWVfcGF0aDsKKyAgaWYgKCpwYXRoID09ICcvJykKKyAgICBwYXRoKys7CisgIG4gPSBzdHJsZW4ocGF0aCk7CisgIGZvciAocCA9IHNvYXAtPmNvb2tpZXM7IHA7IHAgPSBwLT5uZXh0KQorICAgIGlmICghc3RyY21wKHAtPm5hbWUsIG5hbWUpCisgICAgICYmIGRvbWFpbgorICAgICAmJiBwLT5kb21haW4KKyAgICAgJiYgIXN0cmNtcChwLT5kb21haW4sIGRvbWFpbikKKyAgICAgJiYgIXN0cm5jbXAocC0+cGF0aCwgcGF0aCwgbikpCisgICAgICBicmVhazsKKyAgcmV0dXJuIHA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcF9jb29raWUqCitTT0FQX0ZNQUMyCitzb2FwX3NldF9jb29raWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqKnAsICpxOworICBpbnQgbjsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTZXQgY29va2llOiAlcz0lcyBkb21haW49JXMgcGF0aD0lc1xuIiwgbmFtZSwgdmFsdWU/dmFsdWU6IiIsIGRvbWFpbj9kb21haW46IiIsIHBhdGg/cGF0aDoiIikpOworICBpZiAoIWRvbWFpbikKKyAgICBkb21haW4gPSBzb2FwLT5jb29raWVfZG9tYWluOworICBpZiAoIXBhdGgpCisgICAgcGF0aCA9IHNvYXAtPmNvb2tpZV9wYXRoOworICBpZiAoIXBhdGgpCisgIHsgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIkNvb2tpZSBwYXRoIG5vdCBzZXQiLCBOVUxMLCBTT0FQX0hUVFBfRVJST1IpOworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmICgqcGF0aCA9PSAnLycpCisgICAgcGF0aCsrOworICBxID0gc29hcF9jb29raWUoc29hcCwgbmFtZSwgZG9tYWluLCBwYXRoKTsKKyAgaWYgKCFxKQorICB7IGlmICgocSA9IChzdHJ1Y3Qgc29hcF9jb29raWUqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9jb29raWUpKSkpCisgICAgeyBpZiAoKHEtPm5hbWUgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKG5hbWUpKzEpKSkKKyAgICAgICAgc3RyY3B5KHEtPm5hbWUsIG5hbWUpOworICAgICAgcS0+dmFsdWUgPSBOVUxMOworICAgICAgcS0+ZG9tYWluID0gTlVMTDsKKyAgICAgIHEtPnBhdGggPSBOVUxMOworICAgICAgcS0+ZXhwaXJlID0gLTE7CisgICAgICBxLT52ZXJzaW9uID0gMDsKKyAgICAgIHEtPnNlY3VyZSA9IDA7CisgICAgICBxLT5tb2RpZmllZCA9IDA7CisgICAgICBmb3IgKHAgPSAmc29hcC0+Y29va2llcywgbiA9IHNvYXAtPmNvb2tpZV9tYXg7ICpwICYmIG47IHAgPSAmKCpwKS0+bmV4dCwgbi0tKQorICAgICAgICBpZiAoIXN0cmNtcCgoKnApLT5uYW1lLCBuYW1lKSAmJiAoKnApLT5wYXRoICYmIHN0cmNtcCgoKnApLT5wYXRoLCBwYXRoKSA8IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICBpZiAobikKKyAgICAgIHsgcS0+bmV4dCA9ICpwOworICAgICAgICAqcCA9IHE7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IFNPQVBfRlJFRShzb2FwLCBxLT5uYW1lKTsKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHEpOworICAgICAgICBxID0gTlVMTDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZQorICAgIHEtPm1vZGlmaWVkID0gMTsKKyAgaWYgKHEpCisgIHsgaWYgKHEtPnZhbHVlKQorICAgIHsgU09BUF9GUkVFKHNvYXAsIHEtPnZhbHVlKTsKKyAgICAgIHEtPnZhbHVlID0gTlVMTDsKKyAgICB9CisgICAgaWYgKHEtPmRvbWFpbikKKyAgICB7IFNPQVBfRlJFRShzb2FwLCBxLT5kb21haW4pOworICAgICAgcS0+ZG9tYWluID0gTlVMTDsKKyAgICB9CisgICAgaWYgKHEtPnBhdGgpCisgICAgeyBTT0FQX0ZSRUUoc29hcCwgcS0+cGF0aCk7CisgICAgICBxLT5wYXRoID0gTlVMTDsKKyAgICB9CisgICAgaWYgKHZhbHVlICYmICp2YWx1ZSAmJiAocS0+dmFsdWUgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHZhbHVlKSsxKSkpCisgICAgICBzdHJjcHkocS0+dmFsdWUsIHZhbHVlKTsKKyAgICBpZiAoZG9tYWluICYmICpkb21haW4gJiYgKHEtPmRvbWFpbiA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4oZG9tYWluKSsxKSkpCisgICAgICBzdHJjcHkocS0+ZG9tYWluLCBkb21haW4pOworICAgIGlmIChwYXRoICYmICpwYXRoICYmIChxLT5wYXRoID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihwYXRoKSsxKSkpCisgICAgICBzdHJjcHkocS0+cGF0aCwgcGF0aCk7CisgICAgcS0+c2Vzc2lvbiA9IDE7CisgICAgcS0+ZW52ID0gMDsKKyAgfQorICByZXR1cm4gcTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfY2xyX2Nvb2tpZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKipwLCAqcTsKKyAgaWYgKCFkb21haW4pCisgICAgZG9tYWluID0gc29hcC0+Y29va2llX2RvbWFpbjsKKyAgaWYgKCFkb21haW4pCisgIHsgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIkNvb2tpZSBkb21haW4gbm90IHNldCIsIE5VTEwsIFNPQVBfSFRUUF9FUlJPUik7CisgICAgcmV0dXJuOworICB9CisgIGlmICghcGF0aCkKKyAgICBwYXRoID0gc29hcC0+Y29va2llX3BhdGg7CisgIGlmICghcGF0aCkKKyAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiQ29va2llIHBhdGggbm90IHNldCIsIE5VTEwsIFNPQVBfSFRUUF9FUlJPUik7CisgICAgcmV0dXJuOworICB9CisgIGlmICgqcGF0aCA9PSAnLycpCisgICAgcGF0aCsrOworICBmb3IgKHAgPSAmc29hcC0+Y29va2llcywgcSA9ICpwOyBxOyBxID0gKnApCisgICAgaWYgKCFzdHJjbXAocS0+bmFtZSwgbmFtZSkgJiYgIXN0cmNtcChxLT5kb21haW4sIGRvbWFpbikgJiYgIXN0cm5jbXAocS0+cGF0aCwgcGF0aCwgc3RybGVuKHEtPnBhdGgpKSkKKyAgICB7IGlmIChxLT52YWx1ZSkKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHEtPnZhbHVlKTsKKyAgICAgIGlmIChxLT5kb21haW4pCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBxLT5kb21haW4pOworICAgICAgaWYgKHEtPnBhdGgpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBxLT5wYXRoKTsKKyAgICAgICpwID0gcS0+bmV4dDsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBxKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgcCA9ICZxLT5uZXh0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX2Nvb2tpZV92YWx1ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGlmICgocCA9IHNvYXBfY29va2llKHNvYXAsIG5hbWUsIGRvbWFpbiwgcGF0aCkpKQorICAgIHJldHVybiBwLT52YWx1ZTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfZW52X2Nvb2tpZV92YWx1ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGlmICgocCA9IHNvYXBfY29va2llKHNvYXAsIG5hbWUsIGRvbWFpbiwgcGF0aCkpICYmIHAtPmVudikKKyAgICByZXR1cm4gcC0+dmFsdWU7CisgIHJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQorbG9uZworU09BUF9GTUFDMgorc29hcF9jb29raWVfZXhwaXJlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgaWYgKChwID0gc29hcF9jb29raWUoc29hcCwgbmFtZSwgZG9tYWluLCBwYXRoKSkpCisgICAgcmV0dXJuIHAtPmV4cGlyZTsKKyAgcmV0dXJuIC0xOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NldF9jb29raWVfZXhwaXJlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBsb25nIGV4cGlyZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGlmICgocCA9IHNvYXBfY29va2llKHNvYXAsIG5hbWUsIGRvbWFpbiwgcGF0aCkpKQorICB7IHAtPmV4cGlyZSA9IGV4cGlyZTsKKyAgICBwLT5tb2RpZmllZCA9IDE7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgcmV0dXJuIFNPQVBfRVJSOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NldF9jb29raWVfc2Vzc2lvbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGlmICgocCA9IHNvYXBfY29va2llKHNvYXAsIG5hbWUsIGRvbWFpbiwgcGF0aCkpKQorICB7IHAtPnNlc3Npb24gPSAxOworICAgIHAtPm1vZGlmaWVkID0gMTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICByZXR1cm4gU09BUF9FUlI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfY2xyX2Nvb2tpZV9zZXNzaW9uKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgaWYgKChwID0gc29hcF9jb29raWUoc29hcCwgbmFtZSwgZG9tYWluLCBwYXRoKSkpCisgIHsgcC0+c2Vzc2lvbiA9IDA7CisgICAgcC0+bW9kaWZpZWQgPSAxOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIHJldHVybiBTT0FQX0VSUjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRzZXRjb29raWVzKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGNoYXIgKnMsIHRtcFs0MDk2XTsKKyAgY29uc3QgY2hhciAqdDsKKyAgZm9yIChwID0gc29hcC0+Y29va2llczsgcDsgcCA9IHAtPm5leHQpCisgIHsgaWYgKHAtPm1vZGlmaWVkIHx8ICFwLT5lbnYpCisgICAgeyBzID0gdG1wOworICAgICAgaWYgKHAtPm5hbWUpCisgICAgICAgIHMgKz0gc29hcF9lbmNvZGVfY29va2llKHAtPm5hbWUsIHMsIHRtcC1zKzQwNjQpOworICAgICAgaWYgKHAtPnZhbHVlICYmICpwLT52YWx1ZSkKKyAgICAgIHsgKnMrKyA9ICc9JzsKKyAgICAgICAgcyArPSBzb2FwX2VuY29kZV9jb29raWUocC0+dmFsdWUsIHMsIHRtcC1zKzQwNjQpOworICAgICAgfQorICAgICAgaWYgKHAtPmRvbWFpbiAmJiAoaW50KXN0cmxlbihwLT5kb21haW4pIDwgdG1wLXMrNDA2NCkKKyAgICAgICAgc3ByaW50ZihzLCAiO0RvbWFpbj1cIiVzXCIiLCBwLT5kb21haW4pOworICAgICAgZWxzZSBpZiAoc29hcC0+Y29va2llX2RvbWFpbiAmJiAoaW50KXN0cmxlbihzb2FwLT5jb29raWVfZG9tYWluKSA8IHRtcC1zKzQwNjQpCisgICAgICAgIHNwcmludGYocywgIjtEb21haW49XCIlc1wiIiwgc29hcC0+Y29va2llX2RvbWFpbik7CisgICAgICBzdHJjYXQocywgIjtQYXRoPVwiLyIpOworICAgICAgaWYgKHAtPnBhdGgpCisgICAgICAgIHQgPSBwLT5wYXRoOworICAgICAgZWxzZQorICAgICAgICB0ID0gc29hcC0+Y29va2llX3BhdGg7CisgICAgICBpZiAodCkKKyAgICAgIHsgaWYgKCp0ID09ICcvJykKKyAgICAgICAgICB0Kys7CisgICAgICAgIGlmICgoaW50KXN0cmxlbih0KSA8IHRtcC1zKzQwNjQpCisgICAgICAgICAgc3RyY2F0KHMsIHQpOworICAgICAgfQorICAgICAgcyArPSBzdHJsZW4ocyk7CisgICAgICAqcysrID0gJyInOworICAgICAgaWYgKHAtPnZlcnNpb24gPiAwKQorICAgICAgICBzcHJpbnRmKHMsICI7VmVyc2lvbj0ldSIsIHAtPnZlcnNpb24pOworICAgICAgaWYgKHAtPmV4cGlyZSA+PSAwKQorICAgICAgICBzcHJpbnRmKHMsICI7TWF4LUFnZT0lbGQiLCBwLT5leHBpcmUpOworICAgICAgaWYgKHAtPnNlY3VyZSkKKyAgICAgICAgc3RyY2F0KHMsICI7U2VjdXJlIik7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNldC1Db29raWU6ICVzXG4iLCB0bXApKTsKKyAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiU2V0LUNvb2tpZSIsIHRtcCkpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICB9CisgIHJldHVybiBTT0FQX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dGNvb2tpZXMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCwgaW50IHNlY3VyZSkKK3sgc3RydWN0IHNvYXBfY29va2llICoqcCwgKnE7CisgIHVuc2lnbmVkIGludCB2ZXJzaW9uID0gMDsKKyAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CisgIGNoYXIgKnMsIHRtcFs0MDk2XTsKKyAgcCA9ICZzb2FwLT5jb29raWVzOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNlbmRpbmcgY29va2llcyBmb3IgZG9tYWluPSVzIHBhdGg9JXNcbiIsIGRvbWFpbiwgcGF0aCkpOworICBpZiAoKnBhdGggPT0gJy8nKQorICAgIHBhdGgrKzsKKyAgd2hpbGUgKChxID0gKnApKQorICB7IGlmIChxLT5leHBpcmUgJiYgbm93ID4gcS0+ZXhwaXJlKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb29raWUgJXMgZXhwaXJlZFxuIiwgcS0+bmFtZSkpOworICAgICAgU09BUF9GUkVFKHNvYXAsIHEtPm5hbWUpOworICAgICAgaWYgKHEtPnZhbHVlKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcS0+dmFsdWUpOworICAgICAgaWYgKHEtPmRvbWFpbikKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHEtPmRvbWFpbik7CisgICAgICBpZiAocS0+cGF0aCkKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHEtPnBhdGgpOworICAgICAgKnAgPSBxLT5uZXh0OworICAgICAgU09BUF9GUkVFKHNvYXAsIHEpOworICAgIH0KKyAgICBlbHNlCisgICAgeyBzaXplX3QgZG9tbGVuID0gMDsKKyAgICAgIGlmIChxLT5kb21haW4pCisgICAgICB7IGNvbnN0IGNoYXIgKnMgPSBzdHJjaHIocS0+ZG9tYWluLCAnOicpOworICAgICAgICBpZiAocykKKwkgIGRvbWxlbiA9IHMgLSBxLT5kb21haW47CisJZWxzZQorICAgICAgICAgIGRvbWxlbiA9IHN0cmxlbihxLT5kb21haW4pOworICAgICAgfQorICAgICAgaWYgKCghcS0+ZG9tYWluIHx8ICFzdHJuY21wKHEtPmRvbWFpbiwgZG9tYWluLCBkb21sZW4pKQorICAgICAgICAgICYmICghcS0+cGF0aCB8fCAhc3RybmNtcChxLT5wYXRoLCBwYXRoLCBzdHJsZW4ocS0+cGF0aCkpKQorICAgICAgICAgICYmICghcS0+c2VjdXJlIHx8IHNlY3VyZSkpCisgICAgICB7IHMgPSB0bXA7CisgICAgICAgIGlmIChxLT52ZXJzaW9uICE9IHZlcnNpb24pCisgICAgICAgIHsgc3ByaW50ZihzLCAiJFZlcnNpb249JXU7IiwgcS0+dmVyc2lvbik7CisgICAgICAgICAgdmVyc2lvbiA9IHEtPnZlcnNpb247CisgICAgICAgIH0KKyAgICAgICAgaWYgKHEtPm5hbWUpCisgICAgICAgICAgcyArPSBzb2FwX2VuY29kZV9jb29raWUocS0+bmFtZSwgcywgdG1wLXMrNDA4MCk7CisgICAgICAgIGlmIChxLT52YWx1ZSAmJiAqcS0+dmFsdWUpCisgICAgICAgIHsgKnMrKyA9ICc9JzsKKyAgICAgICAgICBzICs9IHNvYXBfZW5jb2RlX2Nvb2tpZShxLT52YWx1ZSwgcywgdG1wLXMrNDA4MCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHEtPnBhdGggJiYgKGludClzdHJsZW4ocS0+cGF0aCkgPCB0bXAtcys0MDgwKQorICAgICAgICB7IHNwcmludGYocywgIjskUGF0aD1cIi8lc1wiIiwgKCpxLT5wYXRoID09ICcvJyA/IHEtPnBhdGggKyAxIDogcS0+cGF0aCkpOworICAgICAgICAgIHMgKz0gc3RybGVuKHMpOworICAgICAgICB9CisgICAgICAgIGlmIChxLT5kb21haW4gJiYgKGludClzdHJsZW4ocS0+ZG9tYWluKSA8IHRtcC1zKzQwODApCisgICAgICAgICAgc3ByaW50ZihzLCAiOyREb21haW49XCIlc1wiIiwgcS0+ZG9tYWluKTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb29raWU6ICVzXG4iLCB0bXApKTsKKyAgICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJDb29raWUiLCB0bXApKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB9CisgICAgICBwID0gJnEtPm5leHQ7CisgICAgfQorICB9CisgIHJldHVybiBTT0FQX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9nZXRjb29raWVzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp2YWwpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcCA9IE5VTEwsICpxOworICBjb25zdCBjaGFyICpzOworICBjaGFyICp0LCB0bXBbNDA5Nl07IC8qIGNvb2tpZSBzaXplIGlzIHVwIHRvIDQwOTYgYnl0ZXMgW1JGQzIxMDldICovCisgIGNoYXIgKmRvbWFpbiA9IE5VTEw7CisgIGNoYXIgKnBhdGggPSBOVUxMOworICB1bnNpZ25lZCBpbnQgdmVyc2lvbiA9IDA7CisgIHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOworICBpZiAoIXZhbCkKKyAgICByZXR1cm47CisgIHMgPSB2YWw7CisgIHdoaWxlICgqcykKKyAgeyBzID0gc29hcF9kZWNvZGVfa2V5KHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgIGlmICghc29hcF90YWdfY21wKHRtcCwgIiRWZXJzaW9uIikpCisgICAgeyBpZiAoKHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcykpKQorICAgICAgeyBpZiAocCkKKyAgICAgICAgICBwLT52ZXJzaW9uID0gKGludClhdG9sKHRtcCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICB2ZXJzaW9uID0gKGludClhdG9sKHRtcCk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAodG1wLCAiJFBhdGgiKSkKKyAgICB7IHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICBpZiAoKnRtcCkKKyAgICAgIHsgaWYgKCh0ID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbih0bXApKzEpKSkKKyAgICAgICAgICBzdHJjcHkodCwgdG1wKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgdCA9IE5VTEw7CisgICAgICBpZiAocCkKKyAgICAgIHsgaWYgKHAtPnBhdGgpCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnBhdGgpOworICAgICAgICBwLT5wYXRoID0gdDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgaWYgKHBhdGgpCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHBhdGgpOworICAgICAgICBwYXRoID0gdDsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcCh0bXAsICIkRG9tYWluIikpCisgICAgeyBzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgICAgaWYgKCp0bXApCisgICAgICB7IGlmICgodCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4odG1wKSsxKSkpCisgICAgICAgICAgc3RyY3B5KHQsIHRtcCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHQgPSBOVUxMOworICAgICAgaWYgKHApCisgICAgICB7IGlmIChwLT5kb21haW4pCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPmRvbWFpbik7CisJcC0+ZG9tYWluID0gdDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgaWYgKGRvbWFpbikKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgZG9tYWluKTsKKyAgICAgICAgZG9tYWluID0gdDsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAocCAmJiAhc29hcF90YWdfY21wKHRtcCwgIlBhdGgiKSkKKyAgICB7IGlmIChwLT5wYXRoKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+cGF0aCk7CisgICAgICBzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgICAgaWYgKCp0bXApCisgICAgICB7IGlmICgocC0+cGF0aCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4odG1wKSsxKSkpCisgICAgICAgICAgc3RyY3B5KHAtPnBhdGgsIHRtcCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHAtPnBhdGggPSBOVUxMOworICAgIH0KKyAgICBlbHNlIGlmIChwICYmICFzb2FwX3RhZ19jbXAodG1wLCAiRG9tYWluIikpCisgICAgeyBpZiAocC0+ZG9tYWluKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+ZG9tYWluKTsKKyAgICAgIHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICBpZiAoKnRtcCkKKyAgICAgIHsgaWYgKChwLT5kb21haW4gPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHRtcCkrMSkpKQorICAgICAgICAgIHN0cmNweShwLT5kb21haW4sIHRtcCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHAtPmRvbWFpbiA9IE5VTEw7CisgICAgfQorICAgIGVsc2UgaWYgKHAgJiYgIXNvYXBfdGFnX2NtcCh0bXAsICJWZXJzaW9uIikpCisgICAgeyBzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgICAgcC0+dmVyc2lvbiA9ICh1bnNpZ25lZCBpbnQpYXRvbCh0bXApOworICAgIH0KKyAgICBlbHNlIGlmIChwICYmICFzb2FwX3RhZ19jbXAodG1wLCAiTWF4LUFnZSIpKQorICAgIHsgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgIHAtPmV4cGlyZSA9IG5vdyArIGF0b2wodG1wKTsKKyAgICB9CisgICAgZWxzZSBpZiAocCAmJiAhc29hcF90YWdfY21wKHRtcCwgIkV4cGlyZXMiKSkKKyAgICB7IHN0cnVjdCB0bSBUOworICAgICAgY2hhciBhWzNdOyAKKyAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG1uc1tdID0gImFuZWJhcnByYXl1bnVsdWdlcGN0b3ZlYyI7CisgICAgICBzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgICAgaWYgKHN0cmxlbih0bXApID4gMjApCisgICAgICB7IG1lbXNldCgodm9pZCopJlQsIDAsIHNpemVvZihUKSk7CisgICAgICAgIGFbMF0gPSB0bXBbNF07CisgICAgICAgIGFbMV0gPSB0bXBbNV07CisgICAgICAgIGFbMl0gPSAnXDAnOworICAgICAgICBULnRtX21kYXkgPSAoaW50KWF0b2woYSk7CisgICAgICAgIGFbMF0gPSB0bXBbOF07CisgICAgICAgIGFbMV0gPSB0bXBbOV07CisgICAgICAgIFQudG1fbW9uID0gKHN0cnN0cihtbnMsIGEpIC0gbW5zKSAvIDI7CisgICAgICAgIGFbMF0gPSB0bXBbMTFdOworICAgICAgICBhWzFdID0gdG1wWzEyXTsKKyAgICAgICAgVC50bV95ZWFyID0gMTAwICsgKGludClhdG9sKGEpOworICAgICAgICBhWzBdID0gdG1wWzEzXTsKKyAgICAgICAgYVsxXSA9IHRtcFsxNF07CisgICAgICAgIFQudG1faG91ciA9IChpbnQpYXRvbChhKTsKKyAgICAgICAgYVswXSA9IHRtcFsxNl07CisgICAgICAgIGFbMV0gPSB0bXBbMTddOworICAgICAgICBULnRtX21pbiA9IChpbnQpYXRvbChhKTsKKyAgICAgICAgYVswXSA9IHRtcFsxOV07CisgICAgICAgIGFbMV0gPSB0bXBbMjBdOworICAgICAgICBULnRtX3NlYyA9IChpbnQpYXRvbChhKTsKKyAgICAgICAgcC0+ZXhwaXJlID0gc29hcF90aW1lZ20oJlQpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChwICYmICFzb2FwX3RhZ19jbXAodG1wLCAiU2VjdXJlIikpCisgICAgICBwLT5zZWN1cmUgPSAxOworICAgIGVsc2UKKyAgICB7IGlmIChwKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdvdCBlbnZpcm9ubWVudCBjb29raWUgJXM9JXMgZG9tYWluPSVzIHBhdGg9JXMgZXhwaXJlPSVsZCBzZWN1cmU9JWRcbiIsIHAtPm5hbWUsIHAtPnZhbHVlP3AtPnZhbHVlOiIiLCBwLT5kb21haW4/cC0+ZG9tYWluOiIiLCBwLT5wYXRoP3AtPnBhdGg6IiIsIHAtPmV4cGlyZSwgcC0+c2VjdXJlKSk7CisgICAgICAgIGlmICgocSA9IHNvYXBfc2V0X2Nvb2tpZShzb2FwLCBwLT5uYW1lLCBwLT52YWx1ZSwgcC0+ZG9tYWluLCBwLT5wYXRoKSkpCisgICAgICAgIHsgcS0+dmVyc2lvbiA9IHAtPnZlcnNpb247CisgICAgICAgICAgcS0+ZXhwaXJlID0gcC0+ZXhwaXJlOworICAgICAgICAgIHEtPnNlY3VyZSA9IHAtPnNlY3VyZTsKKyAgICAgICAgICBxLT5lbnYgPSAxOworICAgICAgICB9CisgICAgICAgIGlmIChwLT5uYW1lKQorICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5uYW1lKTsKKyAgICAgICAgaWYgKHAtPnZhbHVlKQorICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT52YWx1ZSk7CisgICAgICAgIGlmIChwLT5kb21haW4pCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPmRvbWFpbik7CisgICAgICAgIGlmIChwLT5wYXRoKQorICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5wYXRoKTsKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHApOworICAgICAgfQorICAgICAgaWYgKChwID0gKHN0cnVjdCBzb2FwX2Nvb2tpZSopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2Nvb2tpZSkpKSkKKyAgICAgIHsgcC0+bmFtZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4odG1wKSsxKTsKKyAgICAgICAgc3RyY3B5KHAtPm5hbWUsIHRtcCk7CisgICAgICAgIHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICAgIGlmICgqdG1wKQorICAgICAgICB7IHAtPnZhbHVlID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbih0bXApKzEpOworICAgICAgICAgIHN0cmNweShwLT52YWx1ZSwgdG1wKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgcC0+dmFsdWUgPSBOVUxMOworICAgICAgICBwLT5kb21haW4gPSBkb21haW47CisgICAgICAgIHAtPnBhdGggPSBwYXRoOworICAgICAgICBwLT5leHBpcmUgPSAwOworICAgICAgICBwLT5zZWN1cmUgPSAwOworICAgICAgICBwLT52ZXJzaW9uID0gdmVyc2lvbjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKHApCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHb3QgZW52aXJvbm1lbnQgY29va2llICVzPSVzIGRvbWFpbj0lcyBwYXRoPSVzIGV4cGlyZT0lbGQgc2VjdXJlPSVkXG4iLCBwLT5uYW1lLCBwLT52YWx1ZT9wLT52YWx1ZToiIiwgcC0+ZG9tYWluP3AtPmRvbWFpbjoiIiwgcC0+cGF0aD9wLT5wYXRoOiIiLCBwLT5leHBpcmUsIHAtPnNlY3VyZSkpOworICAgIGlmICgocSA9IHNvYXBfc2V0X2Nvb2tpZShzb2FwLCBwLT5uYW1lLCBwLT52YWx1ZSwgcC0+ZG9tYWluLCBwLT5wYXRoKSkpCisgICAgeyBxLT52ZXJzaW9uID0gcC0+dmVyc2lvbjsKKyAgICAgIHEtPmV4cGlyZSA9IHAtPmV4cGlyZTsKKyAgICAgIHEtPnNlY3VyZSA9IHAtPnNlY3VyZTsKKyAgICAgIHEtPmVudiA9IDE7CisgICAgfQorICAgIGlmIChwLT5uYW1lKQorICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPm5hbWUpOworICAgIGlmIChwLT52YWx1ZSkKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT52YWx1ZSk7CisgICAgaWYgKHAtPmRvbWFpbikKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5kb21haW4pOworICAgIGlmIChwLT5wYXRoKQorICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnBhdGgpOworICAgIFNPQVBfRlJFRShzb2FwLCBwKTsKKyAgfQorICBpZiAoZG9tYWluKQorICAgIFNPQVBfRlJFRShzb2FwLCBkb21haW4pOworICBpZiAocGF0aCkKKyAgICBTT0FQX0ZSRUUoc29hcCwgcGF0aCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0ZW52X2Nvb2tpZXMoc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgY29uc3QgY2hhciAqczsKKyAgY2hhciBrZXlbNDA5Nl0sIHZhbFs0MDk2XTsgLyogY29va2llIHNpemUgaXMgdXAgdG8gNDA5NiBieXRlcyBbUkZDMjEwOV0gKi8KKyAgaWYgKCEocyA9IGdldGVudigiSFRUUF9DT09LSUUiKSkpCisgICAgcmV0dXJuIFNPQVBfRVJSOworICBkbworICB7IHMgPSBzb2FwX2RlY29kZV9rZXkoa2V5LCBzaXplb2Yoa2V5KSwgcyk7CisgICAgcyA9IHNvYXBfZGVjb2RlX3ZhbCh2YWwsIHNpemVvZih2YWwpLCBzKTsKKyAgICBwID0gc29hcF9zZXRfY29va2llKHNvYXAsIGtleSwgdmFsLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAocCkKKyAgICAgIHAtPmVudiA9IDE7CisgIH0gd2hpbGUgKCpzKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcF9jb29raWUqCitTT0FQX0ZNQUMyCitzb2FwX2NvcHlfY29va2llcyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwLCAqKnEsICpyOworICBxID0gJnI7CisgIGZvciAocCA9IHNvYXAtPmNvb2tpZXM7IHA7IHAgPSBwLT5uZXh0KQorICB7IGlmICghKCpxID0gKHN0cnVjdCBzb2FwX2Nvb2tpZSopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2Nvb2tpZSkpKSkKKyAgICAgIHJldHVybiByOworICAgICoqcSA9ICpwOworICAgIGlmIChwLT5uYW1lKQorICAgIHsgaWYgKCgoKnEpLT5uYW1lID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihwLT5uYW1lKSsxKSkpCisgICAgICAgIHN0cmNweSgoKnEpLT5uYW1lLCBwLT5uYW1lKTsKKyAgICB9CisgICAgaWYgKHAtPnZhbHVlKQorICAgIHsgaWYgKCgoKnEpLT52YWx1ZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4ocC0+dmFsdWUpKzEpKSkKKyAgICAgICAgc3RyY3B5KCgqcSktPnZhbHVlLCBwLT52YWx1ZSk7CisgICAgfQorICAgIGlmIChwLT5kb21haW4pCisgICAgeyBpZiAoKCgqcSktPmRvbWFpbiA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4ocC0+ZG9tYWluKSsxKSkpCisgICAgICAgIHN0cmNweSgoKnEpLT5kb21haW4sIHAtPmRvbWFpbik7CisgICAgfQorICAgIGlmIChwLT5wYXRoKQorICAgIHsgaWYgKCgoKnEpLT5wYXRoID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihwLT5wYXRoKSsxKSkpCisgICAgICAgIHN0cmNweSgoKnEpLT5wYXRoLCBwLT5wYXRoKTsKKyAgICB9CisgICAgcSA9ICYoKnEpLT5uZXh0OworICB9CisgICpxID0gTlVMTDsKKyAgcmV0dXJuIHI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2ZyZWVfY29va2llcyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBmb3IgKHAgPSBzb2FwLT5jb29raWVzOyBwOyBwID0gc29hcC0+Y29va2llcykKKyAgeyBzb2FwLT5jb29raWVzID0gcC0+bmV4dDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgcC0+bmFtZSk7CisgICAgaWYgKHAtPnZhbHVlKQorICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnZhbHVlKTsKKyAgICBpZiAocC0+ZG9tYWluKQorICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPmRvbWFpbik7CisgICAgaWYgKHAtPnBhdGgpCisgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+cGF0aCk7CisgICAgU09BUF9GUkVFKHNvYXAsIHApOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZW5kaWYgLyogV0lUSF9DT09LSUVTICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgV0lUSF9HWklQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc29hcF9nZXRnemlwaGRyKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpbnQgaTsKKyAgc29hcF93Y2hhciBjLCBmID0gMDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHZXQgZ3ppcCBoZWFkZXJcbiIpKTsKKyAgZm9yIChpID0gMDsgaSA8IDk7IGkrKykKKyAgeyBpZiAoKGludCkoYyA9IHNvYXBfZ2V0MShzb2FwKSA9PSBFT0YpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgaWYgKGkgPT0gMikKKyAgICAgIGYgPSBjOworICB9CisgIGlmIChmICYgMHgwNCkgLyogRkVYVFJBICovCisgIHsgZm9yIChpID0gc29hcF9nZXQxKHNvYXApIHwgKHNvYXBfZ2V0MShzb2FwKSA8PCA4KTsgaTsgaS0tKQorICAgICAgaWYgKChpbnQpc29hcF9nZXQxKHNvYXApID09IEVPRikKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIH0KKyAgaWYgKGYgJiAweDA4KSAvKiBGTkFNRSAqLworICAgIGRvCisgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworICAgIHdoaWxlIChjICYmIChpbnQpYyAhPSBFT0YpOworICBpZiAoKGludCljICE9IEVPRiAmJiAoZiAmIDB4MTApKSAvKiBGQ09NTUVOVCAqLworICAgIGRvCisgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworICAgIHdoaWxlIChjICYmIChpbnQpZiAhPSBFT0YpOworICBpZiAoKGludCljICE9IEVPRiAmJiAoZiAmIDB4MDEpKSAvKiBGSENSQyAqLworICB7IGlmICgoaW50KShjID0gc29hcF9nZXQxKHNvYXApKSAhPSBFT0YpCisgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworICB9CisgIGlmICgoaW50KWMgPT0gRU9GKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JlZ2luX3JlY3Yoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXBfd2NoYXIgYzsKKyAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICBzb2FwX2ZyZWUoc29hcCk7CisgIHNvYXBfc2V0X2xvY2FsX25hbWVzcGFjZXMoc29hcCk7CisgIHNvYXAtPnZlcnNpb24gPSAwOwkvKiBkb24ndCBhc3N1bWUgd2UncmUgcGFyc2luZyBTT0FQIGNvbnRlbnQgYnkgZGVmYXVsdCAqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgc29hcF9mcmVlX2lodChzb2FwKTsKKyNlbmRpZgorICBpZiAoKHNvYXAtPmltb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgICBzb2FwLT5vbW9kZSB8PSBTT0FQX0lPX0NIVU5LOworICBzb2FwLT5pbW9kZSAmPSB+U09BUF9JTzsKKyAgc29hcC0+bW9kZSA9IHNvYXAtPmltb2RlOworICBpZiAoIXNvYXAtPmtlZXBfYWxpdmUpCisgIHsgc29hcC0+YnVmbGVuID0gMDsKKyAgICBzb2FwLT5idWZpZHggPSAwOworICB9CisgIGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0tFRVBBTElWRSkpCisgICAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7CisgIHNvYXAtPmFoZWFkID0gMDsKKyAgc29hcC0+cGVla2VkID0gMDsKKyAgc29hcC0+bGV2ZWwgPSAwOworICBzb2FwLT5wYXJ0ID0gU09BUF9CRUdJTjsKKyAgc29hcC0+YWxsb2NlZCA9IDA7CisgIHNvYXAtPmNvdW50ID0gMDsKKyAgc29hcC0+bGVuZ3RoID0gMDsKKyAgc29hcC0+Y2RhdGEgPSAwOworICAqc29hcC0+ZW5kcG9pbnQgPSAnXDAnOworICBzb2FwLT5hY3Rpb24gPSBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzb2FwLT5kb20gPSBOVUxMOworICBzb2FwLT5kaW1lLmNodW5rc2l6ZSA9IDA7CisgIHNvYXAtPmRpbWUuYnVmbGVuID0gMDsKKyAgc29hcC0+ZGltZS5saXN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGlzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmxhc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gTlVMTDsKKyAgc29hcC0+bWltZS5zdGFydCA9IE5VTEw7CisgIHNvYXAtPnhsaXN0ID0gTlVMTDsKKyNlbmRpZgorI2lmZGVmIFdJTjMyCisjaWZuZGVmIFVOREVSX0NFCisjaWZuZGVmIFdJVEhfRkFTVENHSQorICBpZiAoIXNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisjaWZkZWYgX19CT1JMQU5EQ19fCisgICAgc2V0bW9kZSgoU09BUF9TT0NLRVQpc29hcC0+cmVjdmZkLCBPX0JJTkFSWSk7CisjZWxzZQorICAgIF9zZXRtb2RlKChTT0FQX1NPQ0tFVClzb2FwLT5yZWN2ZmQsIF9PX0JJTkFSWSk7CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBXSVRIX1pMSUIKKyAgc29hcC0+bW9kZSAmPSB+U09BUF9FTkNfWkxJQjsKKyAgc29hcC0+emxpYl9pbiA9IFNPQVBfWkxJQl9OT05FOworICBzb2FwLT56bGliX291dCA9IFNPQVBfWkxJQl9OT05FOworICBzb2FwLT5kX3N0cmVhbS5uZXh0X2luID0gWl9OVUxMOworICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbiA9IDA7CisgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gKEJ5dGUqKXNvYXAtPmJ1ZjsKKyAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0ID0gU09BUF9CVUZMRU47CisgIHNvYXAtPnpfcmF0aW9faW4gPSAxLjA7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPmZwcmVwYXJlaW5pdCkKKyAgICBzb2FwLT5mcHJlcGFyZWluaXQoc29hcCk7CisjZW5kaWYKKyAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyNpZmRlZiBXSVRIX0daSVAKKyAgaWYgKGMgPT0gMHgxRikKKyAgeyBpZiAoc29hcF9nZXRnemlwaGRyKHNvYXApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmIChpbmZsYXRlSW5pdDIoJnNvYXAtPmRfc3RyZWFtLCAtTUFYX1dCSVRTKSAhPSBaX09LKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfSU5GTEFURTsKKyAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX1pMSUI7CisgICAgc29hcC0+emxpYl9pbiA9IFNPQVBfWkxJQl9HWklQOworICAgIHNvYXAtPnpfY3JjID0gY3JjMzIoMEwsIE5VTEwsIDApOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZ3ppcCBpbml0aWFsaXplZFxuIikpOworICAgIG1lbWNweShzb2FwLT56X2J1Ziwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTik7CisgICAgLyogc2hvdWxkIG5vdCBjaHVuayBvdmVyIHBsYWluIHRyYW5zcG9ydCwgc28gd2h5IGJvdGhlciB0byBjaGVjaz8gKi8KKyAgICAvKiBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKSAqLworICAgIC8qICAgc29hcC0+el9idWZsZW4gPSBzb2FwLT5idWZpZHg7ICovCisgICAgLyogZWxzZSAqLworICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfaW4gPSAoQnl0ZSopKHNvYXAtPnpfYnVmICsgc29hcC0+YnVmaWR4KTsKKyAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbiA9IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICBzb2FwLT56X2J1ZmxlbiA9IHNvYXAtPmJ1ZmxlbjsKKyAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5idWZpZHg7CisgICAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgfSAgCisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKGMgPT0gJy0nICYmIHNvYXBfZ2V0MChzb2FwKSA9PSAnLScpCisgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19NSU1FOworICBlbHNlIGlmICgoYyAmIDB4RkZGQykgPT0gKFNPQVBfRElNRV9WRVJTSU9OIHwgU09BUF9ESU1FX01CKSAmJiAoc29hcF9nZXQwKHNvYXApICYgMHhGRkYwKSA9PSAweDIwKQorICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfRElNRTsKKyAgZWxzZQorI2VuZGlmCisgIHsgd2hpbGUgKHNvYXBfYmxhbmsoYykpCisgICAgICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICB9CisgIGlmICgoaW50KWMgPT0gRU9GKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworI2lmbmRlZiBXSVRIX05PSFRUUAorICAvKiBpZiBub3QgWE1MIG9yIChzdGFydCBvZilCT00gb3IgTUlNRS9ESU1FL1pMSUIsIGFzc3VtZSBIVFRQIGhlYWRlciAqLworICBpZiAoYyAhPSAnPCcgJiYgYyAhPSAweEVGICYmICEoc29hcC0+bW9kZSAmIChTT0FQX0VOQ19NSU1FIHwgU09BUF9FTkNfRElNRSB8IFNPQVBfRU5DX1pMSUIpKSkKKyAgeyBzb2FwLT5tb2RlICY9IH5TT0FQX0lPOworICAgIHNvYXAtPmVycm9yID0gc29hcC0+ZnBhcnNlKHNvYXApOworICAgIGlmIChzb2FwLT5lcnJvciAmJiBzb2FwLT5lcnJvciA8IFNPQVBfU1RPUCkKKyAgICB7IHNvYXAtPmtlZXBfYWxpdmUgPSAwOyAvKiBmb3JjZSBjbG9zZSBsYXRlciAqLworICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKQorICAgIHsgc29hcC0+Y2h1bmtidWZsZW4gPSBzb2FwLT5idWZsZW47CisgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5idWZpZHg7CisgICAgICBzb2FwLT5jaHVua3NpemUgPSAwOworICAgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgICBlbHNlIGlmIChzb2FwLT5mcHJlcGFyZXJlY3YgJiYgc29hcC0+YnVmbGVuICE9IHNvYXAtPmJ1ZmlkeCkKKyAgICAgIHNvYXAtPmZwcmVwYXJlcmVjdihzb2FwLCBzb2FwLT5idWYgKyBzb2FwLT5idWZpZHgsIHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeCk7CisjZW5kaWYKKyNpZmRlZiBXSVRIX1pMSUIKKyAgICBpZiAoc29hcC0+emxpYl9pbiAhPSBTT0FQX1pMSUJfTk9ORSkKKyAgICB7IC8qIGZwYXJzZSBzaG91bGQgbm90IHVzZSBzb2FwX3VuZ2V0IHRvIHB1c2ggYmFjayBsYXN0IGNoYXIgKi8KKyNpZmRlZiBXSVRIX0daSVAKKyAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICBpZiAoYyA9PSAweDFGKQorICAgICAgeyBpZiAoc29hcF9nZXRnemlwaGRyKHNvYXApKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgaWYgKGluZmxhdGVJbml0Migmc29hcC0+ZF9zdHJlYW0sIC1NQVhfV0JJVFMpICE9IFpfT0spCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgICBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX0lORkxBVEU7CisgICAgICAgIHNvYXAtPnpfY3JjID0gY3JjMzIoMEwsIE5VTEwsIDApOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImd6aXAgaW5pdGlhbGl6ZWRcbiIpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgc29hcF9yZXZnZXQxKHNvYXApOworI2Vsc2UKKyAgICAgIHsKKyNlbmRpZgorICAgICAgICBpZiAoaW5mbGF0ZUluaXQoJnNvYXAtPmRfc3RyZWFtKSAhPSBaX09LKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICAgICAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9JTkZMQVRFOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluZmxhdGUgaW5pdGlhbGl6ZWRcbiIpKTsKKyAgICAgIH0KKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfWkxJQjsKKyAgICAgIG1lbWNweShzb2FwLT56X2J1Ziwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTik7CisgICAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X2luID0gKEJ5dGUqKShzb2FwLT56X2J1ZiArIHNvYXAtPmJ1ZmlkeCk7CisgICAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbiA9IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICAgIHNvYXAtPnpfYnVmbGVuID0gc29hcC0+YnVmbGVuOworICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+YnVmaWR4OworICAgIH0KKyNlbmRpZgorICAgIGlmIChzb2FwLT5lcnJvcikKKyAgICB7IGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX0ZPUk0gJiYgc29hcC0+ZmZvcm0pCisgICAgICB7IHNvYXAtPmVycm9yID0gc29hcC0+ZmZvcm0oc29hcCk7CisgICAgICAgIGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX09LKQorICAgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9TVE9QOyAvKiBwcmV2ZW50cyBmdXJ0aGVyIHByb2Nlc3NpbmcgKi8KKyAgICAgIH0KKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgIH0KKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01JTUUpCisgIHsgaWYgKHNvYXBfZ2V0bWltZWhkcihzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAoc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCBzb2FwLT5taW1lLmZpcnN0LT50eXBlLCAiYXBwbGljYXRpb24vZGltZSIpKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19ESU1FOworICB9CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkKKyAgeyBpZiAoc29hcF9nZXRkaW1laGRyKHNvYXApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmIChzb2FwLT5kaW1lLmZsYWdzICYgU09BUF9ESU1FX0NGKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDaHVua2VkIERJTUUgU09BUCBtZXNzYWdlXG4iKSk7CisgICAgICBzb2FwLT5kaW1lLmNodW5rc2l6ZSA9IHNvYXAtPmRpbWUuc2l6ZTsKKyAgICAgIGlmIChzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHggPj0gc29hcC0+ZGltZS5jaHVua3NpemUpCisgICAgICB7IHNvYXAtPmRpbWUuYnVmbGVuID0gc29hcC0+YnVmbGVuOworICAgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5idWZpZHggKyBzb2FwLT5kaW1lLmNodW5rc2l6ZTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgc29hcC0+ZGltZS5jaHVua3NpemUgLT0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgIH0KKyAgICBzb2FwLT5jb3VudCA9IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgfQorI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAoraHR0cF9wYXJzZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgY2hhciBoZWFkZXJbU09BUF9IRFJMRU5dLCAqczsKKyAgdW5zaWduZWQgc2hvcnQgZ2V0ID0gMCwgc3RhdHVzID0gMCwgayA9IDA7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiV2FpdGluZyBmb3IgSFRUUCByZXF1ZXN0L3Jlc3BvbnNlLi4uXG4iKSk7CisgICpzb2FwLT5lbmRwb2ludCA9ICdcMCc7CisgIHNvYXAtPmxlbmd0aCA9IDA7CisgIHNvYXAtPnVzZXJpZCA9IE5VTEw7CisgIHNvYXAtPnBhc3N3ZCA9IE5VTEw7CisgIHNvYXAtPmFjdGlvbiA9IE5VTEw7CisgIHNvYXAtPmF1dGhyZWFsbSA9IE5VTEw7CisgIGRvCisgIHsgaWYgKHNvYXBfZ2V0bGluZShzb2FwLCBzb2FwLT5tc2didWYsIHNpemVvZihzb2FwLT5tc2didWYpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiSFRUUCBzdGF0dXM6ICVzXG4iLCBzb2FwLT5tc2didWYpKTsKKyAgICBmb3IgKDs7KQorICAgIHsgaWYgKHNvYXBfZ2V0bGluZShzb2FwLCBoZWFkZXIsIFNPQVBfSERSTEVOKSkKKyAgICAgIHsgaWYgKHNvYXAtPmVycm9yID09IFNPQVBfRU9GKQorCXsgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICAgICAgICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJFT0YgaW4gSFRUUCBoZWFkZXIsIGNvbnRpbnVlIGFueXdheVxuIikpOworCSAgYnJlYWs7CisJfQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB9CisgICAgICBpZiAoISpoZWFkZXIpCisgICAgICAgIGJyZWFrOworICAgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkhUVFAgaGVhZGVyOiAlc1xuIiwgaGVhZGVyKSk7CisgICAgICBzID0gc3RyY2hyKGhlYWRlciwgJzonKTsKKyAgICAgIGlmIChzKQorICAgICAgeyAqcyA9ICdcMCc7CisgICAgICAgIGRvIHMrKzsKKyAgICAgICAgd2hpbGUgKCpzICYmICpzIDw9IDMyKTsKKyAgICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZwYXJzZWhkcihzb2FwLCBoZWFkZXIsIHMpKSkKKyAgICAgICAgeyBpZiAoc29hcC0+ZXJyb3IgPCBTT0FQX1NUT1ApCisJICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKwkgIHN0YXR1cyA9IHNvYXAtPmVycm9yOworCSAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmICgocyA9IHN0cmNocihzb2FwLT5tc2didWYsICcgJykpKQorICAgIHsgayA9ICh1bnNpZ25lZCBzaG9ydClzb2FwX3N0cnRvdWwocywgJnMsIDEwKTsKKyAgICAgIGlmICghc29hcF9ibGFuaygqcykpCisgICAgICAgIGsgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgICBrID0gMDsKKyAgfSB3aGlsZSAoayA9PSAxMDApOworICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiRmluaXNoZWQgSFRUUCBoZWFkZXIgcGFyc2luZ1xuIikpOworICBzID0gc3Ryc3RyKHNvYXAtPm1zZ2J1ZiwgIkhUVFAvIik7CisgIGlmIChzICYmIHNbN10gIT0gJzEnKQorICB7IGlmIChzb2FwLT5rZWVwX2FsaXZlID09IDEpCisgICAgICBzb2FwLT5rZWVwX2FsaXZlID0gMDsKKyAgICBpZiAoayA9PSAwICYmIChzb2FwLT5vbW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspIC8qIGsgPT0gMCBmb3IgSFRUUCByZXF1ZXN0ICovCisgICAgeyBzb2FwLT5pbW9kZSB8PSBTT0FQX0lPX0NIVU5LOworICAgICAgc29hcC0+b21vZGUgPSAoc29hcC0+b21vZGUgJiB+U09BUF9JTykgfCBTT0FQX0lPX1NUT1JFOworICAgIH0KKyAgfQorICBpZiAoc29hcC0+a2VlcF9hbGl2ZSA8IDApCisgICAgc29hcC0+a2VlcF9hbGl2ZSA9IDE7CisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJLZWVwIGFsaXZlIGNvbm5lY3Rpb24gPSAlZFxuIiwgc29hcC0+a2VlcF9hbGl2ZSkpOworICBpZiAocyAmJiAoKChnZXQgPSAhc3RybmNtcChzb2FwLT5tc2didWYsICJHRVQgIiwgNCkpKSB8fCAhc3RybmNtcChzb2FwLT5tc2didWYsICJQT1NUICIsIDUpKSkKKyAgeyBzaXplX3QgbSA9IHN0cmxlbihzb2FwLT5lbmRwb2ludCk7CisgICAgc2l6ZV90IG4gPSBtICsgKHMgLSBzb2FwLT5tc2didWYpIC0gNSAtICghZ2V0KTsKKyAgICBpZiAobiA+PSBzaXplb2Yoc29hcC0+ZW5kcG9pbnQpKQorICAgICAgbiA9IHNpemVvZihzb2FwLT5lbmRwb2ludCkgLSAxOworICAgIHN0cm5jcHkoc29hcC0+cGF0aCwgc29hcC0+bXNnYnVmICsgNCArICghZ2V0KSwgbiAtIG0pOworICAgIHNvYXAtPnBhdGhbbiAtIG1dID0gJ1wwJzsKKyAgICBzdHJjYXQoc29hcC0+ZW5kcG9pbnQsIHNvYXAtPnBhdGgpOworICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJUYXJnZXQgZW5kcG9pbnQ9JyVzJ1xuIiwgc29hcC0+ZW5kcG9pbnQpKTsKKyAgICBpZiAoZ2V0KQorICAgIHsgc29hcC0+ZXJyb3IgPSBzb2FwLT5mZ2V0KHNvYXApOworICAgICAgaWYgKHNvYXAtPmVycm9yID09IFNPQVBfT0spCisgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9TVE9QOyAvKiBwcmV2ZW50cyBmdXJ0aGVyIHByb2Nlc3NpbmcgKi8KKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgaWYgKHN0YXR1cykKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IHN0YXR1czsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICBpZiAoayA9PSAwIHx8IChrID49IDIwMCAmJiBrIDw9IDI5OSkgfHwgayA9PSA0MDAgfHwgayA9PSA1MDApCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJIVFRQIGVycm9yICVkXG4iLCBrKSk7CisgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiSFRUUCBlcnJvciIsIHNvYXAtPm1zZ2J1Ziwgayk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK2h0dHBfcGFyc2VfaGVhZGVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbCkKK3sgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiSG9zdCIpKQorICB7IAorI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgIGlmIChzb2FwLT5pbW9kZSAmIFNPQVBfRU5DX1NTTCkKKyAgICAgIHN0cmNweShzb2FwLT5lbmRwb2ludCwgImh0dHBzOi8vIik7CisgICAgZWxzZQorI2VuZGlmCisgICAgICBzdHJjcHkoc29hcC0+ZW5kcG9pbnQsICJodHRwOi8vIik7CisgICAgc3RybmNhdChzb2FwLT5lbmRwb2ludCwgdmFsLCBzaXplb2Yoc29hcC0+ZW5kcG9pbnQpIC0gOCk7CisgICAgc29hcC0+ZW5kcG9pbnRbc2l6ZW9mKHNvYXAtPmVuZHBvaW50KSAtIDFdID0gJ1wwJzsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtVHlwZSIpKQorICB7IGlmIChzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCwgImFwcGxpY2F0aW9uL2RpbWUiKSkKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfRElNRTsKKyAgICBlbHNlIGlmIChzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCwgIm11bHRpcGFydC9yZWxhdGVkIikKKyAgICAgICAgICB8fCBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCwgIm11bHRpcGFydC9mb3JtLWRhdGEiKSkKKyAgICB7IHNvYXAtPm1pbWUuYm91bmRhcnkgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCwgImJvdW5kYXJ5IikpOworICAgICAgc29hcC0+bWltZS5zdGFydCA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAic3RhcnQiKSk7CisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX01JTUU7CisgICAgfQorICB9CisjZW5kaWYKKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LUxlbmd0aCIpKQorICAgIHNvYXAtPmxlbmd0aCA9IHNvYXBfc3RydG91bCh2YWwsIE5VTEwsIDEwKTsKKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LUVuY29kaW5nIikpCisgIHsgaWYgKCFzb2FwX3RhZ19jbXAodmFsLCAiZGVmbGF0ZSIpKQorI2lmZGVmIFdJVEhfWkxJQgorICAgICAgc29hcC0+emxpYl9pbiA9IFNPQVBfWkxJQl9ERUZMQVRFOworI2Vsc2UKKyAgICAgIHJldHVybiBTT0FQX1pMSUJfRVJST1I7CisjZW5kaWYKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHZhbCwgImd6aXAiKSkKKyNpZmRlZiBXSVRIX0daSVAKKyAgICAgIHNvYXAtPnpsaWJfaW4gPSBTT0FQX1pMSUJfR1pJUDsKKyNlbHNlCisgICAgICByZXR1cm4gU09BUF9aTElCX0VSUk9SOworI2VuZGlmCisgIH0KKyNpZmRlZiBXSVRIX1pMSUIKKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJBY2NlcHQtRW5jb2RpbmciKSkKKyAgeworI2lmZGVmIFdJVEhfR1pJUAorICAgIGlmIChzdHJjaHIodmFsLCAnKicpIHx8IHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAiZ3ppcCIpKQorICAgICAgc29hcC0+emxpYl9vdXQgPSBTT0FQX1pMSUJfR1pJUDsKKyAgICBlbHNlCisjZW5kaWYKKyAgICBpZiAoc3RyY2hyKHZhbCwgJyonKSB8fCBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCwgImRlZmxhdGUiKSkKKyAgICAgIHNvYXAtPnpsaWJfb3V0ID0gU09BUF9aTElCX0RFRkxBVEU7CisgICAgZWxzZQorICAgICAgc29hcC0+emxpYl9vdXQgPSBTT0FQX1pMSUJfTk9ORTsKKyAgfQorI2VuZGlmCisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiVHJhbnNmZXItRW5jb2RpbmciKSkKKyAgeyBzb2FwLT5tb2RlICY9IH5TT0FQX0lPOworICAgIGlmICghc29hcF90YWdfY21wKHZhbCwgImNodW5rZWQiKSkKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19DSFVOSzsKKyAgfQorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbm5lY3Rpb24iKSkKKyAgeyBpZiAoIXNvYXBfdGFnX2NtcCh2YWwsICJrZWVwLWFsaXZlIikpCisgICAgICBzb2FwLT5rZWVwX2FsaXZlID0gLXNvYXAtPmtlZXBfYWxpdmU7CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcCh2YWwsICJjbG9zZSIpKQorICAgICAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFOCisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQXV0aG9yaXphdGlvbiIpKQorICB7IGlmICghc29hcF90YWdfY21wKHZhbCwgIkJhc2ljICoiKSkKKyAgICB7IGludCBuOworICAgICAgY2hhciAqczsKKyAgICAgIHNvYXBfYmFzZTY0MnMoc29hcCwgdmFsICsgNiwgc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSAtIDEsICZuKTsKKyAgICAgIHNvYXAtPnRtcGJ1ZltuXSA9ICdcMCc7CisgICAgICBpZiAoKHMgPSBzdHJjaHIoc29hcC0+dG1wYnVmLCAnOicpKSkKKyAgICAgIHsgKnMgPSAnXDAnOworCXNvYXAtPnVzZXJpZCA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPnRtcGJ1Zik7CisJc29hcC0+cGFzc3dkID0gc29hcF9zdHJkdXAoc29hcCwgcyArIDEpOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIldXVy1BdXRoZW50aWNhdGUiKSkKKyAgICBzb2FwLT5hdXRocmVhbG0gPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCArIDYsICJyZWFsbSIpKTsKKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJFeHBlY3QiKSkKKyAgeyBpZiAoIXNvYXBfdGFnX2NtcCh2YWwsICIxMDAtY29udGludWUiKSkKKyAgICB7IGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiSFRUUC8xLjEgMTAwIENvbnRpbnVlIiwgTlVMTCkpCisgICAgICAgfHwgKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgTlVMTCwgTlVMTCkpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICB9CisjZW5kaWYKKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJTT0FQQWN0aW9uIikpCisgIHsgaWYgKCp2YWwgPT0gJyInKQorICAgIHsgc29hcC0+YWN0aW9uID0gc29hcF9zdHJkdXAoc29hcCwgdmFsICsgMSk7CisgICAgICBzb2FwLT5hY3Rpb25bc3RybGVuKHNvYXAtPmFjdGlvbikgLSAxXSA9ICdcMCc7CisgICAgfQorICB9CisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiTG9jYXRpb24iKSkKKyAgeyBzdHJuY3B5KHNvYXAtPmVuZHBvaW50LCB2YWwsIHNpemVvZihzb2FwLT5lbmRwb2ludCkpOworICAgIHNvYXAtPmVuZHBvaW50W3NpemVvZihzb2FwLT5lbmRwb2ludCkgLSAxXSA9ICdcMCc7CisgIH0KKyNpZmRlZiBXSVRIX0NPT0tJRVMKKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb29raWUiKSB8fCAhc29hcF90YWdfY21wKGtleSwgIlNldC1Db29raWUiKSkKKyAgICBzb2FwX2dldGNvb2tpZXMoc29hcCwgdmFsKTsKKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgIWRlZmluZWQoV0lUSF9OT0hUVFApIHx8ICFkZWZpbmVkKFdJVEhfTEVBTkVSKQorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpsaW5lLCBjb25zdCBjaGFyICprZXkpCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnMgPSBsaW5lOworICBpZiAocykKKyAgeyB3aGlsZSAoKnMpCisgICAgeyByZWdpc3RlciBzaG9ydCBmbGFnOworICAgICAgcyA9IHNvYXBfZGVjb2RlX2tleShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCBzKTsKKyAgICAgIGZsYWcgPSBzb2FwX3RhZ19jbXAoc29hcC0+dG1wYnVmLCBrZXkpOworICAgICAgcyA9IHNvYXBfZGVjb2RlX3ZhbChzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCBzKTsKKyAgICAgIGlmICghZmxhZykKKyAgICAgICAgcmV0dXJuIHNvYXAtPnRtcGJ1ZjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmICFkZWZpbmVkKFdJVEhfTk9IVFRQKSB8fCAhZGVmaW5lZChXSVRIX0xFQU5FUikKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9kZWNvZGVfa2V5KGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwgY29uc3QgY2hhciAqdmFsKQoreyByZXR1cm4gc29hcF9kZWNvZGUoYnVmLCBsZW4sIHZhbCwgIj0sOyIpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAhZGVmaW5lZChXSVRIX05PSFRUUCkgfHwgIWRlZmluZWQoV0lUSF9MRUFORVIpCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZGVjb2RlX3ZhbChjaGFyICpidWYsIHNpemVfdCBsZW4sIGNvbnN0IGNoYXIgKnZhbCkKK3sgaWYgKCp2YWwgIT0gJz0nKQorICB7ICpidWYgPSAnXDAnOworICAgIHJldHVybiB2YWw7CisgIH0KKyAgcmV0dXJuIHNvYXBfZGVjb2RlKGJ1ZiwgbGVuLCB2YWwgKyAxLCAiLDsiKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgIWRlZmluZWQoV0lUSF9OT0hUVFApIHx8ICFkZWZpbmVkKFdJVEhfTEVBTkVSKQorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBjb25zdCBjaGFyKgorc29hcF9kZWNvZGUoY2hhciAqYnVmLCBzaXplX3QgbGVuLCBjb25zdCBjaGFyICp2YWwsIGNvbnN0IGNoYXIgKnNlcCkKK3sgY29uc3QgY2hhciAqczsKKyAgY2hhciAqdCA9IGJ1ZjsKKyAgZm9yIChzID0gdmFsOyAqczsgcysrKQorICAgIGlmICgqcyAhPSAnICcgJiYgKnMgIT0gJ1x0JyAmJiAhc3RyY2hyKHNlcCwgKnMpKQorICAgICAgYnJlYWs7CisgIGlmICgqcyA9PSAnIicpCisgIHsgcysrOworICAgIHdoaWxlICgqcyAmJiAqcyAhPSAnIicgJiYgLS1sZW4pCisgICAgICAqdCsrID0gKnMrKzsKKyAgfQorICBlbHNlCisgIHsgd2hpbGUgKHNvYXBfbm90YmxhbmsoKnMpICYmICFzdHJjaHIoc2VwLCAqcykgJiYgLS1sZW4pCisgICAgeyBpZiAoKnMgPT0gJyUnKQorICAgICAgeyAqdCsrID0gKChzWzFdID49ICdBJyA/IChzWzFdICYgMHg3KSArIDkgOiBzWzFdIC0gJzAnKSA8PCA0KQorICAgICAgICAgICAgICArIChzWzJdID49ICdBJyA/IChzWzJdICYgMHg3KSArIDkgOiBzWzJdIC0gJzAnKTsKKyAgICAgICAgcyArPSAzOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICAqdCsrID0gKnMrKzsKKyAgICB9CisgIH0KKyAgKnQgPSAnXDAnOworICB3aGlsZSAoKnMgJiYgIXN0cmNocihzZXAsICpzKSkKKyAgICBzKys7CisgIHJldHVybiBzOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW52ZWxvcGVfYmVnaW5fb3V0KHN0cnVjdCBzb2FwICpzb2FwKQoreworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzaXplX3QgbiA9IDA7CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01JTUUpICYmIHNvYXAtPm1pbWUuYm91bmRhcnkgJiYgc29hcC0+bWltZS5zdGFydCkKKyAgeyBjb25zdCBjaGFyICpzOworICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpICYmICEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pKQorICAgICAgcyA9ICJhcHBsaWNhdGlvbi9kaW1lIjsKKyAgICBlbHNlIGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgICAgICBzID0gImFwcGxpY2F0aW9uL3NvYXAreG1sOyBjaGFyc2V0PXV0Zi04IjsKKyAgICBlbHNlCisgICAgICBzID0gInRleHQveG1sOyBjaGFyc2V0PXV0Zi04IjsKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIi0tJXNcclxuQ29udGVudC1UeXBlOiAlc1xyXG5Db250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiaW5hcnlcclxuQ29udGVudC1JRDogJXNcclxuXHJcbiIsIHNvYXAtPm1pbWUuYm91bmRhcnksIHMsIHNvYXAtPm1pbWUuc3RhcnQpOworICAgIG4gPSBzdHJsZW4oc29hcC0+dG1wYnVmKTsKKyAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzb2FwLT50bXBidWYsIG4pKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgc29hcC0+ZGltZS5zaXplID0gc29hcC0+Y291bnQ7CS8qIERJTUUgaW4gTUlNRSBjb3JyZWN0aW9uICovCisgIGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSkKKyAgeyBpZiAoc29hcF9wdXRkaW1laGRyKHNvYXApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisjZW5kaWYKKyAgc29hcC0+cGFydCA9IFNPQVBfSU5fRU5WRUxPUEU7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsICJTT0FQLUVOVjpFbnZlbG9wZSIsIDAsIE5VTEwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VudmVsb3BlX2VuZF9vdXQoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCAiU09BUC1FTlY6RW52ZWxvcGUiKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpICYmICEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pKQorICB7IHNvYXAtPmRpbWUuc2l6ZSA9IHNvYXAtPmNvdW50IC0gc29hcC0+ZGltZS5zaXplOwkvKiBESU1FIGluIE1JTUUgY29ycmVjdGlvbiAqLworICAgIHNwcmludGYoc29hcC0+aWQsIHNvYXAtPmRpbWVfaWRfZm9ybWF0LCAwKTsKKyAgICBzb2FwLT5kaW1lLmlkID0gc29hcC0+aWQ7CisgICAgaWYgKHNvYXAtPmxvY2FsX25hbWVzcGFjZXMpCisgICAgeyBpZiAoc29hcC0+bG9jYWxfbmFtZXNwYWNlc1swXS5vdXQpCisgICAgICAgIHNvYXAtPmRpbWUudHlwZSA9IChjaGFyKilzb2FwLT5sb2NhbF9uYW1lc3BhY2VzWzBdLm91dDsKKyAgICAgIGVsc2UKKyAgICAgICAgc29hcC0+ZGltZS50eXBlID0gKGNoYXIqKXNvYXAtPmxvY2FsX25hbWVzcGFjZXNbMF0ubnM7CisgICAgfQorICAgIHNvYXAtPmRpbWUub3B0aW9ucyA9IE5VTEw7CisgICAgc29hcC0+ZGltZS5mbGFncyA9IFNPQVBfRElNRV9NQiB8IFNPQVBfRElNRV9BQlNVUkk7CisgICAgaWYgKCFzb2FwLT5kaW1lLmZpcnN0KQorICAgICAgc29hcC0+ZGltZS5mbGFncyB8PSBTT0FQX0RJTUVfTUU7CisgICAgc29hcC0+Y291bnQgKz0gMTIgKyAoKHN0cmxlbihzb2FwLT5kaW1lLmlkKSszKSYofjMpKSArICgoc3RybGVuKHNvYXAtPmRpbWUudHlwZSkrMykmKH4zKSk7CisgIH0KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkgJiYgIShzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkpCisgICAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgU09BUF9TVFJfUEFERElORywgLShsb25nKXNvYXAtPmRpbWUuc2l6ZSYzKTsKKyNlbmRpZgorICBzb2FwLT5wYXJ0ID0gU09BUF9FTkRfRU5WRUxPUEU7CisgIHJldHVybiBTT0FQX09LOworfSAKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbnZlbG9wZV9iZWdpbl9pbihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc3RydWN0IE5hbWVzcGFjZSAqcDsKKyAgc29hcC0+cGFydCA9IFNPQVBfSU5fRU5WRUxPUEU7CisgIGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgIlNPQVAtRU5WOkVudmVsb3BlIiwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9WRVJTSU9OTUlTTUFUQ0g7CisgIHAgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzOworICBpZiAocCkKKyAgeyBjb25zdCBjaGFyICpucyA9IHBbMF0ub3V0OworICAgIGlmICghbnMpCisgICAgICBucyA9IHBbMF0ubnM7CisgICAgaWYgKCFzdHJjbXAobnMsIHNvYXBfZW52MSkpCisgICAgeyBzb2FwLT52ZXJzaW9uID0gMTsgLyogbWFrZSBzdXJlIHdlIHVzZSBTT0FQIDEuMSAqLworICAgICAgaWYgKHBbMV0ub3V0KQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcFsxXS5vdXQpOworICAgICAgaWYgKChwWzFdLm91dCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc29hcF9lbmMxKSkpKQorICAgICAgICBzdHJjcHkocFsxXS5vdXQsIHNvYXBfZW5jMSk7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAobnMsIHNvYXBfZW52MikpCisgICAgeyBzb2FwLT52ZXJzaW9uID0gMjsgLyogbWFrZSBzdXJlIHdlIHVzZSBTT0FQIDEuMiAqLworICAgICAgaWYgKHBbMV0ub3V0KQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcFsxXS5vdXQpOworICAgICAgaWYgKChwWzFdLm91dCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc29hcF9lbmMyKSkpKQorICAgICAgICBzdHJjcHkocFsxXS5vdXQsIHNvYXBfZW5jMik7CisgICAgfQorICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VudmVsb3BlX2VuZF9pbihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+cGFydCA9IFNPQVBfRU5EX0VOVkVMT1BFOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCAiU09BUC1FTlY6RW52ZWxvcGUiKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9ib2R5X2JlZ2luX291dChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+cGFydCA9IFNPQVBfSU5fQk9EWTsKKyAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMSkKKyAgICBzb2FwLT5lbmNvZGluZyA9IDE7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TRUMpICYmIHNvYXBfc2V0X2F0dHIoc29hcCwgIndzdTpJZCIsICJCb2R5IikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2VuZGlmCisgIGlmIChzb2FwX2VsZW1lbnQoc29hcCwgIlNPQVAtRU5WOkJvZHkiLCAwLCBOVUxMKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzb2FwLCBOVUxMKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9ib2R5X2VuZF9vdXQoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCAiU09BUC1FTlY6Qm9keSIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgc29hcC0+cGFydCA9IFNPQVBfRU5EX0JPRFk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JvZHlfYmVnaW5faW4oc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPnBhcnQgPSBTT0FQX0lOX0JPRFk7CisgIGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgIlNPQVAtRU5WOkJvZHkiLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmICghc29hcC0+Ym9keSkKKyAgICBzb2FwLT5wYXJ0ID0gU09BUF9OT19CT0RZOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9ib2R5X2VuZF9pbihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXAtPnBhcnQgPT0gU09BUF9OT19CT0RZKQorICAgIHJldHVybiBTT0FQX09LOworICBzb2FwLT5wYXJ0ID0gU09BUF9FTkRfQk9EWTsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgIlNPQVAtRU5WOkJvZHkiKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWN2X2hlYWRlcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXBfZ2V0aGVhZGVyKHNvYXApICYmIHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfZW5kcG9pbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmVuZHBvaW50KQoreyByZWdpc3RlciBjb25zdCBjaGFyICpzOworICByZWdpc3RlciBzaXplX3QgaSwgbjsKKyAgc29hcC0+ZW5kcG9pbnRbMF0gPSAnXDAnOworICBzb2FwLT5ob3N0WzBdID0gJ1wwJzsKKyAgc29hcC0+cGF0aFswXSA9ICcvJzsKKyAgc29hcC0+cGF0aFsxXSA9ICdcMCc7CisgIHNvYXAtPnBvcnQgPSA4MDsKKyAgaWYgKCFlbmRwb2ludCB8fCAhKmVuZHBvaW50KQorICAgIHJldHVybjsKKyAgaWYgKCFzdHJuY21wKGVuZHBvaW50LCAiaHR0cHM6IiwgNikpCisgICAgc29hcC0+cG9ydCA9IDQ0MzsKKyAgc3RybmNweShzb2FwLT5lbmRwb2ludCwgZW5kcG9pbnQsIHNpemVvZihzb2FwLT5lbmRwb2ludCkgLSAxKTsKKyAgcyA9IHN0cmNocihlbmRwb2ludCwgJzonKTsKKyAgaWYgKHMgJiYgc1sxXSA9PSAnLycgJiYgc1syXSA9PSAnLycpCisgICAgcyArPSAzOworICBlbHNlCisgICAgcyA9IGVuZHBvaW50OworICBuID0gc3RybGVuKHMpOworICBpZiAobiA+PSBzaXplb2Yoc29hcC0+aG9zdCkpCisgICAgbiA9IHNpemVvZihzb2FwLT5ob3N0KSAtIDE7CisjaWZkZWYgV0lUSF9JUFY2CisgIGlmIChzWzBdID09ICdbJykKKyAgeyBzKys7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICB7IHNvYXAtPmhvc3RbaV0gPSBzW2ldOworICAgICAgaWYgKHNbaV0gPT0gJ10nKQorICAgICAgeyBzKys7CisgICAgICAgIGJyZWFrOyAKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZQorICB7IGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgeyBzb2FwLT5ob3N0W2ldID0gc1tpXTsKKyAgICAgIGlmIChzW2ldID09ICcvJyB8fCBzW2ldID09ICc6JykKKyAgICAgICAgYnJlYWs7IAorICAgIH0KKyAgfQorI2Vsc2UKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgeyBzb2FwLT5ob3N0W2ldID0gc1tpXTsKKyAgICBpZiAoc1tpXSA9PSAnLycgfHwgc1tpXSA9PSAnOicpCisgICAgICBicmVhazsgCisgIH0KKyNlbmRpZgorICBzb2FwLT5ob3N0W2ldID0gJ1wwJzsKKyAgaWYgKHNbaV0gPT0gJzonKQorICB7IHNvYXAtPnBvcnQgPSAoaW50KWF0b2wocyArIGkgKyAxKTsKKyAgICBmb3IgKGkrKzsgaSA8IG47IGkrKykKKyAgICAgIGlmIChzW2ldID09ICcvJykKKyAgICAgICAgYnJlYWs7CisgIH0KKyAgaWYgKHNbaV0pCisgIHsgc3RybmNweShzb2FwLT5wYXRoLCBzICsgaSwgc2l6ZW9mKHNvYXAtPnBhdGgpKTsKKyAgICBzb2FwLT5wYXRoW3NpemVvZihzb2FwLT5wYXRoKSAtIDFdID0gJ1wwJzsKKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2Nvbm5lY3Qoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjb25zdCBjaGFyICphY3Rpb24pCit7IHJldHVybiBzb2FwX2Nvbm5lY3RfY29tbWFuZChzb2FwLCBTT0FQX1BPU1QsIGVuZHBvaW50LCBhY3Rpb24pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2Nvbm5lY3RfY29tbWFuZChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGh0dHBfY29tbWFuZCwgY29uc3QgY2hhciAqZW5kcG9pbnQsIGNvbnN0IGNoYXIgKmFjdGlvbikKK3sgY2hhciBob3N0W3NpemVvZihzb2FwLT5ob3N0KV07CisgIGludCBwb3J0OworICBzaXplX3QgY291bnQ7CisgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgc3RyY3B5KGhvc3QsIHNvYXAtPmhvc3QpOyAvKiBzYXZlIHRvIGNvbXBhcmUgKi8KKyAgcG9ydCA9IHNvYXAtPnBvcnQ7IC8qIHNhdmUgdG8gY29tcGFyZSAqLworICBzb2FwX3NldF9lbmRwb2ludChzb2FwLCBlbmRwb2ludCk7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5mY29ubmVjdCkKKyAgeyBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZmNvbm5lY3Qoc29hcCwgZW5kcG9pbnQsIHNvYXAtPmhvc3QsIHNvYXAtPnBvcnQpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBlbHNlCisjZW5kaWYKKyAgaWYgKHNvYXAtPmZvcGVuICYmICpzb2FwLT5ob3N0KQorICB7IHNvYXAtPnN0YXR1cyA9IGh0dHBfY29tbWFuZDsKKyAgICBpZiAoIXNvYXAtPmtlZXBfYWxpdmUgfHwgIXNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkgfHwgc3RyY21wKHNvYXAtPmhvc3QsIGhvc3QpIHx8IHNvYXAtPnBvcnQgIT0gcG9ydCB8fCAhc29hcC0+ZnBvbGwgfHwgc29hcC0+ZnBvbGwoc29hcCkpCisgICAgeyBzb2FwLT5rZWVwX2FsaXZlID0gMDsgLyogdG8gZm9yY2UgY2xvc2UgKi8KKyAgICAgIHNvYXAtPm9tb2RlICY9IH5TT0FQX0lPX1VEUDsgLyogdG8gZm9yY2UgY2xvc2UgKi8KKyAgICAgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvbm5lY3QvcmVjb25uZWN0IHRvIGhvc3Q9JyVzJyBwYXRoPSclcycgcG9ydD0lZFxuIiwgc29hcC0+aG9zdCwgc29hcC0+cGF0aCwgc29hcC0+cG9ydCkpOworI2lmZGVmIFdJVEhfVURQCisgICAgICBpZiAoIXN0cm5jbXAoZW5kcG9pbnQsICJzb2FwLnVkcDoiLCA5KSkKKyAgICAgICAgc29hcC0+b21vZGUgfD0gU09BUF9JT19VRFA7CisjZW5kaWYKKyAgICAgIHNvYXAtPnNvY2tldCA9IHNvYXAtPmZvcGVuKHNvYXAsIGVuZHBvaW50LCBzb2FwLT5ob3N0LCBzb2FwLT5wb3J0KTsKKyAgICAgIGlmIChzb2FwLT5lcnJvcikKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgc29hcC0+a2VlcF9hbGl2ZSA9ICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX0tFRVBBTElWRSkgIT0gMCk7CisgICAgfQorICB9CisgIGNvdW50ID0gc29hcF9jb3VudF9hdHRhY2htZW50cyhzb2FwKTsKKyAgaWYgKHNvYXBfYmVnaW5fc2VuZChzb2FwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjaWZuZGVmIFdJVEhfTk9IVFRQCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pICE9IFNPQVBfSU9fU1RPUkUgJiYgIShzb2FwLT5tb2RlICYgU09BUF9FTkNfWE1MKSAmJiBlbmRwb2ludCkKKyAgeyB1bnNpZ25lZCBpbnQgayA9IHNvYXAtPm1vZGU7CisgICAgc29hcC0+bW9kZSAmPSB+KFNPQVBfSU8gfCBTT0FQX0VOQ19aTElCKTsKKyAgICBpZiAoKGsgJiBTT0FQX0lPKSAhPSBTT0FQX0lPX0ZMVVNIKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX0JVRkZFUjsKKyAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3Qoc29hcCwgZW5kcG9pbnQsIHNvYXAtPmhvc3QsIHNvYXAtPnBvcnQsIHNvYXAtPnBhdGgsIGFjdGlvbiwgY291bnQpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgICBpZiAoKGsgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKQorICAgIHsgaWYgKHNvYXBfZmx1c2goc29hcCkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisjZW5kaWYKKyAgICBzb2FwLT5tb2RlID0gazsKKyAgfQorICBlbHNlIGlmIChhY3Rpb24pCisgICAgc29hcC0+YWN0aW9uID0gc29hcF9zdHJkdXAoc29hcCwgYWN0aW9uKTsKKyAgaWYgKGh0dHBfY29tbWFuZCAhPSBTT0FQX1BPU1QpCisgICAgcmV0dXJuIHNvYXBfZW5kX3NlbmQoc29hcCk7CisjZW5kaWYKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjaGFyKgorU09BUF9GTUFDMgorc29hcF9zMmJhc2U2NChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgdW5zaWduZWQgY2hhciAqcywgY2hhciAqdCwgaW50IG4pCit7IHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIG07CisgIHJlZ2lzdGVyIGNoYXIgKnA7CisgIGlmICghdCkKKyAgICB0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIChuICsgMikgLyAzICogNCArIDEpOworICBpZiAoIXQpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwID0gdDsKKyAgdFswXSA9ICdcMCc7CisgIGlmICghcykKKyAgICByZXR1cm4gcDsKKyAgZm9yICg7IG4gPiAyOyBuIC09IDMsIHMgKz0gMykKKyAgeyBtID0gc1swXTsKKyAgICBtID0gKG0gPDwgOCkgfCBzWzFdOworICAgIG0gPSAobSA8PCA4KSB8IHNbMl07CisgICAgZm9yIChpID0gNDsgaSA+IDA7IG0gPj49IDYpCisgICAgICB0Wy0taV0gPSBzb2FwX2Jhc2U2NG9bbSAmIDB4M0ZdOworICAgIHQgKz0gNDsKKyAgfQorICB0WzBdID0gJ1wwJzsKKyAgaWYgKG4gPiAwKQorICB7IG0gPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICBtID0gKG0gPDwgOCkgfCAqcysrOworICAgIGZvciAoOyBpIDwgMzsgaSsrKQorICAgICAgbSA8PD0gODsKKyAgICBmb3IgKGkrKzsgaSA+IDA7IG0gPj49IDYpCisgICAgICB0Wy0taV0gPSBzb2FwX2Jhc2U2NG9bbSAmIDB4M0ZdOworICAgIGZvciAoaSA9IDM7IGkgPiBuOyBpLS0pCisgICAgICB0W2ldID0gJz0nOworICAgIHRbNF0gPSAnXDAnOworICB9CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfYmFzZTY0MnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGNoYXIgKnQsIHNpemVfdCBsLCBpbnQgKm4pCit7IHJlZ2lzdGVyIGludCBpLCBqLCBjOworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIG07CisgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnA7CisgIGlmICghcyB8fCAhKnMpCisgIHsgaWYgKG4pCisgICAgICAqbiA9IDA7CisgICAgaWYgKHNvYXAtPmVycm9yKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFNPQVBfTk9OX05VTEw7CisgIH0KKyAgaWYgKCF0KQorICB7IGwgPSAoc3RybGVuKHMpICsgMykgLyA0ICogMzsKKyAgICB0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIGwpOworICB9CisgIGlmICghdCkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHJldHVybiBOVUxMOworICB9CisgIHAgPSB0OworICBpZiAobikKKyAgICAqbiA9IDA7CisgIGZvciAoOzspCisgIHsgZm9yIChpID0gMDsgaSA8IFNPQVBfQkxLTEVOOyBpKyspCisgICAgeyBtID0gMDsKKyAgICAgIGogPSAwOworICAgICAgd2hpbGUgKGogPCA0KQorICAgICAgeyBjID0gKnMrKzsKKyAgICAgICAgaWYgKGMgPT0gJz0nIHx8ICFjKQorICAgICAgICB7IGkgKj0gMzsKKyAgICAgICAgICBzd2l0Y2ggKGopCisgICAgICAgICAgeyBjYXNlIDI6CisgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoKG0gPj4gNCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgobSA+PiAxMCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgobSA+PiAyKSAmIDB4RkYpOworICAgICAgICAgICAgICBpICs9IDI7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChuKQorCSAgICAqbiArPSBpOworICAgICAgICAgIHJldHVybiBwOworICAgICAgICB9CisgICAgICAgIGMgLT0gJysnOworICAgICAgICBpZiAoYyA+PSAwICYmIGMgPD0gNzkpCisgICAgICAgIHsgbSA9IChtIDw8IDYpICsgc29hcF9iYXNlNjRpW2NdOworICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgKnQrKyA9IChjaGFyKSgobSA+PiAxNikgJiAweEZGKTsKKyAgICAgICp0KysgPSAoY2hhcikoKG0gPj4gOCkgJiAweEZGKTsKKyAgICAgICp0KysgPSAoY2hhcikobSAmIDB4RkYpOworICAgICAgaWYgKGwgPCAzKQorICAgICAgeyBpZiAobikKKwkgICpuICs9IGk7CisgICAgICAgIHJldHVybiBwOworICAgICAgfQorICAgICAgbCAtPSAzOworICAgIH0KKyAgICBpZiAobikKKyAgICAgICpuICs9IDMgKiBTT0FQX0JMS0xFTjsKKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfczJoZXgoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMsIGNoYXIgKnQsIGludCBuKQoreyByZWdpc3RlciBjaGFyICpwOworICBpZiAoIXQpCisgICAgdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCAyICogbiArIDEpOworICBpZiAoIXQpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwID0gdDsKKyAgdFswXSA9ICdcMCc7CisgIGlmIChzKQorICB7IGZvciAoOyBuID4gMDsgbi0tKQorICAgIHsgcmVnaXN0ZXIgaW50IG0gPSAqcysrOworICAgICAgKnQrKyA9IChjaGFyKSgobSA+PiA0KSArIChtID4gMTU5ID8gJ2EnIC0gMTAgOiAnMCcpKTsKKyAgICAgIG0gJj0gMHgwRjsKKyAgICAgICp0KysgPSAoY2hhcikobSArIChtID4gOSA/ICdhJyAtIDEwIDogJzAnKSk7CisgICAgfQorICB9CisgICp0KysgPSAnXDAnOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2hleDJzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBjaGFyICp0LCBzaXplX3QgbCwgaW50ICpuKQoreyByZWdpc3RlciBjb25zdCBjaGFyICpwOworICBpZiAoIXMgfHwgISpzKQorICB7IGlmIChuKQorICAgICAgKm4gPSAwOworICAgIGlmIChzb2FwLT5lcnJvcikKKyAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBTT0FQX05PTl9OVUxMOworICB9CisgIGlmICghdCkKKyAgeyBsID0gc3RybGVuKHMpIC8gMjsKKyAgICB0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIGwpOworICB9CisgIGlmICghdCkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHJldHVybiBOVUxMOworICB9CisgIHAgPSB0OworICB3aGlsZSAobCkKKyAgeyByZWdpc3RlciBpbnQgZDEsIGQyOworICAgIGQxID0gKnMrKzsKKyAgICBpZiAoIWQxKQorICAgICAgYnJlYWs7CisgICAgZDIgPSAqcysrOworICAgIGlmICghZDIpCisgICAgICBicmVhazsKKyAgICAqdCsrID0gKChkMSA+PSAnQScgPyAoZDEgJiAweDcpICsgOSA6IGQxIC0gJzAnKSA8PCA0KSArIChkMiA+PSAnQScgPyAoZDIgJiAweDcpICsgOSA6IGQyIC0gJzAnKTsKKyAgICBsLS07CisgIH0KKyAgaWYgKG4pCisgICAgKm4gPSB0IC0gcDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0aHR0cGhkcihzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0YXR1cywgc2l6ZV90IGNvdW50KQoreyByZWdpc3RlciBjb25zdCBjaGFyICpzID0gTlVMTDsKKyAgcmVnaXN0ZXIgaW50IGVyciA9IFNPQVBfT0s7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnIgPSBOVUxMOworI2VuZGlmCisgIGlmIChzdGF0dXMgPT0gU09BUF9GSUxFICYmIHNvYXAtPmh0dHBfY29udGVudCkKKyAgICBzID0gc29hcC0+aHR0cF9jb250ZW50OworICBlbHNlIGlmIChzdGF0dXMgPT0gU09BUF9IVE1MKQorICAgIHMgPSAidGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IjsKKyAgZWxzZSBpZiAoY291bnQgfHwgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykpCisgIHsgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgICAgIHMgPSAiYXBwbGljYXRpb24vc29hcCt4bWw7IGNoYXJzZXQ9dXRmLTgiOworICAgIGVsc2UKKyAgICAgIHMgPSAidGV4dC94bWw7IGNoYXJzZXQ9dXRmLTgiOworICB9CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5tb2RlICYgKFNPQVBfRU5DX0RJTUUgfCBTT0FQX0VOQ19NVE9NKSkKKyAgeyBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pCisgICAgeyByID0gczsKKyAgICAgIHMgPSAiYXBwbGljYXRpb24veG9wK3htbDsgY2hhcnNldD11dGYtOCI7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHMgPSAiYXBwbGljYXRpb24vZGltZSI7CisgIH0KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkgJiYgc29hcC0+bWltZS5ib3VuZGFyeSAmJiBzb2FwLT5zdGF0dXMgIT0gU09BUF9HRVQpCisgIHsgcmVnaXN0ZXIgY29uc3QgY2hhciAqdCA9IHN0cmNocihzLCAnOycpOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAibXVsdGlwYXJ0L3JlbGF0ZWQ7IGJvdW5kYXJ5PVwiJXNcIjsgdHlwZT1cIiIsIHNvYXAtPm1pbWUuYm91bmRhcnkpOworICAgIGlmICh0KQorICAgICAgc3RybmNhdChzb2FwLT50bXBidWYsIHMsIHQgLSBzKTsKKyAgICBlbHNlCisgICAgICBzdHJjYXQoc29hcC0+dG1wYnVmLCBzKTsKKyAgICBpZiAoc29hcC0+bWltZS5zdGFydCkKKyAgICB7IHN0cmNhdChzb2FwLT50bXBidWYsICJcIjsgc3RhcnQ9XCIiKTsKKyAgICAgIHN0cmNhdChzb2FwLT50bXBidWYsIHNvYXAtPm1pbWUuc3RhcnQpOworICAgIH0KKyAgICBzdHJjYXQoc29hcC0+dG1wYnVmLCAiXCIiKTsKKyAgICBpZiAocikKKyAgICB7IHN0cmNhdChzb2FwLT50bXBidWYsICI7IHN0YXJ0LWluZm89XCIiKTsKKyAgICAgIHN0cmNhdChzb2FwLT50bXBidWYsIHIpOworICAgICAgc3RyY2F0KHNvYXAtPnRtcGJ1ZiwgIlwiIik7CisgICAgfQorICAgIHMgPSBzb2FwLT50bXBidWY7CisgIH0KKyNlbmRpZgorICBpZiAocyAmJiAoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkNvbnRlbnQtVHlwZSIsIHMpKSkKKyAgICByZXR1cm4gZXJyOworI2lmZGVmIFdJVEhfWkxJQgorICBpZiAoc29hcC0+b21vZGUgJiBTT0FQX0VOQ19aTElCKQorICB7CisjaWZkZWYgV0lUSF9HWklQCisgICAgZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkNvbnRlbnQtRW5jb2RpbmciLCAiZ3ppcCIpOworI2Vsc2UKKyAgICBlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQ29udGVudC1FbmNvZGluZyIsICJkZWZsYXRlIik7CisjZW5kaWYKKyAgICBpZiAoZXJyKQorICAgICAgcmV0dXJuIGVycjsKKyAgfQorI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKQorICAgIGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJUcmFuc2Zlci1FbmNvZGluZyIsICJjaHVua2VkIik7CisgIGVsc2UKKyNlbmRpZgorICBpZiAoc29hcC0+c3RhdHVzICE9IFNPQVBfR0VUKQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiJWx1IiwgKHVuc2lnbmVkIGxvbmcpY291bnQpOworICAgIGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJDb250ZW50LUxlbmd0aCIsIHNvYXAtPnRtcGJ1Zik7CisgIH0KKyAgaWYgKGVycikKKyAgICByZXR1cm4gZXJyOworICByZXR1cm4gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkNvbm5lY3Rpb24iLCBzb2FwLT5rZWVwX2FsaXZlID8gImtlZXAtYWxpdmUiIDogImNsb3NlIik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK2h0dHBfZ2V0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZXR1cm4gU09BUF9HRVRfTUVUSE9EOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50CitodHRwX3Bvc3Qoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjb25zdCBjaGFyICpob3N0LCBpbnQgcG9ydCwgY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqYWN0aW9uLCBzaXplX3QgY291bnQpCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnM7CisgIHJlZ2lzdGVyIGludCBlcnI7CisgIGlmIChzb2FwLT5zdGF0dXMgPT0gU09BUF9HRVQpCisgICAgcyA9ICJHRVQiOworICBlbHNlCisgICAgcyA9ICJQT1NUIjsKKyNpZmRlZiBQQUxNCisgIGlmICghZW5kcG9pbnQgfHwgKHN0cm5jbXAoZW5kcG9pbnQsICJodHRwOiIsIDUpICYmIHN0cm5jbXAoZW5kcG9pbnQsICJodHRwczoiLCA2KSAmJiBzdHJuY21wKGVuZHBvaW50LCAiaHR0cGc6IiwgNikpICYmIHN0cm5jbXAoZW5kcG9pbnQsICJfYmVhbToiLCA2KSAmJiBzdHJuY21wKGVuZHBvaW50LCAiX2xvY2FsOiIsIDcpICYmIHN0cm5jbXAoZW5kcG9pbnQsICJfYnRvYmV4OiIsIDgpKQorI2Vsc2UKKyAgaWYgKCFlbmRwb2ludCB8fCAoc3RybmNtcChlbmRwb2ludCwgImh0dHA6IiwgNSkgJiYgc3RybmNtcChlbmRwb2ludCwgImh0dHBzOiIsIDYpICYmIHN0cm5jbXAoZW5kcG9pbnQsICJodHRwZzoiLCA2KSkpCisjZW5kaWYKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgaWYgKHNvYXAtPnByb3h5X2hvc3QgJiYgc3RybmNtcChlbmRwb2ludCwgImh0dHBzOiIsIDYpKQorICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiJXMgJXMgSFRUUC8lcyIsIHMsIGVuZHBvaW50LCBzb2FwLT5odHRwX3ZlcnNpb24pOworICBlbHNlCisgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICIlcyAvJXMgSFRUUC8lcyIsIHMsICgqcGF0aCA9PSAnLycgPyBwYXRoICsgMSA6IHBhdGgpLCBzb2FwLT5odHRwX3ZlcnNpb24pOworICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgTlVMTCkpKQorICAgIHJldHVybiBlcnI7CisgIGlmIChwb3J0ICE9IDgwKQorICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiJXM6JWQiLCBob3N0LCBwb3J0KTsKKyAgZWxzZQorICAgIHN0cmNweShzb2FwLT50bXBidWYsIGhvc3QpOyAKKyAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiSG9zdCIsIHNvYXAtPnRtcGJ1ZikpCisgICB8fCAoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlVzZXItQWdlbnQiLCAiZ1NPQVAvMi43IikpCisgICB8fCAoZXJyID0gc29hcF9wdXRodHRwaGRyKHNvYXAsIFNPQVBfT0ssIGNvdW50KSkpCisgICAgcmV0dXJuIGVycjsKKyNpZmRlZiBXSVRIX1pMSUIKKyNpZmRlZiBXSVRIX0daSVAKKyAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQWNjZXB0LUVuY29kaW5nIiwgImd6aXAsIGRlZmxhdGUiKSkpCisjZWxzZQorICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJBY2NlcHQtRW5jb2RpbmciLCAiZGVmbGF0ZSIpKSkKKyNlbmRpZgorICAgIHJldHVybiBlcnI7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT51c2VyaWQgJiYgc29hcC0+cGFzc3dkICYmIHN0cmxlbihzb2FwLT51c2VyaWQpICsgc3RybGVuKHNvYXAtPnBhc3N3ZCkgPCA3NjEpCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYgKyAyNjIsICIlczolcyIsIHNvYXAtPnVzZXJpZCwgc29hcC0+cGFzc3dkKTsKKyAgICBzdHJjcHkoc29hcC0+dG1wYnVmLCAiQmFzaWMgIik7CisgICAgc29hcF9zMmJhc2U2NChzb2FwLCAoY29uc3QgdW5zaWduZWQgY2hhciopKHNvYXAtPnRtcGJ1ZiArIDI2MiksIHNvYXAtPnRtcGJ1ZiArIDYsIHN0cmxlbihzb2FwLT50bXBidWYgKyAyNjIpKTsKKyAgICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJBdXRob3JpemF0aW9uIiwgc29hcC0+dG1wYnVmKSkpCisgICAgICByZXR1cm4gZXJyOworICB9CisgIGlmIChzb2FwLT5wcm94eV91c2VyaWQgJiYgc29hcC0+cHJveHlfcGFzc3dkICYmIHN0cmxlbihzb2FwLT5wcm94eV91c2VyaWQpICsgc3RybGVuKHNvYXAtPnByb3h5X3Bhc3N3ZCkgPCA3NjEpCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYgKyAyNjIsICIlczolcyIsIHNvYXAtPnByb3h5X3VzZXJpZCwgc29hcC0+cHJveHlfcGFzc3dkKTsKKyAgICBzdHJjcHkoc29hcC0+dG1wYnVmLCAiQmFzaWMgIik7CisgICAgc29hcF9zMmJhc2U2NChzb2FwLCAoY29uc3QgdW5zaWduZWQgY2hhciopKHNvYXAtPnRtcGJ1ZiArIDI2MiksIHNvYXAtPnRtcGJ1ZiArIDYsIHN0cmxlbihzb2FwLT50bXBidWYgKyAyNjIpKTsKKyAgICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJQcm94eS1BdXRob3JpemF0aW9uIiwgc29hcC0+dG1wYnVmKSkpCisgICAgICByZXR1cm4gZXJyOworICB9CisjZW5kaWYKKyNpZmRlZiBXSVRIX0NPT0tJRVMKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgaWYgKHNvYXBfcHV0Y29va2llcyhzb2FwLCBob3N0LCBwYXRoLCBzb2FwLT5zc2wgIT0gTlVMTCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2Vsc2UKKyAgaWYgKHNvYXBfcHV0Y29va2llcyhzb2FwLCBob3N0LCBwYXRoLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjZW5kaWYKKyNlbmRpZgorICBpZiAoYWN0aW9uICYmIHNvYXAtPnZlcnNpb24gPT0gMSkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIlwiJXNcIiIsIGFjdGlvbik7CisgICAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiU09BUEFjdGlvbiIsIHNvYXAtPnRtcGJ1ZikpKQorICAgICAgcmV0dXJuIGVycjsKKyAgfQorICByZXR1cm4gc29hcC0+ZnBvc3RoZHIoc29hcCwgTlVMTCwgTlVMTCk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK2h0dHBfc2VuZF9oZWFkZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMpCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnQ7CisgIGRvCisgIHsgdCA9IHN0cmNocihzLCAnXG4nKTsgLyogZGlzYWxsb3cgXG4gaW4gSFRUUCBoZWFkZXJzICovCisgICAgaWYgKCF0KQorICAgICAgdCA9IHMgKyBzdHJsZW4ocyk7CisgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIHMgPSB0ICsgMTsKKyAgfSB3aGlsZSAoKnQpOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAoraHR0cF9wb3N0X2hlYWRlcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWwpCit7IGlmIChrZXkpCisgIHsgaWYgKGh0dHBfc2VuZF9oZWFkZXIoc29hcCwga2V5KSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAodmFsICYmIChzb2FwX3NlbmRfcmF3KHNvYXAsICI6ICIsIDIpIHx8IGh0dHBfc2VuZF9oZWFkZXIoc29hcCwgdmFsKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgIlxyXG4iLCAyKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAoraHR0cF9yZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0YXR1cywgc2l6ZV90IGNvdW50KQoreyByZWdpc3RlciBpbnQgZXJyOworI2lmZGVmIFdNV19SUE1fSU8KKyAgaWYgKHNvYXAtPnJwbXJlcWlkKQorICAgIGh0dHBPdXRwdXRFbmFibGUoc29hcC0+cnBtcmVxaWQpOworI2VuZGlmCisgIGlmICghc3RhdHVzIHx8IHN0YXR1cyA9PSBTT0FQX0hUTUwgfHwgc3RhdHVzID09IFNPQVBfRklMRSkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk9LIDIwMFxuIikpOworI2lmZGVmIFdNV19SUE1fSU8KKyAgICBpZiAoc29hcC0+cnBtcmVxaWQgfHwgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSB8fCBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKSAvKiBSUE0gYmVoYXZlcyBhcyBpZiBzdGFuZGFsb25lICovCisjZWxzZQorICAgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpIHx8IHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpIC8qIHN0YW5kYWxvbmUgYXBwbGljYXRpb24gKi8KKyNlbmRpZgorICAgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJIVFRQLyVzIDIwMCBPSyIsIHNvYXAtPmh0dHBfdmVyc2lvbik7CisgICAgICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgTlVMTCkpKQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBlbHNlIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlN0YXR1cyIsICIyMDAgT0siKSkpCisgICAgICByZXR1cm4gZXJyOworICB9CisgIGVsc2UgaWYgKHN0YXR1cyA+IDIwMCAmJiBzdGF0dXMgPCA2MDApCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJIVFRQLyVzICVkICVzIiwgc29hcC0+aHR0cF92ZXJzaW9uLCBzdGF0dXMsIGh0dHBfZXJyb3Ioc29hcCwgc3RhdHVzKSk7CisgICAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCBzb2FwLT50bXBidWYsIE5VTEwpKSkKKyAgICAgIHJldHVybiBlcnI7CisjaWZuZGVmIFdJVEhfTEVBTiAKKyAgICBpZiAoc3RhdHVzID09IDQwMSkKKyAgICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiQmFzaWMgcmVhbG09XCIlc1wiIiwgc29hcC0+YXV0aHJlYWxtID8gc29hcC0+YXV0aHJlYWxtIDogImdTT0FQIFdlYiBTZXJ2aWNlIik7CisgICAgICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJXV1ctQXV0aGVudGljYXRlIiwgc29hcC0+dG1wYnVmKSkpCisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGVsc2UgaWYgKChzdGF0dXMgPj0gMzAxICYmIHN0YXR1cyA8PSAzMDMpIHx8IHN0YXR1cyA9PSAzMDcpCisgICAgeyBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJMb2NhdGlvbiIsIHNvYXAtPmVuZHBvaW50KSkpCisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorI2VuZGlmCisgIH0KKyAgZWxzZQorICB7IGNvbnN0IGNoYXIgKnMgPSAqc29hcF9mYXVsdGNvZGUoc29hcCk7CisgICAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMiAmJiAhc3RyY21wKHMsICJTT0FQLUVOVjpTZW5kZXIiKSkKKyAgICAgIHMgPSAiNDAwIEJhZCBSZXF1ZXN0IjsKKyAgICBlbHNlCisgICAgICBzID0gIjUwMCBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IiOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRXJyb3IgJXMgKHN0YXR1cz0lZClcbiIsIHMsIHN0YXR1cykpOworI2lmZGVmIFdNV19SUE1fSU8KKyAgICBpZiAoc29hcC0+cnBtcmVxaWQgfHwgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSB8fCBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKSAvKiBSUE0gYmVoYXZlcyBhcyBpZiBzdGFuZGFsb25lICovCisjZWxzZQorICAgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpIHx8IHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpIC8qIHN0YW5kYWxvbmUgYXBwbGljYXRpb24gKi8KKyNlbmRpZgorICAgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJIVFRQLyVzICVzIiwgc29hcC0+aHR0cF92ZXJzaW9uLCBzKTsKKyAgICAgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgc29hcC0+dG1wYnVmLCBOVUxMKSkpCisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGVsc2UgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiU3RhdHVzIiwgcykpKQorICAgICAgcmV0dXJuIGVycjsKKyAgfQorICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJTZXJ2ZXIiLCAiZ1NPQVAvMi43IikpCisgICB8fCAoZXJyID0gc29hcF9wdXRodHRwaGRyKHNvYXAsIHN0YXR1cywgY291bnQpKSkKKyAgICByZXR1cm4gZXJyOworI2lmZGVmIFdJVEhfQ09PS0lFUworICBpZiAoc29hcF9wdXRzZXRjb29raWVzKHNvYXApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNlbmRpZgorICByZXR1cm4gc29hcC0+ZnBvc3RoZHIoc29hcCwgTlVMTCwgTlVMTCk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0YXR1cykKK3sgcmVnaXN0ZXIgc2l6ZV90IGNvdW50OworICBpZiAoIShzb2FwLT5vbW9kZSAmIChTT0FQX0VOQ19YTUwgfCBTT0FQX0lPX1NUT1JFIC8qIHRoaXMgdGVzdHMgZm9yIGNodW5raW5nIHRvbyAqLykpCisgICAmJiAoc3RhdHVzID09IFNPQVBfSFRNTCB8fCBzdGF0dXMgPT0gU09BUF9GSUxFKSkKKyAgeyBzb2FwLT5vbW9kZSAmPSB+U09BUF9JTzsKKyAgICBzb2FwLT5vbW9kZSB8PSBTT0FQX0lPX1NUT1JFOworICB9CisgIHNvYXAtPnN0YXR1cyA9IHN0YXR1czsKKyAgY291bnQgPSBzb2FwX2NvdW50X2F0dGFjaG1lbnRzKHNvYXApOworICBpZiAoc29hcF9iZWdpbl9zZW5kKHNvYXApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgIT0gU09BUF9JT19TVE9SRSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpKQorICB7IHJlZ2lzdGVyIGludCBuID0gc29hcC0+bW9kZTsKKyAgICBzb2FwLT5tb2RlICY9IH4oU09BUF9JTyB8IFNPQVBfRU5DX1pMSUIpOworICAgIGlmICgobiAmIFNPQVBfSU8pICE9IFNPQVBfSU9fRkxVU0gpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fQlVGRkVSOworICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcmVzcG9uc2Uoc29hcCwgc3RhdHVzLCBjb3VudCkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICAgIGlmICgobiAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgICAgeyBpZiAoc29hcF9mbHVzaChzb2FwKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyNlbmRpZgorICAgIHNvYXAtPm1vZGUgPSBuOworICB9CisjZW5kaWYKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgY29uc3QgY2hhcioKK3NvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKnQpCit7IGlmICgqc29hcC0+dGFnKQorICAgIHNwcmludGYoc29hcC0+bXNnYnVmLCAiVmFsaWRhdGlvbiBjb25zdHJhaW50IHZpb2xhdGlvbjogJXMlcyBpbiBlbGVtZW50IDwlcz4iLCBzLCB0P3Q6U09BUF9TVFJfRU9TLCBzb2FwLT50YWcpOworICBlbHNlCisgICAgc3ByaW50Zihzb2FwLT5tc2didWYsICJWYWxpZGF0aW9uIGNvbnN0cmFpbnQgdmlvbGF0aW9uOiAlcyVzIiwgcywgdD90OlNPQVBfU1RSX0VPUyk7CisgIHJldHVybiBzb2FwLT5tc2didWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgY29uc3QgY2hhciAqKmMgPSBzb2FwX2ZhdWx0Y29kZShzb2FwKTsKKyAgY29uc3QgY2hhciAqKnMgPSBzb2FwX2ZhdWx0c3RyaW5nKHNvYXApOworICBpZiAoISpjICYmICEqcyAmJiBzb2FwLT5mc2V0ZXJyb3IpCisgICAgc29hcC0+ZnNldGVycm9yKHNvYXAsIGMsIHMpOworICBpZiAoISpjKQorICB7IGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgICAgICAqYyA9ICJTT0FQLUVOVjpTZW5kZXIiOworICAgIGVsc2UKKyAgICAgICpjID0gIlNPQVAtRU5WOkNsaWVudCI7CisgIH0KKyAgaWYgKCpzKQorICAgIHJldHVybjsKKyAgc3dpdGNoIChzb2FwLT5lcnJvcikKKyAgeworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBjYXNlIFNPQVBfQ0xJX0ZBVUxUOgorICAgICAgKnMgPSAiQ2xpZW50IGZhdWx0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9TVlJfRkFVTFQ6CisgICAgICAqcyA9ICJTZXJ2ZXIgZmF1bHQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1RBR19NSVNNQVRDSDoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAidGFnIG5hbWUgb3IgbmFtZXNwYWNlIG1pc21hdGNoIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfVFlQRToKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAiZGF0YSB0eXBlIG1pc21hdGNoICIsIHNvYXAtPnR5cGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1NZTlRBWF9FUlJPUjoKKyAgICAgICpzID0gIldlbGwtZm9ybWVkbmVzcyB2aW9sYXRpb24iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX05PX1RBRzoKKyAgICAgICpzID0gIk5vIFhNTCBlbGVtZW50IHRhZyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTVVTVFVOREVSU1RBTkQ6CisgICAgICAqYyA9ICJTT0FQLUVOVjpNdXN0VW5kZXJzdGFuZCI7CisgICAgICBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIlRoZSBkYXRhIGluIGVsZW1lbnQgJyVzJyBtdXN0IGJlIHVuZGVyc3Rvb2QgYnV0IGNhbm5vdCBiZSBoYW5kbGVkIiwgc29hcC0+dGFnKTsKKyAgICAgICpzID0gc29hcC0+bXNnYnVmOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1ZFUlNJT05NSVNNQVRDSDoKKyAgICAgICpjID0gIlNPQVAtRU5WOlZlcnNpb25NaXNtYXRjaCI7CisgICAgICAqcyA9ICJTT0FQIHZlcnNpb24gbWlzbWF0Y2ggb3IgaW52YWxpZCBTT0FQIG1lc3NhZ2UiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0RBVEFFTkNPRElOR1VOS05PV046CisgICAgICAqYyA9ICJTT0FQLUVOVjpEYXRhRW5jb2RpbmdVbmtub3duIjsKKyAgICAgICpzID0gIlVuc3VwcG9ydGVkIFNPQVAgZGF0YSBlbmNvZGluZyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTkFNRVNQQUNFOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJuYW1lc3BhY2UgbWlzbWF0Y2giLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9VU0VSX0VSUk9SOgorICAgICAgKnMgPSAiVXNlciBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfRkFUQUxfRVJST1I6CisgICAgICAqcyA9ICJGYXRhbCBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTk9fTUVUSE9EOgorICAgICAgc3ByaW50Zihzb2FwLT5tc2didWYsICJNZXRob2QgJyVzJyBub3QgaW1wbGVtZW50ZWQ6IG1ldGhvZCBuYW1lIG9yIG5hbWVzcGFjZSBub3QgcmVjb2duaXplZCIsIHNvYXAtPnRhZyk7CisgICAgICAqcyA9IHNvYXAtPm1zZ2J1ZjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9HRVRfTUVUSE9EOgorICAgICAgKnMgPSAiSFRUUCBHRVQgbWV0aG9kIG5vdCBpbXBsZW1lbnRlZCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfRU9NOgorICAgICAgKnMgPSAiT3V0IG9mIG1lbW9yeSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfSU9COgorICAgICAgKnMgPSAiQXJyYXkgaW5kZXggb3V0IG9mIGJvdW5kcyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTlVMTDoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAibmlsIG5vdCBhbGxvd2VkIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfRFVQTElDQVRFX0lEOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJtdWx0aXBsZSBkZWZpbml0aW9ucyBvZiBpZCAiLCBzb2FwLT5pZCk7CisgICAgICBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICAgICAgICAqc29hcF9mYXVsdHN1YmNvZGUoc29hcCkgPSAiU09BUC1FTkM6RHVwbGljYXRlSUQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX01JU1NJTkdfSUQ6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgIm1pc3NpbmcgaWQgZm9yIHJlZiAiLCBzb2FwLT5pZCk7CisgICAgICBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICAgICAgICAqc29hcF9mYXVsdHN1YmNvZGUoc29hcCkgPSAiU09BUC1FTkM6TWlzc2luZ0lEIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9IUkVGOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJpbmNvbXBhdGlibGUgb2JqZWN0IHJlZiAiLCBzb2FwLT5pZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfRkFVTFQ6CisgICAgICBicmVhazsKKyNpZm5kZWYgV0lUSF9OT0lPCisgICAgY2FzZSBTT0FQX1VEUF9FUlJPUjoKKyAgICAgICpzID0gIk1lc3NhZ2UgdG9vIGxhcmdlIGZvciBVRFAgcGFja2V0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9UQ1BfRVJST1I6CisgICAgICAqcyA9IHRjcF9lcnJvcihzb2FwKTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSBTT0FQX0hUVFBfRVJST1I6CisgICAgICAqcyA9ICJIVFRQIGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9TU0xfRVJST1I6CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgICAgICAqcyA9ICJTU0wgZXJyb3IiOworI2Vsc2UKKyAgICAgICpzID0gIk9wZW5TU0wgbm90IGluc3RhbGxlZDogcmVjb21waWxlIHdpdGggLURXSVRIX09QRU5TU0wiOworI2VuZGlmCisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfUExVR0lOX0VSUk9SOgorICAgICAgKnMgPSAiUGx1Z2luIHJlZ2lzdHJ5IGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9ESU1FX0VSUk9SOgorICAgICAgKnMgPSAiRElNRSBmb3JtYXQgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0RJTUVfSFJFRjoKKyAgICAgICpzID0gIkRJTUUgaHJlZiB0byBtaXNzaW5nIGF0dGFjaG1lbnQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0RJTUVfTUlTTUFUQ0g6CisgICAgICAqcyA9ICJESU1FIHZlcnNpb24vdHJhbnNtaXNzaW9uIGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9ESU1FX0VORDoKKyAgICAgICpzID0gIkVuZCBvZiBESU1FIGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9NSU1FX0VSUk9SOgorICAgICAgKnMgPSAiTUlNRSBmb3JtYXQgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX01JTUVfSFJFRjoKKyAgICAgICpzID0gIk1JTUUgaHJlZiB0byBtaXNzaW5nIGF0dGFjaG1lbnQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX01JTUVfRU5EOgorICAgICAgKnMgPSAiRW5kIG9mIE1JTUUgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1pMSUJfRVJST1I6CisjaWZkZWYgV0lUSF9aTElCCisgICAgICBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIlpsaWIvZ3ppcCBlcnJvcjogJyVzJyIsIHNvYXAtPmRfc3RyZWFtLm1zZz9zb2FwLT5kX3N0cmVhbS5tc2c6IiIpOworICAgICAgKnMgPSBzb2FwLT5tc2didWY7CisjZWxzZQorICAgICAgKnMgPSAiWmxpYi9nemlwIG5vdCBpbnN0YWxsZWQgZm9yIChkZSljb21wcmVzc2lvbjogcmVjb21waWxlIHdpdGggLURXSVRIX0daSVAiOworI2VuZGlmCisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfUkVRVUlSRUQ6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgIm1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfUFJPSElCSVRFRDoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAicHJvaGliaXRlZCBhdHRyaWJ1dGUgcHJlc2VudCIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX09DQ1VSUzoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAibWluL21heE9jY3VycyB2aW9sYXRpb24iLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9MRU5HVEg6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgImNvbnRlbnQgbGVuZ3RoIHZpb2xhdGlvbiIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1NUT1A6CisgICAgICAqcyA9ICJTdG9wcGVkOiBubyByZXNwb25zZSBzZW50IjsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSBTT0FQX0VPRjoKKyNpZm5kZWYgV0lUSF9OT0lPCisgICAgICBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIkVuZCBvZiBmaWxlIG9yIG5vIGlucHV0OiAnJXMnIiwgc29hcF9zdHJlcnJvcihzb2FwKSk7CisgICAgICAqcyA9IHNvYXAtPm1zZ2J1ZjsKKyAgICAgIGJyZWFrOworI2Vsc2UKKyAgICAgICpzID0gIkVuZCBvZiBmaWxlIG9yIG5vIGlucHV0IjsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdDoKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICBpZiAoc29hcC0+ZXJyb3IgPiAyMDAgJiYgc29hcC0+ZXJyb3IgPCA2MDApCisgICAgICB7IHNwcmludGYoc29hcC0+bXNnYnVmLCAiSFRUUCBFcnJvcjogJWQgJXMiLCBzb2FwLT5lcnJvciwgaHR0cF9lcnJvcihzb2FwLCBzb2FwLT5lcnJvcikpOworICAgICAgICAqcyA9IHNvYXAtPm1zZ2J1ZjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyNlbmRpZgorI2VuZGlmCisgICAgICB7IHNwcmludGYoc29hcC0+bXNnYnVmLCAiRXJyb3IgJWQiLCBzb2FwLT5lcnJvcik7CisgICAgICAgICpzID0gc29hcC0+bXNnYnVmOworICAgICAgfQorICAgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZW5kX2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgc3RhdHVzID0gc29hcC0+ZXJyb3I7CisgIGludCByID0gMTsKKyAgaWYgKHN0YXR1cyA9PSBTT0FQX1NUT1ApCisgICAgcmV0dXJuIHN0YXR1czsKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNlbmRpbmcgYmFjayBmYXVsdCBzdHJ1Y3QgZm9yIGVycm9yIGNvZGUgJWRcbiIsIHNvYXAtPmVycm9yKSk7CisgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOyAvKiB0byB0ZXJtaW5hdGUgY29ubmVjdGlvbiAqLworICBzb2FwX3NldF9mYXVsdChzb2FwKTsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgIGZkX3NldCByZmQsIHNmZDsKKyAgICB0aW1lb3V0LnR2X3NlYyA9IDA7CisgICAgdGltZW91dC50dl91c2VjID0gMDsKKyAgICBGRF9aRVJPKCZyZmQpOworICAgIEZEX1pFUk8oJnNmZCk7CisgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZyZmQpOworICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmc2ZkKTsKKyAgICByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksICZyZmQsICZzZmQsIE5VTEwsICZ0aW1lb3V0KTsKKyAgICBpZiAociA+IDApCisgICAgeyBpZiAoIUZEX0lTU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZzZmQpCisgICAgICAgfHwgKEZEX0lTU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZyZmQpCisgICAgICAgICYmIHJlY3YoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgc29hcC0+dG1wYnVmLCAxLCBNU0dfUEVFSykgPCAwKSkKKyAgICAgICAgciA9IDA7CisgICAgfQorICB9CisjZW5kaWYKKyNlbmRpZgorICBpZiAoKHN0YXR1cyAhPSBTT0FQX0VPRiB8fCAoIXNvYXAtPnJlY3ZfdGltZW91dCAmJiAhc29hcC0+c2VuZF90aW1lb3V0KSkgJiYgciA+IDApCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICAgIHNvYXBfc2VyaWFsaXplaGVhZGVyKHNvYXApOworICAgIHNvYXBfc2VyaWFsaXplZmF1bHQoc29hcCk7CisgICAgc29hcF9iZWdpbl9jb3VudChzb2FwKTsKKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICAgIHsgc29hcF9lbnZlbG9wZV9iZWdpbl9vdXQoc29hcCk7CisgICAgICBzb2FwX3B1dGhlYWRlcihzb2FwKTsKKyAgICAgIHNvYXBfYm9keV9iZWdpbl9vdXQoc29hcCk7CisgICAgICBzb2FwX3B1dGZhdWx0KHNvYXApOworICAgICAgc29hcF9ib2R5X2VuZF9vdXQoc29hcCk7CisgICAgICBzb2FwX2VudmVsb3BlX2VuZF9vdXQoc29hcCk7CisgICAgfQorICAgIHNvYXBfZW5kX2NvdW50KHNvYXApOworICAgIGlmIChzb2FwX3Jlc3BvbnNlKHNvYXAsIHN0YXR1cykKKyAgICAgfHwgc29hcF9lbnZlbG9wZV9iZWdpbl9vdXQoc29hcCkKKyAgICAgfHwgc29hcF9wdXRoZWFkZXIoc29hcCkKKyAgICAgfHwgc29hcF9ib2R5X2JlZ2luX291dChzb2FwKQorICAgICB8fCBzb2FwX3B1dGZhdWx0KHNvYXApCisgICAgIHx8IHNvYXBfYm9keV9lbmRfb3V0KHNvYXApCisgICAgIHx8IHNvYXBfZW52ZWxvcGVfZW5kX291dChzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICBzb2FwX2VuZF9zZW5kKHNvYXApOworICB9CisgIHNvYXAtPmVycm9yID0gc3RhdHVzOworICByZXR1cm4gc29hcF9jbG9zZXNvY2soc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVjdl9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IHN0YXR1cyA9IHNvYXAtPmVycm9yOworICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVjZWl2aW5nIFNPQVAgRmF1bHRcbiIpKTsKKyAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICBpZiAoc29hcF9nZXRmYXVsdChzb2FwKSkKKyAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiRXJyb3I6IHNvYXBfZ2V0X3NvYXBmYXVsdCgpIGZhaWxlZC4gSXMgdGhpcyBhIFNPQVAgbWVzc2FnZSBhdCBhbGw/XG4iKSk7CisgICAgKnNvYXBfZmF1bHRjb2RlKHNvYXApID0gKHNvYXAtPnZlcnNpb24gPT0gMiA/ICJTT0FQLUVOVjpTZW5kZXIiIDogIlNPQVAtRU5WOkNsaWVudCIpOworICAgIHNvYXAtPmVycm9yID0gc3RhdHVzOworICAgIHNvYXBfc2V0X2ZhdWx0KHNvYXApOworICB9CisgIGVsc2UKKyAgeyByZWdpc3RlciBjb25zdCBjaGFyICpzID0gKnNvYXBfZmF1bHRjb2RlKHNvYXApOworICAgIGlmICghc29hcF9tYXRjaF90YWcoc29hcCwgcywgIlNPQVAtRU5WOlNlcnZlciIpIHx8ICFzb2FwX21hdGNoX3RhZyhzb2FwLCBzLCAiU09BUC1FTlY6UmVjZWl2ZXIiKSkKKyAgICAgIHN0YXR1cyA9IFNPQVBfU1ZSX0ZBVUxUOyAKKyAgICBlbHNlIGlmICghc29hcF9tYXRjaF90YWcoc29hcCwgcywgIlNPQVAtRU5WOkNsaWVudCIpIHx8ICFzb2FwX21hdGNoX3RhZyhzb2FwLCBzLCAiU09BUC1FTlY6U2VuZGVyIikpCisgICAgICBzdGF0dXMgPSBTT0FQX0NMSV9GQVVMVDsKKyAgICBlbHNlIGlmICghc29hcF9tYXRjaF90YWcoc29hcCwgcywgIlNPQVAtRU5WOk11c3RVbmRlcnN0YW5kIikpCisgICAgICBzdGF0dXMgPSBTT0FQX01VU1RVTkRFUlNUQU5EOworICAgIGVsc2UgaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCBzLCAiU09BUC1FTlY6VmVyc2lvbk1pc21hdGNoIikpCisgICAgICBzdGF0dXMgPSBTT0FQX1ZFUlNJT05NSVNNQVRDSDsKKyAgICBlbHNlCisgICAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiRmF1bHQgY29kZSAlc1xuIiwgcykpOworICAgICAgc3RhdHVzID0gU09BUF9GQVVMVDsKKyAgICB9CisgICAgaWYgKHNvYXBfYm9keV9lbmRfaW4oc29hcCkKKyAgICAgfHwgc29hcF9lbnZlbG9wZV9lbmRfaW4oc29hcCkKKyAgICAgfHwgc29hcF9lbmRfcmVjdihzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICBzb2FwLT5lcnJvciA9IHN0YXR1czsKKyAgfQorICByZXR1cm4gc29hcF9jbG9zZXNvY2soc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2VuZF9lbXB0eV9yZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+Y291bnQgPSAwOworICBpZiAoc29hcF9yZXNwb25zZShzb2FwLCBTT0FQX09LKSB8fCBzb2FwX2VuZF9zZW5kKHNvYXApKQorICAgIHJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWN2X2VtcHR5X3Jlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcF9iZWdpbl9yZWN2KHNvYXApIHx8IHNvYXBfZW5kX3JlY3Yoc29hcCkpCisgICAgcmV0dXJuIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBjb25zdCBjaGFyKgorc29hcF9zdHJlcnJvcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IGVyciA9IHNvYXAtPmVycm51bTsKKyAgaWYgKGVycikKKyAgeworI2lmbmRlZiBXSU4zMgorICAgIHJldHVybiBzdHJlcnJvcihlcnIpOworI2Vsc2UKKyAgICBGb3JtYXRNZXNzYWdlKEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNfEZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTLCBOVUxMLCBlcnIsIDAsIChMUFRTVFIpJnNvYXAtPmVycm9yc3RyLCBzaXplb2Yoc29hcC0+ZXJyb3JzdHIpLCBOVUxMKTsKKyAgICByZXR1cm4gc29hcC0+ZXJyb3JzdHI7CisjZW5kaWYKKyAgfQorICByZXR1cm4gIk9wZXJhdGlvbiBpbnRlcnJ1cHRlZCBvciB0aW1lZCBvdXQiOworfQorI2VuZGlmCisjZW5kaWYgCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorc3RhdGljIGludAorc29hcF9zZXRfZXJyb3Ioc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZhdWx0Y29kZSwgY29uc3QgY2hhciAqZmF1bHRzdWJjb2RlLCBjb25zdCBjaGFyICpmYXVsdHN0cmluZywgY29uc3QgY2hhciAqZmF1bHRkZXRhaWwsIGludCBzb2FwZXJyb3IpCit7ICpzb2FwX2ZhdWx0Y29kZShzb2FwKSA9IGZhdWx0Y29kZTsKKyAgaWYgKGZhdWx0c3ViY29kZSkKKyAgICAqc29hcF9mYXVsdHN1YmNvZGUoc29hcCkgPSBmYXVsdHN1YmNvZGU7CisgICpzb2FwX2ZhdWx0c3RyaW5nKHNvYXApID0gZmF1bHRzdHJpbmc7CisgIGlmIChmYXVsdGRldGFpbCAmJiAqZmF1bHRkZXRhaWwpCisgIHsgcmVnaXN0ZXIgY29uc3QgY2hhciAqKnMgPSBzb2FwX2ZhdWx0ZGV0YWlsKHNvYXApOworICAgIGlmIChzKQorICAgICAgKnMgPSBmYXVsdGRldGFpbDsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3IgPSBzb2FwZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X3NlbmRlcl9lcnJvcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRzdHJpbmcsIGNvbnN0IGNoYXIgKmZhdWx0ZGV0YWlsLCBpbnQgc29hcGVycm9yKQoreyByZXR1cm4gc29hcF9zZXRfZXJyb3Ioc29hcCwgc29hcC0+dmVyc2lvbiA9PSAyID8gIlNPQVAtRU5WOlNlbmRlciIgOiAiU09BUC1FTlY6Q2xpZW50IiwgTlVMTCwgZmF1bHRzdHJpbmcsIGZhdWx0ZGV0YWlsLCBzb2FwZXJyb3IpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRzdHJpbmcsIGNvbnN0IGNoYXIgKmZhdWx0ZGV0YWlsLCBpbnQgc29hcGVycm9yKQoreyByZXR1cm4gc29hcF9zZXRfZXJyb3Ioc29hcCwgc29hcC0+dmVyc2lvbiA9PSAyID8gIlNPQVAtRU5WOlJlY2VpdmVyIiA6ICJTT0FQLUVOVjpTZXJ2ZXIiLCBOVUxMLCBmYXVsdHN0cmluZywgZmF1bHRkZXRhaWwsIHNvYXBlcnJvcik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitzdGF0aWMgaW50Citzb2FwX2NvcHlfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZhdWx0Y29kZSwgY29uc3QgY2hhciAqZmF1bHRzdWJjb2RlLCBjb25zdCBjaGFyICpmYXVsdHN0cmluZywgY29uc3QgY2hhciAqZmF1bHRkZXRhaWwpCit7IGNoYXIgKnIgPSBOVUxMLCAqcyA9IE5VTEwsICp0ID0gTlVMTDsKKyAgaWYgKGZhdWx0c3ViY29kZSkKKyAgICByID0gc29hcF9zdHJkdXAoc29hcCwgZmF1bHRzdWJjb2RlKTsKKyAgaWYgKGZhdWx0c3RyaW5nKQorICAgIHMgPSBzb2FwX3N0cmR1cChzb2FwLCBmYXVsdHN0cmluZyk7CisgIGlmIChmYXVsdGRldGFpbCkKKyAgICB0ID0gc29hcF9zdHJkdXAoc29hcCwgZmF1bHRkZXRhaWwpOworICByZXR1cm4gc29hcF9zZXRfZXJyb3Ioc29hcCwgZmF1bHRjb2RlLCByLCBzLCB0LCBTT0FQX0ZBVUxUKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZW5kZXJfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCkKK3sgcmV0dXJuIHNvYXBfc2VuZGVyX2ZhdWx0X3N1YmNvZGUoc29hcCwgTlVMTCwgZmF1bHRzdHJpbmcsIGZhdWx0ZGV0YWlsKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZW5kZXJfZmF1bHRfc3ViY29kZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRzdWJjb2RlLCBjb25zdCBjaGFyICpmYXVsdHN0cmluZywgY29uc3QgY2hhciAqZmF1bHRkZXRhaWwpCit7IHJldHVybiBzb2FwX2NvcHlfZmF1bHQoc29hcCwgc29hcC0+dmVyc2lvbiA9PSAyID8gIlNPQVAtRU5WOlNlbmRlciIgOiAiU09BUC1FTlY6Q2xpZW50IiwgZmF1bHRzdWJjb2RlLCBmYXVsdHN0cmluZywgZmF1bHRkZXRhaWwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlY2VpdmVyX2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdHN0cmluZywgY29uc3QgY2hhciAqZmF1bHRkZXRhaWwpCit7IHJldHVybiBzb2FwX3JlY2VpdmVyX2ZhdWx0X3N1YmNvZGUoc29hcCwgTlVMTCwgZmF1bHRzdHJpbmcsIGZhdWx0ZGV0YWlsKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWNlaXZlcl9mYXVsdF9zdWJjb2RlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdHN1YmNvZGUsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCkKK3sgcmV0dXJuIHNvYXBfY29weV9mYXVsdChzb2FwLCBzb2FwLT52ZXJzaW9uID09IDIgPyAiU09BUC1FTlY6UmVjZWl2ZXIiIDogIlNPQVAtRU5WOlNlcnZlciIsIGZhdWx0c3ViY29kZSwgZmF1bHRzdHJpbmcsIGZhdWx0ZGV0YWlsKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKKyNpZm5kZWYgV0lUSF9OT1NURExJQgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9wcmludF9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCwgRklMRSAqZmQpCit7IGlmIChzb2FwX2NoZWNrX3N0YXRlKHNvYXApKQorICAgIGZwcmludGYoZmQsICJFcnJvcjogc29hcCBzdHJ1Y3Qgbm90IGluaXRpYWxpemVkXG4iKTsKKyAgZWxzZSBpZiAoc29hcC0+ZXJyb3IpCisgIHsgY29uc3QgY2hhciAqYywgKnYgPSBOVUxMLCAqcywgKipkOworICAgIGQgPSBzb2FwX2ZhdWx0Y29kZShzb2FwKTsKKyAgICBpZiAoISpkKQorICAgICAgc29hcF9zZXRfZmF1bHQoc29hcCk7CisgICAgYyA9ICpkOworICAgIGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgICAgICB2ID0gKnNvYXBfZmF1bHRzdWJjb2RlKHNvYXApOworICAgIHMgPSAqc29hcF9mYXVsdHN0cmluZyhzb2FwKTsKKyAgICBkID0gc29hcF9mYXVsdGRldGFpbChzb2FwKTsKKyAgICBmcHJpbnRmKGZkLCAiJXMlZCBmYXVsdDogJXMgWyVzXVxuXCIlc1wiXG5EZXRhaWw6ICVzXG4iLCBzb2FwLT52ZXJzaW9uID8gIlNPQVAgMS4iIDogIkVycm9yICIsIHNvYXAtPnZlcnNpb24gPyAoaW50KXNvYXAtPnZlcnNpb24gOiBzb2FwLT5lcnJvciwgYywgdiA/IHYgOiAibm8gc3ViY29kZSIsIHMgPyBzIDogIltubyByZWFzb25dIiwgZCAmJiAqZCA/ICpkIDogIltubyBkZXRhaWxdIik7CisgIH0KK30KKyNlbmRpZgorI2VuZGlmCisgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKKyNpZm5kZWYgV0lUSF9OT1NURExJQgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9wcmludF9mYXVsdF9sb2NhdGlvbihzdHJ1Y3Qgc29hcCAqc29hcCwgRklMRSAqZmQpCit7IAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaW50IGksIGosIGMxLCBjMjsKKyAgaWYgKHNvYXAtPmVycm9yICYmIHNvYXAtPmJ1ZmxlbiA+IDApCisgIHsgaSA9IChpbnQpc29hcC0+YnVmaWR4IC0gMTsKKyAgICBpZiAoaSA8PSAwKQorICAgICAgaSA9IDA7CisgICAgYzEgPSBzb2FwLT5idWZbaV07CisgICAgc29hcC0+YnVmW2ldID0gJ1wwJzsKKyAgICBpZiAoKGludClzb2FwLT5idWZsZW4gPj0gaSArIDEwMjQpCisgICAgICBqID0gaSArIDEwMjM7CisgICAgZWxzZQorICAgICAgaiA9IChpbnQpc29hcC0+YnVmbGVuIC0gMTsKKyAgICBjMiA9IHNvYXAtPmJ1ZltqXTsKKyAgICBzb2FwLT5idWZbal0gPSAnXDAnOworICAgIGZwcmludGYoZmQsICIlcyVjXG4qKiBIRVJFICoqXG4iLCBzb2FwLT5idWYsIGMxKTsKKyAgICBpZiAoc29hcC0+YnVmaWR4IDwgc29hcC0+YnVmbGVuKQorICAgICAgZnByaW50ZihmZCwgIiVzXG4iLCBzb2FwLT5idWYgKyBzb2FwLT5idWZpZHgpOworICAgIHNvYXAtPmJ1ZltpXSA9IGMxOworICAgIHNvYXAtPmJ1ZltqXSA9IGMyOworICB9CisjZW5kaWYKK30KKyNlbmRpZgorI2VuZGlmCisgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWdpc3Rlcl9wbHVnaW5fYXJnKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgKCpmY3JlYXRlKShzdHJ1Y3Qgc29hcCosIHN0cnVjdCBzb2FwX3BsdWdpbiosIHZvaWQqKSwgdm9pZCAqYXJnKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnA7CisgIHJlZ2lzdGVyIGludCByOworICBpZiAoIShwID0gKHN0cnVjdCBzb2FwX3BsdWdpbiopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX3BsdWdpbikpKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgcC0+aWQgPSBOVUxMOworICBwLT5kYXRhID0gTlVMTDsKKyAgcC0+ZmNvcHkgPSBOVUxMOworICBwLT5mZGVsZXRlID0gTlVMTDsKKyAgciA9IGZjcmVhdGUoc29hcCwgcCwgYXJnKTsKKyAgaWYgKCFyICYmIHAtPmZkZWxldGUpCisgIHsgcC0+bmV4dCA9IHNvYXAtPnBsdWdpbnM7CisgICAgc29hcC0+cGx1Z2lucyA9IHA7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWdpc3RlcmVkICclcycgcGx1Z2luXG4iLCBwLT5pZCkpOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IHJlZ2lzdGVyIHBsdWdpbiAnJXMnOiBwbHVnaW4gcmV0dXJuZWQgZXJyb3IgJWQgKG9yIGZkZWxldGUgY2FsbGJhY2sgbm90IHNldClcbiIsIHAtPmlkP3AtPmlkOiI/IiwgcikpOworICBTT0FQX0ZSRUUoc29hcCwgcCk7CisgIHJldHVybiByOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQgKgorZnBsdWdpbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BsdWdpbiAqcDsKKyAgZm9yIChwID0gc29hcC0+cGx1Z2luczsgcDsgcCA9IHAtPm5leHQpCisgICAgaWYgKHAtPmlkID09IGlkIHx8ICFzdHJjbXAocC0+aWQsIGlkKSkKKyAgICAgIHJldHVybiBwLT5kYXRhOworICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQgKgorU09BUF9GTUFDMgorc29hcF9sb29rdXBfcGx1Z2luKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCkKK3sgcmV0dXJuIHNvYXAtPmZwbHVnaW4oc29hcCwgaWQpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpZm5kZWYgV0lUSF9MRUFOCitzb2FwOjpzb2FwKCkKK3sgc29hcF9pbml0KHRoaXMpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglDKysgc29hcCBzdHJ1Y3QgbWV0aG9kcworICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpZm5kZWYgV0lUSF9MRUFOCitzb2FwOjpzb2FwKHNvYXBfbW9kZSBtb2RlKQoreyBzb2FwX2luaXQxKHRoaXMsIG1vZGUpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworI2lmbmRlZiBXSVRIX0xFQU4KK3NvYXA6OnNvYXAoc29hcF9tb2RlIGltb2RlLCBzb2FwX21vZGUgb21vZGUpCit7IHNvYXBfaW5pdDIodGhpcywgaW1vZGUsIG9tb2RlKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpZm5kZWYgV0lUSF9MRUFOCitzb2FwOjpzb2FwKHN0cnVjdCBzb2FwJiBzb2FwKQoreyBzb2FwX2NvcHlfY29udGV4dCh0aGlzLCAmc29hcCk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIF9fY3BsdXNwbHVzCisjaWZuZGVmIFdJVEhfTEVBTgorc29hcDo6fnNvYXAoKQoreyBzb2FwX2Rlc3Ryb3kodGhpcyk7CisgIHNvYXBfZW5kKHRoaXMpOworICBzb2FwX2RvbmUodGhpcyk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZ3NvYXAtcGFsbS9wYWxtc29hcDIuYyBiL2dzb2FwLXBhbG0vcGFsbXNvYXAyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYyNmRlZQotLS0gL2Rldi9udWxsCisrKyBiL2dzb2FwLXBhbG0vcGFsbXNvYXAyLmMKQEAgLTAsMCArMSwxMzQ0OSBAQAorI2RlZmluZSBQQUxNXzIKKy8qCisKK3N0ZHNvYXAyLmNbcHBdIDIuNy42ZQorCitnU09BUCBydW50aW1lCisKK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgcGFydCBvZiB0aGUgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXM6CitHUEwsIHRoZSBnU09BUCBwdWJsaWMgbGljZW5zZSwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NvbnRyaWJ1dG9yczoKKworV2luZCBSaXZlciBTeXN0ZW1zIEluYy4sIGZvciB0aGUgZm9sbG93aW5nIGFkZGl0aW9ucyB1bmRlciBnU09BUCBwdWJsaWMgbGljZW5zZToKKyAgLSB2eFdvcmtzIGNvbXBhdGlibGUJKCNkZWZpbmUgVlhXT1JLUykKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBwdWJsaWMgbGljZW5zZS4KKworVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZ1NPQVAgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjMKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcGxpY2Vuc2UuaHRtbAorU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKK1dJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQorZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFJvYmVydCBBLiB2YW4gRW5nZWxlbi4KK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0luc3RhbGxhdGlvbiBub3RlOgorCitXaW4zMiBidWlsZCBuZWVkcyB3aW5zb2NrLmRsbCAoVmlzdWFsIEMrKyAid3NvY2szMi5saWIiKQorVG8gZG8gdGhpcyBpbiBWaXN1YWwgQysrIDYuMCwgZ28gdG8gIlByb2plY3QiLCAic2V0dGluZ3MiLCBzZWxlY3QgdGhlICJMaW5rIgordGFiICh0aGUgcHJvamVjdCBmaWxlIG5lZWRzIHRvIGJlIHNlbGVjdGVkIGluIHRoZSBmaWxlIHZpZXcpIGFuZCBhZGQKKyJ3c29jazMyLmxpYiIgdG8gdGhlICJPYmplY3QvbGlicmFyeSBtb2R1bGVzIiBlbnRyeQorCitPbiBNYWMgT1MgWCB3aXRoIGdjYyAoR0NDKSAzLjEgMjAwMjA0MjAgKHByZXJlbGVhc2UpIHlvdSBNVVNUIGNvbXBpbGUgd2l0aAorLWZzdGFja19jaGVjayB3aGVuIHVzaW5nIC1PMiBiZWNhdXNlIGdjYyAzLjEgaGFzIGEgYnVnIHRoYXQgc21hc2hlcyB0aGUgc3RhY2sKK3doZW4gbG9jYWxseSBhbGxvY2F0ZWQgZGF0YSBleGNlZWRzIDY0Sy4KKworKi8KKworI2lmZGVmIEFTNDAwCisjIHByYWdtYSBjb252ZXJ0KDgxOSkJLyogRUJDRElDIHRvIEFTQ0lJICovCisjZW5kaWYKKworI2luY2x1ZGUgInN0ZHNvYXAyLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworU09BUF9TT1VSQ0VfU1RBTVAoIkAoIykgc3Rkc29hcDIuY3BwIHZlciAyLjcuNmUgMjAwNi0wMi0xOCAxMjowMDowMCBHTVQiKQorZXh0ZXJuICJDIiB7CisjZWxzZQorU09BUF9TT1VSQ0VfU1RBTVAoIkAoIykgc3Rkc29hcDIuYyB2ZXIgMi43LjZlIDIwMDYtMDItMTggMTI6MDA6MDAgR01UIikKKyNlbmRpZgorCisvKiA4Yml0IGNoYXJhY3RlciByZXByZXNlbnRpbmcgdW5rbm93bi9ub25yZXByZXNlbnRhYmxlIGNoYXJhY3RlciBkYXRhIChlLmcuIG5vdCBzdXBwb3J0ZWQgYnkgY3VycmVudCBsb2NhbGUgd2l0aCBtdWx0aWJ5dGUgc3VwcG9ydCBlbmFibGVkKSAqLworI2lmbmRlZiBTT0FQX1VOS05PV05fQ0hBUgorI2RlZmluZSBTT0FQX1VOS05PV05fQ0hBUiAoMTI3KQorI2VuZGlmCisKKy8qICAgICAgRU9GPS0xICovCisjZGVmaW5lIFNPQVBfTFQgKHNvYXBfd2NoYXIpKC0yKSAvKiBYTUwgY2hhcmFjdGVyICc8JyAqLworI2RlZmluZSBTT0FQX1RUIChzb2FwX3djaGFyKSgtMykgLyogWE1MIGNoYXJhY3RlciAnPC8nICovCisjZGVmaW5lIFNPQVBfR1QgKHNvYXBfd2NoYXIpKC00KSAvKiBYTUwgY2hhcmFjdGVyICc+JyAqLworI2RlZmluZSBTT0FQX1FUIChzb2FwX3djaGFyKSgtNSkgLyogWE1MIGNoYXJhY3RlciAnIicgKi8KKyNkZWZpbmUgU09BUF9BUCAoc29hcF93Y2hhcikoLTYpIC8qIFhNTCBjaGFyYWN0ZXIgJycnICovCisKKyNkZWZpbmUgc29hcF9ibGFuayhjKQkJKChjKSA+PSAwICYmIChjKSA8PSAzMikKKyNkZWZpbmUgc29hcF9ub3RibGFuayhjKQkoKGMpID4gMzIpCisjZGVmaW5lIHNvYXBfaGFzaF9wdHIocCkJKCgodW5zaWduZWQgbG9uZykocCkgPj4gMykgJiAoU09BUF9QVFJIQVNIIC0gMSkpCisKKyNpZmRlZiBTT0FQX0RFQlVHCitzdGF0aWMgdm9pZCBzb2FwX2luaXRfbG9ncyhzdHJ1Y3Qgc29hcCopOworc3RhdGljIHZvaWQgc29hcF9jbG9zZV9sb2dmaWxlKHN0cnVjdCBzb2FwKiwgaW50KTsKK3N0YXRpYyB2b2lkIHNvYXBfc2V0X2xvZ2ZpbGUoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyB2b2lkIHNvYXBfZnJlZV9taHQoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyB2b2lkIHNvYXBfdHJhY2tfdW5saW5rKHN0cnVjdCBzb2FwKiwgY29uc3Qgdm9pZCopOworI2VuZGlmCisKKyNpZm5kZWYgUEFMTV8yCitzdGF0aWMgaW50IHNvYXBfc2V0X2Vycm9yKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGludCk7CitzdGF0aWMgaW50IHNvYXBfY29weV9mYXVsdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyBpbnQgc29hcF9nZXRhdHRydmFsKHN0cnVjdCBzb2FwKiwgY2hhciosIHNpemVfdCwgc29hcF93Y2hhcik7CisjZW5kaWYKKworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzb2FwX3djaGFyIHNvYXBfY2hhcihzdHJ1Y3Qgc29hcCopOworc3RhdGljIHNvYXBfd2NoYXIgc29hcF9nZXRfcGkoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBpbnQgc29hcF9pc3hkaWdpdChpbnQpOworc3RhdGljIHZvaWQgKmZwbHVnaW4oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKik7CisjaWZuZGVmIFdJVEhfTk9JRFJFRgorc3RhdGljIHZvaWQgc29hcF91cGRhdGVfcHRycyhzdHJ1Y3Qgc29hcCosIGNoYXIqLCBjaGFyKiwgY2hhciosIGNoYXIqKTsKK3N0YXRpYyBpbnQgc29hcF9oYXNfY29waWVzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyB2b2lkIHNvYXBfaW5pdF9paHQoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyB2b2lkIHNvYXBfZnJlZV9paHQoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyB2b2lkIHNvYXBfaW5pdF9waHQoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyB2b2lkIHNvYXBfZnJlZV9waHQoc3RydWN0IHNvYXAqKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgY29uc3QgY2hhciAqc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitzdGF0aWMgaW50IHNvYXBfaXNudW1lcmljKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworc3RhdGljIHRpbWVfdCBzb2FwX3RpbWVnbShzdHJ1Y3QgdG0qKTsKK3N0YXRpYyBzdHJ1Y3Qgc29hcF9ubGlzdCAqc29hcF9sb29rdXBfbnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc2l6ZV90IG4pOworc3RhdGljIHN0cnVjdCBzb2FwX25saXN0ICpzb2FwX3B1c2hfbnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICpucywgc2hvcnQgdXRpbGl6ZWQpOworc3RhdGljIHZvaWQgc29hcF9wb3BfbnMoc3RydWN0IHNvYXAgKnNvYXApOworc3RhdGljIHZvaWQgc29hcF91dGlsaXplX25zKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHNpemVfdCBuKTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHN0cnVjdCBzb2FwX211bHRpcGFydCAqc29hcF9uZXdfbXVsdGlwYXJ0KHN0cnVjdCBzb2FwKiwgc3RydWN0IHNvYXBfbXVsdGlwYXJ0KiosIHN0cnVjdCBzb2FwX211bHRpcGFydCoqLCBjaGFyKiwgc2l6ZV90KTsKK3N0YXRpYyBpbnQgc29hcF9wdXRkaW1lZmllbGQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc2l6ZV90KTsKK3N0YXRpYyBjaGFyICpzb2FwX2dldGRpbWVmaWVsZChzdHJ1Y3Qgc29hcCosIHNpemVfdCk7CitzdGF0aWMgdm9pZCBzb2FwX3NlbGVjdF9taW1lX2JvdW5kYXJ5KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgaW50IHNvYXBfdmFsaWRfbWltZV9ib3VuZGFyeShzdHJ1Y3Qgc29hcCopOworc3RhdGljIGludCBzb2FwX21hdGNoX2NpZChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitzdGF0aWMgdm9pZCBzb2FwX3Jlc29sdmVfYXR0YWNobWVudChzdHJ1Y3Qgc29hcCosIHN0cnVjdCBzb2FwX211bHRpcGFydCopOworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFdJVEhfR1pJUAorc3RhdGljIGludCBzb2FwX2dldGd6aXBoZHIoc3RydWN0IHNvYXAqKTsKKyNlbmRpZgorCisjaWZkZWYgV0lUSF9PUEVOU1NMCitzdGF0aWMgaW50IHNzbF9pbml0X2RvbmUgPSAwOworc3RhdGljIGludCBzc2xfYXV0aF9pbml0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgaW50IHNzbF92ZXJpZnlfY2FsbGJhY2soaW50LCBYNTA5X1NUT1JFX0NUWCopOworc3RhdGljIGludCBzc2xfcGFzc3dvcmQoY2hhciosIGludCwgaW50LCB2b2lkICopOworc3RhdGljIGNvbnN0IGNoYXIgKnNzbF9lcnJvcihzdHJ1Y3Qgc29hcCosIGludCk7CisvKiBUaGlzIGNhbGxiYWNrIGlzIGluY2x1ZGVkIGZvciBmdXR1cmUgcmVmZXJlbmNlcy4gSXQgc2hvdWxkIG5vdCBiZSBkZWxldGVkCitzdGF0aWMgREggKnNzbF90bXBfZGgoU1NMKiwgaW50LCBpbnQpOworKi8KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoV0lUSF9OT0hUVFApIHx8ICFkZWZpbmVkKFdJVEhfTEVBTkVSKQorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBjb25zdCBjaGFyICpzb2FwX2RlY29kZShjaGFyKiwgc2l6ZV90LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzb2FwX3djaGFyIHNvYXBfZ2V0Y2h1bmtjaGFyKHN0cnVjdCBzb2FwKik7CitzdGF0aWMgY29uc3QgY2hhciAqaHR0cF9lcnJvcihzdHJ1Y3Qgc29hcCosIGludCk7CitzdGF0aWMgaW50IGh0dHBfcG9zdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCk7CitzdGF0aWMgaW50IGh0dHBfZ2V0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgaW50IGh0dHBfc2VuZF9oZWFkZXIoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKik7CitzdGF0aWMgaW50IGh0dHBfcG9zdF9oZWFkZXIoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworc3RhdGljIGludCBodHRwX3Jlc3BvbnNlKHN0cnVjdCBzb2FwKiwgaW50LCBzaXplX3QpOworc3RhdGljIGludCBodHRwX3BhcnNlKHN0cnVjdCBzb2FwKik7CitzdGF0aWMgaW50IGh0dHBfcGFyc2VfaGVhZGVyKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludCBmc2VuZChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworc3RhdGljIHNpemVfdCBmcmVjdihzdHJ1Y3Qgc29hcCosIGNoYXIqLCBzaXplX3QpOworc3RhdGljIGludCB0Y3BfaW5pdChzdHJ1Y3Qgc29hcCopOworc3RhdGljIGNvbnN0IGNoYXIgKnRjcF9lcnJvcihzdHJ1Y3Qgc29hcCopOworI2lmbmRlZiBXSVRIX0lQVjYKK3N0YXRpYyBpbnQgdGNwX2dldGhvc3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICphZGRyLCBzdHJ1Y3QgaW5fYWRkciAqaW5hZGRyKTsKKyNlbmRpZgorc3RhdGljIGludCB0Y3BfY29ubmVjdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjb25zdCBjaGFyICpob3N0LCBpbnQgcG9ydCk7CitzdGF0aWMgaW50IHRjcF9hY2NlcHQoc3RydWN0IHNvYXAqLCBpbnQsIHN0cnVjdCBzb2NrYWRkciosIGludCopOworc3RhdGljIGludCB0Y3BfZGlzY29ubmVjdChzdHJ1Y3Qgc29hcCopOworc3RhdGljIGludCB0Y3BfY2xvc2Vzb2NrZXQoc3RydWN0IHNvYXAqLCBTT0FQX1NPQ0tFVCk7CitzdGF0aWMgaW50IHRjcF9zaHV0ZG93bnNvY2tldChzdHJ1Y3Qgc29hcCosIFNPQVBfU09DS0VULCBpbnQpOworc3RhdGljIGNvbnN0IGNoYXIgKnNvYXBfc3RyZXJyb3Ioc3RydWN0IHNvYXAqKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBBTE0pICYmICFkZWZpbmVkKFBBTE1fMikKK3Vuc2lnbmVkIHNob3J0IGVycm5vOworI2VuZGlmCisKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY29uc3QgY2hhciBzb2FwX2VudjFbNDJdID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIjsKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfZW5jMVs0Ml0gPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iOworc3RhdGljIGNvbnN0IGNoYXIgc29hcF9lbnYyWzQwXSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiOworc3RhdGljIGNvbnN0IGNoYXIgc29hcF9lbmMyWzQwXSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW5jb2RpbmciOworc3RhdGljIGNvbnN0IGNoYXIgc29hcF9ycGNbMzVdID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1ycGMiOworI2VuZGlmCisKKyNpZm5kZWYgUEFMTV8xCitjb25zdCBzdHJ1Y3Qgc29hcF9kb3VibGVfbmFuIHNvYXBfZG91YmxlX25hbiA9IHsweEZGRkZGRkZGLCAweEZGRkZGRkZGfTsKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfYmFzZTY0b1s2NV0gPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CitzdGF0aWMgY29uc3QgY2hhciBzb2FwX2Jhc2U2NGlbODFdID0gIlw3NlhYWFw3N1w2NFw2NVw2Nlw2N1w3MFw3MVw3Mlw3M1w3NFw3NVhYWFhYWFhcMDBcMDFcMDJcMDNcMDRcMDVcMDZcMDdcMTBcMTFcMTJcMTNcMTRcMTVcMTZcMTdcMjBcMjFcMjJcMjNcMjRcMjVcMjZcMjdcMzBcMzFYWFhYWFhcMzJcMzNcMzRcMzVcMzZcMzdcNDBcNDFcNDJcNDNcNDRcNDVcNDZcNDdcNTBcNTFcNTJcNTNcNTRcNTVcNTZcNTdcNjBcNjFcNjJcNjMiOworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgY29uc3QgY2hhciBzb2FwX2luZGVudFsxMV0gPSAiXG5cdFx0XHRcdFx0XHRcdFx0XHQiOworLyogQWx0ZXJuYXRpdmUgaW5kZW50YXRpb24gZm9ybSBmb3IgU09BUF9YTUxfSU5ERU5UOgorc3RhdGljIGNvbnN0IGNoYXIgc29hcF9pbmRlbnRbMjFdID0gIlxuICAgICAgICAgICAgICAgICAgICI7CisqLworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfcGFkZGluZ1s0XSA9ICJcMFwwXDAiOworI2RlZmluZSBTT0FQX1NUUl9QQURESU5HIChzb2FwX3BhZGRpbmcpCisjZGVmaW5lIFNPQVBfU1RSX0VPUyAoc29hcF9wYWRkaW5nKQorI2RlZmluZSBTT0FQX05PTl9OVUxMIChzb2FwX3BhZGRpbmcpCisKKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgaHRtbF9lbnRpdHlfY29kZXNbXSA9IC8qIGVudGl0aWVzIGZvciBYSFRNTCBwYXJzaW5nICovCit7IHsgMTYwLCAibmJzcCIgfSwKKyAgeyAxNjEsICJpZXhjbCIgfSwKKyAgeyAxNjIsICJjZW50IiB9LAorICB7IDE2MywgInBvdW5kIiB9LAorICB7IDE2NCwgImN1cnJlbiIgfSwKKyAgeyAxNjUsICJ5ZW4iIH0sCisgIHsgMTY2LCAiYnJ2YmFyIiB9LAorICB7IDE2NywgInNlY3QiIH0sCisgIHsgMTY4LCAidW1sIiB9LAorICB7IDE2OSwgImNvcHkiIH0sCisgIHsgMTcwLCAib3JkZiIgfSwKKyAgeyAxNzEsICJsYXF1byIgfSwKKyAgeyAxNzIsICJub3QiIH0sCisgIHsgMTczLCAic2h5IiB9LAorICB7IDE3NCwgInJlZyIgfSwKKyAgeyAxNzUsICJtYWNyIiB9LAorICB7IDE3NiwgImRlZyIgfSwKKyAgeyAxNzcsICJwbHVzbW4iIH0sCisgIHsgMTc4LCAic3VwMiIgfSwKKyAgeyAxNzksICJzdXAzIiB9LAorICB7IDE4MCwgImFjdXRlIiB9LAorICB7IDE4MSwgIm1pY3JvIiB9LAorICB7IDE4MiwgInBhcmEiIH0sCisgIHsgMTgzLCAibWlkZG90IiB9LAorICB7IDE4NCwgImNlZGlsIiB9LAorICB7IDE4NSwgInN1cDEiIH0sCisgIHsgMTg2LCAib3JkbSIgfSwKKyAgeyAxODcsICJyYXF1byIgfSwKKyAgeyAxODgsICJmcmFjMTQiIH0sCisgIHsgMTg5LCAiZnJhYzEyIiB9LAorICB7IDE5MCwgImZyYWMzNCIgfSwKKyAgeyAxOTEsICJpcXVlc3QiIH0sCisgIHsgMTkyLCAiQWdyYXZlIiB9LAorICB7IDE5MywgIkFhY3V0ZSIgfSwKKyAgeyAxOTQsICJBY2lyYyIgfSwKKyAgeyAxOTUsICJBdGlsZGUiIH0sCisgIHsgMTk2LCAiQXVtbCIgfSwKKyAgeyAxOTcsICJBcmluZyIgfSwKKyAgeyAxOTgsICJBRWxpZyIgfSwKKyAgeyAxOTksICJDY2VkaWwiIH0sCisgIHsgMjAwLCAiRWdyYXZlIiB9LAorICB7IDIwMSwgIkVhY3V0ZSIgfSwKKyAgeyAyMDIsICJFY2lyYyIgfSwKKyAgeyAyMDMsICJFdW1sIiB9LAorICB7IDIwNCwgIklncmF2ZSIgfSwKKyAgeyAyMDUsICJJYWN1dGUiIH0sCisgIHsgMjA2LCAiSWNpcmMiIH0sCisgIHsgMjA3LCAiSXVtbCIgfSwKKyAgeyAyMDgsICJFVEgiIH0sCisgIHsgMjA5LCAiTnRpbGRlIiB9LAorICB7IDIxMCwgIk9ncmF2ZSIgfSwKKyAgeyAyMTEsICJPYWN1dGUiIH0sCisgIHsgMjEyLCAiT2NpcmMiIH0sCisgIHsgMjEzLCAiT3RpbGRlIiB9LAorICB7IDIxNCwgIk91bWwiIH0sCisgIHsgMjE1LCAidGltZXMiIH0sCisgIHsgMjE2LCAiT3NsYXNoIiB9LAorICB7IDIxNywgIlVncmF2ZSIgfSwKKyAgeyAyMTgsICJVYWN1dGUiIH0sCisgIHsgMjE5LCAiVWNpcmMiIH0sCisgIHsgMjIwLCAiVXVtbCIgfSwKKyAgeyAyMjEsICJZYWN1dGUiIH0sCisgIHsgMjIyLCAiVEhPUk4iIH0sCisgIHsgMjIzLCAic3psaWciIH0sCisgIHsgMjI0LCAiYWdyYXZlIiB9LAorICB7IDIyNSwgImFhY3V0ZSIgfSwKKyAgeyAyMjYsICJhY2lyYyIgfSwKKyAgeyAyMjcsICJhdGlsZGUiIH0sCisgIHsgMjI4LCAiYXVtbCIgfSwKKyAgeyAyMjksICJhcmluZyIgfSwKKyAgeyAyMzAsICJhZWxpZyIgfSwKKyAgeyAyMzEsICJjY2VkaWwiIH0sCisgIHsgMjMyLCAiZWdyYXZlIiB9LAorICB7IDIzMywgImVhY3V0ZSIgfSwKKyAgeyAyMzQsICJlY2lyYyIgfSwKKyAgeyAyMzUsICJldW1sIiB9LAorICB7IDIzNiwgImlncmF2ZSIgfSwKKyAgeyAyMzcsICJpYWN1dGUiIH0sCisgIHsgMjM4LCAiaWNpcmMiIH0sCisgIHsgMjM5LCAiaXVtbCIgfSwKKyAgeyAyNDAsICJldGgiIH0sCisgIHsgMjQxLCAibnRpbGRlIiB9LAorICB7IDI0MiwgIm9ncmF2ZSIgfSwKKyAgeyAyNDMsICJvYWN1dGUiIH0sCisgIHsgMjQ0LCAib2NpcmMiIH0sCisgIHsgMjQ1LCAib3RpbGRlIiB9LAorICB7IDI0NiwgIm91bWwiIH0sCisgIHsgMjQ3LCAiZGl2aWRlIiB9LAorICB7IDI0OCwgIm9zbGFzaCIgfSwKKyAgeyAyNDksICJ1Z3JhdmUiIH0sCisgIHsgMjUwLCAidWFjdXRlIiB9LAorICB7IDI1MSwgInVjaXJjIiB9LAorICB7IDI1MiwgInV1bWwiIH0sCisgIHsgMjUzLCAieWFjdXRlIiB9LAorICB7IDI1NCwgInRob3JuIiB9LAorICB7IDI1NSwgInl1bWwiIH0sCisgIHsgICAwLCBOVUxMIH0KK307CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgaF9lcnJvcl9jb2Rlc1tdID0KK3sKKyNpZmRlZiBIT1NUX05PVF9GT1VORCAgIAorICB7IEhPU1RfTk9UX0ZPVU5ELCAiSG9zdCBub3QgZm91bmQiIH0sCisjZW5kaWYKKyNpZmRlZiBUUllfQUdBSU4KKyAgeyBUUllfQUdBSU4sICJUcnkgQWdhaW4iIH0sCisjZW5kaWYKKyNpZmRlZiBOT19SRUNPVkVSWSAgCisgIHsgTk9fUkVDT1ZFUlksICJObyBSZWNvdmVyeSIgfSwKKyNlbmRpZgorI2lmZGVmIE5PX0RBVEEKKyAgeyBOT19EQVRBLCAiTm8gRGF0YSIgfSwKKyNlbmRpZgorI2lmZGVmIE5PX0FERFJFU1MKKyAgeyBOT19BRERSRVNTLCAiTm8gQWRkcmVzcyIgfSwKKyNlbmRpZgorICB7IDAsIE5VTEwgfQorfTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgaF9odHRwX2Vycm9yX2NvZGVzW10gPQoreyB7IDIwMSwgIkNyZWF0ZWQiIH0sCisgIHsgMjAyLCAiQWNjZXB0ZWQiIH0sCisgIHsgMjAzLCAiTm9uLUF1dGhvcml0YXRpdmUgSW5mb3JtYXRpb24iIH0sCisgIHsgMjA0LCAiTm8gQ29udGVudCIgfSwKKyAgeyAyMDUsICJSZXNldCBDb250ZW50IiB9LAorICB7IDIwNiwgIlBhcnRpYWwgQ29udGVudCIgfSwKKyAgeyAzMDAsICJNdWx0aXBsZSBDaG9pY2VzIiB9LAorICB7IDMwMSwgIk1vdmVkIFBlcm1hbmVudGx5IiB9LAorICB7IDMwMiwgIkZvdW5kIiB9LAorICB7IDMwMywgIlNlZSBPdGhlciIgfSwKKyAgeyAzMDQsICJOb3QgTW9kaWZpZWQiIH0sCisgIHsgMzA1LCAiVXNlIFByb3h5IiB9LAorICB7IDMwNywgIlRlbXBvcmFyeSBSZWRpcmVjdCIgfSwKKyAgeyA0MDAsICJCYWQgUmVxdWVzdCIgfSwKKyAgeyA0MDEsICJVbmF1dGhvcml6ZWQiIH0sCisgIHsgNDAyLCAiUGF5bWVudCBSZXF1aXJlZCIgfSwKKyAgeyA0MDMsICJGb3JiaWRkZW4iIH0sCisgIHsgNDA0LCAiTm90IEZvdW5kIiB9LAorICB7IDQwNSwgIk1ldGhvZCBOb3QgQWxsb3dlZCIgfSwKKyAgeyA0MDYsICJOb3QgQWNjZXB0YWJsZSIgfSwKKyAgeyA0MDcsICJQcm94eSBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZCIgfSwKKyAgeyA0MDgsICJSZXF1ZXN0IFRpbWUtb3V0IiB9LAorICB7IDQwOSwgIkNvbmZsaWN0IiB9LAorICB7IDQxMCwgIkdvbmUiIH0sCisgIHsgNDExLCAiTGVuZ3RoIFJlcXVpcmVkIiB9LAorICB7IDQxMiwgIlByZWNvbmRpdGlvbiBGYWlsZWQiIH0sCisgIHsgNDEzLCAiUmVxdWVzdCBFbnRpdHkgVG9vIExhcmdlIiB9LAorICB7IDQxNCwgIlJlcXVlc3QtVVJJIFRvbyBMYXJnZSIgfSwKKyAgeyA0MTUsICJVbnN1cHBvcnRlZCBNZWRpYSBUeXBlIiB9LAorICB7IDQxNiwgIlJlcXVlc3RlZCByYW5nZSBub3Qgc2F0aXNmaWFibGUiIH0sCisgIHsgNDE3LCAiRXhwZWN0YXRpb24gRmFpbGVkIiB9LAorICB7IDUwMCwgIkludGVybmFsIFNlcnZlciBFcnJvciIgfSwKKyAgeyA1MDEsICJOb3QgSW1wbGVtZW50ZWQiIH0sCisgIHsgNTAyLCAiQmFkIEdhdGV3YXkiIH0sCisgIHsgNTAzLCAiU2VydmljZSBVbmF2YWlsYWJsZSIgfSwKKyAgeyA1MDQsICJHYXRld2F5IFRpbWUtb3V0IiB9LAorICB7IDUwNSwgIkhUVFAgVmVyc2lvbiBub3Qgc3VwcG9ydGVkIiB9LAorICB7ICAgMCwgTlVMTCB9Cit9OworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFdJVEhfT1BFTlNTTAorc3RhdGljIGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwIGhfc3NsX2Vycm9yX2NvZGVzW10gPQoreworI2RlZmluZSBfU1NMX0VSUk9SKGUpIHsgZSwgI2UgfQorICBfU1NMX0VSUk9SKFNTTF9FUlJPUl9TU0wpLAorICBfU1NMX0VSUk9SKFNTTF9FUlJPUl9aRVJPX1JFVFVSTiksCisgIF9TU0xfRVJST1IoU1NMX0VSUk9SX1dBTlRfUkVBRCksCisgIF9TU0xfRVJST1IoU1NMX0VSUk9SX1dBTlRfV1JJVEUpLAorICBfU1NMX0VSUk9SKFNTTF9FUlJPUl9XQU5UX0NPTk5FQ1QpLAorICBfU1NMX0VSUk9SKFNTTF9FUlJPUl9XQU5UX1g1MDlfTE9PS1VQKSwKKyAgX1NTTF9FUlJPUihTU0xfRVJST1JfU1lTQ0FMTCksCisgIHsgMCwgTlVMTCB9Cit9OworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCBtaW1lX2NvZGVzW10gPQoreyB7IFNPQVBfTUlNRV83QklULAkJIjdiaXQiIH0sCisgIHsgU09BUF9NSU1FXzhCSVQsCQkiOGJpdCIgfSwKKyAgeyBTT0FQX01JTUVfQklOQVJZLAkJImJpbmFyeSIgfSwKKyAgeyBTT0FQX01JTUVfUVVPVEVEX1BSSU5UQUJMRSwgInF1b3RlZC1wcmludGFibGUiIH0sCisgIHsgU09BUF9NSU1FX0JBU0U2NCwJCSJiYXNlNjQiIH0sCisgIHsgU09BUF9NSU1FX0lFVEZfVE9LRU4sCSJpZXRmLXRva2VuIiB9LAorICB7IFNPQVBfTUlNRV9YX1RPS0VOLAkJIngtdG9rZW4iIH0sCisgIHsgMCwJCQkJTlVMTCB9Cit9OworI2VuZGlmCisKKyNpZmRlZiBXSU4zMgorc3RhdGljIGludCB0Y3BfZG9uZSA9IDA7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorZnNlbmQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBuKQoreyByZWdpc3RlciBpbnQgbndyaXR0ZW47CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgIWRlZmluZWQoV0lUSF9MRUFOKQorICBpZiAoc29hcC0+b3MpCisgIHsgc29hcC0+b3MtPndyaXRlKHMsIG4pOworICAgIGlmIChzb2FwLT5vcy0+Z29vZCgpKQorICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgcmV0dXJuIFNPQVBfRU9GOworICB9CisjZW5kaWYKKyAgd2hpbGUgKG4pCisgIHsgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgICAgeyAKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICBpZiAoc29hcC0+c2VuZF90aW1lb3V0KQorICAgICAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgICAgICBmZF9zZXQgZmQ7CisgICAgICAgIGlmIChzb2FwLT5zZW5kX3RpbWVvdXQgPiAwKQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gc29hcC0+c2VuZF90aW1lb3V0OworICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gLXNvYXAtPnNlbmRfdGltZW91dC8xMDAwMDAwOworICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IC1zb2FwLT5zZW5kX3RpbWVvdXQlMTAwMDAwMDsKKyAgICAgICAgfQorICAgICAgICBGRF9aRVJPKCZmZCk7CisgICAgICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmZmQpOworICAgICAgICBmb3IgKDs7KQorICAgICAgICB7IHJlZ2lzdGVyIGludCByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksIE5VTEwsICZmZCwgJmZkLCAmdGltZW91dCk7CisgICAgICAgICAgaWYgKHIgPiAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgaWYgKCFyKQorICAgICAgICAgIHsgc29hcC0+ZXJybnVtID0gMDsKKyAgICAgICAgICAgIHJldHVybiBTT0FQX0VPRjsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FQUdBSU4pCisgICAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICAgIHJldHVybiBTT0FQX0VPRjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyNlbmRpZgorI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgICAgaWYgKHNvYXAtPnNzbCkKKyAgICAgICAgbndyaXR0ZW4gPSBTU0xfd3JpdGUoc29hcC0+c3NsLCBzLCBuKTsKKyAgICAgIGVsc2UgaWYgKHNvYXAtPmJpbykKKyAgICAgICAgbndyaXR0ZW4gPSBCSU9fd3JpdGUoc29hcC0+YmlvLCBzLCBuKTsKKyAgICAgIGVsc2UKKyNlbmRpZgorI2lmZGVmIFdJVEhfVURQCisgICAgICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgICAgeyBpZiAoc29hcC0+cGVlcmxlbikKKwkgIG53cml0dGVuID0gc2VuZHRvKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHMsIG4sIHNvYXAtPnNvY2tldF9mbGFncywgKHN0cnVjdCBzb2NrYWRkciopJnNvYXAtPnBlZXIsIHNvYXAtPnBlZXJsZW4pOworICAgICAgICBlbHNlCisJICBud3JpdHRlbiA9IHNlbmQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgcywgbiwgc29hcC0+c29ja2V0X2ZsYWdzKTsKKwkvKiByZXRyeSBhbmQgYmFjay1vZmYgYWxnb3JpdGhtICovCisJLyogVE9ETzogdGhpcyBpcyBub3QgdmVyeSBjbGVhciBmcm9tIHNwZWNzIHNvIHZlcmlmeSBhbmQgbGltaXQgY29uZGl0aW9ucyB1bmRlciB3aGljaCB3ZSBzaG91bGQgbG9vcCAoZS5nLiBFTk9CVUZTKSAqLworCWlmIChud3JpdHRlbiA8IDApCisgICAgICAgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgICAgICBmZF9zZXQgZmQ7CisJICBpbnQgdWRwX3JlcGVhdDsKKwkgIGludCB1ZHBfZGVsYXk7CisgICAgICAgICAgaWYgKChzb2FwLT5jb25uZWN0X2ZsYWdzICYgU09fQlJPQURDQVNUKSkKKwkgICAgdWRwX3JlcGVhdCA9IDM7IC8qIFNPQVAtb3Zlci1VRFAgTVVMVElDQVNUX1VEUF9SRVBFQVQgLSAxICovCisgICAgICAgICAgZWxzZQorCSAgICB1ZHBfcmVwZWF0ID0gMTsgLyogU09BUC1vdmVyLVVEUCBVTklDQVNUX1VEUF9SRVBFQVQgLSAxICovCisJICB1ZHBfZGVsYXkgPSAoc29hcF9yYW5kb20gJSAyMDEpICsgNTA7IC8qIFVEUF9NSU5fREVMQVkgLi4gVURQX01BWF9ERUxBWSAqLworCSAgZG8KKyAgICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gMDsKKyAgICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDEwMDAgKiB1ZHBfZGVsYXk7IC8qIG1zICovCisgICAgICAgICAgICBGRF9aRVJPKCZmZCk7CisgICAgICAgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJmZkKTsKKyAgICAgICAgICAgIHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCBOVUxMLCBOVUxMLCAmZmQsICZ0aW1lb3V0KTsKKwkgICAgaWYgKHNvYXAtPnBlZXJsZW4pCisJICAgICAgbndyaXR0ZW4gPSBzZW5kdG8oKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgcywgbiwgc29hcC0+c29ja2V0X2ZsYWdzLCAoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlciwgc29hcC0+cGVlcmxlbik7CisgICAgICAgICAgICBlbHNlCisJICAgICAgbndyaXR0ZW4gPSBzZW5kKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHMsIG4sIHNvYXAtPnNvY2tldF9mbGFncyk7CisJICAgIHVkcF9kZWxheSA8PD0gMTsKKwkgICAgaWYgKHVkcF9kZWxheSA+IDUwMCkgLyogVURQX1VQUEVSX0RFTEFZICovCisJICAgICAgdWRwX2RlbGF5ID0gNTAwOworCSAgfQorCSAgd2hpbGUgKG53cml0dGVuIDwgMCAmJiAtLXVkcF9yZXBlYXQgPiAwKTsKKwl9CisgICAgICB9CisgICAgICBlbHNlCisjZW5kaWYKKyNpZiAhZGVmaW5lZChQQUxNKSAmJiAhZGVmaW5lZChBUzQwMCkKKyAgICAgICAgbndyaXR0ZW4gPSBzZW5kKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHMsIG4sIHNvYXAtPnNvY2tldF9mbGFncyk7CisjZWxzZQorICAgICAgICBud3JpdHRlbiA9IHNlbmQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgKHZvaWQqKXMsIG4sIHNvYXAtPnNvY2tldF9mbGFncyk7CisjZW5kaWYKKyAgICAgIGlmIChud3JpdHRlbiA8PSAwKQorICAgICAgeworI2lmZGVmIFdJVEhfT1BFTlNTTAorCWludCBlcnI7CisgICAgICAgIGlmIChzb2FwLT5zc2wgJiYgKGVyciA9IFNTTF9nZXRfZXJyb3Ioc29hcC0+c3NsLCBud3JpdHRlbikpICE9IFNTTF9FUlJPUl9OT05FICYmIGVyciAhPSBTU0xfRVJST1JfV0FOVF9SRUFEICYmIGVyciAhPSBTU0xfRVJST1JfV0FOVF9XUklURSkKKyAgICAgICAgICByZXR1cm4gU09BUF9FT0Y7CisjZW5kaWYKKyAgICAgICAgaWYgKHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FV09VTERCTE9DSyAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VBR0FJTikKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICByZXR1cm4gU09BUF9FT0Y7CisgICAgICAgIH0KKyAgICAgICAgbndyaXR0ZW4gPSAwOyAvKiBhbmQgY2FsbCB3cml0ZSgpIGFnYWluICovCisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisjaWZkZWYgV0lUSF9GQVNUQ0dJCisgICAgICBud3JpdHRlbiA9IGZ3cml0ZSgodm9pZCopcywgMSwgbiwgc3Rkb3V0KTsKKyAgICAgIGZmbHVzaChzdGRvdXQpOworI2Vsc2UKKyNpZmRlZiBVTkRFUl9DRQorICAgICAgbndyaXR0ZW4gPSBmd3JpdGUocywgMSwgbiwgc29hcC0+c2VuZGZkKTsKKyNlbHNlCisjaWZkZWYgVlhXT1JLUworI2lmZGVmIFdNV19SUE1fSU8KKyAgICAgIGlmIChzb2FwLT5ycG1yZXFpZCkKKyAgICAgICAgbndyaXR0ZW4gPSAoaHR0cEJsb2NrUHV0KHNvYXAtPnJwbXJlcWlkLCBzLCBuKSA9PSAwKSA/IG4gOiAtMTsgCisgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgbndyaXR0ZW4gPSBmd3JpdGUocywgc2l6ZW9mKGNoYXIpLCBuLCBmZG9wZW4oc29hcC0+c2VuZGZkLCAidyIpKTsKKyNlbHNlCisgICAgICBud3JpdHRlbiA9IHdyaXRlKChTT0FQX1NPQ0tFVClzb2FwLT5zZW5kZmQsIHMsIG4pOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorICAgICAgaWYgKG53cml0dGVuIDw9IDApCisgICAgICB7IGlmIChzb2FwX2Vycm5vICE9IFNPQVBfRUlOVFIgJiYgc29hcF9lcnJubyAhPSBTT0FQX0VXT1VMREJMT0NLICYmIHNvYXBfZXJybm8gIT0gU09BUF9FQUdBSU4pCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9lcnJubzsKKyAgICAgICAgICByZXR1cm4gU09BUF9FT0Y7CisgICAgICAgIH0KKyAgICAgICAgbndyaXR0ZW4gPSAwOyAvKiBhbmQgY2FsbCB3cml0ZSgpIGFnYWluICovCisgICAgICB9CisgICAgfQorICAgIG4gLT0gbndyaXR0ZW47CisgICAgcyArPSBud3JpdHRlbjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmRfcmF3KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBzaXplX3QgbikKK3sgaWYgKCFuKQorICAgIHJldHVybiBTT0FQX09LOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICB7IHNvYXAtPmNvdW50ICs9IG47CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgICAgaWYgKHNvYXAtPmZwcmVwYXJlc2VuZCAmJiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pICE9IFNPQVBfSU9fU1RPUkUpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBzb2FwLT5mcHJlcGFyZXNlbmQoc29hcCwgcywgbik7CisjZW5kaWYKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pCisgIHsgcmVnaXN0ZXIgc2l6ZV90IGkgPSBTT0FQX0JVRkxFTiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICB3aGlsZSAobiA+PSBpKQorICAgIHsgbWVtY3B5KHNvYXAtPmJ1ZiArIHNvYXAtPmJ1ZmlkeCwgcywgaSk7CisgICAgICBzb2FwLT5idWZpZHggPSBTT0FQX0JVRkxFTjsKKyAgICAgIGlmIChzb2FwX2ZsdXNoKHNvYXApKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBzICs9IGk7CisgICAgICBuIC09IGk7CisgICAgICBpID0gU09BUF9CVUZMRU47CisgICAgfQorICAgIG1lbWNweShzb2FwLT5idWYgKyBzb2FwLT5idWZpZHgsIHMsIG4pOworICAgIHNvYXAtPmJ1ZmlkeCArPSBuOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIHJldHVybiBzb2FwX2ZsdXNoX3Jhdyhzb2FwLCBzLCBuKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9mbHVzaChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IG4gPSBzb2FwLT5idWZpZHg7CisgIGlmIChuKQorICB7IHNvYXAtPmJ1ZmlkeCA9IDA7CisjaWZkZWYgV0lUSF9aTElCCisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKQorICAgIHsgc29hcC0+ZF9zdHJlYW0ubmV4dF9pbiA9IChCeXRlKilzb2FwLT5idWY7CisgICAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbiA9ICh1bnNpZ25lZCBpbnQpbjsKKyNpZmRlZiBXSVRIX0daSVAKKyAgICAgIHNvYXAtPnpfY3JjID0gY3JjMzIoc29hcC0+el9jcmMsIChCeXRlKilzb2FwLT5idWYsICh1bnNpZ25lZCBpbnQpbik7CisjZW5kaWYKKyAgICAgIGRvCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVmbGF0aW5nICV1IGJ5dGVzXG4iLCBzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbikpOworICAgICAgICBpZiAoZGVmbGF0ZSgmc29hcC0+ZF9zdHJlYW0sIFpfTk9fRkxVU0gpICE9IFpfT0spCisgICAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVbmFibGUgdG8gZGVmbGF0ZTogJXNcbiIsIHNvYXAtPmRfc3RyZWFtLm1zZz9zb2FwLT5kX3N0cmVhbS5tc2c6IiIpKTsKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQpCisgICAgICAgIHsgaWYgKHNvYXBfZmx1c2hfcmF3KHNvYXAsIHNvYXAtPnpfYnVmLCBTT0FQX0JVRkxFTikpCisgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZSopc29hcC0+el9idWY7CisgICAgICAgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0ID0gU09BUF9CVUZMRU47CisgICAgICAgIH0KKyAgICAgIH0gd2hpbGUgKHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgICByZXR1cm4gc29hcF9mbHVzaF9yYXcoc29hcCwgc29hcC0+YnVmLCBuKTsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9mbHVzaF9yYXcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBuKQoreyBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX1NUT1JFKQorICB7IHJlZ2lzdGVyIGNoYXIgKnQ7CisgICAgaWYgKCEodCA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgbikpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgbWVtY3B5KHQsIHMsIG4pOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICAgIGlmIChzb2FwLT5mcHJlcGFyZXNlbmQpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBzb2FwLT5mcHJlcGFyZXNlbmQoc29hcCwgcywgbik7CisjZW5kaWYKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKQorICB7IGNoYXIgdFsxNl07CisgICAgc3ByaW50Zih0LCAiXHJcbiVsWFxyXG4iICsgKHNvYXAtPmNodW5rc2l6ZSA/IDAgOiAyKSwgKHVuc2lnbmVkIGxvbmcpbik7CisgICAgREJHTVNHKFNFTlQsIHQsIHN0cmxlbih0KSk7CisgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZzZW5kKHNvYXAsIHQsIHN0cmxlbih0KSkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIHNvYXAtPmNodW5rc2l6ZSArPSBuOworICB9CisgIERCR01TRyhTRU5ULCBzLCBuKTsKKyNlbmRpZgorICByZXR1cm4gc29hcC0+ZXJyb3IgPSBzb2FwLT5mc2VuZChzb2FwLCBzLCBuKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZW5kKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzKQoreyBpZiAocykKKyAgICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCBzdHJsZW4ocykpOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZW5kMihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKQoreyBpZiAoc29hcF9zZW5kKHNvYXAsIHMxKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX3NlbmQoc29hcCwgczIpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2VuZDMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgY29uc3QgY2hhciAqczMpCit7IGlmIChzb2FwX3NlbmQoc29hcCwgczEpCisgICB8fCBzb2FwX3NlbmQoc29hcCwgczIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfc2VuZChzb2FwLCBzMyk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc2l6ZV90CitmcmVjdihzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqcywgc2l6ZV90IG4pCit7IHJlZ2lzdGVyIGludCByOworICBzb2FwLT5lcnJudW0gPSAwOworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpICYmICFkZWZpbmVkKFdJVEhfTEVBTikKKyAgaWYgKHNvYXAtPmlzKQorICB7IGlmIChzb2FwLT5pcy0+Z29vZCgpKQorICAgICAgcmV0dXJuIHNvYXAtPmlzLT5yZWFkKHMsIG4pLmdjb3VudCgpOworICAgIHJldHVybiAwOworICB9CisjZW5kaWYKKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgIHsgZm9yICg7OykKKyAgICB7IAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIGlmIChzb2FwLT5yZWN2X3RpbWVvdXQpCisgICAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICAgIGZkX3NldCBmZDsKKyAgICAgICAgaWYgKHNvYXAtPnJlY3ZfdGltZW91dCA+IDApCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSBzb2FwLT5yZWN2X3RpbWVvdXQ7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSAtc29hcC0+cmVjdl90aW1lb3V0LzEwMDAwMDA7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gLXNvYXAtPnJlY3ZfdGltZW91dCUxMDAwMDAwOworICAgICAgICB9CisgICAgICAgIEZEX1pFUk8oJmZkKTsKKyAgICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZmZCk7CisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCAmZmQsIE5VTEwsICZmZCwgJnRpbWVvdXQpOworICAgICAgICAgIGlmIChyID4gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGlmICghcikKKwkgIHsgc29hcC0+ZXJybnVtID0gMDsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUiAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VBR0FJTikKKwkgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyNlbmRpZgorI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgICAgaWYgKHNvYXAtPnNzbCkKKyAgICAgIHsgaW50IGVycjsKKwlyID0gU1NMX3JlYWQoc29hcC0+c3NsLCBzLCBuKTsKKyAgICAgICAgaWYgKHIgPiAwKQorICAgICAgICAgIHJldHVybiAoc2l6ZV90KXI7CisJZXJyID0gU1NMX2dldF9lcnJvcihzb2FwLT5zc2wsIHIpOworCWlmIChlcnIgIT0gU1NMX0VSUk9SX05PTkUgJiYgZXJyICE9IFNTTF9FUlJPUl9XQU5UX1JFQUQgJiYgZXJyICE9IFNTTF9FUlJPUl9XQU5UX1dSSVRFKQorICAgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgZWxzZSBpZiAoc29hcC0+YmlvKQorICAgICAgeyByID0gQklPX3JlYWQoc29hcC0+YmlvLCBzLCBuKTsKKyAgICAgICAgaWYgKHIgPiAwKQorICAgICAgICAgIHJldHVybiAoc2l6ZV90KXI7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgZWxzZQorI2VuZGlmCisgICAgICB7IAorI2lmZGVmIFdJVEhfVURQCisgICAgICAgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgICAgIHsgU09BUF9TT0NLTEVOX1QgayA9IChTT0FQX1NPQ0tMRU5fVClzaXplb2Yoc29hcC0+cGVlcik7CisJICBtZW1zZXQoKHZvaWQqKSZzb2FwLT5wZWVyLCAwLCBzaXplb2Yoc29hcC0+cGVlcikpOworICAgICAgICAgIHIgPSByZWN2ZnJvbSgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyLCAmayk7CS8qIHBvcnRhYmlsaXR5IG5vdGU6IHNlZSBTT0FQX1NPQ0tMRU5fVCBkZWZpbml0aW9uIGluIHN0ZHNvYXAyLmggKi8KKwkgIHNvYXAtPnBlZXJsZW4gPSAoc2l6ZV90KWs7CisjaWZuZGVmIFdJVEhfSVBWNgorICAgICAgICAgIHNvYXAtPmlwID0gbnRvaGwoc29hcC0+cGVlci5zaW5fYWRkci5zX2FkZHIpOworICAgICAgICAgIHNvYXAtPnBvcnQgPSAoaW50KW50b2hzKHNvYXAtPnBlZXIuc2luX3BvcnQpOworI2VuZGlmCisgICAgICAgIH0KKwllbHNlCisjZW5kaWYKKyAgICAgICAgICByID0gcmVjdigoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MpOworICAgICAgICBpZiAociA+PSAwKQorICAgICAgICAgIHJldHVybiAoc2l6ZV90KXI7CisgICAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUFHQUlOICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRVdPVUxEQkxPQ0spCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgIH0KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICAgIGZkX3NldCBmZDsKKyAgICAgICAgdGltZW91dC50dl9zZWMgPSAwOworICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAxMDAwMDsKKyAgICAgICAgRkRfWkVSTygmZmQpOworICAgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJmZkKTsKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICAgICAgaWYgKHNvYXAtPnNzbCAmJiBTU0xfZ2V0X2Vycm9yKHNvYXAtPnNzbCwgcikgPT0gU1NMX0VSUk9SX1dBTlRfV1JJVEUpCisgICAgICAgICAgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCBOVUxMLCAmZmQsICZmZCwgJnRpbWVvdXQpOworICAgICAgICBlbHNlCisgICAgICAgICAgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCAmZmQsIE5VTEwsICZmZCwgJnRpbWVvdXQpOworI2Vsc2UKKyAgICAgICAgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCAmZmQsIE5VTEwsICZmZCwgJnRpbWVvdXQpOworI2VuZGlmCisgICAgICAgIGlmIChyIDwgMCAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKyAgICB9CisgIH0KKyNpZmRlZiBXSVRIX0ZBU1RDR0kKKyAgcmV0dXJuIGZyZWFkKHMsIDEsIG4sIHN0ZGluKTsKKyNlbHNlCisjaWZkZWYgVU5ERVJfQ0UKKyAgcmV0dXJuIGZyZWFkKHMsIDEsIG4sIHNvYXAtPnJlY3ZmZCk7CisjZWxzZQorI2lmZGVmIFdNV19SUE1fSU8KKyAgaWYgKHNvYXAtPnJwbXJlcWlkKQorICAgIHIgPSBodHRwQmxvY2tSZWFkKHNvYXAtPnJwbXJlcWlkLCBzLCBuKTsKKyAgZWxzZQorI2VuZGlmCisgIHIgPSByZWFkKChTT0FQX1NPQ0tFVClzb2FwLT5yZWN2ZmQsIHMsIG4pOworICBpZiAociA+PSAwKQorICAgIHJldHVybiAoc2l6ZV90KXI7CisgIHNvYXAtPmVycm51bSA9IHNvYXBfZXJybm87CisgIHJldHVybiAwOworI2VuZGlmCisjZW5kaWYKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHNvYXBfd2NoYXIKK3NvYXBfZ2V0Y2h1bmtjaGFyKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcC0+YnVmaWR4IDwgc29hcC0+YnVmbGVuKQorICAgIHJldHVybiBzb2FwLT5idWZbc29hcC0+YnVmaWR4KytdOworICBzb2FwLT5idWZpZHggPSAwOworICBzb2FwLT5idWZsZW4gPSBzb2FwLT5jaHVua2J1ZmxlbiA9IHNvYXAtPmZyZWN2KHNvYXAsIHNvYXAtPmJ1ZiwgU09BUF9CVUZMRU4pOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlYWQgJXUgYnl0ZXMgZnJvbSBzb2NrZXQgJWRcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+YnVmbGVuLCBzb2FwLT5zb2NrZXQpKTsKKyAgREJHTVNHKFJFQ1YsIHNvYXAtPmJ1Ziwgc29hcC0+YnVmbGVuKTsKKyAgaWYgKHNvYXAtPmJ1ZmxlbikKKyAgICByZXR1cm4gc29hcC0+YnVmW3NvYXAtPmJ1ZmlkeCsrXTsKKyAgcmV0dXJuIEVPRjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc29hcF9pc3hkaWdpdChpbnQgYykKK3sgcmV0dXJuIChjID49ICcwJyAmJiBjIDw9ICc5JykgfHwgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKSB8fCAoYyA+PSAnYScgJiYgYyA8PSAnZicpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlY3ZfcmF3KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzaXplX3QgcmV0OworI2lmZGVmIFdJVEhfWkxJQgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIpCisgIHsgaWYgKHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID09IFpfTlVMTCkKKyAgICAgIHJldHVybiBFT0Y7CisgICAgaWYgKHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luIHx8ICFzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQpCisgICAgeyByZWdpc3RlciBpbnQgcjsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5mbGF0aW5nXG4iKSk7CisgICAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IChCeXRlKilzb2FwLT5idWY7CisgICAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgPSBTT0FQX0JVRkxFTjsKKyAgICAgIHIgPSBpbmZsYXRlKCZzb2FwLT5kX3N0cmVhbSwgWl9OT19GTFVTSCk7CisgICAgICBpZiAociA9PSBaX09LIHx8IHIgPT0gWl9TVFJFQU1fRU5EKQorICAgICAgeyBzb2FwLT5idWZpZHggPSAwOworICAgICAgICBzb2FwLT5idWZsZW4gPSBTT0FQX0JVRkxFTiAtIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dDsKKyAgICAgICAgaWYgKHNvYXAtPnpsaWJfaW4gPT0gU09BUF9aTElCX0daSVApCisgICAgICAgICAgc29hcC0+el9jcmMgPSBjcmMzMihzb2FwLT56X2NyYywgKEJ5dGUqKXNvYXAtPmJ1ZiwgKHVuc2lnbmVkIGludClzb2FwLT5idWZsZW4pOworICAgICAgICBpZiAociA9PSBaX1NUUkVBTV9FTkQpCisgICAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbmZsYXRlZCAlbHUtPiVsdSBieXRlc1xuIiwgc29hcC0+ZF9zdHJlYW0udG90YWxfaW4sIHNvYXAtPmRfc3RyZWFtLnRvdGFsX291dCkpOworICAgICAgICAgIHNvYXAtPnpfcmF0aW9faW4gPSAoZmxvYXQpc29hcC0+ZF9zdHJlYW0udG90YWxfaW4gLyAoZmxvYXQpc29hcC0+ZF9zdHJlYW0udG90YWxfb3V0OworICAgICAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gWl9OVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChzb2FwLT5idWZsZW4pCisgICAgICAgIHsgc29hcC0+Y291bnQgKz0gc29hcC0+YnVmbGVuOworICAgICAgICAgIHJldHVybiBTT0FQX09LOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmIChyICE9IFpfQlVGX0VSUk9SKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluZmxhdGUgZXJyb3I6ICVzXG4iLCBzb2FwLT5kX3N0cmVhbS5tc2c/c29hcC0+ZF9zdHJlYW0ubXNnOiIiKSk7CisgICAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gWl9OVUxMOworCXNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgICByZXR1cm4gRU9GOworICAgICAgfQorICAgIH0KK3psaWJfYWdhaW46CisgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSyAmJiAhc29hcC0+Y2h1bmtzaXplKQorICAgIHsgbWVtY3B5KHNvYXAtPmJ1Ziwgc29hcC0+el9idWYsIFNPQVBfQlVGTEVOKTsKKyAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPnpfYnVmbGVuOworICAgIH0KKyAgfQorI2VuZGlmCisjaWZuZGVmIFdJVEhfTk9IVFRQCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspIC8qIHJlYWQgSFRUUCBjaHVua2VkIHRyYW5zZmVyICovCisgIHsgCitjaHVua19hZ2FpbjoKKyAgICBpZiAoc29hcC0+Y2h1bmtzaXplKQorICAgIHsgc29hcC0+YnVmbGVuID0gcmV0ID0gc29hcC0+ZnJlY3Yoc29hcCwgc29hcC0+YnVmLCBzb2FwLT5jaHVua3NpemUgPiBTT0FQX0JVRkxFTiA/IFNPQVBfQlVGTEVOIDogc29hcC0+Y2h1bmtzaXplKTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR2V0dGluZyBjaHVuazogcmVhZCAldSBieXRlc1xuIiwgKHVuc2lnbmVkIGludClyZXQpKTsKKyAgICAgIERCR01TRyhSRUNWLCBzb2FwLT5idWYsIHJldCk7CisgICAgICBzb2FwLT5idWZpZHggPSAwOworICAgICAgc29hcC0+Y2h1bmtzaXplIC09IHJldDsKKyAgICB9CisgICAgZWxzZQorICAgIHsgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICAgICAgY2hhciAqdCwgdG1wWzhdOworICAgICAgdCA9IHRtcDsKKyAgICAgIGlmICghc29hcC0+Y2h1bmtidWZsZW4pCisgICAgICB7IHNvYXAtPmNodW5rYnVmbGVuID0gcmV0ID0gc29hcC0+ZnJlY3Yoc29hcCwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTik7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVhZCAldSBieXRlcyAoY2h1bmtlZCkgZnJvbSBzb2NrZXQgJWRcbiIsICh1bnNpZ25lZCBpbnQpcmV0LCBzb2FwLT5zb2NrZXQpKTsKKyAgICAgICAgREJHTVNHKFJFQ1YsIHNvYXAtPmJ1ZiwgcmV0KTsKKyAgICAgICAgc29hcC0+YnVmaWR4ID0gMDsKKyAgICAgICAgaWYgKCFyZXQpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmFoZWFkID0gRU9GOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBzb2FwLT5idWZpZHggPSBzb2FwLT5idWZsZW47CisgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5jaHVua2J1ZmxlbjsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR2V0dGluZyBjaHVuayBzaXplIChpZHg9JXUgbGVuPSV1KVxuIiwgKHVuc2lnbmVkIGludClzb2FwLT5idWZpZHgsICh1bnNpZ25lZCBpbnQpc29hcC0+YnVmbGVuKSk7CisgICAgICB3aGlsZSAoIXNvYXBfaXN4ZGlnaXQoKGludCkoYyA9IHNvYXBfZ2V0Y2h1bmtjaGFyKHNvYXApKSkpCisgICAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorCSAgcmV0dXJuIHNvYXAtPmFoZWFkID0gRU9GOworICAgICAgZG8KKyAgICAgICAgKnQrKyA9IChjaGFyKWM7CisgICAgICB3aGlsZSAoc29hcF9pc3hkaWdpdCgoaW50KShjID0gc29hcF9nZXRjaHVua2NoYXIoc29hcCkpKSAmJiB0IC0gdG1wIDwgNyk7CisgICAgICB3aGlsZSAoKGludCljICE9IEVPRiAmJiBjICE9ICdcbicpCisgICAgICAgIGMgPSBzb2FwX2dldGNodW5rY2hhcihzb2FwKTsKKyAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICByZXR1cm4gc29hcC0+YWhlYWQgPSBFT0Y7CisgICAgICAqdCA9ICdcMCc7CisgICAgICBzb2FwLT5jaHVua3NpemUgPSBzb2FwX3N0cnRvdWwodG1wLCAmdCwgMTYpOworICAgICAgaWYgKCFzb2FwLT5jaHVua3NpemUpCisgICAgICB7IHNvYXAtPmNodW5rYnVmbGVuID0gMDsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgb2YgY2h1bmtlZCBtZXNzYWdlXG4iKSk7CisJd2hpbGUgKChpbnQpYyAhPSBFT0YgJiYgYyAhPSAnXG4nKQorICAgICAgICAgIGMgPSBzb2FwX2dldGNodW5rY2hhcihzb2FwKTsKKyAgICAgICAgcmV0dXJuIHNvYXAtPmFoZWFkID0gRU9GOworICAgICAgfQorICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+YnVmaWR4ICsgc29hcC0+Y2h1bmtzaXplOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJNb3ZpbmcgYnVmIGxlbiB0byBpZHg9JXUgbGVuPSV1ICglcylcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+YnVmaWR4LCAodW5zaWduZWQgaW50KXNvYXAtPmJ1ZmxlbiwgdG1wKSk7CisgICAgICBpZiAoc29hcC0+YnVmbGVuID4gc29hcC0+Y2h1bmtidWZsZW4pCisgICAgICB7IHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmNodW5rYnVmbGVuOworICAgICAgICBzb2FwLT5jaHVua3NpemUgLT0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgICAgICBzb2FwLT5jaHVua2J1ZmxlbiA9IDA7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUGFzc2VkIGVuZCBvZiBidWZmZXIgZm9yIGNodW5rZWQgSFRUUCAoJXUgYnl0ZXMgbGVmdClcbiIsICh1bnNpZ25lZCBpbnQpKHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeCkpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHNvYXAtPmNodW5rYnVmbGVuKQorICAgICAgICBzb2FwLT5jaHVua3NpemUgPSAwOworICAgICAgcmV0ID0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgICAgaWYgKCFyZXQpCisgICAgICAgIGdvdG8gY2h1bmtfYWdhaW47CisgICAgfQorICB9CisgIGVsc2UKKyNlbmRpZgorICB7IHNvYXAtPmJ1ZmlkeCA9IDA7CisgICAgc29hcC0+YnVmbGVuID0gcmV0ID0gc29hcC0+ZnJlY3Yoc29hcCwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTik7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWFkICV1IGJ5dGVzIGZyb20gc29ja2V0ICVkXG4iLCAodW5zaWduZWQgaW50KXJldCwgc29hcC0+c29ja2V0KSk7CisgICAgREJHTVNHKFJFQ1YsIHNvYXAtPmJ1ZiwgcmV0KTsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+ZnByZXBhcmVyZWN2ICYmIChzb2FwLT5lcnJvciA9IHNvYXAtPmZwcmVwYXJlcmVjdihzb2FwLCBzb2FwLT5idWYsIHJldCkpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNlbmRpZgorI2lmZGVmIFdJVEhfWkxJQgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIpCisgIHsgcmVnaXN0ZXIgaW50IHI7CisgICAgbWVtY3B5KHNvYXAtPnpfYnVmLCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOKTsKKyAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X2luID0gKEJ5dGUqKShzb2FwLT56X2J1ZiArIHNvYXAtPmJ1ZmlkeCk7CisgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4gPSAodW5zaWduZWQgaW50KXJldDsKKyAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IChCeXRlKilzb2FwLT5idWY7CisgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0ID0gU09BUF9CVUZMRU47CisgICAgciA9IGluZmxhdGUoJnNvYXAtPmRfc3RyZWFtLCBaX05PX0ZMVVNIKTsKKyAgICBpZiAociA9PSBaX09LIHx8IHIgPT0gWl9TVFJFQU1fRU5EKQorICAgIHsgc29hcC0+YnVmaWR4ID0gMDsKKyAgICAgIHNvYXAtPnpfYnVmbGVuID0gc29hcC0+YnVmbGVuOworICAgICAgc29hcC0+YnVmbGVuID0gcmV0ID0gU09BUF9CVUZMRU4gLSBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQ7CisgICAgICBpZiAoc29hcC0+emxpYl9pbiA9PSBTT0FQX1pMSUJfR1pJUCkKKyAgICAgICAgc29hcC0+el9jcmMgPSBjcmMzMihzb2FwLT56X2NyYywgKEJ5dGUqKXNvYXAtPmJ1ZiwgKHVuc2lnbmVkIGludClzb2FwLT5idWZsZW4pOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbmZsYXRlZCAldSBieXRlc1xuIiwgKHVuc2lnbmVkIGludClyZXQpKTsKKyAgICAgIGlmICghcmV0KQorICAgICAgICBnb3RvIHpsaWJfYWdhaW47CisgICAgICBpZiAociA9PSBaX1NUUkVBTV9FTkQpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5mbGF0ZWQgJWx1LT4lbHUgYnl0ZXNcbiIsIHNvYXAtPmRfc3RyZWFtLnRvdGFsX2luLCBzb2FwLT5kX3N0cmVhbS50b3RhbF9vdXQpKTsKKyAgICAgICAgc29hcC0+el9yYXRpb19pbiA9IChmbG9hdClzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiAvIChmbG9hdClzb2FwLT5kX3N0cmVhbS50b3RhbF9vdXQ7CisgICAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gWl9OVUxMOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVuYWJsZSB0byBpbmZsYXRlOiAoJWQpICVzXG4iLCByLCBzb2FwLT5kX3N0cmVhbS5tc2c/c29hcC0+ZF9zdHJlYW0ubXNnOiIiKSk7CisgICAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IFpfTlVMTDsKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgcmV0dXJuIEVPRjsKKyAgICB9CisgIH0KKyNlbmRpZgorICBzb2FwLT5jb3VudCArPSByZXQ7CisgIHJldHVybiAhcmV0OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlY3Yoc3RydWN0IHNvYXAgKnNvYXApCit7IAorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpCisgIHsgaWYgKHNvYXAtPmRpbWUuYnVmbGVuKQorICAgIHsgY2hhciAqczsKKyAgICAgIGludCBpOworICAgICAgdW5zaWduZWQgY2hhciB0bXBbMTJdOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJESU1FIGhkciBmb3IgY2h1bmtlZCBESU1FIGlzIGluIGJ1ZmZlclxuIikpOworICAgICAgc29hcC0+Y291bnQgKz0gc29hcC0+ZGltZS5idWZsZW4gLSBzb2FwLT5idWZsZW47CisgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5kaW1lLmJ1ZmxlbjsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2tpcCBwYWRkaW5nICglbGQgYnl0ZXMpXG4iLCAtKGxvbmcpc29hcC0+ZGltZS5zaXplJjMpKTsKKyAgICAgIGZvciAoaSA9IC0obG9uZylzb2FwLT5kaW1lLnNpemUmMzsgaSA+IDA7IGktLSkKKyAgICAgIHsgc29hcC0+YnVmaWR4Kys7CisgICAgICAgIGlmIChzb2FwLT5idWZpZHggPj0gc29hcC0+YnVmbGVuKQorICAgICAgICAgIGlmIChzb2FwX3JlY3ZfcmF3KHNvYXApKQorICAgICAgICAgICAgcmV0dXJuIEVPRjsKKyAgICAgIH0KKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR2V0IERJTUUgaGRyIGZvciBuZXh0IGNodW5rXG4iKSk7CisgICAgICBzID0gKGNoYXIqKXRtcDsKKyAgICAgIGZvciAoaSA9IDEyOyBpID4gMDsgaS0tKQorICAgICAgeyAqcysrID0gc29hcC0+YnVmW3NvYXAtPmJ1ZmlkeCsrXTsKKyAgICAgICAgaWYgKHNvYXAtPmJ1ZmlkeCA+PSBzb2FwLT5idWZsZW4pCisgICAgICAgICAgaWYgKHNvYXBfcmVjdl9yYXcoc29hcCkpCisgICAgICAgICAgICByZXR1cm4gRU9GOworICAgICAgfQorICAgICAgc29hcC0+ZGltZS5mbGFncyA9IHRtcFswXSAmIDB4NzsKKyAgICAgIHNvYXAtPmRpbWUuc2l6ZSA9ICgoc2l6ZV90KXRtcFs4XSA8PCAyNCkgfCAoKHNpemVfdCl0bXBbOV0gPDwgMTYpIHwgKChzaXplX3QpdG1wWzEwXSA8PCA4KSB8ICgoc2l6ZV90KXRtcFsxMV0pOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHZXQgRElNRSBjaHVuayAoJXUgYnl0ZXMpXG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmRpbWUuc2l6ZSkpOworICAgICAgaWYgKHNvYXAtPmRpbWUuZmxhZ3MgJiBTT0FQX0RJTUVfQ0YpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTW9yZSBjaHVua2luZ1xuIikpOworICAgICAgICBzb2FwLT5kaW1lLmNodW5rc2l6ZSA9IHNvYXAtPmRpbWUuc2l6ZTsKKyAgICAgICAgaWYgKHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeCA+PSBzb2FwLT5kaW1lLnNpemUpCisgICAgICAgIHsgc29hcC0+ZGltZS5idWZsZW4gPSBzb2FwLT5idWZsZW47CisgICAgICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+YnVmaWR4ICsgc29hcC0+ZGltZS5jaHVua3NpemU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHNvYXAtPmRpbWUuY2h1bmtzaXplIC09IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJMYXN0IGNodW5rXG4iKSk7CisgICAgICAgIHNvYXAtPmRpbWUuYnVmbGVuID0gMDsKKyAgICAgICAgc29hcC0+ZGltZS5jaHVua3NpemUgPSAwOworICAgICAgfQorICAgICAgc29hcC0+Y291bnQgPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIiV1IGJ5dGVzIHJlbWFpbmluZ1xuIiwgKHVuc2lnbmVkIGludClzb2FwLT5jb3VudCkpOworICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgfQorICAgIGlmIChzb2FwLT5kaW1lLmNodW5rc2l6ZSkKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR2V0IG5leHQgRElNRSBoZHIgZm9yIGNodW5rZWQgRElNRSAoJXUgYnl0ZXMgY2h1bmspXG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmRpbWUuY2h1bmtzaXplKSk7CisgICAgICBpZiAoc29hcF9yZWN2X3Jhdyhzb2FwKSkKKyAgICAgICAgcmV0dXJuIEVPRjsKKyAgICAgIGlmIChzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHggPj0gc29hcC0+ZGltZS5jaHVua3NpemUpCisgICAgICB7IHNvYXAtPmRpbWUuYnVmbGVuID0gc29hcC0+YnVmbGVuOworICAgICAgICBzb2FwLT5jb3VudCAtPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHggLSBzb2FwLT5kaW1lLmNodW5rc2l6ZTsKKyAgICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+YnVmaWR4ICsgc29hcC0+ZGltZS5jaHVua3NpemU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHNvYXAtPmRpbWUuY2h1bmtzaXplIC09IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiJWx1IGJ5dGVzIHJlbWFpbmluZywgY291bnQ9JXVcbiIsICh1bnNpZ25lZCBsb25nKShzb2FwLT5idWZsZW4tc29hcC0+YnVmaWR4KSwgKHVuc2lnbmVkIGludClzb2FwLT5jb3VudCkpOworICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgfQorICB9CisjZW5kaWYKKyAgcmV0dXJuIHNvYXBfcmVjdl9yYXcoc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzb2FwX3djaGFyCitTT0FQX0ZNQUMyCitzb2FwX2dldGNoYXIoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgYyA9IHNvYXAtPmFoZWFkOworICBpZiAoYykKKyAgeyBpZiAoYyAhPSBFT0YpCisgICAgICBzb2FwLT5haGVhZCA9IDA7CisgICAgcmV0dXJuIGM7CisgIH0KKyAgcmV0dXJuIHNvYXBfZ2V0MShzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwKgorU09BUF9GTUFDMgorc29hcF9jb2RlKGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwICptYXAsIGNvbnN0IGNoYXIgKnN0cikKK3sgaWYgKHN0cikKKyAgeyB3aGlsZSAobWFwLT5zdHJpbmcpCisgICAgeyBpZiAoIXN0cmNtcChzdHIsIG1hcC0+c3RyaW5nKSkgLyogY2FzZSBzZW5zaXRpdmUgKi8KKyAgICAgICAgcmV0dXJuIG1hcDsKKyAgICAgIG1hcCsrOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2xvbmcKK1NPQVBfRk1BQzIKK3NvYXBfaW50X2NvZGUoY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgKm1hcCwgY29uc3QgY2hhciAqc3RyLCBsb25nIG90aGVyKQoreyB3aGlsZSAobWFwLT5zdHJpbmcpCisgIHsgaWYgKCFzb2FwX3RhZ19jbXAoc3RyLCBtYXAtPnN0cmluZykpIC8qIGNhc2UgaW5zZW5zaXRpdmUgKi8KKyAgICAgIHJldHVybiBtYXAtPmNvZGU7CisgICAgbWFwKys7CisgIH0KKyAgcmV0dXJuIG90aGVyOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfc3RyX2NvZGUoY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgKm1hcCwgbG9uZyBjb2RlKQoreyB3aGlsZSAobWFwLT5jb2RlICE9IGNvZGUgJiYgbWFwLT5zdHJpbmcpCisgICAgbWFwKys7CisgIHJldHVybiBtYXAtPnN0cmluZzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzb2FwX3djaGFyCitzb2FwX2NoYXIoc3RydWN0IHNvYXAgKnNvYXApCit7IGNoYXIgdG1wWzhdOworICByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICByZWdpc3RlciBjaGFyICpzID0gdG1wOworICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQorICB7IGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgaWYgKGMgPT0gJzsnIHx8IChpbnQpYyA9PSBFT0YpCisgICAgICBicmVhazsKKyAgICAqcysrID0gKGNoYXIpYzsKKyAgfQorICAqcyA9ICdcMCc7CisgIGlmICgqdG1wID09ICcjJykKKyAgeyBpZiAodG1wWzFdID09ICd4JyB8fCB0bXBbMV0gPT0gJ1gnKQorICAgICAgcmV0dXJuIHNvYXBfc3RydG9sKHRtcCArIDIsIE5VTEwsIDE2KTsKKyAgICByZXR1cm4gYXRvbCh0bXAgKyAxKTsKKyAgfQorICBpZiAoIXN0cmNtcCh0bXAsICJsdCIpKQorICAgIHJldHVybiAnPCc7CisgIGlmICghc3RyY21wKHRtcCwgImd0IikpCisgICAgcmV0dXJuICc+JzsKKyAgaWYgKCFzdHJjbXAodG1wLCAiYW1wIikpCisgICAgcmV0dXJuICcmJzsKKyAgaWYgKCFzdHJjbXAodG1wLCAicXVvdCIpKQorICAgIHJldHVybiAnIic7CisgIGlmICghc3RyY21wKHRtcCwgImFwb3MiKSkKKyAgICByZXR1cm4gJ1wnJzsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIHJldHVybiAoc29hcF93Y2hhcilzb2FwX2ludF9jb2RlKGh0bWxfZW50aXR5X2NvZGVzLCB0bXAsIFNPQVBfVU5LTk9XTl9DSEFSKTsKKyNlbHNlCisgIHJldHVybiBTT0FQX1VOS05PV05fQ0hBUjsgLyogdXNlIHRoaXMgdG8gcmVwcmVzZW50IHVua25vd24gY29kZSAqLworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBXSVRIX0xFQU4KK3NvYXBfd2NoYXIKK3NvYXBfZ2V0MChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXAtPmJ1ZmlkeCA+PSBzb2FwLT5idWZsZW4gJiYgc29hcF9yZWN2KHNvYXApKQorICAgIHJldHVybiBFT0Y7CisgIHJldHVybiAodW5zaWduZWQgY2hhcilzb2FwLT5idWZbc29hcC0+YnVmaWR4XTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFdJVEhfTEVBTgorc29hcF93Y2hhcgorc29hcF9nZXQxKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcC0+YnVmaWR4ID49IHNvYXAtPmJ1ZmxlbiAmJiBzb2FwX3JlY3Yoc29hcCkpCisgICAgcmV0dXJuIEVPRjsKKyAgcmV0dXJuICh1bnNpZ25lZCBjaGFyKXNvYXAtPmJ1Zltzb2FwLT5idWZpZHgrK107Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzb2FwX3djaGFyCitTT0FQX0ZNQUMyCitzb2FwX2dldChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICBjID0gc29hcC0+YWhlYWQ7CisgIGlmIChjKQorICB7IGlmIChjICE9IEVPRikKKyAgICAgIHNvYXAtPmFoZWFkID0gMDsKKyAgfQorICBlbHNlCisgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgZm9yICg7OykKKyAgeyBpZiAoc29hcC0+Y2RhdGEpCisgICAgeyBpZiAoYyA9PSAnXScpCisgICAgICB7IGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICAgIGlmIChjID09ICddJykKKyAgICAgICAgeyBzb2FwLT5jZGF0YSA9IDA7CisgICAgICAgICAgc29hcF9nZXQxKHNvYXApOyAvKiBza2lwID4gKi8KKyAgICAgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgICB9CisJZWxzZQorICAgICAgICB7IHNvYXBfcmV2Z2V0MShzb2FwKTsKKyAgICAgICAgICByZXR1cm4gJ10nOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBjOworICAgIH0KKyAgICBzd2l0Y2ggKGMpCisgICAgeyBjYXNlICc8JzoKKyAgICAgICAgZG8gYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgICAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworICAgICAgICBpZiAoYyA9PSAnIScgfHwgYyA9PSAnPycgfHwgYyA9PSAnJScpCisgICAgICAgIHsgcmVnaXN0ZXIgaW50IGsgPSAxOworCSAgaWYgKGMgPT0gJyEnKQorICAgICAgICAgIHsgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgICAgICAgIGlmIChjID09ICdbJykKKyAgICAgICAgICAgIHsgZG8gYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgICAgICAgICAgd2hpbGUgKChpbnQpYyAhPSBFT0YgJiYgYyAhPSAnWycpOworICAgICAgICAgICAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgc29hcC0+Y2RhdGEgPSAxOworICAgICAgICAgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworCSAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGMgPT0gJy0nICYmIChjID0gc29hcF9nZXQxKHNvYXApKSA9PSAnLScpCisgICAgICAgICAgICB7IGRvCisgICAgICAgICAgICAgIHsgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAnLScgJiYgKGMgPSBzb2FwX2dldDEoc29hcCkpID09ICctJykKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9IHdoaWxlICgoaW50KWMgIT0gRU9GKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisJICBlbHNlIGlmIChjID09ICc/JykKKyAgICAgICAgICAgIGMgPSBzb2FwX2dldF9waShzb2FwKTsKKyAgICAgICAgICB3aGlsZSAoKGludCljICE9IEVPRikKKyAgICAgICAgICB7IGlmIChjID09ICc8JykKKwkgICAgICBrKys7CisJICAgIGVsc2UgaWYgKGMgPT0gJz4nKQorCSAgICB7IGlmICgtLWsgPD0gMCkKKwkgICAgICAgIGJyZWFrOworCSAgICB9CisJICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisJICB9CisJICBpZiAoKGludCljID09IEVPRikKKwkgICAgYnJlYWs7CisgICAgICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYyA9PSAnLycpCisgICAgICAgICAgcmV0dXJuIFNPQVBfVFQ7CisgICAgICAgIHNvYXBfcmV2Z2V0MShzb2FwKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfTFQ7CisgICAgICBjYXNlICc+JzoKKyAgICAgICAgcmV0dXJuIFNPQVBfR1Q7CisgICAgICBjYXNlICciJzoKKyAgICAgICAgcmV0dXJuIFNPQVBfUVQ7CisgICAgICBjYXNlICdcJyc6CisgICAgICAgIHJldHVybiBTT0FQX0FQOworICAgICAgY2FzZSAnJic6CisgICAgICAgIHJldHVybiBzb2FwX2NoYXIoc29hcCkgfCAweDgwMDAwMDAwOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gYzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzb2FwX3djaGFyCitzb2FwX2dldF9waShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgY2hhciBidWZbNjRdOworICByZWdpc3RlciBjaGFyICpzID0gYnVmOworICByZWdpc3RlciBpbnQgaSA9IHNpemVvZihidWYpOworICByZWdpc3RlciBzb2FwX3djaGFyIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgIC8qIFRoaXMgaXMgYSBxdWljayB3YXkgdG8gcGFyc2UgWE1MIFBJIGFuZCB3ZSBjb3VsZCB1c2UgYSBjYWxsYmFjayBpbnN0ZWFkIHRvCisgICAqIGVuYWJsZSBhcHBsaWNhdGlvbnMgdG8gaW50ZXJjZXB0IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zICovCisgIHdoaWxlICgoaW50KWMgIT0gRU9GICYmIGMgIT0gJz8nKQorICB7IGlmICgtLWkgPiAwKQorICAgIHsgaWYgKHNvYXBfYmxhbmsoYykpCisgICAgICAgIGMgPSAnICc7CisgICAgICAqcysrID0gKGNoYXIpYzsKKyAgICB9CisgICAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgfQorICAqcyA9ICdcMCc7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiWE1MIFBJIDw/JXM/PlxuIiwgYnVmKSk7CisgIGlmICghc3RybmNtcChidWYsICJ4bWwgIiwgNCkpCisgIHsgcyA9IHN0cnN0cihidWYsICIgZW5jb2Rpbmc9Iik7CisgICAgaWYgKHMgJiYgc1sxMF0pCisgICAgeyBpZiAoIXNvYXBfdGFnX2NtcChzICsgMTEsICJpc28tODg1OS0xKiIpCisgICAgICAgfHwgIXNvYXBfdGFnX2NtcChzICsgMTEsICJsYXRpbjEqIikpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU3dpdGNoaW5nIHRvIGxhdGluMSBlbmNvZGluZ1xuIikpOworICAgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX0xBVElOOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChzICsgMTEsICJ1dGYtOCoiKSkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTd2l0Y2hpbmcgdG8gdXRmLTggZW5jb2RpbmdcbiIpKTsKKyAgICAgICAgc29hcC0+bW9kZSAmPSB+U09BUF9FTkNfTEFUSU47CisgICAgICB9CisgICAgfQorICB9CisgIGlmICgoaW50KWMgIT0gRU9GKQorICAgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgIHJldHVybiBjOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX21vdmUoc3RydWN0IHNvYXAgKnNvYXAsIGxvbmcgbikKK3sgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJNb3ZpbmcgJWxkIGJ5dGVzIGZvcndhcmRcbiIsIChsb25nKW4pKTsKKyAgZm9yICg7IG4gPiAwOyBuLS0pCisgICAgaWYgKChpbnQpc29hcF9nZXRjaGFyKHNvYXApID09IEVPRikKKyAgICAgIHJldHVybiBTT0FQX0VPRjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3NpemVfdAorU09BUF9GTUFDMgorc29hcF90ZWxsKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZXR1cm4gc29hcC0+Y291bnQgLSBzb2FwLT5idWZsZW4gKyBzb2FwLT5idWZpZHggLSAoc29hcC0+YWhlYWQgIT0gMCk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXR1dGY4KHN0cnVjdCBzb2FwICpzb2FwLCByZWdpc3RlciB1bnNpZ25lZCBsb25nIGMpCit7IGNoYXIgdG1wWzE2XTsKKyAgaWYgKGMgPiAwICYmIGMgPCAweDgwKQorICB7ICp0bXAgPSAoY2hhciljOworICAgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsIHRtcCwgMSk7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICB7IHJlZ2lzdGVyIGNoYXIgKnQgPSB0bXA7CisgICAgaWYgKGMgPCAweDA4MDApCisgICAgICAqdCsrID0gKGNoYXIpKDB4QzAgfCAoKGMgPj4gNikgJiAweDFGKSk7CisgICAgZWxzZQorICAgIHsgaWYgKGMgPCAweDAxMDAwMCkKKyAgICAgICAgKnQrKyA9IChjaGFyKSgweEUwIHwgKChjID4+IDEyKSAmIDB4MEYpKTsKKyAgICAgIGVsc2UKKyAgICAgIHsgaWYgKGMgPCAweDIwMDAwMCkKKyAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjAgfCAoKGMgPj4gMTgpICYgMHgwNykpOworICAgICAgICBlbHNlCisgICAgICAgIHsgaWYgKGMgPCAweDA0MDAwMDAwKQorICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEY4IHwgKChjID4+IDI0KSAmIDB4MDMpKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeyAqdCsrID0gKGNoYXIpKDB4RkMgfCAoKGMgPj4gMzApICYgMHgwMSkpOworICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDI0KSAmIDB4M0YpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDE4KSAmIDB4M0YpKTsKKyAgICAgICAgfSAgICAgCisgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAxMikgJiAweDNGKSk7CisgICAgICB9CisgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gNikgJiAweDNGKSk7CisgICAgfQorICAgICp0KysgPSAoY2hhcikoMHg4MCB8IChjICYgMHgzRikpOworICAgICp0ID0gJ1wwJzsKKyAgfQorICBlbHNlCisjZW5kaWYKKyAgICBzcHJpbnRmKHRtcCwgIiYjJWx1OyIsIGMpOworICByZXR1cm4gc29hcF9zZW5kKHNvYXAsIHRtcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzb2FwX3djaGFyCitTT0FQX0ZNQUMyCitzb2FwX2dldHV0Zjgoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYywgYzEsIGMyLCBjMywgYzQ7CisgIGMgPSBzb2FwLT5haGVhZDsKKyAgaWYgKGMgPiAweEZGKQorICB7IHNvYXAtPmFoZWFkID0gMDsKKyAgICByZXR1cm4gYzsKKyAgfQorYWdhaW46CisgIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgaWYgKGMgPCAweDgwIHx8IChzb2FwLT5tb2RlICYgU09BUF9FTkNfTEFUSU4pKQorICAgIHJldHVybiBjOworICBjMSA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgaWYgKGMxIDwgMHg4MCkKKyAgeyBzb2FwX3JldmdldDEoc29hcCk7IC8qIGRvZXNuJ3QgbG9vayBsaWtlIHRoaXMgaXMgVVRGOCAqLworICAgIHJldHVybiBjOworICB9CisgIGMxICY9IDB4M0Y7CisgIGlmIChjIDwgMHhFMCkKKyAgICByZXR1cm4gKChzb2FwX3djaGFyKShjICYgMHgxRikgPDwgNikgfCBjMTsKKyAgYzIgPSAoc29hcF93Y2hhcilzb2FwX2dldDEoc29hcCkgJiAweDNGOworICBpZiAoYyA9PSAweEVGICYmIGMxID09IDB4M0IgJiYgYzIgPT0gMHgzRikJLyogaWdub3JlIFVURi04IEJPTSAqLworICAgIGdvdG8gYWdhaW47CisgIGlmIChjIDwgMHhGMCkKKyAgICByZXR1cm4gKChzb2FwX3djaGFyKShjICYgMHgwRikgPDwgMTIpIHwgKGMxIDw8IDYpIHwgYzI7CisgIGMzID0gKHNvYXBfd2NoYXIpc29hcF9nZXQxKHNvYXApICYgMHgzRjsKKyAgaWYgKGMgPCAweEY4KQorICAgIHJldHVybiAoKHNvYXBfd2NoYXIpKGMgJiAweDA3KSA8PCAxOCkgfCAoYzEgPDwgMTIpIHwgKGMyIDw8IDYpIHwgYzM7CisgIGM0ID0gKHNvYXBfd2NoYXIpc29hcF9nZXQxKHNvYXApICYgMHgzRjsKKyAgaWYgKGMgPCAweEZDKQorICAgIHJldHVybiAoKHNvYXBfd2NoYXIpKGMgJiAweDAzKSA8PCAyNCkgfCAoYzEgPDwgMTgpIHwgKGMyIDw8IDEyKSB8IChjMyA8PCA2KSB8IGM0OworICByZXR1cm4gKChzb2FwX3djaGFyKShjICYgMHgwMSkgPDwgMzApIHwgKGMxIDw8IDI0KSB8IChjMiA8PCAxOCkgfCAoYzMgPDwgMTIpIHwgKGM0IDw8IDYpIHwgKHNvYXBfd2NoYXIpKHNvYXBfZ2V0MShzb2FwKSAmIDB4M0YpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dGhleChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgdW5zaWduZWQgY2hhciAqcywgaW50IG4pCit7IGNoYXIgZFsyXTsKKyAgcmVnaXN0ZXIgaW50IGk7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgaWYgKCEoc29hcC0+ZG9tLT5kYXRhID0gc29hcF9zMmhleChzb2FwLCBzLCBOVUxMLCBuKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNlbmRpZgorICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICB7IHJlZ2lzdGVyIGludCBtID0gKnMrKzsKKyAgICBkWzBdID0gKGNoYXIpKChtID4+IDQpICsgKG0gPiAxNTkgPyAnNycgOiAnMCcpKTsKKyAgICBtICY9IDB4MEY7CisgICAgZFsxXSA9IChjaGFyKShtICsgKG0gPiA5ID8gJzcnIDogJzAnKSk7CisgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgZCwgMikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit1bnNpZ25lZCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9nZXRoZXgoc3RydWN0IHNvYXAgKnNvYXAsIGludCAqbikKK3sKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBzb2FwLT5kb20tPmRhdGEgPSBzb2FwX3N0cmluZ19pbihzb2FwLCAwLCAtMSwgLTEpOworICAgIHJldHVybiAodW5zaWduZWQgY2hhciopc29hcF9oZXgycyhzb2FwLCBzb2FwLT5kb20tPmRhdGEsIE5VTEwsIDAsIG4pOworICB9CisjZW5kaWYKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgc29hcC0+bGFiaWR4ID0gMDsKKyAgZm9yICg7OykKKyAgeyByZWdpc3RlciBjaGFyICpzOworICAgIHJlZ2lzdGVyIGludCBpLCBrOworICAgIGlmIChzb2FwX2FwcGVuZF9sYWIoc29hcCwgTlVMTCwgMCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBzID0gc29hcC0+bGFiYnVmICsgc29hcC0+bGFiaWR4OworICAgIGsgPSBzb2FwLT5sYWJsZW4gLSBzb2FwLT5sYWJpZHg7CisgICAgc29hcC0+bGFiaWR4ID0gc29hcC0+bGFibGVuOworICAgIGZvciAoaSA9IDA7IGkgPCBrOyBpKyspCisgICAgeyByZWdpc3RlciBjaGFyIGQxLCBkMjsKKyAgICAgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgICAgIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgICAgIGlmIChzb2FwX2lzeGRpZ2l0KGMpKQorICAgICAgeyBkMSA9IChjaGFyKWM7CisgICAgICAgIGMgPSBzb2FwX2dldChzb2FwKTsgCisJaWYgKHNvYXBfaXN4ZGlnaXQoYykpCisgICAgICAgICAgZDIgPSAoY2hhciljOworICAgICAgICBlbHNlIAorICAgICAgICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IHVuc2lnbmVkIGNoYXIgKnA7CisgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgIGlmIChuKQorICAgICAgICAgICpuID0gKGludCkoc29hcC0+bGFibGVuIC0gayArIGkpOworICAgICAgICBwID0gKHVuc2lnbmVkIGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHNvYXAtPmxhYmxlbiAtIGsgKyBpKTsKKwlpZiAocCkKKwkgIG1lbWNweShwLCBzb2FwLT5sYWJidWYsIHNvYXAtPmxhYmxlbiAtIGsgKyBpKTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgICB9CisgICAgICAqcysrID0gKChkMSA+PSAnQScgPyAoZDEgJiAweDcpICsgOSA6IGQxIC0gJzAnKSA8PCA0KSArIChkMiA+PSAnQScgPyAoZDIgJiAweDcpICsgOSA6IGQyIC0gJzAnKTsKKyAgICB9CisgIH0KKyNlbHNlCisgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgZm9yICg7OykKKyAgeyByZWdpc3RlciBpbnQgaTsKKyAgICByZWdpc3RlciBjaGFyICpzID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBTT0FQX0JMS0xFTik7CisgICAgaWYgKCFzKQorICAgIHsgc29hcF9lbmRfYmxvY2soc29hcCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IFNPQVBfQkxLTEVOOyBpKyspCisgICAgeyByZWdpc3RlciBjaGFyIGQxLCBkMjsKKyAgICAgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IHNvYXBfZ2V0KHNvYXApOworICAgICAgaWYgKHNvYXBfaXN4ZGlnaXQoYykpCisgICAgICB7IGQxID0gKGNoYXIpYzsKKyAgICAgICAgYyA9IHNvYXBfZ2V0KHNvYXApOyAKKwlpZiAoc29hcF9pc3hkaWdpdChjKSkKKyAgICAgICAgICBkMiA9IChjaGFyKWM7CisgICAgICAgIGVsc2UgCisgICAgICAgIHsgc29hcF9lbmRfYmxvY2soc29hcCk7CisJICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyB1bnNpZ25lZCBjaGFyICpwOworICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICBpZiAobikKKyAgICAgICAgICAqbiA9IHNvYXBfc2l6ZV9ibG9jayhzb2FwLCBpKTsKKyAgICAgICAgcCA9ICh1bnNpZ25lZCBjaGFyKilzb2FwX3NhdmVfYmxvY2soc29hcCwgTlVMTCwgMCk7CisgICAgICAgIHJldHVybiBwOworICAgICAgfQorICAgICAgKnMrKyA9ICgoZDEgPj0gJ0EnID8gKGQxICYgMHg3KSArIDkgOiBkMSAtICcwJykgPDwgNCkgKyAoZDIgPj0gJ0EnID8gKGQyICYgMHg3KSArIDkgOiBkMiAtICcwJyk7CisgICAgfQorICB9CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRiYXNlNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMsIGludCBuKQoreyByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBtOworICBjaGFyIGRbNF07CisgIGlmICghcykKKyAgICByZXR1cm4gU09BUF9PSzsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBpZiAoIShzb2FwLT5kb20tPmRhdGEgPSBzb2FwX3MyYmFzZTY0KHNvYXAsIHMsIE5VTEwsIG4pKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2VuZGlmCisgIGZvciAoOyBuID4gMjsgbiAtPSAzLCBzICs9IDMpCisgIHsgbSA9IHNbMF07CisgICAgbSA9IChtIDw8IDgpIHwgc1sxXTsKKyAgICBtID0gKG0gPDwgOCkgfCBzWzJdOworICAgIGZvciAoaSA9IDQ7IGkgPiAwOyBtID4+PSA2KQorICAgICAgZFstLWldID0gc29hcF9iYXNlNjRvW20gJiAweDNGXTsKKyAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBkLCA0KSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAobiA+IDApCisgIHsgbSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgIG0gPSAobSA8PCA4KSB8ICpzKys7CisgICAgZm9yICg7IGkgPCAzOyBpKyspCisgICAgICBtIDw8PSA4OworICAgIGZvciAoaSsrOyBpID4gMDsgbSA+Pj0gNikKKyAgICAgIGRbLS1pXSA9IHNvYXBfYmFzZTY0b1ttICYgMHgzRl07CisgICAgZm9yIChpID0gMzsgaSA+IG47IGktLSkKKyAgICAgIGRbaV0gPSAnPSc7CisgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgZCwgNCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit1bnNpZ25lZCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9nZXRiYXNlNjQoc3RydWN0IHNvYXAgKnNvYXAsIGludCAqbiwgaW50IG1hbGxvY19mbGFnKQoreyAKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBzb2FwLT5kb20tPmRhdGEgPSBzb2FwX3N0cmluZ19pbihzb2FwLCAwLCAtMSwgLTEpOworICAgIHJldHVybiAodW5zaWduZWQgY2hhciopc29hcF9iYXNlNjQycyhzb2FwLCBzb2FwLT5kb20tPmRhdGEsIE5VTEwsIDAsIG4pOworICB9CisjZW5kaWYKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgc29hcC0+bGFiaWR4ID0gMDsKKyAgZm9yICg7OykKKyAgeyByZWdpc3RlciBpbnQgaSwgazsKKyAgICByZWdpc3RlciBjaGFyICpzOworICAgIGlmIChzb2FwX2FwcGVuZF9sYWIoc29hcCwgTlVMTCwgMikpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBzID0gc29hcC0+bGFiYnVmICsgc29hcC0+bGFiaWR4OworICAgIGsgPSBzb2FwLT5sYWJsZW4gLSBzb2FwLT5sYWJpZHg7CisgICAgc29hcC0+bGFiaWR4ID0gMyAqIChzb2FwLT5sYWJsZW4gLyAzKTsKKyAgICBpZiAoIXMpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgayAtIDI7IGkgKz0gMykKKyAgICB7IHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbSA9IDA7CisgICAgICByZWdpc3RlciBpbnQgaiA9IDA7CisgICAgICBkbworICAgICAgeyByZWdpc3RlciBzb2FwX3djaGFyIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgICAgICAgaWYgKGMgPT0gJz0nIHx8IGMgPCAwKQorICAgICAgICB7IHVuc2lnbmVkIGNoYXIgKnA7CisgICAgICAgICAgc3dpdGNoIChqKQorICAgICAgICAgIHsgY2FzZSAyOgorICAgICAgICAgICAgICAqcysrID0gKGNoYXIpKChtID4+IDQpICYgMHhGRik7CisgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gMTApICYgMHhGRik7CisgICAgICAgICAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gMikgJiAweEZGKTsKKyAgICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobikKKyAgICAgICAgICAgICpuID0gKGludCkoc29hcC0+bGFibGVuIC0gayArIGkpOworICAgICAgICAgIHAgPSAodW5zaWduZWQgY2hhciopc29hcF9tYWxsb2Moc29hcCwgc29hcC0+bGFibGVuIC0gayArIGkpOworCSAgaWYgKHApCisJICAgIG1lbWNweShwLCBzb2FwLT5sYWJidWYsIHNvYXAtPmxhYmxlbiAtIGsgKyBpKTsKKyAgICAgICAgICBpZiAoYyA+PSAwKQorICAgICAgICAgIHsgd2hpbGUgKChpbnQpKChjID0gc29hcF9nZXQoc29hcCkpICE9IEVPRikgJiYgYyAhPSBTT0FQX0xUICYmIGMgIT0gU09BUF9UVCkKKyAgICAgICAgICAgICAgOworCSAgfQorICAgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgIH0KKyAgICAgICAgYyAtPSAnKyc7CisgICAgICAgIGlmIChjID49IDAgJiYgYyA8PSA3OSkKKyAgICAgICAgeyBtID0gKG0gPDwgNikgKyBzb2FwX2Jhc2U2NGlbY107CisgICAgICAgICAgaisrOworICAgICAgICB9CisgICAgICB9IHdoaWxlIChqIDwgNCk7CisgICAgICAqcysrID0gKGNoYXIpKChtID4+IDE2KSAmIDB4RkYpOworICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiA4KSAmIDB4RkYpOworICAgICAgKnMrKyA9IChjaGFyKShtICYgMHhGRik7CisgICAgfQorICB9CisjZWxzZQorICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgcmV0dXJuIE5VTEw7CisgIGZvciAoOzspCisgIHsgcmVnaXN0ZXIgaW50IGk7CisgICAgcmVnaXN0ZXIgY2hhciAqcyA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgMyAqIFNPQVBfQkxLTEVOKTsgLyogbXVzdCBiZSBtdWx0aXBsZSBvZiAzICovCisgICAgaWYgKCFzKQorICAgIHsgc29hcF9lbmRfYmxvY2soc29hcCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IFNPQVBfQkxLTEVOOyBpKyspCisgICAgeyByZWdpc3RlciB1bnNpZ25lZCBsb25nIG0gPSAwOworICAgICAgcmVnaXN0ZXIgaW50IGogPSAwOworICAgICAgZG8KKyAgICAgIHsgcmVnaXN0ZXIgc29hcF93Y2hhciBjID0gc29hcF9nZXQoc29hcCk7CisgICAgICAgIGlmIChjID09ICc9JyB8fCBjIDwgMCkKKyAgICAgICAgeyB1bnNpZ25lZCBjaGFyICpwOworICAgICAgICAgIGkgKj0gMzsKKyAgICAgICAgICBzd2l0Y2ggKGopCisgICAgICAgICAgeyBjYXNlIDI6CisgICAgICAgICAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gNCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiAxMCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiAyKSAmIDB4RkYpOworICAgICAgICAgICAgICBpICs9IDI7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChuKQorCSAgICAqbiA9IChpbnQpc29hcF9zaXplX2Jsb2NrKHNvYXAsIGkpOworICAgICAgICAgIHAgPSAodW5zaWduZWQgY2hhciopc29hcF9zYXZlX2Jsb2NrKHNvYXAsIE5VTEwsIDApOworICAgICAgICAgIGlmIChjID49IDApCisgICAgICAgICAgeyB3aGlsZSAoKGludCkoKGMgPSBzb2FwX2dldChzb2FwKSkgIT0gRU9GKSAmJiBjICE9IFNPQVBfTFQgJiYgYyAhPSBTT0FQX1RUKQorICAgICAgICAgICAgICA7CisJICB9CisgICAgICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgfQorICAgICAgICBjIC09ICcrJzsKKyAgICAgICAgaWYgKGMgPj0gMCAmJiBjIDw9IDc5KQorICAgICAgICB7IG0gPSAobSA8PCA2KSArIHNvYXBfYmFzZTY0aVtjXTsKKyAgICAgICAgICBqKys7CisgICAgICAgIH0KKyAgICAgIH0gd2hpbGUgKGogPCA0KTsKKyAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gMTYpICYgMHhGRik7CisgICAgICAqcysrID0gKGNoYXIpKChtID4+IDgpICYgMHhGRik7CisgICAgICAqcysrID0gKGNoYXIpKG0gJiAweEZGKTsKKyAgICB9CisgIH0KKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3hvcF9mb3J3YXJkKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBjaGFyICoqcHRyLCBpbnQgKnNpemUsIGNoYXIgKippZCwgY2hhciAqKnR5cGUsIGNoYXIgKipvcHRpb25zKQoreyAvKiBDaGVjayBNVE9NIHhvcDpJbmNsdWRlIGVsZW1lbnQgKHdpdGhpbiBoZXgvYmFzZTY0QmluYXJ5KSAqLworICAvKiBUT0RPOiB0aGlzIGNvZGUgdG8gYmUgb2Jzb2xldGVkIHdpdGggbmV3IGltcG9ydC94b3AuaCBjb252ZW50aW9ucyAqLworICBpbnQgYm9keSA9IHNvYXAtPmJvZHk7IC8qIHNob3VsZCBzYXZlIHR5cGUgdG9vPyAqLworICBpZiAoIXNvYXBfcGVla19lbGVtZW50KHNvYXApKQorICB7IGlmICghc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsICJ4b3A6SW5jbHVkZSIsIDApICYmICpzb2FwLT5ocmVmKQorICAgIHsgaWYgKHNvYXBfZGltZV9mb3J3YXJkKHNvYXAsIHB0ciwgc2l6ZSwgaWQsIHR5cGUsIG9wdGlvbnMpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgTlVMTCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgc29hcC0+Ym9keSA9IGJvZHk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZGltZV9mb3J3YXJkKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBjaGFyICoqcHRyLCBpbnQgKnNpemUsIGNoYXIgKippZCwgY2hhciAqKnR5cGUsIGNoYXIgKipvcHRpb25zKQoreyBzdHJ1Y3Qgc29hcF94bGlzdCAqeHAgPSAoc3RydWN0IHNvYXBfeGxpc3QqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF94bGlzdCkpOworICAqcHRyID0gTlVMTDsKKyAgKnNpemUgPSAwOworICAqaWQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT5ocmVmKTsKKyAgKnR5cGUgPSBOVUxMOworICAqb3B0aW9ucyA9IE5VTEw7CisgIGlmICgheHApCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgIHhwLT5uZXh0ID0gc29hcC0+eGxpc3Q7CisgIHhwLT5wdHIgPSBwdHI7CisgIHhwLT5zaXplID0gc2l6ZTsKKyAgeHAtPmlkID0gKmlkOworICB4cC0+dHlwZSA9IHR5cGU7CisgIHhwLT5vcHRpb25zID0gb3B0aW9uczsKKyAgc29hcC0+eGxpc3QgPSB4cDsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9zdHJkdXAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMpCit7IGNoYXIgKnQgPSBOVUxMOworICBpZiAocyAmJiAodCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzdHJsZW4ocykgKyAxKSkpCisgICAgc3RyY3B5KHQsIHMpOworICByZXR1cm4gdDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9uZXdfYmxvY2soc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX2JsaXN0ICpwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk5ldyBibG9jayBzZXF1ZW5jZSAocHJldj0lcClcbiIsIHNvYXAtPmJsaXN0KSk7CisgIGlmICghKHAgPSAoc3RydWN0IHNvYXBfYmxpc3QqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9ibGlzdCkpKSkKKyAgICByZXR1cm4gU09BUF9FT007ICAgCisgIHAtPm5leHQgPSBzb2FwLT5ibGlzdDsgCisgIHAtPnB0ciA9IE5VTEw7CisgIHAtPnNpemUgPSAwOworICBzb2FwLT5ibGlzdCA9IHA7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZCoKK1NPQVBfRk1BQzIKK3NvYXBfcHVzaF9ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCwgc2l6ZV90IG4pCit7IGNoYXIgKnA7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUHVzaCBibG9jayBvZiAldSBieXRlcyAoJXUgYnl0ZXMgdG90YWwpXG4iLCAodW5zaWduZWQgaW50KW4sICh1bnNpZ25lZCBpbnQpc29hcC0+Ymxpc3QtPnNpemUgKyAodW5zaWduZWQgaW50KW4pKTsKKyAgaWYgKCEocCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBuICsgc2l6ZW9mKGNoYXIqKSArIHNpemVvZihzaXplX3QpKSkpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICAqKGNoYXIqKilwID0gc29hcC0+Ymxpc3QtPnB0cjsKKyAgKihzaXplX3QqKShwICsgc2l6ZW9mKGNoYXIqKSkgPSBuOworICBzb2FwLT5ibGlzdC0+cHRyID0gcDsKKyAgc29hcC0+Ymxpc3QtPnNpemUgKz0gbjsKKyAgcmV0dXJuIHAgKyBzaXplb2YoY2hhciopICsgc2l6ZW9mKHNpemVfdCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3BvcF9ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgY2hhciAqcDsKKyAgaWYgKCFzb2FwLT5ibGlzdC0+cHRyKQorICAgIHJldHVybjsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQb3AgYmxvY2tcbiIpKTsKKyAgcCA9IHNvYXAtPmJsaXN0LT5wdHI7CisgIHNvYXAtPmJsaXN0LT5zaXplIC09ICooc2l6ZV90KikocCArIHNpemVvZihjaGFyKikpOworICBzb2FwLT5ibGlzdC0+cHRyID0gKihjaGFyKiopcDsKKyAgU09BUF9GUkVFKHNvYXAsIHApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyB2b2lkCitzb2FwX3VwZGF0ZV9wdHJzKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpzdGFydCwgY2hhciAqZW5kLCBjaGFyICpwMSwgY2hhciAqcDIpCit7IGludCBpOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2ZsaXN0ICpmcDsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfeGxpc3QgKnhwOworI2VuZGlmCisgIHJlZ2lzdGVyIHZvaWQgKnAsICoqcTsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfSURIQVNIOyBpKyspCisgIHsgZm9yIChpcCA9IHNvYXAtPmlodFtpXTsgaXA7IGlwID0gaXAtPm5leHQpCisgICAgeyBpZiAoaXAtPnB0ciAmJiAoY2hhciopaXAtPnB0ciA+PSBzdGFydCAmJiAoY2hhciopaXAtPnB0ciA8IGVuZCkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVcGRhdGUgaWQ9JyVzJyAlcCAtPiAlcFxuIiwgaXAtPmlkLCBpcC0+cHRyLCAoY2hhciopaXAtPnB0ciArIChwMS1wMikpKTsKKyAgICAgICAgaXAtPnB0ciA9IChjaGFyKilpcC0+cHRyICsgKHAxLXAyKTsKKyAgICAgIH0KKyAgICAgIGZvciAocSA9ICZpcC0+bGluazsgcTsgcSA9ICh2b2lkKiopcCkKKyAgICAgIHsgcCA9ICpxOworICAgICAgICBpZiAocCAmJiAoY2hhciopcCA+PSBzdGFydCAmJiAoY2hhciopcCA8IGVuZCkKKyAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkxpbmsgdXBkYXRlIGlkPSclcycgJXBcbiIsIGlwLT5pZCwgcCkpOworICAgICAgICAgICpxID0gKGNoYXIqKXAgKyAocDEtcDIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBmb3IgKHEgPSAmaXAtPmNvcHk7IHE7IHEgPSAodm9pZCoqKXApCisgICAgICB7IHAgPSAqcTsKKyAgICAgICAgaWYgKHAgJiYgKGNoYXIqKXAgPj0gc3RhcnQgJiYgKGNoYXIqKXAgPCBlbmQpCisgICAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5IGNoYWluIHVwZGF0ZSBpZD0nJXMnICVwXG4iLCBpcC0+aWQsIHApKTsKKyAgICAgICAgICAqcSA9IChjaGFyKilwICsgKHAxLXAyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZm9yIChmcCA9IGlwLT5mbGlzdDsgZnA7IGZwID0gZnAtPm5leHQpCisgICAgICB7IGlmICgoY2hhciopZnAtPnB0ciA+PSBzdGFydCAmJiAoY2hhciopZnAtPnB0ciA8IGVuZCkKKyAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHkgbGlzdCB1cGRhdGUgaWQ9JyVzJyAlcFxuIiwgaXAtPmlkLCBmcCkpOworICAgICAgICAgIGZwLT5wdHIgPSAoY2hhciopZnAtPnB0ciArIChwMS1wMik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgZm9yICh4cCA9IHNvYXAtPnhsaXN0OyB4cDsgeHAgPSB4cC0+bmV4dCkKKyAgeyBpZiAoeHAtPnB0ciAmJiAoY2hhciopeHAtPnB0ciA+PSBzdGFydCAmJiAoY2hhciopeHAtPnB0ciA8IGVuZCkKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVXBkYXRlIGlkPSclcycgJXAgLT4gJXBcbiIsIHhwLT5pZD94cC0+aWQ6IiIsIHhwLT5wdHIsIChjaGFyKil4cC0+cHRyICsgKHAxLXAyKSkpOworICAgICAgeHAtPnB0ciA9ICh1bnNpZ25lZCBjaGFyKiopKChjaGFyKil4cC0+cHRyICsgKHAxLXAyKSk7CisgICAgICB4cC0+c2l6ZSA9IChpbnQqKSgoY2hhciopeHAtPnNpemUgKyAocDEtcDIpKTsKKyAgICAgIHhwLT50eXBlID0gKGNoYXIqKikoKGNoYXIqKXhwLT50eXBlICsgKHAxLXAyKSk7CisgICAgICB4cC0+b3B0aW9ucyA9IChjaGFyKiopKChjaGFyKil4cC0+b3B0aW9ucyArIChwMS1wMikpOworICAgIH0KKyAgfQorI2VuZGlmCit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzb2FwX2hhc19jb3BpZXMoc3RydWN0IHNvYXAgKnNvYXAsIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnN0YXJ0LCByZWdpc3RlciBjb25zdCBjaGFyICplbmQpCit7IHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2ZsaXN0ICpmcDsKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqcDsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfSURIQVNIOyBpKyspCisgIHsgZm9yIChpcCA9IHNvYXAtPmlodFtpXTsgaXA7IGlwID0gaXAtPm5leHQpCisgICAgeyBmb3IgKHAgPSAoY29uc3QgY2hhciopaXAtPmNvcHk7IHA7IHAgPSAqKGNvbnN0IGNoYXIqKilwKQorICAgICAgICBpZiAocCA+PSBzdGFydCAmJiBwIDwgZW5kKQorICAgICAgICAgIHJldHVybiBTT0FQX0VSUjsKKyAgICAgIGZvciAoZnAgPSBpcC0+Zmxpc3Q7IGZwOyBmcCA9IGZwLT5uZXh0KQorICAgICAgICBpZiAoKGNvbnN0IGNoYXIqKWZwLT5wdHIgPj0gc3RhcnQgJiYgKGNvbnN0IGNoYXIqKWZwLT5wdHIgPCBlbmQpCisJICByZXR1cm4gU09BUF9FUlI7CisgICAgfQorICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3Jlc29sdmUoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2ZsaXN0ICpmcDsKKyAgc2hvcnQgZmxhZzsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHZpbmcgZm9yd2FyZGVkIGRhdGFcbiIpKTsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfSURIQVNIOyBpKyspCisgIHsgZm9yIChpcCA9IHNvYXAtPmlodFtpXTsgaXA7IGlwID0gaXAtPm5leHQpCisgICAgeyBpZiAoaXAtPnB0cikKKyAgICAgIHsgcmVnaXN0ZXIgdm9pZCAqcCwgKipxLCAqcjsKKyAgICAgICAgcSA9ICh2b2lkKiopaXAtPmxpbms7CisgICAgICAgIGlwLT5saW5rID0gTlVMTDsKKyAgICAgICAgciA9IGlwLT5wdHI7CisgICAgICAgIERCR0xPRyhURVNULCBpZiAocSkgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlRyYXZlcnNpbmcgbGluayBjaGFpbiB0byByZXNvbHZlIGlkPSclcydcbiIsIGlwLT5pZCkpOworICAgICAgICB3aGlsZSAocSkKKyAgICAgICAgeyBwID0gKnE7CisgICAgICAgICAgKnEgPSByOworICAgICAgICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICIuLi4gbGluayAlcCAtPiAlcFxuIiwgcSwgcikpOworICAgICAgICAgIHEgPSAodm9pZCoqKXA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCppcC0+aWQgPT0gJyMnKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk1pc3NpbmcgZGF0YSBmb3IgaWQ9JyVzJ1xuIiwgaXAtPmlkKSk7CisgICAgICAgIHN0cmNweShzb2FwLT5pZCwgaXAtPmlkICsgMSk7CisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTUlTU0lOR19JRDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZG8KKyAgeyBmbGFnID0gMDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc29sdXRpb24gcGhhc2VcbiIpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgU09BUF9JREhBU0g7IGkrKykKKyAgICB7IGZvciAoaXAgPSBzb2FwLT5paHRbaV07IGlwOyBpcCA9IGlwLT5uZXh0KQorICAgICAgeyBpZiAoaXAtPnB0ciAmJiAhc29hcF9oYXNfY29waWVzKHNvYXAsIChjb25zdCBjaGFyKilpcC0+cHRyLCAoY29uc3QgY2hhciopaXAtPnB0ciArIGlwLT5zaXplKSkKKyAgICAgICAgeyBpZiAoaXAtPmNvcHkpCisgICAgICAgICAgeyByZWdpc3RlciB2b2lkICpwLCAqKnEgPSAodm9pZCoqKWlwLT5jb3B5OworICAgICAgICAgICAgREJHTE9HKFRFU1QsIGlmIChxKSBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVHJhdmVyc2luZyBjb3B5IGNoYWluIHRvIHJlc29sdmUgaWQ9JyVzJ1xuIiwgaXAtPmlkKSk7CisgICAgICAgICAgICBpcC0+Y29weSA9IE5VTEw7CisgICAgICAgICAgICBkbworICAgICAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIi4uLiBjb3B5ICVwIC0+ICVwICgldSBieXRlcylcbiIsIGlwLT5wdHIsIHEsICh1bnNpZ25lZCBpbnQpaXAtPnNpemUpKTsKKwkgICAgICBwID0gKnE7CisgICAgICAgICAgICAgIG1lbWNweShxLCBpcC0+cHRyLCBpcC0+c2l6ZSk7CisgICAgICAgICAgICAgIHEgPSAodm9pZCoqKXA7CisgICAgICAgICAgICB9IHdoaWxlIChxKTsKKwkgICAgZmxhZyA9IDE7CisJICB9CisgICAgICAgICAgZm9yIChmcCA9IGlwLT5mbGlzdDsgZnA7IGZwID0gaXAtPmZsaXN0KQorICAgICAgICAgIHsgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGsgPSBmcC0+bGV2ZWw7CisJICAgIHJlZ2lzdGVyIHZvaWQgKnAgPSBpcC0+cHRyOworICAgICAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHZpbmcgZm9yd2FyZGVkIGRhdGEgdHlwZT0lZCBsb2NhdGlvbj0lcCBsZXZlbD0ldSwldSBpZD0nJXMnXG4iLCBpcC0+dHlwZSwgcCwgaXAtPmxldmVsLCBmcC0+bGV2ZWwsIGlwLT5pZCkpOworCSAgICB3aGlsZSAoaXAtPmxldmVsIDwgaykKKyAgICAgICAgICAgIHsgcmVnaXN0ZXIgdm9pZCAqKnEgPSAodm9pZCoqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZih2b2lkKikpOyAgCisJICAgICAgaWYgKCFxKQorCSAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworCSAgICAgICpxID0gcDsKKyAgICAgICAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJEZXNjZW5kaW5nIG9uZSBsZXZlbCwgbmV3IGxvY2F0aW9uPSVwIGhvbGRzPSVwLi4uXG4iLCBxLCAqcSkpOworICAgICAgICAgICAgICBwID0gKHZvaWQqKXE7CisgICAgICAgICAgICAgIGstLTsKKyAgICAgICAgICAgIH0KKwkgICAgaWYgKGZwLT5mY29weSkKKwkgICAgICBmcC0+ZmNvcHkoc29hcCwgaXAtPnR5cGUsIGZwLT50eXBlLCBmcC0+cHRyLCBmcC0+bGVuLCBwLCBpcC0+c2l6ZSk7CisJICAgIGVsc2UKKwkgICAgICBzb2FwX2Zjb3B5KHNvYXAsIGlwLT50eXBlLCBmcC0+dHlwZSwgZnAtPnB0ciwgZnAtPmxlbiwgcCwgaXAtPnNpemUpOworCSAgICBpcC0+Zmxpc3QgPSBmcC0+bmV4dDsKKwkgICAgU09BUF9GUkVFKHNvYXAsIGZwKTsKKwkgICAgZmxhZyA9IDE7CisJICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0gd2hpbGUgKGZsYWcpOworI2lmZGVmIFNPQVBfREVCVUcKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfSURIQVNIOyBpKyspCisgIHsgZm9yIChpcCA9IHNvYXAtPmlodFtpXTsgaXA7IGlwID0gaXAtPm5leHQpCisgICAgeyBpZiAoaXAtPmNvcHkgfHwgaXAtPmZsaXN0KQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc29sdXRpb24gZXJyb3I6IGZvcndhcmRlZCBkYXRhIGZvciBpZD0nJXMnIGNvdWxkIG5vdCBiZSBwcm9wYWdhdGVkLCBwbGVhc2UgcmVwb3J0IHRoaXMgcHJvYmxlbSB0byB0aGUgZGV2ZWxvcGVyc1xuIiwgaXAtPmlkKSk7CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHV0aW9uIGRvbmVcbiIpKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3NpemVfdAorU09BUF9GTUFDMgorc29hcF9zaXplX2Jsb2NrKHN0cnVjdCBzb2FwICpzb2FwLCBzaXplX3QgbikKK3sgaWYgKHNvYXAtPmJsaXN0LT5wdHIpCisgIHsgc29hcC0+Ymxpc3QtPnNpemUgLT0gKihzaXplX3QqKShzb2FwLT5ibGlzdC0+cHRyICsgc2l6ZW9mKGNoYXIqKSkgLSBuOworICAgICooc2l6ZV90Kikoc29hcC0+Ymxpc3QtPnB0ciArIHNpemVvZihjaGFyKikpID0gbjsKKyAgfQorICByZXR1cm4gc29hcC0+Ymxpc3QtPnNpemU7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjaGFyKgorU09BUF9GTUFDMgorc29hcF9maXJzdF9ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgY2hhciAqcCwgKnEsICpyOworICBwID0gc29hcC0+Ymxpc3QtPnB0cjsKKyAgaWYgKCFwKQorICAgIHJldHVybiBOVUxMOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZpcnN0IGJsb2NrXG4iKSk7CisgIHIgPSBOVUxMOworICBkbworICB7IHEgPSAqKGNoYXIqKilwOworICAgICooY2hhcioqKXAgPSByOworICAgIHIgPSBwOworICAgIHAgPSBxOworICB9IHdoaWxlIChwKTsKKyAgc29hcC0+Ymxpc3QtPnB0ciA9IHI7CisgIHJldHVybiByICsgc2l6ZW9mKGNoYXIqKSArIHNpemVvZihzaXplX3QpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfbmV4dF9ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgY2hhciAqcDsKKyAgcCA9IHNvYXAtPmJsaXN0LT5wdHI7CisgIGlmIChwKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTmV4dCBibG9ja1xuIikpOworICAgIHNvYXAtPmJsaXN0LT5wdHIgPSAqKGNoYXIqKilwOworICAgIFNPQVBfRlJFRShzb2FwLCBwKTsKKyAgICBpZiAoc29hcC0+Ymxpc3QtPnB0cikKKyAgICAgIHJldHVybiBzb2FwLT5ibGlzdC0+cHRyICsgc2l6ZW9mKGNoYXIqKSArIHNpemVvZihzaXplX3QpOworICB9CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc2l6ZV90CitTT0FQX0ZNQUMyCitzb2FwX2Jsb2NrX3NpemUoc3RydWN0IHNvYXAgKnNvYXApCit7IHJldHVybiAqKHNpemVfdCopKHNvYXAtPmJsaXN0LT5wdHIgKyBzaXplb2YoY2hhciopKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZW5kX2Jsb2NrKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9ibGlzdCAqYnA7CisgIGNoYXIgKnAsICpxOworICBicCA9IHNvYXAtPmJsaXN0OworICBpZiAoYnApCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgb2YgYmxvY2sgc2VxdWVuY2UsIGZyZWUgYWxsIHJlbWFpbmluZyBibG9ja3NcbiIpKTsKKyAgICBmb3IgKHAgPSBicC0+cHRyOyBwOyBwID0gcSkKKyAgICB7IHEgPSAqKGNoYXIqKilwOworICAgICAgU09BUF9GUkVFKHNvYXAsIHApOworICAgIH0KKyAgICBzb2FwLT5ibGlzdCA9IGJwLT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBicCk7CisgIH0KKyAgREJHTE9HKFRFU1QsIGlmIChzb2FwLT5ibGlzdCkgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc3RvcmUgcHJldmlvdXMgYmxvY2sgc2VxdWVuY2VcbiIpKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3NhdmVfYmxvY2soc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnAsIGludCBmbGFnKQoreyByZWdpc3RlciBzaXplX3QgbjsKKyAgcmVnaXN0ZXIgY2hhciAqcSwgKnM7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2F2ZSBhbGwgYmxvY2tzIGluIGNvbnRpZ3VvdXMgbWVtb3J5IHNwYWNlIG9mICV1IGJ5dGVzICglcC0+JXApXG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmJsaXN0LT5zaXplLCBzb2FwLT5ibGlzdC0+cHRyLCBwKSk7CisgIGlmIChzb2FwLT5ibGlzdC0+c2l6ZSkKKyAgeyBpZiAoIXApCisgICAgICBwID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHNvYXAtPmJsaXN0LT5zaXplKTsKKyAgICBpZiAocCkKKyAgICB7IGZvciAocyA9IHAsIHEgPSBzb2FwX2ZpcnN0X2Jsb2NrKHNvYXApOyBxOyBxID0gc29hcF9uZXh0X2Jsb2NrKHNvYXApKQorICAgICAgeyBuID0gc29hcF9ibG9ja19zaXplKHNvYXApOworI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgICAgICAgaWYgKGZsYWcpCisJICBzb2FwX3VwZGF0ZV9wdHJzKHNvYXAsIHEsIHEgKyBuLCBzLCBxKTsKKyNlbmRpZgorICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHkgJXUgYnl0ZXMgZnJvbSAlcCB0byAlcFxuIiwgKHVuc2lnbmVkIGludCluLCBxLCBzKSk7CisgICAgICAgIG1lbWNweShzLCBxLCBuKTsKKyAgICAgICAgcyArPSBuOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICB9CisgIHNvYXBfZW5kX2Jsb2NrKHNvYXApOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9wdXRzaXplKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgc2l6ZSkKK3sgcmV0dXJuIHNvYXBfcHV0c2l6ZXMoc29hcCwgdHlwZSwgJnNpemUsIDEpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3B1dHNpemVzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBpbnQgKnNpemUsIGludCBkaW0pCit7IHJldHVybiBzb2FwX3B1dHNpemVzb2Zmc2V0cyhzb2FwLCB0eXBlLCBzaXplLCBOVUxMLCBkaW0pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3B1dHNpemVzb2Zmc2V0cyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgaW50ICpzaXplLCBjb25zdCBpbnQgKm9mZnNldCwgaW50IGRpbSkKK3sgaW50IGk7CisgIGlmICghdHlwZSkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgeyBzcHJpbnRmKHNvYXAtPnR5cGUsICIlc1slZCIsIHR5cGUsIHNpemVbMF0pOworICAgIGZvciAoaSA9IDE7IGkgPCBkaW07IGkrKykKKyAgICAgIHNwcmludGYoc29hcC0+dHlwZSArIHN0cmxlbihzb2FwLT50eXBlKSwgIiAlZCIsIHNpemVbaV0pOworICB9CisgIGVsc2UKKyAgeyBpZiAob2Zmc2V0KQorICAgIHsgc3ByaW50Zihzb2FwLT50eXBlLCAiJXNbJWQiLCB0eXBlLCBzaXplWzBdICsgb2Zmc2V0WzBdKTsKKyAgICAgIGZvciAoaSA9IDE7IGkgPCBkaW07IGkrKykKKyAgICAgICAgc3ByaW50Zihzb2FwLT50eXBlICsgc3RybGVuKHNvYXAtPnR5cGUpLCAiLCVkIiwgc2l6ZVtpXSArIG9mZnNldFtpXSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IHNwcmludGYoc29hcC0+dHlwZSwgIiVzWyVkIiwgdHlwZSwgc2l6ZVswXSk7CisgICAgICBmb3IgKGkgPSAxOyBpIDwgZGltOyBpKyspCisgICAgICAgIHNwcmludGYoc29hcC0+dHlwZSArIHN0cmxlbihzb2FwLT50eXBlKSwgIiwlZCIsIHNpemVbaV0pOworICAgIH0KKyAgICBzdHJjYXQoc29hcC0+dHlwZSwgIl0iKTsKKyAgfQorICByZXR1cm4gc29hcC0+dHlwZTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9wdXRvZmZzZXQoc3RydWN0IHNvYXAgKnNvYXAsIGludCBvZmZzZXQpCit7IHJldHVybiBzb2FwX3B1dG9mZnNldHMoc29hcCwgJm9mZnNldCwgMSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfcHV0b2Zmc2V0cyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgaW50ICpvZmZzZXQsIGludCBkaW0pCit7IHJlZ2lzdGVyIGludCBpOworICBzcHJpbnRmKHNvYXAtPmFycmF5T2Zmc2V0LCAiWyVkIiwgb2Zmc2V0WzBdKTsKKyAgZm9yIChpID0gMTsgaSA8IGRpbTsgaSsrKQorICAgIHNwcmludGYoc29hcC0+YXJyYXlPZmZzZXQgKyBzdHJsZW4oc29hcC0+YXJyYXlPZmZzZXQpLCAiLCVkIiwgb2Zmc2V0W2ldKTsKKyAgc3RyY2F0KHNvYXAtPmFycmF5T2Zmc2V0LCAiXSIpOworICByZXR1cm4gc29hcC0+YXJyYXlPZmZzZXQ7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2l6ZShjb25zdCBpbnQgKnNpemUsIGludCBkaW0pCit7IHJlZ2lzdGVyIGludCBpLCBuID0gc2l6ZVswXTsKKyAgZm9yIChpID0gMTsgaSA8IGRpbTsgaSsrKQorICAgIG4gKj0gc2l6ZVtpXTsKKyAgcmV0dXJuIG47Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0b2Zmc2V0cyhjb25zdCBjaGFyICphdHRyLCBjb25zdCBpbnQgKnNpemUsIGludCAqb2Zmc2V0LCBpbnQgZGltKQoreyByZWdpc3RlciBpbnQgaSwgaiA9IDA7CisgIGlmIChvZmZzZXQpCisgICAgZm9yIChpID0gMDsgaSA8IGRpbSAmJiBhdHRyICYmICphdHRyOyBpKyspCisgICAgeyBhdHRyKys7CisgICAgICBqICo9IHNpemVbaV07CisgICAgICBqICs9IG9mZnNldFtpXSA9IChpbnQpYXRvbChhdHRyKTsKKyAgICAgIGF0dHIgPSBzdHJjaHIoYXR0ciwgJywnKTsKKyAgICB9CisgIGVsc2UKKyAgICBmb3IgKGkgPSAwOyBpIDwgZGltICYmIGF0dHIgJiYgKmF0dHI7IGkrKykKKyAgICB7IGF0dHIrKzsKKyAgICAgIGogKj0gc2l6ZVtpXTsKKyAgICAgIGogKz0gKGludClhdG9sKGF0dHIpOworICAgICAgYXR0ciA9IHN0cmNocihhdHRyLCAnLCcpOworICAgIH0KKyAgcmV0dXJuIGo7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0c2l6ZShjb25zdCBjaGFyICphdHRyMSwgY29uc3QgY2hhciAqYXR0cjIsIGludCAqaikKK3sgcmVnaXN0ZXIgaW50IG4sIGs7CisgIGNoYXIgKnM7CisgICpqID0gMDsKKyAgaWYgKCEqYXR0cjEpCisgICAgcmV0dXJuIC0xOworICBpZiAoKmF0dHIxID09ICdbJykKKyAgICBhdHRyMSsrOworICBuID0gMTsKKyAgZm9yICg7OykKKyAgeyBrID0gKGludClzb2FwX3N0cnRvbChhdHRyMSwgJnMsIDEwKTsKKyAgICBuICo9IGs7CisgICAgaWYgKGsgPCAwIHx8IG4gPiBTT0FQX01BWEFSUkFZU0laRSB8fCBzID09IGF0dHIxKQorICAgICAgcmV0dXJuIC0xOworICAgIGF0dHIxID0gc3RyY2hyKHMsICcsJyk7CisgICAgaWYgKCFhdHRyMSkKKyAgICAgIGF0dHIxID0gc3RyY2hyKHMsICcgJyk7CisgICAgaWYgKGF0dHIyICYmICphdHRyMikKKyAgICB7IGF0dHIyKys7CisgICAgICAqaiAqPSBrOworICAgICAgayA9IChpbnQpc29hcF9zdHJ0b2woYXR0cjIsICZzLCAxMCk7CisgICAgICAqaiArPSBrOworICAgICAgaWYgKGsgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgICBhdHRyMiA9IHM7CisgICAgfQorICAgIGlmICghYXR0cjEpCisgICAgICBicmVhazsKKyAgICBhdHRyMSsrOworICB9CisgIHJldHVybiBuIC0gKmo7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0c2l6ZXMoY29uc3QgY2hhciAqYXR0ciwgaW50ICpzaXplLCBpbnQgZGltKQoreyByZWdpc3RlciBpbnQgaSwgaywgbjsKKyAgaWYgKCEqYXR0cikKKyAgICByZXR1cm4gLTE7CisgIGkgPSBzdHJsZW4oYXR0cik7CisgIG4gPSAxOworICBkbworICB7IGZvciAoaSA9IGktMTsgaSA+PSAwOyBpLS0pCisgICAgICBpZiAoYXR0cltpXSA9PSAnWycgfHwgYXR0cltpXSA9PSAnLCcgfHwgYXR0cltpXSA9PSAnICcpCisgICAgICAgIGJyZWFrOworICAgIGsgPSAoaW50KWF0b2woYXR0ciArIGkgKyAxKTsKKyAgICBuICo9IHNpemVbLS1kaW1dID0gazsKKyAgICBpZiAoayA8IDAgfHwgbiA+IFNPQVBfTUFYQVJSQVlTSVpFKQorICAgICAgcmV0dXJuIC0xOworICB9IHdoaWxlIChpID49IDAgJiYgYXR0cltpXSAhPSAnWycpOworICByZXR1cm4gbjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRwb3NpdGlvbihjb25zdCBjaGFyICphdHRyLCBpbnQgKnBvcykKK3sgcmVnaXN0ZXIgaW50IGksIG47CisgIGlmICghKmF0dHIpCisgICAgcmV0dXJuIC0xOworICBuID0gMDsKKyAgaSA9IDE7CisgIGRvCisgIHsgcG9zW24rK10gPSAoaW50KWF0b2woYXR0ciArIGkpOworICAgIHdoaWxlIChhdHRyW2ldICYmIGF0dHJbaV0gIT0gJywnICYmIGF0dHJbaV0gIT0gJ10nKQorICAgICAgaSsrOworICAgIGlmIChhdHRyW2ldID09ICcsJykKKyAgICAgIGkrKzsKKyAgfSB3aGlsZSAobiA8IFNPQVBfTUFYRElNUyAmJiBhdHRyW2ldICYmIGF0dHJbaV0gIT0gJ10nKTsKKyAgcmV0dXJuIG47Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHVzaF9uYW1lc3BhY2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICpucykKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wOworICByZWdpc3RlciBzdHJ1Y3QgTmFtZXNwYWNlICpwOworICByZWdpc3RlciBzaG9ydCBpID0gLTE7CisgIHJlZ2lzdGVyIHNpemVfdCBuLCBrOworICBuID0gc3RybGVuKGlkKTsKKyAgayA9IHN0cmxlbihucykgKyAxOworICBwID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlczsKKyAgaWYgKHApCisgIHsgZm9yIChpID0gMDsgcC0+aWQ7IHArKywgaSsrKQorICAgIHsgaWYgKHAtPm5zICYmICFzdHJjbXAobnMsIHAtPm5zKSkKKyAgICAgIHsgaWYgKHAtPm91dCkKKyAgICAgICAgeyBTT0FQX0ZSRUUoc29hcCwgcC0+b3V0KTsKKyAgICAgICAgICBwLT5vdXQgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKHAtPm91dCkKKyAgICAgIHsgaWYgKCFzdHJjbXAobnMsIHAtPm91dCkpCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlbHNlIGlmIChwLT5pbikKKyAgICAgIHsgaWYgKCFzb2FwX3RhZ19jbXAobnMsIHAtPmluKSkKKyAgICAgICAgeyBpZiAoKHAtPm91dCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBrKSkpCisgICAgICAgICAgICBzdHJjcHkocC0+b3V0LCBucyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFwIHx8ICFwLT5pZCkKKyAgICAgIGkgPSAtMTsKKyAgfQorICBpZiAoaSA+PSAwKQorICAgIGsgPSAwOworICBucCA9IChzdHJ1Y3Qgc29hcF9ubGlzdCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX25saXN0KSArIG4gKyBrKTsKKyAgaWYgKCFucCkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgbnAtPm5leHQgPSBzb2FwLT5ubGlzdDsKKyAgc29hcC0+bmxpc3QgPSBucDsKKyAgbnAtPmxldmVsID0gc29hcC0+bGV2ZWw7CisgIG5wLT5pbmRleCA9IGk7CisgIHN0cmNweShucC0+aWQsIGlkKTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQdXNoIG5hbWVzcGFjZSBiaW5kaW5nIChsZXZlbD0ldSkgJyVzJyAnJXMnXG4iLCBzb2FwLT5sZXZlbCwgaWQsIG5zKSk7CisgIGlmIChpIDwgMCkKKyAgeyBucC0+bnMgPSBucC0+aWQgKyBuICsgMTsKKyAgICBzdHJjcHkobnAtPm5zLCBucyk7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQdXNoIE5PVCBPSzogbm8gbWF0Y2ggZm91bmQgZm9yICclcycgaW4gbmFtZXNwYWNlIG1hcHBpbmcgdGFibGUgKGFkZGVkIHRvIHN0YWNrIGFueXdheSlcbiIsIG5zKSk7CisgIH0KKyAgZWxzZQorICB7IG5wLT5ucyA9IE5VTEw7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQdXNoIE9LICgnJXMnIG1hdGNoZXMgJyVzJyBpbiBuYW1lc3BhY2UgdGFibGUpXG4iLCBpZCwgcC0+aWQpKTsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfcG9wX25hbWVzcGFjZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wOworICB3aGlsZSAoc29hcC0+bmxpc3QgJiYgc29hcC0+bmxpc3QtPmxldmVsID49IHNvYXAtPmxldmVsKQorICB7IG5wID0gc29hcC0+bmxpc3QtPm5leHQ7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQb3BwZWQgbmFtZXNwYWNlIGJpbmRpbmcgKGxldmVsPSV1KSAnJXMnXG4iLCBzb2FwLT5sZXZlbCwgc29hcC0+bmxpc3QtPmlkKSk7CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPm5saXN0KTsKKyAgICBzb2FwLT5ubGlzdCA9IG5wOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfbWF0Y2hfbmFtZXNwYWNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZDEsIGNvbnN0IGNoYXIgKmlkMiwgaW50IG4xLCBpbnQgbjIpIAoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnAgPSBzb2FwLT5ubGlzdDsKKyAgd2hpbGUgKG5wICYmIChzdHJuY21wKG5wLT5pZCwgaWQxLCBuMSkgfHwgbnAtPmlkW24xXSkpCisgICAgbnAgPSBucC0+bmV4dDsKKyAgaWYgKG5wKQorICB7IGlmIChucC0+aW5kZXggPCAwCisgICAgIHx8IChzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW25wLT5pbmRleF0uaWQKKyAgICAgICYmIChzdHJuY21wKHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbbnAtPmluZGV4XS5pZCwgaWQyLCBuMikKKyAgICAgICB8fCBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW25wLT5pbmRleF0uaWRbbjJdKSkpCisgICAgICByZXR1cm4gU09BUF9OQU1FU1BBQ0U7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgaWYgKG4xID09IDMgJiYgbjEgPT0gbjIgJiYgIXN0cmNtcChpZDEsICJ4bWwiKSAmJiAhc3RyY21wKGlkMSwgaWQyKSkKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgcmV0dXJuIFNPQVBfU1lOVEFYX0VSUk9SOyAKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2N1cnJlbnRfbmFtZXNwYWNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucDsKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKKyAgbnAgPSBzb2FwLT5ubGlzdDsKKyAgaWYgKCEocyA9IHN0cmNocih0YWcsICc6JykpKQorICB7IHdoaWxlIChucCAmJiAqbnAtPmlkKSAvKiBmaW5kIGRlZmF1bHQgbmFtZXNwYWNlLCBpZiBwcmVzZW50ICovCisgICAgICBucCA9IG5wLT5uZXh0OworICB9CisgIGVsc2UKKyAgeyB3aGlsZSAobnAgJiYgKHN0cm5jbXAobnAtPmlkLCB0YWcsIHMgLSB0YWcpIHx8IG5wLT5pZFtzIC0gdGFnXSkpCisgICAgICBucCA9IG5wLT5uZXh0OworICAgIGlmICghbnApCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfTkFNRVNQQUNFOworICB9CisgIGlmIChucCkKKyAgeyBpZiAobnAtPmluZGV4ID49IDApCisgICAgICByZXR1cm4gc29hcC0+bmFtZXNwYWNlc1tucC0+aW5kZXhdLm5zOworICAgIGlmIChucC0+bnMpCisgICAgICByZXR1cm4gc29hcF9zdHJkdXAoc29hcCwgbnAtPm5zKTsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF90YWdfY21wKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKnQpCit7IGZvciAoOzspCisgIHsgcmVnaXN0ZXIgaW50IGMxID0gKnM7CisgICAgcmVnaXN0ZXIgaW50IGMyID0gKnQ7CisgICAgaWYgKCFjMSB8fCBjMSA9PSAnIicpCisgICAgICBicmVhazsKKyAgICBpZiAoYzIgIT0gJy0nKQorICAgIHsgaWYgKGMxICE9IGMyKQorICAgICAgeyBpZiAoYzEgPj0gJ0EnICYmIGMxIDw9ICdaJykKKyAgICAgICAgICBjMSArPSAnYScgLSAnQSc7CisgICAgICAgIGlmIChjMiA+PSAnQScgJiYgYzIgPD0gJ1onKQorICAgICAgICAgIGMyICs9ICdhJyAtICdBJzsKKyAgICAgIH0KKyAgICAgIGlmIChjMSAhPSBjMikKKyAgICAgIHsgaWYgKGMyICE9ICcqJykKKyAgICAgICAgICByZXR1cm4gMTsKKwljMiA9ICorK3Q7CisgICAgICAgIGlmICghYzIpCisJICByZXR1cm4gMDsKKyAgICAgICAgaWYgKGMyID49ICdBJyAmJiBjMiA8PSAnWicpCisgICAgICAgICAgYzIgKz0gJ2EnIC0gJ0EnOworICAgICAgICBmb3IgKDs7KQorICAgICAgICB7IGMxID0gKnM7CisJICBpZiAoIWMxIHx8IGMxID09ICciJykKKwkgICAgYnJlYWs7CisJICBpZiAoYzEgPj0gJ0EnICYmIGMxIDw9ICdaJykKKyAgICAgICAgICAgIGMxICs9ICdhJyAtICdBJzsKKyAgICAgICAgICBpZiAoYzEgPT0gYzIgJiYgIXNvYXBfdGFnX2NtcChzICsgMSwgdCArIDEpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisJICBzKys7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHMrKzsKKyAgICB0Kys7CisgIH0KKyAgaWYgKCp0ID09ICcqJyAmJiAhdFsxXSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuICp0OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX21hdGNoX3RhZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnMSwgY29uc3QgY2hhciAqdGFnMikKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqcywgKnQ7CisgIGlmICghdGFnMSB8fCAhdGFnMiB8fCAhKnRhZzIpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIHMgPSBzdHJjaHIodGFnMSwgJzonKTsKKyAgdCA9IHN0cmNocih0YWcyLCAnOicpOworICBpZiAodCkKKyAgeyBpZiAocykKKyAgICB7IGlmICh0WzFdICYmIFNPQVBfU1RSQ01QKHMgKyAxLCB0ICsgMSkpCisgICAgICAgIHJldHVybiBTT0FQX1RBR19NSVNNQVRDSDsKKyAgICAgIGlmICh0ICE9IHRhZzIgJiYgc29hcF9tYXRjaF9uYW1lc3BhY2Uoc29hcCwgdGFnMSwgdGFnMiwgcyAtIHRhZzEsIHQgLSB0YWcyKSkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJUYWdzICclcycgYW5kICclcycgbWF0Y2ggYnV0IG5hbWVzcGFjZXMgZGlmZmVyXG4iLCB0YWcxLCB0YWcyKSk7CisgICAgICAgIHJldHVybiBTT0FQX1RBR19NSVNNQVRDSDsKKyAgICAgIH0KKyAgICB9IAorICAgIGVsc2UgaWYgKFNPQVBfU1RSQ01QKHRhZzEsIHQgKyAxKSkKKyAgICAgIHJldHVybiBTT0FQX1RBR19NSVNNQVRDSDsKKyAgICBlbHNlIGlmICh0ICE9IHRhZzIgJiYgc29hcF9tYXRjaF9uYW1lc3BhY2Uoc29hcCwgdGFnMSwgdGFnMiwgMCwgdCAtIHRhZzIpKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJUYWdzICclcycgYW5kICclcycgbWF0Y2ggYnV0IG5hbWVzcGFjZXMgZGlmZmVyXG4iLCB0YWcxLCB0YWcyKSk7CisgICAgICByZXR1cm4gU09BUF9UQUdfTUlTTUFUQ0g7CisgICAgfQorICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVGFncyBhbmQgKGRlZmF1bHQpIG5hbWVzcGFjZXMgbWF0Y2g6ICclcycgJyVzJ1xuIiwgdGFnMSwgdGFnMikpOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIGlmIChzKQorICB7IGlmIChTT0FQX1NUUkNNUChzICsgMSwgdGFnMikpCisgICAgICByZXR1cm4gU09BUF9UQUdfTUlTTUFUQ0g7CisgIH0KKyAgZWxzZSBpZiAoU09BUF9TVFJDTVAodGFnMSwgdGFnMikpCisgICAgcmV0dXJuIFNPQVBfVEFHX01JU01BVENIOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlRhZ3MgbWF0Y2g6ICclcycgJyVzJ1xuIiwgdGFnMSwgdGFnMikpOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9tYXRjaF9hcnJheShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdHlwZSkKK3sgaWYgKCpzb2FwLT5hcnJheVR5cGUpCisgICAgaWYgKHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPmFycmF5VHlwZSwgdHlwZSkKKyAgICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+YXJyYXlUeXBlLCAieHNkOmFueVR5cGUiKQorICAgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT5hcnJheVR5cGUsICJ4c2Q6dXItdHlwZSIpCisgICAgKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJBcnJheSB0eXBlIG1pc21hdGNoOiAnJXMnICclcydcbiIsIHNvYXAtPmFycmF5VHlwZSwgdHlwZSkpOworICAgICAgcmV0dXJuIFNPQVBfVEFHX01JU01BVENIOworICAgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglTU0wKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgV0lUSF9PUEVOU1NMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yYW5kKCkKK3sgdW5zaWduZWQgY2hhciBidWZbNF07CisgIGlmICghc3NsX2luaXRfZG9uZSkKKyAgICBzb2FwX3NzbF9pbml0KCk7CisgIFJBTkRfcHNldWRvX2J5dGVzKGJ1ZiwgNCk7CisgIHJldHVybiAqKGludCopYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NzbF9zZXJ2ZXJfY29udGV4dChzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgc2hvcnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmtleWZpbGUsIGNvbnN0IGNoYXIgKnBhc3N3b3JkLCBjb25zdCBjaGFyICpjYWZpbGUsIGNvbnN0IGNoYXIgKmNhcGF0aCwgY29uc3QgY2hhciAqZGhmaWxlLCBjb25zdCBjaGFyICpyYW5kZmlsZSwgY29uc3QgY2hhciAqc2lkKQoreyBpbnQgZXJyOworICBzb2FwLT5rZXlmaWxlID0ga2V5ZmlsZTsKKyAgc29hcC0+cGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgc29hcC0+Y2FmaWxlID0gY2FmaWxlOworICBzb2FwLT5jYXBhdGggPSBjYXBhdGg7CisgIGlmIChkaGZpbGUpCisgIHsgc29hcC0+ZGhmaWxlID0gZGhmaWxlOworICAgIHNvYXAtPnJzYSA9IDA7CisgIH0KKyAgZWxzZQorICB7IHNvYXAtPmRoZmlsZSA9IE5VTEw7CisgICAgc29hcC0+cnNhID0gMTsKKyAgfQorICBzb2FwLT5yYW5kZmlsZSA9IHJhbmRmaWxlOworICBzb2FwLT5yZXF1aXJlX2NsaWVudF9hdXRoID0gKGZsYWdzICYgU09BUF9TU0xfUkVRVUlSRV9DTElFTlRfQVVUSEVOVElDQVRJT04pOworICBpZiAoIShlcnIgPSBzb2FwLT5mc3NsYXV0aChzb2FwKSkpCisgIHsgaWYgKHNpZCkKKyAgICAgIFNTTF9DVFhfc2V0X3Nlc3Npb25faWRfY29udGV4dChzb2FwLT5jdHgsICh1bnNpZ25lZCBjaGFyKilzaWQsIHN0cmxlbihzaWQpKTsKKyAgfQorICByZXR1cm4gZXJyOyAKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zc2xfY2xpZW50X2NvbnRleHQoc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIHNob3J0IGZsYWdzLCBjb25zdCBjaGFyICprZXlmaWxlLCBjb25zdCBjaGFyICpwYXNzd29yZCwgY29uc3QgY2hhciAqY2FmaWxlLCBjb25zdCBjaGFyICpjYXBhdGgsIGNvbnN0IGNoYXIgKnJhbmRmaWxlKQoreyBzb2FwLT5rZXlmaWxlID0ga2V5ZmlsZTsKKyAgc29hcC0+cGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgc29hcC0+Y2FmaWxlID0gY2FmaWxlOworICBzb2FwLT5jYXBhdGggPSBjYXBhdGg7CisgIHNvYXAtPmRoZmlsZSA9IE5VTEw7CisgIHNvYXAtPnJzYSA9IDA7CisgIHNvYXAtPnJhbmRmaWxlID0gcmFuZGZpbGU7CisgIHNvYXAtPnJlcXVpcmVfc2VydmVyX2F1dGggPSAoZmxhZ3MgJiBTT0FQX1NTTF9SRVFVSVJFX1NFUlZFUl9BVVRIRU5USUNBVElPTik7CisgIHJldHVybiBzb2FwLT5mc3NsYXV0aChzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc3NsX2luaXQoKQoreyAvKiBOb3RlOiBmb3IgTVQgc3lzdGVtcywgdGhlIG1haW4gcHJvZ3JhbSBNVVNUIGNhbGwgc29hcF9zc2xfaW5pdCgpIGJlZm9yZSBhbnkgdGhyZWFkcyBhcmUgc3RhcnRlZCAqLworICBpZiAoIXNzbF9pbml0X2RvbmUpCisgIHsgc3NsX2luaXRfZG9uZSA9IDE7CisgICAgU1NMX2xpYnJhcnlfaW5pdCgpOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBTU0xfbG9hZF9lcnJvcl9zdHJpbmdzKCk7CisjZW5kaWYKKyAgICBpZiAoIVJBTkRfbG9hZF9maWxlKCIvZGV2L3VyYW5kb20iLCAxMDI0KSkKKyAgICB7IGNoYXIgYnVmWzEwMjRdOworICAgICAgUkFORF9zZWVkKGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgICAgd2hpbGUgKCFSQU5EX3N0YXR1cygpKQorICAgICAgeyBpbnQgciA9IHJhbmQoKTsKKyAgICAgICAgUkFORF9zZWVkKCZyLCBzaXplb2YoaW50KSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY29uc3QgY2hhciAqCitzc2xfZXJyb3Ioc3RydWN0IHNvYXAgKnNvYXAsIGludCByZXQpCit7IGludCBlcnIgPSBTU0xfZ2V0X2Vycm9yKHNvYXAtPnNzbCwgcmV0KTsKKyAgY29uc3QgY2hhciAqbXNnID0gc29hcF9zdHJfY29kZShoX3NzbF9lcnJvcl9jb2RlcywgZXJyKTsKKyAgaWYgKG1zZykKKyAgICBzdHJjcHkoc29hcC0+bXNnYnVmLCBtc2cpOworICBlbHNlCisgICAgcmV0dXJuIEVSUl9lcnJvcl9zdHJpbmcoZXJyLCBzb2FwLT5tc2didWYpOworICBpZiAoRVJSX3BlZWtfZXJyb3IoKSkKKyAgeyB1bnNpZ25lZCBsb25nIHI7CisgICAgc3RyY2F0KHNvYXAtPm1zZ2J1ZiwgIlxuIik7CisgICAgd2hpbGUgKChyID0gRVJSX2dldF9lcnJvcigpKSkKKyAgICAgIEVSUl9lcnJvcl9zdHJpbmdfbihyLCBzb2FwLT5tc2didWYgKyBzdHJsZW4oc29hcC0+bXNnYnVmKSwgc2l6ZW9mKHNvYXAtPm1zZ2J1ZikgLSBzdHJsZW4oc29hcC0+bXNnYnVmKSk7CisgIH0gCisgIGVsc2UKKyAgeyBzd2l0Y2ggKHJldCkKKyAgICB7IGNhc2UgMDoKKyAgICAgICAgc3RyY3B5KHNvYXAtPm1zZ2J1ZiwgIkVPRiB3YXMgb2JzZXJ2ZWQgdGhhdCB2aW9sYXRlcyB0aGUgcHJvdG9jb2wuIFRoZSBjbGllbnQgcHJvYmFibHkgcHJvdmlkZWQgaW52YWxpZCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbi4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIC0xOgorICAgICAgICBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIkVycm9yIG9ic2VydmVkIGJ5IHVuZGVybHlpbmcgQklPOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7ICAKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5tc2didWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzc2xfcGFzc3dvcmQoY2hhciAqYnVmLCBpbnQgbnVtLCBpbnQgcndmbGFnLCB2b2lkICp1c2VyZGF0YSkKK3sgaWYgKG51bSA8IChpbnQpc3RybGVuKChjaGFyKil1c2VyZGF0YSkgKyAxKQorICAgIHJldHVybiAwOworICByZXR1cm4gc3RybGVuKHN0cmNweShidWYsIChjaGFyKil1c2VyZGF0YSkpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUaGlzIGNhbGxiYWNrIGlzIGluY2x1ZGVkIGZvciBmdXR1cmUgcmVmZXJlbmNlcy4gSXQgc2hvdWxkIG5vdCBiZSBkZWxldGVkCisjaWZuZGVmIFBBTE1fMgorc3RhdGljIERIICoKK3NzbF90bXBfZGgoU1NMICpzc2wsIGludCBpc19leHBvcnQsIGludCBrZXlsZW5ndGgpCit7IHN0YXRpYyBESCAqZGg1MTIgPSBOVUxMOworICBzdGF0aWMgREggKmRoMTAyNCA9IE5VTEw7CisgIERIICpkaDsKKyAgc3dpdGNoIChrZXlsZW5ndGgpCisgIHsgY2FzZSA1MTI6CisgICAgICBpZiAoIWRoNTEyKQorICAgICAgeyBCSU8gKmJpbyA9IEJJT19uZXdfZmlsZSgiZGg1MTIucGVtIiwgInIiKTsKKyAgICAgICAgaWYgKGJpbykKKyAgICAgICAgeyBkaDUxMiA9IFBFTV9yZWFkX2Jpb19ESHBhcmFtcyhiaW8sIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgICAgIEJJT19mcmVlKGJpbyk7CisgICAgICAgICAgcmV0dXJuIGRoNTEyOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBkaDUxMjsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKCFkaDEwMjQpCisgICAgICB7IEJJTyAqYmlvID0gQklPX25ld19maWxlKCJkaDEwMjQucGVtIiwgInIiKTsKKyAgICAgICAgaWYgKGJpbykKKyAgICAgICAgeyBkaDEwMjQgPSBQRU1fcmVhZF9iaW9fREhwYXJhbXMoYmlvLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICBCSU9fZnJlZShiaW8pOworICAgICAgICB9CisgICAgICB9CisgICAgICBkaCA9IGRoMTAyNDsKKyAgfQorICByZXR1cm4gZGg7Cit9CisjZW5kaWYKKyovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc3NsX2F1dGhfaW5pdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKCFzc2xfaW5pdF9kb25lKQorICAgIHNvYXBfc3NsX2luaXQoKTsKKyAgaWYgKCFzb2FwLT5jdHgpCisgIHsgaWYgKCEoc29hcC0+Y3R4ID0gU1NMX0NUWF9uZXcoU1NMdjIzX21ldGhvZCgpKSkpCisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCBzZXR1cCBjb250ZXh0IiwgU09BUF9TU0xfRVJST1IpOworICB9CisgIGlmIChzb2FwLT5yYW5kZmlsZSkKKyAgeyBpZiAoIVJBTkRfbG9hZF9maWxlKHNvYXAtPnJhbmRmaWxlLCAtMSkpCisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCBsb2FkIHJhbmRvbW5lc3MiLCBTT0FQX1NTTF9FUlJPUik7CisgIH0KKyAgaWYgKHNvYXAtPmNhZmlsZSB8fCBzb2FwLT5jYXBhdGgpCisgIHsgaWYgKCFTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhzb2FwLT5jdHgsIHNvYXAtPmNhZmlsZSwgc29hcC0+Y2FwYXRoKSkKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHJlYWQgQ0EgZmlsZSBhbmQgZGlyZWN0b3J5IiwgU09BUF9TU0xfRVJST1IpOworICAgIGlmIChzb2FwLT5jYWZpbGUgJiYgc29hcC0+cmVxdWlyZV9jbGllbnRfYXV0aCkKKyAgICAgIFNTTF9DVFhfc2V0X2NsaWVudF9DQV9saXN0KHNvYXAtPmN0eCwgU1NMX2xvYWRfY2xpZW50X0NBX2ZpbGUoc29hcC0+Y2FmaWxlKSk7CisgIH0KKyAgaWYgKCFTU0xfQ1RYX3NldF9kZWZhdWx0X3ZlcmlmeV9wYXRocyhzb2FwLT5jdHgpKQorICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHJlYWQgZGVmYXVsdCBDQSBmaWxlIGFuZC9vciBkaXJlY3RvcnkiLCBTT0FQX1NTTF9FUlJPUik7CisvKiBTZWUgYmVsb3cgKi8KKyAgaWYgKHNvYXAtPmtleWZpbGUpCisgIHsgaWYgKCFTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKHNvYXAtPmN0eCwgc29hcC0+a2V5ZmlsZSkpCisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCByZWFkIGNlcnRpZmljYXRlIGtleSBmaWxlIiwgU09BUF9TU0xfRVJST1IpOworICAgIGlmIChzb2FwLT5wYXNzd29yZCkKKyAgICB7IFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiX3VzZXJkYXRhKHNvYXAtPmN0eCwgKHZvaWQqKXNvYXAtPnBhc3N3b3JkKTsKKyAgICAgIFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiKHNvYXAtPmN0eCwgc3NsX3Bhc3N3b3JkKTsKKyAgICB9CisgICAgaWYgKCFTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X2ZpbGUoc29hcC0+Y3R4LCBzb2FwLT5rZXlmaWxlLCBTU0xfRklMRVRZUEVfUEVNKSkKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHJlYWQga2V5IGZpbGUiLCBTT0FQX1NTTF9FUlJPUik7CisgIH0KKy8qIFN1Z2dlc3RlZCBhbHRlcm5hdGl2ZSBhcHByb2FjaCB0byBjaGVjayBjYWZpbGUgZmlyc3QgYmVmb3JlIHRoZSBrZXkgZmlsZToKKyAgaWYgKHNvYXAtPnBhc3N3b3JkKQorICB7IFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiX3VzZXJkYXRhKHNvYXAtPmN0eCwgKHZvaWQqKXNvYXAtPnBhc3N3b3JkKTsKKyAgICBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYihzb2FwLT5jdHgsIHNzbF9wYXNzd29yZCk7CisgIH0KKyAgaWYgKCFzb2FwLT5jYWZpbGUgfHwgIVNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoc29hcC0+Y3R4LCBzb2FwLT5jYWZpbGUpKQorICB7IGlmIChzb2FwLT5rZXlmaWxlKQorICAgIHsgaWYgKCFTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKHNvYXAtPmN0eCwgc29hcC0+a2V5ZmlsZSkpCisgICAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHJlYWQgY2VydGlmaWNhdGUgb3Iga2V5IGZpbGUiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgICBpZiAoIVNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfZmlsZShzb2FwLT5jdHgsIHNvYXAtPmtleWZpbGUsIFNTTF9GSUxFVFlQRV9QRU0pKQorICAgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCByZWFkIGtleSBmaWxlIiwgU09BUF9TU0xfRVJST1IpOworICAgIH0KKyAgfQorKi8KKyAgaWYgKHNvYXAtPnJzYSkKKyAgeyBSU0EgKnJzYSA9IFJTQV9nZW5lcmF0ZV9rZXkoMTAyNCwgUlNBX0Y0LCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoIVNTTF9DVFhfc2V0X3RtcF9yc2Eoc29hcC0+Y3R4LCByc2EpKQorICAgIHsgaWYgKHJzYSkKKyAgICAgICAgUlNBX2ZyZWUocnNhKTsKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHNldCBSU0Ega2V5IiwgU09BUF9TU0xfRVJST1IpOworICAgIH0KKyAgICBSU0FfZnJlZShyc2EpOworICB9CisgIGVsc2UgaWYgKHNvYXAtPmRoZmlsZSkKKyAgeyBESCAqZGggPSAwOworICAgIEJJTyAqYmlvOworICAgIGJpbyA9IEJJT19uZXdfZmlsZShzb2FwLT5kaGZpbGUsICJyIik7CisgICAgaWYgKCFiaW8pCisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCByZWFkIERIIGZpbGUiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgZGggPSBQRU1fcmVhZF9iaW9fREhwYXJhbXMoYmlvLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBCSU9fZnJlZShiaW8pOworICAgIGlmIChTU0xfQ1RYX3NldF90bXBfZGgoc29hcC0+Y3R4LCBkaCkgPCAwKQorICAgIHsgaWYgKGRoKQorICAgICAgICBESF9mcmVlKGRoKTsKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHNldCBESCBwYXJhbWV0ZXJzIiwgU09BUF9TU0xfRVJST1IpOworICAgIH0KKyAgICBESF9mcmVlKGRoKTsKKyAgfQorICBTU0xfQ1RYX3NldF9vcHRpb25zKHNvYXAtPmN0eCwgU1NMX09QX0FMTCB8IFNTTF9PUF9OT19TU0x2Mik7CisgIFNTTF9DVFhfc2V0X3ZlcmlmeShzb2FwLT5jdHgsIHNvYXAtPnJlcXVpcmVfY2xpZW50X2F1dGggPyAoU1NMX1ZFUklGWV9QRUVSIHwgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCkgOiBzb2FwLT5yZXF1aXJlX3NlcnZlcl9hdXRoID8gU1NMX1ZFUklGWV9QRUVSIDogU1NMX1ZFUklGWV9OT05FLCBzb2FwLT5mc3NsdmVyaWZ5KTsKKyNpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA8IDB4MDA5MDUxMDBMKQorICBTU0xfQ1RYX3NldF92ZXJpZnlfZGVwdGgoc29hcC0+Y3R4LCAxKTsgCisjZWxzZQorICBTU0xfQ1RYX3NldF92ZXJpZnlfZGVwdGgoc29hcC0+Y3R4LCA5KTsgCisjZW5kaWYgIAorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NzbF92ZXJpZnlfY2FsbGJhY2soaW50IG9rLCBYNTA5X1NUT1JFX0NUWCAqc3RvcmUpCit7CisjaWZkZWYgU09BUF9ERUJVRworICBpZiAoIW9rKSAKKyAgeyBjaGFyIGRhdGFbMjU2XTsKKyAgICBYNTA5ICpjZXJ0ID0gWDUwOV9TVE9SRV9DVFhfZ2V0X2N1cnJlbnRfY2VydChzdG9yZSk7CisgICAgZnByaW50ZihzdGRlcnIsICJTU0wgdmVyaWZ5IGVycm9yIG9yIHdhcm5pbmcgd2l0aCBjZXJ0aWZpY2F0ZSBhdCBkZXB0aCAlZDogJXNcbiIsIFg1MDlfU1RPUkVfQ1RYX2dldF9lcnJvcl9kZXB0aChzdG9yZSksIFg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKFg1MDlfU1RPUkVfQ1RYX2dldF9lcnJvcihzdG9yZSkpKTsKKyAgICBYNTA5X05BTUVfb25lbGluZShYNTA5X2dldF9pc3N1ZXJfbmFtZShjZXJ0KSwgZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImNlcnRpZmljYXRlIGlzc3VlciAlc1xuIiwgZGF0YSk7CisgICAgWDUwOV9OQU1FX29uZWxpbmUoWDUwOV9nZXRfc3ViamVjdF9uYW1lKGNlcnQpLCBkYXRhLCBzaXplb2YoZGF0YSkpOworICAgIGZwcmludGYoc3RkZXJyLCAiY2VydGlmaWNhdGUgc3ViamVjdCAlc1xuIiwgZGF0YSk7CisgIH0KKyNlbmRpZgorICAvKiBOb3RlOiByZXR1cm4gMSB0byBjb250aW51ZSwgYnV0IHVuc2FmZSBwcm9ncmVzcyB3aWxsIGJlIHRlcm1pbmF0ZWQgYnkgU1NMICovCisgIHJldHVybiBvazsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zc2xfYWNjZXB0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBCSU8gKmJpbzsKKyAgaW50IGksIHI7CisgIGlmICghc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJObyBzb2NrZXQgaW4gc29hcF9zc2xfYWNjZXB0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgIGlmICghc29hcC0+Y3R4ICYmIChzb2FwLT5lcnJvciA9IHNvYXAtPmZzc2xhdXRoKHNvYXApKSkKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgaWYgKCFzb2FwLT5zc2wpCisgIHsgc29hcC0+c3NsID0gU1NMX25ldyhzb2FwLT5jdHgpOworICAgIGlmICghc29hcC0+c3NsKQorICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiU1NMX25ldygpIGZhaWxlZCBpbiBzb2FwX3NzbF9hY2NlcHQoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgfQorICBlbHNlCisgICAgU1NMX2NsZWFyKHNvYXAtPnNzbCk7CisgIHNvYXAtPmltb2RlIHw9IFNPQVBfRU5DX1NTTDsKKyAgc29hcC0+b21vZGUgfD0gU09BUF9FTkNfU1NMOworI2lmIGRlZmluZWQoV0lOMzIpCisgIHsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGSU9OQklPLCAmbm9uYmxvY2tpbmcpOworICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgIHsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICBpb2N0bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGSU9OQklPLCAoaW50KSZub25ibG9ja2luZyk7CisgIH0KKyNlbHNlCisgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfR0VURkwpfE9fTk9OQkxPQ0spOworI2VuZGlmCisgIGJpbyA9IEJJT19uZXdfc29ja2V0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEJJT19OT0NMT1NFKTsKKyAgU1NMX3NldF9iaW8oc29hcC0+c3NsLCBiaW8sIGJpbyk7CisgIGkgPSAxMDA7IC8qIDEwMCAqIDAuMSBtcyByZXRyaWVzICovCisgIHdoaWxlICgociA9IFNTTF9hY2NlcHQoc29hcC0+c3NsKSkgPD0gMCkKKyAgeyBpbnQgZXJyID0gU1NMX2dldF9lcnJvcihzb2FwLT5zc2wsIHIpOworICAgIGlmIChlcnIgPT0gU1NMX0VSUk9SX1dBTlRfUkVBRCB8fCBlcnIgPT0gU1NMX0VSUk9SX1dBTlRfV1JJVEUpCisgICAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgICAgZmRfc2V0IGZkOworICAgICAgaWYgKGktLSA8PSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHRpbWVvdXQudHZfc2VjID0gMDsKKyAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDEwMDAwMDsKKyAgICAgIEZEX1pFUk8oJmZkKTsKKyAgICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmZmQpOworICAgICAgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCAmZmQsIE5VTEwsICZmZCwgJnRpbWVvdXQpOworICAgICAgaWYgKHIgPCAwICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIpCisgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICByZXR1cm4gU09BUF9FT0Y7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7IHNvYXAtPmVycm51bSA9IGVycjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorI2lmIGRlZmluZWQoV0lOMzIpCisgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGSU9OQklPLCAmYmxvY2tpbmcpOworICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICBpb2N0bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGSU9OQklPLCAoaW50KSZibG9ja2luZyk7CisgIH0KKyNlbHNlCisgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfR0VURkwpJn5PX05PTkJMT0NLKTsKKyNlbmRpZgorICBpZiAociA8PSAwKQorICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHNzbF9lcnJvcihzb2FwLCByKSwgIlNTTF9hY2NlcHQoKSBmYWlsZWQgaW4gc29hcF9zc2xfYWNjZXB0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgcmV0dXJuIFNPQVBfU1NMX0VSUk9SOworICB9CisgIGlmIChzb2FwLT5yZXF1aXJlX2NsaWVudF9hdXRoKQorICB7IFg1MDkgKnBlZXI7CisgICAgaW50IGVycjsKKyAgICBpZiAoKGVyciA9IFNTTF9nZXRfdmVyaWZ5X3Jlc3VsdChzb2FwLT5zc2wpKSAhPSBYNTA5X1ZfT0spCisgICAgeyBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgIHJldHVybiBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgWDUwOV92ZXJpZnlfY2VydF9lcnJvcl9zdHJpbmcoZXJyKSwgIlNTTCBjZXJ0aWZpY2F0ZSBwcmVzZW50ZWQgYnkgcGVlciBjYW5ub3QgYmUgdmVyaWZpZWQgaW4gc29hcF9zc2xfYWNjZXB0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgfQorICAgIHBlZXIgPSBTU0xfZ2V0X3BlZXJfY2VydGlmaWNhdGUoc29hcC0+c3NsKTsKKyAgICBpZiAoIXBlZXIpCisgICAgeyBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgIHJldHVybiBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJObyBTU0wgY2VydGlmaWNhdGUgd2FzIHByZXNlbnRlZCBieSB0aGUgcGVlciBpbiBzb2FwX3NzbF9hY2NlcHQoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICB9CisgICAgWDUwOV9mcmVlKHBlZXIpOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZW5kaWYgLyogV0lUSF9PUEVOU1NMICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3RjcF9pbml0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5lcnJtb2RlID0gMTsKKyNpZmRlZiBXSU4zMgorICBpZiAodGNwX2RvbmUpCisgICAgcmV0dXJuIDA7CisgIGVsc2UKKyAgeyBXU0FEQVRBIHc7CisgICAgaWYgKFdTQVN0YXJ0dXAoTUFLRVdPUkQoMSwgMSksICZ3KSkKKyAgICAgIHJldHVybiAtMTsKKyAgICB0Y3BfZG9uZSA9IDE7CisgIH0KKyNlbmRpZgorICByZXR1cm4gMDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9kb25lKHN0cnVjdCBzb2FwICpzb2FwKQoreyAKKyNpZmRlZiBTT0FQX0RFQlVHCisgIGludCBpOworI2VuZGlmCisgIGlmIChzb2FwX2NoZWNrX3N0YXRlKHNvYXApKQorICAgIHJldHVybjsKKyAgc29hcF9mcmVlKHNvYXApOworICB3aGlsZSAoc29hcC0+Y2xpc3QpCisgIHsgc3RydWN0IHNvYXBfY2xpc3QgKnAgPSBzb2FwLT5jbGlzdC0+bmV4dDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+Y2xpc3QpOworICAgIHNvYXAtPmNsaXN0ID0gcDsKKyAgfQorICBzb2FwLT5rZWVwX2FsaXZlID0gMDsgLyogdG8gZm9yY2UgY2xvc2UgdGhlIHNvY2tldCAqLworICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyNpZmRlZiBXSVRIX0NPT0tJRVMKKyAgc29hcF9mcmVlX2Nvb2tpZXMoc29hcCk7CisjZW5kaWYKKyAgd2hpbGUgKHNvYXAtPnBsdWdpbnMpCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGx1Z2luICpwID0gc29hcC0+cGx1Z2lucy0+bmV4dDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlbW92aW5nIHBsdWdpbiAnJXMnXG4iLCBzb2FwLT5wbHVnaW5zLT5pZCkpOworICAgIGlmIChzb2FwLT5wbHVnaW5zLT5mY29weSB8fCBzb2FwLT5zdGF0ZSA9PSBTT0FQX0lOSVQpCisgICAgICBzb2FwLT5wbHVnaW5zLT5mZGVsZXRlKHNvYXAsIHNvYXAtPnBsdWdpbnMpOworICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5wbHVnaW5zKTsKKyAgICBzb2FwLT5wbHVnaW5zID0gcDsKKyAgfQorICBzb2FwLT5mcGx1Z2luID0gZnBsdWdpbjsKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyAgc29hcC0+ZnBvc3QgPSBodHRwX3Bvc3Q7CisgIHNvYXAtPmZnZXQgPSBodHRwX2dldDsKKyAgc29hcC0+ZmZvcm0gPSBOVUxMOworICBzb2FwLT5mcG9zdGhkciA9IGh0dHBfcG9zdF9oZWFkZXI7CisgIHNvYXAtPmZyZXNwb25zZSA9IGh0dHBfcmVzcG9uc2U7CisgIHNvYXAtPmZwYXJzZSA9IGh0dHBfcGFyc2U7CisgIHNvYXAtPmZwYXJzZWhkciA9IGh0dHBfcGFyc2VfaGVhZGVyOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0lQVjYKKyAgc29hcC0+ZnJlc29sdmUgPSB0Y3BfZ2V0aG9zdDsKKyNlbHNlCisgIHNvYXAtPmZyZXNvbHZlID0gTlVMTDsKKyNlbmRpZgorICBzb2FwLT5mYWNjZXB0ID0gdGNwX2FjY2VwdDsKKyAgc29hcC0+Zm9wZW4gPSB0Y3BfY29ubmVjdDsKKyAgc29hcC0+ZmNsb3NlID0gdGNwX2Rpc2Nvbm5lY3Q7CisgIHNvYXAtPmZjbG9zZXNvY2tldCA9IHRjcF9jbG9zZXNvY2tldDsKKyAgc29hcC0+ZnNodXRkb3duc29ja2V0ID0gdGNwX3NodXRkb3duc29ja2V0OworICBzb2FwLT5mc2VuZCA9IGZzZW5kOworICBzb2FwLT5mcmVjdiA9IGZyZWN2OworICBzb2FwLT5mcG9sbCA9IHNvYXBfcG9sbDsKKyNlbHNlCisgIHNvYXAtPmZvcGVuID0gTlVMTDsKKyAgc29hcC0+ZmNsb3NlID0gTlVMTDsKKyAgc29hcC0+ZnBvbGwgPSBOVUxMOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXAtPmZwcmVwYXJlaW5pdCA9IE5VTEw7CisgIHNvYXAtPmZwcmVwYXJlc2VuZCA9IE5VTEw7CisgIHNvYXAtPmZwcmVwYXJlcmVjdiA9IE5VTEw7CisgIHNvYXAtPmZwcmVwYXJlZmluYWwgPSBOVUxMOworI2VuZGlmCisgIHNvYXAtPmZzZXRlcnJvciA9IE5VTEw7CisgIHNvYXAtPmZpZ25vcmUgPSBOVUxMOworICBzb2FwLT5mc2VydmVsb29wID0gTlVMTDsKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgaWYgKHNvYXAtPnNlc3Npb24pCisgIHsgU1NMX1NFU1NJT05fZnJlZShzb2FwLT5zZXNzaW9uKTsKKyAgICBzb2FwLT5zZXNzaW9uID0gTlVMTDsKKyAgfQorI2VuZGlmCisgIGlmIChzb2FwLT5zdGF0ZSA9PSBTT0FQX0lOSVQpCisgIHsgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikpCisgICAgeyBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKXNvYXAtPm1hc3Rlcik7CisgICAgICBzb2FwLT5tYXN0ZXIgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICAgIH0KKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICBpZiAoc29hcC0+Y3R4KQorICAgIHsgU1NMX0NUWF9mcmVlKHNvYXAtPmN0eCk7CisgICAgICBzb2FwLT5jdHggPSBOVUxMOworICAgIH0KKyNlbmRpZgorICB9CisjaWZkZWYgU09BUF9ERUJVRworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWUgbG9nZmlsZXNcbiIpKTsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfTUFYTE9HUzsgaSsrKQorICB7IGlmIChzb2FwLT5sb2dmaWxlW2ldKQorICAgIHsgU09BUF9GUkVFKHNvYXAsICh2b2lkKilzb2FwLT5sb2dmaWxlW2ldKTsKKyAgICAgIHNvYXAtPmxvZ2ZpbGVbaV0gPSBOVUxMOworICAgIH0KKyAgICBzb2FwX2Nsb3NlX2xvZ2ZpbGUoc29hcCwgaSk7CisgIH0KKyAgc29hcF9mcmVlX21odChzb2FwKTsKKyAgc29hcC0+c3RhdGUgPSAwOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9jbGVhbnVwKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwX2RvbmUoc29hcCk7CisjaWZkZWYgV0lOMzIKKyAgaWYgKCF0Y3BfZG9uZSkKKyAgICByZXR1cm47CisgIHRjcF9kb25lID0gMDsKKyAgV1NBQ2xlYW51cCgpOworI2VuZGlmCit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY29uc3QgY2hhcioKK3RjcF9lcnJvcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqbXNnID0gTlVMTDsKKyAgc3dpdGNoIChzb2FwLT5lcnJtb2RlKQorICB7IGNhc2UgMDoKKyAgICAgIG1zZyA9IHNvYXBfc3RyZXJyb3Ioc29hcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICBtc2cgPSAiV1NBU3RhcnR1cCBmYWlsZWQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgIHsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICBtc2cgPSBzb2FwX3N0cl9jb2RlKGhfZXJyb3JfY29kZXMsIHNvYXAtPmVycm51bSk7CisgICAgICBpZiAoIW1zZykKKyNlbmRpZgorICAgICAgeyBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIlRDUC9VRFAgSVAgZXJyb3IgJWQiLCBzb2FwLT5lcnJudW0pOworICAgICAgICBtc2cgPSBzb2FwLT5tc2didWY7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBtc2c7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBjb25zdCBjaGFyKgoraHR0cF9lcnJvcihzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0YXR1cykKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqbXNnID0gU09BUF9TVFJfRU9TOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgbXNnID0gc29hcF9zdHJfY29kZShoX2h0dHBfZXJyb3JfY29kZXMsIHN0YXR1cyk7CisgIGlmICghbXNnKQorICAgIG1zZyA9IFNPQVBfU1RSX0VPUzsKKyNlbmRpZgorICByZXR1cm4gbXNnOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9JUFY2CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3RjcF9nZXRob3N0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICphZGRyLCBzdHJ1Y3QgaW5fYWRkciAqaW5hZGRyKQoreyBzb2FwX2ludDMyIGlhZGQgPSAtMTsKKyAgc3RydWN0IGhvc3RlbnQgaG9zdGVudCwgKmhvc3QgPSAmaG9zdGVudDsKKyNpZmRlZiBWWFdPUktTCisgIGludCBob3N0aW50OworICAvKiBpbmV0X2FkZHIoKSwgYW5kIGhvc3RHZXRCeU5hbWUoKSBleHBlY3QgImNoYXIgKiI7IGFkZHIgaXMgYSAiY29uc3QgY2hhciAqIi4gKi8KKyAgaWFkZCA9IGluZXRfYWRkcigoY2hhciopYWRkcik7CisjZWxzZQorI2lmIGRlZmluZWQoX0FJWFZFUlNJT05fNDMxKSB8fCBkZWZpbmVkKFRSVTY0KQorICBzdHJ1Y3QgaG9zdGVudF9kYXRhIGh0X2RhdGE7CisjZW5kaWYKKyNpZmRlZiBBUzQwMAorICBpYWRkID0gaW5ldF9hZGRyKCh2b2lkKilhZGRyKTsKKyNlbHNlCisgIGlhZGQgPSBpbmV0X2FkZHIoYWRkcik7CisjZW5kaWYKKyNlbmRpZgorICBpZiAoaWFkZCAhPSAtMSkKKyAgeyBtZW1jcHkoaW5hZGRyLCAmaWFkZCwgc2l6ZW9mKGlhZGQpKTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2lmIGRlZmluZWQoX19HTElCQ19fKQorICBpZiAoZ2V0aG9zdGJ5bmFtZV9yKGFkZHIsICZob3N0ZW50LCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOLCAmaG9zdCwgJnNvYXAtPmVycm51bSkgPCAwKQorICAgIGhvc3QgPSBOVUxMOworI2VsaWYgZGVmaW5lZChfQUlYVkVSU0lPTl80MzEpIHx8IGRlZmluZWQoVFJVNjQpCisgIG1lbXNldCgodm9pZCopJmh0X2RhdGEsIDAsIHNpemVvZihodF9kYXRhKSk7CisgIGlmIChnZXRob3N0YnluYW1lX3IoYWRkciwgJmhvc3RlbnQsICZodF9kYXRhKSA8IDApCisgIHsgaG9zdCA9IE5VTEw7CisgICAgc29hcC0+ZXJybnVtID0gaF9lcnJubzsKKyAgfQorI2VsaWYgZGVmaW5lZChIQVZFX0dFVEhPU1RCWU5BTUVfUikKKyAgaG9zdCA9IGdldGhvc3RieW5hbWVfcihhZGRyLCAmaG9zdGVudCwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTiwgJnNvYXAtPmVycm51bSk7CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgIC8qIElmIHRoZSBETlMgcmVzb2x2ZXIgbGlicmFyeSByZXNvbHZMaWIgaGFzIGJlZW4gY29uZmlndXJlZCBpbiB0aGUgdnhXb3JrcworICAgKiBpbWFnZSwgYSBxdWVyeSBmb3IgdGhlIGhvc3QgSVAgYWRkcmVzcyBpcyBzZW50IHRvIHRoZSBETlMgc2VydmVyLCBpZiB0aGUKKyAgICogbmFtZSB3YXMgbm90IGZvdW5kIGluIHRoZSBsb2NhbCBob3N0IHRhYmxlLiAqLworICBob3N0aW50ID0gaG9zdEdldEJ5TmFtZSgoY2hhciopYWRkcik7CisgIGlmIChob3N0aW50ID09IEVSUk9SKQorICB7IGhvc3QgPSBOVUxMOworICAgIHNvYXAtPmVycm51bSA9IHNvYXBfZXJybm87IAorICB9CisjZWxzZQorI2lmZGVmIEFTNDAwCisgIGlmICghKGhvc3QgPSBnZXRob3N0YnluYW1lKCh2b2lkKilhZGRyKSkpCisgICAgc29hcC0+ZXJybnVtID0gaF9lcnJubzsKKyNlbHNlCisgIGlmICghKGhvc3QgPSBnZXRob3N0YnluYW1lKGFkZHIpKSkKKyAgICBzb2FwLT5lcnJudW0gPSBoX2Vycm5vOworI2VuZGlmCisjZW5kaWYKKyAgaWYgKCFob3N0KQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSG9zdCBuYW1lIG5vdCBmb3VuZFxuIikpOworICAgIHJldHVybiBTT0FQX0VSUjsKKyAgfQorI2lmZGVmIFZYV09SS1MKKyAgaW5hZGRyLT5zX2FkZHIgPSBob3N0aW50OworI2Vsc2UKKyAgbWVtY3B5KGluYWRkciwgaG9zdC0+aF9hZGRyLCBob3N0LT5oX2xlbmd0aCk7CisjZW5kaWYKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3RjcF9jb25uZWN0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICplbmRwb2ludCwgY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQpCit7CisjaWZkZWYgV0lUSF9JUFY2CisgIHN0cnVjdCBhZGRyaW5mbyBoaW50cywgKnJlcywgKnJlc3NhdmU7CisgIGludCBlcnI7CisjZW5kaWYKKyAgcmVnaXN0ZXIgaW50IGZkOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaW50IGxlbiA9IFNPQVBfQlVGTEVOOworICBpbnQgc2V0ID0gMTsKKyNlbmRpZgorICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCk7CisgIHNvYXAtPnNvY2tldCA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIGlmICh0Y3BfaW5pdChzb2FwKSkKKyAgeyBzb2FwLT5lcnJudW0gPSAwOworICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJUQ1AgaW5pdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBzb2FwLT5lcnJtb2RlID0gMDsKKyNpZmRlZiBXSVRIX0lQVjYKKyAgbWVtc2V0KCh2b2lkKikmaGludHMsIDAsIHNpemVvZihoaW50cykpOworICBoaW50cy5haV9mYW1pbHkgPSBQRl9VTlNQRUM7CisjaWZkZWYgV0lUSF9VRFAKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfREdSQU07CisgIGVsc2UKKyNlbmRpZgorICAgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisgIHNvYXAtPmVycm1vZGUgPSAyOworICBpZiAoc29hcC0+cHJveHlfaG9zdCkKKyAgICBlcnIgPSBnZXRhZGRyaW5mbyhzb2FwLT5wcm94eV9ob3N0LCBzb2FwX2ludDJzKHNvYXAsIHNvYXAtPnByb3h5X3BvcnQpLCAmaGludHMsICZyZXMpOworICBlbHNlCisgICAgZXJyID0gZ2V0YWRkcmluZm8oaG9zdCwgc29hcF9pbnQycyhzb2FwLCBwb3J0KSwgJmhpbnRzLCAmcmVzKTsKKyAgaWYgKGVycikKKyAgeyBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgZ2FpX3N0cmVycm9yKGVyciksICJnZXRhZGRyaW5mbyBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICByZXNzYXZlID0gcmVzOworYWdhaW46CisgIGZkID0gKGludClzb2NrZXQocmVzLT5haV9mYW1pbHksIHJlcy0+YWlfc29ja3R5cGUsIHJlcy0+YWlfcHJvdG9jb2wpOworICBzb2FwLT5lcnJtb2RlID0gMDsKKyNlbHNlCisjaWZkZWYgV0lUSF9VRFAKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICBmZCA9IChpbnQpc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworICBlbHNlCisjZW5kaWYKKyAgICBmZCA9IChpbnQpc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKyNlbmRpZgorICBpZiAoZmQgPCAwKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzb2NrZXQgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNpZmRlZiBTT0NLRVRfQ0xPU0VfT05fRVhFQworI2lmZGVmIFdJTjMyCisjaWZuZGVmIFVOREVSX0NFCisgIFNldEhhbmRsZUluZm9ybWF0aW9uKChIQU5ETEUpZmQsIEhBTkRMRV9GTEFHX0lOSEVSSVQsIDApOworI2VuZGlmCisjZWxzZQorICBmY250bChmZCwgRl9TRVRGRCwgMSk7CisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPmNvbm5lY3RfZmxhZ3MgJiBTT19MSU5HRVIpCisgIHsgc3RydWN0IGxpbmdlciBsaW5nZXI7CisgICAgbWVtc2V0KCh2b2lkKikmbGluZ2VyLCAwLCBzaXplb2YobGluZ2VyKSk7CisgICAgbGluZ2VyLmxfb25vZmYgPSAxOworICAgIGxpbmdlci5sX2xpbmdlciA9IDA7CisgICAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKWZkLCBTT0xfU09DS0VULCBTT19MSU5HRVIsIChjaGFyKikmbGluZ2VyLCBzaXplb2Yoc3RydWN0IGxpbmdlcikpKQorICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19MSU5HRVIgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgIH0KKyAgfQorICBpZiAoKHNvYXAtPmNvbm5lY3RfZmxhZ3MgJiB+U09fTElOR0VSKSAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClmZCwgU09MX1NPQ0tFVCwgc29hcC0+Y29ubmVjdF9mbGFncyAmIH5TT19MSU5HRVIsIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgaWYgKHNvYXAtPmtlZXBfYWxpdmUgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpZmQsIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19LRUVQQUxJVkUgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKWZkLCBTT0xfU09DS0VULCBTT19TTkRCVUYsIChjaGFyKikmbGVuLCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fU05EQlVGIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIGlmIChzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClmZCwgU09MX1NPQ0tFVCwgU09fUkNWQlVGLCAoY2hhciopJmxlbiwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX1JDVkJVRiBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorI2lmZGVmIFRDUF9OT0RFTEFZCisgIGlmICghKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKWZkLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgVENQX05PREVMQVkgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNlbmRpZgorI2VuZGlmCisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJPcGVuaW5nIHNvY2tldCAlZCB0byBob3N0PSclcycgcG9ydD0lZFxuIiwgZmQsIGhvc3QsIHBvcnQpKTsKKyNpZm5kZWYgV0lUSF9JUFY2CisgIHNvYXAtPnBlZXJsZW4gPSBzaXplb2Yoc29hcC0+cGVlcik7CisgIG1lbXNldCgodm9pZCopJnNvYXAtPnBlZXIsIDAsIHNpemVvZihzb2FwLT5wZWVyKSk7CisgIHNvYXAtPnBlZXIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgIHNvYXAtPmVycm1vZGUgPSAyOworICBpZiAoc29hcC0+cHJveHlfaG9zdCkKKyAgeyBpZiAoc29hcC0+ZnJlc29sdmUoc29hcCwgc29hcC0+cHJveHlfaG9zdCwgJnNvYXAtPnBlZXIuc2luX2FkZHIpKQorICAgIHsgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImdldCBwcm94eSBob3N0IGJ5IG5hbWUgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgIH0KKyAgICBzb2FwLT5wZWVyLnNpbl9wb3J0ID0gaHRvbnMoKHNob3J0KXNvYXAtPnByb3h5X3BvcnQpOworICB9CisgIGVsc2UKKyAgeyBpZiAoc29hcC0+ZnJlc29sdmUoc29hcCwgaG9zdCwgJnNvYXAtPnBlZXIuc2luX2FkZHIpKQorICAgIHsgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImdldCBob3N0IGJ5IG5hbWUgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgIH0KKyAgICBzb2FwLT5wZWVyLnNpbl9wb3J0ID0gaHRvbnMoKHNob3J0KXBvcnQpOworICB9CisgIHNvYXAtPmVycm1vZGUgPSAwOworICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIHJldHVybiBmZDsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPmNvbm5lY3RfdGltZW91dCkKKyNpZiBkZWZpbmVkKFdJTjMyKQorICB7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAmbm9uYmxvY2tpbmcpOworICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgIHsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICBpb2N0bCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sIChpbnQpKCZub25ibG9ja2luZykpOyAvKiBtb2RpZmllZCB0byB1c2UgZmQgKi8KKyAgfQorI2Vsc2UKKyAgICBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9HRVRGTCl8T19OT05CTE9DSyk7CisjZW5kaWYKKyAgZWxzZQorI2lmIGRlZmluZWQoV0lOMzIpCisgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sICZibG9ja2luZyk7CisgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgIGlvY3RsKChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgKGludCkoJmJsb2NraW5nKSk7CisgIH0KKyNlbHNlCisgICAgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfR0VURkwpJn5PX05PTkJMT0NLKTsKKyNlbmRpZgorI2VuZGlmCisgIGZvciAoOzspCisgIHsgCisjaWZkZWYgV0lUSF9JUFY2CisgICAgaWYgKGNvbm5lY3QoKFNPQVBfU09DS0VUKWZkLCByZXMtPmFpX2FkZHIsIHJlcy0+YWlfYWRkcmxlbikpCisjZWxzZQorICAgIGlmIChjb25uZWN0KChTT0FQX1NPQ0tFVClmZCwgKHN0cnVjdCBzb2NrYWRkciopJnNvYXAtPnBlZXIsIHNpemVvZihzb2FwLT5wZWVyKSkpCisjZW5kaWYKKyAgICB7IAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQgJiYgKHNvYXBfc29ja2V0X2Vycm5vID09IFNPQVBfRUlOUFJPR1JFU1MgfHwgc29hcF9zb2NrZXRfZXJybm8gPT0gU09BUF9FV09VTERCTE9DSykpCisgICAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICAgIFNPQVBfU09DS0xFTl9UIGs7CisgICAgICAgIGZkX3NldCBmZHM7CisgICAgICAgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQgPiAwKQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gc29hcC0+Y29ubmVjdF90aW1lb3V0OworICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gLXNvYXAtPmNvbm5lY3RfdGltZW91dC8xMDAwMDAwOworICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IC1zb2FwLT5jb25uZWN0X3RpbWVvdXQlMTAwMDAwMDsKKyAgICAgICAgfQorICAgICAgICBGRF9aRVJPKCZmZHMpOworICAgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKWZkLCAmZmRzKTsKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeyBpbnQgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKGZkICsgMSksIE5VTEwsICZmZHMsIE5VTEwsICZ0aW1lb3V0KTsKKyAgICAgICAgICBpZiAociA+IDApCisJICAgIGJyZWFrOworICAgICAgICAgIGlmICghcikKKyAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IDA7CisgICAgICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvbm5lY3QgdGltZW91dFxuIikpOworICAgICAgICAgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsICJUaW1lb3V0IiwgImNvbm5lY3QgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUikKKyAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgY29ubmVjdCB0byBob3N0XG4iKSk7CisgICAgICAgICAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiY29ubmVjdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgICAgfQorICAgICAgICB9CisJayA9IChTT0FQX1NPQ0tMRU5fVClzaXplb2Yoc29hcC0+ZXJybnVtKTsKKyAgICAgICAgaWYgKCFnZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClmZCwgU09MX1NPQ0tFVCwgU09fRVJST1IsIChjaGFyKikmc29hcC0+ZXJybnVtLCAmaykgJiYgIXNvYXAtPmVycm51bSkJLyogcG9ydGFiaWxpdHkgbm90ZTogc2VlIFNPQVBfU09DS0xFTl9UIGRlZmluaXRpb24gaW4gc3Rkc29hcDIuaCAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBjb25uZWN0IHRvIGhvc3RcbiIpKTsKKyAgICAgICAgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJjb25uZWN0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgICBlbHNlCisjZW5kaWYKKyNpZmRlZiBXSVRIX0lQVjYKKyAgICAgIGlmIChyZXMtPmFpX25leHQpCisgICAgICB7IHJlcyA9IHJlcy0+YWlfbmV4dDsKKyAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIGdvdG8gYWdhaW47CisgICAgICB9CisgICAgICBlbHNlCisjZW5kaWYKKyAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSKQorICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgY29ubmVjdCB0byBob3N0XG4iKSk7CisgICAgICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJjb25uZWN0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgfSAgCisgICAgZWxzZQorICAgICAgYnJlYWs7CisgIH0KKyNpZmRlZiBXSVRIX0lQVjYKKyAgc29hcC0+cGVlcmxlbiA9IDA7IC8qIElQdjY6IGFscmVhZHkgY29ubmVjdGVkIHNvIHVzZSBzZW5kKCkgKi8KKyAgZnJlZWFkZHJpbmZvKHJlc3NhdmUpOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0KQorI2lmIGRlZmluZWQoV0lOMzIpCisgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sICZibG9ja2luZyk7CisgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgIGlvY3RsKChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgKGludCkoJmJsb2NraW5nKSk7CisgIH0KKyNlbHNlCisgICAgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfR0VURkwpJn5PX05PTkJMT0NLKTsKKyNlbmRpZgorI2VuZGlmCisgIHNvYXAtPnNvY2tldCA9IGZkOworICBzb2FwLT5pbW9kZSAmPSB+U09BUF9FTkNfU1NMOworICBzb2FwLT5vbW9kZSAmPSB+U09BUF9FTkNfU1NMOworICBpZiAoIXN0cm5jbXAoZW5kcG9pbnQsICJodHRwczoiLCA2KSkKKyAgeworI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgIEJJTyAqYmlvOworICAgIGludCByOworICAgIGlmIChzb2FwLT5wcm94eV9ob3N0KQorICAgIHsgc2hvcnQgdjsKKyAgICAgIHVuc2lnbmVkIGludCBrID0gc29hcC0+b21vZGU7IC8qIG1ha2Ugc3VyZSB3ZSBvbmx5IHBhcnNlIEhUVFAgKi8KKyAgICAgIHNpemVfdCBuID0gc29hcC0+Y291bnQ7IC8qIHNhdmUgdGhlIGNvbnRlbnQgbGVuZ3RoICovCisgICAgICBjaGFyICp1c2VyaWQsICpwYXNzd2Q7CisgICAgICBzb2FwLT5vbW9kZSAmPSB+U09BUF9FTkM7IC8qIG1hc2sgSU8gYW5kIEVOQyAqLworICAgICAgc29hcC0+b21vZGUgfD0gU09BUF9JT19CVUZGRVI7CisgICAgICBzb2FwX2JlZ2luX3NlbmQoc29hcCk7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvbm5lY3RpbmcgdG8gcHJveHkgc2VydmVyXG4iKSk7CisgICAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIkNPTk5FQ1QgJXM6JWQgSFRUUC8lcyIsIGhvc3QsIHBvcnQsIHNvYXAtPmh0dHBfdmVyc2lvbik7CisgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgc29hcC0+dG1wYnVmLCBOVUxMKSkpCisgICAgICB7IHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICBpZiAoc29hcC0+cHJveHlfdXNlcmlkICYmIHNvYXAtPnByb3h5X3Bhc3N3ZCAmJiBzdHJsZW4oc29hcC0+cHJveHlfdXNlcmlkKSArIHN0cmxlbihzb2FwLT5wcm94eV9wYXNzd2QpIDwgNzYxKQorICAgICAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIDI2MiwgIiVzOiVzIiwgc29hcC0+cHJveHlfdXNlcmlkLCBzb2FwLT5wcm94eV9wYXNzd2QpOworICAgICAgICBzdHJjcHkoc29hcC0+dG1wYnVmLCAiQmFzaWMgIik7CisgICAgICAgIHNvYXBfczJiYXNlNjQoc29hcCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKShzb2FwLT50bXBidWYgKyAyNjIpLCBzb2FwLT50bXBidWYgKyA2LCBzdHJsZW4oc29hcC0+dG1wYnVmICsgMjYyKSk7CisgICAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiUHJveHktQXV0aG9yaXphdGlvbiIsIHNvYXAtPnRtcGJ1ZikpKQorICAgICAgICB7IHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgTlVMTCwgTlVMTCkpCisgICAgICAgfHwgc29hcF9mbHVzaChzb2FwKSkKKyAgICAgIHsgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgICAgc29hcC0+b21vZGUgPSBrOworICAgICAgayA9IHNvYXAtPmltb2RlOworICAgICAgc29hcC0+aW1vZGUgJj0gflNPQVBfRU5DOyAvKiBtYXNrIElPIGFuZCBFTkMgKi8KKyAgICAgIHYgPSBzb2FwLT52ZXJzaW9uOyAvKiBwcmVzZXJ2ZSAqLworICAgICAgdXNlcmlkID0gc29hcC0+dXNlcmlkOyAvKiBwcmVzZXJ2ZSAqLworICAgICAgcGFzc3dkID0gc29hcC0+cGFzc3dkOyAvKiBwcmVzZXJ2ZSAqLworICAgICAgaWYgKHNvYXBfYmVnaW5fcmVjdihzb2FwKSkKKyAgICAgIHsgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgICAgc29hcC0+dXNlcmlkID0gdXNlcmlkOyAvKiByZXN0b3JlICovCisgICAgICBzb2FwLT5wYXNzd2QgPSBwYXNzd2Q7IC8qIHJlc3RvcmUgKi8KKyAgICAgIHNvYXAtPnZlcnNpb24gPSB2OyAvKiByZXN0b3JlICovCisgICAgICBzb2FwLT5pbW9kZSA9IGs7IC8qIHJlc3RvcmUgKi8KKyAgICAgIHNvYXAtPmNvdW50ID0gbjsgLyogcmVzdG9yZSAqLworICAgICAgc29hcF9iZWdpbl9zZW5kKHNvYXApOworICAgIH0KKyAgICBpZiAoIXNvYXAtPmN0eCAmJiAoc29hcC0+ZXJyb3IgPSBzb2FwLT5mc3NsYXV0aChzb2FwKSkpCisgICAgeyBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJTU0wgYXV0aGVudGljYXRpb24gZmFpbGVkIGluIHRjcF9jb25uZWN0KCk6IGNoZWNrIHBhc3N3b3JkLCBrZXkgZmlsZSwgYW5kIGNhIGZpbGUuIiwgU09BUF9TU0xfRVJST1IpOworICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisgICAgc29hcC0+c3NsID0gU1NMX25ldyhzb2FwLT5jdHgpOworICAgIGlmICghc29hcC0+c3NsKQorICAgIHsgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfU1NMX0VSUk9SOworICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorICAgIGlmIChzb2FwLT5zZXNzaW9uKQorICAgIHsgaWYgKCFzdHJjbXAoc29hcC0+c2Vzc2lvbl9ob3N0LCBob3N0KSAmJiBzb2FwLT5zZXNzaW9uX3BvcnQgPT0gcG9ydCkKKyAgICAgICAgU1NMX3NldF9zZXNzaW9uKHNvYXAtPnNzbCwgc29hcC0+c2Vzc2lvbik7CisgICAgICBTU0xfU0VTU0lPTl9mcmVlKHNvYXAtPnNlc3Npb24pOworICAgICAgc29hcC0+c2Vzc2lvbiA9IE5VTEw7CisgICAgfQorICAgIHNvYXAtPmltb2RlIHw9IFNPQVBfRU5DX1NTTDsKKyAgICBzb2FwLT5vbW9kZSB8PSBTT0FQX0VOQ19TU0w7CisgICAgYmlvID0gQklPX25ld19zb2NrZXQoKFNPQVBfU09DS0VUKWZkLCBCSU9fTk9DTE9TRSk7CisgICAgU1NMX3NldF9iaW8oc29hcC0+c3NsLCBiaW8sIGJpbyk7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQpCisjaWYgZGVmaW5lZChXSU4zMikKKyAgICB7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sICZub25ibG9ja2luZyk7CisgICAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICAgIHsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICAgIGlvY3RsKChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgKGludCkoJm5vbmJsb2NraW5nKSk7CisgICAgfQorI2Vsc2UKKyAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX0dFVEZMKXxPX05PTkJMT0NLKTsKKyNlbmRpZgorI2VuZGlmCisgICAgZm9yICg7OykKKyAgICB7IGlmICgociA9IFNTTF9jb25uZWN0KHNvYXAtPnNzbCkpIDw9IDApCisgICAgICB7IGludCBlcnIgPSBTU0xfZ2V0X2Vycm9yKHNvYXAtPnNzbCwgcik7CisgICAgICAgIGlmIChlcnIgIT0gU1NMX0VSUk9SX05PTkUgJiYgZXJyICE9IFNTTF9FUlJPUl9XQU5UX1JFQUQgJiYgZXJyICE9IFNTTF9FUlJPUl9XQU5UX1dSSVRFKQorICAgICAgICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCBzc2xfZXJyb3Ioc29hcCwgciksICJTU0wgY29ubmVjdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0KQorICAgICAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICAgICAgZmRfc2V0IGZkczsKKyAgICAgICAgICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0ID4gMCkKKyAgICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gc29hcC0+Y29ubmVjdF90aW1lb3V0OworICAgICAgICAgICAgdGltZW91dC50dl91c2VjID0gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSAtc29hcC0+Y29ubmVjdF90aW1lb3V0LzEwMDAwMDA7CisgICAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAtc29hcC0+Y29ubmVjdF90aW1lb3V0JTEwMDAwMDA7CisgICAgICAgICAgfQorICAgICAgICAgIEZEX1pFUk8oJmZkcyk7CisgICAgICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClmZCwgJmZkcyk7CisgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICB7IGludCByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoZmQgKyAxKSwgJmZkcywgTlVMTCwgJmZkcywgJnRpbWVvdXQpOworICAgICAgICAgICAgaWYgKHIgPiAwKQorCSAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKCFyKQorICAgICAgICAgICAgeyBzb2FwLT5lcnJudW0gPSAwOworICAgICAgICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvbm5lY3QgdGltZW91dFxuIikpOworICAgICAgICAgICAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgIlRpbWVvdXQiLCAiY29ubmVjdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgICAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKwkgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQpCisjaWZkZWYgV0lOMzIKKyAgICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sICZibG9ja2luZyk7CisgICAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICAgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICAgIGlvY3RsKChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgKGludCkoJmJsb2NraW5nKSk7CisgICAgfQorI2Vsc2UKKyAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX0dFVEZMKSZ+T19OT05CTE9DSyk7CisjZW5kaWYKKyNlbmRpZgorICAgIGlmIChzb2FwLT5yZXF1aXJlX3NlcnZlcl9hdXRoKQorICAgIHsgWDUwOSAqcGVlcjsKKyAgICAgIGludCBlcnI7CisgICAgICBpZiAoKGVyciA9IFNTTF9nZXRfdmVyaWZ5X3Jlc3VsdChzb2FwLT5zc2wpKSAhPSBYNTA5X1ZfT0spCisgICAgICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCBYNTA5X3ZlcmlmeV9jZXJ0X2Vycm9yX3N0cmluZyhlcnIpLCAiU1NMIGNlcnRpZmljYXRlIHByZXNlbnRlZCBieSBwZWVyIGNhbm5vdCBiZSB2ZXJpZmllZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9TU0xfRVJST1IpOworICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgICBwZWVyID0gU1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKHNvYXAtPnNzbCk7CisgICAgICBpZiAoIXBlZXIpCisgICAgICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIk5vIFNTTCBjZXJ0aWZpY2F0ZSB3YXMgcHJlc2VudGVkIGJ5IHRoZSBwZWVyIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyAgICAgIFg1MDlfTkFNRV9nZXRfdGV4dF9ieV9OSUQoWDUwOV9nZXRfc3ViamVjdF9uYW1lKHBlZXIpLCBOSURfY29tbW9uTmFtZSwgc29hcC0+bXNnYnVmLCBzaXplb2Yoc29hcC0+bXNnYnVmKSk7CisgICAgICBYNTA5X2ZyZWUocGVlcik7CisgICAgICBpZiAoc29hcF90YWdfY21wKHNvYXAtPm1zZ2J1ZiwgaG9zdCkpCisgICAgICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIlNTTCBjZXJ0aWZpY2F0ZSBob3N0IG5hbWUgbWlzbWF0Y2ggaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1NTTF9FUlJPUjsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyNlbmRpZgorICB9CisgIHJldHVybiBmZDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9iaW5kKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpob3N0LCBpbnQgcG9ydCwgaW50IGJhY2tsb2cpCit7CisjaWZkZWYgV0lUSF9JUFY2CisgIHN0cnVjdCBhZGRyaW5mbyAqYWRkcmluZm8gPSBOVUxMOworICBzdHJ1Y3QgYWRkcmluZm8gaGludHM7CisgIHN0cnVjdCBhZGRyaW5mbyByZXM7CisgIGludCBlcnI7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGludCBsZW4gPSBTT0FQX0JVRkxFTjsKKyAgaW50IHNldCA9IDE7CisjZW5kaWYKKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikpCisgIHsgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIpOworICAgIHNvYXAtPm1hc3RlciA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgc29hcC0+c29ja2V0ID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgc29hcC0+ZXJybW9kZSA9IDE7CisgIGlmICh0Y3BfaW5pdChzb2FwKSkKKyAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJUQ1AgaW5pdCBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNpZmRlZiBXSVRIX0lQVjYKKyAgbWVtc2V0KCh2b2lkKikmaGludHMsIDAsIHNpemVvZihoaW50cykpOworICBoaW50cy5haV9mYW1pbHkgPSBQRl9VTlNQRUM7CisjaWZkZWYgV0lUSF9VRFAKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfREdSQU07CisgIGVsc2UKKyNlbmRpZgorICAgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisgIGhpbnRzLmFpX2ZsYWdzID0gQUlfUEFTU0lWRTsKKyAgc29hcC0+ZXJybW9kZSA9IDI7CisgIGVyciA9IGdldGFkZHJpbmZvKGhvc3QsIHNvYXBfaW50MnMoc29hcCwgcG9ydCksICZoaW50cywgJmFkZHJpbmZvKTsKKyAgaWYgKGFkZHJpbmZvKQorICB7IHJlcyA9ICphZGRyaW5mbzsKKyAgICBzb2FwLT5wZWVyID0gKigoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UqKWFkZHJpbmZvLT5haV9hZGRyKTsKKyAgICBzb2FwLT5wZWVybGVuID0gYWRkcmluZm8tPmFpX2FkZHJsZW47CisgICAgcmVzLmFpX2FkZHIgPSAoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlcjsKKyAgICByZXMuYWlfYWRkcmxlbiA9IHNvYXAtPnBlZXJsZW47CisgICAgZnJlZWFkZHJpbmZvKGFkZHJpbmZvKTsKKyAgfQorICBpZiAoZXJyKQorICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIGdhaV9zdHJlcnJvcihlcnIpLCAiZ2V0YWRkcmluZm8gZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIHNvYXAtPm1hc3RlciA9IHNvY2tldChyZXMuYWlfZmFtaWx5LCByZXMuYWlfc29ja3R5cGUsIHJlcy5haV9wcm90b2NvbCk7CisjZWxzZQorI2lmZGVmIFdJVEhfVURQCisgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgc29hcC0+bWFzdGVyID0gKGludClzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisgIGVsc2UKKyNlbmRpZgorICAgIHNvYXAtPm1hc3RlciA9IChpbnQpc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKyNlbmRpZgorICBzb2FwLT5lcnJtb2RlID0gMDsKKyAgaWYgKCFzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNvY2tldCBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNpZmRlZiBXSVRIX1VEUAorICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIHNvYXAtPnNvY2tldCA9IHNvYXAtPm1hc3RlcjsKKyNlbmRpZgorI2lmZGVmIFNPQ0tFVF9DTE9TRV9PTl9FWEVDCisjaWZkZWYgV0lOMzIKKyNpZm5kZWYgVU5ERVJfQ0UKKyAgU2V0SGFuZGxlSW5mb3JtYXRpb24oKEhBTkRMRSlzb2FwLT5tYXN0ZXIsIEhBTkRMRV9GTEFHX0lOSEVSSVQsIDApOworI2VuZGlmCisjZWxzZQorICBmY250bChzb2FwLT5tYXN0ZXIsIEZfU0VURkQsIDEpOworI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5iaW5kX2ZsYWdzICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgU09MX1NPQ0tFVCwgc29hcC0+YmluZF9mbGFncywgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBpZiAoKChzb2FwLT5pbW9kZSB8IHNvYXAtPm9tb2RlKSAmIFNPQVBfSU9fS0VFUEFMSVZFKSAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX0tFRVBBTElWRSBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgU09MX1NPQ0tFVCwgU09fU05EQlVGLCAoY2hhciopJmxlbiwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fU05EQlVGIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsIChjaGFyKikmbGVuLCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19SQ1ZCVUYgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisjaWZkZWYgVENQX05PREVMQVkKKyAgaWYgKCEoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBUQ1BfTk9ERUxBWSBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgV0lUSF9JUFY2CisgIHNvYXAtPmVycm1vZGUgPSAwOworICBpZiAoYmluZCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCByZXMuYWlfYWRkciwgcmVzLmFpX2FkZHJsZW4pKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IGJpbmQgdG8gaG9zdFxuIikpOworICAgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImJpbmQgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9ICAKKyNlbHNlCisgIHNvYXAtPnBlZXJsZW4gPSBzaXplb2Yoc29hcC0+cGVlcik7CisgIG1lbXNldCgodm9pZCopJnNvYXAtPnBlZXIsIDAsIHNpemVvZihzb2FwLT5wZWVyKSk7CisgIHNvYXAtPnBlZXIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgIHNvYXAtPmVycm1vZGUgPSAyOworICBpZiAoaG9zdCkKKyAgeyBpZiAoc29hcC0+ZnJlc29sdmUoc29hcCwgaG9zdCwgJnNvYXAtPnBlZXIuc2luX2FkZHIpKQorICAgIHsgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiZ2V0IGhvc3QgYnkgbmFtZSBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIHNvYXAtPnBlZXIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7CisgIHNvYXAtPnBlZXIuc2luX3BvcnQgPSBodG9ucygoc2hvcnQpcG9ydCk7CisgIHNvYXAtPmVycm1vZGUgPSAwOworICBpZiAoYmluZCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCAoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlciwgc29hcC0+cGVlcmxlbikpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgYmluZCB0byBob3N0XG4iKSk7CisgICAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiYmluZCBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNlbmRpZgorICBpZiAoIShzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSAmJiBsaXN0ZW4oKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgYmFja2xvZykpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgYmluZCB0byBob3N0XG4iKSk7CisgICAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAibGlzdGVuIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfSAgCisgIHJldHVybiBzb2FwLT5tYXN0ZXI7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcG9sbChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgCisjaWZuZGVmIFdJVEhfTEVBTgorICBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICBmZF9zZXQgcmZkLCBzZmQsIHhmZDsKKyAgaW50IHI7CisgIHRpbWVvdXQudHZfc2VjID0gMDsKKyAgdGltZW91dC50dl91c2VjID0gMDsKKyAgRkRfWkVSTygmcmZkKTsKKyAgRkRfWkVSTygmc2ZkKTsKKyAgRkRfWkVSTygmeGZkKTsKKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgIHsgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZyZmQpOworICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmc2ZkKTsKKyAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnhmZCk7CisgICAgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCAmcmZkLCAmc2ZkLCAmeGZkLCAmdGltZW91dCk7CisgICAgaWYgKHIgPiAwICYmIEZEX0lTU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZ4ZmQpKQorICAgICAgciA9IC0xOworICB9CisgIGVsc2UgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikpCisgIHsgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsICZzZmQpOworICAgIHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5tYXN0ZXIgKyAxKSwgTlVMTCwgJnNmZCwgTlVMTCwgJnRpbWVvdXQpOworICB9CisgIGVsc2UKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgaWYgKHIgPiAwKQorICB7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgICAgaWYgKHNvYXAtPmltb2RlICYgU09BUF9FTkNfU1NMKQorICAgIHsKKyAgICAgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpCisgICAgICAgJiYgRkRfSVNTRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnNmZCkKKyAgICAgICAmJiAoIUZEX0lTU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZyZmQpCisgICAgICAgIHx8IFNTTF9wZWVrKHNvYXAtPnNzbCwgc29hcC0+dG1wYnVmLCAxKSA+IDApKQorICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KQorICAgICAgICYmIEZEX0lTU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZzZmQpCisgICAgICAgJiYgKCFGRF9JU1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmcmZkKQorICAgICAgICB8fCByZWN2KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHNvYXAtPnRtcGJ1ZiwgMSwgTVNHX1BFRUspID4gMCkpCisgICAgICAgIHJldHVybiBTT0FQX09LOworICB9CisgIGVsc2UgaWYgKHIgPCAwKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIGlmICgoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSB8fCBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKSAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSKQorICAgIHsgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2VsZWN0IGZhaWxlZCBpbiBzb2FwX3BvbGwoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfVENQX0VSUk9SOworICAgIH0KKyAgfQorICBlbHNlCisgICAgc29hcC0+ZXJybnVtID0gMDsKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlBvbGxpbmc6IG90aGVyIGVuZCBkb3duIG9uIHNvY2tldD0lZCBzZWxlY3Q9JWRcbiIsIHNvYXAtPnNvY2tldCwgcikpOworICByZXR1cm4gU09BUF9FT0Y7CisjZWxzZQorICByZXR1cm4gU09BUF9PSzsKKyNlbmRpZgorfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAordGNwX2FjY2VwdChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHMsIHN0cnVjdCBzb2NrYWRkciAqYSwgaW50ICpuKQoreyBpbnQgZmQ7CisgIGZkID0gKGludClhY2NlcHQoKFNPQVBfU09DS0VUKXMsIGEsIChTT0FQX1NPQ0tMRU5fVCopbik7CS8qIHBvcnRhYmlsaXR5IG5vdGU6IHNlZSBTT0FQX1NPQ0tMRU5fVCBkZWZpbml0aW9uIGluIHN0ZHNvYXAyLmggKi8KKyNpZmRlZiBTT0NLRVRfQ0xPU0VfT05fRVhFQworI2lmZGVmIFdJTjMyCisjaWZuZGVmIFVOREVSX0NFCisgIFNldEhhbmRsZUluZm9ybWF0aW9uKChIQU5ETEUpZmQsIEhBTkRMRV9GTEFHX0lOSEVSSVQsIDApOworI2VuZGlmCisjZWxzZQorICBmY250bChmZCwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7CisjZW5kaWYKKyNlbmRpZgorICByZXR1cm4gZmQ7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYWNjZXB0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBpbnQgbiA9IChpbnQpc2l6ZW9mKHNvYXAtPnBlZXIpOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaW50IGxlbiA9IFNPQVBfQlVGTEVOOworICBpbnQgc2V0ID0gMTsKKyNlbmRpZgorICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisjaWZkZWYgV0lUSF9VRFAKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICByZXR1cm4gc29hcC0+c29ja2V0ID0gc29hcC0+bWFzdGVyOworI2VuZGlmCisgIG1lbXNldCgodm9pZCopJnNvYXAtPnBlZXIsIDAsIHNpemVvZihzb2FwLT5wZWVyKSk7CisgIHNvYXAtPnNvY2tldCA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIHNvYXAtPmVycm1vZGUgPSAwOworICBzb2FwLT5rZWVwX2FsaXZlID0gMDsKKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikpCisgIHsgZm9yICg7OykKKyAgICB7IAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIGlmIChzb2FwLT5hY2NlcHRfdGltZW91dCkKKyAgICAgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgICAgZmRfc2V0IGZkOworICAgICAgICBpZiAoc29hcC0+YWNjZXB0X3RpbWVvdXQgPiAwKQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gc29hcC0+YWNjZXB0X3RpbWVvdXQ7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSAtc29hcC0+YWNjZXB0X3RpbWVvdXQvMTAwMDAwMDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAtc29hcC0+YWNjZXB0X3RpbWVvdXQlMTAwMDAwMDsKKyAgICAgICAgfQorICAgICAgICBGRF9aRVJPKCZmZCk7CisgICAgICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCAmZmQpOworICAgICAgICBmb3IgKDs7KQorICAgICAgICB7IGludCByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+bWFzdGVyICsgMSksICZmZCwgJmZkLCBOVUxMLCAmdGltZW91dCk7CisgICAgICAgICAgaWYgKHIgPiAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgaWYgKCFyKQorICAgICAgICAgIHsgc29hcC0+ZXJybnVtID0gMDsKKyAgICAgICAgICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJUaW1lb3V0IiwgImFjY2VwdCBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUikKKyAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgICAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgICAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiYWNjZXB0IGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgICAgfQorICAgICAgICB9CisjaWYgZGVmaW5lZChXSU4zMikKKwl7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgICAgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRklPTkJJTywgJm5vbmJsb2NraW5nKTsKKyAgICAgICAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICAgICAgICB7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgICAgICAgaW9jdGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRklPTkJJTywgKGludCkoJm5vbmJsb2NraW5nKSk7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfR0VURkwpfE9fTk9OQkxPQ0spOworI2VuZGlmCisgICAgICB9CisgICAgICBlbHNlCisjaWYgZGVmaW5lZChXSU4zMikKKyAgICAgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICAgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRklPTkJJTywgJmJsb2NraW5nKTsKKyAgICAgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgICAgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICAgICAgaW9jdGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRklPTkJJTywgKGludCkoJmJsb2NraW5nKSk7CisgICAgICB9CisjZWxzZQorICAgICAgICBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGX0dFVEZMKSZ+T19OT05CTE9DSyk7CisjZW5kaWYKKyNlbmRpZgorICAgICAgc29hcC0+c29ja2V0ID0gc29hcC0+ZmFjY2VwdChzb2FwLCBzb2FwLT5tYXN0ZXIsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyLCAmbik7CisgICAgICBzb2FwLT5wZWVybGVuID0gKHNpemVfdCluOworICAgICAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgICAgICB7CisjaWZkZWYgV0lUSF9JUFY2CisvKiBVc2Ugc29hcC0+aG9zdCB0byBzdG9yZSB0aGUgbnVtZXJpYyBmb3JtIG9mIHRoZSByZW1vdGUgaG9zdCAqLworICAgICAgICBnZXRuYW1laW5mbygoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlciwgbiwgc29hcC0+aG9zdCwgc2l6ZW9mKHNvYXAtPmhvc3QpLCBOVUxMLCAwLCBOSV9OVU1FUklDSE9TVCB8IE5JX05VTUVSSUNTRVJWKTsgCisgICAgICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJBY2NlcHQgc29ja2V0ICVkIGZyb20gJXNcbiIsIHNvYXAtPnNvY2tldCwgc29hcC0+aG9zdCkpOworICAgICAgICBzb2FwLT5pcCA9IDA7IC8qIGluZm8gc3RvcmVkIGluIHNvYXAtPnBlZXIgYW5kIHNvYXAtPmhvc3QgKi8KKyAgICAgICAgc29hcC0+cG9ydCA9IDA7IC8qIGluZm8gc3RvcmVkIGluIHNvYXAtPnBlZXIgYW5kIHNvYXAtPmhvc3QgKi8KKyNlbHNlCisgICAgICAgIHNvYXAtPmlwID0gbnRvaGwoc29hcC0+cGVlci5zaW5fYWRkci5zX2FkZHIpOworICAgICAgICBzb2FwLT5wb3J0ID0gKGludCludG9ocyhzb2FwLT5wZWVyLnNpbl9wb3J0KTsgLyogZG9lcyBub3QgcmV0dXJuIHBvcnQgbnVtYmVyIG9uIHNvbWUgc3lzdGVtcyAqLworICAgICAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiQWNjZXB0IHNvY2tldCAlZCBhdCBwb3J0ICVkIGZyb20gSVAgJWQuJWQuJWQuJWRcbiIsIHNvYXAtPnNvY2tldCwgc29hcC0+cG9ydCwgKGludCkoc29hcC0+aXA+PjI0KSYweEZGLCAoaW50KShzb2FwLT5pcD4+MTYpJjB4RkYsIChpbnQpKHNvYXAtPmlwPj44KSYweEZGLCAoaW50KXNvYXAtPmlwJjB4RkYpKTsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKwlpZiAoc29hcC0+YWNjZXB0X2ZsYWdzICYgU09fTElOR0VSKQorICAgICAgICB7IHN0cnVjdCBsaW5nZXIgbGluZ2VyOworICAgICAgICAgIG1lbXNldCgodm9pZCopJmxpbmdlciwgMCwgc2l6ZW9mKGxpbmdlcikpOworICAgICAgICAgIGxpbmdlci5sX29ub2ZmID0gMTsKKyAgICAgICAgICBsaW5nZXIubF9saW5nZXIgPSAwOworCSAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgU09MX1NPQ0tFVCwgU09fTElOR0VSLCAoY2hhciopJmxpbmdlciwgc2l6ZW9mKHN0cnVjdCBsaW5nZXIpKSkKKyAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworCSAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX0xJTkdFUiBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKwkgICAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKwkgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKHNvYXAtPmFjY2VwdF9mbGFncyAmIH5TT19MSU5HRVIpICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgU09MX1NPQ0tFVCwgc29hcC0+YWNjZXB0X2ZsYWdzICYgflNPX0xJTkdFUiwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworCSAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCgoc29hcC0+aW1vZGUgfCBzb2FwLT5vbW9kZSkgJiBTT0FQX0lPX0tFRVBBTElWRSkgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBTT0xfU09DS0VULCBTT19LRUVQQUxJVkUsIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19LRUVQQUxJVkUgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisJICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBTT0xfU09DS0VULCBTT19TTkRCVUYsIChjaGFyKikmbGVuLCBzaXplb2YoaW50KSkpCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19TTkRCVUYgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisJICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsIChjaGFyKikmbGVuLCBzaXplb2YoaW50KSkpCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19SQ1ZCVUYgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisJICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgfQorI2lmZGVmIFRDUF9OT0RFTEFZCisgICAgICAgIGlmICghKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgVENQX05PREVMQVkgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisJICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgfQorI2VuZGlmCisjZW5kaWYKKyAgICAgICAgaWYgKHNvYXAtPmFjY2VwdF90aW1lb3V0KQorICAgICAgICB7CisjaWYgZGVmaW5lZChXSU4zMikKKyAgICAgICAgICB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgICAgICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZJT05CSU8sICZibG9ja2luZyk7CisgICAgICAgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRklPTkJJTywgJmJsb2NraW5nKTsKKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgICAgICAgICB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgICAgICAgIGlvY3RsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZJT05CSU8sIChpbnQpKCZibG9ja2luZykpOworICAgICAgICAgIGlvY3RsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZJT05CSU8sIChpbnQpKCZibG9ja2luZykpOworI2VsaWYgZGVmaW5lZChQQUxNKQorICAgICAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfR0VURkwsMCkmfk9fTk9OQkxPQ0spOworICAgICAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfR0VURkwsMCkmfk9fTk9OQkxPQ0spOworI2VsaWYgZGVmaW5lZChTWU1CSUFOKQorICAgICAgICAgIGxvbmcgYmxvY2tpbmcgPSAwOworICAgICAgICAgIGlvY3RsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIDAvKkZJT05CSU8qLywgJmJsb2NraW5nKTsKKyNlbHNlCisgICAgICAgICAgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRl9HRVRGTCkmfk9fTk9OQkxPQ0spOworICAgICAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfR0VURkwpJn5PX05PTkJMT0NLKTsKKyNlbmRpZgorCX0KKyAgICAgICAgc29hcC0+a2VlcF9hbGl2ZSA9ICgoKHNvYXAtPmltb2RlIHwgc29hcC0+b21vZGUpICYgU09BUF9JT19LRUVQQUxJVkUpICE9IDApOworICAgICAgICByZXR1cm4gc29hcC0+c29ja2V0OworICAgICAgfQorICAgICAgaWYgKHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FQUdBSU4pCisgICAgICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJBY2NlcHQgZmFpbGVkIGZyb20gJXNcbiIsIHNvYXAtPmhvc3QpKTsKKyAgICAgICAgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImFjY2VwdCBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKwlzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyAgeyBzb2FwLT5lcnJudW0gPSAwOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgIm5vIG1hc3RlciBzb2NrZXQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAordGNwX2Rpc2Nvbm5lY3Qoc3RydWN0IHNvYXAgKnNvYXApCit7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgIGlmIChzb2FwLT5zc2wpCisgIHsgaW50IHIsIHMgPSAwOworICAgIGlmIChzb2FwLT5zZXNzaW9uKQorICAgICAgU1NMX1NFU1NJT05fZnJlZShzb2FwLT5zZXNzaW9uKTsKKyAgICBpZiAoKnNvYXAtPmhvc3QpCisgICAgeyBzb2FwLT5zZXNzaW9uID0gU1NMX2dldDFfc2Vzc2lvbihzb2FwLT5zc2wpOworICAgICAgaWYgKHNvYXAtPnNlc3Npb24pCisgICAgICB7IHN0cmNweShzb2FwLT5zZXNzaW9uX2hvc3QsIHNvYXAtPmhvc3QpOworICAgICAgICBzb2FwLT5zZXNzaW9uX3BvcnQgPSBzb2FwLT5wb3J0OworICAgICAgfQorICAgIH0KKyAgICByID0gU1NMX3NodXRkb3duKHNvYXAtPnNzbCk7CisgICAgaWYgKHIgIT0gMSkKKyAgICB7IHMgPSBFUlJfZ2V0X2Vycm9yKCk7CisgICAgICBpZiAocykKKyAgICAgIHsgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgICAgICAgIHsgc29hcC0+ZnNodXRkb3duc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIDEpOworICAgICAgICAgIHNvYXAtPnNvY2tldCA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgIH0KKyAgICAgICAgciA9IFNTTF9zaHV0ZG93bihzb2FwLT5zc2wpOworICAgICAgfQorICAgIH0KKyAgICBEQkdMT0coVEVTVCwgaWYgKHMpIFNPQVBfTUVTU0FHRShmZGVidWcsICJTaHV0ZG93biBmYWlsZWQ6ICVkXG4iLCBTU0xfZ2V0X2Vycm9yKHNvYXAtPnNzbCwgcikpKTsKKyAgICBTU0xfZnJlZShzb2FwLT5zc2wpOworICAgIHNvYXAtPnNzbCA9IE5VTEw7CisgICAgaWYgKHMpCisgICAgICByZXR1cm4gU09BUF9TU0xfRVJST1I7CisgICAgRVJSX3JlbW92ZV9zdGF0ZSgwKTsKKyAgfQorI2VuZGlmCisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpICYmICEoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgIHsgc29hcC0+ZnNodXRkb3duc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIDIpOworICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0KTsKKyAgICBzb2FwLT5zb2NrZXQgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAordGNwX2Nsb3Nlc29ja2V0KHN0cnVjdCBzb2FwICpzb2FwLCBTT0FQX1NPQ0tFVCBmZCkKK3sgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDbG9zZSBzb2NrZXQgJWRcbiIsIChpbnQpZmQpKTsKKyAgcmV0dXJuIGNsb3Nlc29ja2V0KGZkKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3RjcF9zaHV0ZG93bnNvY2tldChzdHJ1Y3Qgc29hcCAqc29hcCwgU09BUF9TT0NLRVQgZmQsIGludCBob3cpCit7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2h1dGRvd24gc29ja2V0ICVkIGhvdz0lZFxuIiwgKGludClmZCwgaG93KSk7CisgIHJldHVybiBzaHV0ZG93bihmZCwgaG93KTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2Nsb3Nlc29jayhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IHN0YXR1cyA9IHNvYXAtPmVycm9yOworICBpZiAoc3RhdHVzID09IFNPQVBfRU9GIHx8IHN0YXR1cyA9PSBTT0FQX1RDUF9FUlJPUiB8fCBzdGF0dXMgPT0gU09BUF9TU0xfRVJST1IgfHwgIXNvYXAtPmtlZXBfYWxpdmUpCisgIHsgaWYgKHNvYXAtPmZjbG9zZSAmJiAoc29hcC0+ZXJyb3IgPSBzb2FwLT5mY2xvc2Uoc29hcCkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOworICB9CisjaWZkZWYgV0lUSF9aTElCCisgIGlmIChzb2FwLT56bGliX3N0YXRlID09IFNPQVBfWkxJQl9ERUZMQVRFKQorICAgIGRlZmxhdGVFbmQoJnNvYXAtPmRfc3RyZWFtKTsKKyAgZWxzZSBpZiAoc29hcC0+emxpYl9zdGF0ZSA9PSBTT0FQX1pMSUJfSU5GTEFURSkKKyAgICBpbmZsYXRlRW5kKCZzb2FwLT5kX3N0cmVhbSk7CisgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfTk9ORTsKKyNlbmRpZgorICByZXR1cm4gc29hcC0+ZXJyb3IgPSBzdGF0dXM7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorc2l6ZV90CitTT0FQX0ZNQUMyCitzb2FwX2hhc2gocmVnaXN0ZXIgY29uc3QgY2hhciAqcykKK3sgcmVnaXN0ZXIgc2l6ZV90IGggPSAwOworICB3aGlsZSAoKnMpCisgICAgaCA9IDY1NTk5KmggKyAqcysrOworICByZXR1cm4gaCAlIFNPQVBfSURIQVNIOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQKK3NvYXBfaW5pdF9waHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBpOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluaXRpYWxpemluZyBwb2ludGVyIGhhc2h0YWJsZVxuIikpOworICBzb2FwLT5wYmxrID0gTlVMTDsKKyAgc29hcC0+cGlkeCA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCAoaW50KVNPQVBfUFRSSEFTSDsgaSsrKQorICAgIHNvYXAtPnBodFtpXSA9IE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwKgorU09BUF9GTUFDMgorc29hcF9uZXcxKHNvYXBfbW9kZSBtb2RlKQoreyByZXR1cm4gc29hcF9uZXcyKG1vZGUsIG1vZGUpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc3RydWN0IHNvYXAqCitTT0FQX0ZNQUMyCitzb2FwX25ldygpCit7IHJldHVybiBzb2FwX25ldzIoU09BUF9JT19ERUZBVUxULCBTT0FQX0lPX0RFRkFVTFQpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc3RydWN0IHNvYXAqCitTT0FQX0ZNQUMyCitzb2FwX25ldzIoc29hcF9tb2RlIGltb2RlLCBzb2FwX21vZGUgb21vZGUpCit7IHN0cnVjdCBzb2FwICpzb2FwID0gKHN0cnVjdCBzb2FwKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2FwKSk7CisgIGlmIChzb2FwKQorICAgIHNvYXBfaW5pdDIoc29hcCwgaW1vZGUsIG9tb2RlKTsKKyAgcmV0dXJuIHNvYXA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2RlbChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgZnJlZShzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZAorc29hcF9mcmVlX3BodChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGJsayAqcGIsICpuZXh0OworICByZWdpc3RlciBpbnQgaTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIHBvaW50ZXIgaGFzaHRhYmxlXG4iKSk7CisgIGZvciAocGIgPSBzb2FwLT5wYmxrOyBwYjsgcGIgPSBuZXh0KQorICB7IG5leHQgPSBwYi0+bmV4dDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgcGIpOworICB9CisgIHNvYXAtPnBibGsgPSBOVUxMOworICBzb2FwLT5waWR4ID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IChpbnQpU09BUF9QVFJIQVNIOyBpKyspCisgICAgc29hcC0+cGh0W2ldID0gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbWJlZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCwgY29uc3Qgc3RydWN0IHNvYXBfYXJyYXkgKmEsIGludCBuLCBjb25zdCBjaGFyICp0YWcsIGludCB0eXBlKQoreyByZWdpc3RlciBpbnQgaTsKKyAgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICBpZiAoc29hcC0+dmVyc2lvbiAhPSAxKQorICAgIHNvYXAtPmVuY29kaW5nID0gMTsKKyAgaWYgKGEpCisgICAgaSA9IHNvYXBfYXJyYXlfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgYSwgbiwgdHlwZSwgJnBwKTsKKyAgZWxzZQorICAgIGkgPSBzb2FwX3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIHR5cGUsICZwcCk7CisgIGlmIChpKQorICB7IGlmIChzb2FwX2lzX2VtYmVkZGVkKHNvYXAsIHBwKQorICAgICB8fCBzb2FwX2lzX3NpbmdsZShzb2FwLCBwcCkpCisgICAgICByZXR1cm4gMDsKKyAgICBzb2FwX3NldF9lbWJlZGRlZChzb2FwLCBwcCk7CisgIH0KKyAgcmV0dXJuIGk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcG9pbnRlcl9sb29rdXAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnAsIGludCB0eXBlLCBzdHJ1Y3Qgc29hcF9wbGlzdCAqKnBwcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICAqcHBwID0gTlVMTDsKKyAgaWYgKHApCisgIHsgZm9yIChwcCA9IHNvYXAtPnBodFtzb2FwX2hhc2hfcHRyKHApXTsgcHA7IHBwID0gcHAtPm5leHQpCisgICAgeyBpZiAocHAtPnB0ciA9PSBwICYmIHBwLT50eXBlID09IHR5cGUpCisgICAgICB7ICpwcHAgPSBwcDsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJMb29rdXAgbG9jYXRpb249JXAgdHlwZT0lZCBpZD0lZFxuIiwgcCwgdHlwZSwgcHAtPmlkKSk7CisgICAgICAgIHJldHVybiBwcC0+aWQ7CisgICAgICB9CisgICAgfQorICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTG9va3VwIGxvY2F0aW9uPSVwIHR5cGU9JWQ6IG5vdCBmb3VuZFxuIiwgcCwgdHlwZSkpOworICByZXR1cm4gMDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wb2ludGVyX2VudGVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGludCB0eXBlLCBzdHJ1Y3Qgc29hcF9wbGlzdCAqKnBwcCkKK3sgcmVnaXN0ZXIgaW50IGg7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgaWYgKCFzb2FwLT5wYmxrIHx8IHNvYXAtPnBpZHggPj0gU09BUF9QVFJCTEspCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGJsayAqcGIgPSAoc3RydWN0IHNvYXBfcGJsayopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX3BibGspKTsKKyAgICBpZiAoIXBiKQorICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBwYi0+bmV4dCA9IHNvYXAtPnBibGs7CisgICAgc29hcC0+cGJsayA9IHBiOworICAgIHNvYXAtPnBpZHggPSAwOworICB9CisgICpwcHAgPSBwcCA9ICZzb2FwLT5wYmxrLT5wbGlzdFtzb2FwLT5waWR4KytdOworICBpZiAoYSkKKyAgICBoID0gc29hcF9oYXNoX3B0cihhLT5fX3B0cik7CisgIGVsc2UKKyAgICBoID0gc29hcF9oYXNoX3B0cihwKTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQb2ludGVyIGVudGVyIGxvY2F0aW9uPSVwIGFycmF5PSVwIHNpemU9JWQgZGltPSVkIHR5cGU9JWQgaWQ9JWRcbiIsIHAsIGE/YS0+X19wdHI6TlVMTCwgYT9hLT5fX3NpemU6MCwgbiwgdHlwZSwgc29hcC0+aWRudW0rMSkpOworICBwcC0+bmV4dCA9IHNvYXAtPnBodFtoXTsKKyAgcHAtPnR5cGUgPSB0eXBlOworICBwcC0+bWFyazEgPSAwOworICBwcC0+bWFyazIgPSAwOworICBwcC0+cHRyID0gcDsKKyAgcHAtPmFycmF5ID0gYTsKKyAgc29hcC0+cGh0W2hdID0gcHA7CisgIHBwLT5pZCA9ICsrc29hcC0+aWRudW07CisgIHJldHVybiBwcC0+aWQ7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYXJyYXlfcG9pbnRlcl9sb29rdXAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgbiwgaW50IHR5cGUsIHN0cnVjdCBzb2FwX3BsaXN0ICoqcHBwKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgICpwcHAgPSBOVUxMOworICBpZiAoIXAgfHwgIWEtPl9fcHRyKQorICAgIHJldHVybiAwOworICBmb3IgKHBwID0gc29hcC0+cGh0W3NvYXBfaGFzaF9wdHIoYS0+X19wdHIpXTsgcHA7IHBwID0gcHAtPm5leHQpCisgIHsgaWYgKHBwLT50eXBlID09IHR5cGUgJiYgcHAtPmFycmF5ICYmIHBwLT5hcnJheS0+X19wdHIgPT0gYS0+X19wdHIpCisgICAgeyByZWdpc3RlciBpbnQgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgIGlmICgoKGNvbnN0IGludCopJnBwLT5hcnJheS0+X19zaXplKVtpXSAhPSAoKGNvbnN0IGludCopJmEtPl9fc2l6ZSlbaV0pCisJICBicmVhazsKKyAgICAgIGlmIChpID09IG4pCisgICAgICB7ICpwcHAgPSBwcDsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJBcnJheSBsb29rdXAgbG9jYXRpb249JXAgdHlwZT0lZCBpZD0lZFxuIiwgYS0+X19wdHIsIHR5cGUsIHBwLT5pZCkpOworICAgICAgICByZXR1cm4gcHAtPmlkOworICAgICAgfQorICAgIH0KKyAgfQorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFycmF5IGxvb2t1cCBsb2NhdGlvbj0lcCB0eXBlPSVkOiBub3QgZm91bmRcbiIsIGEtPl9fcHRyLCB0eXBlKSk7CisgIHJldHVybiAwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYmVnaW5fY291bnQoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXBfY2xyX2F0dHIoc29hcCk7CisgIHNvYXBfc2V0X2xvY2FsX25hbWVzcGFjZXMoc29hcCk7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpIHx8IChzb2FwLT5vbW9kZSAmIFNPQVBfRU5DX0RJTUUpKQorICAgIHNvYXAtPm1vZGUgPSBzb2FwLT5vbW9kZSB8IFNPQVBfSU9fTEVOR1RIIHwgU09BUF9FTkNfRElNRTsKKyAgZWxzZQorI2VuZGlmCisgIHsgc29hcC0+bW9kZSA9IHNvYXAtPm9tb2RlOworICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fU1RPUkUKKyAgICAgfHwgKCgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTksgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpKQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICAgICAgJiYgIXNvYXAtPmZwcmVwYXJlc2VuZAorI2VuZGlmCisgICAgICApKQorICAgICAgc29hcC0+bW9kZSAmPSB+U09BUF9JT19MRU5HVEg7CisgICAgZWxzZQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX0xFTkdUSDsKKyAgfQorI2lmZGVmIFdJVEhfWkxJQgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fRkxVU0gpCisgIHsgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpKQorICAgICAgc29hcC0+bW9kZSAmPSB+U09BUF9JT19MRU5HVEg7CisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fQlVGRkVSOworICAgIGVsc2UKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19TVE9SRTsKKyAgfQorI2VuZGlmCisgIGlmICghc29hcC0+ZW5jb2RpbmdTdHlsZSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9HUkFQSCkpCisgICAgc29hcC0+bW9kZSB8PSBTT0FQX1hNTF9UUkVFOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpKQorICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfTUlNRTsKKyAgZWxzZQorICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX01UT007CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkKKyAgICBzb2FwX3NlbGVjdF9taW1lX2JvdW5kYXJ5KHNvYXApOworICBzb2FwLT5kaW1lLmxpc3QgPSBzb2FwLT5kaW1lLmxhc3Q7CS8qIGtlZXAgdHJhY2sgb2YgbGFzdCBESU1FIGF0dGFjaG1lbnQgKi8KKyNlbmRpZgorICBzb2FwLT5jb3VudCA9IDA7CisgIHNvYXAtPm5zID0gMDsKKyAgc29hcC0+bnVsbCA9IDA7CisgIHNvYXAtPnBvc2l0aW9uID0gMDsKKyAgc29hcC0+bXVzdFVuZGVyc3RhbmQgPSAwOworICBzb2FwLT5lbmNvZGluZyA9IDA7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0JFR0lOOworICBzb2FwLT5pZG51bSA9IDA7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQmVnaW4gY291bnQgcGhhc2UgKHNvY2tldD0lZCBtb2RlPTB4JXggY291bnQ9JWx1KVxuIiwgc29hcC0+c29ja2V0LCBzb2FwLT5tb2RlLCAodW5zaWduZWQgbG9uZylzb2FwLT5jb3VudCkpOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzb2FwLT5kaW1lLmNvdW50ID0gMDsgLyogY291bnQgIyBvZiBhdHRhY2htZW50cyAqLworICBzb2FwLT5kaW1lLnNpemUgPSAwOyAvKiBhY2N1bXVsYXRlIHRvdGFsIHNpemUgb2YgYXR0YWNobWVudHMgKi8KKyAgaWYgKHNvYXAtPmZwcmVwYXJlaW5pdCAmJiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pICE9IFNPQVBfSU9fU1RPUkUpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gc29hcC0+ZnByZXBhcmVpbml0KHNvYXApOyAgIAorI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VuZF9jb3VudChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5mcHJlcGFyZWZpbmFsKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IHNvYXAtPmZwcmVwYXJlZmluYWwoc29hcCk7CisjZW5kaWYKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgb2YgY291bnQgcGhhc2VcbiIpKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYmVnaW5fc2VuZChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICBzb2FwX2Nscl9hdHRyKHNvYXApOworICBzb2FwX3NldF9sb2NhbF9uYW1lc3BhY2VzKHNvYXApOworICBzb2FwLT5tb2RlID0gc29hcC0+b21vZGUgfCAoc29hcC0+bW9kZSAmIChTT0FQX0lPX0xFTkdUSCB8IFNPQVBfRU5DX0RJTUUpKTsKKyNpZmRlZiBXSVRIX1pMSUIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQikgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0ZMVVNIKQorICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWE1MKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX0JVRkZFUjsKKyAgICBlbHNlCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fU1RPUkU7CisgIH0KKyNlbmRpZgorI2lmZGVmIFdJVEhfVURQCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgeyBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX1hNTDsKKyAgICBpZiAoc29hcC0+Y291bnQgPiBTT0FQX0JVRkxFTikKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfVURQX0VSUk9SOworICB9CisjZW5kaWYKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19GTFVTSCAmJiBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICB7IGlmIChzb2FwLT5jb3VudCB8fCAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKSB8fCAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1hNTCkpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fQlVGRkVSOworICAgIGVsc2UKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19TVE9SRTsKKyAgfQorICBzb2FwLT5tb2RlICY9IH5TT0FQX0lPX0xFTkdUSDsKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19TVE9SRSkKKyAgICBzb2FwX25ld19ibG9jayhzb2FwKTsKKyAgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfSU9fS0VFUEFMSVZFKSkKKyAgICBzb2FwLT5rZWVwX2FsaXZlID0gMDsKKyAgaWYgKCFzb2FwLT5lbmNvZGluZ1N0eWxlICYmICEoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0dSQVBIKSkKKyAgICBzb2FwLT5tb2RlIHw9IFNPQVBfWE1MX1RSRUU7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pICYmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkpCisgIHsgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19NSU1FOworICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX0RJTUU7CisgIH0KKyAgZWxzZQorICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX01UT007CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkKKyAgICBzb2FwX3NlbGVjdF9taW1lX2JvdW5kYXJ5KHNvYXApOworI2lmZGVmIFdJTjMyCisjaWZuZGVmIFVOREVSX0NFCisjaWZuZGVmIFdJVEhfRkFTVENHSQorICBpZiAoIXNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpIC8qIFNldCB3aW4zMiBzdGRvdXQgb3Igc29hcC0+c2VuZGZkIHRvIEJJTkFSWSwgZS5nLiB0byBzdXBwb3J0IERJTUUgKi8KKyNpZmRlZiBfX0JPUkxBTkRDX18KKyAgICBzZXRtb2RlKChTT0FQX1NPQ0tFVClzb2FwLT5zZW5kZmQsIE9fQklOQVJZKTsKKyNlbHNlCisgICAgX3NldG1vZGUoKFNPQVBfU09DS0VUKXNvYXAtPnNlbmRmZCwgX09fQklOQVJZKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JTykKKyAgeyBzb2FwLT5idWZpZHggPSAwOworICAgIHNvYXAtPmJ1ZmxlbiA9IDA7CisgIH0KKyAgc29hcC0+Y2h1bmtzaXplID0gMDsKKyAgc29hcC0+bnMgPSAwOworICBzb2FwLT5udWxsID0gMDsKKyAgc29hcC0+cG9zaXRpb24gPSAwOworICBzb2FwLT5tdXN0VW5kZXJzdGFuZCA9IDA7CisgIHNvYXAtPmVuY29kaW5nID0gMDsKKyAgc29hcC0+aWRudW0gPSAwOworICBzb2FwLT5sZXZlbCA9IDA7CisjaWZkZWYgV0lUSF9aTElCCisgIHNvYXAtPnpfcmF0aW9fb3V0ID0gMS4wOworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKSAmJiBzb2FwLT56bGliX3N0YXRlICE9IFNPQVBfWkxJQl9ERUZMQVRFKQorICB7CisjaWZkZWYgV0lUSF9HWklQCisgICAgbWVtY3B5KHNvYXAtPnpfYnVmLCAiXDM3XDIxM1wxMFwwXDBcMFwwXDBcMFwzNzciLCAxMCk7CisgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZSopc29hcC0+el9idWYgKyAxMDsKKyAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgPSBTT0FQX0JVRkxFTiAtIDEwOworICAgIHNvYXAtPnpfY3JjID0gY3JjMzIoMEwsIE5VTEwsIDApOworICAgIGlmIChkZWZsYXRlSW5pdDIoJnNvYXAtPmRfc3RyZWFtLCBzb2FwLT56X2xldmVsLCBaX0RFRkxBVEVELCAtTUFYX1dCSVRTLCA4LCBaX0RFRkFVTFRfU1RSQVRFR1kpICE9IFpfT0spCisjZWxzZQorICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gKEJ5dGUqKXNvYXAtPnpfYnVmOworICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCA9IFNPQVBfQlVGTEVOOworICAgIGlmIChkZWZsYXRlSW5pdCgmc29hcC0+ZF9zdHJlYW0sIHNvYXAtPnpfbGV2ZWwpICE9IFpfT0spCisjZW5kaWYKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlZmxhdGUgaW5pdGlhbGl6ZWRcbiIpKTsKKyAgICBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX0RFRkxBVEU7CisgIH0KKyNlbmRpZgorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkJlZ2luIHNlbmQgcGhhc2UgKHNvY2tldD0lZCBtb2RlPTB4JXggY291bnQ9JWx1KVxuIiwgc29hcC0+c29ja2V0LCBzb2FwLT5tb2RlLCAodW5zaWduZWQgbG9uZylzb2FwLT5jb3VudCkpOworICBzb2FwLT5wYXJ0ID0gU09BUF9CRUdJTjsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPmZwcmVwYXJlaW5pdCAmJiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fU1RPUkUpCisgICAgc29hcC0+ZnByZXBhcmVpbml0KHNvYXApOyAgIAorI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZW1iZWRkZWQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnAsIGludCB0KQoreyBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgIGlmIChzb2FwX3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIHQsICZwcCkpCisgIHsgcHAtPm1hcmsxID0gMTsKKyAgICBwcC0+bWFyazIgPSAxOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW1iZWRkZWQgJXAgdHlwZT0lZCBtYXJrIHNldCB0byAxXG4iLCBwLCB0KSk7CisgIH0KK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWZlcmVuY2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnAsIGludCB0KQoreyBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgIGlmICghcCB8fCAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1RSRUUpKQorICAgIHJldHVybiAxOworICBpZiAoc29hcF9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCB0LCAmcHApKQorICB7IGlmIChwcC0+bWFyazEgPT0gMCkKKyAgICB7IHBwLT5tYXJrMSA9IDI7CisgICAgICBwcC0+bWFyazIgPSAyOworICAgIH0KKyAgfQorICBlbHNlIGlmIChzb2FwX3BvaW50ZXJfZW50ZXIoc29hcCwgcCwgTlVMTCwgMCwgdCwgJnBwKSkKKyAgeyBwcC0+bWFyazEgPSAwOworICAgIHBwLT5tYXJrMiA9IDA7CisgIH0KKyAgZWxzZQorICAgIHJldHVybiAxOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlZmVyZW5jZSAlcCB0eXBlPSVkICglZCAlZClcbiIsIHAsIHQsIChpbnQpcHAtPm1hcmsxLCAoaW50KXBwLT5tYXJrMikpOworICByZXR1cm4gcHAtPm1hcmsxOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2FycmF5X3JlZmVyZW5jZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCwgY29uc3Qgc3RydWN0IHNvYXBfYXJyYXkgKmEsIGludCBuLCBpbnQgdCkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgaWYgKCFwIHx8ICFhLT5fX3B0cikKKyAgICByZXR1cm4gMTsKKyAgaSA9IHNvYXBfYXJyYXlfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgYSwgbiwgdCwgJnBwKTsKKyAgaWYgKGkpCisgIHsgaWYgKHBwLT5tYXJrMSA9PSAwKQorICAgIHsgcHAtPm1hcmsxID0gMjsKKyAgICAgIHBwLT5tYXJrMiA9IDI7CisgICAgfQorICB9CisgIGVsc2UgaWYgKCFzb2FwX3BvaW50ZXJfZW50ZXIoc29hcCwgcCwgYSwgbiwgdCwgJnBwKSkKKyAgICByZXR1cm4gMTsKKyAgZWxzZQorICB7IHBwLT5tYXJrMSA9IDA7CisgICAgcHAtPm1hcmsyID0gMDsKKyAgfQorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFycmF5IHJlZmVyZW5jZSAlcCBwdHI9JXAgZGltPSVkIHR5cGU9JWQgKCVkICVkKVxuIiwgcCwgYS0+X19wdHIsIG4sIHQsIChpbnQpcHAtPm1hcmsxLCAoaW50KXBwLT5tYXJrMikpOworICByZXR1cm4gcHAtPm1hcmsxOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VtYmVkZGVkX2lkKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgaWQsIGNvbnN0IHZvaWQgKnAsIGludCB0KQoreyBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfVFJFRSkKKyAgICByZXR1cm4gaWQ7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW1iZWRkZWRfaWQgJXAgdHlwZT0lZCBpZD0lZFxuIiwgcCwgdCwgaWQpKTsKKyAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMSAmJiBzb2FwLT5lbmNvZGluZ1N0eWxlICYmICEoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0dSQVBIKSAmJiBzb2FwLT5wYXJ0ICE9IFNPQVBfSU5fSEVBREVSKQorICB7IGlmIChpZCA8IDApCisgICAgeyBpZCA9IHNvYXBfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgdCwgJnBwKTsKKyAgICAgIGlmIChpZCkKKyAgICAgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICAgICAgICBwcC0+bWFyazEgPSAyOworICAgICAgICBlbHNlCisgICAgICAgICAgcHAtPm1hcmsyID0gMjsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbWJlZGRlZF9pZCBtdWx0aXJlZiBpZD0lZCAlcCB0eXBlPSVkID0gKCVkICVkKVxuIiwgaWQsIHAsIHQsIChpbnQpcHAtPm1hcmsxLCAoaW50KXBwLT5tYXJrMikpOworICAgICAgfQorICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gaWQ7CisgIH0KKyAgaWYgKGlkIDwgMCkKKyAgICBpZCA9IHNvYXBfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgdCwgJnBwKTsKKyAgZWxzZSBpZiAoaWQgJiYgIXNvYXBfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgdCwgJnBwKSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKGlkICYmIHBwKQorICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgICBwcC0+bWFyazEgPSAxOworICAgIGVsc2UKKyAgICAgIHBwLT5tYXJrMiA9IDE7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbWJlZGRlZF9pZCBlbWJlZGRlZCByZWYgaWQ9JWQgJXAgdHlwZT0lZCA9ICglZCAlZClcbiIsIGlkLCBwLCB0LCAoaW50KXBwLT5tYXJrMSwgKGludClwcC0+bWFyazIpKTsKKyAgfQorICByZXR1cm4gaWQ7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfaXNfZW1iZWRkZWQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3BsaXN0ICpwcCkKK3sgaWYgKCFwcCkKKyAgICByZXR1cm4gMDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJcyBlbWJlZGRlZD8gJWQgJWRcbiIsIChpbnQpcHAtPm1hcmsxLCAoaW50KXBwLT5tYXJrMikpOworICBpZiAoc29hcC0+dmVyc2lvbiA9PSAxICYmIHNvYXAtPmVuY29kaW5nU3R5bGUgJiYgIShzb2FwLT5tb2RlICYgU09BUF9YTUxfR1JBUEgpICYmIHNvYXAtPnBhcnQgIT0gU09BUF9JTl9IRUFERVIpCisgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICAgIHJldHVybiBwcC0+bWFyazEgIT0gMDsKKyAgICByZXR1cm4gcHAtPm1hcmsyICE9IDA7CisgIH0KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICByZXR1cm4gcHAtPm1hcmsxID09IDE7CisgIHJldHVybiBwcC0+bWFyazIgPT0gMTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9pc19zaW5nbGUoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3BsaXN0ICpwcCkKK3sgaWYgKHNvYXAtPnBhcnQgPT0gU09BUF9JTl9IRUFERVIpCisgICAgcmV0dXJuIDE7CisgIGlmICghcHApCisgICAgcmV0dXJuIDA7CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgcmV0dXJuIHBwLT5tYXJrMSA9PSAwOworICByZXR1cm4gcHAtPm1hcmsyID09IDA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9lbWJlZGRlZChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGxpc3QgKnBwKQoreyBpZiAoIXBwKQorICAgIHJldHVybjsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICBwcC0+bWFyazEgPSAxOworICBlbHNlCisgICAgcHAtPm1hcmsyID0gMTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9hdHRhY2htZW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgdm9pZCAqcCwgY29uc3Qgc3RydWN0IHNvYXBfYXJyYXkgKmEsIGNvbnN0IGNoYXIgKmFpZCwgY29uc3QgY2hhciAqYXR5cGUsIGNvbnN0IGNoYXIgKmFvcHRpb25zLCBpbnQgbiwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpIAoreyBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgIGludCBpOworICBpZiAoIXAgfHwgIWEtPl9fcHRyIHx8ICghYWlkICYmICFhdHlwZSkpCisgICAgcmV0dXJuIHNvYXBfZWxlbWVudF9pZChzb2FwLCB0YWcsIGlkLCBwLCBhLCBuLCB0eXBlLCB0KTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJBdHRhY2htZW50IHRhZz0nJXMnIGlkPSclcycgKCVkKSB0eXBlPSclcydcbiIsIHRhZywgYWlkP2FpZDoiIiwgaWQsIGF0eXBlP2F0eXBlOiIiKSk7CisgIGkgPSBzb2FwX2FycmF5X3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIGEsIG4sIHQsICZwcCk7CisgIGlmICghaSkKKyAgeyBpID0gc29hcF9wb2ludGVyX2VudGVyKHNvYXAsIHAsIGEsIG4sIHQsICZwcCk7CisgICAgaWYgKCFpKQorICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKyAgaWYgKGlkIDw9IDApCisgICAgaWQgPSBpOworICBpZiAoIWFpZCkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1Ziwgc29hcC0+ZGltZV9pZF9mb3JtYXQsIGlkKTsKKyAgICBhaWQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT50bXBidWYpOworICB9CisgIC8qIEFkZCBNVE9NIHhvcDpJbmNsdWRlIGVsZW1lbnQgd2hlbiBuZWNlc3NhcnkgKi8KKyAgLyogVE9ETzogdGhpcyBjb2RlIHRvIGJlIG9ic29sZXRlZCB3aXRoIG5ldyBpbXBvcnQveG9wLmggY29udmVudGlvbnMgKi8KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkgJiYgc3RyY21wKHRhZywgInhvcDpJbmNsdWRlIikpCisgIHsgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCAwLCB0eXBlKQorICAgICB8fCBzb2FwX2VsZW1lbnRfaHJlZihzb2FwLCAieG9wOkluY2x1ZGUiLCAwLCAiaHJlZiIsIGFpZCkKKyAgICAgfHwgc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBlbHNlIGlmIChzb2FwX2VsZW1lbnRfaHJlZihzb2FwLCB0YWcsIDAsICJocmVmIiwgYWlkKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgIHsgaWYgKHBwLT5tYXJrMSAhPSAzKQorICAgIHsgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICAgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKQorICAgICAgICBjb250ZW50ID0gc29hcF9uZXdfbXVsdGlwYXJ0KHNvYXAsICZzb2FwLT5taW1lLmZpcnN0LCAmc29hcC0+bWltZS5sYXN0LCAoY2hhciopYS0+X19wdHIsIGEtPl9fc2l6ZSk7CisgICAgICBlbHNlCisgICAgICAgIGNvbnRlbnQgPSBzb2FwX25ld19tdWx0aXBhcnQoc29hcCwgJnNvYXAtPmRpbWUuZmlyc3QsICZzb2FwLT5kaW1lLmxhc3QsIChjaGFyKilhLT5fX3B0ciwgYS0+X19zaXplKTsKKyAgICAgIGlmICghY29udGVudCkKKyAgICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgaWYgKCFzdHJuY21wKGFpZCwgImNpZDoiLCA0KSkgLyogUkZDIDIxMTEgKi8KKyAgICAgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKQorICAgICAgICB7IGNoYXIgKnMgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc3RybGVuKGFpZCkgLSAxKTsKKwkgIGlmIChzKQorCSAgeyAqcyA9ICc8JzsKKwkgICAgc3RyY3B5KHMgKyAxLCBhaWQgKyA0KTsKKwkgICAgc3RyY2F0KHMsICI+Iik7CisJICAgIGNvbnRlbnQtPmlkID0gczsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIGNvbnRlbnQtPmlkID0gYWlkICsgNDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgY29udGVudC0+aWQgPSBhaWQ7CisgICAgICBjb250ZW50LT50eXBlID0gYXR5cGU7CisgICAgICBjb250ZW50LT5vcHRpb25zID0gYW9wdGlvbnM7CisgICAgICBjb250ZW50LT5lbmNvZGluZyA9IFNPQVBfTUlNRV9CSU5BUlk7CisgICAgICBwcC0+bWFyazEgPSAzOworICAgIH0KKyAgfQorICBlbHNlCisgICAgcHAtPm1hcmsyID0gMzsKKyAgcmV0dXJuIC0xOworfQorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZAorc29hcF9pbml0X2lodChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5pdGlhbGl6aW5nIElEIGhhc2h0YWJsZVxuIikpOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9JREhBU0g7IGkrKykKKyAgICBzb2FwLT5paHRbaV0gPSBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQKK3NvYXBfZnJlZV9paHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXAsICpwOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9mbGlzdCAqZnAsICpmcTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIElEIGhhc2h0YWJsZVxuIikpOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9JREhBU0g7IGkrKykKKyAgeyBmb3IgKGlwID0gc29hcC0+aWh0W2ldOyBpcDsgaXAgPSBwKQorICAgIHsgZm9yIChmcCA9IGlwLT5mbGlzdDsgZnA7IGZwID0gZnEpCisgICAgICB7IGZxID0gZnAtPm5leHQ7CisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBmcCk7CisgICAgICB9CisgICAgICBwID0gaXAtPm5leHQ7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgaXApOworICAgIH0KKyAgICBzb2FwLT5paHRbaV0gPSBOVUxMOworICB9Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcF9pbGlzdCAqCitTT0FQX0ZNQUMyCitzb2FwX2xvb2t1cChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgZm9yIChpcCA9IHNvYXAtPmlodFtzb2FwX2hhc2goaWQpXTsgaXA7IGlwID0gaXAtPm5leHQpCisgICAgaWYgKCFzdHJjbXAoaXAtPmlkLCBpZCkpCisgICAgICByZXR1cm4gaXA7CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorc3RydWN0IHNvYXBfaWxpc3QgKgorU09BUF9GTUFDMgorc29hcF9lbnRlcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQpCit7IHJlZ2lzdGVyIHNpemVfdCBoOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIGlwID0gKHN0cnVjdCBzb2FwX2lsaXN0KilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfaWxpc3QpICsgc3RybGVuKGlkKSk7CisgIGlmIChpcCkKKyAgeyBoID0gc29hcF9oYXNoKGlkKTsKKyAgICBzdHJjcHkoaXAtPmlkLCBpZCk7CisgICAgaXAtPm5leHQgPSBzb2FwLT5paHRbaF07CisgICAgc29hcC0+aWh0W2hdID0gaXA7CisgICAgcmV0dXJuIGlwOworICB9CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkKgorU09BUF9GTUFDMgorc29hcF9tYWxsb2Moc3RydWN0IHNvYXAgKnNvYXAsIHNpemVfdCBuKQoreyByZWdpc3RlciBjaGFyICpwOworICBpZiAoIW4pCisgICAgcmV0dXJuICh2b2lkKilTT0FQX05PTl9OVUxMOworICBpZiAoIXNvYXApCisgICAgcmV0dXJuIFNPQVBfTUFMTE9DKHNvYXAsIG4pOworICBuICs9ICgtKGxvbmcpbikgJiAoc2l6ZW9mKHZvaWQqKS0xKTsgLyogYWxpZ24gYXQgNC0sIDgtIG9yIDE2LWJ5dGUgYm91bmRhcnkgKi8KKyAgaWYgKCEocCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBuICsgc2l6ZW9mKHZvaWQqKSArIHNpemVvZihzaXplX3QpKSkpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICAvKiBrZWVwIGNoYWluIG9mIGFsbG9jZWQgY2VsbHMgZm9yIGxhdGVyIGRlc3RydWN0aW9uICovCisgIHNvYXAtPmFsbG9jZWQgPSAxOworICAqKHZvaWQqKikocCArIG4pID0gc29hcC0+YWxpc3Q7CisgICooc2l6ZV90KikocCArIG4gKyBzaXplb2Yodm9pZCopKSA9IG47CisgIHNvYXAtPmFsaXN0ID0gcCArIG47CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworc3RhdGljIHZvaWQKK3NvYXBfaW5pdF9taHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgKGludClTT0FQX1BUUkhBU0g7IGkrKykKKyAgICBzb2FwLT5taHRbaV0gPSBOVUxMOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworc3RhdGljIHZvaWQKK3NvYXBfZnJlZV9taHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9tbGlzdCAqbXAsICptcTsKKyAgZm9yIChpID0gMDsgaSA8IChpbnQpU09BUF9QVFJIQVNIOyBpKyspCisgIHsgZm9yIChtcCA9IHNvYXAtPm1odFtpXTsgbXA7IG1wID0gbXEpCisgICAgeyBtcSA9IG1wLT5uZXh0OworICAgICAgaWYgKG1wLT5saXZlKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzKCVkKTogbWFsbG9jKCkgPSAlcCBub3QgZnJlZWQgKG1lbW9yeSBsZWFrIG9yIGZvcmdvdCB0byBjYWxsIHNvYXBfZW5kKCk/KVxuIiwgbXAtPmZpbGUsIG1wLT5saW5lLCBtcC0+cHRyKTsKKyAgICAgIGZyZWUobXApOworICAgIH0KKyAgICBzb2FwLT5taHRbaV0gPSBOVUxMOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitTT0FQX0ZNQUMxCit2b2lkKgorU09BUF9GTUFDMgorc29hcF90cmFja19tYWxsb2Moc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBzaXplX3Qgc2l6ZSkKK3sgcmVnaXN0ZXIgdm9pZCAqcCA9IG1hbGxvYyhzaXplKTsKKyAgaWYgKHNvYXApCisgIHsgcmVnaXN0ZXIgaW50IGggPSBzb2FwX2hhc2hfcHRyKHApOworICAgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX21saXN0ICptcCA9IChzdHJ1Y3Qgc29hcF9tbGlzdCopbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc29hcF9tbGlzdCkpOworICAgIGlmIChzb2FwLT5mZGVidWdbU09BUF9JTkRFWF9URVNUXSkKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiJXMoJWQpOiBtYWxsb2MoJWx1KSA9ICVwXG4iLCBmaWxlLCBsaW5lLCAodW5zaWduZWQgbG9uZylzaXplLCBwKSk7CisgICAgbXAtPm5leHQgPSBzb2FwLT5taHRbaF07CisgICAgbXAtPnB0ciA9IHA7CisgICAgbXAtPmZpbGUgPSBmaWxlOworICAgIG1wLT5saW5lID0gbGluZTsKKyAgICBtcC0+bGl2ZSA9IDE7CisgICAgc29hcC0+bWh0W2hdID0gbXA7CisgIH0KKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3RyYWNrX2ZyZWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCB2b2lkICpwKQoreyByZWdpc3RlciBpbnQgaCA9IHNvYXBfaGFzaF9wdHIocCk7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX21saXN0ICptcDsKKyAgZm9yIChtcCA9IHNvYXAtPm1odFtoXTsgbXA7IG1wID0gbXAtPm5leHQpCisgICAgaWYgKG1wLT5wdHIgPT0gcCkKKyAgICAgIGJyZWFrOworICBpZiAobXApCisgIHsgaWYgKG1wLT5saXZlKQorICAgIHsgZnJlZShwKTsKKyAgICAgIGlmIChzb2FwLT5mZGVidWdbU09BUF9JTkRFWF9URVNUXSkKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIlcyglZCk6IGZyZWUoJXApXG4iLCBmaWxlLCBsaW5lLCBwKSk7CisgICAgICBtcC0+bGl2ZSA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMoJWQpOiBmcmVlKCVwKSBkb3VibGUgZnJlZSBvZiBwb2ludGVyIG1hbGxvY2VkIGF0ICVzKCVkKVxuIiwgZmlsZSwgbGluZSwgcCwgbXAtPmZpbGUsIG1wLT5saW5lKTsKKyAgfQorICBlbHNlCisgICAgZnByaW50ZihzdGRlcnIsICIlcyglZCk6IGZyZWUoJXApIHBvaW50ZXIgbm90IG1hbGxvY2VkXG4iLCBmaWxlLCBsaW5lLCBwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK3N0YXRpYyB2b2lkCitzb2FwX3RyYWNrX3VubGluayhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCkKK3sgcmVnaXN0ZXIgaW50IGggPSBzb2FwX2hhc2hfcHRyKHApOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9tbGlzdCAqbXA7CisgIGZvciAobXAgPSBzb2FwLT5taHRbaF07IG1wOyBtcCA9IG1wLT5uZXh0KQorICAgIGlmIChtcC0+cHRyID09IHApCisgICAgICBicmVhazsKKyAgaWYgKG1wKQorICAgIG1wLT5saXZlID0gMDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZGVhbGxvYyhzdHJ1Y3Qgc29hcCAqc29hcCwgdm9pZCAqcCkKK3sgaWYgKCFzb2FwKQorICAgIHJldHVybjsKKyAgaWYgKHApCisgIHsgcmVnaXN0ZXIgY2hhciAqKnE7CisgICAgZm9yIChxID0gKGNoYXIqKikmc29hcC0+YWxpc3Q7ICpxOyBxID0gKihjaGFyKioqKXEpCisgICAgeyBpZiAocCA9PSAodm9pZCopKCpxIC0gKihzaXplX3QqKSgqcSArIHNpemVvZih2b2lkKikpKSkKKyAgICAgIHsgKnEgPSAqKihjaGFyKioqKXE7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZWQgZGF0YSBhdCAlcFxuIiwgcCkpOworICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisgICAgc29hcF9kZWxldGUoc29hcCwgcCk7CisgIH0KKyAgZWxzZQorICB7IHJlZ2lzdGVyIGNoYXIgKnE7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIGFsbCBzb2FwX21hbGxvYygpIGRhdGFcbiIpKTsKKyAgICB3aGlsZSAoc29hcC0+YWxpc3QpCisgICAgeyBxID0gKGNoYXIqKXNvYXAtPmFsaXN0OworICAgICAgc29hcC0+YWxpc3QgPSAqKHZvaWQqKilxOworICAgICAgcSAtPSAqKHNpemVfdCopKHEgKyBzaXplb2Yodm9pZCopKTsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBxKTsKKyAgICB9CisgIH0KKyAgLyogd2UgbXVzdCBhc3N1bWUgdGhlc2Ugd2VyZSBkZWFsbG9jYXRlZDogKi8KKyAgc29hcC0+YWN0aW9uID0gTlVMTDsKKyAgc29hcC0+ZmF1bHQgPSBOVUxMOworICBzb2FwLT5oZWFkZXIgPSBOVUxMOworICBzb2FwLT51c2VyaWQgPSBOVUxMOworICBzb2FwLT5wYXNzd2QgPSBOVUxMOworICBzb2FwLT5hdXRocmVhbG0gPSBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzb2FwX2Nscl9taW1lKHNvYXApOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2RlbGV0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgdm9pZCAqcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfY2xpc3QgKipjcDsKKyAgaWYgKHNvYXBfY2hlY2tfc3RhdGUoc29hcCkpCisgICAgcmV0dXJuOworICBjcCA9ICZzb2FwLT5jbGlzdDsKKyAgaWYgKHApCisgIHsgd2hpbGUgKCpjcCkKKyAgICB7IGlmIChwID09ICgqY3ApLT5wdHIpCisgICAgICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2NsaXN0ICpxID0gKmNwOworICAgICAgICAqY3AgPSBxLT5uZXh0OworICAgICAgICBxLT5mZGVsZXRlKHEpOworICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGNwID0gJigqY3ApLT5uZXh0OworICAgIH0KKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBkZWFsbG9jIGRhdGEgJXA6IGFkZHJlc3Mgbm90IGluIGxpc3RcbiIsIHApKTsKKyAgfQorICBlbHNlCisgIHsgd2hpbGUgKCpjcCkKKyAgICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2NsaXN0ICpxID0gKmNwOworICAgICAgKmNwID0gcS0+bmV4dDsKKyAgICAgIGlmIChxLT5wdHIgPT0gKHZvaWQqKXNvYXAtPmZhdWx0KQorICAgICAgICBzb2FwLT5mYXVsdCA9IE5VTEw7IC8qIHRoaXMgd2FzIGRlYWxsb2NhdGVkICovCisgICAgICBlbHNlIGlmIChxLT5wdHIgPT0gKHZvaWQqKXNvYXAtPmhlYWRlcikKKyAgICAgICAgc29hcC0+aGVhZGVyID0gTlVMTDsgLyogdGhpcyB3YXMgZGVhbGxvY2F0ZWQgKi8KKyAgICAgIHEtPmZkZWxldGUocSk7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgcSk7CisgICAgfQorICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcF9jbGlzdCAqCitTT0FQX0ZNQUMyCitzb2FwX2xpbmsoc3RydWN0IHNvYXAgKnNvYXAsIHZvaWQgKnAsIGludCB0LCBpbnQgbiwgdm9pZCAoKmZkZWxldGUpKHN0cnVjdCBzb2FwX2NsaXN0KikpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2NsaXN0ICpjcDsKKyAgaWYgKChjcCA9IChzdHJ1Y3Qgc29hcF9jbGlzdCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2NsaXN0KSkpKQorICB7IGNwLT5uZXh0ID0gc29hcC0+Y2xpc3Q7CisgICAgY3AtPnR5cGUgPSB0OworICAgIGNwLT5zaXplID0gbjsgCisgICAgY3AtPnB0ciA9IHA7CisgICAgY3AtPmZkZWxldGUgPSBmZGVsZXRlOworICAgIHNvYXAtPmNsaXN0ID0gY3A7CisgIH0KKyAgcmV0dXJuIGNwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF91bmxpbmsoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnApCit7IHJlZ2lzdGVyIGNoYXIgKipxOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9jbGlzdCAqKmNwOworICBpZiAoIXNvYXAgfHwgIXApCisgICAgcmV0dXJuOworICBmb3IgKHEgPSAoY2hhcioqKSZzb2FwLT5hbGlzdDsgKnE7IHEgPSAqKGNoYXIqKiopcSkKKyAgeyBpZiAocCA9PSAodm9pZCopKCpxIC0gKihzaXplX3QqKSgqcSArIHNpemVvZih2b2lkKikpKSkKKyAgICB7ICpxID0gKiooY2hhcioqKilxOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVbmxpbmtlZCBkYXRhICVwXG4iLCBwKSk7CisjaWZkZWYgU09BUF9ERUJVRworICAgICAgc29hcF90cmFja191bmxpbmsoc29hcCwgcCk7CisjZW5kaWYKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgZm9yIChjcCA9ICZzb2FwLT5jbGlzdDsgKmNwOyBjcCA9ICYoKmNwKS0+bmV4dCkKKyAgeyBpZiAocCA9PSAoKmNwKS0+cHRyKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVbmxpbmtlZCBjbGFzcyBpbnN0YW5jZSAlcFxuIiwgcCkpOworICAgICAgcSA9IChjaGFyKiopKmNwOworICAgICAgKmNwID0gKCpjcCktPm5leHQ7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgcSk7CisgICAgICByZXR1cm47CisgICAgfQorICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2xvb2t1cF90eXBlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworICBpZiAoaWQgJiYgKmlkKQorICB7IGlwID0gc29hcF9sb29rdXAoc29hcCwgaWQpOworICAgIGlmIChpcCkKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTG9va3VwIGlkPSclcycgdHlwZT0lZFxuIiwgaWQsIGlwLT50eXBlKSk7CisgICAgICByZXR1cm4gaXAtPnR5cGU7CisgICAgfQorICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAibG9va3VwIHR5cGUgaWQ9JyVzJyBOT1QgRk9VTkQhIE5lZWQgdG8gZ2V0IGl0IGZyb20geHNpOnR5cGVcbiIsIGlkKSk7CisgIHJldHVybiAwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZCoKK1NPQVBfRk1BQzIKK3NvYXBfaWRfbG9va3VwKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgdm9pZCAqKnAsIGludCB0LCBzaXplX3QgbiwgdW5zaWduZWQgaW50IGspCit7IHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgdm9pZCAqKnE7CisgIGlmICghcCB8fCAhaWQgfHwgISppZCkKKyAgICByZXR1cm4gcDsKKyAgaXAgPSBzb2FwX2xvb2t1cChzb2FwLCBpZCk7IC8qIGxvb2t1cCBwb2ludGVyIHRvIGhhc2ggdGFibGUgZW50cnkgZm9yIHN0cmluZyBpZCAqLworICBpZiAoIWlwKQorICB7IGlwID0gc29hcF9lbnRlcihzb2FwLCBpZCk7IC8qIG5ldyBoYXNoIHRhYmxlIGVudHJ5IGZvciBzdHJpbmcgaWQgKi8KKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZvcndhcmRpbmcgZmlyc3QgaHJlZj0nJXMnIHR5cGU9JWQgJXAgKCV1IGJ5dGVzKVxuIiwgaWQsIHQsIHAsICh1bnNpZ25lZCBpbnQpbikpOworICAgIGlwLT50eXBlID0gdDsKKyAgICBpcC0+c2l6ZSA9IG47IAorICAgIGlwLT5saW5rID0gcDsKKyAgICBpcC0+Y29weSA9IE5VTEw7CisgICAgaXAtPmZsaXN0ID0gTlVMTDsKKyAgICBpcC0+cHRyID0gTlVMTDsKKyAgICBpcC0+bGV2ZWwgPSBrOworICAgICpwID0gTlVMTDsKKyAgfQorICBlbHNlIGlmIChpcC0+cHRyKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x2ZWQgaHJlZj0nJXMnIHR5cGU9JWQgbG9jYXRpb249JXAgKCV1IGJ5dGVzKVxuIiwgaWQsIHQsIGlwLT5wdHIsICh1bnNpZ25lZCBpbnQpbikpOworICAgIGlmIChpcC0+dHlwZSAhPSB0KQorICAgIHsgc3RyY3B5KHNvYXAtPmlkLCBpZCk7CisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfSFJFRjsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVHlwZSBpbmNvbXBhdGliaWxpdHk6IGlkIHR5cGU9JWQgaHJlZiB0eXBlPSVkXG4iLCBpcC0+dHlwZSwgdCkpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHdoaWxlIChpcC0+bGV2ZWwgPCBrKQorICAgIHsgcSA9ICh2b2lkKiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHZvaWQqKSk7ICAKKyAgICAgIGlmICghcSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAqcCA9ICh2b2lkKilxOworICAgICAgcCA9IHE7CisgICAgICBrLS07CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlc2NlbmRpbmcgb25lIGxldmVsLi4uXG4iKSk7CisgICAgfQorICAgICpwID0gaXAtPnB0cjsKKyAgfQorICBlbHNlIGlmIChpcC0+bGV2ZWwgPiBrKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x2aW5nIGxldmVsICV1IHBvaW50ZXJzIHRvIGhyZWY9JyVzJ1xuIiwgaXAtPmxldmVsLCBpZCkpOworICAgIHdoaWxlIChpcC0+bGV2ZWwgPiBrKQorICAgIHsgdm9pZCAqcywgKipyID0gJmlwLT5saW5rOworICAgICAgcSA9ICh2b2lkKiopaXAtPmxpbms7CisgICAgICB3aGlsZSAocSkKKyAgICAgIHsgKnIgPSAodm9pZCopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHZvaWQqKSk7CisgICAgICAgIHMgPSAqcTsKKyAgICAgICAgKnEgPSAqcjsKKyAgICAgICAgciA9ICh2b2lkKiopKnI7CisgICAgICAgIHEgPSAodm9pZCoqKXM7CisgICAgICB9CisgICAgICAqciA9IE5VTEw7CisgICAgICBpcC0+c2l6ZSA9IG47IAorICAgICAgaXAtPmNvcHkgPSBOVUxMOworICAgICAgaXAtPmxldmVsID0gaXAtPmxldmVsIC0gMTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVzY2VuZGluZyBvbmUgbGV2ZWwuLi5cbiIpKTsKKyAgICB9CisgICAgcSA9ICh2b2lkKiopaXAtPmxpbms7CisgICAgaXAtPmxpbmsgPSBwOworICAgICpwID0gKHZvaWQqKXE7CisgIH0KKyAgZWxzZQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRm9yd2FyZGVkIGhyZWY9JyVzJyB0eXBlPSVkIGxvY2F0aW9uPSVwICgldSBieXRlcylcbiIsIGlkLCB0LCBwLCAodW5zaWduZWQgaW50KW4pKTsKKyAgICB3aGlsZSAoaXAtPmxldmVsIDwgaykKKyAgICB7IHEgPSAodm9pZCoqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZih2b2lkKikpOyAgCisgICAgICAqcCA9IHE7CisgICAgICBwID0gcTsKKyAgICAgIGstLTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVzY2VuZGluZyBvbmUgbGV2ZWwuLi5cbiIpKTsKKyAgICB9CisgICAgcSA9ICh2b2lkKiopaXAtPmxpbms7CisgICAgaXAtPmxpbmsgPSBwOworICAgICpwID0gKHZvaWQqKXE7CisgIH0KKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkKgorU09BUF9GTUFDMgorc29hcF9pZF9mb3J3YXJkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpocmVmLCB2b2lkICpwLCBzaXplX3QgbGVuLCBpbnQgc3QsIGludCB0dCwgc2l6ZV90IG4sIHVuc2lnbmVkIGludCBrLCB2b2lkICgqZmNvcHkpKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBzaXplX3QsIGNvbnN0IHZvaWQqLCBzaXplX3QpKQoreyBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIGlmICghcCB8fCAhaHJlZiB8fCAhKmhyZWYpCisgICAgcmV0dXJuIHA7CisgIGlwID0gc29hcF9sb29rdXAoc29hcCwgaHJlZik7IC8qIGxvb2t1cCBwb2ludGVyIHRvIGhhc2ggdGFibGUgZW50cnkgZm9yIHN0cmluZyBpZCAqLworICBpZiAoIWlwKQorICB7IGlwID0gc29hcF9lbnRlcihzb2FwLCBocmVmKTsgLyogbmV3IGhhc2ggdGFibGUgZW50cnkgZm9yIHN0cmluZyBpZCAqLworICAgIGlwLT50eXBlID0gc3Q7CisgICAgaXAtPnNpemUgPSBuOworICAgIGlwLT5saW5rID0gTlVMTDsKKyAgICBpcC0+Y29weSA9IE5VTEw7CisgICAgaXAtPnB0ciA9IE5VTEw7CisgICAgaXAtPmxldmVsID0gMDsKKyAgICBpcC0+Zmxpc3QgPSBOVUxMOworICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJOZXcgZW50cnkgaHJlZj0nJXMnIHR5cGU9JWQgc2l6ZT0lbHUgbGV2ZWw9JWQgbG9jYXRpb249JXBcbiIsIGhyZWYsIHN0LCAodW5zaWduZWQgbG9uZyluLCBrLCBwKSk7CisgIH0KKyAgZWxzZSBpZiAoaXAtPnR5cGUgIT0gc3QgfHwgKGlwLT5sZXZlbCA9PSBrICYmIGlwLT5zaXplICE9IG4pKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVHlwZSBpbmNvbXBhdGliaWxpdHkgaWQ9JyVzJyBleHBlY3QgdHlwZT0lZCBzaXplPSVsdSBsZXZlbD0ldSBnb3QgdHlwZT0lZCBzaXplPSVsdVxuIiwgaHJlZiwgaXAtPnR5cGUsICh1bnNpZ25lZCBsb25nKWlwLT5zaXplLCBrLCBzdCwgKHVuc2lnbmVkIGxvbmcpbikpOworICAgIHN0cmNweShzb2FwLT5pZCwgaHJlZik7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0hSRUY7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKGZjb3B5IHx8IG4gPCBzaXplb2Yodm9pZCopIHx8ICpocmVmICE9ICcjJykKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9mbGlzdCAqZnAgPSAoc3RydWN0IHNvYXBfZmxpc3QqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9mbGlzdCkpOworICAgIGlmICghZnApCisgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZwLT5uZXh0ID0gaXAtPmZsaXN0OworICAgIGZwLT50eXBlID0gdHQ7CisgICAgZnAtPnB0ciA9IHA7CisgICAgZnAtPmxldmVsID0gazsKKyAgICBmcC0+bGVuID0gbGVuOworICAgIGlmIChmY29weSkKKyAgICAgIGZwLT5mY29weSA9IGZjb3B5OworICAgIGVsc2UKKyAgICAgIGZwLT5mY29weSA9IHNvYXBfZmNvcHk7CisgICAgaXAtPmZsaXN0ID0gZnA7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGb3J3YXJkaW5nIHR5cGU9JWQgKHRhcmdldCB0eXBlPSVkKSBzaXplPSVsdSBsb2NhdGlvbj0lcCBsZXZlbD0ldSBsZW49JWx1IGhyZWY9JyVzJ1xuIiwgc3QsIHR0LCAodW5zaWduZWQgbG9uZyluLCBwLCBrLCAodW5zaWduZWQgbG9uZylsZW4sIGhyZWYpKTsKKyAgfQorICBlbHNlCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGb3J3YXJkaW5nIGNvcHlpbmcgYWRkcmVzcyAlcCBmb3IgdHlwZT0lZCBocmVmPSclcydcbiIsIHAsIHN0LCBocmVmKSk7CisgICAgKih2b2lkKiopcCA9IGlwLT5jb3B5OworICAgIGlwLT5jb3B5ID0gcDsKKyAgfQorICByZXR1cm4gcDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZCoKK1NPQVBfRk1BQzIKK3NvYXBfaWRfZW50ZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCB2b2lkICpwLCBpbnQgdCwgc2l6ZV90IG4sIHVuc2lnbmVkIGludCBrLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICphcnJheVR5cGUsIHZvaWQgKigqZmluc3RhbnRpYXRlKShzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKSkKK3sKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgIHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyNlbmRpZgorICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW50ZXIgaWQ9JyVzJyB0eXBlPSVkIGxvYz0lcCBzaXplPSVsdSBsZXZlbD0ldVxuIiwgaWQsIHQsIHAsICh1bnNpZ25lZCBsb25nKW4sIGspKTsKKyAgc29hcC0+YWxsb2NlZCA9IDA7CisgIGlmICghcCkKKyAgeyBpZiAoZmluc3RhbnRpYXRlKQorICAgICAgcCA9IGZpbnN0YW50aWF0ZShzb2FwLCB0LCB0eXBlLCBhcnJheVR5cGUsICZuKTsKKyAgICBlbHNlCisgICAgICBwID0gc29hcF9tYWxsb2Moc29hcCwgbik7CisgICAgaWYgKHApCisgICAgICBzb2FwLT5hbGxvY2VkID0gMTsKKyAgfQorI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgaWYgKCFpZCB8fCAhKmlkKQorI2VuZGlmCisgICAgcmV0dXJuIHA7CisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICBpcCA9IHNvYXBfbG9va3VwKHNvYXAsIGlkKTsgLyogbG9va3VwIHBvaW50ZXIgdG8gaGFzaCB0YWJsZSBlbnRyeSBmb3Igc3RyaW5nIGlkICovCisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJMb29rdXAgZW50cnkgaWQ9JyVzIGZvciBsb2NhdGlvbj0lcCdcbiIsIGlkLCBwKSk7CisgIGlmICghaXApCisgIHsgaXAgPSBzb2FwX2VudGVyKHNvYXAsIGlkKTsgLyogbmV3IGhhc2ggdGFibGUgZW50cnkgZm9yIHN0cmluZyBpZCAqLworICAgIGlwLT50eXBlID0gdDsKKyAgICBpcC0+bGluayA9IE5VTEw7CisgICAgaXAtPmNvcHkgPSBOVUxMOworICAgIGlwLT5mbGlzdCA9IE5VTEw7CisgICAgaXAtPnNpemUgPSBuOworICAgIGlwLT5wdHIgPSBwOworICAgIGlwLT5sZXZlbCA9IGs7CisgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk5ldyBlbnRyeSBpZD0nJXMnIHR5cGU9JWQgc2l6ZT0lbHUgbGV2ZWw9JXUgbG9jYXRpb249JXBcbiIsIGlkLCB0LCAodW5zaWduZWQgbG9uZyluLCBrLCBwKSk7CisgIH0KKyAgZWxzZSBpZiAoKGlwLT50eXBlICE9IHQgfHwgKGlwLT5sZXZlbCA9PSBrICYmIGlwLT5zaXplICE9IG4pKSAmJiAoaXAtPmNvcHkgfHwgaXAtPmZsaXN0KSkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlR5cGUgaW5jb21wYXRpYmlsaXR5IGlkPSclcycgZXhwZWN0IHR5cGU9JWQgc2l6ZT0lbHUgbGV2ZWw9JXUgZ290IHR5cGU9JWQgc2l6ZT0lbHVcbiIsIGlkLCBpcC0+dHlwZSwgKHVuc2lnbmVkIGxvbmcpaXAtPnNpemUsIGssIHQsICh1bnNpZ25lZCBsb25nKW4pKTsKKyAgICBzdHJjcHkoc29hcC0+aWQsIGlkKTsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfSFJFRjsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBlbHNlIGlmIChpcC0+cHRyKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTXVsdGlwbHkgZGVmaW5lZCBpZD0nJXMnXG4iLCBpZCkpOworICAgIHN0cmNweShzb2FwLT5pZCwgaWQpOworICAgIHNvYXAtPmVycm9yID0gU09BUF9EVVBMSUNBVEVfSUQ7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZWxzZSAKKyAgeyBpcC0+c2l6ZSA9IG47CisgICAgaXAtPnB0ciA9IHA7CisgICAgaXAtPmxldmVsID0gazsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVwZGF0ZSBlbnRyeSBpZD0nJXMnIHR5cGU9JWQgbG9jYXRpb249JXAgc2l6ZT0lbHUgbGV2ZWw9JXVcbiIsIGlkLCB0LCBwLCAodW5zaWduZWQgbG9uZyluLCBrKSk7CisgIH0KKyAgcmV0dXJuIGlwLT5wdHI7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZmNvcHkoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdCwgaW50IHR0LCB2b2lkICpwLCBzaXplX3QgbGVuLCBjb25zdCB2b2lkICpxLCBzaXplX3QgbikKK3sgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHlpbmcgZGF0YSB0eXBlPSVkICh0YXJnZXQgdHlwZT0lZCkgJXAgLT4gJXAgKCVsdSBieXRlcylcbiIsIHN0LCB0dCwgcSwgcCwgKHVuc2lnbmVkIGxvbmcpbikpOworICBtZW1jcHkocCwgcSwgbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW5kX3NlbmQoc3RydWN0IHNvYXAgKnNvYXApCit7IAorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+ZGltZS5saXN0KQorICB7IC8qIFNPQVAgYm9keSByZWZlcmVuY2VkIGF0dGFjaG1lbnRzIG11c3QgYXBwZWFyIGZpcnN0ICovCisgICAgc29hcC0+ZGltZS5sYXN0LT5uZXh0ID0gc29hcC0+ZGltZS5maXJzdDsKKyAgICBzb2FwLT5kaW1lLmZpcnN0ID0gc29hcC0+ZGltZS5saXN0LT5uZXh0OworICAgIHNvYXAtPmRpbWUubGlzdC0+bmV4dCA9IE5VTEw7CisgICAgc29hcC0+ZGltZS5sYXN0ID0gc29hcC0+ZGltZS5saXN0OworICB9CisgIGlmIChzb2FwX3B1dGRpbWUoc29hcCkgfHwgc29hcF9wdXRtaW1lKHNvYXApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgc29hcC0+bWltZS5saXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGlzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmxhc3QgPSBOVUxMOworI2VuZGlmCisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIHNlbmRcbiIpKTsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSAvKiBuZWVkIHRvIGZsdXNoIHRoZSByZW1haW5pbmcgZGF0YSBpbiBidWZmZXIgKi8KKyAgeyBpZiAoc29hcF9mbHVzaChzb2FwKSkKKyNpZmRlZiBXSVRIX1pMSUIKKyAgICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQiAmJiBzb2FwLT56bGliX3N0YXRlID09IFNPQVBfWkxJQl9ERUZMQVRFKQorICAgICAgeyBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX05PTkU7CisgICAgICAgIGRlZmxhdGVFbmQoJnNvYXAtPmRfc3RyZWFtKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisjZWxzZQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2VuZGlmCisjaWZkZWYgV0lUSF9aTElCCisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKQorICAgIHsgaW50IHI7CisgICAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbiA9IDA7CisgICAgICBkbworICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlZmxhdGluZyByZW1haW5kZXJcbiIpKTsKKyAgICAgICAgciA9IGRlZmxhdGUoJnNvYXAtPmRfc3RyZWFtLCBaX0ZJTklTSCk7CisgICAgICAgIGlmIChzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgIT0gU09BUF9CVUZMRU4pCisgICAgICAgIHsgaWYgKHNvYXBfZmx1c2hfcmF3KHNvYXAsIHNvYXAtPnpfYnVmLCBTT0FQX0JVRkxFTiAtIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCkpCisgICAgICAgICAgeyBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX05PTkU7CisgICAgICAgICAgICBkZWZsYXRlRW5kKCZzb2FwLT5kX3N0cmVhbSk7CisgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisJICB9CisgICAgICAgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZSopc29hcC0+el9idWY7CisgICAgICAgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0ID0gU09BUF9CVUZMRU47CisgICAgICAgIH0KKyAgICAgIH0gd2hpbGUgKHIgPT0gWl9PSyk7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlZmxhdGVkICVsdS0+JWx1IGJ5dGVzXG4iLCBzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiwgc29hcC0+ZF9zdHJlYW0udG90YWxfb3V0KSk7CisgICAgICBzb2FwLT56X3JhdGlvX291dCA9IChmbG9hdClzb2FwLT5kX3N0cmVhbS50b3RhbF9vdXQgLyAoZmxvYXQpc29hcC0+ZF9zdHJlYW0udG90YWxfaW47CisgICAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0VOQ19aTElCOworICAgICAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9OT05FOworICAgICAgaWYgKGRlZmxhdGVFbmQoJnNvYXAtPmRfc3RyZWFtKSAhPSBaX09LIHx8IHIgIT0gWl9TVFJFQU1fRU5EKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVuYWJsZSB0byBlbmQgZGVmbGF0ZTogJXNcbiIsIHNvYXAtPmRfc3RyZWFtLm1zZz9zb2FwLT5kX3N0cmVhbS5tc2c6IiIpKTsKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgfQorI2lmZGVmIFdJVEhfR1pJUAorICAgICAgc29hcC0+el9idWZbMF0gPSBzb2FwLT56X2NyYyAmIDB4RkY7CisgICAgICBzb2FwLT56X2J1ZlsxXSA9IChzb2FwLT56X2NyYyA+PiA4KSAmIDB4RkY7CisgICAgICBzb2FwLT56X2J1ZlsyXSA9IChzb2FwLT56X2NyYyA+PiAxNikgJiAweEZGOworICAgICAgc29hcC0+el9idWZbM10gPSAoc29hcC0+el9jcmMgPj4gMjQpICYgMHhGRjsKKyAgICAgIHNvYXAtPnpfYnVmWzRdID0gc29hcC0+ZF9zdHJlYW0udG90YWxfaW4gJiAweEZGOworICAgICAgc29hcC0+el9idWZbNV0gPSAoc29hcC0+ZF9zdHJlYW0udG90YWxfaW4gPj4gOCkgJiAweEZGOworICAgICAgc29hcC0+el9idWZbNl0gPSAoc29hcC0+ZF9zdHJlYW0udG90YWxfaW4gPj4gMTYpICYgMHhGRjsKKyAgICAgIHNvYXAtPnpfYnVmWzddID0gKHNvYXAtPmRfc3RyZWFtLnRvdGFsX2luID4+IDI0KSAmIDB4RkY7CisgICAgICBpZiAoc29hcF9mbHVzaF9yYXcoc29hcCwgc29hcC0+el9idWYsIDgpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImd6aXAgY3JjMzI9JWx1XG4iLCAodW5zaWduZWQgbG9uZylzb2FwLT56X2NyYykpOworI2VuZGlmCisgICAgfQorI2VuZGlmCisgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19TVE9SRSkKKyAgICB7IGNoYXIgKnA7CisjaWZuZGVmIFdJVEhfTk9IVFRQCisgICAgICBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9FTkNfWE1MKSkKKyAgICAgIHsgc29hcC0+bW9kZS0tOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNlbmRpbmcgYnVmZmVyZWQgbWVzc2FnZSBvZiBsZW5ndGggJXVcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+Ymxpc3QtPnNpemUpKTsKKyAgICAgICAgaWYgKHNvYXAtPnN0YXR1cyA+PSBTT0FQX1BPU1QpCisgICAgICAgICAgc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdChzb2FwLCBzb2FwLT5lbmRwb2ludCwgc29hcC0+aG9zdCwgc29hcC0+cG9ydCwgc29hcC0+cGF0aCwgc29hcC0+YWN0aW9uLCBzb2FwLT5ibGlzdC0+c2l6ZSk7CisgICAgICAgIGVsc2UgaWYgKHNvYXAtPnN0YXR1cyAhPSBTT0FQX1NUT1ApCisgICAgICAgICAgc29hcC0+ZXJyb3IgPSBzb2FwLT5mcmVzcG9uc2Uoc29hcCwgc29hcC0+c3RhdHVzLCBzb2FwLT5ibGlzdC0+c2l6ZSk7CisgICAgICAgIGlmIChzb2FwLT5lcnJvciB8fCBzb2FwX2ZsdXNoKHNvYXApKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgc29hcC0+bW9kZSsrOworICAgICAgfQorI2VuZGlmCisgICAgICBmb3IgKHAgPSBzb2FwX2ZpcnN0X2Jsb2NrKHNvYXApOyBwOyBwID0gc29hcF9uZXh0X2Jsb2NrKHNvYXApKQorICAgICAgeyBEQkdNU0coU0VOVCwgcCwgc29hcF9ibG9ja19zaXplKHNvYXApKTsKKyAgICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZzZW5kKHNvYXAsIHAsIHNvYXBfYmxvY2tfc2l6ZShzb2FwKSkpKQorICAgICAgICB7IHNvYXBfZW5kX2Jsb2NrKHNvYXApOworICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc29hcF9lbmRfYmxvY2soc29hcCk7CisgICAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICAgIGVsc2UgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgICB7IERCR01TRyhTRU5ULCAiXHJcbjBcclxuXHJcbiIsIDcpOworICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZzZW5kKHNvYXAsICJcclxuMFxyXG5cclxuIiwgNykpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorI2VuZGlmCisgIH0KKyNpZmRlZiBXSVRIX1RDUEZJTgorI2lmZGVmIFdJVEhfT1BFTlNTTAorICBpZiAoIXNvYXAtPnNzbCAmJiBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpICYmICFzb2FwLT5rZWVwX2FsaXZlICYmICEoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgc29hcC0+ZnNodXRkb3duc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIDEpOyAvKiBTZW5kIFRDUCBGSU4gKi8KKyNlbHNlCisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpICYmICFzb2FwLT5rZWVwX2FsaXZlICYmICEoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgc29hcC0+ZnNodXRkb3duc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIDEpOyAvKiBTZW5kIFRDUCBGSU4gKi8KKyNlbmRpZgorI2VuZGlmCisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIG9mIHNlbmQgcGhhc2VcbiIpKTsKKyAgc29hcC0+b21vZGUgJj0gflNPQVBfWE1MX1NFQzsKKyAgc29hcC0+Y291bnQgPSAwOworICBzb2FwLT5wYXJ0ID0gU09BUF9FTkQ7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VuZF9yZWN2KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5wYXJ0ID0gU09BUF9FTkQ7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpICYmIHNvYXBfZ2V0ZGltZShzb2FwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHNvYXAtPmRpbWUubGlzdCA9IHNvYXAtPmRpbWUuZmlyc3Q7CisgIHNvYXAtPmRpbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmxhc3QgPSBOVUxMOworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKSAmJiBzb2FwX2dldG1pbWUoc29hcCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBzb2FwLT5taW1lLmxpc3QgPSBzb2FwLT5taW1lLmZpcnN0OworICBzb2FwLT5taW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5sYXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5ib3VuZGFyeSA9IE5VTEw7CisjZW5kaWYKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBvZiByZWNlaXZlIG1lc3NhZ2Ugb2tcbiIpKTsKKyNpZmRlZiBXSVRIX1pMSUIKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKQorICB7IHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX1pMSUI7CisgICAgbWVtY3B5KHNvYXAtPmJ1Ziwgc29hcC0+el9idWYsIFNPQVBfQlVGTEVOKTsKKyAgICBzb2FwLT5idWZpZHggPSAoY2hhciopc29hcC0+ZF9zdHJlYW0ubmV4dF9pbiAtIHNvYXAtPnpfYnVmOworICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPnpfYnVmbGVuOworICAgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfTk9ORTsKKyAgICBpZiAoaW5mbGF0ZUVuZCgmc29hcC0+ZF9zdHJlYW0pICE9IFpfT0spCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisjaWZkZWYgV0lUSF9HWklQCisgICAgaWYgKHNvYXAtPnpsaWJfaW4gPT0gU09BUF9aTElCX0daSVApCisgICAgeyBzb2FwX3djaGFyIGM7CisgICAgICBzaG9ydCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgIHsgaWYgKChpbnQpKGMgPSBzb2FwX2dldGNoYXIoc29hcCkpID09IEVPRikKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAgICAgc29hcC0+el9idWZbaV0gPSAoY2hhciljOworICAgICAgfQorICAgICAgaWYgKHNvYXAtPnpfY3JjICE9ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbMF0gfCAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzFdIDw8IDgpIHwgKCh1TG9uZykodW5zaWduZWQgY2hhcilzb2FwLT56X2J1ZlsyXSA8PCAxNikgfCAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzNdIDw8IDI0KSkpCisgICAgICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJHemlwIGVycm9yOiBjcmMgY2hlY2sgZmFpbGVkLCBtZXNzYWdlIGNvcnJ1cHRlZD8gKGNyYzMyPSVsdSlcbiIsICh1bnNpZ25lZCBsb25nKXNvYXAtPnpfY3JjKSk7CisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICAgIH0KKyAgICAgIGlmIChzb2FwLT5kX3N0cmVhbS50b3RhbF9vdXQgIT0gKCh1TG9uZykodW5zaWduZWQgY2hhcilzb2FwLT56X2J1Zls0XSB8ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbNV0gPDwgOCkgfCAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzZdIDw8IDE2KSB8ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbN10gPDwgMjQpKSkKKyAgICAgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkd6aXAgZXJyb3I6IGluY29ycmVjdCBtZXNzYWdlIGxlbmd0aFxuIikpOworICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgICB9CisgICAgfQorI2VuZGlmCisgIH0KKyNlbmRpZgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKQorICAgIHdoaWxlICgoaW50KXNvYXBfZ2V0Y2hhcihzb2FwKSAhPSBFT0YpIC8qIGFkdmFuY2UgdG8gbGFzdCBjaHVuayAqLworICAgICAgOworICBpZiAoc29hcC0+ZmRpc2Nvbm5lY3QgJiYgKHNvYXAtPmVycm9yID0gc29hcC0+ZmRpc2Nvbm5lY3Qoc29hcCkpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgIHJldHVybiBzb2FwX3Jlc29sdmUoc29hcCk7CisjZWxzZQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+eGxpc3QpCisgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9NSU1FX0hSRUY7CisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9ESU1FX0hSRUY7CisgIH0KKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9mcmVlKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzdHJ1Y3QgTmFtZXNwYWNlICpuczsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIG5hbWVzcGFjZSBzdGFja1xuIikpOworICB3aGlsZSAoc29hcC0+bmxpc3QpCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wID0gc29hcC0+bmxpc3QtPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPm5saXN0KTsKKyAgICBzb2FwLT5ubGlzdCA9IG5wOworICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZSBhbnkgcmVtYWluaW5nIHRlbXAgYmxvY2tzXG4iKSk7CisgIHdoaWxlIChzb2FwLT5ibGlzdCkKKyAgICBzb2FwX2VuZF9ibG9jayhzb2FwKTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIGF0dHJpYnV0ZSBzdG9yYWdlXG4iKSk7CisgIHdoaWxlIChzb2FwLT5hdHRyaWJ1dGVzKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqdHAgPSBzb2FwLT5hdHRyaWJ1dGVzLT5uZXh0OworICAgIGlmIChzb2FwLT5hdHRyaWJ1dGVzLT52YWx1ZSkKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5hdHRyaWJ1dGVzLT52YWx1ZSk7CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPmF0dHJpYnV0ZXMpOworICAgIHNvYXAtPmF0dHJpYnV0ZXMgPSB0cDsKKyAgfQorI2lmZGVmIFdJVEhfRkFTVAorICBpZiAoc29hcC0+bGFiYnVmKQorICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5sYWJidWYpOworICBzb2FwLT5sYWJidWYgPSBOVUxMOworICBzb2FwLT5sYWJsZW4gPSAwOworICBzb2FwLT5sYWJpZHggPSAwOworI2VuZGlmCisgIG5zID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlczsKKyAgaWYgKG5zKQorICB7IGZvciAoOyBucy0+aWQ7IG5zKyspCisgICAgeyBpZiAobnMtPm91dCkKKyAgICAgIHsgaWYgKHNvYXAtPmVuY29kaW5nU3R5bGUgPT0gbnMtPm91dCkKKyAgICAgICAgICBzb2FwLT5lbmNvZGluZ1N0eWxlID0gU09BUF9TVFJfRU9TOworICAgICAgICBTT0FQX0ZSRUUoc29hcCwgbnMtPm91dCk7CisgICAgICAgIG5zLT5vdXQgPSBOVUxMOworICAgICAgfQorICAgICAgaWYgKHNvYXAtPmVuY29kaW5nU3R5bGUgPT0gbnMtPm5zKQorICAgICAgICBzb2FwLT5lbmNvZGluZ1N0eWxlID0gU09BUF9TVFJfRU9TOworICAgIH0KKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+bG9jYWxfbmFtZXNwYWNlcyk7CisgICAgc29hcC0+bG9jYWxfbmFtZXNwYWNlcyA9IE5VTEw7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgd2hpbGUgKHNvYXAtPnhsaXN0KQorICB7IHN0cnVjdCBzb2FwX3hsaXN0ICp4cCA9IHNvYXAtPnhsaXN0LT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT54bGlzdCk7CisgICAgc29hcC0+eGxpc3QgPSB4cDsKKyAgfQorI2VuZGlmCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICBzb2FwX2ZyZWVfcGh0KHNvYXApOworICBzb2FwX2ZyZWVfaWh0KHNvYXApOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitzdGF0aWMgdm9pZAorc29hcF9pbml0X2xvZ3Moc3RydWN0IHNvYXAgKnNvYXApCit7IGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9NQVhMT0dTOyBpKyspCisgIHsgc29hcC0+bG9nZmlsZVtpXSA9IE5VTEw7CisgICAgc29hcC0+ZmRlYnVnW2ldID0gTlVMTDsKKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgIWRlZmluZWQoV0lUSF9MRUFOKSB8fCBkZWZpbmVkKFNPQVBfREVCVUcpCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX29wZW5fbG9nZmlsZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGkpCit7IGlmIChzb2FwLT5sb2dmaWxlW2ldKQorICAgIHNvYXAtPmZkZWJ1Z1tpXSA9IGZvcGVuKHNvYXAtPmxvZ2ZpbGVbaV0sIGkgPCAyID8gImFiIiA6ICJhIik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitzdGF0aWMgdm9pZAorc29hcF9jbG9zZV9sb2dmaWxlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgaSkKK3sgaWYgKHNvYXAtPmZkZWJ1Z1tpXSkKKyAgeyBmY2xvc2Uoc29hcC0+ZmRlYnVnW2ldKTsKKyAgICBzb2FwLT5mZGVidWdbaV0gPSBOVUxMOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2Nsb3NlX2xvZ2ZpbGVzKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfTUFYTE9HUzsgaSsrKQorICAgIHNvYXBfY2xvc2VfbG9nZmlsZShzb2FwLCBpKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK3N0YXRpYyB2b2lkCitzb2FwX3NldF9sb2dmaWxlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgaSwgY29uc3QgY2hhciAqbG9nZmlsZSkKK3sgY2hhciAqcyA9IE5VTEw7CisgIHNvYXBfY2xvc2VfbG9nZmlsZShzb2FwLCBpKTsKKyAgaWYgKHNvYXAtPmxvZ2ZpbGVbaV0pCisgICAgU09BUF9GUkVFKHNvYXAsICh2b2lkKilzb2FwLT5sb2dmaWxlW2ldKTsKKyAgaWYgKGxvZ2ZpbGUpCisgICAgaWYgKChzID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihsb2dmaWxlKSArIDEpKSkKKyAgICAgIHN0cmNweShzLCBsb2dmaWxlKTsKKyAgc29hcC0+bG9nZmlsZVtpXSA9IHM7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9yZWN2X2xvZ2ZpbGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmxvZ2ZpbGUpCit7IHNvYXBfc2V0X2xvZ2ZpbGUoc29hcCwgU09BUF9JTkRFWF9SRUNWLCBsb2dmaWxlKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X3NlbnRfbG9nZmlsZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbG9nZmlsZSkKK3sgc29hcF9zZXRfbG9nZmlsZShzb2FwLCBTT0FQX0lOREVYX1NFTlQsIGxvZ2ZpbGUpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfdGVzdF9sb2dmaWxlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpsb2dmaWxlKQoreyBzb2FwX3NldF9sb2dmaWxlKHNvYXAsIFNPQVBfSU5ERVhfVEVTVCwgbG9nZmlsZSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcCoKK1NPQVBfRk1BQzIKK3NvYXBfY29weShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmV0dXJuIHNvYXBfY29weV9jb250ZXh0KChzdHJ1Y3Qgc29hcCopbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc29hcCkpLCBzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwKgorU09BUF9GTUFDMgorc29hcF9jb3B5X2NvbnRleHQoc3RydWN0IHNvYXAgKmNvcHksIHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcF9jaGVja19zdGF0ZShzb2FwKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKGNvcHkpCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGx1Z2luICpwOworICAgIG1lbWNweShjb3B5LCBzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXApKTsKKyAgICBjb3B5LT5zdGF0ZSA9IFNPQVBfQ09QWTsKKyAgICBjb3B5LT51c2VyID0gTlVMTDsKKyAgICBjb3B5LT5lcnJvciA9IFNPQVBfT0s7CisgICAgY29weS0+dXNlcmlkID0gTlVMTDsKKyAgICBjb3B5LT5wYXNzd2QgPSBOVUxMOworICAgIGNvcHktPm5saXN0ID0gTlVMTDsKKyAgICBjb3B5LT5ibGlzdCA9IE5VTEw7CisgICAgY29weS0+Y2xpc3QgPSBOVUxMOworICAgIGNvcHktPmFsaXN0ID0gTlVMTDsKKyAgICBjb3B5LT5hdHRyaWJ1dGVzID0gTlVMTDsKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgICBjb3B5LT5sYWJidWYgPSBOVUxMOworICAgIGNvcHktPmxhYmxlbiA9IDA7CisgICAgY29weS0+bGFiaWR4ID0gMDsKKyNlbmRpZgorI2lmZGVmIFNPQVBfREVCVUcKKyAgICBzb2FwX2luaXRfbWh0KGNvcHkpOworI2VuZGlmCisgICAgY29weS0+bG9jYWxfbmFtZXNwYWNlcyA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICAgIHNvYXBfaW5pdF9paHQoY29weSk7CisgICAgc29hcF9pbml0X3BodChjb3B5KTsKKyNlbmRpZgorICAgIGNvcHktPmhlYWRlciA9IE5VTEw7CisgICAgY29weS0+ZmF1bHQgPSBOVUxMOworICAgIGNvcHktPmFjdGlvbiA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorI2lmZGVmIFdJVEhfQ09PS0lFUworICAgIGNvcHktPmNvb2tpZXMgPSBzb2FwX2NvcHlfY29va2llcyhjb3B5KTsKKyNlbHNlCisgICAgY29weS0+Y29va2llcyA9IE5VTEw7CisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIFNPQVBfREVCVUcKKyAgICBzb2FwX2luaXRfbG9ncyhjb3B5KTsKKyAgICBzb2FwX3NldF9yZWN2X2xvZ2ZpbGUoY29weSwgc29hcC0+bG9nZmlsZVtTT0FQX0lOREVYX1JFQ1ZdKTsKKyAgICBzb2FwX3NldF9zZW50X2xvZ2ZpbGUoY29weSwgc29hcC0+bG9nZmlsZVtTT0FQX0lOREVYX1NFTlRdKTsKKyAgICBzb2FwX3NldF90ZXN0X2xvZ2ZpbGUoY29weSwgc29hcC0+bG9nZmlsZVtTT0FQX0lOREVYX1RFU1RdKTsKKyNlbmRpZgorICAgIGNvcHktPnBsdWdpbnMgPSBOVUxMOworICAgIGZvciAocCA9IHNvYXAtPnBsdWdpbnM7IHA7IHAgPSBwLT5uZXh0KQorICAgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGx1Z2luICpxID0gKHN0cnVjdCBzb2FwX3BsdWdpbiopU09BUF9NQUxMT0MoY29weSwgc2l6ZW9mKHN0cnVjdCBzb2FwX3BsdWdpbikpOworICAgICAgaWYgKCFxKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weWluZyBwbHVnaW4gJyVzJ1xuIiwgcC0+aWQpKTsKKyAgICAgICpxID0gKnA7CisgICAgICBpZiAocC0+ZmNvcHkgJiYgKHNvYXAtPmVycm9yID0gcC0+ZmNvcHkoY29weSwgcSwgcCkpKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBjb3B5IHBsdWdpbiAnJXMnXG4iLCBwLT5pZCkpOworICAgICAgICBTT0FQX0ZSRUUoY29weSwgcSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgcS0+bmV4dCA9IGNvcHktPnBsdWdpbnM7CisgICAgICBjb3B5LT5wbHVnaW5zID0gcTsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgIHJldHVybiBjb3B5OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9pbml0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5zdGF0ZSA9IFNPQVBfSU5JVDsKKyAgc29hcC0+dmVyc2lvbiA9IDA7CisgIHNvYXBfaW1vZGUoc29hcCwgU09BUF9JT19ERUZBVUxUKTsKKyAgc29hcF9vbW9kZShzb2FwLCBTT0FQX0lPX0RFRkFVTFQpOworICBzb2FwLT5wbHVnaW5zID0gTlVMTDsKKyAgc29hcC0+dXNlciA9IE5VTEw7CisgIHNvYXAtPnVzZXJpZCA9IE5VTEw7CisgIHNvYXAtPnBhc3N3ZCA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTk9IVFRQCisgIHNvYXAtPmZwb3N0ID0gaHR0cF9wb3N0OworICBzb2FwLT5mZ2V0ID0gaHR0cF9nZXQ7CisgIHNvYXAtPmZmb3JtID0gTlVMTDsKKyAgc29hcC0+ZnBvc3RoZHIgPSBodHRwX3Bvc3RfaGVhZGVyOworICBzb2FwLT5mcmVzcG9uc2UgPSBodHRwX3Jlc3BvbnNlOworICBzb2FwLT5mcGFyc2UgPSBodHRwX3BhcnNlOworICBzb2FwLT5mcGFyc2VoZHIgPSBodHRwX3BhcnNlX2hlYWRlcjsKKyNlbmRpZgorICBzb2FwLT5mY29ubmVjdCA9IE5VTEw7CisgIHNvYXAtPmZkaXNjb25uZWN0ID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfSVBWNgorICBzb2FwLT5mcmVzb2x2ZSA9IHRjcF9nZXRob3N0OworI2Vsc2UKKyAgc29hcC0+ZnJlc29sdmUgPSBOVUxMOworI2VuZGlmCisgIHNvYXAtPmZhY2NlcHQgPSB0Y3BfYWNjZXB0OworICBzb2FwLT5mb3BlbiA9IHRjcF9jb25uZWN0OworICBzb2FwLT5mY2xvc2UgPSB0Y3BfZGlzY29ubmVjdDsKKyAgc29hcC0+ZmNsb3Nlc29ja2V0ID0gdGNwX2Nsb3Nlc29ja2V0OworICBzb2FwLT5mc2h1dGRvd25zb2NrZXQgPSB0Y3Bfc2h1dGRvd25zb2NrZXQ7CisgIHNvYXAtPmZzZW5kID0gZnNlbmQ7CisgIHNvYXAtPmZyZWN2ID0gZnJlY3Y7CisgIHNvYXAtPmZwb2xsID0gc29hcF9wb2xsOworI2Vsc2UKKyAgc29hcC0+Zm9wZW4gPSBOVUxMOworICBzb2FwLT5mY2xvc2UgPSBOVUxMOworICBzb2FwLT5mcG9sbCA9IE5VTEw7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcC0+ZnByZXBhcmVpbml0ID0gTlVMTDsKKyAgc29hcC0+ZnByZXBhcmVzZW5kID0gTlVMTDsKKyAgc29hcC0+ZnByZXBhcmVyZWN2ID0gTlVMTDsKKyAgc29hcC0+ZnByZXBhcmVmaW5hbCA9IE5VTEw7CisjZW5kaWYKKyAgc29hcC0+ZnNldGVycm9yID0gTlVMTDsKKyAgc29hcC0+Zmlnbm9yZSA9IE5VTEw7CisgIHNvYXAtPmZzZXJ2ZWxvb3AgPSBOVUxMOworICBzb2FwLT5mcGx1Z2luID0gZnBsdWdpbjsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcC0+ZmRpbWVyZWFkb3BlbiA9IE5VTEw7CisgIHNvYXAtPmZkaW1ld3JpdGVvcGVuID0gTlVMTDsKKyAgc29hcC0+ZmRpbWVyZWFkY2xvc2UgPSBOVUxMOworICBzb2FwLT5mZGltZXdyaXRlY2xvc2UgPSBOVUxMOworICBzb2FwLT5mZGltZXJlYWQgPSBOVUxMOworICBzb2FwLT5mZGltZXdyaXRlID0gTlVMTDsKKyNlbmRpZgorICBzb2FwLT5mbG9hdF9mb3JtYXQgPSAiJS44ZyI7IC8qIC44IHByZXNlcnZlcyBzaW5nbGUgRlAgcHJlY2lzaW9uIGFzIG11Y2ggYXMgcG9zc2libGUsIGJ1dCBtaWdodCBub3QgYmUgdmVyeSBlZmZpY2llbnQgKi8KKyAgc29hcC0+ZG91YmxlX2Zvcm1hdCA9ICIlLjE3bGciOyAvKiAuMTcgcHJlc2VydmVzIGRvdWJsZSBGUCBwcmVjaXNpb24gYXMgbXVjaCBhcyBwb3NzaWJsZSwgYnV0IG1pZ2h0IG5vdCBiZSB2ZXJ5IGVmZmljaWVudCAqLworICBzb2FwLT5kaW1lX2lkX2Zvcm1hdCA9ICJjaWQ6aWQlZCI7IC8qIGRlZmF1bHQgRElNRSBpZCBmb3JtYXQgKi8KKyAgc29hcC0+aHR0cF92ZXJzaW9uID0gIjEuMSI7CisgIHNvYXAtPmFjdG9yID0gTlVMTDsKKyAgc29hcC0+bWF4X2tlZXBfYWxpdmUgPSBTT0FQX01BWEtFRVBBTElWRTsKKyAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7CisgIHNvYXAtPnJlY3ZfdGltZW91dCA9IDA7CisgIHNvYXAtPnNlbmRfdGltZW91dCA9IDA7CisgIHNvYXAtPmNvbm5lY3RfdGltZW91dCA9IDA7CisgIHNvYXAtPmFjY2VwdF90aW1lb3V0ID0gMDsKKyAgc29hcC0+c29ja2V0X2ZsYWdzID0gMDsKKyAgc29hcC0+Y29ubmVjdF9mbGFncyA9IDA7CisgIHNvYXAtPmJpbmRfZmxhZ3MgPSAwOworICBzb2FwLT5hY2NlcHRfZmxhZ3MgPSAwOworICBzb2FwLT5pcCA9IDA7CisjaWZkZWYgV0lUSF9GQVNUCisgIHNvYXAtPmxhYmJ1ZiA9IE5VTEw7CisgIHNvYXAtPmxhYmxlbiA9IDA7CisgIHNvYXAtPmxhYmlkeCA9IDA7CisjZW5kaWYKKyAgc29hcC0+ZW5jb2RpbmdTdHlsZSA9IFNPQVBfU1RSX0VPUzsKKyNpZm5kZWYgV0lUSF9OT05BTUVTUEFDRVMKKyAgc29hcC0+bmFtZXNwYWNlcyA9IG5hbWVzcGFjZXM7CisjZWxzZQorICBzb2FwLT5uYW1lc3BhY2VzID0gTlVMTDsKKyNlbmRpZgorICBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzID0gTlVMTDsKKyAgc29hcC0+bmxpc3QgPSBOVUxMOworICBzb2FwLT5ibGlzdCA9IE5VTEw7CisgIHNvYXAtPmNsaXN0ID0gTlVMTDsKKyAgc29hcC0+YWxpc3QgPSBOVUxMOworICBzb2FwLT5hdHRyaWJ1dGVzID0gTlVMTDsKKyAgc29hcC0+aGVhZGVyID0gTlVMTDsKKyAgc29hcC0+ZmF1bHQgPSBOVUxMOworICBzb2FwLT5tYXN0ZXIgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICBzb2FwLT5zb2NrZXQgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICBzb2FwLT5vcyA9IE5VTEw7CisgIHNvYXAtPmlzID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcC0+ZG9tID0gTlVMTDsKKyAgc29hcC0+ZGltZS5saXN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGlzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmxhc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gTlVMTDsKKyAgc29hcC0+bWltZS5zdGFydCA9IE5VTEw7CisgIHNvYXAtPnhsaXN0ID0gTlVMTDsKKyNlbmRpZgorI2lmbmRlZiBVTkRFUl9DRQorICBzb2FwLT5yZWN2ZmQgPSAwOworICBzb2FwLT5zZW5kZmQgPSAxOworI2Vsc2UKKyAgc29hcC0+cmVjdmZkID0gc3RkaW47CisgIHNvYXAtPnNlbmRmZCA9IHN0ZG91dDsKKyNlbmRpZiAKKyAgc29hcC0+aG9zdFswXSA9ICdcMCc7CisgIHNvYXAtPnBvcnQgPSAwOworICBzb2FwLT5hY3Rpb24gPSBOVUxMOworICBzb2FwLT5wcm94eV9ob3N0ID0gTlVMTDsKKyAgc29hcC0+cHJveHlfcG9ydCA9IDgwODA7CisgIHNvYXAtPnByb3h5X3VzZXJpZCA9IE5VTEw7CisgIHNvYXAtPnByb3h5X3Bhc3N3ZCA9IE5VTEw7CisgIHNvYXAtPmF1dGhyZWFsbSA9IE5VTEw7CisgIHNvYXAtPnByb2xvZyA9IE5VTEw7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgIGlmICghc3NsX2luaXRfZG9uZSkKKyAgICBzb2FwX3NzbF9pbml0KCk7CisgIHNvYXAtPmZzc2xhdXRoID0gc3NsX2F1dGhfaW5pdDsKKyAgc29hcC0+ZnNzbHZlcmlmeSA9IHNzbF92ZXJpZnlfY2FsbGJhY2s7CisgIHNvYXAtPmJpbyA9IE5VTEw7CisgIHNvYXAtPnNzbCA9IE5VTEw7CisgIHNvYXAtPmN0eCA9IE5VTEw7CisgIHNvYXAtPnJlcXVpcmVfc2VydmVyX2F1dGggPSAwOworICBzb2FwLT5yZXF1aXJlX2NsaWVudF9hdXRoID0gMDsKKyAgc29hcC0+cnNhID0gMDsKKyAgc29hcC0+a2V5ZmlsZSA9IE5VTEw7CisgIHNvYXAtPnBhc3N3b3JkID0gTlVMTDsKKyAgc29hcC0+ZGhmaWxlID0gTlVMTDsKKyAgc29hcC0+Y2FmaWxlID0gTlVMTDsKKyAgc29hcC0+Y2FwYXRoID0gTlVMTDsKKyAgc29hcC0+Y3JsZmlsZSA9IE5VTEw7CisgIHNvYXAtPnJhbmRmaWxlID0gTlVMTDsKKyAgc29hcC0+c2Vzc2lvbiA9IE5VTEw7CisjZW5kaWYKKyNpZmRlZiBXSVRIX1pMSUIKKyAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9OT05FOworICBzb2FwLT56bGliX2luID0gU09BUF9aTElCX05PTkU7CisgIHNvYXAtPnpsaWJfb3V0ID0gU09BUF9aTElCX05PTkU7CisgIHNvYXAtPmRfc3RyZWFtLnphbGxvYyA9IE5VTEw7CisgIHNvYXAtPmRfc3RyZWFtLnpmcmVlID0gTlVMTDsKKyAgc29hcC0+ZF9zdHJlYW0ub3BhcXVlID0gTlVMTDsKKyAgc29hcC0+el9sZXZlbCA9IDY7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIHNvYXAtPmMxNG5pbmNsdWRlID0gTlVMTDsKKyAgc29hcC0+YzE0bmV4Y2x1ZGUgPSBOVUxMOworICBzb2FwLT5jb29raWVzID0gTlVMTDsKKyAgc29hcC0+Y29va2llX2RvbWFpbiA9IE5VTEw7CisgIHNvYXAtPmNvb2tpZV9wYXRoID0gTlVMTDsKKyAgc29hcC0+Y29va2llX21heCA9IDMyOworI2VuZGlmCisjaWZkZWYgU09BUF9ERUJVRworICBzb2FwX2luaXRfbWh0KHNvYXApOworICBzb2FwX2luaXRfbG9ncyhzb2FwKTsKKyAgc29hcF9zZXRfcmVjdl9sb2dmaWxlKHNvYXAsICJSRUNWLmxvZyIpOworICBzb2FwX3NldF9zZW50X2xvZ2ZpbGUoc29hcCwgIlNFTlQubG9nIik7CisgIHNvYXBfc2V0X3Rlc3RfbG9nZmlsZShzb2FwLCBOVUxMKTsKKyNlbmRpZgorI2lmZGVmIFdNV19SUE1fSU8KKyAgc29hcC0+cnBtcmVxaWQgPSBOVUxMOworI2VuZGlmCisjaWZkZWYgUEFMTQorICBwYWxtTmV0TGliT3BlbigpOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICBzb2FwX2luaXRfaWh0KHNvYXApOworICBzb2FwX2luaXRfcGh0KHNvYXApOworI2VuZGlmCisgIHNvYXBfYmVnaW4oc29hcCk7CisjaWZkZWYgU09BUF9ERUJVRworICBzb2FwX3NldF90ZXN0X2xvZ2ZpbGUoc29hcCwgIlRFU1QubG9nIik7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfaW5pdDEoc3RydWN0IHNvYXAgKnNvYXAsIHNvYXBfbW9kZSBtb2RlKQoreyBzb2FwX2luaXQyKHNvYXAsIG1vZGUsIG1vZGUpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9pbml0MihzdHJ1Y3Qgc29hcCAqc29hcCwgc29hcF9tb2RlIGltb2RlLCBzb2FwX21vZGUgb21vZGUpCit7IHNvYXBfaW5pdChzb2FwKTsKKyAgc29hcF9pbW9kZShzb2FwLCBpbW9kZSk7CisgIHNvYXBfb21vZGUoc29hcCwgb21vZGUpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9iZWdpbihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbml0aWFsaXppbmdcbiIpKTsKKyAgaWYgKCFzb2FwLT5rZWVwX2FsaXZlKQorICB7IHNvYXAtPmJ1ZmxlbiA9IDA7CisgICAgc29hcC0+YnVmaWR4ID0gMDsKKyAgfQorICBzb2FwLT5rZWVwX2FsaXZlID0gKCgoc29hcC0+aW1vZGUgfCBzb2FwLT5vbW9kZSkgJiBTT0FQX0lPX0tFRVBBTElWRSkgIT0gMCk7CisgIHNvYXAtPm51bGwgPSAwOworICBzb2FwLT5wb3NpdGlvbiA9IDA7CisgIHNvYXAtPmVuY29kaW5nID0gMDsKKyAgc29hcC0+bXVzdFVuZGVyc3RhbmQgPSAwOworICBzb2FwLT5tb2RlID0gMDsKKyAgc29hcC0+bnMgPSAwOworICBzb2FwLT5wYXJ0ID0gU09BUF9FTkQ7CisgIHNvYXAtPmFsbG9jZWQgPSAwOworICBzb2FwLT5jb3VudCA9IDA7CisgIHNvYXAtPmxlbmd0aCA9IDA7CisgIHNvYXAtPmNkYXRhID0gMDsKKyAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICBzb2FwLT5wZWVrZWQgPSAwOworICBzb2FwLT5haGVhZCA9IDA7CisgIHNvYXAtPmlkbnVtID0gMDsKKyAgc29hcC0+bGV2ZWwgPSAwOworICBzb2FwLT5lbmRwb2ludFswXSA9ICdcMCc7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXAtPmRpbWUuY2h1bmtzaXplID0gMDsKKyAgc29hcC0+ZGltZS5idWZsZW4gPSAwOworI2VuZGlmCisgIHNvYXBfZnJlZShzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZW5kKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9jbGlzdCAqY3A7CisgIGlmIChzb2FwX2NoZWNrX3N0YXRlKHNvYXApKQorICAgIHJldHVybjsKKyAgc29hcF9mcmVlKHNvYXApOworICBzb2FwX2RlYWxsb2Moc29hcCwgTlVMTCk7CisgIHdoaWxlIChzb2FwLT5jbGlzdCkKKyAgeyBjcCA9IHNvYXAtPmNsaXN0LT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5jbGlzdCk7CisgICAgc29hcC0+Y2xpc3QgPSBjcDsKKyAgfQorICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyNpZmRlZiBTT0FQX0RFQlVHCisgIHNvYXBfY2xvc2VfbG9nZmlsZXMoc29hcCk7CisjZW5kaWYKKyNpZmRlZiBQQUxNCisgIHBhbG1OZXRMaWJDbG9zZSgpOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X25hbWVzcGFjZXMoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBOYW1lc3BhY2UgKnApCit7IHJlZ2lzdGVyIHN0cnVjdCBOYW1lc3BhY2UgKm5zID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlczsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wLCAqbnEsICpucjsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGxldmVsID0gc29hcC0+bGV2ZWw7CisgIHNvYXAtPm5hbWVzcGFjZXMgPSBwOworICBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzID0gTlVMTDsKKyAgc29hcF9zZXRfbG9jYWxfbmFtZXNwYWNlcyhzb2FwKTsKKyAgLyogcmV2ZXJzZSB0aGUgbmFtZXNwYWNlIGxpc3QgKi8KKyAgbnAgPSBzb2FwLT5ubGlzdDsKKyAgc29hcC0+bmxpc3QgPSBOVUxMOworICBpZiAobnApCisgIHsgbnEgPSBucC0+bmV4dDsKKyAgICBucC0+bmV4dCA9IE5VTEw7CisgICAgd2hpbGUgKG5xKQorICAgIHsgbnIgPSBucS0+bmV4dDsKKyAgICAgIG5xLT5uZXh0ID0gbnA7CisgICAgICBucCA9IG5xOworICAgICAgbnEgPSBucjsKKyAgICB9CisgIH0KKyAgLyogdGhlbiBwdXNoIG9uIG5ldyBzdGFjayAqLworICB3aGlsZSAobnApCisgIHsgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKKyAgICBzb2FwLT5sZXZlbCA9IG5wLT5sZXZlbDsgLyogcHJlc2VydmUgZWxlbWVudCBuZXN0aW5nIGxldmVsICovCisgICAgcyA9IG5wLT5uczsKKyAgICBpZiAoIXMgJiYgbnAtPmluZGV4ID49IDAgJiYgbnMpCisgICAgeyBzID0gbnNbbnAtPmluZGV4XS5vdXQ7CisgICAgICBpZiAoIXMpCisgICAgICAgIHMgPSBuc1tucC0+aW5kZXhdLm5zOworICAgIH0KKyAgICBpZiAocyAmJiBzb2FwX3B1c2hfbmFtZXNwYWNlKHNvYXAsIG5wLT5pZCwgcykpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgbnEgPSBucDsKKyAgICBucCA9IG5wLT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBucSk7CisgIH0KKyAgaWYgKG5zKQorICB7IHJlZ2lzdGVyIGludCBpOworICAgIGZvciAoaSA9IDA7IG5zW2ldLmlkOyBpKyspCisgICAgeyBpZiAobnNbaV0ub3V0KQorICAgICAgeyBTT0FQX0ZSRUUoc29hcCwgbnNbaV0ub3V0KTsKKyAgICAgICAgbnNbaV0ub3V0ID0gTlVMTDsKKyAgICAgIH0KKyAgICB9CisgICAgU09BUF9GUkVFKHNvYXAsIG5zKTsKKyAgfQorICBzb2FwLT5sZXZlbCA9IGxldmVsOyAvKiByZXN0b3JlIGxldmVsICovCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfbG9jYWxfbmFtZXNwYWNlcyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXAtPm5hbWVzcGFjZXMgJiYgIXNvYXAtPmxvY2FsX25hbWVzcGFjZXMpCisgIHsgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IE5hbWVzcGFjZSAqbnMxOworICAgIHJlZ2lzdGVyIHN0cnVjdCBOYW1lc3BhY2UgKm5zMjsKKyAgICByZWdpc3RlciBzaXplX3QgbiA9IDE7CisgICAgZm9yIChuczEgPSBzb2FwLT5uYW1lc3BhY2VzOyBuczEtPmlkOyBuczErKykKKyAgICAgIG4rKzsKKyAgICBuICo9IHNpemVvZihzdHJ1Y3QgTmFtZXNwYWNlKTsKKyAgICBuczIgPSAoc3RydWN0IE5hbWVzcGFjZSopU09BUF9NQUxMT0Moc29hcCwgbik7CisgICAgaWYgKG5zMikKKyAgICB7IG1lbWNweShuczIsIHNvYXAtPm5hbWVzcGFjZXMsIG4pOworICAgICAgaWYgKG5zMlswXS5ucykKKyAgICAgIHsgaWYgKCFzdHJjbXAobnMyWzBdLm5zLCBzb2FwX2VudjEpKQorICAgICAgICAgIHNvYXAtPnZlcnNpb24gPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgc29hcC0+dmVyc2lvbiA9IDI7CisgICAgICB9CisgICAgICBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzID0gbnMyOworICAgIH0KKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIgKgorU09BUF9GTUFDMgorc29hcF9zdHJzZWFyY2goY29uc3QgY2hhciAqYmlnLCBjb25zdCBjaGFyICpsaXR0bGUpCit7IHNpemVfdCBuID0gc3RybGVuKGxpdHRsZSk7CisgIGNvbnN0IGNoYXIgKnMgPSBiaWc7CisgIHdoaWxlIChzKSAKKyAgeyBpZiAoIXN0cm5jbXAocywgbGl0dGxlLCBuKSAmJiAoc1tuXSA9PSAnXDAnIHx8IHNbbl0gPT0gJyAnKSkKKyAgICAgIHJldHVybiBzOworICAgIHMgPSBzdHJjaHIocywgJyAnKTsKKyAgICBpZiAocykKKyAgICAgIHMrKzsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIHN0cnVjdCBzb2FwX25saXN0ICoKK3NvYXBfbG9va3VwX25zKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHNpemVfdCBuKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnA7CisgIGZvciAobnAgPSBzb2FwLT5ubGlzdDsgbnA7IG5wID0gbnAtPm5leHQpCisgIHsgaWYgKCFzdHJuY21wKG5wLT5pZCwgdGFnLCBuKSAmJiAhbnAtPmlkW25dKQorICAgICAgcmV0dXJuIG5wOworICB9CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIHN0cnVjdCBzb2FwX25saXN0ICoKK3NvYXBfcHVzaF9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKm5zLCBzaG9ydCB1dGlsaXplZCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wOworICBzaXplX3QgbiwgazsKKyAgaWYgKHNvYXBfc3Ryc2VhcmNoKHNvYXAtPmMxNG5leGNsdWRlLCBpZCkpCisgICAgcmV0dXJuIE5VTEw7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUHVzaCBuYW1lc3BhY2UgYmluZGluZyAobGV2ZWw9JXUpICclcycgJyVzJ1xuIiwgc29hcC0+bGV2ZWwsIGlkLCBucz9uczoiIikpOworICBpZiAoIXV0aWxpemVkKQorICB7IGZvciAobnAgPSBzb2FwLT5ubGlzdDsgbnA7IG5wID0gbnAtPm5leHQpCisgICAgeyBpZiAoIXN0cmNtcChucC0+aWQsIGlkKSAmJiAoIW5wLT5ucyB8fCAhc3RyY21wKG5wLT5ucywgbnMpKSkKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChucCkKKyAgICB7IGlmIChucC0+aW5kZXggPT0gMSkKKyAgICAgICAgdXRpbGl6ZWQgPSBucC0+aW5kZXg7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgfQorICBuID0gc3RybGVuKGlkKTsKKyAgaWYgKG5zKQorICAgIGsgPSBzdHJsZW4obnMpOworICBlbHNlCisgICAgayA9IDA7CisgIG5wID0gKHN0cnVjdCBzb2FwX25saXN0KilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfbmxpc3QpICsgbiArIGsgKyAxKTsKKyAgaWYgKCFucCkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHJldHVybiBOVUxMOworICB9CisgIG5wLT5uZXh0ID0gc29hcC0+bmxpc3Q7CisgIHNvYXAtPm5saXN0ID0gbnA7CisgIHN0cmNweShucC0+aWQsIGlkKTsKKyAgaWYgKG5zKQorICB7IG5wLT5ucyA9IG5wLT5pZCArIG4gKyAxOworICAgIHN0cmNweShucC0+bnMsIG5zKTsKKyAgfQorICBlbHNlCisgICAgbnAtPm5zID0gTlVMTDsKKyAgbnAtPmxldmVsID0gc29hcC0+bGV2ZWw7CisgIG5wLT5pbmRleCA9IHV0aWxpemVkOworICByZXR1cm4gbnA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgdm9pZAorc29hcF91dGlsaXplX25zKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHNpemVfdCBuKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnAgPSBzb2FwX2xvb2t1cF9ucyhzb2FwLCB0YWcsIG4pOworICBpZiAobnApCisgIHsgaWYgKG5wLT5pbmRleCA9PSAwKQorICAgICAgc29hcF9wdXNoX25zKHNvYXAsIG5wLT5pZCwgbnAtPm5zLCAxKTsKKyAgfQorICBlbHNlCisgIHsgc3RybmNweShzb2FwLT50bXBidWYsIHRhZywgbik7CisgICAgc29hcC0+dG1wYnVmW25dID0gJ1wwJzsKKyAgICBzb2FwX3B1c2hfbnMoc29hcCwgc29hcC0+dG1wYnVmLCBOVUxMLCAxKTsKKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIHZvaWQKK3NvYXBfcG9wX25zKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwX3BvcF9uYW1lc3BhY2Uoc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnR5cGUpCit7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRWxlbWVudCBiZWdpbiB0YWc9JyVzJyBpZD0nJWQnIHR5cGU9JyVzJ1xuIiwgdGFnLCBpZCwgdHlwZT90eXBlOiIiKSk7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKmVsdCA9IChzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50KSk7CisgICAgaWYgKCFlbHQpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICBlbHQtPnNvYXAgPSBzb2FwOworICAgIGVsdC0+bmV4dCA9IE5VTEw7CisgICAgZWx0LT5wcm50ID0gc29hcC0+ZG9tOworICAgIGVsdC0+bmFtZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHRhZyk7CisgICAgZWx0LT5lbHRzID0gTlVMTDsKKyAgICBlbHQtPmF0dHMgPSBOVUxMOworICAgIGVsdC0+bnN0ciA9IE5VTEw7CisgICAgZWx0LT5kYXRhID0gTlVMTDsKKyAgICBlbHQtPndpZGUgPSBOVUxMOworICAgIGVsdC0+bm9kZSA9IE5VTEw7CisgICAgZWx0LT50eXBlID0gMDsKKyAgICBlbHQtPmhlYWQgPSBOVUxMOworICAgIGVsdC0+dGFpbCA9IE5VTEw7CisgICAgaWYgKHNvYXAtPmRvbSkKKyAgICB7IHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICpwID0gc29hcC0+ZG9tLT5lbHRzOworICAgICAgaWYgKHApCisgICAgICB7IHdoaWxlIChwLT5uZXh0KQorICAgICAgICAgIHAgPSBwLT5uZXh0OworICAgICAgICBwLT5uZXh0ID0gZWx0OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBzb2FwLT5kb20tPmVsdHMgPSBlbHQ7CisgICAgfQorICAgIHNvYXAtPmRvbSA9IGVsdDsKKyAgfQorICBlbHNlCisgIHsKKyNlbmRpZgorICAgIHNvYXAtPmxldmVsKys7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmICghc29hcC0+bnMpCisgICAgeyBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICAgICAgICYmIHNvYXBfc2VuZChzb2FwLCBzb2FwLT5wcm9sb2cgPyBzb2FwLT5wcm9sb2cgOiAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBlbHNlIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfSU5ERU5UKQorICAgIHsgaWYgKHNvYXAtPm5zID09IDEgJiYgc29hcF9zZW5kX3Jhdyhzb2FwLCBzb2FwX2luZGVudCwgc29hcC0+bGV2ZWwgPCBzaXplb2Yoc29hcF9pbmRlbnQpID8gc29hcC0+bGV2ZWwgOiBzaXplb2Yoc29hcF9pbmRlbnQpIC0gMSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHNvYXAtPmJvZHkgPSAxOworICAgIH0KKyNlbmRpZgorICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsICI8IiwgMSkKKyAgICAgfHwgc29hcF9zZW5kKHNvYXAsIHRhZykpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjaWZkZWYgV0lUSF9ET00KKyAgfQorI2VuZGlmCisgIGlmICghc29hcC0+bnMpCisgIHsgc3RydWN0IE5hbWVzcGFjZSAqbnM7CisgICAgZm9yIChucyA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXM7IG5zICYmIG5zLT5pZDsgbnMrKykKKyAgICB7IGlmICgqbnMtPmlkICYmIChucy0+b3V0IHx8IG5zLT5ucykpCisgICAgICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAieG1sbnM6JXMiLCBucy0+aWQpOworICAgICAgICBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgc29hcC0+dG1wYnVmLCBucy0+b3V0ID8gbnMtPm91dCA6IG5zLT5ucykpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgIH0gICAKKyAgfQorICBzb2FwLT5ucyA9IDE7IC8qIHN0YXJ0IHdpdGggMCBvciAyLCBidXQgc2hvdWxkIGJlIG9uZSB0byBjb250aW51ZSAqLworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgIHsgY29uc3QgY2hhciAqcyA9IHN0cmNocih0YWcsICc6Jyk7CisgICAgaWYgKHMpCisgICAgICBzb2FwX3V0aWxpemVfbnMoc29hcCwgdGFnLCBzIC0gdGFnKTsKKyAgfQorI2VuZGlmCisgIGlmIChpZCA+IDApCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJfJWQiLCBpZCk7CisgICAgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJpZCIsIHNvYXAtPnRtcGJ1ZikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHR5cGUgJiYgKnR5cGUpCisgIHsgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJ4c2k6dHlwZSIsIHR5cGUpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgICB7IGNvbnN0IGNoYXIgKnMgPSBzdHJjaHIodHlwZSwgJzonKTsKKyAgICAgIGlmIChzKQorICAgICAgICBzb2FwX3V0aWxpemVfbnMoc29hcCwgdHlwZSwgcyAtIHR5cGUpOworICAgIH0KKyNlbmRpZgorICB9CisgIGlmIChzb2FwLT5udWxsICYmIHNvYXAtPnBvc2l0aW9uID4gMCkKKyAgeyBpbnQgaTsKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIlslZCIsIHNvYXAtPnBvc2l0aW9uc1swXSk7CisgICAgZm9yIChpID0gMTsgaSA8IHNvYXAtPnBvc2l0aW9uOyBpKyspCisgICAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIHN0cmxlbihzb2FwLT50bXBidWYpLCAiLCVkIiwgc29hcC0+cG9zaXRpb25zW2ldKTsKKyAgICBzdHJjYXQoc29hcC0+dG1wYnVmLCAiXSIpOworICAgIGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAiU09BUC1FTkM6cG9zaXRpb24iLCBzb2FwLT50bXBidWYpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmIChzb2FwLT5tdXN0VW5kZXJzdGFuZCkKKyAgeyBpZiAoc29hcC0+YWN0b3IgJiYgKnNvYXAtPmFjdG9yKQorICAgIHsgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsIHNvYXAtPnZlcnNpb24gPT0gMiA/ICJTT0FQLUVOVjpyb2xlIiA6ICJTT0FQLUVOVjphY3RvciIsIHNvYXAtPmFjdG9yKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgIlNPQVAtRU5WOm11c3RVbmRlcnN0YW5kIiwgc29hcC0+dmVyc2lvbiA9PSAyID8gInRydWUiIDogIjEiKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBzb2FwLT5tdXN0VW5kZXJzdGFuZCA9IDA7CisgIH0KKyAgaWYgKHNvYXAtPmVuY29kaW5nKQorICB7IGlmIChzb2FwLT5lbmNvZGluZ1N0eWxlICYmIHNvYXAtPmxvY2FsX25hbWVzcGFjZXMpCisgICAgeyBpZiAoISpzb2FwLT5lbmNvZGluZ1N0eWxlKQorICAgICAgeyBpZiAoc29hcC0+bG9jYWxfbmFtZXNwYWNlc1sxXS5vdXQpCisgICAgICAgICAgc29hcC0+ZW5jb2RpbmdTdHlsZSA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbMV0ub3V0OworICAgICAgICBlbHNlCisgICAgICAgICAgc29hcC0+ZW5jb2RpbmdTdHlsZSA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbMV0ubnM7CisgICAgICB9CisgICAgICBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgIlNPQVAtRU5WOmVuY29kaW5nU3R5bGUiLCBzb2FwLT5lbmNvZGluZ1N0eWxlKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBzb2FwLT5lbmNvZGluZyA9IDA7CisgIH0KKyAgc29hcC0+bnVsbCA9IDA7CisgIHNvYXAtPnBvc2l0aW9uID0gMDsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9iZWdpbl9vdXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICp0eXBlKQoreyBpZiAoKnRhZyA9PSAnLScpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIGlmIChzb2FwX2VsZW1lbnQoc29hcCwgdGFnLCBpZCwgdHlwZSkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X3N0YXJ0X2VuZF9vdXQoc29hcCwgTlVMTCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCisjaWZuZGVmIEhBVkVfU1RSUkNIUgorU09BUF9GTUFDMQorY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfc3RycmNocihjb25zdCBjaGFyICpzLCBpbnQgdCkKK3sgcmVnaXN0ZXIgY2hhciAqciA9IE5VTEw7CisgIHdoaWxlICgqcykKKyAgICBpZiAoKnMrKyA9PSB0KQorICAgICAgciA9IChjaGFyKilzIC0gMTsKKyAgcmV0dXJuIHI7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKKyNpZm5kZWYgSEFWRV9TVFJUT0wKK1NPQVBfRk1BQzEKK2xvbmcKK1NPQVBfRk1BQzIKK3NvYXBfc3RydG9sKGNvbnN0IGNoYXIgKnMsIGNoYXIgKip0LCBpbnQgYikKK3sgcmVnaXN0ZXIgbG9uZyBuID0gMDsKKyAgcmVnaXN0ZXIgaW50IGM7CisgIHdoaWxlICgqcyA+IDAgJiYgKnMgPD0gMzIpCisgICAgcysrOworICBpZiAoYiA9PSAxMCkKKyAgeyBzaG9ydCBuZWcgPSAwOworICAgIGlmICgqcyA9PSAnLScpCisgICAgeyBzKys7CisgICAgICBuZWcgPSAxOworICAgIH0KKyAgICBlbHNlIGlmICgqcyA9PSAnKycpCisgICAgICBzKys7CisgICAgd2hpbGUgKChjID0gKnMpICYmIGMgPj0gJzAnICYmIGMgPD0gJzknKQorICAgIHsgaWYgKG4gPj0gMjE0NzQ4MzY0ICYmIChuID4gMjE0NzQ4MzY0IHx8IGMgPj0gJzgnKSkKKyAgICAgICAgYnJlYWs7CisgICAgICBuICo9IDEwOworICAgICAgbiArPSBjIC0gJzAnOworICAgICAgcysrOworICAgIH0KKyAgICBpZiAobmVnKQorICAgICAgbiA9IC1uOworICB9CisgIGVsc2UgLyogYiA9PSAxNiBhbmQgdmFsdWUgaXMgYWx3YXlzIHBvc2l0aXZlICovCisgIHsgd2hpbGUgKChjID0gKnMpKQorICAgIHsgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQorICAgICAgICBjIC09ICcwJzsKKyAgICAgIGVsc2UgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKQorICAgICAgICBjIC09ICdBJyAtIDEwOworICAgICAgZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCisgICAgICAgIGMgLT0gJ2EnIC0gMTA7CisgICAgICBpZiAobiA+IDB4MDdGRkZGRkYpCisgICAgICAgIGJyZWFrOworICAgICAgbiA8PD0gNDsKKyAgICAgIG4gKz0gYzsKKyAgICAgIHMrKzsKKyAgICB9CisgIH0KKyAgaWYgKHQpCisgICAgKnQgPSAoY2hhciopczsKKyAgcmV0dXJuIG47Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKKyNpZm5kZWYgSEFWRV9TVFJUT1VMCitTT0FQX0ZNQUMxCit1bnNpZ25lZCBsb25nCitTT0FQX0ZNQUMyCitzb2FwX3N0cnRvdWwoY29uc3QgY2hhciAqcywgY2hhciAqKnQsIGludCBiKQoreyB1bnNpZ25lZCBsb25nIG4gPSAwOworICByZWdpc3RlciBpbnQgYzsKKyAgd2hpbGUgKCpzID4gMCAmJiAqcyA8PSAzMikKKyAgICBzKys7CisgIGlmIChiID09IDEwKQorICB7IGlmICgqcyA9PSAnKycpCisgICAgICBzKys7CisgICAgd2hpbGUgKChjID0gKnMpICYmIGMgPj0gJzAnICYmIGMgPD0gJzknKQorICAgIHsgaWYgKG4gPj0gNDI5NDk2NzI5ICYmIChuID4gNDI5NDk2NzI5IHx8IGMgPj0gJzYnKSkKKyAgICAgICAgYnJlYWs7CisgICAgICBuICo9IDEwOworICAgICAgbiArPSBjIC0gJzAnOworICAgICAgcysrOworICAgIH0KKyAgfQorICBlbHNlIC8qIGIgPT0gMTYgKi8KKyAgeyB3aGlsZSAoKGMgPSAqcykpCisgICAgeyBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCisgICAgICAgIGMgLT0gJzAnOworICAgICAgZWxzZSBpZiAoYyA+PSAnQScgJiYgYyA8PSAnRicpCisgICAgICAgIGMgLT0gJ0EnIC0gMTA7CisgICAgICBlbHNlIGlmIChjID49ICdhJyAmJiBjIDw9ICdmJykKKyAgICAgICAgYyAtPSAnYScgLSAxMDsKKyAgICAgIGlmIChuID4gMHgwRkZGRkZGRikKKyAgICAgICAgYnJlYWs7CisgICAgICBuIDw8PSA0OworICAgICAgbiArPSBjOworICAgICAgcysrOworICAgIH0KKyAgfQorICBpZiAodCkKKyAgICAqdCA9IChjaGFyKilzOworICByZXR1cm4gbjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2FycmF5X2JlZ2luX291dChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKm9mZnNldCkKK3sgaWYgKHNvYXBfZWxlbWVudChzb2FwLCB0YWcsIGlkLCAiU09BUC1FTkM6QXJyYXkiKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgIHsgY29uc3QgY2hhciAqczsKKyAgICBzID0gc29hcF9zdHJyY2hyKHR5cGUsICdbJyk7CisgICAgaWYgKChzaXplX3QpKHMgLSB0eXBlKSA8IHNpemVvZihzb2FwLT50bXBidWYpKQorICAgIHsgc3RybmNweShzb2FwLT50bXBidWYsIHR5cGUsIHMgLSB0eXBlKTsKKyAgICAgIHNvYXAtPnRtcGJ1ZltzIC0gdHlwZV0gPSAnXDAnOworICAgICAgaWYgKHR5cGUgJiYgKnR5cGUgJiYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJTT0FQLUVOQzppdGVtVHlwZSIsIHNvYXAtPnRtcGJ1ZikpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBpZiAocyAmJiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgIlNPQVAtRU5DOmFycmF5U2l6ZSIsIHMgKyAxKSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7IGlmIChvZmZzZXQgJiYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJTT0FQLUVOQzpvZmZzZXQiLCBvZmZzZXQpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAodHlwZSAmJiAqdHlwZSAmJiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgIlNPQVAtRU5DOmFycmF5VHlwZSIsIHR5cGUpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHR5cGUgJiYgKnR5cGUgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpKQorICB7IGNvbnN0IGNoYXIgKnMgPSBzdHJjaHIodHlwZSwgJzonKTsKKyAgICBpZiAocykKKyAgICAgIHNvYXBfdXRpbGl6ZV9ucyhzb2FwLCB0eXBlLCBzIC0gdHlwZSk7CisgIH0KKyNlbmRpZgorICByZXR1cm4gc29hcF9lbGVtZW50X3N0YXJ0X2VuZF9vdXQoc29hcCwgTlVMTCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqdHA7CisjaWZkZWYgV0lUSF9ET00KKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAqKmF0dDsKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgYXR0ID0gJnNvYXAtPmRvbS0+YXR0czsKKyAgICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgICAgeyBpZiAodHAtPnZpc2libGUpCisgICAgICB7ICphdHQgPSAoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUpKTsKKwlpZiAoISphdHQpCisJICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKwkoKmF0dCktPm5leHQgPSBOVUxMOworICAgICAgICAoKmF0dCktPm5zdHIgPSBOVUxMOworICAgICAgICAoKmF0dCktPm5hbWUgPSBzb2FwX3N0cmR1cChzb2FwLCB0cC0+bmFtZSk7CisgICAgICAgICgqYXR0KS0+ZGF0YSA9IHNvYXBfc3RyZHVwKHNvYXAsIHRwLT52YWx1ZSk7CisgICAgICAgICgqYXR0KS0+d2lkZSA9IE5VTEw7CisgICAgICAgICgqYXR0KS0+c29hcCA9IHNvYXA7CisgICAgICAgIHRwLT52aXNpYmxlID0gMDsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgIHsgc3RydWN0IHNvYXBfbmxpc3QgKm5wOworICAgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgICB7IGlmICh0cC0+dmlzaWJsZSAmJiB0cC0+bmFtZSkKKyAgICAgIHsgY29uc3QgY2hhciAqcyA9IHN0cmNocih0cC0+bmFtZSwgJzonKTsKKyAgICAgICAgaWYgKHMpCisgICAgICAgICAgc29hcF91dGlsaXplX25zKHNvYXAsIHRwLT5uYW1lLCBzIC0gdHAtPm5hbWUpOworICAgICAgfQorICAgIH0KKyAgICBmb3IgKG5wID0gc29hcC0+bmxpc3Q7IG5wOyBucCA9IG5wLT5uZXh0KQorICAgIHsgaWYgKG5wLT5pbmRleCA9PSAxICYmIG5wLT5ucykKKyAgICAgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJ4bWxuczolcyIsIG5wLT5pZCk7CisgICAgICAgIHNvYXBfc2V0X2F0dHIoc29hcCwgc29hcC0+dG1wYnVmLCBucC0+bnMpOworICAgICAgICBucC0+aW5kZXggPSAyOworICAgICAgfQorICAgIH0KKyAgfQorI2VuZGlmCisgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgeyBpZiAodHAtPnZpc2libGUpCisgICAgeyBpZiAoc29hcF9zZW5kKHNvYXAsICIgIikgfHwgc29hcF9zZW5kKHNvYXAsIHRwLT5uYW1lKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgaWYgKHRwLT52aXNpYmxlID09IDIgJiYgdHAtPnZhbHVlKQorICAgICAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAiPVwiIiwgMikKKwkgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHRwLT52YWx1ZSwgMSkKKwkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiXCIiLCAxKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB0cC0+dmlzaWJsZSA9IDA7CisgICAgfQorICB9CisgIGlmICh0YWcpCisgIHsgCisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICAgIHsgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgIj4iLCAxKQorICAgICAgIHx8IHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZykpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgc29hcC0+bGV2ZWwtLTsJLyogZGVjcmVtZW50IGxldmVsIGp1c3QgYmVmb3JlIC8+ICovCisgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgIi8+IiwgMikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgIj4iLCAxKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X2VuZF9vdXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZykKK3sgaWYgKCp0YWcgPT0gJy0nKQorICAgIHJldHVybiBTT0FQX09LOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVsZW1lbnQgZW5kaW5nIHRhZz0nJXMnXG4iLCB0YWcpKTsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBpZiAoc29hcC0+ZG9tLT5wcm50KQorICAgICAgc29hcC0+ZG9tID0gc29hcC0+ZG9tLT5wcm50OworICAgIHJldHVybiBTT0FQX09LOworICB9CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICAgIHNvYXBfcG9wX25zKHNvYXApOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0lOREVOVCkKKyAgeyBpZiAoIXNvYXAtPmJvZHkpCisgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzb2FwX2luZGVudCwgc29hcC0+bGV2ZWwgPCBzaXplb2Yoc29hcF9pbmRlbnQpID8gc29hcC0+bGV2ZWwgOiBzaXplb2Yoc29hcF9pbmRlbnQpIC0gMSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgc29hcC0+Ym9keSA9IDA7CisgIH0KKyNlbmRpZgorICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAiPC8iLCAyKQorICAgfHwgc29hcF9zZW5kKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBzb2FwLT5sZXZlbC0tOwkvKiBkZWNyZW1lbnQgbGV2ZWwganVzdCBiZWZvcmUgPiAqLworICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCAiPiIsIDEpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfcmVmKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgaW50IGhyZWYpCit7IHJlZ2lzdGVyIGludCBuID0gMDsKKyAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgICBuID0gMTsKKyAgc3ByaW50Zihzb2FwLT5ocmVmLCAiI18lZCIsIGhyZWYpOworICByZXR1cm4gc29hcF9lbGVtZW50X2hyZWYoc29hcCwgdGFnLCBpZCwgImhyZWYiICsgbiwgc29hcC0+aHJlZiArIG4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfaHJlZihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnJlZiwgY29uc3QgY2hhciAqdmFsKQoreyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVsZW1lbnQgJyVzJyByZWZlcmVuY2UgJXM9JyVzJ1xuIiwgdGFnLCByZWYsIHZhbCkpOworICBpZiAoc29hcF9lbGVtZW50KHNvYXAsIHRhZywgaWQsIE5VTEwpCisgICB8fCBzb2FwX2F0dHJpYnV0ZShzb2FwLCByZWYsIHZhbCkKKyAgIHx8IHNvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHNvYXAsIHRhZykpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X251bGwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICp0eXBlKQoreyBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKnRwOworICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgICAgaWYgKHRwLT52aXNpYmxlKQorICAgICAgYnJlYWs7CisgIGlmICh0cCB8fCAoc29hcC0+dmVyc2lvbiA9PSAyICYmIHNvYXAtPnBvc2l0aW9uID4gMCkgfHwgaWQgPiAwIHx8IChzb2FwLT5tb2RlICYgU09BUF9YTUxfTklMKSkKKyAgeyBpZiAoc29hcF9lbGVtZW50KHNvYXAsIHRhZywgaWQsIHR5cGUpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmIChzb2FwLT5wYXJ0ICE9IFNPQVBfSU5fSEVBREVSICYmIHNvYXAtPmVuY29kaW5nU3R5bGUpCisgICAgICBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgInhzaTpuaWwiLCAidHJ1ZSIpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgcmV0dXJuIHNvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHNvYXAsIHRhZyk7CisgIH0KKyAgc29hcC0+bnVsbCA9IDE7CisgIHNvYXAtPnBvc2l0aW9uID0gMDsKKyAgc29hcC0+bXVzdFVuZGVyc3RhbmQgPSAwOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X2lkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgdm9pZCAqcCwgY29uc3Qgc3RydWN0IHNvYXBfYXJyYXkgKmEsIGludCBuLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkgCit7IGlmICghcCB8fCAoYSAmJiAhYS0+X19wdHIpKQorICB7IHNvYXBfZWxlbWVudF9udWxsKHNvYXAsIHRhZywgaWQsIHR5cGUpOworICAgIHJldHVybiAtMTsKKyAgfQorI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9UUkVFKQorICAgIHJldHVybiAwOworICBpZiAoaWQgPCAwKQorICB7IHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgICBpZiAoYSkKKyAgICAgIGlkID0gc29hcF9hcnJheV9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCBhLCBuLCB0LCAmcHApOworICAgIGVsc2UKKyAgICAgIGlkID0gc29hcF9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCB0LCAmcHApOworICAgIGlmIChpZCkKKyAgICB7IGlmIChzb2FwX2lzX2VtYmVkZGVkKHNvYXAsIHBwKSkKKyAgICAgIHsgc29hcF9lbGVtZW50X3JlZihzb2FwLCB0YWcsIDAsIGlkKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgaWYgKHNvYXBfaXNfc2luZ2xlKHNvYXAsIHBwKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICBzb2FwX3NldF9lbWJlZGRlZChzb2FwLCBwcCk7CisgICAgfQorICB9CisgIHJldHVybiBpZDsKKyNlbHNlCisgIHJldHVybiAwOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9yZXN1bHQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZykKK3sgaWYgKHNvYXAtPnZlcnNpb24gPT0gMiAmJiBzb2FwLT5lbmNvZGluZ1N0eWxlKQorICAgIGlmIChzb2FwX2VsZW1lbnQoc29hcCwgIlNPQVAtUlBDOnJlc3VsdCIsIDAsIE5VTEwpCisgICAgIHx8IHNvYXBfYXR0cmlidXRlKHNvYXAsICJ4bWxuczpTT0FQLVJQQyIsIHNvYXBfcnBjKQorICAgICB8fCBzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzb2FwLCBOVUxMKQorICAgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgdGFnLCAwKQorICAgICB8fCBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCAiU09BUC1SUEM6cmVzdWx0IikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2F0dHJpYnV0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7IAorI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgKmEgPSAoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUpKTsKKyAgICBhLT5uZXh0ID0gc29hcC0+ZG9tLT5hdHRzOworICAgIGEtPm5zdHIgPSBOVUxMOworICAgIGEtPm5hbWUgPSBzb2FwX3N0cmR1cChzb2FwLCBuYW1lKTsKKyAgICBhLT5kYXRhID0gc29hcF9zdHJkdXAoc29hcCwgdmFsdWUpOworICAgIGEtPndpZGUgPSBOVUxMOworICAgIGEtPnNvYXAgPSBzb2FwOworICAgIHNvYXAtPmRvbS0+YXR0cyA9IGE7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgIHsgLyogVE9ETzogY29uc2lkZXIgdXNpbmcgdGhpcyBjb2RlIHRvIGhhbmRsZSBkZWZhdWx0IG5hbWVzcGFjZQorICAgIGlmICghc3RybmNtcChuYW1lLCAieG1sbnMiLCA1KSAmJiAobmFtZVs1XSA9PSAnOicgfHwgbmFtZVs1XSA9PSAnXDAnKSkKKyAgICB7IGlmIChuYW1lWzVdID09ICc6JykKKyAgICAgICAgc29hcF9wdXNoX25zKHNvYXAsIG5hbWUgKyA2LCB2YWx1ZSwgMCk7CisgICAgICBlbHNlCisgICAgICAgIHNvYXBfcHVzaF9ucyhzb2FwLCAiIiwgdmFsdWUsIDApOworICAgIH0KKyAgICAqLworICAgIGlmICghc3RybmNtcChuYW1lLCAieG1sbnM6IiwgNikpCisgICAgICBzb2FwX3B1c2hfbnMoc29hcCwgbmFtZSArIDYsIHZhbHVlLCAwKTsKKyAgICBlbHNlIGlmIChzb2FwX3NldF9hdHRyKHNvYXAsIG5hbWUsIHZhbHVlKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBlbHNlCisjZW5kaWYKKyAgeyBpZiAoc29hcF9zZW5kKHNvYXAsICIgIikgfHwgc29hcF9zZW5kKHNvYXAsIG5hbWUpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmICh2YWx1ZSkKKyAgICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsICI9XCIiLCAyKQorICAgICAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCB2YWx1ZSwgMSkKKyAgICAgICB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICJcIiIsIDEpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9iZWdpbl9pbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgbmlsbGFibGUpCit7IGlmICghc29hcF9wZWVrX2VsZW1lbnQoc29hcCkpCisgIHsgaWYgKHNvYXAtPm90aGVyKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9UQUdfTUlTTUFUQ0g7CisgICAgaWYgKHRhZyAmJiAqdGFnID09ICctJykKKyAgICAgIHJldHVybiBTT0FQX09LOworICAgIGlmICghKHNvYXAtPmVycm9yID0gc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dGFnLCB0YWcpKSkKKyAgICB7IHNvYXAtPnBlZWtlZCA9IDA7CisgICAgICBpZiAoc29hcC0+Ym9keSkKKyAgICAgICAgc29hcC0+bGV2ZWwrKzsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQmVnaW4gZWxlbWVudCBmb3VuZCAobGV2ZWw9JXUpICclcyc9JyVzJ1xuIiwgc29hcC0+bGV2ZWwsIHNvYXAtPnRhZywgdGFnP3RhZzoiIiApKTsKKyAgICAgIGlmICghbmlsbGFibGUgJiYgc29hcC0+bnVsbCAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTlVMTDsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcgJiYgdGFnICYmICp0YWcgPT0gJy0nKQorICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfZW5kX2luKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcpICAKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICByZWdpc3RlciBjaGFyICpzOworICByZWdpc3RlciBjb25zdCBjaGFyICp0OworICByZWdpc3RlciBpbnQgbiA9IDA7CisgIGlmICh0YWcgJiYgKnRhZyA9PSAnLScpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIHNvYXAtPmxldmVsLS07CisgIHNvYXBfcG9wX25hbWVzcGFjZShzb2FwKTsKKyNpZmRlZiBXSVRIX0RPTQorICAvKiB0aGlzIHdoaXRlc3BhY2Ugb3IgbWl4ZWQgY29udGVudCBpcyBub3QgaW5zaWduaWZpY2FudCBmb3IgRE9NICovCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IGlmICghc29hcC0+cGVla2VkICYmICFzb2FwX3N0cmluZ19pbihzb2FwLCAzLCAtMSwgLTEpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmIChzb2FwLT5kb20tPnBybnQpCisgICAgICBzb2FwLT5kb20gPSBzb2FwLT5kb20tPnBybnQ7CisgIH0KKyNlbmRpZgorICBpZiAoc29hcC0+cGVla2VkKQorICB7IGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgICBpZiAoKnNvYXAtPnRhZykKKyAgICAgIG4rKzsKKyAgICBzb2FwLT5wZWVrZWQgPSAwOworICB9CisgIGRvCisgIHsgd2hpbGUgKCgoYyA9IHNvYXBfZ2V0KHNvYXApKSAhPSBTT0FQX1RUKSkKKyAgICB7IGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAgIGlmIChjID09IFNPQVBfTFQpCisgICAgICAgIG4rKzsKKyAgICAgIGVsc2UgaWYgKGMgPT0gJy8nKQorICAgICAgeyBjID0gc29hcF9nZXQoc29hcCk7CisgICAgICAgIGlmIChjID09IFNPQVBfR1QpCisJICBuLS07CisgICAgICAgIGVsc2UKKwkgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICB9CisgICAgfQorICB9IHdoaWxlIChuLS0pOworICBzID0gc29hcC0+dGFnOworICB3aGlsZSAoc29hcF9ub3RibGFuayhjID0gc29hcF9nZXQoc29hcCkpKQorICAgICpzKysgPSAoY2hhciljOworICAqcyA9ICdcMCc7CisgIGlmICgoaW50KWMgPT0gRU9GKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICB3aGlsZSAoc29hcF9ibGFuayhjKSkKKyAgICBjID0gc29hcF9nZXQoc29hcCk7CisgIGlmIChjICE9IFNPQVBfR1QpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9TWU5UQVhfRVJST1I7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIGVsZW1lbnQgZm91bmQgKGxldmVsPSV1KSAnJXMnPSclcydcbiIsIHNvYXAtPmxldmVsLCBzb2FwLT50YWcsIHRhZz90YWc6IiIpKTsKKyAgaWYgKCF0YWcgfHwgISp0YWcpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIGlmICgocyA9IHN0cmNocihzb2FwLT50YWcsICc6JykpKQorICAgIHMrKzsKKyAgZWxzZQorICAgIHMgPSBzb2FwLT50YWc7CisgIGlmICgodCA9IHN0cmNocih0YWcsICc6JykpKQorICAgIHQrKzsKKyAgZWxzZQorICAgIHQgPSB0YWc7CisgIGlmICghU09BUF9TVFJDTVAocywgdCkpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIGVsZW1lbnQgdGFnIG5hbWUgZG9lcyBub3QgbWF0Y2hcbiIpKTsKKyAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9TWU5UQVhfRVJST1I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfYXR0cl92YWx1ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWcpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqdHA7CisgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgICBpZiAoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCBuYW1lKSkKKyAgICAgIGJyZWFrOworICBpZiAodHAgJiYgdHAtPnZpc2libGUgPT0gMikKKyAgeyBpZiAoZmxhZyA9PSAyICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9QUk9ISUJJVEVEOworICAgIGVsc2UKKyAgICAgIHJldHVybiB0cC0+dmFsdWU7CisgIH0KKyAgZWxzZSBpZiAoZmxhZyA9PSAxICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfUkVRVUlSRUQ7CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NldF9hdHRyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfYXR0cmlidXRlICp0cDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTZXQgYXR0cmlidXRlICVzPSclcydcbiIsIG5hbWUsIHZhbHVlP3ZhbHVlOiIiKSk7CisgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgeyBpZiAoIXN0cmNtcCh0cC0+bmFtZSwgbmFtZSkpCisgICAgICBicmVhazsKKyAgfQorICBpZiAoIXRwKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQWxsb2NhdGUgYXR0cmlidXRlICVzXG4iLCBuYW1lKSk7CisgICAgaWYgKCEodHAgPSAoc3RydWN0IHNvYXBfYXR0cmlidXRlKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfYXR0cmlidXRlKSArIHN0cmxlbihuYW1lKSkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgdHAtPm5zID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgICAgeyBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKip0cHAgPSAmc29hcC0+YXR0cmlidXRlczsKKyAgICAgIGNvbnN0IGNoYXIgKnMgPSBzdHJjaHIobmFtZSwgJzonKTsKKyAgICAgIGlmICghc3RybmNtcChuYW1lLCAieG1sbnMiLCA1KSkKKyAgICAgIHsgZm9yICg7ICp0cHA7IHRwcCA9ICYoKnRwcCktPm5leHQpCisgICAgICAgICAgaWYgKHN0cm5jbXAoKCp0cHApLT5uYW1lLCAieG1sbnMiLCA1KSB8fCBzdHJjbXAoKCp0cHApLT5uYW1lICsgNSwgbmFtZSArIDUpID4gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIXMpCisgICAgICB7IGZvciAoOyAqdHBwOyB0cHAgPSAmKCp0cHApLT5uZXh0KQorICAgICAgICAgIGlmIChzdHJuY21wKCgqdHBwKS0+bmFtZSwgInhtbG5zIiwgNSkgJiYgKCgqdHBwKS0+bnMgfHwgc3RyY21wKCgqdHBwKS0+bmFtZSwgbmFtZSkgPiAwKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBpbnQgazsKKyAgICAgICAgZm9yICg7ICp0cHA7IHRwcCA9ICYoKnRwcCktPm5leHQpCisJeyBpZiAoIXN0cm5jbXAoKCp0cHApLT5uYW1lLCAieG1sbnM6IiwgNikgJiYgIXN0cm5jbXAoKCp0cHApLT5uYW1lICsgNiwgbmFtZSwgcyAtIG5hbWUpICYmICEoKnRwcCktPm5hbWVbNiArIHMgLSBuYW1lXSkKKwkgIHsgaWYgKCF0cC0+bnMpCisgICAgICAgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ2Fub25pY2FsaXphdGlvbjogcHJlZml4ICVzPSVwKCVzKVxuIiwgbmFtZSwgKCp0cHApLT5ucywgKCp0cHApLT5ucykpOworCSAgICAgIHRwLT5ucyA9ICgqdHBwKS0+bnM7CisJICAgIH0KKwkgIH0KKyAgICAgICAgICBlbHNlIGlmIChzdHJuY21wKCgqdHBwKS0+bmFtZSwgInhtbG5zIiwgNSkgJiYgKCp0cHApLT5ucyAmJiB0cC0+bnMgJiYgKChrID0gc3RyY21wKCgqdHBwKS0+bnMsIHRwLT5ucykpID4gMCB8fCAoIWsgJiYgc3RyY21wKCgqdHBwKS0+bmFtZSwgbmFtZSkgPiAwKSkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgdHAtPm5leHQgPSAqdHBwOworICAgICAgKnRwcCA9IHRwOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7IHRwLT5uZXh0ID0gc29hcC0+YXR0cmlidXRlczsKKyAgICAgIHNvYXAtPmF0dHJpYnV0ZXMgPSB0cDsKKyAgICB9CisgICAgc3RyY3B5KHRwLT5uYW1lLCBuYW1lKTsKKyAgICB0cC0+dmFsdWUgPSBOVUxMOworICB9CisgIGVsc2UgaWYgKHRwLT52aXNpYmxlKQorICB7IHJldHVybiBTT0FQX09LOworICB9CisgIGVsc2UgaWYgKHZhbHVlICYmIHRwLT52YWx1ZSAmJiB0cC0+c2l6ZSA8PSBzdHJsZW4odmFsdWUpKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZSBhdHRyaWJ1dGUgdmFsdWUgb2YgJXMgKGZyZWUgJXApXG4iLCBuYW1lLCB0cC0+dmFsdWUpKTsKKyAgICBTT0FQX0ZSRUUoc29hcCwgdHAtPnZhbHVlKTsKKyAgICB0cC0+dmFsdWUgPSBOVUxMOworICAgIHRwLT5ucyA9IE5VTEw7CisgIH0KKyAgaWYgKHZhbHVlKQorICB7IGlmICghdHAtPnZhbHVlKQorICAgIHsgdHAtPnNpemUgPSBzdHJsZW4odmFsdWUpICsgMTsKKyAgICAgIGlmICghKHRwLT52YWx1ZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCB0cC0+c2l6ZSkpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQWxsb2NhdGUgYXR0cmlidXRlIHZhbHVlIG9mICVzICglcClcbiIsIHRwLT5uYW1lLCB0cC0+dmFsdWUpKTsKKyAgICB9CisgICAgc3RyY3B5KHRwLT52YWx1ZSwgdmFsdWUpOworICAgIGlmICghc3RybmNtcCh0cC0+bmFtZSwgInhtbG5zOiIsIDYpKQorICAgICAgdHAtPm5zID0gdHAtPnZhbHVlOworICAgIHRwLT52aXNpYmxlID0gMjsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIndzdTpJZCIpKQorICAgIHsgc29hcC0+cGFydCA9IFNPQVBfQkVHSU5fU0VDVVJJVFk7CisgICAgICBzdHJuY3B5KHNvYXAtPmlkLCB2YWx1ZSwgc2l6ZW9mKHNvYXAtPmlkKSk7CisgICAgICBzb2FwLT5pZFtzaXplb2Yoc29hcC0+aWQpLTFdID0gJ1wwJzsKKyAgICB9CisjZW5kaWYKKyAgfQorICBlbHNlCisgICAgdHAtPnZpc2libGUgPSAxOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfY2xyX2F0dHIoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqdHA7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpKQorICB7IHdoaWxlIChzb2FwLT5hdHRyaWJ1dGVzKQorICAgIHsgdHAgPSBzb2FwLT5hdHRyaWJ1dGVzLT5uZXh0OworICAgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPmF0dHJpYnV0ZXMtPnZhbHVlKTsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5hdHRyaWJ1dGVzKTsKKyAgICAgIHNvYXAtPmF0dHJpYnV0ZXMgPSB0cDsKKyAgICB9CisgIH0KKyAgZWxzZQorI2VuZGlmCisgIHsgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICAgICAgdHAtPnZpc2libGUgPSAwOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitzdGF0aWMgaW50Citzb2FwX2dldGF0dHJ2YWwoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnMsIHNpemVfdCBuLCBzb2FwX3djaGFyIGQpCit7IHJlZ2lzdGVyIHNpemVfdCBpOworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICB7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IHNvYXBfZ2V0KHNvYXApOworICAgIHN3aXRjaCAoYykKKyAgICB7CisgICAgY2FzZSBTT0FQX1RUOgorICAgICAgKnMrKyA9ICc8JzsKKyAgICAgIHNvYXBfdW5nZXQoc29hcCwgJy8nKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9MVDoKKyAgICAgICpzKysgPSAnPCc7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfR1Q6CisgICAgICBpZiAoZCA9PSAnICcpCisgICAgICB7IHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgICpzID0gJ1wwJzsKKyAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgICB9CisgICAgICAqcysrID0gJz4nOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1FUOgorICAgICAgaWYgKGMgPT0gZCkKKyAgICAgIHsgKnMgPSAnXDAnOworICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICAgIH0KKyAgICAgICpzKysgPSAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfQVA6CisgICAgICBpZiAoYyA9PSBkKQorICAgICAgeyAqcyA9ICdcMCc7CisgICAgICAgIHJldHVybiBTT0FQX09LOworICAgICAgfQorICAgICAgKnMrKyA9ICdcJyc7CisgICAgICBicmVhazsKKyAgICBjYXNlICdcdCc6CisgICAgY2FzZSAnXG4nOgorICAgIGNhc2UgJ1xyJzoKKyAgICBjYXNlICcgJzoKKyAgICBjYXNlICcvJzoKKyAgICAgIGlmIChkID09ICcgJykKKyAgICAgIHsgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgKnMgPSAnXDAnOworICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgICAgKnMrKyA9IChjaGFyKWM7CisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgV0lUSF9GQVNUCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3N0b3JlX2xhYihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgc2l6ZV90IG4pCit7IHNvYXAtPmxhYmlkeCA9IDA7CisgIHJldHVybiBzb2FwX2FwcGVuZF9sYWIoc29hcCwgcywgbik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFdJVEhfRkFTVAorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9hcHBlbmRfbGFiKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBzaXplX3QgbikKK3sgaWYgKHNvYXAtPmxhYmlkeCArIG4gPj0gc29hcC0+bGFibGVuKQorICB7IHJlZ2lzdGVyIGNoYXIgKnQgPSBzb2FwLT5sYWJidWY7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmxhcmdpbmcgbG9vay1hc2lkZSBidWZmZXIgdG8gYXBwZW5kIGRhdGEsIG9sZCBzaXplPSVsdSIsICh1bnNpZ25lZCBsb25nKXNvYXAtPmxhYmxlbikpOworICAgIGlmIChzb2FwLT5sYWJsZW4gPT0gMCkKKyAgICAgIHNvYXAtPmxhYmxlbiA9IFNPQVBfTEFCTEVOOworICAgIHdoaWxlIChzb2FwLT5sYWJpZHggKyBuID49IHNvYXAtPmxhYmxlbikKKyAgICAgIHNvYXAtPmxhYmxlbiA8PD0gMTsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIiwgbmV3IHNpemU9JWx1XG4iLCAodW5zaWduZWQgbG9uZylzb2FwLT5sYWJsZW4pKTsKKyAgICBzb2FwLT5sYWJidWYgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc29hcC0+bGFibGVuKTsKKyAgICBpZiAoIXNvYXAtPmxhYmJ1ZikKKyAgICB7IGlmICh0KQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgdCk7CisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICB9CisgICAgaWYgKHQpCisgICAgeyBtZW1jcHkoc29hcC0+bGFiYnVmLCB0LCBzb2FwLT5sYWJpZHgpOworICAgICAgU09BUF9GUkVFKHNvYXAsIHQpOworICAgIH0KKyAgfQorICBpZiAocykKKyAgeyBtZW1jcHkoc29hcC0+bGFiYnVmICsgc29hcC0+bGFiaWR4LCBzLCBuKTsKKyAgICBzb2FwLT5sYWJpZHggKz0gbjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3BlZWtfZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyNpZmRlZiBXSVRIX0RPTQorICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICoqYXR0ID0gTlVMTDsKKyAgcmVnaXN0ZXIgY2hhciAqbGVhZCA9IE5VTEw7CisjZW5kaWYKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfYXR0cmlidXRlICp0cDsKKyAgY29uc3QgY2hhciAqdDsKKyAgcmVnaXN0ZXIgY2hhciAqczsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICByZWdpc3RlciBpbnQgaTsKKyAgaWYgKHNvYXAtPnBlZWtlZCkKKyAgeyBpZiAoISpzb2FwLT50YWcpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX05PX1RBRzsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICBzb2FwLT5wZWVrZWQgPSAxOworICBjID0gc29hcF9nZXR1dGY4KHNvYXApOworI2lmZGVmIFdJVEhfRE9NCisgIC8qIHdoaXRlc3BhY2UgbGVhZGluZyB0byBzdGFydCB0YWcgaXMgbm90IGluc2lnbmlmaWNhbnQgZm9yIERPTSAqLworICBpZiAoc29hcF9ibGFuayhjKSkKKyAgeyBzb2FwLT5sYWJpZHggPSAwOworICAgIGRvCisgICAgeyBpZiAoc29hcF9hcHBlbmRfbGFiKHNvYXAsIE5VTEwsIDApKQorICAgICAgICByZXR1cm4gU09BUF9FT007CisgICAgICBzID0gc29hcC0+bGFiYnVmICsgc29hcC0+bGFiaWR4OworICAgICAgaSA9IHNvYXAtPmxhYmxlbiAtIHNvYXAtPmxhYmlkeDsKKyAgICAgIHNvYXAtPmxhYmlkeCA9IHNvYXAtPmxhYmxlbjsKKyAgICAgIHdoaWxlIChzb2FwX2JsYW5rKGMpICYmIGktLSkKKyAgICAgIHsgKnMrKyA9IGM7CisgICAgICAgIGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisgICAgICB9CisgICAgfQorICAgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyAgICAqcyA9ICdcMCc7CisgICAgbGVhZCA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPmxhYmJ1Zik7CisgIH0KKyNlbHNlCisgIHdoaWxlIChzb2FwX2JsYW5rKGMpKQorICAgIGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisjZW5kaWYKKyAgaWYgKGMgIT0gU09BUF9MVCkKKyAgeyAqc29hcC0+dGFnID0gJ1wwJzsKKyAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisjaWZkZWYgV0lUSF9ET00KKyAgICAvKiB3aGl0ZXNwYWNlIGxlYWRpbmcgdG8gZW5kIHRhZyBpcyBub3QgaW5zaWduaWZpY2FudCBmb3IgRE9NICovCisgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgICAgICBzb2FwLT5kb20tPnRhaWwgPSBzb2FwX3N0cmR1cChzb2FwLCBsZWFkKTsKKyNlbmRpZgorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTk9fVEFHOworICB9CisgIHMgPSBzb2FwLT50YWc7CisgIGRvIGMgPSBzb2FwX2dldDEoc29hcCk7CisgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyAgaSA9IHNpemVvZihzb2FwLT50YWcpOworICB3aGlsZSAoYyAhPSAnPicgJiYgYyAhPSAnLycgJiYgc29hcF9ub3RibGFuayhjKSkKKyAgeyBpZiAoLS1pID4gMCkKKyAgICAgICpzKysgPSAoY2hhciljOworICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgIH0KKyAgd2hpbGUgKHNvYXBfYmxhbmsoYykpCisgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgKnMgPSAnXDAnOworICBzb2FwLT5pZFswXSA9ICdcMCc7CisgIHNvYXAtPmhyZWZbMF0gPSAnXDAnOworICBzb2FwLT50eXBlWzBdID0gJ1wwJzsKKyAgc29hcC0+YXJyYXlUeXBlWzBdID0gJ1wwJzsKKyAgc29hcC0+YXJyYXlTaXplWzBdID0gJ1wwJzsKKyAgc29hcC0+YXJyYXlPZmZzZXRbMF0gPSAnXDAnOworICBzb2FwLT5vdGhlciA9IDA7CisgIHNvYXAtPnJvb3QgPSAtMTsKKyAgc29hcC0+cG9zaXRpb24gPSAwOworICBzb2FwLT5udWxsID0gMDsKKyAgc29hcC0+bXVzdFVuZGVyc3RhbmQgPSAwOworI2lmZGVmIFdJVEhfRE9NCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICplbHQ7CisgICAgZWx0ID0gKHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50Kilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQpKTsKKyAgICBpZiAoIWVsdCkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIGVsdC0+bmV4dCA9IE5VTEw7CisgICAgZWx0LT5uc3RyID0gTlVMTDsKKyAgICBlbHQtPm5hbWUgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT50YWcpOworICAgIGVsdC0+cHJudCA9IHNvYXAtPmRvbTsKKyAgICBlbHQtPmVsdHMgPSBOVUxMOworICAgIGVsdC0+YXR0cyA9IE5VTEw7CisgICAgZWx0LT5kYXRhID0gTlVMTDsKKyAgICBlbHQtPndpZGUgPSBOVUxMOworICAgIGVsdC0+dHlwZSA9IDA7CisgICAgZWx0LT5ub2RlID0gTlVMTDsKKyAgICBlbHQtPmhlYWQgPSBsZWFkOworICAgIGVsdC0+dGFpbCA9IE5VTEw7CisgICAgZWx0LT5zb2FwID0gc29hcDsKKyAgICBpZiAoc29hcC0+ZG9tKQorICAgIHsgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKnAgPSBzb2FwLT5kb20tPmVsdHM7CisgICAgICBpZiAocCkKKyAgICAgIHsgd2hpbGUgKHAtPm5leHQpCisgICAgICAgICAgcCA9IHAtPm5leHQ7CisgICAgICAgIHAtPm5leHQgPSBlbHQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHNvYXAtPmRvbS0+ZWx0cyA9IGVsdDsKKyAgICB9CisgICAgc29hcC0+ZG9tID0gZWx0OworICAgIGF0dCA9ICZlbHQtPmF0dHM7CisgIH0KKyNlbmRpZgorICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgICAgdHAtPnZpc2libGUgPSAwOworICB3aGlsZSAoKGludCljICE9IEVPRiAmJiBjICE9ICc+JyAmJiBjICE9ICcvJykKKyAgeyBzID0gc29hcC0+dG1wYnVmOworICAgIGkgPSBzaXplb2Yoc29hcC0+dG1wYnVmKTsKKyAgICB3aGlsZSAoYyAhPSAnPScgJiYgYyAhPSAnPicgJiYgYyAhPSAnLycgJiYgc29hcF9ub3RibGFuayhjKSkKKyAgICB7IGlmICgtLWkgPiAwKQorICAgICAgICAqcysrID0gKGNoYXIpYzsKKyAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgfQorICAgICpzID0gJ1wwJzsKKyAgICBpZiAoaSA9PSBzaXplb2Yoc29hcC0+dG1wYnVmKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfU1lOVEFYX0VSUk9SOworI2lmZGVmIFdJVEhfRE9NCisgICAgLyogYWRkIGF0dHJpYnV0ZSBuYW1lIHRvIGRvbSAqLworICAgIGlmIChhdHQpCisgICAgeyAqYXR0ID0gKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlKSk7CisgICAgICAgaWYgKCEqYXR0KQorICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICAgKCphdHQpLT5uZXh0ID0gTlVMTDsKKyAgICAgICAoKmF0dCktPm5zdHIgPSBOVUxMOworICAgICAgICgqYXR0KS0+bmFtZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPnRtcGJ1Zik7CisgICAgICAgKCphdHQpLT5kYXRhID0gTlVMTDsKKyAgICAgICAoKmF0dCktPndpZGUgPSBOVUxMOworICAgICAgICgqYXR0KS0+c29hcCA9IHNvYXA7CisgICAgfQorI2VuZGlmCisgICAgaWYgKCFzdHJuY21wKHNvYXAtPnRtcGJ1ZiwgInhtbG5zIiwgNSkpCisgICAgeyBpZiAoc29hcC0+dG1wYnVmWzVdID09ICc6JykKKyAgICAgIHsgc29hcC0+dG1wYnVmWzVdID0gJ1wwJzsKKyAgICAgICAgdCA9IHNvYXAtPnRtcGJ1ZiArIDY7CisgICAgICB9CisgICAgICBlbHNlIGlmIChzb2FwLT50bXBidWZbNV0pCisgICAgICAgIHQgPSBOVUxMOworICAgICAgZWxzZQorICAgICAgICB0ID0gU09BUF9TVFJfRU9TOworICAgIH0KKyAgICBlbHNlCisgICAgICB0ID0gTlVMTDsKKyAgICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgICAgeyBpZiAoIVNPQVBfU1RSQ01QKHRwLT5uYW1lLCBzb2FwLT50bXBidWYpKQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCF0cCkKKyAgICB7IHRwID0gKHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSkgKyBzdHJsZW4oc29hcC0+dG1wYnVmKSk7CisgICAgICBpZiAoIXRwKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgIHN0cmNweSh0cC0+bmFtZSwgc29hcC0+dG1wYnVmKTsKKyAgICAgIHRwLT52YWx1ZSA9IE5VTEw7CisgICAgICB0cC0+c2l6ZSA9IDA7CisgICAgICB0cC0+bmV4dCA9IHNvYXAtPmF0dHJpYnV0ZXM7CisgICAgICBzb2FwLT5hdHRyaWJ1dGVzID0gdHA7CisgICAgfQorICAgIHdoaWxlIChzb2FwX2JsYW5rKGMpKQorICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICBpZiAoYyA9PSAnPScpCisgICAgeyBkbyBjID0gc29hcF9nZXR1dGY4KHNvYXApOworICAgICAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworICAgICAgaWYgKGMgIT0gU09BUF9RVCAmJiBjICE9IFNPQVBfQVApCisgICAgICB7IHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgIGMgPSAnICc7IC8qIGJsYW5rIGRlbGltaXRlciAqLworICAgICAgfQorICAgICAgaWYgKHNvYXBfZ2V0YXR0cnZhbChzb2FwLCB0cC0+dmFsdWUsIHRwLT5zaXplLCBjKSkKKyAgICAgIHsKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgICAgICAgaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfRU9NKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworCWlmIChzb2FwX3N0b3JlX2xhYihzb2FwLCB0cC0+dmFsdWUsIHRwLT5zaXplKSkKKwkgIHJldHVybiBzb2FwLT5lcnJvcjsKKwlpZiAodHAtPnZhbHVlKQorCSAgU09BUF9GUkVFKHNvYXAsIHRwLT52YWx1ZSk7CisJZm9yICg7OykKKwl7IGlmIChzb2FwX2dldGF0dHJ2YWwoc29hcCwgc29hcC0+bGFiYnVmICsgc29hcC0+bGFiaWR4LCBzb2FwLT5sYWJsZW4gLSBzb2FwLT5sYWJpZHgsIGMpKQorCSAgeyBpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9FT00pCisJICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworCSAgICBzb2FwLT5sYWJpZHggPSBzb2FwLT5sYWJsZW47CisJICAgIGlmIChzb2FwX2FwcGVuZF9sYWIoc29hcCwgTlVMTCwgMCkpCisJICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworCSAgfQorCSAgZWxzZQorCSAgICBicmVhazsKKwl9CisJaWYgKHNvYXAtPmxhYmlkeCkKKyAgICAgICAgICB0cC0+c2l6ZSA9IHNvYXAtPmxhYmxlbjsKKwllbHNlCisJeyB0cC0+c2l6ZSA9IHN0cmxlbihzb2FwLT5sYWJidWYpICsgMTsKKyAgICAgICAgICBpZiAodHAtPnNpemUgPCBTT0FQX0xBQkxFTikKKwkgICAgdHAtPnNpemUgPSBTT0FQX0xBQkxFTjsKKyAgICAgICAgfQorCWlmICghKHRwLT52YWx1ZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCB0cC0+c2l6ZSkpKQorCSAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICAgIHN0cmNweSh0cC0+dmFsdWUsIHNvYXAtPmxhYmJ1Zik7CisjZWxzZQorCXNpemVfdCBuOworICAgICAgICBpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9FT00pCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgICAgICAgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsgaWYgKCEocyA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgU09BUF9CTEtMRU4pKSkKKyAgICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgICBpZiAoc29hcF9nZXRhdHRydmFsKHNvYXAsIHMsIFNPQVBfQkxLTEVOLCBjKSkKKyAgICAgICAgICB7IGlmIChzb2FwLT5lcnJvciAhPSBTT0FQX0VPTSkKKyAgICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCW4gPSB0cC0+c2l6ZSArIHNvYXAtPmJsaXN0LT5zaXplOworICAgICAgICBpZiAoIShzID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIG4pKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgICAgaWYgKHRwLT52YWx1ZSkKKyAgICAgICAgeyBtZW1jcHkocywgdHAtPnZhbHVlLCB0cC0+c2l6ZSk7CisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHRwLT52YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgc29hcF9zYXZlX2Jsb2NrKHNvYXAsIHMgKyB0cC0+c2l6ZSwgMCk7CisgICAgICAgIHRwLT52YWx1ZSA9IHM7CisgICAgICAgIHRwLT5zaXplID0gbjsKKyNlbmRpZgorICAgICAgfQorICAgICAgZG8gYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyAgICAgIHRwLT52aXNpYmxlID0gMjsgLyogc2VlbiB0aGlzIGF0dHJpYnV0ZSB3LyB2YWx1ZSAqLworI2lmZGVmIFdJVEhfRE9NCisgICAgICBpZiAoYXR0KQorICAgICAgICAoKmF0dCktPmRhdGEgPSBzb2FwX3N0cmR1cChzb2FwLCB0cC0+dmFsdWUpOworI2VuZGlmCisgICAgfQorICAgIGVsc2UKKyAgICAgIHRwLT52aXNpYmxlID0gMTsgLyogc2VlbiB0aGlzIGF0dHJpYnV0ZSB3L28gdmFsdWUgKi8KKyNpZmRlZiBXSVRIX0RPTQorICAgIGlmIChhdHQpCisgICAgICBhdHQgPSAmKCphdHQpLT5uZXh0OworI2VuZGlmCisgICAgaWYgKHQgJiYgdHAtPnZhbHVlKQorICAgIHsgaWYgKHNvYXBfcHVzaF9uYW1lc3BhY2Uoc29hcCwgdCwgdHAtPnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgdHAtPnZpc2libGUgPSAwOworICAgIH0KKyAgfQorI2lmZGVmIFdJVEhfRE9NCisgIGlmIChhdHQpCisgIHsgc29hcC0+ZG9tLT5uc3RyID0gc29hcF9jdXJyZW50X25hbWVzcGFjZShzb2FwLCBzb2FwLT50YWcpOworICAgIGZvciAoYXR0ID0gJnNvYXAtPmRvbS0+YXR0czsgKmF0dDsgYXR0ID0gJigqYXR0KS0+bmV4dCkKKyAgICAgICgqYXR0KS0+bnN0ciA9IHNvYXBfY3VycmVudF9uYW1lc3BhY2Uoc29hcCwgKCphdHQpLT5uYW1lKTsKKyAgfQorI2VuZGlmCisgIGlmICgoaW50KWMgPT0gRU9GKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICBpZiAoIShzb2FwLT5ib2R5ID0gKGMgIT0gJy8nKSkpCisgICAgZG8gYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICB3aGlsZSAoc29hcF9ibGFuayhjKSk7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pCisgIHsgaWYgKCFzb2FwLT5ib2R5ICYmIHNvYXAtPmRvbS0+cHJudCkKKyAgICAgIHNvYXAtPmRvbSA9IHNvYXAtPmRvbS0+cHJudDsKKyAgfQorI2VuZGlmCisgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgeyBpZiAodHAtPnZpc2libGUgJiYgdHAtPnZhbHVlKQorICAgIHsgaWYgKCFzdHJjbXAodHAtPm5hbWUsICJpZCIpKQorICAgICAgeyAqc29hcC0+aWQgPSAnIyc7CisgICAgICAgIHN0cm5jcHkoc29hcC0+aWQgKyAxLCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT5pZCkgLSAyKTsKKyAgICAgICAgc29hcC0+aWRbc2l6ZW9mKHNvYXAtPmlkKS0xXSA9ICdcMCc7CisgICAgICB9CisgICAgICBlbHNlIGlmICghc3RyY21wKHRwLT5uYW1lLCAiaHJlZiIpKQorICAgICAgeyBzdHJuY3B5KHNvYXAtPmhyZWYsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPmhyZWYpIC0gMSk7CisgICAgICAgIHNvYXAtPmhyZWZbc2l6ZW9mKHNvYXAtPmhyZWYpLTFdID0gJ1wwJzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKChzb2FwLT52ZXJzaW9uID09IDIgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9HUkFQSCkpICYmICFzdHJjbXAodHAtPm5hbWUsICJyZWYiKSkKKyAgICAgIHsgKnNvYXAtPmhyZWYgPSAnIyc7CisgICAgICAgIHN0cm5jcHkoc29hcC0+aHJlZiArIDEsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPmhyZWYpIC0gMik7CisgICAgICAgIHNvYXAtPmhyZWZbc2l6ZW9mKHNvYXAtPmhyZWYpLTFdID0gJ1wwJzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgInhzaTp0eXBlIikpCisgICAgICB7IHN0cm5jcHkoc29hcC0+dHlwZSwgdHAtPnZhbHVlLCBzaXplb2Yoc29hcC0+dHlwZSkgLSAxKTsKKyAgICAgICAgc29hcC0+dHlwZVtzaXplb2Yoc29hcC0+dHlwZSktMV0gPSAnXDAnOworICAgICAgfQorICAgICAgZWxzZSBpZiAoc29hcC0+dmVyc2lvbiA9PSAxICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5DOmFycmF5VHlwZSIpKQorICAgICAgeyBzID0gc29hcF9zdHJyY2hyKHRwLT52YWx1ZSwgJ1snKTsKKyAgICAgICAgaWYgKHMgJiYgKHNpemVfdCkocyAtIHRwLT52YWx1ZSkgPCBzaXplb2Yoc29hcC0+YXJyYXlUeXBlKSkKKyAgICAgICAgeyBzdHJuY3B5KHNvYXAtPmFycmF5VHlwZSwgdHAtPnZhbHVlLCBzIC0gdHAtPnZhbHVlKTsKKyAgICAgICAgICBzb2FwLT5hcnJheVR5cGVbcyAtIHRwLT52YWx1ZV0gPSAnXDAnOworICAgICAgICAgIHN0cm5jcHkoc29hcC0+YXJyYXlTaXplLCBzLCBzaXplb2Yoc29hcC0+YXJyYXlTaXplKSAtIDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzdHJuY3B5KHNvYXAtPmFycmF5VHlwZSwgdHAtPnZhbHVlLCBzaXplb2Yoc29hcC0+YXJyYXlUeXBlKSAtIDEpOworICAgICAgICBzb2FwLT5hcnJheVNpemVbc2l6ZW9mKHNvYXAtPmFycmF5VHlwZSktMV0gPSAnXDAnOworICAgICAgICBzb2FwLT5hcnJheVR5cGVbc2l6ZW9mKHNvYXAtPmFycmF5VHlwZSktMV0gPSAnXDAnOworICAgICAgfQorICAgICAgZWxzZSBpZiAoc29hcC0+dmVyc2lvbiA9PSAyICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5DOml0ZW1UeXBlIikpCisgICAgICAgIHN0cm5jcHkoc29hcC0+YXJyYXlUeXBlLCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT5hcnJheVR5cGUpIC0gMSk7CisgICAgICBlbHNlIGlmIChzb2FwLT52ZXJzaW9uID09IDIgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTkM6YXJyYXlTaXplIikpCisgICAgICAgIHN0cm5jcHkoc29hcC0+YXJyYXlTaXplLCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT5hcnJheVNpemUpIC0gMSk7CisgICAgICBlbHNlIGlmIChzb2FwLT52ZXJzaW9uID09IDEgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTkM6b2Zmc2V0IikpCisgICAgICAgIHN0cm5jcHkoc29hcC0+YXJyYXlPZmZzZXQsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPmFycmF5T2Zmc2V0KSk7CisgICAgICBlbHNlIGlmIChzb2FwLT52ZXJzaW9uID09IDEgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTkM6cG9zaXRpb24iKSkKKyAgICAgICAgc29hcC0+cG9zaXRpb24gPSBzb2FwX2dldHBvc2l0aW9uKHRwLT52YWx1ZSwgc29hcC0+cG9zaXRpb25zKTsKKyAgICAgIGVsc2UgaWYgKHNvYXAtPnZlcnNpb24gPT0gMSAmJiAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOQzpyb290IikpCisgICAgICAgIHNvYXAtPnJvb3QgPSAoKCFzdHJjbXAodHAtPnZhbHVlLCAiMSIpIHx8ICFzdHJjbXAodHAtPnZhbHVlLCAidHJ1ZSIpKSk7CisgICAgICBlbHNlIGlmICgoc29hcC0+dmVyc2lvbiA9PSAxICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5WOmFjdG9yIikpCisgICAgICAgICAgICB8fCAoc29hcC0+dmVyc2lvbiA9PSAyICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5WOnJvbGUiKSkpCisgICAgICB7IGlmICgoIXNvYXAtPmFjdG9yIHx8IHN0cmNtcChzb2FwLT5hY3RvciwgdHAtPnZhbHVlKSkKKyAgICAgICAgICYmIHN0cmNtcCh0cC0+dmFsdWUsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2FjdG9yL25leHQiKQorICAgICAgICAgJiYgc3RyY21wKHRwLT52YWx1ZSwgImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZS9yb2xlL25leHQiKSkKKyAgICAgICAgICBzb2FwLT5vdGhlciA9IDE7CisgICAgICB9CisgICAgICBlbHNlIGlmICghc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOVjptdXN0VW5kZXJzdGFuZCIpCisgICAgICAgICAgICAmJiAoIXN0cmNtcCh0cC0+dmFsdWUsICIxIikgfHwgIXN0cmNtcCh0cC0+dmFsdWUsICJ0cnVlIikpKQorICAgICAgICBzb2FwLT5tdXN0VW5kZXJzdGFuZCA9IDE7CisgICAgICBlbHNlIGlmICgoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAieHNpOm51bGwiKQorICAgICAgICAgICAgIHx8ICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgInhzaTpuaWwiKSkKKyAgICAgICAgICAgICYmICghc3RyY21wKHRwLT52YWx1ZSwgIjEiKQorICAgICAgICAgICAgIHx8ICFzdHJjbXAodHAtPnZhbHVlLCAidHJ1ZSIpKSkKKyAgICAgICAgc29hcC0+bnVsbCA9IDE7CisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3JldHJ5KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIHNvYXBfcmV2ZXJ0KHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9yZXZlcnQoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmICghc29hcC0+cGVla2VkKQorICB7IHNvYXAtPnBlZWtlZCA9IDE7CisgICAgaWYgKHNvYXAtPmJvZHkpCisgICAgICBzb2FwLT5sZXZlbC0tOworICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmV2ZXJ0aW5nIGxhc3QgZWxlbWVudCAobGV2ZWw9JXUpXG4iLCBzb2FwLT5sZXZlbCkpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3N0cmluZ19vdXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGludCBmbGFnKQoreyByZWdpc3RlciBjb25zdCBjaGFyICp0OworICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgbWFzayA9IDB4RkZGRkZGODBVTDsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBzb2FwLT5kb20tPmRhdGEgPSBzb2FwX3N0cmR1cChzb2FwLCBzKTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2VuZGlmCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9DX1VURlNUUklORykKKyAgICBtYXNrID0gMDsKKyAgdCA9IHM7CisgIHdoaWxlICgoYyA9ICp0KyspKQorICB7IHN3aXRjaCAoYykKKyAgICB7IAorICAgIGNhc2UgOToKKyAgICAgIGlmIChmbGFnKQorICAgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIiYjeDk7IiwgNSkpCisJICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHMgPSB0OworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAxMDoKKyAgICAgIGlmIChmbGFnIHx8ICEoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkpCisgICAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiJiN4QTsiLCA1KSkKKwkgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgcyA9IHQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDEzOgorICAgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICImI3hEOyIsIDUpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBzID0gdDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJyYnOgorICAgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICImYW1wOyIsIDUpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBzID0gdDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJzwnOgorICAgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICImbHQ7IiwgNCkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHMgPSB0OworICAgICAgYnJlYWs7CisgICAgY2FzZSAnPic6CisgICAgICBpZiAoIWZsYWcpCisgICAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiJmd0OyIsIDQpKQorCSAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBzID0gdDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJyInOgorICAgICAgaWYgKGZsYWcpCisgICAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiJnF1b3Q7IiwgNikpCisJICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHMgPSB0OworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZmRlZiBIQVZFX01CVE9XQworICAgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0NfTUJTVFJJTkcpCisgICAgICB7IHdjaGFyX3Qgd2M7CisgICAgICAgIHJlZ2lzdGVyIGludCBtID0gbWJ0b3djKCZ3YywgdCAtIDEsIE1CX0NVUl9NQVgpOworICAgICAgICBpZiAobSA+IDAgJiYgd2MgIT0gYykKKyAgICAgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfcHV0dXRmOChzb2FwLCB3YykpCisgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisJICBzID0gdCArPSBtIC0gMTsKKwkgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKyNlbmRpZgorICAgICAgaWYgKGMgJiBtYXNrKQorICAgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfcHV0dXRmOChzb2FwLCAodW5zaWduZWQgY2hhciljKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHMgPSB0OworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3N0cmluZ19pbihzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGZsYWcsIGxvbmcgbWlubGVuLCBsb25nIG1heGxlbikKK3sgcmVnaXN0ZXIgY2hhciAqczsKKyAgY2hhciAqdCA9IE5VTEw7CisgIHJlZ2lzdGVyIHNpemVfdCBpOworICByZWdpc3RlciBsb25nIGwgPSAwOworICByZWdpc3RlciBpbnQgbiA9IDA7CisgIHJlZ2lzdGVyIGludCBtID0gMDsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworI2lmICFkZWZpbmVkKFdJVEhfTEVBTkVSKSAmJiBkZWZpbmVkKEhBVkVfV0NUT01CKQorICBjaGFyIGJ1ZltNQl9MRU5fTUFYID4gOCA/IE1CX0xFTl9NQVggOiA4XTsKKyNlbHNlCisgIGNoYXIgYnVmWzhdOworI2VuZGlmCisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWFkaW5nIHN0cmluZyBjb250ZW50XG4iKSk7CisgIGlmIChzb2FwLT5wZWVrZWQpCisgIHsgaWYgKCFzb2FwLT5ib2R5KQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCpzb2FwLT50YWcpCisgICAgeyBuID0gMTsKKyAgICAgIHNvYXAtPnBlZWtlZCA9IDA7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgdCA9IHNvYXAtPnRtcGJ1ZjsKKyAgICAgIHRbMF0gPSAnPCc7CisgICAgICBzdHJuY3B5KHQgKyAxLCBzb2FwLT50YWcsIHNpemVvZihzb2FwLT50bXBidWYpIC0gMSk7CisgICAgICBzdHJuY2F0KHQsICI+Iiwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZikpOworICAgICAgbSA9IHN0cmxlbihzb2FwLT50YWcpICsgMjsKKyNlbmRpZgorICAgIH0KKyAgfQorI2lmZGVmIFdJVEhfQ0RBVEEKKyAgaWYgKCFmbGFnKQorICB7IHJlZ2lzdGVyIGludCBzdGF0ZSA9IDA7CisjaWZkZWYgV0lUSF9GQVNUCisgICAgc29hcC0+bGFiaWR4ID0gMDsJCQkvKiB1c2UgbG9vay1hc2lkZSBidWZmZXIgKi8KKyNlbHNlCisgICAgaWYgKHNvYXBfbmV3X2Jsb2NrKHNvYXApKQorICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgICBmb3IgKDs7KQorICAgIHsgCisjaWZkZWYgV0lUSF9GQVNUCisgICAgICByZWdpc3RlciBzaXplX3QgazsKKyAgICAgIGlmIChzb2FwX2FwcGVuZF9sYWIoc29hcCwgTlVMTCwgMCkpCS8qIGFsbG9jYXRlIG1vcmUgc3BhY2UgaW4gbG9vay1hc2lkZSBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgcyA9IHNvYXAtPmxhYmJ1ZiArIHNvYXAtPmxhYmlkeDsJLyogc3BhY2UgdG8gcG9wdWxhdGUgKi8KKyAgICAgIGsgPSBzb2FwLT5sYWJsZW4gLSBzb2FwLT5sYWJpZHg7CS8qIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgKi8KKyAgICAgIHNvYXAtPmxhYmlkeCA9IHNvYXAtPmxhYmxlbjsJLyogY2xhaW0gdGhpcyBzcGFjZSAqLworI2Vsc2UKKyAgICAgIHJlZ2lzdGVyIHNpemVfdCBrID0gU09BUF9CTEtMRU47CisgICAgICBpZiAoIShzID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBrKSkpCisgICAgICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgICAgICBmb3IgKGkgPSAwOyBpIDwgazsgaSsrKQorICAgICAgeyBpZiAobSA+IDApCisgICAgICAgIHsgKnMrKyA9ICp0Kys7CS8qIGNvcHkgbXVsdGlieXRlIGNoYXJhY3RlcnMgKi8KKwkgIG0tLTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworCWlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICBpZiAoYyA+PSAweDgwICYmICEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0xBVElOKSkKKyAgICAgICAgeyBzb2FwX3VuZ2V0KHNvYXAsIGMpOworCSAgYyA9IHNvYXBfZ2V0dXRmOChzb2FwKTsKKwkgIGlmIChzb2FwLT5tb2RlICYgU09BUF9DX1VURlNUUklORykKKyAgICAgICAgICB7IGlmICgoYyAmIDB4ODAwMDAwMDApICYmIGMgPj0gLTB4N0ZGRkZGODAgJiYgYyA8IFNPQVBfQVApCisgICAgICAgICAgICB7IGMgJj0gMHg3RkZGRkZGRjsKKyAgICAgICAgICAgICAgdCA9IGJ1ZjsKKyAgICAgICAgICAgICAgaWYgKGMgPCAweDA4MDApCisgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEMwIHwgKChjID4+IDYpICYgMHgxRikpOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsgaWYgKGMgPCAweDAxMDAwMCkKKyAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhFMCB8ICgoYyA+PiAxMikgJiAweDBGKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsgaWYgKGMgPCAweDIwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEYwIHwgKChjID4+IDE4KSAmIDB4MDcpKTsKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHsgaWYgKGMgPCAweDA0MDAwMDAwKQorICAgICAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhGOCB8ICgoYyA+PiAyNCkgJiAweDAzKSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeyAqdCsrID0gKGNoYXIpKDB4RkMgfCAoKGMgPj4gMzApICYgMHgwMSkpOworICAgICAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAyNCkgJiAweDNGKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDE4KSAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgICAgIH0gICAgIAorICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDEyKSAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDYpICYgMHgzRikpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8IChjICYgMHgzRikpOworCSAgICAgIG0gPSAoaW50KSh0IC0gYnVmKSAtIDE7CisgICAgICAgICAgICAgIHQgPSBidWY7CisgICAgICAgICAgICAgICpzKysgPSAqdCsrOworICAgICAgICAgICAgICBjb250aW51ZTsKKwkgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCXN3aXRjaCAoc3RhdGUpCisgICAgICAgIHsgY2FzZSAxOgorICAgICAgICAgICAgaWYgKGMgPT0gJ10nKQorCSAgICAgIHN0YXRlID0gNDsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworCSAgY2FzZSAyOgorCSAgICBpZiAoYyA9PSAnLScpCisgICAgICAgICAgICAgIHN0YXRlID0gNjsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworCSAgY2FzZSAzOgorCSAgICBpZiAoYyA9PSAnPycpCisJICAgICAgc3RhdGUgPSA4OworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisgICAgICAgICAgLyogQ0RBVEEgKi8KKwkgIGNhc2UgNDoKKwkgICAgaWYgKGMgPT0gJ10nKQorICAgICAgICAgICAgICBzdGF0ZSA9IDU7CisJICAgIGVsc2UKKwkgICAgICBzdGF0ZSA9IDE7CisJICAgICpzKysgPSBjOworCSAgICBjb250aW51ZTsKKwkgIGNhc2UgNToKKwkgICAgaWYgKGMgPT0gJz4nKQorCSAgICAgIHN0YXRlID0gMDsKKwkgICAgZWxzZQorCSAgICAgIHN0YXRlID0gMTsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworICAgICAgICAgIC8qIGNvbW1lbnQgKi8KKyAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICBpZiAoYyA9PSAnLScpCisJICAgICAgc3RhdGUgPSA3OworCSAgICBlbHNlCisJICAgICAgc3RhdGUgPSAyOworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgaWYgKGMgPT0gJz4nKQorCSAgICAgIHN0YXRlID0gMDsKKwkgICAgZWxzZQorCSAgICAgIHN0YXRlID0gMjsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworICAgICAgICAgIC8qIFBJICovCisJICBjYXNlIDg6CisgICAgICAgICAgICBpZiAoYyA9PSAnPicpCisJICAgICAgc3RhdGUgPSAwOworCSAgICBlbHNlCisJICAgICAgc3RhdGUgPSAzOworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChjKQorICAgICAgICB7CisgICAgICAgIGNhc2UgJy8nOgorICAgICAgICAgIGlmIChuID4gMCkKKyAgICAgICAgICB7IGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgICAgICAgICAgICBpZiAoYyA9PSAnPicpCisgICAgICAgICAgICAgIG4tLTsKKyAgICAgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgICAgfQorICAgICAgICAgICpzKysgPSAnLyc7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzwnOgorCSAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKwkgIGlmIChjID09ICcvJykKKwkgIHsgaWYgKG4gPT0gMCkKKwkgICAgeyBjID0gU09BUF9UVDsKKwkgICAgICBnb3RvIGVuZDsKKwkgICAgfQorCSAgICBuLS07CisJICB9CisJICBlbHNlIGlmIChjID09ICchJykKKwkgIHsgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKwkgICAgaWYgKGMgPT0gJ1snKQorICAgICAgICAgICAgeyBkbyBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICAgICAgICAgICAgICB3aGlsZSAoKGludCljICE9IEVPRiAmJiBjICE9ICdbJyk7CisgICAgICAgICAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKwkgICAgICB0ID0gKGNoYXIqKSIhW0NEQVRBWyI7CisJICAgICAgbSA9IDg7CisJICAgICAgc3RhdGUgPSAxOworCSAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjID09ICctJykKKwkgICAgeyBpZiAoKGMgPSBzb2FwX2dldGNoYXIoc29hcCkpID09ICctJykKKwkgICAgICAgIHN0YXRlID0gMjsKKwkgICAgICB0ID0gKGNoYXIqKSIhLSI7CisJICAgICAgbSA9IDI7CisJICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsgdCA9IChjaGFyKikiISI7CisJICAgICAgbSA9IDE7CisJICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKwkgICAgfQorCSAgICAqcysrID0gJzwnOworCSAgICBicmVhazsKKwkgIH0KKwkgIGVsc2UgaWYgKGMgPT0gJz8nKQorCSAgICBzdGF0ZSA9IDM7CisJICBlbHNlCisJICAgIG4rKzsKKyAgICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICAgICpzKysgPSAnPCc7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJz4nOgorICAgICAgICAgICpzKysgPSAnPic7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJyInOgorICAgICAgICAgICpzKysgPSAnIic7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZkZWYgSEFWRV9XQ1RPTUIKKyAgICAgICAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfQ19NQlNUUklORykKKyAgICAgICAgICB7IG0gPSB3Y3RvbWIoYnVmLCBjICYgMHg3RkZGRkZGRik7CisgICAgICAgICAgICBpZiAobSA+PSAxICYmIG0gPD0gKGludClNQl9DVVJfTUFYKQorICAgICAgICAgICAgeyB0ID0gYnVmOworICAgICAgICAgICAgICAqcysrID0gKnQrKzsKKyAgICAgICAgICAgICAgbS0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAqcysrID0gU09BUF9VTktOT1dOX0NIQVI7CisJICAgICAgbSA9IDA7CisJICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorI2VuZGlmCisjZW5kaWYKKyAgICAgICAgICAgICpzKysgPSAoY2hhcikoYyAmIDB4RkYpOworICAgICAgICB9CisJbCsrOworICAgICAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIG1heGxlbiA+PSAwICYmIGwgPiBtYXhsZW4pCisgICAgICAgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlN0cmluZyB0b28gbG9uZzogbWF4bGVuPSVsZFxuIiwgbWF4bGVuKSk7CisgICAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0xFTkdUSDsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorI2VuZGlmCisjaWZkZWYgV0lUSF9GQVNUCisgIHNvYXAtPmxhYmlkeCA9IDA7CQkJLyogdXNlIGxvb2stYXNpZGUgYnVmZmVyICovCisjZWxzZQorICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgZm9yICg7OykKKyAgeyAKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgICByZWdpc3RlciBzaXplX3QgazsKKyAgICBpZiAoc29hcF9hcHBlbmRfbGFiKHNvYXAsIE5VTEwsIDApKQkvKiBhbGxvY2F0ZSBtb3JlIHNwYWNlIGluIGxvb2stYXNpZGUgYnVmZmVyIGlmIG5lY2Vzc2FyeSAqLworICAgICAgcmV0dXJuIE5VTEw7CisgICAgcyA9IHNvYXAtPmxhYmJ1ZiArIHNvYXAtPmxhYmlkeDsJLyogc3BhY2UgdG8gcG9wdWxhdGUgKi8KKyAgICBrID0gc29hcC0+bGFibGVuIC0gc29hcC0+bGFiaWR4OwkvKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlICovCisgICAgc29hcC0+bGFiaWR4ID0gc29hcC0+bGFibGVuOwkvKiBjbGFpbSB0aGlzIHNwYWNlICovCisjZWxzZQorICAgIHJlZ2lzdGVyIHNpemVfdCBrID0gU09BUF9CTEtMRU47CisgICAgaWYgKCEocyA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgaykpKQorICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgICBmb3IgKGkgPSAwOyBpIDwgazsgaSsrKQorICAgIHsgaWYgKG0gPiAwKQorICAgICAgeyAqcysrID0gKnQrKzsJLyogY29weSBtdWx0aWJ5dGUgY2hhcmFjdGVycyAqLworICAgICAgICBtLS07CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0NfVVRGU1RSSU5HKQorICAgICAgeyBpZiAoKChjID0gc29hcF9nZXQoc29hcCkpICYgMHg4MDAwMDAwMCkgJiYgYyA+PSAtMHg3RkZGRkY4MCAmJiBjIDwgU09BUF9BUCkKKyAgICAgICAgeyBjICY9IDB4N0ZGRkZGRkY7CisgICAgICAgICAgdCA9IGJ1ZjsKKyAgICAgICAgICBpZiAoYyA8IDB4MDgwMCkKKyAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhDMCB8ICgoYyA+PiA2KSAmIDB4MUYpKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeyBpZiAoYyA8IDB4MDEwMDAwKQorICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RTAgfCAoKGMgPj4gMTIpICYgMHgwRikpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyBpZiAoYyA8IDB4MjAwMDAwKQorICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhGMCB8ICgoYyA+PiAxOCkgJiAweDA3KSk7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeyBpZiAoYyA8IDB4MDQwMDAwMDApCisgICAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjggfCAoKGMgPj4gMjQpICYgMHgwMykpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7ICp0KysgPSAoY2hhcikoMHhGQyB8ICgoYyA+PiAzMCkgJiAweDAxKSk7CisgICAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMjQpICYgMHgzRikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTgpICYgMHgzRikpOworICAgICAgICAgICAgICB9ICAgICAKKyAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDEyKSAmIDB4M0YpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKGMgJiAweDNGKSk7CisJICBtID0gKGludCkodCAtIGJ1ZikgLSAxOworICAgICAgICAgIHQgPSBidWY7CisgICAgICAgICAgKnMrKyA9ICp0Kys7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgYyA9IHNvYXBfZ2V0dXRmOChzb2FwKTsKKyAgICAgIHN3aXRjaCAoYykKKyAgICAgIHsKKyAgICAgIGNhc2UgU09BUF9UVDoKKyAgICAgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgbi0tOworICAgICAgICAqcysrID0gJzwnOworICAgICAgICB0ID0gKGNoYXIqKSIvIjsKKwltID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfTFQ6CisgICAgICAgIG4rKzsKKyAgICAgICAgKnMrKyA9ICc8JzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfR1Q6CisgICAgICAgICpzKysgPSAnPic7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTT0FQX1FUOgorICAgICAgICAqcysrID0gJyInOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9BUDoKKyAgICAgICAgKnMrKyA9ICdcJyc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnLyc6CisgICAgICAgIGlmIChuID4gMCkKKyAgICAgICAgeyBjID0gc29hcF9nZXQoc29hcCk7CisgICAgICAgICAgaWYgKGMgPT0gU09BUF9HVCkKKyAgICAgICAgICAgIG4tLTsKKyAgICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICB9CisgICAgICAgICpzKysgPSAnLyc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnPCcgfCAweDgwMDAwMDAwOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gJzwnOworICAgICAgICBlbHNlCisgICAgICAgIHsgKnMrKyA9ICcmJzsKKyAgICAgICAgICB0ID0gKGNoYXIqKSJsdDsiOworCSAgbSA9IDM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICc+JyB8IDB4ODAwMDAwMDA6CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICpzKysgPSAnPic7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAqcysrID0gJyYnOworICAgICAgICAgIHQgPSAoY2hhciopImd0OyI7CisJICBtID0gMzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJyYnIHwgMHg4MDAwMDAwMDoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9ICcmJzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAnJic7CisgICAgICAgICAgdCA9IChjaGFyKikiYW1wOyI7CisJICBtID0gNDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJyInIHwgMHg4MDAwMDAwMDoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9ICciJzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAnJic7CisgICAgICAgICAgdCA9IChjaGFyKikicXVvdDsiOworCSAgbSA9IDU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdcJycgfCAweDgwMDAwMDAwOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gJ1wnJzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAnJic7CisgICAgICAgICAgdCA9IChjaGFyKikiYXBvczsiOworCSAgbSA9IDU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgICBnb3RvIGVuZDsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZmRlZiBIQVZFX1dDVE9NQgorICAgICAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfQ19NQlNUUklORykKKyAgICAgICAgeyBtID0gd2N0b21iKGJ1ZiwgYyAmIDB4N0ZGRkZGRkYpOworICAgICAgICAgIGlmIChtID49IDEgJiYgbSA8PSAoaW50KU1CX0NVUl9NQVgpCisgICAgICAgICAgeyB0ID0gYnVmOworICAgICAgICAgICAgKnMrKyA9ICp0Kys7CisgICAgICAgICAgICBtLS07CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7ICpzKysgPSBTT0FQX1VOS05PV05fQ0hBUjsKKwkgICAgbSA9IDA7CisJICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmCisjZW5kaWYKKyAgICAgICAgICAqcysrID0gKGNoYXIpKGMgJiAweEZGKTsKKyAgICAgIH0KKyAgICAgIGwrKzsKKyAgICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgbWF4bGVuID49IDAgJiYgbCA+IG1heGxlbikKKyAgICAgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlN0cmluZyB0b28gbG9uZzogbWF4bGVuPSVsZFxuIiwgbWF4bGVuKSk7CisgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9MRU5HVEg7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgIH0KKyAgfQorZW5kOgorICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAqcyA9ICdcMCc7CisjaWZkZWYgV0lUSF9GQVNUCisgIHQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT5sYWJidWYpOworI2Vsc2UKKyAgc29hcF9zaXplX2Jsb2NrKHNvYXAsIGkrMSk7CisgIHQgPSBzb2FwX3NhdmVfYmxvY2soc29hcCwgTlVMTCwgMCk7CisjZW5kaWYKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiBsIDwgbWlubGVuKQorICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJTdHJpbmcgdG9vIHNob3J0OiAlbGQgY2hhcnMsIG1pbmxlbj0lbGRcbiIsIGwsIG1pbmxlbikpOworICAgIHNvYXAtPmVycm9yID0gU09BUF9MRU5HVEg7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBpZiAoZmxhZyA9PSAzKQorICAgICAgc29hcC0+ZG9tLT50YWlsID0gdDsKKyAgICBlbHNlCisgICAgICBzb2FwLT5kb20tPmRhdGEgPSB0OworICB9CisjZW5kaWYKKyAgaWYgKGZsYWcgPT0gMikKKyAgICBpZiAoc29hcF9zMlFOYW1lKHNvYXAsIHQsICZ0KSkKKyAgICAgIHJldHVybiBOVUxMOworICByZXR1cm4gdDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF93c3RyaW5nX291dChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgd2NoYXJfdCAqcywgaW50IGZsYWcpCit7IGNvbnN0IGNoYXIgKnQ7CisgIGNoYXIgdG1wOworICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgd2NoYXJfdCAqciA9ICh3Y2hhcl90KilzOworICAgIGludCBuID0gMTsKKyAgICB3aGlsZSAoKnIrKykKKyAgICAgIG4rKzsKKyAgICBzb2FwLT5kb20tPndpZGUgPSByID0gKHdjaGFyX3QqKXNvYXBfbWFsbG9jKHNvYXAsIG4gKiBzaXplb2Yod2NoYXJfdCkpOworICAgIHdoaWxlIChuLS0pCisgICAgICAqcisrID0gKnMrKzsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2VuZGlmCisgIHdoaWxlICgoYyA9ICpzKyspKQorICB7IHN3aXRjaCAoYykKKyAgICB7IAorICAgIGNhc2UgOToKKyAgICAgIGlmIChmbGFnKQorICAgICAgICB0ID0gIiYjeDk7IjsKKyAgICAgIGVsc2UKKyAgICAgICAgdCA9ICJcdCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEwOgorICAgICAgaWYgKGZsYWcgfHwgIShzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKSkKKyAgICAgICAgdCA9ICImI3hBOyI7CisgICAgICBlbHNlCisgICAgICAgIHQgPSAiXG4iOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMzoKKyAgICAgIHQgPSAiJiN4RDsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnJic6CisgICAgICB0ID0gIiZhbXA7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJzwnOgorICAgICAgdCA9ICImbHQ7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJz4nOgorICAgICAgaWYgKGZsYWcpCisgICAgICAgIHQgPSAiPiI7CisgICAgICBlbHNlCisJdCA9ICImZ3Q7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJyInOgorICAgICAgaWYgKGZsYWcpCisgICAgICAgIHQgPSAiJnF1b3Q7IjsKKyAgICAgIGVsc2UKKyAgICAgICAgdCA9ICJcIiI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKGMgPiAwICYmIGMgPCAweDgwKQorICAgICAgeyB0bXAgPSAoY2hhciljOworICAgICAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAmdG1wLCAxKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB9CisgICAgICBlbHNlIGlmIChzb2FwX3B1dHV0Zjgoc29hcCwgKHVuc2lnbmVkIGxvbmcpYykpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoc29hcF9zZW5kKHNvYXAsIHQpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit3Y2hhcl90ICoKK1NPQVBfRk1BQzIKK3NvYXBfd3N0cmluZ19pbihzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGZsYWcsIGxvbmcgbWlubGVuLCBsb25nIG1heGxlbikKK3sgd2NoYXJfdCAqczsKKyAgcmVnaXN0ZXIgaW50IGksIG4gPSAwOworICByZWdpc3RlciBsb25nIGwgPSAwOworICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIGNvbnN0IGNoYXIgKnQgPSBOVUxMOworICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVhZGluZyB3aWRlIHN0cmluZyBjb250ZW50XG4iKSk7CisgIGlmIChzb2FwLT5wZWVrZWQpCisgIHsgaWYgKCFzb2FwLT5ib2R5KQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCpzb2FwLT50YWcpCisgICAgeyBuID0gMTsKKyAgICAgIHNvYXAtPnBlZWtlZCA9IDA7CisgICAgfQorICB9CisgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgZm9yICg7OykKKyAgeyBpZiAoIShzID0gKHdjaGFyX3QqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBzaXplb2Yod2NoYXJfdCkqU09BUF9CTEtMRU4pKSkKKyAgICAgIHJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0JMS0xFTjsgaSsrKQorICAgIHsgaWYgKHQpCisgICAgICB7ICpzKysgPSAod2NoYXJfdCkqdCsrOworICAgICAgICBpZiAoISp0KQorICAgICAgICAgIHQgPSBOVUxMOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisgICAgICBzd2l0Y2ggKGMpCisgICAgICB7CisgICAgICBjYXNlIFNPQVBfVFQ6CisgICAgICAgIGlmIChuID09IDApCisgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIG4tLTsKKyAgICAgICAgKnMrKyA9ICc8JzsKKyAgICAgICAgc29hcF91bmdldChzb2FwLCAnLycpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9MVDoKKyAgICAgICAgbisrOworICAgICAgICAqcysrID0gJzwnOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9HVDoKKyAgICAgICAgKnMrKyA9ICc+JzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfUVQ6CisgICAgICAgICpzKysgPSAnIic7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTT0FQX0FQOgorICAgICAgICAqcysrID0gJ1wnJzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICcvJzoKKyAgICAgICAgaWYgKG4gPiAwKQorICAgICAgICB7IGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisgICAgICAgICAgaWYgKGMgPT0gU09BUF9HVCkKKyAgICAgICAgICAgIG4tLTsKKyAgICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICB9CisgICAgICAgICpzKysgPSAnLyc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnPCc6CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICpzKysgPSAoc29hcF93Y2hhciknPCc7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAqcysrID0gKHNvYXBfd2NoYXIpJyYnOworICAgICAgICAgIHQgPSAibHQ7IjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJz4nOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gKHNvYXBfd2NoYXIpJz4nOworICAgICAgICBlbHNlCisgICAgICAgIHsgKnMrKyA9IChzb2FwX3djaGFyKScmJzsKKyAgICAgICAgICB0ID0gImd0OyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICciJzoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9IChzb2FwX3djaGFyKSciJzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAoc29hcF93Y2hhciknJic7CisgICAgICAgICAgdCA9ICJxdW90OyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgKnMrKyA9ICh3Y2hhcl90KWMgJiAweDdGRkZGRkZGOworICAgICAgfQorICAgICAgbCsrOworICAgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiBtYXhsZW4gPj0gMCAmJiBsID4gbWF4bGVuKQorICAgICAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiU3RyaW5nIHRvbyBsb25nOiBtYXhsZW49JWxkXG4iLCBtYXhsZW4pKTsKKyAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0xFTkdUSDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgfQorICB9CitlbmQ6CisgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICpzID0gJ1wwJzsKKyAgc29hcF9zaXplX2Jsb2NrKHNvYXAsIHNpemVvZih3Y2hhcl90KSAqIChpICsgMSkpOworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIGwgPCBtaW5sZW4pCisgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlN0cmluZyB0b28gc2hvcnQ6ICVsZCBjaGFycywgbWlubGVuPSVsZFxuIiwgbCwgbWlubGVuKSk7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0xFTkdUSDsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBzID0gKHdjaGFyX3QqKXNvYXBfc2F2ZV9ibG9jayhzb2FwLCBOVUxMLCAwKTsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgICBzb2FwLT5kb20tPndpZGUgPSBzOworI2VuZGlmCisgIHJldHVybiBzOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9pbnQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4pCit7IHJldHVybiBzb2FwX2xvbmcycyhzb2FwLCAobG9uZyluKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRpbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBpbnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfbG9uZzJzKHNvYXAsIChsb25nKSpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMmludChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgaW50ICpwKQoreyBpZiAocykKKyAgeyBjaGFyICpyOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgc29hcF9yZXNldF9lcnJubzsKKyNlbmRpZgorI2VuZGlmCisgICAgKnAgPSAoaW50KXNvYXBfc3RydG9sKHMsICZyLCAxMCk7CisgICAgaWYgKChzID09IHIgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKSB8fCAqcgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgIHx8IHNvYXBfZXJybm8gPT0gU09BUF9FUkFOR0UKKyNlbmRpZgorI2VuZGlmCisgICAgKQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5pbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjppbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpzaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAoaW50Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YoaW50KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKGludCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihpbnQpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMmludChzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9sb25nMnMoc3RydWN0IHNvYXAgKnNvYXAsIGxvbmcgbikKK3sgc3ByaW50Zihzb2FwLT50bXBidWYsICIlbGQiLCBuKTsKKyAgcmV0dXJuIHNvYXAtPnRtcGJ1ZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRsb25nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgbG9uZyAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9sb25nMnMoc29hcCwgKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MybG9uZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgbG9uZyAqcCkKK3sgaWYgKHMpCisgIHsgY2hhciAqcjsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgIHNvYXBfcmVzZXRfZXJybm87CisjZW5kaWYKKyNlbmRpZgorICAgICpwID0gc29hcF9zdHJ0b2wocywgJnIsIDEwKTsKKyAgICBpZiAoKHMgPT0gciAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpIHx8ICpyCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgfHwgc29hcF9lcnJubyA9PSBTT0FQX0VSQU5HRQorI2VuZGlmCisjZW5kaWYKKyAgICApCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitsb25nICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5sb25nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGxvbmcgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6Ynl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9IChsb25nKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YobG9uZyksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChsb25nKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKGxvbmcpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMmxvbmcoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfTE9ORzY0MnMoc3RydWN0IHNvYXAgKnNvYXAsIExPTkc2NCBuKQoreyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgU09BUF9MT05HX0ZPUk1BVCwgbik7CisgIHJldHVybiBzb2FwLT50bXBidWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0TE9ORzY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgTE9ORzY0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX0xPTkc2NDJzKHNvYXAsICpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMkxPTkc2NChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgTE9ORzY0ICpwKQoreyBpZiAocykKKyAgeworI2lmZGVmIEhBVkVfU1RSVE9MTAorICAgIGNoYXIgKnI7CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBzb2FwX3Jlc2V0X2Vycm5vOworI2VuZGlmCisjZW5kaWYKKyAgICAqcCA9IHN0cnRvbGwocywgJnIsIDEwKTsKKyAgICBpZiAoKHMgPT0gciAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpIHx8ICpyCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgICB8fCBzb2FwX2Vycm5vID09IFNPQVBfRVJBTkdFCisjZW5kaWYKKyNlbmRpZgorICAgICAgKQorI2Vsc2UKKyMgaWZkZWYgSEFWRV9TU0NBTkYKKyAgICBpZiAoc3NjYW5mKHMsIFNPQVBfTE9OR19GT1JNQVQsIHApICE9IDEpCisjIGVuZGlmCisjZW5kaWYKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK0xPTkc2NCAqCitTT0FQX0ZNQUMyCitzb2FwX2luTE9ORzY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIExPTkc2NCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6aW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnBvc2l0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOm5lZ2F0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOm5vblBvc2l0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOm5vbk5lZ2F0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmxvbmciKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjppbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpzaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAoTE9ORzY0Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YoTE9ORzY0KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKExPTkc2NCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihMT05HNjQpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMkxPTkc2NChzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9ieXRlMnMoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgbikKK3sgcmV0dXJuIHNvYXBfbG9uZzJzKHNvYXAsIChsb25nKW4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dGJ5dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX2xvbmcycyhzb2FwLCAobG9uZykqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJieXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBjaGFyICpwKQoreyBpZiAocykKKyAgeyBsb25nIG47CisgICAgY2hhciAqcjsKKyAgICBuID0gc29hcF9zdHJ0b2wocywgJnIsIDEwKTsKKyAgICBpZiAocyA9PSByIHx8ICpyIHx8IG4gPCAtMTI4IHx8IG4gPiAxMjcpCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICAqcCA9IChjaGFyKW47CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX2luYnl0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBjaGFyICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpieXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKGNoYXIqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihjaGFyKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKGNoYXIqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YoY2hhciksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MyYnl0ZShzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9zaG9ydDJzKHN0cnVjdCBzb2FwICpzb2FwLCBzaG9ydCBuKQoreyByZXR1cm4gc29hcF9sb25nMnMoc29hcCwgKGxvbmcpbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0c2hvcnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzaG9ydCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9sb25nMnMoc29hcCwgKGxvbmcpKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3Myc2hvcnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHNob3J0ICpwKQoreyBpZiAocykKKyAgeyBsb25nIG47CisgICAgY2hhciAqcjsKKyAgICBuID0gc29hcF9zdHJ0b2wocywgJnIsIDEwKTsKKyAgICBpZiAocyA9PSByIHx8ICpyIHx8IG4gPCAtMzI3NjggfHwgbiA+IDMyNzY3KQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgKnAgPSAoc2hvcnQpbjsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitzaG9ydCAqCitTT0FQX0ZNQUMyCitzb2FwX2luc2hvcnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc2hvcnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6Ynl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9IChzaG9ydCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKHNob3J0KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKHNob3J0Kilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKHNob3J0KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJzaG9ydChzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9mbG9hdDJzKHN0cnVjdCBzb2FwICpzb2FwLCBmbG9hdCBuKQoreyBjb25zdCBjaGFyICpzOworICBpZiAoc29hcF9pc25hbigoZG91YmxlKW4pKQorICAgIHMgPSAiTmFOIjsKKyAgZWxzZSBpZiAoc29hcF9pc3BpbmZmKG4pKQorICAgIHMgPSAiSU5GIjsKKyAgZWxzZSBpZiAoc29hcF9pc25pbmZmKG4pKQorICAgIHMgPSAiLUlORiI7CisgIGVsc2UKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1Ziwgc29hcC0+ZmxvYXRfZm9ybWF0LCBuKTsKKyAgICBzID0gc29hcC0+dG1wYnVmOworICB9CisgIHJldHVybiBzOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dGZsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgZmxvYXQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfZmxvYXQycyhzb2FwLCAqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJmbG9hdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgZmxvYXQgKnApCit7IGlmIChzKQorICB7IGlmICghKnMpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgaWYgKCFzb2FwX3RhZ19jbXAocywgIklORiIpKQorICAgICAgKnAgPSBGTFRfUElORlRZOworICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAocywgIitJTkYiKSkKKyAgICAgICpwID0gRkxUX1BJTkZUWTsKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHMsICItSU5GIikpCisgICAgICAqcCA9IEZMVF9OSU5GVFk7CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChzLCAiTmFOIikpCisgICAgICAqcCA9IEZMVF9OQU47CisgICAgZWxzZQorICAgIHsKKy8qIE9uIHNvbWUgc3lzdGVtcywgc3RydG9mIGFwcGVhcnMgdG8gYmUgYnJva2VuIG9yIGRvZXNuJ3QgbGluazogdXNlIHdpdGggY2F1dGlvbiAqLworI2lmIGRlZmluZWQoSEFWRV9TVFJUT0YpCisgICAgICBjaGFyICpyOworICAgICAgKnAgPSBzdHJ0b2YoKGNoYXIqKXMsICZyKTsKKyAgICAgIGlmICgqcikKKyNlbGlmIGRlZmluZWQoSEFWRV9TVFJUT0QpCisgICAgICBjaGFyICpyOworICAgICAgKnAgPSAoZmxvYXQpc3RydG9kKHMsICZyKTsKKyAgICAgIGlmICgqcikKKyNlbmRpZgorI2lmZGVmIEhBVkVfU1NDQU5GCisgICAgICAgIGlmIChzc2NhbmYocywgIiVnIiwgcCkgIT0gMSkKKyAgICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyNlbHNlCisgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworI2VuZGlmCisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBpbnQgc29hcF9pc251bWVyaWMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnR5cGUpCit7IGlmIChzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpmbG9hdCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmRvdWJsZSIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmRlY2ltYWwiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjppbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6cG9zaXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bmVnYXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bm9uUG9zaXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bm9uTmVnYXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bG9uZyIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6Ynl0ZSIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkTG9uZyIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkSW50IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRTaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkQnl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBTT0FQX0VSUjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2Zsb2F0ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5mbG9hdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBmbG9hdCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZSAhPSAnXDAnICYmIHNvYXBfaXNudW1lcmljKHNvYXAsIHR5cGUpKQorICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgIHAgPSAoZmxvYXQqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihmbG9hdCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChmbG9hdCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihmbG9hdCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MyZmxvYXQoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZG91YmxlMnMoc3RydWN0IHNvYXAgKnNvYXAsIGRvdWJsZSBuKQoreyBjb25zdCBjaGFyICpzOworICBpZiAoc29hcF9pc25hbihuKSkKKyAgICBzID0gIk5hTiI7CisgIGVsc2UgaWYgKHNvYXBfaXNwaW5mZChuKSkKKyAgICBzID0gIklORiI7CisgIGVsc2UgaWYgKHNvYXBfaXNuaW5mZChuKSkKKyAgICBzID0gIi1JTkYiOworICBlbHNlCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsIHNvYXAtPmRvdWJsZV9mb3JtYXQsIG4pOworICAgIHMgPSBzb2FwLT50bXBidWY7CisgIH0KKyAgcmV0dXJuIHM7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0ZG91YmxlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgZG91YmxlICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX2RvdWJsZTJzKHNvYXAsICpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMmRvdWJsZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgZG91YmxlICpwKQoreyBpZiAocykKKyAgeyBpZiAoISpzKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIGlmICghc29hcF90YWdfY21wKHMsICJJTkYiKSkKKyAgICAgICpwID0gREJMX1BJTkZUWTsKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHMsICIrSU5GIikpCisgICAgICAqcCA9IERCTF9QSU5GVFk7CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChzLCAiLUlORiIpKQorICAgICAgKnAgPSBEQkxfTklORlRZOworICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAocywgIk5hTiIpKQorICAgICAgKnAgPSBEQkxfTkFOOworICAgIGVsc2UKKyAgICB7CisjaWZkZWYgSEFWRV9TVFJUT0QKKyAgICAgIGNoYXIgKnI7CisgICAgICAqcCA9IHN0cnRvZChzLCAmcik7CisgICAgICBpZiAoKnIpCisjZW5kaWYKKyNpZmRlZiBIQVZFX1NTQ0FORgorICAgICAgICBpZiAoc3NjYW5mKHMsICIlbGciLCBwKSAhPSAxKQorICAgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworI2Vsc2UKKyAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisjZW5kaWYKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorZG91YmxlICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5kb3VibGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgZG91YmxlICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlICE9ICdcMCcgJiYgc29hcF9pc251bWVyaWMoc29hcCwgdHlwZSkpCisgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgcCA9IChkb3VibGUqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihkb3VibGUpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAoZG91YmxlKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKGRvdWJsZSksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MyZG91YmxlKHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3Vuc2lnbmVkQnl0ZTJzKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBjaGFyIG4pCit7IHJldHVybiBzb2FwX3Vuc2lnbmVkTG9uZzJzKHNvYXAsICh1bnNpZ25lZCBsb25nKW4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHVuc2lnbmVkQnl0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfdW5zaWduZWRMb25nMnMoc29hcCwgKHVuc2lnbmVkIGxvbmcpKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MydW5zaWduZWRCeXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBjaGFyICpwKQoreyBpZiAocykKKyAgeyB1bnNpZ25lZCBsb25nIG47CisgICAgY2hhciAqcjsKKyAgICBuID0gc29hcF9zdHJ0b3VsKHMsICZyLCAxMCk7CisgICAgaWYgKHMgPT0gciB8fCAqciB8fCBuID4gMjU1KQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgKnAgPSAodW5zaWduZWQgY2hhciluOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3Vuc2lnbmVkIGNoYXIgKgorU09BUF9GTUFDMgorc29hcF9pbnVuc2lnbmVkQnl0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB1bnNpZ25lZCBjaGFyICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAodW5zaWduZWQgY2hhciopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAodW5zaWduZWQgY2hhciopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZih1bnNpZ25lZCBjaGFyKSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJ1bnNpZ25lZEJ5dGUoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfdW5zaWduZWRTaG9ydDJzKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBzaG9ydCBuKQoreyByZXR1cm4gc29hcF91bnNpZ25lZExvbmcycyhzb2FwLCAodW5zaWduZWQgbG9uZyluKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXR1bnNpZ25lZFNob3J0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgdW5zaWduZWQgc2hvcnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfdW5zaWduZWRMb25nMnMoc29hcCwgKHVuc2lnbmVkIGxvbmcpKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MydW5zaWduZWRTaG9ydChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgdW5zaWduZWQgc2hvcnQgKnApCit7IGlmIChzKQorICB7IHVuc2lnbmVkIGxvbmcgbjsKKyAgICBjaGFyICpyOworICAgIG4gPSBzb2FwX3N0cnRvdWwocywgJnIsIDEwKTsKKyAgICBpZiAocyA9PSByIHx8ICpyIHx8IG4gPiA2NTUzNSkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgICpwID0gKHVuc2lnbmVkIHNob3J0KW47CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordW5zaWduZWQgc2hvcnQgKgorU09BUF9GTUFDMgorc29hcF9pbnVuc2lnbmVkU2hvcnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgdW5zaWduZWQgc2hvcnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkU2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAodW5zaWduZWQgc2hvcnQqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZih1bnNpZ25lZCBzaG9ydCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9ICh1bnNpZ25lZCBzaG9ydCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZih1bnNpZ25lZCBzaG9ydCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MydW5zaWduZWRTaG9ydChzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF91bnNpZ25lZEludDJzKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBpbnQgbikKK3sgcmV0dXJuIHNvYXBfdW5zaWduZWRMb25nMnMoc29hcCwgKHVuc2lnbmVkIGxvbmcpbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0dW5zaWduZWRJbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCB1bnNpZ25lZCBpbnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfdW5zaWduZWRMb25nMnMoc29hcCwgKHVuc2lnbmVkIGxvbmcpKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MydW5zaWduZWRJbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCAqcCkKK3sgaWYgKHMpCisgIHsgY2hhciAqcjsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgIHNvYXBfcmVzZXRfZXJybm87CisjZW5kaWYKKyNlbmRpZgorICAgICpwID0gKHVuc2lnbmVkIGludClzb2FwX3N0cnRvdWwocywgJnIsIDEwKTsKKyAgICBpZiAoKHMgPT0gciAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpIHx8ICpyCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgfHwgc29hcF9lcnJubyA9PSBTT0FQX0VSQU5HRQorI2VuZGlmCisjZW5kaWYKKyAgICApCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit1bnNpZ25lZCBpbnQgKgorU09BUF9GTUFDMgorc29hcF9pbnVuc2lnbmVkSW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIGludCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRJbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZFNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRCeXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKHVuc2lnbmVkIGludCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKHVuc2lnbmVkIGludCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9ICh1bnNpZ25lZCBpbnQqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YodW5zaWduZWQgaW50KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJ1bnNpZ25lZEludChzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF91bnNpZ25lZExvbmcycyhzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgbG9uZyBuKQoreyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIiVsdSIsIG4pOworICByZXR1cm4gc29hcC0+dG1wYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHVuc2lnbmVkTG9uZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfdW5zaWduZWRMb25nMnMoc29hcCwgKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MydW5zaWduZWRMb25nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBsb25nICpwKQoreyBpZiAocykKKyAgeyBjaGFyICpyOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgc29hcF9yZXNldF9lcnJubzsKKyNlbmRpZgorI2VuZGlmCisgICAgKnAgPSBzb2FwX3N0cnRvdWwocywgJnIsIDEwKTsKKyAgICBpZiAoKHMgPT0gciAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpIHx8ICpyCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgfHwgc29hcF9lcnJubyA9PSBTT0FQX0VSQU5HRQorI2VuZGlmCisjZW5kaWYKKyAgICApCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit1bnNpZ25lZCBsb25nICoKK1NPQVBfRk1BQzIKK3NvYXBfaW51bnNpZ25lZExvbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgdW5zaWduZWQgbG9uZyAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRJbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZFNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRCeXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKHVuc2lnbmVkIGxvbmcqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZih1bnNpZ25lZCBsb25nKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKHVuc2lnbmVkIGxvbmcqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YodW5zaWduZWQgbG9uZyksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MydW5zaWduZWRMb25nKHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX1VMT05HNjQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgVUxPTkc2NCBuKQoreyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgU09BUF9VTE9OR19GT1JNQVQsIG4pOworICByZXR1cm4gc29hcC0+dG1wYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dFVMT05HNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBVTE9ORzY0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX1VMT05HNjQycyhzb2FwLCAqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJVTE9ORzY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBVTE9ORzY0ICpwKQoreyBpZiAocykKKyAgeworI2lmZGVmIEhBVkVfU1RSVE9VTEwKKyAgICBjaGFyICpyOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgc29hcF9yZXNldF9lcnJubzsKKyNlbmRpZgorI2VuZGlmCisgICAgKnAgPSBzdHJ0b3VsbChzLCAmciwgMTApOworICAgIGlmICgocyA9PSByICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkgfHwgKnIKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgIHx8IHNvYXBfZXJybm8gPT0gU09BUF9FUkFOR0UKKyNlbmRpZgorI2VuZGlmCisgICAgICApCisjZWxzZQorIyBpZmRlZiBIQVZFX1NTQ0FORgorICAgIGlmIChzc2NhbmYocywgU09BUF9VTE9OR19GT1JNQVQsIHApICE9IDEpCisjIGVuZGlmCisjZW5kaWYKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK1VMT05HNjQgKgorU09BUF9GTUFDMgorc29hcF9pblVMT05HNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgVUxPTkc2NCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpwb3NpdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpub25OZWdhdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZExvbmciKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkU2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwID0gKFVMT05HNjQqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihVTE9ORzY0KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKFVMT05HNjQqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YoVUxPTkc2NCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MyVUxPTkc2NChzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJzdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGNoYXIgKip0KQoreyAqdCA9IE5VTEw7CisgIGlmIChzKQorICB7IGlmICghKCp0ID0gc29hcF9zdHJkdXAoc29hcCwgcykpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgaWYgKCEoc29hcC0+bW9kZSAmIChTT0FQX0VOQ19MQVRJTiB8IFNPQVBfQ19VVEZTVFJJTkcpKSkKKyAgICB7IC8qIFRPRE86IGNvbnNpZGVyIHRydW5jYXRpbmcgVVRGOCB0byBBU0NJSSBmb3IgcmVndWxhciBYTUwgYXR0cmlidXRlIHN0cmluZ3M/ICovCisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMlFOYW1lKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBjaGFyICoqdCkKK3sgaWYgKHMpCisgIHsgc3RydWN0IHNvYXBfbmxpc3QgKm5wOworICAgIGNvbnN0IGNoYXIgKnA7CisgICAgaWYgKCFzdHJuY21wKHMsICJ4bWw6IiwgNCkpCisgICAgeyAqdCA9IHNvYXBfc3RyZHVwKHNvYXAsIHMpOworICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgfQorICAgIG5wID0gc29hcC0+bmxpc3Q7CisgICAgcCA9IHN0cmNocihzLCAnOicpOworICAgIGlmIChwKQorICAgIHsgcmVnaXN0ZXIgaW50IG4gPSBwIC0gczsKKyAgICAgIHdoaWxlIChucCAmJiAoc3RybmNtcChucC0+aWQsIHMsIG4pIHx8IG5wLT5pZFtuXSkpCisgICAgICAgIG5wID0gbnAtPm5leHQ7CisgICAgICBwKys7CisgICAgfQorICAgIGVsc2UKKyAgICB7IHdoaWxlIChucCAmJiAqbnAtPmlkKQorICAgICAgICBucCA9IG5wLT5uZXh0OworICAgICAgcCA9IHM7CisgICAgfQorICAgIGlmIChucCkKKyAgICB7IGlmIChucC0+aW5kZXggPj0gMCAmJiBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzKQorICAgICAgeyByZWdpc3RlciBjb25zdCBjaGFyICpxID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tucC0+aW5kZXhdLmlkOworICAgICAgICBpZiAocSkKKyAgICAgICAgeyBpZiAoKCp0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihwKSArIHN0cmxlbihxKSArIDIpKSkKKyAgICAgICAgICAgIHNwcmludGYoKnQsICIlczolcyIsIHEsIHApOworICAgICAgICAgIHJldHVybiBTT0FQX09LOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAobnAtPm5zKQorICAgICAgeyBpZiAoKCp0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihwKSArIHN0cmxlbihucC0+bnMpICsgNCkpKQorICAgICAgICAgIHNwcmludGYoKnQsICJcIiVzXCI6JXMiLCBucC0+bnMsIHApOworICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICAgIH0KKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTmFtZXNwYWNlIHByZWZpeCBvZiAnJXMnIG5vdCBkZWZpbmVkIChpbmRleD0lZCwgVVJJPSVzKVxuIiwgcywgbnAtPmluZGV4LCBucC0+bnM/bnAtPm5zOiIiKSk7CisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX05BTUVTUEFDRTsgCisgICAgfQorICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTmFtZXNwYWNlIHByZWZpeCBvZiAnJXMnIG5vdCBkZWZpbmVkLCBhc3N1bWluZyBlbXB0eSBuYW1lc3BhY2VcbiIsIHMpKTsKKyAgICBpZiAoKCp0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihwKSArIDQpKSkKKyAgICAgIHNwcmludGYoKnQsICJcIlwiOiVzIiwgcCk7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfUU5hbWUycyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcykKK3sgc3RydWN0IE5hbWVzcGFjZSAqcDsKKyAgY2hhciAqdDsKKyAgaW50IG47CisgIGlmICghcyB8fCAqcyAhPSAnIicpCisgIHsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKHMgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpKQorICAgIHsgdCA9IChjaGFyKilzdHJjaHIocywgJzonKTsKKyAgICAgIGlmICh0KQorICAgICAgICBzb2FwX3V0aWxpemVfbnMoc29hcCwgcywgdCAtIHMpOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBzOworICB9CisgIHMrKzsKKyAgaWYgKChwID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlcykpCisgIHsgZm9yICg7IHAtPmlkOyBwKyspCisgICAgeyBpZiAocC0+bnMpCisgICAgICAgIGlmICghc29hcF90YWdfY21wKHMsIHAtPm5zKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIGlmIChwLT5pbikKKyAgICAgICAgaWYgKCFzb2FwX3RhZ19jbXAocywgcC0+aW4pKQorICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAocCAmJiBwLT5pZCkKKyAgICB7IHMgPSBzdHJjaHIocywgJyInKTsKKyAgICAgIGlmIChzKQorICAgICAgeyB0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihwLT5pZCkgKyBzdHJsZW4ocykpOworICAgICAgICBzdHJjcHkodCwgcC0+aWQpOworCXN0cmNhdCh0LCBzICsgMSk7CisgICAgICAgIHJldHVybiB0OworICAgICAgfQorICAgIH0KKyAgfQorICB0ID0gKGNoYXIqKXN0cmNocihzLCAnIicpOworICBpZiAodCkKKyAgICBuID0gdCAtIHM7CisgIGVsc2UKKyAgICBuID0gMDsKKyAgdCA9IHNvYXBfc3RyZHVwKHNvYXAsIHMpOworICB0W25dID0gJ1wwJzsKKyAgc3ByaW50Zihzb2FwLT50bXBidWYsICJ4bWxuczpfJWQiLCBzb2FwLT5pZG51bSsrKTsKKyAgc29hcF9zZXRfYXR0cihzb2FwLCBzb2FwLT50bXBidWYsIHQpOworICBzID0gc3RyY2hyKHMsICciJyk7CisgIGlmIChzKQorICB7IHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc3RybGVuKHNvYXAtPnRtcGJ1ZikgKyBzdHJsZW4ocykgLSA2KTsKKyAgICBzdHJjcHkodCwgc29hcC0+dG1wYnVmICsgNik7CisgICAgc3RyY2F0KHQsIHMgKyAxKTsKKyAgfQorICByZXR1cm4gdDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMndjaGFyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCB3Y2hhcl90ICoqdCkKK3sgd2NoYXJfdCAqcjsKKyAgaWYgKCFzKQorICAgICp0ID0gTlVMTDsKKyAgZWxzZQorICB7ICp0ID0gciA9ICh3Y2hhcl90Kilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yod2NoYXJfdCkgKiAoc3RybGVuKHMpICsgMSkpOworICAgIGlmICghcikKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0xBVElOKQorICAgIHsgd2hpbGUgKCpzKQorICAgICAgICAqcisrID0gKHdjaGFyX3QpKnMrKzsKKyAgICB9CisgICAgZWxzZQorICAgIHsgLyogQ29udmVydCBVVEY4IHRvIHdjaGFyICovCisgICAgICB3aGlsZSAoKnMpCisgICAgICB7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYywgYzEsIGMyLCBjMywgYzQ7CisgICAgICAgIGMgPSAqcysrOworICAgICAgICBpZiAoYyA8IDB4ODApCisJICAqcisrID0gKHdjaGFyX3QpYzsKKwllbHNlCisgICAgICAgIHsgYzEgPSAoc29hcF93Y2hhcikqcysrICYgMHgzRjsKKyAgICAgICAgICBpZiAoYyA8IDB4RTApCisgICAgICAgICAgICAqcisrID0gKHdjaGFyX3QpKCgoc29hcF93Y2hhcikoYyAmIDB4MUYpIDw8IDYpIHwgYzEpOworICAgICAgICAgIGVsc2UKKwkgIHsgYzIgPSAoc29hcF93Y2hhcikqcysrICYgMHgzRjsKKyAgICAgICAgICAgIGlmIChjIDwgMHhGMCkKKyAgICAgICAgICAgICAgKnIrKyA9ICh3Y2hhcl90KSgoKHNvYXBfd2NoYXIpKGMgJiAweDBGKSA8PCAxMikgfCAoYzEgPDwgNikgfCBjMik7CisgICAgICAgICAgICBlbHNlCisJICAgIHsgYzMgPSAoc29hcF93Y2hhcikqcysrICYgMHgzRjsKKyAgICAgICAgICAgICAgaWYgKGMgPCAweEY4KQorICAgICAgICAgICAgICAgICpyKysgPSAod2NoYXJfdCkoKChzb2FwX3djaGFyKShjICYgMHgwNykgPDwgMTgpIHwgKGMxIDw8IDEyKSB8IChjMiA8PCA2KSB8IGMzKTsKKyAgICAgICAgICAgICAgZWxzZQorCSAgICAgIHsgYzQgPSAoc29hcF93Y2hhcikqcysrICYgMHgzRjsKKyAgICAgICAgICAgICAgICBpZiAoYyA8IDB4RkMpCisgICAgICAgICAgICAgICAgICAqcisrID0gKHdjaGFyX3QpKCgoc29hcF93Y2hhcikoYyAmIDB4MDMpIDw8IDI0KSB8IChjMSA8PCAxOCkgfCAoYzIgPDwgMTIpIHwgKGMzIDw8IDYpIHwgYzQpOworICAgICAgICAgICAgICAgIGVsc2UKKwkJICAqcisrID0gKHdjaGFyX3QpKCgoc29hcF93Y2hhcikoYyAmIDB4MDEpIDw8IDMwKSB8IChjMSA8PCAyNCkgfCAoYzIgPDwgMTgpIHwgKGMzIDw8IDEyKSB8IChjNCA8PCA2KSB8IChzb2FwX3djaGFyKSgqcysrICYgMHgzRikpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgICpyID0gTCdcMCc7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF93Y2hhcjJzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB3Y2hhcl90ICpzKQoreyByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIHJlZ2lzdGVyIGNoYXIgKnIsICp0OworICBjb25zdCB3Y2hhcl90ICpxID0gczsKKyAgc2l6ZV90IG4gPSAwOworICB3aGlsZSAoKGMgPSAqcSsrKSkKKyAgeyBpZiAoYyA+IDAgJiYgYyA8IDB4ODApCisgICAgICBuKys7CisgICAgZWxzZQorICAgICAgbiArPSA2OworICB9CisgIHIgPSB0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIG4gKyAxKTsKKyAgaWYgKHIpCisgIHsgLyogQ29udmVydCB3Y2hhciB0byBVVEY4ICovCisgICAgd2hpbGUgKChjID0gKnMrKykpCisgICAgeyBpZiAoYyA+IDAgJiYgYyA8IDB4ODApCisgICAgICAgICp0KysgPSAoY2hhciljOworICAgICAgZWxzZQorICAgICAgeyBpZiAoYyA8IDB4MDgwMCkKKyAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4QzAgfCAoKGMgPj4gNikgJiAweDFGKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyBpZiAoYyA8IDB4MDEwMDAwKQorICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEUwIHwgKChjID4+IDEyKSAmIDB4MEYpKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeyBpZiAoYyA8IDB4MjAwMDAwKQorICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjAgfCAoKGMgPj4gMTgpICYgMHgwNykpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyBpZiAoYyA8IDB4MDQwMDAwMDApCisgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEY4IHwgKChjID4+IDI0KSAmIDB4MDMpKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7ICp0KysgPSAoY2hhcikoMHhGQyB8ICgoYyA+PiAzMCkgJiAweDAxKSk7CisgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDI0KSAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTgpICYgMHgzRikpOworICAgICAgICAgICAgfSAgICAgCisgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTIpICYgMHgzRikpOworICAgICAgICAgIH0KKyAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gNikgJiAweDNGKSk7CisgICAgICAgIH0KKyAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKGMgJiAweDNGKSk7CisgICAgICB9CisgICAgfQorICAgICp0ID0gJ1wwJzsKKyAgfQorICByZXR1cm4gcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRzdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjaGFyICpjb25zdCpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikgCit7IGlkID0gc29hcF9lbGVtZW50X2lkKHNvYXAsIHRhZywgaWQsICpwLCBOVUxMLCAwLCB0eXBlLCBuKTsKKyAgaWYgKGlkIDwgMAorICAgfHwgc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIGlkLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsICpwLCAwKQorICAgfHwgc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqKgorU09BUF9GTUFDMgorc29hcF9pbnN0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBjaGFyICoqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQsIGludCBmbGFnLCBsb25nIG1pbmxlbiwgbG9uZyBtYXhsZW4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAxKSkKKyAgeyBpZiAoIXRhZyB8fCAqdGFnICE9ICctJyB8fCBzb2FwLT5lcnJvciAhPSBTT0FQX05PX1RBRykKKyAgICAgIHJldHVybiBOVUxMOworICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgfQorICBpZiAoIXApCisgICAgaWYgKCEocCA9IChjaGFyKiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKGNoYXIqKSkpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIGlmIChzb2FwLT5ib2R5KQorICB7ICpwID0gc29hcF9zdHJpbmdfaW4oc29hcCwgZmxhZywgbWlubGVuLCBtYXhsZW4pOworICAgIGlmICghKnAgfHwgIShjaGFyKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCAqcCwgdCwgc2l6ZW9mKGNoYXIqKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBlbHNlIGlmIChzb2FwLT5udWxsKQorICAgICpwID0gTlVMTDsKKyAgZWxzZQorICAgICpwID0gKGNoYXIqKVNPQVBfU1RSX0VPUzsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAoY2hhcioqKXNvYXBfaWRfbG9va3VwKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopcCwgdCwgc2l6ZW9mKGNoYXIqKiksIDApOworICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHdzdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCB3Y2hhcl90ICpjb25zdCpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikgCit7IGlkID0gc29hcF9lbGVtZW50X2lkKHNvYXAsIHRhZywgaWQsICpwLCBOVUxMLCAwLCB0eXBlLCBuKTsKKyAgaWYgKGlkIDwgMAorICAgfHwgc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIGlkLCB0eXBlKQorICAgfHwgc29hcF93c3RyaW5nX291dChzb2FwLCAqcCwgMCkKKyAgIHx8IHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZykpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQord2NoYXJfdCAqKgorU09BUF9GTUFDMgorc29hcF9pbndzdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgd2NoYXJfdCAqKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0LCBsb25nIG1pbmxlbiwgbG9uZyBtYXhsZW4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAxKSkKKyAgeyBpZiAoIXRhZyB8fCAqdGFnICE9ICctJyB8fCBzb2FwLT5lcnJvciAhPSBTT0FQX05PX1RBRykKKyAgICAgIHJldHVybiBOVUxMOworICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgfQorICBpZiAoIXApCisgICAgaWYgKCEocCA9ICh3Y2hhcl90Kiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHdjaGFyX3QqKSkpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIGlmIChzb2FwLT5ib2R5KQorICB7ICpwID0gc29hcF93c3RyaW5nX2luKHNvYXAsIDEsIG1pbmxlbiwgbWF4bGVuKTsKKyAgICBpZiAoISpwIHx8ICEod2NoYXJfdCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgKnAsIHQsIHNpemVvZih3Y2hhcl90KiksIDAsIE5VTEwsIE5VTEwsIE5VTEwpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZWxzZSBpZiAoc29hcC0+bnVsbCkKKyAgICAqcCA9IE5VTEw7CisgIGVsc2UKKyAgICAqcCA9ICh3Y2hhcl90KilTT0FQX1NUUl9FT1M7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKHdjaGFyX3QqKilzb2FwX2lkX2xvb2t1cChzb2FwLCBzb2FwLT5ocmVmLCAodm9pZCoqKXAsIHQsIHNpemVvZih3Y2hhcl90KiopLCAwKTsKKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIHRpbWVfdAorc29hcF90aW1lZ20oc3RydWN0IHRtICpUKQoreworI2lmIGRlZmluZWQoSEFWRV9USU1FR00pCisgIHJldHVybiB0aW1lZ20oVCk7CisjZWxzZQorICB0aW1lX3QgdCwgZywgejsKKyNpZmRlZiBIQVZFX0dNVElNRV9SCisgIHN0cnVjdCB0bSB0bSwgKnRtcCA9ICZ0bTsKKyNlbHNlCisgIHN0cnVjdCB0bSAqdG1wOworI2VuZGlmCisgIHQgPSBta3RpbWUoVCk7CisgIGlmICh0ID09IC0xKQorICAgIHJldHVybiAtMTsKKyNpZmRlZiBIQVZFX0dNVElNRV9SCisgIGdtdGltZV9yKCZ0LCB0bXApOworI2Vsc2UKKyAgdG1wID0gZ210aW1lKCZ0KTsKKyNlbmRpZgorICB0bXAtPnRtX2lzZHN0ID0gMDsKKyAgZyA9IG1rdGltZSh0bXApOworICBpZiAoZyA9PSAtMSkKKyAgICByZXR1cm4gLTE7CisgIHogPSBnIC0gdDsKKyAgcmV0dXJuIHQgLSB6OworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9kYXRlVGltZTJzKHN0cnVjdCBzb2FwICpzb2FwLCB0aW1lX3QgbikKK3sgc3RydWN0IHRtIFQsICpwVCA9ICZUOworI2lmIGRlZmluZWQoSEFWRV9HTVRJTUVfUikKKyAgaWYgKGdtdGltZV9yKCZuLCBwVCkpCisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTWiIsIHBUKTsKKyAgLyogVGhlIGZvbGxvd2luZyBkZWZpbmVzIHdlcmUgYWRkZWQgZm9yIFZ4V29ya3MqLworI2VsaWYgZGVmaW5lZChIQVZFX1BHTVRJTUVfUikKKyAgaWYgKGdtdGltZV9yKCZuLCBwVCkpCisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTWiIsIHBUKTsKKyNlbGlmIGRlZmluZWQoSEFWRV9QR01USU1FKQorICBpZiAoZ210aW1lKCZuLCBwVCkpCisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTWiIsIHBUKTsKKyNlbGlmIGRlZmluZWQoSEFWRV9HTVRJTUUpCisgIGlmICgocFQgPSBnbXRpbWUoJm4pKSkKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVNaIiwgcFQpOworI2VsaWYgZGVmaW5lZChIQVZFX0dFVFRJTUVPRkRBWSkKKyAgc3RydWN0IHRpbWV6b25lIHR6OworICBtZW1zZXQoKHZvaWQqKSZ0eiwgMCwgc2l6ZW9mKHR6KSk7CisjIGlmIGRlZmluZWQoSEFWRV9MT0NBTFRJTUVfUikKKyAgaWYgKGxvY2FsdGltZV9yKCZuLCBwVCkpCisgIHsgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgZ2V0dGltZW9mZGF5KCZ0diwgJnR6KTsKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwVCk7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYgKyBzdHJsZW4oc29hcC0+dG1wYnVmKSwgIiUrMDNkOiUwMmQiLCAtdHoudHpfbWludXRlc3dlc3QvNjArKHBULT50bV9pc2RzdCE9MCksIGFicyh0ei50el9taW51dGVzd2VzdCklNjApOworICB9CisjIGVsc2UKKyAgaWYgKChwVCA9IGxvY2FsdGltZSgmbikpKQorICB7IHN0cnVjdCB0aW1ldmFsIHR2OworICAgIGdldHRpbWVvZmRheSgmdHYsICZ0eik7CisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmICsgc3RybGVuKHNvYXAtPnRtcGJ1ZiksICIlKzAzZDolMDJkIiwgLXR6LnR6X21pbnV0ZXN3ZXN0LzYwKyhwVC0+dG1faXNkc3QhPTApLCBhYnModHoudHpfbWludXRlc3dlc3QpJTYwKTsKKyAgfQorI2VuZGlmCisjZWxpZiBkZWZpbmVkKEhBVkVfRlRJTUUpCisgIHN0cnVjdCB0aW1lYiB0OworICBtZW1zZXQoKHZvaWQqKSZ0LCAwLCBzaXplb2YodCkpOworIyBpZiBkZWZpbmVkKEhBVkVfTE9DQUxUSU1FX1IpCisgIGlmIChsb2NhbHRpbWVfcigmbiwgcFQpKQorICB7IGZ0aW1lKCZ0KTsKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwVCk7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYgKyBzdHJsZW4oc29hcC0+dG1wYnVmKSwgIiUrMDNkOiUwMmQiLCAtdC50aW1lem9uZS82MCsocFQtPnRtX2lzZHN0IT0wKSwgYWJzKHQudGltZXpvbmUpJTYwKTsKKyAgfQorICAvKiBUaGUgZm9sbG93aW5nIGRlZmluZXMgd2VyZSBhZGRlZCBmb3IgVnhXb3JrcyovCisjIGVsaWYgZGVmaW5lZChIQVZFX1BMT0NBTFRJTUVfUikKKyAgaWYgKGxvY2FsdGltZV9yKCZuLCBwVCkpCisgIHsgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmK3N0cmxlbihzb2FwLT50bXBidWYpLCAiJSswM2Q6JTAyZCIsIHQudGltZXpvbmUvNjAsIGFicyh0LnRpbWV6b25lKSU2MCk7CisgIH0KKyMgZWxzZQorICBpZiAoKHBUID0gbG9jYWx0aW1lKCZuKSkpCisgIHsgZnRpbWUoJnQpOworICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIHN0cmxlbihzb2FwLT50bXBidWYpLCAiJSswM2Q6JTAyZCIsIC10LnRpbWV6b25lLzYwKyhwVC0+dG1faXNkc3QhPTApLCBhYnModC50aW1lem9uZSklNjApOworICB9CisjIGVuZGlmCisjZWxpZiBkZWZpbmVkKEhBVkVfTE9DQUxUSU1FX1IpCisgIGlmIChsb2NhbHRpbWVfcigmbiwgcFQpKQorICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyAgLyogVGhlIGZvbGxvd2luZyBkZWZpbmVzIHdlcmUgYWRkZWQgZm9yIFZ4V29ya3MqLworI2VsaWYgZGVmaW5lZChIQVZFX1BMT0NBTFRJTUVfUikKKyAgaWYgKGxvY2FsdGltZV9yKCZuLCBwVCkpCisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworI2Vsc2UKKyAgaWYgKChwVCA9IGxvY2FsdGltZSgmbikpKQorICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyNlbmRpZgorICBlbHNlCisgICAgc3RyY3B5KHNvYXAtPnRtcGJ1ZiwgIjE5NjktMTItMzFUMjM6NTk6NTlaIik7CisgIHJldHVybiBzb2FwLT50bXBidWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0ZGF0ZVRpbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCB0aW1lX3QgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfZGF0ZVRpbWUycyhzb2FwLCAqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJkYXRlVGltZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgdGltZV90ICpwKQoreyBpZiAocykKKyAgeyBzdHJ1Y3QgdG0gVDsKKyAgICBjaGFyIHpvbmVbMTZdOworICAgIGNvbnN0IGNoYXIgKnQ7CisgICAgbWVtc2V0KCh2b2lkKikmVCwgMCwgc2l6ZW9mKFQpKTsKKyAgICB6b25lW3NpemVvZih6b25lKS0xXSA9ICdcMCc7CisgICAgaWYgKHN0cmNocihzLCAnLScpKQorICAgICAgdCA9ICIlZC0lZC0lZFQlZDolZDolZCUxNXMiOworICAgIGVsc2UgaWYgKHN0cmNocihzLCAnOicpKQorICAgICAgdCA9ICIlNGQlMmQlMmRUJWQ6JWQ6JWQlMTVzIjsKKyAgICBlbHNlIC8qIHBhcnNlIG5vbi1YU0Qtc3RhbmRhcmQgYWx0ZXJuYXRpdmUgSVNPIDg2MDEgZm9ybWF0ICovCisgICAgICB0ID0gIiU0ZCUyZCUyZFQlMmQlMmQlMmQlMTVzIjsKKyAgICBzc2NhbmYocywgdCwgJlQudG1feWVhciwgJlQudG1fbW9uLCAmVC50bV9tZGF5LCAmVC50bV9ob3VyLCAmVC50bV9taW4sICZULnRtX3NlYywgem9uZSk7CisgICAgaWYgKFQudG1feWVhciA9PSAxKQorICAgICAgVC50bV95ZWFyID0gNzA7CisgICAgZWxzZQorICAgICAgVC50bV95ZWFyIC09IDE5MDA7CisgICAgVC50bV9tb24tLTsKKyAgICBpZiAoKnpvbmUpCisgICAgeyBpZiAoKnpvbmUgPT0gJy4nKQorICAgICAgeyBmb3IgKHMgPSB6b25lICsgMTsgKnM7IHMrKykKKyAgICAgICAgICBpZiAoKnMgPCAnMCcgfHwgKnMgPiAnOScpCisgICAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcyA9IHpvbmU7CisgICAgICBpZiAoKnMgPT0gJysnIHx8ICpzID09ICctJykKKyAgICAgIHsgaW50IGggPSAwLCBtID0gMDsKKyAgICAgICAgaWYgKHNbM10gPT0gJzonKQorCXsgc3NjYW5mKHMsICIlZDolZCIsICZoLCAmbSk7CisJICBpZiAoaCA8IDApCisJICAgIG0gPSAtbTsKKwl9CisJZWxzZQorCXsgbSA9IChpbnQpYXRvbChzKTsKKwkgIGggPSBtIC8gMTAwOworCSAgbSA9IG0gJSAxMDA7CisJfQorICAgICAgICBULnRtX2hvdXIgLT0gaDsKKyAgICAgICAgVC50bV9taW4gLT0gbTsKKyAgICAgIH0KKyAgICAgIFQudG1faXNkc3QgPSAwOworICAgICAgKnAgPSBzb2FwX3RpbWVnbSgmVCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IFQudG1faXNkc3QgPSAtMTsKKyAgICAgICpwID0gbWt0aW1lKCZUKTsgLyogbm8gdGltZSB6b25lOiBzdXBwb3NlIGl0IGlzIGxvY2FsdGltZT8gKi8KKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQordGltZV90ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5kYXRlVGltZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB0aW1lX3QgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6ZGF0ZVRpbWUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwID0gKHRpbWVfdCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKHRpbWVfdCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9ICh0aW1lX3QqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YodGltZV90KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJkYXRlVGltZShzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0bGl0ZXJhbChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBjaGFyICpjb25zdCpwKQoreyBpbnQgaTsKKyAgY29uc3QgY2hhciAqdCA9IE5VTEw7CisgIGlmICh0YWcgJiYgKnRhZyAhPSAnLScpCisgIHsgaWYgKHNvYXAtPmxvY2FsX25hbWVzcGFjZXMgJiYgKHQgPSBzdHJjaHIodGFnLCAnOicpKSkKKyAgICB7IHN0cm5jcHkoc29hcC0+dG1wYnVmLCB0YWcsIHQtdGFnKTsKKyAgICAgIHNvYXAtPnRtcGJ1Zlt0LXRhZ10gPSAnXDAnOworICAgICAgZm9yIChpID0gMDsgc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tpXS5pZDsgaSsrKQorICAgICAgICBpZiAoIXN0cmNtcChzb2FwLT50bXBidWYsIHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0uaWQpKQorICAgICAgICAgIGJyZWFrOworICAgICAgdCsrOworICAgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICI8JXMgeG1sbnM9XCIlc1wiPiIsIHQsIHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0ubnMgPyBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW2ldLm5zIDogU09BUF9TVFJfRU9TKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgdCA9IHRhZzsKKyAgICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiPCVzPiIsIHRhZyk7CisgICAgfQorICAgIGlmIChzb2FwX3NlbmQoc29hcCwgc29hcC0+dG1wYnVmKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAocCAmJiAqcCkKKyAgeyBpZiAoc29hcF9zZW5kKHNvYXAsICpwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAodCkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIjwvJXM+IiwgdCk7CisgICAgcmV0dXJuIHNvYXBfc2VuZChzb2FwLCBzb2FwLT50bXBidWYpOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqKgorU09BUF9GTUFDMgorc29hcF9pbmxpdGVyYWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgY2hhciAqKnApCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAxKSkKKyAgeyBpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9OT19UQUcgfHwgc29hcF91bmdldChzb2FwLCBzb2FwX2dldChzb2FwKSkgPT0gU09BUF9UVCkKKyAgICAgIHJldHVybiBOVUxMOworICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgfQorICBpZiAoIXApCisgICAgaWYgKCEocCA9IChjaGFyKiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKGNoYXIqKSkpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIGlmIChzb2FwLT5ib2R5KQorICAgICpwID0gc29hcF9zdHJpbmdfaW4oc29hcCwgMCwgLTEsIC0xKTsKKyAgZWxzZSBpZiAoc29hcC0+bnVsbCkKKyAgICAqcCA9IE5VTEw7CisgIGVsc2UKKyAgICAqcCA9IChjaGFyKilTT0FQX1NUUl9FT1M7CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0d2xpdGVyYWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgd2NoYXJfdCAqY29uc3QqcCkKK3sgaW50IGk7CisgIGNvbnN0IGNoYXIgKnQgPSBOVUxMOworICB3Y2hhcl90IGM7CisgIGNvbnN0IHdjaGFyX3QgKnM7CisgIGlmICh0YWcgJiYgKnRhZyAhPSAnLScpCisgIHsgaWYgKHNvYXAtPmxvY2FsX25hbWVzcGFjZXMgJiYgKHQgPSBzdHJjaHIodGFnLCAnOicpKSkKKyAgICB7IHN0cm5jcHkoc29hcC0+dG1wYnVmLCB0YWcsIHQtdGFnKTsKKyAgICAgIHNvYXAtPnRtcGJ1Zlt0LXRhZ10gPSAnXDAnOworICAgICAgZm9yIChpID0gMDsgc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tpXS5pZDsgaSsrKQorICAgICAgICBpZiAoIXN0cmNtcChzb2FwLT50bXBidWYsIHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0uaWQpKQorICAgICAgICAgIGJyZWFrOworICAgICAgdCsrOworICAgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICI8JXMgeG1sbnM9XCIlc1wiPiIsIHQsIHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0ubnMgPyBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW2ldLm5zIDogU09BUF9TVFJfRU9TKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgdCA9IHRhZzsKKyAgICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiPCVzPiIsIHRhZyk7CisgICAgfQorICAgIGlmIChzb2FwX3NlbmQoc29hcCwgc29hcC0+dG1wYnVmKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAocCkKKyAgeyBzID0gKnA7CisgICAgd2hpbGUgKChjID0gKnMrKykpCisgICAgICBpZiAoc29hcF9wdXR1dGY4KHNvYXAsICh1bnNpZ25lZCBjaGFyKWMpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHQpCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICI8LyVzPiIsIHQpOworICAgIHJldHVybiBzb2FwX3NlbmQoc29hcCwgc29hcC0+dG1wYnVmKTsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQord2NoYXJfdCAqKgorU09BUF9GTUFDMgorc29hcF9pbndsaXRlcmFsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHdjaGFyX3QgKipwKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMSkpCisgIHsgaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfTk9fVEFHIHx8IHNvYXBfdW5nZXQoc29hcCwgc29hcF9nZXQoc29hcCkpID09IFNPQVBfVFQpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIH0KKyAgaWYgKCFwKQorICAgIGlmICghKHAgPSAod2NoYXJfdCoqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZih3Y2hhcl90KikpKSkKKyAgICAgIHJldHVybiBOVUxMOworICBpZiAoc29hcC0+Ym9keSkKKyAgICAqcCA9IHNvYXBfd3N0cmluZ19pbihzb2FwLCAwLCAtMSwgLTEpOworICBlbHNlIGlmIChzb2FwLT5udWxsKQorICAgICpwID0gTlVMTDsKKyAgZWxzZQorICAgICpwID0gKHdjaGFyX3QqKVNPQVBfU1RSX0VPUzsKKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3Rva2VuKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzaXplX3QgaTsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjID0gMDsKKyAgcmVnaXN0ZXIgY2hhciAqcyA9IHNvYXAtPnRtcGJ1ZjsKKyAgaWYgKCFzb2FwLT5ib2R5KQorICAgIHJldHVybiBTT0FQX1NUUl9FT1M7CisgIGRvIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZikgLSAxOyBpKyspCisgIHsgaWYgKGMgPT0gU09BUF9UVCB8fCAoaW50KWMgPT0gRU9GIHx8IHNvYXBfYmxhbmsoYykpCisgICAgICBicmVhazsKKyAgICAqcysrID0gKGNoYXIpYzsKKyAgICBjID0gc29hcF9nZXQoc29hcCk7CisgIH0KKyAgaWYgKChpbnQpYyA9PSBFT0YgfHwgYyA9PSBTT0FQX1RUKQorICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICpzID0gJ1wwJzsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbGVtZW50IGNvbnRlbnQgdmFsdWU9JyVzJ1xuIiwgc29hcC0+dG1wYnVmKSk7CisgIHJldHVybiBzb2FwLT50bXBidWY7IC8qIHJldHVybiBub24tbnVsbCBwb2ludGVyICovCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfdmFsdWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNpemVfdCBpOworICByZWdpc3RlciBzb2FwX3djaGFyIGMgPSAwOworICByZWdpc3RlciBjaGFyICpzID0gc29hcC0+dG1wYnVmOworICBpZiAoIXNvYXAtPmJvZHkpCisgICAgcmV0dXJuIFNPQVBfU1RSX0VPUzsKKyAgZG8gYyA9IHNvYXBfZ2V0KHNvYXApOworICB3aGlsZSAoc29hcF9ibGFuayhjKSk7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc29hcC0+dG1wYnVmKSAtIDE7IGkrKykKKyAgeyBpZiAoYyA9PSBTT0FQX1RUIHx8IChpbnQpYyA9PSBFT0YpCisgICAgICBicmVhazsKKyAgICAqcysrID0gKGNoYXIpYzsKKyAgICBjID0gc29hcF9nZXQoc29hcCk7CisgIH0KKyAgZm9yIChzLS07IGkgPiAwOyBpLS0sIHMtLSkKKyAgICBpZiAoIXNvYXBfYmxhbmsoKnMpKQorICAgICAgYnJlYWs7CisgIHNbMV0gPSAnXDAnOworICBpZiAoKGludCljID09IEVPRiB8fCBjID09IFNPQVBfVFQpCisgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbGVtZW50IGNvbnRlbnQgdmFsdWU9JyVzJ1xuIiwgc29hcC0+dG1wYnVmKSk7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgICAgc29hcC0+ZG9tLT5kYXRhID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+dG1wYnVmKTsKKyNlbmRpZgorICByZXR1cm4gc29hcC0+dG1wYnVmOyAvKiByZXR1cm4gbm9uLW51bGwgcG9pbnRlciAqLworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgIWRlZmluZWQoV0lUSF9MRUFORVIpIHx8ICFkZWZpbmVkKFdJVEhfTk9IVFRQKQorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRsaW5lKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpzLCBpbnQgbGVuKQoreyBpbnQgaSA9IGxlbjsKKyAgc29hcF93Y2hhciBjID0gMDsKKyAgZm9yICg7OykKKyAgeyB3aGlsZSAoLS1pID4gMCkKKyAgICB7IGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgICAgICBpZiAoYyA9PSAnXHInIHx8IGMgPT0gJ1xuJykKKyAgICAgICAgYnJlYWs7CisgICAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgICAqcysrID0gKGNoYXIpYzsKKyAgICB9CisgICAgaWYgKGMgIT0gJ1xuJykKKyAgICAgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7IC8qIGdvdCBcciwgbm93IGdldCBcbiAqLworICAgIGlmIChjID09ICdcbicpCisgICAgeyAqcyA9ICdcMCc7CisgICAgICBpZiAoaSsxID09IGxlbikgLyogZW1wdHkgbGluZTogZW5kIG9mIEhUVFAvTUlNRSBoZWFkZXIgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICBjID0gc29hcF91bmdldChzb2FwLCBzb2FwX2dldGNoYXIoc29hcCkpOworICAgICAgaWYgKGMgIT0gJyAnICYmIGMgIT0gJ1x0JykgLyogSFRUUCBsaW5lIGNvbnRpbnVhdGlvbj8gKi8KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGVsc2UgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHNpemVfdAorc29hcF9jb3VudF9hdHRhY2htZW50cyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgcmVnaXN0ZXIgc2l6ZV90IGNvdW50ID0gc29hcC0+Y291bnQ7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ2FsY3VsYXRpbmcgdGhlIG1lc3NhZ2Ugc2l6ZSB3aXRoIGF0dGFjaG1lbnRzLCBjdXJyZW50IGNvdW50PSVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpY291bnQpKTsKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkgJiYgIShzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkpCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDYWxjdWxhdGluZyB0aGUgc2l6ZSBvZiBESU1FIGF0dGFjaG1lbnRzXG4iKSk7CisgICAgZm9yIChjb250ZW50ID0gc29hcC0+ZGltZS5maXJzdDsgY29udGVudDsgY29udGVudCA9IGNvbnRlbnQtPm5leHQpCisgICAgeyBjb3VudCArPSAxMiArICgoY29udGVudC0+c2l6ZSszKSYofjMpKTsKKyAgICAgIGlmIChjb250ZW50LT5pZCkKKyAgICAgICAgY291bnQgKz0gKChzdHJsZW4oY29udGVudC0+aWQpKzMpJih+MykpOworICAgICAgaWYgKGNvbnRlbnQtPnR5cGUpCisgICAgICAgIGNvdW50ICs9ICgoc3RybGVuKGNvbnRlbnQtPnR5cGUpKzMpJih+MykpOworICAgICAgaWYgKGNvbnRlbnQtPm9wdGlvbnMpCisgICAgICAgIGNvdW50ICs9ICgoKCh1bnNpZ25lZCBjaGFyKWNvbnRlbnQtPm9wdGlvbnNbMl0gPDwgOCkgfCAoKHVuc2lnbmVkIGNoYXIpY29udGVudC0+b3B0aW9uc1szXSkpKzcpJih+Myk7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNpemUgb2YgRElNRSBhdHRhY2htZW50IGNvbnRlbnQgaXMgJWx1IGJ5dGVzXG4iLCAodW5zaWduZWQgbG9uZyljb250ZW50LT5zaXplKSk7CisgICAgfQorICB9CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01JTUUpICYmIHNvYXAtPm1pbWUuYm91bmRhcnkpCisgIHsgcmVnaXN0ZXIgc2l6ZV90IG4gPSBzdHJsZW4oc29hcC0+bWltZS5ib3VuZGFyeSk7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDYWxjdWxhdGluZyB0aGUgc2l6ZSBvZiBNSU1FIGF0dGFjaG1lbnRzXG4iKSk7CisgICAgZm9yIChjb250ZW50ID0gc29hcC0+bWltZS5maXJzdDsgY29udGVudDsgY29udGVudCA9IGNvbnRlbnQtPm5leHQpCisgICAgeyByZWdpc3RlciBjb25zdCBjaGFyICpzOworICAgICAgLyogY291bnQgXHJcbi0tYm91bmRhcnlcclxuICovCisgICAgICBjb3VudCArPSA2ICsgbjsKKyAgICAgIC8qIGNvdW50IENvbnRlbnQtVHlwZTogLi4uXHJcbiAqLworICAgICAgaWYgKGNvbnRlbnQtPnR5cGUpCisgICAgICAgIGNvdW50ICs9IDE2ICsgc3RybGVuKGNvbnRlbnQtPnR5cGUpOworICAgICAgLyogY291bnQgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogLi4uXHJcbiAqLworICAgICAgcyA9IHNvYXBfc3RyX2NvZGUobWltZV9jb2RlcywgY29udGVudC0+ZW5jb2RpbmcpOworICAgICAgaWYgKHMpCisgICAgICAgIGNvdW50ICs9IDI5ICsgc3RybGVuKHMpOworICAgICAgLyogY291bnQgQ29udGVudC1JRDogLi4uXHJcbiAqLworICAgICAgaWYgKGNvbnRlbnQtPmlkKQorICAgICAgICBjb3VudCArPSAxNCArIHN0cmxlbihjb250ZW50LT5pZCk7CisgICAgICAvKiBjb3VudCBDb250ZW50LUxvY2F0aW9uOiAuLi5cclxuICovCisgICAgICBpZiAoY29udGVudC0+bG9jYXRpb24pCisgICAgICAgIGNvdW50ICs9IDIwICsgc3RybGVuKGNvbnRlbnQtPmxvY2F0aW9uKTsKKyAgICAgIC8qIGNvdW50IENvbnRlbnQtRGVzY3JpcHRpb246IC4uLlxyXG4gKi8KKyAgICAgIGlmIChjb250ZW50LT5kZXNjcmlwdGlvbikKKyAgICAgICAgY291bnQgKz0gMjMgKyBzdHJsZW4oY29udGVudC0+bG9jYXRpb24pOworICAgICAgLyogY291bnQgXHJcbi4uLmNvbnRlbnQgKi8KKyAgICAgIGNvdW50ICs9IDIgKyBjb250ZW50LT5zaXplOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTaXplIG9mIE1JTUUgYXR0YWNobWVudCBjb250ZW50IGlzICVsdSBieXRlc1xuIiwgKHVuc2lnbmVkIGxvbmcpY29udGVudC0+c2l6ZSkpOworICAgIH0KKyAgICAvKiBjb3VudCBcclxuLS1ib3VuZGFyeS0tICovCisgICAgY291bnQgKz0gNiArIG47CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJOZXcgY291bnQgaXMgJWx1IGJ5dGVzXG4iLCAodW5zaWduZWQgbG9uZyljb3VudCkpOworICByZXR1cm4gY291bnQ7CisjZWxzZQorICByZXR1cm4gc29hcC0+Y291bnQ7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NvYXBfcHV0ZGltZWZpZWxkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBzaXplX3QgbikKK3sgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgbikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCBTT0FQX1NUUl9QQURESU5HLCAtKGxvbmcpbiYzKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX2RpbWVfb3B0aW9uKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBzaG9ydCBvcHR5cGUsIGNvbnN0IGNoYXIgKm9wdGlvbikKK3sgc2l6ZV90IG47CisgIGNoYXIgKnMgPSBOVUxMOworICBpZiAob3B0aW9uKQorICB7IG4gPSBzdHJsZW4ob3B0aW9uKTsKKyAgICBzID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIG4gKyA1KTsKKyAgICBpZiAocykKKyAgICB7IHNbMF0gPSBvcHR5cGUgPj4gODsKKyAgICAgIHNbMV0gPSBvcHR5cGUgJiAweEZGOworICAgICAgc1syXSA9IG4gPj4gODsKKyAgICAgIHNbM10gPSBuICYgMHhGRjsKKyAgICAgIHN0cmNweShzICsgNCwgb3B0aW9uKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHM7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRkaW1laGRyKHN0cnVjdCBzb2FwICpzb2FwKQoreyB1bnNpZ25lZCBjaGFyIHRtcFsxMl07CisgIHNpemVfdCBvcHRsZW4gPSAwLCBpZGxlbiA9IDAsIHR5cGVsZW4gPSAwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlB1dCBESU1FIGhlYWRlciBpZD0nJXMnXG4iLCBzb2FwLT5kaW1lLmlkP3NvYXAtPmRpbWUuaWQ6IiIpKTsKKyAgaWYgKHNvYXAtPmRpbWUub3B0aW9ucykKKyAgICBvcHRsZW4gPSAoKCh1bnNpZ25lZCBjaGFyKXNvYXAtPmRpbWUub3B0aW9uc1syXSA8PCA4KSB8ICgodW5zaWduZWQgY2hhcilzb2FwLT5kaW1lLm9wdGlvbnNbM10pKSArIDQ7CisgIGlmIChzb2FwLT5kaW1lLmlkKQorICAgIGlkbGVuID0gc3RybGVuKHNvYXAtPmRpbWUuaWQpOworICBpZiAoc29hcC0+ZGltZS50eXBlKQorICAgIHR5cGVsZW4gPSBzdHJsZW4oc29hcC0+ZGltZS50eXBlKTsKKyAgdG1wWzBdID0gU09BUF9ESU1FX1ZFUlNJT04gfCAoc29hcC0+ZGltZS5mbGFncyAmIDB4Nyk7CisgIHRtcFsxXSA9IHNvYXAtPmRpbWUuZmxhZ3MgJiAweEYwOworICB0bXBbMl0gPSBvcHRsZW4gPj4gODsKKyAgdG1wWzNdID0gb3B0bGVuICYgMHhGRjsKKyAgdG1wWzRdID0gaWRsZW4gPj4gODsKKyAgdG1wWzVdID0gaWRsZW4gJiAweEZGOworICB0bXBbNl0gPSB0eXBlbGVuID4+IDg7CisgIHRtcFs3XSA9IHR5cGVsZW4gJiAweEZGOworICB0bXBbOF0gPSBzb2FwLT5kaW1lLnNpemUgPj4gMjQ7CisgIHRtcFs5XSA9IChzb2FwLT5kaW1lLnNpemUgPj4gMTYpICYgMHhGRjsKKyAgdG1wWzEwXSA9IChzb2FwLT5kaW1lLnNpemUgPj4gOCkgJiAweEZGOworICB0bXBbMTFdID0gc29hcC0+ZGltZS5zaXplICYgMHhGRjsKKyAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgKGNoYXIqKXRtcCwgMTIpCisgICB8fCBzb2FwX3B1dGRpbWVmaWVsZChzb2FwLCBzb2FwLT5kaW1lLm9wdGlvbnMsIG9wdGxlbikKKyAgIHx8IHNvYXBfcHV0ZGltZWZpZWxkKHNvYXAsIHNvYXAtPmRpbWUuaWQsIGlkbGVuKQorICAgfHwgc29hcF9wdXRkaW1lZmllbGQoc29hcCwgc29hcC0+ZGltZS50eXBlLCB0eXBlbGVuKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0ZGltZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIGZvciAoY29udGVudCA9IHNvYXAtPmRpbWUuZmlyc3Q7IGNvbnRlbnQ7IGNvbnRlbnQgPSBjb250ZW50LT5uZXh0KQorICB7IHZvaWQgKmhhbmRsZTsKKyAgICBzb2FwLT5kaW1lLnNpemUgPSBjb250ZW50LT5zaXplOworICAgIHNvYXAtPmRpbWUuaWQgPSBjb250ZW50LT5pZDsKKyAgICBzb2FwLT5kaW1lLnR5cGUgPSBjb250ZW50LT50eXBlOworICAgIHNvYXAtPmRpbWUub3B0aW9ucyA9IGNvbnRlbnQtPm9wdGlvbnM7CisgICAgc29hcC0+ZGltZS5mbGFncyA9IFNPQVBfRElNRV9WRVJTSU9OIHwgU09BUF9ESU1FX01FRElBOworICAgIGlmIChzb2FwLT5mZGltZXJlYWRvcGVuICYmICgoaGFuZGxlID0gc29hcC0+ZmRpbWVyZWFkb3Blbihzb2FwLCAodm9pZCopY29udGVudC0+cHRyLCBjb250ZW50LT5pZCwgY29udGVudC0+dHlwZSwgY29udGVudC0+b3B0aW9ucykpIHx8IHNvYXAtPmVycm9yKSkKKyAgICB7IHNpemVfdCBzaXplID0gY29udGVudC0+c2l6ZTsKKyAgICAgIGlmICghaGFuZGxlKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImZkaW1lcmVhZG9wZW4gZmFpbGVkXG4iKSk7CisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIH0KKyAgICAgIGlmICghY29udGVudC0+c2l6ZSAmJiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpIHx8IChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSyB8fCAoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fU1RPUkUpKQorICAgICAgeyBzaXplX3QgY2h1bmtzaXplID0gc2l6ZW9mKHNvYXAtPnRtcGJ1Zik7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ2h1bmtlZCBzdHJlYW1pbmcgRElNRVxuIikpOworICAgICAgICBkbyAKKyAgICAgICAgeyBzaXplID0gc29hcC0+ZmRpbWVyZWFkKHNvYXAsIGhhbmRsZSwgc29hcC0+dG1wYnVmLCBjaHVua3NpemUpOworICAgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZmRpbWVyZWFkIHJldHVybmVkICVsdSBieXRlc1xuIiwgKHVuc2lnbmVkIGxvbmcpc2l6ZSkpOworICAgICAgICAgIGlmIChzaXplIDwgY2h1bmtzaXplKQorIAkgIHsgc29hcC0+ZGltZS5mbGFncyAmPSB+U09BUF9ESU1FX0NGOworICAgICAgICAgICAgaWYgKCFjb250ZW50LT5uZXh0KQorICAgICAgICAgICAgICBzb2FwLT5kaW1lLmZsYWdzIHw9IFNPQVBfRElNRV9NRTsKKwkgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBzb2FwLT5kaW1lLmZsYWdzIHw9IFNPQVBfRElNRV9DRjsKKwkgIHNvYXAtPmRpbWUuc2l6ZSA9IHNpemU7CisgICAgICAgICAgaWYgKHNvYXBfcHV0ZGltZWhkcihzb2FwKQorCSAgIHx8IHNvYXBfcHV0ZGltZWZpZWxkKHNvYXAsIHNvYXAtPnRtcGJ1Ziwgc2l6ZSkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBpZiAoc29hcC0+ZGltZS5pZCkKKyAJICB7IHNvYXAtPmRpbWUuZmxhZ3MgJj0gfihTT0FQX0RJTUVfTUIgfCBTT0FQX0RJTUVfTUVESUEpOworICAgICAgICAgICAgc29hcC0+ZGltZS5pZCA9IE5VTEw7CisgICAgICAgICAgICBzb2FwLT5kaW1lLnR5cGUgPSBOVUxMOworICAgICAgICAgICAgc29hcC0+ZGltZS5vcHRpb25zID0gTlVMTDsKKyAgICAgICAgICB9ICAKKyAgICAgICAgfSB3aGlsZSAoc2l6ZSA+PSBjaHVua3NpemUpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBpZiAoIWNvbnRlbnQtPm5leHQpCisgICAgICAgICAgc29hcC0+ZGltZS5mbGFncyB8PSBTT0FQX0RJTUVfTUU7CisgICAgICAgIGlmIChzb2FwX3B1dGRpbWVoZHIoc29hcCkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBkbworICAgICAgICB7IHNpemVfdCBidWZzaXplOworCSAgaWYgKHNpemUgPCBzaXplb2Yoc29hcC0+dG1wYnVmKSkKKyAgICAgICAgICAgIGJ1ZnNpemUgPSBzaXplOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJ1ZnNpemUgPSBzaXplb2Yoc29hcC0+dG1wYnVmKTsKKyAgICAgICAgICBpZiAoIShidWZzaXplID0gc29hcC0+ZmRpbWVyZWFkKHNvYXAsIGhhbmRsZSwgc29hcC0+dG1wYnVmLCBidWZzaXplKSkpCisgICAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImZkaW1lcmVhZCBmYWlsZWQ6IGluc3VmZmljaWVudCBkYXRhICglbHUgYnl0ZXMgcmVtYWluaW5nIGZyb20gJWx1IGJ5dGVzKVxuIiwgKHVuc2lnbmVkIGxvbmcpc2l6ZSwgKHVuc2lnbmVkIGxvbmcpc29hcC0+ZGltZS5zaXplKSk7CisgICAgICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworCSAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgc29hcC0+dG1wYnVmLCBidWZzaXplKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHNpemUgLT0gYnVmc2l6ZTsKKyAgICAgICAgfSB3aGlsZSAoc2l6ZSk7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZmRpbWVyZWFkY2xvc2VcbiIpKTsKKyAgICAgICAgc29hcF9zZW5kX3Jhdyhzb2FwLCBTT0FQX1NUUl9QQURESU5HLCAtKGxvbmcpc29hcC0+ZGltZS5zaXplJjMpOworICAgICAgfQorICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJmZGltZXJlYWRjbG9zZVxuIikpOworICAgICAgaWYgKHNvYXAtPmZkaW1lcmVhZGNsb3NlKQorICAgICAgICBzb2FwLT5mZGltZXJlYWRjbG9zZShzb2FwLCBoYW5kbGUpOworICAgIH0KKyAgICBlbHNlCisgICAgeyBpZiAoIWNvbnRlbnQtPm5leHQpCisgICAgICAgIHNvYXAtPmRpbWUuZmxhZ3MgfD0gU09BUF9ESU1FX01FOworICAgICAgaWYgKHNvYXBfcHV0ZGltZWhkcihzb2FwKQorICAgICAgIHx8IHNvYXBfcHV0ZGltZWZpZWxkKHNvYXAsIChjaGFyKiljb250ZW50LT5wdHIsIGNvbnRlbnQtPnNpemUpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY2hhciAqCitzb2FwX2dldGRpbWVmaWVsZChzdHJ1Y3Qgc29hcCAqc29hcCwgc2l6ZV90IG4pCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIGNoYXIgKnM7CisgIGNoYXIgKnAgPSBOVUxMOworICBpZiAobikKKyAgeyBwID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIG4gKyAxKTsKKyAgICBpZiAocCkKKyAgICB7IHMgPSBwOworICAgICAgZm9yIChpID0gbjsgaSA+IDA7IGktLSkKKyAgICAgIHsgaWYgKChpbnQpKGMgPSBzb2FwX2dldDEoc29hcCkpID09IEVPRikKKyAgICAgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgICpzKysgPSAoY2hhciljOworICAgICAgfQorICAgICAgKnMgPSAnXDAnOworICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXBfbW92ZShzb2FwLCAtKGxvbmcpbiYzKSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICB9CisgIHJldHVybiBwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0ZGltZWhkcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICByZWdpc3RlciBjaGFyICpzOworICByZWdpc3RlciBpbnQgaTsKKyAgdW5zaWduZWQgY2hhciB0bXBbMTJdOworICBzaXplX3Qgb3B0bGVuLCBpZGxlbiwgdHlwZWxlbjsKKyAgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRElNRV9FTkQ7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR2V0IERJTUUgaGVhZGVyXG4iKSk7CisgIGlmIChzb2FwLT5kaW1lLmJ1ZmxlbiB8fCBzb2FwLT5kaW1lLmNodW5rc2l6ZSkKKyAgeyBpZiAoc29hcF9tb3ZlKHNvYXAsIChsb25nKShzb2FwLT5kaW1lLnNpemUgLSBzb2FwX3RlbGwoc29hcCkpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgIHNvYXBfdW5nZXQoc29hcCwgc29hcF9nZXRjaGFyKHNvYXApKTsgLyogc2tpcCBwYWRkaW5nIGFuZCBnZXQgaGRyICovCisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIuLi4gRnJvbSBjaHVua2VkXG4iKSk7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgcyA9IChjaGFyKil0bXA7CisgIGZvciAoaSA9IDEyOyBpID4gMDsgaS0tKQorICB7IGlmICgoaW50KShjID0gc29hcF9nZXRjaGFyKHNvYXApKSA9PSBFT0YpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAqcysrID0gKGNoYXIpYzsKKyAgfQorICBpZiAoKHRtcFswXSAmIDB4RjgpICE9IFNPQVBfRElNRV9WRVJTSU9OKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRElNRV9NSVNNQVRDSDsKKyAgc29hcC0+ZGltZS5mbGFncyA9ICh0bXBbMF0gJiAweDcpIHwgKHRtcFsxXSAmIDB4RjApOworICBvcHRsZW4gPSAodG1wWzJdIDw8IDgpIHwgdG1wWzNdOworICBpZGxlbiA9ICh0bXBbNF0gPDwgOCkgfCB0bXBbNV07CisgIHR5cGVsZW4gPSAodG1wWzZdIDw8IDgpIHwgdG1wWzddOworICBzb2FwLT5kaW1lLnNpemUgPSAodG1wWzhdIDw8IDI0KSB8ICh0bXBbOV0gPDwgMTYpIHwgKHRtcFsxMF0gPDwgOCkgfCB0bXBbMTFdOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRJTUUgc2l6ZT0lbHUgZmxhZ3M9MHglWFxuIiwgKHVuc2lnbmVkIGxvbmcpc29hcC0+ZGltZS5zaXplLCBzb2FwLT5kaW1lLmZsYWdzKSk7CisgIGlmICghKHNvYXAtPmRpbWUub3B0aW9ucyA9IHNvYXBfZ2V0ZGltZWZpZWxkKHNvYXAsIG9wdGxlbikpICYmIHNvYXAtPmVycm9yKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKCEoc29hcC0+ZGltZS5pZCA9IHNvYXBfZ2V0ZGltZWZpZWxkKHNvYXAsIGlkbGVuKSkgJiYgc29hcC0+ZXJyb3IpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoIShzb2FwLT5kaW1lLnR5cGUgPSBzb2FwX2dldGRpbWVmaWVsZChzb2FwLCB0eXBlbGVuKSkgJiYgc29hcC0+ZXJyb3IpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRJTUUgaWQ9JXMsIHR5cGU9JXMsIG9wdGlvbnM9JXNcbiIsIHNvYXAtPmRpbWUuaWQ/c29hcC0+ZGltZS5pZDoiIiwgc29hcC0+ZGltZS50eXBlP3NvYXAtPmRpbWUudHlwZToiIiwgc29hcC0+ZGltZS5vcHRpb25zP3NvYXAtPmRpbWUub3B0aW9ucys0OiIiKSk7CisgIGlmIChzb2FwLT5kaW1lLmZsYWdzICYgU09BUF9ESU1FX01FKQorICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX0RJTUU7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0ZGltZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgd2hpbGUgKHNvYXAtPmRpbWUuZmxhZ3MgJiBTT0FQX0RJTUVfQ0YpCisgIHsgaWYgKHNvYXBfZ2V0ZGltZWhkcihzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAoc29hcF9tb3ZlKHNvYXAsIHNvYXAtPmRpbWUuc2l6ZSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgfQorICBpZiAoc29hcF9tb3ZlKHNvYXAsICgoc29hcC0+ZGltZS5zaXplKzMpJih+MykpLXNvYXBfdGVsbChzb2FwKSkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIGZvciAoOzspCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICAgIGlmIChzb2FwX2dldGRpbWVoZHIoc29hcCkpCisgICAgICBicmVhazsKKyAgICBpZiAoc29hcC0+ZmRpbWV3cml0ZW9wZW4gJiYgKChzb2FwLT5kaW1lLnB0ciA9IChjaGFyKilzb2FwLT5mZGltZXdyaXRlb3Blbihzb2FwLCBzb2FwLT5kaW1lLmlkLCBzb2FwLT5kaW1lLnR5cGUsIHNvYXAtPmRpbWUub3B0aW9ucykpIHx8IHNvYXAtPmVycm9yKSkKKyAgICB7IGNvbnN0IGNoYXIgKmlkLCAqdHlwZSwgKm9wdGlvbnM7CisgICAgICBzaXplX3Qgc2l6ZSwgbjsKKyAgICAgIGlmICghc29hcC0+ZGltZS5wdHIpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIGlkID0gc29hcC0+ZGltZS5pZDsKKyAgICAgIHR5cGUgPSBzb2FwLT5kaW1lLnR5cGU7CisgICAgICBvcHRpb25zID0gc29hcC0+ZGltZS5vcHRpb25zOworICAgICAgZm9yICg7OykKKyAgICAgIHsgc2l6ZSA9IHNvYXAtPmRpbWUuc2l6ZTsKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeyBuID0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgICAgICAgIGlmIChzaXplIDwgbikKKyAgICAgICAgICAgIG4gPSBzaXplOworICAgICAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mZGltZXdyaXRlKHNvYXAsICh2b2lkKilzb2FwLT5kaW1lLnB0ciwgc29hcC0+YnVmICsgc29hcC0+YnVmaWR4LCBuKSkpCisgICAgICAgICAgICBicmVhazsKKwkgIHNpemUgLT0gbjsKKwkgIGlmICghc2l6ZSkKKwkgIHsgc29hcC0+YnVmaWR4ICs9IG47CisJICAgIGJyZWFrOworCSAgfQorCSAgaWYgKHNvYXBfcmVjdihzb2FwKSkKKyAgICAgICAgICB7IHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisJICAgIGdvdG8gZW5kOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc29hcF9tb3ZlKHNvYXAsIC0obG9uZylzb2FwLT5kaW1lLnNpemUmMykpCisgICAgICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKwkgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICghKHNvYXAtPmRpbWUuZmxhZ3MgJiBTT0FQX0RJTUVfQ0YpKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoc29hcF9nZXRkaW1laGRyKHNvYXApKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorZW5kOgorICAgICAgaWYgKHNvYXAtPmZkaW1ld3JpdGVjbG9zZSkKKyAgICAgICAgc29hcC0+ZmRpbWV3cml0ZWNsb3NlKHNvYXAsICh2b2lkKilzb2FwLT5kaW1lLnB0cik7CisgICAgICBzb2FwLT5kaW1lLnNpemUgPSAwOworICAgICAgc29hcC0+ZGltZS5pZCA9IGlkOworICAgICAgc29hcC0+ZGltZS50eXBlID0gdHlwZTsKKyAgICAgIHNvYXAtPmRpbWUub3B0aW9ucyA9IG9wdGlvbnM7CisgICAgfQorICAgIGVsc2UgaWYgKHNvYXAtPmRpbWUuZmxhZ3MgJiBTT0FQX0RJTUVfQ0YpCisgICAgeyBjb25zdCBjaGFyICppZCwgKnR5cGUsICpvcHRpb25zOworICAgICAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICAgICAgcmVnaXN0ZXIgY2hhciAqczsKKyAgICAgIHJlZ2lzdGVyIGludCBpOworICAgICAgaWQgPSBzb2FwLT5kaW1lLmlkOworICAgICAgdHlwZSA9IHNvYXAtPmRpbWUudHlwZTsKKyAgICAgIG9wdGlvbnMgPSBzb2FwLT5kaW1lLm9wdGlvbnM7CisgICAgICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgICAgIHJldHVybiBTT0FQX0VPTTsKKyAgICAgIGZvciAoOzspCisgICAgICB7IHMgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIHNvYXAtPmRpbWUuc2l6ZSk7CisgICAgICAgIGlmICghcykKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgICAgZm9yIChpID0gc29hcC0+ZGltZS5zaXplOyBpID4gMDsgaS0tKQorICAgICAgICB7IGlmICgoaW50KShjID0gc29hcF9nZXQxKHNvYXApKSA9PSBFT0YpCisgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAgICAgICAqcysrID0gKGNoYXIpYzsKKyAgICAgICAgfQorICAgICAgICBpZiAoc29hcF9tb3ZlKHNvYXAsIC0obG9uZylzb2FwLT5kaW1lLnNpemUmMykpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgICAgIGlmICghKHNvYXAtPmRpbWUuZmxhZ3MgJiBTT0FQX0RJTUVfQ0YpKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoc29hcF9nZXRkaW1laGRyKHNvYXApKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIH0KKyAgICAgIHNvYXAtPmRpbWUuc2l6ZSA9IHNvYXAtPmJsaXN0LT5zaXplKys7IC8qIGFsbG9jYXRlIG9uZSBtb3JlIGZvciAnXDAnICovCisgICAgICBpZiAoIShzb2FwLT5kaW1lLnB0ciA9IHNvYXBfc2F2ZV9ibG9jayhzb2FwLCBOVUxMLCAwKSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHNvYXAtPmRpbWUucHRyW3NvYXAtPmRpbWUuc2l6ZV0gPSAnXDAnOyAvKiBmb3JjZSAwLXRlcm1pbmF0ZWQgKi8KKyAgICAgIHNvYXAtPmRpbWUuaWQgPSBpZDsKKyAgICAgIHNvYXAtPmRpbWUudHlwZSA9IHR5cGU7CisgICAgICBzb2FwLT5kaW1lLm9wdGlvbnMgPSBvcHRpb25zOworICAgIH0KKyAgICBlbHNlCisgICAgICBzb2FwLT5kaW1lLnB0ciA9IHNvYXBfZ2V0ZGltZWZpZWxkKHNvYXAsIHNvYXAtPmRpbWUuc2l6ZSk7CisgICAgY29udGVudCA9IHNvYXBfbmV3X211bHRpcGFydChzb2FwLCAmc29hcC0+ZGltZS5maXJzdCwgJnNvYXAtPmRpbWUubGFzdCwgc29hcC0+ZGltZS5wdHIsIHNvYXAtPmRpbWUuc2l6ZSk7CisgICAgaWYgKCFjb250ZW50KQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgY29udGVudC0+aWQgPSBzb2FwLT5kaW1lLmlkOworICAgIGNvbnRlbnQtPnR5cGUgPSBzb2FwLT5kaW1lLnR5cGU7CisgICAgY29udGVudC0+b3B0aW9ucyA9IHNvYXAtPmRpbWUub3B0aW9uczsKKyAgICBzb2FwX3Jlc29sdmVfYXR0YWNobWVudChzb2FwLCBjb250ZW50KTsKKyAgICBpZiAoc29hcC0+ZXJyb3IpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfRElNRV9FTkQpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0bWltZWhkcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICBkbworICB7IGlmIChzb2FwX2dldGxpbmUoc29hcCwgc29hcC0+bXNnYnVmLCBzaXplb2Yoc29hcC0+bXNnYnVmKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgd2hpbGUgKCEqc29hcC0+bXNnYnVmKTsKKyAgaWYgKHNvYXAtPm1zZ2J1ZlswXSA9PSAnLScgJiYgc29hcC0+bXNnYnVmWzFdID09ICctJykKKyAgeyBjaGFyICpzID0gc29hcC0+bXNnYnVmICsgc3RybGVuKHNvYXAtPm1zZ2J1ZikgLSAxOworICAgIC8qIHJlbW92ZSB3aGl0ZSBzcGFjZSAqLworICAgIHdoaWxlIChzb2FwX2JsYW5rKCpzKSkKKyAgICAgIHMtLTsKKyAgICBzWzFdID0gJ1wwJzsKKyAgICBpZiAoc29hcC0+bWltZS5ib3VuZGFyeSkKKyAgICB7IGlmIChzdHJjbXAoc29hcC0+bXNnYnVmICsgMiwgc29hcC0+bWltZS5ib3VuZGFyeSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTUlNRV9FUlJPUjsKKyAgICB9CisgICAgZWxzZQorICAgICAgc29hcC0+bWltZS5ib3VuZGFyeSA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPm1zZ2J1ZiArIDIpOworICAgIGlmIChzb2FwX2dldGxpbmUoc29hcCwgc29hcC0+bXNnYnVmLCBzaXplb2Yoc29hcC0+bXNnYnVmKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHNvYXBfc2V0X21pbWVfYXR0YWNobWVudChzb2FwLCBOVUxMLCAwLCBTT0FQX01JTUVfTk9ORSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgIGNvbnRlbnQgPSBzb2FwLT5taW1lLmxhc3Q7CisgIGZvciAoOzspCisgIHsgcmVnaXN0ZXIgY2hhciAqa2V5ID0gc29hcC0+bXNnYnVmOworICAgIHJlZ2lzdGVyIGNoYXIgKnZhbDsKKyAgICBpZiAoISprZXkpCisgICAgICBicmVhazsKKyAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiTUlNRSBoZWFkZXI6ICVzXG4iLCBrZXkpKTsKKyAgICB2YWwgPSBzdHJjaHIoc29hcC0+bXNnYnVmLCAnOicpOworICAgIGlmICh2YWwpCisgICAgeyAqdmFsID0gJ1wwJzsKKyAgICAgIGRvIHZhbCsrOworICAgICAgd2hpbGUgKCp2YWwgJiYgKnZhbCA8PSAzMik7CisgICAgICBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LUlEIikpCisgICAgICAgIGNvbnRlbnQtPmlkID0gc29hcF9zdHJkdXAoc29hcCwgdmFsKTsKKyAgICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1Mb2NhdGlvbiIpKQorICAgICAgICBjb250ZW50LT5sb2NhdGlvbiA9IHNvYXBfc3RyZHVwKHNvYXAsIHZhbCk7CisgICAgICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtRGlzcG9zaXRpb24iKSkKKyAgICAgICAgY29udGVudC0+aWQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCwgIm5hbWUiKSk7CisgICAgICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtVHlwZSIpKQorICAgICAgICBjb250ZW50LT50eXBlID0gc29hcF9zdHJkdXAoc29hcCwgdmFsKTsKKyAgICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1EZXNjcmlwdGlvbiIpKQorICAgICAgICBjb250ZW50LT5kZXNjcmlwdGlvbiA9IHNvYXBfc3RyZHVwKHNvYXAsIHZhbCk7CisgICAgICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmciKSkKKyAgICAgICAgY29udGVudC0+ZW5jb2RpbmcgPSAoZW51bSBzb2FwX21pbWVfZW5jb2Rpbmcpc29hcF9pbnRfY29kZShtaW1lX2NvZGVzLCB2YWwsIChsb25nKVNPQVBfTUlNRV9OT05FKTsKKyAgICB9CisgICAgaWYgKHNvYXBfZ2V0bGluZShzb2FwLCBrZXksIHNpemVvZihzb2FwLT5tc2didWYpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldG1pbWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IDA7CisgIGlmICghc29hcC0+bWltZS5sYXN0KQorICAgIHJldHVybiBTT0FQX09LOworICBmb3IgKDs7KQorICB7IHJlZ2lzdGVyIHNpemVfdCBpLCBtID0gMDsKKyAgICByZWdpc3RlciBjaGFyICpzLCAqdCA9IE5VTEw7CisgICAgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50ID0gc29hcC0+bWltZS5sYXN0OworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUGFyc2luZyBNSU1FIGNvbnRlbnQgaWQ9JXMgdHlwZT0lc1xuIiwgY29udGVudC0+aWQ/Y29udGVudC0+aWQ6IiIsIGNvbnRlbnQtPnR5cGU/Y29udGVudC0+dHlwZToiIikpOworICAgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIGZvciAoOzspCisgICAgeyByZWdpc3RlciBzaG9ydCBmbGFnID0gMDsKKyAgICAgIGlmICghKHMgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIFNPQVBfQkxLTEVOKSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgZm9yIChpID0gMDsgaSA8IFNPQVBfQkxLTEVOOyBpKyspCisgICAgICB7IGlmIChtID4gMCkKKyAgICAgICAgeyAqcysrID0gKnQrKzsKKwkgIG0tLTsKKwl9CisJZWxzZQorICAgICAgICB7IGlmICghZmxhZykKKwkgIHsgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKwkgICAgaWYgKChpbnQpYyA9PSBFT0YpCisJICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisJICB9CisJICBpZiAoZmxhZyB8fCBjID09ICdccicpCisJICB7IHQgPSBzb2FwLT50bXBidWY7CisJICAgIG1lbXNldCh0LCAwLCBzaXplb2Yoc29hcC0+dG1wYnVmKSk7CisgICAgICAgICAgICBzdHJjcHkodCwgIlxuLS0iKTsKKyAgICAgICAgICAgIGlmIChzb2FwLT5taW1lLmJvdW5kYXJ5KQorCSAgICAgIHN0cm5jYXQodCwgc29hcC0+bWltZS5ib3VuZGFyeSwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiktNCk7CisJICAgIGRvIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisJICAgIHdoaWxlIChjID09ICp0KyspOworCSAgICBpZiAoKGludCljID09IEVPRikKKwkgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKwkgICAgaWYgKCEqLS10KQorCSAgICAgIGdvdG8gZW5kOworCSAgICAqdCA9IChjaGFyKWM7CisJICAgIGZsYWcgPSAoYyA9PSAnXHInKTsKKwkgICAgbSA9IHQgLSBzb2FwLT50bXBidWYgKyAxIC0gZmxhZzsKKwkgICAgdCA9IHNvYXAtPnRtcGJ1ZjsKKwkgICAgYyA9ICdccic7CisJICB9CisJICAqcysrID0gKGNoYXIpYzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KK2VuZDoKKyAgICAqcyA9ICdcMCc7IC8qIGZvcmNlIDAtdGVybWluYXRlZCAqLworICAgIGNvbnRlbnQtPnNpemUgPSBzb2FwX3NpemVfYmxvY2soc29hcCwgaSsxKS0xOworICAgIGNvbnRlbnQtPnB0ciA9IHNvYXBfc2F2ZV9ibG9jayhzb2FwLCBOVUxMLCAwKTsKKyAgICBzb2FwX3Jlc29sdmVfYXR0YWNobWVudChzb2FwLCBjb250ZW50KTsKKyAgICBpZiAoYyA9PSAnLScgJiYgc29hcF9nZXRjaGFyKHNvYXApID09ICctJykKKyAgICAgIGJyZWFrOworICAgIHdoaWxlIChjICE9ICdccicgJiYgKGludCljICE9IEVPRiAmJiBzb2FwX2JsYW5rKGMpKQorICAgICAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgICBpZiAoYyAhPSAnXHInIHx8IHNvYXBfZ2V0Y2hhcihzb2FwKSAhPSAnXG4nKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9NSU1FX0VSUk9SOworICAgIGlmIChzb2FwX2dldG1pbWVoZHIoc29hcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NvYXBfbWF0Y2hfY2lkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICp0KQoreyByZWdpc3RlciBzaXplX3QgbjsKKyAgaWYgKCFzKQorICAgIHJldHVybiAxOworICBpZiAoIXN0cmNtcChzLCB0KSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKCFzdHJuY21wKHMsICJjaWQ6IiwgNCkpCisgICAgcyArPSA0OworICBuID0gc3RybGVuKHQpOworICBpZiAoKnQgPT0gJzwnKQorICB7IHQrKzsKKyAgICBuIC09IDI7CisgIH0KKyAgaWYgKCFzdHJuY21wKHMsIHQsIG4pICYmICFzW25dKQorICAgIHJldHVybiAwOworICBzb2FwX2RlY29kZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCBzLCBTT0FQX1NUUl9FT1MpOworICBpZiAoIXN0cm5jbXAoc29hcC0+dG1wYnVmLCB0LCBuKSAmJiAhc29hcC0+dG1wYnVmW25dKQorICAgIHJldHVybiAwOworICByZXR1cm4gMTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQKK3NvYXBfcmVzb2x2ZV9hdHRhY2htZW50KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQpCit7IGlmIChjb250ZW50LT5pZCkKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF94bGlzdCAqKnhwID0gJnNvYXAtPnhsaXN0OworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x2aW5nIGF0dGFjaG1lbnQgZGF0YSBmb3IgaWQ9JXNcbiIsIGNvbnRlbnQtPmlkKSk7CisgICAgd2hpbGUgKCp4cCkKKyAgICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3hsaXN0ICp4cSA9ICp4cDsKKyAgICAgIGlmICghc29hcF9tYXRjaF9jaWQoc29hcCwgeHEtPmlkLCBjb250ZW50LT5pZCkpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRm91bmQgbWF0Y2hpbmcgYXR0YWNobWVudCAlcyBmb3IgY29udGVudCBpZD0lc1xuIiwgeHEtPmlkLCBjb250ZW50LT5pZCkpOworCSp4cCA9IHhxLT5uZXh0OworICAgICAgICAqeHEtPnB0ciA9ICh1bnNpZ25lZCBjaGFyKiljb250ZW50LT5wdHI7CisgICAgICAgICp4cS0+c2l6ZSA9IChpbnQpY29udGVudC0+c2l6ZTsKKyAgICAgICAgKnhxLT50eXBlID0gKGNoYXIqKWNvbnRlbnQtPnR5cGU7CisJaWYgKGNvbnRlbnQtPm9wdGlvbnMpCisgICAgICAgICAgKnhxLT5vcHRpb25zID0gKGNoYXIqKWNvbnRlbnQtPm9wdGlvbnM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAqeHEtPm9wdGlvbnMgPSAoY2hhciopY29udGVudC0+ZGVzY3JpcHRpb247CisJU09BUF9GUkVFKHNvYXAsIHhxKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeHAgPSAmKCp4cCktPm5leHQ7CisgICAgfQorICB9Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRtaW1laGRyKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQpCit7IGNvbnN0IGNoYXIgKnM7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTUlNRSBhdHRhY2htZW50IHR5cGU9JXNcbiIsIGNvbnRlbnQtPnR5cGU/Y29udGVudC0+dHlwZToiIikpOworICBpZiAoc29hcF9zZW5kMyhzb2FwLCAiXHJcbi0tIiwgc29hcC0+bWltZS5ib3VuZGFyeSwgIlxyXG4iKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmIChjb250ZW50LT50eXBlICYmIHNvYXBfc2VuZDMoc29hcCwgIkNvbnRlbnQtVHlwZTogIiwgY29udGVudC0+dHlwZSwgIlxyXG4iKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHMgPSBzb2FwX3N0cl9jb2RlKG1pbWVfY29kZXMsIGNvbnRlbnQtPmVuY29kaW5nKTsKKyAgaWYgKHMgJiYgc29hcF9zZW5kMyhzb2FwLCAiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogIiwgcywgIlxyXG4iKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmIChjb250ZW50LT5pZCAmJiBzb2FwX3NlbmQzKHNvYXAsICJDb250ZW50LUlEOiAiLCBjb250ZW50LT5pZCwgIlxyXG4iKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmIChjb250ZW50LT5sb2NhdGlvbiAmJiBzb2FwX3NlbmQzKHNvYXAsICJDb250ZW50LUxvY2F0aW9uOiAiLCBjb250ZW50LT5sb2NhdGlvbiwgIlxyXG4iKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmIChjb250ZW50LT5kZXNjcmlwdGlvbiAmJiBzb2FwX3NlbmQzKHNvYXAsICJDb250ZW50LURlc2NyaXB0aW9uOiAiLCBjb250ZW50LT5kZXNjcmlwdGlvbiwgIlxyXG4iKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsICJcclxuIiwgMik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRtaW1lKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgIGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKSB8fCAhc29hcC0+bWltZS5ib3VuZGFyeSkKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTZW5kaW5nIE1JTUUgYXR0YWNobWVudHNcbiIpKTsKKyAgZm9yIChjb250ZW50ID0gc29hcC0+bWltZS5maXJzdDsgY29udGVudDsgY29udGVudCA9IGNvbnRlbnQtPm5leHQpCisgICAgaWYgKHNvYXBfcHV0bWltZWhkcihzb2FwLCBjb250ZW50KQorICAgICB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsIGNvbnRlbnQtPnB0ciwgY29udGVudC0+c2l6ZSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX3NlbmQzKHNvYXAsICJcclxuLS0iLCBzb2FwLT5taW1lLmJvdW5kYXJ5LCAiLS0iKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfZGltZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+b21vZGUgfD0gU09BUF9FTkNfRElNRTsKKyAgc29hcC0+ZGltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGFzdCA9IE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X21pbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmJvdW5kYXJ5LCBjb25zdCBjaGFyICpzdGFydCkKK3sgc29hcC0+b21vZGUgfD0gU09BUF9FTkNfTUlNRTsKKyAgc29hcC0+bWltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuYm91bmRhcnkgPSBzb2FwX3N0cmR1cChzb2FwLCBib3VuZGFyeSk7CisgIHNvYXAtPm1pbWUuc3RhcnQgPSBzb2FwX3N0cmR1cChzb2FwLCBzdGFydCk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfY2xyX2RpbWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPm9tb2RlICY9IH5TT0FQX0VOQ19ESU1FOworICBzb2FwLT5kaW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5sYXN0ID0gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9jbHJfbWltZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+b21vZGUgJj0gflNPQVBfRU5DX01JTUU7CisgIHNvYXAtPm1pbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmxhc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gTlVMTDsKKyAgc29hcC0+bWltZS5zdGFydCA9IE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqCitzb2FwX25ld19tdWx0aXBhcnQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX211bHRpcGFydCAqKmZpcnN0LCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKipsYXN0LCBjaGFyICpwdHIsIHNpemVfdCBzaXplKQoreyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgIGNvbnRlbnQgPSAoc3RydWN0IHNvYXBfbXVsdGlwYXJ0Kilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfbXVsdGlwYXJ0KSk7CisgIGlmIChjb250ZW50KQorICB7IGNvbnRlbnQtPm5leHQgPSBOVUxMOworICAgIGNvbnRlbnQtPnB0ciA9IHB0cjsKKyAgICBjb250ZW50LT5zaXplID0gc2l6ZTsKKyAgICBjb250ZW50LT5pZCA9IE5VTEw7CisgICAgY29udGVudC0+dHlwZSA9IE5VTEw7CisgICAgY29udGVudC0+b3B0aW9ucyA9IE5VTEw7CisgICAgY29udGVudC0+ZW5jb2RpbmcgPSBTT0FQX01JTUVfTk9ORTsKKyAgICBjb250ZW50LT5sb2NhdGlvbiA9IE5VTEw7CisgICAgY29udGVudC0+ZGVzY3JpcHRpb24gPSBOVUxMOworICAgIGlmICghKmZpcnN0KQorICAgICAgKmZpcnN0ID0gY29udGVudDsKKyAgICBpZiAoKmxhc3QpCisgICAgICAoKmxhc3QpLT5uZXh0ID0gY29udGVudDsKKyAgICAqbGFzdCA9IGNvbnRlbnQ7CisgIH0KKyAgcmV0dXJuIGNvbnRlbnQ7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZXRfZGltZV9hdHRhY2htZW50KHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpwdHIsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICppZCwgdW5zaWduZWQgc2hvcnQgb3B0eXBlLCBjb25zdCBjaGFyICpvcHRpb24pCit7IHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudCA9IHNvYXBfbmV3X211bHRpcGFydChzb2FwLCAmc29hcC0+ZGltZS5maXJzdCwgJnNvYXAtPmRpbWUubGFzdCwgcHRyLCBzaXplKTsKKyAgaWYgKCFjb250ZW50KQorICAgIHJldHVybiBTT0FQX0VPTTsKKyAgY29udGVudC0+aWQgPSBzb2FwX3N0cmR1cChzb2FwLCBpZCk7CisgIGNvbnRlbnQtPnR5cGUgPSBzb2FwX3N0cmR1cChzb2FwLCB0eXBlKTsKKyAgY29udGVudC0+b3B0aW9ucyA9IHNvYXBfZGltZV9vcHRpb24oc29hcCwgb3B0eXBlLCBvcHRpb24pOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NldF9taW1lX2F0dGFjaG1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnB0ciwgc2l6ZV90IHNpemUsIGVudW0gc29hcF9taW1lX2VuY29kaW5nIGVuY29kaW5nLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqbG9jYXRpb24sIGNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uKQoreyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQgPSBzb2FwX25ld19tdWx0aXBhcnQoc29hcCwgJnNvYXAtPm1pbWUuZmlyc3QsICZzb2FwLT5taW1lLmxhc3QsIHB0ciwgc2l6ZSk7CisgIGlmICghY29udGVudCkKKyAgICByZXR1cm4gU09BUF9FT007CisgIGNvbnRlbnQtPmlkID0gc29hcF9zdHJkdXAoc29hcCwgaWQpOworICBjb250ZW50LT50eXBlID0gc29hcF9zdHJkdXAoc29hcCwgdHlwZSk7CisgIGNvbnRlbnQtPmVuY29kaW5nID0gZW5jb2Rpbmc7CisgIGNvbnRlbnQtPmxvY2F0aW9uID0gc29hcF9zdHJkdXAoc29hcCwgbG9jYXRpb24pOworICBjb250ZW50LT5kZXNjcmlwdGlvbiA9IHNvYXBfc3RyZHVwKHNvYXAsIGRlc2NyaXB0aW9uKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwX211bHRpcGFydCoKK1NPQVBfRk1BQzIKK3NvYXBfbmV4dF9tdWx0aXBhcnQoc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50KQoreyBpZiAoY29udGVudCkKKyAgICByZXR1cm4gY29udGVudC0+bmV4dDsKKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyB2b2lkCitzb2FwX3NlbGVjdF9taW1lX2JvdW5kYXJ5KHN0cnVjdCBzb2FwICpzb2FwKQoreyB3aGlsZSAoIXNvYXAtPm1pbWUuYm91bmRhcnkgfHwgc29hcF92YWxpZF9taW1lX2JvdW5kYXJ5KHNvYXApKQorICB7IHJlZ2lzdGVyIGNoYXIgKnMgPSBzb2FwLT5taW1lLmJvdW5kYXJ5OworICAgIHJlZ2lzdGVyIHNpemVfdCBuID0gMDsKKyAgICBpZiAocykKKyAgICAgIG4gPSBzdHJsZW4ocyk7CisgICAgaWYgKG4gPCAxNikKKyAgICB7IG4gPSA2NDsKKyAgICAgIHMgPSBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIG4gKyAxKTsKKyAgICAgIGlmICghcykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdHJjcHkocywgIj09Iik7CisgICAgcyArPSAyOworICAgIG4gLT0gNDsKKyAgICB3aGlsZSAobikKKyAgICB7ICpzKysgPSBzb2FwX2Jhc2U2NG9bc29hcF9yYW5kb20gJiAweDNGXTsKKyAgICAgIG4tLTsKKyAgICB9CisgICAgc3RyY3B5KHMsICI9PSIpOworICB9CisgIGlmICghc29hcC0+bWltZS5zdGFydCkKKyAgICBzb2FwLT5taW1lLnN0YXJ0ID0gIjxTT0FQLUVOVjpFbnZlbG9wZT4iOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzb2FwX3ZhbGlkX21pbWVfYm91bmRhcnkoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgcmVnaXN0ZXIgc2l6ZV90IGsgPSBzdHJsZW4oc29hcC0+bWltZS5ib3VuZGFyeSk7CisgIGZvciAoY29udGVudCA9IHNvYXAtPm1pbWUuZmlyc3Q7IGNvbnRlbnQ7IGNvbnRlbnQgPSBjb250ZW50LT5uZXh0KQorICB7IGlmIChjb250ZW50LT5wdHIgJiYgY29udGVudC0+c2l6ZSA+PSBrKQorICAgIHsgcmVnaXN0ZXIgY29uc3QgY2hhciAqcCA9IChjb25zdCBjaGFyKiljb250ZW50LT5wdHI7IAorICAgICAgcmVnaXN0ZXIgc2l6ZV90IGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgY29udGVudC0+c2l6ZSAtIGs7IGkrKywgcCsrKQorICAgICAgICBpZiAoIXN0cm5jbXAocCwgc29hcC0+bWltZS5ib3VuZGFyeSwgaykpCisgICAgICAgICAgcmV0dXJuIFNPQVBfRVJSOworICAgIH0KKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJSFRUUCBjb29raWUgaGFuZGxpbmcKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgV0lUSF9DT09LSUVTCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQorc2l6ZV90CitTT0FQX0ZNQUMyCitzb2FwX2VuY29kZV9jb29raWUoY29uc3QgY2hhciAqcywgY2hhciAqdCwgc2l6ZV90IGxlbikKK3sgcmVnaXN0ZXIgaW50IGM7CisgIHJlZ2lzdGVyIHNpemVfdCBuID0gbGVuOworICB3aGlsZSAoKGMgPSAqcysrKSAmJiAtLW4gPiAwKQorICB7IGlmIChjID4gJyAnICYmIGMgPCAxMjggJiYgIXN0cmNocigiKCk8PkAsOzpcXFwiL1tdPz17fSIsIGMpKQorICAgICAgKnQrKyA9IGM7CisgICAgZWxzZSBpZiAobiA+IDIpCisgICAgeyAqdCsrID0gJyUnOworICAgICAgKnQrKyA9IChjID4+IDQpICsgKGMgPiAxNTkgPyAnNycgOiAnMCcpOworICAgICAgYyAmPSAweEY7CisgICAgICAqdCsrID0gYyArIChjID4gOSA/ICc3JyA6ICcwJyk7CisgICAgICBuIC09IDI7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGJyZWFrOworICB9CisgICp0ID0gJ1wwJzsKKyAgcmV0dXJuIGxlbiAtIG47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcF9jb29raWUqCitTT0FQX0ZNQUMyCitzb2FwX2Nvb2tpZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIHNpemVfdCBuOworICBpZiAoIWRvbWFpbikKKyAgICBkb21haW4gPSBzb2FwLT5jb29raWVfZG9tYWluOworICBpZiAoIXBhdGgpCisgICAgcGF0aCA9IHNvYXAtPmNvb2tpZV9wYXRoOworICBpZiAoKnBhdGggPT0gJy8nKQorICAgIHBhdGgrKzsKKyAgbiA9IHN0cmxlbihwYXRoKTsKKyAgZm9yIChwID0gc29hcC0+Y29va2llczsgcDsgcCA9IHAtPm5leHQpCisgICAgaWYgKCFzdHJjbXAocC0+bmFtZSwgbmFtZSkKKyAgICAgJiYgZG9tYWluCisgICAgICYmIHAtPmRvbWFpbgorICAgICAmJiAhc3RyY21wKHAtPmRvbWFpbiwgZG9tYWluKQorICAgICAmJiAhc3RybmNtcChwLT5wYXRoLCBwYXRoLCBuKSkKKyAgICAgIGJyZWFrOworICByZXR1cm4gcDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwX2Nvb2tpZSoKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2Nvb2tpZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICoqcCwgKnE7CisgIGludCBuOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNldCBjb29raWU6ICVzPSVzIGRvbWFpbj0lcyBwYXRoPSVzXG4iLCBuYW1lLCB2YWx1ZT92YWx1ZToiIiwgZG9tYWluP2RvbWFpbjoiIiwgcGF0aD9wYXRoOiIiKSk7CisgIGlmICghZG9tYWluKQorICAgIGRvbWFpbiA9IHNvYXAtPmNvb2tpZV9kb21haW47CisgIGlmICghcGF0aCkKKyAgICBwYXRoID0gc29hcC0+Y29va2llX3BhdGg7CisgIGlmICghcGF0aCkKKyAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiQ29va2llIHBhdGggbm90IHNldCIsIE5VTEwsIFNPQVBfSFRUUF9FUlJPUik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKCpwYXRoID09ICcvJykKKyAgICBwYXRoKys7CisgIHEgPSBzb2FwX2Nvb2tpZShzb2FwLCBuYW1lLCBkb21haW4sIHBhdGgpOworICBpZiAoIXEpCisgIHsgaWYgKChxID0gKHN0cnVjdCBzb2FwX2Nvb2tpZSopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2Nvb2tpZSkpKSkKKyAgICB7IGlmICgocS0+bmFtZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4obmFtZSkrMSkpKQorICAgICAgICBzdHJjcHkocS0+bmFtZSwgbmFtZSk7CisgICAgICBxLT52YWx1ZSA9IE5VTEw7CisgICAgICBxLT5kb21haW4gPSBOVUxMOworICAgICAgcS0+cGF0aCA9IE5VTEw7CisgICAgICBxLT5leHBpcmUgPSAtMTsKKyAgICAgIHEtPnZlcnNpb24gPSAwOworICAgICAgcS0+c2VjdXJlID0gMDsKKyAgICAgIHEtPm1vZGlmaWVkID0gMDsKKyAgICAgIGZvciAocCA9ICZzb2FwLT5jb29raWVzLCBuID0gc29hcC0+Y29va2llX21heDsgKnAgJiYgbjsgcCA9ICYoKnApLT5uZXh0LCBuLS0pCisgICAgICAgIGlmICghc3RyY21wKCgqcCktPm5hbWUsIG5hbWUpICYmICgqcCktPnBhdGggJiYgc3RyY21wKCgqcCktPnBhdGgsIHBhdGgpIDwgMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgIGlmIChuKQorICAgICAgeyBxLT5uZXh0ID0gKnA7CisgICAgICAgICpwID0gcTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgU09BUF9GUkVFKHNvYXAsIHEtPm5hbWUpOworICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcSk7CisgICAgICAgIHEgPSBOVUxMOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgICAgcS0+bW9kaWZpZWQgPSAxOworICBpZiAocSkKKyAgeyBpZiAocS0+dmFsdWUpCisgICAgeyBTT0FQX0ZSRUUoc29hcCwgcS0+dmFsdWUpOworICAgICAgcS0+dmFsdWUgPSBOVUxMOworICAgIH0KKyAgICBpZiAocS0+ZG9tYWluKQorICAgIHsgU09BUF9GUkVFKHNvYXAsIHEtPmRvbWFpbik7CisgICAgICBxLT5kb21haW4gPSBOVUxMOworICAgIH0KKyAgICBpZiAocS0+cGF0aCkKKyAgICB7IFNPQVBfRlJFRShzb2FwLCBxLT5wYXRoKTsKKyAgICAgIHEtPnBhdGggPSBOVUxMOworICAgIH0KKyAgICBpZiAodmFsdWUgJiYgKnZhbHVlICYmIChxLT52YWx1ZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4odmFsdWUpKzEpKSkKKyAgICAgIHN0cmNweShxLT52YWx1ZSwgdmFsdWUpOworICAgIGlmIChkb21haW4gJiYgKmRvbWFpbiAmJiAocS0+ZG9tYWluID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihkb21haW4pKzEpKSkKKyAgICAgIHN0cmNweShxLT5kb21haW4sIGRvbWFpbik7CisgICAgaWYgKHBhdGggJiYgKnBhdGggJiYgKHEtPnBhdGggPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHBhdGgpKzEpKSkKKyAgICAgIHN0cmNweShxLT5wYXRoLCBwYXRoKTsKKyAgICBxLT5zZXNzaW9uID0gMTsKKyAgICBxLT5lbnYgPSAwOworICB9CisgIHJldHVybiBxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9jbHJfY29va2llKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqKnAsICpxOworICBpZiAoIWRvbWFpbikKKyAgICBkb21haW4gPSBzb2FwLT5jb29raWVfZG9tYWluOworICBpZiAoIWRvbWFpbikKKyAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiQ29va2llIGRvbWFpbiBub3Qgc2V0IiwgTlVMTCwgU09BUF9IVFRQX0VSUk9SKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFwYXRoKQorICAgIHBhdGggPSBzb2FwLT5jb29raWVfcGF0aDsKKyAgaWYgKCFwYXRoKQorICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJDb29raWUgcGF0aCBub3Qgc2V0IiwgTlVMTCwgU09BUF9IVFRQX0VSUk9SKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCpwYXRoID09ICcvJykKKyAgICBwYXRoKys7CisgIGZvciAocCA9ICZzb2FwLT5jb29raWVzLCBxID0gKnA7IHE7IHEgPSAqcCkKKyAgICBpZiAoIXN0cmNtcChxLT5uYW1lLCBuYW1lKSAmJiAhc3RyY21wKHEtPmRvbWFpbiwgZG9tYWluKSAmJiAhc3RybmNtcChxLT5wYXRoLCBwYXRoLCBzdHJsZW4ocS0+cGF0aCkpKQorICAgIHsgaWYgKHEtPnZhbHVlKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcS0+dmFsdWUpOworICAgICAgaWYgKHEtPmRvbWFpbikKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHEtPmRvbWFpbik7CisgICAgICBpZiAocS0+cGF0aCkKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHEtPnBhdGgpOworICAgICAgKnAgPSBxLT5uZXh0OworICAgICAgU09BUF9GUkVFKHNvYXAsIHEpOworICAgIH0KKyAgICBlbHNlCisgICAgICBwID0gJnEtPm5leHQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfY29va2llX3ZhbHVlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgaWYgKChwID0gc29hcF9jb29raWUoc29hcCwgbmFtZSwgZG9tYWluLCBwYXRoKSkpCisgICAgcmV0dXJuIHAtPnZhbHVlOworICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9lbnZfY29va2llX3ZhbHVlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgaWYgKChwID0gc29hcF9jb29raWUoc29hcCwgbmFtZSwgZG9tYWluLCBwYXRoKSkgJiYgcC0+ZW52KQorICAgIHJldHVybiBwLT52YWx1ZTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitsb25nCitTT0FQX0ZNQUMyCitzb2FwX2Nvb2tpZV9leHBpcmUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBpZiAoKHAgPSBzb2FwX2Nvb2tpZShzb2FwLCBuYW1lLCBkb21haW4sIHBhdGgpKSkKKyAgICByZXR1cm4gcC0+ZXhwaXJlOworICByZXR1cm4gLTE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2Nvb2tpZV9leHBpcmUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGxvbmcgZXhwaXJlLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgaWYgKChwID0gc29hcF9jb29raWUoc29hcCwgbmFtZSwgZG9tYWluLCBwYXRoKSkpCisgIHsgcC0+ZXhwaXJlID0gZXhwaXJlOworICAgIHAtPm1vZGlmaWVkID0gMTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICByZXR1cm4gU09BUF9FUlI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2Nvb2tpZV9zZXNzaW9uKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgaWYgKChwID0gc29hcF9jb29raWUoc29hcCwgbmFtZSwgZG9tYWluLCBwYXRoKSkpCisgIHsgcC0+c2Vzc2lvbiA9IDE7CisgICAgcC0+bW9kaWZpZWQgPSAxOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIHJldHVybiBTT0FQX0VSUjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9jbHJfY29va2llX3Nlc3Npb24oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBpZiAoKHAgPSBzb2FwX2Nvb2tpZShzb2FwLCBuYW1lLCBkb21haW4sIHBhdGgpKSkKKyAgeyBwLT5zZXNzaW9uID0gMDsKKyAgICBwLT5tb2RpZmllZCA9IDE7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgcmV0dXJuIFNPQVBfRVJSOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dHNldGNvb2tpZXMoc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgY2hhciAqcywgdG1wWzQwOTZdOworICBjb25zdCBjaGFyICp0OworICBmb3IgKHAgPSBzb2FwLT5jb29raWVzOyBwOyBwID0gcC0+bmV4dCkKKyAgeyBpZiAocC0+bW9kaWZpZWQgfHwgIXAtPmVudikKKyAgICB7IHMgPSB0bXA7CisgICAgICBpZiAocC0+bmFtZSkKKyAgICAgICAgcyArPSBzb2FwX2VuY29kZV9jb29raWUocC0+bmFtZSwgcywgdG1wLXMrNDA2NCk7CisgICAgICBpZiAocC0+dmFsdWUgJiYgKnAtPnZhbHVlKQorICAgICAgeyAqcysrID0gJz0nOworICAgICAgICBzICs9IHNvYXBfZW5jb2RlX2Nvb2tpZShwLT52YWx1ZSwgcywgdG1wLXMrNDA2NCk7CisgICAgICB9CisgICAgICBpZiAocC0+ZG9tYWluICYmIChpbnQpc3RybGVuKHAtPmRvbWFpbikgPCB0bXAtcys0MDY0KQorICAgICAgICBzcHJpbnRmKHMsICI7RG9tYWluPVwiJXNcIiIsIHAtPmRvbWFpbik7CisgICAgICBlbHNlIGlmIChzb2FwLT5jb29raWVfZG9tYWluICYmIChpbnQpc3RybGVuKHNvYXAtPmNvb2tpZV9kb21haW4pIDwgdG1wLXMrNDA2NCkKKyAgICAgICAgc3ByaW50ZihzLCAiO0RvbWFpbj1cIiVzXCIiLCBzb2FwLT5jb29raWVfZG9tYWluKTsKKyAgICAgIHN0cmNhdChzLCAiO1BhdGg9XCIvIik7CisgICAgICBpZiAocC0+cGF0aCkKKyAgICAgICAgdCA9IHAtPnBhdGg7CisgICAgICBlbHNlCisgICAgICAgIHQgPSBzb2FwLT5jb29raWVfcGF0aDsKKyAgICAgIGlmICh0KQorICAgICAgeyBpZiAoKnQgPT0gJy8nKQorICAgICAgICAgIHQrKzsKKyAgICAgICAgaWYgKChpbnQpc3RybGVuKHQpIDwgdG1wLXMrNDA2NCkKKyAgICAgICAgICBzdHJjYXQocywgdCk7CisgICAgICB9CisgICAgICBzICs9IHN0cmxlbihzKTsKKyAgICAgICpzKysgPSAnIic7CisgICAgICBpZiAocC0+dmVyc2lvbiA+IDApCisgICAgICAgIHNwcmludGYocywgIjtWZXJzaW9uPSV1IiwgcC0+dmVyc2lvbik7CisgICAgICBpZiAocC0+ZXhwaXJlID49IDApCisgICAgICAgIHNwcmludGYocywgIjtNYXgtQWdlPSVsZCIsIHAtPmV4cGlyZSk7CisgICAgICBpZiAocC0+c2VjdXJlKQorICAgICAgICBzdHJjYXQocywgIjtTZWN1cmUiKTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2V0LUNvb2tpZTogJXNcbiIsIHRtcCkpOworICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJTZXQtQ29va2llIiwgdG1wKSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0Y29va2llcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoLCBpbnQgc2VjdXJlKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKipwLCAqcTsKKyAgdW5zaWduZWQgaW50IHZlcnNpb24gPSAwOworICB0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKKyAgY2hhciAqcywgdG1wWzQwOTZdOworICBwID0gJnNvYXAtPmNvb2tpZXM7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2VuZGluZyBjb29raWVzIGZvciBkb21haW49JXMgcGF0aD0lc1xuIiwgZG9tYWluLCBwYXRoKSk7CisgIGlmICgqcGF0aCA9PSAnLycpCisgICAgcGF0aCsrOworICB3aGlsZSAoKHEgPSAqcCkpCisgIHsgaWYgKHEtPmV4cGlyZSAmJiBub3cgPiBxLT5leHBpcmUpCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvb2tpZSAlcyBleHBpcmVkXG4iLCBxLT5uYW1lKSk7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgcS0+bmFtZSk7CisgICAgICBpZiAocS0+dmFsdWUpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBxLT52YWx1ZSk7CisgICAgICBpZiAocS0+ZG9tYWluKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcS0+ZG9tYWluKTsKKyAgICAgIGlmIChxLT5wYXRoKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcS0+cGF0aCk7CisgICAgICAqcCA9IHEtPm5leHQ7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgcSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IHNpemVfdCBkb21sZW4gPSAwOworICAgICAgaWYgKHEtPmRvbWFpbikKKyAgICAgIHsgY29uc3QgY2hhciAqcyA9IHN0cmNocihxLT5kb21haW4sICc6Jyk7CisgICAgICAgIGlmIChzKQorCSAgZG9tbGVuID0gcyAtIHEtPmRvbWFpbjsKKwllbHNlCisgICAgICAgICAgZG9tbGVuID0gc3RybGVuKHEtPmRvbWFpbik7CisgICAgICB9CisgICAgICBpZiAoKCFxLT5kb21haW4gfHwgIXN0cm5jbXAocS0+ZG9tYWluLCBkb21haW4sIGRvbWxlbikpCisgICAgICAgICAgJiYgKCFxLT5wYXRoIHx8ICFzdHJuY21wKHEtPnBhdGgsIHBhdGgsIHN0cmxlbihxLT5wYXRoKSkpCisgICAgICAgICAgJiYgKCFxLT5zZWN1cmUgfHwgc2VjdXJlKSkKKyAgICAgIHsgcyA9IHRtcDsKKyAgICAgICAgaWYgKHEtPnZlcnNpb24gIT0gdmVyc2lvbikKKyAgICAgICAgeyBzcHJpbnRmKHMsICIkVmVyc2lvbj0ldTsiLCBxLT52ZXJzaW9uKTsKKyAgICAgICAgICB2ZXJzaW9uID0gcS0+dmVyc2lvbjsKKyAgICAgICAgfQorICAgICAgICBpZiAocS0+bmFtZSkKKyAgICAgICAgICBzICs9IHNvYXBfZW5jb2RlX2Nvb2tpZShxLT5uYW1lLCBzLCB0bXAtcys0MDgwKTsKKyAgICAgICAgaWYgKHEtPnZhbHVlICYmICpxLT52YWx1ZSkKKyAgICAgICAgeyAqcysrID0gJz0nOworICAgICAgICAgIHMgKz0gc29hcF9lbmNvZGVfY29va2llKHEtPnZhbHVlLCBzLCB0bXAtcys0MDgwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocS0+cGF0aCAmJiAoaW50KXN0cmxlbihxLT5wYXRoKSA8IHRtcC1zKzQwODApCisgICAgICAgIHsgc3ByaW50ZihzLCAiOyRQYXRoPVwiLyVzXCIiLCAoKnEtPnBhdGggPT0gJy8nID8gcS0+cGF0aCArIDEgOiBxLT5wYXRoKSk7CisgICAgICAgICAgcyArPSBzdHJsZW4ocyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHEtPmRvbWFpbiAmJiAoaW50KXN0cmxlbihxLT5kb21haW4pIDwgdG1wLXMrNDA4MCkKKyAgICAgICAgICBzcHJpbnRmKHMsICI7JERvbWFpbj1cIiVzXCIiLCBxLT5kb21haW4pOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvb2tpZTogJXNcbiIsIHRtcCkpOworICAgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkNvb2tpZSIsIHRtcCkpKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIH0KKyAgICAgIHAgPSAmcS0+bmV4dDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2dldGNvb2tpZXMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnZhbCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwID0gTlVMTCwgKnE7CisgIGNvbnN0IGNoYXIgKnM7CisgIGNoYXIgKnQsIHRtcFs0MDk2XTsgLyogY29va2llIHNpemUgaXMgdXAgdG8gNDA5NiBieXRlcyBbUkZDMjEwOV0gKi8KKyAgY2hhciAqZG9tYWluID0gTlVMTDsKKyAgY2hhciAqcGF0aCA9IE5VTEw7CisgIHVuc2lnbmVkIGludCB2ZXJzaW9uID0gMDsKKyAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CisgIGlmICghdmFsKQorICAgIHJldHVybjsKKyAgcyA9IHZhbDsKKyAgd2hpbGUgKCpzKQorICB7IHMgPSBzb2FwX2RlY29kZV9rZXkodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgaWYgKCFzb2FwX3RhZ19jbXAodG1wLCAiJFZlcnNpb24iKSkKKyAgICB7IGlmICgocyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKSkpCisgICAgICB7IGlmIChwKQorICAgICAgICAgIHAtPnZlcnNpb24gPSAoaW50KWF0b2wodG1wKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHZlcnNpb24gPSAoaW50KWF0b2wodG1wKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcCh0bXAsICIkUGF0aCIpKQorICAgIHsgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgIGlmICgqdG1wKQorICAgICAgeyBpZiAoKHQgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHRtcCkrMSkpKQorICAgICAgICAgIHN0cmNweSh0LCB0bXApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB0ID0gTlVMTDsKKyAgICAgIGlmIChwKQorICAgICAgeyBpZiAocC0+cGF0aCkKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+cGF0aCk7CisgICAgICAgIHAtPnBhdGggPSB0OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBpZiAocGF0aCkKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcGF0aCk7CisgICAgICAgIHBhdGggPSB0OworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHRtcCwgIiREb21haW4iKSkKKyAgICB7IHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICBpZiAoKnRtcCkKKyAgICAgIHsgaWYgKCh0ID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbih0bXApKzEpKSkKKyAgICAgICAgICBzdHJjcHkodCwgdG1wKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgdCA9IE5VTEw7CisgICAgICBpZiAocCkKKyAgICAgIHsgaWYgKHAtPmRvbWFpbikKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+ZG9tYWluKTsKKwlwLT5kb21haW4gPSB0OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBpZiAoZG9tYWluKQorICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCBkb21haW4pOworICAgICAgICBkb21haW4gPSB0OworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChwICYmICFzb2FwX3RhZ19jbXAodG1wLCAiUGF0aCIpKQorICAgIHsgaWYgKHAtPnBhdGgpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5wYXRoKTsKKyAgICAgIHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICBpZiAoKnRtcCkKKyAgICAgIHsgaWYgKChwLT5wYXRoID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbih0bXApKzEpKSkKKyAgICAgICAgICBzdHJjcHkocC0+cGF0aCwgdG1wKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcC0+cGF0aCA9IE5VTEw7CisgICAgfQorICAgIGVsc2UgaWYgKHAgJiYgIXNvYXBfdGFnX2NtcCh0bXAsICJEb21haW4iKSkKKyAgICB7IGlmIChwLT5kb21haW4pCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5kb21haW4pOworICAgICAgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgIGlmICgqdG1wKQorICAgICAgeyBpZiAoKHAtPmRvbWFpbiA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4odG1wKSsxKSkpCisgICAgICAgICAgc3RyY3B5KHAtPmRvbWFpbiwgdG1wKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcC0+ZG9tYWluID0gTlVMTDsKKyAgICB9CisgICAgZWxzZSBpZiAocCAmJiAhc29hcF90YWdfY21wKHRtcCwgIlZlcnNpb24iKSkKKyAgICB7IHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICBwLT52ZXJzaW9uID0gKHVuc2lnbmVkIGludClhdG9sKHRtcCk7CisgICAgfQorICAgIGVsc2UgaWYgKHAgJiYgIXNvYXBfdGFnX2NtcCh0bXAsICJNYXgtQWdlIikpCisgICAgeyBzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgICAgcC0+ZXhwaXJlID0gbm93ICsgYXRvbCh0bXApOworICAgIH0KKyAgICBlbHNlIGlmIChwICYmICFzb2FwX3RhZ19jbXAodG1wLCAiRXhwaXJlcyIpKQorICAgIHsgc3RydWN0IHRtIFQ7CisgICAgICBjaGFyIGFbM107IAorICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbW5zW10gPSAiYW5lYmFycHJheXVudWx1Z2VwY3RvdmVjIjsKKyAgICAgIHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICBpZiAoc3RybGVuKHRtcCkgPiAyMCkKKyAgICAgIHsgbWVtc2V0KCh2b2lkKikmVCwgMCwgc2l6ZW9mKFQpKTsKKyAgICAgICAgYVswXSA9IHRtcFs0XTsKKyAgICAgICAgYVsxXSA9IHRtcFs1XTsKKyAgICAgICAgYVsyXSA9ICdcMCc7CisgICAgICAgIFQudG1fbWRheSA9IChpbnQpYXRvbChhKTsKKyAgICAgICAgYVswXSA9IHRtcFs4XTsKKyAgICAgICAgYVsxXSA9IHRtcFs5XTsKKyAgICAgICAgVC50bV9tb24gPSAoc3Ryc3RyKG1ucywgYSkgLSBtbnMpIC8gMjsKKyAgICAgICAgYVswXSA9IHRtcFsxMV07CisgICAgICAgIGFbMV0gPSB0bXBbMTJdOworICAgICAgICBULnRtX3llYXIgPSAxMDAgKyAoaW50KWF0b2woYSk7CisgICAgICAgIGFbMF0gPSB0bXBbMTNdOworICAgICAgICBhWzFdID0gdG1wWzE0XTsKKyAgICAgICAgVC50bV9ob3VyID0gKGludClhdG9sKGEpOworICAgICAgICBhWzBdID0gdG1wWzE2XTsKKyAgICAgICAgYVsxXSA9IHRtcFsxN107CisgICAgICAgIFQudG1fbWluID0gKGludClhdG9sKGEpOworICAgICAgICBhWzBdID0gdG1wWzE5XTsKKyAgICAgICAgYVsxXSA9IHRtcFsyMF07CisgICAgICAgIFQudG1fc2VjID0gKGludClhdG9sKGEpOworICAgICAgICBwLT5leHBpcmUgPSBzb2FwX3RpbWVnbSgmVCk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHAgJiYgIXNvYXBfdGFnX2NtcCh0bXAsICJTZWN1cmUiKSkKKyAgICAgIHAtPnNlY3VyZSA9IDE7CisgICAgZWxzZQorICAgIHsgaWYgKHApCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR290IGVudmlyb25tZW50IGNvb2tpZSAlcz0lcyBkb21haW49JXMgcGF0aD0lcyBleHBpcmU9JWxkIHNlY3VyZT0lZFxuIiwgcC0+bmFtZSwgcC0+dmFsdWU/cC0+dmFsdWU6IiIsIHAtPmRvbWFpbj9wLT5kb21haW46IiIsIHAtPnBhdGg/cC0+cGF0aDoiIiwgcC0+ZXhwaXJlLCBwLT5zZWN1cmUpKTsKKyAgICAgICAgaWYgKChxID0gc29hcF9zZXRfY29va2llKHNvYXAsIHAtPm5hbWUsIHAtPnZhbHVlLCBwLT5kb21haW4sIHAtPnBhdGgpKSkKKyAgICAgICAgeyBxLT52ZXJzaW9uID0gcC0+dmVyc2lvbjsKKyAgICAgICAgICBxLT5leHBpcmUgPSBwLT5leHBpcmU7CisgICAgICAgICAgcS0+c2VjdXJlID0gcC0+c2VjdXJlOworICAgICAgICAgIHEtPmVudiA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHAtPm5hbWUpCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPm5hbWUpOworICAgICAgICBpZiAocC0+dmFsdWUpCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnZhbHVlKTsKKyAgICAgICAgaWYgKHAtPmRvbWFpbikKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+ZG9tYWluKTsKKyAgICAgICAgaWYgKHAtPnBhdGgpCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnBhdGgpOworICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcCk7CisgICAgICB9CisgICAgICBpZiAoKHAgPSAoc3RydWN0IHNvYXBfY29va2llKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfY29va2llKSkpKQorICAgICAgeyBwLT5uYW1lID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbih0bXApKzEpOworICAgICAgICBzdHJjcHkocC0+bmFtZSwgdG1wKTsKKyAgICAgICAgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgICAgaWYgKCp0bXApCisgICAgICAgIHsgcC0+dmFsdWUgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHRtcCkrMSk7CisgICAgICAgICAgc3RyY3B5KHAtPnZhbHVlLCB0bXApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwLT52YWx1ZSA9IE5VTEw7CisgICAgICAgIHAtPmRvbWFpbiA9IGRvbWFpbjsKKyAgICAgICAgcC0+cGF0aCA9IHBhdGg7CisgICAgICAgIHAtPmV4cGlyZSA9IDA7CisgICAgICAgIHAtPnNlY3VyZSA9IDA7CisgICAgICAgIHAtPnZlcnNpb24gPSB2ZXJzaW9uOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAocCkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdvdCBlbnZpcm9ubWVudCBjb29raWUgJXM9JXMgZG9tYWluPSVzIHBhdGg9JXMgZXhwaXJlPSVsZCBzZWN1cmU9JWRcbiIsIHAtPm5hbWUsIHAtPnZhbHVlP3AtPnZhbHVlOiIiLCBwLT5kb21haW4/cC0+ZG9tYWluOiIiLCBwLT5wYXRoP3AtPnBhdGg6IiIsIHAtPmV4cGlyZSwgcC0+c2VjdXJlKSk7CisgICAgaWYgKChxID0gc29hcF9zZXRfY29va2llKHNvYXAsIHAtPm5hbWUsIHAtPnZhbHVlLCBwLT5kb21haW4sIHAtPnBhdGgpKSkKKyAgICB7IHEtPnZlcnNpb24gPSBwLT52ZXJzaW9uOworICAgICAgcS0+ZXhwaXJlID0gcC0+ZXhwaXJlOworICAgICAgcS0+c2VjdXJlID0gcC0+c2VjdXJlOworICAgICAgcS0+ZW52ID0gMTsKKyAgICB9CisgICAgaWYgKHAtPm5hbWUpCisgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+bmFtZSk7CisgICAgaWYgKHAtPnZhbHVlKQorICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnZhbHVlKTsKKyAgICBpZiAocC0+ZG9tYWluKQorICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPmRvbWFpbik7CisgICAgaWYgKHAtPnBhdGgpCisgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+cGF0aCk7CisgICAgU09BUF9GUkVFKHNvYXAsIHApOworICB9CisgIGlmIChkb21haW4pCisgICAgU09BUF9GUkVFKHNvYXAsIGRvbWFpbik7CisgIGlmIChwYXRoKQorICAgIFNPQVBfRlJFRShzb2FwLCBwYXRoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRlbnZfY29va2llcyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBjb25zdCBjaGFyICpzOworICBjaGFyIGtleVs0MDk2XSwgdmFsWzQwOTZdOyAvKiBjb29raWUgc2l6ZSBpcyB1cCB0byA0MDk2IGJ5dGVzIFtSRkMyMTA5XSAqLworICBpZiAoIShzID0gZ2V0ZW52KCJIVFRQX0NPT0tJRSIpKSkKKyAgICByZXR1cm4gU09BUF9FUlI7CisgIGRvCisgIHsgcyA9IHNvYXBfZGVjb2RlX2tleShrZXksIHNpemVvZihrZXkpLCBzKTsKKyAgICBzID0gc29hcF9kZWNvZGVfdmFsKHZhbCwgc2l6ZW9mKHZhbCksIHMpOworICAgIHAgPSBzb2FwX3NldF9jb29raWUoc29hcCwga2V5LCB2YWwsIE5VTEwsIE5VTEwpOworICAgIGlmIChwKQorICAgICAgcC0+ZW52ID0gMTsKKyAgfSB3aGlsZSAoKnMpOworICByZXR1cm4gU09BUF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwX2Nvb2tpZSoKK1NPQVBfRk1BQzIKK3NvYXBfY29weV9jb29raWVzKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnAsICoqcSwgKnI7CisgIHEgPSAmcjsKKyAgZm9yIChwID0gc29hcC0+Y29va2llczsgcDsgcCA9IHAtPm5leHQpCisgIHsgaWYgKCEoKnEgPSAoc3RydWN0IHNvYXBfY29va2llKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfY29va2llKSkpKQorICAgICAgcmV0dXJuIHI7CisgICAgKipxID0gKnA7CisgICAgaWYgKHAtPm5hbWUpCisgICAgeyBpZiAoKCgqcSktPm5hbWUgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHAtPm5hbWUpKzEpKSkKKyAgICAgICAgc3RyY3B5KCgqcSktPm5hbWUsIHAtPm5hbWUpOworICAgIH0KKyAgICBpZiAocC0+dmFsdWUpCisgICAgeyBpZiAoKCgqcSktPnZhbHVlID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihwLT52YWx1ZSkrMSkpKQorICAgICAgICBzdHJjcHkoKCpxKS0+dmFsdWUsIHAtPnZhbHVlKTsKKyAgICB9CisgICAgaWYgKHAtPmRvbWFpbikKKyAgICB7IGlmICgoKCpxKS0+ZG9tYWluID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihwLT5kb21haW4pKzEpKSkKKyAgICAgICAgc3RyY3B5KCgqcSktPmRvbWFpbiwgcC0+ZG9tYWluKTsKKyAgICB9CisgICAgaWYgKHAtPnBhdGgpCisgICAgeyBpZiAoKCgqcSktPnBhdGggPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHAtPnBhdGgpKzEpKSkKKyAgICAgICAgc3RyY3B5KCgqcSktPnBhdGgsIHAtPnBhdGgpOworICAgIH0KKyAgICBxID0gJigqcSktPm5leHQ7CisgIH0KKyAgKnEgPSBOVUxMOworICByZXR1cm4gcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZnJlZV9jb29raWVzKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGZvciAocCA9IHNvYXAtPmNvb2tpZXM7IHA7IHAgPSBzb2FwLT5jb29raWVzKQorICB7IHNvYXAtPmNvb2tpZXMgPSBwLT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBwLT5uYW1lKTsKKyAgICBpZiAocC0+dmFsdWUpCisgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+dmFsdWUpOworICAgIGlmIChwLT5kb21haW4pCisgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+ZG9tYWluKTsKKyAgICBpZiAocC0+cGF0aCkKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5wYXRoKTsKKyAgICBTT0FQX0ZSRUUoc29hcCwgcCk7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNlbmRpZiAvKiBXSVRIX0NPT0tJRVMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBXSVRIX0daSVAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzb2FwX2dldGd6aXBoZHIoc3RydWN0IHNvYXAgKnNvYXApCit7IGludCBpOworICBzb2FwX3djaGFyIGMsIGYgPSAwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdldCBnemlwIGhlYWRlclxuIikpOworICBmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKQorICB7IGlmICgoaW50KShjID0gc29hcF9nZXQxKHNvYXApID09IEVPRikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICBpZiAoaSA9PSAyKQorICAgICAgZiA9IGM7CisgIH0KKyAgaWYgKGYgJiAweDA0KSAvKiBGRVhUUkEgKi8KKyAgeyBmb3IgKGkgPSBzb2FwX2dldDEoc29hcCkgfCAoc29hcF9nZXQxKHNvYXApIDw8IDgpOyBpOyBpLS0pCisgICAgICBpZiAoKGludClzb2FwX2dldDEoc29hcCkgPT0gRU9GKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgfQorICBpZiAoZiAmIDB4MDgpIC8qIEZOQU1FICovCisgICAgZG8KKyAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgd2hpbGUgKGMgJiYgKGludCljICE9IEVPRik7CisgIGlmICgoaW50KWMgIT0gRU9GICYmIChmICYgMHgxMCkpIC8qIEZDT01NRU5UICovCisgICAgZG8KKyAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgd2hpbGUgKGMgJiYgKGludClmICE9IEVPRik7CisgIGlmICgoaW50KWMgIT0gRU9GICYmIChmICYgMHgwMSkpIC8qIEZIQ1JDICovCisgIHsgaWYgKChpbnQpKGMgPSBzb2FwX2dldDEoc29hcCkpICE9IEVPRikKKyAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgIH0KKyAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYmVnaW5fcmVjdihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcF93Y2hhciBjOworICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIHNvYXBfZnJlZShzb2FwKTsKKyAgc29hcF9zZXRfbG9jYWxfbmFtZXNwYWNlcyhzb2FwKTsKKyAgc29hcC0+dmVyc2lvbiA9IDA7CS8qIGRvbid0IGFzc3VtZSB3ZSdyZSBwYXJzaW5nIFNPQVAgY29udGVudCBieSBkZWZhdWx0ICovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICBzb2FwX2ZyZWVfaWh0KHNvYXApOworI2VuZGlmCisgIGlmICgoc29hcC0+aW1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKQorICAgIHNvYXAtPm9tb2RlIHw9IFNPQVBfSU9fQ0hVTks7CisgIHNvYXAtPmltb2RlICY9IH5TT0FQX0lPOworICBzb2FwLT5tb2RlID0gc29hcC0+aW1vZGU7CisgIGlmICghc29hcC0+a2VlcF9hbGl2ZSkKKyAgeyBzb2FwLT5idWZsZW4gPSAwOworICAgIHNvYXAtPmJ1ZmlkeCA9IDA7CisgIH0KKyAgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfSU9fS0VFUEFMSVZFKSkKKyAgICBzb2FwLT5rZWVwX2FsaXZlID0gMDsKKyAgc29hcC0+YWhlYWQgPSAwOworICBzb2FwLT5wZWVrZWQgPSAwOworICBzb2FwLT5sZXZlbCA9IDA7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0JFR0lOOworICBzb2FwLT5hbGxvY2VkID0gMDsKKyAgc29hcC0+Y291bnQgPSAwOworICBzb2FwLT5sZW5ndGggPSAwOworICBzb2FwLT5jZGF0YSA9IDA7CisgICpzb2FwLT5lbmRwb2ludCA9ICdcMCc7CisgIHNvYXAtPmFjdGlvbiA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXAtPmRvbSA9IE5VTEw7CisgIHNvYXAtPmRpbWUuY2h1bmtzaXplID0gMDsKKyAgc29hcC0+ZGltZS5idWZsZW4gPSAwOworICBzb2FwLT5kaW1lLmxpc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5sYXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5saXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuYm91bmRhcnkgPSBOVUxMOworICBzb2FwLT5taW1lLnN0YXJ0ID0gTlVMTDsKKyAgc29hcC0+eGxpc3QgPSBOVUxMOworI2VuZGlmCisjaWZkZWYgV0lOMzIKKyNpZm5kZWYgVU5ERVJfQ0UKKyNpZm5kZWYgV0lUSF9GQVNUQ0dJCisgIGlmICghc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyNpZmRlZiBfX0JPUkxBTkRDX18KKyAgICBzZXRtb2RlKChTT0FQX1NPQ0tFVClzb2FwLT5yZWN2ZmQsIE9fQklOQVJZKTsKKyNlbHNlCisgICAgX3NldG1vZGUoKFNPQVBfU09DS0VUKXNvYXAtPnJlY3ZmZCwgX09fQklOQVJZKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIFdJVEhfWkxJQgorICBzb2FwLT5tb2RlICY9IH5TT0FQX0VOQ19aTElCOworICBzb2FwLT56bGliX2luID0gU09BUF9aTElCX05PTkU7CisgIHNvYXAtPnpsaWJfb3V0ID0gU09BUF9aTElCX05PTkU7CisgIHNvYXAtPmRfc3RyZWFtLm5leHRfaW4gPSBaX05VTEw7CisgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luID0gMDsKKyAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZSopc29hcC0+YnVmOworICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgPSBTT0FQX0JVRkxFTjsKKyAgc29hcC0+el9yYXRpb19pbiA9IDEuMDsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+ZnByZXBhcmVpbml0KQorICAgIHNvYXAtPmZwcmVwYXJlaW5pdChzb2FwKTsKKyNlbmRpZgorICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworI2lmZGVmIFdJVEhfR1pJUAorICBpZiAoYyA9PSAweDFGKQorICB7IGlmIChzb2FwX2dldGd6aXBoZHIoc29hcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKGluZmxhdGVJbml0Migmc29hcC0+ZF9zdHJlYW0sIC1NQVhfV0JJVFMpICE9IFpfT0spCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9JTkZMQVRFOworICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfWkxJQjsKKyAgICBzb2FwLT56bGliX2luID0gU09BUF9aTElCX0daSVA7CisgICAgc29hcC0+el9jcmMgPSBjcmMzMigwTCwgTlVMTCwgMCk7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJnemlwIGluaXRpYWxpemVkXG4iKSk7CisgICAgbWVtY3B5KHNvYXAtPnpfYnVmLCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOKTsKKyAgICAvKiBzaG91bGQgbm90IGNodW5rIG92ZXIgcGxhaW4gdHJhbnNwb3J0LCBzbyB3aHkgYm90aGVyIHRvIGNoZWNrPyAqLworICAgIC8qIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspICovCisgICAgLyogICBzb2FwLT56X2J1ZmxlbiA9IHNvYXAtPmJ1ZmlkeDsgKi8KKyAgICAvKiBlbHNlICovCisgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9pbiA9IChCeXRlKikoc29hcC0+el9idWYgKyBzb2FwLT5idWZpZHgpOworICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luID0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgIHNvYXAtPnpfYnVmbGVuID0gc29hcC0+YnVmbGVuOworICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmJ1ZmlkeDsKKyAgICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICB9ICAKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoYyA9PSAnLScgJiYgc29hcF9nZXQwKHNvYXApID09ICctJykKKyAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX01JTUU7CisgIGVsc2UgaWYgKChjICYgMHhGRkZDKSA9PSAoU09BUF9ESU1FX1ZFUlNJT04gfCBTT0FQX0RJTUVfTUIpICYmIChzb2FwX2dldDAoc29hcCkgJiAweEZGRjApID09IDB4MjApCisgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19ESU1FOworICBlbHNlCisjZW5kaWYKKyAgeyB3aGlsZSAoc29hcF9ibGFuayhjKSkKKyAgICAgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgIH0KKyAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisjaWZuZGVmIFdJVEhfTk9IVFRQCisgIC8qIGlmIG5vdCBYTUwgb3IgKHN0YXJ0IG9mKUJPTSBvciBNSU1FL0RJTUUvWkxJQiwgYXNzdW1lIEhUVFAgaGVhZGVyICovCisgIGlmIChjICE9ICc8JyAmJiBjICE9IDB4RUYgJiYgIShzb2FwLT5tb2RlICYgKFNPQVBfRU5DX01JTUUgfCBTT0FQX0VOQ19ESU1FIHwgU09BUF9FTkNfWkxJQikpKQorICB7IHNvYXAtPm1vZGUgJj0gflNPQVBfSU87CisgICAgc29hcC0+ZXJyb3IgPSBzb2FwLT5mcGFyc2Uoc29hcCk7CisgICAgaWYgKHNvYXAtPmVycm9yICYmIHNvYXAtPmVycm9yIDwgU09BUF9TVE9QKQorICAgIHsgc29hcC0+a2VlcF9hbGl2ZSA9IDA7IC8qIGZvcmNlIGNsb3NlIGxhdGVyICovCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgICAgeyBzb2FwLT5jaHVua2J1ZmxlbiA9IHNvYXAtPmJ1ZmxlbjsKKyAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmJ1ZmlkeDsKKyAgICAgIHNvYXAtPmNodW5rc2l6ZSA9IDA7CisgICAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICAgIGVsc2UgaWYgKHNvYXAtPmZwcmVwYXJlcmVjdiAmJiBzb2FwLT5idWZsZW4gIT0gc29hcC0+YnVmaWR4KQorICAgICAgc29hcC0+ZnByZXBhcmVyZWN2KHNvYXAsIHNvYXAtPmJ1ZiArIHNvYXAtPmJ1ZmlkeCwgc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4KTsKKyNlbmRpZgorI2lmZGVmIFdJVEhfWkxJQgorICAgIGlmIChzb2FwLT56bGliX2luICE9IFNPQVBfWkxJQl9OT05FKQorICAgIHsgLyogZnBhcnNlIHNob3VsZCBub3QgdXNlIHNvYXBfdW5nZXQgdG8gcHVzaCBiYWNrIGxhc3QgY2hhciAqLworI2lmZGVmIFdJVEhfR1pJUAorICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgIGlmIChjID09IDB4MUYpCisgICAgICB7IGlmIChzb2FwX2dldGd6aXBoZHIoc29hcCkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBpZiAoaW5mbGF0ZUluaXQyKCZzb2FwLT5kX3N0cmVhbSwgLU1BWF9XQklUUykgIT0gWl9PSykKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgICAgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfSU5GTEFURTsKKyAgICAgICAgc29hcC0+el9jcmMgPSBjcmMzMigwTCwgTlVMTCwgMCk7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZ3ppcCBpbml0aWFsaXplZFxuIikpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBzb2FwX3JldmdldDEoc29hcCk7CisjZWxzZQorICAgICAgeworI2VuZGlmCisgICAgICAgIGlmIChpbmZsYXRlSW5pdCgmc29hcC0+ZF9zdHJlYW0pICE9IFpfT0spCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgICBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX0lORkxBVEU7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5mbGF0ZSBpbml0aWFsaXplZFxuIikpOworICAgICAgfQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19aTElCOworICAgICAgbWVtY3B5KHNvYXAtPnpfYnVmLCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOKTsKKyAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfaW4gPSAoQnl0ZSopKHNvYXAtPnpfYnVmICsgc29hcC0+YnVmaWR4KTsKKyAgICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luID0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgICAgc29hcC0+el9idWZsZW4gPSBzb2FwLT5idWZsZW47CisgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5idWZpZHg7CisgICAgfQorI2VuZGlmCisgICAgaWYgKHNvYXAtPmVycm9yKQorICAgIHsgaWYgKHNvYXAtPmVycm9yID09IFNPQVBfRk9STSAmJiBzb2FwLT5mZm9ybSkKKyAgICAgIHsgc29hcC0+ZXJyb3IgPSBzb2FwLT5mZm9ybShzb2FwKTsKKyAgICAgICAgaWYgKHNvYXAtPmVycm9yID09IFNPQVBfT0spCisgICAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1NUT1A7IC8qIHByZXZlbnRzIGZ1cnRoZXIgcHJvY2Vzc2luZyAqLworICAgICAgfQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgfQorI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkKKyAgeyBpZiAoc29hcF9nZXRtaW1laGRyKHNvYXApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmIChzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHNvYXAtPm1pbWUuZmlyc3QtPnR5cGUsICJhcHBsaWNhdGlvbi9kaW1lIikpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX0RJTUU7CisgIH0KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKQorICB7IGlmIChzb2FwX2dldGRpbWVoZHIoc29hcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHNvYXAtPmRpbWUuZmxhZ3MgJiBTT0FQX0RJTUVfQ0YpCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNodW5rZWQgRElNRSBTT0FQIG1lc3NhZ2VcbiIpKTsKKyAgICAgIHNvYXAtPmRpbWUuY2h1bmtzaXplID0gc29hcC0+ZGltZS5zaXplOworICAgICAgaWYgKHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeCA+PSBzb2FwLT5kaW1lLmNodW5rc2l6ZSkKKyAgICAgIHsgc29hcC0+ZGltZS5idWZsZW4gPSBzb2FwLT5idWZsZW47CisgICAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmJ1ZmlkeCArIHNvYXAtPmRpbWUuY2h1bmtzaXplOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBzb2FwLT5kaW1lLmNodW5rc2l6ZSAtPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgfQorICAgIHNvYXAtPmNvdW50ID0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICB9CisjZW5kaWYKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50CitodHRwX3BhcnNlKHN0cnVjdCBzb2FwICpzb2FwKQoreyBjaGFyIGhlYWRlcltTT0FQX0hEUkxFTl0sICpzOworICB1bnNpZ25lZCBzaG9ydCBnZXQgPSAwLCBzdGF0dXMgPSAwLCBrID0gMDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJXYWl0aW5nIGZvciBIVFRQIHJlcXVlc3QvcmVzcG9uc2UuLi5cbiIpKTsKKyAgKnNvYXAtPmVuZHBvaW50ID0gJ1wwJzsKKyAgc29hcC0+bGVuZ3RoID0gMDsKKyAgc29hcC0+dXNlcmlkID0gTlVMTDsKKyAgc29hcC0+cGFzc3dkID0gTlVMTDsKKyAgc29hcC0+YWN0aW9uID0gTlVMTDsKKyAgc29hcC0+YXV0aHJlYWxtID0gTlVMTDsKKyAgZG8KKyAgeyBpZiAoc29hcF9nZXRsaW5lKHNvYXAsIHNvYXAtPm1zZ2J1Ziwgc2l6ZW9mKHNvYXAtPm1zZ2J1ZikpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJIVFRQIHN0YXR1czogJXNcbiIsIHNvYXAtPm1zZ2J1ZikpOworICAgIGZvciAoOzspCisgICAgeyBpZiAoc29hcF9nZXRsaW5lKHNvYXAsIGhlYWRlciwgU09BUF9IRFJMRU4pKQorICAgICAgeyBpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9FT0YpCisJeyBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgICAgICAgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVPRiBpbiBIVFRQIGhlYWRlciwgY29udGludWUgYW55d2F5XG4iKSk7CisJICBicmVhazsKKwl9CisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIH0KKyAgICAgIGlmICghKmhlYWRlcikKKyAgICAgICAgYnJlYWs7CisgICAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiSFRUUCBoZWFkZXI6ICVzXG4iLCBoZWFkZXIpKTsKKyAgICAgIHMgPSBzdHJjaHIoaGVhZGVyLCAnOicpOworICAgICAgaWYgKHMpCisgICAgICB7ICpzID0gJ1wwJzsKKyAgICAgICAgZG8gcysrOworICAgICAgICB3aGlsZSAoKnMgJiYgKnMgPD0gMzIpOworICAgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBhcnNlaGRyKHNvYXAsIGhlYWRlciwgcykpKQorICAgICAgICB7IGlmIChzb2FwLT5lcnJvciA8IFNPQVBfU1RPUCkKKwkgICAgcmV0dXJuIHNvYXAtPmVycm9yOworCSAgc3RhdHVzID0gc29hcC0+ZXJyb3I7CisJICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKChzID0gc3RyY2hyKHNvYXAtPm1zZ2J1ZiwgJyAnKSkpCisgICAgeyBrID0gKHVuc2lnbmVkIHNob3J0KXNvYXBfc3RydG91bChzLCAmcywgMTApOworICAgICAgaWYgKCFzb2FwX2JsYW5rKCpzKSkKKyAgICAgICAgayA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGsgPSAwOworICB9IHdoaWxlIChrID09IDEwMCk7CisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJGaW5pc2hlZCBIVFRQIGhlYWRlciBwYXJzaW5nXG4iKSk7CisgIHMgPSBzdHJzdHIoc29hcC0+bXNnYnVmLCAiSFRUUC8iKTsKKyAgaWYgKHMgJiYgc1s3XSAhPSAnMScpCisgIHsgaWYgKHNvYXAtPmtlZXBfYWxpdmUgPT0gMSkKKyAgICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOworICAgIGlmIChrID09IDAgJiYgKHNvYXAtPm9tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykgLyogayA9PSAwIGZvciBIVFRQIHJlcXVlc3QgKi8KKyAgICB7IHNvYXAtPmltb2RlIHw9IFNPQVBfSU9fQ0hVTks7CisgICAgICBzb2FwLT5vbW9kZSA9IChzb2FwLT5vbW9kZSAmIH5TT0FQX0lPKSB8IFNPQVBfSU9fU1RPUkU7CisgICAgfQorICB9CisgIGlmIChzb2FwLT5rZWVwX2FsaXZlIDwgMCkKKyAgICBzb2FwLT5rZWVwX2FsaXZlID0gMTsKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIktlZXAgYWxpdmUgY29ubmVjdGlvbiA9ICVkXG4iLCBzb2FwLT5rZWVwX2FsaXZlKSk7CisgIGlmIChzICYmICgoKGdldCA9ICFzdHJuY21wKHNvYXAtPm1zZ2J1ZiwgIkdFVCAiLCA0KSkpIHx8ICFzdHJuY21wKHNvYXAtPm1zZ2J1ZiwgIlBPU1QgIiwgNSkpKQorICB7IHNpemVfdCBtID0gc3RybGVuKHNvYXAtPmVuZHBvaW50KTsKKyAgICBzaXplX3QgbiA9IG0gKyAocyAtIHNvYXAtPm1zZ2J1ZikgLSA1IC0gKCFnZXQpOworICAgIGlmIChuID49IHNpemVvZihzb2FwLT5lbmRwb2ludCkpCisgICAgICBuID0gc2l6ZW9mKHNvYXAtPmVuZHBvaW50KSAtIDE7CisgICAgc3RybmNweShzb2FwLT5wYXRoLCBzb2FwLT5tc2didWYgKyA0ICsgKCFnZXQpLCBuIC0gbSk7CisgICAgc29hcC0+cGF0aFtuIC0gbV0gPSAnXDAnOworICAgIHN0cmNhdChzb2FwLT5lbmRwb2ludCwgc29hcC0+cGF0aCk7CisgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlRhcmdldCBlbmRwb2ludD0nJXMnXG4iLCBzb2FwLT5lbmRwb2ludCkpOworICAgIGlmIChnZXQpCisgICAgeyBzb2FwLT5lcnJvciA9IHNvYXAtPmZnZXQoc29hcCk7CisgICAgICBpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9PSykKKyAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1NUT1A7IC8qIHByZXZlbnRzIGZ1cnRoZXIgcHJvY2Vzc2luZyAqLworICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBpZiAoc3RhdHVzKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gc3RhdHVzOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIGlmIChrID09IDAgfHwgKGsgPj0gMjAwICYmIGsgPD0gMjk5KSB8fCBrID09IDQwMCB8fCBrID09IDUwMCkKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkhUVFAgZXJyb3IgJWRcbiIsIGspKTsKKyAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJIVFRQIGVycm9yIiwgc29hcC0+bXNnYnVmLCBrKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAoraHR0cF9wYXJzZV9oZWFkZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsKQoreyBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJIb3N0IikpCisgIHsgCisjaWZkZWYgV0lUSF9PUEVOU1NMCisgICAgaWYgKHNvYXAtPmltb2RlICYgU09BUF9FTkNfU1NMKQorICAgICAgc3RyY3B5KHNvYXAtPmVuZHBvaW50LCAiaHR0cHM6Ly8iKTsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgIHN0cmNweShzb2FwLT5lbmRwb2ludCwgImh0dHA6Ly8iKTsKKyAgICBzdHJuY2F0KHNvYXAtPmVuZHBvaW50LCB2YWwsIHNpemVvZihzb2FwLT5lbmRwb2ludCkgLSA4KTsKKyAgICBzb2FwLT5lbmRwb2ludFtzaXplb2Yoc29hcC0+ZW5kcG9pbnQpIC0gMV0gPSAnXDAnOworICB9CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1UeXBlIikpCisgIHsgaWYgKHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAiYXBwbGljYXRpb24vZGltZSIpKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19ESU1FOworICAgIGVsc2UgaWYgKHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAibXVsdGlwYXJ0L3JlbGF0ZWQiKQorICAgICAgICAgIHx8IHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAibXVsdGlwYXJ0L2Zvcm0tZGF0YSIpKQorICAgIHsgc29hcC0+bWltZS5ib3VuZGFyeSA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAiYm91bmRhcnkiKSk7CisgICAgICBzb2FwLT5taW1lLnN0YXJ0ID0gc29hcF9zdHJkdXAoc29hcCwgc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwsICJzdGFydCIpKTsKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfTUlNRTsKKyAgICB9CisgIH0KKyNlbmRpZgorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtTGVuZ3RoIikpCisgICAgc29hcC0+bGVuZ3RoID0gc29hcF9zdHJ0b3VsKHZhbCwgTlVMTCwgMTApOworICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtRW5jb2RpbmciKSkKKyAgeyBpZiAoIXNvYXBfdGFnX2NtcCh2YWwsICJkZWZsYXRlIikpCisjaWZkZWYgV0lUSF9aTElCCisgICAgICBzb2FwLT56bGliX2luID0gU09BUF9aTElCX0RFRkxBVEU7CisjZWxzZQorICAgICAgcmV0dXJuIFNPQVBfWkxJQl9FUlJPUjsKKyNlbmRpZgorICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAodmFsLCAiZ3ppcCIpKQorI2lmZGVmIFdJVEhfR1pJUAorICAgICAgc29hcC0+emxpYl9pbiA9IFNPQVBfWkxJQl9HWklQOworI2Vsc2UKKyAgICAgIHJldHVybiBTT0FQX1pMSUJfRVJST1I7CisjZW5kaWYKKyAgfQorI2lmZGVmIFdJVEhfWkxJQgorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkFjY2VwdC1FbmNvZGluZyIpKQorICB7CisjaWZkZWYgV0lUSF9HWklQCisgICAgaWYgKHN0cmNocih2YWwsICcqJykgfHwgc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwsICJnemlwIikpCisgICAgICBzb2FwLT56bGliX291dCA9IFNPQVBfWkxJQl9HWklQOworICAgIGVsc2UKKyNlbmRpZgorICAgIGlmIChzdHJjaHIodmFsLCAnKicpIHx8IHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAiZGVmbGF0ZSIpKQorICAgICAgc29hcC0+emxpYl9vdXQgPSBTT0FQX1pMSUJfREVGTEFURTsKKyAgICBlbHNlCisgICAgICBzb2FwLT56bGliX291dCA9IFNPQVBfWkxJQl9OT05FOworICB9CisjZW5kaWYKKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJUcmFuc2Zlci1FbmNvZGluZyIpKQorICB7IHNvYXAtPm1vZGUgJj0gflNPQVBfSU87CisgICAgaWYgKCFzb2FwX3RhZ19jbXAodmFsLCAiY2h1bmtlZCIpKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX0NIVU5LOworICB9CisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29ubmVjdGlvbiIpKQorICB7IGlmICghc29hcF90YWdfY21wKHZhbCwgImtlZXAtYWxpdmUiKSkKKyAgICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAtc29hcC0+a2VlcF9hbGl2ZTsKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHZhbCwgImNsb3NlIikpCisgICAgICBzb2FwLT5rZWVwX2FsaXZlID0gMDsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU4KKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJBdXRob3JpemF0aW9uIikpCisgIHsgaWYgKCFzb2FwX3RhZ19jbXAodmFsLCAiQmFzaWMgKiIpKQorICAgIHsgaW50IG47CisgICAgICBjaGFyICpzOworICAgICAgc29hcF9iYXNlNjQycyhzb2FwLCB2YWwgKyA2LCBzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpIC0gMSwgJm4pOworICAgICAgc29hcC0+dG1wYnVmW25dID0gJ1wwJzsKKyAgICAgIGlmICgocyA9IHN0cmNocihzb2FwLT50bXBidWYsICc6JykpKQorICAgICAgeyAqcyA9ICdcMCc7CisJc29hcC0+dXNlcmlkID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+dG1wYnVmKTsKKwlzb2FwLT5wYXNzd2QgPSBzb2FwX3N0cmR1cChzb2FwLCBzICsgMSk7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiV1dXLUF1dGhlbnRpY2F0ZSIpKQorICAgIHNvYXAtPmF1dGhyZWFsbSA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsICsgNiwgInJlYWxtIikpOworICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkV4cGVjdCIpKQorICB7IGlmICghc29hcF90YWdfY21wKHZhbCwgIjEwMC1jb250aW51ZSIpKQorICAgIHsgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJIVFRQLzEuMSAxMDAgQ29udGludWUiLCBOVUxMKSkKKyAgICAgICB8fCAoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCBOVUxMLCBOVUxMKSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgIH0KKyNlbmRpZgorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIlNPQVBBY3Rpb24iKSkKKyAgeyBpZiAoKnZhbCA9PSAnIicpCisgICAgeyBzb2FwLT5hY3Rpb24gPSBzb2FwX3N0cmR1cChzb2FwLCB2YWwgKyAxKTsKKyAgICAgIHNvYXAtPmFjdGlvbltzdHJsZW4oc29hcC0+YWN0aW9uKSAtIDFdID0gJ1wwJzsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJMb2NhdGlvbiIpKQorICB7IHN0cm5jcHkoc29hcC0+ZW5kcG9pbnQsIHZhbCwgc2l6ZW9mKHNvYXAtPmVuZHBvaW50KSk7CisgICAgc29hcC0+ZW5kcG9pbnRbc2l6ZW9mKHNvYXAtPmVuZHBvaW50KSAtIDFdID0gJ1wwJzsKKyAgfQorI2lmZGVmIFdJVEhfQ09PS0lFUworICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvb2tpZSIpIHx8ICFzb2FwX3RhZ19jbXAoa2V5LCAiU2V0LUNvb2tpZSIpKQorICAgIHNvYXBfZ2V0Y29va2llcyhzb2FwLCB2YWwpOworI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAhZGVmaW5lZChXSVRIX05PSFRUUCkgfHwgIWRlZmluZWQoV0lUSF9MRUFORVIpCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmxpbmUsIGNvbnN0IGNoYXIgKmtleSkKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqcyA9IGxpbmU7CisgIGlmIChzKQorICB7IHdoaWxlICgqcykKKyAgICB7IHJlZ2lzdGVyIHNob3J0IGZsYWc7CisgICAgICBzID0gc29hcF9kZWNvZGVfa2V5KHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksIHMpOworICAgICAgZmxhZyA9IHNvYXBfdGFnX2NtcChzb2FwLT50bXBidWYsIGtleSk7CisgICAgICBzID0gc29hcF9kZWNvZGVfdmFsKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksIHMpOworICAgICAgaWYgKCFmbGFnKQorICAgICAgICByZXR1cm4gc29hcC0+dG1wYnVmOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgIWRlZmluZWQoV0lUSF9OT0hUVFApIHx8ICFkZWZpbmVkKFdJVEhfTEVBTkVSKQorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2RlY29kZV9rZXkoY2hhciAqYnVmLCBzaXplX3QgbGVuLCBjb25zdCBjaGFyICp2YWwpCit7IHJldHVybiBzb2FwX2RlY29kZShidWYsIGxlbiwgdmFsLCAiPSw7Iik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmICFkZWZpbmVkKFdJVEhfTk9IVFRQKSB8fCAhZGVmaW5lZChXSVRIX0xFQU5FUikKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9kZWNvZGVfdmFsKGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwgY29uc3QgY2hhciAqdmFsKQoreyBpZiAoKnZhbCAhPSAnPScpCisgIHsgKmJ1ZiA9ICdcMCc7CisgICAgcmV0dXJuIHZhbDsKKyAgfQorICByZXR1cm4gc29hcF9kZWNvZGUoYnVmLCBsZW4sIHZhbCArIDEsICIsOyIpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAhZGVmaW5lZChXSVRIX05PSFRUUCkgfHwgIWRlZmluZWQoV0lUSF9MRUFORVIpCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNvbnN0IGNoYXIqCitzb2FwX2RlY29kZShjaGFyICpidWYsIHNpemVfdCBsZW4sIGNvbnN0IGNoYXIgKnZhbCwgY29uc3QgY2hhciAqc2VwKQoreyBjb25zdCBjaGFyICpzOworICBjaGFyICp0ID0gYnVmOworICBmb3IgKHMgPSB2YWw7ICpzOyBzKyspCisgICAgaWYgKCpzICE9ICcgJyAmJiAqcyAhPSAnXHQnICYmICFzdHJjaHIoc2VwLCAqcykpCisgICAgICBicmVhazsKKyAgaWYgKCpzID09ICciJykKKyAgeyBzKys7CisgICAgd2hpbGUgKCpzICYmICpzICE9ICciJyAmJiAtLWxlbikKKyAgICAgICp0KysgPSAqcysrOworICB9CisgIGVsc2UKKyAgeyB3aGlsZSAoc29hcF9ub3RibGFuaygqcykgJiYgIXN0cmNocihzZXAsICpzKSAmJiAtLWxlbikKKyAgICB7IGlmICgqcyA9PSAnJScpCisgICAgICB7ICp0KysgPSAoKHNbMV0gPj0gJ0EnID8gKHNbMV0gJiAweDcpICsgOSA6IHNbMV0gLSAnMCcpIDw8IDQpCisgICAgICAgICAgICAgICsgKHNbMl0gPj0gJ0EnID8gKHNbMl0gJiAweDcpICsgOSA6IHNbMl0gLSAnMCcpOworICAgICAgICBzICs9IDM7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgICp0KysgPSAqcysrOworICAgIH0KKyAgfQorICAqdCA9ICdcMCc7CisgIHdoaWxlICgqcyAmJiAhc3RyY2hyKHNlcCwgKnMpKQorICAgIHMrKzsKKyAgcmV0dXJuIHM7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbnZlbG9wZV9iZWdpbl9vdXQoc3RydWN0IHNvYXAgKnNvYXApCit7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNpemVfdCBuID0gMDsKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkgJiYgc29hcC0+bWltZS5ib3VuZGFyeSAmJiBzb2FwLT5taW1lLnN0YXJ0KQorICB7IGNvbnN0IGNoYXIgKnM7CisgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkgJiYgIShzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkpCisgICAgICBzID0gImFwcGxpY2F0aW9uL2RpbWUiOworICAgIGVsc2UgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgICAgIHMgPSAiYXBwbGljYXRpb24vc29hcCt4bWw7IGNoYXJzZXQ9dXRmLTgiOworICAgIGVsc2UKKyAgICAgIHMgPSAidGV4dC94bWw7IGNoYXJzZXQ9dXRmLTgiOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiLS0lc1xyXG5Db250ZW50LVR5cGU6ICVzXHJcbkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJpbmFyeVxyXG5Db250ZW50LUlEOiAlc1xyXG5cclxuIiwgc29hcC0+bWltZS5ib3VuZGFyeSwgcywgc29hcC0+bWltZS5zdGFydCk7CisgICAgbiA9IHN0cmxlbihzb2FwLT50bXBidWYpOworICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHNvYXAtPnRtcGJ1ZiwgbikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICBzb2FwLT5kaW1lLnNpemUgPSBzb2FwLT5jb3VudDsJLyogRElNRSBpbiBNSU1FIGNvcnJlY3Rpb24gKi8KKyAgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpKQorICB7IGlmIChzb2FwX3B1dGRpbWVoZHIoc29hcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyNlbmRpZgorICBzb2FwLT5wYXJ0ID0gU09BUF9JTl9FTlZFTE9QRTsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgIlNPQVAtRU5WOkVudmVsb3BlIiwgMCwgTlVMTCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW52ZWxvcGVfZW5kX291dChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsICJTT0FQLUVOVjpFbnZlbG9wZSIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpICYmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkgJiYgIShzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkpCisgIHsgc29hcC0+ZGltZS5zaXplID0gc29hcC0+Y291bnQgLSBzb2FwLT5kaW1lLnNpemU7CS8qIERJTUUgaW4gTUlNRSBjb3JyZWN0aW9uICovCisgICAgc3ByaW50Zihzb2FwLT5pZCwgc29hcC0+ZGltZV9pZF9mb3JtYXQsIDApOworICAgIHNvYXAtPmRpbWUuaWQgPSBzb2FwLT5pZDsKKyAgICBpZiAoc29hcC0+bG9jYWxfbmFtZXNwYWNlcykKKyAgICB7IGlmIChzb2FwLT5sb2NhbF9uYW1lc3BhY2VzWzBdLm91dCkKKyAgICAgICAgc29hcC0+ZGltZS50eXBlID0gKGNoYXIqKXNvYXAtPmxvY2FsX25hbWVzcGFjZXNbMF0ub3V0OworICAgICAgZWxzZQorICAgICAgICBzb2FwLT5kaW1lLnR5cGUgPSAoY2hhciopc29hcC0+bG9jYWxfbmFtZXNwYWNlc1swXS5uczsKKyAgICB9CisgICAgc29hcC0+ZGltZS5vcHRpb25zID0gTlVMTDsKKyAgICBzb2FwLT5kaW1lLmZsYWdzID0gU09BUF9ESU1FX01CIHwgU09BUF9ESU1FX0FCU1VSSTsKKyAgICBpZiAoIXNvYXAtPmRpbWUuZmlyc3QpCisgICAgICBzb2FwLT5kaW1lLmZsYWdzIHw9IFNPQVBfRElNRV9NRTsKKyAgICBzb2FwLT5jb3VudCArPSAxMiArICgoc3RybGVuKHNvYXAtPmRpbWUuaWQpKzMpJih+MykpICsgKChzdHJsZW4oc29hcC0+ZGltZS50eXBlKSszKSYofjMpKTsKKyAgfQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKSkKKyAgICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCBTT0FQX1NUUl9QQURESU5HLCAtKGxvbmcpc29hcC0+ZGltZS5zaXplJjMpOworI2VuZGlmCisgIHNvYXAtPnBhcnQgPSBTT0FQX0VORF9FTlZFTE9QRTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9IAorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VudmVsb3BlX2JlZ2luX2luKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzdHJ1Y3QgTmFtZXNwYWNlICpwOworICBzb2FwLT5wYXJ0ID0gU09BUF9JTl9FTlZFTE9QRTsKKyAgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCAiU09BUC1FTlY6RW52ZWxvcGUiLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1ZFUlNJT05NSVNNQVRDSDsKKyAgcCA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXM7CisgIGlmIChwKQorICB7IGNvbnN0IGNoYXIgKm5zID0gcFswXS5vdXQ7CisgICAgaWYgKCFucykKKyAgICAgIG5zID0gcFswXS5uczsKKyAgICBpZiAoIXN0cmNtcChucywgc29hcF9lbnYxKSkKKyAgICB7IHNvYXAtPnZlcnNpb24gPSAxOyAvKiBtYWtlIHN1cmUgd2UgdXNlIFNPQVAgMS4xICovCisgICAgICBpZiAocFsxXS5vdXQpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwWzFdLm91dCk7CisgICAgICBpZiAoKHBbMV0ub3V0ID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzb2FwX2VuYzEpKSkpCisgICAgICAgIHN0cmNweShwWzFdLm91dCwgc29hcF9lbmMxKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChucywgc29hcF9lbnYyKSkKKyAgICB7IHNvYXAtPnZlcnNpb24gPSAyOyAvKiBtYWtlIHN1cmUgd2UgdXNlIFNPQVAgMS4yICovCisgICAgICBpZiAocFsxXS5vdXQpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwWzFdLm91dCk7CisgICAgICBpZiAoKHBbMV0ub3V0ID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzb2FwX2VuYzIpKSkpCisgICAgICAgIHN0cmNweShwWzFdLm91dCwgc29hcF9lbmMyKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW52ZWxvcGVfZW5kX2luKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5wYXJ0ID0gU09BUF9FTkRfRU5WRUxPUEU7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsICJTT0FQLUVOVjpFbnZlbG9wZSIpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JvZHlfYmVnaW5fb3V0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5wYXJ0ID0gU09BUF9JTl9CT0RZOworICBpZiAoc29hcC0+dmVyc2lvbiA9PSAxKQorICAgIHNvYXAtPmVuY29kaW5nID0gMTsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NFQykgJiYgc29hcF9zZXRfYXR0cihzb2FwLCAid3N1OklkIiwgIkJvZHkiKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjZW5kaWYKKyAgaWYgKHNvYXBfZWxlbWVudChzb2FwLCAiU09BUC1FTlY6Qm9keSIsIDAsIE5VTEwpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHNvYXAsIE5VTEwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JvZHlfZW5kX291dChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsICJTT0FQLUVOVjpCb2R5IikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBzb2FwLT5wYXJ0ID0gU09BUF9FTkRfQk9EWTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYm9keV9iZWdpbl9pbihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+cGFydCA9IFNPQVBfSU5fQk9EWTsKKyAgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCAiU09BUC1FTlY6Qm9keSIsIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKCFzb2FwLT5ib2R5KQorICAgIHNvYXAtPnBhcnQgPSBTT0FQX05PX0JPRFk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JvZHlfZW5kX2luKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcC0+cGFydCA9PSBTT0FQX05PX0JPRFkpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0VORF9CT0RZOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCAiU09BUC1FTlY6Qm9keSIpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlY3ZfaGVhZGVyKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcF9nZXRoZWFkZXIoc29hcCkgJiYgc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9lbmRwb2ludChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZW5kcG9pbnQpCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnM7CisgIHJlZ2lzdGVyIHNpemVfdCBpLCBuOworICBzb2FwLT5lbmRwb2ludFswXSA9ICdcMCc7CisgIHNvYXAtPmhvc3RbMF0gPSAnXDAnOworICBzb2FwLT5wYXRoWzBdID0gJy8nOworICBzb2FwLT5wYXRoWzFdID0gJ1wwJzsKKyAgc29hcC0+cG9ydCA9IDgwOworICBpZiAoIWVuZHBvaW50IHx8ICEqZW5kcG9pbnQpCisgICAgcmV0dXJuOworICBpZiAoIXN0cm5jbXAoZW5kcG9pbnQsICJodHRwczoiLCA2KSkKKyAgICBzb2FwLT5wb3J0ID0gNDQzOworICBzdHJuY3B5KHNvYXAtPmVuZHBvaW50LCBlbmRwb2ludCwgc2l6ZW9mKHNvYXAtPmVuZHBvaW50KSAtIDEpOworICBzID0gc3RyY2hyKGVuZHBvaW50LCAnOicpOworICBpZiAocyAmJiBzWzFdID09ICcvJyAmJiBzWzJdID09ICcvJykKKyAgICBzICs9IDM7CisgIGVsc2UKKyAgICBzID0gZW5kcG9pbnQ7CisgIG4gPSBzdHJsZW4ocyk7CisgIGlmIChuID49IHNpemVvZihzb2FwLT5ob3N0KSkKKyAgICBuID0gc2l6ZW9mKHNvYXAtPmhvc3QpIC0gMTsKKyNpZmRlZiBXSVRIX0lQVjYKKyAgaWYgKHNbMF0gPT0gJ1snKQorICB7IHMrKzsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIHsgc29hcC0+aG9zdFtpXSA9IHNbaV07CisgICAgICBpZiAoc1tpXSA9PSAnXScpCisgICAgICB7IHMrKzsKKyAgICAgICAgYnJlYWs7IAorICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICB7IHNvYXAtPmhvc3RbaV0gPSBzW2ldOworICAgICAgaWYgKHNbaV0gPT0gJy8nIHx8IHNbaV0gPT0gJzonKQorICAgICAgICBicmVhazsgCisgICAgfQorICB9CisjZWxzZQorICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICB7IHNvYXAtPmhvc3RbaV0gPSBzW2ldOworICAgIGlmIChzW2ldID09ICcvJyB8fCBzW2ldID09ICc6JykKKyAgICAgIGJyZWFrOyAKKyAgfQorI2VuZGlmCisgIHNvYXAtPmhvc3RbaV0gPSAnXDAnOworICBpZiAoc1tpXSA9PSAnOicpCisgIHsgc29hcC0+cG9ydCA9IChpbnQpYXRvbChzICsgaSArIDEpOworICAgIGZvciAoaSsrOyBpIDwgbjsgaSsrKQorICAgICAgaWYgKHNbaV0gPT0gJy8nKQorICAgICAgICBicmVhazsKKyAgfQorICBpZiAoc1tpXSkKKyAgeyBzdHJuY3B5KHNvYXAtPnBhdGgsIHMgKyBpLCBzaXplb2Yoc29hcC0+cGF0aCkpOworICAgIHNvYXAtPnBhdGhbc2l6ZW9mKHNvYXAtPnBhdGgpIC0gMV0gPSAnXDAnOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfY29ubmVjdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZW5kcG9pbnQsIGNvbnN0IGNoYXIgKmFjdGlvbikKK3sgcmV0dXJuIHNvYXBfY29ubmVjdF9jb21tYW5kKHNvYXAsIFNPQVBfUE9TVCwgZW5kcG9pbnQsIGFjdGlvbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfY29ubmVjdF9jb21tYW5kKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgaHR0cF9jb21tYW5kLCBjb25zdCBjaGFyICplbmRwb2ludCwgY29uc3QgY2hhciAqYWN0aW9uKQoreyBjaGFyIGhvc3Rbc2l6ZW9mKHNvYXAtPmhvc3QpXTsKKyAgaW50IHBvcnQ7CisgIHNpemVfdCBjb3VudDsKKyAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICBzdHJjcHkoaG9zdCwgc29hcC0+aG9zdCk7IC8qIHNhdmUgdG8gY29tcGFyZSAqLworICBwb3J0ID0gc29hcC0+cG9ydDsgLyogc2F2ZSB0byBjb21wYXJlICovCisgIHNvYXBfc2V0X2VuZHBvaW50KHNvYXAsIGVuZHBvaW50KTsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPmZjb25uZWN0KQorICB7IGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mY29ubmVjdChzb2FwLCBlbmRwb2ludCwgc29hcC0+aG9zdCwgc29hcC0+cG9ydCkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGVsc2UKKyNlbmRpZgorICBpZiAoc29hcC0+Zm9wZW4gJiYgKnNvYXAtPmhvc3QpCisgIHsgc29hcC0+c3RhdHVzID0gaHR0cF9jb21tYW5kOworICAgIGlmICghc29hcC0+a2VlcF9hbGl2ZSB8fCAhc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSB8fCBzdHJjbXAoc29hcC0+aG9zdCwgaG9zdCkgfHwgc29hcC0+cG9ydCAhPSBwb3J0IHx8ICFzb2FwLT5mcG9sbCB8fCBzb2FwLT5mcG9sbChzb2FwKSkKKyAgICB7IHNvYXAtPmtlZXBfYWxpdmUgPSAwOyAvKiB0byBmb3JjZSBjbG9zZSAqLworICAgICAgc29hcC0+b21vZGUgJj0gflNPQVBfSU9fVURQOyAvKiB0byBmb3JjZSBjbG9zZSAqLworICAgICAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29ubmVjdC9yZWNvbm5lY3QgdG8gaG9zdD0nJXMnIHBhdGg9JyVzJyBwb3J0PSVkXG4iLCBzb2FwLT5ob3N0LCBzb2FwLT5wYXRoLCBzb2FwLT5wb3J0KSk7CisjaWZkZWYgV0lUSF9VRFAKKyAgICAgIGlmICghc3RybmNtcChlbmRwb2ludCwgInNvYXAudWRwOiIsIDkpKQorICAgICAgICBzb2FwLT5vbW9kZSB8PSBTT0FQX0lPX1VEUDsKKyNlbmRpZgorICAgICAgc29hcC0+c29ja2V0ID0gc29hcC0+Zm9wZW4oc29hcCwgZW5kcG9pbnQsIHNvYXAtPmhvc3QsIHNvYXAtPnBvcnQpOworICAgICAgaWYgKHNvYXAtPmVycm9yKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBzb2FwLT5rZWVwX2FsaXZlID0gKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fS0VFUEFMSVZFKSAhPSAwKTsKKyAgICB9CisgIH0KKyAgY291bnQgPSBzb2FwX2NvdW50X2F0dGFjaG1lbnRzKHNvYXApOworICBpZiAoc29hcF9iZWdpbl9zZW5kKHNvYXApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgIT0gU09BUF9JT19TVE9SRSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpICYmIGVuZHBvaW50KQorICB7IHVuc2lnbmVkIGludCBrID0gc29hcC0+bW9kZTsKKyAgICBzb2FwLT5tb2RlICY9IH4oU09BUF9JTyB8IFNPQVBfRU5DX1pMSUIpOworICAgIGlmICgoayAmIFNPQVBfSU8pICE9IFNPQVBfSU9fRkxVU0gpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fQlVGRkVSOworICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdChzb2FwLCBlbmRwb2ludCwgc29hcC0+aG9zdCwgc29hcC0+cG9ydCwgc29hcC0+cGF0aCwgYWN0aW9uLCBjb3VudCkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICAgIGlmICgoayAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgICAgeyBpZiAoc29hcF9mbHVzaChzb2FwKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyNlbmRpZgorICAgIHNvYXAtPm1vZGUgPSBrOworICB9CisgIGVsc2UgaWYgKGFjdGlvbikKKyAgICBzb2FwLT5hY3Rpb24gPSBzb2FwX3N0cmR1cChzb2FwLCBhY3Rpb24pOworICBpZiAoaHR0cF9jb21tYW5kICE9IFNPQVBfUE9TVCkKKyAgICByZXR1cm4gc29hcF9lbmRfc2VuZChzb2FwKTsKKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2NoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3MyYmFzZTY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzLCBjaGFyICp0LCBpbnQgbikKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbTsKKyAgcmVnaXN0ZXIgY2hhciAqcDsKKyAgaWYgKCF0KQorICAgIHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgKG4gKyAyKSAvIDMgKiA0ICsgMSk7CisgIGlmICghdCkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHJldHVybiBOVUxMOworICB9CisgIHAgPSB0OworICB0WzBdID0gJ1wwJzsKKyAgaWYgKCFzKQorICAgIHJldHVybiBwOworICBmb3IgKDsgbiA+IDI7IG4gLT0gMywgcyArPSAzKQorICB7IG0gPSBzWzBdOworICAgIG0gPSAobSA8PCA4KSB8IHNbMV07CisgICAgbSA9IChtIDw8IDgpIHwgc1syXTsKKyAgICBmb3IgKGkgPSA0OyBpID4gMDsgbSA+Pj0gNikKKyAgICAgIHRbLS1pXSA9IHNvYXBfYmFzZTY0b1ttICYgMHgzRl07CisgICAgdCArPSA0OworICB9CisgIHRbMF0gPSAnXDAnOworICBpZiAobiA+IDApCisgIHsgbSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgIG0gPSAobSA8PCA4KSB8ICpzKys7CisgICAgZm9yICg7IGkgPCAzOyBpKyspCisgICAgICBtIDw8PSA4OworICAgIGZvciAoaSsrOyBpID4gMDsgbSA+Pj0gNikKKyAgICAgIHRbLS1pXSA9IHNvYXBfYmFzZTY0b1ttICYgMHgzRl07CisgICAgZm9yIChpID0gMzsgaSA+IG47IGktLSkKKyAgICAgIHRbaV0gPSAnPSc7CisgICAgdFs0XSA9ICdcMCc7CisgIH0KKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9iYXNlNjQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgY2hhciAqdCwgc2l6ZV90IGwsIGludCAqbikKK3sgcmVnaXN0ZXIgaW50IGksIGosIGM7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbTsKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqcDsKKyAgaWYgKCFzIHx8ICEqcykKKyAgeyBpZiAobikKKyAgICAgICpuID0gMDsKKyAgICBpZiAoc29hcC0+ZXJyb3IpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gU09BUF9OT05fTlVMTDsKKyAgfQorICBpZiAoIXQpCisgIHsgbCA9IChzdHJsZW4ocykgKyAzKSAvIDQgKiAzOworICAgIHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgbCk7CisgIH0KKyAgaWYgKCF0KQorICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcCA9IHQ7CisgIGlmIChuKQorICAgICpuID0gMDsKKyAgZm9yICg7OykKKyAgeyBmb3IgKGkgPSAwOyBpIDwgU09BUF9CTEtMRU47IGkrKykKKyAgICB7IG0gPSAwOworICAgICAgaiA9IDA7CisgICAgICB3aGlsZSAoaiA8IDQpCisgICAgICB7IGMgPSAqcysrOworICAgICAgICBpZiAoYyA9PSAnPScgfHwgIWMpCisgICAgICAgIHsgaSAqPSAzOworICAgICAgICAgIHN3aXRjaCAoaikKKyAgICAgICAgICB7IGNhc2UgMjoKKyAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgobSA+PiA0KSAmIDB4RkYpOworICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKChtID4+IDEwKSAmIDB4RkYpOworICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKChtID4+IDIpICYgMHhGRik7CisgICAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG4pCisJICAgICpuICs9IGk7CisgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgIH0KKyAgICAgICAgYyAtPSAnKyc7CisgICAgICAgIGlmIChjID49IDAgJiYgYyA8PSA3OSkKKyAgICAgICAgeyBtID0gKG0gPDwgNikgKyBzb2FwX2Jhc2U2NGlbY107CisgICAgICAgICAgaisrOworICAgICAgICB9CisgICAgICB9CisgICAgICAqdCsrID0gKGNoYXIpKChtID4+IDE2KSAmIDB4RkYpOworICAgICAgKnQrKyA9IChjaGFyKSgobSA+PiA4KSAmIDB4RkYpOworICAgICAgKnQrKyA9IChjaGFyKShtICYgMHhGRik7CisgICAgICBpZiAobCA8IDMpCisgICAgICB7IGlmIChuKQorCSAgKm4gKz0gaTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgICB9CisgICAgICBsIC09IDM7CisgICAgfQorICAgIGlmIChuKQorICAgICAgKm4gKz0gMyAqIFNPQVBfQkxLTEVOOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjaGFyKgorU09BUF9GTUFDMgorc29hcF9zMmhleChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgdW5zaWduZWQgY2hhciAqcywgY2hhciAqdCwgaW50IG4pCit7IHJlZ2lzdGVyIGNoYXIgKnA7CisgIGlmICghdCkKKyAgICB0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIDIgKiBuICsgMSk7CisgIGlmICghdCkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHJldHVybiBOVUxMOworICB9CisgIHAgPSB0OworICB0WzBdID0gJ1wwJzsKKyAgaWYgKHMpCisgIHsgZm9yICg7IG4gPiAwOyBuLS0pCisgICAgeyByZWdpc3RlciBpbnQgbSA9ICpzKys7CisgICAgICAqdCsrID0gKGNoYXIpKChtID4+IDQpICsgKG0gPiAxNTkgPyAnYScgLSAxMCA6ICcwJykpOworICAgICAgbSAmPSAweDBGOworICAgICAgKnQrKyA9IChjaGFyKShtICsgKG0gPiA5ID8gJ2EnIC0gMTAgOiAnMCcpKTsKKyAgICB9CisgIH0KKyAgKnQrKyA9ICdcMCc7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfaGV4MnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGNoYXIgKnQsIHNpemVfdCBsLCBpbnQgKm4pCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnA7CisgIGlmICghcyB8fCAhKnMpCisgIHsgaWYgKG4pCisgICAgICAqbiA9IDA7CisgICAgaWYgKHNvYXAtPmVycm9yKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFNPQVBfTk9OX05VTEw7CisgIH0KKyAgaWYgKCF0KQorICB7IGwgPSBzdHJsZW4ocykgLyAyOworICAgIHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgbCk7CisgIH0KKyAgaWYgKCF0KQorICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcCA9IHQ7CisgIHdoaWxlIChsKQorICB7IHJlZ2lzdGVyIGludCBkMSwgZDI7CisgICAgZDEgPSAqcysrOworICAgIGlmICghZDEpCisgICAgICBicmVhazsKKyAgICBkMiA9ICpzKys7CisgICAgaWYgKCFkMikKKyAgICAgIGJyZWFrOworICAgICp0KysgPSAoKGQxID49ICdBJyA/IChkMSAmIDB4NykgKyA5IDogZDEgLSAnMCcpIDw8IDQpICsgKGQyID49ICdBJyA/IChkMiAmIDB4NykgKyA5IDogZDIgLSAnMCcpOworICAgIGwtLTsKKyAgfQorICBpZiAobikKKyAgICAqbiA9IHQgLSBwOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRodHRwaGRyKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3RhdHVzLCBzaXplX3QgY291bnQpCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnMgPSBOVUxMOworICByZWdpc3RlciBpbnQgZXJyID0gU09BUF9PSzsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqciA9IE5VTEw7CisjZW5kaWYKKyAgaWYgKHN0YXR1cyA9PSBTT0FQX0ZJTEUgJiYgc29hcC0+aHR0cF9jb250ZW50KQorICAgIHMgPSBzb2FwLT5odHRwX2NvbnRlbnQ7CisgIGVsc2UgaWYgKHN0YXR1cyA9PSBTT0FQX0hUTUwpCisgICAgcyA9ICJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiOworICBlbHNlIGlmIChjb3VudCB8fCAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKSkKKyAgeyBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICAgICAgcyA9ICJhcHBsaWNhdGlvbi9zb2FwK3htbDsgY2hhcnNldD11dGYtOCI7CisgICAgZWxzZQorICAgICAgcyA9ICJ0ZXh0L3htbDsgY2hhcnNldD11dGYtOCI7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPm1vZGUgJiAoU09BUF9FTkNfRElNRSB8IFNPQVBfRU5DX01UT00pKQorICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkKKyAgICB7IHIgPSBzOworICAgICAgcyA9ICJhcHBsaWNhdGlvbi94b3AreG1sOyBjaGFyc2V0PXV0Zi04IjsKKyAgICB9CisgICAgZWxzZQorICAgICAgcyA9ICJhcHBsaWNhdGlvbi9kaW1lIjsKKyAgfQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKSAmJiBzb2FwLT5taW1lLmJvdW5kYXJ5ICYmIHNvYXAtPnN0YXR1cyAhPSBTT0FQX0dFVCkKKyAgeyByZWdpc3RlciBjb25zdCBjaGFyICp0ID0gc3RyY2hyKHMsICc7Jyk7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICJtdWx0aXBhcnQvcmVsYXRlZDsgYm91bmRhcnk9XCIlc1wiOyB0eXBlPVwiIiwgc29hcC0+bWltZS5ib3VuZGFyeSk7CisgICAgaWYgKHQpCisgICAgICBzdHJuY2F0KHNvYXAtPnRtcGJ1ZiwgcywgdCAtIHMpOworICAgIGVsc2UKKyAgICAgIHN0cmNhdChzb2FwLT50bXBidWYsIHMpOworICAgIGlmIChzb2FwLT5taW1lLnN0YXJ0KQorICAgIHsgc3RyY2F0KHNvYXAtPnRtcGJ1ZiwgIlwiOyBzdGFydD1cIiIpOworICAgICAgc3RyY2F0KHNvYXAtPnRtcGJ1Ziwgc29hcC0+bWltZS5zdGFydCk7CisgICAgfQorICAgIHN0cmNhdChzb2FwLT50bXBidWYsICJcIiIpOworICAgIGlmIChyKQorICAgIHsgc3RyY2F0KHNvYXAtPnRtcGJ1ZiwgIjsgc3RhcnQtaW5mbz1cIiIpOworICAgICAgc3RyY2F0KHNvYXAtPnRtcGJ1Ziwgcik7CisgICAgICBzdHJjYXQoc29hcC0+dG1wYnVmLCAiXCIiKTsKKyAgICB9CisgICAgcyA9IHNvYXAtPnRtcGJ1ZjsKKyAgfQorI2VuZGlmCisgIGlmIChzICYmIChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQ29udGVudC1UeXBlIiwgcykpKQorICAgIHJldHVybiBlcnI7CisjaWZkZWYgV0lUSF9aTElCCisgIGlmIChzb2FwLT5vbW9kZSAmIFNPQVBfRU5DX1pMSUIpCisgIHsKKyNpZmRlZiBXSVRIX0daSVAKKyAgICBlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQ29udGVudC1FbmNvZGluZyIsICJnemlwIik7CisjZWxzZQorICAgIGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJDb250ZW50LUVuY29kaW5nIiwgImRlZmxhdGUiKTsKKyNlbmRpZgorICAgIGlmIChlcnIpCisgICAgICByZXR1cm4gZXJyOworICB9CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgICAgZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlRyYW5zZmVyLUVuY29kaW5nIiwgImNodW5rZWQiKTsKKyAgZWxzZQorI2VuZGlmCisgIGlmIChzb2FwLT5zdGF0dXMgIT0gU09BUF9HRVQpCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICIlbHUiLCAodW5zaWduZWQgbG9uZyljb3VudCk7CisgICAgZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkNvbnRlbnQtTGVuZ3RoIiwgc29hcC0+dG1wYnVmKTsKKyAgfQorICBpZiAoZXJyKQorICAgIHJldHVybiBlcnI7CisgIHJldHVybiBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQ29ubmVjdGlvbiIsIHNvYXAtPmtlZXBfYWxpdmUgPyAia2VlcC1hbGl2ZSIgOiAiY2xvc2UiKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAoraHR0cF9nZXQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJldHVybiBTT0FQX0dFVF9NRVRIT0Q7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK2h0dHBfcG9zdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZW5kcG9pbnQsIGNvbnN0IGNoYXIgKmhvc3QsIGludCBwb3J0LCBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICphY3Rpb24sIHNpemVfdCBjb3VudCkKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKKyAgcmVnaXN0ZXIgaW50IGVycjsKKyAgaWYgKHNvYXAtPnN0YXR1cyA9PSBTT0FQX0dFVCkKKyAgICBzID0gIkdFVCI7CisgIGVsc2UKKyAgICBzID0gIlBPU1QiOworI2lmZGVmIFBBTE0KKyAgaWYgKCFlbmRwb2ludCB8fCAoc3RybmNtcChlbmRwb2ludCwgImh0dHA6IiwgNSkgJiYgc3RybmNtcChlbmRwb2ludCwgImh0dHBzOiIsIDYpICYmIHN0cm5jbXAoZW5kcG9pbnQsICJodHRwZzoiLCA2KSkgJiYgc3RybmNtcChlbmRwb2ludCwgIl9iZWFtOiIsIDYpICYmIHN0cm5jbXAoZW5kcG9pbnQsICJfbG9jYWw6IiwgNykgJiYgc3RybmNtcChlbmRwb2ludCwgIl9idG9iZXg6IiwgOCkpCisjZWxzZQorICBpZiAoIWVuZHBvaW50IHx8IChzdHJuY21wKGVuZHBvaW50LCAiaHR0cDoiLCA1KSAmJiBzdHJuY21wKGVuZHBvaW50LCAiaHR0cHM6IiwgNikgJiYgc3RybmNtcChlbmRwb2ludCwgImh0dHBnOiIsIDYpKSkKKyNlbmRpZgorICAgIHJldHVybiBTT0FQX09LOworICBpZiAoc29hcC0+cHJveHlfaG9zdCAmJiBzdHJuY21wKGVuZHBvaW50LCAiaHR0cHM6IiwgNikpCisgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICIlcyAlcyBIVFRQLyVzIiwgcywgZW5kcG9pbnQsIHNvYXAtPmh0dHBfdmVyc2lvbik7CisgIGVsc2UKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIiVzIC8lcyBIVFRQLyVzIiwgcywgKCpwYXRoID09ICcvJyA/IHBhdGggKyAxIDogcGF0aCksIHNvYXAtPmh0dHBfdmVyc2lvbik7CisgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgc29hcC0+dG1wYnVmLCBOVUxMKSkpCisgICAgcmV0dXJuIGVycjsKKyAgaWYgKHBvcnQgIT0gODApCisgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICIlczolZCIsIGhvc3QsIHBvcnQpOworICBlbHNlCisgICAgc3RyY3B5KHNvYXAtPnRtcGJ1ZiwgaG9zdCk7IAorICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJIb3N0Iiwgc29hcC0+dG1wYnVmKSkKKyAgIHx8IChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiVXNlci1BZ2VudCIsICJnU09BUC8yLjciKSkKKyAgIHx8IChlcnIgPSBzb2FwX3B1dGh0dHBoZHIoc29hcCwgU09BUF9PSywgY291bnQpKSkKKyAgICByZXR1cm4gZXJyOworI2lmZGVmIFdJVEhfWkxJQgorI2lmZGVmIFdJVEhfR1pJUAorICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJBY2NlcHQtRW5jb2RpbmciLCAiZ3ppcCwgZGVmbGF0ZSIpKSkKKyNlbHNlCisgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkFjY2VwdC1FbmNvZGluZyIsICJkZWZsYXRlIikpKQorI2VuZGlmCisgICAgcmV0dXJuIGVycjsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPnVzZXJpZCAmJiBzb2FwLT5wYXNzd2QgJiYgc3RybGVuKHNvYXAtPnVzZXJpZCkgKyBzdHJsZW4oc29hcC0+cGFzc3dkKSA8IDc2MSkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIDI2MiwgIiVzOiVzIiwgc29hcC0+dXNlcmlkLCBzb2FwLT5wYXNzd2QpOworICAgIHN0cmNweShzb2FwLT50bXBidWYsICJCYXNpYyAiKTsKKyAgICBzb2FwX3MyYmFzZTY0KHNvYXAsIChjb25zdCB1bnNpZ25lZCBjaGFyKikoc29hcC0+dG1wYnVmICsgMjYyKSwgc29hcC0+dG1wYnVmICsgNiwgc3RybGVuKHNvYXAtPnRtcGJ1ZiArIDI2MikpOworICAgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkF1dGhvcml6YXRpb24iLCBzb2FwLT50bXBidWYpKSkKKyAgICAgIHJldHVybiBlcnI7CisgIH0KKyAgaWYgKHNvYXAtPnByb3h5X3VzZXJpZCAmJiBzb2FwLT5wcm94eV9wYXNzd2QgJiYgc3RybGVuKHNvYXAtPnByb3h5X3VzZXJpZCkgKyBzdHJsZW4oc29hcC0+cHJveHlfcGFzc3dkKSA8IDc2MSkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIDI2MiwgIiVzOiVzIiwgc29hcC0+cHJveHlfdXNlcmlkLCBzb2FwLT5wcm94eV9wYXNzd2QpOworICAgIHN0cmNweShzb2FwLT50bXBidWYsICJCYXNpYyAiKTsKKyAgICBzb2FwX3MyYmFzZTY0KHNvYXAsIChjb25zdCB1bnNpZ25lZCBjaGFyKikoc29hcC0+dG1wYnVmICsgMjYyKSwgc29hcC0+dG1wYnVmICsgNiwgc3RybGVuKHNvYXAtPnRtcGJ1ZiArIDI2MikpOworICAgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlByb3h5LUF1dGhvcml6YXRpb24iLCBzb2FwLT50bXBidWYpKSkKKyAgICAgIHJldHVybiBlcnI7CisgIH0KKyNlbmRpZgorI2lmZGVmIFdJVEhfQ09PS0lFUworI2lmZGVmIFdJVEhfT1BFTlNTTAorICBpZiAoc29hcF9wdXRjb29raWVzKHNvYXAsIGhvc3QsIHBhdGgsIHNvYXAtPnNzbCAhPSBOVUxMKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjZWxzZQorICBpZiAoc29hcF9wdXRjb29raWVzKHNvYXAsIGhvc3QsIHBhdGgsIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNlbmRpZgorI2VuZGlmCisgIGlmIChhY3Rpb24gJiYgc29hcC0+dmVyc2lvbiA9PSAxKQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiXCIlc1wiIiwgYWN0aW9uKTsKKyAgICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJTT0FQQWN0aW9uIiwgc29hcC0+dG1wYnVmKSkpCisgICAgICByZXR1cm4gZXJyOworICB9CisgIHJldHVybiBzb2FwLT5mcG9zdGhkcihzb2FwLCBOVUxMLCBOVUxMKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAoraHR0cF9zZW5kX2hlYWRlcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcykKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqdDsKKyAgZG8KKyAgeyB0ID0gc3RyY2hyKHMsICdcbicpOyAvKiBkaXNhbGxvdyBcbiBpbiBIVFRQIGhlYWRlcnMgKi8KKyAgICBpZiAoIXQpCisgICAgICB0ID0gcyArIHN0cmxlbihzKTsKKyAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcykpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgcyA9IHQgKyAxOworICB9IHdoaWxlICgqdCk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50CitodHRwX3Bvc3RfaGVhZGVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbCkKK3sgaWYgKGtleSkKKyAgeyBpZiAoaHR0cF9zZW5kX2hlYWRlcihzb2FwLCBrZXkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmICh2YWwgJiYgKHNvYXBfc2VuZF9yYXcoc29hcCwgIjogIiwgMikgfHwgaHR0cF9zZW5kX2hlYWRlcihzb2FwLCB2YWwpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCAiXHJcbiIsIDIpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50CitodHRwX3Jlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3RhdHVzLCBzaXplX3QgY291bnQpCit7IHJlZ2lzdGVyIGludCBlcnI7CisjaWZkZWYgV01XX1JQTV9JTworICBpZiAoc29hcC0+cnBtcmVxaWQpCisgICAgaHR0cE91dHB1dEVuYWJsZShzb2FwLT5ycG1yZXFpZCk7CisjZW5kaWYKKyAgaWYgKCFzdGF0dXMgfHwgc3RhdHVzID09IFNPQVBfSFRNTCB8fCBzdGF0dXMgPT0gU09BUF9GSUxFKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiT0sgMjAwXG4iKSk7CisjaWZkZWYgV01XX1JQTV9JTworICAgIGlmIChzb2FwLT5ycG1yZXFpZCB8fCBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpIHx8IHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpIC8qIFJQTSBiZWhhdmVzIGFzIGlmIHN0YW5kYWxvbmUgKi8KKyNlbHNlCisgICAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikgfHwgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkgLyogc3RhbmRhbG9uZSBhcHBsaWNhdGlvbiAqLworI2VuZGlmCisgICAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIkhUVFAvJXMgMjAwIE9LIiwgc29hcC0+aHR0cF92ZXJzaW9uKTsKKyAgICAgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgc29hcC0+dG1wYnVmLCBOVUxMKSkpCisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGVsc2UgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiU3RhdHVzIiwgIjIwMCBPSyIpKSkKKyAgICAgIHJldHVybiBlcnI7CisgIH0KKyAgZWxzZSBpZiAoc3RhdHVzID4gMjAwICYmIHN0YXR1cyA8IDYwMCkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIkhUVFAvJXMgJWQgJXMiLCBzb2FwLT5odHRwX3ZlcnNpb24sIHN0YXR1cywgaHR0cF9lcnJvcihzb2FwLCBzdGF0dXMpKTsKKyAgICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgTlVMTCkpKQorICAgICAgcmV0dXJuIGVycjsKKyNpZm5kZWYgV0lUSF9MRUFOIAorICAgIGlmIChzdGF0dXMgPT0gNDAxKQorICAgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJCYXNpYyByZWFsbT1cIiVzXCIiLCBzb2FwLT5hdXRocmVhbG0gPyBzb2FwLT5hdXRocmVhbG0gOiAiZ1NPQVAgV2ViIFNlcnZpY2UiKTsKKyAgICAgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIldXVy1BdXRoZW50aWNhdGUiLCBzb2FwLT50bXBidWYpKSkKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgZWxzZSBpZiAoKHN0YXR1cyA+PSAzMDEgJiYgc3RhdHVzIDw9IDMwMykgfHwgc3RhdHVzID09IDMwNykKKyAgICB7IGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkxvY2F0aW9uIiwgc29hcC0+ZW5kcG9pbnQpKSkKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisjZW5kaWYKKyAgfQorICBlbHNlCisgIHsgY29uc3QgY2hhciAqcyA9ICpzb2FwX2ZhdWx0Y29kZShzb2FwKTsKKyAgICBpZiAoc29hcC0+dmVyc2lvbiA9PSAyICYmICFzdHJjbXAocywgIlNPQVAtRU5WOlNlbmRlciIpKQorICAgICAgcyA9ICI0MDAgQmFkIFJlcXVlc3QiOworICAgIGVsc2UKKyAgICAgIHMgPSAiNTAwIEludGVybmFsIFNlcnZlciBFcnJvciI7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFcnJvciAlcyAoc3RhdHVzPSVkKVxuIiwgcywgc3RhdHVzKSk7CisjaWZkZWYgV01XX1JQTV9JTworICAgIGlmIChzb2FwLT5ycG1yZXFpZCB8fCBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpIHx8IHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpIC8qIFJQTSBiZWhhdmVzIGFzIGlmIHN0YW5kYWxvbmUgKi8KKyNlbHNlCisgICAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikgfHwgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkgLyogc3RhbmRhbG9uZSBhcHBsaWNhdGlvbiAqLworI2VuZGlmCisgICAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIkhUVFAvJXMgJXMiLCBzb2FwLT5odHRwX3ZlcnNpb24sIHMpOworICAgICAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCBzb2FwLT50bXBidWYsIE5VTEwpKSkKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgZWxzZSBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJTdGF0dXMiLCBzKSkpCisgICAgICByZXR1cm4gZXJyOworICB9CisgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlNlcnZlciIsICJnU09BUC8yLjciKSkKKyAgIHx8IChlcnIgPSBzb2FwX3B1dGh0dHBoZHIoc29hcCwgc3RhdHVzLCBjb3VudCkpKQorICAgIHJldHVybiBlcnI7CisjaWZkZWYgV0lUSF9DT09LSUVTCisgIGlmIChzb2FwX3B1dHNldGNvb2tpZXMoc29hcCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2VuZGlmCisgIHJldHVybiBzb2FwLT5mcG9zdGhkcihzb2FwLCBOVUxMLCBOVUxMKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3Jlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3RhdHVzKQoreyByZWdpc3RlciBzaXplX3QgY291bnQ7CisgIGlmICghKHNvYXAtPm9tb2RlICYgKFNPQVBfRU5DX1hNTCB8IFNPQVBfSU9fU1RPUkUgLyogdGhpcyB0ZXN0cyBmb3IgY2h1bmtpbmcgdG9vICovKSkKKyAgICYmIChzdGF0dXMgPT0gU09BUF9IVE1MIHx8IHN0YXR1cyA9PSBTT0FQX0ZJTEUpKQorICB7IHNvYXAtPm9tb2RlICY9IH5TT0FQX0lPOworICAgIHNvYXAtPm9tb2RlIHw9IFNPQVBfSU9fU1RPUkU7CisgIH0KKyAgc29hcC0+c3RhdHVzID0gc3RhdHVzOworICBjb3VudCA9IHNvYXBfY291bnRfYXR0YWNobWVudHMoc29hcCk7CisgIGlmIChzb2FwX2JlZ2luX3NlbmQoc29hcCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmbmRlZiBXSVRIX05PSFRUUAorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSAhPSBTT0FQX0lPX1NUT1JFICYmICEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1hNTCkpCisgIHsgcmVnaXN0ZXIgaW50IG4gPSBzb2FwLT5tb2RlOworICAgIHNvYXAtPm1vZGUgJj0gfihTT0FQX0lPIHwgU09BUF9FTkNfWkxJQik7CisgICAgaWYgKChuICYgU09BUF9JTykgIT0gU09BUF9JT19GTFVTSCkKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19CVUZGRVI7CisgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZyZXNwb25zZShzb2FwLCBzdGF0dXMsIGNvdW50KSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgICAgaWYgKChuICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgICB7IGlmIChzb2FwX2ZsdXNoKHNvYXApKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorI2VuZGlmCisgICAgc29hcC0+bW9kZSA9IG47CisgIH0KKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBjb25zdCBjaGFyKgorc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqdCkKK3sgaWYgKCpzb2FwLT50YWcpCisgICAgc3ByaW50Zihzb2FwLT5tc2didWYsICJWYWxpZGF0aW9uIGNvbnN0cmFpbnQgdmlvbGF0aW9uOiAlcyVzIGluIGVsZW1lbnQgPCVzPiIsIHMsIHQ/dDpTT0FQX1NUUl9FT1MsIHNvYXAtPnRhZyk7CisgIGVsc2UKKyAgICBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIlZhbGlkYXRpb24gY29uc3RyYWludCB2aW9sYXRpb246ICVzJXMiLCBzLCB0P3Q6U09BUF9TVFJfRU9TKTsKKyAgcmV0dXJuIHNvYXAtPm1zZ2J1ZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBjb25zdCBjaGFyICoqYyA9IHNvYXBfZmF1bHRjb2RlKHNvYXApOworICBjb25zdCBjaGFyICoqcyA9IHNvYXBfZmF1bHRzdHJpbmcoc29hcCk7CisgIGlmICghKmMgJiYgISpzICYmIHNvYXAtPmZzZXRlcnJvcikKKyAgICBzb2FwLT5mc2V0ZXJyb3Ioc29hcCwgYywgcyk7CisgIGlmICghKmMpCisgIHsgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgICAgICpjID0gIlNPQVAtRU5WOlNlbmRlciI7CisgICAgZWxzZQorICAgICAgKmMgPSAiU09BUC1FTlY6Q2xpZW50IjsKKyAgfQorICBpZiAoKnMpCisgICAgcmV0dXJuOworICBzd2l0Y2ggKHNvYXAtPmVycm9yKQorICB7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGNhc2UgU09BUF9DTElfRkFVTFQ6CisgICAgICAqcyA9ICJDbGllbnQgZmF1bHQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1NWUl9GQVVMVDoKKyAgICAgICpzID0gIlNlcnZlciBmYXVsdCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfVEFHX01JU01BVENIOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJ0YWcgbmFtZSBvciBuYW1lc3BhY2UgbWlzbWF0Y2giLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9UWVBFOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJkYXRhIHR5cGUgbWlzbWF0Y2ggIiwgc29hcC0+dHlwZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfU1lOVEFYX0VSUk9SOgorICAgICAgKnMgPSAiV2VsbC1mb3JtZWRuZXNzIHZpb2xhdGlvbiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTk9fVEFHOgorICAgICAgKnMgPSAiTm8gWE1MIGVsZW1lbnQgdGFnIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9NVVNUVU5ERVJTVEFORDoKKyAgICAgICpjID0gIlNPQVAtRU5WOk11c3RVbmRlcnN0YW5kIjsKKyAgICAgIHNwcmludGYoc29hcC0+bXNnYnVmLCAiVGhlIGRhdGEgaW4gZWxlbWVudCAnJXMnIG11c3QgYmUgdW5kZXJzdG9vZCBidXQgY2Fubm90IGJlIGhhbmRsZWQiLCBzb2FwLT50YWcpOworICAgICAgKnMgPSBzb2FwLT5tc2didWY7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfVkVSU0lPTk1JU01BVENIOgorICAgICAgKmMgPSAiU09BUC1FTlY6VmVyc2lvbk1pc21hdGNoIjsKKyAgICAgICpzID0gIlNPQVAgdmVyc2lvbiBtaXNtYXRjaCBvciBpbnZhbGlkIFNPQVAgbWVzc2FnZSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfREFUQUVOQ09ESU5HVU5LTk9XTjoKKyAgICAgICpjID0gIlNPQVAtRU5WOkRhdGFFbmNvZGluZ1Vua25vd24iOworICAgICAgKnMgPSAiVW5zdXBwb3J0ZWQgU09BUCBkYXRhIGVuY29kaW5nIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9OQU1FU1BBQ0U6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgIm5hbWVzcGFjZSBtaXNtYXRjaCIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1VTRVJfRVJST1I6CisgICAgICAqcyA9ICJVc2VyIGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9GQVRBTF9FUlJPUjoKKyAgICAgICpzID0gIkZhdGFsIGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9OT19NRVRIT0Q6CisgICAgICBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIk1ldGhvZCAnJXMnIG5vdCBpbXBsZW1lbnRlZDogbWV0aG9kIG5hbWUgb3IgbmFtZXNwYWNlIG5vdCByZWNvZ25pemVkIiwgc29hcC0+dGFnKTsKKyAgICAgICpzID0gc29hcC0+bXNnYnVmOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0dFVF9NRVRIT0Q6CisgICAgICAqcyA9ICJIVFRQIEdFVCBtZXRob2Qgbm90IGltcGxlbWVudGVkIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9FT006CisgICAgICAqcyA9ICJPdXQgb2YgbWVtb3J5IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9JT0I6CisgICAgICAqcyA9ICJBcnJheSBpbmRleCBvdXQgb2YgYm91bmRzIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9OVUxMOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJuaWwgbm90IGFsbG93ZWQiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9EVVBMSUNBVEVfSUQ6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgIm11bHRpcGxlIGRlZmluaXRpb25zIG9mIGlkICIsIHNvYXAtPmlkKTsKKyAgICAgIGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgICAgICAgICpzb2FwX2ZhdWx0c3ViY29kZShzb2FwKSA9ICJTT0FQLUVOQzpEdXBsaWNhdGVJRCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTUlTU0lOR19JRDoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAibWlzc2luZyBpZCBmb3IgcmVmICIsIHNvYXAtPmlkKTsKKyAgICAgIGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgICAgICAgICpzb2FwX2ZhdWx0c3ViY29kZShzb2FwKSA9ICJTT0FQLUVOQzpNaXNzaW5nSUQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0hSRUY6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgImluY29tcGF0aWJsZSBvYmplY3QgcmVmICIsIHNvYXAtPmlkKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9GQVVMVDoKKyAgICAgIGJyZWFrOworI2lmbmRlZiBXSVRIX05PSU8KKyAgICBjYXNlIFNPQVBfVURQX0VSUk9SOgorICAgICAgKnMgPSAiTWVzc2FnZSB0b28gbGFyZ2UgZm9yIFVEUCBwYWNrZXQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1RDUF9FUlJPUjoKKyAgICAgICpzID0gdGNwX2Vycm9yKHNvYXApOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIFNPQVBfSFRUUF9FUlJPUjoKKyAgICAgICpzID0gIkhUVFAgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1NTTF9FUlJPUjoKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICAgICpzID0gIlNTTCBlcnJvciI7CisjZWxzZQorICAgICAgKnMgPSAiT3BlblNTTCBub3QgaW5zdGFsbGVkOiByZWNvbXBpbGUgd2l0aCAtRFdJVEhfT1BFTlNTTCI7CisjZW5kaWYKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9QTFVHSU5fRVJST1I6CisgICAgICAqcyA9ICJQbHVnaW4gcmVnaXN0cnkgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0RJTUVfRVJST1I6CisgICAgICAqcyA9ICJESU1FIGZvcm1hdCBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfRElNRV9IUkVGOgorICAgICAgKnMgPSAiRElNRSBocmVmIHRvIG1pc3NpbmcgYXR0YWNobWVudCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfRElNRV9NSVNNQVRDSDoKKyAgICAgICpzID0gIkRJTUUgdmVyc2lvbi90cmFuc21pc3Npb24gZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0RJTUVfRU5EOgorICAgICAgKnMgPSAiRW5kIG9mIERJTUUgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX01JTUVfRVJST1I6CisgICAgICAqcyA9ICJNSU1FIGZvcm1hdCBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTUlNRV9IUkVGOgorICAgICAgKnMgPSAiTUlNRSBocmVmIHRvIG1pc3NpbmcgYXR0YWNobWVudCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTUlNRV9FTkQ6CisgICAgICAqcyA9ICJFbmQgb2YgTUlNRSBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfWkxJQl9FUlJPUjoKKyNpZmRlZiBXSVRIX1pMSUIKKyAgICAgIHNwcmludGYoc29hcC0+bXNnYnVmLCAiWmxpYi9nemlwIGVycm9yOiAnJXMnIiwgc29hcC0+ZF9zdHJlYW0ubXNnP3NvYXAtPmRfc3RyZWFtLm1zZzoiIik7CisgICAgICAqcyA9IHNvYXAtPm1zZ2J1ZjsKKyNlbHNlCisgICAgICAqcyA9ICJabGliL2d6aXAgbm90IGluc3RhbGxlZCBmb3IgKGRlKWNvbXByZXNzaW9uOiByZWNvbXBpbGUgd2l0aCAtRFdJVEhfR1pJUCI7CisjZW5kaWYKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9SRVFVSVJFRDoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAibWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGUiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9QUk9ISUJJVEVEOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJwcm9oaWJpdGVkIGF0dHJpYnV0ZSBwcmVzZW50IiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfT0NDVVJTOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJtaW4vbWF4T2NjdXJzIHZpb2xhdGlvbiIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0xFTkdUSDoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAiY29udGVudCBsZW5ndGggdmlvbGF0aW9uIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfU1RPUDoKKyAgICAgICpzID0gIlN0b3BwZWQ6IG5vIHJlc3BvbnNlIHNlbnQiOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIFNPQVBfRU9GOgorI2lmbmRlZiBXSVRIX05PSU8KKyAgICAgIHNwcmludGYoc29hcC0+bXNnYnVmLCAiRW5kIG9mIGZpbGUgb3Igbm8gaW5wdXQ6ICclcyciLCBzb2FwX3N0cmVycm9yKHNvYXApKTsKKyAgICAgICpzID0gc29hcC0+bXNnYnVmOworICAgICAgYnJlYWs7CisjZWxzZQorICAgICAgKnMgPSAiRW5kIG9mIGZpbGUgb3Igbm8gaW5wdXQiOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIGlmIChzb2FwLT5lcnJvciA+IDIwMCAmJiBzb2FwLT5lcnJvciA8IDYwMCkKKyAgICAgIHsgc3ByaW50Zihzb2FwLT5tc2didWYsICJIVFRQIEVycm9yOiAlZCAlcyIsIHNvYXAtPmVycm9yLCBodHRwX2Vycm9yKHNvYXAsIHNvYXAtPmVycm9yKSk7CisgICAgICAgICpzID0gc29hcC0+bXNnYnVmOworICAgICAgfQorICAgICAgZWxzZQorI2VuZGlmCisjZW5kaWYKKyAgICAgIHsgc3ByaW50Zihzb2FwLT5tc2didWYsICJFcnJvciAlZCIsIHNvYXAtPmVycm9yKTsKKyAgICAgICAgKnMgPSBzb2FwLT5tc2didWY7CisgICAgICB9CisgICAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmRfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBzdGF0dXMgPSBzb2FwLT5lcnJvcjsKKyAgaW50IHIgPSAxOworICBpZiAoc3RhdHVzID09IFNPQVBfU1RPUCkKKyAgICByZXR1cm4gc3RhdHVzOworICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2VuZGluZyBiYWNrIGZhdWx0IHN0cnVjdCBmb3IgZXJyb3IgY29kZSAlZFxuIiwgc29hcC0+ZXJyb3IpKTsKKyAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7IC8qIHRvIHRlcm1pbmF0ZSBjb25uZWN0aW9uICovCisgIHNvYXBfc2V0X2ZhdWx0KHNvYXApOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgZmRfc2V0IHJmZCwgc2ZkOworICAgIHRpbWVvdXQudHZfc2VjID0gMDsKKyAgICB0aW1lb3V0LnR2X3VzZWMgPSAwOworICAgIEZEX1pFUk8oJnJmZCk7CisgICAgRkRfWkVSTygmc2ZkKTsKKyAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnJmZCk7CisgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZzZmQpOworICAgIHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgJnJmZCwgJnNmZCwgTlVMTCwgJnRpbWVvdXQpOworICAgIGlmIChyID4gMCkKKyAgICB7IGlmICghRkRfSVNTRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnNmZCkKKyAgICAgICB8fCAoRkRfSVNTRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnJmZCkKKyAgICAgICAgJiYgcmVjdigoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzb2FwLT50bXBidWYsIDEsIE1TR19QRUVLKSA8IDApKQorICAgICAgICByID0gMDsKKyAgICB9CisgIH0KKyNlbmRpZgorI2VuZGlmCisgIGlmICgoc3RhdHVzICE9IFNPQVBfRU9GIHx8ICghc29hcC0+cmVjdl90aW1lb3V0ICYmICFzb2FwLT5zZW5kX3RpbWVvdXQpKSAmJiByID4gMCkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgICAgc29hcF9zZXJpYWxpemVoZWFkZXIoc29hcCk7CisgICAgc29hcF9zZXJpYWxpemVmYXVsdChzb2FwKTsKKyAgICBzb2FwX2JlZ2luX2NvdW50KHNvYXApOworICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgeyBzb2FwX2VudmVsb3BlX2JlZ2luX291dChzb2FwKTsKKyAgICAgIHNvYXBfcHV0aGVhZGVyKHNvYXApOworICAgICAgc29hcF9ib2R5X2JlZ2luX291dChzb2FwKTsKKyAgICAgIHNvYXBfcHV0ZmF1bHQoc29hcCk7CisgICAgICBzb2FwX2JvZHlfZW5kX291dChzb2FwKTsKKyAgICAgIHNvYXBfZW52ZWxvcGVfZW5kX291dChzb2FwKTsKKyAgICB9CisgICAgc29hcF9lbmRfY291bnQoc29hcCk7CisgICAgaWYgKHNvYXBfcmVzcG9uc2Uoc29hcCwgc3RhdHVzKQorICAgICB8fCBzb2FwX2VudmVsb3BlX2JlZ2luX291dChzb2FwKQorICAgICB8fCBzb2FwX3B1dGhlYWRlcihzb2FwKQorICAgICB8fCBzb2FwX2JvZHlfYmVnaW5fb3V0KHNvYXApCisgICAgIHx8IHNvYXBfcHV0ZmF1bHQoc29hcCkKKyAgICAgfHwgc29hcF9ib2R5X2VuZF9vdXQoc29hcCkKKyAgICAgfHwgc29hcF9lbnZlbG9wZV9lbmRfb3V0KHNvYXApKQorICAgICAgcmV0dXJuIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgIHNvYXBfZW5kX3NlbmQoc29hcCk7CisgIH0KKyAgc29hcC0+ZXJyb3IgPSBzdGF0dXM7CisgIHJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWN2X2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgc3RhdHVzID0gc29hcC0+ZXJyb3I7CisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWNlaXZpbmcgU09BUCBGYXVsdFxuIikpOworICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIGlmIChzb2FwX2dldGZhdWx0KHNvYXApKQorICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJFcnJvcjogc29hcF9nZXRfc29hcGZhdWx0KCkgZmFpbGVkLiBJcyB0aGlzIGEgU09BUCBtZXNzYWdlIGF0IGFsbD9cbiIpKTsKKyAgICAqc29hcF9mYXVsdGNvZGUoc29hcCkgPSAoc29hcC0+dmVyc2lvbiA9PSAyID8gIlNPQVAtRU5WOlNlbmRlciIgOiAiU09BUC1FTlY6Q2xpZW50Iik7CisgICAgc29hcC0+ZXJyb3IgPSBzdGF0dXM7CisgICAgc29hcF9zZXRfZmF1bHQoc29hcCk7CisgIH0KKyAgZWxzZQorICB7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnMgPSAqc29hcF9mYXVsdGNvZGUoc29hcCk7CisgICAgaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCBzLCAiU09BUC1FTlY6U2VydmVyIikgfHwgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHMsICJTT0FQLUVOVjpSZWNlaXZlciIpKQorICAgICAgc3RhdHVzID0gU09BUF9TVlJfRkFVTFQ7IAorICAgIGVsc2UgaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCBzLCAiU09BUC1FTlY6Q2xpZW50IikgfHwgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHMsICJTT0FQLUVOVjpTZW5kZXIiKSkKKyAgICAgIHN0YXR1cyA9IFNPQVBfQ0xJX0ZBVUxUOworICAgIGVsc2UgaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCBzLCAiU09BUC1FTlY6TXVzdFVuZGVyc3RhbmQiKSkKKyAgICAgIHN0YXR1cyA9IFNPQVBfTVVTVFVOREVSU1RBTkQ7CisgICAgZWxzZSBpZiAoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHMsICJTT0FQLUVOVjpWZXJzaW9uTWlzbWF0Y2giKSkKKyAgICAgIHN0YXR1cyA9IFNPQVBfVkVSU0lPTk1JU01BVENIOworICAgIGVsc2UKKyAgICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJGYXVsdCBjb2RlICVzXG4iLCBzKSk7CisgICAgICBzdGF0dXMgPSBTT0FQX0ZBVUxUOworICAgIH0KKyAgICBpZiAoc29hcF9ib2R5X2VuZF9pbihzb2FwKQorICAgICB8fCBzb2FwX2VudmVsb3BlX2VuZF9pbihzb2FwKQorICAgICB8fCBzb2FwX2VuZF9yZWN2KHNvYXApKQorICAgICAgcmV0dXJuIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgIHNvYXAtPmVycm9yID0gc3RhdHVzOworICB9CisgIHJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZW5kX2VtcHR5X3Jlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5jb3VudCA9IDA7CisgIGlmIChzb2FwX3Jlc3BvbnNlKHNvYXAsIFNPQVBfT0spIHx8IHNvYXBfZW5kX3NlbmQoc29hcCkpCisgICAgcmV0dXJuIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlY3ZfZW1wdHlfcmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwX2JlZ2luX3JlY3Yoc29hcCkgfHwgc29hcF9lbmRfcmVjdihzb2FwKSkKKyAgICByZXR1cm4gc29hcF9jbG9zZXNvY2soc29hcCk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNvbnN0IGNoYXIqCitzb2FwX3N0cmVycm9yKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgZXJyID0gc29hcC0+ZXJybnVtOworICBpZiAoZXJyKQorICB7CisjaWZuZGVmIFdJTjMyCisgICAgcmV0dXJuIHN0cmVycm9yKGVycik7CisjZWxzZQorICAgIEZvcm1hdE1lc3NhZ2UoRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU18Rk9STUFUX01FU1NBR0VfSUdOT1JFX0lOU0VSVFMsIE5VTEwsIGVyciwgMCwgKExQVFNUUikmc29hcC0+ZXJyb3JzdHIsIHNpemVvZihzb2FwLT5lcnJvcnN0ciksIE5VTEwpOworICAgIHJldHVybiBzb2FwLT5lcnJvcnN0cjsKKyNlbmRpZgorICB9CisgIHJldHVybiAiT3BlcmF0aW9uIGludGVycnVwdGVkIG9yIHRpbWVkIG91dCI7Cit9CisjZW5kaWYKKyNlbmRpZiAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitzdGF0aWMgaW50Citzb2FwX3NldF9lcnJvcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRjb2RlLCBjb25zdCBjaGFyICpmYXVsdHN1YmNvZGUsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCwgaW50IHNvYXBlcnJvcikKK3sgKnNvYXBfZmF1bHRjb2RlKHNvYXApID0gZmF1bHRjb2RlOworICBpZiAoZmF1bHRzdWJjb2RlKQorICAgICpzb2FwX2ZhdWx0c3ViY29kZShzb2FwKSA9IGZhdWx0c3ViY29kZTsKKyAgKnNvYXBfZmF1bHRzdHJpbmcoc29hcCkgPSBmYXVsdHN0cmluZzsKKyAgaWYgKGZhdWx0ZGV0YWlsICYmICpmYXVsdGRldGFpbCkKKyAgeyByZWdpc3RlciBjb25zdCBjaGFyICoqcyA9IHNvYXBfZmF1bHRkZXRhaWwoc29hcCk7CisgICAgaWYgKHMpCisgICAgICAqcyA9IGZhdWx0ZGV0YWlsOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvciA9IHNvYXBlcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZXRfc2VuZGVyX2Vycm9yKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdHN0cmluZywgY29uc3QgY2hhciAqZmF1bHRkZXRhaWwsIGludCBzb2FwZXJyb3IpCit7IHJldHVybiBzb2FwX3NldF9lcnJvcihzb2FwLCBzb2FwLT52ZXJzaW9uID09IDIgPyAiU09BUC1FTlY6U2VuZGVyIiA6ICJTT0FQLUVOVjpDbGllbnQiLCBOVUxMLCBmYXVsdHN0cmluZywgZmF1bHRkZXRhaWwsIHNvYXBlcnJvcik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdHN0cmluZywgY29uc3QgY2hhciAqZmF1bHRkZXRhaWwsIGludCBzb2FwZXJyb3IpCit7IHJldHVybiBzb2FwX3NldF9lcnJvcihzb2FwLCBzb2FwLT52ZXJzaW9uID09IDIgPyAiU09BUC1FTlY6UmVjZWl2ZXIiIDogIlNPQVAtRU5WOlNlcnZlciIsIE5VTEwsIGZhdWx0c3RyaW5nLCBmYXVsdGRldGFpbCwgc29hcGVycm9yKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK3N0YXRpYyBpbnQKK3NvYXBfY29weV9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRjb2RlLCBjb25zdCBjaGFyICpmYXVsdHN1YmNvZGUsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCkKK3sgY2hhciAqciA9IE5VTEwsICpzID0gTlVMTCwgKnQgPSBOVUxMOworICBpZiAoZmF1bHRzdWJjb2RlKQorICAgIHIgPSBzb2FwX3N0cmR1cChzb2FwLCBmYXVsdHN1YmNvZGUpOworICBpZiAoZmF1bHRzdHJpbmcpCisgICAgcyA9IHNvYXBfc3RyZHVwKHNvYXAsIGZhdWx0c3RyaW5nKTsKKyAgaWYgKGZhdWx0ZGV0YWlsKQorICAgIHQgPSBzb2FwX3N0cmR1cChzb2FwLCBmYXVsdGRldGFpbCk7CisgIHJldHVybiBzb2FwX3NldF9lcnJvcihzb2FwLCBmYXVsdGNvZGUsIHIsIHMsIHQsIFNPQVBfRkFVTFQpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmRlcl9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRzdHJpbmcsIGNvbnN0IGNoYXIgKmZhdWx0ZGV0YWlsKQoreyByZXR1cm4gc29hcF9zZW5kZXJfZmF1bHRfc3ViY29kZShzb2FwLCBOVUxMLCBmYXVsdHN0cmluZywgZmF1bHRkZXRhaWwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmRlcl9mYXVsdF9zdWJjb2RlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdHN1YmNvZGUsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCkKK3sgcmV0dXJuIHNvYXBfY29weV9mYXVsdChzb2FwLCBzb2FwLT52ZXJzaW9uID09IDIgPyAiU09BUC1FTlY6U2VuZGVyIiA6ICJTT0FQLUVOVjpDbGllbnQiLCBmYXVsdHN1YmNvZGUsIGZhdWx0c3RyaW5nLCBmYXVsdGRldGFpbCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVjZWl2ZXJfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCkKK3sgcmV0dXJuIHNvYXBfcmVjZWl2ZXJfZmF1bHRfc3ViY29kZShzb2FwLCBOVUxMLCBmYXVsdHN0cmluZywgZmF1bHRkZXRhaWwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlY2VpdmVyX2ZhdWx0X3N1YmNvZGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZhdWx0c3ViY29kZSwgY29uc3QgY2hhciAqZmF1bHRzdHJpbmcsIGNvbnN0IGNoYXIgKmZhdWx0ZGV0YWlsKQoreyByZXR1cm4gc29hcF9jb3B5X2ZhdWx0KHNvYXAsIHNvYXAtPnZlcnNpb24gPT0gMiA/ICJTT0FQLUVOVjpSZWNlaXZlciIgOiAiU09BUC1FTlY6U2VydmVyIiwgZmF1bHRzdWJjb2RlLCBmYXVsdHN0cmluZywgZmF1bHRkZXRhaWwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorI2lmbmRlZiBXSVRIX05PU1RETElCCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3ByaW50X2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwLCBGSUxFICpmZCkKK3sgaWYgKHNvYXBfY2hlY2tfc3RhdGUoc29hcCkpCisgICAgZnByaW50ZihmZCwgIkVycm9yOiBzb2FwIHN0cnVjdCBub3QgaW5pdGlhbGl6ZWRcbiIpOworICBlbHNlIGlmIChzb2FwLT5lcnJvcikKKyAgeyBjb25zdCBjaGFyICpjLCAqdiA9IE5VTEwsICpzLCAqKmQ7CisgICAgZCA9IHNvYXBfZmF1bHRjb2RlKHNvYXApOworICAgIGlmICghKmQpCisgICAgICBzb2FwX3NldF9mYXVsdChzb2FwKTsKKyAgICBjID0gKmQ7CisgICAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgICAgIHYgPSAqc29hcF9mYXVsdHN1YmNvZGUoc29hcCk7CisgICAgcyA9ICpzb2FwX2ZhdWx0c3RyaW5nKHNvYXApOworICAgIGQgPSBzb2FwX2ZhdWx0ZGV0YWlsKHNvYXApOworICAgIGZwcmludGYoZmQsICIlcyVkIGZhdWx0OiAlcyBbJXNdXG5cIiVzXCJcbkRldGFpbDogJXNcbiIsIHNvYXAtPnZlcnNpb24gPyAiU09BUCAxLiIgOiAiRXJyb3IgIiwgc29hcC0+dmVyc2lvbiA/IChpbnQpc29hcC0+dmVyc2lvbiA6IHNvYXAtPmVycm9yLCBjLCB2ID8gdiA6ICJubyBzdWJjb2RlIiwgcyA/IHMgOiAiW25vIHJlYXNvbl0iLCBkICYmICpkID8gKmQgOiAiW25vIGRldGFpbF0iKTsKKyAgfQorfQorI2VuZGlmCisjZW5kaWYKKyAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorI2lmbmRlZiBXSVRIX05PU1RETElCCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3ByaW50X2ZhdWx0X2xvY2F0aW9uKHN0cnVjdCBzb2FwICpzb2FwLCBGSUxFICpmZCkKK3sgCisjaWZuZGVmIFdJVEhfTEVBTgorICBpbnQgaSwgaiwgYzEsIGMyOworICBpZiAoc29hcC0+ZXJyb3IgJiYgc29hcC0+YnVmbGVuID4gMCkKKyAgeyBpID0gKGludClzb2FwLT5idWZpZHggLSAxOworICAgIGlmIChpIDw9IDApCisgICAgICBpID0gMDsKKyAgICBjMSA9IHNvYXAtPmJ1ZltpXTsKKyAgICBzb2FwLT5idWZbaV0gPSAnXDAnOworICAgIGlmICgoaW50KXNvYXAtPmJ1ZmxlbiA+PSBpICsgMTAyNCkKKyAgICAgIGogPSBpICsgMTAyMzsKKyAgICBlbHNlCisgICAgICBqID0gKGludClzb2FwLT5idWZsZW4gLSAxOworICAgIGMyID0gc29hcC0+YnVmW2pdOworICAgIHNvYXAtPmJ1ZltqXSA9ICdcMCc7CisgICAgZnByaW50ZihmZCwgIiVzJWNcbioqIEhFUkUgKipcbiIsIHNvYXAtPmJ1ZiwgYzEpOworICAgIGlmIChzb2FwLT5idWZpZHggPCBzb2FwLT5idWZsZW4pCisgICAgICBmcHJpbnRmKGZkLCAiJXNcbiIsIHNvYXAtPmJ1ZiArIHNvYXAtPmJ1ZmlkeCk7CisgICAgc29hcC0+YnVmW2ldID0gYzE7CisgICAgc29hcC0+YnVmW2pdID0gYzI7CisgIH0KKyNlbmRpZgorfQorI2VuZGlmCisjZW5kaWYKKyAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlZ2lzdGVyX3BsdWdpbl9hcmcoc3RydWN0IHNvYXAgKnNvYXAsIGludCAoKmZjcmVhdGUpKHN0cnVjdCBzb2FwKiwgc3RydWN0IHNvYXBfcGx1Z2luKiwgdm9pZCopLCB2b2lkICphcmcpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BsdWdpbiAqcDsKKyAgcmVnaXN0ZXIgaW50IHI7CisgIGlmICghKHAgPSAoc3RydWN0IHNvYXBfcGx1Z2luKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfcGx1Z2luKSkpKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICBwLT5pZCA9IE5VTEw7CisgIHAtPmRhdGEgPSBOVUxMOworICBwLT5mY29weSA9IE5VTEw7CisgIHAtPmZkZWxldGUgPSBOVUxMOworICByID0gZmNyZWF0ZShzb2FwLCBwLCBhcmcpOworICBpZiAoIXIgJiYgcC0+ZmRlbGV0ZSkKKyAgeyBwLT5uZXh0ID0gc29hcC0+cGx1Z2luczsKKyAgICBzb2FwLT5wbHVnaW5zID0gcDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlZ2lzdGVyZWQgJyVzJyBwbHVnaW5cbiIsIHAtPmlkKSk7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgcmVnaXN0ZXIgcGx1Z2luICclcyc6IHBsdWdpbiByZXR1cm5lZCBlcnJvciAlZCAob3IgZmRlbGV0ZSBjYWxsYmFjayBub3Qgc2V0KVxuIiwgcC0+aWQ/cC0+aWQ6Ij8iLCByKSk7CisgIFNPQVBfRlJFRShzb2FwLCBwKTsKKyAgcmV0dXJuIHI7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZCAqCitmcGx1Z2luKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGx1Z2luICpwOworICBmb3IgKHAgPSBzb2FwLT5wbHVnaW5zOyBwOyBwID0gcC0+bmV4dCkKKyAgICBpZiAocC0+aWQgPT0gaWQgfHwgIXN0cmNtcChwLT5pZCwgaWQpKQorICAgICAgcmV0dXJuIHAtPmRhdGE7CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZCAqCitTT0FQX0ZNQUMyCitzb2FwX2xvb2t1cF9wbHVnaW4oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkKQoreyByZXR1cm4gc29hcC0+ZnBsdWdpbihzb2FwLCBpZCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworI2lmbmRlZiBXSVRIX0xFQU4KK3NvYXA6OnNvYXAoKQoreyBzb2FwX2luaXQodGhpcyk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqCUMrKyBzb2FwIHN0cnVjdCBtZXRob2RzCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworI2lmbmRlZiBXSVRIX0xFQU4KK3NvYXA6OnNvYXAoc29hcF9tb2RlIG1vZGUpCit7IHNvYXBfaW5pdDEodGhpcywgbW9kZSk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIF9fY3BsdXNwbHVzCisjaWZuZGVmIFdJVEhfTEVBTgorc29hcDo6c29hcChzb2FwX21vZGUgaW1vZGUsIHNvYXBfbW9kZSBvbW9kZSkKK3sgc29hcF9pbml0Mih0aGlzLCBpbW9kZSwgb21vZGUpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworI2lmbmRlZiBXSVRIX0xFQU4KK3NvYXA6OnNvYXAoc3RydWN0IHNvYXAmIHNvYXApCit7IHNvYXBfY29weV9jb250ZXh0KHRoaXMsICZzb2FwKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpZm5kZWYgV0lUSF9MRUFOCitzb2FwOjp+c29hcCgpCit7IHNvYXBfZGVzdHJveSh0aGlzKTsKKyAgc29hcF9lbmQodGhpcyk7CisgIHNvYXBfZG9uZSh0aGlzKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9nc29hcC1wYWxtL3BhbG1zb2FwMi5jcHAgYi9nc29hcC1wYWxtL3BhbG1zb2FwMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYyNmRlZQotLS0gL2Rldi9udWxsCisrKyBiL2dzb2FwLXBhbG0vcGFsbXNvYXAyLmNwcApAQCAtMCwwICsxLDEzNDQ5IEBACisjZGVmaW5lIFBBTE1fMgorLyoKKworc3Rkc29hcDIuY1twcF0gMi43LjZlCisKK2dTT0FQIHJ1bnRpbWUKKworZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlczoKK0dQTCwgdGhlIGdTT0FQIHB1YmxpYyBsaWNlbnNlLCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ29udHJpYnV0b3JzOgorCitXaW5kIFJpdmVyIFN5c3RlbXMgSW5jLiwgZm9yIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25zIHVuZGVyIGdTT0FQIHB1YmxpYyBsaWNlbnNlOgorICAtIHZ4V29ya3MgY29tcGF0aWJsZQkoI2RlZmluZSBWWFdPUktTKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIHB1YmxpYyBsaWNlbnNlLgorCitUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBnU09BUCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMworKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCitMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK2h0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9zb2FwbGljZW5zZS5odG1sCitTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAorV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCitmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLgorQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSW5zdGFsbGF0aW9uIG5vdGU6CisKK1dpbjMyIGJ1aWxkIG5lZWRzIHdpbnNvY2suZGxsIChWaXN1YWwgQysrICJ3c29jazMyLmxpYiIpCitUbyBkbyB0aGlzIGluIFZpc3VhbCBDKysgNi4wLCBnbyB0byAiUHJvamVjdCIsICJzZXR0aW5ncyIsIHNlbGVjdCB0aGUgIkxpbmsiCit0YWIgKHRoZSBwcm9qZWN0IGZpbGUgbmVlZHMgdG8gYmUgc2VsZWN0ZWQgaW4gdGhlIGZpbGUgdmlldykgYW5kIGFkZAorIndzb2NrMzIubGliIiB0byB0aGUgIk9iamVjdC9saWJyYXJ5IG1vZHVsZXMiIGVudHJ5CisKK09uIE1hYyBPUyBYIHdpdGggZ2NjIChHQ0MpIDMuMSAyMDAyMDQyMCAocHJlcmVsZWFzZSkgeW91IE1VU1QgY29tcGlsZSB3aXRoCistZnN0YWNrX2NoZWNrIHdoZW4gdXNpbmcgLU8yIGJlY2F1c2UgZ2NjIDMuMSBoYXMgYSBidWcgdGhhdCBzbWFzaGVzIHRoZSBzdGFjaword2hlbiBsb2NhbGx5IGFsbG9jYXRlZCBkYXRhIGV4Y2VlZHMgNjRLLgorCisqLworCisjaWZkZWYgQVM0MDAKKyMgcHJhZ21hIGNvbnZlcnQoODE5KQkvKiBFQkNESUMgdG8gQVNDSUkgKi8KKyNlbmRpZgorCisjaW5jbHVkZSAic3Rkc29hcDIuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitTT0FQX1NPVVJDRV9TVEFNUCgiQCgjKSBzdGRzb2FwMi5jcHAgdmVyIDIuNy42ZSAyMDA2LTAyLTE4IDEyOjAwOjAwIEdNVCIpCitleHRlcm4gIkMiIHsKKyNlbHNlCitTT0FQX1NPVVJDRV9TVEFNUCgiQCgjKSBzdGRzb2FwMi5jIHZlciAyLjcuNmUgMjAwNi0wMi0xOCAxMjowMDowMCBHTVQiKQorI2VuZGlmCisKKy8qIDhiaXQgY2hhcmFjdGVyIHJlcHJlc2VudGluZyB1bmtub3duL25vbnJlcHJlc2VudGFibGUgY2hhcmFjdGVyIGRhdGEgKGUuZy4gbm90IHN1cHBvcnRlZCBieSBjdXJyZW50IGxvY2FsZSB3aXRoIG11bHRpYnl0ZSBzdXBwb3J0IGVuYWJsZWQpICovCisjaWZuZGVmIFNPQVBfVU5LTk9XTl9DSEFSCisjZGVmaW5lIFNPQVBfVU5LTk9XTl9DSEFSICgxMjcpCisjZW5kaWYKKworLyogICAgICBFT0Y9LTEgKi8KKyNkZWZpbmUgU09BUF9MVCAoc29hcF93Y2hhcikoLTIpIC8qIFhNTCBjaGFyYWN0ZXIgJzwnICovCisjZGVmaW5lIFNPQVBfVFQgKHNvYXBfd2NoYXIpKC0zKSAvKiBYTUwgY2hhcmFjdGVyICc8LycgKi8KKyNkZWZpbmUgU09BUF9HVCAoc29hcF93Y2hhcikoLTQpIC8qIFhNTCBjaGFyYWN0ZXIgJz4nICovCisjZGVmaW5lIFNPQVBfUVQgKHNvYXBfd2NoYXIpKC01KSAvKiBYTUwgY2hhcmFjdGVyICciJyAqLworI2RlZmluZSBTT0FQX0FQIChzb2FwX3djaGFyKSgtNikgLyogWE1MIGNoYXJhY3RlciAnJycgKi8KKworI2RlZmluZSBzb2FwX2JsYW5rKGMpCQkoKGMpID49IDAgJiYgKGMpIDw9IDMyKQorI2RlZmluZSBzb2FwX25vdGJsYW5rKGMpCSgoYykgPiAzMikKKyNkZWZpbmUgc29hcF9oYXNoX3B0cihwKQkoKCh1bnNpZ25lZCBsb25nKShwKSA+PiAzKSAmIChTT0FQX1BUUkhBU0ggLSAxKSkKKworI2lmZGVmIFNPQVBfREVCVUcKK3N0YXRpYyB2b2lkIHNvYXBfaW5pdF9sb2dzKHN0cnVjdCBzb2FwKik7CitzdGF0aWMgdm9pZCBzb2FwX2Nsb3NlX2xvZ2ZpbGUoc3RydWN0IHNvYXAqLCBpbnQpOworc3RhdGljIHZvaWQgc29hcF9zZXRfbG9nZmlsZShzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciopOworc3RhdGljIHZvaWQgc29hcF9mcmVlX21odChzdHJ1Y3Qgc29hcCopOworc3RhdGljIHZvaWQgc29hcF90cmFja191bmxpbmsoc3RydWN0IHNvYXAqLCBjb25zdCB2b2lkKik7CisjZW5kaWYKKworI2lmbmRlZiBQQUxNXzIKK3N0YXRpYyBpbnQgc29hcF9zZXRfZXJyb3Ioc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgaW50KTsKK3N0YXRpYyBpbnQgc29hcF9jb3B5X2ZhdWx0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworc3RhdGljIGludCBzb2FwX2dldGF0dHJ2YWwoc3RydWN0IHNvYXAqLCBjaGFyKiwgc2l6ZV90LCBzb2FwX3djaGFyKTsKKyNlbmRpZgorCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHNvYXBfd2NoYXIgc29hcF9jaGFyKHN0cnVjdCBzb2FwKik7CitzdGF0aWMgc29hcF93Y2hhciBzb2FwX2dldF9waShzdHJ1Y3Qgc29hcCopOworc3RhdGljIGludCBzb2FwX2lzeGRpZ2l0KGludCk7CitzdGF0aWMgdm9pZCAqZnBsdWdpbihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCitzdGF0aWMgdm9pZCBzb2FwX3VwZGF0ZV9wdHJzKHN0cnVjdCBzb2FwKiwgY2hhciosIGNoYXIqLCBjaGFyKiwgY2hhciopOworc3RhdGljIGludCBzb2FwX2hhc19jb3BpZXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworc3RhdGljIHZvaWQgc29hcF9pbml0X2lodChzdHJ1Y3Qgc29hcCopOworc3RhdGljIHZvaWQgc29hcF9mcmVlX2lodChzdHJ1Y3Qgc29hcCopOworc3RhdGljIHZvaWQgc29hcF9pbml0X3BodChzdHJ1Y3Qgc29hcCopOworc3RhdGljIHZvaWQgc29hcF9mcmVlX3BodChzdHJ1Y3Qgc29hcCopOworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBjb25zdCBjaGFyICpzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyBpbnQgc29hcF9pc251bWVyaWMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKik7CitzdGF0aWMgdGltZV90IHNvYXBfdGltZWdtKHN0cnVjdCB0bSopOworc3RhdGljIHN0cnVjdCBzb2FwX25saXN0ICpzb2FwX2xvb2t1cF9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzaXplX3Qgbik7CitzdGF0aWMgc3RydWN0IHNvYXBfbmxpc3QgKnNvYXBfcHVzaF9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKm5zLCBzaG9ydCB1dGlsaXplZCk7CitzdGF0aWMgdm9pZCBzb2FwX3BvcF9ucyhzdHJ1Y3Qgc29hcCAqc29hcCk7CitzdGF0aWMgdm9pZCBzb2FwX3V0aWxpemVfbnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc2l6ZV90IG4pOworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpzb2FwX25ld19tdWx0aXBhcnQoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKiwgc3RydWN0IHNvYXBfbXVsdGlwYXJ0KiosIGNoYXIqLCBzaXplX3QpOworc3RhdGljIGludCBzb2FwX3B1dGRpbWVmaWVsZChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworc3RhdGljIGNoYXIgKnNvYXBfZ2V0ZGltZWZpZWxkKHN0cnVjdCBzb2FwKiwgc2l6ZV90KTsKK3N0YXRpYyB2b2lkIHNvYXBfc2VsZWN0X21pbWVfYm91bmRhcnkoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBpbnQgc29hcF92YWxpZF9taW1lX2JvdW5kYXJ5KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgaW50IHNvYXBfbWF0Y2hfY2lkKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyB2b2lkIHNvYXBfcmVzb2x2ZV9hdHRhY2htZW50KHN0cnVjdCBzb2FwKiwgc3RydWN0IHNvYXBfbXVsdGlwYXJ0Kik7CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgV0lUSF9HWklQCitzdGF0aWMgaW50IHNvYXBfZ2V0Z3ppcGhkcihzdHJ1Y3Qgc29hcCopOworI2VuZGlmCisKKyNpZmRlZiBXSVRIX09QRU5TU0wKK3N0YXRpYyBpbnQgc3NsX2luaXRfZG9uZSA9IDA7CitzdGF0aWMgaW50IHNzbF9hdXRoX2luaXQoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBpbnQgc3NsX3ZlcmlmeV9jYWxsYmFjayhpbnQsIFg1MDlfU1RPUkVfQ1RYKik7CitzdGF0aWMgaW50IHNzbF9wYXNzd29yZChjaGFyKiwgaW50LCBpbnQsIHZvaWQgKik7CitzdGF0aWMgY29uc3QgY2hhciAqc3NsX2Vycm9yKHN0cnVjdCBzb2FwKiwgaW50KTsKKy8qIFRoaXMgY2FsbGJhY2sgaXMgaW5jbHVkZWQgZm9yIGZ1dHVyZSByZWZlcmVuY2VzLiBJdCBzaG91bGQgbm90IGJlIGRlbGV0ZWQKK3N0YXRpYyBESCAqc3NsX3RtcF9kaChTU0wqLCBpbnQsIGludCk7CisqLworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChXSVRIX05PSFRUUCkgfHwgIWRlZmluZWQoV0lUSF9MRUFORVIpCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNvbnN0IGNoYXIgKnNvYXBfZGVjb2RlKGNoYXIqLCBzaXplX3QsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHNvYXBfd2NoYXIgc29hcF9nZXRjaHVua2NoYXIoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBjb25zdCBjaGFyICpodHRwX2Vycm9yKHN0cnVjdCBzb2FwKiwgaW50KTsKK3N0YXRpYyBpbnQgaHR0cF9wb3N0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90KTsKK3N0YXRpYyBpbnQgaHR0cF9nZXQoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBpbnQgaHR0cF9zZW5kX2hlYWRlcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyBpbnQgaHR0cF9wb3N0X2hlYWRlcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitzdGF0aWMgaW50IGh0dHBfcmVzcG9uc2Uoc3RydWN0IHNvYXAqLCBpbnQsIHNpemVfdCk7CitzdGF0aWMgaW50IGh0dHBfcGFyc2Uoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBpbnQgaHR0cF9wYXJzZV9oZWFkZXIoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50IGZzZW5kKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHNpemVfdCk7CitzdGF0aWMgc2l6ZV90IGZyZWN2KHN0cnVjdCBzb2FwKiwgY2hhciosIHNpemVfdCk7CitzdGF0aWMgaW50IHRjcF9pbml0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgY29uc3QgY2hhciAqdGNwX2Vycm9yKHN0cnVjdCBzb2FwKik7CisjaWZuZGVmIFdJVEhfSVBWNgorc3RhdGljIGludCB0Y3BfZ2V0aG9zdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKmFkZHIsIHN0cnVjdCBpbl9hZGRyICppbmFkZHIpOworI2VuZGlmCitzdGF0aWMgaW50IHRjcF9jb25uZWN0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqZW5kcG9pbnQsIGNvbnN0IGNoYXIgKmhvc3QsIGludCBwb3J0KTsKK3N0YXRpYyBpbnQgdGNwX2FjY2VwdChzdHJ1Y3Qgc29hcCosIGludCwgc3RydWN0IHNvY2thZGRyKiwgaW50Kik7CitzdGF0aWMgaW50IHRjcF9kaXNjb25uZWN0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgaW50IHRjcF9jbG9zZXNvY2tldChzdHJ1Y3Qgc29hcCosIFNPQVBfU09DS0VUKTsKK3N0YXRpYyBpbnQgdGNwX3NodXRkb3duc29ja2V0KHN0cnVjdCBzb2FwKiwgU09BUF9TT0NLRVQsIGludCk7CitzdGF0aWMgY29uc3QgY2hhciAqc29hcF9zdHJlcnJvcihzdHJ1Y3Qgc29hcCopOworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoUEFMTSkgJiYgIWRlZmluZWQoUEFMTV8yKQordW5zaWduZWQgc2hvcnQgZXJybm87CisjZW5kaWYKKworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfZW52MVs0Ml0gPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iOworc3RhdGljIGNvbnN0IGNoYXIgc29hcF9lbmMxWzQyXSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI7CitzdGF0aWMgY29uc3QgY2hhciBzb2FwX2VudjJbNDBdID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI7CitzdGF0aWMgY29uc3QgY2hhciBzb2FwX2VuYzJbNDBdID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbmNvZGluZyI7CitzdGF0aWMgY29uc3QgY2hhciBzb2FwX3JwY1szNV0gPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLXJwYyI7CisjZW5kaWYKKworI2lmbmRlZiBQQUxNXzEKK2NvbnN0IHN0cnVjdCBzb2FwX2RvdWJsZV9uYW4gc29hcF9kb3VibGVfbmFuID0gezB4RkZGRkZGRkYsIDB4RkZGRkZGRkZ9Oworc3RhdGljIGNvbnN0IGNoYXIgc29hcF9iYXNlNjRvWzY1XSA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfYmFzZTY0aVs4MV0gPSAiXDc2WFhYXDc3XDY0XDY1XDY2XDY3XDcwXDcxXDcyXDczXDc0XDc1WFhYWFhYWFwwMFwwMVwwMlwwM1wwNFwwNVwwNlwwN1wxMFwxMVwxMlwxM1wxNFwxNVwxNlwxN1wyMFwyMVwyMlwyM1wyNFwyNVwyNlwyN1wzMFwzMVhYWFhYWFwzMlwzM1wzNFwzNVwzNlwzN1w0MFw0MVw0Mlw0M1w0NFw0NVw0Nlw0N1w1MFw1MVw1Mlw1M1w1NFw1NVw1Nlw1N1w2MFw2MVw2Mlw2MyI7CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfaW5kZW50WzExXSA9ICJcblx0XHRcdFx0XHRcdFx0XHRcdCI7CisvKiBBbHRlcm5hdGl2ZSBpbmRlbnRhdGlvbiBmb3JtIGZvciBTT0FQX1hNTF9JTkRFTlQ6CitzdGF0aWMgY29uc3QgY2hhciBzb2FwX2luZGVudFsyMV0gPSAiXG4gICAgICAgICAgICAgICAgICAgIjsKKyovCisjZW5kaWYKKworc3RhdGljIGNvbnN0IGNoYXIgc29hcF9wYWRkaW5nWzRdID0gIlwwXDBcMCI7CisjZGVmaW5lIFNPQVBfU1RSX1BBRERJTkcgKHNvYXBfcGFkZGluZykKKyNkZWZpbmUgU09BUF9TVFJfRU9TIChzb2FwX3BhZGRpbmcpCisjZGVmaW5lIFNPQVBfTk9OX05VTEwgKHNvYXBfcGFkZGluZykKKworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCBodG1sX2VudGl0eV9jb2Rlc1tdID0gLyogZW50aXRpZXMgZm9yIFhIVE1MIHBhcnNpbmcgKi8KK3sgeyAxNjAsICJuYnNwIiB9LAorICB7IDE2MSwgImlleGNsIiB9LAorICB7IDE2MiwgImNlbnQiIH0sCisgIHsgMTYzLCAicG91bmQiIH0sCisgIHsgMTY0LCAiY3VycmVuIiB9LAorICB7IDE2NSwgInllbiIgfSwKKyAgeyAxNjYsICJicnZiYXIiIH0sCisgIHsgMTY3LCAic2VjdCIgfSwKKyAgeyAxNjgsICJ1bWwiIH0sCisgIHsgMTY5LCAiY29weSIgfSwKKyAgeyAxNzAsICJvcmRmIiB9LAorICB7IDE3MSwgImxhcXVvIiB9LAorICB7IDE3MiwgIm5vdCIgfSwKKyAgeyAxNzMsICJzaHkiIH0sCisgIHsgMTc0LCAicmVnIiB9LAorICB7IDE3NSwgIm1hY3IiIH0sCisgIHsgMTc2LCAiZGVnIiB9LAorICB7IDE3NywgInBsdXNtbiIgfSwKKyAgeyAxNzgsICJzdXAyIiB9LAorICB7IDE3OSwgInN1cDMiIH0sCisgIHsgMTgwLCAiYWN1dGUiIH0sCisgIHsgMTgxLCAibWljcm8iIH0sCisgIHsgMTgyLCAicGFyYSIgfSwKKyAgeyAxODMsICJtaWRkb3QiIH0sCisgIHsgMTg0LCAiY2VkaWwiIH0sCisgIHsgMTg1LCAic3VwMSIgfSwKKyAgeyAxODYsICJvcmRtIiB9LAorICB7IDE4NywgInJhcXVvIiB9LAorICB7IDE4OCwgImZyYWMxNCIgfSwKKyAgeyAxODksICJmcmFjMTIiIH0sCisgIHsgMTkwLCAiZnJhYzM0IiB9LAorICB7IDE5MSwgImlxdWVzdCIgfSwKKyAgeyAxOTIsICJBZ3JhdmUiIH0sCisgIHsgMTkzLCAiQWFjdXRlIiB9LAorICB7IDE5NCwgIkFjaXJjIiB9LAorICB7IDE5NSwgIkF0aWxkZSIgfSwKKyAgeyAxOTYsICJBdW1sIiB9LAorICB7IDE5NywgIkFyaW5nIiB9LAorICB7IDE5OCwgIkFFbGlnIiB9LAorICB7IDE5OSwgIkNjZWRpbCIgfSwKKyAgeyAyMDAsICJFZ3JhdmUiIH0sCisgIHsgMjAxLCAiRWFjdXRlIiB9LAorICB7IDIwMiwgIkVjaXJjIiB9LAorICB7IDIwMywgIkV1bWwiIH0sCisgIHsgMjA0LCAiSWdyYXZlIiB9LAorICB7IDIwNSwgIklhY3V0ZSIgfSwKKyAgeyAyMDYsICJJY2lyYyIgfSwKKyAgeyAyMDcsICJJdW1sIiB9LAorICB7IDIwOCwgIkVUSCIgfSwKKyAgeyAyMDksICJOdGlsZGUiIH0sCisgIHsgMjEwLCAiT2dyYXZlIiB9LAorICB7IDIxMSwgIk9hY3V0ZSIgfSwKKyAgeyAyMTIsICJPY2lyYyIgfSwKKyAgeyAyMTMsICJPdGlsZGUiIH0sCisgIHsgMjE0LCAiT3VtbCIgfSwKKyAgeyAyMTUsICJ0aW1lcyIgfSwKKyAgeyAyMTYsICJPc2xhc2giIH0sCisgIHsgMjE3LCAiVWdyYXZlIiB9LAorICB7IDIxOCwgIlVhY3V0ZSIgfSwKKyAgeyAyMTksICJVY2lyYyIgfSwKKyAgeyAyMjAsICJVdW1sIiB9LAorICB7IDIyMSwgIllhY3V0ZSIgfSwKKyAgeyAyMjIsICJUSE9STiIgfSwKKyAgeyAyMjMsICJzemxpZyIgfSwKKyAgeyAyMjQsICJhZ3JhdmUiIH0sCisgIHsgMjI1LCAiYWFjdXRlIiB9LAorICB7IDIyNiwgImFjaXJjIiB9LAorICB7IDIyNywgImF0aWxkZSIgfSwKKyAgeyAyMjgsICJhdW1sIiB9LAorICB7IDIyOSwgImFyaW5nIiB9LAorICB7IDIzMCwgImFlbGlnIiB9LAorICB7IDIzMSwgImNjZWRpbCIgfSwKKyAgeyAyMzIsICJlZ3JhdmUiIH0sCisgIHsgMjMzLCAiZWFjdXRlIiB9LAorICB7IDIzNCwgImVjaXJjIiB9LAorICB7IDIzNSwgImV1bWwiIH0sCisgIHsgMjM2LCAiaWdyYXZlIiB9LAorICB7IDIzNywgImlhY3V0ZSIgfSwKKyAgeyAyMzgsICJpY2lyYyIgfSwKKyAgeyAyMzksICJpdW1sIiB9LAorICB7IDI0MCwgImV0aCIgfSwKKyAgeyAyNDEsICJudGlsZGUiIH0sCisgIHsgMjQyLCAib2dyYXZlIiB9LAorICB7IDI0MywgIm9hY3V0ZSIgfSwKKyAgeyAyNDQsICJvY2lyYyIgfSwKKyAgeyAyNDUsICJvdGlsZGUiIH0sCisgIHsgMjQ2LCAib3VtbCIgfSwKKyAgeyAyNDcsICJkaXZpZGUiIH0sCisgIHsgMjQ4LCAib3NsYXNoIiB9LAorICB7IDI0OSwgInVncmF2ZSIgfSwKKyAgeyAyNTAsICJ1YWN1dGUiIH0sCisgIHsgMjUxLCAidWNpcmMiIH0sCisgIHsgMjUyLCAidXVtbCIgfSwKKyAgeyAyNTMsICJ5YWN1dGUiIH0sCisgIHsgMjU0LCAidGhvcm4iIH0sCisgIHsgMjU1LCAieXVtbCIgfSwKKyAgeyAgIDAsIE5VTEwgfQorfTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCBoX2Vycm9yX2NvZGVzW10gPQoreworI2lmZGVmIEhPU1RfTk9UX0ZPVU5EICAgCisgIHsgSE9TVF9OT1RfRk9VTkQsICJIb3N0IG5vdCBmb3VuZCIgfSwKKyNlbmRpZgorI2lmZGVmIFRSWV9BR0FJTgorICB7IFRSWV9BR0FJTiwgIlRyeSBBZ2FpbiIgfSwKKyNlbmRpZgorI2lmZGVmIE5PX1JFQ09WRVJZICAKKyAgeyBOT19SRUNPVkVSWSwgIk5vIFJlY292ZXJ5IiB9LAorI2VuZGlmCisjaWZkZWYgTk9fREFUQQorICB7IE5PX0RBVEEsICJObyBEYXRhIiB9LAorI2VuZGlmCisjaWZkZWYgTk9fQUREUkVTUworICB7IE5PX0FERFJFU1MsICJObyBBZGRyZXNzIiB9LAorI2VuZGlmCisgIHsgMCwgTlVMTCB9Cit9OworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCBoX2h0dHBfZXJyb3JfY29kZXNbXSA9Cit7IHsgMjAxLCAiQ3JlYXRlZCIgfSwKKyAgeyAyMDIsICJBY2NlcHRlZCIgfSwKKyAgeyAyMDMsICJOb24tQXV0aG9yaXRhdGl2ZSBJbmZvcm1hdGlvbiIgfSwKKyAgeyAyMDQsICJObyBDb250ZW50IiB9LAorICB7IDIwNSwgIlJlc2V0IENvbnRlbnQiIH0sCisgIHsgMjA2LCAiUGFydGlhbCBDb250ZW50IiB9LAorICB7IDMwMCwgIk11bHRpcGxlIENob2ljZXMiIH0sCisgIHsgMzAxLCAiTW92ZWQgUGVybWFuZW50bHkiIH0sCisgIHsgMzAyLCAiRm91bmQiIH0sCisgIHsgMzAzLCAiU2VlIE90aGVyIiB9LAorICB7IDMwNCwgIk5vdCBNb2RpZmllZCIgfSwKKyAgeyAzMDUsICJVc2UgUHJveHkiIH0sCisgIHsgMzA3LCAiVGVtcG9yYXJ5IFJlZGlyZWN0IiB9LAorICB7IDQwMCwgIkJhZCBSZXF1ZXN0IiB9LAorICB7IDQwMSwgIlVuYXV0aG9yaXplZCIgfSwKKyAgeyA0MDIsICJQYXltZW50IFJlcXVpcmVkIiB9LAorICB7IDQwMywgIkZvcmJpZGRlbiIgfSwKKyAgeyA0MDQsICJOb3QgRm91bmQiIH0sCisgIHsgNDA1LCAiTWV0aG9kIE5vdCBBbGxvd2VkIiB9LAorICB7IDQwNiwgIk5vdCBBY2NlcHRhYmxlIiB9LAorICB7IDQwNywgIlByb3h5IEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkIiB9LAorICB7IDQwOCwgIlJlcXVlc3QgVGltZS1vdXQiIH0sCisgIHsgNDA5LCAiQ29uZmxpY3QiIH0sCisgIHsgNDEwLCAiR29uZSIgfSwKKyAgeyA0MTEsICJMZW5ndGggUmVxdWlyZWQiIH0sCisgIHsgNDEyLCAiUHJlY29uZGl0aW9uIEZhaWxlZCIgfSwKKyAgeyA0MTMsICJSZXF1ZXN0IEVudGl0eSBUb28gTGFyZ2UiIH0sCisgIHsgNDE0LCAiUmVxdWVzdC1VUkkgVG9vIExhcmdlIiB9LAorICB7IDQxNSwgIlVuc3VwcG9ydGVkIE1lZGlhIFR5cGUiIH0sCisgIHsgNDE2LCAiUmVxdWVzdGVkIHJhbmdlIG5vdCBzYXRpc2ZpYWJsZSIgfSwKKyAgeyA0MTcsICJFeHBlY3RhdGlvbiBGYWlsZWQiIH0sCisgIHsgNTAwLCAiSW50ZXJuYWwgU2VydmVyIEVycm9yIiB9LAorICB7IDUwMSwgIk5vdCBJbXBsZW1lbnRlZCIgfSwKKyAgeyA1MDIsICJCYWQgR2F0ZXdheSIgfSwKKyAgeyA1MDMsICJTZXJ2aWNlIFVuYXZhaWxhYmxlIiB9LAorICB7IDUwNCwgIkdhdGV3YXkgVGltZS1vdXQiIH0sCisgIHsgNTA1LCAiSFRUUCBWZXJzaW9uIG5vdCBzdXBwb3J0ZWQiIH0sCisgIHsgICAwLCBOVUxMIH0KK307CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgV0lUSF9PUEVOU1NMCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgaF9zc2xfZXJyb3JfY29kZXNbXSA9Cit7CisjZGVmaW5lIF9TU0xfRVJST1IoZSkgeyBlLCAjZSB9CisgIF9TU0xfRVJST1IoU1NMX0VSUk9SX1NTTCksCisgIF9TU0xfRVJST1IoU1NMX0VSUk9SX1pFUk9fUkVUVVJOKSwKKyAgX1NTTF9FUlJPUihTU0xfRVJST1JfV0FOVF9SRUFEKSwKKyAgX1NTTF9FUlJPUihTU0xfRVJST1JfV0FOVF9XUklURSksCisgIF9TU0xfRVJST1IoU1NMX0VSUk9SX1dBTlRfQ09OTkVDVCksCisgIF9TU0xfRVJST1IoU1NMX0VSUk9SX1dBTlRfWDUwOV9MT09LVVApLAorICBfU1NMX0VSUk9SKFNTTF9FUlJPUl9TWVNDQUxMKSwKKyAgeyAwLCBOVUxMIH0KK307CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU5FUgorc3RhdGljIGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwIG1pbWVfY29kZXNbXSA9Cit7IHsgU09BUF9NSU1FXzdCSVQsCQkiN2JpdCIgfSwKKyAgeyBTT0FQX01JTUVfOEJJVCwJCSI4Yml0IiB9LAorICB7IFNPQVBfTUlNRV9CSU5BUlksCQkiYmluYXJ5IiB9LAorICB7IFNPQVBfTUlNRV9RVU9URURfUFJJTlRBQkxFLCAicXVvdGVkLXByaW50YWJsZSIgfSwKKyAgeyBTT0FQX01JTUVfQkFTRTY0LAkJImJhc2U2NCIgfSwKKyAgeyBTT0FQX01JTUVfSUVURl9UT0tFTiwJImlldGYtdG9rZW4iIH0sCisgIHsgU09BUF9NSU1FX1hfVE9LRU4sCQkieC10b2tlbiIgfSwKKyAgeyAwLAkJCQlOVUxMIH0KK307CisjZW5kaWYKKworI2lmZGVmIFdJTjMyCitzdGF0aWMgaW50IHRjcF9kb25lID0gMDsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citmc2VuZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgc2l6ZV90IG4pCit7IHJlZ2lzdGVyIGludCBud3JpdHRlbjsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiAhZGVmaW5lZChXSVRIX0xFQU4pCisgIGlmIChzb2FwLT5vcykKKyAgeyBzb2FwLT5vcy0+d3JpdGUocywgbik7CisgICAgaWYgKHNvYXAtPm9zLT5nb29kKCkpCisgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICByZXR1cm4gU09BUF9FT0Y7CisgIH0KKyNlbmRpZgorICB3aGlsZSAobikKKyAgeyBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgICB7IAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIGlmIChzb2FwLT5zZW5kX3RpbWVvdXQpCisgICAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICAgIGZkX3NldCBmZDsKKyAgICAgICAgaWYgKHNvYXAtPnNlbmRfdGltZW91dCA+IDApCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSBzb2FwLT5zZW5kX3RpbWVvdXQ7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSAtc29hcC0+c2VuZF90aW1lb3V0LzEwMDAwMDA7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gLXNvYXAtPnNlbmRfdGltZW91dCUxMDAwMDAwOworICAgICAgICB9CisgICAgICAgIEZEX1pFUk8oJmZkKTsKKyAgICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZmZCk7CisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsgcmVnaXN0ZXIgaW50IHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgTlVMTCwgJmZkLCAmZmQsICZ0aW1lb3V0KTsKKyAgICAgICAgICBpZiAociA+IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBpZiAoIXIpCisgICAgICAgICAgeyBzb2FwLT5lcnJudW0gPSAwOworICAgICAgICAgICAgcmV0dXJuIFNPQVBfRU9GOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUiAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VBR0FJTikKKyAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgICAgcmV0dXJuIFNPQVBfRU9GOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisjaWZkZWYgV0lUSF9PUEVOU1NMCisgICAgICBpZiAoc29hcC0+c3NsKQorICAgICAgICBud3JpdHRlbiA9IFNTTF93cml0ZShzb2FwLT5zc2wsIHMsIG4pOworICAgICAgZWxzZSBpZiAoc29hcC0+YmlvKQorICAgICAgICBud3JpdHRlbiA9IEJJT193cml0ZShzb2FwLT5iaW8sIHMsIG4pOworICAgICAgZWxzZQorI2VuZGlmCisjaWZkZWYgV0lUSF9VRFAKKyAgICAgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgICB7IGlmIChzb2FwLT5wZWVybGVuKQorCSAgbndyaXR0ZW4gPSBzZW5kdG8oKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgcywgbiwgc29hcC0+c29ja2V0X2ZsYWdzLCAoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlciwgc29hcC0+cGVlcmxlbik7CisgICAgICAgIGVsc2UKKwkgIG53cml0dGVuID0gc2VuZCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MpOworCS8qIHJldHJ5IGFuZCBiYWNrLW9mZiBhbGdvcml0aG0gKi8KKwkvKiBUT0RPOiB0aGlzIGlzIG5vdCB2ZXJ5IGNsZWFyIGZyb20gc3BlY3Mgc28gdmVyaWZ5IGFuZCBsaW1pdCBjb25kaXRpb25zIHVuZGVyIHdoaWNoIHdlIHNob3VsZCBsb29wIChlLmcuIEVOT0JVRlMpICovCisJaWYgKG53cml0dGVuIDwgMCkKKyAgICAgICAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgICAgICAgIGZkX3NldCBmZDsKKwkgIGludCB1ZHBfcmVwZWF0OworCSAgaW50IHVkcF9kZWxheTsKKyAgICAgICAgICBpZiAoKHNvYXAtPmNvbm5lY3RfZmxhZ3MgJiBTT19CUk9BRENBU1QpKQorCSAgICB1ZHBfcmVwZWF0ID0gMzsgLyogU09BUC1vdmVyLVVEUCBNVUxUSUNBU1RfVURQX1JFUEVBVCAtIDEgKi8KKyAgICAgICAgICBlbHNlCisJICAgIHVkcF9yZXBlYXQgPSAxOyAvKiBTT0FQLW92ZXItVURQIFVOSUNBU1RfVURQX1JFUEVBVCAtIDEgKi8KKwkgIHVkcF9kZWxheSA9IChzb2FwX3JhbmRvbSAlIDIwMSkgKyA1MDsgLyogVURQX01JTl9ERUxBWSAuLiBVRFBfTUFYX0RFTEFZICovCisJICBkbworICAgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSAwOworICAgICAgICAgICAgdGltZW91dC50dl91c2VjID0gMTAwMCAqIHVkcF9kZWxheTsgLyogbXMgKi8KKyAgICAgICAgICAgIEZEX1pFUk8oJmZkKTsKKyAgICAgICAgICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmZmQpOworICAgICAgICAgICAgc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksIE5VTEwsIE5VTEwsICZmZCwgJnRpbWVvdXQpOworCSAgICBpZiAoc29hcC0+cGVlcmxlbikKKwkgICAgICBud3JpdHRlbiA9IHNlbmR0bygoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyLCBzb2FwLT5wZWVybGVuKTsKKyAgICAgICAgICAgIGVsc2UKKwkgICAgICBud3JpdHRlbiA9IHNlbmQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgcywgbiwgc29hcC0+c29ja2V0X2ZsYWdzKTsKKwkgICAgdWRwX2RlbGF5IDw8PSAxOworCSAgICBpZiAodWRwX2RlbGF5ID4gNTAwKSAvKiBVRFBfVVBQRVJfREVMQVkgKi8KKwkgICAgICB1ZHBfZGVsYXkgPSA1MDA7CisJICB9CisJICB3aGlsZSAobndyaXR0ZW4gPCAwICYmIC0tdWRwX3JlcGVhdCA+IDApOworCX0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyNlbmRpZgorI2lmICFkZWZpbmVkKFBBTE0pICYmICFkZWZpbmVkKEFTNDAwKQorICAgICAgICBud3JpdHRlbiA9IHNlbmQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgcywgbiwgc29hcC0+c29ja2V0X2ZsYWdzKTsKKyNlbHNlCisgICAgICAgIG53cml0dGVuID0gc2VuZCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAodm9pZCopcywgbiwgc29hcC0+c29ja2V0X2ZsYWdzKTsKKyNlbmRpZgorICAgICAgaWYgKG53cml0dGVuIDw9IDApCisgICAgICB7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisJaW50IGVycjsKKyAgICAgICAgaWYgKHNvYXAtPnNzbCAmJiAoZXJyID0gU1NMX2dldF9lcnJvcihzb2FwLT5zc2wsIG53cml0dGVuKSkgIT0gU1NMX0VSUk9SX05PTkUgJiYgZXJyICE9IFNTTF9FUlJPUl9XQU5UX1JFQUQgJiYgZXJyICE9IFNTTF9FUlJPUl9XQU5UX1dSSVRFKQorICAgICAgICAgIHJldHVybiBTT0FQX0VPRjsKKyNlbmRpZgorICAgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUiAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VXT1VMREJMT0NLICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUFHQUlOKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgIHJldHVybiBTT0FQX0VPRjsKKyAgICAgICAgfQorICAgICAgICBud3JpdHRlbiA9IDA7IC8qIGFuZCBjYWxsIHdyaXRlKCkgYWdhaW4gKi8KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyNpZmRlZiBXSVRIX0ZBU1RDR0kKKyAgICAgIG53cml0dGVuID0gZndyaXRlKCh2b2lkKilzLCAxLCBuLCBzdGRvdXQpOworICAgICAgZmZsdXNoKHN0ZG91dCk7CisjZWxzZQorI2lmZGVmIFVOREVSX0NFCisgICAgICBud3JpdHRlbiA9IGZ3cml0ZShzLCAxLCBuLCBzb2FwLT5zZW5kZmQpOworI2Vsc2UKKyNpZmRlZiBWWFdPUktTCisjaWZkZWYgV01XX1JQTV9JTworICAgICAgaWYgKHNvYXAtPnJwbXJlcWlkKQorICAgICAgICBud3JpdHRlbiA9IChodHRwQmxvY2tQdXQoc29hcC0+cnBtcmVxaWQsIHMsIG4pID09IDApID8gbiA6IC0xOyAKKyAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICBud3JpdHRlbiA9IGZ3cml0ZShzLCBzaXplb2YoY2hhciksIG4sIGZkb3Blbihzb2FwLT5zZW5kZmQsICJ3IikpOworI2Vsc2UKKyAgICAgIG53cml0dGVuID0gd3JpdGUoKFNPQVBfU09DS0VUKXNvYXAtPnNlbmRmZCwgcywgbik7CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisgICAgICBpZiAobndyaXR0ZW4gPD0gMCkKKyAgICAgIHsgaWYgKHNvYXBfZXJybm8gIT0gU09BUF9FSU5UUiAmJiBzb2FwX2Vycm5vICE9IFNPQVBfRVdPVUxEQkxPQ0sgJiYgc29hcF9lcnJubyAhPSBTT0FQX0VBR0FJTikKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX2Vycm5vOworICAgICAgICAgIHJldHVybiBTT0FQX0VPRjsKKyAgICAgICAgfQorICAgICAgICBud3JpdHRlbiA9IDA7IC8qIGFuZCBjYWxsIHdyaXRlKCkgYWdhaW4gKi8KKyAgICAgIH0KKyAgICB9CisgICAgbiAtPSBud3JpdHRlbjsKKyAgICBzICs9IG53cml0dGVuOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2VuZF9yYXcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBuKQoreyBpZiAoIW4pCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgIHsgc29hcC0+Y291bnQgKz0gbjsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgICBpZiAoc29hcC0+ZnByZXBhcmVzZW5kICYmIChzb2FwLT5tb2RlICYgU09BUF9JTykgIT0gU09BUF9JT19TVE9SRSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IHNvYXAtPmZwcmVwYXJlc2VuZChzb2FwLCBzLCBuKTsKKyNlbmRpZgorICAgIHJldHVybiBTT0FQX09LOworICB9CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JTykKKyAgeyByZWdpc3RlciBzaXplX3QgaSA9IFNPQVBfQlVGTEVOIC0gc29hcC0+YnVmaWR4OworICAgIHdoaWxlIChuID49IGkpCisgICAgeyBtZW1jcHkoc29hcC0+YnVmICsgc29hcC0+YnVmaWR4LCBzLCBpKTsKKyAgICAgIHNvYXAtPmJ1ZmlkeCA9IFNPQVBfQlVGTEVOOworICAgICAgaWYgKHNvYXBfZmx1c2goc29hcCkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHMgKz0gaTsKKyAgICAgIG4gLT0gaTsKKyAgICAgIGkgPSBTT0FQX0JVRkxFTjsKKyAgICB9CisgICAgbWVtY3B5KHNvYXAtPmJ1ZiArIHNvYXAtPmJ1ZmlkeCwgcywgbik7CisgICAgc29hcC0+YnVmaWR4ICs9IG47CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgcmV0dXJuIHNvYXBfZmx1c2hfcmF3KHNvYXAsIHMsIG4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2ZsdXNoKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgbiA9IHNvYXAtPmJ1ZmlkeDsKKyAgaWYgKG4pCisgIHsgc29hcC0+YnVmaWR4ID0gMDsKKyNpZmRlZiBXSVRIX1pMSUIKKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIpCisgICAgeyBzb2FwLT5kX3N0cmVhbS5uZXh0X2luID0gKEJ5dGUqKXNvYXAtPmJ1ZjsKKyAgICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luID0gKHVuc2lnbmVkIGludCluOworI2lmZGVmIFdJVEhfR1pJUAorICAgICAgc29hcC0+el9jcmMgPSBjcmMzMihzb2FwLT56X2NyYywgKEJ5dGUqKXNvYXAtPmJ1ZiwgKHVuc2lnbmVkIGludCluKTsKKyNlbmRpZgorICAgICAgZG8KKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJEZWZsYXRpbmcgJXUgYnl0ZXNcbiIsIHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luKSk7CisgICAgICAgIGlmIChkZWZsYXRlKCZzb2FwLT5kX3N0cmVhbSwgWl9OT19GTFVTSCkgIT0gWl9PSykKKyAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVuYWJsZSB0byBkZWZsYXRlOiAlc1xuIiwgc29hcC0+ZF9zdHJlYW0ubXNnP3NvYXAtPmRfc3RyZWFtLm1zZzoiIikpOworICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCkKKyAgICAgICAgeyBpZiAoc29hcF9mbHVzaF9yYXcoc29hcCwgc29hcC0+el9idWYsIFNPQVBfQlVGTEVOKSkKKyAgICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IChCeXRlKilzb2FwLT56X2J1ZjsKKyAgICAgICAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgPSBTT0FQX0JVRkxFTjsKKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAoc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4pOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICAgIHJldHVybiBzb2FwX2ZsdXNoX3Jhdyhzb2FwLCBzb2FwLT5idWYsIG4pOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2ZsdXNoX3JhdyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgc2l6ZV90IG4pCit7IGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fU1RPUkUpCisgIHsgcmVnaXN0ZXIgY2hhciAqdDsKKyAgICBpZiAoISh0ID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBuKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICBtZW1jcHkodCwgcywgbik7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgICAgaWYgKHNvYXAtPmZwcmVwYXJlc2VuZCkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IHNvYXAtPmZwcmVwYXJlc2VuZChzb2FwLCBzLCBuKTsKKyNlbmRpZgorICAgIHJldHVybiBTT0FQX09LOworICB9CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgIHsgY2hhciB0WzE2XTsKKyAgICBzcHJpbnRmKHQsICJcclxuJWxYXHJcbiIgKyAoc29hcC0+Y2h1bmtzaXplID8gMCA6IDIpLCAodW5zaWduZWQgbG9uZyluKTsKKyAgICBEQkdNU0coU0VOVCwgdCwgc3RybGVuKHQpKTsKKyAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnNlbmQoc29hcCwgdCwgc3RybGVuKHQpKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgc29hcC0+Y2h1bmtzaXplICs9IG47CisgIH0KKyAgREJHTVNHKFNFTlQsIHMsIG4pOworI2VuZGlmCisgIHJldHVybiBzb2FwLT5lcnJvciA9IHNvYXAtPmZzZW5kKHNvYXAsIHMsIG4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMpCit7IGlmIChzKQorICAgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHN0cmxlbihzKSk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmQyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpCit7IGlmIChzb2FwX3NlbmQoc29hcCwgczEpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfc2VuZChzb2FwLCBzMik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZW5kMyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBjb25zdCBjaGFyICpzMykKK3sgaWYgKHNvYXBfc2VuZChzb2FwLCBzMSkKKyAgIHx8IHNvYXBfc2VuZChzb2FwLCBzMikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9zZW5kKHNvYXAsIHMzKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzaXplX3QKK2ZyZWN2KHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpzLCBzaXplX3QgbikKK3sgcmVnaXN0ZXIgaW50IHI7CisgIHNvYXAtPmVycm51bSA9IDA7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgIWRlZmluZWQoV0lUSF9MRUFOKQorICBpZiAoc29hcC0+aXMpCisgIHsgaWYgKHNvYXAtPmlzLT5nb29kKCkpCisgICAgICByZXR1cm4gc29hcC0+aXMtPnJlYWQocywgbikuZ2NvdW50KCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyNlbmRpZgorICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgeyBmb3IgKDs7KQorICAgIHsgCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgaWYgKHNvYXAtPnJlY3ZfdGltZW91dCkKKyAgICAgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgICAgZmRfc2V0IGZkOworICAgICAgICBpZiAoc29hcC0+cmVjdl90aW1lb3V0ID4gMCkKKyAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IHNvYXAtPnJlY3ZfdGltZW91dDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IC1zb2FwLT5yZWN2X3RpbWVvdXQvMTAwMDAwMDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAtc29hcC0+cmVjdl90aW1lb3V0JTEwMDAwMDA7CisgICAgICAgIH0KKyAgICAgICAgRkRfWkVSTygmZmQpOworICAgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJmZkKTsKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeyByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksICZmZCwgTlVMTCwgJmZkLCAmdGltZW91dCk7CisgICAgICAgICAgaWYgKHIgPiAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgaWYgKCFyKQorCSAgeyBzb2FwLT5lcnJudW0gPSAwOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUFHQUlOKQorCSAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisjaWZkZWYgV0lUSF9PUEVOU1NMCisgICAgICBpZiAoc29hcC0+c3NsKQorICAgICAgeyBpbnQgZXJyOworCXIgPSBTU0xfcmVhZChzb2FwLT5zc2wsIHMsIG4pOworICAgICAgICBpZiAociA+IDApCisgICAgICAgICAgcmV0dXJuIChzaXplX3QpcjsKKwllcnIgPSBTU0xfZ2V0X2Vycm9yKHNvYXAtPnNzbCwgcik7CisJaWYgKGVyciAhPSBTU0xfRVJST1JfTk9ORSAmJiBlcnIgIT0gU1NMX0VSUk9SX1dBTlRfUkVBRCAmJiBlcnIgIT0gU1NMX0VSUk9SX1dBTlRfV1JJVEUpCisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBlbHNlIGlmIChzb2FwLT5iaW8pCisgICAgICB7IHIgPSBCSU9fcmVhZChzb2FwLT5iaW8sIHMsIG4pOworICAgICAgICBpZiAociA+IDApCisgICAgICAgICAgcmV0dXJuIChzaXplX3QpcjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBlbHNlCisjZW5kaWYKKyAgICAgIHsgCisjaWZkZWYgV0lUSF9VRFAKKyAgICAgICAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICAgICAgeyBTT0FQX1NPQ0tMRU5fVCBrID0gKFNPQVBfU09DS0xFTl9UKXNpemVvZihzb2FwLT5wZWVyKTsKKwkgIG1lbXNldCgodm9pZCopJnNvYXAtPnBlZXIsIDAsIHNpemVvZihzb2FwLT5wZWVyKSk7CisgICAgICAgICAgciA9IHJlY3Zmcm9tKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHMsIG4sIHNvYXAtPnNvY2tldF9mbGFncywgKHN0cnVjdCBzb2NrYWRkciopJnNvYXAtPnBlZXIsICZrKTsJLyogcG9ydGFiaWxpdHkgbm90ZTogc2VlIFNPQVBfU09DS0xFTl9UIGRlZmluaXRpb24gaW4gc3Rkc29hcDIuaCAqLworCSAgc29hcC0+cGVlcmxlbiA9IChzaXplX3QpazsKKyNpZm5kZWYgV0lUSF9JUFY2CisgICAgICAgICAgc29hcC0+aXAgPSBudG9obChzb2FwLT5wZWVyLnNpbl9hZGRyLnNfYWRkcik7CisgICAgICAgICAgc29hcC0+cG9ydCA9IChpbnQpbnRvaHMoc29hcC0+cGVlci5zaW5fcG9ydCk7CisjZW5kaWYKKyAgICAgICAgfQorCWVsc2UKKyNlbmRpZgorICAgICAgICAgIHIgPSByZWN2KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHMsIG4sIHNvYXAtPnNvY2tldF9mbGFncyk7CisgICAgICAgIGlmIChyID49IDApCisgICAgICAgICAgcmV0dXJuIChzaXplX3QpcjsKKyAgICAgICAgaWYgKHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FQUdBSU4gJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FV09VTERCTE9DSykKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgfQorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgICAgZmRfc2V0IGZkOworICAgICAgICB0aW1lb3V0LnR2X3NlYyA9IDA7CisgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDEwMDAwOworICAgICAgICBGRF9aRVJPKCZmZCk7CisgICAgICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmZmQpOworI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgICAgICBpZiAoc29hcC0+c3NsICYmIFNTTF9nZXRfZXJyb3Ioc29hcC0+c3NsLCByKSA9PSBTU0xfRVJST1JfV0FOVF9XUklURSkKKyAgICAgICAgICByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksIE5VTEwsICZmZCwgJmZkLCAmdGltZW91dCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksICZmZCwgTlVMTCwgJmZkLCAmdGltZW91dCk7CisjZWxzZQorICAgICAgICByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksICZmZCwgTlVMTCwgJmZkLCAmdGltZW91dCk7CisjZW5kaWYKKyAgICAgICAgaWYgKHIgPCAwICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIpCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgfQorI2lmZGVmIFdJVEhfRkFTVENHSQorICByZXR1cm4gZnJlYWQocywgMSwgbiwgc3RkaW4pOworI2Vsc2UKKyNpZmRlZiBVTkRFUl9DRQorICByZXR1cm4gZnJlYWQocywgMSwgbiwgc29hcC0+cmVjdmZkKTsKKyNlbHNlCisjaWZkZWYgV01XX1JQTV9JTworICBpZiAoc29hcC0+cnBtcmVxaWQpCisgICAgciA9IGh0dHBCbG9ja1JlYWQoc29hcC0+cnBtcmVxaWQsIHMsIG4pOworICBlbHNlCisjZW5kaWYKKyAgciA9IHJlYWQoKFNPQVBfU09DS0VUKXNvYXAtPnJlY3ZmZCwgcywgbik7CisgIGlmIChyID49IDApCisgICAgcmV0dXJuIChzaXplX3QpcjsKKyAgc29hcC0+ZXJybnVtID0gc29hcF9lcnJubzsKKyAgcmV0dXJuIDA7CisjZW5kaWYKKyNlbmRpZgorfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc29hcF93Y2hhcgorc29hcF9nZXRjaHVua2NoYXIoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwLT5idWZpZHggPCBzb2FwLT5idWZsZW4pCisgICAgcmV0dXJuIHNvYXAtPmJ1Zltzb2FwLT5idWZpZHgrK107CisgIHNvYXAtPmJ1ZmlkeCA9IDA7CisgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmNodW5rYnVmbGVuID0gc29hcC0+ZnJlY3Yoc29hcCwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTik7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVhZCAldSBieXRlcyBmcm9tIHNvY2tldCAlZFxuIiwgKHVuc2lnbmVkIGludClzb2FwLT5idWZsZW4sIHNvYXAtPnNvY2tldCkpOworICBEQkdNU0coUkVDViwgc29hcC0+YnVmLCBzb2FwLT5idWZsZW4pOworICBpZiAoc29hcC0+YnVmbGVuKQorICAgIHJldHVybiBzb2FwLT5idWZbc29hcC0+YnVmaWR4KytdOworICByZXR1cm4gRU9GOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzb2FwX2lzeGRpZ2l0KGludCBjKQoreyByZXR1cm4gKGMgPj0gJzAnICYmIGMgPD0gJzknKSB8fCAoYyA+PSAnQScgJiYgYyA8PSAnRicpIHx8IChjID49ICdhJyAmJiBjIDw9ICdmJyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVjdl9yYXcoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNpemVfdCByZXQ7CisjaWZkZWYgV0lUSF9aTElCCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQikKKyAgeyBpZiAoc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPT0gWl9OVUxMKQorICAgICAgcmV0dXJuIEVPRjsKKyAgICBpZiAoc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4gfHwgIXNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCkKKyAgICB7IHJlZ2lzdGVyIGludCByOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbmZsYXRpbmdcbiIpKTsKKyAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gKEJ5dGUqKXNvYXAtPmJ1ZjsKKyAgICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCA9IFNPQVBfQlVGTEVOOworICAgICAgciA9IGluZmxhdGUoJnNvYXAtPmRfc3RyZWFtLCBaX05PX0ZMVVNIKTsKKyAgICAgIGlmIChyID09IFpfT0sgfHwgciA9PSBaX1NUUkVBTV9FTkQpCisgICAgICB7IHNvYXAtPmJ1ZmlkeCA9IDA7CisgICAgICAgIHNvYXAtPmJ1ZmxlbiA9IFNPQVBfQlVGTEVOIC0gc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0OworICAgICAgICBpZiAoc29hcC0+emxpYl9pbiA9PSBTT0FQX1pMSUJfR1pJUCkKKyAgICAgICAgICBzb2FwLT56X2NyYyA9IGNyYzMyKHNvYXAtPnpfY3JjLCAoQnl0ZSopc29hcC0+YnVmLCAodW5zaWduZWQgaW50KXNvYXAtPmJ1Zmxlbik7CisgICAgICAgIGlmIChyID09IFpfU1RSRUFNX0VORCkKKyAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluZmxhdGVkICVsdS0+JWx1IGJ5dGVzXG4iLCBzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiwgc29hcC0+ZF9zdHJlYW0udG90YWxfb3V0KSk7CisgICAgICAgICAgc29hcC0+el9yYXRpb19pbiA9IChmbG9hdClzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiAvIChmbG9hdClzb2FwLT5kX3N0cmVhbS50b3RhbF9vdXQ7CisgICAgICAgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSBaX05VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvYXAtPmJ1ZmxlbikKKyAgICAgICAgeyBzb2FwLT5jb3VudCArPSBzb2FwLT5idWZsZW47CisgICAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHIgIT0gWl9CVUZfRVJST1IpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5mbGF0ZSBlcnJvcjogJXNcbiIsIHNvYXAtPmRfc3RyZWFtLm1zZz9zb2FwLT5kX3N0cmVhbS5tc2c6IiIpKTsKKyAgICAgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSBaX05VTEw7CisJc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgICAgIHJldHVybiBFT0Y7CisgICAgICB9CisgICAgfQoremxpYl9hZ2FpbjoKKyAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LICYmICFzb2FwLT5jaHVua3NpemUpCisgICAgeyBtZW1jcHkoc29hcC0+YnVmLCBzb2FwLT56X2J1ZiwgU09BUF9CVUZMRU4pOworICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+el9idWZsZW47CisgICAgfQorICB9CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykgLyogcmVhZCBIVFRQIGNodW5rZWQgdHJhbnNmZXIgKi8KKyAgeyAKK2NodW5rX2FnYWluOgorICAgIGlmIChzb2FwLT5jaHVua3NpemUpCisgICAgeyBzb2FwLT5idWZsZW4gPSByZXQgPSBzb2FwLT5mcmVjdihzb2FwLCBzb2FwLT5idWYsIHNvYXAtPmNodW5rc2l6ZSA+IFNPQVBfQlVGTEVOID8gU09BUF9CVUZMRU4gOiBzb2FwLT5jaHVua3NpemUpOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHZXR0aW5nIGNodW5rOiByZWFkICV1IGJ5dGVzXG4iLCAodW5zaWduZWQgaW50KXJldCkpOworICAgICAgREJHTVNHKFJFQ1YsIHNvYXAtPmJ1ZiwgcmV0KTsKKyAgICAgIHNvYXAtPmJ1ZmlkeCA9IDA7CisgICAgICBzb2FwLT5jaHVua3NpemUgLT0gcmV0OworICAgIH0KKyAgICBlbHNlCisgICAgeyByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgICAgICBjaGFyICp0LCB0bXBbOF07CisgICAgICB0ID0gdG1wOworICAgICAgaWYgKCFzb2FwLT5jaHVua2J1ZmxlbikKKyAgICAgIHsgc29hcC0+Y2h1bmtidWZsZW4gPSByZXQgPSBzb2FwLT5mcmVjdihzb2FwLCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOKTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWFkICV1IGJ5dGVzIChjaHVua2VkKSBmcm9tIHNvY2tldCAlZFxuIiwgKHVuc2lnbmVkIGludClyZXQsIHNvYXAtPnNvY2tldCkpOworICAgICAgICBEQkdNU0coUkVDViwgc29hcC0+YnVmLCByZXQpOworICAgICAgICBzb2FwLT5idWZpZHggPSAwOworICAgICAgICBpZiAoIXJldCkKKyAgICAgICAgICByZXR1cm4gc29hcC0+YWhlYWQgPSBFT0Y7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHNvYXAtPmJ1ZmlkeCA9IHNvYXAtPmJ1ZmxlbjsKKyAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmNodW5rYnVmbGVuOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHZXR0aW5nIGNodW5rIHNpemUgKGlkeD0ldSBsZW49JXUpXG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmJ1ZmlkeCwgKHVuc2lnbmVkIGludClzb2FwLT5idWZsZW4pKTsKKyAgICAgIHdoaWxlICghc29hcF9pc3hkaWdpdCgoaW50KShjID0gc29hcF9nZXRjaHVua2NoYXIoc29hcCkpKSkKKyAgICAgICAgaWYgKChpbnQpYyA9PSBFT0YpCisJICByZXR1cm4gc29hcC0+YWhlYWQgPSBFT0Y7CisgICAgICBkbworICAgICAgICAqdCsrID0gKGNoYXIpYzsKKyAgICAgIHdoaWxlIChzb2FwX2lzeGRpZ2l0KChpbnQpKGMgPSBzb2FwX2dldGNodW5rY2hhcihzb2FwKSkpICYmIHQgLSB0bXAgPCA3KTsKKyAgICAgIHdoaWxlICgoaW50KWMgIT0gRU9GICYmIGMgIT0gJ1xuJykKKyAgICAgICAgYyA9IHNvYXBfZ2V0Y2h1bmtjaGFyKHNvYXApOworICAgICAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgIHJldHVybiBzb2FwLT5haGVhZCA9IEVPRjsKKyAgICAgICp0ID0gJ1wwJzsKKyAgICAgIHNvYXAtPmNodW5rc2l6ZSA9IHNvYXBfc3RydG91bCh0bXAsICZ0LCAxNik7CisgICAgICBpZiAoIXNvYXAtPmNodW5rc2l6ZSkKKyAgICAgIHsgc29hcC0+Y2h1bmtidWZsZW4gPSAwOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBvZiBjaHVua2VkIG1lc3NhZ2VcbiIpKTsKKwl3aGlsZSAoKGludCljICE9IEVPRiAmJiBjICE9ICdcbicpCisgICAgICAgICAgYyA9IHNvYXBfZ2V0Y2h1bmtjaGFyKHNvYXApOworICAgICAgICByZXR1cm4gc29hcC0+YWhlYWQgPSBFT0Y7CisgICAgICB9CisgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5idWZpZHggKyBzb2FwLT5jaHVua3NpemU7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk1vdmluZyBidWYgbGVuIHRvIGlkeD0ldSBsZW49JXUgKCVzKVxuIiwgKHVuc2lnbmVkIGludClzb2FwLT5idWZpZHgsICh1bnNpZ25lZCBpbnQpc29hcC0+YnVmbGVuLCB0bXApKTsKKyAgICAgIGlmIChzb2FwLT5idWZsZW4gPiBzb2FwLT5jaHVua2J1ZmxlbikKKyAgICAgIHsgc29hcC0+YnVmbGVuID0gc29hcC0+Y2h1bmtidWZsZW47CisgICAgICAgIHNvYXAtPmNodW5rc2l6ZSAtPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgICAgIHNvYXAtPmNodW5rYnVmbGVuID0gMDsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQYXNzZWQgZW5kIG9mIGJ1ZmZlciBmb3IgY2h1bmtlZCBIVFRQICgldSBieXRlcyBsZWZ0KVxuIiwgKHVuc2lnbmVkIGludCkoc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4KSkpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoc29hcC0+Y2h1bmtidWZsZW4pCisgICAgICAgIHNvYXAtPmNodW5rc2l6ZSA9IDA7CisgICAgICByZXQgPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgICBpZiAoIXJldCkKKyAgICAgICAgZ290byBjaHVua19hZ2FpbjsKKyAgICB9CisgIH0KKyAgZWxzZQorI2VuZGlmCisgIHsgc29hcC0+YnVmaWR4ID0gMDsKKyAgICBzb2FwLT5idWZsZW4gPSByZXQgPSBzb2FwLT5mcmVjdihzb2FwLCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOKTsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlYWQgJXUgYnl0ZXMgZnJvbSBzb2NrZXQgJWRcbiIsICh1bnNpZ25lZCBpbnQpcmV0LCBzb2FwLT5zb2NrZXQpKTsKKyAgICBEQkdNU0coUkVDViwgc29hcC0+YnVmLCByZXQpOworICB9CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5mcHJlcGFyZXJlY3YgJiYgKHNvYXAtPmVycm9yID0gc29hcC0+ZnByZXBhcmVyZWN2KHNvYXAsIHNvYXAtPmJ1ZiwgcmV0KSkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2VuZGlmCisjaWZkZWYgV0lUSF9aTElCCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQikKKyAgeyByZWdpc3RlciBpbnQgcjsKKyAgICBtZW1jcHkoc29hcC0+el9idWYsIHNvYXAtPmJ1ZiwgU09BUF9CVUZMRU4pOworICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfaW4gPSAoQnl0ZSopKHNvYXAtPnpfYnVmICsgc29hcC0+YnVmaWR4KTsKKyAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbiA9ICh1bnNpZ25lZCBpbnQpcmV0OworICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gKEJ5dGUqKXNvYXAtPmJ1ZjsKKyAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgPSBTT0FQX0JVRkxFTjsKKyAgICByID0gaW5mbGF0ZSgmc29hcC0+ZF9zdHJlYW0sIFpfTk9fRkxVU0gpOworICAgIGlmIChyID09IFpfT0sgfHwgciA9PSBaX1NUUkVBTV9FTkQpCisgICAgeyBzb2FwLT5idWZpZHggPSAwOworICAgICAgc29hcC0+el9idWZsZW4gPSBzb2FwLT5idWZsZW47CisgICAgICBzb2FwLT5idWZsZW4gPSByZXQgPSBTT0FQX0JVRkxFTiAtIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dDsKKyAgICAgIGlmIChzb2FwLT56bGliX2luID09IFNPQVBfWkxJQl9HWklQKQorICAgICAgICBzb2FwLT56X2NyYyA9IGNyYzMyKHNvYXAtPnpfY3JjLCAoQnl0ZSopc29hcC0+YnVmLCAodW5zaWduZWQgaW50KXNvYXAtPmJ1Zmxlbik7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluZmxhdGVkICV1IGJ5dGVzXG4iLCAodW5zaWduZWQgaW50KXJldCkpOworICAgICAgaWYgKCFyZXQpCisgICAgICAgIGdvdG8gemxpYl9hZ2FpbjsKKyAgICAgIGlmIChyID09IFpfU1RSRUFNX0VORCkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbmZsYXRlZCAlbHUtPiVsdSBieXRlc1xuIiwgc29hcC0+ZF9zdHJlYW0udG90YWxfaW4sIHNvYXAtPmRfc3RyZWFtLnRvdGFsX291dCkpOworICAgICAgICBzb2FwLT56X3JhdGlvX2luID0gKGZsb2F0KXNvYXAtPmRfc3RyZWFtLnRvdGFsX2luIC8gKGZsb2F0KXNvYXAtPmRfc3RyZWFtLnRvdGFsX291dDsKKyAgICAgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSBaX05VTEw7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVW5hYmxlIHRvIGluZmxhdGU6ICglZCkgJXNcbiIsIHIsIHNvYXAtPmRfc3RyZWFtLm1zZz9zb2FwLT5kX3N0cmVhbS5tc2c6IiIpKTsKKyAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gWl9OVUxMOworICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgICByZXR1cm4gRU9GOworICAgIH0KKyAgfQorI2VuZGlmCisgIHNvYXAtPmNvdW50ICs9IHJldDsKKyAgcmV0dXJuICFyZXQ7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVjdihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkKKyAgeyBpZiAoc29hcC0+ZGltZS5idWZsZW4pCisgICAgeyBjaGFyICpzOworICAgICAgaW50IGk7CisgICAgICB1bnNpZ25lZCBjaGFyIHRtcFsxMl07CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRJTUUgaGRyIGZvciBjaHVua2VkIERJTUUgaXMgaW4gYnVmZmVyXG4iKSk7CisgICAgICBzb2FwLT5jb3VudCArPSBzb2FwLT5kaW1lLmJ1ZmxlbiAtIHNvYXAtPmJ1ZmxlbjsKKyAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmRpbWUuYnVmbGVuOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTa2lwIHBhZGRpbmcgKCVsZCBieXRlcylcbiIsIC0obG9uZylzb2FwLT5kaW1lLnNpemUmMykpOworICAgICAgZm9yIChpID0gLShsb25nKXNvYXAtPmRpbWUuc2l6ZSYzOyBpID4gMDsgaS0tKQorICAgICAgeyBzb2FwLT5idWZpZHgrKzsKKyAgICAgICAgaWYgKHNvYXAtPmJ1ZmlkeCA+PSBzb2FwLT5idWZsZW4pCisgICAgICAgICAgaWYgKHNvYXBfcmVjdl9yYXcoc29hcCkpCisgICAgICAgICAgICByZXR1cm4gRU9GOworICAgICAgfQorICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHZXQgRElNRSBoZHIgZm9yIG5leHQgY2h1bmtcbiIpKTsKKyAgICAgIHMgPSAoY2hhciopdG1wOworICAgICAgZm9yIChpID0gMTI7IGkgPiAwOyBpLS0pCisgICAgICB7ICpzKysgPSBzb2FwLT5idWZbc29hcC0+YnVmaWR4KytdOworICAgICAgICBpZiAoc29hcC0+YnVmaWR4ID49IHNvYXAtPmJ1ZmxlbikKKyAgICAgICAgICBpZiAoc29hcF9yZWN2X3Jhdyhzb2FwKSkKKyAgICAgICAgICAgIHJldHVybiBFT0Y7CisgICAgICB9CisgICAgICBzb2FwLT5kaW1lLmZsYWdzID0gdG1wWzBdICYgMHg3OworICAgICAgc29hcC0+ZGltZS5zaXplID0gKChzaXplX3QpdG1wWzhdIDw8IDI0KSB8ICgoc2l6ZV90KXRtcFs5XSA8PCAxNikgfCAoKHNpemVfdCl0bXBbMTBdIDw8IDgpIHwgKChzaXplX3QpdG1wWzExXSk7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdldCBESU1FIGNodW5rICgldSBieXRlcylcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+ZGltZS5zaXplKSk7CisgICAgICBpZiAoc29hcC0+ZGltZS5mbGFncyAmIFNPQVBfRElNRV9DRikKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJNb3JlIGNodW5raW5nXG4iKSk7CisgICAgICAgIHNvYXAtPmRpbWUuY2h1bmtzaXplID0gc29hcC0+ZGltZS5zaXplOworICAgICAgICBpZiAoc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4ID49IHNvYXAtPmRpbWUuc2l6ZSkKKyAgICAgICAgeyBzb2FwLT5kaW1lLmJ1ZmxlbiA9IHNvYXAtPmJ1ZmxlbjsKKyAgICAgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5idWZpZHggKyBzb2FwLT5kaW1lLmNodW5rc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgc29hcC0+ZGltZS5jaHVua3NpemUgLT0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkxhc3QgY2h1bmtcbiIpKTsKKyAgICAgICAgc29hcC0+ZGltZS5idWZsZW4gPSAwOworICAgICAgICBzb2FwLT5kaW1lLmNodW5rc2l6ZSA9IDA7CisgICAgICB9CisgICAgICBzb2FwLT5jb3VudCA9IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiJXUgYnl0ZXMgcmVtYWluaW5nXG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmNvdW50KSk7CisgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICB9CisgICAgaWYgKHNvYXAtPmRpbWUuY2h1bmtzaXplKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHZXQgbmV4dCBESU1FIGhkciBmb3IgY2h1bmtlZCBESU1FICgldSBieXRlcyBjaHVuaylcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+ZGltZS5jaHVua3NpemUpKTsKKyAgICAgIGlmIChzb2FwX3JlY3ZfcmF3KHNvYXApKQorICAgICAgICByZXR1cm4gRU9GOworICAgICAgaWYgKHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeCA+PSBzb2FwLT5kaW1lLmNodW5rc2l6ZSkKKyAgICAgIHsgc29hcC0+ZGltZS5idWZsZW4gPSBzb2FwLT5idWZsZW47CisgICAgICAgIHNvYXAtPmNvdW50IC09IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeCAtIHNvYXAtPmRpbWUuY2h1bmtzaXplOworICAgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5idWZpZHggKyBzb2FwLT5kaW1lLmNodW5rc2l6ZTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgc29hcC0+ZGltZS5jaHVua3NpemUgLT0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIlbHUgYnl0ZXMgcmVtYWluaW5nLCBjb3VudD0ldVxuIiwgKHVuc2lnbmVkIGxvbmcpKHNvYXAtPmJ1Zmxlbi1zb2FwLT5idWZpZHgpLCAodW5zaWduZWQgaW50KXNvYXAtPmNvdW50KSk7CisgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICB9CisgIH0KKyNlbmRpZgorICByZXR1cm4gc29hcF9yZWN2X3Jhdyhzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3NvYXBfd2NoYXIKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0Y2hhcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICBjID0gc29hcC0+YWhlYWQ7CisgIGlmIChjKQorICB7IGlmIChjICE9IEVPRikKKyAgICAgIHNvYXAtPmFoZWFkID0gMDsKKyAgICByZXR1cm4gYzsKKyAgfQorICByZXR1cm4gc29hcF9nZXQxKHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAqCitTT0FQX0ZNQUMyCitzb2FwX2NvZGUoY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgKm1hcCwgY29uc3QgY2hhciAqc3RyKQoreyBpZiAoc3RyKQorICB7IHdoaWxlIChtYXAtPnN0cmluZykKKyAgICB7IGlmICghc3RyY21wKHN0ciwgbWFwLT5zdHJpbmcpKSAvKiBjYXNlIHNlbnNpdGl2ZSAqLworICAgICAgICByZXR1cm4gbWFwOworICAgICAgbWFwKys7CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorbG9uZworU09BUF9GTUFDMgorc29hcF9pbnRfY29kZShjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCAqbWFwLCBjb25zdCBjaGFyICpzdHIsIGxvbmcgb3RoZXIpCit7IHdoaWxlIChtYXAtPnN0cmluZykKKyAgeyBpZiAoIXNvYXBfdGFnX2NtcChzdHIsIG1hcC0+c3RyaW5nKSkgLyogY2FzZSBpbnNlbnNpdGl2ZSAqLworICAgICAgcmV0dXJuIG1hcC0+Y29kZTsKKyAgICBtYXArKzsKKyAgfQorICByZXR1cm4gb3RoZXI7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9zdHJfY29kZShjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCAqbWFwLCBsb25nIGNvZGUpCit7IHdoaWxlIChtYXAtPmNvZGUgIT0gY29kZSAmJiBtYXAtPnN0cmluZykKKyAgICBtYXArKzsKKyAgcmV0dXJuIG1hcC0+c3RyaW5nOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHNvYXBfd2NoYXIKK3NvYXBfY2hhcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgY2hhciB0bXBbOF07CisgIHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIHJlZ2lzdGVyIGNoYXIgKnMgPSB0bXA7CisgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspCisgIHsgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICBpZiAoYyA9PSAnOycgfHwgKGludCljID09IEVPRikKKyAgICAgIGJyZWFrOworICAgICpzKysgPSAoY2hhciljOworICB9CisgICpzID0gJ1wwJzsKKyAgaWYgKCp0bXAgPT0gJyMnKQorICB7IGlmICh0bXBbMV0gPT0gJ3gnIHx8IHRtcFsxXSA9PSAnWCcpCisgICAgICByZXR1cm4gc29hcF9zdHJ0b2wodG1wICsgMiwgTlVMTCwgMTYpOworICAgIHJldHVybiBhdG9sKHRtcCArIDEpOworICB9CisgIGlmICghc3RyY21wKHRtcCwgImx0IikpCisgICAgcmV0dXJuICc8JzsKKyAgaWYgKCFzdHJjbXAodG1wLCAiZ3QiKSkKKyAgICByZXR1cm4gJz4nOworICBpZiAoIXN0cmNtcCh0bXAsICJhbXAiKSkKKyAgICByZXR1cm4gJyYnOworICBpZiAoIXN0cmNtcCh0bXAsICJxdW90IikpCisgICAgcmV0dXJuICciJzsKKyAgaWYgKCFzdHJjbXAodG1wLCAiYXBvcyIpKQorICAgIHJldHVybiAnXCcnOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgcmV0dXJuIChzb2FwX3djaGFyKXNvYXBfaW50X2NvZGUoaHRtbF9lbnRpdHlfY29kZXMsIHRtcCwgU09BUF9VTktOT1dOX0NIQVIpOworI2Vsc2UKKyAgcmV0dXJuIFNPQVBfVU5LTk9XTl9DSEFSOyAvKiB1c2UgdGhpcyB0byByZXByZXNlbnQgdW5rbm93biBjb2RlICovCisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFdJVEhfTEVBTgorc29hcF93Y2hhcgorc29hcF9nZXQwKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcC0+YnVmaWR4ID49IHNvYXAtPmJ1ZmxlbiAmJiBzb2FwX3JlY3Yoc29hcCkpCisgICAgcmV0dXJuIEVPRjsKKyAgcmV0dXJuICh1bnNpZ25lZCBjaGFyKXNvYXAtPmJ1Zltzb2FwLT5idWZpZHhdOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgV0lUSF9MRUFOCitzb2FwX3djaGFyCitzb2FwX2dldDEoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwLT5idWZpZHggPj0gc29hcC0+YnVmbGVuICYmIHNvYXBfcmVjdihzb2FwKSkKKyAgICByZXR1cm4gRU9GOworICByZXR1cm4gKHVuc2lnbmVkIGNoYXIpc29hcC0+YnVmW3NvYXAtPmJ1ZmlkeCsrXTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3NvYXBfd2NoYXIKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIGMgPSBzb2FwLT5haGVhZDsKKyAgaWYgKGMpCisgIHsgaWYgKGMgIT0gRU9GKQorICAgICAgc29hcC0+YWhlYWQgPSAwOworICB9CisgIGVsc2UKKyAgICBjID0gc29hcF9nZXQxKHNvYXApOworICBmb3IgKDs7KQorICB7IGlmIChzb2FwLT5jZGF0YSkKKyAgICB7IGlmIChjID09ICddJykKKyAgICAgIHsgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgICAgaWYgKGMgPT0gJ10nKQorICAgICAgICB7IHNvYXAtPmNkYXRhID0gMDsKKyAgICAgICAgICBzb2FwX2dldDEoc29hcCk7IC8qIHNraXAgPiAqLworICAgICAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICAgIH0KKwllbHNlCisgICAgICAgIHsgc29hcF9yZXZnZXQxKHNvYXApOworICAgICAgICAgIHJldHVybiAnXSc7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGM7CisgICAgfQorICAgIHN3aXRjaCAoYykKKyAgICB7IGNhc2UgJzwnOgorICAgICAgICBkbyBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgICB3aGlsZSAoc29hcF9ibGFuayhjKSk7CisgICAgICAgIGlmIChjID09ICchJyB8fCBjID09ICc/JyB8fCBjID09ICclJykKKyAgICAgICAgeyByZWdpc3RlciBpbnQgayA9IDE7CisJICBpZiAoYyA9PSAnIScpCisgICAgICAgICAgeyBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgICAgICAgaWYgKGMgPT0gJ1snKQorICAgICAgICAgICAgeyBkbyBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgICAgICAgICB3aGlsZSAoKGludCljICE9IEVPRiAmJiBjICE9ICdbJyk7CisgICAgICAgICAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBzb2FwLT5jZGF0YSA9IDE7CisgICAgICAgICAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisJICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYyA9PSAnLScgJiYgKGMgPSBzb2FwX2dldDEoc29hcCkpID09ICctJykKKyAgICAgICAgICAgIHsgZG8KKyAgICAgICAgICAgICAgeyBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgICAgICAgICAgIGlmIChjID09ICctJyAmJiAoYyA9IHNvYXBfZ2V0MShzb2FwKSkgPT0gJy0nKQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0gd2hpbGUgKChpbnQpYyAhPSBFT0YpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKwkgIGVsc2UgaWYgKGMgPT0gJz8nKQorICAgICAgICAgICAgYyA9IHNvYXBfZ2V0X3BpKHNvYXApOworICAgICAgICAgIHdoaWxlICgoaW50KWMgIT0gRU9GKQorICAgICAgICAgIHsgaWYgKGMgPT0gJzwnKQorCSAgICAgIGsrKzsKKwkgICAgZWxzZSBpZiAoYyA9PSAnPicpCisJICAgIHsgaWYgKC0tayA8PSAwKQorCSAgICAgICAgYnJlYWs7CisJICAgIH0KKwkgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKwkgIH0KKwkgIGlmICgoaW50KWMgPT0gRU9GKQorCSAgICBicmVhazsKKyAgICAgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChjID09ICcvJykKKyAgICAgICAgICByZXR1cm4gU09BUF9UVDsKKyAgICAgICAgc29hcF9yZXZnZXQxKHNvYXApOworICAgICAgICByZXR1cm4gU09BUF9MVDsKKyAgICAgIGNhc2UgJz4nOgorICAgICAgICByZXR1cm4gU09BUF9HVDsKKyAgICAgIGNhc2UgJyInOgorICAgICAgICByZXR1cm4gU09BUF9RVDsKKyAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgcmV0dXJuIFNPQVBfQVA7CisgICAgICBjYXNlICcmJzoKKyAgICAgICAgcmV0dXJuIHNvYXBfY2hhcihzb2FwKSB8IDB4ODAwMDAwMDA7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIHJldHVybiBjOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHNvYXBfd2NoYXIKK3NvYXBfZ2V0X3BpKHN0cnVjdCBzb2FwICpzb2FwKQoreyBjaGFyIGJ1Zls2NF07CisgIHJlZ2lzdGVyIGNoYXIgKnMgPSBidWY7CisgIHJlZ2lzdGVyIGludCBpID0gc2l6ZW9mKGJ1Zik7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgLyogVGhpcyBpcyBhIHF1aWNrIHdheSB0byBwYXJzZSBYTUwgUEkgYW5kIHdlIGNvdWxkIHVzZSBhIGNhbGxiYWNrIGluc3RlYWQgdG8KKyAgICogZW5hYmxlIGFwcGxpY2F0aW9ucyB0byBpbnRlcmNlcHQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgKi8KKyAgd2hpbGUgKChpbnQpYyAhPSBFT0YgJiYgYyAhPSAnPycpCisgIHsgaWYgKC0taSA+IDApCisgICAgeyBpZiAoc29hcF9ibGFuayhjKSkKKyAgICAgICAgYyA9ICcgJzsKKyAgICAgICpzKysgPSAoY2hhciljOworICAgIH0KKyAgICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICB9CisgICpzID0gJ1wwJzsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJYTUwgUEkgPD8lcz8+XG4iLCBidWYpKTsKKyAgaWYgKCFzdHJuY21wKGJ1ZiwgInhtbCAiLCA0KSkKKyAgeyBzID0gc3Ryc3RyKGJ1ZiwgIiBlbmNvZGluZz0iKTsKKyAgICBpZiAocyAmJiBzWzEwXSkKKyAgICB7IGlmICghc29hcF90YWdfY21wKHMgKyAxMSwgImlzby04ODU5LTEqIikKKyAgICAgICB8fCAhc29hcF90YWdfY21wKHMgKyAxMSwgImxhdGluMSoiKSkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTd2l0Y2hpbmcgdG8gbGF0aW4xIGVuY29kaW5nXG4iKSk7CisgICAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfTEFUSU47CisgICAgICB9CisgICAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHMgKyAxMSwgInV0Zi04KiIpKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlN3aXRjaGluZyB0byB1dGYtOCBlbmNvZGluZ1xuIikpOworICAgICAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0VOQ19MQVRJTjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKChpbnQpYyAhPSBFT0YpCisgICAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgcmV0dXJuIGM7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfbW92ZShzdHJ1Y3Qgc29hcCAqc29hcCwgbG9uZyBuKQoreyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk1vdmluZyAlbGQgYnl0ZXMgZm9yd2FyZFxuIiwgKGxvbmcpbikpOworICBmb3IgKDsgbiA+IDA7IG4tLSkKKyAgICBpZiAoKGludClzb2FwX2dldGNoYXIoc29hcCkgPT0gRU9GKQorICAgICAgcmV0dXJuIFNPQVBfRU9GOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc2l6ZV90CitTT0FQX0ZNQUMyCitzb2FwX3RlbGwoc3RydWN0IHNvYXAgKnNvYXApCit7IHJldHVybiBzb2FwLT5jb3VudCAtIHNvYXAtPmJ1ZmxlbiArIHNvYXAtPmJ1ZmlkeCAtIChzb2FwLT5haGVhZCAhPSAwKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dHV0Zjgoc3RydWN0IHNvYXAgKnNvYXAsIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgYykKK3sgY2hhciB0bXBbMTZdOworICBpZiAoYyA+IDAgJiYgYyA8IDB4ODApCisgIHsgKnRtcCA9IChjaGFyKWM7CisgICAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgdG1wLCAxKTsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgIHsgcmVnaXN0ZXIgY2hhciAqdCA9IHRtcDsKKyAgICBpZiAoYyA8IDB4MDgwMCkKKyAgICAgICp0KysgPSAoY2hhcikoMHhDMCB8ICgoYyA+PiA2KSAmIDB4MUYpKTsKKyAgICBlbHNlCisgICAgeyBpZiAoYyA8IDB4MDEwMDAwKQorICAgICAgICAqdCsrID0gKGNoYXIpKDB4RTAgfCAoKGMgPj4gMTIpICYgMHgwRikpOworICAgICAgZWxzZQorICAgICAgeyBpZiAoYyA8IDB4MjAwMDAwKQorICAgICAgICAgICp0KysgPSAoY2hhcikoMHhGMCB8ICgoYyA+PiAxOCkgJiAweDA3KSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyBpZiAoYyA8IDB4MDQwMDAwMDApCisgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjggfCAoKGMgPj4gMjQpICYgMHgwMykpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7ICp0KysgPSAoY2hhcikoMHhGQyB8ICgoYyA+PiAzMCkgJiAweDAxKSk7CisgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMjQpICYgMHgzRikpOworICAgICAgICAgIH0KKyAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTgpICYgMHgzRikpOworICAgICAgICB9ICAgICAKKyAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDEyKSAmIDB4M0YpKTsKKyAgICAgIH0KKyAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpKTsKKyAgICB9CisgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKGMgJiAweDNGKSk7CisgICAgKnQgPSAnXDAnOworICB9CisgIGVsc2UKKyNlbmRpZgorICAgIHNwcmludGYodG1wLCAiJiMlbHU7IiwgYyk7CisgIHJldHVybiBzb2FwX3NlbmQoc29hcCwgdG1wKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3NvYXBfd2NoYXIKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0dXRmOChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjLCBjMSwgYzIsIGMzLCBjNDsKKyAgYyA9IHNvYXAtPmFoZWFkOworICBpZiAoYyA+IDB4RkYpCisgIHsgc29hcC0+YWhlYWQgPSAwOworICAgIHJldHVybiBjOworICB9CithZ2FpbjoKKyAgYyA9IHNvYXBfZ2V0KHNvYXApOworICBpZiAoYyA8IDB4ODAgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19MQVRJTikpCisgICAgcmV0dXJuIGM7CisgIGMxID0gc29hcF9nZXQxKHNvYXApOworICBpZiAoYzEgPCAweDgwKQorICB7IHNvYXBfcmV2Z2V0MShzb2FwKTsgLyogZG9lc24ndCBsb29rIGxpa2UgdGhpcyBpcyBVVEY4ICovCisgICAgcmV0dXJuIGM7CisgIH0KKyAgYzEgJj0gMHgzRjsKKyAgaWYgKGMgPCAweEUwKQorICAgIHJldHVybiAoKHNvYXBfd2NoYXIpKGMgJiAweDFGKSA8PCA2KSB8IGMxOworICBjMiA9IChzb2FwX3djaGFyKXNvYXBfZ2V0MShzb2FwKSAmIDB4M0Y7CisgIGlmIChjID09IDB4RUYgJiYgYzEgPT0gMHgzQiAmJiBjMiA9PSAweDNGKQkvKiBpZ25vcmUgVVRGLTggQk9NICovCisgICAgZ290byBhZ2FpbjsKKyAgaWYgKGMgPCAweEYwKQorICAgIHJldHVybiAoKHNvYXBfd2NoYXIpKGMgJiAweDBGKSA8PCAxMikgfCAoYzEgPDwgNikgfCBjMjsKKyAgYzMgPSAoc29hcF93Y2hhcilzb2FwX2dldDEoc29hcCkgJiAweDNGOworICBpZiAoYyA8IDB4RjgpCisgICAgcmV0dXJuICgoc29hcF93Y2hhcikoYyAmIDB4MDcpIDw8IDE4KSB8IChjMSA8PCAxMikgfCAoYzIgPDwgNikgfCBjMzsKKyAgYzQgPSAoc29hcF93Y2hhcilzb2FwX2dldDEoc29hcCkgJiAweDNGOworICBpZiAoYyA8IDB4RkMpCisgICAgcmV0dXJuICgoc29hcF93Y2hhcikoYyAmIDB4MDMpIDw8IDI0KSB8IChjMSA8PCAxOCkgfCAoYzIgPDwgMTIpIHwgKGMzIDw8IDYpIHwgYzQ7CisgIHJldHVybiAoKHNvYXBfd2NoYXIpKGMgJiAweDAxKSA8PCAzMCkgfCAoYzEgPDwgMjQpIHwgKGMyIDw8IDE4KSB8IChjMyA8PCAxMikgfCAoYzQgPDwgNikgfCAoc29hcF93Y2hhcikoc29hcF9nZXQxKHNvYXApICYgMHgzRik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0aGV4KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzLCBpbnQgbikKK3sgY2hhciBkWzJdOworICByZWdpc3RlciBpbnQgaTsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBpZiAoIShzb2FwLT5kb20tPmRhdGEgPSBzb2FwX3MyaGV4KHNvYXAsIHMsIE5VTEwsIG4pKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2VuZGlmCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgIHsgcmVnaXN0ZXIgaW50IG0gPSAqcysrOworICAgIGRbMF0gPSAoY2hhcikoKG0gPj4gNCkgKyAobSA+IDE1OSA/ICc3JyA6ICcwJykpOworICAgIG0gJj0gMHgwRjsKKyAgICBkWzFdID0gKGNoYXIpKG0gKyAobSA+IDkgPyAnNycgOiAnMCcpKTsKKyAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBkLCAyKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3Vuc2lnbmVkIGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2dldGhleChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50ICpuKQoreworI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IHNvYXAtPmRvbS0+ZGF0YSA9IHNvYXBfc3RyaW5nX2luKHNvYXAsIDAsIC0xLCAtMSk7CisgICAgcmV0dXJuICh1bnNpZ25lZCBjaGFyKilzb2FwX2hleDJzKHNvYXAsIHNvYXAtPmRvbS0+ZGF0YSwgTlVMTCwgMCwgbik7CisgIH0KKyNlbmRpZgorI2lmZGVmIFdJVEhfRkFTVAorICBzb2FwLT5sYWJpZHggPSAwOworICBmb3IgKDs7KQorICB7IHJlZ2lzdGVyIGNoYXIgKnM7CisgICAgcmVnaXN0ZXIgaW50IGksIGs7CisgICAgaWYgKHNvYXBfYXBwZW5kX2xhYihzb2FwLCBOVUxMLCAwKSkKKyAgICAgIHJldHVybiBOVUxMOworICAgIHMgPSBzb2FwLT5sYWJidWYgKyBzb2FwLT5sYWJpZHg7CisgICAgayA9IHNvYXAtPmxhYmxlbiAtIHNvYXAtPmxhYmlkeDsKKyAgICBzb2FwLT5sYWJpZHggPSBzb2FwLT5sYWJsZW47CisgICAgZm9yIChpID0gMDsgaSA8IGs7IGkrKykKKyAgICB7IHJlZ2lzdGVyIGNoYXIgZDEsIGQyOworICAgICAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICAgICAgYyA9IHNvYXBfZ2V0KHNvYXApOworICAgICAgaWYgKHNvYXBfaXN4ZGlnaXQoYykpCisgICAgICB7IGQxID0gKGNoYXIpYzsKKyAgICAgICAgYyA9IHNvYXBfZ2V0KHNvYXApOyAKKwlpZiAoc29hcF9pc3hkaWdpdChjKSkKKyAgICAgICAgICBkMiA9IChjaGFyKWM7CisgICAgICAgIGVsc2UgCisgICAgICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgdW5zaWduZWQgY2hhciAqcDsKKyAgICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgaWYgKG4pCisgICAgICAgICAgKm4gPSAoaW50KShzb2FwLT5sYWJsZW4gLSBrICsgaSk7CisgICAgICAgIHAgPSAodW5zaWduZWQgY2hhciopc29hcF9tYWxsb2Moc29hcCwgc29hcC0+bGFibGVuIC0gayArIGkpOworCWlmIChwKQorCSAgbWVtY3B5KHAsIHNvYXAtPmxhYmJ1Ziwgc29hcC0+bGFibGVuIC0gayArIGkpOworICAgICAgICByZXR1cm4gcDsKKyAgICAgIH0KKyAgICAgICpzKysgPSAoKGQxID49ICdBJyA/IChkMSAmIDB4NykgKyA5IDogZDEgLSAnMCcpIDw8IDQpICsgKGQyID49ICdBJyA/IChkMiAmIDB4NykgKyA5IDogZDIgLSAnMCcpOworICAgIH0KKyAgfQorI2Vsc2UKKyAgaWYgKHNvYXBfbmV3X2Jsb2NrKHNvYXApKQorICAgIHJldHVybiBOVUxMOworICBmb3IgKDs7KQorICB7IHJlZ2lzdGVyIGludCBpOworICAgIHJlZ2lzdGVyIGNoYXIgKnMgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIFNPQVBfQkxLTEVOKTsKKyAgICBpZiAoIXMpCisgICAgeyBzb2FwX2VuZF9ibG9jayhzb2FwKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgU09BUF9CTEtMRU47IGkrKykKKyAgICB7IHJlZ2lzdGVyIGNoYXIgZDEsIGQyOworICAgICAgcmVnaXN0ZXIgc29hcF93Y2hhciBjID0gc29hcF9nZXQoc29hcCk7CisgICAgICBpZiAoc29hcF9pc3hkaWdpdChjKSkKKyAgICAgIHsgZDEgPSAoY2hhciljOworICAgICAgICBjID0gc29hcF9nZXQoc29hcCk7IAorCWlmIChzb2FwX2lzeGRpZ2l0KGMpKQorICAgICAgICAgIGQyID0gKGNoYXIpYzsKKyAgICAgICAgZWxzZSAKKyAgICAgICAgeyBzb2FwX2VuZF9ibG9jayhzb2FwKTsKKwkgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IHVuc2lnbmVkIGNoYXIgKnA7CisgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgIGlmIChuKQorICAgICAgICAgICpuID0gc29hcF9zaXplX2Jsb2NrKHNvYXAsIGkpOworICAgICAgICBwID0gKHVuc2lnbmVkIGNoYXIqKXNvYXBfc2F2ZV9ibG9jayhzb2FwLCBOVUxMLCAwKTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgICB9CisgICAgICAqcysrID0gKChkMSA+PSAnQScgPyAoZDEgJiAweDcpICsgOSA6IGQxIC0gJzAnKSA8PCA0KSArIChkMiA+PSAnQScgPyAoZDIgJiAweDcpICsgOSA6IGQyIC0gJzAnKTsKKyAgICB9CisgIH0KKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dGJhc2U2NChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgdW5zaWduZWQgY2hhciAqcywgaW50IG4pCit7IHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIG07CisgIGNoYXIgZFs0XTsKKyAgaWYgKCFzKQorICAgIHJldHVybiBTT0FQX09LOworI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IGlmICghKHNvYXAtPmRvbS0+ZGF0YSA9IHNvYXBfczJiYXNlNjQoc29hcCwgcywgTlVMTCwgbikpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIHJldHVybiBTT0FQX09LOworICB9CisjZW5kaWYKKyAgZm9yICg7IG4gPiAyOyBuIC09IDMsIHMgKz0gMykKKyAgeyBtID0gc1swXTsKKyAgICBtID0gKG0gPDwgOCkgfCBzWzFdOworICAgIG0gPSAobSA8PCA4KSB8IHNbMl07CisgICAgZm9yIChpID0gNDsgaSA+IDA7IG0gPj49IDYpCisgICAgICBkWy0taV0gPSBzb2FwX2Jhc2U2NG9bbSAmIDB4M0ZdOworICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIGQsIDQpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmIChuID4gMCkKKyAgeyBtID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgbSA9IChtIDw8IDgpIHwgKnMrKzsKKyAgICBmb3IgKDsgaSA8IDM7IGkrKykKKyAgICAgIG0gPDw9IDg7CisgICAgZm9yIChpKys7IGkgPiAwOyBtID4+PSA2KQorICAgICAgZFstLWldID0gc29hcF9iYXNlNjRvW20gJiAweDNGXTsKKyAgICBmb3IgKGkgPSAzOyBpID4gbjsgaS0tKQorICAgICAgZFtpXSA9ICc9JzsKKyAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBkLCA0KSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3Vuc2lnbmVkIGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2dldGJhc2U2NChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50ICpuLCBpbnQgbWFsbG9jX2ZsYWcpCit7IAorI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IHNvYXAtPmRvbS0+ZGF0YSA9IHNvYXBfc3RyaW5nX2luKHNvYXAsIDAsIC0xLCAtMSk7CisgICAgcmV0dXJuICh1bnNpZ25lZCBjaGFyKilzb2FwX2Jhc2U2NDJzKHNvYXAsIHNvYXAtPmRvbS0+ZGF0YSwgTlVMTCwgMCwgbik7CisgIH0KKyNlbmRpZgorI2lmZGVmIFdJVEhfRkFTVAorICBzb2FwLT5sYWJpZHggPSAwOworICBmb3IgKDs7KQorICB7IHJlZ2lzdGVyIGludCBpLCBrOworICAgIHJlZ2lzdGVyIGNoYXIgKnM7CisgICAgaWYgKHNvYXBfYXBwZW5kX2xhYihzb2FwLCBOVUxMLCAyKSkKKyAgICAgIHJldHVybiBOVUxMOworICAgIHMgPSBzb2FwLT5sYWJidWYgKyBzb2FwLT5sYWJpZHg7CisgICAgayA9IHNvYXAtPmxhYmxlbiAtIHNvYXAtPmxhYmlkeDsKKyAgICBzb2FwLT5sYWJpZHggPSAzICogKHNvYXAtPmxhYmxlbiAvIDMpOworICAgIGlmICghcykKKyAgICAgIHJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCBrIC0gMjsgaSArPSAzKQorICAgIHsgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBtID0gMDsKKyAgICAgIHJlZ2lzdGVyIGludCBqID0gMDsKKyAgICAgIGRvCisgICAgICB7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IHNvYXBfZ2V0KHNvYXApOworICAgICAgICBpZiAoYyA9PSAnPScgfHwgYyA8IDApCisgICAgICAgIHsgdW5zaWduZWQgY2hhciAqcDsKKyAgICAgICAgICBzd2l0Y2ggKGopCisgICAgICAgICAgeyBjYXNlIDI6CisgICAgICAgICAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gNCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiAxMCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiAyKSAmIDB4RkYpOworICAgICAgICAgICAgICBpICs9IDI7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChuKQorICAgICAgICAgICAgKm4gPSAoaW50KShzb2FwLT5sYWJsZW4gLSBrICsgaSk7CisgICAgICAgICAgcCA9ICh1bnNpZ25lZCBjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzb2FwLT5sYWJsZW4gLSBrICsgaSk7CisJICBpZiAocCkKKwkgICAgbWVtY3B5KHAsIHNvYXAtPmxhYmJ1Ziwgc29hcC0+bGFibGVuIC0gayArIGkpOworICAgICAgICAgIGlmIChjID49IDApCisgICAgICAgICAgeyB3aGlsZSAoKGludCkoKGMgPSBzb2FwX2dldChzb2FwKSkgIT0gRU9GKSAmJiBjICE9IFNPQVBfTFQgJiYgYyAhPSBTT0FQX1RUKQorICAgICAgICAgICAgICA7CisJICB9CisgICAgICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgfQorICAgICAgICBjIC09ICcrJzsKKyAgICAgICAgaWYgKGMgPj0gMCAmJiBjIDw9IDc5KQorICAgICAgICB7IG0gPSAobSA8PCA2KSArIHNvYXBfYmFzZTY0aVtjXTsKKyAgICAgICAgICBqKys7CisgICAgICAgIH0KKyAgICAgIH0gd2hpbGUgKGogPCA0KTsKKyAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gMTYpICYgMHhGRik7CisgICAgICAqcysrID0gKGNoYXIpKChtID4+IDgpICYgMHhGRik7CisgICAgICAqcysrID0gKGNoYXIpKG0gJiAweEZGKTsKKyAgICB9CisgIH0KKyNlbHNlCisgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgZm9yICg7OykKKyAgeyByZWdpc3RlciBpbnQgaTsKKyAgICByZWdpc3RlciBjaGFyICpzID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCAzICogU09BUF9CTEtMRU4pOyAvKiBtdXN0IGJlIG11bHRpcGxlIG9mIDMgKi8KKyAgICBpZiAoIXMpCisgICAgeyBzb2FwX2VuZF9ibG9jayhzb2FwKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgU09BUF9CTEtMRU47IGkrKykKKyAgICB7IHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbSA9IDA7CisgICAgICByZWdpc3RlciBpbnQgaiA9IDA7CisgICAgICBkbworICAgICAgeyByZWdpc3RlciBzb2FwX3djaGFyIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgICAgICAgaWYgKGMgPT0gJz0nIHx8IGMgPCAwKQorICAgICAgICB7IHVuc2lnbmVkIGNoYXIgKnA7CisgICAgICAgICAgaSAqPSAzOworICAgICAgICAgIHN3aXRjaCAoaikKKyAgICAgICAgICB7IGNhc2UgMjoKKyAgICAgICAgICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiA0KSAmIDB4RkYpOworICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAqcysrID0gKGNoYXIpKChtID4+IDEwKSAmIDB4RkYpOworICAgICAgICAgICAgICAqcysrID0gKGNoYXIpKChtID4+IDIpICYgMHhGRik7CisgICAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG4pCisJICAgICpuID0gKGludClzb2FwX3NpemVfYmxvY2soc29hcCwgaSk7CisgICAgICAgICAgcCA9ICh1bnNpZ25lZCBjaGFyKilzb2FwX3NhdmVfYmxvY2soc29hcCwgTlVMTCwgMCk7CisgICAgICAgICAgaWYgKGMgPj0gMCkKKyAgICAgICAgICB7IHdoaWxlICgoaW50KSgoYyA9IHNvYXBfZ2V0KHNvYXApKSAhPSBFT0YpICYmIGMgIT0gU09BUF9MVCAmJiBjICE9IFNPQVBfVFQpCisgICAgICAgICAgICAgIDsKKwkgIH0KKyAgICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICAgIHJldHVybiBwOworICAgICAgICB9CisgICAgICAgIGMgLT0gJysnOworICAgICAgICBpZiAoYyA+PSAwICYmIGMgPD0gNzkpCisgICAgICAgIHsgbSA9IChtIDw8IDYpICsgc29hcF9iYXNlNjRpW2NdOworICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAoaiA8IDQpOworICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiAxNikgJiAweEZGKTsKKyAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gOCkgJiAweEZGKTsKKyAgICAgICpzKysgPSAoY2hhcikobSAmIDB4RkYpOworICAgIH0KKyAgfQorI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfeG9wX2ZvcndhcmQoc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIGNoYXIgKipwdHIsIGludCAqc2l6ZSwgY2hhciAqKmlkLCBjaGFyICoqdHlwZSwgY2hhciAqKm9wdGlvbnMpCit7IC8qIENoZWNrIE1UT00geG9wOkluY2x1ZGUgZWxlbWVudCAod2l0aGluIGhleC9iYXNlNjRCaW5hcnkpICovCisgIC8qIFRPRE86IHRoaXMgY29kZSB0byBiZSBvYnNvbGV0ZWQgd2l0aCBuZXcgaW1wb3J0L3hvcC5oIGNvbnZlbnRpb25zICovCisgIGludCBib2R5ID0gc29hcC0+Ym9keTsgLyogc2hvdWxkIHNhdmUgdHlwZSB0b28/ICovCisgIGlmICghc29hcF9wZWVrX2VsZW1lbnQoc29hcCkpCisgIHsgaWYgKCFzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgInhvcDpJbmNsdWRlIiwgMCkgJiYgKnNvYXAtPmhyZWYpCisgICAgeyBpZiAoc29hcF9kaW1lX2ZvcndhcmQoc29hcCwgcHRyLCBzaXplLCBpZCwgdHlwZSwgb3B0aW9ucykpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCBOVUxMKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBzb2FwLT5ib2R5ID0gYm9keTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9kaW1lX2ZvcndhcmQoc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIGNoYXIgKipwdHIsIGludCAqc2l6ZSwgY2hhciAqKmlkLCBjaGFyICoqdHlwZSwgY2hhciAqKm9wdGlvbnMpCit7IHN0cnVjdCBzb2FwX3hsaXN0ICp4cCA9IChzdHJ1Y3Qgc29hcF94bGlzdCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX3hsaXN0KSk7CisgICpwdHIgPSBOVUxMOworICAqc2l6ZSA9IDA7CisgICppZCA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPmhyZWYpOworICAqdHlwZSA9IE5VTEw7CisgICpvcHRpb25zID0gTlVMTDsKKyAgaWYgKCF4cCkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgeHAtPm5leHQgPSBzb2FwLT54bGlzdDsKKyAgeHAtPnB0ciA9IHB0cjsKKyAgeHAtPnNpemUgPSBzaXplOworICB4cC0+aWQgPSAqaWQ7CisgIHhwLT50eXBlID0gdHlwZTsKKyAgeHAtPm9wdGlvbnMgPSBvcHRpb25zOworICBzb2FwLT54bGlzdCA9IHhwOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3N0cmR1cChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcykKK3sgY2hhciAqdCA9IE5VTEw7CisgIGlmIChzICYmICh0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihzKSArIDEpKSkKKyAgICBzdHJjcHkodCwgcyk7CisgIHJldHVybiB0OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX25ld19ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfYmxpc3QgKnA7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTmV3IGJsb2NrIHNlcXVlbmNlIChwcmV2PSVwKVxuIiwgc29hcC0+Ymxpc3QpKTsKKyAgaWYgKCEocCA9IChzdHJ1Y3Qgc29hcF9ibGlzdCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2JsaXN0KSkpKQorICAgIHJldHVybiBTT0FQX0VPTTsgICAKKyAgcC0+bmV4dCA9IHNvYXAtPmJsaXN0OyAKKyAgcC0+cHRyID0gTlVMTDsKKyAgcC0+c2l6ZSA9IDA7CisgIHNvYXAtPmJsaXN0ID0gcDsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkKgorU09BUF9GTUFDMgorc29hcF9wdXNoX2Jsb2NrKHN0cnVjdCBzb2FwICpzb2FwLCBzaXplX3QgbikKK3sgY2hhciAqcDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQdXNoIGJsb2NrIG9mICV1IGJ5dGVzICgldSBieXRlcyB0b3RhbClcbiIsICh1bnNpZ25lZCBpbnQpbiwgKHVuc2lnbmVkIGludClzb2FwLT5ibGlzdC0+c2l6ZSArICh1bnNpZ25lZCBpbnQpbikpOworICBpZiAoIShwID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIG4gKyBzaXplb2YoY2hhciopICsgc2l6ZW9mKHNpemVfdCkpKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHJldHVybiBOVUxMOworICB9CisgICooY2hhcioqKXAgPSBzb2FwLT5ibGlzdC0+cHRyOworICAqKHNpemVfdCopKHAgKyBzaXplb2YoY2hhciopKSA9IG47CisgIHNvYXAtPmJsaXN0LT5wdHIgPSBwOworICBzb2FwLT5ibGlzdC0+c2l6ZSArPSBuOworICByZXR1cm4gcCArIHNpemVvZihjaGFyKikgKyBzaXplb2Yoc2l6ZV90KTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfcG9wX2Jsb2NrKHN0cnVjdCBzb2FwICpzb2FwKQoreyBjaGFyICpwOworICBpZiAoIXNvYXAtPmJsaXN0LT5wdHIpCisgICAgcmV0dXJuOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlBvcCBibG9ja1xuIikpOworICBwID0gc29hcC0+Ymxpc3QtPnB0cjsKKyAgc29hcC0+Ymxpc3QtPnNpemUgLT0gKihzaXplX3QqKShwICsgc2l6ZW9mKGNoYXIqKSk7CisgIHNvYXAtPmJsaXN0LT5wdHIgPSAqKGNoYXIqKilwOworICBTT0FQX0ZSRUUoc29hcCwgcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQKK3NvYXBfdXBkYXRlX3B0cnMoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnN0YXJ0LCBjaGFyICplbmQsIGNoYXIgKnAxLCBjaGFyICpwMikKK3sgaW50IGk7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZmxpc3QgKmZwOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICByZWdpc3RlciBzdHJ1Y3Qgc29hcF94bGlzdCAqeHA7CisjZW5kaWYKKyAgcmVnaXN0ZXIgdm9pZCAqcCwgKipxOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9JREhBU0g7IGkrKykKKyAgeyBmb3IgKGlwID0gc29hcC0+aWh0W2ldOyBpcDsgaXAgPSBpcC0+bmV4dCkKKyAgICB7IGlmIChpcC0+cHRyICYmIChjaGFyKilpcC0+cHRyID49IHN0YXJ0ICYmIChjaGFyKilpcC0+cHRyIDwgZW5kKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVwZGF0ZSBpZD0nJXMnICVwIC0+ICVwXG4iLCBpcC0+aWQsIGlwLT5wdHIsIChjaGFyKilpcC0+cHRyICsgKHAxLXAyKSkpOworICAgICAgICBpcC0+cHRyID0gKGNoYXIqKWlwLT5wdHIgKyAocDEtcDIpOworICAgICAgfQorICAgICAgZm9yIChxID0gJmlwLT5saW5rOyBxOyBxID0gKHZvaWQqKilwKQorICAgICAgeyBwID0gKnE7CisgICAgICAgIGlmIChwICYmIChjaGFyKilwID49IHN0YXJ0ICYmIChjaGFyKilwIDwgZW5kKQorICAgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTGluayB1cGRhdGUgaWQ9JyVzJyAlcFxuIiwgaXAtPmlkLCBwKSk7CisgICAgICAgICAgKnEgPSAoY2hhciopcCArIChwMS1wMik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZvciAocSA9ICZpcC0+Y29weTsgcTsgcSA9ICh2b2lkKiopcCkKKyAgICAgIHsgcCA9ICpxOworICAgICAgICBpZiAocCAmJiAoY2hhciopcCA+PSBzdGFydCAmJiAoY2hhciopcCA8IGVuZCkKKyAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHkgY2hhaW4gdXBkYXRlIGlkPSclcycgJXBcbiIsIGlwLT5pZCwgcCkpOworICAgICAgICAgICpxID0gKGNoYXIqKXAgKyAocDEtcDIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBmb3IgKGZwID0gaXAtPmZsaXN0OyBmcDsgZnAgPSBmcC0+bmV4dCkKKyAgICAgIHsgaWYgKChjaGFyKilmcC0+cHRyID49IHN0YXJ0ICYmIChjaGFyKilmcC0+cHRyIDwgZW5kKQorICAgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weSBsaXN0IHVwZGF0ZSBpZD0nJXMnICVwXG4iLCBpcC0+aWQsIGZwKSk7CisgICAgICAgICAgZnAtPnB0ciA9IChjaGFyKilmcC0+cHRyICsgKHAxLXAyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBmb3IgKHhwID0gc29hcC0+eGxpc3Q7IHhwOyB4cCA9IHhwLT5uZXh0KQorICB7IGlmICh4cC0+cHRyICYmIChjaGFyKil4cC0+cHRyID49IHN0YXJ0ICYmIChjaGFyKil4cC0+cHRyIDwgZW5kKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVcGRhdGUgaWQ9JyVzJyAlcCAtPiAlcFxuIiwgeHAtPmlkP3hwLT5pZDoiIiwgeHAtPnB0ciwgKGNoYXIqKXhwLT5wdHIgKyAocDEtcDIpKSk7CisgICAgICB4cC0+cHRyID0gKHVuc2lnbmVkIGNoYXIqKikoKGNoYXIqKXhwLT5wdHIgKyAocDEtcDIpKTsKKyAgICAgIHhwLT5zaXplID0gKGludCopKChjaGFyKil4cC0+c2l6ZSArIChwMS1wMikpOworICAgICAgeHAtPnR5cGUgPSAoY2hhcioqKSgoY2hhciopeHAtPnR5cGUgKyAocDEtcDIpKTsKKyAgICAgIHhwLT5vcHRpb25zID0gKGNoYXIqKikoKGNoYXIqKXhwLT5vcHRpb25zICsgKHAxLXAyKSk7CisgICAgfQorICB9CisjZW5kaWYKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NvYXBfaGFzX2NvcGllcyhzdHJ1Y3Qgc29hcCAqc29hcCwgcmVnaXN0ZXIgY29uc3QgY2hhciAqc3RhcnQsIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKmVuZCkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZmxpc3QgKmZwOworICByZWdpc3RlciBjb25zdCBjaGFyICpwOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9JREhBU0g7IGkrKykKKyAgeyBmb3IgKGlwID0gc29hcC0+aWh0W2ldOyBpcDsgaXAgPSBpcC0+bmV4dCkKKyAgICB7IGZvciAocCA9IChjb25zdCBjaGFyKilpcC0+Y29weTsgcDsgcCA9ICooY29uc3QgY2hhcioqKXApCisgICAgICAgIGlmIChwID49IHN0YXJ0ICYmIHAgPCBlbmQpCisgICAgICAgICAgcmV0dXJuIFNPQVBfRVJSOworICAgICAgZm9yIChmcCA9IGlwLT5mbGlzdDsgZnA7IGZwID0gZnAtPm5leHQpCisgICAgICAgIGlmICgoY29uc3QgY2hhciopZnAtPnB0ciA+PSBzdGFydCAmJiAoY29uc3QgY2hhciopZnAtPnB0ciA8IGVuZCkKKwkgIHJldHVybiBTT0FQX0VSUjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVzb2x2ZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZmxpc3QgKmZwOworICBzaG9ydCBmbGFnOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc29sdmluZyBmb3J3YXJkZWQgZGF0YVxuIikpOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9JREhBU0g7IGkrKykKKyAgeyBmb3IgKGlwID0gc29hcC0+aWh0W2ldOyBpcDsgaXAgPSBpcC0+bmV4dCkKKyAgICB7IGlmIChpcC0+cHRyKQorICAgICAgeyByZWdpc3RlciB2b2lkICpwLCAqKnEsICpyOworICAgICAgICBxID0gKHZvaWQqKilpcC0+bGluazsKKyAgICAgICAgaXAtPmxpbmsgPSBOVUxMOworICAgICAgICByID0gaXAtPnB0cjsKKyAgICAgICAgREJHTE9HKFRFU1QsIGlmIChxKSBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVHJhdmVyc2luZyBsaW5rIGNoYWluIHRvIHJlc29sdmUgaWQ9JyVzJ1xuIiwgaXAtPmlkKSk7CisgICAgICAgIHdoaWxlIChxKQorICAgICAgICB7IHAgPSAqcTsKKyAgICAgICAgICAqcSA9IHI7CisgICAgICAgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIi4uLiBsaW5rICVwIC0+ICVwXG4iLCBxLCByKSk7CisgICAgICAgICAgcSA9ICh2b2lkKiopcDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSBpZiAoKmlwLT5pZCA9PSAnIycpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTWlzc2luZyBkYXRhIGZvciBpZD0nJXMnXG4iLCBpcC0+aWQpKTsKKyAgICAgICAgc3RyY3B5KHNvYXAtPmlkLCBpcC0+aWQgKyAxKTsKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9NSVNTSU5HX0lEOworICAgICAgfQorICAgIH0KKyAgfQorICBkbworICB7IGZsYWcgPSAwOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x1dGlvbiBwaGFzZVxuIikpOworICAgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0lESEFTSDsgaSsrKQorICAgIHsgZm9yIChpcCA9IHNvYXAtPmlodFtpXTsgaXA7IGlwID0gaXAtPm5leHQpCisgICAgICB7IGlmIChpcC0+cHRyICYmICFzb2FwX2hhc19jb3BpZXMoc29hcCwgKGNvbnN0IGNoYXIqKWlwLT5wdHIsIChjb25zdCBjaGFyKilpcC0+cHRyICsgaXAtPnNpemUpKQorICAgICAgICB7IGlmIChpcC0+Y29weSkKKyAgICAgICAgICB7IHJlZ2lzdGVyIHZvaWQgKnAsICoqcSA9ICh2b2lkKiopaXAtPmNvcHk7CisgICAgICAgICAgICBEQkdMT0coVEVTVCwgaWYgKHEpIFNPQVBfTUVTU0FHRShmZGVidWcsICJUcmF2ZXJzaW5nIGNvcHkgY2hhaW4gdG8gcmVzb2x2ZSBpZD0nJXMnXG4iLCBpcC0+aWQpKTsKKyAgICAgICAgICAgIGlwLT5jb3B5ID0gTlVMTDsKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiLi4uIGNvcHkgJXAgLT4gJXAgKCV1IGJ5dGVzKVxuIiwgaXAtPnB0ciwgcSwgKHVuc2lnbmVkIGludClpcC0+c2l6ZSkpOworCSAgICAgIHAgPSAqcTsKKyAgICAgICAgICAgICAgbWVtY3B5KHEsIGlwLT5wdHIsIGlwLT5zaXplKTsKKyAgICAgICAgICAgICAgcSA9ICh2b2lkKiopcDsKKyAgICAgICAgICAgIH0gd2hpbGUgKHEpOworCSAgICBmbGFnID0gMTsKKwkgIH0KKyAgICAgICAgICBmb3IgKGZwID0gaXAtPmZsaXN0OyBmcDsgZnAgPSBpcC0+Zmxpc3QpCisgICAgICAgICAgeyByZWdpc3RlciB1bnNpZ25lZCBpbnQgayA9IGZwLT5sZXZlbDsKKwkgICAgcmVnaXN0ZXIgdm9pZCAqcCA9IGlwLT5wdHI7CisgICAgICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc29sdmluZyBmb3J3YXJkZWQgZGF0YSB0eXBlPSVkIGxvY2F0aW9uPSVwIGxldmVsPSV1LCV1IGlkPSclcydcbiIsIGlwLT50eXBlLCBwLCBpcC0+bGV2ZWwsIGZwLT5sZXZlbCwgaXAtPmlkKSk7CisJICAgIHdoaWxlIChpcC0+bGV2ZWwgPCBrKQorICAgICAgICAgICAgeyByZWdpc3RlciB2b2lkICoqcSA9ICh2b2lkKiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHZvaWQqKSk7ICAKKwkgICAgICBpZiAoIXEpCisJICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisJICAgICAgKnEgPSBwOworICAgICAgICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlc2NlbmRpbmcgb25lIGxldmVsLCBuZXcgbG9jYXRpb249JXAgaG9sZHM9JXAuLi5cbiIsIHEsICpxKSk7CisgICAgICAgICAgICAgIHAgPSAodm9pZCopcTsKKyAgICAgICAgICAgICAgay0tOworICAgICAgICAgICAgfQorCSAgICBpZiAoZnAtPmZjb3B5KQorCSAgICAgIGZwLT5mY29weShzb2FwLCBpcC0+dHlwZSwgZnAtPnR5cGUsIGZwLT5wdHIsIGZwLT5sZW4sIHAsIGlwLT5zaXplKTsKKwkgICAgZWxzZQorCSAgICAgIHNvYXBfZmNvcHkoc29hcCwgaXAtPnR5cGUsIGZwLT50eXBlLCBmcC0+cHRyLCBmcC0+bGVuLCBwLCBpcC0+c2l6ZSk7CisJICAgIGlwLT5mbGlzdCA9IGZwLT5uZXh0OworCSAgICBTT0FQX0ZSRUUoc29hcCwgZnApOworCSAgICBmbGFnID0gMTsKKwkgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSB3aGlsZSAoZmxhZyk7CisjaWZkZWYgU09BUF9ERUJVRworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9JREhBU0g7IGkrKykKKyAgeyBmb3IgKGlwID0gc29hcC0+aWh0W2ldOyBpcDsgaXAgPSBpcC0+bmV4dCkKKyAgICB7IGlmIChpcC0+Y29weSB8fCBpcC0+Zmxpc3QpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x1dGlvbiBlcnJvcjogZm9yd2FyZGVkIGRhdGEgZm9yIGlkPSclcycgY291bGQgbm90IGJlIHByb3BhZ2F0ZWQsIHBsZWFzZSByZXBvcnQgdGhpcyBwcm9ibGVtIHRvIHRoZSBkZXZlbG9wZXJzXG4iLCBpcC0+aWQpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyNlbmRpZgorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc29sdXRpb24gZG9uZVxuIikpOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc2l6ZV90CitTT0FQX0ZNQUMyCitzb2FwX3NpemVfYmxvY2soc3RydWN0IHNvYXAgKnNvYXAsIHNpemVfdCBuKQoreyBpZiAoc29hcC0+Ymxpc3QtPnB0cikKKyAgeyBzb2FwLT5ibGlzdC0+c2l6ZSAtPSAqKHNpemVfdCopKHNvYXAtPmJsaXN0LT5wdHIgKyBzaXplb2YoY2hhciopKSAtIG47CisgICAgKihzaXplX3QqKShzb2FwLT5ibGlzdC0+cHRyICsgc2l6ZW9mKGNoYXIqKSkgPSBuOworICB9CisgIHJldHVybiBzb2FwLT5ibGlzdC0+c2l6ZTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2ZpcnN0X2Jsb2NrKHN0cnVjdCBzb2FwICpzb2FwKQoreyBjaGFyICpwLCAqcSwgKnI7CisgIHAgPSBzb2FwLT5ibGlzdC0+cHRyOworICBpZiAoIXApCisgICAgcmV0dXJuIE5VTEw7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRmlyc3QgYmxvY2tcbiIpKTsKKyAgciA9IE5VTEw7CisgIGRvCisgIHsgcSA9ICooY2hhcioqKXA7CisgICAgKihjaGFyKiopcCA9IHI7CisgICAgciA9IHA7CisgICAgcCA9IHE7CisgIH0gd2hpbGUgKHApOworICBzb2FwLT5ibGlzdC0+cHRyID0gcjsKKyAgcmV0dXJuIHIgKyBzaXplb2YoY2hhciopICsgc2l6ZW9mKHNpemVfdCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjaGFyKgorU09BUF9GTUFDMgorc29hcF9uZXh0X2Jsb2NrKHN0cnVjdCBzb2FwICpzb2FwKQoreyBjaGFyICpwOworICBwID0gc29hcC0+Ymxpc3QtPnB0cjsKKyAgaWYgKHApCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJOZXh0IGJsb2NrXG4iKSk7CisgICAgc29hcC0+Ymxpc3QtPnB0ciA9ICooY2hhcioqKXA7CisgICAgU09BUF9GUkVFKHNvYXAsIHApOworICAgIGlmIChzb2FwLT5ibGlzdC0+cHRyKQorICAgICAgcmV0dXJuIHNvYXAtPmJsaXN0LT5wdHIgKyBzaXplb2YoY2hhciopICsgc2l6ZW9mKHNpemVfdCk7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzaXplX3QKK1NPQVBfRk1BQzIKK3NvYXBfYmxvY2tfc2l6ZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmV0dXJuICooc2l6ZV90Kikoc29hcC0+Ymxpc3QtPnB0ciArIHNpemVvZihjaGFyKikpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9lbmRfYmxvY2soc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX2JsaXN0ICpicDsKKyAgY2hhciAqcCwgKnE7CisgIGJwID0gc29hcC0+Ymxpc3Q7CisgIGlmIChicCkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBvZiBibG9jayBzZXF1ZW5jZSwgZnJlZSBhbGwgcmVtYWluaW5nIGJsb2Nrc1xuIikpOworICAgIGZvciAocCA9IGJwLT5wdHI7IHA7IHAgPSBxKQorICAgIHsgcSA9ICooY2hhcioqKXA7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgcCk7CisgICAgfQorICAgIHNvYXAtPmJsaXN0ID0gYnAtPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIGJwKTsKKyAgfQorICBEQkdMT0coVEVTVCwgaWYgKHNvYXAtPmJsaXN0KSBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzdG9yZSBwcmV2aW91cyBibG9jayBzZXF1ZW5jZVxuIikpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfc2F2ZV9ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqcCwgaW50IGZsYWcpCit7IHJlZ2lzdGVyIHNpemVfdCBuOworICByZWdpc3RlciBjaGFyICpxLCAqczsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTYXZlIGFsbCBibG9ja3MgaW4gY29udGlndW91cyBtZW1vcnkgc3BhY2Ugb2YgJXUgYnl0ZXMgKCVwLT4lcClcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+Ymxpc3QtPnNpemUsIHNvYXAtPmJsaXN0LT5wdHIsIHApKTsKKyAgaWYgKHNvYXAtPmJsaXN0LT5zaXplKQorICB7IGlmICghcCkKKyAgICAgIHAgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc29hcC0+Ymxpc3QtPnNpemUpOworICAgIGlmIChwKQorICAgIHsgZm9yIChzID0gcCwgcSA9IHNvYXBfZmlyc3RfYmxvY2soc29hcCk7IHE7IHEgPSBzb2FwX25leHRfYmxvY2soc29hcCkpCisgICAgICB7IG4gPSBzb2FwX2Jsb2NrX3NpemUoc29hcCk7CisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICAgICAgICBpZiAoZmxhZykKKwkgIHNvYXBfdXBkYXRlX3B0cnMoc29hcCwgcSwgcSArIG4sIHMsIHEpOworI2VuZGlmCisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weSAldSBieXRlcyBmcm9tICVwIHRvICVwXG4iLCAodW5zaWduZWQgaW50KW4sIHEsIHMpKTsKKyAgICAgICAgbWVtY3B5KHMsIHEsIG4pOworICAgICAgICBzICs9IG47CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgIH0KKyAgc29hcF9lbmRfYmxvY2soc29hcCk7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3B1dHNpemUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBzaXplKQoreyByZXR1cm4gc29hcF9wdXRzaXplcyhzb2FwLCB0eXBlLCAmc2l6ZSwgMSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfcHV0c2l6ZXMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGludCAqc2l6ZSwgaW50IGRpbSkKK3sgcmV0dXJuIHNvYXBfcHV0c2l6ZXNvZmZzZXRzKHNvYXAsIHR5cGUsIHNpemUsIE5VTEwsIGRpbSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfcHV0c2l6ZXNvZmZzZXRzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBpbnQgKnNpemUsIGNvbnN0IGludCAqb2Zmc2V0LCBpbnQgZGltKQoreyBpbnQgaTsKKyAgaWYgKCF0eXBlKQorICAgIHJldHVybiBOVUxMOworICBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICB7IHNwcmludGYoc29hcC0+dHlwZSwgIiVzWyVkIiwgdHlwZSwgc2l6ZVswXSk7CisgICAgZm9yIChpID0gMTsgaSA8IGRpbTsgaSsrKQorICAgICAgc3ByaW50Zihzb2FwLT50eXBlICsgc3RybGVuKHNvYXAtPnR5cGUpLCAiICVkIiwgc2l6ZVtpXSk7CisgIH0KKyAgZWxzZQorICB7IGlmIChvZmZzZXQpCisgICAgeyBzcHJpbnRmKHNvYXAtPnR5cGUsICIlc1slZCIsIHR5cGUsIHNpemVbMF0gKyBvZmZzZXRbMF0pOworICAgICAgZm9yIChpID0gMTsgaSA8IGRpbTsgaSsrKQorICAgICAgICBzcHJpbnRmKHNvYXAtPnR5cGUgKyBzdHJsZW4oc29hcC0+dHlwZSksICIsJWQiLCBzaXplW2ldICsgb2Zmc2V0W2ldKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgc3ByaW50Zihzb2FwLT50eXBlLCAiJXNbJWQiLCB0eXBlLCBzaXplWzBdKTsKKyAgICAgIGZvciAoaSA9IDE7IGkgPCBkaW07IGkrKykKKyAgICAgICAgc3ByaW50Zihzb2FwLT50eXBlICsgc3RybGVuKHNvYXAtPnR5cGUpLCAiLCVkIiwgc2l6ZVtpXSk7CisgICAgfQorICAgIHN0cmNhdChzb2FwLT50eXBlLCAiXSIpOworICB9CisgIHJldHVybiBzb2FwLT50eXBlOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3B1dG9mZnNldChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG9mZnNldCkKK3sgcmV0dXJuIHNvYXBfcHV0b2Zmc2V0cyhzb2FwLCAmb2Zmc2V0LCAxKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9wdXRvZmZzZXRzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBpbnQgKm9mZnNldCwgaW50IGRpbSkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHNwcmludGYoc29hcC0+YXJyYXlPZmZzZXQsICJbJWQiLCBvZmZzZXRbMF0pOworICBmb3IgKGkgPSAxOyBpIDwgZGltOyBpKyspCisgICAgc3ByaW50Zihzb2FwLT5hcnJheU9mZnNldCArIHN0cmxlbihzb2FwLT5hcnJheU9mZnNldCksICIsJWQiLCBvZmZzZXRbaV0pOworICBzdHJjYXQoc29hcC0+YXJyYXlPZmZzZXQsICJdIik7CisgIHJldHVybiBzb2FwLT5hcnJheU9mZnNldDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zaXplKGNvbnN0IGludCAqc2l6ZSwgaW50IGRpbSkKK3sgcmVnaXN0ZXIgaW50IGksIG4gPSBzaXplWzBdOworICBmb3IgKGkgPSAxOyBpIDwgZGltOyBpKyspCisgICAgbiAqPSBzaXplW2ldOworICByZXR1cm4gbjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRvZmZzZXRzKGNvbnN0IGNoYXIgKmF0dHIsIGNvbnN0IGludCAqc2l6ZSwgaW50ICpvZmZzZXQsIGludCBkaW0pCit7IHJlZ2lzdGVyIGludCBpLCBqID0gMDsKKyAgaWYgKG9mZnNldCkKKyAgICBmb3IgKGkgPSAwOyBpIDwgZGltICYmIGF0dHIgJiYgKmF0dHI7IGkrKykKKyAgICB7IGF0dHIrKzsKKyAgICAgIGogKj0gc2l6ZVtpXTsKKyAgICAgIGogKz0gb2Zmc2V0W2ldID0gKGludClhdG9sKGF0dHIpOworICAgICAgYXR0ciA9IHN0cmNocihhdHRyLCAnLCcpOworICAgIH0KKyAgZWxzZQorICAgIGZvciAoaSA9IDA7IGkgPCBkaW0gJiYgYXR0ciAmJiAqYXR0cjsgaSsrKQorICAgIHsgYXR0cisrOworICAgICAgaiAqPSBzaXplW2ldOworICAgICAgaiArPSAoaW50KWF0b2woYXR0cik7CisgICAgICBhdHRyID0gc3RyY2hyKGF0dHIsICcsJyk7CisgICAgfQorICByZXR1cm4gajsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRzaXplKGNvbnN0IGNoYXIgKmF0dHIxLCBjb25zdCBjaGFyICphdHRyMiwgaW50ICpqKQoreyByZWdpc3RlciBpbnQgbiwgazsKKyAgY2hhciAqczsKKyAgKmogPSAwOworICBpZiAoISphdHRyMSkKKyAgICByZXR1cm4gLTE7CisgIGlmICgqYXR0cjEgPT0gJ1snKQorICAgIGF0dHIxKys7CisgIG4gPSAxOworICBmb3IgKDs7KQorICB7IGsgPSAoaW50KXNvYXBfc3RydG9sKGF0dHIxLCAmcywgMTApOworICAgIG4gKj0gazsKKyAgICBpZiAoayA8IDAgfHwgbiA+IFNPQVBfTUFYQVJSQVlTSVpFIHx8IHMgPT0gYXR0cjEpCisgICAgICByZXR1cm4gLTE7CisgICAgYXR0cjEgPSBzdHJjaHIocywgJywnKTsKKyAgICBpZiAoIWF0dHIxKQorICAgICAgYXR0cjEgPSBzdHJjaHIocywgJyAnKTsKKyAgICBpZiAoYXR0cjIgJiYgKmF0dHIyKQorICAgIHsgYXR0cjIrKzsKKyAgICAgICpqICo9IGs7CisgICAgICBrID0gKGludClzb2FwX3N0cnRvbChhdHRyMiwgJnMsIDEwKTsKKyAgICAgICpqICs9IGs7CisgICAgICBpZiAoayA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGF0dHIyID0gczsKKyAgICB9CisgICAgaWYgKCFhdHRyMSkKKyAgICAgIGJyZWFrOworICAgIGF0dHIxKys7CisgIH0KKyAgcmV0dXJuIG4gLSAqajsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRzaXplcyhjb25zdCBjaGFyICphdHRyLCBpbnQgKnNpemUsIGludCBkaW0pCit7IHJlZ2lzdGVyIGludCBpLCBrLCBuOworICBpZiAoISphdHRyKQorICAgIHJldHVybiAtMTsKKyAgaSA9IHN0cmxlbihhdHRyKTsKKyAgbiA9IDE7CisgIGRvCisgIHsgZm9yIChpID0gaS0xOyBpID49IDA7IGktLSkKKyAgICAgIGlmIChhdHRyW2ldID09ICdbJyB8fCBhdHRyW2ldID09ICcsJyB8fCBhdHRyW2ldID09ICcgJykKKyAgICAgICAgYnJlYWs7CisgICAgayA9IChpbnQpYXRvbChhdHRyICsgaSArIDEpOworICAgIG4gKj0gc2l6ZVstLWRpbV0gPSBrOworICAgIGlmIChrIDwgMCB8fCBuID4gU09BUF9NQVhBUlJBWVNJWkUpCisgICAgICByZXR1cm4gLTE7CisgIH0gd2hpbGUgKGkgPj0gMCAmJiBhdHRyW2ldICE9ICdbJyk7CisgIHJldHVybiBuOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldHBvc2l0aW9uKGNvbnN0IGNoYXIgKmF0dHIsIGludCAqcG9zKQoreyByZWdpc3RlciBpbnQgaSwgbjsKKyAgaWYgKCEqYXR0cikKKyAgICByZXR1cm4gLTE7CisgIG4gPSAwOworICBpID0gMTsKKyAgZG8KKyAgeyBwb3NbbisrXSA9IChpbnQpYXRvbChhdHRyICsgaSk7CisgICAgd2hpbGUgKGF0dHJbaV0gJiYgYXR0cltpXSAhPSAnLCcgJiYgYXR0cltpXSAhPSAnXScpCisgICAgICBpKys7CisgICAgaWYgKGF0dHJbaV0gPT0gJywnKQorICAgICAgaSsrOworICB9IHdoaWxlIChuIDwgU09BUF9NQVhESU1TICYmIGF0dHJbaV0gJiYgYXR0cltpXSAhPSAnXScpOworICByZXR1cm4gbjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXNoX25hbWVzcGFjZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKm5zKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnA7CisgIHJlZ2lzdGVyIHN0cnVjdCBOYW1lc3BhY2UgKnA7CisgIHJlZ2lzdGVyIHNob3J0IGkgPSAtMTsKKyAgcmVnaXN0ZXIgc2l6ZV90IG4sIGs7CisgIG4gPSBzdHJsZW4oaWQpOworICBrID0gc3RybGVuKG5zKSArIDE7CisgIHAgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzOworICBpZiAocCkKKyAgeyBmb3IgKGkgPSAwOyBwLT5pZDsgcCsrLCBpKyspCisgICAgeyBpZiAocC0+bnMgJiYgIXN0cmNtcChucywgcC0+bnMpKQorICAgICAgeyBpZiAocC0+b3V0KQorICAgICAgICB7IFNPQVBfRlJFRShzb2FwLCBwLT5vdXQpOworICAgICAgICAgIHAtPm91dCA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAocC0+b3V0KQorICAgICAgeyBpZiAoIXN0cmNtcChucywgcC0+b3V0KSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHAtPmluKQorICAgICAgeyBpZiAoIXNvYXBfdGFnX2NtcChucywgcC0+aW4pKQorICAgICAgICB7IGlmICgocC0+b3V0ID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIGspKSkKKyAgICAgICAgICAgIHN0cmNweShwLT5vdXQsIG5zKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAoIXAgfHwgIXAtPmlkKQorICAgICAgaSA9IC0xOworICB9CisgIGlmIChpID49IDApCisgICAgayA9IDA7CisgIG5wID0gKHN0cnVjdCBzb2FwX25saXN0KilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfbmxpc3QpICsgbiArIGspOworICBpZiAoIW5wKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICBucC0+bmV4dCA9IHNvYXAtPm5saXN0OworICBzb2FwLT5ubGlzdCA9IG5wOworICBucC0+bGV2ZWwgPSBzb2FwLT5sZXZlbDsKKyAgbnAtPmluZGV4ID0gaTsKKyAgc3RyY3B5KG5wLT5pZCwgaWQpOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlB1c2ggbmFtZXNwYWNlIGJpbmRpbmcgKGxldmVsPSV1KSAnJXMnICclcydcbiIsIHNvYXAtPmxldmVsLCBpZCwgbnMpKTsKKyAgaWYgKGkgPCAwKQorICB7IG5wLT5ucyA9IG5wLT5pZCArIG4gKyAxOworICAgIHN0cmNweShucC0+bnMsIG5zKTsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlB1c2ggTk9UIE9LOiBubyBtYXRjaCBmb3VuZCBmb3IgJyVzJyBpbiBuYW1lc3BhY2UgbWFwcGluZyB0YWJsZSAoYWRkZWQgdG8gc3RhY2sgYW55d2F5KVxuIiwgbnMpKTsKKyAgfQorICBlbHNlCisgIHsgbnAtPm5zID0gTlVMTDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlB1c2ggT0sgKCclcycgbWF0Y2hlcyAnJXMnIGluIG5hbWVzcGFjZSB0YWJsZSlcbiIsIGlkLCBwLT5pZCkpOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9wb3BfbmFtZXNwYWNlKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnA7CisgIHdoaWxlIChzb2FwLT5ubGlzdCAmJiBzb2FwLT5ubGlzdC0+bGV2ZWwgPj0gc29hcC0+bGV2ZWwpCisgIHsgbnAgPSBzb2FwLT5ubGlzdC0+bmV4dDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlBvcHBlZCBuYW1lc3BhY2UgYmluZGluZyAobGV2ZWw9JXUpICclcydcbiIsIHNvYXAtPmxldmVsLCBzb2FwLT5ubGlzdC0+aWQpKTsKKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+bmxpc3QpOworICAgIHNvYXAtPm5saXN0ID0gbnA7CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9tYXRjaF9uYW1lc3BhY2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkMSwgY29uc3QgY2hhciAqaWQyLCBpbnQgbjEsIGludCBuMikgCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucCA9IHNvYXAtPm5saXN0OworICB3aGlsZSAobnAgJiYgKHN0cm5jbXAobnAtPmlkLCBpZDEsIG4xKSB8fCBucC0+aWRbbjFdKSkKKyAgICBucCA9IG5wLT5uZXh0OworICBpZiAobnApCisgIHsgaWYgKG5wLT5pbmRleCA8IDAKKyAgICAgfHwgKHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbbnAtPmluZGV4XS5pZAorICAgICAgJiYgKHN0cm5jbXAoc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tucC0+aW5kZXhdLmlkLCBpZDIsIG4yKQorICAgICAgIHx8IHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbbnAtPmluZGV4XS5pZFtuMl0pKSkKKyAgICAgIHJldHVybiBTT0FQX05BTUVTUEFDRTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICBpZiAobjEgPT0gMyAmJiBuMSA9PSBuMiAmJiAhc3RyY21wKGlkMSwgInhtbCIpICYmICFzdHJjbXAoaWQxLCBpZDIpKQorICAgIHJldHVybiBTT0FQX09LOworICByZXR1cm4gU09BUF9TWU5UQVhfRVJST1I7IAorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfY3VycmVudF9uYW1lc3BhY2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZykKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wOworICByZWdpc3RlciBjb25zdCBjaGFyICpzOworICBucCA9IHNvYXAtPm5saXN0OworICBpZiAoIShzID0gc3RyY2hyKHRhZywgJzonKSkpCisgIHsgd2hpbGUgKG5wICYmICpucC0+aWQpIC8qIGZpbmQgZGVmYXVsdCBuYW1lc3BhY2UsIGlmIHByZXNlbnQgKi8KKyAgICAgIG5wID0gbnAtPm5leHQ7CisgIH0KKyAgZWxzZQorICB7IHdoaWxlIChucCAmJiAoc3RybmNtcChucC0+aWQsIHRhZywgcyAtIHRhZykgfHwgbnAtPmlkW3MgLSB0YWddKSkKKyAgICAgIG5wID0gbnAtPm5leHQ7CisgICAgaWYgKCFucCkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9OQU1FU1BBQ0U7CisgIH0KKyAgaWYgKG5wKQorICB7IGlmIChucC0+aW5kZXggPj0gMCkKKyAgICAgIHJldHVybiBzb2FwLT5uYW1lc3BhY2VzW25wLT5pbmRleF0ubnM7CisgICAgaWYgKG5wLT5ucykKKyAgICAgIHJldHVybiBzb2FwX3N0cmR1cChzb2FwLCBucC0+bnMpOworICB9CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3RhZ19jbXAoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqdCkKK3sgZm9yICg7OykKKyAgeyByZWdpc3RlciBpbnQgYzEgPSAqczsKKyAgICByZWdpc3RlciBpbnQgYzIgPSAqdDsKKyAgICBpZiAoIWMxIHx8IGMxID09ICciJykKKyAgICAgIGJyZWFrOworICAgIGlmIChjMiAhPSAnLScpCisgICAgeyBpZiAoYzEgIT0gYzIpCisgICAgICB7IGlmIChjMSA+PSAnQScgJiYgYzEgPD0gJ1onKQorICAgICAgICAgIGMxICs9ICdhJyAtICdBJzsKKyAgICAgICAgaWYgKGMyID49ICdBJyAmJiBjMiA8PSAnWicpCisgICAgICAgICAgYzIgKz0gJ2EnIC0gJ0EnOworICAgICAgfQorICAgICAgaWYgKGMxICE9IGMyKQorICAgICAgeyBpZiAoYzIgIT0gJyonKQorICAgICAgICAgIHJldHVybiAxOworCWMyID0gKisrdDsKKyAgICAgICAgaWYgKCFjMikKKwkgIHJldHVybiAwOworICAgICAgICBpZiAoYzIgPj0gJ0EnICYmIGMyIDw9ICdaJykKKyAgICAgICAgICBjMiArPSAnYScgLSAnQSc7CisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsgYzEgPSAqczsKKwkgIGlmICghYzEgfHwgYzEgPT0gJyInKQorCSAgICBicmVhazsKKwkgIGlmIChjMSA+PSAnQScgJiYgYzEgPD0gJ1onKQorICAgICAgICAgICAgYzEgKz0gJ2EnIC0gJ0EnOworICAgICAgICAgIGlmIChjMSA9PSBjMiAmJiAhc29hcF90YWdfY21wKHMgKyAxLCB0ICsgMSkpCisgICAgICAgICAgICByZXR1cm4gMDsKKwkgIHMrKzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgcysrOworICAgIHQrKzsKKyAgfQorICBpZiAoKnQgPT0gJyonICYmICF0WzFdKQorICAgIHJldHVybiAwOworICByZXR1cm4gKnQ7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfbWF0Y2hfdGFnKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcxLCBjb25zdCBjaGFyICp0YWcyKQoreyByZWdpc3RlciBjb25zdCBjaGFyICpzLCAqdDsKKyAgaWYgKCF0YWcxIHx8ICF0YWcyIHx8ICEqdGFnMikKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgcyA9IHN0cmNocih0YWcxLCAnOicpOworICB0ID0gc3RyY2hyKHRhZzIsICc6Jyk7CisgIGlmICh0KQorICB7IGlmIChzKQorICAgIHsgaWYgKHRbMV0gJiYgU09BUF9TVFJDTVAocyArIDEsIHQgKyAxKSkKKyAgICAgICAgcmV0dXJuIFNPQVBfVEFHX01JU01BVENIOworICAgICAgaWYgKHQgIT0gdGFnMiAmJiBzb2FwX21hdGNoX25hbWVzcGFjZShzb2FwLCB0YWcxLCB0YWcyLCBzIC0gdGFnMSwgdCAtIHRhZzIpKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlRhZ3MgJyVzJyBhbmQgJyVzJyBtYXRjaCBidXQgbmFtZXNwYWNlcyBkaWZmZXJcbiIsIHRhZzEsIHRhZzIpKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfVEFHX01JU01BVENIOworICAgICAgfQorICAgIH0gCisgICAgZWxzZSBpZiAoU09BUF9TVFJDTVAodGFnMSwgdCArIDEpKQorICAgICAgcmV0dXJuIFNPQVBfVEFHX01JU01BVENIOworICAgIGVsc2UgaWYgKHQgIT0gdGFnMiAmJiBzb2FwX21hdGNoX25hbWVzcGFjZShzb2FwLCB0YWcxLCB0YWcyLCAwLCB0IC0gdGFnMikpCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlRhZ3MgJyVzJyBhbmQgJyVzJyBtYXRjaCBidXQgbmFtZXNwYWNlcyBkaWZmZXJcbiIsIHRhZzEsIHRhZzIpKTsKKyAgICAgIHJldHVybiBTT0FQX1RBR19NSVNNQVRDSDsKKyAgICB9CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJUYWdzIGFuZCAoZGVmYXVsdCkgbmFtZXNwYWNlcyBtYXRjaDogJyVzJyAnJXMnXG4iLCB0YWcxLCB0YWcyKSk7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgaWYgKHMpCisgIHsgaWYgKFNPQVBfU1RSQ01QKHMgKyAxLCB0YWcyKSkKKyAgICAgIHJldHVybiBTT0FQX1RBR19NSVNNQVRDSDsKKyAgfQorICBlbHNlIGlmIChTT0FQX1NUUkNNUCh0YWcxLCB0YWcyKSkKKyAgICByZXR1cm4gU09BUF9UQUdfTUlTTUFUQ0g7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVGFncyBtYXRjaDogJyVzJyAnJXMnXG4iLCB0YWcxLCB0YWcyKSk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX21hdGNoX2FycmF5KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0eXBlKQoreyBpZiAoKnNvYXAtPmFycmF5VHlwZSkKKyAgICBpZiAoc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+YXJyYXlUeXBlLCB0eXBlKQorICAgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT5hcnJheVR5cGUsICJ4c2Q6YW55VHlwZSIpCisgICAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPmFycmF5VHlwZSwgInhzZDp1ci10eXBlIikKKyAgICApCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFycmF5IHR5cGUgbWlzbWF0Y2g6ICclcycgJyVzJ1xuIiwgc29hcC0+YXJyYXlUeXBlLCB0eXBlKSk7CisgICAgICByZXR1cm4gU09BUF9UQUdfTUlTTUFUQ0g7CisgICAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqCVNTTAorICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBXSVRIX09QRU5TU0wKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JhbmQoKQoreyB1bnNpZ25lZCBjaGFyIGJ1Zls0XTsKKyAgaWYgKCFzc2xfaW5pdF9kb25lKQorICAgIHNvYXBfc3NsX2luaXQoKTsKKyAgUkFORF9wc2V1ZG9fYnl0ZXMoYnVmLCA0KTsKKyAgcmV0dXJuICooaW50KilidWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc3NsX3NlcnZlcl9jb250ZXh0KHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBzaG9ydCBmbGFncywgY29uc3QgY2hhciAqa2V5ZmlsZSwgY29uc3QgY2hhciAqcGFzc3dvcmQsIGNvbnN0IGNoYXIgKmNhZmlsZSwgY29uc3QgY2hhciAqY2FwYXRoLCBjb25zdCBjaGFyICpkaGZpbGUsIGNvbnN0IGNoYXIgKnJhbmRmaWxlLCBjb25zdCBjaGFyICpzaWQpCit7IGludCBlcnI7CisgIHNvYXAtPmtleWZpbGUgPSBrZXlmaWxlOworICBzb2FwLT5wYXNzd29yZCA9IHBhc3N3b3JkOworICBzb2FwLT5jYWZpbGUgPSBjYWZpbGU7CisgIHNvYXAtPmNhcGF0aCA9IGNhcGF0aDsKKyAgaWYgKGRoZmlsZSkKKyAgeyBzb2FwLT5kaGZpbGUgPSBkaGZpbGU7CisgICAgc29hcC0+cnNhID0gMDsKKyAgfQorICBlbHNlCisgIHsgc29hcC0+ZGhmaWxlID0gTlVMTDsKKyAgICBzb2FwLT5yc2EgPSAxOworICB9CisgIHNvYXAtPnJhbmRmaWxlID0gcmFuZGZpbGU7CisgIHNvYXAtPnJlcXVpcmVfY2xpZW50X2F1dGggPSAoZmxhZ3MgJiBTT0FQX1NTTF9SRVFVSVJFX0NMSUVOVF9BVVRIRU5USUNBVElPTik7CisgIGlmICghKGVyciA9IHNvYXAtPmZzc2xhdXRoKHNvYXApKSkKKyAgeyBpZiAoc2lkKQorICAgICAgU1NMX0NUWF9zZXRfc2Vzc2lvbl9pZF9jb250ZXh0KHNvYXAtPmN0eCwgKHVuc2lnbmVkIGNoYXIqKXNpZCwgc3RybGVuKHNpZCkpOworICB9CisgIHJldHVybiBlcnI7IAorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NzbF9jbGllbnRfY29udGV4dChzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgc2hvcnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmtleWZpbGUsIGNvbnN0IGNoYXIgKnBhc3N3b3JkLCBjb25zdCBjaGFyICpjYWZpbGUsIGNvbnN0IGNoYXIgKmNhcGF0aCwgY29uc3QgY2hhciAqcmFuZGZpbGUpCit7IHNvYXAtPmtleWZpbGUgPSBrZXlmaWxlOworICBzb2FwLT5wYXNzd29yZCA9IHBhc3N3b3JkOworICBzb2FwLT5jYWZpbGUgPSBjYWZpbGU7CisgIHNvYXAtPmNhcGF0aCA9IGNhcGF0aDsKKyAgc29hcC0+ZGhmaWxlID0gTlVMTDsKKyAgc29hcC0+cnNhID0gMDsKKyAgc29hcC0+cmFuZGZpbGUgPSByYW5kZmlsZTsKKyAgc29hcC0+cmVxdWlyZV9zZXJ2ZXJfYXV0aCA9IChmbGFncyAmIFNPQVBfU1NMX1JFUVVJUkVfU0VSVkVSX0FVVEhFTlRJQ0FUSU9OKTsKKyAgcmV0dXJuIHNvYXAtPmZzc2xhdXRoKHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zc2xfaW5pdCgpCit7IC8qIE5vdGU6IGZvciBNVCBzeXN0ZW1zLCB0aGUgbWFpbiBwcm9ncmFtIE1VU1QgY2FsbCBzb2FwX3NzbF9pbml0KCkgYmVmb3JlIGFueSB0aHJlYWRzIGFyZSBzdGFydGVkICovCisgIGlmICghc3NsX2luaXRfZG9uZSkKKyAgeyBzc2xfaW5pdF9kb25lID0gMTsKKyAgICBTU0xfbGlicmFyeV9pbml0KCk7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIFNTTF9sb2FkX2Vycm9yX3N0cmluZ3MoKTsKKyNlbmRpZgorICAgIGlmICghUkFORF9sb2FkX2ZpbGUoIi9kZXYvdXJhbmRvbSIsIDEwMjQpKQorICAgIHsgY2hhciBidWZbMTAyNF07CisgICAgICBSQU5EX3NlZWQoYnVmLCBzaXplb2YoYnVmKSk7CisgICAgICB3aGlsZSAoIVJBTkRfc3RhdHVzKCkpCisgICAgICB7IGludCByID0gcmFuZCgpOworICAgICAgICBSQU5EX3NlZWQoJnIsIHNpemVvZihpbnQpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBjb25zdCBjaGFyICoKK3NzbF9lcnJvcihzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHJldCkKK3sgaW50IGVyciA9IFNTTF9nZXRfZXJyb3Ioc29hcC0+c3NsLCByZXQpOworICBjb25zdCBjaGFyICptc2cgPSBzb2FwX3N0cl9jb2RlKGhfc3NsX2Vycm9yX2NvZGVzLCBlcnIpOworICBpZiAobXNnKQorICAgIHN0cmNweShzb2FwLT5tc2didWYsIG1zZyk7CisgIGVsc2UKKyAgICByZXR1cm4gRVJSX2Vycm9yX3N0cmluZyhlcnIsIHNvYXAtPm1zZ2J1Zik7CisgIGlmIChFUlJfcGVla19lcnJvcigpKQorICB7IHVuc2lnbmVkIGxvbmcgcjsKKyAgICBzdHJjYXQoc29hcC0+bXNnYnVmLCAiXG4iKTsKKyAgICB3aGlsZSAoKHIgPSBFUlJfZ2V0X2Vycm9yKCkpKQorICAgICAgRVJSX2Vycm9yX3N0cmluZ19uKHIsIHNvYXAtPm1zZ2J1ZiArIHN0cmxlbihzb2FwLT5tc2didWYpLCBzaXplb2Yoc29hcC0+bXNnYnVmKSAtIHN0cmxlbihzb2FwLT5tc2didWYpKTsKKyAgfSAKKyAgZWxzZQorICB7IHN3aXRjaCAocmV0KQorICAgIHsgY2FzZSAwOgorICAgICAgICBzdHJjcHkoc29hcC0+bXNnYnVmLCAiRU9GIHdhcyBvYnNlcnZlZCB0aGF0IHZpb2xhdGVzIHRoZSBwcm90b2NvbC4gVGhlIGNsaWVudCBwcm9iYWJseSBwcm92aWRlZCBpbnZhbGlkIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uLiIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgLTE6CisgICAgICAgIHNwcmludGYoc29hcC0+bXNnYnVmLCAiRXJyb3Igb2JzZXJ2ZWQgYnkgdW5kZXJseWluZyBCSU86ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsgIAorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXAtPm1zZ2J1ZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NzbF9wYXNzd29yZChjaGFyICpidWYsIGludCBudW0sIGludCByd2ZsYWcsIHZvaWQgKnVzZXJkYXRhKQoreyBpZiAobnVtIDwgKGludClzdHJsZW4oKGNoYXIqKXVzZXJkYXRhKSArIDEpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiBzdHJsZW4oc3RyY3B5KGJ1ZiwgKGNoYXIqKXVzZXJkYXRhKSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRoaXMgY2FsbGJhY2sgaXMgaW5jbHVkZWQgZm9yIGZ1dHVyZSByZWZlcmVuY2VzLiBJdCBzaG91bGQgbm90IGJlIGRlbGV0ZWQKKyNpZm5kZWYgUEFMTV8yCitzdGF0aWMgREggKgorc3NsX3RtcF9kaChTU0wgKnNzbCwgaW50IGlzX2V4cG9ydCwgaW50IGtleWxlbmd0aCkKK3sgc3RhdGljIERIICpkaDUxMiA9IE5VTEw7CisgIHN0YXRpYyBESCAqZGgxMDI0ID0gTlVMTDsKKyAgREggKmRoOworICBzd2l0Y2ggKGtleWxlbmd0aCkKKyAgeyBjYXNlIDUxMjoKKyAgICAgIGlmICghZGg1MTIpCisgICAgICB7IEJJTyAqYmlvID0gQklPX25ld19maWxlKCJkaDUxMi5wZW0iLCAiciIpOworICAgICAgICBpZiAoYmlvKQorICAgICAgICB7IGRoNTEyID0gUEVNX3JlYWRfYmlvX0RIcGFyYW1zKGJpbywgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgQklPX2ZyZWUoYmlvKTsKKyAgICAgICAgICByZXR1cm4gZGg1MTI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGRoNTEyOworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoIWRoMTAyNCkKKyAgICAgIHsgQklPICpiaW8gPSBCSU9fbmV3X2ZpbGUoImRoMTAyNC5wZW0iLCAiciIpOworICAgICAgICBpZiAoYmlvKQorICAgICAgICB7IGRoMTAyNCA9IFBFTV9yZWFkX2Jpb19ESHBhcmFtcyhiaW8sIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgICAgIEJJT19mcmVlKGJpbyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGRoID0gZGgxMDI0OworICB9CisgIHJldHVybiBkaDsKK30KKyNlbmRpZgorKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzc2xfYXV0aF9pbml0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoIXNzbF9pbml0X2RvbmUpCisgICAgc29hcF9zc2xfaW5pdCgpOworICBpZiAoIXNvYXAtPmN0eCkKKyAgeyBpZiAoIShzb2FwLT5jdHggPSBTU0xfQ1RYX25ldyhTU0x2MjNfbWV0aG9kKCkpKSkKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHNldHVwIGNvbnRleHQiLCBTT0FQX1NTTF9FUlJPUik7CisgIH0KKyAgaWYgKHNvYXAtPnJhbmRmaWxlKQorICB7IGlmICghUkFORF9sb2FkX2ZpbGUoc29hcC0+cmFuZGZpbGUsIC0xKSkKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IGxvYWQgcmFuZG9tbmVzcyIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgfQorICBpZiAoc29hcC0+Y2FmaWxlIHx8IHNvYXAtPmNhcGF0aCkKKyAgeyBpZiAoIVNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKHNvYXAtPmN0eCwgc29hcC0+Y2FmaWxlLCBzb2FwLT5jYXBhdGgpKQorICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3QgcmVhZCBDQSBmaWxlIGFuZCBkaXJlY3RvcnkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgaWYgKHNvYXAtPmNhZmlsZSAmJiBzb2FwLT5yZXF1aXJlX2NsaWVudF9hdXRoKQorICAgICAgU1NMX0NUWF9zZXRfY2xpZW50X0NBX2xpc3Qoc29hcC0+Y3R4LCBTU0xfbG9hZF9jbGllbnRfQ0FfZmlsZShzb2FwLT5jYWZpbGUpKTsKKyAgfQorICBpZiAoIVNTTF9DVFhfc2V0X2RlZmF1bHRfdmVyaWZ5X3BhdGhzKHNvYXAtPmN0eCkpCisgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3QgcmVhZCBkZWZhdWx0IENBIGZpbGUgYW5kL29yIGRpcmVjdG9yeSIsIFNPQVBfU1NMX0VSUk9SKTsKKy8qIFNlZSBiZWxvdyAqLworICBpZiAoc29hcC0+a2V5ZmlsZSkKKyAgeyBpZiAoIVNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoc29hcC0+Y3R4LCBzb2FwLT5rZXlmaWxlKSkKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHJlYWQgY2VydGlmaWNhdGUga2V5IGZpbGUiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgaWYgKHNvYXAtPnBhc3N3b3JkKQorICAgIHsgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2JfdXNlcmRhdGEoc29hcC0+Y3R4LCAodm9pZCopc29hcC0+cGFzc3dvcmQpOworICAgICAgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2Ioc29hcC0+Y3R4LCBzc2xfcGFzc3dvcmQpOworICAgIH0KKyAgICBpZiAoIVNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfZmlsZShzb2FwLT5jdHgsIHNvYXAtPmtleWZpbGUsIFNTTF9GSUxFVFlQRV9QRU0pKQorICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3QgcmVhZCBrZXkgZmlsZSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgfQorLyogU3VnZ2VzdGVkIGFsdGVybmF0aXZlIGFwcHJvYWNoIHRvIGNoZWNrIGNhZmlsZSBmaXJzdCBiZWZvcmUgdGhlIGtleSBmaWxlOgorICBpZiAoc29hcC0+cGFzc3dvcmQpCisgIHsgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2JfdXNlcmRhdGEoc29hcC0+Y3R4LCAodm9pZCopc29hcC0+cGFzc3dvcmQpOworICAgIFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiKHNvYXAtPmN0eCwgc3NsX3Bhc3N3b3JkKTsKKyAgfQorICBpZiAoIXNvYXAtPmNhZmlsZSB8fCAhU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZShzb2FwLT5jdHgsIHNvYXAtPmNhZmlsZSkpCisgIHsgaWYgKHNvYXAtPmtleWZpbGUpCisgICAgeyBpZiAoIVNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoc29hcC0+Y3R4LCBzb2FwLT5rZXlmaWxlKSkKKyAgICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3QgcmVhZCBjZXJ0aWZpY2F0ZSBvciBrZXkgZmlsZSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICAgIGlmICghU1NMX0NUWF91c2VfUHJpdmF0ZUtleV9maWxlKHNvYXAtPmN0eCwgc29hcC0+a2V5ZmlsZSwgU1NMX0ZJTEVUWVBFX1BFTSkpCisgICAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHJlYWQga2V5IGZpbGUiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgfQorICB9CisqLworICBpZiAoc29hcC0+cnNhKQorICB7IFJTQSAqcnNhID0gUlNBX2dlbmVyYXRlX2tleSgxMDI0LCBSU0FfRjQsIE5VTEwsIE5VTEwpOworICAgIGlmICghU1NMX0NUWF9zZXRfdG1wX3JzYShzb2FwLT5jdHgsIHJzYSkpCisgICAgeyBpZiAocnNhKQorICAgICAgICBSU0FfZnJlZShyc2EpOworICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3Qgc2V0IFJTQSBrZXkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgfQorICAgIFJTQV9mcmVlKHJzYSk7CisgIH0KKyAgZWxzZSBpZiAoc29hcC0+ZGhmaWxlKQorICB7IERIICpkaCA9IDA7CisgICAgQklPICpiaW87CisgICAgYmlvID0gQklPX25ld19maWxlKHNvYXAtPmRoZmlsZSwgInIiKTsKKyAgICBpZiAoIWJpbykKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHJlYWQgREggZmlsZSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICBkaCA9IFBFTV9yZWFkX2Jpb19ESHBhcmFtcyhiaW8sIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIEJJT19mcmVlKGJpbyk7CisgICAgaWYgKFNTTF9DVFhfc2V0X3RtcF9kaChzb2FwLT5jdHgsIGRoKSA8IDApCisgICAgeyBpZiAoZGgpCisgICAgICAgIERIX2ZyZWUoZGgpOworICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3Qgc2V0IERIIHBhcmFtZXRlcnMiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgfQorICAgIERIX2ZyZWUoZGgpOworICB9CisgIFNTTF9DVFhfc2V0X29wdGlvbnMoc29hcC0+Y3R4LCBTU0xfT1BfQUxMIHwgU1NMX09QX05PX1NTTHYyKTsKKyAgU1NMX0NUWF9zZXRfdmVyaWZ5KHNvYXAtPmN0eCwgc29hcC0+cmVxdWlyZV9jbGllbnRfYXV0aCA/IChTU0xfVkVSSUZZX1BFRVIgfCBTU0xfVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJUKSA6IHNvYXAtPnJlcXVpcmVfc2VydmVyX2F1dGggPyBTU0xfVkVSSUZZX1BFRVIgOiBTU0xfVkVSSUZZX05PTkUsIHNvYXAtPmZzc2x2ZXJpZnkpOworI2lmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgMHgwMDkwNTEwMEwpCisgIFNTTF9DVFhfc2V0X3ZlcmlmeV9kZXB0aChzb2FwLT5jdHgsIDEpOyAKKyNlbHNlCisgIFNTTF9DVFhfc2V0X3ZlcmlmeV9kZXB0aChzb2FwLT5jdHgsIDkpOyAKKyNlbmRpZiAgCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc3NsX3ZlcmlmeV9jYWxsYmFjayhpbnQgb2ssIFg1MDlfU1RPUkVfQ1RYICpzdG9yZSkKK3sKKyNpZmRlZiBTT0FQX0RFQlVHCisgIGlmICghb2spIAorICB7IGNoYXIgZGF0YVsyNTZdOworICAgIFg1MDkgKmNlcnQgPSBYNTA5X1NUT1JFX0NUWF9nZXRfY3VycmVudF9jZXJ0KHN0b3JlKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlNTTCB2ZXJpZnkgZXJyb3Igb3Igd2FybmluZyB3aXRoIGNlcnRpZmljYXRlIGF0IGRlcHRoICVkOiAlc1xuIiwgWDUwOV9TVE9SRV9DVFhfZ2V0X2Vycm9yX2RlcHRoKHN0b3JlKSwgWDUwOV92ZXJpZnlfY2VydF9lcnJvcl9zdHJpbmcoWDUwOV9TVE9SRV9DVFhfZ2V0X2Vycm9yKHN0b3JlKSkpOworICAgIFg1MDlfTkFNRV9vbmVsaW5lKFg1MDlfZ2V0X2lzc3Vlcl9uYW1lKGNlcnQpLCBkYXRhLCBzaXplb2YoZGF0YSkpOworICAgIGZwcmludGYoc3RkZXJyLCAiY2VydGlmaWNhdGUgaXNzdWVyICVzXG4iLCBkYXRhKTsKKyAgICBYNTA5X05BTUVfb25lbGluZShYNTA5X2dldF9zdWJqZWN0X25hbWUoY2VydCksIGRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgZnByaW50ZihzdGRlcnIsICJjZXJ0aWZpY2F0ZSBzdWJqZWN0ICVzXG4iLCBkYXRhKTsKKyAgfQorI2VuZGlmCisgIC8qIE5vdGU6IHJldHVybiAxIHRvIGNvbnRpbnVlLCBidXQgdW5zYWZlIHByb2dyZXNzIHdpbGwgYmUgdGVybWluYXRlZCBieSBTU0wgKi8KKyAgcmV0dXJuIG9rOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NzbF9hY2NlcHQoc3RydWN0IHNvYXAgKnNvYXApCit7IEJJTyAqYmlvOworICBpbnQgaSwgcjsKKyAgaWYgKCFzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIk5vIHNvY2tldCBpbiBzb2FwX3NzbF9hY2NlcHQoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgaWYgKCFzb2FwLT5jdHggJiYgKHNvYXAtPmVycm9yID0gc29hcC0+ZnNzbGF1dGgoc29hcCkpKQorICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICBpZiAoIXNvYXAtPnNzbCkKKyAgeyBzb2FwLT5zc2wgPSBTU0xfbmV3KHNvYXAtPmN0eCk7CisgICAgaWYgKCFzb2FwLT5zc2wpCisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJTU0xfbmV3KCkgZmFpbGVkIGluIHNvYXBfc3NsX2FjY2VwdCgpIiwgU09BUF9TU0xfRVJST1IpOworICB9CisgIGVsc2UKKyAgICBTU0xfY2xlYXIoc29hcC0+c3NsKTsKKyAgc29hcC0+aW1vZGUgfD0gU09BUF9FTkNfU1NMOworICBzb2FwLT5vbW9kZSB8PSBTT0FQX0VOQ19TU0w7CisjaWYgZGVmaW5lZChXSU4zMikKKyAgeyB1X2xvbmcgbm9uYmxvY2tpbmcgPSAxOworICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZJT05CSU8sICZub25ibG9ja2luZyk7CisgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgeyB1X2xvbmcgbm9uYmxvY2tpbmcgPSAxOworICAgIGlvY3RsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZJT05CSU8sIChpbnQpJm5vbmJsb2NraW5nKTsKKyAgfQorI2Vsc2UKKyAgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRl9HRVRGTCl8T19OT05CTE9DSyk7CisjZW5kaWYKKyAgYmlvID0gQklPX25ld19zb2NrZXQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgQklPX05PQ0xPU0UpOworICBTU0xfc2V0X2Jpbyhzb2FwLT5zc2wsIGJpbywgYmlvKTsKKyAgaSA9IDEwMDsgLyogMTAwICogMC4xIG1zIHJldHJpZXMgKi8KKyAgd2hpbGUgKChyID0gU1NMX2FjY2VwdChzb2FwLT5zc2wpKSA8PSAwKQorICB7IGludCBlcnIgPSBTU0xfZ2V0X2Vycm9yKHNvYXAtPnNzbCwgcik7CisgICAgaWYgKGVyciA9PSBTU0xfRVJST1JfV0FOVF9SRUFEIHx8IGVyciA9PSBTU0xfRVJST1JfV0FOVF9XUklURSkKKyAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICBmZF9zZXQgZmQ7CisgICAgICBpZiAoaS0tIDw9IDApCisgICAgICAgIGJyZWFrOworICAgICAgdGltZW91dC50dl9zZWMgPSAwOworICAgICAgdGltZW91dC50dl91c2VjID0gMTAwMDAwOworICAgICAgRkRfWkVSTygmZmQpOworICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZmZCk7CisgICAgICByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksICZmZCwgTlVMTCwgJmZkLCAmdGltZW91dCk7CisgICAgICBpZiAociA8IDAgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUikKKyAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgIHJldHVybiBTT0FQX0VPRjsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgc29hcC0+ZXJybnVtID0gZXJyOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisjaWYgZGVmaW5lZChXSU4zMikKKyAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZJT05CSU8sICZibG9ja2luZyk7CisgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgIGlvY3RsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZJT05CSU8sIChpbnQpJmJsb2NraW5nKTsKKyAgfQorI2Vsc2UKKyAgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRl9HRVRGTCkmfk9fTk9OQkxPQ0spOworI2VuZGlmCisgIGlmIChyIDw9IDApCisgIHsgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgc3NsX2Vycm9yKHNvYXAsIHIpLCAiU1NMX2FjY2VwdCgpIGZhaWxlZCBpbiBzb2FwX3NzbF9hY2NlcHQoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICByZXR1cm4gU09BUF9TU0xfRVJST1I7CisgIH0KKyAgaWYgKHNvYXAtPnJlcXVpcmVfY2xpZW50X2F1dGgpCisgIHsgWDUwOSAqcGVlcjsKKyAgICBpbnQgZXJyOworICAgIGlmICgoZXJyID0gU1NMX2dldF92ZXJpZnlfcmVzdWx0KHNvYXAtPnNzbCkpICE9IFg1MDlfVl9PSykKKyAgICB7IHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgcmV0dXJuIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCBYNTA5X3ZlcmlmeV9jZXJ0X2Vycm9yX3N0cmluZyhlcnIpLCAiU1NMIGNlcnRpZmljYXRlIHByZXNlbnRlZCBieSBwZWVyIGNhbm5vdCBiZSB2ZXJpZmllZCBpbiBzb2FwX3NzbF9hY2NlcHQoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICB9CisgICAgcGVlciA9IFNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZShzb2FwLT5zc2wpOworICAgIGlmICghcGVlcikKKyAgICB7IHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgcmV0dXJuIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIk5vIFNTTCBjZXJ0aWZpY2F0ZSB3YXMgcHJlc2VudGVkIGJ5IHRoZSBwZWVyIGluIHNvYXBfc3NsX2FjY2VwdCgpIiwgU09BUF9TU0xfRVJST1IpOworICAgIH0KKyAgICBYNTA5X2ZyZWUocGVlcik7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNlbmRpZiAvKiBXSVRIX09QRU5TU0wgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAordGNwX2luaXQoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPmVycm1vZGUgPSAxOworI2lmZGVmIFdJTjMyCisgIGlmICh0Y3BfZG9uZSkKKyAgICByZXR1cm4gMDsKKyAgZWxzZQorICB7IFdTQURBVEEgdzsKKyAgICBpZiAoV1NBU3RhcnR1cChNQUtFV09SRCgxLCAxKSwgJncpKQorICAgICAgcmV0dXJuIC0xOworICAgIHRjcF9kb25lID0gMTsKKyAgfQorI2VuZGlmCisgIHJldHVybiAwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2RvbmUoc3RydWN0IHNvYXAgKnNvYXApCit7IAorI2lmZGVmIFNPQVBfREVCVUcKKyAgaW50IGk7CisjZW5kaWYKKyAgaWYgKHNvYXBfY2hlY2tfc3RhdGUoc29hcCkpCisgICAgcmV0dXJuOworICBzb2FwX2ZyZWUoc29hcCk7CisgIHdoaWxlIChzb2FwLT5jbGlzdCkKKyAgeyBzdHJ1Y3Qgc29hcF9jbGlzdCAqcCA9IHNvYXAtPmNsaXN0LT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5jbGlzdCk7CisgICAgc29hcC0+Y2xpc3QgPSBwOworICB9CisgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOyAvKiB0byBmb3JjZSBjbG9zZSB0aGUgc29ja2V0ICovCisgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworI2lmZGVmIFdJVEhfQ09PS0lFUworICBzb2FwX2ZyZWVfY29va2llcyhzb2FwKTsKKyNlbmRpZgorICB3aGlsZSAoc29hcC0+cGx1Z2lucykKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnAgPSBzb2FwLT5wbHVnaW5zLT5uZXh0OworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVtb3ZpbmcgcGx1Z2luICclcydcbiIsIHNvYXAtPnBsdWdpbnMtPmlkKSk7CisgICAgaWYgKHNvYXAtPnBsdWdpbnMtPmZjb3B5IHx8IHNvYXAtPnN0YXRlID09IFNPQVBfSU5JVCkKKyAgICAgIHNvYXAtPnBsdWdpbnMtPmZkZWxldGUoc29hcCwgc29hcC0+cGx1Z2lucyk7CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPnBsdWdpbnMpOworICAgIHNvYXAtPnBsdWdpbnMgPSBwOworICB9CisgIHNvYXAtPmZwbHVnaW4gPSBmcGx1Z2luOworI2lmbmRlZiBXSVRIX05PSFRUUAorICBzb2FwLT5mcG9zdCA9IGh0dHBfcG9zdDsKKyAgc29hcC0+ZmdldCA9IGh0dHBfZ2V0OworICBzb2FwLT5mZm9ybSA9IE5VTEw7CisgIHNvYXAtPmZwb3N0aGRyID0gaHR0cF9wb3N0X2hlYWRlcjsKKyAgc29hcC0+ZnJlc3BvbnNlID0gaHR0cF9yZXNwb25zZTsKKyAgc29hcC0+ZnBhcnNlID0gaHR0cF9wYXJzZTsKKyAgc29hcC0+ZnBhcnNlaGRyID0gaHR0cF9wYXJzZV9oZWFkZXI7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfSVBWNgorICBzb2FwLT5mcmVzb2x2ZSA9IHRjcF9nZXRob3N0OworI2Vsc2UKKyAgc29hcC0+ZnJlc29sdmUgPSBOVUxMOworI2VuZGlmCisgIHNvYXAtPmZhY2NlcHQgPSB0Y3BfYWNjZXB0OworICBzb2FwLT5mb3BlbiA9IHRjcF9jb25uZWN0OworICBzb2FwLT5mY2xvc2UgPSB0Y3BfZGlzY29ubmVjdDsKKyAgc29hcC0+ZmNsb3Nlc29ja2V0ID0gdGNwX2Nsb3Nlc29ja2V0OworICBzb2FwLT5mc2h1dGRvd25zb2NrZXQgPSB0Y3Bfc2h1dGRvd25zb2NrZXQ7CisgIHNvYXAtPmZzZW5kID0gZnNlbmQ7CisgIHNvYXAtPmZyZWN2ID0gZnJlY3Y7CisgIHNvYXAtPmZwb2xsID0gc29hcF9wb2xsOworI2Vsc2UKKyAgc29hcC0+Zm9wZW4gPSBOVUxMOworICBzb2FwLT5mY2xvc2UgPSBOVUxMOworICBzb2FwLT5mcG9sbCA9IE5VTEw7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcC0+ZnByZXBhcmVpbml0ID0gTlVMTDsKKyAgc29hcC0+ZnByZXBhcmVzZW5kID0gTlVMTDsKKyAgc29hcC0+ZnByZXBhcmVyZWN2ID0gTlVMTDsKKyAgc29hcC0+ZnByZXBhcmVmaW5hbCA9IE5VTEw7CisjZW5kaWYKKyAgc29hcC0+ZnNldGVycm9yID0gTlVMTDsKKyAgc29hcC0+Zmlnbm9yZSA9IE5VTEw7CisgIHNvYXAtPmZzZXJ2ZWxvb3AgPSBOVUxMOworI2lmZGVmIFdJVEhfT1BFTlNTTAorICBpZiAoc29hcC0+c2Vzc2lvbikKKyAgeyBTU0xfU0VTU0lPTl9mcmVlKHNvYXAtPnNlc3Npb24pOworICAgIHNvYXAtPnNlc3Npb24gPSBOVUxMOworICB9CisjZW5kaWYKKyAgaWYgKHNvYXAtPnN0YXRlID09IFNPQVBfSU5JVCkKKyAgeyBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSkKKyAgICB7IHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyKTsKKyAgICAgIHNvYXAtPm1hc3RlciA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgIGlmIChzb2FwLT5jdHgpCisgICAgeyBTU0xfQ1RYX2ZyZWUoc29hcC0+Y3R4KTsKKyAgICAgIHNvYXAtPmN0eCA9IE5VTEw7CisgICAgfQorI2VuZGlmCisgIH0KKyNpZmRlZiBTT0FQX0RFQlVHCisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZSBsb2dmaWxlc1xuIikpOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9NQVhMT0dTOyBpKyspCisgIHsgaWYgKHNvYXAtPmxvZ2ZpbGVbaV0pCisgICAgeyBTT0FQX0ZSRUUoc29hcCwgKHZvaWQqKXNvYXAtPmxvZ2ZpbGVbaV0pOworICAgICAgc29hcC0+bG9nZmlsZVtpXSA9IE5VTEw7CisgICAgfQorICAgIHNvYXBfY2xvc2VfbG9nZmlsZShzb2FwLCBpKTsKKyAgfQorICBzb2FwX2ZyZWVfbWh0KHNvYXApOworICBzb2FwLT5zdGF0ZSA9IDA7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2NsZWFudXAoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXBfZG9uZShzb2FwKTsKKyNpZmRlZiBXSU4zMgorICBpZiAoIXRjcF9kb25lKQorICAgIHJldHVybjsKKyAgdGNwX2RvbmUgPSAwOworICBXU0FDbGVhbnVwKCk7CisjZW5kaWYKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBjb25zdCBjaGFyKgordGNwX2Vycm9yKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBjb25zdCBjaGFyICptc2cgPSBOVUxMOworICBzd2l0Y2ggKHNvYXAtPmVycm1vZGUpCisgIHsgY2FzZSAwOgorICAgICAgbXNnID0gc29hcF9zdHJlcnJvcihzb2FwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIG1zZyA9ICJXU0FTdGFydHVwIGZhaWxlZCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgeworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIG1zZyA9IHNvYXBfc3RyX2NvZGUoaF9lcnJvcl9jb2Rlcywgc29hcC0+ZXJybnVtKTsKKyAgICAgIGlmICghbXNnKQorI2VuZGlmCisgICAgICB7IHNwcmludGYoc29hcC0+bXNnYnVmLCAiVENQL1VEUCBJUCBlcnJvciAlZCIsIHNvYXAtPmVycm51bSk7CisgICAgICAgIG1zZyA9IHNvYXAtPm1zZ2J1ZjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIG1zZzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNvbnN0IGNoYXIqCitodHRwX2Vycm9yKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3RhdHVzKQoreyByZWdpc3RlciBjb25zdCBjaGFyICptc2cgPSBTT0FQX1NUUl9FT1M7CisjaWZuZGVmIFdJVEhfTEVBTgorICBtc2cgPSBzb2FwX3N0cl9jb2RlKGhfaHR0cF9lcnJvcl9jb2Rlcywgc3RhdHVzKTsKKyAgaWYgKCFtc2cpCisgICAgbXNnID0gU09BUF9TVFJfRU9TOworI2VuZGlmCisgIHJldHVybiBtc2c7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0lQVjYKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAordGNwX2dldGhvc3Qoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmFkZHIsIHN0cnVjdCBpbl9hZGRyICppbmFkZHIpCit7IHNvYXBfaW50MzIgaWFkZCA9IC0xOworICBzdHJ1Y3QgaG9zdGVudCBob3N0ZW50LCAqaG9zdCA9ICZob3N0ZW50OworI2lmZGVmIFZYV09SS1MKKyAgaW50IGhvc3RpbnQ7CisgIC8qIGluZXRfYWRkcigpLCBhbmQgaG9zdEdldEJ5TmFtZSgpIGV4cGVjdCAiY2hhciAqIjsgYWRkciBpcyBhICJjb25zdCBjaGFyICoiLiAqLworICBpYWRkID0gaW5ldF9hZGRyKChjaGFyKilhZGRyKTsKKyNlbHNlCisjaWYgZGVmaW5lZChfQUlYVkVSU0lPTl80MzEpIHx8IGRlZmluZWQoVFJVNjQpCisgIHN0cnVjdCBob3N0ZW50X2RhdGEgaHRfZGF0YTsKKyNlbmRpZgorI2lmZGVmIEFTNDAwCisgIGlhZGQgPSBpbmV0X2FkZHIoKHZvaWQqKWFkZHIpOworI2Vsc2UKKyAgaWFkZCA9IGluZXRfYWRkcihhZGRyKTsKKyNlbmRpZgorI2VuZGlmCisgIGlmIChpYWRkICE9IC0xKQorICB7IG1lbWNweShpbmFkZHIsICZpYWRkLCBzaXplb2YoaWFkZCkpOworICAgIHJldHVybiBTT0FQX09LOworICB9CisjaWYgZGVmaW5lZChfX0dMSUJDX18pCisgIGlmIChnZXRob3N0YnluYW1lX3IoYWRkciwgJmhvc3RlbnQsIHNvYXAtPmJ1ZiwgU09BUF9CVUZMRU4sICZob3N0LCAmc29hcC0+ZXJybnVtKSA8IDApCisgICAgaG9zdCA9IE5VTEw7CisjZWxpZiBkZWZpbmVkKF9BSVhWRVJTSU9OXzQzMSkgfHwgZGVmaW5lZChUUlU2NCkKKyAgbWVtc2V0KCh2b2lkKikmaHRfZGF0YSwgMCwgc2l6ZW9mKGh0X2RhdGEpKTsKKyAgaWYgKGdldGhvc3RieW5hbWVfcihhZGRyLCAmaG9zdGVudCwgJmh0X2RhdGEpIDwgMCkKKyAgeyBob3N0ID0gTlVMTDsKKyAgICBzb2FwLT5lcnJudW0gPSBoX2Vycm5vOworICB9CisjZWxpZiBkZWZpbmVkKEhBVkVfR0VUSE9TVEJZTkFNRV9SKQorICBob3N0ID0gZ2V0aG9zdGJ5bmFtZV9yKGFkZHIsICZob3N0ZW50LCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOLCAmc29hcC0+ZXJybnVtKTsKKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgLyogSWYgdGhlIEROUyByZXNvbHZlciBsaWJyYXJ5IHJlc29sdkxpYiBoYXMgYmVlbiBjb25maWd1cmVkIGluIHRoZSB2eFdvcmtzCisgICAqIGltYWdlLCBhIHF1ZXJ5IGZvciB0aGUgaG9zdCBJUCBhZGRyZXNzIGlzIHNlbnQgdG8gdGhlIEROUyBzZXJ2ZXIsIGlmIHRoZQorICAgKiBuYW1lIHdhcyBub3QgZm91bmQgaW4gdGhlIGxvY2FsIGhvc3QgdGFibGUuICovCisgIGhvc3RpbnQgPSBob3N0R2V0QnlOYW1lKChjaGFyKilhZGRyKTsKKyAgaWYgKGhvc3RpbnQgPT0gRVJST1IpCisgIHsgaG9zdCA9IE5VTEw7CisgICAgc29hcC0+ZXJybnVtID0gc29hcF9lcnJubzsgCisgIH0KKyNlbHNlCisjaWZkZWYgQVM0MDAKKyAgaWYgKCEoaG9zdCA9IGdldGhvc3RieW5hbWUoKHZvaWQqKWFkZHIpKSkKKyAgICBzb2FwLT5lcnJudW0gPSBoX2Vycm5vOworI2Vsc2UKKyAgaWYgKCEoaG9zdCA9IGdldGhvc3RieW5hbWUoYWRkcikpKQorICAgIHNvYXAtPmVycm51bSA9IGhfZXJybm87CisjZW5kaWYKKyNlbmRpZgorICBpZiAoIWhvc3QpCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJIb3N0IG5hbWUgbm90IGZvdW5kXG4iKSk7CisgICAgcmV0dXJuIFNPQVBfRVJSOworICB9CisjaWZkZWYgVlhXT1JLUworICBpbmFkZHItPnNfYWRkciA9IGhvc3RpbnQ7CisjZWxzZQorICBtZW1jcHkoaW5hZGRyLCBob3N0LT5oX2FkZHIsIGhvc3QtPmhfbGVuZ3RoKTsKKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAordGNwX2Nvbm5lY3Qoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjb25zdCBjaGFyICpob3N0LCBpbnQgcG9ydCkKK3sKKyNpZmRlZiBXSVRIX0lQVjYKKyAgc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqcmVzLCAqcmVzc2F2ZTsKKyAgaW50IGVycjsKKyNlbmRpZgorICByZWdpc3RlciBpbnQgZmQ7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpbnQgbGVuID0gU09BUF9CVUZMRU47CisgIGludCBzZXQgPSAxOworI2VuZGlmCisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0KTsKKyAgc29hcC0+c29ja2V0ID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgaWYgKHRjcF9pbml0KHNvYXApKQorICB7IHNvYXAtPmVycm51bSA9IDA7CisgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgIlRDUCBpbml0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIHNvYXAtPmVycm1vZGUgPSAwOworI2lmZGVmIFdJVEhfSVBWNgorICBtZW1zZXQoKHZvaWQqKSZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisgIGhpbnRzLmFpX2ZhbWlseSA9IFBGX1VOU1BFQzsKKyNpZmRlZiBXSVRIX1VEUAorICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19ER1JBTTsKKyAgZWxzZQorI2VuZGlmCisgICAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKyAgc29hcC0+ZXJybW9kZSA9IDI7CisgIGlmIChzb2FwLT5wcm94eV9ob3N0KQorICAgIGVyciA9IGdldGFkZHJpbmZvKHNvYXAtPnByb3h5X2hvc3QsIHNvYXBfaW50MnMoc29hcCwgc29hcC0+cHJveHlfcG9ydCksICZoaW50cywgJnJlcyk7CisgIGVsc2UKKyAgICBlcnIgPSBnZXRhZGRyaW5mbyhob3N0LCBzb2FwX2ludDJzKHNvYXAsIHBvcnQpLCAmaGludHMsICZyZXMpOworICBpZiAoZXJyKQorICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCBnYWlfc3RyZXJyb3IoZXJyKSwgImdldGFkZHJpbmZvIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIHJlc3NhdmUgPSByZXM7CithZ2FpbjoKKyAgZmQgPSAoaW50KXNvY2tldChyZXMtPmFpX2ZhbWlseSwgcmVzLT5haV9zb2NrdHlwZSwgcmVzLT5haV9wcm90b2NvbCk7CisgIHNvYXAtPmVycm1vZGUgPSAwOworI2Vsc2UKKyNpZmRlZiBXSVRIX1VEUAorICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIGZkID0gKGludClzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisgIGVsc2UKKyNlbmRpZgorICAgIGZkID0gKGludClzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOworI2VuZGlmCisgIGlmIChmZCA8IDApCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNvY2tldCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorI2lmZGVmIFNPQ0tFVF9DTE9TRV9PTl9FWEVDCisjaWZkZWYgV0lOMzIKKyNpZm5kZWYgVU5ERVJfQ0UKKyAgU2V0SGFuZGxlSW5mb3JtYXRpb24oKEhBTkRMRSlmZCwgSEFORExFX0ZMQUdfSU5IRVJJVCwgMCk7CisjZW5kaWYKKyNlbHNlCisgIGZjbnRsKGZkLCBGX1NFVEZELCAxKTsKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+Y29ubmVjdF9mbGFncyAmIFNPX0xJTkdFUikKKyAgeyBzdHJ1Y3QgbGluZ2VyIGxpbmdlcjsKKyAgICBtZW1zZXQoKHZvaWQqKSZsaW5nZXIsIDAsIHNpemVvZihsaW5nZXIpKTsKKyAgICBsaW5nZXIubF9vbm9mZiA9IDE7CisgICAgbGluZ2VyLmxfbGluZ2VyID0gMDsKKyAgICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpZmQsIFNPTF9TT0NLRVQsIFNPX0xJTkdFUiwgKGNoYXIqKSZsaW5nZXIsIHNpemVvZihzdHJ1Y3QgbGluZ2VyKSkpCisgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX0xJTkdFUiBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorICB9CisgIGlmICgoc29hcC0+Y29ubmVjdF9mbGFncyAmIH5TT19MSU5HRVIpICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKWZkLCBTT0xfU09DS0VULCBzb2FwLT5jb25uZWN0X2ZsYWdzICYgflNPX0xJTkdFUiwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBpZiAoc29hcC0+a2VlcF9hbGl2ZSAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClmZCwgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX0tFRVBBTElWRSBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpZmQsIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwgKGNoYXIqKSZsZW4sIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19TTkRCVUYgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKWZkLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsIChjaGFyKikmbGVuLCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fUkNWQlVGIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisjaWZkZWYgVENQX05PREVMQVkKKyAgaWYgKCEoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpZmQsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBUQ1BfTk9ERUxBWSBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorI2VuZGlmCisjZW5kaWYKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk9wZW5pbmcgc29ja2V0ICVkIHRvIGhvc3Q9JyVzJyBwb3J0PSVkXG4iLCBmZCwgaG9zdCwgcG9ydCkpOworI2lmbmRlZiBXSVRIX0lQVjYKKyAgc29hcC0+cGVlcmxlbiA9IHNpemVvZihzb2FwLT5wZWVyKTsKKyAgbWVtc2V0KCh2b2lkKikmc29hcC0+cGVlciwgMCwgc2l6ZW9mKHNvYXAtPnBlZXIpKTsKKyAgc29hcC0+cGVlci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgc29hcC0+ZXJybW9kZSA9IDI7CisgIGlmIChzb2FwLT5wcm94eV9ob3N0KQorICB7IGlmIChzb2FwLT5mcmVzb2x2ZShzb2FwLCBzb2FwLT5wcm94eV9ob3N0LCAmc29hcC0+cGVlci5zaW5fYWRkcikpCisgICAgeyBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiZ2V0IHByb3h5IGhvc3QgYnkgbmFtZSBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorICAgIHNvYXAtPnBlZXIuc2luX3BvcnQgPSBodG9ucygoc2hvcnQpc29hcC0+cHJveHlfcG9ydCk7CisgIH0KKyAgZWxzZQorICB7IGlmIChzb2FwLT5mcmVzb2x2ZShzb2FwLCBob3N0LCAmc29hcC0+cGVlci5zaW5fYWRkcikpCisgICAgeyBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiZ2V0IGhvc3QgYnkgbmFtZSBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorICAgIHNvYXAtPnBlZXIuc2luX3BvcnQgPSBodG9ucygoc2hvcnQpcG9ydCk7CisgIH0KKyAgc29hcC0+ZXJybW9kZSA9IDA7CisgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgcmV0dXJuIGZkOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0KQorI2lmIGRlZmluZWQoV0lOMzIpCisgIHsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sICZub25ibG9ja2luZyk7CisgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgeyB1X2xvbmcgbm9uYmxvY2tpbmcgPSAxOworICAgIGlvY3RsKChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgKGludCkoJm5vbmJsb2NraW5nKSk7IC8qIG1vZGlmaWVkIHRvIHVzZSBmZCAqLworICB9CisjZWxzZQorICAgIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX0dFVEZMKXxPX05PTkJMT0NLKTsKKyNlbmRpZgorICBlbHNlCisjaWYgZGVmaW5lZChXSU4zMikKKyAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgJmJsb2NraW5nKTsKKyAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgaW9jdGwoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAoaW50KSgmYmxvY2tpbmcpKTsKKyAgfQorI2Vsc2UKKyAgICBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9HRVRGTCkmfk9fTk9OQkxPQ0spOworI2VuZGlmCisjZW5kaWYKKyAgZm9yICg7OykKKyAgeyAKKyNpZmRlZiBXSVRIX0lQVjYKKyAgICBpZiAoY29ubmVjdCgoU09BUF9TT0NLRVQpZmQsIHJlcy0+YWlfYWRkciwgcmVzLT5haV9hZGRybGVuKSkKKyNlbHNlCisgICAgaWYgKGNvbm5lY3QoKFNPQVBfU09DS0VUKWZkLCAoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlciwgc2l6ZW9mKHNvYXAtPnBlZXIpKSkKKyNlbmRpZgorICAgIHsgCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgaWYgKHNvYXAtPmNvbm5lY3RfdGltZW91dCAmJiAoc29hcF9zb2NrZXRfZXJybm8gPT0gU09BUF9FSU5QUk9HUkVTUyB8fCBzb2FwX3NvY2tldF9lcnJubyA9PSBTT0FQX0VXT1VMREJMT0NLKSkKKyAgICAgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgICAgU09BUF9TT0NLTEVOX1QgazsKKyAgICAgICAgZmRfc2V0IGZkczsKKyAgICAgICAgaWYgKHNvYXAtPmNvbm5lY3RfdGltZW91dCA+IDApCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSBzb2FwLT5jb25uZWN0X3RpbWVvdXQ7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSAtc29hcC0+Y29ubmVjdF90aW1lb3V0LzEwMDAwMDA7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gLXNvYXAtPmNvbm5lY3RfdGltZW91dCUxMDAwMDAwOworICAgICAgICB9CisgICAgICAgIEZEX1pFUk8oJmZkcyk7CisgICAgICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpZmQsICZmZHMpOworICAgICAgICBmb3IgKDs7KQorICAgICAgICB7IGludCByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoZmQgKyAxKSwgTlVMTCwgJmZkcywgTlVMTCwgJnRpbWVvdXQpOworICAgICAgICAgIGlmIChyID4gMCkKKwkgICAgYnJlYWs7CisgICAgICAgICAgaWYgKCFyKQorICAgICAgICAgIHsgc29hcC0+ZXJybnVtID0gMDsKKyAgICAgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29ubmVjdCB0aW1lb3V0XG4iKSk7CisgICAgICAgICAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgIlRpbWVvdXQiLCAiY29ubmVjdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSKQorICAgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBjb25uZWN0IHRvIGhvc3RcbiIpKTsKKyAgICAgICAgICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJjb25uZWN0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKwlrID0gKFNPQVBfU09DS0xFTl9UKXNpemVvZihzb2FwLT5lcnJudW0pOworICAgICAgICBpZiAoIWdldHNvY2tvcHQoKFNPQVBfU09DS0VUKWZkLCBTT0xfU09DS0VULCBTT19FUlJPUiwgKGNoYXIqKSZzb2FwLT5lcnJudW0sICZrKSAmJiAhc29hcC0+ZXJybnVtKQkvKiBwb3J0YWJpbGl0eSBub3RlOiBzZWUgU09BUF9TT0NLTEVOX1QgZGVmaW5pdGlvbiBpbiBzdGRzb2FwMi5oICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IGNvbm5lY3QgdG8gaG9zdFxuIikpOworICAgICAgICBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImNvbm5lY3QgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyNlbmRpZgorI2lmZGVmIFdJVEhfSVBWNgorICAgICAgaWYgKHJlcy0+YWlfbmV4dCkKKyAgICAgIHsgcmVzID0gcmVzLT5haV9uZXh0OworICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgaWYgKHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIpCisgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBjb25uZWN0IHRvIGhvc3RcbiIpKTsKKyAgICAgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImNvbm5lY3QgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyAgICB9ICAKKyAgICBlbHNlCisgICAgICBicmVhazsKKyAgfQorI2lmZGVmIFdJVEhfSVBWNgorICBzb2FwLT5wZWVybGVuID0gMDsgLyogSVB2NjogYWxyZWFkeSBjb25uZWN0ZWQgc28gdXNlIHNlbmQoKSAqLworICBmcmVlYWRkcmluZm8ocmVzc2F2ZSk7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQpCisjaWYgZGVmaW5lZChXSU4zMikKKyAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgJmJsb2NraW5nKTsKKyAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgaW9jdGwoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAoaW50KSgmYmxvY2tpbmcpKTsKKyAgfQorI2Vsc2UKKyAgICBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9HRVRGTCkmfk9fTk9OQkxPQ0spOworI2VuZGlmCisjZW5kaWYKKyAgc29hcC0+c29ja2V0ID0gZmQ7CisgIHNvYXAtPmltb2RlICY9IH5TT0FQX0VOQ19TU0w7CisgIHNvYXAtPm9tb2RlICY9IH5TT0FQX0VOQ19TU0w7CisgIGlmICghc3RybmNtcChlbmRwb2ludCwgImh0dHBzOiIsIDYpKQorICB7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgICAgQklPICpiaW87CisgICAgaW50IHI7CisgICAgaWYgKHNvYXAtPnByb3h5X2hvc3QpCisgICAgeyBzaG9ydCB2OworICAgICAgdW5zaWduZWQgaW50IGsgPSBzb2FwLT5vbW9kZTsgLyogbWFrZSBzdXJlIHdlIG9ubHkgcGFyc2UgSFRUUCAqLworICAgICAgc2l6ZV90IG4gPSBzb2FwLT5jb3VudDsgLyogc2F2ZSB0aGUgY29udGVudCBsZW5ndGggKi8KKyAgICAgIGNoYXIgKnVzZXJpZCwgKnBhc3N3ZDsKKyAgICAgIHNvYXAtPm9tb2RlICY9IH5TT0FQX0VOQzsgLyogbWFzayBJTyBhbmQgRU5DICovCisgICAgICBzb2FwLT5vbW9kZSB8PSBTT0FQX0lPX0JVRkZFUjsKKyAgICAgIHNvYXBfYmVnaW5fc2VuZChzb2FwKTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29ubmVjdGluZyB0byBwcm94eSBzZXJ2ZXJcbiIpKTsKKyAgICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiQ09OTkVDVCAlczolZCBIVFRQLyVzIiwgaG9zdCwgcG9ydCwgc29hcC0+aHR0cF92ZXJzaW9uKTsKKyAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCBzb2FwLT50bXBidWYsIE5VTEwpKSkKKyAgICAgIHsgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIGlmIChzb2FwLT5wcm94eV91c2VyaWQgJiYgc29hcC0+cHJveHlfcGFzc3dkICYmIHN0cmxlbihzb2FwLT5wcm94eV91c2VyaWQpICsgc3RybGVuKHNvYXAtPnByb3h5X3Bhc3N3ZCkgPCA3NjEpCisgICAgICB7IHNwcmludGYoc29hcC0+dG1wYnVmICsgMjYyLCAiJXM6JXMiLCBzb2FwLT5wcm94eV91c2VyaWQsIHNvYXAtPnByb3h5X3Bhc3N3ZCk7CisgICAgICAgIHN0cmNweShzb2FwLT50bXBidWYsICJCYXNpYyAiKTsKKyAgICAgICAgc29hcF9zMmJhc2U2NChzb2FwLCAoY29uc3QgdW5zaWduZWQgY2hhciopKHNvYXAtPnRtcGJ1ZiArIDI2MiksIHNvYXAtPnRtcGJ1ZiArIDYsIHN0cmxlbihzb2FwLT50bXBidWYgKyAyNjIpKTsKKyAgICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJQcm94eS1BdXRob3JpemF0aW9uIiwgc29hcC0+dG1wYnVmKSkpCisgICAgICAgIHsgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKyAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCBOVUxMLCBOVUxMKSkKKyAgICAgICB8fCBzb2FwX2ZsdXNoKHNvYXApKQorICAgICAgeyBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgICBzb2FwLT5vbW9kZSA9IGs7CisgICAgICBrID0gc29hcC0+aW1vZGU7CisgICAgICBzb2FwLT5pbW9kZSAmPSB+U09BUF9FTkM7IC8qIG1hc2sgSU8gYW5kIEVOQyAqLworICAgICAgdiA9IHNvYXAtPnZlcnNpb247IC8qIHByZXNlcnZlICovCisgICAgICB1c2VyaWQgPSBzb2FwLT51c2VyaWQ7IC8qIHByZXNlcnZlICovCisgICAgICBwYXNzd2QgPSBzb2FwLT5wYXNzd2Q7IC8qIHByZXNlcnZlICovCisgICAgICBpZiAoc29hcF9iZWdpbl9yZWN2KHNvYXApKQorICAgICAgeyBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgICBzb2FwLT51c2VyaWQgPSB1c2VyaWQ7IC8qIHJlc3RvcmUgKi8KKyAgICAgIHNvYXAtPnBhc3N3ZCA9IHBhc3N3ZDsgLyogcmVzdG9yZSAqLworICAgICAgc29hcC0+dmVyc2lvbiA9IHY7IC8qIHJlc3RvcmUgKi8KKyAgICAgIHNvYXAtPmltb2RlID0gazsgLyogcmVzdG9yZSAqLworICAgICAgc29hcC0+Y291bnQgPSBuOyAvKiByZXN0b3JlICovCisgICAgICBzb2FwX2JlZ2luX3NlbmQoc29hcCk7CisgICAgfQorICAgIGlmICghc29hcC0+Y3R4ICYmIChzb2FwLT5lcnJvciA9IHNvYXAtPmZzc2xhdXRoKHNvYXApKSkKKyAgICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIlNTTCBhdXRoZW50aWNhdGlvbiBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKTogY2hlY2sgcGFzc3dvcmQsIGtleSBmaWxlLCBhbmQgY2EgZmlsZS4iLCBTT0FQX1NTTF9FUlJPUik7CisgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgIH0KKyAgICBzb2FwLT5zc2wgPSBTU0xfbmV3KHNvYXAtPmN0eCk7CisgICAgaWYgKCFzb2FwLT5zc2wpCisgICAgeyBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9TU0xfRVJST1I7CisgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisgICAgaWYgKHNvYXAtPnNlc3Npb24pCisgICAgeyBpZiAoIXN0cmNtcChzb2FwLT5zZXNzaW9uX2hvc3QsIGhvc3QpICYmIHNvYXAtPnNlc3Npb25fcG9ydCA9PSBwb3J0KQorICAgICAgICBTU0xfc2V0X3Nlc3Npb24oc29hcC0+c3NsLCBzb2FwLT5zZXNzaW9uKTsKKyAgICAgIFNTTF9TRVNTSU9OX2ZyZWUoc29hcC0+c2Vzc2lvbik7CisgICAgICBzb2FwLT5zZXNzaW9uID0gTlVMTDsKKyAgICB9CisgICAgc29hcC0+aW1vZGUgfD0gU09BUF9FTkNfU1NMOworICAgIHNvYXAtPm9tb2RlIHw9IFNPQVBfRU5DX1NTTDsKKyAgICBiaW8gPSBCSU9fbmV3X3NvY2tldCgoU09BUF9TT0NLRVQpZmQsIEJJT19OT0NMT1NFKTsKKyAgICBTU0xfc2V0X2Jpbyhzb2FwLT5zc2wsIGJpbywgYmlvKTsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKHNvYXAtPmNvbm5lY3RfdGltZW91dCkKKyNpZiBkZWZpbmVkKFdJTjMyKQorICAgIHsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgJm5vbmJsb2NraW5nKTsKKyAgICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgICAgeyB1X2xvbmcgbm9uYmxvY2tpbmcgPSAxOworICAgICAgaW9jdGwoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAoaW50KSgmbm9uYmxvY2tpbmcpKTsKKyAgICB9CisjZWxzZQorICAgICAgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfR0VURkwpfE9fTk9OQkxPQ0spOworI2VuZGlmCisjZW5kaWYKKyAgICBmb3IgKDs7KQorICAgIHsgaWYgKChyID0gU1NMX2Nvbm5lY3Qoc29hcC0+c3NsKSkgPD0gMCkKKyAgICAgIHsgaW50IGVyciA9IFNTTF9nZXRfZXJyb3Ioc29hcC0+c3NsLCByKTsKKyAgICAgICAgaWYgKGVyciAhPSBTU0xfRVJST1JfTk9ORSAmJiBlcnIgIT0gU1NMX0VSUk9SX1dBTlRfUkVBRCAmJiBlcnIgIT0gU1NMX0VSUk9SX1dBTlRfV1JJVEUpCisgICAgICAgIHsgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHNzbF9lcnJvcihzb2FwLCByKSwgIlNTTCBjb25uZWN0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9TU0xfRVJST1IpOworICAgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICB9CisgICAgICAgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQpCisgICAgICAgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgICAgICBmZF9zZXQgZmRzOworICAgICAgICAgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQgPiAwKQorICAgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSBzb2FwLT5jb25uZWN0X3RpbWVvdXQ7CisgICAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IC1zb2FwLT5jb25uZWN0X3RpbWVvdXQvMTAwMDAwMDsKKyAgICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IC1zb2FwLT5jb25uZWN0X3RpbWVvdXQlMTAwMDAwMDsKKyAgICAgICAgICB9CisgICAgICAgICAgRkRfWkVSTygmZmRzKTsKKyAgICAgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKWZkLCAmZmRzKTsKKyAgICAgICAgICBmb3IgKDs7KQorICAgICAgICAgIHsgaW50IHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShmZCArIDEpLCAmZmRzLCBOVUxMLCAmZmRzLCAmdGltZW91dCk7CisgICAgICAgICAgICBpZiAociA+IDApCisJICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoIXIpCisgICAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IDA7CisgICAgICAgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29ubmVjdCB0aW1lb3V0XG4iKSk7CisgICAgICAgICAgICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCAiVGltZW91dCIsICJjb25uZWN0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCSAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKHNvYXAtPmNvbm5lY3RfdGltZW91dCkKKyNpZmRlZiBXSU4zMgorICAgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgJmJsb2NraW5nKTsKKyAgICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgICAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgICAgaW9jdGwoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAoaW50KSgmYmxvY2tpbmcpKTsKKyAgICB9CisjZWxzZQorICAgICAgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfR0VURkwpJn5PX05PTkJMT0NLKTsKKyNlbmRpZgorI2VuZGlmCisgICAgaWYgKHNvYXAtPnJlcXVpcmVfc2VydmVyX2F1dGgpCisgICAgeyBYNTA5ICpwZWVyOworICAgICAgaW50IGVycjsKKyAgICAgIGlmICgoZXJyID0gU1NMX2dldF92ZXJpZnlfcmVzdWx0KHNvYXAtPnNzbCkpICE9IFg1MDlfVl9PSykKKyAgICAgIHsgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIFg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKGVyciksICJTU0wgY2VydGlmaWNhdGUgcHJlc2VudGVkIGJ5IHBlZXIgY2Fubm90IGJlIHZlcmlmaWVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyAgICAgIHBlZXIgPSBTU0xfZ2V0X3BlZXJfY2VydGlmaWNhdGUoc29hcC0+c3NsKTsKKyAgICAgIGlmICghcGVlcikKKyAgICAgIHsgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiTm8gU1NMIGNlcnRpZmljYXRlIHdhcyBwcmVzZW50ZWQgYnkgdGhlIHBlZXIgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgICAgWDUwOV9OQU1FX2dldF90ZXh0X2J5X05JRChYNTA5X2dldF9zdWJqZWN0X25hbWUocGVlciksIE5JRF9jb21tb25OYW1lLCBzb2FwLT5tc2didWYsIHNpemVvZihzb2FwLT5tc2didWYpKTsKKyAgICAgIFg1MDlfZnJlZShwZWVyKTsKKyAgICAgIGlmIChzb2FwX3RhZ19jbXAoc29hcC0+bXNnYnVmLCBob3N0KSkKKyAgICAgIHsgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiU1NMIGNlcnRpZmljYXRlIGhvc3QgbmFtZSBtaXNtYXRjaCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9TU0xfRVJST1IpOworICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfU1NMX0VSUk9SOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworI2VuZGlmCisgIH0KKyAgcmV0dXJuIGZkOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JpbmQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmhvc3QsIGludCBwb3J0LCBpbnQgYmFja2xvZykKK3sKKyNpZmRlZiBXSVRIX0lQVjYKKyAgc3RydWN0IGFkZHJpbmZvICphZGRyaW5mbyA9IE5VTEw7CisgIHN0cnVjdCBhZGRyaW5mbyBoaW50czsKKyAgc3RydWN0IGFkZHJpbmZvIHJlczsKKyAgaW50IGVycjsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaW50IGxlbiA9IFNPQVBfQlVGTEVOOworICBpbnQgc2V0ID0gMTsKKyNlbmRpZgorICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSkKKyAgeyBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKXNvYXAtPm1hc3Rlcik7CisgICAgc29hcC0+bWFzdGVyID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBzb2FwLT5zb2NrZXQgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICBzb2FwLT5lcnJtb2RlID0gMTsKKyAgaWYgKHRjcF9pbml0KHNvYXApKQorICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgIlRDUCBpbml0IGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorI2lmZGVmIFdJVEhfSVBWNgorICBtZW1zZXQoKHZvaWQqKSZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisgIGhpbnRzLmFpX2ZhbWlseSA9IFBGX1VOU1BFQzsKKyNpZmRlZiBXSVRIX1VEUAorICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19ER1JBTTsKKyAgZWxzZQorI2VuZGlmCisgICAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKyAgaGludHMuYWlfZmxhZ3MgPSBBSV9QQVNTSVZFOworICBzb2FwLT5lcnJtb2RlID0gMjsKKyAgZXJyID0gZ2V0YWRkcmluZm8oaG9zdCwgc29hcF9pbnQycyhzb2FwLCBwb3J0KSwgJmhpbnRzLCAmYWRkcmluZm8pOworICBpZiAoYWRkcmluZm8pCisgIHsgcmVzID0gKmFkZHJpbmZvOworICAgIHNvYXAtPnBlZXIgPSAqKChzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSopYWRkcmluZm8tPmFpX2FkZHIpOworICAgIHNvYXAtPnBlZXJsZW4gPSBhZGRyaW5mby0+YWlfYWRkcmxlbjsKKyAgICByZXMuYWlfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyOworICAgIHJlcy5haV9hZGRybGVuID0gc29hcC0+cGVlcmxlbjsKKyAgICBmcmVlYWRkcmluZm8oYWRkcmluZm8pOworICB9CisgIGlmIChlcnIpCisgIHsgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgZ2FpX3N0cmVycm9yKGVyciksICJnZXRhZGRyaW5mbyBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgc29hcC0+bWFzdGVyID0gc29ja2V0KHJlcy5haV9mYW1pbHksIHJlcy5haV9zb2NrdHlwZSwgcmVzLmFpX3Byb3RvY29sKTsKKyNlbHNlCisjaWZkZWYgV0lUSF9VRFAKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICBzb2FwLT5tYXN0ZXIgPSAoaW50KXNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKyAgZWxzZQorI2VuZGlmCisgICAgc29hcC0+bWFzdGVyID0gKGludClzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOworI2VuZGlmCisgIHNvYXAtPmVycm1vZGUgPSAwOworICBpZiAoIXNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic29ja2V0IGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorI2lmZGVmIFdJVEhfVURQCisgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgc29hcC0+c29ja2V0ID0gc29hcC0+bWFzdGVyOworI2VuZGlmCisjaWZkZWYgU09DS0VUX0NMT1NFX09OX0VYRUMKKyNpZmRlZiBXSU4zMgorI2lmbmRlZiBVTkRFUl9DRQorICBTZXRIYW5kbGVJbmZvcm1hdGlvbigoSEFORExFKXNvYXAtPm1hc3RlciwgSEFORExFX0ZMQUdfSU5IRVJJVCwgMCk7CisjZW5kaWYKKyNlbHNlCisgIGZjbnRsKHNvYXAtPm1hc3RlciwgRl9TRVRGRCwgMSk7CisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPmJpbmRfZmxhZ3MgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBTT0xfU09DS0VULCBzb2FwLT5iaW5kX2ZsYWdzLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIGlmICgoKHNvYXAtPmltb2RlIHwgc29hcC0+b21vZGUpICYgU09BUF9JT19LRUVQQUxJVkUpICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fS0VFUEFMSVZFIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBTT0xfU09DS0VULCBTT19TTkRCVUYsIChjaGFyKikmbGVuLCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19TTkRCVUYgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIGlmIChzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgKGNoYXIqKSZsZW4sIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX1JDVkJVRiBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNpZmRlZiBUQ1BfTk9ERUxBWQorICBpZiAoIShzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFRDUF9OT0RFTEFZIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBXSVRIX0lQVjYKKyAgc29hcC0+ZXJybW9kZSA9IDA7CisgIGlmIChiaW5kKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIHJlcy5haV9hZGRyLCByZXMuYWlfYWRkcmxlbikpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgYmluZCB0byBob3N0XG4iKSk7CisgICAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiYmluZCBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0gIAorI2Vsc2UKKyAgc29hcC0+cGVlcmxlbiA9IHNpemVvZihzb2FwLT5wZWVyKTsKKyAgbWVtc2V0KCh2b2lkKikmc29hcC0+cGVlciwgMCwgc2l6ZW9mKHNvYXAtPnBlZXIpKTsKKyAgc29hcC0+cGVlci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgc29hcC0+ZXJybW9kZSA9IDI7CisgIGlmIChob3N0KQorICB7IGlmIChzb2FwLT5mcmVzb2x2ZShzb2FwLCBob3N0LCAmc29hcC0+cGVlci5zaW5fYWRkcikpCisgICAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJnZXQgaG9zdCBieSBuYW1lIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgIH0KKyAgfQorICBlbHNlCisgICAgc29hcC0+cGVlci5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfQU5ZKTsKKyAgc29hcC0+cGVlci5zaW5fcG9ydCA9IGh0b25zKChzaG9ydClwb3J0KTsKKyAgc29hcC0+ZXJybW9kZSA9IDA7CisgIGlmIChiaW5kKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyLCBzb2FwLT5wZWVybGVuKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBiaW5kIHRvIGhvc3RcbiIpKTsKKyAgICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJiaW5kIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorI2VuZGlmCisgIGlmICghKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApICYmIGxpc3RlbigoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBiYWNrbG9nKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBiaW5kIHRvIGhvc3RcbiIpKTsKKyAgICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJsaXN0ZW4gZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9ICAKKyAgcmV0dXJuIHNvYXAtPm1hc3RlcjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wb2xsKHN0cnVjdCBzb2FwICpzb2FwKQoreyAKKyNpZm5kZWYgV0lUSF9MRUFOCisgIHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgIGZkX3NldCByZmQsIHNmZCwgeGZkOworICBpbnQgcjsKKyAgdGltZW91dC50dl9zZWMgPSAwOworICB0aW1lb3V0LnR2X3VzZWMgPSAwOworICBGRF9aRVJPKCZyZmQpOworICBGRF9aRVJPKCZzZmQpOworICBGRF9aRVJPKCZ4ZmQpOworICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgeyBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnJmZCk7CisgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZzZmQpOworICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmeGZkKTsKKyAgICByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksICZyZmQsICZzZmQsICZ4ZmQsICZ0aW1lb3V0KTsKKyAgICBpZiAociA+IDAgJiYgRkRfSVNTRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnhmZCkpCisgICAgICByID0gLTE7CisgIH0KKyAgZWxzZSBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSkKKyAgeyBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgJnNmZCk7CisgICAgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPm1hc3RlciArIDEpLCBOVUxMLCAmc2ZkLCBOVUxMLCAmdGltZW91dCk7CisgIH0KKyAgZWxzZQorICAgIHJldHVybiBTT0FQX09LOworICBpZiAociA+IDApCisgIHsKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICBpZiAoc29hcC0+aW1vZGUgJiBTT0FQX0VOQ19TU0wpCisgICAgeworICAgICAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkKKyAgICAgICAmJiBGRF9JU1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmc2ZkKQorICAgICAgICYmICghRkRfSVNTRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnJmZCkKKyAgICAgICAgfHwgU1NMX3BlZWsoc29hcC0+c3NsLCBzb2FwLT50bXBidWYsIDEpID4gMCkpCisgICAgICAgIHJldHVybiBTT0FQX09LOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICAgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpCisgICAgICAgJiYgRkRfSVNTRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnNmZCkKKyAgICAgICAmJiAoIUZEX0lTU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZyZmQpCisgICAgICAgIHx8IHJlY3YoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgc29hcC0+dG1wYnVmLCAxLCBNU0dfUEVFSykgPiAwKSkKKyAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgZWxzZSBpZiAociA8IDApCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgaWYgKChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpIHx8IHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIpCisgICAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZWxlY3QgZmFpbGVkIGluIHNvYXBfcG9sbCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9UQ1BfRVJST1I7CisgICAgfQorICB9CisgIGVsc2UKKyAgICBzb2FwLT5lcnJudW0gPSAwOworICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiUG9sbGluZzogb3RoZXIgZW5kIGRvd24gb24gc29ja2V0PSVkIHNlbGVjdD0lZFxuIiwgc29hcC0+c29ja2V0LCByKSk7CisgIHJldHVybiBTT0FQX0VPRjsKKyNlbHNlCisgIHJldHVybiBTT0FQX09LOworI2VuZGlmCit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Cit0Y3BfYWNjZXB0KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgcywgc3RydWN0IHNvY2thZGRyICphLCBpbnQgKm4pCit7IGludCBmZDsKKyAgZmQgPSAoaW50KWFjY2VwdCgoU09BUF9TT0NLRVQpcywgYSwgKFNPQVBfU09DS0xFTl9UKiluKTsJLyogcG9ydGFiaWxpdHkgbm90ZTogc2VlIFNPQVBfU09DS0xFTl9UIGRlZmluaXRpb24gaW4gc3Rkc29hcDIuaCAqLworI2lmZGVmIFNPQ0tFVF9DTE9TRV9PTl9FWEVDCisjaWZkZWYgV0lOMzIKKyNpZm5kZWYgVU5ERVJfQ0UKKyAgU2V0SGFuZGxlSW5mb3JtYXRpb24oKEhBTkRMRSlmZCwgSEFORExFX0ZMQUdfSU5IRVJJVCwgMCk7CisjZW5kaWYKKyNlbHNlCisgIGZjbnRsKGZkLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKKyNlbmRpZgorI2VuZGlmCisgIHJldHVybiBmZDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9hY2NlcHQoc3RydWN0IHNvYXAgKnNvYXApCit7IGludCBuID0gKGludClzaXplb2Yoc29hcC0+cGVlcik7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpbnQgbGVuID0gU09BUF9CVUZMRU47CisgIGludCBzZXQgPSAxOworI2VuZGlmCisgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyNpZmRlZiBXSVRIX1VEUAorICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIHJldHVybiBzb2FwLT5zb2NrZXQgPSBzb2FwLT5tYXN0ZXI7CisjZW5kaWYKKyAgbWVtc2V0KCh2b2lkKikmc29hcC0+cGVlciwgMCwgc2l6ZW9mKHNvYXAtPnBlZXIpKTsKKyAgc29hcC0+c29ja2V0ID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgc29hcC0+ZXJybW9kZSA9IDA7CisgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOworICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSkKKyAgeyBmb3IgKDs7KQorICAgIHsgCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgaWYgKHNvYXAtPmFjY2VwdF90aW1lb3V0KQorICAgICAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgICAgICBmZF9zZXQgZmQ7CisgICAgICAgIGlmIChzb2FwLT5hY2NlcHRfdGltZW91dCA+IDApCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSBzb2FwLT5hY2NlcHRfdGltZW91dDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IC1zb2FwLT5hY2NlcHRfdGltZW91dC8xMDAwMDAwOworICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IC1zb2FwLT5hY2NlcHRfdGltZW91dCUxMDAwMDAwOworICAgICAgICB9CisgICAgICAgIEZEX1pFUk8oJmZkKTsKKyAgICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsICZmZCk7CisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsgaW50IHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5tYXN0ZXIgKyAxKSwgJmZkLCAmZmQsIE5VTEwsICZ0aW1lb3V0KTsKKyAgICAgICAgICBpZiAociA+IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBpZiAoIXIpCisgICAgICAgICAgeyBzb2FwLT5lcnJudW0gPSAwOworICAgICAgICAgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlRpbWVvdXQiLCAiYWNjZXB0IGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSKQorICAgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJhY2NlcHQgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyNpZiBkZWZpbmVkKFdJTjMyKQorCXsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICAgICAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGSU9OQklPLCAmbm9uYmxvY2tpbmcpOworICAgICAgICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgICAgICAgIHsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICAgICAgICBpb2N0bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGSU9OQklPLCAoaW50KSgmbm9uYmxvY2tpbmcpKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRl9HRVRGTCl8T19OT05CTE9DSyk7CisjZW5kaWYKKyAgICAgIH0KKyAgICAgIGVsc2UKKyNpZiBkZWZpbmVkKFdJTjMyKQorICAgICAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgICAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGSU9OQklPLCAmYmxvY2tpbmcpOworICAgICAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICAgICAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgICAgICBpb2N0bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGSU9OQklPLCAoaW50KSgmYmxvY2tpbmcpKTsKKyAgICAgIH0KKyNlbHNlCisgICAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfR0VURkwpJn5PX05PTkJMT0NLKTsKKyNlbmRpZgorI2VuZGlmCisgICAgICBzb2FwLT5zb2NrZXQgPSBzb2FwLT5mYWNjZXB0KHNvYXAsIHNvYXAtPm1hc3RlciwgKHN0cnVjdCBzb2NrYWRkciopJnNvYXAtPnBlZXIsICZuKTsKKyAgICAgIHNvYXAtPnBlZXJsZW4gPSAoc2l6ZV90KW47CisgICAgICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgICAgIHsKKyNpZmRlZiBXSVRIX0lQVjYKKy8qIFVzZSBzb2FwLT5ob3N0IHRvIHN0b3JlIHRoZSBudW1lcmljIGZvcm0gb2YgdGhlIHJlbW90ZSBob3N0ICovCisgICAgICAgIGdldG5hbWVpbmZvKChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyLCBuLCBzb2FwLT5ob3N0LCBzaXplb2Yoc29hcC0+aG9zdCksIE5VTEwsIDAsIE5JX05VTUVSSUNIT1NUIHwgTklfTlVNRVJJQ1NFUlYpOyAKKyAgICAgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFjY2VwdCBzb2NrZXQgJWQgZnJvbSAlc1xuIiwgc29hcC0+c29ja2V0LCBzb2FwLT5ob3N0KSk7CisgICAgICAgIHNvYXAtPmlwID0gMDsgLyogaW5mbyBzdG9yZWQgaW4gc29hcC0+cGVlciBhbmQgc29hcC0+aG9zdCAqLworICAgICAgICBzb2FwLT5wb3J0ID0gMDsgLyogaW5mbyBzdG9yZWQgaW4gc29hcC0+cGVlciBhbmQgc29hcC0+aG9zdCAqLworI2Vsc2UKKyAgICAgICAgc29hcC0+aXAgPSBudG9obChzb2FwLT5wZWVyLnNpbl9hZGRyLnNfYWRkcik7CisgICAgICAgIHNvYXAtPnBvcnQgPSAoaW50KW50b2hzKHNvYXAtPnBlZXIuc2luX3BvcnQpOyAvKiBkb2VzIG5vdCByZXR1cm4gcG9ydCBudW1iZXIgb24gc29tZSBzeXN0ZW1zICovCisgICAgICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJBY2NlcHQgc29ja2V0ICVkIGF0IHBvcnQgJWQgZnJvbSBJUCAlZC4lZC4lZC4lZFxuIiwgc29hcC0+c29ja2V0LCBzb2FwLT5wb3J0LCAoaW50KShzb2FwLT5pcD4+MjQpJjB4RkYsIChpbnQpKHNvYXAtPmlwPj4xNikmMHhGRiwgKGludCkoc29hcC0+aXA+PjgpJjB4RkYsIChpbnQpc29hcC0+aXAmMHhGRikpOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorCWlmIChzb2FwLT5hY2NlcHRfZmxhZ3MgJiBTT19MSU5HRVIpCisgICAgICAgIHsgc3RydWN0IGxpbmdlciBsaW5nZXI7CisgICAgICAgICAgbWVtc2V0KCh2b2lkKikmbGluZ2VyLCAwLCBzaXplb2YobGluZ2VyKSk7CisgICAgICAgICAgbGluZ2VyLmxfb25vZmYgPSAxOworICAgICAgICAgIGxpbmdlci5sX2xpbmdlciA9IDA7CisJICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBTT0xfU09DS0VULCBTT19MSU5HRVIsIChjaGFyKikmbGluZ2VyLCBzaXplb2Yoc3RydWN0IGxpbmdlcikpKQorICAgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisJICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fTElOR0VSIGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworCSAgICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworCSAgfQorICAgICAgICB9CisgICAgICAgIGlmICgoc29hcC0+YWNjZXB0X2ZsYWdzICYgflNPX0xJTkdFUikgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBTT0xfU09DS0VULCBzb2FwLT5hY2NlcHRfZmxhZ3MgJiB+U09fTElOR0VSLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisJICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKChzb2FwLT5pbW9kZSB8IHNvYXAtPm9tb2RlKSAmIFNPQVBfSU9fS0VFUEFMSVZFKSAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX0tFRVBBTElWRSBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKwkgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICB9CisgICAgICAgIGlmIChzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwgKGNoYXIqKSZsZW4sIHNpemVvZihpbnQpKSkKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX1NOREJVRiBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKwkgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICB9CisgICAgICAgIGlmIChzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgKGNoYXIqKSZsZW4sIHNpemVvZihpbnQpKSkKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX1JDVkJVRiBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKwkgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICB9CisjaWZkZWYgVENQX05PREVMQVkKKyAgICAgICAgaWYgKCEoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBUQ1BfTk9ERUxBWSBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKwkgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICB9CisjZW5kaWYKKyNlbmRpZgorICAgICAgICBpZiAoc29hcC0+YWNjZXB0X3RpbWVvdXQpCisgICAgICAgIHsKKyNpZiBkZWZpbmVkKFdJTjMyKQorICAgICAgICAgIHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgICAgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRklPTkJJTywgJmJsb2NraW5nKTsKKyAgICAgICAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGSU9OQklPLCAmYmxvY2tpbmcpOworI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICAgICAgICAgIHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgICAgICAgaW9jdGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRklPTkJJTywgKGludCkoJmJsb2NraW5nKSk7CisgICAgICAgICAgaW9jdGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRklPTkJJTywgKGludCkoJmJsb2NraW5nKSk7CisjZWxpZiBkZWZpbmVkKFBBTE0pCisgICAgICAgICAgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRl9HRVRGTCwwKSZ+T19OT05CTE9DSyk7CisgICAgICAgICAgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRl9HRVRGTCwwKSZ+T19OT05CTE9DSyk7CisjZWxpZiBkZWZpbmVkKFNZTUJJQU4pCisgICAgICAgICAgbG9uZyBibG9ja2luZyA9IDA7CisgICAgICAgICAgaW9jdGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgMC8qRklPTkJJTyovLCAmYmxvY2tpbmcpOworI2Vsc2UKKyAgICAgICAgICBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGX0dFVEZMKSZ+T19OT05CTE9DSyk7CisgICAgICAgICAgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRl9HRVRGTCkmfk9fTk9OQkxPQ0spOworI2VuZGlmCisJfQorICAgICAgICBzb2FwLT5rZWVwX2FsaXZlID0gKCgoc29hcC0+aW1vZGUgfCBzb2FwLT5vbW9kZSkgJiBTT0FQX0lPX0tFRVBBTElWRSkgIT0gMCk7CisgICAgICAgIHJldHVybiBzb2FwLT5zb2NrZXQ7CisgICAgICB9CisgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUiAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VBR0FJTikKKyAgICAgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFjY2VwdCBmYWlsZWQgZnJvbSAlc1xuIiwgc29hcC0+aG9zdCkpOworICAgICAgICBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiYWNjZXB0IGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworCXNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZQorICB7IHNvYXAtPmVycm51bSA9IDA7CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAibm8gbWFzdGVyIHNvY2tldCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Cit0Y3BfZGlzY29ubmVjdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgaWYgKHNvYXAtPnNzbCkKKyAgeyBpbnQgciwgcyA9IDA7CisgICAgaWYgKHNvYXAtPnNlc3Npb24pCisgICAgICBTU0xfU0VTU0lPTl9mcmVlKHNvYXAtPnNlc3Npb24pOworICAgIGlmICgqc29hcC0+aG9zdCkKKyAgICB7IHNvYXAtPnNlc3Npb24gPSBTU0xfZ2V0MV9zZXNzaW9uKHNvYXAtPnNzbCk7CisgICAgICBpZiAoc29hcC0+c2Vzc2lvbikKKyAgICAgIHsgc3RyY3B5KHNvYXAtPnNlc3Npb25faG9zdCwgc29hcC0+aG9zdCk7CisgICAgICAgIHNvYXAtPnNlc3Npb25fcG9ydCA9IHNvYXAtPnBvcnQ7CisgICAgICB9CisgICAgfQorICAgIHIgPSBTU0xfc2h1dGRvd24oc29hcC0+c3NsKTsKKyAgICBpZiAociAhPSAxKQorICAgIHsgcyA9IEVSUl9nZXRfZXJyb3IoKTsKKyAgICAgIGlmIChzKQorICAgICAgeyBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgICAgICAgeyBzb2FwLT5mc2h1dGRvd25zb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgMSk7CisgICAgICAgICAgc29hcC0+c29ja2V0ID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgfQorICAgICAgICByID0gU1NMX3NodXRkb3duKHNvYXAtPnNzbCk7CisgICAgICB9CisgICAgfQorICAgIERCR0xPRyhURVNULCBpZiAocykgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNodXRkb3duIGZhaWxlZDogJWRcbiIsIFNTTF9nZXRfZXJyb3Ioc29hcC0+c3NsLCByKSkpOworICAgIFNTTF9mcmVlKHNvYXAtPnNzbCk7CisgICAgc29hcC0+c3NsID0gTlVMTDsKKyAgICBpZiAocykKKyAgICAgIHJldHVybiBTT0FQX1NTTF9FUlJPUjsKKyAgICBFUlJfcmVtb3ZlX3N0YXRlKDApOworICB9CisjZW5kaWYKKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkgJiYgIShzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgeyBzb2FwLT5mc2h1dGRvd25zb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgMik7CisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQpOworICAgIHNvYXAtPnNvY2tldCA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Cit0Y3BfY2xvc2Vzb2NrZXQoc3RydWN0IHNvYXAgKnNvYXAsIFNPQVBfU09DS0VUIGZkKQoreyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNsb3NlIHNvY2tldCAlZFxuIiwgKGludClmZCkpOworICByZXR1cm4gY2xvc2Vzb2NrZXQoZmQpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAordGNwX3NodXRkb3duc29ja2V0KHN0cnVjdCBzb2FwICpzb2FwLCBTT0FQX1NPQ0tFVCBmZCwgaW50IGhvdykKK3sgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTaHV0ZG93biBzb2NrZXQgJWQgaG93PSVkXG4iLCAoaW50KWZkLCBob3cpKTsKKyAgcmV0dXJuIHNodXRkb3duKGZkLCBob3cpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfY2xvc2Vzb2NrKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgc3RhdHVzID0gc29hcC0+ZXJyb3I7CisgIGlmIChzdGF0dXMgPT0gU09BUF9FT0YgfHwgc3RhdHVzID09IFNPQVBfVENQX0VSUk9SIHx8IHN0YXR1cyA9PSBTT0FQX1NTTF9FUlJPUiB8fCAhc29hcC0+a2VlcF9hbGl2ZSkKKyAgeyBpZiAoc29hcC0+ZmNsb3NlICYmIChzb2FwLT5lcnJvciA9IHNvYXAtPmZjbG9zZShzb2FwKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7CisgIH0KKyNpZmRlZiBXSVRIX1pMSUIKKyAgaWYgKHNvYXAtPnpsaWJfc3RhdGUgPT0gU09BUF9aTElCX0RFRkxBVEUpCisgICAgZGVmbGF0ZUVuZCgmc29hcC0+ZF9zdHJlYW0pOworICBlbHNlIGlmIChzb2FwLT56bGliX3N0YXRlID09IFNPQVBfWkxJQl9JTkZMQVRFKQorICAgIGluZmxhdGVFbmQoJnNvYXAtPmRfc3RyZWFtKTsKKyAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9OT05FOworI2VuZGlmCisgIHJldHVybiBzb2FwLT5lcnJvciA9IHN0YXR1czsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitzaXplX3QKK1NPQVBfRk1BQzIKK3NvYXBfaGFzaChyZWdpc3RlciBjb25zdCBjaGFyICpzKQoreyByZWdpc3RlciBzaXplX3QgaCA9IDA7CisgIHdoaWxlICgqcykKKyAgICBoID0gNjU1OTkqaCArICpzKys7CisgIHJldHVybiBoICUgU09BUF9JREhBU0g7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZAorc29hcF9pbml0X3BodChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5pdGlhbGl6aW5nIHBvaW50ZXIgaGFzaHRhYmxlXG4iKSk7CisgIHNvYXAtPnBibGsgPSBOVUxMOworICBzb2FwLT5waWR4ID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IChpbnQpU09BUF9QVFJIQVNIOyBpKyspCisgICAgc29hcC0+cGh0W2ldID0gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc3RydWN0IHNvYXAqCitTT0FQX0ZNQUMyCitzb2FwX25ldzEoc29hcF9tb2RlIG1vZGUpCit7IHJldHVybiBzb2FwX25ldzIobW9kZSwgbW9kZSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcCoKK1NPQVBfRk1BQzIKK3NvYXBfbmV3KCkKK3sgcmV0dXJuIHNvYXBfbmV3MihTT0FQX0lPX0RFRkFVTFQsIFNPQVBfSU9fREVGQVVMVCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcCoKK1NPQVBfRk1BQzIKK3NvYXBfbmV3Mihzb2FwX21vZGUgaW1vZGUsIHNvYXBfbW9kZSBvbW9kZSkKK3sgc3RydWN0IHNvYXAgKnNvYXAgPSAoc3RydWN0IHNvYXAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHNvYXApKTsKKyAgaWYgKHNvYXApCisgICAgc29hcF9pbml0Mihzb2FwLCBpbW9kZSwgb21vZGUpOworICByZXR1cm4gc29hcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZGVsKHN0cnVjdCBzb2FwICpzb2FwKQoreyBmcmVlKHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyB2b2lkCitzb2FwX2ZyZWVfcGh0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wYmxrICpwYiwgKm5leHQ7CisgIHJlZ2lzdGVyIGludCBpOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWUgcG9pbnRlciBoYXNodGFibGVcbiIpKTsKKyAgZm9yIChwYiA9IHNvYXAtPnBibGs7IHBiOyBwYiA9IG5leHQpCisgIHsgbmV4dCA9IHBiLT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBwYik7CisgIH0KKyAgc29hcC0+cGJsayA9IE5VTEw7CisgIHNvYXAtPnBpZHggPSAwOworICBmb3IgKGkgPSAwOyBpIDwgKGludClTT0FQX1BUUkhBU0g7IGkrKykKKyAgICBzb2FwLT5waHRbaV0gPSBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VtYmVkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGNvbnN0IGNoYXIgKnRhZywgaW50IHR5cGUpCit7IHJlZ2lzdGVyIGludCBpOworICBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgIGlmIChzb2FwLT52ZXJzaW9uICE9IDEpCisgICAgc29hcC0+ZW5jb2RpbmcgPSAxOworICBpZiAoYSkKKyAgICBpID0gc29hcF9hcnJheV9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCBhLCBuLCB0eXBlLCAmcHApOworICBlbHNlCisgICAgaSA9IHNvYXBfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgdHlwZSwgJnBwKTsKKyAgaWYgKGkpCisgIHsgaWYgKHNvYXBfaXNfZW1iZWRkZWQoc29hcCwgcHApCisgICAgIHx8IHNvYXBfaXNfc2luZ2xlKHNvYXAsIHBwKSkKKyAgICAgIHJldHVybiAwOworICAgIHNvYXBfc2V0X2VtYmVkZGVkKHNvYXAsIHBwKTsKKyAgfQorICByZXR1cm4gaTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wb2ludGVyX2xvb2t1cChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCwgaW50IHR5cGUsIHN0cnVjdCBzb2FwX3BsaXN0ICoqcHBwKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgICpwcHAgPSBOVUxMOworICBpZiAocCkKKyAgeyBmb3IgKHBwID0gc29hcC0+cGh0W3NvYXBfaGFzaF9wdHIocCldOyBwcDsgcHAgPSBwcC0+bmV4dCkKKyAgICB7IGlmIChwcC0+cHRyID09IHAgJiYgcHAtPnR5cGUgPT0gdHlwZSkKKyAgICAgIHsgKnBwcCA9IHBwOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkxvb2t1cCBsb2NhdGlvbj0lcCB0eXBlPSVkIGlkPSVkXG4iLCBwLCB0eXBlLCBwcC0+aWQpKTsKKyAgICAgICAgcmV0dXJuIHBwLT5pZDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJMb29rdXAgbG9jYXRpb249JXAgdHlwZT0lZDogbm90IGZvdW5kXG4iLCBwLCB0eXBlKSk7CisgIHJldHVybiAwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3BvaW50ZXJfZW50ZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgbiwgaW50IHR5cGUsIHN0cnVjdCBzb2FwX3BsaXN0ICoqcHBwKQoreyByZWdpc3RlciBpbnQgaDsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICBpZiAoIXNvYXAtPnBibGsgfHwgc29hcC0+cGlkeCA+PSBTT0FQX1BUUkJMSykKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wYmxrICpwYiA9IChzdHJ1Y3Qgc29hcF9wYmxrKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfcGJsaykpOworICAgIGlmICghcGIpCisgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHBiLT5uZXh0ID0gc29hcC0+cGJsazsKKyAgICBzb2FwLT5wYmxrID0gcGI7CisgICAgc29hcC0+cGlkeCA9IDA7CisgIH0KKyAgKnBwcCA9IHBwID0gJnNvYXAtPnBibGstPnBsaXN0W3NvYXAtPnBpZHgrK107CisgIGlmIChhKQorICAgIGggPSBzb2FwX2hhc2hfcHRyKGEtPl9fcHRyKTsKKyAgZWxzZQorICAgIGggPSBzb2FwX2hhc2hfcHRyKHApOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlBvaW50ZXIgZW50ZXIgbG9jYXRpb249JXAgYXJyYXk9JXAgc2l6ZT0lZCBkaW09JWQgdHlwZT0lZCBpZD0lZFxuIiwgcCwgYT9hLT5fX3B0cjpOVUxMLCBhP2EtPl9fc2l6ZTowLCBuLCB0eXBlLCBzb2FwLT5pZG51bSsxKSk7CisgIHBwLT5uZXh0ID0gc29hcC0+cGh0W2hdOworICBwcC0+dHlwZSA9IHR5cGU7CisgIHBwLT5tYXJrMSA9IDA7CisgIHBwLT5tYXJrMiA9IDA7CisgIHBwLT5wdHIgPSBwOworICBwcC0+YXJyYXkgPSBhOworICBzb2FwLT5waHRbaF0gPSBwcDsKKyAgcHAtPmlkID0gKytzb2FwLT5pZG51bTsKKyAgcmV0dXJuIHBwLT5pZDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9hcnJheV9wb2ludGVyX2xvb2t1cChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCwgY29uc3Qgc3RydWN0IHNvYXBfYXJyYXkgKmEsIGludCBuLCBpbnQgdHlwZSwgc3RydWN0IHNvYXBfcGxpc3QgKipwcHApCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgKnBwcCA9IE5VTEw7CisgIGlmICghcCB8fCAhYS0+X19wdHIpCisgICAgcmV0dXJuIDA7CisgIGZvciAocHAgPSBzb2FwLT5waHRbc29hcF9oYXNoX3B0cihhLT5fX3B0cildOyBwcDsgcHAgPSBwcC0+bmV4dCkKKyAgeyBpZiAocHAtPnR5cGUgPT0gdHlwZSAmJiBwcC0+YXJyYXkgJiYgcHAtPmFycmF5LT5fX3B0ciA9PSBhLT5fX3B0cikKKyAgICB7IHJlZ2lzdGVyIGludCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgaWYgKCgoY29uc3QgaW50KikmcHAtPmFycmF5LT5fX3NpemUpW2ldICE9ICgoY29uc3QgaW50KikmYS0+X19zaXplKVtpXSkKKwkgIGJyZWFrOworICAgICAgaWYgKGkgPT0gbikKKyAgICAgIHsgKnBwcCA9IHBwOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFycmF5IGxvb2t1cCBsb2NhdGlvbj0lcCB0eXBlPSVkIGlkPSVkXG4iLCBhLT5fX3B0ciwgdHlwZSwgcHAtPmlkKSk7CisgICAgICAgIHJldHVybiBwcC0+aWQ7CisgICAgICB9CisgICAgfQorICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQXJyYXkgbG9va3VwIGxvY2F0aW9uPSVwIHR5cGU9JWQ6IG5vdCBmb3VuZFxuIiwgYS0+X19wdHIsIHR5cGUpKTsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9iZWdpbl9jb3VudChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcF9jbHJfYXR0cihzb2FwKTsKKyAgc29hcF9zZXRfbG9jYWxfbmFtZXNwYWNlcyhzb2FwKTsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkgfHwgKHNvYXAtPm9tb2RlICYgU09BUF9FTkNfRElNRSkpCisgICAgc29hcC0+bW9kZSA9IHNvYXAtPm9tb2RlIHwgU09BUF9JT19MRU5HVEggfCBTT0FQX0VOQ19ESU1FOworICBlbHNlCisjZW5kaWYKKyAgeyBzb2FwLT5tb2RlID0gc29hcC0+b21vZGU7CisgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19TVE9SRQorICAgICB8fCAoKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSyB8fCAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1hNTCkpCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgICAgICAmJiAhc29hcC0+ZnByZXBhcmVzZW5kCisjZW5kaWYKKyAgICAgICkpCisgICAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0lPX0xFTkdUSDsKKyAgICBlbHNlCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fTEVOR1RIOworICB9CisjaWZkZWYgV0lUSF9aTElCCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIpICYmIChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19GTFVTSCkKKyAgeyBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkpCisgICAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0lPX0xFTkdUSDsKKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1hNTCkKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19CVUZGRVI7CisgICAgZWxzZQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX1NUT1JFOworICB9CisjZW5kaWYKKyAgaWYgKCFzb2FwLT5lbmNvZGluZ1N0eWxlICYmICEoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0dSQVBIKSkKKyAgICBzb2FwLT5tb2RlIHw9IFNPQVBfWE1MX1RSRUU7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pICYmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkpCisgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19NSU1FOworICBlbHNlCisgICAgc29hcC0+bW9kZSAmPSB+U09BUF9FTkNfTVRPTTsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKQorICAgIHNvYXBfc2VsZWN0X21pbWVfYm91bmRhcnkoc29hcCk7CisgIHNvYXAtPmRpbWUubGlzdCA9IHNvYXAtPmRpbWUubGFzdDsJLyoga2VlcCB0cmFjayBvZiBsYXN0IERJTUUgYXR0YWNobWVudCAqLworI2VuZGlmCisgIHNvYXAtPmNvdW50ID0gMDsKKyAgc29hcC0+bnMgPSAwOworICBzb2FwLT5udWxsID0gMDsKKyAgc29hcC0+cG9zaXRpb24gPSAwOworICBzb2FwLT5tdXN0VW5kZXJzdGFuZCA9IDA7CisgIHNvYXAtPmVuY29kaW5nID0gMDsKKyAgc29hcC0+cGFydCA9IFNPQVBfQkVHSU47CisgIHNvYXAtPmlkbnVtID0gMDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJCZWdpbiBjb3VudCBwaGFzZSAoc29ja2V0PSVkIG1vZGU9MHgleCBjb3VudD0lbHUpXG4iLCBzb2FwLT5zb2NrZXQsIHNvYXAtPm1vZGUsICh1bnNpZ25lZCBsb25nKXNvYXAtPmNvdW50KSk7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXAtPmRpbWUuY291bnQgPSAwOyAvKiBjb3VudCAjIG9mIGF0dGFjaG1lbnRzICovCisgIHNvYXAtPmRpbWUuc2l6ZSA9IDA7IC8qIGFjY3VtdWxhdGUgdG90YWwgc2l6ZSBvZiBhdHRhY2htZW50cyAqLworICBpZiAoc29hcC0+ZnByZXBhcmVpbml0ICYmIChzb2FwLT5tb2RlICYgU09BUF9JTykgIT0gU09BUF9JT19TVE9SRSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBzb2FwLT5mcHJlcGFyZWluaXQoc29hcCk7ICAgCisjZW5kaWYKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW5kX2NvdW50KHN0cnVjdCBzb2FwICpzb2FwKQoreyAKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPmZwcmVwYXJlZmluYWwpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gc29hcC0+ZnByZXBhcmVmaW5hbChzb2FwKTsKKyNlbmRpZgorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBvZiBjb3VudCBwaGFzZVxuIikpOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9iZWdpbl9zZW5kKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIHNvYXBfY2xyX2F0dHIoc29hcCk7CisgIHNvYXBfc2V0X2xvY2FsX25hbWVzcGFjZXMoc29hcCk7CisgIHNvYXAtPm1vZGUgPSBzb2FwLT5vbW9kZSB8IChzb2FwLT5tb2RlICYgKFNPQVBfSU9fTEVOR1RIIHwgU09BUF9FTkNfRElNRSkpOworI2lmZGVmIFdJVEhfWkxJQgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fRkxVU0gpCisgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fQlVGRkVSOworICAgIGVsc2UKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19TVE9SRTsKKyAgfQorI2VuZGlmCisjaWZkZWYgV0lUSF9VRFAKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JT19VRFApKQorICB7IHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfWE1MOworICAgIGlmIChzb2FwLT5jb3VudCA+IFNPQVBfQlVGTEVOKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9VRFBfRVJST1I7CisgIH0KKyNlbmRpZgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0ZMVVNIICYmIHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgIHsgaWYgKHNvYXAtPmNvdW50IHx8IChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpIHx8IChzb2FwLT5tb2RlICYgU09BUF9FTkNfWE1MKSkKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19CVUZGRVI7CisgICAgZWxzZQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX1NUT1JFOworICB9CisgIHNvYXAtPm1vZGUgJj0gflNPQVBfSU9fTEVOR1RIOworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX1NUT1JFKQorICAgIHNvYXBfbmV3X2Jsb2NrKHNvYXApOworICBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9JT19LRUVQQUxJVkUpKQorICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOworICBpZiAoIXNvYXAtPmVuY29kaW5nU3R5bGUgJiYgIShzb2FwLT5tb2RlICYgU09BUF9YTUxfR1JBUEgpKQorICAgIHNvYXAtPm1vZGUgfD0gU09BUF9YTUxfVFJFRTsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSkKKyAgeyBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX01JTUU7CisgICAgc29hcC0+bW9kZSAmPSB+U09BUF9FTkNfRElNRTsKKyAgfQorICBlbHNlCisgICAgc29hcC0+bW9kZSAmPSB+U09BUF9FTkNfTVRPTTsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKQorICAgIHNvYXBfc2VsZWN0X21pbWVfYm91bmRhcnkoc29hcCk7CisjaWZkZWYgV0lOMzIKKyNpZm5kZWYgVU5ERVJfQ0UKKyNpZm5kZWYgV0lUSF9GQVNUQ0dJCisgIGlmICghc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkgLyogU2V0IHdpbjMyIHN0ZG91dCBvciBzb2FwLT5zZW5kZmQgdG8gQklOQVJZLCBlLmcuIHRvIHN1cHBvcnQgRElNRSAqLworI2lmZGVmIF9fQk9STEFORENfXworICAgIHNldG1vZGUoKFNPQVBfU09DS0VUKXNvYXAtPnNlbmRmZCwgT19CSU5BUlkpOworI2Vsc2UKKyAgICBfc2V0bW9kZSgoU09BUF9TT0NLRVQpc29hcC0+c2VuZGZkLCBfT19CSU5BUlkpOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKQorICB7IHNvYXAtPmJ1ZmlkeCA9IDA7CisgICAgc29hcC0+YnVmbGVuID0gMDsKKyAgfQorICBzb2FwLT5jaHVua3NpemUgPSAwOworICBzb2FwLT5ucyA9IDA7CisgIHNvYXAtPm51bGwgPSAwOworICBzb2FwLT5wb3NpdGlvbiA9IDA7CisgIHNvYXAtPm11c3RVbmRlcnN0YW5kID0gMDsKKyAgc29hcC0+ZW5jb2RpbmcgPSAwOworICBzb2FwLT5pZG51bSA9IDA7CisgIHNvYXAtPmxldmVsID0gMDsKKyNpZmRlZiBXSVRIX1pMSUIKKyAgc29hcC0+el9yYXRpb19vdXQgPSAxLjA7CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIpICYmIHNvYXAtPnpsaWJfc3RhdGUgIT0gU09BUF9aTElCX0RFRkxBVEUpCisgIHsKKyNpZmRlZiBXSVRIX0daSVAKKyAgICBtZW1jcHkoc29hcC0+el9idWYsICJcMzdcMjEzXDEwXDBcMFwwXDBcMFwwXDM3NyIsIDEwKTsKKyAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IChCeXRlKilzb2FwLT56X2J1ZiArIDEwOworICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCA9IFNPQVBfQlVGTEVOIC0gMTA7CisgICAgc29hcC0+el9jcmMgPSBjcmMzMigwTCwgTlVMTCwgMCk7CisgICAgaWYgKGRlZmxhdGVJbml0Migmc29hcC0+ZF9zdHJlYW0sIHNvYXAtPnpfbGV2ZWwsIFpfREVGTEFURUQsIC1NQVhfV0JJVFMsIDgsIFpfREVGQVVMVF9TVFJBVEVHWSkgIT0gWl9PSykKKyNlbHNlCisgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZSopc29hcC0+el9idWY7CisgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0ID0gU09BUF9CVUZMRU47CisgICAgaWYgKGRlZmxhdGVJbml0KCZzb2FwLT5kX3N0cmVhbSwgc29hcC0+el9sZXZlbCkgIT0gWl9PSykKKyNlbmRpZgorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVmbGF0ZSBpbml0aWFsaXplZFxuIikpOworICAgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfREVGTEFURTsKKyAgfQorI2VuZGlmCisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQmVnaW4gc2VuZCBwaGFzZSAoc29ja2V0PSVkIG1vZGU9MHgleCBjb3VudD0lbHUpXG4iLCBzb2FwLT5zb2NrZXQsIHNvYXAtPm1vZGUsICh1bnNpZ25lZCBsb25nKXNvYXAtPmNvdW50KSk7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0JFR0lOOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+ZnByZXBhcmVpbml0ICYmIChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19TVE9SRSkKKyAgICBzb2FwLT5mcHJlcGFyZWluaXQoc29hcCk7ICAgCisjZW5kaWYKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9lbWJlZGRlZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCwgaW50IHQpCit7IHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgaWYgKHNvYXBfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgdCwgJnBwKSkKKyAgeyBwcC0+bWFyazEgPSAxOworICAgIHBwLT5tYXJrMiA9IDE7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbWJlZGRlZCAlcCB0eXBlPSVkIG1hcmsgc2V0IHRvIDFcbiIsIHAsIHQpKTsKKyAgfQorfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlZmVyZW5jZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCwgaW50IHQpCit7IHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgaWYgKCFwIHx8IChzb2FwLT5tb2RlICYgU09BUF9YTUxfVFJFRSkpCisgICAgcmV0dXJuIDE7CisgIGlmIChzb2FwX3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIHQsICZwcCkpCisgIHsgaWYgKHBwLT5tYXJrMSA9PSAwKQorICAgIHsgcHAtPm1hcmsxID0gMjsKKyAgICAgIHBwLT5tYXJrMiA9IDI7CisgICAgfQorICB9CisgIGVsc2UgaWYgKHNvYXBfcG9pbnRlcl9lbnRlcihzb2FwLCBwLCBOVUxMLCAwLCB0LCAmcHApKQorICB7IHBwLT5tYXJrMSA9IDA7CisgICAgcHAtPm1hcmsyID0gMDsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIDE7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVmZXJlbmNlICVwIHR5cGU9JWQgKCVkICVkKVxuIiwgcCwgdCwgKGludClwcC0+bWFyazEsIChpbnQpcHAtPm1hcmsyKSk7CisgIHJldHVybiBwcC0+bWFyazE7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYXJyYXlfcmVmZXJlbmNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGludCB0KQoreyByZWdpc3RlciBpbnQgaTsKKyAgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICBpZiAoIXAgfHwgIWEtPl9fcHRyKQorICAgIHJldHVybiAxOworICBpID0gc29hcF9hcnJheV9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCBhLCBuLCB0LCAmcHApOworICBpZiAoaSkKKyAgeyBpZiAocHAtPm1hcmsxID09IDApCisgICAgeyBwcC0+bWFyazEgPSAyOworICAgICAgcHAtPm1hcmsyID0gMjsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoIXNvYXBfcG9pbnRlcl9lbnRlcihzb2FwLCBwLCBhLCBuLCB0LCAmcHApKQorICAgIHJldHVybiAxOworICBlbHNlCisgIHsgcHAtPm1hcmsxID0gMDsKKyAgICBwcC0+bWFyazIgPSAwOworICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQXJyYXkgcmVmZXJlbmNlICVwIHB0cj0lcCBkaW09JWQgdHlwZT0lZCAoJWQgJWQpXG4iLCBwLCBhLT5fX3B0ciwgbiwgdCwgKGludClwcC0+bWFyazEsIChpbnQpcHAtPm1hcmsyKSk7CisgIHJldHVybiBwcC0+bWFyazE7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW1iZWRkZWRfaWQoc3RydWN0IHNvYXAgKnNvYXAsIGludCBpZCwgY29uc3Qgdm9pZCAqcCwgaW50IHQpCit7IHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9UUkVFKQorICAgIHJldHVybiBpZDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbWJlZGRlZF9pZCAlcCB0eXBlPSVkIGlkPSVkXG4iLCBwLCB0LCBpZCkpOworICBpZiAoc29hcC0+dmVyc2lvbiA9PSAxICYmIHNvYXAtPmVuY29kaW5nU3R5bGUgJiYgIShzb2FwLT5tb2RlICYgU09BUF9YTUxfR1JBUEgpICYmIHNvYXAtPnBhcnQgIT0gU09BUF9JTl9IRUFERVIpCisgIHsgaWYgKGlkIDwgMCkKKyAgICB7IGlkID0gc29hcF9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCB0LCAmcHApOworICAgICAgaWYgKGlkKQorICAgICAgeyBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICAgICAgICAgIHBwLT5tYXJrMSA9IDI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwcC0+bWFyazIgPSAyOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVtYmVkZGVkX2lkIG11bHRpcmVmIGlkPSVkICVwIHR5cGU9JWQgPSAoJWQgJWQpXG4iLCBpZCwgcCwgdCwgKGludClwcC0+bWFyazEsIChpbnQpcHAtPm1hcmsyKSk7CisgICAgICB9CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBpZDsKKyAgfQorICBpZiAoaWQgPCAwKQorICAgIGlkID0gc29hcF9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCB0LCAmcHApOworICBlbHNlIGlmIChpZCAmJiAhc29hcF9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCB0LCAmcHApKQorICAgIHJldHVybiAwOworICBpZiAoaWQgJiYgcHApCisgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICAgIHBwLT5tYXJrMSA9IDE7CisgICAgZWxzZQorICAgICAgcHAtPm1hcmsyID0gMTsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVtYmVkZGVkX2lkIGVtYmVkZGVkIHJlZiBpZD0lZCAlcCB0eXBlPSVkID0gKCVkICVkKVxuIiwgaWQsIHAsIHQsIChpbnQpcHAtPm1hcmsxLCAoaW50KXBwLT5tYXJrMikpOworICB9CisgIHJldHVybiBpZDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9pc19lbWJlZGRlZChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGxpc3QgKnBwKQoreyBpZiAoIXBwKQorICAgIHJldHVybiAwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIklzIGVtYmVkZGVkPyAlZCAlZFxuIiwgKGludClwcC0+bWFyazEsIChpbnQpcHAtPm1hcmsyKSk7CisgIGlmIChzb2FwLT52ZXJzaW9uID09IDEgJiYgc29hcC0+ZW5jb2RpbmdTdHlsZSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9HUkFQSCkgJiYgc29hcC0+cGFydCAhPSBTT0FQX0lOX0hFQURFUikKKyAgeyBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICAgICAgcmV0dXJuIHBwLT5tYXJrMSAhPSAwOworICAgIHJldHVybiBwcC0+bWFyazIgIT0gMDsKKyAgfQorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICAgIHJldHVybiBwcC0+bWFyazEgPT0gMTsKKyAgcmV0dXJuIHBwLT5tYXJrMiA9PSAxOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2lzX3NpbmdsZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGxpc3QgKnBwKQoreyBpZiAoc29hcC0+cGFydCA9PSBTT0FQX0lOX0hFQURFUikKKyAgICByZXR1cm4gMTsKKyAgaWYgKCFwcCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICByZXR1cm4gcHAtPm1hcmsxID09IDA7CisgIHJldHVybiBwcC0+bWFyazIgPT0gMDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2VtYmVkZGVkKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHApCit7IGlmICghcHApCisgICAgcmV0dXJuOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICAgIHBwLT5tYXJrMSA9IDE7CisgIGVsc2UKKyAgICBwcC0+bWFyazIgPSAxOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2F0dGFjaG1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgY29uc3QgY2hhciAqYWlkLCBjb25zdCBjaGFyICphdHlwZSwgY29uc3QgY2hhciAqYW9wdGlvbnMsIGludCBuLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkgCit7IHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgaW50IGk7CisgIGlmICghcCB8fCAhYS0+X19wdHIgfHwgKCFhaWQgJiYgIWF0eXBlKSkKKyAgICByZXR1cm4gc29hcF9lbGVtZW50X2lkKHNvYXAsIHRhZywgaWQsIHAsIGEsIG4sIHR5cGUsIHQpOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkF0dGFjaG1lbnQgdGFnPSclcycgaWQ9JyVzJyAoJWQpIHR5cGU9JyVzJ1xuIiwgdGFnLCBhaWQ/YWlkOiIiLCBpZCwgYXR5cGU/YXR5cGU6IiIpKTsKKyAgaSA9IHNvYXBfYXJyYXlfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgYSwgbiwgdCwgJnBwKTsKKyAgaWYgKCFpKQorICB7IGkgPSBzb2FwX3BvaW50ZXJfZW50ZXIoc29hcCwgcCwgYSwgbiwgdCwgJnBwKTsKKyAgICBpZiAoIWkpCisgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorICBpZiAoaWQgPD0gMCkKKyAgICBpZCA9IGk7CisgIGlmICghYWlkKQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCBzb2FwLT5kaW1lX2lkX2Zvcm1hdCwgaWQpOworICAgIGFpZCA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPnRtcGJ1Zik7CisgIH0KKyAgLyogQWRkIE1UT00geG9wOkluY2x1ZGUgZWxlbWVudCB3aGVuIG5lY2Vzc2FyeSAqLworICAvKiBUT0RPOiB0aGlzIGNvZGUgdG8gYmUgb2Jzb2xldGVkIHdpdGggbmV3IGltcG9ydC94b3AuaCBjb252ZW50aW9ucyAqLworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKSAmJiBzdHJjbXAodGFnLCAieG9wOkluY2x1ZGUiKSkKKyAgeyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIDAsIHR5cGUpCisgICAgIHx8IHNvYXBfZWxlbWVudF9ocmVmKHNvYXAsICJ4b3A6SW5jbHVkZSIsIDAsICJocmVmIiwgYWlkKQorICAgICB8fCBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGVsc2UgaWYgKHNvYXBfZWxlbWVudF9ocmVmKHNvYXAsIHRhZywgMCwgImhyZWYiLCBhaWQpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgeyBpZiAocHAtPm1hcmsxICE9IDMpCisgICAgeyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgICAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pCisgICAgICAgIGNvbnRlbnQgPSBzb2FwX25ld19tdWx0aXBhcnQoc29hcCwgJnNvYXAtPm1pbWUuZmlyc3QsICZzb2FwLT5taW1lLmxhc3QsIChjaGFyKilhLT5fX3B0ciwgYS0+X19zaXplKTsKKyAgICAgIGVsc2UKKyAgICAgICAgY29udGVudCA9IHNvYXBfbmV3X211bHRpcGFydChzb2FwLCAmc29hcC0+ZGltZS5maXJzdCwgJnNvYXAtPmRpbWUubGFzdCwgKGNoYXIqKWEtPl9fcHRyLCBhLT5fX3NpemUpOworICAgICAgaWYgKCFjb250ZW50KQorICAgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBpZiAoIXN0cm5jbXAoYWlkLCAiY2lkOiIsIDQpKSAvKiBSRkMgMjExMSAqLworICAgICAgeyBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pCisgICAgICAgIHsgY2hhciAqcyA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzdHJsZW4oYWlkKSAtIDEpOworCSAgaWYgKHMpCisJICB7ICpzID0gJzwnOworCSAgICBzdHJjcHkocyArIDEsIGFpZCArIDQpOworCSAgICBzdHJjYXQocywgIj4iKTsKKwkgICAgY29udGVudC0+aWQgPSBzOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgY29udGVudC0+aWQgPSBhaWQgKyA0OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBjb250ZW50LT5pZCA9IGFpZDsKKyAgICAgIGNvbnRlbnQtPnR5cGUgPSBhdHlwZTsKKyAgICAgIGNvbnRlbnQtPm9wdGlvbnMgPSBhb3B0aW9uczsKKyAgICAgIGNvbnRlbnQtPmVuY29kaW5nID0gU09BUF9NSU1FX0JJTkFSWTsKKyAgICAgIHBwLT5tYXJrMSA9IDM7CisgICAgfQorICB9CisgIGVsc2UKKyAgICBwcC0+bWFyazIgPSAzOworICByZXR1cm4gLTE7Cit9CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyB2b2lkCitzb2FwX2luaXRfaWh0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgaTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbml0aWFsaXppbmcgSUQgaGFzaHRhYmxlXG4iKSk7CisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0lESEFTSDsgaSsrKQorICAgIHNvYXAtPmlodFtpXSA9IE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZAorc29hcF9mcmVlX2lodChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICppcCwgKnA7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2ZsaXN0ICpmcCwgKmZxOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWUgSUQgaGFzaHRhYmxlXG4iKSk7CisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0lESEFTSDsgaSsrKQorICB7IGZvciAoaXAgPSBzb2FwLT5paHRbaV07IGlwOyBpcCA9IHApCisgICAgeyBmb3IgKGZwID0gaXAtPmZsaXN0OyBmcDsgZnAgPSBmcSkKKyAgICAgIHsgZnEgPSBmcC0+bmV4dDsKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIGZwKTsKKyAgICAgIH0KKyAgICAgIHAgPSBpcC0+bmV4dDsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBpcCk7CisgICAgfQorICAgIHNvYXAtPmlodFtpXSA9IE5VTEw7CisgIH0KK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwX2lsaXN0ICoKK1NPQVBfRk1BQzIKK3NvYXBfbG9va3VwKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworICBmb3IgKGlwID0gc29hcC0+aWh0W3NvYXBfaGFzaChpZCldOyBpcDsgaXAgPSBpcC0+bmV4dCkKKyAgICBpZiAoIXN0cmNtcChpcC0+aWQsIGlkKSkKKyAgICAgIHJldHVybiBpcDsKKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcF9pbGlzdCAqCitTT0FQX0ZNQUMyCitzb2FwX2VudGVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCkKK3sgcmVnaXN0ZXIgc2l6ZV90IGg7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgaXAgPSAoc3RydWN0IHNvYXBfaWxpc3QqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9pbGlzdCkgKyBzdHJsZW4oaWQpKTsKKyAgaWYgKGlwKQorICB7IGggPSBzb2FwX2hhc2goaWQpOworICAgIHN0cmNweShpcC0+aWQsIGlkKTsKKyAgICBpcC0+bmV4dCA9IHNvYXAtPmlodFtoXTsKKyAgICBzb2FwLT5paHRbaF0gPSBpcDsKKyAgICByZXR1cm4gaXA7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQqCitTT0FQX0ZNQUMyCitzb2FwX21hbGxvYyhzdHJ1Y3Qgc29hcCAqc29hcCwgc2l6ZV90IG4pCit7IHJlZ2lzdGVyIGNoYXIgKnA7CisgIGlmICghbikKKyAgICByZXR1cm4gKHZvaWQqKVNPQVBfTk9OX05VTEw7CisgIGlmICghc29hcCkKKyAgICByZXR1cm4gU09BUF9NQUxMT0Moc29hcCwgbik7CisgIG4gKz0gKC0obG9uZyluKSAmIChzaXplb2Yodm9pZCopLTEpOyAvKiBhbGlnbiBhdCA0LSwgOC0gb3IgMTYtYnl0ZSBib3VuZGFyeSAqLworICBpZiAoIShwID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIG4gKyBzaXplb2Yodm9pZCopICsgc2l6ZW9mKHNpemVfdCkpKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHJldHVybiBOVUxMOworICB9CisgIC8qIGtlZXAgY2hhaW4gb2YgYWxsb2NlZCBjZWxscyBmb3IgbGF0ZXIgZGVzdHJ1Y3Rpb24gKi8KKyAgc29hcC0+YWxsb2NlZCA9IDE7CisgICoodm9pZCoqKShwICsgbikgPSBzb2FwLT5hbGlzdDsKKyAgKihzaXplX3QqKShwICsgbiArIHNpemVvZih2b2lkKikpID0gbjsKKyAgc29hcC0+YWxpc3QgPSBwICsgbjsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitzdGF0aWMgdm9pZAorc29hcF9pbml0X21odChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCAoaW50KVNPQVBfUFRSSEFTSDsgaSsrKQorICAgIHNvYXAtPm1odFtpXSA9IE5VTEw7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitzdGF0aWMgdm9pZAorc29hcF9mcmVlX21odChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX21saXN0ICptcCwgKm1xOworICBmb3IgKGkgPSAwOyBpIDwgKGludClTT0FQX1BUUkhBU0g7IGkrKykKKyAgeyBmb3IgKG1wID0gc29hcC0+bWh0W2ldOyBtcDsgbXAgPSBtcSkKKyAgICB7IG1xID0gbXAtPm5leHQ7CisgICAgICBpZiAobXAtPmxpdmUpCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMoJWQpOiBtYWxsb2MoKSA9ICVwIG5vdCBmcmVlZCAobWVtb3J5IGxlYWsgb3IgZm9yZ290IHRvIGNhbGwgc29hcF9lbmQoKT8pXG4iLCBtcC0+ZmlsZSwgbXAtPmxpbmUsIG1wLT5wdHIpOworICAgICAgZnJlZShtcCk7CisgICAgfQorICAgIHNvYXAtPm1odFtpXSA9IE5VTEw7CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK1NPQVBfRk1BQzEKK3ZvaWQqCitTT0FQX0ZNQUMyCitzb2FwX3RyYWNrX21hbGxvYyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIHNpemVfdCBzaXplKQoreyByZWdpc3RlciB2b2lkICpwID0gbWFsbG9jKHNpemUpOworICBpZiAoc29hcCkKKyAgeyByZWdpc3RlciBpbnQgaCA9IHNvYXBfaGFzaF9wdHIocCk7CisgICAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbWxpc3QgKm1wID0gKHN0cnVjdCBzb2FwX21saXN0KiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2FwX21saXN0KSk7CisgICAgaWYgKHNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYX1RFU1RdKQorICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIlcyglZCk6IG1hbGxvYyglbHUpID0gJXBcbiIsIGZpbGUsIGxpbmUsICh1bnNpZ25lZCBsb25nKXNpemUsIHApKTsKKyAgICBtcC0+bmV4dCA9IHNvYXAtPm1odFtoXTsKKyAgICBtcC0+cHRyID0gcDsKKyAgICBtcC0+ZmlsZSA9IGZpbGU7CisgICAgbXAtPmxpbmUgPSBsaW5lOworICAgIG1wLT5saXZlID0gMTsKKyAgICBzb2FwLT5taHRbaF0gPSBtcDsKKyAgfQorICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfdHJhY2tfZnJlZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIHZvaWQgKnApCit7IHJlZ2lzdGVyIGludCBoID0gc29hcF9oYXNoX3B0cihwKTsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbWxpc3QgKm1wOworICBmb3IgKG1wID0gc29hcC0+bWh0W2hdOyBtcDsgbXAgPSBtcC0+bmV4dCkKKyAgICBpZiAobXAtPnB0ciA9PSBwKQorICAgICAgYnJlYWs7CisgIGlmIChtcCkKKyAgeyBpZiAobXAtPmxpdmUpCisgICAgeyBmcmVlKHApOworICAgICAgaWYgKHNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYX1RFU1RdKQorICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIiVzKCVkKTogZnJlZSglcClcbiIsIGZpbGUsIGxpbmUsIHApKTsKKyAgICAgIG1wLT5saXZlID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgICAgZnByaW50ZihzdGRlcnIsICIlcyglZCk6IGZyZWUoJXApIGRvdWJsZSBmcmVlIG9mIHBvaW50ZXIgbWFsbG9jZWQgYXQgJXMoJWQpXG4iLCBmaWxlLCBsaW5lLCBwLCBtcC0+ZmlsZSwgbXAtPmxpbmUpOworICB9CisgIGVsc2UKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzKCVkKTogZnJlZSglcCkgcG9pbnRlciBub3QgbWFsbG9jZWRcbiIsIGZpbGUsIGxpbmUsIHApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworc3RhdGljIHZvaWQKK3NvYXBfdHJhY2tfdW5saW5rKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwKQoreyByZWdpc3RlciBpbnQgaCA9IHNvYXBfaGFzaF9wdHIocCk7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX21saXN0ICptcDsKKyAgZm9yIChtcCA9IHNvYXAtPm1odFtoXTsgbXA7IG1wID0gbXAtPm5leHQpCisgICAgaWYgKG1wLT5wdHIgPT0gcCkKKyAgICAgIGJyZWFrOworICBpZiAobXApCisgICAgbXAtPmxpdmUgPSAwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9kZWFsbG9jKHN0cnVjdCBzb2FwICpzb2FwLCB2b2lkICpwKQoreyBpZiAoIXNvYXApCisgICAgcmV0dXJuOworICBpZiAocCkKKyAgeyByZWdpc3RlciBjaGFyICoqcTsKKyAgICBmb3IgKHEgPSAoY2hhcioqKSZzb2FwLT5hbGlzdDsgKnE7IHEgPSAqKGNoYXIqKiopcSkKKyAgICB7IGlmIChwID09ICh2b2lkKikoKnEgLSAqKHNpemVfdCopKCpxICsgc2l6ZW9mKHZvaWQqKSkpKQorICAgICAgeyAqcSA9ICoqKGNoYXIqKiopcTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlZCBkYXRhIGF0ICVwXG4iLCBwKSk7CisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgICBzb2FwX2RlbGV0ZShzb2FwLCBwKTsKKyAgfQorICBlbHNlCisgIHsgcmVnaXN0ZXIgY2hhciAqcTsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWUgYWxsIHNvYXBfbWFsbG9jKCkgZGF0YVxuIikpOworICAgIHdoaWxlIChzb2FwLT5hbGlzdCkKKyAgICB7IHEgPSAoY2hhciopc29hcC0+YWxpc3Q7CisgICAgICBzb2FwLT5hbGlzdCA9ICoodm9pZCoqKXE7CisgICAgICBxIC09ICooc2l6ZV90KikocSArIHNpemVvZih2b2lkKikpOworICAgICAgU09BUF9GUkVFKHNvYXAsIHEpOworICAgIH0KKyAgfQorICAvKiB3ZSBtdXN0IGFzc3VtZSB0aGVzZSB3ZXJlIGRlYWxsb2NhdGVkOiAqLworICBzb2FwLT5hY3Rpb24gPSBOVUxMOworICBzb2FwLT5mYXVsdCA9IE5VTEw7CisgIHNvYXAtPmhlYWRlciA9IE5VTEw7CisgIHNvYXAtPnVzZXJpZCA9IE5VTEw7CisgIHNvYXAtPnBhc3N3ZCA9IE5VTEw7CisgIHNvYXAtPmF1dGhyZWFsbSA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXBfY2xyX21pbWUoc29hcCk7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZGVsZXRlKHN0cnVjdCBzb2FwICpzb2FwLCB2b2lkICpwKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9jbGlzdCAqKmNwOworICBpZiAoc29hcF9jaGVja19zdGF0ZShzb2FwKSkKKyAgICByZXR1cm47CisgIGNwID0gJnNvYXAtPmNsaXN0OworICBpZiAocCkKKyAgeyB3aGlsZSAoKmNwKQorICAgIHsgaWYgKHAgPT0gKCpjcCktPnB0cikKKyAgICAgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfY2xpc3QgKnEgPSAqY3A7CisgICAgICAgICpjcCA9IHEtPm5leHQ7CisgICAgICAgIHEtPmZkZWxldGUocSk7CisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBxKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgY3AgPSAmKCpjcCktPm5leHQ7CisgICAgfQorICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IGRlYWxsb2MgZGF0YSAlcDogYWRkcmVzcyBub3QgaW4gbGlzdFxuIiwgcCkpOworICB9CisgIGVsc2UKKyAgeyB3aGlsZSAoKmNwKQorICAgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfY2xpc3QgKnEgPSAqY3A7CisgICAgICAqY3AgPSBxLT5uZXh0OworICAgICAgaWYgKHEtPnB0ciA9PSAodm9pZCopc29hcC0+ZmF1bHQpCisgICAgICAgIHNvYXAtPmZhdWx0ID0gTlVMTDsgLyogdGhpcyB3YXMgZGVhbGxvY2F0ZWQgKi8KKyAgICAgIGVsc2UgaWYgKHEtPnB0ciA9PSAodm9pZCopc29hcC0+aGVhZGVyKQorICAgICAgICBzb2FwLT5oZWFkZXIgPSBOVUxMOyAvKiB0aGlzIHdhcyBkZWFsbG9jYXRlZCAqLworICAgICAgcS0+ZmRlbGV0ZShxKTsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBxKTsKKyAgICB9CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwX2NsaXN0ICoKK1NPQVBfRk1BQzIKK3NvYXBfbGluayhzdHJ1Y3Qgc29hcCAqc29hcCwgdm9pZCAqcCwgaW50IHQsIGludCBuLCB2b2lkICgqZmRlbGV0ZSkoc3RydWN0IHNvYXBfY2xpc3QqKSkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfY2xpc3QgKmNwOworICBpZiAoKGNwID0gKHN0cnVjdCBzb2FwX2NsaXN0KilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfY2xpc3QpKSkpCisgIHsgY3AtPm5leHQgPSBzb2FwLT5jbGlzdDsKKyAgICBjcC0+dHlwZSA9IHQ7CisgICAgY3AtPnNpemUgPSBuOyAKKyAgICBjcC0+cHRyID0gcDsKKyAgICBjcC0+ZmRlbGV0ZSA9IGZkZWxldGU7CisgICAgc29hcC0+Y2xpc3QgPSBjcDsKKyAgfQorICByZXR1cm4gY3A7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3VubGluayhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCkKK3sgcmVnaXN0ZXIgY2hhciAqKnE7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2NsaXN0ICoqY3A7CisgIGlmICghc29hcCB8fCAhcCkKKyAgICByZXR1cm47CisgIGZvciAocSA9IChjaGFyKiopJnNvYXAtPmFsaXN0OyAqcTsgcSA9ICooY2hhcioqKilxKQorICB7IGlmIChwID09ICh2b2lkKikoKnEgLSAqKHNpemVfdCopKCpxICsgc2l6ZW9mKHZvaWQqKSkpKQorICAgIHsgKnEgPSAqKihjaGFyKioqKXE7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVubGlua2VkIGRhdGEgJXBcbiIsIHApKTsKKyNpZmRlZiBTT0FQX0RFQlVHCisgICAgICBzb2FwX3RyYWNrX3VubGluayhzb2FwLCBwKTsKKyNlbmRpZgorICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBmb3IgKGNwID0gJnNvYXAtPmNsaXN0OyAqY3A7IGNwID0gJigqY3ApLT5uZXh0KQorICB7IGlmIChwID09ICgqY3ApLT5wdHIpCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVubGlua2VkIGNsYXNzIGluc3RhbmNlICVwXG4iLCBwKSk7CisgICAgICBxID0gKGNoYXIqKikqY3A7CisgICAgICAqY3AgPSAoKmNwKS0+bmV4dDsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBxKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfbG9va3VwX3R5cGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIGlmIChpZCAmJiAqaWQpCisgIHsgaXAgPSBzb2FwX2xvb2t1cChzb2FwLCBpZCk7CisgICAgaWYgKGlwKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJMb29rdXAgaWQ9JyVzJyB0eXBlPSVkXG4iLCBpZCwgaXAtPnR5cGUpKTsKKyAgICAgIHJldHVybiBpcC0+dHlwZTsKKyAgICB9CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJsb29rdXAgdHlwZSBpZD0nJXMnIE5PVCBGT1VORCEgTmVlZCB0byBnZXQgaXQgZnJvbSB4c2k6dHlwZVxuIiwgaWQpKTsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkKgorU09BUF9GTUFDMgorc29hcF9pZF9sb29rdXAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCB2b2lkICoqcCwgaW50IHQsIHNpemVfdCBuLCB1bnNpZ25lZCBpbnQgaykKK3sgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworICB2b2lkICoqcTsKKyAgaWYgKCFwIHx8ICFpZCB8fCAhKmlkKQorICAgIHJldHVybiBwOworICBpcCA9IHNvYXBfbG9va3VwKHNvYXAsIGlkKTsgLyogbG9va3VwIHBvaW50ZXIgdG8gaGFzaCB0YWJsZSBlbnRyeSBmb3Igc3RyaW5nIGlkICovCisgIGlmICghaXApCisgIHsgaXAgPSBzb2FwX2VudGVyKHNvYXAsIGlkKTsgLyogbmV3IGhhc2ggdGFibGUgZW50cnkgZm9yIHN0cmluZyBpZCAqLworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRm9yd2FyZGluZyBmaXJzdCBocmVmPSclcycgdHlwZT0lZCAlcCAoJXUgYnl0ZXMpXG4iLCBpZCwgdCwgcCwgKHVuc2lnbmVkIGludCluKSk7CisgICAgaXAtPnR5cGUgPSB0OworICAgIGlwLT5zaXplID0gbjsgCisgICAgaXAtPmxpbmsgPSBwOworICAgIGlwLT5jb3B5ID0gTlVMTDsKKyAgICBpcC0+Zmxpc3QgPSBOVUxMOworICAgIGlwLT5wdHIgPSBOVUxMOworICAgIGlwLT5sZXZlbCA9IGs7CisgICAgKnAgPSBOVUxMOworICB9CisgIGVsc2UgaWYgKGlwLT5wdHIpCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHZlZCBocmVmPSclcycgdHlwZT0lZCBsb2NhdGlvbj0lcCAoJXUgYnl0ZXMpXG4iLCBpZCwgdCwgaXAtPnB0ciwgKHVuc2lnbmVkIGludCluKSk7CisgICAgaWYgKGlwLT50eXBlICE9IHQpCisgICAgeyBzdHJjcHkoc29hcC0+aWQsIGlkKTsKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9IUkVGOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJUeXBlIGluY29tcGF0aWJpbGl0eTogaWQgdHlwZT0lZCBocmVmIHR5cGU9JWRcbiIsIGlwLT50eXBlLCB0KSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgd2hpbGUgKGlwLT5sZXZlbCA8IGspCisgICAgeyBxID0gKHZvaWQqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yodm9pZCopKTsgIAorICAgICAgaWYgKCFxKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICpwID0gKHZvaWQqKXE7CisgICAgICBwID0gcTsKKyAgICAgIGstLTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVzY2VuZGluZyBvbmUgbGV2ZWwuLi5cbiIpKTsKKyAgICB9CisgICAgKnAgPSBpcC0+cHRyOworICB9CisgIGVsc2UgaWYgKGlwLT5sZXZlbCA+IGspCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHZpbmcgbGV2ZWwgJXUgcG9pbnRlcnMgdG8gaHJlZj0nJXMnXG4iLCBpcC0+bGV2ZWwsIGlkKSk7CisgICAgd2hpbGUgKGlwLT5sZXZlbCA+IGspCisgICAgeyB2b2lkICpzLCAqKnIgPSAmaXAtPmxpbms7CisgICAgICBxID0gKHZvaWQqKilpcC0+bGluazsKKyAgICAgIHdoaWxlIChxKQorICAgICAgeyAqciA9ICh2b2lkKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yodm9pZCopKTsKKyAgICAgICAgcyA9ICpxOworICAgICAgICAqcSA9ICpyOworICAgICAgICByID0gKHZvaWQqKikqcjsKKyAgICAgICAgcSA9ICh2b2lkKiopczsKKyAgICAgIH0KKyAgICAgICpyID0gTlVMTDsKKyAgICAgIGlwLT5zaXplID0gbjsgCisgICAgICBpcC0+Y29weSA9IE5VTEw7CisgICAgICBpcC0+bGV2ZWwgPSBpcC0+bGV2ZWwgLSAxOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJEZXNjZW5kaW5nIG9uZSBsZXZlbC4uLlxuIikpOworICAgIH0KKyAgICBxID0gKHZvaWQqKilpcC0+bGluazsKKyAgICBpcC0+bGluayA9IHA7CisgICAgKnAgPSAodm9pZCopcTsKKyAgfQorICBlbHNlCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGb3J3YXJkZWQgaHJlZj0nJXMnIHR5cGU9JWQgbG9jYXRpb249JXAgKCV1IGJ5dGVzKVxuIiwgaWQsIHQsIHAsICh1bnNpZ25lZCBpbnQpbikpOworICAgIHdoaWxlIChpcC0+bGV2ZWwgPCBrKQorICAgIHsgcSA9ICh2b2lkKiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHZvaWQqKSk7ICAKKyAgICAgICpwID0gcTsKKyAgICAgIHAgPSBxOworICAgICAgay0tOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJEZXNjZW5kaW5nIG9uZSBsZXZlbC4uLlxuIikpOworICAgIH0KKyAgICBxID0gKHZvaWQqKilpcC0+bGluazsKKyAgICBpcC0+bGluayA9IHA7CisgICAgKnAgPSAodm9pZCopcTsKKyAgfQorICByZXR1cm4gcDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQqCitTT0FQX0ZNQUMyCitzb2FwX2lkX2ZvcndhcmQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmhyZWYsIHZvaWQgKnAsIHNpemVfdCBsZW4sIGludCBzdCwgaW50IHR0LCBzaXplX3QgbiwgdW5zaWduZWQgaW50IGssIHZvaWQgKCpmY29weSkoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIHNpemVfdCwgY29uc3Qgdm9pZCosIHNpemVfdCkpCit7IHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgaWYgKCFwIHx8ICFocmVmIHx8ICEqaHJlZikKKyAgICByZXR1cm4gcDsKKyAgaXAgPSBzb2FwX2xvb2t1cChzb2FwLCBocmVmKTsgLyogbG9va3VwIHBvaW50ZXIgdG8gaGFzaCB0YWJsZSBlbnRyeSBmb3Igc3RyaW5nIGlkICovCisgIGlmICghaXApCisgIHsgaXAgPSBzb2FwX2VudGVyKHNvYXAsIGhyZWYpOyAvKiBuZXcgaGFzaCB0YWJsZSBlbnRyeSBmb3Igc3RyaW5nIGlkICovCisgICAgaXAtPnR5cGUgPSBzdDsKKyAgICBpcC0+c2l6ZSA9IG47CisgICAgaXAtPmxpbmsgPSBOVUxMOworICAgIGlwLT5jb3B5ID0gTlVMTDsKKyAgICBpcC0+cHRyID0gTlVMTDsKKyAgICBpcC0+bGV2ZWwgPSAwOworICAgIGlwLT5mbGlzdCA9IE5VTEw7CisgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk5ldyBlbnRyeSBocmVmPSclcycgdHlwZT0lZCBzaXplPSVsdSBsZXZlbD0lZCBsb2NhdGlvbj0lcFxuIiwgaHJlZiwgc3QsICh1bnNpZ25lZCBsb25nKW4sIGssIHApKTsKKyAgfQorICBlbHNlIGlmIChpcC0+dHlwZSAhPSBzdCB8fCAoaXAtPmxldmVsID09IGsgJiYgaXAtPnNpemUgIT0gbikpCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJUeXBlIGluY29tcGF0aWJpbGl0eSBpZD0nJXMnIGV4cGVjdCB0eXBlPSVkIHNpemU9JWx1IGxldmVsPSV1IGdvdCB0eXBlPSVkIHNpemU9JWx1XG4iLCBocmVmLCBpcC0+dHlwZSwgKHVuc2lnbmVkIGxvbmcpaXAtPnNpemUsIGssIHN0LCAodW5zaWduZWQgbG9uZyluKSk7CisgICAgc3RyY3B5KHNvYXAtPmlkLCBocmVmKTsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfSFJFRjsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoZmNvcHkgfHwgbiA8IHNpemVvZih2b2lkKikgfHwgKmhyZWYgIT0gJyMnKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2ZsaXN0ICpmcCA9IChzdHJ1Y3Qgc29hcF9mbGlzdCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2ZsaXN0KSk7CisgICAgaWYgKCFmcCkKKyAgICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZnAtPm5leHQgPSBpcC0+Zmxpc3Q7CisgICAgZnAtPnR5cGUgPSB0dDsKKyAgICBmcC0+cHRyID0gcDsKKyAgICBmcC0+bGV2ZWwgPSBrOworICAgIGZwLT5sZW4gPSBsZW47CisgICAgaWYgKGZjb3B5KQorICAgICAgZnAtPmZjb3B5ID0gZmNvcHk7CisgICAgZWxzZQorICAgICAgZnAtPmZjb3B5ID0gc29hcF9mY29weTsKKyAgICBpcC0+Zmxpc3QgPSBmcDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZvcndhcmRpbmcgdHlwZT0lZCAodGFyZ2V0IHR5cGU9JWQpIHNpemU9JWx1IGxvY2F0aW9uPSVwIGxldmVsPSV1IGxlbj0lbHUgaHJlZj0nJXMnXG4iLCBzdCwgdHQsICh1bnNpZ25lZCBsb25nKW4sIHAsIGssICh1bnNpZ25lZCBsb25nKWxlbiwgaHJlZikpOworICB9CisgIGVsc2UKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZvcndhcmRpbmcgY29weWluZyBhZGRyZXNzICVwIGZvciB0eXBlPSVkIGhyZWY9JyVzJ1xuIiwgcCwgc3QsIGhyZWYpKTsKKyAgICAqKHZvaWQqKilwID0gaXAtPmNvcHk7CisgICAgaXAtPmNvcHkgPSBwOworICB9CisgIHJldHVybiBwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkKgorU09BUF9GTUFDMgorc29hcF9pZF9lbnRlcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIHZvaWQgKnAsIGludCB0LCBzaXplX3QgbiwgdW5zaWduZWQgaW50IGssIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmFycmF5VHlwZSwgdm9pZCAqKCpmaW5zdGFudGlhdGUpKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopKQoreworI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworI2VuZGlmCisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJFbnRlciBpZD0nJXMnIHR5cGU9JWQgbG9jPSVwIHNpemU9JWx1IGxldmVsPSV1XG4iLCBpZCwgdCwgcCwgKHVuc2lnbmVkIGxvbmcpbiwgaykpOworICBzb2FwLT5hbGxvY2VkID0gMDsKKyAgaWYgKCFwKQorICB7IGlmIChmaW5zdGFudGlhdGUpCisgICAgICBwID0gZmluc3RhbnRpYXRlKHNvYXAsIHQsIHR5cGUsIGFycmF5VHlwZSwgJm4pOworICAgIGVsc2UKKyAgICAgIHAgPSBzb2FwX21hbGxvYyhzb2FwLCBuKTsKKyAgICBpZiAocCkKKyAgICAgIHNvYXAtPmFsbG9jZWQgPSAxOworICB9CisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICBpZiAoIWlkIHx8ICEqaWQpCisjZW5kaWYKKyAgICByZXR1cm4gcDsKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgIGlwID0gc29hcF9sb29rdXAoc29hcCwgaWQpOyAvKiBsb29rdXAgcG9pbnRlciB0byBoYXNoIHRhYmxlIGVudHJ5IGZvciBzdHJpbmcgaWQgKi8KKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkxvb2t1cCBlbnRyeSBpZD0nJXMgZm9yIGxvY2F0aW9uPSVwJ1xuIiwgaWQsIHApKTsKKyAgaWYgKCFpcCkKKyAgeyBpcCA9IHNvYXBfZW50ZXIoc29hcCwgaWQpOyAvKiBuZXcgaGFzaCB0YWJsZSBlbnRyeSBmb3Igc3RyaW5nIGlkICovCisgICAgaXAtPnR5cGUgPSB0OworICAgIGlwLT5saW5rID0gTlVMTDsKKyAgICBpcC0+Y29weSA9IE5VTEw7CisgICAgaXAtPmZsaXN0ID0gTlVMTDsKKyAgICBpcC0+c2l6ZSA9IG47CisgICAgaXAtPnB0ciA9IHA7CisgICAgaXAtPmxldmVsID0gazsKKyAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiTmV3IGVudHJ5IGlkPSclcycgdHlwZT0lZCBzaXplPSVsdSBsZXZlbD0ldSBsb2NhdGlvbj0lcFxuIiwgaWQsIHQsICh1bnNpZ25lZCBsb25nKW4sIGssIHApKTsKKyAgfQorICBlbHNlIGlmICgoaXAtPnR5cGUgIT0gdCB8fCAoaXAtPmxldmVsID09IGsgJiYgaXAtPnNpemUgIT0gbikpICYmIChpcC0+Y29weSB8fCBpcC0+Zmxpc3QpKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVHlwZSBpbmNvbXBhdGliaWxpdHkgaWQ9JyVzJyBleHBlY3QgdHlwZT0lZCBzaXplPSVsdSBsZXZlbD0ldSBnb3QgdHlwZT0lZCBzaXplPSVsdVxuIiwgaWQsIGlwLT50eXBlLCAodW5zaWduZWQgbG9uZylpcC0+c2l6ZSwgaywgdCwgKHVuc2lnbmVkIGxvbmcpbikpOworICAgIHN0cmNweShzb2FwLT5pZCwgaWQpOworICAgIHNvYXAtPmVycm9yID0gU09BUF9IUkVGOworICAgIHJldHVybiBOVUxMOworICB9CisgIGVsc2UgaWYgKGlwLT5wdHIpCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJNdWx0aXBseSBkZWZpbmVkIGlkPSclcydcbiIsIGlkKSk7CisgICAgc3RyY3B5KHNvYXAtPmlkLCBpZCk7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0RVUExJQ0FURV9JRDsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBlbHNlIAorICB7IGlwLT5zaXplID0gbjsKKyAgICBpcC0+cHRyID0gcDsKKyAgICBpcC0+bGV2ZWwgPSBrOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVXBkYXRlIGVudHJ5IGlkPSclcycgdHlwZT0lZCBsb2NhdGlvbj0lcCBzaXplPSVsdSBsZXZlbD0ldVxuIiwgaWQsIHQsIHAsICh1bnNpZ25lZCBsb25nKW4sIGspKTsKKyAgfQorICByZXR1cm4gaXAtPnB0cjsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9mY29weShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0LCBpbnQgdHQsIHZvaWQgKnAsIHNpemVfdCBsZW4sIGNvbnN0IHZvaWQgKnEsIHNpemVfdCBuKQoreyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weWluZyBkYXRhIHR5cGU9JWQgKHRhcmdldCB0eXBlPSVkKSAlcCAtPiAlcCAoJWx1IGJ5dGVzKVxuIiwgc3QsIHR0LCBxLCBwLCAodW5zaWduZWQgbG9uZyluKSk7CisgIG1lbWNweShwLCBxLCBuKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbmRfc2VuZChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5kaW1lLmxpc3QpCisgIHsgLyogU09BUCBib2R5IHJlZmVyZW5jZWQgYXR0YWNobWVudHMgbXVzdCBhcHBlYXIgZmlyc3QgKi8KKyAgICBzb2FwLT5kaW1lLmxhc3QtPm5leHQgPSBzb2FwLT5kaW1lLmZpcnN0OworICAgIHNvYXAtPmRpbWUuZmlyc3QgPSBzb2FwLT5kaW1lLmxpc3QtPm5leHQ7CisgICAgc29hcC0+ZGltZS5saXN0LT5uZXh0ID0gTlVMTDsKKyAgICBzb2FwLT5kaW1lLmxhc3QgPSBzb2FwLT5kaW1lLmxpc3Q7CisgIH0KKyAgaWYgKHNvYXBfcHV0ZGltZShzb2FwKSB8fCBzb2FwX3B1dG1pbWUoc29hcCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBzb2FwLT5taW1lLmxpc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5sYXN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5saXN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGFzdCA9IE5VTEw7CisjZW5kaWYKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgc2VuZFxuIikpOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pIC8qIG5lZWQgdG8gZmx1c2ggdGhlIHJlbWFpbmluZyBkYXRhIGluIGJ1ZmZlciAqLworICB7IGlmIChzb2FwX2ZsdXNoKHNvYXApKQorI2lmZGVmIFdJVEhfWkxJQgorICAgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCICYmIHNvYXAtPnpsaWJfc3RhdGUgPT0gU09BUF9aTElCX0RFRkxBVEUpCisgICAgICB7IHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfTk9ORTsKKyAgICAgICAgZGVmbGF0ZUVuZCgmc29hcC0+ZF9zdHJlYW0pOworICAgICAgfQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyNlbHNlCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjZW5kaWYKKyNpZmRlZiBXSVRIX1pMSUIKKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIpCisgICAgeyBpbnQgcjsKKyAgICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luID0gMDsKKyAgICAgIGRvCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVmbGF0aW5nIHJlbWFpbmRlclxuIikpOworICAgICAgICByID0gZGVmbGF0ZSgmc29hcC0+ZF9zdHJlYW0sIFpfRklOSVNIKTsKKyAgICAgICAgaWYgKHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCAhPSBTT0FQX0JVRkxFTikKKyAgICAgICAgeyBpZiAoc29hcF9mbHVzaF9yYXcoc29hcCwgc29hcC0+el9idWYsIFNPQVBfQlVGTEVOIC0gc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0KSkKKyAgICAgICAgICB7IHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfTk9ORTsKKyAgICAgICAgICAgIGRlZmxhdGVFbmQoJnNvYXAtPmRfc3RyZWFtKTsKKyAgICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKwkgIH0KKyAgICAgICAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IChCeXRlKilzb2FwLT56X2J1ZjsKKyAgICAgICAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgPSBTT0FQX0JVRkxFTjsKKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAociA9PSBaX09LKTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVmbGF0ZWQgJWx1LT4lbHUgYnl0ZXNcbiIsIHNvYXAtPmRfc3RyZWFtLnRvdGFsX2luLCBzb2FwLT5kX3N0cmVhbS50b3RhbF9vdXQpKTsKKyAgICAgIHNvYXAtPnpfcmF0aW9fb3V0ID0gKGZsb2F0KXNvYXAtPmRfc3RyZWFtLnRvdGFsX291dCAvIChmbG9hdClzb2FwLT5kX3N0cmVhbS50b3RhbF9pbjsKKyAgICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX1pMSUI7CisgICAgICBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX05PTkU7CisgICAgICBpZiAoZGVmbGF0ZUVuZCgmc29hcC0+ZF9zdHJlYW0pICE9IFpfT0sgfHwgciAhPSBaX1NUUkVBTV9FTkQpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVW5hYmxlIHRvIGVuZCBkZWZsYXRlOiAlc1xuIiwgc29hcC0+ZF9zdHJlYW0ubXNnP3NvYXAtPmRfc3RyZWFtLm1zZzoiIikpOworICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgICB9CisjaWZkZWYgV0lUSF9HWklQCisgICAgICBzb2FwLT56X2J1ZlswXSA9IHNvYXAtPnpfY3JjICYgMHhGRjsKKyAgICAgIHNvYXAtPnpfYnVmWzFdID0gKHNvYXAtPnpfY3JjID4+IDgpICYgMHhGRjsKKyAgICAgIHNvYXAtPnpfYnVmWzJdID0gKHNvYXAtPnpfY3JjID4+IDE2KSAmIDB4RkY7CisgICAgICBzb2FwLT56X2J1ZlszXSA9IChzb2FwLT56X2NyYyA+PiAyNCkgJiAweEZGOworICAgICAgc29hcC0+el9idWZbNF0gPSBzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiAmIDB4RkY7CisgICAgICBzb2FwLT56X2J1Zls1XSA9IChzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiA+PiA4KSAmIDB4RkY7CisgICAgICBzb2FwLT56X2J1Zls2XSA9IChzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiA+PiAxNikgJiAweEZGOworICAgICAgc29hcC0+el9idWZbN10gPSAoc29hcC0+ZF9zdHJlYW0udG90YWxfaW4gPj4gMjQpICYgMHhGRjsKKyAgICAgIGlmIChzb2FwX2ZsdXNoX3Jhdyhzb2FwLCBzb2FwLT56X2J1ZiwgOCkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZ3ppcCBjcmMzMj0lbHVcbiIsICh1bnNpZ25lZCBsb25nKXNvYXAtPnpfY3JjKSk7CisjZW5kaWYKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX1NUT1JFKQorICAgIHsgY2hhciAqcDsKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyAgICAgIGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpKQorICAgICAgeyBzb2FwLT5tb2RlLS07CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2VuZGluZyBidWZmZXJlZCBtZXNzYWdlIG9mIGxlbmd0aCAldVxuIiwgKHVuc2lnbmVkIGludClzb2FwLT5ibGlzdC0+c2l6ZSkpOworICAgICAgICBpZiAoc29hcC0+c3RhdHVzID49IFNPQVBfUE9TVCkKKyAgICAgICAgICBzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0KHNvYXAsIHNvYXAtPmVuZHBvaW50LCBzb2FwLT5ob3N0LCBzb2FwLT5wb3J0LCBzb2FwLT5wYXRoLCBzb2FwLT5hY3Rpb24sIHNvYXAtPmJsaXN0LT5zaXplKTsKKyAgICAgICAgZWxzZSBpZiAoc29hcC0+c3RhdHVzICE9IFNPQVBfU1RPUCkKKyAgICAgICAgICBzb2FwLT5lcnJvciA9IHNvYXAtPmZyZXNwb25zZShzb2FwLCBzb2FwLT5zdGF0dXMsIHNvYXAtPmJsaXN0LT5zaXplKTsKKyAgICAgICAgaWYgKHNvYXAtPmVycm9yIHx8IHNvYXBfZmx1c2goc29hcCkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBzb2FwLT5tb2RlKys7CisgICAgICB9CisjZW5kaWYKKyAgICAgIGZvciAocCA9IHNvYXBfZmlyc3RfYmxvY2soc29hcCk7IHA7IHAgPSBzb2FwX25leHRfYmxvY2soc29hcCkpCisgICAgICB7IERCR01TRyhTRU5ULCBwLCBzb2FwX2Jsb2NrX3NpemUoc29hcCkpOworICAgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnNlbmQoc29hcCwgcCwgc29hcF9ibG9ja19zaXplKHNvYXApKSkpCisgICAgICAgIHsgc29hcF9lbmRfYmxvY2soc29hcCk7CisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICB9CisgICAgICB9CisgICAgICBzb2FwX2VuZF9ibG9jayhzb2FwKTsKKyAgICB9CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgICAgZWxzZSBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKQorICAgIHsgREJHTVNHKFNFTlQsICJcclxuMFxyXG5cclxuIiwgNyk7CisgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnNlbmQoc29hcCwgIlxyXG4wXHJcblxyXG4iLCA3KSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisjZW5kaWYKKyAgfQorI2lmZGVmIFdJVEhfVENQRklOCisjaWZkZWYgV0lUSF9PUEVOU1NMCisgIGlmICghc29hcC0+c3NsICYmIHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkgJiYgIXNvYXAtPmtlZXBfYWxpdmUgJiYgIShzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICBzb2FwLT5mc2h1dGRvd25zb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgMSk7IC8qIFNlbmQgVENQIEZJTiAqLworI2Vsc2UKKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkgJiYgIXNvYXAtPmtlZXBfYWxpdmUgJiYgIShzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICBzb2FwLT5mc2h1dGRvd25zb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgMSk7IC8qIFNlbmQgVENQIEZJTiAqLworI2VuZGlmCisjZW5kaWYKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgb2Ygc2VuZCBwaGFzZVxuIikpOworICBzb2FwLT5vbW9kZSAmPSB+U09BUF9YTUxfU0VDOworICBzb2FwLT5jb3VudCA9IDA7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0VORDsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW5kX3JlY3Yoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPnBhcnQgPSBTT0FQX0VORDsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkgJiYgc29hcF9nZXRkaW1lKHNvYXApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgc29hcC0+ZGltZS5saXN0ID0gc29hcC0+ZGltZS5maXJzdDsKKyAgc29hcC0+ZGltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGFzdCA9IE5VTEw7CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01JTUUpICYmIHNvYXBfZ2V0bWltZShzb2FwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHNvYXAtPm1pbWUubGlzdCA9IHNvYXAtPm1pbWUuZmlyc3Q7CisgIHNvYXAtPm1pbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmxhc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gTlVMTDsKKyNlbmRpZgorICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIG9mIHJlY2VpdmUgbWVzc2FnZSBva1xuIikpOworI2lmZGVmIFdJVEhfWkxJQgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIpCisgIHsgc29hcC0+bW9kZSAmPSB+U09BUF9FTkNfWkxJQjsKKyAgICBtZW1jcHkoc29hcC0+YnVmLCBzb2FwLT56X2J1ZiwgU09BUF9CVUZMRU4pOworICAgIHNvYXAtPmJ1ZmlkeCA9IChjaGFyKilzb2FwLT5kX3N0cmVhbS5uZXh0X2luIC0gc29hcC0+el9idWY7CisgICAgc29hcC0+YnVmbGVuID0gc29hcC0+el9idWZsZW47CisgICAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9OT05FOworICAgIGlmIChpbmZsYXRlRW5kKCZzb2FwLT5kX3N0cmVhbSkgIT0gWl9PSykKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyNpZmRlZiBXSVRIX0daSVAKKyAgICBpZiAoc29hcC0+emxpYl9pbiA9PSBTT0FQX1pMSUJfR1pJUCkKKyAgICB7IHNvYXBfd2NoYXIgYzsKKyAgICAgIHNob3J0IGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgeyBpZiAoKGludCkoYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKSkgPT0gRU9GKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgICAgICBzb2FwLT56X2J1ZltpXSA9IChjaGFyKWM7CisgICAgICB9CisgICAgICBpZiAoc29hcC0+el9jcmMgIT0gKCh1TG9uZykodW5zaWduZWQgY2hhcilzb2FwLT56X2J1ZlswXSB8ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbMV0gPDwgOCkgfCAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzJdIDw8IDE2KSB8ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbM10gPDwgMjQpKSkKKyAgICAgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkd6aXAgZXJyb3I6IGNyYyBjaGVjayBmYWlsZWQsIG1lc3NhZ2UgY29ycnVwdGVkPyAoY3JjMzI9JWx1KVxuIiwgKHVuc2lnbmVkIGxvbmcpc29hcC0+el9jcmMpKTsKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgfQorICAgICAgaWYgKHNvYXAtPmRfc3RyZWFtLnRvdGFsX291dCAhPSAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzRdIHwgKCh1TG9uZykodW5zaWduZWQgY2hhcilzb2FwLT56X2J1Zls1XSA8PCA4KSB8ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbNl0gPDwgMTYpIHwgKCh1TG9uZykodW5zaWduZWQgY2hhcilzb2FwLT56X2J1Zls3XSA8PCAyNCkpKQorICAgICAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiR3ppcCBlcnJvcjogaW5jb3JyZWN0IG1lc3NhZ2UgbGVuZ3RoXG4iKSk7CisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgfQorI2VuZGlmCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgICAgd2hpbGUgKChpbnQpc29hcF9nZXRjaGFyKHNvYXApICE9IEVPRikgLyogYWR2YW5jZSB0byBsYXN0IGNodW5rICovCisgICAgICA7CisgIGlmIChzb2FwLT5mZGlzY29ubmVjdCAmJiAoc29hcC0+ZXJyb3IgPSBzb2FwLT5mZGlzY29ubmVjdChzb2FwKSkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgcmV0dXJuIHNvYXBfcmVzb2x2ZShzb2FwKTsKKyNlbHNlCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT54bGlzdCkKKyAgeyBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX01JTUVfSFJFRjsKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0RJTUVfSFJFRjsKKyAgfQorI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2ZyZWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHN0cnVjdCBOYW1lc3BhY2UgKm5zOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWUgbmFtZXNwYWNlIHN0YWNrXG4iKSk7CisgIHdoaWxlIChzb2FwLT5ubGlzdCkKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnAgPSBzb2FwLT5ubGlzdC0+bmV4dDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+bmxpc3QpOworICAgIHNvYXAtPm5saXN0ID0gbnA7CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIGFueSByZW1haW5pbmcgdGVtcCBibG9ja3NcbiIpKTsKKyAgd2hpbGUgKHNvYXAtPmJsaXN0KQorICAgIHNvYXBfZW5kX2Jsb2NrKHNvYXApOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWUgYXR0cmlidXRlIHN0b3JhZ2VcbiIpKTsKKyAgd2hpbGUgKHNvYXAtPmF0dHJpYnV0ZXMpCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfYXR0cmlidXRlICp0cCA9IHNvYXAtPmF0dHJpYnV0ZXMtPm5leHQ7CisgICAgaWYgKHNvYXAtPmF0dHJpYnV0ZXMtPnZhbHVlKQorICAgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPmF0dHJpYnV0ZXMtPnZhbHVlKTsKKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+YXR0cmlidXRlcyk7CisgICAgc29hcC0+YXR0cmlidXRlcyA9IHRwOworICB9CisjaWZkZWYgV0lUSF9GQVNUCisgIGlmIChzb2FwLT5sYWJidWYpCisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPmxhYmJ1Zik7CisgIHNvYXAtPmxhYmJ1ZiA9IE5VTEw7CisgIHNvYXAtPmxhYmxlbiA9IDA7CisgIHNvYXAtPmxhYmlkeCA9IDA7CisjZW5kaWYKKyAgbnMgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzOworICBpZiAobnMpCisgIHsgZm9yICg7IG5zLT5pZDsgbnMrKykKKyAgICB7IGlmIChucy0+b3V0KQorICAgICAgeyBpZiAoc29hcC0+ZW5jb2RpbmdTdHlsZSA9PSBucy0+b3V0KQorICAgICAgICAgIHNvYXAtPmVuY29kaW5nU3R5bGUgPSBTT0FQX1NUUl9FT1M7CisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBucy0+b3V0KTsKKyAgICAgICAgbnMtPm91dCA9IE5VTEw7CisgICAgICB9CisgICAgICBpZiAoc29hcC0+ZW5jb2RpbmdTdHlsZSA9PSBucy0+bnMpCisgICAgICAgIHNvYXAtPmVuY29kaW5nU3R5bGUgPSBTT0FQX1NUUl9FT1M7CisgICAgfQorICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzKTsKKyAgICBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzID0gTlVMTDsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICB3aGlsZSAoc29hcC0+eGxpc3QpCisgIHsgc3RydWN0IHNvYXBfeGxpc3QgKnhwID0gc29hcC0+eGxpc3QtPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPnhsaXN0KTsKKyAgICBzb2FwLT54bGlzdCA9IHhwOworICB9CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgIHNvYXBfZnJlZV9waHQoc29hcCk7CisgIHNvYXBfZnJlZV9paHQoc29hcCk7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK3N0YXRpYyB2b2lkCitzb2FwX2luaXRfbG9ncyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX01BWExPR1M7IGkrKykKKyAgeyBzb2FwLT5sb2dmaWxlW2ldID0gTlVMTDsKKyAgICBzb2FwLT5mZGVidWdbaV0gPSBOVUxMOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAhZGVmaW5lZChXSVRIX0xFQU4pIHx8IGRlZmluZWQoU09BUF9ERUJVRykKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfb3Blbl9sb2dmaWxlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgaSkKK3sgaWYgKHNvYXAtPmxvZ2ZpbGVbaV0pCisgICAgc29hcC0+ZmRlYnVnW2ldID0gZm9wZW4oc29hcC0+bG9nZmlsZVtpXSwgaSA8IDIgPyAiYWIiIDogImEiKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK3N0YXRpYyB2b2lkCitzb2FwX2Nsb3NlX2xvZ2ZpbGUoc3RydWN0IHNvYXAgKnNvYXAsIGludCBpKQoreyBpZiAoc29hcC0+ZmRlYnVnW2ldKQorICB7IGZjbG9zZShzb2FwLT5mZGVidWdbaV0pOworICAgIHNvYXAtPmZkZWJ1Z1tpXSA9IE5VTEw7CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfY2xvc2VfbG9nZmlsZXMoc3RydWN0IHNvYXAgKnNvYXApCit7IGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9NQVhMT0dTOyBpKyspCisgICAgc29hcF9jbG9zZV9sb2dmaWxlKHNvYXAsIGkpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworc3RhdGljIHZvaWQKK3NvYXBfc2V0X2xvZ2ZpbGUoc3RydWN0IHNvYXAgKnNvYXAsIGludCBpLCBjb25zdCBjaGFyICpsb2dmaWxlKQoreyBjaGFyICpzID0gTlVMTDsKKyAgc29hcF9jbG9zZV9sb2dmaWxlKHNvYXAsIGkpOworICBpZiAoc29hcC0+bG9nZmlsZVtpXSkKKyAgICBTT0FQX0ZSRUUoc29hcCwgKHZvaWQqKXNvYXAtPmxvZ2ZpbGVbaV0pOworICBpZiAobG9nZmlsZSkKKyAgICBpZiAoKHMgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKGxvZ2ZpbGUpICsgMSkpKQorICAgICAgc3RyY3B5KHMsIGxvZ2ZpbGUpOworICBzb2FwLT5sb2dmaWxlW2ldID0gczsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X3JlY3ZfbG9nZmlsZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbG9nZmlsZSkKK3sgc29hcF9zZXRfbG9nZmlsZShzb2FwLCBTT0FQX0lOREVYX1JFQ1YsIGxvZ2ZpbGUpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfc2VudF9sb2dmaWxlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpsb2dmaWxlKQoreyBzb2FwX3NldF9sb2dmaWxlKHNvYXAsIFNPQVBfSU5ERVhfU0VOVCwgbG9nZmlsZSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF90ZXN0X2xvZ2ZpbGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmxvZ2ZpbGUpCit7IHNvYXBfc2V0X2xvZ2ZpbGUoc29hcCwgU09BUF9JTkRFWF9URVNULCBsb2dmaWxlKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwKgorU09BUF9GTUFDMgorc29hcF9jb3B5KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZXR1cm4gc29hcF9jb3B5X2NvbnRleHQoKHN0cnVjdCBzb2FwKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2FwKSksIHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc3RydWN0IHNvYXAqCitTT0FQX0ZNQUMyCitzb2FwX2NvcHlfY29udGV4dChzdHJ1Y3Qgc29hcCAqY29weSwgc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwX2NoZWNrX3N0YXRlKHNvYXApKQorICAgIHJldHVybiBOVUxMOworICBpZiAoY29weSkKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnA7CisgICAgbWVtY3B5KGNvcHksIHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcCkpOworICAgIGNvcHktPnN0YXRlID0gU09BUF9DT1BZOworICAgIGNvcHktPnVzZXIgPSBOVUxMOworICAgIGNvcHktPmVycm9yID0gU09BUF9PSzsKKyAgICBjb3B5LT51c2VyaWQgPSBOVUxMOworICAgIGNvcHktPnBhc3N3ZCA9IE5VTEw7CisgICAgY29weS0+bmxpc3QgPSBOVUxMOworICAgIGNvcHktPmJsaXN0ID0gTlVMTDsKKyAgICBjb3B5LT5jbGlzdCA9IE5VTEw7CisgICAgY29weS0+YWxpc3QgPSBOVUxMOworICAgIGNvcHktPmF0dHJpYnV0ZXMgPSBOVUxMOworI2lmZGVmIFdJVEhfRkFTVAorICAgIGNvcHktPmxhYmJ1ZiA9IE5VTEw7CisgICAgY29weS0+bGFibGVuID0gMDsKKyAgICBjb3B5LT5sYWJpZHggPSAwOworI2VuZGlmCisjaWZkZWYgU09BUF9ERUJVRworICAgIHNvYXBfaW5pdF9taHQoY29weSk7CisjZW5kaWYKKyAgICBjb3B5LT5sb2NhbF9uYW1lc3BhY2VzID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgICAgc29hcF9pbml0X2lodChjb3B5KTsKKyAgICBzb2FwX2luaXRfcGh0KGNvcHkpOworI2VuZGlmCisgICAgY29weS0+aGVhZGVyID0gTlVMTDsKKyAgICBjb3B5LT5mYXVsdCA9IE5VTEw7CisgICAgY29weS0+YWN0aW9uID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisjaWZkZWYgV0lUSF9DT09LSUVTCisgICAgY29weS0+Y29va2llcyA9IHNvYXBfY29weV9jb29raWVzKGNvcHkpOworI2Vsc2UKKyAgICBjb3B5LT5jb29raWVzID0gTlVMTDsKKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgU09BUF9ERUJVRworICAgIHNvYXBfaW5pdF9sb2dzKGNvcHkpOworICAgIHNvYXBfc2V0X3JlY3ZfbG9nZmlsZShjb3B5LCBzb2FwLT5sb2dmaWxlW1NPQVBfSU5ERVhfUkVDVl0pOworICAgIHNvYXBfc2V0X3NlbnRfbG9nZmlsZShjb3B5LCBzb2FwLT5sb2dmaWxlW1NPQVBfSU5ERVhfU0VOVF0pOworICAgIHNvYXBfc2V0X3Rlc3RfbG9nZmlsZShjb3B5LCBzb2FwLT5sb2dmaWxlW1NPQVBfSU5ERVhfVEVTVF0pOworI2VuZGlmCisgICAgY29weS0+cGx1Z2lucyA9IE5VTEw7CisgICAgZm9yIChwID0gc29hcC0+cGx1Z2luczsgcDsgcCA9IHAtPm5leHQpCisgICAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnEgPSAoc3RydWN0IHNvYXBfcGx1Z2luKilTT0FQX01BTExPQyhjb3B5LCBzaXplb2Yoc3RydWN0IHNvYXBfcGx1Z2luKSk7CisgICAgICBpZiAoIXEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5aW5nIHBsdWdpbiAnJXMnXG4iLCBwLT5pZCkpOworICAgICAgKnEgPSAqcDsKKyAgICAgIGlmIChwLT5mY29weSAmJiAoc29hcC0+ZXJyb3IgPSBwLT5mY29weShjb3B5LCBxLCBwKSkpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IGNvcHkgcGx1Z2luICclcydcbiIsIHAtPmlkKSk7CisgICAgICAgIFNPQVBfRlJFRShjb3B5LCBxKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICBxLT5uZXh0ID0gY29weS0+cGx1Z2luczsKKyAgICAgIGNvcHktPnBsdWdpbnMgPSBxOworICAgIH0KKyAgfQorICBlbHNlCisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgcmV0dXJuIGNvcHk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2luaXQoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPnN0YXRlID0gU09BUF9JTklUOworICBzb2FwLT52ZXJzaW9uID0gMDsKKyAgc29hcF9pbW9kZShzb2FwLCBTT0FQX0lPX0RFRkFVTFQpOworICBzb2FwX29tb2RlKHNvYXAsIFNPQVBfSU9fREVGQVVMVCk7CisgIHNvYXAtPnBsdWdpbnMgPSBOVUxMOworICBzb2FwLT51c2VyID0gTlVMTDsKKyAgc29hcC0+dXNlcmlkID0gTlVMTDsKKyAgc29hcC0+cGFzc3dkID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyAgc29hcC0+ZnBvc3QgPSBodHRwX3Bvc3Q7CisgIHNvYXAtPmZnZXQgPSBodHRwX2dldDsKKyAgc29hcC0+ZmZvcm0gPSBOVUxMOworICBzb2FwLT5mcG9zdGhkciA9IGh0dHBfcG9zdF9oZWFkZXI7CisgIHNvYXAtPmZyZXNwb25zZSA9IGh0dHBfcmVzcG9uc2U7CisgIHNvYXAtPmZwYXJzZSA9IGh0dHBfcGFyc2U7CisgIHNvYXAtPmZwYXJzZWhkciA9IGh0dHBfcGFyc2VfaGVhZGVyOworI2VuZGlmCisgIHNvYXAtPmZjb25uZWN0ID0gTlVMTDsKKyAgc29hcC0+ZmRpc2Nvbm5lY3QgPSBOVUxMOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9JUFY2CisgIHNvYXAtPmZyZXNvbHZlID0gdGNwX2dldGhvc3Q7CisjZWxzZQorICBzb2FwLT5mcmVzb2x2ZSA9IE5VTEw7CisjZW5kaWYKKyAgc29hcC0+ZmFjY2VwdCA9IHRjcF9hY2NlcHQ7CisgIHNvYXAtPmZvcGVuID0gdGNwX2Nvbm5lY3Q7CisgIHNvYXAtPmZjbG9zZSA9IHRjcF9kaXNjb25uZWN0OworICBzb2FwLT5mY2xvc2Vzb2NrZXQgPSB0Y3BfY2xvc2Vzb2NrZXQ7CisgIHNvYXAtPmZzaHV0ZG93bnNvY2tldCA9IHRjcF9zaHV0ZG93bnNvY2tldDsKKyAgc29hcC0+ZnNlbmQgPSBmc2VuZDsKKyAgc29hcC0+ZnJlY3YgPSBmcmVjdjsKKyAgc29hcC0+ZnBvbGwgPSBzb2FwX3BvbGw7CisjZWxzZQorICBzb2FwLT5mb3BlbiA9IE5VTEw7CisgIHNvYXAtPmZjbG9zZSA9IE5VTEw7CisgIHNvYXAtPmZwb2xsID0gTlVMTDsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzb2FwLT5mcHJlcGFyZWluaXQgPSBOVUxMOworICBzb2FwLT5mcHJlcGFyZXNlbmQgPSBOVUxMOworICBzb2FwLT5mcHJlcGFyZXJlY3YgPSBOVUxMOworICBzb2FwLT5mcHJlcGFyZWZpbmFsID0gTlVMTDsKKyNlbmRpZgorICBzb2FwLT5mc2V0ZXJyb3IgPSBOVUxMOworICBzb2FwLT5maWdub3JlID0gTlVMTDsKKyAgc29hcC0+ZnNlcnZlbG9vcCA9IE5VTEw7CisgIHNvYXAtPmZwbHVnaW4gPSBmcGx1Z2luOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzb2FwLT5mZGltZXJlYWRvcGVuID0gTlVMTDsKKyAgc29hcC0+ZmRpbWV3cml0ZW9wZW4gPSBOVUxMOworICBzb2FwLT5mZGltZXJlYWRjbG9zZSA9IE5VTEw7CisgIHNvYXAtPmZkaW1ld3JpdGVjbG9zZSA9IE5VTEw7CisgIHNvYXAtPmZkaW1lcmVhZCA9IE5VTEw7CisgIHNvYXAtPmZkaW1ld3JpdGUgPSBOVUxMOworI2VuZGlmCisgIHNvYXAtPmZsb2F0X2Zvcm1hdCA9ICIlLjhnIjsgLyogLjggcHJlc2VydmVzIHNpbmdsZSBGUCBwcmVjaXNpb24gYXMgbXVjaCBhcyBwb3NzaWJsZSwgYnV0IG1pZ2h0IG5vdCBiZSB2ZXJ5IGVmZmljaWVudCAqLworICBzb2FwLT5kb3VibGVfZm9ybWF0ID0gIiUuMTdsZyI7IC8qIC4xNyBwcmVzZXJ2ZXMgZG91YmxlIEZQIHByZWNpc2lvbiBhcyBtdWNoIGFzIHBvc3NpYmxlLCBidXQgbWlnaHQgbm90IGJlIHZlcnkgZWZmaWNpZW50ICovCisgIHNvYXAtPmRpbWVfaWRfZm9ybWF0ID0gImNpZDppZCVkIjsgLyogZGVmYXVsdCBESU1FIGlkIGZvcm1hdCAqLworICBzb2FwLT5odHRwX3ZlcnNpb24gPSAiMS4xIjsKKyAgc29hcC0+YWN0b3IgPSBOVUxMOworICBzb2FwLT5tYXhfa2VlcF9hbGl2ZSA9IFNPQVBfTUFYS0VFUEFMSVZFOworICBzb2FwLT5rZWVwX2FsaXZlID0gMDsKKyAgc29hcC0+cmVjdl90aW1lb3V0ID0gMDsKKyAgc29hcC0+c2VuZF90aW1lb3V0ID0gMDsKKyAgc29hcC0+Y29ubmVjdF90aW1lb3V0ID0gMDsKKyAgc29hcC0+YWNjZXB0X3RpbWVvdXQgPSAwOworICBzb2FwLT5zb2NrZXRfZmxhZ3MgPSAwOworICBzb2FwLT5jb25uZWN0X2ZsYWdzID0gMDsKKyAgc29hcC0+YmluZF9mbGFncyA9IDA7CisgIHNvYXAtPmFjY2VwdF9mbGFncyA9IDA7CisgIHNvYXAtPmlwID0gMDsKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgc29hcC0+bGFiYnVmID0gTlVMTDsKKyAgc29hcC0+bGFibGVuID0gMDsKKyAgc29hcC0+bGFiaWR4ID0gMDsKKyNlbmRpZgorICBzb2FwLT5lbmNvZGluZ1N0eWxlID0gU09BUF9TVFJfRU9TOworI2lmbmRlZiBXSVRIX05PTkFNRVNQQUNFUworICBzb2FwLT5uYW1lc3BhY2VzID0gbmFtZXNwYWNlczsKKyNlbHNlCisgIHNvYXAtPm5hbWVzcGFjZXMgPSBOVUxMOworI2VuZGlmCisgIHNvYXAtPmxvY2FsX25hbWVzcGFjZXMgPSBOVUxMOworICBzb2FwLT5ubGlzdCA9IE5VTEw7CisgIHNvYXAtPmJsaXN0ID0gTlVMTDsKKyAgc29hcC0+Y2xpc3QgPSBOVUxMOworICBzb2FwLT5hbGlzdCA9IE5VTEw7CisgIHNvYXAtPmF0dHJpYnV0ZXMgPSBOVUxMOworICBzb2FwLT5oZWFkZXIgPSBOVUxMOworICBzb2FwLT5mYXVsdCA9IE5VTEw7CisgIHNvYXAtPm1hc3RlciA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIHNvYXAtPnNvY2tldCA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIHNvYXAtPm9zID0gTlVMTDsKKyAgc29hcC0+aXMgPSBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzb2FwLT5kb20gPSBOVUxMOworICBzb2FwLT5kaW1lLmxpc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5sYXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5saXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuYm91bmRhcnkgPSBOVUxMOworICBzb2FwLT5taW1lLnN0YXJ0ID0gTlVMTDsKKyAgc29hcC0+eGxpc3QgPSBOVUxMOworI2VuZGlmCisjaWZuZGVmIFVOREVSX0NFCisgIHNvYXAtPnJlY3ZmZCA9IDA7CisgIHNvYXAtPnNlbmRmZCA9IDE7CisjZWxzZQorICBzb2FwLT5yZWN2ZmQgPSBzdGRpbjsKKyAgc29hcC0+c2VuZGZkID0gc3Rkb3V0OworI2VuZGlmIAorICBzb2FwLT5ob3N0WzBdID0gJ1wwJzsKKyAgc29hcC0+cG9ydCA9IDA7CisgIHNvYXAtPmFjdGlvbiA9IE5VTEw7CisgIHNvYXAtPnByb3h5X2hvc3QgPSBOVUxMOworICBzb2FwLT5wcm94eV9wb3J0ID0gODA4MDsKKyAgc29hcC0+cHJveHlfdXNlcmlkID0gTlVMTDsKKyAgc29hcC0+cHJveHlfcGFzc3dkID0gTlVMTDsKKyAgc29hcC0+YXV0aHJlYWxtID0gTlVMTDsKKyAgc29hcC0+cHJvbG9nID0gTlVMTDsKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgaWYgKCFzc2xfaW5pdF9kb25lKQorICAgIHNvYXBfc3NsX2luaXQoKTsKKyAgc29hcC0+ZnNzbGF1dGggPSBzc2xfYXV0aF9pbml0OworICBzb2FwLT5mc3NsdmVyaWZ5ID0gc3NsX3ZlcmlmeV9jYWxsYmFjazsKKyAgc29hcC0+YmlvID0gTlVMTDsKKyAgc29hcC0+c3NsID0gTlVMTDsKKyAgc29hcC0+Y3R4ID0gTlVMTDsKKyAgc29hcC0+cmVxdWlyZV9zZXJ2ZXJfYXV0aCA9IDA7CisgIHNvYXAtPnJlcXVpcmVfY2xpZW50X2F1dGggPSAwOworICBzb2FwLT5yc2EgPSAwOworICBzb2FwLT5rZXlmaWxlID0gTlVMTDsKKyAgc29hcC0+cGFzc3dvcmQgPSBOVUxMOworICBzb2FwLT5kaGZpbGUgPSBOVUxMOworICBzb2FwLT5jYWZpbGUgPSBOVUxMOworICBzb2FwLT5jYXBhdGggPSBOVUxMOworICBzb2FwLT5jcmxmaWxlID0gTlVMTDsKKyAgc29hcC0+cmFuZGZpbGUgPSBOVUxMOworICBzb2FwLT5zZXNzaW9uID0gTlVMTDsKKyNlbmRpZgorI2lmZGVmIFdJVEhfWkxJQgorICBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX05PTkU7CisgIHNvYXAtPnpsaWJfaW4gPSBTT0FQX1pMSUJfTk9ORTsKKyAgc29hcC0+emxpYl9vdXQgPSBTT0FQX1pMSUJfTk9ORTsKKyAgc29hcC0+ZF9zdHJlYW0uemFsbG9jID0gTlVMTDsKKyAgc29hcC0+ZF9zdHJlYW0uemZyZWUgPSBOVUxMOworICBzb2FwLT5kX3N0cmVhbS5vcGFxdWUgPSBOVUxMOworICBzb2FwLT56X2xldmVsID0gNjsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgc29hcC0+YzE0bmluY2x1ZGUgPSBOVUxMOworICBzb2FwLT5jMTRuZXhjbHVkZSA9IE5VTEw7CisgIHNvYXAtPmNvb2tpZXMgPSBOVUxMOworICBzb2FwLT5jb29raWVfZG9tYWluID0gTlVMTDsKKyAgc29hcC0+Y29va2llX3BhdGggPSBOVUxMOworICBzb2FwLT5jb29raWVfbWF4ID0gMzI7CisjZW5kaWYKKyNpZmRlZiBTT0FQX0RFQlVHCisgIHNvYXBfaW5pdF9taHQoc29hcCk7CisgIHNvYXBfaW5pdF9sb2dzKHNvYXApOworICBzb2FwX3NldF9yZWN2X2xvZ2ZpbGUoc29hcCwgIlJFQ1YubG9nIik7CisgIHNvYXBfc2V0X3NlbnRfbG9nZmlsZShzb2FwLCAiU0VOVC5sb2ciKTsKKyAgc29hcF9zZXRfdGVzdF9sb2dmaWxlKHNvYXAsIE5VTEwpOworI2VuZGlmCisjaWZkZWYgV01XX1JQTV9JTworICBzb2FwLT5ycG1yZXFpZCA9IE5VTEw7CisjZW5kaWYKKyNpZmRlZiBQQUxNCisgIHBhbG1OZXRMaWJPcGVuKCk7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgIHNvYXBfaW5pdF9paHQoc29hcCk7CisgIHNvYXBfaW5pdF9waHQoc29hcCk7CisjZW5kaWYKKyAgc29hcF9iZWdpbihzb2FwKTsKKyNpZmRlZiBTT0FQX0RFQlVHCisgIHNvYXBfc2V0X3Rlc3RfbG9nZmlsZShzb2FwLCAiVEVTVC5sb2ciKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9pbml0MShzdHJ1Y3Qgc29hcCAqc29hcCwgc29hcF9tb2RlIG1vZGUpCit7IHNvYXBfaW5pdDIoc29hcCwgbW9kZSwgbW9kZSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2luaXQyKHN0cnVjdCBzb2FwICpzb2FwLCBzb2FwX21vZGUgaW1vZGUsIHNvYXBfbW9kZSBvbW9kZSkKK3sgc29hcF9pbml0KHNvYXApOworICBzb2FwX2ltb2RlKHNvYXAsIGltb2RlKTsKKyAgc29hcF9vbW9kZShzb2FwLCBvbW9kZSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2JlZ2luKHN0cnVjdCBzb2FwICpzb2FwKQoreyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluaXRpYWxpemluZ1xuIikpOworICBpZiAoIXNvYXAtPmtlZXBfYWxpdmUpCisgIHsgc29hcC0+YnVmbGVuID0gMDsKKyAgICBzb2FwLT5idWZpZHggPSAwOworICB9CisgIHNvYXAtPmtlZXBfYWxpdmUgPSAoKChzb2FwLT5pbW9kZSB8IHNvYXAtPm9tb2RlKSAmIFNPQVBfSU9fS0VFUEFMSVZFKSAhPSAwKTsKKyAgc29hcC0+bnVsbCA9IDA7CisgIHNvYXAtPnBvc2l0aW9uID0gMDsKKyAgc29hcC0+ZW5jb2RpbmcgPSAwOworICBzb2FwLT5tdXN0VW5kZXJzdGFuZCA9IDA7CisgIHNvYXAtPm1vZGUgPSAwOworICBzb2FwLT5ucyA9IDA7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0VORDsKKyAgc29hcC0+YWxsb2NlZCA9IDA7CisgIHNvYXAtPmNvdW50ID0gMDsKKyAgc29hcC0+bGVuZ3RoID0gMDsKKyAgc29hcC0+Y2RhdGEgPSAwOworICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIHNvYXAtPnBlZWtlZCA9IDA7CisgIHNvYXAtPmFoZWFkID0gMDsKKyAgc29hcC0+aWRudW0gPSAwOworICBzb2FwLT5sZXZlbCA9IDA7CisgIHNvYXAtPmVuZHBvaW50WzBdID0gJ1wwJzsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcC0+ZGltZS5jaHVua3NpemUgPSAwOworICBzb2FwLT5kaW1lLmJ1ZmxlbiA9IDA7CisjZW5kaWYKKyAgc29hcF9mcmVlKHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9lbmQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2NsaXN0ICpjcDsKKyAgaWYgKHNvYXBfY2hlY2tfc3RhdGUoc29hcCkpCisgICAgcmV0dXJuOworICBzb2FwX2ZyZWUoc29hcCk7CisgIHNvYXBfZGVhbGxvYyhzb2FwLCBOVUxMKTsKKyAgd2hpbGUgKHNvYXAtPmNsaXN0KQorICB7IGNwID0gc29hcC0+Y2xpc3QtPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPmNsaXN0KTsKKyAgICBzb2FwLT5jbGlzdCA9IGNwOworICB9CisgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworI2lmZGVmIFNPQVBfREVCVUcKKyAgc29hcF9jbG9zZV9sb2dmaWxlcyhzb2FwKTsKKyNlbmRpZgorI2lmZGVmIFBBTE0KKyAgcGFsbU5ldExpYkNsb3NlKCk7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZXRfbmFtZXNwYWNlcyhzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IE5hbWVzcGFjZSAqcCkKK3sgcmVnaXN0ZXIgc3RydWN0IE5hbWVzcGFjZSAqbnMgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnAsICpucSwgKm5yOworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgbGV2ZWwgPSBzb2FwLT5sZXZlbDsKKyAgc29hcC0+bmFtZXNwYWNlcyA9IHA7CisgIHNvYXAtPmxvY2FsX25hbWVzcGFjZXMgPSBOVUxMOworICBzb2FwX3NldF9sb2NhbF9uYW1lc3BhY2VzKHNvYXApOworICAvKiByZXZlcnNlIHRoZSBuYW1lc3BhY2UgbGlzdCAqLworICBucCA9IHNvYXAtPm5saXN0OworICBzb2FwLT5ubGlzdCA9IE5VTEw7CisgIGlmIChucCkKKyAgeyBucSA9IG5wLT5uZXh0OworICAgIG5wLT5uZXh0ID0gTlVMTDsKKyAgICB3aGlsZSAobnEpCisgICAgeyBuciA9IG5xLT5uZXh0OworICAgICAgbnEtPm5leHQgPSBucDsKKyAgICAgIG5wID0gbnE7CisgICAgICBucSA9IG5yOworICAgIH0KKyAgfQorICAvKiB0aGVuIHB1c2ggb24gbmV3IHN0YWNrICovCisgIHdoaWxlIChucCkKKyAgeyByZWdpc3RlciBjb25zdCBjaGFyICpzOworICAgIHNvYXAtPmxldmVsID0gbnAtPmxldmVsOyAvKiBwcmVzZXJ2ZSBlbGVtZW50IG5lc3RpbmcgbGV2ZWwgKi8KKyAgICBzID0gbnAtPm5zOworICAgIGlmICghcyAmJiBucC0+aW5kZXggPj0gMCAmJiBucykKKyAgICB7IHMgPSBuc1tucC0+aW5kZXhdLm91dDsKKyAgICAgIGlmICghcykKKyAgICAgICAgcyA9IG5zW25wLT5pbmRleF0ubnM7CisgICAgfQorICAgIGlmIChzICYmIHNvYXBfcHVzaF9uYW1lc3BhY2Uoc29hcCwgbnAtPmlkLCBzKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBucSA9IG5wOworICAgIG5wID0gbnAtPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIG5xKTsKKyAgfQorICBpZiAobnMpCisgIHsgcmVnaXN0ZXIgaW50IGk7CisgICAgZm9yIChpID0gMDsgbnNbaV0uaWQ7IGkrKykKKyAgICB7IGlmIChuc1tpXS5vdXQpCisgICAgICB7IFNPQVBfRlJFRShzb2FwLCBuc1tpXS5vdXQpOworICAgICAgICBuc1tpXS5vdXQgPSBOVUxMOworICAgICAgfQorICAgIH0KKyAgICBTT0FQX0ZSRUUoc29hcCwgbnMpOworICB9CisgIHNvYXAtPmxldmVsID0gbGV2ZWw7IC8qIHJlc3RvcmUgbGV2ZWwgKi8KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9sb2NhbF9uYW1lc3BhY2VzKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcC0+bmFtZXNwYWNlcyAmJiAhc29hcC0+bG9jYWxfbmFtZXNwYWNlcykKKyAgeyByZWdpc3RlciBjb25zdCBzdHJ1Y3QgTmFtZXNwYWNlICpuczE7CisgICAgcmVnaXN0ZXIgc3RydWN0IE5hbWVzcGFjZSAqbnMyOworICAgIHJlZ2lzdGVyIHNpemVfdCBuID0gMTsKKyAgICBmb3IgKG5zMSA9IHNvYXAtPm5hbWVzcGFjZXM7IG5zMS0+aWQ7IG5zMSsrKQorICAgICAgbisrOworICAgIG4gKj0gc2l6ZW9mKHN0cnVjdCBOYW1lc3BhY2UpOworICAgIG5zMiA9IChzdHJ1Y3QgTmFtZXNwYWNlKilTT0FQX01BTExPQyhzb2FwLCBuKTsKKyAgICBpZiAobnMyKQorICAgIHsgbWVtY3B5KG5zMiwgc29hcC0+bmFtZXNwYWNlcywgbik7CisgICAgICBpZiAobnMyWzBdLm5zKQorICAgICAgeyBpZiAoIXN0cmNtcChuczJbMF0ubnMsIHNvYXBfZW52MSkpCisgICAgICAgICAgc29hcC0+dmVyc2lvbiA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzb2FwLT52ZXJzaW9uID0gMjsKKyAgICAgIH0KKyAgICAgIHNvYXAtPmxvY2FsX25hbWVzcGFjZXMgPSBuczI7CisgICAgfQorICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY29uc3QgY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3N0cnNlYXJjaChjb25zdCBjaGFyICpiaWcsIGNvbnN0IGNoYXIgKmxpdHRsZSkKK3sgc2l6ZV90IG4gPSBzdHJsZW4obGl0dGxlKTsKKyAgY29uc3QgY2hhciAqcyA9IGJpZzsKKyAgd2hpbGUgKHMpIAorICB7IGlmICghc3RybmNtcChzLCBsaXR0bGUsIG4pICYmIChzW25dID09ICdcMCcgfHwgc1tuXSA9PSAnICcpKQorICAgICAgcmV0dXJuIHM7CisgICAgcyA9IHN0cmNocihzLCAnICcpOworICAgIGlmIChzKQorICAgICAgcysrOworICB9CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgc3RydWN0IHNvYXBfbmxpc3QgKgorc29hcF9sb29rdXBfbnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc2l6ZV90IG4pCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucDsKKyAgZm9yIChucCA9IHNvYXAtPm5saXN0OyBucDsgbnAgPSBucC0+bmV4dCkKKyAgeyBpZiAoIXN0cm5jbXAobnAtPmlkLCB0YWcsIG4pICYmICFucC0+aWRbbl0pCisgICAgICByZXR1cm4gbnA7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgc3RydWN0IHNvYXBfbmxpc3QgKgorc29hcF9wdXNoX25zKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqbnMsIHNob3J0IHV0aWxpemVkKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnA7CisgIHNpemVfdCBuLCBrOworICBpZiAoc29hcF9zdHJzZWFyY2goc29hcC0+YzE0bmV4Y2x1ZGUsIGlkKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQdXNoIG5hbWVzcGFjZSBiaW5kaW5nIChsZXZlbD0ldSkgJyVzJyAnJXMnXG4iLCBzb2FwLT5sZXZlbCwgaWQsIG5zP25zOiIiKSk7CisgIGlmICghdXRpbGl6ZWQpCisgIHsgZm9yIChucCA9IHNvYXAtPm5saXN0OyBucDsgbnAgPSBucC0+bmV4dCkKKyAgICB7IGlmICghc3RyY21wKG5wLT5pZCwgaWQpICYmICghbnAtPm5zIHx8ICFzdHJjbXAobnAtPm5zLCBucykpKQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKG5wKQorICAgIHsgaWYgKG5wLT5pbmRleCA9PSAxKQorICAgICAgICB1dGlsaXplZCA9IG5wLT5pbmRleDsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9CisgIG4gPSBzdHJsZW4oaWQpOworICBpZiAobnMpCisgICAgayA9IHN0cmxlbihucyk7CisgIGVsc2UKKyAgICBrID0gMDsKKyAgbnAgPSAoc3RydWN0IHNvYXBfbmxpc3QqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9ubGlzdCkgKyBuICsgayArIDEpOworICBpZiAoIW5wKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgbnAtPm5leHQgPSBzb2FwLT5ubGlzdDsKKyAgc29hcC0+bmxpc3QgPSBucDsKKyAgc3RyY3B5KG5wLT5pZCwgaWQpOworICBpZiAobnMpCisgIHsgbnAtPm5zID0gbnAtPmlkICsgbiArIDE7CisgICAgc3RyY3B5KG5wLT5ucywgbnMpOworICB9CisgIGVsc2UKKyAgICBucC0+bnMgPSBOVUxMOworICBucC0+bGV2ZWwgPSBzb2FwLT5sZXZlbDsKKyAgbnAtPmluZGV4ID0gdXRpbGl6ZWQ7CisgIHJldHVybiBucDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyB2b2lkCitzb2FwX3V0aWxpemVfbnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc2l6ZV90IG4pCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucCA9IHNvYXBfbG9va3VwX25zKHNvYXAsIHRhZywgbik7CisgIGlmIChucCkKKyAgeyBpZiAobnAtPmluZGV4ID09IDApCisgICAgICBzb2FwX3B1c2hfbnMoc29hcCwgbnAtPmlkLCBucC0+bnMsIDEpOworICB9CisgIGVsc2UKKyAgeyBzdHJuY3B5KHNvYXAtPnRtcGJ1ZiwgdGFnLCBuKTsKKyAgICBzb2FwLT50bXBidWZbbl0gPSAnXDAnOworICAgIHNvYXBfcHVzaF9ucyhzb2FwLCBzb2FwLT50bXBidWYsIE5VTEwsIDEpOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgdm9pZAorc29hcF9wb3BfbnMoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXBfcG9wX25hbWVzcGFjZShzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgY2hhciAqdHlwZSkKK3sgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbGVtZW50IGJlZ2luIHRhZz0nJXMnIGlkPSclZCcgdHlwZT0nJXMnXG4iLCB0YWcsIGlkLCB0eXBlP3R5cGU6IiIpKTsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqZWx0ID0gKHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50Kilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQpKTsKKyAgICBpZiAoIWVsdCkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIGVsdC0+c29hcCA9IHNvYXA7CisgICAgZWx0LT5uZXh0ID0gTlVMTDsKKyAgICBlbHQtPnBybnQgPSBzb2FwLT5kb207CisgICAgZWx0LT5uYW1lID0gc29hcF9zdHJkdXAoc29hcCwgdGFnKTsKKyAgICBlbHQtPmVsdHMgPSBOVUxMOworICAgIGVsdC0+YXR0cyA9IE5VTEw7CisgICAgZWx0LT5uc3RyID0gTlVMTDsKKyAgICBlbHQtPmRhdGEgPSBOVUxMOworICAgIGVsdC0+d2lkZSA9IE5VTEw7CisgICAgZWx0LT5ub2RlID0gTlVMTDsKKyAgICBlbHQtPnR5cGUgPSAwOworICAgIGVsdC0+aGVhZCA9IE5VTEw7CisgICAgZWx0LT50YWlsID0gTlVMTDsKKyAgICBpZiAoc29hcC0+ZG9tKQorICAgIHsgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKnAgPSBzb2FwLT5kb20tPmVsdHM7CisgICAgICBpZiAocCkKKyAgICAgIHsgd2hpbGUgKHAtPm5leHQpCisgICAgICAgICAgcCA9IHAtPm5leHQ7CisgICAgICAgIHAtPm5leHQgPSBlbHQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHNvYXAtPmRvbS0+ZWx0cyA9IGVsdDsKKyAgICB9CisgICAgc29hcC0+ZG9tID0gZWx0OworICB9CisgIGVsc2UKKyAgeworI2VuZGlmCisgICAgc29hcC0+bGV2ZWwrKzsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKCFzb2FwLT5ucykKKyAgICB7IGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgICAgICAgJiYgc29hcF9zZW5kKHNvYXAsIHNvYXAtPnByb2xvZyA/IHNvYXAtPnByb2xvZyA6ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiIpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIGVsc2UgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9JTkRFTlQpCisgICAgeyBpZiAoc29hcC0+bnMgPT0gMSAmJiBzb2FwX3NlbmRfcmF3KHNvYXAsIHNvYXBfaW5kZW50LCBzb2FwLT5sZXZlbCA8IHNpemVvZihzb2FwX2luZGVudCkgPyBzb2FwLT5sZXZlbCA6IHNpemVvZihzb2FwX2luZGVudCkgLSAxKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgc29hcC0+Ym9keSA9IDE7CisgICAgfQorI2VuZGlmCisgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgIjwiLCAxKQorICAgICB8fCBzb2FwX3NlbmQoc29hcCwgdGFnKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZmRlZiBXSVRIX0RPTQorICB9CisjZW5kaWYKKyAgaWYgKCFzb2FwLT5ucykKKyAgeyBzdHJ1Y3QgTmFtZXNwYWNlICpuczsKKyAgICBmb3IgKG5zID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlczsgbnMgJiYgbnMtPmlkOyBucysrKQorICAgIHsgaWYgKCpucy0+aWQgJiYgKG5zLT5vdXQgfHwgbnMtPm5zKSkKKyAgICAgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJ4bWxuczolcyIsIG5zLT5pZCk7CisgICAgICAgIGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCBzb2FwLT50bXBidWYsIG5zLT5vdXQgPyBucy0+b3V0IDogbnMtPm5zKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB9CisgICAgfSAgIAorICB9CisgIHNvYXAtPm5zID0gMTsgLyogc3RhcnQgd2l0aCAwIG9yIDIsIGJ1dCBzaG91bGQgYmUgb25lIHRvIGNvbnRpbnVlICovCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgeyBjb25zdCBjaGFyICpzID0gc3RyY2hyKHRhZywgJzonKTsKKyAgICBpZiAocykKKyAgICAgIHNvYXBfdXRpbGl6ZV9ucyhzb2FwLCB0YWcsIHMgLSB0YWcpOworICB9CisjZW5kaWYKKyAgaWYgKGlkID4gMCkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIl8lZCIsIGlkKTsKKyAgICBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgImlkIiwgc29hcC0+dG1wYnVmKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAodHlwZSAmJiAqdHlwZSkKKyAgeyBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgInhzaTp0eXBlIiwgdHlwZSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICAgIHsgY29uc3QgY2hhciAqcyA9IHN0cmNocih0eXBlLCAnOicpOworICAgICAgaWYgKHMpCisgICAgICAgIHNvYXBfdXRpbGl6ZV9ucyhzb2FwLCB0eXBlLCBzIC0gdHlwZSk7CisgICAgfQorI2VuZGlmCisgIH0KKyAgaWYgKHNvYXAtPm51bGwgJiYgc29hcC0+cG9zaXRpb24gPiAwKQorICB7IGludCBpOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiWyVkIiwgc29hcC0+cG9zaXRpb25zWzBdKTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgc29hcC0+cG9zaXRpb247IGkrKykKKyAgICAgIHNwcmludGYoc29hcC0+dG1wYnVmICsgc3RybGVuKHNvYXAtPnRtcGJ1ZiksICIsJWQiLCBzb2FwLT5wb3NpdGlvbnNbaV0pOworICAgIHN0cmNhdChzb2FwLT50bXBidWYsICJdIik7CisgICAgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJTT0FQLUVOQzpwb3NpdGlvbiIsIHNvYXAtPnRtcGJ1ZikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHNvYXAtPm11c3RVbmRlcnN0YW5kKQorICB7IGlmIChzb2FwLT5hY3RvciAmJiAqc29hcC0+YWN0b3IpCisgICAgeyBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgc29hcC0+dmVyc2lvbiA9PSAyID8gIlNPQVAtRU5WOnJvbGUiIDogIlNPQVAtRU5WOmFjdG9yIiwgc29hcC0+YWN0b3IpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAiU09BUC1FTlY6bXVzdFVuZGVyc3RhbmQiLCBzb2FwLT52ZXJzaW9uID09IDIgPyAidHJ1ZSIgOiAiMSIpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIHNvYXAtPm11c3RVbmRlcnN0YW5kID0gMDsKKyAgfQorICBpZiAoc29hcC0+ZW5jb2RpbmcpCisgIHsgaWYgKHNvYXAtPmVuY29kaW5nU3R5bGUgJiYgc29hcC0+bG9jYWxfbmFtZXNwYWNlcykKKyAgICB7IGlmICghKnNvYXAtPmVuY29kaW5nU3R5bGUpCisgICAgICB7IGlmIChzb2FwLT5sb2NhbF9uYW1lc3BhY2VzWzFdLm91dCkKKyAgICAgICAgICBzb2FwLT5lbmNvZGluZ1N0eWxlID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlc1sxXS5vdXQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzb2FwLT5lbmNvZGluZ1N0eWxlID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlc1sxXS5uczsKKyAgICAgIH0KKyAgICAgIGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAiU09BUC1FTlY6ZW5jb2RpbmdTdHlsZSIsIHNvYXAtPmVuY29kaW5nU3R5bGUpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIHNvYXAtPmVuY29kaW5nID0gMDsKKyAgfQorICBzb2FwLT5udWxsID0gMDsKKyAgc29hcC0+cG9zaXRpb24gPSAwOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X2JlZ2luX291dChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnR5cGUpCit7IGlmICgqdGFnID09ICctJykKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgaWYgKHNvYXBfZWxlbWVudChzb2FwLCB0YWcsIGlkLCB0eXBlKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzb2FwLCBOVUxMKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKKyNpZm5kZWYgSEFWRV9TVFJSQ0hSCitTT0FQX0ZNQUMxCitjaGFyKgorU09BUF9GTUFDMgorc29hcF9zdHJyY2hyKGNvbnN0IGNoYXIgKnMsIGludCB0KQoreyByZWdpc3RlciBjaGFyICpyID0gTlVMTDsKKyAgd2hpbGUgKCpzKQorICAgIGlmICgqcysrID09IHQpCisgICAgICByID0gKGNoYXIqKXMgLSAxOworICByZXR1cm4gcjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorI2lmbmRlZiBIQVZFX1NUUlRPTAorU09BUF9GTUFDMQorbG9uZworU09BUF9GTUFDMgorc29hcF9zdHJ0b2woY29uc3QgY2hhciAqcywgY2hhciAqKnQsIGludCBiKQoreyByZWdpc3RlciBsb25nIG4gPSAwOworICByZWdpc3RlciBpbnQgYzsKKyAgd2hpbGUgKCpzID4gMCAmJiAqcyA8PSAzMikKKyAgICBzKys7CisgIGlmIChiID09IDEwKQorICB7IHNob3J0IG5lZyA9IDA7CisgICAgaWYgKCpzID09ICctJykKKyAgICB7IHMrKzsKKyAgICAgIG5lZyA9IDE7CisgICAgfQorICAgIGVsc2UgaWYgKCpzID09ICcrJykKKyAgICAgIHMrKzsKKyAgICB3aGlsZSAoKGMgPSAqcykgJiYgYyA+PSAnMCcgJiYgYyA8PSAnOScpCisgICAgeyBpZiAobiA+PSAyMTQ3NDgzNjQgJiYgKG4gPiAyMTQ3NDgzNjQgfHwgYyA+PSAnOCcpKQorICAgICAgICBicmVhazsKKyAgICAgIG4gKj0gMTA7CisgICAgICBuICs9IGMgLSAnMCc7CisgICAgICBzKys7CisgICAgfQorICAgIGlmIChuZWcpCisgICAgICBuID0gLW47CisgIH0KKyAgZWxzZSAvKiBiID09IDE2IGFuZCB2YWx1ZSBpcyBhbHdheXMgcG9zaXRpdmUgKi8KKyAgeyB3aGlsZSAoKGMgPSAqcykpCisgICAgeyBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCisgICAgICAgIGMgLT0gJzAnOworICAgICAgZWxzZSBpZiAoYyA+PSAnQScgJiYgYyA8PSAnRicpCisgICAgICAgIGMgLT0gJ0EnIC0gMTA7CisgICAgICBlbHNlIGlmIChjID49ICdhJyAmJiBjIDw9ICdmJykKKyAgICAgICAgYyAtPSAnYScgLSAxMDsKKyAgICAgIGlmIChuID4gMHgwN0ZGRkZGRikKKyAgICAgICAgYnJlYWs7CisgICAgICBuIDw8PSA0OworICAgICAgbiArPSBjOworICAgICAgcysrOworICAgIH0KKyAgfQorICBpZiAodCkKKyAgICAqdCA9IChjaGFyKilzOworICByZXR1cm4gbjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorI2lmbmRlZiBIQVZFX1NUUlRPVUwKK1NPQVBfRk1BQzEKK3Vuc2lnbmVkIGxvbmcKK1NPQVBfRk1BQzIKK3NvYXBfc3RydG91bChjb25zdCBjaGFyICpzLCBjaGFyICoqdCwgaW50IGIpCit7IHVuc2lnbmVkIGxvbmcgbiA9IDA7CisgIHJlZ2lzdGVyIGludCBjOworICB3aGlsZSAoKnMgPiAwICYmICpzIDw9IDMyKQorICAgIHMrKzsKKyAgaWYgKGIgPT0gMTApCisgIHsgaWYgKCpzID09ICcrJykKKyAgICAgIHMrKzsKKyAgICB3aGlsZSAoKGMgPSAqcykgJiYgYyA+PSAnMCcgJiYgYyA8PSAnOScpCisgICAgeyBpZiAobiA+PSA0Mjk0OTY3MjkgJiYgKG4gPiA0Mjk0OTY3MjkgfHwgYyA+PSAnNicpKQorICAgICAgICBicmVhazsKKyAgICAgIG4gKj0gMTA7CisgICAgICBuICs9IGMgLSAnMCc7CisgICAgICBzKys7CisgICAgfQorICB9CisgIGVsc2UgLyogYiA9PSAxNiAqLworICB7IHdoaWxlICgoYyA9ICpzKSkKKyAgICB7IGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKKyAgICAgICAgYyAtPSAnMCc7CisgICAgICBlbHNlIGlmIChjID49ICdBJyAmJiBjIDw9ICdGJykKKyAgICAgICAgYyAtPSAnQScgLSAxMDsKKyAgICAgIGVsc2UgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQorICAgICAgICBjIC09ICdhJyAtIDEwOworICAgICAgaWYgKG4gPiAweDBGRkZGRkZGKQorICAgICAgICBicmVhazsKKyAgICAgIG4gPDw9IDQ7CisgICAgICBuICs9IGM7CisgICAgICBzKys7CisgICAgfQorICB9CisgIGlmICh0KQorICAgICp0ID0gKGNoYXIqKXM7CisgIHJldHVybiBuOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYXJyYXlfYmVnaW5fb3V0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqb2Zmc2V0KQoreyBpZiAoc29hcF9lbGVtZW50KHNvYXAsIHRhZywgaWQsICJTT0FQLUVOQzpBcnJheSIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgeyBjb25zdCBjaGFyICpzOworICAgIHMgPSBzb2FwX3N0cnJjaHIodHlwZSwgJ1snKTsKKyAgICBpZiAoKHNpemVfdCkocyAtIHR5cGUpIDwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZikpCisgICAgeyBzdHJuY3B5KHNvYXAtPnRtcGJ1ZiwgdHlwZSwgcyAtIHR5cGUpOworICAgICAgc29hcC0+dG1wYnVmW3MgLSB0eXBlXSA9ICdcMCc7CisgICAgICBpZiAodHlwZSAmJiAqdHlwZSAmJiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgIlNPQVAtRU5DOml0ZW1UeXBlIiwgc29hcC0+dG1wYnVmKSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIGlmIChzICYmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAiU09BUC1FTkM6YXJyYXlTaXplIiwgcyArIDEpKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgfQorICBlbHNlCisgIHsgaWYgKG9mZnNldCAmJiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgIlNPQVAtRU5DOm9mZnNldCIsIG9mZnNldCkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmICh0eXBlICYmICp0eXBlICYmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAiU09BUC1FTkM6YXJyYXlUeXBlIiwgdHlwZSkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAodHlwZSAmJiAqdHlwZSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkpCisgIHsgY29uc3QgY2hhciAqcyA9IHN0cmNocih0eXBlLCAnOicpOworICAgIGlmIChzKQorICAgICAgc29hcF91dGlsaXplX25zKHNvYXAsIHR5cGUsIHMgLSB0eXBlKTsKKyAgfQorI2VuZGlmCisgIHJldHVybiBzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzb2FwLCBOVUxMKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X3N0YXJ0X2VuZF9vdXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZykKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfYXR0cmlidXRlICp0cDsKKyNpZmRlZiBXSVRIX0RPTQorICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICoqYXR0OworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBhdHQgPSAmc29hcC0+ZG9tLT5hdHRzOworICAgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgICB7IGlmICh0cC0+dmlzaWJsZSkKKyAgICAgIHsgKmF0dCA9IChzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSkpOworCWlmICghKmF0dCkKKwkgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworCSgqYXR0KS0+bmV4dCA9IE5VTEw7CisgICAgICAgICgqYXR0KS0+bnN0ciA9IE5VTEw7CisgICAgICAgICgqYXR0KS0+bmFtZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHRwLT5uYW1lKTsKKyAgICAgICAgKCphdHQpLT5kYXRhID0gc29hcF9zdHJkdXAoc29hcCwgdHAtPnZhbHVlKTsKKyAgICAgICAgKCphdHQpLT53aWRlID0gTlVMTDsKKyAgICAgICAgKCphdHQpLT5zb2FwID0gc29hcDsKKyAgICAgICAgdHAtPnZpc2libGUgPSAwOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgeyBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnA7CisgICAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICAgIHsgaWYgKHRwLT52aXNpYmxlICYmIHRwLT5uYW1lKQorICAgICAgeyBjb25zdCBjaGFyICpzID0gc3RyY2hyKHRwLT5uYW1lLCAnOicpOworICAgICAgICBpZiAocykKKyAgICAgICAgICBzb2FwX3V0aWxpemVfbnMoc29hcCwgdHAtPm5hbWUsIHMgLSB0cC0+bmFtZSk7CisgICAgICB9CisgICAgfQorICAgIGZvciAobnAgPSBzb2FwLT5ubGlzdDsgbnA7IG5wID0gbnAtPm5leHQpCisgICAgeyBpZiAobnAtPmluZGV4ID09IDEgJiYgbnAtPm5zKQorICAgICAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgInhtbG5zOiVzIiwgbnAtPmlkKTsKKyAgICAgICAgc29hcF9zZXRfYXR0cihzb2FwLCBzb2FwLT50bXBidWYsIG5wLT5ucyk7CisgICAgICAgIG5wLT5pbmRleCA9IDI7CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYKKyAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICB7IGlmICh0cC0+dmlzaWJsZSkKKyAgICB7IGlmIChzb2FwX3NlbmQoc29hcCwgIiAiKSB8fCBzb2FwX3NlbmQoc29hcCwgdHAtPm5hbWUpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBpZiAodHAtPnZpc2libGUgPT0gMiAmJiB0cC0+dmFsdWUpCisgICAgICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsICI9XCIiLCAyKQorCSB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgdHAtPnZhbHVlLCAxKQorCSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICJcIiIsIDEpKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHRwLT52aXNpYmxlID0gMDsKKyAgICB9CisgIH0KKyAgaWYgKHRhZykKKyAgeyAKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAiPiIsIDEpCisgICAgICAgfHwgc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICBzb2FwLT5sZXZlbC0tOwkvKiBkZWNyZW1lbnQgbGV2ZWwganVzdCBiZWZvcmUgLz4gKi8KKyAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAiLz4iLCAyKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCAiPiIsIDEpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfZW5kX291dChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnKQoreyBpZiAoKnRhZyA9PSAnLScpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRWxlbWVudCBlbmRpbmcgdGFnPSclcydcbiIsIHRhZykpOworI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IGlmIChzb2FwLT5kb20tPnBybnQpCisgICAgICBzb2FwLT5kb20gPSBzb2FwLT5kb20tPnBybnQ7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgICAgc29hcF9wb3BfbnMoc29hcCk7CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfSU5ERU5UKQorICB7IGlmICghc29hcC0+Ym9keSkKKyAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHNvYXBfaW5kZW50LCBzb2FwLT5sZXZlbCA8IHNpemVvZihzb2FwX2luZGVudCkgPyBzb2FwLT5sZXZlbCA6IHNpemVvZihzb2FwX2luZGVudCkgLSAxKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBzb2FwLT5ib2R5ID0gMDsKKyAgfQorI2VuZGlmCisgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsICI8LyIsIDIpCisgICB8fCBzb2FwX3NlbmQoc29hcCwgdGFnKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHNvYXAtPmxldmVsLS07CS8qIGRlY3JlbWVudCBsZXZlbCBqdXN0IGJlZm9yZSA+ICovCisgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsICI+IiwgMSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9yZWYoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBpbnQgaHJlZikKK3sgcmVnaXN0ZXIgaW50IG4gPSAwOworICBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICAgIG4gPSAxOworICBzcHJpbnRmKHNvYXAtPmhyZWYsICIjXyVkIiwgaHJlZik7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfaHJlZihzb2FwLCB0YWcsIGlkLCAiaHJlZiIgKyBuLCBzb2FwLT5ocmVmICsgbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9ocmVmKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgY2hhciAqcmVmLCBjb25zdCBjaGFyICp2YWwpCit7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRWxlbWVudCAnJXMnIHJlZmVyZW5jZSAlcz0nJXMnXG4iLCB0YWcsIHJlZiwgdmFsKSk7CisgIGlmIChzb2FwX2VsZW1lbnQoc29hcCwgdGFnLCBpZCwgTlVMTCkKKyAgIHx8IHNvYXBfYXR0cmlidXRlKHNvYXAsIHJlZiwgdmFsKQorICAgfHwgc29hcF9lbGVtZW50X3N0YXJ0X2VuZF9vdXQoc29hcCwgdGFnKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfbnVsbChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnR5cGUpCit7IHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqdHA7CisgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgICBpZiAodHAtPnZpc2libGUpCisgICAgICBicmVhazsKKyAgaWYgKHRwIHx8IChzb2FwLT52ZXJzaW9uID09IDIgJiYgc29hcC0+cG9zaXRpb24gPiAwKSB8fCBpZCA+IDAgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9OSUwpKQorICB7IGlmIChzb2FwX2VsZW1lbnQoc29hcCwgdGFnLCBpZCwgdHlwZSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHNvYXAtPnBhcnQgIT0gU09BUF9JTl9IRUFERVIgJiYgc29hcC0+ZW5jb2RpbmdTdHlsZSkKKyAgICAgIGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAieHNpOm5pbCIsICJ0cnVlIikpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICByZXR1cm4gc29hcF9lbGVtZW50X3N0YXJ0X2VuZF9vdXQoc29hcCwgdGFnKTsKKyAgfQorICBzb2FwLT5udWxsID0gMTsKKyAgc29hcC0+cG9zaXRpb24gPSAwOworICBzb2FwLT5tdXN0VW5kZXJzdGFuZCA9IDA7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfaWQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KSAKK3sgaWYgKCFwIHx8IChhICYmICFhLT5fX3B0cikpCisgIHsgc29hcF9lbGVtZW50X251bGwoc29hcCwgdGFnLCBpZCwgdHlwZSk7CisgICAgcmV0dXJuIC0xOworICB9CisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1RSRUUpCisgICAgcmV0dXJuIDA7CisgIGlmIChpZCA8IDApCisgIHsgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICAgIGlmIChhKQorICAgICAgaWQgPSBzb2FwX2FycmF5X3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIGEsIG4sIHQsICZwcCk7CisgICAgZWxzZQorICAgICAgaWQgPSBzb2FwX3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIHQsICZwcCk7CisgICAgaWYgKGlkKQorICAgIHsgaWYgKHNvYXBfaXNfZW1iZWRkZWQoc29hcCwgcHApKQorICAgICAgeyBzb2FwX2VsZW1lbnRfcmVmKHNvYXAsIHRhZywgMCwgaWQpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBpZiAoc29hcF9pc19zaW5nbGUoc29hcCwgcHApKQorICAgICAgICByZXR1cm4gMDsKKyAgICAgIHNvYXBfc2V0X2VtYmVkZGVkKHNvYXAsIHBwKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGlkOworI2Vsc2UKKyAgcmV0dXJuIDA7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X3Jlc3VsdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnKQoreyBpZiAoc29hcC0+dmVyc2lvbiA9PSAyICYmIHNvYXAtPmVuY29kaW5nU3R5bGUpCisgICAgaWYgKHNvYXBfZWxlbWVudChzb2FwLCAiU09BUC1SUEM6cmVzdWx0IiwgMCwgTlVMTCkKKyAgICAgfHwgc29hcF9hdHRyaWJ1dGUoc29hcCwgInhtbG5zOlNPQVAtUlBDIiwgc29hcF9ycGMpCisgICAgIHx8IHNvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHNvYXAsIE5VTEwpCisgICAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCB0YWcsIDApCisgICAgIHx8IHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsICJTT0FQLVJQQzpyZXN1bHQiKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYXR0cmlidXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sgCisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAqYSA9IChzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSkpOworICAgIGEtPm5leHQgPSBzb2FwLT5kb20tPmF0dHM7CisgICAgYS0+bnN0ciA9IE5VTEw7CisgICAgYS0+bmFtZSA9IHNvYXBfc3RyZHVwKHNvYXAsIG5hbWUpOworICAgIGEtPmRhdGEgPSBzb2FwX3N0cmR1cChzb2FwLCB2YWx1ZSk7CisgICAgYS0+d2lkZSA9IE5VTEw7CisgICAgYS0+c29hcCA9IHNvYXA7CisgICAgc29hcC0+ZG9tLT5hdHRzID0gYTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgeyAvKiBUT0RPOiBjb25zaWRlciB1c2luZyB0aGlzIGNvZGUgdG8gaGFuZGxlIGRlZmF1bHQgbmFtZXNwYWNlCisgICAgaWYgKCFzdHJuY21wKG5hbWUsICJ4bWxucyIsIDUpICYmIChuYW1lWzVdID09ICc6JyB8fCBuYW1lWzVdID09ICdcMCcpKQorICAgIHsgaWYgKG5hbWVbNV0gPT0gJzonKQorICAgICAgICBzb2FwX3B1c2hfbnMoc29hcCwgbmFtZSArIDYsIHZhbHVlLCAwKTsKKyAgICAgIGVsc2UKKyAgICAgICAgc29hcF9wdXNoX25zKHNvYXAsICIiLCB2YWx1ZSwgMCk7CisgICAgfQorICAgICovCisgICAgaWYgKCFzdHJuY21wKG5hbWUsICJ4bWxuczoiLCA2KSkKKyAgICAgIHNvYXBfcHVzaF9ucyhzb2FwLCBuYW1lICsgNiwgdmFsdWUsIDApOworICAgIGVsc2UgaWYgKHNvYXBfc2V0X2F0dHIoc29hcCwgbmFtZSwgdmFsdWUpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGVsc2UKKyNlbmRpZgorICB7IGlmIChzb2FwX3NlbmQoc29hcCwgIiAiKSB8fCBzb2FwX3NlbmQoc29hcCwgbmFtZSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHZhbHVlKQorICAgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgIj1cIiIsIDIpCisgICAgICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHZhbHVlLCAxKQorICAgICAgIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIlwiIiwgMSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X2JlZ2luX2luKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBuaWxsYWJsZSkKK3sgaWYgKCFzb2FwX3BlZWtfZWxlbWVudChzb2FwKSkKKyAgeyBpZiAoc29hcC0+b3RoZXIpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1RBR19NSVNNQVRDSDsKKyAgICBpZiAodGFnICYmICp0YWcgPT0gJy0nKQorICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgaWYgKCEoc29hcC0+ZXJyb3IgPSBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50YWcsIHRhZykpKQorICAgIHsgc29hcC0+cGVla2VkID0gMDsKKyAgICAgIGlmIChzb2FwLT5ib2R5KQorICAgICAgICBzb2FwLT5sZXZlbCsrOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJCZWdpbiBlbGVtZW50IGZvdW5kIChsZXZlbD0ldSkgJyVzJz0nJXMnXG4iLCBzb2FwLT5sZXZlbCwgc29hcC0+dGFnLCB0YWc/dGFnOiIiICkpOworICAgICAgaWYgKCFuaWxsYWJsZSAmJiBzb2FwLT5udWxsICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9OVUxMOworICAgIH0KKyAgfQorICBlbHNlIGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRyAmJiB0YWcgJiYgKnRhZyA9PSAnLScpCisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9lbmRfaW4oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZykgIAoreyByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIHJlZ2lzdGVyIGNoYXIgKnM7CisgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnQ7CisgIHJlZ2lzdGVyIGludCBuID0gMDsKKyAgaWYgKHRhZyAmJiAqdGFnID09ICctJykKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgc29hcC0+bGV2ZWwtLTsKKyAgc29hcF9wb3BfbmFtZXNwYWNlKHNvYXApOworI2lmZGVmIFdJVEhfRE9NCisgIC8qIHRoaXMgd2hpdGVzcGFjZSBvciBtaXhlZCBjb250ZW50IGlzIG5vdCBpbnNpZ25pZmljYW50IGZvciBET00gKi8KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgaWYgKCFzb2FwLT5wZWVrZWQgJiYgIXNvYXBfc3RyaW5nX2luKHNvYXAsIDMsIC0xLCAtMSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHNvYXAtPmRvbS0+cHJudCkKKyAgICAgIHNvYXAtPmRvbSA9IHNvYXAtPmRvbS0+cHJudDsKKyAgfQorI2VuZGlmCisgIGlmIChzb2FwLT5wZWVrZWQpCisgIHsgaWYgKHNvYXAtPmVycm9yID09IFNPQVBfTk9fVEFHKQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICAgIGlmICgqc29hcC0+dGFnKQorICAgICAgbisrOworICAgIHNvYXAtPnBlZWtlZCA9IDA7CisgIH0KKyAgZG8KKyAgeyB3aGlsZSAoKChjID0gc29hcF9nZXQoc29hcCkpICE9IFNPQVBfVFQpKQorICAgIHsgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgICAgaWYgKGMgPT0gU09BUF9MVCkKKyAgICAgICAgbisrOworICAgICAgZWxzZSBpZiAoYyA9PSAnLycpCisgICAgICB7IGMgPSBzb2FwX2dldChzb2FwKTsKKyAgICAgICAgaWYgKGMgPT0gU09BUF9HVCkKKwkgIG4tLTsKKyAgICAgICAgZWxzZQorCSAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgIH0KKyAgICB9CisgIH0gd2hpbGUgKG4tLSk7CisgIHMgPSBzb2FwLT50YWc7CisgIHdoaWxlIChzb2FwX25vdGJsYW5rKGMgPSBzb2FwX2dldChzb2FwKSkpCisgICAgKnMrKyA9IChjaGFyKWM7CisgICpzID0gJ1wwJzsKKyAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIHdoaWxlIChzb2FwX2JsYW5rKGMpKQorICAgIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgaWYgKGMgIT0gU09BUF9HVCkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1NZTlRBWF9FUlJPUjsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgZWxlbWVudCBmb3VuZCAobGV2ZWw9JXUpICclcyc9JyVzJ1xuIiwgc29hcC0+bGV2ZWwsIHNvYXAtPnRhZywgdGFnP3RhZzoiIikpOworICBpZiAoIXRhZyB8fCAhKnRhZykKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgaWYgKChzID0gc3RyY2hyKHNvYXAtPnRhZywgJzonKSkpCisgICAgcysrOworICBlbHNlCisgICAgcyA9IHNvYXAtPnRhZzsKKyAgaWYgKCh0ID0gc3RyY2hyKHRhZywgJzonKSkpCisgICAgdCsrOworICBlbHNlCisgICAgdCA9IHRhZzsKKyAgaWYgKCFTT0FQX1NUUkNNUChzLCB0KSkKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgZWxlbWVudCB0YWcgbmFtZSBkb2VzIG5vdCBtYXRjaFxuIikpOworICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1NZTlRBWF9FUlJPUjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIgKgorU09BUF9GTUFDMgorc29hcF9hdHRyX3ZhbHVlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgZmxhZykKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfYXR0cmlidXRlICp0cDsKKyAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICAgIGlmICghc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsIG5hbWUpKQorICAgICAgYnJlYWs7CisgIGlmICh0cCAmJiB0cC0+dmlzaWJsZSA9PSAyKQorICB7IGlmIChmbGFnID09IDIgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1BST0hJQklURUQ7CisgICAgZWxzZQorICAgICAgcmV0dXJuIHRwLT52YWx1ZTsKKyAgfQorICBlbHNlIGlmIChmbGFnID09IDEgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKQorICAgIHNvYXAtPmVycm9yID0gU09BUF9SRVFVSVJFRDsKKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2F0dHIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKnRwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNldCBhdHRyaWJ1dGUgJXM9JyVzJ1xuIiwgbmFtZSwgdmFsdWU/dmFsdWU6IiIpKTsKKyAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICB7IGlmICghc3RyY21wKHRwLT5uYW1lLCBuYW1lKSkKKyAgICAgIGJyZWFrOworICB9CisgIGlmICghdHApCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJBbGxvY2F0ZSBhdHRyaWJ1dGUgJXNcbiIsIG5hbWUpKTsKKyAgICBpZiAoISh0cCA9IChzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUpICsgc3RybGVuKG5hbWUpKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICB0cC0+bnMgPSBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgICB7IHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqKnRwcCA9ICZzb2FwLT5hdHRyaWJ1dGVzOworICAgICAgY29uc3QgY2hhciAqcyA9IHN0cmNocihuYW1lLCAnOicpOworICAgICAgaWYgKCFzdHJuY21wKG5hbWUsICJ4bWxucyIsIDUpKQorICAgICAgeyBmb3IgKDsgKnRwcDsgdHBwID0gJigqdHBwKS0+bmV4dCkKKyAgICAgICAgICBpZiAoc3RybmNtcCgoKnRwcCktPm5hbWUsICJ4bWxucyIsIDUpIHx8IHN0cmNtcCgoKnRwcCktPm5hbWUgKyA1LCBuYW1lICsgNSkgPiAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlbHNlIGlmICghcykKKyAgICAgIHsgZm9yICg7ICp0cHA7IHRwcCA9ICYoKnRwcCktPm5leHQpCisgICAgICAgICAgaWYgKHN0cm5jbXAoKCp0cHApLT5uYW1lLCAieG1sbnMiLCA1KSAmJiAoKCp0cHApLT5ucyB8fCBzdHJjbXAoKCp0cHApLT5uYW1lLCBuYW1lKSA+IDApKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IGludCBrOworICAgICAgICBmb3IgKDsgKnRwcDsgdHBwID0gJigqdHBwKS0+bmV4dCkKKwl7IGlmICghc3RybmNtcCgoKnRwcCktPm5hbWUsICJ4bWxuczoiLCA2KSAmJiAhc3RybmNtcCgoKnRwcCktPm5hbWUgKyA2LCBuYW1lLCBzIC0gbmFtZSkgJiYgISgqdHBwKS0+bmFtZVs2ICsgcyAtIG5hbWVdKQorCSAgeyBpZiAoIXRwLT5ucykKKyAgICAgICAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDYW5vbmljYWxpemF0aW9uOiBwcmVmaXggJXM9JXAoJXMpXG4iLCBuYW1lLCAoKnRwcCktPm5zLCAoKnRwcCktPm5zKSk7CisJICAgICAgdHAtPm5zID0gKCp0cHApLT5uczsKKwkgICAgfQorCSAgfQorICAgICAgICAgIGVsc2UgaWYgKHN0cm5jbXAoKCp0cHApLT5uYW1lLCAieG1sbnMiLCA1KSAmJiAoKnRwcCktPm5zICYmIHRwLT5ucyAmJiAoKGsgPSBzdHJjbXAoKCp0cHApLT5ucywgdHAtPm5zKSkgPiAwIHx8ICghayAmJiBzdHJjbXAoKCp0cHApLT5uYW1lLCBuYW1lKSA+IDApKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICB0cC0+bmV4dCA9ICp0cHA7CisgICAgICAqdHBwID0gdHA7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHsgdHAtPm5leHQgPSBzb2FwLT5hdHRyaWJ1dGVzOworICAgICAgc29hcC0+YXR0cmlidXRlcyA9IHRwOworICAgIH0KKyAgICBzdHJjcHkodHAtPm5hbWUsIG5hbWUpOworICAgIHRwLT52YWx1ZSA9IE5VTEw7CisgIH0KKyAgZWxzZSBpZiAodHAtPnZpc2libGUpCisgIHsgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgZWxzZSBpZiAodmFsdWUgJiYgdHAtPnZhbHVlICYmIHRwLT5zaXplIDw9IHN0cmxlbih2YWx1ZSkpCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIGF0dHJpYnV0ZSB2YWx1ZSBvZiAlcyAoZnJlZSAlcClcbiIsIG5hbWUsIHRwLT52YWx1ZSkpOworICAgIFNPQVBfRlJFRShzb2FwLCB0cC0+dmFsdWUpOworICAgIHRwLT52YWx1ZSA9IE5VTEw7CisgICAgdHAtPm5zID0gTlVMTDsKKyAgfQorICBpZiAodmFsdWUpCisgIHsgaWYgKCF0cC0+dmFsdWUpCisgICAgeyB0cC0+c2l6ZSA9IHN0cmxlbih2YWx1ZSkgKyAxOworICAgICAgaWYgKCEodHAtPnZhbHVlID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHRwLT5zaXplKSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJBbGxvY2F0ZSBhdHRyaWJ1dGUgdmFsdWUgb2YgJXMgKCVwKVxuIiwgdHAtPm5hbWUsIHRwLT52YWx1ZSkpOworICAgIH0KKyAgICBzdHJjcHkodHAtPnZhbHVlLCB2YWx1ZSk7CisgICAgaWYgKCFzdHJuY21wKHRwLT5uYW1lLCAieG1sbnM6IiwgNikpCisgICAgICB0cC0+bnMgPSB0cC0+dmFsdWU7CisgICAgdHAtPnZpc2libGUgPSAyOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBpZiAoIXN0cmNtcChuYW1lLCAid3N1OklkIikpCisgICAgeyBzb2FwLT5wYXJ0ID0gU09BUF9CRUdJTl9TRUNVUklUWTsKKyAgICAgIHN0cm5jcHkoc29hcC0+aWQsIHZhbHVlLCBzaXplb2Yoc29hcC0+aWQpKTsKKyAgICAgIHNvYXAtPmlkW3NpemVvZihzb2FwLT5pZCktMV0gPSAnXDAnOworICAgIH0KKyNlbmRpZgorICB9CisgIGVsc2UKKyAgICB0cC0+dmlzaWJsZSA9IDE7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9jbHJfYXR0cihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfYXR0cmlidXRlICp0cDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkpCisgIHsgd2hpbGUgKHNvYXAtPmF0dHJpYnV0ZXMpCisgICAgeyB0cCA9IHNvYXAtPmF0dHJpYnV0ZXMtPm5leHQ7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+YXR0cmlidXRlcy0+dmFsdWUpOworICAgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPmF0dHJpYnV0ZXMpOworICAgICAgc29hcC0+YXR0cmlidXRlcyA9IHRwOworICAgIH0KKyAgfQorICBlbHNlCisjZW5kaWYKKyAgeyBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgICAgICB0cC0+dmlzaWJsZSA9IDA7CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK3N0YXRpYyBpbnQKK3NvYXBfZ2V0YXR0cnZhbChzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqcywgc2l6ZV90IG4sIHNvYXBfd2NoYXIgZCkKK3sgcmVnaXN0ZXIgc2l6ZV90IGk7CisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgIHsgcmVnaXN0ZXIgc29hcF93Y2hhciBjID0gc29hcF9nZXQoc29hcCk7CisgICAgc3dpdGNoIChjKQorICAgIHsKKyAgICBjYXNlIFNPQVBfVFQ6CisgICAgICAqcysrID0gJzwnOworICAgICAgc29hcF91bmdldChzb2FwLCAnLycpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0xUOgorICAgICAgKnMrKyA9ICc8JzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9HVDoKKyAgICAgIGlmIChkID09ICcgJykKKyAgICAgIHsgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgKnMgPSAnXDAnOworICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICAgIH0KKyAgICAgICpzKysgPSAnPic7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfUVQ6CisgICAgICBpZiAoYyA9PSBkKQorICAgICAgeyAqcyA9ICdcMCc7CisgICAgICAgIHJldHVybiBTT0FQX09LOworICAgICAgfQorICAgICAgKnMrKyA9ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9BUDoKKyAgICAgIGlmIChjID09IGQpCisgICAgICB7ICpzID0gJ1wwJzsKKyAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgICB9CisgICAgICAqcysrID0gJ1wnJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1x0JzoKKyAgICBjYXNlICdcbic6CisgICAgY2FzZSAnXHInOgorICAgIGNhc2UgJyAnOgorICAgIGNhc2UgJy8nOgorICAgICAgaWYgKGQgPT0gJyAnKQorICAgICAgeyBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICAqcyA9ICdcMCc7CisgICAgICAgIHJldHVybiBTT0FQX09LOworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgICAqcysrID0gKGNoYXIpYzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBXSVRIX0ZBU1QKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc3RvcmVfbGFiKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBzaXplX3QgbikKK3sgc29hcC0+bGFiaWR4ID0gMDsKKyAgcmV0dXJuIHNvYXBfYXBwZW5kX2xhYihzb2FwLCBzLCBuKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgV0lUSF9GQVNUCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2FwcGVuZF9sYWIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBuKQoreyBpZiAoc29hcC0+bGFiaWR4ICsgbiA+PSBzb2FwLT5sYWJsZW4pCisgIHsgcmVnaXN0ZXIgY2hhciAqdCA9IHNvYXAtPmxhYmJ1ZjsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVubGFyZ2luZyBsb29rLWFzaWRlIGJ1ZmZlciB0byBhcHBlbmQgZGF0YSwgb2xkIHNpemU9JWx1IiwgKHVuc2lnbmVkIGxvbmcpc29hcC0+bGFibGVuKSk7CisgICAgaWYgKHNvYXAtPmxhYmxlbiA9PSAwKQorICAgICAgc29hcC0+bGFibGVuID0gU09BUF9MQUJMRU47CisgICAgd2hpbGUgKHNvYXAtPmxhYmlkeCArIG4gPj0gc29hcC0+bGFibGVuKQorICAgICAgc29hcC0+bGFibGVuIDw8PSAxOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiLCBuZXcgc2l6ZT0lbHVcbiIsICh1bnNpZ25lZCBsb25nKXNvYXAtPmxhYmxlbikpOworICAgIHNvYXAtPmxhYmJ1ZiA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzb2FwLT5sYWJsZW4pOworICAgIGlmICghc29hcC0+bGFiYnVmKQorICAgIHsgaWYgKHQpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCB0KTsKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIH0KKyAgICBpZiAodCkKKyAgICB7IG1lbWNweShzb2FwLT5sYWJidWYsIHQsIHNvYXAtPmxhYmlkeCk7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgdCk7CisgICAgfQorICB9CisgIGlmIChzKQorICB7IG1lbWNweShzb2FwLT5sYWJidWYgKyBzb2FwLT5sYWJpZHgsIHMsIG4pOworICAgIHNvYXAtPmxhYmlkeCArPSBuOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcGVla19lbGVtZW50KHN0cnVjdCBzb2FwICpzb2FwKQoreworI2lmZGVmIFdJVEhfRE9NCisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgKiphdHQgPSBOVUxMOworICByZWdpc3RlciBjaGFyICpsZWFkID0gTlVMTDsKKyNlbmRpZgorICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKnRwOworICBjb25zdCBjaGFyICp0OworICByZWdpc3RlciBjaGFyICpzOworICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIHJlZ2lzdGVyIGludCBpOworICBpZiAoc29hcC0+cGVla2VkKQorICB7IGlmICghKnNvYXAtPnRhZykKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTk9fVEFHOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIHNvYXAtPnBlZWtlZCA9IDE7CisgIGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisjaWZkZWYgV0lUSF9ET00KKyAgLyogd2hpdGVzcGFjZSBsZWFkaW5nIHRvIHN0YXJ0IHRhZyBpcyBub3QgaW5zaWduaWZpY2FudCBmb3IgRE9NICovCisgIGlmIChzb2FwX2JsYW5rKGMpKQorICB7IHNvYXAtPmxhYmlkeCA9IDA7CisgICAgZG8KKyAgICB7IGlmIChzb2FwX2FwcGVuZF9sYWIoc29hcCwgTlVMTCwgMCkpCisgICAgICAgIHJldHVybiBTT0FQX0VPTTsKKyAgICAgIHMgPSBzb2FwLT5sYWJidWYgKyBzb2FwLT5sYWJpZHg7CisgICAgICBpID0gc29hcC0+bGFibGVuIC0gc29hcC0+bGFiaWR4OworICAgICAgc29hcC0+bGFiaWR4ID0gc29hcC0+bGFibGVuOworICAgICAgd2hpbGUgKHNvYXBfYmxhbmsoYykgJiYgaS0tKQorICAgICAgeyAqcysrID0gYzsKKyAgICAgICAgYyA9IHNvYXBfZ2V0dXRmOChzb2FwKTsKKyAgICAgIH0KKyAgICB9CisgICAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworICAgICpzID0gJ1wwJzsKKyAgICBsZWFkID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+bGFiYnVmKTsKKyAgfQorI2Vsc2UKKyAgd2hpbGUgKHNvYXBfYmxhbmsoYykpCisgICAgYyA9IHNvYXBfZ2V0dXRmOChzb2FwKTsKKyNlbmRpZgorICBpZiAoYyAhPSBTT0FQX0xUKQorICB7ICpzb2FwLT50YWcgPSAnXDAnOworICAgIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyNpZmRlZiBXSVRIX0RPTQorICAgIC8qIHdoaXRlc3BhY2UgbGVhZGluZyB0byBlbmQgdGFnIGlzIG5vdCBpbnNpZ25pZmljYW50IGZvciBET00gKi8KKyAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgICAgIHNvYXAtPmRvbS0+dGFpbCA9IHNvYXBfc3RyZHVwKHNvYXAsIGxlYWQpOworI2VuZGlmCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9OT19UQUc7CisgIH0KKyAgcyA9IHNvYXAtPnRhZzsKKyAgZG8gYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworICBpID0gc2l6ZW9mKHNvYXAtPnRhZyk7CisgIHdoaWxlIChjICE9ICc+JyAmJiBjICE9ICcvJyAmJiBzb2FwX25vdGJsYW5rKGMpKQorICB7IGlmICgtLWkgPiAwKQorICAgICAgKnMrKyA9IChjaGFyKWM7CisgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgfQorICB3aGlsZSAoc29hcF9ibGFuayhjKSkKKyAgICBjID0gc29hcF9nZXQxKHNvYXApOworICAqcyA9ICdcMCc7CisgIHNvYXAtPmlkWzBdID0gJ1wwJzsKKyAgc29hcC0+aHJlZlswXSA9ICdcMCc7CisgIHNvYXAtPnR5cGVbMF0gPSAnXDAnOworICBzb2FwLT5hcnJheVR5cGVbMF0gPSAnXDAnOworICBzb2FwLT5hcnJheVNpemVbMF0gPSAnXDAnOworICBzb2FwLT5hcnJheU9mZnNldFswXSA9ICdcMCc7CisgIHNvYXAtPm90aGVyID0gMDsKKyAgc29hcC0+cm9vdCA9IC0xOworICBzb2FwLT5wb3NpdGlvbiA9IDA7CisgIHNvYXAtPm51bGwgPSAwOworICBzb2FwLT5tdXN0VW5kZXJzdGFuZCA9IDA7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKmVsdDsKKyAgICBlbHQgPSAoc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCkpOworICAgIGlmICghZWx0KQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgZWx0LT5uZXh0ID0gTlVMTDsKKyAgICBlbHQtPm5zdHIgPSBOVUxMOworICAgIGVsdC0+bmFtZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPnRhZyk7CisgICAgZWx0LT5wcm50ID0gc29hcC0+ZG9tOworICAgIGVsdC0+ZWx0cyA9IE5VTEw7CisgICAgZWx0LT5hdHRzID0gTlVMTDsKKyAgICBlbHQtPmRhdGEgPSBOVUxMOworICAgIGVsdC0+d2lkZSA9IE5VTEw7CisgICAgZWx0LT50eXBlID0gMDsKKyAgICBlbHQtPm5vZGUgPSBOVUxMOworICAgIGVsdC0+aGVhZCA9IGxlYWQ7CisgICAgZWx0LT50YWlsID0gTlVMTDsKKyAgICBlbHQtPnNvYXAgPSBzb2FwOworICAgIGlmIChzb2FwLT5kb20pCisgICAgeyBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqcCA9IHNvYXAtPmRvbS0+ZWx0czsKKyAgICAgIGlmIChwKQorICAgICAgeyB3aGlsZSAocC0+bmV4dCkKKyAgICAgICAgICBwID0gcC0+bmV4dDsKKyAgICAgICAgcC0+bmV4dCA9IGVsdDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgc29hcC0+ZG9tLT5lbHRzID0gZWx0OworICAgIH0KKyAgICBzb2FwLT5kb20gPSBlbHQ7CisgICAgYXR0ID0gJmVsdC0+YXR0czsKKyAgfQorI2VuZGlmCisgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgICB0cC0+dmlzaWJsZSA9IDA7CisgIHdoaWxlICgoaW50KWMgIT0gRU9GICYmIGMgIT0gJz4nICYmIGMgIT0gJy8nKQorICB7IHMgPSBzb2FwLT50bXBidWY7CisgICAgaSA9IHNpemVvZihzb2FwLT50bXBidWYpOworICAgIHdoaWxlIChjICE9ICc9JyAmJiBjICE9ICc+JyAmJiBjICE9ICcvJyAmJiBzb2FwX25vdGJsYW5rKGMpKQorICAgIHsgaWYgKC0taSA+IDApCisgICAgICAgICpzKysgPSAoY2hhciljOworICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICB9CisgICAgKnMgPSAnXDAnOworICAgIGlmIChpID09IHNpemVvZihzb2FwLT50bXBidWYpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9TWU5UQVhfRVJST1I7CisjaWZkZWYgV0lUSF9ET00KKyAgICAvKiBhZGQgYXR0cmlidXRlIG5hbWUgdG8gZG9tICovCisgICAgaWYgKGF0dCkKKyAgICB7ICphdHQgPSAoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUpKTsKKyAgICAgICBpZiAoISphdHQpCisgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgICAoKmF0dCktPm5leHQgPSBOVUxMOworICAgICAgICgqYXR0KS0+bnN0ciA9IE5VTEw7CisgICAgICAgKCphdHQpLT5uYW1lID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+dG1wYnVmKTsKKyAgICAgICAoKmF0dCktPmRhdGEgPSBOVUxMOworICAgICAgICgqYXR0KS0+d2lkZSA9IE5VTEw7CisgICAgICAgKCphdHQpLT5zb2FwID0gc29hcDsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoIXN0cm5jbXAoc29hcC0+dG1wYnVmLCAieG1sbnMiLCA1KSkKKyAgICB7IGlmIChzb2FwLT50bXBidWZbNV0gPT0gJzonKQorICAgICAgeyBzb2FwLT50bXBidWZbNV0gPSAnXDAnOworICAgICAgICB0ID0gc29hcC0+dG1wYnVmICsgNjsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHNvYXAtPnRtcGJ1Zls1XSkKKyAgICAgICAgdCA9IE5VTEw7CisgICAgICBlbHNlCisgICAgICAgIHQgPSBTT0FQX1NUUl9FT1M7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHQgPSBOVUxMOworICAgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgICB7IGlmICghU09BUF9TVFJDTVAodHAtPm5hbWUsIHNvYXAtPnRtcGJ1ZikpCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIXRwKQorICAgIHsgdHAgPSAoc3RydWN0IHNvYXBfYXR0cmlidXRlKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfYXR0cmlidXRlKSArIHN0cmxlbihzb2FwLT50bXBidWYpKTsKKyAgICAgIGlmICghdHApCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgc3RyY3B5KHRwLT5uYW1lLCBzb2FwLT50bXBidWYpOworICAgICAgdHAtPnZhbHVlID0gTlVMTDsKKyAgICAgIHRwLT5zaXplID0gMDsKKyAgICAgIHRwLT5uZXh0ID0gc29hcC0+YXR0cmlidXRlczsKKyAgICAgIHNvYXAtPmF0dHJpYnV0ZXMgPSB0cDsKKyAgICB9CisgICAgd2hpbGUgKHNvYXBfYmxhbmsoYykpCisgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworICAgIGlmIChjID09ICc9JykKKyAgICB7IGRvIGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisgICAgICB3aGlsZSAoc29hcF9ibGFuayhjKSk7CisgICAgICBpZiAoYyAhPSBTT0FQX1FUICYmIGMgIT0gU09BUF9BUCkKKyAgICAgIHsgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgYyA9ICcgJzsgLyogYmxhbmsgZGVsaW1pdGVyICovCisgICAgICB9CisgICAgICBpZiAoc29hcF9nZXRhdHRydmFsKHNvYXAsIHRwLT52YWx1ZSwgdHAtPnNpemUsIGMpKQorICAgICAgeworI2lmZGVmIFdJVEhfRkFTVAorICAgICAgICBpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9FT00pCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisJaWYgKHNvYXBfc3RvcmVfbGFiKHNvYXAsIHRwLT52YWx1ZSwgdHAtPnNpemUpKQorCSAgcmV0dXJuIHNvYXAtPmVycm9yOworCWlmICh0cC0+dmFsdWUpCisJICBTT0FQX0ZSRUUoc29hcCwgdHAtPnZhbHVlKTsKKwlmb3IgKDs7KQorCXsgaWYgKHNvYXBfZ2V0YXR0cnZhbChzb2FwLCBzb2FwLT5sYWJidWYgKyBzb2FwLT5sYWJpZHgsIHNvYXAtPmxhYmxlbiAtIHNvYXAtPmxhYmlkeCwgYykpCisJICB7IGlmIChzb2FwLT5lcnJvciAhPSBTT0FQX0VPTSkKKwkgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisJICAgIHNvYXAtPmxhYmlkeCA9IHNvYXAtPmxhYmxlbjsKKwkgICAgaWYgKHNvYXBfYXBwZW5kX2xhYihzb2FwLCBOVUxMLCAwKSkKKwkgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisJICB9CisJICBlbHNlCisJICAgIGJyZWFrOworCX0KKwlpZiAoc29hcC0+bGFiaWR4KQorICAgICAgICAgIHRwLT5zaXplID0gc29hcC0+bGFibGVuOworCWVsc2UKKwl7IHRwLT5zaXplID0gc3RybGVuKHNvYXAtPmxhYmJ1ZikgKyAxOworICAgICAgICAgIGlmICh0cC0+c2l6ZSA8IFNPQVBfTEFCTEVOKQorCSAgICB0cC0+c2l6ZSA9IFNPQVBfTEFCTEVOOworICAgICAgICB9CisJaWYgKCEodHAtPnZhbHVlID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHRwLT5zaXplKSkpCisJICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgICAgc3RyY3B5KHRwLT52YWx1ZSwgc29hcC0+bGFiYnVmKTsKKyNlbHNlCisJc2l6ZV90IG47CisgICAgICAgIGlmIChzb2FwLT5lcnJvciAhPSBTT0FQX0VPTSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgICAgICAgaWYgKHNvYXBfbmV3X2Jsb2NrKHNvYXApKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeyBpZiAoIShzID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBTT0FQX0JMS0xFTikpKQorICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICAgIGlmIChzb2FwX2dldGF0dHJ2YWwoc29hcCwgcywgU09BUF9CTEtMRU4sIGMpKQorICAgICAgICAgIHsgaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfRU9NKQorICAgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisJbiA9IHRwLT5zaXplICsgc29hcC0+Ymxpc3QtPnNpemU7CisgICAgICAgIGlmICghKHMgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgbikpKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgICBpZiAodHAtPnZhbHVlKQorICAgICAgICB7IG1lbWNweShzLCB0cC0+dmFsdWUsIHRwLT5zaXplKTsKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgdHAtPnZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBzb2FwX3NhdmVfYmxvY2soc29hcCwgcyArIHRwLT5zaXplLCAwKTsKKyAgICAgICAgdHAtPnZhbHVlID0gczsKKyAgICAgICAgdHAtPnNpemUgPSBuOworI2VuZGlmCisgICAgICB9CisgICAgICBkbyBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworICAgICAgdHAtPnZpc2libGUgPSAyOyAvKiBzZWVuIHRoaXMgYXR0cmlidXRlIHcvIHZhbHVlICovCisjaWZkZWYgV0lUSF9ET00KKyAgICAgIGlmIChhdHQpCisgICAgICAgICgqYXR0KS0+ZGF0YSA9IHNvYXBfc3RyZHVwKHNvYXAsIHRwLT52YWx1ZSk7CisjZW5kaWYKKyAgICB9CisgICAgZWxzZQorICAgICAgdHAtPnZpc2libGUgPSAxOyAvKiBzZWVuIHRoaXMgYXR0cmlidXRlIHcvbyB2YWx1ZSAqLworI2lmZGVmIFdJVEhfRE9NCisgICAgaWYgKGF0dCkKKyAgICAgIGF0dCA9ICYoKmF0dCktPm5leHQ7CisjZW5kaWYKKyAgICBpZiAodCAmJiB0cC0+dmFsdWUpCisgICAgeyBpZiAoc29hcF9wdXNoX25hbWVzcGFjZShzb2FwLCB0LCB0cC0+dmFsdWUpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB0cC0+dmlzaWJsZSA9IDA7CisgICAgfQorICB9CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKGF0dCkKKyAgeyBzb2FwLT5kb20tPm5zdHIgPSBzb2FwX2N1cnJlbnRfbmFtZXNwYWNlKHNvYXAsIHNvYXAtPnRhZyk7CisgICAgZm9yIChhdHQgPSAmc29hcC0+ZG9tLT5hdHRzOyAqYXR0OyBhdHQgPSAmKCphdHQpLT5uZXh0KQorICAgICAgKCphdHQpLT5uc3RyID0gc29hcF9jdXJyZW50X25hbWVzcGFjZShzb2FwLCAoKmF0dCktPm5hbWUpOworICB9CisjZW5kaWYKKyAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIGlmICghKHNvYXAtPmJvZHkgPSAoYyAhPSAnLycpKSkKKyAgICBkbyBjID0gc29hcF9nZXQxKHNvYXApOworICAgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkKKyAgeyBpZiAoIXNvYXAtPmJvZHkgJiYgc29hcC0+ZG9tLT5wcm50KQorICAgICAgc29hcC0+ZG9tID0gc29hcC0+ZG9tLT5wcm50OworICB9CisjZW5kaWYKKyAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICB7IGlmICh0cC0+dmlzaWJsZSAmJiB0cC0+dmFsdWUpCisgICAgeyBpZiAoIXN0cmNtcCh0cC0+bmFtZSwgImlkIikpCisgICAgICB7ICpzb2FwLT5pZCA9ICcjJzsKKyAgICAgICAgc3RybmNweShzb2FwLT5pZCArIDEsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPmlkKSAtIDIpOworICAgICAgICBzb2FwLT5pZFtzaXplb2Yoc29hcC0+aWQpLTFdID0gJ1wwJzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAodHAtPm5hbWUsICJocmVmIikpCisgICAgICB7IHN0cm5jcHkoc29hcC0+aHJlZiwgdHAtPnZhbHVlLCBzaXplb2Yoc29hcC0+aHJlZikgLSAxKTsKKyAgICAgICAgc29hcC0+aHJlZltzaXplb2Yoc29hcC0+aHJlZiktMV0gPSAnXDAnOworICAgICAgfQorICAgICAgZWxzZSBpZiAoKHNvYXAtPnZlcnNpb24gPT0gMiB8fCAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0dSQVBIKSkgJiYgIXN0cmNtcCh0cC0+bmFtZSwgInJlZiIpKQorICAgICAgeyAqc29hcC0+aHJlZiA9ICcjJzsKKyAgICAgICAgc3RybmNweShzb2FwLT5ocmVmICsgMSwgdHAtPnZhbHVlLCBzaXplb2Yoc29hcC0+aHJlZikgLSAyKTsKKyAgICAgICAgc29hcC0+aHJlZltzaXplb2Yoc29hcC0+aHJlZiktMV0gPSAnXDAnOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAieHNpOnR5cGUiKSkKKyAgICAgIHsgc3RybmNweShzb2FwLT50eXBlLCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT50eXBlKSAtIDEpOworICAgICAgICBzb2FwLT50eXBlW3NpemVvZihzb2FwLT50eXBlKS0xXSA9ICdcMCc7CisgICAgICB9CisgICAgICBlbHNlIGlmIChzb2FwLT52ZXJzaW9uID09IDEgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTkM6YXJyYXlUeXBlIikpCisgICAgICB7IHMgPSBzb2FwX3N0cnJjaHIodHAtPnZhbHVlLCAnWycpOworICAgICAgICBpZiAocyAmJiAoc2l6ZV90KShzIC0gdHAtPnZhbHVlKSA8IHNpemVvZihzb2FwLT5hcnJheVR5cGUpKQorICAgICAgICB7IHN0cm5jcHkoc29hcC0+YXJyYXlUeXBlLCB0cC0+dmFsdWUsIHMgLSB0cC0+dmFsdWUpOworICAgICAgICAgIHNvYXAtPmFycmF5VHlwZVtzIC0gdHAtPnZhbHVlXSA9ICdcMCc7CisgICAgICAgICAgc3RybmNweShzb2FwLT5hcnJheVNpemUsIHMsIHNpemVvZihzb2FwLT5hcnJheVNpemUpIC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHN0cm5jcHkoc29hcC0+YXJyYXlUeXBlLCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT5hcnJheVR5cGUpIC0gMSk7CisgICAgICAgIHNvYXAtPmFycmF5U2l6ZVtzaXplb2Yoc29hcC0+YXJyYXlUeXBlKS0xXSA9ICdcMCc7CisgICAgICAgIHNvYXAtPmFycmF5VHlwZVtzaXplb2Yoc29hcC0+YXJyYXlUeXBlKS0xXSA9ICdcMCc7CisgICAgICB9CisgICAgICBlbHNlIGlmIChzb2FwLT52ZXJzaW9uID09IDIgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTkM6aXRlbVR5cGUiKSkKKyAgICAgICAgc3RybmNweShzb2FwLT5hcnJheVR5cGUsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPmFycmF5VHlwZSkgLSAxKTsKKyAgICAgIGVsc2UgaWYgKHNvYXAtPnZlcnNpb24gPT0gMiAmJiAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOQzphcnJheVNpemUiKSkKKyAgICAgICAgc3RybmNweShzb2FwLT5hcnJheVNpemUsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPmFycmF5U2l6ZSkgLSAxKTsKKyAgICAgIGVsc2UgaWYgKHNvYXAtPnZlcnNpb24gPT0gMSAmJiAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOQzpvZmZzZXQiKSkKKyAgICAgICAgc3RybmNweShzb2FwLT5hcnJheU9mZnNldCwgdHAtPnZhbHVlLCBzaXplb2Yoc29hcC0+YXJyYXlPZmZzZXQpKTsKKyAgICAgIGVsc2UgaWYgKHNvYXAtPnZlcnNpb24gPT0gMSAmJiAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOQzpwb3NpdGlvbiIpKQorICAgICAgICBzb2FwLT5wb3NpdGlvbiA9IHNvYXBfZ2V0cG9zaXRpb24odHAtPnZhbHVlLCBzb2FwLT5wb3NpdGlvbnMpOworICAgICAgZWxzZSBpZiAoc29hcC0+dmVyc2lvbiA9PSAxICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5DOnJvb3QiKSkKKyAgICAgICAgc29hcC0+cm9vdCA9ICgoIXN0cmNtcCh0cC0+dmFsdWUsICIxIikgfHwgIXN0cmNtcCh0cC0+dmFsdWUsICJ0cnVlIikpKTsKKyAgICAgIGVsc2UgaWYgKChzb2FwLT52ZXJzaW9uID09IDEgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTlY6YWN0b3IiKSkKKyAgICAgICAgICAgIHx8IChzb2FwLT52ZXJzaW9uID09IDIgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTlY6cm9sZSIpKSkKKyAgICAgIHsgaWYgKCghc29hcC0+YWN0b3IgfHwgc3RyY21wKHNvYXAtPmFjdG9yLCB0cC0+dmFsdWUpKQorICAgICAgICAgJiYgc3RyY21wKHRwLT52YWx1ZSwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvYWN0b3IvbmV4dCIpCisgICAgICAgICAmJiBzdHJjbXAodHAtPnZhbHVlLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlL3JvbGUvbmV4dCIpKQorICAgICAgICAgIHNvYXAtPm90aGVyID0gMTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5WOm11c3RVbmRlcnN0YW5kIikKKyAgICAgICAgICAgICYmICghc3RyY21wKHRwLT52YWx1ZSwgIjEiKSB8fCAhc3RyY21wKHRwLT52YWx1ZSwgInRydWUiKSkpCisgICAgICAgIHNvYXAtPm11c3RVbmRlcnN0YW5kID0gMTsKKyAgICAgIGVsc2UgaWYgKCghc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJ4c2k6bnVsbCIpCisgICAgICAgICAgICAgfHwgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAieHNpOm5pbCIpKQorICAgICAgICAgICAgJiYgKCFzdHJjbXAodHAtPnZhbHVlLCAiMSIpCisgICAgICAgICAgICAgfHwgIXN0cmNtcCh0cC0+dmFsdWUsICJ0cnVlIikpKQorICAgICAgICBzb2FwLT5udWxsID0gMTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfcmV0cnkoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgc29hcF9yZXZlcnQoc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3JldmVydChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKCFzb2FwLT5wZWVrZWQpCisgIHsgc29hcC0+cGVla2VkID0gMTsKKyAgICBpZiAoc29hcC0+Ym9keSkKKyAgICAgIHNvYXAtPmxldmVsLS07CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXZlcnRpbmcgbGFzdCBlbGVtZW50IChsZXZlbD0ldSlcbiIsIHNvYXAtPmxldmVsKSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc3RyaW5nX291dChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgaW50IGZsYWcpCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnQ7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBtYXNrID0gMHhGRkZGRkY4MFVMOworI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IHNvYXAtPmRvbS0+ZGF0YSA9IHNvYXBfc3RyZHVwKHNvYXAsIHMpOworICAgIHJldHVybiBTT0FQX09LOworICB9CisjZW5kaWYKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0NfVVRGU1RSSU5HKQorICAgIG1hc2sgPSAwOworICB0ID0gczsKKyAgd2hpbGUgKChjID0gKnQrKykpCisgIHsgc3dpdGNoIChjKQorICAgIHsgCisgICAgY2FzZSA5OgorICAgICAgaWYgKGZsYWcpCisgICAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiJiN4OTsiLCA1KSkKKwkgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgcyA9IHQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDEwOgorICAgICAgaWYgKGZsYWcgfHwgIShzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKSkKKyAgICAgIHsgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICImI3hBOyIsIDUpKQorCSAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBzID0gdDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTM6CisgICAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIiYjeEQ7IiwgNSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHMgPSB0OworICAgICAgYnJlYWs7CisgICAgY2FzZSAnJic6CisgICAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIiZhbXA7IiwgNSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHMgPSB0OworICAgICAgYnJlYWs7CisgICAgY2FzZSAnPCc6CisgICAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIiZsdDsiLCA0KSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgcyA9IHQ7CisgICAgICBicmVhazsKKyAgICBjYXNlICc+JzoKKyAgICAgIGlmICghZmxhZykKKyAgICAgIHsgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICImZ3Q7IiwgNCkpCisJICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHMgPSB0OworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnIic6CisgICAgICBpZiAoZmxhZykKKyAgICAgIHsgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICImcXVvdDsiLCA2KSkKKwkgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgcyA9IHQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmZGVmIEhBVkVfTUJUT1dDCisgICAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfQ19NQlNUUklORykKKyAgICAgIHsgd2NoYXJfdCB3YzsKKyAgICAgICAgcmVnaXN0ZXIgaW50IG0gPSBtYnRvd2MoJndjLCB0IC0gMSwgTUJfQ1VSX01BWCk7CisgICAgICAgIGlmIChtID4gMCAmJiB3YyAhPSBjKQorICAgICAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9wdXR1dGY4KHNvYXAsIHdjKSkKKyAgICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKwkgIHMgPSB0ICs9IG0gLSAxOworCSAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyNlbmRpZgorI2VuZGlmCisgICAgICBpZiAoYyAmIG1hc2spCisgICAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9wdXR1dGY4KHNvYXAsICh1bnNpZ25lZCBjaGFyKWMpKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgcyA9IHQ7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfc3RyaW5nX2luKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgZmxhZywgbG9uZyBtaW5sZW4sIGxvbmcgbWF4bGVuKQoreyByZWdpc3RlciBjaGFyICpzOworICBjaGFyICp0ID0gTlVMTDsKKyAgcmVnaXN0ZXIgc2l6ZV90IGk7CisgIHJlZ2lzdGVyIGxvbmcgbCA9IDA7CisgIHJlZ2lzdGVyIGludCBuID0gMDsKKyAgcmVnaXN0ZXIgaW50IG0gPSAwOworICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisjaWYgIWRlZmluZWQoV0lUSF9MRUFORVIpICYmIGRlZmluZWQoSEFWRV9XQ1RPTUIpCisgIGNoYXIgYnVmW01CX0xFTl9NQVggPiA4ID8gTUJfTEVOX01BWCA6IDhdOworI2Vsc2UKKyAgY2hhciBidWZbOF07CisjZW5kaWYKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlYWRpbmcgc3RyaW5nIGNvbnRlbnRcbiIpKTsKKyAgaWYgKHNvYXAtPnBlZWtlZCkKKyAgeyBpZiAoIXNvYXAtPmJvZHkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKnNvYXAtPnRhZykKKyAgICB7IG4gPSAxOworICAgICAgc29hcC0+cGVla2VkID0gMDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICB0ID0gc29hcC0+dG1wYnVmOworICAgICAgdFswXSA9ICc8JzsKKyAgICAgIHN0cm5jcHkodCArIDEsIHNvYXAtPnRhZywgc2l6ZW9mKHNvYXAtPnRtcGJ1ZikgLSAxKTsKKyAgICAgIHN0cm5jYXQodCwgIj4iLCBzaXplb2Yoc29hcC0+dG1wYnVmKSk7CisgICAgICBtID0gc3RybGVuKHNvYXAtPnRhZykgKyAyOworI2VuZGlmCisgICAgfQorICB9CisjaWZkZWYgV0lUSF9DREFUQQorICBpZiAoIWZsYWcpCisgIHsgcmVnaXN0ZXIgaW50IHN0YXRlID0gMDsKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgICBzb2FwLT5sYWJpZHggPSAwOwkJCS8qIHVzZSBsb29rLWFzaWRlIGJ1ZmZlciAqLworI2Vsc2UKKyAgICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICAgIGZvciAoOzspCisgICAgeyAKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgICAgIHJlZ2lzdGVyIHNpemVfdCBrOworICAgICAgaWYgKHNvYXBfYXBwZW5kX2xhYihzb2FwLCBOVUxMLCAwKSkJLyogYWxsb2NhdGUgbW9yZSBzcGFjZSBpbiBsb29rLWFzaWRlIGJ1ZmZlciBpZiBuZWNlc3NhcnkgKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICBzID0gc29hcC0+bGFiYnVmICsgc29hcC0+bGFiaWR4OwkvKiBzcGFjZSB0byBwb3B1bGF0ZSAqLworICAgICAgayA9IHNvYXAtPmxhYmxlbiAtIHNvYXAtPmxhYmlkeDsJLyogbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSAqLworICAgICAgc29hcC0+bGFiaWR4ID0gc29hcC0+bGFibGVuOwkvKiBjbGFpbSB0aGlzIHNwYWNlICovCisjZWxzZQorICAgICAgcmVnaXN0ZXIgc2l6ZV90IGsgPSBTT0FQX0JMS0xFTjsKKyAgICAgIGlmICghKHMgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIGspKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBrOyBpKyspCisgICAgICB7IGlmIChtID4gMCkKKyAgICAgICAgeyAqcysrID0gKnQrKzsJLyogY29weSBtdWx0aWJ5dGUgY2hhcmFjdGVycyAqLworCSAgbS0tOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisJaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIGlmIChjID49IDB4ODAgJiYgIShzb2FwLT5tb2RlICYgU09BUF9FTkNfTEFUSU4pKQorICAgICAgICB7IHNvYXBfdW5nZXQoc29hcCwgYyk7CisJICBjID0gc29hcF9nZXR1dGY4KHNvYXApOworCSAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0NfVVRGU1RSSU5HKQorICAgICAgICAgIHsgaWYgKChjICYgMHg4MDAwMDAwMCkgJiYgYyA+PSAtMHg3RkZGRkY4MCAmJiBjIDwgU09BUF9BUCkKKyAgICAgICAgICAgIHsgYyAmPSAweDdGRkZGRkZGOworICAgICAgICAgICAgICB0ID0gYnVmOworICAgICAgICAgICAgICBpZiAoYyA8IDB4MDgwMCkKKyAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4QzAgfCAoKGMgPj4gNikgJiAweDFGKSk7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeyBpZiAoYyA8IDB4MDEwMDAwKQorICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEUwIHwgKChjID4+IDEyKSAmIDB4MEYpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeyBpZiAoYyA8IDB4MjAwMDAwKQorICAgICAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjAgfCAoKGMgPj4gMTgpICYgMHgwNykpOworICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgeyBpZiAoYyA8IDB4MDQwMDAwMDApCisgICAgICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEY4IHwgKChjID4+IDI0KSAmIDB4MDMpKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7ICp0KysgPSAoY2hhcikoMHhGQyB8ICgoYyA+PiAzMCkgJiAweDAxKSk7CisgICAgICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDI0KSAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTgpICYgMHgzRikpOworICAgICAgICAgICAgICAgICAgfSAgICAgCisgICAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTIpICYgMHgzRikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gNikgJiAweDNGKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKGMgJiAweDNGKSk7CisJICAgICAgbSA9IChpbnQpKHQgLSBidWYpIC0gMTsKKyAgICAgICAgICAgICAgdCA9IGJ1ZjsKKyAgICAgICAgICAgICAgKnMrKyA9ICp0Kys7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworCSAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisJc3dpdGNoIChzdGF0ZSkKKyAgICAgICAgeyBjYXNlIDE6CisgICAgICAgICAgICBpZiAoYyA9PSAnXScpCisJICAgICAgc3RhdGUgPSA0OworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisJICBjYXNlIDI6CisJICAgIGlmIChjID09ICctJykKKyAgICAgICAgICAgICAgc3RhdGUgPSA2OworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisJICBjYXNlIDM6CisJICAgIGlmIChjID09ICc/JykKKwkgICAgICBzdGF0ZSA9IDg7CisJICAgICpzKysgPSBjOworCSAgICBjb250aW51ZTsKKyAgICAgICAgICAvKiBDREFUQSAqLworCSAgY2FzZSA0OgorCSAgICBpZiAoYyA9PSAnXScpCisgICAgICAgICAgICAgIHN0YXRlID0gNTsKKwkgICAgZWxzZQorCSAgICAgIHN0YXRlID0gMTsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworCSAgY2FzZSA1OgorCSAgICBpZiAoYyA9PSAnPicpCisJICAgICAgc3RhdGUgPSAwOworCSAgICBlbHNlCisJICAgICAgc3RhdGUgPSAxOworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisgICAgICAgICAgLyogY29tbWVudCAqLworICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIGlmIChjID09ICctJykKKwkgICAgICBzdGF0ZSA9IDc7CisJICAgIGVsc2UKKwkgICAgICBzdGF0ZSA9IDI7CisJICAgICpzKysgPSBjOworCSAgICBjb250aW51ZTsKKyAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICBpZiAoYyA9PSAnPicpCisJICAgICAgc3RhdGUgPSAwOworCSAgICBlbHNlCisJICAgICAgc3RhdGUgPSAyOworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisgICAgICAgICAgLyogUEkgKi8KKwkgIGNhc2UgODoKKyAgICAgICAgICAgIGlmIChjID09ICc+JykKKwkgICAgICBzdGF0ZSA9IDA7CisJICAgIGVsc2UKKwkgICAgICBzdGF0ZSA9IDM7CisJICAgICpzKysgPSBjOworCSAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGMpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAnLyc6CisgICAgICAgICAgaWYgKG4gPiAwKQorICAgICAgICAgIHsgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgICAgICAgICAgIGlmIChjID09ICc+JykKKyAgICAgICAgICAgICAgbi0tOworICAgICAgICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgICB9CisgICAgICAgICAgKnMrKyA9ICcvJzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnPCc6CisJICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworCSAgaWYgKGMgPT0gJy8nKQorCSAgeyBpZiAobiA9PSAwKQorCSAgICB7IGMgPSBTT0FQX1RUOworCSAgICAgIGdvdG8gZW5kOworCSAgICB9CisJICAgIG4tLTsKKwkgIH0KKwkgIGVsc2UgaWYgKGMgPT0gJyEnKQorCSAgeyBjID0gc29hcF9nZXRjaGFyKHNvYXApOworCSAgICBpZiAoYyA9PSAnWycpCisgICAgICAgICAgICB7IGRvIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgICAgICAgICAgICAgIHdoaWxlICgoaW50KWMgIT0gRU9GICYmIGMgIT0gJ1snKTsKKyAgICAgICAgICAgICAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworCSAgICAgIHQgPSAoY2hhciopIiFbQ0RBVEFbIjsKKwkgICAgICBtID0gODsKKwkgICAgICBzdGF0ZSA9IDE7CisJICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJy0nKQorCSAgICB7IGlmICgoYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKSkgPT0gJy0nKQorCSAgICAgICAgc3RhdGUgPSAyOworCSAgICAgIHQgPSAoY2hhciopIiEtIjsKKwkgICAgICBtID0gMjsKKwkgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeyB0ID0gKGNoYXIqKSIhIjsKKwkgICAgICBtID0gMTsKKwkgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworCSAgICB9CisJICAgICpzKysgPSAnPCc7CisJICAgIGJyZWFrOworCSAgfQorCSAgZWxzZSBpZiAoYyA9PSAnPycpCisJICAgIHN0YXRlID0gMzsKKwkgIGVsc2UKKwkgICAgbisrOworICAgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgICAgKnMrKyA9ICc8JzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnPic6CisgICAgICAgICAgKnMrKyA9ICc+JzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnIic6CisgICAgICAgICAgKnMrKyA9ICciJzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZmRlZiBIQVZFX1dDVE9NQgorICAgICAgICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9DX01CU1RSSU5HKQorICAgICAgICAgIHsgbSA9IHdjdG9tYihidWYsIGMgJiAweDdGRkZGRkZGKTsKKyAgICAgICAgICAgIGlmIChtID49IDEgJiYgbSA8PSAoaW50KU1CX0NVUl9NQVgpCisgICAgICAgICAgICB7IHQgPSBidWY7CisgICAgICAgICAgICAgICpzKysgPSAqdCsrOworICAgICAgICAgICAgICBtLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7ICpzKysgPSBTT0FQX1VOS05PV05fQ0hBUjsKKwkgICAgICBtID0gMDsKKwkgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisjZW5kaWYKKyNlbmRpZgorICAgICAgICAgICAgKnMrKyA9IChjaGFyKShjICYgMHhGRik7CisgICAgICAgIH0KKwlsKys7CisgICAgICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgbWF4bGVuID49IDAgJiYgbCA+IG1heGxlbikKKyAgICAgICAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiU3RyaW5nIHRvbyBsb25nOiBtYXhsZW49JWxkXG4iLCBtYXhsZW4pKTsKKyAgICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfTEVOR1RIOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgc29hcC0+bGFiaWR4ID0gMDsJCQkvKiB1c2UgbG9vay1hc2lkZSBidWZmZXIgKi8KKyNlbHNlCisgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICBmb3IgKDs7KQorICB7IAorI2lmZGVmIFdJVEhfRkFTVAorICAgIHJlZ2lzdGVyIHNpemVfdCBrOworICAgIGlmIChzb2FwX2FwcGVuZF9sYWIoc29hcCwgTlVMTCwgMCkpCS8qIGFsbG9jYXRlIG1vcmUgc3BhY2UgaW4gbG9vay1hc2lkZSBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBzID0gc29hcC0+bGFiYnVmICsgc29hcC0+bGFiaWR4OwkvKiBzcGFjZSB0byBwb3B1bGF0ZSAqLworICAgIGsgPSBzb2FwLT5sYWJsZW4gLSBzb2FwLT5sYWJpZHg7CS8qIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgKi8KKyAgICBzb2FwLT5sYWJpZHggPSBzb2FwLT5sYWJsZW47CS8qIGNsYWltIHRoaXMgc3BhY2UgKi8KKyNlbHNlCisgICAgcmVnaXN0ZXIgc2l6ZV90IGsgPSBTT0FQX0JMS0xFTjsKKyAgICBpZiAoIShzID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBrKSkpCisgICAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICAgIGZvciAoaSA9IDA7IGkgPCBrOyBpKyspCisgICAgeyBpZiAobSA+IDApCisgICAgICB7ICpzKysgPSAqdCsrOwkvKiBjb3B5IG11bHRpYnl0ZSBjaGFyYWN0ZXJzICovCisgICAgICAgIG0tLTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfQ19VVEZTVFJJTkcpCisgICAgICB7IGlmICgoKGMgPSBzb2FwX2dldChzb2FwKSkgJiAweDgwMDAwMDAwKSAmJiBjID49IC0weDdGRkZGRjgwICYmIGMgPCBTT0FQX0FQKQorICAgICAgICB7IGMgJj0gMHg3RkZGRkZGRjsKKyAgICAgICAgICB0ID0gYnVmOworICAgICAgICAgIGlmIChjIDwgMHgwODAwKQorICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEMwIHwgKChjID4+IDYpICYgMHgxRikpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7IGlmIChjIDwgMHgwMTAwMDApCisgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhFMCB8ICgoYyA+PiAxMikgJiAweDBGKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7IGlmIChjIDwgMHgyMDAwMDApCisgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEYwIHwgKChjID4+IDE4KSAmIDB4MDcpKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7IGlmIChjIDwgMHgwNDAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhGOCB8ICgoYyA+PiAyNCkgJiAweDAzKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsgKnQrKyA9IChjaGFyKSgweEZDIHwgKChjID4+IDMwKSAmIDB4MDEpKTsKKyAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAyNCkgJiAweDNGKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAxOCkgJiAweDNGKSk7CisgICAgICAgICAgICAgIH0gICAgIAorICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTIpICYgMHgzRikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDYpICYgMHgzRikpOworICAgICAgICAgIH0KKyAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoYyAmIDB4M0YpKTsKKwkgIG0gPSAoaW50KSh0IC0gYnVmKSAtIDE7CisgICAgICAgICAgdCA9IGJ1ZjsKKyAgICAgICAgICAqcysrID0gKnQrKzsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBjID0gc29hcF9nZXR1dGY4KHNvYXApOworICAgICAgc3dpdGNoIChjKQorICAgICAgeworICAgICAgY2FzZSBTT0FQX1RUOgorICAgICAgICBpZiAobiA9PSAwKQorICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICBuLS07CisgICAgICAgICpzKysgPSAnPCc7CisgICAgICAgIHQgPSAoY2hhciopIi8iOworCW0gPSAxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9MVDoKKyAgICAgICAgbisrOworICAgICAgICAqcysrID0gJzwnOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9HVDoKKyAgICAgICAgKnMrKyA9ICc+JzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfUVQ6CisgICAgICAgICpzKysgPSAnIic7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTT0FQX0FQOgorICAgICAgICAqcysrID0gJ1wnJzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICcvJzoKKyAgICAgICAgaWYgKG4gPiAwKQorICAgICAgICB7IGMgPSBzb2FwX2dldChzb2FwKTsKKyAgICAgICAgICBpZiAoYyA9PSBTT0FQX0dUKQorICAgICAgICAgICAgbi0tOworICAgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgIH0KKyAgICAgICAgKnMrKyA9ICcvJzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICc8JyB8IDB4ODAwMDAwMDA6CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICpzKysgPSAnPCc7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAqcysrID0gJyYnOworICAgICAgICAgIHQgPSAoY2hhciopImx0OyI7CisJICBtID0gMzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJz4nIHwgMHg4MDAwMDAwMDoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9ICc+JzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAnJic7CisgICAgICAgICAgdCA9IChjaGFyKikiZ3Q7IjsKKwkgIG0gPSAzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnJicgfCAweDgwMDAwMDAwOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gJyYnOworICAgICAgICBlbHNlCisgICAgICAgIHsgKnMrKyA9ICcmJzsKKyAgICAgICAgICB0ID0gKGNoYXIqKSJhbXA7IjsKKwkgIG0gPSA0OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnIicgfCAweDgwMDAwMDAwOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gJyInOworICAgICAgICBlbHNlCisgICAgICAgIHsgKnMrKyA9ICcmJzsKKyAgICAgICAgICB0ID0gKGNoYXIqKSJxdW90OyI7CisJICBtID0gNTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ1wnJyB8IDB4ODAwMDAwMDA6CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICpzKysgPSAnXCcnOworICAgICAgICBlbHNlCisgICAgICAgIHsgKnMrKyA9ICcmJzsKKyAgICAgICAgICB0ID0gKGNoYXIqKSJhcG9zOyI7CisJICBtID0gNTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICAgIGdvdG8gZW5kOworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmZGVmIEhBVkVfV0NUT01CCisgICAgICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9DX01CU1RSSU5HKQorICAgICAgICB7IG0gPSB3Y3RvbWIoYnVmLCBjICYgMHg3RkZGRkZGRik7CisgICAgICAgICAgaWYgKG0gPj0gMSAmJiBtIDw9IChpbnQpTUJfQ1VSX01BWCkKKyAgICAgICAgICB7IHQgPSBidWY7CisgICAgICAgICAgICAqcysrID0gKnQrKzsKKyAgICAgICAgICAgIG0tLTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsgKnMrKyA9IFNPQVBfVU5LTk9XTl9DSEFSOworCSAgICBtID0gMDsKKwkgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYKKyNlbmRpZgorICAgICAgICAgICpzKysgPSAoY2hhcikoYyAmIDB4RkYpOworICAgICAgfQorICAgICAgbCsrOworICAgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiBtYXhsZW4gPj0gMCAmJiBsID4gbWF4bGVuKQorICAgICAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiU3RyaW5nIHRvbyBsb25nOiBtYXhsZW49JWxkXG4iLCBtYXhsZW4pKTsKKyAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0xFTkdUSDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgfQorICB9CitlbmQ6CisgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICpzID0gJ1wwJzsKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgdCA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPmxhYmJ1Zik7CisjZWxzZQorICBzb2FwX3NpemVfYmxvY2soc29hcCwgaSsxKTsKKyAgdCA9IHNvYXBfc2F2ZV9ibG9jayhzb2FwLCBOVUxMLCAwKTsKKyNlbmRpZgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIGwgPCBtaW5sZW4pCisgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlN0cmluZyB0b28gc2hvcnQ6ICVsZCBjaGFycywgbWlubGVuPSVsZFxuIiwgbCwgbWlubGVuKSk7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0xFTkdUSDsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IGlmIChmbGFnID09IDMpCisgICAgICBzb2FwLT5kb20tPnRhaWwgPSB0OworICAgIGVsc2UKKyAgICAgIHNvYXAtPmRvbS0+ZGF0YSA9IHQ7CisgIH0KKyNlbmRpZgorICBpZiAoZmxhZyA9PSAyKQorICAgIGlmIChzb2FwX3MyUU5hbWUoc29hcCwgdCwgJnQpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiB0OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3dzdHJpbmdfb3V0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB3Y2hhcl90ICpzLCBpbnQgZmxhZykKK3sgY29uc3QgY2hhciAqdDsKKyAgY2hhciB0bXA7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyB3Y2hhcl90ICpyID0gKHdjaGFyX3QqKXM7CisgICAgaW50IG4gPSAxOworICAgIHdoaWxlICgqcisrKQorICAgICAgbisrOworICAgIHNvYXAtPmRvbS0+d2lkZSA9IHIgPSAod2NoYXJfdCopc29hcF9tYWxsb2Moc29hcCwgbiAqIHNpemVvZih3Y2hhcl90KSk7CisgICAgd2hpbGUgKG4tLSkKKyAgICAgICpyKysgPSAqcysrOworICAgIHJldHVybiBTT0FQX09LOworICB9CisjZW5kaWYKKyAgd2hpbGUgKChjID0gKnMrKykpCisgIHsgc3dpdGNoIChjKQorICAgIHsgCisgICAgY2FzZSA5OgorICAgICAgaWYgKGZsYWcpCisgICAgICAgIHQgPSAiJiN4OTsiOworICAgICAgZWxzZQorICAgICAgICB0ID0gIlx0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTA6CisgICAgICBpZiAoZmxhZyB8fCAhKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpKQorICAgICAgICB0ID0gIiYjeEE7IjsKKyAgICAgIGVsc2UKKyAgICAgICAgdCA9ICJcbiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEzOgorICAgICAgdCA9ICImI3hEOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICcmJzoKKyAgICAgIHQgPSAiJmFtcDsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnPCc6CisgICAgICB0ID0gIiZsdDsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnPic6CisgICAgICBpZiAoZmxhZykKKyAgICAgICAgdCA9ICI+IjsKKyAgICAgIGVsc2UKKwl0ID0gIiZndDsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnIic6CisgICAgICBpZiAoZmxhZykKKyAgICAgICAgdCA9ICImcXVvdDsiOworICAgICAgZWxzZQorICAgICAgICB0ID0gIlwiIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoYyA+IDAgJiYgYyA8IDB4ODApCisgICAgICB7IHRtcCA9IChjaGFyKWM7CisgICAgICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsICZ0bXAsIDEpKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHNvYXBfcHV0dXRmOChzb2FwLCAodW5zaWduZWQgbG9uZyljKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChzb2FwX3NlbmQoc29hcCwgdCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3djaGFyX3QgKgorU09BUF9GTUFDMgorc29hcF93c3RyaW5nX2luKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgZmxhZywgbG9uZyBtaW5sZW4sIGxvbmcgbWF4bGVuKQoreyB3Y2hhcl90ICpzOworICByZWdpc3RlciBpbnQgaSwgbiA9IDA7CisgIHJlZ2lzdGVyIGxvbmcgbCA9IDA7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgY29uc3QgY2hhciAqdCA9IE5VTEw7CisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWFkaW5nIHdpZGUgc3RyaW5nIGNvbnRlbnRcbiIpKTsKKyAgaWYgKHNvYXAtPnBlZWtlZCkKKyAgeyBpZiAoIXNvYXAtPmJvZHkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKnNvYXAtPnRhZykKKyAgICB7IG4gPSAxOworICAgICAgc29hcC0+cGVla2VkID0gMDsKKyAgICB9CisgIH0KKyAgaWYgKHNvYXBfbmV3X2Jsb2NrKHNvYXApKQorICAgIHJldHVybiBOVUxMOworICBmb3IgKDs7KQorICB7IGlmICghKHMgPSAod2NoYXJfdCopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIHNpemVvZih3Y2hhcl90KSpTT0FQX0JMS0xFTikpKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IFNPQVBfQkxLTEVOOyBpKyspCisgICAgeyBpZiAodCkKKyAgICAgIHsgKnMrKyA9ICh3Y2hhcl90KSp0Kys7CisgICAgICAgIGlmICghKnQpCisgICAgICAgICAgdCA9IE5VTEw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgYyA9IHNvYXBfZ2V0dXRmOChzb2FwKTsKKyAgICAgIHN3aXRjaCAoYykKKyAgICAgIHsKKyAgICAgIGNhc2UgU09BUF9UVDoKKyAgICAgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgbi0tOworICAgICAgICAqcysrID0gJzwnOworICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsICcvJyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTT0FQX0xUOgorICAgICAgICBuKys7CisgICAgICAgICpzKysgPSAnPCc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTT0FQX0dUOgorICAgICAgICAqcysrID0gJz4nOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9RVDoKKyAgICAgICAgKnMrKyA9ICciJzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfQVA6CisgICAgICAgICpzKysgPSAnXCcnOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJy8nOgorICAgICAgICBpZiAobiA+IDApCisgICAgICAgIHsgYyA9IHNvYXBfZ2V0dXRmOChzb2FwKTsKKyAgICAgICAgICBpZiAoYyA9PSBTT0FQX0dUKQorICAgICAgICAgICAgbi0tOworICAgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgIH0KKyAgICAgICAgKnMrKyA9ICcvJzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICc8JzoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9IChzb2FwX3djaGFyKSc8JzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAoc29hcF93Y2hhciknJic7CisgICAgICAgICAgdCA9ICJsdDsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnPic6CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICpzKysgPSAoc29hcF93Y2hhciknPic7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAqcysrID0gKHNvYXBfd2NoYXIpJyYnOworICAgICAgICAgIHQgPSAiZ3Q7IjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJyInOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gKHNvYXBfd2NoYXIpJyInOworICAgICAgICBlbHNlCisgICAgICAgIHsgKnMrKyA9IChzb2FwX3djaGFyKScmJzsKKyAgICAgICAgICB0ID0gInF1b3Q7IjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAqcysrID0gKHdjaGFyX3QpYyAmIDB4N0ZGRkZGRkY7CisgICAgICB9CisgICAgICBsKys7CisgICAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIG1heGxlbiA+PSAwICYmIGwgPiBtYXhsZW4pCisgICAgICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJTdHJpbmcgdG9vIGxvbmc6IG1heGxlbj0lbGRcbiIsIG1heGxlbikpOworICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfTEVOR1RIOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICB9CisgIH0KK2VuZDoKKyAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgKnMgPSAnXDAnOworICBzb2FwX3NpemVfYmxvY2soc29hcCwgc2l6ZW9mKHdjaGFyX3QpICogKGkgKyAxKSk7CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgbCA8IG1pbmxlbikKKyAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiU3RyaW5nIHRvbyBzaG9ydDogJWxkIGNoYXJzLCBtaW5sZW49JWxkXG4iLCBsLCBtaW5sZW4pKTsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfTEVOR1RIOworICAgIHJldHVybiBOVUxMOworICB9CisgIHMgPSAod2NoYXJfdCopc29hcF9zYXZlX2Jsb2NrKHNvYXAsIE5VTEwsIDApOworI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICAgIHNvYXAtPmRvbS0+d2lkZSA9IHM7CisjZW5kaWYKKyAgcmV0dXJuIHM7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2ludDJzKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbikKK3sgcmV0dXJuIHNvYXBfbG9uZzJzKHNvYXAsIChsb25nKW4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dGludChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGludCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9sb25nMnMoc29hcCwgKGxvbmcpKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MyaW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBpbnQgKnApCit7IGlmIChzKQorICB7IGNoYXIgKnI7CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBzb2FwX3Jlc2V0X2Vycm5vOworI2VuZGlmCisjZW5kaWYKKyAgICAqcCA9IChpbnQpc29hcF9zdHJ0b2wocywgJnIsIDEwKTsKKyAgICBpZiAoKHMgPT0gciAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpIHx8ICpyCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgfHwgc29hcF9lcnJubyA9PSBTT0FQX0VSQU5HRQorI2VuZGlmCisjZW5kaWYKKyAgICApCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQgKgorU09BUF9GTUFDMgorc29hcF9pbmludChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6Ynl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9IChpbnQqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihpbnQpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAoaW50Kilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKGludCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MyaW50KHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2xvbmcycyhzdHJ1Y3Qgc29hcCAqc29hcCwgbG9uZyBuKQoreyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIiVsZCIsIG4pOworICByZXR1cm4gc29hcC0+dG1wYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dGxvbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBsb25nICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX2xvbmcycyhzb2FwLCAqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJsb25nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBsb25nICpwKQoreyBpZiAocykKKyAgeyBjaGFyICpyOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgc29hcF9yZXNldF9lcnJubzsKKyNlbmRpZgorI2VuZGlmCisgICAgKnAgPSBzb2FwX3N0cnRvbChzLCAmciwgMTApOworICAgIGlmICgocyA9PSByICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkgfHwgKnIKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICB8fCBzb2FwX2Vycm5vID09IFNPQVBfRVJBTkdFCisjZW5kaWYKKyNlbmRpZgorICAgICkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2xvbmcgKgorU09BUF9GTUFDMgorc29hcF9pbmxvbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgbG9uZyAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6aW50IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6c2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpieXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKGxvbmcqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihsb25nKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKGxvbmcqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YobG9uZyksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MybG9uZyhzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9MT05HNjQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgTE9ORzY0IG4pCit7IHNwcmludGYoc29hcC0+dG1wYnVmLCBTT0FQX0xPTkdfRk9STUFULCBuKTsKKyAgcmV0dXJuIHNvYXAtPnRtcGJ1ZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRMT05HNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBMT05HNjQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfTE9ORzY0MnMoc29hcCwgKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MyTE9ORzY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBMT05HNjQgKnApCit7IGlmIChzKQorICB7CisjaWZkZWYgSEFWRV9TVFJUT0xMCisgICAgY2hhciAqcjsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgIHNvYXBfcmVzZXRfZXJybm87CisjZW5kaWYKKyNlbmRpZgorICAgICpwID0gc3RydG9sbChzLCAmciwgMTApOworICAgIGlmICgocyA9PSByICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkgfHwgKnIKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgIHx8IHNvYXBfZXJybm8gPT0gU09BUF9FUkFOR0UKKyNlbmRpZgorI2VuZGlmCisgICAgICApCisjZWxzZQorIyBpZmRlZiBIQVZFX1NTQ0FORgorICAgIGlmIChzc2NhbmYocywgU09BUF9MT05HX0ZPUk1BVCwgcCkgIT0gMSkKKyMgZW5kaWYKKyNlbmRpZgorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorTE9ORzY0ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5MT05HNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgTE9ORzY0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjppbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6cG9zaXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bmVnYXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bm9uUG9zaXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bm9uTmVnYXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bG9uZyIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6Ynl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9IChMT05HNjQqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihMT05HNjQpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAoTE9ORzY0Kilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKExPTkc2NCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MyTE9ORzY0KHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2J5dGUycyhzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciBuKQoreyByZXR1cm4gc29hcF9sb25nMnMoc29hcCwgKGxvbmcpbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0Ynl0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfbG9uZzJzKHNvYXAsIChsb25nKSpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMmJ5dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGNoYXIgKnApCit7IGlmIChzKQorICB7IGxvbmcgbjsKKyAgICBjaGFyICpyOworICAgIG4gPSBzb2FwX3N0cnRvbChzLCAmciwgMTApOworICAgIGlmIChzID09IHIgfHwgKnIgfHwgbiA8IC0xMjggfHwgbiA+IDEyNykKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgICpwID0gKGNoYXIpbjsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5ieXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGNoYXIgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAoY2hhciopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKGNoYXIpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAoY2hhciopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihjaGFyKSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJieXRlKHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3Nob3J0MnMoc3RydWN0IHNvYXAgKnNvYXAsIHNob3J0IG4pCit7IHJldHVybiBzb2FwX2xvbmcycyhzb2FwLCAobG9uZyluKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRzaG9ydChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHNob3J0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX2xvbmcycyhzb2FwLCAobG9uZykqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJzaG9ydChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgc2hvcnQgKnApCit7IGlmIChzKQorICB7IGxvbmcgbjsKKyAgICBjaGFyICpyOworICAgIG4gPSBzb2FwX3N0cnRvbChzLCAmciwgMTApOworICAgIGlmIChzID09IHIgfHwgKnIgfHwgbiA8IC0zMjc2OCB8fCBuID4gMzI3NjcpCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICAqcCA9IChzaG9ydCluOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3Nob3J0ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5zaG9ydChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzaG9ydCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6c2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpieXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKHNob3J0Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2Yoc2hvcnQpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAoc2hvcnQqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2Yoc2hvcnQpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMnNob3J0KHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2Zsb2F0MnMoc3RydWN0IHNvYXAgKnNvYXAsIGZsb2F0IG4pCit7IGNvbnN0IGNoYXIgKnM7CisgIGlmIChzb2FwX2lzbmFuKChkb3VibGUpbikpCisgICAgcyA9ICJOYU4iOworICBlbHNlIGlmIChzb2FwX2lzcGluZmYobikpCisgICAgcyA9ICJJTkYiOworICBlbHNlIGlmIChzb2FwX2lzbmluZmYobikpCisgICAgcyA9ICItSU5GIjsKKyAgZWxzZQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCBzb2FwLT5mbG9hdF9mb3JtYXQsIG4pOworICAgIHMgPSBzb2FwLT50bXBidWY7CisgIH0KKyAgcmV0dXJuIHM7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0ZmxvYXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBmbG9hdCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9mbG9hdDJzKHNvYXAsICpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMmZsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBmbG9hdCAqcCkKK3sgaWYgKHMpCisgIHsgaWYgKCEqcykKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBpZiAoIXNvYXBfdGFnX2NtcChzLCAiSU5GIikpCisgICAgICAqcCA9IEZMVF9QSU5GVFk7CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChzLCAiK0lORiIpKQorICAgICAgKnAgPSBGTFRfUElORlRZOworICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAocywgIi1JTkYiKSkKKyAgICAgICpwID0gRkxUX05JTkZUWTsKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHMsICJOYU4iKSkKKyAgICAgICpwID0gRkxUX05BTjsKKyAgICBlbHNlCisgICAgeworLyogT24gc29tZSBzeXN0ZW1zLCBzdHJ0b2YgYXBwZWFycyB0byBiZSBicm9rZW4gb3IgZG9lc24ndCBsaW5rOiB1c2Ugd2l0aCBjYXV0aW9uICovCisjaWYgZGVmaW5lZChIQVZFX1NUUlRPRikKKyAgICAgIGNoYXIgKnI7CisgICAgICAqcCA9IHN0cnRvZigoY2hhciopcywgJnIpOworICAgICAgaWYgKCpyKQorI2VsaWYgZGVmaW5lZChIQVZFX1NUUlRPRCkKKyAgICAgIGNoYXIgKnI7CisgICAgICAqcCA9IChmbG9hdClzdHJ0b2QocywgJnIpOworICAgICAgaWYgKCpyKQorI2VuZGlmCisjaWZkZWYgSEFWRV9TU0NBTkYKKyAgICAgICAgaWYgKHNzY2FuZihzLCAiJWciLCBwKSAhPSAxKQorICAgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworI2Vsc2UKKyAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisjZW5kaWYKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIGludCBzb2FwX2lzbnVtZXJpYyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdHlwZSkKK3sgaWYgKHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmZsb2F0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6ZG91YmxlIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6ZGVjaW1hbCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpwb3NpdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpuZWdhdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpub25Qb3NpdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpub25OZWdhdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpsb25nIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6aW50IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6c2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpieXRlIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRMb25nIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRJbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZFNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRCeXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIFNPQVBfRVJSOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorZmxvYXQgKgorU09BUF9GTUFDMgorc29hcF9pbmZsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGZsb2F0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlICE9ICdcMCcgJiYgc29hcF9pc251bWVyaWMoc29hcCwgdHlwZSkpCisgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgcCA9IChmbG9hdCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKGZsb2F0KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKGZsb2F0Kilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKGZsb2F0KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJmbG9hdChzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9kb3VibGUycyhzdHJ1Y3Qgc29hcCAqc29hcCwgZG91YmxlIG4pCit7IGNvbnN0IGNoYXIgKnM7CisgIGlmIChzb2FwX2lzbmFuKG4pKQorICAgIHMgPSAiTmFOIjsKKyAgZWxzZSBpZiAoc29hcF9pc3BpbmZkKG4pKQorICAgIHMgPSAiSU5GIjsKKyAgZWxzZSBpZiAoc29hcF9pc25pbmZkKG4pKQorICAgIHMgPSAiLUlORiI7CisgIGVsc2UKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1Ziwgc29hcC0+ZG91YmxlX2Zvcm1hdCwgbik7CisgICAgcyA9IHNvYXAtPnRtcGJ1ZjsKKyAgfQorICByZXR1cm4gczsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRkb3VibGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBkb3VibGUgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfZG91YmxlMnMoc29hcCwgKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MyZG91YmxlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBkb3VibGUgKnApCit7IGlmIChzKQorICB7IGlmICghKnMpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgaWYgKCFzb2FwX3RhZ19jbXAocywgIklORiIpKQorICAgICAgKnAgPSBEQkxfUElORlRZOworICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAocywgIitJTkYiKSkKKyAgICAgICpwID0gREJMX1BJTkZUWTsKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHMsICItSU5GIikpCisgICAgICAqcCA9IERCTF9OSU5GVFk7CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChzLCAiTmFOIikpCisgICAgICAqcCA9IERCTF9OQU47CisgICAgZWxzZQorICAgIHsKKyNpZmRlZiBIQVZFX1NUUlRPRAorICAgICAgY2hhciAqcjsKKyAgICAgICpwID0gc3RydG9kKHMsICZyKTsKKyAgICAgIGlmICgqcikKKyNlbmRpZgorI2lmZGVmIEhBVkVfU1NDQU5GCisgICAgICAgIGlmIChzc2NhbmYocywgIiVsZyIsIHApICE9IDEpCisgICAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisjZWxzZQorICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyNlbmRpZgorICAgIH0KKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitkb3VibGUgKgorU09BUF9GTUFDMgorc29hcF9pbmRvdWJsZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBkb3VibGUgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUgIT0gJ1wwJyAmJiBzb2FwX2lzbnVtZXJpYyhzb2FwLCB0eXBlKSkKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICBwID0gKGRvdWJsZSopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKGRvdWJsZSksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChkb3VibGUqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YoZG91YmxlKSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJkb3VibGUoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfdW5zaWduZWRCeXRlMnMoc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIGNoYXIgbikKK3sgcmV0dXJuIHNvYXBfdW5zaWduZWRMb25nMnMoc29hcCwgKHVuc2lnbmVkIGxvbmcpbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0dW5zaWduZWRCeXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgdW5zaWduZWQgY2hhciAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF91bnNpZ25lZExvbmcycyhzb2FwLCAodW5zaWduZWQgbG9uZykqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJ1bnNpZ25lZEJ5dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGNoYXIgKnApCit7IGlmIChzKQorICB7IHVuc2lnbmVkIGxvbmcgbjsKKyAgICBjaGFyICpyOworICAgIG4gPSBzb2FwX3N0cnRvdWwocywgJnIsIDEwKTsKKyAgICBpZiAocyA9PSByIHx8ICpyIHx8IG4gPiAyNTUpCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICAqcCA9ICh1bnNpZ25lZCBjaGFyKW47CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordW5zaWduZWQgY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX2ludW5zaWduZWRCeXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIGNoYXIgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkQnl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9ICh1bnNpZ25lZCBjaGFyKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YodW5zaWduZWQgY2hhciksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9ICh1bnNpZ25lZCBjaGFyKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMnVuc2lnbmVkQnl0ZShzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF91bnNpZ25lZFNob3J0MnMoc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIHNob3J0IG4pCit7IHJldHVybiBzb2FwX3Vuc2lnbmVkTG9uZzJzKHNvYXAsICh1bnNpZ25lZCBsb25nKW4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHVuc2lnbmVkU2hvcnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCB1bnNpZ25lZCBzaG9ydCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF91bnNpZ25lZExvbmcycyhzb2FwLCAodW5zaWduZWQgbG9uZykqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJ1bnNpZ25lZFNob3J0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBzaG9ydCAqcCkKK3sgaWYgKHMpCisgIHsgdW5zaWduZWQgbG9uZyBuOworICAgIGNoYXIgKnI7CisgICAgbiA9IHNvYXBfc3RydG91bChzLCAmciwgMTApOworICAgIGlmIChzID09IHIgfHwgKnIgfHwgbiA+IDY1NTM1KQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgKnAgPSAodW5zaWduZWQgc2hvcnQpbjsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit1bnNpZ25lZCBzaG9ydCAqCitTT0FQX0ZNQUMyCitzb2FwX2ludW5zaWduZWRTaG9ydChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB1bnNpZ25lZCBzaG9ydCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRTaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkQnl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9ICh1bnNpZ25lZCBzaG9ydCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKHVuc2lnbmVkIHNob3J0Kilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJ1bnNpZ25lZFNob3J0KHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3Vuc2lnbmVkSW50MnMoc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIGludCBuKQoreyByZXR1cm4gc29hcF91bnNpZ25lZExvbmcycyhzb2FwLCAodW5zaWduZWQgbG9uZyluKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXR1bnNpZ25lZEludChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIGludCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF91bnNpZ25lZExvbmcycyhzb2FwLCAodW5zaWduZWQgbG9uZykqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJ1bnNpZ25lZEludChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50ICpwKQoreyBpZiAocykKKyAgeyBjaGFyICpyOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgc29hcF9yZXNldF9lcnJubzsKKyNlbmRpZgorI2VuZGlmCisgICAgKnAgPSAodW5zaWduZWQgaW50KXNvYXBfc3RydG91bChzLCAmciwgMTApOworICAgIGlmICgocyA9PSByICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkgfHwgKnIKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICB8fCBzb2FwX2Vycm5vID09IFNPQVBfRVJBTkdFCisjZW5kaWYKKyNlbmRpZgorICAgICkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3Vuc2lnbmVkIGludCAqCitTT0FQX0ZNQUMyCitzb2FwX2ludW5zaWduZWRJbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgdW5zaWduZWQgaW50ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkU2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAodW5zaWduZWQgaW50Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YodW5zaWduZWQgaW50KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKHVuc2lnbmVkIGludCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZih1bnNpZ25lZCBpbnQpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMnVuc2lnbmVkSW50KHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3Vuc2lnbmVkTG9uZzJzKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBsb25nIG4pCit7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiJWx1Iiwgbik7CisgIHJldHVybiBzb2FwLT50bXBidWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0dW5zaWduZWRMb25nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgdW5zaWduZWQgbG9uZyAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF91bnNpZ25lZExvbmcycyhzb2FwLCAqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJ1bnNpZ25lZExvbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGxvbmcgKnApCit7IGlmIChzKQorICB7IGNoYXIgKnI7CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBzb2FwX3Jlc2V0X2Vycm5vOworI2VuZGlmCisjZW5kaWYKKyAgICAqcCA9IHNvYXBfc3RydG91bChzLCAmciwgMTApOworICAgIGlmICgocyA9PSByICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkgfHwgKnIKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICB8fCBzb2FwX2Vycm5vID09IFNPQVBfRVJBTkdFCisjZW5kaWYKKyNlbmRpZgorICAgICkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3Vuc2lnbmVkIGxvbmcgKgorU09BUF9GTUFDMgorc29hcF9pbnVuc2lnbmVkTG9uZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB1bnNpZ25lZCBsb25nICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkU2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAodW5zaWduZWQgbG9uZyopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAodW5zaWduZWQgbG9uZyopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZih1bnNpZ25lZCBsb25nKSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJ1bnNpZ25lZExvbmcoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfVUxPTkc2NDJzKHN0cnVjdCBzb2FwICpzb2FwLCBVTE9ORzY0IG4pCit7IHNwcmludGYoc29hcC0+dG1wYnVmLCBTT0FQX1VMT05HX0ZPUk1BVCwgbik7CisgIHJldHVybiBzb2FwLT50bXBidWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0VUxPTkc2NChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IFVMT05HNjQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfVUxPTkc2NDJzKHNvYXAsICpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMlVMT05HNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIFVMT05HNjQgKnApCit7IGlmIChzKQorICB7CisjaWZkZWYgSEFWRV9TVFJUT1VMTAorICAgIGNoYXIgKnI7CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBzb2FwX3Jlc2V0X2Vycm5vOworI2VuZGlmCisjZW5kaWYKKyAgICAqcCA9IHN0cnRvdWxsKHMsICZyLCAxMCk7CisgICAgaWYgKChzID09IHIgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKSB8fCAqcgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICAgfHwgc29hcF9lcnJubyA9PSBTT0FQX0VSQU5HRQorI2VuZGlmCisjZW5kaWYKKyAgICAgICkKKyNlbHNlCisjIGlmZGVmIEhBVkVfU1NDQU5GCisgICAgaWYgKHNzY2FuZihzLCBTT0FQX1VMT05HX0ZPUk1BVCwgcCkgIT0gMSkKKyMgZW5kaWYKKyNlbmRpZgorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorVUxPTkc2NCAqCitTT0FQX0ZNQUMyCitzb2FwX2luVUxPTkc2NChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBVTE9ORzY0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnBvc2l0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOm5vbk5lZ2F0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkTG9uZyIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkSW50IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRTaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkQnl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisgIHAgPSAoVUxPTkc2NCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKFVMT05HNjQpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAoVUxPTkc2NCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihVTE9ORzY0KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJVTE9ORzY0KHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMnN0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgY2hhciAqKnQpCit7ICp0ID0gTlVMTDsKKyAgaWYgKHMpCisgIHsgaWYgKCEoKnQgPSBzb2FwX3N0cmR1cChzb2FwLCBzKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICBpZiAoIShzb2FwLT5tb2RlICYgKFNPQVBfRU5DX0xBVElOIHwgU09BUF9DX1VURlNUUklORykpKQorICAgIHsgLyogVE9ETzogY29uc2lkZXIgdHJ1bmNhdGluZyBVVEY4IHRvIEFTQ0lJIGZvciByZWd1bGFyIFhNTCBhdHRyaWJ1dGUgc3RyaW5ncz8gKi8KKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MyUU5hbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGNoYXIgKip0KQoreyBpZiAocykKKyAgeyBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnA7CisgICAgY29uc3QgY2hhciAqcDsKKyAgICBpZiAoIXN0cm5jbXAocywgInhtbDoiLCA0KSkKKyAgICB7ICp0ID0gc29hcF9zdHJkdXAoc29hcCwgcyk7CisgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICB9CisgICAgbnAgPSBzb2FwLT5ubGlzdDsKKyAgICBwID0gc3RyY2hyKHMsICc6Jyk7CisgICAgaWYgKHApCisgICAgeyByZWdpc3RlciBpbnQgbiA9IHAgLSBzOworICAgICAgd2hpbGUgKG5wICYmIChzdHJuY21wKG5wLT5pZCwgcywgbikgfHwgbnAtPmlkW25dKSkKKyAgICAgICAgbnAgPSBucC0+bmV4dDsKKyAgICAgIHArKzsKKyAgICB9CisgICAgZWxzZQorICAgIHsgd2hpbGUgKG5wICYmICpucC0+aWQpCisgICAgICAgIG5wID0gbnAtPm5leHQ7CisgICAgICBwID0gczsKKyAgICB9CisgICAgaWYgKG5wKQorICAgIHsgaWYgKG5wLT5pbmRleCA+PSAwICYmIHNvYXAtPmxvY2FsX25hbWVzcGFjZXMpCisgICAgICB7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnEgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW25wLT5pbmRleF0uaWQ7CisgICAgICAgIGlmIChxKQorICAgICAgICB7IGlmICgoKnQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc3RybGVuKHApICsgc3RybGVuKHEpICsgMikpKQorICAgICAgICAgICAgc3ByaW50ZigqdCwgIiVzOiVzIiwgcSwgcCk7CisgICAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChucC0+bnMpCisgICAgICB7IGlmICgoKnQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc3RybGVuKHApICsgc3RybGVuKG5wLT5ucykgKyA0KSkpCisgICAgICAgICAgc3ByaW50ZigqdCwgIlwiJXNcIjolcyIsIG5wLT5ucywgcCk7CisgICAgICAgIHJldHVybiBTT0FQX09LOworICAgICAgfQorICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJOYW1lc3BhY2UgcHJlZml4IG9mICclcycgbm90IGRlZmluZWQgKGluZGV4PSVkLCBVUkk9JXMpXG4iLCBzLCBucC0+aW5kZXgsIG5wLT5ucz9ucC0+bnM6IiIpKTsKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTkFNRVNQQUNFOyAKKyAgICB9CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJOYW1lc3BhY2UgcHJlZml4IG9mICclcycgbm90IGRlZmluZWQsIGFzc3VtaW5nIGVtcHR5IG5hbWVzcGFjZVxuIiwgcykpOworICAgIGlmICgoKnQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc3RybGVuKHApICsgNCkpKQorICAgICAgc3ByaW50ZigqdCwgIlwiXCI6JXMiLCBwKTsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9RTmFtZTJzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzKQoreyBzdHJ1Y3QgTmFtZXNwYWNlICpwOworICBjaGFyICp0OworICBpbnQgbjsKKyAgaWYgKCFzIHx8ICpzICE9ICciJykKKyAgeworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBpZiAocyAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkpCisgICAgeyB0ID0gKGNoYXIqKXN0cmNocihzLCAnOicpOworICAgICAgaWYgKHQpCisgICAgICAgIHNvYXBfdXRpbGl6ZV9ucyhzb2FwLCBzLCB0IC0gcyk7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIHM7CisgIH0KKyAgcysrOworICBpZiAoKHAgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzKSkKKyAgeyBmb3IgKDsgcC0+aWQ7IHArKykKKyAgICB7IGlmIChwLT5ucykKKyAgICAgICAgaWYgKCFzb2FwX3RhZ19jbXAocywgcC0+bnMpKQorICAgICAgICAgIGJyZWFrOworICAgICAgaWYgKHAtPmluKQorICAgICAgICBpZiAoIXNvYXBfdGFnX2NtcChzLCBwLT5pbikpCisgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChwICYmIHAtPmlkKQorICAgIHsgcyA9IHN0cmNocihzLCAnIicpOworICAgICAgaWYgKHMpCisgICAgICB7IHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc3RybGVuKHAtPmlkKSArIHN0cmxlbihzKSk7CisgICAgICAgIHN0cmNweSh0LCBwLT5pZCk7CisJc3RyY2F0KHQsIHMgKyAxKTsKKyAgICAgICAgcmV0dXJuIHQ7CisgICAgICB9CisgICAgfQorICB9CisgIHQgPSAoY2hhciopc3RyY2hyKHMsICciJyk7CisgIGlmICh0KQorICAgIG4gPSB0IC0gczsKKyAgZWxzZQorICAgIG4gPSAwOworICB0ID0gc29hcF9zdHJkdXAoc29hcCwgcyk7CisgIHRbbl0gPSAnXDAnOworICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgInhtbG5zOl8lZCIsIHNvYXAtPmlkbnVtKyspOworICBzb2FwX3NldF9hdHRyKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgdCk7CisgIHMgPSBzdHJjaHIocywgJyInKTsKKyAgaWYgKHMpCisgIHsgdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzdHJsZW4oc29hcC0+dG1wYnVmKSArIHN0cmxlbihzKSAtIDYpOworICAgIHN0cmNweSh0LCBzb2FwLT50bXBidWYgKyA2KTsKKyAgICBzdHJjYXQodCwgcyArIDEpOworICB9CisgIHJldHVybiB0OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3Myd2NoYXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHdjaGFyX3QgKip0KQoreyB3Y2hhcl90ICpyOworICBpZiAoIXMpCisgICAgKnQgPSBOVUxMOworICBlbHNlCisgIHsgKnQgPSByID0gKHdjaGFyX3QqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZih3Y2hhcl90KSAqIChzdHJsZW4ocykgKyAxKSk7CisgICAgaWYgKCFyKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTEFUSU4pCisgICAgeyB3aGlsZSAoKnMpCisgICAgICAgICpyKysgPSAod2NoYXJfdCkqcysrOworICAgIH0KKyAgICBlbHNlCisgICAgeyAvKiBDb252ZXJ0IFVURjggdG8gd2NoYXIgKi8KKyAgICAgIHdoaWxlICgqcykKKyAgICAgIHsgcmVnaXN0ZXIgc29hcF93Y2hhciBjLCBjMSwgYzIsIGMzLCBjNDsKKyAgICAgICAgYyA9ICpzKys7CisgICAgICAgIGlmIChjIDwgMHg4MCkKKwkgICpyKysgPSAod2NoYXJfdCljOworCWVsc2UKKyAgICAgICAgeyBjMSA9IChzb2FwX3djaGFyKSpzKysgJiAweDNGOworICAgICAgICAgIGlmIChjIDwgMHhFMCkKKyAgICAgICAgICAgICpyKysgPSAod2NoYXJfdCkoKChzb2FwX3djaGFyKShjICYgMHgxRikgPDwgNikgfCBjMSk7CisgICAgICAgICAgZWxzZQorCSAgeyBjMiA9IChzb2FwX3djaGFyKSpzKysgJiAweDNGOworICAgICAgICAgICAgaWYgKGMgPCAweEYwKQorICAgICAgICAgICAgICAqcisrID0gKHdjaGFyX3QpKCgoc29hcF93Y2hhcikoYyAmIDB4MEYpIDw8IDEyKSB8IChjMSA8PCA2KSB8IGMyKTsKKyAgICAgICAgICAgIGVsc2UKKwkgICAgeyBjMyA9IChzb2FwX3djaGFyKSpzKysgJiAweDNGOworICAgICAgICAgICAgICBpZiAoYyA8IDB4RjgpCisgICAgICAgICAgICAgICAgKnIrKyA9ICh3Y2hhcl90KSgoKHNvYXBfd2NoYXIpKGMgJiAweDA3KSA8PCAxOCkgfCAoYzEgPDwgMTIpIHwgKGMyIDw8IDYpIHwgYzMpOworICAgICAgICAgICAgICBlbHNlCisJICAgICAgeyBjNCA9IChzb2FwX3djaGFyKSpzKysgJiAweDNGOworICAgICAgICAgICAgICAgIGlmIChjIDwgMHhGQykKKyAgICAgICAgICAgICAgICAgICpyKysgPSAod2NoYXJfdCkoKChzb2FwX3djaGFyKShjICYgMHgwMykgPDwgMjQpIHwgKGMxIDw8IDE4KSB8IChjMiA8PCAxMikgfCAoYzMgPDwgNikgfCBjNCk7CisgICAgICAgICAgICAgICAgZWxzZQorCQkgICpyKysgPSAod2NoYXJfdCkoKChzb2FwX3djaGFyKShjICYgMHgwMSkgPDwgMzApIHwgKGMxIDw8IDI0KSB8IChjMiA8PCAxOCkgfCAoYzMgPDwgMTIpIHwgKGM0IDw8IDYpIHwgKHNvYXBfd2NoYXIpKCpzKysgJiAweDNGKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgKnIgPSBMJ1wwJzsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3djaGFyMnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHdjaGFyX3QgKnMpCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgcmVnaXN0ZXIgY2hhciAqciwgKnQ7CisgIGNvbnN0IHdjaGFyX3QgKnEgPSBzOworICBzaXplX3QgbiA9IDA7CisgIHdoaWxlICgoYyA9ICpxKyspKQorICB7IGlmIChjID4gMCAmJiBjIDwgMHg4MCkKKyAgICAgIG4rKzsKKyAgICBlbHNlCisgICAgICBuICs9IDY7CisgIH0KKyAgciA9IHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgbiArIDEpOworICBpZiAocikKKyAgeyAvKiBDb252ZXJ0IHdjaGFyIHRvIFVURjggKi8KKyAgICB3aGlsZSAoKGMgPSAqcysrKSkKKyAgICB7IGlmIChjID4gMCAmJiBjIDwgMHg4MCkKKyAgICAgICAgKnQrKyA9IChjaGFyKWM7CisgICAgICBlbHNlCisgICAgICB7IGlmIChjIDwgMHgwODAwKQorICAgICAgICAgICp0KysgPSAoY2hhcikoMHhDMCB8ICgoYyA+PiA2KSAmIDB4MUYpKTsKKyAgICAgICAgZWxzZQorICAgICAgICB7IGlmIChjIDwgMHgwMTAwMDApCisgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RTAgfCAoKGMgPj4gMTIpICYgMHgwRikpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7IGlmIChjIDwgMHgyMDAwMDApCisgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhGMCB8ICgoYyA+PiAxOCkgJiAweDA3KSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7IGlmIChjIDwgMHgwNDAwMDAwMCkKKyAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjggfCAoKGMgPj4gMjQpICYgMHgwMykpOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsgKnQrKyA9IChjaGFyKSgweEZDIHwgKChjID4+IDMwKSAmIDB4MDEpKTsKKyAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMjQpICYgMHgzRikpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAxOCkgJiAweDNGKSk7CisgICAgICAgICAgICB9ICAgICAKKyAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAxMikgJiAweDNGKSk7CisgICAgICAgICAgfQorICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpKTsKKyAgICAgICAgfQorICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoYyAmIDB4M0YpKTsKKyAgICAgIH0KKyAgICB9CisgICAgKnQgPSAnXDAnOworICB9CisgIHJldHVybiByOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHN0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNoYXIgKmNvbnN0KnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKSAKK3sgaWQgPSBzb2FwX2VsZW1lbnRfaWQoc29hcCwgdGFnLCBpZCwgKnAsIE5VTEwsIDAsIHR5cGUsIG4pOworICBpZiAoaWQgPCAwCisgICB8fCBzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgaWQsIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgKnAsIDApCisgICB8fCBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoqCitTT0FQX0ZNQUMyCitzb2FwX2luc3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGNoYXIgKipwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCwgaW50IGZsYWcsIGxvbmcgbWlubGVuLCBsb25nIG1heGxlbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDEpKQorICB7IGlmICghdGFnIHx8ICp0YWcgIT0gJy0nIHx8IHNvYXAtPmVycm9yICE9IFNPQVBfTk9fVEFHKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICB9CisgIGlmICghcCkKKyAgICBpZiAoIShwID0gKGNoYXIqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2YoY2hhciopKSkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgaWYgKHNvYXAtPmJvZHkpCisgIHsgKnAgPSBzb2FwX3N0cmluZ19pbihzb2FwLCBmbGFnLCBtaW5sZW4sIG1heGxlbik7CisgICAgaWYgKCEqcCB8fCAhKGNoYXIqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsICpwLCB0LCBzaXplb2YoY2hhciopLCAwLCBOVUxMLCBOVUxMLCBOVUxMKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGVsc2UgaWYgKHNvYXAtPm51bGwpCisgICAgKnAgPSBOVUxMOworICBlbHNlCisgICAgKnAgPSAoY2hhciopU09BUF9TVFJfRU9TOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChjaGFyKiopc29hcF9pZF9sb29rdXAoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilwLCB0LCBzaXplb2YoY2hhcioqKSwgMCk7CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0d3N0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIHdjaGFyX3QgKmNvbnN0KnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKSAKK3sgaWQgPSBzb2FwX2VsZW1lbnRfaWQoc29hcCwgdGFnLCBpZCwgKnAsIE5VTEwsIDAsIHR5cGUsIG4pOworICBpZiAoaWQgPCAwCisgICB8fCBzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgaWQsIHR5cGUpCisgICB8fCBzb2FwX3dzdHJpbmdfb3V0KHNvYXAsICpwLCAwKQorICAgfHwgc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit3Y2hhcl90ICoqCitTT0FQX0ZNQUMyCitzb2FwX2lud3N0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB3Y2hhcl90ICoqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQsIGxvbmcgbWlubGVuLCBsb25nIG1heGxlbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDEpKQorICB7IGlmICghdGFnIHx8ICp0YWcgIT0gJy0nIHx8IHNvYXAtPmVycm9yICE9IFNPQVBfTk9fVEFHKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICB9CisgIGlmICghcCkKKyAgICBpZiAoIShwID0gKHdjaGFyX3QqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yod2NoYXJfdCopKSkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgaWYgKHNvYXAtPmJvZHkpCisgIHsgKnAgPSBzb2FwX3dzdHJpbmdfaW4oc29hcCwgMSwgbWlubGVuLCBtYXhsZW4pOworICAgIGlmICghKnAgfHwgISh3Y2hhcl90Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCAqcCwgdCwgc2l6ZW9mKHdjaGFyX3QqKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBlbHNlIGlmIChzb2FwLT5udWxsKQorICAgICpwID0gTlVMTDsKKyAgZWxzZQorICAgICpwID0gKHdjaGFyX3QqKVNPQVBfU1RSX0VPUzsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAod2NoYXJfdCoqKXNvYXBfaWRfbG9va3VwKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopcCwgdCwgc2l6ZW9mKHdjaGFyX3QqKiksIDApOworICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgdGltZV90Citzb2FwX3RpbWVnbShzdHJ1Y3QgdG0gKlQpCit7CisjaWYgZGVmaW5lZChIQVZFX1RJTUVHTSkKKyAgcmV0dXJuIHRpbWVnbShUKTsKKyNlbHNlCisgIHRpbWVfdCB0LCBnLCB6OworI2lmZGVmIEhBVkVfR01USU1FX1IKKyAgc3RydWN0IHRtIHRtLCAqdG1wID0gJnRtOworI2Vsc2UKKyAgc3RydWN0IHRtICp0bXA7CisjZW5kaWYKKyAgdCA9IG1rdGltZShUKTsKKyAgaWYgKHQgPT0gLTEpCisgICAgcmV0dXJuIC0xOworI2lmZGVmIEhBVkVfR01USU1FX1IKKyAgZ210aW1lX3IoJnQsIHRtcCk7CisjZWxzZQorICB0bXAgPSBnbXRpbWUoJnQpOworI2VuZGlmCisgIHRtcC0+dG1faXNkc3QgPSAwOworICBnID0gbWt0aW1lKHRtcCk7CisgIGlmIChnID09IC0xKQorICAgIHJldHVybiAtMTsKKyAgeiA9IGcgLSB0OworICByZXR1cm4gdCAtIHo7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2RhdGVUaW1lMnMoc3RydWN0IHNvYXAgKnNvYXAsIHRpbWVfdCBuKQoreyBzdHJ1Y3QgdG0gVCwgKnBUID0gJlQ7CisjaWYgZGVmaW5lZChIQVZFX0dNVElNRV9SKQorICBpZiAoZ210aW1lX3IoJm4sIHBUKSkKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVNaIiwgcFQpOworICAvKiBUaGUgZm9sbG93aW5nIGRlZmluZXMgd2VyZSBhZGRlZCBmb3IgVnhXb3JrcyovCisjZWxpZiBkZWZpbmVkKEhBVkVfUEdNVElNRV9SKQorICBpZiAoZ210aW1lX3IoJm4sIHBUKSkKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVNaIiwgcFQpOworI2VsaWYgZGVmaW5lZChIQVZFX1BHTVRJTUUpCisgIGlmIChnbXRpbWUoJm4sIHBUKSkKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVNaIiwgcFQpOworI2VsaWYgZGVmaW5lZChIQVZFX0dNVElNRSkKKyAgaWYgKChwVCA9IGdtdGltZSgmbikpKQorICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolU1oiLCBwVCk7CisjZWxpZiBkZWZpbmVkKEhBVkVfR0VUVElNRU9GREFZKQorICBzdHJ1Y3QgdGltZXpvbmUgdHo7CisgIG1lbXNldCgodm9pZCopJnR6LCAwLCBzaXplb2YodHopKTsKKyMgaWYgZGVmaW5lZChIQVZFX0xPQ0FMVElNRV9SKQorICBpZiAobG9jYWx0aW1lX3IoJm4sIHBUKSkKKyAgeyBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICBnZXR0aW1lb2ZkYXkoJnR2LCAmdHopOworICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIHN0cmxlbihzb2FwLT50bXBidWYpLCAiJSswM2Q6JTAyZCIsIC10ei50el9taW51dGVzd2VzdC82MCsocFQtPnRtX2lzZHN0IT0wKSwgYWJzKHR6LnR6X21pbnV0ZXN3ZXN0KSU2MCk7CisgIH0KKyMgZWxzZQorICBpZiAoKHBUID0gbG9jYWx0aW1lKCZuKSkpCisgIHsgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgZ2V0dGltZW9mZGF5KCZ0diwgJnR6KTsKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwVCk7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYgKyBzdHJsZW4oc29hcC0+dG1wYnVmKSwgIiUrMDNkOiUwMmQiLCAtdHoudHpfbWludXRlc3dlc3QvNjArKHBULT50bV9pc2RzdCE9MCksIGFicyh0ei50el9taW51dGVzd2VzdCklNjApOworICB9CisjZW5kaWYKKyNlbGlmIGRlZmluZWQoSEFWRV9GVElNRSkKKyAgc3RydWN0IHRpbWViIHQ7CisgIG1lbXNldCgodm9pZCopJnQsIDAsIHNpemVvZih0KSk7CisjIGlmIGRlZmluZWQoSEFWRV9MT0NBTFRJTUVfUikKKyAgaWYgKGxvY2FsdGltZV9yKCZuLCBwVCkpCisgIHsgZnRpbWUoJnQpOworICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIHN0cmxlbihzb2FwLT50bXBidWYpLCAiJSswM2Q6JTAyZCIsIC10LnRpbWV6b25lLzYwKyhwVC0+dG1faXNkc3QhPTApLCBhYnModC50aW1lem9uZSklNjApOworICB9CisgIC8qIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyB3ZXJlIGFkZGVkIGZvciBWeFdvcmtzKi8KKyMgZWxpZiBkZWZpbmVkKEhBVkVfUExPQ0FMVElNRV9SKQorICBpZiAobG9jYWx0aW1lX3IoJm4sIHBUKSkKKyAgeyBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwVCk7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYrc3RybGVuKHNvYXAtPnRtcGJ1ZiksICIlKzAzZDolMDJkIiwgdC50aW1lem9uZS82MCwgYWJzKHQudGltZXpvbmUpJTYwKTsKKyAgfQorIyBlbHNlCisgIGlmICgocFQgPSBsb2NhbHRpbWUoJm4pKSkKKyAgeyBmdGltZSgmdCk7CisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmICsgc3RybGVuKHNvYXAtPnRtcGJ1ZiksICIlKzAzZDolMDJkIiwgLXQudGltZXpvbmUvNjArKHBULT50bV9pc2RzdCE9MCksIGFicyh0LnRpbWV6b25lKSU2MCk7CisgIH0KKyMgZW5kaWYKKyNlbGlmIGRlZmluZWQoSEFWRV9MT0NBTFRJTUVfUikKKyAgaWYgKGxvY2FsdGltZV9yKCZuLCBwVCkpCisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworICAvKiBUaGUgZm9sbG93aW5nIGRlZmluZXMgd2VyZSBhZGRlZCBmb3IgVnhXb3JrcyovCisjZWxpZiBkZWZpbmVkKEhBVkVfUExPQ0FMVElNRV9SKQorICBpZiAobG9jYWx0aW1lX3IoJm4sIHBUKSkKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwVCk7CisjZWxzZQorICBpZiAoKHBUID0gbG9jYWx0aW1lKCZuKSkpCisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworI2VuZGlmCisgIGVsc2UKKyAgICBzdHJjcHkoc29hcC0+dG1wYnVmLCAiMTk2OS0xMi0zMVQyMzo1OTo1OVoiKTsKKyAgcmV0dXJuIHNvYXAtPnRtcGJ1ZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRkYXRlVGltZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHRpbWVfdCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9kYXRlVGltZTJzKHNvYXAsICpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMmRhdGVUaW1lKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCB0aW1lX3QgKnApCit7IGlmIChzKQorICB7IHN0cnVjdCB0bSBUOworICAgIGNoYXIgem9uZVsxNl07CisgICAgY29uc3QgY2hhciAqdDsKKyAgICBtZW1zZXQoKHZvaWQqKSZULCAwLCBzaXplb2YoVCkpOworICAgIHpvbmVbc2l6ZW9mKHpvbmUpLTFdID0gJ1wwJzsKKyAgICBpZiAoc3RyY2hyKHMsICctJykpCisgICAgICB0ID0gIiVkLSVkLSVkVCVkOiVkOiVkJTE1cyI7CisgICAgZWxzZSBpZiAoc3RyY2hyKHMsICc6JykpCisgICAgICB0ID0gIiU0ZCUyZCUyZFQlZDolZDolZCUxNXMiOworICAgIGVsc2UgLyogcGFyc2Ugbm9uLVhTRC1zdGFuZGFyZCBhbHRlcm5hdGl2ZSBJU08gODYwMSBmb3JtYXQgKi8KKyAgICAgIHQgPSAiJTRkJTJkJTJkVCUyZCUyZCUyZCUxNXMiOworICAgIHNzY2FuZihzLCB0LCAmVC50bV95ZWFyLCAmVC50bV9tb24sICZULnRtX21kYXksICZULnRtX2hvdXIsICZULnRtX21pbiwgJlQudG1fc2VjLCB6b25lKTsKKyAgICBpZiAoVC50bV95ZWFyID09IDEpCisgICAgICBULnRtX3llYXIgPSA3MDsKKyAgICBlbHNlCisgICAgICBULnRtX3llYXIgLT0gMTkwMDsKKyAgICBULnRtX21vbi0tOworICAgIGlmICgqem9uZSkKKyAgICB7IGlmICgqem9uZSA9PSAnLicpCisgICAgICB7IGZvciAocyA9IHpvbmUgKyAxOyAqczsgcysrKQorICAgICAgICAgIGlmICgqcyA8ICcwJyB8fCAqcyA+ICc5JykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBzID0gem9uZTsKKyAgICAgIGlmICgqcyA9PSAnKycgfHwgKnMgPT0gJy0nKQorICAgICAgeyBpbnQgaCA9IDAsIG0gPSAwOworICAgICAgICBpZiAoc1szXSA9PSAnOicpCisJeyBzc2NhbmYocywgIiVkOiVkIiwgJmgsICZtKTsKKwkgIGlmIChoIDwgMCkKKwkgICAgbSA9IC1tOworCX0KKwllbHNlCisJeyBtID0gKGludClhdG9sKHMpOworCSAgaCA9IG0gLyAxMDA7CisJICBtID0gbSAlIDEwMDsKKwl9CisgICAgICAgIFQudG1faG91ciAtPSBoOworICAgICAgICBULnRtX21pbiAtPSBtOworICAgICAgfQorICAgICAgVC50bV9pc2RzdCA9IDA7CisgICAgICAqcCA9IHNvYXBfdGltZWdtKCZUKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgVC50bV9pc2RzdCA9IC0xOworICAgICAgKnAgPSBta3RpbWUoJlQpOyAvKiBubyB0aW1lIHpvbmU6IHN1cHBvc2UgaXQgaXMgbG9jYWx0aW1lPyAqLworICAgIH0KKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCit0aW1lX3QgKgorU09BUF9GTUFDMgorc29hcF9pbmRhdGVUaW1lKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHRpbWVfdCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpkYXRlVGltZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisgIHAgPSAodGltZV90Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YodGltZV90KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKHRpbWVfdCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZih0aW1lX3QpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMmRhdGVUaW1lKHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRsaXRlcmFsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGNoYXIgKmNvbnN0KnApCit7IGludCBpOworICBjb25zdCBjaGFyICp0ID0gTlVMTDsKKyAgaWYgKHRhZyAmJiAqdGFnICE9ICctJykKKyAgeyBpZiAoc29hcC0+bG9jYWxfbmFtZXNwYWNlcyAmJiAodCA9IHN0cmNocih0YWcsICc6JykpKQorICAgIHsgc3RybmNweShzb2FwLT50bXBidWYsIHRhZywgdC10YWcpOworICAgICAgc29hcC0+dG1wYnVmW3QtdGFnXSA9ICdcMCc7CisgICAgICBmb3IgKGkgPSAwOyBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW2ldLmlkOyBpKyspCisgICAgICAgIGlmICghc3RyY21wKHNvYXAtPnRtcGJ1Ziwgc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tpXS5pZCkpCisgICAgICAgICAgYnJlYWs7CisgICAgICB0Kys7CisgICAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIjwlcyB4bWxucz1cIiVzXCI+IiwgdCwgc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tpXS5ucyA/IHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0ubnMgOiBTT0FQX1NUUl9FT1MpOworICAgIH0KKyAgICBlbHNlCisgICAgeyB0ID0gdGFnOworICAgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICI8JXM+IiwgdGFnKTsKKyAgICB9CisgICAgaWYgKHNvYXBfc2VuZChzb2FwLCBzb2FwLT50bXBidWYpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmIChwICYmICpwKQorICB7IGlmIChzb2FwX3NlbmQoc29hcCwgKnApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmICh0KQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiPC8lcz4iLCB0KTsKKyAgICByZXR1cm4gc29hcF9zZW5kKHNvYXAsIHNvYXAtPnRtcGJ1Zik7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoqCitTT0FQX0ZNQUMyCitzb2FwX2lubGl0ZXJhbChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBjaGFyICoqcCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDEpKQorICB7IGlmIChzb2FwLT5lcnJvciAhPSBTT0FQX05PX1RBRyB8fCBzb2FwX3VuZ2V0KHNvYXAsIHNvYXBfZ2V0KHNvYXApKSA9PSBTT0FQX1RUKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICB9CisgIGlmICghcCkKKyAgICBpZiAoIShwID0gKGNoYXIqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2YoY2hhciopKSkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgaWYgKHNvYXAtPmJvZHkpCisgICAgKnAgPSBzb2FwX3N0cmluZ19pbihzb2FwLCAwLCAtMSwgLTEpOworICBlbHNlIGlmIChzb2FwLT5udWxsKQorICAgICpwID0gTlVMTDsKKyAgZWxzZQorICAgICpwID0gKGNoYXIqKVNPQVBfU1RSX0VPUzsKKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXR3bGl0ZXJhbChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB3Y2hhcl90ICpjb25zdCpwKQoreyBpbnQgaTsKKyAgY29uc3QgY2hhciAqdCA9IE5VTEw7CisgIHdjaGFyX3QgYzsKKyAgY29uc3Qgd2NoYXJfdCAqczsKKyAgaWYgKHRhZyAmJiAqdGFnICE9ICctJykKKyAgeyBpZiAoc29hcC0+bG9jYWxfbmFtZXNwYWNlcyAmJiAodCA9IHN0cmNocih0YWcsICc6JykpKQorICAgIHsgc3RybmNweShzb2FwLT50bXBidWYsIHRhZywgdC10YWcpOworICAgICAgc29hcC0+dG1wYnVmW3QtdGFnXSA9ICdcMCc7CisgICAgICBmb3IgKGkgPSAwOyBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW2ldLmlkOyBpKyspCisgICAgICAgIGlmICghc3RyY21wKHNvYXAtPnRtcGJ1Ziwgc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tpXS5pZCkpCisgICAgICAgICAgYnJlYWs7CisgICAgICB0Kys7CisgICAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIjwlcyB4bWxucz1cIiVzXCI+IiwgdCwgc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tpXS5ucyA/IHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0ubnMgOiBTT0FQX1NUUl9FT1MpOworICAgIH0KKyAgICBlbHNlCisgICAgeyB0ID0gdGFnOworICAgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICI8JXM+IiwgdGFnKTsKKyAgICB9CisgICAgaWYgKHNvYXBfc2VuZChzb2FwLCBzb2FwLT50bXBidWYpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmIChwKQorICB7IHMgPSAqcDsKKyAgICB3aGlsZSAoKGMgPSAqcysrKSkKKyAgICAgIGlmIChzb2FwX3B1dHV0Zjgoc29hcCwgKHVuc2lnbmVkIGNoYXIpYykpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAodCkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIjwvJXM+IiwgdCk7CisgICAgcmV0dXJuIHNvYXBfc2VuZChzb2FwLCBzb2FwLT50bXBidWYpOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit3Y2hhcl90ICoqCitTT0FQX0ZNQUMyCitzb2FwX2lud2xpdGVyYWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgd2NoYXJfdCAqKnApCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAxKSkKKyAgeyBpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9OT19UQUcgfHwgc29hcF91bmdldChzb2FwLCBzb2FwX2dldChzb2FwKSkgPT0gU09BUF9UVCkKKyAgICAgIHJldHVybiBOVUxMOworICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgfQorICBpZiAoIXApCisgICAgaWYgKCEocCA9ICh3Y2hhcl90Kiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHdjaGFyX3QqKSkpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIGlmIChzb2FwLT5ib2R5KQorICAgICpwID0gc29hcF93c3RyaW5nX2luKHNvYXAsIDAsIC0xLCAtMSk7CisgIGVsc2UgaWYgKHNvYXAtPm51bGwpCisgICAgKnAgPSBOVUxMOworICBlbHNlCisgICAgKnAgPSAod2NoYXJfdCopU09BUF9TVFJfRU9TOworICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfdG9rZW4oc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNpemVfdCBpOworICByZWdpc3RlciBzb2FwX3djaGFyIGMgPSAwOworICByZWdpc3RlciBjaGFyICpzID0gc29hcC0+dG1wYnVmOworICBpZiAoIXNvYXAtPmJvZHkpCisgICAgcmV0dXJuIFNPQVBfU1RSX0VPUzsKKyAgZG8gYyA9IHNvYXBfZ2V0KHNvYXApOworICB3aGlsZSAoc29hcF9ibGFuayhjKSk7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc29hcC0+dG1wYnVmKSAtIDE7IGkrKykKKyAgeyBpZiAoYyA9PSBTT0FQX1RUIHx8IChpbnQpYyA9PSBFT0YgfHwgc29hcF9ibGFuayhjKSkKKyAgICAgIGJyZWFrOworICAgICpzKysgPSAoY2hhciljOworICAgIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgfQorICBpZiAoKGludCljID09IEVPRiB8fCBjID09IFNPQVBfVFQpCisgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgKnMgPSAnXDAnOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVsZW1lbnQgY29udGVudCB2YWx1ZT0nJXMnXG4iLCBzb2FwLT50bXBidWYpKTsKKyAgcmV0dXJuIHNvYXAtPnRtcGJ1ZjsgLyogcmV0dXJuIG5vbi1udWxsIHBvaW50ZXIgKi8KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIgKgorU09BUF9GTUFDMgorc29hcF92YWx1ZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc2l6ZV90IGk7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IDA7CisgIHJlZ2lzdGVyIGNoYXIgKnMgPSBzb2FwLT50bXBidWY7CisgIGlmICghc29hcC0+Ym9keSkKKyAgICByZXR1cm4gU09BUF9TVFJfRU9TOworICBkbyBjID0gc29hcF9nZXQoc29hcCk7CisgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZihzb2FwLT50bXBidWYpIC0gMTsgaSsrKQorICB7IGlmIChjID09IFNPQVBfVFQgfHwgKGludCljID09IEVPRikKKyAgICAgIGJyZWFrOworICAgICpzKysgPSAoY2hhciljOworICAgIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgfQorICBmb3IgKHMtLTsgaSA+IDA7IGktLSwgcy0tKQorICAgIGlmICghc29hcF9ibGFuaygqcykpCisgICAgICBicmVhazsKKyAgc1sxXSA9ICdcMCc7CisgIGlmICgoaW50KWMgPT0gRU9GIHx8IGMgPT0gU09BUF9UVCkKKyAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVsZW1lbnQgY29udGVudCB2YWx1ZT0nJXMnXG4iLCBzb2FwLT50bXBidWYpKTsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgICBzb2FwLT5kb20tPmRhdGEgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT50bXBidWYpOworI2VuZGlmCisgIHJldHVybiBzb2FwLT50bXBidWY7IC8qIHJldHVybiBub24tbnVsbCBwb2ludGVyICovCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAhZGVmaW5lZChXSVRIX0xFQU5FUikgfHwgIWRlZmluZWQoV0lUSF9OT0hUVFApCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldGxpbmUoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnMsIGludCBsZW4pCit7IGludCBpID0gbGVuOworICBzb2FwX3djaGFyIGMgPSAwOworICBmb3IgKDs7KQorICB7IHdoaWxlICgtLWkgPiAwKQorICAgIHsgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgICAgIGlmIChjID09ICdccicgfHwgYyA9PSAnXG4nKQorICAgICAgICBicmVhazsKKyAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAgICpzKysgPSAoY2hhciljOworICAgIH0KKyAgICBpZiAoYyAhPSAnXG4nKQorICAgICAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsgLyogZ290IFxyLCBub3cgZ2V0IFxuICovCisgICAgaWYgKGMgPT0gJ1xuJykKKyAgICB7ICpzID0gJ1wwJzsKKyAgICAgIGlmIChpKzEgPT0gbGVuKSAvKiBlbXB0eSBsaW5lOiBlbmQgb2YgSFRUUC9NSU1FIGhlYWRlciAqLworICAgICAgICBicmVhazsKKyAgICAgIGMgPSBzb2FwX3VuZ2V0KHNvYXAsIHNvYXBfZ2V0Y2hhcihzb2FwKSk7CisgICAgICBpZiAoYyAhPSAnICcgJiYgYyAhPSAnXHQnKSAvKiBIVFRQIGxpbmUgY29udGludWF0aW9uPyAqLworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZWxzZSBpZiAoKGludCljID09IEVPRikKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc2l6ZV90Citzb2FwX2NvdW50X2F0dGFjaG1lbnRzKHN0cnVjdCBzb2FwICpzb2FwKQoreyAKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICByZWdpc3RlciBzaXplX3QgY291bnQgPSBzb2FwLT5jb3VudDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDYWxjdWxhdGluZyB0aGUgbWVzc2FnZSBzaXplIHdpdGggYXR0YWNobWVudHMsIGN1cnJlbnQgY291bnQ9JWx1XG4iLCAodW5zaWduZWQgbG9uZyljb3VudCkpOworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKSkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNhbGN1bGF0aW5nIHRoZSBzaXplIG9mIERJTUUgYXR0YWNobWVudHNcbiIpKTsKKyAgICBmb3IgKGNvbnRlbnQgPSBzb2FwLT5kaW1lLmZpcnN0OyBjb250ZW50OyBjb250ZW50ID0gY29udGVudC0+bmV4dCkKKyAgICB7IGNvdW50ICs9IDEyICsgKChjb250ZW50LT5zaXplKzMpJih+MykpOworICAgICAgaWYgKGNvbnRlbnQtPmlkKQorICAgICAgICBjb3VudCArPSAoKHN0cmxlbihjb250ZW50LT5pZCkrMykmKH4zKSk7CisgICAgICBpZiAoY29udGVudC0+dHlwZSkKKyAgICAgICAgY291bnQgKz0gKChzdHJsZW4oY29udGVudC0+dHlwZSkrMykmKH4zKSk7CisgICAgICBpZiAoY29udGVudC0+b3B0aW9ucykKKyAgICAgICAgY291bnQgKz0gKCgoKHVuc2lnbmVkIGNoYXIpY29udGVudC0+b3B0aW9uc1syXSA8PCA4KSB8ICgodW5zaWduZWQgY2hhciljb250ZW50LT5vcHRpb25zWzNdKSkrNykmKH4zKTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2l6ZSBvZiBESU1FIGF0dGFjaG1lbnQgY29udGVudCBpcyAlbHUgYnl0ZXNcbiIsICh1bnNpZ25lZCBsb25nKWNvbnRlbnQtPnNpemUpKTsKKyAgICB9CisgIH0KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkgJiYgc29hcC0+bWltZS5ib3VuZGFyeSkKKyAgeyByZWdpc3RlciBzaXplX3QgbiA9IHN0cmxlbihzb2FwLT5taW1lLmJvdW5kYXJ5KTsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNhbGN1bGF0aW5nIHRoZSBzaXplIG9mIE1JTUUgYXR0YWNobWVudHNcbiIpKTsKKyAgICBmb3IgKGNvbnRlbnQgPSBzb2FwLT5taW1lLmZpcnN0OyBjb250ZW50OyBjb250ZW50ID0gY29udGVudC0+bmV4dCkKKyAgICB7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnM7CisgICAgICAvKiBjb3VudCBcclxuLS1ib3VuZGFyeVxyXG4gKi8KKyAgICAgIGNvdW50ICs9IDYgKyBuOworICAgICAgLyogY291bnQgQ29udGVudC1UeXBlOiAuLi5cclxuICovCisgICAgICBpZiAoY29udGVudC0+dHlwZSkKKyAgICAgICAgY291bnQgKz0gMTYgKyBzdHJsZW4oY29udGVudC0+dHlwZSk7CisgICAgICAvKiBjb3VudCBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiAuLi5cclxuICovCisgICAgICBzID0gc29hcF9zdHJfY29kZShtaW1lX2NvZGVzLCBjb250ZW50LT5lbmNvZGluZyk7CisgICAgICBpZiAocykKKyAgICAgICAgY291bnQgKz0gMjkgKyBzdHJsZW4ocyk7CisgICAgICAvKiBjb3VudCBDb250ZW50LUlEOiAuLi5cclxuICovCisgICAgICBpZiAoY29udGVudC0+aWQpCisgICAgICAgIGNvdW50ICs9IDE0ICsgc3RybGVuKGNvbnRlbnQtPmlkKTsKKyAgICAgIC8qIGNvdW50IENvbnRlbnQtTG9jYXRpb246IC4uLlxyXG4gKi8KKyAgICAgIGlmIChjb250ZW50LT5sb2NhdGlvbikKKyAgICAgICAgY291bnQgKz0gMjAgKyBzdHJsZW4oY29udGVudC0+bG9jYXRpb24pOworICAgICAgLyogY291bnQgQ29udGVudC1EZXNjcmlwdGlvbjogLi4uXHJcbiAqLworICAgICAgaWYgKGNvbnRlbnQtPmRlc2NyaXB0aW9uKQorICAgICAgICBjb3VudCArPSAyMyArIHN0cmxlbihjb250ZW50LT5sb2NhdGlvbik7CisgICAgICAvKiBjb3VudCBcclxuLi4uY29udGVudCAqLworICAgICAgY291bnQgKz0gMiArIGNvbnRlbnQtPnNpemU7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNpemUgb2YgTUlNRSBhdHRhY2htZW50IGNvbnRlbnQgaXMgJWx1IGJ5dGVzXG4iLCAodW5zaWduZWQgbG9uZyljb250ZW50LT5zaXplKSk7CisgICAgfQorICAgIC8qIGNvdW50IFxyXG4tLWJvdW5kYXJ5LS0gKi8KKyAgICBjb3VudCArPSA2ICsgbjsKKyAgfQorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk5ldyBjb3VudCBpcyAlbHUgYnl0ZXNcbiIsICh1bnNpZ25lZCBsb25nKWNvdW50KSk7CisgIHJldHVybiBjb3VudDsKKyNlbHNlCisgIHJldHVybiBzb2FwLT5jb3VudDsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc29hcF9wdXRkaW1lZmllbGQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBuKQoreyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCBuKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsIFNPQVBfU1RSX1BBRERJTkcsIC0obG9uZyluJjMpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfZGltZV9vcHRpb24oc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIHNob3J0IG9wdHlwZSwgY29uc3QgY2hhciAqb3B0aW9uKQoreyBzaXplX3QgbjsKKyAgY2hhciAqcyA9IE5VTEw7CisgIGlmIChvcHRpb24pCisgIHsgbiA9IHN0cmxlbihvcHRpb24pOworICAgIHMgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgbiArIDUpOworICAgIGlmIChzKQorICAgIHsgc1swXSA9IG9wdHlwZSA+PiA4OworICAgICAgc1sxXSA9IG9wdHlwZSAmIDB4RkY7CisgICAgICBzWzJdID0gbiA+PiA4OworICAgICAgc1szXSA9IG4gJiAweEZGOworICAgICAgc3RyY3B5KHMgKyA0LCBvcHRpb24pOworICAgIH0KKyAgfQorICByZXR1cm4gczsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dGRpbWVoZHIoc3RydWN0IHNvYXAgKnNvYXApCit7IHVuc2lnbmVkIGNoYXIgdG1wWzEyXTsKKyAgc2l6ZV90IG9wdGxlbiA9IDAsIGlkbGVuID0gMCwgdHlwZWxlbiA9IDA7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUHV0IERJTUUgaGVhZGVyIGlkPSclcydcbiIsIHNvYXAtPmRpbWUuaWQ/c29hcC0+ZGltZS5pZDoiIikpOworICBpZiAoc29hcC0+ZGltZS5vcHRpb25zKQorICAgIG9wdGxlbiA9ICgoKHVuc2lnbmVkIGNoYXIpc29hcC0+ZGltZS5vcHRpb25zWzJdIDw8IDgpIHwgKCh1bnNpZ25lZCBjaGFyKXNvYXAtPmRpbWUub3B0aW9uc1szXSkpICsgNDsKKyAgaWYgKHNvYXAtPmRpbWUuaWQpCisgICAgaWRsZW4gPSBzdHJsZW4oc29hcC0+ZGltZS5pZCk7CisgIGlmIChzb2FwLT5kaW1lLnR5cGUpCisgICAgdHlwZWxlbiA9IHN0cmxlbihzb2FwLT5kaW1lLnR5cGUpOworICB0bXBbMF0gPSBTT0FQX0RJTUVfVkVSU0lPTiB8IChzb2FwLT5kaW1lLmZsYWdzICYgMHg3KTsKKyAgdG1wWzFdID0gc29hcC0+ZGltZS5mbGFncyAmIDB4RjA7CisgIHRtcFsyXSA9IG9wdGxlbiA+PiA4OworICB0bXBbM10gPSBvcHRsZW4gJiAweEZGOworICB0bXBbNF0gPSBpZGxlbiA+PiA4OworICB0bXBbNV0gPSBpZGxlbiAmIDB4RkY7CisgIHRtcFs2XSA9IHR5cGVsZW4gPj4gODsKKyAgdG1wWzddID0gdHlwZWxlbiAmIDB4RkY7CisgIHRtcFs4XSA9IHNvYXAtPmRpbWUuc2l6ZSA+PiAyNDsKKyAgdG1wWzldID0gKHNvYXAtPmRpbWUuc2l6ZSA+PiAxNikgJiAweEZGOworICB0bXBbMTBdID0gKHNvYXAtPmRpbWUuc2l6ZSA+PiA4KSAmIDB4RkY7CisgIHRtcFsxMV0gPSBzb2FwLT5kaW1lLnNpemUgJiAweEZGOworICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAoY2hhciopdG1wLCAxMikKKyAgIHx8IHNvYXBfcHV0ZGltZWZpZWxkKHNvYXAsIHNvYXAtPmRpbWUub3B0aW9ucywgb3B0bGVuKQorICAgfHwgc29hcF9wdXRkaW1lZmllbGQoc29hcCwgc29hcC0+ZGltZS5pZCwgaWRsZW4pCisgICB8fCBzb2FwX3B1dGRpbWVmaWVsZChzb2FwLCBzb2FwLT5kaW1lLnR5cGUsIHR5cGVsZW4pKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRkaW1lKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgIGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSkKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgZm9yIChjb250ZW50ID0gc29hcC0+ZGltZS5maXJzdDsgY29udGVudDsgY29udGVudCA9IGNvbnRlbnQtPm5leHQpCisgIHsgdm9pZCAqaGFuZGxlOworICAgIHNvYXAtPmRpbWUuc2l6ZSA9IGNvbnRlbnQtPnNpemU7CisgICAgc29hcC0+ZGltZS5pZCA9IGNvbnRlbnQtPmlkOworICAgIHNvYXAtPmRpbWUudHlwZSA9IGNvbnRlbnQtPnR5cGU7CisgICAgc29hcC0+ZGltZS5vcHRpb25zID0gY29udGVudC0+b3B0aW9uczsKKyAgICBzb2FwLT5kaW1lLmZsYWdzID0gU09BUF9ESU1FX1ZFUlNJT04gfCBTT0FQX0RJTUVfTUVESUE7CisgICAgaWYgKHNvYXAtPmZkaW1lcmVhZG9wZW4gJiYgKChoYW5kbGUgPSBzb2FwLT5mZGltZXJlYWRvcGVuKHNvYXAsICh2b2lkKiljb250ZW50LT5wdHIsIGNvbnRlbnQtPmlkLCBjb250ZW50LT50eXBlLCBjb250ZW50LT5vcHRpb25zKSkgfHwgc29hcC0+ZXJyb3IpKQorICAgIHsgc2l6ZV90IHNpemUgPSBjb250ZW50LT5zaXplOworICAgICAgaWYgKCFoYW5kbGUpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZmRpbWVyZWFkb3BlbiBmYWlsZWRcbiIpKTsKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgICAgaWYgKCFjb250ZW50LT5zaXplICYmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1hNTCkgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LIHx8IChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19TVE9SRSkpCisgICAgICB7IHNpemVfdCBjaHVua3NpemUgPSBzaXplb2Yoc29hcC0+dG1wYnVmKTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDaHVua2VkIHN0cmVhbWluZyBESU1FXG4iKSk7CisgICAgICAgIGRvIAorICAgICAgICB7IHNpemUgPSBzb2FwLT5mZGltZXJlYWQoc29hcCwgaGFuZGxlLCBzb2FwLT50bXBidWYsIGNodW5rc2l6ZSk7CisgICAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJmZGltZXJlYWQgcmV0dXJuZWQgJWx1IGJ5dGVzXG4iLCAodW5zaWduZWQgbG9uZylzaXplKSk7CisgICAgICAgICAgaWYgKHNpemUgPCBjaHVua3NpemUpCisgCSAgeyBzb2FwLT5kaW1lLmZsYWdzICY9IH5TT0FQX0RJTUVfQ0Y7CisgICAgICAgICAgICBpZiAoIWNvbnRlbnQtPm5leHQpCisgICAgICAgICAgICAgIHNvYXAtPmRpbWUuZmxhZ3MgfD0gU09BUF9ESU1FX01FOworCSAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNvYXAtPmRpbWUuZmxhZ3MgfD0gU09BUF9ESU1FX0NGOworCSAgc29hcC0+ZGltZS5zaXplID0gc2l6ZTsKKyAgICAgICAgICBpZiAoc29hcF9wdXRkaW1laGRyKHNvYXApCisJICAgfHwgc29hcF9wdXRkaW1lZmllbGQoc29hcCwgc29hcC0+dG1wYnVmLCBzaXplKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGlmIChzb2FwLT5kaW1lLmlkKQorIAkgIHsgc29hcC0+ZGltZS5mbGFncyAmPSB+KFNPQVBfRElNRV9NQiB8IFNPQVBfRElNRV9NRURJQSk7CisgICAgICAgICAgICBzb2FwLT5kaW1lLmlkID0gTlVMTDsKKyAgICAgICAgICAgIHNvYXAtPmRpbWUudHlwZSA9IE5VTEw7CisgICAgICAgICAgICBzb2FwLT5kaW1lLm9wdGlvbnMgPSBOVUxMOworICAgICAgICAgIH0gIAorICAgICAgICB9IHdoaWxlIChzaXplID49IGNodW5rc2l6ZSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IGlmICghY29udGVudC0+bmV4dCkKKyAgICAgICAgICBzb2FwLT5kaW1lLmZsYWdzIHw9IFNPQVBfRElNRV9NRTsKKyAgICAgICAgaWYgKHNvYXBfcHV0ZGltZWhkcihzb2FwKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIGRvCisgICAgICAgIHsgc2l6ZV90IGJ1ZnNpemU7CisJICBpZiAoc2l6ZSA8IHNpemVvZihzb2FwLT50bXBidWYpKQorICAgICAgICAgICAgYnVmc2l6ZSA9IHNpemU7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgYnVmc2l6ZSA9IHNpemVvZihzb2FwLT50bXBidWYpOworICAgICAgICAgIGlmICghKGJ1ZnNpemUgPSBzb2FwLT5mZGltZXJlYWQoc29hcCwgaGFuZGxlLCBzb2FwLT50bXBidWYsIGJ1ZnNpemUpKSkKKyAgICAgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZmRpbWVyZWFkIGZhaWxlZDogaW5zdWZmaWNpZW50IGRhdGEgKCVsdSBieXRlcyByZW1haW5pbmcgZnJvbSAlbHUgYnl0ZXMpXG4iLCAodW5zaWduZWQgbG9uZylzaXplLCAodW5zaWduZWQgbG9uZylzb2FwLT5kaW1lLnNpemUpKTsKKyAgICAgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisJICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzb2FwLT50bXBidWYsIGJ1ZnNpemUpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgc2l6ZSAtPSBidWZzaXplOworICAgICAgICB9IHdoaWxlIChzaXplKTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJmZGltZXJlYWRjbG9zZVxuIikpOworICAgICAgICBzb2FwX3NlbmRfcmF3KHNvYXAsIFNPQVBfU1RSX1BBRERJTkcsIC0obG9uZylzb2FwLT5kaW1lLnNpemUmMyk7CisgICAgICB9CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImZkaW1lcmVhZGNsb3NlXG4iKSk7CisgICAgICBpZiAoc29hcC0+ZmRpbWVyZWFkY2xvc2UpCisgICAgICAgIHNvYXAtPmZkaW1lcmVhZGNsb3NlKHNvYXAsIGhhbmRsZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IGlmICghY29udGVudC0+bmV4dCkKKyAgICAgICAgc29hcC0+ZGltZS5mbGFncyB8PSBTT0FQX0RJTUVfTUU7CisgICAgICBpZiAoc29hcF9wdXRkaW1laGRyKHNvYXApCisgICAgICAgfHwgc29hcF9wdXRkaW1lZmllbGQoc29hcCwgKGNoYXIqKWNvbnRlbnQtPnB0ciwgY29udGVudC0+c2l6ZSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBjaGFyICoKK3NvYXBfZ2V0ZGltZWZpZWxkKHN0cnVjdCBzb2FwICpzb2FwLCBzaXplX3QgbikKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgY2hhciAqczsKKyAgY2hhciAqcCA9IE5VTEw7CisgIGlmIChuKQorICB7IHAgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgbiArIDEpOworICAgIGlmIChwKQorICAgIHsgcyA9IHA7CisgICAgICBmb3IgKGkgPSBuOyBpID4gMDsgaS0tKQorICAgICAgeyBpZiAoKGludCkoYyA9IHNvYXBfZ2V0MShzb2FwKSkgPT0gRU9GKQorICAgICAgICB7IHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgKnMrKyA9IChjaGFyKWM7CisgICAgICB9CisgICAgICAqcyA9ICdcMCc7CisgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcF9tb3ZlKHNvYXAsIC0obG9uZyluJjMpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgIH0KKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRkaW1laGRyKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIHJlZ2lzdGVyIGNoYXIgKnM7CisgIHJlZ2lzdGVyIGludCBpOworICB1bnNpZ25lZCBjaGFyIHRtcFsxMl07CisgIHNpemVfdCBvcHRsZW4sIGlkbGVuLCB0eXBlbGVuOworICBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9ESU1FX0VORDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHZXQgRElNRSBoZWFkZXJcbiIpKTsKKyAgaWYgKHNvYXAtPmRpbWUuYnVmbGVuIHx8IHNvYXAtPmRpbWUuY2h1bmtzaXplKQorICB7IGlmIChzb2FwX21vdmUoc29hcCwgKGxvbmcpKHNvYXAtPmRpbWUuc2l6ZSAtIHNvYXBfdGVsbChzb2FwKSkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgc29hcF91bmdldChzb2FwLCBzb2FwX2dldGNoYXIoc29hcCkpOyAvKiBza2lwIHBhZGRpbmcgYW5kIGdldCBoZHIgKi8KKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIi4uLiBGcm9tIGNodW5rZWRcbiIpKTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICBzID0gKGNoYXIqKXRtcDsKKyAgZm9yIChpID0gMTI7IGkgPiAwOyBpLS0pCisgIHsgaWYgKChpbnQpKGMgPSBzb2FwX2dldGNoYXIoc29hcCkpID09IEVPRikKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgICpzKysgPSAoY2hhciljOworICB9CisgIGlmICgodG1wWzBdICYgMHhGOCkgIT0gU09BUF9ESU1FX1ZFUlNJT04pCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9ESU1FX01JU01BVENIOworICBzb2FwLT5kaW1lLmZsYWdzID0gKHRtcFswXSAmIDB4NykgfCAodG1wWzFdICYgMHhGMCk7CisgIG9wdGxlbiA9ICh0bXBbMl0gPDwgOCkgfCB0bXBbM107CisgIGlkbGVuID0gKHRtcFs0XSA8PCA4KSB8IHRtcFs1XTsKKyAgdHlwZWxlbiA9ICh0bXBbNl0gPDwgOCkgfCB0bXBbN107CisgIHNvYXAtPmRpbWUuc2l6ZSA9ICh0bXBbOF0gPDwgMjQpIHwgKHRtcFs5XSA8PCAxNikgfCAodG1wWzEwXSA8PCA4KSB8IHRtcFsxMV07CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRElNRSBzaXplPSVsdSBmbGFncz0weCVYXG4iLCAodW5zaWduZWQgbG9uZylzb2FwLT5kaW1lLnNpemUsIHNvYXAtPmRpbWUuZmxhZ3MpKTsKKyAgaWYgKCEoc29hcC0+ZGltZS5vcHRpb25zID0gc29hcF9nZXRkaW1lZmllbGQoc29hcCwgb3B0bGVuKSkgJiYgc29hcC0+ZXJyb3IpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoIShzb2FwLT5kaW1lLmlkID0gc29hcF9nZXRkaW1lZmllbGQoc29hcCwgaWRsZW4pKSAmJiBzb2FwLT5lcnJvcikKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmICghKHNvYXAtPmRpbWUudHlwZSA9IHNvYXBfZ2V0ZGltZWZpZWxkKHNvYXAsIHR5cGVsZW4pKSAmJiBzb2FwLT5lcnJvcikKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRElNRSBpZD0lcywgdHlwZT0lcywgb3B0aW9ucz0lc1xuIiwgc29hcC0+ZGltZS5pZD9zb2FwLT5kaW1lLmlkOiIiLCBzb2FwLT5kaW1lLnR5cGU/c29hcC0+ZGltZS50eXBlOiIiLCBzb2FwLT5kaW1lLm9wdGlvbnM/c29hcC0+ZGltZS5vcHRpb25zKzQ6IiIpKTsKKyAgaWYgKHNvYXAtPmRpbWUuZmxhZ3MgJiBTT0FQX0RJTUVfTUUpCisgICAgc29hcC0+bW9kZSAmPSB+U09BUF9FTkNfRElNRTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRkaW1lKHN0cnVjdCBzb2FwICpzb2FwKQoreyB3aGlsZSAoc29hcC0+ZGltZS5mbGFncyAmIFNPQVBfRElNRV9DRikKKyAgeyBpZiAoc29hcF9nZXRkaW1laGRyKHNvYXApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmIChzb2FwX21vdmUoc29hcCwgc29hcC0+ZGltZS5zaXplKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICB9CisgIGlmIChzb2FwX21vdmUoc29hcCwgKChzb2FwLT5kaW1lLnNpemUrMykmKH4zKSktc29hcF90ZWxsKHNvYXApKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgZm9yICg7OykKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgICAgaWYgKHNvYXBfZ2V0ZGltZWhkcihzb2FwKSkKKyAgICAgIGJyZWFrOworICAgIGlmIChzb2FwLT5mZGltZXdyaXRlb3BlbiAmJiAoKHNvYXAtPmRpbWUucHRyID0gKGNoYXIqKXNvYXAtPmZkaW1ld3JpdGVvcGVuKHNvYXAsIHNvYXAtPmRpbWUuaWQsIHNvYXAtPmRpbWUudHlwZSwgc29hcC0+ZGltZS5vcHRpb25zKSkgfHwgc29hcC0+ZXJyb3IpKQorICAgIHsgY29uc3QgY2hhciAqaWQsICp0eXBlLCAqb3B0aW9uczsKKyAgICAgIHNpemVfdCBzaXplLCBuOworICAgICAgaWYgKCFzb2FwLT5kaW1lLnB0cikKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgaWQgPSBzb2FwLT5kaW1lLmlkOworICAgICAgdHlwZSA9IHNvYXAtPmRpbWUudHlwZTsKKyAgICAgIG9wdGlvbnMgPSBzb2FwLT5kaW1lLm9wdGlvbnM7CisgICAgICBmb3IgKDs7KQorICAgICAgeyBzaXplID0gc29hcC0+ZGltZS5zaXplOworICAgICAgICBmb3IgKDs7KQorICAgICAgICB7IG4gPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgICAgICAgaWYgKHNpemUgPCBuKQorICAgICAgICAgICAgbiA9IHNpemU7CisgICAgICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZkaW1ld3JpdGUoc29hcCwgKHZvaWQqKXNvYXAtPmRpbWUucHRyLCBzb2FwLT5idWYgKyBzb2FwLT5idWZpZHgsIG4pKSkKKyAgICAgICAgICAgIGJyZWFrOworCSAgc2l6ZSAtPSBuOworCSAgaWYgKCFzaXplKQorCSAgeyBzb2FwLT5idWZpZHggKz0gbjsKKwkgICAgYnJlYWs7CisJICB9CisJICBpZiAoc29hcF9yZWN2KHNvYXApKQorICAgICAgICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKwkgICAgZ290byBlbmQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzb2FwX21vdmUoc29hcCwgLShsb25nKXNvYXAtPmRpbWUuc2l6ZSYzKSkKKyAgICAgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworCSAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEoc29hcC0+ZGltZS5mbGFncyAmIFNPQVBfRElNRV9DRikpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChzb2FwX2dldGRpbWVoZHIoc29hcCkpCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CitlbmQ6CisgICAgICBpZiAoc29hcC0+ZmRpbWV3cml0ZWNsb3NlKQorICAgICAgICBzb2FwLT5mZGltZXdyaXRlY2xvc2Uoc29hcCwgKHZvaWQqKXNvYXAtPmRpbWUucHRyKTsKKyAgICAgIHNvYXAtPmRpbWUuc2l6ZSA9IDA7CisgICAgICBzb2FwLT5kaW1lLmlkID0gaWQ7CisgICAgICBzb2FwLT5kaW1lLnR5cGUgPSB0eXBlOworICAgICAgc29hcC0+ZGltZS5vcHRpb25zID0gb3B0aW9uczsKKyAgICB9CisgICAgZWxzZSBpZiAoc29hcC0+ZGltZS5mbGFncyAmIFNPQVBfRElNRV9DRikKKyAgICB7IGNvbnN0IGNoYXIgKmlkLCAqdHlwZSwgKm9wdGlvbnM7CisgICAgICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgICAgICByZWdpc3RlciBjaGFyICpzOworICAgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgICBpZCA9IHNvYXAtPmRpbWUuaWQ7CisgICAgICB0eXBlID0gc29hcC0+ZGltZS50eXBlOworICAgICAgb3B0aW9ucyA9IHNvYXAtPmRpbWUub3B0aW9uczsKKyAgICAgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICAgICAgcmV0dXJuIFNPQVBfRU9NOworICAgICAgZm9yICg7OykKKyAgICAgIHsgcyA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgc29hcC0+ZGltZS5zaXplKTsKKyAgICAgICAgaWYgKCFzKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgICBmb3IgKGkgPSBzb2FwLT5kaW1lLnNpemU7IGkgPiAwOyBpLS0pCisgICAgICAgIHsgaWYgKChpbnQpKGMgPSBzb2FwX2dldDEoc29hcCkpID09IEVPRikKKyAgICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgICAgICAgICpzKysgPSAoY2hhciljOworICAgICAgICB9CisgICAgICAgIGlmIChzb2FwX21vdmUoc29hcCwgLShsb25nKXNvYXAtPmRpbWUuc2l6ZSYzKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAgICAgaWYgKCEoc29hcC0+ZGltZS5mbGFncyAmIFNPQVBfRElNRV9DRikpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChzb2FwX2dldGRpbWVoZHIoc29hcCkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgICAgc29hcC0+ZGltZS5zaXplID0gc29hcC0+Ymxpc3QtPnNpemUrKzsgLyogYWxsb2NhdGUgb25lIG1vcmUgZm9yICdcMCcgKi8KKyAgICAgIGlmICghKHNvYXAtPmRpbWUucHRyID0gc29hcF9zYXZlX2Jsb2NrKHNvYXAsIE5VTEwsIDApKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgc29hcC0+ZGltZS5wdHJbc29hcC0+ZGltZS5zaXplXSA9ICdcMCc7IC8qIGZvcmNlIDAtdGVybWluYXRlZCAqLworICAgICAgc29hcC0+ZGltZS5pZCA9IGlkOworICAgICAgc29hcC0+ZGltZS50eXBlID0gdHlwZTsKKyAgICAgIHNvYXAtPmRpbWUub3B0aW9ucyA9IG9wdGlvbnM7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHNvYXAtPmRpbWUucHRyID0gc29hcF9nZXRkaW1lZmllbGQoc29hcCwgc29hcC0+ZGltZS5zaXplKTsKKyAgICBjb250ZW50ID0gc29hcF9uZXdfbXVsdGlwYXJ0KHNvYXAsICZzb2FwLT5kaW1lLmZpcnN0LCAmc29hcC0+ZGltZS5sYXN0LCBzb2FwLT5kaW1lLnB0ciwgc29hcC0+ZGltZS5zaXplKTsKKyAgICBpZiAoIWNvbnRlbnQpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICBjb250ZW50LT5pZCA9IHNvYXAtPmRpbWUuaWQ7CisgICAgY29udGVudC0+dHlwZSA9IHNvYXAtPmRpbWUudHlwZTsKKyAgICBjb250ZW50LT5vcHRpb25zID0gc29hcC0+ZGltZS5vcHRpb25zOworICAgIHNvYXBfcmVzb2x2ZV9hdHRhY2htZW50KHNvYXAsIGNvbnRlbnQpOworICAgIGlmIChzb2FwLT5lcnJvcikKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9ESU1FX0VORCkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRtaW1laGRyKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgIGRvCisgIHsgaWYgKHNvYXBfZ2V0bGluZShzb2FwLCBzb2FwLT5tc2didWYsIHNpemVvZihzb2FwLT5tc2didWYpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICB3aGlsZSAoISpzb2FwLT5tc2didWYpOworICBpZiAoc29hcC0+bXNnYnVmWzBdID09ICctJyAmJiBzb2FwLT5tc2didWZbMV0gPT0gJy0nKQorICB7IGNoYXIgKnMgPSBzb2FwLT5tc2didWYgKyBzdHJsZW4oc29hcC0+bXNnYnVmKSAtIDE7CisgICAgLyogcmVtb3ZlIHdoaXRlIHNwYWNlICovCisgICAgd2hpbGUgKHNvYXBfYmxhbmsoKnMpKQorICAgICAgcy0tOworICAgIHNbMV0gPSAnXDAnOworICAgIGlmIChzb2FwLT5taW1lLmJvdW5kYXJ5KQorICAgIHsgaWYgKHN0cmNtcChzb2FwLT5tc2didWYgKyAyLCBzb2FwLT5taW1lLmJvdW5kYXJ5KSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9NSU1FX0VSUk9SOworICAgIH0KKyAgICBlbHNlCisgICAgICBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+bXNnYnVmICsgMik7CisgICAgaWYgKHNvYXBfZ2V0bGluZShzb2FwLCBzb2FwLT5tc2didWYsIHNpemVvZihzb2FwLT5tc2didWYpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAoc29hcF9zZXRfbWltZV9hdHRhY2htZW50KHNvYXAsIE5VTEwsIDAsIFNPQVBfTUlNRV9OT05FLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgY29udGVudCA9IHNvYXAtPm1pbWUubGFzdDsKKyAgZm9yICg7OykKKyAgeyByZWdpc3RlciBjaGFyICprZXkgPSBzb2FwLT5tc2didWY7CisgICAgcmVnaXN0ZXIgY2hhciAqdmFsOworICAgIGlmICghKmtleSkKKyAgICAgIGJyZWFrOworICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJNSU1FIGhlYWRlcjogJXNcbiIsIGtleSkpOworICAgIHZhbCA9IHN0cmNocihzb2FwLT5tc2didWYsICc6Jyk7CisgICAgaWYgKHZhbCkKKyAgICB7ICp2YWwgPSAnXDAnOworICAgICAgZG8gdmFsKys7CisgICAgICB3aGlsZSAoKnZhbCAmJiAqdmFsIDw9IDMyKTsKKyAgICAgIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtSUQiKSkKKyAgICAgICAgY29udGVudC0+aWQgPSBzb2FwX3N0cmR1cChzb2FwLCB2YWwpOworICAgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LUxvY2F0aW9uIikpCisgICAgICAgIGNvbnRlbnQtPmxvY2F0aW9uID0gc29hcF9zdHJkdXAoc29hcCwgdmFsKTsKKyAgICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1EaXNwb3NpdGlvbiIpKQorICAgICAgICBjb250ZW50LT5pZCA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAibmFtZSIpKTsKKyAgICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1UeXBlIikpCisgICAgICAgIGNvbnRlbnQtPnR5cGUgPSBzb2FwX3N0cmR1cChzb2FwLCB2YWwpOworICAgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LURlc2NyaXB0aW9uIikpCisgICAgICAgIGNvbnRlbnQtPmRlc2NyaXB0aW9uID0gc29hcF9zdHJkdXAoc29hcCwgdmFsKTsKKyAgICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyIpKQorICAgICAgICBjb250ZW50LT5lbmNvZGluZyA9IChlbnVtIHNvYXBfbWltZV9lbmNvZGluZylzb2FwX2ludF9jb2RlKG1pbWVfY29kZXMsIHZhbCwgKGxvbmcpU09BUF9NSU1FX05PTkUpOworICAgIH0KKyAgICBpZiAoc29hcF9nZXRsaW5lKHNvYXAsIGtleSwgc2l6ZW9mKHNvYXAtPm1zZ2J1ZikpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0bWltZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjID0gMDsKKyAgaWYgKCFzb2FwLT5taW1lLmxhc3QpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIGZvciAoOzspCisgIHsgcmVnaXN0ZXIgc2l6ZV90IGksIG0gPSAwOworICAgIHJlZ2lzdGVyIGNoYXIgKnMsICp0ID0gTlVMTDsKKyAgICBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQgPSBzb2FwLT5taW1lLmxhc3Q7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQYXJzaW5nIE1JTUUgY29udGVudCBpZD0lcyB0eXBlPSVzXG4iLCBjb250ZW50LT5pZD9jb250ZW50LT5pZDoiIiwgY29udGVudC0+dHlwZT9jb250ZW50LT50eXBlOiIiKSk7CisgICAgaWYgKHNvYXBfbmV3X2Jsb2NrKHNvYXApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgZm9yICg7OykKKyAgICB7IHJlZ2lzdGVyIHNob3J0IGZsYWcgPSAwOworICAgICAgaWYgKCEocyA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgU09BUF9CTEtMRU4pKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICBmb3IgKGkgPSAwOyBpIDwgU09BUF9CTEtMRU47IGkrKykKKyAgICAgIHsgaWYgKG0gPiAwKQorICAgICAgICB7ICpzKysgPSAqdCsrOworCSAgbS0tOworCX0KKwllbHNlCisgICAgICAgIHsgaWYgKCFmbGFnKQorCSAgeyBjID0gc29hcF9nZXQxKHNvYXApOworCSAgICBpZiAoKGludCljID09IEVPRikKKwkgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKwkgIH0KKwkgIGlmIChmbGFnIHx8IGMgPT0gJ1xyJykKKwkgIHsgdCA9IHNvYXAtPnRtcGJ1ZjsKKwkgICAgbWVtc2V0KHQsIDAsIHNpemVvZihzb2FwLT50bXBidWYpKTsKKyAgICAgICAgICAgIHN0cmNweSh0LCAiXG4tLSIpOworICAgICAgICAgICAgaWYgKHNvYXAtPm1pbWUuYm91bmRhcnkpCisJICAgICAgc3RybmNhdCh0LCBzb2FwLT5taW1lLmJvdW5kYXJ5LCBzaXplb2Yoc29hcC0+dG1wYnVmKS00KTsKKwkgICAgZG8gYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKwkgICAgd2hpbGUgKGMgPT0gKnQrKyk7CisJICAgIGlmICgoaW50KWMgPT0gRU9GKQorCSAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworCSAgICBpZiAoISotLXQpCisJICAgICAgZ290byBlbmQ7CisJICAgICp0ID0gKGNoYXIpYzsKKwkgICAgZmxhZyA9IChjID09ICdccicpOworCSAgICBtID0gdCAtIHNvYXAtPnRtcGJ1ZiArIDEgLSBmbGFnOworCSAgICB0ID0gc29hcC0+dG1wYnVmOworCSAgICBjID0gJ1xyJzsKKwkgIH0KKwkgICpzKysgPSAoY2hhciljOworICAgICAgICB9CisgICAgICB9CisgICAgfQorZW5kOgorICAgICpzID0gJ1wwJzsgLyogZm9yY2UgMC10ZXJtaW5hdGVkICovCisgICAgY29udGVudC0+c2l6ZSA9IHNvYXBfc2l6ZV9ibG9jayhzb2FwLCBpKzEpLTE7CisgICAgY29udGVudC0+cHRyID0gc29hcF9zYXZlX2Jsb2NrKHNvYXAsIE5VTEwsIDApOworICAgIHNvYXBfcmVzb2x2ZV9hdHRhY2htZW50KHNvYXAsIGNvbnRlbnQpOworICAgIGlmIChjID09ICctJyAmJiBzb2FwX2dldGNoYXIoc29hcCkgPT0gJy0nKQorICAgICAgYnJlYWs7CisgICAgd2hpbGUgKGMgIT0gJ1xyJyAmJiAoaW50KWMgIT0gRU9GICYmIHNvYXBfYmxhbmsoYykpCisgICAgICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICAgIGlmIChjICE9ICdccicgfHwgc29hcF9nZXRjaGFyKHNvYXApICE9ICdcbicpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX01JTUVfRVJST1I7CisgICAgaWYgKHNvYXBfZ2V0bWltZWhkcihzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc29hcF9tYXRjaF9jaWQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKnQpCit7IHJlZ2lzdGVyIHNpemVfdCBuOworICBpZiAoIXMpCisgICAgcmV0dXJuIDE7CisgIGlmICghc3RyY21wKHMsIHQpKQorICAgIHJldHVybiAwOworICBpZiAoIXN0cm5jbXAocywgImNpZDoiLCA0KSkKKyAgICBzICs9IDQ7CisgIG4gPSBzdHJsZW4odCk7CisgIGlmICgqdCA9PSAnPCcpCisgIHsgdCsrOworICAgIG4gLT0gMjsKKyAgfQorICBpZiAoIXN0cm5jbXAocywgdCwgbikgJiYgIXNbbl0pCisgICAgcmV0dXJuIDA7CisgIHNvYXBfZGVjb2RlKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksIHMsIFNPQVBfU1RSX0VPUyk7CisgIGlmICghc3RybmNtcChzb2FwLT50bXBidWYsIHQsIG4pICYmICFzb2FwLT50bXBidWZbbl0pCisgICAgcmV0dXJuIDA7CisgIHJldHVybiAxOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZAorc29hcF9yZXNvbHZlX2F0dGFjaG1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudCkKK3sgaWYgKGNvbnRlbnQtPmlkKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3hsaXN0ICoqeHAgPSAmc29hcC0+eGxpc3Q7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHZpbmcgYXR0YWNobWVudCBkYXRhIGZvciBpZD0lc1xuIiwgY29udGVudC0+aWQpKTsKKyAgICB3aGlsZSAoKnhwKQorICAgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfeGxpc3QgKnhxID0gKnhwOworICAgICAgaWYgKCFzb2FwX21hdGNoX2NpZChzb2FwLCB4cS0+aWQsIGNvbnRlbnQtPmlkKSkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGb3VuZCBtYXRjaGluZyBhdHRhY2htZW50ICVzIGZvciBjb250ZW50IGlkPSVzXG4iLCB4cS0+aWQsIGNvbnRlbnQtPmlkKSk7CisJKnhwID0geHEtPm5leHQ7CisgICAgICAgICp4cS0+cHRyID0gKHVuc2lnbmVkIGNoYXIqKWNvbnRlbnQtPnB0cjsKKyAgICAgICAgKnhxLT5zaXplID0gKGludCljb250ZW50LT5zaXplOworICAgICAgICAqeHEtPnR5cGUgPSAoY2hhciopY29udGVudC0+dHlwZTsKKwlpZiAoY29udGVudC0+b3B0aW9ucykKKyAgICAgICAgICAqeHEtPm9wdGlvbnMgPSAoY2hhciopY29udGVudC0+b3B0aW9uczsKKyAgICAgICAgZWxzZQorICAgICAgICAgICp4cS0+b3B0aW9ucyA9IChjaGFyKiljb250ZW50LT5kZXNjcmlwdGlvbjsKKwlTT0FQX0ZSRUUoc29hcCwgeHEpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB4cCA9ICYoKnhwKS0+bmV4dDsKKyAgICB9CisgIH0KK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dG1pbWVoZHIoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudCkKK3sgY29uc3QgY2hhciAqczsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJNSU1FIGF0dGFjaG1lbnQgdHlwZT0lc1xuIiwgY29udGVudC0+dHlwZT9jb250ZW50LT50eXBlOiIiKSk7CisgIGlmIChzb2FwX3NlbmQzKHNvYXAsICJcclxuLS0iLCBzb2FwLT5taW1lLmJvdW5kYXJ5LCAiXHJcbiIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKGNvbnRlbnQtPnR5cGUgJiYgc29hcF9zZW5kMyhzb2FwLCAiQ29udGVudC1UeXBlOiAiLCBjb250ZW50LT50eXBlLCAiXHJcbiIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcyA9IHNvYXBfc3RyX2NvZGUobWltZV9jb2RlcywgY29udGVudC0+ZW5jb2RpbmcpOworICBpZiAocyAmJiBzb2FwX3NlbmQzKHNvYXAsICJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiAiLCBzLCAiXHJcbiIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKGNvbnRlbnQtPmlkICYmIHNvYXBfc2VuZDMoc29hcCwgIkNvbnRlbnQtSUQ6ICIsIGNvbnRlbnQtPmlkLCAiXHJcbiIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKGNvbnRlbnQtPmxvY2F0aW9uICYmIHNvYXBfc2VuZDMoc29hcCwgIkNvbnRlbnQtTG9jYXRpb246ICIsIGNvbnRlbnQtPmxvY2F0aW9uLCAiXHJcbiIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKGNvbnRlbnQtPmRlc2NyaXB0aW9uICYmIHNvYXBfc2VuZDMoc29hcCwgIkNvbnRlbnQtRGVzY3JpcHRpb246ICIsIGNvbnRlbnQtPmRlc2NyaXB0aW9uLCAiXHJcbiIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgIlxyXG4iLCAyKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dG1pbWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01JTUUpIHx8ICFzb2FwLT5taW1lLmJvdW5kYXJ5KQorICAgIHJldHVybiBTT0FQX09LOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNlbmRpbmcgTUlNRSBhdHRhY2htZW50c1xuIikpOworICBmb3IgKGNvbnRlbnQgPSBzb2FwLT5taW1lLmZpcnN0OyBjb250ZW50OyBjb250ZW50ID0gY29udGVudC0+bmV4dCkKKyAgICBpZiAoc29hcF9wdXRtaW1laGRyKHNvYXAsIGNvbnRlbnQpCisgICAgIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgY29udGVudC0+cHRyLCBjb250ZW50LT5zaXplKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfc2VuZDMoc29hcCwgIlxyXG4tLSIsIHNvYXAtPm1pbWUuYm91bmRhcnksICItLSIpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9kaW1lKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5vbW9kZSB8PSBTT0FQX0VOQ19ESU1FOworICBzb2FwLT5kaW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5sYXN0ID0gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfbWltZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqYm91bmRhcnksIGNvbnN0IGNoYXIgKnN0YXJ0KQoreyBzb2FwLT5vbW9kZSB8PSBTT0FQX0VOQ19NSU1FOworICBzb2FwLT5taW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5sYXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5ib3VuZGFyeSA9IHNvYXBfc3RyZHVwKHNvYXAsIGJvdW5kYXJ5KTsKKyAgc29hcC0+bWltZS5zdGFydCA9IHNvYXBfc3RyZHVwKHNvYXAsIHN0YXJ0KTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9jbHJfZGltZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+b21vZGUgJj0gflNPQVBfRU5DX0RJTUU7CisgIHNvYXAtPmRpbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmxhc3QgPSBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2Nscl9taW1lKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5vbW9kZSAmPSB+U09BUF9FTkNfTUlNRTsKKyAgc29hcC0+bWltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuYm91bmRhcnkgPSBOVUxMOworICBzb2FwLT5taW1lLnN0YXJ0ID0gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHN0cnVjdCBzb2FwX211bHRpcGFydCoKK3NvYXBfbmV3X211bHRpcGFydChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICoqZmlyc3QsIHN0cnVjdCBzb2FwX211bHRpcGFydCAqKmxhc3QsIGNoYXIgKnB0ciwgc2l6ZV90IHNpemUpCit7IHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgY29udGVudCA9IChzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQpKTsKKyAgaWYgKGNvbnRlbnQpCisgIHsgY29udGVudC0+bmV4dCA9IE5VTEw7CisgICAgY29udGVudC0+cHRyID0gcHRyOworICAgIGNvbnRlbnQtPnNpemUgPSBzaXplOworICAgIGNvbnRlbnQtPmlkID0gTlVMTDsKKyAgICBjb250ZW50LT50eXBlID0gTlVMTDsKKyAgICBjb250ZW50LT5vcHRpb25zID0gTlVMTDsKKyAgICBjb250ZW50LT5lbmNvZGluZyA9IFNPQVBfTUlNRV9OT05FOworICAgIGNvbnRlbnQtPmxvY2F0aW9uID0gTlVMTDsKKyAgICBjb250ZW50LT5kZXNjcmlwdGlvbiA9IE5VTEw7CisgICAgaWYgKCEqZmlyc3QpCisgICAgICAqZmlyc3QgPSBjb250ZW50OworICAgIGlmICgqbGFzdCkKKyAgICAgICgqbGFzdCktPm5leHQgPSBjb250ZW50OworICAgICpsYXN0ID0gY29udGVudDsKKyAgfQorICByZXR1cm4gY29udGVudDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NldF9kaW1lX2F0dGFjaG1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnB0ciwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmlkLCB1bnNpZ25lZCBzaG9ydCBvcHR5cGUsIGNvbnN0IGNoYXIgKm9wdGlvbikKK3sgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50ID0gc29hcF9uZXdfbXVsdGlwYXJ0KHNvYXAsICZzb2FwLT5kaW1lLmZpcnN0LCAmc29hcC0+ZGltZS5sYXN0LCBwdHIsIHNpemUpOworICBpZiAoIWNvbnRlbnQpCisgICAgcmV0dXJuIFNPQVBfRU9NOworICBjb250ZW50LT5pZCA9IHNvYXBfc3RyZHVwKHNvYXAsIGlkKTsKKyAgY29udGVudC0+dHlwZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHR5cGUpOworICBjb250ZW50LT5vcHRpb25zID0gc29hcF9kaW1lX29wdGlvbihzb2FwLCBvcHR5cGUsIG9wdGlvbik7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X21pbWVfYXR0YWNobWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqcHRyLCBzaXplX3Qgc2l6ZSwgZW51bSBzb2FwX21pbWVfZW5jb2RpbmcgZW5jb2RpbmcsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICpsb2NhdGlvbiwgY29uc3QgY2hhciAqZGVzY3JpcHRpb24pCit7IHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudCA9IHNvYXBfbmV3X211bHRpcGFydChzb2FwLCAmc29hcC0+bWltZS5maXJzdCwgJnNvYXAtPm1pbWUubGFzdCwgcHRyLCBzaXplKTsKKyAgaWYgKCFjb250ZW50KQorICAgIHJldHVybiBTT0FQX0VPTTsKKyAgY29udGVudC0+aWQgPSBzb2FwX3N0cmR1cChzb2FwLCBpZCk7CisgIGNvbnRlbnQtPnR5cGUgPSBzb2FwX3N0cmR1cChzb2FwLCB0eXBlKTsKKyAgY29udGVudC0+ZW5jb2RpbmcgPSBlbmNvZGluZzsKKyAgY29udGVudC0+bG9jYXRpb24gPSBzb2FwX3N0cmR1cChzb2FwLCBsb2NhdGlvbik7CisgIGNvbnRlbnQtPmRlc2NyaXB0aW9uID0gc29hcF9zdHJkdXAoc29hcCwgZGVzY3JpcHRpb24pOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc3RydWN0IHNvYXBfbXVsdGlwYXJ0KgorU09BUF9GTUFDMgorc29hcF9uZXh0X211bHRpcGFydChzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQpCit7IGlmIChjb250ZW50KQorICAgIHJldHVybiBjb250ZW50LT5uZXh0OworICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQKK3NvYXBfc2VsZWN0X21pbWVfYm91bmRhcnkoc3RydWN0IHNvYXAgKnNvYXApCit7IHdoaWxlICghc29hcC0+bWltZS5ib3VuZGFyeSB8fCBzb2FwX3ZhbGlkX21pbWVfYm91bmRhcnkoc29hcCkpCisgIHsgcmVnaXN0ZXIgY2hhciAqcyA9IHNvYXAtPm1pbWUuYm91bmRhcnk7CisgICAgcmVnaXN0ZXIgc2l6ZV90IG4gPSAwOworICAgIGlmIChzKQorICAgICAgbiA9IHN0cmxlbihzKTsKKyAgICBpZiAobiA8IDE2KQorICAgIHsgbiA9IDY0OworICAgICAgcyA9IHNvYXAtPm1pbWUuYm91bmRhcnkgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgbiArIDEpOworICAgICAgaWYgKCFzKQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0cmNweShzLCAiPT0iKTsKKyAgICBzICs9IDI7CisgICAgbiAtPSA0OworICAgIHdoaWxlIChuKQorICAgIHsgKnMrKyA9IHNvYXBfYmFzZTY0b1tzb2FwX3JhbmRvbSAmIDB4M0ZdOworICAgICAgbi0tOworICAgIH0KKyAgICBzdHJjcHkocywgIj09Iik7CisgIH0KKyAgaWYgKCFzb2FwLT5taW1lLnN0YXJ0KQorICAgIHNvYXAtPm1pbWUuc3RhcnQgPSAiPFNPQVAtRU5WOkVudmVsb3BlPiI7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NvYXBfdmFsaWRfbWltZV9ib3VuZGFyeShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICByZWdpc3RlciBzaXplX3QgayA9IHN0cmxlbihzb2FwLT5taW1lLmJvdW5kYXJ5KTsKKyAgZm9yIChjb250ZW50ID0gc29hcC0+bWltZS5maXJzdDsgY29udGVudDsgY29udGVudCA9IGNvbnRlbnQtPm5leHQpCisgIHsgaWYgKGNvbnRlbnQtPnB0ciAmJiBjb250ZW50LT5zaXplID49IGspCisgICAgeyByZWdpc3RlciBjb25zdCBjaGFyICpwID0gKGNvbnN0IGNoYXIqKWNvbnRlbnQtPnB0cjsgCisgICAgICByZWdpc3RlciBzaXplX3QgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjb250ZW50LT5zaXplIC0gazsgaSsrLCBwKyspCisgICAgICAgIGlmICghc3RybmNtcChwLCBzb2FwLT5taW1lLmJvdW5kYXJ5LCBrKSkKKyAgICAgICAgICByZXR1cm4gU09BUF9FUlI7CisgICAgfQorICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglIVFRQIGNvb2tpZSBoYW5kbGluZworICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBXSVRIX0NPT0tJRVMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitzaXplX3QKK1NPQVBfRk1BQzIKK3NvYXBfZW5jb2RlX2Nvb2tpZShjb25zdCBjaGFyICpzLCBjaGFyICp0LCBzaXplX3QgbGVuKQoreyByZWdpc3RlciBpbnQgYzsKKyAgcmVnaXN0ZXIgc2l6ZV90IG4gPSBsZW47CisgIHdoaWxlICgoYyA9ICpzKyspICYmIC0tbiA+IDApCisgIHsgaWYgKGMgPiAnICcgJiYgYyA8IDEyOCAmJiAhc3RyY2hyKCIoKTw+QCw7OlxcXCIvW10/PXt9IiwgYykpCisgICAgICAqdCsrID0gYzsKKyAgICBlbHNlIGlmIChuID4gMikKKyAgICB7ICp0KysgPSAnJSc7CisgICAgICAqdCsrID0gKGMgPj4gNCkgKyAoYyA+IDE1OSA/ICc3JyA6ICcwJyk7CisgICAgICBjICY9IDB4RjsKKyAgICAgICp0KysgPSBjICsgKGMgPiA5ID8gJzcnIDogJzAnKTsKKyAgICAgIG4gLT0gMjsKKyAgICB9CisgICAgZWxzZQorICAgICAgYnJlYWs7CisgIH0KKyAgKnQgPSAnXDAnOworICByZXR1cm4gbGVuIC0gbjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwX2Nvb2tpZSoKK1NPQVBfRk1BQzIKK3NvYXBfY29va2llKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgc2l6ZV90IG47CisgIGlmICghZG9tYWluKQorICAgIGRvbWFpbiA9IHNvYXAtPmNvb2tpZV9kb21haW47CisgIGlmICghcGF0aCkKKyAgICBwYXRoID0gc29hcC0+Y29va2llX3BhdGg7CisgIGlmICgqcGF0aCA9PSAnLycpCisgICAgcGF0aCsrOworICBuID0gc3RybGVuKHBhdGgpOworICBmb3IgKHAgPSBzb2FwLT5jb29raWVzOyBwOyBwID0gcC0+bmV4dCkKKyAgICBpZiAoIXN0cmNtcChwLT5uYW1lLCBuYW1lKQorICAgICAmJiBkb21haW4KKyAgICAgJiYgcC0+ZG9tYWluCisgICAgICYmICFzdHJjbXAocC0+ZG9tYWluLCBkb21haW4pCisgICAgICYmICFzdHJuY21wKHAtPnBhdGgsIHBhdGgsIG4pKQorICAgICAgYnJlYWs7CisgIHJldHVybiBwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQorc3RydWN0IHNvYXBfY29va2llKgorU09BUF9GTUFDMgorc29hcF9zZXRfY29va2llKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKipwLCAqcTsKKyAgaW50IG47CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2V0IGNvb2tpZTogJXM9JXMgZG9tYWluPSVzIHBhdGg9JXNcbiIsIG5hbWUsIHZhbHVlP3ZhbHVlOiIiLCBkb21haW4/ZG9tYWluOiIiLCBwYXRoP3BhdGg6IiIpKTsKKyAgaWYgKCFkb21haW4pCisgICAgZG9tYWluID0gc29hcC0+Y29va2llX2RvbWFpbjsKKyAgaWYgKCFwYXRoKQorICAgIHBhdGggPSBzb2FwLT5jb29raWVfcGF0aDsKKyAgaWYgKCFwYXRoKQorICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJDb29raWUgcGF0aCBub3Qgc2V0IiwgTlVMTCwgU09BUF9IVFRQX0VSUk9SKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoKnBhdGggPT0gJy8nKQorICAgIHBhdGgrKzsKKyAgcSA9IHNvYXBfY29va2llKHNvYXAsIG5hbWUsIGRvbWFpbiwgcGF0aCk7CisgIGlmICghcSkKKyAgeyBpZiAoKHEgPSAoc3RydWN0IHNvYXBfY29va2llKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfY29va2llKSkpKQorICAgIHsgaWYgKChxLT5uYW1lID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihuYW1lKSsxKSkpCisgICAgICAgIHN0cmNweShxLT5uYW1lLCBuYW1lKTsKKyAgICAgIHEtPnZhbHVlID0gTlVMTDsKKyAgICAgIHEtPmRvbWFpbiA9IE5VTEw7CisgICAgICBxLT5wYXRoID0gTlVMTDsKKyAgICAgIHEtPmV4cGlyZSA9IC0xOworICAgICAgcS0+dmVyc2lvbiA9IDA7CisgICAgICBxLT5zZWN1cmUgPSAwOworICAgICAgcS0+bW9kaWZpZWQgPSAwOworICAgICAgZm9yIChwID0gJnNvYXAtPmNvb2tpZXMsIG4gPSBzb2FwLT5jb29raWVfbWF4OyAqcCAmJiBuOyBwID0gJigqcCktPm5leHQsIG4tLSkKKyAgICAgICAgaWYgKCFzdHJjbXAoKCpwKS0+bmFtZSwgbmFtZSkgJiYgKCpwKS0+cGF0aCAmJiBzdHJjbXAoKCpwKS0+cGF0aCwgcGF0aCkgPCAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgaWYgKG4pCisgICAgICB7IHEtPm5leHQgPSAqcDsKKyAgICAgICAgKnAgPSBxOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBTT0FQX0ZSRUUoc29hcCwgcS0+bmFtZSk7CisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBxKTsKKyAgICAgICAgcSA9IE5VTEw7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyAgICBxLT5tb2RpZmllZCA9IDE7CisgIGlmIChxKQorICB7IGlmIChxLT52YWx1ZSkKKyAgICB7IFNPQVBfRlJFRShzb2FwLCBxLT52YWx1ZSk7CisgICAgICBxLT52YWx1ZSA9IE5VTEw7CisgICAgfQorICAgIGlmIChxLT5kb21haW4pCisgICAgeyBTT0FQX0ZSRUUoc29hcCwgcS0+ZG9tYWluKTsKKyAgICAgIHEtPmRvbWFpbiA9IE5VTEw7CisgICAgfQorICAgIGlmIChxLT5wYXRoKQorICAgIHsgU09BUF9GUkVFKHNvYXAsIHEtPnBhdGgpOworICAgICAgcS0+cGF0aCA9IE5VTEw7CisgICAgfQorICAgIGlmICh2YWx1ZSAmJiAqdmFsdWUgJiYgKHEtPnZhbHVlID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbih2YWx1ZSkrMSkpKQorICAgICAgc3RyY3B5KHEtPnZhbHVlLCB2YWx1ZSk7CisgICAgaWYgKGRvbWFpbiAmJiAqZG9tYWluICYmIChxLT5kb21haW4gPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKGRvbWFpbikrMSkpKQorICAgICAgc3RyY3B5KHEtPmRvbWFpbiwgZG9tYWluKTsKKyAgICBpZiAocGF0aCAmJiAqcGF0aCAmJiAocS0+cGF0aCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4ocGF0aCkrMSkpKQorICAgICAgc3RyY3B5KHEtPnBhdGgsIHBhdGgpOworICAgIHEtPnNlc3Npb24gPSAxOworICAgIHEtPmVudiA9IDA7CisgIH0KKyAgcmV0dXJuIHE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2Nscl9jb29raWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICoqcCwgKnE7CisgIGlmICghZG9tYWluKQorICAgIGRvbWFpbiA9IHNvYXAtPmNvb2tpZV9kb21haW47CisgIGlmICghZG9tYWluKQorICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJDb29raWUgZG9tYWluIG5vdCBzZXQiLCBOVUxMLCBTT0FQX0hUVFBfRVJST1IpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoIXBhdGgpCisgICAgcGF0aCA9IHNvYXAtPmNvb2tpZV9wYXRoOworICBpZiAoIXBhdGgpCisgIHsgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIkNvb2tpZSBwYXRoIG5vdCBzZXQiLCBOVUxMLCBTT0FQX0hUVFBfRVJST1IpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoKnBhdGggPT0gJy8nKQorICAgIHBhdGgrKzsKKyAgZm9yIChwID0gJnNvYXAtPmNvb2tpZXMsIHEgPSAqcDsgcTsgcSA9ICpwKQorICAgIGlmICghc3RyY21wKHEtPm5hbWUsIG5hbWUpICYmICFzdHJjbXAocS0+ZG9tYWluLCBkb21haW4pICYmICFzdHJuY21wKHEtPnBhdGgsIHBhdGgsIHN0cmxlbihxLT5wYXRoKSkpCisgICAgeyBpZiAocS0+dmFsdWUpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBxLT52YWx1ZSk7CisgICAgICBpZiAocS0+ZG9tYWluKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcS0+ZG9tYWluKTsKKyAgICAgIGlmIChxLT5wYXRoKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcS0+cGF0aCk7CisgICAgICAqcCA9IHEtPm5leHQ7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgcSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHAgPSAmcS0+bmV4dDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9jb29raWVfdmFsdWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBpZiAoKHAgPSBzb2FwX2Nvb2tpZShzb2FwLCBuYW1lLCBkb21haW4sIHBhdGgpKSkKKyAgICByZXR1cm4gcC0+dmFsdWU7CisgIHJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX2Vudl9jb29raWVfdmFsdWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBpZiAoKHAgPSBzb2FwX2Nvb2tpZShzb2FwLCBuYW1lLCBkb21haW4sIHBhdGgpKSAmJiBwLT5lbnYpCisgICAgcmV0dXJuIHAtPnZhbHVlOworICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2xvbmcKK1NPQVBfRk1BQzIKK3NvYXBfY29va2llX2V4cGlyZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGlmICgocCA9IHNvYXBfY29va2llKHNvYXAsIG5hbWUsIGRvbWFpbiwgcGF0aCkpKQorICAgIHJldHVybiBwLT5leHBpcmU7CisgIHJldHVybiAtMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZXRfY29va2llX2V4cGlyZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgbG9uZyBleHBpcmUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBpZiAoKHAgPSBzb2FwX2Nvb2tpZShzb2FwLCBuYW1lLCBkb21haW4sIHBhdGgpKSkKKyAgeyBwLT5leHBpcmUgPSBleHBpcmU7CisgICAgcC0+bW9kaWZpZWQgPSAxOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIHJldHVybiBTT0FQX0VSUjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZXRfY29va2llX3Nlc3Npb24oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBpZiAoKHAgPSBzb2FwX2Nvb2tpZShzb2FwLCBuYW1lLCBkb21haW4sIHBhdGgpKSkKKyAgeyBwLT5zZXNzaW9uID0gMTsKKyAgICBwLT5tb2RpZmllZCA9IDE7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgcmV0dXJuIFNPQVBfRVJSOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2Nscl9jb29raWVfc2Vzc2lvbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGlmICgocCA9IHNvYXBfY29va2llKHNvYXAsIG5hbWUsIGRvbWFpbiwgcGF0aCkpKQorICB7IHAtPnNlc3Npb24gPSAwOworICAgIHAtPm1vZGlmaWVkID0gMTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICByZXR1cm4gU09BUF9FUlI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0c2V0Y29va2llcyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBjaGFyICpzLCB0bXBbNDA5Nl07CisgIGNvbnN0IGNoYXIgKnQ7CisgIGZvciAocCA9IHNvYXAtPmNvb2tpZXM7IHA7IHAgPSBwLT5uZXh0KQorICB7IGlmIChwLT5tb2RpZmllZCB8fCAhcC0+ZW52KQorICAgIHsgcyA9IHRtcDsKKyAgICAgIGlmIChwLT5uYW1lKQorICAgICAgICBzICs9IHNvYXBfZW5jb2RlX2Nvb2tpZShwLT5uYW1lLCBzLCB0bXAtcys0MDY0KTsKKyAgICAgIGlmIChwLT52YWx1ZSAmJiAqcC0+dmFsdWUpCisgICAgICB7ICpzKysgPSAnPSc7CisgICAgICAgIHMgKz0gc29hcF9lbmNvZGVfY29va2llKHAtPnZhbHVlLCBzLCB0bXAtcys0MDY0KTsKKyAgICAgIH0KKyAgICAgIGlmIChwLT5kb21haW4gJiYgKGludClzdHJsZW4ocC0+ZG9tYWluKSA8IHRtcC1zKzQwNjQpCisgICAgICAgIHNwcmludGYocywgIjtEb21haW49XCIlc1wiIiwgcC0+ZG9tYWluKTsKKyAgICAgIGVsc2UgaWYgKHNvYXAtPmNvb2tpZV9kb21haW4gJiYgKGludClzdHJsZW4oc29hcC0+Y29va2llX2RvbWFpbikgPCB0bXAtcys0MDY0KQorICAgICAgICBzcHJpbnRmKHMsICI7RG9tYWluPVwiJXNcIiIsIHNvYXAtPmNvb2tpZV9kb21haW4pOworICAgICAgc3RyY2F0KHMsICI7UGF0aD1cIi8iKTsKKyAgICAgIGlmIChwLT5wYXRoKQorICAgICAgICB0ID0gcC0+cGF0aDsKKyAgICAgIGVsc2UKKyAgICAgICAgdCA9IHNvYXAtPmNvb2tpZV9wYXRoOworICAgICAgaWYgKHQpCisgICAgICB7IGlmICgqdCA9PSAnLycpCisgICAgICAgICAgdCsrOworICAgICAgICBpZiAoKGludClzdHJsZW4odCkgPCB0bXAtcys0MDY0KQorICAgICAgICAgIHN0cmNhdChzLCB0KTsKKyAgICAgIH0KKyAgICAgIHMgKz0gc3RybGVuKHMpOworICAgICAgKnMrKyA9ICciJzsKKyAgICAgIGlmIChwLT52ZXJzaW9uID4gMCkKKyAgICAgICAgc3ByaW50ZihzLCAiO1ZlcnNpb249JXUiLCBwLT52ZXJzaW9uKTsKKyAgICAgIGlmIChwLT5leHBpcmUgPj0gMCkKKyAgICAgICAgc3ByaW50ZihzLCAiO01heC1BZ2U9JWxkIiwgcC0+ZXhwaXJlKTsKKyAgICAgIGlmIChwLT5zZWN1cmUpCisgICAgICAgIHN0cmNhdChzLCAiO1NlY3VyZSIpOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTZXQtQ29va2llOiAlc1xuIiwgdG1wKSk7CisgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlNldC1Db29raWUiLCB0bXApKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRjb29raWVzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgsIGludCBzZWN1cmUpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqKnAsICpxOworICB1bnNpZ25lZCBpbnQgdmVyc2lvbiA9IDA7CisgIHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOworICBjaGFyICpzLCB0bXBbNDA5Nl07CisgIHAgPSAmc29hcC0+Y29va2llczsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTZW5kaW5nIGNvb2tpZXMgZm9yIGRvbWFpbj0lcyBwYXRoPSVzXG4iLCBkb21haW4sIHBhdGgpKTsKKyAgaWYgKCpwYXRoID09ICcvJykKKyAgICBwYXRoKys7CisgIHdoaWxlICgocSA9ICpwKSkKKyAgeyBpZiAocS0+ZXhwaXJlICYmIG5vdyA+IHEtPmV4cGlyZSkKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29va2llICVzIGV4cGlyZWRcbiIsIHEtPm5hbWUpKTsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBxLT5uYW1lKTsKKyAgICAgIGlmIChxLT52YWx1ZSkKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHEtPnZhbHVlKTsKKyAgICAgIGlmIChxLT5kb21haW4pCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBxLT5kb21haW4pOworICAgICAgaWYgKHEtPnBhdGgpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBxLT5wYXRoKTsKKyAgICAgICpwID0gcS0+bmV4dDsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBxKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgc2l6ZV90IGRvbWxlbiA9IDA7CisgICAgICBpZiAocS0+ZG9tYWluKQorICAgICAgeyBjb25zdCBjaGFyICpzID0gc3RyY2hyKHEtPmRvbWFpbiwgJzonKTsKKyAgICAgICAgaWYgKHMpCisJICBkb21sZW4gPSBzIC0gcS0+ZG9tYWluOworCWVsc2UKKyAgICAgICAgICBkb21sZW4gPSBzdHJsZW4ocS0+ZG9tYWluKTsKKyAgICAgIH0KKyAgICAgIGlmICgoIXEtPmRvbWFpbiB8fCAhc3RybmNtcChxLT5kb21haW4sIGRvbWFpbiwgZG9tbGVuKSkKKyAgICAgICAgICAmJiAoIXEtPnBhdGggfHwgIXN0cm5jbXAocS0+cGF0aCwgcGF0aCwgc3RybGVuKHEtPnBhdGgpKSkKKyAgICAgICAgICAmJiAoIXEtPnNlY3VyZSB8fCBzZWN1cmUpKQorICAgICAgeyBzID0gdG1wOworICAgICAgICBpZiAocS0+dmVyc2lvbiAhPSB2ZXJzaW9uKQorICAgICAgICB7IHNwcmludGYocywgIiRWZXJzaW9uPSV1OyIsIHEtPnZlcnNpb24pOworICAgICAgICAgIHZlcnNpb24gPSBxLT52ZXJzaW9uOworICAgICAgICB9CisgICAgICAgIGlmIChxLT5uYW1lKQorICAgICAgICAgIHMgKz0gc29hcF9lbmNvZGVfY29va2llKHEtPm5hbWUsIHMsIHRtcC1zKzQwODApOworICAgICAgICBpZiAocS0+dmFsdWUgJiYgKnEtPnZhbHVlKQorICAgICAgICB7ICpzKysgPSAnPSc7CisgICAgICAgICAgcyArPSBzb2FwX2VuY29kZV9jb29raWUocS0+dmFsdWUsIHMsIHRtcC1zKzQwODApOworICAgICAgICB9CisgICAgICAgIGlmIChxLT5wYXRoICYmIChpbnQpc3RybGVuKHEtPnBhdGgpIDwgdG1wLXMrNDA4MCkKKyAgICAgICAgeyBzcHJpbnRmKHMsICI7JFBhdGg9XCIvJXNcIiIsICgqcS0+cGF0aCA9PSAnLycgPyBxLT5wYXRoICsgMSA6IHEtPnBhdGgpKTsKKyAgICAgICAgICBzICs9IHN0cmxlbihzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocS0+ZG9tYWluICYmIChpbnQpc3RybGVuKHEtPmRvbWFpbikgPCB0bXAtcys0MDgwKQorICAgICAgICAgIHNwcmludGYocywgIjskRG9tYWluPVwiJXNcIiIsIHEtPmRvbWFpbik7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29va2llOiAlc1xuIiwgdG1wKSk7CisgICAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQ29va2llIiwgdG1wKSkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgICAgcCA9ICZxLT5uZXh0OworICAgIH0KKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0Y29va2llcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdmFsKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnAgPSBOVUxMLCAqcTsKKyAgY29uc3QgY2hhciAqczsKKyAgY2hhciAqdCwgdG1wWzQwOTZdOyAvKiBjb29raWUgc2l6ZSBpcyB1cCB0byA0MDk2IGJ5dGVzIFtSRkMyMTA5XSAqLworICBjaGFyICpkb21haW4gPSBOVUxMOworICBjaGFyICpwYXRoID0gTlVMTDsKKyAgdW5zaWduZWQgaW50IHZlcnNpb24gPSAwOworICB0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKKyAgaWYgKCF2YWwpCisgICAgcmV0dXJuOworICBzID0gdmFsOworICB3aGlsZSAoKnMpCisgIHsgcyA9IHNvYXBfZGVjb2RlX2tleSh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICBpZiAoIXNvYXBfdGFnX2NtcCh0bXAsICIkVmVyc2lvbiIpKQorICAgIHsgaWYgKChzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpKSkKKyAgICAgIHsgaWYgKHApCisgICAgICAgICAgcC0+dmVyc2lvbiA9IChpbnQpYXRvbCh0bXApOworICAgICAgICBlbHNlCisgICAgICAgICAgdmVyc2lvbiA9IChpbnQpYXRvbCh0bXApOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHRtcCwgIiRQYXRoIikpCisgICAgeyBzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgICAgaWYgKCp0bXApCisgICAgICB7IGlmICgodCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4odG1wKSsxKSkpCisgICAgICAgICAgc3RyY3B5KHQsIHRtcCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHQgPSBOVUxMOworICAgICAgaWYgKHApCisgICAgICB7IGlmIChwLT5wYXRoKQorICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5wYXRoKTsKKyAgICAgICAgcC0+cGF0aCA9IHQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IGlmIChwYXRoKQorICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwYXRoKTsKKyAgICAgICAgcGF0aCA9IHQ7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAodG1wLCAiJERvbWFpbiIpKQorICAgIHsgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgIGlmICgqdG1wKQorICAgICAgeyBpZiAoKHQgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHRtcCkrMSkpKQorICAgICAgICAgIHN0cmNweSh0LCB0bXApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB0ID0gTlVMTDsKKyAgICAgIGlmIChwKQorICAgICAgeyBpZiAocC0+ZG9tYWluKQorICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5kb21haW4pOworCXAtPmRvbWFpbiA9IHQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IGlmIChkb21haW4pCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIGRvbWFpbik7CisgICAgICAgIGRvbWFpbiA9IHQ7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHAgJiYgIXNvYXBfdGFnX2NtcCh0bXAsICJQYXRoIikpCisgICAgeyBpZiAocC0+cGF0aCkKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnBhdGgpOworICAgICAgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgIGlmICgqdG1wKQorICAgICAgeyBpZiAoKHAtPnBhdGggPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHRtcCkrMSkpKQorICAgICAgICAgIHN0cmNweShwLT5wYXRoLCB0bXApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBwLT5wYXRoID0gTlVMTDsKKyAgICB9CisgICAgZWxzZSBpZiAocCAmJiAhc29hcF90YWdfY21wKHRtcCwgIkRvbWFpbiIpKQorICAgIHsgaWYgKHAtPmRvbWFpbikKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPmRvbWFpbik7CisgICAgICBzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgICAgaWYgKCp0bXApCisgICAgICB7IGlmICgocC0+ZG9tYWluID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbih0bXApKzEpKSkKKyAgICAgICAgICBzdHJjcHkocC0+ZG9tYWluLCB0bXApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBwLT5kb21haW4gPSBOVUxMOworICAgIH0KKyAgICBlbHNlIGlmIChwICYmICFzb2FwX3RhZ19jbXAodG1wLCAiVmVyc2lvbiIpKQorICAgIHsgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgIHAtPnZlcnNpb24gPSAodW5zaWduZWQgaW50KWF0b2wodG1wKTsKKyAgICB9CisgICAgZWxzZSBpZiAocCAmJiAhc29hcF90YWdfY21wKHRtcCwgIk1heC1BZ2UiKSkKKyAgICB7IHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICBwLT5leHBpcmUgPSBub3cgKyBhdG9sKHRtcCk7CisgICAgfQorICAgIGVsc2UgaWYgKHAgJiYgIXNvYXBfdGFnX2NtcCh0bXAsICJFeHBpcmVzIikpCisgICAgeyBzdHJ1Y3QgdG0gVDsKKyAgICAgIGNoYXIgYVszXTsgCisgICAgICBzdGF0aWMgY29uc3QgY2hhciBtbnNbXSA9ICJhbmViYXJwcmF5dW51bHVnZXBjdG92ZWMiOworICAgICAgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgIGlmIChzdHJsZW4odG1wKSA+IDIwKQorICAgICAgeyBtZW1zZXQoKHZvaWQqKSZULCAwLCBzaXplb2YoVCkpOworICAgICAgICBhWzBdID0gdG1wWzRdOworICAgICAgICBhWzFdID0gdG1wWzVdOworICAgICAgICBhWzJdID0gJ1wwJzsKKyAgICAgICAgVC50bV9tZGF5ID0gKGludClhdG9sKGEpOworICAgICAgICBhWzBdID0gdG1wWzhdOworICAgICAgICBhWzFdID0gdG1wWzldOworICAgICAgICBULnRtX21vbiA9IChzdHJzdHIobW5zLCBhKSAtIG1ucykgLyAyOworICAgICAgICBhWzBdID0gdG1wWzExXTsKKyAgICAgICAgYVsxXSA9IHRtcFsxMl07CisgICAgICAgIFQudG1feWVhciA9IDEwMCArIChpbnQpYXRvbChhKTsKKyAgICAgICAgYVswXSA9IHRtcFsxM107CisgICAgICAgIGFbMV0gPSB0bXBbMTRdOworICAgICAgICBULnRtX2hvdXIgPSAoaW50KWF0b2woYSk7CisgICAgICAgIGFbMF0gPSB0bXBbMTZdOworICAgICAgICBhWzFdID0gdG1wWzE3XTsKKyAgICAgICAgVC50bV9taW4gPSAoaW50KWF0b2woYSk7CisgICAgICAgIGFbMF0gPSB0bXBbMTldOworICAgICAgICBhWzFdID0gdG1wWzIwXTsKKyAgICAgICAgVC50bV9zZWMgPSAoaW50KWF0b2woYSk7CisgICAgICAgIHAtPmV4cGlyZSA9IHNvYXBfdGltZWdtKCZUKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAocCAmJiAhc29hcF90YWdfY21wKHRtcCwgIlNlY3VyZSIpKQorICAgICAgcC0+c2VjdXJlID0gMTsKKyAgICBlbHNlCisgICAgeyBpZiAocCkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHb3QgZW52aXJvbm1lbnQgY29va2llICVzPSVzIGRvbWFpbj0lcyBwYXRoPSVzIGV4cGlyZT0lbGQgc2VjdXJlPSVkXG4iLCBwLT5uYW1lLCBwLT52YWx1ZT9wLT52YWx1ZToiIiwgcC0+ZG9tYWluP3AtPmRvbWFpbjoiIiwgcC0+cGF0aD9wLT5wYXRoOiIiLCBwLT5leHBpcmUsIHAtPnNlY3VyZSkpOworICAgICAgICBpZiAoKHEgPSBzb2FwX3NldF9jb29raWUoc29hcCwgcC0+bmFtZSwgcC0+dmFsdWUsIHAtPmRvbWFpbiwgcC0+cGF0aCkpKQorICAgICAgICB7IHEtPnZlcnNpb24gPSBwLT52ZXJzaW9uOworICAgICAgICAgIHEtPmV4cGlyZSA9IHAtPmV4cGlyZTsKKyAgICAgICAgICBxLT5zZWN1cmUgPSBwLT5zZWN1cmU7CisgICAgICAgICAgcS0+ZW52ID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAocC0+bmFtZSkKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+bmFtZSk7CisgICAgICAgIGlmIChwLT52YWx1ZSkKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+dmFsdWUpOworICAgICAgICBpZiAocC0+ZG9tYWluKQorICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5kb21haW4pOworICAgICAgICBpZiAocC0+cGF0aCkKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+cGF0aCk7CisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwKTsKKyAgICAgIH0KKyAgICAgIGlmICgocCA9IChzdHJ1Y3Qgc29hcF9jb29raWUqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9jb29raWUpKSkpCisgICAgICB7IHAtPm5hbWUgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHRtcCkrMSk7CisgICAgICAgIHN0cmNweShwLT5uYW1lLCB0bXApOworICAgICAgICBzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgICAgICBpZiAoKnRtcCkKKyAgICAgICAgeyBwLT52YWx1ZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4odG1wKSsxKTsKKyAgICAgICAgICBzdHJjcHkocC0+dmFsdWUsIHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHAtPnZhbHVlID0gTlVMTDsKKyAgICAgICAgcC0+ZG9tYWluID0gZG9tYWluOworICAgICAgICBwLT5wYXRoID0gcGF0aDsKKyAgICAgICAgcC0+ZXhwaXJlID0gMDsKKyAgICAgICAgcC0+c2VjdXJlID0gMDsKKyAgICAgICAgcC0+dmVyc2lvbiA9IHZlcnNpb247CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChwKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR290IGVudmlyb25tZW50IGNvb2tpZSAlcz0lcyBkb21haW49JXMgcGF0aD0lcyBleHBpcmU9JWxkIHNlY3VyZT0lZFxuIiwgcC0+bmFtZSwgcC0+dmFsdWU/cC0+dmFsdWU6IiIsIHAtPmRvbWFpbj9wLT5kb21haW46IiIsIHAtPnBhdGg/cC0+cGF0aDoiIiwgcC0+ZXhwaXJlLCBwLT5zZWN1cmUpKTsKKyAgICBpZiAoKHEgPSBzb2FwX3NldF9jb29raWUoc29hcCwgcC0+bmFtZSwgcC0+dmFsdWUsIHAtPmRvbWFpbiwgcC0+cGF0aCkpKQorICAgIHsgcS0+dmVyc2lvbiA9IHAtPnZlcnNpb247CisgICAgICBxLT5leHBpcmUgPSBwLT5leHBpcmU7CisgICAgICBxLT5zZWN1cmUgPSBwLT5zZWN1cmU7CisgICAgICBxLT5lbnYgPSAxOworICAgIH0KKyAgICBpZiAocC0+bmFtZSkKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5uYW1lKTsKKyAgICBpZiAocC0+dmFsdWUpCisgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+dmFsdWUpOworICAgIGlmIChwLT5kb21haW4pCisgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+ZG9tYWluKTsKKyAgICBpZiAocC0+cGF0aCkKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5wYXRoKTsKKyAgICBTT0FQX0ZSRUUoc29hcCwgcCk7CisgIH0KKyAgaWYgKGRvbWFpbikKKyAgICBTT0FQX0ZSRUUoc29hcCwgZG9tYWluKTsKKyAgaWYgKHBhdGgpCisgICAgU09BUF9GUkVFKHNvYXAsIHBhdGgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldGVudl9jb29raWVzKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGNvbnN0IGNoYXIgKnM7CisgIGNoYXIga2V5WzQwOTZdLCB2YWxbNDA5Nl07IC8qIGNvb2tpZSBzaXplIGlzIHVwIHRvIDQwOTYgYnl0ZXMgW1JGQzIxMDldICovCisgIGlmICghKHMgPSBnZXRlbnYoIkhUVFBfQ09PS0lFIikpKQorICAgIHJldHVybiBTT0FQX0VSUjsKKyAgZG8KKyAgeyBzID0gc29hcF9kZWNvZGVfa2V5KGtleSwgc2l6ZW9mKGtleSksIHMpOworICAgIHMgPSBzb2FwX2RlY29kZV92YWwodmFsLCBzaXplb2YodmFsKSwgcyk7CisgICAgcCA9IHNvYXBfc2V0X2Nvb2tpZShzb2FwLCBrZXksIHZhbCwgTlVMTCwgTlVMTCk7CisgICAgaWYgKHApCisgICAgICBwLT5lbnYgPSAxOworICB9IHdoaWxlICgqcyk7CisgIHJldHVybiBTT0FQX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQorc3RydWN0IHNvYXBfY29va2llKgorU09BUF9GTUFDMgorc29hcF9jb3B5X2Nvb2tpZXMoc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcCwgKipxLCAqcjsKKyAgcSA9ICZyOworICBmb3IgKHAgPSBzb2FwLT5jb29raWVzOyBwOyBwID0gcC0+bmV4dCkKKyAgeyBpZiAoISgqcSA9IChzdHJ1Y3Qgc29hcF9jb29raWUqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9jb29raWUpKSkpCisgICAgICByZXR1cm4gcjsKKyAgICAqKnEgPSAqcDsKKyAgICBpZiAocC0+bmFtZSkKKyAgICB7IGlmICgoKCpxKS0+bmFtZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4ocC0+bmFtZSkrMSkpKQorICAgICAgICBzdHJjcHkoKCpxKS0+bmFtZSwgcC0+bmFtZSk7CisgICAgfQorICAgIGlmIChwLT52YWx1ZSkKKyAgICB7IGlmICgoKCpxKS0+dmFsdWUgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHAtPnZhbHVlKSsxKSkpCisgICAgICAgIHN0cmNweSgoKnEpLT52YWx1ZSwgcC0+dmFsdWUpOworICAgIH0KKyAgICBpZiAocC0+ZG9tYWluKQorICAgIHsgaWYgKCgoKnEpLT5kb21haW4gPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHAtPmRvbWFpbikrMSkpKQorICAgICAgICBzdHJjcHkoKCpxKS0+ZG9tYWluLCBwLT5kb21haW4pOworICAgIH0KKyAgICBpZiAocC0+cGF0aCkKKyAgICB7IGlmICgoKCpxKS0+cGF0aCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4ocC0+cGF0aCkrMSkpKQorICAgICAgICBzdHJjcHkoKCpxKS0+cGF0aCwgcC0+cGF0aCk7CisgICAgfQorICAgIHEgPSAmKCpxKS0+bmV4dDsKKyAgfQorICAqcSA9IE5VTEw7CisgIHJldHVybiByOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9mcmVlX2Nvb2tpZXMoc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgZm9yIChwID0gc29hcC0+Y29va2llczsgcDsgcCA9IHNvYXAtPmNvb2tpZXMpCisgIHsgc29hcC0+Y29va2llcyA9IHAtPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIHAtPm5hbWUpOworICAgIGlmIChwLT52YWx1ZSkKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT52YWx1ZSk7CisgICAgaWYgKHAtPmRvbWFpbikKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5kb21haW4pOworICAgIGlmIChwLT5wYXRoKQorICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnBhdGgpOworICAgIFNPQVBfRlJFRShzb2FwLCBwKTsKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2VuZGlmIC8qIFdJVEhfQ09PS0lFUyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFdJVEhfR1pJUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NvYXBfZ2V0Z3ppcGhkcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaW50IGk7CisgIHNvYXBfd2NoYXIgYywgZiA9IDA7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR2V0IGd6aXAgaGVhZGVyXG4iKSk7CisgIGZvciAoaSA9IDA7IGkgPCA5OyBpKyspCisgIHsgaWYgKChpbnQpKGMgPSBzb2FwX2dldDEoc29hcCkgPT0gRU9GKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgIGlmIChpID09IDIpCisgICAgICBmID0gYzsKKyAgfQorICBpZiAoZiAmIDB4MDQpIC8qIEZFWFRSQSAqLworICB7IGZvciAoaSA9IHNvYXBfZ2V0MShzb2FwKSB8IChzb2FwX2dldDEoc29hcCkgPDwgOCk7IGk7IGktLSkKKyAgICAgIGlmICgoaW50KXNvYXBfZ2V0MShzb2FwKSA9PSBFT0YpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICB9CisgIGlmIChmICYgMHgwOCkgLyogRk5BTUUgKi8KKyAgICBkbworICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICB3aGlsZSAoYyAmJiAoaW50KWMgIT0gRU9GKTsKKyAgaWYgKChpbnQpYyAhPSBFT0YgJiYgKGYgJiAweDEwKSkgLyogRkNPTU1FTlQgKi8KKyAgICBkbworICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICB3aGlsZSAoYyAmJiAoaW50KWYgIT0gRU9GKTsKKyAgaWYgKChpbnQpYyAhPSBFT0YgJiYgKGYgJiAweDAxKSkgLyogRkhDUkMgKi8KKyAgeyBpZiAoKGludCkoYyA9IHNvYXBfZ2V0MShzb2FwKSkgIT0gRU9GKQorICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgfQorICBpZiAoKGludCljID09IEVPRikKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9iZWdpbl9yZWN2KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwX3djaGFyIGM7CisgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgc29hcF9mcmVlKHNvYXApOworICBzb2FwX3NldF9sb2NhbF9uYW1lc3BhY2VzKHNvYXApOworICBzb2FwLT52ZXJzaW9uID0gMDsJLyogZG9uJ3QgYXNzdW1lIHdlJ3JlIHBhcnNpbmcgU09BUCBjb250ZW50IGJ5IGRlZmF1bHQgKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgIHNvYXBfZnJlZV9paHQoc29hcCk7CisjZW5kaWYKKyAgaWYgKChzb2FwLT5pbW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgICAgc29hcC0+b21vZGUgfD0gU09BUF9JT19DSFVOSzsKKyAgc29hcC0+aW1vZGUgJj0gflNPQVBfSU87CisgIHNvYXAtPm1vZGUgPSBzb2FwLT5pbW9kZTsKKyAgaWYgKCFzb2FwLT5rZWVwX2FsaXZlKQorICB7IHNvYXAtPmJ1ZmxlbiA9IDA7CisgICAgc29hcC0+YnVmaWR4ID0gMDsKKyAgfQorICBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9JT19LRUVQQUxJVkUpKQorICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOworICBzb2FwLT5haGVhZCA9IDA7CisgIHNvYXAtPnBlZWtlZCA9IDA7CisgIHNvYXAtPmxldmVsID0gMDsKKyAgc29hcC0+cGFydCA9IFNPQVBfQkVHSU47CisgIHNvYXAtPmFsbG9jZWQgPSAwOworICBzb2FwLT5jb3VudCA9IDA7CisgIHNvYXAtPmxlbmd0aCA9IDA7CisgIHNvYXAtPmNkYXRhID0gMDsKKyAgKnNvYXAtPmVuZHBvaW50ID0gJ1wwJzsKKyAgc29hcC0+YWN0aW9uID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcC0+ZG9tID0gTlVMTDsKKyAgc29hcC0+ZGltZS5jaHVua3NpemUgPSAwOworICBzb2FwLT5kaW1lLmJ1ZmxlbiA9IDA7CisgIHNvYXAtPmRpbWUubGlzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmxhc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmxpc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5sYXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5ib3VuZGFyeSA9IE5VTEw7CisgIHNvYXAtPm1pbWUuc3RhcnQgPSBOVUxMOworICBzb2FwLT54bGlzdCA9IE5VTEw7CisjZW5kaWYKKyNpZmRlZiBXSU4zMgorI2lmbmRlZiBVTkRFUl9DRQorI2lmbmRlZiBXSVRIX0ZBU1RDR0kKKyAgaWYgKCFzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorI2lmZGVmIF9fQk9STEFORENfXworICAgIHNldG1vZGUoKFNPQVBfU09DS0VUKXNvYXAtPnJlY3ZmZCwgT19CSU5BUlkpOworI2Vsc2UKKyAgICBfc2V0bW9kZSgoU09BUF9TT0NLRVQpc29hcC0+cmVjdmZkLCBfT19CSU5BUlkpOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgV0lUSF9aTElCCisgIHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX1pMSUI7CisgIHNvYXAtPnpsaWJfaW4gPSBTT0FQX1pMSUJfTk9ORTsKKyAgc29hcC0+emxpYl9vdXQgPSBTT0FQX1pMSUJfTk9ORTsKKyAgc29hcC0+ZF9zdHJlYW0ubmV4dF9pbiA9IFpfTlVMTDsKKyAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4gPSAwOworICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IChCeXRlKilzb2FwLT5idWY7CisgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCA9IFNPQVBfQlVGTEVOOworICBzb2FwLT56X3JhdGlvX2luID0gMS4wOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5mcHJlcGFyZWluaXQpCisgICAgc29hcC0+ZnByZXBhcmVpbml0KHNvYXApOworI2VuZGlmCisgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisjaWZkZWYgV0lUSF9HWklQCisgIGlmIChjID09IDB4MUYpCisgIHsgaWYgKHNvYXBfZ2V0Z3ppcGhkcihzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAoaW5mbGF0ZUluaXQyKCZzb2FwLT5kX3N0cmVhbSwgLU1BWF9XQklUUykgIT0gWl9PSykKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX0lORkxBVEU7CisgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19aTElCOworICAgIHNvYXAtPnpsaWJfaW4gPSBTT0FQX1pMSUJfR1pJUDsKKyAgICBzb2FwLT56X2NyYyA9IGNyYzMyKDBMLCBOVUxMLCAwKTsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImd6aXAgaW5pdGlhbGl6ZWRcbiIpKTsKKyAgICBtZW1jcHkoc29hcC0+el9idWYsIHNvYXAtPmJ1ZiwgU09BUF9CVUZMRU4pOworICAgIC8qIHNob3VsZCBub3QgY2h1bmsgb3ZlciBwbGFpbiB0cmFuc3BvcnQsIHNvIHdoeSBib3RoZXIgdG8gY2hlY2s/ICovCisgICAgLyogaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykgKi8KKyAgICAvKiAgIHNvYXAtPnpfYnVmbGVuID0gc29hcC0+YnVmaWR4OyAqLworICAgIC8qIGVsc2UgKi8KKyAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X2luID0gKEJ5dGUqKShzb2FwLT56X2J1ZiArIHNvYXAtPmJ1ZmlkeCk7CisgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4gPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgc29hcC0+el9idWZsZW4gPSBzb2FwLT5idWZsZW47CisgICAgc29hcC0+YnVmbGVuID0gc29hcC0+YnVmaWR4OworICAgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgIH0gIAorI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChjID09ICctJyAmJiBzb2FwX2dldDAoc29hcCkgPT0gJy0nKQorICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfTUlNRTsKKyAgZWxzZSBpZiAoKGMgJiAweEZGRkMpID09IChTT0FQX0RJTUVfVkVSU0lPTiB8IFNPQVBfRElNRV9NQikgJiYgKHNvYXBfZ2V0MChzb2FwKSAmIDB4RkZGMCkgPT0gMHgyMCkKKyAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX0RJTUU7CisgIGVsc2UKKyNlbmRpZgorICB7IHdoaWxlIChzb2FwX2JsYW5rKGMpKQorICAgICAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgfQorICBpZiAoKGludCljID09IEVPRikKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgc29hcF91bmdldChzb2FwLCBjKTsKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyAgLyogaWYgbm90IFhNTCBvciAoc3RhcnQgb2YpQk9NIG9yIE1JTUUvRElNRS9aTElCLCBhc3N1bWUgSFRUUCBoZWFkZXIgKi8KKyAgaWYgKGMgIT0gJzwnICYmIGMgIT0gMHhFRiAmJiAhKHNvYXAtPm1vZGUgJiAoU09BUF9FTkNfTUlNRSB8IFNPQVBfRU5DX0RJTUUgfCBTT0FQX0VOQ19aTElCKSkpCisgIHsgc29hcC0+bW9kZSAmPSB+U09BUF9JTzsKKyAgICBzb2FwLT5lcnJvciA9IHNvYXAtPmZwYXJzZShzb2FwKTsKKyAgICBpZiAoc29hcC0+ZXJyb3IgJiYgc29hcC0+ZXJyb3IgPCBTT0FQX1NUT1ApCisgICAgeyBzb2FwLT5rZWVwX2FsaXZlID0gMDsgLyogZm9yY2UgY2xvc2UgbGF0ZXIgKi8KKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgICB7IHNvYXAtPmNodW5rYnVmbGVuID0gc29hcC0+YnVmbGVuOworICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+YnVmaWR4OworICAgICAgc29hcC0+Y2h1bmtzaXplID0gMDsKKyAgICB9CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgICAgZWxzZSBpZiAoc29hcC0+ZnByZXBhcmVyZWN2ICYmIHNvYXAtPmJ1ZmxlbiAhPSBzb2FwLT5idWZpZHgpCisgICAgICBzb2FwLT5mcHJlcGFyZXJlY3Yoc29hcCwgc29hcC0+YnVmICsgc29hcC0+YnVmaWR4LCBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHgpOworI2VuZGlmCisjaWZkZWYgV0lUSF9aTElCCisgICAgaWYgKHNvYXAtPnpsaWJfaW4gIT0gU09BUF9aTElCX05PTkUpCisgICAgeyAvKiBmcGFyc2Ugc2hvdWxkIG5vdCB1c2Ugc29hcF91bmdldCB0byBwdXNoIGJhY2sgbGFzdCBjaGFyICovCisjaWZkZWYgV0lUSF9HWklQCisgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgaWYgKGMgPT0gMHgxRikKKyAgICAgIHsgaWYgKHNvYXBfZ2V0Z3ppcGhkcihzb2FwKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIGlmIChpbmZsYXRlSW5pdDIoJnNvYXAtPmRfc3RyZWFtLCAtTUFYX1dCSVRTKSAhPSBaX09LKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICAgICAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9JTkZMQVRFOworICAgICAgICBzb2FwLT56X2NyYyA9IGNyYzMyKDBMLCBOVUxMLCAwKTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJnemlwIGluaXRpYWxpemVkXG4iKSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IHNvYXBfcmV2Z2V0MShzb2FwKTsKKyNlbHNlCisgICAgICB7CisjZW5kaWYKKyAgICAgICAgaWYgKGluZmxhdGVJbml0KCZzb2FwLT5kX3N0cmVhbSkgIT0gWl9PSykKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgICAgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfSU5GTEFURTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbmZsYXRlIGluaXRpYWxpemVkXG4iKSk7CisgICAgICB9CisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX1pMSUI7CisgICAgICBtZW1jcHkoc29hcC0+el9idWYsIHNvYXAtPmJ1ZiwgU09BUF9CVUZMRU4pOworICAgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9pbiA9IChCeXRlKikoc29hcC0+el9idWYgKyBzb2FwLT5idWZpZHgpOworICAgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4gPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgICBzb2FwLT56X2J1ZmxlbiA9IHNvYXAtPmJ1ZmxlbjsKKyAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmJ1ZmlkeDsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoc29hcC0+ZXJyb3IpCisgICAgeyBpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9GT1JNICYmIHNvYXAtPmZmb3JtKQorICAgICAgeyBzb2FwLT5lcnJvciA9IHNvYXAtPmZmb3JtKHNvYXApOworICAgICAgICBpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9PSykKKyAgICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfU1RPUDsgLyogcHJldmVudHMgZnVydGhlciBwcm9jZXNzaW5nICovCisgICAgICB9CisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICB9CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKQorICB7IGlmIChzb2FwX2dldG1pbWVoZHIoc29hcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgc29hcC0+bWltZS5maXJzdC0+dHlwZSwgImFwcGxpY2F0aW9uL2RpbWUiKSkKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfRElNRTsKKyAgfQorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpCisgIHsgaWYgKHNvYXBfZ2V0ZGltZWhkcihzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAoc29hcC0+ZGltZS5mbGFncyAmIFNPQVBfRElNRV9DRikKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ2h1bmtlZCBESU1FIFNPQVAgbWVzc2FnZVxuIikpOworICAgICAgc29hcC0+ZGltZS5jaHVua3NpemUgPSBzb2FwLT5kaW1lLnNpemU7CisgICAgICBpZiAoc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4ID49IHNvYXAtPmRpbWUuY2h1bmtzaXplKQorICAgICAgeyBzb2FwLT5kaW1lLmJ1ZmxlbiA9IHNvYXAtPmJ1ZmxlbjsKKyAgICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+YnVmaWR4ICsgc29hcC0+ZGltZS5jaHVua3NpemU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHNvYXAtPmRpbWUuY2h1bmtzaXplIC09IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICB9CisgICAgc29hcC0+Y291bnQgPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgIH0KKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK2h0dHBfcGFyc2Uoc3RydWN0IHNvYXAgKnNvYXApCit7IGNoYXIgaGVhZGVyW1NPQVBfSERSTEVOXSwgKnM7CisgIHVuc2lnbmVkIHNob3J0IGdldCA9IDAsIHN0YXR1cyA9IDAsIGsgPSAwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIldhaXRpbmcgZm9yIEhUVFAgcmVxdWVzdC9yZXNwb25zZS4uLlxuIikpOworICAqc29hcC0+ZW5kcG9pbnQgPSAnXDAnOworICBzb2FwLT5sZW5ndGggPSAwOworICBzb2FwLT51c2VyaWQgPSBOVUxMOworICBzb2FwLT5wYXNzd2QgPSBOVUxMOworICBzb2FwLT5hY3Rpb24gPSBOVUxMOworICBzb2FwLT5hdXRocmVhbG0gPSBOVUxMOworICBkbworICB7IGlmIChzb2FwX2dldGxpbmUoc29hcCwgc29hcC0+bXNnYnVmLCBzaXplb2Yoc29hcC0+bXNnYnVmKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkhUVFAgc3RhdHVzOiAlc1xuIiwgc29hcC0+bXNnYnVmKSk7CisgICAgZm9yICg7OykKKyAgICB7IGlmIChzb2FwX2dldGxpbmUoc29hcCwgaGVhZGVyLCBTT0FQX0hEUkxFTikpCisgICAgICB7IGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX0VPRikKKwl7IHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgICAgICAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiRU9GIGluIEhUVFAgaGVhZGVyLCBjb250aW51ZSBhbnl3YXlcbiIpKTsKKwkgIGJyZWFrOworCX0KKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgICAgaWYgKCEqaGVhZGVyKQorICAgICAgICBicmVhazsKKyAgICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJIVFRQIGhlYWRlcjogJXNcbiIsIGhlYWRlcikpOworICAgICAgcyA9IHN0cmNocihoZWFkZXIsICc6Jyk7CisgICAgICBpZiAocykKKyAgICAgIHsgKnMgPSAnXDAnOworICAgICAgICBkbyBzKys7CisgICAgICAgIHdoaWxlICgqcyAmJiAqcyA8PSAzMik7CisgICAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcGFyc2VoZHIoc29hcCwgaGVhZGVyLCBzKSkpCisgICAgICAgIHsgaWYgKHNvYXAtPmVycm9yIDwgU09BUF9TVE9QKQorCSAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisJICBzdGF0dXMgPSBzb2FwLT5lcnJvcjsKKwkgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAoKHMgPSBzdHJjaHIoc29hcC0+bXNnYnVmLCAnICcpKSkKKyAgICB7IGsgPSAodW5zaWduZWQgc2hvcnQpc29hcF9zdHJ0b3VsKHMsICZzLCAxMCk7CisgICAgICBpZiAoIXNvYXBfYmxhbmsoKnMpKQorICAgICAgICBrID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgICAgayA9IDA7CisgIH0gd2hpbGUgKGsgPT0gMTAwKTsKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZpbmlzaGVkIEhUVFAgaGVhZGVyIHBhcnNpbmdcbiIpKTsKKyAgcyA9IHN0cnN0cihzb2FwLT5tc2didWYsICJIVFRQLyIpOworICBpZiAocyAmJiBzWzddICE9ICcxJykKKyAgeyBpZiAoc29hcC0+a2VlcF9hbGl2ZSA9PSAxKQorICAgICAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7CisgICAgaWYgKGsgPT0gMCAmJiAoc29hcC0+b21vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKSAvKiBrID09IDAgZm9yIEhUVFAgcmVxdWVzdCAqLworICAgIHsgc29hcC0+aW1vZGUgfD0gU09BUF9JT19DSFVOSzsKKyAgICAgIHNvYXAtPm9tb2RlID0gKHNvYXAtPm9tb2RlICYgflNPQVBfSU8pIHwgU09BUF9JT19TVE9SRTsKKyAgICB9CisgIH0KKyAgaWYgKHNvYXAtPmtlZXBfYWxpdmUgPCAwKQorICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAxOworICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiS2VlcCBhbGl2ZSBjb25uZWN0aW9uID0gJWRcbiIsIHNvYXAtPmtlZXBfYWxpdmUpKTsKKyAgaWYgKHMgJiYgKCgoZ2V0ID0gIXN0cm5jbXAoc29hcC0+bXNnYnVmLCAiR0VUICIsIDQpKSkgfHwgIXN0cm5jbXAoc29hcC0+bXNnYnVmLCAiUE9TVCAiLCA1KSkpCisgIHsgc2l6ZV90IG0gPSBzdHJsZW4oc29hcC0+ZW5kcG9pbnQpOworICAgIHNpemVfdCBuID0gbSArIChzIC0gc29hcC0+bXNnYnVmKSAtIDUgLSAoIWdldCk7CisgICAgaWYgKG4gPj0gc2l6ZW9mKHNvYXAtPmVuZHBvaW50KSkKKyAgICAgIG4gPSBzaXplb2Yoc29hcC0+ZW5kcG9pbnQpIC0gMTsKKyAgICBzdHJuY3B5KHNvYXAtPnBhdGgsIHNvYXAtPm1zZ2J1ZiArIDQgKyAoIWdldCksIG4gLSBtKTsKKyAgICBzb2FwLT5wYXRoW24gLSBtXSA9ICdcMCc7CisgICAgc3RyY2F0KHNvYXAtPmVuZHBvaW50LCBzb2FwLT5wYXRoKTsKKyAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiVGFyZ2V0IGVuZHBvaW50PSclcydcbiIsIHNvYXAtPmVuZHBvaW50KSk7CisgICAgaWYgKGdldCkKKyAgICB7IHNvYXAtPmVycm9yID0gc29hcC0+ZmdldChzb2FwKTsKKyAgICAgIGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX09LKQorICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfU1RPUDsgLyogcHJldmVudHMgZnVydGhlciBwcm9jZXNzaW5nICovCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIGlmIChzdGF0dXMpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBzdGF0dXM7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgaWYgKGsgPT0gMCB8fCAoayA+PSAyMDAgJiYgayA8PSAyOTkpIHx8IGsgPT0gNDAwIHx8IGsgPT0gNTAwKQorICAgIHJldHVybiBTT0FQX09LOworICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiSFRUUCBlcnJvciAlZFxuIiwgaykpOworICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIkhUVFAgZXJyb3IiLCBzb2FwLT5tc2didWYsIGspOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50CitodHRwX3BhcnNlX2hlYWRlcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWwpCit7IGlmICghc29hcF90YWdfY21wKGtleSwgIkhvc3QiKSkKKyAgeyAKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICBpZiAoc29hcC0+aW1vZGUgJiBTT0FQX0VOQ19TU0wpCisgICAgICBzdHJjcHkoc29hcC0+ZW5kcG9pbnQsICJodHRwczovLyIpOworICAgIGVsc2UKKyNlbmRpZgorICAgICAgc3RyY3B5KHNvYXAtPmVuZHBvaW50LCAiaHR0cDovLyIpOworICAgIHN0cm5jYXQoc29hcC0+ZW5kcG9pbnQsIHZhbCwgc2l6ZW9mKHNvYXAtPmVuZHBvaW50KSAtIDgpOworICAgIHNvYXAtPmVuZHBvaW50W3NpemVvZihzb2FwLT5lbmRwb2ludCkgLSAxXSA9ICdcMCc7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LVR5cGUiKSkKKyAgeyBpZiAoc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwsICJhcHBsaWNhdGlvbi9kaW1lIikpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX0RJTUU7CisgICAgZWxzZSBpZiAoc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwsICJtdWx0aXBhcnQvcmVsYXRlZCIpCisgICAgICAgICAgfHwgc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwsICJtdWx0aXBhcnQvZm9ybS1kYXRhIikpCisgICAgeyBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gc29hcF9zdHJkdXAoc29hcCwgc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwsICJib3VuZGFyeSIpKTsKKyAgICAgIHNvYXAtPm1pbWUuc3RhcnQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCwgInN0YXJ0IikpOworICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19NSU1FOworICAgIH0KKyAgfQorI2VuZGlmCisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1MZW5ndGgiKSkKKyAgICBzb2FwLT5sZW5ndGggPSBzb2FwX3N0cnRvdWwodmFsLCBOVUxMLCAxMCk7CisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1FbmNvZGluZyIpKQorICB7IGlmICghc29hcF90YWdfY21wKHZhbCwgImRlZmxhdGUiKSkKKyNpZmRlZiBXSVRIX1pMSUIKKyAgICAgIHNvYXAtPnpsaWJfaW4gPSBTT0FQX1pMSUJfREVGTEFURTsKKyNlbHNlCisgICAgICByZXR1cm4gU09BUF9aTElCX0VSUk9SOworI2VuZGlmCisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcCh2YWwsICJnemlwIikpCisjaWZkZWYgV0lUSF9HWklQCisgICAgICBzb2FwLT56bGliX2luID0gU09BUF9aTElCX0daSVA7CisjZWxzZQorICAgICAgcmV0dXJuIFNPQVBfWkxJQl9FUlJPUjsKKyNlbmRpZgorICB9CisjaWZkZWYgV0lUSF9aTElCCisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQWNjZXB0LUVuY29kaW5nIikpCisgIHsKKyNpZmRlZiBXSVRIX0daSVAKKyAgICBpZiAoc3RyY2hyKHZhbCwgJyonKSB8fCBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCwgImd6aXAiKSkKKyAgICAgIHNvYXAtPnpsaWJfb3V0ID0gU09BUF9aTElCX0daSVA7CisgICAgZWxzZQorI2VuZGlmCisgICAgaWYgKHN0cmNocih2YWwsICcqJykgfHwgc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwsICJkZWZsYXRlIikpCisgICAgICBzb2FwLT56bGliX291dCA9IFNPQVBfWkxJQl9ERUZMQVRFOworICAgIGVsc2UKKyAgICAgIHNvYXAtPnpsaWJfb3V0ID0gU09BUF9aTElCX05PTkU7CisgIH0KKyNlbmRpZgorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIlRyYW5zZmVyLUVuY29kaW5nIikpCisgIHsgc29hcC0+bW9kZSAmPSB+U09BUF9JTzsKKyAgICBpZiAoIXNvYXBfdGFnX2NtcCh2YWwsICJjaHVua2VkIikpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fQ0hVTks7CisgIH0KKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb25uZWN0aW9uIikpCisgIHsgaWYgKCFzb2FwX3RhZ19jbXAodmFsLCAia2VlcC1hbGl2ZSIpKQorICAgICAgc29hcC0+a2VlcF9hbGl2ZSA9IC1zb2FwLT5rZWVwX2FsaXZlOworICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAodmFsLCAiY2xvc2UiKSkKKyAgICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOworICB9CisjaWZuZGVmIFdJVEhfTEVBTgorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkF1dGhvcml6YXRpb24iKSkKKyAgeyBpZiAoIXNvYXBfdGFnX2NtcCh2YWwsICJCYXNpYyAqIikpCisgICAgeyBpbnQgbjsKKyAgICAgIGNoYXIgKnM7CisgICAgICBzb2FwX2Jhc2U2NDJzKHNvYXAsIHZhbCArIDYsIHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZikgLSAxLCAmbik7CisgICAgICBzb2FwLT50bXBidWZbbl0gPSAnXDAnOworICAgICAgaWYgKChzID0gc3RyY2hyKHNvYXAtPnRtcGJ1ZiwgJzonKSkpCisgICAgICB7ICpzID0gJ1wwJzsKKwlzb2FwLT51c2VyaWQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT50bXBidWYpOworCXNvYXAtPnBhc3N3ZCA9IHNvYXBfc3RyZHVwKHNvYXAsIHMgKyAxKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJXV1ctQXV0aGVudGljYXRlIikpCisgICAgc29hcC0+YXV0aHJlYWxtID0gc29hcF9zdHJkdXAoc29hcCwgc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwgKyA2LCAicmVhbG0iKSk7CisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiRXhwZWN0IikpCisgIHsgaWYgKCFzb2FwX3RhZ19jbXAodmFsLCAiMTAwLWNvbnRpbnVlIikpCisgICAgeyBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkhUVFAvMS4xIDEwMCBDb250aW51ZSIsIE5VTEwpKQorICAgICAgIHx8IChzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsIE5VTEwsIE5VTEwpKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgfQorI2VuZGlmCisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiU09BUEFjdGlvbiIpKQorICB7IGlmICgqdmFsID09ICciJykKKyAgICB7IHNvYXAtPmFjdGlvbiA9IHNvYXBfc3RyZHVwKHNvYXAsIHZhbCArIDEpOworICAgICAgc29hcC0+YWN0aW9uW3N0cmxlbihzb2FwLT5hY3Rpb24pIC0gMV0gPSAnXDAnOworICAgIH0KKyAgfQorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkxvY2F0aW9uIikpCisgIHsgc3RybmNweShzb2FwLT5lbmRwb2ludCwgdmFsLCBzaXplb2Yoc29hcC0+ZW5kcG9pbnQpKTsKKyAgICBzb2FwLT5lbmRwb2ludFtzaXplb2Yoc29hcC0+ZW5kcG9pbnQpIC0gMV0gPSAnXDAnOworICB9CisjaWZkZWYgV0lUSF9DT09LSUVTCisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29va2llIikgfHwgIXNvYXBfdGFnX2NtcChrZXksICJTZXQtQ29va2llIikpCisgICAgc29hcF9nZXRjb29raWVzKHNvYXAsIHZhbCk7CisjZW5kaWYKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmICFkZWZpbmVkKFdJVEhfTk9IVFRQKSB8fCAhZGVmaW5lZChXSVRIX0xFQU5FUikKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbGluZSwgY29uc3QgY2hhciAqa2V5KQoreyByZWdpc3RlciBjb25zdCBjaGFyICpzID0gbGluZTsKKyAgaWYgKHMpCisgIHsgd2hpbGUgKCpzKQorICAgIHsgcmVnaXN0ZXIgc2hvcnQgZmxhZzsKKyAgICAgIHMgPSBzb2FwX2RlY29kZV9rZXkoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgcyk7CisgICAgICBmbGFnID0gc29hcF90YWdfY21wKHNvYXAtPnRtcGJ1Ziwga2V5KTsKKyAgICAgIHMgPSBzb2FwX2RlY29kZV92YWwoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgcyk7CisgICAgICBpZiAoIWZsYWcpCisgICAgICAgIHJldHVybiBzb2FwLT50bXBidWY7CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAhZGVmaW5lZChXSVRIX05PSFRUUCkgfHwgIWRlZmluZWQoV0lUSF9MRUFORVIpCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZGVjb2RlX2tleShjaGFyICpidWYsIHNpemVfdCBsZW4sIGNvbnN0IGNoYXIgKnZhbCkKK3sgcmV0dXJuIHNvYXBfZGVjb2RlKGJ1ZiwgbGVuLCB2YWwsICI9LDsiKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgIWRlZmluZWQoV0lUSF9OT0hUVFApIHx8ICFkZWZpbmVkKFdJVEhfTEVBTkVSKQorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2RlY29kZV92YWwoY2hhciAqYnVmLCBzaXplX3QgbGVuLCBjb25zdCBjaGFyICp2YWwpCit7IGlmICgqdmFsICE9ICc9JykKKyAgeyAqYnVmID0gJ1wwJzsKKyAgICByZXR1cm4gdmFsOworICB9CisgIHJldHVybiBzb2FwX2RlY29kZShidWYsIGxlbiwgdmFsICsgMSwgIiw7Iik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmICFkZWZpbmVkKFdJVEhfTk9IVFRQKSB8fCAhZGVmaW5lZChXSVRIX0xFQU5FUikKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY29uc3QgY2hhcioKK3NvYXBfZGVjb2RlKGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwgY29uc3QgY2hhciAqdmFsLCBjb25zdCBjaGFyICpzZXApCit7IGNvbnN0IGNoYXIgKnM7CisgIGNoYXIgKnQgPSBidWY7CisgIGZvciAocyA9IHZhbDsgKnM7IHMrKykKKyAgICBpZiAoKnMgIT0gJyAnICYmICpzICE9ICdcdCcgJiYgIXN0cmNocihzZXAsICpzKSkKKyAgICAgIGJyZWFrOworICBpZiAoKnMgPT0gJyInKQorICB7IHMrKzsKKyAgICB3aGlsZSAoKnMgJiYgKnMgIT0gJyInICYmIC0tbGVuKQorICAgICAgKnQrKyA9ICpzKys7CisgIH0KKyAgZWxzZQorICB7IHdoaWxlIChzb2FwX25vdGJsYW5rKCpzKSAmJiAhc3RyY2hyKHNlcCwgKnMpICYmIC0tbGVuKQorICAgIHsgaWYgKCpzID09ICclJykKKyAgICAgIHsgKnQrKyA9ICgoc1sxXSA+PSAnQScgPyAoc1sxXSAmIDB4NykgKyA5IDogc1sxXSAtICcwJykgPDwgNCkKKyAgICAgICAgICAgICAgKyAoc1syXSA+PSAnQScgPyAoc1syXSAmIDB4NykgKyA5IDogc1syXSAtICcwJyk7CisgICAgICAgIHMgKz0gMzsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgKnQrKyA9ICpzKys7CisgICAgfQorICB9CisgICp0ID0gJ1wwJzsKKyAgd2hpbGUgKCpzICYmICFzdHJjaHIoc2VwLCAqcykpCisgICAgcysrOworICByZXR1cm4gczsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VudmVsb3BlX2JlZ2luX291dChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc2l6ZV90IG4gPSAwOworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKSAmJiBzb2FwLT5taW1lLmJvdW5kYXJ5ICYmIHNvYXAtPm1pbWUuc3RhcnQpCisgIHsgY29uc3QgY2hhciAqczsKKyAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKSkKKyAgICAgIHMgPSAiYXBwbGljYXRpb24vZGltZSI7CisgICAgZWxzZSBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICAgICAgcyA9ICJhcHBsaWNhdGlvbi9zb2FwK3htbDsgY2hhcnNldD11dGYtOCI7CisgICAgZWxzZQorICAgICAgcyA9ICJ0ZXh0L3htbDsgY2hhcnNldD11dGYtOCI7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICItLSVzXHJcbkNvbnRlbnQtVHlwZTogJXNcclxuQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmluYXJ5XHJcbkNvbnRlbnQtSUQ6ICVzXHJcblxyXG4iLCBzb2FwLT5taW1lLmJvdW5kYXJ5LCBzLCBzb2FwLT5taW1lLnN0YXJ0KTsKKyAgICBuID0gc3RybGVuKHNvYXAtPnRtcGJ1Zik7CisgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgc29hcC0+dG1wYnVmLCBuKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICAgIHNvYXAtPmRpbWUuc2l6ZSA9IHNvYXAtPmNvdW50OwkvKiBESU1FIGluIE1JTUUgY29ycmVjdGlvbiAqLworICBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpICYmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkpCisgIHsgaWYgKHNvYXBfcHV0ZGltZWhkcihzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorI2VuZGlmCisgIHNvYXAtPnBhcnQgPSBTT0FQX0lOX0VOVkVMT1BFOworICByZXR1cm4gc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCAiU09BUC1FTlY6RW52ZWxvcGUiLCAwLCBOVUxMKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbnZlbG9wZV9lbmRfb3V0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgIlNPQVAtRU5WOkVudmVsb3BlIikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKSkKKyAgeyBzb2FwLT5kaW1lLnNpemUgPSBzb2FwLT5jb3VudCAtIHNvYXAtPmRpbWUuc2l6ZTsJLyogRElNRSBpbiBNSU1FIGNvcnJlY3Rpb24gKi8KKyAgICBzcHJpbnRmKHNvYXAtPmlkLCBzb2FwLT5kaW1lX2lkX2Zvcm1hdCwgMCk7CisgICAgc29hcC0+ZGltZS5pZCA9IHNvYXAtPmlkOworICAgIGlmIChzb2FwLT5sb2NhbF9uYW1lc3BhY2VzKQorICAgIHsgaWYgKHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbMF0ub3V0KQorICAgICAgICBzb2FwLT5kaW1lLnR5cGUgPSAoY2hhciopc29hcC0+bG9jYWxfbmFtZXNwYWNlc1swXS5vdXQ7CisgICAgICBlbHNlCisgICAgICAgIHNvYXAtPmRpbWUudHlwZSA9IChjaGFyKilzb2FwLT5sb2NhbF9uYW1lc3BhY2VzWzBdLm5zOworICAgIH0KKyAgICBzb2FwLT5kaW1lLm9wdGlvbnMgPSBOVUxMOworICAgIHNvYXAtPmRpbWUuZmxhZ3MgPSBTT0FQX0RJTUVfTUIgfCBTT0FQX0RJTUVfQUJTVVJJOworICAgIGlmICghc29hcC0+ZGltZS5maXJzdCkKKyAgICAgIHNvYXAtPmRpbWUuZmxhZ3MgfD0gU09BUF9ESU1FX01FOworICAgIHNvYXAtPmNvdW50ICs9IDEyICsgKChzdHJsZW4oc29hcC0+ZGltZS5pZCkrMykmKH4zKSkgKyAoKHN0cmxlbihzb2FwLT5kaW1lLnR5cGUpKzMpJih+MykpOworICB9CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpICYmICEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pKQorICAgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsIFNPQVBfU1RSX1BBRERJTkcsIC0obG9uZylzb2FwLT5kaW1lLnNpemUmMyk7CisjZW5kaWYKKyAgc29hcC0+cGFydCA9IFNPQVBfRU5EX0VOVkVMT1BFOworICByZXR1cm4gU09BUF9PSzsKK30gCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW52ZWxvcGVfYmVnaW5faW4oc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHN0cnVjdCBOYW1lc3BhY2UgKnA7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0lOX0VOVkVMT1BFOworICBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsICJTT0FQLUVOVjpFbnZlbG9wZSIsIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfVkVSU0lPTk1JU01BVENIOworICBwID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlczsKKyAgaWYgKHApCisgIHsgY29uc3QgY2hhciAqbnMgPSBwWzBdLm91dDsKKyAgICBpZiAoIW5zKQorICAgICAgbnMgPSBwWzBdLm5zOworICAgIGlmICghc3RyY21wKG5zLCBzb2FwX2VudjEpKQorICAgIHsgc29hcC0+dmVyc2lvbiA9IDE7IC8qIG1ha2Ugc3VyZSB3ZSB1c2UgU09BUCAxLjEgKi8KKyAgICAgIGlmIChwWzFdLm91dCkKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHBbMV0ub3V0KTsKKyAgICAgIGlmICgocFsxXS5vdXQgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHNvYXBfZW5jMSkpKSkKKyAgICAgICAgc3RyY3B5KHBbMV0ub3V0LCBzb2FwX2VuYzEpOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKG5zLCBzb2FwX2VudjIpKQorICAgIHsgc29hcC0+dmVyc2lvbiA9IDI7IC8qIG1ha2Ugc3VyZSB3ZSB1c2UgU09BUCAxLjIgKi8KKyAgICAgIGlmIChwWzFdLm91dCkKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHBbMV0ub3V0KTsKKyAgICAgIGlmICgocFsxXS5vdXQgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHNvYXBfZW5jMikpKSkKKyAgICAgICAgc3RyY3B5KHBbMV0ub3V0LCBzb2FwX2VuYzIpOworICAgIH0KKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbnZlbG9wZV9lbmRfaW4oc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPnBhcnQgPSBTT0FQX0VORF9FTlZFTE9QRTsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgIlNPQVAtRU5WOkVudmVsb3BlIik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYm9keV9iZWdpbl9vdXQoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPnBhcnQgPSBTT0FQX0lOX0JPRFk7CisgIGlmIChzb2FwLT52ZXJzaW9uID09IDEpCisgICAgc29hcC0+ZW5jb2RpbmcgPSAxOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU0VDKSAmJiBzb2FwX3NldF9hdHRyKHNvYXAsICJ3c3U6SWQiLCAiQm9keSIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNlbmRpZgorICBpZiAoc29hcF9lbGVtZW50KHNvYXAsICJTT0FQLUVOVjpCb2R5IiwgMCwgTlVMTCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X3N0YXJ0X2VuZF9vdXQoc29hcCwgTlVMTCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYm9keV9lbmRfb3V0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgIlNPQVAtRU5WOkJvZHkiKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0VORF9CT0RZOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9ib2R5X2JlZ2luX2luKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5wYXJ0ID0gU09BUF9JTl9CT0RZOworICBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsICJTT0FQLUVOVjpCb2R5IiwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoIXNvYXAtPmJvZHkpCisgICAgc29hcC0+cGFydCA9IFNPQVBfTk9fQk9EWTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYm9keV9lbmRfaW4oc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwLT5wYXJ0ID09IFNPQVBfTk9fQk9EWSkKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgc29hcC0+cGFydCA9IFNPQVBfRU5EX0JPRFk7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsICJTT0FQLUVOVjpCb2R5Iik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVjdl9oZWFkZXIoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwX2dldGhlYWRlcihzb2FwKSAmJiBzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2VuZHBvaW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICplbmRwb2ludCkKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKKyAgcmVnaXN0ZXIgc2l6ZV90IGksIG47CisgIHNvYXAtPmVuZHBvaW50WzBdID0gJ1wwJzsKKyAgc29hcC0+aG9zdFswXSA9ICdcMCc7CisgIHNvYXAtPnBhdGhbMF0gPSAnLyc7CisgIHNvYXAtPnBhdGhbMV0gPSAnXDAnOworICBzb2FwLT5wb3J0ID0gODA7CisgIGlmICghZW5kcG9pbnQgfHwgISplbmRwb2ludCkKKyAgICByZXR1cm47CisgIGlmICghc3RybmNtcChlbmRwb2ludCwgImh0dHBzOiIsIDYpKQorICAgIHNvYXAtPnBvcnQgPSA0NDM7CisgIHN0cm5jcHkoc29hcC0+ZW5kcG9pbnQsIGVuZHBvaW50LCBzaXplb2Yoc29hcC0+ZW5kcG9pbnQpIC0gMSk7CisgIHMgPSBzdHJjaHIoZW5kcG9pbnQsICc6Jyk7CisgIGlmIChzICYmIHNbMV0gPT0gJy8nICYmIHNbMl0gPT0gJy8nKQorICAgIHMgKz0gMzsKKyAgZWxzZQorICAgIHMgPSBlbmRwb2ludDsKKyAgbiA9IHN0cmxlbihzKTsKKyAgaWYgKG4gPj0gc2l6ZW9mKHNvYXAtPmhvc3QpKQorICAgIG4gPSBzaXplb2Yoc29hcC0+aG9zdCkgLSAxOworI2lmZGVmIFdJVEhfSVBWNgorICBpZiAoc1swXSA9PSAnWycpCisgIHsgcysrOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgeyBzb2FwLT5ob3N0W2ldID0gc1tpXTsKKyAgICAgIGlmIChzW2ldID09ICddJykKKyAgICAgIHsgcysrOworICAgICAgICBicmVhazsgCisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyAgeyBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIHsgc29hcC0+aG9zdFtpXSA9IHNbaV07CisgICAgICBpZiAoc1tpXSA9PSAnLycgfHwgc1tpXSA9PSAnOicpCisgICAgICAgIGJyZWFrOyAKKyAgICB9CisgIH0KKyNlbHNlCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgIHsgc29hcC0+aG9zdFtpXSA9IHNbaV07CisgICAgaWYgKHNbaV0gPT0gJy8nIHx8IHNbaV0gPT0gJzonKQorICAgICAgYnJlYWs7IAorICB9CisjZW5kaWYKKyAgc29hcC0+aG9zdFtpXSA9ICdcMCc7CisgIGlmIChzW2ldID09ICc6JykKKyAgeyBzb2FwLT5wb3J0ID0gKGludClhdG9sKHMgKyBpICsgMSk7CisgICAgZm9yIChpKys7IGkgPCBuOyBpKyspCisgICAgICBpZiAoc1tpXSA9PSAnLycpCisgICAgICAgIGJyZWFrOworICB9CisgIGlmIChzW2ldKQorICB7IHN0cm5jcHkoc29hcC0+cGF0aCwgcyArIGksIHNpemVvZihzb2FwLT5wYXRoKSk7CisgICAgc29hcC0+cGF0aFtzaXplb2Yoc29hcC0+cGF0aCkgLSAxXSA9ICdcMCc7CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9jb25uZWN0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICplbmRwb2ludCwgY29uc3QgY2hhciAqYWN0aW9uKQoreyByZXR1cm4gc29hcF9jb25uZWN0X2NvbW1hbmQoc29hcCwgU09BUF9QT1NULCBlbmRwb2ludCwgYWN0aW9uKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9jb25uZWN0X2NvbW1hbmQoc3RydWN0IHNvYXAgKnNvYXAsIGludCBodHRwX2NvbW1hbmQsIGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjb25zdCBjaGFyICphY3Rpb24pCit7IGNoYXIgaG9zdFtzaXplb2Yoc29hcC0+aG9zdCldOworICBpbnQgcG9ydDsKKyAgc2l6ZV90IGNvdW50OworICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIHN0cmNweShob3N0LCBzb2FwLT5ob3N0KTsgLyogc2F2ZSB0byBjb21wYXJlICovCisgIHBvcnQgPSBzb2FwLT5wb3J0OyAvKiBzYXZlIHRvIGNvbXBhcmUgKi8KKyAgc29hcF9zZXRfZW5kcG9pbnQoc29hcCwgZW5kcG9pbnQpOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+ZmNvbm5lY3QpCisgIHsgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZjb25uZWN0KHNvYXAsIGVuZHBvaW50LCBzb2FwLT5ob3N0LCBzb2FwLT5wb3J0KSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgZWxzZQorI2VuZGlmCisgIGlmIChzb2FwLT5mb3BlbiAmJiAqc29hcC0+aG9zdCkKKyAgeyBzb2FwLT5zdGF0dXMgPSBodHRwX2NvbW1hbmQ7CisgICAgaWYgKCFzb2FwLT5rZWVwX2FsaXZlIHx8ICFzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpIHx8IHN0cmNtcChzb2FwLT5ob3N0LCBob3N0KSB8fCBzb2FwLT5wb3J0ICE9IHBvcnQgfHwgIXNvYXAtPmZwb2xsIHx8IHNvYXAtPmZwb2xsKHNvYXApKQorICAgIHsgc29hcC0+a2VlcF9hbGl2ZSA9IDA7IC8qIHRvIGZvcmNlIGNsb3NlICovCisgICAgICBzb2FwLT5vbW9kZSAmPSB+U09BUF9JT19VRFA7IC8qIHRvIGZvcmNlIGNsb3NlICovCisgICAgICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJDb25uZWN0L3JlY29ubmVjdCB0byBob3N0PSclcycgcGF0aD0nJXMnIHBvcnQ9JWRcbiIsIHNvYXAtPmhvc3QsIHNvYXAtPnBhdGgsIHNvYXAtPnBvcnQpKTsKKyNpZmRlZiBXSVRIX1VEUAorICAgICAgaWYgKCFzdHJuY21wKGVuZHBvaW50LCAic29hcC51ZHA6IiwgOSkpCisgICAgICAgIHNvYXAtPm9tb2RlIHw9IFNPQVBfSU9fVURQOworI2VuZGlmCisgICAgICBzb2FwLT5zb2NrZXQgPSBzb2FwLT5mb3Blbihzb2FwLCBlbmRwb2ludCwgc29hcC0+aG9zdCwgc29hcC0+cG9ydCk7CisgICAgICBpZiAoc29hcC0+ZXJyb3IpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19LRUVQQUxJVkUpICE9IDApOworICAgIH0KKyAgfQorICBjb3VudCA9IHNvYXBfY291bnRfYXR0YWNobWVudHMoc29hcCk7CisgIGlmIChzb2FwX2JlZ2luX3NlbmQoc29hcCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmbmRlZiBXSVRIX05PSFRUUAorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSAhPSBTT0FQX0lPX1NUT1JFICYmICEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1hNTCkgJiYgZW5kcG9pbnQpCisgIHsgdW5zaWduZWQgaW50IGsgPSBzb2FwLT5tb2RlOworICAgIHNvYXAtPm1vZGUgJj0gfihTT0FQX0lPIHwgU09BUF9FTkNfWkxJQik7CisgICAgaWYgKChrICYgU09BUF9JTykgIT0gU09BUF9JT19GTFVTSCkKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19CVUZGRVI7CisgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0KHNvYXAsIGVuZHBvaW50LCBzb2FwLT5ob3N0LCBzb2FwLT5wb3J0LCBzb2FwLT5wYXRoLCBhY3Rpb24sIGNvdW50KSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgICAgaWYgKChrICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgICB7IGlmIChzb2FwX2ZsdXNoKHNvYXApKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorI2VuZGlmCisgICAgc29hcC0+bW9kZSA9IGs7CisgIH0KKyAgZWxzZSBpZiAoYWN0aW9uKQorICAgIHNvYXAtPmFjdGlvbiA9IHNvYXBfc3RyZHVwKHNvYXAsIGFjdGlvbik7CisgIGlmIChodHRwX2NvbW1hbmQgIT0gU09BUF9QT1NUKQorICAgIHJldHVybiBzb2FwX2VuZF9zZW5kKHNvYXApOworI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfczJiYXNlNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMsIGNoYXIgKnQsIGludCBuKQoreyByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBtOworICByZWdpc3RlciBjaGFyICpwOworICBpZiAoIXQpCisgICAgdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCAobiArIDIpIC8gMyAqIDQgKyAxKTsKKyAgaWYgKCF0KQorICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcCA9IHQ7CisgIHRbMF0gPSAnXDAnOworICBpZiAoIXMpCisgICAgcmV0dXJuIHA7CisgIGZvciAoOyBuID4gMjsgbiAtPSAzLCBzICs9IDMpCisgIHsgbSA9IHNbMF07CisgICAgbSA9IChtIDw8IDgpIHwgc1sxXTsKKyAgICBtID0gKG0gPDwgOCkgfCBzWzJdOworICAgIGZvciAoaSA9IDQ7IGkgPiAwOyBtID4+PSA2KQorICAgICAgdFstLWldID0gc29hcF9iYXNlNjRvW20gJiAweDNGXTsKKyAgICB0ICs9IDQ7CisgIH0KKyAgdFswXSA9ICdcMCc7CisgIGlmIChuID4gMCkKKyAgeyBtID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgbSA9IChtIDw8IDgpIHwgKnMrKzsKKyAgICBmb3IgKDsgaSA8IDM7IGkrKykKKyAgICAgIG0gPDw9IDg7CisgICAgZm9yIChpKys7IGkgPiAwOyBtID4+PSA2KQorICAgICAgdFstLWldID0gc29hcF9iYXNlNjRvW20gJiAweDNGXTsKKyAgICBmb3IgKGkgPSAzOyBpID4gbjsgaS0tKQorICAgICAgdFtpXSA9ICc9JzsKKyAgICB0WzRdID0gJ1wwJzsKKyAgfQorICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2Jhc2U2NDJzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBjaGFyICp0LCBzaXplX3QgbCwgaW50ICpuKQoreyByZWdpc3RlciBpbnQgaSwgaiwgYzsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBtOworICByZWdpc3RlciBjb25zdCBjaGFyICpwOworICBpZiAoIXMgfHwgISpzKQorICB7IGlmIChuKQorICAgICAgKm4gPSAwOworICAgIGlmIChzb2FwLT5lcnJvcikKKyAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBTT0FQX05PTl9OVUxMOworICB9CisgIGlmICghdCkKKyAgeyBsID0gKHN0cmxlbihzKSArIDMpIC8gNCAqIDM7CisgICAgdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBsKTsKKyAgfQorICBpZiAoIXQpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwID0gdDsKKyAgaWYgKG4pCisgICAgKm4gPSAwOworICBmb3IgKDs7KQorICB7IGZvciAoaSA9IDA7IGkgPCBTT0FQX0JMS0xFTjsgaSsrKQorICAgIHsgbSA9IDA7CisgICAgICBqID0gMDsKKyAgICAgIHdoaWxlIChqIDwgNCkKKyAgICAgIHsgYyA9ICpzKys7CisgICAgICAgIGlmIChjID09ICc9JyB8fCAhYykKKyAgICAgICAgeyBpICo9IDM7CisgICAgICAgICAgc3dpdGNoIChqKQorICAgICAgICAgIHsgY2FzZSAyOgorICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKChtID4+IDQpICYgMHhGRik7CisgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoKG0gPj4gMTApICYgMHhGRik7CisgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoKG0gPj4gMikgJiAweEZGKTsKKyAgICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobikKKwkgICAgKm4gKz0gaTsKKyAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgfQorICAgICAgICBjIC09ICcrJzsKKyAgICAgICAgaWYgKGMgPj0gMCAmJiBjIDw9IDc5KQorICAgICAgICB7IG0gPSAobSA8PCA2KSArIHNvYXBfYmFzZTY0aVtjXTsKKyAgICAgICAgICBqKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICp0KysgPSAoY2hhcikoKG0gPj4gMTYpICYgMHhGRik7CisgICAgICAqdCsrID0gKGNoYXIpKChtID4+IDgpICYgMHhGRik7CisgICAgICAqdCsrID0gKGNoYXIpKG0gJiAweEZGKTsKKyAgICAgIGlmIChsIDwgMykKKyAgICAgIHsgaWYgKG4pCisJICAqbiArPSBpOworICAgICAgICByZXR1cm4gcDsKKyAgICAgIH0KKyAgICAgIGwgLT0gMzsKKyAgICB9CisgICAgaWYgKG4pCisgICAgICAqbiArPSAzICogU09BUF9CTEtMRU47CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2NoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3MyaGV4KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzLCBjaGFyICp0LCBpbnQgbikKK3sgcmVnaXN0ZXIgY2hhciAqcDsKKyAgaWYgKCF0KQorICAgIHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgMiAqIG4gKyAxKTsKKyAgaWYgKCF0KQorICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcCA9IHQ7CisgIHRbMF0gPSAnXDAnOworICBpZiAocykKKyAgeyBmb3IgKDsgbiA+IDA7IG4tLSkKKyAgICB7IHJlZ2lzdGVyIGludCBtID0gKnMrKzsKKyAgICAgICp0KysgPSAoY2hhcikoKG0gPj4gNCkgKyAobSA+IDE1OSA/ICdhJyAtIDEwIDogJzAnKSk7CisgICAgICBtICY9IDB4MEY7CisgICAgICAqdCsrID0gKGNoYXIpKG0gKyAobSA+IDkgPyAnYScgLSAxMCA6ICcwJykpOworICAgIH0KKyAgfQorICAqdCsrID0gJ1wwJzsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9oZXgycyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgY2hhciAqdCwgc2l6ZV90IGwsIGludCAqbikKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqcDsKKyAgaWYgKCFzIHx8ICEqcykKKyAgeyBpZiAobikKKyAgICAgICpuID0gMDsKKyAgICBpZiAoc29hcC0+ZXJyb3IpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gU09BUF9OT05fTlVMTDsKKyAgfQorICBpZiAoIXQpCisgIHsgbCA9IHN0cmxlbihzKSAvIDI7CisgICAgdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBsKTsKKyAgfQorICBpZiAoIXQpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwID0gdDsKKyAgd2hpbGUgKGwpCisgIHsgcmVnaXN0ZXIgaW50IGQxLCBkMjsKKyAgICBkMSA9ICpzKys7CisgICAgaWYgKCFkMSkKKyAgICAgIGJyZWFrOworICAgIGQyID0gKnMrKzsKKyAgICBpZiAoIWQyKQorICAgICAgYnJlYWs7CisgICAgKnQrKyA9ICgoZDEgPj0gJ0EnID8gKGQxICYgMHg3KSArIDkgOiBkMSAtICcwJykgPDwgNCkgKyAoZDIgPj0gJ0EnID8gKGQyICYgMHg3KSArIDkgOiBkMiAtICcwJyk7CisgICAgbC0tOworICB9CisgIGlmIChuKQorICAgICpuID0gdCAtIHA7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dGh0dHBoZHIoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdGF0dXMsIHNpemVfdCBjb3VudCkKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqcyA9IE5VTEw7CisgIHJlZ2lzdGVyIGludCBlcnIgPSBTT0FQX09LOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICByZWdpc3RlciBjb25zdCBjaGFyICpyID0gTlVMTDsKKyNlbmRpZgorICBpZiAoc3RhdHVzID09IFNPQVBfRklMRSAmJiBzb2FwLT5odHRwX2NvbnRlbnQpCisgICAgcyA9IHNvYXAtPmh0dHBfY29udGVudDsKKyAgZWxzZSBpZiAoc3RhdHVzID09IFNPQVBfSFRNTCkKKyAgICBzID0gInRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI7CisgIGVsc2UgaWYgKGNvdW50IHx8ICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspKQorICB7IGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgICAgICBzID0gImFwcGxpY2F0aW9uL3NvYXAreG1sOyBjaGFyc2V0PXV0Zi04IjsKKyAgICBlbHNlCisgICAgICBzID0gInRleHQveG1sOyBjaGFyc2V0PXV0Zi04IjsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+bW9kZSAmIChTT0FQX0VOQ19ESU1FIHwgU09BUF9FTkNfTVRPTSkpCisgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKQorICAgIHsgciA9IHM7CisgICAgICBzID0gImFwcGxpY2F0aW9uL3hvcCt4bWw7IGNoYXJzZXQ9dXRmLTgiOworICAgIH0KKyAgICBlbHNlCisgICAgICBzID0gImFwcGxpY2F0aW9uL2RpbWUiOworICB9CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01JTUUpICYmIHNvYXAtPm1pbWUuYm91bmRhcnkgJiYgc29hcC0+c3RhdHVzICE9IFNPQVBfR0VUKQorICB7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnQgPSBzdHJjaHIocywgJzsnKTsKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIm11bHRpcGFydC9yZWxhdGVkOyBib3VuZGFyeT1cIiVzXCI7IHR5cGU9XCIiLCBzb2FwLT5taW1lLmJvdW5kYXJ5KTsKKyAgICBpZiAodCkKKyAgICAgIHN0cm5jYXQoc29hcC0+dG1wYnVmLCBzLCB0IC0gcyk7CisgICAgZWxzZQorICAgICAgc3RyY2F0KHNvYXAtPnRtcGJ1Ziwgcyk7CisgICAgaWYgKHNvYXAtPm1pbWUuc3RhcnQpCisgICAgeyBzdHJjYXQoc29hcC0+dG1wYnVmLCAiXCI7IHN0YXJ0PVwiIik7CisgICAgICBzdHJjYXQoc29hcC0+dG1wYnVmLCBzb2FwLT5taW1lLnN0YXJ0KTsKKyAgICB9CisgICAgc3RyY2F0KHNvYXAtPnRtcGJ1ZiwgIlwiIik7CisgICAgaWYgKHIpCisgICAgeyBzdHJjYXQoc29hcC0+dG1wYnVmLCAiOyBzdGFydC1pbmZvPVwiIik7CisgICAgICBzdHJjYXQoc29hcC0+dG1wYnVmLCByKTsKKyAgICAgIHN0cmNhdChzb2FwLT50bXBidWYsICJcIiIpOworICAgIH0KKyAgICBzID0gc29hcC0+dG1wYnVmOworICB9CisjZW5kaWYKKyAgaWYgKHMgJiYgKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJDb250ZW50LVR5cGUiLCBzKSkpCisgICAgcmV0dXJuIGVycjsKKyNpZmRlZiBXSVRIX1pMSUIKKyAgaWYgKHNvYXAtPm9tb2RlICYgU09BUF9FTkNfWkxJQikKKyAgeworI2lmZGVmIFdJVEhfR1pJUAorICAgIGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJDb250ZW50LUVuY29kaW5nIiwgImd6aXAiKTsKKyNlbHNlCisgICAgZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkNvbnRlbnQtRW5jb2RpbmciLCAiZGVmbGF0ZSIpOworI2VuZGlmCisgICAgaWYgKGVycikKKyAgICAgIHJldHVybiBlcnI7CisgIH0KKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgICBlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiVHJhbnNmZXItRW5jb2RpbmciLCAiY2h1bmtlZCIpOworICBlbHNlCisjZW5kaWYKKyAgaWYgKHNvYXAtPnN0YXR1cyAhPSBTT0FQX0dFVCkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIiVsdSIsICh1bnNpZ25lZCBsb25nKWNvdW50KTsKKyAgICBlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQ29udGVudC1MZW5ndGgiLCBzb2FwLT50bXBidWYpOworICB9CisgIGlmIChlcnIpCisgICAgcmV0dXJuIGVycjsKKyAgcmV0dXJuIHNvYXAtPmZwb3N0aGRyKHNvYXAsICJDb25uZWN0aW9uIiwgc29hcC0+a2VlcF9hbGl2ZSA/ICJrZWVwLWFsaXZlIiA6ICJjbG9zZSIpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50CitodHRwX2dldChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmV0dXJuIFNPQVBfR0VUX01FVEhPRDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAoraHR0cF9wb3N0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICplbmRwb2ludCwgY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQsIGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmFjdGlvbiwgc2l6ZV90IGNvdW50KQoreyByZWdpc3RlciBjb25zdCBjaGFyICpzOworICByZWdpc3RlciBpbnQgZXJyOworICBpZiAoc29hcC0+c3RhdHVzID09IFNPQVBfR0VUKQorICAgIHMgPSAiR0VUIjsKKyAgZWxzZQorICAgIHMgPSAiUE9TVCI7CisjaWZkZWYgUEFMTQorICBpZiAoIWVuZHBvaW50IHx8IChzdHJuY21wKGVuZHBvaW50LCAiaHR0cDoiLCA1KSAmJiBzdHJuY21wKGVuZHBvaW50LCAiaHR0cHM6IiwgNikgJiYgc3RybmNtcChlbmRwb2ludCwgImh0dHBnOiIsIDYpKSAmJiBzdHJuY21wKGVuZHBvaW50LCAiX2JlYW06IiwgNikgJiYgc3RybmNtcChlbmRwb2ludCwgIl9sb2NhbDoiLCA3KSAmJiBzdHJuY21wKGVuZHBvaW50LCAiX2J0b2JleDoiLCA4KSkKKyNlbHNlCisgIGlmICghZW5kcG9pbnQgfHwgKHN0cm5jbXAoZW5kcG9pbnQsICJodHRwOiIsIDUpICYmIHN0cm5jbXAoZW5kcG9pbnQsICJodHRwczoiLCA2KSAmJiBzdHJuY21wKGVuZHBvaW50LCAiaHR0cGc6IiwgNikpKQorI2VuZGlmCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIGlmIChzb2FwLT5wcm94eV9ob3N0ICYmIHN0cm5jbXAoZW5kcG9pbnQsICJodHRwczoiLCA2KSkKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIiVzICVzIEhUVFAvJXMiLCBzLCBlbmRwb2ludCwgc29hcC0+aHR0cF92ZXJzaW9uKTsKKyAgZWxzZQorICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiJXMgLyVzIEhUVFAvJXMiLCBzLCAoKnBhdGggPT0gJy8nID8gcGF0aCArIDEgOiBwYXRoKSwgc29hcC0+aHR0cF92ZXJzaW9uKTsKKyAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCBzb2FwLT50bXBidWYsIE5VTEwpKSkKKyAgICByZXR1cm4gZXJyOworICBpZiAocG9ydCAhPSA4MCkKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIiVzOiVkIiwgaG9zdCwgcG9ydCk7CisgIGVsc2UKKyAgICBzdHJjcHkoc29hcC0+dG1wYnVmLCBob3N0KTsgCisgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkhvc3QiLCBzb2FwLT50bXBidWYpKQorICAgfHwgKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJVc2VyLUFnZW50IiwgImdTT0FQLzIuNyIpKQorICAgfHwgKGVyciA9IHNvYXBfcHV0aHR0cGhkcihzb2FwLCBTT0FQX09LLCBjb3VudCkpKQorICAgIHJldHVybiBlcnI7CisjaWZkZWYgV0lUSF9aTElCCisjaWZkZWYgV0lUSF9HWklQCisgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkFjY2VwdC1FbmNvZGluZyIsICJnemlwLCBkZWZsYXRlIikpKQorI2Vsc2UKKyAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQWNjZXB0LUVuY29kaW5nIiwgImRlZmxhdGUiKSkpCisjZW5kaWYKKyAgICByZXR1cm4gZXJyOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+dXNlcmlkICYmIHNvYXAtPnBhc3N3ZCAmJiBzdHJsZW4oc29hcC0+dXNlcmlkKSArIHN0cmxlbihzb2FwLT5wYXNzd2QpIDwgNzYxKQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmICsgMjYyLCAiJXM6JXMiLCBzb2FwLT51c2VyaWQsIHNvYXAtPnBhc3N3ZCk7CisgICAgc3RyY3B5KHNvYXAtPnRtcGJ1ZiwgIkJhc2ljICIpOworICAgIHNvYXBfczJiYXNlNjQoc29hcCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKShzb2FwLT50bXBidWYgKyAyNjIpLCBzb2FwLT50bXBidWYgKyA2LCBzdHJsZW4oc29hcC0+dG1wYnVmICsgMjYyKSk7CisgICAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQXV0aG9yaXphdGlvbiIsIHNvYXAtPnRtcGJ1ZikpKQorICAgICAgcmV0dXJuIGVycjsKKyAgfQorICBpZiAoc29hcC0+cHJveHlfdXNlcmlkICYmIHNvYXAtPnByb3h5X3Bhc3N3ZCAmJiBzdHJsZW4oc29hcC0+cHJveHlfdXNlcmlkKSArIHN0cmxlbihzb2FwLT5wcm94eV9wYXNzd2QpIDwgNzYxKQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmICsgMjYyLCAiJXM6JXMiLCBzb2FwLT5wcm94eV91c2VyaWQsIHNvYXAtPnByb3h5X3Bhc3N3ZCk7CisgICAgc3RyY3B5KHNvYXAtPnRtcGJ1ZiwgIkJhc2ljICIpOworICAgIHNvYXBfczJiYXNlNjQoc29hcCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKShzb2FwLT50bXBidWYgKyAyNjIpLCBzb2FwLT50bXBidWYgKyA2LCBzdHJsZW4oc29hcC0+dG1wYnVmICsgMjYyKSk7CisgICAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiUHJveHktQXV0aG9yaXphdGlvbiIsIHNvYXAtPnRtcGJ1ZikpKQorICAgICAgcmV0dXJuIGVycjsKKyAgfQorI2VuZGlmCisjaWZkZWYgV0lUSF9DT09LSUVTCisjaWZkZWYgV0lUSF9PUEVOU1NMCisgIGlmIChzb2FwX3B1dGNvb2tpZXMoc29hcCwgaG9zdCwgcGF0aCwgc29hcC0+c3NsICE9IE5VTEwpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNlbHNlCisgIGlmIChzb2FwX3B1dGNvb2tpZXMoc29hcCwgaG9zdCwgcGF0aCwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2VuZGlmCisjZW5kaWYKKyAgaWYgKGFjdGlvbiAmJiBzb2FwLT52ZXJzaW9uID09IDEpCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJcIiVzXCIiLCBhY3Rpb24pOworICAgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlNPQVBBY3Rpb24iLCBzb2FwLT50bXBidWYpKSkKKyAgICAgIHJldHVybiBlcnI7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmZwb3N0aGRyKHNvYXAsIE5VTEwsIE5VTEwpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50CitodHRwX3NlbmRfaGVhZGVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzKQoreyByZWdpc3RlciBjb25zdCBjaGFyICp0OworICBkbworICB7IHQgPSBzdHJjaHIocywgJ1xuJyk7IC8qIGRpc2FsbG93IFxuIGluIEhUVFAgaGVhZGVycyAqLworICAgIGlmICghdCkKKyAgICAgIHQgPSBzICsgc3RybGVuKHMpOworICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBzID0gdCArIDE7CisgIH0gd2hpbGUgKCp0KTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK2h0dHBfcG9zdF9oZWFkZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsKQoreyBpZiAoa2V5KQorICB7IGlmIChodHRwX3NlbmRfaGVhZGVyKHNvYXAsIGtleSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHZhbCAmJiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAiOiAiLCAyKSB8fCBodHRwX3NlbmRfaGVhZGVyKHNvYXAsIHZhbCkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsICJcclxuIiwgMik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK2h0dHBfcmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdGF0dXMsIHNpemVfdCBjb3VudCkKK3sgcmVnaXN0ZXIgaW50IGVycjsKKyNpZmRlZiBXTVdfUlBNX0lPCisgIGlmIChzb2FwLT5ycG1yZXFpZCkKKyAgICBodHRwT3V0cHV0RW5hYmxlKHNvYXAtPnJwbXJlcWlkKTsKKyNlbmRpZgorICBpZiAoIXN0YXR1cyB8fCBzdGF0dXMgPT0gU09BUF9IVE1MIHx8IHN0YXR1cyA9PSBTT0FQX0ZJTEUpCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJPSyAyMDBcbiIpKTsKKyNpZmRlZiBXTVdfUlBNX0lPCisgICAgaWYgKHNvYXAtPnJwbXJlcWlkIHx8IHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikgfHwgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkgLyogUlBNIGJlaGF2ZXMgYXMgaWYgc3RhbmRhbG9uZSAqLworI2Vsc2UKKyAgICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSB8fCBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKSAvKiBzdGFuZGFsb25lIGFwcGxpY2F0aW9uICovCisjZW5kaWYKKyAgICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiSFRUUC8lcyAyMDAgT0siLCBzb2FwLT5odHRwX3ZlcnNpb24pOworICAgICAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCBzb2FwLT50bXBidWYsIE5VTEwpKSkKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgZWxzZSBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJTdGF0dXMiLCAiMjAwIE9LIikpKQorICAgICAgcmV0dXJuIGVycjsKKyAgfQorICBlbHNlIGlmIChzdGF0dXMgPiAyMDAgJiYgc3RhdHVzIDwgNjAwKQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiSFRUUC8lcyAlZCAlcyIsIHNvYXAtPmh0dHBfdmVyc2lvbiwgc3RhdHVzLCBodHRwX2Vycm9yKHNvYXAsIHN0YXR1cykpOworICAgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgc29hcC0+dG1wYnVmLCBOVUxMKSkpCisgICAgICByZXR1cm4gZXJyOworI2lmbmRlZiBXSVRIX0xFQU4gCisgICAgaWYgKHN0YXR1cyA9PSA0MDEpCisgICAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIkJhc2ljIHJlYWxtPVwiJXNcIiIsIHNvYXAtPmF1dGhyZWFsbSA/IHNvYXAtPmF1dGhyZWFsbSA6ICJnU09BUCBXZWIgU2VydmljZSIpOworICAgICAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiV1dXLUF1dGhlbnRpY2F0ZSIsIHNvYXAtPnRtcGJ1ZikpKQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBlbHNlIGlmICgoc3RhdHVzID49IDMwMSAmJiBzdGF0dXMgPD0gMzAzKSB8fCBzdGF0dXMgPT0gMzA3KQorICAgIHsgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiTG9jYXRpb24iLCBzb2FwLT5lbmRwb2ludCkpKQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyNlbmRpZgorICB9CisgIGVsc2UKKyAgeyBjb25zdCBjaGFyICpzID0gKnNvYXBfZmF1bHRjb2RlKHNvYXApOworICAgIGlmIChzb2FwLT52ZXJzaW9uID09IDIgJiYgIXN0cmNtcChzLCAiU09BUC1FTlY6U2VuZGVyIikpCisgICAgICBzID0gIjQwMCBCYWQgUmVxdWVzdCI7CisgICAgZWxzZQorICAgICAgcyA9ICI1MDAgSW50ZXJuYWwgU2VydmVyIEVycm9yIjsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVycm9yICVzIChzdGF0dXM9JWQpXG4iLCBzLCBzdGF0dXMpKTsKKyNpZmRlZiBXTVdfUlBNX0lPCisgICAgaWYgKHNvYXAtPnJwbXJlcWlkIHx8IHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikgfHwgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkgLyogUlBNIGJlaGF2ZXMgYXMgaWYgc3RhbmRhbG9uZSAqLworI2Vsc2UKKyAgICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSB8fCBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKSAvKiBzdGFuZGFsb25lIGFwcGxpY2F0aW9uICovCisjZW5kaWYKKyAgICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiSFRUUC8lcyAlcyIsIHNvYXAtPmh0dHBfdmVyc2lvbiwgcyk7CisgICAgICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgTlVMTCkpKQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBlbHNlIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlN0YXR1cyIsIHMpKSkKKyAgICAgIHJldHVybiBlcnI7CisgIH0KKyAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiU2VydmVyIiwgImdTT0FQLzIuNyIpKQorICAgfHwgKGVyciA9IHNvYXBfcHV0aHR0cGhkcihzb2FwLCBzdGF0dXMsIGNvdW50KSkpCisgICAgcmV0dXJuIGVycjsKKyNpZmRlZiBXSVRIX0NPT0tJRVMKKyAgaWYgKHNvYXBfcHV0c2V0Y29va2llcyhzb2FwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjZW5kaWYKKyAgcmV0dXJuIHNvYXAtPmZwb3N0aGRyKHNvYXAsIE5VTEwsIE5VTEwpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdGF0dXMpCit7IHJlZ2lzdGVyIHNpemVfdCBjb3VudDsKKyAgaWYgKCEoc29hcC0+b21vZGUgJiAoU09BUF9FTkNfWE1MIHwgU09BUF9JT19TVE9SRSAvKiB0aGlzIHRlc3RzIGZvciBjaHVua2luZyB0b28gKi8pKQorICAgJiYgKHN0YXR1cyA9PSBTT0FQX0hUTUwgfHwgc3RhdHVzID09IFNPQVBfRklMRSkpCisgIHsgc29hcC0+b21vZGUgJj0gflNPQVBfSU87CisgICAgc29hcC0+b21vZGUgfD0gU09BUF9JT19TVE9SRTsKKyAgfQorICBzb2FwLT5zdGF0dXMgPSBzdGF0dXM7CisgIGNvdW50ID0gc29hcF9jb3VudF9hdHRhY2htZW50cyhzb2FwKTsKKyAgaWYgKHNvYXBfYmVnaW5fc2VuZChzb2FwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjaWZuZGVmIFdJVEhfTk9IVFRQCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pICE9IFNPQVBfSU9fU1RPUkUgJiYgIShzb2FwLT5tb2RlICYgU09BUF9FTkNfWE1MKSkKKyAgeyByZWdpc3RlciBpbnQgbiA9IHNvYXAtPm1vZGU7CisgICAgc29hcC0+bW9kZSAmPSB+KFNPQVBfSU8gfCBTT0FQX0VOQ19aTElCKTsKKyAgICBpZiAoKG4gJiBTT0FQX0lPKSAhPSBTT0FQX0lPX0ZMVVNIKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX0JVRkZFUjsKKyAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnJlc3BvbnNlKHNvYXAsIHN0YXR1cywgY291bnQpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgICBpZiAoKG4gJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKQorICAgIHsgaWYgKHNvYXBfZmx1c2goc29hcCkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisjZW5kaWYKKyAgICBzb2FwLT5tb2RlID0gbjsKKyAgfQorI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIGNvbnN0IGNoYXIqCitzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICp0KQoreyBpZiAoKnNvYXAtPnRhZykKKyAgICBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIlZhbGlkYXRpb24gY29uc3RyYWludCB2aW9sYXRpb246ICVzJXMgaW4gZWxlbWVudCA8JXM+IiwgcywgdD90OlNPQVBfU1RSX0VPUywgc29hcC0+dGFnKTsKKyAgZWxzZQorICAgIHNwcmludGYoc29hcC0+bXNnYnVmLCAiVmFsaWRhdGlvbiBjb25zdHJhaW50IHZpb2xhdGlvbjogJXMlcyIsIHMsIHQ/dDpTT0FQX1NUUl9FT1MpOworICByZXR1cm4gc29hcC0+bXNnYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXApCit7IGNvbnN0IGNoYXIgKipjID0gc29hcF9mYXVsdGNvZGUoc29hcCk7CisgIGNvbnN0IGNoYXIgKipzID0gc29hcF9mYXVsdHN0cmluZyhzb2FwKTsKKyAgaWYgKCEqYyAmJiAhKnMgJiYgc29hcC0+ZnNldGVycm9yKQorICAgIHNvYXAtPmZzZXRlcnJvcihzb2FwLCBjLCBzKTsKKyAgaWYgKCEqYykKKyAgeyBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICAgICAgKmMgPSAiU09BUC1FTlY6U2VuZGVyIjsKKyAgICBlbHNlCisgICAgICAqYyA9ICJTT0FQLUVOVjpDbGllbnQiOworICB9CisgIGlmICgqcykKKyAgICByZXR1cm47CisgIHN3aXRjaCAoc29hcC0+ZXJyb3IpCisgIHsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgY2FzZSBTT0FQX0NMSV9GQVVMVDoKKyAgICAgICpzID0gIkNsaWVudCBmYXVsdCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfU1ZSX0ZBVUxUOgorICAgICAgKnMgPSAiU2VydmVyIGZhdWx0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9UQUdfTUlTTUFUQ0g6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgInRhZyBuYW1lIG9yIG5hbWVzcGFjZSBtaXNtYXRjaCIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1RZUEU6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgImRhdGEgdHlwZSBtaXNtYXRjaCAiLCBzb2FwLT50eXBlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9TWU5UQVhfRVJST1I6CisgICAgICAqcyA9ICJXZWxsLWZvcm1lZG5lc3MgdmlvbGF0aW9uIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9OT19UQUc6CisgICAgICAqcyA9ICJObyBYTUwgZWxlbWVudCB0YWciOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX01VU1RVTkRFUlNUQU5EOgorICAgICAgKmMgPSAiU09BUC1FTlY6TXVzdFVuZGVyc3RhbmQiOworICAgICAgc3ByaW50Zihzb2FwLT5tc2didWYsICJUaGUgZGF0YSBpbiBlbGVtZW50ICclcycgbXVzdCBiZSB1bmRlcnN0b29kIGJ1dCBjYW5ub3QgYmUgaGFuZGxlZCIsIHNvYXAtPnRhZyk7CisgICAgICAqcyA9IHNvYXAtPm1zZ2J1ZjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9WRVJTSU9OTUlTTUFUQ0g6CisgICAgICAqYyA9ICJTT0FQLUVOVjpWZXJzaW9uTWlzbWF0Y2giOworICAgICAgKnMgPSAiU09BUCB2ZXJzaW9uIG1pc21hdGNoIG9yIGludmFsaWQgU09BUCBtZXNzYWdlIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9EQVRBRU5DT0RJTkdVTktOT1dOOgorICAgICAgKmMgPSAiU09BUC1FTlY6RGF0YUVuY29kaW5nVW5rbm93biI7CisgICAgICAqcyA9ICJVbnN1cHBvcnRlZCBTT0FQIGRhdGEgZW5jb2RpbmciOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX05BTUVTUEFDRToKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAibmFtZXNwYWNlIG1pc21hdGNoIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfVVNFUl9FUlJPUjoKKyAgICAgICpzID0gIlVzZXIgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0ZBVEFMX0VSUk9SOgorICAgICAgKnMgPSAiRmF0YWwgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX05PX01FVEhPRDoKKyAgICAgIHNwcmludGYoc29hcC0+bXNnYnVmLCAiTWV0aG9kICclcycgbm90IGltcGxlbWVudGVkOiBtZXRob2QgbmFtZSBvciBuYW1lc3BhY2Ugbm90IHJlY29nbml6ZWQiLCBzb2FwLT50YWcpOworICAgICAgKnMgPSBzb2FwLT5tc2didWY7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfR0VUX01FVEhPRDoKKyAgICAgICpzID0gIkhUVFAgR0VUIG1ldGhvZCBub3QgaW1wbGVtZW50ZWQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0VPTToKKyAgICAgICpzID0gIk91dCBvZiBtZW1vcnkiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0lPQjoKKyAgICAgICpzID0gIkFycmF5IGluZGV4IG91dCBvZiBib3VuZHMiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX05VTEw6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgIm5pbCBub3QgYWxsb3dlZCIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0RVUExJQ0FURV9JRDoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAibXVsdGlwbGUgZGVmaW5pdGlvbnMgb2YgaWQgIiwgc29hcC0+aWQpOworICAgICAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgICAgICAgKnNvYXBfZmF1bHRzdWJjb2RlKHNvYXApID0gIlNPQVAtRU5DOkR1cGxpY2F0ZUlEIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9NSVNTSU5HX0lEOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJtaXNzaW5nIGlkIGZvciByZWYgIiwgc29hcC0+aWQpOworICAgICAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgICAgICAgKnNvYXBfZmF1bHRzdWJjb2RlKHNvYXApID0gIlNPQVAtRU5DOk1pc3NpbmdJRCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfSFJFRjoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAiaW5jb21wYXRpYmxlIG9iamVjdCByZWYgIiwgc29hcC0+aWQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0ZBVUxUOgorICAgICAgYnJlYWs7CisjaWZuZGVmIFdJVEhfTk9JTworICAgIGNhc2UgU09BUF9VRFBfRVJST1I6CisgICAgICAqcyA9ICJNZXNzYWdlIHRvbyBsYXJnZSBmb3IgVURQIHBhY2tldCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfVENQX0VSUk9SOgorICAgICAgKnMgPSB0Y3BfZXJyb3Ioc29hcCk7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgU09BUF9IVFRQX0VSUk9SOgorICAgICAgKnMgPSAiSFRUUCBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfU1NMX0VSUk9SOgorI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgICAgKnMgPSAiU1NMIGVycm9yIjsKKyNlbHNlCisgICAgICAqcyA9ICJPcGVuU1NMIG5vdCBpbnN0YWxsZWQ6IHJlY29tcGlsZSB3aXRoIC1EV0lUSF9PUEVOU1NMIjsKKyNlbmRpZgorICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1BMVUdJTl9FUlJPUjoKKyAgICAgICpzID0gIlBsdWdpbiByZWdpc3RyeSBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfRElNRV9FUlJPUjoKKyAgICAgICpzID0gIkRJTUUgZm9ybWF0IGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9ESU1FX0hSRUY6CisgICAgICAqcyA9ICJESU1FIGhyZWYgdG8gbWlzc2luZyBhdHRhY2htZW50IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9ESU1FX01JU01BVENIOgorICAgICAgKnMgPSAiRElNRSB2ZXJzaW9uL3RyYW5zbWlzc2lvbiBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfRElNRV9FTkQ6CisgICAgICAqcyA9ICJFbmQgb2YgRElNRSBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTUlNRV9FUlJPUjoKKyAgICAgICpzID0gIk1JTUUgZm9ybWF0IGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9NSU1FX0hSRUY6CisgICAgICAqcyA9ICJNSU1FIGhyZWYgdG8gbWlzc2luZyBhdHRhY2htZW50IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9NSU1FX0VORDoKKyAgICAgICpzID0gIkVuZCBvZiBNSU1FIGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9aTElCX0VSUk9SOgorI2lmZGVmIFdJVEhfWkxJQgorICAgICAgc3ByaW50Zihzb2FwLT5tc2didWYsICJabGliL2d6aXAgZXJyb3I6ICclcyciLCBzb2FwLT5kX3N0cmVhbS5tc2c/c29hcC0+ZF9zdHJlYW0ubXNnOiIiKTsKKyAgICAgICpzID0gc29hcC0+bXNnYnVmOworI2Vsc2UKKyAgICAgICpzID0gIlpsaWIvZ3ppcCBub3QgaW5zdGFsbGVkIGZvciAoZGUpY29tcHJlc3Npb246IHJlY29tcGlsZSB3aXRoIC1EV0lUSF9HWklQIjsKKyNlbmRpZgorICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1JFUVVJUkVEOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJtaXNzaW5nIHJlcXVpcmVkIGF0dHJpYnV0ZSIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1BST0hJQklURUQ6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgInByb2hpYml0ZWQgYXR0cmlidXRlIHByZXNlbnQiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9PQ0NVUlM6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgIm1pbi9tYXhPY2N1cnMgdmlvbGF0aW9uIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTEVOR1RIOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJjb250ZW50IGxlbmd0aCB2aW9sYXRpb24iLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9TVE9QOgorICAgICAgKnMgPSAiU3RvcHBlZDogbm8gcmVzcG9uc2Ugc2VudCI7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgU09BUF9FT0Y6CisjaWZuZGVmIFdJVEhfTk9JTworICAgICAgc3ByaW50Zihzb2FwLT5tc2didWYsICJFbmQgb2YgZmlsZSBvciBubyBpbnB1dDogJyVzJyIsIHNvYXBfc3RyZXJyb3Ioc29hcCkpOworICAgICAgKnMgPSBzb2FwLT5tc2didWY7CisgICAgICBicmVhazsKKyNlbHNlCisgICAgICAqcyA9ICJFbmQgb2YgZmlsZSBvciBubyBpbnB1dCI7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgaWYgKHNvYXAtPmVycm9yID4gMjAwICYmIHNvYXAtPmVycm9yIDwgNjAwKQorICAgICAgeyBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIkhUVFAgRXJyb3I6ICVkICVzIiwgc29hcC0+ZXJyb3IsIGh0dHBfZXJyb3Ioc29hcCwgc29hcC0+ZXJyb3IpKTsKKyAgICAgICAgKnMgPSBzb2FwLT5tc2didWY7CisgICAgICB9CisgICAgICBlbHNlCisjZW5kaWYKKyNlbmRpZgorICAgICAgeyBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIkVycm9yICVkIiwgc29hcC0+ZXJyb3IpOworICAgICAgICAqcyA9IHNvYXAtPm1zZ2J1ZjsKKyAgICAgIH0KKyAgICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2VuZF9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IHN0YXR1cyA9IHNvYXAtPmVycm9yOworICBpbnQgciA9IDE7CisgIGlmIChzdGF0dXMgPT0gU09BUF9TVE9QKQorICAgIHJldHVybiBzdGF0dXM7CisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJTZW5kaW5nIGJhY2sgZmF1bHQgc3RydWN0IGZvciBlcnJvciBjb2RlICVkXG4iLCBzb2FwLT5lcnJvcikpOworICBzb2FwLT5rZWVwX2FsaXZlID0gMDsgLyogdG8gdGVybWluYXRlIGNvbm5lY3Rpb24gKi8KKyAgc29hcF9zZXRfZmF1bHQoc29hcCk7CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICBmZF9zZXQgcmZkLCBzZmQ7CisgICAgdGltZW91dC50dl9zZWMgPSAwOworICAgIHRpbWVvdXQudHZfdXNlYyA9IDA7CisgICAgRkRfWkVSTygmcmZkKTsKKyAgICBGRF9aRVJPKCZzZmQpOworICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmcmZkKTsKKyAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnNmZCk7CisgICAgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCAmcmZkLCAmc2ZkLCBOVUxMLCAmdGltZW91dCk7CisgICAgaWYgKHIgPiAwKQorICAgIHsgaWYgKCFGRF9JU1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmc2ZkKQorICAgICAgIHx8IChGRF9JU1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmcmZkKQorICAgICAgICAmJiByZWN2KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHNvYXAtPnRtcGJ1ZiwgMSwgTVNHX1BFRUspIDwgMCkpCisgICAgICAgIHIgPSAwOworICAgIH0KKyAgfQorI2VuZGlmCisjZW5kaWYKKyAgaWYgKChzdGF0dXMgIT0gU09BUF9FT0YgfHwgKCFzb2FwLT5yZWN2X3RpbWVvdXQgJiYgIXNvYXAtPnNlbmRfdGltZW91dCkpICYmIHIgPiAwKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgICBzb2FwX3NlcmlhbGl6ZWhlYWRlcihzb2FwKTsKKyAgICBzb2FwX3NlcmlhbGl6ZWZhdWx0KHNvYXApOworICAgIHNvYXBfYmVnaW5fY291bnQoc29hcCk7CisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICB7IHNvYXBfZW52ZWxvcGVfYmVnaW5fb3V0KHNvYXApOworICAgICAgc29hcF9wdXRoZWFkZXIoc29hcCk7CisgICAgICBzb2FwX2JvZHlfYmVnaW5fb3V0KHNvYXApOworICAgICAgc29hcF9wdXRmYXVsdChzb2FwKTsKKyAgICAgIHNvYXBfYm9keV9lbmRfb3V0KHNvYXApOworICAgICAgc29hcF9lbnZlbG9wZV9lbmRfb3V0KHNvYXApOworICAgIH0KKyAgICBzb2FwX2VuZF9jb3VudChzb2FwKTsKKyAgICBpZiAoc29hcF9yZXNwb25zZShzb2FwLCBzdGF0dXMpCisgICAgIHx8IHNvYXBfZW52ZWxvcGVfYmVnaW5fb3V0KHNvYXApCisgICAgIHx8IHNvYXBfcHV0aGVhZGVyKHNvYXApCisgICAgIHx8IHNvYXBfYm9keV9iZWdpbl9vdXQoc29hcCkKKyAgICAgfHwgc29hcF9wdXRmYXVsdChzb2FwKQorICAgICB8fCBzb2FwX2JvZHlfZW5kX291dChzb2FwKQorICAgICB8fCBzb2FwX2VudmVsb3BlX2VuZF9vdXQoc29hcCkpCisgICAgICByZXR1cm4gc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgc29hcF9lbmRfc2VuZChzb2FwKTsKKyAgfQorICBzb2FwLT5lcnJvciA9IHN0YXR1czsKKyAgcmV0dXJuIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlY3ZfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBzdGF0dXMgPSBzb2FwLT5lcnJvcjsKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlY2VpdmluZyBTT0FQIEZhdWx0XG4iKSk7CisgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgaWYgKHNvYXBfZ2V0ZmF1bHQoc29hcCkpCisgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVycm9yOiBzb2FwX2dldF9zb2FwZmF1bHQoKSBmYWlsZWQuIElzIHRoaXMgYSBTT0FQIG1lc3NhZ2UgYXQgYWxsP1xuIikpOworICAgICpzb2FwX2ZhdWx0Y29kZShzb2FwKSA9IChzb2FwLT52ZXJzaW9uID09IDIgPyAiU09BUC1FTlY6U2VuZGVyIiA6ICJTT0FQLUVOVjpDbGllbnQiKTsKKyAgICBzb2FwLT5lcnJvciA9IHN0YXR1czsKKyAgICBzb2FwX3NldF9mYXVsdChzb2FwKTsKKyAgfQorICBlbHNlCisgIHsgcmVnaXN0ZXIgY29uc3QgY2hhciAqcyA9ICpzb2FwX2ZhdWx0Y29kZShzb2FwKTsKKyAgICBpZiAoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHMsICJTT0FQLUVOVjpTZXJ2ZXIiKSB8fCAhc29hcF9tYXRjaF90YWcoc29hcCwgcywgIlNPQVAtRU5WOlJlY2VpdmVyIikpCisgICAgICBzdGF0dXMgPSBTT0FQX1NWUl9GQVVMVDsgCisgICAgZWxzZSBpZiAoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHMsICJTT0FQLUVOVjpDbGllbnQiKSB8fCAhc29hcF9tYXRjaF90YWcoc29hcCwgcywgIlNPQVAtRU5WOlNlbmRlciIpKQorICAgICAgc3RhdHVzID0gU09BUF9DTElfRkFVTFQ7CisgICAgZWxzZSBpZiAoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHMsICJTT0FQLUVOVjpNdXN0VW5kZXJzdGFuZCIpKQorICAgICAgc3RhdHVzID0gU09BUF9NVVNUVU5ERVJTVEFORDsKKyAgICBlbHNlIGlmICghc29hcF9tYXRjaF90YWcoc29hcCwgcywgIlNPQVAtRU5WOlZlcnNpb25NaXNtYXRjaCIpKQorICAgICAgc3RhdHVzID0gU09BUF9WRVJTSU9OTUlTTUFUQ0g7CisgICAgZWxzZQorICAgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZhdWx0IGNvZGUgJXNcbiIsIHMpKTsKKyAgICAgIHN0YXR1cyA9IFNPQVBfRkFVTFQ7CisgICAgfQorICAgIGlmIChzb2FwX2JvZHlfZW5kX2luKHNvYXApCisgICAgIHx8IHNvYXBfZW52ZWxvcGVfZW5kX2luKHNvYXApCisgICAgIHx8IHNvYXBfZW5kX3JlY3Yoc29hcCkpCisgICAgICByZXR1cm4gc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgc29hcC0+ZXJyb3IgPSBzdGF0dXM7CisgIH0KKyAgcmV0dXJuIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmRfZW1wdHlfcmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPmNvdW50ID0gMDsKKyAgaWYgKHNvYXBfcmVzcG9uc2Uoc29hcCwgU09BUF9PSykgfHwgc29hcF9lbmRfc2VuZChzb2FwKSkKKyAgICByZXR1cm4gc29hcF9jbG9zZXNvY2soc29hcCk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVjdl9lbXB0eV9yZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXBfYmVnaW5fcmVjdihzb2FwKSB8fCBzb2FwX2VuZF9yZWN2KHNvYXApKQorICAgIHJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY29uc3QgY2hhcioKK3NvYXBfc3RyZXJyb3Ioc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBlcnIgPSBzb2FwLT5lcnJudW07CisgIGlmIChlcnIpCisgIHsKKyNpZm5kZWYgV0lOMzIKKyAgICByZXR1cm4gc3RyZXJyb3IoZXJyKTsKKyNlbHNlCisgICAgRm9ybWF0TWVzc2FnZShGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTXxGT1JNQVRfTUVTU0FHRV9JR05PUkVfSU5TRVJUUywgTlVMTCwgZXJyLCAwLCAoTFBUU1RSKSZzb2FwLT5lcnJvcnN0ciwgc2l6ZW9mKHNvYXAtPmVycm9yc3RyKSwgTlVMTCk7CisgICAgcmV0dXJuIHNvYXAtPmVycm9yc3RyOworI2VuZGlmCisgIH0KKyAgcmV0dXJuICJPcGVyYXRpb24gaW50ZXJydXB0ZWQgb3IgdGltZWQgb3V0IjsKK30KKyNlbmRpZgorI2VuZGlmIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK3N0YXRpYyBpbnQKK3NvYXBfc2V0X2Vycm9yKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdGNvZGUsIGNvbnN0IGNoYXIgKmZhdWx0c3ViY29kZSwgY29uc3QgY2hhciAqZmF1bHRzdHJpbmcsIGNvbnN0IGNoYXIgKmZhdWx0ZGV0YWlsLCBpbnQgc29hcGVycm9yKQoreyAqc29hcF9mYXVsdGNvZGUoc29hcCkgPSBmYXVsdGNvZGU7CisgIGlmIChmYXVsdHN1YmNvZGUpCisgICAgKnNvYXBfZmF1bHRzdWJjb2RlKHNvYXApID0gZmF1bHRzdWJjb2RlOworICAqc29hcF9mYXVsdHN0cmluZyhzb2FwKSA9IGZhdWx0c3RyaW5nOworICBpZiAoZmF1bHRkZXRhaWwgJiYgKmZhdWx0ZGV0YWlsKQorICB7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKipzID0gc29hcF9mYXVsdGRldGFpbChzb2FwKTsKKyAgICBpZiAocykKKyAgICAgICpzID0gZmF1bHRkZXRhaWw7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yID0gc29hcGVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCwgaW50IHNvYXBlcnJvcikKK3sgcmV0dXJuIHNvYXBfc2V0X2Vycm9yKHNvYXAsIHNvYXAtPnZlcnNpb24gPT0gMiA/ICJTT0FQLUVOVjpTZW5kZXIiIDogIlNPQVAtRU5WOkNsaWVudCIsIE5VTEwsIGZhdWx0c3RyaW5nLCBmYXVsdGRldGFpbCwgc29hcGVycm9yKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCwgaW50IHNvYXBlcnJvcikKK3sgcmV0dXJuIHNvYXBfc2V0X2Vycm9yKHNvYXAsIHNvYXAtPnZlcnNpb24gPT0gMiA/ICJTT0FQLUVOVjpSZWNlaXZlciIgOiAiU09BUC1FTlY6U2VydmVyIiwgTlVMTCwgZmF1bHRzdHJpbmcsIGZhdWx0ZGV0YWlsLCBzb2FwZXJyb3IpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorc3RhdGljIGludAorc29hcF9jb3B5X2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdGNvZGUsIGNvbnN0IGNoYXIgKmZhdWx0c3ViY29kZSwgY29uc3QgY2hhciAqZmF1bHRzdHJpbmcsIGNvbnN0IGNoYXIgKmZhdWx0ZGV0YWlsKQoreyBjaGFyICpyID0gTlVMTCwgKnMgPSBOVUxMLCAqdCA9IE5VTEw7CisgIGlmIChmYXVsdHN1YmNvZGUpCisgICAgciA9IHNvYXBfc3RyZHVwKHNvYXAsIGZhdWx0c3ViY29kZSk7CisgIGlmIChmYXVsdHN0cmluZykKKyAgICBzID0gc29hcF9zdHJkdXAoc29hcCwgZmF1bHRzdHJpbmcpOworICBpZiAoZmF1bHRkZXRhaWwpCisgICAgdCA9IHNvYXBfc3RyZHVwKHNvYXAsIGZhdWx0ZGV0YWlsKTsKKyAgcmV0dXJuIHNvYXBfc2V0X2Vycm9yKHNvYXAsIGZhdWx0Y29kZSwgciwgcywgdCwgU09BUF9GQVVMVCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2VuZGVyX2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdHN0cmluZywgY29uc3QgY2hhciAqZmF1bHRkZXRhaWwpCit7IHJldHVybiBzb2FwX3NlbmRlcl9mYXVsdF9zdWJjb2RlKHNvYXAsIE5VTEwsIGZhdWx0c3RyaW5nLCBmYXVsdGRldGFpbCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2VuZGVyX2ZhdWx0X3N1YmNvZGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZhdWx0c3ViY29kZSwgY29uc3QgY2hhciAqZmF1bHRzdHJpbmcsIGNvbnN0IGNoYXIgKmZhdWx0ZGV0YWlsKQoreyByZXR1cm4gc29hcF9jb3B5X2ZhdWx0KHNvYXAsIHNvYXAtPnZlcnNpb24gPT0gMiA/ICJTT0FQLUVOVjpTZW5kZXIiIDogIlNPQVAtRU5WOkNsaWVudCIsIGZhdWx0c3ViY29kZSwgZmF1bHRzdHJpbmcsIGZhdWx0ZGV0YWlsKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWNlaXZlcl9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRzdHJpbmcsIGNvbnN0IGNoYXIgKmZhdWx0ZGV0YWlsKQoreyByZXR1cm4gc29hcF9yZWNlaXZlcl9mYXVsdF9zdWJjb2RlKHNvYXAsIE5VTEwsIGZhdWx0c3RyaW5nLCBmYXVsdGRldGFpbCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVjZWl2ZXJfZmF1bHRfc3ViY29kZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRzdWJjb2RlLCBjb25zdCBjaGFyICpmYXVsdHN0cmluZywgY29uc3QgY2hhciAqZmF1bHRkZXRhaWwpCit7IHJldHVybiBzb2FwX2NvcHlfZmF1bHQoc29hcCwgc29hcC0+dmVyc2lvbiA9PSAyID8gIlNPQVAtRU5WOlJlY2VpdmVyIiA6ICJTT0FQLUVOVjpTZXJ2ZXIiLCBmYXVsdHN1YmNvZGUsIGZhdWx0c3RyaW5nLCBmYXVsdGRldGFpbCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCisjaWZuZGVmIFdJVEhfTk9TVERMSUIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfcHJpbnRfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXAsIEZJTEUgKmZkKQoreyBpZiAoc29hcF9jaGVja19zdGF0ZShzb2FwKSkKKyAgICBmcHJpbnRmKGZkLCAiRXJyb3I6IHNvYXAgc3RydWN0IG5vdCBpbml0aWFsaXplZFxuIik7CisgIGVsc2UgaWYgKHNvYXAtPmVycm9yKQorICB7IGNvbnN0IGNoYXIgKmMsICp2ID0gTlVMTCwgKnMsICoqZDsKKyAgICBkID0gc29hcF9mYXVsdGNvZGUoc29hcCk7CisgICAgaWYgKCEqZCkKKyAgICAgIHNvYXBfc2V0X2ZhdWx0KHNvYXApOworICAgIGMgPSAqZDsKKyAgICBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICAgICAgdiA9ICpzb2FwX2ZhdWx0c3ViY29kZShzb2FwKTsKKyAgICBzID0gKnNvYXBfZmF1bHRzdHJpbmcoc29hcCk7CisgICAgZCA9IHNvYXBfZmF1bHRkZXRhaWwoc29hcCk7CisgICAgZnByaW50ZihmZCwgIiVzJWQgZmF1bHQ6ICVzIFslc11cblwiJXNcIlxuRGV0YWlsOiAlc1xuIiwgc29hcC0+dmVyc2lvbiA/ICJTT0FQIDEuIiA6ICJFcnJvciAiLCBzb2FwLT52ZXJzaW9uID8gKGludClzb2FwLT52ZXJzaW9uIDogc29hcC0+ZXJyb3IsIGMsIHYgPyB2IDogIm5vIHN1YmNvZGUiLCBzID8gcyA6ICJbbm8gcmVhc29uXSIsIGQgJiYgKmQgPyAqZCA6ICJbbm8gZGV0YWlsXSIpOworICB9Cit9CisjZW5kaWYKKyNlbmRpZgorIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCisjaWZuZGVmIFdJVEhfTk9TVERMSUIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfcHJpbnRfZmF1bHRfbG9jYXRpb24oc3RydWN0IHNvYXAgKnNvYXAsIEZJTEUgKmZkKQoreyAKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGludCBpLCBqLCBjMSwgYzI7CisgIGlmIChzb2FwLT5lcnJvciAmJiBzb2FwLT5idWZsZW4gPiAwKQorICB7IGkgPSAoaW50KXNvYXAtPmJ1ZmlkeCAtIDE7CisgICAgaWYgKGkgPD0gMCkKKyAgICAgIGkgPSAwOworICAgIGMxID0gc29hcC0+YnVmW2ldOworICAgIHNvYXAtPmJ1ZltpXSA9ICdcMCc7CisgICAgaWYgKChpbnQpc29hcC0+YnVmbGVuID49IGkgKyAxMDI0KQorICAgICAgaiA9IGkgKyAxMDIzOworICAgIGVsc2UKKyAgICAgIGogPSAoaW50KXNvYXAtPmJ1ZmxlbiAtIDE7CisgICAgYzIgPSBzb2FwLT5idWZbal07CisgICAgc29hcC0+YnVmW2pdID0gJ1wwJzsKKyAgICBmcHJpbnRmKGZkLCAiJXMlY1xuKiogSEVSRSAqKlxuIiwgc29hcC0+YnVmLCBjMSk7CisgICAgaWYgKHNvYXAtPmJ1ZmlkeCA8IHNvYXAtPmJ1ZmxlbikKKyAgICAgIGZwcmludGYoZmQsICIlc1xuIiwgc29hcC0+YnVmICsgc29hcC0+YnVmaWR4KTsKKyAgICBzb2FwLT5idWZbaV0gPSBjMTsKKyAgICBzb2FwLT5idWZbal0gPSBjMjsKKyAgfQorI2VuZGlmCit9CisjZW5kaWYKKyNlbmRpZgorIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVnaXN0ZXJfcGx1Z2luX2FyZyhzdHJ1Y3Qgc29hcCAqc29hcCwgaW50ICgqZmNyZWF0ZSkoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9wbHVnaW4qLCB2b2lkKiksIHZvaWQgKmFyZykKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGx1Z2luICpwOworICByZWdpc3RlciBpbnQgcjsKKyAgaWYgKCEocCA9IChzdHJ1Y3Qgc29hcF9wbHVnaW4qKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9wbHVnaW4pKSkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgIHAtPmlkID0gTlVMTDsKKyAgcC0+ZGF0YSA9IE5VTEw7CisgIHAtPmZjb3B5ID0gTlVMTDsKKyAgcC0+ZmRlbGV0ZSA9IE5VTEw7CisgIHIgPSBmY3JlYXRlKHNvYXAsIHAsIGFyZyk7CisgIGlmICghciAmJiBwLT5mZGVsZXRlKQorICB7IHAtPm5leHQgPSBzb2FwLT5wbHVnaW5zOworICAgIHNvYXAtPnBsdWdpbnMgPSBwOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVnaXN0ZXJlZCAnJXMnIHBsdWdpblxuIiwgcC0+aWQpKTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCByZWdpc3RlciBwbHVnaW4gJyVzJzogcGx1Z2luIHJldHVybmVkIGVycm9yICVkIChvciBmZGVsZXRlIGNhbGxiYWNrIG5vdCBzZXQpXG4iLCBwLT5pZD9wLT5pZDoiPyIsIHIpKTsKKyAgU09BUF9GUkVFKHNvYXAsIHApOworICByZXR1cm4gcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyB2b2lkICoKK2ZwbHVnaW4oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnA7CisgIGZvciAocCA9IHNvYXAtPnBsdWdpbnM7IHA7IHAgPSBwLT5uZXh0KQorICAgIGlmIChwLT5pZCA9PSBpZCB8fCAhc3RyY21wKHAtPmlkLCBpZCkpCisgICAgICByZXR1cm4gcC0+ZGF0YTsKKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkICoKK1NPQVBfRk1BQzIKK3NvYXBfbG9va3VwX3BsdWdpbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQpCit7IHJldHVybiBzb2FwLT5mcGx1Z2luKHNvYXAsIGlkKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIF9fY3BsdXNwbHVzCisjaWZuZGVmIFdJVEhfTEVBTgorc29hcDo6c29hcCgpCit7IHNvYXBfaW5pdCh0aGlzKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJQysrIHNvYXAgc3RydWN0IG1ldGhvZHMKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIF9fY3BsdXNwbHVzCisjaWZuZGVmIFdJVEhfTEVBTgorc29hcDo6c29hcChzb2FwX21vZGUgbW9kZSkKK3sgc29hcF9pbml0MSh0aGlzLCBtb2RlKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpZm5kZWYgV0lUSF9MRUFOCitzb2FwOjpzb2FwKHNvYXBfbW9kZSBpbW9kZSwgc29hcF9tb2RlIG9tb2RlKQoreyBzb2FwX2luaXQyKHRoaXMsIGltb2RlLCBvbW9kZSk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIF9fY3BsdXNwbHVzCisjaWZuZGVmIFdJVEhfTEVBTgorc29hcDo6c29hcChzdHJ1Y3Qgc29hcCYgc29hcCkKK3sgc29hcF9jb3B5X2NvbnRleHQodGhpcywgJnNvYXApOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworI2lmbmRlZiBXSVRIX0xFQU4KK3NvYXA6On5zb2FwKCkKK3sgc29hcF9kZXN0cm95KHRoaXMpOworICBzb2FwX2VuZCh0aGlzKTsKKyAgc29hcF9kb25lKHRoaXMpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2dzb2FwLXBhbG0vc3Rkc29hcDIuYyBiL2dzb2FwLXBhbG0vc3Rkc29hcDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmVkNDYwCi0tLSAvZGV2L251bGwKKysrIGIvZ3NvYXAtcGFsbS9zdGRzb2FwMi5jCkBAIC0wLDAgKzEsMTM0NDggQEAKKy8qCisKK3N0ZHNvYXAyLmNbcHBdIDIuNy42ZQorCitnU09BUCBydW50aW1lCisKK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgcGFydCBvZiB0aGUgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXM6CitHUEwsIHRoZSBnU09BUCBwdWJsaWMgbGljZW5zZSwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NvbnRyaWJ1dG9yczoKKworV2luZCBSaXZlciBTeXN0ZW1zIEluYy4sIGZvciB0aGUgZm9sbG93aW5nIGFkZGl0aW9ucyB1bmRlciBnU09BUCBwdWJsaWMgbGljZW5zZToKKyAgLSB2eFdvcmtzIGNvbXBhdGlibGUJKCNkZWZpbmUgVlhXT1JLUykKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBwdWJsaWMgbGljZW5zZS4KKworVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZ1NPQVAgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjMKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcGxpY2Vuc2UuaHRtbAorU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKK1dJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQorZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFJvYmVydCBBLiB2YW4gRW5nZWxlbi4KK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0luc3RhbGxhdGlvbiBub3RlOgorCitXaW4zMiBidWlsZCBuZWVkcyB3aW5zb2NrLmRsbCAoVmlzdWFsIEMrKyAid3NvY2szMi5saWIiKQorVG8gZG8gdGhpcyBpbiBWaXN1YWwgQysrIDYuMCwgZ28gdG8gIlByb2plY3QiLCAic2V0dGluZ3MiLCBzZWxlY3QgdGhlICJMaW5rIgordGFiICh0aGUgcHJvamVjdCBmaWxlIG5lZWRzIHRvIGJlIHNlbGVjdGVkIGluIHRoZSBmaWxlIHZpZXcpIGFuZCBhZGQKKyJ3c29jazMyLmxpYiIgdG8gdGhlICJPYmplY3QvbGlicmFyeSBtb2R1bGVzIiBlbnRyeQorCitPbiBNYWMgT1MgWCB3aXRoIGdjYyAoR0NDKSAzLjEgMjAwMjA0MjAgKHByZXJlbGVhc2UpIHlvdSBNVVNUIGNvbXBpbGUgd2l0aAorLWZzdGFja19jaGVjayB3aGVuIHVzaW5nIC1PMiBiZWNhdXNlIGdjYyAzLjEgaGFzIGEgYnVnIHRoYXQgc21hc2hlcyB0aGUgc3RhY2sKK3doZW4gbG9jYWxseSBhbGxvY2F0ZWQgZGF0YSBleGNlZWRzIDY0Sy4KKworKi8KKworI2lmZGVmIEFTNDAwCisjIHByYWdtYSBjb252ZXJ0KDgxOSkJLyogRUJDRElDIHRvIEFTQ0lJICovCisjZW5kaWYKKworI2luY2x1ZGUgInN0ZHNvYXAyLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworU09BUF9TT1VSQ0VfU1RBTVAoIkAoIykgc3Rkc29hcDIuY3BwIHZlciAyLjcuNmUgMjAwNi0wMi0xOCAxMjowMDowMCBHTVQiKQorZXh0ZXJuICJDIiB7CisjZWxzZQorU09BUF9TT1VSQ0VfU1RBTVAoIkAoIykgc3Rkc29hcDIuYyB2ZXIgMi43LjZlIDIwMDYtMDItMTggMTI6MDA6MDAgR01UIikKKyNlbmRpZgorCisvKiA4Yml0IGNoYXJhY3RlciByZXByZXNlbnRpbmcgdW5rbm93bi9ub25yZXByZXNlbnRhYmxlIGNoYXJhY3RlciBkYXRhIChlLmcuIG5vdCBzdXBwb3J0ZWQgYnkgY3VycmVudCBsb2NhbGUgd2l0aCBtdWx0aWJ5dGUgc3VwcG9ydCBlbmFibGVkKSAqLworI2lmbmRlZiBTT0FQX1VOS05PV05fQ0hBUgorI2RlZmluZSBTT0FQX1VOS05PV05fQ0hBUiAoMTI3KQorI2VuZGlmCisKKy8qICAgICAgRU9GPS0xICovCisjZGVmaW5lIFNPQVBfTFQgKHNvYXBfd2NoYXIpKC0yKSAvKiBYTUwgY2hhcmFjdGVyICc8JyAqLworI2RlZmluZSBTT0FQX1RUIChzb2FwX3djaGFyKSgtMykgLyogWE1MIGNoYXJhY3RlciAnPC8nICovCisjZGVmaW5lIFNPQVBfR1QgKHNvYXBfd2NoYXIpKC00KSAvKiBYTUwgY2hhcmFjdGVyICc+JyAqLworI2RlZmluZSBTT0FQX1FUIChzb2FwX3djaGFyKSgtNSkgLyogWE1MIGNoYXJhY3RlciAnIicgKi8KKyNkZWZpbmUgU09BUF9BUCAoc29hcF93Y2hhcikoLTYpIC8qIFhNTCBjaGFyYWN0ZXIgJycnICovCisKKyNkZWZpbmUgc29hcF9ibGFuayhjKQkJKChjKSA+PSAwICYmIChjKSA8PSAzMikKKyNkZWZpbmUgc29hcF9ub3RibGFuayhjKQkoKGMpID4gMzIpCisjZGVmaW5lIHNvYXBfaGFzaF9wdHIocCkJKCgodW5zaWduZWQgbG9uZykocCkgPj4gMykgJiAoU09BUF9QVFJIQVNIIC0gMSkpCisKKyNpZmRlZiBTT0FQX0RFQlVHCitzdGF0aWMgdm9pZCBzb2FwX2luaXRfbG9ncyhzdHJ1Y3Qgc29hcCopOworc3RhdGljIHZvaWQgc29hcF9jbG9zZV9sb2dmaWxlKHN0cnVjdCBzb2FwKiwgaW50KTsKK3N0YXRpYyB2b2lkIHNvYXBfc2V0X2xvZ2ZpbGUoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyB2b2lkIHNvYXBfZnJlZV9taHQoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyB2b2lkIHNvYXBfdHJhY2tfdW5saW5rKHN0cnVjdCBzb2FwKiwgY29uc3Qgdm9pZCopOworI2VuZGlmCisKKyNpZm5kZWYgUEFMTV8yCitzdGF0aWMgaW50IHNvYXBfc2V0X2Vycm9yKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGludCk7CitzdGF0aWMgaW50IHNvYXBfY29weV9mYXVsdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyBpbnQgc29hcF9nZXRhdHRydmFsKHN0cnVjdCBzb2FwKiwgY2hhciosIHNpemVfdCwgc29hcF93Y2hhcik7CisjZW5kaWYKKworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzb2FwX3djaGFyIHNvYXBfY2hhcihzdHJ1Y3Qgc29hcCopOworc3RhdGljIHNvYXBfd2NoYXIgc29hcF9nZXRfcGkoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBpbnQgc29hcF9pc3hkaWdpdChpbnQpOworc3RhdGljIHZvaWQgKmZwbHVnaW4oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKik7CisjaWZuZGVmIFdJVEhfTk9JRFJFRgorc3RhdGljIHZvaWQgc29hcF91cGRhdGVfcHRycyhzdHJ1Y3Qgc29hcCosIGNoYXIqLCBjaGFyKiwgY2hhciosIGNoYXIqKTsKK3N0YXRpYyBpbnQgc29hcF9oYXNfY29waWVzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyB2b2lkIHNvYXBfaW5pdF9paHQoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyB2b2lkIHNvYXBfZnJlZV9paHQoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyB2b2lkIHNvYXBfaW5pdF9waHQoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyB2b2lkIHNvYXBfZnJlZV9waHQoc3RydWN0IHNvYXAqKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgY29uc3QgY2hhciAqc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitzdGF0aWMgaW50IHNvYXBfaXNudW1lcmljKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworc3RhdGljIHRpbWVfdCBzb2FwX3RpbWVnbShzdHJ1Y3QgdG0qKTsKK3N0YXRpYyBzdHJ1Y3Qgc29hcF9ubGlzdCAqc29hcF9sb29rdXBfbnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc2l6ZV90IG4pOworc3RhdGljIHN0cnVjdCBzb2FwX25saXN0ICpzb2FwX3B1c2hfbnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICpucywgc2hvcnQgdXRpbGl6ZWQpOworc3RhdGljIHZvaWQgc29hcF9wb3BfbnMoc3RydWN0IHNvYXAgKnNvYXApOworc3RhdGljIHZvaWQgc29hcF91dGlsaXplX25zKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHNpemVfdCBuKTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHN0cnVjdCBzb2FwX211bHRpcGFydCAqc29hcF9uZXdfbXVsdGlwYXJ0KHN0cnVjdCBzb2FwKiwgc3RydWN0IHNvYXBfbXVsdGlwYXJ0KiosIHN0cnVjdCBzb2FwX211bHRpcGFydCoqLCBjaGFyKiwgc2l6ZV90KTsKK3N0YXRpYyBpbnQgc29hcF9wdXRkaW1lZmllbGQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc2l6ZV90KTsKK3N0YXRpYyBjaGFyICpzb2FwX2dldGRpbWVmaWVsZChzdHJ1Y3Qgc29hcCosIHNpemVfdCk7CitzdGF0aWMgdm9pZCBzb2FwX3NlbGVjdF9taW1lX2JvdW5kYXJ5KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgaW50IHNvYXBfdmFsaWRfbWltZV9ib3VuZGFyeShzdHJ1Y3Qgc29hcCopOworc3RhdGljIGludCBzb2FwX21hdGNoX2NpZChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitzdGF0aWMgdm9pZCBzb2FwX3Jlc29sdmVfYXR0YWNobWVudChzdHJ1Y3Qgc29hcCosIHN0cnVjdCBzb2FwX211bHRpcGFydCopOworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFdJVEhfR1pJUAorc3RhdGljIGludCBzb2FwX2dldGd6aXBoZHIoc3RydWN0IHNvYXAqKTsKKyNlbmRpZgorCisjaWZkZWYgV0lUSF9PUEVOU1NMCitzdGF0aWMgaW50IHNzbF9pbml0X2RvbmUgPSAwOworc3RhdGljIGludCBzc2xfYXV0aF9pbml0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgaW50IHNzbF92ZXJpZnlfY2FsbGJhY2soaW50LCBYNTA5X1NUT1JFX0NUWCopOworc3RhdGljIGludCBzc2xfcGFzc3dvcmQoY2hhciosIGludCwgaW50LCB2b2lkICopOworc3RhdGljIGNvbnN0IGNoYXIgKnNzbF9lcnJvcihzdHJ1Y3Qgc29hcCosIGludCk7CisvKiBUaGlzIGNhbGxiYWNrIGlzIGluY2x1ZGVkIGZvciBmdXR1cmUgcmVmZXJlbmNlcy4gSXQgc2hvdWxkIG5vdCBiZSBkZWxldGVkCitzdGF0aWMgREggKnNzbF90bXBfZGgoU1NMKiwgaW50LCBpbnQpOworKi8KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoV0lUSF9OT0hUVFApIHx8ICFkZWZpbmVkKFdJVEhfTEVBTkVSKQorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBjb25zdCBjaGFyICpzb2FwX2RlY29kZShjaGFyKiwgc2l6ZV90LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzb2FwX3djaGFyIHNvYXBfZ2V0Y2h1bmtjaGFyKHN0cnVjdCBzb2FwKik7CitzdGF0aWMgY29uc3QgY2hhciAqaHR0cF9lcnJvcihzdHJ1Y3Qgc29hcCosIGludCk7CitzdGF0aWMgaW50IGh0dHBfcG9zdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCk7CitzdGF0aWMgaW50IGh0dHBfZ2V0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgaW50IGh0dHBfc2VuZF9oZWFkZXIoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKik7CitzdGF0aWMgaW50IGh0dHBfcG9zdF9oZWFkZXIoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworc3RhdGljIGludCBodHRwX3Jlc3BvbnNlKHN0cnVjdCBzb2FwKiwgaW50LCBzaXplX3QpOworc3RhdGljIGludCBodHRwX3BhcnNlKHN0cnVjdCBzb2FwKik7CitzdGF0aWMgaW50IGh0dHBfcGFyc2VfaGVhZGVyKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludCBmc2VuZChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworc3RhdGljIHNpemVfdCBmcmVjdihzdHJ1Y3Qgc29hcCosIGNoYXIqLCBzaXplX3QpOworc3RhdGljIGludCB0Y3BfaW5pdChzdHJ1Y3Qgc29hcCopOworc3RhdGljIGNvbnN0IGNoYXIgKnRjcF9lcnJvcihzdHJ1Y3Qgc29hcCopOworI2lmbmRlZiBXSVRIX0lQVjYKK3N0YXRpYyBpbnQgdGNwX2dldGhvc3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICphZGRyLCBzdHJ1Y3QgaW5fYWRkciAqaW5hZGRyKTsKKyNlbmRpZgorc3RhdGljIGludCB0Y3BfY29ubmVjdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjb25zdCBjaGFyICpob3N0LCBpbnQgcG9ydCk7CitzdGF0aWMgaW50IHRjcF9hY2NlcHQoc3RydWN0IHNvYXAqLCBpbnQsIHN0cnVjdCBzb2NrYWRkciosIGludCopOworc3RhdGljIGludCB0Y3BfZGlzY29ubmVjdChzdHJ1Y3Qgc29hcCopOworc3RhdGljIGludCB0Y3BfY2xvc2Vzb2NrZXQoc3RydWN0IHNvYXAqLCBTT0FQX1NPQ0tFVCk7CitzdGF0aWMgaW50IHRjcF9zaHV0ZG93bnNvY2tldChzdHJ1Y3Qgc29hcCosIFNPQVBfU09DS0VULCBpbnQpOworc3RhdGljIGNvbnN0IGNoYXIgKnNvYXBfc3RyZXJyb3Ioc3RydWN0IHNvYXAqKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBBTE0pICYmICFkZWZpbmVkKFBBTE1fMikKK3Vuc2lnbmVkIHNob3J0IGVycm5vOworI2VuZGlmCisKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY29uc3QgY2hhciBzb2FwX2VudjFbNDJdID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIjsKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfZW5jMVs0Ml0gPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iOworc3RhdGljIGNvbnN0IGNoYXIgc29hcF9lbnYyWzQwXSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiOworc3RhdGljIGNvbnN0IGNoYXIgc29hcF9lbmMyWzQwXSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW5jb2RpbmciOworc3RhdGljIGNvbnN0IGNoYXIgc29hcF9ycGNbMzVdID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1ycGMiOworI2VuZGlmCisKKyNpZm5kZWYgUEFMTV8xCitjb25zdCBzdHJ1Y3Qgc29hcF9kb3VibGVfbmFuIHNvYXBfZG91YmxlX25hbiA9IHsweEZGRkZGRkZGLCAweEZGRkZGRkZGfTsKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfYmFzZTY0b1s2NV0gPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CitzdGF0aWMgY29uc3QgY2hhciBzb2FwX2Jhc2U2NGlbODFdID0gIlw3NlhYWFw3N1w2NFw2NVw2Nlw2N1w3MFw3MVw3Mlw3M1w3NFw3NVhYWFhYWFhcMDBcMDFcMDJcMDNcMDRcMDVcMDZcMDdcMTBcMTFcMTJcMTNcMTRcMTVcMTZcMTdcMjBcMjFcMjJcMjNcMjRcMjVcMjZcMjdcMzBcMzFYWFhYWFhcMzJcMzNcMzRcMzVcMzZcMzdcNDBcNDFcNDJcNDNcNDRcNDVcNDZcNDdcNTBcNTFcNTJcNTNcNTRcNTVcNTZcNTdcNjBcNjFcNjJcNjMiOworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgY29uc3QgY2hhciBzb2FwX2luZGVudFsxMV0gPSAiXG5cdFx0XHRcdFx0XHRcdFx0XHQiOworLyogQWx0ZXJuYXRpdmUgaW5kZW50YXRpb24gZm9ybSBmb3IgU09BUF9YTUxfSU5ERU5UOgorc3RhdGljIGNvbnN0IGNoYXIgc29hcF9pbmRlbnRbMjFdID0gIlxuICAgICAgICAgICAgICAgICAgICI7CisqLworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfcGFkZGluZ1s0XSA9ICJcMFwwXDAiOworI2RlZmluZSBTT0FQX1NUUl9QQURESU5HIChzb2FwX3BhZGRpbmcpCisjZGVmaW5lIFNPQVBfU1RSX0VPUyAoc29hcF9wYWRkaW5nKQorI2RlZmluZSBTT0FQX05PTl9OVUxMIChzb2FwX3BhZGRpbmcpCisKKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgaHRtbF9lbnRpdHlfY29kZXNbXSA9IC8qIGVudGl0aWVzIGZvciBYSFRNTCBwYXJzaW5nICovCit7IHsgMTYwLCAibmJzcCIgfSwKKyAgeyAxNjEsICJpZXhjbCIgfSwKKyAgeyAxNjIsICJjZW50IiB9LAorICB7IDE2MywgInBvdW5kIiB9LAorICB7IDE2NCwgImN1cnJlbiIgfSwKKyAgeyAxNjUsICJ5ZW4iIH0sCisgIHsgMTY2LCAiYnJ2YmFyIiB9LAorICB7IDE2NywgInNlY3QiIH0sCisgIHsgMTY4LCAidW1sIiB9LAorICB7IDE2OSwgImNvcHkiIH0sCisgIHsgMTcwLCAib3JkZiIgfSwKKyAgeyAxNzEsICJsYXF1byIgfSwKKyAgeyAxNzIsICJub3QiIH0sCisgIHsgMTczLCAic2h5IiB9LAorICB7IDE3NCwgInJlZyIgfSwKKyAgeyAxNzUsICJtYWNyIiB9LAorICB7IDE3NiwgImRlZyIgfSwKKyAgeyAxNzcsICJwbHVzbW4iIH0sCisgIHsgMTc4LCAic3VwMiIgfSwKKyAgeyAxNzksICJzdXAzIiB9LAorICB7IDE4MCwgImFjdXRlIiB9LAorICB7IDE4MSwgIm1pY3JvIiB9LAorICB7IDE4MiwgInBhcmEiIH0sCisgIHsgMTgzLCAibWlkZG90IiB9LAorICB7IDE4NCwgImNlZGlsIiB9LAorICB7IDE4NSwgInN1cDEiIH0sCisgIHsgMTg2LCAib3JkbSIgfSwKKyAgeyAxODcsICJyYXF1byIgfSwKKyAgeyAxODgsICJmcmFjMTQiIH0sCisgIHsgMTg5LCAiZnJhYzEyIiB9LAorICB7IDE5MCwgImZyYWMzNCIgfSwKKyAgeyAxOTEsICJpcXVlc3QiIH0sCisgIHsgMTkyLCAiQWdyYXZlIiB9LAorICB7IDE5MywgIkFhY3V0ZSIgfSwKKyAgeyAxOTQsICJBY2lyYyIgfSwKKyAgeyAxOTUsICJBdGlsZGUiIH0sCisgIHsgMTk2LCAiQXVtbCIgfSwKKyAgeyAxOTcsICJBcmluZyIgfSwKKyAgeyAxOTgsICJBRWxpZyIgfSwKKyAgeyAxOTksICJDY2VkaWwiIH0sCisgIHsgMjAwLCAiRWdyYXZlIiB9LAorICB7IDIwMSwgIkVhY3V0ZSIgfSwKKyAgeyAyMDIsICJFY2lyYyIgfSwKKyAgeyAyMDMsICJFdW1sIiB9LAorICB7IDIwNCwgIklncmF2ZSIgfSwKKyAgeyAyMDUsICJJYWN1dGUiIH0sCisgIHsgMjA2LCAiSWNpcmMiIH0sCisgIHsgMjA3LCAiSXVtbCIgfSwKKyAgeyAyMDgsICJFVEgiIH0sCisgIHsgMjA5LCAiTnRpbGRlIiB9LAorICB7IDIxMCwgIk9ncmF2ZSIgfSwKKyAgeyAyMTEsICJPYWN1dGUiIH0sCisgIHsgMjEyLCAiT2NpcmMiIH0sCisgIHsgMjEzLCAiT3RpbGRlIiB9LAorICB7IDIxNCwgIk91bWwiIH0sCisgIHsgMjE1LCAidGltZXMiIH0sCisgIHsgMjE2LCAiT3NsYXNoIiB9LAorICB7IDIxNywgIlVncmF2ZSIgfSwKKyAgeyAyMTgsICJVYWN1dGUiIH0sCisgIHsgMjE5LCAiVWNpcmMiIH0sCisgIHsgMjIwLCAiVXVtbCIgfSwKKyAgeyAyMjEsICJZYWN1dGUiIH0sCisgIHsgMjIyLCAiVEhPUk4iIH0sCisgIHsgMjIzLCAic3psaWciIH0sCisgIHsgMjI0LCAiYWdyYXZlIiB9LAorICB7IDIyNSwgImFhY3V0ZSIgfSwKKyAgeyAyMjYsICJhY2lyYyIgfSwKKyAgeyAyMjcsICJhdGlsZGUiIH0sCisgIHsgMjI4LCAiYXVtbCIgfSwKKyAgeyAyMjksICJhcmluZyIgfSwKKyAgeyAyMzAsICJhZWxpZyIgfSwKKyAgeyAyMzEsICJjY2VkaWwiIH0sCisgIHsgMjMyLCAiZWdyYXZlIiB9LAorICB7IDIzMywgImVhY3V0ZSIgfSwKKyAgeyAyMzQsICJlY2lyYyIgfSwKKyAgeyAyMzUsICJldW1sIiB9LAorICB7IDIzNiwgImlncmF2ZSIgfSwKKyAgeyAyMzcsICJpYWN1dGUiIH0sCisgIHsgMjM4LCAiaWNpcmMiIH0sCisgIHsgMjM5LCAiaXVtbCIgfSwKKyAgeyAyNDAsICJldGgiIH0sCisgIHsgMjQxLCAibnRpbGRlIiB9LAorICB7IDI0MiwgIm9ncmF2ZSIgfSwKKyAgeyAyNDMsICJvYWN1dGUiIH0sCisgIHsgMjQ0LCAib2NpcmMiIH0sCisgIHsgMjQ1LCAib3RpbGRlIiB9LAorICB7IDI0NiwgIm91bWwiIH0sCisgIHsgMjQ3LCAiZGl2aWRlIiB9LAorICB7IDI0OCwgIm9zbGFzaCIgfSwKKyAgeyAyNDksICJ1Z3JhdmUiIH0sCisgIHsgMjUwLCAidWFjdXRlIiB9LAorICB7IDI1MSwgInVjaXJjIiB9LAorICB7IDI1MiwgInV1bWwiIH0sCisgIHsgMjUzLCAieWFjdXRlIiB9LAorICB7IDI1NCwgInRob3JuIiB9LAorICB7IDI1NSwgInl1bWwiIH0sCisgIHsgICAwLCBOVUxMIH0KK307CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgaF9lcnJvcl9jb2Rlc1tdID0KK3sKKyNpZmRlZiBIT1NUX05PVF9GT1VORCAgIAorICB7IEhPU1RfTk9UX0ZPVU5ELCAiSG9zdCBub3QgZm91bmQiIH0sCisjZW5kaWYKKyNpZmRlZiBUUllfQUdBSU4KKyAgeyBUUllfQUdBSU4sICJUcnkgQWdhaW4iIH0sCisjZW5kaWYKKyNpZmRlZiBOT19SRUNPVkVSWSAgCisgIHsgTk9fUkVDT1ZFUlksICJObyBSZWNvdmVyeSIgfSwKKyNlbmRpZgorI2lmZGVmIE5PX0RBVEEKKyAgeyBOT19EQVRBLCAiTm8gRGF0YSIgfSwKKyNlbmRpZgorI2lmZGVmIE5PX0FERFJFU1MKKyAgeyBOT19BRERSRVNTLCAiTm8gQWRkcmVzcyIgfSwKKyNlbmRpZgorICB7IDAsIE5VTEwgfQorfTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgaF9odHRwX2Vycm9yX2NvZGVzW10gPQoreyB7IDIwMSwgIkNyZWF0ZWQiIH0sCisgIHsgMjAyLCAiQWNjZXB0ZWQiIH0sCisgIHsgMjAzLCAiTm9uLUF1dGhvcml0YXRpdmUgSW5mb3JtYXRpb24iIH0sCisgIHsgMjA0LCAiTm8gQ29udGVudCIgfSwKKyAgeyAyMDUsICJSZXNldCBDb250ZW50IiB9LAorICB7IDIwNiwgIlBhcnRpYWwgQ29udGVudCIgfSwKKyAgeyAzMDAsICJNdWx0aXBsZSBDaG9pY2VzIiB9LAorICB7IDMwMSwgIk1vdmVkIFBlcm1hbmVudGx5IiB9LAorICB7IDMwMiwgIkZvdW5kIiB9LAorICB7IDMwMywgIlNlZSBPdGhlciIgfSwKKyAgeyAzMDQsICJOb3QgTW9kaWZpZWQiIH0sCisgIHsgMzA1LCAiVXNlIFByb3h5IiB9LAorICB7IDMwNywgIlRlbXBvcmFyeSBSZWRpcmVjdCIgfSwKKyAgeyA0MDAsICJCYWQgUmVxdWVzdCIgfSwKKyAgeyA0MDEsICJVbmF1dGhvcml6ZWQiIH0sCisgIHsgNDAyLCAiUGF5bWVudCBSZXF1aXJlZCIgfSwKKyAgeyA0MDMsICJGb3JiaWRkZW4iIH0sCisgIHsgNDA0LCAiTm90IEZvdW5kIiB9LAorICB7IDQwNSwgIk1ldGhvZCBOb3QgQWxsb3dlZCIgfSwKKyAgeyA0MDYsICJOb3QgQWNjZXB0YWJsZSIgfSwKKyAgeyA0MDcsICJQcm94eSBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZCIgfSwKKyAgeyA0MDgsICJSZXF1ZXN0IFRpbWUtb3V0IiB9LAorICB7IDQwOSwgIkNvbmZsaWN0IiB9LAorICB7IDQxMCwgIkdvbmUiIH0sCisgIHsgNDExLCAiTGVuZ3RoIFJlcXVpcmVkIiB9LAorICB7IDQxMiwgIlByZWNvbmRpdGlvbiBGYWlsZWQiIH0sCisgIHsgNDEzLCAiUmVxdWVzdCBFbnRpdHkgVG9vIExhcmdlIiB9LAorICB7IDQxNCwgIlJlcXVlc3QtVVJJIFRvbyBMYXJnZSIgfSwKKyAgeyA0MTUsICJVbnN1cHBvcnRlZCBNZWRpYSBUeXBlIiB9LAorICB7IDQxNiwgIlJlcXVlc3RlZCByYW5nZSBub3Qgc2F0aXNmaWFibGUiIH0sCisgIHsgNDE3LCAiRXhwZWN0YXRpb24gRmFpbGVkIiB9LAorICB7IDUwMCwgIkludGVybmFsIFNlcnZlciBFcnJvciIgfSwKKyAgeyA1MDEsICJOb3QgSW1wbGVtZW50ZWQiIH0sCisgIHsgNTAyLCAiQmFkIEdhdGV3YXkiIH0sCisgIHsgNTAzLCAiU2VydmljZSBVbmF2YWlsYWJsZSIgfSwKKyAgeyA1MDQsICJHYXRld2F5IFRpbWUtb3V0IiB9LAorICB7IDUwNSwgIkhUVFAgVmVyc2lvbiBub3Qgc3VwcG9ydGVkIiB9LAorICB7ICAgMCwgTlVMTCB9Cit9OworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFdJVEhfT1BFTlNTTAorc3RhdGljIGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwIGhfc3NsX2Vycm9yX2NvZGVzW10gPQoreworI2RlZmluZSBfU1NMX0VSUk9SKGUpIHsgZSwgI2UgfQorICBfU1NMX0VSUk9SKFNTTF9FUlJPUl9TU0wpLAorICBfU1NMX0VSUk9SKFNTTF9FUlJPUl9aRVJPX1JFVFVSTiksCisgIF9TU0xfRVJST1IoU1NMX0VSUk9SX1dBTlRfUkVBRCksCisgIF9TU0xfRVJST1IoU1NMX0VSUk9SX1dBTlRfV1JJVEUpLAorICBfU1NMX0VSUk9SKFNTTF9FUlJPUl9XQU5UX0NPTk5FQ1QpLAorICBfU1NMX0VSUk9SKFNTTF9FUlJPUl9XQU5UX1g1MDlfTE9PS1VQKSwKKyAgX1NTTF9FUlJPUihTU0xfRVJST1JfU1lTQ0FMTCksCisgIHsgMCwgTlVMTCB9Cit9OworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCBtaW1lX2NvZGVzW10gPQoreyB7IFNPQVBfTUlNRV83QklULAkJIjdiaXQiIH0sCisgIHsgU09BUF9NSU1FXzhCSVQsCQkiOGJpdCIgfSwKKyAgeyBTT0FQX01JTUVfQklOQVJZLAkJImJpbmFyeSIgfSwKKyAgeyBTT0FQX01JTUVfUVVPVEVEX1BSSU5UQUJMRSwgInF1b3RlZC1wcmludGFibGUiIH0sCisgIHsgU09BUF9NSU1FX0JBU0U2NCwJCSJiYXNlNjQiIH0sCisgIHsgU09BUF9NSU1FX0lFVEZfVE9LRU4sCSJpZXRmLXRva2VuIiB9LAorICB7IFNPQVBfTUlNRV9YX1RPS0VOLAkJIngtdG9rZW4iIH0sCisgIHsgMCwJCQkJTlVMTCB9Cit9OworI2VuZGlmCisKKyNpZmRlZiBXSU4zMgorc3RhdGljIGludCB0Y3BfZG9uZSA9IDA7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorZnNlbmQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBuKQoreyByZWdpc3RlciBpbnQgbndyaXR0ZW47CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgIWRlZmluZWQoV0lUSF9MRUFOKQorICBpZiAoc29hcC0+b3MpCisgIHsgc29hcC0+b3MtPndyaXRlKHMsIG4pOworICAgIGlmIChzb2FwLT5vcy0+Z29vZCgpKQorICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgcmV0dXJuIFNPQVBfRU9GOworICB9CisjZW5kaWYKKyAgd2hpbGUgKG4pCisgIHsgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgICAgeyAKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICBpZiAoc29hcC0+c2VuZF90aW1lb3V0KQorICAgICAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgICAgICBmZF9zZXQgZmQ7CisgICAgICAgIGlmIChzb2FwLT5zZW5kX3RpbWVvdXQgPiAwKQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gc29hcC0+c2VuZF90aW1lb3V0OworICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gLXNvYXAtPnNlbmRfdGltZW91dC8xMDAwMDAwOworICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IC1zb2FwLT5zZW5kX3RpbWVvdXQlMTAwMDAwMDsKKyAgICAgICAgfQorICAgICAgICBGRF9aRVJPKCZmZCk7CisgICAgICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmZmQpOworICAgICAgICBmb3IgKDs7KQorICAgICAgICB7IHJlZ2lzdGVyIGludCByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksIE5VTEwsICZmZCwgJmZkLCAmdGltZW91dCk7CisgICAgICAgICAgaWYgKHIgPiAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgaWYgKCFyKQorICAgICAgICAgIHsgc29hcC0+ZXJybnVtID0gMDsKKyAgICAgICAgICAgIHJldHVybiBTT0FQX0VPRjsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FQUdBSU4pCisgICAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICAgIHJldHVybiBTT0FQX0VPRjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyNlbmRpZgorI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgICAgaWYgKHNvYXAtPnNzbCkKKyAgICAgICAgbndyaXR0ZW4gPSBTU0xfd3JpdGUoc29hcC0+c3NsLCBzLCBuKTsKKyAgICAgIGVsc2UgaWYgKHNvYXAtPmJpbykKKyAgICAgICAgbndyaXR0ZW4gPSBCSU9fd3JpdGUoc29hcC0+YmlvLCBzLCBuKTsKKyAgICAgIGVsc2UKKyNlbmRpZgorI2lmZGVmIFdJVEhfVURQCisgICAgICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgICAgeyBpZiAoc29hcC0+cGVlcmxlbikKKwkgIG53cml0dGVuID0gc2VuZHRvKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHMsIG4sIHNvYXAtPnNvY2tldF9mbGFncywgKHN0cnVjdCBzb2NrYWRkciopJnNvYXAtPnBlZXIsIHNvYXAtPnBlZXJsZW4pOworICAgICAgICBlbHNlCisJICBud3JpdHRlbiA9IHNlbmQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgcywgbiwgc29hcC0+c29ja2V0X2ZsYWdzKTsKKwkvKiByZXRyeSBhbmQgYmFjay1vZmYgYWxnb3JpdGhtICovCisJLyogVE9ETzogdGhpcyBpcyBub3QgdmVyeSBjbGVhciBmcm9tIHNwZWNzIHNvIHZlcmlmeSBhbmQgbGltaXQgY29uZGl0aW9ucyB1bmRlciB3aGljaCB3ZSBzaG91bGQgbG9vcCAoZS5nLiBFTk9CVUZTKSAqLworCWlmIChud3JpdHRlbiA8IDApCisgICAgICAgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgICAgICBmZF9zZXQgZmQ7CisJICBpbnQgdWRwX3JlcGVhdDsKKwkgIGludCB1ZHBfZGVsYXk7CisgICAgICAgICAgaWYgKChzb2FwLT5jb25uZWN0X2ZsYWdzICYgU09fQlJPQURDQVNUKSkKKwkgICAgdWRwX3JlcGVhdCA9IDM7IC8qIFNPQVAtb3Zlci1VRFAgTVVMVElDQVNUX1VEUF9SRVBFQVQgLSAxICovCisgICAgICAgICAgZWxzZQorCSAgICB1ZHBfcmVwZWF0ID0gMTsgLyogU09BUC1vdmVyLVVEUCBVTklDQVNUX1VEUF9SRVBFQVQgLSAxICovCisJICB1ZHBfZGVsYXkgPSAoc29hcF9yYW5kb20gJSAyMDEpICsgNTA7IC8qIFVEUF9NSU5fREVMQVkgLi4gVURQX01BWF9ERUxBWSAqLworCSAgZG8KKyAgICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gMDsKKyAgICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDEwMDAgKiB1ZHBfZGVsYXk7IC8qIG1zICovCisgICAgICAgICAgICBGRF9aRVJPKCZmZCk7CisgICAgICAgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJmZkKTsKKyAgICAgICAgICAgIHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCBOVUxMLCBOVUxMLCAmZmQsICZ0aW1lb3V0KTsKKwkgICAgaWYgKHNvYXAtPnBlZXJsZW4pCisJICAgICAgbndyaXR0ZW4gPSBzZW5kdG8oKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgcywgbiwgc29hcC0+c29ja2V0X2ZsYWdzLCAoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlciwgc29hcC0+cGVlcmxlbik7CisgICAgICAgICAgICBlbHNlCisJICAgICAgbndyaXR0ZW4gPSBzZW5kKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHMsIG4sIHNvYXAtPnNvY2tldF9mbGFncyk7CisJICAgIHVkcF9kZWxheSA8PD0gMTsKKwkgICAgaWYgKHVkcF9kZWxheSA+IDUwMCkgLyogVURQX1VQUEVSX0RFTEFZICovCisJICAgICAgdWRwX2RlbGF5ID0gNTAwOworCSAgfQorCSAgd2hpbGUgKG53cml0dGVuIDwgMCAmJiAtLXVkcF9yZXBlYXQgPiAwKTsKKwl9CisgICAgICB9CisgICAgICBlbHNlCisjZW5kaWYKKyNpZiAhZGVmaW5lZChQQUxNKSAmJiAhZGVmaW5lZChBUzQwMCkKKyAgICAgICAgbndyaXR0ZW4gPSBzZW5kKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHMsIG4sIHNvYXAtPnNvY2tldF9mbGFncyk7CisjZWxzZQorICAgICAgICBud3JpdHRlbiA9IHNlbmQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgKHZvaWQqKXMsIG4sIHNvYXAtPnNvY2tldF9mbGFncyk7CisjZW5kaWYKKyAgICAgIGlmIChud3JpdHRlbiA8PSAwKQorICAgICAgeworI2lmZGVmIFdJVEhfT1BFTlNTTAorCWludCBlcnI7CisgICAgICAgIGlmIChzb2FwLT5zc2wgJiYgKGVyciA9IFNTTF9nZXRfZXJyb3Ioc29hcC0+c3NsLCBud3JpdHRlbikpICE9IFNTTF9FUlJPUl9OT05FICYmIGVyciAhPSBTU0xfRVJST1JfV0FOVF9SRUFEICYmIGVyciAhPSBTU0xfRVJST1JfV0FOVF9XUklURSkKKyAgICAgICAgICByZXR1cm4gU09BUF9FT0Y7CisjZW5kaWYKKyAgICAgICAgaWYgKHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FV09VTERCTE9DSyAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VBR0FJTikKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICByZXR1cm4gU09BUF9FT0Y7CisgICAgICAgIH0KKyAgICAgICAgbndyaXR0ZW4gPSAwOyAvKiBhbmQgY2FsbCB3cml0ZSgpIGFnYWluICovCisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisjaWZkZWYgV0lUSF9GQVNUQ0dJCisgICAgICBud3JpdHRlbiA9IGZ3cml0ZSgodm9pZCopcywgMSwgbiwgc3Rkb3V0KTsKKyAgICAgIGZmbHVzaChzdGRvdXQpOworI2Vsc2UKKyNpZmRlZiBVTkRFUl9DRQorICAgICAgbndyaXR0ZW4gPSBmd3JpdGUocywgMSwgbiwgc29hcC0+c2VuZGZkKTsKKyNlbHNlCisjaWZkZWYgVlhXT1JLUworI2lmZGVmIFdNV19SUE1fSU8KKyAgICAgIGlmIChzb2FwLT5ycG1yZXFpZCkKKyAgICAgICAgbndyaXR0ZW4gPSAoaHR0cEJsb2NrUHV0KHNvYXAtPnJwbXJlcWlkLCBzLCBuKSA9PSAwKSA/IG4gOiAtMTsgCisgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgbndyaXR0ZW4gPSBmd3JpdGUocywgc2l6ZW9mKGNoYXIpLCBuLCBmZG9wZW4oc29hcC0+c2VuZGZkLCAidyIpKTsKKyNlbHNlCisgICAgICBud3JpdHRlbiA9IHdyaXRlKChTT0FQX1NPQ0tFVClzb2FwLT5zZW5kZmQsIHMsIG4pOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorICAgICAgaWYgKG53cml0dGVuIDw9IDApCisgICAgICB7IGlmIChzb2FwX2Vycm5vICE9IFNPQVBfRUlOVFIgJiYgc29hcF9lcnJubyAhPSBTT0FQX0VXT1VMREJMT0NLICYmIHNvYXBfZXJybm8gIT0gU09BUF9FQUdBSU4pCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9lcnJubzsKKyAgICAgICAgICByZXR1cm4gU09BUF9FT0Y7CisgICAgICAgIH0KKyAgICAgICAgbndyaXR0ZW4gPSAwOyAvKiBhbmQgY2FsbCB3cml0ZSgpIGFnYWluICovCisgICAgICB9CisgICAgfQorICAgIG4gLT0gbndyaXR0ZW47CisgICAgcyArPSBud3JpdHRlbjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmRfcmF3KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBzaXplX3QgbikKK3sgaWYgKCFuKQorICAgIHJldHVybiBTT0FQX09LOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICB7IHNvYXAtPmNvdW50ICs9IG47CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgICAgaWYgKHNvYXAtPmZwcmVwYXJlc2VuZCAmJiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pICE9IFNPQVBfSU9fU1RPUkUpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBzb2FwLT5mcHJlcGFyZXNlbmQoc29hcCwgcywgbik7CisjZW5kaWYKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pCisgIHsgcmVnaXN0ZXIgc2l6ZV90IGkgPSBTT0FQX0JVRkxFTiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICB3aGlsZSAobiA+PSBpKQorICAgIHsgbWVtY3B5KHNvYXAtPmJ1ZiArIHNvYXAtPmJ1ZmlkeCwgcywgaSk7CisgICAgICBzb2FwLT5idWZpZHggPSBTT0FQX0JVRkxFTjsKKyAgICAgIGlmIChzb2FwX2ZsdXNoKHNvYXApKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBzICs9IGk7CisgICAgICBuIC09IGk7CisgICAgICBpID0gU09BUF9CVUZMRU47CisgICAgfQorICAgIG1lbWNweShzb2FwLT5idWYgKyBzb2FwLT5idWZpZHgsIHMsIG4pOworICAgIHNvYXAtPmJ1ZmlkeCArPSBuOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIHJldHVybiBzb2FwX2ZsdXNoX3Jhdyhzb2FwLCBzLCBuKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9mbHVzaChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IG4gPSBzb2FwLT5idWZpZHg7CisgIGlmIChuKQorICB7IHNvYXAtPmJ1ZmlkeCA9IDA7CisjaWZkZWYgV0lUSF9aTElCCisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKQorICAgIHsgc29hcC0+ZF9zdHJlYW0ubmV4dF9pbiA9IChCeXRlKilzb2FwLT5idWY7CisgICAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbiA9ICh1bnNpZ25lZCBpbnQpbjsKKyNpZmRlZiBXSVRIX0daSVAKKyAgICAgIHNvYXAtPnpfY3JjID0gY3JjMzIoc29hcC0+el9jcmMsIChCeXRlKilzb2FwLT5idWYsICh1bnNpZ25lZCBpbnQpbik7CisjZW5kaWYKKyAgICAgIGRvCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVmbGF0aW5nICV1IGJ5dGVzXG4iLCBzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbikpOworICAgICAgICBpZiAoZGVmbGF0ZSgmc29hcC0+ZF9zdHJlYW0sIFpfTk9fRkxVU0gpICE9IFpfT0spCisgICAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVbmFibGUgdG8gZGVmbGF0ZTogJXNcbiIsIHNvYXAtPmRfc3RyZWFtLm1zZz9zb2FwLT5kX3N0cmVhbS5tc2c6IiIpKTsKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQpCisgICAgICAgIHsgaWYgKHNvYXBfZmx1c2hfcmF3KHNvYXAsIHNvYXAtPnpfYnVmLCBTT0FQX0JVRkxFTikpCisgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZSopc29hcC0+el9idWY7CisgICAgICAgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0ID0gU09BUF9CVUZMRU47CisgICAgICAgIH0KKyAgICAgIH0gd2hpbGUgKHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgICByZXR1cm4gc29hcF9mbHVzaF9yYXcoc29hcCwgc29hcC0+YnVmLCBuKTsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9mbHVzaF9yYXcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBuKQoreyBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX1NUT1JFKQorICB7IHJlZ2lzdGVyIGNoYXIgKnQ7CisgICAgaWYgKCEodCA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgbikpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgbWVtY3B5KHQsIHMsIG4pOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICAgIGlmIChzb2FwLT5mcHJlcGFyZXNlbmQpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBzb2FwLT5mcHJlcGFyZXNlbmQoc29hcCwgcywgbik7CisjZW5kaWYKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKQorICB7IGNoYXIgdFsxNl07CisgICAgc3ByaW50Zih0LCAiXHJcbiVsWFxyXG4iICsgKHNvYXAtPmNodW5rc2l6ZSA/IDAgOiAyKSwgKHVuc2lnbmVkIGxvbmcpbik7CisgICAgREJHTVNHKFNFTlQsIHQsIHN0cmxlbih0KSk7CisgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZzZW5kKHNvYXAsIHQsIHN0cmxlbih0KSkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIHNvYXAtPmNodW5rc2l6ZSArPSBuOworICB9CisgIERCR01TRyhTRU5ULCBzLCBuKTsKKyNlbmRpZgorICByZXR1cm4gc29hcC0+ZXJyb3IgPSBzb2FwLT5mc2VuZChzb2FwLCBzLCBuKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZW5kKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzKQoreyBpZiAocykKKyAgICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCBzdHJsZW4ocykpOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZW5kMihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKQoreyBpZiAoc29hcF9zZW5kKHNvYXAsIHMxKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX3NlbmQoc29hcCwgczIpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2VuZDMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgY29uc3QgY2hhciAqczMpCit7IGlmIChzb2FwX3NlbmQoc29hcCwgczEpCisgICB8fCBzb2FwX3NlbmQoc29hcCwgczIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfc2VuZChzb2FwLCBzMyk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc2l6ZV90CitmcmVjdihzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqcywgc2l6ZV90IG4pCit7IHJlZ2lzdGVyIGludCByOworICBzb2FwLT5lcnJudW0gPSAwOworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpICYmICFkZWZpbmVkKFdJVEhfTEVBTikKKyAgaWYgKHNvYXAtPmlzKQorICB7IGlmIChzb2FwLT5pcy0+Z29vZCgpKQorICAgICAgcmV0dXJuIHNvYXAtPmlzLT5yZWFkKHMsIG4pLmdjb3VudCgpOworICAgIHJldHVybiAwOworICB9CisjZW5kaWYKKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgIHsgZm9yICg7OykKKyAgICB7IAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIGlmIChzb2FwLT5yZWN2X3RpbWVvdXQpCisgICAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICAgIGZkX3NldCBmZDsKKyAgICAgICAgaWYgKHNvYXAtPnJlY3ZfdGltZW91dCA+IDApCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSBzb2FwLT5yZWN2X3RpbWVvdXQ7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSAtc29hcC0+cmVjdl90aW1lb3V0LzEwMDAwMDA7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gLXNvYXAtPnJlY3ZfdGltZW91dCUxMDAwMDAwOworICAgICAgICB9CisgICAgICAgIEZEX1pFUk8oJmZkKTsKKyAgICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZmZCk7CisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCAmZmQsIE5VTEwsICZmZCwgJnRpbWVvdXQpOworICAgICAgICAgIGlmIChyID4gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGlmICghcikKKwkgIHsgc29hcC0+ZXJybnVtID0gMDsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUiAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VBR0FJTikKKwkgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyNlbmRpZgorI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgICAgaWYgKHNvYXAtPnNzbCkKKyAgICAgIHsgaW50IGVycjsKKwlyID0gU1NMX3JlYWQoc29hcC0+c3NsLCBzLCBuKTsKKyAgICAgICAgaWYgKHIgPiAwKQorICAgICAgICAgIHJldHVybiAoc2l6ZV90KXI7CisJZXJyID0gU1NMX2dldF9lcnJvcihzb2FwLT5zc2wsIHIpOworCWlmIChlcnIgIT0gU1NMX0VSUk9SX05PTkUgJiYgZXJyICE9IFNTTF9FUlJPUl9XQU5UX1JFQUQgJiYgZXJyICE9IFNTTF9FUlJPUl9XQU5UX1dSSVRFKQorICAgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgZWxzZSBpZiAoc29hcC0+YmlvKQorICAgICAgeyByID0gQklPX3JlYWQoc29hcC0+YmlvLCBzLCBuKTsKKyAgICAgICAgaWYgKHIgPiAwKQorICAgICAgICAgIHJldHVybiAoc2l6ZV90KXI7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgZWxzZQorI2VuZGlmCisgICAgICB7IAorI2lmZGVmIFdJVEhfVURQCisgICAgICAgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgICAgIHsgU09BUF9TT0NLTEVOX1QgayA9IChTT0FQX1NPQ0tMRU5fVClzaXplb2Yoc29hcC0+cGVlcik7CisJICBtZW1zZXQoKHZvaWQqKSZzb2FwLT5wZWVyLCAwLCBzaXplb2Yoc29hcC0+cGVlcikpOworICAgICAgICAgIHIgPSByZWN2ZnJvbSgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyLCAmayk7CS8qIHBvcnRhYmlsaXR5IG5vdGU6IHNlZSBTT0FQX1NPQ0tMRU5fVCBkZWZpbml0aW9uIGluIHN0ZHNvYXAyLmggKi8KKwkgIHNvYXAtPnBlZXJsZW4gPSAoc2l6ZV90KWs7CisjaWZuZGVmIFdJVEhfSVBWNgorICAgICAgICAgIHNvYXAtPmlwID0gbnRvaGwoc29hcC0+cGVlci5zaW5fYWRkci5zX2FkZHIpOworICAgICAgICAgIHNvYXAtPnBvcnQgPSAoaW50KW50b2hzKHNvYXAtPnBlZXIuc2luX3BvcnQpOworI2VuZGlmCisgICAgICAgIH0KKwllbHNlCisjZW5kaWYKKyAgICAgICAgICByID0gcmVjdigoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MpOworICAgICAgICBpZiAociA+PSAwKQorICAgICAgICAgIHJldHVybiAoc2l6ZV90KXI7CisgICAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUFHQUlOICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRVdPVUxEQkxPQ0spCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgIH0KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICAgIGZkX3NldCBmZDsKKyAgICAgICAgdGltZW91dC50dl9zZWMgPSAwOworICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAxMDAwMDsKKyAgICAgICAgRkRfWkVSTygmZmQpOworICAgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJmZkKTsKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICAgICAgaWYgKHNvYXAtPnNzbCAmJiBTU0xfZ2V0X2Vycm9yKHNvYXAtPnNzbCwgcikgPT0gU1NMX0VSUk9SX1dBTlRfV1JJVEUpCisgICAgICAgICAgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCBOVUxMLCAmZmQsICZmZCwgJnRpbWVvdXQpOworICAgICAgICBlbHNlCisgICAgICAgICAgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCAmZmQsIE5VTEwsICZmZCwgJnRpbWVvdXQpOworI2Vsc2UKKyAgICAgICAgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCAmZmQsIE5VTEwsICZmZCwgJnRpbWVvdXQpOworI2VuZGlmCisgICAgICAgIGlmIChyIDwgMCAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKyAgICB9CisgIH0KKyNpZmRlZiBXSVRIX0ZBU1RDR0kKKyAgcmV0dXJuIGZyZWFkKHMsIDEsIG4sIHN0ZGluKTsKKyNlbHNlCisjaWZkZWYgVU5ERVJfQ0UKKyAgcmV0dXJuIGZyZWFkKHMsIDEsIG4sIHNvYXAtPnJlY3ZmZCk7CisjZWxzZQorI2lmZGVmIFdNV19SUE1fSU8KKyAgaWYgKHNvYXAtPnJwbXJlcWlkKQorICAgIHIgPSBodHRwQmxvY2tSZWFkKHNvYXAtPnJwbXJlcWlkLCBzLCBuKTsKKyAgZWxzZQorI2VuZGlmCisgIHIgPSByZWFkKChTT0FQX1NPQ0tFVClzb2FwLT5yZWN2ZmQsIHMsIG4pOworICBpZiAociA+PSAwKQorICAgIHJldHVybiAoc2l6ZV90KXI7CisgIHNvYXAtPmVycm51bSA9IHNvYXBfZXJybm87CisgIHJldHVybiAwOworI2VuZGlmCisjZW5kaWYKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHNvYXBfd2NoYXIKK3NvYXBfZ2V0Y2h1bmtjaGFyKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcC0+YnVmaWR4IDwgc29hcC0+YnVmbGVuKQorICAgIHJldHVybiBzb2FwLT5idWZbc29hcC0+YnVmaWR4KytdOworICBzb2FwLT5idWZpZHggPSAwOworICBzb2FwLT5idWZsZW4gPSBzb2FwLT5jaHVua2J1ZmxlbiA9IHNvYXAtPmZyZWN2KHNvYXAsIHNvYXAtPmJ1ZiwgU09BUF9CVUZMRU4pOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlYWQgJXUgYnl0ZXMgZnJvbSBzb2NrZXQgJWRcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+YnVmbGVuLCBzb2FwLT5zb2NrZXQpKTsKKyAgREJHTVNHKFJFQ1YsIHNvYXAtPmJ1Ziwgc29hcC0+YnVmbGVuKTsKKyAgaWYgKHNvYXAtPmJ1ZmxlbikKKyAgICByZXR1cm4gc29hcC0+YnVmW3NvYXAtPmJ1ZmlkeCsrXTsKKyAgcmV0dXJuIEVPRjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc29hcF9pc3hkaWdpdChpbnQgYykKK3sgcmV0dXJuIChjID49ICcwJyAmJiBjIDw9ICc5JykgfHwgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKSB8fCAoYyA+PSAnYScgJiYgYyA8PSAnZicpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlY3ZfcmF3KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzaXplX3QgcmV0OworI2lmZGVmIFdJVEhfWkxJQgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIpCisgIHsgaWYgKHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID09IFpfTlVMTCkKKyAgICAgIHJldHVybiBFT0Y7CisgICAgaWYgKHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luIHx8ICFzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQpCisgICAgeyByZWdpc3RlciBpbnQgcjsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5mbGF0aW5nXG4iKSk7CisgICAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IChCeXRlKilzb2FwLT5idWY7CisgICAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgPSBTT0FQX0JVRkxFTjsKKyAgICAgIHIgPSBpbmZsYXRlKCZzb2FwLT5kX3N0cmVhbSwgWl9OT19GTFVTSCk7CisgICAgICBpZiAociA9PSBaX09LIHx8IHIgPT0gWl9TVFJFQU1fRU5EKQorICAgICAgeyBzb2FwLT5idWZpZHggPSAwOworICAgICAgICBzb2FwLT5idWZsZW4gPSBTT0FQX0JVRkxFTiAtIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dDsKKyAgICAgICAgaWYgKHNvYXAtPnpsaWJfaW4gPT0gU09BUF9aTElCX0daSVApCisgICAgICAgICAgc29hcC0+el9jcmMgPSBjcmMzMihzb2FwLT56X2NyYywgKEJ5dGUqKXNvYXAtPmJ1ZiwgKHVuc2lnbmVkIGludClzb2FwLT5idWZsZW4pOworICAgICAgICBpZiAociA9PSBaX1NUUkVBTV9FTkQpCisgICAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbmZsYXRlZCAlbHUtPiVsdSBieXRlc1xuIiwgc29hcC0+ZF9zdHJlYW0udG90YWxfaW4sIHNvYXAtPmRfc3RyZWFtLnRvdGFsX291dCkpOworICAgICAgICAgIHNvYXAtPnpfcmF0aW9faW4gPSAoZmxvYXQpc29hcC0+ZF9zdHJlYW0udG90YWxfaW4gLyAoZmxvYXQpc29hcC0+ZF9zdHJlYW0udG90YWxfb3V0OworICAgICAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gWl9OVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChzb2FwLT5idWZsZW4pCisgICAgICAgIHsgc29hcC0+Y291bnQgKz0gc29hcC0+YnVmbGVuOworICAgICAgICAgIHJldHVybiBTT0FQX09LOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmIChyICE9IFpfQlVGX0VSUk9SKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluZmxhdGUgZXJyb3I6ICVzXG4iLCBzb2FwLT5kX3N0cmVhbS5tc2c/c29hcC0+ZF9zdHJlYW0ubXNnOiIiKSk7CisgICAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gWl9OVUxMOworCXNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgICByZXR1cm4gRU9GOworICAgICAgfQorICAgIH0KK3psaWJfYWdhaW46CisgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSyAmJiAhc29hcC0+Y2h1bmtzaXplKQorICAgIHsgbWVtY3B5KHNvYXAtPmJ1Ziwgc29hcC0+el9idWYsIFNPQVBfQlVGTEVOKTsKKyAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPnpfYnVmbGVuOworICAgIH0KKyAgfQorI2VuZGlmCisjaWZuZGVmIFdJVEhfTk9IVFRQCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspIC8qIHJlYWQgSFRUUCBjaHVua2VkIHRyYW5zZmVyICovCisgIHsgCitjaHVua19hZ2FpbjoKKyAgICBpZiAoc29hcC0+Y2h1bmtzaXplKQorICAgIHsgc29hcC0+YnVmbGVuID0gcmV0ID0gc29hcC0+ZnJlY3Yoc29hcCwgc29hcC0+YnVmLCBzb2FwLT5jaHVua3NpemUgPiBTT0FQX0JVRkxFTiA/IFNPQVBfQlVGTEVOIDogc29hcC0+Y2h1bmtzaXplKTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR2V0dGluZyBjaHVuazogcmVhZCAldSBieXRlc1xuIiwgKHVuc2lnbmVkIGludClyZXQpKTsKKyAgICAgIERCR01TRyhSRUNWLCBzb2FwLT5idWYsIHJldCk7CisgICAgICBzb2FwLT5idWZpZHggPSAwOworICAgICAgc29hcC0+Y2h1bmtzaXplIC09IHJldDsKKyAgICB9CisgICAgZWxzZQorICAgIHsgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICAgICAgY2hhciAqdCwgdG1wWzhdOworICAgICAgdCA9IHRtcDsKKyAgICAgIGlmICghc29hcC0+Y2h1bmtidWZsZW4pCisgICAgICB7IHNvYXAtPmNodW5rYnVmbGVuID0gcmV0ID0gc29hcC0+ZnJlY3Yoc29hcCwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTik7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVhZCAldSBieXRlcyAoY2h1bmtlZCkgZnJvbSBzb2NrZXQgJWRcbiIsICh1bnNpZ25lZCBpbnQpcmV0LCBzb2FwLT5zb2NrZXQpKTsKKyAgICAgICAgREJHTVNHKFJFQ1YsIHNvYXAtPmJ1ZiwgcmV0KTsKKyAgICAgICAgc29hcC0+YnVmaWR4ID0gMDsKKyAgICAgICAgaWYgKCFyZXQpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmFoZWFkID0gRU9GOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBzb2FwLT5idWZpZHggPSBzb2FwLT5idWZsZW47CisgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5jaHVua2J1ZmxlbjsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR2V0dGluZyBjaHVuayBzaXplIChpZHg9JXUgbGVuPSV1KVxuIiwgKHVuc2lnbmVkIGludClzb2FwLT5idWZpZHgsICh1bnNpZ25lZCBpbnQpc29hcC0+YnVmbGVuKSk7CisgICAgICB3aGlsZSAoIXNvYXBfaXN4ZGlnaXQoKGludCkoYyA9IHNvYXBfZ2V0Y2h1bmtjaGFyKHNvYXApKSkpCisgICAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorCSAgcmV0dXJuIHNvYXAtPmFoZWFkID0gRU9GOworICAgICAgZG8KKyAgICAgICAgKnQrKyA9IChjaGFyKWM7CisgICAgICB3aGlsZSAoc29hcF9pc3hkaWdpdCgoaW50KShjID0gc29hcF9nZXRjaHVua2NoYXIoc29hcCkpKSAmJiB0IC0gdG1wIDwgNyk7CisgICAgICB3aGlsZSAoKGludCljICE9IEVPRiAmJiBjICE9ICdcbicpCisgICAgICAgIGMgPSBzb2FwX2dldGNodW5rY2hhcihzb2FwKTsKKyAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICByZXR1cm4gc29hcC0+YWhlYWQgPSBFT0Y7CisgICAgICAqdCA9ICdcMCc7CisgICAgICBzb2FwLT5jaHVua3NpemUgPSBzb2FwX3N0cnRvdWwodG1wLCAmdCwgMTYpOworICAgICAgaWYgKCFzb2FwLT5jaHVua3NpemUpCisgICAgICB7IHNvYXAtPmNodW5rYnVmbGVuID0gMDsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgb2YgY2h1bmtlZCBtZXNzYWdlXG4iKSk7CisJd2hpbGUgKChpbnQpYyAhPSBFT0YgJiYgYyAhPSAnXG4nKQorICAgICAgICAgIGMgPSBzb2FwX2dldGNodW5rY2hhcihzb2FwKTsKKyAgICAgICAgcmV0dXJuIHNvYXAtPmFoZWFkID0gRU9GOworICAgICAgfQorICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+YnVmaWR4ICsgc29hcC0+Y2h1bmtzaXplOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJNb3ZpbmcgYnVmIGxlbiB0byBpZHg9JXUgbGVuPSV1ICglcylcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+YnVmaWR4LCAodW5zaWduZWQgaW50KXNvYXAtPmJ1ZmxlbiwgdG1wKSk7CisgICAgICBpZiAoc29hcC0+YnVmbGVuID4gc29hcC0+Y2h1bmtidWZsZW4pCisgICAgICB7IHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmNodW5rYnVmbGVuOworICAgICAgICBzb2FwLT5jaHVua3NpemUgLT0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgICAgICBzb2FwLT5jaHVua2J1ZmxlbiA9IDA7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUGFzc2VkIGVuZCBvZiBidWZmZXIgZm9yIGNodW5rZWQgSFRUUCAoJXUgYnl0ZXMgbGVmdClcbiIsICh1bnNpZ25lZCBpbnQpKHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeCkpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHNvYXAtPmNodW5rYnVmbGVuKQorICAgICAgICBzb2FwLT5jaHVua3NpemUgPSAwOworICAgICAgcmV0ID0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgICAgaWYgKCFyZXQpCisgICAgICAgIGdvdG8gY2h1bmtfYWdhaW47CisgICAgfQorICB9CisgIGVsc2UKKyNlbmRpZgorICB7IHNvYXAtPmJ1ZmlkeCA9IDA7CisgICAgc29hcC0+YnVmbGVuID0gcmV0ID0gc29hcC0+ZnJlY3Yoc29hcCwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTik7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWFkICV1IGJ5dGVzIGZyb20gc29ja2V0ICVkXG4iLCAodW5zaWduZWQgaW50KXJldCwgc29hcC0+c29ja2V0KSk7CisgICAgREJHTVNHKFJFQ1YsIHNvYXAtPmJ1ZiwgcmV0KTsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+ZnByZXBhcmVyZWN2ICYmIChzb2FwLT5lcnJvciA9IHNvYXAtPmZwcmVwYXJlcmVjdihzb2FwLCBzb2FwLT5idWYsIHJldCkpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNlbmRpZgorI2lmZGVmIFdJVEhfWkxJQgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIpCisgIHsgcmVnaXN0ZXIgaW50IHI7CisgICAgbWVtY3B5KHNvYXAtPnpfYnVmLCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOKTsKKyAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X2luID0gKEJ5dGUqKShzb2FwLT56X2J1ZiArIHNvYXAtPmJ1ZmlkeCk7CisgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4gPSAodW5zaWduZWQgaW50KXJldDsKKyAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IChCeXRlKilzb2FwLT5idWY7CisgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0ID0gU09BUF9CVUZMRU47CisgICAgciA9IGluZmxhdGUoJnNvYXAtPmRfc3RyZWFtLCBaX05PX0ZMVVNIKTsKKyAgICBpZiAociA9PSBaX09LIHx8IHIgPT0gWl9TVFJFQU1fRU5EKQorICAgIHsgc29hcC0+YnVmaWR4ID0gMDsKKyAgICAgIHNvYXAtPnpfYnVmbGVuID0gc29hcC0+YnVmbGVuOworICAgICAgc29hcC0+YnVmbGVuID0gcmV0ID0gU09BUF9CVUZMRU4gLSBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQ7CisgICAgICBpZiAoc29hcC0+emxpYl9pbiA9PSBTT0FQX1pMSUJfR1pJUCkKKyAgICAgICAgc29hcC0+el9jcmMgPSBjcmMzMihzb2FwLT56X2NyYywgKEJ5dGUqKXNvYXAtPmJ1ZiwgKHVuc2lnbmVkIGludClzb2FwLT5idWZsZW4pOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbmZsYXRlZCAldSBieXRlc1xuIiwgKHVuc2lnbmVkIGludClyZXQpKTsKKyAgICAgIGlmICghcmV0KQorICAgICAgICBnb3RvIHpsaWJfYWdhaW47CisgICAgICBpZiAociA9PSBaX1NUUkVBTV9FTkQpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5mbGF0ZWQgJWx1LT4lbHUgYnl0ZXNcbiIsIHNvYXAtPmRfc3RyZWFtLnRvdGFsX2luLCBzb2FwLT5kX3N0cmVhbS50b3RhbF9vdXQpKTsKKyAgICAgICAgc29hcC0+el9yYXRpb19pbiA9IChmbG9hdClzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiAvIChmbG9hdClzb2FwLT5kX3N0cmVhbS50b3RhbF9vdXQ7CisgICAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gWl9OVUxMOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVuYWJsZSB0byBpbmZsYXRlOiAoJWQpICVzXG4iLCByLCBzb2FwLT5kX3N0cmVhbS5tc2c/c29hcC0+ZF9zdHJlYW0ubXNnOiIiKSk7CisgICAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IFpfTlVMTDsKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgcmV0dXJuIEVPRjsKKyAgICB9CisgIH0KKyNlbmRpZgorICBzb2FwLT5jb3VudCArPSByZXQ7CisgIHJldHVybiAhcmV0OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlY3Yoc3RydWN0IHNvYXAgKnNvYXApCit7IAorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpCisgIHsgaWYgKHNvYXAtPmRpbWUuYnVmbGVuKQorICAgIHsgY2hhciAqczsKKyAgICAgIGludCBpOworICAgICAgdW5zaWduZWQgY2hhciB0bXBbMTJdOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJESU1FIGhkciBmb3IgY2h1bmtlZCBESU1FIGlzIGluIGJ1ZmZlclxuIikpOworICAgICAgc29hcC0+Y291bnQgKz0gc29hcC0+ZGltZS5idWZsZW4gLSBzb2FwLT5idWZsZW47CisgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5kaW1lLmJ1ZmxlbjsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2tpcCBwYWRkaW5nICglbGQgYnl0ZXMpXG4iLCAtKGxvbmcpc29hcC0+ZGltZS5zaXplJjMpKTsKKyAgICAgIGZvciAoaSA9IC0obG9uZylzb2FwLT5kaW1lLnNpemUmMzsgaSA+IDA7IGktLSkKKyAgICAgIHsgc29hcC0+YnVmaWR4Kys7CisgICAgICAgIGlmIChzb2FwLT5idWZpZHggPj0gc29hcC0+YnVmbGVuKQorICAgICAgICAgIGlmIChzb2FwX3JlY3ZfcmF3KHNvYXApKQorICAgICAgICAgICAgcmV0dXJuIEVPRjsKKyAgICAgIH0KKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR2V0IERJTUUgaGRyIGZvciBuZXh0IGNodW5rXG4iKSk7CisgICAgICBzID0gKGNoYXIqKXRtcDsKKyAgICAgIGZvciAoaSA9IDEyOyBpID4gMDsgaS0tKQorICAgICAgeyAqcysrID0gc29hcC0+YnVmW3NvYXAtPmJ1ZmlkeCsrXTsKKyAgICAgICAgaWYgKHNvYXAtPmJ1ZmlkeCA+PSBzb2FwLT5idWZsZW4pCisgICAgICAgICAgaWYgKHNvYXBfcmVjdl9yYXcoc29hcCkpCisgICAgICAgICAgICByZXR1cm4gRU9GOworICAgICAgfQorICAgICAgc29hcC0+ZGltZS5mbGFncyA9IHRtcFswXSAmIDB4NzsKKyAgICAgIHNvYXAtPmRpbWUuc2l6ZSA9ICgoc2l6ZV90KXRtcFs4XSA8PCAyNCkgfCAoKHNpemVfdCl0bXBbOV0gPDwgMTYpIHwgKChzaXplX3QpdG1wWzEwXSA8PCA4KSB8ICgoc2l6ZV90KXRtcFsxMV0pOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHZXQgRElNRSBjaHVuayAoJXUgYnl0ZXMpXG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmRpbWUuc2l6ZSkpOworICAgICAgaWYgKHNvYXAtPmRpbWUuZmxhZ3MgJiBTT0FQX0RJTUVfQ0YpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTW9yZSBjaHVua2luZ1xuIikpOworICAgICAgICBzb2FwLT5kaW1lLmNodW5rc2l6ZSA9IHNvYXAtPmRpbWUuc2l6ZTsKKyAgICAgICAgaWYgKHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeCA+PSBzb2FwLT5kaW1lLnNpemUpCisgICAgICAgIHsgc29hcC0+ZGltZS5idWZsZW4gPSBzb2FwLT5idWZsZW47CisgICAgICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+YnVmaWR4ICsgc29hcC0+ZGltZS5jaHVua3NpemU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHNvYXAtPmRpbWUuY2h1bmtzaXplIC09IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJMYXN0IGNodW5rXG4iKSk7CisgICAgICAgIHNvYXAtPmRpbWUuYnVmbGVuID0gMDsKKyAgICAgICAgc29hcC0+ZGltZS5jaHVua3NpemUgPSAwOworICAgICAgfQorICAgICAgc29hcC0+Y291bnQgPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIiV1IGJ5dGVzIHJlbWFpbmluZ1xuIiwgKHVuc2lnbmVkIGludClzb2FwLT5jb3VudCkpOworICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgfQorICAgIGlmIChzb2FwLT5kaW1lLmNodW5rc2l6ZSkKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR2V0IG5leHQgRElNRSBoZHIgZm9yIGNodW5rZWQgRElNRSAoJXUgYnl0ZXMgY2h1bmspXG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmRpbWUuY2h1bmtzaXplKSk7CisgICAgICBpZiAoc29hcF9yZWN2X3Jhdyhzb2FwKSkKKyAgICAgICAgcmV0dXJuIEVPRjsKKyAgICAgIGlmIChzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHggPj0gc29hcC0+ZGltZS5jaHVua3NpemUpCisgICAgICB7IHNvYXAtPmRpbWUuYnVmbGVuID0gc29hcC0+YnVmbGVuOworICAgICAgICBzb2FwLT5jb3VudCAtPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHggLSBzb2FwLT5kaW1lLmNodW5rc2l6ZTsKKyAgICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+YnVmaWR4ICsgc29hcC0+ZGltZS5jaHVua3NpemU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHNvYXAtPmRpbWUuY2h1bmtzaXplIC09IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiJWx1IGJ5dGVzIHJlbWFpbmluZywgY291bnQ9JXVcbiIsICh1bnNpZ25lZCBsb25nKShzb2FwLT5idWZsZW4tc29hcC0+YnVmaWR4KSwgKHVuc2lnbmVkIGludClzb2FwLT5jb3VudCkpOworICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgfQorICB9CisjZW5kaWYKKyAgcmV0dXJuIHNvYXBfcmVjdl9yYXcoc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzb2FwX3djaGFyCitTT0FQX0ZNQUMyCitzb2FwX2dldGNoYXIoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgYyA9IHNvYXAtPmFoZWFkOworICBpZiAoYykKKyAgeyBpZiAoYyAhPSBFT0YpCisgICAgICBzb2FwLT5haGVhZCA9IDA7CisgICAgcmV0dXJuIGM7CisgIH0KKyAgcmV0dXJuIHNvYXBfZ2V0MShzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwKgorU09BUF9GTUFDMgorc29hcF9jb2RlKGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwICptYXAsIGNvbnN0IGNoYXIgKnN0cikKK3sgaWYgKHN0cikKKyAgeyB3aGlsZSAobWFwLT5zdHJpbmcpCisgICAgeyBpZiAoIXN0cmNtcChzdHIsIG1hcC0+c3RyaW5nKSkgLyogY2FzZSBzZW5zaXRpdmUgKi8KKyAgICAgICAgcmV0dXJuIG1hcDsKKyAgICAgIG1hcCsrOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2xvbmcKK1NPQVBfRk1BQzIKK3NvYXBfaW50X2NvZGUoY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgKm1hcCwgY29uc3QgY2hhciAqc3RyLCBsb25nIG90aGVyKQoreyB3aGlsZSAobWFwLT5zdHJpbmcpCisgIHsgaWYgKCFzb2FwX3RhZ19jbXAoc3RyLCBtYXAtPnN0cmluZykpIC8qIGNhc2UgaW5zZW5zaXRpdmUgKi8KKyAgICAgIHJldHVybiBtYXAtPmNvZGU7CisgICAgbWFwKys7CisgIH0KKyAgcmV0dXJuIG90aGVyOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfc3RyX2NvZGUoY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgKm1hcCwgbG9uZyBjb2RlKQoreyB3aGlsZSAobWFwLT5jb2RlICE9IGNvZGUgJiYgbWFwLT5zdHJpbmcpCisgICAgbWFwKys7CisgIHJldHVybiBtYXAtPnN0cmluZzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzb2FwX3djaGFyCitzb2FwX2NoYXIoc3RydWN0IHNvYXAgKnNvYXApCit7IGNoYXIgdG1wWzhdOworICByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICByZWdpc3RlciBjaGFyICpzID0gdG1wOworICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQorICB7IGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgaWYgKGMgPT0gJzsnIHx8IChpbnQpYyA9PSBFT0YpCisgICAgICBicmVhazsKKyAgICAqcysrID0gKGNoYXIpYzsKKyAgfQorICAqcyA9ICdcMCc7CisgIGlmICgqdG1wID09ICcjJykKKyAgeyBpZiAodG1wWzFdID09ICd4JyB8fCB0bXBbMV0gPT0gJ1gnKQorICAgICAgcmV0dXJuIHNvYXBfc3RydG9sKHRtcCArIDIsIE5VTEwsIDE2KTsKKyAgICByZXR1cm4gYXRvbCh0bXAgKyAxKTsKKyAgfQorICBpZiAoIXN0cmNtcCh0bXAsICJsdCIpKQorICAgIHJldHVybiAnPCc7CisgIGlmICghc3RyY21wKHRtcCwgImd0IikpCisgICAgcmV0dXJuICc+JzsKKyAgaWYgKCFzdHJjbXAodG1wLCAiYW1wIikpCisgICAgcmV0dXJuICcmJzsKKyAgaWYgKCFzdHJjbXAodG1wLCAicXVvdCIpKQorICAgIHJldHVybiAnIic7CisgIGlmICghc3RyY21wKHRtcCwgImFwb3MiKSkKKyAgICByZXR1cm4gJ1wnJzsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIHJldHVybiAoc29hcF93Y2hhcilzb2FwX2ludF9jb2RlKGh0bWxfZW50aXR5X2NvZGVzLCB0bXAsIFNPQVBfVU5LTk9XTl9DSEFSKTsKKyNlbHNlCisgIHJldHVybiBTT0FQX1VOS05PV05fQ0hBUjsgLyogdXNlIHRoaXMgdG8gcmVwcmVzZW50IHVua25vd24gY29kZSAqLworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBXSVRIX0xFQU4KK3NvYXBfd2NoYXIKK3NvYXBfZ2V0MChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXAtPmJ1ZmlkeCA+PSBzb2FwLT5idWZsZW4gJiYgc29hcF9yZWN2KHNvYXApKQorICAgIHJldHVybiBFT0Y7CisgIHJldHVybiAodW5zaWduZWQgY2hhcilzb2FwLT5idWZbc29hcC0+YnVmaWR4XTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFdJVEhfTEVBTgorc29hcF93Y2hhcgorc29hcF9nZXQxKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcC0+YnVmaWR4ID49IHNvYXAtPmJ1ZmxlbiAmJiBzb2FwX3JlY3Yoc29hcCkpCisgICAgcmV0dXJuIEVPRjsKKyAgcmV0dXJuICh1bnNpZ25lZCBjaGFyKXNvYXAtPmJ1Zltzb2FwLT5idWZpZHgrK107Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzb2FwX3djaGFyCitTT0FQX0ZNQUMyCitzb2FwX2dldChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICBjID0gc29hcC0+YWhlYWQ7CisgIGlmIChjKQorICB7IGlmIChjICE9IEVPRikKKyAgICAgIHNvYXAtPmFoZWFkID0gMDsKKyAgfQorICBlbHNlCisgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgZm9yICg7OykKKyAgeyBpZiAoc29hcC0+Y2RhdGEpCisgICAgeyBpZiAoYyA9PSAnXScpCisgICAgICB7IGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICAgIGlmIChjID09ICddJykKKyAgICAgICAgeyBzb2FwLT5jZGF0YSA9IDA7CisgICAgICAgICAgc29hcF9nZXQxKHNvYXApOyAvKiBza2lwID4gKi8KKyAgICAgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgICB9CisJZWxzZQorICAgICAgICB7IHNvYXBfcmV2Z2V0MShzb2FwKTsKKyAgICAgICAgICByZXR1cm4gJ10nOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBjOworICAgIH0KKyAgICBzd2l0Y2ggKGMpCisgICAgeyBjYXNlICc8JzoKKyAgICAgICAgZG8gYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgICAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworICAgICAgICBpZiAoYyA9PSAnIScgfHwgYyA9PSAnPycgfHwgYyA9PSAnJScpCisgICAgICAgIHsgcmVnaXN0ZXIgaW50IGsgPSAxOworCSAgaWYgKGMgPT0gJyEnKQorICAgICAgICAgIHsgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgICAgICAgIGlmIChjID09ICdbJykKKyAgICAgICAgICAgIHsgZG8gYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgICAgICAgICAgd2hpbGUgKChpbnQpYyAhPSBFT0YgJiYgYyAhPSAnWycpOworICAgICAgICAgICAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgc29hcC0+Y2RhdGEgPSAxOworICAgICAgICAgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworCSAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGMgPT0gJy0nICYmIChjID0gc29hcF9nZXQxKHNvYXApKSA9PSAnLScpCisgICAgICAgICAgICB7IGRvCisgICAgICAgICAgICAgIHsgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAnLScgJiYgKGMgPSBzb2FwX2dldDEoc29hcCkpID09ICctJykKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9IHdoaWxlICgoaW50KWMgIT0gRU9GKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisJICBlbHNlIGlmIChjID09ICc/JykKKyAgICAgICAgICAgIGMgPSBzb2FwX2dldF9waShzb2FwKTsKKyAgICAgICAgICB3aGlsZSAoKGludCljICE9IEVPRikKKyAgICAgICAgICB7IGlmIChjID09ICc8JykKKwkgICAgICBrKys7CisJICAgIGVsc2UgaWYgKGMgPT0gJz4nKQorCSAgICB7IGlmICgtLWsgPD0gMCkKKwkgICAgICAgIGJyZWFrOworCSAgICB9CisJICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisJICB9CisJICBpZiAoKGludCljID09IEVPRikKKwkgICAgYnJlYWs7CisgICAgICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYyA9PSAnLycpCisgICAgICAgICAgcmV0dXJuIFNPQVBfVFQ7CisgICAgICAgIHNvYXBfcmV2Z2V0MShzb2FwKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfTFQ7CisgICAgICBjYXNlICc+JzoKKyAgICAgICAgcmV0dXJuIFNPQVBfR1Q7CisgICAgICBjYXNlICciJzoKKyAgICAgICAgcmV0dXJuIFNPQVBfUVQ7CisgICAgICBjYXNlICdcJyc6CisgICAgICAgIHJldHVybiBTT0FQX0FQOworICAgICAgY2FzZSAnJic6CisgICAgICAgIHJldHVybiBzb2FwX2NoYXIoc29hcCkgfCAweDgwMDAwMDAwOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gYzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzb2FwX3djaGFyCitzb2FwX2dldF9waShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgY2hhciBidWZbNjRdOworICByZWdpc3RlciBjaGFyICpzID0gYnVmOworICByZWdpc3RlciBpbnQgaSA9IHNpemVvZihidWYpOworICByZWdpc3RlciBzb2FwX3djaGFyIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgIC8qIFRoaXMgaXMgYSBxdWljayB3YXkgdG8gcGFyc2UgWE1MIFBJIGFuZCB3ZSBjb3VsZCB1c2UgYSBjYWxsYmFjayBpbnN0ZWFkIHRvCisgICAqIGVuYWJsZSBhcHBsaWNhdGlvbnMgdG8gaW50ZXJjZXB0IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zICovCisgIHdoaWxlICgoaW50KWMgIT0gRU9GICYmIGMgIT0gJz8nKQorICB7IGlmICgtLWkgPiAwKQorICAgIHsgaWYgKHNvYXBfYmxhbmsoYykpCisgICAgICAgIGMgPSAnICc7CisgICAgICAqcysrID0gKGNoYXIpYzsKKyAgICB9CisgICAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgfQorICAqcyA9ICdcMCc7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiWE1MIFBJIDw/JXM/PlxuIiwgYnVmKSk7CisgIGlmICghc3RybmNtcChidWYsICJ4bWwgIiwgNCkpCisgIHsgcyA9IHN0cnN0cihidWYsICIgZW5jb2Rpbmc9Iik7CisgICAgaWYgKHMgJiYgc1sxMF0pCisgICAgeyBpZiAoIXNvYXBfdGFnX2NtcChzICsgMTEsICJpc28tODg1OS0xKiIpCisgICAgICAgfHwgIXNvYXBfdGFnX2NtcChzICsgMTEsICJsYXRpbjEqIikpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU3dpdGNoaW5nIHRvIGxhdGluMSBlbmNvZGluZ1xuIikpOworICAgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX0xBVElOOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChzICsgMTEsICJ1dGYtOCoiKSkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTd2l0Y2hpbmcgdG8gdXRmLTggZW5jb2RpbmdcbiIpKTsKKyAgICAgICAgc29hcC0+bW9kZSAmPSB+U09BUF9FTkNfTEFUSU47CisgICAgICB9CisgICAgfQorICB9CisgIGlmICgoaW50KWMgIT0gRU9GKQorICAgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgIHJldHVybiBjOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX21vdmUoc3RydWN0IHNvYXAgKnNvYXAsIGxvbmcgbikKK3sgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJNb3ZpbmcgJWxkIGJ5dGVzIGZvcndhcmRcbiIsIChsb25nKW4pKTsKKyAgZm9yICg7IG4gPiAwOyBuLS0pCisgICAgaWYgKChpbnQpc29hcF9nZXRjaGFyKHNvYXApID09IEVPRikKKyAgICAgIHJldHVybiBTT0FQX0VPRjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3NpemVfdAorU09BUF9GTUFDMgorc29hcF90ZWxsKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZXR1cm4gc29hcC0+Y291bnQgLSBzb2FwLT5idWZsZW4gKyBzb2FwLT5idWZpZHggLSAoc29hcC0+YWhlYWQgIT0gMCk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXR1dGY4KHN0cnVjdCBzb2FwICpzb2FwLCByZWdpc3RlciB1bnNpZ25lZCBsb25nIGMpCit7IGNoYXIgdG1wWzE2XTsKKyAgaWYgKGMgPiAwICYmIGMgPCAweDgwKQorICB7ICp0bXAgPSAoY2hhciljOworICAgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsIHRtcCwgMSk7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICB7IHJlZ2lzdGVyIGNoYXIgKnQgPSB0bXA7CisgICAgaWYgKGMgPCAweDA4MDApCisgICAgICAqdCsrID0gKGNoYXIpKDB4QzAgfCAoKGMgPj4gNikgJiAweDFGKSk7CisgICAgZWxzZQorICAgIHsgaWYgKGMgPCAweDAxMDAwMCkKKyAgICAgICAgKnQrKyA9IChjaGFyKSgweEUwIHwgKChjID4+IDEyKSAmIDB4MEYpKTsKKyAgICAgIGVsc2UKKyAgICAgIHsgaWYgKGMgPCAweDIwMDAwMCkKKyAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjAgfCAoKGMgPj4gMTgpICYgMHgwNykpOworICAgICAgICBlbHNlCisgICAgICAgIHsgaWYgKGMgPCAweDA0MDAwMDAwKQorICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEY4IHwgKChjID4+IDI0KSAmIDB4MDMpKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeyAqdCsrID0gKGNoYXIpKDB4RkMgfCAoKGMgPj4gMzApICYgMHgwMSkpOworICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDI0KSAmIDB4M0YpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDE4KSAmIDB4M0YpKTsKKyAgICAgICAgfSAgICAgCisgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAxMikgJiAweDNGKSk7CisgICAgICB9CisgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gNikgJiAweDNGKSk7CisgICAgfQorICAgICp0KysgPSAoY2hhcikoMHg4MCB8IChjICYgMHgzRikpOworICAgICp0ID0gJ1wwJzsKKyAgfQorICBlbHNlCisjZW5kaWYKKyAgICBzcHJpbnRmKHRtcCwgIiYjJWx1OyIsIGMpOworICByZXR1cm4gc29hcF9zZW5kKHNvYXAsIHRtcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzb2FwX3djaGFyCitTT0FQX0ZNQUMyCitzb2FwX2dldHV0Zjgoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYywgYzEsIGMyLCBjMywgYzQ7CisgIGMgPSBzb2FwLT5haGVhZDsKKyAgaWYgKGMgPiAweEZGKQorICB7IHNvYXAtPmFoZWFkID0gMDsKKyAgICByZXR1cm4gYzsKKyAgfQorYWdhaW46CisgIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgaWYgKGMgPCAweDgwIHx8IChzb2FwLT5tb2RlICYgU09BUF9FTkNfTEFUSU4pKQorICAgIHJldHVybiBjOworICBjMSA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgaWYgKGMxIDwgMHg4MCkKKyAgeyBzb2FwX3JldmdldDEoc29hcCk7IC8qIGRvZXNuJ3QgbG9vayBsaWtlIHRoaXMgaXMgVVRGOCAqLworICAgIHJldHVybiBjOworICB9CisgIGMxICY9IDB4M0Y7CisgIGlmIChjIDwgMHhFMCkKKyAgICByZXR1cm4gKChzb2FwX3djaGFyKShjICYgMHgxRikgPDwgNikgfCBjMTsKKyAgYzIgPSAoc29hcF93Y2hhcilzb2FwX2dldDEoc29hcCkgJiAweDNGOworICBpZiAoYyA9PSAweEVGICYmIGMxID09IDB4M0IgJiYgYzIgPT0gMHgzRikJLyogaWdub3JlIFVURi04IEJPTSAqLworICAgIGdvdG8gYWdhaW47CisgIGlmIChjIDwgMHhGMCkKKyAgICByZXR1cm4gKChzb2FwX3djaGFyKShjICYgMHgwRikgPDwgMTIpIHwgKGMxIDw8IDYpIHwgYzI7CisgIGMzID0gKHNvYXBfd2NoYXIpc29hcF9nZXQxKHNvYXApICYgMHgzRjsKKyAgaWYgKGMgPCAweEY4KQorICAgIHJldHVybiAoKHNvYXBfd2NoYXIpKGMgJiAweDA3KSA8PCAxOCkgfCAoYzEgPDwgMTIpIHwgKGMyIDw8IDYpIHwgYzM7CisgIGM0ID0gKHNvYXBfd2NoYXIpc29hcF9nZXQxKHNvYXApICYgMHgzRjsKKyAgaWYgKGMgPCAweEZDKQorICAgIHJldHVybiAoKHNvYXBfd2NoYXIpKGMgJiAweDAzKSA8PCAyNCkgfCAoYzEgPDwgMTgpIHwgKGMyIDw8IDEyKSB8IChjMyA8PCA2KSB8IGM0OworICByZXR1cm4gKChzb2FwX3djaGFyKShjICYgMHgwMSkgPDwgMzApIHwgKGMxIDw8IDI0KSB8IChjMiA8PCAxOCkgfCAoYzMgPDwgMTIpIHwgKGM0IDw8IDYpIHwgKHNvYXBfd2NoYXIpKHNvYXBfZ2V0MShzb2FwKSAmIDB4M0YpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dGhleChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgdW5zaWduZWQgY2hhciAqcywgaW50IG4pCit7IGNoYXIgZFsyXTsKKyAgcmVnaXN0ZXIgaW50IGk7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgaWYgKCEoc29hcC0+ZG9tLT5kYXRhID0gc29hcF9zMmhleChzb2FwLCBzLCBOVUxMLCBuKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNlbmRpZgorICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICB7IHJlZ2lzdGVyIGludCBtID0gKnMrKzsKKyAgICBkWzBdID0gKGNoYXIpKChtID4+IDQpICsgKG0gPiAxNTkgPyAnNycgOiAnMCcpKTsKKyAgICBtICY9IDB4MEY7CisgICAgZFsxXSA9IChjaGFyKShtICsgKG0gPiA5ID8gJzcnIDogJzAnKSk7CisgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgZCwgMikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit1bnNpZ25lZCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9nZXRoZXgoc3RydWN0IHNvYXAgKnNvYXAsIGludCAqbikKK3sKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBzb2FwLT5kb20tPmRhdGEgPSBzb2FwX3N0cmluZ19pbihzb2FwLCAwLCAtMSwgLTEpOworICAgIHJldHVybiAodW5zaWduZWQgY2hhciopc29hcF9oZXgycyhzb2FwLCBzb2FwLT5kb20tPmRhdGEsIE5VTEwsIDAsIG4pOworICB9CisjZW5kaWYKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgc29hcC0+bGFiaWR4ID0gMDsKKyAgZm9yICg7OykKKyAgeyByZWdpc3RlciBjaGFyICpzOworICAgIHJlZ2lzdGVyIGludCBpLCBrOworICAgIGlmIChzb2FwX2FwcGVuZF9sYWIoc29hcCwgTlVMTCwgMCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBzID0gc29hcC0+bGFiYnVmICsgc29hcC0+bGFiaWR4OworICAgIGsgPSBzb2FwLT5sYWJsZW4gLSBzb2FwLT5sYWJpZHg7CisgICAgc29hcC0+bGFiaWR4ID0gc29hcC0+bGFibGVuOworICAgIGZvciAoaSA9IDA7IGkgPCBrOyBpKyspCisgICAgeyByZWdpc3RlciBjaGFyIGQxLCBkMjsKKyAgICAgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgICAgIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgICAgIGlmIChzb2FwX2lzeGRpZ2l0KGMpKQorICAgICAgeyBkMSA9IChjaGFyKWM7CisgICAgICAgIGMgPSBzb2FwX2dldChzb2FwKTsgCisJaWYgKHNvYXBfaXN4ZGlnaXQoYykpCisgICAgICAgICAgZDIgPSAoY2hhciljOworICAgICAgICBlbHNlIAorICAgICAgICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IHVuc2lnbmVkIGNoYXIgKnA7CisgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgIGlmIChuKQorICAgICAgICAgICpuID0gKGludCkoc29hcC0+bGFibGVuIC0gayArIGkpOworICAgICAgICBwID0gKHVuc2lnbmVkIGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHNvYXAtPmxhYmxlbiAtIGsgKyBpKTsKKwlpZiAocCkKKwkgIG1lbWNweShwLCBzb2FwLT5sYWJidWYsIHNvYXAtPmxhYmxlbiAtIGsgKyBpKTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgICB9CisgICAgICAqcysrID0gKChkMSA+PSAnQScgPyAoZDEgJiAweDcpICsgOSA6IGQxIC0gJzAnKSA8PCA0KSArIChkMiA+PSAnQScgPyAoZDIgJiAweDcpICsgOSA6IGQyIC0gJzAnKTsKKyAgICB9CisgIH0KKyNlbHNlCisgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgZm9yICg7OykKKyAgeyByZWdpc3RlciBpbnQgaTsKKyAgICByZWdpc3RlciBjaGFyICpzID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBTT0FQX0JMS0xFTik7CisgICAgaWYgKCFzKQorICAgIHsgc29hcF9lbmRfYmxvY2soc29hcCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IFNPQVBfQkxLTEVOOyBpKyspCisgICAgeyByZWdpc3RlciBjaGFyIGQxLCBkMjsKKyAgICAgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IHNvYXBfZ2V0KHNvYXApOworICAgICAgaWYgKHNvYXBfaXN4ZGlnaXQoYykpCisgICAgICB7IGQxID0gKGNoYXIpYzsKKyAgICAgICAgYyA9IHNvYXBfZ2V0KHNvYXApOyAKKwlpZiAoc29hcF9pc3hkaWdpdChjKSkKKyAgICAgICAgICBkMiA9IChjaGFyKWM7CisgICAgICAgIGVsc2UgCisgICAgICAgIHsgc29hcF9lbmRfYmxvY2soc29hcCk7CisJICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyB1bnNpZ25lZCBjaGFyICpwOworICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICBpZiAobikKKyAgICAgICAgICAqbiA9IHNvYXBfc2l6ZV9ibG9jayhzb2FwLCBpKTsKKyAgICAgICAgcCA9ICh1bnNpZ25lZCBjaGFyKilzb2FwX3NhdmVfYmxvY2soc29hcCwgTlVMTCwgMCk7CisgICAgICAgIHJldHVybiBwOworICAgICAgfQorICAgICAgKnMrKyA9ICgoZDEgPj0gJ0EnID8gKGQxICYgMHg3KSArIDkgOiBkMSAtICcwJykgPDwgNCkgKyAoZDIgPj0gJ0EnID8gKGQyICYgMHg3KSArIDkgOiBkMiAtICcwJyk7CisgICAgfQorICB9CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRiYXNlNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMsIGludCBuKQoreyByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBtOworICBjaGFyIGRbNF07CisgIGlmICghcykKKyAgICByZXR1cm4gU09BUF9PSzsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBpZiAoIShzb2FwLT5kb20tPmRhdGEgPSBzb2FwX3MyYmFzZTY0KHNvYXAsIHMsIE5VTEwsIG4pKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2VuZGlmCisgIGZvciAoOyBuID4gMjsgbiAtPSAzLCBzICs9IDMpCisgIHsgbSA9IHNbMF07CisgICAgbSA9IChtIDw8IDgpIHwgc1sxXTsKKyAgICBtID0gKG0gPDwgOCkgfCBzWzJdOworICAgIGZvciAoaSA9IDQ7IGkgPiAwOyBtID4+PSA2KQorICAgICAgZFstLWldID0gc29hcF9iYXNlNjRvW20gJiAweDNGXTsKKyAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBkLCA0KSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAobiA+IDApCisgIHsgbSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgIG0gPSAobSA8PCA4KSB8ICpzKys7CisgICAgZm9yICg7IGkgPCAzOyBpKyspCisgICAgICBtIDw8PSA4OworICAgIGZvciAoaSsrOyBpID4gMDsgbSA+Pj0gNikKKyAgICAgIGRbLS1pXSA9IHNvYXBfYmFzZTY0b1ttICYgMHgzRl07CisgICAgZm9yIChpID0gMzsgaSA+IG47IGktLSkKKyAgICAgIGRbaV0gPSAnPSc7CisgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgZCwgNCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit1bnNpZ25lZCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9nZXRiYXNlNjQoc3RydWN0IHNvYXAgKnNvYXAsIGludCAqbiwgaW50IG1hbGxvY19mbGFnKQoreyAKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBzb2FwLT5kb20tPmRhdGEgPSBzb2FwX3N0cmluZ19pbihzb2FwLCAwLCAtMSwgLTEpOworICAgIHJldHVybiAodW5zaWduZWQgY2hhciopc29hcF9iYXNlNjQycyhzb2FwLCBzb2FwLT5kb20tPmRhdGEsIE5VTEwsIDAsIG4pOworICB9CisjZW5kaWYKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgc29hcC0+bGFiaWR4ID0gMDsKKyAgZm9yICg7OykKKyAgeyByZWdpc3RlciBpbnQgaSwgazsKKyAgICByZWdpc3RlciBjaGFyICpzOworICAgIGlmIChzb2FwX2FwcGVuZF9sYWIoc29hcCwgTlVMTCwgMikpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBzID0gc29hcC0+bGFiYnVmICsgc29hcC0+bGFiaWR4OworICAgIGsgPSBzb2FwLT5sYWJsZW4gLSBzb2FwLT5sYWJpZHg7CisgICAgc29hcC0+bGFiaWR4ID0gMyAqIChzb2FwLT5sYWJsZW4gLyAzKTsKKyAgICBpZiAoIXMpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgayAtIDI7IGkgKz0gMykKKyAgICB7IHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbSA9IDA7CisgICAgICByZWdpc3RlciBpbnQgaiA9IDA7CisgICAgICBkbworICAgICAgeyByZWdpc3RlciBzb2FwX3djaGFyIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgICAgICAgaWYgKGMgPT0gJz0nIHx8IGMgPCAwKQorICAgICAgICB7IHVuc2lnbmVkIGNoYXIgKnA7CisgICAgICAgICAgc3dpdGNoIChqKQorICAgICAgICAgIHsgY2FzZSAyOgorICAgICAgICAgICAgICAqcysrID0gKGNoYXIpKChtID4+IDQpICYgMHhGRik7CisgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gMTApICYgMHhGRik7CisgICAgICAgICAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gMikgJiAweEZGKTsKKyAgICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobikKKyAgICAgICAgICAgICpuID0gKGludCkoc29hcC0+bGFibGVuIC0gayArIGkpOworICAgICAgICAgIHAgPSAodW5zaWduZWQgY2hhciopc29hcF9tYWxsb2Moc29hcCwgc29hcC0+bGFibGVuIC0gayArIGkpOworCSAgaWYgKHApCisJICAgIG1lbWNweShwLCBzb2FwLT5sYWJidWYsIHNvYXAtPmxhYmxlbiAtIGsgKyBpKTsKKyAgICAgICAgICBpZiAoYyA+PSAwKQorICAgICAgICAgIHsgd2hpbGUgKChpbnQpKChjID0gc29hcF9nZXQoc29hcCkpICE9IEVPRikgJiYgYyAhPSBTT0FQX0xUICYmIGMgIT0gU09BUF9UVCkKKyAgICAgICAgICAgICAgOworCSAgfQorICAgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgIH0KKyAgICAgICAgYyAtPSAnKyc7CisgICAgICAgIGlmIChjID49IDAgJiYgYyA8PSA3OSkKKyAgICAgICAgeyBtID0gKG0gPDwgNikgKyBzb2FwX2Jhc2U2NGlbY107CisgICAgICAgICAgaisrOworICAgICAgICB9CisgICAgICB9IHdoaWxlIChqIDwgNCk7CisgICAgICAqcysrID0gKGNoYXIpKChtID4+IDE2KSAmIDB4RkYpOworICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiA4KSAmIDB4RkYpOworICAgICAgKnMrKyA9IChjaGFyKShtICYgMHhGRik7CisgICAgfQorICB9CisjZWxzZQorICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgcmV0dXJuIE5VTEw7CisgIGZvciAoOzspCisgIHsgcmVnaXN0ZXIgaW50IGk7CisgICAgcmVnaXN0ZXIgY2hhciAqcyA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgMyAqIFNPQVBfQkxLTEVOKTsgLyogbXVzdCBiZSBtdWx0aXBsZSBvZiAzICovCisgICAgaWYgKCFzKQorICAgIHsgc29hcF9lbmRfYmxvY2soc29hcCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IFNPQVBfQkxLTEVOOyBpKyspCisgICAgeyByZWdpc3RlciB1bnNpZ25lZCBsb25nIG0gPSAwOworICAgICAgcmVnaXN0ZXIgaW50IGogPSAwOworICAgICAgZG8KKyAgICAgIHsgcmVnaXN0ZXIgc29hcF93Y2hhciBjID0gc29hcF9nZXQoc29hcCk7CisgICAgICAgIGlmIChjID09ICc9JyB8fCBjIDwgMCkKKyAgICAgICAgeyB1bnNpZ25lZCBjaGFyICpwOworICAgICAgICAgIGkgKj0gMzsKKyAgICAgICAgICBzd2l0Y2ggKGopCisgICAgICAgICAgeyBjYXNlIDI6CisgICAgICAgICAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gNCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiAxMCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiAyKSAmIDB4RkYpOworICAgICAgICAgICAgICBpICs9IDI7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChuKQorCSAgICAqbiA9IChpbnQpc29hcF9zaXplX2Jsb2NrKHNvYXAsIGkpOworICAgICAgICAgIHAgPSAodW5zaWduZWQgY2hhciopc29hcF9zYXZlX2Jsb2NrKHNvYXAsIE5VTEwsIDApOworICAgICAgICAgIGlmIChjID49IDApCisgICAgICAgICAgeyB3aGlsZSAoKGludCkoKGMgPSBzb2FwX2dldChzb2FwKSkgIT0gRU9GKSAmJiBjICE9IFNPQVBfTFQgJiYgYyAhPSBTT0FQX1RUKQorICAgICAgICAgICAgICA7CisJICB9CisgICAgICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgfQorICAgICAgICBjIC09ICcrJzsKKyAgICAgICAgaWYgKGMgPj0gMCAmJiBjIDw9IDc5KQorICAgICAgICB7IG0gPSAobSA8PCA2KSArIHNvYXBfYmFzZTY0aVtjXTsKKyAgICAgICAgICBqKys7CisgICAgICAgIH0KKyAgICAgIH0gd2hpbGUgKGogPCA0KTsKKyAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gMTYpICYgMHhGRik7CisgICAgICAqcysrID0gKGNoYXIpKChtID4+IDgpICYgMHhGRik7CisgICAgICAqcysrID0gKGNoYXIpKG0gJiAweEZGKTsKKyAgICB9CisgIH0KKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3hvcF9mb3J3YXJkKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBjaGFyICoqcHRyLCBpbnQgKnNpemUsIGNoYXIgKippZCwgY2hhciAqKnR5cGUsIGNoYXIgKipvcHRpb25zKQoreyAvKiBDaGVjayBNVE9NIHhvcDpJbmNsdWRlIGVsZW1lbnQgKHdpdGhpbiBoZXgvYmFzZTY0QmluYXJ5KSAqLworICAvKiBUT0RPOiB0aGlzIGNvZGUgdG8gYmUgb2Jzb2xldGVkIHdpdGggbmV3IGltcG9ydC94b3AuaCBjb252ZW50aW9ucyAqLworICBpbnQgYm9keSA9IHNvYXAtPmJvZHk7IC8qIHNob3VsZCBzYXZlIHR5cGUgdG9vPyAqLworICBpZiAoIXNvYXBfcGVla19lbGVtZW50KHNvYXApKQorICB7IGlmICghc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsICJ4b3A6SW5jbHVkZSIsIDApICYmICpzb2FwLT5ocmVmKQorICAgIHsgaWYgKHNvYXBfZGltZV9mb3J3YXJkKHNvYXAsIHB0ciwgc2l6ZSwgaWQsIHR5cGUsIG9wdGlvbnMpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgTlVMTCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgc29hcC0+Ym9keSA9IGJvZHk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZGltZV9mb3J3YXJkKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBjaGFyICoqcHRyLCBpbnQgKnNpemUsIGNoYXIgKippZCwgY2hhciAqKnR5cGUsIGNoYXIgKipvcHRpb25zKQoreyBzdHJ1Y3Qgc29hcF94bGlzdCAqeHAgPSAoc3RydWN0IHNvYXBfeGxpc3QqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF94bGlzdCkpOworICAqcHRyID0gTlVMTDsKKyAgKnNpemUgPSAwOworICAqaWQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT5ocmVmKTsKKyAgKnR5cGUgPSBOVUxMOworICAqb3B0aW9ucyA9IE5VTEw7CisgIGlmICgheHApCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgIHhwLT5uZXh0ID0gc29hcC0+eGxpc3Q7CisgIHhwLT5wdHIgPSBwdHI7CisgIHhwLT5zaXplID0gc2l6ZTsKKyAgeHAtPmlkID0gKmlkOworICB4cC0+dHlwZSA9IHR5cGU7CisgIHhwLT5vcHRpb25zID0gb3B0aW9uczsKKyAgc29hcC0+eGxpc3QgPSB4cDsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9zdHJkdXAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMpCit7IGNoYXIgKnQgPSBOVUxMOworICBpZiAocyAmJiAodCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzdHJsZW4ocykgKyAxKSkpCisgICAgc3RyY3B5KHQsIHMpOworICByZXR1cm4gdDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9uZXdfYmxvY2soc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX2JsaXN0ICpwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk5ldyBibG9jayBzZXF1ZW5jZSAocHJldj0lcClcbiIsIHNvYXAtPmJsaXN0KSk7CisgIGlmICghKHAgPSAoc3RydWN0IHNvYXBfYmxpc3QqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9ibGlzdCkpKSkKKyAgICByZXR1cm4gU09BUF9FT007ICAgCisgIHAtPm5leHQgPSBzb2FwLT5ibGlzdDsgCisgIHAtPnB0ciA9IE5VTEw7CisgIHAtPnNpemUgPSAwOworICBzb2FwLT5ibGlzdCA9IHA7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZCoKK1NPQVBfRk1BQzIKK3NvYXBfcHVzaF9ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCwgc2l6ZV90IG4pCit7IGNoYXIgKnA7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUHVzaCBibG9jayBvZiAldSBieXRlcyAoJXUgYnl0ZXMgdG90YWwpXG4iLCAodW5zaWduZWQgaW50KW4sICh1bnNpZ25lZCBpbnQpc29hcC0+Ymxpc3QtPnNpemUgKyAodW5zaWduZWQgaW50KW4pKTsKKyAgaWYgKCEocCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBuICsgc2l6ZW9mKGNoYXIqKSArIHNpemVvZihzaXplX3QpKSkpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICAqKGNoYXIqKilwID0gc29hcC0+Ymxpc3QtPnB0cjsKKyAgKihzaXplX3QqKShwICsgc2l6ZW9mKGNoYXIqKSkgPSBuOworICBzb2FwLT5ibGlzdC0+cHRyID0gcDsKKyAgc29hcC0+Ymxpc3QtPnNpemUgKz0gbjsKKyAgcmV0dXJuIHAgKyBzaXplb2YoY2hhciopICsgc2l6ZW9mKHNpemVfdCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3BvcF9ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgY2hhciAqcDsKKyAgaWYgKCFzb2FwLT5ibGlzdC0+cHRyKQorICAgIHJldHVybjsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQb3AgYmxvY2tcbiIpKTsKKyAgcCA9IHNvYXAtPmJsaXN0LT5wdHI7CisgIHNvYXAtPmJsaXN0LT5zaXplIC09ICooc2l6ZV90KikocCArIHNpemVvZihjaGFyKikpOworICBzb2FwLT5ibGlzdC0+cHRyID0gKihjaGFyKiopcDsKKyAgU09BUF9GUkVFKHNvYXAsIHApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyB2b2lkCitzb2FwX3VwZGF0ZV9wdHJzKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpzdGFydCwgY2hhciAqZW5kLCBjaGFyICpwMSwgY2hhciAqcDIpCit7IGludCBpOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2ZsaXN0ICpmcDsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfeGxpc3QgKnhwOworI2VuZGlmCisgIHJlZ2lzdGVyIHZvaWQgKnAsICoqcTsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfSURIQVNIOyBpKyspCisgIHsgZm9yIChpcCA9IHNvYXAtPmlodFtpXTsgaXA7IGlwID0gaXAtPm5leHQpCisgICAgeyBpZiAoaXAtPnB0ciAmJiAoY2hhciopaXAtPnB0ciA+PSBzdGFydCAmJiAoY2hhciopaXAtPnB0ciA8IGVuZCkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVcGRhdGUgaWQ9JyVzJyAlcCAtPiAlcFxuIiwgaXAtPmlkLCBpcC0+cHRyLCAoY2hhciopaXAtPnB0ciArIChwMS1wMikpKTsKKyAgICAgICAgaXAtPnB0ciA9IChjaGFyKilpcC0+cHRyICsgKHAxLXAyKTsKKyAgICAgIH0KKyAgICAgIGZvciAocSA9ICZpcC0+bGluazsgcTsgcSA9ICh2b2lkKiopcCkKKyAgICAgIHsgcCA9ICpxOworICAgICAgICBpZiAocCAmJiAoY2hhciopcCA+PSBzdGFydCAmJiAoY2hhciopcCA8IGVuZCkKKyAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkxpbmsgdXBkYXRlIGlkPSclcycgJXBcbiIsIGlwLT5pZCwgcCkpOworICAgICAgICAgICpxID0gKGNoYXIqKXAgKyAocDEtcDIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBmb3IgKHEgPSAmaXAtPmNvcHk7IHE7IHEgPSAodm9pZCoqKXApCisgICAgICB7IHAgPSAqcTsKKyAgICAgICAgaWYgKHAgJiYgKGNoYXIqKXAgPj0gc3RhcnQgJiYgKGNoYXIqKXAgPCBlbmQpCisgICAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5IGNoYWluIHVwZGF0ZSBpZD0nJXMnICVwXG4iLCBpcC0+aWQsIHApKTsKKyAgICAgICAgICAqcSA9IChjaGFyKilwICsgKHAxLXAyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZm9yIChmcCA9IGlwLT5mbGlzdDsgZnA7IGZwID0gZnAtPm5leHQpCisgICAgICB7IGlmICgoY2hhciopZnAtPnB0ciA+PSBzdGFydCAmJiAoY2hhciopZnAtPnB0ciA8IGVuZCkKKyAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHkgbGlzdCB1cGRhdGUgaWQ9JyVzJyAlcFxuIiwgaXAtPmlkLCBmcCkpOworICAgICAgICAgIGZwLT5wdHIgPSAoY2hhciopZnAtPnB0ciArIChwMS1wMik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgZm9yICh4cCA9IHNvYXAtPnhsaXN0OyB4cDsgeHAgPSB4cC0+bmV4dCkKKyAgeyBpZiAoeHAtPnB0ciAmJiAoY2hhciopeHAtPnB0ciA+PSBzdGFydCAmJiAoY2hhciopeHAtPnB0ciA8IGVuZCkKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVXBkYXRlIGlkPSclcycgJXAgLT4gJXBcbiIsIHhwLT5pZD94cC0+aWQ6IiIsIHhwLT5wdHIsIChjaGFyKil4cC0+cHRyICsgKHAxLXAyKSkpOworICAgICAgeHAtPnB0ciA9ICh1bnNpZ25lZCBjaGFyKiopKChjaGFyKil4cC0+cHRyICsgKHAxLXAyKSk7CisgICAgICB4cC0+c2l6ZSA9IChpbnQqKSgoY2hhciopeHAtPnNpemUgKyAocDEtcDIpKTsKKyAgICAgIHhwLT50eXBlID0gKGNoYXIqKikoKGNoYXIqKXhwLT50eXBlICsgKHAxLXAyKSk7CisgICAgICB4cC0+b3B0aW9ucyA9IChjaGFyKiopKChjaGFyKil4cC0+b3B0aW9ucyArIChwMS1wMikpOworICAgIH0KKyAgfQorI2VuZGlmCit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzb2FwX2hhc19jb3BpZXMoc3RydWN0IHNvYXAgKnNvYXAsIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnN0YXJ0LCByZWdpc3RlciBjb25zdCBjaGFyICplbmQpCit7IHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2ZsaXN0ICpmcDsKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqcDsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfSURIQVNIOyBpKyspCisgIHsgZm9yIChpcCA9IHNvYXAtPmlodFtpXTsgaXA7IGlwID0gaXAtPm5leHQpCisgICAgeyBmb3IgKHAgPSAoY29uc3QgY2hhciopaXAtPmNvcHk7IHA7IHAgPSAqKGNvbnN0IGNoYXIqKilwKQorICAgICAgICBpZiAocCA+PSBzdGFydCAmJiBwIDwgZW5kKQorICAgICAgICAgIHJldHVybiBTT0FQX0VSUjsKKyAgICAgIGZvciAoZnAgPSBpcC0+Zmxpc3Q7IGZwOyBmcCA9IGZwLT5uZXh0KQorICAgICAgICBpZiAoKGNvbnN0IGNoYXIqKWZwLT5wdHIgPj0gc3RhcnQgJiYgKGNvbnN0IGNoYXIqKWZwLT5wdHIgPCBlbmQpCisJICByZXR1cm4gU09BUF9FUlI7CisgICAgfQorICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3Jlc29sdmUoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2ZsaXN0ICpmcDsKKyAgc2hvcnQgZmxhZzsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHZpbmcgZm9yd2FyZGVkIGRhdGFcbiIpKTsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfSURIQVNIOyBpKyspCisgIHsgZm9yIChpcCA9IHNvYXAtPmlodFtpXTsgaXA7IGlwID0gaXAtPm5leHQpCisgICAgeyBpZiAoaXAtPnB0cikKKyAgICAgIHsgcmVnaXN0ZXIgdm9pZCAqcCwgKipxLCAqcjsKKyAgICAgICAgcSA9ICh2b2lkKiopaXAtPmxpbms7CisgICAgICAgIGlwLT5saW5rID0gTlVMTDsKKyAgICAgICAgciA9IGlwLT5wdHI7CisgICAgICAgIERCR0xPRyhURVNULCBpZiAocSkgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlRyYXZlcnNpbmcgbGluayBjaGFpbiB0byByZXNvbHZlIGlkPSclcydcbiIsIGlwLT5pZCkpOworICAgICAgICB3aGlsZSAocSkKKyAgICAgICAgeyBwID0gKnE7CisgICAgICAgICAgKnEgPSByOworICAgICAgICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICIuLi4gbGluayAlcCAtPiAlcFxuIiwgcSwgcikpOworICAgICAgICAgIHEgPSAodm9pZCoqKXA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCppcC0+aWQgPT0gJyMnKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk1pc3NpbmcgZGF0YSBmb3IgaWQ9JyVzJ1xuIiwgaXAtPmlkKSk7CisgICAgICAgIHN0cmNweShzb2FwLT5pZCwgaXAtPmlkICsgMSk7CisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTUlTU0lOR19JRDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZG8KKyAgeyBmbGFnID0gMDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc29sdXRpb24gcGhhc2VcbiIpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgU09BUF9JREhBU0g7IGkrKykKKyAgICB7IGZvciAoaXAgPSBzb2FwLT5paHRbaV07IGlwOyBpcCA9IGlwLT5uZXh0KQorICAgICAgeyBpZiAoaXAtPnB0ciAmJiAhc29hcF9oYXNfY29waWVzKHNvYXAsIChjb25zdCBjaGFyKilpcC0+cHRyLCAoY29uc3QgY2hhciopaXAtPnB0ciArIGlwLT5zaXplKSkKKyAgICAgICAgeyBpZiAoaXAtPmNvcHkpCisgICAgICAgICAgeyByZWdpc3RlciB2b2lkICpwLCAqKnEgPSAodm9pZCoqKWlwLT5jb3B5OworICAgICAgICAgICAgREJHTE9HKFRFU1QsIGlmIChxKSBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVHJhdmVyc2luZyBjb3B5IGNoYWluIHRvIHJlc29sdmUgaWQ9JyVzJ1xuIiwgaXAtPmlkKSk7CisgICAgICAgICAgICBpcC0+Y29weSA9IE5VTEw7CisgICAgICAgICAgICBkbworICAgICAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIi4uLiBjb3B5ICVwIC0+ICVwICgldSBieXRlcylcbiIsIGlwLT5wdHIsIHEsICh1bnNpZ25lZCBpbnQpaXAtPnNpemUpKTsKKwkgICAgICBwID0gKnE7CisgICAgICAgICAgICAgIG1lbWNweShxLCBpcC0+cHRyLCBpcC0+c2l6ZSk7CisgICAgICAgICAgICAgIHEgPSAodm9pZCoqKXA7CisgICAgICAgICAgICB9IHdoaWxlIChxKTsKKwkgICAgZmxhZyA9IDE7CisJICB9CisgICAgICAgICAgZm9yIChmcCA9IGlwLT5mbGlzdDsgZnA7IGZwID0gaXAtPmZsaXN0KQorICAgICAgICAgIHsgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGsgPSBmcC0+bGV2ZWw7CisJICAgIHJlZ2lzdGVyIHZvaWQgKnAgPSBpcC0+cHRyOworICAgICAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHZpbmcgZm9yd2FyZGVkIGRhdGEgdHlwZT0lZCBsb2NhdGlvbj0lcCBsZXZlbD0ldSwldSBpZD0nJXMnXG4iLCBpcC0+dHlwZSwgcCwgaXAtPmxldmVsLCBmcC0+bGV2ZWwsIGlwLT5pZCkpOworCSAgICB3aGlsZSAoaXAtPmxldmVsIDwgaykKKyAgICAgICAgICAgIHsgcmVnaXN0ZXIgdm9pZCAqKnEgPSAodm9pZCoqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZih2b2lkKikpOyAgCisJICAgICAgaWYgKCFxKQorCSAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworCSAgICAgICpxID0gcDsKKyAgICAgICAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJEZXNjZW5kaW5nIG9uZSBsZXZlbCwgbmV3IGxvY2F0aW9uPSVwIGhvbGRzPSVwLi4uXG4iLCBxLCAqcSkpOworICAgICAgICAgICAgICBwID0gKHZvaWQqKXE7CisgICAgICAgICAgICAgIGstLTsKKyAgICAgICAgICAgIH0KKwkgICAgaWYgKGZwLT5mY29weSkKKwkgICAgICBmcC0+ZmNvcHkoc29hcCwgaXAtPnR5cGUsIGZwLT50eXBlLCBmcC0+cHRyLCBmcC0+bGVuLCBwLCBpcC0+c2l6ZSk7CisJICAgIGVsc2UKKwkgICAgICBzb2FwX2Zjb3B5KHNvYXAsIGlwLT50eXBlLCBmcC0+dHlwZSwgZnAtPnB0ciwgZnAtPmxlbiwgcCwgaXAtPnNpemUpOworCSAgICBpcC0+Zmxpc3QgPSBmcC0+bmV4dDsKKwkgICAgU09BUF9GUkVFKHNvYXAsIGZwKTsKKwkgICAgZmxhZyA9IDE7CisJICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0gd2hpbGUgKGZsYWcpOworI2lmZGVmIFNPQVBfREVCVUcKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfSURIQVNIOyBpKyspCisgIHsgZm9yIChpcCA9IHNvYXAtPmlodFtpXTsgaXA7IGlwID0gaXAtPm5leHQpCisgICAgeyBpZiAoaXAtPmNvcHkgfHwgaXAtPmZsaXN0KQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc29sdXRpb24gZXJyb3I6IGZvcndhcmRlZCBkYXRhIGZvciBpZD0nJXMnIGNvdWxkIG5vdCBiZSBwcm9wYWdhdGVkLCBwbGVhc2UgcmVwb3J0IHRoaXMgcHJvYmxlbSB0byB0aGUgZGV2ZWxvcGVyc1xuIiwgaXAtPmlkKSk7CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHV0aW9uIGRvbmVcbiIpKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3NpemVfdAorU09BUF9GTUFDMgorc29hcF9zaXplX2Jsb2NrKHN0cnVjdCBzb2FwICpzb2FwLCBzaXplX3QgbikKK3sgaWYgKHNvYXAtPmJsaXN0LT5wdHIpCisgIHsgc29hcC0+Ymxpc3QtPnNpemUgLT0gKihzaXplX3QqKShzb2FwLT5ibGlzdC0+cHRyICsgc2l6ZW9mKGNoYXIqKSkgLSBuOworICAgICooc2l6ZV90Kikoc29hcC0+Ymxpc3QtPnB0ciArIHNpemVvZihjaGFyKikpID0gbjsKKyAgfQorICByZXR1cm4gc29hcC0+Ymxpc3QtPnNpemU7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjaGFyKgorU09BUF9GTUFDMgorc29hcF9maXJzdF9ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgY2hhciAqcCwgKnEsICpyOworICBwID0gc29hcC0+Ymxpc3QtPnB0cjsKKyAgaWYgKCFwKQorICAgIHJldHVybiBOVUxMOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZpcnN0IGJsb2NrXG4iKSk7CisgIHIgPSBOVUxMOworICBkbworICB7IHEgPSAqKGNoYXIqKilwOworICAgICooY2hhcioqKXAgPSByOworICAgIHIgPSBwOworICAgIHAgPSBxOworICB9IHdoaWxlIChwKTsKKyAgc29hcC0+Ymxpc3QtPnB0ciA9IHI7CisgIHJldHVybiByICsgc2l6ZW9mKGNoYXIqKSArIHNpemVvZihzaXplX3QpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfbmV4dF9ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgY2hhciAqcDsKKyAgcCA9IHNvYXAtPmJsaXN0LT5wdHI7CisgIGlmIChwKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTmV4dCBibG9ja1xuIikpOworICAgIHNvYXAtPmJsaXN0LT5wdHIgPSAqKGNoYXIqKilwOworICAgIFNPQVBfRlJFRShzb2FwLCBwKTsKKyAgICBpZiAoc29hcC0+Ymxpc3QtPnB0cikKKyAgICAgIHJldHVybiBzb2FwLT5ibGlzdC0+cHRyICsgc2l6ZW9mKGNoYXIqKSArIHNpemVvZihzaXplX3QpOworICB9CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc2l6ZV90CitTT0FQX0ZNQUMyCitzb2FwX2Jsb2NrX3NpemUoc3RydWN0IHNvYXAgKnNvYXApCit7IHJldHVybiAqKHNpemVfdCopKHNvYXAtPmJsaXN0LT5wdHIgKyBzaXplb2YoY2hhciopKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZW5kX2Jsb2NrKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9ibGlzdCAqYnA7CisgIGNoYXIgKnAsICpxOworICBicCA9IHNvYXAtPmJsaXN0OworICBpZiAoYnApCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgb2YgYmxvY2sgc2VxdWVuY2UsIGZyZWUgYWxsIHJlbWFpbmluZyBibG9ja3NcbiIpKTsKKyAgICBmb3IgKHAgPSBicC0+cHRyOyBwOyBwID0gcSkKKyAgICB7IHEgPSAqKGNoYXIqKilwOworICAgICAgU09BUF9GUkVFKHNvYXAsIHApOworICAgIH0KKyAgICBzb2FwLT5ibGlzdCA9IGJwLT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBicCk7CisgIH0KKyAgREJHTE9HKFRFU1QsIGlmIChzb2FwLT5ibGlzdCkgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc3RvcmUgcHJldmlvdXMgYmxvY2sgc2VxdWVuY2VcbiIpKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3NhdmVfYmxvY2soc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnAsIGludCBmbGFnKQoreyByZWdpc3RlciBzaXplX3QgbjsKKyAgcmVnaXN0ZXIgY2hhciAqcSwgKnM7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2F2ZSBhbGwgYmxvY2tzIGluIGNvbnRpZ3VvdXMgbWVtb3J5IHNwYWNlIG9mICV1IGJ5dGVzICglcC0+JXApXG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmJsaXN0LT5zaXplLCBzb2FwLT5ibGlzdC0+cHRyLCBwKSk7CisgIGlmIChzb2FwLT5ibGlzdC0+c2l6ZSkKKyAgeyBpZiAoIXApCisgICAgICBwID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHNvYXAtPmJsaXN0LT5zaXplKTsKKyAgICBpZiAocCkKKyAgICB7IGZvciAocyA9IHAsIHEgPSBzb2FwX2ZpcnN0X2Jsb2NrKHNvYXApOyBxOyBxID0gc29hcF9uZXh0X2Jsb2NrKHNvYXApKQorICAgICAgeyBuID0gc29hcF9ibG9ja19zaXplKHNvYXApOworI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgICAgICAgaWYgKGZsYWcpCisJICBzb2FwX3VwZGF0ZV9wdHJzKHNvYXAsIHEsIHEgKyBuLCBzLCBxKTsKKyNlbmRpZgorICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHkgJXUgYnl0ZXMgZnJvbSAlcCB0byAlcFxuIiwgKHVuc2lnbmVkIGludCluLCBxLCBzKSk7CisgICAgICAgIG1lbWNweShzLCBxLCBuKTsKKyAgICAgICAgcyArPSBuOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICB9CisgIHNvYXBfZW5kX2Jsb2NrKHNvYXApOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9wdXRzaXplKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgc2l6ZSkKK3sgcmV0dXJuIHNvYXBfcHV0c2l6ZXMoc29hcCwgdHlwZSwgJnNpemUsIDEpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3B1dHNpemVzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBpbnQgKnNpemUsIGludCBkaW0pCit7IHJldHVybiBzb2FwX3B1dHNpemVzb2Zmc2V0cyhzb2FwLCB0eXBlLCBzaXplLCBOVUxMLCBkaW0pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3B1dHNpemVzb2Zmc2V0cyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgaW50ICpzaXplLCBjb25zdCBpbnQgKm9mZnNldCwgaW50IGRpbSkKK3sgaW50IGk7CisgIGlmICghdHlwZSkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgeyBzcHJpbnRmKHNvYXAtPnR5cGUsICIlc1slZCIsIHR5cGUsIHNpemVbMF0pOworICAgIGZvciAoaSA9IDE7IGkgPCBkaW07IGkrKykKKyAgICAgIHNwcmludGYoc29hcC0+dHlwZSArIHN0cmxlbihzb2FwLT50eXBlKSwgIiAlZCIsIHNpemVbaV0pOworICB9CisgIGVsc2UKKyAgeyBpZiAob2Zmc2V0KQorICAgIHsgc3ByaW50Zihzb2FwLT50eXBlLCAiJXNbJWQiLCB0eXBlLCBzaXplWzBdICsgb2Zmc2V0WzBdKTsKKyAgICAgIGZvciAoaSA9IDE7IGkgPCBkaW07IGkrKykKKyAgICAgICAgc3ByaW50Zihzb2FwLT50eXBlICsgc3RybGVuKHNvYXAtPnR5cGUpLCAiLCVkIiwgc2l6ZVtpXSArIG9mZnNldFtpXSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IHNwcmludGYoc29hcC0+dHlwZSwgIiVzWyVkIiwgdHlwZSwgc2l6ZVswXSk7CisgICAgICBmb3IgKGkgPSAxOyBpIDwgZGltOyBpKyspCisgICAgICAgIHNwcmludGYoc29hcC0+dHlwZSArIHN0cmxlbihzb2FwLT50eXBlKSwgIiwlZCIsIHNpemVbaV0pOworICAgIH0KKyAgICBzdHJjYXQoc29hcC0+dHlwZSwgIl0iKTsKKyAgfQorICByZXR1cm4gc29hcC0+dHlwZTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9wdXRvZmZzZXQoc3RydWN0IHNvYXAgKnNvYXAsIGludCBvZmZzZXQpCit7IHJldHVybiBzb2FwX3B1dG9mZnNldHMoc29hcCwgJm9mZnNldCwgMSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfcHV0b2Zmc2V0cyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgaW50ICpvZmZzZXQsIGludCBkaW0pCit7IHJlZ2lzdGVyIGludCBpOworICBzcHJpbnRmKHNvYXAtPmFycmF5T2Zmc2V0LCAiWyVkIiwgb2Zmc2V0WzBdKTsKKyAgZm9yIChpID0gMTsgaSA8IGRpbTsgaSsrKQorICAgIHNwcmludGYoc29hcC0+YXJyYXlPZmZzZXQgKyBzdHJsZW4oc29hcC0+YXJyYXlPZmZzZXQpLCAiLCVkIiwgb2Zmc2V0W2ldKTsKKyAgc3RyY2F0KHNvYXAtPmFycmF5T2Zmc2V0LCAiXSIpOworICByZXR1cm4gc29hcC0+YXJyYXlPZmZzZXQ7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2l6ZShjb25zdCBpbnQgKnNpemUsIGludCBkaW0pCit7IHJlZ2lzdGVyIGludCBpLCBuID0gc2l6ZVswXTsKKyAgZm9yIChpID0gMTsgaSA8IGRpbTsgaSsrKQorICAgIG4gKj0gc2l6ZVtpXTsKKyAgcmV0dXJuIG47Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0b2Zmc2V0cyhjb25zdCBjaGFyICphdHRyLCBjb25zdCBpbnQgKnNpemUsIGludCAqb2Zmc2V0LCBpbnQgZGltKQoreyByZWdpc3RlciBpbnQgaSwgaiA9IDA7CisgIGlmIChvZmZzZXQpCisgICAgZm9yIChpID0gMDsgaSA8IGRpbSAmJiBhdHRyICYmICphdHRyOyBpKyspCisgICAgeyBhdHRyKys7CisgICAgICBqICo9IHNpemVbaV07CisgICAgICBqICs9IG9mZnNldFtpXSA9IChpbnQpYXRvbChhdHRyKTsKKyAgICAgIGF0dHIgPSBzdHJjaHIoYXR0ciwgJywnKTsKKyAgICB9CisgIGVsc2UKKyAgICBmb3IgKGkgPSAwOyBpIDwgZGltICYmIGF0dHIgJiYgKmF0dHI7IGkrKykKKyAgICB7IGF0dHIrKzsKKyAgICAgIGogKj0gc2l6ZVtpXTsKKyAgICAgIGogKz0gKGludClhdG9sKGF0dHIpOworICAgICAgYXR0ciA9IHN0cmNocihhdHRyLCAnLCcpOworICAgIH0KKyAgcmV0dXJuIGo7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0c2l6ZShjb25zdCBjaGFyICphdHRyMSwgY29uc3QgY2hhciAqYXR0cjIsIGludCAqaikKK3sgcmVnaXN0ZXIgaW50IG4sIGs7CisgIGNoYXIgKnM7CisgICpqID0gMDsKKyAgaWYgKCEqYXR0cjEpCisgICAgcmV0dXJuIC0xOworICBpZiAoKmF0dHIxID09ICdbJykKKyAgICBhdHRyMSsrOworICBuID0gMTsKKyAgZm9yICg7OykKKyAgeyBrID0gKGludClzb2FwX3N0cnRvbChhdHRyMSwgJnMsIDEwKTsKKyAgICBuICo9IGs7CisgICAgaWYgKGsgPCAwIHx8IG4gPiBTT0FQX01BWEFSUkFZU0laRSB8fCBzID09IGF0dHIxKQorICAgICAgcmV0dXJuIC0xOworICAgIGF0dHIxID0gc3RyY2hyKHMsICcsJyk7CisgICAgaWYgKCFhdHRyMSkKKyAgICAgIGF0dHIxID0gc3RyY2hyKHMsICcgJyk7CisgICAgaWYgKGF0dHIyICYmICphdHRyMikKKyAgICB7IGF0dHIyKys7CisgICAgICAqaiAqPSBrOworICAgICAgayA9IChpbnQpc29hcF9zdHJ0b2woYXR0cjIsICZzLCAxMCk7CisgICAgICAqaiArPSBrOworICAgICAgaWYgKGsgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgICBhdHRyMiA9IHM7CisgICAgfQorICAgIGlmICghYXR0cjEpCisgICAgICBicmVhazsKKyAgICBhdHRyMSsrOworICB9CisgIHJldHVybiBuIC0gKmo7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0c2l6ZXMoY29uc3QgY2hhciAqYXR0ciwgaW50ICpzaXplLCBpbnQgZGltKQoreyByZWdpc3RlciBpbnQgaSwgaywgbjsKKyAgaWYgKCEqYXR0cikKKyAgICByZXR1cm4gLTE7CisgIGkgPSBzdHJsZW4oYXR0cik7CisgIG4gPSAxOworICBkbworICB7IGZvciAoaSA9IGktMTsgaSA+PSAwOyBpLS0pCisgICAgICBpZiAoYXR0cltpXSA9PSAnWycgfHwgYXR0cltpXSA9PSAnLCcgfHwgYXR0cltpXSA9PSAnICcpCisgICAgICAgIGJyZWFrOworICAgIGsgPSAoaW50KWF0b2woYXR0ciArIGkgKyAxKTsKKyAgICBuICo9IHNpemVbLS1kaW1dID0gazsKKyAgICBpZiAoayA8IDAgfHwgbiA+IFNPQVBfTUFYQVJSQVlTSVpFKQorICAgICAgcmV0dXJuIC0xOworICB9IHdoaWxlIChpID49IDAgJiYgYXR0cltpXSAhPSAnWycpOworICByZXR1cm4gbjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRwb3NpdGlvbihjb25zdCBjaGFyICphdHRyLCBpbnQgKnBvcykKK3sgcmVnaXN0ZXIgaW50IGksIG47CisgIGlmICghKmF0dHIpCisgICAgcmV0dXJuIC0xOworICBuID0gMDsKKyAgaSA9IDE7CisgIGRvCisgIHsgcG9zW24rK10gPSAoaW50KWF0b2woYXR0ciArIGkpOworICAgIHdoaWxlIChhdHRyW2ldICYmIGF0dHJbaV0gIT0gJywnICYmIGF0dHJbaV0gIT0gJ10nKQorICAgICAgaSsrOworICAgIGlmIChhdHRyW2ldID09ICcsJykKKyAgICAgIGkrKzsKKyAgfSB3aGlsZSAobiA8IFNPQVBfTUFYRElNUyAmJiBhdHRyW2ldICYmIGF0dHJbaV0gIT0gJ10nKTsKKyAgcmV0dXJuIG47Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHVzaF9uYW1lc3BhY2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICpucykKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wOworICByZWdpc3RlciBzdHJ1Y3QgTmFtZXNwYWNlICpwOworICByZWdpc3RlciBzaG9ydCBpID0gLTE7CisgIHJlZ2lzdGVyIHNpemVfdCBuLCBrOworICBuID0gc3RybGVuKGlkKTsKKyAgayA9IHN0cmxlbihucykgKyAxOworICBwID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlczsKKyAgaWYgKHApCisgIHsgZm9yIChpID0gMDsgcC0+aWQ7IHArKywgaSsrKQorICAgIHsgaWYgKHAtPm5zICYmICFzdHJjbXAobnMsIHAtPm5zKSkKKyAgICAgIHsgaWYgKHAtPm91dCkKKyAgICAgICAgeyBTT0FQX0ZSRUUoc29hcCwgcC0+b3V0KTsKKyAgICAgICAgICBwLT5vdXQgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKHAtPm91dCkKKyAgICAgIHsgaWYgKCFzdHJjbXAobnMsIHAtPm91dCkpCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlbHNlIGlmIChwLT5pbikKKyAgICAgIHsgaWYgKCFzb2FwX3RhZ19jbXAobnMsIHAtPmluKSkKKyAgICAgICAgeyBpZiAoKHAtPm91dCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBrKSkpCisgICAgICAgICAgICBzdHJjcHkocC0+b3V0LCBucyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFwIHx8ICFwLT5pZCkKKyAgICAgIGkgPSAtMTsKKyAgfQorICBpZiAoaSA+PSAwKQorICAgIGsgPSAwOworICBucCA9IChzdHJ1Y3Qgc29hcF9ubGlzdCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX25saXN0KSArIG4gKyBrKTsKKyAgaWYgKCFucCkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgbnAtPm5leHQgPSBzb2FwLT5ubGlzdDsKKyAgc29hcC0+bmxpc3QgPSBucDsKKyAgbnAtPmxldmVsID0gc29hcC0+bGV2ZWw7CisgIG5wLT5pbmRleCA9IGk7CisgIHN0cmNweShucC0+aWQsIGlkKTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQdXNoIG5hbWVzcGFjZSBiaW5kaW5nIChsZXZlbD0ldSkgJyVzJyAnJXMnXG4iLCBzb2FwLT5sZXZlbCwgaWQsIG5zKSk7CisgIGlmIChpIDwgMCkKKyAgeyBucC0+bnMgPSBucC0+aWQgKyBuICsgMTsKKyAgICBzdHJjcHkobnAtPm5zLCBucyk7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQdXNoIE5PVCBPSzogbm8gbWF0Y2ggZm91bmQgZm9yICclcycgaW4gbmFtZXNwYWNlIG1hcHBpbmcgdGFibGUgKGFkZGVkIHRvIHN0YWNrIGFueXdheSlcbiIsIG5zKSk7CisgIH0KKyAgZWxzZQorICB7IG5wLT5ucyA9IE5VTEw7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQdXNoIE9LICgnJXMnIG1hdGNoZXMgJyVzJyBpbiBuYW1lc3BhY2UgdGFibGUpXG4iLCBpZCwgcC0+aWQpKTsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfcG9wX25hbWVzcGFjZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wOworICB3aGlsZSAoc29hcC0+bmxpc3QgJiYgc29hcC0+bmxpc3QtPmxldmVsID49IHNvYXAtPmxldmVsKQorICB7IG5wID0gc29hcC0+bmxpc3QtPm5leHQ7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQb3BwZWQgbmFtZXNwYWNlIGJpbmRpbmcgKGxldmVsPSV1KSAnJXMnXG4iLCBzb2FwLT5sZXZlbCwgc29hcC0+bmxpc3QtPmlkKSk7CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPm5saXN0KTsKKyAgICBzb2FwLT5ubGlzdCA9IG5wOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfbWF0Y2hfbmFtZXNwYWNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZDEsIGNvbnN0IGNoYXIgKmlkMiwgaW50IG4xLCBpbnQgbjIpIAoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnAgPSBzb2FwLT5ubGlzdDsKKyAgd2hpbGUgKG5wICYmIChzdHJuY21wKG5wLT5pZCwgaWQxLCBuMSkgfHwgbnAtPmlkW24xXSkpCisgICAgbnAgPSBucC0+bmV4dDsKKyAgaWYgKG5wKQorICB7IGlmIChucC0+aW5kZXggPCAwCisgICAgIHx8IChzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW25wLT5pbmRleF0uaWQKKyAgICAgICYmIChzdHJuY21wKHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbbnAtPmluZGV4XS5pZCwgaWQyLCBuMikKKyAgICAgICB8fCBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW25wLT5pbmRleF0uaWRbbjJdKSkpCisgICAgICByZXR1cm4gU09BUF9OQU1FU1BBQ0U7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgaWYgKG4xID09IDMgJiYgbjEgPT0gbjIgJiYgIXN0cmNtcChpZDEsICJ4bWwiKSAmJiAhc3RyY21wKGlkMSwgaWQyKSkKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgcmV0dXJuIFNPQVBfU1lOVEFYX0VSUk9SOyAKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2N1cnJlbnRfbmFtZXNwYWNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucDsKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKKyAgbnAgPSBzb2FwLT5ubGlzdDsKKyAgaWYgKCEocyA9IHN0cmNocih0YWcsICc6JykpKQorICB7IHdoaWxlIChucCAmJiAqbnAtPmlkKSAvKiBmaW5kIGRlZmF1bHQgbmFtZXNwYWNlLCBpZiBwcmVzZW50ICovCisgICAgICBucCA9IG5wLT5uZXh0OworICB9CisgIGVsc2UKKyAgeyB3aGlsZSAobnAgJiYgKHN0cm5jbXAobnAtPmlkLCB0YWcsIHMgLSB0YWcpIHx8IG5wLT5pZFtzIC0gdGFnXSkpCisgICAgICBucCA9IG5wLT5uZXh0OworICAgIGlmICghbnApCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfTkFNRVNQQUNFOworICB9CisgIGlmIChucCkKKyAgeyBpZiAobnAtPmluZGV4ID49IDApCisgICAgICByZXR1cm4gc29hcC0+bmFtZXNwYWNlc1tucC0+aW5kZXhdLm5zOworICAgIGlmIChucC0+bnMpCisgICAgICByZXR1cm4gc29hcF9zdHJkdXAoc29hcCwgbnAtPm5zKTsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF90YWdfY21wKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKnQpCit7IGZvciAoOzspCisgIHsgcmVnaXN0ZXIgaW50IGMxID0gKnM7CisgICAgcmVnaXN0ZXIgaW50IGMyID0gKnQ7CisgICAgaWYgKCFjMSB8fCBjMSA9PSAnIicpCisgICAgICBicmVhazsKKyAgICBpZiAoYzIgIT0gJy0nKQorICAgIHsgaWYgKGMxICE9IGMyKQorICAgICAgeyBpZiAoYzEgPj0gJ0EnICYmIGMxIDw9ICdaJykKKyAgICAgICAgICBjMSArPSAnYScgLSAnQSc7CisgICAgICAgIGlmIChjMiA+PSAnQScgJiYgYzIgPD0gJ1onKQorICAgICAgICAgIGMyICs9ICdhJyAtICdBJzsKKyAgICAgIH0KKyAgICAgIGlmIChjMSAhPSBjMikKKyAgICAgIHsgaWYgKGMyICE9ICcqJykKKyAgICAgICAgICByZXR1cm4gMTsKKwljMiA9ICorK3Q7CisgICAgICAgIGlmICghYzIpCisJICByZXR1cm4gMDsKKyAgICAgICAgaWYgKGMyID49ICdBJyAmJiBjMiA8PSAnWicpCisgICAgICAgICAgYzIgKz0gJ2EnIC0gJ0EnOworICAgICAgICBmb3IgKDs7KQorICAgICAgICB7IGMxID0gKnM7CisJICBpZiAoIWMxIHx8IGMxID09ICciJykKKwkgICAgYnJlYWs7CisJICBpZiAoYzEgPj0gJ0EnICYmIGMxIDw9ICdaJykKKyAgICAgICAgICAgIGMxICs9ICdhJyAtICdBJzsKKyAgICAgICAgICBpZiAoYzEgPT0gYzIgJiYgIXNvYXBfdGFnX2NtcChzICsgMSwgdCArIDEpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisJICBzKys7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHMrKzsKKyAgICB0Kys7CisgIH0KKyAgaWYgKCp0ID09ICcqJyAmJiAhdFsxXSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuICp0OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX21hdGNoX3RhZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnMSwgY29uc3QgY2hhciAqdGFnMikKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqcywgKnQ7CisgIGlmICghdGFnMSB8fCAhdGFnMiB8fCAhKnRhZzIpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIHMgPSBzdHJjaHIodGFnMSwgJzonKTsKKyAgdCA9IHN0cmNocih0YWcyLCAnOicpOworICBpZiAodCkKKyAgeyBpZiAocykKKyAgICB7IGlmICh0WzFdICYmIFNPQVBfU1RSQ01QKHMgKyAxLCB0ICsgMSkpCisgICAgICAgIHJldHVybiBTT0FQX1RBR19NSVNNQVRDSDsKKyAgICAgIGlmICh0ICE9IHRhZzIgJiYgc29hcF9tYXRjaF9uYW1lc3BhY2Uoc29hcCwgdGFnMSwgdGFnMiwgcyAtIHRhZzEsIHQgLSB0YWcyKSkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJUYWdzICclcycgYW5kICclcycgbWF0Y2ggYnV0IG5hbWVzcGFjZXMgZGlmZmVyXG4iLCB0YWcxLCB0YWcyKSk7CisgICAgICAgIHJldHVybiBTT0FQX1RBR19NSVNNQVRDSDsKKyAgICAgIH0KKyAgICB9IAorICAgIGVsc2UgaWYgKFNPQVBfU1RSQ01QKHRhZzEsIHQgKyAxKSkKKyAgICAgIHJldHVybiBTT0FQX1RBR19NSVNNQVRDSDsKKyAgICBlbHNlIGlmICh0ICE9IHRhZzIgJiYgc29hcF9tYXRjaF9uYW1lc3BhY2Uoc29hcCwgdGFnMSwgdGFnMiwgMCwgdCAtIHRhZzIpKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJUYWdzICclcycgYW5kICclcycgbWF0Y2ggYnV0IG5hbWVzcGFjZXMgZGlmZmVyXG4iLCB0YWcxLCB0YWcyKSk7CisgICAgICByZXR1cm4gU09BUF9UQUdfTUlTTUFUQ0g7CisgICAgfQorICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVGFncyBhbmQgKGRlZmF1bHQpIG5hbWVzcGFjZXMgbWF0Y2g6ICclcycgJyVzJ1xuIiwgdGFnMSwgdGFnMikpOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIGlmIChzKQorICB7IGlmIChTT0FQX1NUUkNNUChzICsgMSwgdGFnMikpCisgICAgICByZXR1cm4gU09BUF9UQUdfTUlTTUFUQ0g7CisgIH0KKyAgZWxzZSBpZiAoU09BUF9TVFJDTVAodGFnMSwgdGFnMikpCisgICAgcmV0dXJuIFNPQVBfVEFHX01JU01BVENIOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlRhZ3MgbWF0Y2g6ICclcycgJyVzJ1xuIiwgdGFnMSwgdGFnMikpOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9tYXRjaF9hcnJheShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdHlwZSkKK3sgaWYgKCpzb2FwLT5hcnJheVR5cGUpCisgICAgaWYgKHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPmFycmF5VHlwZSwgdHlwZSkKKyAgICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+YXJyYXlUeXBlLCAieHNkOmFueVR5cGUiKQorICAgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT5hcnJheVR5cGUsICJ4c2Q6dXItdHlwZSIpCisgICAgKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJBcnJheSB0eXBlIG1pc21hdGNoOiAnJXMnICclcydcbiIsIHNvYXAtPmFycmF5VHlwZSwgdHlwZSkpOworICAgICAgcmV0dXJuIFNPQVBfVEFHX01JU01BVENIOworICAgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglTU0wKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgV0lUSF9PUEVOU1NMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yYW5kKCkKK3sgdW5zaWduZWQgY2hhciBidWZbNF07CisgIGlmICghc3NsX2luaXRfZG9uZSkKKyAgICBzb2FwX3NzbF9pbml0KCk7CisgIFJBTkRfcHNldWRvX2J5dGVzKGJ1ZiwgNCk7CisgIHJldHVybiAqKGludCopYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NzbF9zZXJ2ZXJfY29udGV4dChzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgc2hvcnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmtleWZpbGUsIGNvbnN0IGNoYXIgKnBhc3N3b3JkLCBjb25zdCBjaGFyICpjYWZpbGUsIGNvbnN0IGNoYXIgKmNhcGF0aCwgY29uc3QgY2hhciAqZGhmaWxlLCBjb25zdCBjaGFyICpyYW5kZmlsZSwgY29uc3QgY2hhciAqc2lkKQoreyBpbnQgZXJyOworICBzb2FwLT5rZXlmaWxlID0ga2V5ZmlsZTsKKyAgc29hcC0+cGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgc29hcC0+Y2FmaWxlID0gY2FmaWxlOworICBzb2FwLT5jYXBhdGggPSBjYXBhdGg7CisgIGlmIChkaGZpbGUpCisgIHsgc29hcC0+ZGhmaWxlID0gZGhmaWxlOworICAgIHNvYXAtPnJzYSA9IDA7CisgIH0KKyAgZWxzZQorICB7IHNvYXAtPmRoZmlsZSA9IE5VTEw7CisgICAgc29hcC0+cnNhID0gMTsKKyAgfQorICBzb2FwLT5yYW5kZmlsZSA9IHJhbmRmaWxlOworICBzb2FwLT5yZXF1aXJlX2NsaWVudF9hdXRoID0gKGZsYWdzICYgU09BUF9TU0xfUkVRVUlSRV9DTElFTlRfQVVUSEVOVElDQVRJT04pOworICBpZiAoIShlcnIgPSBzb2FwLT5mc3NsYXV0aChzb2FwKSkpCisgIHsgaWYgKHNpZCkKKyAgICAgIFNTTF9DVFhfc2V0X3Nlc3Npb25faWRfY29udGV4dChzb2FwLT5jdHgsICh1bnNpZ25lZCBjaGFyKilzaWQsIHN0cmxlbihzaWQpKTsKKyAgfQorICByZXR1cm4gZXJyOyAKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zc2xfY2xpZW50X2NvbnRleHQoc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIHNob3J0IGZsYWdzLCBjb25zdCBjaGFyICprZXlmaWxlLCBjb25zdCBjaGFyICpwYXNzd29yZCwgY29uc3QgY2hhciAqY2FmaWxlLCBjb25zdCBjaGFyICpjYXBhdGgsIGNvbnN0IGNoYXIgKnJhbmRmaWxlKQoreyBzb2FwLT5rZXlmaWxlID0ga2V5ZmlsZTsKKyAgc29hcC0+cGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgc29hcC0+Y2FmaWxlID0gY2FmaWxlOworICBzb2FwLT5jYXBhdGggPSBjYXBhdGg7CisgIHNvYXAtPmRoZmlsZSA9IE5VTEw7CisgIHNvYXAtPnJzYSA9IDA7CisgIHNvYXAtPnJhbmRmaWxlID0gcmFuZGZpbGU7CisgIHNvYXAtPnJlcXVpcmVfc2VydmVyX2F1dGggPSAoZmxhZ3MgJiBTT0FQX1NTTF9SRVFVSVJFX1NFUlZFUl9BVVRIRU5USUNBVElPTik7CisgIHJldHVybiBzb2FwLT5mc3NsYXV0aChzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc3NsX2luaXQoKQoreyAvKiBOb3RlOiBmb3IgTVQgc3lzdGVtcywgdGhlIG1haW4gcHJvZ3JhbSBNVVNUIGNhbGwgc29hcF9zc2xfaW5pdCgpIGJlZm9yZSBhbnkgdGhyZWFkcyBhcmUgc3RhcnRlZCAqLworICBpZiAoIXNzbF9pbml0X2RvbmUpCisgIHsgc3NsX2luaXRfZG9uZSA9IDE7CisgICAgU1NMX2xpYnJhcnlfaW5pdCgpOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBTU0xfbG9hZF9lcnJvcl9zdHJpbmdzKCk7CisjZW5kaWYKKyAgICBpZiAoIVJBTkRfbG9hZF9maWxlKCIvZGV2L3VyYW5kb20iLCAxMDI0KSkKKyAgICB7IGNoYXIgYnVmWzEwMjRdOworICAgICAgUkFORF9zZWVkKGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgICAgd2hpbGUgKCFSQU5EX3N0YXR1cygpKQorICAgICAgeyBpbnQgciA9IHJhbmQoKTsKKyAgICAgICAgUkFORF9zZWVkKCZyLCBzaXplb2YoaW50KSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY29uc3QgY2hhciAqCitzc2xfZXJyb3Ioc3RydWN0IHNvYXAgKnNvYXAsIGludCByZXQpCit7IGludCBlcnIgPSBTU0xfZ2V0X2Vycm9yKHNvYXAtPnNzbCwgcmV0KTsKKyAgY29uc3QgY2hhciAqbXNnID0gc29hcF9zdHJfY29kZShoX3NzbF9lcnJvcl9jb2RlcywgZXJyKTsKKyAgaWYgKG1zZykKKyAgICBzdHJjcHkoc29hcC0+bXNnYnVmLCBtc2cpOworICBlbHNlCisgICAgcmV0dXJuIEVSUl9lcnJvcl9zdHJpbmcoZXJyLCBzb2FwLT5tc2didWYpOworICBpZiAoRVJSX3BlZWtfZXJyb3IoKSkKKyAgeyB1bnNpZ25lZCBsb25nIHI7CisgICAgc3RyY2F0KHNvYXAtPm1zZ2J1ZiwgIlxuIik7CisgICAgd2hpbGUgKChyID0gRVJSX2dldF9lcnJvcigpKSkKKyAgICAgIEVSUl9lcnJvcl9zdHJpbmdfbihyLCBzb2FwLT5tc2didWYgKyBzdHJsZW4oc29hcC0+bXNnYnVmKSwgc2l6ZW9mKHNvYXAtPm1zZ2J1ZikgLSBzdHJsZW4oc29hcC0+bXNnYnVmKSk7CisgIH0gCisgIGVsc2UKKyAgeyBzd2l0Y2ggKHJldCkKKyAgICB7IGNhc2UgMDoKKyAgICAgICAgc3RyY3B5KHNvYXAtPm1zZ2J1ZiwgIkVPRiB3YXMgb2JzZXJ2ZWQgdGhhdCB2aW9sYXRlcyB0aGUgcHJvdG9jb2wuIFRoZSBjbGllbnQgcHJvYmFibHkgcHJvdmlkZWQgaW52YWxpZCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbi4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIC0xOgorICAgICAgICBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIkVycm9yIG9ic2VydmVkIGJ5IHVuZGVybHlpbmcgQklPOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7ICAKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5tc2didWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzc2xfcGFzc3dvcmQoY2hhciAqYnVmLCBpbnQgbnVtLCBpbnQgcndmbGFnLCB2b2lkICp1c2VyZGF0YSkKK3sgaWYgKG51bSA8IChpbnQpc3RybGVuKChjaGFyKil1c2VyZGF0YSkgKyAxKQorICAgIHJldHVybiAwOworICByZXR1cm4gc3RybGVuKHN0cmNweShidWYsIChjaGFyKil1c2VyZGF0YSkpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUaGlzIGNhbGxiYWNrIGlzIGluY2x1ZGVkIGZvciBmdXR1cmUgcmVmZXJlbmNlcy4gSXQgc2hvdWxkIG5vdCBiZSBkZWxldGVkCisjaWZuZGVmIFBBTE1fMgorc3RhdGljIERIICoKK3NzbF90bXBfZGgoU1NMICpzc2wsIGludCBpc19leHBvcnQsIGludCBrZXlsZW5ndGgpCit7IHN0YXRpYyBESCAqZGg1MTIgPSBOVUxMOworICBzdGF0aWMgREggKmRoMTAyNCA9IE5VTEw7CisgIERIICpkaDsKKyAgc3dpdGNoIChrZXlsZW5ndGgpCisgIHsgY2FzZSA1MTI6CisgICAgICBpZiAoIWRoNTEyKQorICAgICAgeyBCSU8gKmJpbyA9IEJJT19uZXdfZmlsZSgiZGg1MTIucGVtIiwgInIiKTsKKyAgICAgICAgaWYgKGJpbykKKyAgICAgICAgeyBkaDUxMiA9IFBFTV9yZWFkX2Jpb19ESHBhcmFtcyhiaW8sIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgICAgIEJJT19mcmVlKGJpbyk7CisgICAgICAgICAgcmV0dXJuIGRoNTEyOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBkaDUxMjsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKCFkaDEwMjQpCisgICAgICB7IEJJTyAqYmlvID0gQklPX25ld19maWxlKCJkaDEwMjQucGVtIiwgInIiKTsKKyAgICAgICAgaWYgKGJpbykKKyAgICAgICAgeyBkaDEwMjQgPSBQRU1fcmVhZF9iaW9fREhwYXJhbXMoYmlvLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICBCSU9fZnJlZShiaW8pOworICAgICAgICB9CisgICAgICB9CisgICAgICBkaCA9IGRoMTAyNDsKKyAgfQorICByZXR1cm4gZGg7Cit9CisjZW5kaWYKKyovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc3NsX2F1dGhfaW5pdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKCFzc2xfaW5pdF9kb25lKQorICAgIHNvYXBfc3NsX2luaXQoKTsKKyAgaWYgKCFzb2FwLT5jdHgpCisgIHsgaWYgKCEoc29hcC0+Y3R4ID0gU1NMX0NUWF9uZXcoU1NMdjIzX21ldGhvZCgpKSkpCisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCBzZXR1cCBjb250ZXh0IiwgU09BUF9TU0xfRVJST1IpOworICB9CisgIGlmIChzb2FwLT5yYW5kZmlsZSkKKyAgeyBpZiAoIVJBTkRfbG9hZF9maWxlKHNvYXAtPnJhbmRmaWxlLCAtMSkpCisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCBsb2FkIHJhbmRvbW5lc3MiLCBTT0FQX1NTTF9FUlJPUik7CisgIH0KKyAgaWYgKHNvYXAtPmNhZmlsZSB8fCBzb2FwLT5jYXBhdGgpCisgIHsgaWYgKCFTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhzb2FwLT5jdHgsIHNvYXAtPmNhZmlsZSwgc29hcC0+Y2FwYXRoKSkKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHJlYWQgQ0EgZmlsZSBhbmQgZGlyZWN0b3J5IiwgU09BUF9TU0xfRVJST1IpOworICAgIGlmIChzb2FwLT5jYWZpbGUgJiYgc29hcC0+cmVxdWlyZV9jbGllbnRfYXV0aCkKKyAgICAgIFNTTF9DVFhfc2V0X2NsaWVudF9DQV9saXN0KHNvYXAtPmN0eCwgU1NMX2xvYWRfY2xpZW50X0NBX2ZpbGUoc29hcC0+Y2FmaWxlKSk7CisgIH0KKyAgaWYgKCFTU0xfQ1RYX3NldF9kZWZhdWx0X3ZlcmlmeV9wYXRocyhzb2FwLT5jdHgpKQorICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHJlYWQgZGVmYXVsdCBDQSBmaWxlIGFuZC9vciBkaXJlY3RvcnkiLCBTT0FQX1NTTF9FUlJPUik7CisvKiBTZWUgYmVsb3cgKi8KKyAgaWYgKHNvYXAtPmtleWZpbGUpCisgIHsgaWYgKCFTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKHNvYXAtPmN0eCwgc29hcC0+a2V5ZmlsZSkpCisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCByZWFkIGNlcnRpZmljYXRlIGtleSBmaWxlIiwgU09BUF9TU0xfRVJST1IpOworICAgIGlmIChzb2FwLT5wYXNzd29yZCkKKyAgICB7IFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiX3VzZXJkYXRhKHNvYXAtPmN0eCwgKHZvaWQqKXNvYXAtPnBhc3N3b3JkKTsKKyAgICAgIFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiKHNvYXAtPmN0eCwgc3NsX3Bhc3N3b3JkKTsKKyAgICB9CisgICAgaWYgKCFTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X2ZpbGUoc29hcC0+Y3R4LCBzb2FwLT5rZXlmaWxlLCBTU0xfRklMRVRZUEVfUEVNKSkKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHJlYWQga2V5IGZpbGUiLCBTT0FQX1NTTF9FUlJPUik7CisgIH0KKy8qIFN1Z2dlc3RlZCBhbHRlcm5hdGl2ZSBhcHByb2FjaCB0byBjaGVjayBjYWZpbGUgZmlyc3QgYmVmb3JlIHRoZSBrZXkgZmlsZToKKyAgaWYgKHNvYXAtPnBhc3N3b3JkKQorICB7IFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiX3VzZXJkYXRhKHNvYXAtPmN0eCwgKHZvaWQqKXNvYXAtPnBhc3N3b3JkKTsKKyAgICBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYihzb2FwLT5jdHgsIHNzbF9wYXNzd29yZCk7CisgIH0KKyAgaWYgKCFzb2FwLT5jYWZpbGUgfHwgIVNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoc29hcC0+Y3R4LCBzb2FwLT5jYWZpbGUpKQorICB7IGlmIChzb2FwLT5rZXlmaWxlKQorICAgIHsgaWYgKCFTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKHNvYXAtPmN0eCwgc29hcC0+a2V5ZmlsZSkpCisgICAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHJlYWQgY2VydGlmaWNhdGUgb3Iga2V5IGZpbGUiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgICBpZiAoIVNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfZmlsZShzb2FwLT5jdHgsIHNvYXAtPmtleWZpbGUsIFNTTF9GSUxFVFlQRV9QRU0pKQorICAgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCByZWFkIGtleSBmaWxlIiwgU09BUF9TU0xfRVJST1IpOworICAgIH0KKyAgfQorKi8KKyAgaWYgKHNvYXAtPnJzYSkKKyAgeyBSU0EgKnJzYSA9IFJTQV9nZW5lcmF0ZV9rZXkoMTAyNCwgUlNBX0Y0LCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoIVNTTF9DVFhfc2V0X3RtcF9yc2Eoc29hcC0+Y3R4LCByc2EpKQorICAgIHsgaWYgKHJzYSkKKyAgICAgICAgUlNBX2ZyZWUocnNhKTsKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHNldCBSU0Ega2V5IiwgU09BUF9TU0xfRVJST1IpOworICAgIH0KKyAgICBSU0FfZnJlZShyc2EpOworICB9CisgIGVsc2UgaWYgKHNvYXAtPmRoZmlsZSkKKyAgeyBESCAqZGggPSAwOworICAgIEJJTyAqYmlvOworICAgIGJpbyA9IEJJT19uZXdfZmlsZShzb2FwLT5kaGZpbGUsICJyIik7CisgICAgaWYgKCFiaW8pCisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCByZWFkIERIIGZpbGUiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgZGggPSBQRU1fcmVhZF9iaW9fREhwYXJhbXMoYmlvLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBCSU9fZnJlZShiaW8pOworICAgIGlmIChTU0xfQ1RYX3NldF90bXBfZGgoc29hcC0+Y3R4LCBkaCkgPCAwKQorICAgIHsgaWYgKGRoKQorICAgICAgICBESF9mcmVlKGRoKTsKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHNldCBESCBwYXJhbWV0ZXJzIiwgU09BUF9TU0xfRVJST1IpOworICAgIH0KKyAgICBESF9mcmVlKGRoKTsKKyAgfQorICBTU0xfQ1RYX3NldF9vcHRpb25zKHNvYXAtPmN0eCwgU1NMX09QX0FMTCB8IFNTTF9PUF9OT19TU0x2Mik7CisgIFNTTF9DVFhfc2V0X3ZlcmlmeShzb2FwLT5jdHgsIHNvYXAtPnJlcXVpcmVfY2xpZW50X2F1dGggPyAoU1NMX1ZFUklGWV9QRUVSIHwgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCkgOiBzb2FwLT5yZXF1aXJlX3NlcnZlcl9hdXRoID8gU1NMX1ZFUklGWV9QRUVSIDogU1NMX1ZFUklGWV9OT05FLCBzb2FwLT5mc3NsdmVyaWZ5KTsKKyNpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA8IDB4MDA5MDUxMDBMKQorICBTU0xfQ1RYX3NldF92ZXJpZnlfZGVwdGgoc29hcC0+Y3R4LCAxKTsgCisjZWxzZQorICBTU0xfQ1RYX3NldF92ZXJpZnlfZGVwdGgoc29hcC0+Y3R4LCA5KTsgCisjZW5kaWYgIAorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NzbF92ZXJpZnlfY2FsbGJhY2soaW50IG9rLCBYNTA5X1NUT1JFX0NUWCAqc3RvcmUpCit7CisjaWZkZWYgU09BUF9ERUJVRworICBpZiAoIW9rKSAKKyAgeyBjaGFyIGRhdGFbMjU2XTsKKyAgICBYNTA5ICpjZXJ0ID0gWDUwOV9TVE9SRV9DVFhfZ2V0X2N1cnJlbnRfY2VydChzdG9yZSk7CisgICAgZnByaW50ZihzdGRlcnIsICJTU0wgdmVyaWZ5IGVycm9yIG9yIHdhcm5pbmcgd2l0aCBjZXJ0aWZpY2F0ZSBhdCBkZXB0aCAlZDogJXNcbiIsIFg1MDlfU1RPUkVfQ1RYX2dldF9lcnJvcl9kZXB0aChzdG9yZSksIFg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKFg1MDlfU1RPUkVfQ1RYX2dldF9lcnJvcihzdG9yZSkpKTsKKyAgICBYNTA5X05BTUVfb25lbGluZShYNTA5X2dldF9pc3N1ZXJfbmFtZShjZXJ0KSwgZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImNlcnRpZmljYXRlIGlzc3VlciAlc1xuIiwgZGF0YSk7CisgICAgWDUwOV9OQU1FX29uZWxpbmUoWDUwOV9nZXRfc3ViamVjdF9uYW1lKGNlcnQpLCBkYXRhLCBzaXplb2YoZGF0YSkpOworICAgIGZwcmludGYoc3RkZXJyLCAiY2VydGlmaWNhdGUgc3ViamVjdCAlc1xuIiwgZGF0YSk7CisgIH0KKyNlbmRpZgorICAvKiBOb3RlOiByZXR1cm4gMSB0byBjb250aW51ZSwgYnV0IHVuc2FmZSBwcm9ncmVzcyB3aWxsIGJlIHRlcm1pbmF0ZWQgYnkgU1NMICovCisgIHJldHVybiBvazsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zc2xfYWNjZXB0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBCSU8gKmJpbzsKKyAgaW50IGksIHI7CisgIGlmICghc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJObyBzb2NrZXQgaW4gc29hcF9zc2xfYWNjZXB0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgIGlmICghc29hcC0+Y3R4ICYmIChzb2FwLT5lcnJvciA9IHNvYXAtPmZzc2xhdXRoKHNvYXApKSkKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgaWYgKCFzb2FwLT5zc2wpCisgIHsgc29hcC0+c3NsID0gU1NMX25ldyhzb2FwLT5jdHgpOworICAgIGlmICghc29hcC0+c3NsKQorICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiU1NMX25ldygpIGZhaWxlZCBpbiBzb2FwX3NzbF9hY2NlcHQoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgfQorICBlbHNlCisgICAgU1NMX2NsZWFyKHNvYXAtPnNzbCk7CisgIHNvYXAtPmltb2RlIHw9IFNPQVBfRU5DX1NTTDsKKyAgc29hcC0+b21vZGUgfD0gU09BUF9FTkNfU1NMOworI2lmIGRlZmluZWQoV0lOMzIpCisgIHsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGSU9OQklPLCAmbm9uYmxvY2tpbmcpOworICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgIHsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICBpb2N0bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGSU9OQklPLCAoaW50KSZub25ibG9ja2luZyk7CisgIH0KKyNlbHNlCisgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfR0VURkwpfE9fTk9OQkxPQ0spOworI2VuZGlmCisgIGJpbyA9IEJJT19uZXdfc29ja2V0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEJJT19OT0NMT1NFKTsKKyAgU1NMX3NldF9iaW8oc29hcC0+c3NsLCBiaW8sIGJpbyk7CisgIGkgPSAxMDA7IC8qIDEwMCAqIDAuMSBtcyByZXRyaWVzICovCisgIHdoaWxlICgociA9IFNTTF9hY2NlcHQoc29hcC0+c3NsKSkgPD0gMCkKKyAgeyBpbnQgZXJyID0gU1NMX2dldF9lcnJvcihzb2FwLT5zc2wsIHIpOworICAgIGlmIChlcnIgPT0gU1NMX0VSUk9SX1dBTlRfUkVBRCB8fCBlcnIgPT0gU1NMX0VSUk9SX1dBTlRfV1JJVEUpCisgICAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgICAgZmRfc2V0IGZkOworICAgICAgaWYgKGktLSA8PSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHRpbWVvdXQudHZfc2VjID0gMDsKKyAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDEwMDAwMDsKKyAgICAgIEZEX1pFUk8oJmZkKTsKKyAgICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmZmQpOworICAgICAgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCAmZmQsIE5VTEwsICZmZCwgJnRpbWVvdXQpOworICAgICAgaWYgKHIgPCAwICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIpCisgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICByZXR1cm4gU09BUF9FT0Y7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7IHNvYXAtPmVycm51bSA9IGVycjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorI2lmIGRlZmluZWQoV0lOMzIpCisgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGSU9OQklPLCAmYmxvY2tpbmcpOworICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICBpb2N0bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGSU9OQklPLCAoaW50KSZibG9ja2luZyk7CisgIH0KKyNlbHNlCisgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfR0VURkwpJn5PX05PTkJMT0NLKTsKKyNlbmRpZgorICBpZiAociA8PSAwKQorICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHNzbF9lcnJvcihzb2FwLCByKSwgIlNTTF9hY2NlcHQoKSBmYWlsZWQgaW4gc29hcF9zc2xfYWNjZXB0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgcmV0dXJuIFNPQVBfU1NMX0VSUk9SOworICB9CisgIGlmIChzb2FwLT5yZXF1aXJlX2NsaWVudF9hdXRoKQorICB7IFg1MDkgKnBlZXI7CisgICAgaW50IGVycjsKKyAgICBpZiAoKGVyciA9IFNTTF9nZXRfdmVyaWZ5X3Jlc3VsdChzb2FwLT5zc2wpKSAhPSBYNTA5X1ZfT0spCisgICAgeyBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgIHJldHVybiBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgWDUwOV92ZXJpZnlfY2VydF9lcnJvcl9zdHJpbmcoZXJyKSwgIlNTTCBjZXJ0aWZpY2F0ZSBwcmVzZW50ZWQgYnkgcGVlciBjYW5ub3QgYmUgdmVyaWZpZWQgaW4gc29hcF9zc2xfYWNjZXB0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgfQorICAgIHBlZXIgPSBTU0xfZ2V0X3BlZXJfY2VydGlmaWNhdGUoc29hcC0+c3NsKTsKKyAgICBpZiAoIXBlZXIpCisgICAgeyBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgIHJldHVybiBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJObyBTU0wgY2VydGlmaWNhdGUgd2FzIHByZXNlbnRlZCBieSB0aGUgcGVlciBpbiBzb2FwX3NzbF9hY2NlcHQoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICB9CisgICAgWDUwOV9mcmVlKHBlZXIpOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZW5kaWYgLyogV0lUSF9PUEVOU1NMICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3RjcF9pbml0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5lcnJtb2RlID0gMTsKKyNpZmRlZiBXSU4zMgorICBpZiAodGNwX2RvbmUpCisgICAgcmV0dXJuIDA7CisgIGVsc2UKKyAgeyBXU0FEQVRBIHc7CisgICAgaWYgKFdTQVN0YXJ0dXAoTUFLRVdPUkQoMSwgMSksICZ3KSkKKyAgICAgIHJldHVybiAtMTsKKyAgICB0Y3BfZG9uZSA9IDE7CisgIH0KKyNlbmRpZgorICByZXR1cm4gMDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9kb25lKHN0cnVjdCBzb2FwICpzb2FwKQoreyAKKyNpZmRlZiBTT0FQX0RFQlVHCisgIGludCBpOworI2VuZGlmCisgIGlmIChzb2FwX2NoZWNrX3N0YXRlKHNvYXApKQorICAgIHJldHVybjsKKyAgc29hcF9mcmVlKHNvYXApOworICB3aGlsZSAoc29hcC0+Y2xpc3QpCisgIHsgc3RydWN0IHNvYXBfY2xpc3QgKnAgPSBzb2FwLT5jbGlzdC0+bmV4dDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+Y2xpc3QpOworICAgIHNvYXAtPmNsaXN0ID0gcDsKKyAgfQorICBzb2FwLT5rZWVwX2FsaXZlID0gMDsgLyogdG8gZm9yY2UgY2xvc2UgdGhlIHNvY2tldCAqLworICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyNpZmRlZiBXSVRIX0NPT0tJRVMKKyAgc29hcF9mcmVlX2Nvb2tpZXMoc29hcCk7CisjZW5kaWYKKyAgd2hpbGUgKHNvYXAtPnBsdWdpbnMpCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGx1Z2luICpwID0gc29hcC0+cGx1Z2lucy0+bmV4dDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlbW92aW5nIHBsdWdpbiAnJXMnXG4iLCBzb2FwLT5wbHVnaW5zLT5pZCkpOworICAgIGlmIChzb2FwLT5wbHVnaW5zLT5mY29weSB8fCBzb2FwLT5zdGF0ZSA9PSBTT0FQX0lOSVQpCisgICAgICBzb2FwLT5wbHVnaW5zLT5mZGVsZXRlKHNvYXAsIHNvYXAtPnBsdWdpbnMpOworICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5wbHVnaW5zKTsKKyAgICBzb2FwLT5wbHVnaW5zID0gcDsKKyAgfQorICBzb2FwLT5mcGx1Z2luID0gZnBsdWdpbjsKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyAgc29hcC0+ZnBvc3QgPSBodHRwX3Bvc3Q7CisgIHNvYXAtPmZnZXQgPSBodHRwX2dldDsKKyAgc29hcC0+ZmZvcm0gPSBOVUxMOworICBzb2FwLT5mcG9zdGhkciA9IGh0dHBfcG9zdF9oZWFkZXI7CisgIHNvYXAtPmZyZXNwb25zZSA9IGh0dHBfcmVzcG9uc2U7CisgIHNvYXAtPmZwYXJzZSA9IGh0dHBfcGFyc2U7CisgIHNvYXAtPmZwYXJzZWhkciA9IGh0dHBfcGFyc2VfaGVhZGVyOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0lQVjYKKyAgc29hcC0+ZnJlc29sdmUgPSB0Y3BfZ2V0aG9zdDsKKyNlbHNlCisgIHNvYXAtPmZyZXNvbHZlID0gTlVMTDsKKyNlbmRpZgorICBzb2FwLT5mYWNjZXB0ID0gdGNwX2FjY2VwdDsKKyAgc29hcC0+Zm9wZW4gPSB0Y3BfY29ubmVjdDsKKyAgc29hcC0+ZmNsb3NlID0gdGNwX2Rpc2Nvbm5lY3Q7CisgIHNvYXAtPmZjbG9zZXNvY2tldCA9IHRjcF9jbG9zZXNvY2tldDsKKyAgc29hcC0+ZnNodXRkb3duc29ja2V0ID0gdGNwX3NodXRkb3duc29ja2V0OworICBzb2FwLT5mc2VuZCA9IGZzZW5kOworICBzb2FwLT5mcmVjdiA9IGZyZWN2OworICBzb2FwLT5mcG9sbCA9IHNvYXBfcG9sbDsKKyNlbHNlCisgIHNvYXAtPmZvcGVuID0gTlVMTDsKKyAgc29hcC0+ZmNsb3NlID0gTlVMTDsKKyAgc29hcC0+ZnBvbGwgPSBOVUxMOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXAtPmZwcmVwYXJlaW5pdCA9IE5VTEw7CisgIHNvYXAtPmZwcmVwYXJlc2VuZCA9IE5VTEw7CisgIHNvYXAtPmZwcmVwYXJlcmVjdiA9IE5VTEw7CisgIHNvYXAtPmZwcmVwYXJlZmluYWwgPSBOVUxMOworI2VuZGlmCisgIHNvYXAtPmZzZXRlcnJvciA9IE5VTEw7CisgIHNvYXAtPmZpZ25vcmUgPSBOVUxMOworICBzb2FwLT5mc2VydmVsb29wID0gTlVMTDsKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgaWYgKHNvYXAtPnNlc3Npb24pCisgIHsgU1NMX1NFU1NJT05fZnJlZShzb2FwLT5zZXNzaW9uKTsKKyAgICBzb2FwLT5zZXNzaW9uID0gTlVMTDsKKyAgfQorI2VuZGlmCisgIGlmIChzb2FwLT5zdGF0ZSA9PSBTT0FQX0lOSVQpCisgIHsgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikpCisgICAgeyBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKXNvYXAtPm1hc3Rlcik7CisgICAgICBzb2FwLT5tYXN0ZXIgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICAgIH0KKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICBpZiAoc29hcC0+Y3R4KQorICAgIHsgU1NMX0NUWF9mcmVlKHNvYXAtPmN0eCk7CisgICAgICBzb2FwLT5jdHggPSBOVUxMOworICAgIH0KKyNlbmRpZgorICB9CisjaWZkZWYgU09BUF9ERUJVRworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWUgbG9nZmlsZXNcbiIpKTsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfTUFYTE9HUzsgaSsrKQorICB7IGlmIChzb2FwLT5sb2dmaWxlW2ldKQorICAgIHsgU09BUF9GUkVFKHNvYXAsICh2b2lkKilzb2FwLT5sb2dmaWxlW2ldKTsKKyAgICAgIHNvYXAtPmxvZ2ZpbGVbaV0gPSBOVUxMOworICAgIH0KKyAgICBzb2FwX2Nsb3NlX2xvZ2ZpbGUoc29hcCwgaSk7CisgIH0KKyAgc29hcF9mcmVlX21odChzb2FwKTsKKyAgc29hcC0+c3RhdGUgPSAwOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9jbGVhbnVwKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwX2RvbmUoc29hcCk7CisjaWZkZWYgV0lOMzIKKyAgaWYgKCF0Y3BfZG9uZSkKKyAgICByZXR1cm47CisgIHRjcF9kb25lID0gMDsKKyAgV1NBQ2xlYW51cCgpOworI2VuZGlmCit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY29uc3QgY2hhcioKK3RjcF9lcnJvcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqbXNnID0gTlVMTDsKKyAgc3dpdGNoIChzb2FwLT5lcnJtb2RlKQorICB7IGNhc2UgMDoKKyAgICAgIG1zZyA9IHNvYXBfc3RyZXJyb3Ioc29hcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICBtc2cgPSAiV1NBU3RhcnR1cCBmYWlsZWQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgIHsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICBtc2cgPSBzb2FwX3N0cl9jb2RlKGhfZXJyb3JfY29kZXMsIHNvYXAtPmVycm51bSk7CisgICAgICBpZiAoIW1zZykKKyNlbmRpZgorICAgICAgeyBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIlRDUC9VRFAgSVAgZXJyb3IgJWQiLCBzb2FwLT5lcnJudW0pOworICAgICAgICBtc2cgPSBzb2FwLT5tc2didWY7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBtc2c7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBjb25zdCBjaGFyKgoraHR0cF9lcnJvcihzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0YXR1cykKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqbXNnID0gU09BUF9TVFJfRU9TOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgbXNnID0gc29hcF9zdHJfY29kZShoX2h0dHBfZXJyb3JfY29kZXMsIHN0YXR1cyk7CisgIGlmICghbXNnKQorICAgIG1zZyA9IFNPQVBfU1RSX0VPUzsKKyNlbmRpZgorICByZXR1cm4gbXNnOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9JUFY2CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3RjcF9nZXRob3N0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICphZGRyLCBzdHJ1Y3QgaW5fYWRkciAqaW5hZGRyKQoreyBzb2FwX2ludDMyIGlhZGQgPSAtMTsKKyAgc3RydWN0IGhvc3RlbnQgaG9zdGVudCwgKmhvc3QgPSAmaG9zdGVudDsKKyNpZmRlZiBWWFdPUktTCisgIGludCBob3N0aW50OworICAvKiBpbmV0X2FkZHIoKSwgYW5kIGhvc3RHZXRCeU5hbWUoKSBleHBlY3QgImNoYXIgKiI7IGFkZHIgaXMgYSAiY29uc3QgY2hhciAqIi4gKi8KKyAgaWFkZCA9IGluZXRfYWRkcigoY2hhciopYWRkcik7CisjZWxzZQorI2lmIGRlZmluZWQoX0FJWFZFUlNJT05fNDMxKSB8fCBkZWZpbmVkKFRSVTY0KQorICBzdHJ1Y3QgaG9zdGVudF9kYXRhIGh0X2RhdGE7CisjZW5kaWYKKyNpZmRlZiBBUzQwMAorICBpYWRkID0gaW5ldF9hZGRyKCh2b2lkKilhZGRyKTsKKyNlbHNlCisgIGlhZGQgPSBpbmV0X2FkZHIoYWRkcik7CisjZW5kaWYKKyNlbmRpZgorICBpZiAoaWFkZCAhPSAtMSkKKyAgeyBtZW1jcHkoaW5hZGRyLCAmaWFkZCwgc2l6ZW9mKGlhZGQpKTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2lmIGRlZmluZWQoX19HTElCQ19fKQorICBpZiAoZ2V0aG9zdGJ5bmFtZV9yKGFkZHIsICZob3N0ZW50LCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOLCAmaG9zdCwgJnNvYXAtPmVycm51bSkgPCAwKQorICAgIGhvc3QgPSBOVUxMOworI2VsaWYgZGVmaW5lZChfQUlYVkVSU0lPTl80MzEpIHx8IGRlZmluZWQoVFJVNjQpCisgIG1lbXNldCgodm9pZCopJmh0X2RhdGEsIDAsIHNpemVvZihodF9kYXRhKSk7CisgIGlmIChnZXRob3N0YnluYW1lX3IoYWRkciwgJmhvc3RlbnQsICZodF9kYXRhKSA8IDApCisgIHsgaG9zdCA9IE5VTEw7CisgICAgc29hcC0+ZXJybnVtID0gaF9lcnJubzsKKyAgfQorI2VsaWYgZGVmaW5lZChIQVZFX0dFVEhPU1RCWU5BTUVfUikKKyAgaG9zdCA9IGdldGhvc3RieW5hbWVfcihhZGRyLCAmaG9zdGVudCwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTiwgJnNvYXAtPmVycm51bSk7CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgIC8qIElmIHRoZSBETlMgcmVzb2x2ZXIgbGlicmFyeSByZXNvbHZMaWIgaGFzIGJlZW4gY29uZmlndXJlZCBpbiB0aGUgdnhXb3JrcworICAgKiBpbWFnZSwgYSBxdWVyeSBmb3IgdGhlIGhvc3QgSVAgYWRkcmVzcyBpcyBzZW50IHRvIHRoZSBETlMgc2VydmVyLCBpZiB0aGUKKyAgICogbmFtZSB3YXMgbm90IGZvdW5kIGluIHRoZSBsb2NhbCBob3N0IHRhYmxlLiAqLworICBob3N0aW50ID0gaG9zdEdldEJ5TmFtZSgoY2hhciopYWRkcik7CisgIGlmIChob3N0aW50ID09IEVSUk9SKQorICB7IGhvc3QgPSBOVUxMOworICAgIHNvYXAtPmVycm51bSA9IHNvYXBfZXJybm87IAorICB9CisjZWxzZQorI2lmZGVmIEFTNDAwCisgIGlmICghKGhvc3QgPSBnZXRob3N0YnluYW1lKCh2b2lkKilhZGRyKSkpCisgICAgc29hcC0+ZXJybnVtID0gaF9lcnJubzsKKyNlbHNlCisgIGlmICghKGhvc3QgPSBnZXRob3N0YnluYW1lKGFkZHIpKSkKKyAgICBzb2FwLT5lcnJudW0gPSBoX2Vycm5vOworI2VuZGlmCisjZW5kaWYKKyAgaWYgKCFob3N0KQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSG9zdCBuYW1lIG5vdCBmb3VuZFxuIikpOworICAgIHJldHVybiBTT0FQX0VSUjsKKyAgfQorI2lmZGVmIFZYV09SS1MKKyAgaW5hZGRyLT5zX2FkZHIgPSBob3N0aW50OworI2Vsc2UKKyAgbWVtY3B5KGluYWRkciwgaG9zdC0+aF9hZGRyLCBob3N0LT5oX2xlbmd0aCk7CisjZW5kaWYKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3RjcF9jb25uZWN0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICplbmRwb2ludCwgY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQpCit7CisjaWZkZWYgV0lUSF9JUFY2CisgIHN0cnVjdCBhZGRyaW5mbyBoaW50cywgKnJlcywgKnJlc3NhdmU7CisgIGludCBlcnI7CisjZW5kaWYKKyAgcmVnaXN0ZXIgaW50IGZkOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaW50IGxlbiA9IFNPQVBfQlVGTEVOOworICBpbnQgc2V0ID0gMTsKKyNlbmRpZgorICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCk7CisgIHNvYXAtPnNvY2tldCA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIGlmICh0Y3BfaW5pdChzb2FwKSkKKyAgeyBzb2FwLT5lcnJudW0gPSAwOworICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJUQ1AgaW5pdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBzb2FwLT5lcnJtb2RlID0gMDsKKyNpZmRlZiBXSVRIX0lQVjYKKyAgbWVtc2V0KCh2b2lkKikmaGludHMsIDAsIHNpemVvZihoaW50cykpOworICBoaW50cy5haV9mYW1pbHkgPSBQRl9VTlNQRUM7CisjaWZkZWYgV0lUSF9VRFAKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfREdSQU07CisgIGVsc2UKKyNlbmRpZgorICAgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisgIHNvYXAtPmVycm1vZGUgPSAyOworICBpZiAoc29hcC0+cHJveHlfaG9zdCkKKyAgICBlcnIgPSBnZXRhZGRyaW5mbyhzb2FwLT5wcm94eV9ob3N0LCBzb2FwX2ludDJzKHNvYXAsIHNvYXAtPnByb3h5X3BvcnQpLCAmaGludHMsICZyZXMpOworICBlbHNlCisgICAgZXJyID0gZ2V0YWRkcmluZm8oaG9zdCwgc29hcF9pbnQycyhzb2FwLCBwb3J0KSwgJmhpbnRzLCAmcmVzKTsKKyAgaWYgKGVycikKKyAgeyBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgZ2FpX3N0cmVycm9yKGVyciksICJnZXRhZGRyaW5mbyBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICByZXNzYXZlID0gcmVzOworYWdhaW46CisgIGZkID0gKGludClzb2NrZXQocmVzLT5haV9mYW1pbHksIHJlcy0+YWlfc29ja3R5cGUsIHJlcy0+YWlfcHJvdG9jb2wpOworICBzb2FwLT5lcnJtb2RlID0gMDsKKyNlbHNlCisjaWZkZWYgV0lUSF9VRFAKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICBmZCA9IChpbnQpc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworICBlbHNlCisjZW5kaWYKKyAgICBmZCA9IChpbnQpc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKyNlbmRpZgorICBpZiAoZmQgPCAwKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzb2NrZXQgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNpZmRlZiBTT0NLRVRfQ0xPU0VfT05fRVhFQworI2lmZGVmIFdJTjMyCisjaWZuZGVmIFVOREVSX0NFCisgIFNldEhhbmRsZUluZm9ybWF0aW9uKChIQU5ETEUpZmQsIEhBTkRMRV9GTEFHX0lOSEVSSVQsIDApOworI2VuZGlmCisjZWxzZQorICBmY250bChmZCwgRl9TRVRGRCwgMSk7CisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPmNvbm5lY3RfZmxhZ3MgJiBTT19MSU5HRVIpCisgIHsgc3RydWN0IGxpbmdlciBsaW5nZXI7CisgICAgbWVtc2V0KCh2b2lkKikmbGluZ2VyLCAwLCBzaXplb2YobGluZ2VyKSk7CisgICAgbGluZ2VyLmxfb25vZmYgPSAxOworICAgIGxpbmdlci5sX2xpbmdlciA9IDA7CisgICAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKWZkLCBTT0xfU09DS0VULCBTT19MSU5HRVIsIChjaGFyKikmbGluZ2VyLCBzaXplb2Yoc3RydWN0IGxpbmdlcikpKQorICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19MSU5HRVIgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgIH0KKyAgfQorICBpZiAoKHNvYXAtPmNvbm5lY3RfZmxhZ3MgJiB+U09fTElOR0VSKSAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClmZCwgU09MX1NPQ0tFVCwgc29hcC0+Y29ubmVjdF9mbGFncyAmIH5TT19MSU5HRVIsIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgaWYgKHNvYXAtPmtlZXBfYWxpdmUgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpZmQsIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19LRUVQQUxJVkUgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKWZkLCBTT0xfU09DS0VULCBTT19TTkRCVUYsIChjaGFyKikmbGVuLCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fU05EQlVGIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIGlmIChzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClmZCwgU09MX1NPQ0tFVCwgU09fUkNWQlVGLCAoY2hhciopJmxlbiwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX1JDVkJVRiBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorI2lmZGVmIFRDUF9OT0RFTEFZCisgIGlmICghKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKWZkLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgVENQX05PREVMQVkgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNlbmRpZgorI2VuZGlmCisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJPcGVuaW5nIHNvY2tldCAlZCB0byBob3N0PSclcycgcG9ydD0lZFxuIiwgZmQsIGhvc3QsIHBvcnQpKTsKKyNpZm5kZWYgV0lUSF9JUFY2CisgIHNvYXAtPnBlZXJsZW4gPSBzaXplb2Yoc29hcC0+cGVlcik7CisgIG1lbXNldCgodm9pZCopJnNvYXAtPnBlZXIsIDAsIHNpemVvZihzb2FwLT5wZWVyKSk7CisgIHNvYXAtPnBlZXIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgIHNvYXAtPmVycm1vZGUgPSAyOworICBpZiAoc29hcC0+cHJveHlfaG9zdCkKKyAgeyBpZiAoc29hcC0+ZnJlc29sdmUoc29hcCwgc29hcC0+cHJveHlfaG9zdCwgJnNvYXAtPnBlZXIuc2luX2FkZHIpKQorICAgIHsgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImdldCBwcm94eSBob3N0IGJ5IG5hbWUgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgIH0KKyAgICBzb2FwLT5wZWVyLnNpbl9wb3J0ID0gaHRvbnMoKHNob3J0KXNvYXAtPnByb3h5X3BvcnQpOworICB9CisgIGVsc2UKKyAgeyBpZiAoc29hcC0+ZnJlc29sdmUoc29hcCwgaG9zdCwgJnNvYXAtPnBlZXIuc2luX2FkZHIpKQorICAgIHsgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImdldCBob3N0IGJ5IG5hbWUgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgIH0KKyAgICBzb2FwLT5wZWVyLnNpbl9wb3J0ID0gaHRvbnMoKHNob3J0KXBvcnQpOworICB9CisgIHNvYXAtPmVycm1vZGUgPSAwOworICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIHJldHVybiBmZDsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPmNvbm5lY3RfdGltZW91dCkKKyNpZiBkZWZpbmVkKFdJTjMyKQorICB7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAmbm9uYmxvY2tpbmcpOworICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgIHsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICBpb2N0bCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sIChpbnQpKCZub25ibG9ja2luZykpOyAvKiBtb2RpZmllZCB0byB1c2UgZmQgKi8KKyAgfQorI2Vsc2UKKyAgICBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9HRVRGTCl8T19OT05CTE9DSyk7CisjZW5kaWYKKyAgZWxzZQorI2lmIGRlZmluZWQoV0lOMzIpCisgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sICZibG9ja2luZyk7CisgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgIGlvY3RsKChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgKGludCkoJmJsb2NraW5nKSk7CisgIH0KKyNlbHNlCisgICAgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfR0VURkwpJn5PX05PTkJMT0NLKTsKKyNlbmRpZgorI2VuZGlmCisgIGZvciAoOzspCisgIHsgCisjaWZkZWYgV0lUSF9JUFY2CisgICAgaWYgKGNvbm5lY3QoKFNPQVBfU09DS0VUKWZkLCByZXMtPmFpX2FkZHIsIHJlcy0+YWlfYWRkcmxlbikpCisjZWxzZQorICAgIGlmIChjb25uZWN0KChTT0FQX1NPQ0tFVClmZCwgKHN0cnVjdCBzb2NrYWRkciopJnNvYXAtPnBlZXIsIHNpemVvZihzb2FwLT5wZWVyKSkpCisjZW5kaWYKKyAgICB7IAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQgJiYgKHNvYXBfc29ja2V0X2Vycm5vID09IFNPQVBfRUlOUFJPR1JFU1MgfHwgc29hcF9zb2NrZXRfZXJybm8gPT0gU09BUF9FV09VTERCTE9DSykpCisgICAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICAgIFNPQVBfU09DS0xFTl9UIGs7CisgICAgICAgIGZkX3NldCBmZHM7CisgICAgICAgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQgPiAwKQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gc29hcC0+Y29ubmVjdF90aW1lb3V0OworICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gLXNvYXAtPmNvbm5lY3RfdGltZW91dC8xMDAwMDAwOworICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IC1zb2FwLT5jb25uZWN0X3RpbWVvdXQlMTAwMDAwMDsKKyAgICAgICAgfQorICAgICAgICBGRF9aRVJPKCZmZHMpOworICAgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKWZkLCAmZmRzKTsKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeyBpbnQgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKGZkICsgMSksIE5VTEwsICZmZHMsIE5VTEwsICZ0aW1lb3V0KTsKKyAgICAgICAgICBpZiAociA+IDApCisJICAgIGJyZWFrOworICAgICAgICAgIGlmICghcikKKyAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IDA7CisgICAgICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvbm5lY3QgdGltZW91dFxuIikpOworICAgICAgICAgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsICJUaW1lb3V0IiwgImNvbm5lY3QgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUikKKyAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgY29ubmVjdCB0byBob3N0XG4iKSk7CisgICAgICAgICAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiY29ubmVjdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgICAgfQorICAgICAgICB9CisJayA9IChTT0FQX1NPQ0tMRU5fVClzaXplb2Yoc29hcC0+ZXJybnVtKTsKKyAgICAgICAgaWYgKCFnZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClmZCwgU09MX1NPQ0tFVCwgU09fRVJST1IsIChjaGFyKikmc29hcC0+ZXJybnVtLCAmaykgJiYgIXNvYXAtPmVycm51bSkJLyogcG9ydGFiaWxpdHkgbm90ZTogc2VlIFNPQVBfU09DS0xFTl9UIGRlZmluaXRpb24gaW4gc3Rkc29hcDIuaCAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBjb25uZWN0IHRvIGhvc3RcbiIpKTsKKyAgICAgICAgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJjb25uZWN0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgICBlbHNlCisjZW5kaWYKKyNpZmRlZiBXSVRIX0lQVjYKKyAgICAgIGlmIChyZXMtPmFpX25leHQpCisgICAgICB7IHJlcyA9IHJlcy0+YWlfbmV4dDsKKyAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIGdvdG8gYWdhaW47CisgICAgICB9CisgICAgICBlbHNlCisjZW5kaWYKKyAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSKQorICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgY29ubmVjdCB0byBob3N0XG4iKSk7CisgICAgICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJjb25uZWN0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgfSAgCisgICAgZWxzZQorICAgICAgYnJlYWs7CisgIH0KKyNpZmRlZiBXSVRIX0lQVjYKKyAgc29hcC0+cGVlcmxlbiA9IDA7IC8qIElQdjY6IGFscmVhZHkgY29ubmVjdGVkIHNvIHVzZSBzZW5kKCkgKi8KKyAgZnJlZWFkZHJpbmZvKHJlc3NhdmUpOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0KQorI2lmIGRlZmluZWQoV0lOMzIpCisgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sICZibG9ja2luZyk7CisgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgIGlvY3RsKChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgKGludCkoJmJsb2NraW5nKSk7CisgIH0KKyNlbHNlCisgICAgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfR0VURkwpJn5PX05PTkJMT0NLKTsKKyNlbmRpZgorI2VuZGlmCisgIHNvYXAtPnNvY2tldCA9IGZkOworICBzb2FwLT5pbW9kZSAmPSB+U09BUF9FTkNfU1NMOworICBzb2FwLT5vbW9kZSAmPSB+U09BUF9FTkNfU1NMOworICBpZiAoIXN0cm5jbXAoZW5kcG9pbnQsICJodHRwczoiLCA2KSkKKyAgeworI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgIEJJTyAqYmlvOworICAgIGludCByOworICAgIGlmIChzb2FwLT5wcm94eV9ob3N0KQorICAgIHsgc2hvcnQgdjsKKyAgICAgIHVuc2lnbmVkIGludCBrID0gc29hcC0+b21vZGU7IC8qIG1ha2Ugc3VyZSB3ZSBvbmx5IHBhcnNlIEhUVFAgKi8KKyAgICAgIHNpemVfdCBuID0gc29hcC0+Y291bnQ7IC8qIHNhdmUgdGhlIGNvbnRlbnQgbGVuZ3RoICovCisgICAgICBjaGFyICp1c2VyaWQsICpwYXNzd2Q7CisgICAgICBzb2FwLT5vbW9kZSAmPSB+U09BUF9FTkM7IC8qIG1hc2sgSU8gYW5kIEVOQyAqLworICAgICAgc29hcC0+b21vZGUgfD0gU09BUF9JT19CVUZGRVI7CisgICAgICBzb2FwX2JlZ2luX3NlbmQoc29hcCk7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvbm5lY3RpbmcgdG8gcHJveHkgc2VydmVyXG4iKSk7CisgICAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIkNPTk5FQ1QgJXM6JWQgSFRUUC8lcyIsIGhvc3QsIHBvcnQsIHNvYXAtPmh0dHBfdmVyc2lvbik7CisgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgc29hcC0+dG1wYnVmLCBOVUxMKSkpCisgICAgICB7IHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICBpZiAoc29hcC0+cHJveHlfdXNlcmlkICYmIHNvYXAtPnByb3h5X3Bhc3N3ZCAmJiBzdHJsZW4oc29hcC0+cHJveHlfdXNlcmlkKSArIHN0cmxlbihzb2FwLT5wcm94eV9wYXNzd2QpIDwgNzYxKQorICAgICAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIDI2MiwgIiVzOiVzIiwgc29hcC0+cHJveHlfdXNlcmlkLCBzb2FwLT5wcm94eV9wYXNzd2QpOworICAgICAgICBzdHJjcHkoc29hcC0+dG1wYnVmLCAiQmFzaWMgIik7CisgICAgICAgIHNvYXBfczJiYXNlNjQoc29hcCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKShzb2FwLT50bXBidWYgKyAyNjIpLCBzb2FwLT50bXBidWYgKyA2LCBzdHJsZW4oc29hcC0+dG1wYnVmICsgMjYyKSk7CisgICAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiUHJveHktQXV0aG9yaXphdGlvbiIsIHNvYXAtPnRtcGJ1ZikpKQorICAgICAgICB7IHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgTlVMTCwgTlVMTCkpCisgICAgICAgfHwgc29hcF9mbHVzaChzb2FwKSkKKyAgICAgIHsgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgICAgc29hcC0+b21vZGUgPSBrOworICAgICAgayA9IHNvYXAtPmltb2RlOworICAgICAgc29hcC0+aW1vZGUgJj0gflNPQVBfRU5DOyAvKiBtYXNrIElPIGFuZCBFTkMgKi8KKyAgICAgIHYgPSBzb2FwLT52ZXJzaW9uOyAvKiBwcmVzZXJ2ZSAqLworICAgICAgdXNlcmlkID0gc29hcC0+dXNlcmlkOyAvKiBwcmVzZXJ2ZSAqLworICAgICAgcGFzc3dkID0gc29hcC0+cGFzc3dkOyAvKiBwcmVzZXJ2ZSAqLworICAgICAgaWYgKHNvYXBfYmVnaW5fcmVjdihzb2FwKSkKKyAgICAgIHsgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgICAgc29hcC0+dXNlcmlkID0gdXNlcmlkOyAvKiByZXN0b3JlICovCisgICAgICBzb2FwLT5wYXNzd2QgPSBwYXNzd2Q7IC8qIHJlc3RvcmUgKi8KKyAgICAgIHNvYXAtPnZlcnNpb24gPSB2OyAvKiByZXN0b3JlICovCisgICAgICBzb2FwLT5pbW9kZSA9IGs7IC8qIHJlc3RvcmUgKi8KKyAgICAgIHNvYXAtPmNvdW50ID0gbjsgLyogcmVzdG9yZSAqLworICAgICAgc29hcF9iZWdpbl9zZW5kKHNvYXApOworICAgIH0KKyAgICBpZiAoIXNvYXAtPmN0eCAmJiAoc29hcC0+ZXJyb3IgPSBzb2FwLT5mc3NsYXV0aChzb2FwKSkpCisgICAgeyBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJTU0wgYXV0aGVudGljYXRpb24gZmFpbGVkIGluIHRjcF9jb25uZWN0KCk6IGNoZWNrIHBhc3N3b3JkLCBrZXkgZmlsZSwgYW5kIGNhIGZpbGUuIiwgU09BUF9TU0xfRVJST1IpOworICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisgICAgc29hcC0+c3NsID0gU1NMX25ldyhzb2FwLT5jdHgpOworICAgIGlmICghc29hcC0+c3NsKQorICAgIHsgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfU1NMX0VSUk9SOworICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorICAgIGlmIChzb2FwLT5zZXNzaW9uKQorICAgIHsgaWYgKCFzdHJjbXAoc29hcC0+c2Vzc2lvbl9ob3N0LCBob3N0KSAmJiBzb2FwLT5zZXNzaW9uX3BvcnQgPT0gcG9ydCkKKyAgICAgICAgU1NMX3NldF9zZXNzaW9uKHNvYXAtPnNzbCwgc29hcC0+c2Vzc2lvbik7CisgICAgICBTU0xfU0VTU0lPTl9mcmVlKHNvYXAtPnNlc3Npb24pOworICAgICAgc29hcC0+c2Vzc2lvbiA9IE5VTEw7CisgICAgfQorICAgIHNvYXAtPmltb2RlIHw9IFNPQVBfRU5DX1NTTDsKKyAgICBzb2FwLT5vbW9kZSB8PSBTT0FQX0VOQ19TU0w7CisgICAgYmlvID0gQklPX25ld19zb2NrZXQoKFNPQVBfU09DS0VUKWZkLCBCSU9fTk9DTE9TRSk7CisgICAgU1NMX3NldF9iaW8oc29hcC0+c3NsLCBiaW8sIGJpbyk7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQpCisjaWYgZGVmaW5lZChXSU4zMikKKyAgICB7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sICZub25ibG9ja2luZyk7CisgICAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICAgIHsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICAgIGlvY3RsKChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgKGludCkoJm5vbmJsb2NraW5nKSk7CisgICAgfQorI2Vsc2UKKyAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX0dFVEZMKXxPX05PTkJMT0NLKTsKKyNlbmRpZgorI2VuZGlmCisgICAgZm9yICg7OykKKyAgICB7IGlmICgociA9IFNTTF9jb25uZWN0KHNvYXAtPnNzbCkpIDw9IDApCisgICAgICB7IGludCBlcnIgPSBTU0xfZ2V0X2Vycm9yKHNvYXAtPnNzbCwgcik7CisgICAgICAgIGlmIChlcnIgIT0gU1NMX0VSUk9SX05PTkUgJiYgZXJyICE9IFNTTF9FUlJPUl9XQU5UX1JFQUQgJiYgZXJyICE9IFNTTF9FUlJPUl9XQU5UX1dSSVRFKQorICAgICAgICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCBzc2xfZXJyb3Ioc29hcCwgciksICJTU0wgY29ubmVjdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0KQorICAgICAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICAgICAgZmRfc2V0IGZkczsKKyAgICAgICAgICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0ID4gMCkKKyAgICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gc29hcC0+Y29ubmVjdF90aW1lb3V0OworICAgICAgICAgICAgdGltZW91dC50dl91c2VjID0gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSAtc29hcC0+Y29ubmVjdF90aW1lb3V0LzEwMDAwMDA7CisgICAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAtc29hcC0+Y29ubmVjdF90aW1lb3V0JTEwMDAwMDA7CisgICAgICAgICAgfQorICAgICAgICAgIEZEX1pFUk8oJmZkcyk7CisgICAgICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClmZCwgJmZkcyk7CisgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICB7IGludCByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoZmQgKyAxKSwgJmZkcywgTlVMTCwgJmZkcywgJnRpbWVvdXQpOworICAgICAgICAgICAgaWYgKHIgPiAwKQorCSAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKCFyKQorICAgICAgICAgICAgeyBzb2FwLT5lcnJudW0gPSAwOworICAgICAgICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvbm5lY3QgdGltZW91dFxuIikpOworICAgICAgICAgICAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgIlRpbWVvdXQiLCAiY29ubmVjdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgICAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKwkgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQpCisjaWZkZWYgV0lOMzIKKyAgICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sICZibG9ja2luZyk7CisgICAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICAgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICAgIGlvY3RsKChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgKGludCkoJmJsb2NraW5nKSk7CisgICAgfQorI2Vsc2UKKyAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX0dFVEZMKSZ+T19OT05CTE9DSyk7CisjZW5kaWYKKyNlbmRpZgorICAgIGlmIChzb2FwLT5yZXF1aXJlX3NlcnZlcl9hdXRoKQorICAgIHsgWDUwOSAqcGVlcjsKKyAgICAgIGludCBlcnI7CisgICAgICBpZiAoKGVyciA9IFNTTF9nZXRfdmVyaWZ5X3Jlc3VsdChzb2FwLT5zc2wpKSAhPSBYNTA5X1ZfT0spCisgICAgICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCBYNTA5X3ZlcmlmeV9jZXJ0X2Vycm9yX3N0cmluZyhlcnIpLCAiU1NMIGNlcnRpZmljYXRlIHByZXNlbnRlZCBieSBwZWVyIGNhbm5vdCBiZSB2ZXJpZmllZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9TU0xfRVJST1IpOworICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgICBwZWVyID0gU1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKHNvYXAtPnNzbCk7CisgICAgICBpZiAoIXBlZXIpCisgICAgICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIk5vIFNTTCBjZXJ0aWZpY2F0ZSB3YXMgcHJlc2VudGVkIGJ5IHRoZSBwZWVyIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyAgICAgIFg1MDlfTkFNRV9nZXRfdGV4dF9ieV9OSUQoWDUwOV9nZXRfc3ViamVjdF9uYW1lKHBlZXIpLCBOSURfY29tbW9uTmFtZSwgc29hcC0+bXNnYnVmLCBzaXplb2Yoc29hcC0+bXNnYnVmKSk7CisgICAgICBYNTA5X2ZyZWUocGVlcik7CisgICAgICBpZiAoc29hcF90YWdfY21wKHNvYXAtPm1zZ2J1ZiwgaG9zdCkpCisgICAgICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIlNTTCBjZXJ0aWZpY2F0ZSBob3N0IG5hbWUgbWlzbWF0Y2ggaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1NTTF9FUlJPUjsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyNlbmRpZgorICB9CisgIHJldHVybiBmZDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9iaW5kKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpob3N0LCBpbnQgcG9ydCwgaW50IGJhY2tsb2cpCit7CisjaWZkZWYgV0lUSF9JUFY2CisgIHN0cnVjdCBhZGRyaW5mbyAqYWRkcmluZm8gPSBOVUxMOworICBzdHJ1Y3QgYWRkcmluZm8gaGludHM7CisgIHN0cnVjdCBhZGRyaW5mbyByZXM7CisgIGludCBlcnI7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGludCBsZW4gPSBTT0FQX0JVRkxFTjsKKyAgaW50IHNldCA9IDE7CisjZW5kaWYKKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikpCisgIHsgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIpOworICAgIHNvYXAtPm1hc3RlciA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgc29hcC0+c29ja2V0ID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgc29hcC0+ZXJybW9kZSA9IDE7CisgIGlmICh0Y3BfaW5pdChzb2FwKSkKKyAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJUQ1AgaW5pdCBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNpZmRlZiBXSVRIX0lQVjYKKyAgbWVtc2V0KCh2b2lkKikmaGludHMsIDAsIHNpemVvZihoaW50cykpOworICBoaW50cy5haV9mYW1pbHkgPSBQRl9VTlNQRUM7CisjaWZkZWYgV0lUSF9VRFAKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfREdSQU07CisgIGVsc2UKKyNlbmRpZgorICAgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisgIGhpbnRzLmFpX2ZsYWdzID0gQUlfUEFTU0lWRTsKKyAgc29hcC0+ZXJybW9kZSA9IDI7CisgIGVyciA9IGdldGFkZHJpbmZvKGhvc3QsIHNvYXBfaW50MnMoc29hcCwgcG9ydCksICZoaW50cywgJmFkZHJpbmZvKTsKKyAgaWYgKGFkZHJpbmZvKQorICB7IHJlcyA9ICphZGRyaW5mbzsKKyAgICBzb2FwLT5wZWVyID0gKigoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UqKWFkZHJpbmZvLT5haV9hZGRyKTsKKyAgICBzb2FwLT5wZWVybGVuID0gYWRkcmluZm8tPmFpX2FkZHJsZW47CisgICAgcmVzLmFpX2FkZHIgPSAoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlcjsKKyAgICByZXMuYWlfYWRkcmxlbiA9IHNvYXAtPnBlZXJsZW47CisgICAgZnJlZWFkZHJpbmZvKGFkZHJpbmZvKTsKKyAgfQorICBpZiAoZXJyKQorICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIGdhaV9zdHJlcnJvcihlcnIpLCAiZ2V0YWRkcmluZm8gZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIHNvYXAtPm1hc3RlciA9IHNvY2tldChyZXMuYWlfZmFtaWx5LCByZXMuYWlfc29ja3R5cGUsIHJlcy5haV9wcm90b2NvbCk7CisjZWxzZQorI2lmZGVmIFdJVEhfVURQCisgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgc29hcC0+bWFzdGVyID0gKGludClzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisgIGVsc2UKKyNlbmRpZgorICAgIHNvYXAtPm1hc3RlciA9IChpbnQpc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKyNlbmRpZgorICBzb2FwLT5lcnJtb2RlID0gMDsKKyAgaWYgKCFzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNvY2tldCBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNpZmRlZiBXSVRIX1VEUAorICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIHNvYXAtPnNvY2tldCA9IHNvYXAtPm1hc3RlcjsKKyNlbmRpZgorI2lmZGVmIFNPQ0tFVF9DTE9TRV9PTl9FWEVDCisjaWZkZWYgV0lOMzIKKyNpZm5kZWYgVU5ERVJfQ0UKKyAgU2V0SGFuZGxlSW5mb3JtYXRpb24oKEhBTkRMRSlzb2FwLT5tYXN0ZXIsIEhBTkRMRV9GTEFHX0lOSEVSSVQsIDApOworI2VuZGlmCisjZWxzZQorICBmY250bChzb2FwLT5tYXN0ZXIsIEZfU0VURkQsIDEpOworI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5iaW5kX2ZsYWdzICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgU09MX1NPQ0tFVCwgc29hcC0+YmluZF9mbGFncywgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBpZiAoKChzb2FwLT5pbW9kZSB8IHNvYXAtPm9tb2RlKSAmIFNPQVBfSU9fS0VFUEFMSVZFKSAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX0tFRVBBTElWRSBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgU09MX1NPQ0tFVCwgU09fU05EQlVGLCAoY2hhciopJmxlbiwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fU05EQlVGIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsIChjaGFyKikmbGVuLCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19SQ1ZCVUYgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisjaWZkZWYgVENQX05PREVMQVkKKyAgaWYgKCEoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBUQ1BfTk9ERUxBWSBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgV0lUSF9JUFY2CisgIHNvYXAtPmVycm1vZGUgPSAwOworICBpZiAoYmluZCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCByZXMuYWlfYWRkciwgcmVzLmFpX2FkZHJsZW4pKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IGJpbmQgdG8gaG9zdFxuIikpOworICAgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImJpbmQgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9ICAKKyNlbHNlCisgIHNvYXAtPnBlZXJsZW4gPSBzaXplb2Yoc29hcC0+cGVlcik7CisgIG1lbXNldCgodm9pZCopJnNvYXAtPnBlZXIsIDAsIHNpemVvZihzb2FwLT5wZWVyKSk7CisgIHNvYXAtPnBlZXIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgIHNvYXAtPmVycm1vZGUgPSAyOworICBpZiAoaG9zdCkKKyAgeyBpZiAoc29hcC0+ZnJlc29sdmUoc29hcCwgaG9zdCwgJnNvYXAtPnBlZXIuc2luX2FkZHIpKQorICAgIHsgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiZ2V0IGhvc3QgYnkgbmFtZSBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIHNvYXAtPnBlZXIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7CisgIHNvYXAtPnBlZXIuc2luX3BvcnQgPSBodG9ucygoc2hvcnQpcG9ydCk7CisgIHNvYXAtPmVycm1vZGUgPSAwOworICBpZiAoYmluZCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCAoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlciwgc29hcC0+cGVlcmxlbikpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgYmluZCB0byBob3N0XG4iKSk7CisgICAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiYmluZCBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNlbmRpZgorICBpZiAoIShzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSAmJiBsaXN0ZW4oKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgYmFja2xvZykpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgYmluZCB0byBob3N0XG4iKSk7CisgICAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAibGlzdGVuIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfSAgCisgIHJldHVybiBzb2FwLT5tYXN0ZXI7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcG9sbChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgCisjaWZuZGVmIFdJVEhfTEVBTgorICBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICBmZF9zZXQgcmZkLCBzZmQsIHhmZDsKKyAgaW50IHI7CisgIHRpbWVvdXQudHZfc2VjID0gMDsKKyAgdGltZW91dC50dl91c2VjID0gMDsKKyAgRkRfWkVSTygmcmZkKTsKKyAgRkRfWkVSTygmc2ZkKTsKKyAgRkRfWkVSTygmeGZkKTsKKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgIHsgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZyZmQpOworICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmc2ZkKTsKKyAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnhmZCk7CisgICAgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCAmcmZkLCAmc2ZkLCAmeGZkLCAmdGltZW91dCk7CisgICAgaWYgKHIgPiAwICYmIEZEX0lTU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZ4ZmQpKQorICAgICAgciA9IC0xOworICB9CisgIGVsc2UgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikpCisgIHsgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsICZzZmQpOworICAgIHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5tYXN0ZXIgKyAxKSwgTlVMTCwgJnNmZCwgTlVMTCwgJnRpbWVvdXQpOworICB9CisgIGVsc2UKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgaWYgKHIgPiAwKQorICB7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgICAgaWYgKHNvYXAtPmltb2RlICYgU09BUF9FTkNfU1NMKQorICAgIHsKKyAgICAgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpCisgICAgICAgJiYgRkRfSVNTRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnNmZCkKKyAgICAgICAmJiAoIUZEX0lTU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZyZmQpCisgICAgICAgIHx8IFNTTF9wZWVrKHNvYXAtPnNzbCwgc29hcC0+dG1wYnVmLCAxKSA+IDApKQorICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KQorICAgICAgICYmIEZEX0lTU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZzZmQpCisgICAgICAgJiYgKCFGRF9JU1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmcmZkKQorICAgICAgICB8fCByZWN2KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHNvYXAtPnRtcGJ1ZiwgMSwgTVNHX1BFRUspID4gMCkpCisgICAgICAgIHJldHVybiBTT0FQX09LOworICB9CisgIGVsc2UgaWYgKHIgPCAwKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIGlmICgoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSB8fCBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKSAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSKQorICAgIHsgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2VsZWN0IGZhaWxlZCBpbiBzb2FwX3BvbGwoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfVENQX0VSUk9SOworICAgIH0KKyAgfQorICBlbHNlCisgICAgc29hcC0+ZXJybnVtID0gMDsKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlBvbGxpbmc6IG90aGVyIGVuZCBkb3duIG9uIHNvY2tldD0lZCBzZWxlY3Q9JWRcbiIsIHNvYXAtPnNvY2tldCwgcikpOworICByZXR1cm4gU09BUF9FT0Y7CisjZWxzZQorICByZXR1cm4gU09BUF9PSzsKKyNlbmRpZgorfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAordGNwX2FjY2VwdChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHMsIHN0cnVjdCBzb2NrYWRkciAqYSwgaW50ICpuKQoreyBpbnQgZmQ7CisgIGZkID0gKGludClhY2NlcHQoKFNPQVBfU09DS0VUKXMsIGEsIChTT0FQX1NPQ0tMRU5fVCopbik7CS8qIHBvcnRhYmlsaXR5IG5vdGU6IHNlZSBTT0FQX1NPQ0tMRU5fVCBkZWZpbml0aW9uIGluIHN0ZHNvYXAyLmggKi8KKyNpZmRlZiBTT0NLRVRfQ0xPU0VfT05fRVhFQworI2lmZGVmIFdJTjMyCisjaWZuZGVmIFVOREVSX0NFCisgIFNldEhhbmRsZUluZm9ybWF0aW9uKChIQU5ETEUpZmQsIEhBTkRMRV9GTEFHX0lOSEVSSVQsIDApOworI2VuZGlmCisjZWxzZQorICBmY250bChmZCwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7CisjZW5kaWYKKyNlbmRpZgorICByZXR1cm4gZmQ7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYWNjZXB0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBpbnQgbiA9IChpbnQpc2l6ZW9mKHNvYXAtPnBlZXIpOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaW50IGxlbiA9IFNPQVBfQlVGTEVOOworICBpbnQgc2V0ID0gMTsKKyNlbmRpZgorICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisjaWZkZWYgV0lUSF9VRFAKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICByZXR1cm4gc29hcC0+c29ja2V0ID0gc29hcC0+bWFzdGVyOworI2VuZGlmCisgIG1lbXNldCgodm9pZCopJnNvYXAtPnBlZXIsIDAsIHNpemVvZihzb2FwLT5wZWVyKSk7CisgIHNvYXAtPnNvY2tldCA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIHNvYXAtPmVycm1vZGUgPSAwOworICBzb2FwLT5rZWVwX2FsaXZlID0gMDsKKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikpCisgIHsgZm9yICg7OykKKyAgICB7IAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIGlmIChzb2FwLT5hY2NlcHRfdGltZW91dCkKKyAgICAgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgICAgZmRfc2V0IGZkOworICAgICAgICBpZiAoc29hcC0+YWNjZXB0X3RpbWVvdXQgPiAwKQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gc29hcC0+YWNjZXB0X3RpbWVvdXQ7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSAtc29hcC0+YWNjZXB0X3RpbWVvdXQvMTAwMDAwMDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAtc29hcC0+YWNjZXB0X3RpbWVvdXQlMTAwMDAwMDsKKyAgICAgICAgfQorICAgICAgICBGRF9aRVJPKCZmZCk7CisgICAgICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCAmZmQpOworICAgICAgICBmb3IgKDs7KQorICAgICAgICB7IGludCByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+bWFzdGVyICsgMSksICZmZCwgJmZkLCBOVUxMLCAmdGltZW91dCk7CisgICAgICAgICAgaWYgKHIgPiAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgaWYgKCFyKQorICAgICAgICAgIHsgc29hcC0+ZXJybnVtID0gMDsKKyAgICAgICAgICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJUaW1lb3V0IiwgImFjY2VwdCBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUikKKyAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgICAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgICAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiYWNjZXB0IGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgICAgfQorICAgICAgICB9CisjaWYgZGVmaW5lZChXSU4zMikKKwl7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgICAgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRklPTkJJTywgJm5vbmJsb2NraW5nKTsKKyAgICAgICAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICAgICAgICB7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgICAgICAgaW9jdGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRklPTkJJTywgKGludCkoJm5vbmJsb2NraW5nKSk7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfR0VURkwpfE9fTk9OQkxPQ0spOworI2VuZGlmCisgICAgICB9CisgICAgICBlbHNlCisjaWYgZGVmaW5lZChXSU4zMikKKyAgICAgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICAgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRklPTkJJTywgJmJsb2NraW5nKTsKKyAgICAgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgICAgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICAgICAgaW9jdGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRklPTkJJTywgKGludCkoJmJsb2NraW5nKSk7CisgICAgICB9CisjZWxzZQorICAgICAgICBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGX0dFVEZMKSZ+T19OT05CTE9DSyk7CisjZW5kaWYKKyNlbmRpZgorICAgICAgc29hcC0+c29ja2V0ID0gc29hcC0+ZmFjY2VwdChzb2FwLCBzb2FwLT5tYXN0ZXIsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyLCAmbik7CisgICAgICBzb2FwLT5wZWVybGVuID0gKHNpemVfdCluOworICAgICAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgICAgICB7CisjaWZkZWYgV0lUSF9JUFY2CisvKiBVc2Ugc29hcC0+aG9zdCB0byBzdG9yZSB0aGUgbnVtZXJpYyBmb3JtIG9mIHRoZSByZW1vdGUgaG9zdCAqLworICAgICAgICBnZXRuYW1laW5mbygoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlciwgbiwgc29hcC0+aG9zdCwgc2l6ZW9mKHNvYXAtPmhvc3QpLCBOVUxMLCAwLCBOSV9OVU1FUklDSE9TVCB8IE5JX05VTUVSSUNTRVJWKTsgCisgICAgICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJBY2NlcHQgc29ja2V0ICVkIGZyb20gJXNcbiIsIHNvYXAtPnNvY2tldCwgc29hcC0+aG9zdCkpOworICAgICAgICBzb2FwLT5pcCA9IDA7IC8qIGluZm8gc3RvcmVkIGluIHNvYXAtPnBlZXIgYW5kIHNvYXAtPmhvc3QgKi8KKyAgICAgICAgc29hcC0+cG9ydCA9IDA7IC8qIGluZm8gc3RvcmVkIGluIHNvYXAtPnBlZXIgYW5kIHNvYXAtPmhvc3QgKi8KKyNlbHNlCisgICAgICAgIHNvYXAtPmlwID0gbnRvaGwoc29hcC0+cGVlci5zaW5fYWRkci5zX2FkZHIpOworICAgICAgICBzb2FwLT5wb3J0ID0gKGludCludG9ocyhzb2FwLT5wZWVyLnNpbl9wb3J0KTsgLyogZG9lcyBub3QgcmV0dXJuIHBvcnQgbnVtYmVyIG9uIHNvbWUgc3lzdGVtcyAqLworICAgICAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiQWNjZXB0IHNvY2tldCAlZCBhdCBwb3J0ICVkIGZyb20gSVAgJWQuJWQuJWQuJWRcbiIsIHNvYXAtPnNvY2tldCwgc29hcC0+cG9ydCwgKGludCkoc29hcC0+aXA+PjI0KSYweEZGLCAoaW50KShzb2FwLT5pcD4+MTYpJjB4RkYsIChpbnQpKHNvYXAtPmlwPj44KSYweEZGLCAoaW50KXNvYXAtPmlwJjB4RkYpKTsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKwlpZiAoc29hcC0+YWNjZXB0X2ZsYWdzICYgU09fTElOR0VSKQorICAgICAgICB7IHN0cnVjdCBsaW5nZXIgbGluZ2VyOworICAgICAgICAgIG1lbXNldCgodm9pZCopJmxpbmdlciwgMCwgc2l6ZW9mKGxpbmdlcikpOworICAgICAgICAgIGxpbmdlci5sX29ub2ZmID0gMTsKKyAgICAgICAgICBsaW5nZXIubF9saW5nZXIgPSAwOworCSAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgU09MX1NPQ0tFVCwgU09fTElOR0VSLCAoY2hhciopJmxpbmdlciwgc2l6ZW9mKHN0cnVjdCBsaW5nZXIpKSkKKyAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworCSAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX0xJTkdFUiBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKwkgICAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKwkgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKHNvYXAtPmFjY2VwdF9mbGFncyAmIH5TT19MSU5HRVIpICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgU09MX1NPQ0tFVCwgc29hcC0+YWNjZXB0X2ZsYWdzICYgflNPX0xJTkdFUiwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworCSAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCgoc29hcC0+aW1vZGUgfCBzb2FwLT5vbW9kZSkgJiBTT0FQX0lPX0tFRVBBTElWRSkgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBTT0xfU09DS0VULCBTT19LRUVQQUxJVkUsIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19LRUVQQUxJVkUgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisJICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBTT0xfU09DS0VULCBTT19TTkRCVUYsIChjaGFyKikmbGVuLCBzaXplb2YoaW50KSkpCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19TTkRCVUYgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisJICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsIChjaGFyKikmbGVuLCBzaXplb2YoaW50KSkpCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19SQ1ZCVUYgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisJICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgfQorI2lmZGVmIFRDUF9OT0RFTEFZCisgICAgICAgIGlmICghKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgVENQX05PREVMQVkgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisJICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgfQorI2VuZGlmCisjZW5kaWYKKyAgICAgICAgaWYgKHNvYXAtPmFjY2VwdF90aW1lb3V0KQorICAgICAgICB7CisjaWYgZGVmaW5lZChXSU4zMikKKyAgICAgICAgICB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgICAgICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZJT05CSU8sICZibG9ja2luZyk7CisgICAgICAgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRklPTkJJTywgJmJsb2NraW5nKTsKKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgICAgICAgICB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgICAgICAgIGlvY3RsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZJT05CSU8sIChpbnQpKCZibG9ja2luZykpOworICAgICAgICAgIGlvY3RsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZJT05CSU8sIChpbnQpKCZibG9ja2luZykpOworI2VsaWYgZGVmaW5lZChQQUxNKQorICAgICAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfR0VURkwsMCkmfk9fTk9OQkxPQ0spOworICAgICAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfR0VURkwsMCkmfk9fTk9OQkxPQ0spOworI2VsaWYgZGVmaW5lZChTWU1CSUFOKQorICAgICAgICAgIGxvbmcgYmxvY2tpbmcgPSAwOworICAgICAgICAgIGlvY3RsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIDAvKkZJT05CSU8qLywgJmJsb2NraW5nKTsKKyNlbHNlCisgICAgICAgICAgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRl9HRVRGTCkmfk9fTk9OQkxPQ0spOworICAgICAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfR0VURkwpJn5PX05PTkJMT0NLKTsKKyNlbmRpZgorCX0KKyAgICAgICAgc29hcC0+a2VlcF9hbGl2ZSA9ICgoKHNvYXAtPmltb2RlIHwgc29hcC0+b21vZGUpICYgU09BUF9JT19LRUVQQUxJVkUpICE9IDApOworICAgICAgICByZXR1cm4gc29hcC0+c29ja2V0OworICAgICAgfQorICAgICAgaWYgKHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FQUdBSU4pCisgICAgICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJBY2NlcHQgZmFpbGVkIGZyb20gJXNcbiIsIHNvYXAtPmhvc3QpKTsKKyAgICAgICAgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImFjY2VwdCBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKwlzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyAgeyBzb2FwLT5lcnJudW0gPSAwOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgIm5vIG1hc3RlciBzb2NrZXQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAordGNwX2Rpc2Nvbm5lY3Qoc3RydWN0IHNvYXAgKnNvYXApCit7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgIGlmIChzb2FwLT5zc2wpCisgIHsgaW50IHIsIHMgPSAwOworICAgIGlmIChzb2FwLT5zZXNzaW9uKQorICAgICAgU1NMX1NFU1NJT05fZnJlZShzb2FwLT5zZXNzaW9uKTsKKyAgICBpZiAoKnNvYXAtPmhvc3QpCisgICAgeyBzb2FwLT5zZXNzaW9uID0gU1NMX2dldDFfc2Vzc2lvbihzb2FwLT5zc2wpOworICAgICAgaWYgKHNvYXAtPnNlc3Npb24pCisgICAgICB7IHN0cmNweShzb2FwLT5zZXNzaW9uX2hvc3QsIHNvYXAtPmhvc3QpOworICAgICAgICBzb2FwLT5zZXNzaW9uX3BvcnQgPSBzb2FwLT5wb3J0OworICAgICAgfQorICAgIH0KKyAgICByID0gU1NMX3NodXRkb3duKHNvYXAtPnNzbCk7CisgICAgaWYgKHIgIT0gMSkKKyAgICB7IHMgPSBFUlJfZ2V0X2Vycm9yKCk7CisgICAgICBpZiAocykKKyAgICAgIHsgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgICAgICAgIHsgc29hcC0+ZnNodXRkb3duc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIDEpOworICAgICAgICAgIHNvYXAtPnNvY2tldCA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgIH0KKyAgICAgICAgciA9IFNTTF9zaHV0ZG93bihzb2FwLT5zc2wpOworICAgICAgfQorICAgIH0KKyAgICBEQkdMT0coVEVTVCwgaWYgKHMpIFNPQVBfTUVTU0FHRShmZGVidWcsICJTaHV0ZG93biBmYWlsZWQ6ICVkXG4iLCBTU0xfZ2V0X2Vycm9yKHNvYXAtPnNzbCwgcikpKTsKKyAgICBTU0xfZnJlZShzb2FwLT5zc2wpOworICAgIHNvYXAtPnNzbCA9IE5VTEw7CisgICAgaWYgKHMpCisgICAgICByZXR1cm4gU09BUF9TU0xfRVJST1I7CisgICAgRVJSX3JlbW92ZV9zdGF0ZSgwKTsKKyAgfQorI2VuZGlmCisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpICYmICEoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgIHsgc29hcC0+ZnNodXRkb3duc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIDIpOworICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0KTsKKyAgICBzb2FwLT5zb2NrZXQgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAordGNwX2Nsb3Nlc29ja2V0KHN0cnVjdCBzb2FwICpzb2FwLCBTT0FQX1NPQ0tFVCBmZCkKK3sgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDbG9zZSBzb2NrZXQgJWRcbiIsIChpbnQpZmQpKTsKKyAgcmV0dXJuIGNsb3Nlc29ja2V0KGZkKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3RjcF9zaHV0ZG93bnNvY2tldChzdHJ1Y3Qgc29hcCAqc29hcCwgU09BUF9TT0NLRVQgZmQsIGludCBob3cpCit7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2h1dGRvd24gc29ja2V0ICVkIGhvdz0lZFxuIiwgKGludClmZCwgaG93KSk7CisgIHJldHVybiBzaHV0ZG93bihmZCwgaG93KTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2Nsb3Nlc29jayhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IHN0YXR1cyA9IHNvYXAtPmVycm9yOworICBpZiAoc3RhdHVzID09IFNPQVBfRU9GIHx8IHN0YXR1cyA9PSBTT0FQX1RDUF9FUlJPUiB8fCBzdGF0dXMgPT0gU09BUF9TU0xfRVJST1IgfHwgIXNvYXAtPmtlZXBfYWxpdmUpCisgIHsgaWYgKHNvYXAtPmZjbG9zZSAmJiAoc29hcC0+ZXJyb3IgPSBzb2FwLT5mY2xvc2Uoc29hcCkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOworICB9CisjaWZkZWYgV0lUSF9aTElCCisgIGlmIChzb2FwLT56bGliX3N0YXRlID09IFNPQVBfWkxJQl9ERUZMQVRFKQorICAgIGRlZmxhdGVFbmQoJnNvYXAtPmRfc3RyZWFtKTsKKyAgZWxzZSBpZiAoc29hcC0+emxpYl9zdGF0ZSA9PSBTT0FQX1pMSUJfSU5GTEFURSkKKyAgICBpbmZsYXRlRW5kKCZzb2FwLT5kX3N0cmVhbSk7CisgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfTk9ORTsKKyNlbmRpZgorICByZXR1cm4gc29hcC0+ZXJyb3IgPSBzdGF0dXM7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorc2l6ZV90CitTT0FQX0ZNQUMyCitzb2FwX2hhc2gocmVnaXN0ZXIgY29uc3QgY2hhciAqcykKK3sgcmVnaXN0ZXIgc2l6ZV90IGggPSAwOworICB3aGlsZSAoKnMpCisgICAgaCA9IDY1NTk5KmggKyAqcysrOworICByZXR1cm4gaCAlIFNPQVBfSURIQVNIOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQKK3NvYXBfaW5pdF9waHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBpOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluaXRpYWxpemluZyBwb2ludGVyIGhhc2h0YWJsZVxuIikpOworICBzb2FwLT5wYmxrID0gTlVMTDsKKyAgc29hcC0+cGlkeCA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCAoaW50KVNPQVBfUFRSSEFTSDsgaSsrKQorICAgIHNvYXAtPnBodFtpXSA9IE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwKgorU09BUF9GTUFDMgorc29hcF9uZXcxKHNvYXBfbW9kZSBtb2RlKQoreyByZXR1cm4gc29hcF9uZXcyKG1vZGUsIG1vZGUpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc3RydWN0IHNvYXAqCitTT0FQX0ZNQUMyCitzb2FwX25ldygpCit7IHJldHVybiBzb2FwX25ldzIoU09BUF9JT19ERUZBVUxULCBTT0FQX0lPX0RFRkFVTFQpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc3RydWN0IHNvYXAqCitTT0FQX0ZNQUMyCitzb2FwX25ldzIoc29hcF9tb2RlIGltb2RlLCBzb2FwX21vZGUgb21vZGUpCit7IHN0cnVjdCBzb2FwICpzb2FwID0gKHN0cnVjdCBzb2FwKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2FwKSk7CisgIGlmIChzb2FwKQorICAgIHNvYXBfaW5pdDIoc29hcCwgaW1vZGUsIG9tb2RlKTsKKyAgcmV0dXJuIHNvYXA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2RlbChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgZnJlZShzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZAorc29hcF9mcmVlX3BodChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGJsayAqcGIsICpuZXh0OworICByZWdpc3RlciBpbnQgaTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIHBvaW50ZXIgaGFzaHRhYmxlXG4iKSk7CisgIGZvciAocGIgPSBzb2FwLT5wYmxrOyBwYjsgcGIgPSBuZXh0KQorICB7IG5leHQgPSBwYi0+bmV4dDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgcGIpOworICB9CisgIHNvYXAtPnBibGsgPSBOVUxMOworICBzb2FwLT5waWR4ID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IChpbnQpU09BUF9QVFJIQVNIOyBpKyspCisgICAgc29hcC0+cGh0W2ldID0gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbWJlZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCwgY29uc3Qgc3RydWN0IHNvYXBfYXJyYXkgKmEsIGludCBuLCBjb25zdCBjaGFyICp0YWcsIGludCB0eXBlKQoreyByZWdpc3RlciBpbnQgaTsKKyAgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICBpZiAoc29hcC0+dmVyc2lvbiAhPSAxKQorICAgIHNvYXAtPmVuY29kaW5nID0gMTsKKyAgaWYgKGEpCisgICAgaSA9IHNvYXBfYXJyYXlfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgYSwgbiwgdHlwZSwgJnBwKTsKKyAgZWxzZQorICAgIGkgPSBzb2FwX3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIHR5cGUsICZwcCk7CisgIGlmIChpKQorICB7IGlmIChzb2FwX2lzX2VtYmVkZGVkKHNvYXAsIHBwKQorICAgICB8fCBzb2FwX2lzX3NpbmdsZShzb2FwLCBwcCkpCisgICAgICByZXR1cm4gMDsKKyAgICBzb2FwX3NldF9lbWJlZGRlZChzb2FwLCBwcCk7CisgIH0KKyAgcmV0dXJuIGk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcG9pbnRlcl9sb29rdXAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnAsIGludCB0eXBlLCBzdHJ1Y3Qgc29hcF9wbGlzdCAqKnBwcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICAqcHBwID0gTlVMTDsKKyAgaWYgKHApCisgIHsgZm9yIChwcCA9IHNvYXAtPnBodFtzb2FwX2hhc2hfcHRyKHApXTsgcHA7IHBwID0gcHAtPm5leHQpCisgICAgeyBpZiAocHAtPnB0ciA9PSBwICYmIHBwLT50eXBlID09IHR5cGUpCisgICAgICB7ICpwcHAgPSBwcDsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJMb29rdXAgbG9jYXRpb249JXAgdHlwZT0lZCBpZD0lZFxuIiwgcCwgdHlwZSwgcHAtPmlkKSk7CisgICAgICAgIHJldHVybiBwcC0+aWQ7CisgICAgICB9CisgICAgfQorICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTG9va3VwIGxvY2F0aW9uPSVwIHR5cGU9JWQ6IG5vdCBmb3VuZFxuIiwgcCwgdHlwZSkpOworICByZXR1cm4gMDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wb2ludGVyX2VudGVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGludCB0eXBlLCBzdHJ1Y3Qgc29hcF9wbGlzdCAqKnBwcCkKK3sgcmVnaXN0ZXIgaW50IGg7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgaWYgKCFzb2FwLT5wYmxrIHx8IHNvYXAtPnBpZHggPj0gU09BUF9QVFJCTEspCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGJsayAqcGIgPSAoc3RydWN0IHNvYXBfcGJsayopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX3BibGspKTsKKyAgICBpZiAoIXBiKQorICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBwYi0+bmV4dCA9IHNvYXAtPnBibGs7CisgICAgc29hcC0+cGJsayA9IHBiOworICAgIHNvYXAtPnBpZHggPSAwOworICB9CisgICpwcHAgPSBwcCA9ICZzb2FwLT5wYmxrLT5wbGlzdFtzb2FwLT5waWR4KytdOworICBpZiAoYSkKKyAgICBoID0gc29hcF9oYXNoX3B0cihhLT5fX3B0cik7CisgIGVsc2UKKyAgICBoID0gc29hcF9oYXNoX3B0cihwKTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQb2ludGVyIGVudGVyIGxvY2F0aW9uPSVwIGFycmF5PSVwIHNpemU9JWQgZGltPSVkIHR5cGU9JWQgaWQ9JWRcbiIsIHAsIGE/YS0+X19wdHI6TlVMTCwgYT9hLT5fX3NpemU6MCwgbiwgdHlwZSwgc29hcC0+aWRudW0rMSkpOworICBwcC0+bmV4dCA9IHNvYXAtPnBodFtoXTsKKyAgcHAtPnR5cGUgPSB0eXBlOworICBwcC0+bWFyazEgPSAwOworICBwcC0+bWFyazIgPSAwOworICBwcC0+cHRyID0gcDsKKyAgcHAtPmFycmF5ID0gYTsKKyAgc29hcC0+cGh0W2hdID0gcHA7CisgIHBwLT5pZCA9ICsrc29hcC0+aWRudW07CisgIHJldHVybiBwcC0+aWQ7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYXJyYXlfcG9pbnRlcl9sb29rdXAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgbiwgaW50IHR5cGUsIHN0cnVjdCBzb2FwX3BsaXN0ICoqcHBwKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgICpwcHAgPSBOVUxMOworICBpZiAoIXAgfHwgIWEtPl9fcHRyKQorICAgIHJldHVybiAwOworICBmb3IgKHBwID0gc29hcC0+cGh0W3NvYXBfaGFzaF9wdHIoYS0+X19wdHIpXTsgcHA7IHBwID0gcHAtPm5leHQpCisgIHsgaWYgKHBwLT50eXBlID09IHR5cGUgJiYgcHAtPmFycmF5ICYmIHBwLT5hcnJheS0+X19wdHIgPT0gYS0+X19wdHIpCisgICAgeyByZWdpc3RlciBpbnQgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgIGlmICgoKGNvbnN0IGludCopJnBwLT5hcnJheS0+X19zaXplKVtpXSAhPSAoKGNvbnN0IGludCopJmEtPl9fc2l6ZSlbaV0pCisJICBicmVhazsKKyAgICAgIGlmIChpID09IG4pCisgICAgICB7ICpwcHAgPSBwcDsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJBcnJheSBsb29rdXAgbG9jYXRpb249JXAgdHlwZT0lZCBpZD0lZFxuIiwgYS0+X19wdHIsIHR5cGUsIHBwLT5pZCkpOworICAgICAgICByZXR1cm4gcHAtPmlkOworICAgICAgfQorICAgIH0KKyAgfQorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFycmF5IGxvb2t1cCBsb2NhdGlvbj0lcCB0eXBlPSVkOiBub3QgZm91bmRcbiIsIGEtPl9fcHRyLCB0eXBlKSk7CisgIHJldHVybiAwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYmVnaW5fY291bnQoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXBfY2xyX2F0dHIoc29hcCk7CisgIHNvYXBfc2V0X2xvY2FsX25hbWVzcGFjZXMoc29hcCk7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpIHx8IChzb2FwLT5vbW9kZSAmIFNPQVBfRU5DX0RJTUUpKQorICAgIHNvYXAtPm1vZGUgPSBzb2FwLT5vbW9kZSB8IFNPQVBfSU9fTEVOR1RIIHwgU09BUF9FTkNfRElNRTsKKyAgZWxzZQorI2VuZGlmCisgIHsgc29hcC0+bW9kZSA9IHNvYXAtPm9tb2RlOworICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fU1RPUkUKKyAgICAgfHwgKCgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTksgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpKQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICAgICAgJiYgIXNvYXAtPmZwcmVwYXJlc2VuZAorI2VuZGlmCisgICAgICApKQorICAgICAgc29hcC0+bW9kZSAmPSB+U09BUF9JT19MRU5HVEg7CisgICAgZWxzZQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX0xFTkdUSDsKKyAgfQorI2lmZGVmIFdJVEhfWkxJQgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fRkxVU0gpCisgIHsgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpKQorICAgICAgc29hcC0+bW9kZSAmPSB+U09BUF9JT19MRU5HVEg7CisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fQlVGRkVSOworICAgIGVsc2UKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19TVE9SRTsKKyAgfQorI2VuZGlmCisgIGlmICghc29hcC0+ZW5jb2RpbmdTdHlsZSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9HUkFQSCkpCisgICAgc29hcC0+bW9kZSB8PSBTT0FQX1hNTF9UUkVFOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpKQorICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfTUlNRTsKKyAgZWxzZQorICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX01UT007CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkKKyAgICBzb2FwX3NlbGVjdF9taW1lX2JvdW5kYXJ5KHNvYXApOworICBzb2FwLT5kaW1lLmxpc3QgPSBzb2FwLT5kaW1lLmxhc3Q7CS8qIGtlZXAgdHJhY2sgb2YgbGFzdCBESU1FIGF0dGFjaG1lbnQgKi8KKyNlbmRpZgorICBzb2FwLT5jb3VudCA9IDA7CisgIHNvYXAtPm5zID0gMDsKKyAgc29hcC0+bnVsbCA9IDA7CisgIHNvYXAtPnBvc2l0aW9uID0gMDsKKyAgc29hcC0+bXVzdFVuZGVyc3RhbmQgPSAwOworICBzb2FwLT5lbmNvZGluZyA9IDA7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0JFR0lOOworICBzb2FwLT5pZG51bSA9IDA7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQmVnaW4gY291bnQgcGhhc2UgKHNvY2tldD0lZCBtb2RlPTB4JXggY291bnQ9JWx1KVxuIiwgc29hcC0+c29ja2V0LCBzb2FwLT5tb2RlLCAodW5zaWduZWQgbG9uZylzb2FwLT5jb3VudCkpOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzb2FwLT5kaW1lLmNvdW50ID0gMDsgLyogY291bnQgIyBvZiBhdHRhY2htZW50cyAqLworICBzb2FwLT5kaW1lLnNpemUgPSAwOyAvKiBhY2N1bXVsYXRlIHRvdGFsIHNpemUgb2YgYXR0YWNobWVudHMgKi8KKyAgaWYgKHNvYXAtPmZwcmVwYXJlaW5pdCAmJiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pICE9IFNPQVBfSU9fU1RPUkUpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gc29hcC0+ZnByZXBhcmVpbml0KHNvYXApOyAgIAorI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VuZF9jb3VudChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5mcHJlcGFyZWZpbmFsKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IHNvYXAtPmZwcmVwYXJlZmluYWwoc29hcCk7CisjZW5kaWYKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgb2YgY291bnQgcGhhc2VcbiIpKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYmVnaW5fc2VuZChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICBzb2FwX2Nscl9hdHRyKHNvYXApOworICBzb2FwX3NldF9sb2NhbF9uYW1lc3BhY2VzKHNvYXApOworICBzb2FwLT5tb2RlID0gc29hcC0+b21vZGUgfCAoc29hcC0+bW9kZSAmIChTT0FQX0lPX0xFTkdUSCB8IFNPQVBfRU5DX0RJTUUpKTsKKyNpZmRlZiBXSVRIX1pMSUIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQikgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0ZMVVNIKQorICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWE1MKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX0JVRkZFUjsKKyAgICBlbHNlCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fU1RPUkU7CisgIH0KKyNlbmRpZgorI2lmZGVmIFdJVEhfVURQCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgeyBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX1hNTDsKKyAgICBpZiAoc29hcC0+Y291bnQgPiBTT0FQX0JVRkxFTikKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfVURQX0VSUk9SOworICB9CisjZW5kaWYKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19GTFVTSCAmJiBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICB7IGlmIChzb2FwLT5jb3VudCB8fCAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKSB8fCAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1hNTCkpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fQlVGRkVSOworICAgIGVsc2UKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19TVE9SRTsKKyAgfQorICBzb2FwLT5tb2RlICY9IH5TT0FQX0lPX0xFTkdUSDsKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19TVE9SRSkKKyAgICBzb2FwX25ld19ibG9jayhzb2FwKTsKKyAgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfSU9fS0VFUEFMSVZFKSkKKyAgICBzb2FwLT5rZWVwX2FsaXZlID0gMDsKKyAgaWYgKCFzb2FwLT5lbmNvZGluZ1N0eWxlICYmICEoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0dSQVBIKSkKKyAgICBzb2FwLT5tb2RlIHw9IFNPQVBfWE1MX1RSRUU7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pICYmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkpCisgIHsgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19NSU1FOworICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX0RJTUU7CisgIH0KKyAgZWxzZQorICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX01UT007CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkKKyAgICBzb2FwX3NlbGVjdF9taW1lX2JvdW5kYXJ5KHNvYXApOworI2lmZGVmIFdJTjMyCisjaWZuZGVmIFVOREVSX0NFCisjaWZuZGVmIFdJVEhfRkFTVENHSQorICBpZiAoIXNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpIC8qIFNldCB3aW4zMiBzdGRvdXQgb3Igc29hcC0+c2VuZGZkIHRvIEJJTkFSWSwgZS5nLiB0byBzdXBwb3J0IERJTUUgKi8KKyNpZmRlZiBfX0JPUkxBTkRDX18KKyAgICBzZXRtb2RlKChTT0FQX1NPQ0tFVClzb2FwLT5zZW5kZmQsIE9fQklOQVJZKTsKKyNlbHNlCisgICAgX3NldG1vZGUoKFNPQVBfU09DS0VUKXNvYXAtPnNlbmRmZCwgX09fQklOQVJZKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JTykKKyAgeyBzb2FwLT5idWZpZHggPSAwOworICAgIHNvYXAtPmJ1ZmxlbiA9IDA7CisgIH0KKyAgc29hcC0+Y2h1bmtzaXplID0gMDsKKyAgc29hcC0+bnMgPSAwOworICBzb2FwLT5udWxsID0gMDsKKyAgc29hcC0+cG9zaXRpb24gPSAwOworICBzb2FwLT5tdXN0VW5kZXJzdGFuZCA9IDA7CisgIHNvYXAtPmVuY29kaW5nID0gMDsKKyAgc29hcC0+aWRudW0gPSAwOworICBzb2FwLT5sZXZlbCA9IDA7CisjaWZkZWYgV0lUSF9aTElCCisgIHNvYXAtPnpfcmF0aW9fb3V0ID0gMS4wOworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKSAmJiBzb2FwLT56bGliX3N0YXRlICE9IFNPQVBfWkxJQl9ERUZMQVRFKQorICB7CisjaWZkZWYgV0lUSF9HWklQCisgICAgbWVtY3B5KHNvYXAtPnpfYnVmLCAiXDM3XDIxM1wxMFwwXDBcMFwwXDBcMFwzNzciLCAxMCk7CisgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZSopc29hcC0+el9idWYgKyAxMDsKKyAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgPSBTT0FQX0JVRkxFTiAtIDEwOworICAgIHNvYXAtPnpfY3JjID0gY3JjMzIoMEwsIE5VTEwsIDApOworICAgIGlmIChkZWZsYXRlSW5pdDIoJnNvYXAtPmRfc3RyZWFtLCBzb2FwLT56X2xldmVsLCBaX0RFRkxBVEVELCAtTUFYX1dCSVRTLCA4LCBaX0RFRkFVTFRfU1RSQVRFR1kpICE9IFpfT0spCisjZWxzZQorICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gKEJ5dGUqKXNvYXAtPnpfYnVmOworICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCA9IFNPQVBfQlVGTEVOOworICAgIGlmIChkZWZsYXRlSW5pdCgmc29hcC0+ZF9zdHJlYW0sIHNvYXAtPnpfbGV2ZWwpICE9IFpfT0spCisjZW5kaWYKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlZmxhdGUgaW5pdGlhbGl6ZWRcbiIpKTsKKyAgICBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX0RFRkxBVEU7CisgIH0KKyNlbmRpZgorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkJlZ2luIHNlbmQgcGhhc2UgKHNvY2tldD0lZCBtb2RlPTB4JXggY291bnQ9JWx1KVxuIiwgc29hcC0+c29ja2V0LCBzb2FwLT5tb2RlLCAodW5zaWduZWQgbG9uZylzb2FwLT5jb3VudCkpOworICBzb2FwLT5wYXJ0ID0gU09BUF9CRUdJTjsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPmZwcmVwYXJlaW5pdCAmJiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fU1RPUkUpCisgICAgc29hcC0+ZnByZXBhcmVpbml0KHNvYXApOyAgIAorI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZW1iZWRkZWQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnAsIGludCB0KQoreyBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgIGlmIChzb2FwX3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIHQsICZwcCkpCisgIHsgcHAtPm1hcmsxID0gMTsKKyAgICBwcC0+bWFyazIgPSAxOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW1iZWRkZWQgJXAgdHlwZT0lZCBtYXJrIHNldCB0byAxXG4iLCBwLCB0KSk7CisgIH0KK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWZlcmVuY2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnAsIGludCB0KQoreyBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgIGlmICghcCB8fCAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1RSRUUpKQorICAgIHJldHVybiAxOworICBpZiAoc29hcF9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCB0LCAmcHApKQorICB7IGlmIChwcC0+bWFyazEgPT0gMCkKKyAgICB7IHBwLT5tYXJrMSA9IDI7CisgICAgICBwcC0+bWFyazIgPSAyOworICAgIH0KKyAgfQorICBlbHNlIGlmIChzb2FwX3BvaW50ZXJfZW50ZXIoc29hcCwgcCwgTlVMTCwgMCwgdCwgJnBwKSkKKyAgeyBwcC0+bWFyazEgPSAwOworICAgIHBwLT5tYXJrMiA9IDA7CisgIH0KKyAgZWxzZQorICAgIHJldHVybiAxOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlZmVyZW5jZSAlcCB0eXBlPSVkICglZCAlZClcbiIsIHAsIHQsIChpbnQpcHAtPm1hcmsxLCAoaW50KXBwLT5tYXJrMikpOworICByZXR1cm4gcHAtPm1hcmsxOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2FycmF5X3JlZmVyZW5jZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCwgY29uc3Qgc3RydWN0IHNvYXBfYXJyYXkgKmEsIGludCBuLCBpbnQgdCkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgaWYgKCFwIHx8ICFhLT5fX3B0cikKKyAgICByZXR1cm4gMTsKKyAgaSA9IHNvYXBfYXJyYXlfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgYSwgbiwgdCwgJnBwKTsKKyAgaWYgKGkpCisgIHsgaWYgKHBwLT5tYXJrMSA9PSAwKQorICAgIHsgcHAtPm1hcmsxID0gMjsKKyAgICAgIHBwLT5tYXJrMiA9IDI7CisgICAgfQorICB9CisgIGVsc2UgaWYgKCFzb2FwX3BvaW50ZXJfZW50ZXIoc29hcCwgcCwgYSwgbiwgdCwgJnBwKSkKKyAgICByZXR1cm4gMTsKKyAgZWxzZQorICB7IHBwLT5tYXJrMSA9IDA7CisgICAgcHAtPm1hcmsyID0gMDsKKyAgfQorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFycmF5IHJlZmVyZW5jZSAlcCBwdHI9JXAgZGltPSVkIHR5cGU9JWQgKCVkICVkKVxuIiwgcCwgYS0+X19wdHIsIG4sIHQsIChpbnQpcHAtPm1hcmsxLCAoaW50KXBwLT5tYXJrMikpOworICByZXR1cm4gcHAtPm1hcmsxOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VtYmVkZGVkX2lkKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgaWQsIGNvbnN0IHZvaWQgKnAsIGludCB0KQoreyBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfVFJFRSkKKyAgICByZXR1cm4gaWQ7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW1iZWRkZWRfaWQgJXAgdHlwZT0lZCBpZD0lZFxuIiwgcCwgdCwgaWQpKTsKKyAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMSAmJiBzb2FwLT5lbmNvZGluZ1N0eWxlICYmICEoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0dSQVBIKSAmJiBzb2FwLT5wYXJ0ICE9IFNPQVBfSU5fSEVBREVSKQorICB7IGlmIChpZCA8IDApCisgICAgeyBpZCA9IHNvYXBfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgdCwgJnBwKTsKKyAgICAgIGlmIChpZCkKKyAgICAgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICAgICAgICBwcC0+bWFyazEgPSAyOworICAgICAgICBlbHNlCisgICAgICAgICAgcHAtPm1hcmsyID0gMjsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbWJlZGRlZF9pZCBtdWx0aXJlZiBpZD0lZCAlcCB0eXBlPSVkID0gKCVkICVkKVxuIiwgaWQsIHAsIHQsIChpbnQpcHAtPm1hcmsxLCAoaW50KXBwLT5tYXJrMikpOworICAgICAgfQorICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gaWQ7CisgIH0KKyAgaWYgKGlkIDwgMCkKKyAgICBpZCA9IHNvYXBfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgdCwgJnBwKTsKKyAgZWxzZSBpZiAoaWQgJiYgIXNvYXBfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgdCwgJnBwKSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKGlkICYmIHBwKQorICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgICBwcC0+bWFyazEgPSAxOworICAgIGVsc2UKKyAgICAgIHBwLT5tYXJrMiA9IDE7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbWJlZGRlZF9pZCBlbWJlZGRlZCByZWYgaWQ9JWQgJXAgdHlwZT0lZCA9ICglZCAlZClcbiIsIGlkLCBwLCB0LCAoaW50KXBwLT5tYXJrMSwgKGludClwcC0+bWFyazIpKTsKKyAgfQorICByZXR1cm4gaWQ7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfaXNfZW1iZWRkZWQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3BsaXN0ICpwcCkKK3sgaWYgKCFwcCkKKyAgICByZXR1cm4gMDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJcyBlbWJlZGRlZD8gJWQgJWRcbiIsIChpbnQpcHAtPm1hcmsxLCAoaW50KXBwLT5tYXJrMikpOworICBpZiAoc29hcC0+dmVyc2lvbiA9PSAxICYmIHNvYXAtPmVuY29kaW5nU3R5bGUgJiYgIShzb2FwLT5tb2RlICYgU09BUF9YTUxfR1JBUEgpICYmIHNvYXAtPnBhcnQgIT0gU09BUF9JTl9IRUFERVIpCisgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICAgIHJldHVybiBwcC0+bWFyazEgIT0gMDsKKyAgICByZXR1cm4gcHAtPm1hcmsyICE9IDA7CisgIH0KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICByZXR1cm4gcHAtPm1hcmsxID09IDE7CisgIHJldHVybiBwcC0+bWFyazIgPT0gMTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9pc19zaW5nbGUoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3BsaXN0ICpwcCkKK3sgaWYgKHNvYXAtPnBhcnQgPT0gU09BUF9JTl9IRUFERVIpCisgICAgcmV0dXJuIDE7CisgIGlmICghcHApCisgICAgcmV0dXJuIDA7CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgcmV0dXJuIHBwLT5tYXJrMSA9PSAwOworICByZXR1cm4gcHAtPm1hcmsyID09IDA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9lbWJlZGRlZChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGxpc3QgKnBwKQoreyBpZiAoIXBwKQorICAgIHJldHVybjsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICBwcC0+bWFyazEgPSAxOworICBlbHNlCisgICAgcHAtPm1hcmsyID0gMTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9hdHRhY2htZW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgdm9pZCAqcCwgY29uc3Qgc3RydWN0IHNvYXBfYXJyYXkgKmEsIGNvbnN0IGNoYXIgKmFpZCwgY29uc3QgY2hhciAqYXR5cGUsIGNvbnN0IGNoYXIgKmFvcHRpb25zLCBpbnQgbiwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpIAoreyBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgIGludCBpOworICBpZiAoIXAgfHwgIWEtPl9fcHRyIHx8ICghYWlkICYmICFhdHlwZSkpCisgICAgcmV0dXJuIHNvYXBfZWxlbWVudF9pZChzb2FwLCB0YWcsIGlkLCBwLCBhLCBuLCB0eXBlLCB0KTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJBdHRhY2htZW50IHRhZz0nJXMnIGlkPSclcycgKCVkKSB0eXBlPSclcydcbiIsIHRhZywgYWlkP2FpZDoiIiwgaWQsIGF0eXBlP2F0eXBlOiIiKSk7CisgIGkgPSBzb2FwX2FycmF5X3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIGEsIG4sIHQsICZwcCk7CisgIGlmICghaSkKKyAgeyBpID0gc29hcF9wb2ludGVyX2VudGVyKHNvYXAsIHAsIGEsIG4sIHQsICZwcCk7CisgICAgaWYgKCFpKQorICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKyAgaWYgKGlkIDw9IDApCisgICAgaWQgPSBpOworICBpZiAoIWFpZCkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1Ziwgc29hcC0+ZGltZV9pZF9mb3JtYXQsIGlkKTsKKyAgICBhaWQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT50bXBidWYpOworICB9CisgIC8qIEFkZCBNVE9NIHhvcDpJbmNsdWRlIGVsZW1lbnQgd2hlbiBuZWNlc3NhcnkgKi8KKyAgLyogVE9ETzogdGhpcyBjb2RlIHRvIGJlIG9ic29sZXRlZCB3aXRoIG5ldyBpbXBvcnQveG9wLmggY29udmVudGlvbnMgKi8KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkgJiYgc3RyY21wKHRhZywgInhvcDpJbmNsdWRlIikpCisgIHsgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCAwLCB0eXBlKQorICAgICB8fCBzb2FwX2VsZW1lbnRfaHJlZihzb2FwLCAieG9wOkluY2x1ZGUiLCAwLCAiaHJlZiIsIGFpZCkKKyAgICAgfHwgc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBlbHNlIGlmIChzb2FwX2VsZW1lbnRfaHJlZihzb2FwLCB0YWcsIDAsICJocmVmIiwgYWlkKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgIHsgaWYgKHBwLT5tYXJrMSAhPSAzKQorICAgIHsgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICAgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKQorICAgICAgICBjb250ZW50ID0gc29hcF9uZXdfbXVsdGlwYXJ0KHNvYXAsICZzb2FwLT5taW1lLmZpcnN0LCAmc29hcC0+bWltZS5sYXN0LCAoY2hhciopYS0+X19wdHIsIGEtPl9fc2l6ZSk7CisgICAgICBlbHNlCisgICAgICAgIGNvbnRlbnQgPSBzb2FwX25ld19tdWx0aXBhcnQoc29hcCwgJnNvYXAtPmRpbWUuZmlyc3QsICZzb2FwLT5kaW1lLmxhc3QsIChjaGFyKilhLT5fX3B0ciwgYS0+X19zaXplKTsKKyAgICAgIGlmICghY29udGVudCkKKyAgICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgaWYgKCFzdHJuY21wKGFpZCwgImNpZDoiLCA0KSkgLyogUkZDIDIxMTEgKi8KKyAgICAgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKQorICAgICAgICB7IGNoYXIgKnMgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc3RybGVuKGFpZCkgLSAxKTsKKwkgIGlmIChzKQorCSAgeyAqcyA9ICc8JzsKKwkgICAgc3RyY3B5KHMgKyAxLCBhaWQgKyA0KTsKKwkgICAgc3RyY2F0KHMsICI+Iik7CisJICAgIGNvbnRlbnQtPmlkID0gczsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIGNvbnRlbnQtPmlkID0gYWlkICsgNDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgY29udGVudC0+aWQgPSBhaWQ7CisgICAgICBjb250ZW50LT50eXBlID0gYXR5cGU7CisgICAgICBjb250ZW50LT5vcHRpb25zID0gYW9wdGlvbnM7CisgICAgICBjb250ZW50LT5lbmNvZGluZyA9IFNPQVBfTUlNRV9CSU5BUlk7CisgICAgICBwcC0+bWFyazEgPSAzOworICAgIH0KKyAgfQorICBlbHNlCisgICAgcHAtPm1hcmsyID0gMzsKKyAgcmV0dXJuIC0xOworfQorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZAorc29hcF9pbml0X2lodChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5pdGlhbGl6aW5nIElEIGhhc2h0YWJsZVxuIikpOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9JREhBU0g7IGkrKykKKyAgICBzb2FwLT5paHRbaV0gPSBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQKK3NvYXBfZnJlZV9paHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXAsICpwOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9mbGlzdCAqZnAsICpmcTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIElEIGhhc2h0YWJsZVxuIikpOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9JREhBU0g7IGkrKykKKyAgeyBmb3IgKGlwID0gc29hcC0+aWh0W2ldOyBpcDsgaXAgPSBwKQorICAgIHsgZm9yIChmcCA9IGlwLT5mbGlzdDsgZnA7IGZwID0gZnEpCisgICAgICB7IGZxID0gZnAtPm5leHQ7CisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBmcCk7CisgICAgICB9CisgICAgICBwID0gaXAtPm5leHQ7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgaXApOworICAgIH0KKyAgICBzb2FwLT5paHRbaV0gPSBOVUxMOworICB9Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcF9pbGlzdCAqCitTT0FQX0ZNQUMyCitzb2FwX2xvb2t1cChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgZm9yIChpcCA9IHNvYXAtPmlodFtzb2FwX2hhc2goaWQpXTsgaXA7IGlwID0gaXAtPm5leHQpCisgICAgaWYgKCFzdHJjbXAoaXAtPmlkLCBpZCkpCisgICAgICByZXR1cm4gaXA7CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorc3RydWN0IHNvYXBfaWxpc3QgKgorU09BUF9GTUFDMgorc29hcF9lbnRlcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQpCit7IHJlZ2lzdGVyIHNpemVfdCBoOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIGlwID0gKHN0cnVjdCBzb2FwX2lsaXN0KilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfaWxpc3QpICsgc3RybGVuKGlkKSk7CisgIGlmIChpcCkKKyAgeyBoID0gc29hcF9oYXNoKGlkKTsKKyAgICBzdHJjcHkoaXAtPmlkLCBpZCk7CisgICAgaXAtPm5leHQgPSBzb2FwLT5paHRbaF07CisgICAgc29hcC0+aWh0W2hdID0gaXA7CisgICAgcmV0dXJuIGlwOworICB9CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkKgorU09BUF9GTUFDMgorc29hcF9tYWxsb2Moc3RydWN0IHNvYXAgKnNvYXAsIHNpemVfdCBuKQoreyByZWdpc3RlciBjaGFyICpwOworICBpZiAoIW4pCisgICAgcmV0dXJuICh2b2lkKilTT0FQX05PTl9OVUxMOworICBpZiAoIXNvYXApCisgICAgcmV0dXJuIFNPQVBfTUFMTE9DKHNvYXAsIG4pOworICBuICs9ICgtKGxvbmcpbikgJiAoc2l6ZW9mKHZvaWQqKS0xKTsgLyogYWxpZ24gYXQgNC0sIDgtIG9yIDE2LWJ5dGUgYm91bmRhcnkgKi8KKyAgaWYgKCEocCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBuICsgc2l6ZW9mKHZvaWQqKSArIHNpemVvZihzaXplX3QpKSkpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICAvKiBrZWVwIGNoYWluIG9mIGFsbG9jZWQgY2VsbHMgZm9yIGxhdGVyIGRlc3RydWN0aW9uICovCisgIHNvYXAtPmFsbG9jZWQgPSAxOworICAqKHZvaWQqKikocCArIG4pID0gc29hcC0+YWxpc3Q7CisgICooc2l6ZV90KikocCArIG4gKyBzaXplb2Yodm9pZCopKSA9IG47CisgIHNvYXAtPmFsaXN0ID0gcCArIG47CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworc3RhdGljIHZvaWQKK3NvYXBfaW5pdF9taHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgKGludClTT0FQX1BUUkhBU0g7IGkrKykKKyAgICBzb2FwLT5taHRbaV0gPSBOVUxMOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworc3RhdGljIHZvaWQKK3NvYXBfZnJlZV9taHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9tbGlzdCAqbXAsICptcTsKKyAgZm9yIChpID0gMDsgaSA8IChpbnQpU09BUF9QVFJIQVNIOyBpKyspCisgIHsgZm9yIChtcCA9IHNvYXAtPm1odFtpXTsgbXA7IG1wID0gbXEpCisgICAgeyBtcSA9IG1wLT5uZXh0OworICAgICAgaWYgKG1wLT5saXZlKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzKCVkKTogbWFsbG9jKCkgPSAlcCBub3QgZnJlZWQgKG1lbW9yeSBsZWFrIG9yIGZvcmdvdCB0byBjYWxsIHNvYXBfZW5kKCk/KVxuIiwgbXAtPmZpbGUsIG1wLT5saW5lLCBtcC0+cHRyKTsKKyAgICAgIGZyZWUobXApOworICAgIH0KKyAgICBzb2FwLT5taHRbaV0gPSBOVUxMOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitTT0FQX0ZNQUMxCit2b2lkKgorU09BUF9GTUFDMgorc29hcF90cmFja19tYWxsb2Moc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBzaXplX3Qgc2l6ZSkKK3sgcmVnaXN0ZXIgdm9pZCAqcCA9IG1hbGxvYyhzaXplKTsKKyAgaWYgKHNvYXApCisgIHsgcmVnaXN0ZXIgaW50IGggPSBzb2FwX2hhc2hfcHRyKHApOworICAgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX21saXN0ICptcCA9IChzdHJ1Y3Qgc29hcF9tbGlzdCopbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc29hcF9tbGlzdCkpOworICAgIGlmIChzb2FwLT5mZGVidWdbU09BUF9JTkRFWF9URVNUXSkKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiJXMoJWQpOiBtYWxsb2MoJWx1KSA9ICVwXG4iLCBmaWxlLCBsaW5lLCAodW5zaWduZWQgbG9uZylzaXplLCBwKSk7CisgICAgbXAtPm5leHQgPSBzb2FwLT5taHRbaF07CisgICAgbXAtPnB0ciA9IHA7CisgICAgbXAtPmZpbGUgPSBmaWxlOworICAgIG1wLT5saW5lID0gbGluZTsKKyAgICBtcC0+bGl2ZSA9IDE7CisgICAgc29hcC0+bWh0W2hdID0gbXA7CisgIH0KKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3RyYWNrX2ZyZWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCB2b2lkICpwKQoreyByZWdpc3RlciBpbnQgaCA9IHNvYXBfaGFzaF9wdHIocCk7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX21saXN0ICptcDsKKyAgZm9yIChtcCA9IHNvYXAtPm1odFtoXTsgbXA7IG1wID0gbXAtPm5leHQpCisgICAgaWYgKG1wLT5wdHIgPT0gcCkKKyAgICAgIGJyZWFrOworICBpZiAobXApCisgIHsgaWYgKG1wLT5saXZlKQorICAgIHsgZnJlZShwKTsKKyAgICAgIGlmIChzb2FwLT5mZGVidWdbU09BUF9JTkRFWF9URVNUXSkKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIlcyglZCk6IGZyZWUoJXApXG4iLCBmaWxlLCBsaW5lLCBwKSk7CisgICAgICBtcC0+bGl2ZSA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMoJWQpOiBmcmVlKCVwKSBkb3VibGUgZnJlZSBvZiBwb2ludGVyIG1hbGxvY2VkIGF0ICVzKCVkKVxuIiwgZmlsZSwgbGluZSwgcCwgbXAtPmZpbGUsIG1wLT5saW5lKTsKKyAgfQorICBlbHNlCisgICAgZnByaW50ZihzdGRlcnIsICIlcyglZCk6IGZyZWUoJXApIHBvaW50ZXIgbm90IG1hbGxvY2VkXG4iLCBmaWxlLCBsaW5lLCBwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK3N0YXRpYyB2b2lkCitzb2FwX3RyYWNrX3VubGluayhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCkKK3sgcmVnaXN0ZXIgaW50IGggPSBzb2FwX2hhc2hfcHRyKHApOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9tbGlzdCAqbXA7CisgIGZvciAobXAgPSBzb2FwLT5taHRbaF07IG1wOyBtcCA9IG1wLT5uZXh0KQorICAgIGlmIChtcC0+cHRyID09IHApCisgICAgICBicmVhazsKKyAgaWYgKG1wKQorICAgIG1wLT5saXZlID0gMDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZGVhbGxvYyhzdHJ1Y3Qgc29hcCAqc29hcCwgdm9pZCAqcCkKK3sgaWYgKCFzb2FwKQorICAgIHJldHVybjsKKyAgaWYgKHApCisgIHsgcmVnaXN0ZXIgY2hhciAqKnE7CisgICAgZm9yIChxID0gKGNoYXIqKikmc29hcC0+YWxpc3Q7ICpxOyBxID0gKihjaGFyKioqKXEpCisgICAgeyBpZiAocCA9PSAodm9pZCopKCpxIC0gKihzaXplX3QqKSgqcSArIHNpemVvZih2b2lkKikpKSkKKyAgICAgIHsgKnEgPSAqKihjaGFyKioqKXE7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZWQgZGF0YSBhdCAlcFxuIiwgcCkpOworICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisgICAgc29hcF9kZWxldGUoc29hcCwgcCk7CisgIH0KKyAgZWxzZQorICB7IHJlZ2lzdGVyIGNoYXIgKnE7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIGFsbCBzb2FwX21hbGxvYygpIGRhdGFcbiIpKTsKKyAgICB3aGlsZSAoc29hcC0+YWxpc3QpCisgICAgeyBxID0gKGNoYXIqKXNvYXAtPmFsaXN0OworICAgICAgc29hcC0+YWxpc3QgPSAqKHZvaWQqKilxOworICAgICAgcSAtPSAqKHNpemVfdCopKHEgKyBzaXplb2Yodm9pZCopKTsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBxKTsKKyAgICB9CisgIH0KKyAgLyogd2UgbXVzdCBhc3N1bWUgdGhlc2Ugd2VyZSBkZWFsbG9jYXRlZDogKi8KKyAgc29hcC0+YWN0aW9uID0gTlVMTDsKKyAgc29hcC0+ZmF1bHQgPSBOVUxMOworICBzb2FwLT5oZWFkZXIgPSBOVUxMOworICBzb2FwLT51c2VyaWQgPSBOVUxMOworICBzb2FwLT5wYXNzd2QgPSBOVUxMOworICBzb2FwLT5hdXRocmVhbG0gPSBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzb2FwX2Nscl9taW1lKHNvYXApOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2RlbGV0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgdm9pZCAqcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfY2xpc3QgKipjcDsKKyAgaWYgKHNvYXBfY2hlY2tfc3RhdGUoc29hcCkpCisgICAgcmV0dXJuOworICBjcCA9ICZzb2FwLT5jbGlzdDsKKyAgaWYgKHApCisgIHsgd2hpbGUgKCpjcCkKKyAgICB7IGlmIChwID09ICgqY3ApLT5wdHIpCisgICAgICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2NsaXN0ICpxID0gKmNwOworICAgICAgICAqY3AgPSBxLT5uZXh0OworICAgICAgICBxLT5mZGVsZXRlKHEpOworICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGNwID0gJigqY3ApLT5uZXh0OworICAgIH0KKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBkZWFsbG9jIGRhdGEgJXA6IGFkZHJlc3Mgbm90IGluIGxpc3RcbiIsIHApKTsKKyAgfQorICBlbHNlCisgIHsgd2hpbGUgKCpjcCkKKyAgICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2NsaXN0ICpxID0gKmNwOworICAgICAgKmNwID0gcS0+bmV4dDsKKyAgICAgIGlmIChxLT5wdHIgPT0gKHZvaWQqKXNvYXAtPmZhdWx0KQorICAgICAgICBzb2FwLT5mYXVsdCA9IE5VTEw7IC8qIHRoaXMgd2FzIGRlYWxsb2NhdGVkICovCisgICAgICBlbHNlIGlmIChxLT5wdHIgPT0gKHZvaWQqKXNvYXAtPmhlYWRlcikKKyAgICAgICAgc29hcC0+aGVhZGVyID0gTlVMTDsgLyogdGhpcyB3YXMgZGVhbGxvY2F0ZWQgKi8KKyAgICAgIHEtPmZkZWxldGUocSk7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgcSk7CisgICAgfQorICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcF9jbGlzdCAqCitTT0FQX0ZNQUMyCitzb2FwX2xpbmsoc3RydWN0IHNvYXAgKnNvYXAsIHZvaWQgKnAsIGludCB0LCBpbnQgbiwgdm9pZCAoKmZkZWxldGUpKHN0cnVjdCBzb2FwX2NsaXN0KikpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2NsaXN0ICpjcDsKKyAgaWYgKChjcCA9IChzdHJ1Y3Qgc29hcF9jbGlzdCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2NsaXN0KSkpKQorICB7IGNwLT5uZXh0ID0gc29hcC0+Y2xpc3Q7CisgICAgY3AtPnR5cGUgPSB0OworICAgIGNwLT5zaXplID0gbjsgCisgICAgY3AtPnB0ciA9IHA7CisgICAgY3AtPmZkZWxldGUgPSBmZGVsZXRlOworICAgIHNvYXAtPmNsaXN0ID0gY3A7CisgIH0KKyAgcmV0dXJuIGNwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF91bmxpbmsoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnApCit7IHJlZ2lzdGVyIGNoYXIgKipxOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9jbGlzdCAqKmNwOworICBpZiAoIXNvYXAgfHwgIXApCisgICAgcmV0dXJuOworICBmb3IgKHEgPSAoY2hhcioqKSZzb2FwLT5hbGlzdDsgKnE7IHEgPSAqKGNoYXIqKiopcSkKKyAgeyBpZiAocCA9PSAodm9pZCopKCpxIC0gKihzaXplX3QqKSgqcSArIHNpemVvZih2b2lkKikpKSkKKyAgICB7ICpxID0gKiooY2hhcioqKilxOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVbmxpbmtlZCBkYXRhICVwXG4iLCBwKSk7CisjaWZkZWYgU09BUF9ERUJVRworICAgICAgc29hcF90cmFja191bmxpbmsoc29hcCwgcCk7CisjZW5kaWYKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgZm9yIChjcCA9ICZzb2FwLT5jbGlzdDsgKmNwOyBjcCA9ICYoKmNwKS0+bmV4dCkKKyAgeyBpZiAocCA9PSAoKmNwKS0+cHRyKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVbmxpbmtlZCBjbGFzcyBpbnN0YW5jZSAlcFxuIiwgcCkpOworICAgICAgcSA9IChjaGFyKiopKmNwOworICAgICAgKmNwID0gKCpjcCktPm5leHQ7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgcSk7CisgICAgICByZXR1cm47CisgICAgfQorICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2xvb2t1cF90eXBlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworICBpZiAoaWQgJiYgKmlkKQorICB7IGlwID0gc29hcF9sb29rdXAoc29hcCwgaWQpOworICAgIGlmIChpcCkKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTG9va3VwIGlkPSclcycgdHlwZT0lZFxuIiwgaWQsIGlwLT50eXBlKSk7CisgICAgICByZXR1cm4gaXAtPnR5cGU7CisgICAgfQorICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAibG9va3VwIHR5cGUgaWQ9JyVzJyBOT1QgRk9VTkQhIE5lZWQgdG8gZ2V0IGl0IGZyb20geHNpOnR5cGVcbiIsIGlkKSk7CisgIHJldHVybiAwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZCoKK1NPQVBfRk1BQzIKK3NvYXBfaWRfbG9va3VwKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgdm9pZCAqKnAsIGludCB0LCBzaXplX3QgbiwgdW5zaWduZWQgaW50IGspCit7IHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgdm9pZCAqKnE7CisgIGlmICghcCB8fCAhaWQgfHwgISppZCkKKyAgICByZXR1cm4gcDsKKyAgaXAgPSBzb2FwX2xvb2t1cChzb2FwLCBpZCk7IC8qIGxvb2t1cCBwb2ludGVyIHRvIGhhc2ggdGFibGUgZW50cnkgZm9yIHN0cmluZyBpZCAqLworICBpZiAoIWlwKQorICB7IGlwID0gc29hcF9lbnRlcihzb2FwLCBpZCk7IC8qIG5ldyBoYXNoIHRhYmxlIGVudHJ5IGZvciBzdHJpbmcgaWQgKi8KKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZvcndhcmRpbmcgZmlyc3QgaHJlZj0nJXMnIHR5cGU9JWQgJXAgKCV1IGJ5dGVzKVxuIiwgaWQsIHQsIHAsICh1bnNpZ25lZCBpbnQpbikpOworICAgIGlwLT50eXBlID0gdDsKKyAgICBpcC0+c2l6ZSA9IG47IAorICAgIGlwLT5saW5rID0gcDsKKyAgICBpcC0+Y29weSA9IE5VTEw7CisgICAgaXAtPmZsaXN0ID0gTlVMTDsKKyAgICBpcC0+cHRyID0gTlVMTDsKKyAgICBpcC0+bGV2ZWwgPSBrOworICAgICpwID0gTlVMTDsKKyAgfQorICBlbHNlIGlmIChpcC0+cHRyKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x2ZWQgaHJlZj0nJXMnIHR5cGU9JWQgbG9jYXRpb249JXAgKCV1IGJ5dGVzKVxuIiwgaWQsIHQsIGlwLT5wdHIsICh1bnNpZ25lZCBpbnQpbikpOworICAgIGlmIChpcC0+dHlwZSAhPSB0KQorICAgIHsgc3RyY3B5KHNvYXAtPmlkLCBpZCk7CisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfSFJFRjsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVHlwZSBpbmNvbXBhdGliaWxpdHk6IGlkIHR5cGU9JWQgaHJlZiB0eXBlPSVkXG4iLCBpcC0+dHlwZSwgdCkpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHdoaWxlIChpcC0+bGV2ZWwgPCBrKQorICAgIHsgcSA9ICh2b2lkKiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHZvaWQqKSk7ICAKKyAgICAgIGlmICghcSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAqcCA9ICh2b2lkKilxOworICAgICAgcCA9IHE7CisgICAgICBrLS07CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlc2NlbmRpbmcgb25lIGxldmVsLi4uXG4iKSk7CisgICAgfQorICAgICpwID0gaXAtPnB0cjsKKyAgfQorICBlbHNlIGlmIChpcC0+bGV2ZWwgPiBrKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x2aW5nIGxldmVsICV1IHBvaW50ZXJzIHRvIGhyZWY9JyVzJ1xuIiwgaXAtPmxldmVsLCBpZCkpOworICAgIHdoaWxlIChpcC0+bGV2ZWwgPiBrKQorICAgIHsgdm9pZCAqcywgKipyID0gJmlwLT5saW5rOworICAgICAgcSA9ICh2b2lkKiopaXAtPmxpbms7CisgICAgICB3aGlsZSAocSkKKyAgICAgIHsgKnIgPSAodm9pZCopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHZvaWQqKSk7CisgICAgICAgIHMgPSAqcTsKKyAgICAgICAgKnEgPSAqcjsKKyAgICAgICAgciA9ICh2b2lkKiopKnI7CisgICAgICAgIHEgPSAodm9pZCoqKXM7CisgICAgICB9CisgICAgICAqciA9IE5VTEw7CisgICAgICBpcC0+c2l6ZSA9IG47IAorICAgICAgaXAtPmNvcHkgPSBOVUxMOworICAgICAgaXAtPmxldmVsID0gaXAtPmxldmVsIC0gMTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVzY2VuZGluZyBvbmUgbGV2ZWwuLi5cbiIpKTsKKyAgICB9CisgICAgcSA9ICh2b2lkKiopaXAtPmxpbms7CisgICAgaXAtPmxpbmsgPSBwOworICAgICpwID0gKHZvaWQqKXE7CisgIH0KKyAgZWxzZQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRm9yd2FyZGVkIGhyZWY9JyVzJyB0eXBlPSVkIGxvY2F0aW9uPSVwICgldSBieXRlcylcbiIsIGlkLCB0LCBwLCAodW5zaWduZWQgaW50KW4pKTsKKyAgICB3aGlsZSAoaXAtPmxldmVsIDwgaykKKyAgICB7IHEgPSAodm9pZCoqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZih2b2lkKikpOyAgCisgICAgICAqcCA9IHE7CisgICAgICBwID0gcTsKKyAgICAgIGstLTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVzY2VuZGluZyBvbmUgbGV2ZWwuLi5cbiIpKTsKKyAgICB9CisgICAgcSA9ICh2b2lkKiopaXAtPmxpbms7CisgICAgaXAtPmxpbmsgPSBwOworICAgICpwID0gKHZvaWQqKXE7CisgIH0KKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkKgorU09BUF9GTUFDMgorc29hcF9pZF9mb3J3YXJkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpocmVmLCB2b2lkICpwLCBzaXplX3QgbGVuLCBpbnQgc3QsIGludCB0dCwgc2l6ZV90IG4sIHVuc2lnbmVkIGludCBrLCB2b2lkICgqZmNvcHkpKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBzaXplX3QsIGNvbnN0IHZvaWQqLCBzaXplX3QpKQoreyBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIGlmICghcCB8fCAhaHJlZiB8fCAhKmhyZWYpCisgICAgcmV0dXJuIHA7CisgIGlwID0gc29hcF9sb29rdXAoc29hcCwgaHJlZik7IC8qIGxvb2t1cCBwb2ludGVyIHRvIGhhc2ggdGFibGUgZW50cnkgZm9yIHN0cmluZyBpZCAqLworICBpZiAoIWlwKQorICB7IGlwID0gc29hcF9lbnRlcihzb2FwLCBocmVmKTsgLyogbmV3IGhhc2ggdGFibGUgZW50cnkgZm9yIHN0cmluZyBpZCAqLworICAgIGlwLT50eXBlID0gc3Q7CisgICAgaXAtPnNpemUgPSBuOworICAgIGlwLT5saW5rID0gTlVMTDsKKyAgICBpcC0+Y29weSA9IE5VTEw7CisgICAgaXAtPnB0ciA9IE5VTEw7CisgICAgaXAtPmxldmVsID0gMDsKKyAgICBpcC0+Zmxpc3QgPSBOVUxMOworICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJOZXcgZW50cnkgaHJlZj0nJXMnIHR5cGU9JWQgc2l6ZT0lbHUgbGV2ZWw9JWQgbG9jYXRpb249JXBcbiIsIGhyZWYsIHN0LCAodW5zaWduZWQgbG9uZyluLCBrLCBwKSk7CisgIH0KKyAgZWxzZSBpZiAoaXAtPnR5cGUgIT0gc3QgfHwgKGlwLT5sZXZlbCA9PSBrICYmIGlwLT5zaXplICE9IG4pKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVHlwZSBpbmNvbXBhdGliaWxpdHkgaWQ9JyVzJyBleHBlY3QgdHlwZT0lZCBzaXplPSVsdSBsZXZlbD0ldSBnb3QgdHlwZT0lZCBzaXplPSVsdVxuIiwgaHJlZiwgaXAtPnR5cGUsICh1bnNpZ25lZCBsb25nKWlwLT5zaXplLCBrLCBzdCwgKHVuc2lnbmVkIGxvbmcpbikpOworICAgIHN0cmNweShzb2FwLT5pZCwgaHJlZik7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0hSRUY7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKGZjb3B5IHx8IG4gPCBzaXplb2Yodm9pZCopIHx8ICpocmVmICE9ICcjJykKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9mbGlzdCAqZnAgPSAoc3RydWN0IHNvYXBfZmxpc3QqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9mbGlzdCkpOworICAgIGlmICghZnApCisgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZwLT5uZXh0ID0gaXAtPmZsaXN0OworICAgIGZwLT50eXBlID0gdHQ7CisgICAgZnAtPnB0ciA9IHA7CisgICAgZnAtPmxldmVsID0gazsKKyAgICBmcC0+bGVuID0gbGVuOworICAgIGlmIChmY29weSkKKyAgICAgIGZwLT5mY29weSA9IGZjb3B5OworICAgIGVsc2UKKyAgICAgIGZwLT5mY29weSA9IHNvYXBfZmNvcHk7CisgICAgaXAtPmZsaXN0ID0gZnA7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGb3J3YXJkaW5nIHR5cGU9JWQgKHRhcmdldCB0eXBlPSVkKSBzaXplPSVsdSBsb2NhdGlvbj0lcCBsZXZlbD0ldSBsZW49JWx1IGhyZWY9JyVzJ1xuIiwgc3QsIHR0LCAodW5zaWduZWQgbG9uZyluLCBwLCBrLCAodW5zaWduZWQgbG9uZylsZW4sIGhyZWYpKTsKKyAgfQorICBlbHNlCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGb3J3YXJkaW5nIGNvcHlpbmcgYWRkcmVzcyAlcCBmb3IgdHlwZT0lZCBocmVmPSclcydcbiIsIHAsIHN0LCBocmVmKSk7CisgICAgKih2b2lkKiopcCA9IGlwLT5jb3B5OworICAgIGlwLT5jb3B5ID0gcDsKKyAgfQorICByZXR1cm4gcDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZCoKK1NPQVBfRk1BQzIKK3NvYXBfaWRfZW50ZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCB2b2lkICpwLCBpbnQgdCwgc2l6ZV90IG4sIHVuc2lnbmVkIGludCBrLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICphcnJheVR5cGUsIHZvaWQgKigqZmluc3RhbnRpYXRlKShzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKSkKK3sKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgIHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyNlbmRpZgorICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW50ZXIgaWQ9JyVzJyB0eXBlPSVkIGxvYz0lcCBzaXplPSVsdSBsZXZlbD0ldVxuIiwgaWQsIHQsIHAsICh1bnNpZ25lZCBsb25nKW4sIGspKTsKKyAgc29hcC0+YWxsb2NlZCA9IDA7CisgIGlmICghcCkKKyAgeyBpZiAoZmluc3RhbnRpYXRlKQorICAgICAgcCA9IGZpbnN0YW50aWF0ZShzb2FwLCB0LCB0eXBlLCBhcnJheVR5cGUsICZuKTsKKyAgICBlbHNlCisgICAgICBwID0gc29hcF9tYWxsb2Moc29hcCwgbik7CisgICAgaWYgKHApCisgICAgICBzb2FwLT5hbGxvY2VkID0gMTsKKyAgfQorI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgaWYgKCFpZCB8fCAhKmlkKQorI2VuZGlmCisgICAgcmV0dXJuIHA7CisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICBpcCA9IHNvYXBfbG9va3VwKHNvYXAsIGlkKTsgLyogbG9va3VwIHBvaW50ZXIgdG8gaGFzaCB0YWJsZSBlbnRyeSBmb3Igc3RyaW5nIGlkICovCisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJMb29rdXAgZW50cnkgaWQ9JyVzIGZvciBsb2NhdGlvbj0lcCdcbiIsIGlkLCBwKSk7CisgIGlmICghaXApCisgIHsgaXAgPSBzb2FwX2VudGVyKHNvYXAsIGlkKTsgLyogbmV3IGhhc2ggdGFibGUgZW50cnkgZm9yIHN0cmluZyBpZCAqLworICAgIGlwLT50eXBlID0gdDsKKyAgICBpcC0+bGluayA9IE5VTEw7CisgICAgaXAtPmNvcHkgPSBOVUxMOworICAgIGlwLT5mbGlzdCA9IE5VTEw7CisgICAgaXAtPnNpemUgPSBuOworICAgIGlwLT5wdHIgPSBwOworICAgIGlwLT5sZXZlbCA9IGs7CisgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk5ldyBlbnRyeSBpZD0nJXMnIHR5cGU9JWQgc2l6ZT0lbHUgbGV2ZWw9JXUgbG9jYXRpb249JXBcbiIsIGlkLCB0LCAodW5zaWduZWQgbG9uZyluLCBrLCBwKSk7CisgIH0KKyAgZWxzZSBpZiAoKGlwLT50eXBlICE9IHQgfHwgKGlwLT5sZXZlbCA9PSBrICYmIGlwLT5zaXplICE9IG4pKSAmJiAoaXAtPmNvcHkgfHwgaXAtPmZsaXN0KSkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlR5cGUgaW5jb21wYXRpYmlsaXR5IGlkPSclcycgZXhwZWN0IHR5cGU9JWQgc2l6ZT0lbHUgbGV2ZWw9JXUgZ290IHR5cGU9JWQgc2l6ZT0lbHVcbiIsIGlkLCBpcC0+dHlwZSwgKHVuc2lnbmVkIGxvbmcpaXAtPnNpemUsIGssIHQsICh1bnNpZ25lZCBsb25nKW4pKTsKKyAgICBzdHJjcHkoc29hcC0+aWQsIGlkKTsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfSFJFRjsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBlbHNlIGlmIChpcC0+cHRyKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTXVsdGlwbHkgZGVmaW5lZCBpZD0nJXMnXG4iLCBpZCkpOworICAgIHN0cmNweShzb2FwLT5pZCwgaWQpOworICAgIHNvYXAtPmVycm9yID0gU09BUF9EVVBMSUNBVEVfSUQ7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZWxzZSAKKyAgeyBpcC0+c2l6ZSA9IG47CisgICAgaXAtPnB0ciA9IHA7CisgICAgaXAtPmxldmVsID0gazsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVwZGF0ZSBlbnRyeSBpZD0nJXMnIHR5cGU9JWQgbG9jYXRpb249JXAgc2l6ZT0lbHUgbGV2ZWw9JXVcbiIsIGlkLCB0LCBwLCAodW5zaWduZWQgbG9uZyluLCBrKSk7CisgIH0KKyAgcmV0dXJuIGlwLT5wdHI7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZmNvcHkoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdCwgaW50IHR0LCB2b2lkICpwLCBzaXplX3QgbGVuLCBjb25zdCB2b2lkICpxLCBzaXplX3QgbikKK3sgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHlpbmcgZGF0YSB0eXBlPSVkICh0YXJnZXQgdHlwZT0lZCkgJXAgLT4gJXAgKCVsdSBieXRlcylcbiIsIHN0LCB0dCwgcSwgcCwgKHVuc2lnbmVkIGxvbmcpbikpOworICBtZW1jcHkocCwgcSwgbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW5kX3NlbmQoc3RydWN0IHNvYXAgKnNvYXApCit7IAorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+ZGltZS5saXN0KQorICB7IC8qIFNPQVAgYm9keSByZWZlcmVuY2VkIGF0dGFjaG1lbnRzIG11c3QgYXBwZWFyIGZpcnN0ICovCisgICAgc29hcC0+ZGltZS5sYXN0LT5uZXh0ID0gc29hcC0+ZGltZS5maXJzdDsKKyAgICBzb2FwLT5kaW1lLmZpcnN0ID0gc29hcC0+ZGltZS5saXN0LT5uZXh0OworICAgIHNvYXAtPmRpbWUubGlzdC0+bmV4dCA9IE5VTEw7CisgICAgc29hcC0+ZGltZS5sYXN0ID0gc29hcC0+ZGltZS5saXN0OworICB9CisgIGlmIChzb2FwX3B1dGRpbWUoc29hcCkgfHwgc29hcF9wdXRtaW1lKHNvYXApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgc29hcC0+bWltZS5saXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGlzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmxhc3QgPSBOVUxMOworI2VuZGlmCisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIHNlbmRcbiIpKTsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSAvKiBuZWVkIHRvIGZsdXNoIHRoZSByZW1haW5pbmcgZGF0YSBpbiBidWZmZXIgKi8KKyAgeyBpZiAoc29hcF9mbHVzaChzb2FwKSkKKyNpZmRlZiBXSVRIX1pMSUIKKyAgICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQiAmJiBzb2FwLT56bGliX3N0YXRlID09IFNPQVBfWkxJQl9ERUZMQVRFKQorICAgICAgeyBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX05PTkU7CisgICAgICAgIGRlZmxhdGVFbmQoJnNvYXAtPmRfc3RyZWFtKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisjZWxzZQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2VuZGlmCisjaWZkZWYgV0lUSF9aTElCCisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKQorICAgIHsgaW50IHI7CisgICAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbiA9IDA7CisgICAgICBkbworICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlZmxhdGluZyByZW1haW5kZXJcbiIpKTsKKyAgICAgICAgciA9IGRlZmxhdGUoJnNvYXAtPmRfc3RyZWFtLCBaX0ZJTklTSCk7CisgICAgICAgIGlmIChzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgIT0gU09BUF9CVUZMRU4pCisgICAgICAgIHsgaWYgKHNvYXBfZmx1c2hfcmF3KHNvYXAsIHNvYXAtPnpfYnVmLCBTT0FQX0JVRkxFTiAtIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCkpCisgICAgICAgICAgeyBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX05PTkU7CisgICAgICAgICAgICBkZWZsYXRlRW5kKCZzb2FwLT5kX3N0cmVhbSk7CisgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisJICB9CisgICAgICAgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZSopc29hcC0+el9idWY7CisgICAgICAgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0ID0gU09BUF9CVUZMRU47CisgICAgICAgIH0KKyAgICAgIH0gd2hpbGUgKHIgPT0gWl9PSyk7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlZmxhdGVkICVsdS0+JWx1IGJ5dGVzXG4iLCBzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiwgc29hcC0+ZF9zdHJlYW0udG90YWxfb3V0KSk7CisgICAgICBzb2FwLT56X3JhdGlvX291dCA9IChmbG9hdClzb2FwLT5kX3N0cmVhbS50b3RhbF9vdXQgLyAoZmxvYXQpc29hcC0+ZF9zdHJlYW0udG90YWxfaW47CisgICAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0VOQ19aTElCOworICAgICAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9OT05FOworICAgICAgaWYgKGRlZmxhdGVFbmQoJnNvYXAtPmRfc3RyZWFtKSAhPSBaX09LIHx8IHIgIT0gWl9TVFJFQU1fRU5EKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVuYWJsZSB0byBlbmQgZGVmbGF0ZTogJXNcbiIsIHNvYXAtPmRfc3RyZWFtLm1zZz9zb2FwLT5kX3N0cmVhbS5tc2c6IiIpKTsKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgfQorI2lmZGVmIFdJVEhfR1pJUAorICAgICAgc29hcC0+el9idWZbMF0gPSBzb2FwLT56X2NyYyAmIDB4RkY7CisgICAgICBzb2FwLT56X2J1ZlsxXSA9IChzb2FwLT56X2NyYyA+PiA4KSAmIDB4RkY7CisgICAgICBzb2FwLT56X2J1ZlsyXSA9IChzb2FwLT56X2NyYyA+PiAxNikgJiAweEZGOworICAgICAgc29hcC0+el9idWZbM10gPSAoc29hcC0+el9jcmMgPj4gMjQpICYgMHhGRjsKKyAgICAgIHNvYXAtPnpfYnVmWzRdID0gc29hcC0+ZF9zdHJlYW0udG90YWxfaW4gJiAweEZGOworICAgICAgc29hcC0+el9idWZbNV0gPSAoc29hcC0+ZF9zdHJlYW0udG90YWxfaW4gPj4gOCkgJiAweEZGOworICAgICAgc29hcC0+el9idWZbNl0gPSAoc29hcC0+ZF9zdHJlYW0udG90YWxfaW4gPj4gMTYpICYgMHhGRjsKKyAgICAgIHNvYXAtPnpfYnVmWzddID0gKHNvYXAtPmRfc3RyZWFtLnRvdGFsX2luID4+IDI0KSAmIDB4RkY7CisgICAgICBpZiAoc29hcF9mbHVzaF9yYXcoc29hcCwgc29hcC0+el9idWYsIDgpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImd6aXAgY3JjMzI9JWx1XG4iLCAodW5zaWduZWQgbG9uZylzb2FwLT56X2NyYykpOworI2VuZGlmCisgICAgfQorI2VuZGlmCisgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19TVE9SRSkKKyAgICB7IGNoYXIgKnA7CisjaWZuZGVmIFdJVEhfTk9IVFRQCisgICAgICBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9FTkNfWE1MKSkKKyAgICAgIHsgc29hcC0+bW9kZS0tOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNlbmRpbmcgYnVmZmVyZWQgbWVzc2FnZSBvZiBsZW5ndGggJXVcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+Ymxpc3QtPnNpemUpKTsKKyAgICAgICAgaWYgKHNvYXAtPnN0YXR1cyA+PSBTT0FQX1BPU1QpCisgICAgICAgICAgc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdChzb2FwLCBzb2FwLT5lbmRwb2ludCwgc29hcC0+aG9zdCwgc29hcC0+cG9ydCwgc29hcC0+cGF0aCwgc29hcC0+YWN0aW9uLCBzb2FwLT5ibGlzdC0+c2l6ZSk7CisgICAgICAgIGVsc2UgaWYgKHNvYXAtPnN0YXR1cyAhPSBTT0FQX1NUT1ApCisgICAgICAgICAgc29hcC0+ZXJyb3IgPSBzb2FwLT5mcmVzcG9uc2Uoc29hcCwgc29hcC0+c3RhdHVzLCBzb2FwLT5ibGlzdC0+c2l6ZSk7CisgICAgICAgIGlmIChzb2FwLT5lcnJvciB8fCBzb2FwX2ZsdXNoKHNvYXApKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgc29hcC0+bW9kZSsrOworICAgICAgfQorI2VuZGlmCisgICAgICBmb3IgKHAgPSBzb2FwX2ZpcnN0X2Jsb2NrKHNvYXApOyBwOyBwID0gc29hcF9uZXh0X2Jsb2NrKHNvYXApKQorICAgICAgeyBEQkdNU0coU0VOVCwgcCwgc29hcF9ibG9ja19zaXplKHNvYXApKTsKKyAgICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZzZW5kKHNvYXAsIHAsIHNvYXBfYmxvY2tfc2l6ZShzb2FwKSkpKQorICAgICAgICB7IHNvYXBfZW5kX2Jsb2NrKHNvYXApOworICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc29hcF9lbmRfYmxvY2soc29hcCk7CisgICAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICAgIGVsc2UgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgICB7IERCR01TRyhTRU5ULCAiXHJcbjBcclxuXHJcbiIsIDcpOworICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZzZW5kKHNvYXAsICJcclxuMFxyXG5cclxuIiwgNykpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorI2VuZGlmCisgIH0KKyNpZmRlZiBXSVRIX1RDUEZJTgorI2lmZGVmIFdJVEhfT1BFTlNTTAorICBpZiAoIXNvYXAtPnNzbCAmJiBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpICYmICFzb2FwLT5rZWVwX2FsaXZlICYmICEoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgc29hcC0+ZnNodXRkb3duc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIDEpOyAvKiBTZW5kIFRDUCBGSU4gKi8KKyNlbHNlCisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpICYmICFzb2FwLT5rZWVwX2FsaXZlICYmICEoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgc29hcC0+ZnNodXRkb3duc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIDEpOyAvKiBTZW5kIFRDUCBGSU4gKi8KKyNlbmRpZgorI2VuZGlmCisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIG9mIHNlbmQgcGhhc2VcbiIpKTsKKyAgc29hcC0+b21vZGUgJj0gflNPQVBfWE1MX1NFQzsKKyAgc29hcC0+Y291bnQgPSAwOworICBzb2FwLT5wYXJ0ID0gU09BUF9FTkQ7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VuZF9yZWN2KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5wYXJ0ID0gU09BUF9FTkQ7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpICYmIHNvYXBfZ2V0ZGltZShzb2FwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHNvYXAtPmRpbWUubGlzdCA9IHNvYXAtPmRpbWUuZmlyc3Q7CisgIHNvYXAtPmRpbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmxhc3QgPSBOVUxMOworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKSAmJiBzb2FwX2dldG1pbWUoc29hcCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBzb2FwLT5taW1lLmxpc3QgPSBzb2FwLT5taW1lLmZpcnN0OworICBzb2FwLT5taW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5sYXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5ib3VuZGFyeSA9IE5VTEw7CisjZW5kaWYKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBvZiByZWNlaXZlIG1lc3NhZ2Ugb2tcbiIpKTsKKyNpZmRlZiBXSVRIX1pMSUIKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKQorICB7IHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX1pMSUI7CisgICAgbWVtY3B5KHNvYXAtPmJ1Ziwgc29hcC0+el9idWYsIFNPQVBfQlVGTEVOKTsKKyAgICBzb2FwLT5idWZpZHggPSAoY2hhciopc29hcC0+ZF9zdHJlYW0ubmV4dF9pbiAtIHNvYXAtPnpfYnVmOworICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPnpfYnVmbGVuOworICAgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfTk9ORTsKKyAgICBpZiAoaW5mbGF0ZUVuZCgmc29hcC0+ZF9zdHJlYW0pICE9IFpfT0spCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisjaWZkZWYgV0lUSF9HWklQCisgICAgaWYgKHNvYXAtPnpsaWJfaW4gPT0gU09BUF9aTElCX0daSVApCisgICAgeyBzb2FwX3djaGFyIGM7CisgICAgICBzaG9ydCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgIHsgaWYgKChpbnQpKGMgPSBzb2FwX2dldGNoYXIoc29hcCkpID09IEVPRikKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAgICAgc29hcC0+el9idWZbaV0gPSAoY2hhciljOworICAgICAgfQorICAgICAgaWYgKHNvYXAtPnpfY3JjICE9ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbMF0gfCAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzFdIDw8IDgpIHwgKCh1TG9uZykodW5zaWduZWQgY2hhcilzb2FwLT56X2J1ZlsyXSA8PCAxNikgfCAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzNdIDw8IDI0KSkpCisgICAgICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJHemlwIGVycm9yOiBjcmMgY2hlY2sgZmFpbGVkLCBtZXNzYWdlIGNvcnJ1cHRlZD8gKGNyYzMyPSVsdSlcbiIsICh1bnNpZ25lZCBsb25nKXNvYXAtPnpfY3JjKSk7CisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICAgIH0KKyAgICAgIGlmIChzb2FwLT5kX3N0cmVhbS50b3RhbF9vdXQgIT0gKCh1TG9uZykodW5zaWduZWQgY2hhcilzb2FwLT56X2J1Zls0XSB8ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbNV0gPDwgOCkgfCAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzZdIDw8IDE2KSB8ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbN10gPDwgMjQpKSkKKyAgICAgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkd6aXAgZXJyb3I6IGluY29ycmVjdCBtZXNzYWdlIGxlbmd0aFxuIikpOworICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgICB9CisgICAgfQorI2VuZGlmCisgIH0KKyNlbmRpZgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKQorICAgIHdoaWxlICgoaW50KXNvYXBfZ2V0Y2hhcihzb2FwKSAhPSBFT0YpIC8qIGFkdmFuY2UgdG8gbGFzdCBjaHVuayAqLworICAgICAgOworICBpZiAoc29hcC0+ZmRpc2Nvbm5lY3QgJiYgKHNvYXAtPmVycm9yID0gc29hcC0+ZmRpc2Nvbm5lY3Qoc29hcCkpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgIHJldHVybiBzb2FwX3Jlc29sdmUoc29hcCk7CisjZWxzZQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+eGxpc3QpCisgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9NSU1FX0hSRUY7CisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9ESU1FX0hSRUY7CisgIH0KKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9mcmVlKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzdHJ1Y3QgTmFtZXNwYWNlICpuczsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIG5hbWVzcGFjZSBzdGFja1xuIikpOworICB3aGlsZSAoc29hcC0+bmxpc3QpCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wID0gc29hcC0+bmxpc3QtPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPm5saXN0KTsKKyAgICBzb2FwLT5ubGlzdCA9IG5wOworICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZSBhbnkgcmVtYWluaW5nIHRlbXAgYmxvY2tzXG4iKSk7CisgIHdoaWxlIChzb2FwLT5ibGlzdCkKKyAgICBzb2FwX2VuZF9ibG9jayhzb2FwKTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIGF0dHJpYnV0ZSBzdG9yYWdlXG4iKSk7CisgIHdoaWxlIChzb2FwLT5hdHRyaWJ1dGVzKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqdHAgPSBzb2FwLT5hdHRyaWJ1dGVzLT5uZXh0OworICAgIGlmIChzb2FwLT5hdHRyaWJ1dGVzLT52YWx1ZSkKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5hdHRyaWJ1dGVzLT52YWx1ZSk7CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPmF0dHJpYnV0ZXMpOworICAgIHNvYXAtPmF0dHJpYnV0ZXMgPSB0cDsKKyAgfQorI2lmZGVmIFdJVEhfRkFTVAorICBpZiAoc29hcC0+bGFiYnVmKQorICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5sYWJidWYpOworICBzb2FwLT5sYWJidWYgPSBOVUxMOworICBzb2FwLT5sYWJsZW4gPSAwOworICBzb2FwLT5sYWJpZHggPSAwOworI2VuZGlmCisgIG5zID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlczsKKyAgaWYgKG5zKQorICB7IGZvciAoOyBucy0+aWQ7IG5zKyspCisgICAgeyBpZiAobnMtPm91dCkKKyAgICAgIHsgaWYgKHNvYXAtPmVuY29kaW5nU3R5bGUgPT0gbnMtPm91dCkKKyAgICAgICAgICBzb2FwLT5lbmNvZGluZ1N0eWxlID0gU09BUF9TVFJfRU9TOworICAgICAgICBTT0FQX0ZSRUUoc29hcCwgbnMtPm91dCk7CisgICAgICAgIG5zLT5vdXQgPSBOVUxMOworICAgICAgfQorICAgICAgaWYgKHNvYXAtPmVuY29kaW5nU3R5bGUgPT0gbnMtPm5zKQorICAgICAgICBzb2FwLT5lbmNvZGluZ1N0eWxlID0gU09BUF9TVFJfRU9TOworICAgIH0KKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+bG9jYWxfbmFtZXNwYWNlcyk7CisgICAgc29hcC0+bG9jYWxfbmFtZXNwYWNlcyA9IE5VTEw7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgd2hpbGUgKHNvYXAtPnhsaXN0KQorICB7IHN0cnVjdCBzb2FwX3hsaXN0ICp4cCA9IHNvYXAtPnhsaXN0LT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT54bGlzdCk7CisgICAgc29hcC0+eGxpc3QgPSB4cDsKKyAgfQorI2VuZGlmCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICBzb2FwX2ZyZWVfcGh0KHNvYXApOworICBzb2FwX2ZyZWVfaWh0KHNvYXApOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitzdGF0aWMgdm9pZAorc29hcF9pbml0X2xvZ3Moc3RydWN0IHNvYXAgKnNvYXApCit7IGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9NQVhMT0dTOyBpKyspCisgIHsgc29hcC0+bG9nZmlsZVtpXSA9IE5VTEw7CisgICAgc29hcC0+ZmRlYnVnW2ldID0gTlVMTDsKKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgIWRlZmluZWQoV0lUSF9MRUFOKSB8fCBkZWZpbmVkKFNPQVBfREVCVUcpCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX29wZW5fbG9nZmlsZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGkpCit7IGlmIChzb2FwLT5sb2dmaWxlW2ldKQorICAgIHNvYXAtPmZkZWJ1Z1tpXSA9IGZvcGVuKHNvYXAtPmxvZ2ZpbGVbaV0sIGkgPCAyID8gImFiIiA6ICJhIik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitzdGF0aWMgdm9pZAorc29hcF9jbG9zZV9sb2dmaWxlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgaSkKK3sgaWYgKHNvYXAtPmZkZWJ1Z1tpXSkKKyAgeyBmY2xvc2Uoc29hcC0+ZmRlYnVnW2ldKTsKKyAgICBzb2FwLT5mZGVidWdbaV0gPSBOVUxMOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2Nsb3NlX2xvZ2ZpbGVzKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfTUFYTE9HUzsgaSsrKQorICAgIHNvYXBfY2xvc2VfbG9nZmlsZShzb2FwLCBpKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK3N0YXRpYyB2b2lkCitzb2FwX3NldF9sb2dmaWxlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgaSwgY29uc3QgY2hhciAqbG9nZmlsZSkKK3sgY2hhciAqcyA9IE5VTEw7CisgIHNvYXBfY2xvc2VfbG9nZmlsZShzb2FwLCBpKTsKKyAgaWYgKHNvYXAtPmxvZ2ZpbGVbaV0pCisgICAgU09BUF9GUkVFKHNvYXAsICh2b2lkKilzb2FwLT5sb2dmaWxlW2ldKTsKKyAgaWYgKGxvZ2ZpbGUpCisgICAgaWYgKChzID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihsb2dmaWxlKSArIDEpKSkKKyAgICAgIHN0cmNweShzLCBsb2dmaWxlKTsKKyAgc29hcC0+bG9nZmlsZVtpXSA9IHM7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9yZWN2X2xvZ2ZpbGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmxvZ2ZpbGUpCit7IHNvYXBfc2V0X2xvZ2ZpbGUoc29hcCwgU09BUF9JTkRFWF9SRUNWLCBsb2dmaWxlKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X3NlbnRfbG9nZmlsZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbG9nZmlsZSkKK3sgc29hcF9zZXRfbG9nZmlsZShzb2FwLCBTT0FQX0lOREVYX1NFTlQsIGxvZ2ZpbGUpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfdGVzdF9sb2dmaWxlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpsb2dmaWxlKQoreyBzb2FwX3NldF9sb2dmaWxlKHNvYXAsIFNPQVBfSU5ERVhfVEVTVCwgbG9nZmlsZSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcCoKK1NPQVBfRk1BQzIKK3NvYXBfY29weShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmV0dXJuIHNvYXBfY29weV9jb250ZXh0KChzdHJ1Y3Qgc29hcCopbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc29hcCkpLCBzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwKgorU09BUF9GTUFDMgorc29hcF9jb3B5X2NvbnRleHQoc3RydWN0IHNvYXAgKmNvcHksIHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcF9jaGVja19zdGF0ZShzb2FwKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKGNvcHkpCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGx1Z2luICpwOworICAgIG1lbWNweShjb3B5LCBzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXApKTsKKyAgICBjb3B5LT5zdGF0ZSA9IFNPQVBfQ09QWTsKKyAgICBjb3B5LT51c2VyID0gTlVMTDsKKyAgICBjb3B5LT5lcnJvciA9IFNPQVBfT0s7CisgICAgY29weS0+dXNlcmlkID0gTlVMTDsKKyAgICBjb3B5LT5wYXNzd2QgPSBOVUxMOworICAgIGNvcHktPm5saXN0ID0gTlVMTDsKKyAgICBjb3B5LT5ibGlzdCA9IE5VTEw7CisgICAgY29weS0+Y2xpc3QgPSBOVUxMOworICAgIGNvcHktPmFsaXN0ID0gTlVMTDsKKyAgICBjb3B5LT5hdHRyaWJ1dGVzID0gTlVMTDsKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgICBjb3B5LT5sYWJidWYgPSBOVUxMOworICAgIGNvcHktPmxhYmxlbiA9IDA7CisgICAgY29weS0+bGFiaWR4ID0gMDsKKyNlbmRpZgorI2lmZGVmIFNPQVBfREVCVUcKKyAgICBzb2FwX2luaXRfbWh0KGNvcHkpOworI2VuZGlmCisgICAgY29weS0+bG9jYWxfbmFtZXNwYWNlcyA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICAgIHNvYXBfaW5pdF9paHQoY29weSk7CisgICAgc29hcF9pbml0X3BodChjb3B5KTsKKyNlbmRpZgorICAgIGNvcHktPmhlYWRlciA9IE5VTEw7CisgICAgY29weS0+ZmF1bHQgPSBOVUxMOworICAgIGNvcHktPmFjdGlvbiA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorI2lmZGVmIFdJVEhfQ09PS0lFUworICAgIGNvcHktPmNvb2tpZXMgPSBzb2FwX2NvcHlfY29va2llcyhjb3B5KTsKKyNlbHNlCisgICAgY29weS0+Y29va2llcyA9IE5VTEw7CisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIFNPQVBfREVCVUcKKyAgICBzb2FwX2luaXRfbG9ncyhjb3B5KTsKKyAgICBzb2FwX3NldF9yZWN2X2xvZ2ZpbGUoY29weSwgc29hcC0+bG9nZmlsZVtTT0FQX0lOREVYX1JFQ1ZdKTsKKyAgICBzb2FwX3NldF9zZW50X2xvZ2ZpbGUoY29weSwgc29hcC0+bG9nZmlsZVtTT0FQX0lOREVYX1NFTlRdKTsKKyAgICBzb2FwX3NldF90ZXN0X2xvZ2ZpbGUoY29weSwgc29hcC0+bG9nZmlsZVtTT0FQX0lOREVYX1RFU1RdKTsKKyNlbmRpZgorICAgIGNvcHktPnBsdWdpbnMgPSBOVUxMOworICAgIGZvciAocCA9IHNvYXAtPnBsdWdpbnM7IHA7IHAgPSBwLT5uZXh0KQorICAgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGx1Z2luICpxID0gKHN0cnVjdCBzb2FwX3BsdWdpbiopU09BUF9NQUxMT0MoY29weSwgc2l6ZW9mKHN0cnVjdCBzb2FwX3BsdWdpbikpOworICAgICAgaWYgKCFxKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weWluZyBwbHVnaW4gJyVzJ1xuIiwgcC0+aWQpKTsKKyAgICAgICpxID0gKnA7CisgICAgICBpZiAocC0+ZmNvcHkgJiYgKHNvYXAtPmVycm9yID0gcC0+ZmNvcHkoY29weSwgcSwgcCkpKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBjb3B5IHBsdWdpbiAnJXMnXG4iLCBwLT5pZCkpOworICAgICAgICBTT0FQX0ZSRUUoY29weSwgcSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgcS0+bmV4dCA9IGNvcHktPnBsdWdpbnM7CisgICAgICBjb3B5LT5wbHVnaW5zID0gcTsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgIHJldHVybiBjb3B5OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9pbml0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5zdGF0ZSA9IFNPQVBfSU5JVDsKKyAgc29hcC0+dmVyc2lvbiA9IDA7CisgIHNvYXBfaW1vZGUoc29hcCwgU09BUF9JT19ERUZBVUxUKTsKKyAgc29hcF9vbW9kZShzb2FwLCBTT0FQX0lPX0RFRkFVTFQpOworICBzb2FwLT5wbHVnaW5zID0gTlVMTDsKKyAgc29hcC0+dXNlciA9IE5VTEw7CisgIHNvYXAtPnVzZXJpZCA9IE5VTEw7CisgIHNvYXAtPnBhc3N3ZCA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTk9IVFRQCisgIHNvYXAtPmZwb3N0ID0gaHR0cF9wb3N0OworICBzb2FwLT5mZ2V0ID0gaHR0cF9nZXQ7CisgIHNvYXAtPmZmb3JtID0gTlVMTDsKKyAgc29hcC0+ZnBvc3RoZHIgPSBodHRwX3Bvc3RfaGVhZGVyOworICBzb2FwLT5mcmVzcG9uc2UgPSBodHRwX3Jlc3BvbnNlOworICBzb2FwLT5mcGFyc2UgPSBodHRwX3BhcnNlOworICBzb2FwLT5mcGFyc2VoZHIgPSBodHRwX3BhcnNlX2hlYWRlcjsKKyNlbmRpZgorICBzb2FwLT5mY29ubmVjdCA9IE5VTEw7CisgIHNvYXAtPmZkaXNjb25uZWN0ID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfSVBWNgorICBzb2FwLT5mcmVzb2x2ZSA9IHRjcF9nZXRob3N0OworI2Vsc2UKKyAgc29hcC0+ZnJlc29sdmUgPSBOVUxMOworI2VuZGlmCisgIHNvYXAtPmZhY2NlcHQgPSB0Y3BfYWNjZXB0OworICBzb2FwLT5mb3BlbiA9IHRjcF9jb25uZWN0OworICBzb2FwLT5mY2xvc2UgPSB0Y3BfZGlzY29ubmVjdDsKKyAgc29hcC0+ZmNsb3Nlc29ja2V0ID0gdGNwX2Nsb3Nlc29ja2V0OworICBzb2FwLT5mc2h1dGRvd25zb2NrZXQgPSB0Y3Bfc2h1dGRvd25zb2NrZXQ7CisgIHNvYXAtPmZzZW5kID0gZnNlbmQ7CisgIHNvYXAtPmZyZWN2ID0gZnJlY3Y7CisgIHNvYXAtPmZwb2xsID0gc29hcF9wb2xsOworI2Vsc2UKKyAgc29hcC0+Zm9wZW4gPSBOVUxMOworICBzb2FwLT5mY2xvc2UgPSBOVUxMOworICBzb2FwLT5mcG9sbCA9IE5VTEw7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcC0+ZnByZXBhcmVpbml0ID0gTlVMTDsKKyAgc29hcC0+ZnByZXBhcmVzZW5kID0gTlVMTDsKKyAgc29hcC0+ZnByZXBhcmVyZWN2ID0gTlVMTDsKKyAgc29hcC0+ZnByZXBhcmVmaW5hbCA9IE5VTEw7CisjZW5kaWYKKyAgc29hcC0+ZnNldGVycm9yID0gTlVMTDsKKyAgc29hcC0+Zmlnbm9yZSA9IE5VTEw7CisgIHNvYXAtPmZzZXJ2ZWxvb3AgPSBOVUxMOworICBzb2FwLT5mcGx1Z2luID0gZnBsdWdpbjsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcC0+ZmRpbWVyZWFkb3BlbiA9IE5VTEw7CisgIHNvYXAtPmZkaW1ld3JpdGVvcGVuID0gTlVMTDsKKyAgc29hcC0+ZmRpbWVyZWFkY2xvc2UgPSBOVUxMOworICBzb2FwLT5mZGltZXdyaXRlY2xvc2UgPSBOVUxMOworICBzb2FwLT5mZGltZXJlYWQgPSBOVUxMOworICBzb2FwLT5mZGltZXdyaXRlID0gTlVMTDsKKyNlbmRpZgorICBzb2FwLT5mbG9hdF9mb3JtYXQgPSAiJS44ZyI7IC8qIC44IHByZXNlcnZlcyBzaW5nbGUgRlAgcHJlY2lzaW9uIGFzIG11Y2ggYXMgcG9zc2libGUsIGJ1dCBtaWdodCBub3QgYmUgdmVyeSBlZmZpY2llbnQgKi8KKyAgc29hcC0+ZG91YmxlX2Zvcm1hdCA9ICIlLjE3bGciOyAvKiAuMTcgcHJlc2VydmVzIGRvdWJsZSBGUCBwcmVjaXNpb24gYXMgbXVjaCBhcyBwb3NzaWJsZSwgYnV0IG1pZ2h0IG5vdCBiZSB2ZXJ5IGVmZmljaWVudCAqLworICBzb2FwLT5kaW1lX2lkX2Zvcm1hdCA9ICJjaWQ6aWQlZCI7IC8qIGRlZmF1bHQgRElNRSBpZCBmb3JtYXQgKi8KKyAgc29hcC0+aHR0cF92ZXJzaW9uID0gIjEuMSI7CisgIHNvYXAtPmFjdG9yID0gTlVMTDsKKyAgc29hcC0+bWF4X2tlZXBfYWxpdmUgPSBTT0FQX01BWEtFRVBBTElWRTsKKyAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7CisgIHNvYXAtPnJlY3ZfdGltZW91dCA9IDA7CisgIHNvYXAtPnNlbmRfdGltZW91dCA9IDA7CisgIHNvYXAtPmNvbm5lY3RfdGltZW91dCA9IDA7CisgIHNvYXAtPmFjY2VwdF90aW1lb3V0ID0gMDsKKyAgc29hcC0+c29ja2V0X2ZsYWdzID0gMDsKKyAgc29hcC0+Y29ubmVjdF9mbGFncyA9IDA7CisgIHNvYXAtPmJpbmRfZmxhZ3MgPSAwOworICBzb2FwLT5hY2NlcHRfZmxhZ3MgPSAwOworICBzb2FwLT5pcCA9IDA7CisjaWZkZWYgV0lUSF9GQVNUCisgIHNvYXAtPmxhYmJ1ZiA9IE5VTEw7CisgIHNvYXAtPmxhYmxlbiA9IDA7CisgIHNvYXAtPmxhYmlkeCA9IDA7CisjZW5kaWYKKyAgc29hcC0+ZW5jb2RpbmdTdHlsZSA9IFNPQVBfU1RSX0VPUzsKKyNpZm5kZWYgV0lUSF9OT05BTUVTUEFDRVMKKyAgc29hcC0+bmFtZXNwYWNlcyA9IG5hbWVzcGFjZXM7CisjZWxzZQorICBzb2FwLT5uYW1lc3BhY2VzID0gTlVMTDsKKyNlbmRpZgorICBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzID0gTlVMTDsKKyAgc29hcC0+bmxpc3QgPSBOVUxMOworICBzb2FwLT5ibGlzdCA9IE5VTEw7CisgIHNvYXAtPmNsaXN0ID0gTlVMTDsKKyAgc29hcC0+YWxpc3QgPSBOVUxMOworICBzb2FwLT5hdHRyaWJ1dGVzID0gTlVMTDsKKyAgc29hcC0+aGVhZGVyID0gTlVMTDsKKyAgc29hcC0+ZmF1bHQgPSBOVUxMOworICBzb2FwLT5tYXN0ZXIgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICBzb2FwLT5zb2NrZXQgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICBzb2FwLT5vcyA9IE5VTEw7CisgIHNvYXAtPmlzID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcC0+ZG9tID0gTlVMTDsKKyAgc29hcC0+ZGltZS5saXN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGlzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmxhc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gTlVMTDsKKyAgc29hcC0+bWltZS5zdGFydCA9IE5VTEw7CisgIHNvYXAtPnhsaXN0ID0gTlVMTDsKKyNlbmRpZgorI2lmbmRlZiBVTkRFUl9DRQorICBzb2FwLT5yZWN2ZmQgPSAwOworICBzb2FwLT5zZW5kZmQgPSAxOworI2Vsc2UKKyAgc29hcC0+cmVjdmZkID0gc3RkaW47CisgIHNvYXAtPnNlbmRmZCA9IHN0ZG91dDsKKyNlbmRpZiAKKyAgc29hcC0+aG9zdFswXSA9ICdcMCc7CisgIHNvYXAtPnBvcnQgPSAwOworICBzb2FwLT5hY3Rpb24gPSBOVUxMOworICBzb2FwLT5wcm94eV9ob3N0ID0gTlVMTDsKKyAgc29hcC0+cHJveHlfcG9ydCA9IDgwODA7CisgIHNvYXAtPnByb3h5X3VzZXJpZCA9IE5VTEw7CisgIHNvYXAtPnByb3h5X3Bhc3N3ZCA9IE5VTEw7CisgIHNvYXAtPmF1dGhyZWFsbSA9IE5VTEw7CisgIHNvYXAtPnByb2xvZyA9IE5VTEw7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgIGlmICghc3NsX2luaXRfZG9uZSkKKyAgICBzb2FwX3NzbF9pbml0KCk7CisgIHNvYXAtPmZzc2xhdXRoID0gc3NsX2F1dGhfaW5pdDsKKyAgc29hcC0+ZnNzbHZlcmlmeSA9IHNzbF92ZXJpZnlfY2FsbGJhY2s7CisgIHNvYXAtPmJpbyA9IE5VTEw7CisgIHNvYXAtPnNzbCA9IE5VTEw7CisgIHNvYXAtPmN0eCA9IE5VTEw7CisgIHNvYXAtPnJlcXVpcmVfc2VydmVyX2F1dGggPSAwOworICBzb2FwLT5yZXF1aXJlX2NsaWVudF9hdXRoID0gMDsKKyAgc29hcC0+cnNhID0gMDsKKyAgc29hcC0+a2V5ZmlsZSA9IE5VTEw7CisgIHNvYXAtPnBhc3N3b3JkID0gTlVMTDsKKyAgc29hcC0+ZGhmaWxlID0gTlVMTDsKKyAgc29hcC0+Y2FmaWxlID0gTlVMTDsKKyAgc29hcC0+Y2FwYXRoID0gTlVMTDsKKyAgc29hcC0+Y3JsZmlsZSA9IE5VTEw7CisgIHNvYXAtPnJhbmRmaWxlID0gTlVMTDsKKyAgc29hcC0+c2Vzc2lvbiA9IE5VTEw7CisjZW5kaWYKKyNpZmRlZiBXSVRIX1pMSUIKKyAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9OT05FOworICBzb2FwLT56bGliX2luID0gU09BUF9aTElCX05PTkU7CisgIHNvYXAtPnpsaWJfb3V0ID0gU09BUF9aTElCX05PTkU7CisgIHNvYXAtPmRfc3RyZWFtLnphbGxvYyA9IE5VTEw7CisgIHNvYXAtPmRfc3RyZWFtLnpmcmVlID0gTlVMTDsKKyAgc29hcC0+ZF9zdHJlYW0ub3BhcXVlID0gTlVMTDsKKyAgc29hcC0+el9sZXZlbCA9IDY7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIHNvYXAtPmMxNG5pbmNsdWRlID0gTlVMTDsKKyAgc29hcC0+YzE0bmV4Y2x1ZGUgPSBOVUxMOworICBzb2FwLT5jb29raWVzID0gTlVMTDsKKyAgc29hcC0+Y29va2llX2RvbWFpbiA9IE5VTEw7CisgIHNvYXAtPmNvb2tpZV9wYXRoID0gTlVMTDsKKyAgc29hcC0+Y29va2llX21heCA9IDMyOworI2VuZGlmCisjaWZkZWYgU09BUF9ERUJVRworICBzb2FwX2luaXRfbWh0KHNvYXApOworICBzb2FwX2luaXRfbG9ncyhzb2FwKTsKKyAgc29hcF9zZXRfcmVjdl9sb2dmaWxlKHNvYXAsICJSRUNWLmxvZyIpOworICBzb2FwX3NldF9zZW50X2xvZ2ZpbGUoc29hcCwgIlNFTlQubG9nIik7CisgIHNvYXBfc2V0X3Rlc3RfbG9nZmlsZShzb2FwLCBOVUxMKTsKKyNlbmRpZgorI2lmZGVmIFdNV19SUE1fSU8KKyAgc29hcC0+cnBtcmVxaWQgPSBOVUxMOworI2VuZGlmCisjaWZkZWYgUEFMTQorICBwYWxtTmV0TGliT3BlbigpOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICBzb2FwX2luaXRfaWh0KHNvYXApOworICBzb2FwX2luaXRfcGh0KHNvYXApOworI2VuZGlmCisgIHNvYXBfYmVnaW4oc29hcCk7CisjaWZkZWYgU09BUF9ERUJVRworICBzb2FwX3NldF90ZXN0X2xvZ2ZpbGUoc29hcCwgIlRFU1QubG9nIik7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfaW5pdDEoc3RydWN0IHNvYXAgKnNvYXAsIHNvYXBfbW9kZSBtb2RlKQoreyBzb2FwX2luaXQyKHNvYXAsIG1vZGUsIG1vZGUpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9pbml0MihzdHJ1Y3Qgc29hcCAqc29hcCwgc29hcF9tb2RlIGltb2RlLCBzb2FwX21vZGUgb21vZGUpCit7IHNvYXBfaW5pdChzb2FwKTsKKyAgc29hcF9pbW9kZShzb2FwLCBpbW9kZSk7CisgIHNvYXBfb21vZGUoc29hcCwgb21vZGUpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9iZWdpbihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbml0aWFsaXppbmdcbiIpKTsKKyAgaWYgKCFzb2FwLT5rZWVwX2FsaXZlKQorICB7IHNvYXAtPmJ1ZmxlbiA9IDA7CisgICAgc29hcC0+YnVmaWR4ID0gMDsKKyAgfQorICBzb2FwLT5rZWVwX2FsaXZlID0gKCgoc29hcC0+aW1vZGUgfCBzb2FwLT5vbW9kZSkgJiBTT0FQX0lPX0tFRVBBTElWRSkgIT0gMCk7CisgIHNvYXAtPm51bGwgPSAwOworICBzb2FwLT5wb3NpdGlvbiA9IDA7CisgIHNvYXAtPmVuY29kaW5nID0gMDsKKyAgc29hcC0+bXVzdFVuZGVyc3RhbmQgPSAwOworICBzb2FwLT5tb2RlID0gMDsKKyAgc29hcC0+bnMgPSAwOworICBzb2FwLT5wYXJ0ID0gU09BUF9FTkQ7CisgIHNvYXAtPmFsbG9jZWQgPSAwOworICBzb2FwLT5jb3VudCA9IDA7CisgIHNvYXAtPmxlbmd0aCA9IDA7CisgIHNvYXAtPmNkYXRhID0gMDsKKyAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICBzb2FwLT5wZWVrZWQgPSAwOworICBzb2FwLT5haGVhZCA9IDA7CisgIHNvYXAtPmlkbnVtID0gMDsKKyAgc29hcC0+bGV2ZWwgPSAwOworICBzb2FwLT5lbmRwb2ludFswXSA9ICdcMCc7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXAtPmRpbWUuY2h1bmtzaXplID0gMDsKKyAgc29hcC0+ZGltZS5idWZsZW4gPSAwOworI2VuZGlmCisgIHNvYXBfZnJlZShzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZW5kKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9jbGlzdCAqY3A7CisgIGlmIChzb2FwX2NoZWNrX3N0YXRlKHNvYXApKQorICAgIHJldHVybjsKKyAgc29hcF9mcmVlKHNvYXApOworICBzb2FwX2RlYWxsb2Moc29hcCwgTlVMTCk7CisgIHdoaWxlIChzb2FwLT5jbGlzdCkKKyAgeyBjcCA9IHNvYXAtPmNsaXN0LT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5jbGlzdCk7CisgICAgc29hcC0+Y2xpc3QgPSBjcDsKKyAgfQorICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyNpZmRlZiBTT0FQX0RFQlVHCisgIHNvYXBfY2xvc2VfbG9nZmlsZXMoc29hcCk7CisjZW5kaWYKKyNpZmRlZiBQQUxNCisgIHBhbG1OZXRMaWJDbG9zZSgpOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X25hbWVzcGFjZXMoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBOYW1lc3BhY2UgKnApCit7IHJlZ2lzdGVyIHN0cnVjdCBOYW1lc3BhY2UgKm5zID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlczsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wLCAqbnEsICpucjsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGxldmVsID0gc29hcC0+bGV2ZWw7CisgIHNvYXAtPm5hbWVzcGFjZXMgPSBwOworICBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzID0gTlVMTDsKKyAgc29hcF9zZXRfbG9jYWxfbmFtZXNwYWNlcyhzb2FwKTsKKyAgLyogcmV2ZXJzZSB0aGUgbmFtZXNwYWNlIGxpc3QgKi8KKyAgbnAgPSBzb2FwLT5ubGlzdDsKKyAgc29hcC0+bmxpc3QgPSBOVUxMOworICBpZiAobnApCisgIHsgbnEgPSBucC0+bmV4dDsKKyAgICBucC0+bmV4dCA9IE5VTEw7CisgICAgd2hpbGUgKG5xKQorICAgIHsgbnIgPSBucS0+bmV4dDsKKyAgICAgIG5xLT5uZXh0ID0gbnA7CisgICAgICBucCA9IG5xOworICAgICAgbnEgPSBucjsKKyAgICB9CisgIH0KKyAgLyogdGhlbiBwdXNoIG9uIG5ldyBzdGFjayAqLworICB3aGlsZSAobnApCisgIHsgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKKyAgICBzb2FwLT5sZXZlbCA9IG5wLT5sZXZlbDsgLyogcHJlc2VydmUgZWxlbWVudCBuZXN0aW5nIGxldmVsICovCisgICAgcyA9IG5wLT5uczsKKyAgICBpZiAoIXMgJiYgbnAtPmluZGV4ID49IDAgJiYgbnMpCisgICAgeyBzID0gbnNbbnAtPmluZGV4XS5vdXQ7CisgICAgICBpZiAoIXMpCisgICAgICAgIHMgPSBuc1tucC0+aW5kZXhdLm5zOworICAgIH0KKyAgICBpZiAocyAmJiBzb2FwX3B1c2hfbmFtZXNwYWNlKHNvYXAsIG5wLT5pZCwgcykpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgbnEgPSBucDsKKyAgICBucCA9IG5wLT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBucSk7CisgIH0KKyAgaWYgKG5zKQorICB7IHJlZ2lzdGVyIGludCBpOworICAgIGZvciAoaSA9IDA7IG5zW2ldLmlkOyBpKyspCisgICAgeyBpZiAobnNbaV0ub3V0KQorICAgICAgeyBTT0FQX0ZSRUUoc29hcCwgbnNbaV0ub3V0KTsKKyAgICAgICAgbnNbaV0ub3V0ID0gTlVMTDsKKyAgICAgIH0KKyAgICB9CisgICAgU09BUF9GUkVFKHNvYXAsIG5zKTsKKyAgfQorICBzb2FwLT5sZXZlbCA9IGxldmVsOyAvKiByZXN0b3JlIGxldmVsICovCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfbG9jYWxfbmFtZXNwYWNlcyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXAtPm5hbWVzcGFjZXMgJiYgIXNvYXAtPmxvY2FsX25hbWVzcGFjZXMpCisgIHsgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IE5hbWVzcGFjZSAqbnMxOworICAgIHJlZ2lzdGVyIHN0cnVjdCBOYW1lc3BhY2UgKm5zMjsKKyAgICByZWdpc3RlciBzaXplX3QgbiA9IDE7CisgICAgZm9yIChuczEgPSBzb2FwLT5uYW1lc3BhY2VzOyBuczEtPmlkOyBuczErKykKKyAgICAgIG4rKzsKKyAgICBuICo9IHNpemVvZihzdHJ1Y3QgTmFtZXNwYWNlKTsKKyAgICBuczIgPSAoc3RydWN0IE5hbWVzcGFjZSopU09BUF9NQUxMT0Moc29hcCwgbik7CisgICAgaWYgKG5zMikKKyAgICB7IG1lbWNweShuczIsIHNvYXAtPm5hbWVzcGFjZXMsIG4pOworICAgICAgaWYgKG5zMlswXS5ucykKKyAgICAgIHsgaWYgKCFzdHJjbXAobnMyWzBdLm5zLCBzb2FwX2VudjEpKQorICAgICAgICAgIHNvYXAtPnZlcnNpb24gPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgc29hcC0+dmVyc2lvbiA9IDI7CisgICAgICB9CisgICAgICBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzID0gbnMyOworICAgIH0KKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIgKgorU09BUF9GTUFDMgorc29hcF9zdHJzZWFyY2goY29uc3QgY2hhciAqYmlnLCBjb25zdCBjaGFyICpsaXR0bGUpCit7IHNpemVfdCBuID0gc3RybGVuKGxpdHRsZSk7CisgIGNvbnN0IGNoYXIgKnMgPSBiaWc7CisgIHdoaWxlIChzKSAKKyAgeyBpZiAoIXN0cm5jbXAocywgbGl0dGxlLCBuKSAmJiAoc1tuXSA9PSAnXDAnIHx8IHNbbl0gPT0gJyAnKSkKKyAgICAgIHJldHVybiBzOworICAgIHMgPSBzdHJjaHIocywgJyAnKTsKKyAgICBpZiAocykKKyAgICAgIHMrKzsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIHN0cnVjdCBzb2FwX25saXN0ICoKK3NvYXBfbG9va3VwX25zKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHNpemVfdCBuKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnA7CisgIGZvciAobnAgPSBzb2FwLT5ubGlzdDsgbnA7IG5wID0gbnAtPm5leHQpCisgIHsgaWYgKCFzdHJuY21wKG5wLT5pZCwgdGFnLCBuKSAmJiAhbnAtPmlkW25dKQorICAgICAgcmV0dXJuIG5wOworICB9CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIHN0cnVjdCBzb2FwX25saXN0ICoKK3NvYXBfcHVzaF9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKm5zLCBzaG9ydCB1dGlsaXplZCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wOworICBzaXplX3QgbiwgazsKKyAgaWYgKHNvYXBfc3Ryc2VhcmNoKHNvYXAtPmMxNG5leGNsdWRlLCBpZCkpCisgICAgcmV0dXJuIE5VTEw7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUHVzaCBuYW1lc3BhY2UgYmluZGluZyAobGV2ZWw9JXUpICclcycgJyVzJ1xuIiwgc29hcC0+bGV2ZWwsIGlkLCBucz9uczoiIikpOworICBpZiAoIXV0aWxpemVkKQorICB7IGZvciAobnAgPSBzb2FwLT5ubGlzdDsgbnA7IG5wID0gbnAtPm5leHQpCisgICAgeyBpZiAoIXN0cmNtcChucC0+aWQsIGlkKSAmJiAoIW5wLT5ucyB8fCAhc3RyY21wKG5wLT5ucywgbnMpKSkKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChucCkKKyAgICB7IGlmIChucC0+aW5kZXggPT0gMSkKKyAgICAgICAgdXRpbGl6ZWQgPSBucC0+aW5kZXg7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgfQorICBuID0gc3RybGVuKGlkKTsKKyAgaWYgKG5zKQorICAgIGsgPSBzdHJsZW4obnMpOworICBlbHNlCisgICAgayA9IDA7CisgIG5wID0gKHN0cnVjdCBzb2FwX25saXN0KilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfbmxpc3QpICsgbiArIGsgKyAxKTsKKyAgaWYgKCFucCkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHJldHVybiBOVUxMOworICB9CisgIG5wLT5uZXh0ID0gc29hcC0+bmxpc3Q7CisgIHNvYXAtPm5saXN0ID0gbnA7CisgIHN0cmNweShucC0+aWQsIGlkKTsKKyAgaWYgKG5zKQorICB7IG5wLT5ucyA9IG5wLT5pZCArIG4gKyAxOworICAgIHN0cmNweShucC0+bnMsIG5zKTsKKyAgfQorICBlbHNlCisgICAgbnAtPm5zID0gTlVMTDsKKyAgbnAtPmxldmVsID0gc29hcC0+bGV2ZWw7CisgIG5wLT5pbmRleCA9IHV0aWxpemVkOworICByZXR1cm4gbnA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgdm9pZAorc29hcF91dGlsaXplX25zKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHNpemVfdCBuKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnAgPSBzb2FwX2xvb2t1cF9ucyhzb2FwLCB0YWcsIG4pOworICBpZiAobnApCisgIHsgaWYgKG5wLT5pbmRleCA9PSAwKQorICAgICAgc29hcF9wdXNoX25zKHNvYXAsIG5wLT5pZCwgbnAtPm5zLCAxKTsKKyAgfQorICBlbHNlCisgIHsgc3RybmNweShzb2FwLT50bXBidWYsIHRhZywgbik7CisgICAgc29hcC0+dG1wYnVmW25dID0gJ1wwJzsKKyAgICBzb2FwX3B1c2hfbnMoc29hcCwgc29hcC0+dG1wYnVmLCBOVUxMLCAxKTsKKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIHZvaWQKK3NvYXBfcG9wX25zKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwX3BvcF9uYW1lc3BhY2Uoc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnR5cGUpCit7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRWxlbWVudCBiZWdpbiB0YWc9JyVzJyBpZD0nJWQnIHR5cGU9JyVzJ1xuIiwgdGFnLCBpZCwgdHlwZT90eXBlOiIiKSk7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKmVsdCA9IChzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50KSk7CisgICAgaWYgKCFlbHQpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICBlbHQtPnNvYXAgPSBzb2FwOworICAgIGVsdC0+bmV4dCA9IE5VTEw7CisgICAgZWx0LT5wcm50ID0gc29hcC0+ZG9tOworICAgIGVsdC0+bmFtZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHRhZyk7CisgICAgZWx0LT5lbHRzID0gTlVMTDsKKyAgICBlbHQtPmF0dHMgPSBOVUxMOworICAgIGVsdC0+bnN0ciA9IE5VTEw7CisgICAgZWx0LT5kYXRhID0gTlVMTDsKKyAgICBlbHQtPndpZGUgPSBOVUxMOworICAgIGVsdC0+bm9kZSA9IE5VTEw7CisgICAgZWx0LT50eXBlID0gMDsKKyAgICBlbHQtPmhlYWQgPSBOVUxMOworICAgIGVsdC0+dGFpbCA9IE5VTEw7CisgICAgaWYgKHNvYXAtPmRvbSkKKyAgICB7IHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICpwID0gc29hcC0+ZG9tLT5lbHRzOworICAgICAgaWYgKHApCisgICAgICB7IHdoaWxlIChwLT5uZXh0KQorICAgICAgICAgIHAgPSBwLT5uZXh0OworICAgICAgICBwLT5uZXh0ID0gZWx0OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBzb2FwLT5kb20tPmVsdHMgPSBlbHQ7CisgICAgfQorICAgIHNvYXAtPmRvbSA9IGVsdDsKKyAgfQorICBlbHNlCisgIHsKKyNlbmRpZgorICAgIHNvYXAtPmxldmVsKys7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmICghc29hcC0+bnMpCisgICAgeyBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICAgICAgICYmIHNvYXBfc2VuZChzb2FwLCBzb2FwLT5wcm9sb2cgPyBzb2FwLT5wcm9sb2cgOiAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBlbHNlIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfSU5ERU5UKQorICAgIHsgaWYgKHNvYXAtPm5zID09IDEgJiYgc29hcF9zZW5kX3Jhdyhzb2FwLCBzb2FwX2luZGVudCwgc29hcC0+bGV2ZWwgPCBzaXplb2Yoc29hcF9pbmRlbnQpID8gc29hcC0+bGV2ZWwgOiBzaXplb2Yoc29hcF9pbmRlbnQpIC0gMSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHNvYXAtPmJvZHkgPSAxOworICAgIH0KKyNlbmRpZgorICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsICI8IiwgMSkKKyAgICAgfHwgc29hcF9zZW5kKHNvYXAsIHRhZykpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjaWZkZWYgV0lUSF9ET00KKyAgfQorI2VuZGlmCisgIGlmICghc29hcC0+bnMpCisgIHsgc3RydWN0IE5hbWVzcGFjZSAqbnM7CisgICAgZm9yIChucyA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXM7IG5zICYmIG5zLT5pZDsgbnMrKykKKyAgICB7IGlmICgqbnMtPmlkICYmIChucy0+b3V0IHx8IG5zLT5ucykpCisgICAgICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAieG1sbnM6JXMiLCBucy0+aWQpOworICAgICAgICBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgc29hcC0+dG1wYnVmLCBucy0+b3V0ID8gbnMtPm91dCA6IG5zLT5ucykpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgIH0gICAKKyAgfQorICBzb2FwLT5ucyA9IDE7IC8qIHN0YXJ0IHdpdGggMCBvciAyLCBidXQgc2hvdWxkIGJlIG9uZSB0byBjb250aW51ZSAqLworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgIHsgY29uc3QgY2hhciAqcyA9IHN0cmNocih0YWcsICc6Jyk7CisgICAgaWYgKHMpCisgICAgICBzb2FwX3V0aWxpemVfbnMoc29hcCwgdGFnLCBzIC0gdGFnKTsKKyAgfQorI2VuZGlmCisgIGlmIChpZCA+IDApCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJfJWQiLCBpZCk7CisgICAgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJpZCIsIHNvYXAtPnRtcGJ1ZikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHR5cGUgJiYgKnR5cGUpCisgIHsgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJ4c2k6dHlwZSIsIHR5cGUpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgICB7IGNvbnN0IGNoYXIgKnMgPSBzdHJjaHIodHlwZSwgJzonKTsKKyAgICAgIGlmIChzKQorICAgICAgICBzb2FwX3V0aWxpemVfbnMoc29hcCwgdHlwZSwgcyAtIHR5cGUpOworICAgIH0KKyNlbmRpZgorICB9CisgIGlmIChzb2FwLT5udWxsICYmIHNvYXAtPnBvc2l0aW9uID4gMCkKKyAgeyBpbnQgaTsKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIlslZCIsIHNvYXAtPnBvc2l0aW9uc1swXSk7CisgICAgZm9yIChpID0gMTsgaSA8IHNvYXAtPnBvc2l0aW9uOyBpKyspCisgICAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIHN0cmxlbihzb2FwLT50bXBidWYpLCAiLCVkIiwgc29hcC0+cG9zaXRpb25zW2ldKTsKKyAgICBzdHJjYXQoc29hcC0+dG1wYnVmLCAiXSIpOworICAgIGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAiU09BUC1FTkM6cG9zaXRpb24iLCBzb2FwLT50bXBidWYpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmIChzb2FwLT5tdXN0VW5kZXJzdGFuZCkKKyAgeyBpZiAoc29hcC0+YWN0b3IgJiYgKnNvYXAtPmFjdG9yKQorICAgIHsgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsIHNvYXAtPnZlcnNpb24gPT0gMiA/ICJTT0FQLUVOVjpyb2xlIiA6ICJTT0FQLUVOVjphY3RvciIsIHNvYXAtPmFjdG9yKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgIlNPQVAtRU5WOm11c3RVbmRlcnN0YW5kIiwgc29hcC0+dmVyc2lvbiA9PSAyID8gInRydWUiIDogIjEiKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBzb2FwLT5tdXN0VW5kZXJzdGFuZCA9IDA7CisgIH0KKyAgaWYgKHNvYXAtPmVuY29kaW5nKQorICB7IGlmIChzb2FwLT5lbmNvZGluZ1N0eWxlICYmIHNvYXAtPmxvY2FsX25hbWVzcGFjZXMpCisgICAgeyBpZiAoISpzb2FwLT5lbmNvZGluZ1N0eWxlKQorICAgICAgeyBpZiAoc29hcC0+bG9jYWxfbmFtZXNwYWNlc1sxXS5vdXQpCisgICAgICAgICAgc29hcC0+ZW5jb2RpbmdTdHlsZSA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbMV0ub3V0OworICAgICAgICBlbHNlCisgICAgICAgICAgc29hcC0+ZW5jb2RpbmdTdHlsZSA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbMV0ubnM7CisgICAgICB9CisgICAgICBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgIlNPQVAtRU5WOmVuY29kaW5nU3R5bGUiLCBzb2FwLT5lbmNvZGluZ1N0eWxlKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBzb2FwLT5lbmNvZGluZyA9IDA7CisgIH0KKyAgc29hcC0+bnVsbCA9IDA7CisgIHNvYXAtPnBvc2l0aW9uID0gMDsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9iZWdpbl9vdXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICp0eXBlKQoreyBpZiAoKnRhZyA9PSAnLScpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIGlmIChzb2FwX2VsZW1lbnQoc29hcCwgdGFnLCBpZCwgdHlwZSkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X3N0YXJ0X2VuZF9vdXQoc29hcCwgTlVMTCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCisjaWZuZGVmIEhBVkVfU1RSUkNIUgorU09BUF9GTUFDMQorY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfc3RycmNocihjb25zdCBjaGFyICpzLCBpbnQgdCkKK3sgcmVnaXN0ZXIgY2hhciAqciA9IE5VTEw7CisgIHdoaWxlICgqcykKKyAgICBpZiAoKnMrKyA9PSB0KQorICAgICAgciA9IChjaGFyKilzIC0gMTsKKyAgcmV0dXJuIHI7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKKyNpZm5kZWYgSEFWRV9TVFJUT0wKK1NPQVBfRk1BQzEKK2xvbmcKK1NPQVBfRk1BQzIKK3NvYXBfc3RydG9sKGNvbnN0IGNoYXIgKnMsIGNoYXIgKip0LCBpbnQgYikKK3sgcmVnaXN0ZXIgbG9uZyBuID0gMDsKKyAgcmVnaXN0ZXIgaW50IGM7CisgIHdoaWxlICgqcyA+IDAgJiYgKnMgPD0gMzIpCisgICAgcysrOworICBpZiAoYiA9PSAxMCkKKyAgeyBzaG9ydCBuZWcgPSAwOworICAgIGlmICgqcyA9PSAnLScpCisgICAgeyBzKys7CisgICAgICBuZWcgPSAxOworICAgIH0KKyAgICBlbHNlIGlmICgqcyA9PSAnKycpCisgICAgICBzKys7CisgICAgd2hpbGUgKChjID0gKnMpICYmIGMgPj0gJzAnICYmIGMgPD0gJzknKQorICAgIHsgaWYgKG4gPj0gMjE0NzQ4MzY0ICYmIChuID4gMjE0NzQ4MzY0IHx8IGMgPj0gJzgnKSkKKyAgICAgICAgYnJlYWs7CisgICAgICBuICo9IDEwOworICAgICAgbiArPSBjIC0gJzAnOworICAgICAgcysrOworICAgIH0KKyAgICBpZiAobmVnKQorICAgICAgbiA9IC1uOworICB9CisgIGVsc2UgLyogYiA9PSAxNiBhbmQgdmFsdWUgaXMgYWx3YXlzIHBvc2l0aXZlICovCisgIHsgd2hpbGUgKChjID0gKnMpKQorICAgIHsgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQorICAgICAgICBjIC09ICcwJzsKKyAgICAgIGVsc2UgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKQorICAgICAgICBjIC09ICdBJyAtIDEwOworICAgICAgZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCisgICAgICAgIGMgLT0gJ2EnIC0gMTA7CisgICAgICBpZiAobiA+IDB4MDdGRkZGRkYpCisgICAgICAgIGJyZWFrOworICAgICAgbiA8PD0gNDsKKyAgICAgIG4gKz0gYzsKKyAgICAgIHMrKzsKKyAgICB9CisgIH0KKyAgaWYgKHQpCisgICAgKnQgPSAoY2hhciopczsKKyAgcmV0dXJuIG47Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKKyNpZm5kZWYgSEFWRV9TVFJUT1VMCitTT0FQX0ZNQUMxCit1bnNpZ25lZCBsb25nCitTT0FQX0ZNQUMyCitzb2FwX3N0cnRvdWwoY29uc3QgY2hhciAqcywgY2hhciAqKnQsIGludCBiKQoreyB1bnNpZ25lZCBsb25nIG4gPSAwOworICByZWdpc3RlciBpbnQgYzsKKyAgd2hpbGUgKCpzID4gMCAmJiAqcyA8PSAzMikKKyAgICBzKys7CisgIGlmIChiID09IDEwKQorICB7IGlmICgqcyA9PSAnKycpCisgICAgICBzKys7CisgICAgd2hpbGUgKChjID0gKnMpICYmIGMgPj0gJzAnICYmIGMgPD0gJzknKQorICAgIHsgaWYgKG4gPj0gNDI5NDk2NzI5ICYmIChuID4gNDI5NDk2NzI5IHx8IGMgPj0gJzYnKSkKKyAgICAgICAgYnJlYWs7CisgICAgICBuICo9IDEwOworICAgICAgbiArPSBjIC0gJzAnOworICAgICAgcysrOworICAgIH0KKyAgfQorICBlbHNlIC8qIGIgPT0gMTYgKi8KKyAgeyB3aGlsZSAoKGMgPSAqcykpCisgICAgeyBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCisgICAgICAgIGMgLT0gJzAnOworICAgICAgZWxzZSBpZiAoYyA+PSAnQScgJiYgYyA8PSAnRicpCisgICAgICAgIGMgLT0gJ0EnIC0gMTA7CisgICAgICBlbHNlIGlmIChjID49ICdhJyAmJiBjIDw9ICdmJykKKyAgICAgICAgYyAtPSAnYScgLSAxMDsKKyAgICAgIGlmIChuID4gMHgwRkZGRkZGRikKKyAgICAgICAgYnJlYWs7CisgICAgICBuIDw8PSA0OworICAgICAgbiArPSBjOworICAgICAgcysrOworICAgIH0KKyAgfQorICBpZiAodCkKKyAgICAqdCA9IChjaGFyKilzOworICByZXR1cm4gbjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2FycmF5X2JlZ2luX291dChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKm9mZnNldCkKK3sgaWYgKHNvYXBfZWxlbWVudChzb2FwLCB0YWcsIGlkLCAiU09BUC1FTkM6QXJyYXkiKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgIHsgY29uc3QgY2hhciAqczsKKyAgICBzID0gc29hcF9zdHJyY2hyKHR5cGUsICdbJyk7CisgICAgaWYgKChzaXplX3QpKHMgLSB0eXBlKSA8IHNpemVvZihzb2FwLT50bXBidWYpKQorICAgIHsgc3RybmNweShzb2FwLT50bXBidWYsIHR5cGUsIHMgLSB0eXBlKTsKKyAgICAgIHNvYXAtPnRtcGJ1ZltzIC0gdHlwZV0gPSAnXDAnOworICAgICAgaWYgKHR5cGUgJiYgKnR5cGUgJiYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJTT0FQLUVOQzppdGVtVHlwZSIsIHNvYXAtPnRtcGJ1ZikpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBpZiAocyAmJiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgIlNPQVAtRU5DOmFycmF5U2l6ZSIsIHMgKyAxKSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7IGlmIChvZmZzZXQgJiYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJTT0FQLUVOQzpvZmZzZXQiLCBvZmZzZXQpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAodHlwZSAmJiAqdHlwZSAmJiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgIlNPQVAtRU5DOmFycmF5VHlwZSIsIHR5cGUpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHR5cGUgJiYgKnR5cGUgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpKQorICB7IGNvbnN0IGNoYXIgKnMgPSBzdHJjaHIodHlwZSwgJzonKTsKKyAgICBpZiAocykKKyAgICAgIHNvYXBfdXRpbGl6ZV9ucyhzb2FwLCB0eXBlLCBzIC0gdHlwZSk7CisgIH0KKyNlbmRpZgorICByZXR1cm4gc29hcF9lbGVtZW50X3N0YXJ0X2VuZF9vdXQoc29hcCwgTlVMTCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqdHA7CisjaWZkZWYgV0lUSF9ET00KKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAqKmF0dDsKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgYXR0ID0gJnNvYXAtPmRvbS0+YXR0czsKKyAgICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgICAgeyBpZiAodHAtPnZpc2libGUpCisgICAgICB7ICphdHQgPSAoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUpKTsKKwlpZiAoISphdHQpCisJICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKwkoKmF0dCktPm5leHQgPSBOVUxMOworICAgICAgICAoKmF0dCktPm5zdHIgPSBOVUxMOworICAgICAgICAoKmF0dCktPm5hbWUgPSBzb2FwX3N0cmR1cChzb2FwLCB0cC0+bmFtZSk7CisgICAgICAgICgqYXR0KS0+ZGF0YSA9IHNvYXBfc3RyZHVwKHNvYXAsIHRwLT52YWx1ZSk7CisgICAgICAgICgqYXR0KS0+d2lkZSA9IE5VTEw7CisgICAgICAgICgqYXR0KS0+c29hcCA9IHNvYXA7CisgICAgICAgIHRwLT52aXNpYmxlID0gMDsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgIHsgc3RydWN0IHNvYXBfbmxpc3QgKm5wOworICAgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgICB7IGlmICh0cC0+dmlzaWJsZSAmJiB0cC0+bmFtZSkKKyAgICAgIHsgY29uc3QgY2hhciAqcyA9IHN0cmNocih0cC0+bmFtZSwgJzonKTsKKyAgICAgICAgaWYgKHMpCisgICAgICAgICAgc29hcF91dGlsaXplX25zKHNvYXAsIHRwLT5uYW1lLCBzIC0gdHAtPm5hbWUpOworICAgICAgfQorICAgIH0KKyAgICBmb3IgKG5wID0gc29hcC0+bmxpc3Q7IG5wOyBucCA9IG5wLT5uZXh0KQorICAgIHsgaWYgKG5wLT5pbmRleCA9PSAxICYmIG5wLT5ucykKKyAgICAgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJ4bWxuczolcyIsIG5wLT5pZCk7CisgICAgICAgIHNvYXBfc2V0X2F0dHIoc29hcCwgc29hcC0+dG1wYnVmLCBucC0+bnMpOworICAgICAgICBucC0+aW5kZXggPSAyOworICAgICAgfQorICAgIH0KKyAgfQorI2VuZGlmCisgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgeyBpZiAodHAtPnZpc2libGUpCisgICAgeyBpZiAoc29hcF9zZW5kKHNvYXAsICIgIikgfHwgc29hcF9zZW5kKHNvYXAsIHRwLT5uYW1lKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgaWYgKHRwLT52aXNpYmxlID09IDIgJiYgdHAtPnZhbHVlKQorICAgICAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAiPVwiIiwgMikKKwkgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHRwLT52YWx1ZSwgMSkKKwkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiXCIiLCAxKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB0cC0+dmlzaWJsZSA9IDA7CisgICAgfQorICB9CisgIGlmICh0YWcpCisgIHsgCisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICAgIHsgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgIj4iLCAxKQorICAgICAgIHx8IHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZykpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgc29hcC0+bGV2ZWwtLTsJLyogZGVjcmVtZW50IGxldmVsIGp1c3QgYmVmb3JlIC8+ICovCisgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgIi8+IiwgMikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgIj4iLCAxKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X2VuZF9vdXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZykKK3sgaWYgKCp0YWcgPT0gJy0nKQorICAgIHJldHVybiBTT0FQX09LOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVsZW1lbnQgZW5kaW5nIHRhZz0nJXMnXG4iLCB0YWcpKTsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBpZiAoc29hcC0+ZG9tLT5wcm50KQorICAgICAgc29hcC0+ZG9tID0gc29hcC0+ZG9tLT5wcm50OworICAgIHJldHVybiBTT0FQX09LOworICB9CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICAgIHNvYXBfcG9wX25zKHNvYXApOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0lOREVOVCkKKyAgeyBpZiAoIXNvYXAtPmJvZHkpCisgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzb2FwX2luZGVudCwgc29hcC0+bGV2ZWwgPCBzaXplb2Yoc29hcF9pbmRlbnQpID8gc29hcC0+bGV2ZWwgOiBzaXplb2Yoc29hcF9pbmRlbnQpIC0gMSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgc29hcC0+Ym9keSA9IDA7CisgIH0KKyNlbmRpZgorICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAiPC8iLCAyKQorICAgfHwgc29hcF9zZW5kKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBzb2FwLT5sZXZlbC0tOwkvKiBkZWNyZW1lbnQgbGV2ZWwganVzdCBiZWZvcmUgPiAqLworICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCAiPiIsIDEpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfcmVmKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgaW50IGhyZWYpCit7IHJlZ2lzdGVyIGludCBuID0gMDsKKyAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgICBuID0gMTsKKyAgc3ByaW50Zihzb2FwLT5ocmVmLCAiI18lZCIsIGhyZWYpOworICByZXR1cm4gc29hcF9lbGVtZW50X2hyZWYoc29hcCwgdGFnLCBpZCwgImhyZWYiICsgbiwgc29hcC0+aHJlZiArIG4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfaHJlZihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnJlZiwgY29uc3QgY2hhciAqdmFsKQoreyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVsZW1lbnQgJyVzJyByZWZlcmVuY2UgJXM9JyVzJ1xuIiwgdGFnLCByZWYsIHZhbCkpOworICBpZiAoc29hcF9lbGVtZW50KHNvYXAsIHRhZywgaWQsIE5VTEwpCisgICB8fCBzb2FwX2F0dHJpYnV0ZShzb2FwLCByZWYsIHZhbCkKKyAgIHx8IHNvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHNvYXAsIHRhZykpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X251bGwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICp0eXBlKQoreyBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKnRwOworICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgICAgaWYgKHRwLT52aXNpYmxlKQorICAgICAgYnJlYWs7CisgIGlmICh0cCB8fCAoc29hcC0+dmVyc2lvbiA9PSAyICYmIHNvYXAtPnBvc2l0aW9uID4gMCkgfHwgaWQgPiAwIHx8IChzb2FwLT5tb2RlICYgU09BUF9YTUxfTklMKSkKKyAgeyBpZiAoc29hcF9lbGVtZW50KHNvYXAsIHRhZywgaWQsIHR5cGUpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmIChzb2FwLT5wYXJ0ICE9IFNPQVBfSU5fSEVBREVSICYmIHNvYXAtPmVuY29kaW5nU3R5bGUpCisgICAgICBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgInhzaTpuaWwiLCAidHJ1ZSIpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgcmV0dXJuIHNvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHNvYXAsIHRhZyk7CisgIH0KKyAgc29hcC0+bnVsbCA9IDE7CisgIHNvYXAtPnBvc2l0aW9uID0gMDsKKyAgc29hcC0+bXVzdFVuZGVyc3RhbmQgPSAwOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X2lkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgdm9pZCAqcCwgY29uc3Qgc3RydWN0IHNvYXBfYXJyYXkgKmEsIGludCBuLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkgCit7IGlmICghcCB8fCAoYSAmJiAhYS0+X19wdHIpKQorICB7IHNvYXBfZWxlbWVudF9udWxsKHNvYXAsIHRhZywgaWQsIHR5cGUpOworICAgIHJldHVybiAtMTsKKyAgfQorI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9UUkVFKQorICAgIHJldHVybiAwOworICBpZiAoaWQgPCAwKQorICB7IHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgICBpZiAoYSkKKyAgICAgIGlkID0gc29hcF9hcnJheV9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCBhLCBuLCB0LCAmcHApOworICAgIGVsc2UKKyAgICAgIGlkID0gc29hcF9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCB0LCAmcHApOworICAgIGlmIChpZCkKKyAgICB7IGlmIChzb2FwX2lzX2VtYmVkZGVkKHNvYXAsIHBwKSkKKyAgICAgIHsgc29hcF9lbGVtZW50X3JlZihzb2FwLCB0YWcsIDAsIGlkKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgaWYgKHNvYXBfaXNfc2luZ2xlKHNvYXAsIHBwKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICBzb2FwX3NldF9lbWJlZGRlZChzb2FwLCBwcCk7CisgICAgfQorICB9CisgIHJldHVybiBpZDsKKyNlbHNlCisgIHJldHVybiAwOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9yZXN1bHQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZykKK3sgaWYgKHNvYXAtPnZlcnNpb24gPT0gMiAmJiBzb2FwLT5lbmNvZGluZ1N0eWxlKQorICAgIGlmIChzb2FwX2VsZW1lbnQoc29hcCwgIlNPQVAtUlBDOnJlc3VsdCIsIDAsIE5VTEwpCisgICAgIHx8IHNvYXBfYXR0cmlidXRlKHNvYXAsICJ4bWxuczpTT0FQLVJQQyIsIHNvYXBfcnBjKQorICAgICB8fCBzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzb2FwLCBOVUxMKQorICAgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgdGFnLCAwKQorICAgICB8fCBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCAiU09BUC1SUEM6cmVzdWx0IikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2F0dHJpYnV0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7IAorI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgKmEgPSAoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUpKTsKKyAgICBhLT5uZXh0ID0gc29hcC0+ZG9tLT5hdHRzOworICAgIGEtPm5zdHIgPSBOVUxMOworICAgIGEtPm5hbWUgPSBzb2FwX3N0cmR1cChzb2FwLCBuYW1lKTsKKyAgICBhLT5kYXRhID0gc29hcF9zdHJkdXAoc29hcCwgdmFsdWUpOworICAgIGEtPndpZGUgPSBOVUxMOworICAgIGEtPnNvYXAgPSBzb2FwOworICAgIHNvYXAtPmRvbS0+YXR0cyA9IGE7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgIHsgLyogVE9ETzogY29uc2lkZXIgdXNpbmcgdGhpcyBjb2RlIHRvIGhhbmRsZSBkZWZhdWx0IG5hbWVzcGFjZQorICAgIGlmICghc3RybmNtcChuYW1lLCAieG1sbnMiLCA1KSAmJiAobmFtZVs1XSA9PSAnOicgfHwgbmFtZVs1XSA9PSAnXDAnKSkKKyAgICB7IGlmIChuYW1lWzVdID09ICc6JykKKyAgICAgICAgc29hcF9wdXNoX25zKHNvYXAsIG5hbWUgKyA2LCB2YWx1ZSwgMCk7CisgICAgICBlbHNlCisgICAgICAgIHNvYXBfcHVzaF9ucyhzb2FwLCAiIiwgdmFsdWUsIDApOworICAgIH0KKyAgICAqLworICAgIGlmICghc3RybmNtcChuYW1lLCAieG1sbnM6IiwgNikpCisgICAgICBzb2FwX3B1c2hfbnMoc29hcCwgbmFtZSArIDYsIHZhbHVlLCAwKTsKKyAgICBlbHNlIGlmIChzb2FwX3NldF9hdHRyKHNvYXAsIG5hbWUsIHZhbHVlKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBlbHNlCisjZW5kaWYKKyAgeyBpZiAoc29hcF9zZW5kKHNvYXAsICIgIikgfHwgc29hcF9zZW5kKHNvYXAsIG5hbWUpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmICh2YWx1ZSkKKyAgICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsICI9XCIiLCAyKQorICAgICAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCB2YWx1ZSwgMSkKKyAgICAgICB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICJcIiIsIDEpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9iZWdpbl9pbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgbmlsbGFibGUpCit7IGlmICghc29hcF9wZWVrX2VsZW1lbnQoc29hcCkpCisgIHsgaWYgKHNvYXAtPm90aGVyKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9UQUdfTUlTTUFUQ0g7CisgICAgaWYgKHRhZyAmJiAqdGFnID09ICctJykKKyAgICAgIHJldHVybiBTT0FQX09LOworICAgIGlmICghKHNvYXAtPmVycm9yID0gc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dGFnLCB0YWcpKSkKKyAgICB7IHNvYXAtPnBlZWtlZCA9IDA7CisgICAgICBpZiAoc29hcC0+Ym9keSkKKyAgICAgICAgc29hcC0+bGV2ZWwrKzsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQmVnaW4gZWxlbWVudCBmb3VuZCAobGV2ZWw9JXUpICclcyc9JyVzJ1xuIiwgc29hcC0+bGV2ZWwsIHNvYXAtPnRhZywgdGFnP3RhZzoiIiApKTsKKyAgICAgIGlmICghbmlsbGFibGUgJiYgc29hcC0+bnVsbCAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTlVMTDsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcgJiYgdGFnICYmICp0YWcgPT0gJy0nKQorICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfZW5kX2luKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcpICAKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICByZWdpc3RlciBjaGFyICpzOworICByZWdpc3RlciBjb25zdCBjaGFyICp0OworICByZWdpc3RlciBpbnQgbiA9IDA7CisgIGlmICh0YWcgJiYgKnRhZyA9PSAnLScpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIHNvYXAtPmxldmVsLS07CisgIHNvYXBfcG9wX25hbWVzcGFjZShzb2FwKTsKKyNpZmRlZiBXSVRIX0RPTQorICAvKiB0aGlzIHdoaXRlc3BhY2Ugb3IgbWl4ZWQgY29udGVudCBpcyBub3QgaW5zaWduaWZpY2FudCBmb3IgRE9NICovCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IGlmICghc29hcC0+cGVla2VkICYmICFzb2FwX3N0cmluZ19pbihzb2FwLCAzLCAtMSwgLTEpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmIChzb2FwLT5kb20tPnBybnQpCisgICAgICBzb2FwLT5kb20gPSBzb2FwLT5kb20tPnBybnQ7CisgIH0KKyNlbmRpZgorICBpZiAoc29hcC0+cGVla2VkKQorICB7IGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgICBpZiAoKnNvYXAtPnRhZykKKyAgICAgIG4rKzsKKyAgICBzb2FwLT5wZWVrZWQgPSAwOworICB9CisgIGRvCisgIHsgd2hpbGUgKCgoYyA9IHNvYXBfZ2V0KHNvYXApKSAhPSBTT0FQX1RUKSkKKyAgICB7IGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAgIGlmIChjID09IFNPQVBfTFQpCisgICAgICAgIG4rKzsKKyAgICAgIGVsc2UgaWYgKGMgPT0gJy8nKQorICAgICAgeyBjID0gc29hcF9nZXQoc29hcCk7CisgICAgICAgIGlmIChjID09IFNPQVBfR1QpCisJICBuLS07CisgICAgICAgIGVsc2UKKwkgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICB9CisgICAgfQorICB9IHdoaWxlIChuLS0pOworICBzID0gc29hcC0+dGFnOworICB3aGlsZSAoc29hcF9ub3RibGFuayhjID0gc29hcF9nZXQoc29hcCkpKQorICAgICpzKysgPSAoY2hhciljOworICAqcyA9ICdcMCc7CisgIGlmICgoaW50KWMgPT0gRU9GKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICB3aGlsZSAoc29hcF9ibGFuayhjKSkKKyAgICBjID0gc29hcF9nZXQoc29hcCk7CisgIGlmIChjICE9IFNPQVBfR1QpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9TWU5UQVhfRVJST1I7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIGVsZW1lbnQgZm91bmQgKGxldmVsPSV1KSAnJXMnPSclcydcbiIsIHNvYXAtPmxldmVsLCBzb2FwLT50YWcsIHRhZz90YWc6IiIpKTsKKyAgaWYgKCF0YWcgfHwgISp0YWcpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIGlmICgocyA9IHN0cmNocihzb2FwLT50YWcsICc6JykpKQorICAgIHMrKzsKKyAgZWxzZQorICAgIHMgPSBzb2FwLT50YWc7CisgIGlmICgodCA9IHN0cmNocih0YWcsICc6JykpKQorICAgIHQrKzsKKyAgZWxzZQorICAgIHQgPSB0YWc7CisgIGlmICghU09BUF9TVFJDTVAocywgdCkpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIGVsZW1lbnQgdGFnIG5hbWUgZG9lcyBub3QgbWF0Y2hcbiIpKTsKKyAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9TWU5UQVhfRVJST1I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfYXR0cl92YWx1ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWcpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqdHA7CisgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgICBpZiAoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCBuYW1lKSkKKyAgICAgIGJyZWFrOworICBpZiAodHAgJiYgdHAtPnZpc2libGUgPT0gMikKKyAgeyBpZiAoZmxhZyA9PSAyICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9QUk9ISUJJVEVEOworICAgIGVsc2UKKyAgICAgIHJldHVybiB0cC0+dmFsdWU7CisgIH0KKyAgZWxzZSBpZiAoZmxhZyA9PSAxICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfUkVRVUlSRUQ7CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NldF9hdHRyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfYXR0cmlidXRlICp0cDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTZXQgYXR0cmlidXRlICVzPSclcydcbiIsIG5hbWUsIHZhbHVlP3ZhbHVlOiIiKSk7CisgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgeyBpZiAoIXN0cmNtcCh0cC0+bmFtZSwgbmFtZSkpCisgICAgICBicmVhazsKKyAgfQorICBpZiAoIXRwKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQWxsb2NhdGUgYXR0cmlidXRlICVzXG4iLCBuYW1lKSk7CisgICAgaWYgKCEodHAgPSAoc3RydWN0IHNvYXBfYXR0cmlidXRlKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfYXR0cmlidXRlKSArIHN0cmxlbihuYW1lKSkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgdHAtPm5zID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgICAgeyBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKip0cHAgPSAmc29hcC0+YXR0cmlidXRlczsKKyAgICAgIGNvbnN0IGNoYXIgKnMgPSBzdHJjaHIobmFtZSwgJzonKTsKKyAgICAgIGlmICghc3RybmNtcChuYW1lLCAieG1sbnMiLCA1KSkKKyAgICAgIHsgZm9yICg7ICp0cHA7IHRwcCA9ICYoKnRwcCktPm5leHQpCisgICAgICAgICAgaWYgKHN0cm5jbXAoKCp0cHApLT5uYW1lLCAieG1sbnMiLCA1KSB8fCBzdHJjbXAoKCp0cHApLT5uYW1lICsgNSwgbmFtZSArIDUpID4gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIXMpCisgICAgICB7IGZvciAoOyAqdHBwOyB0cHAgPSAmKCp0cHApLT5uZXh0KQorICAgICAgICAgIGlmIChzdHJuY21wKCgqdHBwKS0+bmFtZSwgInhtbG5zIiwgNSkgJiYgKCgqdHBwKS0+bnMgfHwgc3RyY21wKCgqdHBwKS0+bmFtZSwgbmFtZSkgPiAwKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBpbnQgazsKKyAgICAgICAgZm9yICg7ICp0cHA7IHRwcCA9ICYoKnRwcCktPm5leHQpCisJeyBpZiAoIXN0cm5jbXAoKCp0cHApLT5uYW1lLCAieG1sbnM6IiwgNikgJiYgIXN0cm5jbXAoKCp0cHApLT5uYW1lICsgNiwgbmFtZSwgcyAtIG5hbWUpICYmICEoKnRwcCktPm5hbWVbNiArIHMgLSBuYW1lXSkKKwkgIHsgaWYgKCF0cC0+bnMpCisgICAgICAgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ2Fub25pY2FsaXphdGlvbjogcHJlZml4ICVzPSVwKCVzKVxuIiwgbmFtZSwgKCp0cHApLT5ucywgKCp0cHApLT5ucykpOworCSAgICAgIHRwLT5ucyA9ICgqdHBwKS0+bnM7CisJICAgIH0KKwkgIH0KKyAgICAgICAgICBlbHNlIGlmIChzdHJuY21wKCgqdHBwKS0+bmFtZSwgInhtbG5zIiwgNSkgJiYgKCp0cHApLT5ucyAmJiB0cC0+bnMgJiYgKChrID0gc3RyY21wKCgqdHBwKS0+bnMsIHRwLT5ucykpID4gMCB8fCAoIWsgJiYgc3RyY21wKCgqdHBwKS0+bmFtZSwgbmFtZSkgPiAwKSkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgdHAtPm5leHQgPSAqdHBwOworICAgICAgKnRwcCA9IHRwOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7IHRwLT5uZXh0ID0gc29hcC0+YXR0cmlidXRlczsKKyAgICAgIHNvYXAtPmF0dHJpYnV0ZXMgPSB0cDsKKyAgICB9CisgICAgc3RyY3B5KHRwLT5uYW1lLCBuYW1lKTsKKyAgICB0cC0+dmFsdWUgPSBOVUxMOworICB9CisgIGVsc2UgaWYgKHRwLT52aXNpYmxlKQorICB7IHJldHVybiBTT0FQX09LOworICB9CisgIGVsc2UgaWYgKHZhbHVlICYmIHRwLT52YWx1ZSAmJiB0cC0+c2l6ZSA8PSBzdHJsZW4odmFsdWUpKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZSBhdHRyaWJ1dGUgdmFsdWUgb2YgJXMgKGZyZWUgJXApXG4iLCBuYW1lLCB0cC0+dmFsdWUpKTsKKyAgICBTT0FQX0ZSRUUoc29hcCwgdHAtPnZhbHVlKTsKKyAgICB0cC0+dmFsdWUgPSBOVUxMOworICAgIHRwLT5ucyA9IE5VTEw7CisgIH0KKyAgaWYgKHZhbHVlKQorICB7IGlmICghdHAtPnZhbHVlKQorICAgIHsgdHAtPnNpemUgPSBzdHJsZW4odmFsdWUpICsgMTsKKyAgICAgIGlmICghKHRwLT52YWx1ZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCB0cC0+c2l6ZSkpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQWxsb2NhdGUgYXR0cmlidXRlIHZhbHVlIG9mICVzICglcClcbiIsIHRwLT5uYW1lLCB0cC0+dmFsdWUpKTsKKyAgICB9CisgICAgc3RyY3B5KHRwLT52YWx1ZSwgdmFsdWUpOworICAgIGlmICghc3RybmNtcCh0cC0+bmFtZSwgInhtbG5zOiIsIDYpKQorICAgICAgdHAtPm5zID0gdHAtPnZhbHVlOworICAgIHRwLT52aXNpYmxlID0gMjsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIndzdTpJZCIpKQorICAgIHsgc29hcC0+cGFydCA9IFNPQVBfQkVHSU5fU0VDVVJJVFk7CisgICAgICBzdHJuY3B5KHNvYXAtPmlkLCB2YWx1ZSwgc2l6ZW9mKHNvYXAtPmlkKSk7CisgICAgICBzb2FwLT5pZFtzaXplb2Yoc29hcC0+aWQpLTFdID0gJ1wwJzsKKyAgICB9CisjZW5kaWYKKyAgfQorICBlbHNlCisgICAgdHAtPnZpc2libGUgPSAxOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfY2xyX2F0dHIoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqdHA7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpKQorICB7IHdoaWxlIChzb2FwLT5hdHRyaWJ1dGVzKQorICAgIHsgdHAgPSBzb2FwLT5hdHRyaWJ1dGVzLT5uZXh0OworICAgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPmF0dHJpYnV0ZXMtPnZhbHVlKTsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5hdHRyaWJ1dGVzKTsKKyAgICAgIHNvYXAtPmF0dHJpYnV0ZXMgPSB0cDsKKyAgICB9CisgIH0KKyAgZWxzZQorI2VuZGlmCisgIHsgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICAgICAgdHAtPnZpc2libGUgPSAwOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitzdGF0aWMgaW50Citzb2FwX2dldGF0dHJ2YWwoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnMsIHNpemVfdCBuLCBzb2FwX3djaGFyIGQpCit7IHJlZ2lzdGVyIHNpemVfdCBpOworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICB7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IHNvYXBfZ2V0KHNvYXApOworICAgIHN3aXRjaCAoYykKKyAgICB7CisgICAgY2FzZSBTT0FQX1RUOgorICAgICAgKnMrKyA9ICc8JzsKKyAgICAgIHNvYXBfdW5nZXQoc29hcCwgJy8nKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9MVDoKKyAgICAgICpzKysgPSAnPCc7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfR1Q6CisgICAgICBpZiAoZCA9PSAnICcpCisgICAgICB7IHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgICpzID0gJ1wwJzsKKyAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgICB9CisgICAgICAqcysrID0gJz4nOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1FUOgorICAgICAgaWYgKGMgPT0gZCkKKyAgICAgIHsgKnMgPSAnXDAnOworICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICAgIH0KKyAgICAgICpzKysgPSAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfQVA6CisgICAgICBpZiAoYyA9PSBkKQorICAgICAgeyAqcyA9ICdcMCc7CisgICAgICAgIHJldHVybiBTT0FQX09LOworICAgICAgfQorICAgICAgKnMrKyA9ICdcJyc7CisgICAgICBicmVhazsKKyAgICBjYXNlICdcdCc6CisgICAgY2FzZSAnXG4nOgorICAgIGNhc2UgJ1xyJzoKKyAgICBjYXNlICcgJzoKKyAgICBjYXNlICcvJzoKKyAgICAgIGlmIChkID09ICcgJykKKyAgICAgIHsgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgKnMgPSAnXDAnOworICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgICAgKnMrKyA9IChjaGFyKWM7CisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgV0lUSF9GQVNUCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3N0b3JlX2xhYihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgc2l6ZV90IG4pCit7IHNvYXAtPmxhYmlkeCA9IDA7CisgIHJldHVybiBzb2FwX2FwcGVuZF9sYWIoc29hcCwgcywgbik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFdJVEhfRkFTVAorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9hcHBlbmRfbGFiKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBzaXplX3QgbikKK3sgaWYgKHNvYXAtPmxhYmlkeCArIG4gPj0gc29hcC0+bGFibGVuKQorICB7IHJlZ2lzdGVyIGNoYXIgKnQgPSBzb2FwLT5sYWJidWY7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmxhcmdpbmcgbG9vay1hc2lkZSBidWZmZXIgdG8gYXBwZW5kIGRhdGEsIG9sZCBzaXplPSVsdSIsICh1bnNpZ25lZCBsb25nKXNvYXAtPmxhYmxlbikpOworICAgIGlmIChzb2FwLT5sYWJsZW4gPT0gMCkKKyAgICAgIHNvYXAtPmxhYmxlbiA9IFNPQVBfTEFCTEVOOworICAgIHdoaWxlIChzb2FwLT5sYWJpZHggKyBuID49IHNvYXAtPmxhYmxlbikKKyAgICAgIHNvYXAtPmxhYmxlbiA8PD0gMTsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIiwgbmV3IHNpemU9JWx1XG4iLCAodW5zaWduZWQgbG9uZylzb2FwLT5sYWJsZW4pKTsKKyAgICBzb2FwLT5sYWJidWYgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc29hcC0+bGFibGVuKTsKKyAgICBpZiAoIXNvYXAtPmxhYmJ1ZikKKyAgICB7IGlmICh0KQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgdCk7CisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICB9CisgICAgaWYgKHQpCisgICAgeyBtZW1jcHkoc29hcC0+bGFiYnVmLCB0LCBzb2FwLT5sYWJpZHgpOworICAgICAgU09BUF9GUkVFKHNvYXAsIHQpOworICAgIH0KKyAgfQorICBpZiAocykKKyAgeyBtZW1jcHkoc29hcC0+bGFiYnVmICsgc29hcC0+bGFiaWR4LCBzLCBuKTsKKyAgICBzb2FwLT5sYWJpZHggKz0gbjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3BlZWtfZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyNpZmRlZiBXSVRIX0RPTQorICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICoqYXR0ID0gTlVMTDsKKyAgcmVnaXN0ZXIgY2hhciAqbGVhZCA9IE5VTEw7CisjZW5kaWYKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfYXR0cmlidXRlICp0cDsKKyAgY29uc3QgY2hhciAqdDsKKyAgcmVnaXN0ZXIgY2hhciAqczsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICByZWdpc3RlciBpbnQgaTsKKyAgaWYgKHNvYXAtPnBlZWtlZCkKKyAgeyBpZiAoISpzb2FwLT50YWcpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX05PX1RBRzsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICBzb2FwLT5wZWVrZWQgPSAxOworICBjID0gc29hcF9nZXR1dGY4KHNvYXApOworI2lmZGVmIFdJVEhfRE9NCisgIC8qIHdoaXRlc3BhY2UgbGVhZGluZyB0byBzdGFydCB0YWcgaXMgbm90IGluc2lnbmlmaWNhbnQgZm9yIERPTSAqLworICBpZiAoc29hcF9ibGFuayhjKSkKKyAgeyBzb2FwLT5sYWJpZHggPSAwOworICAgIGRvCisgICAgeyBpZiAoc29hcF9hcHBlbmRfbGFiKHNvYXAsIE5VTEwsIDApKQorICAgICAgICByZXR1cm4gU09BUF9FT007CisgICAgICBzID0gc29hcC0+bGFiYnVmICsgc29hcC0+bGFiaWR4OworICAgICAgaSA9IHNvYXAtPmxhYmxlbiAtIHNvYXAtPmxhYmlkeDsKKyAgICAgIHNvYXAtPmxhYmlkeCA9IHNvYXAtPmxhYmxlbjsKKyAgICAgIHdoaWxlIChzb2FwX2JsYW5rKGMpICYmIGktLSkKKyAgICAgIHsgKnMrKyA9IGM7CisgICAgICAgIGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisgICAgICB9CisgICAgfQorICAgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyAgICAqcyA9ICdcMCc7CisgICAgbGVhZCA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPmxhYmJ1Zik7CisgIH0KKyNlbHNlCisgIHdoaWxlIChzb2FwX2JsYW5rKGMpKQorICAgIGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisjZW5kaWYKKyAgaWYgKGMgIT0gU09BUF9MVCkKKyAgeyAqc29hcC0+dGFnID0gJ1wwJzsKKyAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisjaWZkZWYgV0lUSF9ET00KKyAgICAvKiB3aGl0ZXNwYWNlIGxlYWRpbmcgdG8gZW5kIHRhZyBpcyBub3QgaW5zaWduaWZpY2FudCBmb3IgRE9NICovCisgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgICAgICBzb2FwLT5kb20tPnRhaWwgPSBzb2FwX3N0cmR1cChzb2FwLCBsZWFkKTsKKyNlbmRpZgorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTk9fVEFHOworICB9CisgIHMgPSBzb2FwLT50YWc7CisgIGRvIGMgPSBzb2FwX2dldDEoc29hcCk7CisgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyAgaSA9IHNpemVvZihzb2FwLT50YWcpOworICB3aGlsZSAoYyAhPSAnPicgJiYgYyAhPSAnLycgJiYgc29hcF9ub3RibGFuayhjKSkKKyAgeyBpZiAoLS1pID4gMCkKKyAgICAgICpzKysgPSAoY2hhciljOworICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgIH0KKyAgd2hpbGUgKHNvYXBfYmxhbmsoYykpCisgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgKnMgPSAnXDAnOworICBzb2FwLT5pZFswXSA9ICdcMCc7CisgIHNvYXAtPmhyZWZbMF0gPSAnXDAnOworICBzb2FwLT50eXBlWzBdID0gJ1wwJzsKKyAgc29hcC0+YXJyYXlUeXBlWzBdID0gJ1wwJzsKKyAgc29hcC0+YXJyYXlTaXplWzBdID0gJ1wwJzsKKyAgc29hcC0+YXJyYXlPZmZzZXRbMF0gPSAnXDAnOworICBzb2FwLT5vdGhlciA9IDA7CisgIHNvYXAtPnJvb3QgPSAtMTsKKyAgc29hcC0+cG9zaXRpb24gPSAwOworICBzb2FwLT5udWxsID0gMDsKKyAgc29hcC0+bXVzdFVuZGVyc3RhbmQgPSAwOworI2lmZGVmIFdJVEhfRE9NCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICplbHQ7CisgICAgZWx0ID0gKHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50Kilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQpKTsKKyAgICBpZiAoIWVsdCkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIGVsdC0+bmV4dCA9IE5VTEw7CisgICAgZWx0LT5uc3RyID0gTlVMTDsKKyAgICBlbHQtPm5hbWUgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT50YWcpOworICAgIGVsdC0+cHJudCA9IHNvYXAtPmRvbTsKKyAgICBlbHQtPmVsdHMgPSBOVUxMOworICAgIGVsdC0+YXR0cyA9IE5VTEw7CisgICAgZWx0LT5kYXRhID0gTlVMTDsKKyAgICBlbHQtPndpZGUgPSBOVUxMOworICAgIGVsdC0+dHlwZSA9IDA7CisgICAgZWx0LT5ub2RlID0gTlVMTDsKKyAgICBlbHQtPmhlYWQgPSBsZWFkOworICAgIGVsdC0+dGFpbCA9IE5VTEw7CisgICAgZWx0LT5zb2FwID0gc29hcDsKKyAgICBpZiAoc29hcC0+ZG9tKQorICAgIHsgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKnAgPSBzb2FwLT5kb20tPmVsdHM7CisgICAgICBpZiAocCkKKyAgICAgIHsgd2hpbGUgKHAtPm5leHQpCisgICAgICAgICAgcCA9IHAtPm5leHQ7CisgICAgICAgIHAtPm5leHQgPSBlbHQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHNvYXAtPmRvbS0+ZWx0cyA9IGVsdDsKKyAgICB9CisgICAgc29hcC0+ZG9tID0gZWx0OworICAgIGF0dCA9ICZlbHQtPmF0dHM7CisgIH0KKyNlbmRpZgorICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgICAgdHAtPnZpc2libGUgPSAwOworICB3aGlsZSAoKGludCljICE9IEVPRiAmJiBjICE9ICc+JyAmJiBjICE9ICcvJykKKyAgeyBzID0gc29hcC0+dG1wYnVmOworICAgIGkgPSBzaXplb2Yoc29hcC0+dG1wYnVmKTsKKyAgICB3aGlsZSAoYyAhPSAnPScgJiYgYyAhPSAnPicgJiYgYyAhPSAnLycgJiYgc29hcF9ub3RibGFuayhjKSkKKyAgICB7IGlmICgtLWkgPiAwKQorICAgICAgICAqcysrID0gKGNoYXIpYzsKKyAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgfQorICAgICpzID0gJ1wwJzsKKyAgICBpZiAoaSA9PSBzaXplb2Yoc29hcC0+dG1wYnVmKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfU1lOVEFYX0VSUk9SOworI2lmZGVmIFdJVEhfRE9NCisgICAgLyogYWRkIGF0dHJpYnV0ZSBuYW1lIHRvIGRvbSAqLworICAgIGlmIChhdHQpCisgICAgeyAqYXR0ID0gKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlKSk7CisgICAgICAgaWYgKCEqYXR0KQorICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICAgKCphdHQpLT5uZXh0ID0gTlVMTDsKKyAgICAgICAoKmF0dCktPm5zdHIgPSBOVUxMOworICAgICAgICgqYXR0KS0+bmFtZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPnRtcGJ1Zik7CisgICAgICAgKCphdHQpLT5kYXRhID0gTlVMTDsKKyAgICAgICAoKmF0dCktPndpZGUgPSBOVUxMOworICAgICAgICgqYXR0KS0+c29hcCA9IHNvYXA7CisgICAgfQorI2VuZGlmCisgICAgaWYgKCFzdHJuY21wKHNvYXAtPnRtcGJ1ZiwgInhtbG5zIiwgNSkpCisgICAgeyBpZiAoc29hcC0+dG1wYnVmWzVdID09ICc6JykKKyAgICAgIHsgc29hcC0+dG1wYnVmWzVdID0gJ1wwJzsKKyAgICAgICAgdCA9IHNvYXAtPnRtcGJ1ZiArIDY7CisgICAgICB9CisgICAgICBlbHNlIGlmIChzb2FwLT50bXBidWZbNV0pCisgICAgICAgIHQgPSBOVUxMOworICAgICAgZWxzZQorICAgICAgICB0ID0gU09BUF9TVFJfRU9TOworICAgIH0KKyAgICBlbHNlCisgICAgICB0ID0gTlVMTDsKKyAgICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgICAgeyBpZiAoIVNPQVBfU1RSQ01QKHRwLT5uYW1lLCBzb2FwLT50bXBidWYpKQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCF0cCkKKyAgICB7IHRwID0gKHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSkgKyBzdHJsZW4oc29hcC0+dG1wYnVmKSk7CisgICAgICBpZiAoIXRwKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgIHN0cmNweSh0cC0+bmFtZSwgc29hcC0+dG1wYnVmKTsKKyAgICAgIHRwLT52YWx1ZSA9IE5VTEw7CisgICAgICB0cC0+c2l6ZSA9IDA7CisgICAgICB0cC0+bmV4dCA9IHNvYXAtPmF0dHJpYnV0ZXM7CisgICAgICBzb2FwLT5hdHRyaWJ1dGVzID0gdHA7CisgICAgfQorICAgIHdoaWxlIChzb2FwX2JsYW5rKGMpKQorICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICBpZiAoYyA9PSAnPScpCisgICAgeyBkbyBjID0gc29hcF9nZXR1dGY4KHNvYXApOworICAgICAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworICAgICAgaWYgKGMgIT0gU09BUF9RVCAmJiBjICE9IFNPQVBfQVApCisgICAgICB7IHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgIGMgPSAnICc7IC8qIGJsYW5rIGRlbGltaXRlciAqLworICAgICAgfQorICAgICAgaWYgKHNvYXBfZ2V0YXR0cnZhbChzb2FwLCB0cC0+dmFsdWUsIHRwLT5zaXplLCBjKSkKKyAgICAgIHsKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgICAgICAgaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfRU9NKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworCWlmIChzb2FwX3N0b3JlX2xhYihzb2FwLCB0cC0+dmFsdWUsIHRwLT5zaXplKSkKKwkgIHJldHVybiBzb2FwLT5lcnJvcjsKKwlpZiAodHAtPnZhbHVlKQorCSAgU09BUF9GUkVFKHNvYXAsIHRwLT52YWx1ZSk7CisJZm9yICg7OykKKwl7IGlmIChzb2FwX2dldGF0dHJ2YWwoc29hcCwgc29hcC0+bGFiYnVmICsgc29hcC0+bGFiaWR4LCBzb2FwLT5sYWJsZW4gLSBzb2FwLT5sYWJpZHgsIGMpKQorCSAgeyBpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9FT00pCisJICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworCSAgICBzb2FwLT5sYWJpZHggPSBzb2FwLT5sYWJsZW47CisJICAgIGlmIChzb2FwX2FwcGVuZF9sYWIoc29hcCwgTlVMTCwgMCkpCisJICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworCSAgfQorCSAgZWxzZQorCSAgICBicmVhazsKKwl9CisJaWYgKHNvYXAtPmxhYmlkeCkKKyAgICAgICAgICB0cC0+c2l6ZSA9IHNvYXAtPmxhYmxlbjsKKwllbHNlCisJeyB0cC0+c2l6ZSA9IHN0cmxlbihzb2FwLT5sYWJidWYpICsgMTsKKyAgICAgICAgICBpZiAodHAtPnNpemUgPCBTT0FQX0xBQkxFTikKKwkgICAgdHAtPnNpemUgPSBTT0FQX0xBQkxFTjsKKyAgICAgICAgfQorCWlmICghKHRwLT52YWx1ZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCB0cC0+c2l6ZSkpKQorCSAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICAgIHN0cmNweSh0cC0+dmFsdWUsIHNvYXAtPmxhYmJ1Zik7CisjZWxzZQorCXNpemVfdCBuOworICAgICAgICBpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9FT00pCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgICAgICAgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsgaWYgKCEocyA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgU09BUF9CTEtMRU4pKSkKKyAgICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgICBpZiAoc29hcF9nZXRhdHRydmFsKHNvYXAsIHMsIFNPQVBfQkxLTEVOLCBjKSkKKyAgICAgICAgICB7IGlmIChzb2FwLT5lcnJvciAhPSBTT0FQX0VPTSkKKyAgICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCW4gPSB0cC0+c2l6ZSArIHNvYXAtPmJsaXN0LT5zaXplOworICAgICAgICBpZiAoIShzID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIG4pKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgICAgaWYgKHRwLT52YWx1ZSkKKyAgICAgICAgeyBtZW1jcHkocywgdHAtPnZhbHVlLCB0cC0+c2l6ZSk7CisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHRwLT52YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgc29hcF9zYXZlX2Jsb2NrKHNvYXAsIHMgKyB0cC0+c2l6ZSwgMCk7CisgICAgICAgIHRwLT52YWx1ZSA9IHM7CisgICAgICAgIHRwLT5zaXplID0gbjsKKyNlbmRpZgorICAgICAgfQorICAgICAgZG8gYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyAgICAgIHRwLT52aXNpYmxlID0gMjsgLyogc2VlbiB0aGlzIGF0dHJpYnV0ZSB3LyB2YWx1ZSAqLworI2lmZGVmIFdJVEhfRE9NCisgICAgICBpZiAoYXR0KQorICAgICAgICAoKmF0dCktPmRhdGEgPSBzb2FwX3N0cmR1cChzb2FwLCB0cC0+dmFsdWUpOworI2VuZGlmCisgICAgfQorICAgIGVsc2UKKyAgICAgIHRwLT52aXNpYmxlID0gMTsgLyogc2VlbiB0aGlzIGF0dHJpYnV0ZSB3L28gdmFsdWUgKi8KKyNpZmRlZiBXSVRIX0RPTQorICAgIGlmIChhdHQpCisgICAgICBhdHQgPSAmKCphdHQpLT5uZXh0OworI2VuZGlmCisgICAgaWYgKHQgJiYgdHAtPnZhbHVlKQorICAgIHsgaWYgKHNvYXBfcHVzaF9uYW1lc3BhY2Uoc29hcCwgdCwgdHAtPnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgdHAtPnZpc2libGUgPSAwOworICAgIH0KKyAgfQorI2lmZGVmIFdJVEhfRE9NCisgIGlmIChhdHQpCisgIHsgc29hcC0+ZG9tLT5uc3RyID0gc29hcF9jdXJyZW50X25hbWVzcGFjZShzb2FwLCBzb2FwLT50YWcpOworICAgIGZvciAoYXR0ID0gJnNvYXAtPmRvbS0+YXR0czsgKmF0dDsgYXR0ID0gJigqYXR0KS0+bmV4dCkKKyAgICAgICgqYXR0KS0+bnN0ciA9IHNvYXBfY3VycmVudF9uYW1lc3BhY2Uoc29hcCwgKCphdHQpLT5uYW1lKTsKKyAgfQorI2VuZGlmCisgIGlmICgoaW50KWMgPT0gRU9GKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICBpZiAoIShzb2FwLT5ib2R5ID0gKGMgIT0gJy8nKSkpCisgICAgZG8gYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICB3aGlsZSAoc29hcF9ibGFuayhjKSk7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pCisgIHsgaWYgKCFzb2FwLT5ib2R5ICYmIHNvYXAtPmRvbS0+cHJudCkKKyAgICAgIHNvYXAtPmRvbSA9IHNvYXAtPmRvbS0+cHJudDsKKyAgfQorI2VuZGlmCisgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgeyBpZiAodHAtPnZpc2libGUgJiYgdHAtPnZhbHVlKQorICAgIHsgaWYgKCFzdHJjbXAodHAtPm5hbWUsICJpZCIpKQorICAgICAgeyAqc29hcC0+aWQgPSAnIyc7CisgICAgICAgIHN0cm5jcHkoc29hcC0+aWQgKyAxLCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT5pZCkgLSAyKTsKKyAgICAgICAgc29hcC0+aWRbc2l6ZW9mKHNvYXAtPmlkKS0xXSA9ICdcMCc7CisgICAgICB9CisgICAgICBlbHNlIGlmICghc3RyY21wKHRwLT5uYW1lLCAiaHJlZiIpKQorICAgICAgeyBzdHJuY3B5KHNvYXAtPmhyZWYsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPmhyZWYpIC0gMSk7CisgICAgICAgIHNvYXAtPmhyZWZbc2l6ZW9mKHNvYXAtPmhyZWYpLTFdID0gJ1wwJzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKChzb2FwLT52ZXJzaW9uID09IDIgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9HUkFQSCkpICYmICFzdHJjbXAodHAtPm5hbWUsICJyZWYiKSkKKyAgICAgIHsgKnNvYXAtPmhyZWYgPSAnIyc7CisgICAgICAgIHN0cm5jcHkoc29hcC0+aHJlZiArIDEsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPmhyZWYpIC0gMik7CisgICAgICAgIHNvYXAtPmhyZWZbc2l6ZW9mKHNvYXAtPmhyZWYpLTFdID0gJ1wwJzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgInhzaTp0eXBlIikpCisgICAgICB7IHN0cm5jcHkoc29hcC0+dHlwZSwgdHAtPnZhbHVlLCBzaXplb2Yoc29hcC0+dHlwZSkgLSAxKTsKKyAgICAgICAgc29hcC0+dHlwZVtzaXplb2Yoc29hcC0+dHlwZSktMV0gPSAnXDAnOworICAgICAgfQorICAgICAgZWxzZSBpZiAoc29hcC0+dmVyc2lvbiA9PSAxICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5DOmFycmF5VHlwZSIpKQorICAgICAgeyBzID0gc29hcF9zdHJyY2hyKHRwLT52YWx1ZSwgJ1snKTsKKyAgICAgICAgaWYgKHMgJiYgKHNpemVfdCkocyAtIHRwLT52YWx1ZSkgPCBzaXplb2Yoc29hcC0+YXJyYXlUeXBlKSkKKyAgICAgICAgeyBzdHJuY3B5KHNvYXAtPmFycmF5VHlwZSwgdHAtPnZhbHVlLCBzIC0gdHAtPnZhbHVlKTsKKyAgICAgICAgICBzb2FwLT5hcnJheVR5cGVbcyAtIHRwLT52YWx1ZV0gPSAnXDAnOworICAgICAgICAgIHN0cm5jcHkoc29hcC0+YXJyYXlTaXplLCBzLCBzaXplb2Yoc29hcC0+YXJyYXlTaXplKSAtIDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzdHJuY3B5KHNvYXAtPmFycmF5VHlwZSwgdHAtPnZhbHVlLCBzaXplb2Yoc29hcC0+YXJyYXlUeXBlKSAtIDEpOworICAgICAgICBzb2FwLT5hcnJheVNpemVbc2l6ZW9mKHNvYXAtPmFycmF5VHlwZSktMV0gPSAnXDAnOworICAgICAgICBzb2FwLT5hcnJheVR5cGVbc2l6ZW9mKHNvYXAtPmFycmF5VHlwZSktMV0gPSAnXDAnOworICAgICAgfQorICAgICAgZWxzZSBpZiAoc29hcC0+dmVyc2lvbiA9PSAyICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5DOml0ZW1UeXBlIikpCisgICAgICAgIHN0cm5jcHkoc29hcC0+YXJyYXlUeXBlLCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT5hcnJheVR5cGUpIC0gMSk7CisgICAgICBlbHNlIGlmIChzb2FwLT52ZXJzaW9uID09IDIgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTkM6YXJyYXlTaXplIikpCisgICAgICAgIHN0cm5jcHkoc29hcC0+YXJyYXlTaXplLCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT5hcnJheVNpemUpIC0gMSk7CisgICAgICBlbHNlIGlmIChzb2FwLT52ZXJzaW9uID09IDEgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTkM6b2Zmc2V0IikpCisgICAgICAgIHN0cm5jcHkoc29hcC0+YXJyYXlPZmZzZXQsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPmFycmF5T2Zmc2V0KSk7CisgICAgICBlbHNlIGlmIChzb2FwLT52ZXJzaW9uID09IDEgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTkM6cG9zaXRpb24iKSkKKyAgICAgICAgc29hcC0+cG9zaXRpb24gPSBzb2FwX2dldHBvc2l0aW9uKHRwLT52YWx1ZSwgc29hcC0+cG9zaXRpb25zKTsKKyAgICAgIGVsc2UgaWYgKHNvYXAtPnZlcnNpb24gPT0gMSAmJiAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOQzpyb290IikpCisgICAgICAgIHNvYXAtPnJvb3QgPSAoKCFzdHJjbXAodHAtPnZhbHVlLCAiMSIpIHx8ICFzdHJjbXAodHAtPnZhbHVlLCAidHJ1ZSIpKSk7CisgICAgICBlbHNlIGlmICgoc29hcC0+dmVyc2lvbiA9PSAxICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5WOmFjdG9yIikpCisgICAgICAgICAgICB8fCAoc29hcC0+dmVyc2lvbiA9PSAyICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5WOnJvbGUiKSkpCisgICAgICB7IGlmICgoIXNvYXAtPmFjdG9yIHx8IHN0cmNtcChzb2FwLT5hY3RvciwgdHAtPnZhbHVlKSkKKyAgICAgICAgICYmIHN0cmNtcCh0cC0+dmFsdWUsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2FjdG9yL25leHQiKQorICAgICAgICAgJiYgc3RyY21wKHRwLT52YWx1ZSwgImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZS9yb2xlL25leHQiKSkKKyAgICAgICAgICBzb2FwLT5vdGhlciA9IDE7CisgICAgICB9CisgICAgICBlbHNlIGlmICghc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOVjptdXN0VW5kZXJzdGFuZCIpCisgICAgICAgICAgICAmJiAoIXN0cmNtcCh0cC0+dmFsdWUsICIxIikgfHwgIXN0cmNtcCh0cC0+dmFsdWUsICJ0cnVlIikpKQorICAgICAgICBzb2FwLT5tdXN0VW5kZXJzdGFuZCA9IDE7CisgICAgICBlbHNlIGlmICgoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAieHNpOm51bGwiKQorICAgICAgICAgICAgIHx8ICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgInhzaTpuaWwiKSkKKyAgICAgICAgICAgICYmICghc3RyY21wKHRwLT52YWx1ZSwgIjEiKQorICAgICAgICAgICAgIHx8ICFzdHJjbXAodHAtPnZhbHVlLCAidHJ1ZSIpKSkKKyAgICAgICAgc29hcC0+bnVsbCA9IDE7CisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3JldHJ5KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIHNvYXBfcmV2ZXJ0KHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9yZXZlcnQoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmICghc29hcC0+cGVla2VkKQorICB7IHNvYXAtPnBlZWtlZCA9IDE7CisgICAgaWYgKHNvYXAtPmJvZHkpCisgICAgICBzb2FwLT5sZXZlbC0tOworICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmV2ZXJ0aW5nIGxhc3QgZWxlbWVudCAobGV2ZWw9JXUpXG4iLCBzb2FwLT5sZXZlbCkpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3N0cmluZ19vdXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGludCBmbGFnKQoreyByZWdpc3RlciBjb25zdCBjaGFyICp0OworICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgbWFzayA9IDB4RkZGRkZGODBVTDsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBzb2FwLT5kb20tPmRhdGEgPSBzb2FwX3N0cmR1cChzb2FwLCBzKTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2VuZGlmCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9DX1VURlNUUklORykKKyAgICBtYXNrID0gMDsKKyAgdCA9IHM7CisgIHdoaWxlICgoYyA9ICp0KyspKQorICB7IHN3aXRjaCAoYykKKyAgICB7IAorICAgIGNhc2UgOToKKyAgICAgIGlmIChmbGFnKQorICAgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIiYjeDk7IiwgNSkpCisJICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHMgPSB0OworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAxMDoKKyAgICAgIGlmIChmbGFnIHx8ICEoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkpCisgICAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiJiN4QTsiLCA1KSkKKwkgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgcyA9IHQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDEzOgorICAgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICImI3hEOyIsIDUpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBzID0gdDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJyYnOgorICAgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICImYW1wOyIsIDUpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBzID0gdDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJzwnOgorICAgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICImbHQ7IiwgNCkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHMgPSB0OworICAgICAgYnJlYWs7CisgICAgY2FzZSAnPic6CisgICAgICBpZiAoIWZsYWcpCisgICAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiJmd0OyIsIDQpKQorCSAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBzID0gdDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJyInOgorICAgICAgaWYgKGZsYWcpCisgICAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiJnF1b3Q7IiwgNikpCisJICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHMgPSB0OworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZmRlZiBIQVZFX01CVE9XQworICAgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0NfTUJTVFJJTkcpCisgICAgICB7IHdjaGFyX3Qgd2M7CisgICAgICAgIHJlZ2lzdGVyIGludCBtID0gbWJ0b3djKCZ3YywgdCAtIDEsIE1CX0NVUl9NQVgpOworICAgICAgICBpZiAobSA+IDAgJiYgd2MgIT0gYykKKyAgICAgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfcHV0dXRmOChzb2FwLCB3YykpCisgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisJICBzID0gdCArPSBtIC0gMTsKKwkgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKyNlbmRpZgorICAgICAgaWYgKGMgJiBtYXNrKQorICAgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfcHV0dXRmOChzb2FwLCAodW5zaWduZWQgY2hhciljKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHMgPSB0OworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3N0cmluZ19pbihzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGZsYWcsIGxvbmcgbWlubGVuLCBsb25nIG1heGxlbikKK3sgcmVnaXN0ZXIgY2hhciAqczsKKyAgY2hhciAqdCA9IE5VTEw7CisgIHJlZ2lzdGVyIHNpemVfdCBpOworICByZWdpc3RlciBsb25nIGwgPSAwOworICByZWdpc3RlciBpbnQgbiA9IDA7CisgIHJlZ2lzdGVyIGludCBtID0gMDsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworI2lmICFkZWZpbmVkKFdJVEhfTEVBTkVSKSAmJiBkZWZpbmVkKEhBVkVfV0NUT01CKQorICBjaGFyIGJ1ZltNQl9MRU5fTUFYID4gOCA/IE1CX0xFTl9NQVggOiA4XTsKKyNlbHNlCisgIGNoYXIgYnVmWzhdOworI2VuZGlmCisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWFkaW5nIHN0cmluZyBjb250ZW50XG4iKSk7CisgIGlmIChzb2FwLT5wZWVrZWQpCisgIHsgaWYgKCFzb2FwLT5ib2R5KQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCpzb2FwLT50YWcpCisgICAgeyBuID0gMTsKKyAgICAgIHNvYXAtPnBlZWtlZCA9IDA7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgdCA9IHNvYXAtPnRtcGJ1ZjsKKyAgICAgIHRbMF0gPSAnPCc7CisgICAgICBzdHJuY3B5KHQgKyAxLCBzb2FwLT50YWcsIHNpemVvZihzb2FwLT50bXBidWYpIC0gMSk7CisgICAgICBzdHJuY2F0KHQsICI+Iiwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZikpOworICAgICAgbSA9IHN0cmxlbihzb2FwLT50YWcpICsgMjsKKyNlbmRpZgorICAgIH0KKyAgfQorI2lmZGVmIFdJVEhfQ0RBVEEKKyAgaWYgKCFmbGFnKQorICB7IHJlZ2lzdGVyIGludCBzdGF0ZSA9IDA7CisjaWZkZWYgV0lUSF9GQVNUCisgICAgc29hcC0+bGFiaWR4ID0gMDsJCQkvKiB1c2UgbG9vay1hc2lkZSBidWZmZXIgKi8KKyNlbHNlCisgICAgaWYgKHNvYXBfbmV3X2Jsb2NrKHNvYXApKQorICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgICBmb3IgKDs7KQorICAgIHsgCisjaWZkZWYgV0lUSF9GQVNUCisgICAgICByZWdpc3RlciBzaXplX3QgazsKKyAgICAgIGlmIChzb2FwX2FwcGVuZF9sYWIoc29hcCwgTlVMTCwgMCkpCS8qIGFsbG9jYXRlIG1vcmUgc3BhY2UgaW4gbG9vay1hc2lkZSBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgcyA9IHNvYXAtPmxhYmJ1ZiArIHNvYXAtPmxhYmlkeDsJLyogc3BhY2UgdG8gcG9wdWxhdGUgKi8KKyAgICAgIGsgPSBzb2FwLT5sYWJsZW4gLSBzb2FwLT5sYWJpZHg7CS8qIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgKi8KKyAgICAgIHNvYXAtPmxhYmlkeCA9IHNvYXAtPmxhYmxlbjsJLyogY2xhaW0gdGhpcyBzcGFjZSAqLworI2Vsc2UKKyAgICAgIHJlZ2lzdGVyIHNpemVfdCBrID0gU09BUF9CTEtMRU47CisgICAgICBpZiAoIShzID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBrKSkpCisgICAgICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgICAgICBmb3IgKGkgPSAwOyBpIDwgazsgaSsrKQorICAgICAgeyBpZiAobSA+IDApCisgICAgICAgIHsgKnMrKyA9ICp0Kys7CS8qIGNvcHkgbXVsdGlieXRlIGNoYXJhY3RlcnMgKi8KKwkgIG0tLTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworCWlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICBpZiAoYyA+PSAweDgwICYmICEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0xBVElOKSkKKyAgICAgICAgeyBzb2FwX3VuZ2V0KHNvYXAsIGMpOworCSAgYyA9IHNvYXBfZ2V0dXRmOChzb2FwKTsKKwkgIGlmIChzb2FwLT5tb2RlICYgU09BUF9DX1VURlNUUklORykKKyAgICAgICAgICB7IGlmICgoYyAmIDB4ODAwMDAwMDApICYmIGMgPj0gLTB4N0ZGRkZGODAgJiYgYyA8IFNPQVBfQVApCisgICAgICAgICAgICB7IGMgJj0gMHg3RkZGRkZGRjsKKyAgICAgICAgICAgICAgdCA9IGJ1ZjsKKyAgICAgICAgICAgICAgaWYgKGMgPCAweDA4MDApCisgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEMwIHwgKChjID4+IDYpICYgMHgxRikpOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsgaWYgKGMgPCAweDAxMDAwMCkKKyAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhFMCB8ICgoYyA+PiAxMikgJiAweDBGKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsgaWYgKGMgPCAweDIwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEYwIHwgKChjID4+IDE4KSAmIDB4MDcpKTsKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHsgaWYgKGMgPCAweDA0MDAwMDAwKQorICAgICAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhGOCB8ICgoYyA+PiAyNCkgJiAweDAzKSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeyAqdCsrID0gKGNoYXIpKDB4RkMgfCAoKGMgPj4gMzApICYgMHgwMSkpOworICAgICAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAyNCkgJiAweDNGKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDE4KSAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgICAgIH0gICAgIAorICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDEyKSAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDYpICYgMHgzRikpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8IChjICYgMHgzRikpOworCSAgICAgIG0gPSAoaW50KSh0IC0gYnVmKSAtIDE7CisgICAgICAgICAgICAgIHQgPSBidWY7CisgICAgICAgICAgICAgICpzKysgPSAqdCsrOworICAgICAgICAgICAgICBjb250aW51ZTsKKwkgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCXN3aXRjaCAoc3RhdGUpCisgICAgICAgIHsgY2FzZSAxOgorICAgICAgICAgICAgaWYgKGMgPT0gJ10nKQorCSAgICAgIHN0YXRlID0gNDsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworCSAgY2FzZSAyOgorCSAgICBpZiAoYyA9PSAnLScpCisgICAgICAgICAgICAgIHN0YXRlID0gNjsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworCSAgY2FzZSAzOgorCSAgICBpZiAoYyA9PSAnPycpCisJICAgICAgc3RhdGUgPSA4OworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisgICAgICAgICAgLyogQ0RBVEEgKi8KKwkgIGNhc2UgNDoKKwkgICAgaWYgKGMgPT0gJ10nKQorICAgICAgICAgICAgICBzdGF0ZSA9IDU7CisJICAgIGVsc2UKKwkgICAgICBzdGF0ZSA9IDE7CisJICAgICpzKysgPSBjOworCSAgICBjb250aW51ZTsKKwkgIGNhc2UgNToKKwkgICAgaWYgKGMgPT0gJz4nKQorCSAgICAgIHN0YXRlID0gMDsKKwkgICAgZWxzZQorCSAgICAgIHN0YXRlID0gMTsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworICAgICAgICAgIC8qIGNvbW1lbnQgKi8KKyAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICBpZiAoYyA9PSAnLScpCisJICAgICAgc3RhdGUgPSA3OworCSAgICBlbHNlCisJICAgICAgc3RhdGUgPSAyOworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgaWYgKGMgPT0gJz4nKQorCSAgICAgIHN0YXRlID0gMDsKKwkgICAgZWxzZQorCSAgICAgIHN0YXRlID0gMjsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworICAgICAgICAgIC8qIFBJICovCisJICBjYXNlIDg6CisgICAgICAgICAgICBpZiAoYyA9PSAnPicpCisJICAgICAgc3RhdGUgPSAwOworCSAgICBlbHNlCisJICAgICAgc3RhdGUgPSAzOworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChjKQorICAgICAgICB7CisgICAgICAgIGNhc2UgJy8nOgorICAgICAgICAgIGlmIChuID4gMCkKKyAgICAgICAgICB7IGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgICAgICAgICAgICBpZiAoYyA9PSAnPicpCisgICAgICAgICAgICAgIG4tLTsKKyAgICAgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgICAgfQorICAgICAgICAgICpzKysgPSAnLyc7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzwnOgorCSAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKwkgIGlmIChjID09ICcvJykKKwkgIHsgaWYgKG4gPT0gMCkKKwkgICAgeyBjID0gU09BUF9UVDsKKwkgICAgICBnb3RvIGVuZDsKKwkgICAgfQorCSAgICBuLS07CisJICB9CisJICBlbHNlIGlmIChjID09ICchJykKKwkgIHsgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKwkgICAgaWYgKGMgPT0gJ1snKQorICAgICAgICAgICAgeyBkbyBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICAgICAgICAgICAgICB3aGlsZSAoKGludCljICE9IEVPRiAmJiBjICE9ICdbJyk7CisgICAgICAgICAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKwkgICAgICB0ID0gKGNoYXIqKSIhW0NEQVRBWyI7CisJICAgICAgbSA9IDg7CisJICAgICAgc3RhdGUgPSAxOworCSAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjID09ICctJykKKwkgICAgeyBpZiAoKGMgPSBzb2FwX2dldGNoYXIoc29hcCkpID09ICctJykKKwkgICAgICAgIHN0YXRlID0gMjsKKwkgICAgICB0ID0gKGNoYXIqKSIhLSI7CisJICAgICAgbSA9IDI7CisJICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsgdCA9IChjaGFyKikiISI7CisJICAgICAgbSA9IDE7CisJICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKwkgICAgfQorCSAgICAqcysrID0gJzwnOworCSAgICBicmVhazsKKwkgIH0KKwkgIGVsc2UgaWYgKGMgPT0gJz8nKQorCSAgICBzdGF0ZSA9IDM7CisJICBlbHNlCisJICAgIG4rKzsKKyAgICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICAgICpzKysgPSAnPCc7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJz4nOgorICAgICAgICAgICpzKysgPSAnPic7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJyInOgorICAgICAgICAgICpzKysgPSAnIic7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZkZWYgSEFWRV9XQ1RPTUIKKyAgICAgICAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfQ19NQlNUUklORykKKyAgICAgICAgICB7IG0gPSB3Y3RvbWIoYnVmLCBjICYgMHg3RkZGRkZGRik7CisgICAgICAgICAgICBpZiAobSA+PSAxICYmIG0gPD0gKGludClNQl9DVVJfTUFYKQorICAgICAgICAgICAgeyB0ID0gYnVmOworICAgICAgICAgICAgICAqcysrID0gKnQrKzsKKyAgICAgICAgICAgICAgbS0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAqcysrID0gU09BUF9VTktOT1dOX0NIQVI7CisJICAgICAgbSA9IDA7CisJICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorI2VuZGlmCisjZW5kaWYKKyAgICAgICAgICAgICpzKysgPSAoY2hhcikoYyAmIDB4RkYpOworICAgICAgICB9CisJbCsrOworICAgICAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIG1heGxlbiA+PSAwICYmIGwgPiBtYXhsZW4pCisgICAgICAgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlN0cmluZyB0b28gbG9uZzogbWF4bGVuPSVsZFxuIiwgbWF4bGVuKSk7CisgICAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0xFTkdUSDsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorI2VuZGlmCisjaWZkZWYgV0lUSF9GQVNUCisgIHNvYXAtPmxhYmlkeCA9IDA7CQkJLyogdXNlIGxvb2stYXNpZGUgYnVmZmVyICovCisjZWxzZQorICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgZm9yICg7OykKKyAgeyAKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgICByZWdpc3RlciBzaXplX3QgazsKKyAgICBpZiAoc29hcF9hcHBlbmRfbGFiKHNvYXAsIE5VTEwsIDApKQkvKiBhbGxvY2F0ZSBtb3JlIHNwYWNlIGluIGxvb2stYXNpZGUgYnVmZmVyIGlmIG5lY2Vzc2FyeSAqLworICAgICAgcmV0dXJuIE5VTEw7CisgICAgcyA9IHNvYXAtPmxhYmJ1ZiArIHNvYXAtPmxhYmlkeDsJLyogc3BhY2UgdG8gcG9wdWxhdGUgKi8KKyAgICBrID0gc29hcC0+bGFibGVuIC0gc29hcC0+bGFiaWR4OwkvKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlICovCisgICAgc29hcC0+bGFiaWR4ID0gc29hcC0+bGFibGVuOwkvKiBjbGFpbSB0aGlzIHNwYWNlICovCisjZWxzZQorICAgIHJlZ2lzdGVyIHNpemVfdCBrID0gU09BUF9CTEtMRU47CisgICAgaWYgKCEocyA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgaykpKQorICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgICBmb3IgKGkgPSAwOyBpIDwgazsgaSsrKQorICAgIHsgaWYgKG0gPiAwKQorICAgICAgeyAqcysrID0gKnQrKzsJLyogY29weSBtdWx0aWJ5dGUgY2hhcmFjdGVycyAqLworICAgICAgICBtLS07CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0NfVVRGU1RSSU5HKQorICAgICAgeyBpZiAoKChjID0gc29hcF9nZXQoc29hcCkpICYgMHg4MDAwMDAwMCkgJiYgYyA+PSAtMHg3RkZGRkY4MCAmJiBjIDwgU09BUF9BUCkKKyAgICAgICAgeyBjICY9IDB4N0ZGRkZGRkY7CisgICAgICAgICAgdCA9IGJ1ZjsKKyAgICAgICAgICBpZiAoYyA8IDB4MDgwMCkKKyAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhDMCB8ICgoYyA+PiA2KSAmIDB4MUYpKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeyBpZiAoYyA8IDB4MDEwMDAwKQorICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RTAgfCAoKGMgPj4gMTIpICYgMHgwRikpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyBpZiAoYyA8IDB4MjAwMDAwKQorICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhGMCB8ICgoYyA+PiAxOCkgJiAweDA3KSk7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeyBpZiAoYyA8IDB4MDQwMDAwMDApCisgICAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjggfCAoKGMgPj4gMjQpICYgMHgwMykpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7ICp0KysgPSAoY2hhcikoMHhGQyB8ICgoYyA+PiAzMCkgJiAweDAxKSk7CisgICAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMjQpICYgMHgzRikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTgpICYgMHgzRikpOworICAgICAgICAgICAgICB9ICAgICAKKyAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDEyKSAmIDB4M0YpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKGMgJiAweDNGKSk7CisJICBtID0gKGludCkodCAtIGJ1ZikgLSAxOworICAgICAgICAgIHQgPSBidWY7CisgICAgICAgICAgKnMrKyA9ICp0Kys7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgYyA9IHNvYXBfZ2V0dXRmOChzb2FwKTsKKyAgICAgIHN3aXRjaCAoYykKKyAgICAgIHsKKyAgICAgIGNhc2UgU09BUF9UVDoKKyAgICAgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgbi0tOworICAgICAgICAqcysrID0gJzwnOworICAgICAgICB0ID0gKGNoYXIqKSIvIjsKKwltID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfTFQ6CisgICAgICAgIG4rKzsKKyAgICAgICAgKnMrKyA9ICc8JzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfR1Q6CisgICAgICAgICpzKysgPSAnPic7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTT0FQX1FUOgorICAgICAgICAqcysrID0gJyInOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9BUDoKKyAgICAgICAgKnMrKyA9ICdcJyc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnLyc6CisgICAgICAgIGlmIChuID4gMCkKKyAgICAgICAgeyBjID0gc29hcF9nZXQoc29hcCk7CisgICAgICAgICAgaWYgKGMgPT0gU09BUF9HVCkKKyAgICAgICAgICAgIG4tLTsKKyAgICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICB9CisgICAgICAgICpzKysgPSAnLyc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnPCcgfCAweDgwMDAwMDAwOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gJzwnOworICAgICAgICBlbHNlCisgICAgICAgIHsgKnMrKyA9ICcmJzsKKyAgICAgICAgICB0ID0gKGNoYXIqKSJsdDsiOworCSAgbSA9IDM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICc+JyB8IDB4ODAwMDAwMDA6CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICpzKysgPSAnPic7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAqcysrID0gJyYnOworICAgICAgICAgIHQgPSAoY2hhciopImd0OyI7CisJICBtID0gMzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJyYnIHwgMHg4MDAwMDAwMDoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9ICcmJzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAnJic7CisgICAgICAgICAgdCA9IChjaGFyKikiYW1wOyI7CisJICBtID0gNDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJyInIHwgMHg4MDAwMDAwMDoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9ICciJzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAnJic7CisgICAgICAgICAgdCA9IChjaGFyKikicXVvdDsiOworCSAgbSA9IDU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdcJycgfCAweDgwMDAwMDAwOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gJ1wnJzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAnJic7CisgICAgICAgICAgdCA9IChjaGFyKikiYXBvczsiOworCSAgbSA9IDU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgICBnb3RvIGVuZDsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZmRlZiBIQVZFX1dDVE9NQgorICAgICAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfQ19NQlNUUklORykKKyAgICAgICAgeyBtID0gd2N0b21iKGJ1ZiwgYyAmIDB4N0ZGRkZGRkYpOworICAgICAgICAgIGlmIChtID49IDEgJiYgbSA8PSAoaW50KU1CX0NVUl9NQVgpCisgICAgICAgICAgeyB0ID0gYnVmOworICAgICAgICAgICAgKnMrKyA9ICp0Kys7CisgICAgICAgICAgICBtLS07CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7ICpzKysgPSBTT0FQX1VOS05PV05fQ0hBUjsKKwkgICAgbSA9IDA7CisJICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmCisjZW5kaWYKKyAgICAgICAgICAqcysrID0gKGNoYXIpKGMgJiAweEZGKTsKKyAgICAgIH0KKyAgICAgIGwrKzsKKyAgICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgbWF4bGVuID49IDAgJiYgbCA+IG1heGxlbikKKyAgICAgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlN0cmluZyB0b28gbG9uZzogbWF4bGVuPSVsZFxuIiwgbWF4bGVuKSk7CisgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9MRU5HVEg7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgIH0KKyAgfQorZW5kOgorICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAqcyA9ICdcMCc7CisjaWZkZWYgV0lUSF9GQVNUCisgIHQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT5sYWJidWYpOworI2Vsc2UKKyAgc29hcF9zaXplX2Jsb2NrKHNvYXAsIGkrMSk7CisgIHQgPSBzb2FwX3NhdmVfYmxvY2soc29hcCwgTlVMTCwgMCk7CisjZW5kaWYKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiBsIDwgbWlubGVuKQorICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJTdHJpbmcgdG9vIHNob3J0OiAlbGQgY2hhcnMsIG1pbmxlbj0lbGRcbiIsIGwsIG1pbmxlbikpOworICAgIHNvYXAtPmVycm9yID0gU09BUF9MRU5HVEg7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBpZiAoZmxhZyA9PSAzKQorICAgICAgc29hcC0+ZG9tLT50YWlsID0gdDsKKyAgICBlbHNlCisgICAgICBzb2FwLT5kb20tPmRhdGEgPSB0OworICB9CisjZW5kaWYKKyAgaWYgKGZsYWcgPT0gMikKKyAgICBpZiAoc29hcF9zMlFOYW1lKHNvYXAsIHQsICZ0KSkKKyAgICAgIHJldHVybiBOVUxMOworICByZXR1cm4gdDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF93c3RyaW5nX291dChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgd2NoYXJfdCAqcywgaW50IGZsYWcpCit7IGNvbnN0IGNoYXIgKnQ7CisgIGNoYXIgdG1wOworICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgd2NoYXJfdCAqciA9ICh3Y2hhcl90KilzOworICAgIGludCBuID0gMTsKKyAgICB3aGlsZSAoKnIrKykKKyAgICAgIG4rKzsKKyAgICBzb2FwLT5kb20tPndpZGUgPSByID0gKHdjaGFyX3QqKXNvYXBfbWFsbG9jKHNvYXAsIG4gKiBzaXplb2Yod2NoYXJfdCkpOworICAgIHdoaWxlIChuLS0pCisgICAgICAqcisrID0gKnMrKzsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2VuZGlmCisgIHdoaWxlICgoYyA9ICpzKyspKQorICB7IHN3aXRjaCAoYykKKyAgICB7IAorICAgIGNhc2UgOToKKyAgICAgIGlmIChmbGFnKQorICAgICAgICB0ID0gIiYjeDk7IjsKKyAgICAgIGVsc2UKKyAgICAgICAgdCA9ICJcdCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEwOgorICAgICAgaWYgKGZsYWcgfHwgIShzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKSkKKyAgICAgICAgdCA9ICImI3hBOyI7CisgICAgICBlbHNlCisgICAgICAgIHQgPSAiXG4iOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMzoKKyAgICAgIHQgPSAiJiN4RDsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnJic6CisgICAgICB0ID0gIiZhbXA7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJzwnOgorICAgICAgdCA9ICImbHQ7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJz4nOgorICAgICAgaWYgKGZsYWcpCisgICAgICAgIHQgPSAiPiI7CisgICAgICBlbHNlCisJdCA9ICImZ3Q7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJyInOgorICAgICAgaWYgKGZsYWcpCisgICAgICAgIHQgPSAiJnF1b3Q7IjsKKyAgICAgIGVsc2UKKyAgICAgICAgdCA9ICJcIiI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKGMgPiAwICYmIGMgPCAweDgwKQorICAgICAgeyB0bXAgPSAoY2hhciljOworICAgICAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAmdG1wLCAxKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB9CisgICAgICBlbHNlIGlmIChzb2FwX3B1dHV0Zjgoc29hcCwgKHVuc2lnbmVkIGxvbmcpYykpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoc29hcF9zZW5kKHNvYXAsIHQpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit3Y2hhcl90ICoKK1NPQVBfRk1BQzIKK3NvYXBfd3N0cmluZ19pbihzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGZsYWcsIGxvbmcgbWlubGVuLCBsb25nIG1heGxlbikKK3sgd2NoYXJfdCAqczsKKyAgcmVnaXN0ZXIgaW50IGksIG4gPSAwOworICByZWdpc3RlciBsb25nIGwgPSAwOworICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIGNvbnN0IGNoYXIgKnQgPSBOVUxMOworICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVhZGluZyB3aWRlIHN0cmluZyBjb250ZW50XG4iKSk7CisgIGlmIChzb2FwLT5wZWVrZWQpCisgIHsgaWYgKCFzb2FwLT5ib2R5KQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCpzb2FwLT50YWcpCisgICAgeyBuID0gMTsKKyAgICAgIHNvYXAtPnBlZWtlZCA9IDA7CisgICAgfQorICB9CisgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgZm9yICg7OykKKyAgeyBpZiAoIShzID0gKHdjaGFyX3QqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBzaXplb2Yod2NoYXJfdCkqU09BUF9CTEtMRU4pKSkKKyAgICAgIHJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0JMS0xFTjsgaSsrKQorICAgIHsgaWYgKHQpCisgICAgICB7ICpzKysgPSAod2NoYXJfdCkqdCsrOworICAgICAgICBpZiAoISp0KQorICAgICAgICAgIHQgPSBOVUxMOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisgICAgICBzd2l0Y2ggKGMpCisgICAgICB7CisgICAgICBjYXNlIFNPQVBfVFQ6CisgICAgICAgIGlmIChuID09IDApCisgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIG4tLTsKKyAgICAgICAgKnMrKyA9ICc8JzsKKyAgICAgICAgc29hcF91bmdldChzb2FwLCAnLycpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9MVDoKKyAgICAgICAgbisrOworICAgICAgICAqcysrID0gJzwnOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9HVDoKKyAgICAgICAgKnMrKyA9ICc+JzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfUVQ6CisgICAgICAgICpzKysgPSAnIic7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTT0FQX0FQOgorICAgICAgICAqcysrID0gJ1wnJzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICcvJzoKKyAgICAgICAgaWYgKG4gPiAwKQorICAgICAgICB7IGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisgICAgICAgICAgaWYgKGMgPT0gU09BUF9HVCkKKyAgICAgICAgICAgIG4tLTsKKyAgICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICB9CisgICAgICAgICpzKysgPSAnLyc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnPCc6CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICpzKysgPSAoc29hcF93Y2hhciknPCc7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAqcysrID0gKHNvYXBfd2NoYXIpJyYnOworICAgICAgICAgIHQgPSAibHQ7IjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJz4nOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gKHNvYXBfd2NoYXIpJz4nOworICAgICAgICBlbHNlCisgICAgICAgIHsgKnMrKyA9IChzb2FwX3djaGFyKScmJzsKKyAgICAgICAgICB0ID0gImd0OyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICciJzoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9IChzb2FwX3djaGFyKSciJzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAoc29hcF93Y2hhciknJic7CisgICAgICAgICAgdCA9ICJxdW90OyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgKnMrKyA9ICh3Y2hhcl90KWMgJiAweDdGRkZGRkZGOworICAgICAgfQorICAgICAgbCsrOworICAgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiBtYXhsZW4gPj0gMCAmJiBsID4gbWF4bGVuKQorICAgICAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiU3RyaW5nIHRvbyBsb25nOiBtYXhsZW49JWxkXG4iLCBtYXhsZW4pKTsKKyAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0xFTkdUSDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgfQorICB9CitlbmQ6CisgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICpzID0gJ1wwJzsKKyAgc29hcF9zaXplX2Jsb2NrKHNvYXAsIHNpemVvZih3Y2hhcl90KSAqIChpICsgMSkpOworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIGwgPCBtaW5sZW4pCisgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlN0cmluZyB0b28gc2hvcnQ6ICVsZCBjaGFycywgbWlubGVuPSVsZFxuIiwgbCwgbWlubGVuKSk7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0xFTkdUSDsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBzID0gKHdjaGFyX3QqKXNvYXBfc2F2ZV9ibG9jayhzb2FwLCBOVUxMLCAwKTsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgICBzb2FwLT5kb20tPndpZGUgPSBzOworI2VuZGlmCisgIHJldHVybiBzOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9pbnQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4pCit7IHJldHVybiBzb2FwX2xvbmcycyhzb2FwLCAobG9uZyluKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRpbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBpbnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfbG9uZzJzKHNvYXAsIChsb25nKSpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMmludChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgaW50ICpwKQoreyBpZiAocykKKyAgeyBjaGFyICpyOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgc29hcF9yZXNldF9lcnJubzsKKyNlbmRpZgorI2VuZGlmCisgICAgKnAgPSAoaW50KXNvYXBfc3RydG9sKHMsICZyLCAxMCk7CisgICAgaWYgKChzID09IHIgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKSB8fCAqcgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgIHx8IHNvYXBfZXJybm8gPT0gU09BUF9FUkFOR0UKKyNlbmRpZgorI2VuZGlmCisgICAgKQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5pbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjppbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpzaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAoaW50Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YoaW50KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKGludCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihpbnQpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMmludChzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9sb25nMnMoc3RydWN0IHNvYXAgKnNvYXAsIGxvbmcgbikKK3sgc3ByaW50Zihzb2FwLT50bXBidWYsICIlbGQiLCBuKTsKKyAgcmV0dXJuIHNvYXAtPnRtcGJ1ZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRsb25nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgbG9uZyAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9sb25nMnMoc29hcCwgKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MybG9uZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgbG9uZyAqcCkKK3sgaWYgKHMpCisgIHsgY2hhciAqcjsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgIHNvYXBfcmVzZXRfZXJybm87CisjZW5kaWYKKyNlbmRpZgorICAgICpwID0gc29hcF9zdHJ0b2wocywgJnIsIDEwKTsKKyAgICBpZiAoKHMgPT0gciAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpIHx8ICpyCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgfHwgc29hcF9lcnJubyA9PSBTT0FQX0VSQU5HRQorI2VuZGlmCisjZW5kaWYKKyAgICApCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitsb25nICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5sb25nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGxvbmcgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6Ynl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9IChsb25nKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YobG9uZyksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChsb25nKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKGxvbmcpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMmxvbmcoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfTE9ORzY0MnMoc3RydWN0IHNvYXAgKnNvYXAsIExPTkc2NCBuKQoreyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgU09BUF9MT05HX0ZPUk1BVCwgbik7CisgIHJldHVybiBzb2FwLT50bXBidWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0TE9ORzY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgTE9ORzY0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX0xPTkc2NDJzKHNvYXAsICpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMkxPTkc2NChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgTE9ORzY0ICpwKQoreyBpZiAocykKKyAgeworI2lmZGVmIEhBVkVfU1RSVE9MTAorICAgIGNoYXIgKnI7CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBzb2FwX3Jlc2V0X2Vycm5vOworI2VuZGlmCisjZW5kaWYKKyAgICAqcCA9IHN0cnRvbGwocywgJnIsIDEwKTsKKyAgICBpZiAoKHMgPT0gciAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpIHx8ICpyCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgICB8fCBzb2FwX2Vycm5vID09IFNPQVBfRVJBTkdFCisjZW5kaWYKKyNlbmRpZgorICAgICAgKQorI2Vsc2UKKyMgaWZkZWYgSEFWRV9TU0NBTkYKKyAgICBpZiAoc3NjYW5mKHMsIFNPQVBfTE9OR19GT1JNQVQsIHApICE9IDEpCisjIGVuZGlmCisjZW5kaWYKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK0xPTkc2NCAqCitTT0FQX0ZNQUMyCitzb2FwX2luTE9ORzY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIExPTkc2NCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6aW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnBvc2l0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOm5lZ2F0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOm5vblBvc2l0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOm5vbk5lZ2F0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmxvbmciKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjppbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpzaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAoTE9ORzY0Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YoTE9ORzY0KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKExPTkc2NCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihMT05HNjQpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMkxPTkc2NChzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9ieXRlMnMoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgbikKK3sgcmV0dXJuIHNvYXBfbG9uZzJzKHNvYXAsIChsb25nKW4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dGJ5dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX2xvbmcycyhzb2FwLCAobG9uZykqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJieXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBjaGFyICpwKQoreyBpZiAocykKKyAgeyBsb25nIG47CisgICAgY2hhciAqcjsKKyAgICBuID0gc29hcF9zdHJ0b2wocywgJnIsIDEwKTsKKyAgICBpZiAocyA9PSByIHx8ICpyIHx8IG4gPCAtMTI4IHx8IG4gPiAxMjcpCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICAqcCA9IChjaGFyKW47CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX2luYnl0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBjaGFyICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpieXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKGNoYXIqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihjaGFyKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKGNoYXIqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YoY2hhciksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MyYnl0ZShzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9zaG9ydDJzKHN0cnVjdCBzb2FwICpzb2FwLCBzaG9ydCBuKQoreyByZXR1cm4gc29hcF9sb25nMnMoc29hcCwgKGxvbmcpbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0c2hvcnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzaG9ydCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9sb25nMnMoc29hcCwgKGxvbmcpKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3Myc2hvcnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHNob3J0ICpwKQoreyBpZiAocykKKyAgeyBsb25nIG47CisgICAgY2hhciAqcjsKKyAgICBuID0gc29hcF9zdHJ0b2wocywgJnIsIDEwKTsKKyAgICBpZiAocyA9PSByIHx8ICpyIHx8IG4gPCAtMzI3NjggfHwgbiA+IDMyNzY3KQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgKnAgPSAoc2hvcnQpbjsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitzaG9ydCAqCitTT0FQX0ZNQUMyCitzb2FwX2luc2hvcnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc2hvcnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6Ynl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9IChzaG9ydCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKHNob3J0KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKHNob3J0Kilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKHNob3J0KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJzaG9ydChzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9mbG9hdDJzKHN0cnVjdCBzb2FwICpzb2FwLCBmbG9hdCBuKQoreyBjb25zdCBjaGFyICpzOworICBpZiAoc29hcF9pc25hbigoZG91YmxlKW4pKQorICAgIHMgPSAiTmFOIjsKKyAgZWxzZSBpZiAoc29hcF9pc3BpbmZmKG4pKQorICAgIHMgPSAiSU5GIjsKKyAgZWxzZSBpZiAoc29hcF9pc25pbmZmKG4pKQorICAgIHMgPSAiLUlORiI7CisgIGVsc2UKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1Ziwgc29hcC0+ZmxvYXRfZm9ybWF0LCBuKTsKKyAgICBzID0gc29hcC0+dG1wYnVmOworICB9CisgIHJldHVybiBzOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dGZsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgZmxvYXQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfZmxvYXQycyhzb2FwLCAqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJmbG9hdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgZmxvYXQgKnApCit7IGlmIChzKQorICB7IGlmICghKnMpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgaWYgKCFzb2FwX3RhZ19jbXAocywgIklORiIpKQorICAgICAgKnAgPSBGTFRfUElORlRZOworICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAocywgIitJTkYiKSkKKyAgICAgICpwID0gRkxUX1BJTkZUWTsKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHMsICItSU5GIikpCisgICAgICAqcCA9IEZMVF9OSU5GVFk7CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChzLCAiTmFOIikpCisgICAgICAqcCA9IEZMVF9OQU47CisgICAgZWxzZQorICAgIHsKKy8qIE9uIHNvbWUgc3lzdGVtcywgc3RydG9mIGFwcGVhcnMgdG8gYmUgYnJva2VuIG9yIGRvZXNuJ3QgbGluazogdXNlIHdpdGggY2F1dGlvbiAqLworI2lmIGRlZmluZWQoSEFWRV9TVFJUT0YpCisgICAgICBjaGFyICpyOworICAgICAgKnAgPSBzdHJ0b2YoKGNoYXIqKXMsICZyKTsKKyAgICAgIGlmICgqcikKKyNlbGlmIGRlZmluZWQoSEFWRV9TVFJUT0QpCisgICAgICBjaGFyICpyOworICAgICAgKnAgPSAoZmxvYXQpc3RydG9kKHMsICZyKTsKKyAgICAgIGlmICgqcikKKyNlbmRpZgorI2lmZGVmIEhBVkVfU1NDQU5GCisgICAgICAgIGlmIChzc2NhbmYocywgIiVnIiwgcCkgIT0gMSkKKyAgICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyNlbHNlCisgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworI2VuZGlmCisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBpbnQgc29hcF9pc251bWVyaWMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnR5cGUpCit7IGlmIChzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpmbG9hdCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmRvdWJsZSIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmRlY2ltYWwiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjppbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6cG9zaXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bmVnYXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bm9uUG9zaXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bm9uTmVnYXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bG9uZyIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6Ynl0ZSIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkTG9uZyIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkSW50IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRTaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkQnl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBTT0FQX0VSUjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2Zsb2F0ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5mbG9hdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBmbG9hdCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZSAhPSAnXDAnICYmIHNvYXBfaXNudW1lcmljKHNvYXAsIHR5cGUpKQorICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgIHAgPSAoZmxvYXQqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihmbG9hdCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChmbG9hdCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihmbG9hdCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MyZmxvYXQoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZG91YmxlMnMoc3RydWN0IHNvYXAgKnNvYXAsIGRvdWJsZSBuKQoreyBjb25zdCBjaGFyICpzOworICBpZiAoc29hcF9pc25hbihuKSkKKyAgICBzID0gIk5hTiI7CisgIGVsc2UgaWYgKHNvYXBfaXNwaW5mZChuKSkKKyAgICBzID0gIklORiI7CisgIGVsc2UgaWYgKHNvYXBfaXNuaW5mZChuKSkKKyAgICBzID0gIi1JTkYiOworICBlbHNlCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsIHNvYXAtPmRvdWJsZV9mb3JtYXQsIG4pOworICAgIHMgPSBzb2FwLT50bXBidWY7CisgIH0KKyAgcmV0dXJuIHM7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0ZG91YmxlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgZG91YmxlICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX2RvdWJsZTJzKHNvYXAsICpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMmRvdWJsZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgZG91YmxlICpwKQoreyBpZiAocykKKyAgeyBpZiAoISpzKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIGlmICghc29hcF90YWdfY21wKHMsICJJTkYiKSkKKyAgICAgICpwID0gREJMX1BJTkZUWTsKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHMsICIrSU5GIikpCisgICAgICAqcCA9IERCTF9QSU5GVFk7CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChzLCAiLUlORiIpKQorICAgICAgKnAgPSBEQkxfTklORlRZOworICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAocywgIk5hTiIpKQorICAgICAgKnAgPSBEQkxfTkFOOworICAgIGVsc2UKKyAgICB7CisjaWZkZWYgSEFWRV9TVFJUT0QKKyAgICAgIGNoYXIgKnI7CisgICAgICAqcCA9IHN0cnRvZChzLCAmcik7CisgICAgICBpZiAoKnIpCisjZW5kaWYKKyNpZmRlZiBIQVZFX1NTQ0FORgorICAgICAgICBpZiAoc3NjYW5mKHMsICIlbGciLCBwKSAhPSAxKQorICAgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworI2Vsc2UKKyAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisjZW5kaWYKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorZG91YmxlICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5kb3VibGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgZG91YmxlICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlICE9ICdcMCcgJiYgc29hcF9pc251bWVyaWMoc29hcCwgdHlwZSkpCisgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgcCA9IChkb3VibGUqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihkb3VibGUpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAoZG91YmxlKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKGRvdWJsZSksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MyZG91YmxlKHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3Vuc2lnbmVkQnl0ZTJzKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBjaGFyIG4pCit7IHJldHVybiBzb2FwX3Vuc2lnbmVkTG9uZzJzKHNvYXAsICh1bnNpZ25lZCBsb25nKW4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHVuc2lnbmVkQnl0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfdW5zaWduZWRMb25nMnMoc29hcCwgKHVuc2lnbmVkIGxvbmcpKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MydW5zaWduZWRCeXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBjaGFyICpwKQoreyBpZiAocykKKyAgeyB1bnNpZ25lZCBsb25nIG47CisgICAgY2hhciAqcjsKKyAgICBuID0gc29hcF9zdHJ0b3VsKHMsICZyLCAxMCk7CisgICAgaWYgKHMgPT0gciB8fCAqciB8fCBuID4gMjU1KQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgKnAgPSAodW5zaWduZWQgY2hhciluOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3Vuc2lnbmVkIGNoYXIgKgorU09BUF9GTUFDMgorc29hcF9pbnVuc2lnbmVkQnl0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB1bnNpZ25lZCBjaGFyICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAodW5zaWduZWQgY2hhciopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAodW5zaWduZWQgY2hhciopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZih1bnNpZ25lZCBjaGFyKSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJ1bnNpZ25lZEJ5dGUoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfdW5zaWduZWRTaG9ydDJzKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBzaG9ydCBuKQoreyByZXR1cm4gc29hcF91bnNpZ25lZExvbmcycyhzb2FwLCAodW5zaWduZWQgbG9uZyluKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXR1bnNpZ25lZFNob3J0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgdW5zaWduZWQgc2hvcnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfdW5zaWduZWRMb25nMnMoc29hcCwgKHVuc2lnbmVkIGxvbmcpKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MydW5zaWduZWRTaG9ydChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgdW5zaWduZWQgc2hvcnQgKnApCit7IGlmIChzKQorICB7IHVuc2lnbmVkIGxvbmcgbjsKKyAgICBjaGFyICpyOworICAgIG4gPSBzb2FwX3N0cnRvdWwocywgJnIsIDEwKTsKKyAgICBpZiAocyA9PSByIHx8ICpyIHx8IG4gPiA2NTUzNSkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgICpwID0gKHVuc2lnbmVkIHNob3J0KW47CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordW5zaWduZWQgc2hvcnQgKgorU09BUF9GTUFDMgorc29hcF9pbnVuc2lnbmVkU2hvcnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgdW5zaWduZWQgc2hvcnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkU2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAodW5zaWduZWQgc2hvcnQqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZih1bnNpZ25lZCBzaG9ydCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9ICh1bnNpZ25lZCBzaG9ydCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZih1bnNpZ25lZCBzaG9ydCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MydW5zaWduZWRTaG9ydChzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF91bnNpZ25lZEludDJzKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBpbnQgbikKK3sgcmV0dXJuIHNvYXBfdW5zaWduZWRMb25nMnMoc29hcCwgKHVuc2lnbmVkIGxvbmcpbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0dW5zaWduZWRJbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCB1bnNpZ25lZCBpbnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfdW5zaWduZWRMb25nMnMoc29hcCwgKHVuc2lnbmVkIGxvbmcpKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MydW5zaWduZWRJbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCAqcCkKK3sgaWYgKHMpCisgIHsgY2hhciAqcjsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgIHNvYXBfcmVzZXRfZXJybm87CisjZW5kaWYKKyNlbmRpZgorICAgICpwID0gKHVuc2lnbmVkIGludClzb2FwX3N0cnRvdWwocywgJnIsIDEwKTsKKyAgICBpZiAoKHMgPT0gciAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpIHx8ICpyCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgfHwgc29hcF9lcnJubyA9PSBTT0FQX0VSQU5HRQorI2VuZGlmCisjZW5kaWYKKyAgICApCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit1bnNpZ25lZCBpbnQgKgorU09BUF9GTUFDMgorc29hcF9pbnVuc2lnbmVkSW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIGludCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRJbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZFNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRCeXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKHVuc2lnbmVkIGludCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKHVuc2lnbmVkIGludCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9ICh1bnNpZ25lZCBpbnQqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YodW5zaWduZWQgaW50KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJ1bnNpZ25lZEludChzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF91bnNpZ25lZExvbmcycyhzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgbG9uZyBuKQoreyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIiVsdSIsIG4pOworICByZXR1cm4gc29hcC0+dG1wYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHVuc2lnbmVkTG9uZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfdW5zaWduZWRMb25nMnMoc29hcCwgKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MydW5zaWduZWRMb25nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBsb25nICpwKQoreyBpZiAocykKKyAgeyBjaGFyICpyOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgc29hcF9yZXNldF9lcnJubzsKKyNlbmRpZgorI2VuZGlmCisgICAgKnAgPSBzb2FwX3N0cnRvdWwocywgJnIsIDEwKTsKKyAgICBpZiAoKHMgPT0gciAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpIHx8ICpyCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgfHwgc29hcF9lcnJubyA9PSBTT0FQX0VSQU5HRQorI2VuZGlmCisjZW5kaWYKKyAgICApCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit1bnNpZ25lZCBsb25nICoKK1NPQVBfRk1BQzIKK3NvYXBfaW51bnNpZ25lZExvbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgdW5zaWduZWQgbG9uZyAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRJbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZFNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRCeXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKHVuc2lnbmVkIGxvbmcqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZih1bnNpZ25lZCBsb25nKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKHVuc2lnbmVkIGxvbmcqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YodW5zaWduZWQgbG9uZyksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MydW5zaWduZWRMb25nKHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX1VMT05HNjQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgVUxPTkc2NCBuKQoreyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgU09BUF9VTE9OR19GT1JNQVQsIG4pOworICByZXR1cm4gc29hcC0+dG1wYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dFVMT05HNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBVTE9ORzY0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX1VMT05HNjQycyhzb2FwLCAqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJVTE9ORzY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBVTE9ORzY0ICpwKQoreyBpZiAocykKKyAgeworI2lmZGVmIEhBVkVfU1RSVE9VTEwKKyAgICBjaGFyICpyOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgc29hcF9yZXNldF9lcnJubzsKKyNlbmRpZgorI2VuZGlmCisgICAgKnAgPSBzdHJ0b3VsbChzLCAmciwgMTApOworICAgIGlmICgocyA9PSByICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkgfHwgKnIKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgIHx8IHNvYXBfZXJybm8gPT0gU09BUF9FUkFOR0UKKyNlbmRpZgorI2VuZGlmCisgICAgICApCisjZWxzZQorIyBpZmRlZiBIQVZFX1NTQ0FORgorICAgIGlmIChzc2NhbmYocywgU09BUF9VTE9OR19GT1JNQVQsIHApICE9IDEpCisjIGVuZGlmCisjZW5kaWYKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK1VMT05HNjQgKgorU09BUF9GTUFDMgorc29hcF9pblVMT05HNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgVUxPTkc2NCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpwb3NpdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpub25OZWdhdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZExvbmciKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkU2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwID0gKFVMT05HNjQqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihVTE9ORzY0KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKFVMT05HNjQqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YoVUxPTkc2NCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MyVUxPTkc2NChzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJzdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGNoYXIgKip0KQoreyAqdCA9IE5VTEw7CisgIGlmIChzKQorICB7IGlmICghKCp0ID0gc29hcF9zdHJkdXAoc29hcCwgcykpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgaWYgKCEoc29hcC0+bW9kZSAmIChTT0FQX0VOQ19MQVRJTiB8IFNPQVBfQ19VVEZTVFJJTkcpKSkKKyAgICB7IC8qIFRPRE86IGNvbnNpZGVyIHRydW5jYXRpbmcgVVRGOCB0byBBU0NJSSBmb3IgcmVndWxhciBYTUwgYXR0cmlidXRlIHN0cmluZ3M/ICovCisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMlFOYW1lKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBjaGFyICoqdCkKK3sgaWYgKHMpCisgIHsgc3RydWN0IHNvYXBfbmxpc3QgKm5wOworICAgIGNvbnN0IGNoYXIgKnA7CisgICAgaWYgKCFzdHJuY21wKHMsICJ4bWw6IiwgNCkpCisgICAgeyAqdCA9IHNvYXBfc3RyZHVwKHNvYXAsIHMpOworICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgfQorICAgIG5wID0gc29hcC0+bmxpc3Q7CisgICAgcCA9IHN0cmNocihzLCAnOicpOworICAgIGlmIChwKQorICAgIHsgcmVnaXN0ZXIgaW50IG4gPSBwIC0gczsKKyAgICAgIHdoaWxlIChucCAmJiAoc3RybmNtcChucC0+aWQsIHMsIG4pIHx8IG5wLT5pZFtuXSkpCisgICAgICAgIG5wID0gbnAtPm5leHQ7CisgICAgICBwKys7CisgICAgfQorICAgIGVsc2UKKyAgICB7IHdoaWxlIChucCAmJiAqbnAtPmlkKQorICAgICAgICBucCA9IG5wLT5uZXh0OworICAgICAgcCA9IHM7CisgICAgfQorICAgIGlmIChucCkKKyAgICB7IGlmIChucC0+aW5kZXggPj0gMCAmJiBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzKQorICAgICAgeyByZWdpc3RlciBjb25zdCBjaGFyICpxID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tucC0+aW5kZXhdLmlkOworICAgICAgICBpZiAocSkKKyAgICAgICAgeyBpZiAoKCp0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihwKSArIHN0cmxlbihxKSArIDIpKSkKKyAgICAgICAgICAgIHNwcmludGYoKnQsICIlczolcyIsIHEsIHApOworICAgICAgICAgIHJldHVybiBTT0FQX09LOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAobnAtPm5zKQorICAgICAgeyBpZiAoKCp0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihwKSArIHN0cmxlbihucC0+bnMpICsgNCkpKQorICAgICAgICAgIHNwcmludGYoKnQsICJcIiVzXCI6JXMiLCBucC0+bnMsIHApOworICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICAgIH0KKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTmFtZXNwYWNlIHByZWZpeCBvZiAnJXMnIG5vdCBkZWZpbmVkIChpbmRleD0lZCwgVVJJPSVzKVxuIiwgcywgbnAtPmluZGV4LCBucC0+bnM/bnAtPm5zOiIiKSk7CisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX05BTUVTUEFDRTsgCisgICAgfQorICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTmFtZXNwYWNlIHByZWZpeCBvZiAnJXMnIG5vdCBkZWZpbmVkLCBhc3N1bWluZyBlbXB0eSBuYW1lc3BhY2VcbiIsIHMpKTsKKyAgICBpZiAoKCp0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihwKSArIDQpKSkKKyAgICAgIHNwcmludGYoKnQsICJcIlwiOiVzIiwgcCk7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfUU5hbWUycyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcykKK3sgc3RydWN0IE5hbWVzcGFjZSAqcDsKKyAgY2hhciAqdDsKKyAgaW50IG47CisgIGlmICghcyB8fCAqcyAhPSAnIicpCisgIHsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKHMgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpKQorICAgIHsgdCA9IChjaGFyKilzdHJjaHIocywgJzonKTsKKyAgICAgIGlmICh0KQorICAgICAgICBzb2FwX3V0aWxpemVfbnMoc29hcCwgcywgdCAtIHMpOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBzOworICB9CisgIHMrKzsKKyAgaWYgKChwID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlcykpCisgIHsgZm9yICg7IHAtPmlkOyBwKyspCisgICAgeyBpZiAocC0+bnMpCisgICAgICAgIGlmICghc29hcF90YWdfY21wKHMsIHAtPm5zKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIGlmIChwLT5pbikKKyAgICAgICAgaWYgKCFzb2FwX3RhZ19jbXAocywgcC0+aW4pKQorICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAocCAmJiBwLT5pZCkKKyAgICB7IHMgPSBzdHJjaHIocywgJyInKTsKKyAgICAgIGlmIChzKQorICAgICAgeyB0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihwLT5pZCkgKyBzdHJsZW4ocykpOworICAgICAgICBzdHJjcHkodCwgcC0+aWQpOworCXN0cmNhdCh0LCBzICsgMSk7CisgICAgICAgIHJldHVybiB0OworICAgICAgfQorICAgIH0KKyAgfQorICB0ID0gKGNoYXIqKXN0cmNocihzLCAnIicpOworICBpZiAodCkKKyAgICBuID0gdCAtIHM7CisgIGVsc2UKKyAgICBuID0gMDsKKyAgdCA9IHNvYXBfc3RyZHVwKHNvYXAsIHMpOworICB0W25dID0gJ1wwJzsKKyAgc3ByaW50Zihzb2FwLT50bXBidWYsICJ4bWxuczpfJWQiLCBzb2FwLT5pZG51bSsrKTsKKyAgc29hcF9zZXRfYXR0cihzb2FwLCBzb2FwLT50bXBidWYsIHQpOworICBzID0gc3RyY2hyKHMsICciJyk7CisgIGlmIChzKQorICB7IHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc3RybGVuKHNvYXAtPnRtcGJ1ZikgKyBzdHJsZW4ocykgLSA2KTsKKyAgICBzdHJjcHkodCwgc29hcC0+dG1wYnVmICsgNik7CisgICAgc3RyY2F0KHQsIHMgKyAxKTsKKyAgfQorICByZXR1cm4gdDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMndjaGFyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCB3Y2hhcl90ICoqdCkKK3sgd2NoYXJfdCAqcjsKKyAgaWYgKCFzKQorICAgICp0ID0gTlVMTDsKKyAgZWxzZQorICB7ICp0ID0gciA9ICh3Y2hhcl90Kilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yod2NoYXJfdCkgKiAoc3RybGVuKHMpICsgMSkpOworICAgIGlmICghcikKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0xBVElOKQorICAgIHsgd2hpbGUgKCpzKQorICAgICAgICAqcisrID0gKHdjaGFyX3QpKnMrKzsKKyAgICB9CisgICAgZWxzZQorICAgIHsgLyogQ29udmVydCBVVEY4IHRvIHdjaGFyICovCisgICAgICB3aGlsZSAoKnMpCisgICAgICB7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYywgYzEsIGMyLCBjMywgYzQ7CisgICAgICAgIGMgPSAqcysrOworICAgICAgICBpZiAoYyA8IDB4ODApCisJICAqcisrID0gKHdjaGFyX3QpYzsKKwllbHNlCisgICAgICAgIHsgYzEgPSAoc29hcF93Y2hhcikqcysrICYgMHgzRjsKKyAgICAgICAgICBpZiAoYyA8IDB4RTApCisgICAgICAgICAgICAqcisrID0gKHdjaGFyX3QpKCgoc29hcF93Y2hhcikoYyAmIDB4MUYpIDw8IDYpIHwgYzEpOworICAgICAgICAgIGVsc2UKKwkgIHsgYzIgPSAoc29hcF93Y2hhcikqcysrICYgMHgzRjsKKyAgICAgICAgICAgIGlmIChjIDwgMHhGMCkKKyAgICAgICAgICAgICAgKnIrKyA9ICh3Y2hhcl90KSgoKHNvYXBfd2NoYXIpKGMgJiAweDBGKSA8PCAxMikgfCAoYzEgPDwgNikgfCBjMik7CisgICAgICAgICAgICBlbHNlCisJICAgIHsgYzMgPSAoc29hcF93Y2hhcikqcysrICYgMHgzRjsKKyAgICAgICAgICAgICAgaWYgKGMgPCAweEY4KQorICAgICAgICAgICAgICAgICpyKysgPSAod2NoYXJfdCkoKChzb2FwX3djaGFyKShjICYgMHgwNykgPDwgMTgpIHwgKGMxIDw8IDEyKSB8IChjMiA8PCA2KSB8IGMzKTsKKyAgICAgICAgICAgICAgZWxzZQorCSAgICAgIHsgYzQgPSAoc29hcF93Y2hhcikqcysrICYgMHgzRjsKKyAgICAgICAgICAgICAgICBpZiAoYyA8IDB4RkMpCisgICAgICAgICAgICAgICAgICAqcisrID0gKHdjaGFyX3QpKCgoc29hcF93Y2hhcikoYyAmIDB4MDMpIDw8IDI0KSB8IChjMSA8PCAxOCkgfCAoYzIgPDwgMTIpIHwgKGMzIDw8IDYpIHwgYzQpOworICAgICAgICAgICAgICAgIGVsc2UKKwkJICAqcisrID0gKHdjaGFyX3QpKCgoc29hcF93Y2hhcikoYyAmIDB4MDEpIDw8IDMwKSB8IChjMSA8PCAyNCkgfCAoYzIgPDwgMTgpIHwgKGMzIDw8IDEyKSB8IChjNCA8PCA2KSB8IChzb2FwX3djaGFyKSgqcysrICYgMHgzRikpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgICpyID0gTCdcMCc7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF93Y2hhcjJzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB3Y2hhcl90ICpzKQoreyByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIHJlZ2lzdGVyIGNoYXIgKnIsICp0OworICBjb25zdCB3Y2hhcl90ICpxID0gczsKKyAgc2l6ZV90IG4gPSAwOworICB3aGlsZSAoKGMgPSAqcSsrKSkKKyAgeyBpZiAoYyA+IDAgJiYgYyA8IDB4ODApCisgICAgICBuKys7CisgICAgZWxzZQorICAgICAgbiArPSA2OworICB9CisgIHIgPSB0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIG4gKyAxKTsKKyAgaWYgKHIpCisgIHsgLyogQ29udmVydCB3Y2hhciB0byBVVEY4ICovCisgICAgd2hpbGUgKChjID0gKnMrKykpCisgICAgeyBpZiAoYyA+IDAgJiYgYyA8IDB4ODApCisgICAgICAgICp0KysgPSAoY2hhciljOworICAgICAgZWxzZQorICAgICAgeyBpZiAoYyA8IDB4MDgwMCkKKyAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4QzAgfCAoKGMgPj4gNikgJiAweDFGKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyBpZiAoYyA8IDB4MDEwMDAwKQorICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEUwIHwgKChjID4+IDEyKSAmIDB4MEYpKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeyBpZiAoYyA8IDB4MjAwMDAwKQorICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjAgfCAoKGMgPj4gMTgpICYgMHgwNykpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyBpZiAoYyA8IDB4MDQwMDAwMDApCisgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEY4IHwgKChjID4+IDI0KSAmIDB4MDMpKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7ICp0KysgPSAoY2hhcikoMHhGQyB8ICgoYyA+PiAzMCkgJiAweDAxKSk7CisgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDI0KSAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTgpICYgMHgzRikpOworICAgICAgICAgICAgfSAgICAgCisgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTIpICYgMHgzRikpOworICAgICAgICAgIH0KKyAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gNikgJiAweDNGKSk7CisgICAgICAgIH0KKyAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKGMgJiAweDNGKSk7CisgICAgICB9CisgICAgfQorICAgICp0ID0gJ1wwJzsKKyAgfQorICByZXR1cm4gcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRzdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjaGFyICpjb25zdCpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikgCit7IGlkID0gc29hcF9lbGVtZW50X2lkKHNvYXAsIHRhZywgaWQsICpwLCBOVUxMLCAwLCB0eXBlLCBuKTsKKyAgaWYgKGlkIDwgMAorICAgfHwgc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIGlkLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsICpwLCAwKQorICAgfHwgc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqKgorU09BUF9GTUFDMgorc29hcF9pbnN0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBjaGFyICoqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQsIGludCBmbGFnLCBsb25nIG1pbmxlbiwgbG9uZyBtYXhsZW4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAxKSkKKyAgeyBpZiAoIXRhZyB8fCAqdGFnICE9ICctJyB8fCBzb2FwLT5lcnJvciAhPSBTT0FQX05PX1RBRykKKyAgICAgIHJldHVybiBOVUxMOworICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgfQorICBpZiAoIXApCisgICAgaWYgKCEocCA9IChjaGFyKiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKGNoYXIqKSkpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIGlmIChzb2FwLT5ib2R5KQorICB7ICpwID0gc29hcF9zdHJpbmdfaW4oc29hcCwgZmxhZywgbWlubGVuLCBtYXhsZW4pOworICAgIGlmICghKnAgfHwgIShjaGFyKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCAqcCwgdCwgc2l6ZW9mKGNoYXIqKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBlbHNlIGlmIChzb2FwLT5udWxsKQorICAgICpwID0gTlVMTDsKKyAgZWxzZQorICAgICpwID0gKGNoYXIqKVNPQVBfU1RSX0VPUzsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAoY2hhcioqKXNvYXBfaWRfbG9va3VwKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopcCwgdCwgc2l6ZW9mKGNoYXIqKiksIDApOworICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHdzdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCB3Y2hhcl90ICpjb25zdCpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikgCit7IGlkID0gc29hcF9lbGVtZW50X2lkKHNvYXAsIHRhZywgaWQsICpwLCBOVUxMLCAwLCB0eXBlLCBuKTsKKyAgaWYgKGlkIDwgMAorICAgfHwgc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIGlkLCB0eXBlKQorICAgfHwgc29hcF93c3RyaW5nX291dChzb2FwLCAqcCwgMCkKKyAgIHx8IHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZykpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQord2NoYXJfdCAqKgorU09BUF9GTUFDMgorc29hcF9pbndzdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgd2NoYXJfdCAqKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0LCBsb25nIG1pbmxlbiwgbG9uZyBtYXhsZW4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAxKSkKKyAgeyBpZiAoIXRhZyB8fCAqdGFnICE9ICctJyB8fCBzb2FwLT5lcnJvciAhPSBTT0FQX05PX1RBRykKKyAgICAgIHJldHVybiBOVUxMOworICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgfQorICBpZiAoIXApCisgICAgaWYgKCEocCA9ICh3Y2hhcl90Kiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHdjaGFyX3QqKSkpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIGlmIChzb2FwLT5ib2R5KQorICB7ICpwID0gc29hcF93c3RyaW5nX2luKHNvYXAsIDEsIG1pbmxlbiwgbWF4bGVuKTsKKyAgICBpZiAoISpwIHx8ICEod2NoYXJfdCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgKnAsIHQsIHNpemVvZih3Y2hhcl90KiksIDAsIE5VTEwsIE5VTEwsIE5VTEwpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZWxzZSBpZiAoc29hcC0+bnVsbCkKKyAgICAqcCA9IE5VTEw7CisgIGVsc2UKKyAgICAqcCA9ICh3Y2hhcl90KilTT0FQX1NUUl9FT1M7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKHdjaGFyX3QqKilzb2FwX2lkX2xvb2t1cChzb2FwLCBzb2FwLT5ocmVmLCAodm9pZCoqKXAsIHQsIHNpemVvZih3Y2hhcl90KiopLCAwKTsKKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIHRpbWVfdAorc29hcF90aW1lZ20oc3RydWN0IHRtICpUKQoreworI2lmIGRlZmluZWQoSEFWRV9USU1FR00pCisgIHJldHVybiB0aW1lZ20oVCk7CisjZWxzZQorICB0aW1lX3QgdCwgZywgejsKKyNpZmRlZiBIQVZFX0dNVElNRV9SCisgIHN0cnVjdCB0bSB0bSwgKnRtcCA9ICZ0bTsKKyNlbHNlCisgIHN0cnVjdCB0bSAqdG1wOworI2VuZGlmCisgIHQgPSBta3RpbWUoVCk7CisgIGlmICh0ID09IC0xKQorICAgIHJldHVybiAtMTsKKyNpZmRlZiBIQVZFX0dNVElNRV9SCisgIGdtdGltZV9yKCZ0LCB0bXApOworI2Vsc2UKKyAgdG1wID0gZ210aW1lKCZ0KTsKKyNlbmRpZgorICB0bXAtPnRtX2lzZHN0ID0gMDsKKyAgZyA9IG1rdGltZSh0bXApOworICBpZiAoZyA9PSAtMSkKKyAgICByZXR1cm4gLTE7CisgIHogPSBnIC0gdDsKKyAgcmV0dXJuIHQgLSB6OworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9kYXRlVGltZTJzKHN0cnVjdCBzb2FwICpzb2FwLCB0aW1lX3QgbikKK3sgc3RydWN0IHRtIFQsICpwVCA9ICZUOworI2lmIGRlZmluZWQoSEFWRV9HTVRJTUVfUikKKyAgaWYgKGdtdGltZV9yKCZuLCBwVCkpCisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTWiIsIHBUKTsKKyAgLyogVGhlIGZvbGxvd2luZyBkZWZpbmVzIHdlcmUgYWRkZWQgZm9yIFZ4V29ya3MqLworI2VsaWYgZGVmaW5lZChIQVZFX1BHTVRJTUVfUikKKyAgaWYgKGdtdGltZV9yKCZuLCBwVCkpCisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTWiIsIHBUKTsKKyNlbGlmIGRlZmluZWQoSEFWRV9QR01USU1FKQorICBpZiAoZ210aW1lKCZuLCBwVCkpCisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTWiIsIHBUKTsKKyNlbGlmIGRlZmluZWQoSEFWRV9HTVRJTUUpCisgIGlmICgocFQgPSBnbXRpbWUoJm4pKSkKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVNaIiwgcFQpOworI2VsaWYgZGVmaW5lZChIQVZFX0dFVFRJTUVPRkRBWSkKKyAgc3RydWN0IHRpbWV6b25lIHR6OworICBtZW1zZXQoKHZvaWQqKSZ0eiwgMCwgc2l6ZW9mKHR6KSk7CisjIGlmIGRlZmluZWQoSEFWRV9MT0NBTFRJTUVfUikKKyAgaWYgKGxvY2FsdGltZV9yKCZuLCBwVCkpCisgIHsgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgZ2V0dGltZW9mZGF5KCZ0diwgJnR6KTsKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwVCk7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYgKyBzdHJsZW4oc29hcC0+dG1wYnVmKSwgIiUrMDNkOiUwMmQiLCAtdHoudHpfbWludXRlc3dlc3QvNjArKHBULT50bV9pc2RzdCE9MCksIGFicyh0ei50el9taW51dGVzd2VzdCklNjApOworICB9CisjIGVsc2UKKyAgaWYgKChwVCA9IGxvY2FsdGltZSgmbikpKQorICB7IHN0cnVjdCB0aW1ldmFsIHR2OworICAgIGdldHRpbWVvZmRheSgmdHYsICZ0eik7CisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmICsgc3RybGVuKHNvYXAtPnRtcGJ1ZiksICIlKzAzZDolMDJkIiwgLXR6LnR6X21pbnV0ZXN3ZXN0LzYwKyhwVC0+dG1faXNkc3QhPTApLCBhYnModHoudHpfbWludXRlc3dlc3QpJTYwKTsKKyAgfQorI2VuZGlmCisjZWxpZiBkZWZpbmVkKEhBVkVfRlRJTUUpCisgIHN0cnVjdCB0aW1lYiB0OworICBtZW1zZXQoKHZvaWQqKSZ0LCAwLCBzaXplb2YodCkpOworIyBpZiBkZWZpbmVkKEhBVkVfTE9DQUxUSU1FX1IpCisgIGlmIChsb2NhbHRpbWVfcigmbiwgcFQpKQorICB7IGZ0aW1lKCZ0KTsKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwVCk7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYgKyBzdHJsZW4oc29hcC0+dG1wYnVmKSwgIiUrMDNkOiUwMmQiLCAtdC50aW1lem9uZS82MCsocFQtPnRtX2lzZHN0IT0wKSwgYWJzKHQudGltZXpvbmUpJTYwKTsKKyAgfQorICAvKiBUaGUgZm9sbG93aW5nIGRlZmluZXMgd2VyZSBhZGRlZCBmb3IgVnhXb3JrcyovCisjIGVsaWYgZGVmaW5lZChIQVZFX1BMT0NBTFRJTUVfUikKKyAgaWYgKGxvY2FsdGltZV9yKCZuLCBwVCkpCisgIHsgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmK3N0cmxlbihzb2FwLT50bXBidWYpLCAiJSswM2Q6JTAyZCIsIHQudGltZXpvbmUvNjAsIGFicyh0LnRpbWV6b25lKSU2MCk7CisgIH0KKyMgZWxzZQorICBpZiAoKHBUID0gbG9jYWx0aW1lKCZuKSkpCisgIHsgZnRpbWUoJnQpOworICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIHN0cmxlbihzb2FwLT50bXBidWYpLCAiJSswM2Q6JTAyZCIsIC10LnRpbWV6b25lLzYwKyhwVC0+dG1faXNkc3QhPTApLCBhYnModC50aW1lem9uZSklNjApOworICB9CisjIGVuZGlmCisjZWxpZiBkZWZpbmVkKEhBVkVfTE9DQUxUSU1FX1IpCisgIGlmIChsb2NhbHRpbWVfcigmbiwgcFQpKQorICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyAgLyogVGhlIGZvbGxvd2luZyBkZWZpbmVzIHdlcmUgYWRkZWQgZm9yIFZ4V29ya3MqLworI2VsaWYgZGVmaW5lZChIQVZFX1BMT0NBTFRJTUVfUikKKyAgaWYgKGxvY2FsdGltZV9yKCZuLCBwVCkpCisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworI2Vsc2UKKyAgaWYgKChwVCA9IGxvY2FsdGltZSgmbikpKQorICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyNlbmRpZgorICBlbHNlCisgICAgc3RyY3B5KHNvYXAtPnRtcGJ1ZiwgIjE5NjktMTItMzFUMjM6NTk6NTlaIik7CisgIHJldHVybiBzb2FwLT50bXBidWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0ZGF0ZVRpbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCB0aW1lX3QgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfZGF0ZVRpbWUycyhzb2FwLCAqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJkYXRlVGltZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgdGltZV90ICpwKQoreyBpZiAocykKKyAgeyBzdHJ1Y3QgdG0gVDsKKyAgICBjaGFyIHpvbmVbMTZdOworICAgIGNvbnN0IGNoYXIgKnQ7CisgICAgbWVtc2V0KCh2b2lkKikmVCwgMCwgc2l6ZW9mKFQpKTsKKyAgICB6b25lW3NpemVvZih6b25lKS0xXSA9ICdcMCc7CisgICAgaWYgKHN0cmNocihzLCAnLScpKQorICAgICAgdCA9ICIlZC0lZC0lZFQlZDolZDolZCUxNXMiOworICAgIGVsc2UgaWYgKHN0cmNocihzLCAnOicpKQorICAgICAgdCA9ICIlNGQlMmQlMmRUJWQ6JWQ6JWQlMTVzIjsKKyAgICBlbHNlIC8qIHBhcnNlIG5vbi1YU0Qtc3RhbmRhcmQgYWx0ZXJuYXRpdmUgSVNPIDg2MDEgZm9ybWF0ICovCisgICAgICB0ID0gIiU0ZCUyZCUyZFQlMmQlMmQlMmQlMTVzIjsKKyAgICBzc2NhbmYocywgdCwgJlQudG1feWVhciwgJlQudG1fbW9uLCAmVC50bV9tZGF5LCAmVC50bV9ob3VyLCAmVC50bV9taW4sICZULnRtX3NlYywgem9uZSk7CisgICAgaWYgKFQudG1feWVhciA9PSAxKQorICAgICAgVC50bV95ZWFyID0gNzA7CisgICAgZWxzZQorICAgICAgVC50bV95ZWFyIC09IDE5MDA7CisgICAgVC50bV9tb24tLTsKKyAgICBpZiAoKnpvbmUpCisgICAgeyBpZiAoKnpvbmUgPT0gJy4nKQorICAgICAgeyBmb3IgKHMgPSB6b25lICsgMTsgKnM7IHMrKykKKyAgICAgICAgICBpZiAoKnMgPCAnMCcgfHwgKnMgPiAnOScpCisgICAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcyA9IHpvbmU7CisgICAgICBpZiAoKnMgPT0gJysnIHx8ICpzID09ICctJykKKyAgICAgIHsgaW50IGggPSAwLCBtID0gMDsKKyAgICAgICAgaWYgKHNbM10gPT0gJzonKQorCXsgc3NjYW5mKHMsICIlZDolZCIsICZoLCAmbSk7CisJICBpZiAoaCA8IDApCisJICAgIG0gPSAtbTsKKwl9CisJZWxzZQorCXsgbSA9IChpbnQpYXRvbChzKTsKKwkgIGggPSBtIC8gMTAwOworCSAgbSA9IG0gJSAxMDA7CisJfQorICAgICAgICBULnRtX2hvdXIgLT0gaDsKKyAgICAgICAgVC50bV9taW4gLT0gbTsKKyAgICAgIH0KKyAgICAgIFQudG1faXNkc3QgPSAwOworICAgICAgKnAgPSBzb2FwX3RpbWVnbSgmVCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IFQudG1faXNkc3QgPSAtMTsKKyAgICAgICpwID0gbWt0aW1lKCZUKTsgLyogbm8gdGltZSB6b25lOiBzdXBwb3NlIGl0IGlzIGxvY2FsdGltZT8gKi8KKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQordGltZV90ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5kYXRlVGltZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB0aW1lX3QgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6ZGF0ZVRpbWUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwID0gKHRpbWVfdCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKHRpbWVfdCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9ICh0aW1lX3QqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YodGltZV90KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJkYXRlVGltZShzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0bGl0ZXJhbChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBjaGFyICpjb25zdCpwKQoreyBpbnQgaTsKKyAgY29uc3QgY2hhciAqdCA9IE5VTEw7CisgIGlmICh0YWcgJiYgKnRhZyAhPSAnLScpCisgIHsgaWYgKHNvYXAtPmxvY2FsX25hbWVzcGFjZXMgJiYgKHQgPSBzdHJjaHIodGFnLCAnOicpKSkKKyAgICB7IHN0cm5jcHkoc29hcC0+dG1wYnVmLCB0YWcsIHQtdGFnKTsKKyAgICAgIHNvYXAtPnRtcGJ1Zlt0LXRhZ10gPSAnXDAnOworICAgICAgZm9yIChpID0gMDsgc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tpXS5pZDsgaSsrKQorICAgICAgICBpZiAoIXN0cmNtcChzb2FwLT50bXBidWYsIHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0uaWQpKQorICAgICAgICAgIGJyZWFrOworICAgICAgdCsrOworICAgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICI8JXMgeG1sbnM9XCIlc1wiPiIsIHQsIHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0ubnMgPyBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW2ldLm5zIDogU09BUF9TVFJfRU9TKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgdCA9IHRhZzsKKyAgICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiPCVzPiIsIHRhZyk7CisgICAgfQorICAgIGlmIChzb2FwX3NlbmQoc29hcCwgc29hcC0+dG1wYnVmKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAocCAmJiAqcCkKKyAgeyBpZiAoc29hcF9zZW5kKHNvYXAsICpwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAodCkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIjwvJXM+IiwgdCk7CisgICAgcmV0dXJuIHNvYXBfc2VuZChzb2FwLCBzb2FwLT50bXBidWYpOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqKgorU09BUF9GTUFDMgorc29hcF9pbmxpdGVyYWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgY2hhciAqKnApCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAxKSkKKyAgeyBpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9OT19UQUcgfHwgc29hcF91bmdldChzb2FwLCBzb2FwX2dldChzb2FwKSkgPT0gU09BUF9UVCkKKyAgICAgIHJldHVybiBOVUxMOworICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgfQorICBpZiAoIXApCisgICAgaWYgKCEocCA9IChjaGFyKiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKGNoYXIqKSkpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIGlmIChzb2FwLT5ib2R5KQorICAgICpwID0gc29hcF9zdHJpbmdfaW4oc29hcCwgMCwgLTEsIC0xKTsKKyAgZWxzZSBpZiAoc29hcC0+bnVsbCkKKyAgICAqcCA9IE5VTEw7CisgIGVsc2UKKyAgICAqcCA9IChjaGFyKilTT0FQX1NUUl9FT1M7CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0d2xpdGVyYWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgd2NoYXJfdCAqY29uc3QqcCkKK3sgaW50IGk7CisgIGNvbnN0IGNoYXIgKnQgPSBOVUxMOworICB3Y2hhcl90IGM7CisgIGNvbnN0IHdjaGFyX3QgKnM7CisgIGlmICh0YWcgJiYgKnRhZyAhPSAnLScpCisgIHsgaWYgKHNvYXAtPmxvY2FsX25hbWVzcGFjZXMgJiYgKHQgPSBzdHJjaHIodGFnLCAnOicpKSkKKyAgICB7IHN0cm5jcHkoc29hcC0+dG1wYnVmLCB0YWcsIHQtdGFnKTsKKyAgICAgIHNvYXAtPnRtcGJ1Zlt0LXRhZ10gPSAnXDAnOworICAgICAgZm9yIChpID0gMDsgc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tpXS5pZDsgaSsrKQorICAgICAgICBpZiAoIXN0cmNtcChzb2FwLT50bXBidWYsIHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0uaWQpKQorICAgICAgICAgIGJyZWFrOworICAgICAgdCsrOworICAgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICI8JXMgeG1sbnM9XCIlc1wiPiIsIHQsIHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0ubnMgPyBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW2ldLm5zIDogU09BUF9TVFJfRU9TKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgdCA9IHRhZzsKKyAgICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiPCVzPiIsIHRhZyk7CisgICAgfQorICAgIGlmIChzb2FwX3NlbmQoc29hcCwgc29hcC0+dG1wYnVmKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAocCkKKyAgeyBzID0gKnA7CisgICAgd2hpbGUgKChjID0gKnMrKykpCisgICAgICBpZiAoc29hcF9wdXR1dGY4KHNvYXAsICh1bnNpZ25lZCBjaGFyKWMpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHQpCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICI8LyVzPiIsIHQpOworICAgIHJldHVybiBzb2FwX3NlbmQoc29hcCwgc29hcC0+dG1wYnVmKTsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQord2NoYXJfdCAqKgorU09BUF9GTUFDMgorc29hcF9pbndsaXRlcmFsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHdjaGFyX3QgKipwKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMSkpCisgIHsgaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfTk9fVEFHIHx8IHNvYXBfdW5nZXQoc29hcCwgc29hcF9nZXQoc29hcCkpID09IFNPQVBfVFQpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIH0KKyAgaWYgKCFwKQorICAgIGlmICghKHAgPSAod2NoYXJfdCoqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZih3Y2hhcl90KikpKSkKKyAgICAgIHJldHVybiBOVUxMOworICBpZiAoc29hcC0+Ym9keSkKKyAgICAqcCA9IHNvYXBfd3N0cmluZ19pbihzb2FwLCAwLCAtMSwgLTEpOworICBlbHNlIGlmIChzb2FwLT5udWxsKQorICAgICpwID0gTlVMTDsKKyAgZWxzZQorICAgICpwID0gKHdjaGFyX3QqKVNPQVBfU1RSX0VPUzsKKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3Rva2VuKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzaXplX3QgaTsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjID0gMDsKKyAgcmVnaXN0ZXIgY2hhciAqcyA9IHNvYXAtPnRtcGJ1ZjsKKyAgaWYgKCFzb2FwLT5ib2R5KQorICAgIHJldHVybiBTT0FQX1NUUl9FT1M7CisgIGRvIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZikgLSAxOyBpKyspCisgIHsgaWYgKGMgPT0gU09BUF9UVCB8fCAoaW50KWMgPT0gRU9GIHx8IHNvYXBfYmxhbmsoYykpCisgICAgICBicmVhazsKKyAgICAqcysrID0gKGNoYXIpYzsKKyAgICBjID0gc29hcF9nZXQoc29hcCk7CisgIH0KKyAgaWYgKChpbnQpYyA9PSBFT0YgfHwgYyA9PSBTT0FQX1RUKQorICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICpzID0gJ1wwJzsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbGVtZW50IGNvbnRlbnQgdmFsdWU9JyVzJ1xuIiwgc29hcC0+dG1wYnVmKSk7CisgIHJldHVybiBzb2FwLT50bXBidWY7IC8qIHJldHVybiBub24tbnVsbCBwb2ludGVyICovCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfdmFsdWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNpemVfdCBpOworICByZWdpc3RlciBzb2FwX3djaGFyIGMgPSAwOworICByZWdpc3RlciBjaGFyICpzID0gc29hcC0+dG1wYnVmOworICBpZiAoIXNvYXAtPmJvZHkpCisgICAgcmV0dXJuIFNPQVBfU1RSX0VPUzsKKyAgZG8gYyA9IHNvYXBfZ2V0KHNvYXApOworICB3aGlsZSAoc29hcF9ibGFuayhjKSk7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc29hcC0+dG1wYnVmKSAtIDE7IGkrKykKKyAgeyBpZiAoYyA9PSBTT0FQX1RUIHx8IChpbnQpYyA9PSBFT0YpCisgICAgICBicmVhazsKKyAgICAqcysrID0gKGNoYXIpYzsKKyAgICBjID0gc29hcF9nZXQoc29hcCk7CisgIH0KKyAgZm9yIChzLS07IGkgPiAwOyBpLS0sIHMtLSkKKyAgICBpZiAoIXNvYXBfYmxhbmsoKnMpKQorICAgICAgYnJlYWs7CisgIHNbMV0gPSAnXDAnOworICBpZiAoKGludCljID09IEVPRiB8fCBjID09IFNPQVBfVFQpCisgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbGVtZW50IGNvbnRlbnQgdmFsdWU9JyVzJ1xuIiwgc29hcC0+dG1wYnVmKSk7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgICAgc29hcC0+ZG9tLT5kYXRhID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+dG1wYnVmKTsKKyNlbmRpZgorICByZXR1cm4gc29hcC0+dG1wYnVmOyAvKiByZXR1cm4gbm9uLW51bGwgcG9pbnRlciAqLworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgIWRlZmluZWQoV0lUSF9MRUFORVIpIHx8ICFkZWZpbmVkKFdJVEhfTk9IVFRQKQorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRsaW5lKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpzLCBpbnQgbGVuKQoreyBpbnQgaSA9IGxlbjsKKyAgc29hcF93Y2hhciBjID0gMDsKKyAgZm9yICg7OykKKyAgeyB3aGlsZSAoLS1pID4gMCkKKyAgICB7IGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgICAgICBpZiAoYyA9PSAnXHInIHx8IGMgPT0gJ1xuJykKKyAgICAgICAgYnJlYWs7CisgICAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgICAqcysrID0gKGNoYXIpYzsKKyAgICB9CisgICAgaWYgKGMgIT0gJ1xuJykKKyAgICAgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7IC8qIGdvdCBcciwgbm93IGdldCBcbiAqLworICAgIGlmIChjID09ICdcbicpCisgICAgeyAqcyA9ICdcMCc7CisgICAgICBpZiAoaSsxID09IGxlbikgLyogZW1wdHkgbGluZTogZW5kIG9mIEhUVFAvTUlNRSBoZWFkZXIgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICBjID0gc29hcF91bmdldChzb2FwLCBzb2FwX2dldGNoYXIoc29hcCkpOworICAgICAgaWYgKGMgIT0gJyAnICYmIGMgIT0gJ1x0JykgLyogSFRUUCBsaW5lIGNvbnRpbnVhdGlvbj8gKi8KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGVsc2UgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHNpemVfdAorc29hcF9jb3VudF9hdHRhY2htZW50cyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgcmVnaXN0ZXIgc2l6ZV90IGNvdW50ID0gc29hcC0+Y291bnQ7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ2FsY3VsYXRpbmcgdGhlIG1lc3NhZ2Ugc2l6ZSB3aXRoIGF0dGFjaG1lbnRzLCBjdXJyZW50IGNvdW50PSVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpY291bnQpKTsKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkgJiYgIShzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkpCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDYWxjdWxhdGluZyB0aGUgc2l6ZSBvZiBESU1FIGF0dGFjaG1lbnRzXG4iKSk7CisgICAgZm9yIChjb250ZW50ID0gc29hcC0+ZGltZS5maXJzdDsgY29udGVudDsgY29udGVudCA9IGNvbnRlbnQtPm5leHQpCisgICAgeyBjb3VudCArPSAxMiArICgoY29udGVudC0+c2l6ZSszKSYofjMpKTsKKyAgICAgIGlmIChjb250ZW50LT5pZCkKKyAgICAgICAgY291bnQgKz0gKChzdHJsZW4oY29udGVudC0+aWQpKzMpJih+MykpOworICAgICAgaWYgKGNvbnRlbnQtPnR5cGUpCisgICAgICAgIGNvdW50ICs9ICgoc3RybGVuKGNvbnRlbnQtPnR5cGUpKzMpJih+MykpOworICAgICAgaWYgKGNvbnRlbnQtPm9wdGlvbnMpCisgICAgICAgIGNvdW50ICs9ICgoKCh1bnNpZ25lZCBjaGFyKWNvbnRlbnQtPm9wdGlvbnNbMl0gPDwgOCkgfCAoKHVuc2lnbmVkIGNoYXIpY29udGVudC0+b3B0aW9uc1szXSkpKzcpJih+Myk7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNpemUgb2YgRElNRSBhdHRhY2htZW50IGNvbnRlbnQgaXMgJWx1IGJ5dGVzXG4iLCAodW5zaWduZWQgbG9uZyljb250ZW50LT5zaXplKSk7CisgICAgfQorICB9CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01JTUUpICYmIHNvYXAtPm1pbWUuYm91bmRhcnkpCisgIHsgcmVnaXN0ZXIgc2l6ZV90IG4gPSBzdHJsZW4oc29hcC0+bWltZS5ib3VuZGFyeSk7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDYWxjdWxhdGluZyB0aGUgc2l6ZSBvZiBNSU1FIGF0dGFjaG1lbnRzXG4iKSk7CisgICAgZm9yIChjb250ZW50ID0gc29hcC0+bWltZS5maXJzdDsgY29udGVudDsgY29udGVudCA9IGNvbnRlbnQtPm5leHQpCisgICAgeyByZWdpc3RlciBjb25zdCBjaGFyICpzOworICAgICAgLyogY291bnQgXHJcbi0tYm91bmRhcnlcclxuICovCisgICAgICBjb3VudCArPSA2ICsgbjsKKyAgICAgIC8qIGNvdW50IENvbnRlbnQtVHlwZTogLi4uXHJcbiAqLworICAgICAgaWYgKGNvbnRlbnQtPnR5cGUpCisgICAgICAgIGNvdW50ICs9IDE2ICsgc3RybGVuKGNvbnRlbnQtPnR5cGUpOworICAgICAgLyogY291bnQgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogLi4uXHJcbiAqLworICAgICAgcyA9IHNvYXBfc3RyX2NvZGUobWltZV9jb2RlcywgY29udGVudC0+ZW5jb2RpbmcpOworICAgICAgaWYgKHMpCisgICAgICAgIGNvdW50ICs9IDI5ICsgc3RybGVuKHMpOworICAgICAgLyogY291bnQgQ29udGVudC1JRDogLi4uXHJcbiAqLworICAgICAgaWYgKGNvbnRlbnQtPmlkKQorICAgICAgICBjb3VudCArPSAxNCArIHN0cmxlbihjb250ZW50LT5pZCk7CisgICAgICAvKiBjb3VudCBDb250ZW50LUxvY2F0aW9uOiAuLi5cclxuICovCisgICAgICBpZiAoY29udGVudC0+bG9jYXRpb24pCisgICAgICAgIGNvdW50ICs9IDIwICsgc3RybGVuKGNvbnRlbnQtPmxvY2F0aW9uKTsKKyAgICAgIC8qIGNvdW50IENvbnRlbnQtRGVzY3JpcHRpb246IC4uLlxyXG4gKi8KKyAgICAgIGlmIChjb250ZW50LT5kZXNjcmlwdGlvbikKKyAgICAgICAgY291bnQgKz0gMjMgKyBzdHJsZW4oY29udGVudC0+bG9jYXRpb24pOworICAgICAgLyogY291bnQgXHJcbi4uLmNvbnRlbnQgKi8KKyAgICAgIGNvdW50ICs9IDIgKyBjb250ZW50LT5zaXplOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTaXplIG9mIE1JTUUgYXR0YWNobWVudCBjb250ZW50IGlzICVsdSBieXRlc1xuIiwgKHVuc2lnbmVkIGxvbmcpY29udGVudC0+c2l6ZSkpOworICAgIH0KKyAgICAvKiBjb3VudCBcclxuLS1ib3VuZGFyeS0tICovCisgICAgY291bnQgKz0gNiArIG47CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJOZXcgY291bnQgaXMgJWx1IGJ5dGVzXG4iLCAodW5zaWduZWQgbG9uZyljb3VudCkpOworICByZXR1cm4gY291bnQ7CisjZWxzZQorICByZXR1cm4gc29hcC0+Y291bnQ7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NvYXBfcHV0ZGltZWZpZWxkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBzaXplX3QgbikKK3sgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgbikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCBTT0FQX1NUUl9QQURESU5HLCAtKGxvbmcpbiYzKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX2RpbWVfb3B0aW9uKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBzaG9ydCBvcHR5cGUsIGNvbnN0IGNoYXIgKm9wdGlvbikKK3sgc2l6ZV90IG47CisgIGNoYXIgKnMgPSBOVUxMOworICBpZiAob3B0aW9uKQorICB7IG4gPSBzdHJsZW4ob3B0aW9uKTsKKyAgICBzID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIG4gKyA1KTsKKyAgICBpZiAocykKKyAgICB7IHNbMF0gPSBvcHR5cGUgPj4gODsKKyAgICAgIHNbMV0gPSBvcHR5cGUgJiAweEZGOworICAgICAgc1syXSA9IG4gPj4gODsKKyAgICAgIHNbM10gPSBuICYgMHhGRjsKKyAgICAgIHN0cmNweShzICsgNCwgb3B0aW9uKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHM7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRkaW1laGRyKHN0cnVjdCBzb2FwICpzb2FwKQoreyB1bnNpZ25lZCBjaGFyIHRtcFsxMl07CisgIHNpemVfdCBvcHRsZW4gPSAwLCBpZGxlbiA9IDAsIHR5cGVsZW4gPSAwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlB1dCBESU1FIGhlYWRlciBpZD0nJXMnXG4iLCBzb2FwLT5kaW1lLmlkP3NvYXAtPmRpbWUuaWQ6IiIpKTsKKyAgaWYgKHNvYXAtPmRpbWUub3B0aW9ucykKKyAgICBvcHRsZW4gPSAoKCh1bnNpZ25lZCBjaGFyKXNvYXAtPmRpbWUub3B0aW9uc1syXSA8PCA4KSB8ICgodW5zaWduZWQgY2hhcilzb2FwLT5kaW1lLm9wdGlvbnNbM10pKSArIDQ7CisgIGlmIChzb2FwLT5kaW1lLmlkKQorICAgIGlkbGVuID0gc3RybGVuKHNvYXAtPmRpbWUuaWQpOworICBpZiAoc29hcC0+ZGltZS50eXBlKQorICAgIHR5cGVsZW4gPSBzdHJsZW4oc29hcC0+ZGltZS50eXBlKTsKKyAgdG1wWzBdID0gU09BUF9ESU1FX1ZFUlNJT04gfCAoc29hcC0+ZGltZS5mbGFncyAmIDB4Nyk7CisgIHRtcFsxXSA9IHNvYXAtPmRpbWUuZmxhZ3MgJiAweEYwOworICB0bXBbMl0gPSBvcHRsZW4gPj4gODsKKyAgdG1wWzNdID0gb3B0bGVuICYgMHhGRjsKKyAgdG1wWzRdID0gaWRsZW4gPj4gODsKKyAgdG1wWzVdID0gaWRsZW4gJiAweEZGOworICB0bXBbNl0gPSB0eXBlbGVuID4+IDg7CisgIHRtcFs3XSA9IHR5cGVsZW4gJiAweEZGOworICB0bXBbOF0gPSBzb2FwLT5kaW1lLnNpemUgPj4gMjQ7CisgIHRtcFs5XSA9IChzb2FwLT5kaW1lLnNpemUgPj4gMTYpICYgMHhGRjsKKyAgdG1wWzEwXSA9IChzb2FwLT5kaW1lLnNpemUgPj4gOCkgJiAweEZGOworICB0bXBbMTFdID0gc29hcC0+ZGltZS5zaXplICYgMHhGRjsKKyAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgKGNoYXIqKXRtcCwgMTIpCisgICB8fCBzb2FwX3B1dGRpbWVmaWVsZChzb2FwLCBzb2FwLT5kaW1lLm9wdGlvbnMsIG9wdGxlbikKKyAgIHx8IHNvYXBfcHV0ZGltZWZpZWxkKHNvYXAsIHNvYXAtPmRpbWUuaWQsIGlkbGVuKQorICAgfHwgc29hcF9wdXRkaW1lZmllbGQoc29hcCwgc29hcC0+ZGltZS50eXBlLCB0eXBlbGVuKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0ZGltZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIGZvciAoY29udGVudCA9IHNvYXAtPmRpbWUuZmlyc3Q7IGNvbnRlbnQ7IGNvbnRlbnQgPSBjb250ZW50LT5uZXh0KQorICB7IHZvaWQgKmhhbmRsZTsKKyAgICBzb2FwLT5kaW1lLnNpemUgPSBjb250ZW50LT5zaXplOworICAgIHNvYXAtPmRpbWUuaWQgPSBjb250ZW50LT5pZDsKKyAgICBzb2FwLT5kaW1lLnR5cGUgPSBjb250ZW50LT50eXBlOworICAgIHNvYXAtPmRpbWUub3B0aW9ucyA9IGNvbnRlbnQtPm9wdGlvbnM7CisgICAgc29hcC0+ZGltZS5mbGFncyA9IFNPQVBfRElNRV9WRVJTSU9OIHwgU09BUF9ESU1FX01FRElBOworICAgIGlmIChzb2FwLT5mZGltZXJlYWRvcGVuICYmICgoaGFuZGxlID0gc29hcC0+ZmRpbWVyZWFkb3Blbihzb2FwLCAodm9pZCopY29udGVudC0+cHRyLCBjb250ZW50LT5pZCwgY29udGVudC0+dHlwZSwgY29udGVudC0+b3B0aW9ucykpIHx8IHNvYXAtPmVycm9yKSkKKyAgICB7IHNpemVfdCBzaXplID0gY29udGVudC0+c2l6ZTsKKyAgICAgIGlmICghaGFuZGxlKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImZkaW1lcmVhZG9wZW4gZmFpbGVkXG4iKSk7CisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIH0KKyAgICAgIGlmICghY29udGVudC0+c2l6ZSAmJiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpIHx8IChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSyB8fCAoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fU1RPUkUpKQorICAgICAgeyBzaXplX3QgY2h1bmtzaXplID0gc2l6ZW9mKHNvYXAtPnRtcGJ1Zik7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ2h1bmtlZCBzdHJlYW1pbmcgRElNRVxuIikpOworICAgICAgICBkbyAKKyAgICAgICAgeyBzaXplID0gc29hcC0+ZmRpbWVyZWFkKHNvYXAsIGhhbmRsZSwgc29hcC0+dG1wYnVmLCBjaHVua3NpemUpOworICAgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZmRpbWVyZWFkIHJldHVybmVkICVsdSBieXRlc1xuIiwgKHVuc2lnbmVkIGxvbmcpc2l6ZSkpOworICAgICAgICAgIGlmIChzaXplIDwgY2h1bmtzaXplKQorIAkgIHsgc29hcC0+ZGltZS5mbGFncyAmPSB+U09BUF9ESU1FX0NGOworICAgICAgICAgICAgaWYgKCFjb250ZW50LT5uZXh0KQorICAgICAgICAgICAgICBzb2FwLT5kaW1lLmZsYWdzIHw9IFNPQVBfRElNRV9NRTsKKwkgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBzb2FwLT5kaW1lLmZsYWdzIHw9IFNPQVBfRElNRV9DRjsKKwkgIHNvYXAtPmRpbWUuc2l6ZSA9IHNpemU7CisgICAgICAgICAgaWYgKHNvYXBfcHV0ZGltZWhkcihzb2FwKQorCSAgIHx8IHNvYXBfcHV0ZGltZWZpZWxkKHNvYXAsIHNvYXAtPnRtcGJ1Ziwgc2l6ZSkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBpZiAoc29hcC0+ZGltZS5pZCkKKyAJICB7IHNvYXAtPmRpbWUuZmxhZ3MgJj0gfihTT0FQX0RJTUVfTUIgfCBTT0FQX0RJTUVfTUVESUEpOworICAgICAgICAgICAgc29hcC0+ZGltZS5pZCA9IE5VTEw7CisgICAgICAgICAgICBzb2FwLT5kaW1lLnR5cGUgPSBOVUxMOworICAgICAgICAgICAgc29hcC0+ZGltZS5vcHRpb25zID0gTlVMTDsKKyAgICAgICAgICB9ICAKKyAgICAgICAgfSB3aGlsZSAoc2l6ZSA+PSBjaHVua3NpemUpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBpZiAoIWNvbnRlbnQtPm5leHQpCisgICAgICAgICAgc29hcC0+ZGltZS5mbGFncyB8PSBTT0FQX0RJTUVfTUU7CisgICAgICAgIGlmIChzb2FwX3B1dGRpbWVoZHIoc29hcCkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBkbworICAgICAgICB7IHNpemVfdCBidWZzaXplOworCSAgaWYgKHNpemUgPCBzaXplb2Yoc29hcC0+dG1wYnVmKSkKKyAgICAgICAgICAgIGJ1ZnNpemUgPSBzaXplOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJ1ZnNpemUgPSBzaXplb2Yoc29hcC0+dG1wYnVmKTsKKyAgICAgICAgICBpZiAoIShidWZzaXplID0gc29hcC0+ZmRpbWVyZWFkKHNvYXAsIGhhbmRsZSwgc29hcC0+dG1wYnVmLCBidWZzaXplKSkpCisgICAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImZkaW1lcmVhZCBmYWlsZWQ6IGluc3VmZmljaWVudCBkYXRhICglbHUgYnl0ZXMgcmVtYWluaW5nIGZyb20gJWx1IGJ5dGVzKVxuIiwgKHVuc2lnbmVkIGxvbmcpc2l6ZSwgKHVuc2lnbmVkIGxvbmcpc29hcC0+ZGltZS5zaXplKSk7CisgICAgICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworCSAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgc29hcC0+dG1wYnVmLCBidWZzaXplKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHNpemUgLT0gYnVmc2l6ZTsKKyAgICAgICAgfSB3aGlsZSAoc2l6ZSk7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZmRpbWVyZWFkY2xvc2VcbiIpKTsKKyAgICAgICAgc29hcF9zZW5kX3Jhdyhzb2FwLCBTT0FQX1NUUl9QQURESU5HLCAtKGxvbmcpc29hcC0+ZGltZS5zaXplJjMpOworICAgICAgfQorICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJmZGltZXJlYWRjbG9zZVxuIikpOworICAgICAgaWYgKHNvYXAtPmZkaW1lcmVhZGNsb3NlKQorICAgICAgICBzb2FwLT5mZGltZXJlYWRjbG9zZShzb2FwLCBoYW5kbGUpOworICAgIH0KKyAgICBlbHNlCisgICAgeyBpZiAoIWNvbnRlbnQtPm5leHQpCisgICAgICAgIHNvYXAtPmRpbWUuZmxhZ3MgfD0gU09BUF9ESU1FX01FOworICAgICAgaWYgKHNvYXBfcHV0ZGltZWhkcihzb2FwKQorICAgICAgIHx8IHNvYXBfcHV0ZGltZWZpZWxkKHNvYXAsIChjaGFyKiljb250ZW50LT5wdHIsIGNvbnRlbnQtPnNpemUpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY2hhciAqCitzb2FwX2dldGRpbWVmaWVsZChzdHJ1Y3Qgc29hcCAqc29hcCwgc2l6ZV90IG4pCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIGNoYXIgKnM7CisgIGNoYXIgKnAgPSBOVUxMOworICBpZiAobikKKyAgeyBwID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIG4gKyAxKTsKKyAgICBpZiAocCkKKyAgICB7IHMgPSBwOworICAgICAgZm9yIChpID0gbjsgaSA+IDA7IGktLSkKKyAgICAgIHsgaWYgKChpbnQpKGMgPSBzb2FwX2dldDEoc29hcCkpID09IEVPRikKKyAgICAgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgICpzKysgPSAoY2hhciljOworICAgICAgfQorICAgICAgKnMgPSAnXDAnOworICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXBfbW92ZShzb2FwLCAtKGxvbmcpbiYzKSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICB9CisgIHJldHVybiBwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0ZGltZWhkcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICByZWdpc3RlciBjaGFyICpzOworICByZWdpc3RlciBpbnQgaTsKKyAgdW5zaWduZWQgY2hhciB0bXBbMTJdOworICBzaXplX3Qgb3B0bGVuLCBpZGxlbiwgdHlwZWxlbjsKKyAgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRElNRV9FTkQ7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR2V0IERJTUUgaGVhZGVyXG4iKSk7CisgIGlmIChzb2FwLT5kaW1lLmJ1ZmxlbiB8fCBzb2FwLT5kaW1lLmNodW5rc2l6ZSkKKyAgeyBpZiAoc29hcF9tb3ZlKHNvYXAsIChsb25nKShzb2FwLT5kaW1lLnNpemUgLSBzb2FwX3RlbGwoc29hcCkpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgIHNvYXBfdW5nZXQoc29hcCwgc29hcF9nZXRjaGFyKHNvYXApKTsgLyogc2tpcCBwYWRkaW5nIGFuZCBnZXQgaGRyICovCisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIuLi4gRnJvbSBjaHVua2VkXG4iKSk7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgcyA9IChjaGFyKil0bXA7CisgIGZvciAoaSA9IDEyOyBpID4gMDsgaS0tKQorICB7IGlmICgoaW50KShjID0gc29hcF9nZXRjaGFyKHNvYXApKSA9PSBFT0YpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAqcysrID0gKGNoYXIpYzsKKyAgfQorICBpZiAoKHRtcFswXSAmIDB4RjgpICE9IFNPQVBfRElNRV9WRVJTSU9OKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRElNRV9NSVNNQVRDSDsKKyAgc29hcC0+ZGltZS5mbGFncyA9ICh0bXBbMF0gJiAweDcpIHwgKHRtcFsxXSAmIDB4RjApOworICBvcHRsZW4gPSAodG1wWzJdIDw8IDgpIHwgdG1wWzNdOworICBpZGxlbiA9ICh0bXBbNF0gPDwgOCkgfCB0bXBbNV07CisgIHR5cGVsZW4gPSAodG1wWzZdIDw8IDgpIHwgdG1wWzddOworICBzb2FwLT5kaW1lLnNpemUgPSAodG1wWzhdIDw8IDI0KSB8ICh0bXBbOV0gPDwgMTYpIHwgKHRtcFsxMF0gPDwgOCkgfCB0bXBbMTFdOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRJTUUgc2l6ZT0lbHUgZmxhZ3M9MHglWFxuIiwgKHVuc2lnbmVkIGxvbmcpc29hcC0+ZGltZS5zaXplLCBzb2FwLT5kaW1lLmZsYWdzKSk7CisgIGlmICghKHNvYXAtPmRpbWUub3B0aW9ucyA9IHNvYXBfZ2V0ZGltZWZpZWxkKHNvYXAsIG9wdGxlbikpICYmIHNvYXAtPmVycm9yKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKCEoc29hcC0+ZGltZS5pZCA9IHNvYXBfZ2V0ZGltZWZpZWxkKHNvYXAsIGlkbGVuKSkgJiYgc29hcC0+ZXJyb3IpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoIShzb2FwLT5kaW1lLnR5cGUgPSBzb2FwX2dldGRpbWVmaWVsZChzb2FwLCB0eXBlbGVuKSkgJiYgc29hcC0+ZXJyb3IpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRJTUUgaWQ9JXMsIHR5cGU9JXMsIG9wdGlvbnM9JXNcbiIsIHNvYXAtPmRpbWUuaWQ/c29hcC0+ZGltZS5pZDoiIiwgc29hcC0+ZGltZS50eXBlP3NvYXAtPmRpbWUudHlwZToiIiwgc29hcC0+ZGltZS5vcHRpb25zP3NvYXAtPmRpbWUub3B0aW9ucys0OiIiKSk7CisgIGlmIChzb2FwLT5kaW1lLmZsYWdzICYgU09BUF9ESU1FX01FKQorICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX0RJTUU7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0ZGltZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgd2hpbGUgKHNvYXAtPmRpbWUuZmxhZ3MgJiBTT0FQX0RJTUVfQ0YpCisgIHsgaWYgKHNvYXBfZ2V0ZGltZWhkcihzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAoc29hcF9tb3ZlKHNvYXAsIHNvYXAtPmRpbWUuc2l6ZSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgfQorICBpZiAoc29hcF9tb3ZlKHNvYXAsICgoc29hcC0+ZGltZS5zaXplKzMpJih+MykpLXNvYXBfdGVsbChzb2FwKSkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIGZvciAoOzspCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICAgIGlmIChzb2FwX2dldGRpbWVoZHIoc29hcCkpCisgICAgICBicmVhazsKKyAgICBpZiAoc29hcC0+ZmRpbWV3cml0ZW9wZW4gJiYgKChzb2FwLT5kaW1lLnB0ciA9IChjaGFyKilzb2FwLT5mZGltZXdyaXRlb3Blbihzb2FwLCBzb2FwLT5kaW1lLmlkLCBzb2FwLT5kaW1lLnR5cGUsIHNvYXAtPmRpbWUub3B0aW9ucykpIHx8IHNvYXAtPmVycm9yKSkKKyAgICB7IGNvbnN0IGNoYXIgKmlkLCAqdHlwZSwgKm9wdGlvbnM7CisgICAgICBzaXplX3Qgc2l6ZSwgbjsKKyAgICAgIGlmICghc29hcC0+ZGltZS5wdHIpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIGlkID0gc29hcC0+ZGltZS5pZDsKKyAgICAgIHR5cGUgPSBzb2FwLT5kaW1lLnR5cGU7CisgICAgICBvcHRpb25zID0gc29hcC0+ZGltZS5vcHRpb25zOworICAgICAgZm9yICg7OykKKyAgICAgIHsgc2l6ZSA9IHNvYXAtPmRpbWUuc2l6ZTsKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeyBuID0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgICAgICAgIGlmIChzaXplIDwgbikKKyAgICAgICAgICAgIG4gPSBzaXplOworICAgICAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mZGltZXdyaXRlKHNvYXAsICh2b2lkKilzb2FwLT5kaW1lLnB0ciwgc29hcC0+YnVmICsgc29hcC0+YnVmaWR4LCBuKSkpCisgICAgICAgICAgICBicmVhazsKKwkgIHNpemUgLT0gbjsKKwkgIGlmICghc2l6ZSkKKwkgIHsgc29hcC0+YnVmaWR4ICs9IG47CisJICAgIGJyZWFrOworCSAgfQorCSAgaWYgKHNvYXBfcmVjdihzb2FwKSkKKyAgICAgICAgICB7IHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisJICAgIGdvdG8gZW5kOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc29hcF9tb3ZlKHNvYXAsIC0obG9uZylzb2FwLT5kaW1lLnNpemUmMykpCisgICAgICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKwkgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICghKHNvYXAtPmRpbWUuZmxhZ3MgJiBTT0FQX0RJTUVfQ0YpKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoc29hcF9nZXRkaW1laGRyKHNvYXApKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorZW5kOgorICAgICAgaWYgKHNvYXAtPmZkaW1ld3JpdGVjbG9zZSkKKyAgICAgICAgc29hcC0+ZmRpbWV3cml0ZWNsb3NlKHNvYXAsICh2b2lkKilzb2FwLT5kaW1lLnB0cik7CisgICAgICBzb2FwLT5kaW1lLnNpemUgPSAwOworICAgICAgc29hcC0+ZGltZS5pZCA9IGlkOworICAgICAgc29hcC0+ZGltZS50eXBlID0gdHlwZTsKKyAgICAgIHNvYXAtPmRpbWUub3B0aW9ucyA9IG9wdGlvbnM7CisgICAgfQorICAgIGVsc2UgaWYgKHNvYXAtPmRpbWUuZmxhZ3MgJiBTT0FQX0RJTUVfQ0YpCisgICAgeyBjb25zdCBjaGFyICppZCwgKnR5cGUsICpvcHRpb25zOworICAgICAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICAgICAgcmVnaXN0ZXIgY2hhciAqczsKKyAgICAgIHJlZ2lzdGVyIGludCBpOworICAgICAgaWQgPSBzb2FwLT5kaW1lLmlkOworICAgICAgdHlwZSA9IHNvYXAtPmRpbWUudHlwZTsKKyAgICAgIG9wdGlvbnMgPSBzb2FwLT5kaW1lLm9wdGlvbnM7CisgICAgICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgICAgIHJldHVybiBTT0FQX0VPTTsKKyAgICAgIGZvciAoOzspCisgICAgICB7IHMgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIHNvYXAtPmRpbWUuc2l6ZSk7CisgICAgICAgIGlmICghcykKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgICAgZm9yIChpID0gc29hcC0+ZGltZS5zaXplOyBpID4gMDsgaS0tKQorICAgICAgICB7IGlmICgoaW50KShjID0gc29hcF9nZXQxKHNvYXApKSA9PSBFT0YpCisgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAgICAgICAqcysrID0gKGNoYXIpYzsKKyAgICAgICAgfQorICAgICAgICBpZiAoc29hcF9tb3ZlKHNvYXAsIC0obG9uZylzb2FwLT5kaW1lLnNpemUmMykpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgICAgIGlmICghKHNvYXAtPmRpbWUuZmxhZ3MgJiBTT0FQX0RJTUVfQ0YpKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoc29hcF9nZXRkaW1laGRyKHNvYXApKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIH0KKyAgICAgIHNvYXAtPmRpbWUuc2l6ZSA9IHNvYXAtPmJsaXN0LT5zaXplKys7IC8qIGFsbG9jYXRlIG9uZSBtb3JlIGZvciAnXDAnICovCisgICAgICBpZiAoIShzb2FwLT5kaW1lLnB0ciA9IHNvYXBfc2F2ZV9ibG9jayhzb2FwLCBOVUxMLCAwKSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHNvYXAtPmRpbWUucHRyW3NvYXAtPmRpbWUuc2l6ZV0gPSAnXDAnOyAvKiBmb3JjZSAwLXRlcm1pbmF0ZWQgKi8KKyAgICAgIHNvYXAtPmRpbWUuaWQgPSBpZDsKKyAgICAgIHNvYXAtPmRpbWUudHlwZSA9IHR5cGU7CisgICAgICBzb2FwLT5kaW1lLm9wdGlvbnMgPSBvcHRpb25zOworICAgIH0KKyAgICBlbHNlCisgICAgICBzb2FwLT5kaW1lLnB0ciA9IHNvYXBfZ2V0ZGltZWZpZWxkKHNvYXAsIHNvYXAtPmRpbWUuc2l6ZSk7CisgICAgY29udGVudCA9IHNvYXBfbmV3X211bHRpcGFydChzb2FwLCAmc29hcC0+ZGltZS5maXJzdCwgJnNvYXAtPmRpbWUubGFzdCwgc29hcC0+ZGltZS5wdHIsIHNvYXAtPmRpbWUuc2l6ZSk7CisgICAgaWYgKCFjb250ZW50KQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgY29udGVudC0+aWQgPSBzb2FwLT5kaW1lLmlkOworICAgIGNvbnRlbnQtPnR5cGUgPSBzb2FwLT5kaW1lLnR5cGU7CisgICAgY29udGVudC0+b3B0aW9ucyA9IHNvYXAtPmRpbWUub3B0aW9uczsKKyAgICBzb2FwX3Jlc29sdmVfYXR0YWNobWVudChzb2FwLCBjb250ZW50KTsKKyAgICBpZiAoc29hcC0+ZXJyb3IpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfRElNRV9FTkQpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0bWltZWhkcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICBkbworICB7IGlmIChzb2FwX2dldGxpbmUoc29hcCwgc29hcC0+bXNnYnVmLCBzaXplb2Yoc29hcC0+bXNnYnVmKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgd2hpbGUgKCEqc29hcC0+bXNnYnVmKTsKKyAgaWYgKHNvYXAtPm1zZ2J1ZlswXSA9PSAnLScgJiYgc29hcC0+bXNnYnVmWzFdID09ICctJykKKyAgeyBjaGFyICpzID0gc29hcC0+bXNnYnVmICsgc3RybGVuKHNvYXAtPm1zZ2J1ZikgLSAxOworICAgIC8qIHJlbW92ZSB3aGl0ZSBzcGFjZSAqLworICAgIHdoaWxlIChzb2FwX2JsYW5rKCpzKSkKKyAgICAgIHMtLTsKKyAgICBzWzFdID0gJ1wwJzsKKyAgICBpZiAoc29hcC0+bWltZS5ib3VuZGFyeSkKKyAgICB7IGlmIChzdHJjbXAoc29hcC0+bXNnYnVmICsgMiwgc29hcC0+bWltZS5ib3VuZGFyeSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTUlNRV9FUlJPUjsKKyAgICB9CisgICAgZWxzZQorICAgICAgc29hcC0+bWltZS5ib3VuZGFyeSA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPm1zZ2J1ZiArIDIpOworICAgIGlmIChzb2FwX2dldGxpbmUoc29hcCwgc29hcC0+bXNnYnVmLCBzaXplb2Yoc29hcC0+bXNnYnVmKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHNvYXBfc2V0X21pbWVfYXR0YWNobWVudChzb2FwLCBOVUxMLCAwLCBTT0FQX01JTUVfTk9ORSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgIGNvbnRlbnQgPSBzb2FwLT5taW1lLmxhc3Q7CisgIGZvciAoOzspCisgIHsgcmVnaXN0ZXIgY2hhciAqa2V5ID0gc29hcC0+bXNnYnVmOworICAgIHJlZ2lzdGVyIGNoYXIgKnZhbDsKKyAgICBpZiAoISprZXkpCisgICAgICBicmVhazsKKyAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiTUlNRSBoZWFkZXI6ICVzXG4iLCBrZXkpKTsKKyAgICB2YWwgPSBzdHJjaHIoc29hcC0+bXNnYnVmLCAnOicpOworICAgIGlmICh2YWwpCisgICAgeyAqdmFsID0gJ1wwJzsKKyAgICAgIGRvIHZhbCsrOworICAgICAgd2hpbGUgKCp2YWwgJiYgKnZhbCA8PSAzMik7CisgICAgICBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LUlEIikpCisgICAgICAgIGNvbnRlbnQtPmlkID0gc29hcF9zdHJkdXAoc29hcCwgdmFsKTsKKyAgICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1Mb2NhdGlvbiIpKQorICAgICAgICBjb250ZW50LT5sb2NhdGlvbiA9IHNvYXBfc3RyZHVwKHNvYXAsIHZhbCk7CisgICAgICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtRGlzcG9zaXRpb24iKSkKKyAgICAgICAgY29udGVudC0+aWQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCwgIm5hbWUiKSk7CisgICAgICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtVHlwZSIpKQorICAgICAgICBjb250ZW50LT50eXBlID0gc29hcF9zdHJkdXAoc29hcCwgdmFsKTsKKyAgICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1EZXNjcmlwdGlvbiIpKQorICAgICAgICBjb250ZW50LT5kZXNjcmlwdGlvbiA9IHNvYXBfc3RyZHVwKHNvYXAsIHZhbCk7CisgICAgICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmciKSkKKyAgICAgICAgY29udGVudC0+ZW5jb2RpbmcgPSAoZW51bSBzb2FwX21pbWVfZW5jb2Rpbmcpc29hcF9pbnRfY29kZShtaW1lX2NvZGVzLCB2YWwsIChsb25nKVNPQVBfTUlNRV9OT05FKTsKKyAgICB9CisgICAgaWYgKHNvYXBfZ2V0bGluZShzb2FwLCBrZXksIHNpemVvZihzb2FwLT5tc2didWYpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldG1pbWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IDA7CisgIGlmICghc29hcC0+bWltZS5sYXN0KQorICAgIHJldHVybiBTT0FQX09LOworICBmb3IgKDs7KQorICB7IHJlZ2lzdGVyIHNpemVfdCBpLCBtID0gMDsKKyAgICByZWdpc3RlciBjaGFyICpzLCAqdCA9IE5VTEw7CisgICAgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50ID0gc29hcC0+bWltZS5sYXN0OworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUGFyc2luZyBNSU1FIGNvbnRlbnQgaWQ9JXMgdHlwZT0lc1xuIiwgY29udGVudC0+aWQ/Y29udGVudC0+aWQ6IiIsIGNvbnRlbnQtPnR5cGU/Y29udGVudC0+dHlwZToiIikpOworICAgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIGZvciAoOzspCisgICAgeyByZWdpc3RlciBzaG9ydCBmbGFnID0gMDsKKyAgICAgIGlmICghKHMgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIFNPQVBfQkxLTEVOKSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgZm9yIChpID0gMDsgaSA8IFNPQVBfQkxLTEVOOyBpKyspCisgICAgICB7IGlmIChtID4gMCkKKyAgICAgICAgeyAqcysrID0gKnQrKzsKKwkgIG0tLTsKKwl9CisJZWxzZQorICAgICAgICB7IGlmICghZmxhZykKKwkgIHsgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKwkgICAgaWYgKChpbnQpYyA9PSBFT0YpCisJICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisJICB9CisJICBpZiAoZmxhZyB8fCBjID09ICdccicpCisJICB7IHQgPSBzb2FwLT50bXBidWY7CisJICAgIG1lbXNldCh0LCAwLCBzaXplb2Yoc29hcC0+dG1wYnVmKSk7CisgICAgICAgICAgICBzdHJjcHkodCwgIlxuLS0iKTsKKyAgICAgICAgICAgIGlmIChzb2FwLT5taW1lLmJvdW5kYXJ5KQorCSAgICAgIHN0cm5jYXQodCwgc29hcC0+bWltZS5ib3VuZGFyeSwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiktNCk7CisJICAgIGRvIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisJICAgIHdoaWxlIChjID09ICp0KyspOworCSAgICBpZiAoKGludCljID09IEVPRikKKwkgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKwkgICAgaWYgKCEqLS10KQorCSAgICAgIGdvdG8gZW5kOworCSAgICAqdCA9IChjaGFyKWM7CisJICAgIGZsYWcgPSAoYyA9PSAnXHInKTsKKwkgICAgbSA9IHQgLSBzb2FwLT50bXBidWYgKyAxIC0gZmxhZzsKKwkgICAgdCA9IHNvYXAtPnRtcGJ1ZjsKKwkgICAgYyA9ICdccic7CisJICB9CisJICAqcysrID0gKGNoYXIpYzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KK2VuZDoKKyAgICAqcyA9ICdcMCc7IC8qIGZvcmNlIDAtdGVybWluYXRlZCAqLworICAgIGNvbnRlbnQtPnNpemUgPSBzb2FwX3NpemVfYmxvY2soc29hcCwgaSsxKS0xOworICAgIGNvbnRlbnQtPnB0ciA9IHNvYXBfc2F2ZV9ibG9jayhzb2FwLCBOVUxMLCAwKTsKKyAgICBzb2FwX3Jlc29sdmVfYXR0YWNobWVudChzb2FwLCBjb250ZW50KTsKKyAgICBpZiAoYyA9PSAnLScgJiYgc29hcF9nZXRjaGFyKHNvYXApID09ICctJykKKyAgICAgIGJyZWFrOworICAgIHdoaWxlIChjICE9ICdccicgJiYgKGludCljICE9IEVPRiAmJiBzb2FwX2JsYW5rKGMpKQorICAgICAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgICBpZiAoYyAhPSAnXHInIHx8IHNvYXBfZ2V0Y2hhcihzb2FwKSAhPSAnXG4nKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9NSU1FX0VSUk9SOworICAgIGlmIChzb2FwX2dldG1pbWVoZHIoc29hcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NvYXBfbWF0Y2hfY2lkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICp0KQoreyByZWdpc3RlciBzaXplX3QgbjsKKyAgaWYgKCFzKQorICAgIHJldHVybiAxOworICBpZiAoIXN0cmNtcChzLCB0KSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKCFzdHJuY21wKHMsICJjaWQ6IiwgNCkpCisgICAgcyArPSA0OworICBuID0gc3RybGVuKHQpOworICBpZiAoKnQgPT0gJzwnKQorICB7IHQrKzsKKyAgICBuIC09IDI7CisgIH0KKyAgaWYgKCFzdHJuY21wKHMsIHQsIG4pICYmICFzW25dKQorICAgIHJldHVybiAwOworICBzb2FwX2RlY29kZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCBzLCBTT0FQX1NUUl9FT1MpOworICBpZiAoIXN0cm5jbXAoc29hcC0+dG1wYnVmLCB0LCBuKSAmJiAhc29hcC0+dG1wYnVmW25dKQorICAgIHJldHVybiAwOworICByZXR1cm4gMTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQKK3NvYXBfcmVzb2x2ZV9hdHRhY2htZW50KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQpCit7IGlmIChjb250ZW50LT5pZCkKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF94bGlzdCAqKnhwID0gJnNvYXAtPnhsaXN0OworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x2aW5nIGF0dGFjaG1lbnQgZGF0YSBmb3IgaWQ9JXNcbiIsIGNvbnRlbnQtPmlkKSk7CisgICAgd2hpbGUgKCp4cCkKKyAgICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3hsaXN0ICp4cSA9ICp4cDsKKyAgICAgIGlmICghc29hcF9tYXRjaF9jaWQoc29hcCwgeHEtPmlkLCBjb250ZW50LT5pZCkpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRm91bmQgbWF0Y2hpbmcgYXR0YWNobWVudCAlcyBmb3IgY29udGVudCBpZD0lc1xuIiwgeHEtPmlkLCBjb250ZW50LT5pZCkpOworCSp4cCA9IHhxLT5uZXh0OworICAgICAgICAqeHEtPnB0ciA9ICh1bnNpZ25lZCBjaGFyKiljb250ZW50LT5wdHI7CisgICAgICAgICp4cS0+c2l6ZSA9IChpbnQpY29udGVudC0+c2l6ZTsKKyAgICAgICAgKnhxLT50eXBlID0gKGNoYXIqKWNvbnRlbnQtPnR5cGU7CisJaWYgKGNvbnRlbnQtPm9wdGlvbnMpCisgICAgICAgICAgKnhxLT5vcHRpb25zID0gKGNoYXIqKWNvbnRlbnQtPm9wdGlvbnM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAqeHEtPm9wdGlvbnMgPSAoY2hhciopY29udGVudC0+ZGVzY3JpcHRpb247CisJU09BUF9GUkVFKHNvYXAsIHhxKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeHAgPSAmKCp4cCktPm5leHQ7CisgICAgfQorICB9Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRtaW1laGRyKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQpCit7IGNvbnN0IGNoYXIgKnM7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTUlNRSBhdHRhY2htZW50IHR5cGU9JXNcbiIsIGNvbnRlbnQtPnR5cGU/Y29udGVudC0+dHlwZToiIikpOworICBpZiAoc29hcF9zZW5kMyhzb2FwLCAiXHJcbi0tIiwgc29hcC0+bWltZS5ib3VuZGFyeSwgIlxyXG4iKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmIChjb250ZW50LT50eXBlICYmIHNvYXBfc2VuZDMoc29hcCwgIkNvbnRlbnQtVHlwZTogIiwgY29udGVudC0+dHlwZSwgIlxyXG4iKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHMgPSBzb2FwX3N0cl9jb2RlKG1pbWVfY29kZXMsIGNvbnRlbnQtPmVuY29kaW5nKTsKKyAgaWYgKHMgJiYgc29hcF9zZW5kMyhzb2FwLCAiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogIiwgcywgIlxyXG4iKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmIChjb250ZW50LT5pZCAmJiBzb2FwX3NlbmQzKHNvYXAsICJDb250ZW50LUlEOiAiLCBjb250ZW50LT5pZCwgIlxyXG4iKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmIChjb250ZW50LT5sb2NhdGlvbiAmJiBzb2FwX3NlbmQzKHNvYXAsICJDb250ZW50LUxvY2F0aW9uOiAiLCBjb250ZW50LT5sb2NhdGlvbiwgIlxyXG4iKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmIChjb250ZW50LT5kZXNjcmlwdGlvbiAmJiBzb2FwX3NlbmQzKHNvYXAsICJDb250ZW50LURlc2NyaXB0aW9uOiAiLCBjb250ZW50LT5kZXNjcmlwdGlvbiwgIlxyXG4iKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsICJcclxuIiwgMik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRtaW1lKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgIGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKSB8fCAhc29hcC0+bWltZS5ib3VuZGFyeSkKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTZW5kaW5nIE1JTUUgYXR0YWNobWVudHNcbiIpKTsKKyAgZm9yIChjb250ZW50ID0gc29hcC0+bWltZS5maXJzdDsgY29udGVudDsgY29udGVudCA9IGNvbnRlbnQtPm5leHQpCisgICAgaWYgKHNvYXBfcHV0bWltZWhkcihzb2FwLCBjb250ZW50KQorICAgICB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsIGNvbnRlbnQtPnB0ciwgY29udGVudC0+c2l6ZSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX3NlbmQzKHNvYXAsICJcclxuLS0iLCBzb2FwLT5taW1lLmJvdW5kYXJ5LCAiLS0iKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfZGltZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+b21vZGUgfD0gU09BUF9FTkNfRElNRTsKKyAgc29hcC0+ZGltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGFzdCA9IE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X21pbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmJvdW5kYXJ5LCBjb25zdCBjaGFyICpzdGFydCkKK3sgc29hcC0+b21vZGUgfD0gU09BUF9FTkNfTUlNRTsKKyAgc29hcC0+bWltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuYm91bmRhcnkgPSBzb2FwX3N0cmR1cChzb2FwLCBib3VuZGFyeSk7CisgIHNvYXAtPm1pbWUuc3RhcnQgPSBzb2FwX3N0cmR1cChzb2FwLCBzdGFydCk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfY2xyX2RpbWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPm9tb2RlICY9IH5TT0FQX0VOQ19ESU1FOworICBzb2FwLT5kaW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5sYXN0ID0gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9jbHJfbWltZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+b21vZGUgJj0gflNPQVBfRU5DX01JTUU7CisgIHNvYXAtPm1pbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmxhc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gTlVMTDsKKyAgc29hcC0+bWltZS5zdGFydCA9IE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqCitzb2FwX25ld19tdWx0aXBhcnQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX211bHRpcGFydCAqKmZpcnN0LCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKipsYXN0LCBjaGFyICpwdHIsIHNpemVfdCBzaXplKQoreyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgIGNvbnRlbnQgPSAoc3RydWN0IHNvYXBfbXVsdGlwYXJ0Kilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfbXVsdGlwYXJ0KSk7CisgIGlmIChjb250ZW50KQorICB7IGNvbnRlbnQtPm5leHQgPSBOVUxMOworICAgIGNvbnRlbnQtPnB0ciA9IHB0cjsKKyAgICBjb250ZW50LT5zaXplID0gc2l6ZTsKKyAgICBjb250ZW50LT5pZCA9IE5VTEw7CisgICAgY29udGVudC0+dHlwZSA9IE5VTEw7CisgICAgY29udGVudC0+b3B0aW9ucyA9IE5VTEw7CisgICAgY29udGVudC0+ZW5jb2RpbmcgPSBTT0FQX01JTUVfTk9ORTsKKyAgICBjb250ZW50LT5sb2NhdGlvbiA9IE5VTEw7CisgICAgY29udGVudC0+ZGVzY3JpcHRpb24gPSBOVUxMOworICAgIGlmICghKmZpcnN0KQorICAgICAgKmZpcnN0ID0gY29udGVudDsKKyAgICBpZiAoKmxhc3QpCisgICAgICAoKmxhc3QpLT5uZXh0ID0gY29udGVudDsKKyAgICAqbGFzdCA9IGNvbnRlbnQ7CisgIH0KKyAgcmV0dXJuIGNvbnRlbnQ7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZXRfZGltZV9hdHRhY2htZW50KHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpwdHIsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICppZCwgdW5zaWduZWQgc2hvcnQgb3B0eXBlLCBjb25zdCBjaGFyICpvcHRpb24pCit7IHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudCA9IHNvYXBfbmV3X211bHRpcGFydChzb2FwLCAmc29hcC0+ZGltZS5maXJzdCwgJnNvYXAtPmRpbWUubGFzdCwgcHRyLCBzaXplKTsKKyAgaWYgKCFjb250ZW50KQorICAgIHJldHVybiBTT0FQX0VPTTsKKyAgY29udGVudC0+aWQgPSBzb2FwX3N0cmR1cChzb2FwLCBpZCk7CisgIGNvbnRlbnQtPnR5cGUgPSBzb2FwX3N0cmR1cChzb2FwLCB0eXBlKTsKKyAgY29udGVudC0+b3B0aW9ucyA9IHNvYXBfZGltZV9vcHRpb24oc29hcCwgb3B0eXBlLCBvcHRpb24pOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NldF9taW1lX2F0dGFjaG1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnB0ciwgc2l6ZV90IHNpemUsIGVudW0gc29hcF9taW1lX2VuY29kaW5nIGVuY29kaW5nLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqbG9jYXRpb24sIGNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uKQoreyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQgPSBzb2FwX25ld19tdWx0aXBhcnQoc29hcCwgJnNvYXAtPm1pbWUuZmlyc3QsICZzb2FwLT5taW1lLmxhc3QsIHB0ciwgc2l6ZSk7CisgIGlmICghY29udGVudCkKKyAgICByZXR1cm4gU09BUF9FT007CisgIGNvbnRlbnQtPmlkID0gc29hcF9zdHJkdXAoc29hcCwgaWQpOworICBjb250ZW50LT50eXBlID0gc29hcF9zdHJkdXAoc29hcCwgdHlwZSk7CisgIGNvbnRlbnQtPmVuY29kaW5nID0gZW5jb2Rpbmc7CisgIGNvbnRlbnQtPmxvY2F0aW9uID0gc29hcF9zdHJkdXAoc29hcCwgbG9jYXRpb24pOworICBjb250ZW50LT5kZXNjcmlwdGlvbiA9IHNvYXBfc3RyZHVwKHNvYXAsIGRlc2NyaXB0aW9uKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwX211bHRpcGFydCoKK1NPQVBfRk1BQzIKK3NvYXBfbmV4dF9tdWx0aXBhcnQoc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50KQoreyBpZiAoY29udGVudCkKKyAgICByZXR1cm4gY29udGVudC0+bmV4dDsKKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyB2b2lkCitzb2FwX3NlbGVjdF9taW1lX2JvdW5kYXJ5KHN0cnVjdCBzb2FwICpzb2FwKQoreyB3aGlsZSAoIXNvYXAtPm1pbWUuYm91bmRhcnkgfHwgc29hcF92YWxpZF9taW1lX2JvdW5kYXJ5KHNvYXApKQorICB7IHJlZ2lzdGVyIGNoYXIgKnMgPSBzb2FwLT5taW1lLmJvdW5kYXJ5OworICAgIHJlZ2lzdGVyIHNpemVfdCBuID0gMDsKKyAgICBpZiAocykKKyAgICAgIG4gPSBzdHJsZW4ocyk7CisgICAgaWYgKG4gPCAxNikKKyAgICB7IG4gPSA2NDsKKyAgICAgIHMgPSBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIG4gKyAxKTsKKyAgICAgIGlmICghcykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdHJjcHkocywgIj09Iik7CisgICAgcyArPSAyOworICAgIG4gLT0gNDsKKyAgICB3aGlsZSAobikKKyAgICB7ICpzKysgPSBzb2FwX2Jhc2U2NG9bc29hcF9yYW5kb20gJiAweDNGXTsKKyAgICAgIG4tLTsKKyAgICB9CisgICAgc3RyY3B5KHMsICI9PSIpOworICB9CisgIGlmICghc29hcC0+bWltZS5zdGFydCkKKyAgICBzb2FwLT5taW1lLnN0YXJ0ID0gIjxTT0FQLUVOVjpFbnZlbG9wZT4iOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzb2FwX3ZhbGlkX21pbWVfYm91bmRhcnkoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgcmVnaXN0ZXIgc2l6ZV90IGsgPSBzdHJsZW4oc29hcC0+bWltZS5ib3VuZGFyeSk7CisgIGZvciAoY29udGVudCA9IHNvYXAtPm1pbWUuZmlyc3Q7IGNvbnRlbnQ7IGNvbnRlbnQgPSBjb250ZW50LT5uZXh0KQorICB7IGlmIChjb250ZW50LT5wdHIgJiYgY29udGVudC0+c2l6ZSA+PSBrKQorICAgIHsgcmVnaXN0ZXIgY29uc3QgY2hhciAqcCA9IChjb25zdCBjaGFyKiljb250ZW50LT5wdHI7IAorICAgICAgcmVnaXN0ZXIgc2l6ZV90IGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgY29udGVudC0+c2l6ZSAtIGs7IGkrKywgcCsrKQorICAgICAgICBpZiAoIXN0cm5jbXAocCwgc29hcC0+bWltZS5ib3VuZGFyeSwgaykpCisgICAgICAgICAgcmV0dXJuIFNPQVBfRVJSOworICAgIH0KKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJSFRUUCBjb29raWUgaGFuZGxpbmcKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgV0lUSF9DT09LSUVTCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQorc2l6ZV90CitTT0FQX0ZNQUMyCitzb2FwX2VuY29kZV9jb29raWUoY29uc3QgY2hhciAqcywgY2hhciAqdCwgc2l6ZV90IGxlbikKK3sgcmVnaXN0ZXIgaW50IGM7CisgIHJlZ2lzdGVyIHNpemVfdCBuID0gbGVuOworICB3aGlsZSAoKGMgPSAqcysrKSAmJiAtLW4gPiAwKQorICB7IGlmIChjID4gJyAnICYmIGMgPCAxMjggJiYgIXN0cmNocigiKCk8PkAsOzpcXFwiL1tdPz17fSIsIGMpKQorICAgICAgKnQrKyA9IGM7CisgICAgZWxzZSBpZiAobiA+IDIpCisgICAgeyAqdCsrID0gJyUnOworICAgICAgKnQrKyA9IChjID4+IDQpICsgKGMgPiAxNTkgPyAnNycgOiAnMCcpOworICAgICAgYyAmPSAweEY7CisgICAgICAqdCsrID0gYyArIChjID4gOSA/ICc3JyA6ICcwJyk7CisgICAgICBuIC09IDI7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGJyZWFrOworICB9CisgICp0ID0gJ1wwJzsKKyAgcmV0dXJuIGxlbiAtIG47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcF9jb29raWUqCitTT0FQX0ZNQUMyCitzb2FwX2Nvb2tpZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIHNpemVfdCBuOworICBpZiAoIWRvbWFpbikKKyAgICBkb21haW4gPSBzb2FwLT5jb29raWVfZG9tYWluOworICBpZiAoIXBhdGgpCisgICAgcGF0aCA9IHNvYXAtPmNvb2tpZV9wYXRoOworICBpZiAoKnBhdGggPT0gJy8nKQorICAgIHBhdGgrKzsKKyAgbiA9IHN0cmxlbihwYXRoKTsKKyAgZm9yIChwID0gc29hcC0+Y29va2llczsgcDsgcCA9IHAtPm5leHQpCisgICAgaWYgKCFzdHJjbXAocC0+bmFtZSwgbmFtZSkKKyAgICAgJiYgZG9tYWluCisgICAgICYmIHAtPmRvbWFpbgorICAgICAmJiAhc3RyY21wKHAtPmRvbWFpbiwgZG9tYWluKQorICAgICAmJiAhc3RybmNtcChwLT5wYXRoLCBwYXRoLCBuKSkKKyAgICAgIGJyZWFrOworICByZXR1cm4gcDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwX2Nvb2tpZSoKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2Nvb2tpZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICoqcCwgKnE7CisgIGludCBuOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNldCBjb29raWU6ICVzPSVzIGRvbWFpbj0lcyBwYXRoPSVzXG4iLCBuYW1lLCB2YWx1ZT92YWx1ZToiIiwgZG9tYWluP2RvbWFpbjoiIiwgcGF0aD9wYXRoOiIiKSk7CisgIGlmICghZG9tYWluKQorICAgIGRvbWFpbiA9IHNvYXAtPmNvb2tpZV9kb21haW47CisgIGlmICghcGF0aCkKKyAgICBwYXRoID0gc29hcC0+Y29va2llX3BhdGg7CisgIGlmICghcGF0aCkKKyAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiQ29va2llIHBhdGggbm90IHNldCIsIE5VTEwsIFNPQVBfSFRUUF9FUlJPUik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKCpwYXRoID09ICcvJykKKyAgICBwYXRoKys7CisgIHEgPSBzb2FwX2Nvb2tpZShzb2FwLCBuYW1lLCBkb21haW4sIHBhdGgpOworICBpZiAoIXEpCisgIHsgaWYgKChxID0gKHN0cnVjdCBzb2FwX2Nvb2tpZSopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2Nvb2tpZSkpKSkKKyAgICB7IGlmICgocS0+bmFtZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4obmFtZSkrMSkpKQorICAgICAgICBzdHJjcHkocS0+bmFtZSwgbmFtZSk7CisgICAgICBxLT52YWx1ZSA9IE5VTEw7CisgICAgICBxLT5kb21haW4gPSBOVUxMOworICAgICAgcS0+cGF0aCA9IE5VTEw7CisgICAgICBxLT5leHBpcmUgPSAtMTsKKyAgICAgIHEtPnZlcnNpb24gPSAwOworICAgICAgcS0+c2VjdXJlID0gMDsKKyAgICAgIHEtPm1vZGlmaWVkID0gMDsKKyAgICAgIGZvciAocCA9ICZzb2FwLT5jb29raWVzLCBuID0gc29hcC0+Y29va2llX21heDsgKnAgJiYgbjsgcCA9ICYoKnApLT5uZXh0LCBuLS0pCisgICAgICAgIGlmICghc3RyY21wKCgqcCktPm5hbWUsIG5hbWUpICYmICgqcCktPnBhdGggJiYgc3RyY21wKCgqcCktPnBhdGgsIHBhdGgpIDwgMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgIGlmIChuKQorICAgICAgeyBxLT5uZXh0ID0gKnA7CisgICAgICAgICpwID0gcTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgU09BUF9GUkVFKHNvYXAsIHEtPm5hbWUpOworICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcSk7CisgICAgICAgIHEgPSBOVUxMOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgICAgcS0+bW9kaWZpZWQgPSAxOworICBpZiAocSkKKyAgeyBpZiAocS0+dmFsdWUpCisgICAgeyBTT0FQX0ZSRUUoc29hcCwgcS0+dmFsdWUpOworICAgICAgcS0+dmFsdWUgPSBOVUxMOworICAgIH0KKyAgICBpZiAocS0+ZG9tYWluKQorICAgIHsgU09BUF9GUkVFKHNvYXAsIHEtPmRvbWFpbik7CisgICAgICBxLT5kb21haW4gPSBOVUxMOworICAgIH0KKyAgICBpZiAocS0+cGF0aCkKKyAgICB7IFNPQVBfRlJFRShzb2FwLCBxLT5wYXRoKTsKKyAgICAgIHEtPnBhdGggPSBOVUxMOworICAgIH0KKyAgICBpZiAodmFsdWUgJiYgKnZhbHVlICYmIChxLT52YWx1ZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4odmFsdWUpKzEpKSkKKyAgICAgIHN0cmNweShxLT52YWx1ZSwgdmFsdWUpOworICAgIGlmIChkb21haW4gJiYgKmRvbWFpbiAmJiAocS0+ZG9tYWluID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihkb21haW4pKzEpKSkKKyAgICAgIHN0cmNweShxLT5kb21haW4sIGRvbWFpbik7CisgICAgaWYgKHBhdGggJiYgKnBhdGggJiYgKHEtPnBhdGggPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHBhdGgpKzEpKSkKKyAgICAgIHN0cmNweShxLT5wYXRoLCBwYXRoKTsKKyAgICBxLT5zZXNzaW9uID0gMTsKKyAgICBxLT5lbnYgPSAwOworICB9CisgIHJldHVybiBxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9jbHJfY29va2llKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqKnAsICpxOworICBpZiAoIWRvbWFpbikKKyAgICBkb21haW4gPSBzb2FwLT5jb29raWVfZG9tYWluOworICBpZiAoIWRvbWFpbikKKyAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiQ29va2llIGRvbWFpbiBub3Qgc2V0IiwgTlVMTCwgU09BUF9IVFRQX0VSUk9SKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFwYXRoKQorICAgIHBhdGggPSBzb2FwLT5jb29raWVfcGF0aDsKKyAgaWYgKCFwYXRoKQorICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJDb29raWUgcGF0aCBub3Qgc2V0IiwgTlVMTCwgU09BUF9IVFRQX0VSUk9SKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCpwYXRoID09ICcvJykKKyAgICBwYXRoKys7CisgIGZvciAocCA9ICZzb2FwLT5jb29raWVzLCBxID0gKnA7IHE7IHEgPSAqcCkKKyAgICBpZiAoIXN0cmNtcChxLT5uYW1lLCBuYW1lKSAmJiAhc3RyY21wKHEtPmRvbWFpbiwgZG9tYWluKSAmJiAhc3RybmNtcChxLT5wYXRoLCBwYXRoLCBzdHJsZW4ocS0+cGF0aCkpKQorICAgIHsgaWYgKHEtPnZhbHVlKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcS0+dmFsdWUpOworICAgICAgaWYgKHEtPmRvbWFpbikKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHEtPmRvbWFpbik7CisgICAgICBpZiAocS0+cGF0aCkKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHEtPnBhdGgpOworICAgICAgKnAgPSBxLT5uZXh0OworICAgICAgU09BUF9GUkVFKHNvYXAsIHEpOworICAgIH0KKyAgICBlbHNlCisgICAgICBwID0gJnEtPm5leHQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfY29va2llX3ZhbHVlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgaWYgKChwID0gc29hcF9jb29raWUoc29hcCwgbmFtZSwgZG9tYWluLCBwYXRoKSkpCisgICAgcmV0dXJuIHAtPnZhbHVlOworICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9lbnZfY29va2llX3ZhbHVlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgaWYgKChwID0gc29hcF9jb29raWUoc29hcCwgbmFtZSwgZG9tYWluLCBwYXRoKSkgJiYgcC0+ZW52KQorICAgIHJldHVybiBwLT52YWx1ZTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitsb25nCitTT0FQX0ZNQUMyCitzb2FwX2Nvb2tpZV9leHBpcmUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBpZiAoKHAgPSBzb2FwX2Nvb2tpZShzb2FwLCBuYW1lLCBkb21haW4sIHBhdGgpKSkKKyAgICByZXR1cm4gcC0+ZXhwaXJlOworICByZXR1cm4gLTE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2Nvb2tpZV9leHBpcmUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGxvbmcgZXhwaXJlLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgaWYgKChwID0gc29hcF9jb29raWUoc29hcCwgbmFtZSwgZG9tYWluLCBwYXRoKSkpCisgIHsgcC0+ZXhwaXJlID0gZXhwaXJlOworICAgIHAtPm1vZGlmaWVkID0gMTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICByZXR1cm4gU09BUF9FUlI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2Nvb2tpZV9zZXNzaW9uKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgaWYgKChwID0gc29hcF9jb29raWUoc29hcCwgbmFtZSwgZG9tYWluLCBwYXRoKSkpCisgIHsgcC0+c2Vzc2lvbiA9IDE7CisgICAgcC0+bW9kaWZpZWQgPSAxOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIHJldHVybiBTT0FQX0VSUjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9jbHJfY29va2llX3Nlc3Npb24oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBpZiAoKHAgPSBzb2FwX2Nvb2tpZShzb2FwLCBuYW1lLCBkb21haW4sIHBhdGgpKSkKKyAgeyBwLT5zZXNzaW9uID0gMDsKKyAgICBwLT5tb2RpZmllZCA9IDE7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgcmV0dXJuIFNPQVBfRVJSOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dHNldGNvb2tpZXMoc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgY2hhciAqcywgdG1wWzQwOTZdOworICBjb25zdCBjaGFyICp0OworICBmb3IgKHAgPSBzb2FwLT5jb29raWVzOyBwOyBwID0gcC0+bmV4dCkKKyAgeyBpZiAocC0+bW9kaWZpZWQgfHwgIXAtPmVudikKKyAgICB7IHMgPSB0bXA7CisgICAgICBpZiAocC0+bmFtZSkKKyAgICAgICAgcyArPSBzb2FwX2VuY29kZV9jb29raWUocC0+bmFtZSwgcywgdG1wLXMrNDA2NCk7CisgICAgICBpZiAocC0+dmFsdWUgJiYgKnAtPnZhbHVlKQorICAgICAgeyAqcysrID0gJz0nOworICAgICAgICBzICs9IHNvYXBfZW5jb2RlX2Nvb2tpZShwLT52YWx1ZSwgcywgdG1wLXMrNDA2NCk7CisgICAgICB9CisgICAgICBpZiAocC0+ZG9tYWluICYmIChpbnQpc3RybGVuKHAtPmRvbWFpbikgPCB0bXAtcys0MDY0KQorICAgICAgICBzcHJpbnRmKHMsICI7RG9tYWluPVwiJXNcIiIsIHAtPmRvbWFpbik7CisgICAgICBlbHNlIGlmIChzb2FwLT5jb29raWVfZG9tYWluICYmIChpbnQpc3RybGVuKHNvYXAtPmNvb2tpZV9kb21haW4pIDwgdG1wLXMrNDA2NCkKKyAgICAgICAgc3ByaW50ZihzLCAiO0RvbWFpbj1cIiVzXCIiLCBzb2FwLT5jb29raWVfZG9tYWluKTsKKyAgICAgIHN0cmNhdChzLCAiO1BhdGg9XCIvIik7CisgICAgICBpZiAocC0+cGF0aCkKKyAgICAgICAgdCA9IHAtPnBhdGg7CisgICAgICBlbHNlCisgICAgICAgIHQgPSBzb2FwLT5jb29raWVfcGF0aDsKKyAgICAgIGlmICh0KQorICAgICAgeyBpZiAoKnQgPT0gJy8nKQorICAgICAgICAgIHQrKzsKKyAgICAgICAgaWYgKChpbnQpc3RybGVuKHQpIDwgdG1wLXMrNDA2NCkKKyAgICAgICAgICBzdHJjYXQocywgdCk7CisgICAgICB9CisgICAgICBzICs9IHN0cmxlbihzKTsKKyAgICAgICpzKysgPSAnIic7CisgICAgICBpZiAocC0+dmVyc2lvbiA+IDApCisgICAgICAgIHNwcmludGYocywgIjtWZXJzaW9uPSV1IiwgcC0+dmVyc2lvbik7CisgICAgICBpZiAocC0+ZXhwaXJlID49IDApCisgICAgICAgIHNwcmludGYocywgIjtNYXgtQWdlPSVsZCIsIHAtPmV4cGlyZSk7CisgICAgICBpZiAocC0+c2VjdXJlKQorICAgICAgICBzdHJjYXQocywgIjtTZWN1cmUiKTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2V0LUNvb2tpZTogJXNcbiIsIHRtcCkpOworICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJTZXQtQ29va2llIiwgdG1wKSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0Y29va2llcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoLCBpbnQgc2VjdXJlKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKipwLCAqcTsKKyAgdW5zaWduZWQgaW50IHZlcnNpb24gPSAwOworICB0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKKyAgY2hhciAqcywgdG1wWzQwOTZdOworICBwID0gJnNvYXAtPmNvb2tpZXM7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2VuZGluZyBjb29raWVzIGZvciBkb21haW49JXMgcGF0aD0lc1xuIiwgZG9tYWluLCBwYXRoKSk7CisgIGlmICgqcGF0aCA9PSAnLycpCisgICAgcGF0aCsrOworICB3aGlsZSAoKHEgPSAqcCkpCisgIHsgaWYgKHEtPmV4cGlyZSAmJiBub3cgPiBxLT5leHBpcmUpCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvb2tpZSAlcyBleHBpcmVkXG4iLCBxLT5uYW1lKSk7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgcS0+bmFtZSk7CisgICAgICBpZiAocS0+dmFsdWUpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBxLT52YWx1ZSk7CisgICAgICBpZiAocS0+ZG9tYWluKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcS0+ZG9tYWluKTsKKyAgICAgIGlmIChxLT5wYXRoKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcS0+cGF0aCk7CisgICAgICAqcCA9IHEtPm5leHQ7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgcSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IHNpemVfdCBkb21sZW4gPSAwOworICAgICAgaWYgKHEtPmRvbWFpbikKKyAgICAgIHsgY29uc3QgY2hhciAqcyA9IHN0cmNocihxLT5kb21haW4sICc6Jyk7CisgICAgICAgIGlmIChzKQorCSAgZG9tbGVuID0gcyAtIHEtPmRvbWFpbjsKKwllbHNlCisgICAgICAgICAgZG9tbGVuID0gc3RybGVuKHEtPmRvbWFpbik7CisgICAgICB9CisgICAgICBpZiAoKCFxLT5kb21haW4gfHwgIXN0cm5jbXAocS0+ZG9tYWluLCBkb21haW4sIGRvbWxlbikpCisgICAgICAgICAgJiYgKCFxLT5wYXRoIHx8ICFzdHJuY21wKHEtPnBhdGgsIHBhdGgsIHN0cmxlbihxLT5wYXRoKSkpCisgICAgICAgICAgJiYgKCFxLT5zZWN1cmUgfHwgc2VjdXJlKSkKKyAgICAgIHsgcyA9IHRtcDsKKyAgICAgICAgaWYgKHEtPnZlcnNpb24gIT0gdmVyc2lvbikKKyAgICAgICAgeyBzcHJpbnRmKHMsICIkVmVyc2lvbj0ldTsiLCBxLT52ZXJzaW9uKTsKKyAgICAgICAgICB2ZXJzaW9uID0gcS0+dmVyc2lvbjsKKyAgICAgICAgfQorICAgICAgICBpZiAocS0+bmFtZSkKKyAgICAgICAgICBzICs9IHNvYXBfZW5jb2RlX2Nvb2tpZShxLT5uYW1lLCBzLCB0bXAtcys0MDgwKTsKKyAgICAgICAgaWYgKHEtPnZhbHVlICYmICpxLT52YWx1ZSkKKyAgICAgICAgeyAqcysrID0gJz0nOworICAgICAgICAgIHMgKz0gc29hcF9lbmNvZGVfY29va2llKHEtPnZhbHVlLCBzLCB0bXAtcys0MDgwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocS0+cGF0aCAmJiAoaW50KXN0cmxlbihxLT5wYXRoKSA8IHRtcC1zKzQwODApCisgICAgICAgIHsgc3ByaW50ZihzLCAiOyRQYXRoPVwiLyVzXCIiLCAoKnEtPnBhdGggPT0gJy8nID8gcS0+cGF0aCArIDEgOiBxLT5wYXRoKSk7CisgICAgICAgICAgcyArPSBzdHJsZW4ocyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHEtPmRvbWFpbiAmJiAoaW50KXN0cmxlbihxLT5kb21haW4pIDwgdG1wLXMrNDA4MCkKKyAgICAgICAgICBzcHJpbnRmKHMsICI7JERvbWFpbj1cIiVzXCIiLCBxLT5kb21haW4pOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvb2tpZTogJXNcbiIsIHRtcCkpOworICAgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkNvb2tpZSIsIHRtcCkpKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIH0KKyAgICAgIHAgPSAmcS0+bmV4dDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2dldGNvb2tpZXMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnZhbCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwID0gTlVMTCwgKnE7CisgIGNvbnN0IGNoYXIgKnM7CisgIGNoYXIgKnQsIHRtcFs0MDk2XTsgLyogY29va2llIHNpemUgaXMgdXAgdG8gNDA5NiBieXRlcyBbUkZDMjEwOV0gKi8KKyAgY2hhciAqZG9tYWluID0gTlVMTDsKKyAgY2hhciAqcGF0aCA9IE5VTEw7CisgIHVuc2lnbmVkIGludCB2ZXJzaW9uID0gMDsKKyAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CisgIGlmICghdmFsKQorICAgIHJldHVybjsKKyAgcyA9IHZhbDsKKyAgd2hpbGUgKCpzKQorICB7IHMgPSBzb2FwX2RlY29kZV9rZXkodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgaWYgKCFzb2FwX3RhZ19jbXAodG1wLCAiJFZlcnNpb24iKSkKKyAgICB7IGlmICgocyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKSkpCisgICAgICB7IGlmIChwKQorICAgICAgICAgIHAtPnZlcnNpb24gPSAoaW50KWF0b2wodG1wKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHZlcnNpb24gPSAoaW50KWF0b2wodG1wKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcCh0bXAsICIkUGF0aCIpKQorICAgIHsgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgIGlmICgqdG1wKQorICAgICAgeyBpZiAoKHQgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHRtcCkrMSkpKQorICAgICAgICAgIHN0cmNweSh0LCB0bXApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB0ID0gTlVMTDsKKyAgICAgIGlmIChwKQorICAgICAgeyBpZiAocC0+cGF0aCkKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+cGF0aCk7CisgICAgICAgIHAtPnBhdGggPSB0OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBpZiAocGF0aCkKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcGF0aCk7CisgICAgICAgIHBhdGggPSB0OworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHRtcCwgIiREb21haW4iKSkKKyAgICB7IHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICBpZiAoKnRtcCkKKyAgICAgIHsgaWYgKCh0ID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbih0bXApKzEpKSkKKyAgICAgICAgICBzdHJjcHkodCwgdG1wKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgdCA9IE5VTEw7CisgICAgICBpZiAocCkKKyAgICAgIHsgaWYgKHAtPmRvbWFpbikKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+ZG9tYWluKTsKKwlwLT5kb21haW4gPSB0OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBpZiAoZG9tYWluKQorICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCBkb21haW4pOworICAgICAgICBkb21haW4gPSB0OworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChwICYmICFzb2FwX3RhZ19jbXAodG1wLCAiUGF0aCIpKQorICAgIHsgaWYgKHAtPnBhdGgpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5wYXRoKTsKKyAgICAgIHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICBpZiAoKnRtcCkKKyAgICAgIHsgaWYgKChwLT5wYXRoID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbih0bXApKzEpKSkKKyAgICAgICAgICBzdHJjcHkocC0+cGF0aCwgdG1wKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcC0+cGF0aCA9IE5VTEw7CisgICAgfQorICAgIGVsc2UgaWYgKHAgJiYgIXNvYXBfdGFnX2NtcCh0bXAsICJEb21haW4iKSkKKyAgICB7IGlmIChwLT5kb21haW4pCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5kb21haW4pOworICAgICAgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgIGlmICgqdG1wKQorICAgICAgeyBpZiAoKHAtPmRvbWFpbiA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4odG1wKSsxKSkpCisgICAgICAgICAgc3RyY3B5KHAtPmRvbWFpbiwgdG1wKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcC0+ZG9tYWluID0gTlVMTDsKKyAgICB9CisgICAgZWxzZSBpZiAocCAmJiAhc29hcF90YWdfY21wKHRtcCwgIlZlcnNpb24iKSkKKyAgICB7IHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICBwLT52ZXJzaW9uID0gKHVuc2lnbmVkIGludClhdG9sKHRtcCk7CisgICAgfQorICAgIGVsc2UgaWYgKHAgJiYgIXNvYXBfdGFnX2NtcCh0bXAsICJNYXgtQWdlIikpCisgICAgeyBzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgICAgcC0+ZXhwaXJlID0gbm93ICsgYXRvbCh0bXApOworICAgIH0KKyAgICBlbHNlIGlmIChwICYmICFzb2FwX3RhZ19jbXAodG1wLCAiRXhwaXJlcyIpKQorICAgIHsgc3RydWN0IHRtIFQ7CisgICAgICBjaGFyIGFbM107IAorICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbW5zW10gPSAiYW5lYmFycHJheXVudWx1Z2VwY3RvdmVjIjsKKyAgICAgIHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICBpZiAoc3RybGVuKHRtcCkgPiAyMCkKKyAgICAgIHsgbWVtc2V0KCh2b2lkKikmVCwgMCwgc2l6ZW9mKFQpKTsKKyAgICAgICAgYVswXSA9IHRtcFs0XTsKKyAgICAgICAgYVsxXSA9IHRtcFs1XTsKKyAgICAgICAgYVsyXSA9ICdcMCc7CisgICAgICAgIFQudG1fbWRheSA9IChpbnQpYXRvbChhKTsKKyAgICAgICAgYVswXSA9IHRtcFs4XTsKKyAgICAgICAgYVsxXSA9IHRtcFs5XTsKKyAgICAgICAgVC50bV9tb24gPSAoc3Ryc3RyKG1ucywgYSkgLSBtbnMpIC8gMjsKKyAgICAgICAgYVswXSA9IHRtcFsxMV07CisgICAgICAgIGFbMV0gPSB0bXBbMTJdOworICAgICAgICBULnRtX3llYXIgPSAxMDAgKyAoaW50KWF0b2woYSk7CisgICAgICAgIGFbMF0gPSB0bXBbMTNdOworICAgICAgICBhWzFdID0gdG1wWzE0XTsKKyAgICAgICAgVC50bV9ob3VyID0gKGludClhdG9sKGEpOworICAgICAgICBhWzBdID0gdG1wWzE2XTsKKyAgICAgICAgYVsxXSA9IHRtcFsxN107CisgICAgICAgIFQudG1fbWluID0gKGludClhdG9sKGEpOworICAgICAgICBhWzBdID0gdG1wWzE5XTsKKyAgICAgICAgYVsxXSA9IHRtcFsyMF07CisgICAgICAgIFQudG1fc2VjID0gKGludClhdG9sKGEpOworICAgICAgICBwLT5leHBpcmUgPSBzb2FwX3RpbWVnbSgmVCk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHAgJiYgIXNvYXBfdGFnX2NtcCh0bXAsICJTZWN1cmUiKSkKKyAgICAgIHAtPnNlY3VyZSA9IDE7CisgICAgZWxzZQorICAgIHsgaWYgKHApCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR290IGVudmlyb25tZW50IGNvb2tpZSAlcz0lcyBkb21haW49JXMgcGF0aD0lcyBleHBpcmU9JWxkIHNlY3VyZT0lZFxuIiwgcC0+bmFtZSwgcC0+dmFsdWU/cC0+dmFsdWU6IiIsIHAtPmRvbWFpbj9wLT5kb21haW46IiIsIHAtPnBhdGg/cC0+cGF0aDoiIiwgcC0+ZXhwaXJlLCBwLT5zZWN1cmUpKTsKKyAgICAgICAgaWYgKChxID0gc29hcF9zZXRfY29va2llKHNvYXAsIHAtPm5hbWUsIHAtPnZhbHVlLCBwLT5kb21haW4sIHAtPnBhdGgpKSkKKyAgICAgICAgeyBxLT52ZXJzaW9uID0gcC0+dmVyc2lvbjsKKyAgICAgICAgICBxLT5leHBpcmUgPSBwLT5leHBpcmU7CisgICAgICAgICAgcS0+c2VjdXJlID0gcC0+c2VjdXJlOworICAgICAgICAgIHEtPmVudiA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHAtPm5hbWUpCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPm5hbWUpOworICAgICAgICBpZiAocC0+dmFsdWUpCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnZhbHVlKTsKKyAgICAgICAgaWYgKHAtPmRvbWFpbikKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+ZG9tYWluKTsKKyAgICAgICAgaWYgKHAtPnBhdGgpCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnBhdGgpOworICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcCk7CisgICAgICB9CisgICAgICBpZiAoKHAgPSAoc3RydWN0IHNvYXBfY29va2llKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfY29va2llKSkpKQorICAgICAgeyBwLT5uYW1lID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbih0bXApKzEpOworICAgICAgICBzdHJjcHkocC0+bmFtZSwgdG1wKTsKKyAgICAgICAgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgICAgaWYgKCp0bXApCisgICAgICAgIHsgcC0+dmFsdWUgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHRtcCkrMSk7CisgICAgICAgICAgc3RyY3B5KHAtPnZhbHVlLCB0bXApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwLT52YWx1ZSA9IE5VTEw7CisgICAgICAgIHAtPmRvbWFpbiA9IGRvbWFpbjsKKyAgICAgICAgcC0+cGF0aCA9IHBhdGg7CisgICAgICAgIHAtPmV4cGlyZSA9IDA7CisgICAgICAgIHAtPnNlY3VyZSA9IDA7CisgICAgICAgIHAtPnZlcnNpb24gPSB2ZXJzaW9uOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAocCkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdvdCBlbnZpcm9ubWVudCBjb29raWUgJXM9JXMgZG9tYWluPSVzIHBhdGg9JXMgZXhwaXJlPSVsZCBzZWN1cmU9JWRcbiIsIHAtPm5hbWUsIHAtPnZhbHVlP3AtPnZhbHVlOiIiLCBwLT5kb21haW4/cC0+ZG9tYWluOiIiLCBwLT5wYXRoP3AtPnBhdGg6IiIsIHAtPmV4cGlyZSwgcC0+c2VjdXJlKSk7CisgICAgaWYgKChxID0gc29hcF9zZXRfY29va2llKHNvYXAsIHAtPm5hbWUsIHAtPnZhbHVlLCBwLT5kb21haW4sIHAtPnBhdGgpKSkKKyAgICB7IHEtPnZlcnNpb24gPSBwLT52ZXJzaW9uOworICAgICAgcS0+ZXhwaXJlID0gcC0+ZXhwaXJlOworICAgICAgcS0+c2VjdXJlID0gcC0+c2VjdXJlOworICAgICAgcS0+ZW52ID0gMTsKKyAgICB9CisgICAgaWYgKHAtPm5hbWUpCisgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+bmFtZSk7CisgICAgaWYgKHAtPnZhbHVlKQorICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnZhbHVlKTsKKyAgICBpZiAocC0+ZG9tYWluKQorICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPmRvbWFpbik7CisgICAgaWYgKHAtPnBhdGgpCisgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+cGF0aCk7CisgICAgU09BUF9GUkVFKHNvYXAsIHApOworICB9CisgIGlmIChkb21haW4pCisgICAgU09BUF9GUkVFKHNvYXAsIGRvbWFpbik7CisgIGlmIChwYXRoKQorICAgIFNPQVBfRlJFRShzb2FwLCBwYXRoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRlbnZfY29va2llcyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBjb25zdCBjaGFyICpzOworICBjaGFyIGtleVs0MDk2XSwgdmFsWzQwOTZdOyAvKiBjb29raWUgc2l6ZSBpcyB1cCB0byA0MDk2IGJ5dGVzIFtSRkMyMTA5XSAqLworICBpZiAoIShzID0gZ2V0ZW52KCJIVFRQX0NPT0tJRSIpKSkKKyAgICByZXR1cm4gU09BUF9FUlI7CisgIGRvCisgIHsgcyA9IHNvYXBfZGVjb2RlX2tleShrZXksIHNpemVvZihrZXkpLCBzKTsKKyAgICBzID0gc29hcF9kZWNvZGVfdmFsKHZhbCwgc2l6ZW9mKHZhbCksIHMpOworICAgIHAgPSBzb2FwX3NldF9jb29raWUoc29hcCwga2V5LCB2YWwsIE5VTEwsIE5VTEwpOworICAgIGlmIChwKQorICAgICAgcC0+ZW52ID0gMTsKKyAgfSB3aGlsZSAoKnMpOworICByZXR1cm4gU09BUF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwX2Nvb2tpZSoKK1NPQVBfRk1BQzIKK3NvYXBfY29weV9jb29raWVzKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnAsICoqcSwgKnI7CisgIHEgPSAmcjsKKyAgZm9yIChwID0gc29hcC0+Y29va2llczsgcDsgcCA9IHAtPm5leHQpCisgIHsgaWYgKCEoKnEgPSAoc3RydWN0IHNvYXBfY29va2llKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfY29va2llKSkpKQorICAgICAgcmV0dXJuIHI7CisgICAgKipxID0gKnA7CisgICAgaWYgKHAtPm5hbWUpCisgICAgeyBpZiAoKCgqcSktPm5hbWUgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHAtPm5hbWUpKzEpKSkKKyAgICAgICAgc3RyY3B5KCgqcSktPm5hbWUsIHAtPm5hbWUpOworICAgIH0KKyAgICBpZiAocC0+dmFsdWUpCisgICAgeyBpZiAoKCgqcSktPnZhbHVlID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihwLT52YWx1ZSkrMSkpKQorICAgICAgICBzdHJjcHkoKCpxKS0+dmFsdWUsIHAtPnZhbHVlKTsKKyAgICB9CisgICAgaWYgKHAtPmRvbWFpbikKKyAgICB7IGlmICgoKCpxKS0+ZG9tYWluID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihwLT5kb21haW4pKzEpKSkKKyAgICAgICAgc3RyY3B5KCgqcSktPmRvbWFpbiwgcC0+ZG9tYWluKTsKKyAgICB9CisgICAgaWYgKHAtPnBhdGgpCisgICAgeyBpZiAoKCgqcSktPnBhdGggPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHAtPnBhdGgpKzEpKSkKKyAgICAgICAgc3RyY3B5KCgqcSktPnBhdGgsIHAtPnBhdGgpOworICAgIH0KKyAgICBxID0gJigqcSktPm5leHQ7CisgIH0KKyAgKnEgPSBOVUxMOworICByZXR1cm4gcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZnJlZV9jb29raWVzKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGZvciAocCA9IHNvYXAtPmNvb2tpZXM7IHA7IHAgPSBzb2FwLT5jb29raWVzKQorICB7IHNvYXAtPmNvb2tpZXMgPSBwLT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBwLT5uYW1lKTsKKyAgICBpZiAocC0+dmFsdWUpCisgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+dmFsdWUpOworICAgIGlmIChwLT5kb21haW4pCisgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+ZG9tYWluKTsKKyAgICBpZiAocC0+cGF0aCkKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5wYXRoKTsKKyAgICBTT0FQX0ZSRUUoc29hcCwgcCk7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNlbmRpZiAvKiBXSVRIX0NPT0tJRVMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBXSVRIX0daSVAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzb2FwX2dldGd6aXBoZHIoc3RydWN0IHNvYXAgKnNvYXApCit7IGludCBpOworICBzb2FwX3djaGFyIGMsIGYgPSAwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdldCBnemlwIGhlYWRlclxuIikpOworICBmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKQorICB7IGlmICgoaW50KShjID0gc29hcF9nZXQxKHNvYXApID09IEVPRikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICBpZiAoaSA9PSAyKQorICAgICAgZiA9IGM7CisgIH0KKyAgaWYgKGYgJiAweDA0KSAvKiBGRVhUUkEgKi8KKyAgeyBmb3IgKGkgPSBzb2FwX2dldDEoc29hcCkgfCAoc29hcF9nZXQxKHNvYXApIDw8IDgpOyBpOyBpLS0pCisgICAgICBpZiAoKGludClzb2FwX2dldDEoc29hcCkgPT0gRU9GKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgfQorICBpZiAoZiAmIDB4MDgpIC8qIEZOQU1FICovCisgICAgZG8KKyAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgd2hpbGUgKGMgJiYgKGludCljICE9IEVPRik7CisgIGlmICgoaW50KWMgIT0gRU9GICYmIChmICYgMHgxMCkpIC8qIEZDT01NRU5UICovCisgICAgZG8KKyAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgd2hpbGUgKGMgJiYgKGludClmICE9IEVPRik7CisgIGlmICgoaW50KWMgIT0gRU9GICYmIChmICYgMHgwMSkpIC8qIEZIQ1JDICovCisgIHsgaWYgKChpbnQpKGMgPSBzb2FwX2dldDEoc29hcCkpICE9IEVPRikKKyAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgIH0KKyAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYmVnaW5fcmVjdihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcF93Y2hhciBjOworICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIHNvYXBfZnJlZShzb2FwKTsKKyAgc29hcF9zZXRfbG9jYWxfbmFtZXNwYWNlcyhzb2FwKTsKKyAgc29hcC0+dmVyc2lvbiA9IDA7CS8qIGRvbid0IGFzc3VtZSB3ZSdyZSBwYXJzaW5nIFNPQVAgY29udGVudCBieSBkZWZhdWx0ICovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICBzb2FwX2ZyZWVfaWh0KHNvYXApOworI2VuZGlmCisgIGlmICgoc29hcC0+aW1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKQorICAgIHNvYXAtPm9tb2RlIHw9IFNPQVBfSU9fQ0hVTks7CisgIHNvYXAtPmltb2RlICY9IH5TT0FQX0lPOworICBzb2FwLT5tb2RlID0gc29hcC0+aW1vZGU7CisgIGlmICghc29hcC0+a2VlcF9hbGl2ZSkKKyAgeyBzb2FwLT5idWZsZW4gPSAwOworICAgIHNvYXAtPmJ1ZmlkeCA9IDA7CisgIH0KKyAgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfSU9fS0VFUEFMSVZFKSkKKyAgICBzb2FwLT5rZWVwX2FsaXZlID0gMDsKKyAgc29hcC0+YWhlYWQgPSAwOworICBzb2FwLT5wZWVrZWQgPSAwOworICBzb2FwLT5sZXZlbCA9IDA7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0JFR0lOOworICBzb2FwLT5hbGxvY2VkID0gMDsKKyAgc29hcC0+Y291bnQgPSAwOworICBzb2FwLT5sZW5ndGggPSAwOworICBzb2FwLT5jZGF0YSA9IDA7CisgICpzb2FwLT5lbmRwb2ludCA9ICdcMCc7CisgIHNvYXAtPmFjdGlvbiA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXAtPmRvbSA9IE5VTEw7CisgIHNvYXAtPmRpbWUuY2h1bmtzaXplID0gMDsKKyAgc29hcC0+ZGltZS5idWZsZW4gPSAwOworICBzb2FwLT5kaW1lLmxpc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5sYXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5saXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuYm91bmRhcnkgPSBOVUxMOworICBzb2FwLT5taW1lLnN0YXJ0ID0gTlVMTDsKKyAgc29hcC0+eGxpc3QgPSBOVUxMOworI2VuZGlmCisjaWZkZWYgV0lOMzIKKyNpZm5kZWYgVU5ERVJfQ0UKKyNpZm5kZWYgV0lUSF9GQVNUQ0dJCisgIGlmICghc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyNpZmRlZiBfX0JPUkxBTkRDX18KKyAgICBzZXRtb2RlKChTT0FQX1NPQ0tFVClzb2FwLT5yZWN2ZmQsIE9fQklOQVJZKTsKKyNlbHNlCisgICAgX3NldG1vZGUoKFNPQVBfU09DS0VUKXNvYXAtPnJlY3ZmZCwgX09fQklOQVJZKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIFdJVEhfWkxJQgorICBzb2FwLT5tb2RlICY9IH5TT0FQX0VOQ19aTElCOworICBzb2FwLT56bGliX2luID0gU09BUF9aTElCX05PTkU7CisgIHNvYXAtPnpsaWJfb3V0ID0gU09BUF9aTElCX05PTkU7CisgIHNvYXAtPmRfc3RyZWFtLm5leHRfaW4gPSBaX05VTEw7CisgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luID0gMDsKKyAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZSopc29hcC0+YnVmOworICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgPSBTT0FQX0JVRkxFTjsKKyAgc29hcC0+el9yYXRpb19pbiA9IDEuMDsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+ZnByZXBhcmVpbml0KQorICAgIHNvYXAtPmZwcmVwYXJlaW5pdChzb2FwKTsKKyNlbmRpZgorICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworI2lmZGVmIFdJVEhfR1pJUAorICBpZiAoYyA9PSAweDFGKQorICB7IGlmIChzb2FwX2dldGd6aXBoZHIoc29hcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKGluZmxhdGVJbml0Migmc29hcC0+ZF9zdHJlYW0sIC1NQVhfV0JJVFMpICE9IFpfT0spCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9JTkZMQVRFOworICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfWkxJQjsKKyAgICBzb2FwLT56bGliX2luID0gU09BUF9aTElCX0daSVA7CisgICAgc29hcC0+el9jcmMgPSBjcmMzMigwTCwgTlVMTCwgMCk7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJnemlwIGluaXRpYWxpemVkXG4iKSk7CisgICAgbWVtY3B5KHNvYXAtPnpfYnVmLCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOKTsKKyAgICAvKiBzaG91bGQgbm90IGNodW5rIG92ZXIgcGxhaW4gdHJhbnNwb3J0LCBzbyB3aHkgYm90aGVyIHRvIGNoZWNrPyAqLworICAgIC8qIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspICovCisgICAgLyogICBzb2FwLT56X2J1ZmxlbiA9IHNvYXAtPmJ1ZmlkeDsgKi8KKyAgICAvKiBlbHNlICovCisgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9pbiA9IChCeXRlKikoc29hcC0+el9idWYgKyBzb2FwLT5idWZpZHgpOworICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luID0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgIHNvYXAtPnpfYnVmbGVuID0gc29hcC0+YnVmbGVuOworICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmJ1ZmlkeDsKKyAgICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICB9ICAKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoYyA9PSAnLScgJiYgc29hcF9nZXQwKHNvYXApID09ICctJykKKyAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX01JTUU7CisgIGVsc2UgaWYgKChjICYgMHhGRkZDKSA9PSAoU09BUF9ESU1FX1ZFUlNJT04gfCBTT0FQX0RJTUVfTUIpICYmIChzb2FwX2dldDAoc29hcCkgJiAweEZGRjApID09IDB4MjApCisgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19ESU1FOworICBlbHNlCisjZW5kaWYKKyAgeyB3aGlsZSAoc29hcF9ibGFuayhjKSkKKyAgICAgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgIH0KKyAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisjaWZuZGVmIFdJVEhfTk9IVFRQCisgIC8qIGlmIG5vdCBYTUwgb3IgKHN0YXJ0IG9mKUJPTSBvciBNSU1FL0RJTUUvWkxJQiwgYXNzdW1lIEhUVFAgaGVhZGVyICovCisgIGlmIChjICE9ICc8JyAmJiBjICE9IDB4RUYgJiYgIShzb2FwLT5tb2RlICYgKFNPQVBfRU5DX01JTUUgfCBTT0FQX0VOQ19ESU1FIHwgU09BUF9FTkNfWkxJQikpKQorICB7IHNvYXAtPm1vZGUgJj0gflNPQVBfSU87CisgICAgc29hcC0+ZXJyb3IgPSBzb2FwLT5mcGFyc2Uoc29hcCk7CisgICAgaWYgKHNvYXAtPmVycm9yICYmIHNvYXAtPmVycm9yIDwgU09BUF9TVE9QKQorICAgIHsgc29hcC0+a2VlcF9hbGl2ZSA9IDA7IC8qIGZvcmNlIGNsb3NlIGxhdGVyICovCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgICAgeyBzb2FwLT5jaHVua2J1ZmxlbiA9IHNvYXAtPmJ1ZmxlbjsKKyAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmJ1ZmlkeDsKKyAgICAgIHNvYXAtPmNodW5rc2l6ZSA9IDA7CisgICAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICAgIGVsc2UgaWYgKHNvYXAtPmZwcmVwYXJlcmVjdiAmJiBzb2FwLT5idWZsZW4gIT0gc29hcC0+YnVmaWR4KQorICAgICAgc29hcC0+ZnByZXBhcmVyZWN2KHNvYXAsIHNvYXAtPmJ1ZiArIHNvYXAtPmJ1ZmlkeCwgc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4KTsKKyNlbmRpZgorI2lmZGVmIFdJVEhfWkxJQgorICAgIGlmIChzb2FwLT56bGliX2luICE9IFNPQVBfWkxJQl9OT05FKQorICAgIHsgLyogZnBhcnNlIHNob3VsZCBub3QgdXNlIHNvYXBfdW5nZXQgdG8gcHVzaCBiYWNrIGxhc3QgY2hhciAqLworI2lmZGVmIFdJVEhfR1pJUAorICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgIGlmIChjID09IDB4MUYpCisgICAgICB7IGlmIChzb2FwX2dldGd6aXBoZHIoc29hcCkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBpZiAoaW5mbGF0ZUluaXQyKCZzb2FwLT5kX3N0cmVhbSwgLU1BWF9XQklUUykgIT0gWl9PSykKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgICAgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfSU5GTEFURTsKKyAgICAgICAgc29hcC0+el9jcmMgPSBjcmMzMigwTCwgTlVMTCwgMCk7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZ3ppcCBpbml0aWFsaXplZFxuIikpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBzb2FwX3JldmdldDEoc29hcCk7CisjZWxzZQorICAgICAgeworI2VuZGlmCisgICAgICAgIGlmIChpbmZsYXRlSW5pdCgmc29hcC0+ZF9zdHJlYW0pICE9IFpfT0spCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgICBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX0lORkxBVEU7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5mbGF0ZSBpbml0aWFsaXplZFxuIikpOworICAgICAgfQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19aTElCOworICAgICAgbWVtY3B5KHNvYXAtPnpfYnVmLCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOKTsKKyAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfaW4gPSAoQnl0ZSopKHNvYXAtPnpfYnVmICsgc29hcC0+YnVmaWR4KTsKKyAgICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luID0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgICAgc29hcC0+el9idWZsZW4gPSBzb2FwLT5idWZsZW47CisgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5idWZpZHg7CisgICAgfQorI2VuZGlmCisgICAgaWYgKHNvYXAtPmVycm9yKQorICAgIHsgaWYgKHNvYXAtPmVycm9yID09IFNPQVBfRk9STSAmJiBzb2FwLT5mZm9ybSkKKyAgICAgIHsgc29hcC0+ZXJyb3IgPSBzb2FwLT5mZm9ybShzb2FwKTsKKyAgICAgICAgaWYgKHNvYXAtPmVycm9yID09IFNPQVBfT0spCisgICAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1NUT1A7IC8qIHByZXZlbnRzIGZ1cnRoZXIgcHJvY2Vzc2luZyAqLworICAgICAgfQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgfQorI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkKKyAgeyBpZiAoc29hcF9nZXRtaW1laGRyKHNvYXApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmIChzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHNvYXAtPm1pbWUuZmlyc3QtPnR5cGUsICJhcHBsaWNhdGlvbi9kaW1lIikpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX0RJTUU7CisgIH0KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKQorICB7IGlmIChzb2FwX2dldGRpbWVoZHIoc29hcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHNvYXAtPmRpbWUuZmxhZ3MgJiBTT0FQX0RJTUVfQ0YpCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNodW5rZWQgRElNRSBTT0FQIG1lc3NhZ2VcbiIpKTsKKyAgICAgIHNvYXAtPmRpbWUuY2h1bmtzaXplID0gc29hcC0+ZGltZS5zaXplOworICAgICAgaWYgKHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeCA+PSBzb2FwLT5kaW1lLmNodW5rc2l6ZSkKKyAgICAgIHsgc29hcC0+ZGltZS5idWZsZW4gPSBzb2FwLT5idWZsZW47CisgICAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmJ1ZmlkeCArIHNvYXAtPmRpbWUuY2h1bmtzaXplOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBzb2FwLT5kaW1lLmNodW5rc2l6ZSAtPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgfQorICAgIHNvYXAtPmNvdW50ID0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICB9CisjZW5kaWYKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50CitodHRwX3BhcnNlKHN0cnVjdCBzb2FwICpzb2FwKQoreyBjaGFyIGhlYWRlcltTT0FQX0hEUkxFTl0sICpzOworICB1bnNpZ25lZCBzaG9ydCBnZXQgPSAwLCBzdGF0dXMgPSAwLCBrID0gMDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJXYWl0aW5nIGZvciBIVFRQIHJlcXVlc3QvcmVzcG9uc2UuLi5cbiIpKTsKKyAgKnNvYXAtPmVuZHBvaW50ID0gJ1wwJzsKKyAgc29hcC0+bGVuZ3RoID0gMDsKKyAgc29hcC0+dXNlcmlkID0gTlVMTDsKKyAgc29hcC0+cGFzc3dkID0gTlVMTDsKKyAgc29hcC0+YWN0aW9uID0gTlVMTDsKKyAgc29hcC0+YXV0aHJlYWxtID0gTlVMTDsKKyAgZG8KKyAgeyBpZiAoc29hcF9nZXRsaW5lKHNvYXAsIHNvYXAtPm1zZ2J1Ziwgc2l6ZW9mKHNvYXAtPm1zZ2J1ZikpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJIVFRQIHN0YXR1czogJXNcbiIsIHNvYXAtPm1zZ2J1ZikpOworICAgIGZvciAoOzspCisgICAgeyBpZiAoc29hcF9nZXRsaW5lKHNvYXAsIGhlYWRlciwgU09BUF9IRFJMRU4pKQorICAgICAgeyBpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9FT0YpCisJeyBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgICAgICAgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVPRiBpbiBIVFRQIGhlYWRlciwgY29udGludWUgYW55d2F5XG4iKSk7CisJICBicmVhazsKKwl9CisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIH0KKyAgICAgIGlmICghKmhlYWRlcikKKyAgICAgICAgYnJlYWs7CisgICAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiSFRUUCBoZWFkZXI6ICVzXG4iLCBoZWFkZXIpKTsKKyAgICAgIHMgPSBzdHJjaHIoaGVhZGVyLCAnOicpOworICAgICAgaWYgKHMpCisgICAgICB7ICpzID0gJ1wwJzsKKyAgICAgICAgZG8gcysrOworICAgICAgICB3aGlsZSAoKnMgJiYgKnMgPD0gMzIpOworICAgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBhcnNlaGRyKHNvYXAsIGhlYWRlciwgcykpKQorICAgICAgICB7IGlmIChzb2FwLT5lcnJvciA8IFNPQVBfU1RPUCkKKwkgICAgcmV0dXJuIHNvYXAtPmVycm9yOworCSAgc3RhdHVzID0gc29hcC0+ZXJyb3I7CisJICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKChzID0gc3RyY2hyKHNvYXAtPm1zZ2J1ZiwgJyAnKSkpCisgICAgeyBrID0gKHVuc2lnbmVkIHNob3J0KXNvYXBfc3RydG91bChzLCAmcywgMTApOworICAgICAgaWYgKCFzb2FwX2JsYW5rKCpzKSkKKyAgICAgICAgayA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGsgPSAwOworICB9IHdoaWxlIChrID09IDEwMCk7CisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJGaW5pc2hlZCBIVFRQIGhlYWRlciBwYXJzaW5nXG4iKSk7CisgIHMgPSBzdHJzdHIoc29hcC0+bXNnYnVmLCAiSFRUUC8iKTsKKyAgaWYgKHMgJiYgc1s3XSAhPSAnMScpCisgIHsgaWYgKHNvYXAtPmtlZXBfYWxpdmUgPT0gMSkKKyAgICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOworICAgIGlmIChrID09IDAgJiYgKHNvYXAtPm9tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykgLyogayA9PSAwIGZvciBIVFRQIHJlcXVlc3QgKi8KKyAgICB7IHNvYXAtPmltb2RlIHw9IFNPQVBfSU9fQ0hVTks7CisgICAgICBzb2FwLT5vbW9kZSA9IChzb2FwLT5vbW9kZSAmIH5TT0FQX0lPKSB8IFNPQVBfSU9fU1RPUkU7CisgICAgfQorICB9CisgIGlmIChzb2FwLT5rZWVwX2FsaXZlIDwgMCkKKyAgICBzb2FwLT5rZWVwX2FsaXZlID0gMTsKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIktlZXAgYWxpdmUgY29ubmVjdGlvbiA9ICVkXG4iLCBzb2FwLT5rZWVwX2FsaXZlKSk7CisgIGlmIChzICYmICgoKGdldCA9ICFzdHJuY21wKHNvYXAtPm1zZ2J1ZiwgIkdFVCAiLCA0KSkpIHx8ICFzdHJuY21wKHNvYXAtPm1zZ2J1ZiwgIlBPU1QgIiwgNSkpKQorICB7IHNpemVfdCBtID0gc3RybGVuKHNvYXAtPmVuZHBvaW50KTsKKyAgICBzaXplX3QgbiA9IG0gKyAocyAtIHNvYXAtPm1zZ2J1ZikgLSA1IC0gKCFnZXQpOworICAgIGlmIChuID49IHNpemVvZihzb2FwLT5lbmRwb2ludCkpCisgICAgICBuID0gc2l6ZW9mKHNvYXAtPmVuZHBvaW50KSAtIDE7CisgICAgc3RybmNweShzb2FwLT5wYXRoLCBzb2FwLT5tc2didWYgKyA0ICsgKCFnZXQpLCBuIC0gbSk7CisgICAgc29hcC0+cGF0aFtuIC0gbV0gPSAnXDAnOworICAgIHN0cmNhdChzb2FwLT5lbmRwb2ludCwgc29hcC0+cGF0aCk7CisgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlRhcmdldCBlbmRwb2ludD0nJXMnXG4iLCBzb2FwLT5lbmRwb2ludCkpOworICAgIGlmIChnZXQpCisgICAgeyBzb2FwLT5lcnJvciA9IHNvYXAtPmZnZXQoc29hcCk7CisgICAgICBpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9PSykKKyAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1NUT1A7IC8qIHByZXZlbnRzIGZ1cnRoZXIgcHJvY2Vzc2luZyAqLworICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBpZiAoc3RhdHVzKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gc3RhdHVzOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIGlmIChrID09IDAgfHwgKGsgPj0gMjAwICYmIGsgPD0gMjk5KSB8fCBrID09IDQwMCB8fCBrID09IDUwMCkKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkhUVFAgZXJyb3IgJWRcbiIsIGspKTsKKyAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJIVFRQIGVycm9yIiwgc29hcC0+bXNnYnVmLCBrKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAoraHR0cF9wYXJzZV9oZWFkZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsKQoreyBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJIb3N0IikpCisgIHsgCisjaWZkZWYgV0lUSF9PUEVOU1NMCisgICAgaWYgKHNvYXAtPmltb2RlICYgU09BUF9FTkNfU1NMKQorICAgICAgc3RyY3B5KHNvYXAtPmVuZHBvaW50LCAiaHR0cHM6Ly8iKTsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgIHN0cmNweShzb2FwLT5lbmRwb2ludCwgImh0dHA6Ly8iKTsKKyAgICBzdHJuY2F0KHNvYXAtPmVuZHBvaW50LCB2YWwsIHNpemVvZihzb2FwLT5lbmRwb2ludCkgLSA4KTsKKyAgICBzb2FwLT5lbmRwb2ludFtzaXplb2Yoc29hcC0+ZW5kcG9pbnQpIC0gMV0gPSAnXDAnOworICB9CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1UeXBlIikpCisgIHsgaWYgKHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAiYXBwbGljYXRpb24vZGltZSIpKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19ESU1FOworICAgIGVsc2UgaWYgKHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAibXVsdGlwYXJ0L3JlbGF0ZWQiKQorICAgICAgICAgIHx8IHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAibXVsdGlwYXJ0L2Zvcm0tZGF0YSIpKQorICAgIHsgc29hcC0+bWltZS5ib3VuZGFyeSA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAiYm91bmRhcnkiKSk7CisgICAgICBzb2FwLT5taW1lLnN0YXJ0ID0gc29hcF9zdHJkdXAoc29hcCwgc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwsICJzdGFydCIpKTsKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfTUlNRTsKKyAgICB9CisgIH0KKyNlbmRpZgorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtTGVuZ3RoIikpCisgICAgc29hcC0+bGVuZ3RoID0gc29hcF9zdHJ0b3VsKHZhbCwgTlVMTCwgMTApOworICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtRW5jb2RpbmciKSkKKyAgeyBpZiAoIXNvYXBfdGFnX2NtcCh2YWwsICJkZWZsYXRlIikpCisjaWZkZWYgV0lUSF9aTElCCisgICAgICBzb2FwLT56bGliX2luID0gU09BUF9aTElCX0RFRkxBVEU7CisjZWxzZQorICAgICAgcmV0dXJuIFNPQVBfWkxJQl9FUlJPUjsKKyNlbmRpZgorICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAodmFsLCAiZ3ppcCIpKQorI2lmZGVmIFdJVEhfR1pJUAorICAgICAgc29hcC0+emxpYl9pbiA9IFNPQVBfWkxJQl9HWklQOworI2Vsc2UKKyAgICAgIHJldHVybiBTT0FQX1pMSUJfRVJST1I7CisjZW5kaWYKKyAgfQorI2lmZGVmIFdJVEhfWkxJQgorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkFjY2VwdC1FbmNvZGluZyIpKQorICB7CisjaWZkZWYgV0lUSF9HWklQCisgICAgaWYgKHN0cmNocih2YWwsICcqJykgfHwgc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwsICJnemlwIikpCisgICAgICBzb2FwLT56bGliX291dCA9IFNPQVBfWkxJQl9HWklQOworICAgIGVsc2UKKyNlbmRpZgorICAgIGlmIChzdHJjaHIodmFsLCAnKicpIHx8IHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAiZGVmbGF0ZSIpKQorICAgICAgc29hcC0+emxpYl9vdXQgPSBTT0FQX1pMSUJfREVGTEFURTsKKyAgICBlbHNlCisgICAgICBzb2FwLT56bGliX291dCA9IFNPQVBfWkxJQl9OT05FOworICB9CisjZW5kaWYKKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJUcmFuc2Zlci1FbmNvZGluZyIpKQorICB7IHNvYXAtPm1vZGUgJj0gflNPQVBfSU87CisgICAgaWYgKCFzb2FwX3RhZ19jbXAodmFsLCAiY2h1bmtlZCIpKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX0NIVU5LOworICB9CisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29ubmVjdGlvbiIpKQorICB7IGlmICghc29hcF90YWdfY21wKHZhbCwgImtlZXAtYWxpdmUiKSkKKyAgICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAtc29hcC0+a2VlcF9hbGl2ZTsKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHZhbCwgImNsb3NlIikpCisgICAgICBzb2FwLT5rZWVwX2FsaXZlID0gMDsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU4KKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJBdXRob3JpemF0aW9uIikpCisgIHsgaWYgKCFzb2FwX3RhZ19jbXAodmFsLCAiQmFzaWMgKiIpKQorICAgIHsgaW50IG47CisgICAgICBjaGFyICpzOworICAgICAgc29hcF9iYXNlNjQycyhzb2FwLCB2YWwgKyA2LCBzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpIC0gMSwgJm4pOworICAgICAgc29hcC0+dG1wYnVmW25dID0gJ1wwJzsKKyAgICAgIGlmICgocyA9IHN0cmNocihzb2FwLT50bXBidWYsICc6JykpKQorICAgICAgeyAqcyA9ICdcMCc7CisJc29hcC0+dXNlcmlkID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+dG1wYnVmKTsKKwlzb2FwLT5wYXNzd2QgPSBzb2FwX3N0cmR1cChzb2FwLCBzICsgMSk7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiV1dXLUF1dGhlbnRpY2F0ZSIpKQorICAgIHNvYXAtPmF1dGhyZWFsbSA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsICsgNiwgInJlYWxtIikpOworICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkV4cGVjdCIpKQorICB7IGlmICghc29hcF90YWdfY21wKHZhbCwgIjEwMC1jb250aW51ZSIpKQorICAgIHsgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJIVFRQLzEuMSAxMDAgQ29udGludWUiLCBOVUxMKSkKKyAgICAgICB8fCAoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCBOVUxMLCBOVUxMKSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgIH0KKyNlbmRpZgorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIlNPQVBBY3Rpb24iKSkKKyAgeyBpZiAoKnZhbCA9PSAnIicpCisgICAgeyBzb2FwLT5hY3Rpb24gPSBzb2FwX3N0cmR1cChzb2FwLCB2YWwgKyAxKTsKKyAgICAgIHNvYXAtPmFjdGlvbltzdHJsZW4oc29hcC0+YWN0aW9uKSAtIDFdID0gJ1wwJzsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJMb2NhdGlvbiIpKQorICB7IHN0cm5jcHkoc29hcC0+ZW5kcG9pbnQsIHZhbCwgc2l6ZW9mKHNvYXAtPmVuZHBvaW50KSk7CisgICAgc29hcC0+ZW5kcG9pbnRbc2l6ZW9mKHNvYXAtPmVuZHBvaW50KSAtIDFdID0gJ1wwJzsKKyAgfQorI2lmZGVmIFdJVEhfQ09PS0lFUworICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvb2tpZSIpIHx8ICFzb2FwX3RhZ19jbXAoa2V5LCAiU2V0LUNvb2tpZSIpKQorICAgIHNvYXBfZ2V0Y29va2llcyhzb2FwLCB2YWwpOworI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAhZGVmaW5lZChXSVRIX05PSFRUUCkgfHwgIWRlZmluZWQoV0lUSF9MRUFORVIpCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmxpbmUsIGNvbnN0IGNoYXIgKmtleSkKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqcyA9IGxpbmU7CisgIGlmIChzKQorICB7IHdoaWxlICgqcykKKyAgICB7IHJlZ2lzdGVyIHNob3J0IGZsYWc7CisgICAgICBzID0gc29hcF9kZWNvZGVfa2V5KHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksIHMpOworICAgICAgZmxhZyA9IHNvYXBfdGFnX2NtcChzb2FwLT50bXBidWYsIGtleSk7CisgICAgICBzID0gc29hcF9kZWNvZGVfdmFsKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksIHMpOworICAgICAgaWYgKCFmbGFnKQorICAgICAgICByZXR1cm4gc29hcC0+dG1wYnVmOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgIWRlZmluZWQoV0lUSF9OT0hUVFApIHx8ICFkZWZpbmVkKFdJVEhfTEVBTkVSKQorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2RlY29kZV9rZXkoY2hhciAqYnVmLCBzaXplX3QgbGVuLCBjb25zdCBjaGFyICp2YWwpCit7IHJldHVybiBzb2FwX2RlY29kZShidWYsIGxlbiwgdmFsLCAiPSw7Iik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmICFkZWZpbmVkKFdJVEhfTk9IVFRQKSB8fCAhZGVmaW5lZChXSVRIX0xFQU5FUikKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9kZWNvZGVfdmFsKGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwgY29uc3QgY2hhciAqdmFsKQoreyBpZiAoKnZhbCAhPSAnPScpCisgIHsgKmJ1ZiA9ICdcMCc7CisgICAgcmV0dXJuIHZhbDsKKyAgfQorICByZXR1cm4gc29hcF9kZWNvZGUoYnVmLCBsZW4sIHZhbCArIDEsICIsOyIpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAhZGVmaW5lZChXSVRIX05PSFRUUCkgfHwgIWRlZmluZWQoV0lUSF9MRUFORVIpCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNvbnN0IGNoYXIqCitzb2FwX2RlY29kZShjaGFyICpidWYsIHNpemVfdCBsZW4sIGNvbnN0IGNoYXIgKnZhbCwgY29uc3QgY2hhciAqc2VwKQoreyBjb25zdCBjaGFyICpzOworICBjaGFyICp0ID0gYnVmOworICBmb3IgKHMgPSB2YWw7ICpzOyBzKyspCisgICAgaWYgKCpzICE9ICcgJyAmJiAqcyAhPSAnXHQnICYmICFzdHJjaHIoc2VwLCAqcykpCisgICAgICBicmVhazsKKyAgaWYgKCpzID09ICciJykKKyAgeyBzKys7CisgICAgd2hpbGUgKCpzICYmICpzICE9ICciJyAmJiAtLWxlbikKKyAgICAgICp0KysgPSAqcysrOworICB9CisgIGVsc2UKKyAgeyB3aGlsZSAoc29hcF9ub3RibGFuaygqcykgJiYgIXN0cmNocihzZXAsICpzKSAmJiAtLWxlbikKKyAgICB7IGlmICgqcyA9PSAnJScpCisgICAgICB7ICp0KysgPSAoKHNbMV0gPj0gJ0EnID8gKHNbMV0gJiAweDcpICsgOSA6IHNbMV0gLSAnMCcpIDw8IDQpCisgICAgICAgICAgICAgICsgKHNbMl0gPj0gJ0EnID8gKHNbMl0gJiAweDcpICsgOSA6IHNbMl0gLSAnMCcpOworICAgICAgICBzICs9IDM7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgICp0KysgPSAqcysrOworICAgIH0KKyAgfQorICAqdCA9ICdcMCc7CisgIHdoaWxlICgqcyAmJiAhc3RyY2hyKHNlcCwgKnMpKQorICAgIHMrKzsKKyAgcmV0dXJuIHM7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbnZlbG9wZV9iZWdpbl9vdXQoc3RydWN0IHNvYXAgKnNvYXApCit7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNpemVfdCBuID0gMDsKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkgJiYgc29hcC0+bWltZS5ib3VuZGFyeSAmJiBzb2FwLT5taW1lLnN0YXJ0KQorICB7IGNvbnN0IGNoYXIgKnM7CisgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkgJiYgIShzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkpCisgICAgICBzID0gImFwcGxpY2F0aW9uL2RpbWUiOworICAgIGVsc2UgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgICAgIHMgPSAiYXBwbGljYXRpb24vc29hcCt4bWw7IGNoYXJzZXQ9dXRmLTgiOworICAgIGVsc2UKKyAgICAgIHMgPSAidGV4dC94bWw7IGNoYXJzZXQ9dXRmLTgiOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiLS0lc1xyXG5Db250ZW50LVR5cGU6ICVzXHJcbkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJpbmFyeVxyXG5Db250ZW50LUlEOiAlc1xyXG5cclxuIiwgc29hcC0+bWltZS5ib3VuZGFyeSwgcywgc29hcC0+bWltZS5zdGFydCk7CisgICAgbiA9IHN0cmxlbihzb2FwLT50bXBidWYpOworICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHNvYXAtPnRtcGJ1ZiwgbikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICBzb2FwLT5kaW1lLnNpemUgPSBzb2FwLT5jb3VudDsJLyogRElNRSBpbiBNSU1FIGNvcnJlY3Rpb24gKi8KKyAgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpKQorICB7IGlmIChzb2FwX3B1dGRpbWVoZHIoc29hcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyNlbmRpZgorICBzb2FwLT5wYXJ0ID0gU09BUF9JTl9FTlZFTE9QRTsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgIlNPQVAtRU5WOkVudmVsb3BlIiwgMCwgTlVMTCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW52ZWxvcGVfZW5kX291dChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsICJTT0FQLUVOVjpFbnZlbG9wZSIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpICYmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkgJiYgIShzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkpCisgIHsgc29hcC0+ZGltZS5zaXplID0gc29hcC0+Y291bnQgLSBzb2FwLT5kaW1lLnNpemU7CS8qIERJTUUgaW4gTUlNRSBjb3JyZWN0aW9uICovCisgICAgc3ByaW50Zihzb2FwLT5pZCwgc29hcC0+ZGltZV9pZF9mb3JtYXQsIDApOworICAgIHNvYXAtPmRpbWUuaWQgPSBzb2FwLT5pZDsKKyAgICBpZiAoc29hcC0+bG9jYWxfbmFtZXNwYWNlcykKKyAgICB7IGlmIChzb2FwLT5sb2NhbF9uYW1lc3BhY2VzWzBdLm91dCkKKyAgICAgICAgc29hcC0+ZGltZS50eXBlID0gKGNoYXIqKXNvYXAtPmxvY2FsX25hbWVzcGFjZXNbMF0ub3V0OworICAgICAgZWxzZQorICAgICAgICBzb2FwLT5kaW1lLnR5cGUgPSAoY2hhciopc29hcC0+bG9jYWxfbmFtZXNwYWNlc1swXS5uczsKKyAgICB9CisgICAgc29hcC0+ZGltZS5vcHRpb25zID0gTlVMTDsKKyAgICBzb2FwLT5kaW1lLmZsYWdzID0gU09BUF9ESU1FX01CIHwgU09BUF9ESU1FX0FCU1VSSTsKKyAgICBpZiAoIXNvYXAtPmRpbWUuZmlyc3QpCisgICAgICBzb2FwLT5kaW1lLmZsYWdzIHw9IFNPQVBfRElNRV9NRTsKKyAgICBzb2FwLT5jb3VudCArPSAxMiArICgoc3RybGVuKHNvYXAtPmRpbWUuaWQpKzMpJih+MykpICsgKChzdHJsZW4oc29hcC0+ZGltZS50eXBlKSszKSYofjMpKTsKKyAgfQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKSkKKyAgICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCBTT0FQX1NUUl9QQURESU5HLCAtKGxvbmcpc29hcC0+ZGltZS5zaXplJjMpOworI2VuZGlmCisgIHNvYXAtPnBhcnQgPSBTT0FQX0VORF9FTlZFTE9QRTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9IAorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VudmVsb3BlX2JlZ2luX2luKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzdHJ1Y3QgTmFtZXNwYWNlICpwOworICBzb2FwLT5wYXJ0ID0gU09BUF9JTl9FTlZFTE9QRTsKKyAgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCAiU09BUC1FTlY6RW52ZWxvcGUiLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1ZFUlNJT05NSVNNQVRDSDsKKyAgcCA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXM7CisgIGlmIChwKQorICB7IGNvbnN0IGNoYXIgKm5zID0gcFswXS5vdXQ7CisgICAgaWYgKCFucykKKyAgICAgIG5zID0gcFswXS5uczsKKyAgICBpZiAoIXN0cmNtcChucywgc29hcF9lbnYxKSkKKyAgICB7IHNvYXAtPnZlcnNpb24gPSAxOyAvKiBtYWtlIHN1cmUgd2UgdXNlIFNPQVAgMS4xICovCisgICAgICBpZiAocFsxXS5vdXQpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwWzFdLm91dCk7CisgICAgICBpZiAoKHBbMV0ub3V0ID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzb2FwX2VuYzEpKSkpCisgICAgICAgIHN0cmNweShwWzFdLm91dCwgc29hcF9lbmMxKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChucywgc29hcF9lbnYyKSkKKyAgICB7IHNvYXAtPnZlcnNpb24gPSAyOyAvKiBtYWtlIHN1cmUgd2UgdXNlIFNPQVAgMS4yICovCisgICAgICBpZiAocFsxXS5vdXQpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwWzFdLm91dCk7CisgICAgICBpZiAoKHBbMV0ub3V0ID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzb2FwX2VuYzIpKSkpCisgICAgICAgIHN0cmNweShwWzFdLm91dCwgc29hcF9lbmMyKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW52ZWxvcGVfZW5kX2luKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5wYXJ0ID0gU09BUF9FTkRfRU5WRUxPUEU7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsICJTT0FQLUVOVjpFbnZlbG9wZSIpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JvZHlfYmVnaW5fb3V0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5wYXJ0ID0gU09BUF9JTl9CT0RZOworICBpZiAoc29hcC0+dmVyc2lvbiA9PSAxKQorICAgIHNvYXAtPmVuY29kaW5nID0gMTsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NFQykgJiYgc29hcF9zZXRfYXR0cihzb2FwLCAid3N1OklkIiwgIkJvZHkiKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjZW5kaWYKKyAgaWYgKHNvYXBfZWxlbWVudChzb2FwLCAiU09BUC1FTlY6Qm9keSIsIDAsIE5VTEwpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHNvYXAsIE5VTEwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JvZHlfZW5kX291dChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsICJTT0FQLUVOVjpCb2R5IikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBzb2FwLT5wYXJ0ID0gU09BUF9FTkRfQk9EWTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYm9keV9iZWdpbl9pbihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+cGFydCA9IFNPQVBfSU5fQk9EWTsKKyAgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCAiU09BUC1FTlY6Qm9keSIsIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKCFzb2FwLT5ib2R5KQorICAgIHNvYXAtPnBhcnQgPSBTT0FQX05PX0JPRFk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JvZHlfZW5kX2luKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcC0+cGFydCA9PSBTT0FQX05PX0JPRFkpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0VORF9CT0RZOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCAiU09BUC1FTlY6Qm9keSIpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlY3ZfaGVhZGVyKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcF9nZXRoZWFkZXIoc29hcCkgJiYgc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9lbmRwb2ludChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZW5kcG9pbnQpCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnM7CisgIHJlZ2lzdGVyIHNpemVfdCBpLCBuOworICBzb2FwLT5lbmRwb2ludFswXSA9ICdcMCc7CisgIHNvYXAtPmhvc3RbMF0gPSAnXDAnOworICBzb2FwLT5wYXRoWzBdID0gJy8nOworICBzb2FwLT5wYXRoWzFdID0gJ1wwJzsKKyAgc29hcC0+cG9ydCA9IDgwOworICBpZiAoIWVuZHBvaW50IHx8ICEqZW5kcG9pbnQpCisgICAgcmV0dXJuOworICBpZiAoIXN0cm5jbXAoZW5kcG9pbnQsICJodHRwczoiLCA2KSkKKyAgICBzb2FwLT5wb3J0ID0gNDQzOworICBzdHJuY3B5KHNvYXAtPmVuZHBvaW50LCBlbmRwb2ludCwgc2l6ZW9mKHNvYXAtPmVuZHBvaW50KSAtIDEpOworICBzID0gc3RyY2hyKGVuZHBvaW50LCAnOicpOworICBpZiAocyAmJiBzWzFdID09ICcvJyAmJiBzWzJdID09ICcvJykKKyAgICBzICs9IDM7CisgIGVsc2UKKyAgICBzID0gZW5kcG9pbnQ7CisgIG4gPSBzdHJsZW4ocyk7CisgIGlmIChuID49IHNpemVvZihzb2FwLT5ob3N0KSkKKyAgICBuID0gc2l6ZW9mKHNvYXAtPmhvc3QpIC0gMTsKKyNpZmRlZiBXSVRIX0lQVjYKKyAgaWYgKHNbMF0gPT0gJ1snKQorICB7IHMrKzsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIHsgc29hcC0+aG9zdFtpXSA9IHNbaV07CisgICAgICBpZiAoc1tpXSA9PSAnXScpCisgICAgICB7IHMrKzsKKyAgICAgICAgYnJlYWs7IAorICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICB7IHNvYXAtPmhvc3RbaV0gPSBzW2ldOworICAgICAgaWYgKHNbaV0gPT0gJy8nIHx8IHNbaV0gPT0gJzonKQorICAgICAgICBicmVhazsgCisgICAgfQorICB9CisjZWxzZQorICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICB7IHNvYXAtPmhvc3RbaV0gPSBzW2ldOworICAgIGlmIChzW2ldID09ICcvJyB8fCBzW2ldID09ICc6JykKKyAgICAgIGJyZWFrOyAKKyAgfQorI2VuZGlmCisgIHNvYXAtPmhvc3RbaV0gPSAnXDAnOworICBpZiAoc1tpXSA9PSAnOicpCisgIHsgc29hcC0+cG9ydCA9IChpbnQpYXRvbChzICsgaSArIDEpOworICAgIGZvciAoaSsrOyBpIDwgbjsgaSsrKQorICAgICAgaWYgKHNbaV0gPT0gJy8nKQorICAgICAgICBicmVhazsKKyAgfQorICBpZiAoc1tpXSkKKyAgeyBzdHJuY3B5KHNvYXAtPnBhdGgsIHMgKyBpLCBzaXplb2Yoc29hcC0+cGF0aCkpOworICAgIHNvYXAtPnBhdGhbc2l6ZW9mKHNvYXAtPnBhdGgpIC0gMV0gPSAnXDAnOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfY29ubmVjdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZW5kcG9pbnQsIGNvbnN0IGNoYXIgKmFjdGlvbikKK3sgcmV0dXJuIHNvYXBfY29ubmVjdF9jb21tYW5kKHNvYXAsIFNPQVBfUE9TVCwgZW5kcG9pbnQsIGFjdGlvbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfY29ubmVjdF9jb21tYW5kKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgaHR0cF9jb21tYW5kLCBjb25zdCBjaGFyICplbmRwb2ludCwgY29uc3QgY2hhciAqYWN0aW9uKQoreyBjaGFyIGhvc3Rbc2l6ZW9mKHNvYXAtPmhvc3QpXTsKKyAgaW50IHBvcnQ7CisgIHNpemVfdCBjb3VudDsKKyAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICBzdHJjcHkoaG9zdCwgc29hcC0+aG9zdCk7IC8qIHNhdmUgdG8gY29tcGFyZSAqLworICBwb3J0ID0gc29hcC0+cG9ydDsgLyogc2F2ZSB0byBjb21wYXJlICovCisgIHNvYXBfc2V0X2VuZHBvaW50KHNvYXAsIGVuZHBvaW50KTsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPmZjb25uZWN0KQorICB7IGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mY29ubmVjdChzb2FwLCBlbmRwb2ludCwgc29hcC0+aG9zdCwgc29hcC0+cG9ydCkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGVsc2UKKyNlbmRpZgorICBpZiAoc29hcC0+Zm9wZW4gJiYgKnNvYXAtPmhvc3QpCisgIHsgc29hcC0+c3RhdHVzID0gaHR0cF9jb21tYW5kOworICAgIGlmICghc29hcC0+a2VlcF9hbGl2ZSB8fCAhc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSB8fCBzdHJjbXAoc29hcC0+aG9zdCwgaG9zdCkgfHwgc29hcC0+cG9ydCAhPSBwb3J0IHx8ICFzb2FwLT5mcG9sbCB8fCBzb2FwLT5mcG9sbChzb2FwKSkKKyAgICB7IHNvYXAtPmtlZXBfYWxpdmUgPSAwOyAvKiB0byBmb3JjZSBjbG9zZSAqLworICAgICAgc29hcC0+b21vZGUgJj0gflNPQVBfSU9fVURQOyAvKiB0byBmb3JjZSBjbG9zZSAqLworICAgICAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29ubmVjdC9yZWNvbm5lY3QgdG8gaG9zdD0nJXMnIHBhdGg9JyVzJyBwb3J0PSVkXG4iLCBzb2FwLT5ob3N0LCBzb2FwLT5wYXRoLCBzb2FwLT5wb3J0KSk7CisjaWZkZWYgV0lUSF9VRFAKKyAgICAgIGlmICghc3RybmNtcChlbmRwb2ludCwgInNvYXAudWRwOiIsIDkpKQorICAgICAgICBzb2FwLT5vbW9kZSB8PSBTT0FQX0lPX1VEUDsKKyNlbmRpZgorICAgICAgc29hcC0+c29ja2V0ID0gc29hcC0+Zm9wZW4oc29hcCwgZW5kcG9pbnQsIHNvYXAtPmhvc3QsIHNvYXAtPnBvcnQpOworICAgICAgaWYgKHNvYXAtPmVycm9yKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBzb2FwLT5rZWVwX2FsaXZlID0gKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fS0VFUEFMSVZFKSAhPSAwKTsKKyAgICB9CisgIH0KKyAgY291bnQgPSBzb2FwX2NvdW50X2F0dGFjaG1lbnRzKHNvYXApOworICBpZiAoc29hcF9iZWdpbl9zZW5kKHNvYXApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgIT0gU09BUF9JT19TVE9SRSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpICYmIGVuZHBvaW50KQorICB7IHVuc2lnbmVkIGludCBrID0gc29hcC0+bW9kZTsKKyAgICBzb2FwLT5tb2RlICY9IH4oU09BUF9JTyB8IFNPQVBfRU5DX1pMSUIpOworICAgIGlmICgoayAmIFNPQVBfSU8pICE9IFNPQVBfSU9fRkxVU0gpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fQlVGRkVSOworICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdChzb2FwLCBlbmRwb2ludCwgc29hcC0+aG9zdCwgc29hcC0+cG9ydCwgc29hcC0+cGF0aCwgYWN0aW9uLCBjb3VudCkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICAgIGlmICgoayAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgICAgeyBpZiAoc29hcF9mbHVzaChzb2FwKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyNlbmRpZgorICAgIHNvYXAtPm1vZGUgPSBrOworICB9CisgIGVsc2UgaWYgKGFjdGlvbikKKyAgICBzb2FwLT5hY3Rpb24gPSBzb2FwX3N0cmR1cChzb2FwLCBhY3Rpb24pOworICBpZiAoaHR0cF9jb21tYW5kICE9IFNPQVBfUE9TVCkKKyAgICByZXR1cm4gc29hcF9lbmRfc2VuZChzb2FwKTsKKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2NoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3MyYmFzZTY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzLCBjaGFyICp0LCBpbnQgbikKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbTsKKyAgcmVnaXN0ZXIgY2hhciAqcDsKKyAgaWYgKCF0KQorICAgIHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgKG4gKyAyKSAvIDMgKiA0ICsgMSk7CisgIGlmICghdCkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHJldHVybiBOVUxMOworICB9CisgIHAgPSB0OworICB0WzBdID0gJ1wwJzsKKyAgaWYgKCFzKQorICAgIHJldHVybiBwOworICBmb3IgKDsgbiA+IDI7IG4gLT0gMywgcyArPSAzKQorICB7IG0gPSBzWzBdOworICAgIG0gPSAobSA8PCA4KSB8IHNbMV07CisgICAgbSA9IChtIDw8IDgpIHwgc1syXTsKKyAgICBmb3IgKGkgPSA0OyBpID4gMDsgbSA+Pj0gNikKKyAgICAgIHRbLS1pXSA9IHNvYXBfYmFzZTY0b1ttICYgMHgzRl07CisgICAgdCArPSA0OworICB9CisgIHRbMF0gPSAnXDAnOworICBpZiAobiA+IDApCisgIHsgbSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgIG0gPSAobSA8PCA4KSB8ICpzKys7CisgICAgZm9yICg7IGkgPCAzOyBpKyspCisgICAgICBtIDw8PSA4OworICAgIGZvciAoaSsrOyBpID4gMDsgbSA+Pj0gNikKKyAgICAgIHRbLS1pXSA9IHNvYXBfYmFzZTY0b1ttICYgMHgzRl07CisgICAgZm9yIChpID0gMzsgaSA+IG47IGktLSkKKyAgICAgIHRbaV0gPSAnPSc7CisgICAgdFs0XSA9ICdcMCc7CisgIH0KKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9iYXNlNjQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgY2hhciAqdCwgc2l6ZV90IGwsIGludCAqbikKK3sgcmVnaXN0ZXIgaW50IGksIGosIGM7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbTsKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqcDsKKyAgaWYgKCFzIHx8ICEqcykKKyAgeyBpZiAobikKKyAgICAgICpuID0gMDsKKyAgICBpZiAoc29hcC0+ZXJyb3IpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gU09BUF9OT05fTlVMTDsKKyAgfQorICBpZiAoIXQpCisgIHsgbCA9IChzdHJsZW4ocykgKyAzKSAvIDQgKiAzOworICAgIHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgbCk7CisgIH0KKyAgaWYgKCF0KQorICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcCA9IHQ7CisgIGlmIChuKQorICAgICpuID0gMDsKKyAgZm9yICg7OykKKyAgeyBmb3IgKGkgPSAwOyBpIDwgU09BUF9CTEtMRU47IGkrKykKKyAgICB7IG0gPSAwOworICAgICAgaiA9IDA7CisgICAgICB3aGlsZSAoaiA8IDQpCisgICAgICB7IGMgPSAqcysrOworICAgICAgICBpZiAoYyA9PSAnPScgfHwgIWMpCisgICAgICAgIHsgaSAqPSAzOworICAgICAgICAgIHN3aXRjaCAoaikKKyAgICAgICAgICB7IGNhc2UgMjoKKyAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgobSA+PiA0KSAmIDB4RkYpOworICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKChtID4+IDEwKSAmIDB4RkYpOworICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKChtID4+IDIpICYgMHhGRik7CisgICAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG4pCisJICAgICpuICs9IGk7CisgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgIH0KKyAgICAgICAgYyAtPSAnKyc7CisgICAgICAgIGlmIChjID49IDAgJiYgYyA8PSA3OSkKKyAgICAgICAgeyBtID0gKG0gPDwgNikgKyBzb2FwX2Jhc2U2NGlbY107CisgICAgICAgICAgaisrOworICAgICAgICB9CisgICAgICB9CisgICAgICAqdCsrID0gKGNoYXIpKChtID4+IDE2KSAmIDB4RkYpOworICAgICAgKnQrKyA9IChjaGFyKSgobSA+PiA4KSAmIDB4RkYpOworICAgICAgKnQrKyA9IChjaGFyKShtICYgMHhGRik7CisgICAgICBpZiAobCA8IDMpCisgICAgICB7IGlmIChuKQorCSAgKm4gKz0gaTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgICB9CisgICAgICBsIC09IDM7CisgICAgfQorICAgIGlmIChuKQorICAgICAgKm4gKz0gMyAqIFNPQVBfQkxLTEVOOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjaGFyKgorU09BUF9GTUFDMgorc29hcF9zMmhleChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgdW5zaWduZWQgY2hhciAqcywgY2hhciAqdCwgaW50IG4pCit7IHJlZ2lzdGVyIGNoYXIgKnA7CisgIGlmICghdCkKKyAgICB0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIDIgKiBuICsgMSk7CisgIGlmICghdCkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHJldHVybiBOVUxMOworICB9CisgIHAgPSB0OworICB0WzBdID0gJ1wwJzsKKyAgaWYgKHMpCisgIHsgZm9yICg7IG4gPiAwOyBuLS0pCisgICAgeyByZWdpc3RlciBpbnQgbSA9ICpzKys7CisgICAgICAqdCsrID0gKGNoYXIpKChtID4+IDQpICsgKG0gPiAxNTkgPyAnYScgLSAxMCA6ICcwJykpOworICAgICAgbSAmPSAweDBGOworICAgICAgKnQrKyA9IChjaGFyKShtICsgKG0gPiA5ID8gJ2EnIC0gMTAgOiAnMCcpKTsKKyAgICB9CisgIH0KKyAgKnQrKyA9ICdcMCc7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfaGV4MnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGNoYXIgKnQsIHNpemVfdCBsLCBpbnQgKm4pCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnA7CisgIGlmICghcyB8fCAhKnMpCisgIHsgaWYgKG4pCisgICAgICAqbiA9IDA7CisgICAgaWYgKHNvYXAtPmVycm9yKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFNPQVBfTk9OX05VTEw7CisgIH0KKyAgaWYgKCF0KQorICB7IGwgPSBzdHJsZW4ocykgLyAyOworICAgIHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgbCk7CisgIH0KKyAgaWYgKCF0KQorICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcCA9IHQ7CisgIHdoaWxlIChsKQorICB7IHJlZ2lzdGVyIGludCBkMSwgZDI7CisgICAgZDEgPSAqcysrOworICAgIGlmICghZDEpCisgICAgICBicmVhazsKKyAgICBkMiA9ICpzKys7CisgICAgaWYgKCFkMikKKyAgICAgIGJyZWFrOworICAgICp0KysgPSAoKGQxID49ICdBJyA/IChkMSAmIDB4NykgKyA5IDogZDEgLSAnMCcpIDw8IDQpICsgKGQyID49ICdBJyA/IChkMiAmIDB4NykgKyA5IDogZDIgLSAnMCcpOworICAgIGwtLTsKKyAgfQorICBpZiAobikKKyAgICAqbiA9IHQgLSBwOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRodHRwaGRyKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3RhdHVzLCBzaXplX3QgY291bnQpCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnMgPSBOVUxMOworICByZWdpc3RlciBpbnQgZXJyID0gU09BUF9PSzsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqciA9IE5VTEw7CisjZW5kaWYKKyAgaWYgKHN0YXR1cyA9PSBTT0FQX0ZJTEUgJiYgc29hcC0+aHR0cF9jb250ZW50KQorICAgIHMgPSBzb2FwLT5odHRwX2NvbnRlbnQ7CisgIGVsc2UgaWYgKHN0YXR1cyA9PSBTT0FQX0hUTUwpCisgICAgcyA9ICJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiOworICBlbHNlIGlmIChjb3VudCB8fCAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKSkKKyAgeyBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICAgICAgcyA9ICJhcHBsaWNhdGlvbi9zb2FwK3htbDsgY2hhcnNldD11dGYtOCI7CisgICAgZWxzZQorICAgICAgcyA9ICJ0ZXh0L3htbDsgY2hhcnNldD11dGYtOCI7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPm1vZGUgJiAoU09BUF9FTkNfRElNRSB8IFNPQVBfRU5DX01UT00pKQorICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkKKyAgICB7IHIgPSBzOworICAgICAgcyA9ICJhcHBsaWNhdGlvbi94b3AreG1sOyBjaGFyc2V0PXV0Zi04IjsKKyAgICB9CisgICAgZWxzZQorICAgICAgcyA9ICJhcHBsaWNhdGlvbi9kaW1lIjsKKyAgfQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKSAmJiBzb2FwLT5taW1lLmJvdW5kYXJ5ICYmIHNvYXAtPnN0YXR1cyAhPSBTT0FQX0dFVCkKKyAgeyByZWdpc3RlciBjb25zdCBjaGFyICp0ID0gc3RyY2hyKHMsICc7Jyk7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICJtdWx0aXBhcnQvcmVsYXRlZDsgYm91bmRhcnk9XCIlc1wiOyB0eXBlPVwiIiwgc29hcC0+bWltZS5ib3VuZGFyeSk7CisgICAgaWYgKHQpCisgICAgICBzdHJuY2F0KHNvYXAtPnRtcGJ1ZiwgcywgdCAtIHMpOworICAgIGVsc2UKKyAgICAgIHN0cmNhdChzb2FwLT50bXBidWYsIHMpOworICAgIGlmIChzb2FwLT5taW1lLnN0YXJ0KQorICAgIHsgc3RyY2F0KHNvYXAtPnRtcGJ1ZiwgIlwiOyBzdGFydD1cIiIpOworICAgICAgc3RyY2F0KHNvYXAtPnRtcGJ1Ziwgc29hcC0+bWltZS5zdGFydCk7CisgICAgfQorICAgIHN0cmNhdChzb2FwLT50bXBidWYsICJcIiIpOworICAgIGlmIChyKQorICAgIHsgc3RyY2F0KHNvYXAtPnRtcGJ1ZiwgIjsgc3RhcnQtaW5mbz1cIiIpOworICAgICAgc3RyY2F0KHNvYXAtPnRtcGJ1Ziwgcik7CisgICAgICBzdHJjYXQoc29hcC0+dG1wYnVmLCAiXCIiKTsKKyAgICB9CisgICAgcyA9IHNvYXAtPnRtcGJ1ZjsKKyAgfQorI2VuZGlmCisgIGlmIChzICYmIChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQ29udGVudC1UeXBlIiwgcykpKQorICAgIHJldHVybiBlcnI7CisjaWZkZWYgV0lUSF9aTElCCisgIGlmIChzb2FwLT5vbW9kZSAmIFNPQVBfRU5DX1pMSUIpCisgIHsKKyNpZmRlZiBXSVRIX0daSVAKKyAgICBlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQ29udGVudC1FbmNvZGluZyIsICJnemlwIik7CisjZWxzZQorICAgIGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJDb250ZW50LUVuY29kaW5nIiwgImRlZmxhdGUiKTsKKyNlbmRpZgorICAgIGlmIChlcnIpCisgICAgICByZXR1cm4gZXJyOworICB9CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgICAgZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlRyYW5zZmVyLUVuY29kaW5nIiwgImNodW5rZWQiKTsKKyAgZWxzZQorI2VuZGlmCisgIGlmIChzb2FwLT5zdGF0dXMgIT0gU09BUF9HRVQpCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICIlbHUiLCAodW5zaWduZWQgbG9uZyljb3VudCk7CisgICAgZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkNvbnRlbnQtTGVuZ3RoIiwgc29hcC0+dG1wYnVmKTsKKyAgfQorICBpZiAoZXJyKQorICAgIHJldHVybiBlcnI7CisgIHJldHVybiBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQ29ubmVjdGlvbiIsIHNvYXAtPmtlZXBfYWxpdmUgPyAia2VlcC1hbGl2ZSIgOiAiY2xvc2UiKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAoraHR0cF9nZXQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJldHVybiBTT0FQX0dFVF9NRVRIT0Q7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK2h0dHBfcG9zdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZW5kcG9pbnQsIGNvbnN0IGNoYXIgKmhvc3QsIGludCBwb3J0LCBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICphY3Rpb24sIHNpemVfdCBjb3VudCkKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKKyAgcmVnaXN0ZXIgaW50IGVycjsKKyAgaWYgKHNvYXAtPnN0YXR1cyA9PSBTT0FQX0dFVCkKKyAgICBzID0gIkdFVCI7CisgIGVsc2UKKyAgICBzID0gIlBPU1QiOworI2lmZGVmIFBBTE0KKyAgaWYgKCFlbmRwb2ludCB8fCAoc3RybmNtcChlbmRwb2ludCwgImh0dHA6IiwgNSkgJiYgc3RybmNtcChlbmRwb2ludCwgImh0dHBzOiIsIDYpICYmIHN0cm5jbXAoZW5kcG9pbnQsICJodHRwZzoiLCA2KSkgJiYgc3RybmNtcChlbmRwb2ludCwgIl9iZWFtOiIsIDYpICYmIHN0cm5jbXAoZW5kcG9pbnQsICJfbG9jYWw6IiwgNykgJiYgc3RybmNtcChlbmRwb2ludCwgIl9idG9iZXg6IiwgOCkpCisjZWxzZQorICBpZiAoIWVuZHBvaW50IHx8IChzdHJuY21wKGVuZHBvaW50LCAiaHR0cDoiLCA1KSAmJiBzdHJuY21wKGVuZHBvaW50LCAiaHR0cHM6IiwgNikgJiYgc3RybmNtcChlbmRwb2ludCwgImh0dHBnOiIsIDYpKSkKKyNlbmRpZgorICAgIHJldHVybiBTT0FQX09LOworICBpZiAoc29hcC0+cHJveHlfaG9zdCAmJiBzdHJuY21wKGVuZHBvaW50LCAiaHR0cHM6IiwgNikpCisgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICIlcyAlcyBIVFRQLyVzIiwgcywgZW5kcG9pbnQsIHNvYXAtPmh0dHBfdmVyc2lvbik7CisgIGVsc2UKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIiVzIC8lcyBIVFRQLyVzIiwgcywgKCpwYXRoID09ICcvJyA/IHBhdGggKyAxIDogcGF0aCksIHNvYXAtPmh0dHBfdmVyc2lvbik7CisgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgc29hcC0+dG1wYnVmLCBOVUxMKSkpCisgICAgcmV0dXJuIGVycjsKKyAgaWYgKHBvcnQgIT0gODApCisgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICIlczolZCIsIGhvc3QsIHBvcnQpOworICBlbHNlCisgICAgc3RyY3B5KHNvYXAtPnRtcGJ1ZiwgaG9zdCk7IAorICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJIb3N0Iiwgc29hcC0+dG1wYnVmKSkKKyAgIHx8IChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiVXNlci1BZ2VudCIsICJnU09BUC8yLjciKSkKKyAgIHx8IChlcnIgPSBzb2FwX3B1dGh0dHBoZHIoc29hcCwgU09BUF9PSywgY291bnQpKSkKKyAgICByZXR1cm4gZXJyOworI2lmZGVmIFdJVEhfWkxJQgorI2lmZGVmIFdJVEhfR1pJUAorICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJBY2NlcHQtRW5jb2RpbmciLCAiZ3ppcCwgZGVmbGF0ZSIpKSkKKyNlbHNlCisgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkFjY2VwdC1FbmNvZGluZyIsICJkZWZsYXRlIikpKQorI2VuZGlmCisgICAgcmV0dXJuIGVycjsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPnVzZXJpZCAmJiBzb2FwLT5wYXNzd2QgJiYgc3RybGVuKHNvYXAtPnVzZXJpZCkgKyBzdHJsZW4oc29hcC0+cGFzc3dkKSA8IDc2MSkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIDI2MiwgIiVzOiVzIiwgc29hcC0+dXNlcmlkLCBzb2FwLT5wYXNzd2QpOworICAgIHN0cmNweShzb2FwLT50bXBidWYsICJCYXNpYyAiKTsKKyAgICBzb2FwX3MyYmFzZTY0KHNvYXAsIChjb25zdCB1bnNpZ25lZCBjaGFyKikoc29hcC0+dG1wYnVmICsgMjYyKSwgc29hcC0+dG1wYnVmICsgNiwgc3RybGVuKHNvYXAtPnRtcGJ1ZiArIDI2MikpOworICAgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkF1dGhvcml6YXRpb24iLCBzb2FwLT50bXBidWYpKSkKKyAgICAgIHJldHVybiBlcnI7CisgIH0KKyAgaWYgKHNvYXAtPnByb3h5X3VzZXJpZCAmJiBzb2FwLT5wcm94eV9wYXNzd2QgJiYgc3RybGVuKHNvYXAtPnByb3h5X3VzZXJpZCkgKyBzdHJsZW4oc29hcC0+cHJveHlfcGFzc3dkKSA8IDc2MSkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIDI2MiwgIiVzOiVzIiwgc29hcC0+cHJveHlfdXNlcmlkLCBzb2FwLT5wcm94eV9wYXNzd2QpOworICAgIHN0cmNweShzb2FwLT50bXBidWYsICJCYXNpYyAiKTsKKyAgICBzb2FwX3MyYmFzZTY0KHNvYXAsIChjb25zdCB1bnNpZ25lZCBjaGFyKikoc29hcC0+dG1wYnVmICsgMjYyKSwgc29hcC0+dG1wYnVmICsgNiwgc3RybGVuKHNvYXAtPnRtcGJ1ZiArIDI2MikpOworICAgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlByb3h5LUF1dGhvcml6YXRpb24iLCBzb2FwLT50bXBidWYpKSkKKyAgICAgIHJldHVybiBlcnI7CisgIH0KKyNlbmRpZgorI2lmZGVmIFdJVEhfQ09PS0lFUworI2lmZGVmIFdJVEhfT1BFTlNTTAorICBpZiAoc29hcF9wdXRjb29raWVzKHNvYXAsIGhvc3QsIHBhdGgsIHNvYXAtPnNzbCAhPSBOVUxMKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjZWxzZQorICBpZiAoc29hcF9wdXRjb29raWVzKHNvYXAsIGhvc3QsIHBhdGgsIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNlbmRpZgorI2VuZGlmCisgIGlmIChhY3Rpb24gJiYgc29hcC0+dmVyc2lvbiA9PSAxKQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiXCIlc1wiIiwgYWN0aW9uKTsKKyAgICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJTT0FQQWN0aW9uIiwgc29hcC0+dG1wYnVmKSkpCisgICAgICByZXR1cm4gZXJyOworICB9CisgIHJldHVybiBzb2FwLT5mcG9zdGhkcihzb2FwLCBOVUxMLCBOVUxMKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAoraHR0cF9zZW5kX2hlYWRlcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcykKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqdDsKKyAgZG8KKyAgeyB0ID0gc3RyY2hyKHMsICdcbicpOyAvKiBkaXNhbGxvdyBcbiBpbiBIVFRQIGhlYWRlcnMgKi8KKyAgICBpZiAoIXQpCisgICAgICB0ID0gcyArIHN0cmxlbihzKTsKKyAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcykpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgcyA9IHQgKyAxOworICB9IHdoaWxlICgqdCk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50CitodHRwX3Bvc3RfaGVhZGVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbCkKK3sgaWYgKGtleSkKKyAgeyBpZiAoaHR0cF9zZW5kX2hlYWRlcihzb2FwLCBrZXkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmICh2YWwgJiYgKHNvYXBfc2VuZF9yYXcoc29hcCwgIjogIiwgMikgfHwgaHR0cF9zZW5kX2hlYWRlcihzb2FwLCB2YWwpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCAiXHJcbiIsIDIpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50CitodHRwX3Jlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3RhdHVzLCBzaXplX3QgY291bnQpCit7IHJlZ2lzdGVyIGludCBlcnI7CisjaWZkZWYgV01XX1JQTV9JTworICBpZiAoc29hcC0+cnBtcmVxaWQpCisgICAgaHR0cE91dHB1dEVuYWJsZShzb2FwLT5ycG1yZXFpZCk7CisjZW5kaWYKKyAgaWYgKCFzdGF0dXMgfHwgc3RhdHVzID09IFNPQVBfSFRNTCB8fCBzdGF0dXMgPT0gU09BUF9GSUxFKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiT0sgMjAwXG4iKSk7CisjaWZkZWYgV01XX1JQTV9JTworICAgIGlmIChzb2FwLT5ycG1yZXFpZCB8fCBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpIHx8IHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpIC8qIFJQTSBiZWhhdmVzIGFzIGlmIHN0YW5kYWxvbmUgKi8KKyNlbHNlCisgICAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikgfHwgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkgLyogc3RhbmRhbG9uZSBhcHBsaWNhdGlvbiAqLworI2VuZGlmCisgICAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIkhUVFAvJXMgMjAwIE9LIiwgc29hcC0+aHR0cF92ZXJzaW9uKTsKKyAgICAgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgc29hcC0+dG1wYnVmLCBOVUxMKSkpCisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGVsc2UgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiU3RhdHVzIiwgIjIwMCBPSyIpKSkKKyAgICAgIHJldHVybiBlcnI7CisgIH0KKyAgZWxzZSBpZiAoc3RhdHVzID4gMjAwICYmIHN0YXR1cyA8IDYwMCkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIkhUVFAvJXMgJWQgJXMiLCBzb2FwLT5odHRwX3ZlcnNpb24sIHN0YXR1cywgaHR0cF9lcnJvcihzb2FwLCBzdGF0dXMpKTsKKyAgICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgTlVMTCkpKQorICAgICAgcmV0dXJuIGVycjsKKyNpZm5kZWYgV0lUSF9MRUFOIAorICAgIGlmIChzdGF0dXMgPT0gNDAxKQorICAgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJCYXNpYyByZWFsbT1cIiVzXCIiLCBzb2FwLT5hdXRocmVhbG0gPyBzb2FwLT5hdXRocmVhbG0gOiAiZ1NPQVAgV2ViIFNlcnZpY2UiKTsKKyAgICAgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIldXVy1BdXRoZW50aWNhdGUiLCBzb2FwLT50bXBidWYpKSkKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgZWxzZSBpZiAoKHN0YXR1cyA+PSAzMDEgJiYgc3RhdHVzIDw9IDMwMykgfHwgc3RhdHVzID09IDMwNykKKyAgICB7IGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkxvY2F0aW9uIiwgc29hcC0+ZW5kcG9pbnQpKSkKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisjZW5kaWYKKyAgfQorICBlbHNlCisgIHsgY29uc3QgY2hhciAqcyA9ICpzb2FwX2ZhdWx0Y29kZShzb2FwKTsKKyAgICBpZiAoc29hcC0+dmVyc2lvbiA9PSAyICYmICFzdHJjbXAocywgIlNPQVAtRU5WOlNlbmRlciIpKQorICAgICAgcyA9ICI0MDAgQmFkIFJlcXVlc3QiOworICAgIGVsc2UKKyAgICAgIHMgPSAiNTAwIEludGVybmFsIFNlcnZlciBFcnJvciI7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFcnJvciAlcyAoc3RhdHVzPSVkKVxuIiwgcywgc3RhdHVzKSk7CisjaWZkZWYgV01XX1JQTV9JTworICAgIGlmIChzb2FwLT5ycG1yZXFpZCB8fCBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpIHx8IHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpIC8qIFJQTSBiZWhhdmVzIGFzIGlmIHN0YW5kYWxvbmUgKi8KKyNlbHNlCisgICAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikgfHwgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkgLyogc3RhbmRhbG9uZSBhcHBsaWNhdGlvbiAqLworI2VuZGlmCisgICAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIkhUVFAvJXMgJXMiLCBzb2FwLT5odHRwX3ZlcnNpb24sIHMpOworICAgICAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCBzb2FwLT50bXBidWYsIE5VTEwpKSkKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgZWxzZSBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJTdGF0dXMiLCBzKSkpCisgICAgICByZXR1cm4gZXJyOworICB9CisgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlNlcnZlciIsICJnU09BUC8yLjciKSkKKyAgIHx8IChlcnIgPSBzb2FwX3B1dGh0dHBoZHIoc29hcCwgc3RhdHVzLCBjb3VudCkpKQorICAgIHJldHVybiBlcnI7CisjaWZkZWYgV0lUSF9DT09LSUVTCisgIGlmIChzb2FwX3B1dHNldGNvb2tpZXMoc29hcCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2VuZGlmCisgIHJldHVybiBzb2FwLT5mcG9zdGhkcihzb2FwLCBOVUxMLCBOVUxMKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3Jlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3RhdHVzKQoreyByZWdpc3RlciBzaXplX3QgY291bnQ7CisgIGlmICghKHNvYXAtPm9tb2RlICYgKFNPQVBfRU5DX1hNTCB8IFNPQVBfSU9fU1RPUkUgLyogdGhpcyB0ZXN0cyBmb3IgY2h1bmtpbmcgdG9vICovKSkKKyAgICYmIChzdGF0dXMgPT0gU09BUF9IVE1MIHx8IHN0YXR1cyA9PSBTT0FQX0ZJTEUpKQorICB7IHNvYXAtPm9tb2RlICY9IH5TT0FQX0lPOworICAgIHNvYXAtPm9tb2RlIHw9IFNPQVBfSU9fU1RPUkU7CisgIH0KKyAgc29hcC0+c3RhdHVzID0gc3RhdHVzOworICBjb3VudCA9IHNvYXBfY291bnRfYXR0YWNobWVudHMoc29hcCk7CisgIGlmIChzb2FwX2JlZ2luX3NlbmQoc29hcCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmbmRlZiBXSVRIX05PSFRUUAorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSAhPSBTT0FQX0lPX1NUT1JFICYmICEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1hNTCkpCisgIHsgcmVnaXN0ZXIgaW50IG4gPSBzb2FwLT5tb2RlOworICAgIHNvYXAtPm1vZGUgJj0gfihTT0FQX0lPIHwgU09BUF9FTkNfWkxJQik7CisgICAgaWYgKChuICYgU09BUF9JTykgIT0gU09BUF9JT19GTFVTSCkKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19CVUZGRVI7CisgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZyZXNwb25zZShzb2FwLCBzdGF0dXMsIGNvdW50KSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgICAgaWYgKChuICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgICB7IGlmIChzb2FwX2ZsdXNoKHNvYXApKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorI2VuZGlmCisgICAgc29hcC0+bW9kZSA9IG47CisgIH0KKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBjb25zdCBjaGFyKgorc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqdCkKK3sgaWYgKCpzb2FwLT50YWcpCisgICAgc3ByaW50Zihzb2FwLT5tc2didWYsICJWYWxpZGF0aW9uIGNvbnN0cmFpbnQgdmlvbGF0aW9uOiAlcyVzIGluIGVsZW1lbnQgPCVzPiIsIHMsIHQ/dDpTT0FQX1NUUl9FT1MsIHNvYXAtPnRhZyk7CisgIGVsc2UKKyAgICBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIlZhbGlkYXRpb24gY29uc3RyYWludCB2aW9sYXRpb246ICVzJXMiLCBzLCB0P3Q6U09BUF9TVFJfRU9TKTsKKyAgcmV0dXJuIHNvYXAtPm1zZ2J1ZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBjb25zdCBjaGFyICoqYyA9IHNvYXBfZmF1bHRjb2RlKHNvYXApOworICBjb25zdCBjaGFyICoqcyA9IHNvYXBfZmF1bHRzdHJpbmcoc29hcCk7CisgIGlmICghKmMgJiYgISpzICYmIHNvYXAtPmZzZXRlcnJvcikKKyAgICBzb2FwLT5mc2V0ZXJyb3Ioc29hcCwgYywgcyk7CisgIGlmICghKmMpCisgIHsgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgICAgICpjID0gIlNPQVAtRU5WOlNlbmRlciI7CisgICAgZWxzZQorICAgICAgKmMgPSAiU09BUC1FTlY6Q2xpZW50IjsKKyAgfQorICBpZiAoKnMpCisgICAgcmV0dXJuOworICBzd2l0Y2ggKHNvYXAtPmVycm9yKQorICB7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGNhc2UgU09BUF9DTElfRkFVTFQ6CisgICAgICAqcyA9ICJDbGllbnQgZmF1bHQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1NWUl9GQVVMVDoKKyAgICAgICpzID0gIlNlcnZlciBmYXVsdCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfVEFHX01JU01BVENIOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJ0YWcgbmFtZSBvciBuYW1lc3BhY2UgbWlzbWF0Y2giLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9UWVBFOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJkYXRhIHR5cGUgbWlzbWF0Y2ggIiwgc29hcC0+dHlwZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfU1lOVEFYX0VSUk9SOgorICAgICAgKnMgPSAiV2VsbC1mb3JtZWRuZXNzIHZpb2xhdGlvbiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTk9fVEFHOgorICAgICAgKnMgPSAiTm8gWE1MIGVsZW1lbnQgdGFnIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9NVVNUVU5ERVJTVEFORDoKKyAgICAgICpjID0gIlNPQVAtRU5WOk11c3RVbmRlcnN0YW5kIjsKKyAgICAgIHNwcmludGYoc29hcC0+bXNnYnVmLCAiVGhlIGRhdGEgaW4gZWxlbWVudCAnJXMnIG11c3QgYmUgdW5kZXJzdG9vZCBidXQgY2Fubm90IGJlIGhhbmRsZWQiLCBzb2FwLT50YWcpOworICAgICAgKnMgPSBzb2FwLT5tc2didWY7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfVkVSU0lPTk1JU01BVENIOgorICAgICAgKmMgPSAiU09BUC1FTlY6VmVyc2lvbk1pc21hdGNoIjsKKyAgICAgICpzID0gIlNPQVAgdmVyc2lvbiBtaXNtYXRjaCBvciBpbnZhbGlkIFNPQVAgbWVzc2FnZSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfREFUQUVOQ09ESU5HVU5LTk9XTjoKKyAgICAgICpjID0gIlNPQVAtRU5WOkRhdGFFbmNvZGluZ1Vua25vd24iOworICAgICAgKnMgPSAiVW5zdXBwb3J0ZWQgU09BUCBkYXRhIGVuY29kaW5nIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9OQU1FU1BBQ0U6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgIm5hbWVzcGFjZSBtaXNtYXRjaCIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1VTRVJfRVJST1I6CisgICAgICAqcyA9ICJVc2VyIGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9GQVRBTF9FUlJPUjoKKyAgICAgICpzID0gIkZhdGFsIGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9OT19NRVRIT0Q6CisgICAgICBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIk1ldGhvZCAnJXMnIG5vdCBpbXBsZW1lbnRlZDogbWV0aG9kIG5hbWUgb3IgbmFtZXNwYWNlIG5vdCByZWNvZ25pemVkIiwgc29hcC0+dGFnKTsKKyAgICAgICpzID0gc29hcC0+bXNnYnVmOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0dFVF9NRVRIT0Q6CisgICAgICAqcyA9ICJIVFRQIEdFVCBtZXRob2Qgbm90IGltcGxlbWVudGVkIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9FT006CisgICAgICAqcyA9ICJPdXQgb2YgbWVtb3J5IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9JT0I6CisgICAgICAqcyA9ICJBcnJheSBpbmRleCBvdXQgb2YgYm91bmRzIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9OVUxMOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJuaWwgbm90IGFsbG93ZWQiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9EVVBMSUNBVEVfSUQ6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgIm11bHRpcGxlIGRlZmluaXRpb25zIG9mIGlkICIsIHNvYXAtPmlkKTsKKyAgICAgIGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgICAgICAgICpzb2FwX2ZhdWx0c3ViY29kZShzb2FwKSA9ICJTT0FQLUVOQzpEdXBsaWNhdGVJRCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTUlTU0lOR19JRDoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAibWlzc2luZyBpZCBmb3IgcmVmICIsIHNvYXAtPmlkKTsKKyAgICAgIGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgICAgICAgICpzb2FwX2ZhdWx0c3ViY29kZShzb2FwKSA9ICJTT0FQLUVOQzpNaXNzaW5nSUQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0hSRUY6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgImluY29tcGF0aWJsZSBvYmplY3QgcmVmICIsIHNvYXAtPmlkKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9GQVVMVDoKKyAgICAgIGJyZWFrOworI2lmbmRlZiBXSVRIX05PSU8KKyAgICBjYXNlIFNPQVBfVURQX0VSUk9SOgorICAgICAgKnMgPSAiTWVzc2FnZSB0b28gbGFyZ2UgZm9yIFVEUCBwYWNrZXQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1RDUF9FUlJPUjoKKyAgICAgICpzID0gdGNwX2Vycm9yKHNvYXApOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIFNPQVBfSFRUUF9FUlJPUjoKKyAgICAgICpzID0gIkhUVFAgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1NTTF9FUlJPUjoKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICAgICpzID0gIlNTTCBlcnJvciI7CisjZWxzZQorICAgICAgKnMgPSAiT3BlblNTTCBub3QgaW5zdGFsbGVkOiByZWNvbXBpbGUgd2l0aCAtRFdJVEhfT1BFTlNTTCI7CisjZW5kaWYKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9QTFVHSU5fRVJST1I6CisgICAgICAqcyA9ICJQbHVnaW4gcmVnaXN0cnkgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0RJTUVfRVJST1I6CisgICAgICAqcyA9ICJESU1FIGZvcm1hdCBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfRElNRV9IUkVGOgorICAgICAgKnMgPSAiRElNRSBocmVmIHRvIG1pc3NpbmcgYXR0YWNobWVudCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfRElNRV9NSVNNQVRDSDoKKyAgICAgICpzID0gIkRJTUUgdmVyc2lvbi90cmFuc21pc3Npb24gZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0RJTUVfRU5EOgorICAgICAgKnMgPSAiRW5kIG9mIERJTUUgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX01JTUVfRVJST1I6CisgICAgICAqcyA9ICJNSU1FIGZvcm1hdCBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTUlNRV9IUkVGOgorICAgICAgKnMgPSAiTUlNRSBocmVmIHRvIG1pc3NpbmcgYXR0YWNobWVudCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTUlNRV9FTkQ6CisgICAgICAqcyA9ICJFbmQgb2YgTUlNRSBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfWkxJQl9FUlJPUjoKKyNpZmRlZiBXSVRIX1pMSUIKKyAgICAgIHNwcmludGYoc29hcC0+bXNnYnVmLCAiWmxpYi9nemlwIGVycm9yOiAnJXMnIiwgc29hcC0+ZF9zdHJlYW0ubXNnP3NvYXAtPmRfc3RyZWFtLm1zZzoiIik7CisgICAgICAqcyA9IHNvYXAtPm1zZ2J1ZjsKKyNlbHNlCisgICAgICAqcyA9ICJabGliL2d6aXAgbm90IGluc3RhbGxlZCBmb3IgKGRlKWNvbXByZXNzaW9uOiByZWNvbXBpbGUgd2l0aCAtRFdJVEhfR1pJUCI7CisjZW5kaWYKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9SRVFVSVJFRDoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAibWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGUiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9QUk9ISUJJVEVEOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJwcm9oaWJpdGVkIGF0dHJpYnV0ZSBwcmVzZW50IiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfT0NDVVJTOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJtaW4vbWF4T2NjdXJzIHZpb2xhdGlvbiIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0xFTkdUSDoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAiY29udGVudCBsZW5ndGggdmlvbGF0aW9uIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfU1RPUDoKKyAgICAgICpzID0gIlN0b3BwZWQ6IG5vIHJlc3BvbnNlIHNlbnQiOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIFNPQVBfRU9GOgorI2lmbmRlZiBXSVRIX05PSU8KKyAgICAgIHNwcmludGYoc29hcC0+bXNnYnVmLCAiRW5kIG9mIGZpbGUgb3Igbm8gaW5wdXQ6ICclcyciLCBzb2FwX3N0cmVycm9yKHNvYXApKTsKKyAgICAgICpzID0gc29hcC0+bXNnYnVmOworICAgICAgYnJlYWs7CisjZWxzZQorICAgICAgKnMgPSAiRW5kIG9mIGZpbGUgb3Igbm8gaW5wdXQiOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIGlmIChzb2FwLT5lcnJvciA+IDIwMCAmJiBzb2FwLT5lcnJvciA8IDYwMCkKKyAgICAgIHsgc3ByaW50Zihzb2FwLT5tc2didWYsICJIVFRQIEVycm9yOiAlZCAlcyIsIHNvYXAtPmVycm9yLCBodHRwX2Vycm9yKHNvYXAsIHNvYXAtPmVycm9yKSk7CisgICAgICAgICpzID0gc29hcC0+bXNnYnVmOworICAgICAgfQorICAgICAgZWxzZQorI2VuZGlmCisjZW5kaWYKKyAgICAgIHsgc3ByaW50Zihzb2FwLT5tc2didWYsICJFcnJvciAlZCIsIHNvYXAtPmVycm9yKTsKKyAgICAgICAgKnMgPSBzb2FwLT5tc2didWY7CisgICAgICB9CisgICAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmRfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBzdGF0dXMgPSBzb2FwLT5lcnJvcjsKKyAgaW50IHIgPSAxOworICBpZiAoc3RhdHVzID09IFNPQVBfU1RPUCkKKyAgICByZXR1cm4gc3RhdHVzOworICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2VuZGluZyBiYWNrIGZhdWx0IHN0cnVjdCBmb3IgZXJyb3IgY29kZSAlZFxuIiwgc29hcC0+ZXJyb3IpKTsKKyAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7IC8qIHRvIHRlcm1pbmF0ZSBjb25uZWN0aW9uICovCisgIHNvYXBfc2V0X2ZhdWx0KHNvYXApOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgZmRfc2V0IHJmZCwgc2ZkOworICAgIHRpbWVvdXQudHZfc2VjID0gMDsKKyAgICB0aW1lb3V0LnR2X3VzZWMgPSAwOworICAgIEZEX1pFUk8oJnJmZCk7CisgICAgRkRfWkVSTygmc2ZkKTsKKyAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnJmZCk7CisgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZzZmQpOworICAgIHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgJnJmZCwgJnNmZCwgTlVMTCwgJnRpbWVvdXQpOworICAgIGlmIChyID4gMCkKKyAgICB7IGlmICghRkRfSVNTRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnNmZCkKKyAgICAgICB8fCAoRkRfSVNTRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnJmZCkKKyAgICAgICAgJiYgcmVjdigoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzb2FwLT50bXBidWYsIDEsIE1TR19QRUVLKSA8IDApKQorICAgICAgICByID0gMDsKKyAgICB9CisgIH0KKyNlbmRpZgorI2VuZGlmCisgIGlmICgoc3RhdHVzICE9IFNPQVBfRU9GIHx8ICghc29hcC0+cmVjdl90aW1lb3V0ICYmICFzb2FwLT5zZW5kX3RpbWVvdXQpKSAmJiByID4gMCkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgICAgc29hcF9zZXJpYWxpemVoZWFkZXIoc29hcCk7CisgICAgc29hcF9zZXJpYWxpemVmYXVsdChzb2FwKTsKKyAgICBzb2FwX2JlZ2luX2NvdW50KHNvYXApOworICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgeyBzb2FwX2VudmVsb3BlX2JlZ2luX291dChzb2FwKTsKKyAgICAgIHNvYXBfcHV0aGVhZGVyKHNvYXApOworICAgICAgc29hcF9ib2R5X2JlZ2luX291dChzb2FwKTsKKyAgICAgIHNvYXBfcHV0ZmF1bHQoc29hcCk7CisgICAgICBzb2FwX2JvZHlfZW5kX291dChzb2FwKTsKKyAgICAgIHNvYXBfZW52ZWxvcGVfZW5kX291dChzb2FwKTsKKyAgICB9CisgICAgc29hcF9lbmRfY291bnQoc29hcCk7CisgICAgaWYgKHNvYXBfcmVzcG9uc2Uoc29hcCwgc3RhdHVzKQorICAgICB8fCBzb2FwX2VudmVsb3BlX2JlZ2luX291dChzb2FwKQorICAgICB8fCBzb2FwX3B1dGhlYWRlcihzb2FwKQorICAgICB8fCBzb2FwX2JvZHlfYmVnaW5fb3V0KHNvYXApCisgICAgIHx8IHNvYXBfcHV0ZmF1bHQoc29hcCkKKyAgICAgfHwgc29hcF9ib2R5X2VuZF9vdXQoc29hcCkKKyAgICAgfHwgc29hcF9lbnZlbG9wZV9lbmRfb3V0KHNvYXApKQorICAgICAgcmV0dXJuIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgIHNvYXBfZW5kX3NlbmQoc29hcCk7CisgIH0KKyAgc29hcC0+ZXJyb3IgPSBzdGF0dXM7CisgIHJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWN2X2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgc3RhdHVzID0gc29hcC0+ZXJyb3I7CisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWNlaXZpbmcgU09BUCBGYXVsdFxuIikpOworICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIGlmIChzb2FwX2dldGZhdWx0KHNvYXApKQorICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJFcnJvcjogc29hcF9nZXRfc29hcGZhdWx0KCkgZmFpbGVkLiBJcyB0aGlzIGEgU09BUCBtZXNzYWdlIGF0IGFsbD9cbiIpKTsKKyAgICAqc29hcF9mYXVsdGNvZGUoc29hcCkgPSAoc29hcC0+dmVyc2lvbiA9PSAyID8gIlNPQVAtRU5WOlNlbmRlciIgOiAiU09BUC1FTlY6Q2xpZW50Iik7CisgICAgc29hcC0+ZXJyb3IgPSBzdGF0dXM7CisgICAgc29hcF9zZXRfZmF1bHQoc29hcCk7CisgIH0KKyAgZWxzZQorICB7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnMgPSAqc29hcF9mYXVsdGNvZGUoc29hcCk7CisgICAgaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCBzLCAiU09BUC1FTlY6U2VydmVyIikgfHwgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHMsICJTT0FQLUVOVjpSZWNlaXZlciIpKQorICAgICAgc3RhdHVzID0gU09BUF9TVlJfRkFVTFQ7IAorICAgIGVsc2UgaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCBzLCAiU09BUC1FTlY6Q2xpZW50IikgfHwgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHMsICJTT0FQLUVOVjpTZW5kZXIiKSkKKyAgICAgIHN0YXR1cyA9IFNPQVBfQ0xJX0ZBVUxUOworICAgIGVsc2UgaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCBzLCAiU09BUC1FTlY6TXVzdFVuZGVyc3RhbmQiKSkKKyAgICAgIHN0YXR1cyA9IFNPQVBfTVVTVFVOREVSU1RBTkQ7CisgICAgZWxzZSBpZiAoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHMsICJTT0FQLUVOVjpWZXJzaW9uTWlzbWF0Y2giKSkKKyAgICAgIHN0YXR1cyA9IFNPQVBfVkVSU0lPTk1JU01BVENIOworICAgIGVsc2UKKyAgICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJGYXVsdCBjb2RlICVzXG4iLCBzKSk7CisgICAgICBzdGF0dXMgPSBTT0FQX0ZBVUxUOworICAgIH0KKyAgICBpZiAoc29hcF9ib2R5X2VuZF9pbihzb2FwKQorICAgICB8fCBzb2FwX2VudmVsb3BlX2VuZF9pbihzb2FwKQorICAgICB8fCBzb2FwX2VuZF9yZWN2KHNvYXApKQorICAgICAgcmV0dXJuIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgIHNvYXAtPmVycm9yID0gc3RhdHVzOworICB9CisgIHJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZW5kX2VtcHR5X3Jlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5jb3VudCA9IDA7CisgIGlmIChzb2FwX3Jlc3BvbnNlKHNvYXAsIFNPQVBfT0spIHx8IHNvYXBfZW5kX3NlbmQoc29hcCkpCisgICAgcmV0dXJuIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlY3ZfZW1wdHlfcmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwX2JlZ2luX3JlY3Yoc29hcCkgfHwgc29hcF9lbmRfcmVjdihzb2FwKSkKKyAgICByZXR1cm4gc29hcF9jbG9zZXNvY2soc29hcCk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNvbnN0IGNoYXIqCitzb2FwX3N0cmVycm9yKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgZXJyID0gc29hcC0+ZXJybnVtOworICBpZiAoZXJyKQorICB7CisjaWZuZGVmIFdJTjMyCisgICAgcmV0dXJuIHN0cmVycm9yKGVycik7CisjZWxzZQorICAgIEZvcm1hdE1lc3NhZ2UoRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU18Rk9STUFUX01FU1NBR0VfSUdOT1JFX0lOU0VSVFMsIE5VTEwsIGVyciwgMCwgKExQVFNUUikmc29hcC0+ZXJyb3JzdHIsIHNpemVvZihzb2FwLT5lcnJvcnN0ciksIE5VTEwpOworICAgIHJldHVybiBzb2FwLT5lcnJvcnN0cjsKKyNlbmRpZgorICB9CisgIHJldHVybiAiT3BlcmF0aW9uIGludGVycnVwdGVkIG9yIHRpbWVkIG91dCI7Cit9CisjZW5kaWYKKyNlbmRpZiAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitzdGF0aWMgaW50Citzb2FwX3NldF9lcnJvcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRjb2RlLCBjb25zdCBjaGFyICpmYXVsdHN1YmNvZGUsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCwgaW50IHNvYXBlcnJvcikKK3sgKnNvYXBfZmF1bHRjb2RlKHNvYXApID0gZmF1bHRjb2RlOworICBpZiAoZmF1bHRzdWJjb2RlKQorICAgICpzb2FwX2ZhdWx0c3ViY29kZShzb2FwKSA9IGZhdWx0c3ViY29kZTsKKyAgKnNvYXBfZmF1bHRzdHJpbmcoc29hcCkgPSBmYXVsdHN0cmluZzsKKyAgaWYgKGZhdWx0ZGV0YWlsICYmICpmYXVsdGRldGFpbCkKKyAgeyByZWdpc3RlciBjb25zdCBjaGFyICoqcyA9IHNvYXBfZmF1bHRkZXRhaWwoc29hcCk7CisgICAgaWYgKHMpCisgICAgICAqcyA9IGZhdWx0ZGV0YWlsOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvciA9IHNvYXBlcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZXRfc2VuZGVyX2Vycm9yKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdHN0cmluZywgY29uc3QgY2hhciAqZmF1bHRkZXRhaWwsIGludCBzb2FwZXJyb3IpCit7IHJldHVybiBzb2FwX3NldF9lcnJvcihzb2FwLCBzb2FwLT52ZXJzaW9uID09IDIgPyAiU09BUC1FTlY6U2VuZGVyIiA6ICJTT0FQLUVOVjpDbGllbnQiLCBOVUxMLCBmYXVsdHN0cmluZywgZmF1bHRkZXRhaWwsIHNvYXBlcnJvcik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdHN0cmluZywgY29uc3QgY2hhciAqZmF1bHRkZXRhaWwsIGludCBzb2FwZXJyb3IpCit7IHJldHVybiBzb2FwX3NldF9lcnJvcihzb2FwLCBzb2FwLT52ZXJzaW9uID09IDIgPyAiU09BUC1FTlY6UmVjZWl2ZXIiIDogIlNPQVAtRU5WOlNlcnZlciIsIE5VTEwsIGZhdWx0c3RyaW5nLCBmYXVsdGRldGFpbCwgc29hcGVycm9yKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK3N0YXRpYyBpbnQKK3NvYXBfY29weV9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRjb2RlLCBjb25zdCBjaGFyICpmYXVsdHN1YmNvZGUsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCkKK3sgY2hhciAqciA9IE5VTEwsICpzID0gTlVMTCwgKnQgPSBOVUxMOworICBpZiAoZmF1bHRzdWJjb2RlKQorICAgIHIgPSBzb2FwX3N0cmR1cChzb2FwLCBmYXVsdHN1YmNvZGUpOworICBpZiAoZmF1bHRzdHJpbmcpCisgICAgcyA9IHNvYXBfc3RyZHVwKHNvYXAsIGZhdWx0c3RyaW5nKTsKKyAgaWYgKGZhdWx0ZGV0YWlsKQorICAgIHQgPSBzb2FwX3N0cmR1cChzb2FwLCBmYXVsdGRldGFpbCk7CisgIHJldHVybiBzb2FwX3NldF9lcnJvcihzb2FwLCBmYXVsdGNvZGUsIHIsIHMsIHQsIFNPQVBfRkFVTFQpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmRlcl9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRzdHJpbmcsIGNvbnN0IGNoYXIgKmZhdWx0ZGV0YWlsKQoreyByZXR1cm4gc29hcF9zZW5kZXJfZmF1bHRfc3ViY29kZShzb2FwLCBOVUxMLCBmYXVsdHN0cmluZywgZmF1bHRkZXRhaWwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmRlcl9mYXVsdF9zdWJjb2RlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdHN1YmNvZGUsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCkKK3sgcmV0dXJuIHNvYXBfY29weV9mYXVsdChzb2FwLCBzb2FwLT52ZXJzaW9uID09IDIgPyAiU09BUC1FTlY6U2VuZGVyIiA6ICJTT0FQLUVOVjpDbGllbnQiLCBmYXVsdHN1YmNvZGUsIGZhdWx0c3RyaW5nLCBmYXVsdGRldGFpbCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVjZWl2ZXJfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCkKK3sgcmV0dXJuIHNvYXBfcmVjZWl2ZXJfZmF1bHRfc3ViY29kZShzb2FwLCBOVUxMLCBmYXVsdHN0cmluZywgZmF1bHRkZXRhaWwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlY2VpdmVyX2ZhdWx0X3N1YmNvZGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZhdWx0c3ViY29kZSwgY29uc3QgY2hhciAqZmF1bHRzdHJpbmcsIGNvbnN0IGNoYXIgKmZhdWx0ZGV0YWlsKQoreyByZXR1cm4gc29hcF9jb3B5X2ZhdWx0KHNvYXAsIHNvYXAtPnZlcnNpb24gPT0gMiA/ICJTT0FQLUVOVjpSZWNlaXZlciIgOiAiU09BUC1FTlY6U2VydmVyIiwgZmF1bHRzdWJjb2RlLCBmYXVsdHN0cmluZywgZmF1bHRkZXRhaWwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorI2lmbmRlZiBXSVRIX05PU1RETElCCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3ByaW50X2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwLCBGSUxFICpmZCkKK3sgaWYgKHNvYXBfY2hlY2tfc3RhdGUoc29hcCkpCisgICAgZnByaW50ZihmZCwgIkVycm9yOiBzb2FwIHN0cnVjdCBub3QgaW5pdGlhbGl6ZWRcbiIpOworICBlbHNlIGlmIChzb2FwLT5lcnJvcikKKyAgeyBjb25zdCBjaGFyICpjLCAqdiA9IE5VTEwsICpzLCAqKmQ7CisgICAgZCA9IHNvYXBfZmF1bHRjb2RlKHNvYXApOworICAgIGlmICghKmQpCisgICAgICBzb2FwX3NldF9mYXVsdChzb2FwKTsKKyAgICBjID0gKmQ7CisgICAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgICAgIHYgPSAqc29hcF9mYXVsdHN1YmNvZGUoc29hcCk7CisgICAgcyA9ICpzb2FwX2ZhdWx0c3RyaW5nKHNvYXApOworICAgIGQgPSBzb2FwX2ZhdWx0ZGV0YWlsKHNvYXApOworICAgIGZwcmludGYoZmQsICIlcyVkIGZhdWx0OiAlcyBbJXNdXG5cIiVzXCJcbkRldGFpbDogJXNcbiIsIHNvYXAtPnZlcnNpb24gPyAiU09BUCAxLiIgOiAiRXJyb3IgIiwgc29hcC0+dmVyc2lvbiA/IChpbnQpc29hcC0+dmVyc2lvbiA6IHNvYXAtPmVycm9yLCBjLCB2ID8gdiA6ICJubyBzdWJjb2RlIiwgcyA/IHMgOiAiW25vIHJlYXNvbl0iLCBkICYmICpkID8gKmQgOiAiW25vIGRldGFpbF0iKTsKKyAgfQorfQorI2VuZGlmCisjZW5kaWYKKyAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorI2lmbmRlZiBXSVRIX05PU1RETElCCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3ByaW50X2ZhdWx0X2xvY2F0aW9uKHN0cnVjdCBzb2FwICpzb2FwLCBGSUxFICpmZCkKK3sgCisjaWZuZGVmIFdJVEhfTEVBTgorICBpbnQgaSwgaiwgYzEsIGMyOworICBpZiAoc29hcC0+ZXJyb3IgJiYgc29hcC0+YnVmbGVuID4gMCkKKyAgeyBpID0gKGludClzb2FwLT5idWZpZHggLSAxOworICAgIGlmIChpIDw9IDApCisgICAgICBpID0gMDsKKyAgICBjMSA9IHNvYXAtPmJ1ZltpXTsKKyAgICBzb2FwLT5idWZbaV0gPSAnXDAnOworICAgIGlmICgoaW50KXNvYXAtPmJ1ZmxlbiA+PSBpICsgMTAyNCkKKyAgICAgIGogPSBpICsgMTAyMzsKKyAgICBlbHNlCisgICAgICBqID0gKGludClzb2FwLT5idWZsZW4gLSAxOworICAgIGMyID0gc29hcC0+YnVmW2pdOworICAgIHNvYXAtPmJ1ZltqXSA9ICdcMCc7CisgICAgZnByaW50ZihmZCwgIiVzJWNcbioqIEhFUkUgKipcbiIsIHNvYXAtPmJ1ZiwgYzEpOworICAgIGlmIChzb2FwLT5idWZpZHggPCBzb2FwLT5idWZsZW4pCisgICAgICBmcHJpbnRmKGZkLCAiJXNcbiIsIHNvYXAtPmJ1ZiArIHNvYXAtPmJ1ZmlkeCk7CisgICAgc29hcC0+YnVmW2ldID0gYzE7CisgICAgc29hcC0+YnVmW2pdID0gYzI7CisgIH0KKyNlbmRpZgorfQorI2VuZGlmCisjZW5kaWYKKyAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlZ2lzdGVyX3BsdWdpbl9hcmcoc3RydWN0IHNvYXAgKnNvYXAsIGludCAoKmZjcmVhdGUpKHN0cnVjdCBzb2FwKiwgc3RydWN0IHNvYXBfcGx1Z2luKiwgdm9pZCopLCB2b2lkICphcmcpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BsdWdpbiAqcDsKKyAgcmVnaXN0ZXIgaW50IHI7CisgIGlmICghKHAgPSAoc3RydWN0IHNvYXBfcGx1Z2luKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfcGx1Z2luKSkpKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICBwLT5pZCA9IE5VTEw7CisgIHAtPmRhdGEgPSBOVUxMOworICBwLT5mY29weSA9IE5VTEw7CisgIHAtPmZkZWxldGUgPSBOVUxMOworICByID0gZmNyZWF0ZShzb2FwLCBwLCBhcmcpOworICBpZiAoIXIgJiYgcC0+ZmRlbGV0ZSkKKyAgeyBwLT5uZXh0ID0gc29hcC0+cGx1Z2luczsKKyAgICBzb2FwLT5wbHVnaW5zID0gcDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlZ2lzdGVyZWQgJyVzJyBwbHVnaW5cbiIsIHAtPmlkKSk7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgcmVnaXN0ZXIgcGx1Z2luICclcyc6IHBsdWdpbiByZXR1cm5lZCBlcnJvciAlZCAob3IgZmRlbGV0ZSBjYWxsYmFjayBub3Qgc2V0KVxuIiwgcC0+aWQ/cC0+aWQ6Ij8iLCByKSk7CisgIFNPQVBfRlJFRShzb2FwLCBwKTsKKyAgcmV0dXJuIHI7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZCAqCitmcGx1Z2luKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGx1Z2luICpwOworICBmb3IgKHAgPSBzb2FwLT5wbHVnaW5zOyBwOyBwID0gcC0+bmV4dCkKKyAgICBpZiAocC0+aWQgPT0gaWQgfHwgIXN0cmNtcChwLT5pZCwgaWQpKQorICAgICAgcmV0dXJuIHAtPmRhdGE7CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZCAqCitTT0FQX0ZNQUMyCitzb2FwX2xvb2t1cF9wbHVnaW4oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkKQoreyByZXR1cm4gc29hcC0+ZnBsdWdpbihzb2FwLCBpZCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworI2lmbmRlZiBXSVRIX0xFQU4KK3NvYXA6OnNvYXAoKQoreyBzb2FwX2luaXQodGhpcyk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqCUMrKyBzb2FwIHN0cnVjdCBtZXRob2RzCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworI2lmbmRlZiBXSVRIX0xFQU4KK3NvYXA6OnNvYXAoc29hcF9tb2RlIG1vZGUpCit7IHNvYXBfaW5pdDEodGhpcywgbW9kZSk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIF9fY3BsdXNwbHVzCisjaWZuZGVmIFdJVEhfTEVBTgorc29hcDo6c29hcChzb2FwX21vZGUgaW1vZGUsIHNvYXBfbW9kZSBvbW9kZSkKK3sgc29hcF9pbml0Mih0aGlzLCBpbW9kZSwgb21vZGUpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworI2lmbmRlZiBXSVRIX0xFQU4KK3NvYXA6OnNvYXAoc3RydWN0IHNvYXAmIHNvYXApCit7IHNvYXBfY29weV9jb250ZXh0KHRoaXMsICZzb2FwKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpZm5kZWYgV0lUSF9MRUFOCitzb2FwOjp+c29hcCgpCit7IHNvYXBfZGVzdHJveSh0aGlzKTsKKyAgc29hcF9lbmQodGhpcyk7CisgIHNvYXBfZG9uZSh0aGlzKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9nc29hcC1wYWxtL3N0ZHNvYXAyLmNwcCBiL2dzb2FwLXBhbG0vc3Rkc29hcDIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZWQ0NjAKLS0tIC9kZXYvbnVsbAorKysgYi9nc29hcC1wYWxtL3N0ZHNvYXAyLmNwcApAQCAtMCwwICsxLDEzNDQ4IEBACisvKgorCitzdGRzb2FwMi5jW3BwXSAyLjcuNmUKKworZ1NPQVAgcnVudGltZQorCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHBhcnQgb2YgdGhlIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2VzOgorR1BMLCB0aGUgZ1NPQVAgcHVibGljIGxpY2Vuc2UsIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDb250cmlidXRvcnM6CisKK1dpbmQgUml2ZXIgU3lzdGVtcyBJbmMuLCBmb3IgdGhlIGZvbGxvd2luZyBhZGRpdGlvbnMgdW5kZXIgZ1NPQVAgcHVibGljIGxpY2Vuc2U6CisgIC0gdnhXb3JrcyBjb21wYXRpYmxlCSgjZGVmaW5lIFZYV09SS1MpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgcHVibGljIGxpY2Vuc2UuCisKK1RoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGdTT0FQIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4zCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKK0xpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoraHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL3NvYXBsaWNlbnNlLmh0bWwKK1NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCitXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKK2ZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK1RoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4uCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJbnN0YWxsYXRpb24gbm90ZToKKworV2luMzIgYnVpbGQgbmVlZHMgd2luc29jay5kbGwgKFZpc3VhbCBDKysgIndzb2NrMzIubGliIikKK1RvIGRvIHRoaXMgaW4gVmlzdWFsIEMrKyA2LjAsIGdvIHRvICJQcm9qZWN0IiwgInNldHRpbmdzIiwgc2VsZWN0IHRoZSAiTGluayIKK3RhYiAodGhlIHByb2plY3QgZmlsZSBuZWVkcyB0byBiZSBzZWxlY3RlZCBpbiB0aGUgZmlsZSB2aWV3KSBhbmQgYWRkCisid3NvY2szMi5saWIiIHRvIHRoZSAiT2JqZWN0L2xpYnJhcnkgbW9kdWxlcyIgZW50cnkKKworT24gTWFjIE9TIFggd2l0aCBnY2MgKEdDQykgMy4xIDIwMDIwNDIwIChwcmVyZWxlYXNlKSB5b3UgTVVTVCBjb21waWxlIHdpdGgKKy1mc3RhY2tfY2hlY2sgd2hlbiB1c2luZyAtTzIgYmVjYXVzZSBnY2MgMy4xIGhhcyBhIGJ1ZyB0aGF0IHNtYXNoZXMgdGhlIHN0YWNrCit3aGVuIGxvY2FsbHkgYWxsb2NhdGVkIGRhdGEgZXhjZWVkcyA2NEsuCisKKyovCisKKyNpZmRlZiBBUzQwMAorIyBwcmFnbWEgY29udmVydCg4MTkpCS8qIEVCQ0RJQyB0byBBU0NJSSAqLworI2VuZGlmCisKKyNpbmNsdWRlICJzdGRzb2FwMi5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK1NPQVBfU09VUkNFX1NUQU1QKCJAKCMpIHN0ZHNvYXAyLmNwcCB2ZXIgMi43LjZlIDIwMDYtMDItMTggMTI6MDA6MDAgR01UIikKK2V4dGVybiAiQyIgeworI2Vsc2UKK1NPQVBfU09VUkNFX1NUQU1QKCJAKCMpIHN0ZHNvYXAyLmMgdmVyIDIuNy42ZSAyMDA2LTAyLTE4IDEyOjAwOjAwIEdNVCIpCisjZW5kaWYKKworLyogOGJpdCBjaGFyYWN0ZXIgcmVwcmVzZW50aW5nIHVua25vd24vbm9ucmVwcmVzZW50YWJsZSBjaGFyYWN0ZXIgZGF0YSAoZS5nLiBub3Qgc3VwcG9ydGVkIGJ5IGN1cnJlbnQgbG9jYWxlIHdpdGggbXVsdGlieXRlIHN1cHBvcnQgZW5hYmxlZCkgKi8KKyNpZm5kZWYgU09BUF9VTktOT1dOX0NIQVIKKyNkZWZpbmUgU09BUF9VTktOT1dOX0NIQVIgKDEyNykKKyNlbmRpZgorCisvKiAgICAgIEVPRj0tMSAqLworI2RlZmluZSBTT0FQX0xUIChzb2FwX3djaGFyKSgtMikgLyogWE1MIGNoYXJhY3RlciAnPCcgKi8KKyNkZWZpbmUgU09BUF9UVCAoc29hcF93Y2hhcikoLTMpIC8qIFhNTCBjaGFyYWN0ZXIgJzwvJyAqLworI2RlZmluZSBTT0FQX0dUIChzb2FwX3djaGFyKSgtNCkgLyogWE1MIGNoYXJhY3RlciAnPicgKi8KKyNkZWZpbmUgU09BUF9RVCAoc29hcF93Y2hhcikoLTUpIC8qIFhNTCBjaGFyYWN0ZXIgJyInICovCisjZGVmaW5lIFNPQVBfQVAgKHNvYXBfd2NoYXIpKC02KSAvKiBYTUwgY2hhcmFjdGVyICcnJyAqLworCisjZGVmaW5lIHNvYXBfYmxhbmsoYykJCSgoYykgPj0gMCAmJiAoYykgPD0gMzIpCisjZGVmaW5lIHNvYXBfbm90YmxhbmsoYykJKChjKSA+IDMyKQorI2RlZmluZSBzb2FwX2hhc2hfcHRyKHApCSgoKHVuc2lnbmVkIGxvbmcpKHApID4+IDMpICYgKFNPQVBfUFRSSEFTSCAtIDEpKQorCisjaWZkZWYgU09BUF9ERUJVRworc3RhdGljIHZvaWQgc29hcF9pbml0X2xvZ3Moc3RydWN0IHNvYXAqKTsKK3N0YXRpYyB2b2lkIHNvYXBfY2xvc2VfbG9nZmlsZShzdHJ1Y3Qgc29hcCosIGludCk7CitzdGF0aWMgdm9pZCBzb2FwX3NldF9sb2dmaWxlKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKik7CitzdGF0aWMgdm9pZCBzb2FwX2ZyZWVfbWh0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgdm9pZCBzb2FwX3RyYWNrX3VubGluayhzdHJ1Y3Qgc29hcCosIGNvbnN0IHZvaWQqKTsKKyNlbmRpZgorCisjaWZuZGVmIFBBTE1fMgorc3RhdGljIGludCBzb2FwX3NldF9lcnJvcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBpbnQpOworc3RhdGljIGludCBzb2FwX2NvcHlfZmF1bHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitzdGF0aWMgaW50IHNvYXBfZ2V0YXR0cnZhbChzdHJ1Y3Qgc29hcCosIGNoYXIqLCBzaXplX3QsIHNvYXBfd2NoYXIpOworI2VuZGlmCisKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc29hcF93Y2hhciBzb2FwX2NoYXIoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBzb2FwX3djaGFyIHNvYXBfZ2V0X3BpKHN0cnVjdCBzb2FwKik7CitzdGF0aWMgaW50IHNvYXBfaXN4ZGlnaXQoaW50KTsKK3N0YXRpYyB2b2lkICpmcGx1Z2luKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworI2lmbmRlZiBXSVRIX05PSURSRUYKK3N0YXRpYyB2b2lkIHNvYXBfdXBkYXRlX3B0cnMoc3RydWN0IHNvYXAqLCBjaGFyKiwgY2hhciosIGNoYXIqLCBjaGFyKik7CitzdGF0aWMgaW50IHNvYXBfaGFzX2NvcGllcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitzdGF0aWMgdm9pZCBzb2FwX2luaXRfaWh0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgdm9pZCBzb2FwX2ZyZWVfaWh0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgdm9pZCBzb2FwX2luaXRfcGh0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgdm9pZCBzb2FwX2ZyZWVfcGh0KHN0cnVjdCBzb2FwKik7CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIGNvbnN0IGNoYXIgKnNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworc3RhdGljIGludCBzb2FwX2lzbnVtZXJpYyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyB0aW1lX3Qgc29hcF90aW1lZ20oc3RydWN0IHRtKik7CitzdGF0aWMgc3RydWN0IHNvYXBfbmxpc3QgKnNvYXBfbG9va3VwX25zKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHNpemVfdCBuKTsKK3N0YXRpYyBzdHJ1Y3Qgc29hcF9ubGlzdCAqc29hcF9wdXNoX25zKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqbnMsIHNob3J0IHV0aWxpemVkKTsKK3N0YXRpYyB2b2lkIHNvYXBfcG9wX25zKHN0cnVjdCBzb2FwICpzb2FwKTsKK3N0YXRpYyB2b2lkIHNvYXBfdXRpbGl6ZV9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzaXplX3Qgbik7CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKnNvYXBfbmV3X211bHRpcGFydChzdHJ1Y3Qgc29hcCosIHN0cnVjdCBzb2FwX211bHRpcGFydCoqLCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKiwgY2hhciosIHNpemVfdCk7CitzdGF0aWMgaW50IHNvYXBfcHV0ZGltZWZpZWxkKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHNpemVfdCk7CitzdGF0aWMgY2hhciAqc29hcF9nZXRkaW1lZmllbGQoc3RydWN0IHNvYXAqLCBzaXplX3QpOworc3RhdGljIHZvaWQgc29hcF9zZWxlY3RfbWltZV9ib3VuZGFyeShzdHJ1Y3Qgc29hcCopOworc3RhdGljIGludCBzb2FwX3ZhbGlkX21pbWVfYm91bmRhcnkoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBpbnQgc29hcF9tYXRjaF9jaWQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworc3RhdGljIHZvaWQgc29hcF9yZXNvbHZlX2F0dGFjaG1lbnQoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBXSVRIX0daSVAKK3N0YXRpYyBpbnQgc29hcF9nZXRnemlwaGRyKHN0cnVjdCBzb2FwKik7CisjZW5kaWYKKworI2lmZGVmIFdJVEhfT1BFTlNTTAorc3RhdGljIGludCBzc2xfaW5pdF9kb25lID0gMDsKK3N0YXRpYyBpbnQgc3NsX2F1dGhfaW5pdChzdHJ1Y3Qgc29hcCopOworc3RhdGljIGludCBzc2xfdmVyaWZ5X2NhbGxiYWNrKGludCwgWDUwOV9TVE9SRV9DVFgqKTsKK3N0YXRpYyBpbnQgc3NsX3Bhc3N3b3JkKGNoYXIqLCBpbnQsIGludCwgdm9pZCAqKTsKK3N0YXRpYyBjb25zdCBjaGFyICpzc2xfZXJyb3Ioc3RydWN0IHNvYXAqLCBpbnQpOworLyogVGhpcyBjYWxsYmFjayBpcyBpbmNsdWRlZCBmb3IgZnV0dXJlIHJlZmVyZW5jZXMuIEl0IHNob3VsZCBub3QgYmUgZGVsZXRlZAorc3RhdGljIERIICpzc2xfdG1wX2RoKFNTTCosIGludCwgaW50KTsKKyovCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFdJVEhfTk9IVFRQKSB8fCAhZGVmaW5lZChXSVRIX0xFQU5FUikKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY29uc3QgY2hhciAqc29hcF9kZWNvZGUoY2hhciosIHNpemVfdCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc29hcF93Y2hhciBzb2FwX2dldGNodW5rY2hhcihzdHJ1Y3Qgc29hcCopOworc3RhdGljIGNvbnN0IGNoYXIgKmh0dHBfZXJyb3Ioc3RydWN0IHNvYXAqLCBpbnQpOworc3RhdGljIGludCBodHRwX3Bvc3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworc3RhdGljIGludCBodHRwX2dldChzdHJ1Y3Qgc29hcCopOworc3RhdGljIGludCBodHRwX3NlbmRfaGVhZGVyKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworc3RhdGljIGludCBodHRwX3Bvc3RfaGVhZGVyKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyBpbnQgaHR0cF9yZXNwb25zZShzdHJ1Y3Qgc29hcCosIGludCwgc2l6ZV90KTsKK3N0YXRpYyBpbnQgaHR0cF9wYXJzZShzdHJ1Y3Qgc29hcCopOworc3RhdGljIGludCBodHRwX3BhcnNlX2hlYWRlcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQgZnNlbmQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc2l6ZV90KTsKK3N0YXRpYyBzaXplX3QgZnJlY3Yoc3RydWN0IHNvYXAqLCBjaGFyKiwgc2l6ZV90KTsKK3N0YXRpYyBpbnQgdGNwX2luaXQoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBjb25zdCBjaGFyICp0Y3BfZXJyb3Ioc3RydWN0IHNvYXAqKTsKKyNpZm5kZWYgV0lUSF9JUFY2CitzdGF0aWMgaW50IHRjcF9nZXRob3N0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqYWRkciwgc3RydWN0IGluX2FkZHIgKmluYWRkcik7CisjZW5kaWYKK3N0YXRpYyBpbnQgdGNwX2Nvbm5lY3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICplbmRwb2ludCwgY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQpOworc3RhdGljIGludCB0Y3BfYWNjZXB0KHN0cnVjdCBzb2FwKiwgaW50LCBzdHJ1Y3Qgc29ja2FkZHIqLCBpbnQqKTsKK3N0YXRpYyBpbnQgdGNwX2Rpc2Nvbm5lY3Qoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBpbnQgdGNwX2Nsb3Nlc29ja2V0KHN0cnVjdCBzb2FwKiwgU09BUF9TT0NLRVQpOworc3RhdGljIGludCB0Y3Bfc2h1dGRvd25zb2NrZXQoc3RydWN0IHNvYXAqLCBTT0FQX1NPQ0tFVCwgaW50KTsKK3N0YXRpYyBjb25zdCBjaGFyICpzb2FwX3N0cmVycm9yKHN0cnVjdCBzb2FwKik7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQQUxNKSAmJiAhZGVmaW5lZChQQUxNXzIpCit1bnNpZ25lZCBzaG9ydCBlcnJubzsKKyNlbmRpZgorCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNvbnN0IGNoYXIgc29hcF9lbnYxWzQyXSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI7CitzdGF0aWMgY29uc3QgY2hhciBzb2FwX2VuYzFbNDJdID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIjsKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfZW52Mls0MF0gPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIjsKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfZW5jMls0MF0gPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVuY29kaW5nIjsKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfcnBjWzM1XSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtcnBjIjsKKyNlbmRpZgorCisjaWZuZGVmIFBBTE1fMQorY29uc3Qgc3RydWN0IHNvYXBfZG91YmxlX25hbiBzb2FwX2RvdWJsZV9uYW4gPSB7MHhGRkZGRkZGRiwgMHhGRkZGRkZGRn07CitzdGF0aWMgY29uc3QgY2hhciBzb2FwX2Jhc2U2NG9bNjVdID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOworc3RhdGljIGNvbnN0IGNoYXIgc29hcF9iYXNlNjRpWzgxXSA9ICJcNzZYWFhcNzdcNjRcNjVcNjZcNjdcNzBcNzFcNzJcNzNcNzRcNzVYWFhYWFhYXDAwXDAxXDAyXDAzXDA0XDA1XDA2XDA3XDEwXDExXDEyXDEzXDE0XDE1XDE2XDE3XDIwXDIxXDIyXDIzXDI0XDI1XDI2XDI3XDMwXDMxWFhYWFhYXDMyXDMzXDM0XDM1XDM2XDM3XDQwXDQxXDQyXDQzXDQ0XDQ1XDQ2XDQ3XDUwXDUxXDUyXDUzXDU0XDU1XDU2XDU3XDYwXDYxXDYyXDYzIjsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIGNvbnN0IGNoYXIgc29hcF9pbmRlbnRbMTFdID0gIlxuXHRcdFx0XHRcdFx0XHRcdFx0IjsKKy8qIEFsdGVybmF0aXZlIGluZGVudGF0aW9uIGZvcm0gZm9yIFNPQVBfWE1MX0lOREVOVDoKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfaW5kZW50WzIxXSA9ICJcbiAgICAgICAgICAgICAgICAgICAiOworKi8KKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciBzb2FwX3BhZGRpbmdbNF0gPSAiXDBcMFwwIjsKKyNkZWZpbmUgU09BUF9TVFJfUEFERElORyAoc29hcF9wYWRkaW5nKQorI2RlZmluZSBTT0FQX1NUUl9FT1MgKHNvYXBfcGFkZGluZykKKyNkZWZpbmUgU09BUF9OT05fTlVMTCAoc29hcF9wYWRkaW5nKQorCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwIGh0bWxfZW50aXR5X2NvZGVzW10gPSAvKiBlbnRpdGllcyBmb3IgWEhUTUwgcGFyc2luZyAqLworeyB7IDE2MCwgIm5ic3AiIH0sCisgIHsgMTYxLCAiaWV4Y2wiIH0sCisgIHsgMTYyLCAiY2VudCIgfSwKKyAgeyAxNjMsICJwb3VuZCIgfSwKKyAgeyAxNjQsICJjdXJyZW4iIH0sCisgIHsgMTY1LCAieWVuIiB9LAorICB7IDE2NiwgImJydmJhciIgfSwKKyAgeyAxNjcsICJzZWN0IiB9LAorICB7IDE2OCwgInVtbCIgfSwKKyAgeyAxNjksICJjb3B5IiB9LAorICB7IDE3MCwgIm9yZGYiIH0sCisgIHsgMTcxLCAibGFxdW8iIH0sCisgIHsgMTcyLCAibm90IiB9LAorICB7IDE3MywgInNoeSIgfSwKKyAgeyAxNzQsICJyZWciIH0sCisgIHsgMTc1LCAibWFjciIgfSwKKyAgeyAxNzYsICJkZWciIH0sCisgIHsgMTc3LCAicGx1c21uIiB9LAorICB7IDE3OCwgInN1cDIiIH0sCisgIHsgMTc5LCAic3VwMyIgfSwKKyAgeyAxODAsICJhY3V0ZSIgfSwKKyAgeyAxODEsICJtaWNybyIgfSwKKyAgeyAxODIsICJwYXJhIiB9LAorICB7IDE4MywgIm1pZGRvdCIgfSwKKyAgeyAxODQsICJjZWRpbCIgfSwKKyAgeyAxODUsICJzdXAxIiB9LAorICB7IDE4NiwgIm9yZG0iIH0sCisgIHsgMTg3LCAicmFxdW8iIH0sCisgIHsgMTg4LCAiZnJhYzE0IiB9LAorICB7IDE4OSwgImZyYWMxMiIgfSwKKyAgeyAxOTAsICJmcmFjMzQiIH0sCisgIHsgMTkxLCAiaXF1ZXN0IiB9LAorICB7IDE5MiwgIkFncmF2ZSIgfSwKKyAgeyAxOTMsICJBYWN1dGUiIH0sCisgIHsgMTk0LCAiQWNpcmMiIH0sCisgIHsgMTk1LCAiQXRpbGRlIiB9LAorICB7IDE5NiwgIkF1bWwiIH0sCisgIHsgMTk3LCAiQXJpbmciIH0sCisgIHsgMTk4LCAiQUVsaWciIH0sCisgIHsgMTk5LCAiQ2NlZGlsIiB9LAorICB7IDIwMCwgIkVncmF2ZSIgfSwKKyAgeyAyMDEsICJFYWN1dGUiIH0sCisgIHsgMjAyLCAiRWNpcmMiIH0sCisgIHsgMjAzLCAiRXVtbCIgfSwKKyAgeyAyMDQsICJJZ3JhdmUiIH0sCisgIHsgMjA1LCAiSWFjdXRlIiB9LAorICB7IDIwNiwgIkljaXJjIiB9LAorICB7IDIwNywgIkl1bWwiIH0sCisgIHsgMjA4LCAiRVRIIiB9LAorICB7IDIwOSwgIk50aWxkZSIgfSwKKyAgeyAyMTAsICJPZ3JhdmUiIH0sCisgIHsgMjExLCAiT2FjdXRlIiB9LAorICB7IDIxMiwgIk9jaXJjIiB9LAorICB7IDIxMywgIk90aWxkZSIgfSwKKyAgeyAyMTQsICJPdW1sIiB9LAorICB7IDIxNSwgInRpbWVzIiB9LAorICB7IDIxNiwgIk9zbGFzaCIgfSwKKyAgeyAyMTcsICJVZ3JhdmUiIH0sCisgIHsgMjE4LCAiVWFjdXRlIiB9LAorICB7IDIxOSwgIlVjaXJjIiB9LAorICB7IDIyMCwgIlV1bWwiIH0sCisgIHsgMjIxLCAiWWFjdXRlIiB9LAorICB7IDIyMiwgIlRIT1JOIiB9LAorICB7IDIyMywgInN6bGlnIiB9LAorICB7IDIyNCwgImFncmF2ZSIgfSwKKyAgeyAyMjUsICJhYWN1dGUiIH0sCisgIHsgMjI2LCAiYWNpcmMiIH0sCisgIHsgMjI3LCAiYXRpbGRlIiB9LAorICB7IDIyOCwgImF1bWwiIH0sCisgIHsgMjI5LCAiYXJpbmciIH0sCisgIHsgMjMwLCAiYWVsaWciIH0sCisgIHsgMjMxLCAiY2NlZGlsIiB9LAorICB7IDIzMiwgImVncmF2ZSIgfSwKKyAgeyAyMzMsICJlYWN1dGUiIH0sCisgIHsgMjM0LCAiZWNpcmMiIH0sCisgIHsgMjM1LCAiZXVtbCIgfSwKKyAgeyAyMzYsICJpZ3JhdmUiIH0sCisgIHsgMjM3LCAiaWFjdXRlIiB9LAorICB7IDIzOCwgImljaXJjIiB9LAorICB7IDIzOSwgIml1bWwiIH0sCisgIHsgMjQwLCAiZXRoIiB9LAorICB7IDI0MSwgIm50aWxkZSIgfSwKKyAgeyAyNDIsICJvZ3JhdmUiIH0sCisgIHsgMjQzLCAib2FjdXRlIiB9LAorICB7IDI0NCwgIm9jaXJjIiB9LAorICB7IDI0NSwgIm90aWxkZSIgfSwKKyAgeyAyNDYsICJvdW1sIiB9LAorICB7IDI0NywgImRpdmlkZSIgfSwKKyAgeyAyNDgsICJvc2xhc2giIH0sCisgIHsgMjQ5LCAidWdyYXZlIiB9LAorICB7IDI1MCwgInVhY3V0ZSIgfSwKKyAgeyAyNTEsICJ1Y2lyYyIgfSwKKyAgeyAyNTIsICJ1dW1sIiB9LAorICB7IDI1MywgInlhY3V0ZSIgfSwKKyAgeyAyNTQsICJ0aG9ybiIgfSwKKyAgeyAyNTUsICJ5dW1sIiB9LAorICB7ICAgMCwgTlVMTCB9Cit9OworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwIGhfZXJyb3JfY29kZXNbXSA9Cit7CisjaWZkZWYgSE9TVF9OT1RfRk9VTkQgICAKKyAgeyBIT1NUX05PVF9GT1VORCwgIkhvc3Qgbm90IGZvdW5kIiB9LAorI2VuZGlmCisjaWZkZWYgVFJZX0FHQUlOCisgIHsgVFJZX0FHQUlOLCAiVHJ5IEFnYWluIiB9LAorI2VuZGlmCisjaWZkZWYgTk9fUkVDT1ZFUlkgIAorICB7IE5PX1JFQ09WRVJZLCAiTm8gUmVjb3ZlcnkiIH0sCisjZW5kaWYKKyNpZmRlZiBOT19EQVRBCisgIHsgTk9fREFUQSwgIk5vIERhdGEiIH0sCisjZW5kaWYKKyNpZmRlZiBOT19BRERSRVNTCisgIHsgTk9fQUREUkVTUywgIk5vIEFkZHJlc3MiIH0sCisjZW5kaWYKKyAgeyAwLCBOVUxMIH0KK307CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwIGhfaHR0cF9lcnJvcl9jb2Rlc1tdID0KK3sgeyAyMDEsICJDcmVhdGVkIiB9LAorICB7IDIwMiwgIkFjY2VwdGVkIiB9LAorICB7IDIwMywgIk5vbi1BdXRob3JpdGF0aXZlIEluZm9ybWF0aW9uIiB9LAorICB7IDIwNCwgIk5vIENvbnRlbnQiIH0sCisgIHsgMjA1LCAiUmVzZXQgQ29udGVudCIgfSwKKyAgeyAyMDYsICJQYXJ0aWFsIENvbnRlbnQiIH0sCisgIHsgMzAwLCAiTXVsdGlwbGUgQ2hvaWNlcyIgfSwKKyAgeyAzMDEsICJNb3ZlZCBQZXJtYW5lbnRseSIgfSwKKyAgeyAzMDIsICJGb3VuZCIgfSwKKyAgeyAzMDMsICJTZWUgT3RoZXIiIH0sCisgIHsgMzA0LCAiTm90IE1vZGlmaWVkIiB9LAorICB7IDMwNSwgIlVzZSBQcm94eSIgfSwKKyAgeyAzMDcsICJUZW1wb3JhcnkgUmVkaXJlY3QiIH0sCisgIHsgNDAwLCAiQmFkIFJlcXVlc3QiIH0sCisgIHsgNDAxLCAiVW5hdXRob3JpemVkIiB9LAorICB7IDQwMiwgIlBheW1lbnQgUmVxdWlyZWQiIH0sCisgIHsgNDAzLCAiRm9yYmlkZGVuIiB9LAorICB7IDQwNCwgIk5vdCBGb3VuZCIgfSwKKyAgeyA0MDUsICJNZXRob2QgTm90IEFsbG93ZWQiIH0sCisgIHsgNDA2LCAiTm90IEFjY2VwdGFibGUiIH0sCisgIHsgNDA3LCAiUHJveHkgQXV0aGVudGljYXRpb24gUmVxdWlyZWQiIH0sCisgIHsgNDA4LCAiUmVxdWVzdCBUaW1lLW91dCIgfSwKKyAgeyA0MDksICJDb25mbGljdCIgfSwKKyAgeyA0MTAsICJHb25lIiB9LAorICB7IDQxMSwgIkxlbmd0aCBSZXF1aXJlZCIgfSwKKyAgeyA0MTIsICJQcmVjb25kaXRpb24gRmFpbGVkIiB9LAorICB7IDQxMywgIlJlcXVlc3QgRW50aXR5IFRvbyBMYXJnZSIgfSwKKyAgeyA0MTQsICJSZXF1ZXN0LVVSSSBUb28gTGFyZ2UiIH0sCisgIHsgNDE1LCAiVW5zdXBwb3J0ZWQgTWVkaWEgVHlwZSIgfSwKKyAgeyA0MTYsICJSZXF1ZXN0ZWQgcmFuZ2Ugbm90IHNhdGlzZmlhYmxlIiB9LAorICB7IDQxNywgIkV4cGVjdGF0aW9uIEZhaWxlZCIgfSwKKyAgeyA1MDAsICJJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IiIH0sCisgIHsgNTAxLCAiTm90IEltcGxlbWVudGVkIiB9LAorICB7IDUwMiwgIkJhZCBHYXRld2F5IiB9LAorICB7IDUwMywgIlNlcnZpY2UgVW5hdmFpbGFibGUiIH0sCisgIHsgNTA0LCAiR2F0ZXdheSBUaW1lLW91dCIgfSwKKyAgeyA1MDUsICJIVFRQIFZlcnNpb24gbm90IHN1cHBvcnRlZCIgfSwKKyAgeyAgIDAsIE5VTEwgfQorfTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBXSVRIX09QRU5TU0wKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCBoX3NzbF9lcnJvcl9jb2Rlc1tdID0KK3sKKyNkZWZpbmUgX1NTTF9FUlJPUihlKSB7IGUsICNlIH0KKyAgX1NTTF9FUlJPUihTU0xfRVJST1JfU1NMKSwKKyAgX1NTTF9FUlJPUihTU0xfRVJST1JfWkVST19SRVRVUk4pLAorICBfU1NMX0VSUk9SKFNTTF9FUlJPUl9XQU5UX1JFQUQpLAorICBfU1NMX0VSUk9SKFNTTF9FUlJPUl9XQU5UX1dSSVRFKSwKKyAgX1NTTF9FUlJPUihTU0xfRVJST1JfV0FOVF9DT05ORUNUKSwKKyAgX1NTTF9FUlJPUihTU0xfRVJST1JfV0FOVF9YNTA5X0xPT0tVUCksCisgIF9TU0xfRVJST1IoU1NMX0VSUk9SX1NZU0NBTEwpLAorICB7IDAsIE5VTEwgfQorfTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTkVSCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgbWltZV9jb2Rlc1tdID0KK3sgeyBTT0FQX01JTUVfN0JJVCwJCSI3Yml0IiB9LAorICB7IFNPQVBfTUlNRV84QklULAkJIjhiaXQiIH0sCisgIHsgU09BUF9NSU1FX0JJTkFSWSwJCSJiaW5hcnkiIH0sCisgIHsgU09BUF9NSU1FX1FVT1RFRF9QUklOVEFCTEUsICJxdW90ZWQtcHJpbnRhYmxlIiB9LAorICB7IFNPQVBfTUlNRV9CQVNFNjQsCQkiYmFzZTY0IiB9LAorICB7IFNPQVBfTUlNRV9JRVRGX1RPS0VOLAkiaWV0Zi10b2tlbiIgfSwKKyAgeyBTT0FQX01JTUVfWF9UT0tFTiwJCSJ4LXRva2VuIiB9LAorICB7IDAsCQkJCU5VTEwgfQorfTsKKyNlbmRpZgorCisjaWZkZWYgV0lOMzIKK3N0YXRpYyBpbnQgdGNwX2RvbmUgPSAwOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK2ZzZW5kKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBzaXplX3QgbikKK3sgcmVnaXN0ZXIgaW50IG53cml0dGVuOworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpICYmICFkZWZpbmVkKFdJVEhfTEVBTikKKyAgaWYgKHNvYXAtPm9zKQorICB7IHNvYXAtPm9zLT53cml0ZShzLCBuKTsKKyAgICBpZiAoc29hcC0+b3MtPmdvb2QoKSkKKyAgICAgIHJldHVybiBTT0FQX09LOworICAgIHJldHVybiBTT0FQX0VPRjsKKyAgfQorI2VuZGlmCisgIHdoaWxlIChuKQorICB7IGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICAgIHsgCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgaWYgKHNvYXAtPnNlbmRfdGltZW91dCkKKyAgICAgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgICAgZmRfc2V0IGZkOworICAgICAgICBpZiAoc29hcC0+c2VuZF90aW1lb3V0ID4gMCkKKyAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IHNvYXAtPnNlbmRfdGltZW91dDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IC1zb2FwLT5zZW5kX3RpbWVvdXQvMTAwMDAwMDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAtc29hcC0+c2VuZF90aW1lb3V0JTEwMDAwMDA7CisgICAgICAgIH0KKyAgICAgICAgRkRfWkVSTygmZmQpOworICAgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJmZkKTsKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeyByZWdpc3RlciBpbnQgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCBOVUxMLCAmZmQsICZmZCwgJnRpbWVvdXQpOworICAgICAgICAgIGlmIChyID4gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGlmICghcikKKyAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IDA7CisgICAgICAgICAgICByZXR1cm4gU09BUF9FT0Y7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUFHQUlOKQorICAgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgICByZXR1cm4gU09BUF9FT0Y7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICAgIGlmIChzb2FwLT5zc2wpCisgICAgICAgIG53cml0dGVuID0gU1NMX3dyaXRlKHNvYXAtPnNzbCwgcywgbik7CisgICAgICBlbHNlIGlmIChzb2FwLT5iaW8pCisgICAgICAgIG53cml0dGVuID0gQklPX3dyaXRlKHNvYXAtPmJpbywgcywgbik7CisgICAgICBlbHNlCisjZW5kaWYKKyNpZmRlZiBXSVRIX1VEUAorICAgICAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICAgIHsgaWYgKHNvYXAtPnBlZXJsZW4pCisJICBud3JpdHRlbiA9IHNlbmR0bygoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyLCBzb2FwLT5wZWVybGVuKTsKKyAgICAgICAgZWxzZQorCSAgbndyaXR0ZW4gPSBzZW5kKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHMsIG4sIHNvYXAtPnNvY2tldF9mbGFncyk7CisJLyogcmV0cnkgYW5kIGJhY2stb2ZmIGFsZ29yaXRobSAqLworCS8qIFRPRE86IHRoaXMgaXMgbm90IHZlcnkgY2xlYXIgZnJvbSBzcGVjcyBzbyB2ZXJpZnkgYW5kIGxpbWl0IGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggd2Ugc2hvdWxkIGxvb3AgKGUuZy4gRU5PQlVGUykgKi8KKwlpZiAobndyaXR0ZW4gPCAwKQorICAgICAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICAgICAgZmRfc2V0IGZkOworCSAgaW50IHVkcF9yZXBlYXQ7CisJICBpbnQgdWRwX2RlbGF5OworICAgICAgICAgIGlmICgoc29hcC0+Y29ubmVjdF9mbGFncyAmIFNPX0JST0FEQ0FTVCkpCisJICAgIHVkcF9yZXBlYXQgPSAzOyAvKiBTT0FQLW92ZXItVURQIE1VTFRJQ0FTVF9VRFBfUkVQRUFUIC0gMSAqLworICAgICAgICAgIGVsc2UKKwkgICAgdWRwX3JlcGVhdCA9IDE7IC8qIFNPQVAtb3Zlci1VRFAgVU5JQ0FTVF9VRFBfUkVQRUFUIC0gMSAqLworCSAgdWRwX2RlbGF5ID0gKHNvYXBfcmFuZG9tICUgMjAxKSArIDUwOyAvKiBVRFBfTUlOX0RFTEFZIC4uIFVEUF9NQVhfREVMQVkgKi8KKwkgIGRvCisgICAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IDA7CisgICAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAxMDAwICogdWRwX2RlbGF5OyAvKiBtcyAqLworICAgICAgICAgICAgRkRfWkVSTygmZmQpOworICAgICAgICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZmZCk7CisgICAgICAgICAgICBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgTlVMTCwgTlVMTCwgJmZkLCAmdGltZW91dCk7CisJICAgIGlmIChzb2FwLT5wZWVybGVuKQorCSAgICAgIG53cml0dGVuID0gc2VuZHRvKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHMsIG4sIHNvYXAtPnNvY2tldF9mbGFncywgKHN0cnVjdCBzb2NrYWRkciopJnNvYXAtPnBlZXIsIHNvYXAtPnBlZXJsZW4pOworICAgICAgICAgICAgZWxzZQorCSAgICAgIG53cml0dGVuID0gc2VuZCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MpOworCSAgICB1ZHBfZGVsYXkgPDw9IDE7CisJICAgIGlmICh1ZHBfZGVsYXkgPiA1MDApIC8qIFVEUF9VUFBFUl9ERUxBWSAqLworCSAgICAgIHVkcF9kZWxheSA9IDUwMDsKKwkgIH0KKwkgIHdoaWxlIChud3JpdHRlbiA8IDAgJiYgLS11ZHBfcmVwZWF0ID4gMCk7CisJfQorICAgICAgfQorICAgICAgZWxzZQorI2VuZGlmCisjaWYgIWRlZmluZWQoUEFMTSkgJiYgIWRlZmluZWQoQVM0MDApCisgICAgICAgIG53cml0dGVuID0gc2VuZCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MpOworI2Vsc2UKKyAgICAgICAgbndyaXR0ZW4gPSBzZW5kKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICh2b2lkKilzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MpOworI2VuZGlmCisgICAgICBpZiAobndyaXR0ZW4gPD0gMCkKKyAgICAgIHsKKyNpZmRlZiBXSVRIX09QRU5TU0wKKwlpbnQgZXJyOworICAgICAgICBpZiAoc29hcC0+c3NsICYmIChlcnIgPSBTU0xfZ2V0X2Vycm9yKHNvYXAtPnNzbCwgbndyaXR0ZW4pKSAhPSBTU0xfRVJST1JfTk9ORSAmJiBlcnIgIT0gU1NMX0VSUk9SX1dBTlRfUkVBRCAmJiBlcnIgIT0gU1NMX0VSUk9SX1dBTlRfV1JJVEUpCisgICAgICAgICAgcmV0dXJuIFNPQVBfRU9GOworI2VuZGlmCisgICAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRVdPVUxEQkxPQ0sgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FQUdBSU4pCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgcmV0dXJuIFNPQVBfRU9GOworICAgICAgICB9CisgICAgICAgIG53cml0dGVuID0gMDsgLyogYW5kIGNhbGwgd3JpdGUoKSBhZ2FpbiAqLworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworI2lmZGVmIFdJVEhfRkFTVENHSQorICAgICAgbndyaXR0ZW4gPSBmd3JpdGUoKHZvaWQqKXMsIDEsIG4sIHN0ZG91dCk7CisgICAgICBmZmx1c2goc3Rkb3V0KTsKKyNlbHNlCisjaWZkZWYgVU5ERVJfQ0UKKyAgICAgIG53cml0dGVuID0gZndyaXRlKHMsIDEsIG4sIHNvYXAtPnNlbmRmZCk7CisjZWxzZQorI2lmZGVmIFZYV09SS1MKKyNpZmRlZiBXTVdfUlBNX0lPCisgICAgICBpZiAoc29hcC0+cnBtcmVxaWQpCisgICAgICAgIG53cml0dGVuID0gKGh0dHBCbG9ja1B1dChzb2FwLT5ycG1yZXFpZCwgcywgbikgPT0gMCkgPyBuIDogLTE7IAorICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgIG53cml0dGVuID0gZndyaXRlKHMsIHNpemVvZihjaGFyKSwgbiwgZmRvcGVuKHNvYXAtPnNlbmRmZCwgInciKSk7CisjZWxzZQorICAgICAgbndyaXR0ZW4gPSB3cml0ZSgoU09BUF9TT0NLRVQpc29hcC0+c2VuZGZkLCBzLCBuKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyAgICAgIGlmIChud3JpdHRlbiA8PSAwKQorICAgICAgeyBpZiAoc29hcF9lcnJubyAhPSBTT0FQX0VJTlRSICYmIHNvYXBfZXJybm8gIT0gU09BUF9FV09VTERCTE9DSyAmJiBzb2FwX2Vycm5vICE9IFNPQVBfRUFHQUlOKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfZXJybm87CisgICAgICAgICAgcmV0dXJuIFNPQVBfRU9GOworICAgICAgICB9CisgICAgICAgIG53cml0dGVuID0gMDsgLyogYW5kIGNhbGwgd3JpdGUoKSBhZ2FpbiAqLworICAgICAgfQorICAgIH0KKyAgICBuIC09IG53cml0dGVuOworICAgIHMgKz0gbndyaXR0ZW47CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZW5kX3JhdyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgc2l6ZV90IG4pCit7IGlmICghbikKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgeyBzb2FwLT5jb3VudCArPSBuOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICAgIGlmIChzb2FwLT5mcHJlcGFyZXNlbmQgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSAhPSBTT0FQX0lPX1NUT1JFKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gc29hcC0+ZnByZXBhcmVzZW5kKHNvYXAsIHMsIG4pOworI2VuZGlmCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKQorICB7IHJlZ2lzdGVyIHNpemVfdCBpID0gU09BUF9CVUZMRU4gLSBzb2FwLT5idWZpZHg7CisgICAgd2hpbGUgKG4gPj0gaSkKKyAgICB7IG1lbWNweShzb2FwLT5idWYgKyBzb2FwLT5idWZpZHgsIHMsIGkpOworICAgICAgc29hcC0+YnVmaWR4ID0gU09BUF9CVUZMRU47CisgICAgICBpZiAoc29hcF9mbHVzaChzb2FwKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgcyArPSBpOworICAgICAgbiAtPSBpOworICAgICAgaSA9IFNPQVBfQlVGTEVOOworICAgIH0KKyAgICBtZW1jcHkoc29hcC0+YnVmICsgc29hcC0+YnVmaWR4LCBzLCBuKTsKKyAgICBzb2FwLT5idWZpZHggKz0gbjsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICByZXR1cm4gc29hcF9mbHVzaF9yYXcoc29hcCwgcywgbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZmx1c2goc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBuID0gc29hcC0+YnVmaWR4OworICBpZiAobikKKyAgeyBzb2FwLT5idWZpZHggPSAwOworI2lmZGVmIFdJVEhfWkxJQgorICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQikKKyAgICB7IHNvYXAtPmRfc3RyZWFtLm5leHRfaW4gPSAoQnl0ZSopc29hcC0+YnVmOworICAgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4gPSAodW5zaWduZWQgaW50KW47CisjaWZkZWYgV0lUSF9HWklQCisgICAgICBzb2FwLT56X2NyYyA9IGNyYzMyKHNvYXAtPnpfY3JjLCAoQnl0ZSopc29hcC0+YnVmLCAodW5zaWduZWQgaW50KW4pOworI2VuZGlmCisgICAgICBkbworICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlZmxhdGluZyAldSBieXRlc1xuIiwgc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4pKTsKKyAgICAgICAgaWYgKGRlZmxhdGUoJnNvYXAtPmRfc3RyZWFtLCBaX05PX0ZMVVNIKSAhPSBaX09LKQorICAgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVW5hYmxlIHRvIGRlZmxhdGU6ICVzXG4iLCBzb2FwLT5kX3N0cmVhbS5tc2c/c29hcC0+ZF9zdHJlYW0ubXNnOiIiKSk7CisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGlmICghc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0KQorICAgICAgICB7IGlmIChzb2FwX2ZsdXNoX3Jhdyhzb2FwLCBzb2FwLT56X2J1ZiwgU09BUF9CVUZMRU4pKQorICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gKEJ5dGUqKXNvYXAtPnpfYnVmOworICAgICAgICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCA9IFNPQVBfQlVGTEVOOworICAgICAgICB9CisgICAgICB9IHdoaWxlIChzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbik7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgICAgcmV0dXJuIHNvYXBfZmx1c2hfcmF3KHNvYXAsIHNvYXAtPmJ1Ziwgbik7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZmx1c2hfcmF3KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBzaXplX3QgbikKK3sgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19TVE9SRSkKKyAgeyByZWdpc3RlciBjaGFyICp0OworICAgIGlmICghKHQgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIG4pKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIG1lbWNweSh0LCBzLCBuKTsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgICBpZiAoc29hcC0+ZnByZXBhcmVzZW5kKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gc29hcC0+ZnByZXBhcmVzZW5kKHNvYXAsIHMsIG4pOworI2VuZGlmCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgeyBjaGFyIHRbMTZdOworICAgIHNwcmludGYodCwgIlxyXG4lbFhcclxuIiArIChzb2FwLT5jaHVua3NpemUgPyAwIDogMiksICh1bnNpZ25lZCBsb25nKW4pOworICAgIERCR01TRyhTRU5ULCB0LCBzdHJsZW4odCkpOworICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mc2VuZChzb2FwLCB0LCBzdHJsZW4odCkpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBzb2FwLT5jaHVua3NpemUgKz0gbjsKKyAgfQorICBEQkdNU0coU0VOVCwgcywgbik7CisjZW5kaWYKKyAgcmV0dXJuIHNvYXAtPmVycm9yID0gc29hcC0+ZnNlbmQoc29hcCwgcywgbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2VuZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcykKK3sgaWYgKHMpCisgICAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgcywgc3RybGVuKHMpKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2VuZDIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMikKK3sgaWYgKHNvYXBfc2VuZChzb2FwLCBzMSkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9zZW5kKHNvYXAsIHMyKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmQzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIGNvbnN0IGNoYXIgKnMzKQoreyBpZiAoc29hcF9zZW5kKHNvYXAsIHMxKQorICAgfHwgc29hcF9zZW5kKHNvYXAsIHMyKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX3NlbmQoc29hcCwgczMpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHNpemVfdAorZnJlY3Yoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnMsIHNpemVfdCBuKQoreyByZWdpc3RlciBpbnQgcjsKKyAgc29hcC0+ZXJybnVtID0gMDsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiAhZGVmaW5lZChXSVRIX0xFQU4pCisgIGlmIChzb2FwLT5pcykKKyAgeyBpZiAoc29hcC0+aXMtPmdvb2QoKSkKKyAgICAgIHJldHVybiBzb2FwLT5pcy0+cmVhZChzLCBuKS5nY291bnQoKTsKKyAgICByZXR1cm4gMDsKKyAgfQorI2VuZGlmCisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICB7IGZvciAoOzspCisgICAgeyAKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICBpZiAoc29hcC0+cmVjdl90aW1lb3V0KQorICAgICAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgICAgICBmZF9zZXQgZmQ7CisgICAgICAgIGlmIChzb2FwLT5yZWN2X3RpbWVvdXQgPiAwKQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gc29hcC0+cmVjdl90aW1lb3V0OworICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gLXNvYXAtPnJlY3ZfdGltZW91dC8xMDAwMDAwOworICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IC1zb2FwLT5yZWN2X3RpbWVvdXQlMTAwMDAwMDsKKyAgICAgICAgfQorICAgICAgICBGRF9aRVJPKCZmZCk7CisgICAgICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmZmQpOworICAgICAgICBmb3IgKDs7KQorICAgICAgICB7IHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgJmZkLCBOVUxMLCAmZmQsICZ0aW1lb3V0KTsKKyAgICAgICAgICBpZiAociA+IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBpZiAoIXIpCisJICB7IHNvYXAtPmVycm51bSA9IDA7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FQUdBSU4pCisJICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICAgIGlmIChzb2FwLT5zc2wpCisgICAgICB7IGludCBlcnI7CisJciA9IFNTTF9yZWFkKHNvYXAtPnNzbCwgcywgbik7CisgICAgICAgIGlmIChyID4gMCkKKyAgICAgICAgICByZXR1cm4gKHNpemVfdClyOworCWVyciA9IFNTTF9nZXRfZXJyb3Ioc29hcC0+c3NsLCByKTsKKwlpZiAoZXJyICE9IFNTTF9FUlJPUl9OT05FICYmIGVyciAhPSBTU0xfRVJST1JfV0FOVF9SRUFEICYmIGVyciAhPSBTU0xfRVJST1JfV0FOVF9XUklURSkKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHNvYXAtPmJpbykKKyAgICAgIHsgciA9IEJJT19yZWFkKHNvYXAtPmJpbywgcywgbik7CisgICAgICAgIGlmIChyID4gMCkKKyAgICAgICAgICByZXR1cm4gKHNpemVfdClyOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgeyAKKyNpZmRlZiBXSVRIX1VEUAorICAgICAgICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgICAgICB7IFNPQVBfU09DS0xFTl9UIGsgPSAoU09BUF9TT0NLTEVOX1Qpc2l6ZW9mKHNvYXAtPnBlZXIpOworCSAgbWVtc2V0KCh2b2lkKikmc29hcC0+cGVlciwgMCwgc2l6ZW9mKHNvYXAtPnBlZXIpKTsKKyAgICAgICAgICByID0gcmVjdmZyb20oKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgcywgbiwgc29hcC0+c29ja2V0X2ZsYWdzLCAoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlciwgJmspOwkvKiBwb3J0YWJpbGl0eSBub3RlOiBzZWUgU09BUF9TT0NLTEVOX1QgZGVmaW5pdGlvbiBpbiBzdGRzb2FwMi5oICovCisJICBzb2FwLT5wZWVybGVuID0gKHNpemVfdClrOworI2lmbmRlZiBXSVRIX0lQVjYKKyAgICAgICAgICBzb2FwLT5pcCA9IG50b2hsKHNvYXAtPnBlZXIuc2luX2FkZHIuc19hZGRyKTsKKyAgICAgICAgICBzb2FwLT5wb3J0ID0gKGludCludG9ocyhzb2FwLT5wZWVyLnNpbl9wb3J0KTsKKyNlbmRpZgorICAgICAgICB9CisJZWxzZQorI2VuZGlmCisgICAgICAgICAgciA9IHJlY3YoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgcywgbiwgc29hcC0+c29ja2V0X2ZsYWdzKTsKKyAgICAgICAgaWYgKHIgPj0gMCkKKyAgICAgICAgICByZXR1cm4gKHNpemVfdClyOworICAgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUiAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VBR0FJTiAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VXT1VMREJMT0NLKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICB9CisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgICAgICBmZF9zZXQgZmQ7CisgICAgICAgIHRpbWVvdXQudHZfc2VjID0gMDsKKyAgICAgICAgdGltZW91dC50dl91c2VjID0gMTAwMDA7CisgICAgICAgIEZEX1pFUk8oJmZkKTsKKyAgICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZmZCk7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgICAgICAgIGlmIChzb2FwLT5zc2wgJiYgU1NMX2dldF9lcnJvcihzb2FwLT5zc2wsIHIpID09IFNTTF9FUlJPUl9XQU5UX1dSSVRFKQorICAgICAgICAgIHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgTlVMTCwgJmZkLCAmZmQsICZ0aW1lb3V0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgJmZkLCBOVUxMLCAmZmQsICZ0aW1lb3V0KTsKKyNlbHNlCisgICAgICAgIHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgJmZkLCBOVUxMLCAmZmQsICZ0aW1lb3V0KTsKKyNlbmRpZgorICAgICAgICBpZiAociA8IDAgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUikKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisgICAgfQorICB9CisjaWZkZWYgV0lUSF9GQVNUQ0dJCisgIHJldHVybiBmcmVhZChzLCAxLCBuLCBzdGRpbik7CisjZWxzZQorI2lmZGVmIFVOREVSX0NFCisgIHJldHVybiBmcmVhZChzLCAxLCBuLCBzb2FwLT5yZWN2ZmQpOworI2Vsc2UKKyNpZmRlZiBXTVdfUlBNX0lPCisgIGlmIChzb2FwLT5ycG1yZXFpZCkKKyAgICByID0gaHR0cEJsb2NrUmVhZChzb2FwLT5ycG1yZXFpZCwgcywgbik7CisgIGVsc2UKKyNlbmRpZgorICByID0gcmVhZCgoU09BUF9TT0NLRVQpc29hcC0+cmVjdmZkLCBzLCBuKTsKKyAgaWYgKHIgPj0gMCkKKyAgICByZXR1cm4gKHNpemVfdClyOworICBzb2FwLT5lcnJudW0gPSBzb2FwX2Vycm5vOworICByZXR1cm4gMDsKKyNlbmRpZgorI2VuZGlmCit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzb2FwX3djaGFyCitzb2FwX2dldGNodW5rY2hhcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXAtPmJ1ZmlkeCA8IHNvYXAtPmJ1ZmxlbikKKyAgICByZXR1cm4gc29hcC0+YnVmW3NvYXAtPmJ1ZmlkeCsrXTsKKyAgc29hcC0+YnVmaWR4ID0gMDsKKyAgc29hcC0+YnVmbGVuID0gc29hcC0+Y2h1bmtidWZsZW4gPSBzb2FwLT5mcmVjdihzb2FwLCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOKTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWFkICV1IGJ5dGVzIGZyb20gc29ja2V0ICVkXG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmJ1Zmxlbiwgc29hcC0+c29ja2V0KSk7CisgIERCR01TRyhSRUNWLCBzb2FwLT5idWYsIHNvYXAtPmJ1Zmxlbik7CisgIGlmIChzb2FwLT5idWZsZW4pCisgICAgcmV0dXJuIHNvYXAtPmJ1Zltzb2FwLT5idWZpZHgrK107CisgIHJldHVybiBFT0Y7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NvYXBfaXN4ZGlnaXQoaW50IGMpCit7IHJldHVybiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHx8IChjID49ICdBJyAmJiBjIDw9ICdGJykgfHwgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWN2X3JhdyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc2l6ZV90IHJldDsKKyNpZmRlZiBXSVRIX1pMSUIKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKQorICB7IGlmIChzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9PSBaX05VTEwpCisgICAgICByZXR1cm4gRU9GOworICAgIGlmIChzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbiB8fCAhc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0KQorICAgIHsgcmVnaXN0ZXIgaW50IHI7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluZmxhdGluZ1xuIikpOworICAgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZSopc29hcC0+YnVmOworICAgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0ID0gU09BUF9CVUZMRU47CisgICAgICByID0gaW5mbGF0ZSgmc29hcC0+ZF9zdHJlYW0sIFpfTk9fRkxVU0gpOworICAgICAgaWYgKHIgPT0gWl9PSyB8fCByID09IFpfU1RSRUFNX0VORCkKKyAgICAgIHsgc29hcC0+YnVmaWR4ID0gMDsKKyAgICAgICAgc29hcC0+YnVmbGVuID0gU09BUF9CVUZMRU4gLSBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQ7CisgICAgICAgIGlmIChzb2FwLT56bGliX2luID09IFNPQVBfWkxJQl9HWklQKQorICAgICAgICAgIHNvYXAtPnpfY3JjID0gY3JjMzIoc29hcC0+el9jcmMsIChCeXRlKilzb2FwLT5idWYsICh1bnNpZ25lZCBpbnQpc29hcC0+YnVmbGVuKTsKKyAgICAgICAgaWYgKHIgPT0gWl9TVFJFQU1fRU5EKQorICAgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5mbGF0ZWQgJWx1LT4lbHUgYnl0ZXNcbiIsIHNvYXAtPmRfc3RyZWFtLnRvdGFsX2luLCBzb2FwLT5kX3N0cmVhbS50b3RhbF9vdXQpKTsKKyAgICAgICAgICBzb2FwLT56X3JhdGlvX2luID0gKGZsb2F0KXNvYXAtPmRfc3RyZWFtLnRvdGFsX2luIC8gKGZsb2F0KXNvYXAtPmRfc3RyZWFtLnRvdGFsX291dDsKKyAgICAgICAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IFpfTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc29hcC0+YnVmbGVuKQorICAgICAgICB7IHNvYXAtPmNvdW50ICs9IHNvYXAtPmJ1ZmxlbjsKKyAgICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSBpZiAociAhPSBaX0JVRl9FUlJPUikKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbmZsYXRlIGVycm9yOiAlc1xuIiwgc29hcC0+ZF9zdHJlYW0ubXNnP3NvYXAtPmRfc3RyZWFtLm1zZzoiIikpOworICAgICAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IFpfTlVMTDsKKwlzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEVPRjsKKyAgICAgIH0KKyAgICB9Cit6bGliX2FnYWluOgorICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTksgJiYgIXNvYXAtPmNodW5rc2l6ZSkKKyAgICB7IG1lbWNweShzb2FwLT5idWYsIHNvYXAtPnpfYnVmLCBTT0FQX0JVRkxFTik7CisgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT56X2J1ZmxlbjsKKyAgICB9CisgIH0KKyNlbmRpZgorI2lmbmRlZiBXSVRIX05PSFRUUAorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKSAvKiByZWFkIEhUVFAgY2h1bmtlZCB0cmFuc2ZlciAqLworICB7IAorY2h1bmtfYWdhaW46CisgICAgaWYgKHNvYXAtPmNodW5rc2l6ZSkKKyAgICB7IHNvYXAtPmJ1ZmxlbiA9IHJldCA9IHNvYXAtPmZyZWN2KHNvYXAsIHNvYXAtPmJ1Ziwgc29hcC0+Y2h1bmtzaXplID4gU09BUF9CVUZMRU4gPyBTT0FQX0JVRkxFTiA6IHNvYXAtPmNodW5rc2l6ZSk7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdldHRpbmcgY2h1bms6IHJlYWQgJXUgYnl0ZXNcbiIsICh1bnNpZ25lZCBpbnQpcmV0KSk7CisgICAgICBEQkdNU0coUkVDViwgc29hcC0+YnVmLCByZXQpOworICAgICAgc29hcC0+YnVmaWR4ID0gMDsKKyAgICAgIHNvYXAtPmNodW5rc2l6ZSAtPSByZXQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgICAgIGNoYXIgKnQsIHRtcFs4XTsKKyAgICAgIHQgPSB0bXA7CisgICAgICBpZiAoIXNvYXAtPmNodW5rYnVmbGVuKQorICAgICAgeyBzb2FwLT5jaHVua2J1ZmxlbiA9IHJldCA9IHNvYXAtPmZyZWN2KHNvYXAsIHNvYXAtPmJ1ZiwgU09BUF9CVUZMRU4pOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlYWQgJXUgYnl0ZXMgKGNodW5rZWQpIGZyb20gc29ja2V0ICVkXG4iLCAodW5zaWduZWQgaW50KXJldCwgc29hcC0+c29ja2V0KSk7CisgICAgICAgIERCR01TRyhSRUNWLCBzb2FwLT5idWYsIHJldCk7CisgICAgICAgIHNvYXAtPmJ1ZmlkeCA9IDA7CisgICAgICAgIGlmICghcmV0KQorICAgICAgICAgIHJldHVybiBzb2FwLT5haGVhZCA9IEVPRjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgc29hcC0+YnVmaWR4ID0gc29hcC0+YnVmbGVuOworICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+Y2h1bmtidWZsZW47CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdldHRpbmcgY2h1bmsgc2l6ZSAoaWR4PSV1IGxlbj0ldSlcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+YnVmaWR4LCAodW5zaWduZWQgaW50KXNvYXAtPmJ1ZmxlbikpOworICAgICAgd2hpbGUgKCFzb2FwX2lzeGRpZ2l0KChpbnQpKGMgPSBzb2FwX2dldGNodW5rY2hhcihzb2FwKSkpKQorICAgICAgICBpZiAoKGludCljID09IEVPRikKKwkgIHJldHVybiBzb2FwLT5haGVhZCA9IEVPRjsKKyAgICAgIGRvCisgICAgICAgICp0KysgPSAoY2hhciljOworICAgICAgd2hpbGUgKHNvYXBfaXN4ZGlnaXQoKGludCkoYyA9IHNvYXBfZ2V0Y2h1bmtjaGFyKHNvYXApKSkgJiYgdCAtIHRtcCA8IDcpOworICAgICAgd2hpbGUgKChpbnQpYyAhPSBFT0YgJiYgYyAhPSAnXG4nKQorICAgICAgICBjID0gc29hcF9nZXRjaHVua2NoYXIoc29hcCk7CisgICAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgcmV0dXJuIHNvYXAtPmFoZWFkID0gRU9GOworICAgICAgKnQgPSAnXDAnOworICAgICAgc29hcC0+Y2h1bmtzaXplID0gc29hcF9zdHJ0b3VsKHRtcCwgJnQsIDE2KTsKKyAgICAgIGlmICghc29hcC0+Y2h1bmtzaXplKQorICAgICAgeyBzb2FwLT5jaHVua2J1ZmxlbiA9IDA7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIG9mIGNodW5rZWQgbWVzc2FnZVxuIikpOworCXdoaWxlICgoaW50KWMgIT0gRU9GICYmIGMgIT0gJ1xuJykKKyAgICAgICAgICBjID0gc29hcF9nZXRjaHVua2NoYXIoc29hcCk7CisgICAgICAgIHJldHVybiBzb2FwLT5haGVhZCA9IEVPRjsKKyAgICAgIH0KKyAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmJ1ZmlkeCArIHNvYXAtPmNodW5rc2l6ZTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTW92aW5nIGJ1ZiBsZW4gdG8gaWR4PSV1IGxlbj0ldSAoJXMpXG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmJ1ZmlkeCwgKHVuc2lnbmVkIGludClzb2FwLT5idWZsZW4sIHRtcCkpOworICAgICAgaWYgKHNvYXAtPmJ1ZmxlbiA+IHNvYXAtPmNodW5rYnVmbGVuKQorICAgICAgeyBzb2FwLT5idWZsZW4gPSBzb2FwLT5jaHVua2J1ZmxlbjsKKyAgICAgICAgc29hcC0+Y2h1bmtzaXplIC09IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICAgICAgc29hcC0+Y2h1bmtidWZsZW4gPSAwOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlBhc3NlZCBlbmQgb2YgYnVmZmVyIGZvciBjaHVua2VkIEhUVFAgKCV1IGJ5dGVzIGxlZnQpXG4iLCAodW5zaWduZWQgaW50KShzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHgpKSk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChzb2FwLT5jaHVua2J1ZmxlbikKKyAgICAgICAgc29hcC0+Y2h1bmtzaXplID0gMDsKKyAgICAgIHJldCA9IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICAgIGlmICghcmV0KQorICAgICAgICBnb3RvIGNodW5rX2FnYWluOworICAgIH0KKyAgfQorICBlbHNlCisjZW5kaWYKKyAgeyBzb2FwLT5idWZpZHggPSAwOworICAgIHNvYXAtPmJ1ZmxlbiA9IHJldCA9IHNvYXAtPmZyZWN2KHNvYXAsIHNvYXAtPmJ1ZiwgU09BUF9CVUZMRU4pOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVhZCAldSBieXRlcyBmcm9tIHNvY2tldCAlZFxuIiwgKHVuc2lnbmVkIGludClyZXQsIHNvYXAtPnNvY2tldCkpOworICAgIERCR01TRyhSRUNWLCBzb2FwLT5idWYsIHJldCk7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPmZwcmVwYXJlcmVjdiAmJiAoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcHJlcGFyZXJlY3Yoc29hcCwgc29hcC0+YnVmLCByZXQpKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjZW5kaWYKKyNpZmRlZiBXSVRIX1pMSUIKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKQorICB7IHJlZ2lzdGVyIGludCByOworICAgIG1lbWNweShzb2FwLT56X2J1Ziwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTik7CisgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9pbiA9IChCeXRlKikoc29hcC0+el9idWYgKyBzb2FwLT5idWZpZHgpOworICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luID0gKHVuc2lnbmVkIGludClyZXQ7CisgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZSopc29hcC0+YnVmOworICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCA9IFNPQVBfQlVGTEVOOworICAgIHIgPSBpbmZsYXRlKCZzb2FwLT5kX3N0cmVhbSwgWl9OT19GTFVTSCk7CisgICAgaWYgKHIgPT0gWl9PSyB8fCByID09IFpfU1RSRUFNX0VORCkKKyAgICB7IHNvYXAtPmJ1ZmlkeCA9IDA7CisgICAgICBzb2FwLT56X2J1ZmxlbiA9IHNvYXAtPmJ1ZmxlbjsKKyAgICAgIHNvYXAtPmJ1ZmxlbiA9IHJldCA9IFNPQVBfQlVGTEVOIC0gc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0OworICAgICAgaWYgKHNvYXAtPnpsaWJfaW4gPT0gU09BUF9aTElCX0daSVApCisgICAgICAgIHNvYXAtPnpfY3JjID0gY3JjMzIoc29hcC0+el9jcmMsIChCeXRlKilzb2FwLT5idWYsICh1bnNpZ25lZCBpbnQpc29hcC0+YnVmbGVuKTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5mbGF0ZWQgJXUgYnl0ZXNcbiIsICh1bnNpZ25lZCBpbnQpcmV0KSk7CisgICAgICBpZiAoIXJldCkKKyAgICAgICAgZ290byB6bGliX2FnYWluOworICAgICAgaWYgKHIgPT0gWl9TVFJFQU1fRU5EKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluZmxhdGVkICVsdS0+JWx1IGJ5dGVzXG4iLCBzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiwgc29hcC0+ZF9zdHJlYW0udG90YWxfb3V0KSk7CisgICAgICAgIHNvYXAtPnpfcmF0aW9faW4gPSAoZmxvYXQpc29hcC0+ZF9zdHJlYW0udG90YWxfaW4gLyAoZmxvYXQpc29hcC0+ZF9zdHJlYW0udG90YWxfb3V0OworICAgICAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IFpfTlVMTDsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVbmFibGUgdG8gaW5mbGF0ZTogKCVkKSAlc1xuIiwgciwgc29hcC0+ZF9zdHJlYW0ubXNnP3NvYXAtPmRfc3RyZWFtLm1zZzoiIikpOworICAgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSBaX05VTEw7CisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICAgIHJldHVybiBFT0Y7CisgICAgfQorICB9CisjZW5kaWYKKyAgc29hcC0+Y291bnQgKz0gcmV0OworICByZXR1cm4gIXJldDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWN2KHN0cnVjdCBzb2FwICpzb2FwKQoreyAKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKQorICB7IGlmIChzb2FwLT5kaW1lLmJ1ZmxlbikKKyAgICB7IGNoYXIgKnM7CisgICAgICBpbnQgaTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgdG1wWzEyXTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRElNRSBoZHIgZm9yIGNodW5rZWQgRElNRSBpcyBpbiBidWZmZXJcbiIpKTsKKyAgICAgIHNvYXAtPmNvdW50ICs9IHNvYXAtPmRpbWUuYnVmbGVuIC0gc29hcC0+YnVmbGVuOworICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+ZGltZS5idWZsZW47CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNraXAgcGFkZGluZyAoJWxkIGJ5dGVzKVxuIiwgLShsb25nKXNvYXAtPmRpbWUuc2l6ZSYzKSk7CisgICAgICBmb3IgKGkgPSAtKGxvbmcpc29hcC0+ZGltZS5zaXplJjM7IGkgPiAwOyBpLS0pCisgICAgICB7IHNvYXAtPmJ1ZmlkeCsrOworICAgICAgICBpZiAoc29hcC0+YnVmaWR4ID49IHNvYXAtPmJ1ZmxlbikKKyAgICAgICAgICBpZiAoc29hcF9yZWN2X3Jhdyhzb2FwKSkKKyAgICAgICAgICAgIHJldHVybiBFT0Y7CisgICAgICB9CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdldCBESU1FIGhkciBmb3IgbmV4dCBjaHVua1xuIikpOworICAgICAgcyA9IChjaGFyKil0bXA7CisgICAgICBmb3IgKGkgPSAxMjsgaSA+IDA7IGktLSkKKyAgICAgIHsgKnMrKyA9IHNvYXAtPmJ1Zltzb2FwLT5idWZpZHgrK107CisgICAgICAgIGlmIChzb2FwLT5idWZpZHggPj0gc29hcC0+YnVmbGVuKQorICAgICAgICAgIGlmIChzb2FwX3JlY3ZfcmF3KHNvYXApKQorICAgICAgICAgICAgcmV0dXJuIEVPRjsKKyAgICAgIH0KKyAgICAgIHNvYXAtPmRpbWUuZmxhZ3MgPSB0bXBbMF0gJiAweDc7CisgICAgICBzb2FwLT5kaW1lLnNpemUgPSAoKHNpemVfdCl0bXBbOF0gPDwgMjQpIHwgKChzaXplX3QpdG1wWzldIDw8IDE2KSB8ICgoc2l6ZV90KXRtcFsxMF0gPDwgOCkgfCAoKHNpemVfdCl0bXBbMTFdKTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR2V0IERJTUUgY2h1bmsgKCV1IGJ5dGVzKVxuIiwgKHVuc2lnbmVkIGludClzb2FwLT5kaW1lLnNpemUpKTsKKyAgICAgIGlmIChzb2FwLT5kaW1lLmZsYWdzICYgU09BUF9ESU1FX0NGKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk1vcmUgY2h1bmtpbmdcbiIpKTsKKyAgICAgICAgc29hcC0+ZGltZS5jaHVua3NpemUgPSBzb2FwLT5kaW1lLnNpemU7CisgICAgICAgIGlmIChzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHggPj0gc29hcC0+ZGltZS5zaXplKQorICAgICAgICB7IHNvYXAtPmRpbWUuYnVmbGVuID0gc29hcC0+YnVmbGVuOworICAgICAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmJ1ZmlkeCArIHNvYXAtPmRpbWUuY2h1bmtzaXplOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzb2FwLT5kaW1lLmNodW5rc2l6ZSAtPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTGFzdCBjaHVua1xuIikpOworICAgICAgICBzb2FwLT5kaW1lLmJ1ZmxlbiA9IDA7CisgICAgICAgIHNvYXAtPmRpbWUuY2h1bmtzaXplID0gMDsKKyAgICAgIH0KKyAgICAgIHNvYXAtPmNvdW50ID0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIldSBieXRlcyByZW1haW5pbmdcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+Y291bnQpKTsKKyAgICAgIHJldHVybiBTT0FQX09LOworICAgIH0KKyAgICBpZiAoc29hcC0+ZGltZS5jaHVua3NpemUpCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdldCBuZXh0IERJTUUgaGRyIGZvciBjaHVua2VkIERJTUUgKCV1IGJ5dGVzIGNodW5rKVxuIiwgKHVuc2lnbmVkIGludClzb2FwLT5kaW1lLmNodW5rc2l6ZSkpOworICAgICAgaWYgKHNvYXBfcmVjdl9yYXcoc29hcCkpCisgICAgICAgIHJldHVybiBFT0Y7CisgICAgICBpZiAoc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4ID49IHNvYXAtPmRpbWUuY2h1bmtzaXplKQorICAgICAgeyBzb2FwLT5kaW1lLmJ1ZmxlbiA9IHNvYXAtPmJ1ZmxlbjsKKyAgICAgICAgc29hcC0+Y291bnQgLT0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4IC0gc29hcC0+ZGltZS5jaHVua3NpemU7CisgICAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmJ1ZmlkeCArIHNvYXAtPmRpbWUuY2h1bmtzaXplOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBzb2FwLT5kaW1lLmNodW5rc2l6ZSAtPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIiVsdSBieXRlcyByZW1haW5pbmcsIGNvdW50PSV1XG4iLCAodW5zaWduZWQgbG9uZykoc29hcC0+YnVmbGVuLXNvYXAtPmJ1ZmlkeCksICh1bnNpZ25lZCBpbnQpc29hcC0+Y291bnQpKTsKKyAgICAgIHJldHVybiBTT0FQX09LOworICAgIH0KKyAgfQorI2VuZGlmCisgIHJldHVybiBzb2FwX3JlY3ZfcmF3KHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc29hcF93Y2hhcgorU09BUF9GTUFDMgorc29hcF9nZXRjaGFyKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIGMgPSBzb2FwLT5haGVhZDsKKyAgaWYgKGMpCisgIHsgaWYgKGMgIT0gRU9GKQorICAgICAgc29hcC0+YWhlYWQgPSAwOworICAgIHJldHVybiBjOworICB9CisgIHJldHVybiBzb2FwX2dldDEoc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCoKK1NPQVBfRk1BQzIKK3NvYXBfY29kZShjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCAqbWFwLCBjb25zdCBjaGFyICpzdHIpCit7IGlmIChzdHIpCisgIHsgd2hpbGUgKG1hcC0+c3RyaW5nKQorICAgIHsgaWYgKCFzdHJjbXAoc3RyLCBtYXAtPnN0cmluZykpIC8qIGNhc2Ugc2Vuc2l0aXZlICovCisgICAgICAgIHJldHVybiBtYXA7CisgICAgICBtYXArKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitsb25nCitTT0FQX0ZNQUMyCitzb2FwX2ludF9jb2RlKGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwICptYXAsIGNvbnN0IGNoYXIgKnN0ciwgbG9uZyBvdGhlcikKK3sgd2hpbGUgKG1hcC0+c3RyaW5nKQorICB7IGlmICghc29hcF90YWdfY21wKHN0ciwgbWFwLT5zdHJpbmcpKSAvKiBjYXNlIGluc2Vuc2l0aXZlICovCisgICAgICByZXR1cm4gbWFwLT5jb2RlOworICAgIG1hcCsrOworICB9CisgIHJldHVybiBvdGhlcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3N0cl9jb2RlKGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwICptYXAsIGxvbmcgY29kZSkKK3sgd2hpbGUgKG1hcC0+Y29kZSAhPSBjb2RlICYmIG1hcC0+c3RyaW5nKQorICAgIG1hcCsrOworICByZXR1cm4gbWFwLT5zdHJpbmc7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc29hcF93Y2hhcgorc29hcF9jaGFyKHN0cnVjdCBzb2FwICpzb2FwKQoreyBjaGFyIHRtcFs4XTsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgcmVnaXN0ZXIgY2hhciAqcyA9IHRtcDsKKyAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykKKyAgeyBjID0gc29hcF9nZXQxKHNvYXApOworICAgIGlmIChjID09ICc7JyB8fCAoaW50KWMgPT0gRU9GKQorICAgICAgYnJlYWs7CisgICAgKnMrKyA9IChjaGFyKWM7CisgIH0KKyAgKnMgPSAnXDAnOworICBpZiAoKnRtcCA9PSAnIycpCisgIHsgaWYgKHRtcFsxXSA9PSAneCcgfHwgdG1wWzFdID09ICdYJykKKyAgICAgIHJldHVybiBzb2FwX3N0cnRvbCh0bXAgKyAyLCBOVUxMLCAxNik7CisgICAgcmV0dXJuIGF0b2wodG1wICsgMSk7CisgIH0KKyAgaWYgKCFzdHJjbXAodG1wLCAibHQiKSkKKyAgICByZXR1cm4gJzwnOworICBpZiAoIXN0cmNtcCh0bXAsICJndCIpKQorICAgIHJldHVybiAnPic7CisgIGlmICghc3RyY21wKHRtcCwgImFtcCIpKQorICAgIHJldHVybiAnJic7CisgIGlmICghc3RyY21wKHRtcCwgInF1b3QiKSkKKyAgICByZXR1cm4gJyInOworICBpZiAoIXN0cmNtcCh0bXAsICJhcG9zIikpCisgICAgcmV0dXJuICdcJyc7CisjaWZuZGVmIFdJVEhfTEVBTgorICByZXR1cm4gKHNvYXBfd2NoYXIpc29hcF9pbnRfY29kZShodG1sX2VudGl0eV9jb2RlcywgdG1wLCBTT0FQX1VOS05PV05fQ0hBUik7CisjZWxzZQorICByZXR1cm4gU09BUF9VTktOT1dOX0NIQVI7IC8qIHVzZSB0aGlzIHRvIHJlcHJlc2VudCB1bmtub3duIGNvZGUgKi8KKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgV0lUSF9MRUFOCitzb2FwX3djaGFyCitzb2FwX2dldDAoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwLT5idWZpZHggPj0gc29hcC0+YnVmbGVuICYmIHNvYXBfcmVjdihzb2FwKSkKKyAgICByZXR1cm4gRU9GOworICByZXR1cm4gKHVuc2lnbmVkIGNoYXIpc29hcC0+YnVmW3NvYXAtPmJ1ZmlkeF07Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBXSVRIX0xFQU4KK3NvYXBfd2NoYXIKK3NvYXBfZ2V0MShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXAtPmJ1ZmlkeCA+PSBzb2FwLT5idWZsZW4gJiYgc29hcF9yZWN2KHNvYXApKQorICAgIHJldHVybiBFT0Y7CisgIHJldHVybiAodW5zaWduZWQgY2hhcilzb2FwLT5idWZbc29hcC0+YnVmaWR4KytdOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc29hcF93Y2hhcgorU09BUF9GTUFDMgorc29hcF9nZXQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgYyA9IHNvYXAtPmFoZWFkOworICBpZiAoYykKKyAgeyBpZiAoYyAhPSBFT0YpCisgICAgICBzb2FwLT5haGVhZCA9IDA7CisgIH0KKyAgZWxzZQorICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgIGZvciAoOzspCisgIHsgaWYgKHNvYXAtPmNkYXRhKQorICAgIHsgaWYgKGMgPT0gJ10nKQorICAgICAgeyBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgICBpZiAoYyA9PSAnXScpCisgICAgICAgIHsgc29hcC0+Y2RhdGEgPSAwOworICAgICAgICAgIHNvYXBfZ2V0MShzb2FwKTsgLyogc2tpcCA+ICovCisgICAgICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgICAgfQorCWVsc2UKKyAgICAgICAgeyBzb2FwX3JldmdldDEoc29hcCk7CisgICAgICAgICAgcmV0dXJuICddJzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gYzsKKyAgICB9CisgICAgc3dpdGNoIChjKQorICAgIHsgY2FzZSAnPCc6CisgICAgICAgIGRvIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICAgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyAgICAgICAgaWYgKGMgPT0gJyEnIHx8IGMgPT0gJz8nIHx8IGMgPT0gJyUnKQorICAgICAgICB7IHJlZ2lzdGVyIGludCBrID0gMTsKKwkgIGlmIChjID09ICchJykKKyAgICAgICAgICB7IGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICAgICAgICBpZiAoYyA9PSAnWycpCisgICAgICAgICAgICB7IGRvIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICAgICAgICAgIHdoaWxlICgoaW50KWMgIT0gRU9GICYmIGMgIT0gJ1snKTsKKyAgICAgICAgICAgICAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIHNvYXAtPmNkYXRhID0gMTsKKyAgICAgICAgICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKwkgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjID09ICctJyAmJiAoYyA9IHNvYXBfZ2V0MShzb2FwKSkgPT0gJy0nKQorICAgICAgICAgICAgeyBkbworICAgICAgICAgICAgICB7IGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJy0nICYmIChjID0gc29hcF9nZXQxKHNvYXApKSA9PSAnLScpCisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfSB3aGlsZSAoKGludCljICE9IEVPRik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCSAgZWxzZSBpZiAoYyA9PSAnPycpCisgICAgICAgICAgICBjID0gc29hcF9nZXRfcGkoc29hcCk7CisgICAgICAgICAgd2hpbGUgKChpbnQpYyAhPSBFT0YpCisgICAgICAgICAgeyBpZiAoYyA9PSAnPCcpCisJICAgICAgaysrOworCSAgICBlbHNlIGlmIChjID09ICc+JykKKwkgICAgeyBpZiAoLS1rIDw9IDApCisJICAgICAgICBicmVhazsKKwkgICAgfQorCSAgICBjID0gc29hcF9nZXQxKHNvYXApOworCSAgfQorCSAgaWYgKChpbnQpYyA9PSBFT0YpCisJICAgIGJyZWFrOworICAgICAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMgPT0gJy8nKQorICAgICAgICAgIHJldHVybiBTT0FQX1RUOworICAgICAgICBzb2FwX3JldmdldDEoc29hcCk7CisgICAgICAgIHJldHVybiBTT0FQX0xUOworICAgICAgY2FzZSAnPic6CisgICAgICAgIHJldHVybiBTT0FQX0dUOworICAgICAgY2FzZSAnIic6CisgICAgICAgIHJldHVybiBTT0FQX1FUOworICAgICAgY2FzZSAnXCcnOgorICAgICAgICByZXR1cm4gU09BUF9BUDsKKyAgICAgIGNhc2UgJyYnOgorICAgICAgICByZXR1cm4gc29hcF9jaGFyKHNvYXApIHwgMHg4MDAwMDAwMDsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIGM7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc29hcF93Y2hhcgorc29hcF9nZXRfcGkoc3RydWN0IHNvYXAgKnNvYXApCit7IGNoYXIgYnVmWzY0XTsKKyAgcmVnaXN0ZXIgY2hhciAqcyA9IGJ1ZjsKKyAgcmVnaXN0ZXIgaW50IGkgPSBzaXplb2YoYnVmKTsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICAvKiBUaGlzIGlzIGEgcXVpY2sgd2F5IHRvIHBhcnNlIFhNTCBQSSBhbmQgd2UgY291bGQgdXNlIGEgY2FsbGJhY2sgaW5zdGVhZCB0bworICAgKiBlbmFibGUgYXBwbGljYXRpb25zIHRvIGludGVyY2VwdCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyAqLworICB3aGlsZSAoKGludCljICE9IEVPRiAmJiBjICE9ICc/JykKKyAgeyBpZiAoLS1pID4gMCkKKyAgICB7IGlmIChzb2FwX2JsYW5rKGMpKQorICAgICAgICBjID0gJyAnOworICAgICAgKnMrKyA9IChjaGFyKWM7CisgICAgfQorICAgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgIH0KKyAgKnMgPSAnXDAnOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlhNTCBQSSA8PyVzPz5cbiIsIGJ1ZikpOworICBpZiAoIXN0cm5jbXAoYnVmLCAieG1sICIsIDQpKQorICB7IHMgPSBzdHJzdHIoYnVmLCAiIGVuY29kaW5nPSIpOworICAgIGlmIChzICYmIHNbMTBdKQorICAgIHsgaWYgKCFzb2FwX3RhZ19jbXAocyArIDExLCAiaXNvLTg4NTktMSoiKQorICAgICAgIHx8ICFzb2FwX3RhZ19jbXAocyArIDExLCAibGF0aW4xKiIpKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlN3aXRjaGluZyB0byBsYXRpbjEgZW5jb2RpbmdcbiIpKTsKKyAgICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19MQVRJTjsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAocyArIDExLCAidXRmLTgqIikpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU3dpdGNoaW5nIHRvIHV0Zi04IGVuY29kaW5nXG4iKSk7CisgICAgICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX0xBVElOOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoKGludCljICE9IEVPRikKKyAgICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICByZXR1cm4gYzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9tb3ZlKHN0cnVjdCBzb2FwICpzb2FwLCBsb25nIG4pCit7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTW92aW5nICVsZCBieXRlcyBmb3J3YXJkXG4iLCAobG9uZyluKSk7CisgIGZvciAoOyBuID4gMDsgbi0tKQorICAgIGlmICgoaW50KXNvYXBfZ2V0Y2hhcihzb2FwKSA9PSBFT0YpCisgICAgICByZXR1cm4gU09BUF9FT0Y7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzaXplX3QKK1NPQVBfRk1BQzIKK3NvYXBfdGVsbChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmV0dXJuIHNvYXAtPmNvdW50IC0gc29hcC0+YnVmbGVuICsgc29hcC0+YnVmaWR4IC0gKHNvYXAtPmFoZWFkICE9IDApOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0dXRmOChzdHJ1Y3Qgc29hcCAqc29hcCwgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBjKQoreyBjaGFyIHRtcFsxNl07CisgIGlmIChjID4gMCAmJiBjIDwgMHg4MCkKKyAgeyAqdG1wID0gKGNoYXIpYzsKKyAgICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCB0bXAsIDEpOworICB9CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgeyByZWdpc3RlciBjaGFyICp0ID0gdG1wOworICAgIGlmIChjIDwgMHgwODAwKQorICAgICAgKnQrKyA9IChjaGFyKSgweEMwIHwgKChjID4+IDYpICYgMHgxRikpOworICAgIGVsc2UKKyAgICB7IGlmIChjIDwgMHgwMTAwMDApCisgICAgICAgICp0KysgPSAoY2hhcikoMHhFMCB8ICgoYyA+PiAxMikgJiAweDBGKSk7CisgICAgICBlbHNlCisgICAgICB7IGlmIChjIDwgMHgyMDAwMDApCisgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEYwIHwgKChjID4+IDE4KSAmIDB4MDcpKTsKKyAgICAgICAgZWxzZQorICAgICAgICB7IGlmIChjIDwgMHgwNDAwMDAwMCkKKyAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhGOCB8ICgoYyA+PiAyNCkgJiAweDAzKSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsgKnQrKyA9IChjaGFyKSgweEZDIHwgKChjID4+IDMwKSAmIDB4MDEpKTsKKyAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAyNCkgJiAweDNGKSk7CisgICAgICAgICAgfQorICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAxOCkgJiAweDNGKSk7CisgICAgICAgIH0gICAgIAorICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTIpICYgMHgzRikpOworICAgICAgfQorICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDYpICYgMHgzRikpOworICAgIH0KKyAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoYyAmIDB4M0YpKTsKKyAgICAqdCA9ICdcMCc7CisgIH0KKyAgZWxzZQorI2VuZGlmCisgICAgc3ByaW50Zih0bXAsICImIyVsdTsiLCBjKTsKKyAgcmV0dXJuIHNvYXBfc2VuZChzb2FwLCB0bXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc29hcF93Y2hhcgorU09BUF9GTUFDMgorc29hcF9nZXR1dGY4KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzb2FwX3djaGFyIGMsIGMxLCBjMiwgYzMsIGM0OworICBjID0gc29hcC0+YWhlYWQ7CisgIGlmIChjID4gMHhGRikKKyAgeyBzb2FwLT5haGVhZCA9IDA7CisgICAgcmV0dXJuIGM7CisgIH0KK2FnYWluOgorICBjID0gc29hcF9nZXQoc29hcCk7CisgIGlmIChjIDwgMHg4MCB8fCAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0xBVElOKSkKKyAgICByZXR1cm4gYzsKKyAgYzEgPSBzb2FwX2dldDEoc29hcCk7CisgIGlmIChjMSA8IDB4ODApCisgIHsgc29hcF9yZXZnZXQxKHNvYXApOyAvKiBkb2Vzbid0IGxvb2sgbGlrZSB0aGlzIGlzIFVURjggKi8KKyAgICByZXR1cm4gYzsKKyAgfQorICBjMSAmPSAweDNGOworICBpZiAoYyA8IDB4RTApCisgICAgcmV0dXJuICgoc29hcF93Y2hhcikoYyAmIDB4MUYpIDw8IDYpIHwgYzE7CisgIGMyID0gKHNvYXBfd2NoYXIpc29hcF9nZXQxKHNvYXApICYgMHgzRjsKKyAgaWYgKGMgPT0gMHhFRiAmJiBjMSA9PSAweDNCICYmIGMyID09IDB4M0YpCS8qIGlnbm9yZSBVVEYtOCBCT00gKi8KKyAgICBnb3RvIGFnYWluOworICBpZiAoYyA8IDB4RjApCisgICAgcmV0dXJuICgoc29hcF93Y2hhcikoYyAmIDB4MEYpIDw8IDEyKSB8IChjMSA8PCA2KSB8IGMyOworICBjMyA9IChzb2FwX3djaGFyKXNvYXBfZ2V0MShzb2FwKSAmIDB4M0Y7CisgIGlmIChjIDwgMHhGOCkKKyAgICByZXR1cm4gKChzb2FwX3djaGFyKShjICYgMHgwNykgPDwgMTgpIHwgKGMxIDw8IDEyKSB8IChjMiA8PCA2KSB8IGMzOworICBjNCA9IChzb2FwX3djaGFyKXNvYXBfZ2V0MShzb2FwKSAmIDB4M0Y7CisgIGlmIChjIDwgMHhGQykKKyAgICByZXR1cm4gKChzb2FwX3djaGFyKShjICYgMHgwMykgPDwgMjQpIHwgKGMxIDw8IDE4KSB8IChjMiA8PCAxMikgfCAoYzMgPDwgNikgfCBjNDsKKyAgcmV0dXJuICgoc29hcF93Y2hhcikoYyAmIDB4MDEpIDw8IDMwKSB8IChjMSA8PCAyNCkgfCAoYzIgPDwgMTgpIHwgKGMzIDw8IDEyKSB8IChjNCA8PCA2KSB8IChzb2FwX3djaGFyKShzb2FwX2dldDEoc29hcCkgJiAweDNGKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRoZXgoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMsIGludCBuKQoreyBjaGFyIGRbMl07CisgIHJlZ2lzdGVyIGludCBpOworI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IGlmICghKHNvYXAtPmRvbS0+ZGF0YSA9IHNvYXBfczJoZXgoc29hcCwgcywgTlVMTCwgbikpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIHJldHVybiBTT0FQX09LOworICB9CisjZW5kaWYKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgeyByZWdpc3RlciBpbnQgbSA9ICpzKys7CisgICAgZFswXSA9IChjaGFyKSgobSA+PiA0KSArIChtID4gMTU5ID8gJzcnIDogJzAnKSk7CisgICAgbSAmPSAweDBGOworICAgIGRbMV0gPSAoY2hhcikobSArIChtID4gOSA/ICc3JyA6ICcwJykpOworICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIGQsIDIpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordW5zaWduZWQgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0aGV4KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgKm4pCit7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgc29hcC0+ZG9tLT5kYXRhID0gc29hcF9zdHJpbmdfaW4oc29hcCwgMCwgLTEsIC0xKTsKKyAgICByZXR1cm4gKHVuc2lnbmVkIGNoYXIqKXNvYXBfaGV4MnMoc29hcCwgc29hcC0+ZG9tLT5kYXRhLCBOVUxMLCAwLCBuKTsKKyAgfQorI2VuZGlmCisjaWZkZWYgV0lUSF9GQVNUCisgIHNvYXAtPmxhYmlkeCA9IDA7CisgIGZvciAoOzspCisgIHsgcmVnaXN0ZXIgY2hhciAqczsKKyAgICByZWdpc3RlciBpbnQgaSwgazsKKyAgICBpZiAoc29hcF9hcHBlbmRfbGFiKHNvYXAsIE5VTEwsIDApKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgcyA9IHNvYXAtPmxhYmJ1ZiArIHNvYXAtPmxhYmlkeDsKKyAgICBrID0gc29hcC0+bGFibGVuIC0gc29hcC0+bGFiaWR4OworICAgIHNvYXAtPmxhYmlkeCA9IHNvYXAtPmxhYmxlbjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgazsgaSsrKQorICAgIHsgcmVnaXN0ZXIgY2hhciBkMSwgZDI7CisgICAgICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgICAgICBjID0gc29hcF9nZXQoc29hcCk7CisgICAgICBpZiAoc29hcF9pc3hkaWdpdChjKSkKKyAgICAgIHsgZDEgPSAoY2hhciljOworICAgICAgICBjID0gc29hcF9nZXQoc29hcCk7IAorCWlmIChzb2FwX2lzeGRpZ2l0KGMpKQorICAgICAgICAgIGQyID0gKGNoYXIpYzsKKyAgICAgICAgZWxzZSAKKyAgICAgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyB1bnNpZ25lZCBjaGFyICpwOworICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICBpZiAobikKKyAgICAgICAgICAqbiA9IChpbnQpKHNvYXAtPmxhYmxlbiAtIGsgKyBpKTsKKyAgICAgICAgcCA9ICh1bnNpZ25lZCBjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzb2FwLT5sYWJsZW4gLSBrICsgaSk7CisJaWYgKHApCisJICBtZW1jcHkocCwgc29hcC0+bGFiYnVmLCBzb2FwLT5sYWJsZW4gLSBrICsgaSk7CisgICAgICAgIHJldHVybiBwOworICAgICAgfQorICAgICAgKnMrKyA9ICgoZDEgPj0gJ0EnID8gKGQxICYgMHg3KSArIDkgOiBkMSAtICcwJykgPDwgNCkgKyAoZDIgPj0gJ0EnID8gKGQyICYgMHg3KSArIDkgOiBkMiAtICcwJyk7CisgICAgfQorICB9CisjZWxzZQorICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgcmV0dXJuIE5VTEw7CisgIGZvciAoOzspCisgIHsgcmVnaXN0ZXIgaW50IGk7CisgICAgcmVnaXN0ZXIgY2hhciAqcyA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgU09BUF9CTEtMRU4pOworICAgIGlmICghcykKKyAgICB7IHNvYXBfZW5kX2Jsb2NrKHNvYXApOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0JMS0xFTjsgaSsrKQorICAgIHsgcmVnaXN0ZXIgY2hhciBkMSwgZDI7CisgICAgICByZWdpc3RlciBzb2FwX3djaGFyIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgICAgIGlmIChzb2FwX2lzeGRpZ2l0KGMpKQorICAgICAgeyBkMSA9IChjaGFyKWM7CisgICAgICAgIGMgPSBzb2FwX2dldChzb2FwKTsgCisJaWYgKHNvYXBfaXN4ZGlnaXQoYykpCisgICAgICAgICAgZDIgPSAoY2hhciljOworICAgICAgICBlbHNlIAorICAgICAgICB7IHNvYXBfZW5kX2Jsb2NrKHNvYXApOworCSAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgdW5zaWduZWQgY2hhciAqcDsKKyAgICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgaWYgKG4pCisgICAgICAgICAgKm4gPSBzb2FwX3NpemVfYmxvY2soc29hcCwgaSk7CisgICAgICAgIHAgPSAodW5zaWduZWQgY2hhciopc29hcF9zYXZlX2Jsb2NrKHNvYXAsIE5VTEwsIDApOworICAgICAgICByZXR1cm4gcDsKKyAgICAgIH0KKyAgICAgICpzKysgPSAoKGQxID49ICdBJyA/IChkMSAmIDB4NykgKyA5IDogZDEgLSAnMCcpIDw8IDQpICsgKGQyID49ICdBJyA/IChkMiAmIDB4NykgKyA5IDogZDIgLSAnMCcpOworICAgIH0KKyAgfQorI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0YmFzZTY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzLCBpbnQgbikKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbTsKKyAgY2hhciBkWzRdOworICBpZiAoIXMpCisgICAgcmV0dXJuIFNPQVBfT0s7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgaWYgKCEoc29hcC0+ZG9tLT5kYXRhID0gc29hcF9zMmJhc2U2NChzb2FwLCBzLCBOVUxMLCBuKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNlbmRpZgorICBmb3IgKDsgbiA+IDI7IG4gLT0gMywgcyArPSAzKQorICB7IG0gPSBzWzBdOworICAgIG0gPSAobSA8PCA4KSB8IHNbMV07CisgICAgbSA9IChtIDw8IDgpIHwgc1syXTsKKyAgICBmb3IgKGkgPSA0OyBpID4gMDsgbSA+Pj0gNikKKyAgICAgIGRbLS1pXSA9IHNvYXBfYmFzZTY0b1ttICYgMHgzRl07CisgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgZCwgNCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKG4gPiAwKQorICB7IG0gPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICBtID0gKG0gPDwgOCkgfCAqcysrOworICAgIGZvciAoOyBpIDwgMzsgaSsrKQorICAgICAgbSA8PD0gODsKKyAgICBmb3IgKGkrKzsgaSA+IDA7IG0gPj49IDYpCisgICAgICBkWy0taV0gPSBzb2FwX2Jhc2U2NG9bbSAmIDB4M0ZdOworICAgIGZvciAoaSA9IDM7IGkgPiBuOyBpLS0pCisgICAgICBkW2ldID0gJz0nOworICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIGQsIDQpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordW5zaWduZWQgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0YmFzZTY0KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgKm4sIGludCBtYWxsb2NfZmxhZykKK3sgCisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgc29hcC0+ZG9tLT5kYXRhID0gc29hcF9zdHJpbmdfaW4oc29hcCwgMCwgLTEsIC0xKTsKKyAgICByZXR1cm4gKHVuc2lnbmVkIGNoYXIqKXNvYXBfYmFzZTY0MnMoc29hcCwgc29hcC0+ZG9tLT5kYXRhLCBOVUxMLCAwLCBuKTsKKyAgfQorI2VuZGlmCisjaWZkZWYgV0lUSF9GQVNUCisgIHNvYXAtPmxhYmlkeCA9IDA7CisgIGZvciAoOzspCisgIHsgcmVnaXN0ZXIgaW50IGksIGs7CisgICAgcmVnaXN0ZXIgY2hhciAqczsKKyAgICBpZiAoc29hcF9hcHBlbmRfbGFiKHNvYXAsIE5VTEwsIDIpKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgcyA9IHNvYXAtPmxhYmJ1ZiArIHNvYXAtPmxhYmlkeDsKKyAgICBrID0gc29hcC0+bGFibGVuIC0gc29hcC0+bGFiaWR4OworICAgIHNvYXAtPmxhYmlkeCA9IDMgKiAoc29hcC0+bGFibGVuIC8gMyk7CisgICAgaWYgKCFzKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IGsgLSAyOyBpICs9IDMpCisgICAgeyByZWdpc3RlciB1bnNpZ25lZCBsb25nIG0gPSAwOworICAgICAgcmVnaXN0ZXIgaW50IGogPSAwOworICAgICAgZG8KKyAgICAgIHsgcmVnaXN0ZXIgc29hcF93Y2hhciBjID0gc29hcF9nZXQoc29hcCk7CisgICAgICAgIGlmIChjID09ICc9JyB8fCBjIDwgMCkKKyAgICAgICAgeyB1bnNpZ25lZCBjaGFyICpwOworICAgICAgICAgIHN3aXRjaCAoaikKKyAgICAgICAgICB7IGNhc2UgMjoKKyAgICAgICAgICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiA0KSAmIDB4RkYpOworICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAqcysrID0gKGNoYXIpKChtID4+IDEwKSAmIDB4RkYpOworICAgICAgICAgICAgICAqcysrID0gKGNoYXIpKChtID4+IDIpICYgMHhGRik7CisgICAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG4pCisgICAgICAgICAgICAqbiA9IChpbnQpKHNvYXAtPmxhYmxlbiAtIGsgKyBpKTsKKyAgICAgICAgICBwID0gKHVuc2lnbmVkIGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHNvYXAtPmxhYmxlbiAtIGsgKyBpKTsKKwkgIGlmIChwKQorCSAgICBtZW1jcHkocCwgc29hcC0+bGFiYnVmLCBzb2FwLT5sYWJsZW4gLSBrICsgaSk7CisgICAgICAgICAgaWYgKGMgPj0gMCkKKyAgICAgICAgICB7IHdoaWxlICgoaW50KSgoYyA9IHNvYXBfZ2V0KHNvYXApKSAhPSBFT0YpICYmIGMgIT0gU09BUF9MVCAmJiBjICE9IFNPQVBfVFQpCisgICAgICAgICAgICAgIDsKKwkgIH0KKyAgICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICAgIHJldHVybiBwOworICAgICAgICB9CisgICAgICAgIGMgLT0gJysnOworICAgICAgICBpZiAoYyA+PSAwICYmIGMgPD0gNzkpCisgICAgICAgIHsgbSA9IChtIDw8IDYpICsgc29hcF9iYXNlNjRpW2NdOworICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAoaiA8IDQpOworICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiAxNikgJiAweEZGKTsKKyAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gOCkgJiAweEZGKTsKKyAgICAgICpzKysgPSAoY2hhcikobSAmIDB4RkYpOworICAgIH0KKyAgfQorI2Vsc2UKKyAgaWYgKHNvYXBfbmV3X2Jsb2NrKHNvYXApKQorICAgIHJldHVybiBOVUxMOworICBmb3IgKDs7KQorICB7IHJlZ2lzdGVyIGludCBpOworICAgIHJlZ2lzdGVyIGNoYXIgKnMgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIDMgKiBTT0FQX0JMS0xFTik7IC8qIG11c3QgYmUgbXVsdGlwbGUgb2YgMyAqLworICAgIGlmICghcykKKyAgICB7IHNvYXBfZW5kX2Jsb2NrKHNvYXApOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0JMS0xFTjsgaSsrKQorICAgIHsgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBtID0gMDsKKyAgICAgIHJlZ2lzdGVyIGludCBqID0gMDsKKyAgICAgIGRvCisgICAgICB7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IHNvYXBfZ2V0KHNvYXApOworICAgICAgICBpZiAoYyA9PSAnPScgfHwgYyA8IDApCisgICAgICAgIHsgdW5zaWduZWQgY2hhciAqcDsKKyAgICAgICAgICBpICo9IDM7CisgICAgICAgICAgc3dpdGNoIChqKQorICAgICAgICAgIHsgY2FzZSAyOgorICAgICAgICAgICAgICAqcysrID0gKGNoYXIpKChtID4+IDQpICYgMHhGRik7CisgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gMTApICYgMHhGRik7CisgICAgICAgICAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gMikgJiAweEZGKTsKKyAgICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobikKKwkgICAgKm4gPSAoaW50KXNvYXBfc2l6ZV9ibG9jayhzb2FwLCBpKTsKKyAgICAgICAgICBwID0gKHVuc2lnbmVkIGNoYXIqKXNvYXBfc2F2ZV9ibG9jayhzb2FwLCBOVUxMLCAwKTsKKyAgICAgICAgICBpZiAoYyA+PSAwKQorICAgICAgICAgIHsgd2hpbGUgKChpbnQpKChjID0gc29hcF9nZXQoc29hcCkpICE9IEVPRikgJiYgYyAhPSBTT0FQX0xUICYmIGMgIT0gU09BUF9UVCkKKyAgICAgICAgICAgICAgOworCSAgfQorICAgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgIH0KKyAgICAgICAgYyAtPSAnKyc7CisgICAgICAgIGlmIChjID49IDAgJiYgYyA8PSA3OSkKKyAgICAgICAgeyBtID0gKG0gPDwgNikgKyBzb2FwX2Jhc2U2NGlbY107CisgICAgICAgICAgaisrOworICAgICAgICB9CisgICAgICB9IHdoaWxlIChqIDwgNCk7CisgICAgICAqcysrID0gKGNoYXIpKChtID4+IDE2KSAmIDB4RkYpOworICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiA4KSAmIDB4RkYpOworICAgICAgKnMrKyA9IChjaGFyKShtICYgMHhGRik7CisgICAgfQorICB9CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF94b3BfZm9yd2FyZChzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgY2hhciAqKnB0ciwgaW50ICpzaXplLCBjaGFyICoqaWQsIGNoYXIgKip0eXBlLCBjaGFyICoqb3B0aW9ucykKK3sgLyogQ2hlY2sgTVRPTSB4b3A6SW5jbHVkZSBlbGVtZW50ICh3aXRoaW4gaGV4L2Jhc2U2NEJpbmFyeSkgKi8KKyAgLyogVE9ETzogdGhpcyBjb2RlIHRvIGJlIG9ic29sZXRlZCB3aXRoIG5ldyBpbXBvcnQveG9wLmggY29udmVudGlvbnMgKi8KKyAgaW50IGJvZHkgPSBzb2FwLT5ib2R5OyAvKiBzaG91bGQgc2F2ZSB0eXBlIHRvbz8gKi8KKyAgaWYgKCFzb2FwX3BlZWtfZWxlbWVudChzb2FwKSkKKyAgeyBpZiAoIXNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCAieG9wOkluY2x1ZGUiLCAwKSAmJiAqc29hcC0+aHJlZikKKyAgICB7IGlmIChzb2FwX2RpbWVfZm9yd2FyZChzb2FwLCBwdHIsIHNpemUsIGlkLCB0eXBlLCBvcHRpb25zKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIE5VTEwpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHNvYXAtPmJvZHkgPSBib2R5OworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2RpbWVfZm9yd2FyZChzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgY2hhciAqKnB0ciwgaW50ICpzaXplLCBjaGFyICoqaWQsIGNoYXIgKip0eXBlLCBjaGFyICoqb3B0aW9ucykKK3sgc3RydWN0IHNvYXBfeGxpc3QgKnhwID0gKHN0cnVjdCBzb2FwX3hsaXN0KilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfeGxpc3QpKTsKKyAgKnB0ciA9IE5VTEw7CisgICpzaXplID0gMDsKKyAgKmlkID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+aHJlZik7CisgICp0eXBlID0gTlVMTDsKKyAgKm9wdGlvbnMgPSBOVUxMOworICBpZiAoIXhwKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICB4cC0+bmV4dCA9IHNvYXAtPnhsaXN0OworICB4cC0+cHRyID0gcHRyOworICB4cC0+c2l6ZSA9IHNpemU7CisgIHhwLT5pZCA9ICppZDsKKyAgeHAtPnR5cGUgPSB0eXBlOworICB4cC0+b3B0aW9ucyA9IG9wdGlvbnM7CisgIHNvYXAtPnhsaXN0ID0geHA7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfc3RyZHVwKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzKQoreyBjaGFyICp0ID0gTlVMTDsKKyAgaWYgKHMgJiYgKHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc3RybGVuKHMpICsgMSkpKQorICAgIHN0cmNweSh0LCBzKTsKKyAgcmV0dXJuIHQ7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfbmV3X2Jsb2NrKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9ibGlzdCAqcDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJOZXcgYmxvY2sgc2VxdWVuY2UgKHByZXY9JXApXG4iLCBzb2FwLT5ibGlzdCkpOworICBpZiAoIShwID0gKHN0cnVjdCBzb2FwX2JsaXN0KilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfYmxpc3QpKSkpCisgICAgcmV0dXJuIFNPQVBfRU9NOyAgIAorICBwLT5uZXh0ID0gc29hcC0+Ymxpc3Q7IAorICBwLT5wdHIgPSBOVUxMOworICBwLT5zaXplID0gMDsKKyAgc29hcC0+Ymxpc3QgPSBwOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQqCitTT0FQX0ZNQUMyCitzb2FwX3B1c2hfYmxvY2soc3RydWN0IHNvYXAgKnNvYXAsIHNpemVfdCBuKQoreyBjaGFyICpwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlB1c2ggYmxvY2sgb2YgJXUgYnl0ZXMgKCV1IGJ5dGVzIHRvdGFsKVxuIiwgKHVuc2lnbmVkIGludCluLCAodW5zaWduZWQgaW50KXNvYXAtPmJsaXN0LT5zaXplICsgKHVuc2lnbmVkIGludCluKSk7CisgIGlmICghKHAgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgbiArIHNpemVvZihjaGFyKikgKyBzaXplb2Yoc2l6ZV90KSkpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgKihjaGFyKiopcCA9IHNvYXAtPmJsaXN0LT5wdHI7CisgICooc2l6ZV90KikocCArIHNpemVvZihjaGFyKikpID0gbjsKKyAgc29hcC0+Ymxpc3QtPnB0ciA9IHA7CisgIHNvYXAtPmJsaXN0LT5zaXplICs9IG47CisgIHJldHVybiBwICsgc2l6ZW9mKGNoYXIqKSArIHNpemVvZihzaXplX3QpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9wb3BfYmxvY2soc3RydWN0IHNvYXAgKnNvYXApCit7IGNoYXIgKnA7CisgIGlmICghc29hcC0+Ymxpc3QtPnB0cikKKyAgICByZXR1cm47CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUG9wIGJsb2NrXG4iKSk7CisgIHAgPSBzb2FwLT5ibGlzdC0+cHRyOworICBzb2FwLT5ibGlzdC0+c2l6ZSAtPSAqKHNpemVfdCopKHAgKyBzaXplb2YoY2hhciopKTsKKyAgc29hcC0+Ymxpc3QtPnB0ciA9ICooY2hhcioqKXA7CisgIFNPQVBfRlJFRShzb2FwLCBwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZAorc29hcF91cGRhdGVfcHRycyhzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqc3RhcnQsIGNoYXIgKmVuZCwgY2hhciAqcDEsIGNoYXIgKnAyKQoreyBpbnQgaTsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9mbGlzdCAqZnA7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3hsaXN0ICp4cDsKKyNlbmRpZgorICByZWdpc3RlciB2b2lkICpwLCAqKnE7CisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0lESEFTSDsgaSsrKQorICB7IGZvciAoaXAgPSBzb2FwLT5paHRbaV07IGlwOyBpcCA9IGlwLT5uZXh0KQorICAgIHsgaWYgKGlwLT5wdHIgJiYgKGNoYXIqKWlwLT5wdHIgPj0gc3RhcnQgJiYgKGNoYXIqKWlwLT5wdHIgPCBlbmQpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVXBkYXRlIGlkPSclcycgJXAgLT4gJXBcbiIsIGlwLT5pZCwgaXAtPnB0ciwgKGNoYXIqKWlwLT5wdHIgKyAocDEtcDIpKSk7CisgICAgICAgIGlwLT5wdHIgPSAoY2hhciopaXAtPnB0ciArIChwMS1wMik7CisgICAgICB9CisgICAgICBmb3IgKHEgPSAmaXAtPmxpbms7IHE7IHEgPSAodm9pZCoqKXApCisgICAgICB7IHAgPSAqcTsKKyAgICAgICAgaWYgKHAgJiYgKGNoYXIqKXAgPj0gc3RhcnQgJiYgKGNoYXIqKXAgPCBlbmQpCisgICAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJMaW5rIHVwZGF0ZSBpZD0nJXMnICVwXG4iLCBpcC0+aWQsIHApKTsKKyAgICAgICAgICAqcSA9IChjaGFyKilwICsgKHAxLXAyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZm9yIChxID0gJmlwLT5jb3B5OyBxOyBxID0gKHZvaWQqKilwKQorICAgICAgeyBwID0gKnE7CisgICAgICAgIGlmIChwICYmIChjaGFyKilwID49IHN0YXJ0ICYmIChjaGFyKilwIDwgZW5kKQorICAgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weSBjaGFpbiB1cGRhdGUgaWQ9JyVzJyAlcFxuIiwgaXAtPmlkLCBwKSk7CisgICAgICAgICAgKnEgPSAoY2hhciopcCArIChwMS1wMik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZvciAoZnAgPSBpcC0+Zmxpc3Q7IGZwOyBmcCA9IGZwLT5uZXh0KQorICAgICAgeyBpZiAoKGNoYXIqKWZwLT5wdHIgPj0gc3RhcnQgJiYgKGNoYXIqKWZwLT5wdHIgPCBlbmQpCisgICAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5IGxpc3QgdXBkYXRlIGlkPSclcycgJXBcbiIsIGlwLT5pZCwgZnApKTsKKyAgICAgICAgICBmcC0+cHRyID0gKGNoYXIqKWZwLT5wdHIgKyAocDEtcDIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGZvciAoeHAgPSBzb2FwLT54bGlzdDsgeHA7IHhwID0geHAtPm5leHQpCisgIHsgaWYgKHhwLT5wdHIgJiYgKGNoYXIqKXhwLT5wdHIgPj0gc3RhcnQgJiYgKGNoYXIqKXhwLT5wdHIgPCBlbmQpCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVwZGF0ZSBpZD0nJXMnICVwIC0+ICVwXG4iLCB4cC0+aWQ/eHAtPmlkOiIiLCB4cC0+cHRyLCAoY2hhciopeHAtPnB0ciArIChwMS1wMikpKTsKKyAgICAgIHhwLT5wdHIgPSAodW5zaWduZWQgY2hhcioqKSgoY2hhciopeHAtPnB0ciArIChwMS1wMikpOworICAgICAgeHAtPnNpemUgPSAoaW50KikoKGNoYXIqKXhwLT5zaXplICsgKHAxLXAyKSk7CisgICAgICB4cC0+dHlwZSA9IChjaGFyKiopKChjaGFyKil4cC0+dHlwZSArIChwMS1wMikpOworICAgICAgeHAtPm9wdGlvbnMgPSAoY2hhcioqKSgoY2hhciopeHAtPm9wdGlvbnMgKyAocDEtcDIpKTsKKyAgICB9CisgIH0KKyNlbmRpZgorfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc29hcF9oYXNfY29waWVzKHN0cnVjdCBzb2FwICpzb2FwLCByZWdpc3RlciBjb25zdCBjaGFyICpzdGFydCwgcmVnaXN0ZXIgY29uc3QgY2hhciAqZW5kKQoreyByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9mbGlzdCAqZnA7CisgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnA7CisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0lESEFTSDsgaSsrKQorICB7IGZvciAoaXAgPSBzb2FwLT5paHRbaV07IGlwOyBpcCA9IGlwLT5uZXh0KQorICAgIHsgZm9yIChwID0gKGNvbnN0IGNoYXIqKWlwLT5jb3B5OyBwOyBwID0gKihjb25zdCBjaGFyKiopcCkKKyAgICAgICAgaWYgKHAgPj0gc3RhcnQgJiYgcCA8IGVuZCkKKyAgICAgICAgICByZXR1cm4gU09BUF9FUlI7CisgICAgICBmb3IgKGZwID0gaXAtPmZsaXN0OyBmcDsgZnAgPSBmcC0+bmV4dCkKKyAgICAgICAgaWYgKChjb25zdCBjaGFyKilmcC0+cHRyID49IHN0YXJ0ICYmIChjb25zdCBjaGFyKilmcC0+cHRyIDwgZW5kKQorCSAgcmV0dXJuIFNPQVBfRVJSOworICAgIH0KKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZXNvbHZlKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9mbGlzdCAqZnA7CisgIHNob3J0IGZsYWc7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x2aW5nIGZvcndhcmRlZCBkYXRhXG4iKSk7CisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0lESEFTSDsgaSsrKQorICB7IGZvciAoaXAgPSBzb2FwLT5paHRbaV07IGlwOyBpcCA9IGlwLT5uZXh0KQorICAgIHsgaWYgKGlwLT5wdHIpCisgICAgICB7IHJlZ2lzdGVyIHZvaWQgKnAsICoqcSwgKnI7CisgICAgICAgIHEgPSAodm9pZCoqKWlwLT5saW5rOworICAgICAgICBpcC0+bGluayA9IE5VTEw7CisgICAgICAgIHIgPSBpcC0+cHRyOworICAgICAgICBEQkdMT0coVEVTVCwgaWYgKHEpIFNPQVBfTUVTU0FHRShmZGVidWcsICJUcmF2ZXJzaW5nIGxpbmsgY2hhaW4gdG8gcmVzb2x2ZSBpZD0nJXMnXG4iLCBpcC0+aWQpKTsKKyAgICAgICAgd2hpbGUgKHEpCisgICAgICAgIHsgcCA9ICpxOworICAgICAgICAgICpxID0gcjsKKyAgICAgICAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiLi4uIGxpbmsgJXAgLT4gJXBcbiIsIHEsIHIpKTsKKyAgICAgICAgICBxID0gKHZvaWQqKilwOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmICgqaXAtPmlkID09ICcjJykKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJNaXNzaW5nIGRhdGEgZm9yIGlkPSclcydcbiIsIGlwLT5pZCkpOworICAgICAgICBzdHJjcHkoc29hcC0+aWQsIGlwLT5pZCArIDEpOworICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX01JU1NJTkdfSUQ7CisgICAgICB9CisgICAgfQorICB9CisgIGRvCisgIHsgZmxhZyA9IDA7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHV0aW9uIHBoYXNlXG4iKSk7CisgICAgZm9yIChpID0gMDsgaSA8IFNPQVBfSURIQVNIOyBpKyspCisgICAgeyBmb3IgKGlwID0gc29hcC0+aWh0W2ldOyBpcDsgaXAgPSBpcC0+bmV4dCkKKyAgICAgIHsgaWYgKGlwLT5wdHIgJiYgIXNvYXBfaGFzX2NvcGllcyhzb2FwLCAoY29uc3QgY2hhciopaXAtPnB0ciwgKGNvbnN0IGNoYXIqKWlwLT5wdHIgKyBpcC0+c2l6ZSkpCisgICAgICAgIHsgaWYgKGlwLT5jb3B5KQorICAgICAgICAgIHsgcmVnaXN0ZXIgdm9pZCAqcCwgKipxID0gKHZvaWQqKilpcC0+Y29weTsKKyAgICAgICAgICAgIERCR0xPRyhURVNULCBpZiAocSkgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlRyYXZlcnNpbmcgY29weSBjaGFpbiB0byByZXNvbHZlIGlkPSclcydcbiIsIGlwLT5pZCkpOworICAgICAgICAgICAgaXAtPmNvcHkgPSBOVUxMOworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIuLi4gY29weSAlcCAtPiAlcCAoJXUgYnl0ZXMpXG4iLCBpcC0+cHRyLCBxLCAodW5zaWduZWQgaW50KWlwLT5zaXplKSk7CisJICAgICAgcCA9ICpxOworICAgICAgICAgICAgICBtZW1jcHkocSwgaXAtPnB0ciwgaXAtPnNpemUpOworICAgICAgICAgICAgICBxID0gKHZvaWQqKilwOworICAgICAgICAgICAgfSB3aGlsZSAocSk7CisJICAgIGZsYWcgPSAxOworCSAgfQorICAgICAgICAgIGZvciAoZnAgPSBpcC0+Zmxpc3Q7IGZwOyBmcCA9IGlwLT5mbGlzdCkKKyAgICAgICAgICB7IHJlZ2lzdGVyIHVuc2lnbmVkIGludCBrID0gZnAtPmxldmVsOworCSAgICByZWdpc3RlciB2b2lkICpwID0gaXAtPnB0cjsKKyAgICAgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x2aW5nIGZvcndhcmRlZCBkYXRhIHR5cGU9JWQgbG9jYXRpb249JXAgbGV2ZWw9JXUsJXUgaWQ9JyVzJ1xuIiwgaXAtPnR5cGUsIHAsIGlwLT5sZXZlbCwgZnAtPmxldmVsLCBpcC0+aWQpKTsKKwkgICAgd2hpbGUgKGlwLT5sZXZlbCA8IGspCisgICAgICAgICAgICB7IHJlZ2lzdGVyIHZvaWQgKipxID0gKHZvaWQqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yodm9pZCopKTsgIAorCSAgICAgIGlmICghcSkKKwkgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKwkgICAgICAqcSA9IHA7CisgICAgICAgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVzY2VuZGluZyBvbmUgbGV2ZWwsIG5ldyBsb2NhdGlvbj0lcCBob2xkcz0lcC4uLlxuIiwgcSwgKnEpKTsKKyAgICAgICAgICAgICAgcCA9ICh2b2lkKilxOworICAgICAgICAgICAgICBrLS07CisgICAgICAgICAgICB9CisJICAgIGlmIChmcC0+ZmNvcHkpCisJICAgICAgZnAtPmZjb3B5KHNvYXAsIGlwLT50eXBlLCBmcC0+dHlwZSwgZnAtPnB0ciwgZnAtPmxlbiwgcCwgaXAtPnNpemUpOworCSAgICBlbHNlCisJICAgICAgc29hcF9mY29weShzb2FwLCBpcC0+dHlwZSwgZnAtPnR5cGUsIGZwLT5wdHIsIGZwLT5sZW4sIHAsIGlwLT5zaXplKTsKKwkgICAgaXAtPmZsaXN0ID0gZnAtPm5leHQ7CisJICAgIFNPQVBfRlJFRShzb2FwLCBmcCk7CisJICAgIGZsYWcgPSAxOworCSAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9IHdoaWxlIChmbGFnKTsKKyNpZmRlZiBTT0FQX0RFQlVHCisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0lESEFTSDsgaSsrKQorICB7IGZvciAoaXAgPSBzb2FwLT5paHRbaV07IGlwOyBpcCA9IGlwLT5uZXh0KQorICAgIHsgaWYgKGlwLT5jb3B5IHx8IGlwLT5mbGlzdCkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHV0aW9uIGVycm9yOiBmb3J3YXJkZWQgZGF0YSBmb3IgaWQ9JyVzJyBjb3VsZCBub3QgYmUgcHJvcGFnYXRlZCwgcGxlYXNlIHJlcG9ydCB0aGlzIHByb2JsZW0gdG8gdGhlIGRldmVsb3BlcnNcbiIsIGlwLT5pZCkpOworICAgICAgfQorICAgIH0KKyAgfQorI2VuZGlmCisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x1dGlvbiBkb25lXG4iKSk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzaXplX3QKK1NPQVBfRk1BQzIKK3NvYXBfc2l6ZV9ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCwgc2l6ZV90IG4pCit7IGlmIChzb2FwLT5ibGlzdC0+cHRyKQorICB7IHNvYXAtPmJsaXN0LT5zaXplIC09ICooc2l6ZV90Kikoc29hcC0+Ymxpc3QtPnB0ciArIHNpemVvZihjaGFyKikpIC0gbjsKKyAgICAqKHNpemVfdCopKHNvYXAtPmJsaXN0LT5wdHIgKyBzaXplb2YoY2hhciopKSA9IG47CisgIH0KKyAgcmV0dXJuIHNvYXAtPmJsaXN0LT5zaXplOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZmlyc3RfYmxvY2soc3RydWN0IHNvYXAgKnNvYXApCit7IGNoYXIgKnAsICpxLCAqcjsKKyAgcCA9IHNvYXAtPmJsaXN0LT5wdHI7CisgIGlmICghcCkKKyAgICByZXR1cm4gTlVMTDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGaXJzdCBibG9ja1xuIikpOworICByID0gTlVMTDsKKyAgZG8KKyAgeyBxID0gKihjaGFyKiopcDsKKyAgICAqKGNoYXIqKilwID0gcjsKKyAgICByID0gcDsKKyAgICBwID0gcTsKKyAgfSB3aGlsZSAocCk7CisgIHNvYXAtPmJsaXN0LT5wdHIgPSByOworICByZXR1cm4gciArIHNpemVvZihjaGFyKikgKyBzaXplb2Yoc2l6ZV90KTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NoYXIqCitTT0FQX0ZNQUMyCitzb2FwX25leHRfYmxvY2soc3RydWN0IHNvYXAgKnNvYXApCit7IGNoYXIgKnA7CisgIHAgPSBzb2FwLT5ibGlzdC0+cHRyOworICBpZiAocCkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk5leHQgYmxvY2tcbiIpKTsKKyAgICBzb2FwLT5ibGlzdC0+cHRyID0gKihjaGFyKiopcDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgcCk7CisgICAgaWYgKHNvYXAtPmJsaXN0LT5wdHIpCisgICAgICByZXR1cm4gc29hcC0+Ymxpc3QtPnB0ciArIHNpemVvZihjaGFyKikgKyBzaXplb2Yoc2l6ZV90KTsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3NpemVfdAorU09BUF9GTUFDMgorc29hcF9ibG9ja19zaXplKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZXR1cm4gKihzaXplX3QqKShzb2FwLT5ibGlzdC0+cHRyICsgc2l6ZW9mKGNoYXIqKSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2VuZF9ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfYmxpc3QgKmJwOworICBjaGFyICpwLCAqcTsKKyAgYnAgPSBzb2FwLT5ibGlzdDsKKyAgaWYgKGJwKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIG9mIGJsb2NrIHNlcXVlbmNlLCBmcmVlIGFsbCByZW1haW5pbmcgYmxvY2tzXG4iKSk7CisgICAgZm9yIChwID0gYnAtPnB0cjsgcDsgcCA9IHEpCisgICAgeyBxID0gKihjaGFyKiopcDsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBwKTsKKyAgICB9CisgICAgc29hcC0+Ymxpc3QgPSBicC0+bmV4dDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgYnApOworICB9CisgIERCR0xPRyhURVNULCBpZiAoc29hcC0+Ymxpc3QpIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXN0b3JlIHByZXZpb3VzIGJsb2NrIHNlcXVlbmNlXG4iKSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjaGFyKgorU09BUF9GTUFDMgorc29hcF9zYXZlX2Jsb2NrKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpwLCBpbnQgZmxhZykKK3sgcmVnaXN0ZXIgc2l6ZV90IG47CisgIHJlZ2lzdGVyIGNoYXIgKnEsICpzOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNhdmUgYWxsIGJsb2NrcyBpbiBjb250aWd1b3VzIG1lbW9yeSBzcGFjZSBvZiAldSBieXRlcyAoJXAtPiVwKVxuIiwgKHVuc2lnbmVkIGludClzb2FwLT5ibGlzdC0+c2l6ZSwgc29hcC0+Ymxpc3QtPnB0ciwgcCkpOworICBpZiAoc29hcC0+Ymxpc3QtPnNpemUpCisgIHsgaWYgKCFwKQorICAgICAgcCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzb2FwLT5ibGlzdC0+c2l6ZSk7CisgICAgaWYgKHApCisgICAgeyBmb3IgKHMgPSBwLCBxID0gc29hcF9maXJzdF9ibG9jayhzb2FwKTsgcTsgcSA9IHNvYXBfbmV4dF9ibG9jayhzb2FwKSkKKyAgICAgIHsgbiA9IHNvYXBfYmxvY2tfc2l6ZShzb2FwKTsKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgICAgICAgIGlmIChmbGFnKQorCSAgc29hcF91cGRhdGVfcHRycyhzb2FwLCBxLCBxICsgbiwgcywgcSk7CisjZW5kaWYKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5ICV1IGJ5dGVzIGZyb20gJXAgdG8gJXBcbiIsICh1bnNpZ25lZCBpbnQpbiwgcSwgcykpOworICAgICAgICBtZW1jcHkocywgcSwgbik7CisgICAgICAgIHMgKz0gbjsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgfQorICBzb2FwX2VuZF9ibG9jayhzb2FwKTsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfcHV0c2l6ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHNpemUpCit7IHJldHVybiBzb2FwX3B1dHNpemVzKHNvYXAsIHR5cGUsICZzaXplLCAxKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9wdXRzaXplcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgaW50ICpzaXplLCBpbnQgZGltKQoreyByZXR1cm4gc29hcF9wdXRzaXplc29mZnNldHMoc29hcCwgdHlwZSwgc2l6ZSwgTlVMTCwgZGltKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9wdXRzaXplc29mZnNldHMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGludCAqc2l6ZSwgY29uc3QgaW50ICpvZmZzZXQsIGludCBkaW0pCit7IGludCBpOworICBpZiAoIXR5cGUpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgIHsgc3ByaW50Zihzb2FwLT50eXBlLCAiJXNbJWQiLCB0eXBlLCBzaXplWzBdKTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgZGltOyBpKyspCisgICAgICBzcHJpbnRmKHNvYXAtPnR5cGUgKyBzdHJsZW4oc29hcC0+dHlwZSksICIgJWQiLCBzaXplW2ldKTsKKyAgfQorICBlbHNlCisgIHsgaWYgKG9mZnNldCkKKyAgICB7IHNwcmludGYoc29hcC0+dHlwZSwgIiVzWyVkIiwgdHlwZSwgc2l6ZVswXSArIG9mZnNldFswXSk7CisgICAgICBmb3IgKGkgPSAxOyBpIDwgZGltOyBpKyspCisgICAgICAgIHNwcmludGYoc29hcC0+dHlwZSArIHN0cmxlbihzb2FwLT50eXBlKSwgIiwlZCIsIHNpemVbaV0gKyBvZmZzZXRbaV0pOworICAgIH0KKyAgICBlbHNlCisgICAgeyBzcHJpbnRmKHNvYXAtPnR5cGUsICIlc1slZCIsIHR5cGUsIHNpemVbMF0pOworICAgICAgZm9yIChpID0gMTsgaSA8IGRpbTsgaSsrKQorICAgICAgICBzcHJpbnRmKHNvYXAtPnR5cGUgKyBzdHJsZW4oc29hcC0+dHlwZSksICIsJWQiLCBzaXplW2ldKTsKKyAgICB9CisgICAgc3RyY2F0KHNvYXAtPnR5cGUsICJdIik7CisgIH0KKyAgcmV0dXJuIHNvYXAtPnR5cGU7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfcHV0b2Zmc2V0KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgb2Zmc2V0KQoreyByZXR1cm4gc29hcF9wdXRvZmZzZXRzKHNvYXAsICZvZmZzZXQsIDEpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3B1dG9mZnNldHMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGludCAqb2Zmc2V0LCBpbnQgZGltKQoreyByZWdpc3RlciBpbnQgaTsKKyAgc3ByaW50Zihzb2FwLT5hcnJheU9mZnNldCwgIlslZCIsIG9mZnNldFswXSk7CisgIGZvciAoaSA9IDE7IGkgPCBkaW07IGkrKykKKyAgICBzcHJpbnRmKHNvYXAtPmFycmF5T2Zmc2V0ICsgc3RybGVuKHNvYXAtPmFycmF5T2Zmc2V0KSwgIiwlZCIsIG9mZnNldFtpXSk7CisgIHN0cmNhdChzb2FwLT5hcnJheU9mZnNldCwgIl0iKTsKKyAgcmV0dXJuIHNvYXAtPmFycmF5T2Zmc2V0OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NpemUoY29uc3QgaW50ICpzaXplLCBpbnQgZGltKQoreyByZWdpc3RlciBpbnQgaSwgbiA9IHNpemVbMF07CisgIGZvciAoaSA9IDE7IGkgPCBkaW07IGkrKykKKyAgICBuICo9IHNpemVbaV07CisgIHJldHVybiBuOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldG9mZnNldHMoY29uc3QgY2hhciAqYXR0ciwgY29uc3QgaW50ICpzaXplLCBpbnQgKm9mZnNldCwgaW50IGRpbSkKK3sgcmVnaXN0ZXIgaW50IGksIGogPSAwOworICBpZiAob2Zmc2V0KQorICAgIGZvciAoaSA9IDA7IGkgPCBkaW0gJiYgYXR0ciAmJiAqYXR0cjsgaSsrKQorICAgIHsgYXR0cisrOworICAgICAgaiAqPSBzaXplW2ldOworICAgICAgaiArPSBvZmZzZXRbaV0gPSAoaW50KWF0b2woYXR0cik7CisgICAgICBhdHRyID0gc3RyY2hyKGF0dHIsICcsJyk7CisgICAgfQorICBlbHNlCisgICAgZm9yIChpID0gMDsgaSA8IGRpbSAmJiBhdHRyICYmICphdHRyOyBpKyspCisgICAgeyBhdHRyKys7CisgICAgICBqICo9IHNpemVbaV07CisgICAgICBqICs9IChpbnQpYXRvbChhdHRyKTsKKyAgICAgIGF0dHIgPSBzdHJjaHIoYXR0ciwgJywnKTsKKyAgICB9CisgIHJldHVybiBqOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldHNpemUoY29uc3QgY2hhciAqYXR0cjEsIGNvbnN0IGNoYXIgKmF0dHIyLCBpbnQgKmopCit7IHJlZ2lzdGVyIGludCBuLCBrOworICBjaGFyICpzOworICAqaiA9IDA7CisgIGlmICghKmF0dHIxKQorICAgIHJldHVybiAtMTsKKyAgaWYgKCphdHRyMSA9PSAnWycpCisgICAgYXR0cjErKzsKKyAgbiA9IDE7CisgIGZvciAoOzspCisgIHsgayA9IChpbnQpc29hcF9zdHJ0b2woYXR0cjEsICZzLCAxMCk7CisgICAgbiAqPSBrOworICAgIGlmIChrIDwgMCB8fCBuID4gU09BUF9NQVhBUlJBWVNJWkUgfHwgcyA9PSBhdHRyMSkKKyAgICAgIHJldHVybiAtMTsKKyAgICBhdHRyMSA9IHN0cmNocihzLCAnLCcpOworICAgIGlmICghYXR0cjEpCisgICAgICBhdHRyMSA9IHN0cmNocihzLCAnICcpOworICAgIGlmIChhdHRyMiAmJiAqYXR0cjIpCisgICAgeyBhdHRyMisrOworICAgICAgKmogKj0gazsKKyAgICAgIGsgPSAoaW50KXNvYXBfc3RydG9sKGF0dHIyLCAmcywgMTApOworICAgICAgKmogKz0gazsKKyAgICAgIGlmIChrIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgYXR0cjIgPSBzOworICAgIH0KKyAgICBpZiAoIWF0dHIxKQorICAgICAgYnJlYWs7CisgICAgYXR0cjErKzsKKyAgfQorICByZXR1cm4gbiAtICpqOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldHNpemVzKGNvbnN0IGNoYXIgKmF0dHIsIGludCAqc2l6ZSwgaW50IGRpbSkKK3sgcmVnaXN0ZXIgaW50IGksIGssIG47CisgIGlmICghKmF0dHIpCisgICAgcmV0dXJuIC0xOworICBpID0gc3RybGVuKGF0dHIpOworICBuID0gMTsKKyAgZG8KKyAgeyBmb3IgKGkgPSBpLTE7IGkgPj0gMDsgaS0tKQorICAgICAgaWYgKGF0dHJbaV0gPT0gJ1snIHx8IGF0dHJbaV0gPT0gJywnIHx8IGF0dHJbaV0gPT0gJyAnKQorICAgICAgICBicmVhazsKKyAgICBrID0gKGludClhdG9sKGF0dHIgKyBpICsgMSk7CisgICAgbiAqPSBzaXplWy0tZGltXSA9IGs7CisgICAgaWYgKGsgPCAwIHx8IG4gPiBTT0FQX01BWEFSUkFZU0laRSkKKyAgICAgIHJldHVybiAtMTsKKyAgfSB3aGlsZSAoaSA+PSAwICYmIGF0dHJbaV0gIT0gJ1snKTsKKyAgcmV0dXJuIG47Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0cG9zaXRpb24oY29uc3QgY2hhciAqYXR0ciwgaW50ICpwb3MpCit7IHJlZ2lzdGVyIGludCBpLCBuOworICBpZiAoISphdHRyKQorICAgIHJldHVybiAtMTsKKyAgbiA9IDA7CisgIGkgPSAxOworICBkbworICB7IHBvc1tuKytdID0gKGludClhdG9sKGF0dHIgKyBpKTsKKyAgICB3aGlsZSAoYXR0cltpXSAmJiBhdHRyW2ldICE9ICcsJyAmJiBhdHRyW2ldICE9ICddJykKKyAgICAgIGkrKzsKKyAgICBpZiAoYXR0cltpXSA9PSAnLCcpCisgICAgICBpKys7CisgIH0gd2hpbGUgKG4gPCBTT0FQX01BWERJTVMgJiYgYXR0cltpXSAmJiBhdHRyW2ldICE9ICddJyk7CisgIHJldHVybiBuOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1c2hfbmFtZXNwYWNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqbnMpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucDsKKyAgcmVnaXN0ZXIgc3RydWN0IE5hbWVzcGFjZSAqcDsKKyAgcmVnaXN0ZXIgc2hvcnQgaSA9IC0xOworICByZWdpc3RlciBzaXplX3QgbiwgazsKKyAgbiA9IHN0cmxlbihpZCk7CisgIGsgPSBzdHJsZW4obnMpICsgMTsKKyAgcCA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXM7CisgIGlmIChwKQorICB7IGZvciAoaSA9IDA7IHAtPmlkOyBwKyssIGkrKykKKyAgICB7IGlmIChwLT5ucyAmJiAhc3RyY21wKG5zLCBwLT5ucykpCisgICAgICB7IGlmIChwLT5vdXQpCisgICAgICAgIHsgU09BUF9GUkVFKHNvYXAsIHAtPm91dCk7CisgICAgICAgICAgcC0+b3V0ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChwLT5vdXQpCisgICAgICB7IGlmICghc3RyY21wKG5zLCBwLT5vdXQpKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZWxzZSBpZiAocC0+aW4pCisgICAgICB7IGlmICghc29hcF90YWdfY21wKG5zLCBwLT5pbikpCisgICAgICAgIHsgaWYgKChwLT5vdXQgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgaykpKQorICAgICAgICAgICAgc3RyY3B5KHAtPm91dCwgbnMpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmICghcCB8fCAhcC0+aWQpCisgICAgICBpID0gLTE7CisgIH0KKyAgaWYgKGkgPj0gMCkKKyAgICBrID0gMDsKKyAgbnAgPSAoc3RydWN0IHNvYXBfbmxpc3QqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9ubGlzdCkgKyBuICsgayk7CisgIGlmICghbnApCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgIG5wLT5uZXh0ID0gc29hcC0+bmxpc3Q7CisgIHNvYXAtPm5saXN0ID0gbnA7CisgIG5wLT5sZXZlbCA9IHNvYXAtPmxldmVsOworICBucC0+aW5kZXggPSBpOworICBzdHJjcHkobnAtPmlkLCBpZCk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUHVzaCBuYW1lc3BhY2UgYmluZGluZyAobGV2ZWw9JXUpICclcycgJyVzJ1xuIiwgc29hcC0+bGV2ZWwsIGlkLCBucykpOworICBpZiAoaSA8IDApCisgIHsgbnAtPm5zID0gbnAtPmlkICsgbiArIDE7CisgICAgc3RyY3B5KG5wLT5ucywgbnMpOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUHVzaCBOT1QgT0s6IG5vIG1hdGNoIGZvdW5kIGZvciAnJXMnIGluIG5hbWVzcGFjZSBtYXBwaW5nIHRhYmxlIChhZGRlZCB0byBzdGFjayBhbnl3YXkpXG4iLCBucykpOworICB9CisgIGVsc2UKKyAgeyBucC0+bnMgPSBOVUxMOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUHVzaCBPSyAoJyVzJyBtYXRjaGVzICclcycgaW4gbmFtZXNwYWNlIHRhYmxlKVxuIiwgaWQsIHAtPmlkKSk7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3BvcF9uYW1lc3BhY2Uoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucDsKKyAgd2hpbGUgKHNvYXAtPm5saXN0ICYmIHNvYXAtPm5saXN0LT5sZXZlbCA+PSBzb2FwLT5sZXZlbCkKKyAgeyBucCA9IHNvYXAtPm5saXN0LT5uZXh0OworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUG9wcGVkIG5hbWVzcGFjZSBiaW5kaW5nIChsZXZlbD0ldSkgJyVzJ1xuIiwgc29hcC0+bGV2ZWwsIHNvYXAtPm5saXN0LT5pZCkpOworICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5ubGlzdCk7CisgICAgc29hcC0+bmxpc3QgPSBucDsKKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX21hdGNoX25hbWVzcGFjZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQxLCBjb25zdCBjaGFyICppZDIsIGludCBuMSwgaW50IG4yKSAKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wID0gc29hcC0+bmxpc3Q7CisgIHdoaWxlIChucCAmJiAoc3RybmNtcChucC0+aWQsIGlkMSwgbjEpIHx8IG5wLT5pZFtuMV0pKQorICAgIG5wID0gbnAtPm5leHQ7CisgIGlmIChucCkKKyAgeyBpZiAobnAtPmluZGV4IDwgMAorICAgICB8fCAoc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tucC0+aW5kZXhdLmlkCisgICAgICAmJiAoc3RybmNtcChzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW25wLT5pbmRleF0uaWQsIGlkMiwgbjIpCisgICAgICAgfHwgc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tucC0+aW5kZXhdLmlkW24yXSkpKQorICAgICAgcmV0dXJuIFNPQVBfTkFNRVNQQUNFOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIGlmIChuMSA9PSAzICYmIG4xID09IG4yICYmICFzdHJjbXAoaWQxLCAieG1sIikgJiYgIXN0cmNtcChpZDEsIGlkMikpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIHJldHVybiBTT0FQX1NZTlRBWF9FUlJPUjsgCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9jdXJyZW50X25hbWVzcGFjZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnA7CisgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnM7CisgIG5wID0gc29hcC0+bmxpc3Q7CisgIGlmICghKHMgPSBzdHJjaHIodGFnLCAnOicpKSkKKyAgeyB3aGlsZSAobnAgJiYgKm5wLT5pZCkgLyogZmluZCBkZWZhdWx0IG5hbWVzcGFjZSwgaWYgcHJlc2VudCAqLworICAgICAgbnAgPSBucC0+bmV4dDsKKyAgfQorICBlbHNlCisgIHsgd2hpbGUgKG5wICYmIChzdHJuY21wKG5wLT5pZCwgdGFnLCBzIC0gdGFnKSB8fCBucC0+aWRbcyAtIHRhZ10pKQorICAgICAgbnAgPSBucC0+bmV4dDsKKyAgICBpZiAoIW5wKQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX05BTUVTUEFDRTsKKyAgfQorICBpZiAobnApCisgIHsgaWYgKG5wLT5pbmRleCA+PSAwKQorICAgICAgcmV0dXJuIHNvYXAtPm5hbWVzcGFjZXNbbnAtPmluZGV4XS5uczsKKyAgICBpZiAobnAtPm5zKQorICAgICAgcmV0dXJuIHNvYXBfc3RyZHVwKHNvYXAsIG5wLT5ucyk7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfdGFnX2NtcChjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICp0KQoreyBmb3IgKDs7KQorICB7IHJlZ2lzdGVyIGludCBjMSA9ICpzOworICAgIHJlZ2lzdGVyIGludCBjMiA9ICp0OworICAgIGlmICghYzEgfHwgYzEgPT0gJyInKQorICAgICAgYnJlYWs7CisgICAgaWYgKGMyICE9ICctJykKKyAgICB7IGlmIChjMSAhPSBjMikKKyAgICAgIHsgaWYgKGMxID49ICdBJyAmJiBjMSA8PSAnWicpCisgICAgICAgICAgYzEgKz0gJ2EnIC0gJ0EnOworICAgICAgICBpZiAoYzIgPj0gJ0EnICYmIGMyIDw9ICdaJykKKyAgICAgICAgICBjMiArPSAnYScgLSAnQSc7CisgICAgICB9CisgICAgICBpZiAoYzEgIT0gYzIpCisgICAgICB7IGlmIChjMiAhPSAnKicpCisgICAgICAgICAgcmV0dXJuIDE7CisJYzIgPSAqKyt0OworICAgICAgICBpZiAoIWMyKQorCSAgcmV0dXJuIDA7CisgICAgICAgIGlmIChjMiA+PSAnQScgJiYgYzIgPD0gJ1onKQorICAgICAgICAgIGMyICs9ICdhJyAtICdBJzsKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeyBjMSA9ICpzOworCSAgaWYgKCFjMSB8fCBjMSA9PSAnIicpCisJICAgIGJyZWFrOworCSAgaWYgKGMxID49ICdBJyAmJiBjMSA8PSAnWicpCisgICAgICAgICAgICBjMSArPSAnYScgLSAnQSc7CisgICAgICAgICAgaWYgKGMxID09IGMyICYmICFzb2FwX3RhZ19jbXAocyArIDEsIHQgKyAxKSkKKyAgICAgICAgICAgIHJldHVybiAwOworCSAgcysrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBzKys7CisgICAgdCsrOworICB9CisgIGlmICgqdCA9PSAnKicgJiYgIXRbMV0pCisgICAgcmV0dXJuIDA7CisgIHJldHVybiAqdDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9tYXRjaF90YWcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZzEsIGNvbnN0IGNoYXIgKnRhZzIpCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnMsICp0OworICBpZiAoIXRhZzEgfHwgIXRhZzIgfHwgISp0YWcyKQorICAgIHJldHVybiBTT0FQX09LOworICBzID0gc3RyY2hyKHRhZzEsICc6Jyk7CisgIHQgPSBzdHJjaHIodGFnMiwgJzonKTsKKyAgaWYgKHQpCisgIHsgaWYgKHMpCisgICAgeyBpZiAodFsxXSAmJiBTT0FQX1NUUkNNUChzICsgMSwgdCArIDEpKQorICAgICAgICByZXR1cm4gU09BUF9UQUdfTUlTTUFUQ0g7CisgICAgICBpZiAodCAhPSB0YWcyICYmIHNvYXBfbWF0Y2hfbmFtZXNwYWNlKHNvYXAsIHRhZzEsIHRhZzIsIHMgLSB0YWcxLCB0IC0gdGFnMikpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVGFncyAnJXMnIGFuZCAnJXMnIG1hdGNoIGJ1dCBuYW1lc3BhY2VzIGRpZmZlclxuIiwgdGFnMSwgdGFnMikpOworICAgICAgICByZXR1cm4gU09BUF9UQUdfTUlTTUFUQ0g7CisgICAgICB9CisgICAgfSAKKyAgICBlbHNlIGlmIChTT0FQX1NUUkNNUCh0YWcxLCB0ICsgMSkpCisgICAgICByZXR1cm4gU09BUF9UQUdfTUlTTUFUQ0g7CisgICAgZWxzZSBpZiAodCAhPSB0YWcyICYmIHNvYXBfbWF0Y2hfbmFtZXNwYWNlKHNvYXAsIHRhZzEsIHRhZzIsIDAsIHQgLSB0YWcyKSkKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVGFncyAnJXMnIGFuZCAnJXMnIG1hdGNoIGJ1dCBuYW1lc3BhY2VzIGRpZmZlclxuIiwgdGFnMSwgdGFnMikpOworICAgICAgcmV0dXJuIFNPQVBfVEFHX01JU01BVENIOworICAgIH0KKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlRhZ3MgYW5kIChkZWZhdWx0KSBuYW1lc3BhY2VzIG1hdGNoOiAnJXMnICclcydcbiIsIHRhZzEsIHRhZzIpKTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICBpZiAocykKKyAgeyBpZiAoU09BUF9TVFJDTVAocyArIDEsIHRhZzIpKQorICAgICAgcmV0dXJuIFNPQVBfVEFHX01JU01BVENIOworICB9CisgIGVsc2UgaWYgKFNPQVBfU1RSQ01QKHRhZzEsIHRhZzIpKQorICAgIHJldHVybiBTT0FQX1RBR19NSVNNQVRDSDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJUYWdzIG1hdGNoOiAnJXMnICclcydcbiIsIHRhZzEsIHRhZzIpKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfbWF0Y2hfYXJyYXkoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnR5cGUpCit7IGlmICgqc29hcC0+YXJyYXlUeXBlKQorICAgIGlmIChzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT5hcnJheVR5cGUsIHR5cGUpCisgICAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPmFycmF5VHlwZSwgInhzZDphbnlUeXBlIikKKyAgICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+YXJyYXlUeXBlLCAieHNkOnVyLXR5cGUiKQorICAgICkKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQXJyYXkgdHlwZSBtaXNtYXRjaDogJyVzJyAnJXMnXG4iLCBzb2FwLT5hcnJheVR5cGUsIHR5cGUpKTsKKyAgICAgIHJldHVybiBTT0FQX1RBR19NSVNNQVRDSDsKKyAgICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJU1NMCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIFdJVEhfT1BFTlNTTAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmFuZCgpCit7IHVuc2lnbmVkIGNoYXIgYnVmWzRdOworICBpZiAoIXNzbF9pbml0X2RvbmUpCisgICAgc29hcF9zc2xfaW5pdCgpOworICBSQU5EX3BzZXVkb19ieXRlcyhidWYsIDQpOworICByZXR1cm4gKihpbnQqKWJ1ZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zc2xfc2VydmVyX2NvbnRleHQoc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIHNob3J0IGZsYWdzLCBjb25zdCBjaGFyICprZXlmaWxlLCBjb25zdCBjaGFyICpwYXNzd29yZCwgY29uc3QgY2hhciAqY2FmaWxlLCBjb25zdCBjaGFyICpjYXBhdGgsIGNvbnN0IGNoYXIgKmRoZmlsZSwgY29uc3QgY2hhciAqcmFuZGZpbGUsIGNvbnN0IGNoYXIgKnNpZCkKK3sgaW50IGVycjsKKyAgc29hcC0+a2V5ZmlsZSA9IGtleWZpbGU7CisgIHNvYXAtPnBhc3N3b3JkID0gcGFzc3dvcmQ7CisgIHNvYXAtPmNhZmlsZSA9IGNhZmlsZTsKKyAgc29hcC0+Y2FwYXRoID0gY2FwYXRoOworICBpZiAoZGhmaWxlKQorICB7IHNvYXAtPmRoZmlsZSA9IGRoZmlsZTsKKyAgICBzb2FwLT5yc2EgPSAwOworICB9CisgIGVsc2UKKyAgeyBzb2FwLT5kaGZpbGUgPSBOVUxMOworICAgIHNvYXAtPnJzYSA9IDE7CisgIH0KKyAgc29hcC0+cmFuZGZpbGUgPSByYW5kZmlsZTsKKyAgc29hcC0+cmVxdWlyZV9jbGllbnRfYXV0aCA9IChmbGFncyAmIFNPQVBfU1NMX1JFUVVJUkVfQ0xJRU5UX0FVVEhFTlRJQ0FUSU9OKTsKKyAgaWYgKCEoZXJyID0gc29hcC0+ZnNzbGF1dGgoc29hcCkpKQorICB7IGlmIChzaWQpCisgICAgICBTU0xfQ1RYX3NldF9zZXNzaW9uX2lkX2NvbnRleHQoc29hcC0+Y3R4LCAodW5zaWduZWQgY2hhciopc2lkLCBzdHJsZW4oc2lkKSk7CisgIH0KKyAgcmV0dXJuIGVycjsgCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc3NsX2NsaWVudF9jb250ZXh0KHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBzaG9ydCBmbGFncywgY29uc3QgY2hhciAqa2V5ZmlsZSwgY29uc3QgY2hhciAqcGFzc3dvcmQsIGNvbnN0IGNoYXIgKmNhZmlsZSwgY29uc3QgY2hhciAqY2FwYXRoLCBjb25zdCBjaGFyICpyYW5kZmlsZSkKK3sgc29hcC0+a2V5ZmlsZSA9IGtleWZpbGU7CisgIHNvYXAtPnBhc3N3b3JkID0gcGFzc3dvcmQ7CisgIHNvYXAtPmNhZmlsZSA9IGNhZmlsZTsKKyAgc29hcC0+Y2FwYXRoID0gY2FwYXRoOworICBzb2FwLT5kaGZpbGUgPSBOVUxMOworICBzb2FwLT5yc2EgPSAwOworICBzb2FwLT5yYW5kZmlsZSA9IHJhbmRmaWxlOworICBzb2FwLT5yZXF1aXJlX3NlcnZlcl9hdXRoID0gKGZsYWdzICYgU09BUF9TU0xfUkVRVUlSRV9TRVJWRVJfQVVUSEVOVElDQVRJT04pOworICByZXR1cm4gc29hcC0+ZnNzbGF1dGgoc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NzbF9pbml0KCkKK3sgLyogTm90ZTogZm9yIE1UIHN5c3RlbXMsIHRoZSBtYWluIHByb2dyYW0gTVVTVCBjYWxsIHNvYXBfc3NsX2luaXQoKSBiZWZvcmUgYW55IHRocmVhZHMgYXJlIHN0YXJ0ZWQgKi8KKyAgaWYgKCFzc2xfaW5pdF9kb25lKQorICB7IHNzbF9pbml0X2RvbmUgPSAxOworICAgIFNTTF9saWJyYXJ5X2luaXQoKTsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgU1NMX2xvYWRfZXJyb3Jfc3RyaW5ncygpOworI2VuZGlmCisgICAgaWYgKCFSQU5EX2xvYWRfZmlsZSgiL2Rldi91cmFuZG9tIiwgMTAyNCkpCisgICAgeyBjaGFyIGJ1ZlsxMDI0XTsKKyAgICAgIFJBTkRfc2VlZChidWYsIHNpemVvZihidWYpKTsKKyAgICAgIHdoaWxlICghUkFORF9zdGF0dXMoKSkKKyAgICAgIHsgaW50IHIgPSByYW5kKCk7CisgICAgICAgIFJBTkRfc2VlZCgmciwgc2l6ZW9mKGludCkpOworICAgICAgfQorICAgIH0KKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNvbnN0IGNoYXIgKgorc3NsX2Vycm9yKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgcmV0KQoreyBpbnQgZXJyID0gU1NMX2dldF9lcnJvcihzb2FwLT5zc2wsIHJldCk7CisgIGNvbnN0IGNoYXIgKm1zZyA9IHNvYXBfc3RyX2NvZGUoaF9zc2xfZXJyb3JfY29kZXMsIGVycik7CisgIGlmIChtc2cpCisgICAgc3RyY3B5KHNvYXAtPm1zZ2J1ZiwgbXNnKTsKKyAgZWxzZQorICAgIHJldHVybiBFUlJfZXJyb3Jfc3RyaW5nKGVyciwgc29hcC0+bXNnYnVmKTsKKyAgaWYgKEVSUl9wZWVrX2Vycm9yKCkpCisgIHsgdW5zaWduZWQgbG9uZyByOworICAgIHN0cmNhdChzb2FwLT5tc2didWYsICJcbiIpOworICAgIHdoaWxlICgociA9IEVSUl9nZXRfZXJyb3IoKSkpCisgICAgICBFUlJfZXJyb3Jfc3RyaW5nX24ociwgc29hcC0+bXNnYnVmICsgc3RybGVuKHNvYXAtPm1zZ2J1ZiksIHNpemVvZihzb2FwLT5tc2didWYpIC0gc3RybGVuKHNvYXAtPm1zZ2J1ZikpOworICB9IAorICBlbHNlCisgIHsgc3dpdGNoIChyZXQpCisgICAgeyBjYXNlIDA6CisgICAgICAgIHN0cmNweShzb2FwLT5tc2didWYsICJFT0Ygd2FzIG9ic2VydmVkIHRoYXQgdmlvbGF0ZXMgdGhlIHByb3RvY29sLiBUaGUgY2xpZW50IHByb2JhYmx5IHByb3ZpZGVkIGludmFsaWQgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24uIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAtMToKKyAgICAgICAgc3ByaW50Zihzb2FwLT5tc2didWYsICJFcnJvciBvYnNlcnZlZCBieSB1bmRlcmx5aW5nIEJJTzogJXMiLCBzdHJlcnJvcihlcnJubykpOyAgCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gc29hcC0+bXNnYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc3NsX3Bhc3N3b3JkKGNoYXIgKmJ1ZiwgaW50IG51bSwgaW50IHJ3ZmxhZywgdm9pZCAqdXNlcmRhdGEpCit7IGlmIChudW0gPCAoaW50KXN0cmxlbigoY2hhciopdXNlcmRhdGEpICsgMSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIHN0cmxlbihzdHJjcHkoYnVmLCAoY2hhciopdXNlcmRhdGEpKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVGhpcyBjYWxsYmFjayBpcyBpbmNsdWRlZCBmb3IgZnV0dXJlIHJlZmVyZW5jZXMuIEl0IHNob3VsZCBub3QgYmUgZGVsZXRlZAorI2lmbmRlZiBQQUxNXzIKK3N0YXRpYyBESCAqCitzc2xfdG1wX2RoKFNTTCAqc3NsLCBpbnQgaXNfZXhwb3J0LCBpbnQga2V5bGVuZ3RoKQoreyBzdGF0aWMgREggKmRoNTEyID0gTlVMTDsKKyAgc3RhdGljIERIICpkaDEwMjQgPSBOVUxMOworICBESCAqZGg7CisgIHN3aXRjaCAoa2V5bGVuZ3RoKQorICB7IGNhc2UgNTEyOgorICAgICAgaWYgKCFkaDUxMikKKyAgICAgIHsgQklPICpiaW8gPSBCSU9fbmV3X2ZpbGUoImRoNTEyLnBlbSIsICJyIik7CisgICAgICAgIGlmIChiaW8pCisgICAgICAgIHsgZGg1MTIgPSBQRU1fcmVhZF9iaW9fREhwYXJhbXMoYmlvLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICBCSU9fZnJlZShiaW8pOworICAgICAgICAgIHJldHVybiBkaDUxMjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gZGg1MTI7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmICghZGgxMDI0KQorICAgICAgeyBCSU8gKmJpbyA9IEJJT19uZXdfZmlsZSgiZGgxMDI0LnBlbSIsICJyIik7CisgICAgICAgIGlmIChiaW8pCisgICAgICAgIHsgZGgxMDI0ID0gUEVNX3JlYWRfYmlvX0RIcGFyYW1zKGJpbywgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgQklPX2ZyZWUoYmlvKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZGggPSBkaDEwMjQ7CisgIH0KKyAgcmV0dXJuIGRoOworfQorI2VuZGlmCisqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NzbF9hdXRoX2luaXQoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmICghc3NsX2luaXRfZG9uZSkKKyAgICBzb2FwX3NzbF9pbml0KCk7CisgIGlmICghc29hcC0+Y3R4KQorICB7IGlmICghKHNvYXAtPmN0eCA9IFNTTF9DVFhfbmV3KFNTTHYyM19tZXRob2QoKSkpKQorICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3Qgc2V0dXAgY29udGV4dCIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgfQorICBpZiAoc29hcC0+cmFuZGZpbGUpCisgIHsgaWYgKCFSQU5EX2xvYWRfZmlsZShzb2FwLT5yYW5kZmlsZSwgLTEpKQorICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3QgbG9hZCByYW5kb21uZXNzIiwgU09BUF9TU0xfRVJST1IpOworICB9CisgIGlmIChzb2FwLT5jYWZpbGUgfHwgc29hcC0+Y2FwYXRoKQorICB7IGlmICghU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoc29hcC0+Y3R4LCBzb2FwLT5jYWZpbGUsIHNvYXAtPmNhcGF0aCkpCisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCByZWFkIENBIGZpbGUgYW5kIGRpcmVjdG9yeSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICBpZiAoc29hcC0+Y2FmaWxlICYmIHNvYXAtPnJlcXVpcmVfY2xpZW50X2F1dGgpCisgICAgICBTU0xfQ1RYX3NldF9jbGllbnRfQ0FfbGlzdChzb2FwLT5jdHgsIFNTTF9sb2FkX2NsaWVudF9DQV9maWxlKHNvYXAtPmNhZmlsZSkpOworICB9CisgIGlmICghU1NMX0NUWF9zZXRfZGVmYXVsdF92ZXJpZnlfcGF0aHMoc29hcC0+Y3R4KSkKKyAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCByZWFkIGRlZmF1bHQgQ0EgZmlsZSBhbmQvb3IgZGlyZWN0b3J5IiwgU09BUF9TU0xfRVJST1IpOworLyogU2VlIGJlbG93ICovCisgIGlmIChzb2FwLT5rZXlmaWxlKQorICB7IGlmICghU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZShzb2FwLT5jdHgsIHNvYXAtPmtleWZpbGUpKQorICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3QgcmVhZCBjZXJ0aWZpY2F0ZSBrZXkgZmlsZSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICBpZiAoc29hcC0+cGFzc3dvcmQpCisgICAgeyBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYl91c2VyZGF0YShzb2FwLT5jdHgsICh2b2lkKilzb2FwLT5wYXNzd29yZCk7CisgICAgICBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYihzb2FwLT5jdHgsIHNzbF9wYXNzd29yZCk7CisgICAgfQorICAgIGlmICghU1NMX0NUWF91c2VfUHJpdmF0ZUtleV9maWxlKHNvYXAtPmN0eCwgc29hcC0+a2V5ZmlsZSwgU1NMX0ZJTEVUWVBFX1BFTSkpCisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCByZWFkIGtleSBmaWxlIiwgU09BUF9TU0xfRVJST1IpOworICB9CisvKiBTdWdnZXN0ZWQgYWx0ZXJuYXRpdmUgYXBwcm9hY2ggdG8gY2hlY2sgY2FmaWxlIGZpcnN0IGJlZm9yZSB0aGUga2V5IGZpbGU6CisgIGlmIChzb2FwLT5wYXNzd29yZCkKKyAgeyBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYl91c2VyZGF0YShzb2FwLT5jdHgsICh2b2lkKilzb2FwLT5wYXNzd29yZCk7CisgICAgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2Ioc29hcC0+Y3R4LCBzc2xfcGFzc3dvcmQpOworICB9CisgIGlmICghc29hcC0+Y2FmaWxlIHx8ICFTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKHNvYXAtPmN0eCwgc29hcC0+Y2FmaWxlKSkKKyAgeyBpZiAoc29hcC0+a2V5ZmlsZSkKKyAgICB7IGlmICghU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZShzb2FwLT5jdHgsIHNvYXAtPmtleWZpbGUpKQorICAgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCByZWFkIGNlcnRpZmljYXRlIG9yIGtleSBmaWxlIiwgU09BUF9TU0xfRVJST1IpOworICAgICAgaWYgKCFTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X2ZpbGUoc29hcC0+Y3R4LCBzb2FwLT5rZXlmaWxlLCBTU0xfRklMRVRZUEVfUEVNKSkKKyAgICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3QgcmVhZCBrZXkgZmlsZSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICB9CisgIH0KKyovCisgIGlmIChzb2FwLT5yc2EpCisgIHsgUlNBICpyc2EgPSBSU0FfZ2VuZXJhdGVfa2V5KDEwMjQsIFJTQV9GNCwgTlVMTCwgTlVMTCk7CisgICAgaWYgKCFTU0xfQ1RYX3NldF90bXBfcnNhKHNvYXAtPmN0eCwgcnNhKSkKKyAgICB7IGlmIChyc2EpCisgICAgICAgIFJTQV9mcmVlKHJzYSk7CisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCBzZXQgUlNBIGtleSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICB9CisgICAgUlNBX2ZyZWUocnNhKTsKKyAgfQorICBlbHNlIGlmIChzb2FwLT5kaGZpbGUpCisgIHsgREggKmRoID0gMDsKKyAgICBCSU8gKmJpbzsKKyAgICBiaW8gPSBCSU9fbmV3X2ZpbGUoc29hcC0+ZGhmaWxlLCAiciIpOworICAgIGlmICghYmlvKQorICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3QgcmVhZCBESCBmaWxlIiwgU09BUF9TU0xfRVJST1IpOworICAgIGRoID0gUEVNX3JlYWRfYmlvX0RIcGFyYW1zKGJpbywgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgQklPX2ZyZWUoYmlvKTsKKyAgICBpZiAoU1NMX0NUWF9zZXRfdG1wX2RoKHNvYXAtPmN0eCwgZGgpIDwgMCkKKyAgICB7IGlmIChkaCkKKyAgICAgICAgREhfZnJlZShkaCk7CisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCBzZXQgREggcGFyYW1ldGVycyIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICB9CisgICAgREhfZnJlZShkaCk7CisgIH0KKyAgU1NMX0NUWF9zZXRfb3B0aW9ucyhzb2FwLT5jdHgsIFNTTF9PUF9BTEwgfCBTU0xfT1BfTk9fU1NMdjIpOworICBTU0xfQ1RYX3NldF92ZXJpZnkoc29hcC0+Y3R4LCBzb2FwLT5yZXF1aXJlX2NsaWVudF9hdXRoID8gKFNTTF9WRVJJRllfUEVFUiB8IFNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQpIDogc29hcC0+cmVxdWlyZV9zZXJ2ZXJfYXV0aCA/IFNTTF9WRVJJRllfUEVFUiA6IFNTTF9WRVJJRllfTk9ORSwgc29hcC0+ZnNzbHZlcmlmeSk7CisjaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCAweDAwOTA1MTAwTCkKKyAgU1NMX0NUWF9zZXRfdmVyaWZ5X2RlcHRoKHNvYXAtPmN0eCwgMSk7IAorI2Vsc2UKKyAgU1NMX0NUWF9zZXRfdmVyaWZ5X2RlcHRoKHNvYXAtPmN0eCwgOSk7IAorI2VuZGlmICAKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzc2xfdmVyaWZ5X2NhbGxiYWNrKGludCBvaywgWDUwOV9TVE9SRV9DVFggKnN0b3JlKQoreworI2lmZGVmIFNPQVBfREVCVUcKKyAgaWYgKCFvaykgCisgIHsgY2hhciBkYXRhWzI1Nl07CisgICAgWDUwOSAqY2VydCA9IFg1MDlfU1RPUkVfQ1RYX2dldF9jdXJyZW50X2NlcnQoc3RvcmUpOworICAgIGZwcmludGYoc3RkZXJyLCAiU1NMIHZlcmlmeSBlcnJvciBvciB3YXJuaW5nIHdpdGggY2VydGlmaWNhdGUgYXQgZGVwdGggJWQ6ICVzXG4iLCBYNTA5X1NUT1JFX0NUWF9nZXRfZXJyb3JfZGVwdGgoc3RvcmUpLCBYNTA5X3ZlcmlmeV9jZXJ0X2Vycm9yX3N0cmluZyhYNTA5X1NUT1JFX0NUWF9nZXRfZXJyb3Ioc3RvcmUpKSk7CisgICAgWDUwOV9OQU1FX29uZWxpbmUoWDUwOV9nZXRfaXNzdWVyX25hbWUoY2VydCksIGRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgZnByaW50ZihzdGRlcnIsICJjZXJ0aWZpY2F0ZSBpc3N1ZXIgJXNcbiIsIGRhdGEpOworICAgIFg1MDlfTkFNRV9vbmVsaW5lKFg1MDlfZ2V0X3N1YmplY3RfbmFtZShjZXJ0KSwgZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImNlcnRpZmljYXRlIHN1YmplY3QgJXNcbiIsIGRhdGEpOworICB9CisjZW5kaWYKKyAgLyogTm90ZTogcmV0dXJuIDEgdG8gY29udGludWUsIGJ1dCB1bnNhZmUgcHJvZ3Jlc3Mgd2lsbCBiZSB0ZXJtaW5hdGVkIGJ5IFNTTCAqLworICByZXR1cm4gb2s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc3NsX2FjY2VwdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgQklPICpiaW87CisgIGludCBpLCByOworICBpZiAoIXNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiTm8gc29ja2V0IGluIHNvYXBfc3NsX2FjY2VwdCgpIiwgU09BUF9TU0xfRVJST1IpOworICBpZiAoIXNvYXAtPmN0eCAmJiAoc29hcC0+ZXJyb3IgPSBzb2FwLT5mc3NsYXV0aChzb2FwKSkpCisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIGlmICghc29hcC0+c3NsKQorICB7IHNvYXAtPnNzbCA9IFNTTF9uZXcoc29hcC0+Y3R4KTsKKyAgICBpZiAoIXNvYXAtPnNzbCkKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIlNTTF9uZXcoKSBmYWlsZWQgaW4gc29hcF9zc2xfYWNjZXB0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgIH0KKyAgZWxzZQorICAgIFNTTF9jbGVhcihzb2FwLT5zc2wpOworICBzb2FwLT5pbW9kZSB8PSBTT0FQX0VOQ19TU0w7CisgIHNvYXAtPm9tb2RlIHw9IFNPQVBfRU5DX1NTTDsKKyNpZiBkZWZpbmVkKFdJTjMyKQorICB7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRklPTkJJTywgJm5vbmJsb2NraW5nKTsKKyAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICB7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgaW9jdGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRklPTkJJTywgKGludCkmbm9uYmxvY2tpbmcpOworICB9CisjZWxzZQorICBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGX0dFVEZMKXxPX05PTkJMT0NLKTsKKyNlbmRpZgorICBiaW8gPSBCSU9fbmV3X3NvY2tldCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBCSU9fTk9DTE9TRSk7CisgIFNTTF9zZXRfYmlvKHNvYXAtPnNzbCwgYmlvLCBiaW8pOworICBpID0gMTAwOyAvKiAxMDAgKiAwLjEgbXMgcmV0cmllcyAqLworICB3aGlsZSAoKHIgPSBTU0xfYWNjZXB0KHNvYXAtPnNzbCkpIDw9IDApCisgIHsgaW50IGVyciA9IFNTTF9nZXRfZXJyb3Ioc29hcC0+c3NsLCByKTsKKyAgICBpZiAoZXJyID09IFNTTF9FUlJPUl9XQU5UX1JFQUQgfHwgZXJyID09IFNTTF9FUlJPUl9XQU5UX1dSSVRFKQorICAgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgIGZkX3NldCBmZDsKKyAgICAgIGlmIChpLS0gPD0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICB0aW1lb3V0LnR2X3NlYyA9IDA7CisgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAxMDAwMDA7CisgICAgICBGRF9aRVJPKCZmZCk7CisgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJmZkKTsKKyAgICAgIHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgJmZkLCBOVUxMLCAmZmQsICZ0aW1lb3V0KTsKKyAgICAgIGlmIChyIDwgMCAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSKQorICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgcmV0dXJuIFNPQVBfRU9GOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeyBzb2FwLT5lcnJudW0gPSBlcnI7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyNpZiBkZWZpbmVkKFdJTjMyKQorICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRklPTkJJTywgJmJsb2NraW5nKTsKKyAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgaW9jdGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRklPTkJJTywgKGludCkmYmxvY2tpbmcpOworICB9CisjZWxzZQorICBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGX0dFVEZMKSZ+T19OT05CTE9DSyk7CisjZW5kaWYKKyAgaWYgKHIgPD0gMCkKKyAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCBzc2xfZXJyb3Ioc29hcCwgciksICJTU0xfYWNjZXB0KCkgZmFpbGVkIGluIHNvYXBfc3NsX2FjY2VwdCgpIiwgU09BUF9TU0xfRVJST1IpOworICAgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgIHJldHVybiBTT0FQX1NTTF9FUlJPUjsKKyAgfQorICBpZiAoc29hcC0+cmVxdWlyZV9jbGllbnRfYXV0aCkKKyAgeyBYNTA5ICpwZWVyOworICAgIGludCBlcnI7CisgICAgaWYgKChlcnIgPSBTU0xfZ2V0X3ZlcmlmeV9yZXN1bHQoc29hcC0+c3NsKSkgIT0gWDUwOV9WX09LKQorICAgIHsgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICByZXR1cm4gc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIFg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKGVyciksICJTU0wgY2VydGlmaWNhdGUgcHJlc2VudGVkIGJ5IHBlZXIgY2Fubm90IGJlIHZlcmlmaWVkIGluIHNvYXBfc3NsX2FjY2VwdCgpIiwgU09BUF9TU0xfRVJST1IpOworICAgIH0KKyAgICBwZWVyID0gU1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKHNvYXAtPnNzbCk7CisgICAgaWYgKCFwZWVyKQorICAgIHsgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICByZXR1cm4gc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiTm8gU1NMIGNlcnRpZmljYXRlIHdhcyBwcmVzZW50ZWQgYnkgdGhlIHBlZXIgaW4gc29hcF9zc2xfYWNjZXB0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgfQorICAgIFg1MDlfZnJlZShwZWVyKTsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2VuZGlmIC8qIFdJVEhfT1BFTlNTTCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Cit0Y3BfaW5pdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+ZXJybW9kZSA9IDE7CisjaWZkZWYgV0lOMzIKKyAgaWYgKHRjcF9kb25lKQorICAgIHJldHVybiAwOworICBlbHNlCisgIHsgV1NBREFUQSB3OworICAgIGlmIChXU0FTdGFydHVwKE1BS0VXT1JEKDEsIDEpLCAmdykpCisgICAgICByZXR1cm4gLTE7CisgICAgdGNwX2RvbmUgPSAxOworICB9CisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZG9uZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgCisjaWZkZWYgU09BUF9ERUJVRworICBpbnQgaTsKKyNlbmRpZgorICBpZiAoc29hcF9jaGVja19zdGF0ZShzb2FwKSkKKyAgICByZXR1cm47CisgIHNvYXBfZnJlZShzb2FwKTsKKyAgd2hpbGUgKHNvYXAtPmNsaXN0KQorICB7IHN0cnVjdCBzb2FwX2NsaXN0ICpwID0gc29hcC0+Y2xpc3QtPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPmNsaXN0KTsKKyAgICBzb2FwLT5jbGlzdCA9IHA7CisgIH0KKyAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7IC8qIHRvIGZvcmNlIGNsb3NlIHRoZSBzb2NrZXQgKi8KKyAgc29hcF9jbG9zZXNvY2soc29hcCk7CisjaWZkZWYgV0lUSF9DT09LSUVTCisgIHNvYXBfZnJlZV9jb29raWVzKHNvYXApOworI2VuZGlmCisgIHdoaWxlIChzb2FwLT5wbHVnaW5zKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BsdWdpbiAqcCA9IHNvYXAtPnBsdWdpbnMtPm5leHQ7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZW1vdmluZyBwbHVnaW4gJyVzJ1xuIiwgc29hcC0+cGx1Z2lucy0+aWQpKTsKKyAgICBpZiAoc29hcC0+cGx1Z2lucy0+ZmNvcHkgfHwgc29hcC0+c3RhdGUgPT0gU09BUF9JTklUKQorICAgICAgc29hcC0+cGx1Z2lucy0+ZmRlbGV0ZShzb2FwLCBzb2FwLT5wbHVnaW5zKTsKKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+cGx1Z2lucyk7CisgICAgc29hcC0+cGx1Z2lucyA9IHA7CisgIH0KKyAgc29hcC0+ZnBsdWdpbiA9IGZwbHVnaW47CisjaWZuZGVmIFdJVEhfTk9IVFRQCisgIHNvYXAtPmZwb3N0ID0gaHR0cF9wb3N0OworICBzb2FwLT5mZ2V0ID0gaHR0cF9nZXQ7CisgIHNvYXAtPmZmb3JtID0gTlVMTDsKKyAgc29hcC0+ZnBvc3RoZHIgPSBodHRwX3Bvc3RfaGVhZGVyOworICBzb2FwLT5mcmVzcG9uc2UgPSBodHRwX3Jlc3BvbnNlOworICBzb2FwLT5mcGFyc2UgPSBodHRwX3BhcnNlOworICBzb2FwLT5mcGFyc2VoZHIgPSBodHRwX3BhcnNlX2hlYWRlcjsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9JUFY2CisgIHNvYXAtPmZyZXNvbHZlID0gdGNwX2dldGhvc3Q7CisjZWxzZQorICBzb2FwLT5mcmVzb2x2ZSA9IE5VTEw7CisjZW5kaWYKKyAgc29hcC0+ZmFjY2VwdCA9IHRjcF9hY2NlcHQ7CisgIHNvYXAtPmZvcGVuID0gdGNwX2Nvbm5lY3Q7CisgIHNvYXAtPmZjbG9zZSA9IHRjcF9kaXNjb25uZWN0OworICBzb2FwLT5mY2xvc2Vzb2NrZXQgPSB0Y3BfY2xvc2Vzb2NrZXQ7CisgIHNvYXAtPmZzaHV0ZG93bnNvY2tldCA9IHRjcF9zaHV0ZG93bnNvY2tldDsKKyAgc29hcC0+ZnNlbmQgPSBmc2VuZDsKKyAgc29hcC0+ZnJlY3YgPSBmcmVjdjsKKyAgc29hcC0+ZnBvbGwgPSBzb2FwX3BvbGw7CisjZWxzZQorICBzb2FwLT5mb3BlbiA9IE5VTEw7CisgIHNvYXAtPmZjbG9zZSA9IE5VTEw7CisgIHNvYXAtPmZwb2xsID0gTlVMTDsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzb2FwLT5mcHJlcGFyZWluaXQgPSBOVUxMOworICBzb2FwLT5mcHJlcGFyZXNlbmQgPSBOVUxMOworICBzb2FwLT5mcHJlcGFyZXJlY3YgPSBOVUxMOworICBzb2FwLT5mcHJlcGFyZWZpbmFsID0gTlVMTDsKKyNlbmRpZgorICBzb2FwLT5mc2V0ZXJyb3IgPSBOVUxMOworICBzb2FwLT5maWdub3JlID0gTlVMTDsKKyAgc29hcC0+ZnNlcnZlbG9vcCA9IE5VTEw7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgIGlmIChzb2FwLT5zZXNzaW9uKQorICB7IFNTTF9TRVNTSU9OX2ZyZWUoc29hcC0+c2Vzc2lvbik7CisgICAgc29hcC0+c2Vzc2lvbiA9IE5VTEw7CisgIH0KKyNlbmRpZgorICBpZiAoc29hcC0+c3RhdGUgPT0gU09BUF9JTklUKQorICB7IGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpKQorICAgIHsgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIpOworICAgICAgc29hcC0+bWFzdGVyID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgICAgaWYgKHNvYXAtPmN0eCkKKyAgICB7IFNTTF9DVFhfZnJlZShzb2FwLT5jdHgpOworICAgICAgc29hcC0+Y3R4ID0gTlVMTDsKKyAgICB9CisjZW5kaWYKKyAgfQorI2lmZGVmIFNPQVBfREVCVUcKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIGxvZ2ZpbGVzXG4iKSk7CisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX01BWExPR1M7IGkrKykKKyAgeyBpZiAoc29hcC0+bG9nZmlsZVtpXSkKKyAgICB7IFNPQVBfRlJFRShzb2FwLCAodm9pZCopc29hcC0+bG9nZmlsZVtpXSk7CisgICAgICBzb2FwLT5sb2dmaWxlW2ldID0gTlVMTDsKKyAgICB9CisgICAgc29hcF9jbG9zZV9sb2dmaWxlKHNvYXAsIGkpOworICB9CisgIHNvYXBfZnJlZV9taHQoc29hcCk7CisgIHNvYXAtPnN0YXRlID0gMDsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfY2xlYW51cChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcF9kb25lKHNvYXApOworI2lmZGVmIFdJTjMyCisgIGlmICghdGNwX2RvbmUpCisgICAgcmV0dXJuOworICB0Y3BfZG9uZSA9IDA7CisgIFdTQUNsZWFudXAoKTsKKyNlbmRpZgorfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNvbnN0IGNoYXIqCit0Y3BfZXJyb3Ioc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKm1zZyA9IE5VTEw7CisgIHN3aXRjaCAoc29hcC0+ZXJybW9kZSkKKyAgeyBjYXNlIDA6CisgICAgICBtc2cgPSBzb2FwX3N0cmVycm9yKHNvYXApOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgbXNnID0gIldTQVN0YXJ0dXAgZmFpbGVkIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICB7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgbXNnID0gc29hcF9zdHJfY29kZShoX2Vycm9yX2NvZGVzLCBzb2FwLT5lcnJudW0pOworICAgICAgaWYgKCFtc2cpCisjZW5kaWYKKyAgICAgIHsgc3ByaW50Zihzb2FwLT5tc2didWYsICJUQ1AvVURQIElQIGVycm9yICVkIiwgc29hcC0+ZXJybnVtKTsKKyAgICAgICAgbXNnID0gc29hcC0+bXNnYnVmOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gbXNnOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY29uc3QgY2hhcioKK2h0dHBfZXJyb3Ioc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdGF0dXMpCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKm1zZyA9IFNPQVBfU1RSX0VPUzsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIG1zZyA9IHNvYXBfc3RyX2NvZGUoaF9odHRwX2Vycm9yX2NvZGVzLCBzdGF0dXMpOworICBpZiAoIW1zZykKKyAgICBtc2cgPSBTT0FQX1NUUl9FT1M7CisjZW5kaWYKKyAgcmV0dXJuIG1zZzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfSVBWNgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Cit0Y3BfZ2V0aG9zdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqYWRkciwgc3RydWN0IGluX2FkZHIgKmluYWRkcikKK3sgc29hcF9pbnQzMiBpYWRkID0gLTE7CisgIHN0cnVjdCBob3N0ZW50IGhvc3RlbnQsICpob3N0ID0gJmhvc3RlbnQ7CisjaWZkZWYgVlhXT1JLUworICBpbnQgaG9zdGludDsKKyAgLyogaW5ldF9hZGRyKCksIGFuZCBob3N0R2V0QnlOYW1lKCkgZXhwZWN0ICJjaGFyICoiOyBhZGRyIGlzIGEgImNvbnN0IGNoYXIgKiIuICovCisgIGlhZGQgPSBpbmV0X2FkZHIoKGNoYXIqKWFkZHIpOworI2Vsc2UKKyNpZiBkZWZpbmVkKF9BSVhWRVJTSU9OXzQzMSkgfHwgZGVmaW5lZChUUlU2NCkKKyAgc3RydWN0IGhvc3RlbnRfZGF0YSBodF9kYXRhOworI2VuZGlmCisjaWZkZWYgQVM0MDAKKyAgaWFkZCA9IGluZXRfYWRkcigodm9pZCopYWRkcik7CisjZWxzZQorICBpYWRkID0gaW5ldF9hZGRyKGFkZHIpOworI2VuZGlmCisjZW5kaWYKKyAgaWYgKGlhZGQgIT0gLTEpCisgIHsgbWVtY3B5KGluYWRkciwgJmlhZGQsIHNpemVvZihpYWRkKSk7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNpZiBkZWZpbmVkKF9fR0xJQkNfXykKKyAgaWYgKGdldGhvc3RieW5hbWVfcihhZGRyLCAmaG9zdGVudCwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTiwgJmhvc3QsICZzb2FwLT5lcnJudW0pIDwgMCkKKyAgICBob3N0ID0gTlVMTDsKKyNlbGlmIGRlZmluZWQoX0FJWFZFUlNJT05fNDMxKSB8fCBkZWZpbmVkKFRSVTY0KQorICBtZW1zZXQoKHZvaWQqKSZodF9kYXRhLCAwLCBzaXplb2YoaHRfZGF0YSkpOworICBpZiAoZ2V0aG9zdGJ5bmFtZV9yKGFkZHIsICZob3N0ZW50LCAmaHRfZGF0YSkgPCAwKQorICB7IGhvc3QgPSBOVUxMOworICAgIHNvYXAtPmVycm51bSA9IGhfZXJybm87CisgIH0KKyNlbGlmIGRlZmluZWQoSEFWRV9HRVRIT1NUQllOQU1FX1IpCisgIGhvc3QgPSBnZXRob3N0YnluYW1lX3IoYWRkciwgJmhvc3RlbnQsIHNvYXAtPmJ1ZiwgU09BUF9CVUZMRU4sICZzb2FwLT5lcnJudW0pOworI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICAvKiBJZiB0aGUgRE5TIHJlc29sdmVyIGxpYnJhcnkgcmVzb2x2TGliIGhhcyBiZWVuIGNvbmZpZ3VyZWQgaW4gdGhlIHZ4V29ya3MKKyAgICogaW1hZ2UsIGEgcXVlcnkgZm9yIHRoZSBob3N0IElQIGFkZHJlc3MgaXMgc2VudCB0byB0aGUgRE5TIHNlcnZlciwgaWYgdGhlCisgICAqIG5hbWUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgbG9jYWwgaG9zdCB0YWJsZS4gKi8KKyAgaG9zdGludCA9IGhvc3RHZXRCeU5hbWUoKGNoYXIqKWFkZHIpOworICBpZiAoaG9zdGludCA9PSBFUlJPUikKKyAgeyBob3N0ID0gTlVMTDsKKyAgICBzb2FwLT5lcnJudW0gPSBzb2FwX2Vycm5vOyAKKyAgfQorI2Vsc2UKKyNpZmRlZiBBUzQwMAorICBpZiAoIShob3N0ID0gZ2V0aG9zdGJ5bmFtZSgodm9pZCopYWRkcikpKQorICAgIHNvYXAtPmVycm51bSA9IGhfZXJybm87CisjZWxzZQorICBpZiAoIShob3N0ID0gZ2V0aG9zdGJ5bmFtZShhZGRyKSkpCisgICAgc29hcC0+ZXJybnVtID0gaF9lcnJubzsKKyNlbmRpZgorI2VuZGlmCisgIGlmICghaG9zdCkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkhvc3QgbmFtZSBub3QgZm91bmRcbiIpKTsKKyAgICByZXR1cm4gU09BUF9FUlI7CisgIH0KKyNpZmRlZiBWWFdPUktTCisgIGluYWRkci0+c19hZGRyID0gaG9zdGludDsKKyNlbHNlCisgIG1lbWNweShpbmFkZHIsIGhvc3QtPmhfYWRkciwgaG9zdC0+aF9sZW5ndGgpOworI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Cit0Y3BfY29ubmVjdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZW5kcG9pbnQsIGNvbnN0IGNoYXIgKmhvc3QsIGludCBwb3J0KQoreworI2lmZGVmIFdJVEhfSVBWNgorICBzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpyZXMsICpyZXNzYXZlOworICBpbnQgZXJyOworI2VuZGlmCisgIHJlZ2lzdGVyIGludCBmZDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGludCBsZW4gPSBTT0FQX0JVRkxFTjsKKyAgaW50IHNldCA9IDE7CisjZW5kaWYKKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQpOworICBzb2FwLT5zb2NrZXQgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICBpZiAodGNwX2luaXQoc29hcCkpCisgIHsgc29hcC0+ZXJybnVtID0gMDsKKyAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiVENQIGluaXQgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgc29hcC0+ZXJybW9kZSA9IDA7CisjaWZkZWYgV0lUSF9JUFY2CisgIG1lbXNldCgodm9pZCopJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKyAgaGludHMuYWlfZmFtaWx5ID0gUEZfVU5TUEVDOworI2lmZGVmIFdJVEhfVURQCisgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX0RHUkFNOworICBlbHNlCisjZW5kaWYKKyAgICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworICBzb2FwLT5lcnJtb2RlID0gMjsKKyAgaWYgKHNvYXAtPnByb3h5X2hvc3QpCisgICAgZXJyID0gZ2V0YWRkcmluZm8oc29hcC0+cHJveHlfaG9zdCwgc29hcF9pbnQycyhzb2FwLCBzb2FwLT5wcm94eV9wb3J0KSwgJmhpbnRzLCAmcmVzKTsKKyAgZWxzZQorICAgIGVyciA9IGdldGFkZHJpbmZvKGhvc3QsIHNvYXBfaW50MnMoc29hcCwgcG9ydCksICZoaW50cywgJnJlcyk7CisgIGlmIChlcnIpCisgIHsgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIGdhaV9zdHJlcnJvcihlcnIpLCAiZ2V0YWRkcmluZm8gZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgcmVzc2F2ZSA9IHJlczsKK2FnYWluOgorICBmZCA9IChpbnQpc29ja2V0KHJlcy0+YWlfZmFtaWx5LCByZXMtPmFpX3NvY2t0eXBlLCByZXMtPmFpX3Byb3RvY29sKTsKKyAgc29hcC0+ZXJybW9kZSA9IDA7CisjZWxzZQorI2lmZGVmIFdJVEhfVURQCisgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgZmQgPSAoaW50KXNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKyAgZWxzZQorI2VuZGlmCisgICAgZmQgPSAoaW50KXNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisjZW5kaWYKKyAgaWYgKGZkIDwgMCkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic29ja2V0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisjaWZkZWYgU09DS0VUX0NMT1NFX09OX0VYRUMKKyNpZmRlZiBXSU4zMgorI2lmbmRlZiBVTkRFUl9DRQorICBTZXRIYW5kbGVJbmZvcm1hdGlvbigoSEFORExFKWZkLCBIQU5ETEVfRkxBR19JTkhFUklULCAwKTsKKyNlbmRpZgorI2Vsc2UKKyAgZmNudGwoZmQsIEZfU0VURkQsIDEpOworI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5jb25uZWN0X2ZsYWdzICYgU09fTElOR0VSKQorICB7IHN0cnVjdCBsaW5nZXIgbGluZ2VyOworICAgIG1lbXNldCgodm9pZCopJmxpbmdlciwgMCwgc2l6ZW9mKGxpbmdlcikpOworICAgIGxpbmdlci5sX29ub2ZmID0gMTsKKyAgICBsaW5nZXIubF9saW5nZXIgPSAwOworICAgIGlmIChzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClmZCwgU09MX1NPQ0tFVCwgU09fTElOR0VSLCAoY2hhciopJmxpbmdlciwgc2l6ZW9mKHN0cnVjdCBsaW5nZXIpKSkKKyAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fTElOR0VSIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisgIH0KKyAgaWYgKChzb2FwLT5jb25uZWN0X2ZsYWdzICYgflNPX0xJTkdFUikgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpZmQsIFNPTF9TT0NLRVQsIHNvYXAtPmNvbm5lY3RfZmxhZ3MgJiB+U09fTElOR0VSLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIGlmIChzb2FwLT5rZWVwX2FsaXZlICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKWZkLCBTT0xfU09DS0VULCBTT19LRUVQQUxJVkUsIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fS0VFUEFMSVZFIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIGlmIChzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClmZCwgU09MX1NPQ0tFVCwgU09fU05EQlVGLCAoY2hhciopJmxlbiwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX1NOREJVRiBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpZmQsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgKGNoYXIqKSZsZW4sIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19SQ1ZCVUYgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNpZmRlZiBUQ1BfTk9ERUxBWQorICBpZiAoIShzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClmZCwgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFRDUF9OT0RFTEFZIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisjZW5kaWYKKyNlbmRpZgorICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiT3BlbmluZyBzb2NrZXQgJWQgdG8gaG9zdD0nJXMnIHBvcnQ9JWRcbiIsIGZkLCBob3N0LCBwb3J0KSk7CisjaWZuZGVmIFdJVEhfSVBWNgorICBzb2FwLT5wZWVybGVuID0gc2l6ZW9mKHNvYXAtPnBlZXIpOworICBtZW1zZXQoKHZvaWQqKSZzb2FwLT5wZWVyLCAwLCBzaXplb2Yoc29hcC0+cGVlcikpOworICBzb2FwLT5wZWVyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICBzb2FwLT5lcnJtb2RlID0gMjsKKyAgaWYgKHNvYXAtPnByb3h5X2hvc3QpCisgIHsgaWYgKHNvYXAtPmZyZXNvbHZlKHNvYXAsIHNvYXAtPnByb3h5X2hvc3QsICZzb2FwLT5wZWVyLnNpbl9hZGRyKSkKKyAgICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJnZXQgcHJveHkgaG9zdCBieSBuYW1lIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisgICAgc29hcC0+cGVlci5zaW5fcG9ydCA9IGh0b25zKChzaG9ydClzb2FwLT5wcm94eV9wb3J0KTsKKyAgfQorICBlbHNlCisgIHsgaWYgKHNvYXAtPmZyZXNvbHZlKHNvYXAsIGhvc3QsICZzb2FwLT5wZWVyLnNpbl9hZGRyKSkKKyAgICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJnZXQgaG9zdCBieSBuYW1lIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisgICAgc29hcC0+cGVlci5zaW5fcG9ydCA9IGh0b25zKChzaG9ydClwb3J0KTsKKyAgfQorICBzb2FwLT5lcnJtb2RlID0gMDsKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICByZXR1cm4gZmQ7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQpCisjaWYgZGVmaW5lZChXSU4zMikKKyAgeyB1X2xvbmcgbm9uYmxvY2tpbmcgPSAxOworICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgJm5vbmJsb2NraW5nKTsKKyAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICB7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgaW9jdGwoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAoaW50KSgmbm9uYmxvY2tpbmcpKTsgLyogbW9kaWZpZWQgdG8gdXNlIGZkICovCisgIH0KKyNlbHNlCisgICAgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfR0VURkwpfE9fTk9OQkxPQ0spOworI2VuZGlmCisgIGVsc2UKKyNpZiBkZWZpbmVkKFdJTjMyKQorICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAmYmxvY2tpbmcpOworICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICBpb2N0bCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sIChpbnQpKCZibG9ja2luZykpOworICB9CisjZWxzZQorICAgIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX0dFVEZMKSZ+T19OT05CTE9DSyk7CisjZW5kaWYKKyNlbmRpZgorICBmb3IgKDs7KQorICB7IAorI2lmZGVmIFdJVEhfSVBWNgorICAgIGlmIChjb25uZWN0KChTT0FQX1NPQ0tFVClmZCwgcmVzLT5haV9hZGRyLCByZXMtPmFpX2FkZHJsZW4pKQorI2Vsc2UKKyAgICBpZiAoY29ubmVjdCgoU09BUF9TT0NLRVQpZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyLCBzaXplb2Yoc29hcC0+cGVlcikpKQorI2VuZGlmCisgICAgeyAKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0ICYmIChzb2FwX3NvY2tldF9lcnJubyA9PSBTT0FQX0VJTlBST0dSRVNTIHx8IHNvYXBfc29ja2V0X2Vycm5vID09IFNPQVBfRVdPVUxEQkxPQ0spKQorICAgICAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgICAgICBTT0FQX1NPQ0tMRU5fVCBrOworICAgICAgICBmZF9zZXQgZmRzOworICAgICAgICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0ID4gMCkKKyAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IHNvYXAtPmNvbm5lY3RfdGltZW91dDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IC1zb2FwLT5jb25uZWN0X3RpbWVvdXQvMTAwMDAwMDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAtc29hcC0+Y29ubmVjdF90aW1lb3V0JTEwMDAwMDA7CisgICAgICAgIH0KKyAgICAgICAgRkRfWkVSTygmZmRzKTsKKyAgICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClmZCwgJmZkcyk7CisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsgaW50IHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShmZCArIDEpLCBOVUxMLCAmZmRzLCBOVUxMLCAmdGltZW91dCk7CisgICAgICAgICAgaWYgKHIgPiAwKQorCSAgICBicmVhazsKKyAgICAgICAgICBpZiAoIXIpCisgICAgICAgICAgeyBzb2FwLT5lcnJudW0gPSAwOworICAgICAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb25uZWN0IHRpbWVvdXRcbiIpKTsKKyAgICAgICAgICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCAiVGltZW91dCIsICJjb25uZWN0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIpCisgICAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IGNvbm5lY3QgdG8gaG9zdFxuIikpOworICAgICAgICAgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImNvbm5lY3QgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICAgIH0KKyAgICAgICAgfQorCWsgPSAoU09BUF9TT0NLTEVOX1Qpc2l6ZW9mKHNvYXAtPmVycm51bSk7CisgICAgICAgIGlmICghZ2V0c29ja29wdCgoU09BUF9TT0NLRVQpZmQsIFNPTF9TT0NLRVQsIFNPX0VSUk9SLCAoY2hhciopJnNvYXAtPmVycm51bSwgJmspICYmICFzb2FwLT5lcnJudW0pCS8qIHBvcnRhYmlsaXR5IG5vdGU6IHNlZSBTT0FQX1NPQ0tMRU5fVCBkZWZpbml0aW9uIGluIHN0ZHNvYXAyLmggKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgY29ubmVjdCB0byBob3N0XG4iKSk7CisgICAgICAgIHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiY29ubmVjdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgICAgZWxzZQorI2VuZGlmCisjaWZkZWYgV0lUSF9JUFY2CisgICAgICBpZiAocmVzLT5haV9uZXh0KQorICAgICAgeyByZXMgPSByZXMtPmFpX25leHQ7CisgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICBnb3RvIGFnYWluOworICAgICAgfQorICAgICAgZWxzZQorI2VuZGlmCisgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUikKKyAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IGNvbm5lY3QgdG8gaG9zdFxuIikpOworICAgICAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiY29ubmVjdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgIH0gIAorICAgIGVsc2UKKyAgICAgIGJyZWFrOworICB9CisjaWZkZWYgV0lUSF9JUFY2CisgIHNvYXAtPnBlZXJsZW4gPSAwOyAvKiBJUHY2OiBhbHJlYWR5IGNvbm5lY3RlZCBzbyB1c2Ugc2VuZCgpICovCisgIGZyZWVhZGRyaW5mbyhyZXNzYXZlKTsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPmNvbm5lY3RfdGltZW91dCkKKyNpZiBkZWZpbmVkKFdJTjMyKQorICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAmYmxvY2tpbmcpOworICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICBpb2N0bCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sIChpbnQpKCZibG9ja2luZykpOworICB9CisjZWxzZQorICAgIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX0dFVEZMKSZ+T19OT05CTE9DSyk7CisjZW5kaWYKKyNlbmRpZgorICBzb2FwLT5zb2NrZXQgPSBmZDsKKyAgc29hcC0+aW1vZGUgJj0gflNPQVBfRU5DX1NTTDsKKyAgc29hcC0+b21vZGUgJj0gflNPQVBfRU5DX1NTTDsKKyAgaWYgKCFzdHJuY21wKGVuZHBvaW50LCAiaHR0cHM6IiwgNikpCisgIHsKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICBCSU8gKmJpbzsKKyAgICBpbnQgcjsKKyAgICBpZiAoc29hcC0+cHJveHlfaG9zdCkKKyAgICB7IHNob3J0IHY7CisgICAgICB1bnNpZ25lZCBpbnQgayA9IHNvYXAtPm9tb2RlOyAvKiBtYWtlIHN1cmUgd2Ugb25seSBwYXJzZSBIVFRQICovCisgICAgICBzaXplX3QgbiA9IHNvYXAtPmNvdW50OyAvKiBzYXZlIHRoZSBjb250ZW50IGxlbmd0aCAqLworICAgICAgY2hhciAqdXNlcmlkLCAqcGFzc3dkOworICAgICAgc29hcC0+b21vZGUgJj0gflNPQVBfRU5DOyAvKiBtYXNrIElPIGFuZCBFTkMgKi8KKyAgICAgIHNvYXAtPm9tb2RlIHw9IFNPQVBfSU9fQlVGRkVSOworICAgICAgc29hcF9iZWdpbl9zZW5kKHNvYXApOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb25uZWN0aW5nIHRvIHByb3h5IHNlcnZlclxuIikpOworICAgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICJDT05ORUNUICVzOiVkIEhUVFAvJXMiLCBob3N0LCBwb3J0LCBzb2FwLT5odHRwX3ZlcnNpb24pOworICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgTlVMTCkpKQorICAgICAgeyBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgaWYgKHNvYXAtPnByb3h5X3VzZXJpZCAmJiBzb2FwLT5wcm94eV9wYXNzd2QgJiYgc3RybGVuKHNvYXAtPnByb3h5X3VzZXJpZCkgKyBzdHJsZW4oc29hcC0+cHJveHlfcGFzc3dkKSA8IDc2MSkKKyAgICAgIHsgc3ByaW50Zihzb2FwLT50bXBidWYgKyAyNjIsICIlczolcyIsIHNvYXAtPnByb3h5X3VzZXJpZCwgc29hcC0+cHJveHlfcGFzc3dkKTsKKyAgICAgICAgc3RyY3B5KHNvYXAtPnRtcGJ1ZiwgIkJhc2ljICIpOworICAgICAgICBzb2FwX3MyYmFzZTY0KHNvYXAsIChjb25zdCB1bnNpZ25lZCBjaGFyKikoc29hcC0+dG1wYnVmICsgMjYyKSwgc29hcC0+dG1wYnVmICsgNiwgc3RybGVuKHNvYXAtPnRtcGJ1ZiArIDI2MikpOworICAgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlByb3h5LUF1dGhvcml6YXRpb24iLCBzb2FwLT50bXBidWYpKSkKKyAgICAgICAgeyBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKyNlbmRpZgorICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsIE5VTEwsIE5VTEwpKQorICAgICAgIHx8IHNvYXBfZmx1c2goc29hcCkpCisgICAgICB7IHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyAgICAgIHNvYXAtPm9tb2RlID0gazsKKyAgICAgIGsgPSBzb2FwLT5pbW9kZTsKKyAgICAgIHNvYXAtPmltb2RlICY9IH5TT0FQX0VOQzsgLyogbWFzayBJTyBhbmQgRU5DICovCisgICAgICB2ID0gc29hcC0+dmVyc2lvbjsgLyogcHJlc2VydmUgKi8KKyAgICAgIHVzZXJpZCA9IHNvYXAtPnVzZXJpZDsgLyogcHJlc2VydmUgKi8KKyAgICAgIHBhc3N3ZCA9IHNvYXAtPnBhc3N3ZDsgLyogcHJlc2VydmUgKi8KKyAgICAgIGlmIChzb2FwX2JlZ2luX3JlY3Yoc29hcCkpCisgICAgICB7IHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyAgICAgIHNvYXAtPnVzZXJpZCA9IHVzZXJpZDsgLyogcmVzdG9yZSAqLworICAgICAgc29hcC0+cGFzc3dkID0gcGFzc3dkOyAvKiByZXN0b3JlICovCisgICAgICBzb2FwLT52ZXJzaW9uID0gdjsgLyogcmVzdG9yZSAqLworICAgICAgc29hcC0+aW1vZGUgPSBrOyAvKiByZXN0b3JlICovCisgICAgICBzb2FwLT5jb3VudCA9IG47IC8qIHJlc3RvcmUgKi8KKyAgICAgIHNvYXBfYmVnaW5fc2VuZChzb2FwKTsKKyAgICB9CisgICAgaWYgKCFzb2FwLT5jdHggJiYgKHNvYXAtPmVycm9yID0gc29hcC0+ZnNzbGF1dGgoc29hcCkpKQorICAgIHsgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiU1NMIGF1dGhlbnRpY2F0aW9uIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpOiBjaGVjayBwYXNzd29yZCwga2V5IGZpbGUsIGFuZCBjYSBmaWxlLiIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorICAgIHNvYXAtPnNzbCA9IFNTTF9uZXcoc29hcC0+Y3R4KTsKKyAgICBpZiAoIXNvYXAtPnNzbCkKKyAgICB7IHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1NTTF9FUlJPUjsKKyAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgIH0KKyAgICBpZiAoc29hcC0+c2Vzc2lvbikKKyAgICB7IGlmICghc3RyY21wKHNvYXAtPnNlc3Npb25faG9zdCwgaG9zdCkgJiYgc29hcC0+c2Vzc2lvbl9wb3J0ID09IHBvcnQpCisgICAgICAgIFNTTF9zZXRfc2Vzc2lvbihzb2FwLT5zc2wsIHNvYXAtPnNlc3Npb24pOworICAgICAgU1NMX1NFU1NJT05fZnJlZShzb2FwLT5zZXNzaW9uKTsKKyAgICAgIHNvYXAtPnNlc3Npb24gPSBOVUxMOworICAgIH0KKyAgICBzb2FwLT5pbW9kZSB8PSBTT0FQX0VOQ19TU0w7CisgICAgc29hcC0+b21vZGUgfD0gU09BUF9FTkNfU1NMOworICAgIGJpbyA9IEJJT19uZXdfc29ja2V0KChTT0FQX1NPQ0tFVClmZCwgQklPX05PQ0xPU0UpOworICAgIFNTTF9zZXRfYmlvKHNvYXAtPnNzbCwgYmlvLCBiaW8pOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0KQorI2lmIGRlZmluZWQoV0lOMzIpCisgICAgeyB1X2xvbmcgbm9uYmxvY2tpbmcgPSAxOworICAgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAmbm9uYmxvY2tpbmcpOworICAgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgICB7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgICBpb2N0bCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sIChpbnQpKCZub25ibG9ja2luZykpOworICAgIH0KKyNlbHNlCisgICAgICBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9HRVRGTCl8T19OT05CTE9DSyk7CisjZW5kaWYKKyNlbmRpZgorICAgIGZvciAoOzspCisgICAgeyBpZiAoKHIgPSBTU0xfY29ubmVjdChzb2FwLT5zc2wpKSA8PSAwKQorICAgICAgeyBpbnQgZXJyID0gU1NMX2dldF9lcnJvcihzb2FwLT5zc2wsIHIpOworICAgICAgICBpZiAoZXJyICE9IFNTTF9FUlJPUl9OT05FICYmIGVyciAhPSBTU0xfRVJST1JfV0FOVF9SRUFEICYmIGVyciAhPSBTU0xfRVJST1JfV0FOVF9XUklURSkKKyAgICAgICAgeyBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgc3NsX2Vycm9yKHNvYXAsIHIpLCAiU1NMIGNvbm5lY3QgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvYXAtPmNvbm5lY3RfdGltZW91dCkKKyAgICAgICAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgICAgICAgIGZkX3NldCBmZHM7CisgICAgICAgICAgaWYgKHNvYXAtPmNvbm5lY3RfdGltZW91dCA+IDApCisgICAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IHNvYXAtPmNvbm5lY3RfdGltZW91dDsKKyAgICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gLXNvYXAtPmNvbm5lY3RfdGltZW91dC8xMDAwMDAwOworICAgICAgICAgICAgdGltZW91dC50dl91c2VjID0gLXNvYXAtPmNvbm5lY3RfdGltZW91dCUxMDAwMDAwOworICAgICAgICAgIH0KKyAgICAgICAgICBGRF9aRVJPKCZmZHMpOworICAgICAgICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpZmQsICZmZHMpOworICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgeyBpbnQgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKGZkICsgMSksICZmZHMsIE5VTEwsICZmZHMsICZ0aW1lb3V0KTsKKyAgICAgICAgICAgIGlmIChyID4gMCkKKwkgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmICghcikKKyAgICAgICAgICAgIHsgc29hcC0+ZXJybnVtID0gMDsKKyAgICAgICAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb25uZWN0IHRpbWVvdXRcbiIpKTsKKyAgICAgICAgICAgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsICJUaW1lb3V0IiwgImNvbm5lY3QgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICAgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisJICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0KQorI2lmZGVmIFdJTjMyCisgICAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAmYmxvY2tpbmcpOworICAgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgICBpb2N0bCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sIChpbnQpKCZibG9ja2luZykpOworICAgIH0KKyNlbHNlCisgICAgICBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9HRVRGTCkmfk9fTk9OQkxPQ0spOworI2VuZGlmCisjZW5kaWYKKyAgICBpZiAoc29hcC0+cmVxdWlyZV9zZXJ2ZXJfYXV0aCkKKyAgICB7IFg1MDkgKnBlZXI7CisgICAgICBpbnQgZXJyOworICAgICAgaWYgKChlcnIgPSBTU0xfZ2V0X3ZlcmlmeV9yZXN1bHQoc29hcC0+c3NsKSkgIT0gWDUwOV9WX09LKQorICAgICAgeyBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgWDUwOV92ZXJpZnlfY2VydF9lcnJvcl9zdHJpbmcoZXJyKSwgIlNTTCBjZXJ0aWZpY2F0ZSBwcmVzZW50ZWQgYnkgcGVlciBjYW5ub3QgYmUgdmVyaWZpZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgICAgcGVlciA9IFNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZShzb2FwLT5zc2wpOworICAgICAgaWYgKCFwZWVyKQorICAgICAgeyBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJObyBTU0wgY2VydGlmaWNhdGUgd2FzIHByZXNlbnRlZCBieSB0aGUgcGVlciBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9TU0xfRVJST1IpOworICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgICBYNTA5X05BTUVfZ2V0X3RleHRfYnlfTklEKFg1MDlfZ2V0X3N1YmplY3RfbmFtZShwZWVyKSwgTklEX2NvbW1vbk5hbWUsIHNvYXAtPm1zZ2J1Ziwgc2l6ZW9mKHNvYXAtPm1zZ2J1ZikpOworICAgICAgWDUwOV9mcmVlKHBlZXIpOworICAgICAgaWYgKHNvYXBfdGFnX2NtcChzb2FwLT5tc2didWYsIGhvc3QpKQorICAgICAgeyBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJTU0wgY2VydGlmaWNhdGUgaG9zdCBuYW1lIG1pc21hdGNoIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgIHNvYXAtPmVycm9yID0gU09BUF9TU0xfRVJST1I7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisjZW5kaWYKKyAgfQorICByZXR1cm4gZmQ7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYmluZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQsIGludCBiYWNrbG9nKQoreworI2lmZGVmIFdJVEhfSVBWNgorICBzdHJ1Y3QgYWRkcmluZm8gKmFkZHJpbmZvID0gTlVMTDsKKyAgc3RydWN0IGFkZHJpbmZvIGhpbnRzOworICBzdHJ1Y3QgYWRkcmluZm8gcmVzOworICBpbnQgZXJyOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpbnQgbGVuID0gU09BUF9CVUZMRU47CisgIGludCBzZXQgPSAxOworI2VuZGlmCisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpKQorICB7IHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyKTsKKyAgICBzb2FwLT5tYXN0ZXIgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIHNvYXAtPnNvY2tldCA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIHNvYXAtPmVycm1vZGUgPSAxOworICBpZiAodGNwX2luaXQoc29hcCkpCisgIHsgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiVENQIGluaXQgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisjaWZkZWYgV0lUSF9JUFY2CisgIG1lbXNldCgodm9pZCopJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKyAgaGludHMuYWlfZmFtaWx5ID0gUEZfVU5TUEVDOworI2lmZGVmIFdJVEhfVURQCisgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX0RHUkFNOworICBlbHNlCisjZW5kaWYKKyAgICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworICBoaW50cy5haV9mbGFncyA9IEFJX1BBU1NJVkU7CisgIHNvYXAtPmVycm1vZGUgPSAyOworICBlcnIgPSBnZXRhZGRyaW5mbyhob3N0LCBzb2FwX2ludDJzKHNvYXAsIHBvcnQpLCAmaGludHMsICZhZGRyaW5mbyk7CisgIGlmIChhZGRyaW5mbykKKyAgeyByZXMgPSAqYWRkcmluZm87CisgICAgc29hcC0+cGVlciA9ICooKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKilhZGRyaW5mby0+YWlfYWRkcik7CisgICAgc29hcC0+cGVlcmxlbiA9IGFkZHJpbmZvLT5haV9hZGRybGVuOworICAgIHJlcy5haV9hZGRyID0gKHN0cnVjdCBzb2NrYWRkciopJnNvYXAtPnBlZXI7CisgICAgcmVzLmFpX2FkZHJsZW4gPSBzb2FwLT5wZWVybGVuOworICAgIGZyZWVhZGRyaW5mbyhhZGRyaW5mbyk7CisgIH0KKyAgaWYgKGVycikKKyAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCBnYWlfc3RyZXJyb3IoZXJyKSwgImdldGFkZHJpbmZvIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBzb2FwLT5tYXN0ZXIgPSBzb2NrZXQocmVzLmFpX2ZhbWlseSwgcmVzLmFpX3NvY2t0eXBlLCByZXMuYWlfcHJvdG9jb2wpOworI2Vsc2UKKyNpZmRlZiBXSVRIX1VEUAorICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIHNvYXAtPm1hc3RlciA9IChpbnQpc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworICBlbHNlCisjZW5kaWYKKyAgICBzb2FwLT5tYXN0ZXIgPSAoaW50KXNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisjZW5kaWYKKyAgc29hcC0+ZXJybW9kZSA9IDA7CisgIGlmICghc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzb2NrZXQgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisjaWZkZWYgV0lUSF9VRFAKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICBzb2FwLT5zb2NrZXQgPSBzb2FwLT5tYXN0ZXI7CisjZW5kaWYKKyNpZmRlZiBTT0NLRVRfQ0xPU0VfT05fRVhFQworI2lmZGVmIFdJTjMyCisjaWZuZGVmIFVOREVSX0NFCisgIFNldEhhbmRsZUluZm9ybWF0aW9uKChIQU5ETEUpc29hcC0+bWFzdGVyLCBIQU5ETEVfRkxBR19JTkhFUklULCAwKTsKKyNlbmRpZgorI2Vsc2UKKyAgZmNudGwoc29hcC0+bWFzdGVyLCBGX1NFVEZELCAxKTsKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+YmluZF9mbGFncyAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIFNPTF9TT0NLRVQsIHNvYXAtPmJpbmRfZmxhZ3MsIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgaWYgKCgoc29hcC0+aW1vZGUgfCBzb2FwLT5vbW9kZSkgJiBTT0FQX0lPX0tFRVBBTElWRSkgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBTT0xfU09DS0VULCBTT19LRUVQQUxJVkUsIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19LRUVQQUxJVkUgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIGlmIChzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwgKGNoYXIqKSZsZW4sIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX1NOREJVRiBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgU09MX1NPQ0tFVCwgU09fUkNWQlVGLCAoY2hhciopJmxlbiwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fUkNWQlVGIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorI2lmZGVmIFRDUF9OT0RFTEFZCisgIGlmICghKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgVENQX05PREVMQVkgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIFdJVEhfSVBWNgorICBzb2FwLT5lcnJtb2RlID0gMDsKKyAgaWYgKGJpbmQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgcmVzLmFpX2FkZHIsIHJlcy5haV9hZGRybGVuKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBiaW5kIHRvIGhvc3RcbiIpKTsKKyAgICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJiaW5kIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfSAgCisjZWxzZQorICBzb2FwLT5wZWVybGVuID0gc2l6ZW9mKHNvYXAtPnBlZXIpOworICBtZW1zZXQoKHZvaWQqKSZzb2FwLT5wZWVyLCAwLCBzaXplb2Yoc29hcC0+cGVlcikpOworICBzb2FwLT5wZWVyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICBzb2FwLT5lcnJtb2RlID0gMjsKKyAgaWYgKGhvc3QpCisgIHsgaWYgKHNvYXAtPmZyZXNvbHZlKHNvYXAsIGhvc3QsICZzb2FwLT5wZWVyLnNpbl9hZGRyKSkKKyAgICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImdldCBob3N0IGJ5IG5hbWUgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorICB9CisgIGVsc2UKKyAgICBzb2FwLT5wZWVyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9BTlkpOworICBzb2FwLT5wZWVyLnNpbl9wb3J0ID0gaHRvbnMoKHNob3J0KXBvcnQpOworICBzb2FwLT5lcnJtb2RlID0gMDsKKyAgaWYgKGJpbmQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgKHN0cnVjdCBzb2NrYWRkciopJnNvYXAtPnBlZXIsIHNvYXAtPnBlZXJsZW4pKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IGJpbmQgdG8gaG9zdFxuIikpOworICAgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImJpbmQgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisjZW5kaWYKKyAgaWYgKCEoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkgJiYgbGlzdGVuKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIGJhY2tsb2cpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IGJpbmQgdG8gaG9zdFxuIikpOworICAgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImxpc3RlbiBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0gIAorICByZXR1cm4gc29hcC0+bWFzdGVyOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3BvbGwoc3RydWN0IHNvYXAgKnNvYXApCit7IAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgZmRfc2V0IHJmZCwgc2ZkLCB4ZmQ7CisgIGludCByOworICB0aW1lb3V0LnR2X3NlYyA9IDA7CisgIHRpbWVvdXQudHZfdXNlYyA9IDA7CisgIEZEX1pFUk8oJnJmZCk7CisgIEZEX1pFUk8oJnNmZCk7CisgIEZEX1pFUk8oJnhmZCk7CisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICB7IEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmcmZkKTsKKyAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnNmZCk7CisgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZ4ZmQpOworICAgIHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgJnJmZCwgJnNmZCwgJnhmZCwgJnRpbWVvdXQpOworICAgIGlmIChyID4gMCAmJiBGRF9JU1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmeGZkKSkKKyAgICAgIHIgPSAtMTsKKyAgfQorICBlbHNlIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpKQorICB7IEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCAmc2ZkKTsKKyAgICByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+bWFzdGVyICsgMSksIE5VTEwsICZzZmQsIE5VTEwsICZ0aW1lb3V0KTsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIGlmIChyID4gMCkKKyAgeworI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgIGlmIChzb2FwLT5pbW9kZSAmIFNPQVBfRU5DX1NTTCkKKyAgICB7CisgICAgICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KQorICAgICAgICYmIEZEX0lTU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZzZmQpCisgICAgICAgJiYgKCFGRF9JU1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmcmZkKQorICAgICAgICB8fCBTU0xfcGVlayhzb2FwLT5zc2wsIHNvYXAtPnRtcGJ1ZiwgMSkgPiAwKSkKKyAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgICAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkKKyAgICAgICAmJiBGRF9JU1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmc2ZkKQorICAgICAgICYmICghRkRfSVNTRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnJmZCkKKyAgICAgICAgfHwgcmVjdigoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzb2FwLT50bXBidWYsIDEsIE1TR19QRUVLKSA+IDApKQorICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICBlbHNlIGlmIChyIDwgMCkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBpZiAoKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikgfHwgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUikKKyAgICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNlbGVjdCBmYWlsZWQgaW4gc29hcF9wb2xsKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1RDUF9FUlJPUjsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIHNvYXAtPmVycm51bSA9IDA7CisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJQb2xsaW5nOiBvdGhlciBlbmQgZG93biBvbiBzb2NrZXQ9JWQgc2VsZWN0PSVkXG4iLCBzb2FwLT5zb2NrZXQsIHIpKTsKKyAgcmV0dXJuIFNPQVBfRU9GOworI2Vsc2UKKyAgcmV0dXJuIFNPQVBfT0s7CisjZW5kaWYKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3RjcF9hY2NlcHQoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzLCBzdHJ1Y3Qgc29ja2FkZHIgKmEsIGludCAqbikKK3sgaW50IGZkOworICBmZCA9IChpbnQpYWNjZXB0KChTT0FQX1NPQ0tFVClzLCBhLCAoU09BUF9TT0NLTEVOX1QqKW4pOwkvKiBwb3J0YWJpbGl0eSBub3RlOiBzZWUgU09BUF9TT0NLTEVOX1QgZGVmaW5pdGlvbiBpbiBzdGRzb2FwMi5oICovCisjaWZkZWYgU09DS0VUX0NMT1NFX09OX0VYRUMKKyNpZmRlZiBXSU4zMgorI2lmbmRlZiBVTkRFUl9DRQorICBTZXRIYW5kbGVJbmZvcm1hdGlvbigoSEFORExFKWZkLCBIQU5ETEVfRkxBR19JTkhFUklULCAwKTsKKyNlbmRpZgorI2Vsc2UKKyAgZmNudGwoZmQsIEZfU0VURkQsIEZEX0NMT0VYRUMpOworI2VuZGlmCisjZW5kaWYKKyAgcmV0dXJuIGZkOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2FjY2VwdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaW50IG4gPSAoaW50KXNpemVvZihzb2FwLT5wZWVyKTsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGludCBsZW4gPSBTT0FQX0JVRkxFTjsKKyAgaW50IHNldCA9IDE7CisjZW5kaWYKKyAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworI2lmZGVmIFdJVEhfVURQCisgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgcmV0dXJuIHNvYXAtPnNvY2tldCA9IHNvYXAtPm1hc3RlcjsKKyNlbmRpZgorICBtZW1zZXQoKHZvaWQqKSZzb2FwLT5wZWVyLCAwLCBzaXplb2Yoc29hcC0+cGVlcikpOworICBzb2FwLT5zb2NrZXQgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICBzb2FwLT5lcnJtb2RlID0gMDsKKyAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7CisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpKQorICB7IGZvciAoOzspCisgICAgeyAKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICBpZiAoc29hcC0+YWNjZXB0X3RpbWVvdXQpCisgICAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICAgIGZkX3NldCBmZDsKKyAgICAgICAgaWYgKHNvYXAtPmFjY2VwdF90aW1lb3V0ID4gMCkKKyAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IHNvYXAtPmFjY2VwdF90aW1lb3V0OworICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gLXNvYXAtPmFjY2VwdF90aW1lb3V0LzEwMDAwMDA7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gLXNvYXAtPmFjY2VwdF90aW1lb3V0JTEwMDAwMDA7CisgICAgICAgIH0KKyAgICAgICAgRkRfWkVSTygmZmQpOworICAgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgJmZkKTsKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeyBpbnQgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPm1hc3RlciArIDEpLCAmZmQsICZmZCwgTlVMTCwgJnRpbWVvdXQpOworICAgICAgICAgIGlmIChyID4gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGlmICghcikKKyAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IDA7CisgICAgICAgICAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiVGltZW91dCIsICJhY2NlcHQgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIpCisgICAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICAgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgICAgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImFjY2VwdCBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICAgIH0KKyAgICAgICAgfQorI2lmIGRlZmluZWQoV0lOMzIpCisJeyB1X2xvbmcgbm9uYmxvY2tpbmcgPSAxOworICAgICAgICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZJT05CSU8sICZub25ibG9ja2luZyk7CisgICAgICAgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgICAgICAgeyB1X2xvbmcgbm9uYmxvY2tpbmcgPSAxOworICAgICAgICAgIGlvY3RsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZJT05CSU8sIChpbnQpKCZub25ibG9ja2luZykpOworICAgICAgICB9CisjZWxzZQorICAgICAgICBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGX0dFVEZMKXxPX05PTkJMT0NLKTsKKyNlbmRpZgorICAgICAgfQorICAgICAgZWxzZQorI2lmIGRlZmluZWQoV0lOMzIpCisgICAgICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZJT05CSU8sICZibG9ja2luZyk7CisgICAgICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgICAgICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgICAgIGlvY3RsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZJT05CSU8sIChpbnQpKCZibG9ja2luZykpOworICAgICAgfQorI2Vsc2UKKyAgICAgICAgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRl9HRVRGTCkmfk9fTk9OQkxPQ0spOworI2VuZGlmCisjZW5kaWYKKyAgICAgIHNvYXAtPnNvY2tldCA9IHNvYXAtPmZhY2NlcHQoc29hcCwgc29hcC0+bWFzdGVyLCAoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlciwgJm4pOworICAgICAgc29hcC0+cGVlcmxlbiA9IChzaXplX3QpbjsKKyAgICAgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICAgICAgeworI2lmZGVmIFdJVEhfSVBWNgorLyogVXNlIHNvYXAtPmhvc3QgdG8gc3RvcmUgdGhlIG51bWVyaWMgZm9ybSBvZiB0aGUgcmVtb3RlIGhvc3QgKi8KKyAgICAgICAgZ2V0bmFtZWluZm8oKHN0cnVjdCBzb2NrYWRkciopJnNvYXAtPnBlZXIsIG4sIHNvYXAtPmhvc3QsIHNpemVvZihzb2FwLT5ob3N0KSwgTlVMTCwgMCwgTklfTlVNRVJJQ0hPU1QgfCBOSV9OVU1FUklDU0VSVik7IAorICAgICAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiQWNjZXB0IHNvY2tldCAlZCBmcm9tICVzXG4iLCBzb2FwLT5zb2NrZXQsIHNvYXAtPmhvc3QpKTsKKyAgICAgICAgc29hcC0+aXAgPSAwOyAvKiBpbmZvIHN0b3JlZCBpbiBzb2FwLT5wZWVyIGFuZCBzb2FwLT5ob3N0ICovCisgICAgICAgIHNvYXAtPnBvcnQgPSAwOyAvKiBpbmZvIHN0b3JlZCBpbiBzb2FwLT5wZWVyIGFuZCBzb2FwLT5ob3N0ICovCisjZWxzZQorICAgICAgICBzb2FwLT5pcCA9IG50b2hsKHNvYXAtPnBlZXIuc2luX2FkZHIuc19hZGRyKTsKKyAgICAgICAgc29hcC0+cG9ydCA9IChpbnQpbnRvaHMoc29hcC0+cGVlci5zaW5fcG9ydCk7IC8qIGRvZXMgbm90IHJldHVybiBwb3J0IG51bWJlciBvbiBzb21lIHN5c3RlbXMgKi8KKyAgICAgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFjY2VwdCBzb2NrZXQgJWQgYXQgcG9ydCAlZCBmcm9tIElQICVkLiVkLiVkLiVkXG4iLCBzb2FwLT5zb2NrZXQsIHNvYXAtPnBvcnQsIChpbnQpKHNvYXAtPmlwPj4yNCkmMHhGRiwgKGludCkoc29hcC0+aXA+PjE2KSYweEZGLCAoaW50KShzb2FwLT5pcD4+OCkmMHhGRiwgKGludClzb2FwLT5pcCYweEZGKSk7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisJaWYgKHNvYXAtPmFjY2VwdF9mbGFncyAmIFNPX0xJTkdFUikKKyAgICAgICAgeyBzdHJ1Y3QgbGluZ2VyIGxpbmdlcjsKKyAgICAgICAgICBtZW1zZXQoKHZvaWQqKSZsaW5nZXIsIDAsIHNpemVvZihsaW5nZXIpKTsKKyAgICAgICAgICBsaW5nZXIubF9vbm9mZiA9IDE7CisgICAgICAgICAgbGluZ2VyLmxfbGluZ2VyID0gMDsKKwkgIGlmIChzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIFNPTF9TT0NLRVQsIFNPX0xJTkdFUiwgKGNoYXIqKSZsaW5nZXIsIHNpemVvZihzdHJ1Y3QgbGluZ2VyKSkpCisgICAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKwkgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19MSU5HRVIgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisJICAgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisJICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChzb2FwLT5hY2NlcHRfZmxhZ3MgJiB+U09fTElOR0VSKSAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIFNPTF9TT0NLRVQsIHNvYXAtPmFjY2VwdF9mbGFncyAmIH5TT19MSU5HRVIsIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKwkgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICB9CisgICAgICAgIGlmICgoKHNvYXAtPmltb2RlIHwgc29hcC0+b21vZGUpICYgU09BUF9JT19LRUVQQUxJVkUpICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fS0VFUEFMSVZFIGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworCSAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgU09MX1NPQ0tFVCwgU09fU05EQlVGLCAoY2hhciopJmxlbiwgc2l6ZW9mKGludCkpKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fU05EQlVGIGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworCSAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgU09MX1NPQ0tFVCwgU09fUkNWQlVGLCAoY2hhciopJmxlbiwgc2l6ZW9mKGludCkpKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fUkNWQlVGIGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworCSAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgIH0KKyNpZmRlZiBUQ1BfTk9ERUxBWQorICAgICAgICBpZiAoIShzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFRDUF9OT0RFTEFZIGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworCSAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgIH0KKyNlbmRpZgorI2VuZGlmCisgICAgICAgIGlmIChzb2FwLT5hY2NlcHRfdGltZW91dCkKKyAgICAgICAgeworI2lmIGRlZmluZWQoV0lOMzIpCisgICAgICAgICAgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICAgICAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGSU9OQklPLCAmYmxvY2tpbmcpOworICAgICAgICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZJT05CSU8sICZibG9ja2luZyk7CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgICAgICAgICAgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICAgICAgICBpb2N0bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGSU9OQklPLCAoaW50KSgmYmxvY2tpbmcpKTsKKyAgICAgICAgICBpb2N0bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGSU9OQklPLCAoaW50KSgmYmxvY2tpbmcpKTsKKyNlbGlmIGRlZmluZWQoUEFMTSkKKyAgICAgICAgICBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGX0dFVEZMLDApJn5PX05PTkJMT0NLKTsKKyAgICAgICAgICBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGX0dFVEZMLDApJn5PX05PTkJMT0NLKTsKKyNlbGlmIGRlZmluZWQoU1lNQklBTikKKyAgICAgICAgICBsb25nIGJsb2NraW5nID0gMDsKKyAgICAgICAgICBpb2N0bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCAwLypGSU9OQklPKi8sICZibG9ja2luZyk7CisjZWxzZQorICAgICAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfR0VURkwpJn5PX05PTkJMT0NLKTsKKyAgICAgICAgICBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGX0dFVEZMKSZ+T19OT05CTE9DSyk7CisjZW5kaWYKKwl9CisgICAgICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAoKChzb2FwLT5pbW9kZSB8IHNvYXAtPm9tb2RlKSAmIFNPQVBfSU9fS0VFUEFMSVZFKSAhPSAwKTsKKyAgICAgICAgcmV0dXJuIHNvYXAtPnNvY2tldDsKKyAgICAgIH0KKyAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUFHQUlOKQorICAgICAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiQWNjZXB0IGZhaWxlZCBmcm9tICVzXG4iLCBzb2FwLT5ob3N0KSk7CisgICAgICAgIHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJhY2NlcHQgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisJc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsgc29hcC0+ZXJybnVtID0gMDsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJubyBtYXN0ZXIgc29ja2V0IGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3RjcF9kaXNjb25uZWN0KHN0cnVjdCBzb2FwICpzb2FwKQoreworI2lmZGVmIFdJVEhfT1BFTlNTTAorICBpZiAoc29hcC0+c3NsKQorICB7IGludCByLCBzID0gMDsKKyAgICBpZiAoc29hcC0+c2Vzc2lvbikKKyAgICAgIFNTTF9TRVNTSU9OX2ZyZWUoc29hcC0+c2Vzc2lvbik7CisgICAgaWYgKCpzb2FwLT5ob3N0KQorICAgIHsgc29hcC0+c2Vzc2lvbiA9IFNTTF9nZXQxX3Nlc3Npb24oc29hcC0+c3NsKTsKKyAgICAgIGlmIChzb2FwLT5zZXNzaW9uKQorICAgICAgeyBzdHJjcHkoc29hcC0+c2Vzc2lvbl9ob3N0LCBzb2FwLT5ob3N0KTsKKyAgICAgICAgc29hcC0+c2Vzc2lvbl9wb3J0ID0gc29hcC0+cG9ydDsKKyAgICAgIH0KKyAgICB9CisgICAgciA9IFNTTF9zaHV0ZG93bihzb2FwLT5zc2wpOworICAgIGlmIChyICE9IDEpCisgICAgeyBzID0gRVJSX2dldF9lcnJvcigpOworICAgICAgaWYgKHMpCisgICAgICB7IGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICAgICAgICB7IHNvYXAtPmZzaHV0ZG93bnNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAxKTsKKyAgICAgICAgICBzb2FwLT5zb2NrZXQgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICB9CisgICAgICAgIHIgPSBTU0xfc2h1dGRvd24oc29hcC0+c3NsKTsKKyAgICAgIH0KKyAgICB9CisgICAgREJHTE9HKFRFU1QsIGlmIChzKSBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2h1dGRvd24gZmFpbGVkOiAlZFxuIiwgU1NMX2dldF9lcnJvcihzb2FwLT5zc2wsIHIpKSk7CisgICAgU1NMX2ZyZWUoc29hcC0+c3NsKTsKKyAgICBzb2FwLT5zc2wgPSBOVUxMOworICAgIGlmIChzKQorICAgICAgcmV0dXJuIFNPQVBfU1NMX0VSUk9SOworICAgIEVSUl9yZW1vdmVfc3RhdGUoMCk7CisgIH0KKyNlbmRpZgorICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSAmJiAhKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICB7IHNvYXAtPmZzaHV0ZG93bnNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAyKTsKKyAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCk7CisgICAgc29hcC0+c29ja2V0ID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3RjcF9jbG9zZXNvY2tldChzdHJ1Y3Qgc29hcCAqc29hcCwgU09BUF9TT0NLRVQgZmQpCit7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ2xvc2Ugc29ja2V0ICVkXG4iLCAoaW50KWZkKSk7CisgIHJldHVybiBjbG9zZXNvY2tldChmZCk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Cit0Y3Bfc2h1dGRvd25zb2NrZXQoc3RydWN0IHNvYXAgKnNvYXAsIFNPQVBfU09DS0VUIGZkLCBpbnQgaG93KQoreyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNodXRkb3duIHNvY2tldCAlZCBob3c9JWRcbiIsIChpbnQpZmQsIGhvdykpOworICByZXR1cm4gc2h1dGRvd24oZmQsIGhvdyk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9jbG9zZXNvY2soc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBzdGF0dXMgPSBzb2FwLT5lcnJvcjsKKyAgaWYgKHN0YXR1cyA9PSBTT0FQX0VPRiB8fCBzdGF0dXMgPT0gU09BUF9UQ1BfRVJST1IgfHwgc3RhdHVzID09IFNPQVBfU1NMX0VSUk9SIHx8ICFzb2FwLT5rZWVwX2FsaXZlKQorICB7IGlmIChzb2FwLT5mY2xvc2UgJiYgKHNvYXAtPmVycm9yID0gc29hcC0+ZmNsb3NlKHNvYXApKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBzb2FwLT5rZWVwX2FsaXZlID0gMDsKKyAgfQorI2lmZGVmIFdJVEhfWkxJQgorICBpZiAoc29hcC0+emxpYl9zdGF0ZSA9PSBTT0FQX1pMSUJfREVGTEFURSkKKyAgICBkZWZsYXRlRW5kKCZzb2FwLT5kX3N0cmVhbSk7CisgIGVsc2UgaWYgKHNvYXAtPnpsaWJfc3RhdGUgPT0gU09BUF9aTElCX0lORkxBVEUpCisgICAgaW5mbGF0ZUVuZCgmc29hcC0+ZF9zdHJlYW0pOworICBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX05PTkU7CisjZW5kaWYKKyAgcmV0dXJuIHNvYXAtPmVycm9yID0gc3RhdHVzOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3NpemVfdAorU09BUF9GTUFDMgorc29hcF9oYXNoKHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnMpCit7IHJlZ2lzdGVyIHNpemVfdCBoID0gMDsKKyAgd2hpbGUgKCpzKQorICAgIGggPSA2NTU5OSpoICsgKnMrKzsKKyAgcmV0dXJuIGggJSBTT0FQX0lESEFTSDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyB2b2lkCitzb2FwX2luaXRfcGh0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgaTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbml0aWFsaXppbmcgcG9pbnRlciBoYXNodGFibGVcbiIpKTsKKyAgc29hcC0+cGJsayA9IE5VTEw7CisgIHNvYXAtPnBpZHggPSAwOworICBmb3IgKGkgPSAwOyBpIDwgKGludClTT0FQX1BUUkhBU0g7IGkrKykKKyAgICBzb2FwLT5waHRbaV0gPSBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcCoKK1NPQVBfRk1BQzIKK3NvYXBfbmV3MShzb2FwX21vZGUgbW9kZSkKK3sgcmV0dXJuIHNvYXBfbmV3Mihtb2RlLCBtb2RlKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwKgorU09BUF9GTUFDMgorc29hcF9uZXcoKQoreyByZXR1cm4gc29hcF9uZXcyKFNPQVBfSU9fREVGQVVMVCwgU09BUF9JT19ERUZBVUxUKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwKgorU09BUF9GTUFDMgorc29hcF9uZXcyKHNvYXBfbW9kZSBpbW9kZSwgc29hcF9tb2RlIG9tb2RlKQoreyBzdHJ1Y3Qgc29hcCAqc29hcCA9IChzdHJ1Y3Qgc29hcCopbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc29hcCkpOworICBpZiAoc29hcCkKKyAgICBzb2FwX2luaXQyKHNvYXAsIGltb2RlLCBvbW9kZSk7CisgIHJldHVybiBzb2FwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9kZWwoc3RydWN0IHNvYXAgKnNvYXApCit7IGZyZWUoc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQKK3NvYXBfZnJlZV9waHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BibGsgKnBiLCAqbmV4dDsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZSBwb2ludGVyIGhhc2h0YWJsZVxuIikpOworICBmb3IgKHBiID0gc29hcC0+cGJsazsgcGI7IHBiID0gbmV4dCkKKyAgeyBuZXh0ID0gcGItPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIHBiKTsKKyAgfQorICBzb2FwLT5wYmxrID0gTlVMTDsKKyAgc29hcC0+cGlkeCA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCAoaW50KVNPQVBfUFRSSEFTSDsgaSsrKQorICAgIHNvYXAtPnBodFtpXSA9IE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW1iZWQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgbiwgY29uc3QgY2hhciAqdGFnLCBpbnQgdHlwZSkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgaWYgKHNvYXAtPnZlcnNpb24gIT0gMSkKKyAgICBzb2FwLT5lbmNvZGluZyA9IDE7CisgIGlmIChhKQorICAgIGkgPSBzb2FwX2FycmF5X3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIGEsIG4sIHR5cGUsICZwcCk7CisgIGVsc2UKKyAgICBpID0gc29hcF9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCB0eXBlLCAmcHApOworICBpZiAoaSkKKyAgeyBpZiAoc29hcF9pc19lbWJlZGRlZChzb2FwLCBwcCkKKyAgICAgfHwgc29hcF9pc19zaW5nbGUoc29hcCwgcHApKQorICAgICAgcmV0dXJuIDA7CisgICAgc29hcF9zZXRfZW1iZWRkZWQoc29hcCwgcHApOworICB9CisgIHJldHVybiBpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3BvaW50ZXJfbG9va3VwKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBpbnQgdHlwZSwgc3RydWN0IHNvYXBfcGxpc3QgKipwcHApCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgKnBwcCA9IE5VTEw7CisgIGlmIChwKQorICB7IGZvciAocHAgPSBzb2FwLT5waHRbc29hcF9oYXNoX3B0cihwKV07IHBwOyBwcCA9IHBwLT5uZXh0KQorICAgIHsgaWYgKHBwLT5wdHIgPT0gcCAmJiBwcC0+dHlwZSA9PSB0eXBlKQorICAgICAgeyAqcHBwID0gcHA7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTG9va3VwIGxvY2F0aW9uPSVwIHR5cGU9JWQgaWQ9JWRcbiIsIHAsIHR5cGUsIHBwLT5pZCkpOworICAgICAgICByZXR1cm4gcHAtPmlkOworICAgICAgfQorICAgIH0KKyAgfQorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkxvb2t1cCBsb2NhdGlvbj0lcCB0eXBlPSVkOiBub3QgZm91bmRcbiIsIHAsIHR5cGUpKTsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcG9pbnRlcl9lbnRlcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCwgY29uc3Qgc3RydWN0IHNvYXBfYXJyYXkgKmEsIGludCBuLCBpbnQgdHlwZSwgc3RydWN0IHNvYXBfcGxpc3QgKipwcHApCit7IHJlZ2lzdGVyIGludCBoOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgIGlmICghc29hcC0+cGJsayB8fCBzb2FwLT5waWR4ID49IFNPQVBfUFRSQkxLKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BibGsgKnBiID0gKHN0cnVjdCBzb2FwX3BibGsqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9wYmxrKSk7CisgICAgaWYgKCFwYikKKyAgICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcGItPm5leHQgPSBzb2FwLT5wYmxrOworICAgIHNvYXAtPnBibGsgPSBwYjsKKyAgICBzb2FwLT5waWR4ID0gMDsKKyAgfQorICAqcHBwID0gcHAgPSAmc29hcC0+cGJsay0+cGxpc3Rbc29hcC0+cGlkeCsrXTsKKyAgaWYgKGEpCisgICAgaCA9IHNvYXBfaGFzaF9wdHIoYS0+X19wdHIpOworICBlbHNlCisgICAgaCA9IHNvYXBfaGFzaF9wdHIocCk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUG9pbnRlciBlbnRlciBsb2NhdGlvbj0lcCBhcnJheT0lcCBzaXplPSVkIGRpbT0lZCB0eXBlPSVkIGlkPSVkXG4iLCBwLCBhP2EtPl9fcHRyOk5VTEwsIGE/YS0+X19zaXplOjAsIG4sIHR5cGUsIHNvYXAtPmlkbnVtKzEpKTsKKyAgcHAtPm5leHQgPSBzb2FwLT5waHRbaF07CisgIHBwLT50eXBlID0gdHlwZTsKKyAgcHAtPm1hcmsxID0gMDsKKyAgcHAtPm1hcmsyID0gMDsKKyAgcHAtPnB0ciA9IHA7CisgIHBwLT5hcnJheSA9IGE7CisgIHNvYXAtPnBodFtoXSA9IHBwOworICBwcC0+aWQgPSArK3NvYXAtPmlkbnVtOworICByZXR1cm4gcHAtPmlkOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2FycmF5X3BvaW50ZXJfbG9va3VwKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGludCB0eXBlLCBzdHJ1Y3Qgc29hcF9wbGlzdCAqKnBwcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICAqcHBwID0gTlVMTDsKKyAgaWYgKCFwIHx8ICFhLT5fX3B0cikKKyAgICByZXR1cm4gMDsKKyAgZm9yIChwcCA9IHNvYXAtPnBodFtzb2FwX2hhc2hfcHRyKGEtPl9fcHRyKV07IHBwOyBwcCA9IHBwLT5uZXh0KQorICB7IGlmIChwcC0+dHlwZSA9PSB0eXBlICYmIHBwLT5hcnJheSAmJiBwcC0+YXJyYXktPl9fcHRyID09IGEtPl9fcHRyKQorICAgIHsgcmVnaXN0ZXIgaW50IGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICBpZiAoKChjb25zdCBpbnQqKSZwcC0+YXJyYXktPl9fc2l6ZSlbaV0gIT0gKChjb25zdCBpbnQqKSZhLT5fX3NpemUpW2ldKQorCSAgYnJlYWs7CisgICAgICBpZiAoaSA9PSBuKQorICAgICAgeyAqcHBwID0gcHA7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQXJyYXkgbG9va3VwIGxvY2F0aW9uPSVwIHR5cGU9JWQgaWQ9JWRcbiIsIGEtPl9fcHRyLCB0eXBlLCBwcC0+aWQpKTsKKyAgICAgICAgcmV0dXJuIHBwLT5pZDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJBcnJheSBsb29rdXAgbG9jYXRpb249JXAgdHlwZT0lZDogbm90IGZvdW5kXG4iLCBhLT5fX3B0ciwgdHlwZSkpOworICByZXR1cm4gMDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JlZ2luX2NvdW50KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwX2Nscl9hdHRyKHNvYXApOworICBzb2FwX3NldF9sb2NhbF9uYW1lc3BhY2VzKHNvYXApOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSB8fCAoc29hcC0+b21vZGUgJiBTT0FQX0VOQ19ESU1FKSkKKyAgICBzb2FwLT5tb2RlID0gc29hcC0+b21vZGUgfCBTT0FQX0lPX0xFTkdUSCB8IFNPQVBfRU5DX0RJTUU7CisgIGVsc2UKKyNlbmRpZgorICB7IHNvYXAtPm1vZGUgPSBzb2FwLT5vbW9kZTsKKyAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX1NUT1JFCisgICAgIHx8ICgoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LIHx8IChzb2FwLT5tb2RlICYgU09BUF9FTkNfWE1MKSkKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgICAgICYmICFzb2FwLT5mcHJlcGFyZXNlbmQKKyNlbmRpZgorICAgICAgKSkKKyAgICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfSU9fTEVOR1RIOworICAgIGVsc2UKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19MRU5HVEg7CisgIH0KKyNpZmRlZiBXSVRIX1pMSUIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQikgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0ZMVVNIKQorICB7IGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSkKKyAgICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfSU9fTEVOR1RIOworICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWE1MKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX0JVRkZFUjsKKyAgICBlbHNlCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fU1RPUkU7CisgIH0KKyNlbmRpZgorICBpZiAoIXNvYXAtPmVuY29kaW5nU3R5bGUgJiYgIShzb2FwLT5tb2RlICYgU09BUF9YTUxfR1JBUEgpKQorICAgIHNvYXAtPm1vZGUgfD0gU09BUF9YTUxfVFJFRTsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSkKKyAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX01JTUU7CisgIGVsc2UKKyAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0VOQ19NVE9NOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01JTUUpCisgICAgc29hcF9zZWxlY3RfbWltZV9ib3VuZGFyeShzb2FwKTsKKyAgc29hcC0+ZGltZS5saXN0ID0gc29hcC0+ZGltZS5sYXN0OwkvKiBrZWVwIHRyYWNrIG9mIGxhc3QgRElNRSBhdHRhY2htZW50ICovCisjZW5kaWYKKyAgc29hcC0+Y291bnQgPSAwOworICBzb2FwLT5ucyA9IDA7CisgIHNvYXAtPm51bGwgPSAwOworICBzb2FwLT5wb3NpdGlvbiA9IDA7CisgIHNvYXAtPm11c3RVbmRlcnN0YW5kID0gMDsKKyAgc29hcC0+ZW5jb2RpbmcgPSAwOworICBzb2FwLT5wYXJ0ID0gU09BUF9CRUdJTjsKKyAgc29hcC0+aWRudW0gPSAwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkJlZ2luIGNvdW50IHBoYXNlIChzb2NrZXQ9JWQgbW9kZT0weCV4IGNvdW50PSVsdSlcbiIsIHNvYXAtPnNvY2tldCwgc29hcC0+bW9kZSwgKHVuc2lnbmVkIGxvbmcpc29hcC0+Y291bnQpKTsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcC0+ZGltZS5jb3VudCA9IDA7IC8qIGNvdW50ICMgb2YgYXR0YWNobWVudHMgKi8KKyAgc29hcC0+ZGltZS5zaXplID0gMDsgLyogYWNjdW11bGF0ZSB0b3RhbCBzaXplIG9mIGF0dGFjaG1lbnRzICovCisgIGlmIChzb2FwLT5mcHJlcGFyZWluaXQgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSAhPSBTT0FQX0lPX1NUT1JFKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IHNvYXAtPmZwcmVwYXJlaW5pdChzb2FwKTsgICAKKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbmRfY291bnQoc3RydWN0IHNvYXAgKnNvYXApCit7IAorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+ZnByZXBhcmVmaW5hbCkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBzb2FwLT5mcHJlcGFyZWZpbmFsKHNvYXApOworI2VuZGlmCisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIG9mIGNvdW50IHBoYXNlXG4iKSk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JlZ2luX3NlbmQoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgc29hcF9jbHJfYXR0cihzb2FwKTsKKyAgc29hcF9zZXRfbG9jYWxfbmFtZXNwYWNlcyhzb2FwKTsKKyAgc29hcC0+bW9kZSA9IHNvYXAtPm9tb2RlIHwgKHNvYXAtPm1vZGUgJiAoU09BUF9JT19MRU5HVEggfCBTT0FQX0VOQ19ESU1FKSk7CisjaWZkZWYgV0lUSF9aTElCCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIpICYmIChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19GTFVTSCkKKyAgeyBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1hNTCkKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19CVUZGRVI7CisgICAgZWxzZQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX1NUT1JFOworICB9CisjZW5kaWYKKyNpZmRlZiBXSVRIX1VEUAorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPX1VEUCkpCisgIHsgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19YTUw7CisgICAgaWYgKHNvYXAtPmNvdW50ID4gU09BUF9CVUZMRU4pCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1VEUF9FUlJPUjsKKyAgfQorI2VuZGlmCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fRkxVU0ggJiYgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgeyBpZiAoc29hcC0+Y291bnQgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX0JVRkZFUjsKKyAgICBlbHNlCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fU1RPUkU7CisgIH0KKyAgc29hcC0+bW9kZSAmPSB+U09BUF9JT19MRU5HVEg7CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fU1RPUkUpCisgICAgc29hcF9uZXdfYmxvY2soc29hcCk7CisgIGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0tFRVBBTElWRSkpCisgICAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7CisgIGlmICghc29hcC0+ZW5jb2RpbmdTdHlsZSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9HUkFQSCkpCisgICAgc29hcC0+bW9kZSB8PSBTT0FQX1hNTF9UUkVFOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpKQorICB7IHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfTUlNRTsKKyAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0VOQ19ESU1FOworICB9CisgIGVsc2UKKyAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0VOQ19NVE9NOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01JTUUpCisgICAgc29hcF9zZWxlY3RfbWltZV9ib3VuZGFyeShzb2FwKTsKKyNpZmRlZiBXSU4zMgorI2lmbmRlZiBVTkRFUl9DRQorI2lmbmRlZiBXSVRIX0ZBU1RDR0kKKyAgaWYgKCFzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKSAvKiBTZXQgd2luMzIgc3Rkb3V0IG9yIHNvYXAtPnNlbmRmZCB0byBCSU5BUlksIGUuZy4gdG8gc3VwcG9ydCBESU1FICovCisjaWZkZWYgX19CT1JMQU5EQ19fCisgICAgc2V0bW9kZSgoU09BUF9TT0NLRVQpc29hcC0+c2VuZGZkLCBPX0JJTkFSWSk7CisjZWxzZQorICAgIF9zZXRtb2RlKChTT0FQX1NPQ0tFVClzb2FwLT5zZW5kZmQsIF9PX0JJTkFSWSk7CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pCisgIHsgc29hcC0+YnVmaWR4ID0gMDsKKyAgICBzb2FwLT5idWZsZW4gPSAwOworICB9CisgIHNvYXAtPmNodW5rc2l6ZSA9IDA7CisgIHNvYXAtPm5zID0gMDsKKyAgc29hcC0+bnVsbCA9IDA7CisgIHNvYXAtPnBvc2l0aW9uID0gMDsKKyAgc29hcC0+bXVzdFVuZGVyc3RhbmQgPSAwOworICBzb2FwLT5lbmNvZGluZyA9IDA7CisgIHNvYXAtPmlkbnVtID0gMDsKKyAgc29hcC0+bGV2ZWwgPSAwOworI2lmZGVmIFdJVEhfWkxJQgorICBzb2FwLT56X3JhdGlvX291dCA9IDEuMDsKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQikgJiYgc29hcC0+emxpYl9zdGF0ZSAhPSBTT0FQX1pMSUJfREVGTEFURSkKKyAgeworI2lmZGVmIFdJVEhfR1pJUAorICAgIG1lbWNweShzb2FwLT56X2J1ZiwgIlwzN1wyMTNcMTBcMFwwXDBcMFwwXDBcMzc3IiwgMTApOworICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gKEJ5dGUqKXNvYXAtPnpfYnVmICsgMTA7CisgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0ID0gU09BUF9CVUZMRU4gLSAxMDsKKyAgICBzb2FwLT56X2NyYyA9IGNyYzMyKDBMLCBOVUxMLCAwKTsKKyAgICBpZiAoZGVmbGF0ZUluaXQyKCZzb2FwLT5kX3N0cmVhbSwgc29hcC0+el9sZXZlbCwgWl9ERUZMQVRFRCwgLU1BWF9XQklUUywgOCwgWl9ERUZBVUxUX1NUUkFURUdZKSAhPSBaX09LKQorI2Vsc2UKKyAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IChCeXRlKilzb2FwLT56X2J1ZjsKKyAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgPSBTT0FQX0JVRkxFTjsKKyAgICBpZiAoZGVmbGF0ZUluaXQoJnNvYXAtPmRfc3RyZWFtLCBzb2FwLT56X2xldmVsKSAhPSBaX09LKQorI2VuZGlmCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJEZWZsYXRlIGluaXRpYWxpemVkXG4iKSk7CisgICAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9ERUZMQVRFOworICB9CisjZW5kaWYKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJCZWdpbiBzZW5kIHBoYXNlIChzb2NrZXQ9JWQgbW9kZT0weCV4IGNvdW50PSVsdSlcbiIsIHNvYXAtPnNvY2tldCwgc29hcC0+bW9kZSwgKHVuc2lnbmVkIGxvbmcpc29hcC0+Y291bnQpKTsKKyAgc29hcC0+cGFydCA9IFNPQVBfQkVHSU47CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5mcHJlcGFyZWluaXQgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX1NUT1JFKQorICAgIHNvYXAtPmZwcmVwYXJlaW5pdChzb2FwKTsgICAKKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2VtYmVkZGVkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBpbnQgdCkKK3sgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICBpZiAoc29hcF9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCB0LCAmcHApKQorICB7IHBwLT5tYXJrMSA9IDE7CisgICAgcHAtPm1hcmsyID0gMTsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVtYmVkZGVkICVwIHR5cGU9JWQgbWFyayBzZXQgdG8gMVxuIiwgcCwgdCkpOworICB9Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVmZXJlbmNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBpbnQgdCkKK3sgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICBpZiAoIXAgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9UUkVFKSkKKyAgICByZXR1cm4gMTsKKyAgaWYgKHNvYXBfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgdCwgJnBwKSkKKyAgeyBpZiAocHAtPm1hcmsxID09IDApCisgICAgeyBwcC0+bWFyazEgPSAyOworICAgICAgcHAtPm1hcmsyID0gMjsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoc29hcF9wb2ludGVyX2VudGVyKHNvYXAsIHAsIE5VTEwsIDAsIHQsICZwcCkpCisgIHsgcHAtPm1hcmsxID0gMDsKKyAgICBwcC0+bWFyazIgPSAwOworICB9CisgIGVsc2UKKyAgICByZXR1cm4gMTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWZlcmVuY2UgJXAgdHlwZT0lZCAoJWQgJWQpXG4iLCBwLCB0LCAoaW50KXBwLT5tYXJrMSwgKGludClwcC0+bWFyazIpKTsKKyAgcmV0dXJuIHBwLT5tYXJrMTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9hcnJheV9yZWZlcmVuY2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgbiwgaW50IHQpCit7IHJlZ2lzdGVyIGludCBpOworICBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgIGlmICghcCB8fCAhYS0+X19wdHIpCisgICAgcmV0dXJuIDE7CisgIGkgPSBzb2FwX2FycmF5X3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIGEsIG4sIHQsICZwcCk7CisgIGlmIChpKQorICB7IGlmIChwcC0+bWFyazEgPT0gMCkKKyAgICB7IHBwLT5tYXJrMSA9IDI7CisgICAgICBwcC0+bWFyazIgPSAyOworICAgIH0KKyAgfQorICBlbHNlIGlmICghc29hcF9wb2ludGVyX2VudGVyKHNvYXAsIHAsIGEsIG4sIHQsICZwcCkpCisgICAgcmV0dXJuIDE7CisgIGVsc2UKKyAgeyBwcC0+bWFyazEgPSAwOworICAgIHBwLT5tYXJrMiA9IDA7CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJBcnJheSByZWZlcmVuY2UgJXAgcHRyPSVwIGRpbT0lZCB0eXBlPSVkICglZCAlZClcbiIsIHAsIGEtPl9fcHRyLCBuLCB0LCAoaW50KXBwLT5tYXJrMSwgKGludClwcC0+bWFyazIpKTsKKyAgcmV0dXJuIHBwLT5tYXJrMTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbWJlZGRlZF9pZChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGlkLCBjb25zdCB2b2lkICpwLCBpbnQgdCkKK3sgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1RSRUUpCisgICAgcmV0dXJuIGlkOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVtYmVkZGVkX2lkICVwIHR5cGU9JWQgaWQ9JWRcbiIsIHAsIHQsIGlkKSk7CisgIGlmIChzb2FwLT52ZXJzaW9uID09IDEgJiYgc29hcC0+ZW5jb2RpbmdTdHlsZSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9HUkFQSCkgJiYgc29hcC0+cGFydCAhPSBTT0FQX0lOX0hFQURFUikKKyAgeyBpZiAoaWQgPCAwKQorICAgIHsgaWQgPSBzb2FwX3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIHQsICZwcCk7CisgICAgICBpZiAoaWQpCisgICAgICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgICAgICAgcHAtPm1hcmsxID0gMjsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHBwLT5tYXJrMiA9IDI7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW1iZWRkZWRfaWQgbXVsdGlyZWYgaWQ9JWQgJXAgdHlwZT0lZCA9ICglZCAlZClcbiIsIGlkLCBwLCB0LCAoaW50KXBwLT5tYXJrMSwgKGludClwcC0+bWFyazIpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIGlkOworICB9CisgIGlmIChpZCA8IDApCisgICAgaWQgPSBzb2FwX3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIHQsICZwcCk7CisgIGVsc2UgaWYgKGlkICYmICFzb2FwX3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIHQsICZwcCkpCisgICAgcmV0dXJuIDA7CisgIGlmIChpZCAmJiBwcCkKKyAgeyBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICAgICAgcHAtPm1hcmsxID0gMTsKKyAgICBlbHNlCisgICAgICBwcC0+bWFyazIgPSAxOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW1iZWRkZWRfaWQgZW1iZWRkZWQgcmVmIGlkPSVkICVwIHR5cGU9JWQgPSAoJWQgJWQpXG4iLCBpZCwgcCwgdCwgKGludClwcC0+bWFyazEsIChpbnQpcHAtPm1hcmsyKSk7CisgIH0KKyAgcmV0dXJuIGlkOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2lzX2VtYmVkZGVkKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHApCit7IGlmICghcHApCisgICAgcmV0dXJuIDA7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSXMgZW1iZWRkZWQ/ICVkICVkXG4iLCAoaW50KXBwLT5tYXJrMSwgKGludClwcC0+bWFyazIpKTsKKyAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMSAmJiBzb2FwLT5lbmNvZGluZ1N0eWxlICYmICEoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0dSQVBIKSAmJiBzb2FwLT5wYXJ0ICE9IFNPQVBfSU5fSEVBREVSKQorICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgICByZXR1cm4gcHAtPm1hcmsxICE9IDA7CisgICAgcmV0dXJuIHBwLT5tYXJrMiAhPSAwOworICB9CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgcmV0dXJuIHBwLT5tYXJrMSA9PSAxOworICByZXR1cm4gcHAtPm1hcmsyID09IDE7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfaXNfc2luZ2xlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHApCit7IGlmIChzb2FwLT5wYXJ0ID09IFNPQVBfSU5fSEVBREVSKQorICAgIHJldHVybiAxOworICBpZiAoIXBwKQorICAgIHJldHVybiAwOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICAgIHJldHVybiBwcC0+bWFyazEgPT0gMDsKKyAgcmV0dXJuIHBwLT5tYXJrMiA9PSAwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfZW1iZWRkZWQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3BsaXN0ICpwcCkKK3sgaWYgKCFwcCkKKyAgICByZXR1cm47CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgcHAtPm1hcmsxID0gMTsKKyAgZWxzZQorICAgIHBwLT5tYXJrMiA9IDE7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYXR0YWNobWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBjb25zdCBjaGFyICphaWQsIGNvbnN0IGNoYXIgKmF0eXBlLCBjb25zdCBjaGFyICphb3B0aW9ucywgaW50IG4sIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KSAKK3sgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICBpbnQgaTsKKyAgaWYgKCFwIHx8ICFhLT5fX3B0ciB8fCAoIWFpZCAmJiAhYXR5cGUpKQorICAgIHJldHVybiBzb2FwX2VsZW1lbnRfaWQoc29hcCwgdGFnLCBpZCwgcCwgYSwgbiwgdHlwZSwgdCk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQXR0YWNobWVudCB0YWc9JyVzJyBpZD0nJXMnICglZCkgdHlwZT0nJXMnXG4iLCB0YWcsIGFpZD9haWQ6IiIsIGlkLCBhdHlwZT9hdHlwZToiIikpOworICBpID0gc29hcF9hcnJheV9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCBhLCBuLCB0LCAmcHApOworICBpZiAoIWkpCisgIHsgaSA9IHNvYXBfcG9pbnRlcl9lbnRlcihzb2FwLCBwLCBhLCBuLCB0LCAmcHApOworICAgIGlmICghaSkKKyAgICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CisgIGlmIChpZCA8PSAwKQorICAgIGlkID0gaTsKKyAgaWYgKCFhaWQpCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsIHNvYXAtPmRpbWVfaWRfZm9ybWF0LCBpZCk7CisgICAgYWlkID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+dG1wYnVmKTsKKyAgfQorICAvKiBBZGQgTVRPTSB4b3A6SW5jbHVkZSBlbGVtZW50IHdoZW4gbmVjZXNzYXJ5ICovCisgIC8qIFRPRE86IHRoaXMgY29kZSB0byBiZSBvYnNvbGV0ZWQgd2l0aCBuZXcgaW1wb3J0L3hvcC5oIGNvbnZlbnRpb25zICovCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pICYmIHN0cmNtcCh0YWcsICJ4b3A6SW5jbHVkZSIpKQorICB7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgMCwgdHlwZSkKKyAgICAgfHwgc29hcF9lbGVtZW50X2hyZWYoc29hcCwgInhvcDpJbmNsdWRlIiwgMCwgImhyZWYiLCBhaWQpCisgICAgIHx8IHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZykpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgZWxzZSBpZiAoc29hcF9lbGVtZW50X2hyZWYoc29hcCwgdGFnLCAwLCAiaHJlZiIsIGFpZCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICB7IGlmIChwcC0+bWFyazEgIT0gMykKKyAgICB7IHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkKKyAgICAgICAgY29udGVudCA9IHNvYXBfbmV3X211bHRpcGFydChzb2FwLCAmc29hcC0+bWltZS5maXJzdCwgJnNvYXAtPm1pbWUubGFzdCwgKGNoYXIqKWEtPl9fcHRyLCBhLT5fX3NpemUpOworICAgICAgZWxzZQorICAgICAgICBjb250ZW50ID0gc29hcF9uZXdfbXVsdGlwYXJ0KHNvYXAsICZzb2FwLT5kaW1lLmZpcnN0LCAmc29hcC0+ZGltZS5sYXN0LCAoY2hhciopYS0+X19wdHIsIGEtPl9fc2l6ZSk7CisgICAgICBpZiAoIWNvbnRlbnQpCisgICAgICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGlmICghc3RybmNtcChhaWQsICJjaWQ6IiwgNCkpIC8qIFJGQyAyMTExICovCisgICAgICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkKKyAgICAgICAgeyBjaGFyICpzID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihhaWQpIC0gMSk7CisJICBpZiAocykKKwkgIHsgKnMgPSAnPCc7CisJICAgIHN0cmNweShzICsgMSwgYWlkICsgNCk7CisJICAgIHN0cmNhdChzLCAiPiIpOworCSAgICBjb250ZW50LT5pZCA9IHM7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBjb250ZW50LT5pZCA9IGFpZCArIDQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIGNvbnRlbnQtPmlkID0gYWlkOworICAgICAgY29udGVudC0+dHlwZSA9IGF0eXBlOworICAgICAgY29udGVudC0+b3B0aW9ucyA9IGFvcHRpb25zOworICAgICAgY29udGVudC0+ZW5jb2RpbmcgPSBTT0FQX01JTUVfQklOQVJZOworICAgICAgcHAtPm1hcmsxID0gMzsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIHBwLT5tYXJrMiA9IDM7CisgIHJldHVybiAtMTsKK30KKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQKK3NvYXBfaW5pdF9paHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBpOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluaXRpYWxpemluZyBJRCBoYXNodGFibGVcbiIpKTsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfSURIQVNIOyBpKyspCisgICAgc29hcC0+aWh0W2ldID0gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyB2b2lkCitzb2FwX2ZyZWVfaWh0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfaWxpc3QgKmlwLCAqcDsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZmxpc3QgKmZwLCAqZnE7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZSBJRCBoYXNodGFibGVcbiIpKTsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfSURIQVNIOyBpKyspCisgIHsgZm9yIChpcCA9IHNvYXAtPmlodFtpXTsgaXA7IGlwID0gcCkKKyAgICB7IGZvciAoZnAgPSBpcC0+Zmxpc3Q7IGZwOyBmcCA9IGZxKQorICAgICAgeyBmcSA9IGZwLT5uZXh0OworICAgICAgICBTT0FQX0ZSRUUoc29hcCwgZnApOworICAgICAgfQorICAgICAgcCA9IGlwLT5uZXh0OworICAgICAgU09BUF9GUkVFKHNvYXAsIGlwKTsKKyAgICB9CisgICAgc29hcC0+aWh0W2ldID0gTlVMTDsKKyAgfQorfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorc3RydWN0IHNvYXBfaWxpc3QgKgorU09BUF9GTUFDMgorc29hcF9sb29rdXAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIGZvciAoaXAgPSBzb2FwLT5paHRbc29hcF9oYXNoKGlkKV07IGlwOyBpcCA9IGlwLT5uZXh0KQorICAgIGlmICghc3RyY21wKGlwLT5pZCwgaWQpKQorICAgICAgcmV0dXJuIGlwOworICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwX2lsaXN0ICoKK1NPQVBfRk1BQzIKK3NvYXBfZW50ZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkKQoreyByZWdpc3RlciBzaXplX3QgaDsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworICBpcCA9IChzdHJ1Y3Qgc29hcF9pbGlzdCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2lsaXN0KSArIHN0cmxlbihpZCkpOworICBpZiAoaXApCisgIHsgaCA9IHNvYXBfaGFzaChpZCk7CisgICAgc3RyY3B5KGlwLT5pZCwgaWQpOworICAgIGlwLT5uZXh0ID0gc29hcC0+aWh0W2hdOworICAgIHNvYXAtPmlodFtoXSA9IGlwOworICAgIHJldHVybiBpcDsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZCoKK1NPQVBfRk1BQzIKK3NvYXBfbWFsbG9jKHN0cnVjdCBzb2FwICpzb2FwLCBzaXplX3QgbikKK3sgcmVnaXN0ZXIgY2hhciAqcDsKKyAgaWYgKCFuKQorICAgIHJldHVybiAodm9pZCopU09BUF9OT05fTlVMTDsKKyAgaWYgKCFzb2FwKQorICAgIHJldHVybiBTT0FQX01BTExPQyhzb2FwLCBuKTsKKyAgbiArPSAoLShsb25nKW4pICYgKHNpemVvZih2b2lkKiktMSk7IC8qIGFsaWduIGF0IDQtLCA4LSBvciAxNi1ieXRlIGJvdW5kYXJ5ICovCisgIGlmICghKHAgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgbiArIHNpemVvZih2b2lkKikgKyBzaXplb2Yoc2l6ZV90KSkpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgLyoga2VlcCBjaGFpbiBvZiBhbGxvY2VkIGNlbGxzIGZvciBsYXRlciBkZXN0cnVjdGlvbiAqLworICBzb2FwLT5hbGxvY2VkID0gMTsKKyAgKih2b2lkKiopKHAgKyBuKSA9IHNvYXAtPmFsaXN0OworICAqKHNpemVfdCopKHAgKyBuICsgc2l6ZW9mKHZvaWQqKSkgPSBuOworICBzb2FwLT5hbGlzdCA9IHAgKyBuOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK3N0YXRpYyB2b2lkCitzb2FwX2luaXRfbWh0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IChpbnQpU09BUF9QVFJIQVNIOyBpKyspCisgICAgc29hcC0+bWh0W2ldID0gTlVMTDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK3N0YXRpYyB2b2lkCitzb2FwX2ZyZWVfbWh0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbWxpc3QgKm1wLCAqbXE7CisgIGZvciAoaSA9IDA7IGkgPCAoaW50KVNPQVBfUFRSSEFTSDsgaSsrKQorICB7IGZvciAobXAgPSBzb2FwLT5taHRbaV07IG1wOyBtcCA9IG1xKQorICAgIHsgbXEgPSBtcC0+bmV4dDsKKyAgICAgIGlmIChtcC0+bGl2ZSkKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyglZCk6IG1hbGxvYygpID0gJXAgbm90IGZyZWVkIChtZW1vcnkgbGVhayBvciBmb3Jnb3QgdG8gY2FsbCBzb2FwX2VuZCgpPylcbiIsIG1wLT5maWxlLCBtcC0+bGluZSwgbXAtPnB0cik7CisgICAgICBmcmVlKG1wKTsKKyAgICB9CisgICAgc29hcC0+bWh0W2ldID0gTlVMTDsKKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworU09BUF9GTUFDMQordm9pZCoKK1NPQVBfRk1BQzIKK3NvYXBfdHJhY2tfbWFsbG9jKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgc2l6ZV90IHNpemUpCit7IHJlZ2lzdGVyIHZvaWQgKnAgPSBtYWxsb2Moc2l6ZSk7CisgIGlmIChzb2FwKQorICB7IHJlZ2lzdGVyIGludCBoID0gc29hcF9oYXNoX3B0cihwKTsKKyAgICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9tbGlzdCAqbXAgPSAoc3RydWN0IHNvYXBfbWxpc3QqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHNvYXBfbWxpc3QpKTsKKyAgICBpZiAoc29hcC0+ZmRlYnVnW1NPQVBfSU5ERVhfVEVTVF0pCisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIiVzKCVkKTogbWFsbG9jKCVsdSkgPSAlcFxuIiwgZmlsZSwgbGluZSwgKHVuc2lnbmVkIGxvbmcpc2l6ZSwgcCkpOworICAgIG1wLT5uZXh0ID0gc29hcC0+bWh0W2hdOworICAgIG1wLT5wdHIgPSBwOworICAgIG1wLT5maWxlID0gZmlsZTsKKyAgICBtcC0+bGluZSA9IGxpbmU7CisgICAgbXAtPmxpdmUgPSAxOworICAgIHNvYXAtPm1odFtoXSA9IG1wOworICB9CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF90cmFja19mcmVlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgdm9pZCAqcCkKK3sgcmVnaXN0ZXIgaW50IGggPSBzb2FwX2hhc2hfcHRyKHApOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9tbGlzdCAqbXA7CisgIGZvciAobXAgPSBzb2FwLT5taHRbaF07IG1wOyBtcCA9IG1wLT5uZXh0KQorICAgIGlmIChtcC0+cHRyID09IHApCisgICAgICBicmVhazsKKyAgaWYgKG1wKQorICB7IGlmIChtcC0+bGl2ZSkKKyAgICB7IGZyZWUocCk7CisgICAgICBpZiAoc29hcC0+ZmRlYnVnW1NPQVBfSU5ERVhfVEVTVF0pCisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiJXMoJWQpOiBmcmVlKCVwKVxuIiwgZmlsZSwgbGluZSwgcCkpOworICAgICAgbXAtPmxpdmUgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzKCVkKTogZnJlZSglcCkgZG91YmxlIGZyZWUgb2YgcG9pbnRlciBtYWxsb2NlZCBhdCAlcyglZClcbiIsIGZpbGUsIGxpbmUsIHAsIG1wLT5maWxlLCBtcC0+bGluZSk7CisgIH0KKyAgZWxzZQorICAgIGZwcmludGYoc3RkZXJyLCAiJXMoJWQpOiBmcmVlKCVwKSBwb2ludGVyIG5vdCBtYWxsb2NlZFxuIiwgZmlsZSwgbGluZSwgcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitzdGF0aWMgdm9pZAorc29hcF90cmFja191bmxpbmsoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnApCit7IHJlZ2lzdGVyIGludCBoID0gc29hcF9oYXNoX3B0cihwKTsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbWxpc3QgKm1wOworICBmb3IgKG1wID0gc29hcC0+bWh0W2hdOyBtcDsgbXAgPSBtcC0+bmV4dCkKKyAgICBpZiAobXAtPnB0ciA9PSBwKQorICAgICAgYnJlYWs7CisgIGlmIChtcCkKKyAgICBtcC0+bGl2ZSA9IDA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2RlYWxsb2Moc3RydWN0IHNvYXAgKnNvYXAsIHZvaWQgKnApCit7IGlmICghc29hcCkKKyAgICByZXR1cm47CisgIGlmIChwKQorICB7IHJlZ2lzdGVyIGNoYXIgKipxOworICAgIGZvciAocSA9IChjaGFyKiopJnNvYXAtPmFsaXN0OyAqcTsgcSA9ICooY2hhcioqKilxKQorICAgIHsgaWYgKHAgPT0gKHZvaWQqKSgqcSAtICooc2l6ZV90KikoKnEgKyBzaXplb2Yodm9pZCopKSkpCisgICAgICB7ICpxID0gKiooY2hhcioqKilxOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWVkIGRhdGEgYXQgJXBcbiIsIHApKTsKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHApOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICAgIHNvYXBfZGVsZXRlKHNvYXAsIHApOworICB9CisgIGVsc2UKKyAgeyByZWdpc3RlciBjaGFyICpxOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZSBhbGwgc29hcF9tYWxsb2MoKSBkYXRhXG4iKSk7CisgICAgd2hpbGUgKHNvYXAtPmFsaXN0KQorICAgIHsgcSA9IChjaGFyKilzb2FwLT5hbGlzdDsKKyAgICAgIHNvYXAtPmFsaXN0ID0gKih2b2lkKiopcTsKKyAgICAgIHEgLT0gKihzaXplX3QqKShxICsgc2l6ZW9mKHZvaWQqKSk7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgcSk7CisgICAgfQorICB9CisgIC8qIHdlIG11c3QgYXNzdW1lIHRoZXNlIHdlcmUgZGVhbGxvY2F0ZWQ6ICovCisgIHNvYXAtPmFjdGlvbiA9IE5VTEw7CisgIHNvYXAtPmZhdWx0ID0gTlVMTDsKKyAgc29hcC0+aGVhZGVyID0gTlVMTDsKKyAgc29hcC0+dXNlcmlkID0gTlVMTDsKKyAgc29hcC0+cGFzc3dkID0gTlVMTDsKKyAgc29hcC0+YXV0aHJlYWxtID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcF9jbHJfbWltZShzb2FwKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9kZWxldGUoc3RydWN0IHNvYXAgKnNvYXAsIHZvaWQgKnApCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2NsaXN0ICoqY3A7CisgIGlmIChzb2FwX2NoZWNrX3N0YXRlKHNvYXApKQorICAgIHJldHVybjsKKyAgY3AgPSAmc29hcC0+Y2xpc3Q7CisgIGlmIChwKQorICB7IHdoaWxlICgqY3ApCisgICAgeyBpZiAocCA9PSAoKmNwKS0+cHRyKQorICAgICAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9jbGlzdCAqcSA9ICpjcDsKKyAgICAgICAgKmNwID0gcS0+bmV4dDsKKyAgICAgICAgcS0+ZmRlbGV0ZShxKTsKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHEpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBjcCA9ICYoKmNwKS0+bmV4dDsKKyAgICB9CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgZGVhbGxvYyBkYXRhICVwOiBhZGRyZXNzIG5vdCBpbiBsaXN0XG4iLCBwKSk7CisgIH0KKyAgZWxzZQorICB7IHdoaWxlICgqY3ApCisgICAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9jbGlzdCAqcSA9ICpjcDsKKyAgICAgICpjcCA9IHEtPm5leHQ7CisgICAgICBpZiAocS0+cHRyID09ICh2b2lkKilzb2FwLT5mYXVsdCkKKyAgICAgICAgc29hcC0+ZmF1bHQgPSBOVUxMOyAvKiB0aGlzIHdhcyBkZWFsbG9jYXRlZCAqLworICAgICAgZWxzZSBpZiAocS0+cHRyID09ICh2b2lkKilzb2FwLT5oZWFkZXIpCisgICAgICAgIHNvYXAtPmhlYWRlciA9IE5VTEw7IC8qIHRoaXMgd2FzIGRlYWxsb2NhdGVkICovCisgICAgICBxLT5mZGVsZXRlKHEpOworICAgICAgU09BUF9GUkVFKHNvYXAsIHEpOworICAgIH0KKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorc3RydWN0IHNvYXBfY2xpc3QgKgorU09BUF9GTUFDMgorc29hcF9saW5rKHN0cnVjdCBzb2FwICpzb2FwLCB2b2lkICpwLCBpbnQgdCwgaW50IG4sIHZvaWQgKCpmZGVsZXRlKShzdHJ1Y3Qgc29hcF9jbGlzdCopKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9jbGlzdCAqY3A7CisgIGlmICgoY3AgPSAoc3RydWN0IHNvYXBfY2xpc3QqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9jbGlzdCkpKSkKKyAgeyBjcC0+bmV4dCA9IHNvYXAtPmNsaXN0OworICAgIGNwLT50eXBlID0gdDsKKyAgICBjcC0+c2l6ZSA9IG47IAorICAgIGNwLT5wdHIgPSBwOworICAgIGNwLT5mZGVsZXRlID0gZmRlbGV0ZTsKKyAgICBzb2FwLT5jbGlzdCA9IGNwOworICB9CisgIHJldHVybiBjcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfdW5saW5rKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwKQoreyByZWdpc3RlciBjaGFyICoqcTsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfY2xpc3QgKipjcDsKKyAgaWYgKCFzb2FwIHx8ICFwKQorICAgIHJldHVybjsKKyAgZm9yIChxID0gKGNoYXIqKikmc29hcC0+YWxpc3Q7ICpxOyBxID0gKihjaGFyKioqKXEpCisgIHsgaWYgKHAgPT0gKHZvaWQqKSgqcSAtICooc2l6ZV90KikoKnEgKyBzaXplb2Yodm9pZCopKSkpCisgICAgeyAqcSA9ICoqKGNoYXIqKiopcTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVW5saW5rZWQgZGF0YSAlcFxuIiwgcCkpOworI2lmZGVmIFNPQVBfREVCVUcKKyAgICAgIHNvYXBfdHJhY2tfdW5saW5rKHNvYXAsIHApOworI2VuZGlmCisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIGZvciAoY3AgPSAmc29hcC0+Y2xpc3Q7ICpjcDsgY3AgPSAmKCpjcCktPm5leHQpCisgIHsgaWYgKHAgPT0gKCpjcCktPnB0cikKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVW5saW5rZWQgY2xhc3MgaW5zdGFuY2UgJXBcbiIsIHApKTsKKyAgICAgIHEgPSAoY2hhcioqKSpjcDsKKyAgICAgICpjcCA9ICgqY3ApLT5uZXh0OworICAgICAgU09BUF9GUkVFKHNvYXAsIHEpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9sb29rdXBfdHlwZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgaWYgKGlkICYmICppZCkKKyAgeyBpcCA9IHNvYXBfbG9va3VwKHNvYXAsIGlkKTsKKyAgICBpZiAoaXApCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkxvb2t1cCBpZD0nJXMnIHR5cGU9JWRcbiIsIGlkLCBpcC0+dHlwZSkpOworICAgICAgcmV0dXJuIGlwLT50eXBlOworICAgIH0KKyAgfQorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImxvb2t1cCB0eXBlIGlkPSclcycgTk9UIEZPVU5EISBOZWVkIHRvIGdldCBpdCBmcm9tIHhzaTp0eXBlXG4iLCBpZCkpOworICByZXR1cm4gMDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQqCitTT0FQX0ZNQUMyCitzb2FwX2lkX2xvb2t1cChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIHZvaWQgKipwLCBpbnQgdCwgc2l6ZV90IG4sIHVuc2lnbmVkIGludCBrKQoreyBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIHZvaWQgKipxOworICBpZiAoIXAgfHwgIWlkIHx8ICEqaWQpCisgICAgcmV0dXJuIHA7CisgIGlwID0gc29hcF9sb29rdXAoc29hcCwgaWQpOyAvKiBsb29rdXAgcG9pbnRlciB0byBoYXNoIHRhYmxlIGVudHJ5IGZvciBzdHJpbmcgaWQgKi8KKyAgaWYgKCFpcCkKKyAgeyBpcCA9IHNvYXBfZW50ZXIoc29hcCwgaWQpOyAvKiBuZXcgaGFzaCB0YWJsZSBlbnRyeSBmb3Igc3RyaW5nIGlkICovCisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGb3J3YXJkaW5nIGZpcnN0IGhyZWY9JyVzJyB0eXBlPSVkICVwICgldSBieXRlcylcbiIsIGlkLCB0LCBwLCAodW5zaWduZWQgaW50KW4pKTsKKyAgICBpcC0+dHlwZSA9IHQ7CisgICAgaXAtPnNpemUgPSBuOyAKKyAgICBpcC0+bGluayA9IHA7CisgICAgaXAtPmNvcHkgPSBOVUxMOworICAgIGlwLT5mbGlzdCA9IE5VTEw7CisgICAgaXAtPnB0ciA9IE5VTEw7CisgICAgaXAtPmxldmVsID0gazsKKyAgICAqcCA9IE5VTEw7CisgIH0KKyAgZWxzZSBpZiAoaXAtPnB0cikKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc29sdmVkIGhyZWY9JyVzJyB0eXBlPSVkIGxvY2F0aW9uPSVwICgldSBieXRlcylcbiIsIGlkLCB0LCBpcC0+cHRyLCAodW5zaWduZWQgaW50KW4pKTsKKyAgICBpZiAoaXAtPnR5cGUgIT0gdCkKKyAgICB7IHN0cmNweShzb2FwLT5pZCwgaWQpOworICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0hSRUY7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlR5cGUgaW5jb21wYXRpYmlsaXR5OiBpZCB0eXBlPSVkIGhyZWYgdHlwZT0lZFxuIiwgaXAtPnR5cGUsIHQpKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB3aGlsZSAoaXAtPmxldmVsIDwgaykKKyAgICB7IHEgPSAodm9pZCoqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZih2b2lkKikpOyAgCisgICAgICBpZiAoIXEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgKnAgPSAodm9pZCopcTsKKyAgICAgIHAgPSBxOworICAgICAgay0tOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJEZXNjZW5kaW5nIG9uZSBsZXZlbC4uLlxuIikpOworICAgIH0KKyAgICAqcCA9IGlwLT5wdHI7CisgIH0KKyAgZWxzZSBpZiAoaXAtPmxldmVsID4gaykKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc29sdmluZyBsZXZlbCAldSBwb2ludGVycyB0byBocmVmPSclcydcbiIsIGlwLT5sZXZlbCwgaWQpKTsKKyAgICB3aGlsZSAoaXAtPmxldmVsID4gaykKKyAgICB7IHZvaWQgKnMsICoqciA9ICZpcC0+bGluazsKKyAgICAgIHEgPSAodm9pZCoqKWlwLT5saW5rOworICAgICAgd2hpbGUgKHEpCisgICAgICB7ICpyID0gKHZvaWQqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZih2b2lkKikpOworICAgICAgICBzID0gKnE7CisgICAgICAgICpxID0gKnI7CisgICAgICAgIHIgPSAodm9pZCoqKSpyOworICAgICAgICBxID0gKHZvaWQqKilzOworICAgICAgfQorICAgICAgKnIgPSBOVUxMOworICAgICAgaXAtPnNpemUgPSBuOyAKKyAgICAgIGlwLT5jb3B5ID0gTlVMTDsKKyAgICAgIGlwLT5sZXZlbCA9IGlwLT5sZXZlbCAtIDE7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlc2NlbmRpbmcgb25lIGxldmVsLi4uXG4iKSk7CisgICAgfQorICAgIHEgPSAodm9pZCoqKWlwLT5saW5rOworICAgIGlwLT5saW5rID0gcDsKKyAgICAqcCA9ICh2b2lkKilxOworICB9CisgIGVsc2UKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZvcndhcmRlZCBocmVmPSclcycgdHlwZT0lZCBsb2NhdGlvbj0lcCAoJXUgYnl0ZXMpXG4iLCBpZCwgdCwgcCwgKHVuc2lnbmVkIGludCluKSk7CisgICAgd2hpbGUgKGlwLT5sZXZlbCA8IGspCisgICAgeyBxID0gKHZvaWQqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yodm9pZCopKTsgIAorICAgICAgKnAgPSBxOworICAgICAgcCA9IHE7CisgICAgICBrLS07CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlc2NlbmRpbmcgb25lIGxldmVsLi4uXG4iKSk7CisgICAgfQorICAgIHEgPSAodm9pZCoqKWlwLT5saW5rOworICAgIGlwLT5saW5rID0gcDsKKyAgICAqcCA9ICh2b2lkKilxOworICB9CisgIHJldHVybiBwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZCoKK1NPQVBfRk1BQzIKK3NvYXBfaWRfZm9yd2FyZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaHJlZiwgdm9pZCAqcCwgc2l6ZV90IGxlbiwgaW50IHN0LCBpbnQgdHQsIHNpemVfdCBuLCB1bnNpZ25lZCBpbnQgaywgdm9pZCAoKmZjb3B5KShzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgc2l6ZV90LCBjb25zdCB2b2lkKiwgc2l6ZV90KSkKK3sgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworICBpZiAoIXAgfHwgIWhyZWYgfHwgISpocmVmKQorICAgIHJldHVybiBwOworICBpcCA9IHNvYXBfbG9va3VwKHNvYXAsIGhyZWYpOyAvKiBsb29rdXAgcG9pbnRlciB0byBoYXNoIHRhYmxlIGVudHJ5IGZvciBzdHJpbmcgaWQgKi8KKyAgaWYgKCFpcCkKKyAgeyBpcCA9IHNvYXBfZW50ZXIoc29hcCwgaHJlZik7IC8qIG5ldyBoYXNoIHRhYmxlIGVudHJ5IGZvciBzdHJpbmcgaWQgKi8KKyAgICBpcC0+dHlwZSA9IHN0OworICAgIGlwLT5zaXplID0gbjsKKyAgICBpcC0+bGluayA9IE5VTEw7CisgICAgaXAtPmNvcHkgPSBOVUxMOworICAgIGlwLT5wdHIgPSBOVUxMOworICAgIGlwLT5sZXZlbCA9IDA7CisgICAgaXAtPmZsaXN0ID0gTlVMTDsKKyAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiTmV3IGVudHJ5IGhyZWY9JyVzJyB0eXBlPSVkIHNpemU9JWx1IGxldmVsPSVkIGxvY2F0aW9uPSVwXG4iLCBocmVmLCBzdCwgKHVuc2lnbmVkIGxvbmcpbiwgaywgcCkpOworICB9CisgIGVsc2UgaWYgKGlwLT50eXBlICE9IHN0IHx8IChpcC0+bGV2ZWwgPT0gayAmJiBpcC0+c2l6ZSAhPSBuKSkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlR5cGUgaW5jb21wYXRpYmlsaXR5IGlkPSclcycgZXhwZWN0IHR5cGU9JWQgc2l6ZT0lbHUgbGV2ZWw9JXUgZ290IHR5cGU9JWQgc2l6ZT0lbHVcbiIsIGhyZWYsIGlwLT50eXBlLCAodW5zaWduZWQgbG9uZylpcC0+c2l6ZSwgaywgc3QsICh1bnNpZ25lZCBsb25nKW4pKTsKKyAgICBzdHJjcHkoc29hcC0+aWQsIGhyZWYpOworICAgIHNvYXAtPmVycm9yID0gU09BUF9IUkVGOworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChmY29weSB8fCBuIDwgc2l6ZW9mKHZvaWQqKSB8fCAqaHJlZiAhPSAnIycpCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZmxpc3QgKmZwID0gKHN0cnVjdCBzb2FwX2ZsaXN0KilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfZmxpc3QpKTsKKyAgICBpZiAoIWZwKQorICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmcC0+bmV4dCA9IGlwLT5mbGlzdDsKKyAgICBmcC0+dHlwZSA9IHR0OworICAgIGZwLT5wdHIgPSBwOworICAgIGZwLT5sZXZlbCA9IGs7CisgICAgZnAtPmxlbiA9IGxlbjsKKyAgICBpZiAoZmNvcHkpCisgICAgICBmcC0+ZmNvcHkgPSBmY29weTsKKyAgICBlbHNlCisgICAgICBmcC0+ZmNvcHkgPSBzb2FwX2Zjb3B5OworICAgIGlwLT5mbGlzdCA9IGZwOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRm9yd2FyZGluZyB0eXBlPSVkICh0YXJnZXQgdHlwZT0lZCkgc2l6ZT0lbHUgbG9jYXRpb249JXAgbGV2ZWw9JXUgbGVuPSVsdSBocmVmPSclcydcbiIsIHN0LCB0dCwgKHVuc2lnbmVkIGxvbmcpbiwgcCwgaywgKHVuc2lnbmVkIGxvbmcpbGVuLCBocmVmKSk7CisgIH0KKyAgZWxzZQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRm9yd2FyZGluZyBjb3B5aW5nIGFkZHJlc3MgJXAgZm9yIHR5cGU9JWQgaHJlZj0nJXMnXG4iLCBwLCBzdCwgaHJlZikpOworICAgICoodm9pZCoqKXAgPSBpcC0+Y29weTsKKyAgICBpcC0+Y29weSA9IHA7CisgIH0KKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQqCitTT0FQX0ZNQUMyCitzb2FwX2lkX2VudGVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgdm9pZCAqcCwgaW50IHQsIHNpemVfdCBuLCB1bnNpZ25lZCBpbnQgaywgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqYXJyYXlUeXBlLCB2b2lkICooKmZpbnN0YW50aWF0ZSkoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90KikpCit7CisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisjZW5kaWYKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVudGVyIGlkPSclcycgdHlwZT0lZCBsb2M9JXAgc2l6ZT0lbHUgbGV2ZWw9JXVcbiIsIGlkLCB0LCBwLCAodW5zaWduZWQgbG9uZyluLCBrKSk7CisgIHNvYXAtPmFsbG9jZWQgPSAwOworICBpZiAoIXApCisgIHsgaWYgKGZpbnN0YW50aWF0ZSkKKyAgICAgIHAgPSBmaW5zdGFudGlhdGUoc29hcCwgdCwgdHlwZSwgYXJyYXlUeXBlLCAmbik7CisgICAgZWxzZQorICAgICAgcCA9IHNvYXBfbWFsbG9jKHNvYXAsIG4pOworICAgIGlmIChwKQorICAgICAgc29hcC0+YWxsb2NlZCA9IDE7CisgIH0KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgIGlmICghaWQgfHwgISppZCkKKyNlbmRpZgorICAgIHJldHVybiBwOworI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgaXAgPSBzb2FwX2xvb2t1cChzb2FwLCBpZCk7IC8qIGxvb2t1cCBwb2ludGVyIHRvIGhhc2ggdGFibGUgZW50cnkgZm9yIHN0cmluZyBpZCAqLworICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiTG9va3VwIGVudHJ5IGlkPSclcyBmb3IgbG9jYXRpb249JXAnXG4iLCBpZCwgcCkpOworICBpZiAoIWlwKQorICB7IGlwID0gc29hcF9lbnRlcihzb2FwLCBpZCk7IC8qIG5ldyBoYXNoIHRhYmxlIGVudHJ5IGZvciBzdHJpbmcgaWQgKi8KKyAgICBpcC0+dHlwZSA9IHQ7CisgICAgaXAtPmxpbmsgPSBOVUxMOworICAgIGlwLT5jb3B5ID0gTlVMTDsKKyAgICBpcC0+Zmxpc3QgPSBOVUxMOworICAgIGlwLT5zaXplID0gbjsKKyAgICBpcC0+cHRyID0gcDsKKyAgICBpcC0+bGV2ZWwgPSBrOworICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJOZXcgZW50cnkgaWQ9JyVzJyB0eXBlPSVkIHNpemU9JWx1IGxldmVsPSV1IGxvY2F0aW9uPSVwXG4iLCBpZCwgdCwgKHVuc2lnbmVkIGxvbmcpbiwgaywgcCkpOworICB9CisgIGVsc2UgaWYgKChpcC0+dHlwZSAhPSB0IHx8IChpcC0+bGV2ZWwgPT0gayAmJiBpcC0+c2l6ZSAhPSBuKSkgJiYgKGlwLT5jb3B5IHx8IGlwLT5mbGlzdCkpCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJUeXBlIGluY29tcGF0aWJpbGl0eSBpZD0nJXMnIGV4cGVjdCB0eXBlPSVkIHNpemU9JWx1IGxldmVsPSV1IGdvdCB0eXBlPSVkIHNpemU9JWx1XG4iLCBpZCwgaXAtPnR5cGUsICh1bnNpZ25lZCBsb25nKWlwLT5zaXplLCBrLCB0LCAodW5zaWduZWQgbG9uZyluKSk7CisgICAgc3RyY3B5KHNvYXAtPmlkLCBpZCk7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0hSRUY7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZWxzZSBpZiAoaXAtPnB0cikKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk11bHRpcGx5IGRlZmluZWQgaWQ9JyVzJ1xuIiwgaWQpKTsKKyAgICBzdHJjcHkoc29hcC0+aWQsIGlkKTsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfRFVQTElDQVRFX0lEOworICAgIHJldHVybiBOVUxMOworICB9CisgIGVsc2UgCisgIHsgaXAtPnNpemUgPSBuOworICAgIGlwLT5wdHIgPSBwOworICAgIGlwLT5sZXZlbCA9IGs7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVcGRhdGUgZW50cnkgaWQ9JyVzJyB0eXBlPSVkIGxvY2F0aW9uPSVwIHNpemU9JWx1IGxldmVsPSV1XG4iLCBpZCwgdCwgcCwgKHVuc2lnbmVkIGxvbmcpbiwgaykpOworICB9CisgIHJldHVybiBpcC0+cHRyOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2Zjb3B5KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3QsIGludCB0dCwgdm9pZCAqcCwgc2l6ZV90IGxlbiwgY29uc3Qgdm9pZCAqcSwgc2l6ZV90IG4pCit7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5aW5nIGRhdGEgdHlwZT0lZCAodGFyZ2V0IHR5cGU9JWQpICVwIC0+ICVwICglbHUgYnl0ZXMpXG4iLCBzdCwgdHQsIHEsIHAsICh1bnNpZ25lZCBsb25nKW4pKTsKKyAgbWVtY3B5KHAsIHEsIG4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VuZF9zZW5kKHN0cnVjdCBzb2FwICpzb2FwKQoreyAKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPmRpbWUubGlzdCkKKyAgeyAvKiBTT0FQIGJvZHkgcmVmZXJlbmNlZCBhdHRhY2htZW50cyBtdXN0IGFwcGVhciBmaXJzdCAqLworICAgIHNvYXAtPmRpbWUubGFzdC0+bmV4dCA9IHNvYXAtPmRpbWUuZmlyc3Q7CisgICAgc29hcC0+ZGltZS5maXJzdCA9IHNvYXAtPmRpbWUubGlzdC0+bmV4dDsKKyAgICBzb2FwLT5kaW1lLmxpc3QtPm5leHQgPSBOVUxMOworICAgIHNvYXAtPmRpbWUubGFzdCA9IHNvYXAtPmRpbWUubGlzdDsKKyAgfQorICBpZiAoc29hcF9wdXRkaW1lKHNvYXApIHx8IHNvYXBfcHV0bWltZShzb2FwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHNvYXAtPm1pbWUubGlzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmxhc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmxpc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5sYXN0ID0gTlVMTDsKKyNlbmRpZgorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBzZW5kXG4iKSk7CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JTykgLyogbmVlZCB0byBmbHVzaCB0aGUgcmVtYWluaW5nIGRhdGEgaW4gYnVmZmVyICovCisgIHsgaWYgKHNvYXBfZmx1c2goc29hcCkpCisjaWZkZWYgV0lUSF9aTElCCisgICAgeyBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIgJiYgc29hcC0+emxpYl9zdGF0ZSA9PSBTT0FQX1pMSUJfREVGTEFURSkKKyAgICAgIHsgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9OT05FOworICAgICAgICBkZWZsYXRlRW5kKCZzb2FwLT5kX3N0cmVhbSk7CisgICAgICB9CisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorI2Vsc2UKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNlbmRpZgorI2lmZGVmIFdJVEhfWkxJQgorICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQikKKyAgICB7IGludCByOworICAgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4gPSAwOworICAgICAgZG8KKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJEZWZsYXRpbmcgcmVtYWluZGVyXG4iKSk7CisgICAgICAgIHIgPSBkZWZsYXRlKCZzb2FwLT5kX3N0cmVhbSwgWl9GSU5JU0gpOworICAgICAgICBpZiAoc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0ICE9IFNPQVBfQlVGTEVOKQorICAgICAgICB7IGlmIChzb2FwX2ZsdXNoX3Jhdyhzb2FwLCBzb2FwLT56X2J1ZiwgU09BUF9CVUZMRU4gLSBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQpKQorICAgICAgICAgIHsgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9OT05FOworICAgICAgICAgICAgZGVmbGF0ZUVuZCgmc29hcC0+ZF9zdHJlYW0pOworICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworCSAgfQorICAgICAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gKEJ5dGUqKXNvYXAtPnpfYnVmOworICAgICAgICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCA9IFNPQVBfQlVGTEVOOworICAgICAgICB9CisgICAgICB9IHdoaWxlIChyID09IFpfT0spOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJEZWZsYXRlZCAlbHUtPiVsdSBieXRlc1xuIiwgc29hcC0+ZF9zdHJlYW0udG90YWxfaW4sIHNvYXAtPmRfc3RyZWFtLnRvdGFsX291dCkpOworICAgICAgc29hcC0+el9yYXRpb19vdXQgPSAoZmxvYXQpc29hcC0+ZF9zdHJlYW0udG90YWxfb3V0IC8gKGZsb2F0KXNvYXAtPmRfc3RyZWFtLnRvdGFsX2luOworICAgICAgc29hcC0+bW9kZSAmPSB+U09BUF9FTkNfWkxJQjsKKyAgICAgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfTk9ORTsKKyAgICAgIGlmIChkZWZsYXRlRW5kKCZzb2FwLT5kX3N0cmVhbSkgIT0gWl9PSyB8fCByICE9IFpfU1RSRUFNX0VORCkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVbmFibGUgdG8gZW5kIGRlZmxhdGU6ICVzXG4iLCBzb2FwLT5kX3N0cmVhbS5tc2c/c29hcC0+ZF9zdHJlYW0ubXNnOiIiKSk7CisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICAgIH0KKyNpZmRlZiBXSVRIX0daSVAKKyAgICAgIHNvYXAtPnpfYnVmWzBdID0gc29hcC0+el9jcmMgJiAweEZGOworICAgICAgc29hcC0+el9idWZbMV0gPSAoc29hcC0+el9jcmMgPj4gOCkgJiAweEZGOworICAgICAgc29hcC0+el9idWZbMl0gPSAoc29hcC0+el9jcmMgPj4gMTYpICYgMHhGRjsKKyAgICAgIHNvYXAtPnpfYnVmWzNdID0gKHNvYXAtPnpfY3JjID4+IDI0KSAmIDB4RkY7CisgICAgICBzb2FwLT56X2J1Zls0XSA9IHNvYXAtPmRfc3RyZWFtLnRvdGFsX2luICYgMHhGRjsKKyAgICAgIHNvYXAtPnpfYnVmWzVdID0gKHNvYXAtPmRfc3RyZWFtLnRvdGFsX2luID4+IDgpICYgMHhGRjsKKyAgICAgIHNvYXAtPnpfYnVmWzZdID0gKHNvYXAtPmRfc3RyZWFtLnRvdGFsX2luID4+IDE2KSAmIDB4RkY7CisgICAgICBzb2FwLT56X2J1Zls3XSA9IChzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiA+PiAyNCkgJiAweEZGOworICAgICAgaWYgKHNvYXBfZmx1c2hfcmF3KHNvYXAsIHNvYXAtPnpfYnVmLCA4KSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJnemlwIGNyYzMyPSVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpc29hcC0+el9jcmMpKTsKKyNlbmRpZgorICAgIH0KKyNlbmRpZgorICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fU1RPUkUpCisgICAgeyBjaGFyICpwOworI2lmbmRlZiBXSVRIX05PSFRUUAorICAgICAgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1hNTCkpCisgICAgICB7IHNvYXAtPm1vZGUtLTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTZW5kaW5nIGJ1ZmZlcmVkIG1lc3NhZ2Ugb2YgbGVuZ3RoICV1XG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmJsaXN0LT5zaXplKSk7CisgICAgICAgIGlmIChzb2FwLT5zdGF0dXMgPj0gU09BUF9QT1NUKQorICAgICAgICAgIHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3Qoc29hcCwgc29hcC0+ZW5kcG9pbnQsIHNvYXAtPmhvc3QsIHNvYXAtPnBvcnQsIHNvYXAtPnBhdGgsIHNvYXAtPmFjdGlvbiwgc29hcC0+Ymxpc3QtPnNpemUpOworICAgICAgICBlbHNlIGlmIChzb2FwLT5zdGF0dXMgIT0gU09BUF9TVE9QKQorICAgICAgICAgIHNvYXAtPmVycm9yID0gc29hcC0+ZnJlc3BvbnNlKHNvYXAsIHNvYXAtPnN0YXR1cywgc29hcC0+Ymxpc3QtPnNpemUpOworICAgICAgICBpZiAoc29hcC0+ZXJyb3IgfHwgc29hcF9mbHVzaChzb2FwKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHNvYXAtPm1vZGUrKzsKKyAgICAgIH0KKyNlbmRpZgorICAgICAgZm9yIChwID0gc29hcF9maXJzdF9ibG9jayhzb2FwKTsgcDsgcCA9IHNvYXBfbmV4dF9ibG9jayhzb2FwKSkKKyAgICAgIHsgREJHTVNHKFNFTlQsIHAsIHNvYXBfYmxvY2tfc2l6ZShzb2FwKSk7CisgICAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mc2VuZChzb2FwLCBwLCBzb2FwX2Jsb2NrX3NpemUoc29hcCkpKSkKKyAgICAgICAgeyBzb2FwX2VuZF9ibG9jayhzb2FwKTsKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHNvYXBfZW5kX2Jsb2NrKHNvYXApOworICAgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgICBlbHNlIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgICAgeyBEQkdNU0coU0VOVCwgIlxyXG4wXHJcblxyXG4iLCA3KTsKKyAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mc2VuZChzb2FwLCAiXHJcbjBcclxuXHJcbiIsIDcpKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyNlbmRpZgorICB9CisjaWZkZWYgV0lUSF9UQ1BGSU4KKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgaWYgKCFzb2FwLT5zc2wgJiYgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSAmJiAhc29hcC0+a2VlcF9hbGl2ZSAmJiAhKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIHNvYXAtPmZzaHV0ZG93bnNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAxKTsgLyogU2VuZCBUQ1AgRklOICovCisjZWxzZQorICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSAmJiAhc29hcC0+a2VlcF9hbGl2ZSAmJiAhKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIHNvYXAtPmZzaHV0ZG93bnNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAxKTsgLyogU2VuZCBUQ1AgRklOICovCisjZW5kaWYKKyNlbmRpZgorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBvZiBzZW5kIHBoYXNlXG4iKSk7CisgIHNvYXAtPm9tb2RlICY9IH5TT0FQX1hNTF9TRUM7CisgIHNvYXAtPmNvdW50ID0gMDsKKyAgc29hcC0+cGFydCA9IFNPQVBfRU5EOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbmRfcmVjdihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+cGFydCA9IFNPQVBfRU5EOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSAmJiBzb2FwX2dldGRpbWUoc29hcCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBzb2FwLT5kaW1lLmxpc3QgPSBzb2FwLT5kaW1lLmZpcnN0OworICBzb2FwLT5kaW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5sYXN0ID0gTlVMTDsKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkgJiYgc29hcF9nZXRtaW1lKHNvYXApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgc29hcC0+bWltZS5saXN0ID0gc29hcC0+bWltZS5maXJzdDsKKyAgc29hcC0+bWltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuYm91bmRhcnkgPSBOVUxMOworI2VuZGlmCisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgb2YgcmVjZWl2ZSBtZXNzYWdlIG9rXG4iKSk7CisjaWZkZWYgV0lUSF9aTElCCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQikKKyAgeyBzb2FwLT5tb2RlICY9IH5TT0FQX0VOQ19aTElCOworICAgIG1lbWNweShzb2FwLT5idWYsIHNvYXAtPnpfYnVmLCBTT0FQX0JVRkxFTik7CisgICAgc29hcC0+YnVmaWR4ID0gKGNoYXIqKXNvYXAtPmRfc3RyZWFtLm5leHRfaW4gLSBzb2FwLT56X2J1ZjsKKyAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT56X2J1ZmxlbjsKKyAgICBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX05PTkU7CisgICAgaWYgKGluZmxhdGVFbmQoJnNvYXAtPmRfc3RyZWFtKSAhPSBaX09LKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworI2lmZGVmIFdJVEhfR1pJUAorICAgIGlmIChzb2FwLT56bGliX2luID09IFNPQVBfWkxJQl9HWklQKQorICAgIHsgc29hcF93Y2hhciBjOworICAgICAgc2hvcnQgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICB7IGlmICgoaW50KShjID0gc29hcF9nZXRjaGFyKHNvYXApKSA9PSBFT0YpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgICAgIHNvYXAtPnpfYnVmW2ldID0gKGNoYXIpYzsKKyAgICAgIH0KKyAgICAgIGlmIChzb2FwLT56X2NyYyAhPSAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzBdIHwgKCh1TG9uZykodW5zaWduZWQgY2hhcilzb2FwLT56X2J1ZlsxXSA8PCA4KSB8ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbMl0gPDwgMTYpIHwgKCh1TG9uZykodW5zaWduZWQgY2hhcilzb2FwLT56X2J1ZlszXSA8PCAyNCkpKQorICAgICAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiR3ppcCBlcnJvcjogY3JjIGNoZWNrIGZhaWxlZCwgbWVzc2FnZSBjb3JydXB0ZWQ/IChjcmMzMj0lbHUpXG4iLCAodW5zaWduZWQgbG9uZylzb2FwLT56X2NyYykpOworICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgICB9CisgICAgICBpZiAoc29hcC0+ZF9zdHJlYW0udG90YWxfb3V0ICE9ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbNF0gfCAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzVdIDw8IDgpIHwgKCh1TG9uZykodW5zaWduZWQgY2hhcilzb2FwLT56X2J1Zls2XSA8PCAxNikgfCAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzddIDw8IDI0KSkpCisgICAgICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJHemlwIGVycm9yOiBpbmNvcnJlY3QgbWVzc2FnZSBsZW5ndGhcbiIpKTsKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgfQorICAgIH0KKyNlbmRpZgorICB9CisjZW5kaWYKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgICB3aGlsZSAoKGludClzb2FwX2dldGNoYXIoc29hcCkgIT0gRU9GKSAvKiBhZHZhbmNlIHRvIGxhc3QgY2h1bmsgKi8KKyAgICAgIDsKKyAgaWYgKHNvYXAtPmZkaXNjb25uZWN0ICYmIChzb2FwLT5lcnJvciA9IHNvYXAtPmZkaXNjb25uZWN0KHNvYXApKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICByZXR1cm4gc29hcF9yZXNvbHZlKHNvYXApOworI2Vsc2UKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPnhsaXN0KQorICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTUlNRV9IUkVGOworICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRElNRV9IUkVGOworICB9CisjZW5kaWYKKyAgcmV0dXJuIFNPQVBfT0s7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZnJlZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc3RydWN0IE5hbWVzcGFjZSAqbnM7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZSBuYW1lc3BhY2Ugc3RhY2tcbiIpKTsKKyAgd2hpbGUgKHNvYXAtPm5saXN0KQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucCA9IHNvYXAtPm5saXN0LT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5ubGlzdCk7CisgICAgc29hcC0+bmxpc3QgPSBucDsKKyAgfQorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWUgYW55IHJlbWFpbmluZyB0ZW1wIGJsb2Nrc1xuIikpOworICB3aGlsZSAoc29hcC0+Ymxpc3QpCisgICAgc29hcF9lbmRfYmxvY2soc29hcCk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZSBhdHRyaWJ1dGUgc3RvcmFnZVxuIikpOworICB3aGlsZSAoc29hcC0+YXR0cmlidXRlcykKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKnRwID0gc29hcC0+YXR0cmlidXRlcy0+bmV4dDsKKyAgICBpZiAoc29hcC0+YXR0cmlidXRlcy0+dmFsdWUpCisgICAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+YXR0cmlidXRlcy0+dmFsdWUpOworICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5hdHRyaWJ1dGVzKTsKKyAgICBzb2FwLT5hdHRyaWJ1dGVzID0gdHA7CisgIH0KKyNpZmRlZiBXSVRIX0ZBU1QKKyAgaWYgKHNvYXAtPmxhYmJ1ZikKKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+bGFiYnVmKTsKKyAgc29hcC0+bGFiYnVmID0gTlVMTDsKKyAgc29hcC0+bGFibGVuID0gMDsKKyAgc29hcC0+bGFiaWR4ID0gMDsKKyNlbmRpZgorICBucyA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXM7CisgIGlmIChucykKKyAgeyBmb3IgKDsgbnMtPmlkOyBucysrKQorICAgIHsgaWYgKG5zLT5vdXQpCisgICAgICB7IGlmIChzb2FwLT5lbmNvZGluZ1N0eWxlID09IG5zLT5vdXQpCisgICAgICAgICAgc29hcC0+ZW5jb2RpbmdTdHlsZSA9IFNPQVBfU1RSX0VPUzsKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIG5zLT5vdXQpOworICAgICAgICBucy0+b3V0ID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGlmIChzb2FwLT5lbmNvZGluZ1N0eWxlID09IG5zLT5ucykKKyAgICAgICAgc29hcC0+ZW5jb2RpbmdTdHlsZSA9IFNPQVBfU1RSX0VPUzsKKyAgICB9CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPmxvY2FsX25hbWVzcGFjZXMpOworICAgIHNvYXAtPmxvY2FsX25hbWVzcGFjZXMgPSBOVUxMOworICB9CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHdoaWxlIChzb2FwLT54bGlzdCkKKyAgeyBzdHJ1Y3Qgc29hcF94bGlzdCAqeHAgPSBzb2FwLT54bGlzdC0+bmV4dDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+eGxpc3QpOworICAgIHNvYXAtPnhsaXN0ID0geHA7CisgIH0KKyNlbmRpZgorI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgc29hcF9mcmVlX3BodChzb2FwKTsKKyAgc29hcF9mcmVlX2lodChzb2FwKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworc3RhdGljIHZvaWQKK3NvYXBfaW5pdF9sb2dzKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfTUFYTE9HUzsgaSsrKQorICB7IHNvYXAtPmxvZ2ZpbGVbaV0gPSBOVUxMOworICAgIHNvYXAtPmZkZWJ1Z1tpXSA9IE5VTEw7CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmICFkZWZpbmVkKFdJVEhfTEVBTikgfHwgZGVmaW5lZChTT0FQX0RFQlVHKQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9vcGVuX2xvZ2ZpbGUoc3RydWN0IHNvYXAgKnNvYXAsIGludCBpKQoreyBpZiAoc29hcC0+bG9nZmlsZVtpXSkKKyAgICBzb2FwLT5mZGVidWdbaV0gPSBmb3Blbihzb2FwLT5sb2dmaWxlW2ldLCBpIDwgMiA/ICJhYiIgOiAiYSIpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworc3RhdGljIHZvaWQKK3NvYXBfY2xvc2VfbG9nZmlsZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGkpCit7IGlmIChzb2FwLT5mZGVidWdbaV0pCisgIHsgZmNsb3NlKHNvYXAtPmZkZWJ1Z1tpXSk7CisgICAgc29hcC0+ZmRlYnVnW2ldID0gTlVMTDsKKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9jbG9zZV9sb2dmaWxlcyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX01BWExPR1M7IGkrKykKKyAgICBzb2FwX2Nsb3NlX2xvZ2ZpbGUoc29hcCwgaSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitzdGF0aWMgdm9pZAorc29hcF9zZXRfbG9nZmlsZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGksIGNvbnN0IGNoYXIgKmxvZ2ZpbGUpCit7IGNoYXIgKnMgPSBOVUxMOworICBzb2FwX2Nsb3NlX2xvZ2ZpbGUoc29hcCwgaSk7CisgIGlmIChzb2FwLT5sb2dmaWxlW2ldKQorICAgIFNPQVBfRlJFRShzb2FwLCAodm9pZCopc29hcC0+bG9nZmlsZVtpXSk7CisgIGlmIChsb2dmaWxlKQorICAgIGlmICgocyA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4obG9nZmlsZSkgKyAxKSkpCisgICAgICBzdHJjcHkocywgbG9nZmlsZSk7CisgIHNvYXAtPmxvZ2ZpbGVbaV0gPSBzOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfcmVjdl9sb2dmaWxlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpsb2dmaWxlKQoreyBzb2FwX3NldF9sb2dmaWxlKHNvYXAsIFNPQVBfSU5ERVhfUkVDViwgbG9nZmlsZSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9zZW50X2xvZ2ZpbGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmxvZ2ZpbGUpCit7IHNvYXBfc2V0X2xvZ2ZpbGUoc29hcCwgU09BUF9JTkRFWF9TRU5ULCBsb2dmaWxlKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X3Rlc3RfbG9nZmlsZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbG9nZmlsZSkKK3sgc29hcF9zZXRfbG9nZmlsZShzb2FwLCBTT0FQX0lOREVYX1RFU1QsIGxvZ2ZpbGUpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc3RydWN0IHNvYXAqCitTT0FQX0ZNQUMyCitzb2FwX2NvcHkoc3RydWN0IHNvYXAgKnNvYXApCit7IHJldHVybiBzb2FwX2NvcHlfY29udGV4dCgoc3RydWN0IHNvYXAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHNvYXApKSwgc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcCoKK1NPQVBfRk1BQzIKK3NvYXBfY29weV9jb250ZXh0KHN0cnVjdCBzb2FwICpjb3B5LCBzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXBfY2hlY2tfc3RhdGUoc29hcCkpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmIChjb3B5KQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BsdWdpbiAqcDsKKyAgICBtZW1jcHkoY29weSwgc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwKSk7CisgICAgY29weS0+c3RhdGUgPSBTT0FQX0NPUFk7CisgICAgY29weS0+dXNlciA9IE5VTEw7CisgICAgY29weS0+ZXJyb3IgPSBTT0FQX09LOworICAgIGNvcHktPnVzZXJpZCA9IE5VTEw7CisgICAgY29weS0+cGFzc3dkID0gTlVMTDsKKyAgICBjb3B5LT5ubGlzdCA9IE5VTEw7CisgICAgY29weS0+Ymxpc3QgPSBOVUxMOworICAgIGNvcHktPmNsaXN0ID0gTlVMTDsKKyAgICBjb3B5LT5hbGlzdCA9IE5VTEw7CisgICAgY29weS0+YXR0cmlidXRlcyA9IE5VTEw7CisjaWZkZWYgV0lUSF9GQVNUCisgICAgY29weS0+bGFiYnVmID0gTlVMTDsKKyAgICBjb3B5LT5sYWJsZW4gPSAwOworICAgIGNvcHktPmxhYmlkeCA9IDA7CisjZW5kaWYKKyNpZmRlZiBTT0FQX0RFQlVHCisgICAgc29hcF9pbml0X21odChjb3B5KTsKKyNlbmRpZgorICAgIGNvcHktPmxvY2FsX25hbWVzcGFjZXMgPSBOVUxMOworI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgICBzb2FwX2luaXRfaWh0KGNvcHkpOworICAgIHNvYXBfaW5pdF9waHQoY29weSk7CisjZW5kaWYKKyAgICBjb3B5LT5oZWFkZXIgPSBOVUxMOworICAgIGNvcHktPmZhdWx0ID0gTlVMTDsKKyAgICBjb3B5LT5hY3Rpb24gPSBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyNpZmRlZiBXSVRIX0NPT0tJRVMKKyAgICBjb3B5LT5jb29raWVzID0gc29hcF9jb3B5X2Nvb2tpZXMoY29weSk7CisjZWxzZQorICAgIGNvcHktPmNvb2tpZXMgPSBOVUxMOworI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBTT0FQX0RFQlVHCisgICAgc29hcF9pbml0X2xvZ3MoY29weSk7CisgICAgc29hcF9zZXRfcmVjdl9sb2dmaWxlKGNvcHksIHNvYXAtPmxvZ2ZpbGVbU09BUF9JTkRFWF9SRUNWXSk7CisgICAgc29hcF9zZXRfc2VudF9sb2dmaWxlKGNvcHksIHNvYXAtPmxvZ2ZpbGVbU09BUF9JTkRFWF9TRU5UXSk7CisgICAgc29hcF9zZXRfdGVzdF9sb2dmaWxlKGNvcHksIHNvYXAtPmxvZ2ZpbGVbU09BUF9JTkRFWF9URVNUXSk7CisjZW5kaWYKKyAgICBjb3B5LT5wbHVnaW5zID0gTlVMTDsKKyAgICBmb3IgKHAgPSBzb2FwLT5wbHVnaW5zOyBwOyBwID0gcC0+bmV4dCkKKyAgICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BsdWdpbiAqcSA9IChzdHJ1Y3Qgc29hcF9wbHVnaW4qKVNPQVBfTUFMTE9DKGNvcHksIHNpemVvZihzdHJ1Y3Qgc29hcF9wbHVnaW4pKTsKKyAgICAgIGlmICghcSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHlpbmcgcGx1Z2luICclcydcbiIsIHAtPmlkKSk7CisgICAgICAqcSA9ICpwOworICAgICAgaWYgKHAtPmZjb3B5ICYmIChzb2FwLT5lcnJvciA9IHAtPmZjb3B5KGNvcHksIHEsIHApKSkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgY29weSBwbHVnaW4gJyVzJ1xuIiwgcC0+aWQpKTsKKyAgICAgICAgU09BUF9GUkVFKGNvcHksIHEpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIHEtPm5leHQgPSBjb3B5LT5wbHVnaW5zOworICAgICAgY29weS0+cGx1Z2lucyA9IHE7CisgICAgfQorICB9CisgIGVsc2UKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICByZXR1cm4gY29weTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfaW5pdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+c3RhdGUgPSBTT0FQX0lOSVQ7CisgIHNvYXAtPnZlcnNpb24gPSAwOworICBzb2FwX2ltb2RlKHNvYXAsIFNPQVBfSU9fREVGQVVMVCk7CisgIHNvYXBfb21vZGUoc29hcCwgU09BUF9JT19ERUZBVUxUKTsKKyAgc29hcC0+cGx1Z2lucyA9IE5VTEw7CisgIHNvYXAtPnVzZXIgPSBOVUxMOworICBzb2FwLT51c2VyaWQgPSBOVUxMOworICBzb2FwLT5wYXNzd2QgPSBOVUxMOworI2lmbmRlZiBXSVRIX05PSFRUUAorICBzb2FwLT5mcG9zdCA9IGh0dHBfcG9zdDsKKyAgc29hcC0+ZmdldCA9IGh0dHBfZ2V0OworICBzb2FwLT5mZm9ybSA9IE5VTEw7CisgIHNvYXAtPmZwb3N0aGRyID0gaHR0cF9wb3N0X2hlYWRlcjsKKyAgc29hcC0+ZnJlc3BvbnNlID0gaHR0cF9yZXNwb25zZTsKKyAgc29hcC0+ZnBhcnNlID0gaHR0cF9wYXJzZTsKKyAgc29hcC0+ZnBhcnNlaGRyID0gaHR0cF9wYXJzZV9oZWFkZXI7CisjZW5kaWYKKyAgc29hcC0+ZmNvbm5lY3QgPSBOVUxMOworICBzb2FwLT5mZGlzY29ubmVjdCA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0lQVjYKKyAgc29hcC0+ZnJlc29sdmUgPSB0Y3BfZ2V0aG9zdDsKKyNlbHNlCisgIHNvYXAtPmZyZXNvbHZlID0gTlVMTDsKKyNlbmRpZgorICBzb2FwLT5mYWNjZXB0ID0gdGNwX2FjY2VwdDsKKyAgc29hcC0+Zm9wZW4gPSB0Y3BfY29ubmVjdDsKKyAgc29hcC0+ZmNsb3NlID0gdGNwX2Rpc2Nvbm5lY3Q7CisgIHNvYXAtPmZjbG9zZXNvY2tldCA9IHRjcF9jbG9zZXNvY2tldDsKKyAgc29hcC0+ZnNodXRkb3duc29ja2V0ID0gdGNwX3NodXRkb3duc29ja2V0OworICBzb2FwLT5mc2VuZCA9IGZzZW5kOworICBzb2FwLT5mcmVjdiA9IGZyZWN2OworICBzb2FwLT5mcG9sbCA9IHNvYXBfcG9sbDsKKyNlbHNlCisgIHNvYXAtPmZvcGVuID0gTlVMTDsKKyAgc29hcC0+ZmNsb3NlID0gTlVMTDsKKyAgc29hcC0+ZnBvbGwgPSBOVUxMOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXAtPmZwcmVwYXJlaW5pdCA9IE5VTEw7CisgIHNvYXAtPmZwcmVwYXJlc2VuZCA9IE5VTEw7CisgIHNvYXAtPmZwcmVwYXJlcmVjdiA9IE5VTEw7CisgIHNvYXAtPmZwcmVwYXJlZmluYWwgPSBOVUxMOworI2VuZGlmCisgIHNvYXAtPmZzZXRlcnJvciA9IE5VTEw7CisgIHNvYXAtPmZpZ25vcmUgPSBOVUxMOworICBzb2FwLT5mc2VydmVsb29wID0gTlVMTDsKKyAgc29hcC0+ZnBsdWdpbiA9IGZwbHVnaW47CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXAtPmZkaW1lcmVhZG9wZW4gPSBOVUxMOworICBzb2FwLT5mZGltZXdyaXRlb3BlbiA9IE5VTEw7CisgIHNvYXAtPmZkaW1lcmVhZGNsb3NlID0gTlVMTDsKKyAgc29hcC0+ZmRpbWV3cml0ZWNsb3NlID0gTlVMTDsKKyAgc29hcC0+ZmRpbWVyZWFkID0gTlVMTDsKKyAgc29hcC0+ZmRpbWV3cml0ZSA9IE5VTEw7CisjZW5kaWYKKyAgc29hcC0+ZmxvYXRfZm9ybWF0ID0gIiUuOGciOyAvKiAuOCBwcmVzZXJ2ZXMgc2luZ2xlIEZQIHByZWNpc2lvbiBhcyBtdWNoIGFzIHBvc3NpYmxlLCBidXQgbWlnaHQgbm90IGJlIHZlcnkgZWZmaWNpZW50ICovCisgIHNvYXAtPmRvdWJsZV9mb3JtYXQgPSAiJS4xN2xnIjsgLyogLjE3IHByZXNlcnZlcyBkb3VibGUgRlAgcHJlY2lzaW9uIGFzIG11Y2ggYXMgcG9zc2libGUsIGJ1dCBtaWdodCBub3QgYmUgdmVyeSBlZmZpY2llbnQgKi8KKyAgc29hcC0+ZGltZV9pZF9mb3JtYXQgPSAiY2lkOmlkJWQiOyAvKiBkZWZhdWx0IERJTUUgaWQgZm9ybWF0ICovCisgIHNvYXAtPmh0dHBfdmVyc2lvbiA9ICIxLjEiOworICBzb2FwLT5hY3RvciA9IE5VTEw7CisgIHNvYXAtPm1heF9rZWVwX2FsaXZlID0gU09BUF9NQVhLRUVQQUxJVkU7CisgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOworICBzb2FwLT5yZWN2X3RpbWVvdXQgPSAwOworICBzb2FwLT5zZW5kX3RpbWVvdXQgPSAwOworICBzb2FwLT5jb25uZWN0X3RpbWVvdXQgPSAwOworICBzb2FwLT5hY2NlcHRfdGltZW91dCA9IDA7CisgIHNvYXAtPnNvY2tldF9mbGFncyA9IDA7CisgIHNvYXAtPmNvbm5lY3RfZmxhZ3MgPSAwOworICBzb2FwLT5iaW5kX2ZsYWdzID0gMDsKKyAgc29hcC0+YWNjZXB0X2ZsYWdzID0gMDsKKyAgc29hcC0+aXAgPSAwOworI2lmZGVmIFdJVEhfRkFTVAorICBzb2FwLT5sYWJidWYgPSBOVUxMOworICBzb2FwLT5sYWJsZW4gPSAwOworICBzb2FwLT5sYWJpZHggPSAwOworI2VuZGlmCisgIHNvYXAtPmVuY29kaW5nU3R5bGUgPSBTT0FQX1NUUl9FT1M7CisjaWZuZGVmIFdJVEhfTk9OQU1FU1BBQ0VTCisgIHNvYXAtPm5hbWVzcGFjZXMgPSBuYW1lc3BhY2VzOworI2Vsc2UKKyAgc29hcC0+bmFtZXNwYWNlcyA9IE5VTEw7CisjZW5kaWYKKyAgc29hcC0+bG9jYWxfbmFtZXNwYWNlcyA9IE5VTEw7CisgIHNvYXAtPm5saXN0ID0gTlVMTDsKKyAgc29hcC0+Ymxpc3QgPSBOVUxMOworICBzb2FwLT5jbGlzdCA9IE5VTEw7CisgIHNvYXAtPmFsaXN0ID0gTlVMTDsKKyAgc29hcC0+YXR0cmlidXRlcyA9IE5VTEw7CisgIHNvYXAtPmhlYWRlciA9IE5VTEw7CisgIHNvYXAtPmZhdWx0ID0gTlVMTDsKKyAgc29hcC0+bWFzdGVyID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgc29hcC0+c29ja2V0ID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgc29hcC0+b3MgPSBOVUxMOworICBzb2FwLT5pcyA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXAtPmRvbSA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGlzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmxhc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmxpc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5sYXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5ib3VuZGFyeSA9IE5VTEw7CisgIHNvYXAtPm1pbWUuc3RhcnQgPSBOVUxMOworICBzb2FwLT54bGlzdCA9IE5VTEw7CisjZW5kaWYKKyNpZm5kZWYgVU5ERVJfQ0UKKyAgc29hcC0+cmVjdmZkID0gMDsKKyAgc29hcC0+c2VuZGZkID0gMTsKKyNlbHNlCisgIHNvYXAtPnJlY3ZmZCA9IHN0ZGluOworICBzb2FwLT5zZW5kZmQgPSBzdGRvdXQ7CisjZW5kaWYgCisgIHNvYXAtPmhvc3RbMF0gPSAnXDAnOworICBzb2FwLT5wb3J0ID0gMDsKKyAgc29hcC0+YWN0aW9uID0gTlVMTDsKKyAgc29hcC0+cHJveHlfaG9zdCA9IE5VTEw7CisgIHNvYXAtPnByb3h5X3BvcnQgPSA4MDgwOworICBzb2FwLT5wcm94eV91c2VyaWQgPSBOVUxMOworICBzb2FwLT5wcm94eV9wYXNzd2QgPSBOVUxMOworICBzb2FwLT5hdXRocmVhbG0gPSBOVUxMOworICBzb2FwLT5wcm9sb2cgPSBOVUxMOworI2lmZGVmIFdJVEhfT1BFTlNTTAorICBpZiAoIXNzbF9pbml0X2RvbmUpCisgICAgc29hcF9zc2xfaW5pdCgpOworICBzb2FwLT5mc3NsYXV0aCA9IHNzbF9hdXRoX2luaXQ7CisgIHNvYXAtPmZzc2x2ZXJpZnkgPSBzc2xfdmVyaWZ5X2NhbGxiYWNrOworICBzb2FwLT5iaW8gPSBOVUxMOworICBzb2FwLT5zc2wgPSBOVUxMOworICBzb2FwLT5jdHggPSBOVUxMOworICBzb2FwLT5yZXF1aXJlX3NlcnZlcl9hdXRoID0gMDsKKyAgc29hcC0+cmVxdWlyZV9jbGllbnRfYXV0aCA9IDA7CisgIHNvYXAtPnJzYSA9IDA7CisgIHNvYXAtPmtleWZpbGUgPSBOVUxMOworICBzb2FwLT5wYXNzd29yZCA9IE5VTEw7CisgIHNvYXAtPmRoZmlsZSA9IE5VTEw7CisgIHNvYXAtPmNhZmlsZSA9IE5VTEw7CisgIHNvYXAtPmNhcGF0aCA9IE5VTEw7CisgIHNvYXAtPmNybGZpbGUgPSBOVUxMOworICBzb2FwLT5yYW5kZmlsZSA9IE5VTEw7CisgIHNvYXAtPnNlc3Npb24gPSBOVUxMOworI2VuZGlmCisjaWZkZWYgV0lUSF9aTElCCisgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfTk9ORTsKKyAgc29hcC0+emxpYl9pbiA9IFNPQVBfWkxJQl9OT05FOworICBzb2FwLT56bGliX291dCA9IFNPQVBfWkxJQl9OT05FOworICBzb2FwLT5kX3N0cmVhbS56YWxsb2MgPSBOVUxMOworICBzb2FwLT5kX3N0cmVhbS56ZnJlZSA9IE5VTEw7CisgIHNvYXAtPmRfc3RyZWFtLm9wYXF1ZSA9IE5VTEw7CisgIHNvYXAtPnpfbGV2ZWwgPSA2OworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBzb2FwLT5jMTRuaW5jbHVkZSA9IE5VTEw7CisgIHNvYXAtPmMxNG5leGNsdWRlID0gTlVMTDsKKyAgc29hcC0+Y29va2llcyA9IE5VTEw7CisgIHNvYXAtPmNvb2tpZV9kb21haW4gPSBOVUxMOworICBzb2FwLT5jb29raWVfcGF0aCA9IE5VTEw7CisgIHNvYXAtPmNvb2tpZV9tYXggPSAzMjsKKyNlbmRpZgorI2lmZGVmIFNPQVBfREVCVUcKKyAgc29hcF9pbml0X21odChzb2FwKTsKKyAgc29hcF9pbml0X2xvZ3Moc29hcCk7CisgIHNvYXBfc2V0X3JlY3ZfbG9nZmlsZShzb2FwLCAiUkVDVi5sb2ciKTsKKyAgc29hcF9zZXRfc2VudF9sb2dmaWxlKHNvYXAsICJTRU5ULmxvZyIpOworICBzb2FwX3NldF90ZXN0X2xvZ2ZpbGUoc29hcCwgTlVMTCk7CisjZW5kaWYKKyNpZmRlZiBXTVdfUlBNX0lPCisgIHNvYXAtPnJwbXJlcWlkID0gTlVMTDsKKyNlbmRpZgorI2lmZGVmIFBBTE0KKyAgcGFsbU5ldExpYk9wZW4oKTsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgc29hcF9pbml0X2lodChzb2FwKTsKKyAgc29hcF9pbml0X3BodChzb2FwKTsKKyNlbmRpZgorICBzb2FwX2JlZ2luKHNvYXApOworI2lmZGVmIFNPQVBfREVCVUcKKyAgc29hcF9zZXRfdGVzdF9sb2dmaWxlKHNvYXAsICJURVNULmxvZyIpOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2luaXQxKHN0cnVjdCBzb2FwICpzb2FwLCBzb2FwX21vZGUgbW9kZSkKK3sgc29hcF9pbml0Mihzb2FwLCBtb2RlLCBtb2RlKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfaW5pdDIoc3RydWN0IHNvYXAgKnNvYXAsIHNvYXBfbW9kZSBpbW9kZSwgc29hcF9tb2RlIG9tb2RlKQoreyBzb2FwX2luaXQoc29hcCk7CisgIHNvYXBfaW1vZGUoc29hcCwgaW1vZGUpOworICBzb2FwX29tb2RlKHNvYXAsIG9tb2RlKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfYmVnaW4oc3RydWN0IHNvYXAgKnNvYXApCit7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5pdGlhbGl6aW5nXG4iKSk7CisgIGlmICghc29hcC0+a2VlcF9hbGl2ZSkKKyAgeyBzb2FwLT5idWZsZW4gPSAwOworICAgIHNvYXAtPmJ1ZmlkeCA9IDA7CisgIH0KKyAgc29hcC0+a2VlcF9hbGl2ZSA9ICgoKHNvYXAtPmltb2RlIHwgc29hcC0+b21vZGUpICYgU09BUF9JT19LRUVQQUxJVkUpICE9IDApOworICBzb2FwLT5udWxsID0gMDsKKyAgc29hcC0+cG9zaXRpb24gPSAwOworICBzb2FwLT5lbmNvZGluZyA9IDA7CisgIHNvYXAtPm11c3RVbmRlcnN0YW5kID0gMDsKKyAgc29hcC0+bW9kZSA9IDA7CisgIHNvYXAtPm5zID0gMDsKKyAgc29hcC0+cGFydCA9IFNPQVBfRU5EOworICBzb2FwLT5hbGxvY2VkID0gMDsKKyAgc29hcC0+Y291bnQgPSAwOworICBzb2FwLT5sZW5ndGggPSAwOworICBzb2FwLT5jZGF0YSA9IDA7CisgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgc29hcC0+cGVla2VkID0gMDsKKyAgc29hcC0+YWhlYWQgPSAwOworICBzb2FwLT5pZG51bSA9IDA7CisgIHNvYXAtPmxldmVsID0gMDsKKyAgc29hcC0+ZW5kcG9pbnRbMF0gPSAnXDAnOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzb2FwLT5kaW1lLmNodW5rc2l6ZSA9IDA7CisgIHNvYXAtPmRpbWUuYnVmbGVuID0gMDsKKyNlbmRpZgorICBzb2FwX2ZyZWUoc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2VuZChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfY2xpc3QgKmNwOworICBpZiAoc29hcF9jaGVja19zdGF0ZShzb2FwKSkKKyAgICByZXR1cm47CisgIHNvYXBfZnJlZShzb2FwKTsKKyAgc29hcF9kZWFsbG9jKHNvYXAsIE5VTEwpOworICB3aGlsZSAoc29hcC0+Y2xpc3QpCisgIHsgY3AgPSBzb2FwLT5jbGlzdC0+bmV4dDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+Y2xpc3QpOworICAgIHNvYXAtPmNsaXN0ID0gY3A7CisgIH0KKyAgc29hcF9jbG9zZXNvY2soc29hcCk7CisjaWZkZWYgU09BUF9ERUJVRworICBzb2FwX2Nsb3NlX2xvZ2ZpbGVzKHNvYXApOworI2VuZGlmCisjaWZkZWYgUEFMTQorICBwYWxtTmV0TGliQ2xvc2UoKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NldF9uYW1lc3BhY2VzKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgTmFtZXNwYWNlICpwKQoreyByZWdpc3RlciBzdHJ1Y3QgTmFtZXNwYWNlICpucyA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXM7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucCwgKm5xLCAqbnI7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBsZXZlbCA9IHNvYXAtPmxldmVsOworICBzb2FwLT5uYW1lc3BhY2VzID0gcDsKKyAgc29hcC0+bG9jYWxfbmFtZXNwYWNlcyA9IE5VTEw7CisgIHNvYXBfc2V0X2xvY2FsX25hbWVzcGFjZXMoc29hcCk7CisgIC8qIHJldmVyc2UgdGhlIG5hbWVzcGFjZSBsaXN0ICovCisgIG5wID0gc29hcC0+bmxpc3Q7CisgIHNvYXAtPm5saXN0ID0gTlVMTDsKKyAgaWYgKG5wKQorICB7IG5xID0gbnAtPm5leHQ7CisgICAgbnAtPm5leHQgPSBOVUxMOworICAgIHdoaWxlIChucSkKKyAgICB7IG5yID0gbnEtPm5leHQ7CisgICAgICBucS0+bmV4dCA9IG5wOworICAgICAgbnAgPSBucTsKKyAgICAgIG5xID0gbnI7CisgICAgfQorICB9CisgIC8qIHRoZW4gcHVzaCBvbiBuZXcgc3RhY2sgKi8KKyAgd2hpbGUgKG5wKQorICB7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnM7CisgICAgc29hcC0+bGV2ZWwgPSBucC0+bGV2ZWw7IC8qIHByZXNlcnZlIGVsZW1lbnQgbmVzdGluZyBsZXZlbCAqLworICAgIHMgPSBucC0+bnM7CisgICAgaWYgKCFzICYmIG5wLT5pbmRleCA+PSAwICYmIG5zKQorICAgIHsgcyA9IG5zW25wLT5pbmRleF0ub3V0OworICAgICAgaWYgKCFzKQorICAgICAgICBzID0gbnNbbnAtPmluZGV4XS5uczsKKyAgICB9CisgICAgaWYgKHMgJiYgc29hcF9wdXNoX25hbWVzcGFjZShzb2FwLCBucC0+aWQsIHMpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIG5xID0gbnA7CisgICAgbnAgPSBucC0+bmV4dDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgbnEpOworICB9CisgIGlmIChucykKKyAgeyByZWdpc3RlciBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBuc1tpXS5pZDsgaSsrKQorICAgIHsgaWYgKG5zW2ldLm91dCkKKyAgICAgIHsgU09BUF9GUkVFKHNvYXAsIG5zW2ldLm91dCk7CisgICAgICAgIG5zW2ldLm91dCA9IE5VTEw7CisgICAgICB9CisgICAgfQorICAgIFNPQVBfRlJFRShzb2FwLCBucyk7CisgIH0KKyAgc29hcC0+bGV2ZWwgPSBsZXZlbDsgLyogcmVzdG9yZSBsZXZlbCAqLworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2xvY2FsX25hbWVzcGFjZXMoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwLT5uYW1lc3BhY2VzICYmICFzb2FwLT5sb2NhbF9uYW1lc3BhY2VzKQorICB7IHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBOYW1lc3BhY2UgKm5zMTsKKyAgICByZWdpc3RlciBzdHJ1Y3QgTmFtZXNwYWNlICpuczI7CisgICAgcmVnaXN0ZXIgc2l6ZV90IG4gPSAxOworICAgIGZvciAobnMxID0gc29hcC0+bmFtZXNwYWNlczsgbnMxLT5pZDsgbnMxKyspCisgICAgICBuKys7CisgICAgbiAqPSBzaXplb2Yoc3RydWN0IE5hbWVzcGFjZSk7CisgICAgbnMyID0gKHN0cnVjdCBOYW1lc3BhY2UqKVNPQVBfTUFMTE9DKHNvYXAsIG4pOworICAgIGlmIChuczIpCisgICAgeyBtZW1jcHkobnMyLCBzb2FwLT5uYW1lc3BhY2VzLCBuKTsKKyAgICAgIGlmIChuczJbMF0ubnMpCisgICAgICB7IGlmICghc3RyY21wKG5zMlswXS5ucywgc29hcF9lbnYxKSkKKyAgICAgICAgICBzb2FwLT52ZXJzaW9uID0gMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHNvYXAtPnZlcnNpb24gPSAyOworICAgICAgfQorICAgICAgc29hcC0+bG9jYWxfbmFtZXNwYWNlcyA9IG5zMjsKKyAgICB9CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfc3Ryc2VhcmNoKGNvbnN0IGNoYXIgKmJpZywgY29uc3QgY2hhciAqbGl0dGxlKQoreyBzaXplX3QgbiA9IHN0cmxlbihsaXR0bGUpOworICBjb25zdCBjaGFyICpzID0gYmlnOworICB3aGlsZSAocykgCisgIHsgaWYgKCFzdHJuY21wKHMsIGxpdHRsZSwgbikgJiYgKHNbbl0gPT0gJ1wwJyB8fCBzW25dID09ICcgJykpCisgICAgICByZXR1cm4gczsKKyAgICBzID0gc3RyY2hyKHMsICcgJyk7CisgICAgaWYgKHMpCisgICAgICBzKys7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBzdHJ1Y3Qgc29hcF9ubGlzdCAqCitzb2FwX2xvb2t1cF9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzaXplX3QgbikKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wOworICBmb3IgKG5wID0gc29hcC0+bmxpc3Q7IG5wOyBucCA9IG5wLT5uZXh0KQorICB7IGlmICghc3RybmNtcChucC0+aWQsIHRhZywgbikgJiYgIW5wLT5pZFtuXSkKKyAgICAgIHJldHVybiBucDsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBzdHJ1Y3Qgc29hcF9ubGlzdCAqCitzb2FwX3B1c2hfbnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICpucywgc2hvcnQgdXRpbGl6ZWQpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucDsKKyAgc2l6ZV90IG4sIGs7CisgIGlmIChzb2FwX3N0cnNlYXJjaChzb2FwLT5jMTRuZXhjbHVkZSwgaWQpKQorICAgIHJldHVybiBOVUxMOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlB1c2ggbmFtZXNwYWNlIGJpbmRpbmcgKGxldmVsPSV1KSAnJXMnICclcydcbiIsIHNvYXAtPmxldmVsLCBpZCwgbnM/bnM6IiIpKTsKKyAgaWYgKCF1dGlsaXplZCkKKyAgeyBmb3IgKG5wID0gc29hcC0+bmxpc3Q7IG5wOyBucCA9IG5wLT5uZXh0KQorICAgIHsgaWYgKCFzdHJjbXAobnAtPmlkLCBpZCkgJiYgKCFucC0+bnMgfHwgIXN0cmNtcChucC0+bnMsIG5zKSkpCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAobnApCisgICAgeyBpZiAobnAtPmluZGV4ID09IDEpCisgICAgICAgIHV0aWxpemVkID0gbnAtPmluZGV4OworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIH0KKyAgbiA9IHN0cmxlbihpZCk7CisgIGlmIChucykKKyAgICBrID0gc3RybGVuKG5zKTsKKyAgZWxzZQorICAgIGsgPSAwOworICBucCA9IChzdHJ1Y3Qgc29hcF9ubGlzdCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX25saXN0KSArIG4gKyBrICsgMSk7CisgIGlmICghbnApCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBucC0+bmV4dCA9IHNvYXAtPm5saXN0OworICBzb2FwLT5ubGlzdCA9IG5wOworICBzdHJjcHkobnAtPmlkLCBpZCk7CisgIGlmIChucykKKyAgeyBucC0+bnMgPSBucC0+aWQgKyBuICsgMTsKKyAgICBzdHJjcHkobnAtPm5zLCBucyk7CisgIH0KKyAgZWxzZQorICAgIG5wLT5ucyA9IE5VTEw7CisgIG5wLT5sZXZlbCA9IHNvYXAtPmxldmVsOworICBucC0+aW5kZXggPSB1dGlsaXplZDsKKyAgcmV0dXJuIG5wOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIHZvaWQKK3NvYXBfdXRpbGl6ZV9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzaXplX3QgbikKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wID0gc29hcF9sb29rdXBfbnMoc29hcCwgdGFnLCBuKTsKKyAgaWYgKG5wKQorICB7IGlmIChucC0+aW5kZXggPT0gMCkKKyAgICAgIHNvYXBfcHVzaF9ucyhzb2FwLCBucC0+aWQsIG5wLT5ucywgMSk7CisgIH0KKyAgZWxzZQorICB7IHN0cm5jcHkoc29hcC0+dG1wYnVmLCB0YWcsIG4pOworICAgIHNvYXAtPnRtcGJ1ZltuXSA9ICdcMCc7CisgICAgc29hcF9wdXNoX25zKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgTlVMTCwgMSk7CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyB2b2lkCitzb2FwX3BvcF9ucyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcF9wb3BfbmFtZXNwYWNlKHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICp0eXBlKQoreyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVsZW1lbnQgYmVnaW4gdGFnPSclcycgaWQ9JyVkJyB0eXBlPSclcydcbiIsIHRhZywgaWQsIHR5cGU/dHlwZToiIikpOworI2lmZGVmIFdJVEhfRE9NCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICplbHQgPSAoc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCkpOworICAgIGlmICghZWx0KQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgZWx0LT5zb2FwID0gc29hcDsKKyAgICBlbHQtPm5leHQgPSBOVUxMOworICAgIGVsdC0+cHJudCA9IHNvYXAtPmRvbTsKKyAgICBlbHQtPm5hbWUgPSBzb2FwX3N0cmR1cChzb2FwLCB0YWcpOworICAgIGVsdC0+ZWx0cyA9IE5VTEw7CisgICAgZWx0LT5hdHRzID0gTlVMTDsKKyAgICBlbHQtPm5zdHIgPSBOVUxMOworICAgIGVsdC0+ZGF0YSA9IE5VTEw7CisgICAgZWx0LT53aWRlID0gTlVMTDsKKyAgICBlbHQtPm5vZGUgPSBOVUxMOworICAgIGVsdC0+dHlwZSA9IDA7CisgICAgZWx0LT5oZWFkID0gTlVMTDsKKyAgICBlbHQtPnRhaWwgPSBOVUxMOworICAgIGlmIChzb2FwLT5kb20pCisgICAgeyBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqcCA9IHNvYXAtPmRvbS0+ZWx0czsKKyAgICAgIGlmIChwKQorICAgICAgeyB3aGlsZSAocC0+bmV4dCkKKyAgICAgICAgICBwID0gcC0+bmV4dDsKKyAgICAgICAgcC0+bmV4dCA9IGVsdDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgc29hcC0+ZG9tLT5lbHRzID0gZWx0OworICAgIH0KKyAgICBzb2FwLT5kb20gPSBlbHQ7CisgIH0KKyAgZWxzZQorICB7CisjZW5kaWYKKyAgICBzb2FwLT5sZXZlbCsrOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBpZiAoIXNvYXAtPm5zKQorICAgIHsgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgICAgICAmJiBzb2FwX3NlbmQoc29hcCwgc29hcC0+cHJvbG9nID8gc29hcC0+cHJvbG9nIDogIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIikpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgZWxzZSBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0lOREVOVCkKKyAgICB7IGlmIChzb2FwLT5ucyA9PSAxICYmIHNvYXBfc2VuZF9yYXcoc29hcCwgc29hcF9pbmRlbnQsIHNvYXAtPmxldmVsIDwgc2l6ZW9mKHNvYXBfaW5kZW50KSA/IHNvYXAtPmxldmVsIDogc2l6ZW9mKHNvYXBfaW5kZW50KSAtIDEpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBzb2FwLT5ib2R5ID0gMTsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAiPCIsIDEpCisgICAgIHx8IHNvYXBfc2VuZChzb2FwLCB0YWcpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmZGVmIFdJVEhfRE9NCisgIH0KKyNlbmRpZgorICBpZiAoIXNvYXAtPm5zKQorICB7IHN0cnVjdCBOYW1lc3BhY2UgKm5zOworICAgIGZvciAobnMgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzOyBucyAmJiBucy0+aWQ7IG5zKyspCisgICAgeyBpZiAoKm5zLT5pZCAmJiAobnMtPm91dCB8fCBucy0+bnMpKQorICAgICAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgInhtbG5zOiVzIiwgbnMtPmlkKTsKKyAgICAgICAgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgbnMtPm91dCA/IG5zLT5vdXQgOiBucy0+bnMpKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIH0KKyAgICB9ICAgCisgIH0KKyAgc29hcC0+bnMgPSAxOyAvKiBzdGFydCB3aXRoIDAgb3IgMiwgYnV0IHNob3VsZCBiZSBvbmUgdG8gY29udGludWUgKi8KKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICB7IGNvbnN0IGNoYXIgKnMgPSBzdHJjaHIodGFnLCAnOicpOworICAgIGlmIChzKQorICAgICAgc29hcF91dGlsaXplX25zKHNvYXAsIHRhZywgcyAtIHRhZyk7CisgIH0KKyNlbmRpZgorICBpZiAoaWQgPiAwKQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiXyVkIiwgaWQpOworICAgIGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAiaWQiLCBzb2FwLT50bXBidWYpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmICh0eXBlICYmICp0eXBlKQorICB7IGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAieHNpOnR5cGUiLCB0eXBlKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgICAgeyBjb25zdCBjaGFyICpzID0gc3RyY2hyKHR5cGUsICc6Jyk7CisgICAgICBpZiAocykKKyAgICAgICAgc29hcF91dGlsaXplX25zKHNvYXAsIHR5cGUsIHMgLSB0eXBlKTsKKyAgICB9CisjZW5kaWYKKyAgfQorICBpZiAoc29hcC0+bnVsbCAmJiBzb2FwLT5wb3NpdGlvbiA+IDApCisgIHsgaW50IGk7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICJbJWQiLCBzb2FwLT5wb3NpdGlvbnNbMF0pOworICAgIGZvciAoaSA9IDE7IGkgPCBzb2FwLT5wb3NpdGlvbjsgaSsrKQorICAgICAgc3ByaW50Zihzb2FwLT50bXBidWYgKyBzdHJsZW4oc29hcC0+dG1wYnVmKSwgIiwlZCIsIHNvYXAtPnBvc2l0aW9uc1tpXSk7CisgICAgc3RyY2F0KHNvYXAtPnRtcGJ1ZiwgIl0iKTsKKyAgICBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgIlNPQVAtRU5DOnBvc2l0aW9uIiwgc29hcC0+dG1wYnVmKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAoc29hcC0+bXVzdFVuZGVyc3RhbmQpCisgIHsgaWYgKHNvYXAtPmFjdG9yICYmICpzb2FwLT5hY3RvcikKKyAgICB7IGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCBzb2FwLT52ZXJzaW9uID09IDIgPyAiU09BUC1FTlY6cm9sZSIgOiAiU09BUC1FTlY6YWN0b3IiLCBzb2FwLT5hY3RvcikpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJTT0FQLUVOVjptdXN0VW5kZXJzdGFuZCIsIHNvYXAtPnZlcnNpb24gPT0gMiA/ICJ0cnVlIiA6ICIxIikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgc29hcC0+bXVzdFVuZGVyc3RhbmQgPSAwOworICB9CisgIGlmIChzb2FwLT5lbmNvZGluZykKKyAgeyBpZiAoc29hcC0+ZW5jb2RpbmdTdHlsZSAmJiBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzKQorICAgIHsgaWYgKCEqc29hcC0+ZW5jb2RpbmdTdHlsZSkKKyAgICAgIHsgaWYgKHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbMV0ub3V0KQorICAgICAgICAgIHNvYXAtPmVuY29kaW5nU3R5bGUgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzWzFdLm91dDsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHNvYXAtPmVuY29kaW5nU3R5bGUgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzWzFdLm5zOworICAgICAgfQorICAgICAgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJTT0FQLUVOVjplbmNvZGluZ1N0eWxlIiwgc29hcC0+ZW5jb2RpbmdTdHlsZSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgc29hcC0+ZW5jb2RpbmcgPSAwOworICB9CisgIHNvYXAtPm51bGwgPSAwOworICBzb2FwLT5wb3NpdGlvbiA9IDA7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgY2hhciAqdHlwZSkKK3sgaWYgKCp0YWcgPT0gJy0nKQorICAgIHJldHVybiBTT0FQX09LOworICBpZiAoc29hcF9lbGVtZW50KHNvYXAsIHRhZywgaWQsIHR5cGUpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHNvYXAsIE5VTEwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorI2lmbmRlZiBIQVZFX1NUUlJDSFIKK1NPQVBfRk1BQzEKK2NoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3N0cnJjaHIoY29uc3QgY2hhciAqcywgaW50IHQpCit7IHJlZ2lzdGVyIGNoYXIgKnIgPSBOVUxMOworICB3aGlsZSAoKnMpCisgICAgaWYgKCpzKysgPT0gdCkKKyAgICAgIHIgPSAoY2hhciopcyAtIDE7CisgIHJldHVybiByOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCisjaWZuZGVmIEhBVkVfU1RSVE9MCitTT0FQX0ZNQUMxCitsb25nCitTT0FQX0ZNQUMyCitzb2FwX3N0cnRvbChjb25zdCBjaGFyICpzLCBjaGFyICoqdCwgaW50IGIpCit7IHJlZ2lzdGVyIGxvbmcgbiA9IDA7CisgIHJlZ2lzdGVyIGludCBjOworICB3aGlsZSAoKnMgPiAwICYmICpzIDw9IDMyKQorICAgIHMrKzsKKyAgaWYgKGIgPT0gMTApCisgIHsgc2hvcnQgbmVnID0gMDsKKyAgICBpZiAoKnMgPT0gJy0nKQorICAgIHsgcysrOworICAgICAgbmVnID0gMTsKKyAgICB9CisgICAgZWxzZSBpZiAoKnMgPT0gJysnKQorICAgICAgcysrOworICAgIHdoaWxlICgoYyA9ICpzKSAmJiBjID49ICcwJyAmJiBjIDw9ICc5JykKKyAgICB7IGlmIChuID49IDIxNDc0ODM2NCAmJiAobiA+IDIxNDc0ODM2NCB8fCBjID49ICc4JykpCisgICAgICAgIGJyZWFrOworICAgICAgbiAqPSAxMDsKKyAgICAgIG4gKz0gYyAtICcwJzsKKyAgICAgIHMrKzsKKyAgICB9CisgICAgaWYgKG5lZykKKyAgICAgIG4gPSAtbjsKKyAgfQorICBlbHNlIC8qIGIgPT0gMTYgYW5kIHZhbHVlIGlzIGFsd2F5cyBwb3NpdGl2ZSAqLworICB7IHdoaWxlICgoYyA9ICpzKSkKKyAgICB7IGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKKyAgICAgICAgYyAtPSAnMCc7CisgICAgICBlbHNlIGlmIChjID49ICdBJyAmJiBjIDw9ICdGJykKKyAgICAgICAgYyAtPSAnQScgLSAxMDsKKyAgICAgIGVsc2UgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQorICAgICAgICBjIC09ICdhJyAtIDEwOworICAgICAgaWYgKG4gPiAweDA3RkZGRkZGKQorICAgICAgICBicmVhazsKKyAgICAgIG4gPDw9IDQ7CisgICAgICBuICs9IGM7CisgICAgICBzKys7CisgICAgfQorICB9CisgIGlmICh0KQorICAgICp0ID0gKGNoYXIqKXM7CisgIHJldHVybiBuOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCisjaWZuZGVmIEhBVkVfU1RSVE9VTAorU09BUF9GTUFDMQordW5zaWduZWQgbG9uZworU09BUF9GTUFDMgorc29hcF9zdHJ0b3VsKGNvbnN0IGNoYXIgKnMsIGNoYXIgKip0LCBpbnQgYikKK3sgdW5zaWduZWQgbG9uZyBuID0gMDsKKyAgcmVnaXN0ZXIgaW50IGM7CisgIHdoaWxlICgqcyA+IDAgJiYgKnMgPD0gMzIpCisgICAgcysrOworICBpZiAoYiA9PSAxMCkKKyAgeyBpZiAoKnMgPT0gJysnKQorICAgICAgcysrOworICAgIHdoaWxlICgoYyA9ICpzKSAmJiBjID49ICcwJyAmJiBjIDw9ICc5JykKKyAgICB7IGlmIChuID49IDQyOTQ5NjcyOSAmJiAobiA+IDQyOTQ5NjcyOSB8fCBjID49ICc2JykpCisgICAgICAgIGJyZWFrOworICAgICAgbiAqPSAxMDsKKyAgICAgIG4gKz0gYyAtICcwJzsKKyAgICAgIHMrKzsKKyAgICB9CisgIH0KKyAgZWxzZSAvKiBiID09IDE2ICovCisgIHsgd2hpbGUgKChjID0gKnMpKQorICAgIHsgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQorICAgICAgICBjIC09ICcwJzsKKyAgICAgIGVsc2UgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKQorICAgICAgICBjIC09ICdBJyAtIDEwOworICAgICAgZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCisgICAgICAgIGMgLT0gJ2EnIC0gMTA7CisgICAgICBpZiAobiA+IDB4MEZGRkZGRkYpCisgICAgICAgIGJyZWFrOworICAgICAgbiA8PD0gNDsKKyAgICAgIG4gKz0gYzsKKyAgICAgIHMrKzsKKyAgICB9CisgIH0KKyAgaWYgKHQpCisgICAgKnQgPSAoY2hhciopczsKKyAgcmV0dXJuIG47Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9hcnJheV9iZWdpbl9vdXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICpvZmZzZXQpCit7IGlmIChzb2FwX2VsZW1lbnQoc29hcCwgdGFnLCBpZCwgIlNPQVAtRU5DOkFycmF5IikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICB7IGNvbnN0IGNoYXIgKnM7CisgICAgcyA9IHNvYXBfc3RycmNocih0eXBlLCAnWycpOworICAgIGlmICgoc2l6ZV90KShzIC0gdHlwZSkgPCBzaXplb2Yoc29hcC0+dG1wYnVmKSkKKyAgICB7IHN0cm5jcHkoc29hcC0+dG1wYnVmLCB0eXBlLCBzIC0gdHlwZSk7CisgICAgICBzb2FwLT50bXBidWZbcyAtIHR5cGVdID0gJ1wwJzsKKyAgICAgIGlmICh0eXBlICYmICp0eXBlICYmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAiU09BUC1FTkM6aXRlbVR5cGUiLCBzb2FwLT50bXBidWYpKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgaWYgKHMgJiYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJTT0FQLUVOQzphcnJheVNpemUiLCBzICsgMSkpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICB9CisgIGVsc2UKKyAgeyBpZiAob2Zmc2V0ICYmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAiU09BUC1FTkM6b2Zmc2V0Iiwgb2Zmc2V0KSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHR5cGUgJiYgKnR5cGUgJiYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJTT0FQLUVOQzphcnJheVR5cGUiLCB0eXBlKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICh0eXBlICYmICp0eXBlICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKSkKKyAgeyBjb25zdCBjaGFyICpzID0gc3RyY2hyKHR5cGUsICc6Jyk7CisgICAgaWYgKHMpCisgICAgICBzb2FwX3V0aWxpemVfbnMoc29hcCwgdHlwZSwgcyAtIHR5cGUpOworICB9CisjZW5kaWYKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHNvYXAsIE5VTEwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKnRwOworI2lmZGVmIFdJVEhfRE9NCisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgKiphdHQ7CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IGF0dCA9ICZzb2FwLT5kb20tPmF0dHM7CisgICAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICAgIHsgaWYgKHRwLT52aXNpYmxlKQorICAgICAgeyAqYXR0ID0gKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlKSk7CisJaWYgKCEqYXR0KQorCSAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisJKCphdHQpLT5uZXh0ID0gTlVMTDsKKyAgICAgICAgKCphdHQpLT5uc3RyID0gTlVMTDsKKyAgICAgICAgKCphdHQpLT5uYW1lID0gc29hcF9zdHJkdXAoc29hcCwgdHAtPm5hbWUpOworICAgICAgICAoKmF0dCktPmRhdGEgPSBzb2FwX3N0cmR1cChzb2FwLCB0cC0+dmFsdWUpOworICAgICAgICAoKmF0dCktPndpZGUgPSBOVUxMOworICAgICAgICAoKmF0dCktPnNvYXAgPSBzb2FwOworICAgICAgICB0cC0+dmlzaWJsZSA9IDA7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBTT0FQX09LOworICB9CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICB7IHN0cnVjdCBzb2FwX25saXN0ICpucDsKKyAgICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgICAgeyBpZiAodHAtPnZpc2libGUgJiYgdHAtPm5hbWUpCisgICAgICB7IGNvbnN0IGNoYXIgKnMgPSBzdHJjaHIodHAtPm5hbWUsICc6Jyk7CisgICAgICAgIGlmIChzKQorICAgICAgICAgIHNvYXBfdXRpbGl6ZV9ucyhzb2FwLCB0cC0+bmFtZSwgcyAtIHRwLT5uYW1lKTsKKyAgICAgIH0KKyAgICB9CisgICAgZm9yIChucCA9IHNvYXAtPm5saXN0OyBucDsgbnAgPSBucC0+bmV4dCkKKyAgICB7IGlmIChucC0+aW5kZXggPT0gMSAmJiBucC0+bnMpCisgICAgICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAieG1sbnM6JXMiLCBucC0+aWQpOworICAgICAgICBzb2FwX3NldF9hdHRyKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgbnAtPm5zKTsKKyAgICAgICAgbnAtPmluZGV4ID0gMjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyNlbmRpZgorICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgIHsgaWYgKHRwLT52aXNpYmxlKQorICAgIHsgaWYgKHNvYXBfc2VuZChzb2FwLCAiICIpIHx8IHNvYXBfc2VuZChzb2FwLCB0cC0+bmFtZSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIGlmICh0cC0+dmlzaWJsZSA9PSAyICYmIHRwLT52YWx1ZSkKKyAgICAgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgIj1cIiIsIDIpCisJIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCB0cC0+dmFsdWUsIDEpCisJIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIlwiIiwgMSkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgdHAtPnZpc2libGUgPSAwOworICAgIH0KKyAgfQorICBpZiAodGFnKQorICB7IAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsICI+IiwgMSkKKyAgICAgICB8fCBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHNvYXAtPmxldmVsLS07CS8qIGRlY3JlbWVudCBsZXZlbCBqdXN0IGJlZm9yZSAvPiAqLworICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsICIvPiIsIDIpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsICI+IiwgMSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9lbmRfb3V0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcpCit7IGlmICgqdGFnID09ICctJykKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbGVtZW50IGVuZGluZyB0YWc9JyVzJ1xuIiwgdGFnKSk7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgaWYgKHNvYXAtPmRvbS0+cHJudCkKKyAgICAgIHNvYXAtPmRvbSA9IHNvYXAtPmRvbS0+cHJudDsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgICBzb2FwX3BvcF9ucyhzb2FwKTsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9JTkRFTlQpCisgIHsgaWYgKCFzb2FwLT5ib2R5KQorICAgIHsgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgc29hcF9pbmRlbnQsIHNvYXAtPmxldmVsIDwgc2l6ZW9mKHNvYXBfaW5kZW50KSA/IHNvYXAtPmxldmVsIDogc2l6ZW9mKHNvYXBfaW5kZW50KSAtIDEpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIHNvYXAtPmJvZHkgPSAwOworICB9CisjZW5kaWYKKyAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgIjwvIiwgMikKKyAgIHx8IHNvYXBfc2VuZChzb2FwLCB0YWcpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgc29hcC0+bGV2ZWwtLTsJLyogZGVjcmVtZW50IGxldmVsIGp1c3QgYmVmb3JlID4gKi8KKyAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgIj4iLCAxKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X3JlZihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGludCBocmVmKQoreyByZWdpc3RlciBpbnQgbiA9IDA7CisgIGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgICAgbiA9IDE7CisgIHNwcmludGYoc29hcC0+aHJlZiwgIiNfJWQiLCBocmVmKTsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9ocmVmKHNvYXAsIHRhZywgaWQsICJocmVmIiArIG4sIHNvYXAtPmhyZWYgKyBuKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X2hyZWYoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICpyZWYsIGNvbnN0IGNoYXIgKnZhbCkKK3sgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbGVtZW50ICclcycgcmVmZXJlbmNlICVzPSclcydcbiIsIHRhZywgcmVmLCB2YWwpKTsKKyAgaWYgKHNvYXBfZWxlbWVudChzb2FwLCB0YWcsIGlkLCBOVUxMKQorICAgfHwgc29hcF9hdHRyaWJ1dGUoc29hcCwgcmVmLCB2YWwpCisgICB8fCBzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzb2FwLCB0YWcpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9udWxsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgY2hhciAqdHlwZSkKK3sgc3RydWN0IHNvYXBfYXR0cmlidXRlICp0cDsKKyAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICAgIGlmICh0cC0+dmlzaWJsZSkKKyAgICAgIGJyZWFrOworICBpZiAodHAgfHwgKHNvYXAtPnZlcnNpb24gPT0gMiAmJiBzb2FwLT5wb3NpdGlvbiA+IDApIHx8IGlkID4gMCB8fCAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX05JTCkpCisgIHsgaWYgKHNvYXBfZWxlbWVudChzb2FwLCB0YWcsIGlkLCB0eXBlKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAoc29hcC0+cGFydCAhPSBTT0FQX0lOX0hFQURFUiAmJiBzb2FwLT5lbmNvZGluZ1N0eWxlKQorICAgICAgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJ4c2k6bmlsIiwgInRydWUiKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIHJldHVybiBzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzb2FwLCB0YWcpOworICB9CisgIHNvYXAtPm51bGwgPSAxOworICBzb2FwLT5wb3NpdGlvbiA9IDA7CisgIHNvYXAtPm11c3RVbmRlcnN0YW5kID0gMDsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9pZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgbiwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpIAoreyBpZiAoIXAgfHwgKGEgJiYgIWEtPl9fcHRyKSkKKyAgeyBzb2FwX2VsZW1lbnRfbnVsbChzb2FwLCB0YWcsIGlkLCB0eXBlKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfVFJFRSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKGlkIDwgMCkKKyAgeyBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgICAgaWYgKGEpCisgICAgICBpZCA9IHNvYXBfYXJyYXlfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgYSwgbiwgdCwgJnBwKTsKKyAgICBlbHNlCisgICAgICBpZCA9IHNvYXBfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgdCwgJnBwKTsKKyAgICBpZiAoaWQpCisgICAgeyBpZiAoc29hcF9pc19lbWJlZGRlZChzb2FwLCBwcCkpCisgICAgICB7IHNvYXBfZWxlbWVudF9yZWYoc29hcCwgdGFnLCAwLCBpZCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGlmIChzb2FwX2lzX3NpbmdsZShzb2FwLCBwcCkpCisgICAgICAgIHJldHVybiAwOworICAgICAgc29hcF9zZXRfZW1iZWRkZWQoc29hcCwgcHApOworICAgIH0KKyAgfQorICByZXR1cm4gaWQ7CisjZWxzZQorICByZXR1cm4gMDsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfcmVzdWx0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcpCit7IGlmIChzb2FwLT52ZXJzaW9uID09IDIgJiYgc29hcC0+ZW5jb2RpbmdTdHlsZSkKKyAgICBpZiAoc29hcF9lbGVtZW50KHNvYXAsICJTT0FQLVJQQzpyZXN1bHQiLCAwLCBOVUxMKQorICAgICB8fCBzb2FwX2F0dHJpYnV0ZShzb2FwLCAieG1sbnM6U09BUC1SUEMiLCBzb2FwX3JwYykKKyAgICAgfHwgc29hcF9lbGVtZW50X3N0YXJ0X2VuZF9vdXQoc29hcCwgTlVMTCkKKyAgICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHRhZywgMCkKKyAgICAgfHwgc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgIlNPQVAtUlBDOnJlc3VsdCIpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9hdHRyaWJ1dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKQoreyAKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICphID0gKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlKSk7CisgICAgYS0+bmV4dCA9IHNvYXAtPmRvbS0+YXR0czsKKyAgICBhLT5uc3RyID0gTlVMTDsKKyAgICBhLT5uYW1lID0gc29hcF9zdHJkdXAoc29hcCwgbmFtZSk7CisgICAgYS0+ZGF0YSA9IHNvYXBfc3RyZHVwKHNvYXAsIHZhbHVlKTsKKyAgICBhLT53aWRlID0gTlVMTDsKKyAgICBhLT5zb2FwID0gc29hcDsKKyAgICBzb2FwLT5kb20tPmF0dHMgPSBhOworICAgIHJldHVybiBTT0FQX09LOworICB9CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICB7IC8qIFRPRE86IGNvbnNpZGVyIHVzaW5nIHRoaXMgY29kZSB0byBoYW5kbGUgZGVmYXVsdCBuYW1lc3BhY2UKKyAgICBpZiAoIXN0cm5jbXAobmFtZSwgInhtbG5zIiwgNSkgJiYgKG5hbWVbNV0gPT0gJzonIHx8IG5hbWVbNV0gPT0gJ1wwJykpCisgICAgeyBpZiAobmFtZVs1XSA9PSAnOicpCisgICAgICAgIHNvYXBfcHVzaF9ucyhzb2FwLCBuYW1lICsgNiwgdmFsdWUsIDApOworICAgICAgZWxzZQorICAgICAgICBzb2FwX3B1c2hfbnMoc29hcCwgIiIsIHZhbHVlLCAwKTsKKyAgICB9CisgICAgKi8KKyAgICBpZiAoIXN0cm5jbXAobmFtZSwgInhtbG5zOiIsIDYpKQorICAgICAgc29hcF9wdXNoX25zKHNvYXAsIG5hbWUgKyA2LCB2YWx1ZSwgMCk7CisgICAgZWxzZSBpZiAoc29hcF9zZXRfYXR0cihzb2FwLCBuYW1lLCB2YWx1ZSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgZWxzZQorI2VuZGlmCisgIHsgaWYgKHNvYXBfc2VuZChzb2FwLCAiICIpIHx8IHNvYXBfc2VuZChzb2FwLCBuYW1lKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAodmFsdWUpCisgICAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAiPVwiIiwgMikKKyAgICAgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgdmFsdWUsIDEpCisgICAgICAgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiXCIiLCAxKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfYmVnaW5faW4oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IG5pbGxhYmxlKQoreyBpZiAoIXNvYXBfcGVla19lbGVtZW50KHNvYXApKQorICB7IGlmIChzb2FwLT5vdGhlcikKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfVEFHX01JU01BVENIOworICAgIGlmICh0YWcgJiYgKnRhZyA9PSAnLScpCisgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICBpZiAoIShzb2FwLT5lcnJvciA9IHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnRhZywgdGFnKSkpCisgICAgeyBzb2FwLT5wZWVrZWQgPSAwOworICAgICAgaWYgKHNvYXAtPmJvZHkpCisgICAgICAgIHNvYXAtPmxldmVsKys7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkJlZ2luIGVsZW1lbnQgZm91bmQgKGxldmVsPSV1KSAnJXMnPSclcydcbiIsIHNvYXAtPmxldmVsLCBzb2FwLT50YWcsIHRhZz90YWc6IiIgKSk7CisgICAgICBpZiAoIW5pbGxhYmxlICYmIHNvYXAtPm51bGwgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX05VTEw7CisgICAgfQorICB9CisgIGVsc2UgaWYgKHNvYXAtPmVycm9yID09IFNPQVBfTk9fVEFHICYmIHRhZyAmJiAqdGFnID09ICctJykKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X2VuZF9pbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnKSAgCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgcmVnaXN0ZXIgY2hhciAqczsKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqdDsKKyAgcmVnaXN0ZXIgaW50IG4gPSAwOworICBpZiAodGFnICYmICp0YWcgPT0gJy0nKQorICAgIHJldHVybiBTT0FQX09LOworICBzb2FwLT5sZXZlbC0tOworICBzb2FwX3BvcF9uYW1lc3BhY2Uoc29hcCk7CisjaWZkZWYgV0lUSF9ET00KKyAgLyogdGhpcyB3aGl0ZXNwYWNlIG9yIG1peGVkIGNvbnRlbnQgaXMgbm90IGluc2lnbmlmaWNhbnQgZm9yIERPTSAqLworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBpZiAoIXNvYXAtPnBlZWtlZCAmJiAhc29hcF9zdHJpbmdfaW4oc29hcCwgMywgLTEsIC0xKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAoc29hcC0+ZG9tLT5wcm50KQorICAgICAgc29hcC0+ZG9tID0gc29hcC0+ZG9tLT5wcm50OworICB9CisjZW5kaWYKKyAgaWYgKHNvYXAtPnBlZWtlZCkKKyAgeyBpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcpCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgICAgaWYgKCpzb2FwLT50YWcpCisgICAgICBuKys7CisgICAgc29hcC0+cGVla2VkID0gMDsKKyAgfQorICBkbworICB7IHdoaWxlICgoKGMgPSBzb2FwX2dldChzb2FwKSkgIT0gU09BUF9UVCkpCisgICAgeyBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgICBpZiAoYyA9PSBTT0FQX0xUKQorICAgICAgICBuKys7CisgICAgICBlbHNlIGlmIChjID09ICcvJykKKyAgICAgIHsgYyA9IHNvYXBfZ2V0KHNvYXApOworICAgICAgICBpZiAoYyA9PSBTT0FQX0dUKQorCSAgbi0tOworICAgICAgICBlbHNlCisJICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgfQorICAgIH0KKyAgfSB3aGlsZSAobi0tKTsKKyAgcyA9IHNvYXAtPnRhZzsKKyAgd2hpbGUgKHNvYXBfbm90YmxhbmsoYyA9IHNvYXBfZ2V0KHNvYXApKSkKKyAgICAqcysrID0gKGNoYXIpYzsKKyAgKnMgPSAnXDAnOworICBpZiAoKGludCljID09IEVPRikKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgd2hpbGUgKHNvYXBfYmxhbmsoYykpCisgICAgYyA9IHNvYXBfZ2V0KHNvYXApOworICBpZiAoYyAhPSBTT0FQX0dUKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfU1lOVEFYX0VSUk9SOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBlbGVtZW50IGZvdW5kIChsZXZlbD0ldSkgJyVzJz0nJXMnXG4iLCBzb2FwLT5sZXZlbCwgc29hcC0+dGFnLCB0YWc/dGFnOiIiKSk7CisgIGlmICghdGFnIHx8ICEqdGFnKQorICAgIHJldHVybiBTT0FQX09LOworICBpZiAoKHMgPSBzdHJjaHIoc29hcC0+dGFnLCAnOicpKSkKKyAgICBzKys7CisgIGVsc2UKKyAgICBzID0gc29hcC0+dGFnOworICBpZiAoKHQgPSBzdHJjaHIodGFnLCAnOicpKSkKKyAgICB0Kys7CisgIGVsc2UKKyAgICB0ID0gdGFnOworICBpZiAoIVNPQVBfU1RSQ01QKHMsIHQpKQorICAgIHJldHVybiBTT0FQX09LOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBlbGVtZW50IHRhZyBuYW1lIGRvZXMgbm90IG1hdGNoXG4iKSk7CisgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfU1lOVEFYX0VSUk9SOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX2F0dHJfdmFsdWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBmbGFnKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKnRwOworICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgICAgaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgbmFtZSkpCisgICAgICBicmVhazsKKyAgaWYgKHRwICYmIHRwLT52aXNpYmxlID09IDIpCisgIHsgaWYgKGZsYWcgPT0gMiAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfUFJPSElCSVRFRDsKKyAgICBlbHNlCisgICAgICByZXR1cm4gdHAtPnZhbHVlOworICB9CisgIGVsc2UgaWYgKGZsYWcgPT0gMSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpCisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1JFUVVJUkVEOworICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZXRfYXR0cihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqdHA7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2V0IGF0dHJpYnV0ZSAlcz0nJXMnXG4iLCBuYW1lLCB2YWx1ZT92YWx1ZToiIikpOworICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgIHsgaWYgKCFzdHJjbXAodHAtPm5hbWUsIG5hbWUpKQorICAgICAgYnJlYWs7CisgIH0KKyAgaWYgKCF0cCkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFsbG9jYXRlIGF0dHJpYnV0ZSAlc1xuIiwgbmFtZSkpOworICAgIGlmICghKHRwID0gKHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSkgKyBzdHJsZW4obmFtZSkpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHRwLT5ucyA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICAgIHsgc3RydWN0IHNvYXBfYXR0cmlidXRlICoqdHBwID0gJnNvYXAtPmF0dHJpYnV0ZXM7CisgICAgICBjb25zdCBjaGFyICpzID0gc3RyY2hyKG5hbWUsICc6Jyk7CisgICAgICBpZiAoIXN0cm5jbXAobmFtZSwgInhtbG5zIiwgNSkpCisgICAgICB7IGZvciAoOyAqdHBwOyB0cHAgPSAmKCp0cHApLT5uZXh0KQorICAgICAgICAgIGlmIChzdHJuY21wKCgqdHBwKS0+bmFtZSwgInhtbG5zIiwgNSkgfHwgc3RyY21wKCgqdHBwKS0+bmFtZSArIDUsIG5hbWUgKyA1KSA+IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzKQorICAgICAgeyBmb3IgKDsgKnRwcDsgdHBwID0gJigqdHBwKS0+bmV4dCkKKyAgICAgICAgICBpZiAoc3RybmNtcCgoKnRwcCktPm5hbWUsICJ4bWxucyIsIDUpICYmICgoKnRwcCktPm5zIHx8IHN0cmNtcCgoKnRwcCktPm5hbWUsIG5hbWUpID4gMCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgaW50IGs7CisgICAgICAgIGZvciAoOyAqdHBwOyB0cHAgPSAmKCp0cHApLT5uZXh0KQorCXsgaWYgKCFzdHJuY21wKCgqdHBwKS0+bmFtZSwgInhtbG5zOiIsIDYpICYmICFzdHJuY21wKCgqdHBwKS0+bmFtZSArIDYsIG5hbWUsIHMgLSBuYW1lKSAmJiAhKCp0cHApLT5uYW1lWzYgKyBzIC0gbmFtZV0pCisJICB7IGlmICghdHAtPm5zKQorICAgICAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNhbm9uaWNhbGl6YXRpb246IHByZWZpeCAlcz0lcCglcylcbiIsIG5hbWUsICgqdHBwKS0+bnMsICgqdHBwKS0+bnMpKTsKKwkgICAgICB0cC0+bnMgPSAoKnRwcCktPm5zOworCSAgICB9CisJICB9CisgICAgICAgICAgZWxzZSBpZiAoc3RybmNtcCgoKnRwcCktPm5hbWUsICJ4bWxucyIsIDUpICYmICgqdHBwKS0+bnMgJiYgdHAtPm5zICYmICgoayA9IHN0cmNtcCgoKnRwcCktPm5zLCB0cC0+bnMpKSA+IDAgfHwgKCFrICYmIHN0cmNtcCgoKnRwcCktPm5hbWUsIG5hbWUpID4gMCkpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHRwLT5uZXh0ID0gKnRwcDsKKyAgICAgICp0cHAgPSB0cDsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeyB0cC0+bmV4dCA9IHNvYXAtPmF0dHJpYnV0ZXM7CisgICAgICBzb2FwLT5hdHRyaWJ1dGVzID0gdHA7CisgICAgfQorICAgIHN0cmNweSh0cC0+bmFtZSwgbmFtZSk7CisgICAgdHAtPnZhbHVlID0gTlVMTDsKKyAgfQorICBlbHNlIGlmICh0cC0+dmlzaWJsZSkKKyAgeyByZXR1cm4gU09BUF9PSzsKKyAgfQorICBlbHNlIGlmICh2YWx1ZSAmJiB0cC0+dmFsdWUgJiYgdHAtPnNpemUgPD0gc3RybGVuKHZhbHVlKSkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWUgYXR0cmlidXRlIHZhbHVlIG9mICVzIChmcmVlICVwKVxuIiwgbmFtZSwgdHAtPnZhbHVlKSk7CisgICAgU09BUF9GUkVFKHNvYXAsIHRwLT52YWx1ZSk7CisgICAgdHAtPnZhbHVlID0gTlVMTDsKKyAgICB0cC0+bnMgPSBOVUxMOworICB9CisgIGlmICh2YWx1ZSkKKyAgeyBpZiAoIXRwLT52YWx1ZSkKKyAgICB7IHRwLT5zaXplID0gc3RybGVuKHZhbHVlKSArIDE7CisgICAgICBpZiAoISh0cC0+dmFsdWUgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgdHAtPnNpemUpKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFsbG9jYXRlIGF0dHJpYnV0ZSB2YWx1ZSBvZiAlcyAoJXApXG4iLCB0cC0+bmFtZSwgdHAtPnZhbHVlKSk7CisgICAgfQorICAgIHN0cmNweSh0cC0+dmFsdWUsIHZhbHVlKTsKKyAgICBpZiAoIXN0cm5jbXAodHAtPm5hbWUsICJ4bWxuczoiLCA2KSkKKyAgICAgIHRwLT5ucyA9IHRwLT52YWx1ZTsKKyAgICB0cC0+dmlzaWJsZSA9IDI7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmICghc3RyY21wKG5hbWUsICJ3c3U6SWQiKSkKKyAgICB7IHNvYXAtPnBhcnQgPSBTT0FQX0JFR0lOX1NFQ1VSSVRZOworICAgICAgc3RybmNweShzb2FwLT5pZCwgdmFsdWUsIHNpemVvZihzb2FwLT5pZCkpOworICAgICAgc29hcC0+aWRbc2l6ZW9mKHNvYXAtPmlkKS0xXSA9ICdcMCc7CisgICAgfQorI2VuZGlmCisgIH0KKyAgZWxzZQorICAgIHRwLT52aXNpYmxlID0gMTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2Nscl9hdHRyKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKnRwOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKSkKKyAgeyB3aGlsZSAoc29hcC0+YXR0cmlidXRlcykKKyAgICB7IHRwID0gc29hcC0+YXR0cmlidXRlcy0+bmV4dDsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5hdHRyaWJ1dGVzLT52YWx1ZSk7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+YXR0cmlidXRlcyk7CisgICAgICBzb2FwLT5hdHRyaWJ1dGVzID0gdHA7CisgICAgfQorICB9CisgIGVsc2UKKyNlbmRpZgorICB7IGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgICAgIHRwLT52aXNpYmxlID0gMDsKKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorc3RhdGljIGludAorc29hcF9nZXRhdHRydmFsKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpzLCBzaXplX3Qgbiwgc29hcF93Y2hhciBkKQoreyByZWdpc3RlciBzaXplX3QgaTsKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgeyByZWdpc3RlciBzb2FwX3djaGFyIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgICBzd2l0Y2ggKGMpCisgICAgeworICAgIGNhc2UgU09BUF9UVDoKKyAgICAgICpzKysgPSAnPCc7CisgICAgICBzb2FwX3VuZ2V0KHNvYXAsICcvJyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTFQ6CisgICAgICAqcysrID0gJzwnOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0dUOgorICAgICAgaWYgKGQgPT0gJyAnKQorICAgICAgeyBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICAqcyA9ICdcMCc7CisgICAgICAgIHJldHVybiBTT0FQX09LOworICAgICAgfQorICAgICAgKnMrKyA9ICc+JzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9RVDoKKyAgICAgIGlmIChjID09IGQpCisgICAgICB7ICpzID0gJ1wwJzsKKyAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgICB9CisgICAgICAqcysrID0gJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0FQOgorICAgICAgaWYgKGMgPT0gZCkKKyAgICAgIHsgKnMgPSAnXDAnOworICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICAgIH0KKyAgICAgICpzKysgPSAnXCcnOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnXHQnOgorICAgIGNhc2UgJ1xuJzoKKyAgICBjYXNlICdccic6CisgICAgY2FzZSAnICc6CisgICAgY2FzZSAnLyc6CisgICAgICBpZiAoZCA9PSAnICcpCisgICAgICB7IHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgICpzID0gJ1wwJzsKKyAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAgICpzKysgPSAoY2hhciljOworICAgIH0KKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFdJVEhfRkFTVAorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zdG9yZV9sYWIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBuKQoreyBzb2FwLT5sYWJpZHggPSAwOworICByZXR1cm4gc29hcF9hcHBlbmRfbGFiKHNvYXAsIHMsIG4pOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBXSVRIX0ZBU1QKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYXBwZW5kX2xhYihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgc2l6ZV90IG4pCit7IGlmIChzb2FwLT5sYWJpZHggKyBuID49IHNvYXAtPmxhYmxlbikKKyAgeyByZWdpc3RlciBjaGFyICp0ID0gc29hcC0+bGFiYnVmOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5sYXJnaW5nIGxvb2stYXNpZGUgYnVmZmVyIHRvIGFwcGVuZCBkYXRhLCBvbGQgc2l6ZT0lbHUiLCAodW5zaWduZWQgbG9uZylzb2FwLT5sYWJsZW4pKTsKKyAgICBpZiAoc29hcC0+bGFibGVuID09IDApCisgICAgICBzb2FwLT5sYWJsZW4gPSBTT0FQX0xBQkxFTjsKKyAgICB3aGlsZSAoc29hcC0+bGFiaWR4ICsgbiA+PSBzb2FwLT5sYWJsZW4pCisgICAgICBzb2FwLT5sYWJsZW4gPDw9IDE7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIsIG5ldyBzaXplPSVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpc29hcC0+bGFibGVuKSk7CisgICAgc29hcC0+bGFiYnVmID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHNvYXAtPmxhYmxlbik7CisgICAgaWYgKCFzb2FwLT5sYWJidWYpCisgICAgeyBpZiAodCkKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHQpOworICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgfQorICAgIGlmICh0KQorICAgIHsgbWVtY3B5KHNvYXAtPmxhYmJ1ZiwgdCwgc29hcC0+bGFiaWR4KTsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCB0KTsKKyAgICB9CisgIH0KKyAgaWYgKHMpCisgIHsgbWVtY3B5KHNvYXAtPmxhYmJ1ZiArIHNvYXAtPmxhYmlkeCwgcywgbik7CisgICAgc29hcC0+bGFiaWR4ICs9IG47CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wZWVrX2VsZW1lbnQoc3RydWN0IHNvYXAgKnNvYXApCit7CisjaWZkZWYgV0lUSF9ET00KKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAqKmF0dCA9IE5VTEw7CisgIHJlZ2lzdGVyIGNoYXIgKmxlYWQgPSBOVUxMOworI2VuZGlmCisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqdHA7CisgIGNvbnN0IGNoYXIgKnQ7CisgIHJlZ2lzdGVyIGNoYXIgKnM7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIGlmIChzb2FwLT5wZWVrZWQpCisgIHsgaWYgKCEqc29hcC0+dGFnKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9OT19UQUc7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgc29hcC0+cGVla2VkID0gMTsKKyAgYyA9IHNvYXBfZ2V0dXRmOChzb2FwKTsKKyNpZmRlZiBXSVRIX0RPTQorICAvKiB3aGl0ZXNwYWNlIGxlYWRpbmcgdG8gc3RhcnQgdGFnIGlzIG5vdCBpbnNpZ25pZmljYW50IGZvciBET00gKi8KKyAgaWYgKHNvYXBfYmxhbmsoYykpCisgIHsgc29hcC0+bGFiaWR4ID0gMDsKKyAgICBkbworICAgIHsgaWYgKHNvYXBfYXBwZW5kX2xhYihzb2FwLCBOVUxMLCAwKSkKKyAgICAgICAgcmV0dXJuIFNPQVBfRU9NOworICAgICAgcyA9IHNvYXAtPmxhYmJ1ZiArIHNvYXAtPmxhYmlkeDsKKyAgICAgIGkgPSBzb2FwLT5sYWJsZW4gLSBzb2FwLT5sYWJpZHg7CisgICAgICBzb2FwLT5sYWJpZHggPSBzb2FwLT5sYWJsZW47CisgICAgICB3aGlsZSAoc29hcF9ibGFuayhjKSAmJiBpLS0pCisgICAgICB7ICpzKysgPSBjOworICAgICAgICBjID0gc29hcF9nZXR1dGY4KHNvYXApOworICAgICAgfQorICAgIH0KKyAgICB3aGlsZSAoc29hcF9ibGFuayhjKSk7CisgICAgKnMgPSAnXDAnOworICAgIGxlYWQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT5sYWJidWYpOworICB9CisjZWxzZQorICB3aGlsZSAoc29hcF9ibGFuayhjKSkKKyAgICBjID0gc29hcF9nZXR1dGY4KHNvYXApOworI2VuZGlmCisgIGlmIChjICE9IFNPQVBfTFQpCisgIHsgKnNvYXAtPnRhZyA9ICdcMCc7CisgICAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworI2lmZGVmIFdJVEhfRE9NCisgICAgLyogd2hpdGVzcGFjZSBsZWFkaW5nIHRvIGVuZCB0YWcgaXMgbm90IGluc2lnbmlmaWNhbnQgZm9yIERPTSAqLworICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICAgICAgc29hcC0+ZG9tLT50YWlsID0gc29hcF9zdHJkdXAoc29hcCwgbGVhZCk7CisjZW5kaWYKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX05PX1RBRzsKKyAgfQorICBzID0gc29hcC0+dGFnOworICBkbyBjID0gc29hcF9nZXQxKHNvYXApOworICB3aGlsZSAoc29hcF9ibGFuayhjKSk7CisgIGkgPSBzaXplb2Yoc29hcC0+dGFnKTsKKyAgd2hpbGUgKGMgIT0gJz4nICYmIGMgIT0gJy8nICYmIHNvYXBfbm90YmxhbmsoYykpCisgIHsgaWYgKC0taSA+IDApCisgICAgICAqcysrID0gKGNoYXIpYzsKKyAgICBjID0gc29hcF9nZXQxKHNvYXApOworICB9CisgIHdoaWxlIChzb2FwX2JsYW5rKGMpKQorICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICpzID0gJ1wwJzsKKyAgc29hcC0+aWRbMF0gPSAnXDAnOworICBzb2FwLT5ocmVmWzBdID0gJ1wwJzsKKyAgc29hcC0+dHlwZVswXSA9ICdcMCc7CisgIHNvYXAtPmFycmF5VHlwZVswXSA9ICdcMCc7CisgIHNvYXAtPmFycmF5U2l6ZVswXSA9ICdcMCc7CisgIHNvYXAtPmFycmF5T2Zmc2V0WzBdID0gJ1wwJzsKKyAgc29hcC0+b3RoZXIgPSAwOworICBzb2FwLT5yb290ID0gLTE7CisgIHNvYXAtPnBvc2l0aW9uID0gMDsKKyAgc29hcC0+bnVsbCA9IDA7CisgIHNvYXAtPm11c3RVbmRlcnN0YW5kID0gMDsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqZWx0OworICAgIGVsdCA9IChzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50KSk7CisgICAgaWYgKCFlbHQpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICBlbHQtPm5leHQgPSBOVUxMOworICAgIGVsdC0+bnN0ciA9IE5VTEw7CisgICAgZWx0LT5uYW1lID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+dGFnKTsKKyAgICBlbHQtPnBybnQgPSBzb2FwLT5kb207CisgICAgZWx0LT5lbHRzID0gTlVMTDsKKyAgICBlbHQtPmF0dHMgPSBOVUxMOworICAgIGVsdC0+ZGF0YSA9IE5VTEw7CisgICAgZWx0LT53aWRlID0gTlVMTDsKKyAgICBlbHQtPnR5cGUgPSAwOworICAgIGVsdC0+bm9kZSA9IE5VTEw7CisgICAgZWx0LT5oZWFkID0gbGVhZDsKKyAgICBlbHQtPnRhaWwgPSBOVUxMOworICAgIGVsdC0+c29hcCA9IHNvYXA7CisgICAgaWYgKHNvYXAtPmRvbSkKKyAgICB7IHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICpwID0gc29hcC0+ZG9tLT5lbHRzOworICAgICAgaWYgKHApCisgICAgICB7IHdoaWxlIChwLT5uZXh0KQorICAgICAgICAgIHAgPSBwLT5uZXh0OworICAgICAgICBwLT5uZXh0ID0gZWx0OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBzb2FwLT5kb20tPmVsdHMgPSBlbHQ7CisgICAgfQorICAgIHNvYXAtPmRvbSA9IGVsdDsKKyAgICBhdHQgPSAmZWx0LT5hdHRzOworICB9CisjZW5kaWYKKyAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICAgIHRwLT52aXNpYmxlID0gMDsKKyAgd2hpbGUgKChpbnQpYyAhPSBFT0YgJiYgYyAhPSAnPicgJiYgYyAhPSAnLycpCisgIHsgcyA9IHNvYXAtPnRtcGJ1ZjsKKyAgICBpID0gc2l6ZW9mKHNvYXAtPnRtcGJ1Zik7CisgICAgd2hpbGUgKGMgIT0gJz0nICYmIGMgIT0gJz4nICYmIGMgIT0gJy8nICYmIHNvYXBfbm90YmxhbmsoYykpCisgICAgeyBpZiAoLS1pID4gMCkKKyAgICAgICAgKnMrKyA9IChjaGFyKWM7CisgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworICAgIH0KKyAgICAqcyA9ICdcMCc7CisgICAgaWYgKGkgPT0gc2l6ZW9mKHNvYXAtPnRtcGJ1ZikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1NZTlRBWF9FUlJPUjsKKyNpZmRlZiBXSVRIX0RPTQorICAgIC8qIGFkZCBhdHRyaWJ1dGUgbmFtZSB0byBkb20gKi8KKyAgICBpZiAoYXR0KQorICAgIHsgKmF0dCA9IChzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSkpOworICAgICAgIGlmICghKmF0dCkKKyAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgICgqYXR0KS0+bmV4dCA9IE5VTEw7CisgICAgICAgKCphdHQpLT5uc3RyID0gTlVMTDsKKyAgICAgICAoKmF0dCktPm5hbWUgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT50bXBidWYpOworICAgICAgICgqYXR0KS0+ZGF0YSA9IE5VTEw7CisgICAgICAgKCphdHQpLT53aWRlID0gTlVMTDsKKyAgICAgICAoKmF0dCktPnNvYXAgPSBzb2FwOworICAgIH0KKyNlbmRpZgorICAgIGlmICghc3RybmNtcChzb2FwLT50bXBidWYsICJ4bWxucyIsIDUpKQorICAgIHsgaWYgKHNvYXAtPnRtcGJ1Zls1XSA9PSAnOicpCisgICAgICB7IHNvYXAtPnRtcGJ1Zls1XSA9ICdcMCc7CisgICAgICAgIHQgPSBzb2FwLT50bXBidWYgKyA2OworICAgICAgfQorICAgICAgZWxzZSBpZiAoc29hcC0+dG1wYnVmWzVdKQorICAgICAgICB0ID0gTlVMTDsKKyAgICAgIGVsc2UKKyAgICAgICAgdCA9IFNPQVBfU1RSX0VPUzsKKyAgICB9CisgICAgZWxzZQorICAgICAgdCA9IE5VTEw7CisgICAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICAgIHsgaWYgKCFTT0FQX1NUUkNNUCh0cC0+bmFtZSwgc29hcC0+dG1wYnVmKSkKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghdHApCisgICAgeyB0cCA9IChzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUpICsgc3RybGVuKHNvYXAtPnRtcGJ1ZikpOworICAgICAgaWYgKCF0cCkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICBzdHJjcHkodHAtPm5hbWUsIHNvYXAtPnRtcGJ1Zik7CisgICAgICB0cC0+dmFsdWUgPSBOVUxMOworICAgICAgdHAtPnNpemUgPSAwOworICAgICAgdHAtPm5leHQgPSBzb2FwLT5hdHRyaWJ1dGVzOworICAgICAgc29hcC0+YXR0cmlidXRlcyA9IHRwOworICAgIH0KKyAgICB3aGlsZSAoc29hcF9ibGFuayhjKSkKKyAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgaWYgKGMgPT0gJz0nKQorICAgIHsgZG8gYyA9IHNvYXBfZ2V0dXRmOChzb2FwKTsKKyAgICAgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyAgICAgIGlmIChjICE9IFNPQVBfUVQgJiYgYyAhPSBTT0FQX0FQKQorICAgICAgeyBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICBjID0gJyAnOyAvKiBibGFuayBkZWxpbWl0ZXIgKi8KKyAgICAgIH0KKyAgICAgIGlmIChzb2FwX2dldGF0dHJ2YWwoc29hcCwgdHAtPnZhbHVlLCB0cC0+c2l6ZSwgYykpCisgICAgICB7CisjaWZkZWYgV0lUSF9GQVNUCisgICAgICAgIGlmIChzb2FwLT5lcnJvciAhPSBTT0FQX0VPTSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKwlpZiAoc29hcF9zdG9yZV9sYWIoc29hcCwgdHAtPnZhbHVlLCB0cC0+c2l6ZSkpCisJICByZXR1cm4gc29hcC0+ZXJyb3I7CisJaWYgKHRwLT52YWx1ZSkKKwkgIFNPQVBfRlJFRShzb2FwLCB0cC0+dmFsdWUpOworCWZvciAoOzspCisJeyBpZiAoc29hcF9nZXRhdHRydmFsKHNvYXAsIHNvYXAtPmxhYmJ1ZiArIHNvYXAtPmxhYmlkeCwgc29hcC0+bGFibGVuIC0gc29hcC0+bGFiaWR4LCBjKSkKKwkgIHsgaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfRU9NKQorCSAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKwkgICAgc29hcC0+bGFiaWR4ID0gc29hcC0+bGFibGVuOworCSAgICBpZiAoc29hcF9hcHBlbmRfbGFiKHNvYXAsIE5VTEwsIDApKQorCSAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKwkgIH0KKwkgIGVsc2UKKwkgICAgYnJlYWs7CisJfQorCWlmIChzb2FwLT5sYWJpZHgpCisgICAgICAgICAgdHAtPnNpemUgPSBzb2FwLT5sYWJsZW47CisJZWxzZQorCXsgdHAtPnNpemUgPSBzdHJsZW4oc29hcC0+bGFiYnVmKSArIDE7CisgICAgICAgICAgaWYgKHRwLT5zaXplIDwgU09BUF9MQUJMRU4pCisJICAgIHRwLT5zaXplID0gU09BUF9MQUJMRU47CisgICAgICAgIH0KKwlpZiAoISh0cC0+dmFsdWUgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgdHAtPnNpemUpKSkKKwkgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgICBzdHJjcHkodHAtPnZhbHVlLCBzb2FwLT5sYWJidWYpOworI2Vsc2UKKwlzaXplX3QgbjsKKyAgICAgICAgaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfRU9NKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICAgICAgICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBmb3IgKDs7KQorICAgICAgICB7IGlmICghKHMgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIFNPQVBfQkxLTEVOKSkpCisgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgICAgaWYgKHNvYXBfZ2V0YXR0cnZhbChzb2FwLCBzLCBTT0FQX0JMS0xFTiwgYykpCisgICAgICAgICAgeyBpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9FT00pCisgICAgICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwluID0gdHAtPnNpemUgKyBzb2FwLT5ibGlzdC0+c2l6ZTsKKyAgICAgICAgaWYgKCEocyA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBuKSkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICAgIGlmICh0cC0+dmFsdWUpCisgICAgICAgIHsgbWVtY3B5KHMsIHRwLT52YWx1ZSwgdHAtPnNpemUpOworICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCB0cC0+dmFsdWUpOworICAgICAgICB9CisgICAgICAgIHNvYXBfc2F2ZV9ibG9jayhzb2FwLCBzICsgdHAtPnNpemUsIDApOworICAgICAgICB0cC0+dmFsdWUgPSBzOworICAgICAgICB0cC0+c2l6ZSA9IG47CisjZW5kaWYKKyAgICAgIH0KKyAgICAgIGRvIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICB3aGlsZSAoc29hcF9ibGFuayhjKSk7CisgICAgICB0cC0+dmlzaWJsZSA9IDI7IC8qIHNlZW4gdGhpcyBhdHRyaWJ1dGUgdy8gdmFsdWUgKi8KKyNpZmRlZiBXSVRIX0RPTQorICAgICAgaWYgKGF0dCkKKyAgICAgICAgKCphdHQpLT5kYXRhID0gc29hcF9zdHJkdXAoc29hcCwgdHAtPnZhbHVlKTsKKyNlbmRpZgorICAgIH0KKyAgICBlbHNlCisgICAgICB0cC0+dmlzaWJsZSA9IDE7IC8qIHNlZW4gdGhpcyBhdHRyaWJ1dGUgdy9vIHZhbHVlICovCisjaWZkZWYgV0lUSF9ET00KKyAgICBpZiAoYXR0KQorICAgICAgYXR0ID0gJigqYXR0KS0+bmV4dDsKKyNlbmRpZgorICAgIGlmICh0ICYmIHRwLT52YWx1ZSkKKyAgICB7IGlmIChzb2FwX3B1c2hfbmFtZXNwYWNlKHNvYXAsIHQsIHRwLT52YWx1ZSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHRwLT52aXNpYmxlID0gMDsKKyAgICB9CisgIH0KKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoYXR0KQorICB7IHNvYXAtPmRvbS0+bnN0ciA9IHNvYXBfY3VycmVudF9uYW1lc3BhY2Uoc29hcCwgc29hcC0+dGFnKTsKKyAgICBmb3IgKGF0dCA9ICZzb2FwLT5kb20tPmF0dHM7ICphdHQ7IGF0dCA9ICYoKmF0dCktPm5leHQpCisgICAgICAoKmF0dCktPm5zdHIgPSBzb2FwX2N1cnJlbnRfbmFtZXNwYWNlKHNvYXAsICgqYXR0KS0+bmFtZSk7CisgIH0KKyNlbmRpZgorICBpZiAoKGludCljID09IEVPRikKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgaWYgKCEoc29hcC0+Ym9keSA9IChjICE9ICcvJykpKQorICAgIGRvIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworI2lmZGVmIFdJVEhfRE9NCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKQorICB7IGlmICghc29hcC0+Ym9keSAmJiBzb2FwLT5kb20tPnBybnQpCisgICAgICBzb2FwLT5kb20gPSBzb2FwLT5kb20tPnBybnQ7CisgIH0KKyNlbmRpZgorICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgIHsgaWYgKHRwLT52aXNpYmxlICYmIHRwLT52YWx1ZSkKKyAgICB7IGlmICghc3RyY21wKHRwLT5uYW1lLCAiaWQiKSkKKyAgICAgIHsgKnNvYXAtPmlkID0gJyMnOworICAgICAgICBzdHJuY3B5KHNvYXAtPmlkICsgMSwgdHAtPnZhbHVlLCBzaXplb2Yoc29hcC0+aWQpIC0gMik7CisgICAgICAgIHNvYXAtPmlkW3NpemVvZihzb2FwLT5pZCktMV0gPSAnXDAnOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIXN0cmNtcCh0cC0+bmFtZSwgImhyZWYiKSkKKyAgICAgIHsgc3RybmNweShzb2FwLT5ocmVmLCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT5ocmVmKSAtIDEpOworICAgICAgICBzb2FwLT5ocmVmW3NpemVvZihzb2FwLT5ocmVmKS0xXSA9ICdcMCc7CisgICAgICB9CisgICAgICBlbHNlIGlmICgoc29hcC0+dmVyc2lvbiA9PSAyIHx8IChzb2FwLT5tb2RlICYgU09BUF9YTUxfR1JBUEgpKSAmJiAhc3RyY21wKHRwLT5uYW1lLCAicmVmIikpCisgICAgICB7ICpzb2FwLT5ocmVmID0gJyMnOworICAgICAgICBzdHJuY3B5KHNvYXAtPmhyZWYgKyAxLCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT5ocmVmKSAtIDIpOworICAgICAgICBzb2FwLT5ocmVmW3NpemVvZihzb2FwLT5ocmVmKS0xXSA9ICdcMCc7CisgICAgICB9CisgICAgICBlbHNlIGlmICghc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJ4c2k6dHlwZSIpKQorICAgICAgeyBzdHJuY3B5KHNvYXAtPnR5cGUsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPnR5cGUpIC0gMSk7CisgICAgICAgIHNvYXAtPnR5cGVbc2l6ZW9mKHNvYXAtPnR5cGUpLTFdID0gJ1wwJzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHNvYXAtPnZlcnNpb24gPT0gMSAmJiAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOQzphcnJheVR5cGUiKSkKKyAgICAgIHsgcyA9IHNvYXBfc3RycmNocih0cC0+dmFsdWUsICdbJyk7CisgICAgICAgIGlmIChzICYmIChzaXplX3QpKHMgLSB0cC0+dmFsdWUpIDwgc2l6ZW9mKHNvYXAtPmFycmF5VHlwZSkpCisgICAgICAgIHsgc3RybmNweShzb2FwLT5hcnJheVR5cGUsIHRwLT52YWx1ZSwgcyAtIHRwLT52YWx1ZSk7CisgICAgICAgICAgc29hcC0+YXJyYXlUeXBlW3MgLSB0cC0+dmFsdWVdID0gJ1wwJzsKKyAgICAgICAgICBzdHJuY3B5KHNvYXAtPmFycmF5U2l6ZSwgcywgc2l6ZW9mKHNvYXAtPmFycmF5U2l6ZSkgLSAxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgc3RybmNweShzb2FwLT5hcnJheVR5cGUsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPmFycmF5VHlwZSkgLSAxKTsKKyAgICAgICAgc29hcC0+YXJyYXlTaXplW3NpemVvZihzb2FwLT5hcnJheVR5cGUpLTFdID0gJ1wwJzsKKyAgICAgICAgc29hcC0+YXJyYXlUeXBlW3NpemVvZihzb2FwLT5hcnJheVR5cGUpLTFdID0gJ1wwJzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHNvYXAtPnZlcnNpb24gPT0gMiAmJiAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOQzppdGVtVHlwZSIpKQorICAgICAgICBzdHJuY3B5KHNvYXAtPmFycmF5VHlwZSwgdHAtPnZhbHVlLCBzaXplb2Yoc29hcC0+YXJyYXlUeXBlKSAtIDEpOworICAgICAgZWxzZSBpZiAoc29hcC0+dmVyc2lvbiA9PSAyICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5DOmFycmF5U2l6ZSIpKQorICAgICAgICBzdHJuY3B5KHNvYXAtPmFycmF5U2l6ZSwgdHAtPnZhbHVlLCBzaXplb2Yoc29hcC0+YXJyYXlTaXplKSAtIDEpOworICAgICAgZWxzZSBpZiAoc29hcC0+dmVyc2lvbiA9PSAxICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5DOm9mZnNldCIpKQorICAgICAgICBzdHJuY3B5KHNvYXAtPmFycmF5T2Zmc2V0LCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT5hcnJheU9mZnNldCkpOworICAgICAgZWxzZSBpZiAoc29hcC0+dmVyc2lvbiA9PSAxICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5DOnBvc2l0aW9uIikpCisgICAgICAgIHNvYXAtPnBvc2l0aW9uID0gc29hcF9nZXRwb3NpdGlvbih0cC0+dmFsdWUsIHNvYXAtPnBvc2l0aW9ucyk7CisgICAgICBlbHNlIGlmIChzb2FwLT52ZXJzaW9uID09IDEgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTkM6cm9vdCIpKQorICAgICAgICBzb2FwLT5yb290ID0gKCghc3RyY21wKHRwLT52YWx1ZSwgIjEiKSB8fCAhc3RyY21wKHRwLT52YWx1ZSwgInRydWUiKSkpOworICAgICAgZWxzZSBpZiAoKHNvYXAtPnZlcnNpb24gPT0gMSAmJiAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOVjphY3RvciIpKQorICAgICAgICAgICAgfHwgKHNvYXAtPnZlcnNpb24gPT0gMiAmJiAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOVjpyb2xlIikpKQorICAgICAgeyBpZiAoKCFzb2FwLT5hY3RvciB8fCBzdHJjbXAoc29hcC0+YWN0b3IsIHRwLT52YWx1ZSkpCisgICAgICAgICAmJiBzdHJjbXAodHAtPnZhbHVlLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9hY3Rvci9uZXh0IikKKyAgICAgICAgICYmIHN0cmNtcCh0cC0+dmFsdWUsICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUvcm9sZS9uZXh0IikpCisgICAgICAgICAgc29hcC0+b3RoZXIgPSAxOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTlY6bXVzdFVuZGVyc3RhbmQiKQorICAgICAgICAgICAgJiYgKCFzdHJjbXAodHAtPnZhbHVlLCAiMSIpIHx8ICFzdHJjbXAodHAtPnZhbHVlLCAidHJ1ZSIpKSkKKyAgICAgICAgc29hcC0+bXVzdFVuZGVyc3RhbmQgPSAxOworICAgICAgZWxzZSBpZiAoKCFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgInhzaTpudWxsIikKKyAgICAgICAgICAgICB8fCAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJ4c2k6bmlsIikpCisgICAgICAgICAgICAmJiAoIXN0cmNtcCh0cC0+dmFsdWUsICIxIikKKyAgICAgICAgICAgICB8fCAhc3RyY21wKHRwLT52YWx1ZSwgInRydWUiKSkpCisgICAgICAgIHNvYXAtPm51bGwgPSAxOworICAgIH0KKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9yZXRyeShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICBzb2FwX3JldmVydChzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfcmV2ZXJ0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoIXNvYXAtPnBlZWtlZCkKKyAgeyBzb2FwLT5wZWVrZWQgPSAxOworICAgIGlmIChzb2FwLT5ib2R5KQorICAgICAgc29hcC0+bGV2ZWwtLTsKKyAgfQorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJldmVydGluZyBsYXN0IGVsZW1lbnQgKGxldmVsPSV1KVxuIiwgc29hcC0+bGV2ZWwpKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zdHJpbmdfb3V0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBpbnQgZmxhZykKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqdDsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICByZWdpc3RlciBzb2FwX3djaGFyIG1hc2sgPSAweEZGRkZGRjgwVUw7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgc29hcC0+ZG9tLT5kYXRhID0gc29hcF9zdHJkdXAoc29hcCwgcyk7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNlbmRpZgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfQ19VVEZTVFJJTkcpCisgICAgbWFzayA9IDA7CisgIHQgPSBzOworICB3aGlsZSAoKGMgPSAqdCsrKSkKKyAgeyBzd2l0Y2ggKGMpCisgICAgeyAKKyAgICBjYXNlIDk6CisgICAgICBpZiAoZmxhZykKKyAgICAgIHsgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICImI3g5OyIsIDUpKQorCSAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBzID0gdDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTA6CisgICAgICBpZiAoZmxhZyB8fCAhKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpKQorICAgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIiYjeEE7IiwgNSkpCisJICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHMgPSB0OworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAxMzoKKyAgICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiJiN4RDsiLCA1KSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgcyA9IHQ7CisgICAgICBicmVhazsKKyAgICBjYXNlICcmJzoKKyAgICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiJmFtcDsiLCA1KSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgcyA9IHQ7CisgICAgICBicmVhazsKKyAgICBjYXNlICc8JzoKKyAgICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiJmx0OyIsIDQpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBzID0gdDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJz4nOgorICAgICAgaWYgKCFmbGFnKQorICAgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIiZndDsiLCA0KSkKKwkgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgcyA9IHQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICciJzoKKyAgICAgIGlmIChmbGFnKQorICAgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIiZxdW90OyIsIDYpKQorCSAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBzID0gdDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZkZWYgSEFWRV9NQlRPV0MKKyAgICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9DX01CU1RSSU5HKQorICAgICAgeyB3Y2hhcl90IHdjOworICAgICAgICByZWdpc3RlciBpbnQgbSA9IG1idG93Yygmd2MsIHQgLSAxLCBNQl9DVVJfTUFYKTsKKyAgICAgICAgaWYgKG0gPiAwICYmIHdjICE9IGMpCisgICAgICAgIHsgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3B1dHV0Zjgoc29hcCwgd2MpKQorICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworCSAgcyA9IHQgKz0gbSAtIDE7CisJICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisjZW5kaWYKKyAgICAgIGlmIChjICYgbWFzaykKKyAgICAgIHsgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3B1dHV0Zjgoc29hcCwgKHVuc2lnbmVkIGNoYXIpYykpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBzID0gdDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9zdHJpbmdfaW4oc3RydWN0IHNvYXAgKnNvYXAsIGludCBmbGFnLCBsb25nIG1pbmxlbiwgbG9uZyBtYXhsZW4pCit7IHJlZ2lzdGVyIGNoYXIgKnM7CisgIGNoYXIgKnQgPSBOVUxMOworICByZWdpc3RlciBzaXplX3QgaTsKKyAgcmVnaXN0ZXIgbG9uZyBsID0gMDsKKyAgcmVnaXN0ZXIgaW50IG4gPSAwOworICByZWdpc3RlciBpbnQgbSA9IDA7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyNpZiAhZGVmaW5lZChXSVRIX0xFQU5FUikgJiYgZGVmaW5lZChIQVZFX1dDVE9NQikKKyAgY2hhciBidWZbTUJfTEVOX01BWCA+IDggPyBNQl9MRU5fTUFYIDogOF07CisjZWxzZQorICBjaGFyIGJ1Zls4XTsKKyNlbmRpZgorICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVhZGluZyBzdHJpbmcgY29udGVudFxuIikpOworICBpZiAoc29hcC0+cGVla2VkKQorICB7IGlmICghc29hcC0+Ym9keSkKKyAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgqc29hcC0+dGFnKQorICAgIHsgbiA9IDE7CisgICAgICBzb2FwLT5wZWVrZWQgPSAwOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIHQgPSBzb2FwLT50bXBidWY7CisgICAgICB0WzBdID0gJzwnOworICAgICAgc3RybmNweSh0ICsgMSwgc29hcC0+dGFnLCBzaXplb2Yoc29hcC0+dG1wYnVmKSAtIDEpOworICAgICAgc3RybmNhdCh0LCAiPiIsIHNpemVvZihzb2FwLT50bXBidWYpKTsKKyAgICAgIG0gPSBzdHJsZW4oc29hcC0+dGFnKSArIDI7CisjZW5kaWYKKyAgICB9CisgIH0KKyNpZmRlZiBXSVRIX0NEQVRBCisgIGlmICghZmxhZykKKyAgeyByZWdpc3RlciBpbnQgc3RhdGUgPSAwOworI2lmZGVmIFdJVEhfRkFTVAorICAgIHNvYXAtPmxhYmlkeCA9IDA7CQkJLyogdXNlIGxvb2stYXNpZGUgYnVmZmVyICovCisjZWxzZQorICAgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgICAgZm9yICg7OykKKyAgICB7IAorI2lmZGVmIFdJVEhfRkFTVAorICAgICAgcmVnaXN0ZXIgc2l6ZV90IGs7CisgICAgICBpZiAoc29hcF9hcHBlbmRfbGFiKHNvYXAsIE5VTEwsIDApKQkvKiBhbGxvY2F0ZSBtb3JlIHNwYWNlIGluIGxvb2stYXNpZGUgYnVmZmVyIGlmIG5lY2Vzc2FyeSAqLworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIHMgPSBzb2FwLT5sYWJidWYgKyBzb2FwLT5sYWJpZHg7CS8qIHNwYWNlIHRvIHBvcHVsYXRlICovCisgICAgICBrID0gc29hcC0+bGFibGVuIC0gc29hcC0+bGFiaWR4OwkvKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlICovCisgICAgICBzb2FwLT5sYWJpZHggPSBzb2FwLT5sYWJsZW47CS8qIGNsYWltIHRoaXMgc3BhY2UgKi8KKyNlbHNlCisgICAgICByZWdpc3RlciBzaXplX3QgayA9IFNPQVBfQkxLTEVOOworICAgICAgaWYgKCEocyA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgaykpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICAgICAgZm9yIChpID0gMDsgaSA8IGs7IGkrKykKKyAgICAgIHsgaWYgKG0gPiAwKQorICAgICAgICB7ICpzKysgPSAqdCsrOwkvKiBjb3B5IG11bHRpYnl0ZSBjaGFyYWN0ZXJzICovCisJICBtLS07CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKwlpZiAoKGludCljID09IEVPRikKKyAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgaWYgKGMgPj0gMHg4MCAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19MQVRJTikpCisgICAgICAgIHsgc29hcF91bmdldChzb2FwLCBjKTsKKwkgIGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisJICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfQ19VVEZTVFJJTkcpCisgICAgICAgICAgeyBpZiAoKGMgJiAweDgwMDAwMDAwKSAmJiBjID49IC0weDdGRkZGRjgwICYmIGMgPCBTT0FQX0FQKQorICAgICAgICAgICAgeyBjICY9IDB4N0ZGRkZGRkY7CisgICAgICAgICAgICAgIHQgPSBidWY7CisgICAgICAgICAgICAgIGlmIChjIDwgMHgwODAwKQorICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhDMCB8ICgoYyA+PiA2KSAmIDB4MUYpKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7IGlmIChjIDwgMHgwMTAwMDApCisgICAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RTAgfCAoKGMgPj4gMTIpICYgMHgwRikpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7IGlmIChjIDwgMHgyMDAwMDApCisgICAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhGMCB8ICgoYyA+PiAxOCkgJiAweDA3KSk7CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICB7IGlmIChjIDwgMHgwNDAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjggfCAoKGMgPj4gMjQpICYgMHgwMykpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsgKnQrKyA9IChjaGFyKSgweEZDIHwgKChjID4+IDMwKSAmIDB4MDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMjQpICYgMHgzRikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAxOCkgJiAweDNGKSk7CisgICAgICAgICAgICAgICAgICB9ICAgICAKKyAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAxMikgJiAweDNGKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoYyAmIDB4M0YpKTsKKwkgICAgICBtID0gKGludCkodCAtIGJ1ZikgLSAxOworICAgICAgICAgICAgICB0ID0gYnVmOworICAgICAgICAgICAgICAqcysrID0gKnQrKzsKKyAgICAgICAgICAgICAgY29udGludWU7CisJICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKwlzd2l0Y2ggKHN0YXRlKQorICAgICAgICB7IGNhc2UgMToKKyAgICAgICAgICAgIGlmIChjID09ICddJykKKwkgICAgICBzdGF0ZSA9IDQ7CisJICAgICpzKysgPSBjOworCSAgICBjb250aW51ZTsKKwkgIGNhc2UgMjoKKwkgICAgaWYgKGMgPT0gJy0nKQorICAgICAgICAgICAgICBzdGF0ZSA9IDY7CisJICAgICpzKysgPSBjOworCSAgICBjb250aW51ZTsKKwkgIGNhc2UgMzoKKwkgICAgaWYgKGMgPT0gJz8nKQorCSAgICAgIHN0YXRlID0gODsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworICAgICAgICAgIC8qIENEQVRBICovCisJICBjYXNlIDQ6CisJICAgIGlmIChjID09ICddJykKKyAgICAgICAgICAgICAgc3RhdGUgPSA1OworCSAgICBlbHNlCisJICAgICAgc3RhdGUgPSAxOworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisJICBjYXNlIDU6CisJICAgIGlmIChjID09ICc+JykKKwkgICAgICBzdGF0ZSA9IDA7CisJICAgIGVsc2UKKwkgICAgICBzdGF0ZSA9IDE7CisJICAgICpzKysgPSBjOworCSAgICBjb250aW51ZTsKKyAgICAgICAgICAvKiBjb21tZW50ICovCisgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgaWYgKGMgPT0gJy0nKQorCSAgICAgIHN0YXRlID0gNzsKKwkgICAgZWxzZQorCSAgICAgIHN0YXRlID0gMjsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIGlmIChjID09ICc+JykKKwkgICAgICBzdGF0ZSA9IDA7CisJICAgIGVsc2UKKwkgICAgICBzdGF0ZSA9IDI7CisJICAgICpzKysgPSBjOworCSAgICBjb250aW51ZTsKKyAgICAgICAgICAvKiBQSSAqLworCSAgY2FzZSA4OgorICAgICAgICAgICAgaWYgKGMgPT0gJz4nKQorCSAgICAgIHN0YXRlID0gMDsKKwkgICAgZWxzZQorCSAgICAgIHN0YXRlID0gMzsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoYykKKyAgICAgICAgeworICAgICAgICBjYXNlICcvJzoKKyAgICAgICAgICBpZiAobiA+IDApCisgICAgICAgICAgeyBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICAgICAgICAgICAgaWYgKGMgPT0gJz4nKQorICAgICAgICAgICAgICBuLS07CisgICAgICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICAgIH0KKyAgICAgICAgICAqcysrID0gJy8nOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICc8JzoKKwkgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisJICBpZiAoYyA9PSAnLycpCisJICB7IGlmIChuID09IDApCisJICAgIHsgYyA9IFNPQVBfVFQ7CisJICAgICAgZ290byBlbmQ7CisJICAgIH0KKwkgICAgbi0tOworCSAgfQorCSAgZWxzZSBpZiAoYyA9PSAnIScpCisJICB7IGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisJICAgIGlmIChjID09ICdbJykKKyAgICAgICAgICAgIHsgZG8gYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgICAgICAgICAgICAgd2hpbGUgKChpbnQpYyAhPSBFT0YgJiYgYyAhPSAnWycpOworICAgICAgICAgICAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgICAgICAgICAgZ290byBlbmQ7CisJICAgICAgdCA9IChjaGFyKikiIVtDREFUQVsiOworCSAgICAgIG0gPSA4OworCSAgICAgIHN0YXRlID0gMTsKKwkgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnLScpCisJICAgIHsgaWYgKChjID0gc29hcF9nZXRjaGFyKHNvYXApKSA9PSAnLScpCisJICAgICAgICBzdGF0ZSA9IDI7CisJICAgICAgdCA9IChjaGFyKikiIS0iOworCSAgICAgIG0gPSAyOworCSAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7IHQgPSAoY2hhciopIiEiOworCSAgICAgIG0gPSAxOworCSAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisJICAgIH0KKwkgICAgKnMrKyA9ICc8JzsKKwkgICAgYnJlYWs7CisJICB9CisJICBlbHNlIGlmIChjID09ICc/JykKKwkgICAgc3RhdGUgPSAzOworCSAgZWxzZQorCSAgICBuKys7CisgICAgICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgICAqcysrID0gJzwnOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICc+JzoKKyAgICAgICAgICAqcysrID0gJz4nOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICAqcysrID0gJyInOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmZGVmIEhBVkVfV0NUT01CCisgICAgICAgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0NfTUJTVFJJTkcpCisgICAgICAgICAgeyBtID0gd2N0b21iKGJ1ZiwgYyAmIDB4N0ZGRkZGRkYpOworICAgICAgICAgICAgaWYgKG0gPj0gMSAmJiBtIDw9IChpbnQpTUJfQ1VSX01BWCkKKyAgICAgICAgICAgIHsgdCA9IGJ1ZjsKKyAgICAgICAgICAgICAgKnMrKyA9ICp0Kys7CisgICAgICAgICAgICAgIG0tLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgKnMrKyA9IFNPQVBfVU5LTk9XTl9DSEFSOworCSAgICAgIG0gPSAwOworCSAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyNlbmRpZgorI2VuZGlmCisgICAgICAgICAgICAqcysrID0gKGNoYXIpKGMgJiAweEZGKTsKKyAgICAgICAgfQorCWwrKzsKKyAgICAgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiBtYXhsZW4gPj0gMCAmJiBsID4gbWF4bGVuKQorICAgICAgICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJTdHJpbmcgdG9vIGxvbmc6IG1heGxlbj0lbGRcbiIsIG1heGxlbikpOworICAgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9MRU5HVEg7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyNlbmRpZgorI2lmZGVmIFdJVEhfRkFTVAorICBzb2FwLT5sYWJpZHggPSAwOwkJCS8qIHVzZSBsb29rLWFzaWRlIGJ1ZmZlciAqLworI2Vsc2UKKyAgaWYgKHNvYXBfbmV3X2Jsb2NrKHNvYXApKQorICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgIGZvciAoOzspCisgIHsgCisjaWZkZWYgV0lUSF9GQVNUCisgICAgcmVnaXN0ZXIgc2l6ZV90IGs7CisgICAgaWYgKHNvYXBfYXBwZW5kX2xhYihzb2FwLCBOVUxMLCAwKSkJLyogYWxsb2NhdGUgbW9yZSBzcGFjZSBpbiBsb29rLWFzaWRlIGJ1ZmZlciBpZiBuZWNlc3NhcnkgKi8KKyAgICAgIHJldHVybiBOVUxMOworICAgIHMgPSBzb2FwLT5sYWJidWYgKyBzb2FwLT5sYWJpZHg7CS8qIHNwYWNlIHRvIHBvcHVsYXRlICovCisgICAgayA9IHNvYXAtPmxhYmxlbiAtIHNvYXAtPmxhYmlkeDsJLyogbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSAqLworICAgIHNvYXAtPmxhYmlkeCA9IHNvYXAtPmxhYmxlbjsJLyogY2xhaW0gdGhpcyBzcGFjZSAqLworI2Vsc2UKKyAgICByZWdpc3RlciBzaXplX3QgayA9IFNPQVBfQkxLTEVOOworICAgIGlmICghKHMgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIGspKSkKKyAgICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgICAgZm9yIChpID0gMDsgaSA8IGs7IGkrKykKKyAgICB7IGlmIChtID4gMCkKKyAgICAgIHsgKnMrKyA9ICp0Kys7CS8qIGNvcHkgbXVsdGlieXRlIGNoYXJhY3RlcnMgKi8KKyAgICAgICAgbS0tOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9DX1VURlNUUklORykKKyAgICAgIHsgaWYgKCgoYyA9IHNvYXBfZ2V0KHNvYXApKSAmIDB4ODAwMDAwMDApICYmIGMgPj0gLTB4N0ZGRkZGODAgJiYgYyA8IFNPQVBfQVApCisgICAgICAgIHsgYyAmPSAweDdGRkZGRkZGOworICAgICAgICAgIHQgPSBidWY7CisgICAgICAgICAgaWYgKGMgPCAweDA4MDApCisgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4QzAgfCAoKGMgPj4gNikgJiAweDFGKSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsgaWYgKGMgPCAweDAxMDAwMCkKKyAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEUwIHwgKChjID4+IDEyKSAmIDB4MEYpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgaWYgKGMgPCAweDIwMDAwMCkKKyAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjAgfCAoKGMgPj4gMTgpICYgMHgwNykpOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsgaWYgKGMgPCAweDA0MDAwMDAwKQorICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEY4IHwgKChjID4+IDI0KSAmIDB4MDMpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeyAqdCsrID0gKGNoYXIpKDB4RkMgfCAoKGMgPj4gMzApICYgMHgwMSkpOworICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDI0KSAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDE4KSAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgfSAgICAgCisgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAxMikgJiAweDNGKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gNikgJiAweDNGKSk7CisgICAgICAgICAgfQorICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8IChjICYgMHgzRikpOworCSAgbSA9IChpbnQpKHQgLSBidWYpIC0gMTsKKyAgICAgICAgICB0ID0gYnVmOworICAgICAgICAgICpzKysgPSAqdCsrOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisgICAgICBzd2l0Y2ggKGMpCisgICAgICB7CisgICAgICBjYXNlIFNPQVBfVFQ6CisgICAgICAgIGlmIChuID09IDApCisgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIG4tLTsKKyAgICAgICAgKnMrKyA9ICc8JzsKKyAgICAgICAgdCA9IChjaGFyKikiLyI7CisJbSA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTT0FQX0xUOgorICAgICAgICBuKys7CisgICAgICAgICpzKysgPSAnPCc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTT0FQX0dUOgorICAgICAgICAqcysrID0gJz4nOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9RVDoKKyAgICAgICAgKnMrKyA9ICciJzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfQVA6CisgICAgICAgICpzKysgPSAnXCcnOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJy8nOgorICAgICAgICBpZiAobiA+IDApCisgICAgICAgIHsgYyA9IHNvYXBfZ2V0KHNvYXApOworICAgICAgICAgIGlmIChjID09IFNPQVBfR1QpCisgICAgICAgICAgICBuLS07CisgICAgICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgfQorICAgICAgICAqcysrID0gJy8nOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJzwnIHwgMHg4MDAwMDAwMDoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9ICc8JzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAnJic7CisgICAgICAgICAgdCA9IChjaGFyKikibHQ7IjsKKwkgIG0gPSAzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnPicgfCAweDgwMDAwMDAwOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gJz4nOworICAgICAgICBlbHNlCisgICAgICAgIHsgKnMrKyA9ICcmJzsKKyAgICAgICAgICB0ID0gKGNoYXIqKSJndDsiOworCSAgbSA9IDM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICcmJyB8IDB4ODAwMDAwMDA6CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICpzKysgPSAnJic7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAqcysrID0gJyYnOworICAgICAgICAgIHQgPSAoY2hhciopImFtcDsiOworCSAgbSA9IDQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICciJyB8IDB4ODAwMDAwMDA6CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICpzKysgPSAnIic7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAqcysrID0gJyYnOworICAgICAgICAgIHQgPSAoY2hhciopInF1b3Q7IjsKKwkgIG0gPSA1OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnXCcnIHwgMHg4MDAwMDAwMDoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9ICdcJyc7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAqcysrID0gJyYnOworICAgICAgICAgIHQgPSAoY2hhciopImFwb3M7IjsKKwkgIG0gPSA1OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgICAgZ290byBlbmQ7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZkZWYgSEFWRV9XQ1RPTUIKKyAgICAgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0NfTUJTVFJJTkcpCisgICAgICAgIHsgbSA9IHdjdG9tYihidWYsIGMgJiAweDdGRkZGRkZGKTsKKyAgICAgICAgICBpZiAobSA+PSAxICYmIG0gPD0gKGludClNQl9DVVJfTUFYKQorICAgICAgICAgIHsgdCA9IGJ1ZjsKKyAgICAgICAgICAgICpzKysgPSAqdCsrOworICAgICAgICAgICAgbS0tOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeyAqcysrID0gU09BUF9VTktOT1dOX0NIQVI7CisJICAgIG0gPSAwOworCSAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZgorI2VuZGlmCisgICAgICAgICAgKnMrKyA9IChjaGFyKShjICYgMHhGRik7CisgICAgICB9CisgICAgICBsKys7CisgICAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIG1heGxlbiA+PSAwICYmIGwgPiBtYXhsZW4pCisgICAgICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJTdHJpbmcgdG9vIGxvbmc6IG1heGxlbj0lbGRcbiIsIG1heGxlbikpOworICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfTEVOR1RIOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICB9CisgIH0KK2VuZDoKKyAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgKnMgPSAnXDAnOworI2lmZGVmIFdJVEhfRkFTVAorICB0ID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+bGFiYnVmKTsKKyNlbHNlCisgIHNvYXBfc2l6ZV9ibG9jayhzb2FwLCBpKzEpOworICB0ID0gc29hcF9zYXZlX2Jsb2NrKHNvYXAsIE5VTEwsIDApOworI2VuZGlmCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgbCA8IG1pbmxlbikKKyAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiU3RyaW5nIHRvbyBzaG9ydDogJWxkIGNoYXJzLCBtaW5sZW49JWxkXG4iLCBsLCBtaW5sZW4pKTsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfTEVOR1RIOworICAgIHJldHVybiBOVUxMOworICB9CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgaWYgKGZsYWcgPT0gMykKKyAgICAgIHNvYXAtPmRvbS0+dGFpbCA9IHQ7CisgICAgZWxzZQorICAgICAgc29hcC0+ZG9tLT5kYXRhID0gdDsKKyAgfQorI2VuZGlmCisgIGlmIChmbGFnID09IDIpCisgICAgaWYgKHNvYXBfczJRTmFtZShzb2FwLCB0LCAmdCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHQ7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfd3N0cmluZ19vdXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHdjaGFyX3QgKnMsIGludCBmbGFnKQoreyBjb25zdCBjaGFyICp0OworICBjaGFyIHRtcDsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IHdjaGFyX3QgKnIgPSAod2NoYXJfdCopczsKKyAgICBpbnQgbiA9IDE7CisgICAgd2hpbGUgKCpyKyspCisgICAgICBuKys7CisgICAgc29hcC0+ZG9tLT53aWRlID0gciA9ICh3Y2hhcl90Kilzb2FwX21hbGxvYyhzb2FwLCBuICogc2l6ZW9mKHdjaGFyX3QpKTsKKyAgICB3aGlsZSAobi0tKQorICAgICAgKnIrKyA9ICpzKys7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNlbmRpZgorICB3aGlsZSAoKGMgPSAqcysrKSkKKyAgeyBzd2l0Y2ggKGMpCisgICAgeyAKKyAgICBjYXNlIDk6CisgICAgICBpZiAoZmxhZykKKyAgICAgICAgdCA9ICImI3g5OyI7CisgICAgICBlbHNlCisgICAgICAgIHQgPSAiXHQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMDoKKyAgICAgIGlmIChmbGFnIHx8ICEoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkpCisgICAgICAgIHQgPSAiJiN4QTsiOworICAgICAgZWxzZQorICAgICAgICB0ID0gIlxuIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTM6CisgICAgICB0ID0gIiYjeEQ7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJyYnOgorICAgICAgdCA9ICImYW1wOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICc8JzoKKyAgICAgIHQgPSAiJmx0OyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICc+JzoKKyAgICAgIGlmIChmbGFnKQorICAgICAgICB0ID0gIj4iOworICAgICAgZWxzZQorCXQgPSAiJmd0OyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICciJzoKKyAgICAgIGlmIChmbGFnKQorICAgICAgICB0ID0gIiZxdW90OyI7CisgICAgICBlbHNlCisgICAgICAgIHQgPSAiXCIiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChjID4gMCAmJiBjIDwgMHg4MCkKKyAgICAgIHsgdG1wID0gKGNoYXIpYzsKKyAgICAgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgJnRtcCwgMSkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgICAgZWxzZSBpZiAoc29hcF9wdXR1dGY4KHNvYXAsICh1bnNpZ25lZCBsb25nKWMpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKHNvYXBfc2VuZChzb2FwLCB0KSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQord2NoYXJfdCAqCitTT0FQX0ZNQUMyCitzb2FwX3dzdHJpbmdfaW4oc3RydWN0IHNvYXAgKnNvYXAsIGludCBmbGFnLCBsb25nIG1pbmxlbiwgbG9uZyBtYXhsZW4pCit7IHdjaGFyX3QgKnM7CisgIHJlZ2lzdGVyIGludCBpLCBuID0gMDsKKyAgcmVnaXN0ZXIgbG9uZyBsID0gMDsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICBjb25zdCBjaGFyICp0ID0gTlVMTDsKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlYWRpbmcgd2lkZSBzdHJpbmcgY29udGVudFxuIikpOworICBpZiAoc29hcC0+cGVla2VkKQorICB7IGlmICghc29hcC0+Ym9keSkKKyAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgqc29hcC0+dGFnKQorICAgIHsgbiA9IDE7CisgICAgICBzb2FwLT5wZWVrZWQgPSAwOworICAgIH0KKyAgfQorICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgcmV0dXJuIE5VTEw7CisgIGZvciAoOzspCisgIHsgaWYgKCEocyA9ICh3Y2hhcl90Kilzb2FwX3B1c2hfYmxvY2soc29hcCwgc2l6ZW9mKHdjaGFyX3QpKlNPQVBfQkxLTEVOKSkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgU09BUF9CTEtMRU47IGkrKykKKyAgICB7IGlmICh0KQorICAgICAgeyAqcysrID0gKHdjaGFyX3QpKnQrKzsKKyAgICAgICAgaWYgKCEqdCkKKyAgICAgICAgICB0ID0gTlVMTDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBjID0gc29hcF9nZXR1dGY4KHNvYXApOworICAgICAgc3dpdGNoIChjKQorICAgICAgeworICAgICAgY2FzZSBTT0FQX1RUOgorICAgICAgICBpZiAobiA9PSAwKQorICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICBuLS07CisgICAgICAgICpzKysgPSAnPCc7CisgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgJy8nKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfTFQ6CisgICAgICAgIG4rKzsKKyAgICAgICAgKnMrKyA9ICc8JzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfR1Q6CisgICAgICAgICpzKysgPSAnPic7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTT0FQX1FUOgorICAgICAgICAqcysrID0gJyInOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9BUDoKKyAgICAgICAgKnMrKyA9ICdcJyc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnLyc6CisgICAgICAgIGlmIChuID4gMCkKKyAgICAgICAgeyBjID0gc29hcF9nZXR1dGY4KHNvYXApOworICAgICAgICAgIGlmIChjID09IFNPQVBfR1QpCisgICAgICAgICAgICBuLS07CisgICAgICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgfQorICAgICAgICAqcysrID0gJy8nOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJzwnOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gKHNvYXBfd2NoYXIpJzwnOworICAgICAgICBlbHNlCisgICAgICAgIHsgKnMrKyA9IChzb2FwX3djaGFyKScmJzsKKyAgICAgICAgICB0ID0gImx0OyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICc+JzoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9IChzb2FwX3djaGFyKSc+JzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAoc29hcF93Y2hhciknJic7CisgICAgICAgICAgdCA9ICJndDsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnIic6CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICpzKysgPSAoc29hcF93Y2hhciknIic7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAqcysrID0gKHNvYXBfd2NoYXIpJyYnOworICAgICAgICAgIHQgPSAicXVvdDsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICpzKysgPSAod2NoYXJfdCljICYgMHg3RkZGRkZGRjsKKyAgICAgIH0KKyAgICAgIGwrKzsKKyAgICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgbWF4bGVuID49IDAgJiYgbCA+IG1heGxlbikKKyAgICAgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlN0cmluZyB0b28gbG9uZzogbWF4bGVuPSVsZFxuIiwgbWF4bGVuKSk7CisgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9MRU5HVEg7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgIH0KKyAgfQorZW5kOgorICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAqcyA9ICdcMCc7CisgIHNvYXBfc2l6ZV9ibG9jayhzb2FwLCBzaXplb2Yod2NoYXJfdCkgKiAoaSArIDEpKTsKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiBsIDwgbWlubGVuKQorICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJTdHJpbmcgdG9vIHNob3J0OiAlbGQgY2hhcnMsIG1pbmxlbj0lbGRcbiIsIGwsIG1pbmxlbikpOworICAgIHNvYXAtPmVycm9yID0gU09BUF9MRU5HVEg7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcyA9ICh3Y2hhcl90Kilzb2FwX3NhdmVfYmxvY2soc29hcCwgTlVMTCwgMCk7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgICAgc29hcC0+ZG9tLT53aWRlID0gczsKKyNlbmRpZgorICByZXR1cm4gczsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfaW50MnMoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuKQoreyByZXR1cm4gc29hcF9sb25nMnMoc29hcCwgKGxvbmcpbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0aW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgaW50ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX2xvbmcycyhzb2FwLCAobG9uZykqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJpbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGludCAqcCkKK3sgaWYgKHMpCisgIHsgY2hhciAqcjsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgIHNvYXBfcmVzZXRfZXJybm87CisjZW5kaWYKKyNlbmRpZgorICAgICpwID0gKGludClzb2FwX3N0cnRvbChzLCAmciwgMTApOworICAgIGlmICgocyA9PSByICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkgfHwgKnIKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICB8fCBzb2FwX2Vycm5vID09IFNPQVBfRVJBTkdFCisjZW5kaWYKKyNlbmRpZgorICAgICkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludCAqCitTT0FQX0ZNQUMyCitzb2FwX2luaW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6aW50IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6c2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpieXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKGludCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKGludCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChpbnQqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YoaW50KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJpbnQoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfbG9uZzJzKHN0cnVjdCBzb2FwICpzb2FwLCBsb25nIG4pCit7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiJWxkIiwgbik7CisgIHJldHVybiBzb2FwLT50bXBidWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0bG9uZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGxvbmcgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfbG9uZzJzKHNvYXAsICpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMmxvbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGxvbmcgKnApCit7IGlmIChzKQorICB7IGNoYXIgKnI7CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBzb2FwX3Jlc2V0X2Vycm5vOworI2VuZGlmCisjZW5kaWYKKyAgICAqcCA9IHNvYXBfc3RydG9sKHMsICZyLCAxMCk7CisgICAgaWYgKChzID09IHIgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKSB8fCAqcgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgIHx8IHNvYXBfZXJybm8gPT0gU09BUF9FUkFOR0UKKyNlbmRpZgorI2VuZGlmCisgICAgKQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorbG9uZyAqCitTT0FQX0ZNQUMyCitzb2FwX2lubG9uZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBsb25nICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjppbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpzaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAobG9uZyopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKGxvbmcpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAobG9uZyopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihsb25nKSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJsb25nKHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX0xPTkc2NDJzKHN0cnVjdCBzb2FwICpzb2FwLCBMT05HNjQgbikKK3sgc3ByaW50Zihzb2FwLT50bXBidWYsIFNPQVBfTE9OR19GT1JNQVQsIG4pOworICByZXR1cm4gc29hcC0+dG1wYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dExPTkc2NChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IExPTkc2NCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9MT05HNjQycyhzb2FwLCAqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJMT05HNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIExPTkc2NCAqcCkKK3sgaWYgKHMpCisgIHsKKyNpZmRlZiBIQVZFX1NUUlRPTEwKKyAgICBjaGFyICpyOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgc29hcF9yZXNldF9lcnJubzsKKyNlbmRpZgorI2VuZGlmCisgICAgKnAgPSBzdHJ0b2xsKHMsICZyLCAxMCk7CisgICAgaWYgKChzID09IHIgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKSB8fCAqcgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICAgfHwgc29hcF9lcnJubyA9PSBTT0FQX0VSQU5HRQorI2VuZGlmCisjZW5kaWYKKyAgICAgICkKKyNlbHNlCisjIGlmZGVmIEhBVkVfU1NDQU5GCisgICAgaWYgKHNzY2FuZihzLCBTT0FQX0xPTkdfRk9STUFULCBwKSAhPSAxKQorIyBlbmRpZgorI2VuZGlmCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitMT05HNjQgKgorU09BUF9GTUFDMgorc29hcF9pbkxPTkc2NChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBMT05HNjQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpwb3NpdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpuZWdhdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpub25Qb3NpdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpub25OZWdhdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpsb25nIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6aW50IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6c2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpieXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKExPTkc2NCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKExPTkc2NCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChMT05HNjQqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YoTE9ORzY0KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJMT05HNjQoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfYnl0ZTJzKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyIG4pCit7IHJldHVybiBzb2FwX2xvbmcycyhzb2FwLCAobG9uZyluKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRieXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgY2hhciAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9sb25nMnMoc29hcCwgKGxvbmcpKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MyYnl0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgY2hhciAqcCkKK3sgaWYgKHMpCisgIHsgbG9uZyBuOworICAgIGNoYXIgKnI7CisgICAgbiA9IHNvYXBfc3RydG9sKHMsICZyLCAxMCk7CisgICAgaWYgKHMgPT0gciB8fCAqciB8fCBuIDwgLTEyOCB8fCBuID4gMTI3KQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgKnAgPSAoY2hhciluOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9pbmJ5dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgY2hhciAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6Ynl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9IChjaGFyKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YoY2hhciksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChjaGFyKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKGNoYXIpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMmJ5dGUoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfc2hvcnQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgc2hvcnQgbikKK3sgcmV0dXJuIHNvYXBfbG9uZzJzKHNvYXAsIChsb25nKW4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHNob3J0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgc2hvcnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfbG9uZzJzKHNvYXAsIChsb25nKSpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMnNob3J0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBzaG9ydCAqcCkKK3sgaWYgKHMpCisgIHsgbG9uZyBuOworICAgIGNoYXIgKnI7CisgICAgbiA9IHNvYXBfc3RydG9sKHMsICZyLCAxMCk7CisgICAgaWYgKHMgPT0gciB8fCAqciB8fCBuIDwgLTMyNzY4IHx8IG4gPiAzMjc2NykKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgICpwID0gKHNob3J0KW47CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorc2hvcnQgKgorU09BUF9GTUFDMgorc29hcF9pbnNob3J0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHNob3J0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpzaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAoc2hvcnQqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihzaG9ydCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChzaG9ydCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihzaG9ydCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3Myc2hvcnQoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZmxvYXQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgZmxvYXQgbikKK3sgY29uc3QgY2hhciAqczsKKyAgaWYgKHNvYXBfaXNuYW4oKGRvdWJsZSluKSkKKyAgICBzID0gIk5hTiI7CisgIGVsc2UgaWYgKHNvYXBfaXNwaW5mZihuKSkKKyAgICBzID0gIklORiI7CisgIGVsc2UgaWYgKHNvYXBfaXNuaW5mZihuKSkKKyAgICBzID0gIi1JTkYiOworICBlbHNlCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsIHNvYXAtPmZsb2F0X2Zvcm1hdCwgbik7CisgICAgcyA9IHNvYXAtPnRtcGJ1ZjsKKyAgfQorICByZXR1cm4gczsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRmbG9hdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGZsb2F0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX2Zsb2F0MnMoc29hcCwgKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MyZmxvYXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGZsb2F0ICpwKQoreyBpZiAocykKKyAgeyBpZiAoISpzKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIGlmICghc29hcF90YWdfY21wKHMsICJJTkYiKSkKKyAgICAgICpwID0gRkxUX1BJTkZUWTsKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHMsICIrSU5GIikpCisgICAgICAqcCA9IEZMVF9QSU5GVFk7CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChzLCAiLUlORiIpKQorICAgICAgKnAgPSBGTFRfTklORlRZOworICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAocywgIk5hTiIpKQorICAgICAgKnAgPSBGTFRfTkFOOworICAgIGVsc2UKKyAgICB7CisvKiBPbiBzb21lIHN5c3RlbXMsIHN0cnRvZiBhcHBlYXJzIHRvIGJlIGJyb2tlbiBvciBkb2Vzbid0IGxpbms6IHVzZSB3aXRoIGNhdXRpb24gKi8KKyNpZiBkZWZpbmVkKEhBVkVfU1RSVE9GKQorICAgICAgY2hhciAqcjsKKyAgICAgICpwID0gc3RydG9mKChjaGFyKilzLCAmcik7CisgICAgICBpZiAoKnIpCisjZWxpZiBkZWZpbmVkKEhBVkVfU1RSVE9EKQorICAgICAgY2hhciAqcjsKKyAgICAgICpwID0gKGZsb2F0KXN0cnRvZChzLCAmcik7CisgICAgICBpZiAoKnIpCisjZW5kaWYKKyNpZmRlZiBIQVZFX1NTQ0FORgorICAgICAgICBpZiAoc3NjYW5mKHMsICIlZyIsIHApICE9IDEpCisgICAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisjZWxzZQorICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyNlbmRpZgorICAgIH0KKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgaW50IHNvYXBfaXNudW1lcmljKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0eXBlKQoreyBpZiAoc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6ZmxvYXQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpkb3VibGUiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpkZWNpbWFsIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6aW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnBvc2l0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOm5lZ2F0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOm5vblBvc2l0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOm5vbk5lZ2F0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmxvbmciKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjppbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpzaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmJ5dGUiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZExvbmciKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkU2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gU09BUF9FUlI7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitmbG9hdCAqCitTT0FQX0ZNQUMyCitzb2FwX2luZmxvYXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgZmxvYXQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUgIT0gJ1wwJyAmJiBzb2FwX2lzbnVtZXJpYyhzb2FwLCB0eXBlKSkKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICBwID0gKGZsb2F0Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YoZmxvYXQpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAoZmxvYXQqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YoZmxvYXQpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMmZsb2F0KHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2RvdWJsZTJzKHN0cnVjdCBzb2FwICpzb2FwLCBkb3VibGUgbikKK3sgY29uc3QgY2hhciAqczsKKyAgaWYgKHNvYXBfaXNuYW4obikpCisgICAgcyA9ICJOYU4iOworICBlbHNlIGlmIChzb2FwX2lzcGluZmQobikpCisgICAgcyA9ICJJTkYiOworICBlbHNlIGlmIChzb2FwX2lzbmluZmQobikpCisgICAgcyA9ICItSU5GIjsKKyAgZWxzZQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCBzb2FwLT5kb3VibGVfZm9ybWF0LCBuKTsKKyAgICBzID0gc29hcC0+dG1wYnVmOworICB9CisgIHJldHVybiBzOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dGRvdWJsZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGRvdWJsZSAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9kb3VibGUycyhzb2FwLCAqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJkb3VibGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGRvdWJsZSAqcCkKK3sgaWYgKHMpCisgIHsgaWYgKCEqcykKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBpZiAoIXNvYXBfdGFnX2NtcChzLCAiSU5GIikpCisgICAgICAqcCA9IERCTF9QSU5GVFk7CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChzLCAiK0lORiIpKQorICAgICAgKnAgPSBEQkxfUElORlRZOworICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAocywgIi1JTkYiKSkKKyAgICAgICpwID0gREJMX05JTkZUWTsKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHMsICJOYU4iKSkKKyAgICAgICpwID0gREJMX05BTjsKKyAgICBlbHNlCisgICAgeworI2lmZGVmIEhBVkVfU1RSVE9ECisgICAgICBjaGFyICpyOworICAgICAgKnAgPSBzdHJ0b2QocywgJnIpOworICAgICAgaWYgKCpyKQorI2VuZGlmCisjaWZkZWYgSEFWRV9TU0NBTkYKKyAgICAgICAgaWYgKHNzY2FuZihzLCAiJWxnIiwgcCkgIT0gMSkKKyAgICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyNlbHNlCisgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworI2VuZGlmCisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2RvdWJsZSAqCitTT0FQX0ZNQUMyCitzb2FwX2luZG91YmxlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGRvdWJsZSAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZSAhPSAnXDAnICYmIHNvYXBfaXNudW1lcmljKHNvYXAsIHR5cGUpKQorICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgIHAgPSAoZG91YmxlKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YoZG91YmxlKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKGRvdWJsZSopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihkb3VibGUpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMmRvdWJsZShzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF91bnNpZ25lZEJ5dGUycyhzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgY2hhciBuKQoreyByZXR1cm4gc29hcF91bnNpZ25lZExvbmcycyhzb2FwLCAodW5zaWduZWQgbG9uZyluKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXR1bnNpZ25lZEJ5dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX3Vuc2lnbmVkTG9uZzJzKHNvYXAsICh1bnNpZ25lZCBsb25nKSpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMnVuc2lnbmVkQnl0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgdW5zaWduZWQgY2hhciAqcCkKK3sgaWYgKHMpCisgIHsgdW5zaWduZWQgbG9uZyBuOworICAgIGNoYXIgKnI7CisgICAgbiA9IHNvYXBfc3RydG91bChzLCAmciwgMTApOworICAgIGlmIChzID09IHIgfHwgKnIgfHwgbiA+IDI1NSkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgICpwID0gKHVuc2lnbmVkIGNoYXIpbjsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit1bnNpZ25lZCBjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfaW51bnNpZ25lZEJ5dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgdW5zaWduZWQgY2hhciAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRCeXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKHVuc2lnbmVkIGNoYXIqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZih1bnNpZ25lZCBjaGFyKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKHVuc2lnbmVkIGNoYXIqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YodW5zaWduZWQgY2hhciksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MydW5zaWduZWRCeXRlKHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3Vuc2lnbmVkU2hvcnQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgc2hvcnQgbikKK3sgcmV0dXJuIHNvYXBfdW5zaWduZWRMb25nMnMoc29hcCwgKHVuc2lnbmVkIGxvbmcpbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0dW5zaWduZWRTaG9ydChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIHNob3J0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX3Vuc2lnbmVkTG9uZzJzKHNvYXAsICh1bnNpZ25lZCBsb25nKSpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMnVuc2lnbmVkU2hvcnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIHNob3J0ICpwKQoreyBpZiAocykKKyAgeyB1bnNpZ25lZCBsb25nIG47CisgICAgY2hhciAqcjsKKyAgICBuID0gc29hcF9zdHJ0b3VsKHMsICZyLCAxMCk7CisgICAgaWYgKHMgPT0gciB8fCAqciB8fCBuID4gNjU1MzUpCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICAqcCA9ICh1bnNpZ25lZCBzaG9ydCluOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3Vuc2lnbmVkIHNob3J0ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW51bnNpZ25lZFNob3J0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIHNob3J0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZFNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRCeXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKHVuc2lnbmVkIHNob3J0Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YodW5zaWduZWQgc2hvcnQpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAodW5zaWduZWQgc2hvcnQqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YodW5zaWduZWQgc2hvcnQpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMnVuc2lnbmVkU2hvcnQoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfdW5zaWduZWRJbnQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgaW50IG4pCit7IHJldHVybiBzb2FwX3Vuc2lnbmVkTG9uZzJzKHNvYXAsICh1bnNpZ25lZCBsb25nKW4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHVuc2lnbmVkSW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgdW5zaWduZWQgaW50ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX3Vuc2lnbmVkTG9uZzJzKHNvYXAsICh1bnNpZ25lZCBsb25nKSpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMnVuc2lnbmVkSW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBpbnQgKnApCit7IGlmIChzKQorICB7IGNoYXIgKnI7CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBzb2FwX3Jlc2V0X2Vycm5vOworI2VuZGlmCisjZW5kaWYKKyAgICAqcCA9ICh1bnNpZ25lZCBpbnQpc29hcF9zdHJ0b3VsKHMsICZyLCAxMCk7CisgICAgaWYgKChzID09IHIgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKSB8fCAqcgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgIHx8IHNvYXBfZXJybm8gPT0gU09BUF9FUkFOR0UKKyNlbmRpZgorI2VuZGlmCisgICAgKQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordW5zaWduZWQgaW50ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW51bnNpZ25lZEludChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB1bnNpZ25lZCBpbnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkSW50IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRTaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkQnl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9ICh1bnNpZ25lZCBpbnQqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZih1bnNpZ25lZCBpbnQpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAodW5zaWduZWQgaW50Kilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKHVuc2lnbmVkIGludCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MydW5zaWduZWRJbnQoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfdW5zaWduZWRMb25nMnMoc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIGxvbmcgbikKK3sgc3ByaW50Zihzb2FwLT50bXBidWYsICIlbHUiLCBuKTsKKyAgcmV0dXJuIHNvYXAtPnRtcGJ1ZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXR1bnNpZ25lZExvbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCB1bnNpZ25lZCBsb25nICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX3Vuc2lnbmVkTG9uZzJzKHNvYXAsICpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMnVuc2lnbmVkTG9uZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgdW5zaWduZWQgbG9uZyAqcCkKK3sgaWYgKHMpCisgIHsgY2hhciAqcjsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgIHNvYXBfcmVzZXRfZXJybm87CisjZW5kaWYKKyNlbmRpZgorICAgICpwID0gc29hcF9zdHJ0b3VsKHMsICZyLCAxMCk7CisgICAgaWYgKChzID09IHIgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKSB8fCAqcgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgIHx8IHNvYXBfZXJybm8gPT0gU09BUF9FUkFOR0UKKyNlbmRpZgorI2VuZGlmCisgICAgKQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordW5zaWduZWQgbG9uZyAqCitTT0FQX0ZNQUMyCitzb2FwX2ludW5zaWduZWRMb25nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIGxvbmcgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkSW50IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRTaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkQnl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9ICh1bnNpZ25lZCBsb25nKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YodW5zaWduZWQgbG9uZyksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9ICh1bnNpZ25lZCBsb25nKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMnVuc2lnbmVkTG9uZyhzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9VTE9ORzY0MnMoc3RydWN0IHNvYXAgKnNvYXAsIFVMT05HNjQgbikKK3sgc3ByaW50Zihzb2FwLT50bXBidWYsIFNPQVBfVUxPTkdfRk9STUFULCBuKTsKKyAgcmV0dXJuIHNvYXAtPnRtcGJ1ZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRVTE9ORzY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgVUxPTkc2NCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9VTE9ORzY0MnMoc29hcCwgKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MyVUxPTkc2NChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgVUxPTkc2NCAqcCkKK3sgaWYgKHMpCisgIHsKKyNpZmRlZiBIQVZFX1NUUlRPVUxMCisgICAgY2hhciAqcjsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgIHNvYXBfcmVzZXRfZXJybm87CisjZW5kaWYKKyNlbmRpZgorICAgICpwID0gc3RydG91bGwocywgJnIsIDEwKTsKKyAgICBpZiAoKHMgPT0gciAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpIHx8ICpyCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgICB8fCBzb2FwX2Vycm5vID09IFNPQVBfRVJBTkdFCisjZW5kaWYKKyNlbmRpZgorICAgICAgKQorI2Vsc2UKKyMgaWZkZWYgSEFWRV9TU0NBTkYKKyAgICBpZiAoc3NjYW5mKHMsIFNPQVBfVUxPTkdfRk9STUFULCBwKSAhPSAxKQorIyBlbmRpZgorI2VuZGlmCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitVTE9ORzY0ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5VTE9ORzY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIFVMT05HNjQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6cG9zaXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bm9uTmVnYXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRMb25nIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRJbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZFNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRCeXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcCA9IChVTE9ORzY0Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YoVUxPTkc2NCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChVTE9ORzY0Kilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKFVMT05HNjQpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMlVMT05HNjQoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3Myc3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBjaGFyICoqdCkKK3sgKnQgPSBOVUxMOworICBpZiAocykKKyAgeyBpZiAoISgqdCA9IHNvYXBfc3RyZHVwKHNvYXAsIHMpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIGlmICghKHNvYXAtPm1vZGUgJiAoU09BUF9FTkNfTEFUSU4gfCBTT0FQX0NfVVRGU1RSSU5HKSkpCisgICAgeyAvKiBUT0RPOiBjb25zaWRlciB0cnVuY2F0aW5nIFVURjggdG8gQVNDSUkgZm9yIHJlZ3VsYXIgWE1MIGF0dHJpYnV0ZSBzdHJpbmdzPyAqLworICAgIH0KKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJRTmFtZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgY2hhciAqKnQpCit7IGlmIChzKQorICB7IHN0cnVjdCBzb2FwX25saXN0ICpucDsKKyAgICBjb25zdCBjaGFyICpwOworICAgIGlmICghc3RybmNtcChzLCAieG1sOiIsIDQpKQorICAgIHsgKnQgPSBzb2FwX3N0cmR1cChzb2FwLCBzKTsKKyAgICAgIHJldHVybiBTT0FQX09LOworICAgIH0KKyAgICBucCA9IHNvYXAtPm5saXN0OworICAgIHAgPSBzdHJjaHIocywgJzonKTsKKyAgICBpZiAocCkKKyAgICB7IHJlZ2lzdGVyIGludCBuID0gcCAtIHM7CisgICAgICB3aGlsZSAobnAgJiYgKHN0cm5jbXAobnAtPmlkLCBzLCBuKSB8fCBucC0+aWRbbl0pKQorICAgICAgICBucCA9IG5wLT5uZXh0OworICAgICAgcCsrOworICAgIH0KKyAgICBlbHNlCisgICAgeyB3aGlsZSAobnAgJiYgKm5wLT5pZCkKKyAgICAgICAgbnAgPSBucC0+bmV4dDsKKyAgICAgIHAgPSBzOworICAgIH0KKyAgICBpZiAobnApCisgICAgeyBpZiAobnAtPmluZGV4ID49IDAgJiYgc29hcC0+bG9jYWxfbmFtZXNwYWNlcykKKyAgICAgIHsgcmVnaXN0ZXIgY29uc3QgY2hhciAqcSA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbbnAtPmluZGV4XS5pZDsKKyAgICAgICAgaWYgKHEpCisgICAgICAgIHsgaWYgKCgqdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzdHJsZW4ocCkgKyBzdHJsZW4ocSkgKyAyKSkpCisgICAgICAgICAgICBzcHJpbnRmKCp0LCAiJXM6JXMiLCBxLCBwKTsKKyAgICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKG5wLT5ucykKKyAgICAgIHsgaWYgKCgqdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzdHJsZW4ocCkgKyBzdHJsZW4obnAtPm5zKSArIDQpKSkKKyAgICAgICAgICBzcHJpbnRmKCp0LCAiXCIlc1wiOiVzIiwgbnAtPm5zLCBwKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgICB9CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk5hbWVzcGFjZSBwcmVmaXggb2YgJyVzJyBub3QgZGVmaW5lZCAoaW5kZXg9JWQsIFVSST0lcylcbiIsIHMsIG5wLT5pbmRleCwgbnAtPm5zP25wLT5uczoiIikpOworICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9OQU1FU1BBQ0U7IAorICAgIH0KKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk5hbWVzcGFjZSBwcmVmaXggb2YgJyVzJyBub3QgZGVmaW5lZCwgYXNzdW1pbmcgZW1wdHkgbmFtZXNwYWNlXG4iLCBzKSk7CisgICAgaWYgKCgqdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzdHJsZW4ocCkgKyA0KSkpCisgICAgICBzcHJpbnRmKCp0LCAiXCJcIjolcyIsIHApOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX1FOYW1lMnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMpCit7IHN0cnVjdCBOYW1lc3BhY2UgKnA7CisgIGNoYXIgKnQ7CisgIGludCBuOworICBpZiAoIXMgfHwgKnMgIT0gJyInKQorICB7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmIChzICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKSkKKyAgICB7IHQgPSAoY2hhciopc3RyY2hyKHMsICc6Jyk7CisgICAgICBpZiAodCkKKyAgICAgICAgc29hcF91dGlsaXplX25zKHNvYXAsIHMsIHQgLSBzKTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gczsKKyAgfQorICBzKys7CisgIGlmICgocCA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXMpKQorICB7IGZvciAoOyBwLT5pZDsgcCsrKQorICAgIHsgaWYgKHAtPm5zKQorICAgICAgICBpZiAoIXNvYXBfdGFnX2NtcChzLCBwLT5ucykpCisgICAgICAgICAgYnJlYWs7CisgICAgICBpZiAocC0+aW4pCisgICAgICAgIGlmICghc29hcF90YWdfY21wKHMsIHAtPmluKSkKKyAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHAgJiYgcC0+aWQpCisgICAgeyBzID0gc3RyY2hyKHMsICciJyk7CisgICAgICBpZiAocykKKyAgICAgIHsgdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzdHJsZW4ocC0+aWQpICsgc3RybGVuKHMpKTsKKyAgICAgICAgc3RyY3B5KHQsIHAtPmlkKTsKKwlzdHJjYXQodCwgcyArIDEpOworICAgICAgICByZXR1cm4gdDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgdCA9IChjaGFyKilzdHJjaHIocywgJyInKTsKKyAgaWYgKHQpCisgICAgbiA9IHQgLSBzOworICBlbHNlCisgICAgbiA9IDA7CisgIHQgPSBzb2FwX3N0cmR1cChzb2FwLCBzKTsKKyAgdFtuXSA9ICdcMCc7CisgIHNwcmludGYoc29hcC0+dG1wYnVmLCAieG1sbnM6XyVkIiwgc29hcC0+aWRudW0rKyk7CisgIHNvYXBfc2V0X2F0dHIoc29hcCwgc29hcC0+dG1wYnVmLCB0KTsKKyAgcyA9IHN0cmNocihzLCAnIicpOworICBpZiAocykKKyAgeyB0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihzb2FwLT50bXBidWYpICsgc3RybGVuKHMpIC0gNik7CisgICAgc3RyY3B5KHQsIHNvYXAtPnRtcGJ1ZiArIDYpOworICAgIHN0cmNhdCh0LCBzICsgMSk7CisgIH0KKyAgcmV0dXJuIHQ7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJ3Y2hhcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgd2NoYXJfdCAqKnQpCit7IHdjaGFyX3QgKnI7CisgIGlmICghcykKKyAgICAqdCA9IE5VTEw7CisgIGVsc2UKKyAgeyAqdCA9IHIgPSAod2NoYXJfdCopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHdjaGFyX3QpICogKHN0cmxlbihzKSArIDEpKTsKKyAgICBpZiAoIXIpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19MQVRJTikKKyAgICB7IHdoaWxlICgqcykKKyAgICAgICAgKnIrKyA9ICh3Y2hhcl90KSpzKys7CisgICAgfQorICAgIGVsc2UKKyAgICB7IC8qIENvbnZlcnQgVVRGOCB0byB3Y2hhciAqLworICAgICAgd2hpbGUgKCpzKQorICAgICAgeyByZWdpc3RlciBzb2FwX3djaGFyIGMsIGMxLCBjMiwgYzMsIGM0OworICAgICAgICBjID0gKnMrKzsKKyAgICAgICAgaWYgKGMgPCAweDgwKQorCSAgKnIrKyA9ICh3Y2hhcl90KWM7CisJZWxzZQorICAgICAgICB7IGMxID0gKHNvYXBfd2NoYXIpKnMrKyAmIDB4M0Y7CisgICAgICAgICAgaWYgKGMgPCAweEUwKQorICAgICAgICAgICAgKnIrKyA9ICh3Y2hhcl90KSgoKHNvYXBfd2NoYXIpKGMgJiAweDFGKSA8PCA2KSB8IGMxKTsKKyAgICAgICAgICBlbHNlCisJICB7IGMyID0gKHNvYXBfd2NoYXIpKnMrKyAmIDB4M0Y7CisgICAgICAgICAgICBpZiAoYyA8IDB4RjApCisgICAgICAgICAgICAgICpyKysgPSAod2NoYXJfdCkoKChzb2FwX3djaGFyKShjICYgMHgwRikgPDwgMTIpIHwgKGMxIDw8IDYpIHwgYzIpOworICAgICAgICAgICAgZWxzZQorCSAgICB7IGMzID0gKHNvYXBfd2NoYXIpKnMrKyAmIDB4M0Y7CisgICAgICAgICAgICAgIGlmIChjIDwgMHhGOCkKKyAgICAgICAgICAgICAgICAqcisrID0gKHdjaGFyX3QpKCgoc29hcF93Y2hhcikoYyAmIDB4MDcpIDw8IDE4KSB8IChjMSA8PCAxMikgfCAoYzIgPDwgNikgfCBjMyk7CisgICAgICAgICAgICAgIGVsc2UKKwkgICAgICB7IGM0ID0gKHNvYXBfd2NoYXIpKnMrKyAmIDB4M0Y7CisgICAgICAgICAgICAgICAgaWYgKGMgPCAweEZDKQorICAgICAgICAgICAgICAgICAgKnIrKyA9ICh3Y2hhcl90KSgoKHNvYXBfd2NoYXIpKGMgJiAweDAzKSA8PCAyNCkgfCAoYzEgPDwgMTgpIHwgKGMyIDw8IDEyKSB8IChjMyA8PCA2KSB8IGM0KTsKKyAgICAgICAgICAgICAgICBlbHNlCisJCSAgKnIrKyA9ICh3Y2hhcl90KSgoKHNvYXBfd2NoYXIpKGMgJiAweDAxKSA8PCAzMCkgfCAoYzEgPDwgMjQpIHwgKGMyIDw8IDE4KSB8IChjMyA8PCAxMikgfCAoYzQgPDwgNikgfCAoc29hcF93Y2hhcikoKnMrKyAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAqciA9IEwnXDAnOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfd2NoYXIycyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgd2NoYXJfdCAqcykKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICByZWdpc3RlciBjaGFyICpyLCAqdDsKKyAgY29uc3Qgd2NoYXJfdCAqcSA9IHM7CisgIHNpemVfdCBuID0gMDsKKyAgd2hpbGUgKChjID0gKnErKykpCisgIHsgaWYgKGMgPiAwICYmIGMgPCAweDgwKQorICAgICAgbisrOworICAgIGVsc2UKKyAgICAgIG4gKz0gNjsKKyAgfQorICByID0gdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBuICsgMSk7CisgIGlmIChyKQorICB7IC8qIENvbnZlcnQgd2NoYXIgdG8gVVRGOCAqLworICAgIHdoaWxlICgoYyA9ICpzKyspKQorICAgIHsgaWYgKGMgPiAwICYmIGMgPCAweDgwKQorICAgICAgICAqdCsrID0gKGNoYXIpYzsKKyAgICAgIGVsc2UKKyAgICAgIHsgaWYgKGMgPCAweDA4MDApCisgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEMwIHwgKChjID4+IDYpICYgMHgxRikpOworICAgICAgICBlbHNlCisgICAgICAgIHsgaWYgKGMgPCAweDAxMDAwMCkKKyAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhFMCB8ICgoYyA+PiAxMikgJiAweDBGKSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsgaWYgKGMgPCAweDIwMDAwMCkKKyAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEYwIHwgKChjID4+IDE4KSAmIDB4MDcpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgaWYgKGMgPCAweDA0MDAwMDAwKQorICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhGOCB8ICgoYyA+PiAyNCkgJiAweDAzKSk7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeyAqdCsrID0gKGNoYXIpKDB4RkMgfCAoKGMgPj4gMzApICYgMHgwMSkpOworICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAyNCkgJiAweDNGKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDE4KSAmIDB4M0YpKTsKKyAgICAgICAgICAgIH0gICAgIAorICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDEyKSAmIDB4M0YpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDYpICYgMHgzRikpOworICAgICAgICB9CisgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8IChjICYgMHgzRikpOworICAgICAgfQorICAgIH0KKyAgICAqdCA9ICdcMCc7CisgIH0KKyAgcmV0dXJuIHI7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0c3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY2hhciAqY29uc3QqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pIAoreyBpZCA9IHNvYXBfZWxlbWVudF9pZChzb2FwLCB0YWcsIGlkLCAqcCwgTlVMTCwgMCwgdHlwZSwgbik7CisgIGlmIChpZCA8IDAKKyAgIHx8IHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBpZCwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCAqcCwgMCkKKyAgIHx8IHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZykpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKioKK1NPQVBfRk1BQzIKK3NvYXBfaW5zdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgY2hhciAqKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0LCBpbnQgZmxhZywgbG9uZyBtaW5sZW4sIGxvbmcgbWF4bGVuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMSkpCisgIHsgaWYgKCF0YWcgfHwgKnRhZyAhPSAnLScgfHwgc29hcC0+ZXJyb3IgIT0gU09BUF9OT19UQUcpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIH0KKyAgaWYgKCFwKQorICAgIGlmICghKHAgPSAoY2hhcioqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihjaGFyKikpKSkKKyAgICAgIHJldHVybiBOVUxMOworICBpZiAoc29hcC0+Ym9keSkKKyAgeyAqcCA9IHNvYXBfc3RyaW5nX2luKHNvYXAsIGZsYWcsIG1pbmxlbiwgbWF4bGVuKTsKKyAgICBpZiAoISpwIHx8ICEoY2hhciopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgKnAsIHQsIHNpemVvZihjaGFyKiksIDAsIE5VTEwsIE5VTEwsIE5VTEwpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZWxzZSBpZiAoc29hcC0+bnVsbCkKKyAgICAqcCA9IE5VTEw7CisgIGVsc2UKKyAgICAqcCA9IChjaGFyKilTT0FQX1NUUl9FT1M7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKGNoYXIqKilzb2FwX2lkX2xvb2t1cChzb2FwLCBzb2FwLT5ocmVmLCAodm9pZCoqKXAsIHQsIHNpemVvZihjaGFyKiopLCAwKTsKKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXR3c3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgd2NoYXJfdCAqY29uc3QqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pIAoreyBpZCA9IHNvYXBfZWxlbWVudF9pZChzb2FwLCB0YWcsIGlkLCAqcCwgTlVMTCwgMCwgdHlwZSwgbik7CisgIGlmIChpZCA8IDAKKyAgIHx8IHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBpZCwgdHlwZSkKKyAgIHx8IHNvYXBfd3N0cmluZ19vdXQoc29hcCwgKnAsIDApCisgICB8fCBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3djaGFyX3QgKioKK1NPQVBfRk1BQzIKK3NvYXBfaW53c3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHdjaGFyX3QgKipwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCwgbG9uZyBtaW5sZW4sIGxvbmcgbWF4bGVuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMSkpCisgIHsgaWYgKCF0YWcgfHwgKnRhZyAhPSAnLScgfHwgc29hcC0+ZXJyb3IgIT0gU09BUF9OT19UQUcpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIH0KKyAgaWYgKCFwKQorICAgIGlmICghKHAgPSAod2NoYXJfdCoqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZih3Y2hhcl90KikpKSkKKyAgICAgIHJldHVybiBOVUxMOworICBpZiAoc29hcC0+Ym9keSkKKyAgeyAqcCA9IHNvYXBfd3N0cmluZ19pbihzb2FwLCAxLCBtaW5sZW4sIG1heGxlbik7CisgICAgaWYgKCEqcCB8fCAhKHdjaGFyX3QqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsICpwLCB0LCBzaXplb2Yod2NoYXJfdCopLCAwLCBOVUxMLCBOVUxMLCBOVUxMKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGVsc2UgaWYgKHNvYXAtPm51bGwpCisgICAgKnAgPSBOVUxMOworICBlbHNlCisgICAgKnAgPSAod2NoYXJfdCopU09BUF9TVFJfRU9TOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9ICh3Y2hhcl90Kiopc29hcF9pZF9sb29rdXAoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilwLCB0LCBzaXplb2Yod2NoYXJfdCoqKSwgMCk7CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyB0aW1lX3QKK3NvYXBfdGltZWdtKHN0cnVjdCB0bSAqVCkKK3sKKyNpZiBkZWZpbmVkKEhBVkVfVElNRUdNKQorICByZXR1cm4gdGltZWdtKFQpOworI2Vsc2UKKyAgdGltZV90IHQsIGcsIHo7CisjaWZkZWYgSEFWRV9HTVRJTUVfUgorICBzdHJ1Y3QgdG0gdG0sICp0bXAgPSAmdG07CisjZWxzZQorICBzdHJ1Y3QgdG0gKnRtcDsKKyNlbmRpZgorICB0ID0gbWt0aW1lKFQpOworICBpZiAodCA9PSAtMSkKKyAgICByZXR1cm4gLTE7CisjaWZkZWYgSEFWRV9HTVRJTUVfUgorICBnbXRpbWVfcigmdCwgdG1wKTsKKyNlbHNlCisgIHRtcCA9IGdtdGltZSgmdCk7CisjZW5kaWYKKyAgdG1wLT50bV9pc2RzdCA9IDA7CisgIGcgPSBta3RpbWUodG1wKTsKKyAgaWYgKGcgPT0gLTEpCisgICAgcmV0dXJuIC0xOworICB6ID0gZyAtIHQ7CisgIHJldHVybiB0IC0gejsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZGF0ZVRpbWUycyhzdHJ1Y3Qgc29hcCAqc29hcCwgdGltZV90IG4pCit7IHN0cnVjdCB0bSBULCAqcFQgPSAmVDsKKyNpZiBkZWZpbmVkKEhBVkVfR01USU1FX1IpCisgIGlmIChnbXRpbWVfcigmbiwgcFQpKQorICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolU1oiLCBwVCk7CisgIC8qIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyB3ZXJlIGFkZGVkIGZvciBWeFdvcmtzKi8KKyNlbGlmIGRlZmluZWQoSEFWRV9QR01USU1FX1IpCisgIGlmIChnbXRpbWVfcigmbiwgcFQpKQorICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolU1oiLCBwVCk7CisjZWxpZiBkZWZpbmVkKEhBVkVfUEdNVElNRSkKKyAgaWYgKGdtdGltZSgmbiwgcFQpKQorICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolU1oiLCBwVCk7CisjZWxpZiBkZWZpbmVkKEhBVkVfR01USU1FKQorICBpZiAoKHBUID0gZ210aW1lKCZuKSkpCisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTWiIsIHBUKTsKKyNlbGlmIGRlZmluZWQoSEFWRV9HRVRUSU1FT0ZEQVkpCisgIHN0cnVjdCB0aW1lem9uZSB0ejsKKyAgbWVtc2V0KCh2b2lkKikmdHosIDAsIHNpemVvZih0eikpOworIyBpZiBkZWZpbmVkKEhBVkVfTE9DQUxUSU1FX1IpCisgIGlmIChsb2NhbHRpbWVfcigmbiwgcFQpKQorICB7IHN0cnVjdCB0aW1ldmFsIHR2OworICAgIGdldHRpbWVvZmRheSgmdHYsICZ0eik7CisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmICsgc3RybGVuKHNvYXAtPnRtcGJ1ZiksICIlKzAzZDolMDJkIiwgLXR6LnR6X21pbnV0ZXN3ZXN0LzYwKyhwVC0+dG1faXNkc3QhPTApLCBhYnModHoudHpfbWludXRlc3dlc3QpJTYwKTsKKyAgfQorIyBlbHNlCisgIGlmICgocFQgPSBsb2NhbHRpbWUoJm4pKSkKKyAgeyBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICBnZXR0aW1lb2ZkYXkoJnR2LCAmdHopOworICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIHN0cmxlbihzb2FwLT50bXBidWYpLCAiJSswM2Q6JTAyZCIsIC10ei50el9taW51dGVzd2VzdC82MCsocFQtPnRtX2lzZHN0IT0wKSwgYWJzKHR6LnR6X21pbnV0ZXN3ZXN0KSU2MCk7CisgIH0KKyNlbmRpZgorI2VsaWYgZGVmaW5lZChIQVZFX0ZUSU1FKQorICBzdHJ1Y3QgdGltZWIgdDsKKyAgbWVtc2V0KCh2b2lkKikmdCwgMCwgc2l6ZW9mKHQpKTsKKyMgaWYgZGVmaW5lZChIQVZFX0xPQ0FMVElNRV9SKQorICBpZiAobG9jYWx0aW1lX3IoJm4sIHBUKSkKKyAgeyBmdGltZSgmdCk7CisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmICsgc3RybGVuKHNvYXAtPnRtcGJ1ZiksICIlKzAzZDolMDJkIiwgLXQudGltZXpvbmUvNjArKHBULT50bV9pc2RzdCE9MCksIGFicyh0LnRpbWV6b25lKSU2MCk7CisgIH0KKyAgLyogVGhlIGZvbGxvd2luZyBkZWZpbmVzIHdlcmUgYWRkZWQgZm9yIFZ4V29ya3MqLworIyBlbGlmIGRlZmluZWQoSEFWRV9QTE9DQUxUSU1FX1IpCisgIGlmIChsb2NhbHRpbWVfcigmbiwgcFQpKQorICB7IHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZitzdHJsZW4oc29hcC0+dG1wYnVmKSwgIiUrMDNkOiUwMmQiLCB0LnRpbWV6b25lLzYwLCBhYnModC50aW1lem9uZSklNjApOworICB9CisjIGVsc2UKKyAgaWYgKChwVCA9IGxvY2FsdGltZSgmbikpKQorICB7IGZ0aW1lKCZ0KTsKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwVCk7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYgKyBzdHJsZW4oc29hcC0+dG1wYnVmKSwgIiUrMDNkOiUwMmQiLCAtdC50aW1lem9uZS82MCsocFQtPnRtX2lzZHN0IT0wKSwgYWJzKHQudGltZXpvbmUpJTYwKTsKKyAgfQorIyBlbmRpZgorI2VsaWYgZGVmaW5lZChIQVZFX0xPQ0FMVElNRV9SKQorICBpZiAobG9jYWx0aW1lX3IoJm4sIHBUKSkKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwVCk7CisgIC8qIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyB3ZXJlIGFkZGVkIGZvciBWeFdvcmtzKi8KKyNlbGlmIGRlZmluZWQoSEFWRV9QTE9DQUxUSU1FX1IpCisgIGlmIChsb2NhbHRpbWVfcigmbiwgcFQpKQorICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyNlbHNlCisgIGlmICgocFQgPSBsb2NhbHRpbWUoJm4pKSkKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwVCk7CisjZW5kaWYKKyAgZWxzZQorICAgIHN0cmNweShzb2FwLT50bXBidWYsICIxOTY5LTEyLTMxVDIzOjU5OjU5WiIpOworICByZXR1cm4gc29hcC0+dG1wYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dGRhdGVUaW1lKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgdGltZV90ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX2RhdGVUaW1lMnMoc29hcCwgKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MyZGF0ZVRpbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHRpbWVfdCAqcCkKK3sgaWYgKHMpCisgIHsgc3RydWN0IHRtIFQ7CisgICAgY2hhciB6b25lWzE2XTsKKyAgICBjb25zdCBjaGFyICp0OworICAgIG1lbXNldCgodm9pZCopJlQsIDAsIHNpemVvZihUKSk7CisgICAgem9uZVtzaXplb2Yoem9uZSktMV0gPSAnXDAnOworICAgIGlmIChzdHJjaHIocywgJy0nKSkKKyAgICAgIHQgPSAiJWQtJWQtJWRUJWQ6JWQ6JWQlMTVzIjsKKyAgICBlbHNlIGlmIChzdHJjaHIocywgJzonKSkKKyAgICAgIHQgPSAiJTRkJTJkJTJkVCVkOiVkOiVkJTE1cyI7CisgICAgZWxzZSAvKiBwYXJzZSBub24tWFNELXN0YW5kYXJkIGFsdGVybmF0aXZlIElTTyA4NjAxIGZvcm1hdCAqLworICAgICAgdCA9ICIlNGQlMmQlMmRUJTJkJTJkJTJkJTE1cyI7CisgICAgc3NjYW5mKHMsIHQsICZULnRtX3llYXIsICZULnRtX21vbiwgJlQudG1fbWRheSwgJlQudG1faG91ciwgJlQudG1fbWluLCAmVC50bV9zZWMsIHpvbmUpOworICAgIGlmIChULnRtX3llYXIgPT0gMSkKKyAgICAgIFQudG1feWVhciA9IDcwOworICAgIGVsc2UKKyAgICAgIFQudG1feWVhciAtPSAxOTAwOworICAgIFQudG1fbW9uLS07CisgICAgaWYgKCp6b25lKQorICAgIHsgaWYgKCp6b25lID09ICcuJykKKyAgICAgIHsgZm9yIChzID0gem9uZSArIDE7ICpzOyBzKyspCisgICAgICAgICAgaWYgKCpzIDwgJzAnIHx8ICpzID4gJzknKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHMgPSB6b25lOworICAgICAgaWYgKCpzID09ICcrJyB8fCAqcyA9PSAnLScpCisgICAgICB7IGludCBoID0gMCwgbSA9IDA7CisgICAgICAgIGlmIChzWzNdID09ICc6JykKKwl7IHNzY2FuZihzLCAiJWQ6JWQiLCAmaCwgJm0pOworCSAgaWYgKGggPCAwKQorCSAgICBtID0gLW07CisJfQorCWVsc2UKKwl7IG0gPSAoaW50KWF0b2wocyk7CisJICBoID0gbSAvIDEwMDsKKwkgIG0gPSBtICUgMTAwOworCX0KKyAgICAgICAgVC50bV9ob3VyIC09IGg7CisgICAgICAgIFQudG1fbWluIC09IG07CisgICAgICB9CisgICAgICBULnRtX2lzZHN0ID0gMDsKKyAgICAgICpwID0gc29hcF90aW1lZ20oJlQpOworICAgIH0KKyAgICBlbHNlCisgICAgeyBULnRtX2lzZHN0ID0gLTE7CisgICAgICAqcCA9IG1rdGltZSgmVCk7IC8qIG5vIHRpbWUgem9uZTogc3VwcG9zZSBpdCBpcyBsb2NhbHRpbWU/ICovCisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK3RpbWVfdCAqCitTT0FQX0ZNQUMyCitzb2FwX2luZGF0ZVRpbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgdGltZV90ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmRhdGVUaW1lIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcCA9ICh0aW1lX3QqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZih0aW1lX3QpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAodGltZV90Kilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKHRpbWVfdCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MyZGF0ZVRpbWUoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dGxpdGVyYWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgY2hhciAqY29uc3QqcCkKK3sgaW50IGk7CisgIGNvbnN0IGNoYXIgKnQgPSBOVUxMOworICBpZiAodGFnICYmICp0YWcgIT0gJy0nKQorICB7IGlmIChzb2FwLT5sb2NhbF9uYW1lc3BhY2VzICYmICh0ID0gc3RyY2hyKHRhZywgJzonKSkpCisgICAgeyBzdHJuY3B5KHNvYXAtPnRtcGJ1ZiwgdGFnLCB0LXRhZyk7CisgICAgICBzb2FwLT50bXBidWZbdC10YWddID0gJ1wwJzsKKyAgICAgIGZvciAoaSA9IDA7IHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0uaWQ7IGkrKykKKyAgICAgICAgaWYgKCFzdHJjbXAoc29hcC0+dG1wYnVmLCBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW2ldLmlkKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIHQrKzsKKyAgICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiPCVzIHhtbG5zPVwiJXNcIj4iLCB0LCBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW2ldLm5zID8gc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tpXS5ucyA6IFNPQVBfU1RSX0VPUyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IHQgPSB0YWc7CisgICAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIjwlcz4iLCB0YWcpOworICAgIH0KKyAgICBpZiAoc29hcF9zZW5kKHNvYXAsIHNvYXAtPnRtcGJ1ZikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHAgJiYgKnApCisgIHsgaWYgKHNvYXBfc2VuZChzb2FwLCAqcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHQpCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICI8LyVzPiIsIHQpOworICAgIHJldHVybiBzb2FwX3NlbmQoc29hcCwgc29hcC0+dG1wYnVmKTsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKioKK1NPQVBfRk1BQzIKK3NvYXBfaW5saXRlcmFsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGNoYXIgKipwKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMSkpCisgIHsgaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfTk9fVEFHIHx8IHNvYXBfdW5nZXQoc29hcCwgc29hcF9nZXQoc29hcCkpID09IFNPQVBfVFQpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIH0KKyAgaWYgKCFwKQorICAgIGlmICghKHAgPSAoY2hhcioqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihjaGFyKikpKSkKKyAgICAgIHJldHVybiBOVUxMOworICBpZiAoc29hcC0+Ym9keSkKKyAgICAqcCA9IHNvYXBfc3RyaW5nX2luKHNvYXAsIDAsIC0xLCAtMSk7CisgIGVsc2UgaWYgKHNvYXAtPm51bGwpCisgICAgKnAgPSBOVUxMOworICBlbHNlCisgICAgKnAgPSAoY2hhciopU09BUF9TVFJfRU9TOworICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHdsaXRlcmFsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHdjaGFyX3QgKmNvbnN0KnApCit7IGludCBpOworICBjb25zdCBjaGFyICp0ID0gTlVMTDsKKyAgd2NoYXJfdCBjOworICBjb25zdCB3Y2hhcl90ICpzOworICBpZiAodGFnICYmICp0YWcgIT0gJy0nKQorICB7IGlmIChzb2FwLT5sb2NhbF9uYW1lc3BhY2VzICYmICh0ID0gc3RyY2hyKHRhZywgJzonKSkpCisgICAgeyBzdHJuY3B5KHNvYXAtPnRtcGJ1ZiwgdGFnLCB0LXRhZyk7CisgICAgICBzb2FwLT50bXBidWZbdC10YWddID0gJ1wwJzsKKyAgICAgIGZvciAoaSA9IDA7IHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0uaWQ7IGkrKykKKyAgICAgICAgaWYgKCFzdHJjbXAoc29hcC0+dG1wYnVmLCBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW2ldLmlkKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIHQrKzsKKyAgICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiPCVzIHhtbG5zPVwiJXNcIj4iLCB0LCBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW2ldLm5zID8gc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tpXS5ucyA6IFNPQVBfU1RSX0VPUyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IHQgPSB0YWc7CisgICAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIjwlcz4iLCB0YWcpOworICAgIH0KKyAgICBpZiAoc29hcF9zZW5kKHNvYXAsIHNvYXAtPnRtcGJ1ZikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHApCisgIHsgcyA9ICpwOworICAgIHdoaWxlICgoYyA9ICpzKyspKQorICAgICAgaWYgKHNvYXBfcHV0dXRmOChzb2FwLCAodW5zaWduZWQgY2hhciljKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmICh0KQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiPC8lcz4iLCB0KTsKKyAgICByZXR1cm4gc29hcF9zZW5kKHNvYXAsIHNvYXAtPnRtcGJ1Zik7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3djaGFyX3QgKioKK1NPQVBfRk1BQzIKK3NvYXBfaW53bGl0ZXJhbChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB3Y2hhcl90ICoqcCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDEpKQorICB7IGlmIChzb2FwLT5lcnJvciAhPSBTT0FQX05PX1RBRyB8fCBzb2FwX3VuZ2V0KHNvYXAsIHNvYXBfZ2V0KHNvYXApKSA9PSBTT0FQX1RUKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICB9CisgIGlmICghcCkKKyAgICBpZiAoIShwID0gKHdjaGFyX3QqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yod2NoYXJfdCopKSkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgaWYgKHNvYXAtPmJvZHkpCisgICAgKnAgPSBzb2FwX3dzdHJpbmdfaW4oc29hcCwgMCwgLTEsIC0xKTsKKyAgZWxzZSBpZiAoc29hcC0+bnVsbCkKKyAgICAqcCA9IE5VTEw7CisgIGVsc2UKKyAgICAqcCA9ICh3Y2hhcl90KilTT0FQX1NUUl9FT1M7CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIgKgorU09BUF9GTUFDMgorc29hcF90b2tlbihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc2l6ZV90IGk7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IDA7CisgIHJlZ2lzdGVyIGNoYXIgKnMgPSBzb2FwLT50bXBidWY7CisgIGlmICghc29hcC0+Ym9keSkKKyAgICByZXR1cm4gU09BUF9TVFJfRU9TOworICBkbyBjID0gc29hcF9nZXQoc29hcCk7CisgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZihzb2FwLT50bXBidWYpIC0gMTsgaSsrKQorICB7IGlmIChjID09IFNPQVBfVFQgfHwgKGludCljID09IEVPRiB8fCBzb2FwX2JsYW5rKGMpKQorICAgICAgYnJlYWs7CisgICAgKnMrKyA9IChjaGFyKWM7CisgICAgYyA9IHNvYXBfZ2V0KHNvYXApOworICB9CisgIGlmICgoaW50KWMgPT0gRU9GIHx8IGMgPT0gU09BUF9UVCkKKyAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAqcyA9ICdcMCc7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRWxlbWVudCBjb250ZW50IHZhbHVlPSclcydcbiIsIHNvYXAtPnRtcGJ1ZikpOworICByZXR1cm4gc29hcC0+dG1wYnVmOyAvKiByZXR1cm4gbm9uLW51bGwgcG9pbnRlciAqLworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3ZhbHVlKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzaXplX3QgaTsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjID0gMDsKKyAgcmVnaXN0ZXIgY2hhciAqcyA9IHNvYXAtPnRtcGJ1ZjsKKyAgaWYgKCFzb2FwLT5ib2R5KQorICAgIHJldHVybiBTT0FQX1NUUl9FT1M7CisgIGRvIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZikgLSAxOyBpKyspCisgIHsgaWYgKGMgPT0gU09BUF9UVCB8fCAoaW50KWMgPT0gRU9GKQorICAgICAgYnJlYWs7CisgICAgKnMrKyA9IChjaGFyKWM7CisgICAgYyA9IHNvYXBfZ2V0KHNvYXApOworICB9CisgIGZvciAocy0tOyBpID4gMDsgaS0tLCBzLS0pCisgICAgaWYgKCFzb2FwX2JsYW5rKCpzKSkKKyAgICAgIGJyZWFrOworICBzWzFdID0gJ1wwJzsKKyAgaWYgKChpbnQpYyA9PSBFT0YgfHwgYyA9PSBTT0FQX1RUKQorICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRWxlbWVudCBjb250ZW50IHZhbHVlPSclcydcbiIsIHNvYXAtPnRtcGJ1ZikpOworI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICAgIHNvYXAtPmRvbS0+ZGF0YSA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPnRtcGJ1Zik7CisjZW5kaWYKKyAgcmV0dXJuIHNvYXAtPnRtcGJ1ZjsgLyogcmV0dXJuIG5vbi1udWxsIHBvaW50ZXIgKi8KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmICFkZWZpbmVkKFdJVEhfTEVBTkVSKSB8fCAhZGVmaW5lZChXSVRIX05PSFRUUCkKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0bGluZShzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqcywgaW50IGxlbikKK3sgaW50IGkgPSBsZW47CisgIHNvYXBfd2NoYXIgYyA9IDA7CisgIGZvciAoOzspCisgIHsgd2hpbGUgKC0taSA+IDApCisgICAgeyBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICAgICAgaWYgKGMgPT0gJ1xyJyB8fCBjID09ICdcbicpCisgICAgICAgIGJyZWFrOworICAgICAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgICAgKnMrKyA9IChjaGFyKWM7CisgICAgfQorICAgIGlmIChjICE9ICdcbicpCisgICAgICBjID0gc29hcF9nZXRjaGFyKHNvYXApOyAvKiBnb3QgXHIsIG5vdyBnZXQgXG4gKi8KKyAgICBpZiAoYyA9PSAnXG4nKQorICAgIHsgKnMgPSAnXDAnOworICAgICAgaWYgKGkrMSA9PSBsZW4pIC8qIGVtcHR5IGxpbmU6IGVuZCBvZiBIVFRQL01JTUUgaGVhZGVyICovCisgICAgICAgIGJyZWFrOworICAgICAgYyA9IHNvYXBfdW5nZXQoc29hcCwgc29hcF9nZXRjaGFyKHNvYXApKTsKKyAgICAgIGlmIChjICE9ICcgJyAmJiBjICE9ICdcdCcpIC8qIEhUVFAgbGluZSBjb250aW51YXRpb24/ICovCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBlbHNlIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzaXplX3QKK3NvYXBfY291bnRfYXR0YWNobWVudHMoc3RydWN0IHNvYXAgKnNvYXApCit7IAorI2lmbmRlZiBXSVRIX0xFQU5FUgorICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgIHJlZ2lzdGVyIHNpemVfdCBjb3VudCA9IHNvYXAtPmNvdW50OworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNhbGN1bGF0aW5nIHRoZSBtZXNzYWdlIHNpemUgd2l0aCBhdHRhY2htZW50cywgY3VycmVudCBjb3VudD0lbHVcbiIsICh1bnNpZ25lZCBsb25nKWNvdW50KSk7CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpICYmICEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ2FsY3VsYXRpbmcgdGhlIHNpemUgb2YgRElNRSBhdHRhY2htZW50c1xuIikpOworICAgIGZvciAoY29udGVudCA9IHNvYXAtPmRpbWUuZmlyc3Q7IGNvbnRlbnQ7IGNvbnRlbnQgPSBjb250ZW50LT5uZXh0KQorICAgIHsgY291bnQgKz0gMTIgKyAoKGNvbnRlbnQtPnNpemUrMykmKH4zKSk7CisgICAgICBpZiAoY29udGVudC0+aWQpCisgICAgICAgIGNvdW50ICs9ICgoc3RybGVuKGNvbnRlbnQtPmlkKSszKSYofjMpKTsKKyAgICAgIGlmIChjb250ZW50LT50eXBlKQorICAgICAgICBjb3VudCArPSAoKHN0cmxlbihjb250ZW50LT50eXBlKSszKSYofjMpKTsKKyAgICAgIGlmIChjb250ZW50LT5vcHRpb25zKQorICAgICAgICBjb3VudCArPSAoKCgodW5zaWduZWQgY2hhciljb250ZW50LT5vcHRpb25zWzJdIDw8IDgpIHwgKCh1bnNpZ25lZCBjaGFyKWNvbnRlbnQtPm9wdGlvbnNbM10pKSs3KSYofjMpOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTaXplIG9mIERJTUUgYXR0YWNobWVudCBjb250ZW50IGlzICVsdSBieXRlc1xuIiwgKHVuc2lnbmVkIGxvbmcpY29udGVudC0+c2l6ZSkpOworICAgIH0KKyAgfQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKSAmJiBzb2FwLT5taW1lLmJvdW5kYXJ5KQorICB7IHJlZ2lzdGVyIHNpemVfdCBuID0gc3RybGVuKHNvYXAtPm1pbWUuYm91bmRhcnkpOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ2FsY3VsYXRpbmcgdGhlIHNpemUgb2YgTUlNRSBhdHRhY2htZW50c1xuIikpOworICAgIGZvciAoY29udGVudCA9IHNvYXAtPm1pbWUuZmlyc3Q7IGNvbnRlbnQ7IGNvbnRlbnQgPSBjb250ZW50LT5uZXh0KQorICAgIHsgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKKyAgICAgIC8qIGNvdW50IFxyXG4tLWJvdW5kYXJ5XHJcbiAqLworICAgICAgY291bnQgKz0gNiArIG47CisgICAgICAvKiBjb3VudCBDb250ZW50LVR5cGU6IC4uLlxyXG4gKi8KKyAgICAgIGlmIChjb250ZW50LT50eXBlKQorICAgICAgICBjb3VudCArPSAxNiArIHN0cmxlbihjb250ZW50LT50eXBlKTsKKyAgICAgIC8qIGNvdW50IENvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IC4uLlxyXG4gKi8KKyAgICAgIHMgPSBzb2FwX3N0cl9jb2RlKG1pbWVfY29kZXMsIGNvbnRlbnQtPmVuY29kaW5nKTsKKyAgICAgIGlmIChzKQorICAgICAgICBjb3VudCArPSAyOSArIHN0cmxlbihzKTsKKyAgICAgIC8qIGNvdW50IENvbnRlbnQtSUQ6IC4uLlxyXG4gKi8KKyAgICAgIGlmIChjb250ZW50LT5pZCkKKyAgICAgICAgY291bnQgKz0gMTQgKyBzdHJsZW4oY29udGVudC0+aWQpOworICAgICAgLyogY291bnQgQ29udGVudC1Mb2NhdGlvbjogLi4uXHJcbiAqLworICAgICAgaWYgKGNvbnRlbnQtPmxvY2F0aW9uKQorICAgICAgICBjb3VudCArPSAyMCArIHN0cmxlbihjb250ZW50LT5sb2NhdGlvbik7CisgICAgICAvKiBjb3VudCBDb250ZW50LURlc2NyaXB0aW9uOiAuLi5cclxuICovCisgICAgICBpZiAoY29udGVudC0+ZGVzY3JpcHRpb24pCisgICAgICAgIGNvdW50ICs9IDIzICsgc3RybGVuKGNvbnRlbnQtPmxvY2F0aW9uKTsKKyAgICAgIC8qIGNvdW50IFxyXG4uLi5jb250ZW50ICovCisgICAgICBjb3VudCArPSAyICsgY29udGVudC0+c2l6ZTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2l6ZSBvZiBNSU1FIGF0dGFjaG1lbnQgY29udGVudCBpcyAlbHUgYnl0ZXNcbiIsICh1bnNpZ25lZCBsb25nKWNvbnRlbnQtPnNpemUpKTsKKyAgICB9CisgICAgLyogY291bnQgXHJcbi0tYm91bmRhcnktLSAqLworICAgIGNvdW50ICs9IDYgKyBuOworICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTmV3IGNvdW50IGlzICVsdSBieXRlc1xuIiwgKHVuc2lnbmVkIGxvbmcpY291bnQpKTsKKyAgcmV0dXJuIGNvdW50OworI2Vsc2UKKyAgcmV0dXJuIHNvYXAtPmNvdW50OworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzb2FwX3B1dGRpbWVmaWVsZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgc2l6ZV90IG4pCit7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIG4pKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgU09BUF9TVFJfUEFERElORywgLShsb25nKW4mMyk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9kaW1lX29wdGlvbihzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgc2hvcnQgb3B0eXBlLCBjb25zdCBjaGFyICpvcHRpb24pCit7IHNpemVfdCBuOworICBjaGFyICpzID0gTlVMTDsKKyAgaWYgKG9wdGlvbikKKyAgeyBuID0gc3RybGVuKG9wdGlvbik7CisgICAgcyA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBuICsgNSk7CisgICAgaWYgKHMpCisgICAgeyBzWzBdID0gb3B0eXBlID4+IDg7CisgICAgICBzWzFdID0gb3B0eXBlICYgMHhGRjsKKyAgICAgIHNbMl0gPSBuID4+IDg7CisgICAgICBzWzNdID0gbiAmIDB4RkY7CisgICAgICBzdHJjcHkocyArIDQsIG9wdGlvbik7CisgICAgfQorICB9CisgIHJldHVybiBzOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0ZGltZWhkcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgdW5zaWduZWQgY2hhciB0bXBbMTJdOworICBzaXplX3Qgb3B0bGVuID0gMCwgaWRsZW4gPSAwLCB0eXBlbGVuID0gMDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQdXQgRElNRSBoZWFkZXIgaWQ9JyVzJ1xuIiwgc29hcC0+ZGltZS5pZD9zb2FwLT5kaW1lLmlkOiIiKSk7CisgIGlmIChzb2FwLT5kaW1lLm9wdGlvbnMpCisgICAgb3B0bGVuID0gKCgodW5zaWduZWQgY2hhcilzb2FwLT5kaW1lLm9wdGlvbnNbMl0gPDwgOCkgfCAoKHVuc2lnbmVkIGNoYXIpc29hcC0+ZGltZS5vcHRpb25zWzNdKSkgKyA0OworICBpZiAoc29hcC0+ZGltZS5pZCkKKyAgICBpZGxlbiA9IHN0cmxlbihzb2FwLT5kaW1lLmlkKTsKKyAgaWYgKHNvYXAtPmRpbWUudHlwZSkKKyAgICB0eXBlbGVuID0gc3RybGVuKHNvYXAtPmRpbWUudHlwZSk7CisgIHRtcFswXSA9IFNPQVBfRElNRV9WRVJTSU9OIHwgKHNvYXAtPmRpbWUuZmxhZ3MgJiAweDcpOworICB0bXBbMV0gPSBzb2FwLT5kaW1lLmZsYWdzICYgMHhGMDsKKyAgdG1wWzJdID0gb3B0bGVuID4+IDg7CisgIHRtcFszXSA9IG9wdGxlbiAmIDB4RkY7CisgIHRtcFs0XSA9IGlkbGVuID4+IDg7CisgIHRtcFs1XSA9IGlkbGVuICYgMHhGRjsKKyAgdG1wWzZdID0gdHlwZWxlbiA+PiA4OworICB0bXBbN10gPSB0eXBlbGVuICYgMHhGRjsKKyAgdG1wWzhdID0gc29hcC0+ZGltZS5zaXplID4+IDI0OworICB0bXBbOV0gPSAoc29hcC0+ZGltZS5zaXplID4+IDE2KSAmIDB4RkY7CisgIHRtcFsxMF0gPSAoc29hcC0+ZGltZS5zaXplID4+IDgpICYgMHhGRjsKKyAgdG1wWzExXSA9IHNvYXAtPmRpbWUuc2l6ZSAmIDB4RkY7CisgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIChjaGFyKil0bXAsIDEyKQorICAgfHwgc29hcF9wdXRkaW1lZmllbGQoc29hcCwgc29hcC0+ZGltZS5vcHRpb25zLCBvcHRsZW4pCisgICB8fCBzb2FwX3B1dGRpbWVmaWVsZChzb2FwLCBzb2FwLT5kaW1lLmlkLCBpZGxlbikKKyAgIHx8IHNvYXBfcHV0ZGltZWZpZWxkKHNvYXAsIHNvYXAtPmRpbWUudHlwZSwgdHlwZWxlbikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dGRpbWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpKQorICAgIHJldHVybiBTT0FQX09LOworICBmb3IgKGNvbnRlbnQgPSBzb2FwLT5kaW1lLmZpcnN0OyBjb250ZW50OyBjb250ZW50ID0gY29udGVudC0+bmV4dCkKKyAgeyB2b2lkICpoYW5kbGU7CisgICAgc29hcC0+ZGltZS5zaXplID0gY29udGVudC0+c2l6ZTsKKyAgICBzb2FwLT5kaW1lLmlkID0gY29udGVudC0+aWQ7CisgICAgc29hcC0+ZGltZS50eXBlID0gY29udGVudC0+dHlwZTsKKyAgICBzb2FwLT5kaW1lLm9wdGlvbnMgPSBjb250ZW50LT5vcHRpb25zOworICAgIHNvYXAtPmRpbWUuZmxhZ3MgPSBTT0FQX0RJTUVfVkVSU0lPTiB8IFNPQVBfRElNRV9NRURJQTsKKyAgICBpZiAoc29hcC0+ZmRpbWVyZWFkb3BlbiAmJiAoKGhhbmRsZSA9IHNvYXAtPmZkaW1lcmVhZG9wZW4oc29hcCwgKHZvaWQqKWNvbnRlbnQtPnB0ciwgY29udGVudC0+aWQsIGNvbnRlbnQtPnR5cGUsIGNvbnRlbnQtPm9wdGlvbnMpKSB8fCBzb2FwLT5lcnJvcikpCisgICAgeyBzaXplX3Qgc2l6ZSA9IGNvbnRlbnQtPnNpemU7CisgICAgICBpZiAoIWhhbmRsZSkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJmZGltZXJlYWRvcGVuIGZhaWxlZFxuIikpOworICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB9CisgICAgICBpZiAoIWNvbnRlbnQtPnNpemUgJiYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfWE1MKSB8fCAoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTksgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX1NUT1JFKSkKKyAgICAgIHsgc2l6ZV90IGNodW5rc2l6ZSA9IHNpemVvZihzb2FwLT50bXBidWYpOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNodW5rZWQgc3RyZWFtaW5nIERJTUVcbiIpKTsKKyAgICAgICAgZG8gCisgICAgICAgIHsgc2l6ZSA9IHNvYXAtPmZkaW1lcmVhZChzb2FwLCBoYW5kbGUsIHNvYXAtPnRtcGJ1ZiwgY2h1bmtzaXplKTsKKyAgICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImZkaW1lcmVhZCByZXR1cm5lZCAlbHUgYnl0ZXNcbiIsICh1bnNpZ25lZCBsb25nKXNpemUpKTsKKyAgICAgICAgICBpZiAoc2l6ZSA8IGNodW5rc2l6ZSkKKyAJICB7IHNvYXAtPmRpbWUuZmxhZ3MgJj0gflNPQVBfRElNRV9DRjsKKyAgICAgICAgICAgIGlmICghY29udGVudC0+bmV4dCkKKyAgICAgICAgICAgICAgc29hcC0+ZGltZS5mbGFncyB8PSBTT0FQX0RJTUVfTUU7CisJICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgc29hcC0+ZGltZS5mbGFncyB8PSBTT0FQX0RJTUVfQ0Y7CisJICBzb2FwLT5kaW1lLnNpemUgPSBzaXplOworICAgICAgICAgIGlmIChzb2FwX3B1dGRpbWVoZHIoc29hcCkKKwkgICB8fCBzb2FwX3B1dGRpbWVmaWVsZChzb2FwLCBzb2FwLT50bXBidWYsIHNpemUpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgaWYgKHNvYXAtPmRpbWUuaWQpCisgCSAgeyBzb2FwLT5kaW1lLmZsYWdzICY9IH4oU09BUF9ESU1FX01CIHwgU09BUF9ESU1FX01FRElBKTsKKyAgICAgICAgICAgIHNvYXAtPmRpbWUuaWQgPSBOVUxMOworICAgICAgICAgICAgc29hcC0+ZGltZS50eXBlID0gTlVMTDsKKyAgICAgICAgICAgIHNvYXAtPmRpbWUub3B0aW9ucyA9IE5VTEw7CisgICAgICAgICAgfSAgCisgICAgICAgIH0gd2hpbGUgKHNpemUgPj0gY2h1bmtzaXplKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgaWYgKCFjb250ZW50LT5uZXh0KQorICAgICAgICAgIHNvYXAtPmRpbWUuZmxhZ3MgfD0gU09BUF9ESU1FX01FOworICAgICAgICBpZiAoc29hcF9wdXRkaW1laGRyKHNvYXApKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgZG8KKyAgICAgICAgeyBzaXplX3QgYnVmc2l6ZTsKKwkgIGlmIChzaXplIDwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZikpCisgICAgICAgICAgICBidWZzaXplID0gc2l6ZTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBidWZzaXplID0gc2l6ZW9mKHNvYXAtPnRtcGJ1Zik7CisgICAgICAgICAgaWYgKCEoYnVmc2l6ZSA9IHNvYXAtPmZkaW1lcmVhZChzb2FwLCBoYW5kbGUsIHNvYXAtPnRtcGJ1ZiwgYnVmc2l6ZSkpKQorICAgICAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJmZGltZXJlYWQgZmFpbGVkOiBpbnN1ZmZpY2llbnQgZGF0YSAoJWx1IGJ5dGVzIHJlbWFpbmluZyBmcm9tICVsdSBieXRlcylcbiIsICh1bnNpZ25lZCBsb25nKXNpemUsICh1bnNpZ25lZCBsb25nKXNvYXAtPmRpbWUuc2l6ZSkpOworICAgICAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKwkgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHNvYXAtPnRtcGJ1ZiwgYnVmc2l6ZSkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBzaXplIC09IGJ1ZnNpemU7CisgICAgICAgIH0gd2hpbGUgKHNpemUpOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImZkaW1lcmVhZGNsb3NlXG4iKSk7CisgICAgICAgIHNvYXBfc2VuZF9yYXcoc29hcCwgU09BUF9TVFJfUEFERElORywgLShsb25nKXNvYXAtPmRpbWUuc2l6ZSYzKTsKKyAgICAgIH0KKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZmRpbWVyZWFkY2xvc2VcbiIpKTsKKyAgICAgIGlmIChzb2FwLT5mZGltZXJlYWRjbG9zZSkKKyAgICAgICAgc29hcC0+ZmRpbWVyZWFkY2xvc2Uoc29hcCwgaGFuZGxlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgaWYgKCFjb250ZW50LT5uZXh0KQorICAgICAgICBzb2FwLT5kaW1lLmZsYWdzIHw9IFNPQVBfRElNRV9NRTsKKyAgICAgIGlmIChzb2FwX3B1dGRpbWVoZHIoc29hcCkKKyAgICAgICB8fCBzb2FwX3B1dGRpbWVmaWVsZChzb2FwLCAoY2hhciopY29udGVudC0+cHRyLCBjb250ZW50LT5zaXplKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNoYXIgKgorc29hcF9nZXRkaW1lZmllbGQoc3RydWN0IHNvYXAgKnNvYXAsIHNpemVfdCBuKQoreyByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBjaGFyICpzOworICBjaGFyICpwID0gTlVMTDsKKyAgaWYgKG4pCisgIHsgcCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBuICsgMSk7CisgICAgaWYgKHApCisgICAgeyBzID0gcDsKKyAgICAgIGZvciAoaSA9IG47IGkgPiAwOyBpLS0pCisgICAgICB7IGlmICgoaW50KShjID0gc29hcF9nZXQxKHNvYXApKSA9PSBFT0YpCisgICAgICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICAqcysrID0gKGNoYXIpYzsKKyAgICAgIH0KKyAgICAgICpzID0gJ1wwJzsKKyAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwX21vdmUoc29hcCwgLShsb25nKW4mMykpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgfQorICByZXR1cm4gcDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldGRpbWVoZHIoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgcmVnaXN0ZXIgY2hhciAqczsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIHVuc2lnbmVkIGNoYXIgdG1wWzEyXTsKKyAgc2l6ZV90IG9wdGxlbiwgaWRsZW4sIHR5cGVsZW47CisgIGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0RJTUVfRU5EOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdldCBESU1FIGhlYWRlclxuIikpOworICBpZiAoc29hcC0+ZGltZS5idWZsZW4gfHwgc29hcC0+ZGltZS5jaHVua3NpemUpCisgIHsgaWYgKHNvYXBfbW92ZShzb2FwLCAobG9uZykoc29hcC0+ZGltZS5zaXplIC0gc29hcF90ZWxsKHNvYXApKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICBzb2FwX3VuZ2V0KHNvYXAsIHNvYXBfZ2V0Y2hhcihzb2FwKSk7IC8qIHNraXAgcGFkZGluZyBhbmQgZ2V0IGhkciAqLworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiLi4uIEZyb20gY2h1bmtlZFxuIikpOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIHMgPSAoY2hhciopdG1wOworICBmb3IgKGkgPSAxMjsgaSA+IDA7IGktLSkKKyAgeyBpZiAoKGludCkoYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKSkgPT0gRU9GKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgKnMrKyA9IChjaGFyKWM7CisgIH0KKyAgaWYgKCh0bXBbMF0gJiAweEY4KSAhPSBTT0FQX0RJTUVfVkVSU0lPTikKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0RJTUVfTUlTTUFUQ0g7CisgIHNvYXAtPmRpbWUuZmxhZ3MgPSAodG1wWzBdICYgMHg3KSB8ICh0bXBbMV0gJiAweEYwKTsKKyAgb3B0bGVuID0gKHRtcFsyXSA8PCA4KSB8IHRtcFszXTsKKyAgaWRsZW4gPSAodG1wWzRdIDw8IDgpIHwgdG1wWzVdOworICB0eXBlbGVuID0gKHRtcFs2XSA8PCA4KSB8IHRtcFs3XTsKKyAgc29hcC0+ZGltZS5zaXplID0gKHRtcFs4XSA8PCAyNCkgfCAodG1wWzldIDw8IDE2KSB8ICh0bXBbMTBdIDw8IDgpIHwgdG1wWzExXTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJESU1FIHNpemU9JWx1IGZsYWdzPTB4JVhcbiIsICh1bnNpZ25lZCBsb25nKXNvYXAtPmRpbWUuc2l6ZSwgc29hcC0+ZGltZS5mbGFncykpOworICBpZiAoIShzb2FwLT5kaW1lLm9wdGlvbnMgPSBzb2FwX2dldGRpbWVmaWVsZChzb2FwLCBvcHRsZW4pKSAmJiBzb2FwLT5lcnJvcikKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmICghKHNvYXAtPmRpbWUuaWQgPSBzb2FwX2dldGRpbWVmaWVsZChzb2FwLCBpZGxlbikpICYmIHNvYXAtPmVycm9yKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKCEoc29hcC0+ZGltZS50eXBlID0gc29hcF9nZXRkaW1lZmllbGQoc29hcCwgdHlwZWxlbikpICYmIHNvYXAtPmVycm9yKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJESU1FIGlkPSVzLCB0eXBlPSVzLCBvcHRpb25zPSVzXG4iLCBzb2FwLT5kaW1lLmlkP3NvYXAtPmRpbWUuaWQ6IiIsIHNvYXAtPmRpbWUudHlwZT9zb2FwLT5kaW1lLnR5cGU6IiIsIHNvYXAtPmRpbWUub3B0aW9ucz9zb2FwLT5kaW1lLm9wdGlvbnMrNDoiIikpOworICBpZiAoc29hcC0+ZGltZS5mbGFncyAmIFNPQVBfRElNRV9NRSkKKyAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0VOQ19ESU1FOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldGRpbWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHdoaWxlIChzb2FwLT5kaW1lLmZsYWdzICYgU09BUF9ESU1FX0NGKQorICB7IGlmIChzb2FwX2dldGRpbWVoZHIoc29hcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHNvYXBfbW92ZShzb2FwLCBzb2FwLT5kaW1lLnNpemUpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIH0KKyAgaWYgKHNvYXBfbW92ZShzb2FwLCAoKHNvYXAtPmRpbWUuc2l6ZSszKSYofjMpKS1zb2FwX3RlbGwoc29hcCkpKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICBmb3IgKDs7KQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgICBpZiAoc29hcF9nZXRkaW1laGRyKHNvYXApKQorICAgICAgYnJlYWs7CisgICAgaWYgKHNvYXAtPmZkaW1ld3JpdGVvcGVuICYmICgoc29hcC0+ZGltZS5wdHIgPSAoY2hhciopc29hcC0+ZmRpbWV3cml0ZW9wZW4oc29hcCwgc29hcC0+ZGltZS5pZCwgc29hcC0+ZGltZS50eXBlLCBzb2FwLT5kaW1lLm9wdGlvbnMpKSB8fCBzb2FwLT5lcnJvcikpCisgICAgeyBjb25zdCBjaGFyICppZCwgKnR5cGUsICpvcHRpb25zOworICAgICAgc2l6ZV90IHNpemUsIG47CisgICAgICBpZiAoIXNvYXAtPmRpbWUucHRyKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBpZCA9IHNvYXAtPmRpbWUuaWQ7CisgICAgICB0eXBlID0gc29hcC0+ZGltZS50eXBlOworICAgICAgb3B0aW9ucyA9IHNvYXAtPmRpbWUub3B0aW9uczsKKyAgICAgIGZvciAoOzspCisgICAgICB7IHNpemUgPSBzb2FwLT5kaW1lLnNpemU7CisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsgbiA9IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICAgICAgICBpZiAoc2l6ZSA8IG4pCisgICAgICAgICAgICBuID0gc2l6ZTsKKyAgICAgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZmRpbWV3cml0ZShzb2FwLCAodm9pZCopc29hcC0+ZGltZS5wdHIsIHNvYXAtPmJ1ZiArIHNvYXAtPmJ1ZmlkeCwgbikpKQorICAgICAgICAgICAgYnJlYWs7CisJICBzaXplIC09IG47CisJICBpZiAoIXNpemUpCisJICB7IHNvYXAtPmJ1ZmlkeCArPSBuOworCSAgICBicmVhazsKKwkgIH0KKwkgIGlmIChzb2FwX3JlY3Yoc29hcCkpCisgICAgICAgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworCSAgICBnb3RvIGVuZDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvYXBfbW92ZShzb2FwLCAtKGxvbmcpc29hcC0+ZGltZS5zaXplJjMpKQorICAgICAgICB7IHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisJICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShzb2FwLT5kaW1lLmZsYWdzICYgU09BUF9ESU1FX0NGKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKHNvYXBfZ2V0ZGltZWhkcihzb2FwKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KK2VuZDoKKyAgICAgIGlmIChzb2FwLT5mZGltZXdyaXRlY2xvc2UpCisgICAgICAgIHNvYXAtPmZkaW1ld3JpdGVjbG9zZShzb2FwLCAodm9pZCopc29hcC0+ZGltZS5wdHIpOworICAgICAgc29hcC0+ZGltZS5zaXplID0gMDsKKyAgICAgIHNvYXAtPmRpbWUuaWQgPSBpZDsKKyAgICAgIHNvYXAtPmRpbWUudHlwZSA9IHR5cGU7CisgICAgICBzb2FwLT5kaW1lLm9wdGlvbnMgPSBvcHRpb25zOworICAgIH0KKyAgICBlbHNlIGlmIChzb2FwLT5kaW1lLmZsYWdzICYgU09BUF9ESU1FX0NGKQorICAgIHsgY29uc3QgY2hhciAqaWQsICp0eXBlLCAqb3B0aW9uczsKKyAgICAgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgICAgIHJlZ2lzdGVyIGNoYXIgKnM7CisgICAgICByZWdpc3RlciBpbnQgaTsKKyAgICAgIGlkID0gc29hcC0+ZGltZS5pZDsKKyAgICAgIHR5cGUgPSBzb2FwLT5kaW1lLnR5cGU7CisgICAgICBvcHRpb25zID0gc29hcC0+ZGltZS5vcHRpb25zOworICAgICAgaWYgKHNvYXBfbmV3X2Jsb2NrKHNvYXApKQorICAgICAgICByZXR1cm4gU09BUF9FT007CisgICAgICBmb3IgKDs7KQorICAgICAgeyBzID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBzb2FwLT5kaW1lLnNpemUpOworICAgICAgICBpZiAoIXMpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICAgIGZvciAoaSA9IHNvYXAtPmRpbWUuc2l6ZTsgaSA+IDA7IGktLSkKKyAgICAgICAgeyBpZiAoKGludCkoYyA9IHNvYXBfZ2V0MShzb2FwKSkgPT0gRU9GKQorICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgICAgICAgKnMrKyA9IChjaGFyKWM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvYXBfbW92ZShzb2FwLCAtKGxvbmcpc29hcC0+ZGltZS5zaXplJjMpKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgICAgICBpZiAoIShzb2FwLT5kaW1lLmZsYWdzICYgU09BUF9ESU1FX0NGKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKHNvYXBfZ2V0ZGltZWhkcihzb2FwKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB9CisgICAgICBzb2FwLT5kaW1lLnNpemUgPSBzb2FwLT5ibGlzdC0+c2l6ZSsrOyAvKiBhbGxvY2F0ZSBvbmUgbW9yZSBmb3IgJ1wwJyAqLworICAgICAgaWYgKCEoc29hcC0+ZGltZS5wdHIgPSBzb2FwX3NhdmVfYmxvY2soc29hcCwgTlVMTCwgMCkpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBzb2FwLT5kaW1lLnB0cltzb2FwLT5kaW1lLnNpemVdID0gJ1wwJzsgLyogZm9yY2UgMC10ZXJtaW5hdGVkICovCisgICAgICBzb2FwLT5kaW1lLmlkID0gaWQ7CisgICAgICBzb2FwLT5kaW1lLnR5cGUgPSB0eXBlOworICAgICAgc29hcC0+ZGltZS5vcHRpb25zID0gb3B0aW9uczsKKyAgICB9CisgICAgZWxzZQorICAgICAgc29hcC0+ZGltZS5wdHIgPSBzb2FwX2dldGRpbWVmaWVsZChzb2FwLCBzb2FwLT5kaW1lLnNpemUpOworICAgIGNvbnRlbnQgPSBzb2FwX25ld19tdWx0aXBhcnQoc29hcCwgJnNvYXAtPmRpbWUuZmlyc3QsICZzb2FwLT5kaW1lLmxhc3QsIHNvYXAtPmRpbWUucHRyLCBzb2FwLT5kaW1lLnNpemUpOworICAgIGlmICghY29udGVudCkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIGNvbnRlbnQtPmlkID0gc29hcC0+ZGltZS5pZDsKKyAgICBjb250ZW50LT50eXBlID0gc29hcC0+ZGltZS50eXBlOworICAgIGNvbnRlbnQtPm9wdGlvbnMgPSBzb2FwLT5kaW1lLm9wdGlvbnM7CisgICAgc29hcF9yZXNvbHZlX2F0dGFjaG1lbnQoc29hcCwgY29udGVudCk7CisgICAgaWYgKHNvYXAtPmVycm9yKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmIChzb2FwLT5lcnJvciAhPSBTT0FQX0RJTUVfRU5EKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldG1pbWVoZHIoc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgZG8KKyAgeyBpZiAoc29hcF9nZXRsaW5lKHNvYXAsIHNvYXAtPm1zZ2J1Ziwgc2l6ZW9mKHNvYXAtPm1zZ2J1ZikpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHdoaWxlICghKnNvYXAtPm1zZ2J1Zik7CisgIGlmIChzb2FwLT5tc2didWZbMF0gPT0gJy0nICYmIHNvYXAtPm1zZ2J1ZlsxXSA9PSAnLScpCisgIHsgY2hhciAqcyA9IHNvYXAtPm1zZ2J1ZiArIHN0cmxlbihzb2FwLT5tc2didWYpIC0gMTsKKyAgICAvKiByZW1vdmUgd2hpdGUgc3BhY2UgKi8KKyAgICB3aGlsZSAoc29hcF9ibGFuaygqcykpCisgICAgICBzLS07CisgICAgc1sxXSA9ICdcMCc7CisgICAgaWYgKHNvYXAtPm1pbWUuYm91bmRhcnkpCisgICAgeyBpZiAoc3RyY21wKHNvYXAtPm1zZ2J1ZiArIDIsIHNvYXAtPm1pbWUuYm91bmRhcnkpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX01JTUVfRVJST1I7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHNvYXAtPm1pbWUuYm91bmRhcnkgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT5tc2didWYgKyAyKTsKKyAgICBpZiAoc29hcF9nZXRsaW5lKHNvYXAsIHNvYXAtPm1zZ2J1Ziwgc2l6ZW9mKHNvYXAtPm1zZ2J1ZikpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmIChzb2FwX3NldF9taW1lX2F0dGFjaG1lbnQoc29hcCwgTlVMTCwgMCwgU09BUF9NSU1FX05PTkUsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICBjb250ZW50ID0gc29hcC0+bWltZS5sYXN0OworICBmb3IgKDs7KQorICB7IHJlZ2lzdGVyIGNoYXIgKmtleSA9IHNvYXAtPm1zZ2J1ZjsKKyAgICByZWdpc3RlciBjaGFyICp2YWw7CisgICAgaWYgKCEqa2V5KQorICAgICAgYnJlYWs7CisgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk1JTUUgaGVhZGVyOiAlc1xuIiwga2V5KSk7CisgICAgdmFsID0gc3RyY2hyKHNvYXAtPm1zZ2J1ZiwgJzonKTsKKyAgICBpZiAodmFsKQorICAgIHsgKnZhbCA9ICdcMCc7CisgICAgICBkbyB2YWwrKzsKKyAgICAgIHdoaWxlICgqdmFsICYmICp2YWwgPD0gMzIpOworICAgICAgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1JRCIpKQorICAgICAgICBjb250ZW50LT5pZCA9IHNvYXBfc3RyZHVwKHNvYXAsIHZhbCk7CisgICAgICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtTG9jYXRpb24iKSkKKyAgICAgICAgY29udGVudC0+bG9jYXRpb24gPSBzb2FwX3N0cmR1cChzb2FwLCB2YWwpOworICAgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LURpc3Bvc2l0aW9uIikpCisgICAgICAgIGNvbnRlbnQtPmlkID0gc29hcF9zdHJkdXAoc29hcCwgc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwsICJuYW1lIikpOworICAgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LVR5cGUiKSkKKyAgICAgICAgY29udGVudC0+dHlwZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHZhbCk7CisgICAgICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtRGVzY3JpcHRpb24iKSkKKyAgICAgICAgY29udGVudC0+ZGVzY3JpcHRpb24gPSBzb2FwX3N0cmR1cChzb2FwLCB2YWwpOworICAgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIikpCisgICAgICAgIGNvbnRlbnQtPmVuY29kaW5nID0gKGVudW0gc29hcF9taW1lX2VuY29kaW5nKXNvYXBfaW50X2NvZGUobWltZV9jb2RlcywgdmFsLCAobG9uZylTT0FQX01JTUVfTk9ORSk7CisgICAgfQorICAgIGlmIChzb2FwX2dldGxpbmUoc29hcCwga2V5LCBzaXplb2Yoc29hcC0+bXNnYnVmKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRtaW1lKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzb2FwX3djaGFyIGMgPSAwOworICBpZiAoIXNvYXAtPm1pbWUubGFzdCkKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgZm9yICg7OykKKyAgeyByZWdpc3RlciBzaXplX3QgaSwgbSA9IDA7CisgICAgcmVnaXN0ZXIgY2hhciAqcywgKnQgPSBOVUxMOworICAgIHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudCA9IHNvYXAtPm1pbWUubGFzdDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlBhcnNpbmcgTUlNRSBjb250ZW50IGlkPSVzIHR5cGU9JXNcbiIsIGNvbnRlbnQtPmlkP2NvbnRlbnQtPmlkOiIiLCBjb250ZW50LT50eXBlP2NvbnRlbnQtPnR5cGU6IiIpKTsKKyAgICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICBmb3IgKDs7KQorICAgIHsgcmVnaXN0ZXIgc2hvcnQgZmxhZyA9IDA7CisgICAgICBpZiAoIShzID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBTT0FQX0JMS0xFTikpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0JMS0xFTjsgaSsrKQorICAgICAgeyBpZiAobSA+IDApCisgICAgICAgIHsgKnMrKyA9ICp0Kys7CisJICBtLS07CisJfQorCWVsc2UKKyAgICAgICAgeyBpZiAoIWZsYWcpCisJICB7IGMgPSBzb2FwX2dldDEoc29hcCk7CisJICAgIGlmICgoaW50KWMgPT0gRU9GKQorCSAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworCSAgfQorCSAgaWYgKGZsYWcgfHwgYyA9PSAnXHInKQorCSAgeyB0ID0gc29hcC0+dG1wYnVmOworCSAgICBtZW1zZXQodCwgMCwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZikpOworICAgICAgICAgICAgc3RyY3B5KHQsICJcbi0tIik7CisgICAgICAgICAgICBpZiAoc29hcC0+bWltZS5ib3VuZGFyeSkKKwkgICAgICBzdHJuY2F0KHQsIHNvYXAtPm1pbWUuYm91bmRhcnksIHNpemVvZihzb2FwLT50bXBidWYpLTQpOworCSAgICBkbyBjID0gc29hcF9nZXRjaGFyKHNvYXApOworCSAgICB3aGlsZSAoYyA9PSAqdCsrKTsKKwkgICAgaWYgKChpbnQpYyA9PSBFT0YpCisJICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisJICAgIGlmICghKi0tdCkKKwkgICAgICBnb3RvIGVuZDsKKwkgICAgKnQgPSAoY2hhciljOworCSAgICBmbGFnID0gKGMgPT0gJ1xyJyk7CisJICAgIG0gPSB0IC0gc29hcC0+dG1wYnVmICsgMSAtIGZsYWc7CisJICAgIHQgPSBzb2FwLT50bXBidWY7CisJICAgIGMgPSAnXHInOworCSAgfQorCSAgKnMrKyA9IChjaGFyKWM7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CitlbmQ6CisgICAgKnMgPSAnXDAnOyAvKiBmb3JjZSAwLXRlcm1pbmF0ZWQgKi8KKyAgICBjb250ZW50LT5zaXplID0gc29hcF9zaXplX2Jsb2NrKHNvYXAsIGkrMSktMTsKKyAgICBjb250ZW50LT5wdHIgPSBzb2FwX3NhdmVfYmxvY2soc29hcCwgTlVMTCwgMCk7CisgICAgc29hcF9yZXNvbHZlX2F0dGFjaG1lbnQoc29hcCwgY29udGVudCk7CisgICAgaWYgKGMgPT0gJy0nICYmIHNvYXBfZ2V0Y2hhcihzb2FwKSA9PSAnLScpCisgICAgICBicmVhazsKKyAgICB3aGlsZSAoYyAhPSAnXHInICYmIChpbnQpYyAhPSBFT0YgJiYgc29hcF9ibGFuayhjKSkKKyAgICAgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgICAgaWYgKGMgIT0gJ1xyJyB8fCBzb2FwX2dldGNoYXIoc29hcCkgIT0gJ1xuJykKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTUlNRV9FUlJPUjsKKyAgICBpZiAoc29hcF9nZXRtaW1laGRyKHNvYXApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzb2FwX21hdGNoX2NpZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqdCkKK3sgcmVnaXN0ZXIgc2l6ZV90IG47CisgIGlmICghcykKKyAgICByZXR1cm4gMTsKKyAgaWYgKCFzdHJjbXAocywgdCkpCisgICAgcmV0dXJuIDA7CisgIGlmICghc3RybmNtcChzLCAiY2lkOiIsIDQpKQorICAgIHMgKz0gNDsKKyAgbiA9IHN0cmxlbih0KTsKKyAgaWYgKCp0ID09ICc8JykKKyAgeyB0Kys7CisgICAgbiAtPSAyOworICB9CisgIGlmICghc3RybmNtcChzLCB0LCBuKSAmJiAhc1tuXSkKKyAgICByZXR1cm4gMDsKKyAgc29hcF9kZWNvZGUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgcywgU09BUF9TVFJfRU9TKTsKKyAgaWYgKCFzdHJuY21wKHNvYXAtPnRtcGJ1ZiwgdCwgbikgJiYgIXNvYXAtPnRtcGJ1ZltuXSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIDE7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyB2b2lkCitzb2FwX3Jlc29sdmVfYXR0YWNobWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50KQoreyBpZiAoY29udGVudC0+aWQpCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfeGxpc3QgKip4cCA9ICZzb2FwLT54bGlzdDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc29sdmluZyBhdHRhY2htZW50IGRhdGEgZm9yIGlkPSVzXG4iLCBjb250ZW50LT5pZCkpOworICAgIHdoaWxlICgqeHApCisgICAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF94bGlzdCAqeHEgPSAqeHA7CisgICAgICBpZiAoIXNvYXBfbWF0Y2hfY2lkKHNvYXAsIHhxLT5pZCwgY29udGVudC0+aWQpKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZvdW5kIG1hdGNoaW5nIGF0dGFjaG1lbnQgJXMgZm9yIGNvbnRlbnQgaWQ9JXNcbiIsIHhxLT5pZCwgY29udGVudC0+aWQpKTsKKwkqeHAgPSB4cS0+bmV4dDsKKyAgICAgICAgKnhxLT5wdHIgPSAodW5zaWduZWQgY2hhciopY29udGVudC0+cHRyOworICAgICAgICAqeHEtPnNpemUgPSAoaW50KWNvbnRlbnQtPnNpemU7CisgICAgICAgICp4cS0+dHlwZSA9IChjaGFyKiljb250ZW50LT50eXBlOworCWlmIChjb250ZW50LT5vcHRpb25zKQorICAgICAgICAgICp4cS0+b3B0aW9ucyA9IChjaGFyKiljb250ZW50LT5vcHRpb25zOworICAgICAgICBlbHNlCisgICAgICAgICAgKnhxLT5vcHRpb25zID0gKGNoYXIqKWNvbnRlbnQtPmRlc2NyaXB0aW9uOworCVNPQVBfRlJFRShzb2FwLCB4cSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHhwID0gJigqeHApLT5uZXh0OworICAgIH0KKyAgfQorfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0bWltZWhkcihzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50KQoreyBjb25zdCBjaGFyICpzOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk1JTUUgYXR0YWNobWVudCB0eXBlPSVzXG4iLCBjb250ZW50LT50eXBlP2NvbnRlbnQtPnR5cGU6IiIpKTsKKyAgaWYgKHNvYXBfc2VuZDMoc29hcCwgIlxyXG4tLSIsIHNvYXAtPm1pbWUuYm91bmRhcnksICJcclxuIikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoY29udGVudC0+dHlwZSAmJiBzb2FwX3NlbmQzKHNvYXAsICJDb250ZW50LVR5cGU6ICIsIGNvbnRlbnQtPnR5cGUsICJcclxuIikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBzID0gc29hcF9zdHJfY29kZShtaW1lX2NvZGVzLCBjb250ZW50LT5lbmNvZGluZyk7CisgIGlmIChzICYmIHNvYXBfc2VuZDMoc29hcCwgIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6ICIsIHMsICJcclxuIikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoY29udGVudC0+aWQgJiYgc29hcF9zZW5kMyhzb2FwLCAiQ29udGVudC1JRDogIiwgY29udGVudC0+aWQsICJcclxuIikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoY29udGVudC0+bG9jYXRpb24gJiYgc29hcF9zZW5kMyhzb2FwLCAiQ29udGVudC1Mb2NhdGlvbjogIiwgY29udGVudC0+bG9jYXRpb24sICJcclxuIikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoY29udGVudC0+ZGVzY3JpcHRpb24gJiYgc29hcF9zZW5kMyhzb2FwLCAiQ29udGVudC1EZXNjcmlwdGlvbjogIiwgY29udGVudC0+ZGVzY3JpcHRpb24sICJcclxuIikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCAiXHJcbiIsIDIpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0bWltZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkgfHwgIXNvYXAtPm1pbWUuYm91bmRhcnkpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2VuZGluZyBNSU1FIGF0dGFjaG1lbnRzXG4iKSk7CisgIGZvciAoY29udGVudCA9IHNvYXAtPm1pbWUuZmlyc3Q7IGNvbnRlbnQ7IGNvbnRlbnQgPSBjb250ZW50LT5uZXh0KQorICAgIGlmIChzb2FwX3B1dG1pbWVoZHIoc29hcCwgY29udGVudCkKKyAgICAgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCBjb250ZW50LT5wdHIsIGNvbnRlbnQtPnNpemUpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9zZW5kMyhzb2FwLCAiXHJcbi0tIiwgc29hcC0+bWltZS5ib3VuZGFyeSwgIi0tIik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2RpbWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPm9tb2RlIHw9IFNPQVBfRU5DX0RJTUU7CisgIHNvYXAtPmRpbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmxhc3QgPSBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9taW1lKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpib3VuZGFyeSwgY29uc3QgY2hhciAqc3RhcnQpCit7IHNvYXAtPm9tb2RlIHw9IFNPQVBfRU5DX01JTUU7CisgIHNvYXAtPm1pbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmxhc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gc29hcF9zdHJkdXAoc29hcCwgYm91bmRhcnkpOworICBzb2FwLT5taW1lLnN0YXJ0ID0gc29hcF9zdHJkdXAoc29hcCwgc3RhcnQpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2Nscl9kaW1lKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5vbW9kZSAmPSB+U09BUF9FTkNfRElNRTsKKyAgc29hcC0+ZGltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGFzdCA9IE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfY2xyX21pbWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPm9tb2RlICY9IH5TT0FQX0VOQ19NSU1FOworICBzb2FwLT5taW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5sYXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5ib3VuZGFyeSA9IE5VTEw7CisgIHNvYXAtPm1pbWUuc3RhcnQgPSBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc3RydWN0IHNvYXBfbXVsdGlwYXJ0Kgorc29hcF9uZXdfbXVsdGlwYXJ0KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKipmaXJzdCwgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICoqbGFzdCwgY2hhciAqcHRyLCBzaXplX3Qgc2l6ZSkKK3sgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICBjb250ZW50ID0gKHN0cnVjdCBzb2FwX211bHRpcGFydCopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX211bHRpcGFydCkpOworICBpZiAoY29udGVudCkKKyAgeyBjb250ZW50LT5uZXh0ID0gTlVMTDsKKyAgICBjb250ZW50LT5wdHIgPSBwdHI7CisgICAgY29udGVudC0+c2l6ZSA9IHNpemU7CisgICAgY29udGVudC0+aWQgPSBOVUxMOworICAgIGNvbnRlbnQtPnR5cGUgPSBOVUxMOworICAgIGNvbnRlbnQtPm9wdGlvbnMgPSBOVUxMOworICAgIGNvbnRlbnQtPmVuY29kaW5nID0gU09BUF9NSU1FX05PTkU7CisgICAgY29udGVudC0+bG9jYXRpb24gPSBOVUxMOworICAgIGNvbnRlbnQtPmRlc2NyaXB0aW9uID0gTlVMTDsKKyAgICBpZiAoISpmaXJzdCkKKyAgICAgICpmaXJzdCA9IGNvbnRlbnQ7CisgICAgaWYgKCpsYXN0KQorICAgICAgKCpsYXN0KS0+bmV4dCA9IGNvbnRlbnQ7CisgICAgKmxhc3QgPSBjb250ZW50OworICB9CisgIHJldHVybiBjb250ZW50OworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2RpbWVfYXR0YWNobWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqcHRyLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqaWQsIHVuc2lnbmVkIHNob3J0IG9wdHlwZSwgY29uc3QgY2hhciAqb3B0aW9uKQoreyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQgPSBzb2FwX25ld19tdWx0aXBhcnQoc29hcCwgJnNvYXAtPmRpbWUuZmlyc3QsICZzb2FwLT5kaW1lLmxhc3QsIHB0ciwgc2l6ZSk7CisgIGlmICghY29udGVudCkKKyAgICByZXR1cm4gU09BUF9FT007CisgIGNvbnRlbnQtPmlkID0gc29hcF9zdHJkdXAoc29hcCwgaWQpOworICBjb250ZW50LT50eXBlID0gc29hcF9zdHJkdXAoc29hcCwgdHlwZSk7CisgIGNvbnRlbnQtPm9wdGlvbnMgPSBzb2FwX2RpbWVfb3B0aW9uKHNvYXAsIG9wdHlwZSwgb3B0aW9uKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZXRfbWltZV9hdHRhY2htZW50KHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpwdHIsIHNpemVfdCBzaXplLCBlbnVtIHNvYXBfbWltZV9lbmNvZGluZyBlbmNvZGluZywgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKmxvY2F0aW9uLCBjb25zdCBjaGFyICpkZXNjcmlwdGlvbikKK3sgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50ID0gc29hcF9uZXdfbXVsdGlwYXJ0KHNvYXAsICZzb2FwLT5taW1lLmZpcnN0LCAmc29hcC0+bWltZS5sYXN0LCBwdHIsIHNpemUpOworICBpZiAoIWNvbnRlbnQpCisgICAgcmV0dXJuIFNPQVBfRU9NOworICBjb250ZW50LT5pZCA9IHNvYXBfc3RyZHVwKHNvYXAsIGlkKTsKKyAgY29udGVudC0+dHlwZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHR5cGUpOworICBjb250ZW50LT5lbmNvZGluZyA9IGVuY29kaW5nOworICBjb250ZW50LT5sb2NhdGlvbiA9IHNvYXBfc3RyZHVwKHNvYXAsIGxvY2F0aW9uKTsKKyAgY29udGVudC0+ZGVzY3JpcHRpb24gPSBzb2FwX3N0cmR1cChzb2FwLCBkZXNjcmlwdGlvbik7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqCitTT0FQX0ZNQUMyCitzb2FwX25leHRfbXVsdGlwYXJ0KHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudCkKK3sgaWYgKGNvbnRlbnQpCisgICAgcmV0dXJuIGNvbnRlbnQtPm5leHQ7CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZAorc29hcF9zZWxlY3RfbWltZV9ib3VuZGFyeShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgd2hpbGUgKCFzb2FwLT5taW1lLmJvdW5kYXJ5IHx8IHNvYXBfdmFsaWRfbWltZV9ib3VuZGFyeShzb2FwKSkKKyAgeyByZWdpc3RlciBjaGFyICpzID0gc29hcC0+bWltZS5ib3VuZGFyeTsKKyAgICByZWdpc3RlciBzaXplX3QgbiA9IDA7CisgICAgaWYgKHMpCisgICAgICBuID0gc3RybGVuKHMpOworICAgIGlmIChuIDwgMTYpCisgICAgeyBuID0gNjQ7CisgICAgICBzID0gc29hcC0+bWltZS5ib3VuZGFyeSA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBuICsgMSk7CisgICAgICBpZiAoIXMpCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RyY3B5KHMsICI9PSIpOworICAgIHMgKz0gMjsKKyAgICBuIC09IDQ7CisgICAgd2hpbGUgKG4pCisgICAgeyAqcysrID0gc29hcF9iYXNlNjRvW3NvYXBfcmFuZG9tICYgMHgzRl07CisgICAgICBuLS07CisgICAgfQorICAgIHN0cmNweShzLCAiPT0iKTsKKyAgfQorICBpZiAoIXNvYXAtPm1pbWUuc3RhcnQpCisgICAgc29hcC0+bWltZS5zdGFydCA9ICI8U09BUC1FTlY6RW52ZWxvcGU+IjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc29hcF92YWxpZF9taW1lX2JvdW5kYXJ5KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgIHJlZ2lzdGVyIHNpemVfdCBrID0gc3RybGVuKHNvYXAtPm1pbWUuYm91bmRhcnkpOworICBmb3IgKGNvbnRlbnQgPSBzb2FwLT5taW1lLmZpcnN0OyBjb250ZW50OyBjb250ZW50ID0gY29udGVudC0+bmV4dCkKKyAgeyBpZiAoY29udGVudC0+cHRyICYmIGNvbnRlbnQtPnNpemUgPj0gaykKKyAgICB7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnAgPSAoY29uc3QgY2hhciopY29udGVudC0+cHRyOyAKKyAgICAgIHJlZ2lzdGVyIHNpemVfdCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IGNvbnRlbnQtPnNpemUgLSBrOyBpKyssIHArKykKKyAgICAgICAgaWYgKCFzdHJuY21wKHAsIHNvYXAtPm1pbWUuYm91bmRhcnksIGspKQorICAgICAgICAgIHJldHVybiBTT0FQX0VSUjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqCUhUVFAgY29va2llIGhhbmRsaW5nCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIFdJVEhfQ09PS0lFUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3NpemVfdAorU09BUF9GTUFDMgorc29hcF9lbmNvZGVfY29va2llKGNvbnN0IGNoYXIgKnMsIGNoYXIgKnQsIHNpemVfdCBsZW4pCit7IHJlZ2lzdGVyIGludCBjOworICByZWdpc3RlciBzaXplX3QgbiA9IGxlbjsKKyAgd2hpbGUgKChjID0gKnMrKykgJiYgLS1uID4gMCkKKyAgeyBpZiAoYyA+ICcgJyAmJiBjIDwgMTI4ICYmICFzdHJjaHIoIigpPD5ALDs6XFxcIi9bXT89e30iLCBjKSkKKyAgICAgICp0KysgPSBjOworICAgIGVsc2UgaWYgKG4gPiAyKQorICAgIHsgKnQrKyA9ICclJzsKKyAgICAgICp0KysgPSAoYyA+PiA0KSArIChjID4gMTU5ID8gJzcnIDogJzAnKTsKKyAgICAgIGMgJj0gMHhGOworICAgICAgKnQrKyA9IGMgKyAoYyA+IDkgPyAnNycgOiAnMCcpOworICAgICAgbiAtPSAyOworICAgIH0KKyAgICBlbHNlCisgICAgICBicmVhazsKKyAgfQorICAqdCA9ICdcMCc7CisgIHJldHVybiBsZW4gLSBuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQorc3RydWN0IHNvYXBfY29va2llKgorU09BUF9GTUFDMgorc29hcF9jb29raWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBzaXplX3QgbjsKKyAgaWYgKCFkb21haW4pCisgICAgZG9tYWluID0gc29hcC0+Y29va2llX2RvbWFpbjsKKyAgaWYgKCFwYXRoKQorICAgIHBhdGggPSBzb2FwLT5jb29raWVfcGF0aDsKKyAgaWYgKCpwYXRoID09ICcvJykKKyAgICBwYXRoKys7CisgIG4gPSBzdHJsZW4ocGF0aCk7CisgIGZvciAocCA9IHNvYXAtPmNvb2tpZXM7IHA7IHAgPSBwLT5uZXh0KQorICAgIGlmICghc3RyY21wKHAtPm5hbWUsIG5hbWUpCisgICAgICYmIGRvbWFpbgorICAgICAmJiBwLT5kb21haW4KKyAgICAgJiYgIXN0cmNtcChwLT5kb21haW4sIGRvbWFpbikKKyAgICAgJiYgIXN0cm5jbXAocC0+cGF0aCwgcGF0aCwgbikpCisgICAgICBicmVhazsKKyAgcmV0dXJuIHA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcF9jb29raWUqCitTT0FQX0ZNQUMyCitzb2FwX3NldF9jb29raWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqKnAsICpxOworICBpbnQgbjsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTZXQgY29va2llOiAlcz0lcyBkb21haW49JXMgcGF0aD0lc1xuIiwgbmFtZSwgdmFsdWU/dmFsdWU6IiIsIGRvbWFpbj9kb21haW46IiIsIHBhdGg/cGF0aDoiIikpOworICBpZiAoIWRvbWFpbikKKyAgICBkb21haW4gPSBzb2FwLT5jb29raWVfZG9tYWluOworICBpZiAoIXBhdGgpCisgICAgcGF0aCA9IHNvYXAtPmNvb2tpZV9wYXRoOworICBpZiAoIXBhdGgpCisgIHsgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIkNvb2tpZSBwYXRoIG5vdCBzZXQiLCBOVUxMLCBTT0FQX0hUVFBfRVJST1IpOworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmICgqcGF0aCA9PSAnLycpCisgICAgcGF0aCsrOworICBxID0gc29hcF9jb29raWUoc29hcCwgbmFtZSwgZG9tYWluLCBwYXRoKTsKKyAgaWYgKCFxKQorICB7IGlmICgocSA9IChzdHJ1Y3Qgc29hcF9jb29raWUqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9jb29raWUpKSkpCisgICAgeyBpZiAoKHEtPm5hbWUgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKG5hbWUpKzEpKSkKKyAgICAgICAgc3RyY3B5KHEtPm5hbWUsIG5hbWUpOworICAgICAgcS0+dmFsdWUgPSBOVUxMOworICAgICAgcS0+ZG9tYWluID0gTlVMTDsKKyAgICAgIHEtPnBhdGggPSBOVUxMOworICAgICAgcS0+ZXhwaXJlID0gLTE7CisgICAgICBxLT52ZXJzaW9uID0gMDsKKyAgICAgIHEtPnNlY3VyZSA9IDA7CisgICAgICBxLT5tb2RpZmllZCA9IDA7CisgICAgICBmb3IgKHAgPSAmc29hcC0+Y29va2llcywgbiA9IHNvYXAtPmNvb2tpZV9tYXg7ICpwICYmIG47IHAgPSAmKCpwKS0+bmV4dCwgbi0tKQorICAgICAgICBpZiAoIXN0cmNtcCgoKnApLT5uYW1lLCBuYW1lKSAmJiAoKnApLT5wYXRoICYmIHN0cmNtcCgoKnApLT5wYXRoLCBwYXRoKSA8IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICBpZiAobikKKyAgICAgIHsgcS0+bmV4dCA9ICpwOworICAgICAgICAqcCA9IHE7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IFNPQVBfRlJFRShzb2FwLCBxLT5uYW1lKTsKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHEpOworICAgICAgICBxID0gTlVMTDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZQorICAgIHEtPm1vZGlmaWVkID0gMTsKKyAgaWYgKHEpCisgIHsgaWYgKHEtPnZhbHVlKQorICAgIHsgU09BUF9GUkVFKHNvYXAsIHEtPnZhbHVlKTsKKyAgICAgIHEtPnZhbHVlID0gTlVMTDsKKyAgICB9CisgICAgaWYgKHEtPmRvbWFpbikKKyAgICB7IFNPQVBfRlJFRShzb2FwLCBxLT5kb21haW4pOworICAgICAgcS0+ZG9tYWluID0gTlVMTDsKKyAgICB9CisgICAgaWYgKHEtPnBhdGgpCisgICAgeyBTT0FQX0ZSRUUoc29hcCwgcS0+cGF0aCk7CisgICAgICBxLT5wYXRoID0gTlVMTDsKKyAgICB9CisgICAgaWYgKHZhbHVlICYmICp2YWx1ZSAmJiAocS0+dmFsdWUgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHZhbHVlKSsxKSkpCisgICAgICBzdHJjcHkocS0+dmFsdWUsIHZhbHVlKTsKKyAgICBpZiAoZG9tYWluICYmICpkb21haW4gJiYgKHEtPmRvbWFpbiA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4oZG9tYWluKSsxKSkpCisgICAgICBzdHJjcHkocS0+ZG9tYWluLCBkb21haW4pOworICAgIGlmIChwYXRoICYmICpwYXRoICYmIChxLT5wYXRoID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihwYXRoKSsxKSkpCisgICAgICBzdHJjcHkocS0+cGF0aCwgcGF0aCk7CisgICAgcS0+c2Vzc2lvbiA9IDE7CisgICAgcS0+ZW52ID0gMDsKKyAgfQorICByZXR1cm4gcTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfY2xyX2Nvb2tpZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKipwLCAqcTsKKyAgaWYgKCFkb21haW4pCisgICAgZG9tYWluID0gc29hcC0+Y29va2llX2RvbWFpbjsKKyAgaWYgKCFkb21haW4pCisgIHsgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIkNvb2tpZSBkb21haW4gbm90IHNldCIsIE5VTEwsIFNPQVBfSFRUUF9FUlJPUik7CisgICAgcmV0dXJuOworICB9CisgIGlmICghcGF0aCkKKyAgICBwYXRoID0gc29hcC0+Y29va2llX3BhdGg7CisgIGlmICghcGF0aCkKKyAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiQ29va2llIHBhdGggbm90IHNldCIsIE5VTEwsIFNPQVBfSFRUUF9FUlJPUik7CisgICAgcmV0dXJuOworICB9CisgIGlmICgqcGF0aCA9PSAnLycpCisgICAgcGF0aCsrOworICBmb3IgKHAgPSAmc29hcC0+Y29va2llcywgcSA9ICpwOyBxOyBxID0gKnApCisgICAgaWYgKCFzdHJjbXAocS0+bmFtZSwgbmFtZSkgJiYgIXN0cmNtcChxLT5kb21haW4sIGRvbWFpbikgJiYgIXN0cm5jbXAocS0+cGF0aCwgcGF0aCwgc3RybGVuKHEtPnBhdGgpKSkKKyAgICB7IGlmIChxLT52YWx1ZSkKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHEtPnZhbHVlKTsKKyAgICAgIGlmIChxLT5kb21haW4pCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBxLT5kb21haW4pOworICAgICAgaWYgKHEtPnBhdGgpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBxLT5wYXRoKTsKKyAgICAgICpwID0gcS0+bmV4dDsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBxKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgcCA9ICZxLT5uZXh0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX2Nvb2tpZV92YWx1ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGlmICgocCA9IHNvYXBfY29va2llKHNvYXAsIG5hbWUsIGRvbWFpbiwgcGF0aCkpKQorICAgIHJldHVybiBwLT52YWx1ZTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfZW52X2Nvb2tpZV92YWx1ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGlmICgocCA9IHNvYXBfY29va2llKHNvYXAsIG5hbWUsIGRvbWFpbiwgcGF0aCkpICYmIHAtPmVudikKKyAgICByZXR1cm4gcC0+dmFsdWU7CisgIHJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQorbG9uZworU09BUF9GTUFDMgorc29hcF9jb29raWVfZXhwaXJlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgaWYgKChwID0gc29hcF9jb29raWUoc29hcCwgbmFtZSwgZG9tYWluLCBwYXRoKSkpCisgICAgcmV0dXJuIHAtPmV4cGlyZTsKKyAgcmV0dXJuIC0xOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NldF9jb29raWVfZXhwaXJlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBsb25nIGV4cGlyZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGlmICgocCA9IHNvYXBfY29va2llKHNvYXAsIG5hbWUsIGRvbWFpbiwgcGF0aCkpKQorICB7IHAtPmV4cGlyZSA9IGV4cGlyZTsKKyAgICBwLT5tb2RpZmllZCA9IDE7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgcmV0dXJuIFNPQVBfRVJSOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NldF9jb29raWVfc2Vzc2lvbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGlmICgocCA9IHNvYXBfY29va2llKHNvYXAsIG5hbWUsIGRvbWFpbiwgcGF0aCkpKQorICB7IHAtPnNlc3Npb24gPSAxOworICAgIHAtPm1vZGlmaWVkID0gMTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICByZXR1cm4gU09BUF9FUlI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfY2xyX2Nvb2tpZV9zZXNzaW9uKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgaWYgKChwID0gc29hcF9jb29raWUoc29hcCwgbmFtZSwgZG9tYWluLCBwYXRoKSkpCisgIHsgcC0+c2Vzc2lvbiA9IDA7CisgICAgcC0+bW9kaWZpZWQgPSAxOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIHJldHVybiBTT0FQX0VSUjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRzZXRjb29raWVzKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGNoYXIgKnMsIHRtcFs0MDk2XTsKKyAgY29uc3QgY2hhciAqdDsKKyAgZm9yIChwID0gc29hcC0+Y29va2llczsgcDsgcCA9IHAtPm5leHQpCisgIHsgaWYgKHAtPm1vZGlmaWVkIHx8ICFwLT5lbnYpCisgICAgeyBzID0gdG1wOworICAgICAgaWYgKHAtPm5hbWUpCisgICAgICAgIHMgKz0gc29hcF9lbmNvZGVfY29va2llKHAtPm5hbWUsIHMsIHRtcC1zKzQwNjQpOworICAgICAgaWYgKHAtPnZhbHVlICYmICpwLT52YWx1ZSkKKyAgICAgIHsgKnMrKyA9ICc9JzsKKyAgICAgICAgcyArPSBzb2FwX2VuY29kZV9jb29raWUocC0+dmFsdWUsIHMsIHRtcC1zKzQwNjQpOworICAgICAgfQorICAgICAgaWYgKHAtPmRvbWFpbiAmJiAoaW50KXN0cmxlbihwLT5kb21haW4pIDwgdG1wLXMrNDA2NCkKKyAgICAgICAgc3ByaW50ZihzLCAiO0RvbWFpbj1cIiVzXCIiLCBwLT5kb21haW4pOworICAgICAgZWxzZSBpZiAoc29hcC0+Y29va2llX2RvbWFpbiAmJiAoaW50KXN0cmxlbihzb2FwLT5jb29raWVfZG9tYWluKSA8IHRtcC1zKzQwNjQpCisgICAgICAgIHNwcmludGYocywgIjtEb21haW49XCIlc1wiIiwgc29hcC0+Y29va2llX2RvbWFpbik7CisgICAgICBzdHJjYXQocywgIjtQYXRoPVwiLyIpOworICAgICAgaWYgKHAtPnBhdGgpCisgICAgICAgIHQgPSBwLT5wYXRoOworICAgICAgZWxzZQorICAgICAgICB0ID0gc29hcC0+Y29va2llX3BhdGg7CisgICAgICBpZiAodCkKKyAgICAgIHsgaWYgKCp0ID09ICcvJykKKyAgICAgICAgICB0Kys7CisgICAgICAgIGlmICgoaW50KXN0cmxlbih0KSA8IHRtcC1zKzQwNjQpCisgICAgICAgICAgc3RyY2F0KHMsIHQpOworICAgICAgfQorICAgICAgcyArPSBzdHJsZW4ocyk7CisgICAgICAqcysrID0gJyInOworICAgICAgaWYgKHAtPnZlcnNpb24gPiAwKQorICAgICAgICBzcHJpbnRmKHMsICI7VmVyc2lvbj0ldSIsIHAtPnZlcnNpb24pOworICAgICAgaWYgKHAtPmV4cGlyZSA+PSAwKQorICAgICAgICBzcHJpbnRmKHMsICI7TWF4LUFnZT0lbGQiLCBwLT5leHBpcmUpOworICAgICAgaWYgKHAtPnNlY3VyZSkKKyAgICAgICAgc3RyY2F0KHMsICI7U2VjdXJlIik7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNldC1Db29raWU6ICVzXG4iLCB0bXApKTsKKyAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiU2V0LUNvb2tpZSIsIHRtcCkpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICB9CisgIHJldHVybiBTT0FQX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dGNvb2tpZXMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCwgaW50IHNlY3VyZSkKK3sgc3RydWN0IHNvYXBfY29va2llICoqcCwgKnE7CisgIHVuc2lnbmVkIGludCB2ZXJzaW9uID0gMDsKKyAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CisgIGNoYXIgKnMsIHRtcFs0MDk2XTsKKyAgcCA9ICZzb2FwLT5jb29raWVzOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNlbmRpbmcgY29va2llcyBmb3IgZG9tYWluPSVzIHBhdGg9JXNcbiIsIGRvbWFpbiwgcGF0aCkpOworICBpZiAoKnBhdGggPT0gJy8nKQorICAgIHBhdGgrKzsKKyAgd2hpbGUgKChxID0gKnApKQorICB7IGlmIChxLT5leHBpcmUgJiYgbm93ID4gcS0+ZXhwaXJlKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb29raWUgJXMgZXhwaXJlZFxuIiwgcS0+bmFtZSkpOworICAgICAgU09BUF9GUkVFKHNvYXAsIHEtPm5hbWUpOworICAgICAgaWYgKHEtPnZhbHVlKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcS0+dmFsdWUpOworICAgICAgaWYgKHEtPmRvbWFpbikKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHEtPmRvbWFpbik7CisgICAgICBpZiAocS0+cGF0aCkKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHEtPnBhdGgpOworICAgICAgKnAgPSBxLT5uZXh0OworICAgICAgU09BUF9GUkVFKHNvYXAsIHEpOworICAgIH0KKyAgICBlbHNlCisgICAgeyBzaXplX3QgZG9tbGVuID0gMDsKKyAgICAgIGlmIChxLT5kb21haW4pCisgICAgICB7IGNvbnN0IGNoYXIgKnMgPSBzdHJjaHIocS0+ZG9tYWluLCAnOicpOworICAgICAgICBpZiAocykKKwkgIGRvbWxlbiA9IHMgLSBxLT5kb21haW47CisJZWxzZQorICAgICAgICAgIGRvbWxlbiA9IHN0cmxlbihxLT5kb21haW4pOworICAgICAgfQorICAgICAgaWYgKCghcS0+ZG9tYWluIHx8ICFzdHJuY21wKHEtPmRvbWFpbiwgZG9tYWluLCBkb21sZW4pKQorICAgICAgICAgICYmICghcS0+cGF0aCB8fCAhc3RybmNtcChxLT5wYXRoLCBwYXRoLCBzdHJsZW4ocS0+cGF0aCkpKQorICAgICAgICAgICYmICghcS0+c2VjdXJlIHx8IHNlY3VyZSkpCisgICAgICB7IHMgPSB0bXA7CisgICAgICAgIGlmIChxLT52ZXJzaW9uICE9IHZlcnNpb24pCisgICAgICAgIHsgc3ByaW50ZihzLCAiJFZlcnNpb249JXU7IiwgcS0+dmVyc2lvbik7CisgICAgICAgICAgdmVyc2lvbiA9IHEtPnZlcnNpb247CisgICAgICAgIH0KKyAgICAgICAgaWYgKHEtPm5hbWUpCisgICAgICAgICAgcyArPSBzb2FwX2VuY29kZV9jb29raWUocS0+bmFtZSwgcywgdG1wLXMrNDA4MCk7CisgICAgICAgIGlmIChxLT52YWx1ZSAmJiAqcS0+dmFsdWUpCisgICAgICAgIHsgKnMrKyA9ICc9JzsKKyAgICAgICAgICBzICs9IHNvYXBfZW5jb2RlX2Nvb2tpZShxLT52YWx1ZSwgcywgdG1wLXMrNDA4MCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHEtPnBhdGggJiYgKGludClzdHJsZW4ocS0+cGF0aCkgPCB0bXAtcys0MDgwKQorICAgICAgICB7IHNwcmludGYocywgIjskUGF0aD1cIi8lc1wiIiwgKCpxLT5wYXRoID09ICcvJyA/IHEtPnBhdGggKyAxIDogcS0+cGF0aCkpOworICAgICAgICAgIHMgKz0gc3RybGVuKHMpOworICAgICAgICB9CisgICAgICAgIGlmIChxLT5kb21haW4gJiYgKGludClzdHJsZW4ocS0+ZG9tYWluKSA8IHRtcC1zKzQwODApCisgICAgICAgICAgc3ByaW50ZihzLCAiOyREb21haW49XCIlc1wiIiwgcS0+ZG9tYWluKTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb29raWU6ICVzXG4iLCB0bXApKTsKKyAgICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJDb29raWUiLCB0bXApKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB9CisgICAgICBwID0gJnEtPm5leHQ7CisgICAgfQorICB9CisgIHJldHVybiBTT0FQX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9nZXRjb29raWVzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp2YWwpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcCA9IE5VTEwsICpxOworICBjb25zdCBjaGFyICpzOworICBjaGFyICp0LCB0bXBbNDA5Nl07IC8qIGNvb2tpZSBzaXplIGlzIHVwIHRvIDQwOTYgYnl0ZXMgW1JGQzIxMDldICovCisgIGNoYXIgKmRvbWFpbiA9IE5VTEw7CisgIGNoYXIgKnBhdGggPSBOVUxMOworICB1bnNpZ25lZCBpbnQgdmVyc2lvbiA9IDA7CisgIHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOworICBpZiAoIXZhbCkKKyAgICByZXR1cm47CisgIHMgPSB2YWw7CisgIHdoaWxlICgqcykKKyAgeyBzID0gc29hcF9kZWNvZGVfa2V5KHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgIGlmICghc29hcF90YWdfY21wKHRtcCwgIiRWZXJzaW9uIikpCisgICAgeyBpZiAoKHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcykpKQorICAgICAgeyBpZiAocCkKKyAgICAgICAgICBwLT52ZXJzaW9uID0gKGludClhdG9sKHRtcCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICB2ZXJzaW9uID0gKGludClhdG9sKHRtcCk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAodG1wLCAiJFBhdGgiKSkKKyAgICB7IHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICBpZiAoKnRtcCkKKyAgICAgIHsgaWYgKCh0ID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbih0bXApKzEpKSkKKyAgICAgICAgICBzdHJjcHkodCwgdG1wKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgdCA9IE5VTEw7CisgICAgICBpZiAocCkKKyAgICAgIHsgaWYgKHAtPnBhdGgpCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnBhdGgpOworICAgICAgICBwLT5wYXRoID0gdDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgaWYgKHBhdGgpCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHBhdGgpOworICAgICAgICBwYXRoID0gdDsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcCh0bXAsICIkRG9tYWluIikpCisgICAgeyBzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgICAgaWYgKCp0bXApCisgICAgICB7IGlmICgodCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4odG1wKSsxKSkpCisgICAgICAgICAgc3RyY3B5KHQsIHRtcCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHQgPSBOVUxMOworICAgICAgaWYgKHApCisgICAgICB7IGlmIChwLT5kb21haW4pCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPmRvbWFpbik7CisJcC0+ZG9tYWluID0gdDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgaWYgKGRvbWFpbikKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgZG9tYWluKTsKKyAgICAgICAgZG9tYWluID0gdDsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAocCAmJiAhc29hcF90YWdfY21wKHRtcCwgIlBhdGgiKSkKKyAgICB7IGlmIChwLT5wYXRoKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+cGF0aCk7CisgICAgICBzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgICAgaWYgKCp0bXApCisgICAgICB7IGlmICgocC0+cGF0aCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4odG1wKSsxKSkpCisgICAgICAgICAgc3RyY3B5KHAtPnBhdGgsIHRtcCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHAtPnBhdGggPSBOVUxMOworICAgIH0KKyAgICBlbHNlIGlmIChwICYmICFzb2FwX3RhZ19jbXAodG1wLCAiRG9tYWluIikpCisgICAgeyBpZiAocC0+ZG9tYWluKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+ZG9tYWluKTsKKyAgICAgIHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICBpZiAoKnRtcCkKKyAgICAgIHsgaWYgKChwLT5kb21haW4gPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHRtcCkrMSkpKQorICAgICAgICAgIHN0cmNweShwLT5kb21haW4sIHRtcCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHAtPmRvbWFpbiA9IE5VTEw7CisgICAgfQorICAgIGVsc2UgaWYgKHAgJiYgIXNvYXBfdGFnX2NtcCh0bXAsICJWZXJzaW9uIikpCisgICAgeyBzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgICAgcC0+dmVyc2lvbiA9ICh1bnNpZ25lZCBpbnQpYXRvbCh0bXApOworICAgIH0KKyAgICBlbHNlIGlmIChwICYmICFzb2FwX3RhZ19jbXAodG1wLCAiTWF4LUFnZSIpKQorICAgIHsgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgIHAtPmV4cGlyZSA9IG5vdyArIGF0b2wodG1wKTsKKyAgICB9CisgICAgZWxzZSBpZiAocCAmJiAhc29hcF90YWdfY21wKHRtcCwgIkV4cGlyZXMiKSkKKyAgICB7IHN0cnVjdCB0bSBUOworICAgICAgY2hhciBhWzNdOyAKKyAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG1uc1tdID0gImFuZWJhcnByYXl1bnVsdWdlcGN0b3ZlYyI7CisgICAgICBzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgICAgaWYgKHN0cmxlbih0bXApID4gMjApCisgICAgICB7IG1lbXNldCgodm9pZCopJlQsIDAsIHNpemVvZihUKSk7CisgICAgICAgIGFbMF0gPSB0bXBbNF07CisgICAgICAgIGFbMV0gPSB0bXBbNV07CisgICAgICAgIGFbMl0gPSAnXDAnOworICAgICAgICBULnRtX21kYXkgPSAoaW50KWF0b2woYSk7CisgICAgICAgIGFbMF0gPSB0bXBbOF07CisgICAgICAgIGFbMV0gPSB0bXBbOV07CisgICAgICAgIFQudG1fbW9uID0gKHN0cnN0cihtbnMsIGEpIC0gbW5zKSAvIDI7CisgICAgICAgIGFbMF0gPSB0bXBbMTFdOworICAgICAgICBhWzFdID0gdG1wWzEyXTsKKyAgICAgICAgVC50bV95ZWFyID0gMTAwICsgKGludClhdG9sKGEpOworICAgICAgICBhWzBdID0gdG1wWzEzXTsKKyAgICAgICAgYVsxXSA9IHRtcFsxNF07CisgICAgICAgIFQudG1faG91ciA9IChpbnQpYXRvbChhKTsKKyAgICAgICAgYVswXSA9IHRtcFsxNl07CisgICAgICAgIGFbMV0gPSB0bXBbMTddOworICAgICAgICBULnRtX21pbiA9IChpbnQpYXRvbChhKTsKKyAgICAgICAgYVswXSA9IHRtcFsxOV07CisgICAgICAgIGFbMV0gPSB0bXBbMjBdOworICAgICAgICBULnRtX3NlYyA9IChpbnQpYXRvbChhKTsKKyAgICAgICAgcC0+ZXhwaXJlID0gc29hcF90aW1lZ20oJlQpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChwICYmICFzb2FwX3RhZ19jbXAodG1wLCAiU2VjdXJlIikpCisgICAgICBwLT5zZWN1cmUgPSAxOworICAgIGVsc2UKKyAgICB7IGlmIChwKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdvdCBlbnZpcm9ubWVudCBjb29raWUgJXM9JXMgZG9tYWluPSVzIHBhdGg9JXMgZXhwaXJlPSVsZCBzZWN1cmU9JWRcbiIsIHAtPm5hbWUsIHAtPnZhbHVlP3AtPnZhbHVlOiIiLCBwLT5kb21haW4/cC0+ZG9tYWluOiIiLCBwLT5wYXRoP3AtPnBhdGg6IiIsIHAtPmV4cGlyZSwgcC0+c2VjdXJlKSk7CisgICAgICAgIGlmICgocSA9IHNvYXBfc2V0X2Nvb2tpZShzb2FwLCBwLT5uYW1lLCBwLT52YWx1ZSwgcC0+ZG9tYWluLCBwLT5wYXRoKSkpCisgICAgICAgIHsgcS0+dmVyc2lvbiA9IHAtPnZlcnNpb247CisgICAgICAgICAgcS0+ZXhwaXJlID0gcC0+ZXhwaXJlOworICAgICAgICAgIHEtPnNlY3VyZSA9IHAtPnNlY3VyZTsKKyAgICAgICAgICBxLT5lbnYgPSAxOworICAgICAgICB9CisgICAgICAgIGlmIChwLT5uYW1lKQorICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5uYW1lKTsKKyAgICAgICAgaWYgKHAtPnZhbHVlKQorICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT52YWx1ZSk7CisgICAgICAgIGlmIChwLT5kb21haW4pCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPmRvbWFpbik7CisgICAgICAgIGlmIChwLT5wYXRoKQorICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5wYXRoKTsKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHApOworICAgICAgfQorICAgICAgaWYgKChwID0gKHN0cnVjdCBzb2FwX2Nvb2tpZSopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2Nvb2tpZSkpKSkKKyAgICAgIHsgcC0+bmFtZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4odG1wKSsxKTsKKyAgICAgICAgc3RyY3B5KHAtPm5hbWUsIHRtcCk7CisgICAgICAgIHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICAgIGlmICgqdG1wKQorICAgICAgICB7IHAtPnZhbHVlID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbih0bXApKzEpOworICAgICAgICAgIHN0cmNweShwLT52YWx1ZSwgdG1wKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgcC0+dmFsdWUgPSBOVUxMOworICAgICAgICBwLT5kb21haW4gPSBkb21haW47CisgICAgICAgIHAtPnBhdGggPSBwYXRoOworICAgICAgICBwLT5leHBpcmUgPSAwOworICAgICAgICBwLT5zZWN1cmUgPSAwOworICAgICAgICBwLT52ZXJzaW9uID0gdmVyc2lvbjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKHApCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHb3QgZW52aXJvbm1lbnQgY29va2llICVzPSVzIGRvbWFpbj0lcyBwYXRoPSVzIGV4cGlyZT0lbGQgc2VjdXJlPSVkXG4iLCBwLT5uYW1lLCBwLT52YWx1ZT9wLT52YWx1ZToiIiwgcC0+ZG9tYWluP3AtPmRvbWFpbjoiIiwgcC0+cGF0aD9wLT5wYXRoOiIiLCBwLT5leHBpcmUsIHAtPnNlY3VyZSkpOworICAgIGlmICgocSA9IHNvYXBfc2V0X2Nvb2tpZShzb2FwLCBwLT5uYW1lLCBwLT52YWx1ZSwgcC0+ZG9tYWluLCBwLT5wYXRoKSkpCisgICAgeyBxLT52ZXJzaW9uID0gcC0+dmVyc2lvbjsKKyAgICAgIHEtPmV4cGlyZSA9IHAtPmV4cGlyZTsKKyAgICAgIHEtPnNlY3VyZSA9IHAtPnNlY3VyZTsKKyAgICAgIHEtPmVudiA9IDE7CisgICAgfQorICAgIGlmIChwLT5uYW1lKQorICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPm5hbWUpOworICAgIGlmIChwLT52YWx1ZSkKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT52YWx1ZSk7CisgICAgaWYgKHAtPmRvbWFpbikKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5kb21haW4pOworICAgIGlmIChwLT5wYXRoKQorICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnBhdGgpOworICAgIFNPQVBfRlJFRShzb2FwLCBwKTsKKyAgfQorICBpZiAoZG9tYWluKQorICAgIFNPQVBfRlJFRShzb2FwLCBkb21haW4pOworICBpZiAocGF0aCkKKyAgICBTT0FQX0ZSRUUoc29hcCwgcGF0aCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0ZW52X2Nvb2tpZXMoc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgY29uc3QgY2hhciAqczsKKyAgY2hhciBrZXlbNDA5Nl0sIHZhbFs0MDk2XTsgLyogY29va2llIHNpemUgaXMgdXAgdG8gNDA5NiBieXRlcyBbUkZDMjEwOV0gKi8KKyAgaWYgKCEocyA9IGdldGVudigiSFRUUF9DT09LSUUiKSkpCisgICAgcmV0dXJuIFNPQVBfRVJSOworICBkbworICB7IHMgPSBzb2FwX2RlY29kZV9rZXkoa2V5LCBzaXplb2Yoa2V5KSwgcyk7CisgICAgcyA9IHNvYXBfZGVjb2RlX3ZhbCh2YWwsIHNpemVvZih2YWwpLCBzKTsKKyAgICBwID0gc29hcF9zZXRfY29va2llKHNvYXAsIGtleSwgdmFsLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAocCkKKyAgICAgIHAtPmVudiA9IDE7CisgIH0gd2hpbGUgKCpzKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcF9jb29raWUqCitTT0FQX0ZNQUMyCitzb2FwX2NvcHlfY29va2llcyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwLCAqKnEsICpyOworICBxID0gJnI7CisgIGZvciAocCA9IHNvYXAtPmNvb2tpZXM7IHA7IHAgPSBwLT5uZXh0KQorICB7IGlmICghKCpxID0gKHN0cnVjdCBzb2FwX2Nvb2tpZSopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2Nvb2tpZSkpKSkKKyAgICAgIHJldHVybiByOworICAgICoqcSA9ICpwOworICAgIGlmIChwLT5uYW1lKQorICAgIHsgaWYgKCgoKnEpLT5uYW1lID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihwLT5uYW1lKSsxKSkpCisgICAgICAgIHN0cmNweSgoKnEpLT5uYW1lLCBwLT5uYW1lKTsKKyAgICB9CisgICAgaWYgKHAtPnZhbHVlKQorICAgIHsgaWYgKCgoKnEpLT52YWx1ZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4ocC0+dmFsdWUpKzEpKSkKKyAgICAgICAgc3RyY3B5KCgqcSktPnZhbHVlLCBwLT52YWx1ZSk7CisgICAgfQorICAgIGlmIChwLT5kb21haW4pCisgICAgeyBpZiAoKCgqcSktPmRvbWFpbiA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4ocC0+ZG9tYWluKSsxKSkpCisgICAgICAgIHN0cmNweSgoKnEpLT5kb21haW4sIHAtPmRvbWFpbik7CisgICAgfQorICAgIGlmIChwLT5wYXRoKQorICAgIHsgaWYgKCgoKnEpLT5wYXRoID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihwLT5wYXRoKSsxKSkpCisgICAgICAgIHN0cmNweSgoKnEpLT5wYXRoLCBwLT5wYXRoKTsKKyAgICB9CisgICAgcSA9ICYoKnEpLT5uZXh0OworICB9CisgICpxID0gTlVMTDsKKyAgcmV0dXJuIHI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2ZyZWVfY29va2llcyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBmb3IgKHAgPSBzb2FwLT5jb29raWVzOyBwOyBwID0gc29hcC0+Y29va2llcykKKyAgeyBzb2FwLT5jb29raWVzID0gcC0+bmV4dDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgcC0+bmFtZSk7CisgICAgaWYgKHAtPnZhbHVlKQorICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnZhbHVlKTsKKyAgICBpZiAocC0+ZG9tYWluKQorICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPmRvbWFpbik7CisgICAgaWYgKHAtPnBhdGgpCisgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+cGF0aCk7CisgICAgU09BUF9GUkVFKHNvYXAsIHApOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZW5kaWYgLyogV0lUSF9DT09LSUVTICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgV0lUSF9HWklQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc29hcF9nZXRnemlwaGRyKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpbnQgaTsKKyAgc29hcF93Y2hhciBjLCBmID0gMDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHZXQgZ3ppcCBoZWFkZXJcbiIpKTsKKyAgZm9yIChpID0gMDsgaSA8IDk7IGkrKykKKyAgeyBpZiAoKGludCkoYyA9IHNvYXBfZ2V0MShzb2FwKSA9PSBFT0YpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgaWYgKGkgPT0gMikKKyAgICAgIGYgPSBjOworICB9CisgIGlmIChmICYgMHgwNCkgLyogRkVYVFJBICovCisgIHsgZm9yIChpID0gc29hcF9nZXQxKHNvYXApIHwgKHNvYXBfZ2V0MShzb2FwKSA8PCA4KTsgaTsgaS0tKQorICAgICAgaWYgKChpbnQpc29hcF9nZXQxKHNvYXApID09IEVPRikKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIH0KKyAgaWYgKGYgJiAweDA4KSAvKiBGTkFNRSAqLworICAgIGRvCisgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworICAgIHdoaWxlIChjICYmIChpbnQpYyAhPSBFT0YpOworICBpZiAoKGludCljICE9IEVPRiAmJiAoZiAmIDB4MTApKSAvKiBGQ09NTUVOVCAqLworICAgIGRvCisgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworICAgIHdoaWxlIChjICYmIChpbnQpZiAhPSBFT0YpOworICBpZiAoKGludCljICE9IEVPRiAmJiAoZiAmIDB4MDEpKSAvKiBGSENSQyAqLworICB7IGlmICgoaW50KShjID0gc29hcF9nZXQxKHNvYXApKSAhPSBFT0YpCisgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworICB9CisgIGlmICgoaW50KWMgPT0gRU9GKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JlZ2luX3JlY3Yoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXBfd2NoYXIgYzsKKyAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICBzb2FwX2ZyZWUoc29hcCk7CisgIHNvYXBfc2V0X2xvY2FsX25hbWVzcGFjZXMoc29hcCk7CisgIHNvYXAtPnZlcnNpb24gPSAwOwkvKiBkb24ndCBhc3N1bWUgd2UncmUgcGFyc2luZyBTT0FQIGNvbnRlbnQgYnkgZGVmYXVsdCAqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgc29hcF9mcmVlX2lodChzb2FwKTsKKyNlbmRpZgorICBpZiAoKHNvYXAtPmltb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgICBzb2FwLT5vbW9kZSB8PSBTT0FQX0lPX0NIVU5LOworICBzb2FwLT5pbW9kZSAmPSB+U09BUF9JTzsKKyAgc29hcC0+bW9kZSA9IHNvYXAtPmltb2RlOworICBpZiAoIXNvYXAtPmtlZXBfYWxpdmUpCisgIHsgc29hcC0+YnVmbGVuID0gMDsKKyAgICBzb2FwLT5idWZpZHggPSAwOworICB9CisgIGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0tFRVBBTElWRSkpCisgICAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7CisgIHNvYXAtPmFoZWFkID0gMDsKKyAgc29hcC0+cGVla2VkID0gMDsKKyAgc29hcC0+bGV2ZWwgPSAwOworICBzb2FwLT5wYXJ0ID0gU09BUF9CRUdJTjsKKyAgc29hcC0+YWxsb2NlZCA9IDA7CisgIHNvYXAtPmNvdW50ID0gMDsKKyAgc29hcC0+bGVuZ3RoID0gMDsKKyAgc29hcC0+Y2RhdGEgPSAwOworICAqc29hcC0+ZW5kcG9pbnQgPSAnXDAnOworICBzb2FwLT5hY3Rpb24gPSBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzb2FwLT5kb20gPSBOVUxMOworICBzb2FwLT5kaW1lLmNodW5rc2l6ZSA9IDA7CisgIHNvYXAtPmRpbWUuYnVmbGVuID0gMDsKKyAgc29hcC0+ZGltZS5saXN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGlzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmxhc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gTlVMTDsKKyAgc29hcC0+bWltZS5zdGFydCA9IE5VTEw7CisgIHNvYXAtPnhsaXN0ID0gTlVMTDsKKyNlbmRpZgorI2lmZGVmIFdJTjMyCisjaWZuZGVmIFVOREVSX0NFCisjaWZuZGVmIFdJVEhfRkFTVENHSQorICBpZiAoIXNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisjaWZkZWYgX19CT1JMQU5EQ19fCisgICAgc2V0bW9kZSgoU09BUF9TT0NLRVQpc29hcC0+cmVjdmZkLCBPX0JJTkFSWSk7CisjZWxzZQorICAgIF9zZXRtb2RlKChTT0FQX1NPQ0tFVClzb2FwLT5yZWN2ZmQsIF9PX0JJTkFSWSk7CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBXSVRIX1pMSUIKKyAgc29hcC0+bW9kZSAmPSB+U09BUF9FTkNfWkxJQjsKKyAgc29hcC0+emxpYl9pbiA9IFNPQVBfWkxJQl9OT05FOworICBzb2FwLT56bGliX291dCA9IFNPQVBfWkxJQl9OT05FOworICBzb2FwLT5kX3N0cmVhbS5uZXh0X2luID0gWl9OVUxMOworICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbiA9IDA7CisgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gKEJ5dGUqKXNvYXAtPmJ1ZjsKKyAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0ID0gU09BUF9CVUZMRU47CisgIHNvYXAtPnpfcmF0aW9faW4gPSAxLjA7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPmZwcmVwYXJlaW5pdCkKKyAgICBzb2FwLT5mcHJlcGFyZWluaXQoc29hcCk7CisjZW5kaWYKKyAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyNpZmRlZiBXSVRIX0daSVAKKyAgaWYgKGMgPT0gMHgxRikKKyAgeyBpZiAoc29hcF9nZXRnemlwaGRyKHNvYXApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmIChpbmZsYXRlSW5pdDIoJnNvYXAtPmRfc3RyZWFtLCAtTUFYX1dCSVRTKSAhPSBaX09LKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfSU5GTEFURTsKKyAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX1pMSUI7CisgICAgc29hcC0+emxpYl9pbiA9IFNPQVBfWkxJQl9HWklQOworICAgIHNvYXAtPnpfY3JjID0gY3JjMzIoMEwsIE5VTEwsIDApOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZ3ppcCBpbml0aWFsaXplZFxuIikpOworICAgIG1lbWNweShzb2FwLT56X2J1Ziwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTik7CisgICAgLyogc2hvdWxkIG5vdCBjaHVuayBvdmVyIHBsYWluIHRyYW5zcG9ydCwgc28gd2h5IGJvdGhlciB0byBjaGVjaz8gKi8KKyAgICAvKiBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKSAqLworICAgIC8qICAgc29hcC0+el9idWZsZW4gPSBzb2FwLT5idWZpZHg7ICovCisgICAgLyogZWxzZSAqLworICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfaW4gPSAoQnl0ZSopKHNvYXAtPnpfYnVmICsgc29hcC0+YnVmaWR4KTsKKyAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbiA9IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICBzb2FwLT56X2J1ZmxlbiA9IHNvYXAtPmJ1ZmxlbjsKKyAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5idWZpZHg7CisgICAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgfSAgCisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKGMgPT0gJy0nICYmIHNvYXBfZ2V0MChzb2FwKSA9PSAnLScpCisgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19NSU1FOworICBlbHNlIGlmICgoYyAmIDB4RkZGQykgPT0gKFNPQVBfRElNRV9WRVJTSU9OIHwgU09BUF9ESU1FX01CKSAmJiAoc29hcF9nZXQwKHNvYXApICYgMHhGRkYwKSA9PSAweDIwKQorICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfRElNRTsKKyAgZWxzZQorI2VuZGlmCisgIHsgd2hpbGUgKHNvYXBfYmxhbmsoYykpCisgICAgICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICB9CisgIGlmICgoaW50KWMgPT0gRU9GKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworI2lmbmRlZiBXSVRIX05PSFRUUAorICAvKiBpZiBub3QgWE1MIG9yIChzdGFydCBvZilCT00gb3IgTUlNRS9ESU1FL1pMSUIsIGFzc3VtZSBIVFRQIGhlYWRlciAqLworICBpZiAoYyAhPSAnPCcgJiYgYyAhPSAweEVGICYmICEoc29hcC0+bW9kZSAmIChTT0FQX0VOQ19NSU1FIHwgU09BUF9FTkNfRElNRSB8IFNPQVBfRU5DX1pMSUIpKSkKKyAgeyBzb2FwLT5tb2RlICY9IH5TT0FQX0lPOworICAgIHNvYXAtPmVycm9yID0gc29hcC0+ZnBhcnNlKHNvYXApOworICAgIGlmIChzb2FwLT5lcnJvciAmJiBzb2FwLT5lcnJvciA8IFNPQVBfU1RPUCkKKyAgICB7IHNvYXAtPmtlZXBfYWxpdmUgPSAwOyAvKiBmb3JjZSBjbG9zZSBsYXRlciAqLworICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKQorICAgIHsgc29hcC0+Y2h1bmtidWZsZW4gPSBzb2FwLT5idWZsZW47CisgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5idWZpZHg7CisgICAgICBzb2FwLT5jaHVua3NpemUgPSAwOworICAgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgICBlbHNlIGlmIChzb2FwLT5mcHJlcGFyZXJlY3YgJiYgc29hcC0+YnVmbGVuICE9IHNvYXAtPmJ1ZmlkeCkKKyAgICAgIHNvYXAtPmZwcmVwYXJlcmVjdihzb2FwLCBzb2FwLT5idWYgKyBzb2FwLT5idWZpZHgsIHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeCk7CisjZW5kaWYKKyNpZmRlZiBXSVRIX1pMSUIKKyAgICBpZiAoc29hcC0+emxpYl9pbiAhPSBTT0FQX1pMSUJfTk9ORSkKKyAgICB7IC8qIGZwYXJzZSBzaG91bGQgbm90IHVzZSBzb2FwX3VuZ2V0IHRvIHB1c2ggYmFjayBsYXN0IGNoYXIgKi8KKyNpZmRlZiBXSVRIX0daSVAKKyAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICBpZiAoYyA9PSAweDFGKQorICAgICAgeyBpZiAoc29hcF9nZXRnemlwaGRyKHNvYXApKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgaWYgKGluZmxhdGVJbml0Migmc29hcC0+ZF9zdHJlYW0sIC1NQVhfV0JJVFMpICE9IFpfT0spCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgICBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX0lORkxBVEU7CisgICAgICAgIHNvYXAtPnpfY3JjID0gY3JjMzIoMEwsIE5VTEwsIDApOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImd6aXAgaW5pdGlhbGl6ZWRcbiIpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgc29hcF9yZXZnZXQxKHNvYXApOworI2Vsc2UKKyAgICAgIHsKKyNlbmRpZgorICAgICAgICBpZiAoaW5mbGF0ZUluaXQoJnNvYXAtPmRfc3RyZWFtKSAhPSBaX09LKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICAgICAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9JTkZMQVRFOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluZmxhdGUgaW5pdGlhbGl6ZWRcbiIpKTsKKyAgICAgIH0KKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfWkxJQjsKKyAgICAgIG1lbWNweShzb2FwLT56X2J1Ziwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTik7CisgICAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X2luID0gKEJ5dGUqKShzb2FwLT56X2J1ZiArIHNvYXAtPmJ1ZmlkeCk7CisgICAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbiA9IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICAgIHNvYXAtPnpfYnVmbGVuID0gc29hcC0+YnVmbGVuOworICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+YnVmaWR4OworICAgIH0KKyNlbmRpZgorICAgIGlmIChzb2FwLT5lcnJvcikKKyAgICB7IGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX0ZPUk0gJiYgc29hcC0+ZmZvcm0pCisgICAgICB7IHNvYXAtPmVycm9yID0gc29hcC0+ZmZvcm0oc29hcCk7CisgICAgICAgIGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX09LKQorICAgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9TVE9QOyAvKiBwcmV2ZW50cyBmdXJ0aGVyIHByb2Nlc3NpbmcgKi8KKyAgICAgIH0KKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgIH0KKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01JTUUpCisgIHsgaWYgKHNvYXBfZ2V0bWltZWhkcihzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAoc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCBzb2FwLT5taW1lLmZpcnN0LT50eXBlLCAiYXBwbGljYXRpb24vZGltZSIpKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19ESU1FOworICB9CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkKKyAgeyBpZiAoc29hcF9nZXRkaW1laGRyKHNvYXApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmIChzb2FwLT5kaW1lLmZsYWdzICYgU09BUF9ESU1FX0NGKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDaHVua2VkIERJTUUgU09BUCBtZXNzYWdlXG4iKSk7CisgICAgICBzb2FwLT5kaW1lLmNodW5rc2l6ZSA9IHNvYXAtPmRpbWUuc2l6ZTsKKyAgICAgIGlmIChzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHggPj0gc29hcC0+ZGltZS5jaHVua3NpemUpCisgICAgICB7IHNvYXAtPmRpbWUuYnVmbGVuID0gc29hcC0+YnVmbGVuOworICAgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5idWZpZHggKyBzb2FwLT5kaW1lLmNodW5rc2l6ZTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgc29hcC0+ZGltZS5jaHVua3NpemUgLT0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgIH0KKyAgICBzb2FwLT5jb3VudCA9IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgfQorI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAoraHR0cF9wYXJzZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgY2hhciBoZWFkZXJbU09BUF9IRFJMRU5dLCAqczsKKyAgdW5zaWduZWQgc2hvcnQgZ2V0ID0gMCwgc3RhdHVzID0gMCwgayA9IDA7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiV2FpdGluZyBmb3IgSFRUUCByZXF1ZXN0L3Jlc3BvbnNlLi4uXG4iKSk7CisgICpzb2FwLT5lbmRwb2ludCA9ICdcMCc7CisgIHNvYXAtPmxlbmd0aCA9IDA7CisgIHNvYXAtPnVzZXJpZCA9IE5VTEw7CisgIHNvYXAtPnBhc3N3ZCA9IE5VTEw7CisgIHNvYXAtPmFjdGlvbiA9IE5VTEw7CisgIHNvYXAtPmF1dGhyZWFsbSA9IE5VTEw7CisgIGRvCisgIHsgaWYgKHNvYXBfZ2V0bGluZShzb2FwLCBzb2FwLT5tc2didWYsIHNpemVvZihzb2FwLT5tc2didWYpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiSFRUUCBzdGF0dXM6ICVzXG4iLCBzb2FwLT5tc2didWYpKTsKKyAgICBmb3IgKDs7KQorICAgIHsgaWYgKHNvYXBfZ2V0bGluZShzb2FwLCBoZWFkZXIsIFNPQVBfSERSTEVOKSkKKyAgICAgIHsgaWYgKHNvYXAtPmVycm9yID09IFNPQVBfRU9GKQorCXsgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICAgICAgICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJFT0YgaW4gSFRUUCBoZWFkZXIsIGNvbnRpbnVlIGFueXdheVxuIikpOworCSAgYnJlYWs7CisJfQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB9CisgICAgICBpZiAoISpoZWFkZXIpCisgICAgICAgIGJyZWFrOworICAgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkhUVFAgaGVhZGVyOiAlc1xuIiwgaGVhZGVyKSk7CisgICAgICBzID0gc3RyY2hyKGhlYWRlciwgJzonKTsKKyAgICAgIGlmIChzKQorICAgICAgeyAqcyA9ICdcMCc7CisgICAgICAgIGRvIHMrKzsKKyAgICAgICAgd2hpbGUgKCpzICYmICpzIDw9IDMyKTsKKyAgICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZwYXJzZWhkcihzb2FwLCBoZWFkZXIsIHMpKSkKKyAgICAgICAgeyBpZiAoc29hcC0+ZXJyb3IgPCBTT0FQX1NUT1ApCisJICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKwkgIHN0YXR1cyA9IHNvYXAtPmVycm9yOworCSAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmICgocyA9IHN0cmNocihzb2FwLT5tc2didWYsICcgJykpKQorICAgIHsgayA9ICh1bnNpZ25lZCBzaG9ydClzb2FwX3N0cnRvdWwocywgJnMsIDEwKTsKKyAgICAgIGlmICghc29hcF9ibGFuaygqcykpCisgICAgICAgIGsgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgICBrID0gMDsKKyAgfSB3aGlsZSAoayA9PSAxMDApOworICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiRmluaXNoZWQgSFRUUCBoZWFkZXIgcGFyc2luZ1xuIikpOworICBzID0gc3Ryc3RyKHNvYXAtPm1zZ2J1ZiwgIkhUVFAvIik7CisgIGlmIChzICYmIHNbN10gIT0gJzEnKQorICB7IGlmIChzb2FwLT5rZWVwX2FsaXZlID09IDEpCisgICAgICBzb2FwLT5rZWVwX2FsaXZlID0gMDsKKyAgICBpZiAoayA9PSAwICYmIChzb2FwLT5vbW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspIC8qIGsgPT0gMCBmb3IgSFRUUCByZXF1ZXN0ICovCisgICAgeyBzb2FwLT5pbW9kZSB8PSBTT0FQX0lPX0NIVU5LOworICAgICAgc29hcC0+b21vZGUgPSAoc29hcC0+b21vZGUgJiB+U09BUF9JTykgfCBTT0FQX0lPX1NUT1JFOworICAgIH0KKyAgfQorICBpZiAoc29hcC0+a2VlcF9hbGl2ZSA8IDApCisgICAgc29hcC0+a2VlcF9hbGl2ZSA9IDE7CisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJLZWVwIGFsaXZlIGNvbm5lY3Rpb24gPSAlZFxuIiwgc29hcC0+a2VlcF9hbGl2ZSkpOworICBpZiAocyAmJiAoKChnZXQgPSAhc3RybmNtcChzb2FwLT5tc2didWYsICJHRVQgIiwgNCkpKSB8fCAhc3RybmNtcChzb2FwLT5tc2didWYsICJQT1NUICIsIDUpKSkKKyAgeyBzaXplX3QgbSA9IHN0cmxlbihzb2FwLT5lbmRwb2ludCk7CisgICAgc2l6ZV90IG4gPSBtICsgKHMgLSBzb2FwLT5tc2didWYpIC0gNSAtICghZ2V0KTsKKyAgICBpZiAobiA+PSBzaXplb2Yoc29hcC0+ZW5kcG9pbnQpKQorICAgICAgbiA9IHNpemVvZihzb2FwLT5lbmRwb2ludCkgLSAxOworICAgIHN0cm5jcHkoc29hcC0+cGF0aCwgc29hcC0+bXNnYnVmICsgNCArICghZ2V0KSwgbiAtIG0pOworICAgIHNvYXAtPnBhdGhbbiAtIG1dID0gJ1wwJzsKKyAgICBzdHJjYXQoc29hcC0+ZW5kcG9pbnQsIHNvYXAtPnBhdGgpOworICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJUYXJnZXQgZW5kcG9pbnQ9JyVzJ1xuIiwgc29hcC0+ZW5kcG9pbnQpKTsKKyAgICBpZiAoZ2V0KQorICAgIHsgc29hcC0+ZXJyb3IgPSBzb2FwLT5mZ2V0KHNvYXApOworICAgICAgaWYgKHNvYXAtPmVycm9yID09IFNPQVBfT0spCisgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9TVE9QOyAvKiBwcmV2ZW50cyBmdXJ0aGVyIHByb2Nlc3NpbmcgKi8KKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgaWYgKHN0YXR1cykKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IHN0YXR1czsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICBpZiAoayA9PSAwIHx8IChrID49IDIwMCAmJiBrIDw9IDI5OSkgfHwgayA9PSA0MDAgfHwgayA9PSA1MDApCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJIVFRQIGVycm9yICVkXG4iLCBrKSk7CisgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiSFRUUCBlcnJvciIsIHNvYXAtPm1zZ2J1Ziwgayk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK2h0dHBfcGFyc2VfaGVhZGVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbCkKK3sgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiSG9zdCIpKQorICB7IAorI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgIGlmIChzb2FwLT5pbW9kZSAmIFNPQVBfRU5DX1NTTCkKKyAgICAgIHN0cmNweShzb2FwLT5lbmRwb2ludCwgImh0dHBzOi8vIik7CisgICAgZWxzZQorI2VuZGlmCisgICAgICBzdHJjcHkoc29hcC0+ZW5kcG9pbnQsICJodHRwOi8vIik7CisgICAgc3RybmNhdChzb2FwLT5lbmRwb2ludCwgdmFsLCBzaXplb2Yoc29hcC0+ZW5kcG9pbnQpIC0gOCk7CisgICAgc29hcC0+ZW5kcG9pbnRbc2l6ZW9mKHNvYXAtPmVuZHBvaW50KSAtIDFdID0gJ1wwJzsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtVHlwZSIpKQorICB7IGlmIChzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCwgImFwcGxpY2F0aW9uL2RpbWUiKSkKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfRElNRTsKKyAgICBlbHNlIGlmIChzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCwgIm11bHRpcGFydC9yZWxhdGVkIikKKyAgICAgICAgICB8fCBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCwgIm11bHRpcGFydC9mb3JtLWRhdGEiKSkKKyAgICB7IHNvYXAtPm1pbWUuYm91bmRhcnkgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCwgImJvdW5kYXJ5IikpOworICAgICAgc29hcC0+bWltZS5zdGFydCA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAic3RhcnQiKSk7CisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX01JTUU7CisgICAgfQorICB9CisjZW5kaWYKKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LUxlbmd0aCIpKQorICAgIHNvYXAtPmxlbmd0aCA9IHNvYXBfc3RydG91bCh2YWwsIE5VTEwsIDEwKTsKKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LUVuY29kaW5nIikpCisgIHsgaWYgKCFzb2FwX3RhZ19jbXAodmFsLCAiZGVmbGF0ZSIpKQorI2lmZGVmIFdJVEhfWkxJQgorICAgICAgc29hcC0+emxpYl9pbiA9IFNPQVBfWkxJQl9ERUZMQVRFOworI2Vsc2UKKyAgICAgIHJldHVybiBTT0FQX1pMSUJfRVJST1I7CisjZW5kaWYKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHZhbCwgImd6aXAiKSkKKyNpZmRlZiBXSVRIX0daSVAKKyAgICAgIHNvYXAtPnpsaWJfaW4gPSBTT0FQX1pMSUJfR1pJUDsKKyNlbHNlCisgICAgICByZXR1cm4gU09BUF9aTElCX0VSUk9SOworI2VuZGlmCisgIH0KKyNpZmRlZiBXSVRIX1pMSUIKKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJBY2NlcHQtRW5jb2RpbmciKSkKKyAgeworI2lmZGVmIFdJVEhfR1pJUAorICAgIGlmIChzdHJjaHIodmFsLCAnKicpIHx8IHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAiZ3ppcCIpKQorICAgICAgc29hcC0+emxpYl9vdXQgPSBTT0FQX1pMSUJfR1pJUDsKKyAgICBlbHNlCisjZW5kaWYKKyAgICBpZiAoc3RyY2hyKHZhbCwgJyonKSB8fCBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCwgImRlZmxhdGUiKSkKKyAgICAgIHNvYXAtPnpsaWJfb3V0ID0gU09BUF9aTElCX0RFRkxBVEU7CisgICAgZWxzZQorICAgICAgc29hcC0+emxpYl9vdXQgPSBTT0FQX1pMSUJfTk9ORTsKKyAgfQorI2VuZGlmCisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiVHJhbnNmZXItRW5jb2RpbmciKSkKKyAgeyBzb2FwLT5tb2RlICY9IH5TT0FQX0lPOworICAgIGlmICghc29hcF90YWdfY21wKHZhbCwgImNodW5rZWQiKSkKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19DSFVOSzsKKyAgfQorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbm5lY3Rpb24iKSkKKyAgeyBpZiAoIXNvYXBfdGFnX2NtcCh2YWwsICJrZWVwLWFsaXZlIikpCisgICAgICBzb2FwLT5rZWVwX2FsaXZlID0gLXNvYXAtPmtlZXBfYWxpdmU7CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcCh2YWwsICJjbG9zZSIpKQorICAgICAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFOCisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQXV0aG9yaXphdGlvbiIpKQorICB7IGlmICghc29hcF90YWdfY21wKHZhbCwgIkJhc2ljICoiKSkKKyAgICB7IGludCBuOworICAgICAgY2hhciAqczsKKyAgICAgIHNvYXBfYmFzZTY0MnMoc29hcCwgdmFsICsgNiwgc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSAtIDEsICZuKTsKKyAgICAgIHNvYXAtPnRtcGJ1ZltuXSA9ICdcMCc7CisgICAgICBpZiAoKHMgPSBzdHJjaHIoc29hcC0+dG1wYnVmLCAnOicpKSkKKyAgICAgIHsgKnMgPSAnXDAnOworCXNvYXAtPnVzZXJpZCA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPnRtcGJ1Zik7CisJc29hcC0+cGFzc3dkID0gc29hcF9zdHJkdXAoc29hcCwgcyArIDEpOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIldXVy1BdXRoZW50aWNhdGUiKSkKKyAgICBzb2FwLT5hdXRocmVhbG0gPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCArIDYsICJyZWFsbSIpKTsKKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJFeHBlY3QiKSkKKyAgeyBpZiAoIXNvYXBfdGFnX2NtcCh2YWwsICIxMDAtY29udGludWUiKSkKKyAgICB7IGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiSFRUUC8xLjEgMTAwIENvbnRpbnVlIiwgTlVMTCkpCisgICAgICAgfHwgKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgTlVMTCwgTlVMTCkpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICB9CisjZW5kaWYKKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJTT0FQQWN0aW9uIikpCisgIHsgaWYgKCp2YWwgPT0gJyInKQorICAgIHsgc29hcC0+YWN0aW9uID0gc29hcF9zdHJkdXAoc29hcCwgdmFsICsgMSk7CisgICAgICBzb2FwLT5hY3Rpb25bc3RybGVuKHNvYXAtPmFjdGlvbikgLSAxXSA9ICdcMCc7CisgICAgfQorICB9CisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiTG9jYXRpb24iKSkKKyAgeyBzdHJuY3B5KHNvYXAtPmVuZHBvaW50LCB2YWwsIHNpemVvZihzb2FwLT5lbmRwb2ludCkpOworICAgIHNvYXAtPmVuZHBvaW50W3NpemVvZihzb2FwLT5lbmRwb2ludCkgLSAxXSA9ICdcMCc7CisgIH0KKyNpZmRlZiBXSVRIX0NPT0tJRVMKKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb29raWUiKSB8fCAhc29hcF90YWdfY21wKGtleSwgIlNldC1Db29raWUiKSkKKyAgICBzb2FwX2dldGNvb2tpZXMoc29hcCwgdmFsKTsKKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgIWRlZmluZWQoV0lUSF9OT0hUVFApIHx8ICFkZWZpbmVkKFdJVEhfTEVBTkVSKQorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpsaW5lLCBjb25zdCBjaGFyICprZXkpCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnMgPSBsaW5lOworICBpZiAocykKKyAgeyB3aGlsZSAoKnMpCisgICAgeyByZWdpc3RlciBzaG9ydCBmbGFnOworICAgICAgcyA9IHNvYXBfZGVjb2RlX2tleShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCBzKTsKKyAgICAgIGZsYWcgPSBzb2FwX3RhZ19jbXAoc29hcC0+dG1wYnVmLCBrZXkpOworICAgICAgcyA9IHNvYXBfZGVjb2RlX3ZhbChzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCBzKTsKKyAgICAgIGlmICghZmxhZykKKyAgICAgICAgcmV0dXJuIHNvYXAtPnRtcGJ1ZjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmICFkZWZpbmVkKFdJVEhfTk9IVFRQKSB8fCAhZGVmaW5lZChXSVRIX0xFQU5FUikKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9kZWNvZGVfa2V5KGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwgY29uc3QgY2hhciAqdmFsKQoreyByZXR1cm4gc29hcF9kZWNvZGUoYnVmLCBsZW4sIHZhbCwgIj0sOyIpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAhZGVmaW5lZChXSVRIX05PSFRUUCkgfHwgIWRlZmluZWQoV0lUSF9MRUFORVIpCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZGVjb2RlX3ZhbChjaGFyICpidWYsIHNpemVfdCBsZW4sIGNvbnN0IGNoYXIgKnZhbCkKK3sgaWYgKCp2YWwgIT0gJz0nKQorICB7ICpidWYgPSAnXDAnOworICAgIHJldHVybiB2YWw7CisgIH0KKyAgcmV0dXJuIHNvYXBfZGVjb2RlKGJ1ZiwgbGVuLCB2YWwgKyAxLCAiLDsiKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgIWRlZmluZWQoV0lUSF9OT0hUVFApIHx8ICFkZWZpbmVkKFdJVEhfTEVBTkVSKQorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBjb25zdCBjaGFyKgorc29hcF9kZWNvZGUoY2hhciAqYnVmLCBzaXplX3QgbGVuLCBjb25zdCBjaGFyICp2YWwsIGNvbnN0IGNoYXIgKnNlcCkKK3sgY29uc3QgY2hhciAqczsKKyAgY2hhciAqdCA9IGJ1ZjsKKyAgZm9yIChzID0gdmFsOyAqczsgcysrKQorICAgIGlmICgqcyAhPSAnICcgJiYgKnMgIT0gJ1x0JyAmJiAhc3RyY2hyKHNlcCwgKnMpKQorICAgICAgYnJlYWs7CisgIGlmICgqcyA9PSAnIicpCisgIHsgcysrOworICAgIHdoaWxlICgqcyAmJiAqcyAhPSAnIicgJiYgLS1sZW4pCisgICAgICAqdCsrID0gKnMrKzsKKyAgfQorICBlbHNlCisgIHsgd2hpbGUgKHNvYXBfbm90YmxhbmsoKnMpICYmICFzdHJjaHIoc2VwLCAqcykgJiYgLS1sZW4pCisgICAgeyBpZiAoKnMgPT0gJyUnKQorICAgICAgeyAqdCsrID0gKChzWzFdID49ICdBJyA/IChzWzFdICYgMHg3KSArIDkgOiBzWzFdIC0gJzAnKSA8PCA0KQorICAgICAgICAgICAgICArIChzWzJdID49ICdBJyA/IChzWzJdICYgMHg3KSArIDkgOiBzWzJdIC0gJzAnKTsKKyAgICAgICAgcyArPSAzOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICAqdCsrID0gKnMrKzsKKyAgICB9CisgIH0KKyAgKnQgPSAnXDAnOworICB3aGlsZSAoKnMgJiYgIXN0cmNocihzZXAsICpzKSkKKyAgICBzKys7CisgIHJldHVybiBzOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW52ZWxvcGVfYmVnaW5fb3V0KHN0cnVjdCBzb2FwICpzb2FwKQoreworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzaXplX3QgbiA9IDA7CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01JTUUpICYmIHNvYXAtPm1pbWUuYm91bmRhcnkgJiYgc29hcC0+bWltZS5zdGFydCkKKyAgeyBjb25zdCBjaGFyICpzOworICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpICYmICEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pKQorICAgICAgcyA9ICJhcHBsaWNhdGlvbi9kaW1lIjsKKyAgICBlbHNlIGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgICAgICBzID0gImFwcGxpY2F0aW9uL3NvYXAreG1sOyBjaGFyc2V0PXV0Zi04IjsKKyAgICBlbHNlCisgICAgICBzID0gInRleHQveG1sOyBjaGFyc2V0PXV0Zi04IjsKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIi0tJXNcclxuQ29udGVudC1UeXBlOiAlc1xyXG5Db250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiaW5hcnlcclxuQ29udGVudC1JRDogJXNcclxuXHJcbiIsIHNvYXAtPm1pbWUuYm91bmRhcnksIHMsIHNvYXAtPm1pbWUuc3RhcnQpOworICAgIG4gPSBzdHJsZW4oc29hcC0+dG1wYnVmKTsKKyAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzb2FwLT50bXBidWYsIG4pKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgc29hcC0+ZGltZS5zaXplID0gc29hcC0+Y291bnQ7CS8qIERJTUUgaW4gTUlNRSBjb3JyZWN0aW9uICovCisgIGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSkKKyAgeyBpZiAoc29hcF9wdXRkaW1laGRyKHNvYXApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisjZW5kaWYKKyAgc29hcC0+cGFydCA9IFNPQVBfSU5fRU5WRUxPUEU7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsICJTT0FQLUVOVjpFbnZlbG9wZSIsIDAsIE5VTEwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VudmVsb3BlX2VuZF9vdXQoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCAiU09BUC1FTlY6RW52ZWxvcGUiKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpICYmICEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pKQorICB7IHNvYXAtPmRpbWUuc2l6ZSA9IHNvYXAtPmNvdW50IC0gc29hcC0+ZGltZS5zaXplOwkvKiBESU1FIGluIE1JTUUgY29ycmVjdGlvbiAqLworICAgIHNwcmludGYoc29hcC0+aWQsIHNvYXAtPmRpbWVfaWRfZm9ybWF0LCAwKTsKKyAgICBzb2FwLT5kaW1lLmlkID0gc29hcC0+aWQ7CisgICAgaWYgKHNvYXAtPmxvY2FsX25hbWVzcGFjZXMpCisgICAgeyBpZiAoc29hcC0+bG9jYWxfbmFtZXNwYWNlc1swXS5vdXQpCisgICAgICAgIHNvYXAtPmRpbWUudHlwZSA9IChjaGFyKilzb2FwLT5sb2NhbF9uYW1lc3BhY2VzWzBdLm91dDsKKyAgICAgIGVsc2UKKyAgICAgICAgc29hcC0+ZGltZS50eXBlID0gKGNoYXIqKXNvYXAtPmxvY2FsX25hbWVzcGFjZXNbMF0ubnM7CisgICAgfQorICAgIHNvYXAtPmRpbWUub3B0aW9ucyA9IE5VTEw7CisgICAgc29hcC0+ZGltZS5mbGFncyA9IFNPQVBfRElNRV9NQiB8IFNPQVBfRElNRV9BQlNVUkk7CisgICAgaWYgKCFzb2FwLT5kaW1lLmZpcnN0KQorICAgICAgc29hcC0+ZGltZS5mbGFncyB8PSBTT0FQX0RJTUVfTUU7CisgICAgc29hcC0+Y291bnQgKz0gMTIgKyAoKHN0cmxlbihzb2FwLT5kaW1lLmlkKSszKSYofjMpKSArICgoc3RybGVuKHNvYXAtPmRpbWUudHlwZSkrMykmKH4zKSk7CisgIH0KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkgJiYgIShzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkpCisgICAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgU09BUF9TVFJfUEFERElORywgLShsb25nKXNvYXAtPmRpbWUuc2l6ZSYzKTsKKyNlbmRpZgorICBzb2FwLT5wYXJ0ID0gU09BUF9FTkRfRU5WRUxPUEU7CisgIHJldHVybiBTT0FQX09LOworfSAKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbnZlbG9wZV9iZWdpbl9pbihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc3RydWN0IE5hbWVzcGFjZSAqcDsKKyAgc29hcC0+cGFydCA9IFNPQVBfSU5fRU5WRUxPUEU7CisgIGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgIlNPQVAtRU5WOkVudmVsb3BlIiwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9WRVJTSU9OTUlTTUFUQ0g7CisgIHAgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzOworICBpZiAocCkKKyAgeyBjb25zdCBjaGFyICpucyA9IHBbMF0ub3V0OworICAgIGlmICghbnMpCisgICAgICBucyA9IHBbMF0ubnM7CisgICAgaWYgKCFzdHJjbXAobnMsIHNvYXBfZW52MSkpCisgICAgeyBzb2FwLT52ZXJzaW9uID0gMTsgLyogbWFrZSBzdXJlIHdlIHVzZSBTT0FQIDEuMSAqLworICAgICAgaWYgKHBbMV0ub3V0KQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcFsxXS5vdXQpOworICAgICAgaWYgKChwWzFdLm91dCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc29hcF9lbmMxKSkpKQorICAgICAgICBzdHJjcHkocFsxXS5vdXQsIHNvYXBfZW5jMSk7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAobnMsIHNvYXBfZW52MikpCisgICAgeyBzb2FwLT52ZXJzaW9uID0gMjsgLyogbWFrZSBzdXJlIHdlIHVzZSBTT0FQIDEuMiAqLworICAgICAgaWYgKHBbMV0ub3V0KQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcFsxXS5vdXQpOworICAgICAgaWYgKChwWzFdLm91dCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc29hcF9lbmMyKSkpKQorICAgICAgICBzdHJjcHkocFsxXS5vdXQsIHNvYXBfZW5jMik7CisgICAgfQorICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VudmVsb3BlX2VuZF9pbihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+cGFydCA9IFNPQVBfRU5EX0VOVkVMT1BFOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCAiU09BUC1FTlY6RW52ZWxvcGUiKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9ib2R5X2JlZ2luX291dChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+cGFydCA9IFNPQVBfSU5fQk9EWTsKKyAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMSkKKyAgICBzb2FwLT5lbmNvZGluZyA9IDE7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TRUMpICYmIHNvYXBfc2V0X2F0dHIoc29hcCwgIndzdTpJZCIsICJCb2R5IikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2VuZGlmCisgIGlmIChzb2FwX2VsZW1lbnQoc29hcCwgIlNPQVAtRU5WOkJvZHkiLCAwLCBOVUxMKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzb2FwLCBOVUxMKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9ib2R5X2VuZF9vdXQoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCAiU09BUC1FTlY6Qm9keSIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgc29hcC0+cGFydCA9IFNPQVBfRU5EX0JPRFk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JvZHlfYmVnaW5faW4oc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPnBhcnQgPSBTT0FQX0lOX0JPRFk7CisgIGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgIlNPQVAtRU5WOkJvZHkiLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmICghc29hcC0+Ym9keSkKKyAgICBzb2FwLT5wYXJ0ID0gU09BUF9OT19CT0RZOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9ib2R5X2VuZF9pbihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXAtPnBhcnQgPT0gU09BUF9OT19CT0RZKQorICAgIHJldHVybiBTT0FQX09LOworICBzb2FwLT5wYXJ0ID0gU09BUF9FTkRfQk9EWTsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgIlNPQVAtRU5WOkJvZHkiKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWN2X2hlYWRlcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXBfZ2V0aGVhZGVyKHNvYXApICYmIHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfZW5kcG9pbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmVuZHBvaW50KQoreyByZWdpc3RlciBjb25zdCBjaGFyICpzOworICByZWdpc3RlciBzaXplX3QgaSwgbjsKKyAgc29hcC0+ZW5kcG9pbnRbMF0gPSAnXDAnOworICBzb2FwLT5ob3N0WzBdID0gJ1wwJzsKKyAgc29hcC0+cGF0aFswXSA9ICcvJzsKKyAgc29hcC0+cGF0aFsxXSA9ICdcMCc7CisgIHNvYXAtPnBvcnQgPSA4MDsKKyAgaWYgKCFlbmRwb2ludCB8fCAhKmVuZHBvaW50KQorICAgIHJldHVybjsKKyAgaWYgKCFzdHJuY21wKGVuZHBvaW50LCAiaHR0cHM6IiwgNikpCisgICAgc29hcC0+cG9ydCA9IDQ0MzsKKyAgc3RybmNweShzb2FwLT5lbmRwb2ludCwgZW5kcG9pbnQsIHNpemVvZihzb2FwLT5lbmRwb2ludCkgLSAxKTsKKyAgcyA9IHN0cmNocihlbmRwb2ludCwgJzonKTsKKyAgaWYgKHMgJiYgc1sxXSA9PSAnLycgJiYgc1syXSA9PSAnLycpCisgICAgcyArPSAzOworICBlbHNlCisgICAgcyA9IGVuZHBvaW50OworICBuID0gc3RybGVuKHMpOworICBpZiAobiA+PSBzaXplb2Yoc29hcC0+aG9zdCkpCisgICAgbiA9IHNpemVvZihzb2FwLT5ob3N0KSAtIDE7CisjaWZkZWYgV0lUSF9JUFY2CisgIGlmIChzWzBdID09ICdbJykKKyAgeyBzKys7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICB7IHNvYXAtPmhvc3RbaV0gPSBzW2ldOworICAgICAgaWYgKHNbaV0gPT0gJ10nKQorICAgICAgeyBzKys7CisgICAgICAgIGJyZWFrOyAKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZQorICB7IGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgeyBzb2FwLT5ob3N0W2ldID0gc1tpXTsKKyAgICAgIGlmIChzW2ldID09ICcvJyB8fCBzW2ldID09ICc6JykKKyAgICAgICAgYnJlYWs7IAorICAgIH0KKyAgfQorI2Vsc2UKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgeyBzb2FwLT5ob3N0W2ldID0gc1tpXTsKKyAgICBpZiAoc1tpXSA9PSAnLycgfHwgc1tpXSA9PSAnOicpCisgICAgICBicmVhazsgCisgIH0KKyNlbmRpZgorICBzb2FwLT5ob3N0W2ldID0gJ1wwJzsKKyAgaWYgKHNbaV0gPT0gJzonKQorICB7IHNvYXAtPnBvcnQgPSAoaW50KWF0b2wocyArIGkgKyAxKTsKKyAgICBmb3IgKGkrKzsgaSA8IG47IGkrKykKKyAgICAgIGlmIChzW2ldID09ICcvJykKKyAgICAgICAgYnJlYWs7CisgIH0KKyAgaWYgKHNbaV0pCisgIHsgc3RybmNweShzb2FwLT5wYXRoLCBzICsgaSwgc2l6ZW9mKHNvYXAtPnBhdGgpKTsKKyAgICBzb2FwLT5wYXRoW3NpemVvZihzb2FwLT5wYXRoKSAtIDFdID0gJ1wwJzsKKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2Nvbm5lY3Qoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjb25zdCBjaGFyICphY3Rpb24pCit7IHJldHVybiBzb2FwX2Nvbm5lY3RfY29tbWFuZChzb2FwLCBTT0FQX1BPU1QsIGVuZHBvaW50LCBhY3Rpb24pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2Nvbm5lY3RfY29tbWFuZChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGh0dHBfY29tbWFuZCwgY29uc3QgY2hhciAqZW5kcG9pbnQsIGNvbnN0IGNoYXIgKmFjdGlvbikKK3sgY2hhciBob3N0W3NpemVvZihzb2FwLT5ob3N0KV07CisgIGludCBwb3J0OworICBzaXplX3QgY291bnQ7CisgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgc3RyY3B5KGhvc3QsIHNvYXAtPmhvc3QpOyAvKiBzYXZlIHRvIGNvbXBhcmUgKi8KKyAgcG9ydCA9IHNvYXAtPnBvcnQ7IC8qIHNhdmUgdG8gY29tcGFyZSAqLworICBzb2FwX3NldF9lbmRwb2ludChzb2FwLCBlbmRwb2ludCk7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5mY29ubmVjdCkKKyAgeyBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZmNvbm5lY3Qoc29hcCwgZW5kcG9pbnQsIHNvYXAtPmhvc3QsIHNvYXAtPnBvcnQpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBlbHNlCisjZW5kaWYKKyAgaWYgKHNvYXAtPmZvcGVuICYmICpzb2FwLT5ob3N0KQorICB7IHNvYXAtPnN0YXR1cyA9IGh0dHBfY29tbWFuZDsKKyAgICBpZiAoIXNvYXAtPmtlZXBfYWxpdmUgfHwgIXNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkgfHwgc3RyY21wKHNvYXAtPmhvc3QsIGhvc3QpIHx8IHNvYXAtPnBvcnQgIT0gcG9ydCB8fCAhc29hcC0+ZnBvbGwgfHwgc29hcC0+ZnBvbGwoc29hcCkpCisgICAgeyBzb2FwLT5rZWVwX2FsaXZlID0gMDsgLyogdG8gZm9yY2UgY2xvc2UgKi8KKyAgICAgIHNvYXAtPm9tb2RlICY9IH5TT0FQX0lPX1VEUDsgLyogdG8gZm9yY2UgY2xvc2UgKi8KKyAgICAgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvbm5lY3QvcmVjb25uZWN0IHRvIGhvc3Q9JyVzJyBwYXRoPSclcycgcG9ydD0lZFxuIiwgc29hcC0+aG9zdCwgc29hcC0+cGF0aCwgc29hcC0+cG9ydCkpOworI2lmZGVmIFdJVEhfVURQCisgICAgICBpZiAoIXN0cm5jbXAoZW5kcG9pbnQsICJzb2FwLnVkcDoiLCA5KSkKKyAgICAgICAgc29hcC0+b21vZGUgfD0gU09BUF9JT19VRFA7CisjZW5kaWYKKyAgICAgIHNvYXAtPnNvY2tldCA9IHNvYXAtPmZvcGVuKHNvYXAsIGVuZHBvaW50LCBzb2FwLT5ob3N0LCBzb2FwLT5wb3J0KTsKKyAgICAgIGlmIChzb2FwLT5lcnJvcikKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgc29hcC0+a2VlcF9hbGl2ZSA9ICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX0tFRVBBTElWRSkgIT0gMCk7CisgICAgfQorICB9CisgIGNvdW50ID0gc29hcF9jb3VudF9hdHRhY2htZW50cyhzb2FwKTsKKyAgaWYgKHNvYXBfYmVnaW5fc2VuZChzb2FwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjaWZuZGVmIFdJVEhfTk9IVFRQCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pICE9IFNPQVBfSU9fU1RPUkUgJiYgIShzb2FwLT5tb2RlICYgU09BUF9FTkNfWE1MKSAmJiBlbmRwb2ludCkKKyAgeyB1bnNpZ25lZCBpbnQgayA9IHNvYXAtPm1vZGU7CisgICAgc29hcC0+bW9kZSAmPSB+KFNPQVBfSU8gfCBTT0FQX0VOQ19aTElCKTsKKyAgICBpZiAoKGsgJiBTT0FQX0lPKSAhPSBTT0FQX0lPX0ZMVVNIKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX0JVRkZFUjsKKyAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3Qoc29hcCwgZW5kcG9pbnQsIHNvYXAtPmhvc3QsIHNvYXAtPnBvcnQsIHNvYXAtPnBhdGgsIGFjdGlvbiwgY291bnQpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgICBpZiAoKGsgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKQorICAgIHsgaWYgKHNvYXBfZmx1c2goc29hcCkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisjZW5kaWYKKyAgICBzb2FwLT5tb2RlID0gazsKKyAgfQorICBlbHNlIGlmIChhY3Rpb24pCisgICAgc29hcC0+YWN0aW9uID0gc29hcF9zdHJkdXAoc29hcCwgYWN0aW9uKTsKKyAgaWYgKGh0dHBfY29tbWFuZCAhPSBTT0FQX1BPU1QpCisgICAgcmV0dXJuIHNvYXBfZW5kX3NlbmQoc29hcCk7CisjZW5kaWYKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjaGFyKgorU09BUF9GTUFDMgorc29hcF9zMmJhc2U2NChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgdW5zaWduZWQgY2hhciAqcywgY2hhciAqdCwgaW50IG4pCit7IHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIG07CisgIHJlZ2lzdGVyIGNoYXIgKnA7CisgIGlmICghdCkKKyAgICB0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIChuICsgMikgLyAzICogNCArIDEpOworICBpZiAoIXQpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwID0gdDsKKyAgdFswXSA9ICdcMCc7CisgIGlmICghcykKKyAgICByZXR1cm4gcDsKKyAgZm9yICg7IG4gPiAyOyBuIC09IDMsIHMgKz0gMykKKyAgeyBtID0gc1swXTsKKyAgICBtID0gKG0gPDwgOCkgfCBzWzFdOworICAgIG0gPSAobSA8PCA4KSB8IHNbMl07CisgICAgZm9yIChpID0gNDsgaSA+IDA7IG0gPj49IDYpCisgICAgICB0Wy0taV0gPSBzb2FwX2Jhc2U2NG9bbSAmIDB4M0ZdOworICAgIHQgKz0gNDsKKyAgfQorICB0WzBdID0gJ1wwJzsKKyAgaWYgKG4gPiAwKQorICB7IG0gPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICBtID0gKG0gPDwgOCkgfCAqcysrOworICAgIGZvciAoOyBpIDwgMzsgaSsrKQorICAgICAgbSA8PD0gODsKKyAgICBmb3IgKGkrKzsgaSA+IDA7IG0gPj49IDYpCisgICAgICB0Wy0taV0gPSBzb2FwX2Jhc2U2NG9bbSAmIDB4M0ZdOworICAgIGZvciAoaSA9IDM7IGkgPiBuOyBpLS0pCisgICAgICB0W2ldID0gJz0nOworICAgIHRbNF0gPSAnXDAnOworICB9CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfYmFzZTY0MnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGNoYXIgKnQsIHNpemVfdCBsLCBpbnQgKm4pCit7IHJlZ2lzdGVyIGludCBpLCBqLCBjOworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIG07CisgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnA7CisgIGlmICghcyB8fCAhKnMpCisgIHsgaWYgKG4pCisgICAgICAqbiA9IDA7CisgICAgaWYgKHNvYXAtPmVycm9yKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFNPQVBfTk9OX05VTEw7CisgIH0KKyAgaWYgKCF0KQorICB7IGwgPSAoc3RybGVuKHMpICsgMykgLyA0ICogMzsKKyAgICB0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIGwpOworICB9CisgIGlmICghdCkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHJldHVybiBOVUxMOworICB9CisgIHAgPSB0OworICBpZiAobikKKyAgICAqbiA9IDA7CisgIGZvciAoOzspCisgIHsgZm9yIChpID0gMDsgaSA8IFNPQVBfQkxLTEVOOyBpKyspCisgICAgeyBtID0gMDsKKyAgICAgIGogPSAwOworICAgICAgd2hpbGUgKGogPCA0KQorICAgICAgeyBjID0gKnMrKzsKKyAgICAgICAgaWYgKGMgPT0gJz0nIHx8ICFjKQorICAgICAgICB7IGkgKj0gMzsKKyAgICAgICAgICBzd2l0Y2ggKGopCisgICAgICAgICAgeyBjYXNlIDI6CisgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoKG0gPj4gNCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgobSA+PiAxMCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgobSA+PiAyKSAmIDB4RkYpOworICAgICAgICAgICAgICBpICs9IDI7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChuKQorCSAgICAqbiArPSBpOworICAgICAgICAgIHJldHVybiBwOworICAgICAgICB9CisgICAgICAgIGMgLT0gJysnOworICAgICAgICBpZiAoYyA+PSAwICYmIGMgPD0gNzkpCisgICAgICAgIHsgbSA9IChtIDw8IDYpICsgc29hcF9iYXNlNjRpW2NdOworICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgKnQrKyA9IChjaGFyKSgobSA+PiAxNikgJiAweEZGKTsKKyAgICAgICp0KysgPSAoY2hhcikoKG0gPj4gOCkgJiAweEZGKTsKKyAgICAgICp0KysgPSAoY2hhcikobSAmIDB4RkYpOworICAgICAgaWYgKGwgPCAzKQorICAgICAgeyBpZiAobikKKwkgICpuICs9IGk7CisgICAgICAgIHJldHVybiBwOworICAgICAgfQorICAgICAgbCAtPSAzOworICAgIH0KKyAgICBpZiAobikKKyAgICAgICpuICs9IDMgKiBTT0FQX0JMS0xFTjsKKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfczJoZXgoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMsIGNoYXIgKnQsIGludCBuKQoreyByZWdpc3RlciBjaGFyICpwOworICBpZiAoIXQpCisgICAgdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCAyICogbiArIDEpOworICBpZiAoIXQpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwID0gdDsKKyAgdFswXSA9ICdcMCc7CisgIGlmIChzKQorICB7IGZvciAoOyBuID4gMDsgbi0tKQorICAgIHsgcmVnaXN0ZXIgaW50IG0gPSAqcysrOworICAgICAgKnQrKyA9IChjaGFyKSgobSA+PiA0KSArIChtID4gMTU5ID8gJ2EnIC0gMTAgOiAnMCcpKTsKKyAgICAgIG0gJj0gMHgwRjsKKyAgICAgICp0KysgPSAoY2hhcikobSArIChtID4gOSA/ICdhJyAtIDEwIDogJzAnKSk7CisgICAgfQorICB9CisgICp0KysgPSAnXDAnOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2hleDJzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBjaGFyICp0LCBzaXplX3QgbCwgaW50ICpuKQoreyByZWdpc3RlciBjb25zdCBjaGFyICpwOworICBpZiAoIXMgfHwgISpzKQorICB7IGlmIChuKQorICAgICAgKm4gPSAwOworICAgIGlmIChzb2FwLT5lcnJvcikKKyAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBTT0FQX05PTl9OVUxMOworICB9CisgIGlmICghdCkKKyAgeyBsID0gc3RybGVuKHMpIC8gMjsKKyAgICB0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIGwpOworICB9CisgIGlmICghdCkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHJldHVybiBOVUxMOworICB9CisgIHAgPSB0OworICB3aGlsZSAobCkKKyAgeyByZWdpc3RlciBpbnQgZDEsIGQyOworICAgIGQxID0gKnMrKzsKKyAgICBpZiAoIWQxKQorICAgICAgYnJlYWs7CisgICAgZDIgPSAqcysrOworICAgIGlmICghZDIpCisgICAgICBicmVhazsKKyAgICAqdCsrID0gKChkMSA+PSAnQScgPyAoZDEgJiAweDcpICsgOSA6IGQxIC0gJzAnKSA8PCA0KSArIChkMiA+PSAnQScgPyAoZDIgJiAweDcpICsgOSA6IGQyIC0gJzAnKTsKKyAgICBsLS07CisgIH0KKyAgaWYgKG4pCisgICAgKm4gPSB0IC0gcDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0aHR0cGhkcihzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0YXR1cywgc2l6ZV90IGNvdW50KQoreyByZWdpc3RlciBjb25zdCBjaGFyICpzID0gTlVMTDsKKyAgcmVnaXN0ZXIgaW50IGVyciA9IFNPQVBfT0s7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnIgPSBOVUxMOworI2VuZGlmCisgIGlmIChzdGF0dXMgPT0gU09BUF9GSUxFICYmIHNvYXAtPmh0dHBfY29udGVudCkKKyAgICBzID0gc29hcC0+aHR0cF9jb250ZW50OworICBlbHNlIGlmIChzdGF0dXMgPT0gU09BUF9IVE1MKQorICAgIHMgPSAidGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IjsKKyAgZWxzZSBpZiAoY291bnQgfHwgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykpCisgIHsgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgICAgIHMgPSAiYXBwbGljYXRpb24vc29hcCt4bWw7IGNoYXJzZXQ9dXRmLTgiOworICAgIGVsc2UKKyAgICAgIHMgPSAidGV4dC94bWw7IGNoYXJzZXQ9dXRmLTgiOworICB9CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5tb2RlICYgKFNPQVBfRU5DX0RJTUUgfCBTT0FQX0VOQ19NVE9NKSkKKyAgeyBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pCisgICAgeyByID0gczsKKyAgICAgIHMgPSAiYXBwbGljYXRpb24veG9wK3htbDsgY2hhcnNldD11dGYtOCI7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHMgPSAiYXBwbGljYXRpb24vZGltZSI7CisgIH0KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkgJiYgc29hcC0+bWltZS5ib3VuZGFyeSAmJiBzb2FwLT5zdGF0dXMgIT0gU09BUF9HRVQpCisgIHsgcmVnaXN0ZXIgY29uc3QgY2hhciAqdCA9IHN0cmNocihzLCAnOycpOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAibXVsdGlwYXJ0L3JlbGF0ZWQ7IGJvdW5kYXJ5PVwiJXNcIjsgdHlwZT1cIiIsIHNvYXAtPm1pbWUuYm91bmRhcnkpOworICAgIGlmICh0KQorICAgICAgc3RybmNhdChzb2FwLT50bXBidWYsIHMsIHQgLSBzKTsKKyAgICBlbHNlCisgICAgICBzdHJjYXQoc29hcC0+dG1wYnVmLCBzKTsKKyAgICBpZiAoc29hcC0+bWltZS5zdGFydCkKKyAgICB7IHN0cmNhdChzb2FwLT50bXBidWYsICJcIjsgc3RhcnQ9XCIiKTsKKyAgICAgIHN0cmNhdChzb2FwLT50bXBidWYsIHNvYXAtPm1pbWUuc3RhcnQpOworICAgIH0KKyAgICBzdHJjYXQoc29hcC0+dG1wYnVmLCAiXCIiKTsKKyAgICBpZiAocikKKyAgICB7IHN0cmNhdChzb2FwLT50bXBidWYsICI7IHN0YXJ0LWluZm89XCIiKTsKKyAgICAgIHN0cmNhdChzb2FwLT50bXBidWYsIHIpOworICAgICAgc3RyY2F0KHNvYXAtPnRtcGJ1ZiwgIlwiIik7CisgICAgfQorICAgIHMgPSBzb2FwLT50bXBidWY7CisgIH0KKyNlbmRpZgorICBpZiAocyAmJiAoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkNvbnRlbnQtVHlwZSIsIHMpKSkKKyAgICByZXR1cm4gZXJyOworI2lmZGVmIFdJVEhfWkxJQgorICBpZiAoc29hcC0+b21vZGUgJiBTT0FQX0VOQ19aTElCKQorICB7CisjaWZkZWYgV0lUSF9HWklQCisgICAgZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkNvbnRlbnQtRW5jb2RpbmciLCAiZ3ppcCIpOworI2Vsc2UKKyAgICBlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQ29udGVudC1FbmNvZGluZyIsICJkZWZsYXRlIik7CisjZW5kaWYKKyAgICBpZiAoZXJyKQorICAgICAgcmV0dXJuIGVycjsKKyAgfQorI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKQorICAgIGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJUcmFuc2Zlci1FbmNvZGluZyIsICJjaHVua2VkIik7CisgIGVsc2UKKyNlbmRpZgorICBpZiAoc29hcC0+c3RhdHVzICE9IFNPQVBfR0VUKQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiJWx1IiwgKHVuc2lnbmVkIGxvbmcpY291bnQpOworICAgIGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJDb250ZW50LUxlbmd0aCIsIHNvYXAtPnRtcGJ1Zik7CisgIH0KKyAgaWYgKGVycikKKyAgICByZXR1cm4gZXJyOworICByZXR1cm4gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkNvbm5lY3Rpb24iLCBzb2FwLT5rZWVwX2FsaXZlID8gImtlZXAtYWxpdmUiIDogImNsb3NlIik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK2h0dHBfZ2V0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZXR1cm4gU09BUF9HRVRfTUVUSE9EOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50CitodHRwX3Bvc3Qoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjb25zdCBjaGFyICpob3N0LCBpbnQgcG9ydCwgY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqYWN0aW9uLCBzaXplX3QgY291bnQpCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnM7CisgIHJlZ2lzdGVyIGludCBlcnI7CisgIGlmIChzb2FwLT5zdGF0dXMgPT0gU09BUF9HRVQpCisgICAgcyA9ICJHRVQiOworICBlbHNlCisgICAgcyA9ICJQT1NUIjsKKyNpZmRlZiBQQUxNCisgIGlmICghZW5kcG9pbnQgfHwgKHN0cm5jbXAoZW5kcG9pbnQsICJodHRwOiIsIDUpICYmIHN0cm5jbXAoZW5kcG9pbnQsICJodHRwczoiLCA2KSAmJiBzdHJuY21wKGVuZHBvaW50LCAiaHR0cGc6IiwgNikpICYmIHN0cm5jbXAoZW5kcG9pbnQsICJfYmVhbToiLCA2KSAmJiBzdHJuY21wKGVuZHBvaW50LCAiX2xvY2FsOiIsIDcpICYmIHN0cm5jbXAoZW5kcG9pbnQsICJfYnRvYmV4OiIsIDgpKQorI2Vsc2UKKyAgaWYgKCFlbmRwb2ludCB8fCAoc3RybmNtcChlbmRwb2ludCwgImh0dHA6IiwgNSkgJiYgc3RybmNtcChlbmRwb2ludCwgImh0dHBzOiIsIDYpICYmIHN0cm5jbXAoZW5kcG9pbnQsICJodHRwZzoiLCA2KSkpCisjZW5kaWYKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgaWYgKHNvYXAtPnByb3h5X2hvc3QgJiYgc3RybmNtcChlbmRwb2ludCwgImh0dHBzOiIsIDYpKQorICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiJXMgJXMgSFRUUC8lcyIsIHMsIGVuZHBvaW50LCBzb2FwLT5odHRwX3ZlcnNpb24pOworICBlbHNlCisgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICIlcyAvJXMgSFRUUC8lcyIsIHMsICgqcGF0aCA9PSAnLycgPyBwYXRoICsgMSA6IHBhdGgpLCBzb2FwLT5odHRwX3ZlcnNpb24pOworICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgTlVMTCkpKQorICAgIHJldHVybiBlcnI7CisgIGlmIChwb3J0ICE9IDgwKQorICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiJXM6JWQiLCBob3N0LCBwb3J0KTsKKyAgZWxzZQorICAgIHN0cmNweShzb2FwLT50bXBidWYsIGhvc3QpOyAKKyAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiSG9zdCIsIHNvYXAtPnRtcGJ1ZikpCisgICB8fCAoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlVzZXItQWdlbnQiLCAiZ1NPQVAvMi43IikpCisgICB8fCAoZXJyID0gc29hcF9wdXRodHRwaGRyKHNvYXAsIFNPQVBfT0ssIGNvdW50KSkpCisgICAgcmV0dXJuIGVycjsKKyNpZmRlZiBXSVRIX1pMSUIKKyNpZmRlZiBXSVRIX0daSVAKKyAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQWNjZXB0LUVuY29kaW5nIiwgImd6aXAsIGRlZmxhdGUiKSkpCisjZWxzZQorICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJBY2NlcHQtRW5jb2RpbmciLCAiZGVmbGF0ZSIpKSkKKyNlbmRpZgorICAgIHJldHVybiBlcnI7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT51c2VyaWQgJiYgc29hcC0+cGFzc3dkICYmIHN0cmxlbihzb2FwLT51c2VyaWQpICsgc3RybGVuKHNvYXAtPnBhc3N3ZCkgPCA3NjEpCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYgKyAyNjIsICIlczolcyIsIHNvYXAtPnVzZXJpZCwgc29hcC0+cGFzc3dkKTsKKyAgICBzdHJjcHkoc29hcC0+dG1wYnVmLCAiQmFzaWMgIik7CisgICAgc29hcF9zMmJhc2U2NChzb2FwLCAoY29uc3QgdW5zaWduZWQgY2hhciopKHNvYXAtPnRtcGJ1ZiArIDI2MiksIHNvYXAtPnRtcGJ1ZiArIDYsIHN0cmxlbihzb2FwLT50bXBidWYgKyAyNjIpKTsKKyAgICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJBdXRob3JpemF0aW9uIiwgc29hcC0+dG1wYnVmKSkpCisgICAgICByZXR1cm4gZXJyOworICB9CisgIGlmIChzb2FwLT5wcm94eV91c2VyaWQgJiYgc29hcC0+cHJveHlfcGFzc3dkICYmIHN0cmxlbihzb2FwLT5wcm94eV91c2VyaWQpICsgc3RybGVuKHNvYXAtPnByb3h5X3Bhc3N3ZCkgPCA3NjEpCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYgKyAyNjIsICIlczolcyIsIHNvYXAtPnByb3h5X3VzZXJpZCwgc29hcC0+cHJveHlfcGFzc3dkKTsKKyAgICBzdHJjcHkoc29hcC0+dG1wYnVmLCAiQmFzaWMgIik7CisgICAgc29hcF9zMmJhc2U2NChzb2FwLCAoY29uc3QgdW5zaWduZWQgY2hhciopKHNvYXAtPnRtcGJ1ZiArIDI2MiksIHNvYXAtPnRtcGJ1ZiArIDYsIHN0cmxlbihzb2FwLT50bXBidWYgKyAyNjIpKTsKKyAgICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJQcm94eS1BdXRob3JpemF0aW9uIiwgc29hcC0+dG1wYnVmKSkpCisgICAgICByZXR1cm4gZXJyOworICB9CisjZW5kaWYKKyNpZmRlZiBXSVRIX0NPT0tJRVMKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgaWYgKHNvYXBfcHV0Y29va2llcyhzb2FwLCBob3N0LCBwYXRoLCBzb2FwLT5zc2wgIT0gTlVMTCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2Vsc2UKKyAgaWYgKHNvYXBfcHV0Y29va2llcyhzb2FwLCBob3N0LCBwYXRoLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjZW5kaWYKKyNlbmRpZgorICBpZiAoYWN0aW9uICYmIHNvYXAtPnZlcnNpb24gPT0gMSkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIlwiJXNcIiIsIGFjdGlvbik7CisgICAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiU09BUEFjdGlvbiIsIHNvYXAtPnRtcGJ1ZikpKQorICAgICAgcmV0dXJuIGVycjsKKyAgfQorICByZXR1cm4gc29hcC0+ZnBvc3RoZHIoc29hcCwgTlVMTCwgTlVMTCk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK2h0dHBfc2VuZF9oZWFkZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMpCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnQ7CisgIGRvCisgIHsgdCA9IHN0cmNocihzLCAnXG4nKTsgLyogZGlzYWxsb3cgXG4gaW4gSFRUUCBoZWFkZXJzICovCisgICAgaWYgKCF0KQorICAgICAgdCA9IHMgKyBzdHJsZW4ocyk7CisgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIHMgPSB0ICsgMTsKKyAgfSB3aGlsZSAoKnQpOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAoraHR0cF9wb3N0X2hlYWRlcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWwpCit7IGlmIChrZXkpCisgIHsgaWYgKGh0dHBfc2VuZF9oZWFkZXIoc29hcCwga2V5KSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAodmFsICYmIChzb2FwX3NlbmRfcmF3KHNvYXAsICI6ICIsIDIpIHx8IGh0dHBfc2VuZF9oZWFkZXIoc29hcCwgdmFsKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgIlxyXG4iLCAyKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAoraHR0cF9yZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0YXR1cywgc2l6ZV90IGNvdW50KQoreyByZWdpc3RlciBpbnQgZXJyOworI2lmZGVmIFdNV19SUE1fSU8KKyAgaWYgKHNvYXAtPnJwbXJlcWlkKQorICAgIGh0dHBPdXRwdXRFbmFibGUoc29hcC0+cnBtcmVxaWQpOworI2VuZGlmCisgIGlmICghc3RhdHVzIHx8IHN0YXR1cyA9PSBTT0FQX0hUTUwgfHwgc3RhdHVzID09IFNPQVBfRklMRSkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk9LIDIwMFxuIikpOworI2lmZGVmIFdNV19SUE1fSU8KKyAgICBpZiAoc29hcC0+cnBtcmVxaWQgfHwgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSB8fCBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKSAvKiBSUE0gYmVoYXZlcyBhcyBpZiBzdGFuZGFsb25lICovCisjZWxzZQorICAgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpIHx8IHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpIC8qIHN0YW5kYWxvbmUgYXBwbGljYXRpb24gKi8KKyNlbmRpZgorICAgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJIVFRQLyVzIDIwMCBPSyIsIHNvYXAtPmh0dHBfdmVyc2lvbik7CisgICAgICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgTlVMTCkpKQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBlbHNlIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlN0YXR1cyIsICIyMDAgT0siKSkpCisgICAgICByZXR1cm4gZXJyOworICB9CisgIGVsc2UgaWYgKHN0YXR1cyA+IDIwMCAmJiBzdGF0dXMgPCA2MDApCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJIVFRQLyVzICVkICVzIiwgc29hcC0+aHR0cF92ZXJzaW9uLCBzdGF0dXMsIGh0dHBfZXJyb3Ioc29hcCwgc3RhdHVzKSk7CisgICAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCBzb2FwLT50bXBidWYsIE5VTEwpKSkKKyAgICAgIHJldHVybiBlcnI7CisjaWZuZGVmIFdJVEhfTEVBTiAKKyAgICBpZiAoc3RhdHVzID09IDQwMSkKKyAgICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiQmFzaWMgcmVhbG09XCIlc1wiIiwgc29hcC0+YXV0aHJlYWxtID8gc29hcC0+YXV0aHJlYWxtIDogImdTT0FQIFdlYiBTZXJ2aWNlIik7CisgICAgICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJXV1ctQXV0aGVudGljYXRlIiwgc29hcC0+dG1wYnVmKSkpCisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGVsc2UgaWYgKChzdGF0dXMgPj0gMzAxICYmIHN0YXR1cyA8PSAzMDMpIHx8IHN0YXR1cyA9PSAzMDcpCisgICAgeyBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJMb2NhdGlvbiIsIHNvYXAtPmVuZHBvaW50KSkpCisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorI2VuZGlmCisgIH0KKyAgZWxzZQorICB7IGNvbnN0IGNoYXIgKnMgPSAqc29hcF9mYXVsdGNvZGUoc29hcCk7CisgICAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMiAmJiAhc3RyY21wKHMsICJTT0FQLUVOVjpTZW5kZXIiKSkKKyAgICAgIHMgPSAiNDAwIEJhZCBSZXF1ZXN0IjsKKyAgICBlbHNlCisgICAgICBzID0gIjUwMCBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IiOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRXJyb3IgJXMgKHN0YXR1cz0lZClcbiIsIHMsIHN0YXR1cykpOworI2lmZGVmIFdNV19SUE1fSU8KKyAgICBpZiAoc29hcC0+cnBtcmVxaWQgfHwgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSB8fCBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKSAvKiBSUE0gYmVoYXZlcyBhcyBpZiBzdGFuZGFsb25lICovCisjZWxzZQorICAgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpIHx8IHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpIC8qIHN0YW5kYWxvbmUgYXBwbGljYXRpb24gKi8KKyNlbmRpZgorICAgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJIVFRQLyVzICVzIiwgc29hcC0+aHR0cF92ZXJzaW9uLCBzKTsKKyAgICAgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgc29hcC0+dG1wYnVmLCBOVUxMKSkpCisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGVsc2UgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiU3RhdHVzIiwgcykpKQorICAgICAgcmV0dXJuIGVycjsKKyAgfQorICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJTZXJ2ZXIiLCAiZ1NPQVAvMi43IikpCisgICB8fCAoZXJyID0gc29hcF9wdXRodHRwaGRyKHNvYXAsIHN0YXR1cywgY291bnQpKSkKKyAgICByZXR1cm4gZXJyOworI2lmZGVmIFdJVEhfQ09PS0lFUworICBpZiAoc29hcF9wdXRzZXRjb29raWVzKHNvYXApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNlbmRpZgorICByZXR1cm4gc29hcC0+ZnBvc3RoZHIoc29hcCwgTlVMTCwgTlVMTCk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0YXR1cykKK3sgcmVnaXN0ZXIgc2l6ZV90IGNvdW50OworICBpZiAoIShzb2FwLT5vbW9kZSAmIChTT0FQX0VOQ19YTUwgfCBTT0FQX0lPX1NUT1JFIC8qIHRoaXMgdGVzdHMgZm9yIGNodW5raW5nIHRvbyAqLykpCisgICAmJiAoc3RhdHVzID09IFNPQVBfSFRNTCB8fCBzdGF0dXMgPT0gU09BUF9GSUxFKSkKKyAgeyBzb2FwLT5vbW9kZSAmPSB+U09BUF9JTzsKKyAgICBzb2FwLT5vbW9kZSB8PSBTT0FQX0lPX1NUT1JFOworICB9CisgIHNvYXAtPnN0YXR1cyA9IHN0YXR1czsKKyAgY291bnQgPSBzb2FwX2NvdW50X2F0dGFjaG1lbnRzKHNvYXApOworICBpZiAoc29hcF9iZWdpbl9zZW5kKHNvYXApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgIT0gU09BUF9JT19TVE9SRSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpKQorICB7IHJlZ2lzdGVyIGludCBuID0gc29hcC0+bW9kZTsKKyAgICBzb2FwLT5tb2RlICY9IH4oU09BUF9JTyB8IFNPQVBfRU5DX1pMSUIpOworICAgIGlmICgobiAmIFNPQVBfSU8pICE9IFNPQVBfSU9fRkxVU0gpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fQlVGRkVSOworICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcmVzcG9uc2Uoc29hcCwgc3RhdHVzLCBjb3VudCkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICAgIGlmICgobiAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgICAgeyBpZiAoc29hcF9mbHVzaChzb2FwKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyNlbmRpZgorICAgIHNvYXAtPm1vZGUgPSBuOworICB9CisjZW5kaWYKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgY29uc3QgY2hhcioKK3NvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKnQpCit7IGlmICgqc29hcC0+dGFnKQorICAgIHNwcmludGYoc29hcC0+bXNnYnVmLCAiVmFsaWRhdGlvbiBjb25zdHJhaW50IHZpb2xhdGlvbjogJXMlcyBpbiBlbGVtZW50IDwlcz4iLCBzLCB0P3Q6U09BUF9TVFJfRU9TLCBzb2FwLT50YWcpOworICBlbHNlCisgICAgc3ByaW50Zihzb2FwLT5tc2didWYsICJWYWxpZGF0aW9uIGNvbnN0cmFpbnQgdmlvbGF0aW9uOiAlcyVzIiwgcywgdD90OlNPQVBfU1RSX0VPUyk7CisgIHJldHVybiBzb2FwLT5tc2didWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgY29uc3QgY2hhciAqKmMgPSBzb2FwX2ZhdWx0Y29kZShzb2FwKTsKKyAgY29uc3QgY2hhciAqKnMgPSBzb2FwX2ZhdWx0c3RyaW5nKHNvYXApOworICBpZiAoISpjICYmICEqcyAmJiBzb2FwLT5mc2V0ZXJyb3IpCisgICAgc29hcC0+ZnNldGVycm9yKHNvYXAsIGMsIHMpOworICBpZiAoISpjKQorICB7IGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgICAgICAqYyA9ICJTT0FQLUVOVjpTZW5kZXIiOworICAgIGVsc2UKKyAgICAgICpjID0gIlNPQVAtRU5WOkNsaWVudCI7CisgIH0KKyAgaWYgKCpzKQorICAgIHJldHVybjsKKyAgc3dpdGNoIChzb2FwLT5lcnJvcikKKyAgeworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBjYXNlIFNPQVBfQ0xJX0ZBVUxUOgorICAgICAgKnMgPSAiQ2xpZW50IGZhdWx0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9TVlJfRkFVTFQ6CisgICAgICAqcyA9ICJTZXJ2ZXIgZmF1bHQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1RBR19NSVNNQVRDSDoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAidGFnIG5hbWUgb3IgbmFtZXNwYWNlIG1pc21hdGNoIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfVFlQRToKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAiZGF0YSB0eXBlIG1pc21hdGNoICIsIHNvYXAtPnR5cGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1NZTlRBWF9FUlJPUjoKKyAgICAgICpzID0gIldlbGwtZm9ybWVkbmVzcyB2aW9sYXRpb24iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX05PX1RBRzoKKyAgICAgICpzID0gIk5vIFhNTCBlbGVtZW50IHRhZyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTVVTVFVOREVSU1RBTkQ6CisgICAgICAqYyA9ICJTT0FQLUVOVjpNdXN0VW5kZXJzdGFuZCI7CisgICAgICBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIlRoZSBkYXRhIGluIGVsZW1lbnQgJyVzJyBtdXN0IGJlIHVuZGVyc3Rvb2QgYnV0IGNhbm5vdCBiZSBoYW5kbGVkIiwgc29hcC0+dGFnKTsKKyAgICAgICpzID0gc29hcC0+bXNnYnVmOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1ZFUlNJT05NSVNNQVRDSDoKKyAgICAgICpjID0gIlNPQVAtRU5WOlZlcnNpb25NaXNtYXRjaCI7CisgICAgICAqcyA9ICJTT0FQIHZlcnNpb24gbWlzbWF0Y2ggb3IgaW52YWxpZCBTT0FQIG1lc3NhZ2UiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0RBVEFFTkNPRElOR1VOS05PV046CisgICAgICAqYyA9ICJTT0FQLUVOVjpEYXRhRW5jb2RpbmdVbmtub3duIjsKKyAgICAgICpzID0gIlVuc3VwcG9ydGVkIFNPQVAgZGF0YSBlbmNvZGluZyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTkFNRVNQQUNFOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJuYW1lc3BhY2UgbWlzbWF0Y2giLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9VU0VSX0VSUk9SOgorICAgICAgKnMgPSAiVXNlciBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfRkFUQUxfRVJST1I6CisgICAgICAqcyA9ICJGYXRhbCBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTk9fTUVUSE9EOgorICAgICAgc3ByaW50Zihzb2FwLT5tc2didWYsICJNZXRob2QgJyVzJyBub3QgaW1wbGVtZW50ZWQ6IG1ldGhvZCBuYW1lIG9yIG5hbWVzcGFjZSBub3QgcmVjb2duaXplZCIsIHNvYXAtPnRhZyk7CisgICAgICAqcyA9IHNvYXAtPm1zZ2J1ZjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9HRVRfTUVUSE9EOgorICAgICAgKnMgPSAiSFRUUCBHRVQgbWV0aG9kIG5vdCBpbXBsZW1lbnRlZCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfRU9NOgorICAgICAgKnMgPSAiT3V0IG9mIG1lbW9yeSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfSU9COgorICAgICAgKnMgPSAiQXJyYXkgaW5kZXggb3V0IG9mIGJvdW5kcyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTlVMTDoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAibmlsIG5vdCBhbGxvd2VkIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfRFVQTElDQVRFX0lEOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJtdWx0aXBsZSBkZWZpbml0aW9ucyBvZiBpZCAiLCBzb2FwLT5pZCk7CisgICAgICBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICAgICAgICAqc29hcF9mYXVsdHN1YmNvZGUoc29hcCkgPSAiU09BUC1FTkM6RHVwbGljYXRlSUQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX01JU1NJTkdfSUQ6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgIm1pc3NpbmcgaWQgZm9yIHJlZiAiLCBzb2FwLT5pZCk7CisgICAgICBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICAgICAgICAqc29hcF9mYXVsdHN1YmNvZGUoc29hcCkgPSAiU09BUC1FTkM6TWlzc2luZ0lEIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9IUkVGOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJpbmNvbXBhdGlibGUgb2JqZWN0IHJlZiAiLCBzb2FwLT5pZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfRkFVTFQ6CisgICAgICBicmVhazsKKyNpZm5kZWYgV0lUSF9OT0lPCisgICAgY2FzZSBTT0FQX1VEUF9FUlJPUjoKKyAgICAgICpzID0gIk1lc3NhZ2UgdG9vIGxhcmdlIGZvciBVRFAgcGFja2V0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9UQ1BfRVJST1I6CisgICAgICAqcyA9IHRjcF9lcnJvcihzb2FwKTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSBTT0FQX0hUVFBfRVJST1I6CisgICAgICAqcyA9ICJIVFRQIGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9TU0xfRVJST1I6CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgICAgICAqcyA9ICJTU0wgZXJyb3IiOworI2Vsc2UKKyAgICAgICpzID0gIk9wZW5TU0wgbm90IGluc3RhbGxlZDogcmVjb21waWxlIHdpdGggLURXSVRIX09QRU5TU0wiOworI2VuZGlmCisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfUExVR0lOX0VSUk9SOgorICAgICAgKnMgPSAiUGx1Z2luIHJlZ2lzdHJ5IGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9ESU1FX0VSUk9SOgorICAgICAgKnMgPSAiRElNRSBmb3JtYXQgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0RJTUVfSFJFRjoKKyAgICAgICpzID0gIkRJTUUgaHJlZiB0byBtaXNzaW5nIGF0dGFjaG1lbnQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0RJTUVfTUlTTUFUQ0g6CisgICAgICAqcyA9ICJESU1FIHZlcnNpb24vdHJhbnNtaXNzaW9uIGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9ESU1FX0VORDoKKyAgICAgICpzID0gIkVuZCBvZiBESU1FIGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9NSU1FX0VSUk9SOgorICAgICAgKnMgPSAiTUlNRSBmb3JtYXQgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX01JTUVfSFJFRjoKKyAgICAgICpzID0gIk1JTUUgaHJlZiB0byBtaXNzaW5nIGF0dGFjaG1lbnQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX01JTUVfRU5EOgorICAgICAgKnMgPSAiRW5kIG9mIE1JTUUgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1pMSUJfRVJST1I6CisjaWZkZWYgV0lUSF9aTElCCisgICAgICBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIlpsaWIvZ3ppcCBlcnJvcjogJyVzJyIsIHNvYXAtPmRfc3RyZWFtLm1zZz9zb2FwLT5kX3N0cmVhbS5tc2c6IiIpOworICAgICAgKnMgPSBzb2FwLT5tc2didWY7CisjZWxzZQorICAgICAgKnMgPSAiWmxpYi9nemlwIG5vdCBpbnN0YWxsZWQgZm9yIChkZSljb21wcmVzc2lvbjogcmVjb21waWxlIHdpdGggLURXSVRIX0daSVAiOworI2VuZGlmCisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfUkVRVUlSRUQ6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgIm1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfUFJPSElCSVRFRDoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAicHJvaGliaXRlZCBhdHRyaWJ1dGUgcHJlc2VudCIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX09DQ1VSUzoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAibWluL21heE9jY3VycyB2aW9sYXRpb24iLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9MRU5HVEg6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgImNvbnRlbnQgbGVuZ3RoIHZpb2xhdGlvbiIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1NUT1A6CisgICAgICAqcyA9ICJTdG9wcGVkOiBubyByZXNwb25zZSBzZW50IjsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSBTT0FQX0VPRjoKKyNpZm5kZWYgV0lUSF9OT0lPCisgICAgICBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIkVuZCBvZiBmaWxlIG9yIG5vIGlucHV0OiAnJXMnIiwgc29hcF9zdHJlcnJvcihzb2FwKSk7CisgICAgICAqcyA9IHNvYXAtPm1zZ2J1ZjsKKyAgICAgIGJyZWFrOworI2Vsc2UKKyAgICAgICpzID0gIkVuZCBvZiBmaWxlIG9yIG5vIGlucHV0IjsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdDoKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICBpZiAoc29hcC0+ZXJyb3IgPiAyMDAgJiYgc29hcC0+ZXJyb3IgPCA2MDApCisgICAgICB7IHNwcmludGYoc29hcC0+bXNnYnVmLCAiSFRUUCBFcnJvcjogJWQgJXMiLCBzb2FwLT5lcnJvciwgaHR0cF9lcnJvcihzb2FwLCBzb2FwLT5lcnJvcikpOworICAgICAgICAqcyA9IHNvYXAtPm1zZ2J1ZjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyNlbmRpZgorI2VuZGlmCisgICAgICB7IHNwcmludGYoc29hcC0+bXNnYnVmLCAiRXJyb3IgJWQiLCBzb2FwLT5lcnJvcik7CisgICAgICAgICpzID0gc29hcC0+bXNnYnVmOworICAgICAgfQorICAgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZW5kX2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgc3RhdHVzID0gc29hcC0+ZXJyb3I7CisgIGludCByID0gMTsKKyAgaWYgKHN0YXR1cyA9PSBTT0FQX1NUT1ApCisgICAgcmV0dXJuIHN0YXR1czsKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNlbmRpbmcgYmFjayBmYXVsdCBzdHJ1Y3QgZm9yIGVycm9yIGNvZGUgJWRcbiIsIHNvYXAtPmVycm9yKSk7CisgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOyAvKiB0byB0ZXJtaW5hdGUgY29ubmVjdGlvbiAqLworICBzb2FwX3NldF9mYXVsdChzb2FwKTsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgIGZkX3NldCByZmQsIHNmZDsKKyAgICB0aW1lb3V0LnR2X3NlYyA9IDA7CisgICAgdGltZW91dC50dl91c2VjID0gMDsKKyAgICBGRF9aRVJPKCZyZmQpOworICAgIEZEX1pFUk8oJnNmZCk7CisgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZyZmQpOworICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmc2ZkKTsKKyAgICByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksICZyZmQsICZzZmQsIE5VTEwsICZ0aW1lb3V0KTsKKyAgICBpZiAociA+IDApCisgICAgeyBpZiAoIUZEX0lTU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZzZmQpCisgICAgICAgfHwgKEZEX0lTU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZyZmQpCisgICAgICAgICYmIHJlY3YoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgc29hcC0+dG1wYnVmLCAxLCBNU0dfUEVFSykgPCAwKSkKKyAgICAgICAgciA9IDA7CisgICAgfQorICB9CisjZW5kaWYKKyNlbmRpZgorICBpZiAoKHN0YXR1cyAhPSBTT0FQX0VPRiB8fCAoIXNvYXAtPnJlY3ZfdGltZW91dCAmJiAhc29hcC0+c2VuZF90aW1lb3V0KSkgJiYgciA+IDApCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICAgIHNvYXBfc2VyaWFsaXplaGVhZGVyKHNvYXApOworICAgIHNvYXBfc2VyaWFsaXplZmF1bHQoc29hcCk7CisgICAgc29hcF9iZWdpbl9jb3VudChzb2FwKTsKKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICAgIHsgc29hcF9lbnZlbG9wZV9iZWdpbl9vdXQoc29hcCk7CisgICAgICBzb2FwX3B1dGhlYWRlcihzb2FwKTsKKyAgICAgIHNvYXBfYm9keV9iZWdpbl9vdXQoc29hcCk7CisgICAgICBzb2FwX3B1dGZhdWx0KHNvYXApOworICAgICAgc29hcF9ib2R5X2VuZF9vdXQoc29hcCk7CisgICAgICBzb2FwX2VudmVsb3BlX2VuZF9vdXQoc29hcCk7CisgICAgfQorICAgIHNvYXBfZW5kX2NvdW50KHNvYXApOworICAgIGlmIChzb2FwX3Jlc3BvbnNlKHNvYXAsIHN0YXR1cykKKyAgICAgfHwgc29hcF9lbnZlbG9wZV9iZWdpbl9vdXQoc29hcCkKKyAgICAgfHwgc29hcF9wdXRoZWFkZXIoc29hcCkKKyAgICAgfHwgc29hcF9ib2R5X2JlZ2luX291dChzb2FwKQorICAgICB8fCBzb2FwX3B1dGZhdWx0KHNvYXApCisgICAgIHx8IHNvYXBfYm9keV9lbmRfb3V0KHNvYXApCisgICAgIHx8IHNvYXBfZW52ZWxvcGVfZW5kX291dChzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICBzb2FwX2VuZF9zZW5kKHNvYXApOworICB9CisgIHNvYXAtPmVycm9yID0gc3RhdHVzOworICByZXR1cm4gc29hcF9jbG9zZXNvY2soc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVjdl9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IHN0YXR1cyA9IHNvYXAtPmVycm9yOworICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVjZWl2aW5nIFNPQVAgRmF1bHRcbiIpKTsKKyAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICBpZiAoc29hcF9nZXRmYXVsdChzb2FwKSkKKyAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiRXJyb3I6IHNvYXBfZ2V0X3NvYXBmYXVsdCgpIGZhaWxlZC4gSXMgdGhpcyBhIFNPQVAgbWVzc2FnZSBhdCBhbGw/XG4iKSk7CisgICAgKnNvYXBfZmF1bHRjb2RlKHNvYXApID0gKHNvYXAtPnZlcnNpb24gPT0gMiA/ICJTT0FQLUVOVjpTZW5kZXIiIDogIlNPQVAtRU5WOkNsaWVudCIpOworICAgIHNvYXAtPmVycm9yID0gc3RhdHVzOworICAgIHNvYXBfc2V0X2ZhdWx0KHNvYXApOworICB9CisgIGVsc2UKKyAgeyByZWdpc3RlciBjb25zdCBjaGFyICpzID0gKnNvYXBfZmF1bHRjb2RlKHNvYXApOworICAgIGlmICghc29hcF9tYXRjaF90YWcoc29hcCwgcywgIlNPQVAtRU5WOlNlcnZlciIpIHx8ICFzb2FwX21hdGNoX3RhZyhzb2FwLCBzLCAiU09BUC1FTlY6UmVjZWl2ZXIiKSkKKyAgICAgIHN0YXR1cyA9IFNPQVBfU1ZSX0ZBVUxUOyAKKyAgICBlbHNlIGlmICghc29hcF9tYXRjaF90YWcoc29hcCwgcywgIlNPQVAtRU5WOkNsaWVudCIpIHx8ICFzb2FwX21hdGNoX3RhZyhzb2FwLCBzLCAiU09BUC1FTlY6U2VuZGVyIikpCisgICAgICBzdGF0dXMgPSBTT0FQX0NMSV9GQVVMVDsKKyAgICBlbHNlIGlmICghc29hcF9tYXRjaF90YWcoc29hcCwgcywgIlNPQVAtRU5WOk11c3RVbmRlcnN0YW5kIikpCisgICAgICBzdGF0dXMgPSBTT0FQX01VU1RVTkRFUlNUQU5EOworICAgIGVsc2UgaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCBzLCAiU09BUC1FTlY6VmVyc2lvbk1pc21hdGNoIikpCisgICAgICBzdGF0dXMgPSBTT0FQX1ZFUlNJT05NSVNNQVRDSDsKKyAgICBlbHNlCisgICAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiRmF1bHQgY29kZSAlc1xuIiwgcykpOworICAgICAgc3RhdHVzID0gU09BUF9GQVVMVDsKKyAgICB9CisgICAgaWYgKHNvYXBfYm9keV9lbmRfaW4oc29hcCkKKyAgICAgfHwgc29hcF9lbnZlbG9wZV9lbmRfaW4oc29hcCkKKyAgICAgfHwgc29hcF9lbmRfcmVjdihzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICBzb2FwLT5lcnJvciA9IHN0YXR1czsKKyAgfQorICByZXR1cm4gc29hcF9jbG9zZXNvY2soc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2VuZF9lbXB0eV9yZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+Y291bnQgPSAwOworICBpZiAoc29hcF9yZXNwb25zZShzb2FwLCBTT0FQX09LKSB8fCBzb2FwX2VuZF9zZW5kKHNvYXApKQorICAgIHJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWN2X2VtcHR5X3Jlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcF9iZWdpbl9yZWN2KHNvYXApIHx8IHNvYXBfZW5kX3JlY3Yoc29hcCkpCisgICAgcmV0dXJuIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBjb25zdCBjaGFyKgorc29hcF9zdHJlcnJvcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IGVyciA9IHNvYXAtPmVycm51bTsKKyAgaWYgKGVycikKKyAgeworI2lmbmRlZiBXSU4zMgorICAgIHJldHVybiBzdHJlcnJvcihlcnIpOworI2Vsc2UKKyAgICBGb3JtYXRNZXNzYWdlKEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNfEZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTLCBOVUxMLCBlcnIsIDAsIChMUFRTVFIpJnNvYXAtPmVycm9yc3RyLCBzaXplb2Yoc29hcC0+ZXJyb3JzdHIpLCBOVUxMKTsKKyAgICByZXR1cm4gc29hcC0+ZXJyb3JzdHI7CisjZW5kaWYKKyAgfQorICByZXR1cm4gIk9wZXJhdGlvbiBpbnRlcnJ1cHRlZCBvciB0aW1lZCBvdXQiOworfQorI2VuZGlmCisjZW5kaWYgCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorc3RhdGljIGludAorc29hcF9zZXRfZXJyb3Ioc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZhdWx0Y29kZSwgY29uc3QgY2hhciAqZmF1bHRzdWJjb2RlLCBjb25zdCBjaGFyICpmYXVsdHN0cmluZywgY29uc3QgY2hhciAqZmF1bHRkZXRhaWwsIGludCBzb2FwZXJyb3IpCit7ICpzb2FwX2ZhdWx0Y29kZShzb2FwKSA9IGZhdWx0Y29kZTsKKyAgaWYgKGZhdWx0c3ViY29kZSkKKyAgICAqc29hcF9mYXVsdHN1YmNvZGUoc29hcCkgPSBmYXVsdHN1YmNvZGU7CisgICpzb2FwX2ZhdWx0c3RyaW5nKHNvYXApID0gZmF1bHRzdHJpbmc7CisgIGlmIChmYXVsdGRldGFpbCAmJiAqZmF1bHRkZXRhaWwpCisgIHsgcmVnaXN0ZXIgY29uc3QgY2hhciAqKnMgPSBzb2FwX2ZhdWx0ZGV0YWlsKHNvYXApOworICAgIGlmIChzKQorICAgICAgKnMgPSBmYXVsdGRldGFpbDsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3IgPSBzb2FwZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X3NlbmRlcl9lcnJvcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRzdHJpbmcsIGNvbnN0IGNoYXIgKmZhdWx0ZGV0YWlsLCBpbnQgc29hcGVycm9yKQoreyByZXR1cm4gc29hcF9zZXRfZXJyb3Ioc29hcCwgc29hcC0+dmVyc2lvbiA9PSAyID8gIlNPQVAtRU5WOlNlbmRlciIgOiAiU09BUC1FTlY6Q2xpZW50IiwgTlVMTCwgZmF1bHRzdHJpbmcsIGZhdWx0ZGV0YWlsLCBzb2FwZXJyb3IpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRzdHJpbmcsIGNvbnN0IGNoYXIgKmZhdWx0ZGV0YWlsLCBpbnQgc29hcGVycm9yKQoreyByZXR1cm4gc29hcF9zZXRfZXJyb3Ioc29hcCwgc29hcC0+dmVyc2lvbiA9PSAyID8gIlNPQVAtRU5WOlJlY2VpdmVyIiA6ICJTT0FQLUVOVjpTZXJ2ZXIiLCBOVUxMLCBmYXVsdHN0cmluZywgZmF1bHRkZXRhaWwsIHNvYXBlcnJvcik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitzdGF0aWMgaW50Citzb2FwX2NvcHlfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZhdWx0Y29kZSwgY29uc3QgY2hhciAqZmF1bHRzdWJjb2RlLCBjb25zdCBjaGFyICpmYXVsdHN0cmluZywgY29uc3QgY2hhciAqZmF1bHRkZXRhaWwpCit7IGNoYXIgKnIgPSBOVUxMLCAqcyA9IE5VTEwsICp0ID0gTlVMTDsKKyAgaWYgKGZhdWx0c3ViY29kZSkKKyAgICByID0gc29hcF9zdHJkdXAoc29hcCwgZmF1bHRzdWJjb2RlKTsKKyAgaWYgKGZhdWx0c3RyaW5nKQorICAgIHMgPSBzb2FwX3N0cmR1cChzb2FwLCBmYXVsdHN0cmluZyk7CisgIGlmIChmYXVsdGRldGFpbCkKKyAgICB0ID0gc29hcF9zdHJkdXAoc29hcCwgZmF1bHRkZXRhaWwpOworICByZXR1cm4gc29hcF9zZXRfZXJyb3Ioc29hcCwgZmF1bHRjb2RlLCByLCBzLCB0LCBTT0FQX0ZBVUxUKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZW5kZXJfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCkKK3sgcmV0dXJuIHNvYXBfc2VuZGVyX2ZhdWx0X3N1YmNvZGUoc29hcCwgTlVMTCwgZmF1bHRzdHJpbmcsIGZhdWx0ZGV0YWlsKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZW5kZXJfZmF1bHRfc3ViY29kZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRzdWJjb2RlLCBjb25zdCBjaGFyICpmYXVsdHN0cmluZywgY29uc3QgY2hhciAqZmF1bHRkZXRhaWwpCit7IHJldHVybiBzb2FwX2NvcHlfZmF1bHQoc29hcCwgc29hcC0+dmVyc2lvbiA9PSAyID8gIlNPQVAtRU5WOlNlbmRlciIgOiAiU09BUC1FTlY6Q2xpZW50IiwgZmF1bHRzdWJjb2RlLCBmYXVsdHN0cmluZywgZmF1bHRkZXRhaWwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlY2VpdmVyX2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdHN0cmluZywgY29uc3QgY2hhciAqZmF1bHRkZXRhaWwpCit7IHJldHVybiBzb2FwX3JlY2VpdmVyX2ZhdWx0X3N1YmNvZGUoc29hcCwgTlVMTCwgZmF1bHRzdHJpbmcsIGZhdWx0ZGV0YWlsKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWNlaXZlcl9mYXVsdF9zdWJjb2RlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdHN1YmNvZGUsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCkKK3sgcmV0dXJuIHNvYXBfY29weV9mYXVsdChzb2FwLCBzb2FwLT52ZXJzaW9uID09IDIgPyAiU09BUC1FTlY6UmVjZWl2ZXIiIDogIlNPQVAtRU5WOlNlcnZlciIsIGZhdWx0c3ViY29kZSwgZmF1bHRzdHJpbmcsIGZhdWx0ZGV0YWlsKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKKyNpZm5kZWYgV0lUSF9OT1NURExJQgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9wcmludF9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCwgRklMRSAqZmQpCit7IGlmIChzb2FwX2NoZWNrX3N0YXRlKHNvYXApKQorICAgIGZwcmludGYoZmQsICJFcnJvcjogc29hcCBzdHJ1Y3Qgbm90IGluaXRpYWxpemVkXG4iKTsKKyAgZWxzZSBpZiAoc29hcC0+ZXJyb3IpCisgIHsgY29uc3QgY2hhciAqYywgKnYgPSBOVUxMLCAqcywgKipkOworICAgIGQgPSBzb2FwX2ZhdWx0Y29kZShzb2FwKTsKKyAgICBpZiAoISpkKQorICAgICAgc29hcF9zZXRfZmF1bHQoc29hcCk7CisgICAgYyA9ICpkOworICAgIGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgICAgICB2ID0gKnNvYXBfZmF1bHRzdWJjb2RlKHNvYXApOworICAgIHMgPSAqc29hcF9mYXVsdHN0cmluZyhzb2FwKTsKKyAgICBkID0gc29hcF9mYXVsdGRldGFpbChzb2FwKTsKKyAgICBmcHJpbnRmKGZkLCAiJXMlZCBmYXVsdDogJXMgWyVzXVxuXCIlc1wiXG5EZXRhaWw6ICVzXG4iLCBzb2FwLT52ZXJzaW9uID8gIlNPQVAgMS4iIDogIkVycm9yICIsIHNvYXAtPnZlcnNpb24gPyAoaW50KXNvYXAtPnZlcnNpb24gOiBzb2FwLT5lcnJvciwgYywgdiA/IHYgOiAibm8gc3ViY29kZSIsIHMgPyBzIDogIltubyByZWFzb25dIiwgZCAmJiAqZCA/ICpkIDogIltubyBkZXRhaWxdIik7CisgIH0KK30KKyNlbmRpZgorI2VuZGlmCisgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKKyNpZm5kZWYgV0lUSF9OT1NURExJQgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9wcmludF9mYXVsdF9sb2NhdGlvbihzdHJ1Y3Qgc29hcCAqc29hcCwgRklMRSAqZmQpCit7IAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaW50IGksIGosIGMxLCBjMjsKKyAgaWYgKHNvYXAtPmVycm9yICYmIHNvYXAtPmJ1ZmxlbiA+IDApCisgIHsgaSA9IChpbnQpc29hcC0+YnVmaWR4IC0gMTsKKyAgICBpZiAoaSA8PSAwKQorICAgICAgaSA9IDA7CisgICAgYzEgPSBzb2FwLT5idWZbaV07CisgICAgc29hcC0+YnVmW2ldID0gJ1wwJzsKKyAgICBpZiAoKGludClzb2FwLT5idWZsZW4gPj0gaSArIDEwMjQpCisgICAgICBqID0gaSArIDEwMjM7CisgICAgZWxzZQorICAgICAgaiA9IChpbnQpc29hcC0+YnVmbGVuIC0gMTsKKyAgICBjMiA9IHNvYXAtPmJ1ZltqXTsKKyAgICBzb2FwLT5idWZbal0gPSAnXDAnOworICAgIGZwcmludGYoZmQsICIlcyVjXG4qKiBIRVJFICoqXG4iLCBzb2FwLT5idWYsIGMxKTsKKyAgICBpZiAoc29hcC0+YnVmaWR4IDwgc29hcC0+YnVmbGVuKQorICAgICAgZnByaW50ZihmZCwgIiVzXG4iLCBzb2FwLT5idWYgKyBzb2FwLT5idWZpZHgpOworICAgIHNvYXAtPmJ1ZltpXSA9IGMxOworICAgIHNvYXAtPmJ1ZltqXSA9IGMyOworICB9CisjZW5kaWYKK30KKyNlbmRpZgorI2VuZGlmCisgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWdpc3Rlcl9wbHVnaW5fYXJnKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgKCpmY3JlYXRlKShzdHJ1Y3Qgc29hcCosIHN0cnVjdCBzb2FwX3BsdWdpbiosIHZvaWQqKSwgdm9pZCAqYXJnKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnA7CisgIHJlZ2lzdGVyIGludCByOworICBpZiAoIShwID0gKHN0cnVjdCBzb2FwX3BsdWdpbiopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX3BsdWdpbikpKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgcC0+aWQgPSBOVUxMOworICBwLT5kYXRhID0gTlVMTDsKKyAgcC0+ZmNvcHkgPSBOVUxMOworICBwLT5mZGVsZXRlID0gTlVMTDsKKyAgciA9IGZjcmVhdGUoc29hcCwgcCwgYXJnKTsKKyAgaWYgKCFyICYmIHAtPmZkZWxldGUpCisgIHsgcC0+bmV4dCA9IHNvYXAtPnBsdWdpbnM7CisgICAgc29hcC0+cGx1Z2lucyA9IHA7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWdpc3RlcmVkICclcycgcGx1Z2luXG4iLCBwLT5pZCkpOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IHJlZ2lzdGVyIHBsdWdpbiAnJXMnOiBwbHVnaW4gcmV0dXJuZWQgZXJyb3IgJWQgKG9yIGZkZWxldGUgY2FsbGJhY2sgbm90IHNldClcbiIsIHAtPmlkP3AtPmlkOiI/IiwgcikpOworICBTT0FQX0ZSRUUoc29hcCwgcCk7CisgIHJldHVybiByOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQgKgorZnBsdWdpbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BsdWdpbiAqcDsKKyAgZm9yIChwID0gc29hcC0+cGx1Z2luczsgcDsgcCA9IHAtPm5leHQpCisgICAgaWYgKHAtPmlkID09IGlkIHx8ICFzdHJjbXAocC0+aWQsIGlkKSkKKyAgICAgIHJldHVybiBwLT5kYXRhOworICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQgKgorU09BUF9GTUFDMgorc29hcF9sb29rdXBfcGx1Z2luKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCkKK3sgcmV0dXJuIHNvYXAtPmZwbHVnaW4oc29hcCwgaWQpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpZm5kZWYgV0lUSF9MRUFOCitzb2FwOjpzb2FwKCkKK3sgc29hcF9pbml0KHRoaXMpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglDKysgc29hcCBzdHJ1Y3QgbWV0aG9kcworICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpZm5kZWYgV0lUSF9MRUFOCitzb2FwOjpzb2FwKHNvYXBfbW9kZSBtb2RlKQoreyBzb2FwX2luaXQxKHRoaXMsIG1vZGUpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworI2lmbmRlZiBXSVRIX0xFQU4KK3NvYXA6OnNvYXAoc29hcF9tb2RlIGltb2RlLCBzb2FwX21vZGUgb21vZGUpCit7IHNvYXBfaW5pdDIodGhpcywgaW1vZGUsIG9tb2RlKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpZm5kZWYgV0lUSF9MRUFOCitzb2FwOjpzb2FwKHN0cnVjdCBzb2FwJiBzb2FwKQoreyBzb2FwX2NvcHlfY29udGV4dCh0aGlzLCAmc29hcCk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIF9fY3BsdXNwbHVzCisjaWZuZGVmIFdJVEhfTEVBTgorc29hcDo6fnNvYXAoKQoreyBzb2FwX2Rlc3Ryb3kodGhpcyk7CisgIHNvYXBfZW5kKHRoaXMpOworICBzb2FwX2RvbmUodGhpcyk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZ3NvYXAtcGFsbS9zdGRzb2FwMi5oIGIvZ3NvYXAtcGFsbS9zdGRzb2FwMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNmM3NGQKLS0tIC9kZXYvbnVsbAorKysgYi9nc29hcC1wYWxtL3N0ZHNvYXAyLmgKQEAgLTAsMCArMSwyMDkzIEBACisvKgorCitzdGRzb2FwMi5oIDIuNy42ZQorCitnU09BUCBydW50aW1lCisKK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgcGFydCBvZiB0aGUgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXM6CitHUEwsIHRoZSBnU09BUCBwdWJsaWMgbGljZW5zZSwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NvbnRyaWJ1dG9yczoKKworV2luZCBSaXZlciBTeXN0ZW1zLCBJbmMuLCBmb3IgdGhlIGZvbGxvd2luZyBhZGRpdGlvbnMgKG1hcmtlZCBXUlsuLi5dKToKKyAgLSB2eFdvcmtzIGNvbXBhdGlibGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBwdWJsaWMgbGljZW5zZS4KKworVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZ1NPQVAgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjMKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcGxpY2Vuc2UuaHRtbAorU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKK1dJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQorZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFJvYmVydCBBLiB2YW4gRW5nZWxlbi4KK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZkZWYgV0lUSF9TT0FQREVGU19ICisjIGluY2x1ZGUgInNvYXBkZWZzLmgiCQkvKiBpbmNsdWRlIHVzZXItZGVmaW5lZCBzdHVmZiAqLworI2VuZGlmCisKKyNpZm5kZWYgX1RIUkVBRF9TQUZFCisjIGRlZmluZSBfVEhSRUFEX1NBRkUKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TRVJWRVIKKyMgaWZuZGVmIF9SRUVOVFJBTlQKKyMgIGRlZmluZSBfUkVFTlRSQU5UCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBTT0FQX0ZNQUMxCS8qIHN0ZHNvYXAyLmggZGVjbGFyYXRpb24gbWFjcm8gKi8KKyMgZGVmaW5lIFNPQVBfRk1BQzEKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfRk1BQzIJLyogc3Rkc29hcDIuaCBkZWNsYXJhdGlvbiBtYWNybyAqLworIyBkZWZpbmUgU09BUF9GTUFDMgorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9GTUFDMwkvKiAoZGUpc2VyaWFsaXplciBkZWNsYXJhdGlvbiBtYWNybyAqLworIyBkZWZpbmUgU09BUF9GTUFDMworI2VuZGlmCisKKyNpZm5kZWYgU09BUF9GTUFDM1MJLyogc3RyaW5nIGNvbnZlcnRlciBmb3IgKGRlKXNlcmlhbGl6ZXIgZGVjbGFyYXRpb24gbWFjcm8gKi8KKyMgZGVmaW5lIFNPQVBfRk1BQzNTIFNPQVBfRk1BQzMKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfRk1BQzQJLyogKGRlKXNlcmlhbGl6ZXIgZGVjbGFyYXRpb24gbWFjcm8gKi8KKyMgZGVmaW5lIFNPQVBfRk1BQzQKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfRk1BQzRTCS8qIHN0cmluZyBjb252ZXJ0ZXIgZm9yIChkZSlzZXJpYWxpemVyIGRlY2xhcmF0aW9uIG1hY3JvICovCisjIGRlZmluZSBTT0FQX0ZNQUM0UyBTT0FQX0ZNQUM0CisjZW5kaWYKKworI2lmbmRlZiBTT0FQX0ZNQUM1CS8qIHN0dWIvc2tlbGV0b24gZGVjbGFyYXRpb24gbWFjcm8gKi8KKyMgZGVmaW5lIFNPQVBfRk1BQzUKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfRk1BQzYJLyogc3R1Yi9za2VsZXRvbiBkZWNsYXJhdGlvbiBtYWNybyAqLworIyBkZWZpbmUgU09BUF9GTUFDNgorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9DTUFDCS8qIGNsYXNzIGRlY2xhcmF0aW9uIG1hY3JvICovCisjIGRlZmluZSBTT0FQX0NNQUMKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfTk1BQwkvKiBuYW1lc3BhY2UgdGFibGUgZGVjbGFyYXRpb24gbWFjcm8gKi8KKyMgZGVmaW5lIFNPQVBfTk1BQworI2VuZGlmCisKKyNpZm5kZWYgU09BUF9TT1VSQ0VfU1RBTVAKKyMgZGVmaW5lIFNPQVBfU09VUkNFX1NUQU1QKHN0cikKKyNlbmRpZgorCisvKiBnU09BUCAyLjcuNCBhbmQgaGlnaGVyOiBmYXN0IGxvb2stYXNpZGUgYnVmZmVyaW5nIGlzIHN0YWJsZSAqLworI2lmbmRlZiBXSVRIX0ZBU1QKKyMgZGVmaW5lIFdJVEhfRkFTVAorI2VuZGlmCisKKyNpZmRlZiBXSVRIX0xFQU5FUgorIyBpZm5kZWYgV0lUSF9MRUFOCisjICBkZWZpbmUgV0lUSF9MRUFOCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIFdJVEhfTEVBTgorIyBpZmRlZiBXSVRIX0NPT0tJRVMKKyMgIGVycm9yICJDYW5ub3QgYnVpbGQgV0lUSF9MRUFOIGNvZGUgV0lUSF9DT09LSUVTIGVuYWJsZWQiCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBTVERTT0FQX0gKKyNkZWZpbmUgU1REU09BUF9ICisKKyNpZiBkZWZpbmVkKF9fdnh3b3JrcykgfHwgZGVmaW5lZChfX1ZYV09SS1NfXykKKyMgZGVmaW5lIFZYV09SS1MKKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyCisjIGlmbmRlZiBXSU4zMgorIyAgZGVmaW5lIFdJTjMyCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIFVOREVSX0NFCisjIGlmbmRlZiBXSU4zMgorIyAgZGVmaW5lIFdJTjMyCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fQk9STEFORENfXworIyBpZmRlZiBfX1dJTjMyX18KKyMgIGlmbmRlZiBXSU4zMgorIyAgIGRlZmluZSBXSU4zMgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19DWUdXSU5fXworIyBpZm5kZWYgQ1lHV0lOCisjICBkZWZpbmUgQ1lHV0lOCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fU1lNQklBTjMyX18gCisjIGRlZmluZSBTWU1CSUFOCisjIHVuZGVmIFdJTjMyCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19wYWxtb3NfXykgfHwgZGVmaW5lZChQQUxNX0dDQykgfHwgZGVmaW5lZChfX1BBTE1PU19UUkFQU19fKQorIyBpZm5kZWYgUEFMTQorIyAgZGVmaW5lIFBBTE0KKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2hwdXgpCisjIGlmbmRlZiBIUF9VWAorIyAgZGVmaW5lIEhQX1VYCisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19hbHBoYSkgJiYgIWRlZmluZWQoX19WTVMpCisjIGlmbmRlZiBUUlU2NAorIyAgZGVmaW5lIFRSVTY0IAorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX01WU19fCisjIGlmbmRlZiBPUzM5MAorIyAgZGVmaW5lIE9TMzkwCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSAiY29uZmlnLmgiCisjIGlmZGVmIFdJVEhfT1BFTlNTTAorIyAgaWZuZGVmIEhBVkVfT1BFTlNTTF9TU0xfSAorIyAgIHVuZGVmIFdJVEhfT1BFTlNTTAorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbHNlCisjIGlmIGRlZmluZWQoVU5ERVJfQ0UpCisjICBkZWZpbmUgV0lUSF9MRUFOCisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgZWxpZiBkZWZpbmVkKFdJTjMyKQorIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfU1lTX1RJTUVCX0gKKyMgIGRlZmluZSBIQVZFX0ZUSU1FCisjICBkZWZpbmUgSEFWRV9XQ1RPTUIKKyMgIGRlZmluZSBIQVZFX01CVE9XQworIyAgZGVmaW5lIFNPQVBfTE9OR19GT1JNQVQgIiVJNjRkIgorIyAgZGVmaW5lIFNPQVBfVUxPTkdfRk9STUFUICIlSTY0dSIKKyMgZWxpZiBkZWZpbmVkKENZR1dJTikKKyMgIGRlZmluZSBIQVZFX1NUUlJDSFIKKyMgIGRlZmluZSBIQVZFX1NUUlRPRAorIyAgZGVmaW5lIEhBVkVfU1NDQU5GCisjICBkZWZpbmUgSEFWRV9TVFJUT0wKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUwKKyMgIGRlZmluZSBIQVZFX1NZU19USU1FQl9ICisjICBkZWZpbmUgSEFWRV9GVElNRQorIyAgZGVmaW5lIEhBVkVfUkFORF9SCisjICBkZWZpbmUgSEFWRV9HTVRJTUVfUgorIyAgZGVmaW5lIEhBVkVfTE9DQUxUSU1FX1IKKyMgIGRlZmluZSBIQVZFX1dDVE9NQgorIyAgZGVmaW5lIEhBVkVfTUJUT1dDCisjIGVsaWYgZGVmaW5lZChfX0FQUExFX18pCisjICBkZWZpbmUgSEFWRV9TVFJSQ0hSCisjICBkZWZpbmUgSEFWRV9TVFJUT0QKKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyAgZGVmaW5lIEhBVkVfU1RSVE9MCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMCisjICBkZWZpbmUgSEFWRV9SQU5EX1IKKyMgIGRlZmluZSBIQVZFX0dNVElNRV9SCisjICBkZWZpbmUgSEFWRV9MT0NBTFRJTUVfUgorIyAgZGVmaW5lIEhBVkVfVElNRUdNCisjICBkZWZpbmUgSEFWRV9XQ1RPTUIKKyMgIGRlZmluZSBIQVZFX01CVE9XQworIyBlbGlmIGRlZmluZWQoX0FJWFZFUlNJT05fNDMxKQorIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfU1lTX1RJTUVCX0gKKyMgIGRlZmluZSBIQVZFX0ZUSU1FCisjICBkZWZpbmUgSEFWRV9SQU5EX1IKKyMgIGRlZmluZSBIQVZFX0dNVElNRV9SCisjICBkZWZpbmUgSEFWRV9MT0NBTFRJTUVfUgorIyAgZGVmaW5lIEhBVkVfV0NUT01CCisjICBkZWZpbmUgSEFWRV9NQlRPV0MKKyMgZWxpZiBkZWZpbmVkKEhQX1VYKQorIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfU1lTX1RJTUVCX0gKKyMgIGRlZmluZSBIQVZFX0ZUSU1FCisjICBkZWZpbmUgSEFWRV9SQU5EX1IKKyMgIGRlZmluZSBIQVZFX0dNVElNRV9SCisjICBkZWZpbmUgSEFWRV9MT0NBTFRJTUVfUgorIyAgZGVmaW5lIEhBVkVfV0NUT01CCisjICBkZWZpbmUgSEFWRV9NQlRPV0MKKyMgZWxpZiBkZWZpbmVkKEZSRUVCU0QpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCisjICBkZWZpbmUgSEFWRV9TVFJSQ0hSCisjICBkZWZpbmUgSEFWRV9TVFJUT0QKKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyAgZGVmaW5lIEhBVkVfU1RSVE9MCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMCisjICBkZWZpbmUgSEFWRV9TVFJUT0xMCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMTAorIyAgZGVmaW5lIEhBVkVfR0VUVElNRU9GREFZCisjICBkZWZpbmUgSEFWRV9SQU5EX1IKKyMgIGRlZmluZSBIQVZFX0dNVElNRV9SCisjICBkZWZpbmUgSEFWRV9MT0NBTFRJTUVfUgorIyAgZGVmaW5lIEhBVkVfV0NUT01CCisjICBkZWZpbmUgSEFWRV9NQlRPV0MKKyMgIGRlZmluZSBTT0FQX0xPTkdfRk9STUFUICIlcWQiCisjICBkZWZpbmUgU09BUF9VTE9OR19GT1JNQVQgIiVxdSIKKyMgZWxpZiBkZWZpbmVkKF9fVk1TKQorIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfU1lTX1RJTUVCX0gKKyMgIGRlZmluZSBIQVZFX0ZUSU1FCisjICBkZWZpbmUgSEFWRV9SQU5EX1IKKyMgIGRlZmluZSBIQVZFX0dNVElNRV9SCisjICBkZWZpbmUgSEFWRV9MT0NBTFRJTUVfUgorIyAgZGVmaW5lIEhBVkVfV0NUT01CCisjICBkZWZpbmUgSEFWRV9NQlRPV0MKKyMgZWxpZiBkZWZpbmVkKF9fR0xJQkNfXykgfHwgZGVmaW5lZChfX0dOVV9fKQorIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9MTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTEwKKyMgIGRlZmluZSBIQVZFX1NZU19USU1FQl9ICisjICBkZWZpbmUgSEFWRV9GVElNRQorIyAgZGVmaW5lIEhBVkVfUkFORF9SCisjICBkZWZpbmUgSEFWRV9HTVRJTUVfUgorIyAgZGVmaW5lIEhBVkVfTE9DQUxUSU1FX1IKKyMgIGRlZmluZSBIQVZFX1RJTUVHTQorIyAgZGVmaW5lIEhBVkVfV0NUT01CCisjICBkZWZpbmUgSEFWRV9NQlRPV0MKKyMgIGRlZmluZSBIQVZFX0lTTkFOCisjIGVsaWYgZGVmaW5lZChUUlU2NCkKKyMgIGRlZmluZSBIQVZFX1NUUlJDSFIKKyMgIGRlZmluZSBIQVZFX1NUUlRPRAorIyAgZGVmaW5lIEhBVkVfU1NDQU5GCisjICBkZWZpbmUgSEFWRV9TVFJUT0wKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUwKKyMgIGRlZmluZSBIQVZFX1NUUlRPTEwKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUxMCisjICBkZWZpbmUgSEFWRV9HRVRUSU1FT0ZEQVkKKyMgIGRlZmluZSBIQVZFX1NZU19USU1FQl9ICisjICBkZWZpbmUgSEFWRV9SQU5EX1IKKyMgIGRlZmluZSBIQVZFX0dNVElNRV9SCisjICBkZWZpbmUgSEFWRV9MT0NBTFRJTUVfUgorIyAgZGVmaW5lIF9fVVNFX1NURF9JT1NUUkVBTQorIyAgZGVmaW5lIEhBVkVfV0NUT01CCisjICBkZWZpbmUgSEFWRV9NQlRPV0MKKyMgIGRlZmluZSBTT0FQX0xPTkdfRk9STUFUICIlbGQiCisjICBkZWZpbmUgU09BUF9VTE9OR19GT1JNQVQgIiVsdSIKKyMgZWxpZiBkZWZpbmVkKE1BQ19DQVJCT04pCisjICBkZWZpbmUgV0lUSF9OT0lPCisjICBkZWZpbmUgSEFWRV9TVFJSQ0hSCisjICBkZWZpbmUgSEFWRV9TVFJUT0QKKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyAgZGVmaW5lIEhBVkVfU1RSVE9MCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMCisjICBkZWZpbmUgSEFWRV9GVElNRQorIyAgZGVmaW5lIEhBVkVfUkFORF9SCisjICBkZWZpbmUgSEFWRV9HRVRIT1NUQllOQU1FX1IKKyMgIGRlZmluZSBIQVZFX0dNVElNRV9SCisjICBkZWZpbmUgSEFWRV9MT0NBTFRJTUVfUgorIyAgZGVmaW5lIEhBVkVfV0NUT01CCisjICBkZWZpbmUgSEFWRV9NQlRPV0MKKyMgZWxpZiBkZWZpbmVkKFBBTE0pCisjICBkZWZpbmUgV0lUSF9MRUFOCisjICBkZWZpbmUgSEFWRV9TVFJUT0QgICAvKiBzdHJ0b2QoKSBpcyBkZWZpbmVkIGluIHBhbG1GdW5jdGlvbnMuaCAqLworIyAgaW5jbHVkZSA8c3RkbGliLmg+CS8qIE5lZWRzIHRvIGJlIGluY2x1ZGVkIGJlZm9yZSB1bml4IGhlYWRlcnMgKi8KKyMgIGluY2x1ZGUgPHN5c190eXBlcy5oPgorIyAgZGVmaW5lIElHTk9SRV9TVERJT19TVFVCUworIyAgaW5jbHVkZSA8U3RkSU9QYWxtLmg+CisjICBkZWZpbmUgT19OT05CTE9DSyBGTk9OQklPCisjICBpbmNsdWRlIDxzeXNfc29ja2V0Lmg+CisjICBpbmNsdWRlICJwYWxtRnVuY3Rpb25zLmgiCisjIGVsaWYgZGVmaW5lZChTWU1CSUFOKQorIyAgZGVmaW5lIFdJVEhfTEVBTgorIyAgZGVmaW5lIFdJVEhfTk9OQU1FU1BBQ0VTCisjICBkZWZpbmUgSEFWRV9TVFJUT0QJLyogdXNlIFNUUlRPRCBzaW5jZSBzc2NhbmYgZG9lc24ndCBzZWVtIHRvIHdvcmsgKi8KKyMgIGluY2x1ZGUgPGUzMmRlZi5oPgorIyAgaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjIGVsaWYgZGVmaW5lZChWWFdPUktTKQorIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfUEdNVElNRV9SCisjICBkZWZpbmUgSEFWRV9QTE9DQUxUSU1FX1IKKyMgIGRlZmluZSBIQVZFX01LVElNRQorIyBlbGlmIGRlZmluZWQoT1MzOTApCisjICBkZWZpbmUgSEFWRV9TVFJSQ0hSCisjICBkZWZpbmUgSEFWRV9TVFJUT0QKKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyAgZGVmaW5lIEhBVkVfU1RSVE9MCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMCisjICBkZWZpbmUgSEFWRV9TWVNfVElNRUJfSAorIyAgZGVmaW5lIEhBVkVfRlRJTUUKKyMgIGRlZmluZSBIQVZFX1JBTkRfUgorIyAgZGVmaW5lIEhBVkVfR01USU1FX1IKKyMgIGRlZmluZSBIQVZFX0xPQ0FMVElNRV9SCisjICBkZWZpbmUgSEFWRV9XQ1RPTUIKKyMgIGRlZmluZSBIQVZFX01CVE9XQworIyBlbGlmIGRlZmluZWQoQVM0MDApCisjICBkZWZpbmUgSEFWRV9TVFJSQ0hSCisjICBkZWZpbmUgSEFWRV9TVFJUT0QKKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyAgZGVmaW5lIEhBVkVfU1RSVE9MCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMCisjICBkZWZpbmUgSEFWRV9TWVNfVElNRUJfSAorIyAgZGVmaW5lIEhBVkVfRlRJTUUKKyMgIGRlZmluZSBIQVZFX1JBTkRfUgorIyAgZGVmaW5lIEhBVkVfR01USU1FX1IKKyMgIGRlZmluZSBIQVZFX0xPQ0FMVElNRV9SCisjICBkZWZpbmUgSEFWRV9XQ1RPTUIKKyMgIGRlZmluZSBIQVZFX01CVE9XQworIyBlbHNlCisvKiBEZWZhdWx0IGFzdW1wdGlvbnMgb24gc3VwcG9ydGVkIGZ1bmN0aW9ucyAqLworIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfU1lTX1RJTUVCX0gKKyMgIGRlZmluZSBIQVZFX0ZUSU1FCisjICBkZWZpbmUgSEFWRV9SQU5EX1IKKyMgIGRlZmluZSBIQVZFX0dFVEhPU1RCWU5BTUVfUgorIyAgZGVmaW5lIEhBVkVfR01USU1FX1IKKyMgIGRlZmluZSBIQVZFX0xPQ0FMVElNRV9SCisjICBkZWZpbmUgSEFWRV9XQ1RPTUIKKyMgIGRlZmluZSBIQVZFX01CVE9XQworIyBlbmRpZgorI2VuZGlmCisKKy8qIFFOWCBkb2VzIG5vdCBoYXZlIGEgd29ya2luZyB2ZXJzaW9uIG9mIHN0cnRvZiAqLworI2lmIGRlZmluZWQoX19RTlhfXykgfHwgZGVmaW5lZChRTlgpCisjIHVuZGVmIEhBVkVfU1RSVE9GCisjZW5kaWYKKworI2lmbmRlZiBTT0FQX0xPTkdfRk9STUFUCisjIGRlZmluZSBTT0FQX0xPTkdfRk9STUFUICIlbGxkIgkvKiBwcmludGYgZm9ybWF0IGZvciA2NCBiaXQgaW50cyAqLworI2VuZGlmCisKKyNpZm5kZWYgU09BUF9VTE9OR19GT1JNQVQKKyMgZGVmaW5lIFNPQVBfVUxPTkdfRk9STUFUICIlbGx1IgkvKiBwcmludGYgZm9ybWF0IGZvciB1bnNpZ25lZCA2NCBiaXQgaW50cyAqLworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9OT1NURExJQgorIyBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgaWZuZGVmIFBBTE0KKyMgIGluY2x1ZGUgPHN0ZGlvLmg+CisjICBpbmNsdWRlIDxzdHJpbmcuaD4KKyMgZW5kaWYKKyMgaW5jbHVkZSA8Y3R5cGUuaD4KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpICYmICFkZWZpbmVkKFdJVEhfTEVBTikKKyMgaW5jbHVkZSA8c3RyaW5nPgorIyBpbmNsdWRlIDxpb3N0cmVhbT4KKyNlbmRpZgorCisjaWZkZWYgV0lUSF9OT0hUVFAKKyMgaWZuZGVmIFdJVEhfTk9JTworIyAgZGVmaW5lIFdJVEhfTk9JTworIyAgdW5kZWYgV0lUSF9DT09LSUVTCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBVTkRFUl9DRQorIyBpZm5kZWYgUEFMTQorIyAgaWZuZGVmIFdJVEhfTk9JTworIyAgIGluY2x1ZGUgPGVycm5vLmg+CisjICAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjICBlbmRpZgorIyAgaWZuZGVmIFdJVEhfTEVBTgorIyAgIGlmZGVmIEhBVkVfU1lTX1RJTUVCX0gKKyMgICAgaW5jbHVkZSA8c3lzL3RpbWViLmg+CQkvKiBmb3IgZnRpbWUoKSAqLworIyAgIGVuZGlmCisjICAgaW5jbHVkZSA8dGltZS5oPgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgT1BFTlNFUlZFUgorIyBpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjIGluY2x1ZGUgPHN5cy9zdHJlYW0uaD4KKyMgaW5jbHVkZSA8c3lzL3Byb3Rvc3cuaD4KKyAgZXh0ZXJuIGludCBoX2Vycm5vOworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9OT0lPCisjIGlmbmRlZiBXSU4zMgorIyAgaWZuZGVmIFBBTE0KKyMgICBpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjICAgaWZkZWYgVlhXT1JLUworIyAgICBpbmNsdWRlIDxzb2NrTGliLmg+CisjICAgIGluY2x1ZGUgPHNlbGVjdExpYi5oPgorIyAgIGVuZGlmCisjICAgaWZuZGVmIFZYV09SS1MKKyMgICAgaWZuZGVmIFNZTUJJQU4KKyMgICAgIGluY2x1ZGUgPHN0cmluZ3MuaD4KKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgIGlmZGVmIFNVTl9PUworIyAgICBpbmNsdWRlIDxzeXMvc3RyZWFtLmg+CQkvKiBTVU4gKi8KKyMgICAgaW5jbHVkZSA8c3lzL3NvY2tldHZhci5oPgkJLyogU1VOIDwgMi44ICg/KSAqLworIyAgIGVuZGlmCisjICAgaWZkZWYgVlhXT1JLUworIyAgICBpZmRlZiBfV1JTX0tFUk5FTAorIyAgICAgaW5jbHVkZSA8c3lzL3RpbWVzLmg+CisjICAgIGVuZGlmCisjICAgZWxzZQorIyAgICBpbmNsdWRlIDxzeXMvdGltZS5oPgorIyAgIGVuZGlmCisjICAgaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorIyAgIGlmZGVmIE9TMzkwCisjICAgIGluY2x1ZGUgPG5ldGluZXQvdGNwX3Zhci5oPgorIyAgIGVsc2UKKyMgICAgaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4gICAgICAgICAgLyogVENQX05PREVMQVkgKi8KKyMgICBlbmRpZgorIyAgIGluY2x1ZGUgPGFycGEvaW5ldC5oPgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgV0lUSF9GQVNUQ0dJCisjIGluY2x1ZGUgPGZjZ2lfc3RkaW8uaD4KKyNlbmRpZgorCisjaWZkZWYgV0lUSF9PUEVOU1NMCisjIGRlZmluZSBPUEVOU1NMX05PX0tSQjUKKyMgaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KKyMgaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyMgaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjIGlmbmRlZiBBTExPV19PTERfVkVSU0lPTlMKKyMgIGlmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgMHgwMDkwNTEwMEwpCisjICAgZXJyb3IgIk11c3QgdXNlIE9wZW5TU0wgMC45LjYgb3IgbGF0ZXIiCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBXSVRIX0daSVAKKyMgaWZuZGVmIFdJVEhfWkxJQgorIyAgZGVmaW5lIFdJVEhfWkxJQgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBXSVRIX0NBU0VJTlNFTlNJVElWRVRBR1MKKyMgZGVmaW5lIFNPQVBfU1RSQ01QIHNvYXBfdGFnX2NtcAkvKiBjYXNlIGluc2Vuc2l0dmUgWE1MIGVsZW1lbnQvYXR0cmlidXRlIG5hbWVzICovCisjZWxzZQorIyBkZWZpbmUgU09BUF9TVFJDTVAgc3RyY21wCQkvKiBjYXNlIHNlbnNpdGl2ZSBYTUwgZWxlbWVudC9hdHRyaWJ1dGUgbmFtZXMgKi8KKyNlbmRpZgorCisjaWZkZWYgV0lUSF9aTElCCisjIGluY2x1ZGUgPHpsaWIuaD4KKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9TVERMSUIKKyMgaWZuZGVmIFBBTE0KKyMgIGluY2x1ZGUgPG1hdGguaD4JLyogZm9yIGlzbmFuKCkgKi8KKyMgZW5kaWYKKyNlbmRpZgorCisvKiAjZGVmaW5lIERFQlVHICovIC8qIFVuY29tbWVudCB0byBkZWJ1ZyBzZW5kaW5nIChpbiBmaWxlIFNFTlQubG9nKSByZWNlaXZpbmcgKGluIGZpbGUgUkVDVi5sb2cpIGFuZCBtZXNzYWdlcyAoaW4gZmlsZSBURVNULmxvZykgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWZkZWYgV0lOMzIKKyMgaWZuZGVmIFVOREVSX0NFCisjICBpbmNsdWRlIDxpby5oPgorIyAgaW5jbHVkZSA8ZmNudGwuaD4KKyMgZW5kaWYKKyMgaW5jbHVkZSA8d2luc29jay5oPgorLyogIyBpbmNsdWRlIDx3aW5zb2NrMi5oPiAqLyAvKiBBbHRlcm5hdGl2ZTogdXNlIHdpbnNvY2syIChub3QgYXZhaWxhYmxlIHdpdGggZVZDKSAqLworIyBpZmRlZiBXSVRIX0lQVjYKKyMgIGluY2x1ZGUgPHdzMnRjcGlwLmg+CisjICBpbmNsdWRlIDx3c3BpYXBpLmg+CisjIGVuZGlmCisjZWxzZQorIyBpZmRlZiBWWFdPUktTCisjICBpbmNsdWRlIDxob3N0TGliLmg+CisjICBpbmNsdWRlIDxpb2N0bC5oPgorIyAgaW5jbHVkZSA8aW9MaWIuaD4KKyMgZW5kaWYKKyMgaWZuZGVmIFdJVEhfTk9JTworIyAgaWZuZGVmIFBBTE0KKyMgICBpbmNsdWRlIDxuZXRkYi5oPgorIyAgIGluY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyMgICBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgICBpbmNsdWRlIDxmY250bC5oPgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBQb3J0YWJpbGl0eTogZGVmaW5lIFNPQVBfU09DS0xFTl9UICovCisjaWYgZGVmaW5lZChfQUlYKQorIyBkZWZpbmUgU09BUF9TT0NLTEVOX1Qgc29ja2xlbl90CisjZWxpZiBkZWZpbmVkKFNPQ0tMRU5fVCkKKyMgZGVmaW5lIFNPQVBfU09DS0xFTl9UIFNPQ0tMRU5fVAorI2VsaWYgZGVmaW5lZChfX3NvY2tsZW5fdF9kZWZpbmVkKSB8fCBkZWZpbmVkKF9TT0NLTEVOX1QpIHx8IGRlZmluZWQoQ1lHV0lOKSB8fCBkZWZpbmVkKEZSRUVCU0QpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19RTlhfXykgfHwgZGVmaW5lZChRTlgpCisjIGRlZmluZSBTT0FQX1NPQ0tMRU5fVCBzb2NrbGVuX3QKKyNlbGlmIGRlZmluZWQoSVJJWCkgfHwgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfX0FQUExFX18pIHx8IGRlZmluZWQoSFBfVVgpIHx8IGRlZmluZWQoU1VOX09TKSB8fCBkZWZpbmVkKE9QRU5TRVJWRVIpIHx8IGRlZmluZWQoVFJVNjQpIHx8IGRlZmluZWQoVlhXT1JLUykKKyMgZGVmaW5lIFNPQVBfU09DS0xFTl9UIGludAorI2Vsc2UKKyMgZGVmaW5lIFNPQVBfU09DS0xFTl9UIHNpemVfdAorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9TT0NLRVQKKyMgaWZkZWYgV0lOMzIKKyMgIGRlZmluZSBTT0FQX1NPQ0tFVCBTT0NLRVQKKyMgZWxzZQorIyAgZGVmaW5lIFNPQVBfU09DS0VUIGludAorIyAgZGVmaW5lIGNsb3Nlc29ja2V0KG4pIGNsb3NlKG4pCisjIGVuZGlmCisjZW5kaWYKKworI2RlZmluZSBTT0FQX0lOVkFMSURfU09DS0VUICgtMSkKKyNkZWZpbmUgc29hcF92YWxpZF9zb2NrZXQobikgKChuKSAhPSBTT0FQX0lOVkFMSURfU09DS0VUKQorCisjaWYgZGVmaW5lZChTWU1CSUFOKQorIyBkZWZpbmUgTE9ORzY0IGxvbmcKKyMgZGVmaW5lIFVMT05HNjQgdW5zaWduZWQgTE9ORzY0CisjZWxpZiAhZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfX0dMSUJDX18pIHx8IGRlZmluZWQoX19HTlVfXykKKyMgaWZuZGVmIExPTkc2NAorIyAgZGVmaW5lIExPTkc2NCBsb25nIGxvbmcKKyMgIGRlZmluZSBVTE9ORzY0IHVuc2lnbmVkIExPTkc2NAorIyBlbmRpZgorI2VsaWYgZGVmaW5lZChVTkRFUl9DRSkKKyMgZGVmaW5lIExPTkc2NCBfX2ludDY0CisjIGRlZmluZSBVTE9ORzY0IHVuc2lnbmVkIExPTkc2NAorI2VsaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pCisjIGRlZmluZSBMT05HNjQgX19pbnQ2NAorIyBkZWZpbmUgVUxPTkc2NCB1bnNpZ25lZCBMT05HNjQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChXSU4zMikKKyMgZGVmaW5lIHNvYXBfaW50MzIgX19pbnQzMgorI2VsaWYgZGVmaW5lZChTWU1CSUFOKQorIyBkZWZpbmUgc29hcF9pbnQzMiBsb25nCisjZWxpZiBkZWZpbmVkKFBBTE0pCisjIGRlZmluZSBzb2FwX2ludDMyIEludDMyCisjZWxzZQorIyBkZWZpbmUgc29hcF9pbnQzMiBpbnQzMl90CisjZW5kaWYKKworI2lmZGVmIFdJTjMyCisjIGRlZmluZSBTT0FQX0VSQU5HRSBFUkFOR0UKKyMgZGVmaW5lIFNPQVBfRUlOVFIgV1NBRUlOVFIKKyMgZGVmaW5lIFNPQVBfRUFHQUlOIFdTQUVXT1VMREJMT0NLCisjIGRlZmluZSBTT0FQX0VXT1VMREJMT0NLIFdTQUVXT1VMREJMT0NLCisjIGRlZmluZSBTT0FQX0VJTlBST0dSRVNTIFdTQUVJTlBST0dSRVNTCisjZWxzZQorIyBkZWZpbmUgU09BUF9FUkFOR0UgRVJBTkdFCisjIGRlZmluZSBTT0FQX0VJTlRSIEVJTlRSCisjIGRlZmluZSBTT0FQX0VBR0FJTiBFQUdBSU4KKyMgaWZkZWYgU1lNQklBTgorIyAgZGVmaW5lIFNPQVBfRVdPVUxEQkxPQ0sgOTg5OAorIyAgZGVmaW5lIFNPQVBfRUlOUFJPR1JFU1MgOTg5OQorIyBlbHNlCisjICBkZWZpbmUgU09BUF9FV09VTERCTE9DSyBFV09VTERCTE9DSworIyAgZGVmaW5lIFNPQVBfRUlOUFJPR1JFU1MgRUlOUFJPR1JFU1MKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgV0lOMzIKKyMgaWZkZWYgVU5ERVJfQ0UKKyMgIGRlZmluZSBzb2FwX2Vycm5vIEdldExhc3RFcnJvcigpCisjICBkZWZpbmUgc29hcF9zb2NrZXRfZXJybm8gR2V0TGFzdEVycm9yKCkKKyMgIGRlZmluZSBzb2FwX3Jlc2V0X2Vycm5vIFNldExhc3RFcnJvcigwKQorIyBlbHNlCisjICBkZWZpbmUgc29hcF9lcnJubyBHZXRMYXN0RXJyb3IoKQorIyAgZGVmaW5lIHNvYXBfc29ja2V0X2Vycm5vIFdTQUdldExhc3RFcnJvcigpCisjICBkZWZpbmUgc29hcF9yZXNldF9lcnJubyBTZXRMYXN0RXJyb3IoMCkKKyMgZW5kaWYKKyNlbHNlCisjIGlmbmRlZiBXSVRIX05PSU8KKyMgIGRlZmluZSBzb2FwX2Vycm5vIGVycm5vCisjICBkZWZpbmUgc29hcF9zb2NrZXRfZXJybm8gZXJybm8KKyMgIGRlZmluZSBzb2FwX3Jlc2V0X2Vycm5vIChlcnJubyA9IDApCisjIGVsc2UKKyMgIGRlZmluZSBzb2FwX2Vycm5vIDAKKyMgIGRlZmluZSBzb2FwX3NvY2tldF9lcnJubyAwCisjICBkZWZpbmUgc29hcF9yZXNldF9lcnJubworIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9CVUZMRU4KKyMgaWZkZWYgV0lUSF9VRFAKKyMgIGRlZmluZSBTT0FQX0JVRkxFTiAoNjU1MzYpIC8qIG1heCBVRFAgcGFja2V0IHNpemUgKi8KKyMgZWxzZQorIyAgaWZuZGVmIFdJVEhfTEVBTgorIyAgIGRlZmluZSBTT0FQX0JVRkxFTiAoNjU1MzYpIC8qIGJ1ZmZlciBsZW5ndGggZm9yIHNvY2tldCBwYWNrZXRzLCBhbHNvIHVzZWQgYnkgZ2V0aG9zdGJ5bmFtZV9yIHNvIGRvbid0IG1ha2UgdGhpcyB0b28gc21hbGwgKi8KKyMgIGVsc2UKKyMgICBkZWZpbmUgU09BUF9CVUZMRU4gICgyMDQ4KQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBTT0FQX0xBQkxFTgorIyBkZWZpbmUgU09BUF9MQUJMRU4gICAgICg2NCkgLyogaW5pdGlhbCBsb29rLWFzaWRlIGJ1ZmZlciBsZW5ndGggKi8KKyNlbmRpZgorI2lmbmRlZiBTT0FQX1BUUkJMSworIyBkZWZpbmUgU09BUF9QVFJCTEsgICAgICgzMikgLyogYmxvY2sgYWxsb2NhdGlvbiBmb3IgcG9pbnRlciBoYXNoIHRhYmxlIGNoYWlucyAqLworI2VuZGlmCisjaWZuZGVmIFNPQVBfUFRSSEFTSAorIyBpZm5kZWYgV0lUSF9MRUFOCisjICBkZWZpbmUgU09BUF9QVFJIQVNIICgxMDI0KSAvKiBzaXplIG9mIHBvaW50ZXIgYW5hbHlzaXMgaGFzaCB0YWJsZSAobXVzdCBiZSBwb3dlciBvZiAyKSAqLworIyBlbHNlCisjICBkZWZpbmUgU09BUF9QVFJIQVNIICAgKDMyKQorIyBlbmRpZgorI2VuZGlmCisjaWZuZGVmIFNPQVBfSURIQVNICisjIGlmbmRlZiBXSVRIX0xFQU4KKyMgIGRlZmluZSBTT0FQX0lESEFTSCAgKDE5OTkpIC8qIHByaW1lIHNpemUgb2YgaGFzaCB0YWJsZSBmb3IgcGFyc2VkIGlkL3JlZiAqLworIyBlbHNlCisjICBkZWZpbmUgU09BUF9JREhBU0ggICAgKDE5KSAvKiAxOSwgMTk5ICovCisjIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgU09BUF9CTEtMRU4KKyMgaWZuZGVmIFdJVEhfTEVBTgorIyAgZGVmaW5lIFNPQVBfQkxLTEVOICAgKDI1NikgLyogc2l6ZSBvZiBibG9ja3MgdG8gY29sbGVjdCBsb25nIHN0cmluZ3MgYW5kIFhNTCBhdHRyaWJ1dGVzICovCisjIGVsc2UKKyMgIGRlZmluZSBTT0FQX0JMS0xFTiAgICAoMzIpCisjIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgU09BUF9UQUdMRU4KKyMgaWZuZGVmIFdJVEhfTEVBTgorIyAgZGVmaW5lIFNPQVBfVEFHTEVOICAoMTAyNCkgLyogbWF4aW11bSBsZW5ndGggb2YgWE1MIGVsZW1lbnQgdGFnL2F0dHJpYnV0ZSBuYW1lIG9yIGhvc3QvcGF0aCBuYW1lICsgMSAqLworIyBlbHNlCisjICBkZWZpbmUgU09BUF9UQUdMRU4gICAgKDY0KQorIyBlbmRpZgorI2VuZGlmCisjaWZuZGVmIFNPQVBfSERSTEVOCisjIGlmbmRlZiBXSVRIX0xFQU4KKyMgIGRlZmluZSBTT0FQX0hEUkxFTiAgKDgxOTIpIC8qIG1heGltdW0gbGVuZ3RoIG9mIEhUVFAgaGVhZGVyIGxpbmUgKG11c3QgYmUgPjQwOTYgdG8gcmVhZCBjb29raWVzKSAqLworIyBlbHNlCisjICBkZWZpbmUgU09BUF9IRFJMRU4gICgxMDI0KQorIyBlbmRpZgorI2VuZGlmCisjaWZuZGVmIFNPQVBfTUFYRElNUworIyBpZm5kZWYgV0lUSF9MRUFOCisjICBkZWZpbmUgU09BUF9NQVhESU1TCSAoMTYpIC8qIG1heGltdW0gYXJyYXkgZGltZW5zaW9ucyAoYXJyYXkgbmVzdGluZ3MpIG11c3QgYmUgbGVzcyB0aGFuIDY0IHRvIHByb3RlY3Qgc29hcC0+dG1wYnVmICovCisjIGVsc2UKKyMgIGRlZmluZSBTT0FQX01BWERJTVMJICAoNCkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfTUFYTE9HUworIyBkZWZpbmUgU09BUF9NQVhMT0dTCSAgKDMpIC8qIG1heCBudW1iZXIgb2YgZGVidWcgbG9ncyBwZXIgc3RydWN0IHNvYXAgZW52aXJvbm1lbnQgKi8KKyMgZGVmaW5lIFNPQVBfSU5ERVhfUkVDViAgKDApCisjIGRlZmluZSBTT0FQX0lOREVYX1NFTlQgICgxKQorIyBkZWZpbmUgU09BUF9JTkRFWF9URVNUICAoMikKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfTUFYS0VFUEFMSVZFCisjIGRlZmluZSBTT0FQX01BWEtFRVBBTElWRSAoMTAwKSAvKiBtYXggaXRlcmF0aW9ucyB0byBrZWVwIHNlcnZlciBjb25uZWN0aW9uIGFsaXZlICovCisjZW5kaWYKKworI2lmbmRlZiBTT0FQX01BWEFSUkFZU0laRQorIyBkZWZpbmUgU09BUF9NQVhBUlJBWVNJWkUgKDEwMDAwMCkgLyogInRydXN0ZWQiIG1heCBzaXplIG9mIGluYm91bmQgU09BUCBhcnJheSBmb3IgY29tcG91bmQgYXJyYXkgYWxsb2NhdGlvbiAqLworI2VuZGlmCisKKyNpZmRlZiBWWFdPUktTCisjIGlmZGVmIF9fSU5DbWF0aGggCisjICBpbmNsdWRlIDxwcml2YXRlL21hdGhQLmg+CisjICBpZm5kZWYgSEFWRV9JU05BTgorIyAgIGRlZmluZSBIQVZFX0lTTkFOCisjICBlbmRpZgorIyAgZGVmaW5lIHNvYXBfaXNuYW4obnVtKSBpc05hbihudW0pCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIFdJTjMyIAorIyBpbmNsdWRlIDxmbG9hdC5oPgorIyBpZm5kZWYgSEFWRV9JU05BTgorIyAgZGVmaW5lIEhBVkVfSVNOQU4KKyMgZW5kaWYKKyMgZGVmaW5lIHNvYXBfaXNuYW4obnVtKSBfaXNuYW4obnVtKQorI2VuZGlmCisKKyNpZmRlZiBTVU5fT1MKKyMgZGVmaW5lIHNvYXBfaXNuYW4obikgaXNuYW4obikKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoSEFWRV9JU05BTikgJiYgKGRlZmluZWQoX01BVEhfSCkgfHwgZGVmaW5lZChfTUFUSF9JTkNMVURFRCkpCisjIGRlZmluZSBIQVZFX0lTTkFOCisjZW5kaWYKKworI2lmbmRlZiBzb2FwX2lzbmFuCisjIGlmZGVmIEhBVkVfSVNOQU4KKyMgIGRlZmluZSBzb2FwX2lzbmFuKG4pIGlzbmFuKG4pCisjIGVsc2UKKyMgIGRlZmluZSBzb2FwX2lzbmFuKF8pICgwKQorIyBlbmRpZgorI2VuZGlmCisKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc29hcF9kb3VibGVfbmFuIHsgdW5zaWduZWQgaW50IG4xLCBuMjsgfSBzb2FwX2RvdWJsZV9uYW47CisKKyNpZmRlZiBWWFdPUktTCisjIGlmbmRlZiBGTFRfTUFYCisjICBkZWZpbmUgRkxUX01BWCBfQVJDSF9GTFRfTUFYCisjIGVuZGlmCisjIGlmbmRlZiBEQkxfTUFYCisjICBkZWZpbmUgREJMX01BWCBfQVJDSF9EQkxfTUFYCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBGTFRfTkFOCisjIGlmZGVmIEhBVkVfSVNOQU4KKyMgIGRlZmluZSBGTFRfTkFOICgqKGZsb2F0Kikodm9pZCopJnNvYXBfZG91YmxlX25hbikKKyMgZWxzZQorIyAgZGVmaW5lIEZMVF9OQU4gKDAuMCkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEZMVF9QSU5GVFkKKyMgaWYgZGVmaW5lZChGTFRfTUFYKQorIyAgZGVmaW5lIEZMVF9QSU5GVFkgRkxUX01BWAorIyBlbGlmIGRlZmluZWQoSFVHRV9WQUxGKQorIyAgZGVmaW5lIEZMVF9QSU5GVFkgKGZsb2F0KUhVR0VfVkFMRgorIyBlbGlmIGRlZmluZWQoSFVHRV9WQUwpCisjICBkZWZpbmUgRkxUX1BJTkZUWSAoZmxvYXQpSFVHRV9WQUwKKyMgZWxpZiBkZWZpbmVkKEZMT0FUX01BWCkKKyMgIGRlZmluZSBGTFRfUElORlRZIEZMT0FUX01BWAorIyBlbHNlCisjICBkZWZpbmUgRkxUX1BJTkZUWSAoMy40MDI4MjM0N2UrMzhGKQorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRkxUX05JTkZUWQorIyBkZWZpbmUgRkxUX05JTkZUWSAoLUZMVF9QSU5GVFkpCisjZW5kaWYKKworI2lmbmRlZiBEQkxfTkFOCisjIGlmZGVmIEhBVkVfSVNOQU4KKyMgIGRlZmluZSBEQkxfTkFOICgqKGRvdWJsZSopKHZvaWQqKSZzb2FwX2RvdWJsZV9uYW4pCisjIGVsc2UKKyMgIGRlZmluZSBEQkxfTkFOICgwLjApCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBEQkxfUElORlRZCisjIGlmIGRlZmluZWQoREJMX01BWCkKKyMgIGRlZmluZSBEQkxfUElORlRZIERCTF9NQVgKKyMgZWxpZiBkZWZpbmVkKEhVR0VfVkFMRikKKyMgIGRlZmluZSBEQkxfUElORlRZIChkb3VibGUpSFVHRV9WQUxGCisjIGVsaWYgZGVmaW5lZChIVUdFX1ZBTCkKKyMgIGRlZmluZSBEQkxfUElORlRZIChkb3VibGUpSFVHRV9WQUwKKyMgZWxpZiBkZWZpbmVkKERPVUJMRV9NQVgpCisjICBkZWZpbmUgREJMX1BJTkZUWSBET1VCTEVfTUFYCisjIGVsc2UKKyMgIGRlZmluZSBEQkxfUElORlRZICgxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOCkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIERCTF9OSU5GVFkKKyMgZGVmaW5lIERCTF9OSU5GVFkgKC1EQkxfUElORlRZKQorI2VuZGlmCisKKyNkZWZpbmUgc29hcF9pc3BpbmZkKG4pICgobikgPj0gREJMX1BJTkZUWSkKKyNkZWZpbmUgc29hcF9pc3BpbmZmKG4pICgobikgPj0gRkxUX1BJTkZUWSkKKyNkZWZpbmUgc29hcF9pc25pbmZkKG4pICgobikgPD0gREJMX05JTkZUWSkKKyNkZWZpbmUgc29hcF9pc25pbmZmKG4pICgobikgPD0gRkxUX05JTkZUWSkKKworLyogZ1NPQVAgZXJyb3IgY29kZXMgKi8KKworI2RlZmluZSBTT0FQX0VPRgkJCUVPRgorI2RlZmluZSBTT0FQX0VSUgkJCUVPRgorI2RlZmluZSBTT0FQX09LCQkJCTAKKyNkZWZpbmUgU09BUF9DTElfRkFVTFQJCQkxCisjZGVmaW5lIFNPQVBfU1ZSX0ZBVUxUCQkJMgorI2RlZmluZSBTT0FQX1RBR19NSVNNQVRDSAkJMworI2RlZmluZSBTT0FQX1RZUEUJCQk0CisjZGVmaW5lIFNPQVBfU1lOVEFYX0VSUk9SCQk1CisjZGVmaW5lIFNPQVBfTk9fVEFHCQkJNgorI2RlZmluZSBTT0FQX0lPQgkJCTcKKyNkZWZpbmUgU09BUF9NVVNUVU5ERVJTVEFORAkJOAorI2RlZmluZSBTT0FQX05BTUVTUEFDRQkJCTkKKyNkZWZpbmUgU09BUF9VU0VSX0VSUk9SCQkJMTAKKyNkZWZpbmUgU09BUF9GQVRBTF9FUlJPUgkJMTEKKyNkZWZpbmUgU09BUF9GQVVMVAkJCTEyCisjZGVmaW5lIFNPQVBfTk9fTUVUSE9ECQkJMTMKKyNkZWZpbmUgU09BUF9HRVRfTUVUSE9ECQkJMTQKKyNkZWZpbmUgU09BUF9FT00JCQkxNQorI2RlZmluZSBTT0FQX05VTEwJCQkxNgorI2RlZmluZSBTT0FQX0RVUExJQ0FURV9JRAkJMTcKKyNkZWZpbmUgU09BUF9NSVNTSU5HX0lECQkJMTgKKyNkZWZpbmUgU09BUF9IUkVGCQkJMTkKKyNkZWZpbmUgU09BUF9VRFBfRVJST1IJCQkyMAorI2RlZmluZSBTT0FQX1RDUF9FUlJPUgkJCTIxCisjZGVmaW5lIFNPQVBfSFRUUF9FUlJPUgkJCTIyCisjZGVmaW5lIFNPQVBfU1NMX0VSUk9SCQkJMjMKKyNkZWZpbmUgU09BUF9aTElCX0VSUk9SCQkJMjQKKyNkZWZpbmUgU09BUF9ESU1FX0VSUk9SCQkJMjUKKyNkZWZpbmUgU09BUF9ESU1FX0hSRUYJCQkyNgorI2RlZmluZSBTT0FQX0RJTUVfTUlTTUFUQ0gJCTI3CisjZGVmaW5lIFNPQVBfRElNRV9FTkQJCQkyOAorI2RlZmluZSBTT0FQX01JTUVfRVJST1IJCQkyOQorI2RlZmluZSBTT0FQX01JTUVfSFJFRgkJCTMwCisjZGVmaW5lIFNPQVBfTUlNRV9FTkQJCQkzMQorI2RlZmluZSBTT0FQX1ZFUlNJT05NSVNNQVRDSAkJMzIKKyNkZWZpbmUgU09BUF9QTFVHSU5fRVJST1IJCTMzCisjZGVmaW5lIFNPQVBfREFUQUVOQ09ESU5HVU5LTk9XTgkzNAorI2RlZmluZSBTT0FQX1JFUVVJUkVECQkJMzUKKyNkZWZpbmUgU09BUF9QUk9ISUJJVEVECQkJMzYKKyNkZWZpbmUgU09BUF9PQ0NVUlMJCQkzNworI2RlZmluZSBTT0FQX0xFTkdUSAkJCTM4CisKKyNkZWZpbmUgc29hcF94bWxfZXJyb3JfY2hlY2soZSkgKChlKSA9PSBTT0FQX1RBR19NSVNNQVRDSCB8fCAoZSkgPT0gU09BUF9UQUdfRU5EIHx8IChlKSA9PSBTT0FQX1NZTlRBWF9FUlJPUiB8fCAoZSkgPT0gU09BUF9OQU1FU1BBQ0UgfHwgKGUpID09IFNPQVBfRFVQTElDQVRFX0lEIHx8IChlKSA9PSBTT0FQX01JU1NJTkdfSUQgfHwgKGUpID09IFNPQVBfUkVRVUlSRUQgfHwgKGUpID09IFNPQVBfUFJPSElCSVRFRCB8fCAoZSkgPT0gU09BUF9PQ0NVUlMgfHwgKGUpID09IFNPQVBfTEVOR1RIIHx8IChlKSA9PSBTT0FQX05VTEwgfHwgKGUpID09IFNPQVBfSFJFRikKKyNkZWZpbmUgc29hcF9zb2FwX2Vycm9yX2NoZWNrKGUpICgoZSkgPT0gU09BUF9DTElfRkFVTFQgfHwgKGUpID09IFNPQVBfU1ZSX0ZBVUxUIHx8IChlKSA9PSBTT0FQX1ZFUlNJT05NSVNNQVRDSCB8fCAoZSkgPT0gU09BUF9NVVNUVU5ERVJTVEFORCB8fCAoZSkgPT0gU09BUF9GQVVMVCB8fCAoZSkgPT0gU09BUF9OT19NRVRIT0QpCisjZGVmaW5lIHNvYXBfdGNwX2Vycm9yX2NoZWNrKGUpICgoZSkgPT0gU09BUF9FT0YgfHwgKGUpID09IFNPQVBfVENQX0VSUk9SKQorI2RlZmluZSBzb2FwX3NzbF9lcnJvcl9jaGVjayhlKSAoKGUpID09IFNPQVBfU1NMX0VSUk9SKQorI2RlZmluZSBzb2FwX3psaWJfZXJyb3JfY2hlY2soZSkgKChlKSA9PSBTT0FQX1pMSUJfRVJST1IpCisjZGVmaW5lIHNvYXBfaHR0cF9lcnJvcl9jaGVjayhlKSAoKGUpID09IFNPQVBfSFRUUF9FUlJPUiB8fCAoZSkgPT0gU09BUF9HRVRfTUVUSE9EIHx8ICgoZSkgPj0gMTAwICYmIChlKSA8IDYwMCkpCisKKy8qIGdTT0FQIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGVzIDEwMCB0byA1OTkgYXJlIHJlc2VydmVkICovCisKKy8qIENvZGVzIDYwMCB0byA5OTkgYXJlIHVzZXIgZGVmaW5hYmxlICovCisKKy8qIEV4Y2VwdGlvbmFsIGdTT0FQIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGVzID49IDEwMDAgKi8KKworI2RlZmluZSBTT0FQX1NUT1AJCTEwMDAJLyogTm8gSFRUUCByZXNwb25zZSAqLworI2RlZmluZSBTT0FQX0ZPUk0JCTEwMDEJLyogRm9ybSByZXF1ZXN0L3Jlc3BvbnNlICovCisjZGVmaW5lIFNPQVBfSFRNTAkJMTAwMgkvKiBDdXN0b20gSFRNTCByZXNwb25zZSAqLworI2RlZmluZSBTT0FQX0ZJTEUJCTEwMDMJLyogQ3VzdG9tIGZpbGUtYmFzZWQgcmVzcG9uc2UgKi8KKworLyogZ1NPQVAgSFRUUCBtZXRob2QgY29kZXMgKi8KKworI2RlZmluZSBTT0FQX1BPU1QJCTIwMDAKKyNkZWZpbmUgU09BUF9HRVQJCTIwMDEKKworLyogZ1NPQVAgRElNRSAqLworCisjZGVmaW5lIFNPQVBfRElNRV9DRgkJMHgwMQorI2RlZmluZSBTT0FQX0RJTUVfTUUJCTB4MDIKKyNkZWZpbmUgU09BUF9ESU1FX01CCQkweDA0CisjZGVmaW5lIFNPQVBfRElNRV9WRVJTSU9OCTB4MDggLyogRElNRSB2ZXJzaW9uIDEgKi8KKyNkZWZpbmUgU09BUF9ESU1FX01FRElBCQkweDEwCisjZGVmaW5lIFNPQVBfRElNRV9BQlNVUkkJMHgyMAorCisvKiBnU09BUCBaTElCICovCisKKyNkZWZpbmUgU09BUF9aTElCX05PTkUJCTB4MDAKKyNkZWZpbmUgU09BUF9aTElCX0RFRkxBVEUJMHgwMQorI2RlZmluZSBTT0FQX1pMSUJfSU5GTEFURQkweDAyCisjZGVmaW5lIFNPQVBfWkxJQl9HWklQCQkweDAyCisKKy8qIGdTT0FQIHRyYW5zcG9ydCwgY29ubmVjdGlvbiwgYW5kIGNvbnRlbnQgZW5jb2RpbmcgbW9kZXMgKi8KKwordHlwZWRlZiBzb2FwX2ludDMyIHNvYXBfbW9kZTsKKworI2RlZmluZSBTT0FQX0lPCQkJMHgwMDAwMDAwMwkvKiBJTyBtYXNrICovCisjZGVmaW5lIFNPQVBfSU9fRkxVU0gJCTB4MDAwMDAwMDAJLyogZmx1c2ggb3V0cHV0IGltbWVkaWF0ZWx5LCBubyBidWZmZXJpbmcgKi8KKyNkZWZpbmUgU09BUF9JT19CVUZGRVIJCTB4MDAwMDAwMDEJLyogYnVmZmVyIG91dHB1dCBpbiBwYWNrZXRzIG9mIHNpemUgU09BUF9CVUZMRU4gKi8KKyNkZWZpbmUgU09BUF9JT19TVE9SRQkJMHgwMDAwMDAwMgkvKiBzdG9yZSBlbnRpcmUgb3V0cHV0IHRvIGRldGVybWluZSBsZW5ndGggZm9yIHRyYW5zcG9ydCAqLworI2RlZmluZSBTT0FQX0lPX0NIVU5LCQkweDAwMDAwMDAzCS8qIHVzZSBIVFRQIGNodW5rZWQgdHJhbnNmZXIgQU5EIGJ1ZmZlciBwYWNrZXRzICovCisKKyNkZWZpbmUgU09BUF9JT19VRFAJCTB4MDAwMDAwMDQKKyNkZWZpbmUgU09BUF9JT19MRU5HVEgJCTB4MDAwMDAwMDgKKyNkZWZpbmUgU09BUF9JT19LRUVQQUxJVkUJMHgwMDAwMDAxMAorCisjZGVmaW5lIFNPQVBfRU5DX0xBVElOCQkweDAwODAwMDIwCS8qIGlzby04ODU5LTEgZW5jb2RpbmcgKi8KKyNkZWZpbmUgU09BUF9FTkNfWE1MCQkweDAwMDAwMDQwCS8qIHBsYWluIFhNTCBlbmNvZGluZywgbm8gSFRUUCBoZWFkZXIgKi8KKyNkZWZpbmUgU09BUF9FTkNfRElNRQkJMHgwMDAwMDA4MAorI2RlZmluZSBTT0FQX0VOQ19NSU1FCQkweDAwMDAwMTAwCisjZGVmaW5lIFNPQVBfRU5DX01UT00JCTB4MDAwMDAyMDAKKyNkZWZpbmUgU09BUF9FTkNfWkxJQgkJMHgwMDAwMDQwMAorI2RlZmluZSBTT0FQX0VOQ19TU0wJCTB4MDAwMDA4MDAKKworI2RlZmluZSBTT0FQX0VOQwkJMHgwMDAwMEZGRgkvKiBJTyBhbmQgRU5DIG1hc2sgKi8KKworI2RlZmluZSBTT0FQX1hNTF9TVFJJQ1QJCTB4MDAwMDEwMDAJLyogc3RyaWN0IHZhbGlkYXRpb24gKi8KKyNkZWZpbmUgU09BUF9YTUxfSU5ERU5UCQkweDAwMDAyMDAwCisjZGVmaW5lIFNPQVBfWE1MX0NBTk9OSUNBTAkweDAwMDA0MDAwCS8qIEVYQyBDMTROIGNhbm9uaWNhbCBYTUwgKi8KKyNkZWZpbmUgU09BUF9YTUxfVFJFRQkJMHgwMDAwODAwMAorI2RlZmluZSBTT0FQX1hNTF9HUkFQSAkJMHgwMDAxMDAwMAorI2RlZmluZSBTT0FQX1hNTF9OSUwJCTB4MDAwMjAwMDAKKyNkZWZpbmUgU09BUF9YTUxfRE9NCQkweDAwMDQwMDAwCisjZGVmaW5lIFNPQVBfWE1MX1NFQwkJMHgwMDA4MDAwMAkvKiByZXNlcnZlZCBmb3IgV1Mgc2VjdXJpdHkgKi8KKworI2RlZmluZSBTT0FQX0NfTk9JT0IJCTB4MDAxMDAwMDAKKyNkZWZpbmUgU09BUF9DX1VURlNUUklORwkweDAwMjAwMDAwCisjZGVmaW5lIFNPQVBfQ19NQlNUUklORwkJMHgwMDQwMDAwMAorCisjZGVmaW5lIFNPQVBfRE9NX1RSRUUJCTB4MDEwMDAwMDAKKyNkZWZpbmUgU09BUF9ET01fTk9ERQkJMHgwMjAwMDAwMAorI2RlZmluZSBTT0FQX0RPTV9BU0lTCQkweDA0MDAwMDAwCisKKyNkZWZpbmUgU09BUF9JT19ERUZBVUxUCQlTT0FQX0lPX0ZMVVNICisKKy8qIFNTTCBjbGllbnQvc2VydmVyIGF1dGhlbnRpY2F0aW9uIHNldHRpbmdzICovCisKKyNkZWZpbmUgU09BUF9TU0xfTk9fQVVUSEVOVElDQVRJT04JCTB4MDAJLyogZm9yIHRlc3RpbmcgcHVycG9zZXMgKi8KKyNkZWZpbmUgU09BUF9TU0xfUkVRVUlSRV9TRVJWRVJfQVVUSEVOVElDQVRJT04JMHgwMQkvKiBjbGllbnQgcmVxdWlyZXMgc2VydmVyIHRvIGF1dGhlbnRpY2F0ZSAqLworI2RlZmluZSBTT0FQX1NTTF9SRVFVSVJFX0NMSUVOVF9BVVRIRU5USUNBVElPTgkweDAyCS8qIHNlcnZlciByZXF1aXJlcyBjbGllbnQgdG8gYXV0aGVudGljYXRlICovCisKKyNkZWZpbmUgU09BUF9TU0xfREVGQVVMVAkJCVNPQVBfU1NMX1JFUVVJUkVfU0VSVkVSX0FVVEhFTlRJQ0FUSU9OCisKKy8qIHN0YXRlICovCisKKyNkZWZpbmUgU09BUF9JTklUCTEKKyNkZWZpbmUgU09BUF9DT1BZCTIKKworI2RlZmluZSBzb2FwX2NoZWNrX3N0YXRlKHNvYXApICghKHNvYXApIHx8ICgoc29hcCktPnN0YXRlICE9IFNPQVBfSU5JVCAmJiAoc29hcCktPnN0YXRlICE9IFNPQVBfQ09QWSkpCisKKy8qIHBhcnQgKi8KKworI2RlZmluZSBTT0FQX0JFR0lOCQkwCisjZGVmaW5lIFNPQVBfSU5fRU5WRUxPUEUJMgorI2RlZmluZSBTT0FQX0lOX0hFQURFUgkJMworI2RlZmluZSBTT0FQX0VORF9IRUFERVIJCTQKKyNkZWZpbmUgU09BUF9OT19CT0RZCQk1CisjZGVmaW5lIFNPQVBfSU5fQk9EWQkJNgorI2RlZmluZSBTT0FQX0VORF9CT0RZCQk3CisjZGVmaW5lIFNPQVBfRU5EX0VOVkVMT1BFCTgKKyNkZWZpbmUgU09BUF9FTkQJCTkKKyNkZWZpbmUgU09BUF9CRUdJTl9TRUNVUklUWQkxMAorI2RlZmluZSBTT0FQX0lOX1NFQ1VSSVRZCTExCisjZGVmaW5lIFNPQVBfRU5EX1NFQ1VSSVRZCTEyCisKKy8qIERFQlVHIG1hY3JvcyAqLworCisjaWZuZGVmIFdJVEhfTEVBTgorIyBpZmRlZiBERUJVRworIyAgaWZuZGVmIFNPQVBfREVCVUcKKyMgICBkZWZpbmUgU09BUF9ERUJVRworIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgU09BUF9ERUJVRworIyBkZWZpbmUgU09BUF9NQUxMT0Moc29hcCwgc2l6ZSkgc29hcF90cmFja19tYWxsb2Moc29hcCwgX19GSUxFX18sIF9fTElORV9fLCBzaXplKQorIyBkZWZpbmUgU09BUF9GUkVFKHNvYXAsIHB0cikgc29hcF90cmFja19mcmVlKHNvYXAsIF9fRklMRV9fLCBfX0xJTkVfXywgcHRyKQorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9NQUxMT0MJCQkvKiB1c2UgbGliYyBtYWxsb2MgKi8KKyMgZGVmaW5lIFNPQVBfTUFMTE9DKHNvYXAsIHNpemUpIG1hbGxvYyhzaXplKQorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9GUkVFCQkJLyogdXNlIGxpYmMgZnJlZSAqLworIyBkZWZpbmUgU09BUF9GUkVFKHNvYXAsIHB0cikgZnJlZShwdHIpCisjZW5kaWYKKworI2lmZGVmIFNPQVBfREVCVUcKKyMgaWZuZGVmIFNPQVBfTUVTU0FHRQorIyAgZGVmaW5lIFNPQVBfTUVTU0FHRSBmcHJpbnRmCisjIGVuZGlmCisjIGlmbmRlZiBEQkdMT0cKKyMgIGRlZmluZSBEQkdMT0coREJHRklMRSwgQ01EKSBcCit7IGlmIChzb2FwKVwKKyAgeyBpZiAoIXNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYXyMjREJHRklMRV0pXAorICAgICAgc29hcF9vcGVuX2xvZ2ZpbGUoKHN0cnVjdCBzb2FwKilzb2FwLCBTT0FQX0lOREVYXyMjREJHRklMRSk7XAorICAgIGlmIChzb2FwLT5mZGVidWdbU09BUF9JTkRFWF8jI0RCR0ZJTEVdKVwKKyAgICB7IEZJTEUgKmZkZWJ1ZyA9IHNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYXyMjREJHRklMRV07XAorICAgICAgQ01EO1wKKyAgICAgIGZmbHVzaChmZGVidWcpO1wKKyAgICB9XAorICB9XAorfQorIyBlbmRpZgorIyBpZm5kZWYgREJHTVNHCisjICBkZWZpbmUgREJHTVNHKERCR0ZJTEUsIE1TRywgTEVOKSBcCit7IGlmIChzb2FwKVwKKyAgeyBpZiAoIXNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYXyMjREJHRklMRV0pXAorICAgICAgc29hcF9vcGVuX2xvZ2ZpbGUoKHN0cnVjdCBzb2FwKilzb2FwLCBTT0FQX0lOREVYXyMjREJHRklMRSk7XAorICAgIGlmIChzb2FwLT5mZGVidWdbU09BUF9JTkRFWF8jI0RCR0ZJTEVdKVwKKyAgICB7IGZ3cml0ZSgoTVNHKSwgMSwgKExFTiksIHNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYXyMjREJHRklMRV0pO1wKKyAgICAgIGZmbHVzaChzb2FwLT5mZGVidWdbU09BUF9JTkRFWF8jI0RCR0ZJTEVdKTtcCisgICAgfVwKKyAgfVwKK30KKyMgZW5kaWYKKyMgaWZuZGVmIERHQkZVTgorIyAgZGVmaW5lIERCR0ZVTihGTkFNRSkgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIlcyglZCk6ICVzKClcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgRk5BTUUpKQorIyAgZGVmaW5lIERCR0ZVTjEoRk5BTUUsIEZNVCwgQVJHKSBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIiVzKCVkKTogJXMoIkZNVCIpXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIEZOQU1FLCAoQVJHKSkpCisjICBkZWZpbmUgREJHRlVOMihGTkFNRSwgRk1UMSwgQVJHMSwgRk1UMiwgQVJHMikgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIlcyglZCk6ICVzKCJGTVQxIiwgIkZNVDIiKVxuIiwgX19GSUxFX18sIF9fTElORV9fLCBGTkFNRSwgKEFSRzEpLCAoQVJHMikpKQorIyAgZGVmaW5lIERCR0ZVTjMoRk5BTUUsIEZNVDEsIEFSRzEsIEZNVDIsIEFSRzIsIEZNVDMsIEFSRzMpIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiJXMoJWQpOiAlcygiRk1UMSIsICJGTVQyIiwgIkZNVDMiKVxuIiwgX19GSUxFX18sIF9fTElORV9fLCBGTkFNRSwgKEFSRzEpLCAoQVJHMiksIChBUkczKSkpCisjIGVuZGlmCisjIGlmbmRlZiBEQkdIRVgKKyMgIGRlZmluZSBEQkdIRVgoREJHRklMRSwgTVNHLCBMRU4pIFwKK3sgaWYgKHNvYXApXAorICB7IGlmICghc29hcC0+ZmRlYnVnW1NPQVBfSU5ERVhfIyNEQkdGSUxFXSlcCisgICAgICBzb2FwX29wZW5fbG9nZmlsZShzb2FwLCBTT0FQX0lOREVYXyMjREJHRklMRSk7XAorICAgIGlmIChzb2FwLT5mZGVidWdbU09BUF9JTkRFWF8jI0RCR0ZJTEVdKVwKKyAgICB7IGludCBpOyBjaGFyICpzO1wKKyAgICAgIGZvciAocyA9IChjaGFyKikoTVNHKSwgaSA9IChMRU4pOyBpOyBpLS0pXAorICAgICAgICBmcHJpbnRmKHNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYXyMjREJHRklMRV0sICIlMi4yaGhYICAiLCAqcysrKTtcCisgICAgICBmZmx1c2goc29hcC0+ZmRlYnVnW1NPQVBfSU5ERVhfIyNEQkdGSUxFXSk7XAorICAgIH1cCisgIH1cCit9CisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgREJHTE9HKERCR0ZJTEUsIENNRCkKKyMgZGVmaW5lIERCR01TRyhEQkdGSUxFLCBNU0csIExFTikKKyMgZGVmaW5lIERCR0ZVTihGTkFNRSkKKyMgZGVmaW5lIERCR0ZVTjEoRk5BTUUsIEZNVCwgQVJHKQorIyBkZWZpbmUgREJHRlVOMihGTkFNRSwgRk1UMSwgQVJHMSwgRk1UMiwgQVJHMikKKyMgZGVmaW5lIERCR0ZVTjMoRk5BTUUsIEZNVDEsIEFSRzEsIEZNVDIsIEFSRzIsIEZNVDMsIEFSRzMpCisjIGRlZmluZSBEQkdIRVgoREJHRklMRSwgTVNHLCBMRU4pCisjZW5kaWYKKworLyogVUNTLTQgcmVxdWlyZXMgMzIgYml0cyAoMC03RkZGRkZGRiwgdGhlIHNpZ24gYml0IGlzIHVzZWQgYnkgZ1NPQVAgdG8gZGlzdGluZ3Vpc2ggWE1MIGVudGl0aWVzKSAqLwordHlwZWRlZiBzb2FwX2ludDMyIHNvYXBfd2NoYXI7CisKKy8qIG5hbWVzcGFjZSB0YWJsZSByb3cgKi8KK3N0cnVjdCBOYW1lc3BhY2UKK3sgY29uc3QgY2hhciAqaWQ7CisgIGNvbnN0IGNoYXIgKm5zOworICBjb25zdCBjaGFyICppbjsKKyAgY2hhciAqb3V0OworfTsKKworLyogbmFtZXNwYWNlIHN0YWNrICovCitzdHJ1Y3Qgc29hcF9ubGlzdAoreyBzdHJ1Y3Qgc29hcF9ubGlzdCAqbmV4dDsKKyAgdW5zaWduZWQgaW50IGxldmVsOyAvKiBuZXN0aW5nIGRlcHRoIGxldmVsICovCisgIHNob3J0IGluZGV4OyAvKiBjb3JyZXNwb25kaW5nIGVudHJ5IGluIG5zIG1hcHBpbmcgdGFibGUgKi8KKyAgY2hhciAqbnM7IC8qIG9ubHkgc2V0IHdoZW4gcGFyc2VkIG5zIFVSSSBpcyBub3QgaW4gdGhlIG5zIG1hcHBpbmcgdGFibGUgKi8KKyAgY2hhciBpZFsxXTsgLyogdGhlIGFjdHVhbCBzdHJpbmcgdmFsdWUgZmxvd3MgaW50byB0aGUgYWxsb2NhdGVkIHJlZ2lvbiBiZWxvdyB0aGlzIHN0cnVjdCAqLworfTsKKworLyogYmxvY2sgc3RhY2sgZm9yIG5lc3RlZCBibG9jayBhbGxvY2F0aW9ucyAqLworc3RydWN0IHNvYXBfYmxpc3QKK3sgc3RydWN0IHNvYXBfYmxpc3QgKm5leHQ7CisgIGNoYXIgKnB0cjsKKyAgc2l6ZV90IHNpemU7Cit9OworCisvKiBhcnJheSBsYXlvdXQgKi8KK3N0cnVjdCBzb2FwX2FycmF5Cit7IHZvaWQgKl9fcHRyOworICBpbnQgX19zaXplOworfTsKKworLyogcG9pbnRlciBzZXJpYWxpemF0aW9uIG1hbmFnZW1lbnQgKi8KK3N0cnVjdCBzb2FwX3BsaXN0Cit7IHN0cnVjdCBzb2FwX3BsaXN0ICpuZXh0OworICBjb25zdCB2b2lkICpwdHI7CisgIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphcnJheTsKKyAgaW50IHR5cGU7CisgIGludCBpZDsKKyAgY2hhciBtYXJrMTsKKyAgY2hhciBtYXJrMjsKK307CisKKy8qIGJsb2NrIGFsbG9jYXRpb24gZm9yIHBvaW50ZXIgc2VyaWFsaXphdGlvbiBtYW5hZ2VtZW50ICovCitzdHJ1Y3Qgc29hcF9wYmxrCit7IHN0cnVjdCBzb2FwX3BibGsgKm5leHQ7CisgIHN0cnVjdCBzb2FwX3BsaXN0IHBsaXN0W1NPQVBfUFRSQkxLXTsKK307CisKKyNpZmRlZiBTT0FQX0RFQlVHCisvKiBtYWxsb2MvZnJlZSB0cmFja2luZyBmb3IgZGVidWdnaW5nICovCitzdHJ1Y3Qgc29hcF9tbGlzdAoreyBzdHJ1Y3Qgc29hcF9tbGlzdCAqbmV4dDsKKyAgY29uc3Qgdm9pZCAqcHRyOworICBjb25zdCBjaGFyICpmaWxlOworICBpbnQgbGluZTsKKyAgc2hvcnQgbGl2ZTsKK307CisjZW5kaWYKKworLyogY2xhc3MgYWxsb2NhdGlvbiBsaXN0ICovCitzdHJ1Y3Qgc29hcF9jbGlzdAoreyBzdHJ1Y3Qgc29hcF9jbGlzdCAqbmV4dDsKKyAgdm9pZCAqcHRyOworICBpbnQgdHlwZTsKKyAgaW50IHNpemU7CisgIHZvaWQgKCpmZGVsZXRlKShzdHJ1Y3Qgc29hcF9jbGlzdCopOworfTsKKworLyogYXR0cmlidXRlcyAqLworc3RydWN0IHNvYXBfYXR0cmlidXRlCit7IHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqbmV4dDsKKyAgY2hhciAqdmFsdWU7CisgIHNpemVfdCBzaXplOworICBjaGFyICpuczsKKyAgc2hvcnQgdmlzaWJsZTsKKyAgY2hhciBuYW1lWzFdOyAvKiB0aGUgYWN0dWFsIG5hbWUgc3RyaW5nIGZsb3dzIGludG8gdGhlIGFsbG9jYXRlZCByZWdpb24gYmVsb3cgdGhpcyBzdHJ1Y3QgKi8KK307CisKK3N0cnVjdCBzb2FwX2Nvb2tpZQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKm5leHQ7CisgIGNoYXIgKm5hbWU7CisgIGNoYXIgKnZhbHVlOworICBjaGFyICpkb21haW47CisgIGNoYXIgKnBhdGg7CisgIGxvbmcgZXhwaXJlOwkJLyogY2xpZW50LXNpZGU6IGxvY2FsIHRpbWUgdG8gZXhwaXJlOyBzZXJ2ZXItc2lkZTogc2Vjb25kcyB0byBleHBpcmUgKi8KKyAgdW5zaWduZWQgaW50IHZlcnNpb247CisgIHNob3J0IHNlY3VyZTsKKyAgc2hvcnQgc2Vzc2lvbjsJLyogc2VydmVyLXNpZGUgKi8KKyAgc2hvcnQgZW52OwkJLyogc2VydmVyLXNpZGU6IGdvdCBjb29raWUgZnJvbSBjbGllbnQgYW5kIHNob3VsZCBub3QgYmUgKHJlKXNlbmQgKi8KKyAgc2hvcnQgbW9kaWZpZWQ7CS8qIHNlcnZlci1zaWRlOiBjbGllbnQgY29va2llIHdhcyBtb2RpZmllZCBhbmQgc2hvdWxkIGJlIHNlbmQgKi8KK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqIFNPQVBfRk1BQzIgc29hcF9uZXh0X211bHRpcGFydChzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKTsKKworY2xhc3Mgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3IKK3sgcHVibGljOgorICBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBzb2FwX211bHRpcGFydF9pdGVyYXRvciYgaXRlcikgY29uc3QKKyAgICB7IHJldHVybiBjb250ZW50ID09IGl0ZXIuY29udGVudDsgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3Qgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3ImIGl0ZXIpIGNvbnN0CisgICAgeyByZXR1cm4gY29udGVudCAhPSBpdGVyLmNvbnRlbnQ7IH0KKyAgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICZvcGVyYXRvciooKSBjb25zdAorICAgIHsgcmV0dXJuICpjb250ZW50OyB9CisgIHNvYXBfbXVsdGlwYXJ0X2l0ZXJhdG9yICZvcGVyYXRvcisrKCkKKyAgICB7IGNvbnRlbnQgPSBzb2FwX25leHRfbXVsdGlwYXJ0KGNvbnRlbnQpOyByZXR1cm4gKnRoaXM7IH0KKyAgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3IoKSA6IGNvbnRlbnQoTlVMTCkKKyAgICB7IH0KKyAgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3Ioc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpwKSA6IGNvbnRlbnQocCkKKyAgICB7IH0KK307CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU5FUgorc3RydWN0IHNvYXBfZGltZQoreyBzaXplX3QgY291bnQ7CisgIHNpemVfdCBzaXplOworICBzaXplX3QgY2h1bmtzaXplOworICBzaXplX3QgYnVmbGVuOworICBjaGFyIGZsYWdzOworICBjaGFyICpwdHI7CisgIGNvbnN0IGNoYXIgKmlkOworICBjb25zdCBjaGFyICp0eXBlOworICBjb25zdCBjaGFyICpvcHRpb25zOworICBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmxpc3Q7CQkvKiBsaXN0IG9mIERJTUUgYXR0YWNobWVudHMgcmVjZWl2ZWQgKi8KKyAgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpmaXJzdCwgKmxhc3Q7CS8qIHRlbXBvcmFyeSBpbi9vdXQgcXVldWUgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworICBzb2FwX211bHRpcGFydF9pdGVyYXRvciBiZWdpbigpCisgICAgeyBzb2FwX211bHRpcGFydF9pdGVyYXRvciBpdGVyKGxpc3QpOyByZXR1cm4gaXRlcjsgfTsKKyAgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3IgZW5kKCkKKyAgICB7IHNvYXBfbXVsdGlwYXJ0X2l0ZXJhdG9yIGl0ZXIoTlVMTCk7IHJldHVybiBpdGVyOyB9OworI2VuZGlmCit9OworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK3N0cnVjdCBzb2FwX21pbWUKK3sgY2hhciAqYm91bmRhcnk7CQkJLyogTUlNRSBib3VuZGFyeSAqLworICBjb25zdCBjaGFyICpzdGFydDsJCQkvKiBNSU1FIHN0YXJ0IElEICovCisgIHN0cnVjdCBzb2FwX211bHRpcGFydCAqbGlzdDsJCS8qIGxpc3Qgb2YgTUlNRSBhdHRhY2htZW50cyByZWNlaXZlZCAqLworICBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmZpcnN0LCAqbGFzdDsJLyogdGVtcG9yYXJ5IGluL291dCBxdWV1ZSAqLworI2lmZGVmIF9fY3BsdXNwbHVzCisgIHNvYXBfbXVsdGlwYXJ0X2l0ZXJhdG9yIGJlZ2luKCkKKyAgICB7IHNvYXBfbXVsdGlwYXJ0X2l0ZXJhdG9yIGl0ZXIobGlzdCk7IHJldHVybiBpdGVyOyB9OworICBzb2FwX211bHRpcGFydF9pdGVyYXRvciBlbmQoKQorICAgIHsgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3IgaXRlcihOVUxMKTsgcmV0dXJuIGl0ZXI7IH07CisjZW5kaWYKK307CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU5FUgorLyogUkZDMjA0NSBNSU1FIGNvbnRlbnQgdHJhbnNmZXIgZW5jb2RpbmdzICovCitlbnVtIHNvYXBfbWltZV9lbmNvZGluZworeyBTT0FQX01JTUVfTk9ORSwKKyAgU09BUF9NSU1FXzdCSVQsCisgIFNPQVBfTUlNRV84QklULAorICBTT0FQX01JTUVfQklOQVJZLAorICBTT0FQX01JTUVfUVVPVEVEX1BSSU5UQUJMRSwKKyAgU09BUF9NSU1FX0JBU0U2NCwKKyAgU09BUF9NSU1FX0lFVEZfVE9LRU4sCisgIFNPQVBfTUlNRV9YX1RPS0VOCit9OworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKKy8qIERJTUUvTUlNRSBtdWx0aXBhcnQgbGlzdCAqLworc3RydWN0IHNvYXBfbXVsdGlwYXJ0Cit7IHN0cnVjdCBzb2FwX211bHRpcGFydCAqbmV4dDsKKyAgY2hhciAqcHRyOwkJCQkvKiBwb2ludHMgdG8gcmF3IGRhdGEgY29udGVudCAqLworICBzaXplX3Qgc2l6ZTsJCQkJLyogc2l6ZSBvZiBkYXRhIGNvbnRlbnQgKi8KKyAgY29uc3QgY2hhciAqaWQ7CQkJLyogRElNRS9NSU1FIGNvbnRlbnQgSUQgb3IgZm9ybSBkYXRhIG5hbWUgKi8KKyAgY29uc3QgY2hhciAqdHlwZTsJCQkvKiBESU1FL01JTUUgdHlwZSAoTUlNRSB0eXBlIGZvcm1hdCkgKi8KKyAgY29uc3QgY2hhciAqb3B0aW9uczsJCQkvKiBESU1FIG9wdGlvbnMgKi8KKyAgZW51bSBzb2FwX21pbWVfZW5jb2RpbmcgZW5jb2Rpbmc7CS8qIE1JTUUgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyAqLworICBjb25zdCBjaGFyICpsb2NhdGlvbjsJCQkvKiBNSU1FIENvbnRlbnQtTG9jYXRpb24gKG9wdGlvbmFsKSAqLworICBjb25zdCBjaGFyICpkZXNjcmlwdGlvbjsJCS8qIE1JTUUgQ29udGVudC1EZXNjcmlwdGlvbiAob3B0aW9uYWwpICovCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgdHlwZWRlZiBzb2FwX211bHRpcGFydF9pdGVyYXRvciBpdGVyYXRvcjsKKyNlbmRpZgorfTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTkVSCisvKiBhdHRhY2htZW50IERJTUUgYW5kIE1UT00gWE9QIGZvcndhcmRpbmcgKi8KK3N0cnVjdCBzb2FwX3hsaXN0Cit7IHN0cnVjdCBzb2FwX3hsaXN0ICpuZXh0OworICB1bnNpZ25lZCBjaGFyICoqcHRyOworICBpbnQgKnNpemU7CisgIGNoYXIgKmlkOworICBjaGFyICoqdHlwZTsKKyAgY2hhciAqKm9wdGlvbnM7Cit9OworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZmRlZiBfX2NwbHVzcGx1cworY2xhc3Mgc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yCit7IHB1YmxpYzoKKyAgc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAqYXR0OworICBjb25zdCBjaGFyICpuc3RyOworICBjb25zdCBjaGFyICpuYW1lOworICBib29sIG9wZXJhdG9yPT0oY29uc3Qgc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3ImKSBjb25zdDsKKyAgc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAmb3BlcmF0b3IqKCkgY29uc3Q7CisgIHNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvciAmb3BlcmF0b3IrKygpOworICBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IoKTsKKyAgc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUqKTsKKyAgfnNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcigpOworfTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK3N0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUKK3sgc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAqbmV4dDsKKyAgY29uc3QgY2hhciAqbnN0cjsKKyAgY2hhciAqbmFtZTsKKyAgY2hhciAqZGF0YTsKKyAgd2NoYXJfdCAqd2lkZTsKKyAgc3RydWN0IHNvYXAgKnNvYXA7CisjaWZkZWYgX19jcGx1c3BsdXMKKyAgdHlwZWRlZiBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IgaXRlcmF0b3I7CisgIHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgJnNldChjb25zdCBjaGFyICpuc3RyLCBjb25zdCBjaGFyICpuYW1lKTsJLyogc2V0IG5hbWVzcGFjZSBhbmQgbmFtZSAqLworICBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICZzZXQoY29uc3QgY2hhciAqZGF0YSk7CQkvKiBzZXQgZGF0YSAqLworICBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IgYmVnaW4oKTsKKyAgc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yIGVuZCgpOworICBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IgZmluZChjb25zdCBjaGFyICpuc3RyLCBjb25zdCBjaGFyICpuYW1lKTsKKyAgdm9pZCB1bmxpbmsoKTsKKyAgc29hcF9kb21fYXR0cmlidXRlKCk7CisgIHNvYXBfZG9tX2F0dHJpYnV0ZShzdHJ1Y3Qgc29hcCAqc29hcCk7CisgIHNvYXBfZG9tX2F0dHJpYnV0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbnN0ciwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZGF0YSk7CisgIH5zb2FwX2RvbV9hdHRyaWJ1dGUoKTsKKyNlbmRpZgorfTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZkZWYgX19jcGx1c3BsdXMKK2NsYXNzIHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IKK3sgcHVibGljOgorICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqZWx0OworICBjb25zdCBjaGFyICpuc3RyOworICBjb25zdCBjaGFyICpuYW1lOworICBpbnQgdHlwZTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3ImKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3ImKSBjb25zdDsKKyAgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgJm9wZXJhdG9yKigpIGNvbnN0OworICBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yICZvcGVyYXRvcisrKCk7CisgIHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IoKTsKKyAgc29hcF9kb21fZWxlbWVudF9pdGVyYXRvcihzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCopOworICB+c29hcF9kb21fZWxlbWVudF9pdGVyYXRvcigpOworfTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK3N0cnVjdCBzb2FwX2RvbV9lbGVtZW50Cit7IHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICpuZXh0OwkvKiBuZXh0IHNpYmxpbmcgKi8KKyAgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKnBybnQ7CS8qIHBhcmVudCAqLworICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqZWx0czsJLyogbGlzdCBvZiBjaGlsZCBlbGVtZW50cyAqLworICBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICphdHRzOwkvKiBsaXN0IG9mIGF0dHJpYnV0ZXMgKi8KKyAgY29uc3QgY2hhciAqbnN0cjsJCQkvKiBuYW1lc3BhY2Ugc3RyaW5nICovCisgIGNoYXIgKm5hbWU7CQkJCS8qIGVsZW1lbnQgdGFnIG5hbWUgKi8KKyAgY2hhciAqZGF0YTsJCQkJLyogZWxlbWVudCBjb250ZW50IGRhdGEgKHdpdGggU09BUF9DX1VURlNUUklORyBmbGFnIHNldCkgKi8KKyAgd2NoYXJfdCAqd2lkZTsJCQkvKiBlbGVtZW50IGNvbnRlbnQgZGF0YSAqLworICBpbnQgdHlwZTsJCQkJLyogb3B0aW9uYWw6IHNlcmlhbGl6ZWQgQy9DKysgZGF0YSB0eXBlICovCisgIHZvaWQgKm5vZGU7CQkJCS8qIG9wdGlvbmFsOiBwb2ludGVyIHRvIHNlcmlhbGl6ZWQgQy9DKysgZGF0YSAqLworICBjaGFyICpoZWFkOwkJCQkvKiBsZWFkaW5nIHdoaXRlc3BhY2UgdG8gc3RhcnQgdGFnICovCisgIGNoYXIgKnRhaWw7CQkJCS8qIGxlYWRpbmcgd2hpdGVzcGFjZSB0byBlbmQgdGFnICovCisgIHN0cnVjdCBzb2FwICpzb2FwOwkJCS8qIHNvYXAgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBub2RlICovCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgdHlwZWRlZiBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yIGl0ZXJhdG9yOworICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAmc2V0KGNvbnN0IGNoYXIgKm5zdHIsIGNvbnN0IGNoYXIgKm5hbWUpOworICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAmc2V0KGNvbnN0IGNoYXIgKmRhdGEpOworICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAmc2V0KHZvaWQgKm5vZGUsIGludCB0eXBlKTsKKyAgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgJmFkZChzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCopOworICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAmYWRkKHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50Jik7CisgIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICZhZGQoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSopOworICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAmYWRkKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUmKTsKKyAgc29hcF9kb21fZWxlbWVudF9pdGVyYXRvciBiZWdpbigpOworICBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yIGVuZCgpOworICBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yIGZpbmQoY29uc3QgY2hhciAqbnN0ciwgY29uc3QgY2hhciAqbmFtZSk7CisgIHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IgZmluZChpbnQgdHlwZSk7CisgIHZvaWQgdW5saW5rKCk7CisgIHNvYXBfZG9tX2VsZW1lbnQoKTsKKyAgc29hcF9kb21fZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCk7CisgIHNvYXBfZG9tX2VsZW1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5zdHIsIGNvbnN0IGNoYXIgKm5hbWUpOworICBzb2FwX2RvbV9lbGVtZW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuc3RyLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkYXRhKTsKKyAgc29hcF9kb21fZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbnN0ciwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqbm9kZSwgaW50IHR5cGUpOworICB+c29hcF9kb21fZWxlbWVudCgpOworI2VuZGlmCit9OworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqIFNPQVBfRk1BQzIgc29hcF9kb21fbmV4dF9lbGVtZW50KHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICplbHQpOworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICogU09BUF9GTUFDMiBzb2FwX2RvbV9uZXh0X2F0dHJpYnV0ZShzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICphdHQpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiAhZGVmaW5lZChXSVRIX0xFQU4pCit9CitleHRlcm4gc3RkOjpvc3RyZWFtICZvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYsIGNvbnN0IHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50Jik7CitleHRlcm4gc3RkOjppc3RyZWFtICZvcGVyYXRvcj4+KHN0ZDo6aXN0cmVhbSYsIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50Jik7CitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3Qgc29hcAoreyBzaG9ydCBzdGF0ZTsJCQkvKiAwID0gdW5pbml0aWFsaXplZCwgMSA9IGluaXRpYWxpemVkLCAyID0gY29weSBvZiBhbm90aGVyIHNvYXAgc3RydWN0ICovCisgIHNob3J0IHZlcnNpb247CQkvKiAxID0gU09BUDEuMSBhbmQgMiA9IFNPQVAxLjIgKHNldCBhdXRvbWF0aWNhbGx5IGZyb20gbmFtZXNwYWNlIFVSSSBpbiBuc21hcCB0YWJsZSkgKi8KKyAgc29hcF9tb2RlIG1vZGU7CisgIHNvYXBfbW9kZSBpbW9kZTsKKyAgc29hcF9tb2RlIG9tb2RlOworICBjb25zdCBjaGFyICpmbG9hdF9mb3JtYXQ7CS8qIHVzZXItZGVmaW5hYmxlIGZvcm1hdCBzdHJpbmcgZm9yIGZsb2F0cyAoPDEwMjQgY2hhcnMpICovCisgIGNvbnN0IGNoYXIgKmRvdWJsZV9mb3JtYXQ7CS8qIHVzZXItZGVmaW5hYmxlIGZvcm1hdCBzdHJpbmcgZm9yIGRvdWJsZXMgKDwxMDI0IGNoYXJzKSAqLworICBjb25zdCBjaGFyICpkaW1lX2lkX2Zvcm1hdDsJLyogdXNlci1kZWZpbmFibGUgZm9ybWF0IHN0cmluZyBmb3IgaW50ZWdlciBESU1FIGlkICg8U09BUF9UQUdMRU4gY2hhcnMpICovCisgIGNvbnN0IGNoYXIgKmh0dHBfdmVyc2lvbjsJLyogSFRUUCB2ZXJzaW9uIHVzZWQgIjEuMCIgb3IgIjEuMSIgKi8KKyAgY29uc3QgY2hhciAqaHR0cF9jb250ZW50OwkvKiBvcHRpb25hbCBjdXN0b20gcmVzcG9uc2UgY29udGVudCB0eXBlICh3aXRoIFNPQVBfRklMRSkgKi8KKyAgY29uc3QgY2hhciAqZW5jb2RpbmdTdHlsZTsJLyogZGVmYXVsdCA9IE5VTEwgd2hpY2ggbWVhbnMgdGhhdCBTT0FQIGVuY29kaW5nIGlzIHVzZWQgKi8KKyAgY29uc3QgY2hhciAqYWN0b3I7CQkvKiBTT0FQLUVOVjphY3RvciBvciByb2xlIGF0dHJpYnV0ZSB2YWx1ZSAqLworICBpbnQgcmVjdl90aW1lb3V0OwkJLyogd2hlbiA+IDAsIGdpdmVzIHNvY2tldCByZWN2IHRpbWVvdXQgaW4gc2Vjb25kcywgPCAwIGluIHVzZWMgKi8KKyAgaW50IHNlbmRfdGltZW91dDsJCS8qIHdoZW4gPiAwLCBnaXZlcyBzb2NrZXQgc2VuZCB0aW1lb3V0IGluIHNlY29uZHMsIDwgMCBpbiB1c2VjICovCisgIGludCBjb25uZWN0X3RpbWVvdXQ7CQkvKiB3aGVuID4gMCwgZ2l2ZXMgc29ja2V0IGNvbm5lY3QoKSB0aW1lb3V0IGluIHNlY29uZHMsIDwgMCBpbiB1c2VjICovCisgIGludCBhY2NlcHRfdGltZW91dDsJCS8qIHdoZW4gPiAwLCBnaXZlcyBzb2NrZXQgYWNjZXB0KCkgdGltZW91dCBpbiBzZWNvbmRzLCA8IDAgaW4gdXNlYyAqLworICBpbnQgc29ja2V0X2ZsYWdzOwkJLyogc29ja2V0IHJlY3YoKSBhbmQgc2VuZCgpIGZsYWdzLCBlLmcuIHNldCB0byBNU0dfTk9TSUdOQUwgdG8gZGlzYWJsZSBzaWdwaXBlICovCisgIGludCBjb25uZWN0X2ZsYWdzOwkJLyogY29ubmVjdCgpIFNPTF9TT0NLRVQgc29ja29wdCBmbGFncywgZS5nLiBzZXQgdG8gU09fREVCVUcgdG8gZGVidWcgc29ja2V0ICovCisgIGludCBiaW5kX2ZsYWdzOwkJLyogYmluZCgpIFNPTF9TT0NLRVQgc29ja29wdCBmbGFncywgZS5nLiBzZXQgdG8gU09fUkVVU0VBRERSIHRvIGVuYWJsZSByZXVzZSAqLworICBpbnQgYWNjZXB0X2ZsYWdzOwkJLyogYWNjZXB0KCkgU09MX1NPQ0tFVCBzb2Nrb3B0IGZsYWdzICovCisgIGNvbnN0IHN0cnVjdCBOYW1lc3BhY2UgKm5hbWVzcGFjZXM7CS8qIFBvaW50ZXIgdG8gZ2xvYmFsIG5hbWVzcGFjZSBtYXBwaW5nIHRhYmxlICovCisgIHN0cnVjdCBOYW1lc3BhY2UgKmxvY2FsX25hbWVzcGFjZXM7CS8qIExvY2FsIG5hbWVzcGFjZSBtYXBwaW5nIHRhYmxlICovCisgIHN0cnVjdCBzb2FwX25saXN0ICpubGlzdDsJLyogbmFtZXNwYWNlIHN0YWNrICovCisgIHN0cnVjdCBzb2FwX2JsaXN0ICpibGlzdDsJLyogYmxvY2sgYWxsb2NhdGlvbiBzdGFjayAqLworICBzdHJ1Y3Qgc29hcF9jbGlzdCAqY2xpc3Q7CS8qIGNsYXNzIGluc3RhbmNlIGFsbG9jYXRpb24gbGlzdCAqLworICB2b2lkICphbGlzdDsJCQkvKiBtZW1vcnkgYWxsb2NhdGlvbiAobWFsbG9jKSBsaXN0ICovCisgIHN0cnVjdCBzb2FwX2lsaXN0ICppaHRbU09BUF9JREhBU0hdOworICBzdHJ1Y3Qgc29hcF9wbGlzdCAqcGh0W1NPQVBfUFRSSEFTSF07CisgIHN0cnVjdCBzb2FwX3BibGsgKnBibGs7CS8qIHBsaXN0IGJsb2NrIGFsbG9jYXRpb24gKi8KKyAgc2hvcnQgcGlkeDsJCQkvKiBwbGlzdCBibG9jayBhbGxvY2F0aW9uICovCisgIHN0cnVjdCBTT0FQX0VOVl9fSGVhZGVyICpoZWFkZXI7CisgIHN0cnVjdCBTT0FQX0VOVl9fRmF1bHQgKmZhdWx0OworICBpbnQgaWRudW07CisgIHZvaWQgKnVzZXI7CQkJLyogdG8gcGFzcyB1c2VyLWRlZmluZWQgZGF0YSAqLworICBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnBsdWdpbnM7CS8qIGxpbmtlZCBsaXN0IG9mIHBsdWctaW4gZGF0YSAqLworICBjaGFyICp1c2VyaWQ7CQkJLyogSFRUUCBCYXNpYyBhdXRob3JpemF0aW9uIHVzZXJpZCAqLworICBjaGFyICpwYXNzd2Q7CQkJLyogSFRUUCBCYXNpYyBhdXRob3JpemF0aW9uIHBhc3N3ZCAqLworICBpbnQgKCpmcG9zdCkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworICBpbnQgKCpmZ2V0KShzdHJ1Y3Qgc29hcCopOworICBpbnQgKCpmZm9ybSkoc3RydWN0IHNvYXAqKTsKKyAgaW50ICgqZnBvc3RoZHIpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKyAgaW50ICgqZnJlc3BvbnNlKShzdHJ1Y3Qgc29hcCosIGludCwgc2l6ZV90KTsKKyAgaW50ICgqZnBhcnNlKShzdHJ1Y3Qgc29hcCopOworICBpbnQgKCpmcGFyc2VoZHIpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKyAgaW50ICgqZnJlc29sdmUpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHN0cnVjdCBpbl9hZGRyKiBpbmFkZHIpOworICBpbnQgKCpmY29ubmVjdCkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGludCk7CisgIGludCAoKmZkaXNjb25uZWN0KShzdHJ1Y3Qgc29hcCopOworICBpbnQgKCpmY2xvc2Vzb2NrZXQpKHN0cnVjdCBzb2FwKiwgU09BUF9TT0NLRVQpOworICBpbnQgKCpmc2h1dGRvd25zb2NrZXQpKHN0cnVjdCBzb2FwKiwgU09BUF9TT0NLRVQsIGludCk7CisgIGludCAoKmZvcGVuKShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgaW50KTsKKyAgaW50ICgqZmFjY2VwdCkoc3RydWN0IHNvYXAqLCBpbnQsIHN0cnVjdCBzb2NrYWRkciosIGludCAqbik7CisgIGludCAoKmZjbG9zZSkoc3RydWN0IHNvYXAqKTsKKyAgaW50ICgqZnNlbmQpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHNpemVfdCk7CisgIHNpemVfdCAoKmZyZWN2KShzdHJ1Y3Qgc29hcCosIGNoYXIqLCBzaXplX3QpOworICBpbnQgKCpmcG9sbCkoc3RydWN0IHNvYXAqKTsKKyAgdm9pZCAoKmZzZXRlcnJvcikoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICoqYywgY29uc3QgY2hhciAqKnMpOworICBpbnQgKCpmaWdub3JlKShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKKyAgaW50ICgqZnNlcnZlbG9vcCkoc3RydWN0IHNvYXAqKTsKKyAgdm9pZCAqKCpmcGx1Z2luKShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaW50ICgqZnByZXBhcmVpbml0KShzdHJ1Y3Qgc29hcCopOworICBpbnQgKCpmcHJlcGFyZXNlbmQpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHNpemVfdCk7CisgIGludCAoKmZwcmVwYXJlcmVjdikoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc2l6ZV90KTsKKyAgaW50ICgqZnByZXBhcmVmaW5hbCkoc3RydWN0IHNvYXAqKTsKKyAgdm9pZCAqKCpmZGltZXJlYWRvcGVuKShzdHJ1Y3Qgc29hcCosIHZvaWQqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKyAgdm9pZCAqKCpmZGltZXdyaXRlb3Blbikoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKyAgdm9pZCAoKmZkaW1lcmVhZGNsb3NlKShzdHJ1Y3Qgc29hcCosIHZvaWQqKTsKKyAgdm9pZCAoKmZkaW1ld3JpdGVjbG9zZSkoc3RydWN0IHNvYXAqLCB2b2lkKik7CisgIHNpemVfdCAoKmZkaW1lcmVhZCkoc3RydWN0IHNvYXAqLCB2b2lkKiwgY2hhciosIHNpemVfdCk7CisgIGludCAoKmZkaW1ld3JpdGUpKHN0cnVjdCBzb2FwKiwgdm9pZCosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworI2VuZGlmCisgIGludCBtYXN0ZXI7CisgIGludCBzb2NrZXQ7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgIWRlZmluZWQoV0lUSF9MRUFOKQorICBzdGQ6Om9zdHJlYW0gKm9zOworICBzdGQ6OmlzdHJlYW0gKmlzOworI2Vsc2UKKyAgdm9pZCAqb3M7CS8qIHByZXNlcnZlIGFsaWdubWVudCAqLworICB2b2lkICppczsJLyogcHJlc2VydmUgYWxpZ25tZW50ICovCisjZW5kaWYKKyNpZm5kZWYgVU5ERVJfQ0UKKyAgaW50IHNlbmRmZDsKKyAgaW50IHJlY3ZmZDsKKyNlbHNlCisgIEZJTEUgKnNlbmRmZDsKKyAgRklMRSAqcmVjdmZkOworI2VuZGlmCisjaWZkZWYgV0lOMzIKKyAgY2hhciBlcnJvcnN0clsyNTZdOwkvKiBidWYgZm9yIEZvcm1hdE1lc3NhZ2UoKSAqLworI2VuZGlmCisgIHNpemVfdCBidWZpZHg7CS8qIGluZGV4IGluIHNvYXAuYnVmW10gKi8KKyAgc2l6ZV90IGJ1ZmxlbjsJLyogbGVuZ3RoIG9mIHNvYXAuYnVmW10gY29udGVudCAqLworICBzb2FwX3djaGFyIGFoZWFkOwkvKiBwYXJzZXIgbG9va2FoZWFkICovCisgIHNob3J0IGNkYXRhOwkJLyogQ0RBVEEgcGFyc2VyIHN0YXRlICovCisgIHNob3J0IGJvZHk7CQkvKiBwYXJzZWQgWE1MIGVsZW1lbnQgaGFzIGEgYm9keSBvciBub3QgKi8KKyAgdW5zaWduZWQgaW50IGxldmVsOwkvKiBYTUwgbmVzdGluZyBsZXZlbCAqLworICBzaXplX3QgY291bnQ7CQkvKiBtZXNzYWdlIGxlbmd0aCBjb3VudGVyICovCisgIHNpemVfdCBsZW5ndGg7CS8qIG1lc3NhZ2UgbGVuZ3RoIGFzIHNldCBieSBIVFRQIGhlYWRlciAqLworI2lmZGVmIFdJVEhfRkFTVAorICBjaGFyICpsYWJidWY7CQkvKiBsb29rLWFzaWRlIGJ1ZmZlciAqLworICBzaXplX3QgbGFibGVuOwkvKiBsb29rLWFzaWRlIGJ1ZmZlciBhbGxvY2F0ZWQgbGVuZ3RoICovCisgIHNpemVfdCBsYWJpZHg7CS8qIGxvb2stYXNpZGUgYnVmZmVyIGluZGV4IHRvIGF2YWlsYWJsZSBwYXJ0ICovCisjZW5kaWYKKyAgY2hhciBidWZbU09BUF9CVUZMRU5dOy8qIHNlbmQgYW5kIHJlY2VpdmUgYnVmZmVyICovCisgIGNoYXIgdG1wYnVmWzEwMjRdOwkvKiBpbi9vdXRwdXQgYnVmZmVyIGZvciBIVFRQIGhlYWRlcnMsIHNpbXBsZVR5cGUgdmFsdWVzLCBhdHRyaWJ1dGUgbmFtZXMsIGFuZCBESU1FID49MTAyNCBieXRlcyAqLworICBjaGFyIG1zZ2J1ZlsxMDI0XTsJLyogb3V0cHV0IGJ1ZmZlciBmb3IgKGVycm9yKSBtZXNzYWdlcyA8PTEwMjQgYnl0ZXMgKi8KKyAgY2hhciB0YWdbU09BUF9UQUdMRU5dOworICBjaGFyIGlkW1NPQVBfVEFHTEVOXTsKKyAgY2hhciBocmVmW1NPQVBfVEFHTEVOXTsKKyAgY2hhciB0eXBlW1NPQVBfVEFHTEVOXTsKKyAgY2hhciBhcnJheVR5cGVbU09BUF9UQUdMRU5dOworICBjaGFyIGFycmF5U2l6ZVtTT0FQX1RBR0xFTl07CisgIGNoYXIgYXJyYXlPZmZzZXRbU09BUF9UQUdMRU5dOworICBzaG9ydCBvdGhlcjsKKyAgc2hvcnQgcG9zaXRpb247CisgIGludCBwb3NpdGlvbnNbU09BUF9NQVhESU1TXTsKKyAgc2hvcnQgcm9vdDsKKyAgc3RydWN0IHNvYXBfYXR0cmlidXRlICphdHRyaWJ1dGVzOwkvKiBhdHRyaWJ1dGUgbGlzdCAqLworICBzaG9ydCBlbmNvZGluZzsJLyogd2hlbiBzZXQsIG91dHB1dCBlbmNvZGluZ1N0eWxlICovCisgIHNob3J0IG11c3RVbmRlcnN0YW5kOwkvKiBhIG11c3RVbmRlcnN0YW5kIGVsZW1lbnQgd2FzIHBhcnNlZCBvciBpcyBvdXRwdXQgKi8KKyAgc2hvcnQga2VlcF9hbGl2ZTsJLyogY29ubmVjdGlvbiBzaG91bGQgYmUga2VwdCBvcGVuICovCisgIHNob3J0IG51bGw7CQkvKiBwYXJzZWQgWE1MIGlzIHhzaTpuaWwgKi8KKyAgc2hvcnQgbnM7CQkvKiB3aGVuIG5vdCBzZXQsIG91dHB1dCBmdWxsIHhtbG5zIGJpbmRpbmdzICovCisgIHNob3J0IHBhcnQ7CQkvKiBwYXJzaW5nIHN0YXRlICovCisgIHNob3J0IGFsbG9jZWQ7CisgIHNob3J0IHBlZWtlZDsKKyAgc2l6ZV90IGNodW5rc2l6ZTsKKyAgc2l6ZV90IGNodW5rYnVmbGVuOworICBjaGFyIGVuZHBvaW50W1NPQVBfVEFHTEVOXTsKKyAgY2hhciBwYXRoW1NPQVBfVEFHTEVOXTsKKyAgY2hhciBob3N0W1NPQVBfVEFHTEVOXTsKKyAgY2hhciAqYWN0aW9uOworICBjaGFyICphdXRocmVhbG07CQkvKiBIVFRQIGF1dGhlbnRpY2F0aW9uIHJlYWxtICovCisgIGNoYXIgKnByb2xvZzsJCQkvKiBYTUwgZGVjbGFyYXRpb24gcHJvbG9nICovCisgIHVuc2lnbmVkIGxvbmcgaXA7CQkvKiBJUCBudW1iZXIgKi8KKyAgaW50IHBvcnQ7CQkJLyogcG9ydCBudW1iZXIgKi8KKyAgdW5zaWduZWQgaW50IG1heF9rZWVwX2FsaXZlOworICBjb25zdCBjaGFyICpwcm94eV9ob3N0OwkvKiBQcm94eSBTZXJ2ZXIgaG9zdCBuYW1lICovCisgIGludCBwcm94eV9wb3J0OwkJLyogUHJveHkgU2VydmVyIHBvcnQgKGRlZmF1bHQgPSA4MDgwKSAqLworICBjb25zdCBjaGFyICpwcm94eV91c2VyaWQ7CS8qIFByb3h5IEF1dGhvcml6YXRpb24gdXNlciBuYW1lICovCisgIGNvbnN0IGNoYXIgKnByb3h5X3Bhc3N3ZDsJLyogUHJveHkgQXV0aG9yaXphdGlvbiBwYXNzd29yZCAqLworICBpbnQgc3RhdHVzOwkJCS8qIC0xIHdoZW4gcmVxdWVzdCwgZWxzZSBlcnJvciBjb2RlIHRvIGJlIHJldHVybmVkIGJ5IHNlcnZlciAqLworICBpbnQgZXJyb3I7CisgIGludCBlcnJtb2RlOworICBpbnQgZXJybnVtOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqZG9tOworICBzdHJ1Y3Qgc29hcF9kaW1lIGRpbWU7CisgIHN0cnVjdCBzb2FwX21pbWUgbWltZTsKKyAgc3RydWN0IHNvYXBfeGxpc3QgKnhsaXN0OworI2VuZGlmCisjaWYgIWRlZmluZWQoV0lUSF9MRUFOKSB8fCBkZWZpbmVkKFNPQVBfREVCVUcpCisgIGNvbnN0IGNoYXIgKmxvZ2ZpbGVbU09BUF9NQVhMT0dTXTsKKyAgRklMRSAqZmRlYnVnW1NPQVBfTUFYTE9HU107CisgIHN0cnVjdCBzb2FwX21saXN0ICptaHRbU09BUF9QVFJIQVNIXTsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgY29uc3QgY2hhciAqYzE0bmluY2x1ZGU7CisgIGNvbnN0IGNoYXIgKmMxNG5leGNsdWRlOworICBzdHJ1Y3Qgc29hcF9jb29raWUgKmNvb2tpZXM7CisgIGNvbnN0IGNoYXIgKmNvb2tpZV9kb21haW47CisgIGNvbnN0IGNoYXIgKmNvb2tpZV9wYXRoOworICBpbnQgY29va2llX21heDsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZmRlZiBXSVRIX0lQVjYKKyAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgcGVlcjsJLyogSVB2Njogc2V0IGJ5IHNvYXBfYWNjZXB0IGFuZCBieSBVRFAgcmVjdiAqLworI2Vsc2UKKyAgc3RydWN0IHNvY2thZGRyX2luIHBlZXI7CS8qIElQdjQ6IHNldCBieSBzb2FwX2Nvbm5lY3Qvc29hcF9hY2NlcHQgYW5kIGJ5IFVEUCByZWN2ICovCisjZW5kaWYKKyAgc2l6ZV90IHBlZXJsZW47CisjZW5kaWYKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgaW50ICgqZnNzbGF1dGgpKHN0cnVjdCBzb2FwKik7CisgIGludCAoKmZzc2x2ZXJpZnkpKGludCwgWDUwOV9TVE9SRV9DVFgqKTsKKyAgQklPICpiaW87CisgIFNTTCAqc3NsOworICBTU0xfQ1RYICpjdHg7CisgIHNob3J0IHJlcXVpcmVfc2VydmVyX2F1dGg7CisgIHNob3J0IHJlcXVpcmVfY2xpZW50X2F1dGg7CisgIHNob3J0IHJzYTsJCQkvKiB3aGVuIHNldCwgdXNlIFJTQSBpbnN0ZWFkIG9mIERIICovCisgIGNvbnN0IGNoYXIgKmtleWZpbGU7CisgIGNvbnN0IGNoYXIgKnBhc3N3b3JkOworICBjb25zdCBjaGFyICpkaGZpbGU7CisgIGNvbnN0IGNoYXIgKmNhZmlsZTsKKyAgY29uc3QgY2hhciAqY2FwYXRoOworICBjb25zdCBjaGFyICpjcmxmaWxlOworICBjb25zdCBjaGFyICpyYW5kZmlsZTsKKyAgU1NMX1NFU1NJT04gKnNlc3Npb247CisgIGNoYXIgc2Vzc2lvbl9ob3N0W1NPQVBfVEFHTEVOXTsKKyAgaW50IHNlc3Npb25fcG9ydDsKKyNlbmRpZgorI2lmZGVmIFdJVEhfWkxJQgorICBzaG9ydCB6bGliX3N0YXRlOwkJLyogU09BUF9aTElCX05PTkUsIFNPQVBfWkxJQl9ERUZMQVRFLCBvciBTT0FQX1pMSUJfSU5GTEFURSAqLworICBzaG9ydCB6bGliX2luOwkJLyogU09BUF9aTElCX05PTkUsIFNPQVBfWkxJQl9ERUZMQVRFLCBvciBTT0FQX1pMSUJfR1pJUCAqLworICBzaG9ydCB6bGliX291dDsJCS8qIFNPQVBfWkxJQl9OT05FLCBTT0FQX1pMSUJfREVGTEFURSwgb3IgU09BUF9aTElCX0daSVAgKi8KKyAgel9zdHJlYW0gZF9zdHJlYW07CQkvKiBkZWNvbXByZXNzaW9uIHN0cmVhbSAqLworICBjaGFyIHpfYnVmW1NPQVBfQlVGTEVOXTsJLyogYnVmZmVyICovCisgIHNpemVfdCB6X2J1ZmxlbjsKKyAgdW5zaWduZWQgc2hvcnQgel9sZXZlbDsJLyogY29tcHJlc3Npb24gbGV2ZWwgdG8gYmUgdXNlZCAoMD1ub25lLCAxPWZhc3QgdG8gOT1iZXN0KSAqLworICB1TG9uZyB6X2NyYzsJCQkvKiBpbnRlcm5hbCBnemlwIGNyYyAqLworICBmbG9hdCB6X3JhdGlvX2luOwkJLyogZGV0ZWN0ZWQgY29tcHJlc3Npb24gcmF0aW8gY29tcHJlc3NlZF9sZW5ndGgvbGVuZ3RoIG9mIGluYm91bmQgbWVzc2FnZSAqLworICBmbG9hdCB6X3JhdGlvX291dDsJCS8qIGRldGVjdGVkIGNvbXByZXNzaW9uIHJhdGlvIGNvbXByZXNzZWRfbGVuZ3RoL2xlbmd0aCBvZiBvdXRib3VuZCBtZXNzYWdlICovCisjZW5kaWYKKyNpZmRlZiBXTVdfUlBNX0lPCisgIHZvaWQgKnJwbXJlcWlkOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorI2lmZGVmIF9fY3BsdXNwbHVzCisgIHNvYXAoKTsKKyAgc29hcChzb2FwX21vZGUpOworICBzb2FwKHNvYXBfbW9kZSwgc29hcF9tb2RlKTsKKyAgc29hcChzdHJ1Y3Qgc29hcCYpOworICB+c29hcCgpOworI2VuZGlmCisjZW5kaWYKK307CisKK3N0cnVjdCBzb2FwX2NvZGVfbWFwCit7IGxvbmcgY29kZTsKKyAgY29uc3QgY2hhciAqc3RyaW5nOworfTsKKworLyogZm9yd2FyZGluZyBsaXN0ICovCitzdHJ1Y3Qgc29hcF9mbGlzdAoreyBzdHJ1Y3Qgc29hcF9mbGlzdCAqbmV4dDsKKyAgaW50IHR5cGU7CisgIHZvaWQgKnB0cjsKKyAgdW5zaWduZWQgaW50IGxldmVsOworICBzaXplX3QgbGVuOworICB2b2lkICgqZmNvcHkpKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBzaXplX3QsIGNvbnN0IHZvaWQqLCBzaXplX3QpOworfTsKKworLyogaWQtcmVmIGZvcndhcmRpbmcgbGlzdCAqLworc3RydWN0IHNvYXBfaWxpc3QKK3sgc3RydWN0IHNvYXBfaWxpc3QgKm5leHQ7CisgIGludCB0eXBlOworICBzaXplX3Qgc2l6ZTsKKyAgdm9pZCAqbGluazsKKyAgdm9pZCAqY29weTsKKyAgc3RydWN0IHNvYXBfZmxpc3QgKmZsaXN0OworICB2b2lkICpwdHI7CisgIHVuc2lnbmVkIGludCBsZXZlbDsKKyAgY2hhciBpZFsxXTsgLyogdGhlIGFjdHVhbCBpZCBzdHJpbmcgdmFsdWUgZmxvd3MgaW50byB0aGUgYWxsb2NhdGVkIHJlZ2lvbiBiZWxvdyB0aGlzIHN0cnVjdCAqLworfTsKKworc3RydWN0IHNvYXBfcGx1Z2luCit7IHN0cnVjdCBzb2FwX3BsdWdpbiAqbmV4dDsKKyAgY29uc3QgY2hhciAqaWQ7CisgIHZvaWQgKmRhdGE7CisgIGludCAoKmZjb3B5KShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGx1Z2luICpkc3QsIHN0cnVjdCBzb2FwX3BsdWdpbiAqc3JjKTsKKyAgdm9pZCAoKmZkZWxldGUpKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnApOyAvKiBzaG91bGQgZGVsZXRlIGZpZWxkcyBvZiBwbHVnaW4gb25seSBhbmQgbm90IGZyZWUocCkgKi8KK307CisKKyNpZm5kZWYgV0lUSF9OT05BTUVTUEFDRVMKK2V4dGVybiBTT0FQX05NQUMgc3RydWN0IE5hbWVzcGFjZSBuYW1lc3BhY2VzW107CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU4KKyMgZGVmaW5lIHNvYXBfZ2V0MChzb2FwKSAoKChzb2FwKS0+YnVmaWR4Pj0oc29hcCktPmJ1ZmxlbiAmJiBzb2FwX3JlY3Yoc29hcCkpID8gRU9GIDogKHVuc2lnbmVkIGNoYXIpKHNvYXApLT5idWZbKHNvYXApLT5idWZpZHhdKQorIyBkZWZpbmUgc29hcF9nZXQxKHNvYXApICgoKHNvYXApLT5idWZpZHg+PShzb2FwKS0+YnVmbGVuICYmIHNvYXBfcmVjdihzb2FwKSkgPyBFT0YgOiAodW5zaWduZWQgY2hhcikoc29hcCktPmJ1Zlsoc29hcCktPmJ1ZmlkeCsrXSkKKyNlbHNlCitzb2FwX3djaGFyIHNvYXBfZ2V0MChzdHJ1Y3Qgc29hcCopOworc29hcF93Y2hhciBzb2FwX2dldDEoc3RydWN0IHNvYXAqKTsKKyNlbmRpZgorCisjZGVmaW5lIHNvYXBfcmV2Z2V0MShzb2FwKSAoKHNvYXApLT5idWZpZHgtLSkKKyNkZWZpbmUgc29hcF91bmdldChzb2FwLCBjKSAoKHNvYXApLT5haGVhZCA9IGMpCisjZGVmaW5lIHNvYXBfcmVnaXN0ZXJfcGx1Z2luKHNvYXAsIHBsdWdpbikgc29hcF9yZWdpc3Rlcl9wbHVnaW5fYXJnKHNvYXAsIHBsdWdpbiwgTlVMTCkKKyNkZWZpbmUgc29hcF9pbW9kZShzb2FwLCBuKSAoKHNvYXApLT5tb2RlID0gKHNvYXApLT5pbW9kZSA9IChuKSkKKyNkZWZpbmUgc29hcF9zZXRfaW1vZGUoc29hcCwgbikgKChzb2FwKS0+aW1vZGUgfD0gKG4pKQorI2RlZmluZSBzb2FwX2Nscl9pbW9kZShzb2FwLCBuKSAoKHNvYXApLT5pbW9kZSAmPSB+KG4pKQorI2RlZmluZSBzb2FwX29tb2RlKHNvYXAsIG4pICgoc29hcCktPm1vZGUgPSAoc29hcCktPm9tb2RlID0gKG4pKQorI2RlZmluZSBzb2FwX3NldF9vbW9kZShzb2FwLCBuKSAoKHNvYXApLT5vbW9kZSB8PSAobikpCisjZGVmaW5lIHNvYXBfY2xyX29tb2RlKHNvYXAsIG4pICgoc29hcCktPm9tb2RlICY9IH4obikpCisjZGVmaW5lIHNvYXBfc2V0X21vZGUoc29hcCwgbikgKChzb2FwKS0+aW1vZGUgfD0gKG4pLCAoc29hcCktPm9tb2RlIHw9IChuKSkKKyNkZWZpbmUgc29hcF9jbHJfbW9kZShzb2FwLCBuKSAoKHNvYXApLT5pbW9kZSAmPSB+KG4pLCAoc29hcCktPm9tb2RlICY9IH4obikpCisjZGVmaW5lIHNvYXBfZGVzdHJveShzb2FwKSBzb2FwX2RlbGV0ZSgoc29hcCksIE5VTEwpCisKKyNpZmRlZiBIQVZFX1NUUlJDSFIKKyMgZGVmaW5lIHNvYXBfc3RycmNocihzLCB0KSBzdHJyY2hyKHMsIHQpCisjZWxzZQorIFNPQVBfRk1BQzEgY2hhciogU09BUF9GTUFDMiBzb2FwX3N0cnJjaHIoY29uc3QgY2hhciAqcywgaW50IHQpOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NUUlRPTAorIyBkZWZpbmUgc29hcF9zdHJ0b2wocywgdCwgYikgc3RydG9sKHMsIHQsIGIpCisjZWxzZQorIFNPQVBfRk1BQzEgbG9uZyBTT0FQX0ZNQUMyIHNvYXBfc3RydG9sKGNvbnN0IGNoYXIgKnMsIGNoYXIgKip0LCBpbnQgYik7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RSVE9VTAorIyBkZWZpbmUgc29hcF9zdHJ0b3VsKHMsIHQsIGIpIHN0cnRvdWwocywgdCwgYikKKyNlbHNlCisgU09BUF9GTUFDMSB1bnNpZ25lZCBsb25nIFNPQVBfRk1BQzIgc29hcF9zdHJ0b3VsKGNvbnN0IGNoYXIgKnMsIGNoYXIgKip0LCBpbnQgYik7CisjZW5kaWYKKworI2lmIGRlZmluZWQoV0lUSF9PUEVOU1NMKQorIyBkZWZpbmUgc29hcF9yYW5kb20gc29hcF9yYW5kKCkKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9yYW5kKCk7CisjZWxpZiBkZWZpbmVkKEhBVkVfUkFORE9NKQorIyBkZWZpbmUgc29hcF9yYW5kb20gKGludClyYW5kb20oKQorI2Vsc2UKKyMgZGVmaW5lIHNvYXBfcmFuZG9tIHJhbmQoKQorI2VuZGlmCisKKyNpZmRlZiBXSVRIX05PSURSRUYKKyMgZGVmaW5lIHNvYXBfZW1iZWRkZWQocywgcCwgdCkgKDApCisjIGRlZmluZSBzb2FwX2lkX2xvb2t1cChzLCBpLCBwLCB0LCBuLCBrKSAocCkKKyMgZGVmaW5lIHNvYXBfaWRfZm9yd2FyZChzLCBoLCBwLCBsZW4sIHN0LCB0dCwgbiwgaywgZmMpIChwKQorIyBkZWZpbmUgc29hcF9yZWZlcmVuY2UocywgYSwgdCkgKDEpCisjIGRlZmluZSBzb2FwX2FycmF5X3JlZmVyZW5jZShzLCBwLCBhLCBuLCB0KSAoMSkKKyMgZGVmaW5lIHNvYXBfZW1iZWQocywgcCwgYSwgbiwgdCwgcHApICgwKQorIyBkZWZpbmUgc29hcF9lbWJlZGRlZF9pZChzLCBpLCBwLCB0KSAoaSkKKyMgZGVmaW5lIHNvYXBfaXNfZW1iZWRkZWQocywgcCkgKDApCisjIGRlZmluZSBzb2FwX2lzX3NpbmdsZShzLCBwKSAoMSkKKyMgZGVmaW5lIHNvYXBfbG9va3VwX3R5cGUocywgaSkgKDApCisjIGRlZmluZSBzb2FwX2dldGluZGVwZW5kZW50KHMpICgwKQorIyBkZWZpbmUgc29hcF9wdXRpbmRlcGVuZGVudChzKSAoMCkKKyMgZGVmaW5lIHNvYXBfZ2V0ZWxlbWVudChzLCBuKSAobikKKyMgZGVmaW5lIHNvYXBfcHV0ZWxlbWVudChzLCBwLCB0LCBpLCBuKSAoMCkKKyMgZGVmaW5lIHNvYXBfbWFya2VsZW1lbnQocywgcCwgbikgKDApCisjZW5kaWYKKworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9mYXVsdChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiogU09BUF9GTUFDMiBzb2FwX2ZhdWx0Y29kZShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiogU09BUF9GTUFDMiBzb2FwX2ZhdWx0c3ViY29kZShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiogU09BUF9GTUFDMiBzb2FwX2ZhdWx0c3RyaW5nKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqKiBTT0FQX0ZNQUMyIHNvYXBfZmF1bHRkZXRhaWwoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfc2VyaWFsaXplaGVhZGVyKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0aGVhZGVyKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZ2V0aGVhZGVyKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NlcmlhbGl6ZWZhdWx0KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0ZmF1bHQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRmYXVsdChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NzbF9pbml0KCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcG9sbChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2Nvbm5lY3RfY29tbWFuZChzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9jb25uZWN0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9iaW5kKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9hY2NlcHQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zc2xfYWNjZXB0KHN0cnVjdCBzb2FwKik7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zc2xfc2VydmVyX2NvbnRleHQoc3RydWN0IHNvYXAqLCB1bnNpZ25lZCBzaG9ydCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NzbF9jbGllbnRfY29udGV4dChzdHJ1Y3Qgc29hcCosIHVuc2lnbmVkIHNob3J0LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0aHR0cGhkcihzdHJ1Y3Qgc29hcCosIGludCBzdGF0dXMsIHNpemVfdCBjb3VudCk7CisKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX2RlY29kZV9rZXkoY2hhciosIHNpemVfdCwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfZGVjb2RlX3ZhbChjaGFyKiwgc2l6ZV90LCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzEgc2l6ZV90IFNPQVBfRk1BQzIgc29hcF9oYXNoKGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfc2V0X2VuZHBvaW50KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2ZsdXNoX3JhdyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2ZsdXNoKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHNvYXBfd2NoYXIgU09BUF9GTUFDMiBzb2FwX2dldChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBzb2FwX3djaGFyIFNPQVBfRk1BQzIgc29hcF9nZXRjaGFyKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfdGFnX2NtcChjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXRfZmF1bHQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZW5kZXJfZmF1bHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NlbmRlcl9mYXVsdF9zdWJjb2RlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcmVjZWl2ZXJfZmF1bHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3JlY2VpdmVyX2ZhdWx0X3N1YmNvZGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgaW50KTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NlbmRfcmF3KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHNpemVfdCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcmVjdl9yYXcoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9yZWN2KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2VuZChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZW5kMihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2VuZDMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3B1dHV0Zjgoc3RydWN0IHNvYXAqLCB1bnNpZ25lZCBsb25nKTsKK1NPQVBfRk1BQzEgc29hcF93Y2hhciBTT0FQX0ZNQUMyIHNvYXBfZ2V0dXRmOChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0YmFzZTY0KHN0cnVjdCBzb2FwKiwgY29uc3QgdW5zaWduZWQgY2hhciosIGludCk7CitTT0FQX0ZNQUMxIHVuc2lnbmVkIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9nZXRiYXNlNjQoc3RydWN0IHNvYXAqLCBpbnQqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3B1dGhleChzdHJ1Y3Qgc29hcCosIGNvbnN0IHVuc2lnbmVkIGNoYXIqLCBpbnQpOworU09BUF9GTUFDMSB1bnNpZ25lZCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfZ2V0aGV4KHN0cnVjdCBzb2FwKiwgaW50Kik7CisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF94b3BfZm9yd2FyZChzdHJ1Y3Qgc29hcCosIHVuc2lnbmVkIGNoYXIqKiwgaW50KiwgY2hhcioqLCBjaGFyKiosIGNoYXIqKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZGltZV9mb3J3YXJkKHN0cnVjdCBzb2FwKiwgdW5zaWduZWQgY2hhcioqLCBpbnQqLCBjaGFyKiosIGNoYXIqKiwgY2hhcioqKTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3BvaW50ZXJfbG9va3VwX2lkKHN0cnVjdCBzb2FwKiwgdm9pZCAqcCwgaW50IHQsIHN0cnVjdCBzb2FwX3BsaXN0KiopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3BvaW50ZXJfbG9va3VwKHN0cnVjdCBzb2FwKiwgY29uc3Qgdm9pZCAqcCwgaW50IHQsIHN0cnVjdCBzb2FwX3BsaXN0KiopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3BvaW50ZXJfZW50ZXIoc3RydWN0IHNvYXAqLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGludCB0LCBzdHJ1Y3Qgc29hcF9wbGlzdCoqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9hcnJheV9wb2ludGVyX2xvb2t1cChzdHJ1Y3Qgc29hcCosIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgbiwgaW50IHQsIHN0cnVjdCBzb2FwX3BsaXN0KiopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VtYmVkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGNvbnN0IGNoYXIgKnRhZywgaW50IHR5cGUpOworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcF9pbGlzdCogU09BUF9GTUFDMiBzb2FwX2xvb2t1cChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgc3RydWN0IHNvYXBfaWxpc3QqIFNPQVBfRk1BQzIgc29hcF9lbnRlcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9yZXNvbHZlKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2VtYmVkZGVkKHN0cnVjdCBzb2FwKiwgY29uc3Qgdm9pZCAqcCwgaW50IHQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3JlZmVyZW5jZShzdHJ1Y3Qgc29hcCosIGNvbnN0IHZvaWQgKnAsIGludCB0KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9hcnJheV9yZWZlcmVuY2Uoc3RydWN0IHNvYXAqLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGludCB0KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbWJlZGRlZF9pZChzdHJ1Y3Qgc29hcCosIGludCBpZCwgY29uc3Qgdm9pZCAqcCwgaW50IHQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2lzX2VtYmVkZGVkKHN0cnVjdCBzb2FwKiwgc3RydWN0IHNvYXBfcGxpc3QqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9pc19zaW5nbGUoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9wbGlzdCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXRfZW1iZWRkZWQoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9wbGlzdCopOworI2VuZGlmCisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9iZWdpbl9jb3VudChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VuZF9jb3VudChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2JlZ2luX3NlbmQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbmRfc2VuZChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwKiBTT0FQX0ZNQUMyIHNvYXBfY29kZShjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCosIGNvbnN0IGNoYXIgKnN0cik7CitTT0FQX0ZNQUMxIGxvbmcgU09BUF9GTUFDMiBzb2FwX2ludF9jb2RlKGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwKiwgY29uc3QgY2hhciAqc3RyLCBsb25nIG90aGVyKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX3N0cl9jb2RlKGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwKiwgbG9uZyBjb2RlKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2dldGxpbmUoc3RydWN0IHNvYXAqLCBjaGFyKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9iZWdpbl9yZWN2KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZW5kX3JlY3Yoc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMSB2b2lkKiBTT0FQX0ZNQUMyIHNvYXBfbWFsbG9jKHN0cnVjdCBzb2FwKiwgc2l6ZV90KTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfZGVhbGxvYyhzdHJ1Y3Qgc29hcCosIHZvaWQqKTsKK1NPQVBfRk1BQzEgc3RydWN0IHNvYXBfY2xpc3QgKiBTT0FQX0ZNQUMyIHNvYXBfbGluayhzdHJ1Y3Qgc29hcCosIHZvaWQqLCBpbnQsIGludCwgdm9pZCAoKmZkZWxldGUpKHN0cnVjdCBzb2FwX2NsaXN0KikpOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF91bmxpbmsoc3RydWN0IHNvYXAqLCBjb25zdCB2b2lkKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2ZyZWUoc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMSB2b2lkKiBTT0FQX0ZNQUMyIHNvYXBfdHJhY2tfbWFsbG9jKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgc2l6ZV90KTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfdHJhY2tfZnJlZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIHZvaWQqKTsKKworI2lmbmRlZiBXSVRIX05PSURSRUYKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9sb29rdXBfdHlwZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKmlkKTsKK1NPQVBfRk1BQzEgdm9pZCogU09BUF9GTUFDMiBzb2FwX2lkX2xvb2t1cChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKmlkLCB2b2lkICoqcCwgaW50IHQsIHNpemVfdCBuLCB1bnNpZ25lZCBpbnQgayk7CitTT0FQX0ZNQUMxIHZvaWQqIFNPQVBfRk1BQzIgc29hcF9pZF9mb3J3YXJkKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqaWQsIHZvaWQgKnAsIHNpemVfdCBsZW4sIGludCBzdCwgaW50IHR0LCBzaXplX3QgbiwgdW5zaWduZWQgaW50IGssIHZvaWQoKmZjb3B5KShzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgc2l6ZV90LCBjb25zdCB2b2lkKiwgc2l6ZV90KSk7CisjZW5kaWYKK1NPQVBfRk1BQzEgdm9pZCogU09BUF9GTUFDMiBzb2FwX2lkX2VudGVyKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqaWQsIHZvaWQgKnAsIGludCB0LCBzaXplX3QgbiwgdW5zaWduZWQgaW50IGssIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmFycmF5VHlwZSwgdm9pZCAqKCpmaW5zdGFudGlhdGUpKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfZmNvcHkoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdCwgaW50IHR0LCB2b2lkICpwLCBzaXplX3QsIGNvbnN0IHZvaWQgKnEsIHNpemVfdCBuKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NpemUoY29uc3QgaW50ICosIGludCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZ2V0b2Zmc2V0cyhjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBpbnQgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRzaXplKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQgKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZ2V0c2l6ZXMoY29uc3QgY2hhciAqLCBpbnQgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRwb3NpdGlvbihjb25zdCBjaGFyICosIGludCAqKTsKKworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfcHV0c2l6ZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgY2hhciogU09BUF9GTUFDMiBzb2FwX3B1dHNpemVzb2Zmc2V0cyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBpbnQpOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfcHV0c2l6ZXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBpbnQpOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfcHV0b2Zmc2V0KHN0cnVjdCBzb2FwKiwgaW50KTsKK1NPQVBfRk1BQzEgY2hhciogU09BUF9GTUFDMiBzb2FwX3B1dG9mZnNldHMoc3RydWN0IHNvYXAqLCBjb25zdCBpbnQgKiwgaW50KTsKKyAKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9jbG9zZXNvY2soc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcCAqU09BUF9GTUFDMiBzb2FwX25ldyh2b2lkKTsKK1NPQVBfRk1BQzEgc3RydWN0IHNvYXAgKlNPQVBfRk1BQzIgc29hcF9uZXcxKHNvYXBfbW9kZSk7CitTT0FQX0ZNQUMxIHN0cnVjdCBzb2FwICpTT0FQX0ZNQUMyIHNvYXBfbmV3Mihzb2FwX21vZGUsIHNvYXBfbW9kZSk7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2RlbChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcCAqU09BUF9GTUFDMiBzb2FwX2NvcHkoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgc3RydWN0IHNvYXAgKlNPQVBfRk1BQzIgc29hcF9jb3B5X2NvbnRleHQoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9pbml0KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2luaXQxKHN0cnVjdCBzb2FwKiwgc29hcF9tb2RlKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfaW5pdDIoc3RydWN0IHNvYXAqLCBzb2FwX21vZGUsIHNvYXBfbW9kZSk7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2RvbmUoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfY2xlYW51cChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9iZWdpbihzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9lbmQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfZGVsZXRlKHN0cnVjdCBzb2FwKiwgdm9pZCopOworCisjaWZkZWYgU09BUF9ERUJVRworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXRfcmVjdl9sb2dmaWxlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXRfc2VudF9sb2dmaWxlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXRfdGVzdF9sb2dmaWxlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9jbG9zZV9sb2dmaWxlcyhzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9vcGVuX2xvZ2ZpbGUoc3RydWN0IHNvYXAqLCBpbnQpOworI2VuZGlmCisKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX3Rva2VuKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF92YWx1ZShzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfbWF0Y2hfdGFnKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfbWF0Y2hfYXJyYXkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbGVtZW50KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnR5cGUpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2FycmF5X2JlZ2luX291dChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICpvZmZzZXQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfcmVmKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGludCBocmVmKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbGVtZW50X2hyZWYoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgY2hhciAqcmVmLCBjb25zdCBjaGFyICp2YWwpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfbnVsbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICp0eXBlKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbGVtZW50X2lkKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgZCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfcmVzdWx0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbGVtZW50X2VuZF9vdXQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZyk7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9hdHRyaWJ1dGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZWxlbWVudF9iZWdpbl9pbihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IG5pbGxhYmxlKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfZW5kX2luKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3BlZWtfZWxlbWVudChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3JldHJ5KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3JldmVydChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9zdHJkdXAoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIgKiBTT0FQX0ZNQUMyIHNvYXBfc3Ryc2VhcmNoKGNvbnN0IGNoYXIgKmJpZywgY29uc3QgY2hhciAqbGl0dGxlKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3N0cmluZ19vdXQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICpzLCBpbnQgZmxhZyk7CitTT0FQX0ZNQUMxIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9zdHJpbmdfaW4oc3RydWN0IHNvYXAqLCBpbnQsIGxvbmcsIGxvbmcpOworCisjaWZuZGVmIFdJVEhfTEVBTkVSCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfd3N0cmluZ19vdXQoc3RydWN0IHNvYXAqLCBjb25zdCB3Y2hhcl90ICpzLCBpbnQgZmxhZyk7CitTT0FQX0ZNQUMxIHdjaGFyX3QqIFNPQVBfRk1BQzIgc29hcF93c3RyaW5nX2luKHN0cnVjdCBzb2FwKiwgaW50LCBsb25nLCBsb25nKTsKKyNlbmRpZgorCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfbWF0Y2hfbmFtZXNwYWNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyKiwgaW50IG4xLCBpbnQgbjIpOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2V0X25hbWVzcGFjZXMoc3RydWN0IHNvYXAqLCBzdHJ1Y3QgTmFtZXNwYWNlKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NldF9sb2NhbF9uYW1lc3BhY2VzKHN0cnVjdCBzb2FwKik7CisKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfcG9wX25hbWVzcGFjZShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3B1c2hfbmFtZXNwYWNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9jdXJyZW50X25hbWVzcGFjZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3N0b3JlX2xhYihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2FwcGVuZF9sYWIoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc2l6ZV90KTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX25ld19ibG9jayhzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSB2b2lkKiBTT0FQX0ZNQUMyIHNvYXBfcHVzaF9ibG9jayhzdHJ1Y3Qgc29hcCosIHNpemVfdCk7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3BvcF9ibG9jayhzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBzaXplX3QgU09BUF9GTUFDMiBzb2FwX3NpemVfYmxvY2soc3RydWN0IHNvYXAqLCBzaXplX3QpOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfZmlyc3RfYmxvY2soc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgY2hhciogU09BUF9GTUFDMiBzb2FwX25leHRfYmxvY2soc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgc2l6ZV90IFNPQVBfRk1BQzIgc29hcF9ibG9ja19zaXplKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9zYXZlX2Jsb2NrKHN0cnVjdCBzb2FwKiwgY2hhciosIGludCk7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2VuZF9ibG9jayhzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZW52ZWxvcGVfYmVnaW5fb3V0KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBzb2FwX2VudmVsb3BlX2VuZF9vdXQoc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VudmVsb3BlX2JlZ2luX2luKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZW52ZWxvcGVfZW5kX2luKHN0cnVjdCBzb2FwKik7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9ib2R5X2JlZ2luX291dChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2JvZHlfZW5kX291dChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfYm9keV9iZWdpbl9pbihzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2JvZHlfZW5kX2luKHN0cnVjdCBzb2FwKik7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9yZWN2X2hlYWRlcihzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcmVzcG9uc2Uoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2VuZF9lbXB0eV9yZXNwb25zZShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3JlY3ZfZW1wdHlfcmVzcG9uc2Uoc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NlbmRfZmF1bHQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9yZWN2X2ZhdWx0KHN0cnVjdCBzb2FwKik7CisKKyNpZm5kZWYgV0lUSF9OT1NURExJQgorU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9wcmludF9mYXVsdChzdHJ1Y3Qgc29hcCosIEZJTEUqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfcHJpbnRfZmF1bHRfbG9jYXRpb24oc3RydWN0IHNvYXAqLCBGSUxFKik7CisjZW5kaWYKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MyYnl0ZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjaGFyKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfczJzaG9ydChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaG9ydCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MyaW50KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MybG9uZyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBsb25nKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfczJMT05HNjQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgTE9ORzY0Kik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfczJmbG9hdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBmbG9hdCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MyZG91YmxlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGRvdWJsZSopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MydW5zaWduZWRCeXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVuc2lnbmVkIGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zMnVuc2lnbmVkU2hvcnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdW5zaWduZWQgc2hvcnQqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zMnVuc2lnbmVkSW50KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVuc2lnbmVkIGludCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MydW5zaWduZWRMb25nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVuc2lnbmVkIGxvbmcqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zMlVMT05HNjQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgVUxPTkc2NCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3Myc3RyaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNoYXIqKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfczJRTmFtZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjaGFyKiopOworCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3Myd2NoYXIoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgd2NoYXJfdCoqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zMmRhdGVUaW1lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHRpbWVfdCopOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfczJiYXNlNjQoc3RydWN0IHNvYXAqLCBjb25zdCB1bnNpZ25lZCBjaGFyKiwgY2hhciosIGludCk7CitTT0FQX0ZNQUMxIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9zMmhleChzdHJ1Y3Qgc29hcCosIGNvbnN0IHVuc2lnbmVkIGNoYXIqLCBjaGFyKiwgaW50KTsKKyNlbmRpZgorCitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9ieXRlMnMoc3RydWN0IHNvYXAqLCBjaGFyKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX3Nob3J0MnMoc3RydWN0IHNvYXAqLCBzaG9ydCk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9pbnQycyhzdHJ1Y3Qgc29hcCosIGludCk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9sb25nMnMoc3RydWN0IHNvYXAqLCBsb25nKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX0xPTkc2NDJzKHN0cnVjdCBzb2FwKiwgTE9ORzY0KTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX2Zsb2F0MnMoc3RydWN0IHNvYXAqLCBmbG9hdCk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9kb3VibGUycyhzdHJ1Y3Qgc29hcCosIGRvdWJsZSk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF91bnNpZ25lZEJ5dGUycyhzdHJ1Y3Qgc29hcCosIHVuc2lnbmVkIGNoYXIpOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfdW5zaWduZWRTaG9ydDJzKHN0cnVjdCBzb2FwKiwgdW5zaWduZWQgc2hvcnQpOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfdW5zaWduZWRJbnQycyhzdHJ1Y3Qgc29hcCosIHVuc2lnbmVkIGludCk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF91bnNpZ25lZExvbmcycyhzdHJ1Y3Qgc29hcCosIHVuc2lnbmVkIGxvbmcpOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfVUxPTkc2NDJzKHN0cnVjdCBzb2FwKiwgVUxPTkc2NCk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9RTmFtZTJzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfd2NoYXIycyhzdHJ1Y3Qgc29hcCosIGNvbnN0IHdjaGFyX3QqKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX2RhdGVUaW1lMnMoc3RydWN0IHNvYXAqLCB0aW1lX3QpOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfYmFzZTY0MnMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY2hhciosIHNpemVfdCwgaW50Kik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9oZXgycyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjaGFyKiwgc2l6ZV90LCBpbnQqKTsKKyNlbmRpZgorCisKK1NPQVBfRk1BQzEgaW50KiBTT0FQX0ZNQUMyIHNvYXBfaW5pbnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfaW5ieXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBjaGFyICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGxvbmcqIFNPQVBfRk1BQzIgc29hcF9pbmxvbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGxvbmcgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgTE9ORzY0KiBTT0FQX0ZNQUMyIHNvYXBfaW5MT05HNjQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIExPTkc2NCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBzaG9ydCogU09BUF9GTUFDMiBzb2FwX2luc2hvcnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHNob3J0ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGZsb2F0KiBTT0FQX0ZNQUMyIHNvYXBfaW5mbG9hdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgZmxvYXQgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgZG91YmxlKiBTT0FQX0ZNQUMyIHNvYXBfaW5kb3VibGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGRvdWJsZSAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSB1bnNpZ25lZCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfaW51bnNpZ25lZEJ5dGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIGNoYXIgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgdW5zaWduZWQgc2hvcnQqIFNPQVBfRk1BQzIgc29hcF9pbnVuc2lnbmVkU2hvcnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIHNob3J0ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIHVuc2lnbmVkIGludCogU09BUF9GTUFDMiBzb2FwX2ludW5zaWduZWRJbnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIGludCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSB1bnNpZ25lZCBsb25nKiBTT0FQX0ZNQUMyIHNvYXBfaW51bnNpZ25lZExvbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIGxvbmcgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgVUxPTkc2NCogU09BUF9GTUFDMiBzb2FwX2luVUxPTkc2NChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgVUxPTkc2NCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBjaGFyKiogU09BUF9GTUFDMiBzb2FwX2luc3RyaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBjaGFyICoqcCwgY29uc3QgY2hhciAqLCBpbnQsIGludCwgbG9uZywgbG9uZyk7CitTT0FQX0ZNQUMxIGNoYXIqKiBTT0FQX0ZNQUMyIHNvYXBfaW5saXRlcmFsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBjaGFyICoqcCk7CisKKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxIHRpbWVfdCogU09BUF9GTUFDMiBzb2FwX2luZGF0ZVRpbWUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHRpbWVfdCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK1NPQVBfRk1BQzEgd2NoYXJfdCoqIFNPQVBfRk1BQzIgc29hcF9pbndzdHJpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHdjaGFyX3QgKipwLCBjb25zdCBjaGFyICosIGludCwgbG9uZywgbG9uZyk7CitTT0FQX0ZNQUMxIHdjaGFyX3QqKiBTT0FQX0ZNQUMyIHNvYXBfaW53bGl0ZXJhbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgd2NoYXJfdCAqKnApOworI2VuZGlmCisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRieXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRzaG9ydChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzaG9ydCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dGludChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBpbnQgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRsb25nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGxvbmcgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRMT05HNjQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgTE9ORzY0ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0ZmxvYXQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgZmxvYXQgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRkb3VibGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgZG91YmxlICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0dW5zaWduZWRCeXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXR1bnNpZ25lZFNob3J0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIHNob3J0ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0dW5zaWduZWRJbnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgdW5zaWduZWQgaW50ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0dW5zaWduZWRMb25nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRVTE9ORzY0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IFVMT05HNjQgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRzdHJpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY2hhciAqY29uc3QqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dGxpdGVyYWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGNoYXIgKmNvbnN0KnApOworCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dGRhdGVUaW1lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHRpbWVfdCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXR3c3RyaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIHdjaGFyX3QgKmNvbnN0KnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXR3bGl0ZXJhbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgd2NoYXJfdCAqY29uc3QqcCk7CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU5FUgorU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2F0dGFjaG1lbnQoc3RydWN0IHNvYXAgKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgdm9pZCosIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBjaGFyKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9tb3ZlKHN0cnVjdCBzb2FwKiwgbG9uZyk7CitTT0FQX0ZNQUMxIHNpemVfdCBTT0FQX0ZNQUMyIHNvYXBfdGVsbChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfZGltZV9vcHRpb24oc3RydWN0IHNvYXAqLCB1bnNpZ25lZCBzaG9ydCwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2dldGRpbWVoZHIoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRkaW1lKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0ZGltZWhkcihzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3B1dGRpbWUoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRtaW1laGRyKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZ2V0bWltZShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3B1dG1pbWVoZHIoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9wdXRtaW1lKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NldF9kaW1lKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NldF9taW1lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqYm91bmRhcnksIGNvbnN0IGNoYXIgKnN0YXJ0KTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfY2xyX2RpbWUoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfY2xyX21pbWUoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZXRfZGltZV9hdHRhY2htZW50KHN0cnVjdCBzb2FwKiwgY2hhciAqcHRyLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqaWQsIHVuc2lnbmVkIHNob3J0IG9wdHlwZSwgY29uc3QgY2hhciAqb3B0aW9uKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZXRfbWltZV9hdHRhY2htZW50KHN0cnVjdCBzb2FwKiwgY2hhciAqcHRyLCBzaXplX3Qgc2l6ZSwgZW51bSBzb2FwX21pbWVfZW5jb2RpbmcgZW5jb2RpbmcsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICpsb2NhdGlvbiwgY29uc3QgY2hhciAqZGVzY3JpcHRpb24pOworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqIFNPQVBfRk1BQzIgc29hcF9uZXh0X211bHRpcGFydChzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKTsKKyNlbmRpZgorCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcmVnaXN0ZXJfcGx1Z2luX2FyZyhzdHJ1Y3Qgc29hcCosIGludCAoKmZjcmVhdGUpKHN0cnVjdCBzb2FwKiwgc3RydWN0IHNvYXBfcGx1Z2luKiwgdm9pZCopLCB2b2lkKik7CitTT0FQX0ZNQUMxIHZvaWQqIFNPQVBfRk1BQzIgc29hcF9sb29rdXBfcGx1Z2luKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9hdHRyX3ZhbHVlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgZmxhZyk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2V0X2F0dHIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfY2xyX2F0dHIoc3RydWN0IHNvYXAgKnNvYXApOworCisjaWZkZWYgV0lUSF9DT09LSUVTCitTT0FQX0ZNQUMxIHNpemVfdCBTT0FQX0ZNQUMyIHNvYXBfZW5jb2RlX2Nvb2tpZShjb25zdCBjaGFyKiwgY2hhciosIHNpemVfdCk7CitTT0FQX0ZNQUMxIGV4dGVybiBzdHJ1Y3Qgc29hcF9jb29raWUqIFNPQVBfRk1BQzIgc29hcF9zZXRfY29va2llKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBleHRlcm4gc3RydWN0IHNvYXBfY29va2llKiBTT0FQX0ZNQUMyIHNvYXBfY29va2llKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGV4dGVybiBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfY29va2llX3ZhbHVlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGV4dGVybiBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfZW52X2Nvb2tpZV92YWx1ZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBleHRlcm4gbG9uZyBTT0FQX0ZNQUMyIHNvYXBfY29va2llX2V4cGlyZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBleHRlcm4gaW50IFNPQVBfRk1BQzIgc29hcF9zZXRfY29va2llX2V4cGlyZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBsb25nLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBleHRlcm4gaW50IFNPQVBfRk1BQzIgc29hcF9zZXRfY29va2llX3Nlc3Npb24oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgZXh0ZXJuIGludCBTT0FQX0ZNQUMyIHNvYXBfY2xyX2Nvb2tpZV9zZXNzaW9uKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGV4dGVybiB2b2lkIFNPQVBfRk1BQzIgc29hcF9jbHJfY29va2llKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGV4dGVybiBpbnQgU09BUF9GTUFDMiBzb2FwX2dldGVudl9jb29raWVzKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGV4dGVybiBzdHJ1Y3Qgc29hcF9jb29raWUqIFNPQVBfRk1BQzIgc29hcF9jb3B5X2Nvb2tpZXMoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgZXh0ZXJuIHZvaWQgU09BUF9GTUFDMiBzb2FwX2ZyZWVfY29va2llcyhzdHJ1Y3Qgc29hcCopOworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBleHRlcm4gIkMiICovCisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2dzb2FwLXBhbG0vc3RvY2txdW90ZS9vYmovcmVzb3VyY2UuZnJrL3N0b2NrUXVvdGUudG1wIGIvZ3NvYXAtcGFsbS9zdG9ja3F1b3RlL29iai9yZXNvdXJjZS5mcmsvc3RvY2tRdW90ZS50bXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk1N2ZkMQotLS0gL2Rldi9udWxsCisrKyBiL2dzb2FwLXBhbG0vc3RvY2txdW90ZS9vYmovcmVzb3VyY2UuZnJrL3N0b2NrUXVvdGUudG1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dzb2FwLXBhbG0vc3RvY2txdW90ZS9vYmovcmVzb3VyY2UuZnJrL3N0b2NrUXVvdGVELnRtcCBiL2dzb2FwLXBhbG0vc3RvY2txdW90ZS9vYmovcmVzb3VyY2UuZnJrL3N0b2NrUXVvdGVELnRtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzRlZmRhCi0tLSAvZGV2L251bGwKKysrIGIvZ3NvYXAtcGFsbS9zdG9ja3F1b3RlL29iai9yZXNvdXJjZS5mcmsvc3RvY2tRdW90ZUQudG1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dzb2FwLXBhbG0vc3RvY2txdW90ZS9vYmovc3RvY2tRdW90ZS5wcmMgYi9nc29hcC1wYWxtL3N0b2NrcXVvdGUvb2JqL3N0b2NrUXVvdGUucHJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYjk0NGUKLS0tIC9kZXYvbnVsbAorKysgYi9nc29hcC1wYWxtL3N0b2NrcXVvdGUvb2JqL3N0b2NrUXVvdGUucHJjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dzb2FwLXBhbG0vc3RvY2txdW90ZS9vYmovc3RvY2tRdW90ZS5wcmMucHN5bSBiL2dzb2FwLXBhbG0vc3RvY2txdW90ZS9vYmovc3RvY2tRdW90ZS5wcmMucHN5bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDMzYzMyCi0tLSAvZGV2L251bGwKKysrIGIvZ3NvYXAtcGFsbS9zdG9ja3F1b3RlL29iai9zdG9ja1F1b3RlLnByYy5wc3ltCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dzb2FwLXBhbG0vc3RvY2txdW90ZS9vYmovc3RvY2tRdW90ZS50bXAgYi9nc29hcC1wYWxtL3N0b2NrcXVvdGUvb2JqL3N0b2NrUXVvdGUudG1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9nc29hcC1wYWxtL3N0b2NrcXVvdGUvb2JqL3N0b2NrUXVvdGUudG1wCmRpZmYgLS1naXQgYS9nc29hcC1wYWxtL3N0b2NrcXVvdGUvb2JqL3N0b2NrUXVvdGUudG1wLk1BUCBiL2dzb2FwLXBhbG0vc3RvY2txdW90ZS9vYmovc3RvY2tRdW90ZS50bXAuTUFQCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMjkzMzkKLS0tIC9kZXYvbnVsbAorKysgYi9nc29hcC1wYWxtL3N0b2NrcXVvdGUvb2JqL3N0b2NrUXVvdGUudG1wLk1BUApAQCAtMCwwICsxLDM2MSBAQAorRmlsZTogICAgMQkiX19SdW50aW1lTW9kdWxlX18iDQorRmlsZTogICAgMgkiQzpcUHJvZ3JhbSBGaWxlc1xNZXRyb3dlcmtzXENvZGVXYXJyaW9yXFBhbG0gT1MgU3VwcG9ydFxDb2RlV2FycmlvciBMaWJyYXJpZXNcUnVudGltZVxQYWxtT1NSdW50aW1lXzJpX0E1LmxpYiINCitGaWxlOiAgICAzCSJDUGx1c0xpYjY4Sy5jcCINCitGaWxlOiAgICA0CSJFeGNlcHRpb242OEsuY3AiDQorRmlsZTogICAgNQkiTG9uZ0xvbmc2OEsuYyINCitGaWxlOiAgICA2CSJNV1JUVEkuY3AiDQorRmlsZTogICAgNwkiTk1XRXhjZXB0aW9uLmNwIg0KK0ZpbGU6ICAgIDgJIk5ld01vcmUuY3AiDQorRmlsZTogICAgOQkiTmV3LmNwIg0KK0ZpbGU6ICAgMTAJIlBhbG1PU19BYm9ydEV4aXQuY3BwIg0KK0ZpbGU6ICAgMTEJIlBhbG1PU19HbG9iYWxEZXN0cnVjdG9ycy5jIg0KK0ZpbGU6ICAgMTIJIlBhbG1PU19zZXRqbXAuYyINCitGaWxlOiAgIDEzCSJQYWxtT1NfU3RhcnR1cC5jcHAiDQorRmlsZTogICAxNAkiQ1dSdW50aW1lLmMiDQorRmlsZTogICAxNQkiSTpcbWFpblxsaWJyYXJpZXNcbmV0XG5ldHNvY2tldFxTcmNcTmV0U29ja2V0LmMiDQorRmlsZTogICAxNgkiQzpcUHJvZ3JhbSBGaWxlc1xNZXRyb3dlcmtzXENvZGVXYXJyaW9yXFBhbG0gT1MgU3VwcG9ydFxDb2RlV2FycmlvciBMaWJyYXJpZXNcUGFsbSBPUyBHbHVlXFBhbG1PU0dsdWUubGliIg0KK0ZpbGU6ICAgMTcJIkk6XG1haW5cbGlicmFyaWVzXFBhbG1PU0dsdWVcU3JjXEludGxHbHVlLmNwIg0KK0ZpbGU6ICAgMTgJIkk6XG1haW5cbGlicmFyaWVzXFBhbG1PU0dsdWVcU3JjXFRleHRNZ3IuYyINCitGaWxlOiAgIDE5CSJJOlxtYWluXGxpYnJhcmllc1xQYWxtT1NHbHVlXFNyY1xUeHRHbHVlLmNwIg0KK0ZpbGU6ICAgMjAJIkk6XG1haW5cbGlicmFyaWVzXFBhbG1PU0dsdWVcU3JjXFRzbUdsdWUuY3AiDQorRmlsZTogICAyMQkiSTpcbWFpblxsaWJyYXJpZXNcUGFsbU9TR2x1ZVxTcmNcV2luR2x1ZS5jcCINCitGaWxlOiAgIDIyCSJJOlxtYWluXGxpYnJhcmllc1xQYWxtT1NHbHVlXFNyY1xGbnRHbHVlLmNwIg0KK0ZpbGU6ICAgMjMJIkk6XG1haW5cbGlicmFyaWVzXFBhbG1PU0dsdWVcU3JjXERhdGVHbHVlLmNwIg0KK0ZpbGU6ICAgMjQJIkk6XG1haW5cbGlicmFyaWVzXFBhbG1PU0dsdWVcU3JjXFN5c0dsdWUuY3AiDQorRmlsZTogICAyNQkiSTpcbWFpblxsaWJyYXJpZXNcUGFsbU9TR2x1ZVxTcmNcT21HbHVlLmNwIg0KK0ZpbGU6ICAgMjYJIkk6XG1haW5cbGlicmFyaWVzXFBhbG1PU0dsdWVcU3JjXFJlc0dsdWUuY3AiDQorRmlsZTogICAyNwkiSTpcbWFpblxsaWJyYXJpZXNcUGFsbU9TR2x1ZVxTcmNcTG1HbHVlLmNwIg0KK0ZpbGU6ICAgMjgJIkk6XG1haW5cbGlicmFyaWVzXFBhbG1PU0dsdWVcU3JjXEZybUdsdWUuY3BwIg0KK0ZpbGU6ICAgMjkJIkk6XG1haW5cbGlicmFyaWVzXFBhbG1PU0dsdWVcU3JjXEFjY2Vzc29yR2x1ZS5jcCINCitGaWxlOiAgIDMwCSJJOlxtYWluXGxpYnJhcmllc1xQYWxtT1NHbHVlXFNyY1xNZW1HbHVlLmNwIg0KK0ZpbGU6ICAgMzEJIkk6XG1haW5cbGlicmFyaWVzXFBhbG1PU0dsdWVcU3JjXEJtcEdsdWUuY3AiDQorRmlsZTogICAzMgkiSTpcbWFpblxsaWJyYXJpZXNcUGFsbU9TR2x1ZVxTcmNcVGJsR2x1ZS5jcCINCitGaWxlOiAgIDMzCSJJOlxtYWluXGxpYnJhcmllc1xQYWxtT1NHbHVlXFNyY1xVSUNvbG9yR2x1ZS5jcCINCitGaWxlOiAgIDM0CSJDOlxEb2N1bWVudHMgYW5kIFNldHRpbmdzXGVuZ2VsZW5cRGVza3RvcFxnU09BUCBQYWxtXGdzb2FwX2NoYW5nZXMgRm9sZGVyXG15LWdzb2FwLXBhbG1cc3RvY2txdW90ZVxzcmNcc29hcENsaWVudC5jIg0KK0ZpbGU6ICAgMzUJIkM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcZW5nZWxlblxEZXNrdG9wXGdTT0FQIFBhbG1cZ3NvYXBfY2hhbmdlcyBGb2xkZXJcbXktZ3NvYXAtcGFsbVxzdG9ja3F1b3RlXHNyY1xzdG9ja3F1b3RlLmMiDQorRmlsZTogICAzNgkiQzpcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1xlbmdlbGVuXERlc2t0b3BcZ1NPQVAgUGFsbVxnc29hcF9jaGFuZ2VzIEZvbGRlclxteS1nc29hcC1wYWxtXHN0b2NrcXVvdGVcc3JjXHNvYXBDLmMiDQorRmlsZTogICAzNwkiQzpcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1xlbmdlbGVuXERlc2t0b3BcZ1NPQVAgUGFsbVxnc29hcF9jaGFuZ2VzIEZvbGRlclxteS1nc29hcC1wYWxtXHN0b2NrcXVvdGVcc3JjXFF1b3RlU3RhcnRlci5jIg0KK0ZpbGU6ICAgMzgJIkM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcZW5nZWxlblxEZXNrdG9wXGdTT0FQIFBhbG1cZ3NvYXBfY2hhbmdlcyBGb2xkZXJcbXktZ3NvYXAtcGFsbVxwYWxtRnVuY3Rpb25zLmMiDQorRmlsZTogICAzOQkiQzpcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1xlbmdlbGVuXERlc2t0b3BcZ1NPQVAgUGFsbVxnc29hcF9jaGFuZ2VzIEZvbGRlclxteS1nc29hcC1wYWxtXHN0ZHNvYXAyLmMiDQorDQorU2VnbWVudDogICAxICAgNTY3NDYgYnl0ZXMgICJTZWdtZW50XzEiDQorQ29kZTogMDAwMDA0ICAgICAgMTIgYnl0ZXMgICJfX0R1bW15U3RhcnR1cF9fIiAgICAgICAgICAgICAgIEZpbGU6ICJfX1J1bnRpbWVNb2R1bGVfXyINCitDb2RlOiAwMDAwMTAgICAgICAxMiBieXRlcyAgIl9fZHRoYW5kbGVyX180TVRXS0Z2IiAgICAgICAgICAgRmlsZTogIk5NV0V4Y2VwdGlvbi5jcCINCitDb2RlOiAwMDAwMWMgICAgICAxMiBieXRlcyAgIl9fZHVoYW5kbGVyX180TVRXS0Z2Ig0KK0NvZGU6IDAwMDAyOCAgICAgIDE2IGJ5dGVzICAidGVybWluYXRlX18zc3RkRnYiDQorQ29kZTogMDAwMDM4ICAgICAgMjQgYnl0ZXMgICJhYm9ydCIgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGU6ICJQYWxtT1NfQWJvcnRFeGl0LmNwcCINCitDb2RlOiAwMDAwNTAgICAgICA0MiBieXRlcyAgIl9fZGVzdHJveV9nbG9iYWxfY2hhaW4iICAgICAgICAgRmlsZTogIlBhbG1PU19HbG9iYWxEZXN0cnVjdG9ycy5jIg0KK0NvZGU6IDAwMDA3YSAgICAgIDE0IGJ5dGVzICAic2V0am1wIiAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlOiAiUGFsbU9TX3NldGptcC5jIg0KK0NvZGU6IDAwMDA4OCAgICAgIDE4IGJ5dGVzICAibG9uZ2ptcCINCitDb2RlOiAwMDAwOWEgICAgIDE1NCBieXRlcyAgIl9fUmVsb2NhdGVfX19fNE1UV0tGUFNjUFNjVWwiICAgRmlsZTogIlBhbG1PU19TdGFydHVwLmNwcCINCitDb2RlOiAwMDAxMzQgICAgIDMxNCBieXRlcyAgIl9fU3RhcnR1cF9fIg0KK0NvZGU6IDAwMDI2ZSAgICAgICA4IGJ5dGVzICAiX19QcmVJbml0X18iDQorQ29kZTogMDAwMjc2ICAgICAgIDggYnl0ZXMgICJfX0luaXRDb2RlX18iDQorQ29kZTogMDAwMjdlICAgICAxMzIgYnl0ZXMgICJfX1NraXBUb1hSRUZzX19fXzRNVFdLRlBTYyINCitDb2RlOiAwMDAzMDIgICAgIDEyOCBieXRlcyAgIl9fUGF0Y2hWMTBEZXZpY2VzX19fXzRNVFdLRlAxNFN5c0FwcEluZm9UeXBlIg0KK0NvZGU6IDAwMDM4MiAgICAgMjM0IGJ5dGVzICAiX19Mb2FkQW5kUmVsb2NhdGVfX19fNE1UV0tGVWNQN19vcGFxdWUiDQorQ29kZTogMDAwNDZjICAgICAgMzIgYnl0ZXMgICJfX2xtdWxfXyIgICAgICAgICAgICAgICAgICAgICAgIEZpbGU6ICJDV1J1bnRpbWUuYyINCitDb2RlOiAwMDA0OGMgICAgICA3NiBieXRlcyAgIl9fbGRpdnVfXyINCitDb2RlOiAwMDA0ZDggICAgICAzNCBieXRlcyAgIl9fbGRpdl9fIg0KK0NvZGU6IDAwMDRmYSAgICAgIDcyIGJ5dGVzICAiX19sbW9kdV9fIg0KK0NvZGU6IDAwMDU0MiAgICAgIDI0IGJ5dGVzICAiX19sbW9kX18iDQorQ29kZTogMDAwNTVhICAgICAgNTQgYnl0ZXMgICJOZXRVSW5pdCIgICAgICAgICAgICAgICAgICAgICAgIEZpbGU6ICJJOlxtYWluXGxpYnJhcmllc1xuZXRcbmV0c29ja2V0XFNyY1xOZXRTb2NrZXQuYyINCitDb2RlOiAwMDA1OTAgICAgIDkzMCBieXRlcyAgInNvYXBfY2FsbF9uc19fZ2V0UXVvdGUiICAgICAgICAgRmlsZTogIkM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcZW5nZWxlblxEZXNrdG9wXGdTT0FQIFBhbG1cZ3NvYXBfY2hhbmdlcyBGb2xkZXJcbXktZ3NvYXAtcGFsbVxzdG9ja3F1b3RlXHNyY1xzb2FwQ2xpZW50LmMiDQorQ29kZTogMDAwOTMyICAgICAyNDQgYnl0ZXMgICJnZXRRdW90ZSIgICAgICAgICAgICAgICAgICAgICAgIEZpbGU6ICJDOlxEb2N1bWVudHMgYW5kIFNldHRpbmdzXGVuZ2VsZW5cRGVza3RvcFxnU09BUCBQYWxtXGdzb2FwX2NoYW5nZXMgRm9sZGVyXG15LWdzb2FwLXBhbG1cc3RvY2txdW90ZVxzcmNcc3RvY2txdW90ZS5jIg0KK0NvZGU6IDAwMGEyNiAgICAgIDcyIGJ5dGVzICAiU3RkRXRvQSINCitDb2RlOiAwMDBhNmUgICAgICA0OCBieXRlcyAgInNvYXBfc2VyaWFsaXplaGVhZGVyIiAgICAgICAgICAgRmlsZTogIkM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcZW5nZWxlblxEZXNrdG9wXGdTT0FQIFBhbG1cZ3NvYXBfY2hhbmdlcyBGb2xkZXJcbXktZ3NvYXAtcGFsbVxzdG9ja3F1b3RlXHNyY1xzb2FwQy5jIg0KK0NvZGU6IDAwMGE5ZSAgICAgIDkwIGJ5dGVzICAic29hcF9wdXRoZWFkZXIiDQorQ29kZTogMDAwYWY4ICAgICAgOTQgYnl0ZXMgICJzb2FwX2dldGhlYWRlciINCitDb2RlOiAwMDBiNTYgICAgIDE1MCBieXRlcyAgInNvYXBfZmF1bHQiDQorQ29kZTogMDAwYmVjICAgICAgNzYgYnl0ZXMgICJzb2FwX2dldGZhdWx0Ig0KK0NvZGU6IDAwMGMzOCAgICAgIDYyIGJ5dGVzICAic29hcF9mYXVsdGNvZGUiDQorQ29kZTogMDAwYzc2ICAgICAgNTggYnl0ZXMgICJzb2FwX2ZhdWx0c3RyaW5nIg0KK0NvZGU6IDAwMGNiMCAgICAgMjA0IGJ5dGVzICAic29hcF9mYXVsdGRldGFpbCINCitDb2RlOiAwMDBkN2MgICAgIDEwMiBieXRlcyAgInNvYXBfZ2V0aW5kZXBlbmRlbnQiDQorQ29kZTogMDAwZGUyICAgIDEyMzggYnl0ZXMgICJzb2FwX2dldGVsZW1lbnQiDQorQ29kZTogMDAxMmI4ICAgICAyOTQgYnl0ZXMgICJzb2FwX2lnbm9yZV9lbGVtZW50Ig0KK0NvZGU6IDAwMTNkZSAgICAgMTUwIGJ5dGVzICAic29hcF9wdXRpbmRlcGVuZGVudCINCitDb2RlOiAwMDE0NzQgICAgIDQ3NiBieXRlcyAgInNvYXBfcHV0ZWxlbWVudCINCitDb2RlOiAwMDE2NTAgICAgICA0OCBieXRlcyAgInNvYXBfb3V0X2J5dGUiDQorQ29kZTogMDAxNjgwICAgICAgNDQgYnl0ZXMgICJzb2FwX2luX2J5dGUiDQorQ29kZTogMDAxNmFjICAgICAgNDggYnl0ZXMgICJzb2FwX291dF9pbnQiDQorQ29kZTogMDAxNmRjICAgICAgNDQgYnl0ZXMgICJzb2FwX2luX2ludCINCitDb2RlOiAwMDE3MDggICAgICAgOCBieXRlcyAgInNvYXBfZGVmYXVsdF9mbG9hdCINCitDb2RlOiAwMDE3MTAgICAgICA0OCBieXRlcyAgInNvYXBfb3V0X2Zsb2F0Ig0KK0NvZGU6IDAwMTc0MCAgICAgIDQ0IGJ5dGVzICAic29hcF9pbl9mbG9hdCINCitDb2RlOiAwMDE3NmMgICAgIDE3MCBieXRlcyAgInNvYXBfZGVmYXVsdF9TT0FQX0VOVl9fRmF1bHQiDQorQ29kZTogMDAxODE2ICAgICAgODAgYnl0ZXMgICJzb2FwX2dldF9TT0FQX0VOVl9fRmF1bHQiDQorQ29kZTogMDAxODY2ICAgIDExNjAgYnl0ZXMgICJzb2FwX2luX1NPQVBfRU5WX19GYXVsdCINCitDb2RlOiAwMDFjZWUgICAgICAxNiBieXRlcyAgInNvYXBfZGVmYXVsdF9TT0FQX0VOVl9fRGV0YWlsIg0KK0NvZGU6IDAwMWNmZSAgICAgNTAwIGJ5dGVzICAic29hcF9pbl9TT0FQX0VOVl9fRGV0YWlsIg0KK0NvZGU6IDAwMWVmMiAgICAgIDQwIGJ5dGVzICAic29hcF9kZWZhdWx0X1NPQVBfRU5WX19Db2RlIg0KK0NvZGU6IDAwMWYxYSAgICAgNTQ4IGJ5dGVzICAic29hcF9pbl9TT0FQX0VOVl9fQ29kZSINCitDb2RlOiAwMDIxM2UgICAgICAgMiBieXRlcyAgInNvYXBfc2VyaWFsaXplX1NPQVBfRU5WX19IZWFkZXIiDQorQ29kZTogMDAyMTQwICAgICAgIDIgYnl0ZXMgICJzb2FwX2RlZmF1bHRfU09BUF9FTlZfX0hlYWRlciINCitDb2RlOiAwMDIxNDIgICAgIDEwNiBieXRlcyAgInNvYXBfb3V0X1NPQVBfRU5WX19IZWFkZXIiDQorQ29kZTogMDAyMWFjICAgICAzNzggYnl0ZXMgICJzb2FwX2luX1NPQVBfRU5WX19IZWFkZXIiDQorQ29kZTogMDAyMzI2ICAgICAgNjAgYnl0ZXMgICJzb2FwX3NlcmlhbGl6ZV9uc19fZ2V0UXVvdGUiDQorQ29kZTogMDAyMzYyICAgICAgMzIgYnl0ZXMgICJzb2FwX2RlZmF1bHRfbnNfX2dldFF1b3RlIg0KK0NvZGU6IDAwMjM4MiAgICAgMTI0IGJ5dGVzICAic29hcF9wdXRfbnNfX2dldFF1b3RlIg0KK0NvZGU6IDAwMjNmZSAgICAgMTU0IGJ5dGVzICAic29hcF9vdXRfbnNfX2dldFF1b3RlIg0KK0NvZGU6IDAwMjQ5OCAgICAgNDU4IGJ5dGVzICAic29hcF9pbl9uc19fZ2V0UXVvdGUiDQorQ29kZTogMDAyNjYyICAgICAgIDggYnl0ZXMgICJzb2FwX2RlZmF1bHRfbnNfX2dldFF1b3RlUmVzcG9uc2UiDQorQ29kZTogMDAyNjZhICAgICAyMDAgYnl0ZXMgICJzb2FwX291dF9uc19fZ2V0UXVvdGVSZXNwb25zZSINCitDb2RlOiAwMDI3MzIgICAgICA4MCBieXRlcyAgInNvYXBfZ2V0X25zX19nZXRRdW90ZVJlc3BvbnNlIg0KK0NvZGU6IDAwMjc4MiAgICAgNDUwIGJ5dGVzICAic29hcF9pbl9uc19fZ2V0UXVvdGVSZXNwb25zZSINCitDb2RlOiAwMDI5NDQgICAgIDI1OCBieXRlcyAgInNvYXBfaW5fUG9pbnRlclRvU09BUF9FTlZfX0RldGFpbCINCitDb2RlOiAwMDJhNDYgICAgIDI1OCBieXRlcyAgInNvYXBfaW5fUG9pbnRlclRvU09BUF9FTlZfX0NvZGUiDQorQ29kZTogMDAyYjQ4ICAgICAxMTYgYnl0ZXMgICJzb2FwX291dF9Qb2ludGVyVG9mbG9hdCINCitDb2RlOiAwMDJiYmMgICAgIDI1OCBieXRlcyAgInNvYXBfaW5fUG9pbnRlclRvZmxvYXQiDQorQ29kZTogMDAyY2JlICAgICAgMzIgYnl0ZXMgICJzb2FwX2RlZmF1bHRfX1FOYW1lIg0KK0NvZGU6IDAwMmNkZSAgICAgIDU0IGJ5dGVzICAic29hcF9pbl9fUU5hbWUiDQorQ29kZTogMDAyZDE0ICAgICAgIDggYnl0ZXMgICJzb2FwX2RlZmF1bHRfc3RyaW5nIg0KK0NvZGU6IDAwMmQxYyAgICAgIDM4IGJ5dGVzICAic29hcF9zZXJpYWxpemVfc3RyaW5nIg0KK0NvZGU6IDAwMmQ0MiAgICAgIDQ4IGJ5dGVzICAic29hcF9vdXRfc3RyaW5nIg0KK0NvZGU6IDAwMmQ3MiAgICAgIDU0IGJ5dGVzICAic29hcF9pbl9zdHJpbmciDQorQ29kZTogMDAyZGE4ICAgICAxNDYgYnl0ZXMgICJSb21WZXJzaW9uQ29tcGF0aWJsZSIgICAgICAgICAgIEZpbGU6ICJDOlxEb2N1bWVudHMgYW5kIFNldHRpbmdzXGVuZ2VsZW5cRGVza3RvcFxnU09BUCBQYWxtXGdzb2FwX2NoYW5nZXMgRm9sZGVyXG15LWdzb2FwLXBhbG1cc3RvY2txdW90ZVxzcmNcUXVvdGVTdGFydGVyLmMiDQorQ29kZTogMDAyZTNhICAgICAgNDAgYnl0ZXMgICJHZXRPYmplY3RQdHIiDQorQ29kZTogMDAyZTYyICAgICAgOTAgYnl0ZXMgICJNYWluRm9ybUluaXQiDQorQ29kZTogMDAyZWJjICAgICAgNjYgYnl0ZXMgICJNYWluRm9ybURvQ29tbWFuZCINCitDb2RlOiAwMDJlZmUgICAgIDIwOCBieXRlcyAgIk1haW5Gb3JtSGFuZGxlRXZlbnQiDQorQ29kZTogMDAyZmNlICAgICAgODAgYnl0ZXMgICJBcHBIYW5kbGVFdmVudCINCitDb2RlOiAwMDMwMWUgICAgIDEwMiBieXRlcyAgIkFwcEV2ZW50TG9vcCINCitDb2RlOiAwMDMwODQgICAgICA0MCBieXRlcyAgIkFwcFN0YXJ0Ig0KK0NvZGU6IDAwMzBhYyAgICAgIDM4IGJ5dGVzICAiQXBwU3RvcCINCitDb2RlOiAwMDMwZDIgICAgIDEyOCBieXRlcyAgIlN0YXJ0ZXJQYWxtTWFpbiINCitDb2RlOiAwMDMxNTIgICAgICA0NiBieXRlcyAgIlBpbG90TWFpbiINCitDb2RlOiAwMDMxODAgICAgICAyOCBieXRlcyAgIlBhbG1TdHJlcnJvciIgICAgICAgICAgICAgICAgICAgRmlsZTogIkM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcZW5nZWxlblxEZXNrdG9wXGdTT0FQIFBhbG1cZ3NvYXBfY2hhbmdlcyBGb2xkZXJcbXktZ3NvYXAtcGFsbVxwYWxtRnVuY3Rpb25zLmMiDQorQ29kZTogMDAzMTljICAgICAxMTQgYnl0ZXMgICJzdHJ0b2QiDQorQ29kZTogMDAzMjBlICAgICAxNDQgYnl0ZXMgICJwYWxtU3ByaW50ZiINCitDb2RlOiAwMDMyOWUgICAgICA3OCBieXRlcyAgInBhbG1OZXRMaWJPcGVuIg0KK0NvZGU6IDAwMzJlYyAgICAgIDQwIGJ5dGVzICAicGFsbU5ldExpYkNsb3NlIg0KK0NvZGU6IDAwMzMxNCAgICAgMTE2IGJ5dGVzICAicGFsbVJhbmQiDQorQ29kZTogMDAzMzg4ICAgICAxOTggYnl0ZXMgICJmc2VuZCIgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGU6ICJDOlxEb2N1bWVudHMgYW5kIFNldHRpbmdzXGVuZ2VsZW5cRGVza3RvcFxnU09BUCBQYWxtXGdzb2FwX2NoYW5nZXMgRm9sZGVyXG15LWdzb2FwLXBhbG1cc3Rkc29hcDIuYyINCitDb2RlOiAwMDM0NGUgICAgIDI0NCBieXRlcyAgInNvYXBfc2VuZF9yYXciDQorQ29kZTogMDAzNTQyICAgICAgNjQgYnl0ZXMgICJzb2FwX2ZsdXNoIg0KK0NvZGU6IDAwMzU4MiAgICAgMjQ0IGJ5dGVzICAic29hcF9mbHVzaF9yYXciDQorQ29kZTogMDAzNjc2ICAgICAgNjQgYnl0ZXMgICJzb2FwX3NlbmQiDQorQ29kZTogMDAzNmI2ICAgICAxMDIgYnl0ZXMgICJzb2FwX3NlbmQzIg0KK0NvZGU6IDAwMzcxYyAgICAgMTcyIGJ5dGVzICAiZnJlY3YiDQorQ29kZTogMDAzN2M4ICAgICAxMTQgYnl0ZXMgICJzb2FwX2dldGNodW5rY2hhciINCitDb2RlOiAwMDM4M2EgICAgICA1MiBieXRlcyAgInNvYXBfaXN4ZGlnaXQiDQorQ29kZTogMDAzODZlICAgICA2MjQgYnl0ZXMgICJzb2FwX3JlY3ZfcmF3Ig0KK0NvZGU6IDAwM2FkZSAgICAgNDM4IGJ5dGVzICAic29hcF9yZWN2Ig0KK0NvZGU6IDAwM2M5NCAgICAgIDYyIGJ5dGVzICAic29hcF9nZXRjaGFyIg0KK0NvZGU6IDAwM2NkMiAgICAgIDcwIGJ5dGVzICAic29hcF9pbnRfY29kZSINCitDb2RlOiAwMDNkMTggICAgICAyOCBieXRlcyAgInNvYXBfc3RyX2NvZGUiDQorQ29kZTogMDAzZDM0ICAgICAyOTIgYnl0ZXMgICJzb2FwX2NoYXIiDQorQ29kZTogMDAzZTU4ICAgICAgNzIgYnl0ZXMgICJzb2FwX2dldDAiDQorQ29kZTogMDAzZWEwICAgICAgNzYgYnl0ZXMgICJzb2FwX2dldDEiDQorQ29kZTogMDAzZWVjICAgICA2MTIgYnl0ZXMgICJzb2FwX2dldCINCitDb2RlOiAwMDQxNTAgICAgICA1OCBieXRlcyAgInNvYXBfbW92ZSINCitDb2RlOiAwMDQxOGEgICAgICAzNiBieXRlcyAgInNvYXBfdGVsbCINCitDb2RlOiAwMDQxYWUgICAgIDEyOCBieXRlcyAgInNvYXBfcHV0dXRmOCINCitDb2RlOiAwMDQyMmUgICAgIDQwNiBieXRlcyAgInNvYXBfZ2V0dXRmOCINCitDb2RlOiAwMDQzYzQgICAgICA4MiBieXRlcyAgInNvYXBfc3RyZHVwIg0KK0NvZGU6IDAwNDQxNiAgICAgIDU4IGJ5dGVzICAic29hcF9uZXdfYmxvY2siDQorQ29kZTogMDA0NDUwICAgICAgODQgYnl0ZXMgICJzb2FwX3B1c2hfYmxvY2siDQorQ29kZTogMDA0NGE0ICAgICAyNjggYnl0ZXMgICJzb2FwX3VwZGF0ZV9wdHJzIg0KK0NvZGU6IDAwNDViMCAgICAgMTA4IGJ5dGVzICAic29hcF9oYXNfY29waWVzIg0KK0NvZGU6IDAwNDYxYyAgICAgNDM0IGJ5dGVzICAic29hcF9yZXNvbHZlIg0KK0NvZGU6IDAwNDdjZSAgICAgIDYwIGJ5dGVzICAic29hcF9zaXplX2Jsb2NrIg0KK0NvZGU6IDAwNDgwYSAgICAgIDYwIGJ5dGVzICAic29hcF9maXJzdF9ibG9jayINCitDb2RlOiAwMDQ4NDYgICAgICA2MiBieXRlcyAgInNvYXBfbmV4dF9ibG9jayINCitDb2RlOiAwMDQ4ODQgICAgICAxOCBieXRlcyAgInNvYXBfYmxvY2tfc2l6ZSINCitDb2RlOiAwMDQ4OTYgICAgICA2NiBieXRlcyAgInNvYXBfZW5kX2Jsb2NrIg0KK0NvZGU6IDAwNDhkOCAgICAgMjMwIGJ5dGVzICAic29hcF9zYXZlX2Jsb2NrIg0KK0NvZGU6IDAwNDliZSAgICAgMTEwIGJ5dGVzICAic29hcF9nZXRwb3NpdGlvbiINCitDb2RlOiAwMDRhMmMgICAgIDMzMiBieXRlcyAgInNvYXBfcHVzaF9uYW1lc3BhY2UiDQorQ29kZTogMDA0Yjc4ICAgICAgNTQgYnl0ZXMgICJzb2FwX3BvcF9uYW1lc3BhY2UiDQorQ29kZTogMDA0YmFlICAgICAyMTggYnl0ZXMgICJzb2FwX21hdGNoX25hbWVzcGFjZSINCitDb2RlOiAwMDRjODggICAgIDIzOCBieXRlcyAgInNvYXBfdGFnX2NtcCINCitDb2RlOiAwMDRkNzYgICAgIDI4NCBieXRlcyAgInNvYXBfbWF0Y2hfdGFnIg0KK0NvZGU6IDAwNGU5MiAgICAgIDE0IGJ5dGVzICAidGNwX2luaXQiDQorQ29kZTogMDA0ZWEwICAgICAxNDYgYnl0ZXMgICJ0Y3BfZXJyb3IiDQorQ29kZTogMDA0ZjMyICAgICAgIDYgYnl0ZXMgICJodHRwX2Vycm9yIg0KK0NvZGU6IDAwNGYzOCAgICAgMTQ4IGJ5dGVzICAidGNwX2dldGhvc3QiDQorQ29kZTogMDA0ZmNjICAgICA4NzYgYnl0ZXMgICJ0Y3BfY29ubmVjdCINCitDb2RlOiAwMDUzMzggICAgICAgNCBieXRlcyAgInNvYXBfcG9sbCINCitDb2RlOiAwMDUzM2MgICAgICA0OCBieXRlcyAgInRjcF9hY2NlcHQiDQorQ29kZTogMDA1MzZjICAgICAgNzYgYnl0ZXMgICJ0Y3BfZGlzY29ubmVjdCINCitDb2RlOiAwMDUzYjggICAgICAyOCBieXRlcyAgInRjcF9jbG9zZXNvY2tldCINCitDb2RlOiAwMDUzZDQgICAgICAzMiBieXRlcyAgInRjcF9zaHV0ZG93bnNvY2tldCINCitDb2RlOiAwMDUzZjQgICAgICA4NCBieXRlcyAgInNvYXBfY2xvc2Vzb2NrIg0KK0NvZGU6IDAwNTQ0OCAgICAgIDc2IGJ5dGVzICAic29hcF9oYXNoIg0KK0NvZGU6IDAwNTQ5NCAgICAgIDM4IGJ5dGVzICAic29hcF9pbml0X3BodCINCitDb2RlOiAwMDU0YmEgICAgICAyOCBieXRlcyAgInNvYXBfbmV3Ig0KK0NvZGU6IDAwNTRkNiAgICAgIDYwIGJ5dGVzICAic29hcF9uZXcyIg0KK0NvZGU6IDAwNTUxMiAgICAgIDc0IGJ5dGVzICAic29hcF9mcmVlX3BodCINCitDb2RlOiAwMDU1NWMgICAgIDIwNiBieXRlcyAgInNvYXBfZW1iZWQiDQorQ29kZTogMDA1NjJhICAgICAgODAgYnl0ZXMgICJzb2FwX3BvaW50ZXJfbG9va3VwIg0KK0NvZGU6IDAwNTY3YSAgICAgMTg4IGJ5dGVzICAic29hcF9wb2ludGVyX2VudGVyIg0KK0NvZGU6IDAwNTczNiAgICAgMTQyIGJ5dGVzICAic29hcF9hcnJheV9wb2ludGVyX2xvb2t1cCINCitDb2RlOiAwMDU3YzQgICAgIDMyMCBieXRlcyAgInNvYXBfYmVnaW5fY291bnQiDQorQ29kZTogMDA1OTA0ICAgICAzNjQgYnl0ZXMgICJzb2FwX2JlZ2luX3NlbmQiDQorQ29kZTogMDA1YTcwICAgICAgNjggYnl0ZXMgICJzb2FwX2VtYmVkZGVkIg0KK0NvZGU6IDAwNWFiNCAgICAgMTg0IGJ5dGVzICAic29hcF9yZWZlcmVuY2UiDQorQ29kZTogMDA1YjZjICAgICAyODIgYnl0ZXMgICJzb2FwX2VtYmVkZGVkX2lkIg0KK0NvZGU6IDAwNWM4NiAgICAgMTI0IGJ5dGVzICAic29hcF9pc19lbWJlZGRlZCINCitDb2RlOiAwMDVkMDIgICAgICA2OCBieXRlcyAgInNvYXBfaXNfc2luZ2xlIg0KK0NvZGU6IDAwNWQ0NiAgICAgIDM2IGJ5dGVzICAic29hcF9zZXRfZW1iZWRkZWQiDQorQ29kZTogMDA1ZDZhICAgICAgMjYgYnl0ZXMgICJzb2FwX2luaXRfaWh0Ig0KK0NvZGU6IDAwNWQ4NCAgICAgIDkyIGJ5dGVzICAic29hcF9mcmVlX2lodCINCitDb2RlOiAwMDVkZTAgICAgICA4MCBieXRlcyAgInNvYXBfbG9va3VwIg0KK0NvZGU6IDAwNWUzMCAgICAgMTA2IGJ5dGVzICAic29hcF9lbnRlciINCitDb2RlOiAwMDVlOWEgICAgIDEwOCBieXRlcyAgInNvYXBfbWFsbG9jIg0KK0NvZGU6IDAwNWYwNiAgICAgMTY2IGJ5dGVzICAic29hcF9kZWFsbG9jIg0KK0NvZGU6IDAwNWZhYyAgICAgMTIwIGJ5dGVzICAic29hcF9kZWxldGUiDQorQ29kZTogMDA2MDI0ICAgICAgNjYgYnl0ZXMgICJzb2FwX2xvb2t1cF90eXBlIg0KK0NvZGU6IDAwNjA2NiAgICAgMzk0IGJ5dGVzICAic29hcF9pZF9sb29rdXAiDQorQ29kZTogMDA2MWYwICAgICAyOTQgYnl0ZXMgICJzb2FwX2lkX2ZvcndhcmQiDQorQ29kZTogMDA2MzE2ICAgICAzMTggYnl0ZXMgICJzb2FwX2lkX2VudGVyIg0KK0NvZGU6IDAwNjQ1NCAgICAgIDI0IGJ5dGVzICAic29hcF9mY29weSINCitDb2RlOiAwMDY0NmMgICAgIDU3NiBieXRlcyAgInNvYXBfZW5kX3NlbmQiDQorQ29kZTogMDA2NmFjICAgICAyMjYgYnl0ZXMgICJzb2FwX2VuZF9yZWN2Ig0KK0NvZGU6IDAwNjc4ZSAgICAgMjkwIGJ5dGVzICAic29hcF9mcmVlIg0KK0NvZGU6IDAwNjhiMCAgICAgNjkwIGJ5dGVzICAic29hcF9pbml0Ig0KK0NvZGU6IDAwNmI2MiAgICAgIDYwIGJ5dGVzICAic29hcF9pbml0MiINCitDb2RlOiAwMDZiOWUgICAgIDE0OCBieXRlcyAgInNvYXBfYmVnaW4iDQorQ29kZTogMDA2YzMyICAgICAxMjIgYnl0ZXMgICJzb2FwX2VuZCINCitDb2RlOiAwMDZjYWMgICAgIDEyMiBieXRlcyAgInNvYXBfc2V0X2xvY2FsX25hbWVzcGFjZXMiDQorQ29kZTogMDA2ZDI2ICAgIDEwMzYgYnl0ZXMgICJzb2FwX2VsZW1lbnQiDQorQ29kZTogMDA3MTMyICAgICAgOTggYnl0ZXMgICJzb2FwX2VsZW1lbnRfYmVnaW5fb3V0Ig0KK0NvZGU6IDAwNzE5NCAgICAgIDMyIGJ5dGVzICAic29hcF9zdHJyY2hyIg0KK0NvZGU6IDAwNzFiNCAgICAgMjM0IGJ5dGVzICAic29hcF9zdHJ0b2wiDQorQ29kZTogMDA3MjllICAgICAyMTggYnl0ZXMgICJzb2FwX3N0cnRvdWwiDQorQ29kZTogMDA3Mzc4ICAgICAzMzAgYnl0ZXMgICJzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dCINCitDb2RlOiAwMDc0YzIgICAgIDE0MiBieXRlcyAgInNvYXBfZWxlbWVudF9lbmRfb3V0Ig0KK0NvZGU6IDAwNzU1MCAgICAgMTIyIGJ5dGVzICAic29hcF9lbGVtZW50X3JlZiINCitDb2RlOiAwMDc1Y2EgICAgIDEyNCBieXRlcyAgInNvYXBfZWxlbWVudF9ocmVmIg0KK0NvZGU6IDAwNzY0NiAgICAgMjMyIGJ5dGVzICAic29hcF9lbGVtZW50X251bGwiDQorQ29kZTogMDA3NzJlICAgICAzMTAgYnl0ZXMgICJzb2FwX2VsZW1lbnRfaWQiDQorQ29kZTogMDA3ODY0ICAgICAyNTQgYnl0ZXMgICJzb2FwX2VsZW1lbnRfcmVzdWx0Ig0KK0NvZGU6IDAwNzk2MiAgICAgMjA4IGJ5dGVzICAic29hcF9hdHRyaWJ1dGUiDQorQ29kZTogMDA3YTMyICAgICAxOTIgYnl0ZXMgICJzb2FwX2VsZW1lbnRfYmVnaW5faW4iDQorQ29kZTogMDA3YWYyICAgICA0MjQgYnl0ZXMgICJzb2FwX2VsZW1lbnRfZW5kX2luIg0KK0NvZGU6IDAwN2M5YSAgICAgIDIyIGJ5dGVzICAic29hcF9jbHJfYXR0ciINCitDb2RlOiAwMDdjYjAgICAgIDIzNCBieXRlcyAgInNvYXBfZ2V0YXR0cnZhbCINCitDb2RlOiAwMDdkOWEgICAgIDE4NiBieXRlcyAgInNvYXBfYXBwZW5kX2xhYiINCitDb2RlOiAwMDdlNTQgICAgMzE2MCBieXRlcyAgInNvYXBfcGVla19lbGVtZW50Ig0KK0NvZGU6IDAwOGFhYyAgICAgIDI4IGJ5dGVzICAic29hcF9yZXZlcnQiDQorQ29kZTogMDA4YWM4ICAgICA5MjYgYnl0ZXMgICJzb2FwX3N0cmluZ19vdXQiDQorQ29kZTogMDA4ZTY2ICAgIDExMTggYnl0ZXMgICJzb2FwX3N0cmluZ19pbiINCitDb2RlOiAwMDkyYzQgICAgIDE3NCBieXRlcyAgInNvYXBfb3V0aW50Ig0KK0NvZGU6IDAwOTM3MiAgICAgIDg4IGJ5dGVzICAic29hcF9zMmludCINCitDb2RlOiAwMDkzY2EgICAgIDI2MiBieXRlcyAgInNvYXBfaW5pbnQiDQorQ29kZTogMDA5NGQwICAgICAgNTQgYnl0ZXMgICJzb2FwX2xvbmcycyINCitDb2RlOiAwMDk1MDYgICAgIDE3OCBieXRlcyAgInNvYXBfb3V0Ynl0ZSINCitDb2RlOiAwMDk1YjggICAgIDEwMiBieXRlcyAgInNvYXBfczJieXRlIg0KK0NvZGU6IDAwOTYxZSAgICAgMjYyIGJ5dGVzICAic29hcF9pbmJ5dGUiDQorQ29kZTogMDA5NzI0ICAgICAxNDQgYnl0ZXMgICJzb2FwX2Zsb2F0MnMiDQorQ29kZTogMDA5N2I0ICAgICAxNzIgYnl0ZXMgICJzb2FwX291dGZsb2F0Ig0KK0NvZGU6IDAwOTg2MCAgICAgMjg4IGJ5dGVzICAic29hcF9zMmZsb2F0Ig0KK0NvZGU6IDAwOTk4MCAgICAgMjYyIGJ5dGVzICAic29hcF9pbmZsb2F0Ig0KK0NvZGU6IDAwOWE4NiAgICAgNTIyIGJ5dGVzICAic29hcF9zMlFOYW1lIg0KK0NvZGU6IDAwOWM5MCAgICAgMTc2IGJ5dGVzICAic29hcF9vdXRzdHJpbmciDQorQ29kZTogMDA5ZDQwICAgICAzMjAgYnl0ZXMgICJzb2FwX2luc3RyaW5nIg0KK0NvZGU6IDAwOWU4MCAgICAgMjI2IGJ5dGVzICAic29hcF9pbmxpdGVyYWwiDQorQ29kZTogMDA5ZjYyICAgICAxNjQgYnl0ZXMgICJzb2FwX3ZhbHVlIg0KK0NvZGU6IDAwYTAwNiAgICAgMTkyIGJ5dGVzICAic29hcF9nZXRsaW5lIg0KK0NvZGU6IDAwYTBjNiAgICAgNDAyIGJ5dGVzICAic29hcF9jb3VudF9hdHRhY2htZW50cyINCitDb2RlOiAwMGEyNTggICAgICA5NCBieXRlcyAgInNvYXBfcHV0ZGltZWZpZWxkIg0KK0NvZGU6IDAwYTJiNiAgICAgMzgyIGJ5dGVzICAic29hcF9wdXRkaW1laGRyIg0KK0NvZGU6IDAwYTQzNCAgICAgNjAyIGJ5dGVzICAic29hcF9wdXRkaW1lIg0KK0NvZGU6IDAwYTY4ZSAgICAgMTY2IGJ5dGVzICAic29hcF9nZXRkaW1lZmllbGQiDQorQ29kZTogMDBhNzM0ICAgICA0NzAgYnl0ZXMgICJzb2FwX2dldGRpbWVoZHIiDQorQ29kZTogMDBhOTBhICAgICA5NjggYnl0ZXMgICJzb2FwX2dldGRpbWUiDQorQ29kZTogMDBhY2QyICAgICA4OTYgYnl0ZXMgICJzb2FwX2dldG1pbWVoZHIiDQorQ29kZTogMDBiMDUyICAgICA1NzIgYnl0ZXMgICJzb2FwX2dldG1pbWUiDQorQ29kZTogMDBiMjhlICAgICAxMzYgYnl0ZXMgICJzb2FwX21hdGNoX2NpZCINCitDb2RlOiAwMGIzMTYgICAgIDEzMiBieXRlcyAgInNvYXBfcmVzb2x2ZV9hdHRhY2htZW50Ig0KK0NvZGU6IDAwYjM5YSAgICAgNTQ0IGJ5dGVzICAic29hcF9wdXRtaW1laGRyIg0KK0NvZGU6IDAwYjViYSAgICAgMTY4IGJ5dGVzICAic29hcF9wdXRtaW1lIg0KK0NvZGU6IDAwYjY2MiAgICAgIDMwIGJ5dGVzICAic29hcF9jbHJfbWltZSINCitDb2RlOiAwMGI2ODAgICAgIDExMiBieXRlcyAgInNvYXBfbmV3X211bHRpcGFydCINCitDb2RlOiAwMGI2ZjAgICAgIDE4NCBieXRlcyAgInNvYXBfc2V0X21pbWVfYXR0YWNobWVudCINCitDb2RlOiAwMGI3YTggICAgIDIzNCBieXRlcyAgInNvYXBfc2VsZWN0X21pbWVfYm91bmRhcnkiDQorQ29kZTogMDBiODkyICAgICAxMDggYnl0ZXMgICJzb2FwX3ZhbGlkX21pbWVfYm91bmRhcnkiDQorQ29kZTogMDBiOGZlICAgICA4MjIgYnl0ZXMgICJzb2FwX2JlZ2luX3JlY3YiDQorQ29kZTogMDBiYzM0ICAgICA3MzYgYnl0ZXMgICJodHRwX3BhcnNlIg0KK0NvZGU6IDAwYmYxNCAgICAxMTEwIGJ5dGVzICAiaHR0cF9wYXJzZV9oZWFkZXIiDQorQ29kZTogMDBjMzZhICAgICAxMzYgYnl0ZXMgICJzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlIg0KK0NvZGU6IDAwYzNmMiAgICAgIDQ2IGJ5dGVzICAic29hcF9kZWNvZGVfa2V5Ig0KK0NvZGU6IDAwYzQyMCAgICAgIDc0IGJ5dGVzICAic29hcF9kZWNvZGVfdmFsIg0KK0NvZGU6IDAwYzQ2YSAgICAgMjQ4IGJ5dGVzICAic29hcF9kZWNvZGUiDQorQ29kZTogMDBjNTYyICAgICA0NTggYnl0ZXMgICJzb2FwX2VudmVsb3BlX2JlZ2luX291dCINCitDb2RlOiAwMGM3MmMgICAgIDMzNCBieXRlcyAgInNvYXBfZW52ZWxvcGVfZW5kX291dCINCitDb2RlOiAwMGM4N2EgICAgIDI1MiBieXRlcyAgInNvYXBfZW52ZWxvcGVfYmVnaW5faW4iDQorQ29kZTogMDBjOTc2ICAgICAgNjIgYnl0ZXMgICJzb2FwX2VudmVsb3BlX2VuZF9pbiINCitDb2RlOiAwMGM5YjQgICAgIDExNiBieXRlcyAgInNvYXBfYm9keV9iZWdpbl9vdXQiDQorQ29kZTogMDBjYTI4ICAgICAgNTggYnl0ZXMgICJzb2FwX2JvZHlfZW5kX291dCINCitDb2RlOiAwMGNhNjIgICAgICA5MCBieXRlcyAgInNvYXBfYm9keV9iZWdpbl9pbiINCitDb2RlOiAwMGNhYmMgICAgICA3NCBieXRlcyAgInNvYXBfYm9keV9lbmRfaW4iDQorQ29kZTogMDBjYjA2ICAgICAgNTYgYnl0ZXMgICJzb2FwX3JlY3ZfaGVhZGVyIg0KK0NvZGU6IDAwY2IzZSAgICAgMjkyIGJ5dGVzICAic29hcF9zZXRfZW5kcG9pbnQiDQorQ29kZTogMDBjYzYyICAgICAgNDAgYnl0ZXMgICJzb2FwX2Nvbm5lY3QiDQorQ29kZTogMDBjYzhhICAgICA1MjIgYnl0ZXMgICJzb2FwX2Nvbm5lY3RfY29tbWFuZCINCitDb2RlOiAwMGNlOTQgICAgIDgwMCBieXRlcyAgInNvYXBfcHV0aHR0cGhkciINCitDb2RlOiAwMGQxYjQgICAgICAgNCBieXRlcyAgImh0dHBfZ2V0Ig0KK0NvZGU6IDAwZDFiOCAgICAgNzU0IGJ5dGVzICAiaHR0cF9wb3N0Ig0KK0NvZGU6IDAwZDRhYSAgICAgMTEwIGJ5dGVzICAiaHR0cF9zZW5kX2hlYWRlciINCitDb2RlOiAwMGQ1MTggICAgIDE3MiBieXRlcyAgImh0dHBfcG9zdF9oZWFkZXIiDQorQ29kZTogMDBkNWM0ICAgICA2MzggYnl0ZXMgICJodHRwX3Jlc3BvbnNlIg0KK0NvZGU6IDAwZDg0MiAgICAgMzAwIGJ5dGVzICAic29hcF9zZXRfZmF1bHQiDQorQ29kZTogMDBkOTZlICAgICA2MjggYnl0ZXMgICJzb2FwX3JlY3ZfZmF1bHQiDQorQ29kZTogMDBkYmUyICAgICAgODQgYnl0ZXMgICJzb2FwX3N0cmVycm9yIg0KK0NvZGU6IDAwZGMzNiAgICAgMTE2IGJ5dGVzICAic29hcF9zZXRfZXJyb3IiDQorQ29kZTogMDBkY2FhICAgICAgOTQgYnl0ZXMgICJzb2FwX3NldF9zZW5kZXJfZXJyb3IiDQorQ29kZTogMDBkZDA4ICAgICAgOTYgYnl0ZXMgICJzb2FwX3NldF9yZWNlaXZlcl9lcnJvciINCitDb2RlOiAwMGRkNjggICAgICA2NiBieXRlcyAgImZwbHVnaW4iDQorDQorRGF0YSBzZWN0aW9uIGJlbG93IEE1OiAgIDE0ODQgYnl0ZXMNCitEYXRhIHNlY3Rpb24gYWJvdmUgQTU6ICAgMjA4NCBieXRlcw0KKw0KK0luaXRpYWxpemVkIG5lYXIgZGF0YQ0KK0RhdGE6ICAgICAtNCAgICAgICA0IGJ5dGVzICAiQXBwTmV0VGltZW91dCINCitEYXRhOiAgICAtNjggICAgICA2NCBieXRlcyAgIm1pbWVfY29kZXMiDQorRGF0YTogICAgLTc2ICAgICAgIDggYnl0ZXMgICJAMTc2Ig0KK0RhdGE6ICAgIC04OCAgICAgIDExIGJ5dGVzICAiQDE3NSINCitEYXRhOiAgICAtOTYgICAgICAgNyBieXRlcyAgIkAxNzQiDQorRGF0YTogICAtMTE0ICAgICAgMTcgYnl0ZXMgICJAMTczIg0KK0RhdGE6ICAgLTEyMiAgICAgICA3IGJ5dGVzICAiQDE3MiINCitEYXRhOiAgIC0xMjggICAgICAgNSBieXRlcyAgIkAxNzEiDQorRGF0YTogICAtMTM0ICAgICAgIDUgYnl0ZXMgICJAMTcwIg0KK0RhdGE6ICAgLTIwMCAgICAgIDY1IGJ5dGVzICAic29hcF9iYXNlNjRvIg0KK0RhdGE6ICAgLTIzNiAgICAgIDM1IGJ5dGVzICAic29hcF9ycGMiDQorRGF0YTogICAtMjc2ICAgICAgNDAgYnl0ZXMgICJzb2FwX2VuYzIiDQorRGF0YTogICAtMzE2ICAgICAgNDAgYnl0ZXMgICJzb2FwX2VudjIiDQorRGF0YTogICAtMzU4ICAgICAgNDIgYnl0ZXMgICJzb2FwX2VuYzEiDQorRGF0YTogICAtNDAwICAgICAgNDIgYnl0ZXMgICJzb2FwX2VudjEiDQorRGF0YTogICAtNDAyICAgICAgIDIgYnl0ZXMgICJzZWVkJDI3MSINCitEYXRhOiAgIC00OTggICAgICA5NiBieXRlcyAgIm5hbWVzcGFjZXMiDQorRGF0YTogICAtNTI2ICAgICAgMjggYnl0ZXMgICJAMTgzIg0KK0RhdGE6ICAgLTUzMCAgICAgICAzIGJ5dGVzICAiQDE4MiINCitEYXRhOiAgIC01NjAgICAgICAzMCBieXRlcyAgIkAxODEiDQorRGF0YTogICAtNTk0ICAgICAgMzMgYnl0ZXMgICJAMTgwIg0KK0RhdGE6ICAgLTU5OCAgICAgICA0IGJ5dGVzICAiQDE3OSINCitEYXRhOiAgIC02MzggICAgICAzOSBieXRlcyAgIkAxNzgiDQorRGF0YTogICAtNjgwICAgICAgNDIgYnl0ZXMgICJAMTc3Ig0KK0RhdGE6ICAgLTY4NCAgICAgICA0IGJ5dGVzICAiQDE3NiINCitEYXRhOiAgIC03MTggICAgICAzNCBieXRlcyAgIkAxNzUiDQorRGF0YTogICAtNzYwICAgICAgNDIgYnl0ZXMgICJAMTc0Ig0KK0RhdGE6ICAgLTc3MCAgICAgICA5IGJ5dGVzICAiQDE3MyINCitEYXRhOiAgIC04MDQgICAgICAzNCBieXRlcyAgIkAxNzIiDQorRGF0YTogICAtODQ2ICAgICAgNDIgYnl0ZXMgICJAMTcxIg0KK0RhdGE6ICAgLTg1NiAgICAgICA5IGJ5dGVzICAiQDE3MCINCisNCitVbmluaXRpYWxpemVkIG5lYXIgZGF0YQ0KK0RhdGE6ICAtMTQyNCAgICAgNTY4IGJ5dGVzICAiQXBwSG9zdEluZm8iDQorRGF0YTogIC0xNDI2ICAgICAgIDIgYnl0ZXMgICJoX2Vycm5vIg0KK0RhdGE6ICAtMTQyOCAgICAgICAyIGJ5dGVzICAiQXBwTmV0UmVmbnVtIg0KK0RhdGE6ICAtMTQzMiAgICAgICA0IGJ5dGVzICAiX19DV19GRUFUVVJFU19QVFIiDQorRGF0YTogIC0xNDM2ICAgICAgIDQgYnl0ZXMgICJfX2dsb2JhbF9kZXN0cnVjdG9yX2NoYWluIg0KK0RhdGE6ICAtMTQzOCAgICAgICAyIGJ5dGVzICAiZXJybm8iDQorRGF0YTogIC0xNDQyICAgICAgIDMgYnl0ZXMgICJzb2FwX3BhZGRpbmciDQorRGF0YTogIC0xNDgyICAgICAgNDAgYnl0ZXMgICJzdHIkMTkwIg0KK0RhdGE6ICAtMTQ4NCAgICAgICAyIGJ5dGVzICAiQXBwTmV0T3BlbkNvdW50Ig0KKw0KK0luaXRpYWxpemVkIGZhciBkYXRhDQorRGF0YTogICAgIDUyICAgIDIwMzIgYnl0ZXMgICJfX3NlZ3RhYmxlX18iDQorRGF0YTogICAgIDQwICAgICAgIDYgYnl0ZXMgICJAZXhjZXB0aW9uaW5mb0AiDQorRGF0YTogICAgIDQ2ICAgICAgIDYgYnl0ZXMgICJAZXhjZXB0aW9uaW5mb0AiDQpkaWZmIC0tZ2l0IGEvZ3NvYXAtcGFsbS9zdG9ja3F1b3RlL29iai9zdG9ja1F1b3RlRC5wcmMgYi9nc29hcC1wYWxtL3N0b2NrcXVvdGUvb2JqL3N0b2NrUXVvdGVELnByYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmYzMDAxCi0tLSAvZGV2L251bGwKKysrIGIvZ3NvYXAtcGFsbS9zdG9ja3F1b3RlL29iai9zdG9ja1F1b3RlRC5wcmMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3NvYXAtcGFsbS9zdG9ja3F1b3RlL29iai9zdG9ja1F1b3RlRC5wcmMucHN5bSBiL2dzb2FwLXBhbG0vc3RvY2txdW90ZS9vYmovc3RvY2tRdW90ZUQucHJjLnBzeW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkxMWEyNQotLS0gL2Rldi9udWxsCisrKyBiL2dzb2FwLXBhbG0vc3RvY2txdW90ZS9vYmovc3RvY2tRdW90ZUQucHJjLnBzeW0KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3NvYXAtcGFsbS9zdG9ja3F1b3RlL29iai9zdG9ja1F1b3RlRC50bXAgYi9nc29hcC1wYWxtL3N0b2NrcXVvdGUvb2JqL3N0b2NrUXVvdGVELnRtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3NvYXAtcGFsbS9zdG9ja3F1b3RlL29iai9zdG9ja1F1b3RlRC50bXAKZGlmZiAtLWdpdCBhL2dzb2FwLXBhbG0vc3RvY2txdW90ZS9vYmovc3RvY2tRdW90ZUQudG1wLk1BUCBiL2dzb2FwLXBhbG0vc3RvY2txdW90ZS9vYmovc3RvY2tRdW90ZUQudG1wLk1BUApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDQ5MDY5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3NvYXAtcGFsbS9zdG9ja3F1b3RlL29iai9zdG9ja1F1b3RlRC50bXAuTUFQCkBAIC0wLDAgKzEsMzYxIEBACitGaWxlOiAgICAxCSJfX1J1bnRpbWVNb2R1bGVfXyINCitGaWxlOiAgICAyCSJDOlxQcm9ncmFtIEZpbGVzXE1ldHJvd2Vya3NcQ29kZVdhcnJpb3JcUGFsbSBPUyBTdXBwb3J0XENvZGVXYXJyaW9yIExpYnJhcmllc1xSdW50aW1lXFBhbG1PU1J1bnRpbWVfMmlfQTUubGliIg0KK0ZpbGU6ICAgIDMJIkNQbHVzTGliNjhLLmNwIg0KK0ZpbGU6ICAgIDQJIkV4Y2VwdGlvbjY4Sy5jcCINCitGaWxlOiAgICA1CSJMb25nTG9uZzY4Sy5jIg0KK0ZpbGU6ICAgIDYJIk1XUlRUSS5jcCINCitGaWxlOiAgICA3CSJOTVdFeGNlcHRpb24uY3AiDQorRmlsZTogICAgOAkiTmV3TW9yZS5jcCINCitGaWxlOiAgICA5CSJOZXcuY3AiDQorRmlsZTogICAxMAkiUGFsbU9TX0Fib3J0RXhpdC5jcHAiDQorRmlsZTogICAxMQkiUGFsbU9TX0dsb2JhbERlc3RydWN0b3JzLmMiDQorRmlsZTogICAxMgkiUGFsbU9TX3NldGptcC5jIg0KK0ZpbGU6ICAgMTMJIlBhbG1PU19TdGFydHVwLmNwcCINCitGaWxlOiAgIDE0CSJDV1J1bnRpbWUuYyINCitGaWxlOiAgIDE1CSJDOlxEb2N1bWVudHMgYW5kIFNldHRpbmdzXGVuZ2VsZW5cRGVza3RvcFxnU09BUCBQYWxtXGdzb2FwX2NoYW5nZXMgRm9sZGVyXGdzb2FwLXBhbG1cc3RvY2txdW90ZVxzcmNcc3RvY2txdW90ZS5jIg0KK0ZpbGU6ICAgMTYJIkM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcZW5nZWxlblxEZXNrdG9wXGdTT0FQIFBhbG1cZ3NvYXBfY2hhbmdlcyBGb2xkZXJcZ3NvYXAtcGFsbVxzdG9ja3F1b3RlXHNyY1xRdW90ZVN0YXJ0ZXIuYyINCitGaWxlOiAgIDE3CSJJOlxtYWluXGxpYnJhcmllc1xuZXRcbmV0c29ja2V0XFNyY1xOZXRTb2NrZXQuYyINCitGaWxlOiAgIDE4CSJDOlxQcm9ncmFtIEZpbGVzXE1ldHJvd2Vya3NcQ29kZVdhcnJpb3JcUGFsbSBPUyBTdXBwb3J0XENvZGVXYXJyaW9yIExpYnJhcmllc1xQYWxtIE9TIEdsdWVcUGFsbU9TR2x1ZS5saWIiDQorRmlsZTogICAxOQkiSTpcbWFpblxsaWJyYXJpZXNcUGFsbU9TR2x1ZVxTcmNcSW50bEdsdWUuY3AiDQorRmlsZTogICAyMAkiSTpcbWFpblxsaWJyYXJpZXNcUGFsbU9TR2x1ZVxTcmNcVGV4dE1nci5jIg0KK0ZpbGU6ICAgMjEJIkk6XG1haW5cbGlicmFyaWVzXFBhbG1PU0dsdWVcU3JjXFR4dEdsdWUuY3AiDQorRmlsZTogICAyMgkiSTpcbWFpblxsaWJyYXJpZXNcUGFsbU9TR2x1ZVxTcmNcVHNtR2x1ZS5jcCINCitGaWxlOiAgIDIzCSJJOlxtYWluXGxpYnJhcmllc1xQYWxtT1NHbHVlXFNyY1xXaW5HbHVlLmNwIg0KK0ZpbGU6ICAgMjQJIkk6XG1haW5cbGlicmFyaWVzXFBhbG1PU0dsdWVcU3JjXEZudEdsdWUuY3AiDQorRmlsZTogICAyNQkiSTpcbWFpblxsaWJyYXJpZXNcUGFsbU9TR2x1ZVxTcmNcRGF0ZUdsdWUuY3AiDQorRmlsZTogICAyNgkiSTpcbWFpblxsaWJyYXJpZXNcUGFsbU9TR2x1ZVxTcmNcU3lzR2x1ZS5jcCINCitGaWxlOiAgIDI3CSJJOlxtYWluXGxpYnJhcmllc1xQYWxtT1NHbHVlXFNyY1xPbUdsdWUuY3AiDQorRmlsZTogICAyOAkiSTpcbWFpblxsaWJyYXJpZXNcUGFsbU9TR2x1ZVxTcmNcUmVzR2x1ZS5jcCINCitGaWxlOiAgIDI5CSJJOlxtYWluXGxpYnJhcmllc1xQYWxtT1NHbHVlXFNyY1xMbUdsdWUuY3AiDQorRmlsZTogICAzMAkiSTpcbWFpblxsaWJyYXJpZXNcUGFsbU9TR2x1ZVxTcmNcRnJtR2x1ZS5jcHAiDQorRmlsZTogICAzMQkiSTpcbWFpblxsaWJyYXJpZXNcUGFsbU9TR2x1ZVxTcmNcQWNjZXNzb3JHbHVlLmNwIg0KK0ZpbGU6ICAgMzIJIkk6XG1haW5cbGlicmFyaWVzXFBhbG1PU0dsdWVcU3JjXE1lbUdsdWUuY3AiDQorRmlsZTogICAzMwkiSTpcbWFpblxsaWJyYXJpZXNcUGFsbU9TR2x1ZVxTcmNcQm1wR2x1ZS5jcCINCitGaWxlOiAgIDM0CSJJOlxtYWluXGxpYnJhcmllc1xQYWxtT1NHbHVlXFNyY1xUYmxHbHVlLmNwIg0KK0ZpbGU6ICAgMzUJIkk6XG1haW5cbGlicmFyaWVzXFBhbG1PU0dsdWVcU3JjXFVJQ29sb3JHbHVlLmNwIg0KK0ZpbGU6ICAgMzYJIkM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcZW5nZWxlblxEZXNrdG9wXGdTT0FQIFBhbG1cZ3NvYXBfY2hhbmdlcyBGb2xkZXJcZ3NvYXAtcGFsbVxzdG9ja3F1b3RlXHNyY1xzb2FwQy5jIg0KK0ZpbGU6ICAgMzcJIkM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcZW5nZWxlblxEZXNrdG9wXGdTT0FQIFBhbG1cZ3NvYXBfY2hhbmdlcyBGb2xkZXJcZ3NvYXAtcGFsbVxzdG9ja3F1b3RlXHNyY1xzb2FwQ2xpZW50LmMiDQorRmlsZTogICAzOAkiQzpcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1xlbmdlbGVuXERlc2t0b3BcZ1NPQVAgUGFsbVxnc29hcF9jaGFuZ2VzIEZvbGRlclxnc29hcC1wYWxtXHBhbG1GdW5jdGlvbnMuYyINCitGaWxlOiAgIDM5CSJDOlxEb2N1bWVudHMgYW5kIFNldHRpbmdzXGVuZ2VsZW5cRGVza3RvcFxnU09BUCBQYWxtXGdzb2FwX2NoYW5nZXMgRm9sZGVyXGdzb2FwLXBhbG1cc3Rkc29hcDIuYyINCisNCitTZWdtZW50OiAgIDEgICA2MjI0MCBieXRlcyAgIlNlZ21lbnRfMSINCitDb2RlOiAwMDAwMDQgICAgICAxMiBieXRlcyAgIl9fRHVtbXlTdGFydHVwX18iICAgICAgICAgICAgICAgRmlsZTogIl9fUnVudGltZU1vZHVsZV9fIg0KK0NvZGU6IDAwMDAxMCAgICAgIDEyIGJ5dGVzICAiX19kdGhhbmRsZXJfXzRNVFdLRnYiICAgICAgICAgICBGaWxlOiAiTk1XRXhjZXB0aW9uLmNwIg0KK0NvZGU6IDAwMDAxYyAgICAgIDEyIGJ5dGVzICAiX19kdWhhbmRsZXJfXzRNVFdLRnYiDQorQ29kZTogMDAwMDI4ICAgICAgMTYgYnl0ZXMgICJ0ZXJtaW5hdGVfXzNzdGRGdiINCitDb2RlOiAwMDAwMzggICAgICAyNCBieXRlcyAgImFib3J0IiAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZTogIlBhbG1PU19BYm9ydEV4aXQuY3BwIg0KK0NvZGU6IDAwMDA1MCAgICAgIDQyIGJ5dGVzICAiX19kZXN0cm95X2dsb2JhbF9jaGFpbiIgICAgICAgICBGaWxlOiAiUGFsbU9TX0dsb2JhbERlc3RydWN0b3JzLmMiDQorQ29kZTogMDAwMDdhICAgICAgMTQgYnl0ZXMgICJzZXRqbXAiICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGU6ICJQYWxtT1Nfc2V0am1wLmMiDQorQ29kZTogMDAwMDg4ICAgICAgMTggYnl0ZXMgICJsb25nam1wIg0KK0NvZGU6IDAwMDA5YSAgICAgMTU0IGJ5dGVzICAiX19SZWxvY2F0ZV9fX180TVRXS0ZQU2NQU2NVbCIgICBGaWxlOiAiUGFsbU9TX1N0YXJ0dXAuY3BwIg0KK0NvZGU6IDAwMDEzNCAgICAgMzE0IGJ5dGVzICAiX19TdGFydHVwX18iDQorQ29kZTogMDAwMjZlICAgICAgIDggYnl0ZXMgICJfX1ByZUluaXRfXyINCitDb2RlOiAwMDAyNzYgICAgICAgOCBieXRlcyAgIl9fSW5pdENvZGVfXyINCitDb2RlOiAwMDAyN2UgICAgIDEzMiBieXRlcyAgIl9fU2tpcFRvWFJFRnNfX19fNE1UV0tGUFNjIg0KK0NvZGU6IDAwMDMwMiAgICAgMTI4IGJ5dGVzICAiX19QYXRjaFYxMERldmljZXNfX19fNE1UV0tGUDE0U3lzQXBwSW5mb1R5cGUiDQorQ29kZTogMDAwMzgyICAgICAyMzQgYnl0ZXMgICJfX0xvYWRBbmRSZWxvY2F0ZV9fX180TVRXS0ZVY1A3X29wYXF1ZSINCitDb2RlOiAwMDA0NmMgICAgICAzMiBieXRlcyAgIl9fbG11bF9fIiAgICAgICAgICAgICAgICAgICAgICAgRmlsZTogIkNXUnVudGltZS5jIg0KK0NvZGU6IDAwMDQ4YyAgICAgIDc2IGJ5dGVzICAiX19sZGl2dV9fIg0KK0NvZGU6IDAwMDRkOCAgICAgIDM0IGJ5dGVzICAiX19sZGl2X18iDQorQ29kZTogMDAwNGZhICAgICAgNzIgYnl0ZXMgICJfX2xtb2R1X18iDQorQ29kZTogMDAwNTQyICAgICAgMjQgYnl0ZXMgICJfX2xtb2RfXyINCitDb2RlOiAwMDA1NWEgICAgIDI1NiBieXRlcyAgImdldFF1b3RlIiAgICAgICAgICAgICAgICAgICAgICAgRmlsZTogIkM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcZW5nZWxlblxEZXNrdG9wXGdTT0FQIFBhbG1cZ3NvYXBfY2hhbmdlcyBGb2xkZXJcZ3NvYXAtcGFsbVxzdG9ja3F1b3RlXHNyY1xzdG9ja3F1b3RlLmMiDQorQ29kZTogMDAwNjVhICAgICAgODQgYnl0ZXMgICJTdGRFdG9BIg0KK0NvZGU6IDAwMDZhZSAgICAgMzEyIGJ5dGVzICAiUm9tVmVyc2lvbkNvbXBhdGlibGUiICAgICAgICAgICBGaWxlOiAiQzpcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1xlbmdlbGVuXERlc2t0b3BcZ1NPQVAgUGFsbVxnc29hcF9jaGFuZ2VzIEZvbGRlclxnc29hcC1wYWxtXHN0b2NrcXVvdGVcc3JjXFF1b3RlU3RhcnRlci5jIg0KK0NvZGU6IDAwMDdlNiAgICAgIDU2IGJ5dGVzICAiR2V0T2JqZWN0UHRyIg0KK0NvZGU6IDAwMDgxZSAgICAgMTA2IGJ5dGVzICAiTWFpbkZvcm1Jbml0Ig0KK0NvZGU6IDAwMDg4OCAgICAgIDg2IGJ5dGVzICAiTWFpbkZvcm1Eb0NvbW1hbmQiDQorQ29kZTogMDAwOGRlICAgICAyMzIgYnl0ZXMgICJNYWluRm9ybUhhbmRsZUV2ZW50Ig0KK0NvZGU6IDAwMDljNiAgICAgIDk4IGJ5dGVzICAiQXBwSGFuZGxlRXZlbnQiDQorQ29kZTogMDAwYTI4ICAgICAxMTggYnl0ZXMgICJBcHBFdmVudExvb3AiDQorQ29kZTogMDAwYTllICAgICAgNTIgYnl0ZXMgICJBcHBTdGFydCINCitDb2RlOiAwMDBhZDIgICAgICA0OCBieXRlcyAgIkFwcFN0b3AiDQorQ29kZTogMDAwYjAyICAgICAxNDYgYnl0ZXMgICJTdGFydGVyUGFsbU1haW4iDQorQ29kZTogMDAwYjk0ICAgICAgNTggYnl0ZXMgICJQaWxvdE1haW4iDQorQ29kZTogMDAwYmNlICAgICAgNTQgYnl0ZXMgICJOZXRVSW5pdCIgICAgICAgICAgICAgICAgICAgICAgIEZpbGU6ICJJOlxtYWluXGxpYnJhcmllc1xuZXRcbmV0c29ja2V0XFNyY1xOZXRTb2NrZXQuYyINCitDb2RlOiAwMDBjMDQgICAgICA3MCBieXRlcyAgInNvYXBfc2VyaWFsaXplaGVhZGVyIiAgICAgICAgICAgRmlsZTogIkM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcZW5nZWxlblxEZXNrdG9wXGdTT0FQIFBhbG1cZ3NvYXBfY2hhbmdlcyBGb2xkZXJcZ3NvYXAtcGFsbVxzdG9ja3F1b3RlXHNyY1xzb2FwQy5jIg0KK0NvZGU6IDAwMGM0YSAgICAgMTA4IGJ5dGVzICAic29hcF9wdXRoZWFkZXIiDQorQ29kZTogMDAwY2I2ICAgICAxMTIgYnl0ZXMgICJzb2FwX2dldGhlYWRlciINCitDb2RlOiAwMDBkMjYgICAgIDE2NCBieXRlcyAgInNvYXBfZmF1bHQiDQorQ29kZTogMDAwZGNhICAgICAgOTIgYnl0ZXMgICJzb2FwX2dldGZhdWx0Ig0KK0NvZGU6IDAwMGUyNiAgICAgIDc0IGJ5dGVzICAic29hcF9mYXVsdGNvZGUiDQorQ29kZTogMDAwZTcwICAgICAgNzggYnl0ZXMgICJzb2FwX2ZhdWx0c3RyaW5nIg0KK0NvZGU6IDAwMGViZSAgICAgMjI0IGJ5dGVzICAic29hcF9mYXVsdGRldGFpbCINCitDb2RlOiAwMDBmOWUgICAgIDEyMCBieXRlcyAgInNvYXBfZ2V0aW5kZXBlbmRlbnQiDQorQ29kZTogMDAxMDE2ICAgIDEyODIgYnl0ZXMgICJzb2FwX2dldGVsZW1lbnQiDQorQ29kZTogMDAxNTE4ICAgICAzMTQgYnl0ZXMgICJzb2FwX2lnbm9yZV9lbGVtZW50Ig0KK0NvZGU6IDAwMTY1MiAgICAgMTcyIGJ5dGVzICAic29hcF9wdXRpbmRlcGVuZGVudCINCitDb2RlOiAwMDE2ZmUgICAgIDQ5NCBieXRlcyAgInNvYXBfcHV0ZWxlbWVudCINCitDb2RlOiAwMDE4ZWMgICAgIDI3NCBieXRlcyAgInNvYXBfcmVzb2x2ZV9hdHRhY2htZW50cyINCitDb2RlOiAwMDE5ZmUgICAgICA2NCBieXRlcyAgInNvYXBfb3V0X2J5dGUiDQorQ29kZTogMDAxYTNlICAgICAgNjAgYnl0ZXMgICJzb2FwX2luX2J5dGUiDQorQ29kZTogMDAxYTdhICAgICAgNjQgYnl0ZXMgICJzb2FwX291dF9pbnQiDQorQ29kZTogMDAxYWJhICAgICAgNTggYnl0ZXMgICJzb2FwX2luX2ludCINCitDb2RlOiAwMDFhZjQgICAgICAzNiBieXRlcyAgInNvYXBfZGVmYXVsdF9mbG9hdCINCitDb2RlOiAwMDFiMTggICAgICA2NiBieXRlcyAgInNvYXBfb3V0X2Zsb2F0Ig0KK0NvZGU6IDAwMWI1YSAgICAgIDYwIGJ5dGVzICAic29hcF9pbl9mbG9hdCINCitDb2RlOiAwMDFiOTYgICAgICA3MCBieXRlcyAgInNvYXBfZGVmYXVsdF9TT0FQX0VOVl9fRmF1bHQiDQorQ29kZTogMDAxYmRjICAgICAxMDggYnl0ZXMgICJzb2FwX2dldF9TT0FQX0VOVl9fRmF1bHQiDQorQ29kZTogMDAxYzQ4ICAgICA5NjIgYnl0ZXMgICJzb2FwX2luX1NPQVBfRU5WX19GYXVsdCINCitDb2RlOiAwMDIwMGEgICAgICA1NCBieXRlcyAgInNvYXBfZGVmYXVsdF9TT0FQX0VOVl9fRGV0YWlsIg0KK0NvZGU6IDAwMjA0MCAgICAgNTI2IGJ5dGVzICAic29hcF9pbl9TT0FQX0VOVl9fRGV0YWlsIg0KK0NvZGU6IDAwMjI0ZSAgICAgIDUyIGJ5dGVzICAic29hcF9kZWZhdWx0X1NPQVBfRU5WX19Db2RlIg0KK0NvZGU6IDAwMjI4MiAgICAgNjQ2IGJ5dGVzICAic29hcF9pbl9TT0FQX0VOVl9fQ29kZSINCitDb2RlOiAwMDI1MDggICAgICA2NiBieXRlcyAgInNvYXBfc2VyaWFsaXplX1NPQVBfRU5WX19IZWFkZXIiDQorQ29kZTogMDAyNTRhICAgICAgMzggYnl0ZXMgICJzb2FwX21hcmtfU09BUF9FTlZfX0hlYWRlciINCitDb2RlOiAwMDI1NzAgICAgICA0MCBieXRlcyAgInNvYXBfZGVmYXVsdF9TT0FQX0VOVl9fSGVhZGVyIg0KK0NvZGU6IDAwMjU5OCAgICAgMTM0IGJ5dGVzICAic29hcF9vdXRfU09BUF9FTlZfX0hlYWRlciINCitDb2RlOiAwMDI2MWUgICAgIDQxMiBieXRlcyAgInNvYXBfaW5fU09BUF9FTlZfX0hlYWRlciINCitDb2RlOiAwMDI3YmEgICAgICA2MiBieXRlcyAgInNvYXBfc2VyaWFsaXplX25zX19nZXRRdW90ZSINCitDb2RlOiAwMDI3ZjggICAgICA4NiBieXRlcyAgInNvYXBfbWFya19uc19fZ2V0UXVvdGUiDQorQ29kZTogMDAyODRlICAgICAgNDIgYnl0ZXMgICJzb2FwX2RlZmF1bHRfbnNfX2dldFF1b3RlIg0KK0NvZGU6IDAwMjg3OCAgICAgMTQ4IGJ5dGVzICAic29hcF9wdXRfbnNfX2dldFF1b3RlIg0KK0NvZGU6IDAwMjkwYyAgICAgMTc4IGJ5dGVzICAic29hcF9vdXRfbnNfX2dldFF1b3RlIg0KK0NvZGU6IDAwMjliZSAgICAgNDgwIGJ5dGVzICAic29hcF9pbl9uc19fZ2V0UXVvdGUiDQorQ29kZTogMDAyYjllICAgICAgNTIgYnl0ZXMgICJzb2FwX2RlZmF1bHRfbnNfX2dldFF1b3RlUmVzcG9uc2UiDQorQ29kZTogMDAyYmQyICAgICAyMzIgYnl0ZXMgICJzb2FwX291dF9uc19fZ2V0UXVvdGVSZXNwb25zZSINCitDb2RlOiAwMDJjYmEgICAgIDExMiBieXRlcyAgInNvYXBfZ2V0X25zX19nZXRRdW90ZVJlc3BvbnNlIg0KK0NvZGU6IDAwMmQyYSAgICAgNDg4IGJ5dGVzICAic29hcF9pbl9uc19fZ2V0UXVvdGVSZXNwb25zZSINCitDb2RlOiAwMDJmMTIgICAgIDI5MiBieXRlcyAgInNvYXBfaW5fUG9pbnRlclRvU09BUF9FTlZfX0NvZGUiDQorQ29kZTogMDAzMDM2ICAgICAyOTYgYnl0ZXMgICJzb2FwX2luX1BvaW50ZXJUb1NPQVBfRU5WX19EZXRhaWwiDQorQ29kZTogMDAzMTVlICAgICAxNDIgYnl0ZXMgICJzb2FwX291dF9Qb2ludGVyVG9mbG9hdCINCitDb2RlOiAwMDMxZWMgICAgIDI4NCBieXRlcyAgInNvYXBfaW5fUG9pbnRlclRvZmxvYXQiDQorQ29kZTogMDAzMzA4ICAgICAgNzAgYnl0ZXMgICJzb2FwX2luX19RTmFtZSINCitDb2RlOiAwMDMzNGUgICAgICA1OCBieXRlcyAgInNvYXBfbWFya19zdHJpbmciDQorQ29kZTogMDAzMzg4ICAgICAgNjYgYnl0ZXMgICJzb2FwX291dF9zdHJpbmciDQorQ29kZTogMDAzM2NhICAgICAgNzAgYnl0ZXMgICJzb2FwX2luX3N0cmluZyINCitDb2RlOiAwMDM0MTAgICAgMTAzMiBieXRlcyAgInNvYXBfY2FsbF9uc19fZ2V0UXVvdGUiICAgICAgICAgRmlsZTogIkM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcZW5nZWxlblxEZXNrdG9wXGdTT0FQIFBhbG1cZ3NvYXBfY2hhbmdlcyBGb2xkZXJcZ3NvYXAtcGFsbVxzdG9ja3F1b3RlXHNyY1xzb2FwQ2xpZW50LmMiDQorQ29kZTogMDAzODE4ICAgICAgNDQgYnl0ZXMgICJQYWxtU3RyZXJyb3IiICAgICAgICAgICAgICAgICAgIEZpbGU6ICJDOlxEb2N1bWVudHMgYW5kIFNldHRpbmdzXGVuZ2VsZW5cRGVza3RvcFxnU09BUCBQYWxtXGdzb2FwX2NoYW5nZXMgRm9sZGVyXGdzb2FwLXBhbG1ccGFsbUZ1bmN0aW9ucy5jIg0KK0NvZGU6IDAwMzg0NCAgICAgMTI0IGJ5dGVzICAic3RydG9kIg0KK0NvZGU6IDAwMzhjMCAgICAgIDc4IGJ5dGVzICAic3NjYW5mIg0KK0NvZGU6IDAwMzkwZSAgICAgMTg0IGJ5dGVzICAicGFsbVNwcmludGYiDQorQ29kZTogMDAzOWM2ICAgICAgOTYgYnl0ZXMgICJwYWxtTmV0TGliT3BlbiINCitDb2RlOiAwMDNhMjYgICAgICA1OCBieXRlcyAgInBhbG1OZXRMaWJDbG9zZSINCitDb2RlOiAwMDNhNjAgICAgIDEzOCBieXRlcyAgInBhbG1SYW5kIg0KK0NvZGU6IDAwM2FlYSAgICAgMjE0IGJ5dGVzICAiZnNlbmQiICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlOiAiQzpcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1xlbmdlbGVuXERlc2t0b3BcZ1NPQVAgUGFsbVxnc29hcF9jaGFuZ2VzIEZvbGRlclxnc29hcC1wYWxtXHN0ZHNvYXAyLmMiDQorQ29kZTogMDAzYmMwICAgICAyNzYgYnl0ZXMgICJzb2FwX2ZsdXNoX3JhdyINCitDb2RlOiAwMDNjZDQgICAgICA4MiBieXRlcyAgInNvYXBfZmx1c2giDQorQ29kZTogMDAzZDI2ICAgICAzMzAgYnl0ZXMgICJzb2FwX3NlbmRfcmF3Ig0KK0NvZGU6IDAwM2U3MCAgICAgIDc2IGJ5dGVzICAic29hcF9zZW5kIg0KK0NvZGU6IDAwM2ViYyAgICAgIDg4IGJ5dGVzICAic29hcF9zZW5kMiINCitDb2RlOiAwMDNmMTQgICAgIDExNiBieXRlcyAgInNvYXBfc2VuZDMiDQorQ29kZTogMDAzZjg4ICAgICAxNzQgYnl0ZXMgICJmcmVjdiINCitDb2RlOiAwMDQwMzYgICAgIDEzMCBieXRlcyAgInNvYXBfZ2V0Y2h1bmtjaGFyIg0KK0NvZGU6IDAwNDBiOCAgICAgIDY0IGJ5dGVzICAic29hcF9pc3hkaWdpdCINCitDb2RlOiAwMDQwZjggICAgIDU5NiBieXRlcyAgInNvYXBfcmVjdl9yYXciDQorQ29kZTogMDA0MzRjICAgICA0NjQgYnl0ZXMgICJzb2FwX3JlY3YiDQorQ29kZTogMDA0NTFjICAgICAxMjQgYnl0ZXMgICJzb2FwX2dldGNoYXIiDQorQ29kZTogMDA0NTk4ICAgICAgODAgYnl0ZXMgICJzb2FwX2ludF9jb2RlIg0KK0NvZGU6IDAwNDVlOCAgICAgIDUwIGJ5dGVzICAic29hcF9zdHJfY29kZSINCitDb2RlOiAwMDQ2MWEgICAgIDM1MiBieXRlcyAgInNvYXBfY2hhciINCitDb2RlOiAwMDQ3N2EgICAgMTQwOCBieXRlcyAgInNvYXBfZ2V0Ig0KK0NvZGU6IDAwNGNmYSAgICAgIDY2IGJ5dGVzICAic29hcF9tb3ZlIg0KK0NvZGU6IDAwNGQzYyAgICAgIDU0IGJ5dGVzICAic29hcF90ZWxsIg0KK0NvZGU6IDAwNGQ3MiAgICAgMTQ0IGJ5dGVzICAic29hcF9wdXR1dGY4Ig0KK0NvZGU6IDAwNGUwMiAgICAgNjYyIGJ5dGVzICAic29hcF9nZXR1dGY4Ig0KK0NvZGU6IDAwNTA5OCAgICAgIDk2IGJ5dGVzICAic29hcF9zdHJkdXAiDQorQ29kZTogMDA1MGY4ICAgICAgNzYgYnl0ZXMgICJzb2FwX25ld19ibG9jayINCitDb2RlOiAwMDUxNDQgICAgIDEwMiBieXRlcyAgInNvYXBfcHVzaF9ibG9jayINCitDb2RlOiAwMDUxYWEgICAgIDIzMCBieXRlcyAgInNvYXBfdXBkYXRlX3B0cnMiDQorQ29kZTogMDA1MjkwICAgICAxMzQgYnl0ZXMgICJzb2FwX2hhc19jb3BpZXMiDQorQ29kZTogMDA1MzE2ICAgICA0OTYgYnl0ZXMgICJzb2FwX3Jlc29sdmUiDQorQ29kZTogMDA1NTA2ICAgICAgODYgYnl0ZXMgICJzb2FwX3NpemVfYmxvY2siDQorQ29kZTogMDA1NTVjICAgICAgODYgYnl0ZXMgICJzb2FwX2ZpcnN0X2Jsb2NrIg0KK0NvZGU6IDAwNTViMiAgICAgIDkwIGJ5dGVzICAic29hcF9uZXh0X2Jsb2NrIg0KK0NvZGU6IDAwNTYwYyAgICAgIDQyIGJ5dGVzICAic29hcF9ibG9ja19zaXplIg0KK0NvZGU6IDAwNTYzNiAgICAgIDg0IGJ5dGVzICAic29hcF9lbmRfYmxvY2siDQorQ29kZTogMDA1NjhhICAgICAyNjYgYnl0ZXMgICJzb2FwX3NhdmVfYmxvY2siDQorQ29kZTogMDA1Nzk0ICAgICAxMzQgYnl0ZXMgICJzb2FwX2dldHBvc2l0aW9uIg0KK0NvZGU6IDAwNTgxYSAgICAgMzc4IGJ5dGVzICAic29hcF9wdXNoX25hbWVzcGFjZSINCitDb2RlOiAwMDU5OTQgICAgIDEwOCBieXRlcyAgInNvYXBfcG9wX25hbWVzcGFjZSINCitDb2RlOiAwMDVhMDAgICAgIDI1MCBieXRlcyAgInNvYXBfbWF0Y2hfbmFtZXNwYWNlIg0KK0NvZGU6IDAwNWFmYSAgICAgMjUyIGJ5dGVzICAic29hcF90YWdfY21wIg0KK0NvZGU6IDAwNWJmNiAgICAgMzAyIGJ5dGVzICAic29hcF9tYXRjaF90YWciDQorQ29kZTogMDA1ZDI0ICAgICAgMzIgYnl0ZXMgICJ0Y3BfaW5pdCINCitDb2RlOiAwMDVkNDQgICAgIDE1MiBieXRlcyAgInRjcF9lcnJvciINCitDb2RlOiAwMDVkZGMgICAgICA5MCBieXRlcyAgImh0dHBfZXJyb3IiDQorQ29kZTogMDA1ZTM2ICAgICAxODQgYnl0ZXMgICJ0Y3BfZ2V0aG9zdCINCitDb2RlOiAwMDVlZWUgICAgIDgyNiBieXRlcyAgInRjcF9jb25uZWN0Ig0KK0NvZGU6IDAwNjIyOCAgICAgIDIyIGJ5dGVzICAic29hcF9wb2xsIg0KK0NvZGU6IDAwNjIzZSAgICAgIDYyIGJ5dGVzICAidGNwX2FjY2VwdCINCitDb2RlOiAwMDYyN2MgICAgICA4MCBieXRlcyAgInRjcF9kaXNjb25uZWN0Ig0KK0NvZGU6IDAwNjJjYyAgICAgIDQ2IGJ5dGVzICAidGNwX2Nsb3Nlc29ja2V0Ig0KK0NvZGU6IDAwNjJmYSAgICAgIDU0IGJ5dGVzICAidGNwX3NodXRkb3duc29ja2V0Ig0KK0NvZGU6IDAwNjMzMCAgICAgMTAwIGJ5dGVzICAic29hcF9jbG9zZXNvY2siDQorQ29kZTogMDA2Mzk0ICAgICAgOTggYnl0ZXMgICJzb2FwX2hhc2giDQorQ29kZTogMDA2M2Y2ICAgICAgNTQgYnl0ZXMgICJzb2FwX2luaXRfcGh0Ig0KK0NvZGU6IDAwNjQyYyAgICAgIDYyIGJ5dGVzICAic29hcF9uZXciDQorQ29kZTogMDA2NDZhICAgICAgOTQgYnl0ZXMgICJzb2FwX2ZyZWVfcGh0Ig0KK0NvZGU6IDAwNjRjOCAgICAgMjI0IGJ5dGVzICAic29hcF9lbWJlZCINCitDb2RlOiAwMDY1YTggICAgIDEwOCBieXRlcyAgInNvYXBfcG9pbnRlcl9sb29rdXAiDQorQ29kZTogMDA2NjE0ICAgICAxNjIgYnl0ZXMgICJzb2FwX3BvaW50ZXJfZW50ZXIiDQorQ29kZTogMDA2NmI2ICAgICAxNzYgYnl0ZXMgICJzb2FwX2FycmF5X3BvaW50ZXJfbG9va3VwIg0KK0NvZGU6IDAwNjc2NiAgICAgMzQ2IGJ5dGVzICAic29hcF9iZWdpbl9jb3VudCINCitDb2RlOiAwMDY4YzAgICAgIDM1OCBieXRlcyAgInNvYXBfYmVnaW5fc2VuZCINCitDb2RlOiAwMDZhMjYgICAgICA4NCBieXRlcyAgInNvYXBfZW1iZWRkZWQiDQorQ29kZTogMDA2YTdhICAgICAyMDYgYnl0ZXMgICJzb2FwX3JlZmVyZW5jZSINCitDb2RlOiAwMDZiNDggICAgIDMwMiBieXRlcyAgInNvYXBfZW1iZWRkZWRfaWQiDQorQ29kZTogMDA2Yzc2ICAgICAxNTAgYnl0ZXMgICJzb2FwX2lzX2VtYmVkZGVkIg0KK0NvZGU6IDAwNmQwYyAgICAgIDkyIGJ5dGVzICAic29hcF9pc19zaW5nbGUiDQorQ29kZTogMDA2ZDY4ICAgICAgNjIgYnl0ZXMgICJzb2FwX3NldF9lbWJlZGRlZCINCitDb2RlOiAwMDZkYTYgICAgICA1MCBieXRlcyAgInNvYXBfaW5pdF9paHQiDQorQ29kZTogMDA2ZGQ4ICAgICAxMTIgYnl0ZXMgICJzb2FwX2ZyZWVfaWh0Ig0KK0NvZGU6IDAwNmU0OCAgICAgIDkyIGJ5dGVzICAic29hcF9obG9va3VwIg0KK0NvZGU6IDAwNmVhNCAgICAgMTU2IGJ5dGVzICAic29hcF9sb29rdXAiDQorQ29kZTogMDA2ZjQwICAgICAxMjQgYnl0ZXMgICJzb2FwX2VudGVyIg0KK0NvZGU6IDAwNmZiYyAgICAgMTIyIGJ5dGVzICAic29hcF9tYWxsb2MiDQorQ29kZTogMDA3MDM2ICAgICAxNzQgYnl0ZXMgICJzb2FwX2RlYWxsb2MiDQorQ29kZTogMDA3MGU0ICAgICAxNTIgYnl0ZXMgICJzb2FwX2RlbGV0ZSINCitDb2RlOiAwMDcxN2MgICAgICA4NiBieXRlcyAgInNvYXBfbG9va3VwX3R5cGUiDQorQ29kZTogMDA3MWQyICAgICA0NTIgYnl0ZXMgICJzb2FwX2lkX2xvb2t1cCINCitDb2RlOiAwMDczOTYgICAgIDMxNCBieXRlcyAgInNvYXBfaWRfZm9yd2FyZCINCitDb2RlOiAwMDc0ZDAgICAgIDMzNCBieXRlcyAgInNvYXBfaWRfZW50ZXIiDQorQ29kZTogMDA3NjFlICAgICAgNjIgYnl0ZXMgICJzb2FwX2Zjb3B5Ig0KK0NvZGU6IDAwNzY1YyAgICAgNTg2IGJ5dGVzICAic29hcF9lbmRfc2VuZCINCitDb2RlOiAwMDc4YTYgICAgIDE5MiBieXRlcyAgInNvYXBfZW5kX3JlY3YiDQorQ29kZTogMDA3OTY2ICAgICAyOTAgYnl0ZXMgICJzb2FwX2ZyZWUiDQorQ29kZTogMDA3YTg4ICAgICA2OTAgYnl0ZXMgICJzb2FwX2luaXQiDQorQ29kZTogMDA3ZDNhICAgICAxNjIgYnl0ZXMgICJzb2FwX2JlZ2luIg0KK0NvZGU6IDAwN2RkYyAgICAgMTM4IGJ5dGVzICAic29hcF9lbmQiDQorQ29kZTogMDA3ZTY2ICAgICAyMTQgYnl0ZXMgICJzb2FwX3NldF9sb2NhbF9uYW1lc3BhY2VzIg0KK0NvZGU6IDAwN2YzYyAgICAxMDgyIGJ5dGVzICAic29hcF9lbGVtZW50Ig0KK0NvZGU6IDAwODM3NiAgICAgMTI0IGJ5dGVzICAic29hcF9lbGVtZW50X2JlZ2luX291dCINCitDb2RlOiAwMDgzZjIgICAgICA1MCBieXRlcyAgInNvYXBfc3RycmNociINCitDb2RlOiAwMDg0MjQgICAgIDI0MCBieXRlcyAgInNvYXBfc3RydG9sIg0KK0NvZGU6IDAwODUxNCAgICAgMjI0IGJ5dGVzICAic29hcF9zdHJ0b3VsIg0KK0NvZGU6IDAwODVmNCAgICAgMzM4IGJ5dGVzICAic29hcF9lbGVtZW50X3N0YXJ0X2VuZF9vdXQiDQorQ29kZTogMDA4NzQ2ICAgICAxNjYgYnl0ZXMgICJzb2FwX2VsZW1lbnRfZW5kX291dCINCitDb2RlOiAwMDg3ZWMgICAgIDEzOCBieXRlcyAgInNvYXBfZWxlbWVudF9yZWYiDQorQ29kZTogMDA4ODc2ICAgICAxNDQgYnl0ZXMgICJzb2FwX2VsZW1lbnRfaHJlZiINCitDb2RlOiAwMDg5MDYgICAgIDI1MiBieXRlcyAgInNvYXBfZWxlbWVudF9udWxsIg0KK0NvZGU6IDAwOGEwMiAgICAgMzIwIGJ5dGVzICAic29hcF9lbGVtZW50X2lkIg0KK0NvZGU6IDAwOGI0MiAgICAgMjc2IGJ5dGVzICAic29hcF9lbGVtZW50X3Jlc3VsdCINCitDb2RlOiAwMDhjNTYgICAgIDIwNCBieXRlcyAgInNvYXBfYXR0cmlidXRlIg0KK0NvZGU6IDAwOGQyMiAgICAgMTg4IGJ5dGVzICAic29hcF9lbGVtZW50X2JlZ2luX2luIg0KK0NvZGU6IDAwOGRkZSAgICAgNDE2IGJ5dGVzICAic29hcF9lbGVtZW50X2VuZF9pbiINCitDb2RlOiAwMDhmN2UgICAgICA0NCBieXRlcyAgInNvYXBfY2xyX2F0dHIiDQorQ29kZTogMDA4ZmFhICAgICAyNTAgYnl0ZXMgICJzb2FwX2dldGF0dHJ2YWwiDQorQ29kZTogMDA5MGE0ICAgIDMxNDggYnl0ZXMgICJzb2FwX3BlZWtfZWxlbWVudCINCitDb2RlOiAwMDljZjAgICAgICA0OCBieXRlcyAgInNvYXBfcmV2ZXJ0Ig0KK0NvZGU6IDAwOWQyMCAgICAgOTQ4IGJ5dGVzICAic29hcF9zdHJpbmdfb3V0Ig0KK0NvZGU6IDAwYTBkNCAgICAxMDkwIGJ5dGVzICAic29hcF9zdHJpbmdfaW4iDQorQ29kZTogMDBhNTE2ICAgICAxODggYnl0ZXMgICJzb2FwX291dGludCINCitDb2RlOiAwMGE1ZDIgICAgICA5MiBieXRlcyAgInNvYXBfczJpbnQiDQorQ29kZTogMDBhNjJlICAgICAyNjggYnl0ZXMgICJzb2FwX2luaW50Ig0KK0NvZGU6IDAwYTczYSAgICAgIDY4IGJ5dGVzICAic29hcF9sb25nMnMiDQorQ29kZTogMDBhNzdlICAgICAxOTQgYnl0ZXMgICJzb2FwX291dGJ5dGUiDQorQ29kZTogMDBhODQwICAgICAxMTAgYnl0ZXMgICJzb2FwX3MyYnl0ZSINCitDb2RlOiAwMGE4YWUgICAgIDI2OCBieXRlcyAgInNvYXBfaW5ieXRlIg0KK0NvZGU6IDAwYTliYSAgICAgMjE2IGJ5dGVzICAic29hcF9mbG9hdDJzIg0KK0NvZGU6IDAwYWE5MiAgICAgMTg4IGJ5dGVzICAic29hcF9vdXRmbG9hdCINCitDb2RlOiAwMGFiNGUgICAgIDMyNCBieXRlcyAgInNvYXBfczJmbG9hdCINCitDb2RlOiAwMGFjOTIgICAgIDI3MCBieXRlcyAgInNvYXBfaW5mbG9hdCINCitDb2RlOiAwMGFkYTAgICAgIDU0NCBieXRlcyAgInNvYXBfczJRTmFtZSINCitDb2RlOiAwMGFmYzAgICAgIDE5NCBieXRlcyAgInNvYXBfb3V0c3RyaW5nIg0KK0NvZGU6IDAwYjA4MiAgICAgMzAyIGJ5dGVzICAic29hcF9pbnN0cmluZyINCitDb2RlOiAwMGIxYjAgICAgIDIxNCBieXRlcyAgInNvYXBfaW5saXRlcmFsIg0KK0NvZGU6IDAwYjI4NiAgICAgMTM0IGJ5dGVzICAic29hcF92YWx1ZSINCitDb2RlOiAwMGIzMGMgICAgIDE5NiBieXRlcyAgInNvYXBfZ2V0bGluZSINCitDb2RlOiAwMGIzZDAgICAgIDQxNiBieXRlcyAgInNvYXBfY291bnRfYXR0YWNobWVudHMiDQorQ29kZTogMDBiNTcwICAgICAxMTQgYnl0ZXMgICJzb2FwX3B1dGRpbWVmaWVsZCINCitDb2RlOiAwMGI1ZTIgICAgIDQwOCBieXRlcyAgInNvYXBfcHV0ZGltZWhkciINCitDb2RlOiAwMGI3N2EgICAgIDYxNiBieXRlcyAgInNvYXBfcHV0ZGltZSINCitDb2RlOiAwMGI5ZTIgICAgIDIzNiBieXRlcyAgInNvYXBfZ2V0ZGltZWZpZWxkIg0KK0NvZGU6IDAwYmFjZSAgICAgNTA2IGJ5dGVzICAic29hcF9nZXRkaW1laGRyIg0KK0NvZGU6IDAwYmNjOCAgICAgODY4IGJ5dGVzICAic29hcF9nZXRkaW1lIg0KK0NvZGU6IDAwYzAyYyAgICAgODEyIGJ5dGVzICAic29hcF9nZXRtaW1laGRyIg0KK0NvZGU6IDAwYzM1OCAgICAgNzEwIGJ5dGVzICAic29hcF9nZXRtaW1lIg0KK0NvZGU6IDAwYzYxZSAgICAgNTYyIGJ5dGVzICAic29hcF9wdXRtaW1laGRyIg0KK0NvZGU6IDAwYzg1MCAgICAgMTg2IGJ5dGVzICAic29hcF9wdXRtaW1lIg0KK0NvZGU6IDAwYzkwYSAgICAgIDUyIGJ5dGVzICAic29hcF9jbHJfbWltZSINCitDb2RlOiAwMGM5M2UgICAgIDEzNCBieXRlcyAgInNvYXBfbmV3X211bHRpcGFydCINCitDb2RlOiAwMGM5YzQgICAgIDIxMiBieXRlcyAgInNvYXBfc2V0X21pbWVfYXR0YWNobWVudCINCitDb2RlOiAwMGNhOTggICAgIDI2MiBieXRlcyAgInNvYXBfc2VsZWN0X21pbWVfYm91bmRhcnkiDQorQ29kZTogMDBjYjllICAgICAxNDAgYnl0ZXMgICJzb2FwX3ZhbGlkX21pbWVfYm91bmRhcnkiDQorQ29kZTogMDBjYzJhICAgICA4NTggYnl0ZXMgICJzb2FwX2JlZ2luX3JlY3YiDQorQ29kZTogMDBjZjg0ICAgICA2NjggYnl0ZXMgICJodHRwX3BhcnNlIg0KK0NvZGU6IDAwZDIyMCAgICAxMDc0IGJ5dGVzICAiaHR0cF9wYXJzZV9oZWFkZXIiDQorQ29kZTogMDBkNjUyICAgICAxNjAgYnl0ZXMgICJzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlIg0KK0NvZGU6IDAwZDZmMiAgICAgIDY0IGJ5dGVzICAic29hcF9kZWNvZGVfa2V5Ig0KK0NvZGU6IDAwZDczMiAgICAgIDkyIGJ5dGVzICAic29hcF9kZWNvZGVfdmFsIg0KK0NvZGU6IDAwZDc4ZSAgICAgMjU0IGJ5dGVzICAic29hcF9kZWNvZGUiDQorQ29kZTogMDBkODhjICAgICA0NjYgYnl0ZXMgICJzb2FwX2VudmVsb3BlX2JlZ2luX291dCINCitDb2RlOiAwMGRhNWUgICAgIDMzMiBieXRlcyAgInNvYXBfZW52ZWxvcGVfZW5kX291dCINCitDb2RlOiAwMGRiYWEgICAgIDI3OCBieXRlcyAgInNvYXBfZW52ZWxvcGVfYmVnaW5faW4iDQorQ29kZTogMDBkY2MwICAgICAxMDIgYnl0ZXMgICJzb2FwX2VudmVsb3BlX2VuZF9pbiINCitDb2RlOiAwMGRkMjYgICAgIDIwMiBieXRlcyAgInNvYXBfYm9keV9iZWdpbl9vdXQiDQorQ29kZTogMDBkZGYwICAgICAgOTQgYnl0ZXMgICJzb2FwX2JvZHlfZW5kX291dCINCitDb2RlOiAwMGRlNGUgICAgICA4MiBieXRlcyAgInNvYXBfYm9keV9iZWdpbl9pbiINCitDb2RlOiAwMGRlYTAgICAgICA5NCBieXRlcyAgInNvYXBfYm9keV9lbmRfaW4iDQorQ29kZTogMDBkZWZlICAgICAgNzYgYnl0ZXMgICJzb2FwX3JlY3ZfaGVhZGVyIg0KK0NvZGU6IDAwZGY0YSAgICAgMjcyIGJ5dGVzICAic29hcF9zZXRfZW5kcG9pbnQiDQorQ29kZTogMDBlMDVhICAgICAgNTYgYnl0ZXMgICJzb2FwX2Nvbm5lY3QiDQorQ29kZTogMDBlMDkyICAgICA2MDYgYnl0ZXMgICJzb2FwX2Nvbm5lY3RfY29tbWFuZCINCitDb2RlOiAwMGUyZjAgICAgIDU5MiBieXRlcyAgInNvYXBfcHV0aHR0cGhkciINCitDb2RlOiAwMGU1NDAgICAgICAyMiBieXRlcyAgImh0dHBfZ2V0Ig0KK0NvZGU6IDAwZTU1NiAgICAgNzQ4IGJ5dGVzICAiaHR0cF9wb3N0Ig0KK0NvZGU6IDAwZTg0MiAgICAgMTMwIGJ5dGVzICAiaHR0cF9zZW5kX2hlYWRlciINCitDb2RlOiAwMGU4YzQgICAgIDE5MiBieXRlcyAgImh0dHBfcG9zdF9oZWFkZXIiDQorQ29kZTogMDBlOTg0ICAgICA4NTAgYnl0ZXMgICJodHRwX3Jlc3BvbnNlIg0KK0NvZGU6IDAwZWNkNiAgICAgMzk0IGJ5dGVzICAic29hcF9zZXRfZmF1bHQiDQorQ29kZTogMDBlZTYwICAgICA2NDQgYnl0ZXMgICJzb2FwX3JlY3ZfZmF1bHQiDQorQ29kZTogMDBmMGU0ICAgICAxMDggYnl0ZXMgICJzb2FwX3N0cmVycm9yIg0KK0NvZGU6IDAwZjE1MCAgICAgMTM0IGJ5dGVzICAic29hcF9zZXRfZXJyb3IiDQorQ29kZTogMDBmMWQ2ICAgICAxMjYgYnl0ZXMgICJzb2FwX3NldF9zZW5kZXJfZXJyb3IiDQorQ29kZTogMDBmMjU0ICAgICAxMzAgYnl0ZXMgICJzb2FwX3NldF9yZWNlaXZlcl9lcnJvciINCitDb2RlOiAwMGYyZDYgICAgICA3NCBieXRlcyAgImZwbHVnaW4iDQorDQorRGF0YSBzZWN0aW9uIGJlbG93IEE1OiAgIDE0ODggYnl0ZXMNCitEYXRhIHNlY3Rpb24gYWJvdmUgQTU6ICAgMjA4MCBieXRlcw0KKw0KK0luaXRpYWxpemVkIG5lYXIgZGF0YQ0KK0RhdGE6ICAgICAtNCAgICAgICA0IGJ5dGVzICAiQXBwTmV0VGltZW91dCINCitEYXRhOiAgICAtNjggICAgICA2NCBieXRlcyAgIm1pbWVfY29kZXMiDQorRGF0YTogICAgLTc2ICAgICAgIDggYnl0ZXMgICJAMTYwIg0KK0RhdGE6ICAgIC04OCAgICAgIDExIGJ5dGVzICAiQDE1OSINCitEYXRhOiAgICAtOTYgICAgICAgNyBieXRlcyAgIkAxNTgiDQorRGF0YTogICAtMTE0ICAgICAgMTcgYnl0ZXMgICJAMTU3Ig0KK0RhdGE6ICAgLTEyMiAgICAgICA3IGJ5dGVzICAiQDE1NiINCitEYXRhOiAgIC0xMjggICAgICAgNSBieXRlcyAgIkAxNTUiDQorRGF0YTogICAtMTM0ICAgICAgIDUgYnl0ZXMgICJAMTU0Ig0KK0RhdGE6ICAgLTIwMCAgICAgIDY1IGJ5dGVzICAic29hcF9iYXNlNjRvIg0KK0RhdGE6ICAgLTIwNCAgICAgICA0IGJ5dGVzICAic29hcF9kb3VibGVfbmFuIg0KK0RhdGE6ICAgLTI0MCAgICAgIDM1IGJ5dGVzICAic29hcF9ycGMiDQorRGF0YTogICAtMjgwICAgICAgNDAgYnl0ZXMgICJzb2FwX2VuYzIiDQorRGF0YTogICAtMzIwICAgICAgNDAgYnl0ZXMgICJzb2FwX2VudjIiDQorRGF0YTogICAtMzYyICAgICAgNDIgYnl0ZXMgICJzb2FwX2VuYzEiDQorRGF0YTogICAtNDA0ICAgICAgNDIgYnl0ZXMgICJzb2FwX2VudjEiDQorRGF0YTogICAtNDA2ICAgICAgIDIgYnl0ZXMgICJzZWVkJDIwNyINCitEYXRhOiAgIC01MDIgICAgICA5NiBieXRlcyAgIm5hbWVzcGFjZXMiDQorRGF0YTogICAtNTMwICAgICAgMjggYnl0ZXMgICJAMTY3Ig0KK0RhdGE6ICAgLTUzNCAgICAgICAzIGJ5dGVzICAiQDE2NiINCitEYXRhOiAgIC01NjQgICAgICAzMCBieXRlcyAgIkAxNjUiDQorRGF0YTogICAtNTk4ICAgICAgMzMgYnl0ZXMgICJAMTY0Ig0KK0RhdGE6ICAgLTYwMiAgICAgICA0IGJ5dGVzICAiQDE2MyINCitEYXRhOiAgIC02NDIgICAgICAzOSBieXRlcyAgIkAxNjIiDQorRGF0YTogICAtNjg0ICAgICAgNDIgYnl0ZXMgICJAMTYxIg0KK0RhdGE6ICAgLTY4OCAgICAgICA0IGJ5dGVzICAiQDE2MCINCitEYXRhOiAgIC03MjIgICAgICAzNCBieXRlcyAgIkAxNTkiDQorRGF0YTogICAtNzY0ICAgICAgNDIgYnl0ZXMgICJAMTU4Ig0KK0RhdGE6ICAgLTc3NCAgICAgICA5IGJ5dGVzICAiQDE1NyINCitEYXRhOiAgIC04MDggICAgICAzNCBieXRlcyAgIkAxNTYiDQorRGF0YTogICAtODUwICAgICAgNDIgYnl0ZXMgICJAMTU1Ig0KK0RhdGE6ICAgLTg2MCAgICAgICA5IGJ5dGVzICAiQDE1NCINCisNCitVbmluaXRpYWxpemVkIG5lYXIgZGF0YQ0KK0RhdGE6ICAtMTQyOCAgICAgNTY4IGJ5dGVzICAiQXBwSG9zdEluZm8iDQorRGF0YTogIC0xNDMwICAgICAgIDIgYnl0ZXMgICJoX2Vycm5vIg0KK0RhdGE6ICAtMTQzMiAgICAgICAyIGJ5dGVzICAiQXBwTmV0UmVmbnVtIg0KK0RhdGE6ICAtMTQzNiAgICAgICA0IGJ5dGVzICAiX19DV19GRUFUVVJFU19QVFIiDQorRGF0YTogIC0xNDQwICAgICAgIDQgYnl0ZXMgICJfX2dsb2JhbF9kZXN0cnVjdG9yX2NoYWluIg0KK0RhdGE6ICAtMTQ0MiAgICAgICAyIGJ5dGVzICAiZXJybm8iDQorRGF0YTogIC0xNDQ2ICAgICAgIDMgYnl0ZXMgICJzb2FwX3BhZGRpbmciDQorRGF0YTogIC0xNDg2ICAgICAgNDAgYnl0ZXMgICJzdHIkMTE4Ig0KK0RhdGE6ICAtMTQ4OCAgICAgICAyIGJ5dGVzICAiQXBwTmV0T3BlbkNvdW50Ig0KKw0KK0luaXRpYWxpemVkIGZhciBkYXRhDQorRGF0YTogICAgIDY0ICAgIDIwMTYgYnl0ZXMgICJfX3NlZ3RhYmxlX18iDQorRGF0YTogICAgIDQwICAgICAgIDYgYnl0ZXMgICJAZXhjZXB0aW9uaW5mb0AiDQorRGF0YTogICAgIDQ2ICAgICAgIDYgYnl0ZXMgICJAZXhjZXB0aW9uaW5mb0AiDQorRGF0YTogICAgIDUyICAgICAgIDYgYnl0ZXMgICJAZXhjZXB0aW9uaW5mb0AiDQorRGF0YTogICAgIDU4ICAgICAgIDYgYnl0ZXMgICJAZXhjZXB0aW9uaW5mb0AiDQpkaWZmIC0tZ2l0IGEvZ3NvYXAtcGFsbS9zdG9ja3F1b3RlL3JzYy9TdG9ja1F1b3RlLnJzcmMgYi9nc29hcC1wYWxtL3N0b2NrcXVvdGUvcnNjL1N0b2NrUXVvdGUucnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3NvYXAtcGFsbS9zdG9ja3F1b3RlL3JzYy9TdG9ja1F1b3RlLnJzcmMKZGlmZiAtLWdpdCBhL2dzb2FwLXBhbG0vc3RvY2txdW90ZS9yc2MvU3RvY2tRdW90ZVJzYy5oIGIvZ3NvYXAtcGFsbS9zdG9ja3F1b3RlL3JzYy9TdG9ja1F1b3RlUnNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTljNjg3NgotLS0gL2Rldi9udWxsCisrKyBiL2dzb2FwLXBhbG0vc3RvY2txdW90ZS9yc2MvU3RvY2tRdW90ZVJzYy5oCkBAIC0wLDAgKzEsOTEgQEAKKy8vCUhlYWRlciBnZW5lcmF0ZWQgYnkgQ29uc3RydWN0b3IgZm9yIFBhbG0gT1MgKFIpIDEuOAorLy8KKy8vCUdlbmVyYXRlZCBhdCA1OjI2OjAwIFBNIG9uIEZyaWRheSwgQXByaWwgMDIsIDIwMDQKKy8vCisvLwlHZW5lcmF0ZWQgZm9yIGZpbGU6IEg6XGdzb2FwMi42XHdpblxzdG9ja3F1b3RlXFJzY1xTdG9ja1F1b3RlLnJzcmMKKy8vCisvLwlUSElTIElTIEFOIEFVVE9NQVRJQ0FMTFkgR0VORVJBVEVEIEhFQURFUiBGSUxFCisvLwlETyBOT1QgRURJVCAtIENIQU5HRVMgTUFERSBUTyBUSElTIEZJTEUgV0lMTCBCRSBMT1NUCisvLworLy8JUGFsbSBBcHAgTmFtZTogICAJCSJTdG9ja1F1b3RlIgorLy8KKy8vCVBhbG0gQXBwIFZlcnNpb246CQkiMS4wIgorCisKKy8vCVJlc291cmNlOiB0RlJNIDEwMDAKKyNkZWZpbmUgTWFpbkZvcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMAkvLyhMZWZ0IE9yaWdpbiA9IDAsIFRvcCBPcmlnaW4gPSAwLCBXaWR0aCA9IDE2MCwgSGVpZ2h0ID0gMTYwLCBVc2FibGUgPSAxLCBNb2RhbCA9IDAsIFNhdmUgQmVoaW5kID0gMCwgSGVscCBJRCA9IDAsIE1lbnUgQmFyIElEID0gMTAwMCwgRGVmYXVsdCBCdXR0b24gSUQgPSAwKQorI2RlZmluZSBNYWluUnVuQnV0dG9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAxCS8vKExlZnQgT3JpZ2luID0gOSwgVG9wIE9yaWdpbiA9IDczLCBXaWR0aCA9IDM2LCBIZWlnaHQgPSAxMiwgVXNhYmxlID0gMSwgQW5jaG9yIExlZnQgPSAxLCBGcmFtZSA9IDEsIE5vbi1ib2xkIEZyYW1lID0gMSwgRm9udCA9IFN0YW5kYXJkKQorI2RlZmluZSBNYWluU3ltYm9sRmllbGQgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAyCS8vKExlZnQgT3JpZ2luID0gNjUsIFRvcCBPcmlnaW4gPSAyMiwgV2lkdGggPSA1MCwgSGVpZ2h0ID0gMTIsIFVzYWJsZSA9IDEsIEVkaXRhYmxlID0gMSwgVW5kZXJsaW5lID0gMSwgU2luZ2xlIExpbmUgPSAwLCBEeW5hbWljIFNpemUgPSAwLCBMZWZ0IEp1c3RpZmllZCA9IDEsIE1heCBDaGFyYWN0ZXJzID0gODAsIEZvbnQgPSBTdGFuZGFyZCwgQXV0byBTaGlmdCA9IDAsIEhhcyBTY3JvbGwgQmFyID0gMCwgTnVtZXJpYyA9IDApCisjZGVmaW5lIE1haW5SZXN1bHRGaWVsZCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDUJLy8oTGVmdCBPcmlnaW4gPSA2NCwgVG9wIE9yaWdpbiA9IDQ4LCBXaWR0aCA9IDUwLCBIZWlnaHQgPSAxMiwgVXNhYmxlID0gMSwgRWRpdGFibGUgPSAwLCBVbmRlcmxpbmUgPSAxLCBTaW5nbGUgTGluZSA9IDAsIER5bmFtaWMgU2l6ZSA9IDAsIExlZnQgSnVzdGlmaWVkID0gMSwgTWF4IENoYXJhY3RlcnMgPSA4MCwgRm9udCA9IFN0YW5kYXJkLCBBdXRvIFNoaWZ0ID0gMCwgSGFzIFNjcm9sbCBCYXIgPSAwLCBOdW1lcmljID0gMCkKKyNkZWZpbmUgTWFpblVubmFtZWQxMDAzTGFiZWwgICAgICAgICAgICAgICAgICAgICAgMTAwMwkvLyhMZWZ0IE9yaWdpbiA9IDEwLCBUb3AgT3JpZ2luID0gMjEsIFVzYWJsZSA9IDEsIEZvbnQgPSBTdGFuZGFyZCkKKyNkZWZpbmUgTWFpblVubmFtZWQxMDA0TGFiZWwgICAgICAgICAgICAgICAgICAgICAgMTAwNAkvLyhMZWZ0IE9yaWdpbiA9IDEyLCBUb3AgT3JpZ2luID0gNDgsIFVzYWJsZSA9IDEsIEZvbnQgPSBTdGFuZGFyZCkKKworLy8JUmVzb3VyY2U6IHRGUk0gMTEwMAorI2RlZmluZSBBYm91dEZvcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAwCS8vKExlZnQgT3JpZ2luID0gMiwgVG9wIE9yaWdpbiA9IDIsIFdpZHRoID0gMTU2LCBIZWlnaHQgPSAxNTYsIFVzYWJsZSA9IDEsIE1vZGFsID0gMSwgU2F2ZSBCZWhpbmQgPSAxLCBIZWxwIElEID0gMCwgTWVudSBCYXIgSUQgPSAwLCBEZWZhdWx0IEJ1dHRvbiBJRCA9IDApCisjZGVmaW5lIEFib3V0T0tCdXR0b24gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDUJLy8oTGVmdCBPcmlnaW4gPSA1OCwgVG9wIE9yaWdpbiA9IDEzMywgV2lkdGggPSA0MCwgSGVpZ2h0ID0gMTIsIFVzYWJsZSA9IDEsIEFuY2hvciBMZWZ0ID0gMSwgRnJhbWUgPSAxLCBOb24tYm9sZCBGcmFtZSA9IDEsIEZvbnQgPSBTdGFuZGFyZCkKKyNkZWZpbmUgQWJvdXRUaXRsZUxhYmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMgkvLyhMZWZ0IE9yaWdpbiA9IDIyLCBUb3AgT3JpZ2luID0gMjIsIFVzYWJsZSA9IDEsIEZvbnQgPSBMYXJnZSkKKyNkZWZpbmUgQWJvdXRUZXh0MUxhYmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMwkvLyhMZWZ0IE9yaWdpbiA9IDIzLCBUb3AgT3JpZ2luID0gNTQsIFVzYWJsZSA9IDEsIEZvbnQgPSBTdGFuZGFyZCkKKyNkZWZpbmUgQWJvdXRUZXh0MkxhYmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwNAkvLyhMZWZ0IE9yaWdpbiA9IDUwLCBUb3AgT3JpZ2luID0gMTA0LCBVc2FibGUgPSAxLCBGb250ID0gQm9sZCkKKworCisvLwlSZXNvdXJjZTogVGFsdCAxMDAxCisjZGVmaW5lIFJvbUluY29tcGF0aWJsZUFsZXJ0ICAgICAgICAgICAgICAgICAgICAgIDEwMDEKKyNkZWZpbmUgUm9tSW5jb21wYXRpYmxlT0sgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvLwlSZXNvdXJjZTogVGFsdCAxMTAwCisjZGVmaW5lIFNvYXBfZXJyb3JBbGVydCAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDAKKyNkZWZpbmUgU29hcF9lcnJvck9LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisKKy8vCVJlc291cmNlOiBNQkFSIDEwMDAKKyNkZWZpbmUgTWFpbkZvcm1NZW51QmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMAorCisKKy8vCVJlc291cmNlOiBNRU5VIDEwMDAKKyNkZWZpbmUgTWFpbk9wdGlvbnNNZW51ICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMAorI2RlZmluZSBNYWluT3B0aW9uc0Fib3V0U3RvY2tRdW90ZSAgICAgICAgICAgICAgICAxMDAwCisKKworLy8JUmVzb3VyY2U6IFBJQ1QgMTAwMQorI2RlZmluZSBMYXJnZWljb24xYml0Qml0bWFwICAgICAgICAgICAgICAgICAgICAgICAxMDAxCisKKy8vCVJlc291cmNlOiBQSUNUIDEwMDIKKyNkZWZpbmUgTGFyZ2VpY29uMmJpdEJpdG1hcCAgICAgICAgICAgICAgICAgICAgICAgMTAwMgorCisvLwlSZXNvdXJjZTogUElDVCAxMDA4CisjZGVmaW5lIExhcmdlaWNvbjhiaXRCaXRtYXAgICAgICAgICAgICAgICAgICAgICAgIDEwMDgKKworLy8JUmVzb3VyY2U6IFBJQ1QgMTAxMQorI2RlZmluZSBTbWFsbGljb24xYml0Qml0bWFwICAgICAgICAgICAgICAgICAgICAgICAxMDExCisKKy8vCVJlc291cmNlOiBQSUNUIDEwMTIKKyNkZWZpbmUgU21hbGxpY29uMmJpdEJpdG1hcCAgICAgICAgICAgICAgICAgICAgICAgMTAxMgorCisvLwlSZXNvdXJjZTogUElDVCAxMDE4CisjZGVmaW5lIFNtYWxsaWNvbjhiaXRCaXRtYXAgICAgICAgICAgICAgICAgICAgICAgIDEwMTgKKworLy8JUmVzb3VyY2U6IFBJQ1QgMjEwMDEKKyNkZWZpbmUgTGFyZ2VpY29uWDIxYml0Qml0bWFwICAgICAgICAgICAgICAgICAgICAgMjEwMDEKKworLy8JUmVzb3VyY2U6IFBJQ1QgMjEwMDIKKyNkZWZpbmUgTGFyZ2VpY29uWDIyYml0Qml0bWFwICAgICAgICAgICAgICAgICAgICAgMjEwMDIKKworLy8JUmVzb3VyY2U6IFBJQ1QgMjEwMDgKKyNkZWZpbmUgTGFyZ2VpY29uWDI4Yml0Qml0bWFwICAgICAgICAgICAgICAgICAgICAgMjEwMDgKKworLy8JUmVzb3VyY2U6IFBJQ1QgMjEwMTEKKyNkZWZpbmUgU21hbGxpY29uWDIxYml0Qml0bWFwICAgICAgICAgICAgICAgICAgICAgMjEwMTEKKworLy8JUmVzb3VyY2U6IFBJQ1QgMjEwMTgKKyNkZWZpbmUgU21hbGxpY29uWDI4Yml0Qml0bWFwICAgICAgICAgICAgICAgICAgICAgMjEwMTgKKworLy8JUmVzb3VyY2U6IFBJQ1QgMjEwMTIKKyNkZWZpbmUgU21hbGxpY29uWDIyYml0Qml0bWFwICAgICAgICAgICAgICAgICAgICAgMjEwMTIKKworCisvLwlSZXNvdXJjZTogdGFpZiAxMDAwCisjZGVmaW5lIExhcmdlaWNvbnMxMmFuZDhiaXRzQXBwSWNvbkZhbWlseSAgICAgICAgIDEwMDAKKworLy8JUmVzb3VyY2U6IHRhaWYgMTAwMQorI2RlZmluZSBTbWFsbGljb25zMTJhbmQ4Yml0c0FwcEljb25GYW1pbHkgICAgICAgICAxMDAxCisKZGlmZiAtLWdpdCBhL2dzb2FwLXBhbG0vc3RvY2txdW90ZS9yc2MvcXVvdGUuaCBiL2dzb2FwLXBhbG0vc3RvY2txdW90ZS9yc2MvcXVvdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOThkMjk0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3NvYXAtcGFsbS9zdG9ja3F1b3RlL3JzYy9xdW90ZS5oCkBAIC0wLDAgKzEgQEAKK2ludCBuc19fZ2V0UXVvdGUoY2hhciAqc3ltYm9sLCBmbG9hdCAqUmVzdWx0KTsKZGlmZiAtLWdpdCBhL2dzb2FwLXBhbG0vc3RvY2txdW90ZS9yc2MvcmVzb3VyY2UuZnJrL3N0b2NrUXVvdGUucnNyYyBiL2dzb2FwLXBhbG0vc3RvY2txdW90ZS9yc2MvcmVzb3VyY2UuZnJrL3N0b2NrUXVvdGUucnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTg2ODJmCi0tLSAvZGV2L251bGwKKysrIGIvZ3NvYXAtcGFsbS9zdG9ja3F1b3RlL3JzYy9yZXNvdXJjZS5mcmsvc3RvY2tRdW90ZS5yc3JjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dzb2FwLXBhbG0vc3RvY2txdW90ZS9zcmMvUXVvdGVTdGFydGVyLmMgYi9nc29hcC1wYWxtL3N0b2NrcXVvdGUvc3JjL1F1b3RlU3RhcnRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZWJiNjkKLS0tIC9kZXYvbnVsbAorKysgYi9nc29hcC1wYWxtL3N0b2NrcXVvdGUvc3JjL1F1b3RlU3RhcnRlci5jCkBAIC0wLDAgKzEsNTE0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDAgUGFsbSwgSW5jLiBvciBpdHMgc3Vic2lkaWFyaWVzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBGaWxlOiBTdGFydGVyLmMKKyAqICAKKyAqIFJlbGVhc2U6IFBhbG0gT1MgU0RLIDUuMCAoMTExODIzKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyAgICAoQykgQ09QWVJJR0hUIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDIgQWxsIFJpZ2h0cyBSZXNlcnZlZAorLy8gICAgTGljZW5zZWQgTWF0ZXJpYWxzIC0gUHJvcGVydHkgb2YgSUJNCisvLyAgICBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvcgorLy8gICAgZGlzY2xvc3VyZSByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KKy8vCisvLyAgICBJQk0gRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORworLy8gICAgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorLy8gICAgUFVSUE9TRS4gSU4gTk8gRVZFTlQgU0hBTEwgSUJNIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisvLyAgICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisvLyAgICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKy8vICAgIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UKKy8vICAgIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisvLworLy8gICAgVGhlIHByb2dyYW0gbWF5IGJlIHVzZWQsIGV4ZWN1dGVkLCBjb3BpZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQKKy8vICAgIHdpdGhvdXQgcm95YWx0eSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGV2ZWxvcGluZywgdXNpbmcsIG1hcmtldGluZywgb3IgZGlzdHJpYnV0aW5nLgorLy8gCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2luY2x1ZGUgPFBhbG1PUy5oPgorI2luY2x1ZGUgIlN0b2NrUXVvdGVSc2MuaCIKKyNpbmNsdWRlICJzb2FwSC5oIiAgICAvLyBpbmNsdWRlIHRoZSBnZW5lcmF0ZWQgcHJveHkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJRW50cnkgUG9pbnRzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCUludGVybmFsIFN0cnVjdHVyZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCAKKwl7CisJVUludDggcmVwbGFjZW1lOworCX0gU3RhcnRlclByZWZlcmVuY2VUeXBlOworCit0eXBlZGVmIHN0cnVjdCAKKwl7CisJVUludDggcmVwbGFjZW1lOworCX0gU3RhcnRlckFwcEluZm9UeXBlOworCit0eXBlZGVmIFN0YXJ0ZXJBcHBJbmZvVHlwZSogU3RhcnRlckFwcEluZm9QdHI7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJR2xvYmFsIHZhcmlhYmxlcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vc3RhdGljIEJvb2xlYW4gSGlkZVNlY3JldFJlY29yZHM7CisKK1VJbnQxNiBsaWJOdW07CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglJbnRlcm5hbCBDb25zdGFudHMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIGFwcEZpbGVDcmVhdG9yCQkJJ0JPQjEnCS8vIHJlZ2lzdGVyIHlvdXIgb3duIGF0IGh0dHA6Ly93d3cucGFsbW9zLmNvbS9kZXYvY3JlYXRvcmlkLworI2RlZmluZSBhcHBWZXJzaW9uTnVtCQkJMHgwMQorI2RlZmluZSBhcHBQcmVmSUQJCQkJMHgwMAorI2RlZmluZSBhcHBQcmVmVmVyc2lvbk51bQkJMHgwMQorCisvLyBEZWZpbmUgdGhlIG1pbmltdW0gT1MgdmVyc2lvbiB3ZSBzdXBwb3J0ICgyLjAgZm9yIG5vdykuCisjZGVmaW5lIG91ck1pblZlcnNpb24Jc3lzTWFrZVJPTVZlcnNpb24oMiwwLDAsc3lzUk9NU3RhZ2VSZWxlYXNlLDApCisjZGVmaW5lIGtQYWxtT1MxMFZlcnNpb24Jc3lzTWFrZVJPTVZlcnNpb24oMSwwLDAsc3lzUk9NU3RhZ2VSZWxlYXNlLDApCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJSW50ZXJuYWwgRnVuY3Rpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgZ2V0UXVvdGUoIGNoYXIgKnN5bWJvbCwgY2hhciAqcmVzdWx0KTsKK3ZvaWQgU3RkRXRvQShjaGFyICp0ZXh0KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIFJvbVZlcnNpb25Db21wYXRpYmxlCisgKgorICogREVTQ1JJUFRJT046IFRoaXMgcm91dGluZSBjaGVja3MgdGhhdCBhIFJPTSB2ZXJzaW9uIGlzIG1lZXQgeW91cgorICogICAgICAgICAgICAgIG1pbmltdW0gcmVxdWlyZW1lbnQuCisgKgorICogUEFSQU1FVEVSUzogIHJlcXVpcmVkVmVyc2lvbiAtIG1pbmltdW0gcm9tIHZlcnNpb24gcmVxdWlyZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VlIHN5c0Z0ck51bVJPTVZlcnNpb24gaW4gU3lzdGVtTWdyLmggCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGZvcm1hdCkKKyAqICAgICAgICAgICAgICBsYXVuY2hGbGFncyAgICAgLSBmbGFncyB0aGF0IGluZGljYXRlIGlmIHRoZSBhcHBsaWNhdGlvbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSSBpcyBpbml0aWFsaXplZC4KKyAqCisgKiBSRVRVUk5FRDogICAgZXJyb3IgY29kZSBvciB6ZXJvIGlmIHJvbSBpcyBjb21wYXRpYmxlCisgKgorICogUkVWSVNJT04gSElTVE9SWToKKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEVyciBSb21WZXJzaW9uQ29tcGF0aWJsZShVSW50MzIgcmVxdWlyZWRWZXJzaW9uLCBVSW50MTYgbGF1bmNoRmxhZ3MpCit7CisJVUludDMyIHJvbVZlcnNpb247CisKKwkvLyBTZWUgaWYgd2UncmUgb24gaW4gbWluaW11bSByZXF1aXJlZCB2ZXJzaW9uIG9mIHRoZSBST00gb3IgbGF0ZXIuCisJRnRyR2V0KHN5c0Z0ckNyZWF0b3IsIHN5c0Z0ck51bVJPTVZlcnNpb24sICZyb21WZXJzaW9uKTsKKwlpZiAocm9tVmVyc2lvbiA8IHJlcXVpcmVkVmVyc2lvbikKKwkJeworCQlpZiAoKGxhdW5jaEZsYWdzICYgKHN5c0FwcExhdW5jaEZsYWdOZXdHbG9iYWxzIHwgc3lzQXBwTGF1bmNoRmxhZ1VJQXBwKSkgPT0KKwkJCShzeXNBcHBMYXVuY2hGbGFnTmV3R2xvYmFscyB8IHN5c0FwcExhdW5jaEZsYWdVSUFwcCkpCisJCQl7CisJCQlGcm1BbGVydCAoUm9tSW5jb21wYXRpYmxlQWxlcnQpOworCQkKKwkJCS8vIFBhbG0gT1MgMS4wIHdpbGwgY29udGludW91c2x5IHJlbGF1bmNoIHRoaXMgYXBwIHVubGVzcyB3ZSBzd2l0Y2ggdG8gCisJCQkvLyBhbm90aGVyIHNhZmUgb25lLgorCQkJaWYgKHJvbVZlcnNpb24gPD0ga1BhbG1PUzEwVmVyc2lvbikKKwkJCQl7CisJCQkJQXBwTGF1bmNoV2l0aENvbW1hbmQoc3lzRmlsZUNEZWZhdWx0QXBwLCBzeXNBcHBMYXVuY2hDbWROb3JtYWxMYXVuY2gsIE5VTEwpOworCQkJCX0KKwkJCX0KKwkJCisJCXJldHVybiBzeXNFcnJSb21JbmNvbXBhdGlibGU7CisJCX0KKworCXJldHVybiBlcnJOb25lOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBHZXRPYmplY3RQdHIKKyAqCisgKiBERVNDUklQVElPTjogVGhpcyByb3V0aW5lIHJldHVybnMgYSBwb2ludGVyIHRvIGFuIG9iamVjdCBpbiB0aGUgY3VycmVudAorICogICAgICAgICAgICAgIGZvcm0uCisgKgorICogUEFSQU1FVEVSUzogIGZvcm1JZCAtIGlkIG9mIHRoZSBmb3JtIHRvIGRpc3BsYXkKKyAqCisgKiBSRVRVUk5FRDogICAgdm9pZCAqCisgKgorICogUkVWSVNJT04gSElTVE9SWToKKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgKiBHZXRPYmplY3RQdHIoVUludDE2IG9iamVjdElEKQoreworCUZvcm1QdHIgZnJtUDsKKworCWZybVAgPSBGcm1HZXRBY3RpdmVGb3JtKCk7CisJcmV0dXJuIEZybUdldE9iamVjdFB0cihmcm1QLCBGcm1HZXRPYmplY3RJbmRleChmcm1QLCBvYmplY3RJRCkpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBNYWluRm9ybUluaXQKKyAqCisgKiBERVNDUklQVElPTjogVGhpcyByb3V0aW5lIGluaXRpYWxpemVzIHRoZSBNYWluRm9ybSBmb3JtLgorICoKKyAqIFBBUkFNRVRFUlM6ICBmcm0gLSBwb2ludGVyIHRvIHRoZSBNYWluRm9ybSBmb3JtLgorICoKKyAqIFJFVFVSTkVEOiAgICBub3RoaW5nCisgKgorICogUkVWSVNJT04gSElTVE9SWToKKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgTWFpbkZvcm1Jbml0KEZvcm1QdHIgZnJtUCkKK3sKKwlGaWVsZFB0cgkJCWZsZDsKKwljaGFyICpwdHI7CisgICAJTWVtSGFuZGxlCQkJbWggPSBNZW1IYW5kbGVOZXcgKDEwKTsKKwlmbGQgPSBHZXRPYmplY3RQdHIgKE1haW5TeW1ib2xGaWVsZCk7CisJcHRyID0gTWVtSGFuZGxlTG9jayAobWgpOworCXN0cmNweShwdHIsIklCTSIpOworCUZsZFNldFRleHRIYW5kbGUgKGZsZCwgbWgpOworICAgIE1lbUhhbmRsZVVubG9jayhtaCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIE1haW5Gb3JtRG9Db21tYW5kCisgKgorICogREVTQ1JJUFRJT046IFRoaXMgcm91dGluZSBwZXJmb3JtcyB0aGUgbWVudSBjb21tYW5kIHNwZWNpZmllZC4KKyAqCisgKiBQQVJBTUVURVJTOiAgY29tbWFuZCAgLSBtZW51IGl0ZW0gaWQKKyAqCisgKiBSRVRVUk5FRDogICAgbm90aGluZworICoKKyAqIFJFVklTSU9OIEhJU1RPUlk6CisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBCb29sZWFuIE1haW5Gb3JtRG9Db21tYW5kKFVJbnQxNiBjb21tYW5kKQoreworCUJvb2xlYW4gaGFuZGxlZCA9IGZhbHNlOworCUZvcm1QdHIgZnJtUDsKKworCXN3aXRjaCAoY29tbWFuZCkKKwkJeworCQljYXNlIE1haW5PcHRpb25zQWJvdXRTdG9ja1F1b3RlOgorCQkJTWVudUVyYXNlU3RhdHVzKDApOwkJCQkJLy8gQ2xlYXIgdGhlIG1lbnUgc3RhdHVzIGZyb20gdGhlIGRpc3BsYXkuCisJCQlmcm1QID0gRnJtSW5pdEZvcm0gKEFib3V0Rm9ybSk7CisJCQlGcm1Eb0RpYWxvZyAoZnJtUCk7CQkJCQkvLyBEaXNwbGF5IHRoZSBBYm91dCBCb3guCisJCQlGcm1EZWxldGVGb3JtIChmcm1QKTsKKwkJCWhhbmRsZWQgPSB0cnVlOworCQkJYnJlYWs7CisKKwkJfQorCQorCXJldHVybiBoYW5kbGVkOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBNYWluRm9ybUhhbmRsZUV2ZW50CisgKgorICogREVTQ1JJUFRJT046IFRoaXMgcm91dGluZSBpcyB0aGUgZXZlbnQgaGFuZGxlciBmb3IgdGhlIAorICogICAgICAgICAgICAgICJNYWluRm9ybSIgb2YgdGhpcyBhcHBsaWNhdGlvbi4KKyAqCisgKiBQQVJBTUVURVJTOiAgZXZlbnRQICAtIGEgcG9pbnRlciB0byBhbiBFdmVudFR5cGUgc3RydWN0dXJlCisgKgorICogUkVUVVJORUQ6ICAgIHRydWUgaWYgdGhlIGV2ZW50IGhhcyBoYW5kbGUgYW5kIHNob3VsZCBub3QgYmUgcGFzc2VkCisgKiAgICAgICAgICAgICAgdG8gYSBoaWdoZXIgbGV2ZWwgaGFuZGxlci4KKyAqCisgKiBSRVZJU0lPTiBISVNUT1JZOgorICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgQm9vbGVhbiBNYWluRm9ybUhhbmRsZUV2ZW50KEV2ZW50UHRyIGV2ZW50UCkKK3sKKwlCb29sZWFuIGhhbmRsZWQgPSBmYWxzZTsKKwlGb3JtUHRyIGZybVA7CisgICAgY2hhciByZXN1bHRbMjQwXTsKKyAgICBpbnQgcmM7CisgICAgRmllbGRQdHIJCQlmbGQ7CisKKworCXN3aXRjaCAoZXZlbnRQLT5lVHlwZSkgCisJCXsKKwkJY2FzZSBtZW51RXZlbnQ6CisJCQlyZXR1cm4gTWFpbkZvcm1Eb0NvbW1hbmQoZXZlbnRQLT5kYXRhLm1lbnUuaXRlbUlEKTsKKworCQljYXNlIGZybU9wZW5FdmVudDoKKwkJCWZybVAgPSBGcm1HZXRBY3RpdmVGb3JtKCk7CisJCQlNYWluRm9ybUluaXQoIGZybVApOworCQkJRnJtRHJhd0Zvcm0gKCBmcm1QKTsKKwkJCWhhbmRsZWQgPSB0cnVlOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBmcm1VcGRhdGVFdmVudDoKKwkJCS8vIFRvIGRvIGFueSBjdXN0b20gZHJhd2luZyBoZXJlLCBmaXJzdCBjYWxsIEZybURyYXdGb3JtKCksIHRoZW4gZG8geW91cgorCQkJLy8gZHJhd2luZywgYW5kIHRoZW4gc2V0IGhhbmRsZWQgdG8gdHJ1ZS4KKwkJCWJyZWFrOworCisvKgorCWNhc2UgY3RsRW50ZXJFdmVudDoKKwkJc3dpdGNoIChldmVudFAtPmRhdGEuY3RsRW50ZXIuY29udHJvbElEKQorCQl7CisJCQljYXNlIE1haW5SdW5CdXR0b246CisJCQlnZXRRdW90ZSgiSUJNIixyZXN1bHQpOworCQkJCWJyZWFrOworCQl9CisJCWJyZWFrOworKi8JCQorCisJY2FzZSBjdGxTZWxlY3RFdmVudDoKKwkJc3dpdGNoIChldmVudFAtPmRhdGEuY3RsU2VsZWN0LmNvbnRyb2xJRCkKKwkJeworCQkJY2FzZSBNYWluUnVuQnV0dG9uOgorCQkJcmMgPSBnZXRRdW90ZSgiSUJNIixyZXN1bHQpOworLy8JCQlpZiAocmM9PVNPQVBfT0spCisvLyAgCQkJeworCQkJCWZsZCA9IEdldE9iamVjdFB0ciAoTWFpblJlc3VsdEZpZWxkKTsKKwkJCQlGbGRTZXRUZXh0UHRyKCBmbGQsIHJlc3VsdCk7CisJCQkJRmxkRHJhd0ZpZWxkKGZsZCk7CisJCQkJRmxkUmVjYWxjdWxhdGVGaWVsZChmbGQsdHJ1ZSk7CisvLwkJCSB9CisvLwkJCSAgZWxzZQorLy8JCQkgICAgRnJtQWxlcnQoU29hcF9lcnJvckFsZXJ0KTsKKworCQkJCisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCQorCQl9CisJCisJcmV0dXJuIGhhbmRsZWQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIEFwcEhhbmRsZUV2ZW50CisgKgorICogREVTQ1JJUFRJT046IFRoaXMgcm91dGluZSBsb2FkcyBmb3JtIHJlc291cmNlcyBhbmQgc2V0IHRoZSBldmVudAorICogICAgICAgICAgICAgIGhhbmRsZXIgZm9yIHRoZSBmb3JtIGxvYWRlZC4KKyAqCisgKiBQQVJBTUVURVJTOiAgZXZlbnQgIC0gYSBwb2ludGVyIHRvIGFuIEV2ZW50VHlwZSBzdHJ1Y3R1cmUKKyAqCisgKiBSRVRVUk5FRDogICAgdHJ1ZSBpZiB0aGUgZXZlbnQgaGFzIGhhbmRsZSBhbmQgc2hvdWxkIG5vdCBiZSBwYXNzZWQKKyAqICAgICAgICAgICAgICB0byBhIGhpZ2hlciBsZXZlbCBoYW5kbGVyLgorICoKKyAqIFJFVklTSU9OIEhJU1RPUlk6CisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBCb29sZWFuIEFwcEhhbmRsZUV2ZW50KEV2ZW50UHRyIGV2ZW50UCkKK3sKKwlVSW50MTYgZm9ybUlkOworCUZvcm1QdHIgZnJtUDsKKworCWlmIChldmVudFAtPmVUeXBlID09IGZybUxvYWRFdmVudCkKKwkJeworCQkvLyBMb2FkIHRoZSBmb3JtIHJlc291cmNlLgorCQlmb3JtSWQgPSBldmVudFAtPmRhdGEuZnJtTG9hZC5mb3JtSUQ7CisJCWZybVAgPSBGcm1Jbml0Rm9ybShmb3JtSWQpOworCQlGcm1TZXRBY3RpdmVGb3JtKGZybVApOworCisJCS8vIFNldCB0aGUgZXZlbnQgaGFuZGxlciBmb3IgdGhlIGZvcm0uICBUaGUgaGFuZGxlciBvZiB0aGUgY3VycmVudGx5CisJCS8vIGFjdGl2ZSBmb3JtIGlzIGNhbGxlZCBieSBGcm1IYW5kbGVFdmVudCBlYWNoIHRpbWUgaXMgcmVjZWl2ZXMgYW4KKwkJLy8gZXZlbnQuCisJCXN3aXRjaCAoZm9ybUlkKQorCQkJeworCQkJY2FzZSBNYWluRm9ybToKKwkJCQlGcm1TZXRFdmVudEhhbmRsZXIoZnJtUCwgTWFpbkZvcm1IYW5kbGVFdmVudCk7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisvLwkJCQlFcnJGYXRhbERpc3BsYXkoIkludmFsaWQgRm9ybSBMb2FkIEV2ZW50Iik7CisJCQkJYnJlYWs7CisKKwkJCX0KKwkJcmV0dXJuIHRydWU7CisJCX0KKwkKKwlyZXR1cm4gZmFsc2U7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIEFwcEV2ZW50TG9vcAorICoKKyAqIERFU0NSSVBUSU9OOiBUaGlzIHJvdXRpbmUgaXMgdGhlIGV2ZW50IGxvb3AgZm9yIHRoZSBhcHBsaWNhdGlvbi4gIAorICoKKyAqIFBBUkFNRVRFUlM6ICBub3RoaW5nCisgKgorICogUkVUVVJORUQ6ICAgIG5vdGhpbmcKKyAqCisgKiBSRVZJU0lPTiBISVNUT1JZOgorICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBBcHBFdmVudExvb3Aodm9pZCkKK3sKKwlVSW50MTYgZXJyb3I7CisJRXZlbnRUeXBlIGV2ZW50OworCisJZG8geworCQlFdnRHZXRFdmVudCgmZXZlbnQsIGV2dFdhaXRGb3JldmVyKTsKKworCQlpZiAoISBTeXNIYW5kbGVFdmVudCgmZXZlbnQpKQorCQkJaWYgKCEgTWVudUhhbmRsZUV2ZW50KDAsICZldmVudCwgJmVycm9yKSkKKwkJCQlpZiAoISBBcHBIYW5kbGVFdmVudCgmZXZlbnQpKQorCQkJCQlGcm1EaXNwYXRjaEV2ZW50KCZldmVudCk7CisKKwl9IHdoaWxlIChldmVudC5lVHlwZSAhPSBhcHBTdG9wRXZlbnQpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICAgQXBwU3RhcnQKKyAqCisgKiBERVNDUklQVElPTjogIEdldCB0aGUgY3VycmVudCBhcHBsaWNhdGlvbidzIHByZWZlcmVuY2VzLgorICoKKyAqIFBBUkFNRVRFUlM6ICAgbm90aGluZworICoKKyAqIFJFVFVSTkVEOiAgICAgRXJyIHZhbHVlIDAgaWYgbm90aGluZyB3ZW50IHdyb25nCisgKgorICogUkVWSVNJT04gSElTVE9SWToKKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEVyciBBcHBTdGFydCh2b2lkKQoreworCVN0YXJ0ZXJQcmVmZXJlbmNlVHlwZSBwcmVmczsKKwlVSW50MTYgcHJlZnNTaXplOworCisJLy8gUmVhZCB0aGUgc2F2ZWQgcHJlZmVyZW5jZXMgLyBzYXZlZC1zdGF0ZSBpbmZvcm1hdGlvbi4KKwlwcmVmc1NpemUgPSBzaXplb2YoU3RhcnRlclByZWZlcmVuY2VUeXBlKTsKKwlpZiAoUHJlZkdldEFwcFByZWZlcmVuY2VzKGFwcEZpbGVDcmVhdG9yLCBhcHBQcmVmSUQsICZwcmVmcywgJnByZWZzU2l6ZSwgdHJ1ZSkgIT0gCisJCW5vUHJlZmVyZW5jZUZvdW5kKQorCQl7CisJCX0KKwkKKwlyZXR1cm4gZXJyTm9uZTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgQXBwU3RvcAorICoKKyAqIERFU0NSSVBUSU9OOiBTYXZlIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBhcHBsaWNhdGlvbi4KKyAqCisgKiBQQVJBTUVURVJTOiAgbm90aGluZworICoKKyAqIFJFVFVSTkVEOiAgICBub3RoaW5nCisgKgorICogUkVWSVNJT04gSElTVE9SWToKKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgQXBwU3RvcCh2b2lkKQoreworCVN0YXJ0ZXJQcmVmZXJlbmNlVHlwZSBwcmVmczsKKworCS8vIFdyaXRlIHRoZSBzYXZlZCBwcmVmZXJlbmNlcyAvIHNhdmVkLXN0YXRlIGluZm9ybWF0aW9uLiAgVGhpcyBkYXRhIAorCS8vIHdpbGwgc2F2ZWQgZHVyaW5nIGEgSG90U3luYyBiYWNrdXAuCisJUHJlZlNldEFwcFByZWZlcmVuY2VzIChhcHBGaWxlQ3JlYXRvciwgYXBwUHJlZklELCBhcHBQcmVmVmVyc2lvbk51bSwgCisJCSZwcmVmcywgc2l6ZW9mIChwcmVmcyksIHRydWUpOworCQkKKwkvLyBDbG9zZSBhbGwgdGhlIG9wZW4gZm9ybXMuCisJRnJtQ2xvc2VBbGxGb3JtcyAoKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgU3RhcnRlclBhbG1NYWluCisgKgorICogREVTQ1JJUFRJT046IFRoaXMgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSBhcHBsaWNhdGlvbi4KKyAqCisgKiBQQVJBTUVURVJTOiAgY21kIC0gd29yZCB2YWx1ZSBzcGVjaWZ5aW5nIHRoZSBsYXVuY2ggY29kZS4gCisgKiAgICAgICAgICAgICAgY21kUEIgLSBwb2ludGVyIHRvIGEgc3RydWN0dXJlIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBsYXVuY2ggY29kZS4gCisgKiAgICAgICAgICAgICAgbGF1bmNoRmxhZ3MgLSAgd29yZCB2YWx1ZSBwcm92aWRpbmcgZXh0cmEgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhdW5jaC4KKyAqCisgKiBSRVRVUk5FRDogICAgUmVzdWx0IG9mIGxhdW5jaAorICoKKyAqIFJFVklTSU9OIEhJU1RPUlk6CisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBVSW50MzIgU3RhcnRlclBhbG1NYWluKFVJbnQxNiBjbWQsIE1lbVB0ciBjbWRQQlAsIFVJbnQxNiBsYXVuY2hGbGFncykKK3sKKwlFcnIgZXJyb3I7CisKKwllcnJvciA9IFJvbVZlcnNpb25Db21wYXRpYmxlIChvdXJNaW5WZXJzaW9uLCBsYXVuY2hGbGFncyk7CisJaWYgKGVycm9yKSByZXR1cm4gKGVycm9yKTsKKworCXN3aXRjaCAoY21kKQorCQl7CisJCWNhc2Ugc3lzQXBwTGF1bmNoQ21kTm9ybWFsTGF1bmNoOgorCQkJZXJyb3IgPSBBcHBTdGFydCgpOworCQkJaWYgKGVycm9yKSAKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQkJCisJCQlGcm1Hb3RvRm9ybShNYWluRm9ybSk7CisJCQlBcHBFdmVudExvb3AoKTsKKwkJCUFwcFN0b3AoKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKworCQl9CisJCisJcmV0dXJuIGVyck5vbmU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIFBpbG90TWFpbgorICoKKyAqIERFU0NSSVBUSU9OOiBUaGlzIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgYXBwbGljYXRpb24uCisgKgorICogUEFSQU1FVEVSUzogIGNtZCAtIHdvcmQgdmFsdWUgc3BlY2lmeWluZyB0aGUgbGF1bmNoIGNvZGUuIAorICogICAgICAgICAgICAgIGNtZFBCIC0gcG9pbnRlciB0byBhIHN0cnVjdHVyZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGF1bmNoIGNvZGUuIAorICogICAgICAgICAgICAgIGxhdW5jaEZsYWdzIC0gIHdvcmQgdmFsdWUgcHJvdmlkaW5nIGV4dHJhIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsYXVuY2guCisgKiBSRVRVUk5FRDogICAgUmVzdWx0IG9mIGxhdW5jaAorICoKKyAqIFJFVklTSU9OIEhJU1RPUlk6CisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1VJbnQzMiBQaWxvdE1haW4oIFVJbnQxNiBjbWQsIE1lbVB0ciBjbWRQQlAsIFVJbnQxNiBsYXVuY2hGbGFncykKK3sKKworLy8gICBjaGFyIHJlc3VsdFs0MF07CitIb3N0VHJhY2VJbml0KCk7CisKKwlyZXR1cm4gU3RhcnRlclBhbG1NYWluKGNtZCwgY21kUEJQLCBsYXVuY2hGbGFncyk7Cit9CisKKworCisgIApkaWZmIC0tZ2l0IGEvZ3NvYXAtcGFsbS9zdG9ja3F1b3RlL3NyYy9xdW90ZS5oIGIvZ3NvYXAtcGFsbS9zdG9ja3F1b3RlL3NyYy9xdW90ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMTVlYmUKLS0tIC9kZXYvbnVsbAorKysgYi9nc29hcC1wYWxtL3N0b2NrcXVvdGUvc3JjL3F1b3RlLmgKQEAgLTAsMCArMSwyIEBACisvL2dzb2FwIG5zIHNjaGVtYSBuYW1lc3BhY2U6IHVybjp4bWV0aG9kcy1kZWxheWVkLXF1b3RlcworaW50IG5zX19nZXRRdW90ZShjaGFyICpzeW1ib2wsIGZsb2F0ICpSZXN1bHQpOwpkaWZmIC0tZ2l0IGEvZ3NvYXAtcGFsbS9zdG9ja3F1b3RlL3NyYy9zb2FwQy5jIGIvZ3NvYXAtcGFsbS9zdG9ja3F1b3RlL3NyYy9zb2FwQy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MmVkZmYKLS0tIC9kZXYvbnVsbAorKysgYi9nc29hcC1wYWxtL3N0b2NrcXVvdGUvc3JjL3NvYXBDLmMKQEAgLTAsMCArMSwxMzE5IEBACisvKiBzb2FwQy5jCisgICBHZW5lcmF0ZWQgYnkgZ1NPQVAgMi43LjZlIGZyb20gcXVvdGUuaAorICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICBUaGlzIHBhcnQgb2YgdGhlIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2VzOgorICAgR1BMLCB0aGUgZ1NPQVAgcHVibGljIGxpY2Vuc2UsIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKyovCisKKyNpbmNsdWRlICJzb2FwSC5oIgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitTT0FQX1NPVVJDRV9TVEFNUCgiQCgjKSBzb2FwQy5jIHZlciAyLjcuNmUgMjAwNi0wMi0xOSAxNjozODo1MiBHTVQiKQorCisKKyNpZm5kZWYgV0lUSF9OT0dMT0JBTAorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZWhlYWRlcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKwlpZiAoc29hcC0+aGVhZGVyKQorCQlzb2FwX3NlcmlhbGl6ZV9TT0FQX0VOVl9fSGVhZGVyKHNvYXAsIHNvYXAtPmhlYWRlcik7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRoZWFkZXIoc3RydWN0IHNvYXAgKnNvYXApCit7CisJaWYgKHNvYXAtPmhlYWRlcikKKwl7CXNvYXAtPnBhcnQgPSBTT0FQX0lOX0hFQURFUjsKKwkJc29hcF9vdXRfU09BUF9FTlZfX0hlYWRlcihzb2FwLCAiU09BUC1FTlY6SGVhZGVyIiwgMCwgc29hcC0+aGVhZGVyLCBOVUxMKTsKKwkJc29hcC0+cGFydCA9IFNPQVBfRU5EX0hFQURFUjsKKwl9CisJcmV0dXJuIFNPQVBfT0s7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9nZXRoZWFkZXIoc3RydWN0IHNvYXAgKnNvYXApCit7CisJc29hcC0+cGFydCA9IFNPQVBfSU5fSEVBREVSOworCXNvYXAtPmhlYWRlciA9IHNvYXBfaW5fU09BUF9FTlZfX0hlYWRlcihzb2FwLCAiU09BUC1FTlY6SGVhZGVyIiwgTlVMTCwgTlVMTCk7CisJc29hcC0+cGFydCA9IFNPQVBfRU5EX0hFQURFUjsKKwlyZXR1cm4gc29hcC0+aGVhZGVyID09IE5VTEw7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXApCit7CisJaWYgKCFzb2FwLT5mYXVsdCkKKwl7CXNvYXAtPmZhdWx0ID0gKHN0cnVjdCBTT0FQX0VOVl9fRmF1bHQqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3QgU09BUF9FTlZfX0ZhdWx0KSk7CisJCXNvYXBfZGVmYXVsdF9TT0FQX0VOVl9fRmF1bHQoc29hcCwgc29hcC0+ZmF1bHQpOworCX0KKwlpZiAoc29hcC0+dmVyc2lvbiA9PSAyICYmICFzb2FwLT5mYXVsdC0+U09BUF9FTlZfX0NvZGUpCisJewlzb2FwLT5mYXVsdC0+U09BUF9FTlZfX0NvZGUgPSAoc3RydWN0IFNPQVBfRU5WX19Db2RlKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IFNPQVBfRU5WX19Db2RlKSk7CisJCXNvYXBfZGVmYXVsdF9TT0FQX0VOVl9fQ29kZShzb2FwLCBzb2FwLT5mYXVsdC0+U09BUF9FTlZfX0NvZGUpOworCX0KKwlpZiAoc29hcC0+dmVyc2lvbiA9PSAyICYmICFzb2FwLT5mYXVsdC0+U09BUF9FTlZfX1JlYXNvbikKKwl7CXNvYXAtPmZhdWx0LT5TT0FQX0VOVl9fUmVhc29uID0gKHN0cnVjdCBTT0FQX0VOVl9fUmVhc29uKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IFNPQVBfRU5WX19SZWFzb24pKTsKKwkJc29hcF9kZWZhdWx0X1NPQVBfRU5WX19SZWFzb24oc29hcCwgc29hcC0+ZmF1bHQtPlNPQVBfRU5WX19SZWFzb24pOworCX0KK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVmYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKwlpZiAoc29hcC0+ZmF1bHQpCisJCXNvYXBfc2VyaWFsaXplX1NPQVBfRU5WX19GYXVsdChzb2FwLCBzb2FwLT5mYXVsdCk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRmYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKwlpZiAoc29hcC0+ZmF1bHQpCisJCXJldHVybiBzb2FwX3B1dF9TT0FQX0VOVl9fRmF1bHQoc29hcCwgc29hcC0+ZmF1bHQsICJTT0FQLUVOVjpGYXVsdCIsIE5VTEwpOworCXJldHVybiBTT0FQX09LOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfZ2V0ZmF1bHQoc3RydWN0IHNvYXAgKnNvYXApCit7CisJcmV0dXJuIChzb2FwLT5mYXVsdCA9IHNvYXBfZ2V0X1NPQVBfRU5WX19GYXVsdChzb2FwLCBOVUxMLCAiU09BUC1FTlY6RmF1bHQiLCBOVUxMKSkgPT0gTlVMTDsKK30KKworU09BUF9GTUFDMyBjb25zdCBjaGFyICoqIFNPQVBfRk1BQzQgc29hcF9mYXVsdGNvZGUoc3RydWN0IHNvYXAgKnNvYXApCit7CisJc29hcF9mYXVsdChzb2FwKTsKKwlpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorCQlyZXR1cm4gKGNvbnN0IGNoYXIqKikmc29hcC0+ZmF1bHQtPlNPQVBfRU5WX19Db2RlLT5TT0FQX0VOVl9fVmFsdWU7CisJcmV0dXJuIChjb25zdCBjaGFyKiopJnNvYXAtPmZhdWx0LT5mYXVsdGNvZGU7Cit9CisKK1NPQVBfRk1BQzMgY29uc3QgY2hhciAqKiBTT0FQX0ZNQUM0IHNvYXBfZmF1bHRzdWJjb2RlKHN0cnVjdCBzb2FwICpzb2FwKQoreworCXNvYXBfZmF1bHQoc29hcCk7CisJaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKwl7CWlmICghc29hcC0+ZmF1bHQtPlNPQVBfRU5WX19Db2RlLT5TT0FQX0VOVl9fU3ViY29kZSkKKwkJewlzb2FwLT5mYXVsdC0+U09BUF9FTlZfX0NvZGUtPlNPQVBfRU5WX19TdWJjb2RlID0gKHN0cnVjdCBTT0FQX0VOVl9fQ29kZSopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBTT0FQX0VOVl9fQ29kZSkpOworCQkJc29hcF9kZWZhdWx0X1NPQVBfRU5WX19Db2RlKHNvYXAsIHNvYXAtPmZhdWx0LT5TT0FQX0VOVl9fQ29kZS0+U09BUF9FTlZfX1N1YmNvZGUpOworCQl9CisJCXJldHVybiAoY29uc3QgY2hhcioqKSZzb2FwLT5mYXVsdC0+U09BUF9FTlZfX0NvZGUtPlNPQVBfRU5WX19TdWJjb2RlLT5TT0FQX0VOVl9fVmFsdWU7CisJfQorCXJldHVybiAoY29uc3QgY2hhcioqKSZzb2FwLT5mYXVsdC0+ZmF1bHRjb2RlOworfQorCitTT0FQX0ZNQUMzIGNvbnN0IGNoYXIgKiogU09BUF9GTUFDNCBzb2FwX2ZhdWx0c3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwKQoreworCXNvYXBfZmF1bHQoc29hcCk7CisJaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKwkJcmV0dXJuIChjb25zdCBjaGFyKiopJnNvYXAtPmZhdWx0LT5TT0FQX0VOVl9fUmVhc29uLT5TT0FQX0VOVl9fVGV4dDsKKwlyZXR1cm4gKGNvbnN0IGNoYXIqKikmc29hcC0+ZmF1bHQtPmZhdWx0c3RyaW5nOworfQorCitTT0FQX0ZNQUMzIGNvbnN0IGNoYXIgKiogU09BUF9GTUFDNCBzb2FwX2ZhdWx0ZGV0YWlsKHN0cnVjdCBzb2FwICpzb2FwKQoreworCXNvYXBfZmF1bHQoc29hcCk7CisJaWYgKHNvYXAtPnZlcnNpb24gPT0gMSkKKwl7CWlmICghc29hcC0+ZmF1bHQtPmRldGFpbCkKKwkJewlzb2FwLT5mYXVsdC0+ZGV0YWlsID0gKHN0cnVjdCBTT0FQX0VOVl9fRGV0YWlsKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IFNPQVBfRU5WX19EZXRhaWwpKTsKKwkJCXNvYXBfZGVmYXVsdF9TT0FQX0VOVl9fRGV0YWlsKHNvYXAsIHNvYXAtPmZhdWx0LT5kZXRhaWwpOworCQl9CisJCXJldHVybiAoY29uc3QgY2hhcioqKSZzb2FwLT5mYXVsdC0+ZGV0YWlsLT5fX2FueTsKKwl9CisJaWYgKCFzb2FwLT5mYXVsdC0+U09BUF9FTlZfX0RldGFpbCkKKwl7CXNvYXAtPmZhdWx0LT5TT0FQX0VOVl9fRGV0YWlsID0gKHN0cnVjdCBTT0FQX0VOVl9fRGV0YWlsKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IFNPQVBfRU5WX19EZXRhaWwpKTsKKwkJc29hcF9kZWZhdWx0X1NPQVBfRU5WX19EZXRhaWwoc29hcCwgc29hcC0+ZmF1bHQtPlNPQVBfRU5WX19EZXRhaWwpOworCX0KKwlyZXR1cm4gKGNvbnN0IGNoYXIqKikmc29hcC0+ZmF1bHQtPlNPQVBfRU5WX19EZXRhaWwtPl9fYW55OworfQorCisjZW5kaWYKKworI2lmbmRlZiBXSVRIX05PSURSRUYKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9nZXRpbmRlcGVuZGVudChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKwlpbnQgdDsKKwlmb3IgKDs7KQorCQlpZiAoIXNvYXBfZ2V0ZWxlbWVudChzb2FwLCAmdCkpCisJCQlpZiAoc29hcC0+ZXJyb3IgfHwgc29hcF9pZ25vcmVfZWxlbWVudChzb2FwKSkKKwkJCQlicmVhazsKKwlpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcgfHwgc29hcC0+ZXJyb3IgPT0gU09BUF9FT0YpCisJCXNvYXAtPmVycm9yID0gU09BUF9PSzsKKwlyZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX05PSURSRUYKK1NPQVBfRk1BQzMgdm9pZCAqIFNPQVBfRk1BQzQgc29hcF9nZXRlbGVtZW50KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgKnR5cGUpCit7CisJaWYgKHNvYXBfcGVla19lbGVtZW50KHNvYXApKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoISpzb2FwLT5pZCB8fCAhKCp0eXBlID0gc29hcF9sb29rdXBfdHlwZShzb2FwLCBzb2FwLT5pZCkpKQorCQkqdHlwZSA9IHNvYXBfbG9va3VwX3R5cGUoc29hcCwgc29hcC0+aHJlZik7CisJc3dpdGNoICgqdHlwZSkKKwl7CisJY2FzZSBTT0FQX1RZUEVfYnl0ZToKKwkJcmV0dXJuIHNvYXBfaW5fYnl0ZShzb2FwLCBOVUxMLCBOVUxMLCAieHNkOmJ5dGUiKTsKKwljYXNlIFNPQVBfVFlQRV9pbnQ6CisJCXJldHVybiBzb2FwX2luX2ludChzb2FwLCBOVUxMLCBOVUxMLCAieHNkOmludCIpOworCWNhc2UgU09BUF9UWVBFX2Zsb2F0OgorCQlyZXR1cm4gc29hcF9pbl9mbG9hdChzb2FwLCBOVUxMLCBOVUxMLCAieHNkOmZsb2F0Iik7CisJY2FzZSBTT0FQX1RZUEVfbnNfX2dldFF1b3RlOgorCQlyZXR1cm4gc29hcF9pbl9uc19fZ2V0UXVvdGUoc29hcCwgTlVMTCwgTlVMTCwgIm5zOmdldFF1b3RlIik7CisJY2FzZSBTT0FQX1RZUEVfbnNfX2dldFF1b3RlUmVzcG9uc2U6CisJCXJldHVybiBzb2FwX2luX25zX19nZXRRdW90ZVJlc3BvbnNlKHNvYXAsIE5VTEwsIE5VTEwsICJuczpnZXRRdW90ZVJlc3BvbnNlIik7CisJY2FzZSBTT0FQX1RZUEVfUG9pbnRlclRvZmxvYXQ6CisJCXJldHVybiBzb2FwX2luX1BvaW50ZXJUb2Zsb2F0KHNvYXAsIE5VTEwsIE5VTEwsICJ4c2Q6ZmxvYXQiKTsKKwljYXNlIFNPQVBfVFlQRV9fUU5hbWU6CisJewljaGFyICoqczsKKwkJcyA9IHNvYXBfaW5fX1FOYW1lKHNvYXAsIE5VTEwsIE5VTEwsICJRTmFtZSIpOworCQlyZXR1cm4gcyA/ICpzIDogTlVMTDsKKwl9CisJY2FzZSBTT0FQX1RZUEVfc3RyaW5nOgorCXsJY2hhciAqKnM7CisJCXMgPSBzb2FwX2luX3N0cmluZyhzb2FwLCBOVUxMLCBOVUxMLCAieHNkOnN0cmluZyIpOworCQlyZXR1cm4gcyA/ICpzIDogTlVMTDsKKwl9CisJZGVmYXVsdDoKKwl7CWNvbnN0IGNoYXIgKnQgPSBzb2FwLT50eXBlOworCQlpZiAoISp0KQorCQkJdCA9IHNvYXAtPnRhZzsKKwkJaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCB0LCAieHNkOmJ5dGUiKSkKKwkJewkqdHlwZSA9IFNPQVBfVFlQRV9ieXRlOworCQkJcmV0dXJuIHNvYXBfaW5fYnl0ZShzb2FwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwkJfQorCQlpZiAoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHQsICJ4c2Q6aW50IikpCisJCXsJKnR5cGUgPSBTT0FQX1RZUEVfaW50OworCQkJcmV0dXJuIHNvYXBfaW5faW50KHNvYXAsIE5VTEwsIE5VTEwsIE5VTEwpOworCQl9CisJCWlmICghc29hcF9tYXRjaF90YWcoc29hcCwgdCwgInhzZDpmbG9hdCIpKQorCQl7CSp0eXBlID0gU09BUF9UWVBFX2Zsb2F0OworCQkJcmV0dXJuIHNvYXBfaW5fZmxvYXQoc29hcCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJCX0KKwkJaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCB0LCAibnM6Z2V0UXVvdGUiKSkKKwkJewkqdHlwZSA9IFNPQVBfVFlQRV9uc19fZ2V0UXVvdGU7CisJCQlyZXR1cm4gc29hcF9pbl9uc19fZ2V0UXVvdGUoc29hcCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJCX0KKwkJaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCB0LCAibnM6Z2V0UXVvdGVSZXNwb25zZSIpKQorCQl7CSp0eXBlID0gU09BUF9UWVBFX25zX19nZXRRdW90ZVJlc3BvbnNlOworCQkJcmV0dXJuIHNvYXBfaW5fbnNfX2dldFF1b3RlUmVzcG9uc2Uoc29hcCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJCX0KKwkJaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCB0LCAiUU5hbWUiKSkKKwkJewljaGFyICoqczsKKwkJCSp0eXBlID0gU09BUF9UWVBFX19RTmFtZTsKKwkJCXMgPSBzb2FwX2luX19RTmFtZShzb2FwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwkJCXJldHVybiBzID8gKnMgOiBOVUxMOworCQl9CisJCWlmICghc29hcF9tYXRjaF90YWcoc29hcCwgdCwgInhzZDpzdHJpbmciKSkKKwkJewljaGFyICoqczsKKwkJCSp0eXBlID0gU09BUF9UWVBFX3N0cmluZzsKKwkJCXMgPSBzb2FwX2luX3N0cmluZyhzb2FwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwkJCXJldHVybiBzID8gKnMgOiBOVUxMOworCQl9CisJfQorCX0KKwlzb2FwLT5lcnJvciA9IFNPQVBfVEFHX01JU01BVENIOworCXJldHVybiBOVUxMOworfQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9pZ25vcmVfZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKwlpZiAoIXNvYXBfcGVla19lbGVtZW50KHNvYXApKQorCXsJaW50IHQ7CisJCWlmIChzb2FwLT5tdXN0VW5kZXJzdGFuZCAmJiAhc29hcC0+b3RoZXIpCisJCQlyZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX01VU1RVTkRFUlNUQU5EOworCQlpZiAoKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiBzb2FwLT5wYXJ0ICE9IFNPQVBfSU5fSEVBREVSKSB8fCAhc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dGFnLCAiU09BUC1FTlY6IikpCisJCQlyZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1RBR19NSVNNQVRDSDsKKwkJaWYgKCEqc29hcC0+aWQgfHwgIXNvYXBfZ2V0ZWxlbWVudChzb2FwLCAmdCkpCisJCXsJc29hcC0+cGVla2VkID0gMDsKKwkJCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVW5rbm93biBlbGVtZW50ICclcycgKGxldmVsPSV1LCAlZClcbiIsIHNvYXAtPnRhZywgc29hcC0+bGV2ZWwsIHNvYXAtPmJvZHkpKTsKKwkJCWlmIChzb2FwLT5maWdub3JlKQorCQkJCXNvYXAtPmVycm9yID0gc29hcC0+Zmlnbm9yZShzb2FwLCBzb2FwLT50YWcpOworCQkJZWxzZQorCQkJCXNvYXAtPmVycm9yID0gU09BUF9PSzsKKwkJCURCR0xPRyhURVNULCBpZiAoIXNvYXAtPmVycm9yKSBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSUdOT1JJTkcgZWxlbWVudCAnJXMnXG4iLCBzb2FwLT50YWcpKTsKKwkJCWlmICghc29hcC0+ZXJyb3IgJiYgc29hcC0+Ym9keSkKKwkJCXsJc29hcC0+bGV2ZWwrKzsKKwkJCQl3aGlsZSAoIXNvYXBfaWdub3JlX2VsZW1lbnQoc29hcCkpCisJCQkJCTsKKwkJCQlpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcpCisJCQkJCXNvYXAtPmVycm9yID0gc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCBOVUxMKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0aW5kZXBlbmRlbnQoc3RydWN0IHNvYXAgKnNvYXApCit7CisJaW50IGk7CisJc3RydWN0IHNvYXBfcGxpc3QgKnBwOworCWlmIChzb2FwLT52ZXJzaW9uID09IDEgJiYgc29hcC0+ZW5jb2RpbmdTdHlsZSAmJiAhKHNvYXAtPm1vZGUgJiAoU09BUF9YTUxfVFJFRSB8IFNPQVBfWE1MX0dSQVBIKSkpCisJCWZvciAoaSA9IDA7IGkgPCBTT0FQX1BUUkhBU0g7IGkrKykKKwkJCWZvciAocHAgPSBzb2FwLT5waHRbaV07IHBwOyBwcCA9IHBwLT5uZXh0KQorCQkJCWlmIChwcC0+bWFyazEgPT0gMiB8fCBwcC0+bWFyazIgPT0gMikKKwkJCQkJaWYgKHNvYXBfcHV0ZWxlbWVudChzb2FwLCBwcC0+cHRyLCAiaWQiLCBwcC0+aWQsIHBwLT50eXBlKSkKKwkJCQkJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dGVsZW1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnB0ciwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGludCB0eXBlKQoreworCXN3aXRjaCAodHlwZSkKKwl7CisJY2FzZSBTT0FQX1RZUEVfYnl0ZToKKwkJcmV0dXJuIHNvYXBfb3V0X2J5dGUoc29hcCwgdGFnLCBpZCwgKGNvbnN0IGNoYXIgKilwdHIsICJ4c2Q6Ynl0ZSIpOworCWNhc2UgU09BUF9UWVBFX2ludDoKKwkJcmV0dXJuIHNvYXBfb3V0X2ludChzb2FwLCB0YWcsIGlkLCAoY29uc3QgaW50ICopcHRyLCAieHNkOmludCIpOworCWNhc2UgU09BUF9UWVBFX2Zsb2F0OgorCQlyZXR1cm4gc29hcF9vdXRfZmxvYXQoc29hcCwgdGFnLCBpZCwgKGNvbnN0IGZsb2F0ICopcHRyLCAieHNkOmZsb2F0Iik7CisJY2FzZSBTT0FQX1RZUEVfbnNfX2dldFF1b3RlOgorCQlyZXR1cm4gc29hcF9vdXRfbnNfX2dldFF1b3RlKHNvYXAsIHRhZywgaWQsIChjb25zdCBzdHJ1Y3QgbnNfX2dldFF1b3RlICopcHRyLCAibnM6Z2V0UXVvdGUiKTsKKwljYXNlIFNPQVBfVFlQRV9uc19fZ2V0UXVvdGVSZXNwb25zZToKKwkJcmV0dXJuIHNvYXBfb3V0X25zX19nZXRRdW90ZVJlc3BvbnNlKHNvYXAsIHRhZywgaWQsIChjb25zdCBzdHJ1Y3QgbnNfX2dldFF1b3RlUmVzcG9uc2UgKilwdHIsICJuczpnZXRRdW90ZVJlc3BvbnNlIik7CisJY2FzZSBTT0FQX1RZUEVfUG9pbnRlclRvZmxvYXQ6CisJCXJldHVybiBzb2FwX291dF9Qb2ludGVyVG9mbG9hdChzb2FwLCB0YWcsIGlkLCAoZmxvYXQgKmNvbnN0KilwdHIsICJ4c2Q6ZmxvYXQiKTsKKwljYXNlIFNPQVBfVFlQRV9fUU5hbWU6CisJCXJldHVybiBzb2FwX291dF9zdHJpbmcoc29hcCwgIlFOYW1lIiwgaWQsIChjaGFyKiopJnB0ciwgTlVMTCk7CisJY2FzZSBTT0FQX1RZUEVfc3RyaW5nOgorCQlyZXR1cm4gc29hcF9vdXRfc3RyaW5nKHNvYXAsIHRhZywgaWQsIChjaGFyKiopJnB0ciwgInhzZDpzdHJpbmciKTsKKwl9CisJcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX05PSURSRUYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfbWFya2VsZW1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnB0ciwgaW50IHR5cGUpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpcHRyOyAodm9pZCl0eXBlOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8KKwlzd2l0Y2ggKHR5cGUpCisJeworCWNhc2UgU09BUF9UWVBFX25zX19nZXRRdW90ZToKKwkJc29hcF9zZXJpYWxpemVfbnNfX2dldFF1b3RlKHNvYXAsIChjb25zdCBzdHJ1Y3QgbnNfX2dldFF1b3RlICopcHRyKTsKKwkJYnJlYWs7CisJY2FzZSBTT0FQX1RZUEVfbnNfX2dldFF1b3RlUmVzcG9uc2U6CisJCXNvYXBfc2VyaWFsaXplX25zX19nZXRRdW90ZVJlc3BvbnNlKHNvYXAsIChjb25zdCBzdHJ1Y3QgbnNfX2dldFF1b3RlUmVzcG9uc2UgKilwdHIpOworCQlicmVhazsKKwljYXNlIFNPQVBfVFlQRV9Qb2ludGVyVG9mbG9hdDoKKwkJc29hcF9zZXJpYWxpemVfUG9pbnRlclRvZmxvYXQoc29hcCwgKGZsb2F0ICpjb25zdCopcHRyKTsKKwkJYnJlYWs7CisJY2FzZSBTT0FQX1RZUEVfX1FOYW1lOgorCQlzb2FwX3NlcmlhbGl6ZV9zdHJpbmcoc29hcCwgKGNoYXIqKikmcHRyKTsKKwkJYnJlYWs7CisJY2FzZSBTT0FQX1RZUEVfc3RyaW5nOgorCQlzb2FwX3NlcmlhbGl6ZV9zdHJpbmcoc29hcCwgKGNoYXIqKikmcHRyKTsKKwkJYnJlYWs7CisJfQorfQorI2VuZGlmCisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9ieXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICphKQorewkodm9pZClzb2FwOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8KKyNpZmRlZiBTT0FQX0RFRkFVTFRfYnl0ZQorCSphID0gU09BUF9ERUZBVUxUX2J5dGU7CisjZWxzZQorCSphID0gKGNoYXIpMDsKKyNlbmRpZgorfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X2J5dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZWdpc3RlciBpbnQgaWQgPSBzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCBOVUxMLCAwLCB0YWcsIFNPQVBfVFlQRV9ieXRlKTsKKwlpZiAoc29hcF9vdXRfYnl0ZShzb2FwLCB0YWcsIGlkLCBhLCB0eXBlKSkKKwkJcmV0dXJuIHNvYXAtPmVycm9yOworCXJldHVybiBzb2FwX3B1dGluZGVwZW5kZW50KHNvYXApOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X2J5dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXJldHVybiBzb2FwX291dGJ5dGUoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSwgU09BUF9UWVBFX2J5dGUpOworfQorCitTT0FQX0ZNQUMzIGNoYXIgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X2J5dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoKHAgPSBzb2FwX2luX2J5dGUoc29hcCwgdGFnLCBwLCB0eXBlKSkpCisJCXNvYXBfZ2V0aW5kZXBlbmRlbnQoc29hcCk7CisJcmV0dXJuIHA7Cit9CisKK1NPQVBfRk1BQzMgY2hhciAqIFNPQVBfRk1BQzQgc29hcF9pbl9ieXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGNoYXIgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmV0dXJuIHNvYXBfaW5ieXRlKHNvYXAsIHRhZywgYSwgdHlwZSwgU09BUF9UWVBFX2J5dGUpOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfaW50KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgKmEpCit7CSh2b2lkKXNvYXA7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLworI2lmZGVmIFNPQVBfREVGQVVMVF9pbnQKKwkqYSA9IFNPQVBfREVGQVVMVF9pbnQ7CisjZWxzZQorCSphID0gKGludCkwOworI2VuZGlmCit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfaW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBpbnQgKmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZWdpc3RlciBpbnQgaWQgPSBzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCBOVUxMLCAwLCB0YWcsIFNPQVBfVFlQRV9pbnQpOworCWlmIChzb2FwX291dF9pbnQoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9pbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBpbnQgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmV0dXJuIHNvYXBfb3V0aW50KHNvYXAsIHRhZywgaWQsIGEsIHR5cGUsIFNPQVBfVFlQRV9pbnQpOworfQorCitTT0FQX0ZNQUMzIGludCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfaW50KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgKnAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoKHAgPSBzb2FwX2luX2ludChzb2FwLCB0YWcsIHAsIHR5cGUpKSkKKwkJc29hcF9nZXRpbmRlcGVuZGVudChzb2FwKTsKKwlyZXR1cm4gcDsKK30KKworU09BUF9GTUFDMyBpbnQgKiBTT0FQX0ZNQUM0IHNvYXBfaW5faW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZXR1cm4gc29hcF9pbmludChzb2FwLCB0YWcsIGEsIHR5cGUsIFNPQVBfVFlQRV9pbnQpOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfZmxvYXQoc3RydWN0IHNvYXAgKnNvYXAsIGZsb2F0ICphKQorewkodm9pZClzb2FwOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8KKyNpZmRlZiBTT0FQX0RFRkFVTFRfZmxvYXQKKwkqYSA9IFNPQVBfREVGQVVMVF9mbG9hdDsKKyNlbHNlCisJKmEgPSAoZmxvYXQpMDsKKyNlbmRpZgorfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X2Zsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBmbG9hdCAqYSwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCXJlZ2lzdGVyIGludCBpZCA9IHNvYXBfZW1iZWQoc29hcCwgKHZvaWQqKWEsIE5VTEwsIDAsIHRhZywgU09BUF9UWVBFX2Zsb2F0KTsKKwlpZiAoc29hcF9vdXRfZmxvYXQoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9mbG9hdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGZsb2F0ICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXJldHVybiBzb2FwX291dGZsb2F0KHNvYXAsIHRhZywgaWQsIGEsIHR5cGUsIFNPQVBfVFlQRV9mbG9hdCk7Cit9CisKK1NPQVBfRk1BQzMgZmxvYXQgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X2Zsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBmbG9hdCAqcCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmICgocCA9IHNvYXBfaW5fZmxvYXQoc29hcCwgdGFnLCBwLCB0eXBlKSkpCisJCXNvYXBfZ2V0aW5kZXBlbmRlbnQoc29hcCk7CisJcmV0dXJuIHA7Cit9CisKK1NPQVBfRk1BQzMgZmxvYXQgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fZmxvYXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgZmxvYXQgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmV0dXJuIHNvYXBfaW5mbG9hdChzb2FwLCB0YWcsIGEsIHR5cGUsIFNPQVBfVFlQRV9mbG9hdCk7Cit9CisKKyNpZm5kZWYgV0lUSF9OT0dMT0JBTAorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9TT0FQX0VOVl9fRmF1bHQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBTT0FQX0VOVl9fRmF1bHQgKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisJc29hcF9zZXJpYWxpemVfX1FOYW1lKHNvYXAsICZhLT5mYXVsdGNvZGUpOworCXNvYXBfc2VyaWFsaXplX3N0cmluZyhzb2FwLCAmYS0+ZmF1bHRzdHJpbmcpOworCXNvYXBfc2VyaWFsaXplX3N0cmluZyhzb2FwLCAmYS0+ZmF1bHRhY3Rvcik7CisJc29hcF9zZXJpYWxpemVfUG9pbnRlclRvU09BUF9FTlZfX0RldGFpbChzb2FwLCAmYS0+ZGV0YWlsKTsKKwlzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG9TT0FQX0VOVl9fQ29kZShzb2FwLCAmYS0+U09BUF9FTlZfX0NvZGUpOworCXNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb1NPQVBfRU5WX19SZWFzb24oc29hcCwgJmEtPlNPQVBfRU5WX19SZWFzb24pOworCXNvYXBfc2VyaWFsaXplX3N0cmluZyhzb2FwLCAmYS0+U09BUF9FTlZfX05vZGUpOworCXNvYXBfc2VyaWFsaXplX3N0cmluZyhzb2FwLCAmYS0+U09BUF9FTlZfX1JvbGUpOworCXNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb1NPQVBfRU5WX19EZXRhaWwoc29hcCwgJmEtPlNPQVBfRU5WX19EZXRhaWwpOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfU09BUF9FTlZfX0ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgU09BUF9FTlZfX0ZhdWx0ICphKQoreworCSh2b2lkKXNvYXA7ICh2b2lkKWE7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLworCXNvYXBfZGVmYXVsdF9fUU5hbWUoc29hcCwgJmEtPmZhdWx0Y29kZSk7CisJc29hcF9kZWZhdWx0X3N0cmluZyhzb2FwLCAmYS0+ZmF1bHRzdHJpbmcpOworCXNvYXBfZGVmYXVsdF9zdHJpbmcoc29hcCwgJmEtPmZhdWx0YWN0b3IpOworCWEtPmRldGFpbCA9IE5VTEw7CisJYS0+U09BUF9FTlZfX0NvZGUgPSBOVUxMOworCWEtPlNPQVBfRU5WX19SZWFzb24gPSBOVUxMOworCXNvYXBfZGVmYXVsdF9zdHJpbmcoc29hcCwgJmEtPlNPQVBfRU5WX19Ob2RlKTsKKwlzb2FwX2RlZmF1bHRfc3RyaW5nKHNvYXAsICZhLT5TT0FQX0VOVl9fUm9sZSk7CisJYS0+U09BUF9FTlZfX0RldGFpbCA9IE5VTEw7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfU09BUF9FTlZfX0ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3QgU09BUF9FTlZfX0ZhdWx0ICphLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmVnaXN0ZXIgaW50IGlkID0gc29hcF9lbWJlZChzb2FwLCAodm9pZCopYSwgTlVMTCwgMCwgdGFnLCBTT0FQX1RZUEVfU09BUF9FTlZfX0ZhdWx0KTsKKwlpZiAoc29hcF9vdXRfU09BUF9FTlZfX0ZhdWx0KHNvYXAsIHRhZywgaWQsIGEsIHR5cGUpKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJcmV0dXJuIHNvYXBfcHV0aW5kZXBlbmRlbnQoc29hcCk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfU09BUF9FTlZfX0ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgc3RydWN0IFNPQVBfRU5WX19GYXVsdCAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwljb25zdCBjaGFyICpzb2FwX3RtcF9mYXVsdGNvZGUgPSBzb2FwX1FOYW1lMnMoc29hcCwgYS0+ZmF1bHRjb2RlKTsKKwlzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgYSwgU09BUF9UWVBFX1NPQVBfRU5WX19GYXVsdCksIHR5cGUpOworCXNvYXBfb3V0X19RTmFtZShzb2FwLCAiZmF1bHRjb2RlIiwgLTEsIChjaGFyKmNvbnN0Kikmc29hcF90bXBfZmF1bHRjb2RlLCAiIik7CisJc29hcF9vdXRfc3RyaW5nKHNvYXAsICJmYXVsdHN0cmluZyIsIC0xLCAmYS0+ZmF1bHRzdHJpbmcsICIiKTsKKwlzb2FwX291dF9zdHJpbmcoc29hcCwgImZhdWx0YWN0b3IiLCAtMSwgJmEtPmZhdWx0YWN0b3IsICIiKTsKKwlzb2FwX291dF9Qb2ludGVyVG9TT0FQX0VOVl9fRGV0YWlsKHNvYXAsICJkZXRhaWwiLCAtMSwgJmEtPmRldGFpbCwgIiIpOworCXNvYXBfb3V0X1BvaW50ZXJUb1NPQVBfRU5WX19Db2RlKHNvYXAsICJTT0FQLUVOVjpDb2RlIiwgLTEsICZhLT5TT0FQX0VOVl9fQ29kZSwgIiIpOworCXNvYXBfb3V0X1BvaW50ZXJUb1NPQVBfRU5WX19SZWFzb24oc29hcCwgIlNPQVAtRU5WOlJlYXNvbiIsIC0xLCAmYS0+U09BUF9FTlZfX1JlYXNvbiwgIiIpOworCXNvYXBfb3V0X3N0cmluZyhzb2FwLCAiU09BUC1FTlY6Tm9kZSIsIC0xLCAmYS0+U09BUF9FTlZfX05vZGUsICIiKTsKKwlzb2FwX291dF9zdHJpbmcoc29hcCwgIlNPQVAtRU5WOlJvbGUiLCAtMSwgJmEtPlNPQVBfRU5WX19Sb2xlLCAiIik7CisJc29hcF9vdXRfUG9pbnRlclRvU09BUF9FTlZfX0RldGFpbChzb2FwLCAiU09BUC1FTlY6RGV0YWlsIiwgLTEsICZhLT5TT0FQX0VOVl9fRGV0YWlsLCAiIik7CisJc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKKwlyZXR1cm4gU09BUF9PSzsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgU09BUF9FTlZfX0ZhdWx0ICogU09BUF9GTUFDNCBzb2FwX2dldF9TT0FQX0VOVl9fRmF1bHQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBTT0FQX0VOVl9fRmF1bHQgKnAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoKHAgPSBzb2FwX2luX1NPQVBfRU5WX19GYXVsdChzb2FwLCB0YWcsIHAsIHR5cGUpKSkKKwkJc29hcF9nZXRpbmRlcGVuZGVudChzb2FwKTsKKwlyZXR1cm4gcDsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgU09BUF9FTlZfX0ZhdWx0ICogU09BUF9GTUFDNCBzb2FwX2luX1NPQVBfRU5WX19GYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzdHJ1Y3QgU09BUF9FTlZfX0ZhdWx0ICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXNob3J0IHNvYXBfZmxhZ19mYXVsdGNvZGUgPSAxLCBzb2FwX2ZsYWdfZmF1bHRzdHJpbmcgPSAxLCBzb2FwX2ZsYWdfZmF1bHRhY3RvciA9IDEsIHNvYXBfZmxhZ19kZXRhaWwgPSAxLCBzb2FwX2ZsYWdfU09BUF9FTlZfX0NvZGUgPSAxLCBzb2FwX2ZsYWdfU09BUF9FTlZfX1JlYXNvbiA9IDEsIHNvYXBfZmxhZ19TT0FQX0VOVl9fTm9kZSA9IDEsIHNvYXBfZmxhZ19TT0FQX0VOVl9fUm9sZSA9IDEsIHNvYXBfZmxhZ19TT0FQX0VOVl9fRGV0YWlsID0gMTsKKwlpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisJCXJldHVybiBOVUxMOworCWlmICgqc29hcC0+dHlwZSAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKSkKKwl7CXNvYXAtPmVycm9yID0gU09BUF9UWVBFOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYSA9IChzdHJ1Y3QgU09BUF9FTlZfX0ZhdWx0ICopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgYSwgU09BUF9UWVBFX1NPQVBfRU5WX19GYXVsdCwgc2l6ZW9mKHN0cnVjdCBTT0FQX0VOVl9fRmF1bHQpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwlpZiAoIWEpCisJCXJldHVybiBOVUxMOworCXNvYXBfZGVmYXVsdF9TT0FQX0VOVl9fRmF1bHQoc29hcCwgYSk7CisJaWYgKHNvYXAtPmJvZHkgJiYgISpzb2FwLT5ocmVmKQorCXsKKwkJZm9yICg7OykKKwkJewlzb2FwLT5lcnJvciA9IFNPQVBfVEFHX01JU01BVENIOworCQkJaWYgKHNvYXBfZmxhZ19mYXVsdGNvZGUgJiYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIIHx8IHNvYXAtPmVycm9yID09IFNPQVBfTk9fVEFHKSkKKwkJCQlpZiAoc29hcF9pbl9fUU5hbWUoc29hcCwgImZhdWx0Y29kZSIsICZhLT5mYXVsdGNvZGUsICIiKSkKKwkJCQl7CXNvYXBfZmxhZ19mYXVsdGNvZGUtLTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXBfZmxhZ19mYXVsdHN0cmluZyAmJiAoc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0ggfHwgc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcpKQorCQkJCWlmIChzb2FwX2luX3N0cmluZyhzb2FwLCAiZmF1bHRzdHJpbmciLCAmYS0+ZmF1bHRzdHJpbmcsICJ4c2Q6c3RyaW5nIikpCisJCQkJewlzb2FwX2ZsYWdfZmF1bHRzdHJpbmctLTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXBfZmxhZ19mYXVsdGFjdG9yICYmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCB8fCBzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykpCisJCQkJaWYgKHNvYXBfaW5fc3RyaW5nKHNvYXAsICJmYXVsdGFjdG9yIiwgJmEtPmZhdWx0YWN0b3IsICJ4c2Q6c3RyaW5nIikpCisJCQkJewlzb2FwX2ZsYWdfZmF1bHRhY3Rvci0tOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQlpZiAoc29hcF9mbGFnX2RldGFpbCAmJiBzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlpZiAoc29hcF9pbl9Qb2ludGVyVG9TT0FQX0VOVl9fRGV0YWlsKHNvYXAsICJkZXRhaWwiLCAmYS0+ZGV0YWlsLCAiIikpCisJCQkJewlzb2FwX2ZsYWdfZGV0YWlsLS07CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCWlmIChzb2FwX2ZsYWdfU09BUF9FTlZfX0NvZGUgJiYgc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJaWYgKHNvYXBfaW5fUG9pbnRlclRvU09BUF9FTlZfX0NvZGUoc29hcCwgIlNPQVAtRU5WOkNvZGUiLCAmYS0+U09BUF9FTlZfX0NvZGUsICIiKSkKKwkJCQl7CXNvYXBfZmxhZ19TT0FQX0VOVl9fQ29kZS0tOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQlpZiAoc29hcF9mbGFnX1NPQVBfRU5WX19SZWFzb24gJiYgc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJaWYgKHNvYXBfaW5fUG9pbnRlclRvU09BUF9FTlZfX1JlYXNvbihzb2FwLCAiU09BUC1FTlY6UmVhc29uIiwgJmEtPlNPQVBfRU5WX19SZWFzb24sICIiKSkKKwkJCQl7CXNvYXBfZmxhZ19TT0FQX0VOVl9fUmVhc29uLS07CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCWlmIChzb2FwX2ZsYWdfU09BUF9FTlZfX05vZGUgJiYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIIHx8IHNvYXAtPmVycm9yID09IFNPQVBfTk9fVEFHKSkKKwkJCQlpZiAoc29hcF9pbl9zdHJpbmcoc29hcCwgIlNPQVAtRU5WOk5vZGUiLCAmYS0+U09BUF9FTlZfX05vZGUsICJ4c2Q6c3RyaW5nIikpCisJCQkJewlzb2FwX2ZsYWdfU09BUF9FTlZfX05vZGUtLTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXBfZmxhZ19TT0FQX0VOVl9fUm9sZSAmJiAoc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0ggfHwgc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcpKQorCQkJCWlmIChzb2FwX2luX3N0cmluZyhzb2FwLCAiU09BUC1FTlY6Um9sZSIsICZhLT5TT0FQX0VOVl9fUm9sZSwgInhzZDpzdHJpbmciKSkKKwkJCQl7CXNvYXBfZmxhZ19TT0FQX0VOVl9fUm9sZS0tOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQlpZiAoc29hcF9mbGFnX1NPQVBfRU5WX19EZXRhaWwgJiYgc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJaWYgKHNvYXBfaW5fUG9pbnRlclRvU09BUF9FTlZfX0RldGFpbChzb2FwLCAiU09BUC1FTlY6RGV0YWlsIiwgJmEtPlNPQVBfRU5WX19EZXRhaWwsICIiKSkKKwkJCQl7CXNvYXBfZmxhZ19TT0FQX0VOVl9fRGV0YWlsLS07CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlzb2FwLT5lcnJvciA9IHNvYXBfaWdub3JlX2VsZW1lbnQoc29hcCk7CisJCQlpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcpCisJCQkJYnJlYWs7CisJCQlpZiAoc29hcC0+ZXJyb3IpCisJCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwllbHNlCisJewlhID0gKHN0cnVjdCBTT0FQX0VOVl9fRmF1bHQgKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilhLCAwLCBTT0FQX1RZUEVfU09BUF9FTlZfX0ZhdWx0LCAwLCBzaXplb2Yoc3RydWN0IFNPQVBfRU5WX19GYXVsdCksIDAsIE5VTEwpOworCQlpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGE7Cit9CisKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9HTE9CQUwKKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfU09BUF9FTlZfX1JlYXNvbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IFNPQVBfRU5WX19SZWFzb24gKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisJc29hcF9zZXJpYWxpemVfc3RyaW5nKHNvYXAsICZhLT5TT0FQX0VOVl9fVGV4dCk7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9TT0FQX0VOVl9fUmVhc29uKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgU09BUF9FTlZfX1JlYXNvbiAqYSkKK3sKKwkodm9pZClzb2FwOyAodm9pZClhOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8KKwlzb2FwX2RlZmF1bHRfc3RyaW5nKHNvYXAsICZhLT5TT0FQX0VOVl9fVGV4dCk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfU09BUF9FTlZfX1JlYXNvbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IFNPQVBfRU5WX19SZWFzb24gKmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZWdpc3RlciBpbnQgaWQgPSBzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCBOVUxMLCAwLCB0YWcsIFNPQVBfVFlQRV9TT0FQX0VOVl9fUmVhc29uKTsKKwlpZiAoc29hcF9vdXRfU09BUF9FTlZfX1JlYXNvbihzb2FwLCB0YWcsIGlkLCBhLCB0eXBlKSkKKwkJcmV0dXJuIHNvYXAtPmVycm9yOworCXJldHVybiBzb2FwX3B1dGluZGVwZW5kZW50KHNvYXApOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1NPQVBfRU5WX19SZWFzb24oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzdHJ1Y3QgU09BUF9FTlZfX1JlYXNvbiAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgYSwgU09BUF9UWVBFX1NPQVBfRU5WX19SZWFzb24pLCB0eXBlKTsKKwlzb2FwX291dF9zdHJpbmcoc29hcCwgIlNPQVAtRU5WOlRleHQiLCAtMSwgJmEtPlNPQVBfRU5WX19UZXh0LCAiIik7CisJc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKKwlyZXR1cm4gU09BUF9PSzsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgU09BUF9FTlZfX1JlYXNvbiAqIFNPQVBfRk1BQzQgc29hcF9nZXRfU09BUF9FTlZfX1JlYXNvbihzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IFNPQVBfRU5WX19SZWFzb24gKnAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoKHAgPSBzb2FwX2luX1NPQVBfRU5WX19SZWFzb24oc29hcCwgdGFnLCBwLCB0eXBlKSkpCisJCXNvYXBfZ2V0aW5kZXBlbmRlbnQoc29hcCk7CisJcmV0dXJuIHA7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IFNPQVBfRU5WX19SZWFzb24gKiBTT0FQX0ZNQUM0IHNvYXBfaW5fU09BUF9FTlZfX1JlYXNvbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzdHJ1Y3QgU09BUF9FTlZfX1JlYXNvbiAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlzaG9ydCBzb2FwX2ZsYWdfU09BUF9FTlZfX1RleHQgPSAxOworCWlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCpzb2FwLT50eXBlICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpKQorCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisJCXJldHVybiBOVUxMOworCX0KKwlhID0gKHN0cnVjdCBTT0FQX0VOVl9fUmVhc29uICopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgYSwgU09BUF9UWVBFX1NPQVBfRU5WX19SZWFzb24sIHNpemVvZihzdHJ1Y3QgU09BUF9FTlZfX1JlYXNvbiksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworCWlmICghYSkKKwkJcmV0dXJuIE5VTEw7CisJc29hcF9kZWZhdWx0X1NPQVBfRU5WX19SZWFzb24oc29hcCwgYSk7CisJaWYgKHNvYXAtPmJvZHkgJiYgISpzb2FwLT5ocmVmKQorCXsKKwkJZm9yICg7OykKKwkJewlzb2FwLT5lcnJvciA9IFNPQVBfVEFHX01JU01BVENIOworCQkJaWYgKHNvYXBfZmxhZ19TT0FQX0VOVl9fVGV4dCAmJiAoc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0ggfHwgc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcpKQorCQkJCWlmIChzb2FwX2luX3N0cmluZyhzb2FwLCAiU09BUC1FTlY6VGV4dCIsICZhLT5TT0FQX0VOVl9fVGV4dCwgInhzZDpzdHJpbmciKSkKKwkJCQl7CXNvYXBfZmxhZ19TT0FQX0VOVl9fVGV4dC0tOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQlpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJc29hcC0+ZXJyb3IgPSBzb2FwX2lnbm9yZV9lbGVtZW50KHNvYXApOworCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfTk9fVEFHKQorCQkJCWJyZWFrOworCQkJaWYgKHNvYXAtPmVycm9yKQorCQkJCXJldHVybiBOVUxMOworCQl9CisJCWlmIChzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJZWxzZQorCXsJYSA9IChzdHJ1Y3QgU09BUF9FTlZfX1JlYXNvbiAqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCAodm9pZCoqKWEsIDAsIFNPQVBfVFlQRV9TT0FQX0VOVl9fUmVhc29uLCAwLCBzaXplb2Yoc3RydWN0IFNPQVBfRU5WX19SZWFzb24pLCAwLCBOVUxMKTsKKwkJaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBhOworfQorCisjZW5kaWYKKworI2lmbmRlZiBXSVRIX05PR0xPQkFMCisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1NPQVBfRU5WX19EZXRhaWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBTT0FQX0VOVl9fRGV0YWlsICphKQoreworCSh2b2lkKXNvYXA7ICh2b2lkKWE7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLworCXNvYXBfbWFya2VsZW1lbnQoc29hcCwgYS0+ZmF1bHQsIGEtPl9fdHlwZSk7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9TT0FQX0VOVl9fRGV0YWlsKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgU09BUF9FTlZfX0RldGFpbCAqYSkKK3sKKwkodm9pZClzb2FwOyAodm9pZClhOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8KKwlhLT5fX3R5cGUgPSAwOworCWEtPmZhdWx0ID0gTlVMTDsKKwlhLT5fX2FueSA9IE5VTEw7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfU09BUF9FTlZfX0RldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IFNPQVBfRU5WX19EZXRhaWwgKmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZWdpc3RlciBpbnQgaWQgPSBzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCBOVUxMLCAwLCB0YWcsIFNPQVBfVFlQRV9TT0FQX0VOVl9fRGV0YWlsKTsKKwlpZiAoc29hcF9vdXRfU09BUF9FTlZfX0RldGFpbChzb2FwLCB0YWcsIGlkLCBhLCB0eXBlKSkKKwkJcmV0dXJuIHNvYXAtPmVycm9yOworCXJldHVybiBzb2FwX3B1dGluZGVwZW5kZW50KHNvYXApOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1NPQVBfRU5WX19EZXRhaWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzdHJ1Y3QgU09BUF9FTlZfX0RldGFpbCAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgYSwgU09BUF9UWVBFX1NPQVBfRU5WX19EZXRhaWwpLCB0eXBlKTsKKwlzb2FwX3B1dGVsZW1lbnQoc29hcCwgYS0+ZmF1bHQsICJmYXVsdCIsIC0xLCBhLT5fX3R5cGUpOworCXNvYXBfb3V0bGl0ZXJhbChzb2FwLCAiLWFueSIsICZhLT5fX2FueSk7CisJc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKKwlyZXR1cm4gU09BUF9PSzsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgU09BUF9FTlZfX0RldGFpbCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfU09BUF9FTlZfX0RldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IFNPQVBfRU5WX19EZXRhaWwgKnAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoKHAgPSBzb2FwX2luX1NPQVBfRU5WX19EZXRhaWwoc29hcCwgdGFnLCBwLCB0eXBlKSkpCisJCXNvYXBfZ2V0aW5kZXBlbmRlbnQoc29hcCk7CisJcmV0dXJuIHA7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IFNPQVBfRU5WX19EZXRhaWwgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fU09BUF9FTlZfX0RldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzdHJ1Y3QgU09BUF9FTlZfX0RldGFpbCAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlzaG9ydCBzb2FwX2ZsYWdfZmF1bHQgPSAxLCBzb2FwX2ZsYWdfX19hbnkgPSAxOworCWlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCpzb2FwLT50eXBlICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpKQorCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisJCXJldHVybiBOVUxMOworCX0KKwlhID0gKHN0cnVjdCBTT0FQX0VOVl9fRGV0YWlsICopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgYSwgU09BUF9UWVBFX1NPQVBfRU5WX19EZXRhaWwsIHNpemVvZihzdHJ1Y3QgU09BUF9FTlZfX0RldGFpbCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworCWlmICghYSkKKwkJcmV0dXJuIE5VTEw7CisJc29hcF9kZWZhdWx0X1NPQVBfRU5WX19EZXRhaWwoc29hcCwgYSk7CisJaWYgKHNvYXAtPmJvZHkgJiYgISpzb2FwLT5ocmVmKQorCXsKKwkJZm9yICg7OykKKwkJewlzb2FwLT5lcnJvciA9IFNPQVBfVEFHX01JU01BVENIOworCQkJaWYgKHNvYXBfZmxhZ19mYXVsdCAmJiBzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlpZiAoKGEtPmZhdWx0ID0gc29hcF9nZXRlbGVtZW50KHNvYXAsICZhLT5fX3R5cGUpKSkKKwkJCQl7CXNvYXBfZmxhZ19mYXVsdCA9IDA7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCWlmIChzb2FwX2ZsYWdfX19hbnkgJiYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIIHx8IHNvYXAtPmVycm9yID09IFNPQVBfTk9fVEFHKSkKKwkJCQlpZiAoc29hcF9pbmxpdGVyYWwoc29hcCwgIi1hbnkiLCAmYS0+X19hbnkpKQorCQkJCXsJc29hcF9mbGFnX19fYW55LS07CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlzb2FwLT5lcnJvciA9IHNvYXBfaWdub3JlX2VsZW1lbnQoc29hcCk7CisJCQlpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcpCisJCQkJYnJlYWs7CisJCQlpZiAoc29hcC0+ZXJyb3IpCisJCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwllbHNlCisJewlhID0gKHN0cnVjdCBTT0FQX0VOVl9fRGV0YWlsICopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopYSwgMCwgU09BUF9UWVBFX1NPQVBfRU5WX19EZXRhaWwsIDAsIHNpemVvZihzdHJ1Y3QgU09BUF9FTlZfX0RldGFpbCksIDAsIE5VTEwpOworCQlpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGE7Cit9CisKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9HTE9CQUwKKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfU09BUF9FTlZfX0NvZGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBTT0FQX0VOVl9fQ29kZSAqYSkKK3sKKwkodm9pZClzb2FwOyAodm9pZClhOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8KKwlzb2FwX3NlcmlhbGl6ZV9fUU5hbWUoc29hcCwgJmEtPlNPQVBfRU5WX19WYWx1ZSk7CisJc29hcF9zZXJpYWxpemVfUG9pbnRlclRvU09BUF9FTlZfX0NvZGUoc29hcCwgJmEtPlNPQVBfRU5WX19TdWJjb2RlKTsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X1NPQVBfRU5WX19Db2RlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgU09BUF9FTlZfX0NvZGUgKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisJc29hcF9kZWZhdWx0X19RTmFtZShzb2FwLCAmYS0+U09BUF9FTlZfX1ZhbHVlKTsKKwlhLT5TT0FQX0VOVl9fU3ViY29kZSA9IE5VTEw7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfU09BUF9FTlZfX0NvZGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBTT0FQX0VOVl9fQ29kZSAqYSwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCXJlZ2lzdGVyIGludCBpZCA9IHNvYXBfZW1iZWQoc29hcCwgKHZvaWQqKWEsIE5VTEwsIDAsIHRhZywgU09BUF9UWVBFX1NPQVBfRU5WX19Db2RlKTsKKwlpZiAoc29hcF9vdXRfU09BUF9FTlZfX0NvZGUoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9TT0FQX0VOVl9fQ29kZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHN0cnVjdCBTT0FQX0VOVl9fQ29kZSAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwljb25zdCBjaGFyICpzb2FwX3RtcF9TT0FQX0VOVl9fVmFsdWUgPSBzb2FwX1FOYW1lMnMoc29hcCwgYS0+U09BUF9FTlZfX1ZhbHVlKTsKKwlzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgYSwgU09BUF9UWVBFX1NPQVBfRU5WX19Db2RlKSwgdHlwZSk7CisJc29hcF9vdXRfX1FOYW1lKHNvYXAsICJTT0FQLUVOVjpWYWx1ZSIsIC0xLCAoY2hhcipjb25zdCopJnNvYXBfdG1wX1NPQVBfRU5WX19WYWx1ZSwgIiIpOworCXNvYXBfb3V0X1BvaW50ZXJUb1NPQVBfRU5WX19Db2RlKHNvYXAsICJTT0FQLUVOVjpTdWJjb2RlIiwgLTEsICZhLT5TT0FQX0VOVl9fU3ViY29kZSwgIiIpOworCXNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7CisJcmV0dXJuIFNPQVBfT0s7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IFNPQVBfRU5WX19Db2RlICogU09BUF9GTUFDNCBzb2FwX2dldF9TT0FQX0VOVl9fQ29kZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IFNPQVBfRU5WX19Db2RlICpwLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKChwID0gc29hcF9pbl9TT0FQX0VOVl9fQ29kZShzb2FwLCB0YWcsIHAsIHR5cGUpKSkKKwkJc29hcF9nZXRpbmRlcGVuZGVudChzb2FwKTsKKwlyZXR1cm4gcDsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgU09BUF9FTlZfX0NvZGUgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fU09BUF9FTlZfX0NvZGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc3RydWN0IFNPQVBfRU5WX19Db2RlICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXNob3J0IHNvYXBfZmxhZ19TT0FQX0VOVl9fVmFsdWUgPSAxLCBzb2FwX2ZsYWdfU09BUF9FTlZfX1N1YmNvZGUgPSAxOworCWlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCpzb2FwLT50eXBlICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpKQorCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisJCXJldHVybiBOVUxMOworCX0KKwlhID0gKHN0cnVjdCBTT0FQX0VOVl9fQ29kZSAqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIGEsIFNPQVBfVFlQRV9TT0FQX0VOVl9fQ29kZSwgc2l6ZW9mKHN0cnVjdCBTT0FQX0VOVl9fQ29kZSksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworCWlmICghYSkKKwkJcmV0dXJuIE5VTEw7CisJc29hcF9kZWZhdWx0X1NPQVBfRU5WX19Db2RlKHNvYXAsIGEpOworCWlmIChzb2FwLT5ib2R5ICYmICEqc29hcC0+aHJlZikKKwl7CisJCWZvciAoOzspCisJCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RBR19NSVNNQVRDSDsKKwkJCWlmIChzb2FwX2ZsYWdfU09BUF9FTlZfX1ZhbHVlICYmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCB8fCBzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykpCisJCQkJaWYgKHNvYXBfaW5fX1FOYW1lKHNvYXAsICJTT0FQLUVOVjpWYWx1ZSIsICZhLT5TT0FQX0VOVl9fVmFsdWUsICIiKSkKKwkJCQl7CXNvYXBfZmxhZ19TT0FQX0VOVl9fVmFsdWUtLTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXBfZmxhZ19TT0FQX0VOVl9fU3ViY29kZSAmJiBzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlpZiAoc29hcF9pbl9Qb2ludGVyVG9TT0FQX0VOVl9fQ29kZShzb2FwLCAiU09BUC1FTlY6U3ViY29kZSIsICZhLT5TT0FQX0VOVl9fU3ViY29kZSwgIiIpKQorCQkJCXsJc29hcF9mbGFnX1NPQVBfRU5WX19TdWJjb2RlLS07CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlzb2FwLT5lcnJvciA9IHNvYXBfaWdub3JlX2VsZW1lbnQoc29hcCk7CisJCQlpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcpCisJCQkJYnJlYWs7CisJCQlpZiAoc29hcC0+ZXJyb3IpCisJCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwllbHNlCisJewlhID0gKHN0cnVjdCBTT0FQX0VOVl9fQ29kZSAqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCAodm9pZCoqKWEsIDAsIFNPQVBfVFlQRV9TT0FQX0VOVl9fQ29kZSwgMCwgc2l6ZW9mKHN0cnVjdCBTT0FQX0VOVl9fQ29kZSksIDAsIE5VTEwpOworCQlpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGE7Cit9CisKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9HTE9CQUwKKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfU09BUF9FTlZfX0hlYWRlcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IFNPQVBfRU5WX19IZWFkZXIgKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisJLyogdHJhbnNpZW50IGR1bW15IHNraXBwZWQgKi8KK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X1NPQVBfRU5WX19IZWFkZXIoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBTT0FQX0VOVl9fSGVhZGVyICphKQoreworCSh2b2lkKXNvYXA7ICh2b2lkKWE7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLworCS8qIHRyYW5zaWVudCBkdW1teSBza2lwcGVkICovCit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfU09BUF9FTlZfX0hlYWRlcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IFNPQVBfRU5WX19IZWFkZXIgKmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZWdpc3RlciBpbnQgaWQgPSBzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCBOVUxMLCAwLCB0YWcsIFNPQVBfVFlQRV9TT0FQX0VOVl9fSGVhZGVyKTsKKwlpZiAoc29hcF9vdXRfU09BUF9FTlZfX0hlYWRlcihzb2FwLCB0YWcsIGlkLCBhLCB0eXBlKSkKKwkJcmV0dXJuIHNvYXAtPmVycm9yOworCXJldHVybiBzb2FwX3B1dGluZGVwZW5kZW50KHNvYXApOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1NPQVBfRU5WX19IZWFkZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzdHJ1Y3QgU09BUF9FTlZfX0hlYWRlciAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgYSwgU09BUF9UWVBFX1NPQVBfRU5WX19IZWFkZXIpLCB0eXBlKTsKKwkvKiB0cmFuc2llbnQgZHVtbXkgc2tpcHBlZCAqLworCXNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7CisJcmV0dXJuIFNPQVBfT0s7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IFNPQVBfRU5WX19IZWFkZXIgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1NPQVBfRU5WX19IZWFkZXIoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBTT0FQX0VOVl9fSGVhZGVyICpwLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKChwID0gc29hcF9pbl9TT0FQX0VOVl9fSGVhZGVyKHNvYXAsIHRhZywgcCwgdHlwZSkpKQorCQlzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOworCXJldHVybiBwOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBTT0FQX0VOVl9fSGVhZGVyICogU09BUF9GTUFDNCBzb2FwX2luX1NPQVBfRU5WX19IZWFkZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc3RydWN0IFNPQVBfRU5WX19IZWFkZXIgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7OworCWlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCpzb2FwLT50eXBlICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpKQorCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisJCXJldHVybiBOVUxMOworCX0KKwlhID0gKHN0cnVjdCBTT0FQX0VOVl9fSGVhZGVyICopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgYSwgU09BUF9UWVBFX1NPQVBfRU5WX19IZWFkZXIsIHNpemVvZihzdHJ1Y3QgU09BUF9FTlZfX0hlYWRlciksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworCWlmICghYSkKKwkJcmV0dXJuIE5VTEw7CisJc29hcF9kZWZhdWx0X1NPQVBfRU5WX19IZWFkZXIoc29hcCwgYSk7CisJaWYgKHNvYXAtPmJvZHkgJiYgISpzb2FwLT5ocmVmKQorCXsKKwkJZm9yICg7OykKKwkJewlzb2FwLT5lcnJvciA9IFNPQVBfVEFHX01JU01BVENIOworCQkvKiB0cmFuc2llbnQgZHVtbXkgc2tpcHBlZCAqLworCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCXNvYXAtPmVycm9yID0gc29hcF9pZ25vcmVfZWxlbWVudChzb2FwKTsKKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykKKwkJCQlicmVhazsKKwkJCWlmIChzb2FwLT5lcnJvcikKKwkJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCWVsc2UKKwl7CWEgPSAoc3RydWN0IFNPQVBfRU5WX19IZWFkZXIgKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilhLCAwLCBTT0FQX1RZUEVfU09BUF9FTlZfX0hlYWRlciwgMCwgc2l6ZW9mKHN0cnVjdCBTT0FQX0VOVl9fSGVhZGVyKSwgMCwgTlVMTCk7CisJCWlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gYTsKK30KKworI2VuZGlmCisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX25zX19nZXRRdW90ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IG5zX19nZXRRdW90ZSAqYSkKK3sKKwkodm9pZClzb2FwOyAodm9pZClhOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8KKwlzb2FwX3NlcmlhbGl6ZV9zdHJpbmcoc29hcCwgJmEtPnN5bWJvbCk7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9uc19fZ2V0UXVvdGUoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZ2V0UXVvdGUgKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisJc29hcF9kZWZhdWx0X3N0cmluZyhzb2FwLCAmYS0+c3ltYm9sKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9uc19fZ2V0UXVvdGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBuc19fZ2V0UXVvdGUgKmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZWdpc3RlciBpbnQgaWQgPSBzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCBOVUxMLCAwLCB0YWcsIFNPQVBfVFlQRV9uc19fZ2V0UXVvdGUpOworCWlmIChzb2FwX291dF9uc19fZ2V0UXVvdGUoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9uc19fZ2V0UXVvdGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzdHJ1Y3QgbnNfX2dldFF1b3RlICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBhLCBTT0FQX1RZUEVfbnNfX2dldFF1b3RlKSwgdHlwZSk7CisJc29hcF9vdXRfc3RyaW5nKHNvYXAsICJzeW1ib2wiLCAtMSwgJmEtPnN5bWJvbCwgIiIpOworCXNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7CisJcmV0dXJuIFNPQVBfT0s7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19nZXRRdW90ZSAqIFNPQVBfRk1BQzQgc29hcF9nZXRfbnNfX2dldFF1b3RlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2dldFF1b3RlICpwLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKChwID0gc29hcF9pbl9uc19fZ2V0UXVvdGUoc29hcCwgdGFnLCBwLCB0eXBlKSkpCisJCXNvYXBfZ2V0aW5kZXBlbmRlbnQoc29hcCk7CisJcmV0dXJuIHA7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IG5zX19nZXRRdW90ZSAqIFNPQVBfRk1BQzQgc29hcF9pbl9uc19fZ2V0UXVvdGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc3RydWN0IG5zX19nZXRRdW90ZSAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlzaG9ydCBzb2FwX2ZsYWdfc3ltYm9sID0gMTsKKwlpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisJCXJldHVybiBOVUxMOworCWlmICgqc29hcC0+dHlwZSAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKSkKKwl7CXNvYXAtPmVycm9yID0gU09BUF9UWVBFOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYSA9IChzdHJ1Y3QgbnNfX2dldFF1b3RlICopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgYSwgU09BUF9UWVBFX25zX19nZXRRdW90ZSwgc2l6ZW9mKHN0cnVjdCBuc19fZ2V0UXVvdGUpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwlpZiAoIWEpCisJCXJldHVybiBOVUxMOworCXNvYXBfZGVmYXVsdF9uc19fZ2V0UXVvdGUoc29hcCwgYSk7CisJaWYgKHNvYXAtPmJvZHkgJiYgISpzb2FwLT5ocmVmKQorCXsKKwkJZm9yICg7OykKKwkJewlzb2FwLT5lcnJvciA9IFNPQVBfVEFHX01JU01BVENIOworCQkJaWYgKHNvYXBfZmxhZ19zeW1ib2wgJiYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIIHx8IHNvYXAtPmVycm9yID09IFNPQVBfTk9fVEFHKSkKKwkJCQlpZiAoc29hcF9pbl9zdHJpbmcoc29hcCwgInN5bWJvbCIsICZhLT5zeW1ib2wsICJ4c2Q6c3RyaW5nIikpCisJCQkJewlzb2FwX2ZsYWdfc3ltYm9sLS07CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlzb2FwLT5lcnJvciA9IHNvYXBfaWdub3JlX2VsZW1lbnQoc29hcCk7CisJCQlpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcpCisJCQkJYnJlYWs7CisJCQlpZiAoc29hcC0+ZXJyb3IpCisJCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwllbHNlCisJewlhID0gKHN0cnVjdCBuc19fZ2V0UXVvdGUgKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilhLCAwLCBTT0FQX1RZUEVfbnNfX2dldFF1b3RlLCAwLCBzaXplb2Yoc3RydWN0IG5zX19nZXRRdW90ZSksIDAsIE5VTEwpOworCQlpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGE7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX25zX19nZXRRdW90ZVJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3QgbnNfX2dldFF1b3RlUmVzcG9uc2UgKmEpCit7CisJKHZvaWQpc29hcDsgKHZvaWQpYTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisJc29hcF9zZXJpYWxpemVfUG9pbnRlclRvZmxvYXQoc29hcCwgJmEtPlJlc3VsdCk7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9uc19fZ2V0UXVvdGVSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19nZXRRdW90ZVJlc3BvbnNlICphKQoreworCSh2b2lkKXNvYXA7ICh2b2lkKWE7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLworCWEtPlJlc3VsdCA9IE5VTEw7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfbnNfX2dldFF1b3RlUmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBuc19fZ2V0UXVvdGVSZXNwb25zZSAqYSwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCXJlZ2lzdGVyIGludCBpZCA9IHNvYXBfZW1iZWQoc29hcCwgKHZvaWQqKWEsIE5VTEwsIDAsIHRhZywgU09BUF9UWVBFX25zX19nZXRRdW90ZVJlc3BvbnNlKTsKKwlpZiAoc29hcF9vdXRfbnNfX2dldFF1b3RlUmVzcG9uc2Uoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9uc19fZ2V0UXVvdGVSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHN0cnVjdCBuc19fZ2V0UXVvdGVSZXNwb25zZSAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgYSwgU09BUF9UWVBFX25zX19nZXRRdW90ZVJlc3BvbnNlKSwgdHlwZSk7CisJaWYgKGEtPlJlc3VsdCkKKwkJc29hcF9lbGVtZW50X3Jlc3VsdChzb2FwLCAiUmVzdWx0Iik7CisJc29hcF9vdXRfUG9pbnRlclRvZmxvYXQoc29hcCwgIlJlc3VsdCIsIC0xLCAmYS0+UmVzdWx0LCAiIik7CisJc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKKwlyZXR1cm4gU09BUF9PSzsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgbnNfX2dldFF1b3RlUmVzcG9uc2UgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X25zX19nZXRRdW90ZVJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2dldFF1b3RlUmVzcG9uc2UgKnAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoKHAgPSBzb2FwX2luX25zX19nZXRRdW90ZVJlc3BvbnNlKHNvYXAsIHRhZywgcCwgdHlwZSkpKQorCQlzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOworCXJldHVybiBwOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBuc19fZ2V0UXVvdGVSZXNwb25zZSAqIFNPQVBfRk1BQzQgc29hcF9pbl9uc19fZ2V0UXVvdGVSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzdHJ1Y3QgbnNfX2dldFF1b3RlUmVzcG9uc2UgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc2hvcnQgc29hcF9mbGFnX1Jlc3VsdCA9IDE7CisJaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoKnNvYXAtPnR5cGUgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkpCisJewlzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWEgPSAoc3RydWN0IG5zX19nZXRRdW90ZVJlc3BvbnNlICopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgYSwgU09BUF9UWVBFX25zX19nZXRRdW90ZVJlc3BvbnNlLCBzaXplb2Yoc3RydWN0IG5zX19nZXRRdW90ZVJlc3BvbnNlKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJaWYgKCFhKQorCQlyZXR1cm4gTlVMTDsKKwlzb2FwX2RlZmF1bHRfbnNfX2dldFF1b3RlUmVzcG9uc2Uoc29hcCwgYSk7CisJaWYgKHNvYXAtPmJvZHkgJiYgISpzb2FwLT5ocmVmKQorCXsKKwkJZm9yICg7OykKKwkJewlzb2FwLT5lcnJvciA9IFNPQVBfVEFHX01JU01BVENIOworCQkJaWYgKHNvYXBfZmxhZ19SZXN1bHQgJiYgc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJaWYgKHNvYXBfaW5fUG9pbnRlclRvZmxvYXQoc29hcCwgIlJlc3VsdCIsICZhLT5SZXN1bHQsICJ4c2Q6ZmxvYXQiKSkKKwkJCQl7CXNvYXBfZmxhZ19SZXN1bHQtLTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCXNvYXAtPmVycm9yID0gc29hcF9pZ25vcmVfZWxlbWVudChzb2FwKTsKKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykKKwkJCQlicmVhazsKKwkJCWlmIChzb2FwLT5lcnJvcikKKwkJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCWVsc2UKKwl7CWEgPSAoc3RydWN0IG5zX19nZXRRdW90ZVJlc3BvbnNlICopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopYSwgMCwgU09BUF9UWVBFX25zX19nZXRRdW90ZVJlc3BvbnNlLCAwLCBzaXplb2Yoc3RydWN0IG5zX19nZXRRdW90ZVJlc3BvbnNlKSwgMCwgTlVMTCk7CisJCWlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gYTsKK30KKworI2lmbmRlZiBXSVRIX05PR0xPQkFMCisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb1NPQVBfRU5WX19SZWFzb24oc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBTT0FQX0VOVl9fUmVhc29uICpjb25zdCphKQoreworCWlmICghc29hcF9yZWZlcmVuY2Uoc29hcCwgKmEsIFNPQVBfVFlQRV9TT0FQX0VOVl9fUmVhc29uKSkKKwkJc29hcF9zZXJpYWxpemVfU09BUF9FTlZfX1JlYXNvbihzb2FwLCAqYSk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvU09BUF9FTlZfX1JlYXNvbihzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IFNPQVBfRU5WX19SZWFzb24gKmNvbnN0KmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZWdpc3RlciBpbnQgaWQgPSBzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCBOVUxMLCAwLCB0YWcsIFNPQVBfVFlQRV9Qb2ludGVyVG9TT0FQX0VOVl9fUmVhc29uKTsKKwlpZiAoc29hcF9vdXRfUG9pbnRlclRvU09BUF9FTlZfX1JlYXNvbihzb2FwLCB0YWcsIGlkLCBhLCB0eXBlKSkKKwkJcmV0dXJuIHNvYXAtPmVycm9yOworCXJldHVybiBzb2FwX3B1dGluZGVwZW5kZW50KHNvYXApOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb1NPQVBfRU5WX19SZWFzb24oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBzdHJ1Y3QgU09BUF9FTlZfX1JlYXNvbiAqY29uc3QqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZCA9IHNvYXBfZWxlbWVudF9pZChzb2FwLCB0YWcsIGlkLCAqYSwgTlVMTCwgMCwgdHlwZSwgU09BUF9UWVBFX1NPQVBfRU5WX19SZWFzb24pOworCWlmIChpZCA8IDApCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9vdXRfU09BUF9FTlZfX1JlYXNvbihzb2FwLCB0YWcsIGlkLCAqYSwgdHlwZSk7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IFNPQVBfRU5WX19SZWFzb24gKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG9TT0FQX0VOVl9fUmVhc29uKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgU09BUF9FTlZfX1JlYXNvbiAqKnAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoKHAgPSBzb2FwX2luX1BvaW50ZXJUb1NPQVBfRU5WX19SZWFzb24oc29hcCwgdGFnLCBwLCB0eXBlKSkpCisJCXNvYXBfZ2V0aW5kZXBlbmRlbnQoc29hcCk7CisJcmV0dXJuIHA7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IFNPQVBfRU5WX19SZWFzb24gKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb1NPQVBfRU5WX19SZWFzb24oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc3RydWN0IFNPQVBfRU5WX19SZWFzb24gKiphLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAxKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCFhKQorCQlpZiAoIShhID0gKHN0cnVjdCBTT0FQX0VOVl9fUmVhc29uICoqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3QgU09BUF9FTlZfX1JlYXNvbiAqKSkpKQorCQkJcmV0dXJuIE5VTEw7CisJKmEgPSBOVUxMOworCWlmICghc29hcC0+bnVsbCAmJiAqc29hcC0+aHJlZiAhPSAnIycpCisJewlzb2FwX3JldmVydChzb2FwKTsKKwkJaWYgKCEoKmEgPSBzb2FwX2luX1NPQVBfRU5WX19SZWFzb24oc29hcCwgdGFnLCAqYSwgdHlwZSkpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCWVsc2UKKwl7CWEgPSAoc3RydWN0IFNPQVBfRU5WX19SZWFzb24gKiopc29hcF9pZF9sb29rdXAoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilhLCBTT0FQX1RZUEVfU09BUF9FTlZfX1JlYXNvbiwgc2l6ZW9mKHN0cnVjdCBTT0FQX0VOVl9fUmVhc29uKSwgMCk7CisJCWlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gYTsKK30KKworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9OT0dMT0JBTAorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG9TT0FQX0VOVl9fRGV0YWlsKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgU09BUF9FTlZfX0RldGFpbCAqY29uc3QqYSkKK3sKKwlpZiAoIXNvYXBfcmVmZXJlbmNlKHNvYXAsICphLCBTT0FQX1RZUEVfU09BUF9FTlZfX0RldGFpbCkpCisJCXNvYXBfc2VyaWFsaXplX1NPQVBfRU5WX19EZXRhaWwoc29hcCwgKmEpOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb1NPQVBfRU5WX19EZXRhaWwoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBTT0FQX0VOVl9fRGV0YWlsICpjb25zdCphLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmVnaXN0ZXIgaW50IGlkID0gc29hcF9lbWJlZChzb2FwLCAodm9pZCopYSwgTlVMTCwgMCwgdGFnLCBTT0FQX1RZUEVfUG9pbnRlclRvU09BUF9FTlZfX0RldGFpbCk7CisJaWYgKHNvYXBfb3V0X1BvaW50ZXJUb1NPQVBfRU5WX19EZXRhaWwoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG9TT0FQX0VOVl9fRGV0YWlsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgc3RydWN0IFNPQVBfRU5WX19EZXRhaWwgKmNvbnN0KmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWQgPSBzb2FwX2VsZW1lbnRfaWQoc29hcCwgdGFnLCBpZCwgKmEsIE5VTEwsIDAsIHR5cGUsIFNPQVBfVFlQRV9TT0FQX0VOVl9fRGV0YWlsKTsKKwlpZiAoaWQgPCAwKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJcmV0dXJuIHNvYXBfb3V0X1NPQVBfRU5WX19EZXRhaWwoc29hcCwgdGFnLCBpZCwgKmEsIHR5cGUpOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBTT0FQX0VOVl9fRGV0YWlsICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvU09BUF9FTlZfX0RldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IFNPQVBfRU5WX19EZXRhaWwgKipwLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKChwID0gc29hcF9pbl9Qb2ludGVyVG9TT0FQX0VOVl9fRGV0YWlsKHNvYXAsIHRhZywgcCwgdHlwZSkpKQorCQlzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOworCXJldHVybiBwOworfQorCitTT0FQX0ZNQUMzIHN0cnVjdCBTT0FQX0VOVl9fRGV0YWlsICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG9TT0FQX0VOVl9fRGV0YWlsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHN0cnVjdCBTT0FQX0VOVl9fRGV0YWlsICoqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMSkpCisJCXJldHVybiBOVUxMOworCWlmICghYSkKKwkJaWYgKCEoYSA9IChzdHJ1Y3QgU09BUF9FTlZfX0RldGFpbCAqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IFNPQVBfRU5WX19EZXRhaWwgKikpKSkKKwkJCXJldHVybiBOVUxMOworCSphID0gTlVMTDsKKwlpZiAoIXNvYXAtPm51bGwgJiYgKnNvYXAtPmhyZWYgIT0gJyMnKQorCXsJc29hcF9yZXZlcnQoc29hcCk7CisJCWlmICghKCphID0gc29hcF9pbl9TT0FQX0VOVl9fRGV0YWlsKHNvYXAsIHRhZywgKmEsIHR5cGUpKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwllbHNlCisJewlhID0gKHN0cnVjdCBTT0FQX0VOVl9fRGV0YWlsICoqKXNvYXBfaWRfbG9va3VwKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopYSwgU09BUF9UWVBFX1NPQVBfRU5WX19EZXRhaWwsIHNpemVvZihzdHJ1Y3QgU09BUF9FTlZfX0RldGFpbCksIDApOworCQlpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGE7Cit9CisKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9HTE9CQUwKKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvU09BUF9FTlZfX0NvZGUoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBTT0FQX0VOVl9fQ29kZSAqY29uc3QqYSkKK3sKKwlpZiAoIXNvYXBfcmVmZXJlbmNlKHNvYXAsICphLCBTT0FQX1RZUEVfU09BUF9FTlZfX0NvZGUpKQorCQlzb2FwX3NlcmlhbGl6ZV9TT0FQX0VOVl9fQ29kZShzb2FwLCAqYSk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvU09BUF9FTlZfX0NvZGUoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBTT0FQX0VOVl9fQ29kZSAqY29uc3QqYSwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCXJlZ2lzdGVyIGludCBpZCA9IHNvYXBfZW1iZWQoc29hcCwgKHZvaWQqKWEsIE5VTEwsIDAsIHRhZywgU09BUF9UWVBFX1BvaW50ZXJUb1NPQVBfRU5WX19Db2RlKTsKKwlpZiAoc29hcF9vdXRfUG9pbnRlclRvU09BUF9FTlZfX0NvZGUoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG9TT0FQX0VOVl9fQ29kZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIHN0cnVjdCBTT0FQX0VOVl9fQ29kZSAqY29uc3QqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZCA9IHNvYXBfZWxlbWVudF9pZChzb2FwLCB0YWcsIGlkLCAqYSwgTlVMTCwgMCwgdHlwZSwgU09BUF9UWVBFX1NPQVBfRU5WX19Db2RlKTsKKwlpZiAoaWQgPCAwKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJcmV0dXJuIHNvYXBfb3V0X1NPQVBfRU5WX19Db2RlKHNvYXAsIHRhZywgaWQsICphLCB0eXBlKTsKK30KKworU09BUF9GTUFDMyBzdHJ1Y3QgU09BUF9FTlZfX0NvZGUgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG9TT0FQX0VOVl9fQ29kZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IFNPQVBfRU5WX19Db2RlICoqcCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmICgocCA9IHNvYXBfaW5fUG9pbnRlclRvU09BUF9FTlZfX0NvZGUoc29hcCwgdGFnLCBwLCB0eXBlKSkpCisJCXNvYXBfZ2V0aW5kZXBlbmRlbnQoc29hcCk7CisJcmV0dXJuIHA7Cit9CisKK1NPQVBfRk1BQzMgc3RydWN0IFNPQVBfRU5WX19Db2RlICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG9TT0FQX0VOVl9fQ29kZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzdHJ1Y3QgU09BUF9FTlZfX0NvZGUgKiphLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAxKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCFhKQorCQlpZiAoIShhID0gKHN0cnVjdCBTT0FQX0VOVl9fQ29kZSAqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IFNPQVBfRU5WX19Db2RlICopKSkpCisJCQlyZXR1cm4gTlVMTDsKKwkqYSA9IE5VTEw7CisJaWYgKCFzb2FwLT5udWxsICYmICpzb2FwLT5ocmVmICE9ICcjJykKKwl7CXNvYXBfcmV2ZXJ0KHNvYXApOworCQlpZiAoISgqYSA9IHNvYXBfaW5fU09BUF9FTlZfX0NvZGUoc29hcCwgdGFnLCAqYSwgdHlwZSkpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCWVsc2UKKwl7CWEgPSAoc3RydWN0IFNPQVBfRU5WX19Db2RlICoqKXNvYXBfaWRfbG9va3VwKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopYSwgU09BUF9UWVBFX1NPQVBfRU5WX19Db2RlLCBzaXplb2Yoc3RydWN0IFNPQVBfRU5WX19Db2RlKSwgMCk7CisJCWlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gYTsKK30KKworI2VuZGlmCisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb2Zsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBmbG9hdCAqY29uc3QqYSkKK3sKKwlzb2FwX3JlZmVyZW5jZShzb2FwLCAqYSwgU09BUF9UWVBFX2Zsb2F0KTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG9mbG9hdChzdHJ1Y3Qgc29hcCAqc29hcCwgZmxvYXQgKmNvbnN0KmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZWdpc3RlciBpbnQgaWQgPSBzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCBOVUxMLCAwLCB0YWcsIFNPQVBfVFlQRV9Qb2ludGVyVG9mbG9hdCk7CisJaWYgKHNvYXBfb3V0X1BvaW50ZXJUb2Zsb2F0KHNvYXAsIHRhZywgaWQsIGEsIHR5cGUpKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJcmV0dXJuIHNvYXBfcHV0aW5kZXBlbmRlbnQoc29hcCk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvZmxvYXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBmbG9hdCAqY29uc3QqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZCA9IHNvYXBfZWxlbWVudF9pZChzb2FwLCB0YWcsIGlkLCAqYSwgTlVMTCwgMCwgdHlwZSwgU09BUF9UWVBFX2Zsb2F0KTsKKwlpZiAoaWQgPCAwKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJcmV0dXJuIHNvYXBfb3V0X2Zsb2F0KHNvYXAsIHRhZywgaWQsICphLCB0eXBlKTsKK30KKworU09BUF9GTUFDMyBmbG9hdCAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb2Zsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBmbG9hdCAqKnAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoKHAgPSBzb2FwX2luX1BvaW50ZXJUb2Zsb2F0KHNvYXAsIHRhZywgcCwgdHlwZSkpKQorCQlzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOworCXJldHVybiBwOworfQorCitTT0FQX0ZNQUMzIGZsb2F0ICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG9mbG9hdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBmbG9hdCAqKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDEpKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoIWEpCisJCWlmICghKGEgPSAoZmxvYXQgKiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKGZsb2F0ICopKSkpCisJCQlyZXR1cm4gTlVMTDsKKwkqYSA9IE5VTEw7CisJaWYgKCFzb2FwLT5udWxsICYmICpzb2FwLT5ocmVmICE9ICcjJykKKwl7CXNvYXBfcmV2ZXJ0KHNvYXApOworCQlpZiAoISgqYSA9IHNvYXBfaW5fZmxvYXQoc29hcCwgdGFnLCAqYSwgdHlwZSkpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCWVsc2UKKwl7CWEgPSAoZmxvYXQgKiopc29hcF9pZF9sb29rdXAoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilhLCBTT0FQX1RZUEVfZmxvYXQsIHNpemVvZihmbG9hdCksIDApOworCQlpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGE7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9fUU5hbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKiphKQorewlzb2FwX2RlZmF1bHRfc3RyaW5nKHNvYXAsIGEpOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9fUU5hbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKmNvbnN0KmEpCit7CXNvYXBfc2VyaWFsaXplX3N0cmluZyhzb2FwLCBhKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9fUU5hbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKmNvbnN0KmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZWdpc3RlciBpbnQgaWQgPSBzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCBOVUxMLCAwLCB0YWcsIFNPQVBfVFlQRV9fUU5hbWUpOworCWlmIChzb2FwX291dF9fUU5hbWUoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9fUU5hbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjaGFyICpjb25zdCphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXJldHVybiBzb2FwX291dHN0cmluZyhzb2FwLCB0YWcsIGlkLCBhLCB0eXBlLCBTT0FQX1RZUEVfX1FOYW1lKTsKK30KKworU09BUF9GTUFDMyBjaGFyICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfX1FOYW1lKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICoqcCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmICgocCA9IHNvYXBfaW5fX1FOYW1lKHNvYXAsIHRhZywgcCwgdHlwZSkpKQorCQlzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOworCXJldHVybiBwOworfQorCitTT0FQX0ZNQUMzIGNoYXIgKiAqIFNPQVBfRk1BQzQgc29hcF9pbl9fUU5hbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgY2hhciAqKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmV0dXJuIHNvYXBfaW5zdHJpbmcoc29hcCwgdGFnLCBhLCB0eXBlLCBTT0FQX1RZUEVfX1FOYW1lLCAyLCAtMSwgLTEpOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfc3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICoqYSkKK3sJKHZvaWQpc29hcDsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovCisjaWZkZWYgU09BUF9ERUZBVUxUX3N0cmluZworCSphID0gU09BUF9ERUZBVUxUX3N0cmluZzsKKyNlbHNlCisJKmEgPSAoY2hhciAqKTA7CisjZW5kaWYKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfc3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpjb25zdCphKQoreworCXNvYXBfcmVmZXJlbmNlKHNvYXAsICphLCBTT0FQX1RZUEVfc3RyaW5nKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9zdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKmNvbnN0KmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZWdpc3RlciBpbnQgaWQgPSBzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCBOVUxMLCAwLCB0YWcsIFNPQVBfVFlQRV9zdHJpbmcpOworCWlmIChzb2FwX291dF9zdHJpbmcoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9zdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjaGFyICpjb25zdCphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXJldHVybiBzb2FwX291dHN0cmluZyhzb2FwLCB0YWcsIGlkLCBhLCB0eXBlLCBTT0FQX1RZUEVfc3RyaW5nKTsKK30KKworU09BUF9GTUFDMyBjaGFyICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfc3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICoqcCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmICgocCA9IHNvYXBfaW5fc3RyaW5nKHNvYXAsIHRhZywgcCwgdHlwZSkpKQorCQlzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOworCXJldHVybiBwOworfQorCitTT0FQX0ZNQUMzIGNoYXIgKiAqIFNPQVBfRk1BQzQgc29hcF9pbl9zdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgY2hhciAqKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmV0dXJuIHNvYXBfaW5zdHJpbmcoc29hcCwgdGFnLCBhLCB0eXBlLCBTT0FQX1RZUEVfc3RyaW5nLCAxLCAtMSwgLTEpOworfQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisvKiBFbmQgb2Ygc29hcEMuYyAqLwpkaWZmIC0tZ2l0IGEvZ3NvYXAtcGFsbS9zdG9ja3F1b3RlL3NyYy9zb2FwQ2xpZW50LmMgYi9nc29hcC1wYWxtL3N0b2NrcXVvdGUvc3JjL3NvYXBDbGllbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2Q3Y2VkCi0tLSAvZGV2L251bGwKKysrIGIvZ3NvYXAtcGFsbS9zdG9ja3F1b3RlL3NyYy9zb2FwQ2xpZW50LmMKQEAgLTAsMCArMSw3MCBAQAorLyogc29hcENsaWVudC5jCisgICBHZW5lcmF0ZWQgYnkgZ1NPQVAgMi43LjZlIGZyb20gcXVvdGUuaAorICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICBUaGlzIHBhcnQgb2YgdGhlIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2VzOgorICAgR1BMLCB0aGUgZ1NPQVAgcHVibGljIGxpY2Vuc2UsIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKyovCisjaW5jbHVkZSAic29hcEguaCIKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworU09BUF9TT1VSQ0VfU1RBTVAoIkAoIykgc29hcENsaWVudC5jIHZlciAyLjcuNmUgMjAwNi0wMi0xOSAxNjozODo1MiBHTVQiKQorCisKK1NPQVBfRk1BQzUgaW50IFNPQVBfRk1BQzYgc29hcF9jYWxsX25zX19nZXRRdW90ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqc29hcF9lbmRwb2ludCwgY29uc3QgY2hhciAqc29hcF9hY3Rpb24sIGNoYXIgKnN5bWJvbCwgZmxvYXQgKlJlc3VsdCkKK3sJc3RydWN0IG5zX19nZXRRdW90ZSBzb2FwX3RtcF9uc19fZ2V0UXVvdGU7CisJc3RydWN0IG5zX19nZXRRdW90ZVJlc3BvbnNlICpzb2FwX3RtcF9uc19fZ2V0UXVvdGVSZXNwb25zZTsKKwlzb2FwLT5lbmNvZGluZ1N0eWxlID0gTlVMTDsKKwlzb2FwX3RtcF9uc19fZ2V0UXVvdGUuc3ltYm9sID0gc3ltYm9sOworCXNvYXBfYmVnaW4oc29hcCk7CisJc29hcF9zZXJpYWxpemVoZWFkZXIoc29hcCk7CisJc29hcF9zZXJpYWxpemVfbnNfX2dldFF1b3RlKHNvYXAsICZzb2FwX3RtcF9uc19fZ2V0UXVvdGUpOworCWlmIChzb2FwX2JlZ2luX2NvdW50KHNvYXApKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKwl7CWlmIChzb2FwX2VudmVsb3BlX2JlZ2luX291dChzb2FwKQorCQkgfHwgc29hcF9wdXRoZWFkZXIoc29hcCkKKwkJIHx8IHNvYXBfYm9keV9iZWdpbl9vdXQoc29hcCkKKwkJIHx8IHNvYXBfcHV0X25zX19nZXRRdW90ZShzb2FwLCAmc29hcF90bXBfbnNfX2dldFF1b3RlLCAibnM6Z2V0UXVvdGUiLCAiIikKKwkJIHx8IHNvYXBfYm9keV9lbmRfb3V0KHNvYXApCisJCSB8fCBzb2FwX2VudmVsb3BlX2VuZF9vdXQoc29hcCkpCisJCQkgcmV0dXJuIHNvYXAtPmVycm9yOworCX0KKwlpZiAoc29hcF9lbmRfY291bnQoc29hcCkpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlpZiAoc29hcF9jb25uZWN0KHNvYXAsIHNvYXBfZW5kcG9pbnQsIHNvYXBfYWN0aW9uKQorCSB8fCBzb2FwX2VudmVsb3BlX2JlZ2luX291dChzb2FwKQorCSB8fCBzb2FwX3B1dGhlYWRlcihzb2FwKQorCSB8fCBzb2FwX2JvZHlfYmVnaW5fb3V0KHNvYXApCisJIHx8IHNvYXBfcHV0X25zX19nZXRRdW90ZShzb2FwLCAmc29hcF90bXBfbnNfX2dldFF1b3RlLCAibnM6Z2V0UXVvdGUiLCAiIikKKwkgfHwgc29hcF9ib2R5X2VuZF9vdXQoc29hcCkKKwkgfHwgc29hcF9lbnZlbG9wZV9lbmRfb3V0KHNvYXApCisJIHx8IHNvYXBfZW5kX3NlbmQoc29hcCkpCisJCXJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKwlzb2FwX2RlZmF1bHRfZmxvYXQoc29hcCwgUmVzdWx0KTsKKwlpZiAoc29hcF9iZWdpbl9yZWN2KHNvYXApCisJIHx8IHNvYXBfZW52ZWxvcGVfYmVnaW5faW4oc29hcCkKKwkgfHwgc29hcF9yZWN2X2hlYWRlcihzb2FwKQorCSB8fCBzb2FwX2JvZHlfYmVnaW5faW4oc29hcCkpCisJCXJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKwlzb2FwX3RtcF9uc19fZ2V0UXVvdGVSZXNwb25zZSA9IHNvYXBfZ2V0X25zX19nZXRRdW90ZVJlc3BvbnNlKHNvYXAsIE5VTEwsICJuczpnZXRRdW90ZVJlc3BvbnNlIiwgIiIpOworCWlmIChzb2FwLT5lcnJvcikKKwl7CWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCAmJiBzb2FwLT5sZXZlbCA9PSAyKQorCQkJcmV0dXJuIHNvYXBfcmVjdl9mYXVsdChzb2FwKTsKKwkJcmV0dXJuIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworCX0KKwlpZiAoc29hcF9ib2R5X2VuZF9pbihzb2FwKQorCSB8fCBzb2FwX2VudmVsb3BlX2VuZF9pbihzb2FwKQorCSB8fCBzb2FwX2VuZF9yZWN2KHNvYXApKQorCQlyZXR1cm4gc29hcF9jbG9zZXNvY2soc29hcCk7CisJaWYgKFJlc3VsdCAmJiBzb2FwX3RtcF9uc19fZ2V0UXVvdGVSZXNwb25zZS0+UmVzdWx0KQorCQkqUmVzdWx0ID0gKnNvYXBfdG1wX25zX19nZXRRdW90ZVJlc3BvbnNlLT5SZXN1bHQ7CisJcmV0dXJuIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworfQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisvKiBFbmQgb2Ygc29hcENsaWVudC5jICovCmRpZmYgLS1naXQgYS9nc29hcC1wYWxtL3N0b2NrcXVvdGUvc3JjL3N0b2NrcXVvdGUuYyBiL2dzb2FwLXBhbG0vc3RvY2txdW90ZS9zcmMvc3RvY2txdW90ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MTRkNDkKLS0tIC9kZXYvbnVsbAorKysgYi9nc29hcC1wYWxtL3N0b2NrcXVvdGUvc3JjL3N0b2NrcXVvdGUuYwpAQCAtMCwwICsxLDU4IEBACisjaW5jbHVkZSAic29hcEguaCIgCisKK2V4dGVybiBpbnQgZ2V0UXVvdGUgKGNoYXIgKnN5bWJvbCwgY2hhciAqUmVzdWx0KTsKKworU09BUF9OTUFDIHN0cnVjdCBOYW1lc3BhY2UgbmFtZXNwYWNlc1tdID0KK3sKKyAgeyJTT0FQLUVOViIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIsICJodHRwOi8vd3d3LnczLm9yZy8qL3NvYXAtZW52ZWxvcGUifSwKKyAgeyJTT0FQLUVOQyIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIsICJodHRwOi8vd3d3LnczLm9yZy8qL3NvYXAtZW5jb2RpbmcifSwKKyAgeyJ4c2kiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCAiaHR0cDovL3d3dy53My5vcmcvKi9YTUxTY2hlbWEtaW5zdGFuY2UifSwKKyAgeyJ4c2QiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLCAiaHR0cDovL3d3dy53My5vcmcvKi9YTUxTY2hlbWEifSwKKyAgeyJucyIsICJ1cm46eG1ldGhvZHMtZGVsYXllZC1xdW90ZXMifSwKKyAge05VTEwsIE5VTEx9Cit9OworCit2b2lkIFN0ZEV0b0EoY2hhciAqdGV4dCk7CisKK2ludCBnZXRRdW90ZSAoY2hhciAqc3ltYm9sLCBjaGFyICpSZXN1bHQpIHsKKworCUZscENvbXBEb3VibGUgZDsKKwlzdHJ1Y3Qgc29hcCAqc29hcDsKKwlmbG9hdCByZXN1bHQ7CisJaW50IHJjOworICAgIGNoYXIgKmFkZHIgPSAiaHR0cDovL3NlcnZpY2VzLnhtZXRob2RzLm5ldC9zb2FwLyI7CisKKwlzb2FwID0gc29hcF9uZXcoKTsKKwlzb2FwLT5uYW1lc3BhY2VzID0gKHN0cnVjdCBOYW1lc3BhY2UgKiluYW1lc3BhY2VzOworCXJjID0gc29hcF9jYWxsX25zX19nZXRRdW90ZShzb2FwLCBhZGRyLCAiIiwgKGNoYXIqKXN5bWJvbCwgJnJlc3VsdCk7CisJc29hcF9lbmQoc29hcCk7CisJZnJlZShzb2FwKTsKKyAgCisJaWYgKHJjPT1TT0FQX09LKSB7CisJCWQuZD0gcmVzdWx0OworCQlGbHBGVG9BIChkLmZkLFJlc3VsdCk7CisJCVN0ZEV0b0EoUmVzdWx0KTsKKwl9IGVsc2UgeworCQlzb2FwX3NldF9mYXVsdChzb2FwKTsKKwkJc3RyY3B5IChSZXN1bHQsIHNvYXAtPm1zZ2J1Zik7CisJfQorCQorCXJldHVybiByYzsKKworfQorCit2b2lkIFN0ZEV0b0EoY2hhciAqdGV4dCkgeworCSAgaW50IGk7CisJICBpbnQgbGVuID0gc3RybGVuKHRleHQpOworCSAgY2hhciAqcHRyPXRleHQrKGxlbi0yKTsKKwkgIGludCBkaWdpdHM9YXRvaShwdHIpOworCSAgcHRyPXRleHQrMTsKKwkgIGZvciAoaT0wOyBpPGRpZ2l0czsgaSsrKQorCSAgeworCSAgICAqcHRyID0gKihwdHIrMSk7CisJICAgIHB0cisrOworCSAgfQorCSAgKnB0cj0nLic7CisJICAqKHB0ciszKT0wOworICAKK30gICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nc29hcC1wYWxtL3N0b2NrcXVvdGUvc3RvY2tRdW90ZS5tY3AgYi9nc29hcC1wYWxtL3N0b2NrcXVvdGUvc3RvY2tRdW90ZS5tY3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc5NzI0MwotLS0gL2Rldi9udWxsCisrKyBiL2dzb2FwLXBhbG0vc3RvY2txdW90ZS9zdG9ja1F1b3RlLm1jcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9nc29hcC1wYWxtL3N0b2NrcXVvdGUvc3RvY2txdW90ZV9kYXRhL0NXU2V0dGluZ3NXaW5kb3dzLnN0ZyBiL2dzb2FwLXBhbG0vc3RvY2txdW90ZS9zdG9ja3F1b3RlX2RhdGEvQ1dTZXR0aW5nc1dpbmRvd3Muc3RnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNjA3MDMKLS0tIC9kZXYvbnVsbAorKysgYi9nc29hcC1wYWxtL3N0b2NrcXVvdGUvc3RvY2txdW90ZV9kYXRhL0NXU2V0dGluZ3NXaW5kb3dzLnN0ZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9nc29hcC1wYWxtL3N0b2NrcXVvdGUvc3RvY2txdW90ZV9kYXRhL2RlYnVnL1RhcmdldERhdGFXaW5kb3dzLnRkdCBiL2dzb2FwLXBhbG0vc3RvY2txdW90ZS9zdG9ja3F1b3RlX2RhdGEvZGVidWcvVGFyZ2V0RGF0YVdpbmRvd3MudGR0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYjZmYTQKLS0tIC9kZXYvbnVsbAorKysgYi9nc29hcC1wYWxtL3N0b2NrcXVvdGUvc3RvY2txdW90ZV9kYXRhL2RlYnVnL1RhcmdldERhdGFXaW5kb3dzLnRkdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9nc29hcC1wYWxtL3N0b2NrcXVvdGUvc3RvY2txdW90ZV9kYXRhL3JlbGVhc2UvVGFyZ2V0RGF0YVdpbmRvd3MudGR0IGIvZ3NvYXAtcGFsbS9zdG9ja3F1b3RlL3N0b2NrcXVvdGVfZGF0YS9yZWxlYXNlL1RhcmdldERhdGFXaW5kb3dzLnRkdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDU0Y2FmCi0tLSAvZGV2L251bGwKKysrIGIvZ3NvYXAtcGFsbS9zdG9ja3F1b3RlL3N0b2NrcXVvdGVfZGF0YS9yZWxlYXNlL1RhcmdldERhdGFXaW5kb3dzLnRkdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9nc29hcC1zeW1iaWFuL0FCTEQuQkFUIGIvZ3NvYXAtc3ltYmlhbi9BQkxELkJBVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Njg4OTBlCi0tLSAvZGV2L251bGwKKysrIGIvZ3NvYXAtc3ltYmlhbi9BQkxELkJBVApAQCAtMCwwICsxLDE1IEBACitARUNITyBPRkYKKworUkVNIEJsZG1ha2UtZ2VuZXJhdGVkIGJhdGNoIGZpbGUgLSBBQkxELkJBVAorUkVNICoqIERPIE5PVCBFRElUICoqCisKK3BlcmwgLVMgQUJMRC5QTCBcR0RSSVZFXEdTT0FQMi42XFdJTlxJTlRFUk9QX1NZTUJJQU5cICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5CitpZiBlcnJvcmxldmVsPT0xIGdvdG8gQ2hlY2tQZXJsCitnb3RvIEVuZAorCis6Q2hlY2tQZXJsCitwZXJsIC12ID5OVUwKK2lmIGVycm9ybGV2ZWw9PTEgZWNobyBJcyBQZXJsLCB2ZXJzaW9uIDUuMDAzXzA3IG9yIGxhdGVyLCBpbnN0YWxsZWQ/Citnb3RvIEVuZAorCis6RW5kCmRpZmYgLS1naXQgYS9nc29hcC1zeW1iaWFuL0ludGVyb3AubW1wIGIvZ3NvYXAtc3ltYmlhbi9JbnRlcm9wLm1tcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWQxODg2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3NvYXAtc3ltYmlhbi9JbnRlcm9wLm1tcApAQCAtMCwwICsxLDMxIEBACisvLyBTdG9ja3F1b3RlLm1tcA0KKy8vDQorLy8gQ29weXJpZ2h0IChjKSAyMDAyIElCTS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorDQorLy8gdXNpbmcgcmVsYXRpdmUgcGF0aHMgZm9yIHNvdXJjZXBhdGggYW5kIHVzZXIgaW5jbHVkZXMNCisNCitUQVJHRVQgICAgICAgIGludGVyb3AuZXhlDQorVEFSR0VUVFlQRSAgICBleGUNCitVSUQgICAgICAgICAgIDB4MTAwMDAwOGQgMHgxMDAwNDIzOA0KKw0KK1NPVVJDRVBBVEggICAgLg0KK1NPVVJDRSAgICAgICAgaW50ZXJvcE1haW4uYw0KK1NPVVJDRSAgICAgICAgc29hcEMuY3BwDQorU09VUkNFICAgICAgICBzb2FwQ2xpZW50LmNwcA0KK1NPVVJDRSAgICAgICAgaW50ZXJvcDJ0ZXN0LmNwcA0KK1NPVVJDRSAgICAgICAgaW50ZXJvcDJCdGVzdC5jcHANCitTT1VSQ0UgICAgICAgIGludGVyb3AyQ3Rlc3QuY3BwDQorU09VUkNFUEFUSCAgICAuLg0KK1NPVVJDRSAgICAgICAgc3Rkc29hcDIuY3BwICAgICAgDQorDQorDQorDQorVVNFUklOQ0xVREUgICAuDQorVVNFUklOQ0xVREUgICAuLg0KK1NZU1RFTUlOQ0xVREUgXEVwb2MzMlxpbmNsdWRlDQorU1lTVEVNSU5DTFVERSBcRXBvYzMyXGluY2x1ZGVcbGliYw0KK1NZU1RFTUlOQ0xVREUgXEVwb2MzMlxpbmNsdWRlXG5ldHdvcmtpbmcNCisNCitMSUJSQVJZICAgICAgIGVzb2NrLmxpYiBldXNlci5saWIgZWV4ZS5saWIgZXN0bGliLmxpYiBlY3J0MC5saWINCitTVEFUSUNMSUJSQVJZICAgZWNydDAubGliDQorbm9zdHJpY3RkZWYNCmRpZmYgLS1naXQgYS9nc29hcC1zeW1iaWFuL1JFQURNRS50eHQgYi9nc29hcC1zeW1iaWFuL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE0ZjQyNwotLS0gL2Rldi9udWxsCisrKyBiL2dzb2FwLXN5bWJpYW4vUkVBRE1FLnR4dApAQCAtMCwwICsxLDM2IEBACitUaGlzIGRpcmVjdG9yeSBjb250YWlucyBhbiBleGFtcGxlIGdTT0FQIGFwcGxpY2F0aW9uIGZvciBTeW1iaWFuLgorCitUaGUgaW50ZXJvcF9hbGwuaCBnU09BUCBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBTT0FQIDEuMSBSUEMgaW50ZXJvcCByb3VuZCAyCitBLCBCLCBhbmQgQyB0ZXN0IHNlcnZpY2VzLgorCitUaGUgaW50ZXJvcF9hbGwuaCB3YXMgY29tcGlsZWQgd2l0aCB0aGUgZ1NPQVAgc29hcGNwcDIgY29tcGlsZXIgdG8gcHJvZHVjZSB0aGUKK3NlcmlhbGl6ZXJzIGFuZCBzdHVicyB0byBhY2Nlc3MgdGhlIGludGVyb3Agc2VydmljZXM6CisKK3NvYXBjcHAyIGludGVyb3BfYWxsLmgKKworVGhlIHNvYXBjcHAyIGNvbXBpbGVyIGlzIHBsYXRmb3JtLWluZGVwZW5kZW50LCBzbyB5b3UgY2FuIHJ1biB0aGUgY29tbWFuZCBvbgorV2luZG93cywgTGludXgsIG9yIE1hYyBPUyBYIGZvciBleGFtcGxlLgorCitUaGUgZ2VuZXJhdGVkIGZpbGVzIGFyZToKK3NvYXBILmgJCWhlYWRlciBmaWxlIGZvciBzZXJpYWxpemVycworc29hcEMuY3BwCXNlcmlhbGl6ZXJzCitzb2FwU3R1Yi5jcHAJaGVhZGVyIGZpbGUgZm9yIHN0dWJzCitzb2FwQ2xpZW50LmNwcAlzdHVicworCitCZWNhdXNlIHRoZSBnZW5lcmF0ZWQgY29kZSBpcyBwbGF0Zm9ybS1pbmRlcGVuZGVudCwgaXQgaXMgc3Ryb25nbHkgYWR2aXNlZCB0bwordHJ5IHRvIGJ1aWxkIGEgc2ltcGxlIHRlc3QgYXBwbGljYXRpb24gb24gYSBub24tUGFsbSBwbGF0Zm9ybSBmaXJzdCB0byB2ZXJpZnkKK2ludGVyb3BlcmFiaWxpdHkgYW5kIGRhdGEgZXhjaGFuZ2UuIEJlY2F1c2UgbG9nZ2luZyBpcyBkaXNhYmxlZCBvbiBQYWxtLCBpdAord2lsbCBiZSBoYXJkIHRvIGZpbmQgdGhlIHNvdXJjZSBvZiBhIGludGVyb3AgcHJvYmxlbS4gQWZ0ZXIgdGVzdGluZyB0aGUKK2FwcGxpY2F0aW9uLCB5b3UgY2FuIHVzZSB0aGUgc2FtZSBzb3VyY2VzIHRvIGJ1aWxkIGEgUGFsbSBPUyBhcHBsaWNhdGlvbi4gIFRoZQorc3Rkc29hcDIuaCBhbmQgc3Rkc29hcDIuY3BwIGNvbnRhaW5zIHBsYXRmb3JtLWRlcGVuZGVudCBjb2RlIGFuZCBpcyByZXF1aXJlZAordG8gY29tcGxldGUgdGhlIGJ1aWxkIG9mIHlvdXIgYXBwbGljYXRpb24uCisKK1RvIGRldmVsb3AgYW4gYXBwbGljYXRpb24gZnJvbSBhIFdTREwsIHJ1biB3c2RsMmguZXhlIChvciBhIHdzZGwyaCBleGVjdXRhYmxlCitmb3IgYW55IG90aGVyIHBsYXRmb3JtKSBvbiB0aGUgV1NETCBmaWxlLiBNaW5kIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucy4gRm9yCitleGFtcGxlLCB3c2RsMmguZXhlIC1jIGdlbmVyYXRlcyBDIGNvZGUgYW5kIHdzZGwyaC5leGUgLXMgZ2VuZXJhdGVzIEMrKyBjb2RlCit3aXRob3V0IHJlcXVpcmluZyBTVEwuIFRoaXMgY29tbWFuZCBnZW5lcmF0ZWQgYSBDIG9yIEMrKyBoZWFkZXIgZmlsZS4gQWZ0ZXIKK3RoaXMsIHlvdSBuZWVkIHRvIHJ1biBzb2FwY3BwMi5leGUgb24gdGhlIGdlbmVyYXRlZCBoZWFkZXIgZmlsZSB0byBjcmVhdGUgdGhlCitzZXJpYWxpemVycyBhbmQgc3R1YnMuCisKK1NlZSBnc29hcE9uU3ltYmlhbi5kb2MgZm9yIFN5bWJpYW4tc3BlY2lmaWMgYnVpbGQgaXNzdWVzLgorCmRpZmYgLS1naXQgYS9nc29hcC1zeW1iaWFuL2JsZC5pbmYgYi9nc29hcC1zeW1iaWFuL2JsZC5pbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc1NWMzMAotLS0gL2Rldi9udWxsCisrKyBiL2dzb2FwLXN5bWJpYW4vYmxkLmluZgpAQCAtMCwwICsxLDQgQEAKKw0KK1BSSl9NTVBGSUxFUw0KKw0KK0ludGVyb3AubW1wDQpkaWZmIC0tZ2l0IGEvZ3NvYXAtc3ltYmlhbi9nc29hcE9uU3ltYmlhbi5kb2MgYi9nc29hcC1zeW1iaWFuL2dzb2FwT25TeW1iaWFuLmRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjM1ZWUzCi0tLSAvZGV2L251bGwKKysrIGIvZ3NvYXAtc3ltYmlhbi9nc29hcE9uU3ltYmlhbi5kb2MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3NvYXAtc3ltYmlhbi9pbnRlcm9wLnNpcyBiL2dzb2FwLXN5bWJpYW4vaW50ZXJvcC5zaXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQyZmNlMAotLS0gL2Rldi9udWxsCisrKyBiL2dzb2FwLXN5bWJpYW4vaW50ZXJvcC5zaXMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3NvYXAtc3ltYmlhbi9pbnRlcm9wMi5uc21hcCBiL2dzb2FwLXN5bWJpYW4vaW50ZXJvcDIubnNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNiMTE5MAotLS0gL2Rldi9udWxsCisrKyBiL2dzb2FwLXN5bWJpYW4vaW50ZXJvcDIubnNtYXAKQEAgLTAsMCArMSwxNCBAQAorCisjaW5jbHVkZSAic29hcEguaCIKK1NPQVBfTk1BQyBzdHJ1Y3QgTmFtZXNwYWNlIG5hbWVzcGFjZXNbXSA9Cit7CisJeyJTT0FQLUVOViIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIsICJodHRwOi8vd3d3LnczLm9yZy8qL3NvYXAtZW52ZWxvcGUiLCBOVUxMfSwKKwl7IlNPQVAtRU5DIiwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiwgImh0dHA6Ly93d3cudzMub3JnLyovc29hcC1lbmNvZGluZyIsIE5VTEx9LAorCXsieHNpIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgImh0dHA6Ly93d3cudzMub3JnLyovWE1MU2NoZW1hLWluc3RhbmNlIiwgTlVMTH0sCisJeyJ4c2QiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLCAiaHR0cDovL3d3dy53My5vcmcvKi9YTUxTY2hlbWEiLCBOVUxMfSwKKwl7InMiLCAiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QiLCBOVUxMLCBOVUxMfSwKKwl7Im5zIiwgImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiwgTlVMTCwgTlVMTH0sCisJeyJoIiwgImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvZWNob2hlYWRlci8iLCBOVUxMLCBOVUxMfSwKKwl7Im0iLCAiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLCBOVUxMLCBOVUxMfSwKKwl7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0KK307CmRpZmYgLS1naXQgYS9nc29hcC1zeW1iaWFuL2ludGVyb3AyQnRlc3QuY3BwIGIvZ3NvYXAtc3ltYmlhbi9pbnRlcm9wMkJ0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzdiYjI0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3NvYXAtc3ltYmlhbi9pbnRlcm9wMkJ0ZXN0LmNwcApAQCAtMCwwICsxLDIxMiBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vICAgIChDKSBDT1BZUklHSFQgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwMiBBbGwgUmlnaHRzIFJlc2VydmVkCisvLyAgICBMaWNlbnNlZCBNYXRlcmlhbHMgLSBQcm9wZXJ0eSBvZiBJQk0KKy8vICAgIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yCisvLyAgICBkaXNjbG9zdXJlIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLgorLy8KKy8vICAgIElCTSBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCisvLyAgICBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisvLyAgICBQVVJQT1NFLiBJTiBOTyBFVkVOVCBTSEFMTCBJQk0gQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKy8vICAgIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKKy8vICAgIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorLy8gICAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRQorLy8gICAgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKy8vCisvLyAgICBUaGUgcHJvZ3JhbSBtYXkgYmUgdXNlZCwgZXhlY3V0ZWQsIGNvcGllZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZAorLy8gICAgd2l0aG91dCByb3lhbHR5IGZvciB0aGUgcHVycG9zZSBvZiBkZXZlbG9waW5nLCB1c2luZywgbWFya2V0aW5nLCBvciBkaXN0cmlidXRpbmcuCisvLyAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBnU09BUCB2MiBJbnRlcm9wIEIgdGVzdCByb3VuZCAyCisjaW5jbHVkZSAic29hcEguaCIKK2V4dGVybiAiQyIgdm9pZCBkaXNwbGF5VGV4dChjaGFyICp0ZXh0KTsKK2V4dGVybiAiQyIgaW50IGludGVyb3BCKGNvbnN0IGNoYXIgKnNpdGUpOworCitzdHJ1Y3QgTmFtZXNwYWNlIG5hbWVzcGFjZXNCW10gPQoreworICB7IlNPQVAtRU5WIiwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIn0sCisgIHsiU09BUC1FTkMiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8ifSwKKyAgLy97IlNPQVAtRU5WIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDIvMDYvc29hcC1lbnZlbG9wZSJ9LAkvLyBTT0FQIDEuMgorICAvL3siU09BUC1FTkMiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMi8wNi9zb2FwLWVuY29kaW5nIn0sCS8vIFNPQVAgMS4yCisgIHsieHNpIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgImh0dHA6Ly93d3cudzMub3JnLyovWE1MU2NoZW1hLWluc3RhbmNlIn0sCisgIHsieHNkIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiwgImh0dHA6Ly93d3cudzMub3JnLyovWE1MU2NoZW1hIn0sCisgIHsibnMiLCAiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8ifSwKKyAgeyJzIiwgImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkIn0sCisgIHtOVUxMLCBOVUxMfQorfTsKKworaW50IGludGVyb3BCKGNvbnN0IGNoYXIgKnVybCkKK3sKKyAgc3RydWN0IHNvYXAgKnNvYXA7CisgIGNoYXIgKnNpdGU9KGNoYXIqKXVybDsKKy8vICBjaGFyKiBzaXRlID0iaHR0cDovL3dlYnNydi5jcy5mc3UuZWR1L35lbmdlbGVuL2ludGVyb3AyQi5jZ2kiOworICBjaGFyKiBhY3Rpb24gPSAiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iOworICAKKyAgYm9vbCBvaz10cnVlOworICBpbnQgaSwgZzsKKyAgeHNkX19zdHJpbmcgcyA9ICJIZWxsbyBXb3JsZCEgPD4mIjsKKyAgeHNkX19pbnQgbiA9IDIxNDc0ODM2NDc7CisgIHhzZF9fZmxvYXQgZiA9IDMuNDAyODJlKzM4OworICBzdHJ1Y3QgQXJyYXlPZnN0cmluZyBhOworICBzdHJ1Y3QgQXJyYXlPZnN0cmluZzJEIGFhaTsKKyAgc3RydWN0IEFycmF5T2ZzdHJpbmcyRCBhYW87CisKKyAgc3RydWN0IHNfX1NPQVBTdHJ1Y3Qgc3RpOworICBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RBc1NpbXBsZVR5cGVzUmVzcG9uc2UgUm87CisgIHN0cnVjdCBuc19fZWNob1NpbXBsZVR5cGVzQXNTdHJ1Y3RSZXNwb25zZSBSc3RvOworICBzdHJ1Y3Qgc19fU09BUFN0cnVjdFN0cnVjdCBzc3RpOworICBzdHJ1Y3QgbnNfX2VjaG9OZXN0ZWRTdHJ1Y3RSZXNwb25zZSBSc3N0bzsKKyAgc3RydWN0IHNfX1NPQVBBcnJheVN0cnVjdCBzYXRpOworICBzdHJ1Y3QgbnNfX2VjaG9OZXN0ZWRBcnJheVJlc3BvbnNlIFJzYXRvOworCisgIGRpc3BsYXlUZXh0KCJydW5uaW5nIHRlc3QgQiBvbiIpOworICBkaXNwbGF5VGV4dCgoY2hhciopdXJsKTsKKyAgc29hcCA9IHNvYXBfbmV3KCk7CisgIHNvYXAtPm5hbWVzcGFjZXMgPSAoc3RydWN0IE5hbWVzcGFjZSAqKW5hbWVzcGFjZXNCOworCisvLyAgRklMRSAqZmQgPSBmb3BlbigiaW50ZXJvcDJCZmF1bHRzLmh0bWwiLCAiYSIpOworCisvLyAgc29hcF9pbml0KCZzb2FwKTsKKworICBzb2FwLT5zZW5kX3RpbWVvdXQgPSAzMDsKKyAgc29hcC0+cmVjdl90aW1lb3V0ID0gMzA7CisKKyAgc3RpLnZhclN0cmluZyA9ICJIZWxsbyI7CisgIHN0aS52YXJJbnQgPSAmbjsKKyAgc3RpLnZhckZsb2F0ID0gJmY7CisKKyAgc3N0aS52YXJTdHJpbmcgPSAiU09BUCEiOworICBzc3RpLnZhckludCA9ICZuOworICBzc3RpLnZhckZsb2F0ID0gJmY7CisgIHNzdGkudmFyU3RydWN0ID0gJnN0aTsKKworICBhLl9fc2l6ZSA9IDU7CisgIGEuX19vZmZzZXQgPSAyOworICBhLl9fcHRyID0gKGNoYXIqKiltYWxsb2MoYS5fX3NpemUqc2l6ZW9mKGNoYXIqKSk7CisgIGEuX19wdHJbMF0gPSAiSW50ZXJvcCI7CisgIGEuX19wdHJbMV0gPSAiVGVzdCI7CisgIGEuX19wdHJbMl0gPSAiUm91bmQiOworICBhLl9fcHRyWzNdID0gIjIiOworICBhLl9fcHRyWzRdID0gYS5fX3B0clsxXTsKKworICBhYWkuX19zaXplWzBdID0gMjsKKyAgYWFpLl9fc2l6ZVsxXSA9IDM7CisgIGFhaS5fX29mZnNldFswXSA9IDA7CisgIGFhaS5fX29mZnNldFsxXSA9IDA7CisgIGFhaS5fX3B0ciA9IChjaGFyKiopbWFsbG9jKGFhaS5fX3NpemVbMF0qYWFpLl9fc2l6ZVsxXSpzaXplb2YoY2hhciopKTsKKyAgYWFpLl9fcHRyWzBdID0gIkludGVyb3AgVGVzdCI7CisgIGFhaS5fX3B0clsxXSA9IE5VTEw7CisgIGFhaS5fX3B0clsyXSA9ICJSb3VuZCI7CisgIGFhaS5fX3B0clszXSA9ICIyIjsKKyAgYWFpLl9fcHRyWzRdID0gYS5fX3B0clsxXTsKKyAgYWFpLl9fcHRyWzVdID0gTlVMTDsKKworICBzYXRpLnZhclN0cmluZyA9IGEuX19wdHJbMF07CisgIHNhdGkudmFySW50ID0gJm47CisgIHNhdGkudmFyRmxvYXQgPSAmZjsKKyAgc2F0aS52YXJBcnJheSA9IGE7CisgICAKKyAgaWYgKHNvYXBfY2FsbF9uc19fZWNob1N0cnVjdEFzU2ltcGxlVHlwZXMoc29hcCwgc2l0ZSwgImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiwgc3RpLCBSbykpCisgIHsgCisgICAgZGlzcGxheVRleHQoImVjaG9TdHJ1Y3RBc1NpbXBsZVR5cGVzIGZhaWxlZCIpOworICAgIG9rPWZhbHNlOworICB9ICBlbHNlIGlmICghUm8uX291dHB1dFN0cmluZyB8fCBzdHJjbXAoc3RpLnZhclN0cmluZywgUm8uX291dHB1dFN0cmluZykgfHwgIVJvLl9vdXRwdXRJbnRlZ2VyIHx8ICpzdGkudmFySW50ICE9ICpSby5fb3V0cHV0SW50ZWdlcgorICB8fCAhUm8uX291dHB1dEZsb2F0IHx8ICpzdGkudmFyRmxvYXQgIT0gKlJvLl9vdXRwdXRGbG9hdCkKKyAgeworICAJZGlzcGxheVRleHQoImVjaG9TdHJ1Y3RBc1NpbXBsZVR5cGVzIG1pc21hdGNoZWQiKTsKKyAgICBvaz1mYWxzZTsKKyAgfQorICBlbHNlCisgIAlkaXNwbGF5VGV4dCgiZWNob1N0cnVjdEFzU2ltcGxlVHlwZXMgcGFzc2VkIik7CisKKyAgaWYgKHNvYXBfY2FsbF9uc19fZWNob1NpbXBsZVR5cGVzQXNTdHJ1Y3Qoc29hcCwgc2l0ZSwgImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiwgcywgJm4sICZmLCBSc3RvKSkKKyAgeyAKKyAgICBkaXNwbGF5VGV4dCgiZWNob1NpbXBsZVR5cGVzQXNTdHJ1Y3QgZmFpbGVkIik7CisgICAgb2s9ZmFsc2U7CisgIH0KKyAgZWxzZSBpZiAoIVJzdG8uX3JldHVybi52YXJTdHJpbmcgfHwgc3RyY21wKHMsIFJzdG8uX3JldHVybi52YXJTdHJpbmcpIHx8ICFSc3RvLl9yZXR1cm4udmFySW50IHx8IG4gIT0gKlJzdG8uX3JldHVybi52YXJJbnQgfHwgIVJzdG8uX3JldHVybi52YXJGbG9hdCB8fCBmICE9ICpSc3RvLl9yZXR1cm4udmFyRmxvYXQpCisgIHsKKyAgCWRpc3BsYXlUZXh0KCJlY2hvU2ltcGxlVHlwZXNBc1N0cnVjdCBtaXNtYXRjaGVkIik7CisgICAgb2s9ZmFsc2U7CisgIH0KKyAgZWxzZQorICAJZGlzcGxheVRleHQoImVjaG9TaW1wbGVUeXBlc0FzU3RydWN0IHBhc3NlZCIpOworCisgIGlmIChzb2FwX2NhbGxfbnNfX2VjaG8yRFN0cmluZ0FycmF5KHNvYXAsc2l0ZSwgImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiwgYWFpLCBhYW8pKQorICB7IAorICAgIGRpc3BsYXlUZXh0KCJlY2hvMkRTdHJpbmdBcnJheSBmYWlsZWQiKTsKKyAgICBvaz1mYWxzZTsKKyAgfQorICBlbHNlCisgIHsgZyA9IDA7CisgICAgaWYgKGFhaS5fX3NpemVbMF0gIT0gYWFvLl9fc2l6ZVswXSB8fCBhYWkuX19zaXplWzFdICE9IGFhby5fX3NpemVbMV0gfHwgIWFhby5fX3B0cikKKyAgICAgIGcgPSAxOworICAgIGVsc2UKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBhYWkuX19zaXplWzBdKmFhaS5fX3NpemVbMV07IGkrKykKKyAgICAgICAgaWYgKGFhaS5fX3B0cltpXSAmJiAoIWFhby5fX3B0cltpXSB8fCBzdHJjbXAoYWFpLl9fcHRyW2ldLCBhYW8uX19wdHJbaV0pKSkKKwkgIGcgPSAxOworICAgIGlmIChnKQorICAgIHsKKyAgICAJZGlzcGxheVRleHQoImVjaG8yRFN0cmluZ0FycmF5IG1pc21hdGNoZWQiKTsKKyAgICBvaz1mYWxzZTsKKyAgICB9CisgICAgZWxzZQorCSAgCWRpc3BsYXlUZXh0KCJlY2hvMkRTdHJpbmdBcnJheSBwYXNzZWQiKTsKKyAgfQorCisgIGlmIChzb2FwX2NhbGxfbnNfX2VjaG9OZXN0ZWRTdHJ1Y3Qoc29hcCwgc2l0ZSwgImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiwgc3N0aSwgUnNzdG8pKQorICB7IAorICAgIGRpc3BsYXlUZXh0KCJlY2hvTmVzdGVkU3RydWN0IGZhaWxlZCIpOworICAgIG9rPWZhbHNlOworICB9CisgIGVsc2UgaWYgKCFSc3N0by5fcmV0dXJuLnZhclN0cmluZyB8fCBzdHJjbXAoc3N0aS52YXJTdHJpbmcsIFJzc3RvLl9yZXR1cm4udmFyU3RyaW5nKSB8fAorICAhUnNzdG8uX3JldHVybi52YXJJbnQgfHwgKnNzdGkudmFySW50ICE9ICpSc3N0by5fcmV0dXJuLnZhckludCB8fAorICAhUnNzdG8uX3JldHVybi52YXJGbG9hdCB8fCAqc3N0aS52YXJGbG9hdCAhPSAqUnNzdG8uX3JldHVybi52YXJGbG9hdCB8fAorICAhUnNzdG8uX3JldHVybi52YXJTdHJ1Y3QgfHwgCisgICFSc3N0by5fcmV0dXJuLnZhclN0cnVjdC0+dmFyU3RyaW5nIHx8IHN0cmNtcChzc3RpLnZhclN0cnVjdC0+dmFyU3RyaW5nLCBSc3N0by5fcmV0dXJuLnZhclN0cnVjdC0+dmFyU3RyaW5nKSB8fAorICAhUnNzdG8uX3JldHVybi52YXJTdHJ1Y3QtPnZhckludCB8fCAqc3N0aS52YXJTdHJ1Y3QtPnZhckludCAhPSAqUnNzdG8uX3JldHVybi52YXJTdHJ1Y3QtPnZhckludCB8fCAKKyAgIVJzc3RvLl9yZXR1cm4udmFyU3RydWN0LT52YXJGbG9hdCB8fCAqc3N0aS52YXJTdHJ1Y3QtPnZhckZsb2F0ICE9ICpSc3N0by5fcmV0dXJuLnZhclN0cnVjdC0+dmFyRmxvYXQpCisgICAgeworICAgIAlkaXNwbGF5VGV4dCgiZWNob05lc3RlZFN0cnVjdCBtaXNtYXRjaGVkIik7CisgICAgb2s9ZmFsc2U7CisgIH0KKyAgZWxzZQorICAJZGlzcGxheVRleHQoImVjaG9OZXN0ZWRTdHJ1Y3QgcGFzc2VkIik7CisKKyAgaWYgKHNvYXBfY2FsbF9uc19fZWNob05lc3RlZEFycmF5KHNvYXAsIHNpdGUsICJodHRwOi8vc29hcGludGVyb3Aub3JnLyIsIHNhdGksIFJzYXRvKSkKKyAgeyAKKyAgICBkaXNwbGF5VGV4dCgiZWNob05lc3RlZEFycmF5IGZhaWxlZCIpOworICAgIG9rPWZhbHNlOworICB9CisgIGVsc2UgaWYgKCFSc2F0by5fcmV0dXJuLnZhclN0cmluZyB8fCBzdHJjbXAoc2F0aS52YXJTdHJpbmcsIFJzYXRvLl9yZXR1cm4udmFyU3RyaW5nKSB8fAorICAhUnNhdG8uX3JldHVybi52YXJJbnQgfHwgKnNhdGkudmFySW50ICE9ICpSc2F0by5fcmV0dXJuLnZhckludCB8fAorICAhUnNhdG8uX3JldHVybi52YXJGbG9hdCB8fCAqc2F0aS52YXJGbG9hdCAhPSAqUnNhdG8uX3JldHVybi52YXJGbG9hdCB8fAorICBzYXRpLnZhckFycmF5Ll9fc2l6ZStzYXRpLnZhckFycmF5Ll9fb2Zmc2V0ICE9IFJzYXRvLl9yZXR1cm4udmFyQXJyYXkuX19zaXplK1JzYXRvLl9yZXR1cm4udmFyQXJyYXkuX19vZmZzZXQpCisgICAgeworICAgIAlkaXNwbGF5VGV4dCgiZWNob05lc3RlZEFycmF5IG1pc21hdGNoZWQiKTsKKyAgICBvaz1mYWxzZTsKKyAgfQorICBlbHNlCisgIHsgZyA9IDA7CisgICAgZm9yIChpID0gc2F0aS52YXJBcnJheS5fX29mZnNldDsgaSA8IHNhdGkudmFyQXJyYXkuX19zaXplK3NhdGkudmFyQXJyYXkuX19vZmZzZXQ7IGkrKykKKyAgICAgIGlmICghUnNhdG8uX3JldHVybi52YXJBcnJheS5fX3B0cltpLVJzYXRvLl9yZXR1cm4udmFyQXJyYXkuX19vZmZzZXRdIHx8CisgICAgICAgICAgc3RyY21wKHNhdGkudmFyQXJyYXkuX19wdHJbaS1zYXRpLnZhckFycmF5Ll9fb2Zmc2V0XSwgUnNhdG8uX3JldHVybi52YXJBcnJheS5fX3B0cltpLVJzYXRvLl9yZXR1cm4udmFyQXJyYXkuX19vZmZzZXRdKSkKKyAgICAgICAgICBnID0gMTsKKyAgICBpZiAoZykKKyAgICB7CisgICAgCWRpc3BsYXlUZXh0KCJlY2hvTmVzdGVkQXJyYXkgbWlzbWF0Y2hlZCIpOworCSAgICBvaz1mYWxzZTsKKyAgICB9CisgICAgZWxzZQorCSAgCWRpc3BsYXlUZXh0KCJlY2hvTmVzdGVkQXJyYXkgcGFzc2VkIik7CisgIH0KKworICBpZiAob2spCisgIAlkaXNwbGF5VGV4dCgiQWxsIFBhc3NlZCIpOworICAJZWxzZQorCSAgZGlzcGxheVRleHQoIkZBSUxVUkVTIik7CisKKyAgcmV0dXJuIDA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZ3NvYXAtc3ltYmlhbi9pbnRlcm9wMkMubnNtYXAgYi9nc29hcC1zeW1iaWFuL2ludGVyb3AyQy5uc21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2IxMTkwCi0tLSAvZGV2L251bGwKKysrIGIvZ3NvYXAtc3ltYmlhbi9pbnRlcm9wMkMubnNtYXAKQEAgLTAsMCArMSwxNCBAQAorCisjaW5jbHVkZSAic29hcEguaCIKK1NPQVBfTk1BQyBzdHJ1Y3QgTmFtZXNwYWNlIG5hbWVzcGFjZXNbXSA9Cit7CisJeyJTT0FQLUVOViIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIsICJodHRwOi8vd3d3LnczLm9yZy8qL3NvYXAtZW52ZWxvcGUiLCBOVUxMfSwKKwl7IlNPQVAtRU5DIiwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiwgImh0dHA6Ly93d3cudzMub3JnLyovc29hcC1lbmNvZGluZyIsIE5VTEx9LAorCXsieHNpIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgImh0dHA6Ly93d3cudzMub3JnLyovWE1MU2NoZW1hLWluc3RhbmNlIiwgTlVMTH0sCisJeyJ4c2QiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLCAiaHR0cDovL3d3dy53My5vcmcvKi9YTUxTY2hlbWEiLCBOVUxMfSwKKwl7InMiLCAiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QiLCBOVUxMLCBOVUxMfSwKKwl7Im5zIiwgImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiwgTlVMTCwgTlVMTH0sCisJeyJoIiwgImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvZWNob2hlYWRlci8iLCBOVUxMLCBOVUxMfSwKKwl7Im0iLCAiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLCBOVUxMLCBOVUxMfSwKKwl7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0KK307CmRpZmYgLS1naXQgYS9nc29hcC1zeW1iaWFuL2ludGVyb3AyQ3Rlc3QuY3BwIGIvZ3NvYXAtc3ltYmlhbi9pbnRlcm9wMkN0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWJlNWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3NvYXAtc3ltYmlhbi9pbnRlcm9wMkN0ZXN0LmNwcApAQCAtMCwwICsxLDE3OSBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vICAgIChDKSBDT1BZUklHSFQgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwMiBBbGwgUmlnaHRzIFJlc2VydmVkCisvLyAgICBMaWNlbnNlZCBNYXRlcmlhbHMgLSBQcm9wZXJ0eSBvZiBJQk0KKy8vICAgIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yCisvLyAgICBkaXNjbG9zdXJlIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLgorLy8KKy8vICAgIElCTSBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCisvLyAgICBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisvLyAgICBQVVJQT1NFLiBJTiBOTyBFVkVOVCBTSEFMTCBJQk0gQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKy8vICAgIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKKy8vICAgIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorLy8gICAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRQorLy8gICAgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKy8vCisvLyAgICBUaGUgcHJvZ3JhbSBtYXkgYmUgdXNlZCwgZXhlY3V0ZWQsIGNvcGllZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZAorLy8gICAgd2l0aG91dCByb3lhbHR5IGZvciB0aGUgcHVycG9zZSBvZiBkZXZlbG9waW5nLCB1c2luZywgbWFya2V0aW5nLCBvciBkaXN0cmlidXRpbmcuCisvLyAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBnU09BUCB2MiBJbnRlcm9wIEIgdGVzdCByb3VuZCAyCisjaW5jbHVkZSAic29hcEguaCIKK2V4dGVybiAiQyIgdm9pZCBkaXNwbGF5VGV4dChjaGFyICp0ZXh0KTsKK2V4dGVybiAiQyIgaW50IGludGVyb3BDKGNvbnN0IGNoYXIgKnNpdGUpOworCisKK3N0cnVjdCBOYW1lc3BhY2UgbmFtZXNwYWNlc0NbXSA9Cit7IHsiU09BUC1FTlYiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8ifSwKKyAgeyJTT0FQLUVOQyIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyJ9LAorICB7InhzaSIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsICJodHRwOi8vd3d3LnczLm9yZy8qL1hNTFNjaGVtYS1pbnN0YW5jZSJ9LAorICB7InhzZCIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsICJodHRwOi8vd3d3LnczLm9yZy8qL1hNTFNjaGVtYSJ9LAorICB7Im0iLCAiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8ifSwKKyAgeyJzIiwgImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkIn0sCisgIHsiYSIsICJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAifSwKKyAgeyJoIiwgImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvZWNob2hlYWRlci8ifSwKKyAge05VTEwsIE5VTEx9Cit9OworaW50IGludGVyb3BDKGNvbnN0IGNoYXIgKnVybCkKK3sgc3RydWN0IHNvYXAgKnNvYXA7CisgIGNoYXIgKnNpdGU9KGNoYXIqKXVybDsKKyAgYm9vbCBvaz10cnVlOworICB4c2RfX2ludCBuID0gNDI7CisgIGZsb2F0IGYgID0gMy40MDI4MmUrMzg7CisgIHN0cnVjdCBTT0FQX0VOVl9fSGVhZGVyIGg7CisgIHN0cnVjdCBtX19lY2hvVm9pZFJlc3BvbnNlIHI7CisgIHN0cnVjdCBzX19TT0FQU3RydWN0IHM7CisKKyAgaC5oX19lY2hvTWVTdHJpbmdSZXF1ZXN0ID0gTlVMTDsKKyAgaC5oX19lY2hvTWVTdHJpbmdSZXF1ZXN0XyA9IE5VTEw7CisgIGguaF9fZWNob01lU3RyaW5nUmVzcG9uc2UgPSBOVUxMOworICBoLmhfX2VjaG9NZVN0cnVjdFJlcXVlc3QgPSBOVUxMOworICBoLmhfX2VjaG9NZVN0cnVjdFJlcXVlc3RfID0gTlVMTDsKKyAgaC5oX19lY2hvTWVTdHJ1Y3RSZXNwb25zZSA9IE5VTEw7CisgIGguaF9fc29tZVVua25vd25SZXF1ZXN0ID0gTlVMTDsKKyAgaC5oX19zb21lVW5rbm93blJlcXVlc3RfID0gTlVMTDsKKyAgcy52YXJTdHJpbmcgPSAiaGVsbG8gd29ybGQiOworICBzLnZhckludCA9ICZuOworICBzLnZhckZsb2F0ID0gJmY7CisKKworICBkaXNwbGF5VGV4dCgicnVubmluZyB0ZXN0IEMgb24iKTsKKyAgZGlzcGxheVRleHQoKGNoYXIqKXVybCk7CisgIHNvYXAgPSBzb2FwX25ldygpOworICBzb2FwLT5uYW1lc3BhY2VzID0gKHN0cnVjdCBOYW1lc3BhY2UgKiluYW1lc3BhY2VzQzsKKworICBzb2FwLT5zZW5kX3RpbWVvdXQgPSAzMDA7CisgIHNvYXAtPnJlY3ZfdGltZW91dCA9IDMwMDsKKworICAvLyByZXF1ZXN0IGZyb20gY2xpZW50ICh3aXRoIG11c3RVbmRlcnN0YW5kPSIwIiwgcmVjaXBpZW50IGlzIHRhcmdldCkKKyAgaC5oX19lY2hvTWVTdHJpbmdSZXF1ZXN0ID0gImhlbGxvIHdvcmxkIjsKKyAgc29hcC0+aGVhZGVyID0gJmg7CisgIHNvYXAtPmFjdG9yID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvYWN0b3IvbmV4dCI7CisgIGlmIChzb2FwX2NhbGxfbV9fZWNob1ZvaWQoc29hcCwgc2l0ZSwgImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiwgcikpCisgIHsgCisgICAgZGlzcGxheVRleHQoImVjaG8xIGZhaWxlZCIpOworICAgIG9rPWZhbHNlOworICB9CisgIGVsc2UKKyAgICBkaXNwbGF5VGV4dCgiZWNobzEgcGFzc2VkIik7CisKKyAgLy8gcmVxdWVzdCBmcm9tIGNsaWVudCAod2l0aCBtdXN0VW5kZXJzdGFuZD0iMCIsIHJlY2lwaWVudCBpcyBub3QgdGFyZ2V0KQorICBzb2FwLT5oZWFkZXIgPSAmaDsKKyAgc29hcC0+YWN0b3IgPSAiaHR0cDovL3NvbWUvb3RoZXIvYWN0b3IiOworICBpZiAoc29hcF9jYWxsX21fX2VjaG9Wb2lkKHNvYXAsIHNpdGUsICJodHRwOi8vc29hcGludGVyb3Aub3JnLyIsIHIpKQorICB7IAorICAgIGRpc3BsYXlUZXh0KCJlY2hvMiBmYWlsZWQiKTsKKyAgICBvaz1mYWxzZTsKKyAgfQorICBlbHNlCisgICAgZGlzcGxheVRleHQoImVjaG8yIHBhc3NlZCIpOworCisgIC8vIHJlcXVlc3QgZnJvbSBjbGllbnQgKHdpdGggbXVzdFVuZGVyc3RhbmQ9IjEiLCByZWNpcGllbnQgaXMgdGFyZ2V0KQorICBoLmhfX2VjaG9NZVN0cmluZ1JlcXVlc3QgPSBOVUxMOworICBoLmhfX2VjaG9NZVN0cnVjdFJlcXVlc3RfID0gJnM7CisgIHNvYXAtPmhlYWRlciA9ICZoOworICBzb2FwLT5hY3RvciA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2FjdG9yL25leHQiOworICBpZiAoc29hcF9jYWxsX21fX2VjaG9Wb2lkKHNvYXAsIHNpdGUsICJodHRwOi8vc29hcGludGVyb3Aub3JnLyIsIHIpKQorICB7IAorICAgIGRpc3BsYXlUZXh0KCJlY2hvMyBmYWlsZWQiKTsKKyAgICBvaz1mYWxzZTsKKyAgfQorICBlbHNlCisgICAgZGlzcGxheVRleHQoImVjaG8zIHBhc3NlZCIpOworCisgIC8vIHJlcXVlc3QgZnJvbSBjbGllbnQgKHdpdGggbXVzdFVuZGVyc3RhbmQ9IjEiLCByZWNpcGllbnQgaXMgbm90IHRhcmdldCkKKyAgc29hcC0+aGVhZGVyID0gJmg7CisgIHNvYXAtPmFjdG9yID0gImh0dHA6Ly9zb21lL290aGVyL2FjdG9yIjsKKyAgaWYgKHNvYXBfY2FsbF9tX19lY2hvVm9pZChzb2FwLHNpdGUsICJodHRwOi8vc29hcGludGVyb3Aub3JnLyIsIHIpKQorICB7IAorICAgIGRpc3BsYXlUZXh0KCJlY2hvNCBmYWlsZWQiKTsKKyAgICBvaz1mYWxzZTsKKyAgfQorICBlbHNlIGlmIChzb2FwLT5oZWFkZXIgJiYgc29hcC0+aGVhZGVyLT5oX19lY2hvTWVTdHJ1Y3RSZXNwb25zZSkKKyAgeyAKKyAgICBkaXNwbGF5VGV4dCgiZWNobzQgc2hvdWxkIGJlIG5vIHJlc3BvbnNlIGhlYWRlciIpOworICAgIG9rPWZhbHNlOworICAgfQorICBlbHNlCisgICAgZGlzcGxheVRleHQoImVjaG80IHBhc3NlZCIpOworCisgIC8vIFVua25vd24gaGVhZGVyIGVsZW1lbnQ6IHJlcXVlc3QgZnJvbSBjbGllbnQgKHdpdGggbXVzdFVuZGVyc3RhbmQ9IjAiLCByZWNpcGllbnQgaXMgdGFyZ2V0KQorICBoLmhfX2VjaG9NZVN0cnVjdFJlcXVlc3RfID0gTlVMTDsKKyAgaC5oX19zb21lVW5rbm93blJlcXVlc3QgPSAiWFlaIjsKKyAgc29hcC0+aGVhZGVyID0gJmg7CisgIHNvYXAtPmFjdG9yID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvYWN0b3IvbmV4dCI7CisgIGlmIChzb2FwX2NhbGxfbV9fZWNob1ZvaWQoc29hcCwgc2l0ZSwgImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiwgcikpCisgIHsgCisgICAgZGlzcGxheVRleHQoImVjaG81IGZhaWxlZCIpOworICAgIG9rPWZhbHNlOworICB9CisgIGVsc2UKKyAgICBkaXNwbGF5VGV4dCgiZWNobzUgcGFzc2VkIik7CisKKyAgLy8gVW5rbm93biBoZWFkZXIgZWxlbWVudDogcmVxdWVzdCBmcm9tIGNsaWVudCAod2l0aCBtdXN0VW5kZXJzdGFuZD0iMSIsIHJlY2lwaWVudCBpcyB0YXJnZXQpCisgIGguaF9fc29tZVVua25vd25SZXF1ZXN0ID0gTlVMTDsKKyAgaC5oX19zb21lVW5rbm93blJlcXVlc3RfID0gIlhZWiI7CisgIHNvYXAtPmhlYWRlciA9ICZoOworICBzb2FwLT5hY3RvciA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2FjdG9yL25leHQiOworICBpZiAoc29hcF9jYWxsX21fX2VjaG9Wb2lkKHNvYXAsIHNpdGUsICJodHRwOi8vc29hcGludGVyb3Aub3JnLyIsIHIpICE9IFNPQVBfTVVTVFVOREVSU1RBTkQpCisgIHsgCisgICAgZGlzcGxheVRleHQoImVjaG82IGZhaWxlZCIpOworICAgIG9rPWZhbHNlOworICB9CisgIGVsc2UKKyAgICBkaXNwbGF5VGV4dCgiZWNobzYgcGFzc2VkIik7CisKKyAgLy8gVW5rbm93biBoZWFkZXIgZWxlbWVudDogcmVxdWVzdCBmcm9tIGNsaWVudCAod2l0aCBtdXN0VW5kZXJzdGFuZD0iMCIsIHJlY2lwaWVudCBpcyBub3QgdGFyZ2V0KQorICBoLmhfX3NvbWVVbmtub3duUmVxdWVzdF8gPSBOVUxMOworICBoLmhfX3NvbWVVbmtub3duUmVxdWVzdCA9ICJYWVoiOworICBzb2FwLT5oZWFkZXIgPSAmaDsKKyAgc29hcC0+YWN0b3IgPSAiaHR0cDovL3NvbWUvb3RoZXIvYWN0b3IiOworICBpZiAoc29hcF9jYWxsX21fX2VjaG9Wb2lkKHNvYXAsIHNpdGUsICJodHRwOi8vc29hcGludGVyb3Aub3JnLyIsIHIpKQorICB7IAorICAgIGRpc3BsYXlUZXh0KCJlY2hvNyBmYWlsZWQiKTsKKyAgICBvaz1mYWxzZTsKKyAgfQorICBlbHNlCisgICAgZGlzcGxheVRleHQoImVjaG83IHBhc3NlZCIpOworCisgIC8vIFVua25vd24gaGVhZGVyIGVsZW1lbnQ6IHJlcXVlc3QgZnJvbSBjbGllbnQgKHdpdGggbXVzdFVuZGVyc3RhbmQ9IjEiLCByZWNpcGllbnQgaXMgbm90IHRhcmdldCkKKyAgaC5oX19zb21lVW5rbm93blJlcXVlc3QgPSBOVUxMOworICBoLmhfX3NvbWVVbmtub3duUmVxdWVzdF8gPSAiWFlaIjsKKyAgc29hcC0+aGVhZGVyID0gJmg7CisgIHNvYXAtPmFjdG9yID0gImh0dHA6Ly9zb21lL290aGVyL2FjdG9yIjsKKyAgaWYgKHNvYXBfY2FsbF9tX19lY2hvVm9pZChzb2FwLCBzaXRlLCAiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLCByKSkKKyAgeyAKKyAgICBkaXNwbGF5VGV4dCgiZWNobzggZmFpbGVkIik7CisgICAgb2s9ZmFsc2U7CisgIH0KKyAgZWxzZQorICAgIGRpc3BsYXlUZXh0KCJlY2hvOCBwYXNzZWQiKTsKKworCisgIGlmIChvaykKKyAgCWRpc3BsYXlUZXh0KCJBbGwgUGFzc2VkIik7CisgIGVsc2UKKwkgIGRpc3BsYXlUZXh0KCJGQUlMVVJFUyIpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ3NvYXAtc3ltYmlhbi9pbnRlcm9wMnRlc3QuY3BwIGIvZ3NvYXAtc3ltYmlhbi9pbnRlcm9wMnRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNWZjMTgKLS0tIC9kZXYvbnVsbAorKysgYi9nc29hcC1zeW1iaWFuL2ludGVyb3AydGVzdC5jcHAKQEAgLTAsMCArMSwzODggQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyAgICAoQykgQ09QWVJJR0hUIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDIgQWxsIFJpZ2h0cyBSZXNlcnZlZAorLy8gICAgTGljZW5zZWQgTWF0ZXJpYWxzIC0gUHJvcGVydHkgb2YgSUJNCisvLyAgICBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvcgorLy8gICAgZGlzY2xvc3VyZSByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KKy8vCisvLyAgICBJQk0gRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORworLy8gICAgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorLy8gICAgUFVSUE9TRS4gSU4gTk8gRVZFTlQgU0hBTEwgSUJNIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisvLyAgICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisvLyAgICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKy8vICAgIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UKKy8vICAgIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisvLworLy8gICAgVGhlIHByb2dyYW0gbWF5IGJlIHVzZWQsIGV4ZWN1dGVkLCBjb3BpZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQKKy8vICAgIHdpdGhvdXQgcm95YWx0eSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGV2ZWxvcGluZywgdXNpbmcsIG1hcmtldGluZywgb3IgZGlzdHJpYnV0aW5nLgorLy8gCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gZ1NPQVAgdjIgSW50ZXJvcCB0ZXN0IHJvdW5kIDIgYmFzZQorLy8jaW5jbHVkZSAiaW50ZXJvcHRBLmgiCisjaW5jbHVkZSAic29hcEguaCIgCisKK2V4dGVybiAiQyIgdm9pZCBkaXNwbGF5VGV4dChjaGFyICp0ZXh0KTsKK2V4dGVybiAiQyIgaW50IGludGVyb3BBKGNvbnN0IGNoYXIgKnVybCk7CisKK3N0cnVjdCBOYW1lc3BhY2UgbmFtZXNwYWNlc0FbXSA9Cit7IHsiU09BUC1FTlYiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8ifSwKKyAgeyJTT0FQLUVOQyIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyJ9LAorICB7InhzaSIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsICJodHRwOi8vd3d3LnczLm9yZy8qL1hNTFNjaGVtYS1pbnN0YW5jZSJ9LAorICB7InhzZCIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsICJodHRwOi8vd3d3LnczLm9yZy8qL1hNTFNjaGVtYSJ9LAorICB7Im5zIiwgImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIn0sCisgIHsicyIsICJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZCJ9LAorICB7ImEiLCAiaHR0cDovL3htbC5hcGFjaGUub3JnL3htbC1zb2FwIn0sCisgIHsiaCIsICJodHRwOi8vc29hcGludGVyb3Aub3JnL2VjaG9oZWFkZXIvIn0sCisgIHtOVUxMLCBOVUxMfQorfTsKKworaW50IGludGVyb3BBKGNvbnN0IGNoYXIgKnVybCkKK3sgCisgIHN0cnVjdCBzb2FwICpzb2FwOworICBpbnQgaSwgZzsKKyAgeHNkX19zdHJpbmcgc28sIHNpID0gIkhlbGxvIFdvcmxkISA8PiYiOworICBzdHJ1Y3QgQXJyYXlPZnN0cmluZyBBc2ksIEFzbzsKKyAgeHNkX19pbnQgbm8sIG5pID0gMTIzNDU2Nzg5MDsKKyAgeHNkX19pbnQgbiA9IDIxNDc0ODM2NDc7CisgIHN0cnVjdCBBcnJheU9maW50IEFuaSwgQW5vOworLy8gIHhzZF9fZmxvYXQgZjEgPSAzLjQwMjgyZSszODsKKyAgeHNkX19mbG9hdCBmMSA9IDEyMy41Njc4OworICB4c2RfX2Zsb2F0IGYyID0gMy4xNDsKKyAgeHNkX19mbG9hdCBmbywgZmkgPSAxMjMuNDU2OworLy8gIHhzZF9fZmxvYXQgZm8sIGZpID0gM2UyOworLy8jaWZkZWYgU1lNQklBTgorLy8gIGNvbnN0IHN0cnVjdCBzb2FwX2RvdWJsZV9uYW4geyB1bnNpZ25lZCBpbnQgbjEsIG4yOyB9IHNvYXBfZG91YmxlX25hbjsKKy8vI2VuZGlmCisgIHhzZF9fZmxvYXQgbmFuID0gRkxUX05BTiwgaW5mID0gRkxUX1BJTkZUWSwgbmluZiA9IEZMVF9OSU5GVFk7CisgIHN0cnVjdCBBcnJheU9mZmxvYXQgQWZpLCBBZm87CisgIHN0cnVjdCBzX19TT0FQU3RydWN0IHN0aSwgKnA7CisgIHN0cnVjdCBuc19fZWNob1N0cnVjdFJlc3BvbnNlIHN0bzsKKyAgc3RydWN0IEFycmF5T2ZTT0FQU3RydWN0IEFzdGksIEFzdG87CisgIHN0cnVjdCBuc19fZWNob1ZvaWRSZXNwb25zZSBSdjsKKyAgc3RydWN0IHhzZF9fYmFzZTY0QmluYXJ5IGI2NGksIGI2NG87CisgIHhzZF9fZGF0ZVRpbWUgZHRvLCBkdGkgPSAiMTk2Ny0xMi0yOVQwMTowMjowMyI7CisgIHN0cnVjdCB4c2RfX2hleEJpbmFyeSBoYmksIGhibzsKKyAgeHNkX19kZWNpbWFsIERvLCBEaSA9ICIxMjM0NTY3ODkwLjEyMzQ1Njc4OSI7CisgIHhzZF9fYm9vbGVhbiBibywgYmkgPSB0cnVlOworICAvL3N0cnVjdCBhX19NYXAgbWksIG1vOworICAvL3N0cnVjdCBBcnJheU9mTWFwIEFtaSwgQW1vOworICAvLyBjaGFyIGJ1ZmZbMTAwXTsKKyAgZGlzcGxheVRleHQoInJ1bm5pbmcgdGVzdCBBIG9uIik7CisgIGRpc3BsYXlUZXh0KChjaGFyKil1cmwpOworICBzb2FwID0gc29hcF9uZXcoKTsKKyAgc29hcC0+bmFtZXNwYWNlcyA9IChzdHJ1Y3QgTmFtZXNwYWNlICopbmFtZXNwYWNlc0E7CisKKy8vICBzb2FwLnNlbmRfdGltZW91dCA9IDMwOworLy8gIHNvYXAucmVjdl90aW1lb3V0ID0gMzA7CisKKworICBBc2kuX19zaXplID0gODsKKyAgQXNpLl9fb2Zmc2V0ID0gMDsKKyAgQXNpLl9fcHRyID0gKHhzZF9fc3RyaW5nKiltYWxsb2MoQXNpLl9fc2l6ZSpzaXplb2YoeHNkX19zdHJpbmcpKTsKKyAgQXNpLl9fcHRyWzBdID0gTlVMTDsKKyAgQXNpLl9fcHRyWzFdID0gIiBIZWxsb1x0V29ybGQiOworICBBc2kuX19wdHJbMl0gPSBOVUxMOworICBBc2kuX19wdHJbM10gPSAiISAiOworICBBc2kuX19wdHJbNF0gPSBOVUxMOworICBBc2kuX19wdHJbNV0gPSBzaTsKKyAgQXNpLl9fcHRyWzZdID0gTlVMTDsKKyAgQXNpLl9fcHRyWzddID0gc2k7CisKKyAgQW5pLl9fc2l6ZSA9IDA7CisgIEFuaS5fX29mZnNldCA9IDA7CisgIEFuaS5fX3B0ciA9IE5VTEw7IC8vICh4c2RfX2ludCopbWFsbG9jKEFuaS5fX3NpemUqc2l6ZW9mKHhzZF9faW50KSk7CisKKyAgQWZpLl9fc2l6ZSA9IDU7CisgIEFmaS5fX29mZnNldCA9IDA7CisgIEFmaS5fX3B0ciA9ICh4c2RfX2Zsb2F0KiopbWFsbG9jKEFmaS5fX3NpemUqc2l6ZW9mKHhzZF9fZmxvYXQqKSk7CisgIEFmaS5fX3B0clswXSA9ICZmMTsKKyAgQWZpLl9fcHRyWzFdID0gJm5hbjsgLy8gRkxUX05BTjsKKyAgQWZpLl9fcHRyWzJdID0gJmluZjsgLy8gRkxUX1BJTkZUWTsKKyAgQWZpLl9fcHRyWzNdID0gJm5pbmY7IC8vIEZMVF9OSU5GVFk7CisgIEFmaS5fX3B0cls0XSA9ICZmMjsKKworICBzdGkudmFyU3RyaW5nID0gIkhlbGxvIjsKKyAgc3RpLnZhckludCA9ICZuOworICBzdGkudmFyRmxvYXQgPSAmZjE7CisKKyAgQXN0aS5fX3NpemUgPSAzOworICBBc3RpLl9fb2Zmc2V0ID0gMjsKKyAgQXN0aS5fX3B0ciA9IChzdHJ1Y3Qgc19fU09BUFN0cnVjdCoqKW1hbGxvYygoQXN0aS5fX3NpemUrMSkqc2l6ZW9mKHN0cnVjdCBzX19TT0FQU3RydWN0KikpOworICBwID0gKHN0cnVjdCBzX19TT0FQU3RydWN0KiltYWxsb2MoQXN0aS5fX3NpemUqc2l6ZW9mKHN0cnVjdCBzX19TT0FQU3RydWN0KSk7CisgIEFzdGkuX19wdHJbMF0gPSBwOworICBBc3RpLl9fcHRyWzFdID0gcCsxOworICBBc3RpLl9fcHRyWzJdID0gcCsyOworICBBc3RpLl9fcHRyWzNdID0gcDsKKyAgQXN0aS5fX3B0clswXS0+dmFyU3RyaW5nID0gIkhlbGxvIjsKKyAgQXN0aS5fX3B0clswXS0+dmFySW50ID0gJm47CisgIEFzdGkuX19wdHJbMF0tPnZhckZsb2F0ID0gJmYxOworICBBc3RpLl9fcHRyWzFdLT52YXJTdHJpbmcgPSAiV29ybGQiOworICBBc3RpLl9fcHRyWzFdLT52YXJJbnQgPSAmbjsKKyAgQXN0aS5fX3B0clsxXS0+dmFyRmxvYXQgPSAmZjI7CisgIEFzdGkuX19wdHJbMl0tPnZhclN0cmluZyA9ICIhIjsKKyAgQXN0aS5fX3B0clsyXS0+dmFySW50ID0gJm47CisgIEFzdGkuX19wdHJbMl0tPnZhckZsb2F0ID0gJmYyOworCisvLyAgYjY0aS5fX3B0ciA9ICh1bnNpZ25lZCBjaGFyKikiVGhpcyBpcyBhbiBleGFtcGxlIEJhc2U2NCBlbmNvZGVkIHN0cmluZyI7CisvLyAgYjY0aS5fX3NpemUgPSBzdHJsZW4oKGNoYXIqKWI2NGkuX19wdHIpKzE7CisgIHVuc2lnbmVkIGNoYXIgYjY0ZGF0YVs0XT17MHg4MCwgMHg4MSwgMHg4MiwgMHg4M307CisgIGI2NGkuX19wdHIgPSBiNjRkYXRhOworICBiNjRpLl9fc2l6ZSA9IDQ7CisKKyAgaGJpLl9fcHRyID0gKHVuc2lnbmVkIGNoYXIqKSJUaGlzIGlzIGFuIGV4YW1wbGUgSGV4QmluYXJ5IGVuY29kZWQgc3RyaW5nIjsKKyAgaGJpLl9fc2l6ZSA9IHN0cmxlbigoY2hhciopaGJpLl9fcHRyKSsxOworLyoKKyAgbWkuX19zaXplID0gMjsKKyAgbWkuX19wdHIgPSAoc3RydWN0IF9pdGVtKiltYWxsb2MobWkuX19zaXplKnNpemVvZihzdHJ1Y3QgX2l0ZW0pKTsKKyAgbWkuX19wdHJbMF0ua2V5ID0gbmV3IHhzZF9fc3RyaW5nXygiaGVsbG8iKTsKKyAgbWkuX19wdHJbMF0udmFsdWUgPSBuZXcgeHNkX19zdHJpbmdfKCJ3b3JsZCIpOworICBtaS5fX3B0clsxXS5rZXkgPSBuZXcgeHNkX19pbnRfKDIpOworICBtaS5fX3B0clsxXS52YWx1ZSA9IG5ldyB4c2RfX2Jvb2xlYW5fKHRydWUpOworCisgIEFtaS5fX3NpemUgPSAyOworICBBbWkuX19wdHIgPSAoc3RydWN0IGFfX01hcCoqKW1hbGxvYyhBbWkuX19zaXplKnNpemVvZihzdHJ1Y3QgYV9fTWFwKikpOworICBBbWkuX19wdHJbMF0gPSAmbWk7CisgIEFtaS5fX3B0clsxXSA9ICZtaTsgKi8KKyAgY2hhciAqc2l0ZT0oY2hhciopdXJsOworLy8gICAgY2hhciogc2l0ZSA9Imh0dHA6Ly93ZWJzcnYuY3MuZnN1LmVkdS9+ZW5nZWxlbi9pbnRlcm9wMi5jZ2kiOworLy8gIGNoYXIqIHNpdGUgPSAiaHR0cDovL25hZ295YS5hcGFjaGUub3JnOjUwNDkvYXhpcy9zZXJ2aWNlcy9lY2hvICI7CisgIGNoYXIqIGFjdGlvbiA9ICJodHRwOi8vc29hcGludGVyb3Aub3JnLyI7CisgIAorICBib29sIG9rPXRydWU7CisgIAorICBpZiAoc29hcF9jYWxsX25zX19lY2hvU3RyaW5nKHNvYXAsIHNpdGUsIGFjdGlvbiwgc2ksIHNvKSkKKyAgeyAKKyAgICBkaXNwbGF5VGV4dCgiZWNob1N0cmluZyBmYWlsIik7CisgICAgb2s9ZmFsc2U7CisgIH0KKyAgZWxzZSBpZiAoIXNvIHx8IHN0cmNtcChzaSwgc28pKQorICB7IAorICAgIG9rPWZhbHNlOworICAgIGRpc3BsYXlUZXh0KCJlY2hvU3RyaW5nIG1pc21hdGNoZWQiKTsKKyAgfQorICBlbHNlCisgICAgZGlzcGxheVRleHQoImVjaG9TdHJpbmcgcGFzcyIpOworIAorCisgIGlmIChzb2FwX2NhbGxfbnNfX2VjaG9JbnRlZ2VyKHNvYXAsIHNpdGUsICJodHRwOi8vc29hcGludGVyb3Aub3JnLyIsIG5pLCBubykpCisgIHsgCisgICAgb2s9ZmFsc2U7CisgICAgZGlzcGxheVRleHQoImVjaG9JbnRlZ2VyIGZhaWwiKTsKKyAgfQorICBlbHNlIGlmIChuaSAhPSBubykKKyAgeyAgCisgICAgb2s9ZmFsc2U7CisgICAgZGlzcGxheVRleHQoImVjaG9JbnRlZ2VyIG1pc21hdGNoZWQiKTsKKyAgfQorICBlbHNlCisgICAgZGlzcGxheVRleHQoImVjaG9JbnRlZ2VyIHBhc3MiKTsKKworICBpZiAoc29hcF9jYWxsX25zX19lY2hvRmxvYXQoc29hcCwgc2l0ZSwgImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiwgZmksIGZvKSkKKyAgeyAKKyAgICBvaz1mYWxzZTsKKyAgICBkaXNwbGF5VGV4dCgiZWNob0Zsb2F0IGZhaWwiKTsKKyAgfQorICBlbHNlIGlmIChmaSAhPSBmbykKKyAgeyAgCisgICAgb2s9ZmFsc2U7CisgICAgZGlzcGxheVRleHQoImVjaG9GbG9hdCBtaXNtYXRjaGVkIik7CisgIH0KKyAgZWxzZQorICAgIGRpc3BsYXlUZXh0KCJlY2hvRmxvYXQgcGFzcyIpOworCisgIGlmIChzb2FwX2NhbGxfbnNfX2VjaG9TdHJ1Y3Qoc29hcCwgc2l0ZSwgImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiwgc3RpLCBzdG8pKQorICB7IAorICAgIG9rPWZhbHNlOworICBkaXNwbGF5VGV4dCgiZWNob1N0cnVjdCBmYWlsIik7CisgIH0KKyAgZWxzZSBpZiAoIXN0by5fcmV0dXJuLnZhclN0cmluZyB8fCBzdHJjbXAoc3RpLnZhclN0cmluZywgc3RvLl9yZXR1cm4udmFyU3RyaW5nKQorICAJIHx8ICFzdG8uX3JldHVybi52YXJJbnQgfHwgKnN0aS52YXJJbnQgIT0gKnN0by5fcmV0dXJuLnZhckludCAKKyAgCSB8fCAhc3RvLl9yZXR1cm4udmFyRmxvYXQgfHwgKnN0aS52YXJGbG9hdCAhPSAqc3RvLl9yZXR1cm4udmFyRmxvYXQpCisgIHsgCisgICAgb2s9ZmFsc2U7CisJICBkaXNwbGF5VGV4dCgiZWNob1N0cnVjdCBtaXNtYXRjaCIpOworICB9CisgIGVsc2UgCisgICAgZGlzcGxheVRleHQoImVjaG9TdHJ1Y3QgcGFzcyIpOworCisgIGlmIChzb2FwX2NhbGxfbnNfX2VjaG9TdHJpbmdBcnJheShzb2FwLCBzaXRlLCAiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLCBBc2ksIEFzbykpCisgIHsKKyAgICAgc29hcF9zZXRfZmF1bHQoc29hcCk7IAorICAgIHNvYXBfZmF1bHRkZXRhaWwoc29hcCk7CisgICAgb2s9ZmFsc2U7CisgIGRpc3BsYXlUZXh0KCJlY2hvU3RyaW5nQXJyYXkgZmFpbCIpOworICB9CisgIGVsc2UKKyAgeyBnID0gMDsKKyAgICBpZiAoQXNpLl9fc2l6ZSAhPSBBc28uX19zaXplKQorICAgICAgZyA9IDE7CisgICAgZWxzZQorICAgICAgZm9yIChpID0gMDsgaSA8IEFzaS5fX3NpemU7IGkrKykKKyAgICAgICAgaWYgKEFzaS5fX3B0cltpXSAmJiBBc28uX19wdHJbaV0gJiYgc3RyY21wKEFzaS5fX3B0cltpXSwgQXNvLl9fcHRyW2ldKSkKKyAgICAgICAgICBnID0gMTsKKyAgICAgICAgZWxzZSBpZiAoIUFzaS5fX3B0cltpXSkKKwkgIDsKKyAgICAgICAgZWxzZSBpZiAoQXNpLl9fcHRyW2ldICYmICFBc28uX19wdHJbaV0pCisJICBnID0gMTsKKyAgICBpZiAoZykKKyAgICB7CisgICAgb2s9ZmFsc2U7CisgICAgZGlzcGxheVRleHQoImVjaG9TdHJpbmdBcnJheSBtaXNtYXRjaCIpOyAKKyAgICB9CisgICAgZWxzZQorICAgICBkaXNwbGF5VGV4dCgiZWNob1N0cmluZ0FycmF5IHBhc3MiKTsKKyAgfQorCisgIGlmIChzb2FwX2NhbGxfbnNfX2VjaG9JbnRlZ2VyQXJyYXkoc29hcCwgc2l0ZSwgImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiwgQW5pLCBBbm8pKQorICB7IGRpc3BsYXlUZXh0KCJlY2hvSW50ZWdlckFycmF5IGZhaWwiKTsKKyAgICBvaz1mYWxzZTsKKyAgfQorICBlbHNlCisgIHsgZyA9IDA7CisgICAgaWYgKEFuaS5fX3NpemUgIT0gQW5vLl9fc2l6ZSkKKyAgICAgIGcgPSAxOworICAgIGVsc2UKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBBbmkuX19zaXplOyBpKyspCisgICAgICAgIGlmIChBbmkuX19wdHJbaV0gJiYgKCFBbm8uX19wdHJbaV0gfHwgKkFuaS5fX3B0cltpXSAhPSAqQW5vLl9fcHRyW2ldKSkKKyAgICAgICAgICBnID0gMTsKKyAgICBpZiAoZykKKyAgICB7IGRpc3BsYXlUZXh0KCJlY2hvSW50ZWdlckFycmF5IG1pc21hdGNoIik7CisgICAgb2s9ZmFsc2U7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGRpc3BsYXlUZXh0KCJlY2hvSW50ZWdlckFycmF5IHBhc3MiKTsKKyAgfQorCisgIGlmIChzb2FwX2NhbGxfbnNfX2VjaG9GbG9hdEFycmF5KHNvYXAsIHNpdGUsICJodHRwOi8vc29hcGludGVyb3Aub3JnLyIsIEFmaSwgQWZvKSkKKyAgeyBkaXNwbGF5VGV4dCgiZWNob0Zsb2F0QXJyYXkgZmFpbCIpOworICAgIG9rPWZhbHNlOworICB9CisgIGVsc2UKKyAgeyBnID0gMDsKKyAgICBpZiAoQWZpLl9fc2l6ZSAhPSBBZm8uX19zaXplKQorICAgICAgZyA9IDE7CisgICAgZWxzZQorICAgICAgZm9yIChpID0gMDsgaSA8IEFmaS5fX3NpemU7IGkrKykKKyAgICAgICAgaWYgKEFmaS5fX3B0cltpXSAmJiBBZm8uX19wdHJbaV0gJiYgc29hcF9pc25hbigqQWZpLl9fcHRyW2ldKSAmJiBzb2FwX2lzbmFuKCpBZm8uX19wdHJbaV0pKQorICAgICAgICAgIDsKKyAgICAgICAgZWxzZSBpZiAoQWZpLl9fcHRyW2ldICYmICghQWZvLl9fcHRyW2ldIHx8ICpBZmkuX19wdHJbaV0gIT0gKkFmby5fX3B0cltpXSkpCisgICAgICAgICAgZyA9IDE7CisgICAgaWYgKGcpCisgICAgeyBkaXNwbGF5VGV4dCgiZWNob0Zsb2F0QXJyYXkgbWlzbWF0Y2giKTsKKyAgICBvaz1mYWxzZTsKKyAgICB9CisgICAgZWxzZQorICAgICBkaXNwbGF5VGV4dCgiZWNob0Zsb2F0QXJyYXkgcGFzcyIpOworICB9CisKKyAgaWYgKHNvYXBfY2FsbF9uc19fZWNob1N0cnVjdEFycmF5KHNvYXAsIHNpdGUsICJodHRwOi8vc29hcGludGVyb3Aub3JnLyIsIEFzdGksIEFzdG8pKQorICB7IGRpc3BsYXlUZXh0KCJlY2hvU3RydWN0QXJyYXkgZmFpbCIpOworICAgIG9rPWZhbHNlOworICB9CisgIGVsc2UKKyAgeyBnID0gMDsKKyAgICBpZiAoQXN0aS5fX3NpemUrQXN0aS5fX29mZnNldCAhPSBBc3RvLl9fc2l6ZStBc3RvLl9fb2Zmc2V0KQorICAgICAgZyA9IDE7CisgICAgZWxzZQorICAgICAgZm9yIChpID0gQXN0aS5fX29mZnNldDsgaSA8IEFzdGkuX19zaXplK0FzdGkuX19vZmZzZXQ7IGkrKykKKyAgICAgICAgaWYgKCFBc3RvLl9fcHRyW2ktQXN0by5fX29mZnNldF0gfHwKKwkhQXN0by5fX3B0cltpLUFzdG8uX19vZmZzZXRdLT52YXJTdHJpbmcgfHwKKwlzdHJjbXAoQXN0aS5fX3B0cltpLUFzdGkuX19vZmZzZXRdLT52YXJTdHJpbmcsIEFzdG8uX19wdHJbaS1Bc3RvLl9fb2Zmc2V0XS0+dmFyU3RyaW5nKSB8fAorCSFBc3RvLl9fcHRyW2ktQXN0by5fX29mZnNldF0tPnZhckludCB8fAorCSpBc3RpLl9fcHRyW2ktQXN0aS5fX29mZnNldF0tPnZhckludCAhPSAqQXN0by5fX3B0cltpLUFzdG8uX19vZmZzZXRdLT52YXJJbnQgfHwKKwkhQXN0by5fX3B0cltpLUFzdG8uX19vZmZzZXRdLT52YXJGbG9hdCB8fAorCSpBc3RpLl9fcHRyW2ktQXN0aS5fX29mZnNldF0tPnZhckZsb2F0ICE9ICpBc3RvLl9fcHRyW2ktQXN0by5fX29mZnNldF0tPnZhckZsb2F0KQorICAgICAgICAgIGcgPSAxOworICAgIGlmIChnKQorICAgIHsgZGlzcGxheVRleHQoImVjaG9TdHJ1Y3RBcnJheSBtaXNtYXRjaCIpOworICAgIG9rPWZhbHNlOworICAgIH0KKyAgICBlbHNlCisgICAgICBkaXNwbGF5VGV4dCgiZWNob1N0cnVjdEFycmF5IHBhc3MiKTsKKyAgfQorCisgIGlmIChzb2FwX2NhbGxfbnNfX2VjaG9Wb2lkKHNvYXAsIHNpdGUsICJodHRwOi8vc29hcGludGVyb3Aub3JnLyIsIFJ2KSkKKyAgeyBkaXNwbGF5VGV4dCgiZWNob1ZvaWQgZmFpbCIpOworICAgIG9rPWZhbHNlOworICB9CisgIGVsc2UKKyAgICBkaXNwbGF5VGV4dCgiZWNob1ZvaWQgcGFzcyIpOworICAKKworICBpZiAoc29hcF9jYWxsX25zX19lY2hvQmFzZTY0KHNvYXAsIHNpdGUsICJodHRwOi8vc29hcGludGVyb3Aub3JnLyIsIGI2NGksIGI2NG8pKQorICB7IGRpc3BsYXlUZXh0KCJlY2hvQmFzZTY0IGZhaWwiKTsKKyAgICBvaz1mYWxzZTsKKyAgfQorICBlbHNlIGlmICgoYjY0aS5fX3NpemUrMikvMyAhPSAoYjY0by5fX3NpemUrMikvMyB8fCBzdHJuY21wKChjaGFyKiliNjRpLl9fcHRyLCAoY2hhciopYjY0by5fX3B0cixiNjRpLl9fc2l6ZSkpCisgIHsgCisgIGRpc3BsYXlUZXh0KCJlY2hvQmFzZTY0IG1pc21hdGNoIik7CisgICAgb2s9ZmFsc2U7CisgIH0KKyAgZWxzZQorICAgZGlzcGxheVRleHQoImVjaG9CYXNlNjQgcGFzcyIpOworCisgIGlmIChzb2FwX2NhbGxfbnNfX2VjaG9EYXRlKHNvYXAsIHNpdGUsICJodHRwOi8vc29hcGludGVyb3Aub3JnLyIsIGR0aSwgZHRvKSkKKyAgeyAKKyAgZGlzcGxheVRleHQoImVjaG9EYXRlIGZhaWwiKTsKKyAgICBvaz1mYWxzZTsKKyAgfQorICBlbHNlIGlmICghZHRvIHx8IHN0cm5jbXAoZHRpLCBkdG8sIDE5KSkKKyAgeyAKKyAgZGlzcGxheVRleHQoImVjaG9EYXRlIG1pc21hdGNoIik7CisgICAgb2s9ZmFsc2U7CisgIH0KKyAgZWxzZQorICAgIGRpc3BsYXlUZXh0KCJlY2hvRGF0ZSBwYXNzIik7CisgCisKKyAgaWYgKHNvYXBfY2FsbF9uc19fZWNob0hleEJpbmFyeShzb2FwLCBzaXRlLCAiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLCBoYmksIGhibykpCisgIHsgCisgICAgb2s9ZmFsc2U7CisgIGRpc3BsYXlUZXh0KCJlY2hvSGV4QmluYXJ5IGZhaWwiKTsKKyAgfQorICBlbHNlIGlmIChoYmkuX19zaXplICE9IGhiby5fX3NpemUgfHwgc3RyY21wKChjaGFyKiloYmkuX19wdHIsIChjaGFyKiloYm8uX19wdHIpKQorICB7IAorICAgIG9rPWZhbHNlOworICBkaXNwbGF5VGV4dCgiZWNob0hleEJpbmFyeSBtaXNtYXRjaCIpOworICB9CisgIGVsc2UKKyAgICBkaXNwbGF5VGV4dCgiZWNob0hleEJpbmFyeSBwYXNzIik7CisgCisKKyAgaWYgKHNvYXBfY2FsbF9uc19fZWNob0RlY2ltYWwoc29hcCwgc2l0ZSwgImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiwgRGksIERvKSkKKyAgeyAKKyAgICBvaz1mYWxzZTsKKyAgZGlzcGxheVRleHQoImVjaG9EZWNpbWFsIHBhc3MiKTsKKyAgfQorICBlbHNlIGlmIChzdHJjbXAoRGksIERvKSkKKyAgeyAKKyAgICBvaz1mYWxzZTsKKyAgZGlzcGxheVRleHQoImVjaG9EZWNpbWFsIG1pc21hdGNoIik7CisgIH0KKyAgZWxzZQorICAgIGRpc3BsYXlUZXh0KCJlY2hvRGVjaW1hbCBwYXNzIik7CisgIAorCisgIGlmIChzb2FwX2NhbGxfbnNfX2VjaG9Cb29sZWFuKHNvYXAsIHNpdGUsICJodHRwOi8vc29hcGludGVyb3Aub3JnLyIsIGJpLCBibykpCisgIHsgCisgICAgb2s9ZmFsc2U7CisgIGRpc3BsYXlUZXh0KCJlY2hvQm9vbGVhbiBmYWlsIik7CisgIH0KKyAgZWxzZSBpZiAoYmkgIT0gYm8pCisgIHsgCisgICAgb2s9ZmFsc2U7CisgIGRpc3BsYXlUZXh0KCJlY2hvQm9vbGVhbiBtaXNtYXRjaCIpOworICB9CisgIGVsc2UKKyAgICBkaXNwbGF5VGV4dCgiZWNob0Jvb2xlYW4gcGFzcyIpOworCisgIGlmIChvaykKKyAgICBkaXNwbGF5VGV4dCgiQUxMIFBBU1MiKTsKKyAgZWxzZQorICAgIGRpc3BsYXlUZXh0KCJGQUlMVVJFUyIpOworICByZXR1cm4gMDsKKyAgCitlbmQ6CisgIHJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9nc29hcC1zeW1iaWFuL2ludGVyb3BNYWluLmMgYi9nc29hcC1zeW1iaWFuL2ludGVyb3BNYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA3YjRhMQotLS0gL2Rldi9udWxsCisrKyBiL2dzb2FwLXN5bWJpYW4vaW50ZXJvcE1haW4uYwpAQCAtMCwwICsxLDI3IEBACisvLyNpbmNsdWRlICJzb2FwSC5oIgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJR2xvYmFsIHZhcmlhYmxlcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vc3RhdGljIEJvb2xlYW4gSGlkZVNlY3JldFJlY29yZHM7CitpbnQgaW50ZXJvcEEoY29uc3QgY2hhciAqdXJsKTsKK2ludCBpbnRlcm9wQihjb25zdCBjaGFyICp1cmwpOworaW50IGludGVyb3BDKGNvbnN0IGNoYXIgKnVybCk7Cit2b2lkIGRpc3BsYXlUZXh0KGNoYXIgKnRleHQpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJnc1tdKQoreworICBpbnRlcm9wQSgiaHR0cDovL3dlYnNydi5jcy5mc3UuZWR1L35lbmdlbGVuL2ludGVyb3AyLmNnaSIpOworICBpbnRlcm9wQigiaHR0cDovL3dlYnNydi5jcy5mc3UuZWR1L35lbmdlbGVuL2ludGVyb3AyQi5jZ2kiKTsKKyAgaW50ZXJvcEMoImh0dHA6Ly93ZWJzcnYuY3MuZnN1LmVkdS9+ZW5nZWxlbi9pbnRlcm9wMkMuY2dpIik7CisvLyAgICBpbnRlcm9wdEEoImh0dHA6Ly91bmtub3duOjkwODEvfmVuZ2VsZW4vaW50ZXJvcDIuY2dpIik7Cit9CisKK3ZvaWQgZGlzcGxheVRleHQoY2hhciAqdGV4dCkKK3twcmludGYodGV4dCk7CisgIHByaW50ZigiXG4iKTt9CisKKworCisgIApkaWZmIC0tZ2l0IGEvZ3NvYXAtc3ltYmlhbi9pbnRlcm9wX2FsbC5oIGIvZ3NvYXAtc3ltYmlhbi9pbnRlcm9wX2FsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOThhZjEKLS0tIC9kZXYvbnVsbAorKysgYi9nc29hcC1zeW1iaWFuL2ludGVyb3BfYWxsLmgKQEAgLTAsMCArMSwxMzYgQEAKKy8vIEludGVyb3AgdGVzdCBiYXNlIHJvdW5kIDIKKworLy9nc29hcCBucyBzZXJ2aWNlIG5hbWU6CWludGVyb3AyCisvL2dzb2FwIG5zIHNlcnZpY2Ugc3R5bGU6CXJwYworLy9nc29hcCBucyBzZXJ2aWNlIGVuY29kaW5nOgllbmNvZGVkCisvL2dzb2FwIG5zIHNlcnZpY2UgbmFtZXNwYWNlOglodHRwOi8vc29hcGludGVyb3Aub3JnL3dzZGwKKworLy9nc29hcCBucyBzY2hlbWEgbmFtZXNwYWNlOiBodHRwOi8vc29hcGludGVyb3Aub3JnLworLy9nc29hcCBzIHNjaGVtYSBuYW1lc3BhY2U6IGh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkCisvL2dzb2FwIGEgc2NoZW1hIG5hbWVzcGFjZTogaHR0cDovL3htbC5hcGFjaGUub3JnL3htbC1zb2FwCisKK3R5cGVkZWYgY2hhciAqeHNkX19zdHJpbmc7Cituc19fZWNob1N0cmluZyh4c2RfX3N0cmluZyBpbnB1dFN0cmluZywgeHNkX19zdHJpbmcgJl9yZXR1cm4pOworCitzdHJ1Y3QgQXJyYXlPZnN0cmluZyB7IHhzZF9fc3RyaW5nICpfX3B0cjsgaW50IF9fc2l6ZTsgaW50IF9fb2Zmc2V0OyB9OworbnNfX2VjaG9TdHJpbmdBcnJheShzdHJ1Y3QgQXJyYXlPZnN0cmluZyBpbnB1dFN0cmluZ0FycmF5LCBzdHJ1Y3QgQXJyYXlPZnN0cmluZyAmX3JldHVybik7CisKK3R5cGVkZWYgbG9uZyB4c2RfX2ludDsKK25zX19lY2hvSW50ZWdlcih4c2RfX2ludCBpbnB1dEludGVnZXIsIHhzZF9faW50ICZfcmV0dXJuKTsKKworc3RydWN0IEFycmF5T2ZpbnQgeyB4c2RfX2ludCAqKl9fcHRyOyBpbnQgX19zaXplOyBpbnQgX19vZmZzZXQ7IH07Cituc19fZWNob0ludGVnZXJBcnJheShzdHJ1Y3QgQXJyYXlPZmludCBpbnB1dEludGVnZXJBcnJheSwgc3RydWN0IEFycmF5T2ZpbnQgJl9yZXR1cm4pOworCit0eXBlZGVmIGZsb2F0IHhzZF9fZmxvYXQ7Cituc19fZWNob0Zsb2F0KHhzZF9fZmxvYXQgaW5wdXRGbG9hdCwgeHNkX19mbG9hdCAmX3JldHVybik7CisKK3N0cnVjdCBBcnJheU9mZmxvYXQgeyB4c2RfX2Zsb2F0ICoqX19wdHI7IGludCBfX3NpemU7IGludCBfX29mZnNldDsgfTsKK25zX19lY2hvRmxvYXRBcnJheShzdHJ1Y3QgQXJyYXlPZmZsb2F0IGlucHV0RmxvYXRBcnJheSwgc3RydWN0IEFycmF5T2ZmbG9hdCAmX3JldHVybik7CisKK3N0cnVjdCBzX19TT0FQU3RydWN0Cit7IHhzZF9fc3RyaW5nIHZhclN0cmluZzsKKyAgeHNkX19pbnQgKnZhckludDsKKyAgeHNkX19mbG9hdCAqdmFyRmxvYXQ7Cit9OworbnNfX2VjaG9TdHJ1Y3Qoc3RydWN0IHNfX1NPQVBTdHJ1Y3QgX2lucHV0U3RydWN0LCBzdHJ1Y3QgbnNfX2VjaG9TdHJ1Y3RSZXNwb25zZSB7IHN0cnVjdCBzX19TT0FQU3RydWN0IF9yZXR1cm47IH0gJnJlc3VsdCk7CisKK3N0cnVjdCBBcnJheU9mU09BUFN0cnVjdCB7IHN0cnVjdCBzX19TT0FQU3RydWN0ICoqX19wdHI7IGludCBfX3NpemU7IGludCBfX29mZnNldDsgfTsKK25zX19lY2hvU3RydWN0QXJyYXkoc3RydWN0IEFycmF5T2ZTT0FQU3RydWN0IGlucHV0U3RydWN0QXJyYXksIHN0cnVjdCBBcnJheU9mU09BUFN0cnVjdCAmX3JldHVybik7CisKK25zX19lY2hvVm9pZChzdHJ1Y3QgbnNfX2VjaG9Wb2lkUmVzcG9uc2UgeyB9ICZyZXN1bHQpOworCitzdHJ1Y3QgeHNkX19iYXNlNjRCaW5hcnkgeyB1bnNpZ25lZCBjaGFyICpfX3B0cjsgaW50IF9fc2l6ZTsgfTsKK25zX19lY2hvQmFzZTY0KHN0cnVjdCB4c2RfX2Jhc2U2NEJpbmFyeSBpbnB1dEJhc2U2NCwgc3RydWN0IHhzZF9fYmFzZTY0QmluYXJ5ICZfcmV0dXJuKTsKKwordHlwZWRlZiBjaGFyICp4c2RfX2RhdGVUaW1lOworbnNfX2VjaG9EYXRlKHhzZF9fZGF0ZVRpbWUgaW5wdXREYXRlLCB4c2RfX2RhdGVUaW1lICZfcmV0dXJuKTsKKworc3RydWN0IHhzZF9faGV4QmluYXJ5IHsgdW5zaWduZWQgY2hhciAqX19wdHI7IGludCBfX3NpemU7IH07Cituc19fZWNob0hleEJpbmFyeShzdHJ1Y3QgeHNkX19oZXhCaW5hcnkgaW5wdXRIZXhCaW5hcnksIHN0cnVjdCB4c2RfX2hleEJpbmFyeSAmX3JldHVybik7CisKK3R5cGVkZWYgY2hhciAqeHNkX19kZWNpbWFsOworbnNfX2VjaG9EZWNpbWFsKHhzZF9fZGVjaW1hbCBpbnB1dERlY2ltYWwsIHhzZF9fZGVjaW1hbCAmX3JldHVybik7CisKK3R5cGVkZWYgYm9vbCB4c2RfX2Jvb2xlYW47Cituc19fZWNob0Jvb2xlYW4oeHNkX19ib29sZWFuIGlucHV0Qm9vbGVhbiwgeHNkX19ib29sZWFuICZfcmV0dXJuKTsKKworLy8gSW50ZXJvcCB0ZXN0IEIgcm91bmQgMgorCituc19fZWNob1N0cnVjdEFzU2ltcGxlVHlwZXMKKygJc3RydWN0CXNfX1NPQVBTdHJ1Y3QgX2lucHV0U3RydWN0LAorCXN0cnVjdAluc19fZWNob1N0cnVjdEFzU2ltcGxlVHlwZXNSZXNwb25zZQorCXsJeHNkX19zdHJpbmcJX291dHB1dFN0cmluZzsKKwkJeHNkX19pbnQJKl9vdXRwdXRJbnRlZ2VyOworCQl4c2RfX2Zsb2F0CSpfb3V0cHV0RmxvYXQ7CisJfSAmCXJlc3VsdAorKTsKKworbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0CisoCXhzZF9fc3RyaW5nCWlucHV0U3RyaW5nLAorCXhzZF9faW50CSppbnB1dEludGVnZXIsCisJeHNkX19mbG9hdAkqaW5wdXRGbG9hdCwKKwlzdHJ1Y3QJbnNfX2VjaG9TaW1wbGVUeXBlc0FzU3RydWN0UmVzcG9uc2UKKwl7CXN0cnVjdAlzX19TT0FQU3RydWN0CV9yZXR1cm47CisJfSAmCXJlc3VsdAorKTsKKworc3RydWN0CUFycmF5T2ZzdHJpbmcyRAorewl4c2RfX3N0cmluZyAqCV9fcHRyOworCWludAkJX19zaXplWzJdOworCWludAkJX19vZmZzZXRbMl07Cit9OworCituc19fZWNobzJEU3RyaW5nQXJyYXkoc3RydWN0IEFycmF5T2ZzdHJpbmcyRCBfaW5wdXQyRFN0cmluZ0FycmF5LCBzdHJ1Y3QgQXJyYXlPZnN0cmluZzJEICZfcmV0dXJuKTsKKworc3RydWN0CXNfX1NPQVBTdHJ1Y3RTdHJ1Y3QKK3sJeHNkX19zdHJpbmcJCXZhclN0cmluZzsKKwl4c2RfX2ludCAqCQl2YXJJbnQ7CisJeHNkX19mbG9hdCAqCQl2YXJGbG9hdDsKKwlzdHJ1Y3QJc19fU09BUFN0cnVjdCAqCXZhclN0cnVjdDsKK307CisKK25zX19lY2hvTmVzdGVkU3RydWN0CisoCXN0cnVjdAlzX19TT0FQU3RydWN0U3RydWN0CV9pbnB1dFN0cnVjdCwKKwlzdHJ1Y3QJbnNfX2VjaG9OZXN0ZWRTdHJ1Y3RSZXNwb25zZQorCXsJc3RydWN0CXNfX1NPQVBTdHJ1Y3RTdHJ1Y3QJX3JldHVybjsKKwl9ICYJcmVzdWx0CispOworCitzdHJ1Y3QJc19fU09BUEFycmF5U3RydWN0Cit7CXhzZF9fc3RyaW5nCQl2YXJTdHJpbmc7CisJeHNkX19pbnQgKgkJdmFySW50OworCXhzZF9fZmxvYXQgKgkJdmFyRmxvYXQ7CisJc3RydWN0CUFycmF5T2ZzdHJpbmcJdmFyQXJyYXk7Cit9OworCituc19fZWNob05lc3RlZEFycmF5CisoCXN0cnVjdAlzX19TT0FQQXJyYXlTdHJ1Y3QJX2lucHV0U3RydWN0LAorCXN0cnVjdAluc19fZWNob05lc3RlZEFycmF5UmVzcG9uc2UKKwl7CXN0cnVjdAlzX19TT0FQQXJyYXlTdHJ1Y3QJX3JldHVybjsKKwl9ICYJcmVzdWx0CispOworCisvLyBJbnRlcm9wIHRlc3QgQyByb3VuZCAyCisKKy8vZ3NvYXAgaCBzY2hlbWEgbmFtZXNwYWNlOiBodHRwOi8vc29hcGludGVyb3Aub3JnL2VjaG9oZWFkZXIvCitzdHJ1Y3QgU09BUF9FTlZfX0hlYWRlcgorewljaGFyICoJCQkJCWhfX2VjaG9NZVN0cmluZ1JlcXVlc3Q7CisJbXVzdFVuZGVyc3RhbmQgY2hhciAqCQkJaF9fZWNob01lU3RyaW5nUmVxdWVzdF87CisJY2hhciAqCQkJCQloX19lY2hvTWVTdHJpbmdSZXNwb25zZTsKKwlzdHJ1Y3Qgc19fU09BUFN0cnVjdCAqCQkJaF9fZWNob01lU3RydWN0UmVxdWVzdDsKKwltdXN0VW5kZXJzdGFuZCBzdHJ1Y3Qgc19fU09BUFN0cnVjdCAqCWhfX2VjaG9NZVN0cnVjdFJlcXVlc3RfOworCXN0cnVjdCBzX19TT0FQU3RydWN0ICoJCQloX19lY2hvTWVTdHJ1Y3RSZXNwb25zZTsKKwljaGFyICoJCQkJCWhfX3NvbWVVbmtub3duUmVxdWVzdDsJLy8gZG8gbm90IGluY2x1ZGUgaW4gc2VydmVyCisJbXVzdFVuZGVyc3RhbmQgY2hhciAqCQkJaF9fc29tZVVua25vd25SZXF1ZXN0XzsJLy8gZG8gbm90IGluY2x1ZGUgaW4gc2VydmVyCit9OworCisvL2dzb2FwIG0gc2VydmljZSBuYW1lOiBpbnRlcm9wMkMKKy8vZ3NvYXAgbSBzZXJ2aWNlIHN0eWxlOiBycGMKKy8vZ3NvYXAgbSBzZXJ2aWNlIGVuY29kaW5nOiBlbmNvZGVkCisvL2dzb2FwIG0gc2VydmljZSBwb3J0OiBodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vaW50ZXJvcDJDLmNnaQorLy9nc29hcCBtIHNlcnZpY2UgbmFtZXNwYWNlOiBodHRwOi8vc29hcGludGVyb3Aub3JnLworLy9nc29hcCBtIHNlcnZpY2UgbWV0aG9kLWlucHV0LWhlYWRlci1wYXJ0OiBlY2hvVm9pZCBoX19lY2hvTWVTdHJpbmdSZXF1ZXN0CisvL2dzb2FwIG0gc2VydmljZSBtZXRob2QtaW5wdXQtaGVhZGVyLXBhcnQ6IGVjaG9Wb2lkIGhfX2VjaG9NZVN0cnVjdFJlcXVlc3QKKy8vZ3NvYXAgbSBzZXJ2aWNlIG1ldGhvZC1vdXRwdXQtaGVhZGVyLXBhcnQ6IGVjaG9Wb2lkIGhfX2VjaG9NZVN0cmluZ1Jlc3BvbnNlCisvL2dzb2FwIG0gc2VydmljZSBtZXRob2Qtb3V0cHV0LWhlYWRlci1wYXJ0OiBlY2hvVm9pZCBoX19lY2hvTWVTdHJ1Y3RSZXNwb25zZQoraW50IG1fX2VjaG9Wb2lkKHN0cnVjdCBtX19lY2hvVm9pZFJlc3BvbnNlIHsgfSAmcmVzdWx0KTsKZGlmZiAtLWdpdCBhL2dzb2FwLXN5bWJpYW4vaW50ZXJvcF9zeW1iaWFuLnNpc2FyIGIvZ3NvYXAtc3ltYmlhbi9pbnRlcm9wX3N5bWJpYW4uc2lzYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIxYWVhMQotLS0gL2Rldi9udWxsCisrKyBiL2dzb2FwLXN5bWJpYW4vaW50ZXJvcF9zeW1iaWFuLnNpc2FyCkBAIC0wLDAgKzEsMTk3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKw0KKzwhRE9DVFlQRSBzaXNhci1wcm9qZWN0IFsNCisNCis8IUVMRU1FTlQgc2lzYXItcHJvamVjdCAoc2lzYXItY29uZmlndXJhdGlvbj8sIHNpcy1tYWtlZmlsZSk+DQorPCFBVFRMSVNUIHNpc2FyLXByb2plY3QNCisgIHZlcnNpb24gQ0RBVEEgI0ZJWEVEICIxLjAiPg0KKw0KKzwhRUxFTUVOVCBzaXNhci1jb25maWd1cmF0aW9uIChkZWZhdWx0LWRpcmVjdG9yeSwNCitwYXRoLWNvbnZlcnNpb24tcnVsZSwgZGVmYXVsdC1wdWJsaWMta2V5LWNlcnRpZmljYXRlPywNCitkZWZhdWx0LXByaXZhdGUta2V5PywgaW5jcmVtZW50LWJ1aWxkLW51bWJlcj8sIHNpcy1maWxlPyk+DQorPCFBVFRMSVNUIHNpc2FyLWNvbmZpZ3VyYXRpb24NCisgIHZlcnNpb24gQ0RBVEEgI0ZJWEVEICIxLjAiPg0KKw0KKzwhRUxFTUVOVCBkZWZhdWx0LWRpcmVjdG9yeSBFTVBUWT4NCis8IUFUVExJU1QgZGVmYXVsdC1kaXJlY3RvcnkNCisgIHBhdGggQ0RBVEEgI1JFUVVJUkVEPg0KKw0KKzwhRUxFTUVOVCBwYXRoLWNvbnZlcnNpb24tcnVsZSAocmVwbGFjZSk+DQorPCFFTEVNRU5UIHJlcGxhY2UgKHJlcGxhY2VtZW50KT4NCis8IUFUVExJU1QgcmVwbGFjZQ0KKyAgbWF0Y2gtYXQgKHN0YXJ0KSAic3RhcnQiDQorICBwYXR0ZXJuIENEQVRBICNSRVFVSVJFRD4NCis8IUVMRU1FTlQgcmVwbGFjZW1lbnQgKHRhcmdldCk+DQorDQorPCFFTEVNRU5UIGRlZmF1bHQtcHVibGljLWtleS1jZXJ0aWZpY2F0ZSAocHVibGljLWtleS1jZXJ0aWZpY2F0ZSk+DQorDQorPCFFTEVNRU5UIGRlZmF1bHQtcHJpdmF0ZS1rZXkgKHByaXZhdGUta2V5KT4NCisNCis8IUVMRU1FTlQgaW5jcmVtZW50LWJ1aWxkLW51bWJlciBFTVBUWT4NCisNCis8IUVMRU1FTlQgc2lzLWZpbGUgRU1QVFk+DQorPCFBVFRMSVNUIHNpcy1maWxlDQorICBmaWxlIENEQVRBICNSRVFVSVJFRD4NCisNCis8IUVMRU1FTlQgc2lzLW1ha2VmaWxlIChsb2NhbGVzLCBkZXNjcmlwdGlvbj8sIG5hbWUsIHVpZCwNCittYWpvci12ZXJzaW9uLCBtaW5vci12ZXJzaW9uLCBidWlsZC1udW1iZXIsIGNsb3NlLWFwcGxpY2F0aW9ucz8sDQorbm9uLWNvbXByZXNzZWQ/LCBzaXMtdHlwZSwgc2lnbj8sIHJlcXVpc2l0ZXM/LCBjYXBhYmlsaXRpZXM/LA0KK2VudHJpZXM/KT4NCis8IUFUVExJU1Qgc2lzLW1ha2VmaWxlDQorICB2ZXJzaW9uIENEQVRBICNGSVhFRCAiMS4wIj4NCisNCis8IUVMRU1FTlQgbG9jYWxlcyAobG9jYWxlKSo+DQorPCFFTEVNRU5UIGxvY2FsZSBFTVBUWT4NCis8IUFUVExJU1QgbG9jYWxlDQorICBsYW5ndWFnZSBDREFUQSAjUkVRVUlSRUQNCisgIGNvdW50cnkgQ0RBVEEgI0lNUExJRUQNCisgIHZhcmlhbnQgQ0RBVEEgI0lNUExJRUQ+DQorDQorPCFFTEVNRU5UIGRlc2NyaXB0aW9uICgjUENEQVRBKT4NCisNCis8IUVMRU1FTlQgbmFtZSAoZm9yLWxvY2FsZSkqPg0KKw0KKzwhRUxFTUVOVCBmb3ItbG9jYWxlICgjUENEQVRBKT4NCis8IUFUVExJU1QgZm9yLWxvY2FsZQ0KKyAgbGFuZ3VhZ2UgQ0RBVEEgI1JFUVVJUkVEDQorICBjb3VudHJ5IENEQVRBICNJTVBMSUVEDQorICB2YXJpYW50IENEQVRBICNJTVBMSUVEPg0KKw0KKzwhRUxFTUVOVCB1aWQgKCNQQ0RBVEEpPg0KKw0KKzwhRUxFTUVOVCBtYWpvci12ZXJzaW9uICgjUENEQVRBKT4NCis8IUVMRU1FTlQgbWlub3ItdmVyc2lvbiAoI1BDREFUQSk+DQorPCFFTEVNRU5UIGJ1aWxkLW51bWJlciAoI1BDREFUQSk+DQorDQorPCFFTEVNRU5UIGNsb3NlLWFwcGxpY2F0aW9ucyBFTVBUWT4NCisNCis8IUVMRU1FTlQgbm9uLWNvbXByZXNzZWQgRU1QVFk+DQorDQorPCFFTEVNRU5UIHNpcy10eXBlIEVNUFRZPg0KKzwhQVRUTElTVCBzaXMtdHlwZQ0KKyAgdHlwZSAoYXBwbGljYXRpb258c2hhcmVkLWNvbXBvbmVudHxvcHRpb25hbC1jb21wb25lbnR8DQorICAgICAgICBjb25maWd1cmF0aW9ufHBhdGNofHVwZ3JhZGUpICJhcHBsaWNhdGlvbiI+DQorDQorPCFFTEVNRU5UIHNpZ24gKHB1YmxpYy1rZXktY2VydGlmaWNhdGUsIHByaXZhdGUta2V5KT4NCis8IUVMRU1FTlQgcHVibGljLWtleS1jZXJ0aWZpY2F0ZSBFTVBUWT4NCis8IUFUVExJU1QgcHVibGljLWtleS1jZXJ0aWZpY2F0ZQ0KKyAgZmlsZSBDREFUQSAjUkVRVUlSRUQ+DQorPCFFTEVNRU5UIHByaXZhdGUta2V5IEVNUFRZPg0KKzwhQVRUTElTVCBwcml2YXRlLWtleQ0KKyAgZmlsZSBDREFUQSAjUkVRVUlSRUQNCisgIHBhc3NwaHJhc2UgQ0RBVEEgI0lNUExJRUQ+DQorDQorPCFFTEVNRU5UIHJlcXVpc2l0ZXMgKHJlcXVpc2l0ZSopPg0KKzwhRUxFTUVOVCByZXF1aXNpdGUgKHVpZCwgbWFqb3ItdmVyc2lvbiwgbWlub3ItdmVyc2lvbiwgYnVpbGQtbnVtYmVyLA0KK25hbWUpPg0KKw0KKzwhRUxFTUVOVCBjYXBhYmlsaXRpZXMgKGNhcGFiaWxpdHkqKT4NCis8IUVMRU1FTlQgY2FwYWJpbGl0eSBFTVBUWT4NCis8IUFUVExJU1QgY2FwYWJpbGl0eQ0KKyAga2V5IENEQVRBICNSRVFVSVJFRA0KKyAgdmFsdWUgQ0RBVEEgI1JFUVVJUkVEPg0KKw0KKzwhRUxFTUVOVCBlbnRyaWVzDQorICAgICAoY29tbWVudHxncm91cHxlbWJlZGRlZC1zaXN8b3B0aW9uc3xjb25kaXRpb25hbHxjb3B5fA0KKyAgICAgIHNob3d8YXBwbGljYXRpb24tY3JlYXRlZHxvcGVufGV4ZWN1dGUpKj4NCisNCis8IUVMRU1FTlQgY29tbWVudCAoI1BDREFUQSk+DQorDQorPCFFTEVNRU5UIGdyb3VwIChjb21tZW50fGdyb3VwfGVtYmVkZGVkLXNpc3xvcHRpb25zfGNvbmRpdGlvbmFsfGNvcHl8DQorICAgICAgICAgICAgICAgICBzaG93fGFwcGxpY2F0aW9uLWNyZWF0ZWR8b3BlbnxleGVjdXRlKSo+DQorPCFBVFRMSVNUIGdyb3VwDQorICBsYWJlbCBDREFUQSAjSU1QTElFRD4NCisNCis8IUVMRU1FTlQgZW1iZWRkZWQtc2lzIEVNUFRZPg0KKzwhQVRUTElTVCBlbWJlZGRlZC1zaXMNCisgIGZpbGUgQ0RBVEEgI1JFUVVJUkVEDQorICB1aWQgQ0RBVEEgI0lNUExJRUQ+DQorDQorPCFFTEVNRU5UIG9wdGlvbnMgKG9wdGlvbikqPg0KKzwhRUxFTUVOVCBvcHRpb24gKGZvci1sb2NhbGUpKj4NCis8IUFUVExJU1Qgb3B0aW9uDQorICBuaWNrbmFtZSBDREFUQSAjSU1QTElFRD4NCisNCis8IUVMRU1FTlQgY29uZGl0aW9uYWwgKGlmLCBlbHNlaWYqLCBlbHNlPyk+DQorPCFFTEVNRU5UIGlmIChjb21tZW50fGdyb3VwfGVtYmVkZGVkLXNpc3xvcHRpb25zfGNvbmRpdGlvbmFsfGNvcHl8DQorICAgICAgICAgICAgICBzaG93fGFwcGxpY2F0aW9uLWNyZWF0ZWR8b3BlbnxleGVjdXRlKSo+DQorPCFBVFRMSVNUIGlmDQorICBjb25kaXRpb24gQ0RBVEEgI1JFUVVJUkVEPg0KKzwhRUxFTUVOVCBlbHNlaWYgKGNvbW1lbnR8Z3JvdXB8ZW1iZWRkZWQtc2lzfG9wdGlvbnN8Y29uZGl0aW9uYWx8Y29weXwNCisgICAgICAgICAgICAgICAgICBzaG93fGFwcGxpY2F0aW9uLWNyZWF0ZWR8b3BlbnxleGVjdXRlKSo+DQorPCFBVFRMSVNUIGVsc2VpZg0KKyAgY29uZGl0aW9uIENEQVRBICNSRVFVSVJFRD4NCis8IUVMRU1FTlQgZWxzZSAoY29tbWVudHxncm91cHxlbWJlZGRlZC1zaXN8b3B0aW9uc3xjb25kaXRpb25hbHxjb3B5fA0KKyAgICAgICAgICAgICAgICBzaG93fGFwcGxpY2F0aW9uLWNyZWF0ZWR8b3BlbnxleGVjdXRlKSo+DQorDQorPCFFTEVNRU5UIGNvcHkgKChzb3VyY2V8c291cmNlcyksIHRhcmdldCk+DQorPCFFTEVNRU5UIHNvdXJjZSBFTVBUWT4NCis8IUFUVExJU1Qgc291cmNlDQorICBmaWxlIENEQVRBICNSRVFVSVJFRD4NCis8IUVMRU1FTlQgc291cmNlcyAoZm9yLWxvY2FsZSkqPg0KKzwhRUxFTUVOVCB0YXJnZXQgRU1QVFk+DQorPCFBVFRMSVNUIHRhcmdldA0KKyAgZHJpdmUgQ0RBVEEgImFueSINCisgIGZpbGUgQ0RBVEEgI1JFUVVJUkVEPg0KKw0KKzwhRUxFTUVOVCBzaG93ICgoc291cmNlfHNvdXJjZXMpLCB5ZXMtbm8tYnV0dG9ucz8pPg0KKzwhRUxFTUVOVCB5ZXMtbm8tYnV0dG9ucyBFTVBUWT4NCis8IUFUVExJU1QgeWVzLW5vLWJ1dHRvbnMNCisgIG5vLWFjdGlvbiAoc2tpcHx1bmRvfGFib3J0KSAic2tpcCI+DQorDQorPCFFTEVNRU5UIGFwcGxpY2F0aW9uLWNyZWF0ZWQgKHRhcmdldCk+DQorDQorPCFFTEVNRU5UIG9wZW4gKChzb3VyY2V8c291cmNlcyksIHRhcmdldCk+DQorPCFBVFRMSVNUIG9wZW4NCisgIG1pbWUtdHlwZSBDREFUQSAjUkVRVUlSRUQNCisgIGNsb3NlZCAod2FpdC11bnRpbHx1cG9uLWNvbXBsZXRpb24pICJ3YWl0LXVudGlsIj4NCisNCis8IUVMRU1FTlQgZXhlY3V0ZSAoKHNvdXJjZXxzb3VyY2VzKSwgdGFyZ2V0KT4NCis8IUFUVExJU1QgZXhlY3V0ZQ0KKyAgd2hlbiAoaW5zdGFsbGF0aW9ufHVuaW5zdGFsbGF0aW9ufGJvdGgpICJpbnN0YWxsYXRpb24iDQorICBjbG9zZWQgKHdhaXQtdW50aWx8dXBvbi1jb21wbGV0aW9uKSAid2FpdC11bnRpbCI+DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgXT4NCisNCis8c2lzYXItcHJvamVjdCB2ZXJzaW9uPSIxLjAiPg0KKyAgPHNpc2FyLWNvbmZpZ3VyYXRpb24gdmVyc2lvbj0iMS4wIj4NCisgICAgPGRlZmF1bHQtZGlyZWN0b3J5IHBhdGg9IiIgLz4NCisgICAgPHBhdGgtY29udmVyc2lvbi1ydWxlPg0KKyAgICAgIDxyZXBsYWNlIHBhdHRlcm49ImM6XCI+DQorICAgICAgICA8cmVwbGFjZW1lbnQ+DQorICAgICAgICAgIDx0YXJnZXQgZHJpdmU9IkFueSIgZmlsZT0iXFN5c3RlbVxBcHBzXGFwcG5hbWVcIiAvPg0KKyAgICAgICAgPC9yZXBsYWNlbWVudD4NCisgICAgICA8L3JlcGxhY2U+DQorICAgIDwvcGF0aC1jb252ZXJzaW9uLXJ1bGU+DQorICAgIDxkZWZhdWx0LXB1YmxpYy1rZXktY2VydGlmaWNhdGU+DQorICAgICAgPHB1YmxpYy1rZXktY2VydGlmaWNhdGUgZmlsZT0icHVibGljLmNlciIgLz4NCisgICAgPC9kZWZhdWx0LXB1YmxpYy1rZXktY2VydGlmaWNhdGU+DQorICAgIDxkZWZhdWx0LXByaXZhdGUta2V5Pg0KKyAgICAgIDxwcml2YXRlLWtleSBmaWxlPSJwcml2YXRlLmtleSIgLz4NCisgICAgPC9kZWZhdWx0LXByaXZhdGUta2V5Pg0KKyAgICA8aW5jcmVtZW50LWJ1aWxkLW51bWJlciAvPg0KKyAgICA8c2lzLWZpbGUgZmlsZT0iRjpcZ2RyaXZlXGdzb2FwMi42XHdpblxpbnRlcm9wX3N5bWJpYW5caW50ZXJvcC5zaXMiIC8+DQorICA8L3Npc2FyLWNvbmZpZ3VyYXRpb24+DQorICA8c2lzLW1ha2VmaWxlIHZlcnNpb249IjEuMCI+DQorICAgIDxsb2NhbGVzPg0KKyAgICAgIDxsb2NhbGUgbGFuZ3VhZ2U9ImVuIiBjb3VudHJ5PSJVUyIgLz4NCisgICAgPC9sb2NhbGVzPg0KKyAgICA8ZGVzY3JpcHRpb24+DQorICAgIGludGVyb3ANCisgICAgPC9kZXNjcmlwdGlvbj4NCisgICAgPG5hbWU+DQorICAgICAgPGZvci1sb2NhbGUgbGFuZ3VhZ2U9ImVuIiBjb3VudHJ5PSJVUyI+PC9mb3ItbG9jYWxlPg0KKyAgICA8L25hbWU+DQorICAgIDx1aWQ+MHgwMDk5NmQwODwvdWlkPg0KKyAgICA8bWFqb3ItdmVyc2lvbj4wPC9tYWpvci12ZXJzaW9uPg0KKyAgICA8bWlub3ItdmVyc2lvbj4xPC9taW5vci12ZXJzaW9uPg0KKyAgICA8YnVpbGQtbnVtYmVyPjM8L2J1aWxkLW51bWJlcj4NCisgICAgPHNpcy10eXBlIHR5cGU9ImFwcGxpY2F0aW9uIiAvPg0KKyAgICA8ZW50cmllcz4NCisgICAgICA8ZXhlY3V0ZSBjbG9zZWQ9IndhaXQtdW50aWwiIHdoZW49Imluc3RhbGxhdGlvbiI+DQorICAgICAgICA8c291cmNlIGZpbGU9IkY6XGdkcml2ZVxTeW1iaWFuXDYuMVxTZXJpZXM2MFxFcG9jMzJcUmVsZWFzZVxhcm1pXHVyZWxcSU5URVJPUC5FWEUiIC8+DQorICAgICAgICA8dGFyZ2V0IGRyaXZlPSJBbnkiIGZpbGU9IiIgLz4NCisgICAgICA8L2V4ZWN1dGU+DQorICAgIDwvZW50cmllcz4NCisgIDwvc2lzLW1ha2VmaWxlPg0KKzwvc2lzYXItcHJvamVjdD4NCmRpZmYgLS1naXQgYS9pbXBvcnQvUkVBRE1FLnR4dCBiL2ltcG9ydC9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ODUzMjYKLS0tIC9kZXYvbnVsbAorKysgYi9pbXBvcnQvUkVBRE1FLnR4dApAQCAtMCwwICsxLDMwIEBACitUaGlzIGRpcmVjdG9yeSBjb250YWlucyBjb21tb24gI2ltcG9ydC1lZCBpdGVtcy4KKworZG9tLmgJCURPTSBzdXBwb3J0IChyZXF1aXJlcyBkb20uYy9wcCkKK3N0bGRlcXVlLmgJc3RkOjpkZXF1ZSBzZXJpYWxpemVyCitzdGxsaXN0LmgJc3RkOjpsaXN0IHNlcmlhbGl6ZXIKK3N0bHNldC5oCXN0ZDo6c2V0IHNlcmlhbGl6ZXIKK3N0bHZlY3Rvci5oCXN0ZDo6dmVjdG9yIHNlcmlhbGl6ZXIKK3N0bC5oCQlzdGQ6OmRlcXVlLCBzdGQ6Omxpc3QsIHN0ZDo6c2V0LCBhbmQgc3RkOjp2ZWN0b3Igc2VyaWFsaXplcgorc29hcDEyLmgJU09BUCAxLjIgbmFtZXNwYWNlcworCitUaGlzIGRpcmVjdG9yeSBmdXJ0aGVyIGNvbnRhaW5zIGZpbGVzIHRvIHN1cHBvcnQgYSBncm93aW5nIG51bWJlciBvZiBXUy0qCitzcGVjaWZpY2F0aW9ucy4KKworRm9yIGV4YW1wbGUsIHdzYS5oIGlzIGdlbmVyYXRlZCBmcm9tIFdTL1dTLUFkZHJlc3NpbmcueHNkIHdpdGg6CisKK3dzZGwyaCAtY2d5IC1vIHdzYS5oIC10IFdTL1dTLXR5cGVtYXAuZGF0IFdTL1dTLUFkZHJlc3NpbmcueHNkCisKK1RoZSB0eXBlbWFwLmRhdCBmaWxlIHRoYXQgaXMgbmVlZGVkIGJ5IHdzZGwyaCB0byBjb252ZXJ0IFdTREwgdG8gYSBnU09BUCBoZWFkZXIKK2ZpbGUgZGVmaW5lcyBpbXBvcnRlZCBuYW1lc3BhY2VzIGFzIGZvbGxvd3M6CisKK3dzYSA9IDxodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3Npbmc+CisKK1RoaXMgZW5zdXJlcyB0aGF0IHRoZSBXUy1BZGRyZXNzaW5nIHN1cHBvcnQgaXMgI2ltcG9ydC1lZCBmcm9tICJ3c2EuaCIgd2hlbgord3NkbDJoIHNlZXMgV1MtQWRkcmVzc2luZyBlbGVtZW50cy4gVGh1cywgaXQgZG9lcyBub3QgYXR0ZW1wdCB0byBleHRyYWN0IHRoZQorV1MtQWRkcmVzc2luZyBzY2hlbWEgYnV0IGluc3RlYWQgdXNlcyB0aGUgcHJlLWJ1aWxkIHdzYS5oIGRlZmluaXRpb25zLgorCitOb3RlIHRoYXQgdGhlIHJlZ3VsYXIgWE1MIG5hbWVzcGFjZSBiaW5kaW5ncyBhcmUgZGVmaW5lZCBpbiB0eXBlbWFwLmRhdCB1c2luZworcXVvdGVzLCBmb3IgZXhhbXBsZToKKworYXdzID0gInVybjpQSS9EZXZDZW50cmFsL1NvYXBTZXJ2aWNlIgpkaWZmIC0tZ2l0IGEvaW1wb3J0L1dTLUhlYWRlci5oIGIvaW1wb3J0L1dTLUhlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDliZDMKLS0tIC9kZXYvbnVsbAorKysgYi9pbXBvcnQvV1MtSGVhZGVyLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKworV1MtSGVhZGVyLmgKKworQ29tYmluZXMgV1MtUm91dGluZywgV1MtU2VjdXJpdHksIFdTLUFkZHJlc3NpbmcKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwNC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyB0d28gbGljZW5zZXM6CitHUEwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbXBvcnQgIndzcnAuaCIKKyNpbXBvcnQgIndzYS5oIgorI2ltcG9ydCAid3NzZS5oIgorCitzdHJ1Y3QgU09BUF9FTlZfX0hlYWRlcgoreworICBtdXN0VW5kZXJzdGFuZCBfd3NycF9fcGF0aAkJKndzcnBfX3BhdGgJMDsgLy8vPCBXUy1Sb3V0aW5nCisgIG11c3RVbmRlcnN0YW5kIF93c3NlX19TZWN1cml0eQkqd3NzZV9fU2VjdXJpdHkJMDsgLy8vPCBXUy1TZWN1cml0eQorICBtdXN0VW5kZXJzdGFuZCBfd3NhX19NZXNzYWdlSUQJIHdzYV9fTWVzc2FnZUlECTA7IC8vLzwgV1MtQWRkcmVzc2luZworICBtdXN0VW5kZXJzdGFuZCBfd3NhX19SZWxhdGVzVG8JKndzYV9fUmVsYXRlc1RvCTA7IC8vLzwgV1MtQWRkcmVzc2luZworICBtdXN0VW5kZXJzdGFuZCBfd3NhX19Gcm9tCQkqd3NhX19Gcm9tCTA7IC8vLzwgV1MtQWRkcmVzc2luZworICBtdXN0VW5kZXJzdGFuZCBfd3NhX19SZXBseVRvCQkqd3NhX19SZXBseVRvCTA7IC8vLzwgV1MtQWRkcmVzc2luZworICBtdXN0VW5kZXJzdGFuZCBfd3NhX19GYXVsdFRvCQkqd3NhX19GYXVsdFRvCTA7IC8vLzwgV1MtQWRkcmVzc2luZworICBtdXN0VW5kZXJzdGFuZCBfd3NhX19UbwkJIHdzYV9fVG8JMDsgLy8vPCBXUy1BZGRyZXNzaW5nCisgIG11c3RVbmRlcnN0YW5kIF93c2FfX0FjdGlvbgkJIHdzYV9fQWN0aW9uCTA7IC8vLzwgV1MtQWRkcmVzc2luZworfTsKZGlmZiAtLWdpdCBhL2ltcG9ydC9XUy1leGFtcGxlLmMgYi9pbXBvcnQvV1MtZXhhbXBsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NThkYWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbXBvcnQvV1MtZXhhbXBsZS5jCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisKK2V4YW1wbGUuYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR3byBsaWNlbnNlczoKK0dQTCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2luY2x1ZGUgInNvYXBILmgiCisjaW5jbHVkZSAiY2FsYy5uc21hcCIKKworaW50IG1haW4oKQoreworICBzdHJ1Y3Qgc29hcCBzb2FwOworICBzdHJ1Y3QgU09BUF9FTlZfX0hlYWRlciBoZWFkZXI7CisgIHN0cnVjdCB3c2FfX0VuZHBvaW50UmVmZXJlbmNlVHlwZSByZXBseVRvOworICBkb3VibGUgbjsKKworICBzb2FwX2luaXQoJnNvYXApOworCisgIHNvYXBfZGVmYXVsdF9TT0FQX0VOVl9fSGVhZGVyKCZzb2FwLCAmaGVhZGVyKTsKKworICBzb2FwX2RlZmF1bHRfd3NhX19FbmRwb2ludFJlZmVyZW5jZVR5cGUoJnNvYXAsICZyZXBseVRvKTsKKyAgcmVwbHlUby5BZGRyZXNzID0gImh0dHA6Ly93ZWJzcnYuY3MuZnN1LmVkdS9+ZW5nZWxlbi9jYWxjY2xpZW50LmNnaSI7CisKKyAgaGVhZGVyLndzYV9fTWVzc2FnZUlEID0gInV1aWQ6YWFhYWJiYmItY2NjYy1kZGRkLWVlZWUtZmZmZmZmZmZmZmZmIjsKKyAgaGVhZGVyLndzYV9fUmVwbHlUbyA9ICZyZXBseVRvOworICBoZWFkZXIud3NhX19UbyA9ICJodHRwOi8vd2Vic3J2LmNzLmZzdS5lZHUvfmVuZ2VsZW4vY2FsY3NlcnZlci5jZ2kiOworICBoZWFkZXIud3NhX19BY3Rpb24gPSAiaHR0cDovL3dlYnNydi5jcy5mc3UuZWR1L35lbmdlbGVuL3Jlc3VsdCI7CisgIHNvYXAuaGVhZGVyID0gJmhlYWRlcjsKKworICBwcmludGYoIlRlc3Rpbmc6IHRoZSBXUy1BZGRyZXNzaW5nIHJlcXVlc3Qgc2VuZCB0byB0aGUgY2FsYyBzZXJ2ZXIgaXMgbm90IHVuZGVyc3Rvb2Q6XG4iKTsKKworICBpZiAoc29hcF9jYWxsX25zX19hZGQoJnNvYXAsIE5VTEwsIE5VTEwsIDEsIDIsICZuKSkKKyAgICBzb2FwX3ByaW50X2ZhdWx0KCZzb2FwLCBzdGRlcnIpOworICBlbHNlCisgICAgcHJpbnRmKCIxICsgMiA9ICVnXG4iLCBuKTsKKworICBzb2FwX2VuZCgmc29hcCk7CisgIHNvYXBfZG9uZSgmc29hcCk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9pbXBvcnQvV1MtZXhhbXBsZS5oIGIvaW1wb3J0L1dTLWV4YW1wbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2JhYzJkCi0tLSAvZGV2L251bGwKKysrIGIvaW1wb3J0L1dTLWV4YW1wbGUuaApAQCAtMCwwICsxLDQ2IEBACisvKgorCitleGFtcGxlLmgKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwNC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyB0d28gbGljZW5zZXM6CitHUEwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbXBvcnQgIldTLUhlYWRlci5oIgorCisvL2dzb2FwIG5zIHNlcnZpY2UgbmFtZTogICAgICAgIGNhbGMKKy8vZ3NvYXAgbnMgc2VydmljZSBzdHlsZTogICAgICAgcnBjCisvL2dzb2FwIG5zIHNlcnZpY2UgZW5jb2Rpbmc6ICAgIGVuY29kZWQKKy8vZ3NvYXAgbnMgc2VydmljZSBuYW1lc3BhY2U6ICAgaHR0cDovL3dlYnNydi5jcy5mc3UuZWR1L35lbmdlbGVuL2NhbGMud3NkbAorLy9nc29hcCBucyBzZXJ2aWNlIGxvY2F0aW9uOiAgICBodHRwOi8vd2Vic3J2LmNzLmZzdS5lZHUvfmVuZ2VsZW4vY2FsY3NlcnZlci5jZ2kKKworLy9nc29hcCBucyBzY2hlbWEgbmFtZXNwYWNlOgl1cm46Y2FsYworaW50IG5zX19hZGQoZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgKnJlc3VsdCk7CitpbnQgbnNfX3N1Yihkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSAqcmVzdWx0KTsKK2ludCBuc19fbXVsKGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlICpyZXN1bHQpOworaW50IG5zX19kaXYoZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgKnJlc3VsdCk7CitpbnQgbnNfX3Bvdyhkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSAqcmVzdWx0KTsKZGlmZiAtLWdpdCBhL2ltcG9ydC9jMTRuLmggYi9pbXBvcnQvYzE0bi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNjRkYjkKLS0tIC9kZXYvbnVsbAorKysgYi9pbXBvcnQvYzE0bi5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisKK2MxNG4uaAorCisqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogU2NoZW1hIE5hbWVzcGFjZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy9nc29hcCBjMTRuICBzY2hlbWEgaW1wb3J0OglodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMKKy8vZ3NvYXAgYzE0biAgc2NoZW1hIGVsZW1lbnRGb3JtOglxdWFsaWZpZWQKKy8vZ3NvYXAgYzE0biAgc2NoZW1hIGF0dHJpYnV0ZUZvcm06CXVucXVhbGlmaWVkCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBTY2hlbWEgVHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBfYzE0bl9fSW5jbHVzaXZlTmFtZXNwYWNlcworewlAY2hhcioJCQkJUHJlZml4TGlzdDsKK30gX2MxNG5fX0luY2x1c2l2ZU5hbWVzcGFjZXM7CmRpZmYgLS1naXQgYS9pbXBvcnQvZG9tLmggYi9pbXBvcnQvZG9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGViOGI3OAotLS0gL2Rldi9udWxsCisrKyBiL2ltcG9ydC9kb20uaApAQCAtMCwwICsxLDYzMCBAQAorLyoKKworZG9tLmgKKworZ1NPQVAgRE9NIGludGVyZmFjZQorCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHBhcnQgb2YgdGhlIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2VzOgorR1BMLCB0aGUgZ1NPQVAgcHVibGljIGxpY2Vuc2UsIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBwdWJsaWMgbGljZW5zZS4KKworVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZ1NPQVAgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjMKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcGxpY2Vuc2UuaHRtbAorU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKK1dJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQorZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFJvYmVydCBBLiB2YW4gRW5nZWxlbi4KK0NvcHlyaWdodCAoQykgMjAwMC0yMDA0IFJvYmVydCBBLiB2YW4gRW5nZWxlbiwgR2VuaXZpYSBpbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworLyoqCisKK0BtYWlucGFnZSBUaGUgZ1NPQVAgbGV2ZWwtMiBET00gcGFyc2VyCisKK1RoZSBnU09BUCBsZXZlbC0yIERPTSBwYXJzZXIgZmVhdHVyZXMgInNtYXJ0IiBYTUwgbmFtZXNwYWNlIGhhbmRsaW5nIGFuZCBjYW4gYmUKK3VzZWQgdG8gbWl4IGdTT0FQIFhNTCBzZXJpYWxpemVycyB3aXRoIHBsYWluIFhNTCBwYXJzaW5nLiBUaGUgRE9NIHBhcnNlciBpcworYWxzbyBhbiBlc3NlbnRpYWwgY29tcG9uZW50IG9mIHRoZSB3c3NlIHBsdWdpbiB0byB2ZXJpZnkgZGlnaXRhbCBzaWduYXR1cmVzLgorCitUaGUgRE9NIHBhcnNlciBpcyBub3QgYSBzdGFuZC1hbG9uZSBhcHBsaWNhdGlvbi4gVGhlIERPTSBwYXJzZXIgaXMgaW50ZWdyYXRlZAord2l0aCB0aGUgU09BUCBlbmdpbmUgdG8gcG9wdWxhdGUgYSBub2RlIHNldCBhbmQgdG8gcmVuZGVyIGEgbm9kZSBzZXQgaW4gWE1MLgorCitUd28gZmlsZXMgYXJlIG5lZWRlZCB0byB3b3JrIHdpdGggRE9NIG5vZGUgc2V0czoKKworLSBkb20uaCB0byB1c2UgYSBET00gbm9kZSBzZXQgaW4gYSBnU09BUCBoZWFkZXIgZmlsZSB3aXRoIHNlcnZpY2UgZGVmaW5pdGlvbnMuCistIGRvbS5jcHAgKG9yIGRvbS5jKSB0byBiZSBsaW5rZWQgd2l0aCB5b3VyIGFwcGxpY2F0aW9uIGNvZGUuCisKK0BzZWN0aW9uIGRvbV8xIERlY2xhcmluZyBET00gTm9kZSBTZXRzIGluIGEgZ1NPQVAgSGVhZGVyIEZpbGUKKworVG8gdXNlIHRoZSBET00gbm9kZSBzZXQgd2l0aCB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGRlZmluZWQgaW4gYSBnU09BUCBoZWFkZXIKK2ZpbGUsIGltcG9ydCB0aGUgZG9tLmggZmlsZSBpbnRvIHlvdXIgaGVhZGVyIGZpbGU6CisKK0Bjb2RlCisgICAgI2ltcG9ydCAiZG9tLmgiCitAZW5kY29kZQorCitCeSBpbXBvcnRpbmcgZG9tLmggYSBzcGVjaWFsIGRhdGEgdHlwZSBAcmVmIHhzZF9fYW55VHlwZSBpcyBhdmFpbGFibGUgdGhhdAorcmVwcmVzZW50cyBhIGhpZXJhcmNoaWNhbCBET00gbm9kZSBzZXQuIFRoZSBET00gbm9kZSBzZXQgZGF0YSBzdHJ1Y3R1cmUgY2FuIGJlCit1c2VkIHdpdGhpbiBzdHJ1Y3RzLCBjbGFzc2VzLCBTVEwgY29udGFpbmVycywgYW5kIGFzIGFyZ3VtZW50cyBvZiBzZXJ2aWNlCitvcGVyYXRpb25zLiBGb3IgZXhhbXBsZToKKworQGNvZGUKKyAgICAjaW1wb3J0ICJkb20uaCIKKyAgICAjaW1wb3J0ICJ3c3UuaCIKKyAgICBjbGFzcyBuc19fbXlQcm9kdWN0CisgICAgeyBwdWJsaWM6CisJQGNoYXIqICAgICAgICAgICAgd3N1X19JZDsKKwlfd3N1X19UaW1lc3RhbXAqICB3c3VfX1RpbWVzdGFtcDsKKyAgICAgICAgY2hhciogICAgICAgICAgICAgbmFtZTsKKwlpbnQgICAgICAgICAgICAgICBTS1U7CisJZG91YmxlICAgICAgICAgICAgcHJpY2U7CisJeHNkX19hbnlUeXBlKgkgIGFueTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbnNfX215UHJvZHVjdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICB+bnNfX215UHJvZHVjdCgpOworICAgIH07CitAZW5kY29kZQorCitJdCBpcyBpbXBvcnRhbnQgdG8gZGVjbGFyZSB0aGUgQHJlZiB4c2RfX2FueVR5cGUgYXQgdGhlIGVuZCBvZiB0aGUgc3RydWN0IG9yCitjbGFzcywgc2luY2UgdGhlIERPTSBwYXJzZXIgY29uc3VtZXMgYW55IFhNTCBlbGVtZW50ICh0aGUgZmllbGQgbmFtZSwgJ2FueScgaW4KK3RoaXMgY2FzZSwgaXMgaXJyZWxhdmFudCkuICBUaHVzLCB0aGUgb3RoZXIgZmllbGRzIG11c3QgYmUgZGVmaW5lZCBmaXJzdCB0bworZW5zdXJlIHRoZXkgYXJlIHBvcHVsYXRlZCBmaXJzdCBiZWZvcmUgdGhlIERPTSBub2RlIHNldCBpcyBwb3B1bGF0ZWQgd2l0aCBhbnkKK25vbi1wcmV2aW91c2x5IG1hdGNoZWQgWE1MIGVsZW1lbnQuCisKK05vdGUgdGhhdCB3ZSBhbHNvIGltcG9ydGVkIHdzdS5oIGFzIGFuIGV4YW1wbGUgdG8gc2hvdyBob3cgdG8gYWRkIGEgd3N1OklkCithdHRyaWJ1dGUgdG8gYSBzdHJ1Y3Qgb3IgY2xhc3MgaWYgd2Ugd2FudCB0byBkaWdpdGFsbHkgc2lnbiBpbnN0YW5jZXMsIGFuZCBob3cKK3RvIGFkZCBhIHN0YW5kYXJkaXplZCB3c3U6VGltZXN0YW1wIGVsZW1lbnQgdG8gcmVjb3JkIGNyZWF0aW9uIGFuZCBleHBpcmF0aW9uCit0aW1lcy4KKworVG8gY29tcGlsZSwgcnVuIHNvYXBjcHAyICh3aXRoIC1JaW1wb3J0KSBhbmQgY29tcGlsZSB5b3VyIGNvZGUgYnkgbGlua2luZworZG9tLmNwcCAob3IgZG9tLmMgZm9yIEMpLiBOb3RlIHRoYXQgdGhlIERPTSBkYXRhIHN0cnVjdHVyZXMgYXJlIGRlY2xhcmVkIGluCitzdGRzb2FwMi5oLCB3aGlsZSB0aGUgRE9NIG9wZXJhdGlvbnMgYXJlIGRlZmluZWQgaW4gZG9tLmNwcCAob3IgZG9tLmMgZm9yIEMpLgorCitNZXRob2RzIHRvIHBvcHVsYXRlIGFuZCB0cmF2ZXJzZSBET00gbm9kZSBzZXRzIHdpbGwgYmUgZXhwbGFpbmVkIGxhdGVyLiBGaXJzdCwKK2xldCdzIHRha2UgYSBsb29rIGF0IHBhcnNpbmcgYW5kIGdlbmVyYXRpbmcgWE1MIGRvY3VtZW50cy4KKworQHNlY3Rpb24gZG9tXzIgUGFyc2luZyBhbmQgR2VuZXJhdGluZyBYTUwKKworVGhlIGZvbGxvd2luZyBleGFtcGxlcyBhc3N1bWUgdGhhdCB0aGUgc29hcGNwcDIgY29tcGlsZXIgd2FzIHVzZWQgb24gYSBoZWFkZXIKK2ZpbGUgKGp1c3QgdGhlIGRvbS5oIGZpbGUgd2lsbCBkbykgYW5kIHRoZSBnZW5lcmF0ZWQgc29hcEMuY3BwIG9yIChzb2FwQy5jIGZvcgorQykgY29kZSB3YXMgY29tcGlsZWQgYW5kIGxpbmtlZCB3aXRoIGRvbS5jcHAgKG9yIGRvbS5jIGZvciBDKSwgc3Rkc29hcDIuY3BwIChvcgorc3Rkc29hcDIuYykgYW5kIHRoZSBleGFtcGxlIGFwcGxpY2F0aW9uIGNvZGUuIFRoZSBnZW5lcmF0ZWQgbmFtZXNwYWNlIHRhYmxlCitzaG91bGQgYWxzbyBiZSB1c2VkLCBzaW5jZSB0aGUgbmFtZXNwYWNlIGJpbmRpbmdzIGFyZSByZWxldmFudCBmb3IgY29uc3VtaW5nCithbmQgcHJvZHVjaW5nIFhNTCBmb3IgRE9NIG5vZGUgc2V0cy4gVGhlcmVmb3JlLCBlYWNoIG9mIHRoZSBleGFtcGxlIGNvZGVzCitpbiB0aGlzIGRvY3VtZW50YXRpb24gaXMgYXNzdW1lZCB0byBzdGFydCB3aXRoIHRoZSBmb2xsb3dpbmcgdHdvIGluY2x1ZGVzOgorCitAY29kZQorICAgICNpbmNsdWRlICJzb2FwSC5oIiAgLy8gZ2VuZXJhdGVkIGJ5IHNvYXBjcHAyCisgICAgI2luY2x1ZGUgIm5zLm5zbWFwIiAvLyBhIG5hbWVzcGFjZSB0YWJsZSB3aXRoIHRoZSBYTUwgbmFtZXNwYWNlIHVzZWQKK0BlbmRjb2RlCisKK1RoZSBDKysgc3RkOjppb3N0cmVhbSBvcGVyYXRvcnMgYXJlIG92ZXJsb2FkZWQgdG8gcGFyc2UgWE1MIG9jdGV0IHN0cmVhbXMgaW50bworbm9kZSBzZXRzIGFuZCB0byBlbWl0IFhNTCBmcm9tIG5vZGUgc2V0czoKKworQGNvZGUKKyAgICBzb2FwX2RvbV9lbGVtZW50IGRvbTsKKyAgICBkb20uc29hcCA9IHNvYXBfbmV3MShTT0FQX0RPTV9UUkVFIHwgU09BUF9DX1VURlNUUklORyk7CisgICAgY2luID4+IGRvbTsgLy8gcGFyc2UgWE1MCisgICAgaWYgKGRvbS5zb2FwLT5lcnJvcikKKyAgICAgIC4uLiAvLyBwYXJzZSBlcnJvcgorICAgIGNvdXQgPDwgZG9tOyAvLyBkaXNwbGF5IFhNTAorICAgIGlmIChkb20uc29hcC0+ZXJyb3IpCisgICAgICAuLi4gLy8gb3V0cHV0IGVycm9yCisgICAgc29hcF9kZXN0cm95KGRvbS5zb2FwKTsKKyAgICBzb2FwX2VuZChkb20uc29hcCk7CisgICAgc29hcF9kb25lKGRvbS5zb2FwKTsKKyAgICBmcmVlKGRvbS5zb2FwKTsKK0BlbmRjb2RlCisKK0luIHRoZSBleGFtcGxlIGFib3ZlIHdlIGNvcGllZCBhbiBYTUwgZG9jdW1lbnQgZnJvbSBzdGRpbiB0byBzdGRvdXQuCisKK0luIEMgd2UgdXNlIHRoZSBET00gInNlcmlhbGl6ZXJzIiB0byBhY2NvbXBsaXNoIHRoaXMgYXMgZm9sbG93czoKKworQGNvZGUKKyAgICBzb2FwX2RvbV9lbGVtZW50IGRvbTsKKyAgICBkb20uc29hcCA9IHNvYXBfbmV3MShTT0FQX0RPTV9UUkVFIHwgU09BUF9DX1VURlNUUklORyk7CisgICAgZG9tLnNvYXAtPnJlY3ZmZCA9IHN0ZGluOworICAgIGlmIChzb2FwX2JlZ2luX3JlY3YoZG9tLnNvYXApCisgICAgIHx8IE5VTEwgIT0gc29hcF9pbl94c2RfX2FueVR5cGUoZG9tLnNvYXAsIE5VTEwsICZkb20sIE5VTEwpCisgICAgIHx8IHNvYXBfZW5kX3JlY3YoZG9tLnNvYXApKQorICAgICAgLi4uIC8vIHBhcnNlIGVycm9yCisgICAgZG9tLnNvYXAtPnNlbmRmZCA9IHN0ZG91dDsKKyAgICBpZiAoc29hcF9iZWdpbl9zZW5kKGRvbS5zb2FwKQorICAgICB8fCBzb2FwX291dF94c2RfX2FueVR5cGUoZG9tLnNvYXAsIE5VTEwsIDAsICZkb20sIE5VTEwpCisgICAgIHx8IHNvYXBfZW5kX3NlbmQoZG9tLnNvYXApKQorICAgICAgLi4uIC8vIG91dHB1dCBlcnJvcgorICAgIHNvYXBfZW5kKGRvbS5zb2FwKTsKKyAgICBzb2FwX2RvbmUoZG9tLnNvYXApOworICAgIGZyZWUoZG9tLnNvYXApOworQGVuZGNvZGUKKworVGhlIFNPQVBfRE9NX05PREUgZmxhZyBpcyB1c2VkIHRvIGluc3RydWN0IHRoZSBwYXJzZXIgdG8gcG9wdWxhdGUgYSBET00gbm9kZQorc2V0IHdpdGggZGVzZXJpYWxpemVkIEMgYW5kIEMrKyBkYXRhIHN0cnVjdHVyZXMgdXNpbmcgdGhlIGRhdGEgdHlwZSdzCitkZXNlcmlhbGl6ZXJzIHRoYXQgd2VyZSBnZW5lcmF0ZWQgd2l0aCBzb2FwY3BwMiBmcm9tIGEgaGVhZGVyIGZpbGUgd2l0aCB0aGUKK2RhdGEgdHlwZSBkZWNsYXJhdGlvbnMuIFN1cHBvc2UgZm9yIGV4YW1wbGUgdGhhdCB0aGUgZm9sbG93aW5nIGhlYWRlciBmaWxlIHdhcwordXNlZCAoaW4gZmFjdCwgdGhpcyBkZWNsYXJhdGlvbiBhcHBlYXJzIGluIHdzdS5oKToKKworQGNvZGUKKyAgICB0eXBlZGVmIHN0cnVjdCBfd3N1X19UaW1lc3RhbXAKKyAgICB7CUBjaGFyKgl3c3VfX0lkOworICAgIAljaGFyKglDcmVhdGVkOworCWNoYXIqCUV4cGlyZXM7CisgICAgfSBfd3N1X19UaW1lc3RhbXA7CitAZW5kY29kZQorCitOb3RlIHRoYXQgdGhlIGxlYWRpbmcgdW5kZXJzY29yZSBvZiB0aGUgdHlwZSBuYW1lIGluZGljYXRlcyBhbiBYTUwgZWxlbWVudAorZGVmaW5pdGlvbiAocmF0aGVyIHRoYW4gYSBjb21wbGV4VHlwZSBkZWZpbml0aW9uKSwgc28gdGhlIG5hbWUgb2YgdGhlIGRhdGEgdHlwZQoraXMgcmVsZXZhbnQgd2hlbiBjb21wYXJpbmcgWE1MIGVsZW1lbnQgdGFncyB0byBDL0MrKyBkYXRhIHR5cGVzIGJ5IHRoZQorZGVzZXJpYWxpemVycy4KKworV2hlbiBhbiBYTUwgZG9jdW1lbnQgaXMgcGFyc2VkIHdpdGggb25lIG9yIG1vcmUgPHdzdTpUaW1lc3RhbXA+IGVsZW1lbnRzLCB0aGUKK0RPTSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcG9wdWxhdGVkIHdpdGggdGhlIF93c3VfX1RpbWVzdGFtcCBvYmplY3RzLiBTdXBwb3NlCit0aGUgWE1MIGRvY3VtZW50IHJvb3QgaXMgYSA8d3N1OlRpbWVzdGFtcD4sIHRoZW4gdGhlIHJvb3Qgbm9kZSBvZiB0aGUgRE9NIGlzIGEKK193c3VfX1RpbWVzdGFtcCBvYmplY3Q6CisKK0Bjb2RlCisgICAgc29hcF9kb21fZWxlbWVudCBkb207CisgICAgZG9tLnNvYXAgPSBzb2FwX25ldzEoU09BUF9ET01fTk9ERSk7CisgICAgY2luID4+IGRvbTsgLy8gcGFyc2UgWE1MCisgICAgaWYgKGRvbS5zb2FwLT5lcnJvcikKKyAgICAgIC4uLiAvLyBwYXJzZSBlcnJvcgorICAgIGlmIChkb20udHlwZSA9PSBTT0FQX1RZUEVfX3dzdV9fVGltZXN0YW1wKQorICAgIHsgX3dzdV9fVGltZXN0YW1wICp0ID0gKF93c3VfX1RpbWVzdGFtcCopZG9tLm5vZGU7CisgICAgICBjb3V0IDw8ICJTdGFydCAiIDw8ICh0LT5DcmVhdGVkID8gdC0+Q3JlYXRlZCA6ICIiKQorICAgICAgICAgICA8PCAiIHRpbGwgIiA8PCAodC0+RXhwaXJlcyA/IHQtPkV4cGlyZXMgOiAiIikgPDwgZW5kbDsKKyAgICB9CitAZW5kY29kZQorCitOb3RlIHRoYXQgdGhlIHNvYXBjcHAyIGNvbXBpbGVyIGdlbmVyYXRlcyBhIHVuaXF1ZSB0eXBlIGlkZW50aWZpY2F0aW9uIGNvbnN0YW50CitTT0FQX1RZUEVfWCBmb3IgZWFjaCBkYXRhIHR5cGUgWCwgd2hpY2ggaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIG5vZGUncyB0eXBlIGluCit0aGUgZXhhbXBsZSBhYm92ZS4KKworV2hlbiBvYmplY3RzIG9jY3VyIGRlZXBlciB3aXRoaW4gdGhlIERPTSBub2RlIHNldCB0aGVuIHRoZSBET00gdHJlZSBzaG91bGQgYmUKK3RyYXZlcnNlZC4gVGhpcyBzdWJqZWN0IHdpbGwgYmUgZGlzY3Vzc2VkIG5leHQuCisKK0BzZWN0aW9uIGRvbV8zIFRyYXZlcnNpbmcgYSBET00gTm9kZSBTZXQKKworVGhlIERPTSBub2RlIHNldCBpcyB0cmF2ZXJzZWQgd2l0aCBhIEMrKyBpdGVyYXRvciBvciB3aXRoIHRoZSBDIGZ1bmN0aW9ucyBAcmVmCitzb2FwX2RvbV9uZXh0X2VsZW1lbnQgYW5kIEByZWYgc29hcF9kb21fbmV4dF9hdHRyaWJ1dGUuIEZvciBleGFtcGxlLCB0byB3YWxrCit0aGUgbm9kZSBzZXQgdmlzaXRpbmcgbm9kZXMgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhleSBhcHBlYXJlZCBpbiB0aGUgZG9jdW1lbnQsCit1c2U6CisKK0Bjb2RlCisgICAgc29hcF9kb21fZWxlbWVudCBkb207CisgICAgZG9tLnNvYXAgPSBzb2FwX25ldzEoU09BUF9ET01fVFJFRSB8IFNPQVBfQ19VVEZTVFJJTkcpOworICAgIC4uLgorICAgIGZvciAoc29hcF9kb21fZWxlbWVudDo6aXRlcmF0b3IgaXRlciA9IGRvbS5iZWdpbigpOyBpdGVyICE9IGRvbS5lbmQoKTsgKytpdGVyKQorICAgICAgZm9yIChzb2FwX2RvbV9hdHRyaWJ1dGU6Oml0ZXJhdG9yIGF0dHIgPSAoKml0ZXIpLmF0dHMuYmVnaW4oKTsgYXR0ciAhPSAoKml0ZXIpLmF0dHMuZW5kKCk7ICsrYXR0cikKKyAgICAgICAgLi4uCitAZW5kY29kZQorCitJbiBDIGNvZGUsIHVzZToKKworQGNvZGUKKyAgICBzb2FwX2RvbV9lbGVtZW50IGRvbSwgKml0ZXI7CisgICAgc29hcF9kb21fYXR0cmlidXRlICphdHRyOworICAgIGRvbS5zb2FwID0gc29hcF9uZXcxKFNPQVBfRE9NX1RSRUUgfCBTT0FQX0NfVVRGU1RSSU5HKTsKKyAgICAuLi4KKyAgICBmb3IgKGl0ZXIgPSAmZG9tOyBpdGVyOyBpdGVyID0gc29hcF9kb21fbmV4dF9lbGVtZW50KGl0ZXIpKQorICAgICAgZm9yIChhdHRyID0gaXRlci0+YXR0czsgYXR0cjsgYXR0ciA9IHNvYXBfZG9tX25leHRfYXR0cmlidXRlKGF0dHIpKQorICAgICAgICAgLi4uCitAZW5kY29kZQorCitUaGUgQHJlZiBzb2FwX2RvbV9lbGVtZW50IGFuZCBAcmVmIHNvYXBfZG9tX2F0dHJpYnV0ZSBzdHJ1Y3RzIGZvcm0gZXNzZW50aWFsbHkKK2xpbmtlZCBsaXN0cywgc28gaXQgd291bGQgbm90IGJlIHRvbyBkaWZmaWN1bHQgdG8gd3JpdGUgeW91ciBvd24gdHJlZSB3YWxrZXJzOgorCistIEByZWYgc29hcF9kb21fZWxlbWVudDo6cHJudCBwb2ludHMgdG8gdGhlIHBhcmVudCBzb2FwX2RvbV9lbGVtZW50IG5vZGUuCistIEByZWYgc29hcF9kb21fZWxlbWVudDo6ZWx0cyBwb2ludHMgdG8gdGhlIGxpbmtlZCBsaXN0IG9mIGNoaWxkIGVsZW1lbnQgbm9kZXMuCistIEByZWYgc29hcF9kb21fZWxlbWVudDo6YXR0cyBwb2ludHMgdG8gdGhlIGxpbmtlZCBsaXN0IG9mIGF0dHJpYnV0ZSBub2Rlcy4KKworVGhlIGxpbmtlZCBsaXN0cyBvZiBzaWJsaW5nIGVsZW1lbnRzIG5vZGVzIGFuZCBhdHRyaWJ1dGUgbm9kZXMgYXJlIHJlc3BlY3RpdmVseToKKworLSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQ6Om5leHQgcG9pbnRzIHRvIHRoZSBuZXh0IHNpYmxpbmcgZWxlbWVudCBub2RlLgorLSBAcmVmIHNvYXBfZG9tX2F0dHJpYnV0ZTo6bmV4dCBwb2ludHMgdG8gdGhlIG5leHQgYXR0cmlidXRlIGluIHRoZSBhdHRyaWJ1dGUKKyAgbGlzdCBvZiBhbiBlbGVtZW50IG5vZGUuCisKK05vdGUgdGhhdCBmb3IgYSByb290IG5vZGUsIHRoZSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQ6OnBybnQgYW5kIEByZWYKK3NvYXBfZG9tX2VsZW1lbnQ6Om5leHQgYXJlIGJvdGggTlVMTC4KKworVGFnIG5hbWVzIG9mIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGFyZSBzdG9yZWQgaW4gQHJlZiBzb2FwX2RvbV9lbGVtZW50OjpuYW1lCithbmQgQHJlZiBzb2FwX2RvbV9hdHRyaWJ1dGU6Om5hbWUgc3RyaW5ncywgcmVzcGVjdGl2ZWx5LiBUaGUgbmFtZXMgYXJlIFVURi04CitlbmNvZGVkLgorCitYTUwgbmFtZXNwYWNlIGJpbmRpbmdzIGFyZSBleHBsaWNpdGx5IHByb3BhZ2F0ZWQgdGhyb3VnaG91dCB0aGUgRE9NIG5vZGUgc2V0Citmb3IgdGhvc2UgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgdGhhdCBhcmUgbmFtZXNwYWNlIHF1YWxpZmllZCAoZWl0aGVyIHdpdGggYQorbmFtZXNwYWNlIHByZWZpeCBvciB3aGVuIHRoZXkgb2NjdXIgaW4gYSB4bWxucyBkZWZhdWx0IG5hbWVzcGFjZSBzY29wZSkuIFRoZQorbmFtZXNwYWNlcyBhcmUgc3RvcmVkIGluIHRoZSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQ6Om5zdHIgYW5kIEByZWYKK3NvYXBfZG9tX2F0dHJpYnV0ZTo6bnN0ciBzdHJpbmdzLiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvIHRyYXZlcnNlIGEKK0RPTSBub2RlIHNldCBhbmQgcHJpbnQgdGhlIGVsZW1lbnRzIHdpdGggdGhlaXIgbmFtZXNwYWNlIFVSSXMgd2hlbiBwcmVzZW50OgorCitAY29kZQorICAgIHNvYXBfZG9tX2VsZW1lbnQgZG9tOworICAgIGRvbS5zb2FwID0gc29hcF9uZXcxKFNPQVBfRE9NX1RSRUUgfCBTT0FQX0NfVVRGU1RSSU5HKTsKKyAgICBjaW4gPj4gZG9tOworICAgIGZvciAoc29hcF9kb21fZWxlbWVudDo6aXRlcmF0b3IgaXRlciA9IGRvbS5iZWdpbigpOyBpdGVyICE9IGRvbS5lbmQoKTsgKytpdGVyKQorICAgIHsgY291dCA8PCAiRWxlbWVudCAiIDw8ICgqaXRlcikubmFtZTsKKyAgICAgIGlmICgoKml0ZXIpLm5zdHIpCisgICAgICAgIGNvdXQgPDwgIiBoYXMgbmFtZXNwYWNlICIgPDwgKCppdGVyKS5uc3RyOworICAgICAgY291dCA8PCBlbmRsOworICAgIH0KKyAgICBzb2FwX2Rlc3Ryb3koZG9tLnNvYXApOworICAgIHNvYXBfZW5kKGRvbS5zb2FwKTsKKyAgICBzb2FwX2RvbmUoZG9tLnNvYXApOworICAgIGZyZWUoZG9tLnNvYXApOworQGVuZGNvZGUKKworVGV4dCBjb250ZW50IG9mIGEgbm9kZSBpcyBzdG9yZWQgaW4gdGhlIEByZWYgc29hcF9kb21fZWxlbWVudDo6ZGF0YSBzdHJpbmcgaW4KK1VURi04IGZvcm1hdC4gVGhpcyBzdHJpbmcgaXMgcG9wdWxhdGVkIGlmIHRoZSBTT0FQX0NfVVRGU1RSSU5HIGZsYWcgd2FzIHNldC4KK090aGVyd2lzZSB0aGUgZGF0YSBjb250ZW50IHdpbGwgYmUgc3RvcmVkIGluIHRoZSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQ6OndpZGUKK3dpZGUtY2hhcmFjdGVyIHN0cmluZy4KKworVGhlIGZvbGxvd2luZyBleGFtcGxlIHByaW50cyB0aG9zZSBlbGVtZW50IG5vZGVzIHRoYXQgaGF2ZSB0ZXh0IGNvbnRlbnQKKyhpbiBVVEYtOCBmb3JtYXQpOgorCitAY29kZQorICAgIHNvYXBfZG9tX2VsZW1lbnQgZG9tOworICAgIC4uLgorICAgIGZvciAoc29hcF9kb21fZWxlbWVudDo6aXRlcmF0b3IgaXRlciA9IGRvbS5iZWdpbigpOyBpdGVyICE9IGRvbS5lbmQoKTsgKytpdGVyKQorICAgIHsgY291dCA8PCAiRWxlbWVudCAiIDw8ICgqaXRlcikubmFtZTsKKyAgICAgIGlmICgoKml0ZXIpLmRhdGEpCisgICAgICAgIGNvdXQgPDwgIiA9ICIgPDwgKCppdGVyKS5kYXRhOworICAgICAgY291dCA8PCBlbmRsOworICAgIH0KKyAgICAuLi4KK0BlbmRjb2RlCisKK1doZW4gYSBET00gbm9kZSBzZXQgY29udGFpbnMgZGVzZXJpYWxpemVkIG9iamVjdHMgKGVuYWJsZWQgd2l0aCB0aGUKK1NPQVBfRE9NX05PREUgZmxhZyksIHRoZSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQ6OnR5cGUgYW5kIEByZWYKK3NvYXBfZG9tX2VsZW1lbnQ6Om5vZGUgdmFsdWVzIGFyZSBzZXQ6CisKK0Bjb2RlCisgICAgc29hcF9kb21fZWxlbWVudCBkb207CisgICAgLi4uCisgICAgZm9yIChzb2FwX2RvbV9lbGVtZW50OjppdGVyYXRvciBpdGVyID0gZG9tLmJlZ2luKCk7IGl0ZXIgIT0gZG9tLmVuZCgpOyArK2l0ZXIpCisgICAgeyBjb3V0IDw8ICJFbGVtZW50ICIgPDwgKCppdGVyKS5uYW1lOworICAgICAgaWYgKCgqaXRlcikudHlwZSkKKyAgICAgICAgY291dCA8PCAiRWxlbWVudCAiIDw8ICgqaXRlcikubmFtZSA8PCAiIGNvbnRhaW5zIGEgZGVzZXJpYWxpemVkIG9iamVjdCIgPDwgZW5kbDsKKyAgICAgIGNvdXQgPDwgZW5kbDsKKyAgICB9CisgICAgLi4uCitAZW5kY29kZQorCitUaGUgQHJlZiBzb2FwX2RvbV9lbGVtZW50Ojp0eXBlIGlzIDAgb3IgYSBTT0FQX1RZUEVfWCBjb25zdGFudCwgd2hlcmUgWCBpcyB0aGUKK25hbWUgb2YgdGhlIGRlc2VyaWFsaXplZCB0eXBlLiBUaGUgQHJlZiBzb2FwX2RvbV9lbGVtZW50Ojpub2RlIHBvaW50cyB0byB0aGUKK2Rlc2VyaWFsaXplZCBvYmplY3QuIElmIHRoaXMgaXMgYSBjaGFyKiBzdHJpbmcsIGl0IHBvaW50cyBkaXJlY3RseSB0byB0aGUKK2NoYXJhY3RlciBzZXF1ZW5jZS4KKworTm90ZTogdGhlIFNPQVBfRE9NX1RSRUUgZmxhZyByZXN0cmljdHMgdGhlIHBhcnNlciB0byBET00gY29udGVudCBvbmx5LCBzbworZGVzZXJpYWxpemVycyBpcyBub3QgdXNlZC4gV2hlbiB0aGUgU09BUF9ET01fVFJFRSBmbGFnIGlzIG5vdCB1c2VkLCBhbgorYXBwcm9wcmlhdGUgZGVzZXJpYWxpemVyIE1BWSBiZSB1c2VkIGJ5IGdTT0FQIHdoZW4gYW4gZWxlbWVudCBjb250YWlucyBhbiBpZAorYXR0cmlidXRlIGFuZCBnU09BUCBjYW4gZGV0ZXJtaW5lIHRoZSB0eXBlIGZyb20gdGhlIGlkIGF0dHJpYnV0ZSByZWZlcmVuY2UKK2FuZC9vciB0aGUgeHNpOnR5cGUgYXR0cmlidXRlIG9mIGFuIGVsZW1lbnQuIAorCitAc2VjdGlvbiBkb21fNCBTZWFyY2hpbmcKKworQ29tbW9uIG9wZXJhdGlvbnMgb24gRE9NIG5vZGUgc2V0cyBpbiBsZXZlbC0yIERPTSBwYXJzZXJzIGFyZSBzZWFyY2hpbmcgYW5kCitmaWx0ZXJpbmcuCisKK0ZvciBDKysgY29kZSwgdGhlIGJ1aWx0LWluIEByZWYgc29hcF9kb21fZWxlbWVudDo6aXRlcmF0b3IgY2FuIGJlIHVzZWQgdG8KK3NlYXJjaCBmb3IgbWF0Y2hpbmcgZWxlbWVudCBub2Rlcy4gQyBwcm9ncmFtbWVycyBhcmUgb3V0IG9mIGx1Y2sgYXMgdGhleSBzaG91bGQKK3dyaXRlIGxvb3BpbmcgY29kZSB0byBzZWFyY2ggZm9yIG5vZGVzIGV4cGxpY2l0bHkuCisKK1RoZSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQ6OmZpbmQgbWV0aG9kIHJldHVybnMgYSBzZWFyY2ggaXRlcmF0b3IuIFRoZSBtZXRob2QKK3Rha2VzIGFuIG9wdGlvbmFsIG5hbWVzcGFjZSBVUkkgYW5kIGVsZW1lbnQgbmFtZSB0byBtYXRjaCBlbGVtZW50cyBpbiB0aGUgRE9NCitub2RlIHNldC4gIEZvciBleGFtcGxlLCB0byBpdGVyYXRlIG92ZXIgYWxsICJwcm9kdWN0IiBlbGVtZW50czoKKworQGNvZGUKKyAgICBzb2FwX2RvbV9lbGVtZW50IGRvbTsKKyAgICAuLi4KKyAgICBmb3IgKHNvYXBfZG9tX2VsZW1lbnQ6Oml0ZXJhdG9yIGl0ZXIgPSBkb20uZmluZChOVUxMLCAicHJvZHVjdCIpOyBpdGVyICE9IGRvbS5lbmQoKTsgKytpdGVyKQorICAgICAgY291dCA8PCAiRWxlbWVudCAiIDw8ICgqaXRlcikubmFtZSA8PCBlbmRsOworICAgIC4uLgorQGVuZGNvZGUKKworVG8gaXRlcmF0ZSBvdmVyIGFsbCBlbGVtZW50cyBpbiBhIHBhcnRpY3VsYXIgbmFtZXNwYWNlOgorCitAY29kZQorICAgIHNvYXBfZG9tX2VsZW1lbnQgZG9tOworICAgIC4uLgorICAgIGZvciAoc29hcF9kb21fZWxlbWVudDo6aXRlcmF0b3IgaXRlciA9IGRvbS5maW5kKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsIE5VTEwpOyBpdGVyICE9IGRvbS5lbmQoKTsgKytpdGVyKQorICAgICAgY291dCA8PCAiRWxlbWVudCAiIDw8ICgqaXRlcikubmFtZSA8PCBlbmRsOworICAgIC4uLgorQGVuZGNvZGUKKworU2luY2UgbmFtZXNwYWNlcyBtYXkgaGF2ZSBkaWZmZXJlbnQgdmVyc2lvbiwgYSAnKicgd2lsZGNhcmQgY2FuIGJlIHVzZWQgd2l0aAordGhlIG5hbWVzcGFjZSBzdHJpbmcuIExpa2V3aXNlLCB0YWcgbmFtZXMgbWF5IGJlIG5hbWVzcGFjZSBxdWFsaWZpZWQgd2l0aAorcHJlZml4ZXMgdGhhdCBhcmUgbm90IHJlbGV2YW50IHRvIHRoZSBzZWFyY2g6CisKK0Bjb2RlCisgICAgc29hcF9kb21fZWxlbWVudCBkb207CisgICAgLi4uCisgICAgZm9yIChzb2FwX2RvbV9lbGVtZW50OjppdGVyYXRvciBpdGVyID0gZG9tLmZpbmQoImh0dHA6Ly93d3cudzMub3JnLypYTUxTY2hlbWEiLCAiKjpzY2hlbWEiKTsgaXRlciAhPSBkb20uZW5kKCk7ICsraXRlcikKKyAgICAgIGNvdXQgPDwgIkVsZW1lbnQgIiA8PCAoKml0ZXIpLm5hbWUgPDwgZW5kbDsKKyAgICAuLi4KK0BlbmRjb2RlCisKK1RoaXMgc2VhcmNoZXMgZm9yIHF1YWxpZmllZCBlbGVtZW50cyBpbiBvbmUgb2YgdGhlIFhTRCBuYW1lc3BhY2VzLgorCitAc2VjdGlvbiBkb21fNSBDb25zdHJ1Y3RpbmcgRE9NIE5vZGUgU2V0cworCitUaGUgQHJlZiBzb2FwX2RvbV9lbGVtZW50OjpzZXQgYW5kIEByZWYgc29hcF9kb21fZWxlbWVudDo6YWRkIG1ldGhvZHMgYXJlIHVzZWQKK3RvIGRlY29yYXRlIGEgRE9NIG5vZGUgc2V0IHdpdGggY2hpbGQgZWxlbWVudCBub2RlcyBhbmQgYXR0cmlidXRlIG5vZGVzLgorQXBwbGljYXRpb24gZGF0YSB3aXRoIHNlcmlhbGl6ZXJzIGNhbiBiZSBpbmNvcnBvcmF0ZWQgaW4gdGhlIG5vZGUgc2V0IGFzIHdlbGwuCisKK1RoZSBmb2xsb3dpbmcgZXhhbXBsZXMgYXJlIHNob3duIGluIEMrKy4gIEMgcHJvZ3JhbW1lcnMgY2FuIHVzZSB0aGUgQHJlZgorc29hcF9kb21fZWxlbWVudDplbHRzIGxpc3QgYW5kIEByZWYgc29hcF9kb21fZWxlbWVudHM6OmF0dHMgbGlzdCB0byBhZGQgY2hpbGQKK25vZGVzIGFuZCBhdHRyaWJ1dGUgbm9kZXMsIHJlc3BlY3RpdmVseS4KKworQGNvZGUKKyAgICBzb2FwX2RvbV9lbGVtZW50IGRvbTsKKyAgICBkb20uc29hcCA9IHNvYXBfbmV3MShTT0FQX0NfVVRGU1RSSU5HIHwgU09BUF9YTUxfSU5ERU5UKTsKKyAgICBjb25zdCBjaGFyICpteVVSSSA9ICJodHRwOi8vd3d3Lm15ZG9tYWluLmNvbS9teXByb2R1Y3RzIjsKKyAgICBuc19fbXlQcm9kdWN0IHByb2R1Y3QoKTsKKyAgICBwcm9kdWN0LnNvYXBfZGVmYXVsdChkb20uc29hcCk7IC8vIG1ldGhvZCBnZW5lcmF0ZWQgYnkgc29hcGNwcDIKKyAgICBwcm9kdWN0Lm5hbWUgPSAiRXJuaWUiOworICAgIHByb2R1Y3QuU0tVID0gMTIzOworICAgIHByb2R1Y3QucHJpY2UgPSA5Ljk1OworICAgIGRvbS5zZXQobXlVUkksICJsaXN0Iik7CisgICAgZG9tLmFkZChzb2FwX2RvbV9hdHRyaWJ1dGUoZG9tLnNvYXAsIG15VVJJLCAidmVyc2lvbiIsICIwLjkiKSk7CisgICAgZG9tLmFkZChzb2FwX2RvbV9lbGVtZW50KGRvbS5zb2FwLCBteVVSSSwgImRvY3VtZW50YXRpb24iLCAiTGlzdCBvZiBwcm9kdWN0cyIpKTsKKyAgICBkb20uYWRkKHNvYXBfZG9tX2VsZW1lbnQoZG9tLnNvYXAsIG15VVJJLCAicHJvZHVjdCIsIFNPQVBfVFlQRV9uc19fbXlQcm9kdWN0LCAmcHJvZHVjdCk7CisgICAgY291dCA8PCBkb207CisgICAgLi4uCitAZW5kY29kZQorCitBc3N1bWluZyB0aGF0IG15VVJJIGlzIGFzc29jaWF0ZWQgd2l0aCBuYW1lc3BhY2UgcHJlZml4ICJucyIgaW4gdGhlIG5hbWVzcGFjZQordGFibGUsIHRoZSByZW5kaXRpb24gaXMKKworQGNvZGUKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8bnM6bGlzdAorICB4bWxuczpTT0FQLUVOVj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iCisgIHhtbG5zOlNPQVAtRU5DPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKKyAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKKyAgeG1sbnM6bnM9Imh0dHA6Ly9kb21haW4vc2NoZW1hcy9wcm9kdWN0LnhzZCIKKyAgdmVyc2lvbj0iMC45IiA+CisJPG5zOmRvY3VtZW50YXRpb24+TGlzdCBvZiBwcm9kdWN0czwvbnM6ZG9jdW1lbnRhdGlvbj4KKwk8bnM6cHJvZHVjdD4KKwkJPG5hbWU+RXJuaWU8L25hbWU+CisJCTxTS1U+MTIzPC9TS1U+CisJCTxwcmljZT45Ljk1PC9wcmljZT4KKwk8L25zOnByb2R1Y3Q+Cis8L25zOmxpc3Q+CitAZW5kY29kZQorCitOb3RlIHRoYXQgdGhlIG5hbWVzcGFjZSB0YWJsZSBjb250ZW50IGlzICJkdW1wZWQiIGludG8gdGhlIFhNTCByZW5kaXRpb24uCisKK1RoZSBnbG9iYWwgbmFtZXNwYWNlIG1hcHBpbmcgdGFibGUgIm5hbWVzcGFjZXNbXSIgY29udGFpbnMgdGhlIG5hbWVzcGFjZQorYmluZGluZ3MgdGhhdCBzaG91bGQgYmUgbWVhbmluZ2Z1bCB0byB0aGUgYXBwbGljYXRpb24uIFRoZSBzb2FwIGNvbnRleHQgY2FuIGJlCitzZXQgdG8gYSBuZXcgdGFibGUgYXMgZm9sbG93czoKKworQGNvZGUKKyAgICBOYW1lc3BhY2UgbXlOYW1lc3BhY2VzW10gPSB7IHsgIm5zIiwgIi4uLiIgfSwgLi4uICwgeyBOVUxMIH0gfTsKKyAgICBzb2FwX2RvbV9lbGVtZW50IGRvbTsKKyAgICBkb20uc29hcCA9IHNvYXBfbmV3MShTT0FQX0NfVVRGU1RSSU5HIHwgU09BUF9YTUxfSU5ERU5UKTsKKyAgICBkb20uc29hcC0+bmFtZXNwYWNlcyA9IG15TmFtZXNwYWNlczsKK0BlbmRjb2RlCisKK1RvIHByb2R1Y2UgY2xlYW5lciBYTUwsIHVzZSB0aGUgU09BUF9YTUxfQ0FOT05JQ0FMIGZsYWcgdG8gaW5pdGlhdGUgdGhlIHNvYXAKK2NvbnRleHQ6CisKK0Bjb2RlCis8bnM6bGlzdCB4bWxuczpucz0iaHR0cDovL2RvbWFpbi9zY2hlbWFzL3Byb2R1Y3QueHNkIiB2ZXJzaW9uPSIwLjkiID4KKwk8bnM6ZG9jdW1lbnRhdGlvbj5MaXN0IG9mIHByb2R1Y3RzPC9uczpkb2N1bWVudGF0aW9uPgorCTxuczpwcm9kdWN0PgorCQk8bmFtZT5Fcm5pZTwvbmFtZT4KKwkJPFNLVT4xMjM8L1NLVT4KKwkJPHByaWNlPjkuOTU8L3ByaWNlPgorCTwvbnM6cHJvZHVjdD4KKzwvbnM6bGlzdD4KK0BlbmRjb2RlCisKK05vdGUgdGhhdCB0aGUgeG1sbnMgYmluZGluZ3MgYXJlIHJlbmRlcmVkIGF1dG9tYXRpY2FsbHkuIFdoZW4gcGFyc2luZyBhbiBYTUwKK2RvY3VtZW50LCB4bWxucyBiaW5kaW5ncyBhcmUgbm90IGFkZGVkIHRvIHRoZSBhdHRyaWJ1dGUgbm9kZSBzZXQuIFRoZSBAcmVmCitzb2FwX2RvbV9lbGVtZW50Ojpuc3RyIGFuZCBAcmVmIHNvYXBfZG9tX2F0dHJpYnV0ZTo6bnN0ciBuYW1lc3BhY2Ugc3RyaW5ncyBhcmUKK3NldCB0byByZXRhaW4gbmFtZXNwYWNlIFVSSXMuIFRoZSBYTUwgcmVuZGVyaW5nIGFsZ29yaXRobSB1c2VzIHRoZSBuYW1lc3BhY2UKK3N0cmluZ3MgdG8gYWRkIHhtbG5zIGJpbmRpbmdzIHRoYXQgYXJlIG5vdCBhbHJlYWR5IGluIHRoZSBuYW1lc3BhY2UgdGFibGUuCisKK1doZW4gaXQgaXMgZGVzaXJhYmxlIHRvIHJlbmRlciBYTUwgZXhhY3RseSBhcyByZXByZXNlbnRlZCBpbiB0aGUgRE9NIG5vZGUgc2V0LAorZS5nLiB3aGVuIHhtbG5zIGJpbmRpbmdzIGFyZSBleHBsaWNpdGx5IGluY2x1ZGVkIGluIHRoZSBhdHRyaWJ1dGUgbm9kZSBzZXQsIHVzZQordGhlIFNPQVBfRE9NX0FTSVMgZmxhZzoKKworQGNvZGUKKyAgICBzb2FwX2RvbV9lbGVtZW50IGRvbTsKKyAgICBkb20uc29hcCA9IHNvYXBfbmV3MShTT0FQX0NfVVRGU1RSSU5HIHwgU09BUF9ET01fQVNJUyk7CitAZW5kY29kZQorCitAc2VjdGlvbiBkb21fNiBFeGFtcGxlCisKK1RoZSBnU09BUCBoZWFkZXIgZmlsZSBiZWxvdyBpbXBvcnRzIERPTSBhbmQgZGVjbGFyZXMgeHNkOmZsb2F0IHRvIGVuYWJsZQorc2VyaWFsaXppbmcgZmxvYXRzIGVtYmVkZGVkIHdpdGhpbiBET00gbm9kZSBzZXRzIGFuZCBkZXNlcmlhbGl6aW5nIGZsb2F0cyB0bworcG9wdWxhdGUgRE9NIG5vZGUgc2V0czoKKworQGNvZGUKKyAgICAjaW1wb3J0ICJkb20uaCIKKyAgICB0eXBlZGVmIGZsb2F0IHhzZF9fZmxvYXQ7CitAZW5kY29kZQorCitDb25zaWRlciBpbnZva2luZyB0aGUgWE1ldGhvZHMgZGVsYXllZCBzdG9jayBxdW90ZSBzZXJ2aWNlIHRvIG9idGFpbiBhIHN0b2NrCitxdW90ZS4gVGhlIGZsb2F0IGRlc2VyaWFsaXplciBpcyB1c2VkIHRvIHN0b3JlIHRoZSBmbG9hdGluZy1wb2ludCB2YWx1ZSBvZiBhCitzdG9jayBnaXZlbiB0aGF0IHRoZSA8UmVzdWx0PiBlbGVtZW50IGhhcyBhbiB4c2k6dHlwZT0ieHNkOmZsb2F0IiBhdHRyaWJ1dGUuCisKK0Bjb2RlCisgICAgc3RydWN0IHNvYXAgKnNvYXAgPSBzb2FwX25ldzEoU09BUF9DX1VURlNUUklORyB8IFNPQVBfRE9NX05PREUpOworICAgIHNvYXBfZG9tX2VsZW1lbnQgZW52ZWxvcGUoc29hcCwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIiwgIkVudmVsb3BlIik7CisgICAgc29hcF9kb21fZWxlbWVudCBib2R5KHNvYXAsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIsICJCb2R5Iik7CisgICAgc29hcF9kb21fYXR0cmlidXRlIGVuY29kaW5nU3R5bGUoc29hcCwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIiwgImVuY29kaW5nU3R5bGUiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKKyAgICBzb2FwX2RvbV9lbGVtZW50IHJlcXVlc3Qoc29hcCwgInVybjp4bWV0aG9kcy1kZWxheWVkLXF1b3RlcyIsICJnZXRRdW90ZSIpOworICAgIHNvYXBfZG9tX2VsZW1lbnQgc3ltYm9sKHNvYXAsIE5VTEwsICJzeW1ib2wiLCAiSUJNIik7CisgICAgc29hcF9kb21fZWxlbWVudCByZXNwb25zZShzb2FwKTsKKyAgICBlbnZlbG9wZS5hZGQoYm9keSk7CisgICAgYm9keS5hZGQoZW5jb2RpbmdTdHlsZSk7CisgICAgYm9keS5hZGQocmVxdWVzdCk7CisgICAgcmVxdWVzdC5hZGQoc3ltYm9sKTsKKyAgICBjb3V0IDw8ICJSZXF1ZXN0IG1lc3NhZ2U6IiA8PCBlbmRsIDw8IGVudmVsb3BlIDw8IGVuZGw7CisgICAgaWYgKHNvYXBfY29ubmVjdChzb2FwLCAiaHR0cDovL3NlcnZpY2VzLnhtZXRob2RzLm5ldC9zb2FwIiwgIiIpCisgICAgIHx8IHNvYXBfb3V0X3hzZF9fYW55VHlwZShzb2FwLCBOVUxMLCAwLCAmZW52ZWxvcGUsIE5VTEwpCisgICAgIHx8IHNvYXBfZW5kX3NlbmQoc29hcCkKKyAgICAgfHwgc29hcF9iZWdpbl9yZWN2KHNvYXApCisgICAgIHx8IE5VTEwgIT0gc29hcF9pbl94c2RfX2FueVR5cGUoc29hcCwgTlVMTCwgJnJlc3BvbnNlLCBOVUxMKQorICAgICB8fCBzb2FwX2VuZF9yZWN2KHNvYXApCisgICAgIHx8IHNvYXBfY2xvc2Vzb2NrKHNvYXApKQorICAgIHsgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOworICAgICAgc29hcF9wcmludF9mYXVsdF9sb2NhdGlvbihzb2FwLCBzdGRlcnIpOworICAgIH0KKyAgICBlbHNlCisgICAgeyBjb3V0IDw8ICJSZXNwb25zZSBtZXNzYWdlOiIgPDwgZW5kbCA8PCByZXNwb25zZSA8PCBlbmRsOworICAgICAgZm9yIChzb2FwX2RvbV9lbGVtZW50OjppdGVyYXRvciB3YWxrZXIgPSByZXNwb25zZS5maW5kKFNPQVBfVFlQRV94c2RfX2Zsb2F0KTsgd2Fsa2VyICE9IHJlc3BvbnNlLmVuZCgpOyArK3dhbGtlcikKKyAgICAgICAgY291dCA8PCAiUXVvdGUgPSAiIDw8ICooeHNkX19mbG9hdCopKCp3YWxrZXIpLm5vZGUgPDwgZW5kbDsKKyAgICB9CisgICAgc29hcF9kZXN0cm95KHNvYXApOworICAgIHNvYXBfZW5kKHNvYXApOworICAgIHNvYXBfZG9uZShzb2FwKTsKKyAgICBmcmVlKHNvYXApOworQGVuZGNvZGUKKworQHNlY3Rpb24gZG9tXzcgU3VtbWFyeQorCitUaGUgRE9NIHBhcnNlciBuZWVkcyBhIHNvYXAgY29udGV4dCB0byBhbGxvY2F0ZSBub2RlczoKKworQGNvZGUKKyAgICBzb2FwX2RvbV9lbGVtZW50IGRvbTsKKyAgICBkb20uc29hcCA9IHNvYXBfbmV3MSguLi4gZmxhZ3MgLi4uKTsKKyAgICAuLi4KKyAgICBzb2FwX2Rlc3Ryb3koZG9tLnNvYXApOworICAgIHNvYXBfZW5kKGRvbS5zb2FwKTsKKyAgICBzb2FwX2RvbmUoZG9tLnNvYXApOworICAgIHNvYXBfZnJlZShkb20uc29hcCk7CitAZW5kY29kZQorCitUaGUgbm9kZXMgYXJlIHJlbW92ZWQgd2l0aCBzb2FwX2Rlc3Ryb3kgKGZvciBDKyspIGFuZCBzb2FwX2VuZC4gVGhlIHNvYXBfZG9uZQorZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgdXNlZCBiZWZvcmUgdGhlIHNvYXAgY29udGV4dCBpcyBkZWFsbG9jYXRlZC4KKworVGhlIHNvYXAgY29udGV4dCBmbGFncyB0aGF0IGNvbnRyb2wgdGhlIHBhcnNpbmcgYW5kIHJlbmRpdGlvbiBvZiBYTUwgYXJlOgorCistIChubyBmbGFnKTogb25seSBlbGVtZW50cyB3aXRoIGFuIGlkIGF0dHJpYnV0ZSBhcmUgZGVzZXJpYWxpemVkIGFzIEMvQysrIGRhdGEKKyAgdHlwZXMgKHdoZW4gYSBkZXNlcmlhbGl6ZXIgaXMgYXZhaWxhYmxlKS4gWE1MIGVsZW1lbnRzIHdpdGggY2hhcmFjdGVyIGRhdGEKKyAgYXJlIGRlc2VyaWFsaXplZCBpbnRvIHRoZSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQ6OndpZGUgZmllbGQuCistIFNPQVBfQ19VVEZTVFJJTkc6IHN0b3JlIGNoYXJhY3RlciBkYXRhIGluIFVURi04IGZvcm1hdCBpbiBAcmVmCisgIHNvYXBfZG9tX2VsZW1lbnQ6OmRhdGEuCistIFNPQVBfQ19NQlNUUklORzogc3RvcmUgY2hhcmFjdGVyIGRhdGEgaW4gbXVsdGktYnl0ZSBmb3JtYXQgaW4gQHJlZgorICBzb2FwX2RvbV9lbGVtZW50OjpkYXRhLCB3aGVyZSB0aGUgZGVjb2RpbmcgZGVwZW5kcyBvbiB0aGUgY3VycmVudAorICBsb2NhbGljYXRpb24uIFRoZSBwbGF0Zm9ybSBtdXN0IHN1cHBvcnQgTUIgc3RyaW5ncyAoSEFWRV9NQlRPV0MpLgorLSBTT0FQX0RPTV9UUkVFOiBwcmV2ZW50cyBkZXNlcmlhbGl6YXRpb24gb2YgQy9DKysgZGF0YSBzdHJ1Y3R1cmVzIGludG8gdGhlCisgIERPTS4KKy0gU09BUF9ET01fTk9ERTogYXR0ZW1wdCB0byBkZXNlcmlhbGl6ZSBDL0MrKyBkYXRhIHN0cnVjdHVyZXMgd2hlbiBhCisgIGRlc2VyaWFsaXplciBpcyBhdmFpbGFibGUuIEEgZGVzZXJpYWxpemVyIGlzIHNlbGVjdGVkIGJhc2VkIG9uIHRoZSBlbGVtZW50CisgIG5hbWUgb3IgdGhlIHhzaTp0eXBlIGF0dHJpYnV0ZS4KKy0gU09BUF9ET01fQVNJUzogcmVuZGVyIFhNTCAiYXMgaXMiLCBpLmUuIGRvIG5vdCBpbnNlcnQgeG1sbnMgYmluZGluZ3MgZm9yIFVSSXMKKyAgc3RvcmVkIGluIG5zdHIuIEFzc3VtZXMgdGhlIERPTSBpcyBzZWxmLWNvbnRhaW5lZC4KKy0gU09BUF9YTUxfSU5ERU5UOiByZW5kZXIgWE1MIHdpdGggaW5kZW50LgorLSBTT0FQX1hNTF9DQU5PTklDQUw6IHJlbmRlciBYTUwgaW4gZXhjLWMxNG4gZm9ybS4KKworVGhlIERPTSB0cmF2ZXJzYWwgb3BlcmF0aW9uczoKKworLSBAcmVmIHNvYXBfZG9tX25leHRfZWxlbWVudCByZXR1cm5zIHRoZSBuZXh0IGVsZW1lbnQgaW4gYW4gaW4tb3JkZXIgdHJhdmVyc2FsLgorLSBAcmVmIHNvYXBfZG9tX25leHRfYXR0cmlidXRlIHJldHVybnMgdGhlIG5leHQgYXR0cmlidXRlIG9mIGEgbm9kZS4KKworVGhlIEByZWYgc29hcF9kb21fZWxlbWVudCBmaWVsZHM6CisKKy0gQHJlZiBzb2FwX2RvbV9lbGVtZW50OjpuZXh0IHBvaW50ZXIgdG8gbmV4dCBzaWJsaW5nIGluIGxpc3QuCistIEByZWYgc29hcF9kb21fZWxlbWVudDo6cHJudCBwb2ludGVyIHRvIHBhcmVudCBub2RlLgorLSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQ6OmVsdHMgcG9pbnRlciB0byBsaXN0IG9mIGNoaWxkIGVsZW1lbnQgbm9kZXMuCistIEByZWYgc29hcF9kb21fZWxlbWVudDo6YXR0cyBwb2ludGVyIHRvIGxpc3Qgb2YgYXR0cmlidXRlIG5vZGVzLgorLSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQ6Om5zdHIgb3B0aW9uYWwgbmFtZXNwYWNlIHN0cmluZyBvZiB0aGlzIG5vZGUuCistIEByZWYgc29hcF9kb21fZWxlbWVudDo6bmFtZSB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCBub2RlICh3aXRoIG9wdGlvbmFsCisgIHByZWZpeCkuCistIEByZWYgc29hcF9kb21fZWxlbWVudDo6ZGF0YSBvcHRpb25hbCBjaGFyYWN0ZXIgZGF0YSBpbiBVVEYtOCBmb3JtYXQuCistIEByZWYgc29hcF9kb21fZWxlbWVudDo6d2lkZSBvcHRpb25hbCBjaGFyYWN0ZXIgZGF0YSBpbiB3aWRlIHN0cmluZyBmb3JtYXQuCistIEByZWYgc29hcF9kb21fZWxlbWVudDo6dHlwZSBvcHRpb25hbCBTT0FQX1RZUEVfWCB0eXBlIG9mIGEgQy9DKysgZGF0YQorICBzdHJ1Y3R1cmUgc3RvcmVkIHdpdGggdGhpcyBub2RlLgorLSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQ6Om5vZGUgb3B0aW9uYWwgcG9pbnRlciB0byB0aGUgQy9DKysgZGF0YSBzdHJ1Y3R1cmUKKyAgc3RvcmVkIHdpdGggdGhpcyBub2RlLgorLSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQ6OmhlYWQgb3B0aW9uYWwgbGVhZGluZyB3aGl0ZXNwYWNlIHRvIHRoZSBzdGFydCB0YWcuCistIEByZWYgc29hcF9kb21fZWxlbWVudDo6dGFpbCBvcHRpb25hbCBsZWFkaW5nIHdoaXRlc3BhY2UgdG8gdGhlIGVuZCB0YWcuCistIEByZWYgc29hcF9kb21fZWxlbWVudDo6c29hcCB0aGUgc29hcCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIG5vZGUuCisKK1RoZSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQgdHlwZXM6CisKKy0gQHJlZiBzb2FwX2RvbV9lbGVtZW50OjppdGVyYXRvcgorCitUaGUgQHJlZiBzb2FwX2RvbV9lbGVtZW50IG1ldGhvZHM6CisKKy0gQHJlZiBzb2FwX2RvbV9lbGVtZW50OjpzZXQobnN0ciwgbmFtZSk7CistIEByZWYgc29hcF9kb21fZWxlbWVudDo6c2V0KGRhdGEpOworLSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQ6OnNldChub2RlLCB0eXBlKTsKKy0gQHJlZiBzb2FwX2RvbV9lbGVtZW50OjphZGQoc29hcF9kb21fZWxlbWVudCk7CistIEByZWYgc29hcF9kb21fZWxlbWVudDo6YWRkKHNvYXBfZG9tX2F0dHJpYnV0ZSk7CistIEByZWYgc29hcF9kb21fZWxlbWVudDo6YmVnaW4oKTsKKy0gQHJlZiBzb2FwX2RvbV9lbGVtZW50OjplbmQoKTsKKy0gQHJlZiBzb2FwX2RvbV9lbGVtZW50OjpmaW5kKG5zdHIsIG5hbWUpOworLSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQ6OmZpbmQodHlwZSk7CistIEByZWYgc29hcF9kb21fZWxlbWVudDo6dW5saW5rKCk7CisKK1RoZSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQgY29uc3RydWN0b3JzOgorCistIEByZWYgc29hcF9kb21fZWxlbWVudCgpOworLSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQoc29hcCk7CistIEByZWYgc29hcF9kb21fZWxlbWVudChzb2FwLCBuc3RyLCBuYW1lKTsKKy0gQHJlZiBzb2FwX2RvbV9lbGVtZW50KHNvYXAsIG5zdHIsIG5hbWUsIGRhdGEpOworLSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQoc29hcCwgbnN0ciwgbmFtZSwgbm9kZSwgdHlwZSk7CisKK1RoZSBAcmVmIHNvYXBfZG9tX2F0dHJpYnV0ZSBmaWVsZHM6CisKKy0gQHJlZiBzb2FwX2RvbV9hdHRyaWJ1dGU6Om5leHQgcG9pbnRlciB0byBuZXh0IGF0dHJpYnV0ZSBub2RlIGluIGxpc3QuCistIEByZWYgc29hcF9kb21fYXR0cmlidXRlOjpuc3RyIG9wdGlvbmFsIG5hbWVzcGFjZSBzdHJpbmcgb2YgdGhpcyBub2RlLgorLSBAcmVmIHNvYXBfZG9tX2F0dHJpYnV0ZTo6bmFtZSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlICh3aXRoIG9wdGlvbmFsCisgIHByZWZpeCkuCistIEByZWYgc29hcF9kb21fYXR0cmlidXRlOjpkYXRhIG9wdGlvbmFsIGNoYXJhY3RlciBkYXRhIGluIFVURi04IGZvcm1hdC4KKy0gQHJlZiBzb2FwX2RvbV9hdHRyaWJ1dGU6OnNvYXAgdGhlIHNvYXAgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBub2RlLgorCitUaGUgQHJlZiBzb2FwX2RvbV9hdHRyaWJ1dGUgdHlwZXM6CisKKy0gQHJlZiBzb2FwX2RvbV9hdHRyaWJ1dGU6Oml0ZXJhdG9yCisKK1RoZSBAcmVmIHNvYXBfZG9tX2F0dHJpYnV0ZSBtZXRob2RzOgorCistIEByZWYgc29hcF9kb21fYXR0cmlidXRlOjpzZXQobnN0ciwgbmFtZSk7CistIEByZWYgc29hcF9kb21fYXR0cmlidXRlOjpzZXQoZGF0YSk7CistIEByZWYgc29hcF9kb21fYXR0cmlidXRlOjpiZWdpbigpOworLSBAcmVmIHNvYXBfZG9tX2F0dHJpYnV0ZTo6ZW5kKCk7CistIEByZWYgc29hcF9kb21fYXR0cmlidXRlOjpmaW5kKG5zdHIsIG5hbWUpOworLSBAcmVmIHNvYXBfZG9tX2F0dHJpYnV0ZTo6dW5saW5rKCk7CisKK1RoZSBAcmVmIHNvYXBfZG9tX2F0dHJpYnV0ZSBjb25zdHJ1Y3RvcnM6CisKKy0gQHJlZiBzb2FwX2RvbV9hdHRyaWJ1dGUoKTsKKy0gQHJlZiBzb2FwX2RvbV9hdHRyaWJ1dGUoc29hcCk7CistIEByZWYgc29hcF9kb21fYXR0cmlidXRlKHNvYXAsIG5zdHIsIG5hbWUsIGRhdGEpOworCisqLworCisvLy8gQGJyaWVmIFRoZSBjdXN0b20gc2VyaWFsaXplciBmb3IgRE9NIG5vZGVzIGlzIHJlcHJlc2VudGVkIGJ5IHhzZF9fYW55VHlwZS4KK2V4dGVybiB0eXBlZGVmIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50IHhzZF9fYW55VHlwZTsKKwpkaWZmIC0tZ2l0IGEvaW1wb3J0L2RzLmggYi9pbXBvcnQvZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGE5ODYzCi0tLSAvZGV2L251bGwKKysrIGIvaW1wb3J0L2RzLmgKQEAgLTAsMCArMSwzNzMgQEAKKy8qCisKK2RzLmgKKworR2VuZXJhdGVkIHdpdGg6Cit3c2RsMmggLWN1eHkgLW8gZHMuaCAtdCBXUy9XUy10eXBlbWFwLmRhdCBXUy9kcy54c2QKKworLSBSZW1vdmVkIC8vZ3NvYXBvcHQKKy0gQWRkZWQgLy9nc29hcCBkcyAgICBzY2hlbWEgaW1wb3J0OiBodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjCisKKyovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBJbXBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBTY2hlbWEgTmFtZXNwYWNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvL2dzb2FwIGRzICAgIHNjaGVtYSBpbXBvcnQ6CWh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMKKy8vZ3NvYXAgZHMgICAgc2NoZW1hIGVsZW1lbnRGb3JtOglxdWFsaWZpZWQKKy8vZ3NvYXAgZHMgICAgc2NoZW1hIGF0dHJpYnV0ZUZvcm06CXVucXVhbGlmaWVkCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBTY2hlbWEgVHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKworLy8vIEltcG9ydGVkIGNvbXBsZXhUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpTaWduYXR1cmVUeXBlIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4KK3R5cGVkZWYgc3RydWN0IGRzX19TaWduYXR1cmVUeXBlCit7CXN0cnVjdCBkc19fU2lnbmVkSW5mb1R5cGUqCQlTaWduZWRJbmZvOworCWNoYXIqCQkJCQlTaWduYXR1cmVWYWx1ZTsKKwlzdHJ1Y3QgZHNfX0tleUluZm9UeXBlKgkJCUtleUluZm87CisJQGNoYXIqCQkJCQlJZDsKK30gZHNfX1NpZ25hdHVyZVR5cGU7CisKKy8vLyBJbXBvcnRlZCBjb21wbGV4VHlwZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6U2lnbmF0dXJlVmFsdWVUeXBlIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4KKy8vLyBjb21wbGV4VHlwZSBkZWZpbml0aW9uIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4KKworLy8vIFR5cGVkZWYgc3lub255bSBmb3Igc3RydWN0IGRzX19TaWduZWRJbmZvVHlwZS4KK3R5cGVkZWYgc3RydWN0IGRzX19TaWduZWRJbmZvVHlwZSBkc19fU2lnbmVkSW5mb1R5cGU7CisKKy8vLyBUeXBlZGVmIHN5bm9ueW0gZm9yIHN0cnVjdCBkc19fQ2Fub25pY2FsaXphdGlvbk1ldGhvZFR5cGUuCit0eXBlZGVmIHN0cnVjdCBkc19fQ2Fub25pY2FsaXphdGlvbk1ldGhvZFR5cGUgZHNfX0Nhbm9uaWNhbGl6YXRpb25NZXRob2RUeXBlOworCisvLy8gVHlwZWRlZiBzeW5vbnltIGZvciBzdHJ1Y3QgZHNfX1NpZ25hdHVyZU1ldGhvZFR5cGUuCit0eXBlZGVmIHN0cnVjdCBkc19fU2lnbmF0dXJlTWV0aG9kVHlwZSBkc19fU2lnbmF0dXJlTWV0aG9kVHlwZTsKKworLy8vIFR5cGVkZWYgc3lub255bSBmb3Igc3RydWN0IGRzX19SZWZlcmVuY2VUeXBlLgordHlwZWRlZiBzdHJ1Y3QgZHNfX1JlZmVyZW5jZVR5cGUgZHNfX1JlZmVyZW5jZVR5cGU7CisKKy8vLyBUeXBlZGVmIHN5bm9ueW0gZm9yIHN0cnVjdCBkc19fVHJhbnNmb3Jtc1R5cGUuCit0eXBlZGVmIHN0cnVjdCBkc19fVHJhbnNmb3Jtc1R5cGUgZHNfX1RyYW5zZm9ybXNUeXBlOworCisvLy8gSW1wb3J0ZWQgY29tcGxleFR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlRyYW5zZm9ybVR5cGUgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LgorI2ltcG9ydCAiYzE0bi5oIgordHlwZWRlZiBzdHJ1Y3QgZHNfX1RyYW5zZm9ybVR5cGUKK3sJX2MxNG5fX0luY2x1c2l2ZU5hbWVzcGFjZXMqICAgICAgICAgICAgIGMxNG5fX0luY2x1c2l2ZU5hbWVzcGFjZXM7CisJX1hNTAkJCQkJX19hbnk7CisJQGNoYXIqCQkJCQlBbGdvcml0aG07Cit9IGRzX19UcmFuc2Zvcm1UeXBlOworCisvLy8gVHlwZWRlZiBzeW5vbnltIGZvciBzdHJ1Y3QgZHNfX0RpZ2VzdE1ldGhvZFR5cGUuCit0eXBlZGVmIHN0cnVjdCBkc19fRGlnZXN0TWV0aG9kVHlwZSBkc19fRGlnZXN0TWV0aG9kVHlwZTsKKworLy8vIEltcG9ydGVkIGNvbXBsZXhUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpLZXlJbmZvVHlwZSBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuCit0eXBlZGVmIHN0cnVjdCBkc19fS2V5SW5mb1R5cGUKK3sJY2hhcioJCQkJCUtleU5hbWU7CisJc3RydWN0IGRzX19LZXlWYWx1ZVR5cGUqCQlLZXlWYWx1ZTsKKwlzdHJ1Y3QgZHNfX1JldHJpZXZhbE1ldGhvZFR5cGUqCQlSZXRyaWV2YWxNZXRob2Q7CisJc3RydWN0IGRzX19YNTA5RGF0YVR5cGUqCQlYNTA5RGF0YTsKKwlzdHJ1Y3QgX3dzc2VfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2UqCXdzc2VfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2U7CisJQGNoYXIqCQkJCQlJZDsKK30gZHNfX0tleUluZm9UeXBlOworCisvLy8gVHlwZWRlZiBzeW5vbnltIGZvciBzdHJ1Y3QgZHNfX0tleVZhbHVlVHlwZS4KK3R5cGVkZWYgc3RydWN0IGRzX19LZXlWYWx1ZVR5cGUgZHNfX0tleVZhbHVlVHlwZTsKKworLy8vIFR5cGVkZWYgc3lub255bSBmb3Igc3RydWN0IGRzX19SZXRyaWV2YWxNZXRob2RUeXBlLgordHlwZWRlZiBzdHJ1Y3QgZHNfX1JldHJpZXZhbE1ldGhvZFR5cGUgZHNfX1JldHJpZXZhbE1ldGhvZFR5cGU7CisKKy8vLyBUeXBlZGVmIHN5bm9ueW0gZm9yIHN0cnVjdCBkc19fWDUwOURhdGFUeXBlLgordHlwZWRlZiBzdHJ1Y3QgZHNfX1g1MDlEYXRhVHlwZSBkc19fWDUwOURhdGFUeXBlOworCisvLy8gVHlwZWRlZiBzeW5vbnltIGZvciBzdHJ1Y3QgZHNfX1g1MDlJc3N1ZXJTZXJpYWxUeXBlLgordHlwZWRlZiBzdHJ1Y3QgZHNfX1g1MDlJc3N1ZXJTZXJpYWxUeXBlIGRzX19YNTA5SXNzdWVyU2VyaWFsVHlwZTsKKworLy8vIEltcG9ydGVkIGNvbXBsZXhUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpQR1BEYXRhVHlwZSBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuCisvLy8gY29tcGxleFR5cGUgZGVmaW5pdGlvbiBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsuCisKKy8vLyBJbXBvcnRlZCBjb21wbGV4VHlwZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6U1BLSURhdGFUeXBlIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4KKy8vLyBjb21wbGV4VHlwZSBkZWZpbml0aW9uIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4KKworLy8vIEltcG9ydGVkIGNvbXBsZXhUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpPYmplY3RUeXBlIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4KKy8vLyBjb21wbGV4VHlwZSBkZWZpbml0aW9uIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4KKworLy8vIEltcG9ydGVkIGNvbXBsZXhUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpNYW5pZmVzdFR5cGUgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LgorLy8vIGNvbXBsZXhUeXBlIGRlZmluaXRpb24gaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rLgorCisvLy8gSW1wb3J0ZWQgY29tcGxleFR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlNpZ25hdHVyZVByb3BlcnRpZXNUeXBlIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4KKy8vLyBjb21wbGV4VHlwZSBkZWZpbml0aW9uIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4KKworLy8vIEltcG9ydGVkIGNvbXBsZXhUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpTaWduYXR1cmVQcm9wZXJ0eVR5cGUgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LgorLy8vIGNvbXBsZXhUeXBlIGRlZmluaXRpb24gaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rLgorCisvLy8gVHlwZWRlZiBzeW5vbnltIGZvciBzdHJ1Y3QgZHNfX0RTQUtleVZhbHVlVHlwZS4KK3R5cGVkZWYgc3RydWN0IGRzX19EU0FLZXlWYWx1ZVR5cGUgZHNfX0RTQUtleVZhbHVlVHlwZTsKKworLy8vIFR5cGVkZWYgc3lub255bSBmb3Igc3RydWN0IGRzX19SU0FLZXlWYWx1ZVR5cGUuCit0eXBlZGVmIHN0cnVjdCBkc19fUlNBS2V5VmFsdWVUeXBlIGRzX19SU0FLZXlWYWx1ZVR5cGU7CisKKy8vLyBJbXBvcnRlZCBzaW1wbGVUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpDcnlwdG9CaW5hcnkgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LgorLy8vIHNpbXBsZVR5cGUgZGVmaW5pdGlvbiBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsuCisKKy8vLyBJbXBvcnRlZCBzaW1wbGVUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpEaWdlc3RWYWx1ZVR5cGUgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LgorLy8vIHNpbXBsZVR5cGUgZGVmaW5pdGlvbiBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsuCisKKy8vLyBJbXBvcnRlZCBzaW1wbGVUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpITUFDT3V0cHV0TGVuZ3RoVHlwZSBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuCisvLy8gc2ltcGxlVHlwZSBkZWZpbml0aW9uIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4KKworLy8vICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpTaWduZWRJbmZvVHlwZSBpcyBhIGNvbXBsZXhUeXBlLgorc3RydWN0IGRzX19TaWduZWRJbmZvVHlwZQoreworLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpDYW5vbmljYWxpemF0aW9uTWV0aG9kLgorICAgIHN0cnVjdCBkc19fQ2Fub25pY2FsaXphdGlvbk1ldGhvZFR5cGUqICBDYW5vbmljYWxpemF0aW9uTWV0aG9kICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50LgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpTaWduYXR1cmVNZXRob2QuCisgICAgc3RydWN0IGRzX19TaWduYXR1cmVNZXRob2RUeXBlKiAgICAgIFNpZ25hdHVyZU1ldGhvZCAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQuCisvLy8gU2l6ZSBvZiB0aGUgZHluYW1pYyBhcnJheSBvZiBzdHJ1Y3QgZHNfX1JlZmVyZW5jZVR5cGUqIGlzIDAuLnVuYm91bmRlZAorICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3NpemVSZWZlcmVuY2UgICAgICAgICAgICAgICA7CisvLy8gUG9pbnRlciB0byBhcnJheSBvZiBzdHJ1Y3QgZHNfX1JlZmVyZW5jZVR5cGUqLgorICAgIHN0cnVjdCBkc19fUmVmZXJlbmNlVHlwZSogICAgICAgICAgICpSZWZlcmVuY2UgICAgICAgICAgICAgICAgICAgICAgMTsKKy8vLyBBdHRyaWJ1dGUgSWQgb2YgdHlwZSB4czpJRC4KKyAgIEBjaGFyKiAvKklEKi8gICAgICAgICAgICAgICAgICAgICAgICAgSWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlLgorfTsKKworLy8vICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpDYW5vbmljYWxpemF0aW9uTWV0aG9kVHlwZSBpcyBhIGNvbXBsZXhUeXBlLgorc3RydWN0IGRzX19DYW5vbmljYWxpemF0aW9uTWV0aG9kVHlwZQoreworLy8vIFRPRE86IDxhbnkgbmFtZXNwYWNlPSIjI2FueSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisvLy8gICAgICAgU2NoZW1hIGV4dGVuc2liaWxpdHkgaXMgdXNlci1kZWZpbmFibGUuCisvLy8gICAgICAgQ29uc3VsdCB0aGUgcHJvdG9jb2wgZG9jdW1lbnRhdGlvbiB0byBjaGFuZ2UgYW5kL29yIGluc2VydCBkZWNsYXJhdGlvbnMuCisvLy8gICAgICAgVXNlIHdzZGwyaCBvcHRpb24gLXggdG8gcmVtb3ZlIHRoaXMgZWxlbWVudC4KKy8vLyBBdHRyaWJ1dGUgQWxnb3JpdGhtIG9mIHR5cGUgeHM6YW55VVJJLgorICAgQGNoYXIqIC8qVVJJKi8gICAgICAgICAgICAgICAgICAgICAgICBBbGdvcml0aG0gICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUuCisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIFdTL1dTLXR5cGVtYXAuZGF0CisgICBfYzE0bl9fSW5jbHVzaXZlTmFtZXNwYWNlcyoJCWMxNG5fX0luY2x1c2l2ZU5hbWVzcGFjZXM7Cit9OworCisvLy8gImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlNpZ25hdHVyZU1ldGhvZFR5cGUgaXMgYSBjb21wbGV4VHlwZS4KK3N0cnVjdCBkc19fU2lnbmF0dXJlTWV0aG9kVHlwZQoreworLy8vIEVsZW1lbnQgSE1BQ091dHB1dExlbmd0aCBvZiB0eXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpITUFDT3V0cHV0TGVuZ3RoVHlwZS4KKyAgICBpbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSE1BQ091dHB1dExlbmd0aCAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudC4KKy8vLyBUT0RPOiA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisvLy8gICAgICAgU2NoZW1hIGV4dGVuc2liaWxpdHkgaXMgdXNlci1kZWZpbmFibGUuCisvLy8gICAgICAgQ29uc3VsdCB0aGUgcHJvdG9jb2wgZG9jdW1lbnRhdGlvbiB0byBjaGFuZ2UgYW5kL29yIGluc2VydCBkZWNsYXJhdGlvbnMuCisvLy8gICAgICAgVXNlIHdzZGwyaCBvcHRpb24gLXggdG8gcmVtb3ZlIHRoaXMgZWxlbWVudC4KKy8vLyBBdHRyaWJ1dGUgQWxnb3JpdGhtIG9mIHR5cGUgeHM6YW55VVJJLgorICAgQGNoYXIqIC8qVVJJKi8gICAgICAgICAgICAgICAgICAgICAgICBBbGdvcml0aG0gICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUuCit9OworCisvLy8gImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlJlZmVyZW5jZVR5cGUgaXMgYSBjb21wbGV4VHlwZS4KK3N0cnVjdCBkc19fUmVmZXJlbmNlVHlwZQoreworLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpUcmFuc2Zvcm1zLgorICAgIHN0cnVjdCBkc19fVHJhbnNmb3Jtc1R5cGUqICAgICAgICAgICBUcmFuc2Zvcm1zICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50LgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpEaWdlc3RNZXRob2QuCisgICAgc3RydWN0IGRzX19EaWdlc3RNZXRob2RUeXBlKiAgICAgICAgIERpZ2VzdE1ldGhvZCAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQuCisvLy8gRWxlbWVudCByZWZlcmVuY2UgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOkRpZ2VzdFZhbHVlLgorICAgIGNoYXIqIC8qYmFzZTY0Ki8gICAgICAgICAgICAgICAgICAgICBEaWdlc3RWYWx1ZSAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50LgorLy8vIEF0dHJpYnV0ZSBJZCBvZiB0eXBlIHhzOklELgorICAgQGNoYXIqIC8qSUQqLyAgICAgICAgICAgICAgICAgICAgICAgICBJZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUuCisvLy8gQXR0cmlidXRlIFVSSSBvZiB0eXBlIHhzOmFueVVSSS4KKyAgIEBjaGFyKiAvKlVSSSovICAgICAgICAgICAgICAgICAgICAgICAgVVJJICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlLgorLy8vIEF0dHJpYnV0ZSBUeXBlIG9mIHR5cGUgeHM6YW55VVJJLgorICAgQGNoYXIqIC8qVVJJKi8gICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUuCit9OworCisvLy8gImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlRyYW5zZm9ybXNUeXBlIGlzIGEgY29tcGxleFR5cGUuCitzdHJ1Y3QgZHNfX1RyYW5zZm9ybXNUeXBlCit7CisvLy8gU2l6ZSBvZiB0aGUgZHluYW1pYyBhcnJheSBvZiBkc19fVHJhbnNmb3JtVHlwZSBpcyAwLi51bmJvdW5kZWQKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zaXplVHJhbnNmb3JtICAgICAgICAgICAgICAgOworLy8vIFBvaW50ZXIgdG8gYXJyYXkgb2YgZHNfX1RyYW5zZm9ybVR5cGUuCisgICAgZHNfX1RyYW5zZm9ybVR5cGUgICAgICAgICAgICAgICAgICAgKlRyYW5zZm9ybSAgICAgICAgICAgICAgICAgICAgICAxOworfTsKKworLy8vICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpEaWdlc3RNZXRob2RUeXBlIGlzIGEgY29tcGxleFR5cGUuCitzdHJ1Y3QgZHNfX0RpZ2VzdE1ldGhvZFR5cGUKK3sKKy8vLyBUT0RPOiA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisvLy8gICAgICAgU2NoZW1hIGV4dGVuc2liaWxpdHkgaXMgdXNlci1kZWZpbmFibGUuCisvLy8gICAgICAgQ29uc3VsdCB0aGUgcHJvdG9jb2wgZG9jdW1lbnRhdGlvbiB0byBjaGFuZ2UgYW5kL29yIGluc2VydCBkZWNsYXJhdGlvbnMuCisvLy8gICAgICAgVXNlIHdzZGwyaCBvcHRpb24gLXggdG8gcmVtb3ZlIHRoaXMgZWxlbWVudC4KKy8vLyBBdHRyaWJ1dGUgQWxnb3JpdGhtIG9mIHR5cGUgeHM6YW55VVJJLgorICAgQGNoYXIqIC8qVVJJKi8gICAgICAgICAgICAgICAgICAgICAgICBBbGdvcml0aG0gICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUuCit9OworCisvLy8gImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOktleVZhbHVlVHlwZSBpcyBhIGNvbXBsZXhUeXBlLgorc3RydWN0IGRzX19LZXlWYWx1ZVR5cGUKK3sKKy8vLyBDSE9JQ0UgT0YgRUxFTUVOVFMgPGNob2ljZT4KKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6RFNBS2V5VmFsdWUuCisgICAgc3RydWN0IGRzX19EU0FLZXlWYWx1ZVR5cGUqICAgICAgICAgIERTQUtleVZhbHVlICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQuCisvLy8gRWxlbWVudCByZWZlcmVuY2UgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlJTQUtleVZhbHVlLgorICAgIHN0cnVjdCBkc19fUlNBS2V5VmFsdWVUeXBlKiAgICAgICAgICBSU0FLZXlWYWx1ZSAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50LgorLy8vIFRPRE86IDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIj4KKy8vLyAgICAgICBTY2hlbWEgZXh0ZW5zaWJpbGl0eSBpcyB1c2VyLWRlZmluYWJsZS4KKy8vLyAgICAgICBDb25zdWx0IHRoZSBwcm90b2NvbCBkb2N1bWVudGF0aW9uIHRvIGNoYW5nZSBhbmQvb3IgaW5zZXJ0IGRlY2xhcmF0aW9ucy4KKy8vLyAgICAgICBVc2Ugd3NkbDJoIG9wdGlvbiAteCB0byByZW1vdmUgdGhpcyBlbGVtZW50LgorCisvLyAgRU5EIE9GIENIT0lDRQorfTsKKworLy8vICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpSZXRyaWV2YWxNZXRob2RUeXBlIGlzIGEgY29tcGxleFR5cGUuCitzdHJ1Y3QgZHNfX1JldHJpZXZhbE1ldGhvZFR5cGUKK3sKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6VHJhbnNmb3Jtcy4KKyAgICBzdHJ1Y3QgZHNfX1RyYW5zZm9ybXNUeXBlKiAgICAgICAgICAgVHJhbnNmb3JtcyAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudC4KKy8vLyBBdHRyaWJ1dGUgVVJJIG9mIHR5cGUgeHM6YW55VVJJLgorICAgQGNoYXIqIC8qVVJJKi8gICAgICAgICAgICAgICAgICAgICAgICBVUkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUuCisvLy8gQXR0cmlidXRlIFR5cGUgb2YgdHlwZSB4czphbnlVUkkuCisgICBAY2hhciogLypVUkkqLyAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZS4KK307CisKKy8vLyAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6WDUwOURhdGFUeXBlIGlzIGEgY29tcGxleFR5cGUuCitzdHJ1Y3QgZHNfX1g1MDlEYXRhVHlwZQoreworLy8vIENIT0lDRSBPRiBFTEVNRU5UUyA8Y2hvaWNlPgorLy8vIEVsZW1lbnQgWDUwOUlzc3VlclNlcmlhbCBvZiB0eXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpYNTA5SXNzdWVyU2VyaWFsVHlwZS4KKyAgICBzdHJ1Y3QgZHNfX1g1MDlJc3N1ZXJTZXJpYWxUeXBlKiAgICAgWDUwOUlzc3VlclNlcmlhbCAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudC4KKy8vLyBFbGVtZW50IFg1MDlTS0kgb2YgdHlwZSB4czpiYXNlNjRCaW5hcnkuCisgICAgY2hhciogLypiYXNlNjQqLyAgICAgICAgICAgICAgICAgICAgIFg1MDlTS0kgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQuCisvLy8gRWxlbWVudCBYNTA5U3ViamVjdE5hbWUgb2YgdHlwZSB4czpzdHJpbmcuCisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlTdWJqZWN0TmFtZSAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQuCisvLy8gRWxlbWVudCBYNTA5Q2VydGlmaWNhdGUgb2YgdHlwZSB4czpiYXNlNjRCaW5hcnkuCisgICAgY2hhciogLypiYXNlNjQqLyAgICAgICAgICAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQuCisvLy8gRWxlbWVudCBYNTA5Q1JMIG9mIHR5cGUgeHM6YmFzZTY0QmluYXJ5LgorICAgIGNoYXIqIC8qYmFzZTY0Ki8gICAgICAgICAgICAgICAgICAgICBYNTA5Q1JMICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50LgorLy8vIFRPRE86IDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIj4KKy8vLyAgICAgICBTY2hlbWEgZXh0ZW5zaWJpbGl0eSBpcyB1c2VyLWRlZmluYWJsZS4KKy8vLyAgICAgICBDb25zdWx0IHRoZSBwcm90b2NvbCBkb2N1bWVudGF0aW9uIHRvIGNoYW5nZSBhbmQvb3IgaW5zZXJ0IGRlY2xhcmF0aW9ucy4KKy8vLyAgICAgICBVc2Ugd3NkbDJoIG9wdGlvbiAteCB0byByZW1vdmUgdGhpcyBlbGVtZW50LgorCisvLyAgRU5EIE9GIENIT0lDRQorfTsKKworLy8vICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpYNTA5SXNzdWVyU2VyaWFsVHlwZSBpcyBhIGNvbXBsZXhUeXBlLgorc3RydWN0IGRzX19YNTA5SXNzdWVyU2VyaWFsVHlwZQoreworLy8vIEVsZW1lbnQgWDUwOUlzc3Vlck5hbWUgb2YgdHlwZSB4czpzdHJpbmcuCisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlJc3N1ZXJOYW1lICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQuCisvLy8gRWxlbWVudCBYNTA5U2VyaWFsTnVtYmVyIG9mIHR5cGUgeHM6aW50ZWdlci4KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDUwOVNlcmlhbE51bWJlciAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudC4KK307CisKKy8vLyAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6RFNBS2V5VmFsdWVUeXBlIGlzIGEgY29tcGxleFR5cGUuCitzdHJ1Y3QgZHNfX0RTQUtleVZhbHVlVHlwZQoreworLy8vIEVsZW1lbnQgRyBvZiB0eXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpDcnlwdG9CaW5hcnkuCisgICAgY2hhciogLypiYXNlNjQqLyAgICAgICAgICAgICAgICAgICAgIEcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQuCisvLy8gRWxlbWVudCBZIG9mIHR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOkNyeXB0b0JpbmFyeS4KKyAgICBjaGFyKiAvKmJhc2U2NCovICAgICAgICAgICAgICAgICAgICAgWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudC4KKy8vLyBFbGVtZW50IEogb2YgdHlwZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6Q3J5cHRvQmluYXJ5LgorICAgIGNoYXIqIC8qYmFzZTY0Ki8gICAgICAgICAgICAgICAgICAgICBKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50LgorLy8vIEVsZW1lbnQgUCBvZiB0eXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpDcnlwdG9CaW5hcnkuCisgICAgY2hhciogLypiYXNlNjQqLyAgICAgICAgICAgICAgICAgICAgIFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQuCisvLy8gRWxlbWVudCBRIG9mIHR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOkNyeXB0b0JpbmFyeS4KKyAgICBjaGFyKiAvKmJhc2U2NCovICAgICAgICAgICAgICAgICAgICAgUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudC4KKy8vLyBFbGVtZW50IFNlZWQgb2YgdHlwZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6Q3J5cHRvQmluYXJ5LgorICAgIGNoYXIqIC8qYmFzZTY0Ki8gICAgICAgICAgICAgICAgICAgICBTZWVkICAgICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50LgorLy8vIEVsZW1lbnQgUGdlbkNvdW50ZXIgb2YgdHlwZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6Q3J5cHRvQmluYXJ5LgorICAgIGNoYXIqIC8qYmFzZTY0Ki8gICAgICAgICAgICAgICAgICAgICBQZ2VuQ291bnRlciAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50LgorfTsKKworLy8vICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpSU0FLZXlWYWx1ZVR5cGUgaXMgYSBjb21wbGV4VHlwZS4KK3N0cnVjdCBkc19fUlNBS2V5VmFsdWVUeXBlCit7CisvLy8gRWxlbWVudCBNb2R1bHVzIG9mIHR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOkNyeXB0b0JpbmFyeS4KKyAgICBjaGFyKiAvKmJhc2U2NCovICAgICAgICAgICAgICAgICAgICAgTW9kdWx1cyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudC4KKy8vLyBFbGVtZW50IEV4cG9uZW50IG9mIHR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOkNyeXB0b0JpbmFyeS4KKyAgICBjaGFyKiAvKmJhc2U2NCovICAgICAgICAgICAgICAgICAgICAgRXhwb25lbnQgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudC4KK307CisKKy8vLyBFbGVtZW50ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpTaWduYXR1cmUgb2YgY29tcGxleFR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlNpZ25hdHVyZVR5cGUuCisvLy8gTm90ZTogdXNlIHdzZGwyaCBvcHRpb24gLWcgdG8gZ2VuZXJhdGUgdGhpcyBnbG9iYWwgZWxlbWVudCBkZWNsYXJhdGlvbi4KKworLy8vIEVsZW1lbnQgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlNpZ25hdHVyZVZhbHVlIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpTaWduYXR1cmVWYWx1ZVR5cGUuCisvLy8gTm90ZTogdXNlIHdzZGwyaCBvcHRpb24gLWcgdG8gZ2VuZXJhdGUgdGhpcyBnbG9iYWwgZWxlbWVudCBkZWNsYXJhdGlvbi4KKworLy8vIEVsZW1lbnQgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlNpZ25lZEluZm8gb2YgY29tcGxleFR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlNpZ25lZEluZm9UeXBlLgorLy8vIE5vdGU6IHVzZSB3c2RsMmggb3B0aW9uIC1nIHRvIGdlbmVyYXRlIHRoaXMgZ2xvYmFsIGVsZW1lbnQgZGVjbGFyYXRpb24uCisKKy8vLyBFbGVtZW50ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpDYW5vbmljYWxpemF0aW9uTWV0aG9kIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpDYW5vbmljYWxpemF0aW9uTWV0aG9kVHlwZS4KKy8vLyBOb3RlOiB1c2Ugd3NkbDJoIG9wdGlvbiAtZyB0byBnZW5lcmF0ZSB0aGlzIGdsb2JhbCBlbGVtZW50IGRlY2xhcmF0aW9uLgorCisvLy8gRWxlbWVudCAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6U2lnbmF0dXJlTWV0aG9kIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpTaWduYXR1cmVNZXRob2RUeXBlLgorLy8vIE5vdGU6IHVzZSB3c2RsMmggb3B0aW9uIC1nIHRvIGdlbmVyYXRlIHRoaXMgZ2xvYmFsIGVsZW1lbnQgZGVjbGFyYXRpb24uCisKKy8vLyBFbGVtZW50ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpSZWZlcmVuY2Ugb2YgY29tcGxleFR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlJlZmVyZW5jZVR5cGUuCisvLy8gTm90ZTogdXNlIHdzZGwyaCBvcHRpb24gLWcgdG8gZ2VuZXJhdGUgdGhpcyBnbG9iYWwgZWxlbWVudCBkZWNsYXJhdGlvbi4KKworLy8vIEVsZW1lbnQgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlRyYW5zZm9ybXMgb2YgY29tcGxleFR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlRyYW5zZm9ybXNUeXBlLgorLy8vIE5vdGU6IHVzZSB3c2RsMmggb3B0aW9uIC1nIHRvIGdlbmVyYXRlIHRoaXMgZ2xvYmFsIGVsZW1lbnQgZGVjbGFyYXRpb24uCisKKy8vLyBFbGVtZW50ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpUcmFuc2Zvcm0gb2YgY29tcGxleFR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlRyYW5zZm9ybVR5cGUuCisvLy8gTm90ZTogdXNlIHdzZGwyaCBvcHRpb24gLWcgdG8gZ2VuZXJhdGUgdGhpcyBnbG9iYWwgZWxlbWVudCBkZWNsYXJhdGlvbi4KKworLy8vIEVsZW1lbnQgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOkRpZ2VzdE1ldGhvZCBvZiBjb21wbGV4VHlwZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6RGlnZXN0TWV0aG9kVHlwZS4KKy8vLyBOb3RlOiB1c2Ugd3NkbDJoIG9wdGlvbiAtZyB0byBnZW5lcmF0ZSB0aGlzIGdsb2JhbCBlbGVtZW50IGRlY2xhcmF0aW9uLgorCisvLy8gRWxlbWVudCAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6RGlnZXN0VmFsdWUgb2YgY29tcGxleFR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOkRpZ2VzdFZhbHVlVHlwZS4KKy8vLyBOb3RlOiB1c2Ugd3NkbDJoIG9wdGlvbiAtZyB0byBnZW5lcmF0ZSB0aGlzIGdsb2JhbCBlbGVtZW50IGRlY2xhcmF0aW9uLgorCisvLy8gRWxlbWVudCAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6S2V5SW5mbyBvZiBjb21wbGV4VHlwZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6S2V5SW5mb1R5cGUuCisvLy8gTm90ZTogdXNlIHdzZGwyaCBvcHRpb24gLWcgdG8gZ2VuZXJhdGUgdGhpcyBnbG9iYWwgZWxlbWVudCBkZWNsYXJhdGlvbi4KKworLy8vIEVsZW1lbnQgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOktleU5hbWUgb2YgY29tcGxleFR5cGUgeHM6c3RyaW5nLgorLy8vIE5vdGU6IHVzZSB3c2RsMmggb3B0aW9uIC1nIHRvIGdlbmVyYXRlIHRoaXMgZ2xvYmFsIGVsZW1lbnQgZGVjbGFyYXRpb24uCisKKy8vLyBFbGVtZW50ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpNZ210RGF0YSBvZiBjb21wbGV4VHlwZSB4czpzdHJpbmcuCisvLy8gTm90ZTogdXNlIHdzZGwyaCBvcHRpb24gLWcgdG8gZ2VuZXJhdGUgdGhpcyBnbG9iYWwgZWxlbWVudCBkZWNsYXJhdGlvbi4KKworLy8vIEVsZW1lbnQgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOktleVZhbHVlIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpLZXlWYWx1ZVR5cGUuCisvLy8gTm90ZTogdXNlIHdzZGwyaCBvcHRpb24gLWcgdG8gZ2VuZXJhdGUgdGhpcyBnbG9iYWwgZWxlbWVudCBkZWNsYXJhdGlvbi4KKworLy8vIEVsZW1lbnQgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlJldHJpZXZhbE1ldGhvZCBvZiBjb21wbGV4VHlwZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6UmV0cmlldmFsTWV0aG9kVHlwZS4KKy8vLyBOb3RlOiB1c2Ugd3NkbDJoIG9wdGlvbiAtZyB0byBnZW5lcmF0ZSB0aGlzIGdsb2JhbCBlbGVtZW50IGRlY2xhcmF0aW9uLgorCisvLy8gRWxlbWVudCAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6WDUwOURhdGEgb2YgY29tcGxleFR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlg1MDlEYXRhVHlwZS4KKy8vLyBOb3RlOiB1c2Ugd3NkbDJoIG9wdGlvbiAtZyB0byBnZW5lcmF0ZSB0aGlzIGdsb2JhbCBlbGVtZW50IGRlY2xhcmF0aW9uLgorCisvLy8gRWxlbWVudCAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6UEdQRGF0YSBvZiBjb21wbGV4VHlwZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6UEdQRGF0YVR5cGUuCisvLy8gTm90ZTogdXNlIHdzZGwyaCBvcHRpb24gLWcgdG8gZ2VuZXJhdGUgdGhpcyBnbG9iYWwgZWxlbWVudCBkZWNsYXJhdGlvbi4KKworLy8vIEVsZW1lbnQgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlNQS0lEYXRhIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpTUEtJRGF0YVR5cGUuCisvLy8gTm90ZTogdXNlIHdzZGwyaCBvcHRpb24gLWcgdG8gZ2VuZXJhdGUgdGhpcyBnbG9iYWwgZWxlbWVudCBkZWNsYXJhdGlvbi4KKworLy8vIEVsZW1lbnQgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOk9iamVjdCBvZiBjb21wbGV4VHlwZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6T2JqZWN0VHlwZS4KKy8vLyBOb3RlOiB1c2Ugd3NkbDJoIG9wdGlvbiAtZyB0byBnZW5lcmF0ZSB0aGlzIGdsb2JhbCBlbGVtZW50IGRlY2xhcmF0aW9uLgorCisvLy8gRWxlbWVudCAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6TWFuaWZlc3Qgb2YgY29tcGxleFR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOk1hbmlmZXN0VHlwZS4KKy8vLyBOb3RlOiB1c2Ugd3NkbDJoIG9wdGlvbiAtZyB0byBnZW5lcmF0ZSB0aGlzIGdsb2JhbCBlbGVtZW50IGRlY2xhcmF0aW9uLgorCisvLy8gRWxlbWVudCAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6U2lnbmF0dXJlUHJvcGVydGllcyBvZiBjb21wbGV4VHlwZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6U2lnbmF0dXJlUHJvcGVydGllc1R5cGUuCisvLy8gTm90ZTogdXNlIHdzZGwyaCBvcHRpb24gLWcgdG8gZ2VuZXJhdGUgdGhpcyBnbG9iYWwgZWxlbWVudCBkZWNsYXJhdGlvbi4KKworLy8vIEVsZW1lbnQgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlNpZ25hdHVyZVByb3BlcnR5IG9mIGNvbXBsZXhUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpTaWduYXR1cmVQcm9wZXJ0eVR5cGUuCisvLy8gTm90ZTogdXNlIHdzZGwyaCBvcHRpb24gLWcgdG8gZ2VuZXJhdGUgdGhpcyBnbG9iYWwgZWxlbWVudCBkZWNsYXJhdGlvbi4KKworLy8vIEVsZW1lbnQgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOkRTQUtleVZhbHVlIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpEU0FLZXlWYWx1ZVR5cGUuCisvLy8gTm90ZTogdXNlIHdzZGwyaCBvcHRpb24gLWcgdG8gZ2VuZXJhdGUgdGhpcyBnbG9iYWwgZWxlbWVudCBkZWNsYXJhdGlvbi4KKworLy8vIEVsZW1lbnQgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlJTQUtleVZhbHVlIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpSU0FLZXlWYWx1ZVR5cGUuCisvLy8gTm90ZTogdXNlIHdzZGwyaCBvcHRpb24gLWcgdG8gZ2VuZXJhdGUgdGhpcyBnbG9iYWwgZWxlbWVudCBkZWNsYXJhdGlvbi4KKworLyogRW5kIG9mIGRzLmggKi8KZGlmZiAtLWdpdCBhL2ltcG9ydC9kczIuaCBiL2ltcG9ydC9kczIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmY3MTEwCi0tLSAvZGV2L251bGwKKysrIGIvaW1wb3J0L2RzMi5oCkBAIC0wLDAgKzEsMzczIEBACisvKgorCitkcy5oCisKK0dlbmVyYXRlZCB3aXRoOgord3NkbDJoIC1jdXh5IC1vIGRzLmggLXQgV1MvV1MtdHlwZW1hcC5kYXQgV1MvZHMueHNkCisKKy0gUmVtb3ZlZCAvL2dzb2Fwb3B0CistIEFkZGVkIC8vZ3NvYXAgZHMgICAgc2NoZW1hIGltcG9ydDogaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIworCisqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogSW1wb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogU2NoZW1hIE5hbWVzcGFjZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy9nc29hcCBkcyAgICBzY2hlbWEgaW1wb3J0OglodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjCisvL2dzb2FwIGRzICAgIHNjaGVtYSBlbGVtZW50Rm9ybToJcXVhbGlmaWVkCisvL2dzb2FwIGRzICAgIHNjaGVtYSBhdHRyaWJ1dGVGb3JtOgl1bnF1YWxpZmllZAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogU2NoZW1hIFR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKKy8vLyBJbXBvcnRlZCBjb21wbGV4VHlwZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6U2lnbmF0dXJlVHlwZSBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuCit0eXBlZGVmIHN0cnVjdCBkc19fU2lnbmF0dXJlVHlwZQorewlzdHJ1Y3QgZHNfX1NpZ25lZEluZm9UeXBlKgkJU2lnbmVkSW5mbzsKKwljaGFyKgkJCQkJU2lnbmF0dXJlVmFsdWU7CisJc3RydWN0IGRzX19LZXlJbmZvVHlwZSoJCQlLZXlJbmZvOworCUBjaGFyKgkJCQkJSWQ7Cit9IGRzX19TaWduYXR1cmVUeXBlOworCisvLy8gSW1wb3J0ZWQgY29tcGxleFR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlNpZ25hdHVyZVZhbHVlVHlwZSBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuCisvLy8gY29tcGxleFR5cGUgZGVmaW5pdGlvbiBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsuCisKKy8vLyBUeXBlZGVmIHN5bm9ueW0gZm9yIHN0cnVjdCBkc19fU2lnbmVkSW5mb1R5cGUuCit0eXBlZGVmIHN0cnVjdCBkc19fU2lnbmVkSW5mb1R5cGUgZHNfX1NpZ25lZEluZm9UeXBlOworCisvLy8gVHlwZWRlZiBzeW5vbnltIGZvciBzdHJ1Y3QgZHNfX0Nhbm9uaWNhbGl6YXRpb25NZXRob2RUeXBlLgordHlwZWRlZiBzdHJ1Y3QgZHNfX0Nhbm9uaWNhbGl6YXRpb25NZXRob2RUeXBlIGRzX19DYW5vbmljYWxpemF0aW9uTWV0aG9kVHlwZTsKKworLy8vIFR5cGVkZWYgc3lub255bSBmb3Igc3RydWN0IGRzX19TaWduYXR1cmVNZXRob2RUeXBlLgordHlwZWRlZiBzdHJ1Y3QgZHNfX1NpZ25hdHVyZU1ldGhvZFR5cGUgZHNfX1NpZ25hdHVyZU1ldGhvZFR5cGU7CisKKy8vLyBUeXBlZGVmIHN5bm9ueW0gZm9yIHN0cnVjdCBkc19fUmVmZXJlbmNlVHlwZS4KK3R5cGVkZWYgc3RydWN0IGRzX19SZWZlcmVuY2VUeXBlIGRzX19SZWZlcmVuY2VUeXBlOworCisvLy8gVHlwZWRlZiBzeW5vbnltIGZvciBzdHJ1Y3QgZHNfX1RyYW5zZm9ybXNUeXBlLgordHlwZWRlZiBzdHJ1Y3QgZHNfX1RyYW5zZm9ybXNUeXBlIGRzX19UcmFuc2Zvcm1zVHlwZTsKKworLy8vIEltcG9ydGVkIGNvbXBsZXhUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpUcmFuc2Zvcm1UeXBlIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4KKyNpbXBvcnQgImMxNG4uaCIKK3R5cGVkZWYgc3RydWN0IGRzX19UcmFuc2Zvcm1UeXBlCit7CV9jMTRuX19JbmNsdXNpdmVOYW1lc3BhY2VzKiAgICAgICAgICAgICBjMTRuX19JbmNsdXNpdmVOYW1lc3BhY2VzOworCV9YTUwJCQkJCV9fYW55OworCUBjaGFyKgkJCQkJQWxnb3JpdGhtOworfSBkc19fVHJhbnNmb3JtVHlwZTsKKworLy8vIFR5cGVkZWYgc3lub255bSBmb3Igc3RydWN0IGRzX19EaWdlc3RNZXRob2RUeXBlLgordHlwZWRlZiBzdHJ1Y3QgZHNfX0RpZ2VzdE1ldGhvZFR5cGUgZHNfX0RpZ2VzdE1ldGhvZFR5cGU7CisKKy8vLyBJbXBvcnRlZCBjb21wbGV4VHlwZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6S2V5SW5mb1R5cGUgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LgordHlwZWRlZiBzdHJ1Y3QgZHNfX0tleUluZm9UeXBlCit7CWNoYXIqCQkJCQlLZXlOYW1lOworCXN0cnVjdCBkc19fS2V5VmFsdWVUeXBlKgkJS2V5VmFsdWU7CisJc3RydWN0IGRzX19SZXRyaWV2YWxNZXRob2RUeXBlKgkJUmV0cmlldmFsTWV0aG9kOworCXN0cnVjdCBkc19fWDUwOURhdGFUeXBlKgkJWDUwOURhdGE7CisJc3RydWN0IF93c3NlMl9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZSoJd3NzZTJfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2U7CisJQGNoYXIqCQkJCQlJZDsKK30gZHNfX0tleUluZm9UeXBlOworCisvLy8gVHlwZWRlZiBzeW5vbnltIGZvciBzdHJ1Y3QgZHNfX0tleVZhbHVlVHlwZS4KK3R5cGVkZWYgc3RydWN0IGRzX19LZXlWYWx1ZVR5cGUgZHNfX0tleVZhbHVlVHlwZTsKKworLy8vIFR5cGVkZWYgc3lub255bSBmb3Igc3RydWN0IGRzX19SZXRyaWV2YWxNZXRob2RUeXBlLgordHlwZWRlZiBzdHJ1Y3QgZHNfX1JldHJpZXZhbE1ldGhvZFR5cGUgZHNfX1JldHJpZXZhbE1ldGhvZFR5cGU7CisKKy8vLyBUeXBlZGVmIHN5bm9ueW0gZm9yIHN0cnVjdCBkc19fWDUwOURhdGFUeXBlLgordHlwZWRlZiBzdHJ1Y3QgZHNfX1g1MDlEYXRhVHlwZSBkc19fWDUwOURhdGFUeXBlOworCisvLy8gVHlwZWRlZiBzeW5vbnltIGZvciBzdHJ1Y3QgZHNfX1g1MDlJc3N1ZXJTZXJpYWxUeXBlLgordHlwZWRlZiBzdHJ1Y3QgZHNfX1g1MDlJc3N1ZXJTZXJpYWxUeXBlIGRzX19YNTA5SXNzdWVyU2VyaWFsVHlwZTsKKworLy8vIEltcG9ydGVkIGNvbXBsZXhUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpQR1BEYXRhVHlwZSBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuCisvLy8gY29tcGxleFR5cGUgZGVmaW5pdGlvbiBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsuCisKKy8vLyBJbXBvcnRlZCBjb21wbGV4VHlwZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6U1BLSURhdGFUeXBlIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4KKy8vLyBjb21wbGV4VHlwZSBkZWZpbml0aW9uIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4KKworLy8vIEltcG9ydGVkIGNvbXBsZXhUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpPYmplY3RUeXBlIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4KKy8vLyBjb21wbGV4VHlwZSBkZWZpbml0aW9uIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4KKworLy8vIEltcG9ydGVkIGNvbXBsZXhUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpNYW5pZmVzdFR5cGUgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LgorLy8vIGNvbXBsZXhUeXBlIGRlZmluaXRpb24gaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rLgorCisvLy8gSW1wb3J0ZWQgY29tcGxleFR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlNpZ25hdHVyZVByb3BlcnRpZXNUeXBlIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4KKy8vLyBjb21wbGV4VHlwZSBkZWZpbml0aW9uIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4KKworLy8vIEltcG9ydGVkIGNvbXBsZXhUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpTaWduYXR1cmVQcm9wZXJ0eVR5cGUgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LgorLy8vIGNvbXBsZXhUeXBlIGRlZmluaXRpb24gaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rLgorCisvLy8gVHlwZWRlZiBzeW5vbnltIGZvciBzdHJ1Y3QgZHNfX0RTQUtleVZhbHVlVHlwZS4KK3R5cGVkZWYgc3RydWN0IGRzX19EU0FLZXlWYWx1ZVR5cGUgZHNfX0RTQUtleVZhbHVlVHlwZTsKKworLy8vIFR5cGVkZWYgc3lub255bSBmb3Igc3RydWN0IGRzX19SU0FLZXlWYWx1ZVR5cGUuCit0eXBlZGVmIHN0cnVjdCBkc19fUlNBS2V5VmFsdWVUeXBlIGRzX19SU0FLZXlWYWx1ZVR5cGU7CisKKy8vLyBJbXBvcnRlZCBzaW1wbGVUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpDcnlwdG9CaW5hcnkgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LgorLy8vIHNpbXBsZVR5cGUgZGVmaW5pdGlvbiBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsuCisKKy8vLyBJbXBvcnRlZCBzaW1wbGVUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpEaWdlc3RWYWx1ZVR5cGUgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LgorLy8vIHNpbXBsZVR5cGUgZGVmaW5pdGlvbiBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsuCisKKy8vLyBJbXBvcnRlZCBzaW1wbGVUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpITUFDT3V0cHV0TGVuZ3RoVHlwZSBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuCisvLy8gc2ltcGxlVHlwZSBkZWZpbml0aW9uIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4KKworLy8vICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpTaWduZWRJbmZvVHlwZSBpcyBhIGNvbXBsZXhUeXBlLgorc3RydWN0IGRzX19TaWduZWRJbmZvVHlwZQoreworLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpDYW5vbmljYWxpemF0aW9uTWV0aG9kLgorICAgIHN0cnVjdCBkc19fQ2Fub25pY2FsaXphdGlvbk1ldGhvZFR5cGUqICBDYW5vbmljYWxpemF0aW9uTWV0aG9kICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50LgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpTaWduYXR1cmVNZXRob2QuCisgICAgc3RydWN0IGRzX19TaWduYXR1cmVNZXRob2RUeXBlKiAgICAgIFNpZ25hdHVyZU1ldGhvZCAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQuCisvLy8gU2l6ZSBvZiB0aGUgZHluYW1pYyBhcnJheSBvZiBzdHJ1Y3QgZHNfX1JlZmVyZW5jZVR5cGUqIGlzIDAuLnVuYm91bmRlZAorICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3NpemVSZWZlcmVuY2UgICAgICAgICAgICAgICA7CisvLy8gUG9pbnRlciB0byBhcnJheSBvZiBzdHJ1Y3QgZHNfX1JlZmVyZW5jZVR5cGUqLgorICAgIHN0cnVjdCBkc19fUmVmZXJlbmNlVHlwZSogICAgICAgICAgICpSZWZlcmVuY2UgICAgICAgICAgICAgICAgICAgICAgMTsKKy8vLyBBdHRyaWJ1dGUgSWQgb2YgdHlwZSB4czpJRC4KKyAgIEBjaGFyKiAvKklEKi8gICAgICAgICAgICAgICAgICAgICAgICAgSWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlLgorfTsKKworLy8vICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpDYW5vbmljYWxpemF0aW9uTWV0aG9kVHlwZSBpcyBhIGNvbXBsZXhUeXBlLgorc3RydWN0IGRzX19DYW5vbmljYWxpemF0aW9uTWV0aG9kVHlwZQoreworLy8vIFRPRE86IDxhbnkgbmFtZXNwYWNlPSIjI2FueSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisvLy8gICAgICAgU2NoZW1hIGV4dGVuc2liaWxpdHkgaXMgdXNlci1kZWZpbmFibGUuCisvLy8gICAgICAgQ29uc3VsdCB0aGUgcHJvdG9jb2wgZG9jdW1lbnRhdGlvbiB0byBjaGFuZ2UgYW5kL29yIGluc2VydCBkZWNsYXJhdGlvbnMuCisvLy8gICAgICAgVXNlIHdzZGwyaCBvcHRpb24gLXggdG8gcmVtb3ZlIHRoaXMgZWxlbWVudC4KKy8vLyBBdHRyaWJ1dGUgQWxnb3JpdGhtIG9mIHR5cGUgeHM6YW55VVJJLgorICAgQGNoYXIqIC8qVVJJKi8gICAgICAgICAgICAgICAgICAgICAgICBBbGdvcml0aG0gICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUuCisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIFdTL1dTLXR5cGVtYXAuZGF0CisgICBfYzE0bl9fSW5jbHVzaXZlTmFtZXNwYWNlcyoJCWMxNG5fX0luY2x1c2l2ZU5hbWVzcGFjZXM7Cit9OworCisvLy8gImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlNpZ25hdHVyZU1ldGhvZFR5cGUgaXMgYSBjb21wbGV4VHlwZS4KK3N0cnVjdCBkc19fU2lnbmF0dXJlTWV0aG9kVHlwZQoreworLy8vIEVsZW1lbnQgSE1BQ091dHB1dExlbmd0aCBvZiB0eXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpITUFDT3V0cHV0TGVuZ3RoVHlwZS4KKyAgICBpbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSE1BQ091dHB1dExlbmd0aCAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudC4KKy8vLyBUT0RPOiA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisvLy8gICAgICAgU2NoZW1hIGV4dGVuc2liaWxpdHkgaXMgdXNlci1kZWZpbmFibGUuCisvLy8gICAgICAgQ29uc3VsdCB0aGUgcHJvdG9jb2wgZG9jdW1lbnRhdGlvbiB0byBjaGFuZ2UgYW5kL29yIGluc2VydCBkZWNsYXJhdGlvbnMuCisvLy8gICAgICAgVXNlIHdzZGwyaCBvcHRpb24gLXggdG8gcmVtb3ZlIHRoaXMgZWxlbWVudC4KKy8vLyBBdHRyaWJ1dGUgQWxnb3JpdGhtIG9mIHR5cGUgeHM6YW55VVJJLgorICAgQGNoYXIqIC8qVVJJKi8gICAgICAgICAgICAgICAgICAgICAgICBBbGdvcml0aG0gICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUuCit9OworCisvLy8gImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlJlZmVyZW5jZVR5cGUgaXMgYSBjb21wbGV4VHlwZS4KK3N0cnVjdCBkc19fUmVmZXJlbmNlVHlwZQoreworLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpUcmFuc2Zvcm1zLgorICAgIHN0cnVjdCBkc19fVHJhbnNmb3Jtc1R5cGUqICAgICAgICAgICBUcmFuc2Zvcm1zICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50LgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpEaWdlc3RNZXRob2QuCisgICAgc3RydWN0IGRzX19EaWdlc3RNZXRob2RUeXBlKiAgICAgICAgIERpZ2VzdE1ldGhvZCAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQuCisvLy8gRWxlbWVudCByZWZlcmVuY2UgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOkRpZ2VzdFZhbHVlLgorICAgIGNoYXIqIC8qYmFzZTY0Ki8gICAgICAgICAgICAgICAgICAgICBEaWdlc3RWYWx1ZSAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50LgorLy8vIEF0dHJpYnV0ZSBJZCBvZiB0eXBlIHhzOklELgorICAgQGNoYXIqIC8qSUQqLyAgICAgICAgICAgICAgICAgICAgICAgICBJZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUuCisvLy8gQXR0cmlidXRlIFVSSSBvZiB0eXBlIHhzOmFueVVSSS4KKyAgIEBjaGFyKiAvKlVSSSovICAgICAgICAgICAgICAgICAgICAgICAgVVJJICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlLgorLy8vIEF0dHJpYnV0ZSBUeXBlIG9mIHR5cGUgeHM6YW55VVJJLgorICAgQGNoYXIqIC8qVVJJKi8gICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUuCit9OworCisvLy8gImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlRyYW5zZm9ybXNUeXBlIGlzIGEgY29tcGxleFR5cGUuCitzdHJ1Y3QgZHNfX1RyYW5zZm9ybXNUeXBlCit7CisvLy8gU2l6ZSBvZiB0aGUgZHluYW1pYyBhcnJheSBvZiBkc19fVHJhbnNmb3JtVHlwZSBpcyAwLi51bmJvdW5kZWQKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zaXplVHJhbnNmb3JtICAgICAgICAgICAgICAgOworLy8vIFBvaW50ZXIgdG8gYXJyYXkgb2YgZHNfX1RyYW5zZm9ybVR5cGUuCisgICAgZHNfX1RyYW5zZm9ybVR5cGUgICAgICAgICAgICAgICAgICAgKlRyYW5zZm9ybSAgICAgICAgICAgICAgICAgICAgICAxOworfTsKKworLy8vICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpEaWdlc3RNZXRob2RUeXBlIGlzIGEgY29tcGxleFR5cGUuCitzdHJ1Y3QgZHNfX0RpZ2VzdE1ldGhvZFR5cGUKK3sKKy8vLyBUT0RPOiA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisvLy8gICAgICAgU2NoZW1hIGV4dGVuc2liaWxpdHkgaXMgdXNlci1kZWZpbmFibGUuCisvLy8gICAgICAgQ29uc3VsdCB0aGUgcHJvdG9jb2wgZG9jdW1lbnRhdGlvbiB0byBjaGFuZ2UgYW5kL29yIGluc2VydCBkZWNsYXJhdGlvbnMuCisvLy8gICAgICAgVXNlIHdzZGwyaCBvcHRpb24gLXggdG8gcmVtb3ZlIHRoaXMgZWxlbWVudC4KKy8vLyBBdHRyaWJ1dGUgQWxnb3JpdGhtIG9mIHR5cGUgeHM6YW55VVJJLgorICAgQGNoYXIqIC8qVVJJKi8gICAgICAgICAgICAgICAgICAgICAgICBBbGdvcml0aG0gICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUuCit9OworCisvLy8gImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOktleVZhbHVlVHlwZSBpcyBhIGNvbXBsZXhUeXBlLgorc3RydWN0IGRzX19LZXlWYWx1ZVR5cGUKK3sKKy8vLyBDSE9JQ0UgT0YgRUxFTUVOVFMgPGNob2ljZT4KKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6RFNBS2V5VmFsdWUuCisgICAgc3RydWN0IGRzX19EU0FLZXlWYWx1ZVR5cGUqICAgICAgICAgIERTQUtleVZhbHVlICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQuCisvLy8gRWxlbWVudCByZWZlcmVuY2UgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlJTQUtleVZhbHVlLgorICAgIHN0cnVjdCBkc19fUlNBS2V5VmFsdWVUeXBlKiAgICAgICAgICBSU0FLZXlWYWx1ZSAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50LgorLy8vIFRPRE86IDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIj4KKy8vLyAgICAgICBTY2hlbWEgZXh0ZW5zaWJpbGl0eSBpcyB1c2VyLWRlZmluYWJsZS4KKy8vLyAgICAgICBDb25zdWx0IHRoZSBwcm90b2NvbCBkb2N1bWVudGF0aW9uIHRvIGNoYW5nZSBhbmQvb3IgaW5zZXJ0IGRlY2xhcmF0aW9ucy4KKy8vLyAgICAgICBVc2Ugd3NkbDJoIG9wdGlvbiAteCB0byByZW1vdmUgdGhpcyBlbGVtZW50LgorCisvLyAgRU5EIE9GIENIT0lDRQorfTsKKworLy8vICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpSZXRyaWV2YWxNZXRob2RUeXBlIGlzIGEgY29tcGxleFR5cGUuCitzdHJ1Y3QgZHNfX1JldHJpZXZhbE1ldGhvZFR5cGUKK3sKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6VHJhbnNmb3Jtcy4KKyAgICBzdHJ1Y3QgZHNfX1RyYW5zZm9ybXNUeXBlKiAgICAgICAgICAgVHJhbnNmb3JtcyAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudC4KKy8vLyBBdHRyaWJ1dGUgVVJJIG9mIHR5cGUgeHM6YW55VVJJLgorICAgQGNoYXIqIC8qVVJJKi8gICAgICAgICAgICAgICAgICAgICAgICBVUkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUuCisvLy8gQXR0cmlidXRlIFR5cGUgb2YgdHlwZSB4czphbnlVUkkuCisgICBAY2hhciogLypVUkkqLyAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZS4KK307CisKKy8vLyAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6WDUwOURhdGFUeXBlIGlzIGEgY29tcGxleFR5cGUuCitzdHJ1Y3QgZHNfX1g1MDlEYXRhVHlwZQoreworLy8vIENIT0lDRSBPRiBFTEVNRU5UUyA8Y2hvaWNlPgorLy8vIEVsZW1lbnQgWDUwOUlzc3VlclNlcmlhbCBvZiB0eXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpYNTA5SXNzdWVyU2VyaWFsVHlwZS4KKyAgICBzdHJ1Y3QgZHNfX1g1MDlJc3N1ZXJTZXJpYWxUeXBlKiAgICAgWDUwOUlzc3VlclNlcmlhbCAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudC4KKy8vLyBFbGVtZW50IFg1MDlTS0kgb2YgdHlwZSB4czpiYXNlNjRCaW5hcnkuCisgICAgY2hhciogLypiYXNlNjQqLyAgICAgICAgICAgICAgICAgICAgIFg1MDlTS0kgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQuCisvLy8gRWxlbWVudCBYNTA5U3ViamVjdE5hbWUgb2YgdHlwZSB4czpzdHJpbmcuCisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlTdWJqZWN0TmFtZSAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQuCisvLy8gRWxlbWVudCBYNTA5Q2VydGlmaWNhdGUgb2YgdHlwZSB4czpiYXNlNjRCaW5hcnkuCisgICAgY2hhciogLypiYXNlNjQqLyAgICAgICAgICAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQuCisvLy8gRWxlbWVudCBYNTA5Q1JMIG9mIHR5cGUgeHM6YmFzZTY0QmluYXJ5LgorICAgIGNoYXIqIC8qYmFzZTY0Ki8gICAgICAgICAgICAgICAgICAgICBYNTA5Q1JMICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50LgorLy8vIFRPRE86IDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIj4KKy8vLyAgICAgICBTY2hlbWEgZXh0ZW5zaWJpbGl0eSBpcyB1c2VyLWRlZmluYWJsZS4KKy8vLyAgICAgICBDb25zdWx0IHRoZSBwcm90b2NvbCBkb2N1bWVudGF0aW9uIHRvIGNoYW5nZSBhbmQvb3IgaW5zZXJ0IGRlY2xhcmF0aW9ucy4KKy8vLyAgICAgICBVc2Ugd3NkbDJoIG9wdGlvbiAteCB0byByZW1vdmUgdGhpcyBlbGVtZW50LgorCisvLyAgRU5EIE9GIENIT0lDRQorfTsKKworLy8vICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpYNTA5SXNzdWVyU2VyaWFsVHlwZSBpcyBhIGNvbXBsZXhUeXBlLgorc3RydWN0IGRzX19YNTA5SXNzdWVyU2VyaWFsVHlwZQoreworLy8vIEVsZW1lbnQgWDUwOUlzc3Vlck5hbWUgb2YgdHlwZSB4czpzdHJpbmcuCisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlJc3N1ZXJOYW1lICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQuCisvLy8gRWxlbWVudCBYNTA5U2VyaWFsTnVtYmVyIG9mIHR5cGUgeHM6aW50ZWdlci4KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDUwOVNlcmlhbE51bWJlciAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudC4KK307CisKKy8vLyAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6RFNBS2V5VmFsdWVUeXBlIGlzIGEgY29tcGxleFR5cGUuCitzdHJ1Y3QgZHNfX0RTQUtleVZhbHVlVHlwZQoreworLy8vIEVsZW1lbnQgRyBvZiB0eXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpDcnlwdG9CaW5hcnkuCisgICAgY2hhciogLypiYXNlNjQqLyAgICAgICAgICAgICAgICAgICAgIEcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQuCisvLy8gRWxlbWVudCBZIG9mIHR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOkNyeXB0b0JpbmFyeS4KKyAgICBjaGFyKiAvKmJhc2U2NCovICAgICAgICAgICAgICAgICAgICAgWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudC4KKy8vLyBFbGVtZW50IEogb2YgdHlwZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6Q3J5cHRvQmluYXJ5LgorICAgIGNoYXIqIC8qYmFzZTY0Ki8gICAgICAgICAgICAgICAgICAgICBKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50LgorLy8vIEVsZW1lbnQgUCBvZiB0eXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpDcnlwdG9CaW5hcnkuCisgICAgY2hhciogLypiYXNlNjQqLyAgICAgICAgICAgICAgICAgICAgIFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQuCisvLy8gRWxlbWVudCBRIG9mIHR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOkNyeXB0b0JpbmFyeS4KKyAgICBjaGFyKiAvKmJhc2U2NCovICAgICAgICAgICAgICAgICAgICAgUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudC4KKy8vLyBFbGVtZW50IFNlZWQgb2YgdHlwZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6Q3J5cHRvQmluYXJ5LgorICAgIGNoYXIqIC8qYmFzZTY0Ki8gICAgICAgICAgICAgICAgICAgICBTZWVkICAgICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50LgorLy8vIEVsZW1lbnQgUGdlbkNvdW50ZXIgb2YgdHlwZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6Q3J5cHRvQmluYXJ5LgorICAgIGNoYXIqIC8qYmFzZTY0Ki8gICAgICAgICAgICAgICAgICAgICBQZ2VuQ291bnRlciAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50LgorfTsKKworLy8vICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpSU0FLZXlWYWx1ZVR5cGUgaXMgYSBjb21wbGV4VHlwZS4KK3N0cnVjdCBkc19fUlNBS2V5VmFsdWVUeXBlCit7CisvLy8gRWxlbWVudCBNb2R1bHVzIG9mIHR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOkNyeXB0b0JpbmFyeS4KKyAgICBjaGFyKiAvKmJhc2U2NCovICAgICAgICAgICAgICAgICAgICAgTW9kdWx1cyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudC4KKy8vLyBFbGVtZW50IEV4cG9uZW50IG9mIHR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOkNyeXB0b0JpbmFyeS4KKyAgICBjaGFyKiAvKmJhc2U2NCovICAgICAgICAgICAgICAgICAgICAgRXhwb25lbnQgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudC4KK307CisKKy8vLyBFbGVtZW50ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpTaWduYXR1cmUgb2YgY29tcGxleFR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlNpZ25hdHVyZVR5cGUuCisvLy8gTm90ZTogdXNlIHdzZGwyaCBvcHRpb24gLWcgdG8gZ2VuZXJhdGUgdGhpcyBnbG9iYWwgZWxlbWVudCBkZWNsYXJhdGlvbi4KKworLy8vIEVsZW1lbnQgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlNpZ25hdHVyZVZhbHVlIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpTaWduYXR1cmVWYWx1ZVR5cGUuCisvLy8gTm90ZTogdXNlIHdzZGwyaCBvcHRpb24gLWcgdG8gZ2VuZXJhdGUgdGhpcyBnbG9iYWwgZWxlbWVudCBkZWNsYXJhdGlvbi4KKworLy8vIEVsZW1lbnQgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlNpZ25lZEluZm8gb2YgY29tcGxleFR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlNpZ25lZEluZm9UeXBlLgorLy8vIE5vdGU6IHVzZSB3c2RsMmggb3B0aW9uIC1nIHRvIGdlbmVyYXRlIHRoaXMgZ2xvYmFsIGVsZW1lbnQgZGVjbGFyYXRpb24uCisKKy8vLyBFbGVtZW50ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpDYW5vbmljYWxpemF0aW9uTWV0aG9kIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpDYW5vbmljYWxpemF0aW9uTWV0aG9kVHlwZS4KKy8vLyBOb3RlOiB1c2Ugd3NkbDJoIG9wdGlvbiAtZyB0byBnZW5lcmF0ZSB0aGlzIGdsb2JhbCBlbGVtZW50IGRlY2xhcmF0aW9uLgorCisvLy8gRWxlbWVudCAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6U2lnbmF0dXJlTWV0aG9kIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpTaWduYXR1cmVNZXRob2RUeXBlLgorLy8vIE5vdGU6IHVzZSB3c2RsMmggb3B0aW9uIC1nIHRvIGdlbmVyYXRlIHRoaXMgZ2xvYmFsIGVsZW1lbnQgZGVjbGFyYXRpb24uCisKKy8vLyBFbGVtZW50ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpSZWZlcmVuY2Ugb2YgY29tcGxleFR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlJlZmVyZW5jZVR5cGUuCisvLy8gTm90ZTogdXNlIHdzZGwyaCBvcHRpb24gLWcgdG8gZ2VuZXJhdGUgdGhpcyBnbG9iYWwgZWxlbWVudCBkZWNsYXJhdGlvbi4KKworLy8vIEVsZW1lbnQgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlRyYW5zZm9ybXMgb2YgY29tcGxleFR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlRyYW5zZm9ybXNUeXBlLgorLy8vIE5vdGU6IHVzZSB3c2RsMmggb3B0aW9uIC1nIHRvIGdlbmVyYXRlIHRoaXMgZ2xvYmFsIGVsZW1lbnQgZGVjbGFyYXRpb24uCisKKy8vLyBFbGVtZW50ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpUcmFuc2Zvcm0gb2YgY29tcGxleFR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlRyYW5zZm9ybVR5cGUuCisvLy8gTm90ZTogdXNlIHdzZGwyaCBvcHRpb24gLWcgdG8gZ2VuZXJhdGUgdGhpcyBnbG9iYWwgZWxlbWVudCBkZWNsYXJhdGlvbi4KKworLy8vIEVsZW1lbnQgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOkRpZ2VzdE1ldGhvZCBvZiBjb21wbGV4VHlwZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6RGlnZXN0TWV0aG9kVHlwZS4KKy8vLyBOb3RlOiB1c2Ugd3NkbDJoIG9wdGlvbiAtZyB0byBnZW5lcmF0ZSB0aGlzIGdsb2JhbCBlbGVtZW50IGRlY2xhcmF0aW9uLgorCisvLy8gRWxlbWVudCAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6RGlnZXN0VmFsdWUgb2YgY29tcGxleFR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOkRpZ2VzdFZhbHVlVHlwZS4KKy8vLyBOb3RlOiB1c2Ugd3NkbDJoIG9wdGlvbiAtZyB0byBnZW5lcmF0ZSB0aGlzIGdsb2JhbCBlbGVtZW50IGRlY2xhcmF0aW9uLgorCisvLy8gRWxlbWVudCAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6S2V5SW5mbyBvZiBjb21wbGV4VHlwZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6S2V5SW5mb1R5cGUuCisvLy8gTm90ZTogdXNlIHdzZGwyaCBvcHRpb24gLWcgdG8gZ2VuZXJhdGUgdGhpcyBnbG9iYWwgZWxlbWVudCBkZWNsYXJhdGlvbi4KKworLy8vIEVsZW1lbnQgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOktleU5hbWUgb2YgY29tcGxleFR5cGUgeHM6c3RyaW5nLgorLy8vIE5vdGU6IHVzZSB3c2RsMmggb3B0aW9uIC1nIHRvIGdlbmVyYXRlIHRoaXMgZ2xvYmFsIGVsZW1lbnQgZGVjbGFyYXRpb24uCisKKy8vLyBFbGVtZW50ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpNZ210RGF0YSBvZiBjb21wbGV4VHlwZSB4czpzdHJpbmcuCisvLy8gTm90ZTogdXNlIHdzZGwyaCBvcHRpb24gLWcgdG8gZ2VuZXJhdGUgdGhpcyBnbG9iYWwgZWxlbWVudCBkZWNsYXJhdGlvbi4KKworLy8vIEVsZW1lbnQgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOktleVZhbHVlIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpLZXlWYWx1ZVR5cGUuCisvLy8gTm90ZTogdXNlIHdzZGwyaCBvcHRpb24gLWcgdG8gZ2VuZXJhdGUgdGhpcyBnbG9iYWwgZWxlbWVudCBkZWNsYXJhdGlvbi4KKworLy8vIEVsZW1lbnQgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlJldHJpZXZhbE1ldGhvZCBvZiBjb21wbGV4VHlwZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6UmV0cmlldmFsTWV0aG9kVHlwZS4KKy8vLyBOb3RlOiB1c2Ugd3NkbDJoIG9wdGlvbiAtZyB0byBnZW5lcmF0ZSB0aGlzIGdsb2JhbCBlbGVtZW50IGRlY2xhcmF0aW9uLgorCisvLy8gRWxlbWVudCAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6WDUwOURhdGEgb2YgY29tcGxleFR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlg1MDlEYXRhVHlwZS4KKy8vLyBOb3RlOiB1c2Ugd3NkbDJoIG9wdGlvbiAtZyB0byBnZW5lcmF0ZSB0aGlzIGdsb2JhbCBlbGVtZW50IGRlY2xhcmF0aW9uLgorCisvLy8gRWxlbWVudCAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6UEdQRGF0YSBvZiBjb21wbGV4VHlwZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6UEdQRGF0YVR5cGUuCisvLy8gTm90ZTogdXNlIHdzZGwyaCBvcHRpb24gLWcgdG8gZ2VuZXJhdGUgdGhpcyBnbG9iYWwgZWxlbWVudCBkZWNsYXJhdGlvbi4KKworLy8vIEVsZW1lbnQgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlNQS0lEYXRhIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpTUEtJRGF0YVR5cGUuCisvLy8gTm90ZTogdXNlIHdzZGwyaCBvcHRpb24gLWcgdG8gZ2VuZXJhdGUgdGhpcyBnbG9iYWwgZWxlbWVudCBkZWNsYXJhdGlvbi4KKworLy8vIEVsZW1lbnQgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOk9iamVjdCBvZiBjb21wbGV4VHlwZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6T2JqZWN0VHlwZS4KKy8vLyBOb3RlOiB1c2Ugd3NkbDJoIG9wdGlvbiAtZyB0byBnZW5lcmF0ZSB0aGlzIGdsb2JhbCBlbGVtZW50IGRlY2xhcmF0aW9uLgorCisvLy8gRWxlbWVudCAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6TWFuaWZlc3Qgb2YgY29tcGxleFR5cGUgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOk1hbmlmZXN0VHlwZS4KKy8vLyBOb3RlOiB1c2Ugd3NkbDJoIG9wdGlvbiAtZyB0byBnZW5lcmF0ZSB0aGlzIGdsb2JhbCBlbGVtZW50IGRlY2xhcmF0aW9uLgorCisvLy8gRWxlbWVudCAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6U2lnbmF0dXJlUHJvcGVydGllcyBvZiBjb21wbGV4VHlwZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI6U2lnbmF0dXJlUHJvcGVydGllc1R5cGUuCisvLy8gTm90ZTogdXNlIHdzZGwyaCBvcHRpb24gLWcgdG8gZ2VuZXJhdGUgdGhpcyBnbG9iYWwgZWxlbWVudCBkZWNsYXJhdGlvbi4KKworLy8vIEVsZW1lbnQgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlNpZ25hdHVyZVByb3BlcnR5IG9mIGNvbXBsZXhUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpTaWduYXR1cmVQcm9wZXJ0eVR5cGUuCisvLy8gTm90ZTogdXNlIHdzZGwyaCBvcHRpb24gLWcgdG8gZ2VuZXJhdGUgdGhpcyBnbG9iYWwgZWxlbWVudCBkZWNsYXJhdGlvbi4KKworLy8vIEVsZW1lbnQgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOkRTQUtleVZhbHVlIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpEU0FLZXlWYWx1ZVR5cGUuCisvLy8gTm90ZTogdXNlIHdzZGwyaCBvcHRpb24gLWcgdG8gZ2VuZXJhdGUgdGhpcyBnbG9iYWwgZWxlbWVudCBkZWNsYXJhdGlvbi4KKworLy8vIEVsZW1lbnQgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOlJTQUtleVZhbHVlIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjpSU0FLZXlWYWx1ZVR5cGUuCisvLy8gTm90ZTogdXNlIHdzZGwyaCBvcHRpb24gLWcgdG8gZ2VuZXJhdGUgdGhpcyBnbG9iYWwgZWxlbWVudCBkZWNsYXJhdGlvbi4KKworLyogRW5kIG9mIGRzLmggKi8KZGlmZiAtLWdpdCBhL2ltcG9ydC9zb2FwMTIuaCBiL2ltcG9ydC9zb2FwMTIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjFjOTdmCi0tLSAvZGV2L251bGwKKysrIGIvaW1wb3J0L3NvYXAxMi5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisKK3NvYXAxMi5oCisKK1VzZSAjaW1wb3J0ICJzb2FwMTIuaCIgaW4gYSBnU09BUCBoZWFkZXIgZmlsZSB0byBlbmFibGUgU09BUCAxLjIgYmluZGluZ3MuCitBbHRlcm5hdGl2ZWx5LCB1c2Ugc29hcGNwcDIgb3B0aW9uIC0yCisKK1VzZSBzb2FwY3BwMiBvcHRpb24gLUlwYXRoOnBhdGg6Li4uIHRvIHNwZWNpZnkgdGhlIHBhdGgocykgZm9yICNpbXBvcnQKKworZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlczoKK0dQTCwgdGhlIGdTT0FQIHB1YmxpYyBsaWNlbnNlLCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgcHVibGljIGxpY2Vuc2UuCisKK1RoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGdTT0FQIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4zCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKK0xpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoraHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL3NvYXBsaWNlbnNlLmh0bWwKK1NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCitXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKK2ZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK1RoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4uCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4sIEdlbml2aWEgaW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKy8vZ3NvYXAgU09BUC1FTlYgc2NoZW1hIG5hbWVzcGFjZTogaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlCisvL2dzb2FwIFNPQVAtRU5DIHNjaGVtYSBuYW1lc3BhY2U6IGh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbmNvZGluZwpkaWZmIC0tZ2l0IGEvaW1wb3J0L3N0bC5oIGIvaW1wb3J0L3N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYjYxNDMKLS0tIC9kZXYvbnVsbAorKysgYi9pbXBvcnQvc3RsLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKworc3RsLmgKKworVXNlICNpbXBvcnQgInN0bC5oIiBpbiBhIGdTT0FQIGhlYWRlciBmaWxlIHRvIGVuYWJsZSBTVEwgdmVjdG9ycywgZGVxdWVzLCBsaXN0cywKK2FuZCBzZXRzLgorCitVc2Ugc29hcGNwcDIgb3B0aW9uIC1JcGF0aDpwYXRoOi4uLiB0byBzcGVjaWZ5IHRoZSBwYXRoKHMpIGZvciAjaW1wb3J0CisKK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgcGFydCBvZiB0aGUgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXM6CitHUEwsIHRoZSBnU09BUCBwdWJsaWMgbGljZW5zZSwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIHB1YmxpYyBsaWNlbnNlLgorCitUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBnU09BUCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMworKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCitMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK2h0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9zb2FwbGljZW5zZS5odG1sCitTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAorV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCitmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLgorQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLCBHZW5pdmlhIGluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaW1wb3J0ICJzdGxkZXF1ZS5oIgorI2ltcG9ydCAic3RsbGlzdC5oIgorI2ltcG9ydCAic3RsdmVjdG9yLmgiCisjaW1wb3J0ICJzdGxzZXQuaCIKZGlmZiAtLWdpdCBhL2ltcG9ydC9zdGxkZXF1ZS5oIGIvaW1wb3J0L3N0bGRlcXVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFmMjkwMwotLS0gL2Rldi9udWxsCisrKyBiL2ltcG9ydC9zdGxkZXF1ZS5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisKK3N0bGRlcXVlLmgKKworVXNlICNpbXBvcnQgInN0bGRlcXVlLmgiIGluIGEgZ1NPQVAgaGVhZGVyIGZpbGUgdG8gZW5hYmxlIFNUTCBkZXF1ZXMuCisKK1VzZSBzb2FwY3BwMiBvcHRpb24gLUlwYXRoOnBhdGg6Li4uIHRvIHNwZWNpZnkgdGhlIHBhdGgocykgZm9yICNpbXBvcnQKKworZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlczoKK0dQTCwgdGhlIGdTT0FQIHB1YmxpYyBsaWNlbnNlLCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgcHVibGljIGxpY2Vuc2UuCisKK1RoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGdTT0FQIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4zCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKK0xpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoraHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL3NvYXBsaWNlbnNlLmh0bWwKK1NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCitXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKK2ZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK1RoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4uCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4sIEdlbml2aWEgaW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbmNsdWRlIDxkZXF1ZT4KK3RlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBzdGQ6OmRlcXVlOwpkaWZmIC0tZ2l0IGEvaW1wb3J0L3N0bGxpc3QuaCBiL2ltcG9ydC9zdGxsaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE3NGVkZQotLS0gL2Rldi9udWxsCisrKyBiL2ltcG9ydC9zdGxsaXN0LmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKworc3RsbGlzdC5oCisKK1VzZSAjaW1wb3J0ICJzdGxsaXN0LmgiIGluIGEgZ1NPQVAgaGVhZGVyIGZpbGUgdG8gZW5hYmxlIFNUTCBsaXN0cy4KKworVXNlIHNvYXBjcHAyIG9wdGlvbiAtSXBhdGg6cGF0aDouLi4gdG8gc3BlY2lmeSB0aGUgcGF0aChzKSBmb3IgI2ltcG9ydAorCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHBhcnQgb2YgdGhlIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2VzOgorR1BMLCB0aGUgZ1NPQVAgcHVibGljIGxpY2Vuc2UsIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBwdWJsaWMgbGljZW5zZS4KKworVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZ1NPQVAgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjMKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcGxpY2Vuc2UuaHRtbAorU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKK1dJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQorZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFJvYmVydCBBLiB2YW4gRW5nZWxlbi4KK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1IFJvYmVydCBBLiB2YW4gRW5nZWxlbiwgR2VuaXZpYSBpbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2luY2x1ZGUgPGxpc3Q+Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3Mgc3RkOjpsaXN0OwpkaWZmIC0tZ2l0IGEvaW1wb3J0L3N0bHNldC5oIGIvaW1wb3J0L3N0bHNldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZmNlNTMKLS0tIC9kZXYvbnVsbAorKysgYi9pbXBvcnQvc3Rsc2V0LmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKworc3Rsc2V0LmgKKworVXNlICNpbXBvcnQgInN0bHNldC5oIiBpbiBhIGdTT0FQIGhlYWRlciBmaWxlIHRvIGVuYWJsZSBTVEwgc2V0cy4KKworVXNlIHNvYXBjcHAyIG9wdGlvbiAtSXBhdGg6cGF0aDouLi4gdG8gc3BlY2lmeSB0aGUgcGF0aChzKSBmb3IgI2ltcG9ydAorCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHBhcnQgb2YgdGhlIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2VzOgorR1BMLCB0aGUgZ1NPQVAgcHVibGljIGxpY2Vuc2UsIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBwdWJsaWMgbGljZW5zZS4KKworVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZ1NPQVAgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjMKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcGxpY2Vuc2UuaHRtbAorU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKK1dJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQorZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFJvYmVydCBBLiB2YW4gRW5nZWxlbi4KK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1IFJvYmVydCBBLiB2YW4gRW5nZWxlbiwgR2VuaXZpYSBpbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2luY2x1ZGUgPHNldD4KK3RlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBzdGQ6OnNldDsKZGlmZiAtLWdpdCBhL2ltcG9ydC9zdGx2ZWN0b3IuaCBiL2ltcG9ydC9zdGx2ZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDNmMDE4Ci0tLSAvZGV2L251bGwKKysrIGIvaW1wb3J0L3N0bHZlY3Rvci5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisKK3N0bHZlY3Rvci5oCisKK1VzZSAjaW1wb3J0ICJzdGx2ZWN0b3IuaCIgaW4gYSBnU09BUCBoZWFkZXIgZmlsZSB0byBlbmFibGUgU1RMIHZlY3RvcnMuCisKK1VzZSBzb2FwY3BwMiBvcHRpb24gLUlwYXRoOnBhdGg6Li4uIHRvIHNwZWNpZnkgdGhlIHBhdGgocykgZm9yICNpbXBvcnQKKworZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlczoKK0dQTCwgdGhlIGdTT0FQIHB1YmxpYyBsaWNlbnNlLCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgcHVibGljIGxpY2Vuc2UuCisKK1RoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGdTT0FQIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4zCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKK0xpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoraHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL3NvYXBsaWNlbnNlLmh0bWwKK1NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCitXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKK2ZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK1RoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4uCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4sIEdlbml2aWEgaW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbmNsdWRlIDx2ZWN0b3I+Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3Mgc3RkOjp2ZWN0b3I7CmRpZmYgLS1naXQgYS9pbXBvcnQvd3NhLmggYi9pbXBvcnQvd3NhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNmN2UzMAotLS0gL2Rldi9udWxsCisrKyBiL2ltcG9ydC93c2EuaApAQCAtMCwwICsxLDI0NiBAQAorLyoKKword3NhLmgKKworR2VuZXJhdGVkIHdpdGg6Cit3c2RsMmggLWNneSAtbyB3c2EuaCAtdCBXUy9XUy10eXBlbWFwLmRhdCBXUy9XUy1BZGRyZXNzaW5nLnhzZAorCitNb2RpZmllZCBieSBSb2JlcnQgdmFuIEVuZ2VsZW46CisKKy0gUmVtb3ZlZCAvL2dzb2Fwb3B0CistIEFkZGVkIHRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlIHRvIGltcG9ydCBXUy1BZGRyZXNzaW5nIG5hbWVzcGFjZToKKyAgLy9nc29hcCB3c2Egc2NoZW1hIGltcG9ydDogaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nCisgIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBXUy1BZGRyZXNzaW5nIHNjaGVtYXMgYXJlIG5vdCBjb3BpZWQgaW50byB0aGUgZ2VuZXJhdGVkCisgIFdTREwgYnkgc29hcGNwcDIgYnV0IGFyZSByZWZlcmVuY2VkIHdpdGggc2NoZW1hIGltcG9ydCBpbiB0aGUgZ2VuZXJhdGVkIFdTREwuCisKK1VzYWdlOgorCisvLyBoZWFkZXIgZmlsZSBmb3Igc29hcGNwcDIKKyNpbXBvcnQgIndzYS5oIgorc3RydWN0IFNPQVBfRU5WX19IZWFkZXIKK3sKKyAgbXVzdFVuZGVyc3RhbmQgX3dzYV9fTWVzc2FnZUlEICB3c2FfX01lc3NhZ2VJRCAwOworICBtdXN0VW5kZXJzdGFuZCBfd3NhX19SZWxhdGVzVG8gKndzYV9fUmVsYXRlc1RvIDA7CisgIG11c3RVbmRlcnN0YW5kIF93c2FfX0Zyb20gICAgICAqd3NhX19Gcm9tICAgICAgMDsKKyAgbXVzdFVuZGVyc3RhbmQgX3dzYV9fUmVwbHlUbyAgICp3c2FfX1JlcGx5VG8gICAwOworICBtdXN0VW5kZXJzdGFuZCBfd3NhX19GYXVsdFRvICAgKndzYV9fRmF1bHRUbyAgIDA7CisgIG11c3RVbmRlcnN0YW5kIF93c2FfX1RvICAgICAgICAgd3NhX19UbyAgICAgICAgMDsKKyAgbXVzdFVuZGVyc3RhbmQgX3dzYV9fQWN0aW9uICAgICB3c2FfX0FjdGlvbiAgICAwOworfTsKKworLy8gY2xpZW50LXNpZGUgc291cmNlIGNvZGUKK3sgc3RydWN0IHNvYXAgc29hcDsKKyAgc3RydWN0IFNPQVBfRU5WX19IZWFkZXIgaGVhZGVyOworICBfd3NhX19SZXBseVRvIHJlcGx5VG87CisgIHNvYXBfaW5pdCgmc29hcCk7CisgIHNvYXBfZGVmYXVsdF9TT0FQX0VOVl9fSGVhZGVyKCZzb2FwLCAmaGVhZGVyKTsKKyAgc29hcC5oZWFkZXIgPSAmaGVhZGVyOworICBzb2FwX2RlZmF1bHRfd3NhX19FbmRwb2ludFJlZmVyZW5jZVR5cGUoJnNvYXAsICZyZXBseVRvKTsKKyAgcmVwbHlUby5BZGRyZXNzID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZy9yb2xlL2Fub255Cittb3VzIjsKKyAgaGVhZGVyLndzYV9fTWVzc2FnZUlEID0gIi4uLiI7CisgIGhlYWRlci53c2FfX1RvID0gIi4uLiI7CisgIGhlYWRlci53c2FfX0FjdGlvbiA9ICIuLi4iOworICBoZWFkZXIud3NhX19SZXBseVRvID0gJnJlcGx5VG87CisgIGlmIChzb2FwX2NhbGxfbnNfX21ldGhvZCgmc29hcCwgLi4uKSAhPSBTT0FQX09LKQorCisvLyBzZXJ2ZXItc2lkZSBzb3VyY2UgY29kZQoraW50IHNvYXBfbnNfX21ldGhvZChzdHJ1Y3Qgc29hcCAqc29hcCwgLi4uKQoreyBpZiAoIXNvYXAtPmhlYWRlcikKKyAgICByZXR1cm4gc29hcF9zZW5kZXJfZmF1bHQoc29hcCwgIk5vIFNPQVAgaGVhZGVyLCBtdXN0IHNlbmQgb25lIiwgTlVMTCk7CisgIGlmICghc29hcC0+aGVhZGVyLT53c2FfX01lc3NhZ2VJRCkKKyAgICByZXR1cm4gc29hcF9zZW5kZXJfZmF1bHQoc29hcCwgIk5vIFdTLUFkZHJlc3NpbmcgTWVzc2FnZUlEIiwgTlVMTCk7CisgIHNvYXAtPmhlYWRlci0+d3NhX19SZWxhdGVzVG8gPSAoc3RydWN0IHdzYV9fUmVsYXRpb25zaGlwKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IHdzYV9fUmVsYXRpb25zaGlwKSk7CisgIHNvYXBfZGVmYXVsdF93c2FfX1JlbGF0aW9uc2hpcChzb2FwLCBzb2FwLT5oZWFkZXItPndzYV9fUmVsYXRlc1RvKTsKKyAgc29hcC0+aGVhZGVyLT53c2FfX1JlbGF0ZXNUby0+X19pdGVtID0gc29hcC0+aGVhZGVyLT53c2FfX01lc3NhZ2VJRDsKKyAgaWYgKCFzb2FwLT5oZWFkZXItPndzYV9fUmVwbHlUbyB8fCAhc29hcC0+aGVhZGVyLT53c2FfX1JlcGx5VG8tPkFkZHJlc3MpCisgICAgcmV0dXJuIHNvYXBfc2VuZGVyX2ZhdWx0KHNvYXAsICJObyBXUy1BZGRyZXNzaW5nIFJlcGx5VG8gYWRkcmVzcyIsIE5VTEwpOworICBzb2FwLT5oZWFkZXItPndzYV9fVG8gPSBzb2FwLT5oZWFkZXItPndzYV9fUmVwbHlUby0+QWRkcmVzczsKKyAgc29hcC0+aGVhZGVyLT53c2FfX01lc3NhZ2VJRCA9ICIuLi4iOworICBzb2FwLT5oZWFkZXItPndzYV9fQWN0aW9uID0gIi4uLiI7CisgIC4uLgorCisqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogSW1wb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogU2NoZW1hIE5hbWVzcGFjZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy9nc29hcCB3c2EgICBzY2hlbWEgaW1wb3J0OglodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmcKKy8vZ3NvYXAgd3NhICAgc2NoZW1hIGVsZW1lbnRGb3JtOglxdWFsaWZpZWQKKy8vZ3NvYXAgd3NhICAgc2NoZW1hIGF0dHJpYnV0ZUZvcm06CXVucXVhbGlmaWVkCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBTY2hlbWEgVHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKworLy8vIFR5cGVkZWYgc3lub255bSBmb3Igc3RydWN0IHdzYV9fRW5kcG9pbnRSZWZlcmVuY2VUeXBlLgordHlwZWRlZiBzdHJ1Y3Qgd3NhX19FbmRwb2ludFJlZmVyZW5jZVR5cGUgd3NhX19FbmRwb2ludFJlZmVyZW5jZVR5cGU7CisKKy8vLyBUeXBlZGVmIHN5bm9ueW0gZm9yIHN0cnVjdCB3c2FfX1JlZmVyZW5jZVByb3BlcnRpZXNUeXBlLgordHlwZWRlZiBzdHJ1Y3Qgd3NhX19SZWZlcmVuY2VQcm9wZXJ0aWVzVHlwZSB3c2FfX1JlZmVyZW5jZVByb3BlcnRpZXNUeXBlOworCisvLy8gVHlwZWRlZiBzeW5vbnltIGZvciBzdHJ1Y3Qgd3NhX19SZWZlcmVuY2VQYXJhbWV0ZXJzVHlwZS4KK3R5cGVkZWYgc3RydWN0IHdzYV9fUmVmZXJlbmNlUGFyYW1ldGVyc1R5cGUgd3NhX19SZWZlcmVuY2VQYXJhbWV0ZXJzVHlwZTsKKworLy8vIFR5cGVkZWYgc3lub255bSBmb3Igc3RydWN0IHdzYV9fU2VydmljZU5hbWVUeXBlLgordHlwZWRlZiBzdHJ1Y3Qgd3NhX19TZXJ2aWNlTmFtZVR5cGUgd3NhX19TZXJ2aWNlTmFtZVR5cGU7CisKKy8vLyBUeXBlZGVmIHN5bm9ueW0gZm9yIHN0cnVjdCB3c2FfX1JlbGF0aW9uc2hpcC4KK3R5cGVkZWYgc3RydWN0IHdzYV9fUmVsYXRpb25zaGlwIHdzYV9fUmVsYXRpb25zaGlwOworCisvLy8gSW1wb3J0ZWQgY29tcGxleFR5cGUgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyI6UmVwbHlBZnRlclR5cGUgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LgorLy8vIGNvbXBsZXhUeXBlIGRlZmluaXRpb24gaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rLgorCisvLy8gSW1wb3J0ZWQgY29tcGxleFR5cGUgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyI6QXR0cmlidXRlZFFOYW1lIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4KKy8vLyBjb21wbGV4VHlwZSBkZWZpbml0aW9uIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4KKworLy8vIEltcG9ydGVkIGNvbXBsZXhUeXBlICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciOkF0dHJpYnV0ZWRVUkkgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LgorLy8vIGNvbXBsZXhUeXBlIGRlZmluaXRpb24gaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rLgorCisvLy8gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyI6UmVsYXRpb25zaGlwVHlwZVZhbHVlcyBpcyBhIHNpbXBsZVR5cGUgcmVzdHJpY3Rpb24gb2YgeHM6UU5hbWUuCisvLy8gTm90ZTogZW51bSB2YWx1ZXMgYXJlIHByZWZpeGVkIHdpdGggJ3dzYV9fUmVsYXRpb25zaGlwVHlwZVZhbHVlcycgdG8gYXZvaWQgbmFtZSBjbGFzaGVzLCBwbGVhc2UgdXNlIHdzZGwyaCBvcHRpb24gLWUgdG8gb21pdCB0aGlzIHByZWZpeAorZW51bSB3c2FfX1JlbGF0aW9uc2hpcFR5cGVWYWx1ZXMKK3sKKwl3c2FfX1JlbGF0aW9uc2hpcFR5cGVWYWx1ZXNfX3dzYV9fUmVwbHksCS8vLzwgeHM6UU5hbWUgdmFsdWU9IiJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciOlJlcGx5IgorfTsKKy8vLyBUeXBlZGVmIHN5bm9ueW0gZm9yIGVudW0gd3NhX19SZWxhdGlvbnNoaXBUeXBlVmFsdWVzLgordHlwZWRlZiBlbnVtIHdzYV9fUmVsYXRpb25zaGlwVHlwZVZhbHVlcyB3c2FfX1JlbGF0aW9uc2hpcFR5cGVWYWx1ZXM7CisKKy8vLyAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIjpGYXVsdFN1YmNvZGVWYWx1ZXMgaXMgYSBzaW1wbGVUeXBlIHJlc3RyaWN0aW9uIG9mIHhzOlFOYW1lLgorLy8vIE5vdGU6IGVudW0gdmFsdWVzIGFyZSBwcmVmaXhlZCB3aXRoICd3c2FfX0ZhdWx0U3ViY29kZVZhbHVlcycgdG8gYXZvaWQgbmFtZSBjbGFzaGVzLCBwbGVhc2UgdXNlIHdzZGwyaCBvcHRpb24gLWUgdG8gb21pdCB0aGlzIHByZWZpeAorZW51bSB3c2FfX0ZhdWx0U3ViY29kZVZhbHVlcworeworCXdzYV9fRmF1bHRTdWJjb2RlVmFsdWVzX193c2FfX0ludmFsaWRNZXNzYWdlSW5mb3JtYXRpb25IZWFkZXIsCS8vLzwgeHM6UU5hbWUgdmFsdWU9IiJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciOkludmFsaWRNZXNzYWdlSW5mb3JtYXRpb25IZWFkZXIiCisJd3NhX19GYXVsdFN1YmNvZGVWYWx1ZXNfX3dzYV9fTWVzc2FnZUluZm9ybWF0aW9uSGVhZGVyUmVxdWlyZWQsCS8vLzwgeHM6UU5hbWUgdmFsdWU9IiJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciOk1lc3NhZ2VJbmZvcm1hdGlvbkhlYWRlclJlcXVpcmVkIgorCXdzYV9fRmF1bHRTdWJjb2RlVmFsdWVzX193c2FfX0Rlc3RpbmF0aW9uVW5yZWFjaGFibGUsCS8vLzwgeHM6UU5hbWUgdmFsdWU9IiJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciOkRlc3RpbmF0aW9uVW5yZWFjaGFibGUiCisJd3NhX19GYXVsdFN1YmNvZGVWYWx1ZXNfX3dzYV9fQWN0aW9uTm90U3VwcG9ydGVkLAkvLy88IHhzOlFOYW1lIHZhbHVlPSIiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIjpBY3Rpb25Ob3RTdXBwb3J0ZWQiCisJd3NhX19GYXVsdFN1YmNvZGVWYWx1ZXNfX3dzYV9fRW5kcG9pbnRVbmF2YWlsYWJsZSwJLy8vPCB4czpRTmFtZSB2YWx1ZT0iImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyI6RW5kcG9pbnRVbmF2YWlsYWJsZSIKK307CisvLy8gVHlwZWRlZiBzeW5vbnltIGZvciBlbnVtIHdzYV9fRmF1bHRTdWJjb2RlVmFsdWVzLgordHlwZWRlZiBlbnVtIHdzYV9fRmF1bHRTdWJjb2RlVmFsdWVzIHdzYV9fRmF1bHRTdWJjb2RlVmFsdWVzOworCisvLy8gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyI6RW5kcG9pbnRSZWZlcmVuY2VUeXBlIGlzIGEgY29tcGxleFR5cGUuCitzdHJ1Y3Qgd3NhX19FbmRwb2ludFJlZmVyZW5jZVR5cGUKK3sKKy8vLyBFbGVtZW50IEFkZHJlc3Mgb2YgdHlwZSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIjpBdHRyaWJ1dGVkVVJJLgorICAgIGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50LgorLy8vIEVsZW1lbnQgUmVmZXJlbmNlUHJvcGVydGllcyBvZiB0eXBlICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciOlJlZmVyZW5jZVByb3BlcnRpZXNUeXBlLgorICAgIHN0cnVjdCB3c2FfX1JlZmVyZW5jZVByb3BlcnRpZXNUeXBlKiAgUmVmZXJlbmNlUHJvcGVydGllcyAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudC4KKy8vLyBFbGVtZW50IFJlZmVyZW5jZVBhcmFtZXRlcnMgb2YgdHlwZSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIjpSZWZlcmVuY2VQYXJhbWV0ZXJzVHlwZS4KKyAgICBzdHJ1Y3Qgd3NhX19SZWZlcmVuY2VQYXJhbWV0ZXJzVHlwZSogIFJlZmVyZW5jZVBhcmFtZXRlcnMgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQuCisvLy8gRWxlbWVudCBQb3J0VHlwZSBvZiB0eXBlICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciOkF0dHJpYnV0ZWRRTmFtZS4KKyAgICBfUU5hbWUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9ydFR5cGUgICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudC4KKy8vLyBFbGVtZW50IFNlcnZpY2VOYW1lIG9mIHR5cGUgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyI6U2VydmljZU5hbWVUeXBlLgorICAgIHN0cnVjdCB3c2FfX1NlcnZpY2VOYW1lVHlwZSogICAgICAgICBTZXJ2aWNlTmFtZSAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50LgorLy8vIFRPRE86IDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKy8vLyAgICAgICBTY2hlbWEgZXh0ZW5zaWJpbGl0eSBpcyB1c2VyLWRlZmluYWJsZS4KKy8vLyAgICAgICBDb25zdWx0IHRoZSBwcm90b2NvbCBkb2N1bWVudGF0aW9uIHRvIGNoYW5nZSBhbmQvb3IgaW5zZXJ0IGRlY2xhcmF0aW9ucy4KKy8vLyAgICAgICBVc2Ugd3NkbDJoIG9wdGlvbiAteCB0byByZW1vdmUgdGhpcyBlbGVtZW50LgorICAgIF9YTUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2FueSAgICAgICAgICAgICAgICAgICAgICAgICA7CS8vLzwgQ2F0Y2ggYW55IGVsZW1lbnQgY29udGVudCBpbiBYTUwgc3RyaW5nLgorLy8vIFRPRE86IDxhbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIj4KKy8vLyAgICAgICBTY2hlbWEgZXh0ZW5zaWJpbGl0eSBpcyB1c2VyLWRlZmluYWJsZS4KKy8vLyAgICAgICBDb25zdWx0IHRoZSBwcm90b2NvbCBkb2N1bWVudGF0aW9uIHRvIGNoYW5nZSBhbmQvb3IgaW5zZXJ0IGRlY2xhcmF0aW9ucy4KKy8vLyAgICAgICBVc2Ugd3NkbDJoIG9wdGlvbiAteCB0byByZW1vdmUgdGhpcyBhdHRyaWJ1dGUuCisgICBAX1hNTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYW55QXR0cmlidXRlICAgICAgICAgICAgICAgIDsJLy8vPCBDYXRjaCBhbnkgYXR0cmlidXRlIGNvbnRlbnQgaW4gWE1MIHN0cmluZy4KK307CisKKy8vLyAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIjpSZWZlcmVuY2VQcm9wZXJ0aWVzVHlwZSBpcyBhIGNvbXBsZXhUeXBlLgorc3RydWN0IHdzYV9fUmVmZXJlbmNlUHJvcGVydGllc1R5cGUKK3sKKy8vLyBUT0RPOiA8YW55IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorLy8vICAgICAgIFNjaGVtYSBleHRlbnNpYmlsaXR5IGlzIHVzZXItZGVmaW5hYmxlLgorLy8vICAgICAgIENvbnN1bHQgdGhlIHByb3RvY29sIGRvY3VtZW50YXRpb24gdG8gY2hhbmdlIGFuZC9vciBpbnNlcnQgZGVjbGFyYXRpb25zLgorLy8vICAgICAgIFVzZSB3c2RsMmggb3B0aW9uIC14IHRvIHJlbW92ZSB0aGlzIGVsZW1lbnQuCisgICAgX1hNTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYW55ICAgICAgICAgICAgICAgICAgICAgICAgIDsJLy8vPCBDYXRjaCBhbnkgZWxlbWVudCBjb250ZW50IGluIFhNTCBzdHJpbmcuCit9OworCisvLy8gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyI6UmVmZXJlbmNlUGFyYW1ldGVyc1R5cGUgaXMgYSBjb21wbGV4VHlwZS4KK3N0cnVjdCB3c2FfX1JlZmVyZW5jZVBhcmFtZXRlcnNUeXBlCit7CisvLy8gVE9ETzogPGFueSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKy8vLyAgICAgICBTY2hlbWEgZXh0ZW5zaWJpbGl0eSBpcyB1c2VyLWRlZmluYWJsZS4KKy8vLyAgICAgICBDb25zdWx0IHRoZSBwcm90b2NvbCBkb2N1bWVudGF0aW9uIHRvIGNoYW5nZSBhbmQvb3IgaW5zZXJ0IGRlY2xhcmF0aW9ucy4KKy8vLyAgICAgICBVc2Ugd3NkbDJoIG9wdGlvbiAteCB0byByZW1vdmUgdGhpcyBlbGVtZW50LgorICAgIF9YTUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2FueSAgICAgICAgICAgICAgICAgICAgICAgICA7CS8vLzwgQ2F0Y2ggYW55IGVsZW1lbnQgY29udGVudCBpbiBYTUwgc3RyaW5nLgorfTsKKworLy8vICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciOlNlcnZpY2VOYW1lVHlwZSBpcyBhIGNvbXBsZXhUeXBlIHdpdGggc2ltcGxlQ29udGVudC4KK3N0cnVjdCB3c2FfX1NlcnZpY2VOYW1lVHlwZQoreworLy8vIF9faXRlbSB3cmFwcyAneHM6UU5hbWUnIHNpbXBsZUNvbnRlbnQuCisgICAgX1FOYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXRlbSAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBBdHRyaWJ1dGUgUG9ydE5hbWUgb2YgdHlwZSB4czpOQ05hbWUuCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnROYW1lICAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZS4KKy8vLyBUT0RPOiA8YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciI+CisvLy8gICAgICAgU2NoZW1hIGV4dGVuc2liaWxpdHkgaXMgdXNlci1kZWZpbmFibGUuCisvLy8gICAgICAgQ29uc3VsdCB0aGUgcHJvdG9jb2wgZG9jdW1lbnRhdGlvbiB0byBjaGFuZ2UgYW5kL29yIGluc2VydCBkZWNsYXJhdGlvbnMuCisvLy8gICAgICAgVXNlIHdzZGwyaCBvcHRpb24gLXggdG8gcmVtb3ZlIHRoaXMgYXR0cmlidXRlLgorICAgQF9YTUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2FueUF0dHJpYnV0ZSAgICAgICAgICAgICAgICA7CS8vLzwgQ2F0Y2ggYW55IGF0dHJpYnV0ZSBjb250ZW50IGluIFhNTCBzdHJpbmcuCit9OworCisvLy8gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyI6UmVsYXRpb25zaGlwIGlzIGEgY29tcGxleFR5cGUgd2l0aCBzaW1wbGVDb250ZW50Lgorc3RydWN0IHdzYV9fUmVsYXRpb25zaGlwCit7CisvLy8gX19pdGVtIHdyYXBzICd4czphbnlVUkknIHNpbXBsZUNvbnRlbnQuCisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXRlbSAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBBdHRyaWJ1dGUgUmVsYXRpb25zaGlwVHlwZSBvZiB0eXBlIHhzOlFOYW1lLgorICAgQF9RTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXBUeXBlICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUuCisvLy8gVE9ETzogPGFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiPgorLy8vICAgICAgIFNjaGVtYSBleHRlbnNpYmlsaXR5IGlzIHVzZXItZGVmaW5hYmxlLgorLy8vICAgICAgIENvbnN1bHQgdGhlIHByb3RvY29sIGRvY3VtZW50YXRpb24gdG8gY2hhbmdlIGFuZC9vciBpbnNlcnQgZGVjbGFyYXRpb25zLgorLy8vICAgICAgIFVzZSB3c2RsMmggb3B0aW9uIC14IHRvIHJlbW92ZSB0aGlzIGF0dHJpYnV0ZS4KKyAgIEBfWE1MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19hbnlBdHRyaWJ1dGUgICAgICAgICAgICAgICAgOwkvLy88IENhdGNoIGFueSBhdHRyaWJ1dGUgY29udGVudCBpbiBYTUwgc3RyaW5nLgorfTsKKworLy8vIEVsZW1lbnQgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyI6RW5kcG9pbnRSZWZlcmVuY2Ugb2YgY29tcGxleFR5cGUgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyI6RW5kcG9pbnRSZWZlcmVuY2VUeXBlLgordHlwZWRlZiBzdHJ1Y3Qgd3NhX19FbmRwb2ludFJlZmVyZW5jZVR5cGUgX3dzYV9fRW5kcG9pbnRSZWZlcmVuY2U7CisKKy8vLyBFbGVtZW50ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciOk1lc3NhZ2VJRCBvZiBjb21wbGV4VHlwZSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIjpBdHRyaWJ1dGVkVVJJLgordHlwZWRlZiBjaGFyKiBfd3NhX19NZXNzYWdlSUQ7CisKKy8vLyBFbGVtZW50ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciOlJlbGF0ZXNUbyBvZiBjb21wbGV4VHlwZSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIjpSZWxhdGlvbnNoaXAuCit0eXBlZGVmIHN0cnVjdCB3c2FfX1JlbGF0aW9uc2hpcCBfd3NhX19SZWxhdGVzVG87CisKKy8vLyBFbGVtZW50ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciOlRvIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciOkF0dHJpYnV0ZWRVUkkuCit0eXBlZGVmIGNoYXIqIF93c2FfX1RvOworCisvLy8gRWxlbWVudCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIjpBY3Rpb24gb2YgY29tcGxleFR5cGUgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyI6QXR0cmlidXRlZFVSSS4KK3R5cGVkZWYgY2hhciogX3dzYV9fQWN0aW9uOworCisvLy8gRWxlbWVudCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIjpGcm9tIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciOkVuZHBvaW50UmVmZXJlbmNlVHlwZS4KK3R5cGVkZWYgc3RydWN0IHdzYV9fRW5kcG9pbnRSZWZlcmVuY2VUeXBlIF93c2FfX0Zyb207CisKKy8vLyBFbGVtZW50ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciOlJlcGx5VG8gb2YgY29tcGxleFR5cGUgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyI6RW5kcG9pbnRSZWZlcmVuY2VUeXBlLgordHlwZWRlZiBzdHJ1Y3Qgd3NhX19FbmRwb2ludFJlZmVyZW5jZVR5cGUgX3dzYV9fUmVwbHlUbzsKKworLy8vIEVsZW1lbnQgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyI6RmF1bHRUbyBvZiBjb21wbGV4VHlwZSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIjpFbmRwb2ludFJlZmVyZW5jZVR5cGUuCit0eXBlZGVmIHN0cnVjdCB3c2FfX0VuZHBvaW50UmVmZXJlbmNlVHlwZSBfd3NhX19GYXVsdFRvOworCisvLy8gRWxlbWVudCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIjpSZXBseUFmdGVyIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciOlJlcGx5QWZ0ZXJUeXBlLgordHlwZWRlZiB1bnNpZ25lZCBpbnQgX3dzYV9fUmVwbHlBZnRlcjsKKworLy8vIEF0dHJpYnV0ZSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIjpBY3Rpb24gb2Ygc2ltcGxlVHlwZSB4czphbnlVUkkuCisvLy8gJ193c2FfX0FjdGlvbicgYXR0cmlidXRlIGRlZmluaXRpb24gaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rLgorCisvKiBFbmQgb2Ygd3NhLmggKi8KZGlmZiAtLWdpdCBhL2ltcG9ydC93c2EzLmggYi9pbXBvcnQvd3NhMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZTk3ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9pbXBvcnQvd3NhMy5oCkBAIC0wLDAgKzEsMTY3IEBACisvKgorCit3c2EzLmgKKworVGhpcyBpcyBhbiBvbGRlciB2ZXJzaW9uIG9mIHRoZSBXUy1BZGRyZXNzaW5nIHNwZWMuIFNlZSB3c2EuaCBmb3IgbW9yZSBkZXRhaWxzLgorCitHZW5lcmF0ZWQgd2l0aDoKK3dzZGwyaCAtY2d5IC1vIHdzYTMuaCAtdCBXUy9XUy10eXBlbWFwLmRhdCBXUy9XUy1BZGRyZXNzaW5nMDMueHNkCisKK01vZGlmaWVkIGJ5IFJvYmVydCB2YW4gRW5nZWxlbjoKKworLSBSZW1vdmVkIC8vZ3NvYXBvcHQKKy0gQWRkZWQgdGhlIGZvbGxvd2luZyBkaXJlY3RpdmUgdG8gaW1wb3J0IFdTLUFkZHJlc3NpbmcgbmFtZXNwYWNlOgorICAvL2dzb2FwIHdzYTMgc2NoZW1hIGltcG9ydDogaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMy8wMy9hZGRyZXNzaW5nCisgIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBXUy1BZGRyZXNzaW5nIHNjaGVtYXMgYXJlIG5vdCBjb3BpZWQgaW50byB0aGUgZ2VuZXJhdGVkCisgIFdTREwgYnkgc29hcGNwcDIgYnV0IGFyZSByZWZlcmVuY2VkIHdpdGggc2NoZW1hIGltcG9ydCBpbiB0aGUgZ2VuZXJhdGVkIFdTREwuCisKKyovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAzLzAzL2FkZHJlc3NpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBJbXBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBTY2hlbWEgTmFtZXNwYWNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvL2dzb2FwIHdzYTMgIHNjaGVtYSBpbXBvcnQ6CWh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDMvMDMvYWRkcmVzc2luZworLy9nc29hcCB3c2EzICBzY2hlbWEgZWxlbWVudEZvcm06CXF1YWxpZmllZAorLy9nc29hcCB3c2EzICBzY2hlbWEgYXR0cmlidXRlRm9ybToJdW5xdWFsaWZpZWQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFNjaGVtYSBUeXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCisvLy8gVHlwZWRlZiBzeW5vbnltIGZvciBzdHJ1Y3Qgd3NhM19fRW5kcG9pbnRSZWZlcmVuY2VUeXBlLgordHlwZWRlZiBzdHJ1Y3Qgd3NhM19fRW5kcG9pbnRSZWZlcmVuY2VUeXBlIHdzYTNfX0VuZHBvaW50UmVmZXJlbmNlVHlwZTsKKworLy8vIFR5cGVkZWYgc3lub255bSBmb3Igc3RydWN0IHdzYTNfX1JlZmVyZW5jZVByb3BlcnRpZXNUeXBlLgordHlwZWRlZiBzdHJ1Y3Qgd3NhM19fUmVmZXJlbmNlUHJvcGVydGllc1R5cGUgd3NhM19fUmVmZXJlbmNlUHJvcGVydGllc1R5cGU7CisKKy8vLyBUeXBlZGVmIHN5bm9ueW0gZm9yIHN0cnVjdCB3c2EzX19TZXJ2aWNlTmFtZVR5cGUuCit0eXBlZGVmIHN0cnVjdCB3c2EzX19TZXJ2aWNlTmFtZVR5cGUgd3NhM19fU2VydmljZU5hbWVUeXBlOworCisvLy8gVHlwZWRlZiBzeW5vbnltIGZvciBzdHJ1Y3Qgd3NhM19fUmVsYXRpb25zaGlwLgordHlwZWRlZiBzdHJ1Y3Qgd3NhM19fUmVsYXRpb25zaGlwIHdzYTNfX1JlbGF0aW9uc2hpcDsKKworLy8vIEltcG9ydGVkIGNvbXBsZXhUeXBlICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAzLzAzL2FkZHJlc3NpbmciOkF0dHJpYnV0ZWRRTmFtZSBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuCisvLy8gY29tcGxleFR5cGUgZGVmaW5pdGlvbiBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsuCisKKy8vLyBJbXBvcnRlZCBjb21wbGV4VHlwZSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMy8wMy9hZGRyZXNzaW5nIjpBdHRyaWJ1dGVkVVJJIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4KKy8vLyBjb21wbGV4VHlwZSBkZWZpbml0aW9uIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4KKworLy8vICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAzLzAzL2FkZHJlc3NpbmciOlJlbGF0aW9uc2hpcFR5cGVWYWx1ZXMgaXMgYSBzaW1wbGVUeXBlIHJlc3RyaWN0aW9uIG9mIHhzOlFOYW1lLgorLy8vIE5vdGU6IGVudW0gdmFsdWVzIGFyZSBwcmVmaXhlZCB3aXRoICd3c2EzX19SZWxhdGlvbnNoaXBUeXBlVmFsdWVzJyB0byBhdm9pZCBuYW1lIGNsYXNoZXMsIHBsZWFzZSB1c2Ugd3NkbDJoIG9wdGlvbiAtZSB0byBvbWl0IHRoaXMgcHJlZml4CitlbnVtIHdzYTNfX1JlbGF0aW9uc2hpcFR5cGVWYWx1ZXMKK3sKKwl3c2EzX19SZWxhdGlvbnNoaXBUeXBlVmFsdWVzX193c2EzX19SZXNwb25zZSwJLy8vPCB4czpRTmFtZSB2YWx1ZT0iImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDMvMDMvYWRkcmVzc2luZyI6UmVzcG9uc2UiCit9OworLy8vIFR5cGVkZWYgc3lub255bSBmb3IgZW51bSB3c2EzX19SZWxhdGlvbnNoaXBUeXBlVmFsdWVzLgordHlwZWRlZiBlbnVtIHdzYTNfX1JlbGF0aW9uc2hpcFR5cGVWYWx1ZXMgd3NhM19fUmVsYXRpb25zaGlwVHlwZVZhbHVlczsKKworLy8vICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAzLzAzL2FkZHJlc3NpbmciOkVuZHBvaW50UmVmZXJlbmNlVHlwZSBpcyBhIGNvbXBsZXhUeXBlLgorc3RydWN0IHdzYTNfX0VuZHBvaW50UmVmZXJlbmNlVHlwZQoreworLy8vIEVsZW1lbnQgQWRkcmVzcyBvZiB0eXBlICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAzLzAzL2FkZHJlc3NpbmciOkF0dHJpYnV0ZWRVUkkuCisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQuCisvLy8gRWxlbWVudCBSZWZlcmVuY2VQcm9wZXJ0aWVzIG9mIHR5cGUgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDMvMDMvYWRkcmVzc2luZyI6UmVmZXJlbmNlUHJvcGVydGllc1R5cGUuCisgICAgc3RydWN0IHdzYTNfX1JlZmVyZW5jZVByb3BlcnRpZXNUeXBlKiAgUmVmZXJlbmNlUHJvcGVydGllcyAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudC4KKy8vLyBFbGVtZW50IFBvcnRUeXBlIG9mIHR5cGUgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDMvMDMvYWRkcmVzc2luZyI6QXR0cmlidXRlZFFOYW1lLgorICAgIF9RTmFtZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0VHlwZSAgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50LgorLy8vIEVsZW1lbnQgU2VydmljZU5hbWUgb2YgdHlwZSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMy8wMy9hZGRyZXNzaW5nIjpTZXJ2aWNlTmFtZVR5cGUuCisgICAgc3RydWN0IHdzYTNfX1NlcnZpY2VOYW1lVHlwZSogICAgICAgIFNlcnZpY2VOYW1lICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQuCisvLy8gVE9ETzogPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorLy8vICAgICAgIFNjaGVtYSBleHRlbnNpYmlsaXR5IGlzIHVzZXItZGVmaW5hYmxlLgorLy8vICAgICAgIENvbnN1bHQgdGhlIHByb3RvY29sIGRvY3VtZW50YXRpb24gdG8gY2hhbmdlIGFuZC9vciBpbnNlcnQgZGVjbGFyYXRpb25zLgorLy8vICAgICAgIFVzZSB3c2RsMmggb3B0aW9uIC14IHRvIHJlbW92ZSB0aGlzIGVsZW1lbnQuCisgICAgX1hNTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYW55ICAgICAgICAgICAgICAgICAgICAgICAgIDsJLy8vPCBDYXRjaCBhbnkgZWxlbWVudCBjb250ZW50IGluIFhNTCBzdHJpbmcuCisvLy8gVE9ETzogPGFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiPgorLy8vICAgICAgIFNjaGVtYSBleHRlbnNpYmlsaXR5IGlzIHVzZXItZGVmaW5hYmxlLgorLy8vICAgICAgIENvbnN1bHQgdGhlIHByb3RvY29sIGRvY3VtZW50YXRpb24gdG8gY2hhbmdlIGFuZC9vciBpbnNlcnQgZGVjbGFyYXRpb25zLgorLy8vICAgICAgIFVzZSB3c2RsMmggb3B0aW9uIC14IHRvIHJlbW92ZSB0aGlzIGF0dHJpYnV0ZS4KKyAgIEBfWE1MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19hbnlBdHRyaWJ1dGUgICAgICAgICAgICAgICAgOwkvLy88IENhdGNoIGFueSBhdHRyaWJ1dGUgY29udGVudCBpbiBYTUwgc3RyaW5nLgorfTsKKworLy8vICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAzLzAzL2FkZHJlc3NpbmciOlJlZmVyZW5jZVByb3BlcnRpZXNUeXBlIGlzIGEgY29tcGxleFR5cGUuCitzdHJ1Y3Qgd3NhM19fUmVmZXJlbmNlUHJvcGVydGllc1R5cGUKK3sKKy8vLyBUT0RPOiA8YW55IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorLy8vICAgICAgIFNjaGVtYSBleHRlbnNpYmlsaXR5IGlzIHVzZXItZGVmaW5hYmxlLgorLy8vICAgICAgIENvbnN1bHQgdGhlIHByb3RvY29sIGRvY3VtZW50YXRpb24gdG8gY2hhbmdlIGFuZC9vciBpbnNlcnQgZGVjbGFyYXRpb25zLgorLy8vICAgICAgIFVzZSB3c2RsMmggb3B0aW9uIC14IHRvIHJlbW92ZSB0aGlzIGVsZW1lbnQuCisgICAgX1hNTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYW55ICAgICAgICAgICAgICAgICAgICAgICAgIDsJLy8vPCBDYXRjaCBhbnkgZWxlbWVudCBjb250ZW50IGluIFhNTCBzdHJpbmcuCit9OworCisvLy8gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDMvMDMvYWRkcmVzc2luZyI6U2VydmljZU5hbWVUeXBlIGlzIGEgY29tcGxleFR5cGUgd2l0aCBzaW1wbGVDb250ZW50Lgorc3RydWN0IHdzYTNfX1NlcnZpY2VOYW1lVHlwZQoreworLy8vIF9faXRlbSB3cmFwcyAneHM6UU5hbWUnIHNpbXBsZUNvbnRlbnQuCisgICAgX1FOYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXRlbSAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBBdHRyaWJ1dGUgUG9ydE5hbWUgb2YgdHlwZSB4czpOQ05hbWUuCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnROYW1lICAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZS4KKy8vLyBUT0RPOiA8YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciI+CisvLy8gICAgICAgU2NoZW1hIGV4dGVuc2liaWxpdHkgaXMgdXNlci1kZWZpbmFibGUuCisvLy8gICAgICAgQ29uc3VsdCB0aGUgcHJvdG9jb2wgZG9jdW1lbnRhdGlvbiB0byBjaGFuZ2UgYW5kL29yIGluc2VydCBkZWNsYXJhdGlvbnMuCisvLy8gICAgICAgVXNlIHdzZGwyaCBvcHRpb24gLXggdG8gcmVtb3ZlIHRoaXMgYXR0cmlidXRlLgorICAgQF9YTUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2FueUF0dHJpYnV0ZSAgICAgICAgICAgICAgICA7CS8vLzwgQ2F0Y2ggYW55IGF0dHJpYnV0ZSBjb250ZW50IGluIFhNTCBzdHJpbmcuCit9OworCisvLy8gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDMvMDMvYWRkcmVzc2luZyI6UmVsYXRpb25zaGlwIGlzIGEgY29tcGxleFR5cGUgd2l0aCBzaW1wbGVDb250ZW50Lgorc3RydWN0IHdzYTNfX1JlbGF0aW9uc2hpcAoreworLy8vIF9faXRlbSB3cmFwcyAneHM6YW55VVJJJyBzaW1wbGVDb250ZW50LgorICAgIGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2l0ZW0gICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gQXR0cmlidXRlIFJlbGF0aW9uc2hpcFR5cGUgb2YgdHlwZSB4czpRTmFtZS4KKyAgIEBfUU5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwVHlwZSAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlLgorLy8vIFRPRE86IDxhbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIj4KKy8vLyAgICAgICBTY2hlbWEgZXh0ZW5zaWJpbGl0eSBpcyB1c2VyLWRlZmluYWJsZS4KKy8vLyAgICAgICBDb25zdWx0IHRoZSBwcm90b2NvbCBkb2N1bWVudGF0aW9uIHRvIGNoYW5nZSBhbmQvb3IgaW5zZXJ0IGRlY2xhcmF0aW9ucy4KKy8vLyAgICAgICBVc2Ugd3NkbDJoIG9wdGlvbiAteCB0byByZW1vdmUgdGhpcyBhdHRyaWJ1dGUuCisgICBAX1hNTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYW55QXR0cmlidXRlICAgICAgICAgICAgICAgIDsJLy8vPCBDYXRjaCBhbnkgYXR0cmlidXRlIGNvbnRlbnQgaW4gWE1MIHN0cmluZy4KK307CisKKy8vLyBFbGVtZW50ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAzLzAzL2FkZHJlc3NpbmciOkVuZHBvaW50UmVmZXJlbmNlIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAzLzAzL2FkZHJlc3NpbmciOkVuZHBvaW50UmVmZXJlbmNlVHlwZS4KK3R5cGVkZWYgc3RydWN0IHdzYTNfX0VuZHBvaW50UmVmZXJlbmNlVHlwZSBfd3NhM19fRW5kcG9pbnRSZWZlcmVuY2U7CisKKy8vLyBFbGVtZW50ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAzLzAzL2FkZHJlc3NpbmciOk1lc3NhZ2VJRCBvZiBjb21wbGV4VHlwZSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMy8wMy9hZGRyZXNzaW5nIjpBdHRyaWJ1dGVkVVJJLgordHlwZWRlZiBjaGFyKiBfd3NhM19fTWVzc2FnZUlEOworCisvLy8gRWxlbWVudCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMy8wMy9hZGRyZXNzaW5nIjpSZWxhdGVzVG8gb2YgY29tcGxleFR5cGUgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDMvMDMvYWRkcmVzc2luZyI6UmVsYXRpb25zaGlwLgordHlwZWRlZiBzdHJ1Y3Qgd3NhM19fUmVsYXRpb25zaGlwIF93c2EzX19SZWxhdGVzVG87CisKKy8vLyBFbGVtZW50ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAzLzAzL2FkZHJlc3NpbmciOlRvIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAzLzAzL2FkZHJlc3NpbmciOkF0dHJpYnV0ZWRVUkkuCit0eXBlZGVmIGNoYXIqIF93c2EzX19UbzsKKworLy8vIEVsZW1lbnQgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDMvMDMvYWRkcmVzc2luZyI6QWN0aW9uIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAzLzAzL2FkZHJlc3NpbmciOkF0dHJpYnV0ZWRVUkkuCit0eXBlZGVmIGNoYXIqIF93c2EzX19BY3Rpb247CisKKy8vLyBFbGVtZW50ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAzLzAzL2FkZHJlc3NpbmciOkZyb20gb2YgY29tcGxleFR5cGUgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDMvMDMvYWRkcmVzc2luZyI6RW5kcG9pbnRSZWZlcmVuY2VUeXBlLgordHlwZWRlZiBzdHJ1Y3Qgd3NhM19fRW5kcG9pbnRSZWZlcmVuY2VUeXBlIF93c2EzX19Gcm9tOworCisvLy8gRWxlbWVudCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMy8wMy9hZGRyZXNzaW5nIjpSZXBseVRvIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAzLzAzL2FkZHJlc3NpbmciOkVuZHBvaW50UmVmZXJlbmNlVHlwZS4KK3R5cGVkZWYgc3RydWN0IHdzYTNfX0VuZHBvaW50UmVmZXJlbmNlVHlwZSBfd3NhM19fUmVwbHlUbzsKKworLy8vIEVsZW1lbnQgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDMvMDMvYWRkcmVzc2luZyI6RmF1bHRUbyBvZiBjb21wbGV4VHlwZSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMy8wMy9hZGRyZXNzaW5nIjpFbmRwb2ludFJlZmVyZW5jZVR5cGUuCit0eXBlZGVmIHN0cnVjdCB3c2EzX19FbmRwb2ludFJlZmVyZW5jZVR5cGUgX3dzYTNfX0ZhdWx0VG87CisKKy8vLyBFbGVtZW50ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAzLzAzL2FkZHJlc3NpbmciOlJlY2lwaWVudCBvZiBjb21wbGV4VHlwZSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMy8wMy9hZGRyZXNzaW5nIjpFbmRwb2ludFJlZmVyZW5jZVR5cGUuCit0eXBlZGVmIHN0cnVjdCB3c2EzX19FbmRwb2ludFJlZmVyZW5jZVR5cGUgX3dzYTNfX1JlY2lwaWVudDsKKworLyogRW5kIG9mIHdzYTMuaCAqLwpkaWZmIC0tZ2l0IGEvaW1wb3J0L3dzcC5oIGIvaW1wb3J0L3dzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNmFkNTIKLS0tIC9kZXYvbnVsbAorKysgYi9pbXBvcnQvd3NwLmgKQEAgLTAsMCArMSwxODIgQEAKKy8qCisKK3dzcC5oCisKK0dlbmVyYXRlZCB3aXRoOgord3NkbDJoIC1jIC14IC1vIHdzcC5oIC10IFdTL1dTLXR5cGVtYXAuZGF0IFdTL1dTLVBvbGljeS54c2QKKworTW9kaWZpZWQgYnkgUm9iZXJ0IHZhbiBFbmdlbGVuOgorCistIFJlbW92ZWQgLy9nc29hcG9wdAorLSBSZW1vdmVkICNpbXBvcnQgIndzdS5oIiBzaW5jZSBvbmx5IHdzdV9fSWQgaXMgbmVlZGVkCistIFJlbW92ZWQgd3N1X19JZCwgc2luY2UgdGhpcyB0eXBlIGlzIGRlZmluZWQgaW4gd3NzZS5oCistIFJlbW92ZWQgZW51bSB4c2RfX2Jvb2xlYW5fCistIEFkZGVkIC8vZ3NvYXAgd3N1IHNjaGVtYSBpbXBvcnQ6IGh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS11dGlsaXR5LTEuMC54c2QKKy0gQWRkZWQgLy9nc29hcCB3c3Agc2NoZW1hIGltcG9ydDogaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9wb2xpY3kKKy0gQWRkZWQgI2ltcG9ydCAid3NzZS5oIgorLSBNb2RpZmllZCB3c3BfX3VuaW9uXzEvXzIvXzMgdG8gaW5jbHVkZSB3c3NlIGVsZW1lbnRzCistIEFkZGVkIHdzc2UgZWxlbWVudHMgdG8gd3NwX191bmlvbl8xIGFuZCBfMgorCisqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9wb2xpY3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEltcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbXBvcnQgIndzc2UuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFNjaGVtYSBOYW1lc3BhY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vZ3NvYXAgd3N1IHNjaGVtYSBpbXBvcnQ6IGh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS11dGlsaXR5LTEuMC54c2QKKworLy9nc29hcCB3c3AgICBzY2hlbWEgaW1wb3J0OglodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA5L3BvbGljeQorLy9nc29hcCB3c3AgICBzY2hlbWEgZWxlbWVudEZvcm06CXF1YWxpZmllZAorLy9nc29hcCB3c3AgICBzY2hlbWEgYXR0cmlidXRlRm9ybToJdW5xdWFsaWZpZWQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFNjaGVtYSBUeXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLy8vIEJ1aWx0LWluIHR5cGUgInhzOmJhc2U2NEJpbmFyeSIKK3N0cnVjdCB4c2RfX2Jhc2U2NEJpbmFyeV8geyB1bnNpZ25lZCBjaGFyICpfX3B0cjsgaW50IF9fc2l6ZTsgfTsKKworCisvLy8gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDkvcG9saWN5IjpQb2xpY3lVUklzIGlzIGEgc2ltcGxlVHlwZSBjb250YWluaW5nIGEgd2hpdGVzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiB4czphbnlVUkkuCit0eXBlZGVmIGNoYXIqIF93c3BfX1BvbGljeVVSSXM7CisKKy8vLyBNb2RpZmllZCB3c3BfX3VuaW9uXzEgdG8gYWRkIHdzc2UgZWxlbWVudHMKK3VuaW9uIHdzcF9fdW5pb25fMQoreworLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA5L3BvbGljeSI6UG9saWN5CisgICAgc3RydWN0IF93c3BfX1BvbGljeSogICAgICAgICAgICAgICAgIFBvbGljeSAgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9wb2xpY3kiOkFsbAorICAgIHN0cnVjdCB3c3BfX09wZXJhdG9yQ29udGVudFR5cGUqICAgICBBbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gRWxlbWVudCByZWZlcmVuY2UgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDkvcG9saWN5IjpFeGFjdGx5T25lCisgICAgc3RydWN0IHdzcF9fT3BlcmF0b3JDb250ZW50VHlwZSogICAgIEV4YWN0bHlPbmUgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9wb2xpY3kiOlBvbGljeVJlZmVyZW5jZQorICAgIHN0cnVjdCBfd3NwX19Qb2xpY3lSZWZlcmVuY2UqICAgICAgICBQb2xpY3lSZWZlcmVuY2UgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisKKy8vLyBBZGRlZCB3c3NlOkNvbmZpZGVudGlhbGl0eSBlbGVtZW50CisgICAgc3RydWN0IHdzc2VfX0NvbmZpZGVudGlhbGl0eSogICAgICAgIHdzc2VfX0NvbmZpZGVudGlhbGl0eSAgICAgICAgICAxOworLy8vIEFkZGVkIHdzc2U6U2VjdXJpdHlIZWFkZXIgZWxlbWVudAorICAgIHN0cnVjdCB3c3NlX19TZWN1cml0eUhlYWRlciogICAgICAgICB3c3NlX19TZWN1cml0eUhlYWRlciAgICAgICAgICAgMTsKKy8vLyBBZGRlZCB3c3NlOlNlY3VyaXR5VG9rZW4gZWxlbWVudAorICAgIHN0cnVjdCB3c3NlX19TZWN1cml0eVRva2VuKiAgICAgICAgICB3c3NlX19TZWN1cml0eVRva2VuICAgICAgICAgICAgMTsKK307CisKKy8vLyBNb2RpZmllZCBfX3dzcF9fdW5pb25fMSBieSByZW1vdmluZyBkdXBsaWNhdGUgX193c3BfX3VuaW9uXzMKK3N0cnVjdCBfX3dzcF9fdW5pb25fMQoreworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3VuaW9uXzEgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBVbmlvbiB3c3BfX3VuaW9uXzEgc2VsZWN0b3I6IHNldCB0byBTT0FQX1VOSU9OX3dzcF9fdW5pb25fMV88ZmllbGRuYW1lPiBvciAwCisgICAgdW5pb24gd3NwX191bmlvbl8xICAgICAgICAgICAgICAgICAgKnVuaW9uXzEgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9wb2xpY3kiOk9wZXJhdG9yQ29udGVudFR5cGUgaXMgYSBjb21wbGV4VHlwZS4KK3N0cnVjdCB3c3BfX09wZXJhdG9yQ29udGVudFR5cGUKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zaXpldW5pb25fMSAgICAgICAgICAgICAgICAgIDA7CisgICAgc3RydWN0IF9fd3NwX191bmlvbl8xICAgICAgICAgICAgICAgKl9fdW5pb25fMSAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9wb2xpY3kiOlBvbGljeVJlZmVyZW5jZSBpcyBhIGNvbXBsZXhUeXBlLgorc3RydWN0IF93c3BfX1BvbGljeVJlZmVyZW5jZQoreworLy8vIEF0dHJpYnV0ZSBVUkkgb2YgdHlwZSB4czphbnlVUkkKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJJICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIERpZ2VzdCBvZiB0eXBlIHhzOmJhc2U2NEJpbmFyeQorICAgQHN0cnVjdCB4c2RfX2Jhc2U2NEJpbmFyeV8qICAgICAgICAgICBEaWdlc3QgICAgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgRGlnZXN0QWxnb3JpdGhtIG9mIHR5cGUgeHM6YW55VVJJCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpZ2VzdEFsZ29yaXRobSAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIFRPRE86IDxhbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI2FueSI+CisvLy8gICAgICAgU2NoZW1hIGV4dGVuc2liaWxpdHkgaXMgdXNlci1kZWZpbmFibGUuCisvLy8gICAgICAgQ29uc3VsdCB0aGUgcHJvdG9jb2wgZG9jdW1lbnRhdGlvbiB0byBjaGFuZ2UgYW5kL29yIGluc2VydCBkZWNsYXJhdGlvbnMuCisvLy8gICAgICAgVXNlIHdzZGwyaCBvcHRpb24gLXggdG8gcmVtb3ZlIHRoaXMgYXR0cmlidXRlLgorfTsKKworLy8vICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA5L3BvbGljeSI6VXNpbmdQb2xpY3kgaXMgYSBjb21wbGV4VHlwZS4KK3N0cnVjdCBfd3NwX19Vc2luZ1BvbGljeQoreworLy8vIFRPRE86IDxhbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI2FueSI+CisvLy8gICAgICAgU2NoZW1hIGV4dGVuc2liaWxpdHkgaXMgdXNlci1kZWZpbmFibGUuCisvLy8gICAgICAgQ29uc3VsdCB0aGUgcHJvdG9jb2wgZG9jdW1lbnRhdGlvbiB0byBjaGFuZ2UgYW5kL29yIGluc2VydCBkZWNsYXJhdGlvbnMuCisvLy8gICAgICAgVXNlIHdzZGwyaCBvcHRpb24gLXggdG8gcmVtb3ZlIHRoaXMgYXR0cmlidXRlLgorfTsKKworLy8vIE1vZGlmaWVkIHdzcF9fdW5pb25fMgordW5pb24gd3NwX191bmlvbl8yCit7CisvLy8gRWxlbWVudCByZWZlcmVuY2UgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDkvcG9saWN5IjpQb2xpY3kKKyAgICBzdHJ1Y3QgX3dzcF9fUG9saWN5KiAgICAgICAgICAgICAgICAgUG9saWN5ICAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA5L3BvbGljeSI6UG9saWN5UmVmZXJlbmNlCisgICAgc3RydWN0IF93c3BfX1BvbGljeVJlZmVyZW5jZSogICAgICAgIFBvbGljeVJlZmVyZW5jZSAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKK307CisKKy8vIE1vZGlmaWVkIF9fd3NwX191bmlvbl8yCitzdHJ1Y3QgX193c3BfX3VuaW9uXzIKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191bmlvbl8yICAgICAgICAgICAgICAgICAgICAgOwkvLy88IFVuaW9uIHdzcF9fdW5pb25fMiBzZWxlY3Rvcjogc2V0IHRvIFNPQVBfVU5JT05fd3NwX191bmlvbl8yXzxmaWVsZG5hbWU+CisgICAgdW5pb24gd3NwX191bmlvbl8yICAgICAgICAgICAgICAgICAgIHVuaW9uXzIgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9wb2xpY3kiOlBvbGljeUF0dGFjaG1lbnQgaXMgYSBjb21wbGV4VHlwZS4KK3N0cnVjdCBfd3NwX19Qb2xpY3lBdHRhY2htZW50Cit7CisvLy8gRWxlbWVudCByZWZlcmVuY2UgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDkvcG9saWN5IjpBcHBsaWVzVG8KKyAgICBzdHJ1Y3QgX3dzcF9fQXBwbGllc1RvKiAgICAgICAgICAgICAgQXBwbGllc1RvICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIENIT0lDRSBPRiBFTEVNRU5UUyA8Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zaXpldW5pb25fMiAgICAgICAgICAgICAgICAgOworICAgIHN0cnVjdCBfX3dzcF9fdW5pb25fMiAgICAgICAgICAgICAgICpfX3VuaW9uXzIgICAgICAgICAgICAgICAgICAgICA7CisvLy8gVE9ETzogPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorLy8vICAgICAgIFNjaGVtYSBleHRlbnNpYmlsaXR5IGlzIHVzZXItZGVmaW5hYmxlLgorLy8vICAgICAgIENvbnN1bHQgdGhlIHByb3RvY29sIGRvY3VtZW50YXRpb24gdG8gY2hhbmdlIGFuZC9vciBpbnNlcnQgZGVjbGFyYXRpb25zLgorLy8vICAgICAgIFVzZSB3c2RsMmggb3B0aW9uIC14IHRvIHJlbW92ZSB0aGlzIGVsZW1lbnQuCisvLy8gVE9ETzogPGFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjYW55Ij4KKy8vLyAgICAgICBTY2hlbWEgZXh0ZW5zaWJpbGl0eSBpcyB1c2VyLWRlZmluYWJsZS4KKy8vLyAgICAgICBDb25zdWx0IHRoZSBwcm90b2NvbCBkb2N1bWVudGF0aW9uIHRvIGNoYW5nZSBhbmQvb3IgaW5zZXJ0IGRlY2xhcmF0aW9ucy4KKy8vLyAgICAgICBVc2Ugd3NkbDJoIG9wdGlvbiAteCB0byByZW1vdmUgdGhpcyBhdHRyaWJ1dGUuCit9OworCisvLy8gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDkvcG9saWN5IjpBcHBsaWVzVG8gaXMgYSBjb21wbGV4VHlwZS4KK3N0cnVjdCBfd3NwX19BcHBsaWVzVG8KK3sKKy8vLyBUT0RPOiA8YW55IG5hbWVzcGFjZT0iIyNhbnkiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKy8vLyAgICAgICBTY2hlbWEgZXh0ZW5zaWJpbGl0eSBpcyB1c2VyLWRlZmluYWJsZS4KKy8vLyAgICAgICBDb25zdWx0IHRoZSBwcm90b2NvbCBkb2N1bWVudGF0aW9uIHRvIGNoYW5nZSBhbmQvb3IgaW5zZXJ0IGRlY2xhcmF0aW9ucy4KKy8vLyAgICAgICBVc2Ugd3NkbDJoIG9wdGlvbiAteCB0byByZW1vdmUgdGhpcyBlbGVtZW50LgorLy8vIFRPRE86IDxhbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI2FueSI+CisvLy8gICAgICAgU2NoZW1hIGV4dGVuc2liaWxpdHkgaXMgdXNlci1kZWZpbmFibGUuCisvLy8gICAgICAgQ29uc3VsdCB0aGUgcHJvdG9jb2wgZG9jdW1lbnRhdGlvbiB0byBjaGFuZ2UgYW5kL29yIGluc2VydCBkZWNsYXJhdGlvbnMuCisvLy8gICAgICAgVXNlIHdzZGwyaCBvcHRpb24gLXggdG8gcmVtb3ZlIHRoaXMgYXR0cmlidXRlLgorfTsKKworLy8vICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA5L3BvbGljeSI6UG9saWN5IGlzIGEgY29tcGxleFR5cGUgd2l0aCBjb21wbGV4Q29udGVudCBleHRlbnNpb24gb2YgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDkvcG9saWN5IjpPcGVyYXRvckNvbnRlbnRUeXBlLgorc3RydWN0IF93c3BfX1BvbGljeQoreworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3NpemV1bmlvbl8xICAgICAgICAgICAgICAgICAgMDsKKyAgICBzdHJ1Y3QgX193c3BfX3VuaW9uXzEgICAgICAgICAgICAgICAqX191bmlvbl8xICAgICAgICAgICAgICAgICAgICAgOworLy8vIEF0dHJpYnV0ZSBUYXJnZXROYW1lc3BhY2Ugb2YgdHlwZSB4czphbnlVUkkKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TmFtZXNwYWNlICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIHJlZmVyZW5jZSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXV0aWxpdHktMS4wLnhzZCI6SWQKKyAgIEB3c3VfX0lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3N1X19JZF8gICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gVE9ETzogPGFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjYW55Ij4KKy8vLyAgICAgICBTY2hlbWEgZXh0ZW5zaWJpbGl0eSBpcyB1c2VyLWRlZmluYWJsZS4KKy8vLyAgICAgICBDb25zdWx0IHRoZSBwcm90b2NvbCBkb2N1bWVudGF0aW9uIHRvIGNoYW5nZSBhbmQvb3IgaW5zZXJ0IGRlY2xhcmF0aW9ucy4KKy8vLyAgICAgICBVc2Ugd3NkbDJoIG9wdGlvbiAteCB0byByZW1vdmUgdGhpcyBhdHRyaWJ1dGUuCit9OworCisvKiBFbmQgb2Ygd3NwLmggKi8KZGlmZiAtLWdpdCBhL2ltcG9ydC93c3JwLmggYi9pbXBvcnQvd3NycC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYzExOTcKLS0tIC9kZXYvbnVsbAorKysgYi9pbXBvcnQvd3NycC5oCkBAIC0wLDAgKzEsMjI4IEBACisvKgorCit3c3JwLmgKKworR2VuZXJhdGVkIHdpdGg6Cit3c2RsMmggLWNneSAtbyB3c3JwLmggLXQgV1MvV1MtdHlwZW1hcC5kYXQgV1MvV1MtUm91dGluZy54c2QKKworTW9kaWZpZWQgYnkgUm9iZXJ0IHZhbiBFbmdlbGVuOgorCistIFJlbW92ZWQgLy9nc29hcG9wdAorLSBBZGRlZCB0aGUgZm9sbG93aW5nIGRpcmVjdGl2ZSB0byBpbXBvcnQgV1MtUm91dGluZyBuYW1lc3BhY2U6CisgIC8vZ3NvYXAgd3NhIHNjaGVtYSBpbXBvcnQ6IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3JwLworICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgV1MtUm91dGluZyBzY2hlbWFzIGFyZSBub3QgY29waWVkIGludG8gdGhlIGdlbmVyYXRlZAorICBXU0RMIGJ5IHNvYXBjcHAyIGJ1dCBhcmUgcmVmZXJlbmNlZCB3aXRoIHNjaGVtYSBpbXBvcnQgaW4gdGhlIGdlbmVyYXRlZCBXU0RMLgorCisqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvcnAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogSW1wb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogU2NoZW1hIE5hbWVzcGFjZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy9nc29hcCB3c3JwICBzY2hlbWEgaW1wb3J0OglodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9ycC8KKy8vZ3NvYXAgd3NycCAgc2NoZW1hIGZvcm06CXVucXVhbGlmaWVkCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBTY2hlbWEgVHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKworLy8vIFR5cGVkZWYgc3lub255bSBmb3Igc3RydWN0IHdzcnBfX3BhdGhfVVNDT1JFdC4KK3R5cGVkZWYgc3RydWN0IHdzcnBfX3BhdGhfVVNDT1JFdCB3c3JwX19wYXRoX1VTQ09SRXQ7CisKKy8vLyBUeXBlZGVmIHN5bm9ueW0gZm9yIHN0cnVjdCB3c3JwX192aWFfVVNDT1JFdC4KK3R5cGVkZWYgc3RydWN0IHdzcnBfX3ZpYV9VU0NPUkV0IHdzcnBfX3ZpYV9VU0NPUkV0OworCisvLy8gVHlwZWRlZiBzeW5vbnltIGZvciBzdHJ1Y3Qgd3NycF9fZndkX1VTQ09SRXQuCit0eXBlZGVmIHN0cnVjdCB3c3JwX19md2RfVVNDT1JFdCB3c3JwX19md2RfVVNDT1JFdDsKKworLy8vIFR5cGVkZWYgc3lub255bSBmb3Igc3RydWN0IHdzcnBfX3Jldl9VU0NPUkV0LgordHlwZWRlZiBzdHJ1Y3Qgd3NycF9fcmV2X1VTQ09SRXQgd3NycF9fcmV2X1VTQ09SRXQ7CisKKy8vLyBUeXBlZGVmIHN5bm9ueW0gZm9yIHN0cnVjdCB3c3JwX19mb3VuZF9VU0NPUkV0LgordHlwZWRlZiBzdHJ1Y3Qgd3NycF9fZm91bmRfVVNDT1JFdCB3c3JwX19mb3VuZF9VU0NPUkV0OworCisvLy8gVHlwZWRlZiBzeW5vbnltIGZvciBzdHJ1Y3Qgd3NycF9fZmF1bHRfVVNDT1JFdC4KK3R5cGVkZWYgc3RydWN0IHdzcnBfX2ZhdWx0X1VTQ09SRXQgd3NycF9fZmF1bHRfVVNDT1JFdDsKKworLy8vIEltcG9ydGVkIHNpbXBsZVR5cGUgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3JwLyI6YWN0aW9uX3QgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LgorCisKKy8vLyBFbGVtZW50ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9ycC8iOmFjdGlvbiBvZiBzaW1wbGVUeXBlICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9ycC8iOmFjdGlvbl90LgordHlwZWRlZiBjaGFyIF93c3JwX19hY3Rpb247CisKKy8vLyBJbXBvcnRlZCBzaW1wbGVUeXBlICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9ycC8iOnRvX3QgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LgorCisKKy8vLyBFbGVtZW50ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9ycC8iOnRvIG9mIHNpbXBsZVR5cGUgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3JwLyI6dG9fdC4KK3R5cGVkZWYgY2hhciBfd3NycF9fdG87CisKKy8vLyBJbXBvcnRlZCBzaW1wbGVUeXBlICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9ycC8iOmZyb21fdCBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuCisKKworLy8vIEVsZW1lbnQgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3JwLyI6ZnJvbSBvZiBzaW1wbGVUeXBlICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9ycC8iOmZyb21fdC4KK3R5cGVkZWYgY2hhciBfd3NycF9fZnJvbTsKKworLy8vIEltcG9ydGVkIHNpbXBsZVR5cGUgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3JwLyI6aWRfdCBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuCisKKworLy8vIEVsZW1lbnQgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3JwLyI6aWQgb2Ygc2ltcGxlVHlwZSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvcnAvIjppZF90LgordHlwZWRlZiBjaGFyIF93c3JwX19pZDsKKworLy8vIEltcG9ydGVkIHNpbXBsZVR5cGUgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3JwLyI6cmVsYXRlc1RvX3QgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LgorCisKKy8vLyBFbGVtZW50ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9ycC8iOnJlbGF0ZXNUbyBvZiBzaW1wbGVUeXBlICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9ycC8iOnJlbGF0ZXNUb190LgordHlwZWRlZiBjaGFyIF93c3JwX19yZWxhdGVzVG87CisKKy8vLyBJbXBvcnRlZCBzaW1wbGVUeXBlICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9ycC8iOmZhdWx0Y29kZV90IGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4KKworCisvLy8gRWxlbWVudCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvcnAvIjpmYXVsdGNvZGUgb2Ygc2ltcGxlVHlwZSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvcnAvIjpmYXVsdGNvZGVfdC4KK3R5cGVkZWYgY2hhciBfd3NycF9fZmF1bHRjb2RlOworCisvLy8gSW1wb3J0ZWQgc2ltcGxlVHlwZSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvcnAvIjpmYXVsdHJlYXNvbl90IGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4KKworCisvLy8gRWxlbWVudCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvcnAvIjpmYXVsdHJlYXNvbiBvZiBzaW1wbGVUeXBlICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9ycC8iOmZhdWx0cmVhc29uX3QuCit0eXBlZGVmIGNoYXIgX3dzcnBfX2ZhdWx0cmVhc29uOworCisvLy8gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3JwLyI6cGF0aF90IGlzIGEgY29tcGxleFR5cGUuCitzdHJ1Y3Qgd3NycF9fcGF0aF9VU0NPUkV0Cit7CisvLy8gRWxlbWVudCByZWZlcmVuY2UgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3JwLyI6YWN0aW9uLgorICAgIGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c3JwX19hY3Rpb24gICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50LgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9ycC8iOnRvLgorICAgIGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c3JwX190byAgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50LgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9ycC8iOmZ3ZC4KKyAgICBzdHJ1Y3Qgd3NycF9fZndkX1VTQ09SRXQqICAgICAgICAgICAgd3NycF9fZndkICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudC4KKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvcnAvIjpyZXYuCisgICAgc3RydWN0IHdzcnBfX3Jldl9VU0NPUkV0KiAgICAgICAgICAgIHdzcnBfX3JldiAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQuCisvLy8gRWxlbWVudCByZWZlcmVuY2UgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3JwLyI6ZnJvbS4KKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NycF9fZnJvbSAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudC4KKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvcnAvIjppZC4KKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NycF9faWQgICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudC4KKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvcnAvIjpyZWxhdGVzVG8uCisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzcnBfX3JlbGF0ZXNUbyAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQuCisvLy8gRWxlbWVudCByZWZlcmVuY2UgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3JwLyI6ZmF1bHQuCisgICAgc3RydWN0IHdzcnBfX2ZhdWx0X1VTQ09SRXQqICAgICAgICAgIHdzcnBfX2ZhdWx0ICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQuCisvLy8gVE9ETzogPGFueUF0dHJpYnV0ZT4KKy8vLyAgICAgICBTY2hlbWEgZXh0ZW5zaWJpbGl0eSBpcyB1c2VyLWRlZmluYWJsZS4KKy8vLyAgICAgICBDb25zdWx0IHRoZSBwcm90b2NvbCBkb2N1bWVudGF0aW9uIHRvIGNoYW5nZSBhbmQvb3IgaW5zZXJ0IGRlY2xhcmF0aW9ucy4KKy8vLyAgICAgICBVc2Ugd3NkbDJoIG9wdGlvbiAteCB0byByZW1vdmUgdGhpcyBhdHRyaWJ1dGUuCisgICBAX1hNTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYW55QXR0cmlidXRlICAgICAgICAgICAgICAgIDsJLy8vPCBDYXRjaCBhbnkgYXR0cmlidXRlIGNvbnRlbnQgaW4gWE1MIHN0cmluZy4KK307CisKKy8vLyBFbGVtZW50ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9ycC8iOnBhdGggb2YgY29tcGxleFR5cGUgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3JwLyI6cGF0aF90LgordHlwZWRlZiBzdHJ1Y3Qgd3NycF9fcGF0aF9VU0NPUkV0IF93c3JwX19wYXRoOworCisvLy8gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3JwLyI6ZndkX3QgaXMgYSBjb21wbGV4VHlwZS4KK3N0cnVjdCB3c3JwX19md2RfVVNDT1JFdAoreworLy8vIFNpemUgb2YgdGhlIGR5bmFtaWMgYXJyYXkgb2Ygc3RydWN0IHdzcnBfX3ZpYV9VU0NPUkV0KiBpcyAwLi51bmJvdW5kZWQKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zaXpldmlhICAgICAgICAgICAgICAgICAgICAgOworLy8vIFBvaW50ZXIgdG8gYXJyYXkgb2Ygc3RydWN0IHdzcnBfX3ZpYV9VU0NPUkV0Ki4KKyAgICBzdHJ1Y3Qgd3NycF9fdmlhX1VTQ09SRXQqICAgICAgICAgICAqd3NycF9fdmlhICAgICAgICAgICAgICAgICAgICAgIDA7CisvLy8gVE9ETzogPGFueUF0dHJpYnV0ZT4KKy8vLyAgICAgICBTY2hlbWEgZXh0ZW5zaWJpbGl0eSBpcyB1c2VyLWRlZmluYWJsZS4KKy8vLyAgICAgICBDb25zdWx0IHRoZSBwcm90b2NvbCBkb2N1bWVudGF0aW9uIHRvIGNoYW5nZSBhbmQvb3IgaW5zZXJ0IGRlY2xhcmF0aW9ucy4KKy8vLyAgICAgICBVc2Ugd3NkbDJoIG9wdGlvbiAteCB0byByZW1vdmUgdGhpcyBhdHRyaWJ1dGUuCisgICBAX1hNTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYW55QXR0cmlidXRlICAgICAgICAgICAgICAgIDsJLy8vPCBDYXRjaCBhbnkgYXR0cmlidXRlIGNvbnRlbnQgaW4gWE1MIHN0cmluZy4KK307CisKKy8vLyBFbGVtZW50ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9ycC8iOmZ3ZCBvZiBjb21wbGV4VHlwZSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvcnAvIjpmd2RfdC4KK3R5cGVkZWYgc3RydWN0IHdzcnBfX2Z3ZF9VU0NPUkV0IF93c3JwX19md2Q7CisKKy8vLyAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvcnAvIjpyZXZfdCBpcyBhIGNvbXBsZXhUeXBlLgorc3RydWN0IHdzcnBfX3Jldl9VU0NPUkV0Cit7CisvLy8gU2l6ZSBvZiB0aGUgZHluYW1pYyBhcnJheSBvZiBzdHJ1Y3Qgd3NycF9fdmlhX1VTQ09SRXQqIGlzIDAuLnVuYm91bmRlZAorICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3NpemV2aWEgICAgICAgICAgICAgICAgICAgICA7CisvLy8gUG9pbnRlciB0byBhcnJheSBvZiBzdHJ1Y3Qgd3NycF9fdmlhX1VTQ09SRXQqLgorICAgIHN0cnVjdCB3c3JwX192aWFfVVNDT1JFdCogICAgICAgICAgICp3c3JwX192aWEgICAgICAgICAgICAgICAgICAgICAgMDsKKy8vLyBUT0RPOiA8YW55QXR0cmlidXRlPgorLy8vICAgICAgIFNjaGVtYSBleHRlbnNpYmlsaXR5IGlzIHVzZXItZGVmaW5hYmxlLgorLy8vICAgICAgIENvbnN1bHQgdGhlIHByb3RvY29sIGRvY3VtZW50YXRpb24gdG8gY2hhbmdlIGFuZC9vciBpbnNlcnQgZGVjbGFyYXRpb25zLgorLy8vICAgICAgIFVzZSB3c2RsMmggb3B0aW9uIC14IHRvIHJlbW92ZSB0aGlzIGF0dHJpYnV0ZS4KKyAgIEBfWE1MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19hbnlBdHRyaWJ1dGUgICAgICAgICAgICAgICAgOwkvLy88IENhdGNoIGFueSBhdHRyaWJ1dGUgY29udGVudCBpbiBYTUwgc3RyaW5nLgorfTsKKworLy8vIEVsZW1lbnQgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3JwLyI6cmV2IG9mIGNvbXBsZXhUeXBlICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9ycC8iOnJldl90LgordHlwZWRlZiBzdHJ1Y3Qgd3NycF9fcmV2X1VTQ09SRXQgX3dzcnBfX3JldjsKKworLy8vICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9ycC8iOmZvdW5kX3QgaXMgYSBjb21wbGV4VHlwZS4KK3N0cnVjdCB3c3JwX19mb3VuZF9VU0NPUkV0Cit7CisvLy8gU2l6ZSBvZiB0aGUgZHluYW1pYyBhcnJheSBvZiBjaGFyKiBpcyAwLi51bmJvdW5kZWQKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zaXplYXQgICAgICAgICAgICAgICAgICAgICAgOworLy8vIFBvaW50ZXIgdG8gYXJyYXkgb2YgY2hhciouCisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOworLy8vIFRPRE86IDxhbnlBdHRyaWJ1dGU+CisvLy8gICAgICAgU2NoZW1hIGV4dGVuc2liaWxpdHkgaXMgdXNlci1kZWZpbmFibGUuCisvLy8gICAgICAgQ29uc3VsdCB0aGUgcHJvdG9jb2wgZG9jdW1lbnRhdGlvbiB0byBjaGFuZ2UgYW5kL29yIGluc2VydCBkZWNsYXJhdGlvbnMuCisvLy8gICAgICAgVXNlIHdzZGwyaCBvcHRpb24gLXggdG8gcmVtb3ZlIHRoaXMgYXR0cmlidXRlLgorICAgQF9YTUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2FueUF0dHJpYnV0ZSAgICAgICAgICAgICAgICA7CS8vLzwgQ2F0Y2ggYW55IGF0dHJpYnV0ZSBjb250ZW50IGluIFhNTCBzdHJpbmcuCit9OworCisvLy8gRWxlbWVudCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvcnAvIjpmb3VuZCBvZiBjb21wbGV4VHlwZSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvcnAvIjpmb3VuZF90LgordHlwZWRlZiBzdHJ1Y3Qgd3NycF9fZm91bmRfVVNDT1JFdCBfd3NycF9fZm91bmQ7CisKKy8vLyAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvcnAvIjpmYXVsdF90IGlzIGEgY29tcGxleFR5cGUuCitzdHJ1Y3Qgd3NycF9fZmF1bHRfVVNDT1JFdAoreworLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9ycC8iOmZhdWx0Y29kZS4KKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NycF9fZmF1bHRjb2RlICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudC4KKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvcnAvIjpmYXVsdHJlYXNvbi4KKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NycF9fZmF1bHRyZWFzb24gICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudC4KKy8vLyBFbGVtZW50IGVuZHBvaW50IG9mIHR5cGUgeHM6YW55VVJJLgorICAgIGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludCAgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50LgorLy8vIEVsZW1lbnQgZm91bmQgb2YgdHlwZSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvcnAvIjpmb3VuZF90LgorICAgIHN0cnVjdCB3c3JwX19mb3VuZF9VU0NPUkV0KiAgICAgICAgICBmb3VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50LgorLy8vIEVsZW1lbnQgbWF4c2l6ZSBvZiB0eXBlIHhzOmludGVnZXIuCisgICAgaW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heHNpemUgICAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQuCisvLy8gRWxlbWVudCBtYXh0aW1lIG9mIHR5cGUgeHM6aW50ZWdlci4KKyAgICBpbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4dGltZSAgICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudC4KKy8vLyBFbGVtZW50IHJldHJ5QWZ0ZXIgb2YgdHlwZSB4czppbnRlZ2VyLgorICAgIGludCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRyeUFmdGVyICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50LgorLy8vIFRPRE86IDxhbnlBdHRyaWJ1dGU+CisvLy8gICAgICAgU2NoZW1hIGV4dGVuc2liaWxpdHkgaXMgdXNlci1kZWZpbmFibGUuCisvLy8gICAgICAgQ29uc3VsdCB0aGUgcHJvdG9jb2wgZG9jdW1lbnRhdGlvbiB0byBjaGFuZ2UgYW5kL29yIGluc2VydCBkZWNsYXJhdGlvbnMuCisvLy8gICAgICAgVXNlIHdzZGwyaCBvcHRpb24gLXggdG8gcmVtb3ZlIHRoaXMgYXR0cmlidXRlLgorICAgQF9YTUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2FueUF0dHJpYnV0ZSAgICAgICAgICAgICAgICA7CS8vLzwgQ2F0Y2ggYW55IGF0dHJpYnV0ZSBjb250ZW50IGluIFhNTCBzdHJpbmcuCit9OworCisvLy8gRWxlbWVudCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvcnAvIjpmYXVsdCBvZiBjb21wbGV4VHlwZSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvcnAvIjpmYXVsdF90LgordHlwZWRlZiBzdHJ1Y3Qgd3NycF9fZmF1bHRfVVNDT1JFdCBfd3NycF9fZmF1bHQ7CisKKy8vLyAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvcnAvIjp2aWFfdCBpcyBhIGNvbXBsZXhUeXBlIHdpdGggc2ltcGxlQ29udGVudC4KK3N0cnVjdCB3c3JwX192aWFfVVNDT1JFdAoreworLy8vIF9faXRlbSB3cmFwcyBzaW1wbGVDb250ZW50LgorICAgIGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2l0ZW0gICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gQXR0cmlidXRlIHZpZCBvZiB0eXBlIHhzOmFueVVSSS4KKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlLgorfTsKKworLy8vIEVsZW1lbnQgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3JwLyI6dmlhIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9ycC8iOnZpYV90LgordHlwZWRlZiBzdHJ1Y3Qgd3NycF9fdmlhX1VTQ09SRXQgX3dzcnBfX3ZpYTsKKworLyogRW5kIG9mIHdzcnAuaCAqLwpkaWZmIC0tZ2l0IGEvaW1wb3J0L3dzc2UuaCBiL2ltcG9ydC93c3NlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhlMTZjMgotLS0gL2Rldi9udWxsCisrKyBiL2ltcG9ydC93c3NlLmgKQEAgLTAsMCArMSwxOTggQEAKKy8qCisKK3dzc2UuaAorCitHZW5lcmF0ZWQgd2l0aDoKK3dzZGwyaCAtY2VneHkgLW8gd3NzZS5oIC10IFdTL1dTLXR5cGVtYXAuZGF0IFdTL3dzc2UueHNkCisKKy0gUmVtb3ZlZCAvL2dzb2Fwb3B0CistIEFkZGVkIC8vZ3NvYXAgd3NzZSAgc2NoZW1hIGltcG9ydDogaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkCisKKyovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBJbXBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW1wb3J0ICJ3c3UuaCIJLy8gd3N1ID0gPGh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS11dGlsaXR5LTEuMC54c2Q+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBTY2hlbWEgTmFtZXNwYWNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvL2dzb2FwIHdzc2UgIHNjaGVtYSBpbXBvcnQ6CWh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZAorLy9nc29hcCB3c3NlICBzY2hlbWEgZWxlbWVudEZvcm06CXF1YWxpZmllZAorLy9nc29hcCB3c3NlICBzY2hlbWEgYXR0cmlidXRlRm9ybToJdW5xdWFsaWZpZWQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFNjaGVtYSBUeXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCisvLy8gSW1wb3J0ZWQgY29tcGxleFR5cGUgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6QXR0cmlidXRlZFN0cmluZyBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuCisvLy8gQGJyaWVmIFRoaXMgdHlwZSByZXByZXNlbnRzIGFuIGVsZW1lbnQgd2l0aCBhcmJpdHJhcnkgYXR0cmlidXRlcy4KKy8vLyBjb21wbGV4VHlwZSBkZWZpbml0aW9uIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4KKworLy8vIEltcG9ydGVkIGNvbXBsZXhUeXBlICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOlBhc3N3b3JkU3RyaW5nIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4KKy8vLyBAYnJpZWYgVGhpcyB0eXBlIGlzIHVzZWQgZm9yIHBhc3N3b3JkIGVsZW1lbnRzIHBlciBTZWN0aW9uIDQuMS4KKy8vLyBjb21wbGV4VHlwZSBkZWZpbml0aW9uIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4KKworLy8vIEltcG9ydGVkIGNvbXBsZXhUeXBlICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOkVuY29kZWRTdHJpbmcgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LgorLy8vIEBicmllZiBUaGlzIHR5cGUgaXMgdXNlZCBmb3IgZWxlbWVudHMgY29udGFpbmluZyBzdHJpbmdpZmllZCBiaW5hcnkgZGF0YS4KKy8vLyBjb21wbGV4VHlwZSBkZWZpbml0aW9uIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4KKworLy8vIEltcG9ydGVkIGNvbXBsZXhUeXBlICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOlVzZXJuYW1lVG9rZW5UeXBlIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4KKy8vLyBAYnJpZWYgVGhpcyB0eXBlIHJlcHJlc2VudHMgYSB1c2VybmFtZSB0b2tlbiBwZXIgU2VjdGlvbiA0LjEKKy8vLyBjb21wbGV4VHlwZSBkZWZpbml0aW9uIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4KKworLy8vIEltcG9ydGVkIGNvbXBsZXhUeXBlICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOkJpbmFyeVNlY3VyaXR5VG9rZW5UeXBlIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4KKy8vLyBAYnJpZWYgQSBzZWN1cml0eSB0b2tlbiB0aGF0IGlzIGVuY29kZWQgaW4gYmluYXJ5CisvLy8gY29tcGxleFR5cGUgZGVmaW5pdGlvbiBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsuCisKKy8vLyBJbXBvcnRlZCBjb21wbGV4VHlwZSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpLZXlJZGVudGlmaWVyVHlwZSBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuCisvLy8gQGJyaWVmIEEgc2VjdXJpdHkgdG9rZW4ga2V5IGlkZW50aWZpZXIKKy8vLyBjb21wbGV4VHlwZSBkZWZpbml0aW9uIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4KKworLy8vIEltcG9ydGVkIGNvbXBsZXhUeXBlICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOlJlZmVyZW5jZVR5cGUgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LgorLy8vIEBicmllZiBUaGlzIHR5cGUgcmVwcmVzZW50cyBhIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCBzZWN1cml0eSB0b2tlbi4KKy8vLyBjb21wbGV4VHlwZSBkZWZpbml0aW9uIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4KKworLy8vIEltcG9ydGVkIGNvbXBsZXhUeXBlICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOkVtYmVkZGVkVHlwZSBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuCisvLy8gQGJyaWVmIFRoaXMgdHlwZSByZXByZXNlbnRzIGEgcmVmZXJlbmNlIHRvIGFuIGVtYmVkZGVkIHNlY3VyaXR5IHRva2VuLgorLy8vIGNvbXBsZXhUeXBlIGRlZmluaXRpb24gaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rLgorCisvLy8gSW1wb3J0ZWQgY29tcGxleFR5cGUgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6U2VjdXJpdHlUb2tlblJlZmVyZW5jZVR5cGUgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LgorLy8vIEBicmllZiBUaGlzIHR5cGUgaXMgdXNlZCByZWZlcmVuY2UgYSBzZWN1cml0eSB0b2tlbi4KKy8vLyBjb21wbGV4VHlwZSBkZWZpbml0aW9uIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4KKworLy8vIEltcG9ydGVkIGNvbXBsZXhUeXBlICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOlNlY3VyaXR5SGVhZGVyVHlwZSBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuCisvLy8gQGJyaWVmIFRoaXMgY29tcGxleFR5cGUgZGVmaW5lcyBoZWFkZXIgYmxvY2sgdG8gdXNlIGZvciBzZWN1cml0eS1yZWxldmFudCBkYXRhIGRpcmVjdGVkIGF0IGEgc3BlY2lmaWMgU09BUCBhY3Rvci4KKy8vLyBjb21wbGV4VHlwZSBkZWZpbml0aW9uIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4KKworLy8vIEltcG9ydGVkIGNvbXBsZXhUeXBlICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOlRyYW5zZm9ybWF0aW9uUGFyYW1ldGVyc1R5cGUgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LgorLy8vIEBicmllZiBUaGlzIGNvbXBsZXhUeXBlIGRlZmluZXMgYSBjb250YWluZXIgZm9yIGVsZW1lbnRzIHRvIGJlIHNwZWNpZmllZCBmcm9tIGFueSBuYW1lc3BhY2UgYXMgcHJvcGVydGllcy9wYXJhbWV0ZXJzIG9mIGEgRFNJRyB0cmFuc2Zvcm1hdGlvbi4KKy8vLyBjb21wbGV4VHlwZSBkZWZpbml0aW9uIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4KKworLy8vIEltcG9ydGVkIHNpbXBsZVR5cGUgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6dFVzYWdlIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4KKy8vLyBAYnJpZWYgVHlwZWRlZiB0byBhbGxvdyBhIGxpc3Qgb2YgdXNhZ2VzIChhcyBVUklzKS4KKy8vLyBzaW1wbGVUeXBlIGRlZmluaXRpb24gaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rLgorCisvLy8gImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6RmF1bHRjb2RlRW51bSBpcyBhIHNpbXBsZVR5cGUgcmVzdHJpY3Rpb24gb2YgeHM6UU5hbWUuCitlbnVtIHdzc2VfX0ZhdWx0Y29kZUVudW0KK3sKKwl3c3NlX19VbnN1cHBvcnRlZFNlY3VyaXR5VG9rZW4sCS8vLzwgeHM6UU5hbWUgdmFsdWU9IiJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOlVuc3VwcG9ydGVkU2VjdXJpdHlUb2tlbiIKKwl3c3NlX19VbnN1cHBvcnRlZEFsZ29yaXRobSwJLy8vPCB4czpRTmFtZSB2YWx1ZT0iImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6VW5zdXBwb3J0ZWRBbGdvcml0aG0iCisJd3NzZV9fSW52YWxpZFNlY3VyaXR5LAkvLy88IHhzOlFOYW1lIHZhbHVlPSIiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpJbnZhbGlkU2VjdXJpdHkiCisJd3NzZV9fSW52YWxpZFNlY3VyaXR5VG9rZW4sCS8vLzwgeHM6UU5hbWUgdmFsdWU9IiJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOkludmFsaWRTZWN1cml0eVRva2VuIgorCXdzc2VfX0ZhaWxlZEF1dGhlbnRpY2F0aW9uLAkvLy88IHhzOlFOYW1lIHZhbHVlPSIiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpGYWlsZWRBdXRoZW50aWNhdGlvbiIKKwl3c3NlX19GYWlsZWRDaGVjaywJLy8vPCB4czpRTmFtZSB2YWx1ZT0iImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6RmFpbGVkQ2hlY2siCisJd3NzZV9fU2VjdXJpdHlUb2tlblVuYXZhaWxhYmxlLAkvLy88IHhzOlFOYW1lIHZhbHVlPSIiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpTZWN1cml0eVRva2VuVW5hdmFpbGFibGUiCit9OworLy8vIFR5cGVkZWYgc3lub255bSBmb3IgZW51bSB3c3NlX19GYXVsdGNvZGVFbnVtLgordHlwZWRlZiBlbnVtIHdzc2VfX0ZhdWx0Y29kZUVudW0gd3NzZV9fRmF1bHRjb2RlRW51bTsKKworLy8vIEVsZW1lbnQgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6VXNlcm5hbWVUb2tlbiBvZiBjb21wbGV4VHlwZSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpVc2VybmFtZVRva2VuVHlwZS4KKy8vLyBAYnJpZWYgVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIHdzc2U6VXNlcm5hbWVUb2tlbiBlbGVtZW50IHBlciBTZWN0aW9uIDQuMS4KKy8vLyBJbXBvcnRlZCBlbGVtZW50IF93c3NlX19Vc2VybmFtZVRva2VuIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4KK3R5cGVkZWYgc3RydWN0IF93c3NlX19Vc2VybmFtZVRva2VuCit7CWNoYXIqCQkJCQlVc2VybmFtZTsKKwlzdHJ1Y3QgX3dzc2VfX1Bhc3N3b3JkKgkJCVBhc3N3b3JkOworCWNoYXIqCQkJCQlOb25jZTsKKwljaGFyKgkJCQkJd3N1X19DcmVhdGVkOworCUBjaGFyKgkJCQkJd3N1X19JZDsKK30gX3dzc2VfX1VzZXJuYW1lVG9rZW47CisKKy8vLyBFbGVtZW50ICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOkJpbmFyeVNlY3VyaXR5VG9rZW4gb2YgY29tcGxleFR5cGUgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6QmluYXJ5U2VjdXJpdHlUb2tlblR5cGUuCisvLy8gQGJyaWVmIFRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSB3c3NlOkJpbmFyeVNlY3VyaXR5VG9rZW4gZWxlbWVudCBwZXIgU2VjdGlvbiA0LjIuCisvLy8gSW1wb3J0ZWQgZWxlbWVudCBfd3NzZV9fQmluYXJ5U2VjdXJpdHlUb2tlbiBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuCit0eXBlZGVmIHN0cnVjdCBfd3NzZV9fQmluYXJ5U2VjdXJpdHlUb2tlbgorewljaGFyKgkJCQkJX19pdGVtOworCUBjaGFyKgkJCQkJd3N1X19JZDsKKwlAY2hhcioJCQkJCVZhbHVlVHlwZTsKKwlAY2hhcioJCQkJCUVuY29kaW5nVHlwZTsKK30gX3dzc2VfX0JpbmFyeVNlY3VyaXR5VG9rZW47CisKKy8vLyBFbGVtZW50ICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOlJlZmVyZW5jZSBvZiBjb21wbGV4VHlwZSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpSZWZlcmVuY2VUeXBlLgorLy8vIEBicmllZiBUaGlzIGVsZW1lbnQgZGVmaW5lcyBhIHNlY3VyaXR5IHRva2VuIHJlZmVyZW5jZQorLy8vIEltcG9ydGVkIGVsZW1lbnQgX3dzc2VfX1JlZmVyZW5jZSBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuCit0eXBlZGVmIHN0cnVjdCBfd3NzZV9fUmVmZXJlbmNlCit7CUBjaGFyKgkJCQkJVVJJOworCUBjaGFyKgkJCQkJVmFsdWVUeXBlOworfSBfd3NzZV9fUmVmZXJlbmNlOworCisvLy8gRWxlbWVudCAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpFbWJlZGRlZCBvZiBjb21wbGV4VHlwZSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpFbWJlZGRlZFR5cGUuCisvLy8gQGJyaWVmIFRoaXMgZWxlbWVudCBkZWZpbmVzIGEgc2VjdXJpdHkgdG9rZW4gZW1iZWRkZWQgcmVmZXJlbmNlCisvLy8gSW1wb3J0ZWQgZWxlbWVudCBfd3NzZV9fRW1iZWRkZWQgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LgordHlwZWRlZiBzdHJ1Y3QgX3dzc2VfX0VtYmVkZGVkCit7CS8qIEV4dGVuc2libGUgd2l0aCBlbWJlZGRlZCB0b2tlbnMgYW5kIGFzc2VydGlvbnMgKi8KKwlAY2hhcioJCQkJCXdzdV9fSWQ7CisJQGNoYXIqCQkJCQlWYWx1ZVR5cGU7Cit9IF93c3NlX19FbWJlZGRlZDsKKworLy8vIEVsZW1lbnQgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6S2V5SWRlbnRpZmllciBvZiBjb21wbGV4VHlwZSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpLZXlJZGVudGlmaWVyVHlwZS4KKy8vLyBAYnJpZWYgVGhpcyBlbGVtZW50IGRlZmluZXMgYSBrZXkgaWRlbnRpZmllciByZWZlcmVuY2UKKy8vLyBJbXBvcnRlZCBlbGVtZW50IF93c3NlX19LZXlJZGVudGlmaWVyIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4KK3R5cGVkZWYgc3RydWN0IF93c3NlX19LZXlJZGVudGlmaWVyCit7CWNoYXIqCQkJCQlfX2l0ZW07CisJQGNoYXIqCQkJCQl3c3VfX0lkOworCUBjaGFyKgkJCQkJVmFsdWVUeXBlOworCUBjaGFyKgkJCQkJRW5jb2RpbmdUeXBlOworfSBfd3NzZV9fS2V5SWRlbnRpZmllcjsKKworLy8vIEVsZW1lbnQgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6U2VjdXJpdHlUb2tlblJlZmVyZW5jZSBvZiBjb21wbGV4VHlwZSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpTZWN1cml0eVRva2VuUmVmZXJlbmNlVHlwZS4KKy8vLyBAYnJpZWYgVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIHdzc2U6U2VjdXJpdHlUb2tlblJlZmVyZW5jZSBwZXIgU2VjdGlvbiA0LjMuCisvLy8gSW1wb3J0ZWQgZWxlbWVudCBfd3NzZV9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZSBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuCit0eXBlZGVmIHN0cnVjdCBfd3NzZV9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZQorewlzdHJ1Y3QgX3dzc2VfX1JlZmVyZW5jZSoJCVJlZmVyZW5jZTsKKwlzdHJ1Y3QgX3dzc2VfX0tleUlkZW50aWZpZXIqCQlLZXlJZGVudGlmaWVyOworCXN0cnVjdCBfd3NzZV9fRW1iZWRkZWQqCQkJRW1iZWRkZWQ7CisJQGNoYXIqCQkJCQl3c3VfX0lkOworCUBjaGFyKgkJCQkJVXNhZ2U7Cit9IF93c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlOworCisvLy8gRWxlbWVudCAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpTZWN1cml0eSBvZiBjb21wbGV4VHlwZSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpTZWN1cml0eUhlYWRlclR5cGUuCisvLy8gQGJyaWVmIFRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSB3c3NlOlNlY3VyaXR5IFNPQVAgaGVhZGVyIGVsZW1lbnQgcGVyIFNlY3Rpb24gNC4KKy8vLyBJbXBvcnRlZCBlbGVtZW50IF93c3NlX19TZWN1cml0eSBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuCisjaW1wb3J0ICJkcy5oIgordHlwZWRlZiBzdHJ1Y3QgX3dzc2VfX1NlY3VyaXR5Cit7CXN0cnVjdCBfd3N1X19UaW1lc3RhbXAqCQkJd3N1X19UaW1lc3RhbXA7CisJc3RydWN0IF93c3NlX19Vc2VybmFtZVRva2VuKgkJVXNlcm5hbWVUb2tlbjsKKwlzdHJ1Y3QgX3dzc2VfX0JpbmFyeVNlY3VyaXR5VG9rZW4qCUJpbmFyeVNlY3VyaXR5VG9rZW47CisJc3RydWN0IGRzX19TaWduYXR1cmVUeXBlKgkJZHNfX1NpZ25hdHVyZTsKKwlAY2hhcioJCQkJCVNPQVBfRU5WX19hY3RvcjsKKwlAY2hhcioJCQkJCVNPQVBfRU5WX19yb2xlOworfSBfd3NzZV9fU2VjdXJpdHk7CisKKy8vLyBFbGVtZW50ICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOlRyYW5zZm9ybWF0aW9uUGFyYW1ldGVycyBvZiBjb21wbGV4VHlwZSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpUcmFuc2Zvcm1hdGlvblBhcmFtZXRlcnNUeXBlLgorLy8vIEBicmllZiBUaGlzIGVsZW1lbnQgY29udGFpbnMgcHJvcGVydGllcyBmb3IgdHJhbnNmb3JtYXRpb25zIGZyb20gYW55IG5hbWVzcGFjZSwgaW5jbHVkaW5nIERTSUcuCisvLy8gJ193c3NlX19UcmFuc2Zvcm1hdGlvblBhcmFtZXRlcnMnIGVsZW1lbnQgZGVmaW5pdGlvbiBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsuCisKKy8vLyBFbGVtZW50ICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOlBhc3N3b3JkIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOlBhc3N3b3JkU3RyaW5nLgorLy8vIEltcG9ydGVkIGVsZW1lbnQgX3dzc2VfX1Bhc3N3b3JkIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4KK3R5cGVkZWYgc3RydWN0IF93c3NlX19QYXNzd29yZAorewljaGFyKgkJCQkJX19pdGVtOworCUBjaGFyKgkJCQkJVHlwZTsKK30gX3dzc2VfX1Bhc3N3b3JkOworCisvLy8gRWxlbWVudCAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpOb25jZSBvZiBjb21wbGV4VHlwZSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpFbmNvZGVkU3RyaW5nLgorLy8vICdfd3NzZV9fTm9uY2UnIGVsZW1lbnQgZGVmaW5pdGlvbiBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsuCisKKy8vLyBBdHRyaWJ1dGUgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6VXNhZ2Ugb2Ygc2ltcGxlVHlwZSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjp0VXNhZ2UuCisvLy8gQGJyaWVmIFRoaXMgZ2xvYmFsIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGluZGljYXRlIHRoZSB1c2FnZSBvZiBhIHJlZmVyZW5jZWQgb3IgaW5kaWNhdGVkIHRva2VuIHdpdGhpbiB0aGUgY29udGFpbmluZyBjb250ZXh0CisvLy8gJ193c3NlX19Vc2FnZScgYXR0cmlidXRlIGRlZmluaXRpb24gaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rLgorCisvKiBFbmQgb2Ygd3NzZS5oICovCmRpZmYgLS1naXQgYS9pbXBvcnQvd3NzZTIuaCBiL2ltcG9ydC93c3NlMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZGY3ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9pbXBvcnQvd3NzZTIuaApAQCAtMCwwICsxLDIwMCBAQAorLyoKKword3NzZTIuaAorCitTZWUgd3NzZS5oCisKKy0gQ29waWVkIGZyb20gd3NzZS5oCistIFJlbW92ZWQgLy9nc29hcG9wdAorLSBBZGRlZCAvL2dzb2FwIHdzc2UyICBzY2hlbWEgaW1wb3J0OiBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAyLzEyL3NlY2V4dAorLSBSZW5hbWVkIC8vZ3NvYXAgd3NzZSA9PiB3c3NlMgorLSBSZW5hbWVkIHdzc2VfXyA9PiB3c3NlMl9fCisKKyovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAyLzEyL3NlY2V4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBJbXBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW1wb3J0ICJ3c3UuaCIJLy8gd3N1ID0gPGh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS11dGlsaXR5LTEuMC54c2Q+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBTY2hlbWEgTmFtZXNwYWNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvL2dzb2FwIHdzc2UyIHNjaGVtYSBpbXBvcnQ6CWh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDIvMTIvc2VjZXh0CisvL2dzb2FwIHdzc2UyIHNjaGVtYSBlbGVtZW50Rm9ybToJcXVhbGlmaWVkCisvL2dzb2FwIHdzc2UyIHNjaGVtYSBhdHRyaWJ1dGVGb3JtOgl1bnF1YWxpZmllZAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogU2NoZW1hIFR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKKy8vLyBJbXBvcnRlZCBjb21wbGV4VHlwZSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpBdHRyaWJ1dGVkU3RyaW5nIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4KKy8vLyBAYnJpZWYgVGhpcyB0eXBlIHJlcHJlc2VudHMgYW4gZWxlbWVudCB3aXRoIGFyYml0cmFyeSBhdHRyaWJ1dGVzLgorLy8vIGNvbXBsZXhUeXBlIGRlZmluaXRpb24gaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rLgorCisvLy8gSW1wb3J0ZWQgY29tcGxleFR5cGUgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6UGFzc3dvcmRTdHJpbmcgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LgorLy8vIEBicmllZiBUaGlzIHR5cGUgaXMgdXNlZCBmb3IgcGFzc3dvcmQgZWxlbWVudHMgcGVyIFNlY3Rpb24gNC4xLgorLy8vIGNvbXBsZXhUeXBlIGRlZmluaXRpb24gaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rLgorCisvLy8gSW1wb3J0ZWQgY29tcGxleFR5cGUgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6RW5jb2RlZFN0cmluZyBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuCisvLy8gQGJyaWVmIFRoaXMgdHlwZSBpcyB1c2VkIGZvciBlbGVtZW50cyBjb250YWluaW5nIHN0cmluZ2lmaWVkIGJpbmFyeSBkYXRhLgorLy8vIGNvbXBsZXhUeXBlIGRlZmluaXRpb24gaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rLgorCisvLy8gSW1wb3J0ZWQgY29tcGxleFR5cGUgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6VXNlcm5hbWVUb2tlblR5cGUgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LgorLy8vIEBicmllZiBUaGlzIHR5cGUgcmVwcmVzZW50cyBhIHVzZXJuYW1lIHRva2VuIHBlciBTZWN0aW9uIDQuMQorLy8vIGNvbXBsZXhUeXBlIGRlZmluaXRpb24gaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rLgorCisvLy8gSW1wb3J0ZWQgY29tcGxleFR5cGUgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6QmluYXJ5U2VjdXJpdHlUb2tlblR5cGUgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LgorLy8vIEBicmllZiBBIHNlY3VyaXR5IHRva2VuIHRoYXQgaXMgZW5jb2RlZCBpbiBiaW5hcnkKKy8vLyBjb21wbGV4VHlwZSBkZWZpbml0aW9uIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4KKworLy8vIEltcG9ydGVkIGNvbXBsZXhUeXBlICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOktleUlkZW50aWZpZXJUeXBlIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4KKy8vLyBAYnJpZWYgQSBzZWN1cml0eSB0b2tlbiBrZXkgaWRlbnRpZmllcgorLy8vIGNvbXBsZXhUeXBlIGRlZmluaXRpb24gaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rLgorCisvLy8gSW1wb3J0ZWQgY29tcGxleFR5cGUgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6UmVmZXJlbmNlVHlwZSBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuCisvLy8gQGJyaWVmIFRoaXMgdHlwZSByZXByZXNlbnRzIGEgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHNlY3VyaXR5IHRva2VuLgorLy8vIGNvbXBsZXhUeXBlIGRlZmluaXRpb24gaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rLgorCisvLy8gSW1wb3J0ZWQgY29tcGxleFR5cGUgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6RW1iZWRkZWRUeXBlIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4KKy8vLyBAYnJpZWYgVGhpcyB0eXBlIHJlcHJlc2VudHMgYSByZWZlcmVuY2UgdG8gYW4gZW1iZWRkZWQgc2VjdXJpdHkgdG9rZW4uCisvLy8gY29tcGxleFR5cGUgZGVmaW5pdGlvbiBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsuCisKKy8vLyBJbXBvcnRlZCBjb21wbGV4VHlwZSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpTZWN1cml0eVRva2VuUmVmZXJlbmNlVHlwZSBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuCisvLy8gQGJyaWVmIFRoaXMgdHlwZSBpcyB1c2VkIHJlZmVyZW5jZSBhIHNlY3VyaXR5IHRva2VuLgorLy8vIGNvbXBsZXhUeXBlIGRlZmluaXRpb24gaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rLgorCisvLy8gSW1wb3J0ZWQgY29tcGxleFR5cGUgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6U2VjdXJpdHlIZWFkZXJUeXBlIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4KKy8vLyBAYnJpZWYgVGhpcyBjb21wbGV4VHlwZSBkZWZpbmVzIGhlYWRlciBibG9jayB0byB1c2UgZm9yIHNlY3VyaXR5LXJlbGV2YW50IGRhdGEgZGlyZWN0ZWQgYXQgYSBzcGVjaWZpYyBTT0FQIGFjdG9yLgorLy8vIGNvbXBsZXhUeXBlIGRlZmluaXRpb24gaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rLgorCisvLy8gSW1wb3J0ZWQgY29tcGxleFR5cGUgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6VHJhbnNmb3JtYXRpb25QYXJhbWV0ZXJzVHlwZSBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuCisvLy8gQGJyaWVmIFRoaXMgY29tcGxleFR5cGUgZGVmaW5lcyBhIGNvbnRhaW5lciBmb3IgZWxlbWVudHMgdG8gYmUgc3BlY2lmaWVkIGZyb20gYW55IG5hbWVzcGFjZSBhcyBwcm9wZXJ0aWVzL3BhcmFtZXRlcnMgb2YgYSBEU0lHIHRyYW5zZm9ybWF0aW9uLgorLy8vIGNvbXBsZXhUeXBlIGRlZmluaXRpb24gaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rLgorCisvLy8gSW1wb3J0ZWQgc2ltcGxlVHlwZSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjp0VXNhZ2UgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LgorLy8vIEBicmllZiBUeXBlZGVmIHRvIGFsbG93IGEgbGlzdCBvZiB1c2FnZXMgKGFzIFVSSXMpLgorLy8vIHNpbXBsZVR5cGUgZGVmaW5pdGlvbiBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsuCisKKy8vLyAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpGYXVsdGNvZGVFbnVtIGlzIGEgc2ltcGxlVHlwZSByZXN0cmljdGlvbiBvZiB4czpRTmFtZS4KK2VudW0gd3NzZTJfX0ZhdWx0Y29kZUVudW0KK3sKKwl3c3NlMl9fVW5zdXBwb3J0ZWRTZWN1cml0eVRva2VuLAkvLy88IHhzOlFOYW1lIHZhbHVlPSIiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpVbnN1cHBvcnRlZFNlY3VyaXR5VG9rZW4iCisJd3NzZTJfX1Vuc3VwcG9ydGVkQWxnb3JpdGhtLAkvLy88IHhzOlFOYW1lIHZhbHVlPSIiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpVbnN1cHBvcnRlZEFsZ29yaXRobSIKKwl3c3NlMl9fSW52YWxpZFNlY3VyaXR5LAkvLy88IHhzOlFOYW1lIHZhbHVlPSIiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpJbnZhbGlkU2VjdXJpdHkiCisJd3NzZTJfX0ludmFsaWRTZWN1cml0eVRva2VuLAkvLy88IHhzOlFOYW1lIHZhbHVlPSIiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpJbnZhbGlkU2VjdXJpdHlUb2tlbiIKKwl3c3NlMl9fRmFpbGVkQXV0aGVudGljYXRpb24sCS8vLzwgeHM6UU5hbWUgdmFsdWU9IiJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOkZhaWxlZEF1dGhlbnRpY2F0aW9uIgorCXdzc2UyX19GYWlsZWRDaGVjaywJLy8vPCB4czpRTmFtZSB2YWx1ZT0iImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6RmFpbGVkQ2hlY2siCisJd3NzZTJfX1NlY3VyaXR5VG9rZW5VbmF2YWlsYWJsZSwJLy8vPCB4czpRTmFtZSB2YWx1ZT0iImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6U2VjdXJpdHlUb2tlblVuYXZhaWxhYmxlIgorfTsKKy8vLyBUeXBlZGVmIHN5bm9ueW0gZm9yIGVudW0gd3NzZTJfX0ZhdWx0Y29kZUVudW0uCit0eXBlZGVmIGVudW0gd3NzZTJfX0ZhdWx0Y29kZUVudW0gd3NzZTJfX0ZhdWx0Y29kZUVudW07CisKKy8vLyBFbGVtZW50ICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOlVzZXJuYW1lVG9rZW4gb2YgY29tcGxleFR5cGUgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6VXNlcm5hbWVUb2tlblR5cGUuCisvLy8gQGJyaWVmIFRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSB3c3NlOlVzZXJuYW1lVG9rZW4gZWxlbWVudCBwZXIgU2VjdGlvbiA0LjEuCisvLy8gSW1wb3J0ZWQgZWxlbWVudCBfd3NzZTJfX1VzZXJuYW1lVG9rZW4gZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LgordHlwZWRlZiBzdHJ1Y3QgX3dzc2UyX19Vc2VybmFtZVRva2VuCit7CWNoYXIqCQkJCQlVc2VybmFtZTsKKwlzdHJ1Y3QgX3dzc2UyX19QYXNzd29yZCoJCQlQYXNzd29yZDsKKwljaGFyKgkJCQkJTm9uY2U7CisJY2hhcioJCQkJCXdzdV9fQ3JlYXRlZDsKKwlAY2hhcioJCQkJCXdzdV9fSWQ7Cit9IF93c3NlMl9fVXNlcm5hbWVUb2tlbjsKKworLy8vIEVsZW1lbnQgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6QmluYXJ5U2VjdXJpdHlUb2tlbiBvZiBjb21wbGV4VHlwZSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpCaW5hcnlTZWN1cml0eVRva2VuVHlwZS4KKy8vLyBAYnJpZWYgVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIHdzc2U6QmluYXJ5U2VjdXJpdHlUb2tlbiBlbGVtZW50IHBlciBTZWN0aW9uIDQuMi4KKy8vLyBJbXBvcnRlZCBlbGVtZW50IF93c3NlMl9fQmluYXJ5U2VjdXJpdHlUb2tlbiBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuCit0eXBlZGVmIHN0cnVjdCBfd3NzZTJfX0JpbmFyeVNlY3VyaXR5VG9rZW4KK3sJY2hhcioJCQkJCV9faXRlbTsKKwlAY2hhcioJCQkJCXdzdV9fSWQ7CisJQGNoYXIqCQkJCQlWYWx1ZVR5cGU7CisJQGNoYXIqCQkJCQlFbmNvZGluZ1R5cGU7Cit9IF93c3NlMl9fQmluYXJ5U2VjdXJpdHlUb2tlbjsKKworLy8vIEVsZW1lbnQgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6UmVmZXJlbmNlIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOlJlZmVyZW5jZVR5cGUuCisvLy8gQGJyaWVmIFRoaXMgZWxlbWVudCBkZWZpbmVzIGEgc2VjdXJpdHkgdG9rZW4gcmVmZXJlbmNlCisvLy8gSW1wb3J0ZWQgZWxlbWVudCBfd3NzZTJfX1JlZmVyZW5jZSBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuCit0eXBlZGVmIHN0cnVjdCBfd3NzZTJfX1JlZmVyZW5jZQorewlAY2hhcioJCQkJCVVSSTsKKwlAY2hhcioJCQkJCVZhbHVlVHlwZTsKK30gX3dzc2UyX19SZWZlcmVuY2U7CisKKy8vLyBFbGVtZW50ICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOkVtYmVkZGVkIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOkVtYmVkZGVkVHlwZS4KKy8vLyBAYnJpZWYgVGhpcyBlbGVtZW50IGRlZmluZXMgYSBzZWN1cml0eSB0b2tlbiBlbWJlZGRlZCByZWZlcmVuY2UKKy8vLyBJbXBvcnRlZCBlbGVtZW50IF93c3NlMl9fRW1iZWRkZWQgZnJvbSB0eXBlbWFwIFdTL1dTLXR5cGVtYXAuZGF0LgordHlwZWRlZiBzdHJ1Y3QgX3dzc2UyX19FbWJlZGRlZAorewkvKiBFeHRlbnNpYmxlIHdpdGggZW1iZWRkZWQgdG9rZW5zIGFuZCBhc3NlcnRpb25zICovCisJQGNoYXIqCQkJCQl3c3VfX0lkOworCUBjaGFyKgkJCQkJVmFsdWVUeXBlOworfSBfd3NzZTJfX0VtYmVkZGVkOworCisvLy8gRWxlbWVudCAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpLZXlJZGVudGlmaWVyIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOktleUlkZW50aWZpZXJUeXBlLgorLy8vIEBicmllZiBUaGlzIGVsZW1lbnQgZGVmaW5lcyBhIGtleSBpZGVudGlmaWVyIHJlZmVyZW5jZQorLy8vIEltcG9ydGVkIGVsZW1lbnQgX3dzc2UyX19LZXlJZGVudGlmaWVyIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4KK3R5cGVkZWYgc3RydWN0IF93c3NlMl9fS2V5SWRlbnRpZmllcgorewljaGFyKgkJCQkJX19pdGVtOworCUBjaGFyKgkJCQkJd3N1X19JZDsKKwlAY2hhcioJCQkJCVZhbHVlVHlwZTsKKwlAY2hhcioJCQkJCUVuY29kaW5nVHlwZTsKK30gX3dzc2UyX19LZXlJZGVudGlmaWVyOworCisvLy8gRWxlbWVudCAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpTZWN1cml0eVRva2VuUmVmZXJlbmNlIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOlNlY3VyaXR5VG9rZW5SZWZlcmVuY2VUeXBlLgorLy8vIEBicmllZiBUaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgd3NzZTpTZWN1cml0eVRva2VuUmVmZXJlbmNlIHBlciBTZWN0aW9uIDQuMy4KKy8vLyBJbXBvcnRlZCBlbGVtZW50IF93c3NlMl9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZSBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuCit0eXBlZGVmIHN0cnVjdCBfd3NzZTJfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2UKK3sJc3RydWN0IF93c3NlMl9fUmVmZXJlbmNlKgkJUmVmZXJlbmNlOworCXN0cnVjdCBfd3NzZTJfX0tleUlkZW50aWZpZXIqCQlLZXlJZGVudGlmaWVyOworCXN0cnVjdCBfd3NzZTJfX0VtYmVkZGVkKgkJCUVtYmVkZGVkOworCUBjaGFyKgkJCQkJd3N1X19JZDsKKwlAY2hhcioJCQkJCVVzYWdlOworfSBfd3NzZTJfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2U7CisKKy8vLyBFbGVtZW50ICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOlNlY3VyaXR5IG9mIGNvbXBsZXhUeXBlICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOlNlY3VyaXR5SGVhZGVyVHlwZS4KKy8vLyBAYnJpZWYgVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIHdzc2U6U2VjdXJpdHkgU09BUCBoZWFkZXIgZWxlbWVudCBwZXIgU2VjdGlvbiA0LgorLy8vIEltcG9ydGVkIGVsZW1lbnQgX3dzc2UyX19TZWN1cml0eSBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuCisjaW1wb3J0ICJkczIuaCIKK3R5cGVkZWYgc3RydWN0IF93c3NlMl9fU2VjdXJpdHkKK3sJc3RydWN0IF93c3VfX1RpbWVzdGFtcCoJCQl3c3VfX1RpbWVzdGFtcDsKKwlzdHJ1Y3QgX3dzc2UyX19Vc2VybmFtZVRva2VuKgkJVXNlcm5hbWVUb2tlbjsKKwlzdHJ1Y3QgX3dzc2UyX19CaW5hcnlTZWN1cml0eVRva2VuKglCaW5hcnlTZWN1cml0eVRva2VuOworCXN0cnVjdCBkc19fU2lnbmF0dXJlVHlwZSoJCWRzX19TaWduYXR1cmU7CisJQGNoYXIqCQkJCQlTT0FQX0VOVl9fYWN0b3I7CisJQGNoYXIqCQkJCQlTT0FQX0VOVl9fcm9sZTsKK30gX3dzc2UyX19TZWN1cml0eTsKKworLy8vIEVsZW1lbnQgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6VHJhbnNmb3JtYXRpb25QYXJhbWV0ZXJzIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOlRyYW5zZm9ybWF0aW9uUGFyYW1ldGVyc1R5cGUuCisvLy8gQGJyaWVmIFRoaXMgZWxlbWVudCBjb250YWlucyBwcm9wZXJ0aWVzIGZvciB0cmFuc2Zvcm1hdGlvbnMgZnJvbSBhbnkgbmFtZXNwYWNlLCBpbmNsdWRpbmcgRFNJRy4KKy8vLyAnX3dzc2UyX19UcmFuc2Zvcm1hdGlvblBhcmFtZXRlcnMnIGVsZW1lbnQgZGVmaW5pdGlvbiBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsuCisKKy8vLyBFbGVtZW50ICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOlBhc3N3b3JkIG9mIGNvbXBsZXhUeXBlICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOlBhc3N3b3JkU3RyaW5nLgorLy8vIEltcG9ydGVkIGVsZW1lbnQgX3dzc2UyX19QYXNzd29yZCBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuCit0eXBlZGVmIHN0cnVjdCBfd3NzZTJfX1Bhc3N3b3JkCit7CWNoYXIqCQkJCQlfX2l0ZW07CisJQGNoYXIqCQkJCQlUeXBlOworfSBfd3NzZTJfX1Bhc3N3b3JkOworCisvLy8gRWxlbWVudCAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpOb25jZSBvZiBjb21wbGV4VHlwZSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjpFbmNvZGVkU3RyaW5nLgorLy8vICdfd3NzZTJfX05vbmNlJyBlbGVtZW50IGRlZmluaXRpb24gaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rLgorCisvLy8gQXR0cmlidXRlICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiOlVzYWdlIG9mIHNpbXBsZVR5cGUgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI6dFVzYWdlLgorLy8vIEBicmllZiBUaGlzIGdsb2JhbCBhdHRyaWJ1dGUgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgdXNhZ2Ugb2YgYSByZWZlcmVuY2VkIG9yIGluZGljYXRlZCB0b2tlbiB3aXRoaW4gdGhlIGNvbnRhaW5pbmcgY29udGV4dAorLy8vICdfd3NzZTJfX1VzYWdlJyBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsuCisKKy8qIEVuZCBvZiB3c3NlLmggKi8KZGlmZiAtLWdpdCBhL2ltcG9ydC93c3UuaCBiL2ltcG9ydC93c3UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTE0NDljCi0tLSAvZGV2L251bGwKKysrIGIvaW1wb3J0L3dzdS5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisKK3dzdS5oCisKK0dlbmVyYXRlZCB3aXRoOgord3NkbDJoIC1jZWd5IC1vIHdzdS5oIC10IFdTL1dTLXR5cGVtYXAuZGF0IFdTL3dzdS54c2QKKworTW9kaWZpZWQgYnkgUm9iZXJ0IHZhbiBFbmdlbGVuOgorCistIFJlbW92ZWQgLy9nc29hcG9wdAorLSBBZGRlZCB0aGUgZm9sbG93aW5nIGRpcmVjdGl2ZSB0byBpbXBvcnQgd3N1IG5hbWVzcGFjZQorICAvL2dzb2FwIHdzdSBzY2hlbWEgaW1wb3J0OiBodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktdXRpbGl0eS0xLjAueHNkCisgIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBXUy1BZGRyZXNzaW5nIHNjaGVtYXMgYXJlIG5vdCBjb3BpZWQgaW50byB0aGUgZ2VuZXJhdGVkCisgIFdTREwgYnkgc29hcGNwcDIgYnV0IGFyZSByZWZlcmVuY2VkIHdpdGggc2NoZW1hIGltcG9ydCBpbiB0aGUgZ2VuZXJhdGVkIFdTREwuCisKKyovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktdXRpbGl0eS0xLjAueHNkKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogSW1wb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogU2NoZW1hIE5hbWVzcGFjZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy9nc29hcCB3c3UgICBzY2hlbWEgaW1wb3J0OglodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktdXRpbGl0eS0xLjAueHNkCisvL2dzb2FwIHdzdSAgIHNjaGVtYSBlbGVtZW50Rm9ybToJcXVhbGlmaWVkCisvL2dzb2FwIHdzdSAgIHNjaGVtYSBhdHRyaWJ1dGVGb3JtOgl1bnF1YWxpZmllZAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogU2NoZW1hIFR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKKy8vLyBJbXBvcnRlZCBjb21wbGV4VHlwZSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXV0aWxpdHktMS4wLnhzZCI6QXR0cmlidXRlZERhdGVUaW1lIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4KKy8vLyBAYnJpZWYgVGhpcyB0eXBlIGlzIGZvciBlbGVtZW50cyB3aG9zZSBbY2hpbGRyZW5dIGlzIGEgcHN1ZWRvLWRhdGVUaW1lIGFuZCBjYW4gaGF2ZSBhcmJpdHJhcnkgYXR0cmlidXRlcy4KKy8vLyBjb21wbGV4VHlwZSBkZWZpbml0aW9uIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4KKworLy8vIEltcG9ydGVkIGNvbXBsZXhUeXBlICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktdXRpbGl0eS0xLjAueHNkIjpBdHRyaWJ1dGVkVVJJIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4KKy8vLyBAYnJpZWYgVGhpcyB0eXBlIGlzIGZvciBlbGVtZW50cyB3aG9zZSBbY2hpbGRyZW5dIGlzIGFuIGFueVVSSSBhbmQgY2FuIGhhdmUgYXJiaXRyYXJ5IGF0dHJpYnV0ZXMuCisvLy8gY29tcGxleFR5cGUgZGVmaW5pdGlvbiBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsuCisKKy8vLyBJbXBvcnRlZCBjb21wbGV4VHlwZSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXV0aWxpdHktMS4wLnhzZCI6VGltZXN0YW1wVHlwZSBmcm9tIHR5cGVtYXAgV1MvV1MtdHlwZW1hcC5kYXQuCisvLy8gQGJyaWVmIFRoaXMgY29tcGxleCB0eXBlIHRpZXMgdG9nZXRoZXIgdGhlIHRpbWVzdGFtcCByZWxhdGVkIGVsZW1lbnRzIGludG8gYSBjb21wb3NpdGUgdHlwZS4KKy8vLyBjb21wbGV4VHlwZSBkZWZpbml0aW9uIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4KKworLy8vICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktdXRpbGl0eS0xLjAueHNkIjp0VGltZXN0YW1wRmF1bHQgaXMgYSBzaW1wbGVUeXBlIHJlc3RyaWN0aW9uIG9mIHhzOlFOYW1lLgorLy8vIEBicmllZiBUaGlzIHR5cGUgZGVmaW5lcyB0aGUgZmF1bHQgY29kZSB2YWx1ZSBmb3IgVGltZXN0YW1wIG1lc3NhZ2UgZXhwaXJhdGlvbi4KKy8vLyBOb3RlOiBlbnVtIHZhbHVlcyBhcmUgcHJlZml4ZWQgd2l0aCAnd3N1X190VGltZXN0YW1wRmF1bHQnIHRvIGF2b2lkIG5hbWUgY2xhc2hlcywgcGxlYXNlIHVzZSB3c2RsMmggb3B0aW9uIC1lIHRvIG9taXQgdGhpcyBwcmVmaXgKK2VudW0gd3N1X190VGltZXN0YW1wRmF1bHQKK3sKKwl3c3VfX01lc3NhZ2VFeHBpcmVkLAkvLy88IHhzOlFOYW1lIHZhbHVlPSIiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXV0aWxpdHktMS4wLnhzZCI6TWVzc2FnZUV4cGlyZWQiCit9OworLy8vIFR5cGVkZWYgc3lub255bSBmb3IgZW51bSB3c3VfX3RUaW1lc3RhbXBGYXVsdC4KK3R5cGVkZWYgZW51bSB3c3VfX3RUaW1lc3RhbXBGYXVsdCB3c3VfX3RUaW1lc3RhbXBGYXVsdDsKKworLy8vIEVsZW1lbnQgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS11dGlsaXR5LTEuMC54c2QiOlRpbWVzdGFtcCBvZiBjb21wbGV4VHlwZSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXV0aWxpdHktMS4wLnhzZCI6VGltZXN0YW1wVHlwZS4KKy8vLyBAYnJpZWYgVGhpcyBlbGVtZW50IGFsbG93cyBUaW1lc3RhbXBzIHRvIGJlIGFwcGxpZWQgYW55d2hlcmUgZWxlbWVudCB3aWxkY2FyZHMgYXJlIHByZXNlbnQsIGluY2x1ZGluZyBhcyBhIFNPQVAgaGVhZGVyLgorLy8vIEltcG9ydGVkIGVsZW1lbnQgX3dzdV9fVGltZXN0YW1wIGZyb20gdHlwZW1hcCBXUy9XUy10eXBlbWFwLmRhdC4KK3R5cGVkZWYgc3RydWN0IF93c3VfX1RpbWVzdGFtcAorewlAY2hhcioJd3N1X19JZDsJLy8gdXNlIHF1YWxpZmllZCBmb3JtIHRvIGVuYWJsZSBzaWduYXR1cmUKKwljaGFyKglDcmVhdGVkOworCWNoYXIqCUV4cGlyZXM7Cit9IF93c3VfX1RpbWVzdGFtcDsKKworLy8vIEVsZW1lbnQgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS11dGlsaXR5LTEuMC54c2QiOkV4cGlyZXMgb2YgY29tcGxleFR5cGUgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS11dGlsaXR5LTEuMC54c2QiOkF0dHJpYnV0ZWREYXRlVGltZS4KKy8vLyBAYnJpZWYgVGhpcyBlbGVtZW50IGFsbG93cyBhbiBleHBpcmF0aW9uIHRpbWUgdG8gYmUgYXBwbGllZCBhbnl3aGVyZSBlbGVtZW50IHdpbGRjYXJkcyBhcmUgcHJlc2VudC4KKy8vLyAnX3dzdV9fRXhwaXJlcycgZWxlbWVudCBkZWZpbml0aW9uIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4KKworLy8vIEVsZW1lbnQgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS11dGlsaXR5LTEuMC54c2QiOkNyZWF0ZWQgb2YgY29tcGxleFR5cGUgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS11dGlsaXR5LTEuMC54c2QiOkF0dHJpYnV0ZWREYXRlVGltZS4KKy8vLyBAYnJpZWYgVGhpcyBlbGVtZW50IGFsbG93cyBhIGNyZWF0aW9uIHRpbWUgdG8gYmUgYXBwbGllZCBhbnl3aGVyZSBlbGVtZW50IHdpbGRjYXJkcyBhcmUgcHJlc2VudC4KKy8vLyAnX3dzdV9fQ3JlYXRlZCcgZWxlbWVudCBkZWZpbml0aW9uIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4KKworLy8vIEF0dHJpYnV0ZSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXV0aWxpdHktMS4wLnhzZCI6SWQgb2Ygc2ltcGxlVHlwZSB4czpJRC4KKy8vLyBAYnJpZWYgVGhpcyBnbG9iYWwgYXR0cmlidXRlIHN1cHBvcnRzIGFubm90YXRpbmcgYXJiaXRyYXJ5IGVsZW1lbnRzIHdpdGggYW4gSUQuCisvLy8gJ193c3VfX0lkJyBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsuCisKKy8qIEVuZCBvZiB3c3UuaCAqLwpkaWZmIC0tZ2l0IGEvaW1wb3J0L3hsaW5rLmggYi9pbXBvcnQveGxpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjllYTgyCi0tLSAvZGV2L251bGwKKysrIGIvaW1wb3J0L3hsaW5rLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKworeGxpbmsuaAorCitVc2UgI2ltcG9ydCAieGxpbmsuaCIgaW4gYSBnU09BUCBoZWFkZXIgZmlsZSB0byBlbmFibGUgeGxpbmsgMTk5OSBiaW5kaW5ncy4KKworVXNlIHNvYXBjcHAyIG9wdGlvbiAtSXBhdGg6cGF0aDouLi4gdG8gc3BlY2lmeSB0aGUgcGF0aChzKSBmb3IgI2ltcG9ydAorCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHBhcnQgb2YgdGhlIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2VzOgorR1BMLCB0aGUgZ1NPQVAgcHVibGljIGxpY2Vuc2UsIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBwdWJsaWMgbGljZW5zZS4KKworVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZ1NPQVAgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjMKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcGxpY2Vuc2UuaHRtbAorU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKK1dJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQorZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFJvYmVydCBBLiB2YW4gRW5nZWxlbi4KK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1IFJvYmVydCBBLiB2YW4gRW5nZWxlbiwgR2VuaXZpYSBpbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworLy9nc29hcCB4bGluayBzY2hlbWEgaW1wb3J0OiBodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rCmRpZmYgLS1naXQgYS9pbXBvcnQveG1pbWUuaCBiL2ltcG9ydC94bWltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MzliMjgKLS0tIC9kZXYvbnVsbAorKysgYi9pbXBvcnQveG1pbWUuaApAQCAtMCwwICsxLDU5IEBACisvKgorCit4bWltZS5oCisKK1VzZSAjaW1wb3J0ICJ4bWltZS5oIiBpbiBhIGdTT0FQIGhlYWRlciBmaWxlIHRvIGVuYWJsZSB4bWxtaW1lIDIwMDQvMDYgYmluZGluZ3MuCisKK1RoZSB4bWltZTpjb250ZW50VHlwZSBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gYXNzb2NpYXRlIGEgTUlNRSB0eXBlIHdpdGgKK2JpbmFyeSBjb250ZW50LCBhcyBpbjoKKworI2ltcG9ydCAieG1pbWUuaCIKK3N0cnVjdCBuc19fbXlCaW5hcnlEYXRhCit7IHVuc2lnbmVkIGNoYXIgKl9fcHRyOworICBpbnQgX19zaXplOworICBAY2hhciAqeG1pbWVfX2NvbnRlbnRUeXBlOworfTsKKworVXNlIHNvYXBjcHAyIG9wdGlvbiAtSXBhdGg6cGF0aDouLi4gdG8gc3BlY2lmeSB0aGUgcGF0aChzKSBmb3IgI2ltcG9ydAorCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHBhcnQgb2YgdGhlIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2VzOgorR1BMLCB0aGUgZ1NPQVAgcHVibGljIGxpY2Vuc2UsIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBwdWJsaWMgbGljZW5zZS4KKworVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZ1NPQVAgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjMKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcGxpY2Vuc2UuaHRtbAorU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKK1dJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQorZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFJvYmVydCBBLiB2YW4gRW5nZWxlbi4KK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1IFJvYmVydCBBLiB2YW4gRW5nZWxlbiwgR2VuaXZpYSBpbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworLy9nc29hcCB4bWltZSBzY2hlbWEgaW1wb3J0OiBodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA2L3htbG1pbWUKZGlmZiAtLWdpdCBhL2ltcG9ydC94bWwuaCBiL2ltcG9ydC94bWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmNmOTM5Ci0tLSAvZGV2L251bGwKKysrIGIvaW1wb3J0L3htbC5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisKK3htbC5oCisKK0xpdGVyYWwgWE1MIHN0cmluZ3MuCisKK0EgbGl0ZXJhbCBYTUwgc3RyaW5nIGNvbnRhaW5zIFhNTCBjb250ZW50LiBUaGlzIGRlY2xhcmF0aW9uIHByb3ZpZGVzIGEgc2ltcGxlCitpbnRlcmZhY2UgdG8gdGhlIGxpdGVyYWwgWE1MIHN0cmluZyBoYW5kbGVyLiBUaGUgWE1MIHN0cmluZyBjb250YWlucyBVVEY4Citjb250ZW50IHdoZW4gdGhlIFNPQVBfQ19VVEZTVFJJTkcgZmxhZyBpcyBzZXQuCisKK05vdGU6IHRoZSBidWlsdC1pbiBfWE1MIHR5cGUgcHJvdmlkZXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eS4KKworRXhhbXBsZToKKyNpbXBvcnQgInhtbC5oIgorc3RydWN0IG5zX19NeURhdGEKK3sgaW50IG51bTsKKyAgWE1MIHN0cjsgLy8gaGFzIFhNTCBjb250ZW50Cit9Oworc3RydWN0IG5zX19NaXhlZAoreyBpbnQgbnVtOworICBYTUwgX19hbnk7IC8vIF9fYW55IGlzIG5vdCBhIHRhZzogdGhpcyBhbGxvd3MgcGFyc2luZyBvZiBtaXhlZCBjb250ZW50Cit9OworCisKK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgcGFydCBvZiB0aGUgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXM6CitHUEwsIHRoZSBnU09BUCBwdWJsaWMgbGljZW5zZSwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIHB1YmxpYyBsaWNlbnNlLgorCitUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBnU09BUCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMworKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCitMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK2h0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9zb2FwbGljZW5zZS5odG1sCitTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAorV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCitmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLgorQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLCBHZW5pdmlhIGluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCit0eXBlZGVmIGNoYXIgKlhNTDsKZGlmZiAtLWdpdCBhL2ltcG9ydC94bWxtaW1lLmggYi9pbXBvcnQveG1sbWltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZGUwMTAKLS0tIC9kZXYvbnVsbAorKysgYi9pbXBvcnQveG1sbWltZS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisKK3htbG1pbWUuaAorCitVc2UgI2ltcG9ydCAieG1sbWltZS5oIiBpbiBhIGdTT0FQIGhlYWRlciBmaWxlIHRvIGVuYWJsZSB4bWxtaW1lIDIwMDQvMTEKK2JpbmRpbmdzLgorCitUaGUgeG1sbWltZTpjb250ZW50VHlwZSBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gYXNzb2NpYXRlIGEgTUlNRSB0eXBlIHdpdGgKK2JpbmFyeSBjb250ZW50LCBhcyBpbjoKKworI2ltcG9ydCAieG1sbWltZS5oIgorc3RydWN0IG5zX19teUJpbmFyeURhdGEKK3sgdW5zaWduZWQgY2hhciAqX19wdHI7CisgIGludCBfX3NpemU7CisgIEBjaGFyICp4bWxtaW1lX19jb250ZW50VHlwZTsKK307CisKK1VzZSBzb2FwY3BwMiBvcHRpb24gLUlwYXRoOnBhdGg6Li4uIHRvIHNwZWNpZnkgdGhlIHBhdGgocykgZm9yICNpbXBvcnQKKworZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlczoKK0dQTCwgdGhlIGdTT0FQIHB1YmxpYyBsaWNlbnNlLCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgcHVibGljIGxpY2Vuc2UuCisKK1RoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGdTT0FQIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4zCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKK0xpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoraHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL3NvYXBsaWNlbnNlLmh0bWwKK1NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCitXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKK2ZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK1RoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4uCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4sIEdlbml2aWEgaW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKy8vZ3NvYXAgeG1sbWltZSBzY2hlbWEgaW1wb3J0OiBodHRwOi8vd3d3LnczLm9yZy8yMDA0LzExL3htbG1pbWUKZGlmZiAtLWdpdCBhL2ltcG9ydC94b3AuaCBiL2ltcG9ydC94b3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmQzYTYyCi0tLSAvZGV2L251bGwKKysrIGIvaW1wb3J0L3hvcC5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisKK3hvcC5oCisKK1VzZSAjaW1wb3J0ICJ4b3AuaCIgaW4gYSBnU09BUCBoZWFkZXIgZmlsZSB0byBlbmFibGUgTVRPTSBhdHRhY2htZW50cy4KKworVXNlIFNPQVBfRU5DX01UT00gZmxhZyBpbiB5b3VyIGNvZGUgdG8gc3dpdGNoIHRvIE1UT00gYXR0YWNobWVudHMsIHNlZQordGhlIGdTT0FQIGRvY3VtZW50YXRpb24gc29hcGRvYzIuaHRtbAorCitVc2Ugc29hcGNwcDIgb3B0aW9uIC1JcGF0aDpwYXRoOi4uLiB0byBzcGVjaWZ5IHRoZSBwYXRoKHMpIGZvciAjaW1wb3J0CisKK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgcGFydCBvZiB0aGUgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXM6CitHUEwsIHRoZSBnU09BUCBwdWJsaWMgbGljZW5zZSwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIHB1YmxpYyBsaWNlbnNlLgorCitUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBnU09BUCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMworKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCitMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK2h0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9zb2FwbGljZW5zZS5odG1sCitTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAorV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCitmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLgorQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLCBHZW5pdmlhIGluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisvL2dzb2FwIHhvcCBzY2hlbWEgaW1wb3J0OiBodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3hvcC9pbmNsdWRlCisKK3N0cnVjdCBfeG9wX19JbmNsdWRlCit7IHVuc2lnbmVkIGNoYXIgKl9fcHRyOworICBpbnQgX19zaXplOworICBjaGFyICppZDsKKyAgY2hhciAqdHlwZTsKKyAgY2hhciAqb3B0aW9uczsKK307CisKK3R5cGVkZWYgc3RydWN0IF94b3BfX0luY2x1ZGUgX3hvcF9fSW5jbHVkZTsKZGlmZiAtLWdpdCBhL2xpY2Vuc2UuaHRtbCBiL2xpY2Vuc2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjIwOWY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGljZW5zZS5odG1sCkBAIC0wLDAgKzEsNTA5IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIg0KKyAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+DQorPGh0bWw+DQorPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJUdEggMy4zOSI+DQorIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+IGRpdi5wIHsgbWFyZ2luLXRvcDogN3B0O308L3N0eWxlPg0KKyA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPjwhLS0NCisgdGQgZGl2LmNvbXAgeyBtYXJnaW4tdG9wOiAtMC42ZXg7IG1hcmdpbi1ib3R0b206IC0xZXg7fQ0KKyB0ZCBkaXYuY29tYiB7IG1hcmdpbi10b3A6IC0wLjZleDsgbWFyZ2luLWJvdHRvbTogLS42ZXg7fQ0KKyB0ZCBkaXYuaHJjb21wIHsgbGluZS1oZWlnaHQ6IDAuOTsgbWFyZ2luLXRvcDogLTAuOGV4OyBtYXJnaW4tYm90dG9tOiAtMWV4O30NCisgdGQgZGl2Lm5vcm0ge2xpbmUtaGVpZ2h0Om5vcm1hbDt9DQorIHNwYW4ucm9tYW4ge2ZvbnQtZmFtaWx5OiBzZXJpZjsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsO30gDQorIHNwYW4ub3ZlcmFjYzIge3Bvc2l0aW9uOiByZWxhdGl2ZTsgIGxlZnQ6IC44ZW07IHRvcDogLTEuMmV4O30NCisgc3Bhbi5vdmVyYWNjMSB7cG9zaXRpb246IHJlbGF0aXZlOyAgbGVmdDogLjZlbTsgdG9wOiAtMS4yZXg7fSAtLT48L3N0eWxlPg0KKw0KKw0KKzx0aXRsZT4gIGdTT0FQIFB1YmxpYyBMaWNlbnNlPC90aXRsZT4NCisgDQorPGgxIGFsaWduPSJjZW50ZXIiPjxiPmdTT0FQIFB1YmxpYyBMaWNlbnNlPC9iPiA8L2gxPg0KKw0KKzxoMyBhbGlnbj0iY2VudGVyIj5WZXJzaW9uIDEuM2EgPC9oMz4NCisNCis8aDMgYWxpZ249ImNlbnRlciI+IDwvaDM+DQorIFRoZSBnU09BUCBwdWJsaWMgbGljZW5zZSBpcyBkZXJpdmVkIGZyb20gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgKE1QTDEuMSkuDQorVGhlIHNlY3Rpb25zIHRoYXQgd2VyZSBkZWxldGVkIGZyb20gdGhlIG9yaWdpbmFsIE1QTDEuMSB0ZXh0IGFyZSA8dT4xLjAuMTwvdT4sDQorPHU+Mi4xLihjKSwoZCk8L3U+LCA8dT4yLjIuKGMpLChkKTwvdT4sIDx1PjguMi4oYik8L3U+LCA8dT4xMDwvdT4sIGFuZCA8dT4xMTwvdT4uICBTZWN0aW9uIDx1PjMuODwvdT4gd2FzDQorYWRkZWQuICBUaGUgbW9kaWZpZWQgc2VjdGlvbnMgYXJlIDx1PjIuMS4oYik8L3U+LCA8dT4yLjIuKGIpPC91PiwgPHU+My4yPC91PiAoc2ltcGxpZmllZCksDQorPHU+My41PC91PiAoZGVsZXRlZCB0aGUgbGFzdCBzZW50ZW5jZSksIGFuZCA8dT4zLjY8L3U+IChzaW1wbGlmaWVkKS4NCisNCisgPGgyPjxhIG5hbWU9InR0aF9zRWMxIj4NCisxPC9hPiZuYnNwOyZuYnNwO0RFRklOSVRJT05TLjwvaDI+DQorDQorDQorPGRsIGNvbXBhY3Q9ImNvbXBhY3QiPg0KKw0KKyA8ZHQ+PGI+PHU+MS4wLjEuPC91PjwvYj48L2R0Pg0KKwk8ZGQ+PC9kZD4NCisgPGR0PjxiPjEuMS4gIkNvbnRyaWJ1dG9yIjwvYj48L2R0Pg0KKwk8ZGQ+DQorbWVhbnMgZWFjaCBlbnRpdHkgdGhhdCBjcmVhdGVzIG9yIGNvbnRyaWJ1dGVzIHRvIHRoZSBjcmVhdGlvbiBvZg0KK01vZGlmaWNhdGlvbnMuPC9kZD4NCisgPGR0PjxiPjEuMi4gIkNvbnRyaWJ1dG9yIFZlcnNpb24iPC9iPjwvZHQ+DQorCTxkZD4NCittZWFucyB0aGUgY29tYmluYXRpb24gb2YgdGhlIE9yaWdpbmFsIENvZGUsIHByaW9yDQorTW9kaWZpY2F0aW9ucyB1c2VkIGJ5IGEgQ29udHJpYnV0b3IsIGFuZCB0aGUgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQNCitwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLjwvZGQ+DQorIDxkdD48Yj4xLjMuICJDb3ZlcmVkIENvZGUiPC9iPjwvZHQ+DQorCTxkZD4NCittZWFucyB0aGUgT3JpZ2luYWwgQ29kZSwgb3IgTW9kaWZpY2F0aW9ucyBvciB0aGUgY29tYmluYXRpb24NCitvZiB0aGUgT3JpZ2luYWwgQ29kZSwgYW5kIE1vZGlmaWNhdGlvbnMsIGluIGVhY2ggY2FzZQ0KK2luY2x1ZGluZyBwb3J0aW9ucyB0aGVyZW9mLjwvZGQ+DQorIDxkdD48Yj4xLjQuICJFbGVjdHJvbmljIERpc3RyaWJ1dGlvbiBNZWNoYW5pc20iPC9iPjwvZHQ+DQorCTxkZD4NCittZWFucyBhIG1lY2hhbmlzbSBnZW5lcmFsbHkgYWNjZXB0ZWQgaW4gdGhlIHNvZnR3YXJlIGRldmVsb3BtZW50IGNvbW11bml0eSBmb3INCit0aGUgZWxlY3Ryb25pYyB0cmFuc2ZlciBvZiBkYXRhLjwvZGQ+DQorIDxkdD48Yj4xLjUuICJFeGVjdXRhYmxlIjwvYj48L2R0Pg0KKwk8ZGQ+DQorbWVhbnMgQ292ZXJlZCBDb2RlIGluIGFueSBmb3JtIG90aGVyIHRoYW4gU291cmNlIENvZGUuPC9kZD4NCisgPGR0PjxiPjEuNi4gIkluaXRpYWwgRGV2ZWxvcGVyIjwvYj48L2R0Pg0KKwk8ZGQ+DQorbWVhbnMgdGhlIGluZGl2aWR1YWwgb3IgZW50aXR5IGlkZW50aWZpZWQgYXMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGluIHRoZQ0KK1NvdXJjZSBDb2RlIG5vdGljZSByZXF1aXJlZCBieSA8Yj5FeGhpYml0IEE8L2I+LjwvZGQ+DQorIDxkdD48Yj4xLjcuICJMYXJnZXIgV29yayI8L2I+PC9kdD4NCisJPGRkPg0KK21lYW5zIGEgd29yayB3aGljaCBjb21iaW5lcyBDb3ZlcmVkIENvZGUgb3IgcG9ydGlvbnMgdGhlcmVvZiB3aXRoIGNvZGUgbm90DQorZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS48L2RkPg0KKyA8ZHQ+PGI+MS44LiAiTGljZW5zZSI8L2I+PC9kdD4NCisJPGRkPg0KK21lYW5zIHRoaXMgZG9jdW1lbnQuPC9kZD4NCisgPGR0PjxiPjEuOC4xLiAiTGljZW5zYWJsZSI8L2I+PC9kdD4NCisJPGRkPg0KK21lYW5zIGhhdmluZyB0aGUgcmlnaHQgdG8gZ3JhbnQsIHRvIHRoZSBtYXhpbXVtIGV4dGVudCBwb3NzaWJsZSwgd2hldGhlciBhdCB0aGUNCit0aW1lIG9mIHRoZSBpbml0aWFsIGdyYW50IG9yIHN1YnNlcXVlbnRseSBhY3F1aXJlZCwgYW55IGFuZCBhbGwgb2YgdGhlIHJpZ2h0cw0KK2NvbnZleWVkIGhlcmVpbi48L2RkPg0KKyA8ZHQ+PGI+MS45LiAiTW9kaWZpY2F0aW9ucyI8L2I+PC9kdD4NCisJPGRkPg0KK21lYW5zIGFueSBhZGRpdGlvbiB0byBvciBkZWxldGlvbiBmcm9tIHRoZSBzdWJzdGFuY2Ugb3Igc3RydWN0dXJlIG9mIGVpdGhlciB0aGUNCitPcmlnaW5hbCBDb2RlIG9yIGFueSBwcmV2aW91cyBNb2RpZmljYXRpb25zLiBXaGVuIENvdmVyZWQNCitDb2RlIGlzIHJlbGVhc2VkIGFzIGEgc2VyaWVzIG9mIGZpbGVzLCBhIE1vZGlmaWNhdGlvbiBpczoNCisNCis8ZGwgY29tcGFjdD0iY29tcGFjdCI+DQorDQorIDxkdD48Yj5BLjwvYj48L2R0Pg0KKwk8ZGQ+IEFueSBhZGRpdGlvbiB0byBvciBkZWxldGlvbiBmcm9tIHRoZSBjb250ZW50cyBvZiBhIGZpbGUgY29udGFpbmluZw0KK09yaWdpbmFsIENvZGUgb3IgcHJldmlvdXMgTW9kaWZpY2F0aW9ucy48L2RkPg0KKyA8ZHQ+PGI+Qi48L2I+PC9kdD4NCisJPGRkPiBBbnkgbmV3IGZpbGUgdGhhdCBjb250YWlucyBhbnkgcGFydCBvZiB0aGUgT3JpZ2luYWwgQ29kZSwNCitvciBwcmV2aW91cyBNb2RpZmljYXRpb25zLjwvZGQ+DQorPC9kbD48L2RkPg0KKyA8ZHQ+PGI+MS4xMC4gIk9yaWdpbmFsIENvZGUiPC9iPjwvZHQ+DQorCTxkZD4NCittZWFucyBTb3VyY2UgQ29kZSBvZiBjb21wdXRlciBzb2Z0d2FyZSBjb2RlIHdoaWNoIGlzIGRlc2NyaWJlZCBpbiB0aGUgU291cmNlDQorQ29kZSBub3RpY2UgcmVxdWlyZWQgYnkgPGI+RXhoaWJpdCBBPC9iPiBhcyBPcmlnaW5hbCBDb2RlLCBhbmQgd2hpY2gsIGF0IHRoZQ0KK3RpbWUgb2YgaXRzIHJlbGVhc2UgdW5kZXIgdGhpcyBMaWNlbnNlIGlzIG5vdCBhbHJlYWR5IENvdmVyZWQgQ29kZSBnb3Zlcm5lZCBieQ0KK3RoaXMgTGljZW5zZS48L2RkPg0KKyA8ZHQ+PGI+MS4xMC4xLiAiUGF0ZW50IENsYWltcyI8L2I+PC9kdD4NCisJPGRkPg0KK21lYW5zIGFueSBwYXRlbnQgY2xhaW0ocyksIG5vdyBvd25lZCBvciBoZXJlYWZ0ZXIgYWNxdWlyZWQsIGluY2x1ZGluZyB3aXRob3V0DQorbGltaXRhdGlvbiwgbWV0aG9kLCBwcm9jZXNzLCBhbmQgYXBwYXJhdHVzIGNsYWltcywgaW4gYW55IHBhdGVudCBMaWNlbnNhYmxlIGJ5DQorZ3JhbnRvci48L2RkPg0KKyA8ZHQ+PGI+MS4xMS4gIlNvdXJjZSBDb2RlIjwvYj48L2R0Pg0KKwk8ZGQ+DQorbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSBDb3ZlcmVkIENvZGUgZm9yIG1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LA0KK2luY2x1ZGluZyBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkgYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbg0KK2ZpbGVzLCBzY3JpcHRzIHVzZWQgdG8gY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIGFuIEV4ZWN1dGFibGUsDQorb3Igc291cmNlIGNvZGUgZGlmZmVyZW50aWFsIGNvbXBhcmlzb25zIGFnYWluc3QgZWl0aGVyIHRoZSBPcmlnaW5hbCBDb2RlIG9yDQorYW5vdGhlciB3ZWxsIGtub3duLCBhdmFpbGFibGUgQ292ZXJlZCBDb2RlIG9mIHRoZSBDb250cmlidXRvcidzIGNob2ljZS4gVGhlDQorU291cmNlIENvZGUgY2FuIGJlIGluIGEgY29tcHJlc3NlZCBvciBhcmNoaXZhbCBmb3JtLCBwcm92aWRlZCB0aGUgYXBwcm9wcmlhdGUNCitkZWNvbXByZXNzaW9uIG9yIGRlLWFyY2hpdmluZyBzb2Z0d2FyZSBpcyB3aWRlbHkgYXZhaWxhYmxlIGZvciBubyBjaGFyZ2UuPC9kZD4NCisgPGR0PjxiPjEuMTIuICJZb3UiIChvciAiWW91ciIpPC9iPjwvZHQ+DQorCTxkZD4NCittZWFucyBhbiBpbmRpdmlkdWFsIG9yIGEgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcmlnaHRzIHVuZGVyLCBhbmQgY29tcGx5aW5nDQord2l0aCBhbGwgb2YgdGhlIHRlcm1zIG9mLCB0aGlzIExpY2Vuc2Ugb3IgYSBmdXR1cmUgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2UNCitpc3N1ZWQgdW5kZXIgU2VjdGlvbiA8Yj42LjE8L2I+LiAgRm9yIGxlZ2FsIGVudGl0aWVzLCAiWW91IiBpbmNsdWRlcyBhbnkNCitlbnRpdHkgd2hpY2ggY29udHJvbHMsIGlzIGNvbnRyb2xsZWQgYnksIG9yIGlzIHVuZGVyIGNvbW1vbiBjb250cm9sIHdpdGggWW91Lg0KK0ZvciBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJjb250cm9sIiBtZWFucyA8Yj4oYSk8L2I+IHRoZSBwb3dlciwgZGlyZWN0IG9yDQoraW5kaXJlY3QsIHRvIGNhdXNlIHRoZSBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieQ0KK2NvbnRyYWN0IG9yIG90aGVyd2lzZSwgb3IgPGI+KGIpPC9iPiBvd25lcnNoaXAgb2YgbW9yZSB0aGFuIGZpZnR5IHBlcmNlbnQgKDUwJSkgb2YNCit0aGUgb3V0c3RhbmRpbmcgc2hhcmVzIG9yIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LjwvZGQ+DQorPC9kbD4NCisNCisgPGgyPjxhIG5hbWU9InR0aF9zRWMyIj4NCisyPC9hPiZuYnNwOyZuYnNwO1NPVVJDRSBDT0RFIExJQ0VOU0UuPC9oMj4NCisNCis8ZGwgY29tcGFjdD0iY29tcGFjdCI+DQorDQorIDxkdD48Yj4yLjEuIFRoZSBJbml0aWFsIERldmVsb3BlciBHcmFudC48L2I+PC9kdD4NCisJPGRkPjxiciAvPg0KK1RoZSBJbml0aWFsIERldmVsb3BlciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwNCitub24tZXhjbHVzaXZlIGxpY2Vuc2UsIHN1YmplY3QgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGNsYWltczoNCisNCis8ZGwgY29tcGFjdD0iY29tcGFjdCI+DQorDQorIDxkdD48Yj4oYSk8L2I+PC9kdD4NCisJPGRkPg0KK3VuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4gcGF0ZW50IG9yIHRyYWRlbWFyaykgTGljZW5zYWJsZQ0KK2J5IEluaXRpYWwgRGV2ZWxvcGVyIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnksIGRpc3BsYXksIHBlcmZvcm0sIHN1YmxpY2Vuc2UNCithbmQgZGlzdHJpYnV0ZSB0aGUgT3JpZ2luYWwgQ29kZSAob3IgcG9ydGlvbnMgdGhlcmVvZikgd2l0aCBvciB3aXRob3V0DQorTW9kaWZpY2F0aW9ucywgYW5kL29yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kPC9kZD4NCisgPGR0PjxiPjx1PihiKTwvdT48L2I+PC9kdD4NCisJPGRkPg0KK3VuZGVyIHBhdGVudHMgbm93IG9yIGhlcmVhZnRlciBvd25lZCBvciBjb250cm9sbGVkIGJ5IEluaXRpYWwgRGV2ZWxvcGVyLCB0bw0KK21ha2UsIGhhdmUgbWFkZSwgdXNlIGFuZCBzZWxsICgib2ZmZXIgdG8gc2VsbCBhbmQgaW1wb3J0IikgdGhlIE9yaWdpbmFsIENvZGUsDQorTW9kaWZpY2F0aW9ucywgb3IgcG9ydGlvbnMgdGhlcmVvZiwgYnV0IHNvbGVseSB0byB0aGUgZXh0ZW50IHRoYXQgYW55IHN1Y2gNCitwYXRlbnQgaXMgcmVhc29uYWJseSBuZWNlc3NhcnkgdG8gZW5hYmxlIFlvdSB0byB1dGlsaXplLCBhbG9uZSBvciBpbg0KK2NvbWJpbmF0aW9uIHdpdGggb3RoZXIgc29mdHdhcmUsIHRoZSBPcmlnaW5hbCBDb2RlLCBNb2RpZmljYXRpb25zLCBvciBhbnkNCitjb21iaW5hdGlvbiBvciBwb3J0aW9ucyB0aGVyZW9mLjwvZGQ+DQorIDxkdD48Yj48dT4oYyk8L3U+PC9iPjwvZHQ+DQorCTxkZD48L2RkPg0KKyA8ZHQ+PGI+PHU+KGQpPC91PjwvYj48L2R0Pg0KKwk8ZGQ+PC9kZD4NCis8L2RsPg0KKzxiciAvPg0KKzwvZGQ+DQorIDxkdD48Yj4yLjIuIENvbnRyaWJ1dG9yIEdyYW50LjwvYj48L2R0Pg0KKwk8ZGQ+PGJyIC8+DQorU3ViamVjdCB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgY2xhaW1zLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieQ0KK2dyYW50cyBZb3UgYSB3b3JsZC13aWRlLCByb3lhbHR5LWZyZWUsIG5vbi1leGNsdXNpdmUgbGljZW5zZQ0KKw0KKzxkbCBjb21wYWN0PSJjb21wYWN0Ij4NCisNCisgPGR0PjxiPihhKTwvYj48L2R0Pg0KKwk8ZGQ+DQordW5kZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyAob3RoZXIgdGhhbiBwYXRlbnQgb3IgdHJhZGVtYXJrKSBMaWNlbnNhYmxlDQorYnkgQ29udHJpYnV0b3IsIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnksIGRpc3BsYXksIHBlcmZvcm0sIHN1YmxpY2Vuc2UgYW5kDQorZGlzdHJpYnV0ZSB0aGUgTW9kaWZpY2F0aW9ucyBjcmVhdGVkIGJ5IHN1Y2ggQ29udHJpYnV0b3IgKG9yIHBvcnRpb25zIHRoZXJlb2YpDQorZWl0aGVyIG9uIGFuIHVubW9kaWZpZWQgYmFzaXMsIHdpdGggb3RoZXIgTW9kaWZpY2F0aW9ucywgYXMgQ292ZXJlZCBDb2RlIGFuZC9vcg0KK2FzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kPC9kZD4NCisgPGR0PjxiPjx1PihiKTwvdT48L2I+PC9kdD4NCisJPGRkPiANCit1bmRlciBwYXRlbnRzIG5vdyBvciBoZXJlYWZ0ZXIgb3duZWQgb3IgY29udHJvbGxlZCBieSBDb250cmlidXRvciwgdG8gbWFrZSwNCitoYXZlIG1hZGUsIHVzZSBhbmQgc2VsbCAoIm9mZmVyIHRvIHNlbGwgYW5kIGltcG9ydCIpIHRoZSBDb250cmlidXRvciBWZXJzaW9uDQorKG9yIHBvcnRpb25zIHRoZXJlb2YpLCBidXQgc29sZWx5IHRvIHRoZSBleHRlbnQgdGhhdCBhbnkgc3VjaCBwYXRlbnQgaXMNCityZWFzb25hYmx5IG5lY2Vzc2FyeSB0byBlbmFibGUgWW91IHRvIHV0aWxpemUsIGFsb25lIG9yIGluIGNvbWJpbmF0aW9uIHdpdGgNCitvdGhlciBzb2Z0d2FyZSwgdGhlIENvbnRyaWJ1dG9yIFZlcnNpb24gKG9yIHBvcnRpb25zIHRoZXJlb2YpLjwvZGQ+DQorIDxkdD48Yj48dT4oYyk8L3U+PC9iPjwvZHQ+DQorCTxkZD48L2RkPg0KKyA8ZHQ+PGI+PHU+KGQpPC91PjwvYj48L2R0Pg0KKwk8ZGQ+PC9kZD4NCis8L2RsPjwvZGQ+DQorPC9kbD4NCisNCisgPGgyPjxhIG5hbWU9InR0aF9zRWMzIj4NCiszPC9hPiZuYnNwOyZuYnNwO0RJU1RSSUJVVElPTiBPQkxJR0FUSU9OUy48L2gyPg0KKw0KKzxkbCBjb21wYWN0PSJjb21wYWN0Ij4NCisNCisgPGR0PjxiPjMuMS4gQXBwbGljYXRpb24gb2YgTGljZW5zZS48L2I+PC9kdD4NCisJPGRkPjxiciAvPg0KK1RoZSBNb2RpZmljYXRpb25zIHdoaWNoIFlvdSBjcmVhdGUgb3IgdG8gd2hpY2ggWW91IGNvbnRyaWJ1dGUgYXJlIGdvdmVybmVkIGJ5DQordGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiBTZWN0aW9uIDxiPjIuMjwvYj4uICBUaGUNCitTb3VyY2UgQ29kZSB2ZXJzaW9uIG9mIENvdmVyZWQgQ29kZSBtYXkgYmUgZGlzdHJpYnV0ZWQgb25seSB1bmRlciB0aGUgdGVybXMgb2YNCit0aGlzIExpY2Vuc2Ugb3IgYSBmdXR1cmUgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2UgcmVsZWFzZWQgdW5kZXIgU2VjdGlvbiA8Yj42LjE8L2I+LCBhbmQgWW91IG11c3QgaW5jbHVkZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIHdpdGggZXZlcnkgY29weSBvZiB0aGUgU291cmNlDQorQ29kZSBZb3UgZGlzdHJpYnV0ZS4gWW91IG1heSBub3Qgb2ZmZXIgb3IgaW1wb3NlIGFueSB0ZXJtcyBvbiBhbnkgU291cmNlIENvZGUNCit2ZXJzaW9uIHRoYXQgYWx0ZXJzIG9yIHJlc3RyaWN0cyB0aGUgYXBwbGljYWJsZSB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZSBvciB0aGUNCityZWNpcGllbnRzJyByaWdodHMgaGVyZXVuZGVyLiBIb3dldmVyLCBZb3UgbWF5IGluY2x1ZGUgYW4gYWRkaXRpb25hbCBkb2N1bWVudA0KK29mZmVyaW5nIHRoZSBhZGRpdGlvbmFsIHJpZ2h0cyBkZXNjcmliZWQgaW4gU2VjdGlvbiA8Yj4zLjU8L2I+Lg0KKzxiciAvPjxiciAvPg0KKzwvZGQ+DQorIDxkdD48Yj48dT4zLjIuPC91PiBBdmFpbGFiaWxpdHkgb2YgU291cmNlIENvZGUuPC9iPjwvZHQ+DQorCTxkZD48YnIgLz4NCitBbnkgTW9kaWZpY2F0aW9uIGNyZWF0ZWQgYnkgWW91IHdpbGwgYmUgcHJvdmlkZWQgdG8gdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGluDQorU291cmNlIENvZGUgZm9ybSBhbmQgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBMaWNlbnNlLg0KKzxiciAvPjxiciAvPg0KKzwvZGQ+DQorIDxkdD48Yj4zLjMuIERlc2NyaXB0aW9uIG9mIE1vZGlmaWNhdGlvbnMuPC9iPjwvZHQ+DQorCTxkZD48YnIgLz4NCitZb3UgbXVzdCBjYXVzZSBhbGwgQ292ZXJlZCBDb2RlIHRvIHdoaWNoIFlvdSBjb250cmlidXRlIHRvIGNvbnRhaW4gYSBmaWxlDQorZG9jdW1lbnRpbmcgdGhlIGNoYW5nZXMgWW91IG1hZGUgdG8gY3JlYXRlIHRoYXQgQ292ZXJlZCBDb2RlIGFuZCB0aGUgZGF0ZSBvZg0KK2FueSBjaGFuZ2UuIFlvdSBtdXN0IGluY2x1ZGUgYSBwcm9taW5lbnQgc3RhdGVtZW50IHRoYXQgdGhlIE1vZGlmaWNhdGlvbiBpcw0KK2Rlcml2ZWQsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIGZyb20gT3JpZ2luYWwgQ29kZSBwcm92aWRlZCBieSB0aGUgSW5pdGlhbA0KK0RldmVsb3BlciBhbmQgaW5jbHVkaW5nIHRoZSBuYW1lIG9mIHRoZSBJbml0aWFsIERldmVsb3BlciBpbiA8Yj4oYSk8L2I+IHRoZSBTb3VyY2UNCitDb2RlLCBhbmQgPGI+KGIpPC9iPiBpbiBhbnkgbm90aWNlIGluIGFuIEV4ZWN1dGFibGUgdmVyc2lvbiBvciByZWxhdGVkIGRvY3VtZW50YXRpb24NCitpbiB3aGljaCBZb3UgZGVzY3JpYmUgdGhlIG9yaWdpbiBvciBvd25lcnNoaXAgb2YgdGhlIENvdmVyZWQgQ29kZS4NCis8YnIgLz48YnIgLz4NCis8L2RkPg0KKyA8ZHQ+PGI+My40LiBJbnRlbGxlY3R1YWwgUHJvcGVydHkgTWF0dGVycy48L2I+PC9kdD4NCisJPGRkPg0KKw0KKzxkbCBjb21wYWN0PSJjb21wYWN0Ij4NCisNCisgPGR0PjxiPihhKSBUaGlyZCBQYXJ0eSBDbGFpbXMuPC9iPjwvZHQ+DQorCTxkZD4NCitJZiBDb250cmlidXRvciBoYXMga25vd2xlZGdlIHRoYXQgYSBsaWNlbnNlIHVuZGVyIGEgdGhpcmQgcGFydHkncyBpbnRlbGxlY3R1YWwNCitwcm9wZXJ0eSByaWdodHMgaXMgcmVxdWlyZWQgdG8gZXhlcmNpc2UgdGhlIHJpZ2h0cyBncmFudGVkIGJ5IHN1Y2ggQ29udHJpYnV0b3INCit1bmRlciBTZWN0aW9ucyA8Yj4yLjE8L2I+IG9yIDxiPjIuMjwvYj4sIENvbnRyaWJ1dG9yIG11c3QgaW5jbHVkZSBhIHRleHQgZmlsZSB3aXRoIHRoZSBTb3VyY2UNCitDb2RlIGRpc3RyaWJ1dGlvbiB0aXRsZWQgIkxFR0FMIiB3aGljaCBkZXNjcmliZXMgdGhlIGNsYWltIGFuZCB0aGUgcGFydHkNCittYWtpbmcgdGhlIGNsYWltIGluIHN1ZmZpY2llbnQgZGV0YWlsIHRoYXQgYSByZWNpcGllbnQgd2lsbCBrbm93IHdob20gdG8NCitjb250YWN0LiBJZiBDb250cmlidXRvciBvYnRhaW5zIHN1Y2gga25vd2xlZGdlIGFmdGVyIHRoZSBNb2RpZmljYXRpb24gaXMgbWFkZQ0KK2F2YWlsYWJsZSBhcyBkZXNjcmliZWQgaW4gU2VjdGlvbiA8Yj4zLjI8L2I+LCBDb250cmlidXRvciBzaGFsbCBwcm9tcHRseSBtb2RpZnkgdGhlDQorTEVHQUwgZmlsZSBpbiBhbGwgY29waWVzIENvbnRyaWJ1dG9yIG1ha2VzIGF2YWlsYWJsZSB0aGVyZWFmdGVyIGFuZCBzaGFsbCB0YWtlDQorb3RoZXIgc3RlcHMgKHN1Y2ggYXMgbm90aWZ5aW5nIGFwcHJvcHJpYXRlIG1haWxpbmcgbGlzdHMgb3IgbmV3c2dyb3VwcykNCityZWFzb25hYmx5IGNhbGN1bGF0ZWQgdG8gaW5mb3JtIHRob3NlIHdobyByZWNlaXZlZCB0aGUgQ292ZXJlZCBDb2RlIHRoYXQgbmV3DQora25vd2xlZGdlIGhhcyBiZWVuIG9idGFpbmVkLjwvZGQ+DQorIDxkdD48Yj4oYikgQ29udHJpYnV0b3IgQVBJcy48L2I+PC9kdD4NCisJPGRkPg0KK0lmIENvbnRyaWJ1dG9yJ3MgTW9kaWZpY2F0aW9ucyBpbmNsdWRlIGFuIGFwcGxpY2F0aW9uIHByb2dyYW1taW5nIGludGVyZmFjZSBhbmQNCitDb250cmlidXRvciBoYXMga25vd2xlZGdlIG9mIHBhdGVudCBsaWNlbnNlcyB3aGljaCBhcmUgcmVhc29uYWJseSBuZWNlc3NhcnkgdG8NCitpbXBsZW1lbnQgdGhhdCBBUEksIENvbnRyaWJ1dG9yIG11c3QgYWxzbyBpbmNsdWRlIHRoaXMgaW5mb3JtYXRpb24gaW4gdGhlIExFR0FMDQorZmlsZS48L2RkPg0KKyA8ZHQ+PGI+KGMpIFJlcHJlc2VudGF0aW9ucy48L2I+PC9kdD4NCisJPGRkPg0KK0NvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCwgZXhjZXB0IGFzIGRpc2Nsb3NlZCBwdXJzdWFudCB0byBTZWN0aW9uIDxiPg0KKzMuNChhKTwvYj4gYWJvdmUsIENvbnRyaWJ1dG9yIGJlbGlldmVzIHRoYXQgQ29udHJpYnV0b3IncyBNb2RpZmljYXRpb25zIGFyZQ0KK0NvbnRyaWJ1dG9yJ3Mgb3JpZ2luYWwgY3JlYXRpb24ocykgYW5kL29yIENvbnRyaWJ1dG9yIGhhcyBzdWZmaWNpZW50IHJpZ2h0cyB0bw0KK2dyYW50IHRoZSByaWdodHMgY29udmV5ZWQgYnkgdGhpcyBMaWNlbnNlLjwvZGQ+DQorPC9kbD4NCis8YnIgLz4NCis8L2RkPg0KKyA8ZHQ+PGI+PHU+My41LjwvdT4gUmVxdWlyZWQgTm90aWNlcy48L2I+PC9kdD4NCisJPGRkPjxiciAvPg0KK1lvdSBtdXN0IGR1cGxpY2F0ZSB0aGUgbm90aWNlIGluIDxiPkV4aGliaXQgQTwvYj4gaW4gZWFjaCBmaWxlIG9mIHRoZSBTb3VyY2UNCitDb2RlLiBJZiBpdCBpcyBub3QgcG9zc2libGUgdG8gcHV0IHN1Y2ggbm90aWNlIGluIGEgcGFydGljdWxhciBTb3VyY2UgQ29kZSBmaWxlDQorZHVlIHRvIGl0cyBzdHJ1Y3R1cmUsIHRoZW4gWW91IG11c3QgaW5jbHVkZSBzdWNoIG5vdGljZSBpbiBhIGxvY2F0aW9uIChzdWNoIGFzDQorYSByZWxldmFudCBkaXJlY3RvcnkpIHdoZXJlIGEgdXNlciB3b3VsZCBiZSBsaWtlbHkgdG8gbG9vayBmb3Igc3VjaCBhIG5vdGljZS4NCitJZiBZb3UgY3JlYXRlZCBvbmUgb3IgbW9yZSBNb2RpZmljYXRpb24ocykgWW91IG1heSBhZGQgeW91ciBuYW1lIGFzIGENCitDb250cmlidXRvciB0byB0aGUgbm90aWNlIGRlc2NyaWJlZCBpbiA8Yj5FeGhpYml0IEE8L2I+LiBZb3UgbXVzdCBhbHNvIGR1cGxpY2F0ZQ0KK3RoaXMgTGljZW5zZSBpbiBhbnkgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIFNvdXJjZSBDb2RlIHdoZXJlIFlvdSBkZXNjcmliZQ0KK3JlY2lwaWVudHMnIHJpZ2h0cyBvciBvd25lcnNoaXAgcmlnaHRzIHJlbGF0aW5nIHRvIENvdmVyZWQgQ29kZS4gWW91IG1heSBjaG9vc2UNCit0byBvZmZlciwgYW5kIHRvIGNoYXJnZSBhIGZlZSBmb3IsIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5DQorb2JsaWdhdGlvbnMgdG8gb25lIG9yIG1vcmUgcmVjaXBpZW50cyBvZiBDb3ZlcmVkIENvZGUuIEhvd2V2ZXIsIFlvdSBtYXkgZG8gc28NCitvbmx5IG9uIFlvdXIgb3duIGJlaGFsZiwgYW5kIG5vdCBvbiBiZWhhbGYgb2YgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIGFueQ0KK0NvbnRyaWJ1dG9yLg0KKzxiciAvPjxiciAvPg0KKzwvZGQ+DQorIDxkdD48Yj48dT4zLjY8L3U+LiBEaXN0cmlidXRpb24gb2YgRXhlY3V0YWJsZSBWZXJzaW9ucy48L2I+PC9kdD4NCisJPGRkPjxiciAvPg0KK1lvdSBtYXkgZGlzdHJpYnV0ZSBDb3ZlcmVkIENvZGUgaW4gRXhlY3V0YWJsZSBmb3JtIG9ubHkgaWYgdGhlIHJlcXVpcmVtZW50cw0KK29mIFNlY3Rpb24gPGI+My4xPC9iPi08Yj4zLjU8L2I+IGhhdmUgYmVlbiBtZXQgZm9yIHRoYXQgQ292ZXJlZCBDb2RlLiBZb3UgbWF5IGRpc3RyaWJ1dGUgdGhlDQorRXhlY3V0YWJsZSB2ZXJzaW9uIG9mIENvdmVyZWQgQ29kZSBvciBvd25lcnNoaXAgcmlnaHRzIHVuZGVyIGEgbGljZW5zZSBvZiBZb3VyDQorY2hvaWNlLCB3aGljaCBtYXkgY29udGFpbiB0ZXJtcyBkaWZmZXJlbnQgZnJvbSB0aGlzIExpY2Vuc2UsIHByb3ZpZGVkIHRoYXQgWW91DQorYXJlIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGFuZCB0aGF0IHRoZSBsaWNlbnNlIGZvciB0aGUNCitFeGVjdXRhYmxlIHZlcnNpb24gZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdCBvciBhbHRlciB0aGUgcmVjaXBpZW50J3MgcmlnaHRzIGluDQordGhlIFNvdXJjZSBDb2RlIHZlcnNpb24gZnJvbSB0aGUgcmlnaHRzIHNldCBmb3J0aCBpbiB0aGlzIExpY2Vuc2UuICBJZiBZb3UNCitkaXN0cmlidXRlIHRoZSBFeGVjdXRhYmxlIHZlcnNpb24gdW5kZXIgYSBkaWZmZXJlbnQgbGljZW5zZSBZb3UgbXVzdCBtYWtlIGl0DQorYWJzb2x1dGVseSBjbGVhciB0aGF0IGFueSB0ZXJtcyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIExpY2Vuc2UgYXJlIG9mZmVyZWQgYnkNCitZb3UgYWxvbmUsIG5vdCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgYW55IENvbnRyaWJ1dG9yLiAgSWYgeW91DQorZGlzdHJpYnV0ZSBleGVjdXRhYmxlIHZlcnNpb25zIGNvbnRhaW5pbmcgQ292ZXJlZCBDb2RlIGFzIHBhcnQgb2YgYSBwcm9kdWN0LA0KK3lvdSBtdXN0IHJlcHJvZHVjZSB0aGUgbm90aWNlIGluIDxiPkV4aGliaXQgQjwvYj4gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yDQorb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIHByb2R1Y3QuDQorPGJyIC8+PGJyIC8+DQorPC9kZD4NCisgPGR0PjxiPjMuNy4gTGFyZ2VyIFdvcmtzLjwvYj48L2R0Pg0KKwk8ZGQ+PGJyIC8+DQorWW91IG1heSBjcmVhdGUgYSBMYXJnZXIgV29yayBieSBjb21iaW5pbmcgQ292ZXJlZCBDb2RlIHdpdGggb3RoZXIgY29kZSBub3QNCitnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBMYXJnZXIgV29yayBhcyBhDQorc2luZ2xlIHByb2R1Y3QuIEluIHN1Y2ggYSBjYXNlLCBZb3UgbXVzdCBtYWtlIHN1cmUgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGlzDQorTGljZW5zZSBhcmUgZnVsZmlsbGVkIGZvciB0aGUgQ292ZXJlZCBDb2RlLg0KKzxiciAvPjxiciAvPg0KKzwvZGQ+DQorIDxkdD48Yj48dT4zLjguPC91PiBSZXN0cmljdGlvbnMuPC9iPjwvZHQ+DQorCTxkZD48YnIgLz4NCitZb3UgbWF5IG5vdCByZW1vdmUgYW55IHByb2R1Y3QgaWRlbnRpZmljYXRpb24sIGNvcHlyaWdodCwgcHJvcHJpZXRhcnkgbm90aWNlcyBvciBsYWJlbHMgZnJvbSBnU09BUC48L2RkPg0KKzwvZGw+DQorDQorIDxoMj48YSBuYW1lPSJ0dGhfc0VjNCI+DQorNDwvYT4mbmJzcDsmbmJzcDtJTkFCSUxJVFkgVE8gQ09NUExZIERVRSBUTyBTVEFUVVRFIE9SIFJFR1VMQVRJT04uPC9oMj4NCitJZiBpdCBpcyBpbXBvc3NpYmxlIGZvciBZb3UgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UNCit3aXRoIHJlc3BlY3QgdG8gc29tZSBvciBhbGwgb2YgdGhlIENvdmVyZWQgQ29kZSBkdWUgdG8gc3RhdHV0ZSwganVkaWNpYWwgb3JkZXIsDQorb3IgcmVndWxhdGlvbiB0aGVuIFlvdSBtdXN0OiA8Yj4oYSk8L2I+IGNvbXBseSB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgdG8gdGhlDQorbWF4aW11bSBleHRlbnQgcG9zc2libGU7IGFuZCA8Yj4oYik8L2I+IGRlc2NyaWJlIHRoZSBsaW1pdGF0aW9ucyBhbmQgdGhlIGNvZGUgdGhleQ0KK2FmZmVjdC4gU3VjaCBkZXNjcmlwdGlvbiBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSBMRUdBTCBmaWxlIGRlc2NyaWJlZCBpbg0KK1NlY3Rpb24gPGI+My40PC9iPiBhbmQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGFsbCBkaXN0cmlidXRpb25zIG9mIHRoZSBTb3VyY2UNCitDb2RlLiBFeGNlcHQgdG8gdGhlIGV4dGVudCBwcm9oaWJpdGVkIGJ5IHN0YXR1dGUgb3IgcmVndWxhdGlvbiwgc3VjaA0KK2Rlc2NyaXB0aW9uIG11c3QgYmUgc3VmZmljaWVudGx5IGRldGFpbGVkIGZvciBhIHJlY2lwaWVudCBvZiBvcmRpbmFyeSBza2lsbCB0bw0KK2JlIGFibGUgdG8gdW5kZXJzdGFuZCBpdC4NCisNCisgPGgyPjxhIG5hbWU9InR0aF9zRWM1Ij4NCis1PC9hPiZuYnNwOyZuYnNwO0FQUExJQ0FUSU9OIE9GIFRISVMgTElDRU5TRS48L2gyPg0KK1RoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGNvZGUgdG8gd2hpY2ggdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGhhcyBhdHRhY2hlZCB0aGUNCitub3RpY2UgaW4gPGI+RXhoaWJpdCBBPC9iPiBhbmQgdG8gcmVsYXRlZCBDb3ZlcmVkIENvZGUuDQorDQorIDxoMj48YSBuYW1lPSJ0dGhfc0VjNiI+DQorNjwvYT4mbmJzcDsmbmJzcDtWRVJTSU9OUyBPRiBUSEUgTElDRU5TRS48L2gyPg0KKw0KKzxkbCBjb21wYWN0PSJjb21wYWN0Ij4NCisNCisgPGR0PjxiPjYuMS4gTmV3IFZlcnNpb25zLjwvYj48L2R0Pg0KKwk8ZGQ+PGJyIC8+DQorR3JhbnRvciBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YgdGhlIExpY2Vuc2UgZnJvbSB0aW1lIHRvDQordGltZS4gRWFjaCB2ZXJzaW9uIHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4NCis8YnIgLz48YnIgLz4NCis8L2RkPg0KKyA8ZHQ+PGI+Ni4yLiBFZmZlY3Qgb2YgTmV3IFZlcnNpb25zLjwvYj48L2R0Pg0KKwk8ZGQ+PGJyIC8+DQorT25jZSBDb3ZlcmVkIENvZGUgaGFzIGJlZW4gcHVibGlzaGVkIHVuZGVyIGEgcGFydGljdWxhciB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlLA0KK1lvdSBtYXkgYWx3YXlzIGNvbnRpbnVlIHRvIHVzZSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhhdCB2ZXJzaW9uLiBZb3UgbWF5IGFsc28NCitjaG9vc2UgdG8gdXNlIHN1Y2ggQ292ZXJlZCBDb2RlIHVuZGVyIHRoZSB0ZXJtcyBvZiBhbnkgc3Vic2VxdWVudCB2ZXJzaW9uIG9mDQordGhlIExpY2Vuc2UuDQorPGJyIC8+PGJyIC8+DQorPC9kZD4NCisgPGR0PjxiPjYuMy4gRGVyaXZhdGl2ZSBXb3Jrcy48L2I+PC9kdD4NCisJPGRkPjxiciAvPg0KK0lmIFlvdSBjcmVhdGUgb3IgdXNlIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2UgKHdoaWNoIHlvdSBtYXkgb25seSBkbw0KK2luIG9yZGVyIHRvIGFwcGx5IGl0IHRvIGNvZGUgd2hpY2ggaXMgbm90IGFscmVhZHkgQ292ZXJlZCBDb2RlIGdvdmVybmVkIGJ5IHRoaXMNCitMaWNlbnNlKSwgWW91IG11c3QgPGI+KGEpPC9iPiByZW5hbWUgWW91ciBsaWNlbnNlIHNvIHRoYXQgdGhlIHBocmFzZSAiZ1NPQVAiIG9yDQorYW55IGNvbmZ1c2luZ2x5IHNpbWlsYXIgcGhyYXNlIGRvIG5vdCBhcHBlYXIgaW4geW91ciBsaWNlbnNlIChleGNlcHQgdG8gbm90ZQ0KK3RoYXQgeW91ciBsaWNlbnNlIGRpZmZlcnMgZnJvbSB0aGlzIExpY2Vuc2UpIGFuZCA8Yj4oYik8L2I+IG90aGVyd2lzZSBtYWtlIGl0IGNsZWFyDQordGhhdCBZb3VyIHZlcnNpb24gb2YgdGhlIGxpY2Vuc2UgY29udGFpbnMgdGVybXMgd2hpY2ggZGlmZmVyIGZyb20gdGhlIGdTT0FQDQorUHVibGljIExpY2Vuc2UuIChGaWxsaW5nIGluIHRoZSBuYW1lIG9mIHRoZSBJbml0aWFsIERldmVsb3BlciwgT3JpZ2luYWwgQ29kZSBvcg0KK0NvbnRyaWJ1dG9yIGluIHRoZSBub3RpY2UgZGVzY3JpYmVkIGluIDxiPkV4aGliaXQgQTwvYj4gc2hhbGwgbm90IG9mIHRoZW1zZWx2ZXMNCitiZSBkZWVtZWQgdG8gYmUgbW9kaWZpY2F0aW9ucyBvZiB0aGlzIExpY2Vuc2UuKTwvZGQ+DQorPC9kbD4NCisNCisgPGgyPjxhIG5hbWU9InR0aF9zRWM3Ij4NCis3PC9hPiZuYnNwOyZuYnNwO0RJU0NMQUlNRVIgT0YgV0FSUkFOVFkuPC9oMj4NCitDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQNCitXQVJSQU5UWSBPRiBBTlkgS0lORCwgV0hFVEhFUiBFWFBSRVNTLCBJTVBMSUVEIE9SIFNUQVRVVE9SWSwgSU5DTFVESU5HLCBXSVRIT1VUDQorTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIE9GIEZJVE5FU1MgRk9SIEENCitQQVJUSUNVTEFSIFBVUlBPU0UsIE5PTklORlJJTkdFTUVOVCBPRiBUSElSRCBQQVJUWSBJTlRFTExFQ1RVQUwgUFJPUEVSVFkNCitSSUdIVFMsIEFORCBBTlkgV0FSUkFOVFkgVEhBVCBNQVkgQVJJU0UgQlkgUkVBU09OIE9GIFRSQURFIFVTQUdFLCBDVVNUT00sIE9SDQorQ09VUlNFIE9GIERFQUxJTkcuICBXSVRIT1VUIExJTUlUSU5HIFRIRSBGT1JFR09JTkcsIFlPVSBBQ0tOT1dMRURHRSBUSEFUIFRIRQ0KK1NPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIQVQgVEhFIEFVVEhPUlMgRE8gTk9UIFdBUlJBTlQgVEhFIFNPRlRXQVJFDQorV0lMTCBSVU4gVU5JTlRFUlJVUFRFRCBPUiBFUlJPUiBGUkVFLiAgTElNSVRFRCBMSUFCSUxJVFkgVEhFIEVOVElSRSBSSVNLIEFTIFRPDQorUkVTVUxUUyBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFNPRlRXQVJFIElTIEFTU1VNRUQgQlkgWU9VLiAgVU5ERVIgTk8NCitDSVJDVU1TVEFOQ0VTIFdJTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorRVhFTVBMQVJZIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCBPUiBOQVRVUkUgV0hBVFNPRVZFUiwgV0hFVEhFUg0KK0JBU0VEIE9OIENPTlRSQUNULCBXQVJSQU5UWSwgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UpLCBTVFJJQ1QgTElBQklMSVRZIE9SDQorT1RIRVJXSVNFLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBBTlkgV0FZIFJFTEFURUQgVE8gVEhFIFNPRlRXQVJFLCBFVkVOIElGIFRIRQ0KK0FVVEhPUlMgSEFWRSBCRUVOIEFEVklTRUQgT04gVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFIE9SIElGIFNVQ0ggREFNQUdFDQorQ09VTEQgSEFWRSBCRUVOIFJFQVNPTkFCTFkgRk9SRVNFRU4sIEFORCBOT1RXSVRIU1RBTkRJTkcgQU5ZIEZBSUxVUkUgT0YNCitFU1NFTlRJQUwgUFVSUE9TRSBPRiBBTlkgRVhDTFVTSVZFIFJFTUVEWSBQUk9WSURFRC4gIFNVQ0ggTElNSVRBVElPTiBPTiBEQU1BR0VTDQorSU5DTFVERVMsIEJVVCBJUyBOT1QgTElNSVRFRCBUTywgREFNQUdFUyBGT1IgTE9TUyBPRiBHT09EV0lMTCwgTE9TVCBQUk9GSVRTLA0KK0xPU1MgT0YgREFUQSBPUiBTT0ZUV0FSRSwgV09SSyBTVE9QUEFHRSwgQ09NUFVURVIgRkFJTFVSRSBPUiBNQUxGVU5DVElPTiBPUg0KK0lNUEFJUk1FTlQgT0YgT1RIRVIgR09PRFMuICBJTiBOTyBFVkVOVCBXSUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgVEhFDQorQ09TVFMgT0YgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBTT0ZUV0FSRSBPUiBTRVJWSUNFUy4gIFlPVSBBQ0tOT1dMRURHRSBUSEFUDQorVEhJUyBTT0ZUV0FSRSBJUyBOT1QgREVTSUdORUQgRk9SIFVTRSBJTiBPTi1MSU5FIEVRVUlQTUVOVCBJTiBIQVpBUkRPVVMNCitFTlZJUk9OTUVOVFMgU1VDSCBBUyBPUEVSQVRJT04gT0YgTlVDTEVBUiBGQUNJTElUSUVTLCBBSVJDUkFGVCBOQVZJR0FUSU9OIE9SDQorQ09OVFJPTCwgT1IgTElGRS1DUklUSUNBTCBBUFBMSUNBVElPTlMuICBUSEUgQVVUSE9SUyBFWFBSRVNTTFkgRElTQ0xBSU0gQU5ZDQorTElBQklMSVRZIFJFU1VMVElORyBGUk9NIFVTRSBPRiBUSEUgU09GVFdBUkUgSU4gQU5ZIFNVQ0ggT04tTElORSBFUVVJUE1FTlQgSU4NCitIQVpBUkRPVVMgRU5WSVJPTk1FTlRTIEFORCBBQ0NFUFRTIE5PIExJQUJJTElUWSBJTiBSRVNQRUNUIE9GIEFOWSBBQ1RJT05TIE9SDQorQ0xBSU1TIEJBU0VEIE9OIFRIRSBVU0UgT0YgVEhFIFNPRlRXQVJFIElOIEFOWSBTVUNIIE9OLUxJTkUgRVFVSVBNRU5UIElODQorSEFaQVJET1VTIEVOVklST05NRU5UUyBCWSBZT1UuICBGT1IgUFVSUE9TRVMgT0YgVEhJUyBQQVJBR1JBUEgsIFRIRSBURVJNDQorIkxJRkUtQ1JJVElDQUwgQVBQTElDQVRJT04iIE1FQU5TIEFOIEFQUExJQ0FUSU9OIElOIFdISUNIIFRIRSBGVU5DVElPTklORyBPUg0KK01BTEZVTkNUSU9OSU5HIE9GIFRIRSBTT0ZUV0FSRSBNQVkgUkVTVUxUIERJUkVDVExZIE9SIElORElSRUNUTFkgSU4gUEhZU0lDQUwNCitJTkpVUlkgT1IgTE9TUyBPRiBIVU1BTiBMSUZFLiAgVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFODQorRVNTRU5USUFMIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiAgTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRA0KK0hFUkVVTkRFUiBFWENFUFQgVU5ERVIgVEhJUyBESVNDTEFJTUVSLg0KKw0KKyA8aDI+PGEgbmFtZT0idHRoX3NFYzgiPg0KKzg8L2E+Jm5ic3A7Jm5ic3A7VEVSTUlOQVRJT04uPC9oMj4NCisNCis8ZGwgY29tcGFjdD0iY29tcGFjdCI+DQorDQorIDxkdD48Yj44LjEuPC9iPjwvZHQ+DQorCTxkZD4NCitUaGlzIExpY2Vuc2UgYW5kIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJldW5kZXIgd2lsbCB0ZXJtaW5hdGUgYXV0b21hdGljYWxseSBpZg0KK1lvdSBmYWlsIHRvIGNvbXBseSB3aXRoIHRlcm1zIGhlcmVpbiBhbmQgZmFpbCB0byBjdXJlIHN1Y2ggYnJlYWNoIHdpdGhpbiAzMA0KK2RheXMgb2YgYmVjb21pbmcgYXdhcmUgb2YgdGhlIGJyZWFjaC4gQWxsIHN1YmxpY2Vuc2VzIHRvIHRoZSBDb3ZlcmVkIENvZGUgd2hpY2gNCithcmUgcHJvcGVybHkgZ3JhbnRlZCBzaGFsbCBzdXJ2aXZlIGFueSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2UuIFByb3Zpc2lvbnMNCit3aGljaCwgYnkgdGhlaXIgbmF0dXJlLCBtdXN0IHJlbWFpbiBpbiBlZmZlY3QgYmV5b25kIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGlzDQorTGljZW5zZSBzaGFsbCBzdXJ2aXZlLjwvZGQ+DQorIDxkdD48Yj48dT44LjIuPC91PjwvYj48L2R0Pg0KKwk8ZGQ+PC9kZD4NCisgPGR0PjxiPjguMy48L2I+PC9kdD4NCisJPGRkPg0KK0lmIFlvdSBhc3NlcnQgYSBwYXRlbnQgaW5mcmluZ2VtZW50IGNsYWltIGFnYWluc3QgUGFydGljaXBhbnQgYWxsZWdpbmcgdGhhdA0KK3N1Y2ggUGFydGljaXBhbnQncyBDb250cmlidXRvciBWZXJzaW9uIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5mcmluZ2VzIGFueQ0KK3BhdGVudCB3aGVyZSBzdWNoIGNsYWltIGlzIHJlc29sdmVkIChzdWNoIGFzIGJ5IGxpY2Vuc2Ugb3Igc2V0dGxlbWVudCkgcHJpb3IgdG8NCit0aGUgaW5pdGlhdGlvbiBvZiBwYXRlbnQgaW5mcmluZ2VtZW50IGxpdGlnYXRpb24sIHRoZW4gdGhlIHJlYXNvbmFibGUgdmFsdWUgb2YNCit0aGUgbGljZW5zZXMgZ3JhbnRlZCBieSBzdWNoIFBhcnRpY2lwYW50IHVuZGVyIFNlY3Rpb25zIDxiPjIuMTwvYj4gb3IgPGI+Mi4yPC9iPg0KK3NoYWxsIGJlIHRha2VuIGludG8gYWNjb3VudCBpbiBkZXRlcm1pbmluZyB0aGUgYW1vdW50IG9yIHZhbHVlIG9mIGFueSBwYXltZW50DQorb3IgbGljZW5zZS48L2RkPg0KKyA8ZHQ+PGI+OC40LjwvYj48L2R0Pg0KKwk8ZGQ+IEluIHRoZSBldmVudCBvZiB0ZXJtaW5hdGlvbiB1bmRlciBTZWN0aW9ucyA8Yj44LjE8L2I+IG9yDQorPGI+OC4yPC9iPiBhYm92ZSwgYWxsIGVuZCB1c2VyIGxpY2Vuc2UgYWdyZWVtZW50cyAoZXhjbHVkaW5nIGRpc3RyaWJ1dG9ycw0KK2FuZCByZXNlbGxlcnMpIHdoaWNoIGhhdmUgYmVlbiB2YWxpZGx5IGdyYW50ZWQgYnkgWW91IG9yIGFueSBkaXN0cmlidXRvcg0KK2hlcmV1bmRlciBwcmlvciB0byB0ZXJtaW5hdGlvbiBzaGFsbCBzdXJ2aXZlIHRlcm1pbmF0aW9uLjwvZGQ+DQorPC9kbD4NCisNCisgPGgyPjxhIG5hbWU9InR0aF9zRWM5Ij4NCis5PC9hPiZuYnNwOyZuYnNwO0xJTUlUQVRJT04gT0YgTElBQklMSVRZLjwvaDI+DQorVU5ERVIgTk8gQ0lSQ1VNU1RBTkNFUyBBTkQgVU5ERVIgTk8gTEVHQUwgVEhFT1JZLCBXSEVUSEVSIFRPUlQgKElOQ0xVRElORw0KK05FR0xJR0VOQ0UpLCBDT05UUkFDVCwgT1IgT1RIRVJXSVNFLCBTSEFMTCBZT1UsIFRIRSBJTklUSUFMIERFVkVMT1BFUiwNCitBTlkgT1RIRVIgQ09OVFJJQlVUT1IsIE9SIEFOWSBESVNUUklCVVRPUiBPRiBDT1ZFUkVEIENPREUsIE9SIEFOWSBTVVBQTElFUg0KK09GIEFOWSBPRiBTVUNIIFBBUlRJRVMsIEJFIExJQUJMRSBUTyBBTlkgUEVSU09OIEZPUiBBTlkgSU5ESVJFQ1QsIFNQRUNJQUwsDQorSU5DSURFTlRBTCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBDSEFSQUNURVIgSU5DTFVESU5HLCBXSVRIT1VUDQorTElNSVRBVElPTiwgREFNQUdFUyBGT1IgTE9TUyBPRiBHT09EV0lMTCwgV09SSyBTVE9QUEFHRSwgQ09NUFVURVIgRkFJTFVSRQ0KK09SIE1BTEZVTkNUSU9OLCBPUiBBTlkgQU5EIEFMTCBPVEhFUiBDT01NRVJDSUFMIERBTUFHRVMgT1IgTE9TU0VTLCBFVkVODQorSUYgU1VDSCBQQVJUWSBTSEFMTCBIQVZFIEJFRU4gSU5GT1JNRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4NCitUSElTIExJTUlUQVRJT04gT0YgTElBQklMSVRZIFNIQUxMIE5PVCBBUFBMWSBUTyBMSUFCSUxJVFkgRk9SIERFQVRIIE9SDQorUEVSU09OQUwgSU5KVVJZIFJFU1VMVElORyBGUk9NIFNVQ0ggUEFSVFknUyBORUdMSUdFTkNFIFRPIFRIRSBFWFRFTlQgQVBQTElDQUJMRQ0KK0xBVyBQUk9ISUJJVFMgU1VDSCBMSU1JVEFUSU9OLiBTT01FIEpVUklTRElDVElPTlMgRE8gTk9UIEFMTE9XIFRIRSBFWENMVVNJT04NCitPUiBMSU1JVEFUSU9OIE9GIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBTTyBUSElTIEVYQ0xVU0lPTg0KK0FORCBMSU1JVEFUSU9OIE1BWSBOT1QgQVBQTFkgVE8gWU9VLg0KKw0KKyA8aDI+PGEgbmFtZT0idHRoX3NFYzEwIj4NCisxMDwvYT4mbmJzcDsmbmJzcDs8dT5VLlMuIEdPVkVSTk1FTlQgRU5EIFVTRVJTLjwvdT48L2gyPg0KKw0KKyA8aDI+PGEgbmFtZT0idHRoX3NFYzExIj4NCisxMTwvYT4mbmJzcDsmbmJzcDs8dT5NSVNDRUxMQU5FT1VTLjwvdT48L2gyPg0KKw0KKyA8aDI+PGEgbmFtZT0idHRoX3NFYzEyIj4NCisxMjwvYT4mbmJzcDsmbmJzcDtSRVNQT05TSUJJTElUWSBGT1IgQ0xBSU1TLjwvaDI+DQorQXMgYmV0d2VlbiBJbml0aWFsIERldmVsb3BlciBhbmQgdGhlIENvbnRyaWJ1dG9ycywgZWFjaCBwYXJ0eSBpcyByZXNwb25zaWJsZQ0KK2ZvciBjbGFpbXMgYW5kIGRhbWFnZXMgYXJpc2luZywgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwgb3V0IG9mIGl0cyB1dGlsaXphdGlvbg0KK29mIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UgYW5kIFlvdSBhZ3JlZSB0byB3b3JrIHdpdGggSW5pdGlhbCBEZXZlbG9wZXIgYW5kDQorQ29udHJpYnV0b3JzIHRvIGRpc3RyaWJ1dGUgc3VjaCByZXNwb25zaWJpbGl0eSBvbiBhbiBlcXVpdGFibGUgYmFzaXMuICBOb3RoaW5nDQoraGVyZWluIGlzIGludGVuZGVkIG9yIHNoYWxsIGJlIGRlZW1lZCB0byBjb25zdGl0dXRlIGFueSBhZG1pc3Npb24gb2YgbGlhYmlsaXR5Lg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisNCis8aDI+RVhISUJJVCBBLjwvaDI+DQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKyJUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBnU09BUCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMw0KKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQ0KK0xpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKw0KKzxibG9ja3F1b3RlPg0KK2h0dHA6Ly9nZW5pdmlhLmNvbS9Qcm9kdWN0cy9nc29hcC9saWNlbnNlLnBkZg0KKzwvYmxvY2txdW90ZT4NCisNCitNb3JlIGluZm9ybWF0aW9uIG9uIGxpY2Vuc2luZyBvcHRpb25zLCBzdXBwb3J0IGNvbnRyYWN0cywgYW5kIGNvbnN1bHRpbmcgY2FuIGJlIGZvdW5kIGF0DQorPGJsb2NrcXVvdGU+DQoraHR0cDovL2dlbml2aWEuY29tL1Byb2R1Y3RzL2dzb2FwL2NvbnRyYWN0Lmh0bWwNCis8L2Jsb2NrcXVvdGU+DQorU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIg0KK2Jhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UNCitmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUaGUgT3JpZ2luYWwgQ29kZSBvZiB0aGUgZ1NPQVAgU29mdHdhcmUgaXM6DQorc3Rkc29hcC5oLCBzdGRzb2FwMi5oLCBzdGRzb2FwLmMsIHN0ZHNvYXAyLmMsIHN0ZHNvYXAuY3BwLCBzdGRzb2FwMi5jcHAsIHNvYXBjcHAyLmgsIHNvYXBjcHAyLmMsDQorc29hcGNwcDJfbGV4LmwsIHNvYXBjcHAyX3lhY2MueSwgZXJyb3IyLmgsIGVycm9yMi5jLA0KK3N5bWJvbDIuYywgaW5pdDIuYywgc29hcGRvYzIuaHRtbCwgYW5kIHNvYXBkb2MyLnBkZiwgaHR0cGdldC5oLCBodHRwZ2V0LmMsIHN0bC5oLCBzdGxkZXF1ZS5oLCBzdGxsaXN0LmgsIHN0bHZlY3Rvci5oLCBzdGxzZXQuaC4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFJvYmVydCBBLiB2YW4gRW5nZWxlbi4gIFBvcnRpb25zDQorY3JlYXRlZCBieSBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4gYXJlIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFJvYmVydCBBLiB2YW4NCitFbmdlbGVuLCBHZW5pdmlhIGluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KK0NvbnRyaWJ1dG9yKHMpOg0KKw0KKzxkbCBjb21wYWN0PSJjb21wYWN0Ij4NCisgPGR0PjxiPiJfX19fX19fX19fX19fX19fX19fX19fX18uIjwvYj48L2R0Pg0KKwk8ZGQ+PC9kZD4NCis8L2RsPg0KK1tOb3RlOiBUaGUgdGV4dCBvZiB0aGlzIEV4aGliaXQgQSBtYXkgZGlmZmVyIHNsaWdodGx5IGZvcm0gdGhlIHRleHQgb2YgdGhlDQorbm90aWNlcyBpbiB0aGUgU291cmNlIENvZGUgZmlsZXMgb2YgdGhlIE9yaWdpbmFsIGNvZGUuICBZb3Ugc2hvdWxkIHVzZSB0aGUgdGV4dA0KK29mIHRoaXMgRXhoaWJpdCBBIHJhdGhlciB0aGFuIHRoZSB0ZXh0IGZvdW5kIGluIHRoZSBPcmlnaW5hbCBDb2RlIFNvdXJjZSBDb2RlDQorZm9yIFlvdXIgTW9kaWZpY2F0aW9ucy5dDQorDQorPGRpdiBjbGFzcz0icCI+PCEtLS0tPjwvZGl2Pg0KKw0KKzxoMj5FWEhJQklUIEIuPC9oMj4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorIlBhcnQgb2YgdGhlIHNvZnR3YXJlIGVtYmVkZGVkIGluIHRoaXMgcHJvZHVjdCBpcyBnU09BUCBzb2Z0d2FyZS4NCisNCis8ZGl2IGNsYXNzPSJwIj48IS0tLS0+PC9kaXY+DQorUG9ydGlvbnMgY3JlYXRlZCBieSBnU09BUCBhcmUgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLA0KK0dlbml2aWEgaW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCitUSEUgU09GVFdBUkUgSU4gVEhJUyBQUk9EVUNUIFdBUyBJTiBQQVJUIFBST1ZJREVEIEJZIEdFTklWSUEgSU5DIEFORCBBTlkNCitFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEDQorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQ0KK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwNCitJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQorTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SDQorUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRg0KK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UNCitPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGDQorQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIg0KKw0KKzxkaXYgY2xhc3M9InAiPjwhLS0tLT48L2Rpdj4NCisNCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbGljZW5zZS5wZGYgYi9saWNlbnNlLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTY1MDZlCi0tLSAvZGV2L251bGwKKysrIGIvbGljZW5zZS5wZGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL1JFQURNRS50eHQgYi9tb2RfZ3NvYXAvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmRhNzk0Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL1JFQURNRS50eHQKQEAgLTAsMCArMSw4IEBACitnc29hcF93aW4JCQlJSVMgYW5kIFdpbkluZXQgc3VwcG9ydAorbW9kX2dzb2FwLXgueQkJCW1vZF9nc29hcCBmb3IgQXBhY2hlIDEuMyBhbmQgMi4wCisKK1BsZWFzZSB2aXNpdCBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL21vZC1nc29hcAorCitQbGVhc2UgcmVmZXIgdG8gdGhlIENocmlzdGlhbiBBYmVyZ2VyJ3MgV2ViIHNpdGUgZm9yIGluc3RhbGxhdGlvbiBpbnRydWN0aW9ucworZm9yIGdzb2FwX3dpbiBmb3IgSUlTOiBodHRwOi8vbXguYWJlcmdlci5hdC9TT0FQLworCmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL0Rpdi93aW4yMDAwaWlzZGVidWcucmVnIGIvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9EaXYvd2luMjAwMGlpc2RlYnVnLnJlZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmE0ZjM0Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9EaXYvd2luMjAwMGlpc2RlYnVnLnJlZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL0Rpdi93aW4yMDAwaWlzbm9kZWJ1Zy5yZWcgYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL0Rpdi93aW4yMDAwaWlzbm9kZWJ1Zy5yZWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBlNjEzNAotLS0gL2Rldi9udWxsCisrKyBiL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvRGl2L3dpbjIwMDBpaXNub2RlYnVnLnJlZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL01ha2VmaWxlIGIvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmNlYzVhCi0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9NYWtlZmlsZQpAQCAtMCwwICsxLDU3IEBACitWRVJTSU9OPTBfMF8yCitQQUNLQUdFPW1vZF9nc29hcF93aW5fJChWRVJTSU9OKS56aXAKK1dXV1NFUlZJQ0VOQU1FPSJXV1ctUHVibGlzaGluZyIKK0xPR0ZJTEVQQVRIPSQoU1lTVEVNUk9PVClcc3lzdGVtMzJcaW5ldHNydgorCitERUxESVJTID0gLlxEZWJ1ZyAuXFJlbGVhc2UgXAorICAgIC5cZ3NvYXBcRGVidWcgLlxnc29hcFxSZWxlYXNlCisKKworYWxsOgorCW1zZGV2IGFsbDRpaXMuZHN3IC9NQUtFICJhbGw0aWlzIC0gV2luMzIgRGVidWciIAorCW1zZGV2IGFsbDRpaXMuZHN3IC9NQUtFICJhbGw0aWlzIC0gV2luMzIgUmVsZWFzZSIgCisKK2NsZWFuOgorICAgIC1kZWwgL3MvcSAqLm5jYgorICAgIC1kZWwgL3MvcSAqLm9wdAorICAgIC1kZWwgL3MvcSAqLnBsZworICAgIC1kZWwgL3MvcSAqLmNsdworCS1kZWwgL3MvcSAqLnBjaAorCS1kZWwgL3MvcSAqLmFwcworCS1kZWwgL3MvcSAqLmxvZworCS1hdHRyaWIgLWggLXMgaW1hZ2VzXFRodW1icy5kYgorCS1kZWwgaW1hZ2VzXFRodW1icy5kYgorCisJY2Qgc2FtcGxlcworCQkkKE1BS0UpIC1mIHNhbXBsZXMubWFrIGNsZWFuCisJY2QgLi4KKwlmb3IgJXYgaW4gKCQoREVMRElSUykpIERPIGlmIGV4aXN0ICV2XCouKiBybWRpciAvcy9xICV2CisKK3BhY2s6CisJJChNQUtFKSBjbGVhbgorCWNkIC4uCisJaWYgZXhpc3QgJChQQUNLQUdFKSBkZWwgJChQQUNLQUdFKQorCXppcCAtcjkgJChQQUNLQUdFKSBpc2FwaQorCWNkIGlzYXBpCQorCWRpciAuLlwkKFBBQ0tBR0UpCisKK3N0YXJ0OgorCW5ldCBzdGFydCAkKFdXV1NFUlZJQ0VOQU1FKQorCitzdG9wOgorCS1uZXQgc3RvcCAkKFdXV1NFUlZJQ0VOQU1FKQorCW5ldCBzdG9wIElJU0FkbWluCisKKwordGVzdDoKKwljZCAuXERlYnVnCisJCS1kZWwgKi5sb2cKKwkJLWRlbCAkKExPR0ZJTEVQQVRIKVxSRUNWLmxvZworCQktZGVsICQoTE9HRklMRVBBVEgpXFNFTlQubG9nCisJCS1kZWwgJChMT0dGSUxFUEFUSClcVEVTVC5sb2cKKwkJZGltZWNsbnQgdGVzdC5qcGcgaHR0cDovL2xvY2FsaG9zdC9nc29hcC9tb2RfZ3NvYXAuZGxsP2RpbWUgdGVzdC5qcGcKKwkJY2FsY2NsbnQgYWRkIDMgNAorCQllY2hvIHN0YXJ0IG5vdGVwYWQgJVNZU1RFTVJPT1QlXHN5c3RlbTMyXGluZXRzcnZcUkVDVi5sb2cKKwljZCAuLgorCisKZGlmZiAtLWdpdCBhL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvYWxsNGlpcy5kc3AgYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL2FsbDRpaXMuZHNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMTU2Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL2FsbDRpaXMuZHNwCkBAIC0wLDAgKzEsNzEgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iYWxsNGlpcyIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDANCisjICoqIE5JQ0hUIEJFQVJCRUlURU4gKioNCisNCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBHZW5lcmljIFByb2plY3QiIDB4MDEwYQ0KKw0KK0NGRz1hbGw0aWlzIC0gV2luMzIgRGVidWcNCishTUVTU0FHRSBEaWVzIGlzdCBrZWluIGf8bHRpZ2VzIE1ha2VmaWxlLiBadW0gRXJzdGVsbGVuIGRpZXNlcyBQcm9qZWt0cyBtaXQgTk1BS0UNCishTUVTU0FHRSB2ZXJ3ZW5kZW4gU2llIGRlbiBCZWZlaGwgIk1ha2VmaWxlIGV4cG9ydGllcmVuIiB1bmQgZvxocmVuIFNpZSBkZW4gQmVmZWhsDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgImFsbDRpaXMubWFrIi4NCishTUVTU0FHRSANCishTUVTU0FHRSBTaWUga/ZubmVuIGJlaW0gQXVzZvxocmVuIHZvbiBOTUFLRSBlaW5lIEtvbmZpZ3VyYXRpb24gYW5nZWJlbg0KKyFNRVNTQUdFIGR1cmNoIERlZmluaWVyZW4gZGVzIE1ha3JvcyBDRkcgaW4gZGVyIEJlZmVobHN6ZWlsZS4gWnVtIEJlaXNwaWVsOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJhbGw0aWlzLm1hayIgQ0ZHPSJhbGw0aWlzIC0gV2luMzIgRGVidWciDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgRvxyIGRpZSBLb25maWd1cmF0aW9uIHN0ZWhlbiB6dXIgQXVzd2FobDoNCishTUVTU0FHRSANCishTUVTU0FHRSAiYWxsNGlpcyAtIFdpbjMyIFJlbGVhc2UiIChiYXNpZXJlbmQgYXVmICAiV2luMzIgKHg4NikgR2VuZXJpYyBQcm9qZWN0IikNCishTUVTU0FHRSAiYWxsNGlpcyAtIFdpbjMyIERlYnVnIiAoYmFzaWVyZW5kIGF1ZiAgIldpbjMyICh4ODYpIEdlbmVyaWMgUHJvamVjdCIpDQorIU1FU1NBR0UgDQorDQorIyBCZWdpbiBQcm9qZWN0DQorIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDANCisjIFBST1AgU2NjX1Byb2pOYW1lICIiDQorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiINCitNVEw9bWlkbC5leGUNCisNCishSUYgICIkKENGRykiID09ICJhbGw0aWlzIC0gV2luMzIgUmVsZWFzZSINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiYWxsNGlpcyAtIFdpbjMyIERlYnVnIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisNCishRU5ESUYgDQorDQorIyBCZWdpbiBUYXJnZXQNCisNCisjIE5hbWUgImFsbDRpaXMgLSBXaW4zMiBSZWxlYXNlIg0KKyMgTmFtZSAiYWxsNGlpcyAtIFdpbjMyIERlYnVnIg0KKyMgQmVnaW4gR3JvdXAgImRvYyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgIiINCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llxpc2FwaS5tYWsNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIFRhcmdldA0KKyMgRW5kIFByb2plY3QNCmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL2FsbDRpaXMuZHN3IGIvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9hbGw0aWlzLmRzdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGUzMDk0Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9hbGw0aWlzLmRzdwpAQCAtMCwwICsxLDEwNCBAQAorTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gV29ya3NwYWNlIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDANCisjIFdBUk5VTkc6IERJRVNFIEFSQkVJVFNCRVJFSUNIU0RBVEVJIERBUkYgTklDSFQgQkVBUkJFSVRFVCBPREVSIEdFTNZTQ0hUIFdFUkRFTiENCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogImFsbDRpaXMiPS5cYWxsNGlpcy5kc3AgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08ND4NCit7e3sNCisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIFByb2plY3RfRGVwX05hbWUgY2FsYw0KKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBQcm9qZWN0X0RlcF9OYW1lIGlzYXBpDQorICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIFByb2plY3RfRGVwX05hbWUgY2FsY2NsbnQNCisgICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBCZWdpbiBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgUHJvamVjdF9EZXBfTmFtZSBkaW1lDQorICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kNCisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIFByb2plY3RfRGVwX05hbWUgZGltZWNsbnQNCisgICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQ0KK319fQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCitQcm9qZWN0OiAiY2FsYyI9LlxzYW1wbGVzXGNhbGNcY2FsYy5kc3AgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08ND4NCit7e3sNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogImNhbGNjbG50Ij0uXFNBTVBMRVNcQ0FMQ1xjYWxjY2xudC5kc3AgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08ND4NCit7e3sNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogImRpbWUiPS5cU0FNUExFU1xkaW1lXGRpbWUuZHNwIC0gUGFja2FnZSBPd25lcj08ND4NCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDQ+DQore3t7DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK1Byb2plY3Q6ICJkaW1lY2xudCI9LlxTQU1QTEVTXERJTUVcZGltZWNsbnQuZHNwIC0gUGFja2FnZSBPd25lcj08ND4NCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDQ+DQore3t7DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK1Byb2plY3Q6ICJpc2FwaSI9Llxnc29hcFxpc2FwaS5kc3AgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08ND4NCit7e3sNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorR2xvYmFsOg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08Mz4NCit7e3sNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQpkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9nc29hcC9IdHRwQ29udGV4dC5jcHAgYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL2dzb2FwL0h0dHBDb250ZXh0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTcyZmJiCi0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9nc29hcC9IdHRwQ29udGV4dC5jcHAKQEAgLTAsMCArMSw0OSBAQAorLyoqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBIdHRwQ29udGV4dCBjbGFzcworICAqIEBmaWxlIEh0dHBDb250ZXh0LmNwcAorICAqIEBhdXRob3IgQ2hyaXN0aWFuIEFiZXJnZXIgCisgICogQ29weXJpZ2h0IChDKSAyMDAxIFdlYldhcmUgKGh0dHA6Ly93d3cud2Vid2FyZS5hdCkgCisgICovIAorI2luY2x1ZGUgIkh0dHBDb250ZXh0LmgiCisKK0h0dHBNZXNzYWdlOjpIdHRwTWVzc2FnZSgpIHsKK30KK0h0dHBSZXF1ZXN0OjpIdHRwUmVxdWVzdCgpIAorOiBfbWV0aG9kKEdFVCkKKywgX2JvZHkoTlVMTCkKKywgX2NvbnRlbnRsZW5ndGgoMCkKK3sKK30KK0h0dHBSZXF1ZXN0Ojp+SHR0cFJlcXVlc3QoKSB7CisgICAgZGVsZXRlIF9ib2R5OworfQorY29uc3QgY2hhciAqSHR0cFJlcXVlc3Q6OmdldFF1ZXJ5U3RyaW5nKCkgeworICAgIHJldHVybiBfcXVlcnlzdHJpbmcuY19zdHIoKTsKK30KK2NvbnN0IGNoYXIgKkh0dHBSZXF1ZXN0OjpnZXRCb2R5KCkgeworICAgIHN0YXRpYyBjb25zdCBjaGFyIHN6RW1wdHlbXSA9ICIiOworICAgIHJldHVybiBOVUxMID09IF9ib2R5ID8gc3pFbXB0eSA6IF9ib2R5OworfQordm9pZCAqSHR0cFJlcXVlc3Q6OmdldERhdGEoKSB7CisgICAgcmV0dXJuIF9ib2R5OworfQorSHR0cFJlcXVlc3Q6Ok1ldGhvZCBIdHRwUmVxdWVzdDo6Z2V0TWV0aG9kKCkgY29uc3QgeworICAgIHJldHVybiBfbWV0aG9kOworfQordW5zaWduZWQgbG9uZyBIdHRwUmVxdWVzdDo6Z2V0Q29udGVudExlbmd0aCgpIGNvbnN0IHsKKyAgICByZXR1cm4gX2NvbnRlbnRsZW5ndGg7Cit9Citib29sIEh0dHBSZXF1ZXN0OjpvcGVyYXRvcjw8KHN0ZDo6aXN0cmVhbSYgaXMpIHsKKyAgICBkZWxldGUgX2JvZHksIF9ib2R5ID0gTlVMTDsKKyAgICBib29sIGJSZXQgPSB0cnVlOworICAgIGlmICgwICE9IF9jb250ZW50bGVuZ3RoKSB7CisgICAgICAgIF9ib2R5ID0gbmV3IGNoYXJbX2NvbnRlbnRsZW5ndGggKyAxXTsKKyAgICAgICAgbWVtc2V0KF9ib2R5LCAwLCBfY29udGVudGxlbmd0aCArIDEpOworICAgICAgICBpcy5yZWFkKF9ib2R5LCBfY29udGVudGxlbmd0aCk7CisgICAgICAgIGJSZXQgPSBpcy5nb29kKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYlJldCA9IGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gYlJldDsKK30KKworCmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL2dzb2FwL0h0dHBDb250ZXh0LmggYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL2dzb2FwL0h0dHBDb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMxNzI4NwotLS0gL2Rldi9udWxsCisrKyBiL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvZ3NvYXAvSHR0cENvbnRleHQuaApAQCAtMCwwICsxLDY1IEBACisvKiogSW50ZXJmYWNlIGZvciB0aGUgSHR0cE1lc3NhZ2UgYW5kIEh0dHBDb250ZXh0IGNsYXNzZXMuCisgICogQGZpbGUgSHR0cENvbnRleHQuaAorICAqIEBhdXRob3IgQ2hyaXN0aWFuIEFiZXJnZXIgCisgICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgV2ViV2FyZSAoaHR0cDovL3d3dy53ZWJ3YXJlLmF0KSAKKyAgKi8KKyNpZm5kZWYgSHR0cENvbnRleHRfSF9GM0E4RkUxMF8yQzEyXzExZDVfOEJFQl8wMUEwQ0NENEZGNTcKKyNkZWZpbmUgSHR0cENvbnRleHRfSF9GM0E4RkUxMF8yQzEyXzExZDVfOEJFQl8wMUEwQ0NENEZGNTcKKworLy8jaW5jbHVkZSA8dXRpbGlseT4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgIm9wc3lzYWRqdXN0LmgiCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlICJjYXNlY21wbGVzcy5oIgorCisvKiogSFRUUCBtZXNzYWdlLCBlaXRoZXIgYSByZXF1ZXN0IG9yIGEgcmVzcG9uc2UuCisgICovCitjbGFzcyBIdHRwTWVzc2FnZSB7CitwdWJsaWM6CisgICAgSHR0cE1lc3NhZ2UoKTsgLy8vPCBjb25zdHJ1Y3Rvci4KKworICAgIC8qKiBsaXN0IG9mICJIZWFkZXI6IHZhbHVlIiBlbnRyaWVzIGluIGFuIGh0dHAgcmVxdWVzdCBvciByZXNwb25zZQorICAgICAgKi8KKyAgICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgY2FzZWNtcGxlc3M+IENvbnRlbnRIZWFkZXJzOworICAgIGNvbnN0IENvbnRlbnRIZWFkZXJzJiBnZXRDb250ZW50SGVhZGVycygpIGNvbnN0OyAvLy88IHJldHVybiB0aGUgY29udGVudCBoZWFkZXJzIG9mIHRoZSBtZXNzYWdlLgorICAgIENvbnRlbnRIZWFkZXJzJiBnZXRDb250ZW50SGVhZGVycygpOyAvLy88IHJldHVybiB0aGUgY29udGVudCBoZWFkZXJzIG9mIHRoZSBtZXNzYWdlLgorcHJvdGVjdGVkOgorICAgIENvbnRlbnRIZWFkZXJzIG1fQ29udGVudEhlYWRlcnM7IC8vLzwgdGhlIGNvbnRlbnQgaGVhZGVycy4KK307CisvKiogYSA8YSBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMDY4LnR4dD9udW1iZXI9MjA2OCI+SFRUUDwvYT4gcmVzcG9uc2UuCisgICovCitjbGFzcyBIdHRwUmVzcG9uc2UgOiBwdWJsaWMgSHR0cE1lc3NhZ2UgeworcHVibGljOgorICAgIEh0dHBSZXNwb25zZSgpIHt9CisgICAgdmlydHVhbCB+SHR0cFJlc3BvbnNlKCkge30KK307CisvKiogYSA8YSBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMDY4LnR4dD9udW1iZXI9MjA2OCI+SFRUUDwvYT4gcmVxdWVzdC4KKyAgKiBObyBwbGF0Zm9ybSBkZXBlbmRlbnQgdHlwZXMgYXJlIHVzZWQgaGVyZSwgdW5jaGFuZ2VkIGFsc28gZm9yIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZyI+QXBhY2hlLVNlcnZlcjwvYT4KKyAgKiBQbGF0Zm9ybSBkZXBlbmRlbmN5IGlzIGluIHN1YmNsYXNzZXMgb25seS4KKyAgKi8KK2NsYXNzIEh0dHBSZXF1ZXN0IDogcHVibGljIEh0dHBNZXNzYWdlIHsKK3B1YmxpYzoKKyAgICAvKiogMiBtZXRob2RzIGluIEhUVFA6ZWl0aGVyIEdFVCBvciBQT1NULiAqLworICAgIHR5cGVkZWYgZW51bSBNZXRob2Qge0dFVCA9IDAsIFBPU1QgPSAxfTsKKyAgICBIdHRwUmVxdWVzdCgpOyAvLy88IGNvbnN0cnVjdG9yLgorICAgIHZpcnR1YWwgfkh0dHBSZXF1ZXN0KCk7IC8vLzwgZGVzdHJ1Y3Rvci4KKworICAgIHZpcnR1YWwgTWV0aG9kIGdldE1ldGhvZCgpIGNvbnN0OyAvLy88IEByZXR1cm4gdGhlIG1ldGhvZCB1c2VkIGluIHRoZSByZXF1ZXN0CisgICAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRRdWVyeVN0cmluZygpOyAvLy88IEByZXR1cm4gdGhlIHVybCByZXF1ZXN0ZWQuIAorICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0Qm9keSgpOyAvLy88IEByZXR1cm4gdGhlIGJvZHkgb2YgdGhlIHJlcXVlc3QgYXMgYSBzdHJpbmcgKGd1YXJhbnRlZWQgdG8gYmUgMCB0ZXJtaW5hdGVkKS4KKyAgICB2aXJ0dWFsIHZvaWQgKmdldERhdGEoKTsgLy8vPCBAcmV0dXJuIHRoZSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgYm9keSBkYXRhLgorICAgIHZpcnR1YWwgdW5zaWduZWQgbG9uZyBnZXRDb250ZW50TGVuZ3RoKCkgY29uc3Q7IC8vLzwgcmV0dXJuIHRoZSBsZW5naHQgb2YgdGhlIGJvZHkgb2YgdGhlIHJlcXVlc3QuCisgICAgdmlydHVhbCBib29sIG9wZXJhdG9yPDwoc3RkOjppc3RyZWFtJik7CitwdWJsaWM6CisgICAgc3RkOjpzdHJpbmcgX3F1ZXJ5c3RyaW5nOworICAgIGNoYXIgICpfYm9keTsKKyAgICB1bnNpZ25lZCBsb25nIF9jb250ZW50bGVuZ3RoOworICAgIE1ldGhvZCBfbWV0aG9kOworfTsKKy8vaW5saW5lcworaW5saW5lIGNvbnN0IEh0dHBNZXNzYWdlOjpDb250ZW50SGVhZGVycyYgSHR0cE1lc3NhZ2U6OmdldENvbnRlbnRIZWFkZXJzKCkgY29uc3Qge3JldHVybiBtX0NvbnRlbnRIZWFkZXJzO30KK2lubGluZSBIdHRwTWVzc2FnZTo6Q29udGVudEhlYWRlcnMmIEh0dHBNZXNzYWdlOjpnZXRDb250ZW50SGVhZGVycygpIHtyZXR1cm4gbV9Db250ZW50SGVhZGVyczt9CisKKyNlbmRpZiAvLyBIdHRwQ29udGV4dF9IX0YzQThGRTEwXzJDMTJfMTFkNV84QkVCXzAxQTBDQ0Q0RkY1NwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvZ3NvYXAvSVNBUElfSHR0cENvbnRleHQuY3BwIGIvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9nc29hcC9JU0FQSV9IdHRwQ29udGV4dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJiZDIzNAotLS0gL2Rldi9udWxsCisrKyBiL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvZ3NvYXAvSVNBUElfSHR0cENvbnRleHQuY3BwCkBAIC0wLDAgKzEsMTE4IEBACisvKiogSW1wbGVtZW50YXRpb24gb2YgdGhlIElTQVBJX0h0dHBSZXF1ZXN0IGFuZCByZWxhdGVkIGNsYXNzZXMKKyAgKiBAZmlsZSBJU0FQSV9IdHRwQ29udGV4dC5jcHAKKyAgKiBAYXV0aG9yIENocmlzdGlhbiBBYmVyZ2VyIAorICAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIFdlYldhcmUgKGh0dHA6Ly93d3cud2Vid2FyZS5hdCkKKyAgKi8KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlICJJU0FQSV9IdHRwQ29udGV4dC5oIgordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworc3RhdGljIGJvb2wgQWRkSGVhZGVyKAorICAgIElTQVBJX0h0dHBSZXF1ZXN0JiByZXEsIAorICAgIEVYVEVOU0lPTl9DT05UUk9MX0JMT0NLJiBlY2IsIAorICAgIGNvbnN0IGNoYXIgKnBzekhlYWRlck5hbWUsCisgICAgTFBDVFNUUiBwc3pWYXJpYWJsZU5hbWUpOworCitJU0FQSV9IdHRwUmVxdWVzdDo6SVNBUElfSHR0cFJlcXVlc3QoRVhURU5TSU9OX0NPTlRST0xfQkxPQ0sgKnBFQ0IpIAorOiBtX2JIZWFkZXJzUGFyc2VkKGZhbHNlKQorLCBtX3BFQ0IocEVDQikKK3sKKyAgICBpZiAoTlVMTCAhPSBwRUNCKSB7CisgICAgICAgIFBhcnNlSGVhZGVycygqcEVDQik7CisgICAgfQorfQorSVNBUElfSHR0cFJlcXVlc3Q6On5JU0FQSV9IdHRwUmVxdWVzdCgpIHsKK30KK0VYVEVOU0lPTl9DT05UUk9MX0JMT0NLICpJU0FQSV9IdHRwUmVxdWVzdDo6RUNCKCkgY29uc3QgeworICAgIHJldHVybiBtX3BFQ0I7Cit9Cit2b2lkIElTQVBJX0h0dHBSZXF1ZXN0OjpQYXJzZUhlYWRlcnMoRVhURU5TSU9OX0NPTlRST0xfQkxPQ0smIGVjYikgeworICAgIF9jb250ZW50bGVuZ3RoID0gZWNiLmNiVG90YWxCeXRlczsKKyAgICBBZGRIZWFkZXIoZWNiLCAiQ09OVEVOVC1MRU5HVEgiLCAiQ09OVEVOVF9MRU5HVEgiKTsKKyAgICBBZGRIZWFkZXIoZWNiLCAiQ09OVEVOVC1UWVBFIiwgIkNPTlRFTlRfVFlQRSIpOworICAgIEFkZEhlYWRlcihlY2IsICJQQVRILUlORk8iLCAiUEFUSF9JTkZPIik7CisgICAgc3RyaW5nIHN0clZhbHVlOworICAgIFJlYWRIZWFkZXIoZWNiLCAiUkVRVUVTVF9NRVRIT0QiLCBzdHJWYWx1ZSk7CisgICAgaWYgKDAgPT0gc3RyY2FzZWNtcChzdHJWYWx1ZS5jX3N0cigpLCAiR0VUIikpIHsKKyAgICAgICAgX21ldGhvZCA9IEdFVDsKKyAgICB9IGVsc2UgaWYgKDAgPT0gc3RyY2FzZWNtcChzdHJWYWx1ZS5jX3N0cigpLCAiUE9TVCIpKSB7CisgICAgICAgIF9tZXRob2QgPSBQT1NUOworICAgIH0KKyAgICBfcXVlcnlzdHJpbmcgPSBlY2IubHBzelF1ZXJ5U3RyaW5nOworICAgIFJlYWRDdXN0b21IZWFkZXJzKGVjYik7CisgICAgbV9iSGVhZGVyc1BhcnNlZCA9IHRydWU7Cit9CisvKiogYWRkIGEgRUNCIGhlYWRlciB2YXJpYWJsZSB0byBvdXIgY29udGVudCBoZWFkZXJzIGNvbGxlY3Rpb24uCisgICAgQHBhcmFtIGVjYiB0aGUgZXh0ZW5zaW9uIGNvbnRyb2wgYmxvY2sgb2YgdGhlIGN1cnJlbnQgSUlTIHJlcXVlc3QKKyAgICBAcGFyYW0gcHN6SGVhZGVyTmFtZSB0aGUgSFRUUCAtIHN0YW5kYXJkIG5hbWUgb2YgdGhlIGNvbnRlbnQgaGVhZGVyLgorICAgIEBwYXJhbSBwc3pWYXJpYWJsZU5hbWUgdGhlIG5hbWUgaW52ZW50ZWQgYnkgTWljcm8kb2Z0IGZvciB0aGUgc2FtZSB0aGluZy4KKyAgKi8KK2Jvb2wgSVNBUElfSHR0cFJlcXVlc3Q6OkFkZEhlYWRlcihFWFRFTlNJT05fQ09OVFJPTF9CTE9DSyYgZWNiLCBjb25zdCBjaGFyICpwc3pIZWFkZXJOYW1lLCBMUENUU1RSIHBzelZhcmlhYmxlTmFtZSkgeworICAgIGFzc2VydChOVUxMICE9IHBzelZhcmlhYmxlTmFtZSk7CisKKyAgICBzdHJpbmcgc3RyVmFsdWU7IAorICAgIGJvb2wgYlJldCA9IFJlYWRIZWFkZXIoZWNiLCBwc3pWYXJpYWJsZU5hbWUsIHN0clZhbHVlKTsKKyAgICBpZiAoYlJldCkgeworICAgICAgICA6Ok91dHB1dERlYnVnU3RyaW5nKChwc3pIZWFkZXJOYW1lICsgc3RyaW5nKCI6ICIpICsgc3RyVmFsdWUgKyAiXHJcbiIpLmNfc3RyKCkpOworICAgICAgICBtX0NvbnRlbnRIZWFkZXJzW3BzekhlYWRlck5hbWVdID0gc3RyVmFsdWU7CisgICAgfQorICAgIHJldHVybiBiUmV0OworfQorLyoqIFJlYWQgYSB2YXJpYWJsZSBmcm9tIHRoZSBjb250cm9sIGJsb2NrLgorICAgIEBwYXJhbSBlY2IgdGhlIEV4dGVuc2lvbiBDb250cm9sIEJsb2NrLgorICAgIEBwYXJhbSBwc3pWYXJpYWJsZU5hbWUgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHJlYWQKKyAgICBAc3RySGVhZGVyVmFsdWUgKG91dHB1dCkgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZQorICAgIEByZXR1cm4gdHJ1ZSBpZiB0aGUgaGVhZGVyIHdhcyBmb3VuZC4KKyAgKi8gCitib29sIElTQVBJX0h0dHBSZXF1ZXN0OjpSZWFkSGVhZGVyKEVYVEVOU0lPTl9DT05UUk9MX0JMT0NLJiBlY2IsIExQQ1RTVFIgcHN6VmFyaWFibGVOYW1lLCBzdHJpbmcmIHN0ckhlYWRlclZhbHVlKSB7CisgICAgYm9vbCBiUmV0ID0gdHJ1ZTsKKyAgICBjaGFyIHN6VmFyTmFtZVsxMjhdOyAvLyA6KCBHZXRTZXJ2ZXJWYXJpYWJsZSB1c2VzIG5vbi1jb25zdCBuYW1lIHBhcmFtZXRlciwgc28gd2UgbWFrZSBhIGNvcHkgdG8gYmUgc2F2ZS4KKyAgICBzdHJuY3B5KHN6VmFyTmFtZSwgcHN6VmFyaWFibGVOYW1lLCBzaXplb2Ygc3pWYXJOYW1lKTsKKyAgICBjaGFyIHN6QnVmZmVyWzIwNDhdOworICAgIERXT1JEIGR3QnVmZmVyU2l6ZSA9IHNpemVvZiBzekJ1ZmZlcjsKKyAgICBCT09MIGJHZXQgPSBlY2IuR2V0U2VydmVyVmFyaWFibGUoZWNiLkNvbm5JRCwgc3pWYXJOYW1lLCBzekJ1ZmZlciwgJmR3QnVmZmVyU2l6ZSk7CisgICAgaWYgKGJHZXQpIHsKKyAgICAgICAgc3RySGVhZGVyVmFsdWUgPSBzekJ1ZmZlcjsKKyAgICB9IGVsc2UgeworICAgICAgICBiUmV0ID0gZmFsc2U7CisgICAgICAgIHN0ckhlYWRlclZhbHVlLmVyYXNlKCk7CisgICAgfQorICAgIHJldHVybiBiUmV0OworfQorLyoqIHJlYWQgYWxsIEhUVFAgaGVhZGVycyB0aGF0IHdlcmUgbm90IGFscmVhZHkgcGFyc2VkIGludG8gb25lIG9mIHRoZSBJU0FQSSAtIEVDQiB2YXJpYWJsZXMuCisgICovCit2b2lkIElTQVBJX0h0dHBSZXF1ZXN0OjpSZWFkQ3VzdG9tSGVhZGVycyhFWFRFTlNJT05fQ09OVFJPTF9CTE9DSyYgZWNiKSB7CisgICAgY29uc3QgY2hhciBzekhUVFBfW10gPSAiSFRUUF8iOworICAgIGNoYXIgc3pCdWZmZXJbNDA5Nl07CisgICAgRFdPUkQgZHdCdWZmZXJTaXplID0gc2l6ZW9mIHN6QnVmZmVyOworICAgIEJPT0wgYkdldCA9IGVjYi5HZXRTZXJ2ZXJWYXJpYWJsZShlY2IuQ29ubklELCAiQUxMX0hUVFAiLCBzekJ1ZmZlciwgJmR3QnVmZmVyU2l6ZSk7CisgICAgaWYgKGJHZXQpIHsKKyAgICAgICAgLy8gRmluZCBsaW5lcywgc3BsaXQga2V5L2RhdGEgcGFpciBhbmQgd3JpdGUgdGhlbSBhcyBvdXRwdXQKKyAgICAgICAgTFBUU1RSIHBPcHRzID0gTlVMTDsKKyAgICAgICAgTFBUU1RSIHBFbmQgPSBOVUxMOworICAgICAgICBmb3IgKExQVFNUUiBwQ2hhciA9IHN6QnVmZmVyOyAnXDAnICE9ICpwQ2hhcjspIHsKKyAgICAgICAgICAgIGlmICgqcENoYXIgPT0gJ1xyJyB8fCAqcENoYXIgPT0gJ1xuJykgeworICAgICAgICAgICAgICAgIHBDaGFyKys7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwT3B0cyA9IHN0cmNocihwQ2hhciwgJzonKTsvLyBmaW5kc2VwYXJhdG9yCisgICAgICAgICAgICBpZiAocE9wdHMgJiYgKnBPcHRzKSB7CisgICAgICAgICAgICAgICAgcEVuZCA9IHBPcHRzOworICAgICAgICAgICAgICAgIHdoaWxlICgqcEVuZCAmJiAqcEVuZCAhPSAnXHInICYmICpwRW5kICE9ICdcbicpIHsKKyAgICAgICAgICAgICAgICAgICAgcEVuZCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqcE9wdHMgPSAnXDAnOyAvLyBzcGxpdCB0aGUgc3RyaW5ncworICAgICAgICAgICAgICAgICpwRW5kID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBzdHJpbmcgc3RyTmFtZSA9IHBDaGFyOworICAgICAgICAgICAgICAgIGlmICgwID09IHN0cm5jbXAoc3RyTmFtZS5jX3N0cigpLCBzekhUVFBfLCBzdHJsZW4oc3pIVFRQXykpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ck5hbWUgPSBzdHJOYW1lLnN1YnN0cihzdHJsZW4oc3pIVFRQXykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXBsYWNlKHN0ck5hbWUuYmVnaW4oKSwgc3RyTmFtZS5lbmQoKSwgJ18nLCAnLScpOworICAgICAgICAgICAgICAgIDo6T3V0cHV0RGVidWdTdHJpbmcoKHN0ck5hbWUgKyAiOiIgKyAocE9wdHMgKyAxKSArICJcclxuIikuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgbV9Db250ZW50SGVhZGVyc1tzdHJOYW1lXSA9IHBPcHRzICsgMTsKKyAgICAgICAgICAgICAgICBwQ2hhciA9IHBFbmQgKyAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvZ3NvYXAvSVNBUElfSHR0cENvbnRleHQuaCBiL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvZ3NvYXAvSVNBUElfSHR0cENvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2UzZjRhCi0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9nc29hcC9JU0FQSV9IdHRwQ29udGV4dC5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qKiBJbnRlcmZhY2UgZm9yIHRoZSBJU0FQSV9IdHRwUmVxdWVzdCBhbmQgcmVsYXRlZCBjbGFzc2VzCisgICogQGZpbGUgSVNBUElfSHR0cENvbnRleHQuaAorICAqIEBhdXRob3IgQ2hyaXN0aWFuIEFiZXJnZXIgCisgICogQ29weXJpZ2h0IChDKSAyMDAxIFdlYldhcmUgKGh0dHA6Ly93d3cud2Vid2FyZS5hdCkgCisgICovCisjaWZuZGVmIElTQVBJSFRUUENPTlRFWFRfSAorI2RlZmluZSBJU0FQSUhUVFBDT05URVhUX0gKKyNpbmNsdWRlIDxodHRwZXh0Lmg+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiSHR0cENvbnRleHQuaCIKKworLyoqIGVuY2Fwc3VsYXRlIHNwZWNpYWwgY29udGVudCBoZWFkZXIgcGFyc2luZyBpZiB3ZSBhcmUgcnVubmluZyBvbiBhIG5vbi1zdGFuZGFyZCBzZXJ2ZXIuCisgICovCitjbGFzcyBJU0FQSV9IdHRwUmVxdWVzdCA6IHB1YmxpYyBIdHRwUmVxdWVzdCB7CitwdWJsaWM6CisgICAgLyoqIENvbnN0cnVjdG9yLCBwYXJzaW5nIGFsc28gY29udGVudCBoZWFkZXJzIGZyb20gdGhlIGNvbnRyb2wgYmxvY2suCisgICAgICAqIEBwYXJhbSBwRUNCIHRoZSBJU0FQSSBleHRlbnNpb24gY29udHJvbCBibG9jayBwYXNzZWQgaW4gYnkgSUlTLgorICAgICAgKi8KKyAgICBJU0FQSV9IdHRwUmVxdWVzdChFWFRFTlNJT05fQ09OVFJPTF9CTE9DSyAqcEVDQiA9IE5VTEwpOworICAgIHZpcnR1YWwgfklTQVBJX0h0dHBSZXF1ZXN0KCk7IC8vLzwgZGVzdHJ1Y3Rvci4KKyAgICBFWFRFTlNJT05fQ09OVFJPTF9CTE9DSyAqRUNCKCkgY29uc3Q7Citwcm90ZWN0ZWQ6CisgICAgdm9pZCBQYXJzZUhlYWRlcnMoRVhURU5TSU9OX0NPTlRST0xfQkxPQ0smIGVjYik7IC8vLzwgZXh0cmFjdCB0aGUgcmVxdWVzdCBoZWFkZXJzIGZyb20gdGhlIGNvbnRlbnQgYmxvY2sKKyAgICBib29sIEFkZEhlYWRlcihFWFRFTlNJT05fQ09OVFJPTF9CTE9DSyYgZWNiLCBjb25zdCBjaGFyICpwc3pIZWFkZXJOYW1lLCBMUENUU1RSIHBzelZhcmlhYmxlTmFtZSk7CisgICAgYm9vbCBSZWFkSGVhZGVyKEVYVEVOU0lPTl9DT05UUk9MX0JMT0NLJiBlY2IsIExQQ1RTVFIgcHN6VmFyaWFibGVOYW1lLCBzdGQ6OnN0cmluZyYgc3RySGVhZGVyVmFsdWUpOworICAgIHZvaWQgUmVhZEN1c3RvbUhlYWRlcnMoRVhURU5TSU9OX0NPTlRST0xfQkxPQ0smIGVjYik7Citwcm90ZWN0ZWQ6CisgICAgYm9vbCBtX2JIZWFkZXJzUGFyc2VkOyAvLy88IGhhdmUgdGhlIGNvbnRlbnQgaGVhZGVycyBhbHJlYWR5IGJlZW4gcGFyc2VkID8KKyAgICBFWFRFTlNJT05fQ09OVFJPTF9CTE9DSyAqbV9wRUNCOworfTsKKworI2VuZGlmIC8vSVNBUElIVFRQQ09OVEVYVF9IClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9nc29hcC9JU0FQSV9TZXJ2ZXIuY3BwIGIvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9nc29hcC9JU0FQSV9TZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NzZmNTIKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL2dzb2FwL0lTQVBJX1NlcnZlci5jcHAKQEAgLTAsMCArMSwzMzYgQEAKKy8qKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgSVNBUElfU2VydmVyIGNsYXNzIAorICAqIEBmaWxlIElTQVBJX1NlcnZlci5jcHAKKyAgKiBAYXV0aG9yIENocmlzdGlhbiBBYmVyZ2VyIAorICAqIENvcHlyaWdodCAoQykgMjAwMSBXZWJXYXJlIChodHRwOi8vd3d3LndlYndhcmUuYXQpIAorICAqIExvYWQgYSBnb3NhcCBzZXJ2ZXIgZGxsIGR5bmFtaWNhbGx5IChpZiBub3QgYWxyZWFkeSBsb2FkZWQpIGFuZCBzZXJ2ZSB0aGUgcmVxdWVzdC4KKyAgKiBTZWUgaHR0cDovL3d3dy5hYmVyZ2VyLmF0L1NPQVAgZm9yIGRvY3VtZW50YXRpb24uCisgICogCisgICovCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3Ryc3RyZWFtPgorI2lmZGVmIF9fREVCVUdfSVNBUEkKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2VuZGlmCisjaW5jbHVkZSA8Y2Fzc2VydD4KK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKyNpbmNsdWRlICJJU0FQSV9TZXJ2ZXIuaCIKKyNpbmNsdWRlICJpc2FwaXN0cmVhbS5oIgorI2luY2x1ZGUgIklTQVBJX0h0dHBDb250ZXh0LmgiCisjaW5jbHVkZSAiSVNBUElfU29hcFNlcnZlckZhY3RvcnkuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgKkdTT0FQX0lEID0gIm1vZF9nc29hcCBpc2FwaSBleHRlbnNpb24gMC4wLjIiOworc3RhdGljIGNvbnN0IGNoYXIgKmNybGYgPSAiXHJcbiI7CisKKy8vLz4gaGVscGVyIGZ1bmN0aW9uIHRvIGJ1aWxkIGZ1bGwgcGF0aCB0byBkbGwuCitzdGF0aWMgc3RyaW5nIE1ha2VEbGxOYW1lKEVYVEVOU0lPTl9DT05UUk9MX0JMT0NLICpwRUNCLCBjb25zdCBjaGFyICpwc3pEbGxOYW1lKTsgCisKKy8qIC0tLSBwbHVnaW4gZnVuY3Rpb25zIC0tICovCitzdGF0aWMgaW50IG1vZF9nc29hcF9wbHVnaW5fY29weShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGx1Z2luICpkc3QsIHN0cnVjdCBzb2FwX3BsdWdpbiAqc3JjKSB7CisJKmRzdCA9ICpzcmM7CisJcmV0dXJuIFNPQVBfT0s7Cit9CitzdGF0aWMgdm9pZCBtb2RfZ3NvYXBfZGVsZXRlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnApIHsKK30KK3N0YXRpYyBpbnQgbW9kX2dzb2FwX3BsdWdpbihzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGx1Z2luICpwLCB2b2lkICphcmcpIHsKKwlwLT5pZCA9IEdTT0FQX0lEOworCXAtPmRhdGEgPSBhcmc7CisJcC0+ZmNvcHkgPSBtb2RfZ3NvYXBfcGx1Z2luX2NvcHk7CisJcC0+ZmRlbGV0ZSA9IG1vZF9nc29hcF9kZWxldGU7CisJcmV0dXJuIFNPQVBfT0s7Cit9IAorCisvKiogYnVuZGxlIHRoZSByZXF1ZXN0L3Jlc3BvbnNlIGRhdGEgaW50byBhbiBvYmplY3QgdG8gYmUgYWJsZSB0byBhdHRhY2ggaXQgdG8gc29hcC4gKi8KK2NsYXNzIFNvYXBUcmFuc2FjdGlvbiB7CitwdWJsaWM6CisgICAgU29hcFRyYW5zYWN0aW9uKHNvYXAgKik7CisgICAgdmlydHVhbCB+U29hcFRyYW5zYWN0aW9uKCk7CisKKyAgICBzdGF0aWMgU29hcFRyYW5zYWN0aW9uICp0cmFuc2FjdGlvbihzb2FwICopOworICAgIHZvaWQgU2VuZEhlYWRlcnMoKTsgLy8vPCBzZW5kIG91dHB1dCBoZWFkZXJzIG9mIGdzb2FwIHRvIGNsaWVudCwgaWYgbm90IGRvbmUgc28gYWxyZWFkeS4KKyAgICBzaXplX3QgU3VwcGx5UmVxdWVzdEhlYWRlcnMoY2hhciAqcEJ1ZiwgY29uc3Qgc2l6ZV90IGxlbik7IC8vIHNlbmQgaW5wdXQgcmVxdWVzdCBoZWFkZXJzIHRvIGdzb2FwLgorICAgIHZvaWQgQnVpbGRIZWFkZXJzKCk7IC8vLzwgYnVpbGQgdGhlIGhlYWRlcnMgdGhhdCBtdXN0IGJlIHNlbnQgdG8gZ3NvYXAuCitwdWJsaWM6CisgICAgc29hcCAqX3NvYXA7CisgICAgc3RkOjpzdHJpbmcgX2hlYWRlcjsgLy8vPCBoZWFkZXIgcGFydCByZXR1cm5lZCB0byBjbGllbnQgZS5nLiAiMjAwIE9LIi4KKwlzdGQ6OnN0cmluZyBfcmVxdWVzdF9oZWFkZXI7IC8vLzwgdGhlIChyZW1haW5pbmcgcGFydCBvZiApIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSByZXF1ZXN0LgorICAgIERXT1JEIF9kd1JldHVybkNvZGU7IC8vLzwgdGhlIHJldHVybiBjb2RlIGZvciB0aGUgSHR0cEV4dGVuc2lvblByb2MuCisgICAgSVNBUElfSHR0cFJlcXVlc3QgKl9yZXF1ZXN0OworICAgIEh0dHBSZXNwb25zZSAqX3Jlc3BvbnNlOworICAgIGlzYXBpc3RyZWFtICpfaXN0cmVhbTsKKyAgICBjb25zdCBtb2RfZ3NvYXBfaW50ZXJmYWNlICpfaW50ZXJmYWNlOworI2lmZGVmIF9ERUJVR19JU0FQSQorCW9mc3RyZWFtICpfZGVidWdfaW47IC8vLzwgZGVidWdnaW5nIG91dHB1dCBzdHJlYW0KKwlvZnN0cmVhbSAqX2RlYnVnX291dDsgLy8vPCBkZWJ1Z2dpbmcgb3V0cHV0IHN0cmVhbQorI2VuZGlmCitwcm90ZWN0ZWQ6CisgICAgYm9vbCBfaGVhZGVyc19zZW50OyAvLy88IHRydWUgaWYgSHR0cCBoZWFkZXJzIGhhdmUgYWxyZWFkeSBiZWVuIHNlbnQuCisgICAgYm9vbCBfaGVhZGVyc19zdXBwbGllZDsgLy8vPCB0cnVlIGlmIEh0dHAgaGVhZGVycyBoYXZlIGFscmVhZHkgc3VwcGxpZWQgdG8gZ3NvYXAuCit9OworCitTb2FwVHJhbnNhY3Rpb246OlNvYXBUcmFuc2FjdGlvbihzb2FwICpzb2FwKSAKKzogX3NvYXAoc29hcCkKKywgX2R3UmV0dXJuQ29kZShIU0VfU1RBVFVTX1NVQ0NFU1MpCissIF9oZWFkZXIoIjIwMCBPSyIpCissIF9yZXF1ZXN0KE5VTEwpCissIF9yZXNwb25zZShOVUxMKSAKKywgX2ludGVyZmFjZShOVUxMKSAKKywgX2lzdHJlYW0oTlVMTCkKKywgX2hlYWRlcnNfc2VudChmYWxzZSkKKywgX2hlYWRlcnNfc3VwcGxpZWQoZmFsc2UpCisjaWZkZWYgX0RFQlVHX0lTQVBJCissIF9kZWJ1Z19pbihOVUxMKQorLCBfZGVidWdfb3V0KE5VTEwpCisjZW5kaWYKK3sKKyAgICBhc3NlcnQoc29hcCk7CisjaWZkZWYgX0RFQlVHX0lTQVBJCisJVENIQVIgc3pQYXRoW19NQVhfUEFUSF07CisJOjpHZXRUZW1wUGF0aChzaXplb2Ygc3pQYXRoLCBzelBhdGgpOworCXN0cmluZyBzdHJJbiA9IHN6UGF0aDsKKwlzdHJpbmcgc3RyT3V0ID0gc3pQYXRoOworCXN0ckluICs9ICJtb2RfZ3NvYXBfZGVidWdfaW4ubG9nIjsKKwlzdHJPdXQgKz0gIm1vZF9nc29hcF9kZWJ1Z19vdXQubG9nIjsKKwlzdHJPdXQgKz0gIm1vZF9nc29hcF9kZWJ1Zy5sb2ciOworCV9kZWJ1Z19pbiA9IG5ldyBvZnN0cmVhbShzdHJJbi5jX3N0cigpLCBpb3M6Om91dCB8IGlvczo6YXBwKTsKKwlfZGVidWdfb3V0ID0gbmV3IG9mc3RyZWFtKHN0ck91dC5jX3N0cigpLCBpb3M6Om91dCB8IGlvczo6YXBwKTsKKwkqX2RlYnVnX2luIDw8ICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVNUQVJULS0tLS0tLS0tLS0tLS0tLS0tLS0iIDw8IGVuZGw7CisJKl9kZWJ1Z19vdXQgPDwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tU1RBUlQtLS0tLS0tLS0tLS0tLS0tLS0tLSIgPDwgZW5kbDsKKyNlbmRpZgorfQorU29hcFRyYW5zYWN0aW9uOjp+U29hcFRyYW5zYWN0aW9uKCkgeworI2lmZGVmIF9ERUJVR19JU0FQSQorCSpfZGVidWdfaW4gPDwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tU1RPUC0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgPDwgZW5kbDsKKwkqX2RlYnVnX291dCA8PCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1TVE9QLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiA8PCBlbmRsOworCWRlbGV0ZSBfZGVidWdfaW47CisJZGVsZXRlIF9kZWJ1Z19vdXQ7CisjZW5kaWYKK30KK2lubGluZSBTb2FwVHJhbnNhY3Rpb24gKlNvYXBUcmFuc2FjdGlvbjo6dHJhbnNhY3Rpb24oc29hcCAqc29hcCkgeworICAgIGFzc2VydChOVUxMICE9IHNvYXApOworCXJldHVybiByZWludGVycHJldF9jYXN0PFNvYXBUcmFuc2FjdGlvbiAqPihzb2FwLT5mcGx1Z2luKHNvYXAsIEdTT0FQX0lEKSk7Cit9Cit2b2lkIFNvYXBUcmFuc2FjdGlvbjo6U2VuZEhlYWRlcnMoKSB7CisgICAgaWYgKF9oZWFkZXJzX3NlbnQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBvc3Ryc3RyZWFtIGhlYWRlcnM7CisgICAgZm9yIChIdHRwTWVzc2FnZTo6Q29udGVudEhlYWRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gX3Jlc3BvbnNlLT5nZXRDb250ZW50SGVhZGVycygpLmJlZ2luKCk7IGl0ICE9IF9yZXNwb25zZS0+Z2V0Q29udGVudEhlYWRlcnMoKS5lbmQoKTsgKytpdCkgeworCQlpZiAoMCAhPSBzdHJjYXNlY21wKGl0LT5maXJzdC5jX3N0cigpLCAiQ29ubmVjdGlvbiIpKSB7CisJICAgICAgICBoZWFkZXJzIDw8IGl0LT5maXJzdCA8PCAiOiAiIDw8IGl0LT5zZWNvbmQgPDwgY3JsZjsKKwkJfSAKKyAgICB9CisgICAgaGVhZGVycyA8PCBjcmxmOworCXN0cmluZyBzdHJPdXQoaGVhZGVycy5zdHIoKSwgaGVhZGVycy5wY291bnQoKSk7CisjaWZkZWYgX0RFQlVHX0lTQVBJCisJKl9kZWJ1Z19vdXQgPDwgc3RyT3V0OworI2VuZGlmCisgICAgQk9PTCBiSGVhZGVycyA9IF9yZXF1ZXN0LT5FQ0IoKS0+U2VydmVyU3VwcG9ydEZ1bmN0aW9uKF9yZXF1ZXN0LT5FQ0IoKS0+Q29ubklELCBIU0VfUkVRX1NFTkRfUkVTUE9OU0VfSEVBREVSLAorICAgICAgICAoTFBWT0lEKSIyMDAgT0siLCBOVUxMLCAoTFBEV09SRClzdHJPdXQuY19zdHIoKSk7CisgICAgaGVhZGVycy5mcmVlemUoZmFsc2UpOworICAgIF9oZWFkZXJzX3NlbnQgPSB0cnVlOworfQorLyoqIEVtaXRzIEhUVFAga2V5OiB2YWwgaGVhZGVyIGVudHJpZXMuIAorICAgIEByZXR1cm4gU09BUF9PSywgb3IgYSBnU09BUCBlcnJvciBjb2RlLiAKKyAgICBCdWlsdC1pbiBnU09BUCBmdW5jdGlvbjogaHR0cF9wb3N0X2hlYWRlci4gCisKKyAgICBJSVMgaGFuZGxlcyBtb3N0IG9mIHRoZSBoZWFkZXJzIChDb25uZWN0aW9uIGV0Yy4pIGl0c2VsZi4gCisgICAgVGhlIG1haW4gdGhpbmcgd2UgbmVlZCB0byBleHRyYWN0IGlzIFNPQVBBY3Rpb24uCisqLworc3RhdGljIGludCBodHRwX3Bvc3RfaGVhZGVyKHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsdWUpIHsKKyAgICBpZiAoTlVMTCAhPSBrZXkpIHsKKyAgICAgICAgU29hcFRyYW5zYWN0aW9uICpwVHJhbnMgPSBTb2FwVHJhbnNhY3Rpb246OnRyYW5zYWN0aW9uKHNvYXApOworICAgICAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgICAgIHBUcmFucy0+X3Jlc3BvbnNlLT5nZXRDb250ZW50SGVhZGVycygpW2tleV0gPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKwlyZXR1cm4gU09BUF9PSzsKK30KKy8qKiBzZXQgdGhlIGh0dHAgLSByZXNwb25zZSBjb2RlIGZyb20gdGhlIHNvYXAgZXJyb3IgbWVzc2FnZS4gKi8KK3N0YXRpYyBpbnQgaHR0cF9yZXNwb25zZShzb2FwICpzb2FwLCBpbnQgc29hcF9lcnJvciwgc2l6ZV90IGNvdW50KSB7CisgICAgU29hcFRyYW5zYWN0aW9uICpwVHJhbnMgPSBTb2FwVHJhbnNhY3Rpb246OnRyYW5zYWN0aW9uKHNvYXApOworICAgIGlmIChTT0FQX09LID09IHNvYXBfZXJyb3IpIHsKKyAgICAgICAgcFRyYW5zLT5fZHdSZXR1cm5Db2RlID0gSFNFX1NUQVRVU19TVUNDRVNTOworICAgIH0gZWxzZSB7CisgICAgICAgIHBUcmFucy0+X2R3UmV0dXJuQ29kZSA9IEhTRV9TVEFUVVNfRVJST1I7CisgICAgICAgIHBUcmFucy0+X2hlYWRlciA9ICI1MDAgRVJSIjsKKyAgICB9CisgICAgcmV0dXJuIFNPQVBfT0s7Cit9CisvKiogZ3NvYXAgZnVuY3Rpb24gdG8gYXBwZW5kIHRoZSBkYXRhIHRvIHNlbmQgdG8gb3VyIG91dHB1dCBidWZmZXIgKi8KK3N0YXRpYyBpbnQgZnNlbmQoc29hcCAqc29hcCwgY29uc3QgY2hhciAqcEJ1Ziwgc2l6ZV90IGxlbikgeworICAgIFNvYXBUcmFuc2FjdGlvbiAqcFRyYW5zID0gU29hcFRyYW5zYWN0aW9uOjp0cmFuc2FjdGlvbihzb2FwKTsKKyAgICBwVHJhbnMtPlNlbmRIZWFkZXJzKCk7CisjaWZkZWYgX0RFQlVHX0lTQVBJCisJcFRyYW5zLT5fZGVidWdfb3V0LT53cml0ZShwQnVmLCBsZW4pOworI2VuZGlmCisgICAgcFRyYW5zLT5faXN0cmVhbS0+d3JpdGUocEJ1ZiwgbGVuKTsKKyAgICByZXR1cm4gU09BUF9PSzsKK30KK3NpemVfdCBTb2FwVHJhbnNhY3Rpb246OlN1cHBseVJlcXVlc3RIZWFkZXJzKGNoYXIgKnBCdWYsIGNvbnN0IHNpemVfdCBsZW4pIHsKKyAgICBpbnQgbkxlbiA9IDA7CisgICAgaWYgKCFfaGVhZGVyc19zdXBwbGllZCkgeworCQlpZiAoIV9yZXF1ZXN0X2hlYWRlci5lbXB0eSgpKSB7IC8vIHdlIG11c3Qgc2VuZCAxc3QgbGluZSBzbyB0aGF0IGdzb2FwIHBhcnNlcyBldmVyeXRoaW5nIGNvcnJlY3RseS4KKwkJCW5MZW4gPSBfcmVxdWVzdF9oZWFkZXIubGVuZ3RoKCk7CisJCQlpZiAobkxlbiA+IGxlbikgeworCQkJCW5MZW4gPSBsZW47CisJCQkJbWVtY3B5KHBCdWYsIF9yZXF1ZXN0X2hlYWRlci5jX3N0cigpLCBsZW4pOworCQkJCV9yZXF1ZXN0X2hlYWRlciA9IF9yZXF1ZXN0X2hlYWRlci5zdWJzdHIobGVuKTsKKwkJCX0gZWxzZSB7CisJCQkJbWVtY3B5KHBCdWYsIF9yZXF1ZXN0X2hlYWRlci5jX3N0cigpLCBfcmVxdWVzdF9oZWFkZXIubGVuZ3RoKCkpOworCQkJCV9yZXF1ZXN0X2hlYWRlci5lcmFzZSgpOyAgICAgICAgICAgICAgICAKKwkJCQlfaGVhZGVyc19zdXBwbGllZCA9IHRydWU7CisJCQl9CisjaWZkZWYgX0RFQlVHX0lTQVBJCisJCQlfZGVidWdfaW4tPndyaXRlKHBCdWYsIG5MZW4pOworI2VuZGlmCisJCX0KKwl9CisgICAgcmV0dXJuIG5MZW47Cit9CisvKiogZ3NvYXAgZnVuY3Rpb24gdGhhdCByZXF1ZXN0cyB0aGUgbmV4dCBwaWVjZSBvZiBkYXRhIGZyb20gdXMgKi8KK3N0YXRpYyBzaXplX3QgZnJlY3Yoc29hcCAqc29hcCwgY2hhciAqcEJ1Ziwgc2l6ZV90IGxlbikgeworICAgIFNvYXBUcmFuc2FjdGlvbiAqcFRyYW5zID0gU29hcFRyYW5zYWN0aW9uOjp0cmFuc2FjdGlvbihzb2FwKTsKKyAgICBzaXplX3QgbkxlbiA9IHBUcmFucy0+U3VwcGx5UmVxdWVzdEhlYWRlcnMocEJ1ZiwgbGVuKTsgCisgICAgaWYgKDAgPT0gbkxlbikgeyAvLyBxdWVyeSBzdHJpbmcgYW5kIGhlYWRlcnMgaGF2ZSBiZWVuIHNlbnQgYWxyZWFkeS4KKyAgICAgICAgYXNzZXJ0KHBUcmFucy0+X2lzdHJlYW0tPmdvb2QoKSk7CisJCWlmICghcFRyYW5zLT5faXN0cmVhbS0+ZW9mKCkpIHsKKwkJCXBUcmFucy0+X2lzdHJlYW0tPnJlYWRzb21lKHBCdWYsIGxlbik7CisJCQluTGVuID0gcFRyYW5zLT5faXN0cmVhbS0+Z2NvdW50KCk7CisjaWZkZWYgX0RFQlVHX0lTQVBJCisJCQlwVHJhbnMtPl9kZWJ1Z19pbi0+d3JpdGUocEJ1Ziwgbkxlbik7CisjZW5kaWYKKwkJCWFzc2VydChwVHJhbnMtPl9pc3RyZWFtLT5nb29kKCkpOworCQl9CisgICAgfQorICAgIHJldHVybiBuTGVuOworfQorCit2b2lkIFNvYXBUcmFuc2FjdGlvbjo6QnVpbGRIZWFkZXJzKCkgeworCW9zdHJzdHJlYW0gczsKKwkvKiB3ZSBtdXN0IHJlYnVpbGQgdGhlIDFzdCByZXF1ZXN0IGxpbmUsIGNhdXNlIElJUyBoYXMgbm8gQVBJIHRvIGdldCBpdCA6KCAqLworCXMgPDwgIlBPU1QgLyIgKyBfcmVxdWVzdC0+X3F1ZXJ5c3RyaW5nICsgIiBIVFRQLzEuMFxyXG4iOworICAgIGZvciAoSVNBUElfSHR0cFJlcXVlc3Q6OkNvbnRlbnRIZWFkZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IF9yZXF1ZXN0LT5nZXRDb250ZW50SGVhZGVycygpLmJlZ2luKCk7IGl0ICE9IF9yZXF1ZXN0LT5nZXRDb250ZW50SGVhZGVycygpLmVuZCgpOyArK2l0KSB7CisJCXMgPDwgaXQtPmZpcnN0IDw8ICI6ICIgPDwgaXQtPnNlY29uZCA8PCBjcmxmOworICAgIH0KKwlzIDw8IGNybGY7CisJX3JlcXVlc3RfaGVhZGVyLmFzc2lnbihzLnN0cigpLCBzLnBjb3VudCgpKTsKK30KK0JPT0wgSVNBUElfU2VydmVyOjpHZXRFeHRlbnNpb25WZXJzaW9uKEhTRV9WRVJTSU9OX0lORk8gKnBWZXIpIHsKKyAgICBsc3RyY3B5bigoTFBTVFIpIHBWZXItPmxwc3pFeHRlbnNpb25EZXNjLCAiV2ViV2FyZSBTT0FQIElTQVBJIGV4dGVuc2lvbiIsIEhTRV9NQVhfRVhUX0RMTF9OQU1FX0xFTik7CisgICAgcmV0dXJuIFRSVUU7Cit9CitCT09MIElTQVBJX1NlcnZlcjo6VGVybWluYXRlRXh0ZW5zaW9uKERXT1JEKSB7CisJSVNBUElfU29hcFNlcnZlckZhY3Rvcnk6Omluc3RhbmNlKCktPnNodXRkb3duKCk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisvKiBmb3J3YXJkcyB0aGUgcmVhbCB3b3JrIHRvIHNvYXBfc2VydmUgKi8KK3N0YXRpYyBEV09SRCBzZXJ2ZSgKKwljb25zdCBtb2RfZ3NvYXBfaW50ZXJmYWNlICpwSW50ZXJmYWNlLCAKKwlJU0FQSV9IdHRwUmVxdWVzdCYgcmVxLAorICAgIEh0dHBSZXNwb25zZSByZXMsCisJaXNhcGlzdHJlYW0mIGlzKSAKK3sKKwlhc3NlcnQoTlVMTCAhPSBwSW50ZXJmYWNlICYmIHBJbnRlcmZhY2UtPmxpbmtlZCgpKTsKKworCXNvYXAgc29hcDsKKwkoKnBJbnRlcmZhY2UtPmZzb2FwX2luaXQpKCZzb2FwKTsKKyAgICBTb2FwVHJhbnNhY3Rpb24gdHJhbnMoJnNvYXApOworICAgIGlmIChOVUxMICE9IHBJbnRlcmZhY2UtPmZzb2FwX3JlZ2lzdGVyX3BsdWdpbl9hcmcpIHsKKwkJKCpwSW50ZXJmYWNlLT5mc29hcF9yZWdpc3Rlcl9wbHVnaW5fYXJnKSgmc29hcCwgbW9kX2dzb2FwX3BsdWdpbiwgKHZvaWQgKikmdHJhbnMpOworCX0KKyAgICAvL3NvYXAudXNlciA9ICZ0cmFuczsKKyAgICB0cmFucy5faW50ZXJmYWNlID0gcEludGVyZmFjZTsKKyAgICB0cmFucy5faXN0cmVhbSA9ICZpczsKKyAgICB0cmFucy5fcmVxdWVzdCA9ICZyZXE7CisgICAgdHJhbnMuX3Jlc3BvbnNlID0gJnJlczsKKworCXRyYW5zLkJ1aWxkSGVhZGVycygpOworCisjaWZkZWYgV0lUSF9aTElCCisJLy8JYWx3YXlzIGFsbG93IGd6aXAgaW4gLS0gYnV0IG9ubHkgYWxsb3cgaXQgb3V0IGlmIHRoZSBjbGllbnQgY2FuIGhhbmRsZSBpdAorCXNvYXBfc2V0X2ltb2RlKCZzb2FwLCBTT0FQX0VOQ19aTElCKTsgCQorCisJc3RyaW5nCXN0ciA9IHJlcS5nZXRDb250ZW50SGVhZGVycygpWyJBY2NlcHQtRW5jb2RpbmciXTsKKwlpZiAoc3Ryc3RyKHN0ci5jX3N0cigpLCAiZ3ppcCIpKQorCXsJCisJCXNvYXBfc2V0X29tb2RlKCZzb2FwLCBTT0FQX0VOQ19aTElCKTsgCQkKKwkJaHR0cF9wb3N0X2hlYWRlciggJnNvYXAsICJDb250ZW50LUVuY29kaW5nIiwgImd6aXAiICk7CQorCX0KKworI2VuZGlmCisKKyAgICAvLyBzZXQgY2FsbGJhY2sgZnVuY3Rpb25zOgorICAgIHNvYXAuZnJlY3YgPSBmcmVjdjsKKyAgICBzb2FwLmZzZW5kID0gZnNlbmQ7CisgICAgc29hcC5mcmVzcG9uc2UgPSBodHRwX3Jlc3BvbnNlOworCXNvYXAuZnBvc3RoZHIgPSBodHRwX3Bvc3RfaGVhZGVyOworCisJKCpwSW50ZXJmYWNlLT5mc29hcF9zZXJ2ZSkoJnNvYXApOworCWlmIChOVUxMICE9IHBJbnRlcmZhY2UtPmZzb2FwX2RlbGV0ZSkgeworCQkoKnBJbnRlcmZhY2UtPmZzb2FwX2RlbGV0ZSkoJnNvYXAsIE5VTEwpOworCX0KKwkoKnBJbnRlcmZhY2UtPmZzb2FwX2RvbmUpKCZzb2FwKTsKKwkoKnBJbnRlcmZhY2UtPmZzb2FwX2VuZCkoJnNvYXApOworCisgICAgcmV0dXJuIHRyYW5zLl9kd1JldHVybkNvZGU7Cit9CisKK3N0YXRpYyB2b2lkIFNlbmRFcnJvck1lc3NhZ2UoaXNhcGlzdHJlYW0mIGlzLCBjb25zdCBjaGFyICpwc3pFcnJvcikgeworICAgIGlzIDw8ICI8aHRtbD48dGl0bGU+Z3NvYXAgZXJyb3IgbWVzc2FnZTwvdGl0bGU+PGJvZHk+IiA8PCBwc3pFcnJvciA8PCAiPHA+IjsKKyAgICBpcyA8PCAic2VlIDxhIGhyZWY9XCJodHRwOi8vd3d3LmFiZXJnZXIuYXQvU09BUFwiPldlYldhcmUgZ3NvYXAgSVNBUEkgbW9kdWxlPC9hPiBkb2N1bWVudGF0aW9uLiI7CisgICAgaXMgPDwgIjwvYm9keT48aHRtbD4iOworfQorCisvKiogUGFyc2UgdGhlIHJlcXVlc3QsIGxvYWQgZGxsIGlmIG5vdCBhbHJlYWR5IGxvYWRlZCwgbGV0IGl0IGNyZWF0ZSB0aGUgcmVzcG9uc2UgYW5kIHJldHVybiB0aGUgcmVzdWx0LgorICAqLworRFdPUkQgSVNBUElfU2VydmVyOjpIdHRwRXh0ZW5zaW9uUHJvYyhFWFRFTlNJT05fQ09OVFJPTF9CTE9DSyAqcEVDQikgeworICAgIERXT1JEIGR3UmVzID0gSFNFX1NUQVRVU19TVUNDRVNTOworICAgIElTQVBJX0h0dHBSZXF1ZXN0IHJlcShwRUNCKTsKKyAgICBIdHRwUmVzcG9uc2UgcmVzOworCisgICAgaXNhcGlzdHJlYW0gaXMocEVDQik7CisgICAgCisgICAgc3RyaW5nIHN0clF1ZXJ5ID0gcmVxLmdldFF1ZXJ5U3RyaW5nKCk7CisgICAgc3RyaW5nIHN0ckRsbCA9IHN0clF1ZXJ5OworICAgIHN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IHN0clF1ZXJ5LmZpbmQoJyYnKTsKKyAgICBpZiAoc3RyaW5nOjpucG9zICE9IHBvcykgeworICAgICAgICBzdHJEbGwgPSBzdHJRdWVyeS5zdWJzdHIoMCwgcG9zKTsKKyAgICAgICAgc3RyUXVlcnkgPSBzdHJRdWVyeS5zdWJzdHIocG9zICsgMSk7CisgICAgfQorCWlmICghc3RyRGxsLmVtcHR5KCkpIHsKKwkJc3RyRGxsICs9ICIuZGxsIjsKKwkJc3RyRGxsID0gTWFrZURsbE5hbWUocEVDQiwgc3RyRGxsLmNfc3RyKCkpOyAvLyBkdWUgdG8gc2VjdXJpdHkgcmVhc29ucyB3ZSBvbmx5IGFsbG93IGxvYWRpbmcgb2YgZGxscyBmcm9tIHRoZSBsb2NhbCBkaXJlY3RvcnkgKHdoaWNoIG11c3Qgbm90IGJlIHdyaXRhYmxlISkuCisJCWNvbnN0IG1vZF9nc29hcF9pbnRlcmZhY2UgKnBJbnRlcmZhY2UgPSBJU0FQSV9Tb2FwU2VydmVyRmFjdG9yeTo6aW5zdGFuY2UoKS0+Z2V0SW50ZXJmYWNlKHN0ckRsbC5jX3N0cigpKTsKKwkJaWYgKE5VTEwgIT0gcEludGVyZmFjZSkgeworCQkJaWYgKEh0dHBSZXF1ZXN0OjpQT1NUID09IHJlcS5nZXRNZXRob2QoKSkgeworCQkJCWR3UmVzID0gc2VydmUocEludGVyZmFjZSwgcmVxLCByZXMsIGlzKTsKKwkJCX0gZWxzZSB7CisJCQkJU2VuZEVycm9yTWVzc2FnZShpcywgIllvdSBtdXN0IHVzZSBhIFBPU1QgcmVxdWVzdCB0byBnZXQgYW5zd2VyIGZyb20gZ3NvYXAgISIpOworCQkJfQorCQl9IGVsc2UgeworCQkJaXMgPDwgImNvdWxkIG5vdCBjcmVhdGUgc2VydmVyICciIDw8IHN0ckRsbCA8PCAiJy4gQ2hlY2sgeW91ciByZXF1ZXN0IGlmIGl0IGlzIGNvcnJlY3QuICIKKwkJCQk8PCBJU0FQSV9Tb2FwU2VydmVyRmFjdG9yeTo6aW5zdGFuY2UoKS0+Z2V0TGFzdEVycm9yKCk7CisJCX0KKwl9IGVsc2UgeworCQlTZW5kRXJyb3JNZXNzYWdlKGlzLCAiTm8gZ3NvYXAgc2VydmVyIGRsbCBzcGVjaWZpZWQgaW4gcmVxdWVzdC4gUGxlYXNlIGFkZCB0aGUgbmFtZSBvZiB5b3VyIHNvYXAgc2VydmVyIGRsbCwgZS5nLiBodHRwOi8vbG9jYWxob3N0L2dzb2FwL21vZF9nc29hcD9jYWxjIik7CisJfQorICAgIGlzLmZsdXNoKCk7CisgICAgcmV0dXJuIGR3UmVzOworfQorCisvKiogR2l2ZW4gYSBkbGxuYW1lIG1ha2UgYSBmdWxseSBxdWFsaWZpZWQgcGF0aCB0byB0aGUgZGxsIGluIHRoZSBjdXJyZW50IGlzYXBpIGRpcmVjdG9yeSAKKyAgICBAcGFyYW0gcEVDQiB0aGUgRXh0ZW5zaW9uIENvbnRyb2wgQmxvY2sgb2YgdGhlIFJlcXVlc3QKKyAgICBAcGFyYW0gcHN6RGxsTmFtZSB0aGUgdW5xdWFsaWZpZWQgZGxsbmFtZQorKi8KK3N0YXRpYyBzdHJpbmcgTWFrZURsbE5hbWUoRVhURU5TSU9OX0NPTlRST0xfQkxPQ0sgKnBFQ0IsIGNvbnN0IGNoYXIgKnBzekRsbE5hbWUpIHsKKyAgICBzdHJpbmcgc3RyUGF0aDsKKyAgICBjaGFyIHN6UGF0aFtfTUFYX1BBVEggKyAxXTsKKyAgICBaZXJvTWVtb3J5KHN6UGF0aCwgc2l6ZW9mIHN6UGF0aCk7CisgICAgRFdPUkQgZHdCdWZmZXJTaXplID0gc2l6ZW9mIHN6UGF0aDsKKyAgICBwRUNCLT5HZXRTZXJ2ZXJWYXJpYWJsZShwRUNCLT5Db25uSUQsICJBUFBMX1BIWVNJQ0FMX1BBVEgiLCBzelBhdGgsICZkd0J1ZmZlclNpemUpOworICAgIHN0clBhdGggPSBzelBhdGg7CisgICAgc3RyUGF0aCArPSBwc3pEbGxOYW1lOworICAgIHJldHVybiBzdHJQYXRoOworfQpkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9nc29hcC9JU0FQSV9TZXJ2ZXIuaCBiL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvZ3NvYXAvSVNBUElfU2VydmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE4OGM1NQotLS0gL2Rldi9udWxsCisrKyBiL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvZ3NvYXAvSVNBUElfU2VydmVyLmgKQEAgLTAsMCArMSwyMSBAQAorLyoqIEludGVyZmFjZSBvZiB0aGUgSVNBUElfU2VydmVyIGNsYXNzIAorICAqIEBmaWxlIElTQVBJX1NvYXBTZXJ2ZXJGYWN0b3J5LmgKKyAgKiBAYXV0aG9yIENocmlzdGlhbiBBYmVyZ2VyIAorICAqIENvcHlyaWdodCAoQykgMjAwMSBXZWJXYXJlIChodHRwOi8vd3d3LndlYndhcmUuYXQpIAorICAqLworI2lmbmRlZiBJU0FQSV9IX0YzQThGRTExXzJDMTJfMTFkNV84QkVCCisjZGVmaW5lIElTQVBJX0hfRjNBOEZFMTFfMkMxMl8xMWQ1XzhCRUIKKworI2luY2x1ZGUgPGh0dHBleHQuaD4KKworLyoqIEludGVybmV0IFNlcnZlciBBcHBsaWNhdGlvbiBQcm9ncmFtbWluZyBJbnRlcmZhY2Ugc2VydmVyLgorICAqCisgICovCitjbGFzcyBJU0FQSV9TZXJ2ZXIgeworcHVibGljOgorICAgIHN0YXRpYyBEV09SRCBIdHRwRXh0ZW5zaW9uUHJvYyhFWFRFTlNJT05fQ09OVFJPTF9CTE9DSyAqcEVDQik7CisgICAgc3RhdGljIEJPT0wgR2V0RXh0ZW5zaW9uVmVyc2lvbihPVVQgSFNFX1ZFUlNJT05fSU5GTyAqcFZlcik7CisgICAgc3RhdGljIEJPT0wgVGVybWluYXRlRXh0ZW5zaW9uKERXT1JEIGR3RmxhZ3MpOworfTsKKworI2VuZGlmIC8vIElTQVBJX0hfRjNBOEZFMTFfMkMxMl8xMWQ1XzhCRUIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL2dzb2FwL0lTQVBJX1NvYXBTZXJ2ZXJGYWN0b3J5LmNwcCBiL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvZ3NvYXAvSVNBUElfU29hcFNlcnZlckZhY3RvcnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViODExMDAKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL2dzb2FwL0lTQVBJX1NvYXBTZXJ2ZXJGYWN0b3J5LmNwcApAQCAtMCwwICsxLDI1MSBAQAorLyoqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBJU0FQSV9Tb2FwU2VydmVyRmFjdG9yeSBjbGFzcworICAqIEBmaWxlIFNvYXBTZXJ2ZXJGYWN0b3J5LmgKKyAgKiBAYXV0aG9yIENocmlzdGlhbiBBYmVyZ2VyIAorICAqIENvcHlyaWdodCAoQykgMjAwMSBXZWJXYXJlIChodHRwOi8vd3d3LndlYndhcmUuYXQpIAorICAqLworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0cmluZz4gLy8gZm9yIGNhc2VjbXAKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgIklTQVBJX1NvYXBTZXJ2ZXJGYWN0b3J5LmgiCisjaW5jbHVkZSAiY2FzZWNtcGxlc3MuaCIKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2NsYXNzIENyaXRpY2FsU2VjdGlvbkxvY2sgeworcHVibGljOgorCUNyaXRpY2FsU2VjdGlvbkxvY2soQ1JJVElDQUxfU0VDVElPTiAqcGNzKSA6IG1fcGNzKHBjcykgeworCQlhc3NlcnQoTlVMTCAhPSBwY3MpOworCQk6OkVudGVyQ3JpdGljYWxTZWN0aW9uKHBjcyk7CisJfQorCX5Dcml0aWNhbFNlY3Rpb25Mb2NrKCkgeworCQk6OkxlYXZlQ3JpdGljYWxTZWN0aW9uKG1fcGNzKTsKKwl9Citwcm90ZWN0ZWQ6CisJQ1JJVElDQUxfU0VDVElPTiAqbV9wY3M7Cit9OworCisKK0lTQVBJX1NvYXBTZXJ2ZXJGYWN0b3J5ICpJU0FQSV9Tb2FwU2VydmVyRmFjdG9yeTo6bV9wSW5zdGFuY2UgPSBOVUxMOworCittb2RfZ3NvYXBfaW50ZXJmYWNlOjptb2RfZ3NvYXBfaW50ZXJmYWNlKCkgCis6IGZzb2FwX2luaXQoTlVMTCkKKywgZnNvYXBfc2VydmUoTlVMTCkKKywgZnNvYXBfZGVsZXRlKE5VTEwpCissIGZzb2FwX2RvbmUoTlVMTCkKKywgZnNvYXBfZW5kKE5VTEwpCissIGZzb2FwX3JlZ2lzdGVyX3BsdWdpbl9hcmcoTlVMTCkKKywgZnNvYXBfbG9va3VwX3BsdWdpbihOVUxMKQorLCBmbW9kX2dzb2FwX2luaXQoTlVMTCkKKywgZm1vZF9nc29hcF90ZXJtaW5hdGUoTlVMTCkKKywgcmVzZXJ2ZWQoTlVMTCkKK3sKK30KK21vZF9nc29hcF9pbnRlcmZhY2U6Om1vZF9nc29hcF9pbnRlcmZhY2UoY29uc3QgbW9kX2dzb2FwX2ludGVyZmFjZSYgaW50ZikgeworCSp0aGlzID0gaW50ZjsKK30KK21vZF9nc29hcF9pbnRlcmZhY2UmIG1vZF9nc29hcF9pbnRlcmZhY2U6Om9wZXJhdG9yPShjb25zdCBtb2RfZ3NvYXBfaW50ZXJmYWNlJiBpbnRmKSB7CisJZnNvYXBfaW5pdCA9IGludGYuZnNvYXBfaW5pdDsKKwlmc29hcF9zZXJ2ZSA9IGludGYuZnNvYXBfc2VydmU7CisJZnNvYXBfZGVsZXRlID0gaW50Zi5mc29hcF9kZWxldGU7CisJZnNvYXBfZG9uZSA9IGludGYuZnNvYXBfZG9uZTsKKwlmc29hcF9lbmQgPSBpbnRmLmZzb2FwX2VuZDsKKwlmc29hcF9yZWdpc3Rlcl9wbHVnaW5fYXJnID0gaW50Zi5mc29hcF9yZWdpc3Rlcl9wbHVnaW5fYXJnOworCWZzb2FwX2xvb2t1cF9wbHVnaW4gPSBpbnRmLmZzb2FwX2xvb2t1cF9wbHVnaW47CisJZm1vZF9nc29hcF9pbml0ID0gaW50Zi5mbW9kX2dzb2FwX2luaXQ7CisJZm1vZF9nc29hcF90ZXJtaW5hdGUgPSBpbnRmLmZtb2RfZ3NvYXBfdGVybWluYXRlOworCXJldHVybiAqdGhpczsKK30KKy8qKiBIYXZlIGFsbCBlbnRyeSBwb2ludHMgYmVlbiBmb3VuZCBpbiB0aGUgZ29zYXAgc2VydmVyIGxpYnJhcnkgPworCUByZXR1cm4gdHJ1ZSBpZiBhbGwgZW50cnkgcG9pbnRzIGhhdmUgYmVlbiBhc3NpZ25lZCBzdWNjZXNzZnVsbHkuIAorICAqLworYm9vbCBtb2RfZ3NvYXBfaW50ZXJmYWNlOjpsaW5rZWQoKSBjb25zdCB7CisJcmV0dXJuIAorCQlOVUxMICE9IGZzb2FwX2luaXQgJiYKKwkJTlVMTCAhPSBmc29hcF9zZXJ2ZSAmJgorCQlOVUxMICE9IGZzb2FwX2RvbmUgJiYKKwkJTlVMTCAhPSBmc29hcF9lbmQgJiYKKwkJTlVMTCAhPSBmc29hcF9yZWdpc3Rlcl9wbHVnaW5fYXJnICYmCisJCU5VTEwgIT0gZnNvYXBfbG9va3VwX3BsdWdpbjsKKwkvLyBkb24ndCBjaGVjayBmb3IgCWZzb2FwX2RlbGV0ZSwgb25seSBzZXJ2ZXJzIHdpdGggY2xhc3NlcyBoYXZlIGl0LgorfQorCitTb2FwRGxsOjpTb2FwRGxsKCkgCis6IG1faERsbChOVUxMKQoreworfQorU29hcERsbDo6U29hcERsbChjb25zdCBTb2FwRGxsJiBkbGwpIHsKKyAgICAqdGhpcyA9IGRsbDsKK30KK1NvYXBEbGwmIFNvYXBEbGw6Om9wZXJhdG9yPShjb25zdCBTb2FwRGxsJiBkbGwpIHsKKyAgICBtX2hEbGwgPSBkbGwubV9oRGxsOworICAgIG1fc3RyTGFzdEVycm9yID0gZGxsLm1fc3RyTGFzdEVycm9yOworCW1faW50ZXJmYWNlID0gZGxsLm1faW50ZXJmYWNlOworICAgIHJldHVybiAqdGhpczsKK30KK2Jvb2wgU29hcERsbDo6dW5sb2FkKCkgeworICAgIGJvb2wgYlJldCA9IHRydWU7CisgICAgaWYgKE5VTEwgIT0gbV9oRGxsKSB7CisJCWlmIChOVUxMICE9IG1faW50ZXJmYWNlLmZtb2RfZ3NvYXBfdGVybWluYXRlKSB7CisJCQlpbnQgblJldCA9ICgqbV9pbnRlcmZhY2UuZm1vZF9nc29hcF90ZXJtaW5hdGUpKCk7CisJCX0KKyAgICAgICAgQk9PTCBiRnJlZSA9IDo6RnJlZUxpYnJhcnkobV9oRGxsKTsKKyAgICAgICAgYlJldCA9IGJGcmVlID8gdHJ1ZSA6IGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gYlJldDsKK30KK1NvYXBEbGw6On5Tb2FwRGxsKCkgeworfQorLyoqCisgICAgQHBhcmFtIHBzelBhdGggdGhlIG5hbWUgb2YgdGhlIGRsbCB0byBsb2FkLgorICAqLworYm9vbCBTb2FwRGxsOjpsb2FkKGNvbnN0IGNoYXIgKnBzelBhdGgpIHsKKwlib29sIGJSZXQgPSB0cnVlOworICAgIGlmIChOVUxMID09IG1faERsbCkgeworCQltX3N0ckxhc3RFcnJvci5lcmFzZSgpOworCQltX2hEbGwgPSBMb2FkTGlicmFyeShwc3pQYXRoKTsKKwkJaWYgKE5VTEwgIT0gbV9oRGxsKSB7CisJCQliUmV0ID0gR2V0RW50cnlQb2ludHMocHN6UGF0aCk7CisJCX0gZWxzZSB7CisJCQlMUFZPSUQgbHBNc2dCdWYgPSBOVUxMOworCQkJRm9ybWF0TWVzc2FnZShGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIgfCBGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSB8IEZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTLAorCQkJCU5VTEwsIEdldExhc3RFcnJvcigpLCBNQUtFTEFOR0lEKExBTkdfTkVVVFJBTCwgU1VCTEFOR19ERUZBVUxUKSwgLy8gRGVmYXVsdCBsYW5ndWFnZQorCQkJCShMUFRTVFIpICZscE1zZ0J1ZiwgMCwgTlVMTCk7CisJCQltX3N0ckxhc3RFcnJvciA9ICJBdHRlbXB0IHRvIGxvYWQgJyIgKyBzdHJpbmcocHN6UGF0aCkgKyAiJyBmYWlsZWQuICI7CisJCQltX3N0ckxhc3RFcnJvciArPSAoTFBDVFNUUilscE1zZ0J1ZjsKKwkJCUxvY2FsRnJlZShscE1zZ0J1Zik7CisJCQliUmV0ID0gZmFsc2U7CisJCX0KKwl9CisgICAgYXNzZXJ0KGZhbHNlID09IGJSZXQgfHwgKE5VTEwgIT0gbV9oRGxsKSk7CisgICAgcmV0dXJuIGJSZXQ7Cit9Citjb25zdCBjaGFyICpTb2FwRGxsOjpnZXRMYXN0RXJyb3IoKSBjb25zdCB7CisJcmV0dXJuIG1fc3RyTGFzdEVycm9yLmNfc3RyKCk7Cit9CitzdGF0aWMgaXNhcGlfZ3NvYXBfc2VydmVyX2ZuIEdldEZ1bmN0aW9uKAorCUhNT0RVTEUgaERsbCwgCisJY29uc3QgY2hhciAqcHN6RnVuY3Rpb25OYW1lLCAKKwlzdHJpbmcmIHN0ckVycm9yTWVzc2FnZSwgCisJY29uc3QgY2hhciAqcHN6UGF0aCkgCit7CisJYXNzZXJ0KE5VTEwgIT0gcHN6RnVuY3Rpb25OYW1lKTsKKworCWlzYXBpX2dzb2FwX3NlcnZlcl9mbiBmbiA9IE5VTEw7CisJaWYgKE5VTEwgIT0gaERsbCkgeworCQlzdHJFcnJvck1lc3NhZ2UuZXJhc2UoKTsKKwkJRkFSUFJPQyBEbGxFbnRyeVBvaW50ID0gR2V0UHJvY0FkZHJlc3MoaERsbCwgcHN6RnVuY3Rpb25OYW1lKTsgLy8gRmluZCBlbnRyeSBwb2ludC4KKwkJaWYgKE5VTEwgIT0gRGxsRW50cnlQb2ludCkgeworCQkJZm4gPSByZWludGVycHJldF9jYXN0PGlzYXBpX2dzb2FwX3NlcnZlcl9mbj4oRGxsRW50cnlQb2ludCk7CisJCX0gZWxzZSB7CisJCQlzdHJFcnJvck1lc3NhZ2UgPSAiRW50cnkgUG9pbnQgJyI7CisJCQlzdHJFcnJvck1lc3NhZ2UgKz0gcHN6RnVuY3Rpb25OYW1lOworCQkJc3RyRXJyb3JNZXNzYWdlICs9ICInIG5vdCBmb3VuZCBpbiBkbGwgJyIgKyBzdHJpbmcocHN6UGF0aCkgKyAiJy4iOworCQl9CisJfQorCXJldHVybiBmbjsKK30KKy8qKiBGaW5kIHRoZSBhZGRyZXNzIG9mIGFsbCBlbnRyeSBwb2ludHMgdGhhdCB3ZSBtdXN0IHVzZS4gKi8KK2Jvb2wgU29hcERsbDo6R2V0RW50cnlQb2ludHMoY29uc3QgY2hhciAqcHN6UGF0aCkgeworCWFzc2VydChOVUxMICE9IG1faERsbCk7CisJCisJc3RyaW5nIHN0clRtcDsKKwltX2ludGVyZmFjZS5mc29hcF9pbml0ICAgID0gR2V0RnVuY3Rpb24obV9oRGxsLCAic29hcF9pbml0IiwgbV9zdHJMYXN0RXJyb3IsIHBzelBhdGgpOworCW1faW50ZXJmYWNlLmZzb2FwX3NlcnZlICAgPSBHZXRGdW5jdGlvbihtX2hEbGwsICJzb2FwX3NlcnZlIiwgbV9zdHJMYXN0RXJyb3IsIHBzelBhdGgpOworCW1faW50ZXJmYWNlLmZzb2FwX2RlbGV0ZSAgPSAoaXNhcGlfc29hcF9kZWxldGVfZm4pR2V0RnVuY3Rpb24obV9oRGxsLCAic29hcF9kZWxldGUiLCBzdHJUbXAsIHBzelBhdGgpOyAvLyBzb2FwX2RlbGV0ZSBtYXkgYmUgbWlzc2luZyBmb3Igbm9uIC0gY3BwCisJbV9pbnRlcmZhY2UuZnNvYXBfZG9uZSAgICA9IEdldEZ1bmN0aW9uKG1faERsbCwgInNvYXBfZG9uZSIsIG1fc3RyTGFzdEVycm9yLCBwc3pQYXRoKTsKKwltX2ludGVyZmFjZS5mc29hcF9lbmQgICAgID0gR2V0RnVuY3Rpb24obV9oRGxsLCAic29hcF9lbmQiLCBtX3N0ckxhc3RFcnJvciwgcHN6UGF0aCk7CisJbV9pbnRlcmZhY2UuZnNvYXBfcmVnaXN0ZXJfcGx1Z2luX2FyZyA9IChpc2FwaV9zb2FwX3JlZ2lzdGVyX3BsdWdpbl9mbilHZXRGdW5jdGlvbihtX2hEbGwsICJzb2FwX3JlZ2lzdGVyX3BsdWdpbl9hcmciLCBtX3N0ckxhc3RFcnJvciwgcHN6UGF0aCk7CisJbV9pbnRlcmZhY2UuZnNvYXBfbG9va3VwX3BsdWdpbiA9IChpc2FwaV9zb2FwX2xvb2t1cF9wbHVnaW5fZm4pR2V0RnVuY3Rpb24obV9oRGxsLCAic29hcF9sb29rdXBfcGx1Z2luIiwgbV9zdHJMYXN0RXJyb3IsIHBzelBhdGgpOworCW1faW50ZXJmYWNlLmZtb2RfZ3NvYXBfaW5pdCA9IChtb2RfZ3NvYXBfaW5pdF9mbilHZXRGdW5jdGlvbihtX2hEbGwsICJtb2RfZ3NvYXBfaW5pdCIsIHN0clRtcCwgcHN6UGF0aCk7CisJbV9pbnRlcmZhY2UuZm1vZF9nc29hcF90ZXJtaW5hdGUgPSAobW9kX2dzb2FwX3Rlcm1pbmF0ZV9mbilHZXRGdW5jdGlvbihtX2hEbGwsICJtb2RfZ3NvYXBfdGVybWluYXRlIiwgc3RyVG1wLCBwc3pQYXRoKTsKKwlib29sIGJSZXQgPSBtX2ludGVyZmFjZS5saW5rZWQoKTsKKworCWFzc2VydCghYlJldCB8fCBtX2ludGVyZmFjZS5saW5rZWQoKSk7CisJcmV0dXJuIGJSZXQ7Cit9Citjb25zdCBtb2RfZ3NvYXBfaW50ZXJmYWNlICpTb2FwRGxsOjpnc29hcF9pbnRlcmZhY2UoKSBjb25zdCB7CisJcmV0dXJuIG1faW50ZXJmYWNlLmxpbmtlZCgpID8gJm1faW50ZXJmYWNlIDogTlVMTDsKK30KKy8qKiBhIG1hcCBvZiBkbGwgbmFtZXMgdG8gdGhlIGRsbCBoYW5kbGVzICovCit0eXBlZGVmIG1hcDxzdHJpbmcsIFNvYXBEbGwsIGNhc2VjbXBsZXNzPiBNYXBTdHJpbmcyRGxsOyAKKworY2xhc3MgRGxsTWFwIDogcHVibGljIE1hcFN0cmluZzJEbGwgeworcHVibGljOgorICAgIERsbE1hcCgpIHt9OworICAgIHZpcnR1YWwgfkRsbE1hcCgpOworfTsKK0RsbE1hcDo6fkRsbE1hcCgpIHsKKyAgICBmb3IgKGl0ZXJhdG9yIGl0ID0gYmVnaW4oKTsgaXQgIT0gZW5kKCk7ICsraXQpIHsKKyAgICAgICAgYm9vbCBiUmV0ID0gaXQtPnNlY29uZC51bmxvYWQoKTsKKyAgICAgICAgYXNzZXJ0KGJSZXQpOworICAgIH0KK30KK2NvbnN0IGNoYXIgKklTQVBJX1NvYXBTZXJ2ZXJGYWN0b3J5OjpnZXRMYXN0RXJyb3IoKSB7CisgICAgcmV0dXJuIG1fc3RyRXJyb3IuY19zdHIoKTsKK30KKworSVNBUElfU29hcFNlcnZlckZhY3RvcnkgKklTQVBJX1NvYXBTZXJ2ZXJGYWN0b3J5OjppbnN0YW5jZSgpIHsKKwlpZiAoTlVMTCA9PSBtX3BJbnN0YW5jZSkgeworCQltX3BJbnN0YW5jZSA9IG5ldyBJU0FQSV9Tb2FwU2VydmVyRmFjdG9yeTsKKwl9CisKKwlhc3NlcnQoTlVMTCAhPSBtX3BJbnN0YW5jZSk7CisJcmV0dXJuIG1fcEluc3RhbmNlOworfQordm9pZCBJU0FQSV9Tb2FwU2VydmVyRmFjdG9yeTo6c2h1dGRvd24oKSB7CisJYXNzZXJ0KHRoaXMgPT0gbV9wSW5zdGFuY2UpOworCisJbV9wSW5zdGFuY2UgPSBOVUxMOworCWRlbGV0ZSB0aGlzOworCisJYXNzZXJ0KE5VTEwgPT0gbV9wSW5zdGFuY2UpOworfQorSVNBUElfU29hcFNlcnZlckZhY3Rvcnk6OklTQVBJX1NvYXBTZXJ2ZXJGYWN0b3J5KCkgCis6IG1fcERsbHMoTlVMTCkKK3sKKwk6OkluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oJm1fY3MpOworCW1fcERsbHMgPSBuZXcgRGxsTWFwOworfQorSVNBUElfU29hcFNlcnZlckZhY3Rvcnk6On5JU0FQSV9Tb2FwU2VydmVyRmFjdG9yeSgpIHsKKwlkZWxldGUgbV9wRGxsczsKKwk6OkRlbGV0ZUNyaXRpY2FsU2VjdGlvbigmbV9jcyk7Cit9CisvKiogQHJldHVybiB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgb2YgdGhpcyBkbGwgaWYgdGhleSBjb3VsZCBiZSBsb2FkZWQgYW5kIGZvdW5kLCBlbHNlIE5VTEwuCisgICovCitjb25zdCBtb2RfZ3NvYXBfaW50ZXJmYWNlICpJU0FQSV9Tb2FwU2VydmVyRmFjdG9yeTo6Z2V0SW50ZXJmYWNlKGNvbnN0IGNoYXIgKnBzekRsbCkgeworCWNvbnN0IG1vZF9nc29hcF9pbnRlcmZhY2UgKnBJbnRmID0gTlVMTDsKKwlDcml0aWNhbFNlY3Rpb25Mb2NrIGxvY2soJm1fY3MpOworCW1fc3RyRXJyb3IuZXJhc2UoKTsKKwlpZiAoTlVMTCAhPSBwc3pEbGwpIHsKKwkJRGxsTWFwOjppdGVyYXRvciBpdCA9IG1fcERsbHMtPmZpbmQocHN6RGxsKTsKKwkJaWYgKGl0ID09IG1fcERsbHMtPmVuZCgpKSB7CisJCQlTb2FwRGxsIGRsbDsKKwkJCWJvb2wgYkxvYWQgPSBkbGwubG9hZChwc3pEbGwpOworCQkJaWYgKGJMb2FkKSB7CisJCQkJY29uc3QgbW9kX2dzb2FwX2ludGVyZmFjZSAqcEludGVyZmFjZSA9IGRsbC5nc29hcF9pbnRlcmZhY2UoKTsKKwkJCQlpbnQgblJldCA9IDA7CisJCQkJaWYgKE5VTEwgIT0gcEludGVyZmFjZSAmJiBOVUxMICE9IHBJbnRlcmZhY2UtPmZtb2RfZ3NvYXBfaW5pdCkgeworCQkJCQluUmV0ID0gKCpwSW50ZXJmYWNlLT5mbW9kX2dzb2FwX2luaXQpKCk7CisJCQkJCWlmICgwICE9IG5SZXQpIHsKKwkJCQkJCWNoYXIgc3pCdWZbMjU2XTsKKwkJCQkJCXNwcmludGYoc3pCdWYsICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSAlczogbW9kX2dzb2FwX2luaXQgcmV0dXJuZWQgJWQiLCAoY29uc3QgY2hhciAqKXBzekRsbCwgblJldCk7CisJCQkJCQltX3N0ckVycm9yID0gc3pCdWY7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKDAgPT0gblJldCkgeworCQkJCQlpdCA9IG1fcERsbHMtPmluc2VydChEbGxNYXA6OnZhbHVlX3R5cGUocHN6RGxsLCBkbGwpKS5maXJzdDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCW1fc3RyRXJyb3IgPSBkbGwuZ2V0TGFzdEVycm9yKCk7CisJCQl9CisJCX0KKwkJaWYgKGl0ICE9IG1fcERsbHMtPmVuZCgpKSB7CisJCQljb25zdCBTb2FwRGxsJiBkbGwgPSBpdC0+c2Vjb25kOworCQkJcEludGYgPSBkbGwuZ3NvYXBfaW50ZXJmYWNlKCk7CisJCQlpZiAoTlVMTCA9PSBwSW50ZikgeworCQkJCW1fc3RyRXJyb3IgPSBkbGwuZ2V0TGFzdEVycm9yKCk7CisJCQl9CisJCX0KKwl9CisgICAgcmV0dXJuIHBJbnRmOworfQpkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9nc29hcC9JU0FQSV9Tb2FwU2VydmVyRmFjdG9yeS5oIGIvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9nc29hcC9JU0FQSV9Tb2FwU2VydmVyRmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYjg1NjMKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL2dzb2FwL0lTQVBJX1NvYXBTZXJ2ZXJGYWN0b3J5LmgKQEAgLTAsMCArMSw4MyBAQAorLyoqIEludGVyZmFjZSBmb3IgdGhlIElTQVBJX1NvYXBTZXJ2ZXJGYWN0b3J5IGNsYXNzCisgICogQGZpbGUgSVNBUElfU29hcFNlcnZlckZhY3RvcnkuaAorICAqIEBhdXRob3IgQ2hyaXN0aWFuIEFiZXJnZXIgCisgICogQ29weXJpZ2h0IChDKSAyMDAxIFdlYldhcmUgKGh0dHA6Ly93d3cud2Vid2FyZS5hdCkgCisgICovCisjaWZuZGVmIFNvYXBTZXJ2ZXJGYWN0b3J5X0gKKyNkZWZpbmUgU29hcFNlcnZlckZhY3RvcnlfSAorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxodHRwZXh0Lmg+CisjaW5jbHVkZSAic3Rkc29hcDIuaCIKKwordHlwZWRlZiBTT0FQX0ZNQUMxIHZvaWQgKFNPQVBfRk1BQzIgKmlzYXBpX2dzb2FwX3NlcnZlcl9mbikoc3RydWN0IHNvYXAgKik7IC8vLzwgY2FsbHMgc29hcF9zZXJ2ZSBpbnNpZGUgc2hhcmVkIGxpYnJhcnkgCit0eXBlZGVmIFNPQVBfRk1BQzEgdm9pZCAoU09BUF9GTUFDMiAqaXNhcGlfc29hcF9kZWxldGVfZm4pKHN0cnVjdCBzb2FwKiwgdm9pZCopOwordHlwZWRlZiBTT0FQX0ZNQUMxIGludCAoU09BUF9GTUFDMiAqaXNhcGlfc29hcF9yZWdpc3Rlcl9wbHVnaW5fZm4pKHN0cnVjdCBzb2FwKiwgaW50ICgqZmNyZWF0ZSkoc3RydWN0IHNvYXAgKiwgc3RydWN0IHNvYXBfcGx1Z2luICosIHZvaWQqKSwgdm9pZCAqYXJnKTsKK3R5cGVkZWYgU09BUF9GTUFDMSB2b2lkKiBTT0FQX0ZNQUMyICgqaXNhcGlfc29hcF9sb29rdXBfcGx1Z2luX2ZuKShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKKworZXh0ZXJuICJDIiB7CisJdHlwZWRlZiBpbnQgKCptb2RfZ3NvYXBfaW5pdF9mbikoKTsKKwl0eXBlZGVmIGludCAoKm1vZF9nc29hcF90ZXJtaW5hdGVfZm4pKCk7Cit9CitjbGFzcyBtb2RfZ3NvYXBfaW50ZXJmYWNlIHsKK3B1YmxpYzoKKwltb2RfZ3NvYXBfaW50ZXJmYWNlKCk7CisJbW9kX2dzb2FwX2ludGVyZmFjZShjb25zdCBtb2RfZ3NvYXBfaW50ZXJmYWNlJik7IC8vLzwgY29weSBjb25zdHJ1Y3Rvci4KKwltb2RfZ3NvYXBfaW50ZXJmYWNlJiBvcGVyYXRvcj0oY29uc3QgbW9kX2dzb2FwX2ludGVyZmFjZSYpOyAvLy88IGFzc2lnbm1lbnQgb3BlcmF0b3IKKwlib29sIGxpbmtlZCgpIGNvbnN0OyAKK3B1YmxpYzoKKyAgICBpc2FwaV9nc29hcF9zZXJ2ZXJfZm4gZnNvYXBfaW5pdDsKKyAgICBpc2FwaV9nc29hcF9zZXJ2ZXJfZm4gZnNvYXBfc2VydmU7CisgICAgaXNhcGlfc29hcF9kZWxldGVfZm4gIGZzb2FwX2RlbGV0ZTsKKyAgICBpc2FwaV9nc29hcF9zZXJ2ZXJfZm4gZnNvYXBfZG9uZTsKKyAgICBpc2FwaV9nc29hcF9zZXJ2ZXJfZm4gZnNvYXBfZW5kOworCWlzYXBpX3NvYXBfcmVnaXN0ZXJfcGx1Z2luX2ZuIGZzb2FwX3JlZ2lzdGVyX3BsdWdpbl9hcmc7CisJaXNhcGlfc29hcF9sb29rdXBfcGx1Z2luX2ZuIGZzb2FwX2xvb2t1cF9wbHVnaW47CisJbW9kX2dzb2FwX2luaXRfZm4gZm1vZF9nc29hcF9pbml0OworCW1vZF9nc29hcF90ZXJtaW5hdGVfZm4gZm1vZF9nc29hcF90ZXJtaW5hdGU7CisKKyAgICB2b2lkICpyZXNlcnZlZDsKK307CisKKy8qKiBhIGR5bmFtaWMgbGluayBsaWJyYXJ5IGNvbnRhaW5pbmcgdGhlIGdzb2FwIGVudHJ5IHBvaW50cyBzb2FwX2luaXQsIHNvYXBfc2VydmVyIGV0Yy4gKi8KK2NsYXNzIFNvYXBEbGwgeworcHVibGljOgorICAgIFNvYXBEbGwoKTsgLy8vPCBjb25zdHJ1Y3RvcgorICAgIFNvYXBEbGwoY29uc3QgU29hcERsbCYpOyAvLy88IGNvcHkgY29uc3RydWN0b3IKKyAgICB2aXJ0dWFsIH5Tb2FwRGxsKCk7IC8vLzwgdmlydHVhbCBkZXN0cnVjdG9yLgorCisgICAgU29hcERsbCYgb3BlcmF0b3I9KGNvbnN0IFNvYXBEbGwmKTsgLy8vPCBhc3NpZ25tZW50IG9wZXJhdG9yCisgICAgYm9vbCBsb2FkKGNvbnN0IGNoYXIgKnBzelBhdGgpOyAvLy88IGR5bmFtaWNhbGx5IGxvYWQgdGhpcyBkbGwuCisgICAgYm9vbCB1bmxvYWQoKTsgLy8vPCBkeW5hbWljYWxseSBsb2FkIHRoaXMgZGxsLgorCWNvbnN0IG1vZF9nc29hcF9pbnRlcmZhY2UgKmdzb2FwX2ludGVyZmFjZSgpIGNvbnN0OyAvLy88IEByZXR1cm4gdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIGZvciBjYWxsaW5nIGludG8gdGhpcyBkbGwuIAorCWNvbnN0IGNoYXIgKmdldExhc3RFcnJvcigpIGNvbnN0OyAvLy88IEByZXR1cm4gdGhlIGxhdGVzdCBlcnJvciBtZXNzYWdlIHRoYXQgb2NjdXJyZWQuCitwcm90ZWN0ZWQ6CisJYm9vbCBHZXRFbnRyeVBvaW50cyhjb25zdCBjaGFyICpwc3pQYXRoKTsKK3Byb3RlY3RlZDoKKyAgICBITU9EVUxFIG1faERsbDsgLy8vPCB0aGUgaGFuZGxlIGlmIHRoZSBkbGwgaXMgYWxyZWFkeSBsb2FkZWQuCisJc3RkOjpzdHJpbmcgbV9zdHJMYXN0RXJyb3I7IC8vLzwgbGFzdCBlcnJvciBtZXNzYWdlIGZvciBlcnJvciByZXBvcnRpbmcKKwltb2RfZ3NvYXBfaW50ZXJmYWNlIG1faW50ZXJmYWNlOworfTsKKworLyoqIEZhY3Rvcnkgb2JqZWN0IHRoYXQgY3JlYXRlcyB0aGUgYXBwcm9wcmlhdGUgc2VydmVyIGZvciBhIGdpdmVuIFF1ZXJ5U3RyaW5nLgorICAgIFNlZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBjcmVhdGVTZXJ2ZXIgZnVuY3Rpb24gZm9yIGRldGFpbHMgb2YgaG93IHRoZSAKKyAgICBRdWVyeVN0cmluZyBpcyBldmFsdWF0ZWQuCisgICovCitjbGFzcyBJU0FQSV9Tb2FwU2VydmVyRmFjdG9yeSB7CitwdWJsaWM6CisJc3RhdGljIElTQVBJX1NvYXBTZXJ2ZXJGYWN0b3J5ICppbnN0YW5jZSgpOyAvLy88IGl0IGlzIGEgc2luZ2xldG9uCisJdm9pZCBzaHV0ZG93bigpOworCisJY29uc3QgbW9kX2dzb2FwX2ludGVyZmFjZSAqZ2V0SW50ZXJmYWNlKGNvbnN0IGNoYXIgKnBzekRsbCk7CisgICAgY29uc3QgY2hhciAqZ2V0TGFzdEVycm9yKCk7IC8vLzwgcmV0dXJuIHRoZSBlcnJvciBtZXNzYWdlIGlmIHRoZSBsYXN0IG9wZXJhdGlvbiBmYWlsZWQuCitwcm90ZWN0ZWQ6CisJSVNBUElfU29hcFNlcnZlckZhY3RvcnkoKTsKKwl+SVNBUElfU29hcFNlcnZlckZhY3RvcnkoKTsKKwlib29sIEdldEVudHJ5UG9pbnRzKCk7Citwcm90ZWN0ZWQ6CisJY2xhc3MgRGxsTWFwICptX3BEbGxzOworICAgIHN0ZDo6c3RyaW5nIG1fc3RyRXJyb3I7CisJc3RhdGljIElTQVBJX1NvYXBTZXJ2ZXJGYWN0b3J5ICptX3BJbnN0YW5jZTsKKwlDUklUSUNBTF9TRUNUSU9OIG1fY3M7Cit9OworCisjZW5kaWYgLy8gU29hcFNlcnZlckZhY3RvcnlfSApkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9nc29hcC9jYXNlY21wbGVzcy5oIGIvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9nc29hcC9jYXNlY21wbGVzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNTQ0MDIKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL2dzb2FwL2Nhc2VjbXBsZXNzLmgKQEAgLTAsMCArMSwxOCBAQAorLyoqIEludGVyZmFjZSBmb3IgdGhlIGNhc2VjbXBsZXNzIHN0cnVjdAorICAgIEBmaWxlIGNhc2VjbXBsZXNzLmgKKyAgKi8KKyNpZm5kZWYgQ0FTRUNNUExFU1NfSAorI2RlZmluZSBDQVNFQ01QTEVTU19ICisKKy8qKiBoZWxwZXIgZm9yIGNhc2UtaW5zZW5zaXRpdmUgbGVzczw+IG9wZXJhdG9yIGZvciB0aGUgbWFwPD4gdGVtcGxhdGUuKi8KK3N0cnVjdCBjYXNlY21wbGVzcyB7CisJYm9vbCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6c3RyaW5nICZzMSwgY29uc3Qgc3RkOjpzdHJpbmcgJnMyKSBjb25zdCB7IAorI2lmZGVmIF9XSU4zMgorCQlyZXR1cm4gc3RyaWNtcChzMS5jX3N0cigpLCBzMi5jX3N0cigpKSA8IDA7CisjZWxzZQorCQlyZXR1cm4gc3RyY2FzZWNtcChzMS5jX3N0cigpLCBzMi5jX3N0cigpKSA8IDA7CisjZW5kaWYKKwl9OworfTsKKworI2VuZGlmIC8vQ0FTRUNNUExFU1NfSApkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9nc29hcC9pc2FwaS5jcHAgYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL2dzb2FwL2lzYXBpLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGQ3NGE4Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9nc29hcC9pc2FwaS5jcHAKQEAgLTAsMCArMSwyNCBAQAorLyoqIElTQVBJIGV4dGVuc2lvbiBlbnRyeSBwb2ludHMuCisgICogQGZpbGUgaXNhcGkuY3BwCisgICovCisjaW5jbHVkZSAiSVNBUElfU2VydmVyLmgiCisKKy8qKiBjYWxsZWQgZm9yIGV2ZXJ5IHJlcXVlc3QgdG8gdGhpcyBkbGwgKi8KK0RXT1JEIFdJTkFQSSBIdHRwRXh0ZW5zaW9uUHJvYyhFWFRFTlNJT05fQ09OVFJPTF9CTE9DSyAqcEVDQikgeworICAgIHJldHVybiBJU0FQSV9TZXJ2ZXI6Okh0dHBFeHRlbnNpb25Qcm9jKHBFQ0IpOworfQorLyoqIFRoZSByZXF1aXJlZCBJU0FQSSBFeHRlbnNpb24gRExMIGVudHJ5IHBvaW50LgorICAgIEBwVmVyIHBvaW50cyB0byBleHRlbnNpb24gdmVyc2lvbiBpbmZvIHN0cnVjdHVyZSAKKyAgICBAcmV0dXJuIGFsd2F5cyByZXR1cm5zIFRSVUUKKyAgKi8KK0JPT0wgV0lOQVBJIEdldEV4dGVuc2lvblZlcnNpb24oSFNFX1ZFUlNJT05fSU5GTyAqcFZlcikgeworICAgIC8vIHNldCB2ZXJzaW9uIHRvIGh0dHBleHQuaCB2ZXJzaW9uIGNvbnN0YW50cworICAgIHBWZXItPmR3RXh0ZW5zaW9uVmVyc2lvbiA9IE1BS0VMT05HKEhTRV9WRVJTSU9OX01JTk9SLCBIU0VfVkVSU0lPTl9NQUpPUik7CisgICAgcmV0dXJuIElTQVBJX1NlcnZlcjo6R2V0RXh0ZW5zaW9uVmVyc2lvbihwVmVyKTsKK30gICAgICAgCisvKiogTGFzdCBjYWxsIGZyb20gSUlTIGJlZm9yZSB0aGUgZXh0ZW5zaW9uIGlzIHRlcm1pbmF0ZWQuCisgICovCitCT09MIFdJTkFQSSBUZXJtaW5hdGVFeHRlbnNpb24oRFdPUkQgZHdGbGFncykgeworICAgIHJldHVybiBJU0FQSV9TZXJ2ZXI6OlRlcm1pbmF0ZUV4dGVuc2lvbihkd0ZsYWdzKTsKK30KKwpkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9nc29hcC9pc2FwaS5kZWYgYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL2dzb2FwL2lzYXBpLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTIzZjkyCi0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9nc29hcC9pc2FwaS5kZWYKQEAgLTAsMCArMSw1IEBACis7IGRlY2xhcmUgdGhlIG1vZHVsZSBleHBvcnRzIGZvciB0aGUgSVNBUEkgRExMLgorRVhQT1JUUworCUh0dHBFeHRlbnNpb25Qcm9jCisJR2V0RXh0ZW5zaW9uVmVyc2lvbgorCVRlcm1pbmF0ZUV4dGVuc2lvbgpkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9nc29hcC9pc2FwaS5kc3AgYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL2dzb2FwL2lzYXBpLmRzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGFhYWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9nc29hcC9pc2FwaS5kc3AKQEAgLTAsMCArMSwxNjYgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iaXNhcGkiIC0gUGFja2FnZSBPd25lcj08ND4NCisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyAqKiBOSUNIVCBCRUFSQkVJVEVOICoqDQorDQorIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiIDB4MDEwMg0KKw0KK0NGRz1pc2FwaSAtIFdpbjMyIERlYnVnDQorIU1FU1NBR0UgRGllcyBpc3Qga2VpbiBn/Gx0aWdlcyBNYWtlZmlsZS4gWnVtIEVyc3RlbGxlbiBkaWVzZXMgUHJvamVrdHMgbWl0IE5NQUtFDQorIU1FU1NBR0UgdmVyd2VuZGVuIFNpZSBkZW4gQmVmZWhsICJNYWtlZmlsZSBleHBvcnRpZXJlbiIgdW5kIGb8aHJlbiBTaWUgZGVuIEJlZmVobA0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJpc2FwaS5tYWsiLg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFNpZSBr9m5uZW4gYmVpbSBBdXNm/GhyZW4gdm9uIE5NQUtFIGVpbmUgS29uZmlndXJhdGlvbiBhbmdlYmVuDQorIU1FU1NBR0UgZHVyY2ggRGVmaW5pZXJlbiBkZXMgTWFrcm9zIENGRyBpbiBkZXIgQmVmZWhsc3plaWxlLiBadW0gQmVpc3BpZWw6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgImlzYXBpLm1hayIgQ0ZHPSJpc2FwaSAtIFdpbjMyIERlYnVnIg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIEb8ciBkaWUgS29uZmlndXJhdGlvbiBzdGVoZW4genVyIEF1c3dhaGw6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgImlzYXBpIC0gV2luMzIgUmVsZWFzZSIgKGJhc2llcmVuZCBhdWYgICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpDQorIU1FU1NBR0UgImlzYXBpIC0gV2luMzIgRGVidWciIChiYXNpZXJlbmQgYXVmICAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQ0KKyFNRVNTQUdFIA0KKw0KKyMgQmVnaW4gUHJvamVjdA0KKyMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwDQorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIg0KKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiDQorQ1BQPWNsLmV4ZQ0KK01UTD1taWRsLmV4ZQ0KK1JTQz1yYy5leGUNCisNCishSUYgICIkKENGRykiID09ICJpc2FwaSAtIFdpbjMyIFJlbGVhc2UiDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBPdXRwdXRfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NVCAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL0QgIl9NQkNTIiAvRCAiX1VTUkRMTCIgL0QgIklTQVBJX0VYUE9SVFMiIC9ZWCAvRkQgL2MNCisjIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9EICJfTUJDUyIgL0QgIl9VU1JETEwiIC9EICJJU0FQSV9FWFBPUlRTIiAvRkQgL2MNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMg0KKyMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzINCisjIEFERCBCQVNFIFJTQyAvbCAweDQwNyAvZCAiTkRFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQwNyAvZCAiTkRFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL2RsbCAvbWFjaGluZTpJMzg2DQorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL2RsbCAvbWFjaGluZTpJMzg2IC9vdXQ6Ii4uXG1vZF9nc29hcC5kbGwiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImlzYXBpIC0gV2luMzIgRGVidWciDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIE91dHB1dF9EaXIgIkRlYnVnIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyINCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMA0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTVRkIC9XMyAvR20gL0dYIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9EICJfTUJDUyIgL0QgIl9VU1JETEwiIC9EICJJU0FQSV9FWFBPUlRTIiAvWVggL0ZEIC9HWiAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL0QgIl9NQkNTIiAvRCAiX1VTUkRMTCIgL0QgIklTQVBJX0VYUE9SVFMiIC9GRCAvR1ogL2MNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMg0KKyMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzINCisjIEFERCBCQVNFIFJTQyAvbCAweDQwNyAvZCAiX0RFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQwNyAvZCAiX0RFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0DQorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL2RsbCAvaW5jcmVtZW50YWw6bm8gL21hcCAvZGVidWcgL21hY2hpbmU6STM4NiAvb3V0OiIuLi9EZWJ1Zy9tb2RfZ3NvYXAuZGxsIiAvcGRidHlwZTpzZXB0DQorDQorIUVORElGIA0KKw0KKyMgQmVnaW4gVGFyZ2V0DQorDQorIyBOYW1lICJpc2FwaSAtIFdpbjMyIFJlbGVhc2UiDQorIyBOYW1lICJpc2FwaSAtIFdpbjMyIERlYnVnIg0KKyMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXEh0dHBDb250ZXh0LmNwcA0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5caXNhcGkuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5caXNhcGkuZGVmDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cSVNBUElfSHR0cENvbnRleHQuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cSVNBUElfU2VydmVyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXElTQVBJX1NvYXBTZXJ2ZXJGYWN0b3J5LmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGlzYXBpc3RyZWFtLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxjYXNlY21wbGVzcy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cSHR0cENvbnRleHQuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXElTQVBJX0h0dHBDb250ZXh0LmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxJU0FQSV9TZXJ2ZXIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXElTQVBJX1NvYXBTZXJ2ZXJGYWN0b3J5LmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llxpc2FwaXN0cmVhbS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cb3BzeXNhZGp1c3QuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJSZXNvdXJjZSBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZSINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5caXNhcGlzb2FwLnJjDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgRW5kIFRhcmdldA0KKyMgRW5kIFByb2plY3QNCmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL2dzb2FwL2lzYXBpLmRzdyBiL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvZ3NvYXAvaXNhcGkuZHN3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZjA2NmIKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL2dzb2FwL2lzYXBpLmRzdwpAQCAtMCwwICsxLDI5IEBACitNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBXb3Jrc3BhY2UgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMA0KKyMgV0FSTklORzogRE8gTk9UIEVESVQgT1IgREVMRVRFIFRISVMgV09SS1NQQUNFIEZJTEUhDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK1Byb2plY3Q6ICJpc2FwaSI9Llxpc2FwaS5kc3AgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08ND4NCit7e3sNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorR2xvYmFsOg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08Mz4NCit7e3sNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQpkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9nc29hcC9pc2FwaXNvYXAucmMgYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL2dzb2FwL2lzYXBpc29hcC5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTI0Njk3Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9nc29hcC9pc2FwaXNvYXAucmMKQEAgLTAsMCArMSwxMDkgQEAKKy8vTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gZ2VuZXJhdGVkIHJlc291cmNlIHNjcmlwdC4NCisvLw0KKyNpbmNsdWRlICJyZXNvdXJjZS5oIg0KKw0KKyNkZWZpbmUgQVBTVFVESU9fUkVBRE9OTFlfU1lNQk9MUw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8NCisvLyBHZW5lcmF0ZWQgZnJvbSB0aGUgVEVYVElOQ0xVREUgMiByZXNvdXJjZS4NCisvLw0KKyNpbmNsdWRlICJhZnhyZXMuaCINCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKyN1bmRlZiBBUFNUVURJT19SRUFET05MWV9TWU1CT0xTDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBEZXV0c2NoICjWc3RlcnJlaWNoKSByZXNvdXJjZXMNCisNCisjaWYgIWRlZmluZWQoQUZYX1JFU09VUkNFX0RMTCkgfHwgZGVmaW5lZChBRlhfVEFSR19ERUEpDQorI2lmZGVmIF9XSU4zMg0KK0xBTkdVQUdFIExBTkdfR0VSTUFOLCBTVUJMQU5HX0dFUk1BTl9BVVNUUklBTg0KKyNwcmFnbWEgY29kZV9wYWdlKDEyNTIpDQorI2VuZGlmIC8vX1dJTjMyDQorDQorI2lmbmRlZiBfTUFDDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLw0KKy8vIFZlcnNpb24NCisvLw0KKw0KK1ZTX1ZFUlNJT05fSU5GTyBWRVJTSU9OSU5GTw0KKyBGSUxFVkVSU0lPTiAxLDAsMCwyDQorIFBST0RVQ1RWRVJTSU9OIDEsMCwwLDINCisgRklMRUZMQUdTTUFTSyAweDNmTA0KKyNpZmRlZiBfREVCVUcNCisgRklMRUZMQUdTIDB4MUwNCisjZWxzZQ0KKyBGSUxFRkxBR1MgMHgwTA0KKyNlbmRpZg0KKyBGSUxFT1MgMHg0MDAwNEwNCisgRklMRVRZUEUgMHgyTA0KKyBGSUxFU1VCVFlQRSAweDBMDQorQkVHSU4NCisgICAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIg0KKyAgICBCRUdJTg0KKyAgICAgICAgQkxPQ0sgIjBjMDcwNGIwIg0KKyAgICAgICAgQkVHSU4NCisgICAgICAgICAgICBWQUxVRSAiQ29tbWVudHMiLCAib3BlbiBzb3VyY2UgZ3NvYXAgZGxsIHRvIHJ1biBnc29hcCBzZXJ2ZXJzIHVuZGVyIGlpc1wwIg0KKyAgICAgICAgICAgIFZBTFVFICJDb21wYW55TmFtZSIsICJXZWJXYXJlXDAiDQorICAgICAgICAgICAgVkFMVUUgIkZpbGVEZXNjcmlwdGlvbiIsICJTT0FQIGV4dGVuc2lvbiBmb3IgSW50ZXJuZXQgSW5mb3JtYXRpb24gU2VydmVyXDAiDQorICAgICAgICAgICAgVkFMVUUgIkZpbGVWZXJzaW9uIiwgIjEsIDAsIDAsIDJcMCINCisgICAgICAgICAgICBWQUxVRSAiSW50ZXJuYWxOYW1lIiwgImdzb2FwXDAiDQorICAgICAgICAgICAgVkFMVUUgIkxlZ2FsQ29weXJpZ2h0IiwgIkNvcHlyaWdodCCpIDIwMDEtMjAwMyBBYmVyZ2VyIGh0dHA6Ly93d3cuYWJlcmdlci5hdC9TT0FQXDAiDQorICAgICAgICAgICAgVkFMVUUgIkxlZ2FsVHJhZGVtYXJrcyIsICJcMCINCisgICAgICAgICAgICBWQUxVRSAiT3JpZ2luYWxGaWxlbmFtZSIsICJnc29hcC5kbGxcMCINCisgICAgICAgICAgICBWQUxVRSAiUHJpdmF0ZUJ1aWxkIiwgIlwwIg0KKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0TmFtZSIsICJXZWJXYXJlIFNPQVAgZXh0ZW5zaW9uIGRsbFwwIg0KKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsICIxLCAwLCAwLCAyXDAiDQorICAgICAgICAgICAgVkFMVUUgIlNwZWNpYWxCdWlsZCIsICJcMCINCisgICAgICAgIEVORA0KKyAgICBFTkQNCisgICAgQkxPQ0sgIlZhckZpbGVJbmZvIg0KKyAgICBCRUdJTg0KKyAgICAgICAgVkFMVUUgIlRyYW5zbGF0aW9uIiwgMHhjMDcsIDEyMDANCisgICAgRU5EDQorRU5EDQorDQorI2VuZGlmICAgIC8vICFfTUFDDQorDQorDQorI2lmZGVmIEFQU1RVRElPX0lOVk9LRUQNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vDQorLy8gVEVYVElOQ0xVREUNCisvLw0KKw0KKzEgVEVYVElOQ0xVREUgRElTQ0FSREFCTEUgDQorQkVHSU4NCisgICAgInJlc291cmNlLmhcMCINCitFTkQNCisNCisyIFRFWFRJTkNMVURFIERJU0NBUkRBQkxFIA0KK0JFR0lODQorICAgICIjaW5jbHVkZSAiImFmeHJlcy5oIiJcclxuIg0KKyAgICAiXDAiDQorRU5EDQorDQorMyBURVhUSU5DTFVERSBESVNDQVJEQUJMRSANCitCRUdJTg0KKyAgICAiXHJcbiINCisgICAgIlwwIg0KK0VORA0KKw0KKyNlbmRpZiAgICAvLyBBUFNUVURJT19JTlZPS0VEDQorDQorI2VuZGlmICAgIC8vIERldXRzY2ggKNZzdGVycmVpY2gpIHJlc291cmNlcw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorDQorDQorI2lmbmRlZiBBUFNUVURJT19JTlZPS0VEDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLw0KKy8vIEdlbmVyYXRlZCBmcm9tIHRoZSBURVhUSU5DTFVERSAzIHJlc291cmNlLg0KKy8vDQorDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisjZW5kaWYgICAgLy8gbm90IEFQU1RVRElPX0lOVk9LRUQNCisNCmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL2dzb2FwL2lzYXBpc3RyZWFtLmNwcCBiL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvZ3NvYXAvaXNhcGlzdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNzkyY2IKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL2dzb2FwL2lzYXBpc3RyZWFtLmNwcApAQCAtMCwwICsxLDgwIEBACisvKiogSW1wbGVtZW50YXRpb24gb2YgdGhlIGlzYXBpc3RyZWFtIGNsYXNzLgorICAqIEBmaWxlIGlzYXBpc3RyZWFtLmNwcAorICAqIEBhdXRob3IgQ2hyaXN0aWFuIEFiZXJnZXIgCisgICogQ29weXJpZ2h0IChDKSAyMDAxIFdlYldhcmUgKGh0dHA6Ly93d3cud2Vid2FyZS5hdCkgCisgICovCisjaW5jbHVkZSAiaXNhcGlzdHJlYW0uaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworaXNhcGlzdHJlYW1idWY6OmlzYXBpc3RyZWFtYnVmKEVYVEVOU0lPTl9DT05UUk9MX0JMT0NLICpwRUNCKQorOiBfcEVDQihwRUNCKSAKK3sKKyAgICBzdGF0aWMgY29uc3QgaW50IG5NaW5CdWZTaXplID0gMTAyNDsKKyAgICBhc3NlcnQoTlVMTCAhPSBwRUNCKTsKKyAgICBzZXRwKF9vYnVmLCBfb2J1ZiArIHNpemVvZiBfb2J1Zik7CisKKyAgICBfY2JUb3RhbEJ5dGVzID0gcEVDQi0+Y2JUb3RhbEJ5dGVzOworICAgIF9pYnVmbGVuID0gcEVDQi0+Y2JBdmFpbGFibGUgPiBuTWluQnVmU2l6ZSA/IHBFQ0ItPmNiQXZhaWxhYmxlIDogbk1pbkJ1ZlNpemU7CisgICAgX2lidWYgPSBuZXcgY2hhcltfaWJ1ZmxlbiArIDFdOyAvLyB3ZSBhbGxvY2F0ZSBpdCBvbmUgYnl0ZSBtb3JlLCBhZGRpbmcgYSB0cmFpbGluZyAnXDAnLCB0aGVuIGl0IGlzIGVhc2llciB3aXRoIHN0cmluZ3MKKyAgICBtZW1zZXQoX2lidWYsIDAsIF9pYnVmbGVuICsgMSk7CisgICAgbWVtY3B5KF9pYnVmLCBwRUNCLT5scGJEYXRhLCBwRUNCLT5jYkF2YWlsYWJsZSk7CisgICAgX2NiUmVhZCA9IHBFQ0ItPmNiQXZhaWxhYmxlOworICAgIHNldGcoX2lidWYsIF9pYnVmLCBfaWJ1ZiArIF9jYlJlYWQpOworfQoraXNhcGlzdHJlYW1idWY6On5pc2FwaXN0cmVhbWJ1ZigpIHsKKyAgICBkZWxldGUgX2lidWY7Cit9CitpbnQgaXNhcGlzdHJlYW1idWY6OnN5bmMoKSB7CisJQk9PTCBiV3JpdGUgPSBUUlVFOworCWlmIChOVUxMICE9IF9wRUNCKSB7CisJCURXT1JEIGR3Qnl0ZXNXcml0dGVuID0gcHB0cigpIC0gcGJhc2UoKTsKKwkJaWYgKGR3Qnl0ZXNXcml0dGVuKSB7CisJCQliV3JpdGUgPSBfcEVDQi0+V3JpdGVDbGllbnQoX3BFQ0ItPkNvbm5JRCwgKFBWT0lEKV9vYnVmLCAmZHdCeXRlc1dyaXR0ZW4sIDApOworCQkJc2V0cChfb2J1ZiwgX29idWYgKyBzaXplb2YgX29idWYpOworCQl9CisJfQorCXJldHVybiBiV3JpdGUgPyAwIDogLTE7Cit9CitpbnQgaXNhcGlzdHJlYW1idWY6Om92ZXJmbG93KGludCBjaCkgeworICAgIGlmIChjaGFyX3RyYWl0czxjaGFyPjo6ZW9mKCkgPT0gY2gpIHsKKyAgICAgICAgcmV0dXJuIHN0cmVhbWJ1Zjo6b3ZlcmZsb3coY2gpOworICAgIH0KKyAgICBpZiAocHB0cigpIDwgZXBwdHIoKSkgeworICAgICAgICByZXR1cm4gc3B1dGMoY2gpOworICAgIH0KKyAgICBpbnQgcmV0ID0gc3luYygpOworICAgIGlmICgwID09IHJldCAmJiBjaGFyX3RyYWl0czxjaGFyPjo6ZW9mKCkgIT0gY2gpIHsKKyAgICAgICAgc3B1dGMoY2gpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQoraW50IGlzYXBpc3RyZWFtYnVmOjp1bmRlcmZsb3coKSB7CisgICAgaW50IHJldHZhbCA9IGNoYXJfdHJhaXRzPGNoYXI+Ojplb2YoKTsKKyAgICBpZiAoZ3B0cigpIDwgZWdwdHIoKSkgeworICAgICAgICAvL3JldHZhbCA9IHNuZXh0YygpOworCQlyZXR2YWwgPSBzZ2V0YygpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChfY2JSZWFkIDwgX2NiVG90YWxCeXRlcykgeworICAgICAgICAgICAgbWVtc2V0KF9pYnVmLCAwLCBfaWJ1ZmxlbiArIDEpOworICAgICAgICAgICAgRFdPUkQgZHdMZW4gPSBfaWJ1ZmxlbjsKKyAgICAgICAgICAgIEJPT0wgYlJlYWQgPSAoKl9wRUNCLT5SZWFkQ2xpZW50KShfcEVDQi0+Q29ubklELCBfaWJ1ZiwgJmR3TGVuKTsKKyAgICAgICAgICAgIGlmIChiUmVhZCAmJiBkd0xlbiA+IDApIHsKKyAgICAgICAgICAgICAgICBfY2JSZWFkICs9IGR3TGVuOworICAgICAgICAgICAgICAgIHNldGcoX2lidWYsIF9pYnVmLCBfaWJ1ZiArIGR3TGVuKTsKKyAgICAgICAgICAgICAgICAvL3JldHZhbCA9IHNuZXh0YygpOworCQkJCXJldHZhbCA9IHNnZXRjKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KK2lzYXBpc3RyZWFtOjp+aXNhcGlzdHJlYW0oKSB7Cit9CitFWFRFTlNJT05fQ09OVFJPTF9CTE9DSyAqaXNhcGlzdHJlYW1idWY6OkVDQigpIHsKKyAgICByZXR1cm4gX3BFQ0I7Cit9CitFWFRFTlNJT05fQ09OVFJPTF9CTE9DSyAqaXNhcGlzdHJlYW06OkVDQigpIHsKKyAgICByZXR1cm4gX2J1Zi5FQ0IoKTsKK30KKwpkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9nc29hcC9pc2FwaXN0cmVhbS5oIGIvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9nc29hcC9pc2FwaXN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MmM4NTUKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL2dzb2FwL2lzYXBpc3RyZWFtLmgKQEAgLTAsMCArMSw1OCBAQAorLyoqIEludGVyZmFjZSBmb3IgdGhlIGlzYXBpc3RyZWFtIGNsYXNzCisgICogQGZpbGUgaXNhcGlzdHJlYW0uaAorICAqIEBhdXRob3IgQ2hyaXN0aWFuIEFiZXJnZXIgCisgICogQ29weXJpZ2h0IChDKSAyMDAxIFdlYldhcmUgKGh0dHA6Ly93d3cud2Vid2FyZS5hdCkgCisgICovCisjaWZuZGVmIF9JU0FQSVNUUkVBTV9IXzFEQ0VDQTAyX0UyRjBfMTFkNF84M0FBXzAwQTBDQ0Q0RkY1NworI2RlZmluZSBfSVNBUElTVFJFQU1fSF8xRENFQ0EwMl9FMkYwXzExZDRfODNBQV8wMEEwQ0NENEZGNTcKKworI2luY2x1ZGUgPGh0dHBleHQuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworLyoqIGEgc3RyZWFtYnVmIHdyYXBwZXIgZm9yIHRoZSBJU0FQSS1FeHRlbnNpb24gY29udHJvbCBibG9jay4KKyAqLworY2xhc3MgaXNhcGlzdHJlYW1idWYgOiBwdWJsaWMgc3RkOjpzdHJlYW1idWYgeworcHVibGljOgorICAgIC8qKiBjb25zdHJ1Y3RvciAqLworICAgIGlzYXBpc3RyZWFtYnVmKEVYVEVOU0lPTl9DT05UUk9MX0JMT0NLICpwRUNCKTsKKyAgICAvKiogZGVzdHJ1Y3RvciAqLworICAgIH5pc2FwaXN0cmVhbWJ1ZigpOworCisgICAgRVhURU5TSU9OX0NPTlRST0xfQkxPQ0sgKkVDQigpOworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgaW50IHN5bmMoKTsgLy8vPCBmbHVzaCBjb250ZW50cyB0byBpc2FwaQorICAgIHZpcnR1YWwgaW50IG92ZXJmbG93KGludCBjaCk7IC8vLzwgZmx1c2ggY29udGVudHMgYW5kIHdyaXRlIGNoCisgICAgdmlydHVhbCBpbnQgdW5kZXJmbG93KCk7CisJaW50IHNob3dtYW55YygpIHtyZXR1cm4gX2NiVG90YWxCeXRlcyAtIF9jYlJlYWQ7fQorcHJvdGVjdGVkOgorICAgIEVYVEVOU0lPTl9DT05UUk9MX0JMT0NLICpfcEVDQjsgLy8vPCBzZWUgSVNBUEkgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscworICAgIGNoYXIgX29idWZbMTAyNF07IC8vLzwgb3V0cHV0IGJ1ZmZlcgorICAgIGNoYXIgKl9pYnVmOyAvLy88IGlucHV0IGJ1ZmZlcgorICAgIHVuc2lnbmVkIGludCBfaWJ1ZmxlbjsgLy8vPCBsZW5ndGggb2YgaW5wdXQgYnVmZmVyLgorICAgIHVuc2lnbmVkIGludCBfY2JUb3RhbEJ5dGVzOyAvLy88IHRvdGFsIGlucHV0IGJ5dGVzIGluIHRoZSByZXF1ZXN0LgorICAgIHVuc2lnbmVkIGludCBfY2JSZWFkOyAvLy88IHRvdGFsIGJ5dGVzIHJlYWQgZnJvbSBFQ0IgYWxyZWFkeS4KK307CisKKy8qKiBJU0FQSSBpbnB1dC9vdXRwdXQgc3RyZWFtLgorICAgIEl0IGNhbiBiZSB1c2VkIGFueXdoZXJlIGxpa2UgY291dCBpcyB1c2VkLCB0aGUgb3V0cHV0IGdvZXMgdG8gdGhlIGNsaWVudCBicm93c2VyLgorICovCitjbGFzcyBpc2FwaXN0cmVhbSA6IHB1YmxpYyBzdGQ6Omlvc3RyZWFtIHsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHN0ZDo6aW9zdHJlYW0gc3VwZXI7CisJLyoqIGNvbnN0cnVjdG9yLgorCQlAcGFyYW0gcEVDQiB0aGUgZXh0ZW5zaW9uIGNvbnRyb2wgYmxvY2sgcmVjZWl2ZWQgYXMgYSBwYXJhbWV0ZXIgb2YgSHR0cEV4dGVuc2lvblByb2MgCisJICAqLworICAgIGlzYXBpc3RyZWFtKEVYVEVOU0lPTl9DT05UUk9MX0JMT0NLICpwRUNCKSA6IHN1cGVyKCZfYnVmKSwgX2J1ZihwRUNCKSB7fQorCisJLyoqCWRlc3RydWN0b3IgKi8KKyAgICB2aXJ0dWFsIH5pc2FwaXN0cmVhbSgpOworCisgICAgRVhURU5TSU9OX0NPTlRST0xfQkxPQ0sgKkVDQigpOyAvLy88IEByZXR1cm4gdGhlIEVYVEVOU0lPTl9DT05UUk9MX0JMT0NLIHdyYXBwZWQgYnkgdGhpcworcHJvdGVjdGVkOgorICAgIGlzYXBpc3RyZWFtYnVmIF9idWY7Citwcml2YXRlOgorCWlzYXBpc3RyZWFtKGlzYXBpc3RyZWFtJik7IC8vLzwgbm90IGltcGxlbWVudGVkLgorCWlzYXBpc3RyZWFtJiBvcGVyYXRvcj0oY29uc3QgaXNhcGlzdHJlYW0mKTsgLy8vPCBub3QgaW1wbGVtZW50ZWQuCit9OworCisjZW5kaWYgLy9fSVNBUElTVFJFQU1fSF8xRENFQ0EwMl9FMkYwXzExZDRfODNBQV8wMEEwQ0NENEZGNTcKZGlmZiAtLWdpdCBhL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvZ3NvYXAvb3BzeXNhZGp1c3QuaCBiL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvZ3NvYXAvb3BzeXNhZGp1c3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGFiODRiCi0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9nc29hcC9vcHN5c2FkanVzdC5oCkBAIC0wLDAgKzEsMTUgQEAKKy8qKiB3aW5kb3plIGFkYXB0aW9uIGhlYWRlciBmaWxlLCBiZWNhdXNlIHRoYXQgb25lIGlzIG1pc3NpbmcgcG9zaXguCisgICAgQGZpbGUgb3BzeXNhZGp1c3QuaAorICovCisKKyNpZmRlZiBfV0lOMzIKKworI2lmIF9NU0NfVkVSID4gMTAwMAorICAgICNwcmFnbWEgd2FybmluZyAoZGlzYWJsZTo0Nzg2KQorI2VuZGlmCisvKiogQy1zdGFuZGFyZCBpbnRlcmZhY2UgZm9yIGNhc2UgaW5zZW5zaXRpdmUgY29tcGFyZSAqLworaW5saW5lIGludCBzdHJjYXNlY21wKGNvbnN0IGNoYXIgKnBzejEsIGNvbnN0IGNoYXIgKnBzejIpIHsKKyAgICByZXR1cm4gc3RyaWNtcChwc3oxLCBwc3oyKTsKK30KKworI2VuZGlmIC8vX1dJTjMyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9nc29hcC9yZXNvdXJjZS5oIGIvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9nc29hcC9yZXNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MTVjZjgKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL2dzb2FwL3Jlc291cmNlLmgKQEAgLTAsMCArMSwxNSBAQAorLy97e05PX0RFUEVOREVOQ0lFU319CisvLyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBnZW5lcmF0ZWQgaW5jbHVkZSBmaWxlLgorLy8gVXNlZCBieSBpc2FwaXNvYXAucmMKKy8vCisKKy8vIE5leHQgZGVmYXVsdCB2YWx1ZXMgZm9yIG5ldyBvYmplY3RzCisvLyAKKyNpZmRlZiBBUFNUVURJT19JTlZPS0VECisjaWZuZGVmIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMKKyNkZWZpbmUgX0FQU19ORVhUX1JFU09VUkNFX1ZBTFVFICAgICAgICAxMDEKKyNkZWZpbmUgX0FQU19ORVhUX0NPTU1BTkRfVkFMVUUgICAgICAgICA0MDAwMQorI2RlZmluZSBfQVBTX05FWFRfQ09OVFJPTF9WQUxVRSAgICAgICAgIDEwMDAKKyNkZWZpbmUgX0FQU19ORVhUX1NZTUVEX1ZBTFVFICAgICAgICAgICAxMDEKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL2lpc19pbmRleC5odG1sIGIvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9paXNfaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTE3NmU2Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9paXNfaW5kZXguaHRtbApAQCAtMCwwICsxLDIyOSBAQAorPGh0bWw+DQorDQorPGhlYWQ+DQorPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciPg0KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+DQorPHRpdGxlPlNPQVAgSVNBUEkgZXh0ZW5zaW9uPC90aXRsZT4NCis8L2hlYWQ+DQorDQorPGJvZHk+DQorDQorPGgxIGFsaWduPSJjZW50ZXIiPjxmb250IGZhY2U9IlZlcmRhbmEiPm1vZF9nc29hcCBJU0FQSSBFeHRlbnNpb248L2ZvbnQ+PC9oMT4NCis8cD48Zm9udCBmYWNlPSJWZXJkYW5hIj48YSBocmVmPSJodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcC5odG1sIj5nc29hcDwvYT4NCitpcyBhbiBvcGVuIHNvdXJjZSBwcm9qZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgPC9mb250Pjxmb250IGZhY2U9IlZlcmRhbmEiPiA8Yj5TPC9iPmltcGxlIDxiPk88L2I+YmplY3QgPGI+QTwvYj5jY2VzcyA8Yj5QPC9iPnJvdG9jb2wNCisoPGEgaHJlZj0iaHR0cDovL3d3dy53M2Mub3JnL1RSL1NPQVAiPlNPQVA8L2E+KSBjbGllbnRzIGFuZCBzZXJ2ZXJzLiA8YSBocmVmPSJodHRwOi8vd3d3LmFiZXJnZXIuYXQvU09BUCI+IG1vZF9nc29hcDwvYT4NCithbGxvd3MgeW91IHRvIHJ1biB0aGVzZSBzZXJ2aWNlcyBpbnRlZ3JhdGVkIGluIHByb2Nlc3MgaW5zaWRlIHRoZSBNaWNyb3NvZnQgSW50ZXJuZXQNCitJbmZvcm1hdGlvbiBzZXJ2ZXIuJm5ic3A7SXQgaXMgaW1wbGVtZW50ZWQgYXMgYW4gSVNBUEkgZXh0ZW5zaW9uIGRsbCBhbmQgc28gY2FuDQorYmUgcnVuIHRvZ2V0aGVyIHdpdGggYWxsIG90aGVyIHNlcnZpY2VzIG9uIElJUy48L2ZvbnQ+PC9wPg0KKzxoMj48Zm9udCBmYWNlPSJWZXJkYW5hIj5PdmVydmlldzwvZm9udD48L2gyPg0KKzxwIGFsaWduPSJsZWZ0Ij48Zm9udCBmYWNlPSJWZXJkYW5hIj5UaGVyZSBpcyBhbiBvcGVuIHNvdXJjZSBwcm9qZWN0IGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9zb2FwLmh0bWwiPmh0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9zb2FwLmh0bWw8L2E+DQorIHdoaWNoIGltcGxlbWVudHMgU09BUCBpbiBDKysuIFNlcnZlcnMgY3JlYXRlZCB0aGVyZSBjYW4gYmUgcnVuIHN0YW5kYWxvbmUgb3IgYXMNCitjZ2kuIFRoaXMgaXMgYSBjb250cmlidXRpb24gdG8gZ2V0IGEgcHJvZHVjdGlvbiBxdWFsaXR5IFdlYiBzZXJ2aWNlIGZvciBNUy1JbnRlcm5ldCBJbmZvcm1hdGlvbg0KK1NlcnZlciB0aGF0IGRyaXZlcyBTT0FQIHNlcnZlcnMuIEFsbCB0aGUgc291cmNlIGNvZGUgYW5kDQorZG9jdW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgZm9yIGRvd25sb2FkLjwvZm9udD48L3A+DQorPHAgYWxpZ249ImxlZnQiPjxmb250IGZhY2U9IlZlcmRhbmEiPkV4aXN0aW5nIGdzb2FwIHNlcnZlcnMgY2FuIGJlIGNvbXBpbGVkIDx1PndpdGhvdXQNCithbnkgY2hhbmdlPC91PiBpbiB0aGUgc291cmNlIGNvZGUgdG8gcnVuIGluc2lkZSBJSVMuIFRoZXJlIGlzIG9uZSBkbGwsIG1vZF9nc29hcC5kbGwsIGFuIElzYXBpIGV4dGVuc2lvbiB0aGF0IHNlcnZlcyBTT0FQDQorcmVxdWVzdHMuIEZyb20gdGhlIHF1ZXJ5IHN0cmluZyBpbiB0aGUgcmVxdWVzdCB0aGUgZXh0ZW5zaW9uIGZpbmRzIG91dCB3aGljaCBzZXJ2ZXIgc2hvdWxkIGJlIHVzZWQNCithbmQgdGhlIGFwcHJvcHJpYXRlIHNlcnZlciBkbGwgKGR5bmFtaWMgbGluayBsaWJyYXJ5KSBpcyBkeW5hbWljYWxseSBsb2FkZWQgYXQNCitydW50aW1lLCBpZiBub3QgYWxyZWFkeSBwcmVzZW50LiBUaGlzIFNPQVAgc2VydmVyIGNyZWF0ZXMgdGhlIHJlc3BvbnNlIHdoaWNoIGlzDQorc2VudCBiYWNrIHRvIHRoZSBjbGllbnQgYnkgSUlTLjwvZm9udD48L3A+DQorPHAgYWxpZ249ImxlZnQiPjxmb250IGZhY2U9IlZlcmRhbmEiPlRvIGFkZCBtb3JlIHNlcnZlcnMgb25seSB0aGUgbmV3IGRsbHMgbmVlZA0KK3RvIGJlIGNvbXBpbGVkLCB0aGUgSVNBUEkgaW50ZXJmYWNlIG5lZWQgbm90IGJlIGNoYW5nZWQgZm9yIHRoYXQsIHRoZSBXZWINCitTZXJ2aWNlIG5vdCBldmVuIHJlc3RhcnRlZC4mbmJzcDs8L2ZvbnQ+PC9wPg0KKzxwIGFsaWduPSJsZWZ0Ij48Zm9udCBmYWNlPSJWZXJkYW5hIj5UaGlzIGRpc3RyaWJ1dGlvbiBjb250YWlucyBhbHNvIHRoZQ0KK3N0YW5kYXJkIGdzb2FwIGNhbGMuaCAtIHNlcnZlciB0byBkZW1vbnN0cmF0ZSBvcGVyYXRpb24uJm5ic3A7VGhlIHNvdXJjZSBjb2RlIG9mDQordGhhdCBleGFtcGxlIHdhcyBub3QgY2hhbmdlZCBmcm9tIHRoZSBzdGFuZGFyZCBkaXN0cmlidXRpb24uPC9mb250PjwvcD4NCis8cCBhbGlnbj0ibGVmdCI+PGZvbnQgZmFjZT0iVmVyZGFuYSI+T25jZSB5b3VyIGdzb2FwIHNlcnZpY2Ugd29ya3MgYXMgYQ0KK3N0YW5kYWxvbmUgYXBwbGljYXRpb24sIHlvdSBvbmx5IG5lZWQgdG8gcmVjb21waWxlIGl0IGFzIGEgZGxsIGFuZCBjb3B5IHRoYXQgZGxsDQordG8geW91ciBJSVMgLSB2aXJ0dWFsIGRpcmVjdG9yeS4mbmJzcDs8L2ZvbnQ+PC9wPg0KKzxwIGFsaWduPSJsZWZ0Ij48Zm9udCBmYWNlPSJWZXJkYW5hIj4gSW4gc3BpdGUgb2YgdGhhdCBpbnN0cnVjdGlvbnMgY2FuIGJlIGZvdW5kDQorPGEgaHJlZj0iI2lpc2RlYnVnIj4gYmVsb3c8L2E+IGZvciBkZWJ1Z2dpbmcgdGhlIElJUyBleHRlbnNpb24gdW5kZXIgV2luZG93c5kgMjAwMCBhbmQgWFAuJm5ic3A7PC9mb250PjwvcD4NCis8aDI+PGZvbnQgZmFjZT0iVmVyZGFuYSI+UmVxdWlyZW1lbnRzJm5ic3A7PC9mb250PjwvaDI+DQorPHA+PGZvbnQgZmFjZT0iVmVyZGFuYSI+VG8gYnVpbGQgdGhlIG1vZF9nc29hcCBJU0FQSSBleHRlbnNpb24gZm9yIFdpbmRvd3MgeW91IG5lZWQgdGhlIGZvbGxvd2luZzo8L2ZvbnQ+PC9wPg0KKzx1bD4NCisgIDxsaT48Zm9udCBmYWNlPSJWZXJkYW5hIj5nc29hcCAyLjMuOCBvciBoaWdoZXIgZnJvbSA8L2ZvbnQ+DQorICAgIDxmb250IGZhY2U9IlZlcmRhbmEiPjxhIGhyZWY9Imh0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9zb2FwLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5nc29hcDwvYT4NCisgPC9mb250Pg0KKyAgPGxpPjxmb250IGZhY2U9IlZlcmRhbmEiPm1vZF9nc29hcF93aW5fMF8wXzIuemlwIGZyb20gPGEgaHJlZj0iaHR0cDovL3d3dy5hYmVyZ2VyLmF0L1NPQVAvbW9kX2dzb2FwX3dpbl8wXzBfMi56aXAiPmh0dHA6Ly93d3cuYWJlcmdlci5hdC9TT0FQL21vZF9nc29hcF93aW5fMF8wXzIuemlwPC9hPjwvZm9udD4NCis8L3VsPg0KKzxwPjxmb250IGZhY2U9IlZlcmRhbmEiPlRvIHJ1biBtb2RfZ3NvYXAgSVNBUEkgZXh0ZW5zaW9uIHlvdSBuZWVkIGVpdGhlciBXaW5kb3dzmSBOVA0KKzQuMCB3aXRoIFdpbmRvd3OZIE5UIE9wdGlvbiBQYWNrIDQuMCwgV2luZG93c5kgMjAwMCBvciBXaW5kb3dzIFhQIG9yIGhpZ2hlciwgd2hlcmUgSUlTmSBpcw0KK2ludGVncmF0ZWQuPC9mb250PjwvcD4NCis8aDI+PGZvbnQgZmFjZT0iVmVyZGFuYSI+SW5zdGFsbGF0aW9uIGFuZCB0ZXN0aW5nJm5ic3A7PC9mb250PjwvaDI+DQorPGgzPjxmb250IGZhY2U9IlZlcmRhbmEiPlVucGFjayBhbmQvb3IgY29tcGlsZSB0aGUgbW9kX2dzb2FwLmRsbCBJU0FQSSBleHRlbnNpb248L2ZvbnQ+PC9oMz4NCis8dWw+DQorICA8bGk+PGZvbnQgZmFjZT0iVmVyZGFuYSI+VW5wYWNrIHRoZSBtb2RfZ3NvYXBfd2luXyouemlwIHBhY2thZ2UuPC9mb250PjwvbGk+DQorICA8bGk+PGZvbnQgZmFjZT0iVmVyZGFuYSI+TWFrZSBzdXJlIHRoYXQgZ3NvYXAgMi4xLjggb3IgaGlnaGVyIGlzIHVucGFja2VkIG9uDQorICAgIHlvdXIgY29tcHV0ZXIuPC9mb250PjwvbGk+DQorICA8bGk+PGZvbnQgZmFjZT0iVmVyZGFuYSI+VGhlIHBhY2thZ2UgYWxyZWFkeSBjb250YWlucyB0aGUgY29tcGlsZWQNCisgICAgbW9kX2dzb2FwLmRsbCwgc28gaWYgeW91IGRvbid0IHdhbnQgdG8gY29tcGlsZSBpdCB5b3Vyc2VsZiB5b3UgY2FuIHNraXAgdGhlIG5leHQgZmV3DQorICAgIGxpbmVzIGFuZCBjb250aW51ZSB3aXRoIDxhIGhyZWY9IiNpaXNpbnN0YWxsIj5pbnN0YWxsYXRpb248L2E+LjwvZm9udD48L2xpPg0KKyAgPGxpPjxmb250IGZhY2U9IlZlcmRhbmEiPk9wZW4gVmlzdWFsIFN0dWRpbyBDKysgNi4wPC9mb250PjwvbGk+DQorICA8bGk+PGZvbnQgZmFjZT0iVmVyZGFuYSI+R28gdG8gJnF1b3Q7VG9vbHN8T3B0aW9ucyZxdW90Oy4gQWN0aXZhdGUgdGhlDQorICAgICZxdW90O0RpcmVjdG9yaWVzJnF1b3Q7IFBhbmVsLiZuYnNwOzwvZm9udD48L2xpPg0KKyAgPGxpPjxmb250IGZhY2U9IlZlcmRhbmEiPlNlbGVjdCZuYnNwOyAmcXVvdDtJbmNsdWRlIEZpbGVzJnF1b3Q7IGZyb20gdGhlDQorICAgIGRyb3Bkb3duIGFuZCBhZGQgeW91ciBzb2FwY3BwIGRpcmVjdG9yeSAodGhlIG9uZSB3aGVyZSB5b3UgaGF2ZSB1bm9hY2tlZA0KKyAgICBzb2FwIDIuMTggb3IgaGlnaGVyKS4gVGhpcyB3aWxsIGxldCB0aGUgY29tcGlsZXIgZmluZCBzdGRzb2FwMi5IPC9mb250PjwvbGk+DQorICA8bGk+PGZvbnQgZmFjZT0iVmVyZGFuYSI+U2VsZWN0ICZxdW90O0V4ZWN1dGFibGUgUGF0aCZxdW90OyBhbmQgYWRkIHRoZSBzYW1lDQorICAgIGRpcmVjdG9yeSBhbHNvIHRoZXJlLiBUaGlzIHdpbGwgbGV0IFZpc3VhbCBTdHVkaW8gZmluZCBzb2FwY3BwMi5leGU8L2ZvbnQ+PC9saT4NCisgIDxsaT48Zm9udCBmYWNlPSJWZXJkYW5hIj5PcGVuIGFsbDRpaXMuZHN3PC9mb250PjwvbGk+DQorICA8bGk+PGZvbnQgZmFjZT0iVmVyZGFuYSI+QWN0aXZhdGUgdGhlICZxdW90O2FsbDRpaXMmcXVvdDsgcHJvamVjdCBhbmQgYnVpbGQNCisgICAgYWxsLjwvZm9udD48L2xpPg0KKzwvdWw+DQorPGgzPjxhIG5hbWU9Imlpc2luc3RhbGwiPjxmb250IGZhY2U9IlZlcmRhbmEiPkluc3RhbGxhdGlvbiBvZiBtb2RfZ3NvYXAuZGxsIElTQVBJIGV4dGVuc2lvbg0KK29uIHlvdXIgSUlTIFNlcnZlcjwvZm9udD48L2E+PC9oMz4NCis8dWw+DQorICA8bGk+PGZvbnQgZmFjZT0iVmVyZGFuYSI+QWRkIGEgZ3NvYXAgZm9sZGVyIHRvIHlvdXIgd3d3cm9vdCBkaXJlY3RvcnkgKGUuZy4NCisgICAgQzpcSW5ldHB1Ylx3d3dyb290XGdzb2FwKTwvZm9udD48L2xpPg0KKyAgPGxpPjxmb250IGZhY2U9IlZlcmRhbmEiPk9wZW4gSW50ZXJuZXQgU2VydmljZSBNYW5hZ2VyIGZyb20gQ29udHJvbA0KKyAgICBQYW5lbC0mZ3Q7QWRtaW5pc3RyYXRpdmUgdG9vbHMuJm5ic3A7PC9mb250PjwvbGk+DQorICA8bGk+PGZvbnQgZmFjZT0iVmVyZGFuYSI+Q3JlYXRlIGluIEludGVybmV0IFNlcnZpY2UgTWFuYWdlciBhIG5ldyB2aXJ0dWFsDQorICAgIGRpcmVjdG9yeSBjYWxsZWQgJnF1b3Q7Z3NvYXAmcXVvdDsgKGRldGFpbHMgPGEgaHJlZj0iI3Zyb290Ij5oZXJlPC9hPiBhbmQNCisgICAgYWxzbyBvbiB0aGUgPGEgaHJlZj0iaW1hZ2VzL2dzb2FwdmRpci5wbmciPlNjcmVlbiBTbmFwc2hvdDwvYT4pLjwvZm9udD48L2xpPg0KKyAgPGxpPjxmb250IGZhY2U9IlZlcmRhbmEiPkNvcHkgbW9kX2dzb2FwLmRsbCBhbmQgY2FsYy5kbGwgdG8gdGhlIGNyZWF0ZWQgZ3NvYXANCisgICAgZm9sZGVyIChDOlxJbmV0cHViXHd3d3Jvb3RcZ3NvYXApPC9mb250PjwvbGk+DQorICA8bGk+PGZvbnQgZmFjZT0iVmVyZGFuYSI+U3RhcnQgdGhlICZxdW90O1dvcmxkIFdpZGUgV2ViIFB1Ymxpc2hpbmcNCisgICAgU2VydmljZSZxdW90OzwvZm9udD48L2xpPg0KKyAgPGxpPjxmb250IGZhY2U9IlZlcmRhbmEiPkVudGVyIGluIHlvdXIgYnJvd3NlciAmcXVvdDs8YSBocmVmPSJodHRwOi8vbG9jYWxob3N0L2dzb2FwL21vZF9nc29hcC5kbGwiPmh0dHA6Ly9sb2NhbGhvc3QvZ3NvYXAvbW9kX2dzb2FwLmRsbDwvYT4mcXVvdDsuDQorICAgIFRoaXMgc2hvdWxkIGdpdmUgYSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIgdGhhdCBleHBsYWlucyB3aGF0IHRoZSBjb3JyZWN0IHVybCBpcy4gSWYgc28gdGhpcyBwcm92ZXMgdGhhdCBtb2RfZ3NvYXAuZGxsIGlzIGNvbmZpZ3VyZWQgY29ycmVjdGx5LjwvZm9udD48L2xpPg0KKyAgPGxpPjxmb250IGZhY2U9IlZlcmRhbmEiPk5leHQgZW50ZXIgaW4geW91ciBicm93c2VyICZxdW90OzxhIGhyZWY9Imh0dHA6Ly9sb2NhbGhvc3QvZ3NvYXAvbW9kX2dzb2FwLmRsbD9jYWxjIj5odHRwOi8vbG9jYWxob3N0L2dzb2FwL21vZF9nc29hcC5kbGw/Y2FsYzwvYT4mcXVvdDsuDQorICAgIFRoaXMgc2hvdWxkIGdpdmUgYSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIgdGhhdCB5b3Ugc2hvdWxkIHVzZSBhIFBPU1QNCisgICAgY29tbWFuZCwgbm90IGEgR0VULiBUaGlzIHByb3ZlcyB0aGF0IG1vZF9nc29hcCBjb3VsZCBsb2FkIHlvdXIgc2VydmVyIGRsbC4gU28gaW4gcHJpbmNpcGxlIHlvdXIgaW5zdGFsbGF0aW9uIHNlZW1zIHRvIGJlIE9LIG5vdy48L2ZvbnQ+PC9saT4NCisgIDxsaT48Zm9udCBmYWNlPSJWZXJkYW5hIj5DaGVjayB0aGUgZmlsZSAuXGlzYXBpXHNhbXBsZXNcY2FsY1xjYWxjY2xudC5jDQorICAgIFRoZSBVUkwgdGhlcmUgbXVzdCBjb3Jyc3BvbmQgdG8geW91ciBpbnN0YWxsYXRpb24uIENoZWNrIHRoZSBsaW5lOjxicj4NCisgICAgPC9mb250Pjxmb250IGZhY2U9IkNvdXJpZXIiPmNvbnN0IGNoYXIgc2VydmVyW10gPSAmcXVvdDs8Zm9udCBjb2xvcj0iI0ZGMDAwMCI+aHR0cDovL2xvY2FsaG9zdC8vZ3NvYXAvbW9kX2dzb2FwLmRsbD9jYWxjPC9mb250PiZxdW90Ozs8L2ZvbnQ+PC9saT4NCisgIDxsaT48Zm9udCBmYWNlPSJWZXJkYW5hIj5PcGVuIGEgRE9TIC0gY29tbWFuZCB3aW5kb3cgYW5kIGNoYW5nZSB0byB0aGUNCisgICAgZGlyZWN0b3J5IHdoZXJlIGNhbGNjbG50LmV4ZSBoYXMgYmVlbiBidWlsZCB3aXRoaW4gdGhlIGFsbDRpaXMgcHJvamVjdC4NCisgICAgRW50ZXIgJnF1b3Q7Y2FsY2NsbnQgYWRkIDMgNSZxdW90Oy48L2ZvbnQ+PC9saT4NCisgIDxsaT48Zm9udCBmYWNlPSJWZXJkYW5hIj5DaGVjayB0aGF0IHRoZSByZXNwb25zZSBpczoNCisgICAgJnF1b3Q7cmVzdWx0PTgmcXVvdDsuIElmIHNvOiBEb25lISZuYnNwOzwvZm9udD48L2xpPg0KKyAgPGxpPjxmb250IGZhY2U9IlZlcmRhbmEiPklmIG5vdCBzbyBwbGVhc2UgcmVhZCB0aGUgPGEgaHJlZj0iI0ZBUSI+RkFRPC9hPi4mbmJzcDs8L2ZvbnQ+PC9saT4NCis8L3VsPg0KKzxwPlRoZXJlIGlzIGFsc28gYSBkaW1lIHNhbXBsZSBpbiB0aGUgY29kZSB0aGF0IHNob3dzIHlvdSBob3cgdG8gc2VuZCBhbmQgcmVjZWl2ZSBkaW1lIGF0dGFjaG1lbnRzIChiaW5hcnkgZmlsZXMgZXRjKS4gDQorVGhpcyBzYW1wbGUgYWxzbyBzaG93cyBob3cgdG8gdXNlIG1vZHVsZSBpbml0aWFsaXplciBhbmQgdGVybWluYXRvcnMuIFdoZW4gdGhlIGRsbCBpcyBsb2FkZWQgaW50byBJSVMgZm9yIHRoZSBmaXJzdCB0aW1lIHRoZSBmdW5jdGlvbiBtb2RfZ3NvYXBfaW5pdCBpcyBjYWxsZWQuIA0KK0hlcmUgeW91IGNhbiBpbml0aWFsaXplIGRhdGFiYXNlIGNvbm5lY3Rpb25zIG9yIHdoYXRldmVyIHlvdSBsaWtlLiBtb2RfZ3NvYXBfdGVybWluYXRlIGlzIGNhbGxlZCB3aGVuIHRoZSBkbGwgaXMgdW5sb2FkZWQgYWdhaW4uIEEgZ29vZCBwbGFjZSB0byBjbGVhbiB1cC48L3A+DQorPGgyPjxmb250IGZhY2U9IlZlcmRhbmEiPkNvbXBpbGluZyB5b3VyIG93biBnc29hcCAtIFNlcnZlcnMgZm9yIHVzZSB3aXRoDQorbW9kX2dzb2FwPC9mb250PjwvaDI+DQorPHVsPg0KKyAgPGxpPjxmb250IGZhY2U9IlZlcmRhbmEiPkJ1aWxkIGFuZCB0ZXN0IHlvdXIgc3RhbmRhbG9uZSBnc29hcCBzZXJ2ZXIgYXMNCisgICAgZG9jdW1lbnRlZCBpbiA8L2ZvbnQ+PGZvbnQgZmFjZT0iVmVyZGFuYSI+PGEgaHJlZj0iaHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL3NvYXAuaHRtbCI+Z3NvYXA8L2E+LiZuYnNwOyA8L2ZvbnQ+PC9saT4NCisgIDxsaT48Zm9udCBmYWNlPSJWZXJkYW5hIj5NYWtlIHN1cmUgdGhhdCB5b3VyIFZpc3VhbCBTdHVkaW8gaW5jbHVkZSBhbmQNCisgICAgZXhlY3V0YWJsZSBwYXRocyBpcyBjb3JyZWN0IGFzIGRlc2NyaWJlZCBhYm92ZS48L2ZvbnQ+PC9saT4NCisgIDxsaT48Zm9udCBmYWNlPSJWZXJkYW5hIj5JbiBWaXN1YWwgU3R1ZGlvIEMrKyA2LjAgc2VsZWN0ICZxdW90O0ZpbGV8TmV3JnF1b3Q7Lg0KKyAgICBDcmVhdGUgYSBuZXcgZW1wdHkgV2luMzIgLSBEeW5hbWljIExpbmsgTGlicmFyeS48L2ZvbnQ+PC9saT4NCisgIDxsaT48Zm9udCBmYWNlPSJWZXJkYW5hIj5Db3B5IDxhIG5hbWU9InN0ZHNvYXAyLmRlZiI+IHN0ZHNvYXAyLmRlZjwvYT4gZnJvbSB0aGUgLlxpc2FwaVxzYW1wbGVzXGNhbGMgZXhhbXBsZSB0byB5b3VyDQorICAgIHByb2plY3QgZGlyZWN0b3J5IGFuZCBhZGQgaXQgdG8gdGhlIHByb2plY3QuIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCB0aGUNCisgICAgcmVxdWlyZWQgZnVuY3Rpb25zIChzb2FwX2luaXQsIHNvYXBfc2VydmUgZXRjKSBhcmUgZXhwb3J0ZWQgZnJvbSB0aGUgZGxsLjwvZm9udD48L2xpPg0KKyAgPGxpPjxmb250IGZhY2U9IlZlcmRhbmEiPkNvbXBpbGUgaXQ8L2ZvbnQ+PC9saT4NCisgIDxsaT48Zm9udCBmYWNlPSJWZXJkYW5hIj5Db3B5IGl0IHRvIHRoZSAuLi53d3dyb290L2dzb2FwIGRpcmVjdG9yeSBkZXNjcmliZWQNCisgICAgYWJvdmUuJm5ic3A7PC9mb250PjwvbGk+DQorICA8bGk+PGZvbnQgZmFjZT0iVmVyZGFuYSI+RG9uZSE8L2ZvbnQ+PC9saT4NCis8L3VsPg0KKzxwPjxmb250IGZhY2U9IlZlcmRhbmEiPlRoZSA8YSBocmVmPSIjdXJsY29uc3RydWN0aW9uIj5VUkw8L2E+IGZvciB0aGUgbmV3DQorc2VydmVycyBpcyBhbHdheXMgJnF1b3Q7PGEgaHJlZj0iaHR0cDovL2xvY2FsaG9zdC8vZ3NvYXAvbW9kX2dzb2FwLmRsbD9teWRsbCI+PC9hPjwvZm9udD48Zm9udCBjb2xvcj0iI0ZGMDAwMCIgZmFjZT0iQ291cmllciI+PGEgaHJlZj0iaHR0cDovL2xvY2FsaG9zdC8vZ3NvYXAvbW9kX2dzb2FwLmRsbD9teWRsbCI+aHR0cDovL2xvY2FsaG9zdC9nc29hcC9tb2RfZ3NvYXAuZGxsP215ZGxsPC9hPiZxdW90Ow0KKzwvZm9udD48Zm9udCBmYWNlPSJWZXJkYW5hIj53aGVyZSBteWRsbCBpcyB0aGUgbmFtZSBvZiBvdXIgZGxsIDx1PndpdGhvdXQ8L3U+DQordGhlIC5kbGwgZXh0ZW5zaW9uLjwvZm9udD48L3A+DQorPGg0Pjxmb250IGZhY2U9IlZlcmRhbmEiPjxhIG5hbWU9InZyb290Ij5EZXRhaWxzIGZvciBjcmVhdGluZyB0aGUgdmlydHVhbCByb290PC9hPjwvZm9udD48L2g0Pg0KKzxwPjxmb250IGZhY2U9IlZlcmRhbmEiPklmIHlvdSBoYXZlIHByb2JsZW1zIGNyZWF0aW5nIHRoZSB2aXJ0dWFsIHJvb3QgYXMNCitkZXNjaWJlZCBhYm92ZSBoZXJlIGEgc2hvcnQgaG93LXRvOiBPcGVuIGZyb20gY29udHJvbCBwYW5lbCAmcXVvdDtBZG1pbmlzdHJhdGl2ZSBUb29scyZxdW90Ow0KK2FuZCB0aGVuICZxdW90O0ludGVybmV0IFNlcnZpY2VzIE1hbmFnZXImcXVvdDsgKHVuZGVyIFdpbmRvd3OZIE5UIDQuMCB5b3UgZmluZCBpdA0KK2luIHRoZSBPcHRpb24gUGFjayBzdWJtZW51cykuIENsaWNrIHdpdGggdGhlIHJpZ2h0IG1vdXNlIGJ1dHRvbiBvbiAmcXVvdDtEZWZhdWx0DQorV2ViIFNpdGUmcXVvdDssIHRoZW4gc2VsZWN0ICZxdW90O05ldyZxdW90OyBhbmQgJnF1b3Q7VmlydHVhbCBEaXJlY3RvcnkmcXVvdDsuDQorQ2xpY2sgJnF1b3Q7TmV4dCZxdW90OyBhbmQgZW50ZXIgYXMgQWxpYXMgdGhlIG5hbWUgeW91IHdhbnQgdG8gZ2l2ZSB0byB0aGUgdXJsLA0KK2UuZy4gJnF1b3Q7c29hcCZxdW90OywgcHJlc3MgJnF1b3Q7TmV4dCZxdW90OyBhZ2Fpbi4gVGhlbiBicm93c2UgZm9yIHRoZQ0KK2RpcmVjdG9yeSB3aGVyZSB5b3VyIGRsbCB0aGF0IHlvdSBoYXZlIGJ1aWx0IGluIHRoZSBwcmV2aW91cyBzdGVwIGlzLCBmb3INCitleGFtcGxlICZxdW90O2M6XEluZXRwdWJcd3d3cm9vdFxnc29hcCZxdW90Oy4gUHJlc3MNCismcXVvdDtOZXh0JnF1b3Q7LCB0aGVuIGluIHRoZSBhY2Nlc3MgcGVybWlzc2lvbnMsIGRpc2FibGUgYWxsIHBlcm1pc3Npb25zIGV4Y2VwdA0KKyZxdW90O0V4Y3V0ZSAoc3VjaCBhcyBJU0FQSSBhcHBsaWNhdGlvbnMgb3IgQ0dJKSZxdW90OywgdGhpcyBtdXN0IGJlIGVuYWJsZWQuDQorQ2xpY2sgJnF1b3Q7TmV4dCZxdW90OyBhbmQgJnF1b3Q7RmluaXNoJnF1b3Q7LiBGb3IgdGVzdGluZyBpdCBtaWdodCBiZSBhIGdvb2QNCitpZGVhIHRvIGVuYWJsZSB0aGUgJnF1b3Q7QnJvd3NlJnF1b3Q7IHBlcm1pc3Npb24gYW5kIHRoZW4gYnJvd3NlIHRvDQorJnF1b3Q7aHR0cDovL2xvY2FsaG9zdC9nc29hcCZxdW90Oy4mbmJzcDsmbmJzcDs8L2ZvbnQ+PC9wPg0KKzxoMz48Zm9udCBmYWNlPSJWZXJkYW5hIj48YSBuYW1lPSJ1cmxjb25zdHJ1Y3Rpb24iPkhvdyB0aGUgdXJsIG9mIHRoZSByZXF1ZXN0IGlzIGNvbnN0cnVjdGVkPC9hPjwvZm9udD48L2gzPg0KKzxwPjxmb250IGZhY2U9IlZlcmRhbmEiPlRoZSBJU0FQSSBTT0FQIEJpbmRpbmcgY2FuIHJ1biB0b2dldGhlciB3aXRoIGFsbCBvdGhlcg0KK0ludGVybmV0IHNlcnZpY2VzIG9uIHlvdXIgbWFjaGluZSBvbiBwb3J0IDgwIChvciBhbnkgb3RoZXIsIGFzIGNvbmZpZ3VyZWQgaW4NCitJSVMpLiBJdCBpcyBhbiBleHRlbnNpb24gZm9yIElJUy4gVGhlIHJlcXVlc3QgeW91ciBTT0FQIGNsaWVudCBtdXN0IHN1Ym1pdCBpcw0KK21hZGUgdXAgb2YgMiBwYXJ0cy4gSGVyZSBpcyBhbiBleGFtcGxlOjwvZm9udD48L3A+DQorPHA+PGZvbnQgZmFjZT0iQ291cmllciBOZXciPiAmcXVvdDtodHRwOi8vMTI3LjAuMC4xL2dzb2FwL21vZF9nc29hcC5kbGw/bXlTb2FwJnF1b3Q7PC9mb250Pjxmb250IGZhY2U9IlZlcmRhbmEiPiZuYnNwOzwvZm9udD48L3A+DQorPHA+PGZvbnQgZmFjZT0iVmVyZGFuYSI+VGhlIHBhcnQgYmVmb3JlIHRoZSBxdWVzdGlvbiBtYXJrICc/JyBpcyB0aGUgdXJsIGZvciB0aGUNCitpc2FwaSBiaW5kaW5nIGRsbC4gVGhpcyBpcyBldmFsdWF0ZWQgYnkgSUlTLiBJbiB0aGlzIHNhbXBsZSB0aGUgc2VydmljZSBpcyBvbg0KK3RoZSBzYW1lIG1hY2hpbmUgYXMgdGhlIHNlcnZlci4gSW5zdGVhZCBvZiAmcXVvdDsxMjcuMC4wLjEmcXVvdDsgeW91IGNhbiB1c2UgdGhlDQorRE5TIGFkZHJlc3Mgb2YgeW91ciBzZXJ2ZXIsIG9mIGNvdXJzZS4gZ3NvYXAgaXMgdGhlIHZpcnR1YWwgcm9vdCBjcmVhdGVkIGFib3ZlDQorYW5kIG1vZF9nc29hcC5kbGwgaXMgdGhlIGdlbmVyaWMgSVNBUEkgYmluZGluZyBmcm9tIHRoaXMgY29udHJpYnV0aW9uLiBUaGUNCitleHRlbnNpb24gbW9kX2dzb2FwLmRsbCBldmFsdWF0ZXMgdGhlIHBhcnQgYmVoaW5kIHRoZSAnPycsIHdoaWNoIGlzIGluIHRoaXMgZXhhbXBsZQ0KK215U29hcC4gVG8gdGhpcyB0aGUgc3RyaW5nICZxdW90Oy5kbGwmcXVvdDsgaXMgYXBwZW5kZWQgYW5kIHRoZSBkbGwgaXMgbG9hZGVkLiBEdWUNCit0byBzZWN1cml0eSByZWFzb25zIG9ubHkgZGxscyBmcm9tIHRoZSBzYW1lIGRpcmVjdG9yeSBhcmUgYWxsb3dlZC4gSWYgeW91IHdhbnQgdG8gZG8gc3BlY2lhbA0KK2luaXRpYWxpemF0aW9uIGluIHlvdXIgZGxsIHlvdSBtYXkgd2FudCB0byBhZGQgYW5kIGV4cG9ydCBhICZxdW90O0RsbE1haW4mcXVvdDsNCitmdW5jdGlvbiwgd2hpY2ggd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgSUlTIHByb2Nlc3MgYXR0YWNoZXMgdG8geW91ciBhbGwgYW5kDQorYmVmb3JlIGl0IGRldGFjaGVzIGl0LiBEbyBub3QgcmVseSBvbiB0aGUgVGhyZWFkIGF0dGFjaC9kZXRhY2ggY2FsbGJhY2ssIGluIG15DQorZXhwZXJpZW5jZSBJSVMgZG9lcyBub3QgYWx3YXlzIGNhbGwgRGxsTWFpbiBpbiB5b3VyIGRsbCBpZiB0aGVzZSB0aHJlYWRzIHdlcmUNCithbHJlYWR5IGluIHRoZSB0aHJlYWQgcG9vbCBiZWZvcmUgeW91ciBkbGwgd2FzIGxvYWRlZC4gVXNlIHRocmVhZCBsb2NhbCBzdG9yYWdlDQoraW5zdGVhZC48L2ZvbnQ+PC9wPg0KKzxmb250IGZhY2U9IlZlcmRhbmEiPg0KKzxIMj48YSBuYW1lPSJpaXNkZWJ1ZyI+RGV2ZWxvcG1lbnQgYW5kIERlYnVnZ2luZzwvYT48L0gyPg0KKzxwPlRoZXJlIGFyZSBhIGxvdCB0byBzYXkgYWJvdXQgZGVidWdnaW5nIG9mIGNvdXJzZS4gUGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHlvdXINCitnc29hcCBzZXJ2ZXIgd29ya3MgYXMgYSBzdGFuZGFsb25lIHNlcnZlciBhbmQgY2xpZW50IGJlZm9yZSB5b3UgY29udGludWUgdG8gdXNlDQoraXQgaW5zaWRlIElJUy4mbmJzcDs8L3A+DQorPGgzPklJUyBEZWJ1Z2dpbmc8L2gzPg0KKzxQPiBGb3IgRGVidWdnaW5nIHdpdGggV2luMjAwMCBJIGFkZGVkIHR3byAucmVnIGZpbGVzLCB0aGF0IHN3aXRjaCANCitkZWJ1Z2dpbmcgb2YgSUlTIG9uIGFuZCBvZmYgKHNlZSA8YSBocmVmPSJodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2RlZmF1bHQuYXNweD9zY2lkPWtiO2VuLXVzO3EyNzM2MzkiIHRhcmdldD0iX2JsYW5rIj5RMjczNjM5PC9hPg0KK2FuZCByZWxhdGVkKSwgYW5kIGEgc3RhcnQgYW5kIHN0b3AgY29tbWFuZCBpbiB0aGUgDQorTWFrZWZpbGUgdG8gc3RhcnQgYW5kIHN0b3AgaWlzIGRlYnVnZ2luZy4gTWFrZSBzdXJlIHRoYXQgdGhlIHBhdGggdG8gbXNkZXYgaXMgaW4gdGhlIFN5c3RlbSBlbnZpcm9ubWVudA0KK3ZhcmlhYmxlcyAoJnF1b3Q7UEFUSCZxdW90Oykgb2YgdGhlIHN5c3RlbSBhY2NvdW50IChub3Qgb25seSBvZiB5b3VyIG93biB1c2VyDQorYWNjb3VudCwgdGhpcyBpcyBub3Qgc2VlbiBieSBJSVNBZG1pbikuJm5ic3A7PC9QPg0KKzxQPklmIHlvdSB3YW50IHRvIGRlYnVnLCB5b3UgbXVzdCBzZXQgdGhlIGRsbCB0byBydW4gDQoraW4tcHJvY2Nlc3MuIFJpZ2h0LWNsaWNrIG9uIHRoZSBnc29hcCB2aXJ0dWFsIHJvb3QgaW4gaW50ZXJuZXQgc2VydmljZSBtYW5hZ2VyIA0KK2FuZCBzZXQgdGhlICZxdW90O0FwcGljYXRpb24gUHJvdGVjdGlvbiZxdW90OyB0byAmcXVvdDtMb3cgKElJUyBQcm9jZXNzKSZxdW90Oy4gDQorUmVtb3ZlIHRoZSAmcXVvdDtFbmFibGUgU2Vzc2lvbiBTdGF0ZSZxdW90OyBhbmQgYnVmZmVyaW5nIGFuZCBQYXJlbnQgDQorUGF0aHMuIERvbid0IGZvcmdldCB0byBhbGxvdyB0aGUgSUlTQWRtaW4gYW5kIFdXVyBTZXJ2aWNlIHRvIGludGVyYWN0IHdpdGggZGVza3RvcC4gPC9QPiAgICAgICAgDQorPC9mb250Pg0KKzxoMj48Zm9udCBmYWNlPSJWZXJkYW5hIj5NYWtlZmlsZTwvZm9udD48L2gyPg0KKzxwPjxmb250IGZhY2U9IlZlcmRhbmEiPkkgYWRkZWQgc29tZSBjb21tYW5kcyB0byBhIFdpbmRvemUgJnF1b3Q7TWFrZWZpbGUmcXVvdDsuDQorVG8gbWFrZSBsaXZlIGVhc2llci4gU2VlIHRoZSBNYWtlZmlsZSB5b3Vyc2VsZiwgdGhlcmUgYXJlJm5ic3A7IGNvbW1hbmRzIHRvIHN0YXJ0IGFuZA0KK3N0b3AgZGVidWdnaW5nIG9mIElJUyBhbmQgY2xlYW5pbmcgdGhlIGRpcmVjdG9yeS4gVGhlIHZlcnkgYWR2YW5jZWQgV2luZG96ZSB1c2VyIGNhbiBldmVuIGNvbXBpbGUNCitldmVyeXRoaW5nIHdpdGhvdXQgYSBtb3VzZSBieSBydW5uaW5nIG9uZSBjb21tYW5kLiBCZSBzdXJlIHRoYXQgbXNkZXYuZXhlIGFuZCBubWFrZS5leGUgYXJlIGluIHlvdXIgUEFUSC4NCitUaGVuIGVudGVyIGZyb20gdGhlIGNvbW1hbmRsaW5lOiZuYnNwOyA8L2ZvbnQ+PC9wPg0KKzxwPjxmb250IGZhY2U9IkNvdXJpZXIiPm5tYWtlPC9mb250Pjxmb250IGZhY2U9IlZlcmRhbmEiPiZuYnNwOzwvZm9udD48L3A+DQorPHA+PGZvbnQgZmFjZT0iVmVyZGFuYSI+U3VjaCBhZHZhbmNlZCB1c2VycyBzaG91bGQgYWxzbyBjb25zaWRlciB0byB1c2UgdGhlDQorbGludXgvdW5peCB2ZXJzaW9uIG1vZF9nc29hcC5zbywgYWxzbyBhdmFpbGFibGUgb24gPGEgaHJlZj0iaHR0cDovL214LmFiZXJnZXIuYXQvU09BUC9hcGFjaGVfaW5kZXguaHRtbCI+IHRoaXMNCitzaXRlPC9hPi4gOy0pPC9mb250PjwvcD4NCis8cD48Zm9udCBmYWNlPSJWZXJkYW5hIj5FbmpveSE8L2ZvbnQ+PC9wPg0KKzxwPjxmb250IGZhY2U9IlZlcmRhbmEiPndpdGggYmVzdCByZWdhcmRzIDxhIGhyZWY9Imh0dHA6Ly93d3cuYWJlcmdlci5hdCI+Q2hyaXN0aWFuDQorQWJlcmdlcjwvYT48L2ZvbnQ+PC9wPg0KKzxwPiZuYnNwOzwvcD4NCis8aHI+DQorPGgxPjxhIG5hbWU9IkZBUSI+RnJlcXVlbnRseSBhc2tlZCBxdWVzdGlvbnM8L2E+PC9oMT4NCis8b2w+DQorICA8bGk+UTogbW9kX2dzb2FwIGFuc3dlcnMgcHJvcGVybHkgaW4gdGhlIGJyb3dzZXIuIEJ1dCB0aGVuIEkgZ2V0IHRoZSBmb2xsb3dpbmcNCisgICAgb3V0cHV0OjwvbGk+DQorPC9vbD4NCis8cD48Zm9udCBmYWNlPSJDb3VyaWVyIE5ldyI+QzpcJmd0O2NhbGNjbG50LmV4ZSBhZGQgMyA1PGJyPg0KK1NPQVAgRkFVTFQ6IFNPQVAtRU5WOkNsaWVudDxicj4NCismcXVvdDtFbmQgb2YgZmlsZSBvciBubyBpbnB1dCZxdW90Ozxicj4NCitEZXRhaWw6IDxhIGhyZWY9Imh0dHA6Ly9sb2NhbGhvc3QvZ3NvYXAvbW9kX2dzb2FwLmRsbD9jYWxjIj5odHRwOi8vbG9jYWxob3N0L2dzb2FwL21vZF9nc29hcC5kbGw/Y2FsYzwvYT48YnI+DQorPGJyPg0KKzwvZm9udD5BbnN3ZXI6Jm5ic3A7PGJyPg0KK1N0ZXAgb25lOiBDb3VsZCB5b3UgcGxlYXNlIGNvbXBpbGUgY2FsY2NsbnQuZXhlIHdpdGggdGhlIERFQlVHIG9wdGlvbi48YnI+DQorKGluIFByZXByb2Nlc3NvciBEZWZpbml0aW9ucyBhZGQgREVCVUcpLjxicj4NCitEZWxldGUgYWxsIC5sb2cgZmlsZXMgZnJvbSB0aGUgY3VycmVudCBkaXJlY3RvcnkgaWYgYW55LiBUaGVuIHJ1bjxicj4NCithZ2FpbiBjYWxjY2xudC5leGUgYWRkIDMgNTxicj4NCis8YnI+DQorVGhlbiB5b3Ugc2hvdWxkIGdldCAzIGZpbGVzIHdpdGggdGhlIGV4dGVuc2lvbiAmcXVvdDsubG9nJnF1b3Q7IGluIHRoZSBjdXJyZW50PGJyPg0KK2RpcmVjdG9yeS4gUGxlYXNlIHJlYWQgd2hhdCBpcyBpbiB0aGVyZS4mbmJzcDs8L3A+DQorPHA+U3RlcCB0d286IE1ha2Ugc3VyZSB0aGF0IGR1bXBiaW4uZXhlIGlzIGluIHlvdXIgUEFUSCAoaXQgY2FuIGJlIGZvdW5kDQorc29tZXdoZXJlIGluIFZpc3VhbCBTdHVkaW8gNi4wIGJpbmFyaWVzKS48YnI+DQorT3BlbiBhIGNvbW1hbmQgc2hlbGwsIGNoYW5nZSZuYnNwOyB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIG1vZF9nc29hcC5kbGwgaXMNCitsb2NhdGVkIChDOlxJbmV0cHViXHd3d3Jvb3RcZ3NvYXApIGFuZCB0eXBlIHRoZSBmb2xsb3dpbmc6PGJyPg0KK2R1bXBiaW4gL2V4cG9ydHMgY2FsYy5kbGwuIFRoaXMgb3V0cHV0IHNob3VsZCBjb250YWluIHRoZSBleHBvcnRlZCBzeW1ib2xzIHRoYXQgYXJlIGxpc3RlZA0KK2luIHRoZSBzdGRzb2FwMi5kZWYgZmlsZS4gSWYgeW91IGRvbid0IGZpbmQgdGhlc2Ugc3ltYm9scyB5b3UgcHJvcGFibHkgZm9yZ290IHRvIGFkZCB0aGUgc3Rkc29hcDIuZGVmIGZpbGUNCitkZXNjcmliZWQgPGEgaHJlZj0iI3N0ZHNvYXAyLmRlZiI+aGVyZTwvYT4uPC9wPg0KKzxwPiZuYnNwOzwvcD4NCis8cD4mbmJzcDs8L3A+DQorPHA+Jm5ic3A7PC9wPg0KKzxwPjxicj4NCis8L3A+DQorPHA+Jm5ic3A7PC9wPg0KKzxwPiZuYnNwOzwvcD4NCisNCis8L2JvZHk+DQorDQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvaW1hZ2VzL2dzb2FwdmRpci5wbmcgYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL2ltYWdlcy9nc29hcHZkaXIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NTFjZTkKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL2ltYWdlcy9nc29hcHZkaXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvbW9kX2dzb2FwLmRsbCBiL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvbW9kX2dzb2FwLmRsbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTJhOGU2Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9tb2RfZ3NvYXAuZGxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvc2FtcGxlcy9jYWxjL01ha2VmaWxlIGIvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9zYW1wbGVzL2NhbGMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFmZjlkOAotLS0gL2Rldi9udWxsCisrKyBiL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvc2FtcGxlcy9jYWxjL01ha2VmaWxlCkBAIC0wLDAgKzEsMTUgQEAKK0RFTEZJTEVTPSAqLm5jYiAqLm9wdCAqLnBsZyAqLmNsdyAqLnBjaCAqLmFwcyBcCisJKi5uc21hcCAqLnhtbCAqLndzZGwgbnMueHNkIFwKKwlSRUNWLmxvZyBTRU5ULmxvZyBURVNULmxvZyBcCisJc29hcEMuYz8/IHNvYXBjYWxjUHJveHkuaCBzb2FwQ2xpZW50LmM/PyBzb2FwU2VydmVyLmM/PyBzb2FwU3R1Yi5oIHNvYXBILmggXAorCXNvYXBjYWxjT2JqZWN0Lmggc29hcENsaWVudExpYi4qIHNvYXBTZXJ2ZXJMaWIuKgorCisKK2FsbDoKKwllY2hvIGRvbmUKKworY2xlYW46CisJLXJtZGlyIC9zL3EgLlxEZWJ1ZworCS1ybWRpciAvcy9xIC5cUmVsZWFzZQorCWZvciAldiBpbiAoJChERUxGSUxFUykpIERPIGlmIGV4aXN0ICV2IGRlbCAldgorCmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL3NhbXBsZXMvY2FsYy9jYWxjLmRzcCBiL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvc2FtcGxlcy9jYWxjL2NhbGMuZHNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MWJiZTUKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL3NhbXBsZXMvY2FsYy9jYWxjLmRzcApAQCAtMCwwICsxLDIwMiBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJjYWxjIiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMA0KKyMgKiogTklDSFQgQkVBUkJFSVRFTiAqKg0KKw0KKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IiAweDAxMDINCisNCitDRkc9Y2FsYyAtIFdpbjMyIERlYnVnDQorIU1FU1NBR0UgRGllcyBpc3Qga2VpbiBn/Gx0aWdlcyBNYWtlZmlsZS4gWnVtIEVyc3RlbGxlbiBkaWVzZXMgUHJvamVrdHMgbWl0IE5NQUtFDQorIU1FU1NBR0UgdmVyd2VuZGVuIFNpZSBkZW4gQmVmZWhsICJNYWtlZmlsZSBleHBvcnRpZXJlbiIgdW5kIGb8aHJlbiBTaWUgZGVuIEJlZmVobA0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJjYWxjLm1hayIuDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgU2llIGv2bm5lbiBiZWltIEF1c2b8aHJlbiB2b24gTk1BS0UgZWluZSBLb25maWd1cmF0aW9uIGFuZ2ViZW4NCishTUVTU0FHRSBkdXJjaCBEZWZpbmllcmVuIGRlcyBNYWtyb3MgQ0ZHIGluIGRlciBCZWZlaGxzemVpbGUuIFp1bSBCZWlzcGllbDoNCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAiY2FsYy5tYWsiIENGRz0iY2FsYyAtIFdpbjMyIERlYnVnIg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIEb8ciBkaWUgS29uZmlndXJhdGlvbiBzdGVoZW4genVyIEF1c3dhaGw6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgImNhbGMgLSBXaW4zMiBSZWxlYXNlIiAoYmFzaWVyZW5kIGF1ZiAgIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikNCishTUVTU0FHRSAiY2FsYyAtIFdpbjMyIERlYnVnIiAoYmFzaWVyZW5kIGF1ZiAgIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikNCishTUVTU0FHRSANCisNCisjIEJlZ2luIFByb2plY3QNCisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMA0KKyMgUFJPUCBTY2NfUHJvak5hbWUgIiINCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIg0KK0NQUD1jbC5leGUNCitNVEw9bWlkbC5leGUNCitSU0M9cmMuZXhlDQorDQorIUlGICAiJChDRkcpIiA9PSAiY2FsYyAtIFdpbjMyIFJlbGVhc2UiDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBPdXRwdXRfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NVCAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL0QgIl9NQkNTIiAvRCAiX1VTUkRMTCIgL0QgIkNBTENfRVhQT1JUUyIgL1l1InN0ZGFmeC5oIiAvRkQgL2MNCisjIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9HWCAvTzIgL0QgIk5ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9EICJfTUJDUyIgL0QgIl9VU1JETEwiIC9EICJDQUxDX0VYUE9SVFMiIC9GRCAvYw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyDQorIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMg0KKyMgQUREIEJBU0UgUlNDIC9sIDB4YzA3IC9kICJOREVCVUciDQorIyBBREQgUlNDIC9sIDB4YzA3IC9kICJOREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvZGxsIC9tYWNoaW5lOkkzODYNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvZGxsIC9tYWNoaW5lOkkzODYgL291dDoiLi4vLi4vUmVsZWFzZS9jYWxjLmRsbCINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiY2FsYyAtIFdpbjMyIERlYnVnIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciDQorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UZCAvVzMgL0dtIC9HWCAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRCAiX01CQ1MiIC9EICJfVVNSRExMIiAvRCAiQ0FMQ19FWFBPUlRTIiAvWXUic3RkYWZ4LmgiIC9GRCAvR1ogL2MNCisjIEFERCBDUFAgL25vbG9nbyAvTURkIC9XMyAvR1ggL1ppIC9PZCAvRCAiX0RFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIl9NQkNTIiAvRCAiX1VTUkRMTCIgL0QgIkNBTENfRVhQT1JUUyIgL0ZEIC9HWiAvYw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyDQorIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMg0KKyMgQUREIEJBU0UgUlNDIC9sIDB4YzA3IC9kICJfREVCVUciDQorIyBBREQgUlNDIC9sIDB4YzA3IC9kICJfREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvZGxsIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvZGxsIC9pbmNyZW1lbnRhbDpubyAvZGVidWcgL21hY2hpbmU6STM4NiAvb3V0OiIuLlwuLlxEZWJ1Zy9jYWxjLmRsbCIgL3BkYnR5cGU6c2VwdA0KKw0KKyFFTkRJRiANCisNCisjIEJlZ2luIFRhcmdldA0KKw0KKyMgTmFtZSAiY2FsYyAtIFdpbjMyIFJlbGVhc2UiDQorIyBOYW1lICJjYWxjIC0gV2luMzIgRGVidWciDQorIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cY2FsYy5oDQorDQorIUlGICAiJChDRkcpIiA9PSAiY2FsYyAtIFdpbjMyIFJlbGVhc2UiDQorDQorIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQ0KKyMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gc29hcGNwcDIgJChJbnB1dFBhdGgpIC4uLg0KK0lucHV0UGF0aD0uXGNhbGMuaA0KKw0KK0J1aWxkQ21kcz0gXA0KKwlzb2FwY3BwMiAtYyAkKElucHV0UGF0aCkNCisNCisic29hcEMuYyIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSINCisgICAkKEJ1aWxkQ21kcykNCisNCisic29hcFNlcnZlci5jIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIg0KKyAgICQoQnVpbGRDbWRzKQ0KKw0KKyJzb2FwSC5oIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIg0KKyAgICQoQnVpbGRDbWRzKQ0KKw0KKyJjYWxjLm5zbWFwIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIg0KKyAgICQoQnVpbGRDbWRzKQ0KKw0KKyJzb2FwU3R1Yi5oIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIg0KKyAgICQoQnVpbGRDbWRzKQ0KKyMgRW5kIEN1c3RvbSBCdWlsZA0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJjYWxjIC0gV2luMzIgRGVidWciDQorDQorIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQ0KKyMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gc29hcGNwcDIgJChJbnB1dFBhdGgpIC4uLg0KK0lucHV0UGF0aD0uXGNhbGMuaA0KKw0KK0J1aWxkQ21kcz0gXA0KKwlzb2FwY3BwMiAtYyAkKElucHV0UGF0aCkNCisNCisic29hcEMuYyIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSINCisgICAkKEJ1aWxkQ21kcykNCisNCisic29hcFNlcnZlci5jIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIg0KKyAgICQoQnVpbGRDbWRzKQ0KKw0KKyJzb2FwSC5oIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIg0KKyAgICQoQnVpbGRDbWRzKQ0KKw0KKyJjYWxjLm5zbWFwIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIg0KKyAgICQoQnVpbGRDbWRzKQ0KKw0KKyJzb2FwU3R1Yi5oIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIg0KKyAgICQoQnVpbGRDbWRzKQ0KKyMgRW5kIEN1c3RvbSBCdWlsZA0KKw0KKyFFTkRJRiANCisNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxjYWxjc2VydmVyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHNvYXAyc3R1ZmYuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cc29hcEMuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHNvYXBTZXJ2ZXIuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHN0ZHNvYXAyLmRlZg0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHdpbnN0dWZmLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxjYWxjLm5zbWFwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cc29hcEguaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHNvYXBTdHViLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiUmVzb3VyY2UgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cY2FsYy5tYWsNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIFRhcmdldA0KKyMgRW5kIFByb2plY3QNCmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL3NhbXBsZXMvY2FsYy9jYWxjLmRzdyBiL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvc2FtcGxlcy9jYWxjL2NhbGMuZHN3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiODk0ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL3NhbXBsZXMvY2FsYy9jYWxjLmRzdwpAQCAtMCwwICsxLDI5IEBACitNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBXb3Jrc3BhY2UgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMA0KKyMgV0FSTklORzogRE8gTk9UIEVESVQgT1IgREVMRVRFIFRISVMgV09SS1NQQUNFIEZJTEUhDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK1Byb2plY3Q6ICJjYWxjIj0uXGNhbGMuZHNwIC0gUGFja2FnZSBPd25lcj08ND4NCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDQ+DQore3t7DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK0dsb2JhbDoNCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDM+DQore3t7DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KZGlmZiAtLWdpdCBhL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvc2FtcGxlcy9jYWxjL2NhbGMuaCBiL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvc2FtcGxlcy9jYWxjL2NhbGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjI2MjViCi0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9zYW1wbGVzL2NhbGMvY2FsYy5oCkBAIC0wLDAgKzEsMTAgQEAKKy8vZ3NvYXAgbnMgc2VydmljZSBuYW1lOiBjYWxjCisvL2dzb2FwIG5zIHNlcnZpY2UgbmFtZXNwYWNlOiBodHRwOi8vd2Vic3J2LmNzLmZzdS5lZHUvfmVuZ2VsZW4vY2FsYy53c2RsCisvL2dzb2FwIG5zIHNlcnZpY2UgbG9jYXRpb246IGh0dHA6Ly93ZWJzcnYuY3MuZnN1LmVkdS9+ZW5nZWxlbgorLy9nc29hcCBucyBzZXJ2aWNlIGV4ZWN1dGFibGU6IGNhbGMuY2dpCisvL2dzb2FwIG5zIHNjaGVtYSBuYW1lc3BhY2U6IHVybjpjYWxjCitpbnQgbnNfX2FkZChkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSAqcmVzdWx0KTsKK2ludCBuc19fc3ViKGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlICpyZXN1bHQpOworaW50IG5zX19tdWwoZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgKnJlc3VsdCk7CitpbnQgbnNfX2Rpdihkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSAqcmVzdWx0KTsKK2ludCBuc19fcG93KGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlICpyZXN1bHQpOwpkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9zYW1wbGVzL2NhbGMvY2FsY2NsaWVudC5jIGIvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9zYW1wbGVzL2NhbGMvY2FsY2NsaWVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZDFhMDAKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL3NhbXBsZXMvY2FsYy9jYWxjY2xpZW50LmMKQEAgLTAsMCArMSw0MSBAQAorI2luY2x1ZGUgInNvYXBILmgiCisjaW5jbHVkZSAiY2FsYy5uc21hcCIKKworY29uc3QgY2hhciBzZXJ2ZXJbXSA9ICJodHRwOi8vbG9jYWxob3N0L2dzb2FwL21vZF9nc29hcC5kbGw/Y2FsYyI7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sgc3RydWN0IHNvYXAgc29hcDsKKyAgZG91YmxlIGEsIGIsIHJlc3VsdDsKKyAgaWYgKGFyZ2MgPCA0KQorICB7IGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IFthZGR8c3VifG11bHxkaXZ8cG93XSBudW0gbnVtXG4iKTsKKyAgICBleGl0KDApOworICB9CisgIHNvYXBfaW5pdCgmc29hcCk7CisgIGEgPSBzdHJ0b2QoYXJndlsyXSwgTlVMTCk7CisgIGIgPSBzdHJ0b2QoYXJndlszXSwgTlVMTCk7CisgIHN3aXRjaCAoKmFyZ3ZbMV0pCisgIHsgY2FzZSAnYSc6CisgICAgICBzb2FwX2NhbGxfbnNfX2FkZCgmc29hcCwgc2VydmVyLCAiIiwgYSwgYiwgJnJlc3VsdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlICdzJzoKKyAgICAgIHNvYXBfY2FsbF9uc19fc3ViKCZzb2FwLCBzZXJ2ZXIsICIiLCBhLCBiLCAmcmVzdWx0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ20nOgorICAgICAgc29hcF9jYWxsX25zX19tdWwoJnNvYXAsIHNlcnZlciwgIiIsIGEsIGIsICZyZXN1bHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnZCc6CisgICAgICBzb2FwX2NhbGxfbnNfX2Rpdigmc29hcCwgc2VydmVyLCAiIiwgYSwgYiwgJnJlc3VsdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlICdwJzoKKyAgICAgIHNvYXBfY2FsbF9uc19fcG93KCZzb2FwLCBzZXJ2ZXIsICIiLCBhLCBiLCAmcmVzdWx0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gY29tbWFuZFxuIik7CisgICAgICBleGl0KDApOworICB9CisgIGlmIChzb2FwLmVycm9yKQorICAgIHNvYXBfcHJpbnRfZmF1bHQoJnNvYXAsIHN0ZGVycik7CisgIGVsc2UKKyAgICBwcmludGYoInJlc3VsdCA9ICVnXG4iLCByZXN1bHQpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvc2FtcGxlcy9jYWxjL2NhbGNjbG50LmRzcCBiL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvc2FtcGxlcy9jYWxjL2NhbGNjbG50LmRzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mjg5NDBlCi0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9zYW1wbGVzL2NhbGMvY2FsY2NsbnQuZHNwCkBAIC0wLDAgKzEsMTgyIEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9ImNhbGNjbG50IiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMA0KKyMgKiogTklDSFQgQkVBUkJFSVRFTiAqKg0KKw0KKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIDB4MDEwMw0KKw0KK0NGRz1jYWxjY2xudCAtIFdpbjMyIERlYnVnDQorIU1FU1NBR0UgRGllcyBpc3Qga2VpbiBn/Gx0aWdlcyBNYWtlZmlsZS4gWnVtIEVyc3RlbGxlbiBkaWVzZXMgUHJvamVrdHMgbWl0IE5NQUtFDQorIU1FU1NBR0UgdmVyd2VuZGVuIFNpZSBkZW4gQmVmZWhsICJNYWtlZmlsZSBleHBvcnRpZXJlbiIgdW5kIGb8aHJlbiBTaWUgZGVuIEJlZmVobA0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJjYWxjY2xudC5tYWsiLg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFNpZSBr9m5uZW4gYmVpbSBBdXNm/GhyZW4gdm9uIE5NQUtFIGVpbmUgS29uZmlndXJhdGlvbiBhbmdlYmVuDQorIU1FU1NBR0UgZHVyY2ggRGVmaW5pZXJlbiBkZXMgTWFrcm9zIENGRyBpbiBkZXIgQmVmZWhsc3plaWxlLiBadW0gQmVpc3BpZWw6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgImNhbGNjbG50Lm1hayIgQ0ZHPSJjYWxjY2xudCAtIFdpbjMyIERlYnVnIg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIEb8ciBkaWUgS29uZmlndXJhdGlvbiBzdGVoZW4genVyIEF1c3dhaGw6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgImNhbGNjbG50IC0gV2luMzIgUmVsZWFzZSIgKGJhc2llcmVuZCBhdWYgICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikNCishTUVTU0FHRSAiY2FsY2NsbnQgLSBXaW4zMiBEZWJ1ZyIgKGJhc2llcmVuZCBhdWYgICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikNCishTUVTU0FHRSANCisNCisjIEJlZ2luIFByb2plY3QNCisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMA0KKyMgUFJPUCBTY2NfUHJvak5hbWUgIiINCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIg0KK0NQUD1jbC5leGUNCitSU0M9cmMuZXhlDQorDQorIUlGICAiJChDRkcpIiA9PSAiY2FsY2NsbnQgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSINCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jDQorIyBBREQgQkFTRSBSU0MgL2wgMHhjMDcgL2QgIk5ERUJVRyINCisjIEFERCBSU0MgL2wgMHhjMDcgL2QgIk5ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2DQorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiY2FsY2NsbnQgLSBXaW4zMiBEZWJ1ZyINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJjYWxjY2xudF9fX1dpbjMyX0RlYnVnIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgImNhbGNjbG50X19fV2luMzJfRGVidWciDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIE91dHB1dF9EaXIgIkRlYnVnIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlwuLlxEZWJ1ZyINCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMA0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL0daIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9EICJERUJVRyIgL1lYIC9GRCAvR1ogL2MNCisjIEFERCBCQVNFIFJTQyAvbCAweGMwNyAvZCAiX0RFQlVHIg0KKyMgQUREIFJTQyAvbCAweGMwNyAvZCAiX0RFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2luY3JlbWVudGFsOm5vIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9vdXQ6Ii4uLy4uL0RlYnVnL2NhbGNjbG50LmV4ZSIgL3BkYnR5cGU6c2VwdA0KKw0KKyFFTkRJRiANCisNCisjIEJlZ2luIFRhcmdldA0KKw0KKyMgTmFtZSAiY2FsY2NsbnQgLSBXaW4zMiBSZWxlYXNlIg0KKyMgTmFtZSAiY2FsY2NsbnQgLSBXaW4zMiBEZWJ1ZyINCisjIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0Ig0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxjYWxjLmgNCisNCishSUYgICIkKENGRykiID09ICJjYWxjY2xudCAtIFdpbjMyIFJlbGVhc2UiDQorDQorIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQ0KKyMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gc29hcGNwcDIgJChJbnB1dFBhdGgpIC4uLg0KK0lucHV0UGF0aD0uXGNhbGMuaA0KKw0KK0J1aWxkQ21kcz0gXA0KKwlzb2FwY3BwMiAtYyAkKElucHV0UGF0aCkNCisNCisic29hcEMuYyIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSINCisgICAkKEJ1aWxkQ21kcykNCisNCisic29hcENsaWVudC5jIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIg0KKyAgICQoQnVpbGRDbWRzKQ0KKw0KKyJzb2FwSC5oIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIg0KKyAgICQoQnVpbGRDbWRzKQ0KKw0KKyJjYWxjLm5zbWFwIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIg0KKyAgICQoQnVpbGRDbWRzKQ0KKw0KKyJzb2FwU3R1Yi5oIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIg0KKyAgICQoQnVpbGRDbWRzKQ0KKyMgRW5kIEN1c3RvbSBCdWlsZA0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJjYWxjY2xudCAtIFdpbjMyIERlYnVnIg0KKw0KKyMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDENCisjIEJlZ2luIEN1c3RvbSBCdWlsZCAtIHNvYXBjcHAyICQoSW5wdXRQYXRoKSAuLi4NCitJbnB1dFBhdGg9LlxjYWxjLmgNCisNCitCdWlsZENtZHM9IFwNCisJc29hcGNwcDIgLWMgJChJbnB1dFBhdGgpDQorDQorInNvYXBDLmMiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiDQorICAgJChCdWlsZENtZHMpDQorDQorInNvYXBDbGllbnQuYyIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSINCisgICAkKEJ1aWxkQ21kcykNCisNCisic29hcEguaCIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSINCisgICAkKEJ1aWxkQ21kcykNCisNCisiY2FsYy5uc21hcCIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSINCisgICAkKEJ1aWxkQ21kcykNCisNCisic29hcFN0dWIuaCIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSINCisgICAkKEJ1aWxkQ21kcykNCisjIEVuZCBDdXN0b20gQnVpbGQNCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cY2FsY2NsaWVudC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cc29hcDJzdHVmZi5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llxzb2FwQy5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cc29hcENsaWVudC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cd2luc3R1ZmYuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmwiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGNhbGMubnNtYXANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llxzb2FwSC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cc29hcFN0dWIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEVuZCBUYXJnZXQNCisjIEVuZCBQcm9qZWN0DQpkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9zYW1wbGVzL2NhbGMvY2FsY3NlcnZlci5jcHAgYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL3NhbXBsZXMvY2FsYy9jYWxjc2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTc0NjkyCi0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9zYW1wbGVzL2NhbGMvY2FsY3NlcnZlci5jcHAKQEAgLTAsMCArMSw2OSBAQAorLyogbW9kX2dzb2FwIHNhbXBsZS4KKwlwbGVhc2Ugbm90ZTogaWYgeW91IHVzZSBjbGFzc2VzIGluIHlvdXIgc2VydmljZSBoZWFkZXIgZmlsZSwgeW91IGhhdmUgdG8gZXhwb3J0IHNvYXBfZGVzdHJveSBhbHNvLgorCVBsZWFzZSB1bmNvbW1lbnQgdGhlIGFjY29yZGluZyBsaW5lIGluIHRoZSBzdGRzb2FwMi5kZWYgZmlsZSBpbiB0aGF0IGNhc2UsIG90aGVyd2lzZSB5b3Ugd2lsbCBoYXZlIG1lbW9yeSBsZWFrcy4KKyAqLworI2luY2x1ZGUgInNvYXBILmgiCisjaW5jbHVkZSAiY2FsYy5uc21hcCIKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreyBpbnQgbSwgczsgLyogbWFzdGVyIGFuZCBzbGF2ZSBzb2NrZXRzICovCisgIHN0cnVjdCBzb2FwIHNvYXA7CisgIHNvYXBfaW5pdCgmc29hcCk7CisgIGlmIChhcmdjIDwgMikKKyAgICBzb2FwX3NlcnZlKCZzb2FwKTsJLyogc2VydmUgYXMgQ0dJIGFwcGxpY2F0aW9uICovCisgIGVsc2UKKyAgeyBtID0gc29hcF9iaW5kKCZzb2FwLCBOVUxMLCBhdG9pKGFyZ3ZbMV0pLCAxMDApOworICAgIGlmIChtIDwgMCkKKyAgICB7IHNvYXBfcHJpbnRfZmF1bHQoJnNvYXAsIHN0ZGVycik7CisgICAgICBleGl0KC0xKTsKKyAgICB9CisgICAgZnByaW50ZihzdGRlcnIsICJTb2NrZXQgY29ubmVjdGlvbiBzdWNjZXNzZnVsOiBtYXN0ZXIgc29ja2V0ID0gJWRcbiIsIG0pOworICAgIGZvciAoIDsgOyApCisgICAgeyBzID0gc29hcF9hY2NlcHQoJnNvYXApOworICAgICAgZnByaW50ZihzdGRlcnIsICJTb2NrZXQgY29ubmVjdGlvbiBzdWNjZXNzZnVsOiBzbGF2ZSBzb2NrZXQgPSAlZFxuIiwgcyk7CisgICAgICBpZiAocyA8IDApCisgICAgICB7IHNvYXBfcHJpbnRfZmF1bHQoJnNvYXAsIHN0ZGVycik7CisgICAgICAgIGV4aXQoLTEpOworICAgICAgfSAKKyAgICAgIHNvYXBfc2VydmUoJnNvYXApOworICAgICAgc29hcF9lbmQoJnNvYXApOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30gCisKK2ludCBuc19fYWRkKHN0cnVjdCBzb2FwICpzb2FwLCBkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSAqcmVzdWx0KQoreyAqcmVzdWx0ID0gYSArIGI7CisgIHJldHVybiBTT0FQX09LOworfSAKKworaW50IG5zX19zdWIoc3RydWN0IHNvYXAgKnNvYXAsIGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlICpyZXN1bHQpCit7ICpyZXN1bHQgPSBhIC0gYjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9IAorCitpbnQgbnNfX211bChzdHJ1Y3Qgc29hcCAqc29hcCwgZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgKnJlc3VsdCkKK3sgKnJlc3VsdCA9IGEgKiBiOworICByZXR1cm4gU09BUF9PSzsKK30gCisKK2ludCBuc19fZGl2KHN0cnVjdCBzb2FwICpzb2FwLCBkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSAqcmVzdWx0KQoreyBpZiAoYikKKyAgICAqcmVzdWx0ID0gYSAvIGI7CisgIGVsc2UKKyAgeyBjaGFyICpzID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIDEwMjQpOworICAgIHNwcmludGYocywgIkNhbid0IGRpdmlkZSAlZiBieSAlZiIsIGEsIGIpOworICAgIHJldHVybiBzb2FwX3JlY2VpdmVyX2ZhdWx0KHNvYXAsICJEaXZpc2lvbiBieSB6ZXJvIiwgcyk7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9IAorCitpbnQgbnNfX3BvdyhzdHJ1Y3Qgc29hcCAqc29hcCwgZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgKnJlc3VsdCkKK3sgKnJlc3VsdCA9IHBvdyhhLCBiKTsKKyAgaWYgKHNvYXBfZXJybm8gPT0gRURPTSkJLyogc29hcF9lcnJubyBpcyBsaWtlIGVycm5vLCBidXQgY29tcGF0aWJsZSB3aXRoIFdpbjMyICovCisgIHsgY2hhciAqcyA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCAxMDI0KTsKKyAgICBzcHJpbnRmKHMsICJDYW4ndCB0YWtlIHRoZSBwb3dlciBvZiAlZiB0byAlZiIsIGEsIGIpOworICAgIHJldHVybiBzb2FwX3JlY2VpdmVyX2ZhdWx0KHNvYXAsICJQb3dlciBmdW5jdGlvbiBkb21haW4gZXJyb3IiLCBzKTsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30gCmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL3NhbXBsZXMvY2FsYy9zb2FwMnN0dWZmLmNwcCBiL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvc2FtcGxlcy9jYWxjL3NvYXAyc3R1ZmYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYjE4NjAKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL3NhbXBsZXMvY2FsYy9zb2FwMnN0dWZmLmNwcApAQCAtMCwwICsxLDcgQEAKKy8qKiBmaWxlIHRvIGluY2x1ZGUgc3Rkc29hcDIuY3BwIGhlcmUsIHRvIGdldCBhcm91bmQgZGlyZWN0b3J5IGxvY2F0aW9uIHByb2JsZW1zIGV0Yy4KKyovCisKKy8qIFlvdSBtdXN0IHNldCB0aGUgaW5jbHVkZSBwYXRoIGluIFZpc3VhbCBTdHVkaW8gdW5kZXIgdG9vbHN8b3B0aW9uc3xkaXJlY3Rvcmllc3xpbmNsdWRlIGFud2F5LiAKKyAgIFRoZXJlIGFsc28gdGhlIGZpbGUgYmVsb3cgY2FuIGJlIGZvdW5kLgorKi8KKyNpbmNsdWRlICJzdGRzb2FwMi5jcHAiCmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL3NhbXBsZXMvY2FsYy9zdGRzb2FwMi5kZWYgYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL3NhbXBsZXMvY2FsYy9zdGRzb2FwMi5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ0YjFiZgotLS0gL2Rldi9udWxsCisrKyBiL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvc2FtcGxlcy9jYWxjL3N0ZHNvYXAyLmRlZgpAQCAtMCwwICsxLDEzIEBACis7IHNvYXBjcHAyLmRlZiA6IERlY2xhcmVzIHRoZSBtb2R1bGUgcGFyYW1ldGVycyBmb3IgYSBnc29hcCBzZXJ2ZXIgRExMLgorCitERVNDUklQVElPTiAgJ2dvc2FwIHNlcnZlciBkbGwnCisKK0VYUE9SVFMKKyAgICA7IHdlIG11c3QgZXhwb3J0IHdoYXQgdGhlIGdzb2FwIGlzYXBpIGV4dGVuc2lvbiBuZWVkcyBmb3IgbG9hZGluZyB1cyBhbmQgd29ya2luZyB3aXRoIHVzLgorCXNvYXBfaW5pdAlQUklWQVRFCisJc29hcF9zZXJ2ZSAgUFJJVkFURQorCXNvYXBfZGVsZXRlIFBSSVZBVEUKKwlzb2FwX2RvbmUJUFJJVkFURQorCXNvYXBfZW5kCVBSSVZBVEUKKwlzb2FwX3JlZ2lzdGVyX3BsdWdpbl9hcmcgUFJJVkFURQorCXNvYXBfbG9va3VwX3BsdWdpbiBQUklWQVRFClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9zYW1wbGVzL2NhbGMvd2luc3R1ZmYuY3BwIGIvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9zYW1wbGVzL2NhbGMvd2luc3R1ZmYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5Nzc1NjQKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL3NhbXBsZXMvY2FsYy93aW5zdHVmZi5jcHAKQEAgLTAsMCArMSwyMiBAQAorLy8gY2FsYy5jcHAgOiBEZWZpbmVzIHRoZSBlbnRyeSBwb2ludCBmb3IgdGhlIERMTCBhcHBsaWNhdGlvbi4KKy8vCisKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgkJLy8gRXhjbHVkZSByYXJlbHktdXNlZCBzdHVmZiBmcm9tIFdpbmRvd3MgaGVhZGVycworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDx3aW5zb2NrMi5oPgorCisjaWYgX01TQ19WRVIgPiAxMDAwCisjcHJhZ21hIGNvbW1lbnQobGliLCAid3NvY2szMiIpCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBXU0FJbml0IHsgXAorICAgICAgICBXU0FEQVRBIFdzYURhdGE7IFwKKyAgICAgICAgV1NBSW5pdCgpIHtXU0FTdGFydHVwKDB4MDEwMSwgJldzYURhdGEpO30gXAorICAgICAgICB+V1NBSW5pdCgpIHtXU0FDbGVhbnVwKCk7fSBcCit9IFdzYUluaXQ7CisKKworQk9PTCBBUElFTlRSWSBEbGxNYWluKEhBTkRMRSBoTW9kdWxlLCBEV09SRCAgdWxfcmVhc29uX2Zvcl9jYWxsLCBMUFZPSUQgbHBSZXNlcnZlZCkgeworICAgIHJldHVybiBUUlVFOworfQorCmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL3NhbXBsZXMvZGltZS9NYWtlZmlsZSBiL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvc2FtcGxlcy9kaW1lL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzN2RmOGUKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL3NhbXBsZXMvZGltZS9NYWtlZmlsZQpAQCAtMCwwICsxLDE1IEBACitERUxGSUxFUz0gKi5uY2IgKi5vcHQgKi5wbGcgKi5jbHcgKi5wY2ggKi5hcHMgXAorCSoubnNtYXAgKi54bWwgKi53c2RsIG5zLnhzZCBcCisJUkVDVi5sb2cgU0VOVC5sb2cgVEVTVC5sb2cgXAorCXNvYXBDLmM/PyBzb2FwY2FsY1Byb3h5Lmggc29hcENsaWVudC5jPz8gc29hcFNlcnZlci5jPz8gc29hcFN0dWIuaCBzb2FwSC5oIFwKKwlzb2FwQ2xpZW50TGliLiogc29hcFNlcnZlckxpYi4qIHNvYXBkaW1lT2JqZWN0Lmggc29hcGRpbWVQcm94eS5oCisKKworYWxsOgorCWVjaG8gZG9uZQorCitjbGVhbjoKKwktcm1kaXIgL3MvcSAuXERlYnVnCisJLXJtZGlyIC9zL3EgLlxSZWxlYXNlCisJZm9yICV2IGluICgkKERFTEZJTEVTKSkgRE8gaWYgZXhpc3QgJXYgZGVsICV2CisKZGlmZiAtLWdpdCBhL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvc2FtcGxlcy9kaW1lL2RpbWUuZHNwIGIvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9zYW1wbGVzL2RpbWUvZGltZS5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdkOTUzYwotLS0gL2Rldi9udWxsCisrKyBiL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvc2FtcGxlcy9kaW1lL2RpbWUuZHNwCkBAIC0wLDAgKzEsMTgyIEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9ImRpbWUiIC0gUGFja2FnZSBPd25lcj08ND4NCisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyAqKiBOSUNIVCBCRUFSQkVJVEVOICoqDQorDQorIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiIDB4MDEwMg0KKw0KK0NGRz1kaW1lIC0gV2luMzIgRGVidWcNCishTUVTU0FHRSBEaWVzIGlzdCBrZWluIGf8bHRpZ2VzIE1ha2VmaWxlLiBadW0gRXJzdGVsbGVuIGRpZXNlcyBQcm9qZWt0cyBtaXQgTk1BS0UNCishTUVTU0FHRSB2ZXJ3ZW5kZW4gU2llIGRlbiBCZWZlaGwgIk1ha2VmaWxlIGV4cG9ydGllcmVuIiB1bmQgZvxocmVuIFNpZSBkZW4gQmVmZWhsDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgImRpbWUubWFrIi4NCishTUVTU0FHRSANCishTUVTU0FHRSBTaWUga/ZubmVuIGJlaW0gQXVzZvxocmVuIHZvbiBOTUFLRSBlaW5lIEtvbmZpZ3VyYXRpb24gYW5nZWJlbg0KKyFNRVNTQUdFIGR1cmNoIERlZmluaWVyZW4gZGVzIE1ha3JvcyBDRkcgaW4gZGVyIEJlZmVobHN6ZWlsZS4gWnVtIEJlaXNwaWVsOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJkaW1lLm1hayIgQ0ZHPSJkaW1lIC0gV2luMzIgRGVidWciDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgRvxyIGRpZSBLb25maWd1cmF0aW9uIHN0ZWhlbiB6dXIgQXVzd2FobDoNCishTUVTU0FHRSANCishTUVTU0FHRSAiZGltZSAtIFdpbjMyIFJlbGVhc2UiIChiYXNpZXJlbmQgYXVmICAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQ0KKyFNRVNTQUdFICJkaW1lIC0gV2luMzIgRGVidWciIChiYXNpZXJlbmQgYXVmICAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQ0KKyFNRVNTQUdFIA0KKw0KKyMgQmVnaW4gUHJvamVjdA0KKyMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwDQorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIg0KKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiDQorQ1BQPWNsLmV4ZQ0KK01UTD1taWRsLmV4ZQ0KK1JTQz1yYy5leGUNCisNCishSUYgICIkKENGRykiID09ICJkaW1lIC0gV2luMzIgUmVsZWFzZSINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRCAiX01CQ1MiIC9EICJfVVNSRExMIiAvRCAiRElNRV9FWFBPUlRTIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRCAiX01CQ1MiIC9EICJfVVNSRExMIiAvRCAiRElNRV9FWFBPUlRTIiAvWVggL0ZEIC9jDQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyDQorIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMg0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA3IC9kICJOREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDA3IC9kICJOREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvZGxsIC9tYWNoaW5lOkkzODYNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvZGxsIC9tYWNoaW5lOkkzODYNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiZGltZSAtIFdpbjMyIERlYnVnIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciDQorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UZCAvVzMgL0dtIC9HWCAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRCAiX01CQ1MiIC9EICJfVVNSRExMIiAvRCAiRElNRV9FWFBPUlRTIiAvWVggL0ZEIC9HWiAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL0QgIl9NQkNTIiAvRCAiX1VTUkRMTCIgL0QgIkRJTUVfRVhQT1JUUyIgL1lYIC9GRCAvR1ogL2MNCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzINCisjIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDcgL2QgIl9ERUJVRyINCisjIEFERCBSU0MgL2wgMHg0MDcgL2QgIl9ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9kbGwgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdA0KKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9kbGwgL2luY3JlbWVudGFsOm5vIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9vdXQ6Ii4uLy4uL0RlYnVnL2RpbWUuZGxsIiAvcGRidHlwZTpzZXB0DQorDQorIUVORElGIA0KKw0KKyMgQmVnaW4gVGFyZ2V0DQorDQorIyBOYW1lICJkaW1lIC0gV2luMzIgUmVsZWFzZSINCisjIE5hbWUgImRpbWUgLSBXaW4zMiBEZWJ1ZyINCisjIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0Ig0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxkaW1lLmgNCisNCishSUYgICIkKENGRykiID09ICJkaW1lIC0gV2luMzIgUmVsZWFzZSINCisNCisjIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxDQorIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBzb2FwY3BwMiAkKElucHV0UGF0aCkgLi4uDQorSW5wdXRQYXRoPS5cZGltZS5oDQorDQorQnVpbGRDbWRzPSBcDQorCXNvYXBjcHAyICQoSW5wdXRQYXRoKQ0KKw0KKyJzb2FwQy5jcHAiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiDQorICAgJChCdWlsZENtZHMpDQorDQorInNvYXBTZXJ2ZXIuY3BwIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIg0KKyAgICQoQnVpbGRDbWRzKQ0KKw0KKyJzb2FwSC5oIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIg0KKyAgICQoQnVpbGRDbWRzKQ0KKw0KKyJkaW1lLm5zbWFwIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIg0KKyAgICQoQnVpbGRDbWRzKQ0KKyMgRW5kIEN1c3RvbSBCdWlsZA0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJkaW1lIC0gV2luMzIgRGVidWciDQorDQorIyBQUk9QIElnbm9yZV9EZWZhdWx0X1Rvb2wgMQ0KKyMgQmVnaW4gQ3VzdG9tIEJ1aWxkIC0gc29hcGNwcDIgJChJbnB1dFBhdGgpIC4uLg0KK0lucHV0UGF0aD0uXGRpbWUuaA0KKw0KK0J1aWxkQ21kcz0gXA0KKwlzb2FwY3BwMiAkKElucHV0UGF0aCkNCisNCisic29hcEMuY3BwIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIg0KKyAgICQoQnVpbGRDbWRzKQ0KKw0KKyJzb2FwU2VydmVyLmNwcCIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSINCisgICAkKEJ1aWxkQ21kcykNCisNCisic29hcEguaCIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSINCisgICAkKEJ1aWxkQ21kcykNCisNCisiZGltZS5uc21hcCIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSINCisgICAkKEJ1aWxkQ21kcykNCisjIEVuZCBDdXN0b20gQnVpbGQNCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cZGltZXNlcnZlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llxzb2FwMnN0dWZmLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHNvYXBDLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHNvYXBTZXJ2ZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cc3Rkc29hcDIuZGVmDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cd2luc3R1ZmYuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmwiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHNvYXBILmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llxzb2FwU3R1Yi5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgRW5kIFRhcmdldA0KKyMgRW5kIFByb2plY3QNCmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL3NhbXBsZXMvZGltZS9kaW1lLmggYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL3NhbXBsZXMvZGltZS9kaW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q0OGI3YwotLS0gL2Rldi9udWxsCisrKyBiL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvc2FtcGxlcy9kaW1lL2RpbWUuaApAQCAtMCwwICsxLDI4IEBACisvL2dzb2FwIG5zIHNlcnZpY2UgbmFtZTogZGltZQorLy9nc29hcCBucyBzZXJ2aWNlIG5hbWVzcGFjZTogaHR0cDovL3d3dy5hYmVyZ2VyLGF0L1NPQVAvZGltZS53c2RsCisvL2dzb2FwIG5zIHNlcnZpY2UgbG9jYXRpb246IGh0dHA6Ly9sb2NhbGhvc3QvZ3NvYXA/bW9kX2dzb2FwLmRsbD9kaW1lCisvL2dzb2FwIG5zIHNlcnZpY2UgZXhlY3V0YWJsZTogZGltZS5kbGwKKy8vZ3NvYXAgbnMgc2NoZW1hICBuYW1lc3BhY2U6IHVybjpkaW1lCisvL2dzb2FwIHNlcnZpY2UgZG9jdW1lbnRhdGlvbjogU2VuZCBpbWFnZSBmaWxlcyBiYWNrIGFuZCBmb3J0aCBhcyBkaW1lIGF0dGFjCisKKworY2xhc3MgeHNkX19iYXNlNjRCaW5hcnkgeworICB1bnNpZ25lZCBjaGFyICpfX3B0cjsKKyAgaW50IF9fc2l6ZTsKKyAgY2hhciAqaWQ7CisgIGNoYXIgKnR5cGU7CisgIGNoYXIgKm9wdGlvbnM7CisKKyAgeHNkX19iYXNlNjRCaW5hcnkoKTsgLy8gQ29uc3RydWN0b3IgCisgIHhzZF9fYmFzZTY0QmluYXJ5KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbik7IC8vIENvbnN0cnVjdG9yIAorICB+eHNkX19iYXNlNjRCaW5hcnkoKTsgLy8gRGVzdHJ1Y3RvciAKKyAgdW5zaWduZWQgY2hhciAqbG9jYXRpb24oKTsgLy8gcmV0dXJucyB0aGUgbWVtb3J5IGxvY2F0aW9uIAorICBpbnQgc2l6ZSgpOyAvLyByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgCisKK307CisKKy8vZ3NvYXAgbWV0aG9kLWRvY3VtZW50YXRpb24gZ2V0SW1hZ2UgcmV0cmlldmUgYW4gaW1hZ2UgZnJvbSB0aGUgc2VydmVyLgoraW50IG5zX19nZXRJbWFnZShjaGFyICpuYW1lLCB4c2RfX2Jhc2U2NEJpbmFyeSAmaW1hZ2UpOworCisvL2dzb2FwIG1ldGhvZC1kb2N1bWVudGF0aW9uIGdldEltYWdlIHNlbmQgYW4gaW1hZ2UgdG8gdGhlIHNlcnZlci4KK2ludCBuc19fcHV0SW1hZ2UoY2hhciAqbmFtZSwgeHNkX19iYXNlNjRCaW5hcnkgKmltYWdlLCBpbnQmIHN0YXR1cyk7IApkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9zYW1wbGVzL2RpbWUvZGltZWNsaWVudC5jcHAgYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL3NhbXBsZXMvZGltZS9kaW1lY2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTFiYmJmCi0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9zYW1wbGVzL2RpbWUvZGltZWNsaWVudC5jcHAKQEAgLTAsMCArMSwxNDAgQEAKKy8qCWRpbWVjbGllbnQuY3BwCisKKwlFeGFtcGxlIERJTUUgY2xpZW50IGZvciBzaW1wbGUgaW1hZ2Ugc2VydmVyLiBUaGlzIERJTUUgY2xpZW50CisJZGVtb25zdHJhdGVzIHRoZSBuZXcgZ1NPQVAgRElNRSBzdHJlYW1pbmcgZmVhdHVyZS4KKworCUNvcHlyaWdodCAoQykgMjAwMC0yMDAyIFJvYmVydCBBLiB2YW4gRW5nZWxlbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCVJ1biBmcm9tIGNvbW1hbmQgbGluZS4gVGhlIGZpcnN0IG9wdGlvbmFsIGFyZ3VtZW50IGlzIHRoZSBpbWFnZSBmaWxlCisJbmFtZS4gVGhlIHNlY29uZCBvcHRpb25hbCBhcmd1bWVudCBpcyB0aGUgc2VydmljZSBlbmRwb2ludCBVUkwuIFRoZQorCXRoaXJkIG9wdGlvbmFsIGFyZ3VtZW50IGlzIHRoZSBmaWxlIG5hbWUgdG8gc2F2ZSB0aGUgaW1hZ2UgZmlsZSB0by4KKyovCisKKyNpbmNsdWRlICJzb2FwSC5oIgorI2luY2x1ZGUgImRpbWUubnNtYXAiCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4JLy8gdXNlIGZzdGF0KCkgZm9yIHN0cmVhbWluZyBESU1FCisKKy8vIHN0cmVhbWluZyBESU1FIGNhbGxiYWNrcworc3RhdGljIHZvaWQgKmRpbWVfd3JpdGVfb3BlbihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworc3RhdGljIHZvaWQgZGltZV93cml0ZV9jbG9zZShzdHJ1Y3Qgc29hcCosIHZvaWQqKTsKK3N0YXRpYyBpbnQgZGltZV93cml0ZShzdHJ1Y3Qgc29hcCosIHZvaWQqLCBjb25zdCBjaGFyKiwgc2l6ZV90KTsKKworc3RhdGljIHZvaWQgKmRpbWVfcmVhZF9vcGVuKHN0cnVjdCBzb2FwKiwgdm9pZCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworc3RhdGljIHZvaWQgZGltZV9yZWFkX2Nsb3NlKHN0cnVjdCBzb2FwKiwgdm9pZCopOworc3RhdGljIHNpemVfdCBkaW1lX3JlYWQoc3RydWN0IHNvYXAqLCB2b2lkKiwgY2hhciosIHNpemVfdCk7CisKKworc3RhdGljIGludCBnZXRJbWFnZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp1cmwsIGNvbnN0IGNoYXIgKm91dHB1dGZpbGUpIHsKKwlzdHJ1Y3Qgc29hcCBzb2FwOworCXhzZF9fYmFzZTY0QmluYXJ5IGltYWdlOworCXNvYXBfaW5pdCgmc29hcCk7CisgICAgc29hcC51c2VyID0gKHZvaWQqKW91dHB1dGZpbGU7CisgICAgc29hcC5mZGltZXdyaXRlb3BlbiA9IGRpbWVfd3JpdGVfb3BlbjsKKyAgICBzb2FwLmZkaW1ld3JpdGVjbG9zZSA9IGRpbWVfd3JpdGVfY2xvc2U7CisgICAgc29hcC5mZGltZXdyaXRlID0gZGltZV93cml0ZTsKKwlzb2FwLmNvbm5lY3RfdGltZW91dCA9IDEwOworCWludCBuUmV0ID0gc29hcF9jYWxsX25zX19nZXRJbWFnZSgmc29hcCwgdXJsLCAiIiwgKGNoYXIgKiluYW1lLCBpbWFnZSk7CisJaWYgKG5SZXQgIT0gU09BUF9PSykgeworCQlzb2FwX3ByaW50X2ZhdWx0KCZzb2FwLCBzdGRlcnIpOworCX0gZWxzZSB7CisJCXByaW50ZigiZ290IGFuIGltYWdlLCBJIHN1cHBvc2VcbiIpOworCX0KKwlzb2FwX2Rlc3Ryb3koJnNvYXApOworCXNvYXBfZW5kKCZzb2FwKTsKKwlyZXR1cm4gblJldDsKK30KK3N0YXRpYyBpbnQgcHV0SW1hZ2UoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdXJsLCBjb25zdCBjaGFyICppbnB1dGZpbGUpIHsKKwlGSUxFICpmZCA9IGZvcGVuKGlucHV0ZmlsZSwgInJiIik7CisJaWYgKE5VTEwgPT0gZmQpIHsKKwkJcHJpbnRmKCJmYWlsZWQgdG8gb3BlbiAlc1xuIiwgaW5wdXRmaWxlKTsKKwkJcmV0dXJuIDM7CisJfQorCXN0cnVjdCBzdGF0IHNiOworCWlmICgwICE9IGZzdGF0KGZpbGVubyhmZCksICZzYikgfHwgc2Iuc3Rfc2l6ZSA8PSAwKSB7CisJCXByaW50ZigiY2Fubm90IGZpbmQgdGhlIGxlbmd0aCBvZiBmaWxlICVzXG4iLCBpbnB1dGZpbGUpOworCQlyZXR1cm4gNDsKKworCX0KKwlzdHJ1Y3Qgc29hcCBzb2FwOworCXNvYXBfaW5pdCgmc29hcCk7CisJeHNkX19iYXNlNjRCaW5hcnkgKnBpbWFnZSA9IHNvYXBfbmV3X3hzZF9fYmFzZTY0QmluYXJ5KCZzb2FwLCAtMSk7CisgICAgc29hcC51c2VyID0gKHZvaWQgKilpbnB1dGZpbGU7CisJc29hcC5mZGltZXJlYWRvcGVuID0gZGltZV9yZWFkX29wZW47CisJc29hcC5mZGltZXJlYWRjbG9zZSA9IGRpbWVfcmVhZF9jbG9zZTsKKwlzb2FwLmZkaW1lcmVhZCA9IGRpbWVfcmVhZDsKKwlwaW1hZ2UtPl9fcHRyID0gKHVuc2lnbmVkIGNoYXIqKWZkOyAKKwlwaW1hZ2UtPl9fc2l6ZSA9IHNiLnN0X3NpemU7IC8vIG11c3Qgc2V0IHNpemUKKyAgICBwaW1hZ2UtPnR5cGUgPSAiaW1hZ2UvanBlZyI7CisJcGltYWdlLT5vcHRpb25zID0gc29hcF9kaW1lX29wdGlvbigmc29hcCwgMCwgIk15IHNlbnQgcGljdHVyZSIpOworCXNvYXAuY29ubmVjdF90aW1lb3V0ID0gMTA7CisKKwlpbnQgblN0YXR1cyA9IDA7CisJaW50IG5SZXQgPSBzb2FwX2NhbGxfbnNfX3B1dEltYWdlKCZzb2FwLCB1cmwsICIiLCAoY2hhciAqKW5hbWUsIHBpbWFnZSwgblN0YXR1cyk7CisJaWYgKG5SZXQgIT0gU09BUF9PSykgeworCQlzb2FwX3ByaW50X2ZhdWx0KCZzb2FwLCBzdGRlcnIpOworCX0gZWxzZSB7CisJCXByaW50Zigic2VudCBhbiBpbWFnZSwgSSBzdXBwb3NlIik7CisJfQorCXNvYXBfZGVzdHJveSgmc29hcCk7CisJc29hcF9lbmQoJnNvYXApOworCXJldHVybiBuUmV0OworfQoraW50IG1haW4oY29uc3QgaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmNvbnN0ICpjb25zdCBhcmd2KSB7IAorCWlmICg0ICE9IGFyZ2MpIHsKKwkJcHJpbnRmKCJ1c2FnZTogJXMgaW1hZ2VuYW1lIG91dHB1dGZpbGVuYW1lXG4iLCBhcmd2WzBdKTsKKwkJcmV0dXJuIDE7CisJfQorCWludCBuUmV0ID0gMDsKKwluUmV0ID0gZ2V0SW1hZ2UoYXJndlsxXSwgYXJndlsyXSwgYXJndlszXSk7CisJaWYgKDAgPT0gblJldCkgeworCQluUmV0ID0gcHV0SW1hZ2UoYXJndlsxXSwgYXJndlsyXSwgYXJndlszXSk7CisJfQorCXJldHVybiBuUmV0OworfQorCitzdGF0aWMgdm9pZCAqZGltZV93cml0ZV9vcGVuKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqb3B0aW9ucykKK3sgRklMRSAqaGFuZGxlID0gTlVMTDsKKyAgLy8gd2UgY2FuIHJldHVybiBOVUxMIHdpdGhvdXQgc2V0dGluZyBzb2FwLT5lcnJvciBpZiB3ZSBkb24ndCB3YW50IHRvIHVzZSB0aGUgc3RyZWFtaW5nIGNhbGxiYWNrIGZvciB0aGlzIERJTUUgYXR0YWNobWVudAorICBoYW5kbGUgPSBmb3BlbigoY2hhciopc29hcC0+dXNlciwgIndiIik7CisgIGlmIChoYW5kbGUpCisgICAgcHJpbnRmKCJTdHJlYW1pbmcgaW1hZ2UgaWQ9JXMgdHlwZT0lcyBpbnRvIGZpbGUgJXNcbiIsIGlkLCB0eXBlLCAoY2hhciopc29hcC0+dXNlcik7CisgIGVsc2UKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOyAvLyBjb3VsZCBub3Qgb3BlbiBmaWxlIGZvciB3cml0aW5nCisgICAgc29hcC0+ZXJybnVtID0gZXJybm87IC8vIGdldCByZWFzb24KKyAgfQorICByZXR1cm4gKHZvaWQqKWhhbmRsZTsKK30KKworc3RhdGljIHZvaWQgZGltZV93cml0ZV9jbG9zZShzdHJ1Y3Qgc29hcCAqc29hcCwgdm9pZCAqaGFuZGxlKQoreyBmY2xvc2UoKEZJTEUqKWhhbmRsZSk7Cit9CisKK3N0YXRpYyBpbnQgZGltZV93cml0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgdm9pZCAqaGFuZGxlLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7IHNpemVfdCBud3JpdHRlbjsKKyAgd2hpbGUgKGxlbikKKyAgeyBud3JpdHRlbiA9IGZ3cml0ZShidWYsIDEsIGxlbiwgKEZJTEUqKWhhbmRsZSk7CisgICAgaWYgKCFud3JpdHRlbikKKyAgICB7IHNvYXAtPmVycm51bSA9IGVycm5vOyAvLyBnZXQgcmVhc29uCisgICAgICByZXR1cm4gU09BUF9FT0Y7CisgICAgfQorICAgIGxlbiAtPSBud3JpdHRlbjsKKyAgICBidWYgKz0gbndyaXR0ZW47CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8vLy8gcmVhZGluZyByb3V0aW5lcyBmb3IgcHV0SW1hZ2U6CisvKiogc2F2ZSBhIGZpbGUgc2VudCBieSB0aGUgY2xpZW50IHRvIG91ciBzZXJ2ZXIgKi8KK3N0YXRpYyB2b2lkICpkaW1lX3JlYWRfb3BlbihzdHJ1Y3Qgc29hcCAqc29hcCwgdm9pZCAqaGFuZGxlLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqb3B0aW9ucykgeworICAvLyB3ZSBzaG91bGQgcmV0dXJuIE5VTEwgd2l0aG91dCBzZXR0aW5nIHNvYXAtPmVycm9yIGlmIHdlIGRvbid0IHdhbnQgdG8gdXNlIHRoZSBzdHJlYW1pbmcgY2FsbGJhY2sgZm9yIHRoaXMgRElNRSBhdHRhY2htZW50LiBUaGUgaGFuZGxlIGNvbnRhaW5zIHRoZSBub24tTlVMTCBfX3B0ciBmaWVsZCB2YWx1ZSB3aGljaCBzaG91bGQgaGF2ZSBiZWVuIHNldCBpbiB0aGUgYXBwbGljYXRpb24uCisgIC8vIHRoZSB2YWx1ZSBvZiB0aGUgaGFuZGxlIGNhbiBiZSBjaGFuZ2VkIGFuZCB3aWxsIGJlIHBhc3NlZCBvbiB0byB0aGUgZmRpbWVyZWFkIGFuZCBmZGltZXJlYWRjbG9zZSBjYWxsYmFja3MuIFRoZSB2YWx1ZSB3aWxsIG5vdCBhZmZlY3QgdGhlIF9fcHRyIGZpZWxkLgorICByZXR1cm4gaGFuZGxlOworfQorCitzdGF0aWMgdm9pZCBkaW1lX3JlYWRfY2xvc2Uoc3RydWN0IHNvYXAgKnNvYXAsIHZvaWQgKmhhbmRsZSkgeworCWZjbG9zZSgoRklMRSopaGFuZGxlKTsKK30KK3N0YXRpYyBzaXplX3QgZGltZV9yZWFkKHN0cnVjdCBzb2FwICpzb2FwLCB2b2lkICpoYW5kbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikgeworCXJldHVybiBmcmVhZChidWYsIDEsIGxlbiwgKEZJTEUqKWhhbmRsZSk7Cit9CisKZGlmZiAtLWdpdCBhL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvc2FtcGxlcy9kaW1lL2RpbWVjbG50LmRzcCBiL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvc2FtcGxlcy9kaW1lL2RpbWVjbG50LmRzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWQwNzk2Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9zYW1wbGVzL2RpbWUvZGltZWNsbnQuZHNwCkBAIC0wLDAgKzEsMTczIEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9ImRpbWVjbG50IiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMA0KKyMgKiogTklDSFQgQkVBUkJFSVRFTiAqKg0KKw0KKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIDB4MDEwMw0KKw0KK0NGRz1kaW1lY2xudCAtIFdpbjMyIERlYnVnDQorIU1FU1NBR0UgRGllcyBpc3Qga2VpbiBn/Gx0aWdlcyBNYWtlZmlsZS4gWnVtIEVyc3RlbGxlbiBkaWVzZXMgUHJvamVrdHMgbWl0IE5NQUtFDQorIU1FU1NBR0UgdmVyd2VuZGVuIFNpZSBkZW4gQmVmZWhsICJNYWtlZmlsZSBleHBvcnRpZXJlbiIgdW5kIGb8aHJlbiBTaWUgZGVuIEJlZmVobA0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJkaW1lY2xudC5tYWsiLg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFNpZSBr9m5uZW4gYmVpbSBBdXNm/GhyZW4gdm9uIE5NQUtFIGVpbmUgS29uZmlndXJhdGlvbiBhbmdlYmVuDQorIU1FU1NBR0UgZHVyY2ggRGVmaW5pZXJlbiBkZXMgTWFrcm9zIENGRyBpbiBkZXIgQmVmZWhsc3plaWxlLiBadW0gQmVpc3BpZWw6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgImRpbWVjbG50Lm1hayIgQ0ZHPSJkaW1lY2xudCAtIFdpbjMyIERlYnVnIg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIEb8ciBkaWUgS29uZmlndXJhdGlvbiBzdGVoZW4genVyIEF1c3dhaGw6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgImRpbWVjbG50IC0gV2luMzIgUmVsZWFzZSIgKGJhc2llcmVuZCBhdWYgICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikNCishTUVTU0FHRSAiZGltZWNsbnQgLSBXaW4zMiBEZWJ1ZyIgKGJhc2llcmVuZCBhdWYgICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikNCishTUVTU0FHRSANCisNCisjIEJlZ2luIFByb2plY3QNCisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMA0KKyMgUFJPUCBTY2NfUHJvak5hbWUgIiINCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIg0KK0NQUD1jbC5leGUNCitSU0M9cmMuZXhlDQorDQorIUlGICAiJChDRkcpIiA9PSAiZGltZWNsbnQgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSINCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMA0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MNCisjIEFERCBCQVNFIFJTQyAvbCAweDQwNyAvZCAiTkRFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQwNyAvZCAiTkRFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NiAvb3V0OiIuL1JlbGVhc2UvZGltZWNsbnQuZXhlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJkaW1lY2xudCAtIFdpbjMyIERlYnVnIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgImRpbWVjbG50X19fV2luMzJfRGVidWciDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiZGltZWNsbnRfX19XaW4zMl9EZWJ1ZyINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgT3V0cHV0X0RpciAiRGVidWciDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIg0KKyMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvR1ogL2MNCisjIEFERCBDUFAgL25vbG9nbyAvTURkIC9XMyAvR20gL0dYIC9aaSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL0QgIkRFQlVHIiAvWVggL0ZEIC9HWiAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA3IC9kICJfREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDA3IC9kICJfREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdA0KKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvaW5jcmVtZW50YWw6bm8gL2RlYnVnIC9tYWNoaW5lOkkzODYgL291dDoiLi4vLi4vRGVidWcvZGltZWNsbnQuZXhlIiAvcGRidHlwZTpzZXB0DQorDQorIUVORElGIA0KKw0KKyMgQmVnaW4gVGFyZ2V0DQorDQorIyBOYW1lICJkaW1lY2xudCAtIFdpbjMyIFJlbGVhc2UiDQorIyBOYW1lICJkaW1lY2xudCAtIFdpbjMyIERlYnVnIg0KKyMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGRpbWUuaA0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gImRpbWVjbG50IC0gV2luMzIgUmVsZWFzZSINCisNCisjIFBST1AgSWdub3JlX0RlZmF1bHRfVG9vbCAxDQorIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBzb2FwY3BwMiAkKElucHV0UGF0aCkgLi4uDQorSW5wdXRQYXRoPS5cZGltZS5oDQorDQorQnVpbGRDbWRzPSBcDQorCXNvYXBjcHAyICQoSW5wdXRQYXRoKQ0KKw0KKyJzb2FwQy5jcHAiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiDQorICAgJChCdWlsZENtZHMpDQorDQorInNvYXBTZXJ2ZXIuY3BwIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIg0KKyAgICQoQnVpbGRDbWRzKQ0KKw0KKyJzb2FwSC5oIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIg0KKyAgICQoQnVpbGRDbWRzKQ0KKw0KKyJkaW1lLm5zbWFwIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIiAiJChPVVRESVIpIg0KKyAgICQoQnVpbGRDbWRzKQ0KKyMgRW5kIEN1c3RvbSBCdWlsZA0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJkaW1lY2xudCAtIFdpbjMyIERlYnVnIg0KKw0KKyMgUFJPUCBJZ25vcmVfRGVmYXVsdF9Ub29sIDENCisjIEJlZ2luIEN1c3RvbSBCdWlsZCAtIHNvYXBjcHAyICQoSW5wdXRQYXRoKSAuLi4NCitJbnB1dFBhdGg9LlxkaW1lLmgNCisNCitCdWlsZENtZHM9IFwNCisJc29hcGNwcDIgJChJbnB1dFBhdGgpDQorDQorInNvYXBDLmNwcCIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSINCisgICAkKEJ1aWxkQ21kcykNCisNCisic29hcFNlcnZlci5jcHAiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiDQorICAgJChCdWlsZENtZHMpDQorDQorInNvYXBILmgiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiDQorICAgJChCdWlsZENtZHMpDQorDQorImRpbWUubnNtYXAiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiDQorICAgJChCdWlsZENtZHMpDQorIyBFbmQgQ3VzdG9tIEJ1aWxkDQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGRpbWVjbGllbnQuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cc29hcDJzdHVmZi5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llxzb2FwQy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llxzb2FwQ2xpZW50LmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHdpbnN0dWZmLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llxzb2FwSC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cc29hcFN0dWIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEVuZCBUYXJnZXQNCisjIEVuZCBQcm9qZWN0DQpkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9zYW1wbGVzL2RpbWUvZGltZXNlcnZlci5jcHAgYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL3NhbXBsZXMvZGltZS9kaW1lc2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjU5YzVlCi0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9zYW1wbGVzL2RpbWUvZGltZXNlcnZlci5jcHAKQEAgLTAsMCArMSwxNDQgQEAKKy8qCWRpbWVzcnYuY3BwCisKKwlFeGFtcGxlIHNpbXBsZSBpbWFnZSBzZXJ2ZXIgdXNpbmcgRElNRSwKKwlBZGFwdGVkIGJ5IENoLiBBYmVyZ2VyIHRvIGRlbW9uc3RyYXRlIGRpbWUgZm9yIFdpbjMyIElJUy4gCisJQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCUNvcHlyaWdodCAoQykgMjAwMyBDaHJpc3RpYW4gVC4gQWJlcmdlci4KKworCVJ1bnMgYXMgbW9kX2dzb2FwIChodHRwOi8vd3d3LmFiZXJnZXIuYXQvU09BUCkgYXMgSUlTIFNPQVAgc2VydmljZQorCVdlYiBzZXJ2aWNlCisKKwlOT1RFOiBUSEUgU0VSVkVSIFdJTEwgT05MWSBTRU5EIEZJTEVTIFRIQVQgQVJFIElOIFRIRSBDVVJSRU5UIERJUiBGT1IKKwlTRUNVUklUWSBSRUFTT05TLiBIT1dFVkVSLCBUSEUgQVVUSE9SIElTIE5PVCBSRVNQT05TSUJMRSBGT1IgQU5ZIERBTUFHRVMKKwlUSEFUIE1BWSBSRVNVTFQgRlJPTSBUSEUgVVNFIE9GIFRISVMgUFJPR1JBTS4KKwlBTkQgQUxTTyBBQkVSR0VSIElTIFJFU1BPTlNJQkxFIEZPUiBOT1RISU5HLgorKi8KKworI2luY2x1ZGUgInNvYXBILmgiCisjaW5jbHVkZSAiZGltZS5uc21hcCIKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgkvLyB1c2UgZnN0YXQoKSBmb3Igc3RyZWFtaW5nIERJTUUKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgkJLy8gRXhjbHVkZSByYXJlbHktdXNlZCBzdHVmZiBmcm9tIFdpbmRvd3MgaGVhZGVycworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI2RlZmluZSBNQVhfRklMRV9TSVpFICgxMDAwMCkJLy8gTWF4LiBmaWxlIHNpemUKKworLy8gc3RyZWFtaW5nIERJTUUgY2FsbGJhY2tzIGZvciBzZW5kaW5nIGRhdGEgdG8gY2xpZW50Lgorc3RhdGljIHZvaWQgKmRpbWVfcmVhZF9vcGVuKHN0cnVjdCBzb2FwKiwgdm9pZCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworc3RhdGljIHZvaWQgZGltZV9yZWFkX2Nsb3NlKHN0cnVjdCBzb2FwKiwgdm9pZCopOworc3RhdGljIHNpemVfdCBkaW1lX3JlYWQoc3RydWN0IHNvYXAqLCB2b2lkKiwgY2hhciosIHNpemVfdCk7CisKKy8vIHN0cmVhbWluZyBESU1FIGNhbGxiYWNrcyBmb3IgcmVjZWl2aW5nIGRhdGEgZnJvbSBjbGllbnQuCitzdGF0aWMgdm9pZCAqZGltZV93cml0ZV9vcGVuKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitzdGF0aWMgdm9pZCBkaW1lX3dyaXRlX2Nsb3NlKHN0cnVjdCBzb2FwKiwgdm9pZCopOworc3RhdGljIGludCBkaW1lX3dyaXRlKHN0cnVjdCBzb2FwKiwgdm9pZCosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworCisKK2V4dGVybiAiQyIgeworCisvKiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgbW9kX2dzb2FwIGFmdGVyIHRoZSBkbGwgd2FzIHN1Y2Nlc3NmdWxseSBsb2FkZWQgYW5kIGJlZm9yZSBwcm9jZXNzaW5nIGJlZ2lucy4KKwlZb3UgY2FuIGRvIGFueSBvbmUtdGltZSBpbml0aWFsaXphdGlvbiBoZXJlLgorKi8KK2ludCBtb2RfZ3NvYXBfaW5pdCgpIHsKKwkvLyB0b2RvOiBhZGQgeW91ciBpbml0aWFsaXphdGlvbiBjb2RlIGhlcmUgCisJcmV0dXJuIFNPQVBfT0s7Cit9CisvKiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgYWxsIHByb2Nlc3Npbmcgd2FzIGRvbmUgYmVmb3JlIGRsbCBpcyB1bmxvYWRlZC4KKwlZb3UgY2FuIGRvIGFueSBjbGVhbnVwIGhlcmUuCisqLworaW50IG1vZF9nc29hcF90ZXJtaW5hdGUoKSB7CisJLy8gdG9kbzogYWRkIHlvdXIgdGVybWluYXRpb24gY29kZSBoZXJlIAorCXJldHVybiBTT0FQX09LOworfQorCit9CisKKworaW50IG5zX19nZXRJbWFnZShzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqbmFtZSwgeHNkX19iYXNlNjRCaW5hcnkgJmltYWdlKSB7IAorCS8qIGluIHRoaXMgc2FtcGxlLCBkdWUgdG8gc2VjdXJpdHkgcmVhc29ucyB0aGUgZmlsZSBtdXN0IGJlIGluIHRoZSBzeXN0ZW0ncyAlVEVNUCUgZm9sZGVyICovCisJVENIQVIgc3pQYXRoW19NQVhfUEFUSF07CisJaWYgKDAgPT0gOjpHZXRUZW1wUGF0aChzaXplb2Ygc3pQYXRoLCBzelBhdGgpKSB7CisJCXJldHVybiBzb2FwX3JlY2VpdmVyX2ZhdWx0KHNvYXAsICJjYW5ub3QgZmluZCB0aGUgVEVNUCBmb2xkZXIiLCBOVUxMKTsKKwl9CisJaWYgKG5hbWUpIHsgCisJCUZJTEUgKmZkID0gTlVMTDsKKwkJLy8gZG8gc29tZSBjaGVja3Mgb24gdGhlIGZpbGUgbmFtZSB0byB2ZXJpZnkgaXQgaXMgbG9jYWw6CisJCWlmICghc3RyY2hyKG5hbWUsICcvJykgJiYgIXN0cmNocihuYW1lLCAnXFwnKSAmJiAhc3RyY2hyKG5hbWUsICc6JykpIHsKKwkJCXN0cmNhdChzelBhdGgsIG5hbWUpOworCQkJZmQgPSBmb3BlbihzelBhdGgsICJyYiIpOworCQl9CisJCWlmICghZmQpIHsKKwkJCWNoYXIgc3pNc2dbTUFYX1BBVEggKyA2NF07CisJCQlzdHJjcHkoc3pNc2csICJDYW5ub3Qgb3BlbiBmaWxlOiAiKTsKKwkJCXN0cmNhdChzek1zZywgc3pQYXRoKTsKKwkJCXJldHVybiBzb2FwX3JlY2VpdmVyX2ZhdWx0KHNvYXAsIHN6TXNnLCBOVUxMKTsKKwkJfQorCQlzdHJ1Y3Qgc3RhdCBzYjsKKwkJaWYgKCFmc3RhdChmaWxlbm8oZmQpLCAmc2IpICYmIHNiLnN0X3NpemUgPiAwKSB7IC8vIHNpbmNlIHdlIGNhbiBnZXQgdGhlIGxlbmd0aCBvZiB0aGUgZmlsZSwgd2UgY2FuIHN0cmVhbSBpdAorCQkgIHNvYXAtPmZkaW1lcmVhZG9wZW4gPSBkaW1lX3JlYWRfb3BlbjsKKwkJICBzb2FwLT5mZGltZXJlYWRjbG9zZSA9IGRpbWVfcmVhZF9jbG9zZTsKKwkJICBzb2FwLT5mZGltZXJlYWQgPSBkaW1lX3JlYWQ7CisJCSAgaW1hZ2UuX19wdHIgPSAodW5zaWduZWQgY2hhciopZmQ7IC8vIG11c3Qgc2V0IHRvIG5vbi1OVUxMICh0aGlzIGlzIG91ciBmZCBoYW5kbGUgd2hpY2ggd2UgbmVlZCBpbiB0aGUgY2FsbGJhY2tzKQorCQkgIGltYWdlLl9fc2l6ZSA9IHNiLnN0X3NpemU7IC8vIG11c3Qgc2V0IHNpemUKKwkJfSBlbHNlIHsgLy8gZG9uJ3Qga25vdyB0aGUgc2l6ZSwgc28gYnVmZmVyIGl0CisJCQlpbWFnZS5fX3B0ciA9ICh1bnNpZ25lZCBjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBNQVhfRklMRV9TSVpFKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0ZJTEVfU0laRTsgaSsrKSB7CisJCQkJaW50IGM7CisJCQkJaWYgKChjID0gZmdldGMoZmQpKSA9PSBFT0YpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWltYWdlLl9fcHRyW2ldID0gYzsKKwkJCX0KKwkJCWZjbG9zZShmZCk7CisJCQlpbWFnZS5fX3NpemUgPSBpOworCQl9CisJICAgIGltYWdlLnR5cGUgPSAiaW1hZ2UvanBlZyI7CisJCWltYWdlLm9wdGlvbnMgPSBzb2FwX2RpbWVfb3B0aW9uKHNvYXAsIDAsICJNeSBwaWN0dXJlIik7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHNvYXBfcmVjZWl2ZXJfZmF1bHQoc29hcCwgIk5hbWUgcmVxdWlyZWQiLCBOVUxMKTsKKwl9CisJcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKiBzYXZlIGEgZmlsZSBzZW50IGJ5IHRoZSBjbGllbnQgdG8gb3VyIHNlcnZlciAqLworc3RhdGljIHZvaWQgKmRpbWVfcmVhZF9vcGVuKHN0cnVjdCBzb2FwICpzb2FwLCB2b2lkICpoYW5kbGUsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICpvcHRpb25zKQoreyAvLyB3ZSBzaG91bGQgcmV0dXJuIE5VTEwgd2l0aG91dCBzZXR0aW5nIHNvYXAtPmVycm9yIGlmIHdlIGRvbid0IHdhbnQgdG8gdXNlIHRoZSBzdHJlYW1pbmcgY2FsbGJhY2sgZm9yIHRoaXMgRElNRSBhdHRhY2htZW50LiBUaGUgaGFuZGxlIGNvbnRhaW5zIHRoZSBub24tTlVMTCBfX3B0ciBmaWVsZCB2YWx1ZSB3aGljaCBzaG91bGQgaGF2ZSBiZWVuIHNldCBpbiB0aGUgYXBwbGljYXRpb24uCisgIC8vIHRoZSB2YWx1ZSBvZiB0aGUgaGFuZGxlIGNhbiBiZSBjaGFuZ2VkIGFuZCB3aWxsIGJlIHBhc3NlZCBvbiB0byB0aGUgZmRpbWVyZWFkIGFuZCBmZGltZXJlYWRjbG9zZSBjYWxsYmFja3MuIFRoZSB2YWx1ZSB3aWxsIG5vdCBhZmZlY3QgdGhlIF9fcHRyIGZpZWxkLgorICByZXR1cm4gaGFuZGxlOworfQorCitzdGF0aWMgdm9pZCBkaW1lX3JlYWRfY2xvc2Uoc3RydWN0IHNvYXAgKnNvYXAsIHZvaWQgKmhhbmRsZSkKK3sgZmNsb3NlKChGSUxFKiloYW5kbGUpOworfQorCitzdGF0aWMgc2l6ZV90IGRpbWVfcmVhZChzdHJ1Y3Qgc29hcCAqc29hcCwgdm9pZCAqaGFuZGxlLCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7IHJldHVybiBmcmVhZChidWYsIDEsIGxlbiwgKEZJTEUqKWhhbmRsZSk7Cit9CisKK2ludCBuc19fcHV0SW1hZ2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKm5hbWUsIHhzZF9fYmFzZTY0QmluYXJ5ICppbWFnZSwgaW50ICZzdGF0dXMpIHsgCisJaW50IG5SZXQgPSBTT0FQX09LOworCVRDSEFSIHN6UGF0aFtfTUFYX1BBVEhdOworCWlmICgwID09IDo6R2V0VGVtcFBhdGgoc2l6ZW9mIHN6UGF0aCwgc3pQYXRoKSkgeworCQlyZXR1cm4gc29hcF9yZWNlaXZlcl9mYXVsdChzb2FwLCAiY2Fubm90IGZpbmQgdGhlIFRFTVAgZm9sZGVyIiwgTlVMTCk7CisJfQorCXN0cmNhdChzelBhdGgsICJ1cGxvYWQiKTsKKwlpZiAoSU5WQUxJRF9GSUxFX0FUVFJJQlVURVMgPT0gOjpHZXRGaWxlQXR0cmlidXRlcyhzelBhdGgpKSB7CisJCTo6Q3JlYXRlRGlyZWN0b3J5KHN6UGF0aCwgTlVMTCk7IC8vIGNyZWF0ZSBpdCBpZiBpdCBhaW4ndCBleGlzdC4KKwkJaWYgKElOVkFMSURfRklMRV9BVFRSSUJVVEVTID09IDo6R2V0RmlsZUF0dHJpYnV0ZXMoc3pQYXRoKSkgeworCQkJcmV0dXJuIHNvYXBfcmVjZWl2ZXJfZmF1bHQoc29hcCwgIkZhaWxlZCB0byBjcmVhdGUgb3V0cHV0IGRpcmVjdG9yeSIsIHN6UGF0aCk7CisJCX0KKwl9CisJc3RyY2F0KHN6UGF0aCwgIlxcIik7CisJc3RyY2F0KHN6UGF0aCwgbmFtZSk7CisJRklMRSAqZnAgPSBmb3BlbihzelBhdGgsICJ3YiIpOworCXN0YXR1cyA9IDA7CisJaWYgKE5VTEwgIT0gZnApIHsKKwkJc3RhdHVzID0gZndyaXRlKGltYWdlLT5fX3B0ciwgc2l6ZW9mKGNoYXIpLCBpbWFnZS0+X19zaXplLCBmcCk7CisJCWZjbG9zZShmcCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHNvYXBfcmVjZWl2ZXJfZmF1bHQoc29hcCwgIkZhaWxlZCB0byBvcGVuIG91dHB1dCBmaWxlIiwgc3pQYXRoKTsKKwl9CisJaWYgKHN0YXR1cyAhPSBpbWFnZS0+X19zaXplKSB7CisJCXJldHVybiBzb2FwX3JlY2VpdmVyX2ZhdWx0KHNvYXAsICJGYWlsZWQgdG8gd3JpdGUgYWxsIGJ5dGVzIHRvIGZpbGUuIiwgc3pQYXRoKTsKKwl9CisJcmV0dXJuIFNPQVBfT0s7Cit9CmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL3NhbXBsZXMvZGltZS9zb2FwMnN0dWZmLmNwcCBiL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvc2FtcGxlcy9kaW1lL3NvYXAyc3R1ZmYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YzQyNjIKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL3NhbXBsZXMvZGltZS9zb2FwMnN0dWZmLmNwcApAQCAtMCwwICsxLDM2IEBACisvKiogZmlsZSB0byBpbmNsdWRlIHN0ZHNvYXAyLmNwcCBoZXJlLCB0byBnZXQgYXJvdW5kIGRpcmVjdG9yeSBsb2NhdGlvbiBwcm9ibGVtcyBldGMuCisqLworCisvKiBZb3UgbXVzdCBzZXQgdGhlIGluY2x1ZGUgcGF0aCBpbiBWaXN1YWwgU3R1ZGlvIHVuZGVyIHRvb2xzfG9wdGlvbnN8ZGlyZWN0b3JpZXN8aW5jbHVkZSBhbndheS4gCisgICBUaGVyZSBhbHNvIHRoZSBmaWxlIGJlbG93IGNhbiBiZSBmb3VuZC4KKyovCisjaW5jbHVkZSAic3Rkc29hcDIuY3BwIgorCisjaW5jbHVkZSAic29hcEguaCIKKworeHNkX19iYXNlNjRCaW5hcnk6OnhzZF9fYmFzZTY0QmluYXJ5KCkgCit7IAorICAgX19wdHIgPSBOVUxMOyAKKyAgIF9fc2l6ZSA9IDA7IAorICAgaWQgPSBOVUxMOworICAgdHlwZSA9IE5VTEw7CisgICBvcHRpb25zID0gTlVMTDsKK30gCit4c2RfX2Jhc2U2NEJpbmFyeTo6eHNkX19iYXNlNjRCaW5hcnkoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuKSAKK3sgCisgICBfX3B0ciA9ICh1bnNpZ25lZCBjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBuKTsgCisgICBfX3NpemUgPSBuOyAKKyAgIGlkID0gTlVMTDsKKyAgIHR5cGUgPSBOVUxMOworICAgb3B0aW9ucyA9IE5VTEw7Cit9IAoreHNkX19iYXNlNjRCaW5hcnk6On54c2RfX2Jhc2U2NEJpbmFyeSgpIAoreyB9IAordW5zaWduZWQgY2hhciAqeHNkX19iYXNlNjRCaW5hcnk6OmxvY2F0aW9uKCkgCit7IAorICAgcmV0dXJuIF9fcHRyOyAKK30gCitpbnQgeHNkX19iYXNlNjRCaW5hcnk6OnNpemUoKSAKK3sgCisgICByZXR1cm4gX19zaXplOyAKK30gCmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL3NhbXBsZXMvZGltZS9zdGRzb2FwMi5kZWYgYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL3NhbXBsZXMvZGltZS9zdGRzb2FwMi5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdiZTFiOQotLS0gL2Rldi9udWxsCisrKyBiL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvc2FtcGxlcy9kaW1lL3N0ZHNvYXAyLmRlZgpAQCAtMCwwICsxLDE2IEBACis7IHNvYXBjcHAyLmRlZiA6IERlY2xhcmVzIHRoZSBtb2R1bGUgcGFyYW1ldGVycyBmb3IgYSBnc29hcCBzZXJ2ZXIgRExMLgorCitERVNDUklQVElPTiAgJ2dvc2FwIHNlcnZlciBkbGwnCisKK0VYUE9SVFMKKyAgICA7IHdlIG11c3QgZXhwb3J0IHdoYXQgdGhlIGdzb2FwIGlzYXBpIGV4dGVuc2lvbiBuZWVkcyBmb3IgbG9hZGluZyB1cyBhbmQgd29ya2luZyB3aXRoIHVzLgorCXNvYXBfaW5pdAlQUklWQVRFCisJc29hcF9zZXJ2ZSAgUFJJVkFURQorCXNvYXBfZGVsZXRlIFBSSVZBVEUKKwlzb2FwX2RvbmUJUFJJVkFURQorCXNvYXBfZW5kCVBSSVZBVEUKKwlzb2FwX3JlZ2lzdGVyX3BsdWdpbl9hcmcgUFJJVkFURQorCXNvYXBfbG9va3VwX3BsdWdpbiBQUklWQVRFCisJCisJbW9kX2dzb2FwX2luaXQgUFJJVkFURSAgICAgIDsgaW5pdGlhbGl6ZXIgY2FsbGVkIGJlZm9yZSBsb2FkaW5nCisJbW9kX2dzb2FwX3Rlcm1pbmF0ZSBQUklWQVRFIDsgY2FsbGVkIGJlZm9yZSB1cGxvYWRpbmcgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9zYW1wbGVzL2RpbWUvd2luc3R1ZmYuY3BwIGIvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9zYW1wbGVzL2RpbWUvd2luc3R1ZmYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ODFjZjcKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL2lzYXBpL3NhbXBsZXMvZGltZS93aW5zdHVmZi5jcHAKQEAgLTAsMCArMSwyOCBAQAorLy8gd2luc3R1ZmYuY3BwIDogRGVmaW5lcyB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBETEwgYXBwbGljYXRpb24uCisvLworCisKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgkJLy8gRXhjbHVkZSByYXJlbHktdXNlZCBzdHVmZiBmcm9tIFdpbmRvd3MgaGVhZGVycworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDx3aW5zb2NrMi5oPgorCisKKyNpZiBfTVNDX1ZFUiA+IDEwMDAKKyNwcmFnbWEgY29tbWVudChsaWIsICJ3c29jazMyIikKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IFdTQUluaXQgeyBcCisgICAgICAgIFdTQURBVEEgV3NhRGF0YTsgXAorICAgICAgICBXU0FJbml0KCkge1dTQVN0YXJ0dXAoMHgwMTAxLCAmV3NhRGF0YSk7fSBcCisgICAgICAgIH5XU0FJbml0KCkge1dTQUNsZWFudXAoKTt9IFwKK30gV3NhSW5pdDsKKworCisvKiogTWFpbiBlbnRyeSBwb2ludCB3aGVuIGRsbCBpcyBsb2FkZWQgb3IgYSB0aHJlYWQgaXMgYXR0YWNoZWQuIAorCVdlbGwsIGl0cyB3aW5kb3plLiBTbyBkb24ndCByZWx5IG9uIERsbE1haW4gdG8gYmUgY2FsbGVkIGF0IGV2ZXJ5IG5ldyB0aHJlYWQgdXNpbmcgeW91ciBzZXJ2ZXIuCisJSUlTIGhhcyBhIHRocmVhZCBwb29sIGFuZCBpZiB5b3UgZ2V0IHVzZWQgaW4gYSBwb29sZWQgdGhyZWFkIGZvciB0aGUgZmlyc3QgdGltZSB5b3Ugd2lsbCBtaXNzIHRoZSB0aHJlYWQgYXR0YWNoIG5vdGlmaWNhdGlvbi4KKyovCitCT09MIEFQSUVOVFJZIERsbE1haW4oSEFORExFIGhNb2R1bGUsIERXT1JEICB1bF9yZWFzb25fZm9yX2NhbGwsIExQVk9JRCBscFJlc2VydmVkKSB7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKZGlmZiAtLWdpdCBhL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvc2FtcGxlcy9zYW1wbGVzLm1hayBiL21vZF9nc29hcC9nc29hcF93aW4vaXNhcGkvc2FtcGxlcy9zYW1wbGVzLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGMxYjkwCi0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL2dzb2FwX3dpbi9pc2FwaS9zYW1wbGVzL3NhbXBsZXMubWFrCkBAIC0wLDAgKzEsMTIgQEAKKworCithbGw6CisJZWNobyBkb25lLgorCitjbGVhbjoKKwljZCBjYWxjCisJCSQoTUFLRSkgY2xlYW4KKwljZCAuLgorCWNkIGRpbWUKKwkJJChNQUtFKSBjbGVhbgorCWNkIC4uCmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvZ3NvYXBfd2luL3dpbmluZXQvZ3NvYXBXaW5JbmV0LmNwcCBiL21vZF9nc29hcC9nc29hcF93aW4vd2luaW5ldC9nc29hcFdpbkluZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NWYyYTcKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL3dpbmluZXQvZ3NvYXBXaW5JbmV0LmNwcApAQCAtMCwwICsxLDEwNzEgQEAKKy8qCisgKiBGaWxlOiAgICBnc29hcFdpbkluZXQuY3BwCisgKgorICogIFNlZSB0aGUgaGVhZGVyIGZpbGUgZm9yIGRldGFpbHMuCisgKgorICogUmVkaXN0cmlidXRpb246IAorICogICAgICAgICAgRmVlbCBmcmVlIHRvIHVzZSwgaW1wcm92ZSwgYW5kIHNoYXJlLiAgSSB3b3VsZCBhcHByZWNpYXRlIAorICogICAgICAgICAgbm90aWZpY2F0aW9uIG9mIGFueSBidWdzIGZvdW5kL2ZpeGVkLCBvciBpbXByb3ZlbWVudHMgbWFkZS4gVGhpcyAKKyAqICAgICAgICAgIGNvZGUgaGFzIG5vdCBiZWVuIGV4dGVuc2l2ZWx5IHRlc3RlZCwgc28gdXNlIGF0IHlvdXIgb3duIHJpc2suICAKKyAqLworCisvKiBzeXN0ZW0gKi8KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8Y3J0ZGJnLmg+CisjaW5jbHVkZSA8d2luaW5ldC5oPgorCisvKiBnc29hcCAqLworI2luY2x1ZGUgPHN0ZHNvYXAyLmg+CisKKy8qIGxvY2FsICovCisjaW5jbHVkZSAiZ3NvYXBXaW5JbmV0LmgiCisKKy8qIGVuc3VyZSB0aGF0IHRoZSB3aW5pbmV0IGxpYnJhcnkgaXMgbGlua2VkICovCisjcHJhZ21hIGNvbW1lbnQoIGxpYiwgIndpbmluZXQubGliIiApCisKKyNkZWZpbmUgVU5VU0VEX0FSRyh4KSAgICAgICAgICAgKHgpCisjZGVmaW5lIElOVkFMSURfQlVGRkVSX0xFTkdUSCAgKChEV09SRCktMSkKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBEV09SRF9QVFI7CisKKy8qIHBsdWdpbiBpZCAqLworc3RhdGljIGNvbnN0IGNoYXIgd2luaW5ldF9pZFtdID0gIndpbmluZXQtMi4wIjsKKworLyogcGx1Z2luIHByaXZhdGUgZGF0YSAqLworc3RydWN0IHdpbmluZXRfZGF0YQoreworICAgIEhJTlRFUk5FVCAgICAgICAgICAgaEludGVybmV0OyAgICAgICAgICAvKiBpbnRlcm5ldCBzZXNzaW9uIGhhbmRsZSAqLworICAgIEhJTlRFUk5FVCAgICAgICAgICAgaENvbm5lY3Rpb247ICAgICAgICAvKiBjdXJyZW50IGNvbm5lY3Rpb24gaGFuZGxlICovCisgICAgQk9PTCAgICAgICAgICAgICAgICBiRGlzY29ubmVjdDsgICAgICAgIC8qIGNvbm5lY3Rpb24gaXMgZGlzY29ubmVjdGVkICovCisgICAgRFdPUkQgICAgICAgICAgICAgICBkd1JlcXVlc3RGbGFnczsgICAgIC8qIGV4dHJhIHJlcXVlc3QgZmxhZ3MgZnJvbSB1c2VyICovCisgICAgY2hhciAqICAgICAgICAgICAgICBwQnVmZmVyOyAgICAgICAgICAgIC8qIHNlbmQgYnVmZmVyICovCisgICAgc2l6ZV90ICAgICAgICAgICAgICB1aUJ1ZmZlckxlbk1heDsgICAgIC8qIHRvdGFsIGxlbmd0aCBvZiB0aGUgbWVzc2FnZSAqLworICAgIHNpemVfdCAgICAgICAgICAgICAgdWlCdWZmZXJMZW47ICAgICAgICAvKiBsZW5ndGggb2YgZGF0YSBpbiBidWZmZXIgKi8KKyAgICBCT09MICAgICAgICAgICAgICAgIGJJc0NodW5rU2l6ZTsgICAgICAgLyogZXhwZWN0aW5nIGEgY2h1bmsgc2l6ZSBidWZmZXIgKi8KKyNpZmRlZiBTT0FQX0RFQlVHCisgICAgLyogdGhpcyBpcyBvbmx5IHVzZWQgZm9yIERCR0xPRyBvdXRwdXQgKi8KKyAgICBjaGFyICogICAgICAgICAgICAgIHBzekVycm9yTWVzc2FnZTsgICAgLyogd2luaW5ldC9zeXN0ZW0gZXJyb3IgbWVzc2FnZSAqLworI2VuZGlmCit9OworCisvKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworc3RhdGljIEJPT0wKK3dpbmluZXRfaW5pdCgKKyAgICBzdHJ1Y3Qgc29hcCAqICAgICAgICAgICBzb2FwLCAKKyAgICBzdHJ1Y3Qgd2luaW5ldF9kYXRhICogICBhX3BEYXRhLAorICAgIERXT1JEICAgICAgICAgICAgICAgICAgIGFfZHdSZXF1ZXN0RmxhZ3MgKTsKK3N0YXRpYyBpbnQgIAord2luaW5ldF9jb3B5KCAKKyAgICBzdHJ1Y3Qgc29hcCAqICAgICAgICAgICBzb2FwLCAKKyAgICBzdHJ1Y3Qgc29hcF9wbHVnaW4gKiAgICBhX3BEc3QsIAorICAgIHN0cnVjdCBzb2FwX3BsdWdpbiAqICAgIGFfcFNyYyApOworc3RhdGljIHZvaWQgCit3aW5pbmV0X2RlbGV0ZSggCisgICAgc3RydWN0IHNvYXAgKiAgICAgICAgICAgc29hcCwgCisgICAgc3RydWN0IHNvYXBfcGx1Z2luICogICAgYV9wUGx1Z2luRGF0YSApOworc3RhdGljIGludCAgCit3aW5pbmV0X2Nvbm5lY3QoIAorICAgIHN0cnVjdCBzb2FwICogICBzb2FwLCAKKyAgICBjb25zdCBjaGFyICogICAgYV9wc3pFbmRwb2ludCwgCisgICAgY29uc3QgY2hhciAqICAgIGFfcHN6SG9zdCwgCisgICAgaW50ICAgICAgICAgICAgIGFfblBvcnQgKTsKK3N0YXRpYyBpbnQgCit3aW5pbmV0X3Bvc3RfaGVhZGVyKAorICAgIHN0cnVjdCBzb2FwICogICBzb2FwLCAKKyAgICBjb25zdCBjaGFyICogICAgYV9wc3pLZXksIAorICAgIGNvbnN0IGNoYXIgKiAgICBhX3BzelZhbHVlICk7CitzdGF0aWMgaW50IAord2luaW5ldF9mc2VuZCggCisgICAgc3RydWN0IHNvYXAgKiAgIHNvYXAsIAorICAgIGNvbnN0IGNoYXIgKiAgICBhX3BCdWZmZXIsIAorICAgIHNpemVfdCAgICAgICAgICBhX3VpQnVmZmVyTGVuICk7CitzdGF0aWMgc2l6ZV90IAord2luaW5ldF9mcmVjdigKKyAgICBzdHJ1Y3Qgc29hcCAqICAgc29hcCwgCisgICAgY2hhciAqICAgICAgICAgIGFfcEJ1ZmZlciwgCisgICAgc2l6ZV90ICAgICAgICAgIGFfdWlCdWZmZXJMZW4gKTsKK3N0YXRpYyBpbnQgCit3aW5pbmV0X2Rpc2Nvbm5lY3QoIAorICAgIHN0cnVjdCBzb2FwICogICBzb2FwICk7Cit2b2lkIENBTExCQUNLCit3aW5pbmV0X2NhbGxiYWNrKAorICAgIEhJTlRFUk5FVCAgIGhJbnRlcm5ldCwKKyAgICBEV09SRF9QVFIgICBkd0NvbnRleHQsCisgICAgRFdPUkQgICAgICAgZHdJbnRlcm5ldFN0YXR1cywKKyAgICBMUFZPSUQgICAgICBscHZTdGF0dXNJbmZvcm1hdGlvbiwKKyAgICBEV09SRCAgICAgICBkd1N0YXR1c0luZm9ybWF0aW9uTGVuZ3RoICk7CitzdGF0aWMgQk9PTAord2luaW5ldF9oYXZlX2Nvbm5lY3Rpb24oCisgICAgc3RydWN0IHNvYXAgKiAgICAgICAgICAgc29hcCwKKyAgICBzdHJ1Y3Qgd2luaW5ldF9kYXRhICogICBhX3BEYXRhICk7CitzdGF0aWMgRFdPUkQKK3dpbmluZXRfc2V0X3RpbWVvdXQoCisgICAgc3RydWN0IHNvYXAgKiAgICAgICAgICAgc29hcCwgCisgICAgc3RydWN0IHdpbmluZXRfZGF0YSAqICAgYV9wRGF0YSwKKyAgICBjb25zdCBjaGFyICogICAgICAgICAgICBhX3BzelRpbWVvdXQsCisgICAgRFdPUkQgICAgICAgICAgICAgICAgICAgYV9kd09wdGlvbiwKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBhX25UaW1lb3V0ICk7CitzdGF0aWMgQk9PTAord2luaW5ldF9yZXNvbHZlX3NlbmRfZXJyb3IoIAorICAgIEhJTlRFUk5FVCAgIGFfaEh0dHBSZXF1ZXN0LCAKKyAgICBEV09SRCAgICAgICBhX2R3RXJyb3JDb2RlICk7CisKKyNpZmRlZiBTT0FQX0RFQlVHCisvKiB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgREJHTE9HIG91dHB1dCAqLworc3RhdGljIGNvbnN0IGNoYXIgKgord2luaW5ldF9lcnJvcl9tZXNzYWdlKAorICAgIHN0cnVjdCBzb2FwICogICBhX3BEYXRhLAorICAgIERXT1JEICAgICAgICAgICBhX2R3RXJyb3JNc2dJZCApOworc3RhdGljIHZvaWQKK3dpbmluZXRfZnJlZV9lcnJvcl9tZXNzYWdlKAorICAgIHN0cnVjdCB3aW5pbmV0X2RhdGEgKiAgIGFfcERhdGEgKTsKKyNlbHNlCisjZGVmaW5lIHdpbmluZXRfZnJlZV9lcnJvcl9tZXNzYWdlKHgpCisjZW5kaWYKKworLyogcGx1Z2luIHJlZ2lzdHJhdGlvbiAqLworaW50IAord2luaW5ldF9wbHVnaW4oIAorICAgIHN0cnVjdCBzb2FwICogICAgICAgICAgIHNvYXAsIAorICAgIHN0cnVjdCBzb2FwX3BsdWdpbiAqICAgIGFfcFBsdWdpbkRhdGEsIAorICAgIHZvaWQgKiAgICAgICAgICAgICAgICAgIGFfZHdSZXF1ZXN0RmxhZ3MgKQoreworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAKKyAgICAgICAgIndpbmluZXQgJXA6IHBsdWdpbiByZWdpc3RyYXRpb25cbiIsIHNvYXAgKSk7CisKKyAgICBhX3BQbHVnaW5EYXRhLT5pZCAgICAgICAgPSB3aW5pbmV0X2lkOworICAgIGFfcFBsdWdpbkRhdGEtPmZjb3B5ICAgICA9IHdpbmluZXRfY29weTsKKyAgICBhX3BQbHVnaW5EYXRhLT5mZGVsZXRlICAgPSB3aW5pbmV0X2RlbGV0ZTsKKyAgICBhX3BQbHVnaW5EYXRhLT5kYXRhICAgICAgPSAodm9pZCopIG1hbGxvYyggc2l6ZW9mKHN0cnVjdCB3aW5pbmV0X2RhdGEpICk7CisgICAgaWYgKCAhYV9wUGx1Z2luRGF0YS0+ZGF0YSApCisgICAgeworICAgICAgICByZXR1cm4gU09BUF9FT007CisgICAgfQorICAgIGlmICggIXdpbmluZXRfaW5pdCggc29hcCwgCisgICAgICAgIChzdHJ1Y3Qgd2luaW5ldF9kYXRhICopIGFfcFBsdWdpbkRhdGEtPmRhdGEsIAorICAgICAgICAoRFdPUkQpIGFfZHdSZXF1ZXN0RmxhZ3MgKSApCisgICAgeworICAgICAgICBmcmVlKCBhX3BQbHVnaW5EYXRhLT5kYXRhICk7CisgICAgICAgIHJldHVybiBTT0FQX0VPTTsKKyAgICB9CisKKyNpZmRlZiBTT0FQX0RFQlVHCisgICAgaWYgKCAoc29hcC0+b21vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX1NUT1JFICkKKyAgICB7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAKKyAgICAgICAgICAgICJ3aW5pbmV0ICVwOiB1c2Ugb2YgU09BUF9JT19TVE9SRSBpcyBub3QgcmVjb21tZW5kZWRcbiIsIHNvYXAgKSk7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gU09BUF9PSzsKK30KKworLyogaW5pdGlhbGl6ZSBwcml2YXRlIGRhdGEgKi8KK3N0YXRpYyBCT09MCit3aW5pbmV0X2luaXQoCisgICAgc3RydWN0IHNvYXAgKiAgICAgICAgICAgc29hcCwgCisgICAgc3RydWN0IHdpbmluZXRfZGF0YSAqICAgYV9wRGF0YSwKKyAgICBEV09SRCAgICAgICAgICAgICAgICAgICBhX2R3UmVxdWVzdEZsYWdzICkKK3sKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgCisgICAgICAgICJ3aW5pbmV0ICVwOiBpbml0IHByaXZhdGUgZGF0YVxuIiwgc29hcCApKTsKKworICAgIG1lbXNldCggYV9wRGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCB3aW5pbmV0X2RhdGEpICk7CisgICAgYV9wRGF0YS0+ZHdSZXF1ZXN0RmxhZ3MgPSBhX2R3UmVxdWVzdEZsYWdzOworCisgICAgLyogc3RhcnQgb3VyIGludGVybmV0IHNlc3Npb24gKi8KKyAgICBhX3BEYXRhLT5oSW50ZXJuZXQgPSBJbnRlcm5ldE9wZW5BKCAKKyAgICAgICAgImdTT0FQIiwgSU5URVJORVRfT1BFTl9UWVBFX1BSRUNPTkZJRywgTlVMTCwgTlVMTCwgMCApOworICAgIGlmICggIWFfcERhdGEtPmhJbnRlcm5ldCApCisgICAgeworICAgICAgICBzb2FwLT5lcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgCisgICAgICAgICAgICAid2luaW5ldCAlcDogaW5pdCwgZXJyb3IgJWQgKCVzKSBpbiBJbnRlcm5ldE9wZW5cbiIsIAorICAgICAgICAgICAgc29hcCwgc29hcC0+ZXJyb3IsIHdpbmluZXRfZXJyb3JfbWVzc2FnZShzb2FwLHNvYXAtPmVycm9yKSApKTsKKyAgICAgICAgd2luaW5ldF9mcmVlX2Vycm9yX21lc3NhZ2UoIGFfcERhdGEgKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8qIHNldCB0aGUgdGltZW91dHMsIGlmIGFueSBvZiB0aGVzZSBmYWlsIHRoZSBlcnJvciBpc24ndCBmYXRhbCAqLworICAgIHdpbmluZXRfc2V0X3RpbWVvdXQoIHNvYXAsIGFfcERhdGEsICJjb25uZWN0IiwgCisgICAgICAgIElOVEVSTkVUX09QVElPTl9DT05ORUNUX1RJTUVPVVQsIHNvYXAtPmNvbm5lY3RfdGltZW91dCApOworICAgIHdpbmluZXRfc2V0X3RpbWVvdXQoIHNvYXAsIGFfcERhdGEsICJyZWNlaXZlIiwgCisgICAgICAgIElOVEVSTkVUX09QVElPTl9SRUNFSVZFX1RJTUVPVVQsIHNvYXAtPnJlY3ZfdGltZW91dCApOworICAgIHdpbmluZXRfc2V0X3RpbWVvdXQoIHNvYXAsIGFfcERhdGEsICJzZW5kIiwgICAgCisgICAgICAgIElOVEVSTkVUX09QVElPTl9TRU5EX1RJTUVPVVQsIHNvYXAtPnNlbmRfdGltZW91dCApOworCisgICAgLyogc2V0IHVwIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBzbyB3ZSBnZXQgbm90aWZpY2F0aW9ucyAqLworICAgIEludGVybmV0U2V0U3RhdHVzQ2FsbGJhY2soIGFfcERhdGEtPmhJbnRlcm5ldCwgd2luaW5ldF9jYWxsYmFjayApOworCisgICAgLyogc2V0IGFsbCBvZiBvdXIgY2FsbGJhY2tzICovCisgICAgc29hcC0+Zm9wZW4gICAgPSB3aW5pbmV0X2Nvbm5lY3Q7CisgICAgc29hcC0+ZnBvc3RoZHIgPSB3aW5pbmV0X3Bvc3RfaGVhZGVyOworICAgIHNvYXAtPmZzZW5kICAgID0gd2luaW5ldF9mc2VuZDsKKyAgICBzb2FwLT5mcmVjdiAgICA9IHdpbmluZXRfZnJlY3Y7CisgICAgc29hcC0+ZmNsb3NlICAgPSB3aW5pbmV0X2Rpc2Nvbm5lY3Q7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyogY29weSB0aGUgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSAqLworc3RhdGljIGludCAgCit3aW5pbmV0X2NvcHkoIAorICAgIHN0cnVjdCBzb2FwICogICAgICAgICAgIHNvYXAsIAorICAgIHN0cnVjdCBzb2FwX3BsdWdpbiAqICAgIGFfcERzdCwgCisgICAgc3RydWN0IHNvYXBfcGx1Z2luICogICAgYV9wU3JjICkKK3sKKyAgICBVTlVTRURfQVJHKCBzb2FwICk7CisgICAgVU5VU0VEX0FSRyggYV9wRHN0ICk7CisgICAgVU5VU0VEX0FSRyggYV9wU3JjICk7CisKKyAgICBfQVNTRVJURSggISJ3aW5pbmV0IGRvZXNuJ3Qgc3VwcG9ydCBjb3B5IiApOworICAgIHJldHVybiBTT0FQX0ZBVEFMX0VSUk9SOworfQorCisvKiBkZWFsbG9jYXRlIG9mIG91ciBwcml2YXRlIHN0cnVjdHVyZSAqLworc3RhdGljIHZvaWQgCit3aW5pbmV0X2RlbGV0ZSggCisgICAgc3RydWN0IHNvYXAgKiAgICAgICAgICAgc29hcCwgCisgICAgc3RydWN0IHNvYXBfcGx1Z2luICogICAgYV9wUGx1Z2luRGF0YSApCit7CisgICAgc3RydWN0IHdpbmluZXRfZGF0YSAqIHBEYXRhID0gCisgICAgICAgIChzdHJ1Y3Qgd2luaW5ldF9kYXRhICopIGFfcFBsdWdpbkRhdGEtPmRhdGE7CisKKyAgICBVTlVTRURfQVJHKCBzb2FwICk7CisKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgCisgICAgICAgICJ3aW5pbmV0ICVwOiBkZWxldGUgcHJpdmF0ZSBkYXRhXG4iLCBzb2FwICkpOworCisgICAgLyogZm9yY2UgYSBkaXNjb25uZWN0IG9mIGFueSBleGlzdGluZyBjb25uZWN0aW9uICovCisgICAgcERhdGEtPmJEaXNjb25uZWN0ID0gVFJVRTsKKyAgICB3aW5pbmV0X2hhdmVfY29ubmVjdGlvbiggc29hcCwgcERhdGEgKTsKKworICAgIC8qIGNsb3NlIGRvd24gdGhlIGludGVybmV0ICovCisgICAgaWYgKCBwRGF0YS0+aEludGVybmV0ICkKKyAgICB7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAKKyAgICAgICAgICAgICJ3aW5pbmV0ICVwOiBjbG9zaW5nIGludGVybmV0IGhhbmRsZVxuIiwgc29hcCkpOworICAgICAgICBJbnRlcm5ldENsb3NlSGFuZGxlKCBwRGF0YS0+aEludGVybmV0ICk7CisgICAgICAgIHBEYXRhLT5oSW50ZXJuZXQgPSBOVUxMOworICAgIH0KKworICAgIC8qIGZyZWUgb3VyIGRhdGEgKi8KKyAgICB3aW5pbmV0X2ZyZWVfZXJyb3JfbWVzc2FnZSggcERhdGEgKTsKKyAgICBmcmVlKCBhX3BQbHVnaW5EYXRhLT5kYXRhICk7Cit9CisKKy8qIGdzb2FwIGRvY3VtZW50YXRpb246CisgICAgQ2FsbGVkIGZyb20gYSBjbGllbnQgcHJveHkgdG8gb3BlbiBhIGNvbm5lY3Rpb24gdG8gYSBXZWIgU2VydmljZSBsb2NhdGVkIAorICAgIGF0IGVuZHBvaW50LiBJbnB1dCBwYXJhbWV0ZXJzIGhvc3QgYW5kIHBvcnQgYXJlIG1pY3JvLXBhcnNlZCBmcm9tIGVuZHBvaW50LgorICAgIFNob3VsZCByZXR1cm4gYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IsIG9yIFNPQVBfSU5WQUxJRF9TT0NLRVQgYW5kIAorICAgIHNvYXAtPmVycm9yIHNldCB0byBhbiBlcnJvciBjb2RlLiBCdWlsdC1pbiBnU09BUCBmdW5jdGlvbjogdGNwX2Nvbm5lY3QKKyovCitzdGF0aWMgaW50ICAKK3dpbmluZXRfY29ubmVjdCggCisgICAgc3RydWN0IHNvYXAgKiAgIHNvYXAsIAorICAgIGNvbnN0IGNoYXIgKiAgICBhX3BzekVuZHBvaW50LCAKKyAgICBjb25zdCBjaGFyICogICAgYV9wc3pIb3N0LCAKKyAgICBpbnQgICAgICAgICAgICAgYV9uUG9ydCApCit7CisgICAgVVJMX0NPTVBPTkVOVFNBIHVybENvbXBvbmVudHM7CisgICAgY2hhciAgICAgICAgICAgIHN6VXJsUGF0aFtNQVhfUEFUSF07CisgICAgY2hhciAgICAgICAgICAgIHN6SG9zdFtNQVhfUEFUSF07CisgICAgRFdPUkQgICAgICAgICAgIGR3RmxhZ3M7CisgICAgSElOVEVSTkVUICAgICAgIGhDb25uZWN0aW9uICA9IE5VTEw7CisgICAgSElOVEVSTkVUICAgICAgIGhIdHRwUmVxdWVzdCA9IE5VTEw7CisgICAgc3RydWN0IHdpbmluZXRfZGF0YSAqIHBEYXRhID0gCisgICAgICAgIChzdHJ1Y3Qgd2luaW5ldF9kYXRhICopIHNvYXBfbG9va3VwX3BsdWdpbiggc29hcCwgd2luaW5ldF9pZCApOworCisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworCisgICAgLyogd2UgcGFyc2UgdGhlIFVSTCBvdXJzZWx2ZXMgc28gd2UgZG9uJ3QgdXNlIHRoZXNlIHBhcmFtZXRlcnMgKi8KKyAgICBVTlVTRURfQVJHKCBhX3Bzekhvc3QgKTsKKyAgICBVTlVTRURfQVJHKCBhX25Qb3J0ICk7CisKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgCisgICAgICAgICJ3aW5pbmV0ICVwOiBjb25uZWN0LCBlbmRwb2ludCA9ICclcydcbiIsIHNvYXAsIGFfcHN6RW5kcG9pbnQgKSk7CisKKyAgICAvKiB3ZSBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgYnV0IG5vdCBjb25uZWN0ZWQgKi8KKyAgICBfQVNTRVJURSggcERhdGEtPmhJbnRlcm5ldCApOworICAgIF9BU1NFUlRFKCAhcERhdGEtPmhDb25uZWN0aW9uICk7CisgICAgX0FTU0VSVEUoIHNvYXAtPnNvY2tldCA9PSBTT0FQX0lOVkFMSURfU09DS0VUICk7CisKKyAgICAvKiBwYXJzZSBvdXQgdGhlIHVybCBwYXRoICovCisgICAgbWVtc2V0KCAmdXJsQ29tcG9uZW50cywgMCwgc2l6ZW9mKHVybENvbXBvbmVudHMpICk7CisgICAgdXJsQ29tcG9uZW50cy5kd1N0cnVjdFNpemUgPSBzaXplb2YodXJsQ29tcG9uZW50cyk7CisgICAgdXJsQ29tcG9uZW50cy5scHN6SG9zdE5hbWUgICAgICA9IHN6SG9zdDsKKyAgICB1cmxDb21wb25lbnRzLmR3SG9zdE5hbWVMZW5ndGggID0gTUFYX1BBVEg7CisgICAgdXJsQ29tcG9uZW50cy5scHN6VXJsUGF0aCAgICAgICA9IHN6VXJsUGF0aDsKKyAgICB1cmxDb21wb25lbnRzLmR3VXJsUGF0aExlbmd0aCAgID0gTUFYX1BBVEg7CisgICAgaWYgKCAhSW50ZXJuZXRDcmFja1VybEEoIGFfcHN6RW5kcG9pbnQsIDAsIDAsICZ1cmxDb21wb25lbnRzICkgKQorICAgIHsKKyAgICAgICAgSW50ZXJuZXRDbG9zZUhhbmRsZSggaENvbm5lY3Rpb24gKTsKKyAgICAgICAgc29hcC0+ZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsIAorICAgICAgICAgICAgIndpbmluZXQgJXA6IGNvbm5lY3QsIGVycm9yICVkICglcykgaW4gSW50ZXJuZXRDcmFja1VybFxuIiwgCisgICAgICAgICAgICBzb2FwLCBzb2FwLT5lcnJvciwgd2luaW5ldF9lcnJvcl9tZXNzYWdlKHNvYXAsc29hcC0+ZXJyb3IpICkpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisKKyAgICAvKiBjb25uZWN0IHRvIHRoZSB0YXJnZXQgdXJsLCBpZiB3ZSBoYXZlbid0IGNvbm5lY3RlZCB5ZXQgCisgICAgICAgb3IgaWYgaXQgd2FzIGRyb3BwZWQgKi8KKyAgICBoQ29ubmVjdGlvbiA9IEludGVybmV0Q29ubmVjdEEoIHBEYXRhLT5oSW50ZXJuZXQsIAorICAgICAgICBzekhvc3QsIHVybENvbXBvbmVudHMublBvcnQsICIiLCAiIiwgSU5URVJORVRfU0VSVklDRV9IVFRQLCAKKyAgICAgICAgMCwgKERXT1JEX1BUUikgc29hcCApOworICAgIGlmICggIWhDb25uZWN0aW9uICkKKyAgICB7CisgICAgICAgIHNvYXAtPmVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAKKyAgICAgICAgICAgICJ3aW5pbmV0ICVwOiBjb25uZWN0LCBlcnJvciAlZCAoJXMpIGluIEludGVybmV0Q29ubmVjdFxuIiwgCisgICAgICAgICAgICBzb2FwLCBzb2FwLT5lcnJvciwgd2luaW5ldF9lcnJvcl9tZXNzYWdlKHNvYXAsc29hcC0+ZXJyb3IpICkpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisKKyAgICAvKiAKKyAgICAgICAgTm90ZSB0aGF0IGFsdGhvdWdoIHdlIHNwZWNpZnkgSFRUUC8xLjEgZm9yIHRoZSBjb25uZWN0aW9uIGhlcmUsIHRoZSAKKyAgICAgICAgYWN0dWFsIGNvbm5lY3Rpb24gbWF5IGJlIEhUVFAvMS4wIGRlcGVuZGluZyBvbiB0aGUgc2V0dGluZ3MgaW4gdGhlIAorICAgICAgICBjb250cm9sIHBhbmVsLiBTZWUgdGhlICJJbnRlcm5ldCBPcHRpb25zIiwgIkhUVFAgMS4xIHNldHRpbmdzIi4KKyAgICAgKi8KKyAgICBkd0ZsYWdzID0gcERhdGEtPmR3UmVxdWVzdEZsYWdzOworICAgIGlmICggc29hcC0+b21vZGUgJiBTT0FQX0lPX0tFRVBBTElWRSApCisgICAgeworICAgICAgICBkd0ZsYWdzIHw9IElOVEVSTkVUX0ZMQUdfS0VFUF9DT05ORUNUSU9OOworICAgIH0KKyAgICBpZiAoIHVybENvbXBvbmVudHMublNjaGVtZSA9PSBJTlRFUk5FVF9TQ0hFTUVfSFRUUFMgKSAKKyAgICB7CisgICAgICAgIGR3RmxhZ3MgfD0gSU5URVJORVRfRkxBR19TRUNVUkU7CisgICAgfQorICAgIGhIdHRwUmVxdWVzdCA9IEh0dHBPcGVuUmVxdWVzdEEoCisgICAgICAgIGhDb25uZWN0aW9uLCAiUE9TVCIsIHN6VXJsUGF0aCwgIkhUVFAvMS4xIiwgTlVMTCwgTlVMTCwgCisgICAgICAgIGR3RmxhZ3MsIChEV09SRF9QVFIpIHNvYXAgKTsKKyAgICBpZiAoICFoSHR0cFJlcXVlc3QgKQorICAgIHsKKyAgICAgICAgSW50ZXJuZXRDbG9zZUhhbmRsZSggaENvbm5lY3Rpb24gKTsKKyAgICAgICAgc29hcC0+ZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsIAorICAgICAgICAgICAgIndpbmluZXQgJXA6IGNvbm5lY3QsIGVycm9yICVkICglcykgaW4gSHR0cE9wZW5SZXF1ZXN0XG4iLCAKKyAgICAgICAgICAgIHNvYXAsIHNvYXAtPmVycm9yLCB3aW5pbmV0X2Vycm9yX21lc3NhZ2Uoc29hcCxzb2FwLT5lcnJvcikgKSk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgIH0KKworICAgIC8qIHNhdmUgdGhlIGNvbm5lY3Rpb24gaGFuZGxlIGluIG91ciBkYXRhIHN0cnVjdHVyZSAqLworICAgIHBEYXRhLT5oQ29ubmVjdGlvbiA9IGhDb25uZWN0aW9uOworCisgICAgLyogcmV0dXJuIHRoZSBodHRwIHJlcXVlc3QgaGFuZGxlIGFzIG91ciBmaWxlIGRlc2NyaXB0b3IuICovCisgICAgX0FTU0VSVEUoIHNpemVvZihzb2FwLT5zb2NrZXQpID49IHNpemVvZihISU5URVJORVQpICk7CisgICAgcmV0dXJuIChTT0FQX1NPQ0tFVCkgaEh0dHBSZXF1ZXN0OworfQorCisvKiBnc29hcCBkb2N1bWVudGF0aW9uOgorICAgIENhbGxlZCBieSBodHRwX3Bvc3QgYW5kIGh0dHBfcmVzcG9uc2UgKHRocm91Z2ggdGhlIGNhbGxiYWNrcykuIEVtaXRzIEhUVFAgCisgICAga2V5OiB2YWwgaGVhZGVyIGVudHJpZXMuIFNob3VsZCByZXR1cm4gU09BUF9PSywgb3IgYSBnU09BUCBlcnJvciBjb2RlLiAKKyAgICBCdWlsdC1pbiBnU09BUCBmdW5jdGlvbjogaHR0cF9wb3N0X2hlYWRlci4KKyAqLworc3RhdGljIGludCAKK3dpbmluZXRfcG9zdF9oZWFkZXIoCisgICAgc3RydWN0IHNvYXAgKiAgIHNvYXAsIAorICAgIGNvbnN0IGNoYXIgKiAgICBhX3BzektleSwgCisgICAgY29uc3QgY2hhciAqICAgIGFfcHN6VmFsdWUgKSAgCit7CisgICAgSElOVEVSTkVUIGhIdHRwUmVxdWVzdCA9IChISU5URVJORVQpIHNvYXAtPnNvY2tldDsKKyAgICBjaGFyICAgICAgc3pIZWFkZXJbTUFYX1BBVEhdOworICAgIGludCAgICAgICBuTGVuOworICAgIEJPT0wgICAgICBiUmVzdWx0ID0gRkFMU0U7CisgICAgc3RydWN0IHdpbmluZXRfZGF0YSAqIHBEYXRhID0gCisgICAgICAgIChzdHJ1Y3Qgd2luaW5ldF9kYXRhICopIHNvYXBfbG9va3VwX3BsdWdpbiggc29hcCwgd2luaW5ldF9pZCApOworCisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworCisgICAgLyogZW5zdXJlIHRoYXQgb3VyIGNvbm5lY3Rpb24gaGFzbid0IGJlZW4gZGlzY29ubmVjdGVkICovCisgICAgaWYgKCAhd2luaW5ldF9oYXZlX2Nvbm5lY3Rpb24oIHNvYXAsIHBEYXRhICkgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFNPQVBfRU9GOworICAgIH0KKworICAgIC8qIGlmIHRoaXMgaXMgdGhlIGluaXRpYWwgUE9TVCBoZWFkZXIgdGhlbiB3ZSBpbml0aWFsaXplIG91ciBzZW5kIGJ1ZmZlciAqLworICAgIGlmICggYV9wc3pLZXkgJiYgIWFfcHN6VmFsdWUgKQorICAgIHsKKyAgICAgICAgX0FTU0VSVEUoICFwRGF0YS0+cEJ1ZmZlciApOworICAgICAgICBwRGF0YS0+dWlCdWZmZXJMZW5NYXggPSBJTlZBTElEX0JVRkZFUl9MRU5HVEg7CisgICAgICAgIHBEYXRhLT51aUJ1ZmZlckxlbiAgICA9IDA7CisKKyAgICAgICAgLyogaWYgd2UgYXJlIHVzaW5nIGNodW5rIG91dHB1dCB0aGVuIHdlIHN0YXJ0IHdpdGggYSBjaHVuayBzaXplICovCisgICAgICAgIHBEYXRhLT5iSXNDaHVua1NpemUgPSAoIChzb2FwLT5vbW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTksgKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIGFfcHN6VmFsdWUgKQorICAgIHsgCisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAKKyAgICAgICAgICAgICJ3aW5pbmV0ICVwOiBwb3N0X2hlYWRlciwgYWRkaW5nICclczogJXMnXG4iLCAKKyAgICAgICAgICAgIHNvYXAsIGFfcHN6S2V5LCBhX3BzelZhbHVlICkpOworCisgICAgICAgIC8qIGRldGVybWluZSB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhpcyBtZXNzYWdlIHNvIHRoYXQgd2UgY2FuCisgICAgICAgICAgIGNvcnJlY3RseSBkZXRlcm1pbmUgd2hlbiB3ZSBoYXZlIGNvbXBsZXRlZCB0aGUgc2VuZCAqLworICAgICAgICBpZiAoICFzdHJjbXAoIGFfcHN6S2V5LCAiQ29udGVudC1MZW5ndGgiICkgKQorICAgICAgICB7CisgICAgICAgICAgICBfQVNTRVJURSggcERhdGEtPnVpQnVmZmVyTGVuTWF4ID09IElOVkFMSURfQlVGRkVSX0xFTkdUSCApOworICAgICAgICAgICAgcERhdGEtPnVpQnVmZmVyTGVuTWF4ID0gc3RydG91bCggYV9wc3pWYWx1ZSwgTlVMTCwgMTAgKTsKKyAgICAgICAgfQorCisgICAgICAgIG5MZW4gPSBfc25wcmludGYoIAorICAgICAgICAgICAgc3pIZWFkZXIsIE1BWF9QQVRILCAiJXM6ICVzXHJcbiIsIGFfcHN6S2V5LCBhX3BzelZhbHVlICk7CisgICAgICAgIGlmICggbkxlbiA8IDAgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gU09BUF9FT007CisgICAgICAgIH0KKyAgICAgICAgYlJlc3VsdCA9IEh0dHBBZGRSZXF1ZXN0SGVhZGVyc0EoIGhIdHRwUmVxdWVzdCwgc3pIZWFkZXIsIG5MZW4sIAorICAgICAgICAgICAgSFRUUF9BRERSRVFfRkxBR19BRERfSUZfTkVXICk7CisjaWZkZWYgU09BUF9ERUJVRworICAgICAgICAvKiAKKyAgICAgICAgICAgIHdlIGRvbid0IHJldHVybiBhbiBlcnJvciBpZiB0aGlzIGZhaWxzIGJlY2F1c2UgaXQgaXNuJ3QgCisgICAgICAgICAgICAob3Igc2hvdWxkbid0IGJlKSBjcml0aWNhbC4KKyAgICAgICAgICovCisgICAgICAgIGlmICggIWJSZXN1bHQgKQorICAgICAgICB7CisgICAgICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgCisgICAgICAgICAgICAgICAgIndpbmluZXQgJXA6IHBvc3RfaGVhZGVyLCBlcnJvciAlZCAoJXMpIGluIEh0dHBBZGRSZXF1ZXN0SGVhZGVyc1xuIiwgCisgICAgICAgICAgICAgICAgc29hcCwgc29hcC0+ZXJyb3IsIHdpbmluZXRfZXJyb3JfbWVzc2FnZShzb2FwLEdldExhc3RFcnJvcigpKSApKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorICAgIHJldHVybiBTT0FQX09LOyAKK30KKworLyogZ3NvYXAgZG9jdW1lbnRhdGlvbjoKKyAgICBDYWxsZWQgZm9yIGFsbCBzZW5kIG9wZXJhdGlvbnMgdG8gZW1pdCBjb250ZW50cyBvZiBzIG9mIGxlbmd0aCBuLiAKKyAgICBTaG91bGQgcmV0dXJuIFNPQVBfT0ssIG9yIGEgZ1NPQVAgZXJyb3IgY29kZS4gQnVpbHQtaW4gZ1NPQVAgCisgICAgZnVuY3Rpb246IGZzZW5kCisKKyAgIE5vdGVzOgorICAgIEkgZG8gYSBoZWFwIG9mIGJ1ZmZlcmluZyBoZXJlIGJlY2F1c2Ugd2UgbmVlZCB0aGUgZW50aXJlIG1lc3NhZ2UgYXZhaWxhYmxlCisgICAgaW4gYSBzaW5nbGUgYnVmZmVyIGluIG9yZGVyIHRvIGl0ZXJhdGUgdGhyb3VnaCB0aGUgc2VuZGluZyBsb29wLiBJIGhhZCAKKyAgICBob3BlZCB0aGF0IHRoZSBTT0FQX0lPX1NUT1JFIGZsYWcgd291bGQgaGF2ZSB3b3JrZWQgdG8gZG8gdGhlIHNhbWUsIGhvd2V2ZXIKKyAgICB0aGlzIHN0aWxsIGJyZWFrcyB0aGUgbWVzc2FnZXMgdXAgaW50byBibG9ja3MuIEFsdGhvdWdoIHRoZXJlIHdlcmUgYSBudW1iZXIKKyAgICBvZiB3YXlzIHRoaXMgY291bGQndmUgYmVlbiBpbXBsZW1lbnRlZCwgdGhpcyB3b3JrcyBhbmQgc3VwcG9ydHMgYWxsIG9mIHRoZQorICAgIHBvc3NpYmxlIFNPQVBfSU8gZmxhZ3MsIGV2ZW4gdGhvdWdoIHRoZSBlbnRpcmUgbWVzc2FnZSBpcyBzdGlsbCBidWZmZXJlZCAKKyAgICB0aGUgc2FtZSBhcyBpZiBTT0FQX0lPX1NUT1JFIHdhcyB1c2VkLgorKi8KK3N0YXRpYyBpbnQgCit3aW5pbmV0X2ZzZW5kKCAKKyAgICBzdHJ1Y3Qgc29hcCAqICAgc29hcCwgCisgICAgY29uc3QgY2hhciAqICAgIGFfcEJ1ZmZlciwgCisgICAgc2l6ZV90ICAgICAgICAgIGFfdWlCdWZmZXJMZW4gKQoreworICAgIEhJTlRFUk5FVCAgIGhIdHRwUmVxdWVzdCA9IChISU5URVJORVQpIHNvYXAtPnNvY2tldDsKKyAgICBCT09MICAgICAgICBiUmVzdWx0OworICAgIEJPT0wgICAgICAgIGJSZXRyeVBvc3Q7CisgICAgRFdPUkQgICAgICAgZHdTdGF0dXNDb2RlOworICAgIERXT1JEICAgICAgIGR3U3RhdHVzQ29kZUxlbjsKKyAgICBpbnQgICAgICAgICBuUmVzdWx0ID0gU09BUF9PSzsKKyAgICBzdHJ1Y3Qgd2luaW5ldF9kYXRhICogcERhdGEgPSAKKyAgICAgICAgKHN0cnVjdCB3aW5pbmV0X2RhdGEgKikgc29hcF9sb29rdXBfcGx1Z2luKCBzb2FwLCB3aW5pbmV0X2lkICk7CisKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgCisgICAgICAgICJ3aW5pbmV0ICVwOiBmc2VuZCwgZGF0YSBsZW4gPSAlbHUgYnl0ZXNcbiIsIHNvYXAsIGFfdWlCdWZmZXJMZW4gKSk7CisKKyAgICBfQVNTRVJURSggYV91aUJ1ZmZlckxlbiA+IDAgKTsKKworICAgIC8qIGVuc3VyZSB0aGF0IG91ciBjb25uZWN0aW9uIGhhc24ndCBiZWVuIGRpc2Nvbm5lY3RlZCAqLworICAgIGlmICggIXdpbmluZXRfaGF2ZV9jb25uZWN0aW9uKCBzb2FwLCBwRGF0YSApICkKKyAgICB7CisgICAgICAgIHJldHVybiBTT0FQX0VPRjsKKyAgICB9CisKKyAgICAvKiBpbml0aWFsaXplIG9uIG91ciBmaXJzdCB0aW1lIHRocm91Z2guIHBEYXRhLT5wQnVmZmVyIHdpbGwgYWx3YXlzIGJlIAorICAgICAgIG5vbi1udWxsIGlmIHRoaXMgaXMgbm90IHRoZSBmaXJzdCBjYWxsLiAqLworICAgIGlmICggIXBEYXRhLT5wQnVmZmVyICkKKyAgICB7CisgICAgICAgIC8qIAorICAgICAgICAgICAgSWYgd2UgYXJlIHVzaW5nIGNodW5rZWQgc2VuZGluZywgdGhlbiB3ZSBkb24ndCBrbm93IGhvdyBiaWcgdGhlCisgICAgICAgICAgICBidWZmZXIgd2lsbCBuZWVkIHRvIGJlLiBTbyB3ZSBzdGFydCB3aXRoIGEgMCBsZW5ndGggYnVmZmVyIGFuZAorICAgICAgICAgICAgZ3JvdyBpdCBsYXRlciB0byBlbnN1cmUgdGhhdCBpdCBpcyBhbHdheXMgbGFyZ2UgZW5vdWdoLgorCisgICAgICAgICAgICAgICAgdWlCdWZmZXJMZW5NYXggPSBsZW5ndGggb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkKKyAgICAgICAgICAgICAgICB1aUJ1ZmZlckxlbiAgICA9IGxlbmd0aCBvZiB0aGUgZGF0YSBpbiB0aGUgYnVmZmVyCisgICAgICAgICAqLworICAgICAgICBpZiAoIChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHdlIG1ha2UgdGhlIGluaXRpYWwgYWxsb2NhdGlvbiBsYXJnZSBlbm91Z2ggZm9yIHRoaXMgY2h1bmtzaXplIAorICAgICAgICAgICAgICAgYnVmZmVyLCBwbHVzIHRoZSBuZXh0IGNodW5rIG9mIGFjdHVhbCBkYXRhLCBhbmQgYSBmZXcgZXh0cmEgCisgICAgICAgICAgICAgICBieXRlcyBmb3IgdGhlIGZpbmFsICIwIiBjaHVua3NpemUgYmxvY2suICovCisgICAgICAgICAgICBzaXplX3QgdWlDaHVua1NpemUgPSBzdHJ0b3VsKCBhX3BCdWZmZXIsIE5VTEwsIDE2ICk7CisgICAgICAgICAgICBwRGF0YS0+dWlCdWZmZXJMZW5NYXggPSB1aUNodW5rU2l6ZSArIGFfdWlCdWZmZXJMZW4gKyAxNjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggYV91aUJ1ZmZlckxlbiA9PSBwRGF0YS0+dWlCdWZmZXJMZW5NYXggKQorICAgICAgICB7CisgICAgICAgICAgICAvKiAgCisgICAgICAgICAgICAgICAgSWYgdGhlIGN1cnJlbnRseSBzdXBwbGllZCBidWZmZXIgZnJvbSBnc29hcCBob2xkcyB0aGUgZW50aXJlIAorICAgICAgICAgICAgICAgIG1lc3NhZ2UgdGhlbiB3ZSBqdXN0IHVzZSB0aGVpciBidWZmZXIgYW5kIGF2b2lkIGFueSBtZW1vcnkgCisgICAgICAgICAgICAgICAgYWxsb2NhdGlvbi4gVGhpcyB3aWxsIG9ubHkgYmUgdHJ1ZSB3aGVuICgxKSB3ZSBhcmUgbm90IHVzaW5nIAorICAgICAgICAgICAgICAgIGNodW5rZWQgc2VuZCAoc28gdWlCdWZmZXJMZW5NYXggaGFzIGJlZW4gcHJldmlvdXNseSBzZXQgdG8gCisgICAgICAgICAgICAgICAgdGhlIENvbnRlbnQtTGVuZ3RoIGhlYWRlciBsZW5ndGgpLCBhbmQgKDIpIGdzb2FwIGlzIHNlbmRpbmcgCisgICAgICAgICAgICAgICAgdGhlIGVudGlyZSBtZXNzYWdlIGF0IG9uZSB0aW1lLiAKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcERhdGEtPnBCdWZmZXIgICAgID0gKGNoYXIgKikgYV9wQnVmZmVyOworICAgICAgICAgICAgcERhdGEtPnVpQnVmZmVyTGVuID0gYV91aUJ1ZmZlckxlbjsKKyAgICAgICAgfQorCisgICAgICAgIF9BU1NFUlRFKCBwRGF0YS0+dWlCdWZmZXJMZW5NYXggIT0gSU5WQUxJRF9CVUZGRVJfTEVOR1RIICk7CisgICAgfQorCisgICAgLyoKKyAgICAgICAgSWYgd2UgY2FuJ3QgdXNlIHRoZSBnc29hcCBidWZmZXIsIHRoZW4gd2UgbmVlZCB0byBhbGxvY2F0ZSBvdXIgb3duCisgICAgICAgIGJ1ZmZlciBmb3IgdGhlIGVudGlyZSBtZXNzYWdlLiBUaGlzIGlzIGJlY2F1c2UgYXV0aGVudGljYXRpb24gbWF5IAorICAgICAgICByZXF1aXJlIHRoZSBlbnRpcmUgbWVzc2FnZSB0byBiZSBzZW50IG11bHRpcGxlIHRpbWVzLiBTaW5jZSB0aGlzIHNlbmQKKyAgICAgICAgaXMgb25seSBhIHBhcnQgb2YgdGhlIG1lc3NhZ2UsIHdlIG5lZWQgdG8gYnVmZmVyIHVudGlsIHdlIGhhdmUgdGhlIAorICAgICAgICBlbnRpcmUgbWVzc2FnZS4KKyAgICAqLworICAgIGlmICggcERhdGEtPnBCdWZmZXIgIT0gYV9wQnVmZmVyICkKKyAgICB7CisgICAgICAgIC8qIAorICAgICAgICAgICAgV2UgYWxyZWFkeSBoYXZlIGEgYnVmZmVyIHBvaW50ZXIsIHRoaXMgbWVhbnMgdGhhdCBpdCBpc24ndCB0aGUgCisgICAgICAgICAgICBmaXJzdCB0aW1lIHdlIGhhdmUgYmVlbiBjYWxsZWQuIFdlIGhhdmUgYWxsb2NhdGVkIGEgYnVmZmVyIGFuZCAKKyAgICAgICAgICAgIGFyZSBjdXJyZW50IGZpbGxpbmcgaXQuIAorICAgICAgICAgICAgCisgICAgICAgICAgICBJZiB3ZSBkb24ndCBoYXZlIGVub3VnaCByb29tIGluIHRoZSBvdXIgYnVmZmVyIHRvIGFkZCB0aGlzIG5ldyAKKyAgICAgICAgICAgIGRhdGEsIHRoZW4gd2UgbmVlZCB0byByZWFsbG9jYXRlLiBUaGlzIGNhc2Ugd2lsbCBvbmx5IG9jY3VyIHdpdGggCisgICAgICAgICAgICBjaHVua2VkIHNlbmRzLiAKKyAgICAgICAgICovCisgICAgICAgIHNpemVfdCB1aU5ld0J1ZmZlckxlbiA9IHBEYXRhLT51aUJ1ZmZlckxlbiArIGFfdWlCdWZmZXJMZW47CisgICAgICAgIGlmICggIXBEYXRhLT5wQnVmZmVyIHx8IHVpTmV3QnVmZmVyTGVuID4gcERhdGEtPnVpQnVmZmVyTGVuTWF4ICkKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKCB1aU5ld0J1ZmZlckxlbiA+IHBEYXRhLT51aUJ1ZmZlckxlbk1heCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcERhdGEtPnVpQnVmZmVyTGVuTWF4ID0gcERhdGEtPnVpQnVmZmVyTGVuTWF4ICogMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBEYXRhLT5wQnVmZmVyID0gKGNoYXIgKikgcmVhbGxvYyggcERhdGEtPnBCdWZmZXIsIHBEYXRhLT51aUJ1ZmZlckxlbk1heCApOworICAgICAgICAgICAgaWYgKCAhcERhdGEtPnBCdWZmZXIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBTT0FQX0VPTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoIHBEYXRhLT5wQnVmZmVyICsgcERhdGEtPnVpQnVmZmVyTGVuLCAKKyAgICAgICAgICAgIGFfcEJ1ZmZlciwgYV91aUJ1ZmZlckxlbiApOworICAgICAgICBwRGF0YS0+dWlCdWZmZXJMZW4gPSB1aU5ld0J1ZmZlckxlbjsKKworICAgICAgICAvKiBpZiB3ZSBhcmUgZG9pbmcgY2h1bmtlZCB0cmFuc2ZlcnMsIGFuZCB0aGlzIGlzIGEgY2h1bmsgc2l6ZSBibG9jaywKKyAgICAgICAgICAgYW5kIGl0IGlzICIwIiwgdGhlbiB0aGlzIGlzIHRoZSBsYXN0IGJsb2NrIGluIHRoZSB0cmFuc2ZlciBhbmQgd2UKKyAgICAgICAgICAgY2FuIHNldCB0aGUgbWF4aW11bSBzaXplIG5vdyB0byBjb250aW51ZSB0byB0aGUgYWN0dWFsIHNlbmQuICovCisgICAgICAgIGlmICggKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LCisgICAgICAgICAgICAgJiYgcERhdGEtPmJJc0NodW5rU2l6ZSAKKyAgICAgICAgICAgICAmJiBhX3BCdWZmZXJbMl0gPT0gJzAnICYmICFpc2FsbnVtKGFfcEJ1ZmZlclszXSkgKQorICAgICAgICB7CisgICAgICAgICAgICBwRGF0YS0+dWlCdWZmZXJMZW5NYXggPSBwRGF0YS0+dWlCdWZmZXJMZW47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiB3ZSBoYXZlbid0IGdvdCB0aGUgZW50aXJlIGxlbmd0aCBvZiB0aGUgbWVzc2FnZSB5ZXQsIHRoZW4gCisgICAgICAgd2UgcmV0dXJuIHRvIGdzb2FwIGFuZCBsZXQgaXQgY29udGludWUgKi8KKyAgICBpZiAoIHBEYXRhLT51aUJ1ZmZlckxlbiA8IHBEYXRhLT51aUJ1ZmZlckxlbk1heCApCisgICAgeworICAgICAgICAvKiB0b2dnbGUgb3VyIGNodW5rIHNpemUgbWFya2VyIGlmIHdlIGFyZSBjaHVua2luZyAqLworICAgICAgICBwRGF0YS0+YklzQ2h1bmtTaXplID0gCisgICAgICAgICAgICAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKSAKKyAgICAgICAgICAgICYmICFwRGF0YS0+YklzQ2h1bmtTaXplOyAKKyAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgfQorICAgIF9BU1NFUlRFKCBwRGF0YS0+dWlCdWZmZXJMZW4gPT0gcERhdGEtPnVpQnVmZmVyTGVuTWF4ICk7CisKKyAgICAvKiB3ZSd2ZSBub3cgZ290IHRoZSBlbnRpcmUgbWVzc2FnZSwgbm93IHdlIGNhbiBlbnRlciBvdXIgc2VuZGluZyBsb29wICovCisgICAgYlJldHJ5UG9zdCA9IFRSVUU7CisgICAgd2hpbGUgKCBiUmV0cnlQb3N0ICkKKyAgICB7CisgICAgICAgIGJSZXRyeVBvc3QgPSBGQUxTRTsKKworICAgICAgICBiUmVzdWx0ID0gSHR0cFNlbmRSZXF1ZXN0QSggCisgICAgICAgICAgICBoSHR0cFJlcXVlc3QsIE5VTEwsIDAsIHBEYXRhLT5wQnVmZmVyLCBwRGF0YS0+dWlCdWZmZXJMZW4gKTsKKyAgICAgICAgaWYgKCAhYlJlc3VsdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNvYXAtPmVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgCisgICAgICAgICAgICAgICAgIndpbmluZXQgJXA6IGZzZW5kLCBlcnJvciAlZCAoJXMpIGluIEh0dHBTZW5kUmVxdWVzdFxuIiwgCisgICAgICAgICAgICAgICAgc29hcCwgc29hcC0+ZXJyb3IsIHdpbmluZXRfZXJyb3JfbWVzc2FnZShzb2FwLHNvYXAtPmVycm9yKSApKTsKKworICAgICAgICAgICAgLyogc2VlIGlmIHdlIGNhbiBoYW5kbGUgdGhpcyBlcnJvciwgc2VlIHRoZSBNU0ROIGRvY3VtZW50YXRpb24KKyAgICAgICAgICAgICAgIGZvciBJbnRlcm5ldEVycm9yRGxnIGZvciBkZXRhaWxzICovCisgICAgICAgICAgICBzd2l0Y2ggKCBzb2FwLT5lcnJvciApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEVSUk9SX0lOVEVSTkVUX0hUVFBfVE9fSFRUUFNfT05fUkVESVI6CisgICAgICAgICAgICBjYXNlIEVSUk9SX0lOVEVSTkVUX0lOQ09SUkVDVF9QQVNTV09SRDoKKyAgICAgICAgICAgIGNhc2UgRVJST1JfSU5URVJORVRfSU5WQUxJRF9DQToKKyAgICAgICAgICAgIGNhc2UgRVJST1JfSU5URVJORVRfUE9TVF9JU19OT05fU0VDVVJFOgorICAgICAgICAgICAgY2FzZSBFUlJPUl9JTlRFUk5FVF9TRUNfQ0VSVF9DTl9JTlZBTElEOgorICAgICAgICAgICAgY2FzZSBFUlJPUl9JTlRFUk5FVF9TRUNfQ0VSVF9EQVRFX0lOVkFMSUQ6CisgICAgICAgICAgICAgICAgaWYgKCB3aW5pbmV0X3Jlc29sdmVfc2VuZF9lcnJvciggaEh0dHBSZXF1ZXN0LCBzb2FwLT5lcnJvciApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICJ3aW5pbmV0ICVwOiBmc2VuZCwgZXJyb3IgJWQgaGFzIGJlZW4gcmVzb2x2ZWRcbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgc29hcCwgc29hcC0+ZXJyb3IgKSk7CisgICAgICAgICAgICAgICAgICAgIGJSZXRyeVBvc3QgPSBUUlVFOworCisgICAgICAgICAgICAgICAgICAgIC8qIAorICAgICAgICAgICAgICAgICAgICAgICAgd2Ugd291bGQgaGF2ZSBiZWVuIGRpc2Nvbm5lY3RlZCBieSB0aGUgZXJyb3IuIFNpbmNlIHdlIAorICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGdvaW5nIHRvIHRyeSBhZ2Fpbiwgd2Ugd2lsbCBhdXRvbWF0aWNhbGx5IGJlIAorICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25uZWN0ZWQuIFRoZXJlZm9yZSB3ZSB3YW50IHRvIGRpc3JlZ2FyZCBhbnkgCisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyBkaXNjb25uZWN0aW9uIG1lc3NhZ2VzLiAKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5iRGlzY29ubmVjdCA9IEZBTFNFOyAKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBpZiB0aGUgZXJyb3Igd2Fzbid0IGhhbmRsZWQgdGhlbiB3ZSBleGl0ICovCisgICAgICAgICAgICBuUmVzdWx0ID0gU09BUF9IVFRQX0VSUk9SOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBnZXQgdGhlIHN0YXR1cyBjb2RlIGZyb20gdGhlIHJlc3BvbnNlIHRvIGRldGVybWluZSBpZiB3ZSBuZWVkIAorICAgICAgICAgICB0byBhdXRob3JpemUgKi8KKyAgICAgICAgZHdTdGF0dXNDb2RlTGVuID0gc2l6ZW9mKGR3U3RhdHVzQ29kZSk7CisgICAgICAgIGJSZXN1bHQgPSBIdHRwUXVlcnlJbmZvKCAKKyAgICAgICAgICAgIGhIdHRwUmVxdWVzdCwgSFRUUF9RVUVSWV9TVEFUVVNfQ09ERSB8IEhUVFBfUVVFUllfRkxBR19OVU1CRVIsIAorICAgICAgICAgICAgJmR3U3RhdHVzQ29kZSwgJmR3U3RhdHVzQ29kZUxlbiwgTlVMTCk7CisgICAgICAgIGlmICggIWJSZXN1bHQgKQorICAgICAgICB7CisgICAgICAgICAgICBzb2FwLT5lcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsIAorICAgICAgICAgICAgICAgICJ3aW5pbmV0ICVwOiBmc2VuZCwgZXJyb3IgJWQgKCVzKSBpbiBIdHRwUXVlcnlJbmZvXG4iLCAKKyAgICAgICAgICAgICAgICBzb2FwLCBzb2FwLT5lcnJvciwgd2luaW5ldF9lcnJvcl9tZXNzYWdlKHNvYXAsc29hcC0+ZXJyb3IpICkpOworICAgICAgICAgICAgblJlc3VsdCA9IFNPQVBfSFRUUF9FUlJPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsIAorICAgICAgICAgICAgIndpbmluZXQgJXA6IGZzZW5kLCBIVFRQIHN0YXR1cyBjb2RlID0gJWx1XG4iLCAKKyAgICAgICAgICAgIHNvYXAsIGR3U3RhdHVzQ29kZSkpOworCisgICAgICAgIC8qIAorICAgICAgICAgICAgaWYgd2UgbmVlZCBhdXRoZW50aWNhdGlvbiwgdGhlbiByZXF1ZXN0IHRoZSB1c2VyIGZvciB0aGUgCisgICAgICAgICAgICBhcHByb3ByaWF0ZSBkYXRhLiBUaGVpciByZXBseSBpcyBzYXZlZCBpbnRvIHRoZSByZXF1ZXN0IHNvIAorICAgICAgICAgICAgdGhhdCB3ZSBjYW4gdXNlIGl0IGxhdGVyLgorICAgICAgICAgKi8KKyAgICAgICAgc3dpdGNoICggZHdTdGF0dXNDb2RlICkKKyAgICAgICAgeworICAgICAgICBjYXNlIEhUVFBfU1RBVFVTX0RFTklFRDoKKyAgICAgICAgY2FzZSBIVFRQX1NUQVRVU19QUk9YWV9BVVRIX1JFUToKKyAgICAgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAKKyAgICAgICAgICAgICAgICAid2luaW5ldCAlcDogZnNlbmQsIHVzZXIgYXV0aGVuaWNhdGlvbiByZXF1aXJlZFxuIiwgCisgICAgICAgICAgICAgICAgc29hcCApKTsKKyAgICAgICAgICAgIGlmICggd2luaW5ldF9yZXNvbHZlX3NlbmRfZXJyb3IoIGhIdHRwUmVxdWVzdCwgCisgICAgICAgICAgICAgICAgRVJST1JfSU5URVJORVRfSU5DT1JSRUNUX1BBU1NXT1JEICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAKKyAgICAgICAgICAgICAgICAgICAgIndpbmluZXQgJXA6IGZzZW5kLCBhdXRoZW50aWNhdGlvbiBoYXMgYmVlbiBwcm92aWRlZFxuIiwgCisgICAgICAgICAgICAgICAgICAgIHNvYXAgKSk7CisKKyAgICAgICAgICAgICAgICAvKiAKKyAgICAgICAgICAgICAgICAgICAgd2UgbWF5IGhhdmUgYmVlbiBkaXNjb25uZWN0ZWQgYnkgdGhlIGVycm9yLiBTaW5jZSB3ZSAKKyAgICAgICAgICAgICAgICAgICAgYXJlIGdvaW5nIHRvIHRyeSBhZ2Fpbiwgd2Ugd2lsbCBhdXRvbWF0aWNhbGx5IGJlIAorICAgICAgICAgICAgICAgICAgICByZWNvbm5lY3RlZC4gVGhlcmVmb3JlIHdlIHdhbnQgdG8gZGlzcmVnYXJkIGFueSBwcmV2aW91cworICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0aW9uIG1lc3NhZ2VzLiAKKyAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBwRGF0YS0+YkRpc2Nvbm5lY3QgPSBGQUxTRTsgCisgICAgICAgICAgICAgICAgYlJldHJ5UG9zdCA9IFRSVUU7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiB3ZSBoYXZlIGFuIGFsbG9jYXRlZCBidWZmZXIgdGhlbiB3ZSBjYW4gZGVhbGxvY2F0ZSBpdCBub3cgKi8KKyAgICBpZiAoIHBEYXRhLT5wQnVmZmVyICE9IGFfcEJ1ZmZlciApCisgICAgeworICAgICAgICBmcmVlKCBwRGF0YS0+cEJ1ZmZlciApOworICAgIH0KKyAgICBwRGF0YS0+cEJ1ZmZlciAgICAgPSAwOworICAgIHBEYXRhLT51aUJ1ZmZlckxlbiA9IDA7CisgICAgcERhdGEtPnVpQnVmZmVyTGVuTWF4ID0gSU5WQUxJRF9CVUZGRVJfTEVOR1RIOworCisgICAgcmV0dXJuIG5SZXN1bHQ7IAorfQorCisvKiBnc29hcCBkb2N1bWVudGF0aW9uOgorICAgIENhbGxlZCBmb3IgYWxsIHJlY2VpdmUgb3BlcmF0aW9ucyB0byBmaWxsIGJ1ZmZlciBzIG9mIG1heGltdW0gbGVuZ3RoIG4uIAorICAgIFNob3VsZCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZWFkIG9yIDAgaW4gY2FzZSBvZiBhbiBlcnJvciwgZS5nLiBFT0YuCisgICAgQnVpbHQtaW4gZ1NPQVAgZnVuY3Rpb246IGZyZWN2CisgKi8KK3N0YXRpYyBzaXplX3QgCit3aW5pbmV0X2ZyZWN2KAorICAgIHN0cnVjdCBzb2FwICogICBzb2FwLCAKKyAgICBjaGFyICogICAgICAgICAgYV9wQnVmZmVyLCAKKyAgICBzaXplX3QgICAgICAgICAgYV91aUJ1ZmZlckxlbiApIAoreyAKKyAgICBISU5URVJORVQgICBoSHR0cFJlcXVlc3QgPSAoSElOVEVSTkVUKSBzb2FwLT5zb2NrZXQ7CisgICAgRFdPUkQgICAgICAgZHdCeXRlc1JlYWQgPSAwOworICAgIHNpemVfdCAgICAgIHVpVG90YWxCeXRlc1JlYWQgPSAwOworICAgIEJPT0wgICAgICAgIGJSZXN1bHQ7CisKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgCisgICAgICAgICJ3aW5pbmV0ICVwOiBmcmVjdiwgYXZhaWxhYmxlIGJ1ZmZlciBsZW4gPSAlbHVcbiIsIAorICAgICAgICBzb2FwLCBhX3VpQnVmZmVyTGVuICkpOworCisgICAgLyogCisgICAgICAgIE5PVEU6IHdlIGRvIG5vdCBjaGVjayBoZXJlIHRoYXQgb3VyIGNvbm5lY3Rpb24gaGFzbid0IGJlZW4gCisgICAgICAgIGRpc2Nvbm5lY3RlZCBiZWNhdXNlIGluIEhUVFAvMS4wIGNvbm5lY3Rpb25zLCBpdCB3aWxsIGFsd2F5cyBoYXZlIGJlZW4KKyAgICAgICAgZGlzY29ubmVjdGVkIGJ5IG5vdy4gVGhpcyBpcyBiZWNhdXNlIHRoZSByZXNwb25zZSBpcyBjaGVja2VkIGJ5IHRoZSAKKyAgICAgICAgd2luaW5ldF9mc2VuZCBmdW5jdGlvbiB0byBlbnN1cmUgdGhhdCB3ZSBkaWRuJ3QgbmVlZCBhbnkgc3BlY2lhbCAKKyAgICAgICAgYXV0aGVudGljYXRpb24uIEF0IHRoYXQgdGltZSB0aGUgY29ubmVjdGlvbiB3b3VsZCBoYXZlIGJlZW4gCisgICAgICAgIGRpc2Nvbm5lY3RlZC4gVGhpcyBpcyBva2F5IGhvd2V2ZXIgYXMgd2UgY2FuIHN0aWxsIHJlYWQgdGhlIHJlc3BvbnNlCisgICAgICAgIGZyb20gdGhlIHJlcXVlc3QgaGFuZGxlLgorICAgICAqLworCisgICAgZG8KKyAgICB7CisgICAgICAgIC8qIHJlYWQgZnJvbSB0aGUgY29ubmVjdGlvbiB1cCB0byBvdXIgbWF4aW11bSBhbW91bnQgb2YgZGF0YSAqLworICAgICAgICBfQVNTRVJURSggYV91aUJ1ZmZlckxlbiA8PSBVTE9OR19NQVggKTsKKyAgICAgICAgYlJlc3VsdCA9IEludGVybmV0UmVhZEZpbGUoIAorICAgICAgICAgICAgaEh0dHBSZXF1ZXN0LCAKKyAgICAgICAgICAgICZhX3BCdWZmZXJbdWlUb3RhbEJ5dGVzUmVhZF0sIAorICAgICAgICAgICAgKERXT1JEKSBhX3VpQnVmZmVyTGVuIC0gdWlUb3RhbEJ5dGVzUmVhZCwgCisgICAgICAgICAgICAmZHdCeXRlc1JlYWQgKTsKKyAgICAgICAgaWYgKCBiUmVzdWx0ICkKKyAgICAgICAgeworICAgICAgICAgICAgdWlUb3RhbEJ5dGVzUmVhZCArPSBkd0J5dGVzUmVhZDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHNvYXAtPmVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgCisgICAgICAgICAgICAgICAgIndpbmluZXQgJXA6IGZyZWN2LCBlcnJvciAlZCAoJXMpIGluIEludGVybmV0UmVhZEZpbGVcbiIsIAorICAgICAgICAgICAgICAgIHNvYXAsIHNvYXAtPmVycm9yLCB3aW5pbmV0X2Vycm9yX21lc3NhZ2Uoc29hcCxzb2FwLT5lcnJvcikgKSk7CisgICAgICAgIH0KKyAgICB9IAorICAgIHdoaWxlICggYlJlc3VsdCAmJiBkd0J5dGVzUmVhZCAmJiB1aVRvdGFsQnl0ZXNSZWFkIDwgYV91aUJ1ZmZlckxlbiApOworCisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsIAorICAgICAgICAid2luaW5ldCAlcDogcmVjdiwgcmVjZWl2ZWQgJWx1IGJ5dGVzXG4iLCBzb2FwLCB1aVRvdGFsQnl0ZXNSZWFkICkpOworCisgICAgcmV0dXJuIHVpVG90YWxCeXRlc1JlYWQ7Cit9IAorCisvKiBnc29hcCBkb2N1bWVudGF0aW9uOgorICAgIENhbGxlZCBieSBjbGllbnQgcHJveHkgbXVsdGlwbGUgdGltZXMsIHRvIGNsb3NlIGEgc29ja2V0IGNvbm5lY3Rpb24gYmVmb3JlCisgICAgYSBuZXcgc29ja2V0IGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQgYW5kIGF0IHRoZSBlbmQgb2YgY29tbXVuaWNhdGlvbnMgCisgICAgd2hlbiB0aGUgU09BUF9JT19LRUVQQUxJVkUgZmxhZyBpcyBub3Qgc2V0IGFuZCBzb2FwLmtlZXBfYWxpdmUgPSAwIAorICAgIChpbmRpY2F0aW5nIHRoYXQgdGhlIG90aGVyIHBhcnR5IHN1cHBvcnRzIGtlZXAgYWxpdmUpLiBTaG91bGQgcmV0dXJuIAorICAgIFNPQVBfT0ssIG9yIGEgZ1NPQVAgZXJyb3IgY29kZS4gQnVpbHQtaW4gZ1NPQVAgZnVuY3Rpb246IHRjcF9kaXNjb25uZWN0CisgKi8KK3N0YXRpYyBpbnQgCit3aW5pbmV0X2Rpc2Nvbm5lY3QoIAorICAgIHN0cnVjdCBzb2FwICogICBzb2FwICkKK3sKKyAgICBzdHJ1Y3Qgd2luaW5ldF9kYXRhICogcERhdGEgPSAKKyAgICAgICAgKHN0cnVjdCB3aW5pbmV0X2RhdGEgKikgc29hcF9sb29rdXBfcGx1Z2luKCBzb2FwLCB3aW5pbmV0X2lkICk7CisKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIndpbmluZXQgJXA6IGRpc2Nvbm5lY3RcbiIsIHNvYXAgKSk7CisKKyAgICAvKiBmb3JjZSBhIGRpc2Nvbm5lY3QgYnkgc2V0dGluZyB0aGUgZGlzY29ubmVjdCBmbGFnIHRvIFRSVUUgKi8KKyAgICBwRGF0YS0+YkRpc2Nvbm5lY3QgPSBUUlVFOworICAgIHdpbmluZXRfaGF2ZV9jb25uZWN0aW9uKCBzb2FwLCBwRGF0YSApOworCisgICAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qIHRoaXMgaXMgbW9zdGx5IGZvciBkZWJ1ZyB0cmFjaW5nICovCit2b2lkIENBTExCQUNLCit3aW5pbmV0X2NhbGxiYWNrKAorICAgIEhJTlRFUk5FVCAgIGhJbnRlcm5ldCwKKyAgICBEV09SRF9QVFIgICBkd0NvbnRleHQsCisgICAgRFdPUkQgICAgICAgZHdJbnRlcm5ldFN0YXR1cywKKyAgICBMUFZPSUQgICAgICBscHZTdGF0dXNJbmZvcm1hdGlvbiwKKyAgICBEV09SRCAgICAgICBkd1N0YXR1c0luZm9ybWF0aW9uTGVuZ3RoICkKK3sKKyAgICBzdHJ1Y3Qgc29hcCAqIHNvYXAgPSAoc3RydWN0IHNvYXAgKikgZHdDb250ZXh0OworCisgICAgVU5VU0VEX0FSRyggaEludGVybmV0ICk7CisgICAgVU5VU0VEX0FSRyggbHB2U3RhdHVzSW5mb3JtYXRpb24gKTsKKyAgICBVTlVTRURfQVJHKCBkd1N0YXR1c0luZm9ybWF0aW9uTGVuZ3RoICk7CisKKyAgICBzd2l0Y2ggKCBkd0ludGVybmV0U3RhdHVzICkKKyAgICB7CisgICAgY2FzZSBJTlRFUk5FVF9TVEFUVVNfUkVTT0xWSU5HX05BTUU6CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLAorICAgICAgICAgICAgIndpbmluZXQgJXA6IElOVEVSTkVUX1NUQVRVU19SRVNPTFZJTkdfTkFNRVxuIiwgc29hcCApKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJTlRFUk5FVF9TVEFUVVNfTkFNRV9SRVNPTFZFRDoKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsCisgICAgICAgICAgICAid2luaW5ldCAlcDogSU5URVJORVRfU1RBVFVTX05BTUVfUkVTT0xWRURcbiIsIHNvYXAgKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSU5URVJORVRfU1RBVFVTX0NPTk5FQ1RJTkdfVE9fU0VSVkVSOiAKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsCisgICAgICAgICAgICAid2luaW5ldCAlcDogSU5URVJORVRfU1RBVFVTX0NPTk5FQ1RJTkdfVE9fU0VSVkVSXG4iLCBzb2FwKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSU5URVJORVRfU1RBVFVTX0NPTk5FQ1RFRF9UT19TRVJWRVI6CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLAorICAgICAgICAgICAgIndpbmluZXQgJXA6IElOVEVSTkVUX1NUQVRVU19DT05ORUNURURfVE9fU0VSVkVSXG4iLCBzb2FwKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSU5URVJORVRfU1RBVFVTX1NFTkRJTkdfUkVRVUVTVDoKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsCisgICAgICAgICAgICAid2luaW5ldCAlcDogSU5URVJORVRfU1RBVFVTX1NFTkRJTkdfUkVRVUVTVFxuIiwgc29hcCkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElOVEVSTkVUX1NUQVRVU19SRVFVRVNUX1NFTlQ6CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLAorICAgICAgICAgICAgIndpbmluZXQgJXA6IElOVEVSTkVUX1NUQVRVU19SRVFVRVNUX1NFTlQsIGJ5dGVzIHNlbnQgPSAlbHVcbiIsIAorICAgICAgICAgICAgc29hcCwgKihEV09SRCAqKWxwdlN0YXR1c0luZm9ybWF0aW9uICkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElOVEVSTkVUX1NUQVRVU19SRUNFSVZJTkdfUkVTUE9OU0U6CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLAorICAgICAgICAgICAgIndpbmluZXQgJXA6IElOVEVSTkVUX1NUQVRVU19SRUNFSVZJTkdfUkVTUE9OU0VcbiIsIHNvYXApKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJTlRFUk5FVF9TVEFUVVNfUkVTUE9OU0VfUkVDRUlWRUQ6CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLAorICAgICAgICAgICAgIndpbmluZXQgJXA6IElOVEVSTkVUX1NUQVRVU19SRVNQT05TRV9SRUNFSVZFRCwgYnl0ZXMgcmVjZWl2ZWQgPSAlbHVcbiIsIAorICAgICAgICAgICAgc29hcCwgKihEV09SRCAqKWxwdlN0YXR1c0luZm9ybWF0aW9uICkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElOVEVSTkVUX1NUQVRVU19DVExfUkVTUE9OU0VfUkVDRUlWRUQ6CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLAorICAgICAgICAgICAgIndpbmluZXQgJXA6IElOVEVSTkVUX1NUQVRVU19DVExfUkVTUE9OU0VfUkVDRUlWRURcbiIsIHNvYXApKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJTlRFUk5FVF9TVEFUVVNfUFJFRkVUQ0g6CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLAorICAgICAgICAgICAgIndpbmluZXQgJXA6IElOVEVSTkVUX1NUQVRVU19QUkVGRVRDSFxuIiwgc29hcCkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElOVEVSTkVUX1NUQVRVU19DTE9TSU5HX0NPTk5FQ1RJT046CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLAorICAgICAgICAgICAgIndpbmluZXQgJXA6IElOVEVSTkVUX1NUQVRVU19DTE9TSU5HX0NPTk5FQ1RJT05cbiIsIHNvYXApKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJTlRFUk5FVF9TVEFUVVNfQ09OTkVDVElPTl9DTE9TRUQ6CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLAorICAgICAgICAgICAgIndpbmluZXQgJXA6IElOVEVSTkVUX1NUQVRVU19DT05ORUNUSU9OX0NMT1NFRFxuIiwgc29hcCkpOworICAgICAgICB7CisgICAgICAgICAgICAvKiB0aGUgY29ubmVjdGlvbiBoYXMgYmVlbiBjbG9zZWQsIHNvIHdlIGNsb3NlIHRoZSBoYW5kbGUgaGVyZSAqLworICAgICAgICAgICAgc3RydWN0IHdpbmluZXRfZGF0YSAqIHBEYXRhID0gCisgICAgICAgICAgICAgICAgKHN0cnVjdCB3aW5pbmV0X2RhdGEgKikgc29hcF9sb29rdXBfcGx1Z2luKCBzb2FwLCB3aW5pbmV0X2lkICk7CisgICAgICAgICAgICBpZiAoIHBEYXRhLT5oQ29ubmVjdGlvbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogCisgICAgICAgICAgICAgICAgICAgIHdlIG9ubHkgbWFyayB0aGlzIGZvciBkaXNjb25uZWN0aW9uIG90aGVyd2lzZSB3ZSBnZXQgCisgICAgICAgICAgICAgICAgICAgIGVycm9ycyB3aGVuIHJlYWRpbmcgdGhlIGRhdGEgZnJvbSB0aGUgaGFuZGxlLiBJbiBldmVyeSAKKyAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdGhhdCB3ZSB1c2UgdGhlIGNvbm5lY3Rpb24gd2Ugd2lsbCBjaGVjayBmaXJzdCB0byAKKyAgICAgICAgICAgICAgICAgICAgc2VlIGlmIGl0IGhhcyBiZWVuIGRpc2Nvbm5lY3RlZC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBwRGF0YS0+YkRpc2Nvbm5lY3QgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSU5URVJORVRfU1RBVFVTX0hBTkRMRV9DUkVBVEVEOgorICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywKKyAgICAgICAgICAgICJ3aW5pbmV0ICVwOiBJTlRFUk5FVF9TVEFUVVNfSEFORExFX0NSRUFURURcbiIsIHNvYXApKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJTlRFUk5FVF9TVEFUVVNfSEFORExFX0NMT1NJTkc6CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLAorICAgICAgICAgICAgIndpbmluZXQgJXA6IElOVEVSTkVUX1NUQVRVU19IQU5ETEVfQ0xPU0lOR1xuIiwgc29hcCkpOworICAgICAgICBicmVhazsKKy8vIFJlbW92ZWQgdG8gYXZvaWQgY29tcGlsZSBlcnJvcnMKKy8vICAgIGNhc2UgSU5URVJORVRfU1RBVFVTX0RFVEVDVElOR19QUk9YWToKKy8vICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywKKy8vICAgICAgICAgICAgIndpbmluZXQgJXA6IElOVEVSTkVUX1NUQVRVU19ERVRFQ1RJTkdfUFJPWFlcbiIsIHNvYXApKTsKKy8vICAgICAgICBicmVhazsKKyAgICBjYXNlIElOVEVSTkVUX1NUQVRVU19SRVFVRVNUX0NPTVBMRVRFOgorICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywKKyAgICAgICAgICAgICJ3aW5pbmV0ICVwOiBJTlRFUk5FVF9TVEFUVVNfUkVRVUVTVF9DT01QTEVURVxuIiwgc29hcCkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElOVEVSTkVUX1NUQVRVU19SRURJUkVDVDoKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsCisgICAgICAgICAgICAid2luaW5ldCAlcDogSU5URVJORVRfU1RBVFVTX1JFRElSRUNULCBuZXcgdXJsID0gJXNcbiIsIAorICAgICAgICAgICAgc29hcCwgKGNoYXIqKSBscHZTdGF0dXNJbmZvcm1hdGlvbiApKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJTlRFUk5FVF9TVEFUVVNfSU5URVJNRURJQVRFX1JFU1BPTlNFOgorICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywKKyAgICAgICAgICAgICJ3aW5pbmV0ICVwOiBJTlRFUk5FVF9TVEFUVVNfSU5URVJNRURJQVRFX1JFU1BPTlNFXG4iLCBzb2FwKSk7CisgICAgICAgIGJyZWFrOworLy8gUmVtb3ZlZCB0byBhdm9pZCBjb21waWxlIGVycm9ycworLy8gICAgY2FzZSBJTlRFUk5FVF9TVEFUVVNfVVNFUl9JTlBVVF9SRVFVSVJFRDoKKy8vICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywKKy8vICAgICAgICAgICAgIndpbmluZXQgJXA6IElOVEVSTkVUX1NUQVRVU19VU0VSX0lOUFVUX1JFUVVJUkVEXG4iLCBzb2FwKSk7CisvLyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJTlRFUk5FVF9TVEFUVVNfU1RBVEVfQ0hBTkdFOgorICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywKKyAgICAgICAgICAgICJ3aW5pbmV0ICVwOiBJTlRFUk5FVF9TVEFUVVNfU1RBVEVfQ0hBTkdFXG4iLCBzb2FwKSk7CisgICAgICAgIGJyZWFrOworLy8gUmVtb3ZlZCB0byBhdm9pZCBjb21waWxlIGVycm9ycworLy8gICAgY2FzZSBJTlRFUk5FVF9TVEFUVVNfQ09PS0lFX1NFTlQ6CisvLyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsCisvLyAgICAgICAgICAgICJ3aW5pbmV0ICVwOiBJTlRFUk5FVF9TVEFUVVNfQ09PS0lFX1NFTlRcbiIsIHNvYXApKTsKKy8vICAgICAgICBicmVhazsKKy8vICAgIGNhc2UgSU5URVJORVRfU1RBVFVTX0NPT0tJRV9SRUNFSVZFRDoKKy8vICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywKKy8vICAgICAgICAgICAgIndpbmluZXQgJXA6IElOVEVSTkVUX1NUQVRVU19DT09LSUVfUkVDRUlWRURcbiIsIHNvYXApKTsKKy8vICAgICAgICBicmVhazsKKy8vICAgIGNhc2UgSU5URVJORVRfU1RBVFVTX1BSSVZBQ1lfSU1QQUNURUQ6CisvLyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsCisvLyAgICAgICAgICAgICJ3aW5pbmV0ICVwOiBJTlRFUk5FVF9TVEFUVVNfUFJJVkFDWV9JTVBBQ1RFRFxuIiwgc29hcCkpOworLy8gICAgICAgIGJyZWFrOworLy8gICAgY2FzZSBJTlRFUk5FVF9TVEFUVVNfUDNQX0hFQURFUjoKKy8vICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywKKy8vICAgICAgICAgICAgIndpbmluZXQgJXA6IElOVEVSTkVUX1NUQVRVU19QM1BfSEVBREVSXG4iLCBzb2FwKSk7CisvLyAgICAgICAgYnJlYWs7CisvLyAgICBjYXNlIElOVEVSTkVUX1NUQVRVU19QM1BfUE9MSUNZUkVGOgorLy8gICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLAorLy8gICAgICAgICAgICAid2luaW5ldCAlcDogSU5URVJORVRfU1RBVFVTX1AzUF9QT0xJQ1lSRUZcbiIsIHNvYXApKTsKKy8vICAgICAgICBicmVhazsKKy8vICAgIGNhc2UgSU5URVJORVRfU1RBVFVTX0NPT0tJRV9ISVNUT1JZOgorLy8gICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLAorLy8gICAgICAgICAgICAid2luaW5ldCAlcDogSU5URVJORVRfU1RBVFVTX0NPT0tJRV9ISVNUT1JZXG4iLCBzb2FwKSk7CisvLyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKiAKKyAgICBjaGVjayB0byBlbnN1cmUgdGhhdCBvdXIgY29ubmVjdGlvbiBoYXNuJ3QgYmVlbiBkaXNjb25uZWN0ZWQgCisgICAgYW5kIGRpc2Nvbm5lY3QgcmVtYWluaW5nIGhhbmRsZXMgaWYgbmVjZXNzYXJ5LgorICovCitzdGF0aWMgQk9PTAord2luaW5ldF9oYXZlX2Nvbm5lY3Rpb24oCisgICAgc3RydWN0IHNvYXAgKiAgICAgICAgICAgc29hcCwKKyAgICBzdHJ1Y3Qgd2luaW5ldF9kYXRhICogICBhX3BEYXRhICkKK3sKKyAgICAvKiBjbG9zZSB0aGUgaHR0cCByZXF1ZXN0IGlmIHdlIGRvbid0IGhhdmUgYSBjb25uZWN0aW9uICovCisgICAgQk9PTCBiQ2xvc2VSZXF1ZXN0ID0gYV9wRGF0YS0+YkRpc2Nvbm5lY3QgfHwgIWFfcERhdGEtPmhDb25uZWN0aW9uOworICAgIGlmICggYkNsb3NlUmVxdWVzdCAmJiBzb2FwLT5zb2NrZXQgIT0gU09BUF9JTlZBTElEX1NPQ0tFVCApCisgICAgeworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgCisgICAgICAgICAgICAid2luaW5ldCAlcDogY2xvc2luZyByZXF1ZXN0XG4iLCBzb2FwKSk7CisKKyAgICAgICAgSW50ZXJuZXRDbG9zZUhhbmRsZSggKEhJTlRFUk5FVCkgc29hcC0+c29ja2V0ICk7CisgICAgICAgIHNvYXAtPnNvY2tldCA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorCisgICAgLyogY2xvc2UgdGhlIGNvbm5lY3Rpb24gaWYgd2UgZG9uJ3QgaGF2ZSBhIHJlcXVlc3QgKi8KKyAgICBpZiAoIHNvYXAtPnNvY2tldCA9PSBTT0FQX0lOVkFMSURfU09DS0VUICYmIGFfcERhdGEtPmhDb25uZWN0aW9uICkKKyAgICB7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAKKyAgICAgICAgICAgICJ3aW5pbmV0ICVwOiBjbG9zaW5nIGNvbm5lY3Rpb25cbiIsIHNvYXApKTsKKworICAgICAgICBJbnRlcm5ldENsb3NlSGFuZGxlKCBhX3BEYXRhLT5oQ29ubmVjdGlvbiApOworICAgICAgICBhX3BEYXRhLT5oQ29ubmVjdGlvbiA9IE5VTEw7CisgICAgfQorICAgIGFfcERhdGEtPmJEaXNjb25uZWN0ID0gRkFMU0U7CisKKyAgICAvKiBjbGVhbiB1cCB0aGUgc2VuZCBkZXRhaWxzIGlmIHdlIGRvbid0IGhhdmUgYSByZXF1ZXN0ICovCisgICAgaWYgKCBzb2FwLT5zb2NrZXQgPT0gU09BUF9JTlZBTElEX1NPQ0tFVCApCisgICAgeworICAgICAgICBpZiAoIGFfcERhdGEtPnBCdWZmZXIgKQorICAgICAgICB7CisgICAgICAgICAgICBmcmVlKCBhX3BEYXRhLT5wQnVmZmVyICk7CisgICAgICAgICAgICBhX3BEYXRhLT5wQnVmZmVyID0gMDsKKyAgICAgICAgfQorICAgICAgICBhX3BEYXRhLT51aUJ1ZmZlckxlbiA9IDA7CisgICAgICAgIGFfcERhdGEtPnVpQnVmZmVyTGVuTWF4ID0gSU5WQUxJRF9CVUZGRVJfTEVOR1RIOworICAgIH0KKworICAgIC8qIHdlIG5vdyBlaXRoZXIgc3RpbGwgaGF2ZSBib3RoIHJlcXVlc3QgYW5kIGNvbm5lY3Rpb24sIG9yIG5laXRoZXIgKi8KKyAgICByZXR1cm4gKGFfcERhdGEtPmhDb25uZWN0aW9uICE9IE5VTEwpOworfQorCitzdGF0aWMgRFdPUkQKK3dpbmluZXRfc2V0X3RpbWVvdXQoCisgICAgc3RydWN0IHNvYXAgKiAgICAgICAgICAgc29hcCwgCisgICAgc3RydWN0IHdpbmluZXRfZGF0YSAqICAgYV9wRGF0YSwKKyAgICBjb25zdCBjaGFyICogICAgICAgICAgICBhX3BzelRpbWVvdXQsCisgICAgRFdPUkQgICAgICAgICAgICAgICAgICAgYV9kd09wdGlvbiwKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBhX25UaW1lb3V0ICkKK3sKKyAgICBVTlVTRURfQVJHKCBzb2FwICk7CisgICAgVU5VU0VEX0FSRyggYV9wc3pUaW1lb3V0ICk7CisKKyAgICBpZiAoIGFfblRpbWVvdXQgPiAwICkKKyAgICB7CisgICAgICAgIERXT1JEIGR3VGltZW91dCA9IGFfblRpbWVvdXQgKiAxMDAwOworICAgICAgICBpZiAoICFJbnRlcm5ldFNldE9wdGlvbiggYV9wRGF0YS0+aEludGVybmV0LCAKKyAgICAgICAgICAgIGFfZHdPcHRpb24sICZkd1RpbWVvdXQsIHNpemVvZihEV09SRCkgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIERXT1JEIGR3RXJyb3JDb2RlID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgCisgICAgICAgICAgICAgICAgIndpbmluZXQgJXA6IGZhaWxlZCB0byBzZXQgJXMgdGltZW91dCwgZXJyb3IgJWQgKCVzKVxuIiwgCisgICAgICAgICAgICAgICAgc29hcCwgYV9wc3pUaW1lb3V0LCBkd0Vycm9yQ29kZSwgCisgICAgICAgICAgICAgICAgd2luaW5ldF9lcnJvcl9tZXNzYWdlKHNvYXAsZHdFcnJvckNvZGUpICkpOworICAgICAgICAgICAgcmV0dXJuIGR3RXJyb3JDb2RlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgQk9PTAord2luaW5ldF9yZXNvbHZlX3NlbmRfZXJyb3IoIAorICAgIEhJTlRFUk5FVCAgIGFfaEh0dHBSZXF1ZXN0LCAKKyAgICBEV09SRCAgICAgICBhX2R3RXJyb3JDb2RlICkKK3sKKyAgICBEV09SRCBkd1Jlc3VsdCA9IEludGVybmV0RXJyb3JEbGcoCisgICAgICAgIEdldERlc2t0b3BXaW5kb3coKSwgCisgICAgICAgIGFfaEh0dHBSZXF1ZXN0LCAKKyAgICAgICAgYV9kd0Vycm9yQ29kZSwKKyAgICAgICAgRkxBR1NfRVJST1JfVUlfRklMVEVSX0ZPUl9FUlJPUlMgfAorICAgICAgICBGTEFHU19FUlJPUl9VSV9GTEFHU19HRU5FUkFURV9EQVRBIHwKKyAgICAgICAgRkxBR1NfRVJST1JfVUlfRkxBR1NfQ0hBTkdFX09QVElPTlMsCisgICAgICAgIE5VTEwgKTsKKyAgICByZXR1cm4gKGR3UmVzdWx0ID09IEVSUk9SX0lOVEVSTkVUX0ZPUkNFX1JFVFJZIAorICAgICAgICB8fCBkd1Jlc3VsdCA9PSBFUlJPUl9TVUNDRVNTKTsKK30KKworI2lmZGVmIFNPQVBfREVCVUcKK3N0YXRpYyBjb25zdCBjaGFyICoKK3dpbmluZXRfZXJyb3JfbWVzc2FnZSgKKyAgICBzdHJ1Y3Qgc29hcCAqICAgc29hcCwKKyAgICBEV09SRCAgICAgICAgICAgYV9kd0Vycm9yTXNnSWQgKQoreworICAgIEhJTlNUQU5DRSAgIGhNb2R1bGU7CisgICAgRFdPUkQgICAgICAgZHdSZXN1bHQ7CisgICAgRFdPUkQgICAgICAgZHdGb3JtYXRGbGFnczsKKyAgICBzdHJ1Y3Qgd2luaW5ldF9kYXRhICogcERhdGEgPSAKKyAgICAgICAgKHN0cnVjdCB3aW5pbmV0X2RhdGEgKikgc29hcF9sb29rdXBfcGx1Z2luKCBzb2FwLCB3aW5pbmV0X2lkICk7CisKKyAgICAvKiBmcmVlIGFueSBleGlzdGluZyBlcnJvciBtZXNzYWdlICovCisgICAgd2luaW5ldF9mcmVlX2Vycm9yX21lc3NhZ2UoIHBEYXRhICk7CisKKyAgICBkd0Zvcm1hdEZsYWdzID0gCisgICAgICAgIEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiB8CisgICAgICAgIEZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTIHwKKyAgICAgICAgRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU07CisKKyAgICAvKiBsb2FkIHdpbmluZXQuZGxsIGZvciB0aGUgZXJyb3IgbWVzc2FnZXMgKi8KKyAgICBoTW9kdWxlID0gTG9hZExpYnJhcnlFeEEoICJ3aW5pbmV0LmRsbCIsIE5VTEwsCisgICAgICAgIExPQURfTElCUkFSWV9BU19EQVRBRklMRSB8IERPTlRfUkVTT0xWRV9ETExfUkVGRVJFTkNFUyApOworICAgIGlmICggaE1vZHVsZSApCisgICAgeworICAgICAgICBkd0Zvcm1hdEZsYWdzIHw9IEZPUk1BVF9NRVNTQUdFX0ZST01fSE1PRFVMRTsKKyAgICB9CisKKyAgICAvKiBmb3JtYXQgdGhlIG1lc3NhZ2VzICovCisgICAgZHdSZXN1bHQgPSBGb3JtYXRNZXNzYWdlQSggCisgICAgICAgIGR3Rm9ybWF0RmxhZ3MsIAorICAgICAgICBoTW9kdWxlLCAKKyAgICAgICAgYV9kd0Vycm9yTXNnSWQsIAorICAgICAgICBNQUtFTEFOR0lEKExBTkdfTkVVVFJBTCwgU1VCTEFOR19ORVVUUkFMKSwKKyAgICAgICAgKExQU1RSKSAmcERhdGEtPnBzekVycm9yTWVzc2FnZSwKKyAgICAgICAgMCwKKyAgICAgICAgTlVMTCApOworCisgICAgLyogZnJlZSB0aGUgbGlicmFyeSBpZiB3ZSBsb2FkZWQgaXQgKi8KKyAgICBpZiAoIGhNb2R1bGUgKQorICAgIHsKKyAgICAgICAgRnJlZUxpYnJhcnkoIGhNb2R1bGUgKTsKKyAgICB9CisKKyAgICAvKiByZW1vdmUgdGhlIENSIExGIGZyb20gdGhlIGVycm9yIG1lc3NhZ2UgKi8KKyAgICBpZiAoIGR3UmVzdWx0ID4gMiApCisgICAgeworICAgICAgICBwRGF0YS0+cHN6RXJyb3JNZXNzYWdlW2R3UmVzdWx0LTJdID0gMDsKKyAgICAgICAgcmV0dXJuIHBEYXRhLT5wc3pFcnJvck1lc3NhZ2U7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGNvbnN0IHN0YXRpYyBjaGFyIHN6VW5rbm93bltdID0gIih1bmtub3duKSI7CisgICAgICAgIHJldHVybiBzelVua25vd247CisgICAgfQorfQorCitzdGF0aWMgdm9pZAord2luaW5ldF9mcmVlX2Vycm9yX21lc3NhZ2UoCisgICAgc3RydWN0IHdpbmluZXRfZGF0YSAqICAgYV9wRGF0YSApCit7CisgICAgaWYgKCBhX3BEYXRhLT5wc3pFcnJvck1lc3NhZ2UgKQorICAgIHsKKyAgICAgICAgTG9jYWxGcmVlKCBhX3BEYXRhLT5wc3pFcnJvck1lc3NhZ2UgKTsKKyAgICAgICAgYV9wRGF0YS0+cHN6RXJyb3JNZXNzYWdlID0gMDsKKyAgICB9Cit9CisjZW5kaWYgLyogU09BUF9ERUJVRyAqLwpkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL2dzb2FwX3dpbi93aW5pbmV0L2dzb2FwV2luSW5ldC5oIGIvbW9kX2dzb2FwL2dzb2FwX3dpbi93aW5pbmV0L2dzb2FwV2luSW5ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZjI4OWEKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvZ3NvYXBfd2luL3dpbmluZXQvZ3NvYXBXaW5JbmV0LmgKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBGaWxlOiAgICBnc29hcFdpbkluZXQyLmgKKyAqCisgKiBBdXRob3JzOiAyNiBNYXkgMjAwMzogSmFjayBLdXN0YW5vd2l0eiAoamFja2tAYXRvbWljYS5jb20pCisgKiAgICAgICAgICBPcmlnaW5hbCB2ZXJzaW9uCisgKgorICogICAgICAgICAgMjkgU2VwdGVtYmVyIDIwMDM6IEJyb2RpZSBUaGllc2ZpZWxkIChidEBqZWxseWNhbi5jb20pCisgKiAgICAgICAgICBSZXdyaXR0ZW4gYXMgQyBwbHVnaW4gZm9yIGdzb2FwLiBCdWdzIGZpeGVkIGFuZCBmZWF0dXJlcyBhZGRlZC4KKyAqCisgKiAgICAgICAgICAxNCBKYW51YXJ5IDIwMDQ6IEJyb2RpZSBUaGllc2ZpZWxkIChidEBqZWxseWNhbi5jb20pCisgKiAgICAgICAgICBCdWcgZml4LgorICoKKyAqIFB1cnBvc2U6IEFsbG93IGdzb2FwIGNsaWVudHMgKG5vdCBzZXJ2ZXJzKSB0byBkaXJlY3QgYWxsIGNvbW11bmljYXRpb25zIAorICogICAgICAgICAgdGhyb3VnaCB0aGUgV2luSW5ldCBBUEkuIFRoaXMgYXV0b21hdGljYWxseSBwcm92aWRlcyBhbGwgb2YgdGhlIAorICogICAgICAgICAgcHJveHkgYW5kIGF1dGhlbnRpY2F0aW9uIGZlYXR1cmVzIHN1cHBvcnRlZCBieSB0aGUgY29udHJvbCBwYW5lbCAKKyAqICAgICAgICAgICdJbnRlcm5ldCBPcHRpb25zJyBkaWFsb2cgdG8gdGhlIGNsaWVudC4gQXMgdGhlc2Ugb3B0aW9ucyBhcmUgCisgKiAgICAgICAgICBzaGFyZWQgYnkgSUUsIHRoaXMgbWVhbnMgdGhhdCAiaWYgSUUgd29ya3MsIGdzb2FwIHdvcmtzLiIKKyAqCisgKiBGZWF0dXJlczoKKyAqICAgICAgICAgICsgZ3NvYXAgcGx1Z2luIC0gZXh0cmVtZWx5IGVhc3kgdG8gdXNlCisgKiAgICAgICAgICArIGNvbXBsZXRlIHN1cHBvcnQgZm9yOgorICogICAgICAgICAgICAgIC0gSFRUUC8xLjAgYW5kIEhUVFAvMS4xCisgKiAgICAgICAgICAgICAgLSBIVFRQUyAobm8gZXh0cmEgbGlicmFyaWVzIGFyZSByZXF1aXJlZCkKKyAqICAgICAgICAgICAgICAtIEhUVFAgYXV0aGVudGljYXRpb24KKyAqICAgICAgICAgICAgICAtIFByb3h5IHNlcnZlcnMgKHNpbXBsZSwgYXV0b21hdGljIGRpc2NvdmVyeSwgZXRjKQorICogICAgICAgICAgICAgIC0gUHJveHkgYXV0aGVudGljYXRpb24gKGJhc2ljLCBOVExNLCBldGMpCisgKiAgICAgICAgICArIGF1dGhlbnRpY2F0aW9uIHByb21wdHMgYW5kIEhUVFBTIHdhcm5pbmdzIChlLmcuIGludmFsaWQgSFRUUFMgQ0EpIAorICogICAgICAgICAgICAgIGNhbiBiZSByZXNvbHZlZCBieSB0aGUgdXNlciB2aWEgc3RhbmRhcmQgc3lzdGVtIGRpYWxvZyBib3hlcy4KKyAqICAgICAgICAgICsgbWVzc2FnZSBzaXplIGlzIGxpbWl0ZWQgb25seSBieSBhdmFpbGFibGUgbWVtb3J5CisgKiAgICAgICAgICArIGNvbm5lY3QsIHJlY2VpdmUgYW5kIHNlbmQgdGltZW91dHMgYXJlIHVzZWQgCisgKiAgICAgICAgICArIHN1cHBvcnRzIGFsbCBTT0FQX0lPIHR5cGVzIChzZWUgbGltaXRhdGlvbnMpCisgKiAgICAgICAgICArIHdyaXR0ZW4gY29tcGxldGVseSBpbiBDLCBjYW4gYmUgdXNlZCBpbiBDLCBDKyssIGFuZCBNRkMgcHJvamVjdHMKKyAqICAgICAgICAgICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiAoYW55d2hlcmUgdGhhdCBnc29hcCBpcyB1c2VkKQorICogICAgICAgICAgKyBjYW4gYmUgdXNlZCBpbiBib3RoIE1CQ1MgYW5kIFVOSUNPREUgcHJvamVjdHMKKyAqICAgICAgICAgICsgY29tcGlsZXMgY2xlYW5seSBhdCB3YXJuaW5nIGxldmVsIDQgKGlmIGdzb2FwIHVzZXMgU09BUF9TT0NLRVQKKyAqICAgICAgICAgICAgICBmb3IgdGhlIGRlZmluaXRpb24gb2Ygc29ja2V0cyBpbnN0ZWFkIG9mIGludCwgaXQgd2lsbCBhbHNvCisgKiAgICAgICAgICAgICAgY29tcGlsZSB3aXRob3V0IHdpbjY0IHdhcm5pbmdzKS4KKyAqICAgICAgICAgICsgYWxsIGRlYnVnIHRyYWNlIGdvZXMgdG8gdGhlIGdzb2FwIFRFU1QubG9nIGZpbGUgCisgKiAgICAgICAgICArIHN1cHBvcnRzIG11bHRpcGxlIHRocmVhZHMgKGFsbCBwbHVnaW4gZGF0YSBpcyBzdG9yZWQgaW4gdGhlIAorICogICAgICAgICAgICAgIHNvYXAgc3RydWN0dXJlIC0gbm8gc3RhdGljIHZhcmlhYmxlcykKKyAqCisgKiBMaW1pdGF0aW9uczoKKyAqICAgICAgICAgIC0gRElNRSBhdHRhY2htZW50cyBhcmUgbm90IHN1cHBvcnRlZAorICogICAgICAgICAgLSBtYXkgaW50ZXJuYWxseSBidWZmZXIgdGhlIGVudGlyZSBvdXRnb2luZyBtZXNzYWdlIGJlZm9yZSBzZW5kaW5nCisgKiAgICAgICAgICAgICAgKGlmIHRoZSBzZXJpYWxpemVkIG1lc3NhZ2UgaXMgbGFyZ2VyIHRoZW4gU09BUF9CVUZMRU4sIG9yIGlmIAorICogICAgICAgICAgICAgIFNPQVBfSU9fQ0hVTksgbW9kZSBpcyBiZWluZyB1c2VkIHRoZW4gdGhlIGVudGlyZSBtZXNzYWdlIHdpbGwgCisgKiAgICAgICAgICAgICAgYmUgYnVmZmVyZWQpCisgKgorICogVXNhZ2U6ICAgQWRkIHRoZSBnc29hcFdpbkluZXQyLmggYW5kIGdzb2FwV2luSW5ldDIuY3BwIGZpbGVzIHRvIHlvdXIgcHJvamVjdCAKKyAqICAgICAgICAgIChpZiB5b3UgaGF2ZSBhIEMgcHJvamVjdCwgcmVuYW1lIGdzb2FwV2luSW5ldDIuY3BwIHRvIC5jIGFuZCB1c2UKKyAqICAgICAgICAgIGl0IGFzIGlzKS4gRW5zdXJlIHRoYXQgeW91IHR1cm4gb2ZmIHByZWNvbXBpbGVkIGhlYWRlcnMgZm9yIHRoZSAKKyAqICAgICAgICAgIC5jcHAgZmlsZS4KKyAqCisgKiAgICAgICAgICBJbiB5b3VyIHNvdXJjZSwganVzdCBhZnRlciBjYWxsaW5nIHNvYXBfaW5pdCgpLCByZWdpc3RlciB0aGlzIAorICogICAgICAgICAgcGx1Z2luIHdpdGggc29hcF9yZWdpc3Rlcl9wbHVnaW4oIHNvYXAsIHdpbmluZXRfcGx1Z2luICkuIAorICoKKyAqICAgICAgICAgIGUuZy4KKyAqICAgICAgICAgICAgICBzdHJ1Y3Qgc29hcCBzb2FwOworICogICAgICAgICAgICAgIHNvYXBfaW5pdCggJnNvYXAgKTsKKyAqICAgICAgICAgICAgICBzb2FwX3JlZ2lzdGVyX3BsdWdpbiggJnNvYXAsIHdpbmluZXRfcGx1Z2luICk7CisgKiAgICAgICAgICAgICAgc29hcC5jb25uZWN0X3RpbWVvdXQgPSA1OyAvLyB0aGlzIHdpbGwgYmUgdXNlZCBieSB3aW5pbmV0IHRvbworICogICAgICAgICAgICAgIC4uLgorICogICAgICAgICAgICAgIHNvYXBfZG9uZSgmc29hcCk7CisgKgorICogTm90ZXM6ICAgRm9yIGV4dHJhIGNvbnRyb2wsIHlvdSBtYXkgYWxzbyByZWdpc3RlciB0aGlzIHBsdWdpbiB1c2luZyB0aGUgCisgKiAgICAgICAgICBzb2FwX3JlZ2lzdGVyX3BsdWdpbl9hcmcoKSBmdW5jdGlvbiwgYW5kIHN1cHBseSBhcyB0aGUgYXJndW1lbnQgCisgKiAgICAgICAgICBmbGFncyB3aGljaCB5b3Ugd2lzaGVkIHRvIGJlIHBhc3NlZCB0byBIdHRwT3BlblJlcXVlc3QuIAorICoKKyAqICAgICAgICAgIGUuZy4KKyAqICAgICAgICAgICAgICBzdHJ1Y3Qgc29hcCBzb2FwOworICogICAgICAgICAgICAgIHNvYXBfaW5pdCggJnNvYXAgKTsKKyAqICAgICAgICAgICAgICBzb2FwX3JlZ2lzdGVyX3BsdWdpbl9hcmcoICZzb2FwLCB3aW5pbmV0X3BsdWdpbiwKKyAqICAgICAgICAgICAgICAgICAgKHZvaWQqKSBJTlRFUk5FVF9GTEFHX0lHTk9SRV9DRVJUX0NOX0lOVkFMSUQgKTsKKyAqCisgKiAgICAgICAgICBTZWUgdGhlIE1TRE4gZG9jdW1lbnRhdGlvbiBvbiBIdHRwT3BlblJlcXVlc3QgZm9yIGRldGFpbHMgb2YgCisgKiAgICAgICAgICBhdmFpbGFibGUgZmxhZ3MuIFRoZSA8d2luaW5ldC5oPiBoZWFkZXIgZmlsZSBpcyByZXF1aXJlZCBmb3IgdGhlIAorICogICAgICAgICAgZGVmaW5pdGlvbnMgb2YgdGhlIGZsYWdzLiBTb21lIGZsYWdzIHdoaWNoIG1heSBiZSB1c2VmdWwgYXJlOgorICoKKyAqICAgICAgICAgICAgICBJTlRFUk5FVF9GTEFHX0tFRVBfQ09OTkVDVElPTgorICogICAgICAgICAgICAgIFVzZXMga2VlcC1hbGl2ZSBzZW1hbnRpY3MsIGlmIGF2YWlsYWJsZSwgZm9yIHRoZSBjb25uZWN0aW9uLiAKKyAqICAgICAgICAgICAgICBUaGlzIGZsYWcgaXMgcmVxdWlyZWQgZm9yIE1pY3Jvc29mdCBOZXR3b3JrIChNU04pLCBOVCBMQU4gCisgKiAgICAgICAgICAgICAgTWFuYWdlciAoTlRMTSksIGFuZCBvdGhlciB0eXBlcyBvZiBhdXRoZW50aWNhdGlvbi4gCisgKiAgICAgICAgICAgICAgKysgTm90ZSB0aGF0IHRoaXMgZmxhZyBpcyB1c2VkIGF1dG9tYXRpY2FsbHkgd2hlbiBzb2FwLm9tb2RlIAorICogICAgICAgICAgICAgIGhhcyB0aGUgU09BUF9JT19LRUVQQUxJVkUgZmxhZyBzZXQuICsrCisgKgorICogICAgICAgICAgICAgIElOVEVSTkVUX0ZMQUdfSUdOT1JFX0NFUlRfQ05fSU5WQUxJRAorICogICAgICAgICAgICAgIERpc2FibGVzIE1pY3Jvc29mdCBXaW4zMiBJbnRlcm5ldCBmdW5jdGlvbiBjaGVja2luZyBvZiBTU0wvUENULQorICogICAgICAgICAgICAgIGJhc2VkIGNlcnRpZmljYXRlcyB0aGF0IGFyZSByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIgYWdhaW5zdCAKKyAqICAgICAgICAgICAgICB0aGUgaG9zdCBuYW1lIGdpdmVuIGluIHRoZSByZXF1ZXN0LiAKKyAqCisgKiAgICAgICAgICAgICAgSU5URVJORVRfRkxBR19JR05PUkVfQ0VSVF9EQVRFX0lOVkFMSUQKKyAqICAgICAgICAgICAgICBEaXNhYmxlcyBXaW4zMiBJbnRlcm5ldCBmdW5jdGlvbiBjaGVja2luZyBvZiBTU0wvUENULWJhc2VkIAorICogICAgICAgICAgICAgIGNlcnRpZmljYXRlcyBmb3IgcHJvcGVyIHZhbGlkaXR5IGRhdGVzLgorICoKKyAqICAgICAgICAgIFRoaXMgcGx1Z2luIHVzZXMgdGhlIGZvbGxvd2luZyBjYWxsYmFjayBmdW5jdGlvbnMgYW5kIGlzIG5vdCAKKyAqICAgICAgICAgIGNvbXBhdGlibGUgd2l0aCBhbnkgb3RoZXIgcGx1Z2luIHRoYXQgdXNlcyB0aGVzZSBmdW5jdGlvbnMuCisgKgorICogICAgICAgICAgICAgIHNvYXAtPmZvcGVuCisgKiAgICAgICAgICAgICAgc29hcC0+ZnBvc3RoZHIKKyAqICAgICAgICAgICAgICBzb2FwLT5mc2VuZAorICogICAgICAgICAgICAgIHNvYXAtPmZyZWN2CisgKiAgICAgICAgICAgICAgc29hcC0+ZmNsb3NlCisgKgorICogICAgICAgICAgSWYgdGhlcmUgYXJlIGVycm9ycyBpbiBzZW5kaW5nIHRoZSBIVFRQIHJlcXVlc3Qgd2hpY2ggd291bGQgCisgKiAgICAgICAgICBjYXVzZSBhIGRpYWxvZyBib3ggdG8gYmUgZGlzcGxheWVkIGluIElFIChmb3IgaW5zdGFuY2UsIGludmFsaWQKKyAqICAgICAgICAgIGNlcnRpZmljYXRlcyBvbiBhbiBIVFRQUyBjb25uZWN0aW9uKSwgdGhlbiBhIGRpYWxvZyB3aWxsIGFsc28KKyAqICAgICAgICAgIGJlIGRpc3BsYXllZCBieSB0aGlzIGxpYnJhcnkuIEF0IHRoZSBtb21lbnQgaXMgaXMgbm90IHBvc3NpYmxlCisgKiAgICAgICAgICB0byBkaXNhYmxlIHRoZSBVSS4gSWYgeW91IHdpc2ggdG8gcmVtb3ZlIHRoZSBVSSB0aGVuIHlvdSB3aWxsIAorICogICAgICAgICAgbmVlZCB0byBoYWNrIHRoZSBzb3VyY2UgdG8gcmVtb3ZlIHRoZSBkaWFsb2cgYm94IGFuZCByZXNvbHZlIHRoZQorICogICAgICAgICAgZXJyb3JzIHByb2dyYW1tYXRpY2FsbHksIG9yIHN1cHBseSB0aGUgYXBwcm9wcmlhdGUgZmxhZ3MgaW4KKyAqICAgICAgICAgIHNvYXBfcmVnaXN0ZXJfcGx1Z2luX2FyZygpIHRvIGRpc2FibGUgdGhlIHVud2FudGVkIHdhcm5pbmdzLgorICoKKyAqICAgICAgICAgIEJlY2F1c2UgbWVzc2FnZXMgYXJlIGJ1ZmZlcmVkIGludGVybmFsbHkgdG8gZ3NvYXBXaW5JbmV0MiBwbHVnaW4KKyAqICAgICAgICAgIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlIFNPQVBfSU9fU1RPUkUgZmxhZyBpcyBub3QgdXNlZCBvdGhlcndpc2UKKyAqICAgICAgICAgIHRoZSBtZXNzYWdlIG1heSBiZSBidWZmZXJlZCB0d2ljZSBvbiBldmVyeSBzZW5kLiBVc2UgdGhlIGRlZmF1bHQKKyAqICAgICAgICAgIGZsYWcgU09BUF9JT19CVUZGRVIsIG9yIFNPQVBfSU9fRkxVU0guCisgKgorICogUmVkaXN0cmlidXRpb246IAorICogICAgICAgICAgRmVlbCBmcmVlIHRvIHVzZSwgaW1wcm92ZSwgYW5kIHNoYXJlLiAgSSB3b3VsZCBhcHByZWNpYXRlIAorICogICAgICAgICAgbm90aWZpY2F0aW9uIG9mIGFueSBidWdzIGZvdW5kL2ZpeGVkLCBvciBpbXByb3ZlbWVudHMgbWFkZS4gVGhpcyAKKyAqICAgICAgICAgIGNvZGUgaGFzIG5vdCBiZWVuIGV4dGVuc2l2ZWx5IHRlc3RlZCwgc28gdXNlIGF0IHlvdXIgb3duIHJpc2suICAKKyAqLworI2lmbmRlZiBJTkNMVURFRF9nc29hcFdpbkluZXQyX2gKKyNkZWZpbmUgSU5DTFVERURfZ3NvYXBXaW5JbmV0Ml9oCisKKyNpbmNsdWRlIDxzdGRzb2FwMi5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIAorCitleHRlcm4gaW50IAord2luaW5ldF9wbHVnaW4oIAorICAgIHN0cnVjdCBzb2FwICogICAgICAgICAgIGFfcFNvYXAsIAorICAgIHN0cnVjdCBzb2FwX3BsdWdpbiAqICAgIGFfcFBsdWdpbkRhdGEsIAorICAgIHZvaWQgKiAgICAgICAgICAgICAgICAgIGFfcFVudXNlZCApOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAKKworI2VuZGlmIC8vIElOQ0xVREVEX2dzb2FwV2luSW5ldDJfaApkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzLy5pbmRlbnQucHJvIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzLy5pbmRlbnQucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMjcwNDUKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvLmluZGVudC5wcm8KQEAgLTAsMCArMSwxMCBAQAorLS1icmFjZXMtYWZ0ZXItaWYtbGluZSAKKy0taW5kZW50LWxldmVsNCAKKy1scCAtZGkxIC1udXQgLWJsaTAgLW5wY3MgCistbnNhZiAtbnNhdyAtbnNhaQorLWNkYiAtc2MKKy1uY2UKKy0tZm9ybWF0LWZpcnN0LWNvbHVtbi1jb21tZW50cworLVRoYW5kbGVyX3JlYworLS1saW5lLWxlbmd0aDgwCistLXRhYi1zaXplNApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9Db25zb2xlU2VydmVyL0NvbnNvbGVNYWluLmNwcCBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9Db25zb2xlU2VydmVyL0NvbnNvbGVNYWluLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjQ5M2QyCi0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL0NvbnNvbGVTZXJ2ZXIvQ29uc29sZU1haW4uY3BwCkBAIC0wLDAgKzEsODkgQEAKKy8qKiBDb25zb2xlIEFwcGxpY2F0aW9uIHRvIHRlc3QgdGhlIGR5bmFtaWMgU09BUCBzZXJ2ZXIgZGxscyBpbiBhIHNpbXBsZSBjb21tYW5kbGluZSBlbnZpcm9ubWVudC4KKyAgKiBAZmlsZSBDb25zb2xlTWFpbi5jcHAKKyAgICBJdCB0ZXN0cyB0aGUgc2FtZSBTT0FQIHNlcnZlciBzaGFyZWQgbGlicmFyaWVzIHRoYXQgY2FuIGJlIGxhdGVyIGRlcGxveWVkIGluIHRoZSBBcGFjaGUgc2VydmVyLgorICAgIHRvIHRlc3QgaXQgZG8gdGhlIGZvbGxvd2luZzogU3RhcnQgdGhpcyBwcm9ncmFtLCBvcGVuIGEgY29tbWFuZGxpbmUgcHJvbXB0IHdpbmRvdywKKyAgICBjaGFuZ2UgdG8gdGhlIGJ1aWxkIG91dHB1dCBkaXJlY3RvcnkgYW5kIGVudGVyLgorICAqLworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxsdGRsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNpbmNsdWRlICJzdGRzb2FwMi5oIgorI2luY2x1ZGUgImFwYWNoZV9nc29hcC5oIgorCisvKiogdGhlIHBhcmFtZXRlciBwYXNzZWQgdG8gdGhlIGRsbCBmb3IgY29uc3RydWN0aW5nIGEgc2VydmVyLiAqLworc3RhdGljIGNvbnN0IGNoYXIgc3pRdWVyeVBhcmFtZXRlcltdID0gIkhlbGxvV29ybGQiOworCisvKiogUnVuIGEgc2luZ2xlIHRocmVhZGVkIGxvb3AgdG8gYWNjZXB0IGNsaWVudCByZXF1ZXN0cy4KKyAgKi8KKwordm9pZCBtYWluKGNvbnN0IGludCAvKmFyZ2MqLywgY29uc3QgY2hhciAqYXJndltdKSB7CisgICAgY2hhciBzelNlYXJjaFBhdGhbMTAyNF07CisgICAgc3RydWN0IHNvYXAgc29hcDsKKyAgICBpbnQgblJldCA9IFNPQVBfT0s7CisgICAgc3RydWN0IGFwYWNoZV9zb2FwX2ludGVyZmFjZSBJbnRmOworICAgIG1lbXNldCgmSW50ZiwgMCwgc2l6ZW9mIEludGYpOworICAgIAorICAgIG1lbXNldChzelNlYXJjaFBhdGgsIDAsIHNpemVvZiBzelNlYXJjaFBhdGgpOworICAgIGdldGN3ZChzelNlYXJjaFBhdGgsIHNpemVvZiBzelNlYXJjaFBhdGgpOworICAgIAorICAgIHN0cmNhdChzelNlYXJjaFBhdGgsICIvLi4vZXhhbXBsZS9jYWxjdWxhdG9yIik7CisgICAgY291dCA8PCAicGF0aCBpczogJyI8PCBzelNlYXJjaFBhdGggPDwgIiciPDwgZW5kbDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBzekxpYnJhcnlOYW1lW10gPSAibGliQ2FsY3VsYXRvciI7CisKKyAgICBpbnQgbk9LID0gbHRfZGxpbml0KCk7CisgICAgaWYgKDAgIT0gbk9LKSB7CisgICAgICAgIGNlcnIgPDwgImZhaWxlZCB0byBsdF9kbGluaXQoKSIgPDwgZW5kbDsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9IAorICAgIC8vc2V0IHRoZSBwYXRoIHdoZXJlIHRoZSBsaWJyYXJ5IGNhbiBiZSBmb3VuZDoKKyAgICBuT0sgPSBsdF9kbGFkZHNlYXJjaGRpcihzelNlYXJjaFBhdGgpOworICAgIGlmICgwICE9IG5PSykgeworICAgICAgICBjZXJyIDw8ICJmYWlsZWQgdG8gc2V0IHNlYXJjaCBwYXRoIGZvciBsb2FkaW5nIGxpYnJhcnkiIDw8IGVuZGw7CisgICAgfQorICAgIGNvdXQgPDwgIlRoZSB0aGUgc2VhcmNoIGRpcmVjdG9yeSBmb3Igc2hhcmVkIGxpYnJhcmllcyBpczogJyIgPDwgbHRfZGxnZXRzZWFyY2hwYXRoKCkgPDwgIiciIDw8IGVuZGw7CisgICAgbHRfZGxoYW5kbGUgc29hcGxpYiA9IE5VTEw7CisgICAgdm9pZCAqcGZ1biAgPSBOVUxMOyAvLyBvdXIgZW50cnkgcG9pbnQgCisgICAgaWYgKDAgPT0gbk9LKSB7CisgICAgICAgIHNvYXBsaWIgPSBsdF9kbG9wZW5leHQoc3pMaWJyYXJ5TmFtZSk7CisgICAgICAgIGlmIChOVUxMID09IHNvYXBsaWIpIHsKKwkgICAgY2VyciA8PCAiZmFpbGVkIHRvIG9wZW4gIiA8PCBzelNlYXJjaFBhdGggPDwgIiwgbGliICIKKwkJIDw8IHN6TGlicmFyeU5hbWUgPDwgIiBsYXN0IGVycm9yOiAiIDw8IGx0X2RsZXJyb3IoKSA8PCBlbmRsOworCQkJbk9LID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvdXQgPDwgInRoZSBsaWJyYXJ5ICIgPDwgc3pMaWJyYXJ5TmFtZSA8PCAiIHdhcyBsb2FkZWQiIDw8IGVuZGw7CisJCX0KKyAgICB9CisgICAgaWYgKDAgPT0gbk9LKSB7CisgICAgICAgIHBmdW4gPSAodm9pZCAqKWx0X2Rsc3ltKHNvYXBsaWIsIEFQQUNIRV9IVFRQU0VSVkVSX0VOVFJZX1BPSU5UKTsKKyAgICAgICAgaWYgKE5VTEwgPT0gcGZ1bikgeworCQkJY291dCA8PCAiZW50cnkgcG9pbnQgIiA8PCBBUEFDSEVfSFRUUFNFUlZFUl9FTlRSWV9QT0lOVCA8PCAiIG5vdCBmb3VuZCIgPDwgZW5kbDsKKwkJCW5PSyA9IDE7CisJCX0gZWxzZSB7CisJCQljb3V0IDw8ICJlbnRyeSBwb2ludCAiIDw8IEFQQUNIRV9IVFRQU0VSVkVSX0VOVFJZX1BPSU5UIDw8ICIgZm91bmQiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKDAgPT0gbk9LKSB7CisJCWFwYWNoZV9pbml0X3NvYXBfaW50ZXJmYWNlX2ZuIHBmbiA9IChhcGFjaGVfaW5pdF9zb2FwX2ludGVyZmFjZV9mbikocGZ1bik7CisJCSgqcGZuKSgmSW50Zik7CisJCWlmIChOVUxMICE9IEludGYuZnNvYXBfaW5pdCkgeworCQkJKCpJbnRmLmZzb2FwX2luaXQpKCZzb2FwKTsKKwkJCWlmIChOVUxMICE9IEludGYuZnNvYXBfc2VydmUpIHsKKwkJCQlpbnQgblJldCA9ICgqSW50Zi5mc29hcF9zZXJ2ZSkoJnNvYXApOworCQkJfQorCQkJLy9UT0RPOiBjYWxsIGNsZWFudXAgZnVuY3Rpb25zLgorICAgICAgIH0KKyAgICB9CisgICAgaWYgKE5VTEwgIT0gc29hcGxpYikgeworICAgICAgICBpbnQgbkNsb3NlID0gbHRfZGxjbG9zZShzb2FwbGliKTsKKwlpZiAoMCAhPSBuQ2xvc2UpIHsKKyAgICAgICAgICAgIGNlcnIgPDwgImZhaWxlZCB0byB1bmxvYWQgdGhlIHNvYXAgc2VydmVyIiA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorICAgIGx0X2RsZXhpdCgpOworfQorCmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvQ29uc29sZVNlcnZlci9NYWtlZmlsZSBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9Db25zb2xlU2VydmVyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YWZlMjQKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvQ29uc29sZVNlcnZlci9NYWtlZmlsZQpAQCAtMCwwICsxLDQ0NSBAQAorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhdXRvbWFrZSAxLjUgZnJvbSBNYWtlZmlsZS5hbS4KKworIyBDb3B5cmlnaHQgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMQorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKKworCitTSEVMTCA9IC9iaW4vc2gKKworc3JjZGlyID0gLgordG9wX3NyY2RpciA9IC4uCisKK3ByZWZpeCA9IC91c3IvbG9jYWwKK2V4ZWNfcHJlZml4ID0gJHtwcmVmaXh9CisKK2JpbmRpciA9ICR7ZXhlY19wcmVmaXh9L2Jpbgorc2JpbmRpciA9ICR7ZXhlY19wcmVmaXh9L3NiaW4KK2xpYmV4ZWNkaXIgPSAke2V4ZWNfcHJlZml4fS9saWJleGVjCitkYXRhZGlyID0gJHtwcmVmaXh9L3NoYXJlCitzeXNjb25mZGlyID0gJHtwcmVmaXh9L2V0Yworc2hhcmVkc3RhdGVkaXIgPSAke3ByZWZpeH0vY29tCitsb2NhbHN0YXRlZGlyID0gJHtwcmVmaXh9L3ZhcgorbGliZGlyID0gJHtleGVjX3ByZWZpeH0vbGliCitpbmZvZGlyID0gJHtwcmVmaXh9L2luZm8KK21hbmRpciA9ICR7cHJlZml4fS9tYW4KK2luY2x1ZGVkaXIgPSAke3ByZWZpeH0vaW5jbHVkZQorb2xkaW5jbHVkZWRpciA9IC91c3IvaW5jbHVkZQorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvbW9kX2dzb2FwCitwa2dsaWJkaXIgPSAkKGxpYmRpcikvbW9kX2dzb2FwCitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9tb2RfZ3NvYXAKK3RvcF9idWlsZGRpciA9IC4uCisKK0FDTE9DQUwgPSAke1NIRUxMfSAvaG9tZS9hYmVyZ2VyL2FwYWNoZV9nc29hcC4wLjAuNS9taXNzaW5nIC0tcnVuIGFjbG9jYWwKK0FVVE9DT05GID0gJHtTSEVMTH0gL2hvbWUvYWJlcmdlci9hcGFjaGVfZ3NvYXAuMC4wLjUvbWlzc2luZyAtLXJ1biBhdXRvY29uZgorQVVUT01BS0UgPSAke1NIRUxMfSAvaG9tZS9hYmVyZ2VyL2FwYWNoZV9nc29hcC4wLjAuNS9taXNzaW5nIC0tcnVuIGF1dG9tYWtlCitBVVRPSEVBREVSID0gJHtTSEVMTH0gL2hvbWUvYWJlcmdlci9hcGFjaGVfZ3NvYXAuMC4wLjUvbWlzc2luZyAtLXJ1biBhdXRvaGVhZGVyCisKK0lOU1RBTEwgPSAvdXNyL2Jpbi9naW5zdGFsbCAtYworSU5TVEFMTF9QUk9HUkFNID0gJHtJTlNUQUxMfQorSU5TVEFMTF9EQVRBID0gJHtJTlNUQUxMfSAtbSA2NDQKK0lOU1RBTExfU0NSSVBUID0gJHtJTlNUQUxMfQorSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKK3RyYW5zZm9ybSA9IHMseCx4LAorTk9STUFMX0lOU1RBTEwgPSA6CitQUkVfSU5TVEFMTCA9IDoKK1BPU1RfSU5TVEFMTCA9IDoKK05PUk1BTF9VTklOU1RBTEwgPSA6CitQUkVfVU5JTlNUQUxMID0gOgorUE9TVF9VTklOU1RBTEwgPSA6CitidWlsZF9hbGlhcyA9IGk2ODYtc3VzZS1saW51eAorYnVpbGRfdHJpcGxldCA9IGk2ODYtc3VzZS1saW51eAoraG9zdF9hbGlhcyA9IGk2ODYtc3VzZS1saW51eAoraG9zdF90cmlwbGV0ID0gaTY4Ni1zdXNlLWxpbnV4Cit0YXJnZXRfYWxpYXMgPSBpNjg2LXN1c2UtbGludXgKK3RhcmdldF90cmlwbGV0ID0gaTY4Ni1zdXNlLWxpbnV4CitBTVRBUiA9ICR7U0hFTEx9IC9ob21lL2FiZXJnZXIvYXBhY2hlX2dzb2FwLjAuMC41L21pc3NpbmcgLS1ydW4gdGFyCitBUFhTX0NYWF9PUFRJT05TID0gCitBUyA9IGFzCitBV0sgPSBnYXdrCitDQyA9IGdjYworQ1BQID0gZ2NjIC1FCitDWFggPSBnKysKK0NYWERFQlVHREVGSU5FUyA9IC1EX05ERUJVRworQ1hYRkxBR1MgPSAgLU8yCitERVBESVIgPSAuZGVwcworRExMVE9PTCA9IGRsbHRvb2wKK0VDSE8gPSBlY2hvCitFWEVFWFQgPSAKK0VYSVNUU19BUFhTID0geWVzCitHU09BUF9DUFBfU1JDID0gQEdTT0FQX0NQUF9TUkNACitHU09BUF9DX1NSQyA9IEBHU09BUF9DX1NSQ0AKK0dTT0FQX0lOQ0xVREUgPSBAR1NPQVBfSU5DTFVERUAKK0dTT0FQX1BSRUZJWCA9IEBHU09BUF9QUkVGSVhACitJTlNUQUxMX1NUUklQX1BST0dSQU0gPSAke1NIRUxMfSAkKGluc3RhbGxfc2gpIC1jIC1zCitMSUJUT09MID0gJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wKK0xJQlRPT0xfREVQUyA9IC4vbHRtYWluLnNoCitMTl9TID0gbG4gLXMKK09CSkRVTVAgPSBvYmpkdW1wCitPQkpFWFQgPSBvCitQQUNLQUdFID0gbW9kX2dzb2FwCitSQU5MSUIgPSByYW5saWIKK1NUUklQID0gc3RyaXAKK1ZFUlNJT04gPSAwLjAuNQorYW1fX2luY2x1ZGUgPSBpbmNsdWRlCithbV9fcXVvdGUgPSAKK2luc3RhbGxfc2ggPSAvaG9tZS9hYmVyZ2VyL2FwYWNoZV9nc29hcC4wLjAuNS9pbnN0YWxsLXNoCisKK0FNX0NQUEZMQUdTID0gLURfUkVFTlRSQU5UICQoQ1hYREVCVUdERUZJTkVTKQorCitJTkNMVURFUyA9IC1JJChHU09BUF9QUkVGSVgpIC1JJCh0b3BfYnVpbGRkaXIpCisKK2FwYWNoZV9kaXIgPSAkKHRvcF9idWlsZGRpcikKKworU1VCRElSUyA9IGZvbworCitiaW5fUFJPR1JBTVMgPSBzb2FwdGVzdAorc29hcHRlc3RfU09VUkNFUyA9IENvbnNvbGVNYWluLmNwcCAKKworc29hcHRlc3RfTERBREQgPSBcCisJLWxsdGRsIFwKKwktbHB0aHJlYWQKKworCitDTEVBTkZJTEVTID0gKn4gLmtkYmdyYy5zb2FwdGVzdAorc3ViZGlyID0gQ29uc29sZVNlcnZlcgorbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycworQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK2Jpbl9QUk9HUkFNUyA9IHNvYXB0ZXN0JChFWEVFWFQpCitQUk9HUkFNUyA9ICQoYmluX1BST0dSQU1TKQorCithbV9zb2FwdGVzdF9PQkpFQ1RTID0gQ29uc29sZU1haW4uJChPQkpFWFQpCitzb2FwdGVzdF9PQkpFQ1RTID0gJChhbV9zb2FwdGVzdF9PQkpFQ1RTKQorc29hcHRlc3RfREVQRU5ERU5DSUVTID0KK3NvYXB0ZXN0X0xERkxBR1MgPQorCitERUZTID0gLURIQVZFX0NPTkZJR19ICitERUZBVUxUX0lOQ0xVREVTID0gIC1JLiAtSSQoc3JjZGlyKSAtSSQodG9wX2J1aWxkZGlyKQorQ1BQRkxBR1MgPSAKK0xERkxBR1MgPSAKK0xJQlMgPSAKK2RlcGNvbXAgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2RlcGNvbXAKK0RFUF9GSUxFUyA9ICQoREVQRElSKS9Db25zb2xlTWFpbi5QbworQ1hYQ09NUElMRSA9ICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgXAorCSQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpCitMVENYWENPTVBJTEUgPSAkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpIFwKKwkkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIFwKKwkkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKQorQ1hYTEQgPSAkKENYWCkKK0NYWExJTksgPSAkKExJQlRPT0wpIC0tbW9kZT1saW5rICQoQ1hYTEQpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIFwKKwkkKEFNX0xERkxBR1MpICQoTERGTEFHUykgLW8gJEAKK0RJU1RfU09VUkNFUyA9ICQoc29hcHRlc3RfU09VUkNFUykKKworUkVDVVJTSVZFX1RBUkdFVFMgPSBpbmZvLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlIGluc3RhbGwtaW5mby1yZWN1cnNpdmUgXAorCXVuaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZSBhbGwtcmVjdXJzaXZlIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgXAorCWluc3RhbGwtZXhlYy1yZWN1cnNpdmUgaW5zdGFsbGRpcnMtcmVjdXJzaXZlIGluc3RhbGwtcmVjdXJzaXZlIFwKKwl1bmluc3RhbGwtcmVjdXJzaXZlIGNoZWNrLXJlY3Vyc2l2ZSBpbnN0YWxsY2hlY2stcmVjdXJzaXZlCitESVNUX0NPTU1PTiA9IE1ha2VmaWxlLmFtIE1ha2VmaWxlLmluCitESVNUX1NVQkRJUlMgPSAkKFNVQkRJUlMpCitTT1VSQ0VTID0gJChzb2FwdGVzdF9TT1VSQ0VTKQorCithbGw6IGFsbC1yZWN1cnNpdmUKKworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuY3BwIC5sbyAubyAub2JqCisKK21vc3RseWNsZWFuLWxpYnRvb2w6CisJLXJtIC1mICoubG8KKworY2xlYW4tbGlidG9vbDoKKwktcm0gLXJmIC5saWJzIF9saWJzCisKK2Rpc3RjbGVhbi1saWJ0b29sOgorCS1ybSAtZiBsaWJ0b29sCiskKHNyY2RpcikvTWFrZWZpbGUuaW46ICBNYWtlZmlsZS5hbSAgJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KQorCWNkICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1nbnUgIENvbnNvbGVTZXJ2ZXIvTWFrZWZpbGUKK01ha2VmaWxlOiAgJChzcmNkaXIpL01ha2VmaWxlLmluICAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCWNkICQodG9wX2J1aWxkZGlyKSAmJiBcCisJICBDT05GSUdfSEVBREVSUz0gQ09ORklHX0xJTktTPSBcCisJICBDT05GSUdfRklMRVM9JChzdWJkaXIpLyRAICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworaW5zdGFsbC1iaW5QUk9HUkFNUzogJChiaW5fUFJPR1JBTVMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChiaW5kaXIpCisJQGxpc3Q9JyQoYmluX1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgcDE9YGVjaG8gJCRwfHNlZCAncy8kKEVYRUVYVCkkJC8vJ2A7IFwKKwkgIGlmIHRlc3QgLWYgJCRwIFwKKwkgICAgIHx8IHRlc3QgLWYgJCRwMSBcCisJICA7IHRoZW4gXAorCSAgICBmPWBlY2hvICQkcDF8c2VkICckKHRyYW5zZm9ybSk7cy8kJC8kKEVYRUVYVCkvJ2A7IFwKKwkgICBlY2hvICIgJChJTlNUQUxMX1BST0dSQU1fRU5WKSAkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChERVNURElSKSQoYmluZGlyKS8kJGYiOyBcCisJICAgJChJTlNUQUxMX1BST0dSQU1fRU5WKSAkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChERVNURElSKSQoYmluZGlyKS8kJGY7IFwKKwkgIGVsc2UgOjsgZmk7IFwKKwlkb25lCisKK3VuaW5zdGFsbC1iaW5QUk9HUkFNUzoKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKGJpbl9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGY9YGVjaG8gJCRwfHNlZCAncy8kKEVYRUVYVCkkJC8vOyQodHJhbnNmb3JtKTtzLyQkLyQoRVhFRVhUKS8nYDsgXAorCSAgZWNobyAiIHJtIC1mICQoREVTVERJUikkKGJpbmRpcikvJCRmIjsgXAorCSAgcm0gLWYgJChERVNURElSKSQoYmluZGlyKS8kJGY7IFwKKwlkb25lCisKK2NsZWFuLWJpblBST0dSQU1TOgorCS10ZXN0IC16ICIkKGJpbl9QUk9HUkFNUykiIHx8IHJtIC1mICQoYmluX1BST0dSQU1TKQorc29hcHRlc3QkKEVYRUVYVCk6ICQoc29hcHRlc3RfT0JKRUNUUykgJChzb2FwdGVzdF9ERVBFTkRFTkNJRVMpIAorCUBybSAtZiBzb2FwdGVzdCQoRVhFRVhUKQorCSQoQ1hYTElOSykgJChzb2FwdGVzdF9MREZMQUdTKSAkKHNvYXB0ZXN0X09CSkVDVFMpICQoc29hcHRlc3RfTERBREQpICQoTElCUykKKworbW9zdGx5Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi4kKE9CSkVYVCkgY29yZSAqLmNvcmUKKworZGlzdGNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICoudGFiLmMKKworaW5jbHVkZSAkKERFUERJUikvQ29uc29sZU1haW4uUG8KKworZGlzdGNsZWFuLWRlcGVuZDoKKwktcm0gLXJmICQoREVQRElSKQorCisuY3BwLm86CisJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBcCisJZGVwZmlsZT0nJChERVBESVIpLyQqLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvJCouVFBvJyBcCisJJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIFwKKwkkKENYWENPTVBJTEUpIC1jIC1vICRAIGB0ZXN0IC1mICQ8IHx8IGVjaG8gJyQoc3JjZGlyKS8nYCQ8CisKKy5jcHAub2JqOgorCXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gXAorCWRlcGZpbGU9JyQoREVQRElSKS8kKi5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpLyQqLlRQbycgXAorCSQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBcCisJJChDWFhDT01QSUxFKSAtYyAtbyAkQCBgY3lncGF0aCAtdyAkPGAKKworLmNwcC5sbzoKKwlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPXllcyBcCisJZGVwZmlsZT0nJChERVBESVIpLyQqLlBsbycgdG1wZGVwZmlsZT0nJChERVBESVIpLyQqLlRQbG8nIFwKKwkkKENYWERFUE1PREUpICQoZGVwY29tcCkgXAorCSQoTFRDWFhDT01QSUxFKSAtYyAtbyAkQCBgdGVzdCAtZiAkPCB8fCBlY2hvICckKHNyY2RpcikvJ2AkPAorQ1hYREVQTU9ERSA9IGRlcG1vZGU9Z2NjCit1bmluc3RhbGwtaW5mby1hbToKKworIyBUaGlzIGRpcmVjdG9yeSdzIHN1YmRpcmVjdG9yaWVzIGFyZSBtb3N0bHkgaW5kZXBlbmRlbnQ7IHlvdSBjYW4gY2QKKyMgaW50byB0aGVtIGFuZCBydW4gYG1ha2UnIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGlzIE1ha2VmaWxlLgorIyBUbyBjaGFuZ2UgdGhlIHZhbHVlcyBvZiBgbWFrZScgdmFyaWFibGVzOiBpbnN0ZWFkIG9mIGVkaXRpbmcgTWFrZWZpbGVzLAorIyAoMSkgaWYgdGhlIHZhcmlhYmxlIGlzIHNldCBpbiBgY29uZmlnLnN0YXR1cycsIGVkaXQgYGNvbmZpZy5zdGF0dXMnCisjICAgICAod2hpY2ggd2lsbCBjYXVzZSB0aGUgTWFrZWZpbGVzIHRvIGJlIHJlZ2VuZXJhdGVkIHdoZW4geW91IHJ1biBgbWFrZScpOworIyAoMikgb3RoZXJ3aXNlLCBwYXNzIHRoZSBkZXNpcmVkIHZhbHVlcyBvbiB0aGUgYG1ha2UnIGNvbW1hbmQgbGluZS4KKyQoUkVDVVJTSVZFX1RBUkdFVFMpOgorCUBzZXQgZm5vcmQgJChNQUtFRkxBR1MpOyBhbWY9JCQyOyBcCisJZG90X3NlZW49bm87IFwKKwl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAorCSAgICBkb3Rfc2Vlbj15ZXM7IFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKKwkgIGVsc2UgXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAorCSAgZmk7IFwKKwkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAorCSAgIHx8IGNhc2UgIiQkYW1mIiBpbiAqPSopIGV4aXQgMTs7ICprKikgZmFpbD15ZXM7OyAqKSBleGl0IDE7OyBlc2FjOyBcCisJZG9uZTsgXAorCWlmIHRlc3QgIiQkZG90X3NlZW4iID0gIm5vIjsgdGhlbiBcCisJICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAiJCR0YXJnZXQtYW0iIHx8IGV4aXQgMTsgXAorCWZpOyB0ZXN0IC16ICIkJGZhaWwiCisKK21vc3RseWNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBcCittYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZToKKwlAc2V0IGZub3JkICQoTUFLRUZMQUdTKTsgYW1mPSQkMjsgXAorCWRvdF9zZWVuPW5vOyBcCisJY2FzZSAiJEAiIGluIFwKKwkgIGRpc3RjbGVhbi0qIHwgbWFpbnRhaW5lci1jbGVhbi0qKSBsaXN0PSckKERJU1RfU1VCRElSUyknIDs7IFwKKwkgICopIGxpc3Q9JyQoU1VCRElSUyknIDs7IFwKKwllc2FjOyBcCisJcmV2PScnOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIDo7IGVsc2UgXAorCSAgICByZXY9IiQkc3ViZGlyICQkcmV2IjsgXAorCSAgZmk7IFwKKwlkb25lOyBcCisJcmV2PSIkJHJldiAuIjsgXAorCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKKwlmb3Igc3ViZGlyIGluICQkcmV2OyBkbyBcCisJICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAorCSAgZWxzZSBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCisJICBmaTsgXAorCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCisJICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKKwlkb25lICYmIHRlc3QgLXogIiQkZmFpbCIKK3RhZ3MtcmVjdXJzaXZlOgorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdGFncyk7IFwKKwlkb25lCisKK3RhZ3M6IFRBR1MKKworSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKKwkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKKwlta2lkIC1mSUQgJCR1bmlxdWUgJChMSVNQKQorCitUQUdTOiB0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJdGFncz07IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAorCSAgICB0ZXN0IC1mICQkc3ViZGlyL1RBR1MgJiYgdGFncz0iJCR0YWdzIC1pICQkaGVyZS8kJHN1YmRpci9UQUdTIjsgXAorCSAgZmk7IFwKKwlkb25lOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJdGVzdCAteiAiJChFVEFHU19BUkdTKSQkdW5pcXVlJChMSVNQKSQkdGFncyIgXAorCSAgfHwgZXRhZ3MgJChFVEFHU19BUkdTKSAkJHRhZ3MgICQkdW5pcXVlICQoTElTUCkKKworR1RBR1M6CisJaGVyZT1gQ0RQQVRIPTogJiYgY2QgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAorCSAgJiYgY2QgJCh0b3Bfc3JjZGlyKSBcCisJICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICQkaGVyZQorCitkaXN0Y2xlYW4tdGFnczoKKwktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEgKKworRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKKwordG9wX2Rpc3RkaXIgPSAuLgorZGlzdGRpciA9ICQodG9wX2Rpc3RkaXIpLyQoUEFDS0FHRSktJChWRVJTSU9OKQorCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwlAZm9yIGZpbGUgaW4gJChESVNURklMRVMpOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBkaXI9YGVjaG8gIiQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICBpZiB0ZXN0ICIkJGRpciIgIT0gIiQkZmlsZSIgJiYgdGVzdCAiJCRkaXIiICE9ICIuIjsgdGhlbiBcCisJICAgICQobWtpbnN0YWxsZGlycykgIiQoZGlzdGRpcikvJCRkaXIiOyBcCisJICBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgY3AgLXBSICQkZC8kJGZpbGUgJChkaXN0ZGlyKSBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKKwlmb3Igc3ViZGlyIGluICQoU1VCRElSUyk7IGRvIFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCisJICAgIHRlc3QgLWQgJChkaXN0ZGlyKS8kJHN1YmRpciBcCisJICAgIHx8IG1rZGlyICQoZGlzdGRpcikvJCRzdWJkaXIgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgICAgKGNkICQkc3ViZGlyICYmIFwKKwkgICAgICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCisJICAgICAgICB0b3BfZGlzdGRpcj0iJCh0b3BfZGlzdGRpcikiIFwKKwkgICAgICAgIGRpc3RkaXI9Li4vJChkaXN0ZGlyKS8kJHN1YmRpciBcCisJICAgICAgICBkaXN0ZGlyKSBcCisJICAgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKK2NoZWNrLWFtOiBhbGwtYW0KK2NoZWNrOiBjaGVjay1yZWN1cnNpdmUKK2FsbC1hbTogTWFrZWZpbGUgJChQUk9HUkFNUykKK2luc3RhbGxkaXJzOiBpbnN0YWxsZGlycy1yZWN1cnNpdmUKK2luc3RhbGxkaXJzLWFtOgorCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoYmluZGlyKQorCitpbnN0YWxsOiBpbnN0YWxsLXJlY3Vyc2l2ZQoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlCitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1yZWN1cnNpdmUKK3VuaW5zdGFsbDogdW5pbnN0YWxsLXJlY3Vyc2l2ZQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQorCitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1yZWN1cnNpdmUKK2luc3RhbGwtc3RyaXA6CisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChDTEVBTkZJTEVTKQorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktcm0gLWYgTWFrZWZpbGUgJChDT05GSUdfQ0xFQU5fRklMRVMpIHN0YW1wLWggc3RhbXAtaFswLTldKgorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKK2NsZWFuOiBjbGVhbi1yZWN1cnNpdmUKKworY2xlYW4tYW06IGNsZWFuLWJpblBST0dSQU1TIGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBtb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1yZWN1cnNpdmUKKworZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZGVwZW5kIFwKKwlkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1yZWN1cnNpdmUKKworZHZpLWFtOgorCitpbmZvOiBpbmZvLXJlY3Vyc2l2ZQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06CisKK2luc3RhbGwtZXhlYy1hbTogaW5zdGFsbC1iaW5QUk9HUkFNUworCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKKworaW5zdGFsbC1tYW46CisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKKworbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMgXAorCW1vc3RseWNsZWFuLWxpYnRvb2wKKwordW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtYmluUFJPR1JBTVMgdW5pbnN0YWxsLWluZm8tYW0KKwordW5pbnN0YWxsLWluZm86IHVuaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZQorCisuUEhPTlk6ICQoUkVDVVJTSVZFX1RBUkdFVFMpIEdUQUdTIGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gXAorCWNsZWFuLWJpblBST0dSQU1TIGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBjbGVhbi1yZWN1cnNpdmUgXAorCWRpc3RjbGVhbiBkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZGVwZW5kIGRpc3RjbGVhbi1nZW5lcmljIFwKKwlkaXN0Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tcmVjdXJzaXZlIGRpc3RjbGVhbi10YWdzIGRpc3RkaXIgXAorCWR2aSBkdmktYW0gZHZpLXJlY3Vyc2l2ZSBpbmZvIGluZm8tYW0gaW5mby1yZWN1cnNpdmUgaW5zdGFsbCBcCisJaW5zdGFsbC1hbSBpbnN0YWxsLWJpblBST0dSQU1TIGluc3RhbGwtZGF0YSBpbnN0YWxsLWRhdGEtYW0gXAorCWluc3RhbGwtZGF0YS1yZWN1cnNpdmUgaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBcCisJaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBpbnN0YWxsLWluZm8gaW5zdGFsbC1pbmZvLWFtIFwKKwlpbnN0YWxsLWluZm8tcmVjdXJzaXZlIGluc3RhbGwtbWFuIGluc3RhbGwtcmVjdXJzaXZlIFwKKwlpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgXAorCWluc3RhbGxkaXJzLWFtIGluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBtYWludGFpbmVyLWNsZWFuIFwKKwltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUgbW9zdGx5Y2xlYW4gXAorCW1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sIFwKKwltb3N0bHljbGVhbi1yZWN1cnNpdmUgdGFncyB0YWdzLXJlY3Vyc2l2ZSB1bmluc3RhbGwgXAorCXVuaW5zdGFsbC1hbSB1bmluc3RhbGwtYmluUFJPR1JBTVMgdW5pbnN0YWxsLWluZm8tYW0gXAorCXVuaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZSB1bmluc3RhbGwtcmVjdXJzaXZlCisKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9Db25zb2xlU2VydmVyL01ha2VmaWxlLmFtIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL0NvbnNvbGVTZXJ2ZXIvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI0MTUzMgotLS0gL2Rldi9udWxsCisrKyBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9Db25zb2xlU2VydmVyL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTggQEAKKyMjIHRoaXMgZmlsZSBpcyBpbnB1dCBmb3IgYXV0b21ha2UgYW5kIHdpbGwgZ2VuZXJhdGUgTWFrZWZpbGUuaW4KKworQU1fQ1BQRkxBR1M9LURfUkVFTlRSQU5UICQoQ1hYREVCVUdERUZJTkVTKQorCitJTkNMVURFUz0tSSQoR1NPQVBfUFJFRklYKSAtSSQodG9wX2J1aWxkZGlyKQorCithcGFjaGVfZGlyPSQodG9wX2J1aWxkZGlyKQorCitTVUJESVJTID0gZm9vCisKK2Jpbl9QUk9HUkFNUyA9IHNvYXB0ZXN0Citzb2FwdGVzdF9TT1VSQ0VTID0gQ29uc29sZU1haW4uY3BwIAorCitzb2FwdGVzdF9MREFERCA9IFwKKwktbGx0ZGwgXAorCS1scHRocmVhZAorCitDTEVBTkZJTEVTPSp+IC5rZGJncmMuc29hcHRlc3QKZGlmZiAtLWdpdCBhL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9Db25zb2xlU2VydmVyL01ha2VmaWxlLmluIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL0NvbnNvbGVTZXJ2ZXIvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY1NjFjZgotLS0gL2Rldi9udWxsCisrKyBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9Db25zb2xlU2VydmVyL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsNDQ1IEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGF1dG9tYWtlIDEuNSBmcm9tIE1ha2VmaWxlLmFtLgorCisjIENvcHlyaWdodCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxCisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorCitTSEVMTCA9IEBTSEVMTEAKKworc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK1ZQQVRIID0gQHNyY2RpckAKK3ByZWZpeCA9IEBwcmVmaXhACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKKworYmluZGlyID0gQGJpbmRpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAorbGliZGlyID0gQGxpYmRpckAKK2luZm9kaXIgPSBAaW5mb2RpckAKK21hbmRpciA9IEBtYW5kaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitvbGRpbmNsdWRlZGlyID0gL3Vzci9pbmNsdWRlCitwa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAordG9wX2J1aWxkZGlyID0gLi4KKworQUNMT0NBTCA9IEBBQ0xPQ0FMQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKKworSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAoraG9zdF90cmlwbGV0ID0gQGhvc3RACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAordGFyZ2V0X3RyaXBsZXQgPSBAdGFyZ2V0QAorQU1UQVIgPSBAQU1UQVJACitBUFhTX0NYWF9PUFRJT05TID0gQEFQWFNfQ1hYX09QVElPTlNACitBUyA9IEBBU0AKK0FXSyA9IEBBV0tACitDQyA9IEBDQ0AKK0NQUCA9IEBDUFBACitDWFggPSBAQ1hYQAorQ1hYREVCVUdERUZJTkVTID0gQENYWERFQlVHREVGSU5FU0AKK0NYWEZMQUdTID0gQENYWEZMQUdTQAorREVQRElSID0gQERFUERJUkAKK0RMTFRPT0wgPSBARExMVE9PTEAKK0VDSE8gPSBARUNIT0AKK0VYRUVYVCA9IEBFWEVFWFRACitFWElTVFNfQVBYUyA9IEBFWElTVFNfQVBYU0AKK0dTT0FQX0NQUF9TUkMgPSBAR1NPQVBfQ1BQX1NSQ0AKK0dTT0FQX0NfU1JDID0gQEdTT0FQX0NfU1JDQAorR1NPQVBfSU5DTFVERSA9IEBHU09BUF9JTkNMVURFQAorR1NPQVBfUFJFRklYID0gQEdTT0FQX1BSRUZJWEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitMSUJUT09MID0gQExJQlRPT0xACitMSUJUT09MX0RFUFMgPSBATElCVE9PTF9ERVBTQAorTE5fUyA9IEBMTl9TQAorT0JKRFVNUCA9IEBPQkpEVU1QQAorT0JKRVhUID0gQE9CSkVYVEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1JBTkxJQiA9IEBSQU5MSUJACitTVFJJUCA9IEBTVFJJUEAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2luc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKKworQU1fQ1BQRkxBR1MgPSAtRF9SRUVOVFJBTlQgJChDWFhERUJVR0RFRklORVMpCisKK0lOQ0xVREVTID0gLUkkKEdTT0FQX1BSRUZJWCkgLUkkKHRvcF9idWlsZGRpcikKKworYXBhY2hlX2RpciA9ICQodG9wX2J1aWxkZGlyKQorCitTVUJESVJTID0gZm9vCisKK2Jpbl9QUk9HUkFNUyA9IHNvYXB0ZXN0Citzb2FwdGVzdF9TT1VSQ0VTID0gQ29uc29sZU1haW4uY3BwIAorCitzb2FwdGVzdF9MREFERCA9IFwKKwktbGx0ZGwgXAorCS1scHRocmVhZAorCisKK0NMRUFORklMRVMgPSAqfiAua2RiZ3JjLnNvYXB0ZXN0CitzdWJkaXIgPSBDb25zb2xlU2VydmVyCitta2luc3RhbGxkaXJzID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzCitDT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPQorYmluX1BST0dSQU1TID0gc29hcHRlc3QkKEVYRUVYVCkKK1BST0dSQU1TID0gJChiaW5fUFJPR1JBTVMpCisKK2FtX3NvYXB0ZXN0X09CSkVDVFMgPSBDb25zb2xlTWFpbi4kKE9CSkVYVCkKK3NvYXB0ZXN0X09CSkVDVFMgPSAkKGFtX3NvYXB0ZXN0X09CSkVDVFMpCitzb2FwdGVzdF9ERVBFTkRFTkNJRVMgPQorc29hcHRlc3RfTERGTEFHUyA9CisKK0RFRlMgPSBAREVGU0AKK0RFRkFVTFRfSU5DTFVERVMgPSAgLUkuIC1JJChzcmNkaXIpIC1JJCh0b3BfYnVpbGRkaXIpCitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKK0xERkxBR1MgPSBATERGTEFHU0AKK0xJQlMgPSBATElCU0AKK2RlcGNvbXAgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2RlcGNvbXAKK0BBTURFUF9UUlVFQERFUF9GSUxFUyA9ICQoREVQRElSKS9Db25zb2xlTWFpbi5QbworQ1hYQ09NUElMRSA9ICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgXAorCSQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpCitMVENYWENPTVBJTEUgPSAkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpIFwKKwkkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIFwKKwkkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKQorQ1hYTEQgPSAkKENYWCkKK0NYWExJTksgPSAkKExJQlRPT0wpIC0tbW9kZT1saW5rICQoQ1hYTEQpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIFwKKwkkKEFNX0xERkxBR1MpICQoTERGTEFHUykgLW8gJEAKK0RJU1RfU09VUkNFUyA9ICQoc29hcHRlc3RfU09VUkNFUykKKworUkVDVVJTSVZFX1RBUkdFVFMgPSBpbmZvLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlIGluc3RhbGwtaW5mby1yZWN1cnNpdmUgXAorCXVuaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZSBhbGwtcmVjdXJzaXZlIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgXAorCWluc3RhbGwtZXhlYy1yZWN1cnNpdmUgaW5zdGFsbGRpcnMtcmVjdXJzaXZlIGluc3RhbGwtcmVjdXJzaXZlIFwKKwl1bmluc3RhbGwtcmVjdXJzaXZlIGNoZWNrLXJlY3Vyc2l2ZSBpbnN0YWxsY2hlY2stcmVjdXJzaXZlCitESVNUX0NPTU1PTiA9IE1ha2VmaWxlLmFtIE1ha2VmaWxlLmluCitESVNUX1NVQkRJUlMgPSAkKFNVQkRJUlMpCitTT1VSQ0VTID0gJChzb2FwdGVzdF9TT1VSQ0VTKQorCithbGw6IGFsbC1yZWN1cnNpdmUKKworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuY3BwIC5sbyAubyAub2JqCisKK21vc3RseWNsZWFuLWxpYnRvb2w6CisJLXJtIC1mICoubG8KKworY2xlYW4tbGlidG9vbDoKKwktcm0gLXJmIC5saWJzIF9saWJzCisKK2Rpc3RjbGVhbi1saWJ0b29sOgorCS1ybSAtZiBsaWJ0b29sCiskKHNyY2RpcikvTWFrZWZpbGUuaW46ICBNYWtlZmlsZS5hbSAgJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KQorCWNkICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1nbnUgIENvbnNvbGVTZXJ2ZXIvTWFrZWZpbGUKK01ha2VmaWxlOiAgJChzcmNkaXIpL01ha2VmaWxlLmluICAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCWNkICQodG9wX2J1aWxkZGlyKSAmJiBcCisJICBDT05GSUdfSEVBREVSUz0gQ09ORklHX0xJTktTPSBcCisJICBDT05GSUdfRklMRVM9JChzdWJkaXIpLyRAICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworaW5zdGFsbC1iaW5QUk9HUkFNUzogJChiaW5fUFJPR1JBTVMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChiaW5kaXIpCisJQGxpc3Q9JyQoYmluX1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgcDE9YGVjaG8gJCRwfHNlZCAncy8kKEVYRUVYVCkkJC8vJ2A7IFwKKwkgIGlmIHRlc3QgLWYgJCRwIFwKKwkgICAgIHx8IHRlc3QgLWYgJCRwMSBcCisJICA7IHRoZW4gXAorCSAgICBmPWBlY2hvICQkcDF8c2VkICckKHRyYW5zZm9ybSk7cy8kJC8kKEVYRUVYVCkvJ2A7IFwKKwkgICBlY2hvICIgJChJTlNUQUxMX1BST0dSQU1fRU5WKSAkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChERVNURElSKSQoYmluZGlyKS8kJGYiOyBcCisJICAgJChJTlNUQUxMX1BST0dSQU1fRU5WKSAkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChERVNURElSKSQoYmluZGlyKS8kJGY7IFwKKwkgIGVsc2UgOjsgZmk7IFwKKwlkb25lCisKK3VuaW5zdGFsbC1iaW5QUk9HUkFNUzoKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKGJpbl9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGY9YGVjaG8gJCRwfHNlZCAncy8kKEVYRUVYVCkkJC8vOyQodHJhbnNmb3JtKTtzLyQkLyQoRVhFRVhUKS8nYDsgXAorCSAgZWNobyAiIHJtIC1mICQoREVTVERJUikkKGJpbmRpcikvJCRmIjsgXAorCSAgcm0gLWYgJChERVNURElSKSQoYmluZGlyKS8kJGY7IFwKKwlkb25lCisKK2NsZWFuLWJpblBST0dSQU1TOgorCS10ZXN0IC16ICIkKGJpbl9QUk9HUkFNUykiIHx8IHJtIC1mICQoYmluX1BST0dSQU1TKQorc29hcHRlc3QkKEVYRUVYVCk6ICQoc29hcHRlc3RfT0JKRUNUUykgJChzb2FwdGVzdF9ERVBFTkRFTkNJRVMpIAorCUBybSAtZiBzb2FwdGVzdCQoRVhFRVhUKQorCSQoQ1hYTElOSykgJChzb2FwdGVzdF9MREZMQUdTKSAkKHNvYXB0ZXN0X09CSkVDVFMpICQoc29hcHRlc3RfTERBREQpICQoTElCUykKKworbW9zdGx5Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi4kKE9CSkVYVCkgY29yZSAqLmNvcmUKKworZGlzdGNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICoudGFiLmMKKworQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQCQoREVQRElSKS9Db25zb2xlTWFpbi5Qb0BhbV9fcXVvdGVACisKK2Rpc3RjbGVhbi1kZXBlbmQ6CisJLXJtIC1yZiAkKERFUERJUikKKworLmNwcC5vOgorQEFNREVQX1RSVUVACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVACWRlcGZpbGU9JyQoREVQRElSKS8kKi5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpLyQqLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVACSQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACisJJChDWFhDT01QSUxFKSAtYyAtbyAkQCBgdGVzdCAtZiAkPCB8fCBlY2hvICckKHNyY2RpcikvJ2AkPAorCisuY3BwLm9iajoKK0BBTURFUF9UUlVFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQAlkZXBmaWxlPSckKERFUERJUikvJCouUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS8kKi5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQAkkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorCSQoQ1hYQ09NUElMRSkgLWMgLW8gJEAgYGN5Z3BhdGggLXcgJDxgCisKKy5jcHAubG86CitAQU1ERVBfVFJVRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVACWRlcGZpbGU9JyQoREVQRElSKS8kKi5QbG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS8kKi5UUGxvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUAJJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKKwkkKExUQ1hYQ09NUElMRSkgLWMgLW8gJEAgYHRlc3QgLWYgJDwgfHwgZWNobyAnJChzcmNkaXIpLydgJDwKK0NYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKK3VuaW5zdGFsbC1pbmZvLWFtOgorCisjIFRoaXMgZGlyZWN0b3J5J3Mgc3ViZGlyZWN0b3JpZXMgYXJlIG1vc3RseSBpbmRlcGVuZGVudDsgeW91IGNhbiBjZAorIyBpbnRvIHRoZW0gYW5kIHJ1biBgbWFrZScgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoaXMgTWFrZWZpbGUuCisjIFRvIGNoYW5nZSB0aGUgdmFsdWVzIG9mIGBtYWtlJyB2YXJpYWJsZXM6IGluc3RlYWQgb2YgZWRpdGluZyBNYWtlZmlsZXMsCisjICgxKSBpZiB0aGUgdmFyaWFibGUgaXMgc2V0IGluIGBjb25maWcuc3RhdHVzJywgZWRpdCBgY29uZmlnLnN0YXR1cycKKyMgICAgICh3aGljaCB3aWxsIGNhdXNlIHRoZSBNYWtlZmlsZXMgdG8gYmUgcmVnZW5lcmF0ZWQgd2hlbiB5b3UgcnVuIGBtYWtlJyk7CisjICgyKSBvdGhlcndpc2UsIHBhc3MgdGhlIGRlc2lyZWQgdmFsdWVzIG9uIHRoZSBgbWFrZScgY29tbWFuZCBsaW5lLgorJChSRUNVUlNJVkVfVEFSR0VUUyk6CisJQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKKwlkb3Rfc2Vlbj1ubzsgXAorCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCisJICAgIGRvdF9zZWVuPXllczsgXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAorCSAgZWxzZSBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCisJICBmaTsgXAorCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCisJICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKKwlkb25lOyBcCisJaWYgdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iOyB0aGVuIFwKKwkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICIkJHRhcmdldC1hbSIgfHwgZXhpdCAxOyBcCisJZmk7IHRlc3QgLXogIiQkZmFpbCIKKworbW9zdGx5Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIFwKK21haW50YWluZXItY2xlYW4tcmVjdXJzaXZlOgorCUBzZXQgZm5vcmQgJChNQUtFRkxBR1MpOyBhbWY9JCQyOyBcCisJZG90X3NlZW49bm87IFwKKwljYXNlICIkQCIgaW4gXAorCSAgZGlzdGNsZWFuLSogfCBtYWludGFpbmVyLWNsZWFuLSopIGxpc3Q9JyQoRElTVF9TVUJESVJTKScgOzsgXAorCSAgKikgbGlzdD0nJChTVUJESVJTKScgOzsgXAorCWVzYWM7IFwKKwlyZXY9Jyc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gOjsgZWxzZSBcCisJICAgIHJldj0iJCRzdWJkaXIgJCRyZXYiOyBcCisJICBmaTsgXAorCWRvbmU7IFwKKwlyZXY9IiQkcmV2IC4iOyBcCisJdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAorCWZvciBzdWJkaXIgaW4gJCRyZXY7IGRvIFwKKwkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCisJICBlbHNlIFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKKwkgIGZpOyBcCisJICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKKwkgICB8fCBjYXNlICIkJGFtZiIgaW4gKj0qKSBleGl0IDE7OyAqayopIGZhaWw9eWVzOzsgKikgZXhpdCAxOzsgZXNhYzsgXAorCWRvbmUgJiYgdGVzdCAteiAiJCRmYWlsIgordGFncy1yZWN1cnNpdmU6CisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8IChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0YWdzKTsgXAorCWRvbmUKKwordGFnczogVEFHUworCitJRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAorCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAorCW1raWQgLWZJRCAkJHVuaXF1ZSAkKExJU1ApCisKK1RBR1M6IHRhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwl0YWdzPTsgXAorCWhlcmU9YHB3ZGA7IFwKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCisJICAgIHRlc3QgLWYgJCRzdWJkaXIvVEFHUyAmJiB0YWdzPSIkJHRhZ3MgLWkgJCRoZXJlLyQkc3ViZGlyL1RBR1MiOyBcCisJICBmaTsgXAorCWRvbmU7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKKwkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKKwl0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCR1bmlxdWUkKExJU1ApJCR0YWdzIiBcCisJICB8fCBldGFncyAkKEVUQUdTX0FSR1MpICQkdGFncyAgJCR1bmlxdWUgJChMSVNQKQorCitHVEFHUzoKKwloZXJlPWBDRFBBVEg9OiAmJiBjZCAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCisJICAmJiBjZCAkKHRvcF9zcmNkaXIpIFwKKwkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgJCRoZXJlCisKK2Rpc3RjbGVhbi10YWdzOgorCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSAorCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorCit0b3BfZGlzdGRpciA9IC4uCitkaXN0ZGlyID0gJCh0b3BfZGlzdGRpcikvJChQQUNLQUdFKS0kKFZFUlNJT04pCisKK2Rpc3RkaXI6ICQoRElTVEZJTEVTKQorCUBmb3IgZmlsZSBpbiAkKERJU1RGSUxFUyk7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGRpcj1gZWNobyAiJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKKwkgIGlmIHRlc3QgIiQkZGlyIiAhPSAiJCRmaWxlIiAmJiB0ZXN0ICIkJGRpciIgIT0gIi4iOyB0aGVuIFwKKwkgICAgJChta2luc3RhbGxkaXJzKSAiJChkaXN0ZGlyKS8kJGRpciI7IFwKKwkgIGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBjcCAtcFIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorCWZvciBzdWJkaXIgaW4gJChTVUJESVJTKTsgZG8gXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKKwkgICAgdGVzdCAtZCAkKGRpc3RkaXIpLyQkc3ViZGlyIFwKKwkgICAgfHwgbWtkaXIgJChkaXN0ZGlyKS8kJHN1YmRpciBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgICAoY2QgJCRzdWJkaXIgJiYgXAorCSAgICAgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKKwkgICAgICAgIHRvcF9kaXN0ZGlyPSIkKHRvcF9kaXN0ZGlyKSIgXAorCSAgICAgICAgZGlzdGRpcj0uLi8kKGRpc3RkaXIpLyQkc3ViZGlyIFwKKwkgICAgICAgIGRpc3RkaXIpIFwKKwkgICAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorY2hlY2stYW06IGFsbC1hbQorY2hlY2s6IGNoZWNrLXJlY3Vyc2l2ZQorYWxsLWFtOiBNYWtlZmlsZSAkKFBST0dSQU1TKQoraW5zdGFsbGRpcnM6IGluc3RhbGxkaXJzLXJlY3Vyc2l2ZQoraW5zdGFsbGRpcnMtYW06CisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChiaW5kaXIpCisKK2luc3RhbGw6IGluc3RhbGwtcmVjdXJzaXZlCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1yZWN1cnNpdmUKK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZQordW5pbnN0YWxsOiB1bmluc3RhbGwtcmVjdXJzaXZlCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgYHRlc3QgLXogJyQoU1RSSVApJyB8fCBcCisJICAgIGVjaG8gIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciYCBpbnN0YWxsCittb3N0bHljbGVhbi1nZW5lcmljOgorCitjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENMRUFORklMRVMpIiB8fCBybSAtZiAkKENMRUFORklMRVMpCisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS1ybSAtZiBNYWtlZmlsZSAkKENPTkZJR19DTEVBTl9GSUxFUykgc3RhbXAtaCBzdGFtcC1oWzAtOV0qCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorY2xlYW46IGNsZWFuLXJlY3Vyc2l2ZQorCitjbGVhbi1hbTogY2xlYW4tYmluUFJPR1JBTVMgY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIG1vc3RseWNsZWFuLWFtCisKK2Rpc3RjbGVhbjogZGlzdGNsZWFuLXJlY3Vyc2l2ZQorCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1kZXBlbmQgXAorCWRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi10YWdzCisKK2R2aTogZHZpLXJlY3Vyc2l2ZQorCitkdmktYW06CisKK2luZm86IGluZm8tcmVjdXJzaXZlCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbToKKworaW5zdGFsbC1leGVjLWFtOiBpbnN0YWxsLWJpblBST0dSQU1TCisKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZQorCitpbnN0YWxsLW1hbjoKKworaW5zdGFsbGNoZWNrLWFtOgorCittYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQorCittYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCisKK21vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1yZWN1cnNpdmUKKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCisJbW9zdGx5Y2xlYW4tbGlidG9vbAorCit1bmluc3RhbGwtYW06IHVuaW5zdGFsbC1iaW5QUk9HUkFNUyB1bmluc3RhbGwtaW5mby1hbQorCit1bmluc3RhbGwtaW5mbzogdW5pbnN0YWxsLWluZm8tcmVjdXJzaXZlCisKKy5QSE9OWTogJChSRUNVUlNJVkVfVEFSR0VUUykgR1RBR1MgYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBcCisJY2xlYW4tYmluUFJPR1JBTVMgY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIGNsZWFuLXJlY3Vyc2l2ZSBcCisJZGlzdGNsZWFuIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1kZXBlbmQgZGlzdGNsZWFuLWdlbmVyaWMgXAorCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi1yZWN1cnNpdmUgZGlzdGNsZWFuLXRhZ3MgZGlzdGRpciBcCisJZHZpIGR2aS1hbSBkdmktcmVjdXJzaXZlIGluZm8gaW5mby1hbSBpbmZvLXJlY3Vyc2l2ZSBpbnN0YWxsIFwKKwlpbnN0YWxsLWFtIGluc3RhbGwtYmluUFJPR1JBTVMgaW5zdGFsbC1kYXRhIGluc3RhbGwtZGF0YS1hbSBcCisJaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIFwKKwlpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIGluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gXAorCWluc3RhbGwtaW5mby1yZWN1cnNpdmUgaW5zdGFsbC1tYW4gaW5zdGFsbC1yZWN1cnNpdmUgXAorCWluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBcCisJaW5zdGFsbGRpcnMtYW0gaW5zdGFsbGRpcnMtcmVjdXJzaXZlIG1haW50YWluZXItY2xlYW4gXAorCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZSBtb3N0bHljbGVhbiBcCisJbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wgXAorCW1vc3RseWNsZWFuLXJlY3Vyc2l2ZSB0YWdzIHRhZ3MtcmVjdXJzaXZlIHVuaW5zdGFsbCBcCisJdW5pbnN0YWxsLWFtIHVuaW5zdGFsbC1iaW5QUk9HUkFNUyB1bmluc3RhbGwtaW5mby1hbSBcCisJdW5pbnN0YWxsLWluZm8tcmVjdXJzaXZlIHVuaW5zdGFsbC1yZWN1cnNpdmUKKworIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL0NvbnNvbGVTZXJ2ZXIvZm9vL01ha2VmaWxlIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL0NvbnNvbGVTZXJ2ZXIvZm9vL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjM2Y2M2IKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvQ29uc29sZVNlcnZlci9mb28vTWFrZWZpbGUKQEAgLTAsMCArMSwzNDEgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYXV0b21ha2UgMS41IGZyb20gTWFrZWZpbGUuYW0uCisKKyMgQ29weXJpZ2h0IDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCisKKworU0hFTEwgPSAvYmluL3NoCisKK3NyY2RpciA9IC4KK3RvcF9zcmNkaXIgPSAuLi8uLgorCitwcmVmaXggPSAvdXNyL2xvY2FsCitleGVjX3ByZWZpeCA9ICR7cHJlZml4fQorCitiaW5kaXIgPSAke2V4ZWNfcHJlZml4fS9iaW4KK3NiaW5kaXIgPSAke2V4ZWNfcHJlZml4fS9zYmluCitsaWJleGVjZGlyID0gJHtleGVjX3ByZWZpeH0vbGliZXhlYworZGF0YWRpciA9ICR7cHJlZml4fS9zaGFyZQorc3lzY29uZmRpciA9ICR7cHJlZml4fS9ldGMKK3NoYXJlZHN0YXRlZGlyID0gJHtwcmVmaXh9L2NvbQorbG9jYWxzdGF0ZWRpciA9ICR7cHJlZml4fS92YXIKK2xpYmRpciA9ICR7ZXhlY19wcmVmaXh9L2xpYgoraW5mb2RpciA9ICR7cHJlZml4fS9pbmZvCittYW5kaXIgPSAke3ByZWZpeH0vbWFuCitpbmNsdWRlZGlyID0gJHtwcmVmaXh9L2luY2x1ZGUKK29sZGluY2x1ZGVkaXIgPSAvdXNyL2luY2x1ZGUKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL21vZF9nc29hcAorcGtnbGliZGlyID0gJChsaWJkaXIpL21vZF9nc29hcAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvbW9kX2dzb2FwCit0b3BfYnVpbGRkaXIgPSAuLi8uLgorCitBQ0xPQ0FMID0gJHtTSEVMTH0gL2hvbWUvYWJlcmdlci9hcGFjaGVfZ3NvYXAuMC4wLjUvbWlzc2luZyAtLXJ1biBhY2xvY2FsCitBVVRPQ09ORiA9ICR7U0hFTEx9IC9ob21lL2FiZXJnZXIvYXBhY2hlX2dzb2FwLjAuMC41L21pc3NpbmcgLS1ydW4gYXV0b2NvbmYKK0FVVE9NQUtFID0gJHtTSEVMTH0gL2hvbWUvYWJlcmdlci9hcGFjaGVfZ3NvYXAuMC4wLjUvbWlzc2luZyAtLXJ1biBhdXRvbWFrZQorQVVUT0hFQURFUiA9ICR7U0hFTEx9IC9ob21lL2FiZXJnZXIvYXBhY2hlX2dzb2FwLjAuMC41L21pc3NpbmcgLS1ydW4gYXV0b2hlYWRlcgorCitJTlNUQUxMID0gL3Vzci9iaW4vZ2luc3RhbGwgLWMKK0lOU1RBTExfUFJPR1JBTSA9ICR7SU5TVEFMTH0KK0lOU1RBTExfREFUQSA9ICR7SU5TVEFMTH0gLW0gNjQ0CitJTlNUQUxMX1NDUklQVCA9ICR7SU5TVEFMTH0KK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSBzLHgseCwKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfYWxpYXMgPSBpNjg2LXN1c2UtbGludXgKK2J1aWxkX3RyaXBsZXQgPSBpNjg2LXN1c2UtbGludXgKK2hvc3RfYWxpYXMgPSBpNjg2LXN1c2UtbGludXgKK2hvc3RfdHJpcGxldCA9IGk2ODYtc3VzZS1saW51eAordGFyZ2V0X2FsaWFzID0gaTY4Ni1zdXNlLWxpbnV4Cit0YXJnZXRfdHJpcGxldCA9IGk2ODYtc3VzZS1saW51eAorQU1UQVIgPSAke1NIRUxMfSAvaG9tZS9hYmVyZ2VyL2FwYWNoZV9nc29hcC4wLjAuNS9taXNzaW5nIC0tcnVuIHRhcgorQVBYU19DWFhfT1BUSU9OUyA9IAorQVMgPSBhcworQVdLID0gZ2F3aworQ0MgPSBnY2MKK0NQUCA9IGdjYyAtRQorQ1hYID0gZysrCitDWFhERUJVR0RFRklORVMgPSAtRF9OREVCVUcKK0NYWEZMQUdTID0gIC1PMgorREVQRElSID0gLmRlcHMKK0RMTFRPT0wgPSBkbGx0b29sCitFQ0hPID0gZWNobworRVhFRVhUID0gCitFWElTVFNfQVBYUyA9IHllcworR1NPQVBfQ1BQX1NSQyA9IEBHU09BUF9DUFBfU1JDQAorR1NPQVBfQ19TUkMgPSBAR1NPQVBfQ19TUkNACitHU09BUF9JTkNMVURFID0gQEdTT0FQX0lOQ0xVREVACitHU09BUF9QUkVGSVggPSBAR1NPQVBfUFJFRklYQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gJHtTSEVMTH0gJChpbnN0YWxsX3NoKSAtYyAtcworTElCVE9PTCA9ICQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sCitMSUJUT09MX0RFUFMgPSAuL2x0bWFpbi5zaAorTE5fUyA9IGxuIC1zCitPQkpEVU1QID0gb2JqZHVtcAorT0JKRVhUID0gbworUEFDS0FHRSA9IG1vZF9nc29hcAorUkFOTElCID0gcmFubGliCitTVFJJUCA9IHN0cmlwCitWRVJTSU9OID0gMC4wLjUKK2FtX19pbmNsdWRlID0gaW5jbHVkZQorYW1fX3F1b3RlID0gCitpbnN0YWxsX3NoID0gL2hvbWUvYWJlcmdlci9hcGFjaGVfZ3NvYXAuMC4wLjUvaW5zdGFsbC1zaAorCitsaWJfTFRMSUJSQVJJRVMgPSBsaWJmb28ubGEKKworbGliZm9vX2xhX1NPVVJDRVMgPSBmb28uY3BwCisKK2xpYmZvb19sYV9MSUJEQUREID0gLWxsdGRsCisKK2xpYmZvb19sYV9MREZMQUdTID0gLXZlcnNpb24taW5mbyAwOjA6MCAtbW9kdWxlCitzdWJkaXIgPSBDb25zb2xlU2VydmVyL2ZvbworbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycworQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK0xUTElCUkFSSUVTID0gJChsaWJfTFRMSUJSQVJJRVMpCisKK2xpYmZvb19sYV9MSUJBREQgPQorYW1fbGliZm9vX2xhX09CSkVDVFMgPSBmb28ubG8KK2xpYmZvb19sYV9PQkpFQ1RTID0gJChhbV9saWJmb29fbGFfT0JKRUNUUykKKworREVGUyA9IC1ESEFWRV9DT05GSUdfSAorREVGQVVMVF9JTkNMVURFUyA9ICAtSS4gLUkkKHNyY2RpcikgLUkkKHRvcF9idWlsZGRpcikKK0NQUEZMQUdTID0gCitMREZMQUdTID0gCitMSUJTID0gCitkZXBjb21wID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9kZXBjb21wCitERVBfRklMRVMgPSAkKERFUERJUikvZm9vLlBsbworQ1hYQ09NUElMRSA9ICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgXAorCSQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpCitMVENYWENPTVBJTEUgPSAkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpIFwKKwkkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIFwKKwkkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKQorQ1hYTEQgPSAkKENYWCkKK0NYWExJTksgPSAkKExJQlRPT0wpIC0tbW9kZT1saW5rICQoQ1hYTEQpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIFwKKwkkKEFNX0xERkxBR1MpICQoTERGTEFHUykgLW8gJEAKK0RJU1RfU09VUkNFUyA9ICQobGliZm9vX2xhX1NPVVJDRVMpCitESVNUX0NPTU1PTiA9IE1ha2VmaWxlLmFtIE1ha2VmaWxlLmluCitTT1VSQ0VTID0gJChsaWJmb29fbGFfU09VUkNFUykKKworYWxsOiBhbGwtYW0KKworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuY3BwIC5sbyAubyAub2JqCisKK21vc3RseWNsZWFuLWxpYnRvb2w6CisJLXJtIC1mICoubG8KKworY2xlYW4tbGlidG9vbDoKKwktcm0gLXJmIC5saWJzIF9saWJzCisKK2Rpc3RjbGVhbi1saWJ0b29sOgorCS1ybSAtZiBsaWJ0b29sCiskKHNyY2RpcikvTWFrZWZpbGUuaW46ICBNYWtlZmlsZS5hbSAgJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KQorCWNkICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1nbnUgIENvbnNvbGVTZXJ2ZXIvZm9vL01ha2VmaWxlCitNYWtlZmlsZTogICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgXAorCSAgQ09ORklHX0hFQURFUlM9IENPTkZJR19MSU5LUz0gXAorCSAgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS8kQCAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKK2luc3RhbGwtbGliTFRMSUJSQVJJRVM6ICQobGliX0xUTElCUkFSSUVTKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQobGliZGlyKQorCUBsaXN0PSckKGxpYl9MVExJQlJBUklFUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIFwKKwkgICAgZWNobyAiICQoTElCVE9PTCkgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMKSAkKElOU1RBTExfU1RSSVBfRkxBRykgJCRwICQoREVTVERJUikkKGxpYmRpcikvJCRwIjsgXAorCSAgICAkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTCkgJChJTlNUQUxMX1NUUklQX0ZMQUcpICQkcCAkKERFU1RESVIpJChsaWJkaXIpLyQkcDsgXAorCSAgZWxzZSA6OyBmaTsgXAorCWRvbmUKKwordW5pbnN0YWxsLWxpYkxUTElCUkFSSUVTOgorCUAkKE5PUk1BTF9VTklOU1RBTEwpCisJQGxpc3Q9JyQobGliX0xUTElCUkFSSUVTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgZWNobyAiICQoTElCVE9PTCkgLS1tb2RlPXVuaW5zdGFsbCBybSAtZiAkKERFU1RESVIpJChsaWJkaXIpLyQkcCI7IFwKKwkgICQoTElCVE9PTCkgLS1tb2RlPXVuaW5zdGFsbCBybSAtZiAkKERFU1RESVIpJChsaWJkaXIpLyQkcDsgXAorCWRvbmUKKworY2xlYW4tbGliTFRMSUJSQVJJRVM6CisJLXRlc3QgLXogIiQobGliX0xUTElCUkFSSUVTKSIgfHwgcm0gLWYgJChsaWJfTFRMSUJSQVJJRVMpCitsaWJmb28ubGE6ICQobGliZm9vX2xhX09CSkVDVFMpICQobGliZm9vX2xhX0RFUEVOREVOQ0lFUykgCisJJChDWFhMSU5LKSAtcnBhdGggJChsaWJkaXIpICQobGliZm9vX2xhX0xERkxBR1MpICQobGliZm9vX2xhX09CSkVDVFMpICQobGliZm9vX2xhX0xJQkFERCkgJChMSUJTKQorCittb3N0bHljbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLiQoT0JKRVhUKSBjb3JlICouY29yZQorCitkaXN0Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi50YWIuYworCitpbmNsdWRlICQoREVQRElSKS9mb28uUGxvCisKK2Rpc3RjbGVhbi1kZXBlbmQ6CisJLXJtIC1yZiAkKERFUERJUikKKworLmNwcC5vOgorCXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gXAorCWRlcGZpbGU9JyQoREVQRElSKS8kKi5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpLyQqLlRQbycgXAorCSQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBcCisJJChDWFhDT01QSUxFKSAtYyAtbyAkQCBgdGVzdCAtZiAkPCB8fCBlY2hvICckKHNyY2RpcikvJ2AkPAorCisuY3BwLm9iajoKKwlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIFwKKwlkZXBmaWxlPSckKERFUERJUikvJCouUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS8kKi5UUG8nIFwKKwkkKENYWERFUE1PREUpICQoZGVwY29tcCkgXAorCSQoQ1hYQ09NUElMRSkgLWMgLW8gJEAgYGN5Z3BhdGggLXcgJDxgCisKKy5jcHAubG86CisJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD15ZXMgXAorCWRlcGZpbGU9JyQoREVQRElSKS8kKi5QbG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS8kKi5UUGxvJyBcCisJJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIFwKKwkkKExUQ1hYQ09NUElMRSkgLWMgLW8gJEAgYHRlc3QgLWYgJDwgfHwgZWNobyAnJChzcmNkaXIpLydgJDwKK0NYWERFUE1PREUgPSBkZXBtb2RlPWdjYwordW5pbnN0YWxsLWluZm8tYW06CisKK3RhZ3M6IFRBR1MKKworSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKKwkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKKwlta2lkIC1mSUQgJCR1bmlxdWUgJChMSVNQKQorCitUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCXRhZ3M9OyBcCisJaGVyZT1gcHdkYDsgXAorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAorCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAorCXRlc3QgLXogIiQoRVRBR1NfQVJHUykkJHVuaXF1ZSQoTElTUCkkJHRhZ3MiIFwKKwkgIHx8IGV0YWdzICQoRVRBR1NfQVJHUykgJCR0YWdzICAkJHVuaXF1ZSAkKExJU1ApCisKK0dUQUdTOgorCWhlcmU9YENEUEFUSD06ICYmIGNkICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmIGNkICQodG9wX3NyY2RpcikgXAorCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAkJGhlcmUKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRICisKK0RJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCisKK3RvcF9kaXN0ZGlyID0gLi4vLi4KK2Rpc3RkaXIgPSAkKHRvcF9kaXN0ZGlyKS8kKFBBQ0tBR0UpLSQoVkVSU0lPTikKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQGZvciBmaWxlIGluICQoRElTVEZJTEVTKTsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgZGlyPWBlY2hvICIkJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAorCSAgaWYgdGVzdCAiJCRkaXIiICE9ICIkJGZpbGUiICYmIHRlc3QgIiQkZGlyIiAhPSAiLiI7IHRoZW4gXAorCSAgICAkKG1raW5zdGFsbGRpcnMpICIkKGRpc3RkaXIpLyQkZGlyIjsgXAorCSAgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGNwIC1wUiAkJGQvJCRmaWxlICQoZGlzdGRpcikgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stYW0KK2FsbC1hbTogTWFrZWZpbGUgJChMVExJQlJBUklFUykKKworaW5zdGFsbGRpcnM6CisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpCisKK2luc3RhbGw6IGluc3RhbGwtYW0KK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQordW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KK2luc3RhbGwtc3RyaXA6CisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXJtIC1mIE1ha2VmaWxlICQoQ09ORklHX0NMRUFOX0ZJTEVTKSBzdGFtcC1oIHN0YW1wLWhbMC05XSoKKworbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCitjbGVhbjogY2xlYW4tYW0KKworY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGliTFRMSUJSQVJJRVMgY2xlYW4tbGlidG9vbCBcCisJbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KKworZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZGVwZW5kIFwKKwlkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1hbQorCitkdmktYW06CisKK2luZm86IGluZm8tYW0KKworaW5mby1hbToKKworaW5zdGFsbC1kYXRhLWFtOgorCitpbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtbGliTFRMSUJSQVJJRVMKKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KKworaW5zdGFsbC1tYW46CisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCittYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCisKK21vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQorCittb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIFwKKwltb3N0bHljbGVhbi1saWJ0b29sCisKK3VuaW5zdGFsbC1hbTogdW5pbnN0YWxsLWluZm8tYW0gdW5pbnN0YWxsLWxpYkxUTElCUkFSSUVTCisKKy5QSE9OWTogR1RBR1MgYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1nZW5lcmljIFwKKwljbGVhbi1saWJMVExJQlJBUklFUyBjbGVhbi1saWJ0b29sIGRpc3RjbGVhbiBkaXN0Y2xlYW4tY29tcGlsZSBcCisJZGlzdGNsZWFuLWRlcGVuZCBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBcCisJZGlzdGNsZWFuLXRhZ3MgZGlzdGRpciBkdmkgZHZpLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIFwKKwlpbnN0YWxsLWFtIGluc3RhbGwtZGF0YSBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1leGVjIFwKKwlpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBcCisJaW5zdGFsbC1saWJMVExJQlJBUklFUyBpbnN0YWxsLW1hbiBpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBcCisJaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIG1haW50YWluZXItY2xlYW4gXAorCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBtb3N0bHljbGVhbi1jb21waWxlIFwKKwltb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wgdGFncyB1bmluc3RhbGwgXAorCXVuaW5zdGFsbC1hbSB1bmluc3RhbGwtaW5mby1hbSB1bmluc3RhbGwtbGliTFRMSUJSQVJJRVMKKworIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL0NvbnNvbGVTZXJ2ZXIvZm9vL01ha2VmaWxlLmFtIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL0NvbnNvbGVTZXJ2ZXIvZm9vL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NTUxZTAKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvQ29uc29sZVNlcnZlci9mb28vTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMiBAQAorIyMgdGhpcyBmaWxlIGlzIGlucHV0IGZvciBhdXRvbWFrZSBhbmQgd2lsbCBnZW5lcmF0ZSBNYWtlZmlsZS5pbgorCitsaWJfTFRMSUJSQVJJRVMgPSBsaWJmb28ubGEKKworbGliZm9vX2xhX1NPVVJDRVMgPSBmb28uY3BwCisKK2xpYmZvb19sYV9MSUJEQUREID0gLWxsdGRsCisKK2xpYmZvb19sYV9MREZMQUdTID0gLXZlcnNpb24taW5mbyAwOjA6MCAtbW9kdWxlCisgICAgICAgIAorCisKZGlmZiAtLWdpdCBhL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9Db25zb2xlU2VydmVyL2Zvby9NYWtlZmlsZS5pbiBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9Db25zb2xlU2VydmVyL2Zvby9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OThkNDdkCi0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL0NvbnNvbGVTZXJ2ZXIvZm9vL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMzQxIEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGF1dG9tYWtlIDEuNSBmcm9tIE1ha2VmaWxlLmFtLgorCisjIENvcHlyaWdodCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxCisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorCitTSEVMTCA9IEBTSEVMTEAKKworc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK1ZQQVRIID0gQHNyY2RpckAKK3ByZWZpeCA9IEBwcmVmaXhACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKKworYmluZGlyID0gQGJpbmRpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAorbGliZGlyID0gQGxpYmRpckAKK2luZm9kaXIgPSBAaW5mb2RpckAKK21hbmRpciA9IEBtYW5kaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitvbGRpbmNsdWRlZGlyID0gL3Vzci9pbmNsdWRlCitwa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAordG9wX2J1aWxkZGlyID0gLi4vLi4KKworQUNMT0NBTCA9IEBBQ0xPQ0FMQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKKworSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAoraG9zdF90cmlwbGV0ID0gQGhvc3RACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAordGFyZ2V0X3RyaXBsZXQgPSBAdGFyZ2V0QAorQU1UQVIgPSBAQU1UQVJACitBUFhTX0NYWF9PUFRJT05TID0gQEFQWFNfQ1hYX09QVElPTlNACitBUyA9IEBBU0AKK0FXSyA9IEBBV0tACitDQyA9IEBDQ0AKK0NQUCA9IEBDUFBACitDWFggPSBAQ1hYQAorQ1hYREVCVUdERUZJTkVTID0gQENYWERFQlVHREVGSU5FU0AKK0NYWEZMQUdTID0gQENYWEZMQUdTQAorREVQRElSID0gQERFUERJUkAKK0RMTFRPT0wgPSBARExMVE9PTEAKK0VDSE8gPSBARUNIT0AKK0VYRUVYVCA9IEBFWEVFWFRACitFWElTVFNfQVBYUyA9IEBFWElTVFNfQVBYU0AKK0dTT0FQX0NQUF9TUkMgPSBAR1NPQVBfQ1BQX1NSQ0AKK0dTT0FQX0NfU1JDID0gQEdTT0FQX0NfU1JDQAorR1NPQVBfSU5DTFVERSA9IEBHU09BUF9JTkNMVURFQAorR1NPQVBfUFJFRklYID0gQEdTT0FQX1BSRUZJWEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitMSUJUT09MID0gQExJQlRPT0xACitMSUJUT09MX0RFUFMgPSBATElCVE9PTF9ERVBTQAorTE5fUyA9IEBMTl9TQAorT0JKRFVNUCA9IEBPQkpEVU1QQAorT0JKRVhUID0gQE9CSkVYVEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1JBTkxJQiA9IEBSQU5MSUJACitTVFJJUCA9IEBTVFJJUEAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2luc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKKworbGliX0xUTElCUkFSSUVTID0gbGliZm9vLmxhCisKK2xpYmZvb19sYV9TT1VSQ0VTID0gZm9vLmNwcAorCitsaWJmb29fbGFfTElCREFERCA9IC1sbHRkbAorCitsaWJmb29fbGFfTERGTEFHUyA9IC12ZXJzaW9uLWluZm8gMDowOjAgLW1vZHVsZQorc3ViZGlyID0gQ29uc29sZVNlcnZlci9mb28KK21raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMKK0NPTkZJR19IRUFERVIgPSAkKHRvcF9idWlsZGRpcikvY29uZmlnLmgKK0NPTkZJR19DTEVBTl9GSUxFUyA9CitMVExJQlJBUklFUyA9ICQobGliX0xUTElCUkFSSUVTKQorCitsaWJmb29fbGFfTElCQUREID0KK2FtX2xpYmZvb19sYV9PQkpFQ1RTID0gZm9vLmxvCitsaWJmb29fbGFfT0JKRUNUUyA9ICQoYW1fbGliZm9vX2xhX09CSkVDVFMpCisKK0RFRlMgPSBAREVGU0AKK0RFRkFVTFRfSU5DTFVERVMgPSAgLUkuIC1JJChzcmNkaXIpIC1JJCh0b3BfYnVpbGRkaXIpCitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKK0xERkxBR1MgPSBATERGTEFHU0AKK0xJQlMgPSBATElCU0AKK2RlcGNvbXAgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2RlcGNvbXAKK0BBTURFUF9UUlVFQERFUF9GSUxFUyA9ICQoREVQRElSKS9mb28uUGxvCitDWFhDT01QSUxFID0gJChDWFgpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSBcCisJJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykKK0xUQ1hYQ09NUElMRSA9ICQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDWFgpICQoREVGUykgXAorCSQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgXAorCSQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpCitDWFhMRCA9ICQoQ1hYKQorQ1hYTElOSyA9ICQoTElCVE9PTCkgLS1tb2RlPWxpbmsgJChDWFhMRCkgJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykgXAorCSQoQU1fTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAorRElTVF9TT1VSQ0VTID0gJChsaWJmb29fbGFfU09VUkNFUykKK0RJU1RfQ09NTU9OID0gTWFrZWZpbGUuYW0gTWFrZWZpbGUuaW4KK1NPVVJDRVMgPSAkKGxpYmZvb19sYV9TT1VSQ0VTKQorCithbGw6IGFsbC1hbQorCisuU1VGRklYRVM6CisuU1VGRklYRVM6IC5jcHAgLmxvIC5vIC5vYmoKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKKworZGlzdGNsZWFuLWxpYnRvb2w6CisJLXJtIC1mIGxpYnRvb2wKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogIE1ha2VmaWxlLmFtICAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWdudSAgQ29uc29sZVNlcnZlci9mb28vTWFrZWZpbGUKK01ha2VmaWxlOiAgJChzcmNkaXIpL01ha2VmaWxlLmluICAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCWNkICQodG9wX2J1aWxkZGlyKSAmJiBcCisJICBDT05GSUdfSEVBREVSUz0gQ09ORklHX0xJTktTPSBcCisJICBDT05GSUdfRklMRVM9JChzdWJkaXIpLyRAICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworaW5zdGFsbC1saWJMVExJQlJBUklFUzogJChsaWJfTFRMSUJSQVJJRVMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpCisJQGxpc3Q9JyQobGliX0xUTElCUkFSSUVTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAorCSAgICBlY2hvICIgJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTEwpICQoSU5TVEFMTF9TVFJJUF9GTEFHKSAkJHAgJChERVNURElSKSQobGliZGlyKS8kJHAiOyBcCisJICAgICQoTElCVE9PTCkgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMKSAkKElOU1RBTExfU1RSSVBfRkxBRykgJCRwICQoREVTVERJUikkKGxpYmRpcikvJCRwOyBcCisJICBlbHNlIDo7IGZpOyBcCisJZG9uZQorCit1bmluc3RhbGwtbGliTFRMSUJSQVJJRVM6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChsaWJfTFRMSUJSQVJJRVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBlY2hvICIgJChMSUJUT09MKSAtLW1vZGU9dW5pbnN0YWxsIHJtIC1mICQoREVTVERJUikkKGxpYmRpcikvJCRwIjsgXAorCSAgJChMSUJUT09MKSAtLW1vZGU9dW5pbnN0YWxsIHJtIC1mICQoREVTVERJUikkKGxpYmRpcikvJCRwOyBcCisJZG9uZQorCitjbGVhbi1saWJMVExJQlJBUklFUzoKKwktdGVzdCAteiAiJChsaWJfTFRMSUJSQVJJRVMpIiB8fCBybSAtZiAkKGxpYl9MVExJQlJBUklFUykKK2xpYmZvby5sYTogJChsaWJmb29fbGFfT0JKRUNUUykgJChsaWJmb29fbGFfREVQRU5ERU5DSUVTKSAKKwkkKENYWExJTkspIC1ycGF0aCAkKGxpYmRpcikgJChsaWJmb29fbGFfTERGTEFHUykgJChsaWJmb29fbGFfT0JKRUNUUykgJChsaWJmb29fbGFfTElCQUREKSAkKExJQlMpCisKK21vc3RseWNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICouJChPQkpFWFQpIGNvcmUgKi5jb3JlCisKK2Rpc3RjbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLnRhYi5jCisKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAkKERFUERJUikvZm9vLlBsb0BhbV9fcXVvdGVACisKK2Rpc3RjbGVhbi1kZXBlbmQ6CisJLXJtIC1yZiAkKERFUERJUikKKworLmNwcC5vOgorQEFNREVQX1RSVUVACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVACWRlcGZpbGU9JyQoREVQRElSKS8kKi5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpLyQqLlRQbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVACSQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACisJJChDWFhDT01QSUxFKSAtYyAtbyAkQCBgdGVzdCAtZiAkPCB8fCBlY2hvICckKHNyY2RpcikvJ2AkPAorCisuY3BwLm9iajoKK0BBTURFUF9UUlVFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQAlkZXBmaWxlPSckKERFUERJUikvJCouUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS8kKi5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQAkkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorCSQoQ1hYQ09NUElMRSkgLWMgLW8gJEAgYGN5Z3BhdGggLXcgJDxgCisKKy5jcHAubG86CitAQU1ERVBfVFJVRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVACWRlcGZpbGU9JyQoREVQRElSKS8kKi5QbG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS8kKi5UUGxvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUAJJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKKwkkKExUQ1hYQ09NUElMRSkgLWMgLW8gJEAgYHRlc3QgLWYgJDwgfHwgZWNobyAnJChzcmNkaXIpLydgJDwKK0NYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKK3VuaW5zdGFsbC1pbmZvLWFtOgorCit0YWdzOiBUQUdTCisKK0lEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJbWtpZCAtZklEICQkdW5pcXVlICQoTElTUCkKKworVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwl0YWdzPTsgXAorCWhlcmU9YHB3ZGA7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKKwkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKKwl0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCR1bmlxdWUkKExJU1ApJCR0YWdzIiBcCisJICB8fCBldGFncyAkKEVUQUdTX0FSR1MpICQkdGFncyAgJCR1bmlxdWUgJChMSVNQKQorCitHVEFHUzoKKwloZXJlPWBDRFBBVEg9OiAmJiBjZCAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCisJICAmJiBjZCAkKHRvcF9zcmNkaXIpIFwKKwkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgJCRoZXJlCisKK2Rpc3RjbGVhbi10YWdzOgorCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSAorCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorCit0b3BfZGlzdGRpciA9IC4uLy4uCitkaXN0ZGlyID0gJCh0b3BfZGlzdGRpcikvJChQQUNLQUdFKS0kKFZFUlNJT04pCisKK2Rpc3RkaXI6ICQoRElTVEZJTEVTKQorCUBmb3IgZmlsZSBpbiAkKERJU1RGSUxFUyk7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGRpcj1gZWNobyAiJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKKwkgIGlmIHRlc3QgIiQkZGlyIiAhPSAiJCRmaWxlIiAmJiB0ZXN0ICIkJGRpciIgIT0gIi4iOyB0aGVuIFwKKwkgICAgJChta2luc3RhbGxkaXJzKSAiJChkaXN0ZGlyKS8kJGRpciI7IFwKKwkgIGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBjcCAtcFIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorY2hlY2stYW06IGFsbC1hbQorY2hlY2s6IGNoZWNrLWFtCithbGwtYW06IE1ha2VmaWxlICQoTFRMSUJSQVJJRVMpCisKK2luc3RhbGxkaXJzOgorCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQobGliZGlyKQorCitpbnN0YWxsOiBpbnN0YWxsLWFtCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KK3VuaW5zdGFsbDogdW5pbnN0YWxsLWFtCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKKwkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS1ybSAtZiBNYWtlZmlsZSAkKENPTkZJR19DTEVBTl9GSUxFUykgc3RhbXAtaCBzdGFtcC1oWzAtOV0qCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorY2xlYW46IGNsZWFuLWFtCisKK2NsZWFuLWFtOiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYkxUTElCUkFSSUVTIGNsZWFuLWxpYnRvb2wgXAorCW1vc3RseWNsZWFuLWFtCisKK2Rpc3RjbGVhbjogZGlzdGNsZWFuLWFtCisKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWRlcGVuZCBcCisJZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLXRhZ3MKKworZHZpOiBkdmktYW0KKworZHZpLWFtOgorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbToKKworaW5zdGFsbC1leGVjLWFtOiBpbnN0YWxsLWxpYkxUTElCUkFSSUVTCisKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCisKK2luc3RhbGwtbWFuOgorCitpbnN0YWxsY2hlY2stYW06CisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KKworbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCisJbW9zdGx5Y2xlYW4tbGlidG9vbAorCit1bmluc3RhbGwtYW06IHVuaW5zdGFsbC1pbmZvLWFtIHVuaW5zdGFsbC1saWJMVExJQlJBUklFUworCisuUEhPTlk6IEdUQUdTIGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBcCisJY2xlYW4tbGliTFRMSUJSQVJJRVMgY2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4gZGlzdGNsZWFuLWNvbXBpbGUgXAorCWRpc3RjbGVhbi1kZXBlbmQgZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWxpYnRvb2wgXAorCWRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIGR2aS1hbSBpbmZvIGluZm8tYW0gaW5zdGFsbCBcCisJaW5zdGFsbC1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZXhlYyBcCisJaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gXAorCWluc3RhbGwtbGliTFRMSUJSQVJJRVMgaW5zdGFsbC1tYW4gaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgXAorCWluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBtYWludGFpbmVyLWNsZWFuIFwKKwltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gbW9zdGx5Y2xlYW4tY29tcGlsZSBcCisJbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sIHRhZ3MgdW5pbnN0YWxsIFwKKwl1bmluc3RhbGwtYW0gdW5pbnN0YWxsLWluZm8tYW0gdW5pbnN0YWxsLWxpYkxUTElCUkFSSUVTCisKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9Db25zb2xlU2VydmVyL2Zvby9mb28uY3BwIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL0NvbnNvbGVTZXJ2ZXIvZm9vL2Zvby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM4NGU5YQotLS0gL2Rldi9udWxsCisrKyBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9Db25zb2xlU2VydmVyL2Zvby9mb28uY3BwCkBAIC0wLDAgKzEsNSBAQAorCisKK2V4dGVybiAiQyIgaW50IHRlc3QoKSB7CisgICAgcmV0dXJuIDEwOworfQpkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL01ha2VmaWxlIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MmQ3OTMKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvTWFrZWZpbGUKQEAgLTAsMCArMSw0NDIgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYXV0b21ha2UgMS41IGZyb20gTWFrZWZpbGUuYW0uCisKKyMgQ29weXJpZ2h0IDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCisKKworIyMjIyMjIyBUaGlzIGlzIHRoZSBpbnB1dCBmaWxlIGZvciBhdXRvbWFrZSwgd2hpY2ggd2lsbCBnZW5lcmF0ZSBNYWtlZmlsZS5pbiAjIyMjIyMjIyMjCisKK1NIRUxMID0gL2Jpbi9zaAorCitzcmNkaXIgPSAuCit0b3Bfc3JjZGlyID0gLgorCitwcmVmaXggPSAvdXNyL2xvY2FsCitleGVjX3ByZWZpeCA9ICR7cHJlZml4fQorCitiaW5kaXIgPSAke2V4ZWNfcHJlZml4fS9iaW4KK3NiaW5kaXIgPSAke2V4ZWNfcHJlZml4fS9zYmluCitsaWJleGVjZGlyID0gJHtleGVjX3ByZWZpeH0vbGliZXhlYworZGF0YWRpciA9ICR7cHJlZml4fS9zaGFyZQorc3lzY29uZmRpciA9ICR7cHJlZml4fS9ldGMKK3NoYXJlZHN0YXRlZGlyID0gJHtwcmVmaXh9L2NvbQorbG9jYWxzdGF0ZWRpciA9ICR7cHJlZml4fS92YXIKK2xpYmRpciA9ICR7ZXhlY19wcmVmaXh9L2xpYgoraW5mb2RpciA9ICR7cHJlZml4fS9pbmZvCittYW5kaXIgPSAke3ByZWZpeH0vbWFuCitpbmNsdWRlZGlyID0gJHtwcmVmaXh9L2luY2x1ZGUKK29sZGluY2x1ZGVkaXIgPSAvdXNyL2luY2x1ZGUKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL21vZF9nc29hcAorcGtnbGliZGlyID0gJChsaWJkaXIpL21vZF9nc29hcAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvbW9kX2dzb2FwCit0b3BfYnVpbGRkaXIgPSAuCisKK0FDTE9DQUwgPSAke1NIRUxMfSAvaG9tZS9hYmVyZ2VyL2FwYWNoZV9nc29hcC4wLjAuNS9taXNzaW5nIC0tcnVuIGFjbG9jYWwKK0FVVE9DT05GID0gJHtTSEVMTH0gL2hvbWUvYWJlcmdlci9hcGFjaGVfZ3NvYXAuMC4wLjUvbWlzc2luZyAtLXJ1biBhdXRvY29uZgorQVVUT01BS0UgPSAke1NIRUxMfSAvaG9tZS9hYmVyZ2VyL2FwYWNoZV9nc29hcC4wLjAuNS9taXNzaW5nIC0tcnVuIGF1dG9tYWtlCitBVVRPSEVBREVSID0gJHtTSEVMTH0gL2hvbWUvYWJlcmdlci9hcGFjaGVfZ3NvYXAuMC4wLjUvbWlzc2luZyAtLXJ1biBhdXRvaGVhZGVyCisKK0lOU1RBTEwgPSAvdXNyL2Jpbi9naW5zdGFsbCAtYworSU5TVEFMTF9QUk9HUkFNID0gJHtJTlNUQUxMfQorSU5TVEFMTF9EQVRBID0gJHtJTlNUQUxMfSAtbSA2NDQKK0lOU1RBTExfU0NSSVBUID0gJHtJTlNUQUxMfQorSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKK3RyYW5zZm9ybSA9IHMseCx4LAorTk9STUFMX0lOU1RBTEwgPSA6CitQUkVfSU5TVEFMTCA9IDoKK1BPU1RfSU5TVEFMTCA9IDoKK05PUk1BTF9VTklOU1RBTEwgPSA6CitQUkVfVU5JTlNUQUxMID0gOgorUE9TVF9VTklOU1RBTEwgPSA6CitidWlsZF9hbGlhcyA9IGk2ODYtc3VzZS1saW51eAorYnVpbGRfdHJpcGxldCA9IGk2ODYtc3VzZS1saW51eAoraG9zdF9hbGlhcyA9IGk2ODYtc3VzZS1saW51eAoraG9zdF90cmlwbGV0ID0gaTY4Ni1zdXNlLWxpbnV4Cit0YXJnZXRfYWxpYXMgPSBpNjg2LXN1c2UtbGludXgKK3RhcmdldF90cmlwbGV0ID0gaTY4Ni1zdXNlLWxpbnV4CitBTVRBUiA9ICR7U0hFTEx9IC9ob21lL2FiZXJnZXIvYXBhY2hlX2dzb2FwLjAuMC41L21pc3NpbmcgLS1ydW4gdGFyCitBUFhTX0NYWF9PUFRJT05TID0gCitBUyA9IGFzCitBV0sgPSBnYXdrCitDQyA9IGdjYworQ1BQID0gZ2NjIC1FCitDWFggPSBnKysKK0NYWERFQlVHREVGSU5FUyA9IC1EX05ERUJVRworQ1hYRkxBR1MgPSAgLU8yCitERVBESVIgPSAuZGVwcworRExMVE9PTCA9IGRsbHRvb2wKK0VDSE8gPSBlY2hvCitFWEVFWFQgPSAKK0VYSVNUU19BUFhTID0geWVzCitFWElTVFNfR1NPQVAgPSB5ZXMKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9ICR7U0hFTEx9ICQoaW5zdGFsbF9zaCkgLWMgLXMKK0xJQlRPT0wgPSAkKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbAorTElCVE9PTF9ERVBTID0gLi9sdG1haW4uc2gKK0xOX1MgPSBsbiAtcworT0JKRFVNUCA9IG9iamR1bXAKK09CSkVYVCA9IG8KK1BBQ0tBR0UgPSBtb2RfZ3NvYXAKK1JBTkxJQiA9IHJhbmxpYgorU1RSSVAgPSBzdHJpcAorVkVSU0lPTiA9IDAuMC41CithbV9faW5jbHVkZSA9IGluY2x1ZGUKK2FtX19xdW90ZSA9IAoraW5zdGFsbF9zaCA9IC9ob21lL2FiZXJnZXIvYXBhY2hlX2dzb2FwLjAuMC41L2luc3RhbGwtc2gKKworU1VCRElSUyA9IG1vZF9nc29hcCBleGFtcGxlCitDTEVBTkZJTEVTID0gKn4KKworQVVUT01BS0VfT1BUSU9OUyA9IGZvcmVpZ24gMS40CitTUkNESVJOQU1FID0gYXBhY2hlX2dzb2FwLiQoVkVSU0lPTikKK0JBQ0tVUEZJTEVOQU1FID0gJChTUkNESVJOQU1FKS50Z3oKK3N1YmRpciA9IC4KK0FDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKK21raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMKK0NPTkZJR19IRUFERVIgPSBjb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK0RJU1RfU09VUkNFUyA9CisKK1JFQ1VSU0lWRV9UQVJHRVRTID0gaW5mby1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZSBpbnN0YWxsLWluZm8tcmVjdXJzaXZlIFwKKwl1bmluc3RhbGwtaW5mby1yZWN1cnNpdmUgYWxsLXJlY3Vyc2l2ZSBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIFwKKwlpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIGluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBpbnN0YWxsLXJlY3Vyc2l2ZSBcCisJdW5pbnN0YWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZQorRElTVF9DT01NT04gPSAuL3N0YW1wLWguaW4gTWFrZWZpbGUuYW0gTWFrZWZpbGUuaW4gYWNsb2NhbC5tNCBcCisJY29uZmlnLmd1ZXNzIGNvbmZpZy5oLmluIGNvbmZpZy5zdWIgY29uZmlndXJlIGNvbmZpZ3VyZS5pbiBcCisJZGVwY29tcCBpbnN0YWxsLXNoIGx0bWFpbi5zaCBtaXNzaW5nIG1raW5zdGFsbGRpcnMKK0RJU1RfU1VCRElSUyA9ICQoU1VCRElSUykKK2FsbDogY29uZmlnLmgKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbGwtcmVjdXJzaXZlCisKKy5TVUZGSVhFUzoKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKKworZGlzdGNsZWFuLWxpYnRvb2w6CisJLXJtIC1mIGxpYnRvb2wKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogIE1ha2VmaWxlLmFtICAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gIE1ha2VmaWxlCitNYWtlZmlsZTogICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgXAorCSAgQ09ORklHX0hFQURFUlM9IENPTkZJR19MSU5LUz0gXAorCSAgQ09ORklHX0ZJTEVTPSRAICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJChzcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKKyQoc3JjZGlyKS9jb25maWd1cmU6ICAkKHNyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKQorCWNkICQoc3JjZGlyKSAmJiAkKEFVVE9DT05GKQorCiskKEFDTE9DQUxfTTQpOiAgY29uZmlndXJlLmluIAorCWNkICQoc3JjZGlyKSAmJiAkKEFDTE9DQUwpICQoQUNMT0NBTF9BTUZMQUdTKQorY29uZmlnLmg6IHN0YW1wLWgKKwlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKKwkJcm0gLWYgc3RhbXAtaDsgXAorCQkkKE1BS0UpIHN0YW1wLWg7IFwKKwllbHNlIDo7IGZpCitzdGFtcC1oOiAkKHNyY2RpcikvY29uZmlnLmguaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAcm0gLWYgc3RhbXAtaCBzdGFtcC1oVAorCUBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWhUIDI+IC9kZXYvbnVsbAorCWNkICQodG9wX2J1aWxkZGlyKSBcCisJICAmJiBDT05GSUdfRklMRVM9IENPTkZJR19IRUFERVJTPWNvbmZpZy5oIFwKKwkgICAgICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworCUBtdiBzdGFtcC1oVCBzdGFtcC1oCiskKHNyY2RpcikvY29uZmlnLmguaW46ICAkKHNyY2RpcikvLi9zdGFtcC1oLmluCisJQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCisJCXJtIC1mICQoc3JjZGlyKS8uL3N0YW1wLWguaW47IFwKKwkJJChNQUtFKSAkKHNyY2RpcikvLi9zdGFtcC1oLmluOyBcCisJZWxzZSA6OyBmaQorJChzcmNkaXIpLy4vc3RhbXAtaC5pbjogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKKwlAcm0gLWYgJChzcmNkaXIpLy4vc3RhbXAtaC5pbiAkKHNyY2RpcikvLi9zdGFtcC1oLmluVAorCUBlY2hvIHRpbWVzdGFtcCA+ICQoc3JjZGlyKS8uL3N0YW1wLWguaW5UIDI+IC9kZXYvbnVsbAorCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPSEVBREVSKQorCUBtdiAkKHNyY2RpcikvLi9zdGFtcC1oLmluVCAkKHNyY2RpcikvLi9zdGFtcC1oLmluCisKK2Rpc3RjbGVhbi1oZHI6CisJLXJtIC1mIGNvbmZpZy5oCit1bmluc3RhbGwtaW5mby1hbToKKworIyBUaGlzIGRpcmVjdG9yeSdzIHN1YmRpcmVjdG9yaWVzIGFyZSBtb3N0bHkgaW5kZXBlbmRlbnQ7IHlvdSBjYW4gY2QKKyMgaW50byB0aGVtIGFuZCBydW4gYG1ha2UnIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGlzIE1ha2VmaWxlLgorIyBUbyBjaGFuZ2UgdGhlIHZhbHVlcyBvZiBgbWFrZScgdmFyaWFibGVzOiBpbnN0ZWFkIG9mIGVkaXRpbmcgTWFrZWZpbGVzLAorIyAoMSkgaWYgdGhlIHZhcmlhYmxlIGlzIHNldCBpbiBgY29uZmlnLnN0YXR1cycsIGVkaXQgYGNvbmZpZy5zdGF0dXMnCisjICAgICAod2hpY2ggd2lsbCBjYXVzZSB0aGUgTWFrZWZpbGVzIHRvIGJlIHJlZ2VuZXJhdGVkIHdoZW4geW91IHJ1biBgbWFrZScpOworIyAoMikgb3RoZXJ3aXNlLCBwYXNzIHRoZSBkZXNpcmVkIHZhbHVlcyBvbiB0aGUgYG1ha2UnIGNvbW1hbmQgbGluZS4KKyQoUkVDVVJTSVZFX1RBUkdFVFMpOgorCUBzZXQgZm5vcmQgJChNQUtFRkxBR1MpOyBhbWY9JCQyOyBcCisJZG90X3NlZW49bm87IFwKKwl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAorCSAgICBkb3Rfc2Vlbj15ZXM7IFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKKwkgIGVsc2UgXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAorCSAgZmk7IFwKKwkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAorCSAgIHx8IGNhc2UgIiQkYW1mIiBpbiAqPSopIGV4aXQgMTs7ICprKikgZmFpbD15ZXM7OyAqKSBleGl0IDE7OyBlc2FjOyBcCisJZG9uZTsgXAorCWlmIHRlc3QgIiQkZG90X3NlZW4iID0gIm5vIjsgdGhlbiBcCisJICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAiJCR0YXJnZXQtYW0iIHx8IGV4aXQgMTsgXAorCWZpOyB0ZXN0IC16ICIkJGZhaWwiCisKK21vc3RseWNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBcCittYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZToKKwlAc2V0IGZub3JkICQoTUFLRUZMQUdTKTsgYW1mPSQkMjsgXAorCWRvdF9zZWVuPW5vOyBcCisJY2FzZSAiJEAiIGluIFwKKwkgIGRpc3RjbGVhbi0qIHwgbWFpbnRhaW5lci1jbGVhbi0qKSBsaXN0PSckKERJU1RfU1VCRElSUyknIDs7IFwKKwkgICopIGxpc3Q9JyQoU1VCRElSUyknIDs7IFwKKwllc2FjOyBcCisJcmV2PScnOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIDo7IGVsc2UgXAorCSAgICByZXY9IiQkc3ViZGlyICQkcmV2IjsgXAorCSAgZmk7IFwKKwlkb25lOyBcCisJcmV2PSIkJHJldiAuIjsgXAorCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKKwlmb3Igc3ViZGlyIGluICQkcmV2OyBkbyBcCisJICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAorCSAgZWxzZSBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCisJICBmaTsgXAorCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCisJICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKKwlkb25lICYmIHRlc3QgLXogIiQkZmFpbCIKK3RhZ3MtcmVjdXJzaXZlOgorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdGFncyk7IFwKKwlkb25lCisKK3RhZ3M6IFRBR1MKKworSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKKwkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKKwlta2lkIC1mSUQgJCR1bmlxdWUgJChMSVNQKQorCitUQUdTOiB0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgY29uZmlnLmguaW4gJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwl0YWdzPTsgXAorCWhlcmU9YHB3ZGA7IFwKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCisJICAgIHRlc3QgLWYgJCRzdWJkaXIvVEFHUyAmJiB0YWdzPSIkJHRhZ3MgLWkgJCRoZXJlLyQkc3ViZGlyL1RBR1MiOyBcCisJICBmaTsgXAorCWRvbmU7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKKwkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKKwl0ZXN0IC16ICIkKEVUQUdTX0FSR1MpY29uZmlnLmguaW4kJHVuaXF1ZSQoTElTUCkkJHRhZ3MiIFwKKwkgIHx8IGV0YWdzICQoRVRBR1NfQVJHUykgJCR0YWdzIGNvbmZpZy5oLmluICQkdW5pcXVlICQoTElTUCkKKworR1RBR1M6CisJaGVyZT1gQ0RQQVRIPTogJiYgY2QgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAorCSAgJiYgY2QgJCh0b3Bfc3JjZGlyKSBcCisJICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICQkaGVyZQorCitkaXN0Y2xlYW4tdGFnczoKKwktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEgKKworRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKKwordG9wX2Rpc3RkaXIgPSAuCisjIEF2b2lkIHVuc2lnaHRseSBgLi8nLgorZGlzdGRpciA9ICQoUEFDS0FHRSktJChWRVJTSU9OKQorCitHWklQX0VOViA9IC0tYmVzdAorCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwktY2htb2QgLVIgYSt3ICQoZGlzdGRpcikgPi9kZXYvbnVsbCAyPiYxOyBybSAtcmYgJChkaXN0ZGlyKQorCW1rZGlyICQoZGlzdGRpcikKKwlAZm9yIGZpbGUgaW4gJChESVNURklMRVMpOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBkaXI9YGVjaG8gIiQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICBpZiB0ZXN0ICIkJGRpciIgIT0gIiQkZmlsZSIgJiYgdGVzdCAiJCRkaXIiICE9ICIuIjsgdGhlbiBcCisJICAgICQobWtpbnN0YWxsZGlycykgIiQoZGlzdGRpcikvJCRkaXIiOyBcCisJICBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgY3AgLXBSICQkZC8kJGZpbGUgJChkaXN0ZGlyKSBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKKwlmb3Igc3ViZGlyIGluICQoU1VCRElSUyk7IGRvIFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCisJICAgIHRlc3QgLWQgJChkaXN0ZGlyKS8kJHN1YmRpciBcCisJICAgIHx8IG1rZGlyICQoZGlzdGRpcikvJCRzdWJkaXIgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgICAgKGNkICQkc3ViZGlyICYmIFwKKwkgICAgICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCisJICAgICAgICB0b3BfZGlzdGRpcj0iJCh0b3BfZGlzdGRpcikiIFwKKwkgICAgICAgIGRpc3RkaXI9Li4vJChkaXN0ZGlyKS8kJHN1YmRpciBcCisJICAgICAgICBkaXN0ZGlyKSBcCisJICAgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKKwktZmluZCAkKGRpc3RkaXIpIC10eXBlIGQgISAtcGVybSAtNzc3IC1leGVjIGNobW9kIGErcnd4IHt9IFw7IC1vIFwKKwkgICEgLXR5cGUgZCAhIC1wZXJtIC00NDQgLWxpbmtzIDEgLWV4ZWMgY2htb2QgYStyIHt9IFw7IC1vIFwKKwkgICEgLXR5cGUgZCAhIC1wZXJtIC00MDAgLWV4ZWMgY2htb2QgYStyIHt9IFw7IC1vIFwKKwkgICEgLXR5cGUgZCAhIC1wZXJtIC00NDQgLWV4ZWMgJChTSEVMTCkgJChpbnN0YWxsX3NoKSAtYyAtbSBhK3Ige30ge30gXDsgXAorCXx8IGNobW9kIC1SIGErciAkKGRpc3RkaXIpCitkaXN0OiBkaXN0ZGlyCisJJChBTVRBUikgY2hvZiAtICQoZGlzdGRpcikgfCBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWMgPiQoZGlzdGRpcikudGFyLmd6CisJLWNobW9kIC1SIGErdyAkKGRpc3RkaXIpID4vZGV2L251bGwgMj4mMTsgcm0gLXJmICQoZGlzdGRpcikKKworIyBUaGlzIHRhcmdldCB1bnRhcnMgdGhlIGRpc3QgZmlsZSBhbmQgdHJpZXMgYSBWUEFUSCBjb25maWd1cmF0aW9uLiAgVGhlbgorIyBpdCBndWFyYW50ZWVzIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBpcyBzZWxmLWNvbnRhaW5lZCBieSBtYWtpbmcgYW5vdGhlcgorIyB0YXJmaWxlLgorZGlzdGNoZWNrOiBkaXN0CisJLWNobW9kIC1SIGErdyAkKGRpc3RkaXIpID4gL2Rldi9udWxsIDI+JjE7IHJtIC1yZiAkKGRpc3RkaXIpCisJR1pJUD0kKEdaSVBfRU5WKSBndW56aXAgLWMgJChkaXN0ZGlyKS50YXIuZ3ogfCAkKEFNVEFSKSB4ZiAtCisJY2htb2QgLVIgYS13ICQoZGlzdGRpcik7IGNobW9kIGErdyAkKGRpc3RkaXIpCisJbWtkaXIgJChkaXN0ZGlyKS89YnVpbGQKKwlta2RpciAkKGRpc3RkaXIpLz1pbnN0CisJY2htb2QgYS13ICQoZGlzdGRpcikKKwlkY19pbnN0YWxsX2Jhc2U9YENEUEFUSD06ICYmIGNkICQoZGlzdGRpcikvPWluc3QgJiYgcHdkYCBcCisJICAmJiBjZCAkKGRpc3RkaXIpLz1idWlsZCBcCisJICAmJiAuLi9jb25maWd1cmUgLS1zcmNkaXI9Li4gLS1wcmVmaXg9JCRkY19pbnN0YWxsX2Jhc2UgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZHZpIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNoZWNrIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbGNoZWNrIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHVuaW5zdGFsbCBcCisJICAmJiAodGVzdCBgZmluZCAkJGRjX2luc3RhbGxfYmFzZSAtdHlwZSBmIC1wcmludCB8IHdjIC1sYCAtbGUgMSBcCisJICAgICB8fCAoZWNobyAiRXJyb3I6IGZpbGVzIGxlZnQgYWZ0ZXIgdW5pbnN0YWxsIiAxPiYyOyBcCisJICAgICAgICAgZXhpdCAxKSApIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3QgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdGNsZWFuIFwKKwkgICYmIHJtIC1mICQoZGlzdGRpcikudGFyLmd6IFwKKwkgICYmICh0ZXN0IGBmaW5kIC4gLXR5cGUgZiAtcHJpbnQgfCB3YyAtbGAgLWVxIDAgXAorCSAgICAgfHwgKGVjaG8gIkVycm9yOiBmaWxlcyBsZWZ0IGFmdGVyIGRpc3RjbGVhbiIgMT4mMjsgXAorCSAgICAgICAgIGV4aXQgMSkgKQorCS1jaG1vZCAtUiBhK3cgJChkaXN0ZGlyKSA+IC9kZXYvbnVsbCAyPiYxOyBybSAtcmYgJChkaXN0ZGlyKQorCUBlY2hvICIkKGRpc3RkaXIpLnRhci5neiBpcyByZWFkeSBmb3IgZGlzdHJpYnV0aW9uIiB8IFwKKwkgIHNlZCAnaDtzLy4vPS9nO3A7eDtwO3gnCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stcmVjdXJzaXZlCithbGwtYW06IE1ha2VmaWxlIGNvbmZpZy5oCitpbnN0YWxsZGlyczogaW5zdGFsbGRpcnMtcmVjdXJzaXZlCitpbnN0YWxsZGlycy1hbToKKworaW5zdGFsbDogaW5zdGFsbC1yZWN1cnNpdmUKK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlCit1bmluc3RhbGw6IHVuaW5zdGFsbC1yZWN1cnNpdmUKKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stcmVjdXJzaXZlCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKKwkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoQ0xFQU5GSUxFUykKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXJtIC1mIE1ha2VmaWxlICQoQ09ORklHX0NMRUFOX0ZJTEVTKSBzdGFtcC1oIHN0YW1wLWhbMC05XSoKKworbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCitjbGVhbjogY2xlYW4tcmVjdXJzaXZlCisKK2NsZWFuLWFtOiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgbW9zdGx5Y2xlYW4tYW0KKworZGlzdC1hbGw6IGRpc3RkaXIKKwkkKEFNVEFSKSBjaG9mIC0gJChkaXN0ZGlyKSB8IEdaSVA9JChHWklQX0VOVikgZ3ppcCAtYyA+JChkaXN0ZGlyKS50YXIuZ3oKKwktY2htb2QgLVIgYSt3ICQoZGlzdGRpcikgPi9kZXYvbnVsbCAyPiYxOyBybSAtcmYgJChkaXN0ZGlyKQorZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlCisJLXJtIC1mIGNvbmZpZy5zdGF0dXMgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWhkciBkaXN0Y2xlYW4tbGlidG9vbCBcCisJZGlzdGNsZWFuLXRhZ3MKKworZHZpOiBkdmktcmVjdXJzaXZlCisKK2R2aS1hbToKKworaW5mbzogaW5mby1yZWN1cnNpdmUKKworaW5mby1hbToKKworaW5zdGFsbC1kYXRhLWFtOgorCitpbnN0YWxsLWV4ZWMtYW06CisKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZQorCitpbnN0YWxsLW1hbjoKKworaW5zdGFsbGNoZWNrLWFtOgorCittYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQorCittYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCisKK21vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1yZWN1cnNpdmUKKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbAorCit1bmluc3RhbGwtYW06IHVuaW5zdGFsbC1pbmZvLWFtCisKK3VuaW5zdGFsbC1pbmZvOiB1bmluc3RhbGwtaW5mby1yZWN1cnNpdmUKKworLlBIT05ZOiAkKFJFQ1VSU0lWRV9UQVJHRVRTKSBHVEFHUyBhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLWFtIGNsZWFuIFwKKwljbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgY2xlYW4tcmVjdXJzaXZlIGRpc3QgZGlzdC1hbGwgXAorCWRpc3RjaGVjayBkaXN0Y2xlYW4gZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWhkciBcCisJZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tdGFncyBkaXN0ZGlyIFwKKwlkdmkgZHZpLWFtIGR2aS1yZWN1cnNpdmUgaW5mbyBpbmZvLWFtIGluZm8tcmVjdXJzaXZlIGluc3RhbGwgXAorCWluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIFwKKwlpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZXhlYy1yZWN1cnNpdmUgXAorCWluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZSBpbnN0YWxsLW1hbiBcCisJaW5zdGFsbC1yZWN1cnNpdmUgaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgaW5zdGFsbGNoZWNrLWFtIFwKKwlpbnN0YWxsZGlycyBpbnN0YWxsZGlycy1hbSBpbnN0YWxsZGlycy1yZWN1cnNpdmUgXAorCW1haW50YWluZXItY2xlYW4gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIFwKKwltYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZSBtb3N0bHljbGVhbiBtb3N0bHljbGVhbi1nZW5lcmljIFwKKwltb3N0bHljbGVhbi1saWJ0b29sIG1vc3RseWNsZWFuLXJlY3Vyc2l2ZSB0YWdzIHRhZ3MtcmVjdXJzaXZlIFwKKwl1bmluc3RhbGwgdW5pbnN0YWxsLWFtIHVuaW5zdGFsbC1pbmZvLWFtIFwKKwl1bmluc3RhbGwtaW5mby1yZWN1cnNpdmUgdW5pbnN0YWxsLXJlY3Vyc2l2ZQorCisKKy5QSE9OWTogYmFja3VwIAorCitiYWNrdXA6CisJJChNQUtFKSBjbGVhbgorCWlmIFsgLWYgLi4vJChCQUNLVVBGSUxFTkFNRSkgXSA7IHRoZW4gXAorCQlybSAuLi8kKEJBQ0tVUEZJTEVOQU1FKTsgXAorCWZpCisJKHB1c2hkIC4uICYmIHRhciAtY3pmICQoQkFDS1VQRklMRU5BTUUpICQoU1JDRElSTkFNRSkgJiYgcG9wZCkKKwlscyAtbCAuLi8kKEJBQ0tVUEZJTEVOQU1FKQorIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL01ha2VmaWxlLmFtIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmOTY0MmUKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyMCBAQAorIyMjIyMjIyBUaGlzIGlzIHRoZSBpbnB1dCBmaWxlIGZvciBhdXRvbWFrZSwgd2hpY2ggd2lsbCBnZW5lcmF0ZSBNYWtlZmlsZS5pbiAjIyMjIyMjIyMjCisKK1NVQkRJUlM9bW9kX2dzb2FwIGV4YW1wbGUKK0NMRUFORklMRVM9ICp+CisKKyMjIG5vdCBhIEdOVSBwYWNrYWdlLiBZb3UgY2FuIHJlbW92ZSB0aGlzIGxpbmUsIGlmCisjIyB5b3UgaGF2ZSBhbGwgbmVlZGVkIGZpbGVzLCB0aGF0IGEgR05VIHBhY2thZ2UgbmVlZHMKK0FVVE9NQUtFX09QVElPTlMgPSBmb3JlaWduIDEuNAorU1JDRElSTkFNRT1hcGFjaGVfZ3NvYXAuJChWRVJTSU9OKQorQkFDS1VQRklMRU5BTUU9JChTUkNESVJOQU1FKS50Z3oKKworLlBIT05ZOiBiYWNrdXAgCisKK2JhY2t1cDoKKwkkKE1BS0UpIGNsZWFuCisJaWYgWyAtZiAuLi8kKEJBQ0tVUEZJTEVOQU1FKSBdIDsgdGhlbiBcCisJCXJtIC4uLyQoQkFDS1VQRklMRU5BTUUpOyBcCisJZmkKKwkocHVzaGQgLi4gJiYgdGFyIC1jemYgJChCQUNLVVBGSUxFTkFNRSkgJChTUkNESVJOQU1FKSAmJiBwb3BkKQorCWxzIC1sIC4uLyQoQkFDS1VQRklMRU5BTUUpCmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvTWFrZWZpbGUuaW4gYi9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEwN2U1NQotLS0gL2Rldi9udWxsCisrKyBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDQ0MiBAQAorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhdXRvbWFrZSAxLjUgZnJvbSBNYWtlZmlsZS5hbS4KKworIyBDb3B5cmlnaHQgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMQorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK0BTRVRfTUFLRUAKKworIyMjIyMjIyBUaGlzIGlzIHRoZSBpbnB1dCBmaWxlIGZvciBhdXRvbWFrZSwgd2hpY2ggd2lsbCBnZW5lcmF0ZSBNYWtlZmlsZS5pbiAjIyMjIyMjIyMjCisKK1NIRUxMID0gQFNIRUxMQAorCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorVlBBVEggPSBAc3JjZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAorCitiaW5kaXIgPSBAYmluZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorZGF0YWRpciA9IEBkYXRhZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACitsaWJkaXIgPSBAbGliZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAorbWFuZGlyID0gQG1hbmRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK29sZGluY2x1ZGVkaXIgPSAvdXNyL2luY2x1ZGUKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAorcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACit0b3BfYnVpbGRkaXIgPSAuCisKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FVVE9DT05GID0gQEFVVE9DT05GQAorQVVUT01BS0UgPSBAQVVUT01BS0VACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACisKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACitJTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQordHJhbnNmb3JtID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfdHJpcGxldCA9IEBob3N0QAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RhcmdldF90cmlwbGV0ID0gQHRhcmdldEAKK0FNVEFSID0gQEFNVEFSQAorQVBYU19DWFhfT1BUSU9OUyA9IEBBUFhTX0NYWF9PUFRJT05TQAorQVMgPSBAQVNACitBV0sgPSBAQVdLQAorQ0MgPSBAQ0NACitDUFAgPSBAQ1BQQAorQ1hYID0gQENYWEAKK0NYWERFQlVHREVGSU5FUyA9IEBDWFhERUJVR0RFRklORVNACitDWFhGTEFHUyA9IEBDWFhGTEFHU0AKK0RFUERJUiA9IEBERVBESVJACitETExUT09MID0gQERMTFRPT0xACitFQ0hPID0gQEVDSE9ACitFWEVFWFQgPSBARVhFRVhUQAorRVhJU1RTX0FQWFMgPSBARVhJU1RTX0FQWFNACitFWElTVFNfR1NPQVAgPSBARVhJU1RTX0dTT0FQQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0xJQlRPT0wgPSBATElCVE9PTEAKK0xJQlRPT0xfREVQUyA9IEBMSUJUT09MX0RFUFNACitMTl9TID0gQExOX1NACitPQkpEVU1QID0gQE9CSkRVTVBACitPQkpFWFQgPSBAT0JKRVhUQAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUkFOTElCID0gQFJBTkxJQkAKK1NUUklQID0gQFNUUklQQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fcXVvdGUgPSBAYW1fX3F1b3RlQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAorCitTVUJESVJTID0gbW9kX2dzb2FwIGV4YW1wbGUKK0NMRUFORklMRVMgPSAqfgorCitBVVRPTUFLRV9PUFRJT05TID0gZm9yZWlnbiAxLjQKK1NSQ0RJUk5BTUUgPSBhcGFjaGVfZ3NvYXAuJChWRVJTSU9OKQorQkFDS1VQRklMRU5BTUUgPSAkKFNSQ0RJUk5BTUUpLnRnegorc3ViZGlyID0gLgorQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycworQ09ORklHX0hFQURFUiA9IGNvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPQorRElTVF9TT1VSQ0VTID0KKworUkVDVVJTSVZFX1RBUkdFVFMgPSBpbmZvLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlIGluc3RhbGwtaW5mby1yZWN1cnNpdmUgXAorCXVuaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZSBhbGwtcmVjdXJzaXZlIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgXAorCWluc3RhbGwtZXhlYy1yZWN1cnNpdmUgaW5zdGFsbGRpcnMtcmVjdXJzaXZlIGluc3RhbGwtcmVjdXJzaXZlIFwKKwl1bmluc3RhbGwtcmVjdXJzaXZlIGNoZWNrLXJlY3Vyc2l2ZSBpbnN0YWxsY2hlY2stcmVjdXJzaXZlCitESVNUX0NPTU1PTiA9IC4vc3RhbXAtaC5pbiBNYWtlZmlsZS5hbSBNYWtlZmlsZS5pbiBhY2xvY2FsLm00IFwKKwljb25maWcuZ3Vlc3MgY29uZmlnLmguaW4gY29uZmlnLnN1YiBjb25maWd1cmUgY29uZmlndXJlLmluIFwKKwlkZXBjb21wIGluc3RhbGwtc2ggbHRtYWluLnNoIG1pc3NpbmcgbWtpbnN0YWxsZGlycworRElTVF9TVUJESVJTID0gJChTVUJESVJTKQorYWxsOiBjb25maWcuaAorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFsbC1yZWN1cnNpdmUKKworLlNVRkZJWEVTOgorCittb3N0bHljbGVhbi1saWJ0b29sOgorCS1ybSAtZiAqLmxvCisKK2NsZWFuLWxpYnRvb2w6CisJLXJtIC1yZiAubGlicyBfbGlicworCitkaXN0Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgbGlidG9vbAorJChzcmNkaXIpL01ha2VmaWxlLmluOiAgTWFrZWZpbGUuYW0gICQodG9wX3NyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkKKwljZCAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZm9yZWlnbiAgTWFrZWZpbGUKK01ha2VmaWxlOiAgJChzcmNkaXIpL01ha2VmaWxlLmluICAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCWNkICQodG9wX2J1aWxkZGlyKSAmJiBcCisJICBDT05GSUdfSEVBREVSUz0gQ09ORklHX0xJTktTPSBcCisJICBDT05GSUdfRklMRVM9JEAgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCisKKyQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCisJJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjaworJChzcmNkaXIpL2NvbmZpZ3VyZTogICQoc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpCisJY2QgJChzcmNkaXIpICYmICQoQVVUT0NPTkYpCisKKyQoQUNMT0NBTF9NNCk6ICBjb25maWd1cmUuaW4gCisJY2QgJChzcmNkaXIpICYmICQoQUNMT0NBTCkgJChBQ0xPQ0FMX0FNRkxBR1MpCitjb25maWcuaDogc3RhbXAtaAorCUBpZiB0ZXN0ICEgLWYgJEA7IHRoZW4gXAorCQlybSAtZiBzdGFtcC1oOyBcCisJCSQoTUFLRSkgc3RhbXAtaDsgXAorCWVsc2UgOjsgZmkKK3N0YW1wLWg6ICQoc3JjZGlyKS9jb25maWcuaC5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBybSAtZiBzdGFtcC1oIHN0YW1wLWhUCisJQGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaFQgMj4gL2Rldi9udWxsCisJY2QgJCh0b3BfYnVpbGRkaXIpIFwKKwkgICYmIENPTkZJR19GSUxFUz0gQ09ORklHX0hFQURFUlM9Y29uZmlnLmggXAorCSAgICAgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCisJQG12IHN0YW1wLWhUIHN0YW1wLWgKKyQoc3JjZGlyKS9jb25maWcuaC5pbjogICQoc3JjZGlyKS8uL3N0YW1wLWguaW4KKwlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKKwkJcm0gLWYgJChzcmNkaXIpLy4vc3RhbXAtaC5pbjsgXAorCQkkKE1BS0UpICQoc3JjZGlyKS8uL3N0YW1wLWguaW47IFwKKwllbHNlIDo7IGZpCiskKHNyY2RpcikvLi9zdGFtcC1oLmluOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAorCUBybSAtZiAkKHNyY2RpcikvLi9zdGFtcC1oLmluICQoc3JjZGlyKS8uL3N0YW1wLWguaW5UCisJQGVjaG8gdGltZXN0YW1wID4gJChzcmNkaXIpLy4vc3RhbXAtaC5pblQgMj4gL2Rldi9udWxsCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9IRUFERVIpCisJQG12ICQoc3JjZGlyKS8uL3N0YW1wLWguaW5UICQoc3JjZGlyKS8uL3N0YW1wLWguaW4KKworZGlzdGNsZWFuLWhkcjoKKwktcm0gLWYgY29uZmlnLmgKK3VuaW5zdGFsbC1pbmZvLWFtOgorCisjIFRoaXMgZGlyZWN0b3J5J3Mgc3ViZGlyZWN0b3JpZXMgYXJlIG1vc3RseSBpbmRlcGVuZGVudDsgeW91IGNhbiBjZAorIyBpbnRvIHRoZW0gYW5kIHJ1biBgbWFrZScgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoaXMgTWFrZWZpbGUuCisjIFRvIGNoYW5nZSB0aGUgdmFsdWVzIG9mIGBtYWtlJyB2YXJpYWJsZXM6IGluc3RlYWQgb2YgZWRpdGluZyBNYWtlZmlsZXMsCisjICgxKSBpZiB0aGUgdmFyaWFibGUgaXMgc2V0IGluIGBjb25maWcuc3RhdHVzJywgZWRpdCBgY29uZmlnLnN0YXR1cycKKyMgICAgICh3aGljaCB3aWxsIGNhdXNlIHRoZSBNYWtlZmlsZXMgdG8gYmUgcmVnZW5lcmF0ZWQgd2hlbiB5b3UgcnVuIGBtYWtlJyk7CisjICgyKSBvdGhlcndpc2UsIHBhc3MgdGhlIGRlc2lyZWQgdmFsdWVzIG9uIHRoZSBgbWFrZScgY29tbWFuZCBsaW5lLgorJChSRUNVUlNJVkVfVEFSR0VUUyk6CisJQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKKwlkb3Rfc2Vlbj1ubzsgXAorCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCisJICAgIGRvdF9zZWVuPXllczsgXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAorCSAgZWxzZSBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCisJICBmaTsgXAorCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCisJICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKKwlkb25lOyBcCisJaWYgdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iOyB0aGVuIFwKKwkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICIkJHRhcmdldC1hbSIgfHwgZXhpdCAxOyBcCisJZmk7IHRlc3QgLXogIiQkZmFpbCIKKworbW9zdGx5Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIFwKK21haW50YWluZXItY2xlYW4tcmVjdXJzaXZlOgorCUBzZXQgZm5vcmQgJChNQUtFRkxBR1MpOyBhbWY9JCQyOyBcCisJZG90X3NlZW49bm87IFwKKwljYXNlICIkQCIgaW4gXAorCSAgZGlzdGNsZWFuLSogfCBtYWludGFpbmVyLWNsZWFuLSopIGxpc3Q9JyQoRElTVF9TVUJESVJTKScgOzsgXAorCSAgKikgbGlzdD0nJChTVUJESVJTKScgOzsgXAorCWVzYWM7IFwKKwlyZXY9Jyc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gOjsgZWxzZSBcCisJICAgIHJldj0iJCRzdWJkaXIgJCRyZXYiOyBcCisJICBmaTsgXAorCWRvbmU7IFwKKwlyZXY9IiQkcmV2IC4iOyBcCisJdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAorCWZvciBzdWJkaXIgaW4gJCRyZXY7IGRvIFwKKwkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCisJICBlbHNlIFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKKwkgIGZpOyBcCisJICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKKwkgICB8fCBjYXNlICIkJGFtZiIgaW4gKj0qKSBleGl0IDE7OyAqayopIGZhaWw9eWVzOzsgKikgZXhpdCAxOzsgZXNhYzsgXAorCWRvbmUgJiYgdGVzdCAteiAiJCRmYWlsIgordGFncy1yZWN1cnNpdmU6CisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8IChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0YWdzKTsgXAorCWRvbmUKKwordGFnczogVEFHUworCitJRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAorCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAorCW1raWQgLWZJRCAkJHVuaXF1ZSAkKExJU1ApCisKK1RBR1M6IHRhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSBjb25maWcuaC5pbiAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCXRhZ3M9OyBcCisJaGVyZT1gcHdkYDsgXAorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKKwkgICAgdGVzdCAtZiAkJHN1YmRpci9UQUdTICYmIHRhZ3M9IiQkdGFncyAtaSAkJGhlcmUvJCRzdWJkaXIvVEFHUyI7IFwKKwkgIGZpOyBcCisJZG9uZTsgXAorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAorCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAorCXRlc3QgLXogIiQoRVRBR1NfQVJHUyljb25maWcuaC5pbiQkdW5pcXVlJChMSVNQKSQkdGFncyIgXAorCSAgfHwgZXRhZ3MgJChFVEFHU19BUkdTKSAkJHRhZ3MgY29uZmlnLmguaW4gJCR1bmlxdWUgJChMSVNQKQorCitHVEFHUzoKKwloZXJlPWBDRFBBVEg9OiAmJiBjZCAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCisJICAmJiBjZCAkKHRvcF9zcmNkaXIpIFwKKwkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgJCRoZXJlCisKK2Rpc3RjbGVhbi10YWdzOgorCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSAorCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorCit0b3BfZGlzdGRpciA9IC4KKyMgQXZvaWQgdW5zaWdodGx5IGAuLycuCitkaXN0ZGlyID0gJChQQUNLQUdFKS0kKFZFUlNJT04pCisKK0daSVBfRU5WID0gLS1iZXN0CisKK2Rpc3RkaXI6ICQoRElTVEZJTEVTKQorCS1jaG1vZCAtUiBhK3cgJChkaXN0ZGlyKSA+L2Rldi9udWxsIDI+JjE7IHJtIC1yZiAkKGRpc3RkaXIpCisJbWtkaXIgJChkaXN0ZGlyKQorCUBmb3IgZmlsZSBpbiAkKERJU1RGSUxFUyk7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGRpcj1gZWNobyAiJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKKwkgIGlmIHRlc3QgIiQkZGlyIiAhPSAiJCRmaWxlIiAmJiB0ZXN0ICIkJGRpciIgIT0gIi4iOyB0aGVuIFwKKwkgICAgJChta2luc3RhbGxkaXJzKSAiJChkaXN0ZGlyKS8kJGRpciI7IFwKKwkgIGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBjcCAtcFIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorCWZvciBzdWJkaXIgaW4gJChTVUJESVJTKTsgZG8gXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKKwkgICAgdGVzdCAtZCAkKGRpc3RkaXIpLyQkc3ViZGlyIFwKKwkgICAgfHwgbWtkaXIgJChkaXN0ZGlyKS8kJHN1YmRpciBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgICAoY2QgJCRzdWJkaXIgJiYgXAorCSAgICAgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKKwkgICAgICAgIHRvcF9kaXN0ZGlyPSIkKHRvcF9kaXN0ZGlyKSIgXAorCSAgICAgICAgZGlzdGRpcj0uLi8kKGRpc3RkaXIpLyQkc3ViZGlyIFwKKwkgICAgICAgIGRpc3RkaXIpIFwKKwkgICAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorCS1maW5kICQoZGlzdGRpcikgLXR5cGUgZCAhIC1wZXJtIC03NzcgLWV4ZWMgY2htb2QgYStyd3gge30gXDsgLW8gXAorCSAgISAtdHlwZSBkICEgLXBlcm0gLTQ0NCAtbGlua3MgMSAtZXhlYyBjaG1vZCBhK3Ige30gXDsgLW8gXAorCSAgISAtdHlwZSBkICEgLXBlcm0gLTQwMCAtZXhlYyBjaG1vZCBhK3Ige30gXDsgLW8gXAorCSAgISAtdHlwZSBkICEgLXBlcm0gLTQ0NCAtZXhlYyAkKFNIRUxMKSAkKGluc3RhbGxfc2gpIC1jIC1tIGErciB7fSB7fSBcOyBcCisJfHwgY2htb2QgLVIgYStyICQoZGlzdGRpcikKK2Rpc3Q6IGRpc3RkaXIKKwkkKEFNVEFSKSBjaG9mIC0gJChkaXN0ZGlyKSB8IEdaSVA9JChHWklQX0VOVikgZ3ppcCAtYyA+JChkaXN0ZGlyKS50YXIuZ3oKKwktY2htb2QgLVIgYSt3ICQoZGlzdGRpcikgPi9kZXYvbnVsbCAyPiYxOyBybSAtcmYgJChkaXN0ZGlyKQorCisjIFRoaXMgdGFyZ2V0IHVudGFycyB0aGUgZGlzdCBmaWxlIGFuZCB0cmllcyBhIFZQQVRIIGNvbmZpZ3VyYXRpb24uICBUaGVuCisjIGl0IGd1YXJhbnRlZXMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGlzIHNlbGYtY29udGFpbmVkIGJ5IG1ha2luZyBhbm90aGVyCisjIHRhcmZpbGUuCitkaXN0Y2hlY2s6IGRpc3QKKwktY2htb2QgLVIgYSt3ICQoZGlzdGRpcikgPiAvZGV2L251bGwgMj4mMTsgcm0gLXJmICQoZGlzdGRpcikKKwlHWklQPSQoR1pJUF9FTlYpIGd1bnppcCAtYyAkKGRpc3RkaXIpLnRhci5neiB8ICQoQU1UQVIpIHhmIC0KKwljaG1vZCAtUiBhLXcgJChkaXN0ZGlyKTsgY2htb2QgYSt3ICQoZGlzdGRpcikKKwlta2RpciAkKGRpc3RkaXIpLz1idWlsZAorCW1rZGlyICQoZGlzdGRpcikvPWluc3QKKwljaG1vZCBhLXcgJChkaXN0ZGlyKQorCWRjX2luc3RhbGxfYmFzZT1gQ0RQQVRIPTogJiYgY2QgJChkaXN0ZGlyKS89aW5zdCAmJiBwd2RgIFwKKwkgICYmIGNkICQoZGlzdGRpcikvPWJ1aWxkIFwKKwkgICYmIC4uL2NvbmZpZ3VyZSAtLXNyY2Rpcj0uLiAtLXByZWZpeD0kJGRjX2luc3RhbGxfYmFzZSBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkdmkgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2sgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbCBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsY2hlY2sgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdW5pbnN0YWxsIFwKKwkgICYmICh0ZXN0IGBmaW5kICQkZGNfaW5zdGFsbF9iYXNlIC10eXBlIGYgLXByaW50IHwgd2MgLWxgIC1sZSAxIFwKKwkgICAgIHx8IChlY2hvICJFcnJvcjogZmlsZXMgbGVmdCBhZnRlciB1bmluc3RhbGwiIDE+JjI7IFwKKwkgICAgICAgICBleGl0IDEpICkgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdCBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0Y2xlYW4gXAorCSAgJiYgcm0gLWYgJChkaXN0ZGlyKS50YXIuZ3ogXAorCSAgJiYgKHRlc3QgYGZpbmQgLiAtdHlwZSBmIC1wcmludCB8IHdjIC1sYCAtZXEgMCBcCisJICAgICB8fCAoZWNobyAiRXJyb3I6IGZpbGVzIGxlZnQgYWZ0ZXIgZGlzdGNsZWFuIiAxPiYyOyBcCisJICAgICAgICAgZXhpdCAxKSApCisJLWNobW9kIC1SIGErdyAkKGRpc3RkaXIpID4gL2Rldi9udWxsIDI+JjE7IHJtIC1yZiAkKGRpc3RkaXIpCisJQGVjaG8gIiQoZGlzdGRpcikudGFyLmd6IGlzIHJlYWR5IGZvciBkaXN0cmlidXRpb24iIHwgXAorCSAgc2VkICdoO3MvLi89L2c7cDt4O3A7eCcKK2NoZWNrLWFtOiBhbGwtYW0KK2NoZWNrOiBjaGVjay1yZWN1cnNpdmUKK2FsbC1hbTogTWFrZWZpbGUgY29uZmlnLmgKK2luc3RhbGxkaXJzOiBpbnN0YWxsZGlycy1yZWN1cnNpdmUKK2luc3RhbGxkaXJzLWFtOgorCitpbnN0YWxsOiBpbnN0YWxsLXJlY3Vyc2l2ZQoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlCitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1yZWN1cnNpdmUKK3VuaW5zdGFsbDogdW5pbnN0YWxsLXJlY3Vyc2l2ZQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQorCitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1yZWN1cnNpdmUKK2luc3RhbGwtc3RyaXA6CisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChDTEVBTkZJTEVTKQorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktcm0gLWYgTWFrZWZpbGUgJChDT05GSUdfQ0xFQU5fRklMRVMpIHN0YW1wLWggc3RhbXAtaFswLTldKgorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKK2NsZWFuOiBjbGVhbi1yZWN1cnNpdmUKKworY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBtb3N0bHljbGVhbi1hbQorCitkaXN0LWFsbDogZGlzdGRpcgorCSQoQU1UQVIpIGNob2YgLSAkKGRpc3RkaXIpIHwgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1jID4kKGRpc3RkaXIpLnRhci5negorCS1jaG1vZCAtUiBhK3cgJChkaXN0ZGlyKSA+L2Rldi9udWxsIDI+JjE7IHJtIC1yZiAkKGRpc3RkaXIpCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1yZWN1cnNpdmUKKwktcm0gLWYgY29uZmlnLnN0YXR1cyBjb25maWcuY2FjaGUgY29uZmlnLmxvZworZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4taGRyIGRpc3RjbGVhbi1saWJ0b29sIFwKKwlkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1yZWN1cnNpdmUKKworZHZpLWFtOgorCitpbmZvOiBpbmZvLXJlY3Vyc2l2ZQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06CisKK2luc3RhbGwtZXhlYy1hbToKKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tcmVjdXJzaXZlCisKK2luc3RhbGwtbWFuOgorCitpbnN0YWxsY2hlY2stYW06CisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlCisKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZQorCittb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sCisKK3VuaW5zdGFsbC1hbTogdW5pbnN0YWxsLWluZm8tYW0KKwordW5pbnN0YWxsLWluZm86IHVuaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZQorCisuUEhPTlk6ICQoUkVDVVJTSVZFX1RBUkdFVFMpIEdUQUdTIGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gXAorCWNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBjbGVhbi1yZWN1cnNpdmUgZGlzdCBkaXN0LWFsbCBcCisJZGlzdGNoZWNrIGRpc3RjbGVhbiBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4taGRyIFwKKwlkaXN0Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tcmVjdXJzaXZlIGRpc3RjbGVhbi10YWdzIGRpc3RkaXIgXAorCWR2aSBkdmktYW0gZHZpLXJlY3Vyc2l2ZSBpbmZvIGluZm8tYW0gaW5mby1yZWN1cnNpdmUgaW5zdGFsbCBcCisJaW5zdGFsbC1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgXAorCWluc3RhbGwtZXhlYyBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBcCisJaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBpbnN0YWxsLWluZm8tcmVjdXJzaXZlIGluc3RhbGwtbWFuIFwKKwlpbnN0YWxsLXJlY3Vyc2l2ZSBpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBpbnN0YWxsY2hlY2stYW0gXAorCWluc3RhbGxkaXJzIGluc3RhbGxkaXJzLWFtIGluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBcCisJbWFpbnRhaW5lci1jbGVhbiBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgXAorCW1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlIG1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWdlbmVyaWMgXAorCW1vc3RseWNsZWFuLWxpYnRvb2wgbW9zdGx5Y2xlYW4tcmVjdXJzaXZlIHRhZ3MgdGFncy1yZWN1cnNpdmUgXAorCXVuaW5zdGFsbCB1bmluc3RhbGwtYW0gdW5pbnN0YWxsLWluZm8tYW0gXAorCXVuaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZSB1bmluc3RhbGwtcmVjdXJzaXZlCisKKworLlBIT05ZOiBiYWNrdXAgCisKK2JhY2t1cDoKKwkkKE1BS0UpIGNsZWFuCisJaWYgWyAtZiAuLi8kKEJBQ0tVUEZJTEVOQU1FKSBdIDsgdGhlbiBcCisJCXJtIC4uLyQoQkFDS1VQRklMRU5BTUUpOyBcCisJZmkKKwkocHVzaGQgLi4gJiYgdGFyIC1jemYgJChCQUNLVVBGSUxFTkFNRSkgJChTUkNESVJOQU1FKSAmJiBwb3BkKQorCWxzIC1sIC4uLyQoQkFDS1VQRklMRU5BTUUpCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvUkVBRE1FIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWIzNmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL1JFQURNRQpAQCAtMCwwICsxLDEwIEBACitUaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgc291cmNlcyBmb3IgYnVpbGRpbmcKK3RoZSBtb2RfZ3NvYXAgQXBhY2hlIG1vZHVsZSBmb3IgQXBhY2hlIDEuMy4KKworSGVyZSdzIHRoZSBxdWljayBzdGFydCB3YXkgdG8gYnVpbGQgeW91ciBvd24gRFNPLgorCisuL2NvbmZpZ3VyZSBbLS13aXRoLWdzb2FwPS9hbHRlcm5hdGUvcGF0aC90by9zb2FwY3BwMl0KK21ha2UKKworRm9yIG1vcmUgZGV0YWlscyB5b3UgY2FuIHNlZSB0aGUgYXBhY2hlX2luZGV4Lmh0bWwsIGJ1dAoraXQgaXMgbm90IHdob2xseSB1cCB0byBkYXRlLgpkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL2FjbG9jYWwubTQgYi9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvYWNsb2NhbC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjgwYzcyCi0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL2FjbG9jYWwubTQKQEAgLTAsMCArMSw0MDQ2IEBACisjIGFjbG9jYWwubTQgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYWNsb2NhbCAxLjUKKworIyBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMQorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworIyBEbyBhbGwgdGhlIHdvcmsgZm9yIEF1dG9tYWtlLiAgVGhpcyBtYWNybyBhY3R1YWxseSBkb2VzIHRvbyBtdWNoIC0tCisjIHNvbWUgY2hlY2tzIGFyZSBvbmx5IG5lZWRlZCBpZiB5b3VyIHBhY2thZ2UgZG9lcyBjZXJ0YWluIHRoaW5ncy4KKyMgQnV0IHRoaXMgaXNuJ3QgcmVhbGx5IGEgYmlnIGRlYWwuCisKKyMgc2VyaWFsIDUKKworIyBUaGVyZSBhcmUgYSBmZXcgZGlydHkgaGFja3MgYmVsb3cgdG8gYXZvaWQgbGV0dGluZyBgQUNfUFJPR19DQycgYmUKKyMgd3JpdHRlbiBpbiBjbGVhciwgaW4gd2hpY2ggY2FzZSBhdXRvbWFrZSwgd2hlbiByZWFkaW5nIGFjbG9jYWwubTQsCisjIHdpbGwgdGhpbmsgaXQgc2VlcyBhICp1c2UqLCBhbmQgdGhlcmVmb3JlIHdpbGwgdHJpZ2dlciBhbGwgaXQncworIyBDIHN1cHBvcnQgbWFjaGluZXJ5LiAgQWxzbyBub3RlIHRoYXQgaXQgbWVhbnMgdGhhdCBhdXRvc2Nhbiwgc2VlaW5nCisjIENDIGV0Yy4gaW4gdGhlIE1ha2VmaWxlLCB3aWxsIGFzayBmb3IgYW4gQUNfUFJPR19DQyB1c2UuLi4KKworCisjIFdlIHJlcXVpcmUgMi4xMyBiZWNhdXNlIHdlIHJlbHkgb24gU0hFTEwgYmVpbmcgY29tcHV0ZWQgYnkgY29uZmlndXJlLgorQUNfUFJFUkVRKFsyLjEzXSkKKworIyBBQ19QUk9WSURFX0lGRUxTRShNQUNSTy1OQU1FLCBJRi1QUk9WSURFRCwgSUYtTk9ULVBST1ZJREVEKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBJZiBNQUNSTy1OQU1FIGlzIHByb3ZpZGVkIGRvIElGLVBST1ZJREVELCBlbHNlIElGLU5PVC1QUk9WSURFRC4KKyMgVGhlIHB1cnBvc2Ugb2YgdGhpcyBtYWNybyBpcyB0byBwcm92aWRlIHRoZSB1c2VyIHdpdGggYSBtZWFucyB0bworIyBjaGVjayBtYWNyb3Mgd2hpY2ggYXJlIHByb3ZpZGVkIHdpdGhvdXQgbGV0dGluZyBoZXIga25vdyBob3cgdGhlCisjIGluZm9ybWF0aW9uIGlzIGNvZGVkLgorIyBJZiB0aGlzIG1hY3JvIGlzIG5vdCBkZWZpbmVkIGJ5IEF1dG9jb25mLCBkZWZpbmUgaXQgaGVyZS4KK2lmZGVmKFtBQ19QUk9WSURFX0lGRUxTRV0sCisgICAgICBbXSwKKyAgICAgIFtkZWZpbmUoW0FDX1BST1ZJREVfSUZFTFNFXSwKKyAgICAgICAgICAgICAgW2lmZGVmKFtBQ19QUk9WSURFXyQxXSwKKyAgICAgICAgICAgICAgICAgICAgIFskMl0sIFskM10pXSldKQorCisKKyMgQU1fSU5JVF9BVVRPTUFLRShQQUNLQUdFLFZFUlNJT04sIFtOTy1ERUZJTkVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbQU1fSU5JVF9BVVRPTUFLRV0sCitbQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSlkbmwKKyMgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAoraWYgdGVzdCAiYENEUEFUSD06OyBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYKKyAgIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCisgIEFDX01TR19FUlJPUihbc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biBcIm1ha2UgZGlzdGNsZWFuXCIgdGhlcmUgZmlyc3RdKQorZmkKKworIyBEZWZpbmUgdGhlIGlkZW50aXR5IG9mIHRoZSBwYWNrYWdlLgorUEFDS0FHRT0kMQorQUNfU1VCU1QoUEFDS0FHRSlkbmwKK1ZFUlNJT049JDIKK0FDX1NVQlNUKFZFUlNJT04pZG5sCitpZmVsc2UoWyQzXSwsCitbQUNfREVGSU5FX1VOUVVPVEVEKFBBQ0tBR0UsICIkUEFDS0FHRSIsIFtOYW1lIG9mIHBhY2thZ2VdKQorQUNfREVGSU5FX1VOUVVPVEVEKFZFUlNJT04sICIkVkVSU0lPTiIsIFtWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlXSldKQorCisjIEF1dG9jb25mIDIuNTAgd2FudHMgdG8gZGlzYWxsb3cgQU1fIG5hbWVzLiAgV2UgZXhwbGljaXRseSBhbGxvdworIyB0aGUgb25lcyB3ZSBjYXJlIGFib3V0LgoraWZkZWYoW200X3BhdHRlcm5fYWxsb3ddLAorICAgICAgW200X3BhdHRlcm5fYWxsb3coW15BTV9bQS1aXStGTEFHU10pXSlkbmwKKworIyBBdXRvY29uZiAyLjUwIGFsd2F5cyBjb21wdXRlcyBFWEVFWFQuICBIb3dldmVyIHdlIG5lZWQgdG8gYmUKKyMgY29tcGF0aWJsZSB3aXRoIDIuMTMsIGZvciBub3cuICBTbyB3ZSBhbHdheXMgZGVmaW5lIEVYRUVYVCwgYnV0IHdlCisjIGRvbid0IGNvbXB1dGUgaXQuCitBQ19TVUJTVChFWEVFWFQpCisjIFNpbWlsYXIgZm9yIE9CSkVYVCAtLSBvbmx5IHdlIG9ubHkgdXNlIE9CSkVYVCBpZiB0aGUgdXNlciBhY3R1YWxseQorIyByZXF1ZXN0cyB0aGF0IGl0IGJlIHVzZWQuICBUaGlzIGlzIGEgYml0IGR1bWIuCis6ICR7T0JKRVhUPW99CitBQ19TVUJTVChPQkpFWFQpCisKKyMgU29tZSB0b29scyBBdXRvbWFrZSBuZWVkcy4KK0FDX1JFUVVJUkUoW0FNX1NBTklUWV9DSEVDS10pZG5sCitBQ19SRVFVSVJFKFtBQ19BUkdfUFJPR1JBTV0pZG5sCitBTV9NSVNTSU5HX1BST0coQUNMT0NBTCwgYWNsb2NhbCkKK0FNX01JU1NJTkdfUFJPRyhBVVRPQ09ORiwgYXV0b2NvbmYpCitBTV9NSVNTSU5HX1BST0coQVVUT01BS0UsIGF1dG9tYWtlKQorQU1fTUlTU0lOR19QUk9HKEFVVE9IRUFERVIsIGF1dG9oZWFkZXIpCitBTV9NSVNTSU5HX1BST0coTUFLRUlORk8sIG1ha2VpbmZvKQorQU1fTUlTU0lOR19QUk9HKEFNVEFSLCB0YXIpCitBTV9QUk9HX0lOU1RBTExfU0gKK0FNX1BST0dfSU5TVEFMTF9TVFJJUAorIyBXZSBuZWVkIGF3ayBmb3IgdGhlICJjaGVjayIgdGFyZ2V0LiAgVGhlIHN5c3RlbSAiYXdrIiBpcyBiYWQgb24KKyMgc29tZSBwbGF0Zm9ybXMuCitBQ19SRVFVSVJFKFtBQ19QUk9HX0FXS10pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSlkbmwKK0FDX1JFUVVJUkUoW0FNX0RFUF9UUkFDS10pZG5sCitBQ19SRVFVSVJFKFtBTV9TRVRfREVQRElSXSlkbmwKK0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX11bQ0NdLAorICAgICAgICAgICAgICAgICAgW19BTV9ERVBFTkRFTkNJRVMoQ0MpXSwKKyAgICAgICAgICAgICAgICAgIFtkZWZpbmUoW0FDX1BST0dfXVtDQ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZm4oW0FDX1BST0dfXVtDQ10pW19BTV9ERVBFTkRFTkNJRVMoQ0MpXSldKWRubAorQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfXVtDWFhdLAorICAgICAgICAgICAgICAgICAgW19BTV9ERVBFTkRFTkNJRVMoQ1hYKV0sCisgICAgICAgICAgICAgICAgICBbZGVmaW5lKFtBQ19QUk9HX11bQ1hYXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmbihbQUNfUFJPR19dW0NYWF0pW19BTV9ERVBFTkRFTkNJRVMoQ1hYKV0pXSlkbmwKK10pCisKKyMKKyMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUuCisjCisKKyMgc2VyaWFsIDMKKworIyBBTV9TQU5JVFlfQ0hFQ0sKKyMgLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbQU1fU0FOSVRZX0NIRUNLXSwKK1tBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZV0pCisjIEp1c3QgaW4gY2FzZQorc2xlZXAgMQorZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdC5maWxlCisjIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCisjIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKKyMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKKyMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCisjIGRpcmVjdG9yeSkuCitpZiAoCisgICBzZXQgWCBgbHMgLUx0ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0LmZpbGUgMj4gL2Rldi9udWxsYAorICAgaWYgdGVzdCAiJFsqXSIgPSAiWCI7IHRoZW4KKyAgICAgICMgLUwgZGlkbid0IHdvcmsuCisgICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZWAKKyAgIGZpCisgICBybSAtZiBjb25mdGVzdC5maWxlCisgICBpZiB0ZXN0ICIkWypdIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlIiBcCisgICAgICAmJiB0ZXN0ICIkWypdIiAhPSAiWCBjb25mdGVzdC5maWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgorCisgICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCisgICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCisgICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5CisgICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCisgICAgICBBQ19NU0dfRVJST1IoW2xzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KK2FsaWFzIGluIHlvdXIgZW52aXJvbm1lbnRdKQorICAgZmkKKworICAgdGVzdCAiJFsyXSIgPSBjb25mdGVzdC5maWxlCisgICApCit0aGVuCisgICAjIE9rLgorICAgOgorZWxzZQorICAgQUNfTVNHX0VSUk9SKFtuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKK0NoZWNrIHlvdXIgc3lzdGVtIGNsb2NrXSkKK2ZpCitBQ19NU0dfUkVTVUxUKHllcyldKQorCisKKyMgc2VyaWFsIDIKKworIyBBTV9NSVNTSU5HX1BST0coTkFNRSwgUFJPR1JBTSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbQU1fTUlTU0lOR19QUk9HXSwKK1tBQ19SRVFVSVJFKFtBTV9NSVNTSU5HX0hBU19SVU5dKQorJDE9JHskMS0iJHthbV9taXNzaW5nX3J1bn0kMiJ9CitBQ19TVUJTVCgkMSldKQorCisKKyMgQU1fTUlTU0lOR19IQVNfUlVOCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyBEZWZpbmUgTUlTU0lORyBpZiBub3QgZGVmaW5lZCBzbyBmYXIgYW5kIHRlc3QgaWYgaXQgc3VwcG9ydHMgLS1ydW4uCisjIElmIGl0IGRvZXMsIHNldCBhbV9taXNzaW5nX3J1biB0byB1c2UgaXQsIG90aGVyd2lzZSwgdG8gbm90aGluZy4KK0FDX0RFRlVOKFtBTV9NSVNTSU5HX0hBU19SVU5dLAorW0FDX1JFUVVJUkUoW0FNX0FVWF9ESVJfRVhQQU5EXSlkbmwKK3Rlc3QgeCIke01JU1NJTkcrc2V0fSIgPSB4c2V0IHx8IE1JU1NJTkc9Ilwke1NIRUxMfSAkYW1fYXV4X2Rpci9taXNzaW5nIgorIyBVc2UgZXZhbCB0byBleHBhbmQgJFNIRUxMCitpZiBldmFsICIkTUlTU0lORyAtLXJ1biB0cnVlIjsgdGhlbgorICBhbV9taXNzaW5nX3J1bj0iJE1JU1NJTkcgLS1ydW4gIgorZWxzZQorICBhbV9taXNzaW5nX3J1bj0KKyAgYW1fYmFja3RpY2s9J2AnCisgIEFDX01TR19XQVJOKFske2FtX2JhY2t0aWNrfW1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmddKQorZmkKK10pCisKKyMgQU1fQVVYX0RJUl9FWFBBTkQKKworIyBGb3IgcHJvamVjdHMgdXNpbmcgQUNfQ09ORklHX0FVWF9ESVIoW2Zvb10pLCBBdXRvY29uZiBzZXRzCisjICRhY19hdXhfZGlyIHRvIGAkc3JjZGlyL2ZvbycuICBJbiBvdGhlciBwcm9qZWN0cywgaXQgaXMgc2V0IHRvCisjIGAkc3JjZGlyJywgYCRzcmNkaXIvLi4nLCBvciBgJHNyY2Rpci8uLi8uLicuCisjCisjIE9mIGNvdXJzZSwgQXV0b21ha2UgbXVzdCBob25vciB0aGlzIHZhcmlhYmxlIHdoZW5ldmVyIGl0IGNhbGxzIGEKKyMgdG9vbCBmcm9tIHRoZSBhdXhpbGlhcnkgZGlyZWN0b3J5LiAgVGhlIHByb2JsZW0gaXMgdGhhdCAkc3JjZGlyIChhbmQKKyMgdGhlcmVmb3JlICRhY19hdXhfZGlyIGFzIHdlbGwpIGNhbiBiZSBlaXRoZXIgYWJzb2x1dGUgb3IgcmVsYXRpdmUsCisjIGRlcGVuZGluZyBvbiBob3cgY29uZmlndXJlIGlzIHJ1bi4gIFRoaXMgaXMgcHJldHR5IGFubm95aW5nLCBzaW5jZQorIyBpdCBtYWtlcyAkYWNfYXV4X2RpciBxdWl0ZSB1bnVzYWJsZSBpbiBzdWJkaXJlY3RvcmllczogaW4gdGhlIHRvcAorIyBzb3VyY2UgZGlyZWN0b3J5LCBhbnkgZm9ybSB3aWxsIHdvcmsgZmluZSwgYnV0IGluIHN1YmRpcmVjdG9yaWVzIGEKKyMgcmVsYXRpdmUgcGF0aCBuZWVkcyB0byBiZSBhZGp1c3RlZCBmaXJzdC4KKyMKKyMgJGFjX2F1eF9kaXIvbWlzc2luZworIyAgICBmYWlscyB3aGVuIGNhbGxlZCBmcm9tIGEgc3ViZGlyZWN0b3J5IGlmICRhY19hdXhfZGlyIGlzIHJlbGF0aXZlCisjICR0b3Bfc3JjZGlyLyRhY19hdXhfZGlyL21pc3NpbmcKKyMgICAgZmFpbHMgaWYgJGFjX2F1eF9kaXIgaXMgYWJzb2x1dGUsCisjICAgIGZhaWxzIHdoZW4gY2FsbGVkIGZyb20gYSBzdWJkaXJlY3RvcnkgaW4gYSBWUEFUSCBidWlsZCB3aXRoCisjICAgICAgICAgIGEgcmVsYXRpdmUgJGFjX2F1eF9kaXIKKyMKKyMgVGhlIHJlYXNvbiBvZiB0aGUgbGF0dGVyIGZhaWx1cmUgaXMgdGhhdCAkdG9wX3NyY2RpciBhbmQgJGFjX2F1eF9kaXIKKyMgYXJlIGJvdGggcHJlZml4ZWQgYnkgJHNyY2Rpci4gIEluIGFuIGluLXNvdXJjZSBidWlsZCB0aGlzIGlzIHVzdWFsbHkKKyMgaGFybWxlc3MgYmVjYXVzZSAkc3JjZGlyIGlzIGAuJywgYnV0IHRoaW5ncyB3aWxsIGJyb2tlIHdoZW4geW91CisjIHN0YXJ0IGEgVlBBVEggYnVpbGQgb3IgdXNlIGFuIGFic29sdXRlICRzcmNkaXIuCisjCisjIFNvIHdlIGNvdWxkIHVzZSBzb21ldGhpbmcgc2ltaWxhciB0byAkdG9wX3NyY2Rpci8kYWNfYXV4X2Rpci9taXNzaW5nLAorIyBpZmYgd2Ugc3RyaXAgdGhlIGxlYWRpbmcgJHNyY2RpciBmcm9tICRhY19hdXhfZGlyLiAgVGhhdCB3b3VsZCBiZToKKyMgICBhbV9hdXhfZGlyPSdcJCh0b3Bfc3JjZGlyKS8nYGV4cHIgIiRhY19hdXhfZGlyIiA6ICIkc3JjZGlyLy8qXCguKlwpImAKKyMgYW5kIHRoZW4gd2Ugd291bGQgZGVmaW5lICRNSVNTSU5HIGFzCisjICAgTUlTU0lORz0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL21pc3NpbmciCisjIFRoaXMgd2lsbCB3b3JrIGFzIGxvbmcgYXMgTUlTU0lORyBpcyBub3QgY2FsbGVkIGZyb20gY29uZmlndXJlLCBiZWNhdXNlCisjIHVuZm9ydHVuYXRlbHkgJCh0b3Bfc3JjZGlyKSBoYXMgbm8gbWVhbmluZyBpbiBjb25maWd1cmUuCisjIEhvd2V2ZXIgdGhlcmUgYXJlIG90aGVyIHZhcmlhYmxlcywgbGlrZSBDQywgd2hpY2ggYXJlIG9mdGVuIHVzZWQgaW4KKyMgY29uZmlndXJlLCBhbmQgY291bGQgdGhlcmVmb3JlIG5vdCB1c2UgdGhpcyAiZml4ZWQiICRhY19hdXhfZGlyLgorIworIyBBbm90aGVyIHNvbHV0aW9uLCB1c2VkIGhlcmUsIGlzIHRvIGFsd2F5cyBleHBhbmQgJGFjX2F1eF9kaXIgdG8gYW4KKyMgYWJzb2x1dGUgUEFUSC4gIFRoZSBkcmF3YmFjayBpcyB0aGF0IHVzaW5nIGFic29sdXRlIHBhdGhzIHByZXZlbnQgYQorIyBjb25maWd1cmVkIHRyZWUgdG8gYmUgbW92ZWQgd2l0aG91dCByZWNvbmZpZ3VyYXRpb24uCisKK0FDX0RFRlVOKFtBTV9BVVhfRElSX0VYUEFORF0sIFsKKyMgZXhwYW5kICRhY19hdXhfZGlyIHRvIGFuIGFic29sdXRlIHBhdGgKK2FtX2F1eF9kaXI9YENEUEFUSD06OyBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCitdKQorCisjIEFNX1BST0dfSU5TVEFMTF9TSAorIyAtLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGVmaW5lICRpbnN0YWxsX3NoLgorQUNfREVGVU4oW0FNX1BST0dfSU5TVEFMTF9TSF0sCitbQUNfUkVRVUlSRShbQU1fQVVYX0RJUl9FWFBBTkRdKWRubAoraW5zdGFsbF9zaD0ke2luc3RhbGxfc2gtIiRhbV9hdXhfZGlyL2luc3RhbGwtc2gifQorQUNfU1VCU1QoaW5zdGFsbF9zaCldKQorCisjIE9uZSBpc3N1ZSB3aXRoIHZlbmRvciBgaW5zdGFsbCcgKGV2ZW4gR05VKSBpcyB0aGF0IHlvdSBjYW4ndAorIyBzcGVjaWZ5IHRoZSBwcm9ncmFtIHVzZWQgdG8gc3RyaXAgYmluYXJpZXMuICBUaGlzIGlzIGVzcGVjaWFsbHkKKyMgYW5ub3lpbmcgaW4gY3Jvc3MtY29tcGlsaW5nIGVudmlyb25tZW50cywgd2hlcmUgdGhlIGJ1aWxkJ3Mgc3RyaXAKKyMgaXMgdW5saWtlbHkgdG8gaGFuZGxlIHRoZSBob3N0J3MgYmluYXJpZXMuCisjIEZvcnR1bmF0ZWx5IGluc3RhbGwtc2ggd2lsbCBob25vciBhIFNUUklQUFJPRyB2YXJpYWJsZSwgc28gd2UKKyMgYWx3YXlzIHVzZSBpbnN0YWxsLXNoIGluIGBtYWtlIGluc3RhbGwtc3RyaXAnLCBhbmQgaW5pdGlhbGl6ZQorIyBTVFJJUFBST0cgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIFNUUklQIHZhcmlhYmxlIChzZXQgYnkgdGhlIHVzZXIpLgorQUNfREVGVU4oW0FNX1BST0dfSU5TVEFMTF9TVFJJUF0sCitbQUNfUkVRVUlSRShbQU1fUFJPR19JTlNUQUxMX1NIXSlkbmwKK0lOU1RBTExfU1RSSVBfUFJPR1JBTT0iXCR7U0hFTEx9IFwkKGluc3RhbGxfc2gpIC1jIC1zIgorQUNfU1VCU1QoW0lOU1RBTExfU1RSSVBfUFJPR1JBTV0pXSkKKworIyBzZXJpYWwgNAkJCQkJCS0qLSBBdXRvY29uZiAtKi0KKworCisKKyMgVGhlcmUgYXJlIGEgZmV3IGRpcnR5IGhhY2tzIGJlbG93IHRvIGF2b2lkIGxldHRpbmcgYEFDX1BST0dfQ0MnIGJlCisjIHdyaXR0ZW4gaW4gY2xlYXIsIGluIHdoaWNoIGNhc2UgYXV0b21ha2UsIHdoZW4gcmVhZGluZyBhY2xvY2FsLm00LAorIyB3aWxsIHRoaW5rIGl0IHNlZXMgYSAqdXNlKiwgYW5kIHRoZXJlZm9yZSB3aWxsIHRyaWdnZXIgYWxsIGl0J3MKKyMgQyBzdXBwb3J0IG1hY2hpbmVyeS4gIEFsc28gbm90ZSB0aGF0IGl0IG1lYW5zIHRoYXQgYXV0b3NjYW4sIHNlZWluZworIyBDQyBldGMuIGluIHRoZSBNYWtlZmlsZSwgd2lsbCBhc2sgZm9yIGFuIEFDX1BST0dfQ0MgdXNlLi4uCisKKworCisjIF9BTV9ERVBFTkRFTkNJRVMoTkFNRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNlZSBob3cgdGhlIGNvbXBpbGVyIGltcGxlbWVudHMgZGVwZW5kZW5jeSBjaGVja2luZy4KKyMgTkFNRSBpcyAiQ0MiLCAiQ1hYIiBvciAiT0JKQyIuCisjIFdlIHRyeSBhIGZldyB0ZWNobmlxdWVzIGFuZCB1c2UgdGhhdCB0byBzZXQgYSBzaW5nbGUgY2FjaGUgdmFyaWFibGUuCisjCisjIFdlIGRvbid0IEFDX1JFUVVJUkUgdGhlIGNvcnJlc3BvbmRpbmcgQUNfUFJPR19DQyBzaW5jZSB0aGUgbGF0dGVyIHdhcworIyBtb2RpZmllZCB0byBpbnZva2UgX0FNX0RFUEVOREVOQ0lFUyhDQyk7IHdlIHdvdWxkIGhhdmUgYSBjaXJjdWxhcgorIyBkZXBlbmRlbmN5LCBhbmQgZ2l2ZW4gdGhhdCB0aGUgdXNlciBpcyBub3QgZXhwZWN0ZWQgdG8gcnVuIHRoaXMgbWFjcm8sCisjIGp1c3QgcmVseSBvbiBBQ19QUk9HX0NDLgorQUNfREVGVU4oW19BTV9ERVBFTkRFTkNJRVNdLAorW0FDX1JFUVVJUkUoW0FNX1NFVF9ERVBESVJdKWRubAorQUNfUkVRVUlSRShbQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdKWRubAorQUNfUkVRVUlSRShbQU1fTUFLRV9JTkNMVURFXSlkbmwKK0FDX1JFUVVJUkUoW0FNX0RFUF9UUkFDS10pZG5sCisKK2lmZWxzZShbJDFdLCBDQywgICBbZGVwY2M9IiRDQyIgICBhbV9jb21waWxlcl9saXN0PV0sCisgICAgICAgWyQxXSwgQ1hYLCAgW2RlcGNjPSIkQ1hYIiAgYW1fY29tcGlsZXJfbGlzdD1dLAorICAgICAgIFskMV0sIE9CSkMsIFtkZXBjYz0iJE9CSkMiIGFtX2NvbXBpbGVyX2xpc3Q9J2djYzMgZ2NjJ10KKyAgICAgICBbJDFdLCBHQ0osICBbZGVwY2M9IiRHQ0oiICBhbV9jb21waWxlcl9saXN0PSdnY2MzIGdjYyddLAorICAgICAgICAgICAgICAgICAgIFtkZXBjYz0iJCQxIiAgIGFtX2NvbXBpbGVyX2xpc3Q9XSkKKworQUNfQ0FDSEVfQ0hFQ0soW2RlcGVuZGVuY3kgc3R5bGUgb2YgJGRlcGNjXSwKKyAgICAgICAgICAgICAgIFthbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZV0sCitbaWYgdGVzdCAteiAiJEFNREVQX1RSVUUiICYmIHRlc3QgLWYgIiRhbV9kZXBjb21wIjsgdGhlbgorICAjIFdlIG1ha2UgYSBzdWJkaXIgYW5kIGRvIHRoZSB0ZXN0cyB0aGVyZS4gIE90aGVyd2lzZSB3ZSBjYW4gZW5kIHVwCisgICMgbWFraW5nIGJvZ3VzIGZpbGVzIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCBhbmQgbmV2ZXIgcmVtb3ZlLiAgRm9yCisgICMgaW5zdGFuY2UgaXQgd2FzIHJlcG9ydGVkIHRoYXQgb24gSFAtVVggdGhlIGdjYyB0ZXN0IHdpbGwgZW5kIHVwCisgICMgbWFraW5nIGEgZHVtbXkgZmlsZSBuYW1lZCBgRCcgLS0gYmVjYXVzZSBgLU1EJyBtZWFucyBgcHV0IHRoZSBvdXRwdXQKKyAgIyBpbiBEJy4KKyAgbWtkaXIgY29uZnRlc3QuZGlyCisgICMgQ29weSBkZXBjb21wIHRvIHN1YmRpciBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b24ndCBmaW5kIGl0IGlmIHdlJ3JlCisgICMgdXNpbmcgYSByZWxhdGl2ZSBkaXJlY3RvcnkuCisgIGNwICIkYW1fZGVwY29tcCIgY29uZnRlc3QuZGlyCisgIGNkIGNvbmZ0ZXN0LmRpcgorCisgIGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKKyAgaWYgdGVzdCAiJGFtX2NvbXBpbGVyX2xpc3QiID0gIiI7IHRoZW4KKyAgICAgYW1fY29tcGlsZXJfbGlzdD1gc2VkIC1uIFsncy9eIypcKFthLXpBLVowLTldKlwpKSQvXDEvcCddIDwgLi9kZXBjb21wYAorICBmaQorICBmb3IgZGVwbW9kZSBpbiAkYW1fY29tcGlsZXJfbGlzdDsgZG8KKyAgICAjIFdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlc2UgZmlsZXMgZm9yIGVhY2ggdGVzdCwgYXMgdGhlIGNvbXBpbGVyIG1heQorICAgICMgb3ZlcndyaXRlIHNvbWUgb2YgdGhlbSB3aGVuIHRlc3Rpbmcgd2l0aCBvYnNjdXJlIGNvbW1hbmQgbGluZXMuCisgICAgIyBUaGlzIGhhcHBlbnMgYXQgbGVhc3Qgd2l0aCB0aGUgQUlYIEMgY29tcGlsZXIuCisgICAgZWNobyAnI2luY2x1ZGUgImNvbmZ0ZXN0LmgiJyA+IGNvbmZ0ZXN0LmMKKyAgICBlY2hvICdpbnQgaTsnID4gY29uZnRlc3QuaAorICAgIGVjaG8gIiR7YW1fX2luY2x1ZGV9ICR7YW1fX3F1b3RlfWNvbmZ0ZXN0LlBvJHthbV9fcXVvdGV9IiA+IGNvbmZtZgorCisgICAgY2FzZSAkZGVwbW9kZSBpbgorICAgIG5vc2lkZWVmZmVjdCkKKyAgICAgICMgYWZ0ZXIgdGhpcyB0YWcsIG1lY2hhbmlzbXMgYXJlIG5vdCBieSBzaWRlLWVmZmVjdCwgc28gdGhleSdsbAorICAgICAgIyBvbmx5IGJlIHVzZWQgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZAorICAgICAgaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgPSB4eWVzOyB0aGVuCisJY29udGludWUKKyAgICAgIGVsc2UKKwlicmVhaworICAgICAgZmkKKyAgICAgIDs7CisgICAgbm9uZSkgYnJlYWsgOzsKKyAgICBlc2FjCisgICAgIyBXZSBjaGVjayB3aXRoIGAtYycgYW5kIGAtbycgZm9yIHRoZSBzYWtlIG9mIHRoZSAiZGFzaG1zdGRvdXQiCisgICAgIyBtb2RlLiAgSXQgdHVybnMgb3V0IHRoYXQgdGhlIFN1blBybyBDKysgY29tcGlsZXIgZG9lcyBub3QgcHJvcGVybHkKKyAgICAjIGhhbmRsZSBgLU0gLW8nLCBhbmQgd2UgbmVlZCB0byBkZXRlY3QgdGhpcy4KKyAgICBpZiBkZXBtb2RlPSRkZXBtb2RlIFwKKyAgICAgICBzb3VyY2U9Y29uZnRlc3QuYyBvYmplY3Q9Y29uZnRlc3QubyBcCisgICAgICAgZGVwZmlsZT1jb25mdGVzdC5QbyB0bXBkZXBmaWxlPWNvbmZ0ZXN0LlRQbyBcCisgICAgICAgJFNIRUxMIC4vZGVwY29tcCAkZGVwY2MgLWMgY29uZnRlc3QuYyAtbyBjb25mdGVzdC5vID4vZGV2L251bGwgMj4mMSAmJgorICAgICAgIGdyZXAgY29uZnRlc3QuaCBjb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgJHtNQUtFLW1ha2V9IC1zIC1mIGNvbmZtZiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICBhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT0kZGVwbW9kZQorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisKKyAgY2QgLi4KKyAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgorZWxzZQorICBhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCitmaQorXSkKKyQxREVQTU9ERT0iZGVwbW9kZT0kYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiCitBQ19TVUJTVChbJDFERVBNT0RFXSkKK10pCisKKworIyBBTV9TRVRfREVQRElSCisjIC0tLS0tLS0tLS0tLS0KKyMgQ2hvb3NlIGEgZGlyZWN0b3J5IG5hbWUgZm9yIGRlcGVuZGVuY3kgZmlsZXMuCisjIFRoaXMgbWFjcm8gaXMgQUNfUkVRVUlSRWQgaW4gX0FNX0RFUEVOREVOQ0lFUworQUNfREVGVU4oW0FNX1NFVF9ERVBESVJdLAorW3JtIC1mIC5kZXBzIDI+L2Rldi9udWxsCitta2RpciAuZGVwcyAyPi9kZXYvbnVsbAoraWYgdGVzdCAtZCAuZGVwczsgdGhlbgorICBERVBESVI9LmRlcHMKK2Vsc2UKKyAgIyBNUy1ET1MgZG9lcyBub3QgYWxsb3cgZmlsZW5hbWVzIHRoYXQgYmVnaW4gd2l0aCBhIGRvdC4KKyAgREVQRElSPV9kZXBzCitmaQorcm1kaXIgLmRlcHMgMj4vZGV2L251bGwKK0FDX1NVQlNUKERFUERJUikKK10pCisKKworIyBBTV9ERVBfVFJBQ0sKKyMgLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbQU1fREVQX1RSQUNLXSwKK1tBQ19BUkdfRU5BQkxFKGRlcGVuZGVuY3ktdHJhY2tpbmcsCitbICAtLWRpc2FibGUtZGVwZW5kZW5jeS10cmFja2luZyBTcGVlZHMgdXAgb25lLXRpbWUgYnVpbGRzCisgIC0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgIERvIG5vdCByZWplY3Qgc2xvdyBkZXBlbmRlbmN5IGV4dHJhY3RvcnNdKQoraWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vOyB0aGVuCisgIGFtX2RlcGNvbXA9IiRhY19hdXhfZGlyL2RlcGNvbXAiCisgIEFNREVQQkFDS1NMQVNIPSdcJworZmkKK0FNX0NPTkRJVElPTkFMKFtBTURFUF0sIFt0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm9dKQorcHVzaGRlZihbc3Vic3RdLCBkZWZuKFtBQ19TVUJTVF0pKQorc3Vic3QoQU1ERVBCQUNLU0xBU0gpCitwb3BkZWYoW3N1YnN0XSkKK10pCisKKyMgR2VuZXJhdGUgY29kZSB0byBzZXQgdXAgZGVwZW5kZW5jeSB0cmFja2luZy4KKyMgVGhpcyBtYWNybyBzaG91bGQgb25seSBiZSBpbnZva2VkIG9uY2UgLS0gdXNlIHZpYSBBQ19SRVFVSVJFLgorIyBVc2FnZToKKyMgQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFMKKworIworIyBUaGlzIGNvZGUgaXMgb25seSByZXF1aXJlZCB3aGVuIGF1dG9tYXRpYyBkZXBlbmRlbmN5IHRyYWNraW5nCisjIGlzIGVuYWJsZWQuICBGSVhNRS4gIFRoaXMgY3JlYXRlcyBlYWNoIGAuUCcgZmlsZSB0aGF0IHdlIHdpbGwKKyMgbmVlZCBpbiBvcmRlciB0byBib290c3RyYXAgdGhlIGRlcGVuZGVuY3kgaGFuZGxpbmcgY29kZS4KK0FDX0RFRlVOKFtBTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EU10sWworQUNfT1VUUFVUX0NPTU1BTkRTKFsKK3Rlc3QgeCIkQU1ERVBfVFJVRSIgIT0geCIiIHx8Citmb3IgbWYgaW4gJENPTkZJR19GSUxFUzsgZG8KKyAgY2FzZSAiJG1mIiBpbgorICBNYWtlZmlsZSkgZGlycGFydD0uOzsKKyAgKi9NYWtlZmlsZSkgZGlycGFydD1gZWNobyAiJG1mIiB8IHNlZCAtZSAnc3wvW14vXSokfHwnYDs7CisgICopIGNvbnRpbnVlOzsKKyAgZXNhYworICBncmVwICdeREVQX0ZJTEVTICo9ICpbXiAjXScgPCAiJG1mIiA+IC9kZXYvbnVsbCB8fCBjb250aW51ZQorICAjIEV4dHJhY3QgdGhlIGRlZmluaXRpb24gb2YgREVQX0ZJTEVTIGZyb20gdGhlIE1ha2VmaWxlIHdpdGhvdXQKKyAgIyBydW5uaW5nIGBtYWtlJy4KKyAgREVQRElSPWBzZWQgLW4gLWUgJy9eREVQRElSID0gLyBzLy8vcCcgPCAiJG1mImAKKyAgdGVzdCAteiAiJERFUERJUiIgJiYgY29udGludWUKKyAgIyBXaGVuIHVzaW5nIGFuc2kya25yLCBVIG1heSBiZSBlbXB0eSBvciBhbiB1bmRlcnNjb3JlOyBleHBhbmQgaXQKKyAgVT1gc2VkIC1uIC1lICcvXlUgPSAvIHMvLy9wJyA8ICIkbWYiYAorICB0ZXN0IC1kICIkZGlycGFydC8kREVQRElSIiB8fCBta2RpciAiJGRpcnBhcnQvJERFUERJUiIKKyAgIyBXZSBpbnZva2Ugc2VkIHR3aWNlIGJlY2F1c2UgaXQgaXMgdGhlIHNpbXBsZXN0IGFwcHJvYWNoIHRvCisgICMgY2hhbmdpbmcgJChERVBESVIpIHRvIGl0cyBhY3R1YWwgdmFsdWUgaW4gdGhlIGV4cGFuc2lvbi4KKyAgZm9yIGZpbGUgaW4gYHNlZCAtbiAtZSAnCisgICAgL15ERVBfRklMRVMgPSAuKlxcXFwkLyB7CisgICAgICBzL15ERVBfRklMRVMgPSAvLworICAgICAgOmxvb3AKKwlzL1xcXFwkLy8KKwlwCisJbgorCS9cXFxcJC8gYiBsb29wCisgICAgICBwCisgICAgfQorICAgIC9eREVQX0ZJTEVTID0gLyBzL15ERVBfRklMRVMgPSAvL3AnIDwgIiRtZiIgfCBcCisgICAgICAgc2VkIC1lICdzL1wkKERFUERJUikvJyIkREVQRElSIicvZycgLWUgJ3MvXCRVLyciJFUiJy9nJ2A7IGRvCisgICAgIyBNYWtlIHN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHMuCisgICAgdGVzdCAtZiAiJGRpcnBhcnQvJGZpbGUiICYmIGNvbnRpbnVlCisgICAgZmRpcj1gZWNobyAiJGZpbGUiIHwgc2VkIC1lICdzfC9bXi9dKiR8fCdgCisgICAgJGFjX2F1eF9kaXIvbWtpbnN0YWxsZGlycyAiJGRpcnBhcnQvJGZkaXIiID4gL2Rldi9udWxsIDI+JjEKKyAgICAjIGVjaG8gImNyZWF0aW5nICRkaXJwYXJ0LyRmaWxlIgorICAgIGVjaG8gJyMgZHVtbXknID4gIiRkaXJwYXJ0LyRmaWxlIgorICBkb25lCitkb25lCitdLCBbQU1ERVBfVFJVRT0iJEFNREVQX1RSVUUiCithY19hdXhfZGlyPSIkYWNfYXV4X2RpciJdKV0pCisKKyMgQU1fTUFLRV9JTkNMVURFKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgdG8gc2VlIGhvdyBtYWtlIHRyZWF0cyBpbmNsdWRlcy4KK0FDX0RFRlVOKFtBTV9NQUtFX0lOQ0xVREVdLAorW2FtX21ha2U9JHtNQUtFLW1ha2V9CitjYXQgPiBjb25maW5jIDw8ICdFTkQnCitkb2l0OgorCUBlY2hvIGRvbmUKK0VORAorIyBJZiB3ZSBkb24ndCBmaW5kIGFuIGluY2x1ZGUgZGlyZWN0aXZlLCBqdXN0IGNvbW1lbnQgb3V0IHRoZSBjb2RlLgorQUNfTVNHX0NIRUNLSU5HKFtmb3Igc3R5bGUgb2YgaW5jbHVkZSB1c2VkIGJ5ICRhbV9tYWtlXSkKK2FtX19pbmNsdWRlPScjJworYW1fX3F1b3RlPQorX2FtX3Jlc3VsdD1ub25lCisjIEZpcnN0IHRyeSBHTlUgbWFrZSBzdHlsZSBpbmNsdWRlLgorZWNobyAiaW5jbHVkZSBjb25maW5jIiA+IGNvbmZtZgorIyBXZSBncmVwIG91dCBgRW50ZXJpbmcgZGlyZWN0b3J5JyBhbmQgYExlYXZpbmcgZGlyZWN0b3J5JworIyBtZXNzYWdlcyB3aGljaCBjYW4gb2NjdXIgaWYgYHcnIGVuZHMgdXAgaW4gTUFLRUZMQUdTLgorIyBJbiBwYXJ0aWN1bGFyIHdlIGRvbid0IGxvb2sgYXQgYF5tYWtlOicgYmVjYXVzZSBHTlUgbWFrZSBtaWdodAorIyBiZSBpbnZva2VkIHVuZGVyIHNvbWUgb3RoZXIgbmFtZSAodXN1YWxseSAiZ21ha2UiKSwgaW4gd2hpY2gKKyMgY2FzZSBpdCBwcmludHMgaXRzIG5ldyBuYW1lIGluc3RlYWQgb2YgYG1ha2UnLgoraWYgdGVzdCAiYCRhbV9tYWtlIC1zIC1mIGNvbmZtZiAyPiAvZGV2L251bGwgfCBmZ3JlcCAtdiAnaW5nIGRpcmVjdG9yeSdgIiA9ICJkb25lIjsgdGhlbgorICAgYW1fX2luY2x1ZGU9aW5jbHVkZQorICAgYW1fX3F1b3RlPQorICAgX2FtX3Jlc3VsdD1HTlUKK2ZpCisjIE5vdyB0cnkgQlNEIG1ha2Ugc3R5bGUgaW5jbHVkZS4KK2lmIHRlc3QgIiRhbV9faW5jbHVkZSIgPSAiIyI7IHRoZW4KKyAgIGVjaG8gJy5pbmNsdWRlICJjb25maW5jIicgPiBjb25mbWYKKyAgIGlmIHRlc3QgImAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCIgPSAiZG9uZSI7IHRoZW4KKyAgICAgIGFtX19pbmNsdWRlPS5pbmNsdWRlCisgICAgICBhbV9fcXVvdGU9JyInCisgICAgICBfYW1fcmVzdWx0PUJTRAorICAgZmkKK2ZpCitBQ19TVUJTVChhbV9faW5jbHVkZSkKK0FDX1NVQlNUKGFtX19xdW90ZSkKK0FDX01TR19SRVNVTFQoJF9hbV9yZXN1bHQpCitybSAtZiBjb25maW5jIGNvbmZtZgorXSkKKworIyBzZXJpYWwgMworCisjIEFNX0NPTkRJVElPTkFMKE5BTUUsIFNIRUxMLUNPTkRJVElPTikKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBEZWZpbmUgYSBjb25kaXRpb25hbC4KKyMKKyMgRklYTUU6IE9uY2UgdXNpbmcgMi41MCwgdXNlIHRoaXM6CisjIG00X21hdGNoKFskMV0sIFteVFJVRVx8RkFMU0UkXSwgW0FDX0ZBVEFMKFskMDogaW52YWxpZCBjb25kaXRpb246ICQxXSldKWRubAorQUNfREVGVU4oW0FNX0NPTkRJVElPTkFMXSwKK1tpZmVsc2UoWyQxXSwgW1RSVUVdLAorICAgICAgICBbZXJycHJpbnQoX19maWxlX186X19saW5lX186IFskMDogaW52YWxpZCBjb25kaXRpb246ICQxCitdKWRubAorbTRleGl0KDEpXSlkbmwKK2lmZWxzZShbJDFdLCBbRkFMU0VdLAorICAgICAgIFtlcnJwcmludChfX2ZpbGVfXzpfX2xpbmVfXzogWyQwOiBpbnZhbGlkIGNvbmRpdGlvbjogJDEKK10pZG5sCittNGV4aXQoMSldKWRubAorQUNfU1VCU1QoWyQxX1RSVUVdKQorQUNfU1VCU1QoWyQxX0ZBTFNFXSkKK2lmICQyOyB0aGVuCisgICQxX1RSVUU9CisgICQxX0ZBTFNFPScjJworZWxzZQorICAkMV9UUlVFPScjJworICAkMV9GQUxTRT0KK2ZpXSkKKworIyBMaWtlIEFDX0NPTkZJR19IRUFERVIsIGJ1dCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBzdGFtcCBmaWxlLgorCisjIHNlcmlhbCAzCisKKyMgV2hlbiBjb25maWcuc3RhdHVzIGdlbmVyYXRlcyBhIGhlYWRlciwgd2UgbXVzdCB1cGRhdGUgdGhlIHN0YW1wLWggZmlsZS4KKyMgVGhpcyBmaWxlIHJlc2lkZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBjb25maWcgaGVhZGVyCisjIHRoYXQgaXMgZ2VuZXJhdGVkLiAgV2UgbXVzdCBzdHJpcCBldmVyeXRoaW5nIHBhc3QgdGhlIGZpcnN0ICI6IiwKKyMgYW5kIGV2ZXJ5dGhpbmcgcGFzdCB0aGUgbGFzdCAiLyIuCisKK0FDX1BSRVJFUShbMi4xMl0pCisKK0FDX0RFRlVOKFtBTV9DT05GSUdfSEVBREVSXSwKK1tpZmRlZihbQUNfRk9SRUFDSF0sZG5sCisJIFtkbmwgaW5pdCBvdXIgZmlsZSBjb3VudCBpZiBpdCBpc24ndCBhbHJlYWR5CisJIG00X2lmbmRlZihbX0FNX0NvbmZpZ19IZWFkZXJfSW5kZXhdLCBtNF9kZWZpbmUoW19BTV9Db25maWdfSGVhZGVyX0luZGV4XSwgWzBdKSkKKwkgZG5sIHByZXBhcmUgdG8gc3RvcmUgb3VyIGRlc3RpbmF0aW9uIGZpbGUgbGlzdCBmb3IgdXNlIGluIGNvbmZpZy5zdGF0dXMKKwkgQUNfRk9SRUFDSChbX0FNX0ZpbGVdLCBbJDFdLAorCQkgICAgW200X3B1c2hkZWYoW19BTV9EZXN0XSwgbTRfcGF0c3Vic3QoX0FNX0ZpbGUsIFs6LipdKSkKKwkJICAgIG00X2RlZmluZShbX0FNX0NvbmZpZ19IZWFkZXJfSW5kZXhdLCBtNF9pbmNyKF9BTV9Db25maWdfSGVhZGVyX0luZGV4KSkKKwkJICAgIGRubCBhbmQgYWRkIGl0IHRvIHRoZSBsaXN0IG9mIGZpbGVzIEFDIGtlZXBzIHRyYWNrIG9mLCBhbG9uZworCQkgICAgZG5sIHdpdGggb3VyIGhvb2sKKwkJICAgIEFDX0NPTkZJR19IRUFERVJTKF9BTV9GaWxlLAorZG5sIENPTU1BTkRTLCBbLCBJTklULUNNRFNdCitbIyB1cGRhdGUgdGhlIHRpbWVzdGFtcAorZWNobyB0aW1lc3RhbXAgPiJBU19FU0NBUEUoX0FNX0RJUk5BTUUoXV9BTV9EZXN0WykpL3N0YW1wLWhdX0FNX0NvbmZpZ19IZWFkZXJfSW5kZXhbIgorXVskMl1tNF9pZnZhbChbJDNdLCBbLCBbJDNdXSkpZG5sIEFDX0NPTkZJR19IRUFERVJTCisJCSAgICBtNF9wb3BkZWYoW19BTV9EZXN0XSldKV0sZG5sCitbQUNfQ09ORklHX0hFQURFUihbJDFdKQorICBBQ19PVVRQVVRfQ09NTUFORFMoCisgICBpZmVsc2UocGF0c3Vic3QoWyQxXSwgW1teIF1dLCBbXSksCisJICBbXSwKKwkgIFt0ZXN0IC16ICIkQ09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID5kbmwKKwkgICBwYXRzdWJzdChbJDFdLCBbXlwoW146XSovXCk/LipdLCBbXDFdKXN0YW1wLWhdKSxkbmwKK1thbV9pbmR4PTEKK2ZvciBhbV9maWxlIGluICQxOyBkbworICBjYXNlICIgXCRDT05GSUdfSEVBREVSUyAiIGluCisgICoiIFwkYW1fZmlsZSAiKikKKyAgICBhbV9kaXI9XGBlY2hvIFwkYW1fZmlsZSB8c2VkICdzJTouKiUlO3MlW14vXSpcJCUlJ1xgCisgICAgaWYgdGVzdCAtbiAiXCRhbV9kaXIiOyB0aGVuCisgICAgICBhbV90bXBkaXI9XGBlY2hvIFwkYW1fZGlyIHxzZWQgJ3MlXlwoLypcKS4qXCQlXDElJ1xgCisgICAgICBmb3IgYW1fc3ViZGlyIGluIFxgZWNobyBcJGFtX2RpciB8c2VkICdzJS8lICUnXGA7IGRvCisgICAgICAgIGFtX3RtcGRpcj1cJGFtX3RtcGRpclwkYW1fc3ViZGlyLworICAgICAgICBpZiB0ZXN0ICEgLWQgXCRhbV90bXBkaXI7IHRoZW4KKyAgICAgICAgICBta2RpciBcJGFtX3RtcGRpcgorICAgICAgICBmaQorICAgICAgZG9uZQorICAgIGZpCisgICAgZWNobyB0aW1lc3RhbXAgPiAiXCRhbV9kaXIic3RhbXAtaFwkYW1faW5keAorICAgIDs7CisgIGVzYWMKKyAgYW1faW5keD1cYGV4cHIgXCRhbV9pbmR4ICsgMVxgCitkb25lXSkKK10pXSkgIyBBTV9DT05GSUdfSEVBREVSCisKKyMgX0FNX0RJUk5BTUUoUEFUSCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgTGlrZSBBU19ESVJOQU1FLCBvbmx5IGRvIGl0IGR1cmluZyBtYWNybyBleHBhbnNpb24KK0FDX0RFRlVOKFtfQU1fRElSTkFNRV0sCisgICAgICAgW200X2lmKG00X3JlZ2V4cChbJDFdLCBbXi4qW14vXS8vKlteL11bXi9dKi8qJF0pLCAtMSwKKwkgICAgICBtNF9pZihtNF9yZWdleHAoWyQxXSwgW14vL1woW14vXVx8JFwpXSksIC0xLAorCQkgICAgbTRfaWYobTRfcmVnZXhwKFskMV0sIFteLy4qXSksIC0xLAorCQkJICBbLl0sCisJCQkgIG00X3BhdHN1YnN0KFskMV0sIFteXCgvXCkuKl0sIFtcMV0pKSwKKwkJICAgIG00X3BhdHN1YnN0KFskMV0sIFteXCgvL1wpXChbXi9dLipcfCRcKV0sIFtcMV0pKSwKKwkgICAgICBtNF9wYXRzdWJzdChbJDFdLCBbXlwoLipbXi9dXCkvLypbXi9dW14vXSovKiRdLCBbXDFdKSlbXWRubAorXSkgIyBfQU1fRElSTkFNRQorCisjIGxpYnRvb2wubTQgLSBDb25maWd1cmUgbGlidG9vbCBmb3IgdGhlIGhvc3Qgc3lzdGVtLiAtKi1TaGVsbC1zY3JpcHQtKi0KKworIyBzZXJpYWwgNDYgQUNfUFJPR19MSUJUT09MCisKK0FDX0RFRlVOKFtBQ19QUk9HX0xJQlRPT0xdLAorW0FDX1JFUVVJUkUoW0FDX0xJQlRPT0xfU0VUVVBdKWRubAorCisjIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCitMSUJUT09MX0RFUFM9IiRhY19hdXhfZGlyL2x0bWFpbi5zaCIKKworIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KK0xJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJworQUNfU1VCU1QoTElCVE9PTClkbmwKKworIyBQcmV2ZW50IG11bHRpcGxlIGV4cGFuc2lvbgorZGVmaW5lKFtBQ19QUk9HX0xJQlRPT0xdLCBbXSkKK10pCisKK0FDX0RFRlVOKFtBQ19MSUJUT09MX1NFVFVQXSwKK1tBQ19QUkVSRVEoMi4xMylkbmwKK0FDX1JFUVVJUkUoW0FDX0VOQUJMRV9TSEFSRURdKWRubAorQUNfUkVRVUlSRShbQUNfRU5BQkxFX1NUQVRJQ10pZG5sCitBQ19SRVFVSVJFKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfTERdKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19MRF9SRUxPQURfRkxBR10pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfTE5fU10pZG5sCitBQ19SRVFVSVJFKFtBQ19ERVBMSUJTX0NIRUNLX01FVEhPRF0pZG5sCitBQ19SRVFVSVJFKFtBQ19PQkpFWFRdKWRubAorQUNfUkVRVUlSRShbQUNfRVhFRVhUXSlkbmwKK2RubAorCitfTFRfQUNfUFJPR19FQ0hPX0JBQ0tTTEFTSAorIyBPbmx5IHBlcmZvcm0gdGhlIGNoZWNrIGZvciBmaWxlLCBpZiB0aGUgY2hlY2sgbWV0aG9kIHJlcXVpcmVzIGl0CitjYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorZmlsZV9tYWdpYyopCisgIGlmIHRlc3QgIiRmaWxlX21hZ2ljX2NtZCIgPSAnJE1BR0lDX0NNRCc7IHRoZW4KKyAgICBBQ19QQVRIX01BR0lDCisgIGZpCisgIDs7Citlc2FjCisKK0FDX0NIRUNLX1RPT0woUkFOTElCLCByYW5saWIsIDopCitBQ19DSEVDS19UT09MKFNUUklQLCBzdHJpcCwgOikKKworaWZkZWYoW0FDX1BST1ZJREVfQUNfTElCVE9PTF9ETE9QRU5dLCBlbmFibGVfZGxvcGVuPXllcywgZW5hYmxlX2Rsb3Blbj1ubykKK2lmZGVmKFtBQ19QUk9WSURFX0FDX0xJQlRPT0xfV0lOMzJfRExMXSwKK2VuYWJsZV93aW4zMl9kbGw9eWVzLCBlbmFibGVfd2luMzJfZGxsPW5vKQorCitBQ19BUkdfRU5BQkxFKGxpYnRvb2wtbG9jaywKKyAgWyAgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayAgYXZvaWQgbG9ja2luZyAobWlnaHQgYnJlYWsgcGFyYWxsZWwgYnVpbGRzKV0pCit0ZXN0ICJ4JGVuYWJsZV9saWJ0b29sX2xvY2siICE9IHhubyAmJiBlbmFibGVfbGlidG9vbF9sb2NrPXllcworCisjIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKKyMgbGlidG9vbCBzdXBwb3J0LgorY2FzZSAkaG9zdCBpbgorKi0qLWlyaXg2KikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICdbI11saW5lIF9fb2xpbmVfXyAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCisgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgorICAgICozMi1iaXQqKQorICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKKyAgICAgIDs7CisgICAgKk4zMiopCisgICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKKyAgICAgIDs7CisgICAgKjY0LWJpdCopCisgICAgICBMRD0iJHtMRC1sZH0gLTY0IgorICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgOzsKKworKi0qLXNjbzMuMnY1KikKKyAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgorICBTQVZFX0NGTEFHUz0iJENGTEFHUyIKKyAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgorICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZl0sIGx0X2N2X2NjX25lZWRzX2JlbGYsCisgICAgW0FDX0xBTkdfU0FWRQorICAgICBBQ19MQU5HX0MKKyAgICAgQUNfVFJZX0xJTksoW10sW10sW2x0X2N2X2NjX25lZWRzX2JlbGY9eWVzXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj1ub10pCisgICAgIEFDX0xBTkdfUkVTVE9SRV0pCisgIGlmIHRlc3QgeCIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgIT0geCJ5ZXMiOyB0aGVuCisgICAgIyB0aGlzIGlzIHByb2JhYmx5IGdjYyAyLjguMCwgZWdjcyAxLjAgb3IgbmV3ZXI7IG5vIG5lZWQgZm9yIC1iZWxmCisgICAgQ0ZMQUdTPSIkU0FWRV9DRkxBR1MiCisgIGZpCisgIDs7CisKK2lmZGVmKFtBQ19QUk9WSURFX0FDX0xJQlRPT0xfV0lOMzJfRExMXSwKK1sqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiopCisgIEFDX0NIRUNLX1RPT0woRExMVE9PTCwgZGxsdG9vbCwgZmFsc2UpCisgIEFDX0NIRUNLX1RPT0woQVMsIGFzLCBmYWxzZSkKKyAgQUNfQ0hFQ0tfVE9PTChPQkpEVU1QLCBvYmpkdW1wLCBmYWxzZSkKKworICAjIHJlY2VudCBjeWd3aW4gYW5kIG1pbmd3IHN5c3RlbXMgc3VwcGx5IGEgc3R1YiBEbGxNYWluIHdoaWNoIHRoZSB1c2VyCisgICMgY2FuIG92ZXJyaWRlLCBidXQgb24gb2xkZXIgc3lzdGVtcyB3ZSBoYXZlIHRvIHN1cHBseSBvbmUKKyAgQUNfQ0FDSEVfQ0hFQ0soW2lmIGxpYnRvb2wgc2hvdWxkIHN1cHBseSBEbGxNYWluIGZ1bmN0aW9uXSwgbHRfY3ZfbmVlZF9kbGxtYWluLAorICAgIFtBQ19UUllfTElOSyhbXSwKKyAgICAgIFtleHRlcm4gaW50IF9fYXR0cmlidXRlX18oKF9fc3RkY2FsbF9fKSkgRGxsTWFpbih2b2lkKiwgaW50LCB2b2lkKik7CisgICAgICBEbGxNYWluICgwLCAwLCAwKTtdLAorICAgICAgW2x0X2N2X25lZWRfZGxsbWFpbj1ub10sW2x0X2N2X25lZWRfZGxsbWFpbj15ZXNdKV0pCisKKyAgY2FzZSAkaG9zdC8kQ0MgaW4KKyAgKi0qLWN5Z3dpbiovZ2NjKi1tbm8tY3lnd2luKnwqLSotbWluZ3cqKQorICAgICMgb2xkIG1pbmd3IHN5c3RlbXMgcmVxdWlyZSAiLWRsbCIgdG8gbGluayBhIERMTCwgd2hpbGUgbW9yZSByZWNlbnQgb25lcworICAgICMgcmVxdWlyZSAiLW1kbGwiCisgICAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCisgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1tZGxsIgorICAgIEFDX0NBQ0hFX0NIRUNLKFtob3cgdG8gbGluayBETExzXSwgbHRfY3ZfY2NfZGxsX3N3aXRjaCwKKyAgICAgIFtBQ19UUllfTElOSyhbXSwgW10sIFtsdF9jdl9jY19kbGxfc3dpdGNoPS1tZGxsXSxbbHRfY3ZfY2NfZGxsX3N3aXRjaD0tZGxsXSldKQorICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIiA7OworICAqLSotY3lnd2luKiB8ICotKi1wdzMyKikKKyAgICAjIGN5Z3dpbiBzeXN0ZW1zIG5lZWQgdG8gcGFzcyAtLWRsbCB0byB0aGUgbGlua2VyLCBhbmQgbm90IGxpbmsKKyAgICAjIGNydC5vIHdoaWNoIHdpbGwgcmVxdWlyZSBhIFdpbk1haW5AMTYgZGVmaW5pdGlvbi4KKyAgICBsdF9jdl9jY19kbGxfc3dpdGNoPSItV2wsLS1kbGwgLW5vc3RhcnRmaWxlcyIgOzsKKyAgZXNhYworICA7OworICBdKQorZXNhYworCitfTFRfQUNfTFRDT05GSUdfSEFDSworCitdKQorCisjIEFDX0xJQlRPT0xfSEVBREVSX0FTU0VSVAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtBQ19MSUJUT09MX0hFQURFUl9BU1NFUlRdLAorW0FDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyICRDQyBzdXBwb3J0cyBhc3NlcnQgd2l0aG91dCBiYWNrbGlua2luZ10sCisgICAgW2x0X2N2X2Z1bmNfYXNzZXJ0X3dvcmtzXSwKKyAgICBbY2FzZSAkaG9zdCBpbgorICAgICotKi1zb2xhcmlzKikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzOyB0aGVuCisgICAgICAgIGNhc2UgYCRDQyAtLXZlcnNpb24gMj4vZGV2L251bGxgIGluCisgICAgICAgIFtbMTJdXS4qKSBsdF9jdl9mdW5jX2Fzc2VydF93b3Jrcz1ubyA7OworICAgICAgICAqKSAgICAgICAgbHRfY3ZfZnVuY19hc3NlcnRfd29ya3M9eWVzIDs7CisgICAgICAgIGVzYWMKKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWNdKQorCitpZiB0ZXN0ICJ4JGx0X2N2X2Z1bmNfYXNzZXJ0X3dvcmtzIiA9IHh5ZXM7IHRoZW4KKyAgQUNfQ0hFQ0tfSEVBREVSUyhhc3NlcnQuaCkKK2ZpCitdKSMgQUNfTElCVE9PTF9IRUFERVJfQVNTRVJUCisKKyMgX0xUX0FDX0NIRUNLX0RMRkNOCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbX0xUX0FDX0NIRUNLX0RMRkNOXSwKK1tBQ19DSEVDS19IRUFERVJTKGRsZmNuLmgpCitdKSMgX0xUX0FDX0NIRUNLX0RMRkNOCisKKyMgQUNfTElCVE9PTF9TWVNfR0xPQkFMX1NZTUJPTF9QSVBFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX0dMT0JBTF9TWU1CT0xfUElQRV0sCitbQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKQorQUNfUkVRVUlSRShbQUNfUFJPR19OTV0pCitBQ19SRVFVSVJFKFtBQ19PQkpFWFRdKQorIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KK0FDX01TR19DSEVDS0lORyhbY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0XSkKK0FDX0NBQ0hFX1ZBTChbbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZV0sIFtkbmwKKworIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCisjIFtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspXQorCisjIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCitzeW1jb2RlPSdbW0JDREVHUlNUXV0nCisKKyMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgorc3ltcGF0PSdcKFtbX0EtWmEtel1dW1tfQS1aYS16MC05XV0qXCknCisKKyMgVHJhbnNmb3JtIHRoZSBhYm92ZSBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KK3N5bXhmcm09J1wxIFwyXDMgXDMnCisKKyMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KK2x0X2N2X2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKKworIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gc3ltYm9sIG5hbWUgYW5kIHN5bWJvbCBhZGRyZXNzCitsdF9jdl9nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSJzZWQgLW4gLWUgJ3MvXjogXChbW14gXV0qXCkgJC8gIHtcXFwiXDFcXFwiLCAobHRfcHRyKSAwfSwvcCcgLWUgJ3MvXiRzeW1jb2RlIFwoW1teIF1dKlwpIFwoW1teIF1dKlwpJC8gIHtcIlwyXCIsIChsdF9wdHIpIFwmXDJ9LC9wJyIKKworIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeCopCisgIHN5bWNvZGU9J1tbQkNEVF1dJworICA7OworY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorICBzeW1jb2RlPSdbW0FCQ0RHSVNUV11dJworICA7OworaHB1eCopICMgSXRzIGxpbmtlciBkaXN0aW5ndWlzaGVzIGRhdGEgZnJvbSBjb2RlIHN5bWJvbHMKKyAgbHRfY3ZfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDEoKTsvcCcgLWUgJ3MvXiRzeW1jb2RlKiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKKyAgbHRfY3ZfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0ic2VkIC1uIC1lICdzL146IFwoW1teIF1dKlwpICQvICB7XFxcIlwxXFxcIiwgKGx0X3B0cikgMH0sL3AnIC1lICdzL14kc3ltY29kZSogXChbW14gXV0qXCkgXChbW14gXV0qXCkkLyAge1wiXDJcIiwgKGx0X3B0cikgXCZcMn0sL3AnIgorICA7OworaXJpeCopCisgIHN5bWNvZGU9J1tbQkNERUdSU1RdXScKKyAgOzsKK3NvbGFyaXMqIHwgc3lzdjUqKQorICBzeW1jb2RlPSdbW0JEVF1dJworICA7Oworc3lzdjQpCisgIHN5bWNvZGU9J1tbREZOU1RVXV0nCisgIDs7Citlc2FjCisKKyMgSGFuZGxlIENSTEYgaW4gbWluZ3cgdG9vbCBjaGFpbgorb3B0X2NyPQorY2FzZSAkaG9zdF9vcyBpbgorbWluZ3cqKQorICBvcHRfY3I9YGVjaG8gJ3hcezAsMVx9JyB8IHRyIHggJ1wwMTUnYCAjIG9wdGlvbiBjciBpbiByZWdleHAKKyAgOzsKK2VzYWMKKworIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCitpZiAkTk0gLVYgMj4mMSB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KKyAgc3ltY29kZT0nW1tBQkNER0lTVFddXScKK2ZpCisKKyMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCitmb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCisKKyAgIyBXcml0ZSB0aGUgcmF3IGFuZCBDIGlkZW50aWZpZXJzLgorbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKltbIAldXVwoJHN5bWNvZGUkc3ltY29kZSpcKVtbIAldXVtbIAldXSpcKCRhY19zeW1wcmZ4XCkkc3ltcGF0JG9wdF9jciQvJHN5bXhmcm0vcCciCisKKyAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCisgIHBpcGVfd29ya3M9bm8KKyAgcm0gLWYgY29uZnRlc3QqCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK2NoYXIgbm1fdGVzdF92YXI7Cit2b2lkIG5tX3Rlc3RfZnVuYygpe30KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCitpbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmMoKTtyZXR1cm4oMCk7fQorRU9GCisKKyAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KKyAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KKyAgICBubGlzdD1jb25mdGVzdC5ubQorICAgIGlmIEFDX1RSWV9FVkFMKE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJG5saXN0KSAmJiB0ZXN0IC1zICIkbmxpc3QiOyB0aGVuCisgICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgorICAgICAgaWYgc29ydCAiJG5saXN0IiB8IHVuaXEgPiAiJG5saXN0IlQ7IHRoZW4KKwltdiAtZiAiJG5saXN0IlQgIiRubGlzdCIKKyAgICAgIGVsc2UKKwlybSAtZiAiJG5saXN0IlQKKyAgICAgIGZpCisKKyAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KKyAgICAgIGlmIGVncmVwICcgbm1fdGVzdF92YXIkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCisJaWYgZWdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCisJICBjYXQgPDxFT0YgPiBjb25mdGVzdC4kYWNfZXh0CisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK0VPRgorCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgorCSAgZXZhbCAiJGx0X2N2X2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkbmxpc3QiID4+IGNvbmZ0ZXN0LiRhY19leHQnCisKKwkgIGNhdCA8PEVPRiA+PiBjb25mdGVzdC4kYWNfZXh0CisjaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCisjIGRlZmluZSBsdF9wdHIgdm9pZCAqCisjZWxzZQorIyBkZWZpbmUgbHRfcHRyIGNoYXIgKgorIyBkZWZpbmUgY29uc3QKKyNlbmRpZgorCisvKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KK2NvbnN0IHN0cnVjdCB7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGx0X3B0ciBhZGRyZXNzOworfQorbHRfcHJlbG9hZGVkX3N5bWJvbHNbW11dID0KK3sKK0VPRgorCSAgc2VkICJzL14kc3ltY29kZSRzeW1jb2RlKiBcKC4qXCkgXCguKlwpJC8gIHtcIlwyXCIsIChsdF9wdHIpIFwmXDJ9LC8iIDwgIiRubGlzdCIgPj4gY29uZnRlc3QuJGFjX2V4dAorCSAgY2F0IDw8XEVPRiA+PiBjb25mdGVzdC4kYWNfZXh0CisgIHswLCAobHRfcHRyKSAwfQorfTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKK0VPRgorCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KKwkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRzdG0uJGFjX29iamV4dAorCSAgc2F2ZV9MSUJTPSIkTElCUyIKKwkgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorCSAgTElCUz0iY29uZnRzdG0uJGFjX29iamV4dCIKKwkgIENGTEFHUz0iJENGTEFHUyRub19idWlsdGluX2ZsYWciCisJICBpZiBBQ19UUllfRVZBTChhY19saW5rKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCisJICAgIHBpcGVfd29ya3M9eWVzCisJICBmaQorCSAgTElCUz0iJHNhdmVfTElCUyIKKwkgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorCWVsc2UKKwkgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkbmxpc3QiID4mQUNfRkRfQ0MKKwlmaQorICAgICAgZWxzZQorCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRubGlzdCIgPiZBQ19GRF9DQworICAgICAgZmkKKyAgICBlbHNlCisgICAgICBlY2hvICJjYW5ub3QgcnVuICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JkFDX0ZEX0NDCisgICAgZmkKKyAgZWxzZQorICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiZBQ19GRF9DQworICAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBmaQorICBybSAtZiBjb25mdGVzdCogY29uZnRzdCoKKworICAjIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCisgIGlmIHRlc3QgIiRwaXBlX3dvcmtzIiA9IHllczsgdGhlbgorICAgIGJyZWFrCisgIGVsc2UKKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQorICBmaQorZG9uZQorXSkKK2dsb2JhbF9zeW1ib2xfcGlwZT0iJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiCitpZiB0ZXN0IC16ICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KKyAgZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0KKyAgZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0KK2Vsc2UKKyAgZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0iJGx0X2N2X2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiCisgIGdsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9IiRsdF9jdl9nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzIgorZmkKK2lmIHRlc3QgLXogIiRnbG9iYWxfc3ltYm9sX3BpcGUkZ2xvYmFsX3N5bWJvbF90b19jZGVjJGdsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MiOwordGhlbgorICBBQ19NU0dfUkVTVUxUKGZhaWxlZCkKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChvaykKK2ZpCitdKSAjIEFDX0xJQlRPT0xfU1lTX0dMT0JBTF9TWU1CT0xfUElQRQorCisjIF9MVF9BQ19MSUJUT09MX1NZU19QQVRIX1NFUEFSQVRPUgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtfTFRfQUNfTElCVE9PTF9TWVNfUEFUSF9TRVBBUkFUT1JdLAorWyMgRmluZCB0aGUgY29ycmVjdCBQQVRIIHNlcGFyYXRvci4gIFVzdWFsbHkgdGhpcyBpcyBgOicsIGJ1dAorIyBESkdQUCB1c2VzIGA7JyBsaWtlIERPUy4KK2lmIHRlc3QgIlgke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IFhzZXQ7IHRoZW4KKyAgVU5BTUU9JHtVTkFNRS1gdW5hbWUgMj4vZGV2L251bGxgfQorICBjYXNlIFgkVU5BTUUgaW4KKyAgICAqLURPUykgbHRfY3Zfc3lzX3BhdGhfc2VwYXJhdG9yPSc7JyA7OworICAgICopICAgICBsdF9jdl9zeXNfcGF0aF9zZXBhcmF0b3I9JzonIDs7CisgIGVzYWMKKyAgUEFUSF9TRVBBUkFUT1I9JGx0X2N2X3N5c19wYXRoX3NlcGFyYXRvcgorZmkKK10pIyBfTFRfQUNfTElCVE9PTF9TWVNfUEFUSF9TRVBBUkFUT1IKKworIyBfTFRfQUNfUFJPR19FQ0hPX0JBQ0tTTEFTSAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBZGQgc29tZSBjb2RlIHRvIHRoZSBzdGFydCBvZiB0aGUgZ2VuZXJhdGVkIGNvbmZpZ3VyZSBzY3JpcHQgd2hpY2gKKyMgd2lsbCBmaW5kIGFuIGVjaG8gY29tbWFuZCB3aGljaCBkb2Vzbid0IGludGVycHJldCBiYWNrc2xhc2hlcy4KK0FDX0RFRlVOKFtfTFRfQUNfUFJPR19FQ0hPX0JBQ0tTTEFTSF0sCitbaWZkZWYoW0FDX0RJVkVSU0lPTl9OT1RJQ0VdLCBbQUNfRElWRVJUX1BVU0goQUNfRElWRVJTSU9OX05PVElDRSldLAorCQkJICAgICAgW0FDX0RJVkVSVF9QVVNIKE5PVElDRSldKQorX0xUX0FDX0xJQlRPT0xfU1lTX1BBVEhfU0VQQVJBVE9SCisKKyMgQ2hlY2sgdGhhdCB3ZSBhcmUgcnVubmluZyB1bmRlciB0aGUgY29ycmVjdCBzaGVsbC4KK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisKK2Nhc2UgWCRFQ0hPIGluCitYKi0tZmFsbGJhY2stZWNobykKKyAgIyBSZW1vdmUgb25lIGxldmVsIG9mIHF1b3RhdGlvbiAod2hpY2ggd2FzIHJlcXVpcmVkIGZvciBNYWtlKS4KKyAgRUNITz1gZWNobyAiJEVDSE8iIHwgc2VkICdzLFxcXFxcWyRdXFxbJF0wLCdbJF0wJywnYAorICA7OworZXNhYworCitlY2hvPSR7RUNITy1lY2hvfQoraWYgdGVzdCAiWFskXTEiID0gWC0tbm8tcmVleGVjOyB0aGVuCisgICMgRGlzY2FyZCB0aGUgLS1uby1yZWV4ZWMgZmxhZywgYW5kIGNvbnRpbnVlLgorICBzaGlmdAorZWxpZiB0ZXN0ICJYWyRdMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCisgICMgQXZvaWQgaW5saW5lIGRvY3VtZW50IGhlcmUsIGl0IG1heSBiZSBsZWZ0IG92ZXIKKyAgOgorZWxpZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCc7IHRoZW4KKyAgIyBZaXBwZWUsICRlY2hvIHdvcmtzIQorICA6CitlbHNlCisgICMgUmVzdGFydCB1bmRlciB0aGUgY29ycmVjdCBzaGVsbC4KKyAgZXhlYyAkU0hFTEwgIlskXTAiIC0tbm8tcmVleGVjICR7MSsiWyRdQCJ9CitmaQorCitpZiB0ZXN0ICJYWyRdMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCisgICMgdXNlZCBhcyBmYWxsYmFjayBlY2hvCisgIHNoaWZ0CisgIGNhdCA8PEVPRgorJCoKK0VPRgorICBleGl0IDAKK2ZpCisKKyMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0CisjIGlmIENEUEFUSCBpcyBzZXQuCitpZiB0ZXN0ICJYJHtDRFBBVEgrc2V0fSIgPSBYc2V0OyB0aGVuIENEUEFUSD06OyBleHBvcnQgQ0RQQVRIOyBmaQorCitpZiB0ZXN0IC16ICIkRUNITyI7IHRoZW4KK2lmIHRlc3QgIlgke2VjaG9fdGVzdF9zdHJpbmcrc2V0fSIgIT0gWHNldDsgdGhlbgorIyBmaW5kIGEgc3RyaW5nIGFzIGxhcmdlIGFzIHBvc3NpYmxlLCBhcyBsb25nIGFzIHRoZSBzaGVsbCBjYW4gY29wZSB3aXRoIGl0CisgIGZvciBjbWQgaW4gJ3NlZCA1MHEgIlskXTAiJyAnc2VkIDIwcSAiWyRdMCInICdzZWQgMTBxICJbJF0wIicgJ3NlZCAycSAiWyRdMCInICdlY2hvIHRlc3QnOyBkbworICAgICMgZXhwZWN0ZWQgc2l6ZXM6IGxlc3MgdGhhbiAyS2IsIDFLYiwgNTEyIGJ5dGVzLCAxNiBieXRlcywgLi4uCisgICAgaWYgKGVjaG9fdGVzdF9zdHJpbmc9ImBldmFsICRjbWRgIikgMj4vZGV2L251bGwgJiYKKyAgICAgICBlY2hvX3Rlc3Rfc3RyaW5nPSJgZXZhbCAkY21kYCIgJiYKKyAgICAgICAodGVzdCAiWCRlY2hvX3Rlc3Rfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbAorICAgIHRoZW4KKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorZmkKKworaWYgdGVzdCAiWGAoJGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCisgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJGVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCisgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KKyAgOgorZWxzZQorICAjIFRoZSBTb2xhcmlzLCBBSVgsIGFuZCBEaWdpdGFsIFVuaXggZGVmYXVsdCBlY2hvIHByb2dyYW1zIHVucXVvdGUKKyAgIyBiYWNrc2xhc2hlcy4gIFRoaXMgbWFrZXMgaXQgaW1wb3NzaWJsZSB0byBxdW90ZSBiYWNrc2xhc2hlcyB1c2luZworICAjICAgZWNobyAiJHNvbWV0aGluZyIgfCBzZWQgJ3MvXFwvXFxcXC9nJworICAjCisgICMgU28sIGZpcnN0IHdlIGxvb2sgZm9yIGEgd29ya2luZyBlY2hvIGluIHRoZSB1c2VyJ3MgUEFUSC4KKworICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBmb3IgZGlyIGluICRQQVRIIC91c3IvdWNiOyBkbworICAgIGlmICh0ZXN0IC1mICRkaXIvZWNobyB8fCB0ZXN0IC1mICRkaXIvZWNobyRhY19leGVleHQpICYmCisgICAgICAgdGVzdCAiWGAoJGRpci9lY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgorICAgICAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkZGlyL2VjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCisgICAgICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCisgICAgICBlY2hvPSIkZGlyL2VjaG8iCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkc2F2ZV9pZnMiCisKKyAgaWYgdGVzdCAiWCRlY2hvIiA9IFhlY2hvOyB0aGVuCisgICAgIyBXZSBkaWRuJ3QgZmluZCBhIGJldHRlciBlY2hvLCBzbyBsb29rIGZvciBhbHRlcm5hdGl2ZXMuCisgICAgaWYgdGVzdCAiWGAocHJpbnQgLXIgJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCisgICAgICAgZWNob190ZXN0aW5nX3N0cmluZz1gKHByaW50IC1yICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgorICAgICAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgorICAgICAgIyBUaGlzIHNoZWxsIGhhcyBhIGJ1aWx0aW4gcHJpbnQgLXIgdGhhdCBkb2VzIHRoZSB0cmljay4KKyAgICAgIGVjaG89J3ByaW50IC1yJworICAgIGVsaWYgKHRlc3QgLWYgL2Jpbi9rc2ggfHwgdGVzdCAtZiAvYmluL2tzaCRhY19leGVleHQpICYmCisJIHRlc3QgIlgkQ09ORklHX1NIRUxMIiAhPSBYL2Jpbi9rc2g7IHRoZW4KKyAgICAgICMgSWYgd2UgaGF2ZSBrc2gsIHRyeSBydW5uaW5nIGNvbmZpZ3VyZSBhZ2FpbiB3aXRoIGl0LgorICAgICAgT1JJR0lOQUxfQ09ORklHX1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisgICAgICBleHBvcnQgT1JJR0lOQUxfQ09ORklHX1NIRUxMCisgICAgICBDT05GSUdfU0hFTEw9L2Jpbi9rc2gKKyAgICAgIGV4cG9ydCBDT05GSUdfU0hFTEwKKyAgICAgIGV4ZWMgJENPTkZJR19TSEVMTCAiWyRdMCIgLS1uby1yZWV4ZWMgJHsxKyJbJF1AIn0KKyAgICBlbHNlCisgICAgICAjIFRyeSB1c2luZyBwcmludGYuCisgICAgICBlY2hvPSdwcmludGYgJXNcbicKKyAgICAgIGlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgorCSBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJGVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCisJIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgorCSMgQ29vbCwgcHJpbnRmIHdvcmtzCisJOgorICAgICAgZWxpZiBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJE9SSUdJTkFMX0NPTkZJR19TSEVMTCAiWyRdMCIgLS1mYWxsYmFjay1lY2hvICdcdCcpIDI+L2Rldi9udWxsYCAmJgorCSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAnWFx0JyAmJgorCSAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkT1JJR0lOQUxfQ09ORklHX1NIRUxMICJbJF0wIiAtLWZhbGxiYWNrLWVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCisJICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCisJQ09ORklHX1NIRUxMPSRPUklHSU5BTF9DT05GSUdfU0hFTEwKKwlleHBvcnQgQ09ORklHX1NIRUxMCisJU0hFTEw9IiRDT05GSUdfU0hFTEwiCisJZXhwb3J0IFNIRUxMCisJZWNobz0iJENPTkZJR19TSEVMTCBbJF0wIC0tZmFsbGJhY2stZWNobyIKKyAgICAgIGVsaWYgZWNob190ZXN0aW5nX3N0cmluZz1gKCRDT05GSUdfU0hFTEwgIlskXTAiIC0tZmFsbGJhY2stZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAgJiYKKwkgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gJ1hcdCcgJiYKKwkgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJENPTkZJR19TSEVMTCAiWyRdMCIgLS1mYWxsYmFjay1lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgorCSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgorCWVjaG89IiRDT05GSUdfU0hFTEwgWyRdMCAtLWZhbGxiYWNrLWVjaG8iCisgICAgICBlbHNlCisJIyBtYXliZSB3aXRoIGEgc21hbGxlciBzdHJpbmcuLi4KKwlwcmV2PToKKworCWZvciBjbWQgaW4gJ2VjaG8gdGVzdCcgJ3NlZCAycSAiWyRdMCInICdzZWQgMTBxICJbJF0wIicgJ3NlZCAyMHEgIlskXTAiJyAnc2VkIDUwcSAiWyRdMCInOyBkbworCSAgaWYgKHRlc3QgIlgkZWNob190ZXN0X3N0cmluZyIgPSAiWGBldmFsICRjbWRgIikgMj4vZGV2L251bGwKKwkgIHRoZW4KKwkgICAgYnJlYWsKKwkgIGZpCisJICBwcmV2PSIkY21kIgorCWRvbmUKKworCWlmIHRlc3QgIiRwcmV2IiAhPSAnc2VkIDUwcSAiWyRdMCInOyB0aGVuCisJICBlY2hvX3Rlc3Rfc3RyaW5nPWBldmFsICRwcmV2YAorCSAgZXhwb3J0IGVjaG9fdGVzdF9zdHJpbmcKKwkgIGV4ZWMgJHtPUklHSU5BTF9DT05GSUdfU0hFTEwtJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH19ICJbJF0wIiAkezErIlskXUAifQorCWVsc2UKKwkgICMgT29wcy4gIFdlIGxvc3QgY29tcGxldGVseSwgc28ganVzdCBzdGljayB3aXRoIGVjaG8uCisJICBlY2hvPWVjaG8KKwlmaQorICAgICAgZmkKKyAgICBmaQorICBmaQorZmkKK2ZpCisKKyMgQ29weSBlY2hvIGFuZCBxdW90ZSB0aGUgY29weSBzdWl0YWJseSBmb3IgcGFzc2luZyB0byBsaWJ0b29sIGZyb20KKyMgdGhlIE1ha2VmaWxlLCBpbnN0ZWFkIG9mIHF1b3RpbmcgdGhlIG9yaWdpbmFsLCB3aGljaCBpcyB1c2VkIGxhdGVyLgorRUNITz0kZWNobworaWYgdGVzdCAiWCRFQ0hPIiA9ICJYJENPTkZJR19TSEVMTCBbJF0wIC0tZmFsbGJhY2stZWNobyI7IHRoZW4KKyAgIEVDSE89IiRDT05GSUdfU0hFTEwgXFxcJFxbJF0wIC0tZmFsbGJhY2stZWNobyIKK2ZpCisKK0FDX1NVQlNUKEVDSE8pCitBQ19ESVZFUlRfUE9QCitdKSMgX0xUX0FDX1BST0dfRUNIT19CQUNLU0xBU0gKKworIyBfTFRfQUNfVFJZX0RMT1BFTl9TRUxGIChBQ1RJT04tSUYtVFJVRSwgQUNUSU9OLUlGLVRSVUUtVy1VU0NPUkUsCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNUSU9OLUlGLUZBTFNFLCBBQ1RJT04tSUYtQ1JPU1MtQ09NUElMSU5HKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtfTFRfQUNfVFJZX0RMT1BFTl9TRUxGXSwKK1tpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgIFskNF0KK2Vsc2UKKyAgQUNfUkVRVUlSRShbX0xUX0FDX0NIRUNLX0RMRkNOXSlkbmwKKyAgbHRfZGx1bmtub3duPTA7IGx0X2Rsbm9fdXNjb3JlPTE7IGx0X2RsbmVlZF91c2NvcmU9MgorICBsdF9zdGF0dXM9JGx0X2RsdW5rbm93bgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCitbI2xpbmUgX19vbGluZV9fICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2lmIEhBVkVfRExGQ05fSAorI2luY2x1ZGUgPGRsZmNuLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZmRlZiBSVExEX0dMT0JBTAorIyAgZGVmaW5lIExUX0RMR0xPQkFMCQlSVExEX0dMT0JBTAorI2Vsc2UKKyMgIGlmZGVmIERMX0dMT0JBTAorIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCURMX0dMT0JBTAorIyAgZWxzZQorIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCTAKKyMgIGVuZGlmCisjZW5kaWYKKworLyogV2UgbWF5IGhhdmUgdG8gZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cgaW4gdGhlIGNvbW1hbmQgbGluZSBpZiB3ZQorICAgZmluZCBvdXQgaXQgZG9lcyBub3Qgd29yayBpbiBzb21lIHBsYXRmb3JtLiAqLworI2lmbmRlZiBMVF9ETExBWllfT1JfTk9XCisjICBpZmRlZiBSVExEX0xBWlkKKyMgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCVJUTERfTEFaWQorIyAgZWxzZQorIyAgICBpZmRlZiBETF9MQVpZCisjICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCURMX0xBWlkKKyMgICAgZWxzZQorIyAgICAgIGlmZGVmIFJUTERfTk9XCisjICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlSVExEX05PVworIyAgICAgIGVsc2UKKyMgICAgICAgIGlmZGVmIERMX05PVworIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlETF9OT1cKKyMgICAgICAgIGVsc2UKKyMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJMAorIyAgICAgICAgZW5kaWYKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgdm9pZCBleGl0IChpbnQpOworI2VuZGlmCisKK3ZvaWQgZm5vcmQoKSB7IGludCBpPTQyO30KK2ludCBtYWluICgpCit7CisgIHZvaWQgKnNlbGYgPSBkbG9wZW4gKDAsIExUX0RMR0xPQkFMfExUX0RMTEFaWV9PUl9OT1cpOworICBpbnQgc3RhdHVzID0gJGx0X2RsdW5rbm93bjsKKworICBpZiAoc2VsZikKKyAgICB7CisgICAgICBpZiAoZGxzeW0gKHNlbGYsImZub3JkIikpICAgICAgIHN0YXR1cyA9ICRsdF9kbG5vX3VzY29yZTsKKyAgICAgIGVsc2UgaWYgKGRsc3ltKCBzZWxmLCJfZm5vcmQiKSkgc3RhdHVzID0gJGx0X2RsbmVlZF91c2NvcmU7CisgICAgICAvKiBkbGNsb3NlIChzZWxmKTsgKi8KKyAgICB9CisKKyAgICBleGl0IChzdGF0dXMpOworfV0KK0VPRgorICBpZiBBQ19UUllfRVZBTChhY19saW5rKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9IDI+L2Rldi9udWxsOyB0aGVuCisgICAgKC4vY29uZnRlc3Q7IGV4aXQ7ICkgMj4vZGV2L251bGwKKyAgICBsdF9zdGF0dXM9JD8KKyAgICBjYXNlIHgkbHRfc3RhdHVzIGluCisgICAgICB4JGx0X2Rsbm9fdXNjb3JlKSAkMSA7OworICAgICAgeCRsdF9kbG5lZWRfdXNjb3JlKSAkMiA7OworICAgICAgeCRsdF91bmtub3dufHgqKSAkMyA7OworICAgIGVzYWMKKyAgZWxzZSA6CisgICAgIyBjb21waWxhdGlvbiBmYWlsZWQKKyAgICAkMworICBmaQorZmkKK3JtIC1mciBjb25mdGVzdCoKK10pIyBfTFRfQUNfVFJZX0RMT1BFTl9TRUxGCisKKyMgQUNfTElCVE9PTF9ETE9QRU5fU0VMRgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbQUNfTElCVE9PTF9ETE9QRU5fU0VMRl0sCitbaWYgdGVzdCAieCRlbmFibGVfZGxvcGVuIiAhPSB4eWVzOyB0aGVuCisgIGVuYWJsZV9kbG9wZW49dW5rbm93bgorICBlbmFibGVfZGxvcGVuX3NlbGY9dW5rbm93bgorICBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPXVua25vd24KK2Vsc2UKKyAgbHRfY3ZfZGxvcGVuPW5vCisgIGx0X2N2X2Rsb3Blbl9saWJzPQorCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYmVvcyopCisgICAgbHRfY3ZfZGxvcGVuPSJsb2FkX2FkZF9vbiIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgICBsdF9jdl9kbG9wZW5fc2VsZj15ZXMKKyAgICA7OworCisgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgICBsdF9jdl9kbG9wZW49IkxvYWRMaWJyYXJ5IgorICAgIGx0X2N2X2Rsb3Blbl9saWJzPQorICAgOzsKKworICAqKQorICAgIEFDX0NIRUNLX0ZVTkMoW3NobF9sb2FkXSwKKyAgICAgICAgICBbbHRfY3ZfZGxvcGVuPSJzaGxfbG9hZCJdLAorICAgICAgW0FDX0NIRUNLX0xJQihbZGxkXSwgW3NobF9sb2FkXSwKKyAgICAgICAgICAgIFtsdF9jdl9kbG9wZW49InNobF9sb2FkIiBsdF9jdl9kbG9wZW5fbGlicz0iLWRsZCJdLAorCVtBQ19DSEVDS19GVU5DKFtkbG9wZW5dLAorCSAgICAgIFtsdF9jdl9kbG9wZW49ImRsb3BlbiJdLAorCSAgW0FDX0NIRUNLX0xJQihbZGxdLCBbZGxvcGVuXSwKKwkgICAgICAgIFtsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiXSwKKwkgICAgW0FDX0NIRUNLX0xJQihbc3ZsZF0sIFtkbG9wZW5dLAorCSAgICAgICAgICBbbHRfY3ZfZGxvcGVuPSJkbG9wZW4iIGx0X2N2X2Rsb3Blbl9saWJzPSItbHN2bGQiXSwKKwkgICAgICBbQUNfQ0hFQ0tfTElCKFtkbGRdLCBbZGxkX2xpbmtdLAorCSAgICAgICAgICAgIFtsdF9jdl9kbG9wZW49ImRsZF9saW5rIiBsdF9jdl9kbG9wZW5fbGlicz0iLWRsZCJdKQorCSAgICAgIF0pCisJICAgIF0pCisJICBdKQorCV0pCisgICAgICBdKQorICAgIDs7CisgIGVzYWMKKworICBpZiB0ZXN0ICJ4JGx0X2N2X2Rsb3BlbiIgIT0geG5vOyB0aGVuCisgICAgZW5hYmxlX2Rsb3Blbj15ZXMKKyAgZWxzZQorICAgIGVuYWJsZV9kbG9wZW49bm8KKyAgZmkKKworICBjYXNlICRsdF9jdl9kbG9wZW4gaW4KKyAgZGxvcGVuKQorICAgIHNhdmVfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKKyAgICBBQ19SRVFVSVJFKFtfTFRfQUNfQ0hFQ0tfRExGQ05dKWRubAorICAgIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2RsZmNuX2giID0geHllcyAmJiBDUFBGTEFHUz0iJENQUEZMQUdTIC1ESEFWRV9ETEZDTl9IIgorCisgICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKyAgICBldmFsIExERkxBR1M9XCJcJExERkxBR1MgJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY1wiCisKKyAgICBzYXZlX0xJQlM9IiRMSUJTIgorICAgIExJQlM9IiRsdF9jdl9kbG9wZW5fbGlicyAkTElCUyIKKworICAgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZl0sCisJICBsdF9jdl9kbG9wZW5fc2VsZiwgW2RubAorCSAgX0xUX0FDX1RSWV9ETE9QRU5fU0VMRigKKwkgICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzLCBsdF9jdl9kbG9wZW5fc2VsZj15ZXMsCisJICAgIGx0X2N2X2Rsb3Blbl9zZWxmPW5vLCBsdF9jdl9kbG9wZW5fc2VsZj1jcm9zcykKKyAgICBdKQorCisgICAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW5fc2VsZiIgPSB4eWVzOyB0aGVuCisgICAgICBMREZMQUdTPSIkTERGTEFHUyAkbGlua19zdGF0aWNfZmxhZyIKKyAgICAgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIGEgc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZl0sCisgICAgCSAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljLCBbZG5sCisJICBfTFRfQUNfVFJZX0RMT1BFTl9TRUxGKAorCSAgICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9eWVzLCBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9eWVzLAorCSAgICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9bm8sICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9Y3Jvc3MpCisgICAgICBdKQorICAgIGZpCisKKyAgICBDUFBGTEFHUz0iJHNhdmVfQ1BQRkxBR1MiCisgICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKKyAgICBMSUJTPSIkc2F2ZV9MSUJTIgorICAgIDs7CisgIGVzYWMKKworICBjYXNlICRsdF9jdl9kbG9wZW5fc2VsZiBpbgorICB5ZXN8bm8pIGVuYWJsZV9kbG9wZW5fc2VsZj0kbHRfY3ZfZGxvcGVuX3NlbGYgOzsKKyAgKikgZW5hYmxlX2Rsb3Blbl9zZWxmPXVua25vd24gOzsKKyAgZXNhYworCisgIGNhc2UgJGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyBpbgorICB5ZXN8bm8pIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9JGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyA7OworICAqKSBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPXVua25vd24gOzsKKyAgZXNhYworZmkKK10pIyBBQ19MSUJUT09MX0RMT1BFTl9TRUxGCisKK0FDX0RFRlVOKFtfTFRfQUNfTFRDT05GSUdfSEFDS10sCitbQUNfUkVRVUlSRShbQUNfTElCVE9PTF9TWVNfR0xPQkFMX1NZTUJPTF9QSVBFXSlkbmwKKyMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKKyMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCitYc2VkPSdzZWQgLWUgcy9eWC8vJworc2VkX3F1b3RlX3N1YnN0PSdzL1woW1tcXCJcXGAkXFxcXF1dXCkvXFxcMS9nJworCisjIFNhbWUgYXMgYWJvdmUsIGJ1dCBkbyBub3QgcXVvdGUgdmFyaWFibGUgcmVmZXJlbmNlcy4KK2RvdWJsZV9xdW90ZV9zdWJzdD0ncy9cKFtbXFwiXFxgXFxcXF1dXCkvXFxcMS9nJworCisjIFNlZCBzdWJzdGl0dXRpb24gdG8gZGVsYXkgZXhwYW5zaW9uIG9mIGFuIGVzY2FwZWQgc2hlbGwgdmFyaWFibGUgaW4gYQorIyBkb3VibGVfcXVvdGVfc3Vic3QnZWQgc3RyaW5nLgorZGVsYXlfdmFyaWFibGVfc3Vic3Q9J3MvXFxcXFxcXFxcXFwkL1xcXFxcXCQvZycKKworIyBDb25zdGFudHM6CitybT0icm0gLWYiCisKKyMgR2xvYmFsIHZhcmlhYmxlczoKK2RlZmF1bHRfb2ZpbGU9bGlidG9vbAorY2FuX2J1aWxkX3NoYXJlZD15ZXMKKworIyBBbGwga25vd24gbGlua2VycyByZXF1aXJlIGEgYC5hJyBhcmNoaXZlIGZvciBzdGF0aWMgbGlua2luZyAoZXhjZXB0IE0kVkMsCisjIHdoaWNoIG5lZWRzICcubGliJykuCitsaWJleHQ9YQorbHRtYWluPSIkYWNfYXV4X2Rpci9sdG1haW4uc2giCitvZmlsZT0iJGRlZmF1bHRfb2ZpbGUiCit3aXRoX2dudV9sZD0iJGx0X2N2X3Byb2dfZ251X2xkIgorbmVlZF9sb2Nrcz0iJGVuYWJsZV9saWJ0b29sX2xvY2siCisKK29sZF9DQz0iJENDIgorb2xkX0NGTEFHUz0iJENGTEFHUyIKKworIyBTZXQgc2FuZSBkZWZhdWx0cyBmb3IgdmFyaW91cyB2YXJpYWJsZXMKK3Rlc3QgLXogIiRBUiIgJiYgQVI9YXIKK3Rlc3QgLXogIiRBUl9GTEFHUyIgJiYgQVJfRkxBR1M9Y3J1Cit0ZXN0IC16ICIkQVMiICYmIEFTPWFzCit0ZXN0IC16ICIkQ0MiICYmIENDPWNjCit0ZXN0IC16ICIkRExMVE9PTCIgJiYgRExMVE9PTD1kbGx0b29sCit0ZXN0IC16ICIkTEQiICYmIExEPWxkCit0ZXN0IC16ICIkTE5fUyIgJiYgTE5fUz0ibG4gLXMiCit0ZXN0IC16ICIkTUFHSUNfQ01EIiAmJiBNQUdJQ19DTUQ9ZmlsZQordGVzdCAteiAiJE5NIiAmJiBOTT1ubQordGVzdCAteiAiJE9CSkRVTVAiICYmIE9CSkRVTVA9b2JqZHVtcAordGVzdCAteiAiJFJBTkxJQiIgJiYgUkFOTElCPToKK3Rlc3QgLXogIiRTVFJJUCIgJiYgU1RSSVA9OgordGVzdCAteiAiJGFjX29iamV4dCIgJiYgYWNfb2JqZXh0PW8KKworaWYgdGVzdCB4IiRob3N0IiAhPSB4IiRidWlsZCI7IHRoZW4KKyAgYWNfdG9vbF9wcmVmaXg9JHtob3N0X2FsaWFzfS0KK2Vsc2UKKyAgYWNfdG9vbF9wcmVmaXg9CitmaQorCitjYXNlICRob3N0X29zIGluCithaXgzKikKKyAgIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCisgICMgcmVhc29uLCBpZiB3ZSBzZXQgdGhlIENPTExFQ1RfTkFNRVMgZW52aXJvbm1lbnQgdmFyaWFibGUsIHRoZSBwcm9ibGVtcworICAjIHZhbmlzaCBpbiBhIHB1ZmYgb2Ygc21va2UuCisgIGlmIHRlc3QgIlgke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gWHNldDsgdGhlbgorICAgIENPTExFQ1RfTkFNRVM9CisgICAgZXhwb3J0IENPTExFQ1RfTkFNRVMKKyAgZmkKKyAgOzsKK2VzYWMKKworIyBEZXRlcm1pbmUgY29tbWFuZHMgdG8gY3JlYXRlIG9sZC1zdHlsZSBzdGF0aWMgYXJjaGl2ZXMuCitvbGRfYXJjaGl2ZV9jbWRzPSckQVIgJEFSX0ZMQUdTICRvbGRsaWIkb2xkb2JqcyRvbGRfZGVwbGlicycKK29sZF9wb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA2NDQgJG9sZGxpYicKK29sZF9wb3N0dW5pbnN0YWxsX2NtZHM9CisKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgb3BlbmJzZCopCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IlwkUkFOTElCIC10IFwkb2xkbGlifiRvbGRfcG9zdGluc3RhbGxfY21kcyIKKyAgICA7OworICAqKQorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzPSJcJFJBTkxJQiBcJG9sZGxpYn4kb2xkX3Bvc3RpbnN0YWxsX2NtZHMiCisgICAgOzsKKyAgZXNhYworICBvbGRfYXJjaGl2ZV9jbWRzPSIkb2xkX2FyY2hpdmVfY21kc35cJFJBTkxJQiBcJG9sZGxpYiIKK2ZpCisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitzZXQgZHVtbXkgJENDCitjb21waWxlcj0iWyRdMiIKKworQUNfTVNHX0NIRUNLSU5HKFtmb3Igb2JqZGlyXSkKK3JtIC1mIC5saWJzIDI+L2Rldi9udWxsCitta2RpciAubGlicyAyPi9kZXYvbnVsbAoraWYgdGVzdCAtZCAubGliczsgdGhlbgorICBvYmpkaXI9LmxpYnMKK2Vsc2UKKyAgIyBNUy1ET1MgZG9lcyBub3QgYWxsb3cgZmlsZW5hbWVzIHRoYXQgYmVnaW4gd2l0aCBhIGRvdC4KKyAgb2JqZGlyPV9saWJzCitmaQorcm1kaXIgLmxpYnMgMj4vZGV2L251bGwKK0FDX01TR19SRVNVTFQoJG9iamRpcikKKworCitBQ19BUkdfV0lUSChwaWMsCitbICAtLXdpdGgtcGljICAgICAgICAgICAgICB0cnkgdG8gdXNlIG9ubHkgUElDL25vbi1QSUMgb2JqZWN0cyBbZGVmYXVsdD11c2UgYm90aF1dLAorcGljX21vZGU9IiR3aXRodmFsIiwgcGljX21vZGU9ZGVmYXVsdCkKK3Rlc3QgLXogIiRwaWNfbW9kZSIgJiYgcGljX21vZGU9ZGVmYXVsdAorCisjIFdlIGFzc3VtZSBoZXJlIHRoYXQgdGhlIHZhbHVlIGZvciBsdF9jdl9wcm9nX2NjX3BpYyB3aWxsIG5vdCBiZSBjYWNoZWQKKyMgaW4gaXNvbGF0aW9uLCBhbmQgdGhhdCBzZWVpbmcgaXQgc2V0IChmcm9tIHRoZSBjYWNoZSkgaW5kaWNhdGVzIHRoYXQKKyMgdGhlIGFzc29jaWF0ZWQgdmFsdWVzIGFyZSBzZXQgKGluIHRoZSBjYWNoZSkgY29ycmVjdGx5IHRvby4KK0FDX01TR19DSEVDS0lORyhbZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUNdKQorQUNfQ0FDSEVfVkFMKGx0X2N2X3Byb2dfY2NfcGljLAorWyBsdF9jdl9wcm9nX2NjX3BpYz0KKyAgbHRfY3ZfcHJvZ19jY19zaGxpYj0KKyAgbHRfY3ZfcHJvZ19jY193bD0KKyAgbHRfY3ZfcHJvZ19jY19zdGF0aWM9CisgIGx0X2N2X3Byb2dfY2Nfbm9fYnVpbHRpbj0KKyAgbHRfY3ZfcHJvZ19jY19jYW5fYnVpbGRfc2hhcmVkPSRjYW5fYnVpbGRfc2hhcmVkCisKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBsdF9jdl9wcm9nX2NjX3dsPSctV2wsJworICAgIGx0X2N2X3Byb2dfY2Nfc3RhdGljPSctc3RhdGljJworCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeCopCisgICAgICAjIEJlbG93IHRoZXJlIGlzIGEgZGlydHkgaGFjayB0byBmb3JjZSBub3JtYWwgc3RhdGljIGxpbmtpbmcgd2l0aCAtbGRsCisgICAgICAjIFRoZSBwcm9ibGVtIGlzIGJlY2F1c2UgbGliZGwgZHluYW1pY2FsbHkgbGlua2VkIHdpdGggYm90aCBsaWJjIGFuZAorICAgICAgIyBsaWJDIChBSVggQysrIGxpYnJhcnkpLCB3aGljaCBvYnZpb3VzbHkgZG9lc24ndCBpbmNsdWRlZCBpbiBsaWJyYXJpZXMKKyAgICAgICMgbGlzdCBieSBnY2MuIFRoaXMgY2F1c2UgdW5kZWZpbmVkIHN5bWJvbHMgd2l0aCAtc3RhdGljIGZsYWdzLgorICAgICAgIyBUaGlzIGhhY2sgYWxsb3dzIEMgcHJvZ3JhbXMgdG8gYmUgbGlua2VkIHdpdGggIi1zdGF0aWMgLWxkbCIsIGJ1dAorICAgICAgIyBub3Qgc3VyZSBhYm91dCBDKysgcHJvZ3JhbXMuCisgICAgICBsdF9jdl9wcm9nX2NjX3N0YXRpYz0iJGx0X2N2X3Byb2dfY2Nfc3RhdGljICR7bHRfY3ZfcHJvZ19jY193bH0tbEMiCisgICAgICA7OworICAgIGFtaWdhb3MqKQorICAgICAgIyBGSVhNRTogd2UgbmVlZCBhdCBsZWFzdCA2ODAyMCBjb2RlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dAorICAgICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCisgICAgICAjIGxpa2UgYC1tNjgwNDAnLgorICAgICAgbHRfY3ZfcHJvZ19jY19waWM9Jy1tNjgwMjAgLXJlc2lkZW50MzIgLW1hbHdheXMtcmVzdG9yZS1hNCcKKyAgICAgIDs7CisgICAgYmVvcyogfCBpcml4NSogfCBpcml4NiogfCBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlc2UgT1Nlcy4KKyAgICAgIDs7CisgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KKyAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKKyAgICAgIGx0X2N2X3Byb2dfY2NfcGljPSctZm5vLWNvbW1vbicKKyAgICAgIDs7CisgICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgb3MyKikKKyAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKKyAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCisgICAgICBsdF9jdl9wcm9nX2NjX3BpYz0nLURETExfRVhQT1JUJworICAgICAgOzsKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJIGx0X2N2X3Byb2dfY2NfcGljPS1LY29uZm9ybV9waWMKKyAgICAgIGZpCisgICAgICA7OworICAgICopCisgICAgICBsdF9jdl9wcm9nX2NjX3BpYz0nLWZQSUMnCisgICAgICA7OworICAgIGVzYWMKKyAgZWxzZQorICAgICMgUE9SVE1FIENoZWNrIGZvciBQSUMgZmxhZ3MgZm9yIHRoZSBzeXN0ZW0gY29tcGlsZXIuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeDMqIHwgYWl4NCogfCBhaXg1KikKKyAgICAgIGx0X2N2X3Byb2dfY2Nfd2w9Jy1XbCwnCisgICAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJbHRfY3ZfcHJvZ19jY19zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgZWxzZQorCWx0X2N2X3Byb2dfY2Nfc3RhdGljPSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCisgICAgICBmaQorICAgICAgOzsKKworICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAgICAgIyBJcyB0aGVyZSBhIGJldHRlciBsdF9jdl9wcm9nX2NjX3N0YXRpYyB0aGF0IHdvcmtzIHdpdGggdGhlIGJ1bmRsZWQgQ0M/CisgICAgICBsdF9jdl9wcm9nX2NjX3dsPSctV2wsJworICAgICAgbHRfY3ZfcHJvZ19jY19zdGF0aWM9IiR7bHRfY3ZfcHJvZ19jY193bH0tYSAke2x0X2N2X3Byb2dfY2Nfd2x9YXJjaGl2ZSIKKyAgICAgIGx0X2N2X3Byb2dfY2NfcGljPScrWicKKyAgICAgIDs7CisKKyAgICBpcml4NSogfCBpcml4NiopCisgICAgICBsdF9jdl9wcm9nX2NjX3dsPSctV2wsJworICAgICAgbHRfY3ZfcHJvZ19jY19zdGF0aWM9Jy1ub25fc2hhcmVkJworICAgICAgIyBQSUMgKHdpdGggLUtQSUMpIGlzIHRoZSBkZWZhdWx0LgorICAgICAgOzsKKworICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IG9zMiopCisgICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisgICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgorICAgICAgbHRfY3ZfcHJvZ19jY19waWM9Jy1ERExMX0VYUE9SVCcKKyAgICAgIDs7CisKKyAgICBuZXdzb3M2KQorICAgICAgbHRfY3ZfcHJvZ19jY19waWM9Jy1LUElDJworICAgICAgbHRfY3ZfcHJvZ19jY19zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgICMgQWxsIE9TRi8xIGNvZGUgaXMgUElDLgorICAgICAgbHRfY3ZfcHJvZ19jY193bD0nLVdsLCcKKyAgICAgIGx0X2N2X3Byb2dfY2Nfc3RhdGljPSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICBzY28zLjJ2NSopCisgICAgICBsdF9jdl9wcm9nX2NjX3BpYz0nLUtwaWMnCisgICAgICBsdF9jdl9wcm9nX2NjX3N0YXRpYz0nLWRuJworICAgICAgbHRfY3ZfcHJvZ19jY19zaGxpYj0nLWJlbGYnCisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBsdF9jdl9wcm9nX2NjX3BpYz0nLUtQSUMnCisgICAgICBsdF9jdl9wcm9nX2NjX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICBsdF9jdl9wcm9nX2NjX3dsPSctV2wsJworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBsdF9jdl9wcm9nX2NjX3BpYz0nLVBJQycKKyAgICAgIGx0X2N2X3Byb2dfY2Nfc3RhdGljPSctQnN0YXRpYycKKyAgICAgIGx0X2N2X3Byb2dfY2Nfd2w9Jy1Rb3B0aW9uIGxkICcKKyAgICAgIDs7CisKKyAgICBzeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyogfCBzeXN2NSopCisgICAgICBsdF9jdl9wcm9nX2NjX3BpYz0nLUtQSUMnCisgICAgICBsdF9jdl9wcm9nX2NjX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICBpZiB0ZXN0ICJ4JGhvc3RfdmVuZG9yIiA9IHhzbmk7IHRoZW4KKwlsdF9jdl9wcm9nX2NjX3dsPSctTEQnCisgICAgICBlbHNlCisJbHRfY3ZfcHJvZ19jY193bD0nLVdsLCcKKyAgICAgIGZpCisgICAgICA7OworCisgICAgdXRzNCopCisgICAgICBsdF9jdl9wcm9nX2NjX3BpYz0nLXBpYycKKyAgICAgIGx0X2N2X3Byb2dfY2Nfc3RhdGljPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjIDt0aGVuCisJbHRfY3ZfcHJvZ19jY19waWM9Jy1LY29uZm9ybV9waWMnCisJbHRfY3ZfcHJvZ19jY19zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgbHRfY3ZfcHJvZ19jY19jYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKK10pCitpZiB0ZXN0IC16ICIkbHRfY3ZfcHJvZ19jY19waWMiOyB0aGVuCisgIEFDX01TR19SRVNVTFQoW25vbmVdKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKFskbHRfY3ZfcHJvZ19jY19waWNdKQorCisgICMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBwaWNfZmxhZyBhY3R1YWxseSB3b3Jrcy4KKyAgQUNfTVNHX0NIRUNLSU5HKFtpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X2N2X3Byb2dfY2NfcGljIHdvcmtzXSkKKyAgQUNfQ0FDSEVfVkFMKGx0X2N2X3Byb2dfY2NfcGljX3dvcmtzLCBbZG5sCisgICAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRsdF9jdl9wcm9nX2NjX3BpYyAtRFBJQyIKKyAgICBBQ19UUllfQ09NUElMRShbXSwgW10sIFtkbmwKKyAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorCSMgT24gSFAtVVgsIGJvdGggQ0MgYW5kIEdDQyBvbmx5IHdhcm4gdGhhdCBQSUMgaXMgc3VwcG9ydGVkLi4uIHRoZW4KKwkjIHRoZXkgY3JlYXRlIG5vbi1QSUMgb2JqZWN0cy4gIFNvLCBpZiB0aGVyZSB3ZXJlIGFueSB3YXJuaW5ncywgd2UKKwkjIGFzc3VtZSB0aGF0IFBJQyBpcyBub3Qgc3VwcG9ydGVkLgorCWlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisJICBsdF9jdl9wcm9nX2NjX3BpY193b3Jrcz1ubworCWVsc2UKKwkgIGx0X2N2X3Byb2dfY2NfcGljX3dvcmtzPXllcworCWZpCisJOzsKKyAgICAgICopCisJbHRfY3ZfcHJvZ19jY19waWNfd29ya3M9eWVzCisJOzsKKyAgICAgIGVzYWMKKyAgICBdLCBbZG5sCisgICAgICBsdF9jdl9wcm9nX2NjX3BpY193b3Jrcz1ubworICAgIF0pCisgICAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCisgIF0pCisKKyAgaWYgdGVzdCAiWCRsdF9jdl9wcm9nX2NjX3BpY193b3JrcyIgPSBYbm87IHRoZW4KKyAgICBsdF9jdl9wcm9nX2NjX3BpYz0KKyAgICBsdF9jdl9wcm9nX2NjX2Nhbl9idWlsZF9zaGFyZWQ9bm8KKyAgZWxzZQorICAgIGx0X2N2X3Byb2dfY2NfcGljPSIgJGx0X2N2X3Byb2dfY2NfcGljIgorICBmaQorCisgIEFDX01TR19SRVNVTFQoWyRsdF9jdl9wcm9nX2NjX3BpY193b3Jrc10pCitmaQorCisjIENoZWNrIGZvciBhbnkgc3BlY2lhbCBzaGFyZWQgbGlicmFyeSBjb21waWxhdGlvbiBmbGFncy4KK2lmIHRlc3QgLW4gIiRsdF9jdl9wcm9nX2NjX3NobGliIjsgdGhlbgorICBBQ19NU0dfV0FSTihbXGAkQ0MnIHJlcXVpcmVzIFxgJGx0X2N2X3Byb2dfY2Nfc2hsaWInIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXNdKQorICBpZiBlY2hvICIkb2xkX0NDICRvbGRfQ0ZMQUdTICIgfCBlZ3JlcCAtZSAiW1sgCV1dJGx0X2N2X3Byb2dfY2Nfc2hsaWJbWyAJXV0iID4vZGV2L251bGw7IHRoZW4gOgorICBlbHNlCisgICBBQ19NU0dfV0FSTihbYWRkIFxgJGx0X2N2X3Byb2dfY2Nfc2hsaWInIHRvIHRoZSBDQyBvciBDRkxBR1MgZW52IHZhcmlhYmxlIGFuZCByZWNvbmZpZ3VyZV0pCisgICAgbHRfY3ZfcHJvZ19jY19jYW5fYnVpbGRfc2hhcmVkPW5vCisgIGZpCitmaQorCitBQ19NU0dfQ0hFQ0tJTkcoW2lmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfY3ZfcHJvZ19jY19zdGF0aWMgd29ya3NdKQorQUNfQ0FDSEVfVkFMKFtsdF9jdl9wcm9nX2NjX3N0YXRpY193b3Jrc10sIFtkbmwKKyAgbHRfY3ZfcHJvZ19jY19zdGF0aWNfd29ya3M9bm8KKyAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKyAgTERGTEFHUz0iJExERkxBR1MgJGx0X2N2X3Byb2dfY2Nfc3RhdGljIgorICBBQ19UUllfTElOSyhbXSwgW10sIFtsdF9jdl9wcm9nX2NjX3N0YXRpY193b3Jrcz15ZXNdKQorICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorXSkKKworIyBCZWx0ICphbmQqIGJyYWNlcyB0byBzdG9wIG15IHRyb3VzZXJzIGZhbGxpbmcgZG93bjoKK3Rlc3QgIlgkbHRfY3ZfcHJvZ19jY19zdGF0aWNfd29ya3MiID0gWG5vICYmIGx0X2N2X3Byb2dfY2Nfc3RhdGljPQorQUNfTVNHX1JFU1VMVChbJGx0X2N2X3Byb2dfY2Nfc3RhdGljX3dvcmtzXSkKKworcGljX2ZsYWc9IiRsdF9jdl9wcm9nX2NjX3BpYyIKK3NwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFncz0iJGx0X2N2X3Byb2dfY2Nfc2hsaWIiCit3bD0iJGx0X2N2X3Byb2dfY2Nfd2wiCitsaW5rX3N0YXRpY19mbGFnPSIkbHRfY3ZfcHJvZ19jY19zdGF0aWMiCitub19idWlsdGluX2ZsYWc9IiRsdF9jdl9wcm9nX2NjX25vX2J1aWx0aW4iCitjYW5fYnVpbGRfc2hhcmVkPSIkbHRfY3ZfcHJvZ19jY19jYW5fYnVpbGRfc2hhcmVkIgorCisKKyMgQ2hlY2sgdG8gc2VlIGlmIG9wdGlvbnMgLW8gYW5kIC1jIGFyZSBzaW11bHRhbmVvdXNseSBzdXBwb3J0ZWQgYnkgY29tcGlsZXIKK0FDX01TR19DSEVDS0lORyhbaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dF0pCitBQ19DQUNIRV9WQUwoW2x0X2N2X2NvbXBpbGVyX2Nfb10sIFsKKyRybSAtciBjb25mdGVzdCAyPi9kZXYvbnVsbAorbWtkaXIgY29uZnRlc3QKK2NkIGNvbmZ0ZXN0CitlY2hvICJpbnQgc29tZV92YXJpYWJsZSA9IDA7IiA+IGNvbmZ0ZXN0LiRhY19leHQKK21rZGlyIG91dAorIyBBY2NvcmRpbmcgdG8gVG9tIFRyb21leSwgSWFuIExhbmNlIFRheWxvciByZXBvcnRlZCB0aGVyZSBhcmUgQyBjb21waWxlcnMKKyMgdGhhdCB3aWxsIGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHJlZ2FyZGxlc3Mgb2YKKyMgdGhlIG91dHB1dCBkaXJlY3RvcnkuICBUaHVzLCBtYWtpbmcgQ1dEIHJlYWQtb25seSB3aWxsIGNhdXNlIHRoaXMgdGVzdAorIyB0byBmYWlsLCBlbmFibGluZyBsb2NraW5nIG9yIGF0IGxlYXN0IHdhcm5pbmcgdGhlIHVzZXIgbm90IHRvIGRvIHBhcmFsbGVsCisjIGJ1aWxkcy4KK2NobW9kIC13IC4KK3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorQ0ZMQUdTPSIkQ0ZMQUdTIC1vIG91dC9jb25mdGVzdDIuJGFjX29iamV4dCIKK2NvbXBpbGVyX2Nfbz1ubworaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTpfX29saW5lX186IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+b3V0L2NvbmZ0ZXN0LmVycjsgfSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dDsgdGhlbgorICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgaWYgdGVzdCAtcyBvdXQvY29uZnRlc3QuZXJyOyB0aGVuCisgICAgbHRfY3ZfY29tcGlsZXJfY19vPW5vCisgIGVsc2UKKyAgICBsdF9jdl9jb21waWxlcl9jX289eWVzCisgIGZpCitlbHNlCisgICMgQXBwZW5kIGFueSBlcnJvcnMgdG8gdGhlIGNvbmZpZy5sb2cuCisgIGNhdCBvdXQvY29uZnRlc3QuZXJyIDE+JkFDX0ZEX0NDCisgIGx0X2N2X2NvbXBpbGVyX2Nfbz1ubworZmkKK0NGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorY2htb2QgdSt3IC4KKyRybSBjb25mdGVzdCogb3V0LyoKK3JtZGlyIG91dAorY2QgLi4KK3JtZGlyIGNvbmZ0ZXN0Ciskcm0gLXIgY29uZnRlc3QgMj4vZGV2L251bGwKK10pCitjb21waWxlcl9jX289JGx0X2N2X2NvbXBpbGVyX2NfbworQUNfTVNHX1JFU1VMVChbJGNvbXBpbGVyX2Nfb10pCisKK2lmIHRlc3QgeCIkY29tcGlsZXJfY19vIiA9IHgieWVzIjsgdGhlbgorICAjIENoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gd3JpdGUgdG8gYSAubG8KKyAgQUNfTVNHX0NIRUNLSU5HKFtpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS5sb10pCisgIEFDX0NBQ0hFX1ZBTChbbHRfY3ZfY29tcGlsZXJfb19sb10sIFsKKyAgbHRfY3ZfY29tcGlsZXJfb19sbz1ubworICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgQ0ZMQUdTPSIkQ0ZMQUdTIC1jIC1vIGNvbmZ0ZXN0LmxvIgorICBzYXZlX29iamV4dD0iJGFjX29iamV4dCIKKyAgYWNfb2JqZXh0PWxvCisgIEFDX1RSWV9DT01QSUxFKFtdLCBbaW50IHNvbWVfdmFyaWFibGUgPSAwO10sIFtkbmwKKyAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncworICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgICBsdF9jdl9jb21waWxlcl9vX2xvPW5vCisgICAgZWxzZQorICAgICAgbHRfY3ZfY29tcGlsZXJfb19sbz15ZXMKKyAgICBmaQorICBdKQorICBhY19vYmpleHQ9IiRzYXZlX29iamV4dCIKKyAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCisgIF0pCisgIGNvbXBpbGVyX29fbG89JGx0X2N2X2NvbXBpbGVyX29fbG8KKyAgQUNfTVNHX1JFU1VMVChbJGNvbXBpbGVyX29fbG9dKQorZWxzZQorICBjb21waWxlcl9vX2xvPW5vCitmaQorCisjIENoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gZG8gaGFyZCBsaW5rcyB0byBsb2NrIHNvbWUgZmlsZXMgaWYgbmVlZGVkCitoYXJkX2xpbmtzPSJub3R0ZXN0ZWQiCitpZiB0ZXN0ICIkY29tcGlsZXJfY19vIiA9IG5vICYmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgorICAjIGRvIG5vdCBvdmVyd3JpdGUgdGhlIHZhbHVlIG9mIG5lZWRfbG9ja3MgcHJvdmlkZWQgYnkgdGhlIHVzZXIKKyAgQUNfTVNHX0NIRUNLSU5HKFtpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3NdKQorICBoYXJkX2xpbmtzPXllcworICAkcm0gY29uZnRlc3QqCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCisgIHRvdWNoIGNvbmZ0ZXN0LmEKKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+JjUgfHwgaGFyZF9saW5rcz1ubworICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubworICBBQ19NU0dfUkVTVUxUKFskaGFyZF9saW5rc10pCisgIGlmIHRlc3QgIiRoYXJkX2xpbmtzIiA9IG5vOyB0aGVuCisgICAgQUNfTVNHX1dBUk4oW1xgJENDJyBkb2VzIG5vdCBzdXBwb3J0IFxgLWMgLW8nLCBzbyBcYG1ha2UgLWonIG1heSBiZSB1bnNhZmVdKQorICAgIG5lZWRfbG9ja3M9d2FybgorICBmaQorZWxzZQorICBuZWVkX2xvY2tzPW5vCitmaQorCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAjIENoZWNrIHRvIHNlZSBpZiBvcHRpb25zIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMgYXJlIHN1cHBvcnRlZCBieSBjb21waWxlcgorICBBQ19NU0dfQ0hFQ0tJTkcoW2lmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zXSkKKyAgZWNobyAiaW50IHNvbWVfdmFyaWFibGUgPSAwOyIgPiBjb25mdGVzdC4kYWNfZXh0CisgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICBDRkxBR1M9IiRDRkxBR1MgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyAtYyBjb25mdGVzdC4kYWNfZXh0IgorICBjb21waWxlcl9ydHRpX2V4Y2VwdGlvbnM9bm8KKyAgQUNfVFJZX0NPTVBJTEUoW10sIFtpbnQgc29tZV92YXJpYWJsZSA9IDA7XSwgW2RubAorICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgIGNvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucz1ubworICAgIGVsc2UKKyAgICAgIGNvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucz15ZXMKKyAgICBmaQorICBdKQorICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKyAgQUNfTVNHX1JFU1VMVChbJGNvbXBpbGVyX3J0dGlfZXhjZXB0aW9uc10pCisKKyAgaWYgdGVzdCAiJGNvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucyIgPSAieWVzIjsgdGhlbgorICAgIG5vX2J1aWx0aW5fZmxhZz0nIC1mbm8tYnVpbHRpbiAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zJworICBlbHNlCisgICAgbm9fYnVpbHRpbl9mbGFnPScgLWZuby1idWlsdGluJworICBmaQorZmkKKworIyBTZWUgaWYgdGhlIGxpbmtlciBzdXBwb3J0cyBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLgorQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCisKK2FsbG93X3VuZGVmaW5lZF9mbGFnPQorbm9fdW5kZWZpbmVkX2ZsYWc9CituZWVkX2xpYl9wcmVmaXg9dW5rbm93bgorbmVlZF92ZXJzaW9uPXVua25vd24KKyMgd2hlbiB5b3Ugc2V0IG5lZWRfdmVyc2lvbiB0byBubywgbWFrZSBzdXJlIGl0IGRvZXMgbm90IGNhdXNlIC1zZXRfdmVyc2lvbgorIyBmbGFncyB0byBiZSBsZWZ0IHdpdGhvdXQgYXJndW1lbnRzCithcmNoaXZlX2NtZHM9CithcmNoaXZlX2V4cHN5bV9jbWRzPQorb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0KK29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzPQorZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPQord2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9Cit0aHJlYWRfc2FmZV9mbGFnX3NwZWM9CitoYXJkY29kZV9pbnRvX2xpYnM9bm8KK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9CitoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPQoraGFyZGNvZGVfZGlyZWN0PW5vCitoYXJkY29kZV9taW51c19MPW5vCitoYXJkY29kZV9zaGxpYnBhdGhfdmFyPXVuc3VwcG9ydGVkCitydW5wYXRoX3Zhcj0KK2xpbmtfYWxsX2RlcGxpYnM9dW5rbm93bgorYWx3YXlzX2V4cG9ydF9zeW1ib2xzPW5vCitleHBvcnRfc3ltYm9sc19jbWRzPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8IHNlZCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKyMgaW5jbHVkZV9leHBzeW1zIHNob3VsZCBiZSBhIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIHN5bWJvbHMgdG8gYmUgKmFsd2F5cyoKKyMgaW5jbHVkZWQgaW4gdGhlIHN5bWJvbCBsaXN0CitpbmNsdWRlX2V4cHN5bXM9CisjIGV4Y2x1ZGVfZXhwc3ltcyBjYW4gYmUgYW4gZWdyZXAgcmVndWxhciBleHByZXNzaW9uIG9mIHN5bWJvbHMgdG8gZXhjbHVkZQorIyBpdCB3aWxsIGJlIHdyYXBwZWQgYnkgYCAoJyBhbmQgYCkkJywgc28gb25lIG11c3Qgbm90IG1hdGNoIGJlZ2lubmluZyBvcgorIyBlbmQgb2YgbGluZS4gIEV4YW1wbGU6IGBhfGJjfC4qZC4qJyB3aWxsIGV4Y2x1ZGUgdGhlIHN5bWJvbHMgYGEnIGFuZCBgYmMnLAorIyBhcyB3ZWxsIGFzIGFueSBzeW1ib2wgdGhhdCBjb250YWlucyBgZCcuCitleGNsdWRlX2V4cHN5bXM9Il9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIKKyMgQWx0aG91Z2ggX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGlzIGEgdmFsaWQgc3ltYm9sIEMgbmFtZSwgbW9zdCBhLm91dAorIyBwbGF0Zm9ybXMgKGFiKXVzZSBpdCBpbiBQSUMgY29kZSwgYnV0IHRoZWlyIGxpbmtlcnMgZ2V0IGNvbmZ1c2VkIGlmCisjIHRoZSBzeW1ib2wgaXMgZXhwbGljaXRseSByZWZlcmVuY2VkLiAgU2luY2UgcG9ydGFibGUgY29kZSBjYW5ub3QKKyMgcmVseSBvbiB0aGlzIHN5bWJvbCBuYW1lLCBpdCdzIHByb2JhYmx5IGZpbmUgdG8gbmV2ZXIgaW5jbHVkZSBpdCBpbgorIyBwcmVsb2FkZWQgc3ltYm9sIHRhYmxlcy4KK2V4dHJhY3RfZXhwc3ltc19jbWRzPQorCitjYXNlICRob3N0X29zIGluCitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgICMgRklYTUU6IHRoZSBNU1ZDKysgcG9ydCBoYXNuJ3QgYmVlbiB0ZXN0ZWQgaW4gYSBsb29vb25nIHRpbWUKKyAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKKyAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KKyAgaWYgdGVzdCAiJEdDQyIgIT0geWVzOyB0aGVuCisgICAgd2l0aF9nbnVfbGQ9bm8KKyAgZmkKKyAgOzsKK29wZW5ic2QqKQorICB3aXRoX2dudV9sZD1ubworICA7OworZXNhYworCitsZF9zaGxpYnM9eWVzCitpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5CisgIHdsYXJjPScke3dsfScKKworICAjIFNlZSBpZiBHTlUgbGQgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICBhaXgzKiB8IGFpeDQqIHwgYWl4NSopCisgICAgIyBPbiBBSVgsIHRoZSBHTlUgbGlua2VyIGlzIHZlcnkgYnJva2VuCisgICAgIyBOb3RlOkNoZWNrIEdOVSBsaW5rZXIgb24gQUlYIDUtSUE2NCB3aGVuL2lmIGl0IGJlY29tZXMgYXZhaWxhYmxlLgorICAgIGxkX3NobGlicz1ubworICAgIGNhdCA8PEVPRiAxPiYyCisKKyoqKiBXYXJuaW5nOiB0aGUgR05VIGxpbmtlciwgYXQgbGVhc3QgdXAgdG8gcmVsZWFzZSAyLjkuMSwgaXMgcmVwb3J0ZWQKKyoqKiB0byBiZSB1bmFibGUgdG8gcmVsaWFibHkgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gQUlYLgorKioqIFRoZXJlZm9yZSwgbGlidG9vbCBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgSWYgeW91CisqKiogcmVhbGx5IGNhcmUgZm9yIHNoYXJlZCBsaWJyYXJpZXMsIHlvdSBtYXkgd2FudCB0byBtb2RpZnkgeW91ciBQQVRICisqKiogc28gdGhhdCBhIG5vbi1HTlUgbGlua2VyIGlzIGZvdW5kLCBhbmQgdGhlbiByZXN0YXJ0LgorCitFT0YKKyAgICA7OworCisgIGFtaWdhb3MqKQorICAgIGFyY2hpdmVfY21kcz0nJHJtICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSICRBUl9GTEFHUyAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG91dHB1dF9vYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKworICAgICMgU2FtdWVsIEEuIEZhbHZvIElJIDxrYzV0amFAZG9scGhpbi5vcGVucHJvamVjdHMubmV0PiByZXBvcnRzCisgICAgIyB0aGF0IHRoZSBzZW1hbnRpY3Mgb2YgZHluYW1pYyBsaWJyYXJpZXMgb24gQW1pZ2FPUywgYXQgbGVhc3QgdXAKKyAgICAjIHRvIHZlcnNpb24gNCwgaXMgdG8gc2hhcmUgZGF0YSBhbW9uZyBtdWx0aXBsZSBwcm9ncmFtcyBsaW5rZWQKKyAgICAjIHdpdGggdGhlIHNhbWUgZHluYW1pYyBsaWJyYXJ5LiAgU2luY2UgdGhpcyBkb2Vzbid0IG1hdGNoIHRoZQorICAgICMgYmVoYXZpb3Igb2Ygc2hhcmVkIGxpYnJhcmllcyBvbiBvdGhlciBwbGF0Zm9ybXMsIHdlIGNhbiB1c2UKKyAgICAjIHRoZW0uCisgICAgbGRfc2hsaWJzPW5vCisgICAgOzsKKworICBiZW9zKikKKyAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBlZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAorICAgICAgIyBKb3NlcGggQmVja2VuYmFjaCA8anJiM0BiZXN0LmNvbT4gc2F5cyBzb21lIHJlbGVhc2VzIG9mIGdjYworICAgICAgIyBzdXBwb3J0IC0tdW5kZWZpbmVkLiAgVGhpcyBkZXNlcnZlcyBzb21lIGludmVzdGlnYXRpb24uICBGSVhNRQorICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLW5vc3RhcnQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgZWxzZQorICAgICAgbGRfc2hsaWJzPW5vCisgICAgZmkKKyAgICA7OworCisgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgICAjIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsIGFzIHRoZXJlIGlzCisgICAgIyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKKyAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9eWVzCisKKyAgICBleHRyYWN0X2V4cHN5bXNfY21kcz0ndGVzdCAtZiAkb3V0cHV0X29iamRpci9pbXBnZW4uYyB8fCBcCisgICAgICBzZWQgLWUgIi9eIyBcL1wqIGltcGdlblwuYyBzdGFydHMgaGVyZSBcKlwvLywvXiMgXC9cKiBpbXBnZW4uYyBlbmRzIGhlcmUgXCpcLy8geyBzL14jIC8vO3MvXiMgKiQvLzsgcDsgfSIgLWUgZCA8ICQnJzAgPiAkb3V0cHV0X29iamRpci9pbXBnZW4uY34KKyAgICAgIHRlc3QgLWYgJG91dHB1dF9vYmpkaXIvaW1wZ2VuLmV4ZSB8fCAoY2QgJG91dHB1dF9vYmpkaXIgJiYgXAorICAgICAgaWYgdGVzdCAieCRIT1NUX0NDIiAhPSAieCIgOyB0aGVuICRIT1NUX0NDIC1vIGltcGdlbiBpbXBnZW4uYyA7IFwKKyAgICAgIGVsc2UgJENDIC1vIGltcGdlbiBpbXBnZW4uYyA7IGZpKX4KKyAgICAgICRvdXRwdXRfb2JqZGlyL2ltcGdlbiAkZGlyLyRzb3Jvb3QgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLWRlZicKKworICAgIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzPSckRExMVE9PTCAtLWFzPSRBUyAtLWRsbG5hbWUgJHNvbmFtZSAtLWRlZiAkb3V0cHV0X29iamRpci8kc29uYW1lLWRlZiAtLW91dHB1dC1saWIgJG91dHB1dF9vYmpkaXIvJG5ld2xpYicKKworICAgICMgY3lnd2luIGFuZCBtaW5ndyBkbGxzIGhhdmUgZGlmZmVyZW50IGVudHJ5IHBvaW50cyBhbmQgc2V0cyBvZiBzeW1ib2xzCisgICAgIyB0byBleGNsdWRlLgorICAgICMgRklYTUU6IHdoYXQgYWJvdXQgdmFsdWVzIGZvciBNU1ZDPworICAgIGRsbF9lbnRyeT1fX2N5Z3dpbl9kbGxfZW50cnlAMTIKKyAgICBkbGxfZXhjbHVkZV9zeW1ib2xzPURsbE1haW5AMTIsX2N5Z3dpbl9kbGxfZW50cnlAMTIsX2N5Z3dpbl9ub25jeWd3aW5fZGxsX2VudHJ5QDEyfgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBtaW5ndyopCisgICAgICAjIG1pbmd3IHZhbHVlcworICAgICAgZGxsX2VudHJ5PV9EbGxNYWluQ1JUU3RhcnR1cEAxMgorICAgICAgZGxsX2V4Y2x1ZGVfc3ltYm9scz1EbGxNYWluQDEyLERsbE1haW5DUlRTdGFydHVwQDEyLERsbEVudHJ5UG9pbnRAMTJ+CisgICAgICA7OworICAgIGVzYWMKKworICAgICMgbWluZ3cgYW5kIGN5Z3dpbiBkaWZmZXIsIGFuZCBpdCdzIHNpbXBsZXN0IHRvIGp1c3QgZXhjbHVkZSB0aGUgdW5pb24KKyAgICAjIG9mIHRoZSB0d28gc3ltYm9sIHNldHMuCisgICAgZGxsX2V4Y2x1ZGVfc3ltYm9scz1EbGxNYWluQDEyLF9jeWd3aW5fZGxsX2VudHJ5QDEyLF9jeWd3aW5fbm9uY3lnd2luX2RsbF9lbnRyeUAxMixEbGxNYWluQ1JUU3RhcnR1cEAxMixEbGxFbnRyeVBvaW50QDEyCisKKyAgICAjIHJlY2VudCBjeWd3aW4gYW5kIG1pbmd3IHN5c3RlbXMgc3VwcGx5IGEgc3R1YiBEbGxNYWluIHdoaWNoIHRoZSB1c2VyCisgICAgIyBjYW4gb3ZlcnJpZGUsIGJ1dCBvbiBvbGRlciBzeXN0ZW1zIHdlIGhhdmUgdG8gc3VwcGx5IG9uZSAoaW4gbHRkbGwuYykKKyAgICBpZiB0ZXN0ICJ4JGx0X2N2X25lZWRfZGxsbWFpbiIgPSAieHllcyI7IHRoZW4KKyAgICAgIGx0ZGxsX29iaj0nJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1sdGRsbC4nIiRhY19vYmpleHQgIgorICAgICAgbHRkbGxfY21kcz0ndGVzdCAtZiAkb3V0cHV0X29iamRpci8kc29uYW1lLWx0ZGxsLmMgfHwgc2VkIC1lICIvXiMgXC9cKiBsdGRsbFwuYyBzdGFydHMgaGVyZSBcKlwvLywvXiMgXC9cKiBsdGRsbC5jIGVuZHMgaGVyZSBcKlwvLyB7IHMvXiMgLy87IHA7IH0iIC1lIGQgPCAkJycwID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1sdGRsbC5jfgorCXRlc3QgLWYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1sdGRsbC4kYWNfb2JqZXh0IHx8IChjZCAkb3V0cHV0X29iamRpciAmJiAkQ0MgLWMgJHNvbmFtZS1sdGRsbC5jKX4nCisgICAgZWxzZQorICAgICAgbHRkbGxfb2JqPQorICAgICAgbHRkbGxfY21kcz0KKyAgICBmaQorCisgICAgIyBFeHRyYWN0IHRoZSBzeW1ib2wgZXhwb3J0IGxpc3QgZnJvbSBhbiBgLS1leHBvcnQtYWxsJyBkZWYgZmlsZSwKKyAgICAjIHRoZW4gcmVnZW5lcmF0ZSB0aGUgZGVmIGZpbGUgZnJvbSB0aGUgc3ltYm9sIGV4cG9ydCBsaXN0LCBzbyB0aGF0CisgICAgIyB0aGUgY29tcGlsZWQgZGxsIG9ubHkgZXhwb3J0cyB0aGUgc3ltYm9sIGV4cG9ydCBsaXN0LgorICAgICMgQmUgY2FyZWZ1bCBub3QgdG8gc3RyaXAgdGhlIERBVEEgdGFnIGxlZnQgYmUgbmV3ZXIgZGxsdG9vbHMuCisgICAgZXhwb3J0X3N5bWJvbHNfY21kcz0iJGx0ZGxsX2NtZHMiJworICAgICAgJERMTFRPT0wgLS1leHBvcnQtYWxsIC0tZXhjbHVkZS1zeW1ib2xzICckZGxsX2V4Y2x1ZGVfc3ltYm9scycgLS1vdXRwdXQtZGVmICRvdXRwdXRfb2JqZGlyLyRzb25hbWUtZGVmICckbHRkbGxfb2JqJyRsaWJvYmpzICRjb252ZW5pZW5jZX4KKyAgICAgIHNlZCAtZSAiMSwvRVhQT1JUUy9kIiAtZSAicy8gQCBbWzAtOV1dKi8vIiAtZSAicy8gKjsuKiQvLyIgPCAkb3V0cHV0X29iamRpci8kc29uYW1lLWRlZiA+ICRleHBvcnRfc3ltYm9scycKKworICAgICMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKKyAgICAjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXMuCisgICAgIyBJZiBEQVRBIHRhZ3MgZnJvbSBhIHJlY2VudCBkbGx0b29sIGFyZSBwcmVzZW50LCBob25vdXIgdGhlbSEKKyAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSdpZiB0ZXN0ICJ4YGhlYWQgLTEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgorCWNwICRleHBvcnRfc3ltYm9scyAkb3V0cHV0X29iamRpci8kc29uYW1lLWRlZjsKKyAgICAgIGVsc2UKKwllY2hvIEVYUE9SVFMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLWRlZjsKKwlfbHRfaGludD0xOworCWNhdCAkZXhwb3J0X3N5bWJvbHMgfCB3aGlsZSByZWFkIHN5bWJvbDsgZG8KKwkgc2V0IGR1bW15IFwkc3ltYm9sOworCSBjYXNlIFxbJF0jIGluCisJICAgMikgZWNobyAiICAgXFskXTIgQCBcJF9sdF9oaW50IDsgIiA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLWRlZjs7CisJICAgKikgZWNobyAiICAgICBcWyRdMiBAIFwkX2x0X2hpbnQgXFskXTMgOyAiID4+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUtZGVmOzsKKwkgZXNhYzsKKwkgX2x0X2hpbnQ9YGV4cHIgMSArIFwkX2x0X2hpbnRgOworCWRvbmU7CisgICAgICBmaX4KKyAgICAgICciJGx0ZGxsX2NtZHMiJworICAgICAgJENDIC1XbCwtLWJhc2UtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLWJhc2UgJyRsdF9jdl9jY19kbGxfc3dpdGNoJyAtV2wsLWUsJyRkbGxfZW50cnknIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJyRsdGRsbF9vYmonJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfgorICAgICAgJERMTFRPT0wgLS1hcz0kQVMgLS1kbGxuYW1lICRzb25hbWUgLS1leGNsdWRlLXN5bWJvbHMgJyRkbGxfZXhjbHVkZV9zeW1ib2xzJyAtLWRlZiAkb3V0cHV0X29iamRpci8kc29uYW1lLWRlZiAtLWJhc2UtZmlsZSAkb3V0cHV0X29iamRpci8kc29uYW1lLWJhc2UgLS1vdXRwdXQtZXhwICRvdXRwdXRfb2JqZGlyLyRzb25hbWUtZXhwfgorICAgICAgJENDIC1XbCwtLWJhc2UtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLWJhc2UgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1leHAgJyRsdF9jdl9jY19kbGxfc3dpdGNoJyAtV2wsLWUsJyRkbGxfZW50cnknIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJyRsdGRsbF9vYmonJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfgorICAgICAgJERMTFRPT0wgLS1hcz0kQVMgLS1kbGxuYW1lICRzb25hbWUgLS1leGNsdWRlLXN5bWJvbHMgJyRkbGxfZXhjbHVkZV9zeW1ib2xzJyAtLWRlZiAkb3V0cHV0X29iamRpci8kc29uYW1lLWRlZiAtLWJhc2UtZmlsZSAkb3V0cHV0X29iamRpci8kc29uYW1lLWJhc2UgLS1vdXRwdXQtZXhwICRvdXRwdXRfb2JqZGlyLyRzb25hbWUtZXhwIC0tb3V0cHV0LWxpYiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kbGwuYX4KKyAgICAgICRDQyAkb3V0cHV0X29iamRpci8kc29uYW1lLWV4cCAnJGx0X2N2X2NjX2RsbF9zd2l0Y2gnIC1XbCwtZSwnJGRsbF9lbnRyeScgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAnJGx0ZGxsX29iaickbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgOzsKKworICBuZXRic2QqKQorICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLW8gJGxpYicKKyAgICAgIHdsYXJjPQorICAgIGVsc2UKKyAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgLW5vZGVmYXVsdGxpYnMgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAtbm9kZWZhdWx0bGlicyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICBmaQorICAgIDs7CisKKyAgc29sYXJpcyogfCBzeXN2NSopCisgICAgaWYgJExEIC12IDI+JjEgfCBlZ3JlcCAnQkZEIDJcLjgnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICBsZF9zaGxpYnM9bm8KKyAgICAgIGNhdCA8PEVPRiAxPiYyCisKKyoqKiBXYXJuaW5nOiBUaGUgcmVsZWFzZXMgMi44Liogb2YgdGhlIEdOVSBsaW5rZXIgY2Fubm90IHJlbGlhYmx5CisqKiogY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gU29sYXJpcyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCisqKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCisqKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjkuMSBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQorKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKKyoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgorCitFT0YKKyAgICBlbGlmICRMRCAtLWhlbHAgMj4mMSB8IGVncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICBlbHNlCisgICAgICBsZF9zaGxpYnM9bm8KKyAgICBmaQorICAgIDs7CisKKyAgc3Vub3M0KikKKyAgICBhcmNoaXZlX2NtZHM9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgd2xhcmM9CisgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICA7OworCisgICopCisgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZWdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgIGVsc2UKKyAgICAgIGxkX3NobGlicz1ubworICAgIGZpCisgICAgOzsKKyAgZXNhYworCisgIGlmIHRlc3QgIiRsZF9zaGxpYnMiID0geWVzOyB0aGVuCisgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS0tcnBhdGggJHt3bH0kbGliZGlyJworICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgICAgICAjIGRsbHRvb2wgZG9lc24ndCB1bmRlcnN0YW5kIC0td2hvbGUtYXJjaGl2ZSBldC4gYWwuCisgICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0KKyAgICAgIDs7CisgICAgKikKKyAgICAgICMgYW5jaWVudCBHTlUgbGQgZGlkbid0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlIGV0LiBhbC4KKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGVncmVwICduby13aG9sZS1hcmNoaXZlJyA+IC9kZXYvbnVsbDsgdGhlbgorCXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJworICAgICAgZWxzZQorCXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPQorICAgICAgZmkKKyAgICAgIDs7CisgICAgZXNhYworICBmaQorZWxzZQorICAjIFBPUlRNRSBmaWxsIGluIGEgZGVzY3JpcHRpb24gb2YgeW91ciBzeXN0ZW0ncyBsaW5rZXIgKG5vdCBHTlUgbGQpCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4MyopCisgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKKyAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9eWVzCisgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJExEIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtYkU6JGV4cG9ydF9zeW1ib2xzIC1UNTEyIC1INTEyIC1iTTpTUkV+JEFSICRBUl9GTEFHUyAkbGliICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCisgICAgIyBOb3RlOiB0aGlzIGxpbmtlciBoYXJkY29kZXMgdGhlIGRpcmVjdG9yaWVzIGluIExJQlBBVEggaWYgdGhlcmUKKyAgICAjIGFyZSBubyBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgLUwuCisgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAmJiB0ZXN0IC16ICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KKyAgICAgICMgTmVpdGhlciBkaXJlY3QgaGFyZGNvZGluZyBub3Igc3RhdGljIGxpbmtpbmcgaXMgc3VwcG9ydGVkIHdpdGggYQorICAgICAgIyBicm9rZW4gY29sbGVjdDIuCisgICAgICBoYXJkY29kZV9kaXJlY3Q9dW5zdXBwb3J0ZWQKKyAgICBmaQorICAgIDs7CisKKyAgYWl4NCogfCBhaXg1KikKKyAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgICAgIyBPbiBJQTY0LCB0aGUgbGlua2VyIGRvZXMgcnVuIHRpbWUgbGlua2luZyBieSBkZWZhdWx0LCBzbyB3ZSBkb24ndAorICAgICAgIyBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCisgICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisgICAgICBleHBfc3ltX2ZsYWc9Jy1CZXhwb3J0JworICAgICAgbm9fZW50cnlfZmxhZz0iIgorICAgIGVsc2UKKyAgICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKworICAgICAgIyBUZXN0IGlmIHdlIGFyZSB0cnlpbmcgdG8gdXNlIHJ1biB0aW1lIGxpbmtpbmcgb3Igbm9ybWFsCisgICAgICAjIEFJWCBzdHlsZSBsaW5raW5nLiBJZiAtYnJ0bCBpcyBzb21ld2hlcmUgaW4gTERGTEFHUywgd2UKKyAgICAgICMgbmVlZCB0byBkbyBydW50aW1lIGxpbmtpbmcuCisgICAgICBjYXNlICRob3N0X29zIGluIGFpeDQuW1syM11dfGFpeDQuW1syM11dLip8YWl4NSopCisJZm9yIGxkX2ZsYWcgaW4gJExERkxBR1M7IGRvCisJICBpZiAodGVzdCAkbGRfZmxhZyA9ICItYnJ0bCIgfHwgdGVzdCAkbGRfZmxhZyA9ICItV2wsLWJydGwiKTsgdGhlbgorCSAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPXllcworCSAgICBicmVhaworCSAgZmkKKwlkb25lCisgICAgICBlc2FjCisKKyAgICAgIGV4cF9zeW1fZmxhZz0nLWJleHBvcnQnCisgICAgICBub19lbnRyeV9mbGFnPSctYm5vZW50cnknCisgICAgZmkKKworICAgICMgV2hlbiBsYXJnZSBleGVjdXRhYmxlcyBvciBzaGFyZWQgb2JqZWN0cyBhcmUgYnVpbHQsIEFJWCBsZCBjYW4KKyAgICAjIGhhdmUgcHJvYmxlbXMgY3JlYXRpbmcgdGhlIHRhYmxlIG9mIGNvbnRlbnRzLiAgSWYgbGlua2luZyBhIGxpYnJhcnkKKyAgICAjIG9yIHByb2dyYW0gcmVzdWx0cyBpbiAiZXJyb3IgVE9DIG92ZXJmbG93IiBhZGQgLW1taW5pbWFsLXRvYyB0bworICAgICMgQ1hYRkxBR1MvQ0ZMQUdTIGZvciBnKysvZ2NjLiAgSW4gdGhlIGNhc2VzIHdoZXJlIHRoYXQgaXMgbm90CisgICAgIyBlbm91Z2ggdG8gZml4IHRoZSBwcm9ibGVtLCBhZGQgLVdsLC1iYmlndG9jIHRvIExERkxBR1MuCisKKyAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgYXJjaGl2ZV9jbWRzPScnCisgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0nOicKKyAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgICAgY2FzZSAkaG9zdF9vcyBpbiBhaXg0LltbMDEyXV18YWl4NC5bWzAxMl1dLiopCisJY29sbGVjdDJuYW1lPWAke0NDfSAtcHJpbnQtcHJvZy1uYW1lPWNvbGxlY3QyYAorCWlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmIFwKKwkgIHN0cmluZ3MgIiRjb2xsZWN0Mm5hbWUiIHwgZ3JlcCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKKwl0aGVuCisJICAjIFdlIGhhdmUgcmV3b3JrZWQgY29sbGVjdDIKKwkgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKwllbHNlCisJICAjIFdlIGhhdmUgb2xkIGNvbGxlY3QyCisJICBoYXJkY29kZV9kaXJlY3Q9dW5zdXBwb3J0ZWQKKwkgICMgSXQgZmFpbHMgdG8gZmluZCB1bmluc3RhbGxlZCBsaWJyYXJpZXMgd2hlbiB0aGUgdW5pbnN0YWxsZWQKKwkgICMgcGF0aCBpcyBub3QgbGlzdGVkIGluIHRoZSBsaWJwYXRoLiAgU2V0dGluZyBoYXJkY29kZV9taW51c19MCisJICAjIHRvIHVuc3VwcG9ydGVkIGZvcmNlcyByZWxpbmtpbmcKKwkgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisJICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPQorCWZpCisgICAgICBlc2FjCisKKyAgICAgIHNoYXJlZF9mbGFnPSctc2hhcmVkJworICAgIGVsc2UKKyAgICAgICMgbm90IHVzaW5nIGdjYworICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwlzaGFyZWRfZmxhZz0nJHt3bH0tRycKKyAgICAgIGVsc2UKKwlpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkgIHNoYXJlZF9mbGFnPScke3dsfS1HJworCWVsc2UKKwkgIHNoYXJlZF9mbGFnPScke3dsfS1iTTpTUkUnCisJZmkKKyAgICAgIGZpCisgICAgZmkKKworICAgICMgSXQgc2VlbXMgdGhhdCAtYmV4cGFsbCBjYW4gZG8gc3RyYW5nZSB0aGluZ3MsIHNvIGl0IGlzIGJldHRlciB0bworICAgICMgZ2VuZXJhdGUgYSBsaXN0IG9mIHN5bWJvbHMgdG8gZXhwb3J0LgorICAgIGFsd2F5c19leHBvcnRfc3ltYm9scz15ZXMKKyAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKyAgICAgICMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1bnRpbWUgbG9hZGluZyBmbGFncyAoLWJydGwpLAorICAgICAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9Jy1iZXJvaycKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6L3Vzci9saWI6L2xpYicKKyAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9IlwkQ0MiJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyBgaWYgdGVzdCAieCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiAhPSAieCI7IHRoZW4gZWNobyAiJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSI7IGVsc2UgOjsgZmlgICciXCR7d2x9JG5vX2VudHJ5X2ZsYWcgXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzICRzaGFyZWRfZmxhZyIKKyAgICBlbHNlCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LVIgJGxpYmRpcjovdXNyL2xpYjovbGliJworCWFsbG93X3VuZGVmaW5lZF9mbGFnPSIteiBub2RlZnMiCisJYXJjaGl2ZV9leHBzeW1fY21kcz0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LWgkc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICciXCR7d2x9JG5vX2VudHJ5X2ZsYWcgXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzIgorICAgICAgZWxzZQorCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LWJub2xpYnBhdGggJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjovdXNyL2xpYjovbGliJworCSMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1biB0aW1lIGxvYWRpbmcgZmxhZ3MsCisJIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorCWFsbG93X3VuZGVmaW5lZF9mbGFnPScke3dsfS1iZXJvaycKKwkjIFRoaXMgaXMgYSBiaXQgc3RyYW5nZSwgYnV0IGlzIHNpbWlsYXIgdG8gaG93IEFJWCB0cmFkaXRpb25hbGx5IGJ1aWxkcworCSMgaXQncyBzaGFyZWQgbGlicmFyaWVzLgorCWFyY2hpdmVfZXhwc3ltX2NtZHM9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHthbGxvd191bmRlZmluZWRfZmxhZ30gJyJcJHt3bH0kbm9fZW50cnlfZmxhZyBcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMiJyB+JEFSIC1jcmxvICRvYmpkaXIvJGxpYm5hbWUkcmVsZWFzZS5hICRvYmpkaXIvJHNvbmFtZScKKyAgICAgIGZpCisgICAgZmkKKyAgICA7OworCisgIGFtaWdhb3MqKQorICAgIGFyY2hpdmVfY21kcz0nJHJtICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSICRBUl9GTEFHUyAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG91dHB1dF9vYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAjIHNlZSBjb21tZW50IGFib3V0IGRpZmZlcmVudCBzZW1hbnRpY3Mgb24gdGhlIEdOVSBsZCBzZWN0aW9uCisgICAgbGRfc2hsaWJzPW5vCisgICAgOzsKKworICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKKyAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorICAgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKKyAgICAjIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyAnCisgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKKyAgICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmxpYiBmaWxlcywgbm90IC5hIGZpbGVzLgorICAgIGxpYmV4dD1saWIKKyAgICAjIEZJWE1FOiBTZXR0aW5nIGxpbmtuYW1lcyBoZXJlIGlzIGEgYmFkIGhhY2suCisgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLW8gJGxpYiAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgYGVjaG8gIiRkZXBsaWJzIiB8IHNlZCAtZSAnXCcncy8gLWxjJC8vJ1wnJ2AgLWxpbmsgLWRsbH5saW5rbmFtZXM9JworICAgICMgVGhlIGxpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgYnVpbGQgYSAubGliIGZpbGUgaWYgd2UgYnVpbGQgYSBETEwuCisgICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0ndHJ1ZScKKyAgICAjIEZJWE1FOiBTaG91bGQgbGV0IHRoZSB1c2VyIHNwZWNpZnkgdGhlIGxpYiBwcm9ncmFtLgorICAgIG9sZF9hcmNoaXZlX2NtZHM9J2xpYiAvT1VUOiRvbGRsaWIkb2xkb2JqcyRvbGRfZGVwbGlicycKKyAgICBmaXhfc3JjZmlsZV9wYXRoPSdgY3lncGF0aCAtdyAiJHNyY2ZpbGUiYCcKKyAgICA7OworCisgIGRhcndpbiogfCByaGFwc29keSopCisgICAgY2FzZSAiJGhvc3Rfb3MiIGluCisgICAgcmhhcHNvZHkqIHwgZGFyd2luMS5bWzAxMl1dKQorICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9Jy11bmRlZmluZWQgc3VwcHJlc3MnCisgICAgICA7OworICAgICopICMgRGFyd2luIDEuMyBvbgorICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9Jy1mbGF0X25hbWVzcGFjZSAtdW5kZWZpbmVkIHN1cHByZXNzJworICAgICAgOzsKKyAgICBlc2FjCisgICAgIyBGSVhNRTogUmVseWluZyBvbiBwb3NpeHkgJCgpIHdpbGwgY2F1c2UgcHJvYmxlbXMgZm9yCisgICAgIyAgICAgICAgY3Jvc3MtY29tcGlsYXRpb24sIGJ1dCB1bmZvcnR1bmF0ZWx5IHRoZSBlY2hvIHRlc3RzIGRvIG5vdAorICAgICMgICAgICAgIHlldCBkZXRlY3QgenNoIGVjaG8ncyByZW1vdmFsIG9mIFwgZXNjYXBlcy4KKyAgICBhcmNoaXZlX2NtZHM9JyRub25vcHQgJCh0ZXN0ICJ4JG1vZHVsZSIgPSB4eWVzICYmIGVjaG8gLWJ1bmRsZSB8fCBlY2hvIC1keW5hbWljbGliKSAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyRsaW5rZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nJworICAgICMgV2UgbmVlZCB0byBhZGQgJ18nIHRvIHRoZSBzeW1ib2xzIGluICRleHBvcnRfc3ltYm9scyBmaXJzdAorICAgICNhcmNoaXZlX2V4cHN5bV9jbWRzPSIkYXJjaGl2ZV9jbWRzIicgJiYgc3RyaXAgLXMgJGV4cG9ydF9zeW1ib2xzJworICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9Jy1hbGxfbG9hZCAkY29udmVuaWVuY2UnCisgICAgOzsKKworICBmcmVlYnNkMSopCisgICAgbGRfc2hsaWJzPW5vCisgICAgOzsKKworICAjIEZyZWVCU0QgMi4yLlswMTJdIGFsbG93cyB1cyB0byBpbmNsdWRlIGMrK3J0MC5vIHRvIGdldCBDKysgY29uc3RydWN0b3IKKyAgIyBzdXBwb3J0LiAgRnV0dXJlIHZlcnNpb25zIGRvIHRoaXMgYXV0b21hdGljYWxseSwgYnV0IGFuIGV4cGxpY2l0IGMrK3J0MC5vCisgICMgZG9lcyBub3QgYnJlYWsgYW55dGhpbmcsIGFuZCBoZWxwcyBzaWduaWZpY2FudGx5IChhdCB0aGUgY29zdCBvZiBhIGxpdHRsZQorICAjIGV4dHJhIHNwYWNlKS4KKyAgZnJlZWJzZDIuMiopCisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC91c3IvbGliL2MrK3J0MC5vJworICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKKyAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgIDs7CisKKyAgIyBVbmZvcnR1bmF0ZWx5LCBvbGRlciB2ZXJzaW9ucyBvZiBGcmVlQlNEIDIgZG8gbm90IGhhdmUgdGhpcyBmZWF0dXJlLgorICBmcmVlYnNkMiopCisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICBoYXJkY29kZV9taW51c19MPXllcworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICA7OworCisgICMgRnJlZUJTRCAzIGFuZCBncmVhdGVyIHVzZXMgZ2NjIC1zaGFyZWQgdG8gZG8gc2hhcmVkIGxpYnJhcmllcy4KKyAgZnJlZWJzZCopCisgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICA7OworCisgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBocHV4OSopIGFyY2hpdmVfY21kcz0nJHJtICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JExEIC1iICtiICRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInIDs7CisgICAgKikgYXJjaGl2ZV9jbWRzPSckTEQgLWIgK2ggJHNvbmFtZSArYiAkaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyA7OworICAgIGVzYWMKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKKyAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKyAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgaGFyZGNvZGVfbWludXNfTD15ZXMgIyBOb3QgaW4gdGhlIHNlYXJjaCBQQVRILCBidXQgYXMgdGhlIGRlZmF1bHQKKwkJCSAjIGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tRScKKyAgICA7OworCisgIGlyaXg1KiB8IGlyaXg2KikKKyAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisgICAgZWxzZQorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworICAgIGZpCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCisgICAgOzsKKworICBuZXRic2QqKQorICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICMgYS5vdXQKKyAgICBlbHNlCisgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICAgICAjIEVMRgorICAgIGZpCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgOzsKKworICBuZXdzb3M2KQorICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgIDs7CisKKyAgb3BlbmJzZCopCisgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKyAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCisgICAgZWxzZQorICAgICAgY2FzZSAiJGhvc3Rfb3MiIGluCisgICAgICBvcGVuYnNkW1swMV1dLiogfCBvcGVuYnNkMi5bWzAtN11dIHwgb3BlbmJzZDIuW1swLTddXS4qKQorCWFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisgICAgICAgIDs7CisgICAgICAqKQorICAgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgZmkKKyAgICA7OworCisgIG9zMiopCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKKyAgICBhcmNoaXZlX2NtZHM9JyRlY2hvICJMSUJSQVJZICRsaWJuYW1lIElOSVRJTlNUQU5DRSIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gIkRFU0NSSVBUSU9OIFwiJGxpYm5hbWVcIiIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvIERBVEEgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvICIgU0lOR0xFIE5PTlNIQVJFRCIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvIEVYUE9SVFMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVteGV4cCAkbGlib2JqcyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JENDIC1aZGxsIC1aY3J0ZGxsIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKKyAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSdlbXhpbXAgLW8gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuYSAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCisgICAgOzsKKworICBvc2YzKikKKyAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICBlbHNlCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworICAgIGZpCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorICAgIDs7CisKKyAgb3NmNCogfCBvc2Y1KikJIyBhcyBvc2YzKiB3aXRoIHRoZSBhZGRpdGlvbiBvZiAtbXN5bSBmbGFnCisgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKyAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tbXN5bSAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICBlbHNlCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworICAgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nZm9yIGkgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbyBwcmludGYgIi1leHBvcnRlZF9zeW1ib2wgIiA+PiAkbGliLmV4cDsgZWNobyAiXCRpIiA+PiAkbGliLmV4cDsgZG9uZTsgZWNobyAiLWhpZGRlbiI+PiAkbGliLmV4cH4KKyAgICAgICRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWlucHV0ICRsaWIuZXhwICRsaW5rZXJfZmxhZ3MgJGxpYm9ianMgJGRlcGxpYnMgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4kcm0gJGxpYi5leHAnCisKKyAgICAgICNCb3RoIGMgYW5kIGN4eCBjb21waWxlciBzdXBwb3J0IC1ycGF0aCBkaXJlY3RseQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLXJwYXRoICRsaWJkaXInCisgICAgZmkKKyAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKyAgICA7OworCisgIHNjbzMuMnY1KikKKyAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKyAgICBoYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKKyAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUJleHBvcnQnCisgICAgOzsKKworICBzb2xhcmlzKikKKyAgICAjIGdjYyAtLXZlcnNpb24gPCAzLjAgd2l0aG91dCBiaW51dGlscyBjYW5ub3QgY3JlYXRlIHNlbGYgY29udGFpbmVkCisgICAgIyBzaGFyZWQgbGlicmFyaWVzIHJlbGlhYmx5LCByZXF1aXJpbmcgbGliZ2NjLmEgdG8gcmVzb2x2ZSBzb21lIG9mCisgICAgIyB0aGUgb2JqZWN0IHN5bWJvbHMgZ2VuZXJhdGVkIGluIHNvbWUgY2FzZXMuICBMaWJyYXJpZXMgdGhhdCB1c2UKKyAgICAjIGFzc2VydCBuZWVkIGxpYmdjYy5hIHRvIHJlc29sdmUgX19lcHJpbnRmLCBmb3IgZXhhbXBsZS4gIExpbmtpbmcKKyAgICAjIGEgY29weSBvZiBsaWJnY2MuYSBpbnRvIGV2ZXJ5IHNoYXJlZCBsaWJyYXJ5IHRvIGd1YXJhbnRlZSByZXNvbHZpbmcKKyAgICAjIHN1Y2ggc3ltYm9scyBjYXVzZXMgb3RoZXIgcHJvYmxlbXM6ICBBY2NvcmRpbmcgdG8gVGltIFZhbiBIb2xkZXIKKyAgICAjIDx0aW0udmFuLmhvbGRlckBwYW5kb3JhLmJlPiwgQysrIGxpYnJhcmllcyBlbmQgdXAgd2l0aCBhIHNlcGFyYXRlCisgICAgIyAodG8gdGhlIGFwcGxpY2F0aW9uKSBleGNlcHRpb24gc3RhY2sgZm9yIG9uZSB0aGluZy4KKyAgICBub191bmRlZmluZWRfZmxhZz0nIC16IGRlZnMnCisgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICAgIGNhc2UgYCRDQyAtLXZlcnNpb24gMj4vZGV2L251bGxgIGluCisgICAgICBbWzEyXV0uKikKKwljYXQgPDxFT0YgMT4mMgorCisqKiogV2FybmluZzogUmVsZWFzZXMgb2YgR0NDIGVhcmxpZXIgdGhhbiB2ZXJzaW9uIDMuMCBjYW5ub3QgcmVsaWFibHkKKyoqKiBjcmVhdGUgc2VsZiBjb250YWluZWQgc2hhcmVkIGxpYnJhcmllcyBvbiBTb2xhcmlzIHN5c3RlbXMsIHdpdGhvdXQKKyoqKiBpbnRyb2R1Y2luZyBhIGRlcGVuZGVuY3kgb24gbGliZ2NjLmEuICBUaGVyZWZvcmUsIGxpYnRvb2wgaXMgZGlzYWJsaW5nCisqKiogLW5vLXVuZGVmaW5lZCBzdXBwb3J0LCB3aGljaCB3aWxsIGF0IGxlYXN0IGFsbG93IHlvdSB0byBidWlsZCBzaGFyZWQKKyoqKiBsaWJyYXJpZXMuICBIb3dldmVyLCB5b3UgbWF5IGZpbmQgdGhhdCB3aGVuIHlvdSBsaW5rIHN1Y2ggbGlicmFyaWVzCisqKiogaW50byBhbiBhcHBsaWNhdGlvbiB3aXRob3V0IHVzaW5nIEdDQywgeW91IGhhdmUgdG8gbWFudWFsbHkgYWRkCisqKiogXGBnY2MgLS1wcmludC1saWJnY2MtZmlsZS1uYW1lXGAgdG8gdGhlIGxpbmsgY29tbWFuZC4gIFdlIHVyZ2UgeW91IHRvCisqKiogdXBncmFkZSB0byBhIG5ld2VyIHZlcnNpb24gb2YgR0NDLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gcmVidWlsZCB5b3VyCisqKiogY3VycmVudCBHQ0MgdG8gdXNlIHRoZSBHTlUgbGlua2VyIGZyb20gR05VIGJpbnV0aWxzIDIuOS4xIG9yIG5ld2VyLgorCitFT0YKKyAgICAgICAgbm9fdW5kZWZpbmVkX2ZsYWc9CisJOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICAgICMgJENDIC1zaGFyZWQgd2l0aG91dCBHTlUgbGQgd2lsbCBub3QgY3JlYXRlIGEgbGlicmFyeSBmcm9tIEMrKworICAgICMgb2JqZWN0IGZpbGVzIGFuZCBhIHN0YXRpYyBsaWJzdGRjKyssIGJldHRlciBhdm9pZCBpdCBieSBub3cKKyAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJCSRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfiRybSAkbGliLmV4cCcKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBzb2xhcmlzMi5bWzAtNV1dIHwgc29sYXJpczIuW1swLTVdXS4qKSA7OworICAgICopICMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCisgICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nLXogYWxsZXh0cmFjdCRjb252ZW5pZW5jZSAteiBkZWZhdWx0ZXh0cmFjdCcgOzsKKyAgICBlc2FjCisgICAgbGlua19hbGxfZGVwbGlicz15ZXMKKyAgICA7OworCisgIHN1bm9zNCopCisgICAgaWYgdGVzdCAieCRob3N0X3ZlbmRvciIgPSB4c2VxdWVudDsgdGhlbgorICAgICAgIyBVc2UgJENDIHRvIGxpbmsgdW5kZXIgc2VxdWVudCwgYmVjYXVzZSBpdCB0aHJvd3MgaW4gc29tZSBleHRyYSAubworICAgICAgIyBmaWxlcyB0aGF0IG1ha2UgLmluaXQgYW5kIC5maW5pIHNlY3Rpb25zIHdvcmsuCisgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtRyAke3dsfS1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgZWxzZQorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzdGF0aWMgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgIGZpCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICBoYXJkY29kZV9taW51c19MPXllcworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICA7OworCisgIHN5c3Y0KQorICAgIGlmIHRlc3QgIngkaG9zdF92ZW5kb3IiID0geHNubzsgdGhlbgorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLUJzeW1ib2xpYyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMgIyBpcyB0aGlzIHJlYWxseSB0cnVlPz8/CisgICAgZWxzZQorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9kaXJlY3Q9bm8gI01vdG9yb2xhIG1hbnVhbCBzYXlzIHllcywgYnV0IG15IHRlc3RzIHNheSB0aGV5IGxpZQorICAgIGZpCisgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICA7OworCisgIHN5c3Y0LjMqKQorICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9Jy1CZXhwb3J0JworICAgIDs7CisKKyAgc3lzdjUqKQorICAgIG5vX3VuZGVmaW5lZF9mbGFnPScgLXogdGV4dCcKKyAgICAjICRDQyAtc2hhcmVkIHdpdGhvdXQgR05VIGxkIHdpbGwgbm90IGNyZWF0ZSBhIGxpYnJhcnkgZnJvbSBDKysKKyAgICAjIG9iamVjdCBmaWxlcyBhbmQgYSBzdGF0aWMgbGlic3RkYysrLCBiZXR0ZXIgYXZvaWQgaXQgYnkgbm93CisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCQkkTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtTSAkbGliLmV4cCAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc34kcm0gJGxpYi5leHAnCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0KKyAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworICAgIDs7CisKKyAgdXRzNCopCisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICA7OworCisgIGRndXgqKQorICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgOzsKKworICBzeXN2NCpNUCopCisgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorICAgICAgaGFyZGNvZGVfcnVucGF0aF92YXI9eWVzCisgICAgICBsZF9zaGxpYnM9eWVzCisgICAgZmkKKyAgICA7OworCisgIHN5c3Y0LjJ1dzIqKQorICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgaGFyZGNvZGVfbWludXNfTD1ubworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICBoYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKKyAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorICAgIDs7CisKKyAgc3lzdjV1dzcqIHwgdW5peHdhcmU3KikKKyAgICBub191bmRlZmluZWRfZmxhZz0nJHt3bH0teiAke3dsfXRleHQnCisgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgZWxzZQorICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLUcgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgZmkKKyAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgIDs7CisKKyAgKikKKyAgICBsZF9zaGxpYnM9bm8KKyAgICA7OworICBlc2FjCitmaQorQUNfTVNHX1JFU1VMVChbJGxkX3NobGlic10pCit0ZXN0ICIkbGRfc2hsaWJzIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKworIyBDaGVjayBoYXJkY29kaW5nIGF0dHJpYnV0ZXMuCitBQ19NU0dfQ0hFQ0tJTkcoW2hvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXNdKQoraGFyZGNvZGVfYWN0aW9uPQoraWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiIHx8IFwKKyAgIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KKworICAjIFdlIGNhbiBoYXJkY29kZSBub24tZXhpc3RhbnQgZGlyZWN0b3JpZXMuCisgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiICE9IG5vICYmCisgICAgICMgSWYgdGhlIG9ubHkgbWVjaGFuaXNtIHRvIGF2b2lkIGhhcmRjb2RpbmcgaXMgc2hsaWJwYXRoX3Zhciwgd2UKKyAgICAgIyBoYXZlIHRvIHJlbGluaywgb3RoZXJ3aXNlIHdlIG1pZ2h0IGxpbmsgd2l0aCBhbiBpbnN0YWxsZWQgbGlicmFyeQorICAgICAjIHdoZW4gd2Ugc2hvdWxkIGJlIGxpbmtpbmcgd2l0aCBhIHlldC10by1iZS1pbnN0YWxsZWQgb25lCisgICAgICMjIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiAhPSBubyAmJgorICAgICB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgIT0gbm87IHRoZW4KKyAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgorICAgIGhhcmRjb2RlX2FjdGlvbj1yZWxpbmsKKyAgZWxzZQorICAgICMgV2UgY2FuIGxpbmsgd2l0aG91dCBoYXJkY29kaW5nLCBhbmQgd2UgY2FuIGhhcmRjb2RlIG5vbmV4aXN0aW5nIGRpcnMuCisgICAgaGFyZGNvZGVfYWN0aW9uPWltbWVkaWF0ZQorICBmaQorZWxzZQorICAjIFdlIGNhbm5vdCBoYXJkY29kZSBhbnl0aGluZywgb3IgZWxzZSB3ZSBjYW4gb25seSBoYXJkY29kZSBleGlzdGluZworICAjIGRpcmVjdG9yaWVzLgorICBoYXJkY29kZV9hY3Rpb249dW5zdXBwb3J0ZWQKK2ZpCitBQ19NU0dfUkVTVUxUKFskaGFyZGNvZGVfYWN0aW9uXSkKKworc3RyaXBsaWI9CitvbGRfc3RyaXBsaWI9CitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgc3RyaXBwaW5nIGxpYnJhcmllcyBpcyBwb3NzaWJsZV0pCitpZiB0ZXN0IC1uICIkU1RSSVAiICYmICRTVFJJUCAtViAyPiYxIHwgZ3JlcCAiR05VIHN0cmlwIiA+L2Rldi9udWxsOyB0aGVuCisgIHRlc3QgLXogIiRvbGRfc3RyaXBsaWIiICYmIG9sZF9zdHJpcGxpYj0iJFNUUklQIC0tc3RyaXAtZGVidWciCisgIHRlc3QgLXogIiRzdHJpcGxpYiIgJiYgc3RyaXBsaWI9IiRTVFJJUCAtLXN0cmlwLXVubmVlZGVkIgorICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKFtub10pCitmaQorCityZWxvYWRfY21kcz0nJExEJHJlbG9hZF9mbGFnIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCit0ZXN0IC16ICIkZGVwbGlic19jaGVja19tZXRob2QiICYmIGRlcGxpYnNfY2hlY2tfbWV0aG9kPXVua25vd24KKworIyBQT1JUTUUgRmlsbCBpbiB5b3VyIGxkLnNvIGNoYXJhY3RlcmlzdGljcworQUNfTVNHX0NIRUNLSU5HKFtkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3NdKQorbGlicmFyeV9uYW1lc19zcGVjPQorbGlibmFtZV9zcGVjPSdsaWIkbmFtZScKK3NvbmFtZV9zcGVjPQorcG9zdGluc3RhbGxfY21kcz0KK3Bvc3R1bmluc3RhbGxfY21kcz0KK2ZpbmlzaF9jbWRzPQorZmluaXNoX2V2YWw9CitzaGxpYnBhdGhfdmFyPQorc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXVua25vd24KK3ZlcnNpb25fdHlwZT1ub25lCitkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiIKK3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKKworY2FzZSAkaG9zdF9vcyBpbgorYWl4MyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAkbGlibmFtZS5hJworICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKworICAjIEFJWCBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyB3ZSBhcHBlbmQgYSBtYWpvciB2ZXJzaW9uIHRvIHRoZSBuYW1lLgorICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCisgIDs7CisKK2FpeDQqIHwgYWl4NSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgICMgQUlYIDUgc3VwcG9ydHMgSUE2NAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICRsaWJuYW1lLnNvJworICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGVsc2UKKyAgICAjIFdpdGggR0NDIHVwIHRvIDIuOTUueCwgY29sbGVjdDIgd291bGQgY3JlYXRlIGFuIGltcG9ydCBmaWxlCisgICAgIyBmb3IgZGVwZW5kZW5jZSBsaWJyYXJpZXMuICBUaGUgaW1wb3J0IGZpbGUgd291bGQgc3RhcnQgd2l0aAorICAgICMgdGhlIGxpbmUgYCMhIC4nLiAgVGhpcyB3b3VsZCBjYXVzZSB0aGUgZ2VuZXJhdGVkIGxpYnJhcnkgdG8KKyAgICAjIGRlcGVuZCBvbiBgLicsIGFsd2F5cyBhbiBpbnZhbGlkIGxpYnJhcnkuICBUaGlzIHdhcyBmaXhlZCBpbgorICAgICMgZGV2ZWxvcG1lbnQgc25hcHNob3RzIG9mIEdDQyBwcmlvciB0byAzLjAuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4NCB8IGFpeDQuW1swMV1dIHwgYWl4NC5bWzAxXV0uKikKKwlpZiB7IGVjaG8gJyNpZiBfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPj0gOTcpJworCSAgICAgZWNobyAnIHllcyAnCisJICAgICBlY2hvICcjZW5kaWYnOyB9IHwgJHtDQ30gLUUgLSB8IGdyZXAgeWVzID4gL2Rldi9udWxsOyB0aGVuCisJICA6CisJZWxzZQorCSAgY2FuX2J1aWxkX3NoYXJlZD1ubworCWZpCisJOzsKKyAgICBlc2FjCisgICAgIyBBSVggKG9uIFBvd2VyKikgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gY3VycmVudGx5IHdlIGNhbgorICAgICMgbm90IGhhcmRjb2RlIGNvcnJlY3Qgc29uYW1lIGludG8gZXhlY3V0YWJsZS4gUHJvYmFibHkgd2UgY2FuCisgICAgIyBhZGQgdmVyc2lvbmluZyBzdXBwb3J0IHRvIGNvbGxlY3QyLCBzbyBhZGRpdGlvbmFsIGxpbmtzIGNhbgorICAgICMgYmUgdXNlZnVsIGluIGZ1dHVyZS4KKyAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKyAgICAgICMgSWYgdXNpbmcgcnVuIHRpbWUgbGlua2luZyAob24gQUlYIDQuMiBvciBsYXRlcikgdXNlIGxpYjxuYW1lPi5zbworICAgICAgIyBpbnN0ZWFkIG9mIGxpYjxuYW1lPi5hIHRvIGxldCBwZW9wbGUga25vdyB0aGF0IHRoZXNlIGFyZSBub3QKKyAgICAgICMgdHlwaWNhbCBBSVggc2hhcmVkIGxpYnJhcmllcy4KKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJworICAgIGVsc2UKKyAgICAgICMgV2UgcHJlc2VydmUgLmEgYXMgZXh0ZW5zaW9uIGZvciBzaGFyZWQgbGlicmFyaWVzIHRocm91Z2ggQUlYNC4yCisgICAgICAjIGFuZCBsYXRlciB3aGVuIHdlIGFyZSBub3QgZG9pbmcgcnVuIHRpbWUgbGlua2luZy4KKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uYSAkbGlibmFtZS5hJworICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJworICAgIGZpCisgICAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisgIGZpCisgIDs7CisKK2FtaWdhb3MqKQorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLml4bGlicmFyeSAkbGlibmFtZS5hJworICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgorICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAnXCcncyVeLiovXChbW14vXV0qXClcLml4bGlicmFyeSQlXDElJ1wnJ2A7IHRlc3QgJHJtIC9zeXMvbGlicy8ke2xpYm5hbWV9X2l4bGlicmFyeS5hOyAkc2hvdyAiKGNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEpIjsgKGNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEpIHx8IGV4aXQgMTsgZG9uZScKKyAgOzsKKworYmVvcyopCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfS5zbycKKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgorICBzaGxpYnBhdGhfdmFyPUxJQlJBUllfUEFUSAorICA7OworCitic2RpNCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9YMTEvbGliIC91c3IvY29udHJpYi9saWIgL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPS1yZHluYW1pYworICAjIHRoZSBkZWZhdWx0IGxkLnNvLmNvbmYgYWxzbyBjb250YWlucyAvdXNyL2NvbnRyaWIvbGliIGFuZAorICAjIC91c3IvWDExUjYvbGliICgvdXNyL1gxMSBpcyBhIGxpbmsgdG8gL3Vzci9YMTFSNiksIGJ1dCBsZXQgdXMgYWxsb3cKKyAgIyBsaWJ0b29sIHRvIGhhcmQtY29kZSB0aGVzZSBpbnRvIHByb2dyYW1zCisgIDs7CisKK2N5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgdmVyc2lvbl90eXBlPXdpbmRvd3MKKyAgbmVlZF92ZXJzaW9uPW5vCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBjYXNlICRHQ0MsJGhvc3Rfb3MgaW4KKyAgeWVzLGN5Z3dpbiopCisgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5kbGwuYScKKyAgICBzb25hbWVfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL2N5Zy8nYGBlY2hvICR7cmVsZWFzZX0gfCBzZWQgLWUgJ3MvW1suXV0vLS9nJ2Ake3ZlcnN1ZmZpeH0uZGxsJworICAgIHBvc3RpbnN0YWxsX2NtZHM9J2RscGF0aD1gYmFzaCAyPiYxIC1jICdcJycuICRkaXIvJHtmaWxlfWk7ZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxkaXI9JGRlc3RkaXIvYGRpcm5hbWUgXCRkbHBhdGhgfgorICAgICAgdGVzdCAtZCBcJGRsZGlyIHx8IG1rZGlyIC1wIFwkZGxkaXJ+CisgICAgICAkaW5zdGFsbF9wcm9nIC5saWJzLyRkbG5hbWUgXCRkbGRpci8kZGxuYW1lJworICAgIHBvc3R1bmluc3RhbGxfY21kcz0nZGxkbGw9YGJhc2ggMj4mMSAtYyAnXCcnLiAkZmlsZTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxwYXRoPSRkaXIvXCRkbGRsbH4KKyAgICAgICAkcm0gXCRkbHBhdGgnCisgICAgOzsKKyAgeWVzLG1pbmd3KikKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgc2VkIC1lICdzL1tbLl1dLy0vZydgJHt2ZXJzdWZmaXh9LmRsbCcKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBncmVwICJebGlicmFyaWVzOiIgfCBzZWQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMvOy8gL2ciYAorICAgIDs7CisgIHllcyxwdzMyKikKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9wdy8nYGBlY2hvICR7cmVsZWFzZX0gfCBzZWQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9LmRsbCcKKyAgICA7OworICAqKQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCBzZWQgLWUgJ3MvW1suXV0vLS9nJ2Ake3ZlcnN1ZmZpeH0uZGxsICRsaWJuYW1lLmxpYicKKyAgICA7OworICBlc2FjCisgIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCisgICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgorICBzaGxpYnBhdGhfdmFyPVBBVEgKKyAgOzsKKworZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGR5bGQiCisgIHZlcnNpb25fdHlwZT1kYXJ3aW4KKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICAjIEZJWE1FOiBSZWx5aW5nIG9uIHBvc2l4eSAkKCkgd2lsbCBjYXVzZSBwcm9ibGVtcyBmb3IKKyAgIyAgICAgICAgY3Jvc3MtY29tcGlsYXRpb24sIGJ1dCB1bmZvcnR1bmF0ZWx5IHRoZSBlY2hvIHRlc3RzIGRvIG5vdAorICAjICAgICAgICB5ZXQgZGV0ZWN0IHpzaCBlY2hvJ3MgcmVtb3ZhbCBvZiBcIGVzY2FwZXMuCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3ZlcnN1ZmZpeH0uJCh0ZXN0IC4kbW9kdWxlID0gLnllcyAmJiBlY2hvIHNvIHx8IGVjaG8gZHlsaWIpICR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0uJCh0ZXN0IC4kbW9kdWxlID0gLnllcyAmJiBlY2hvIHNvIHx8IGVjaG8gZHlsaWIpICR7bGlibmFtZX0uJCh0ZXN0IC4kbW9kdWxlID0gLnllcyAmJiBlY2hvIHNvIHx8IGVjaG8gZHlsaWIpJworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfS4kKHRlc3QgLiRtb2R1bGUgPSAueWVzICYmIGVjaG8gc28gfHwgZWNobyBkeWxpYiknCisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgc2hsaWJwYXRoX3Zhcj1EWUxEX0xJQlJBUllfUEFUSAorICA7OworCitmcmVlYnNkMSopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7CisKK2ZyZWVic2QqKQorICBvYmpmb3JtYXQ9YHRlc3QgLXggL3Vzci9iaW4vb2JqZm9ybWF0ICYmIC91c3IvYmluL29iamZvcm1hdCB8fCBlY2hvIGFvdXRgCisgIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKKyAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisgICAgZnJlZWJzZC1lbGYqKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28gJGxpYm5hbWUuc28nCisgICAgICBuZWVkX3ZlcnNpb249bm8KKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgOzsKKyAgICBmcmVlYnNkLSopCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAkbGlibmFtZS5zbyR2ZXJzdWZmaXgnCisgICAgICBuZWVkX3ZlcnNpb249eWVzCisgICAgICA7OworICBlc2FjCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgZnJlZWJzZDIqKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICA7OworICAqKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICBlc2FjCisgIDs7CisKK2dudSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHttYWpvcn0gJHtsaWJuYW1lfS5zbycKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2hwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCisgICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgorICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBzaGxpYnBhdGhfdmFyPVNITElCX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vICMgK3MgaXMgcmVxdWlyZWQgdG8gZW5hYmxlIFNITElCX1BBVEgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbCR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc2wkbWFqb3IgJGxpYm5hbWUuc2wnCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbCRtYWpvcicKKyAgIyBIUC1VWCBydW5zICpyZWFsbHkqIHNsb3dseSB1bmxlc3Mgc2hhcmVkIGxpYnJhcmllcyBhcmUgbW9kZSA1NTUuCisgIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDU1NSAkbGliJworICA7OworCitpcml4NSogfCBpcml4NiopCisgIHZlcnNpb25fdHlwZT1pcml4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyAkbGlibmFtZS5zbycKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBpcml4NSopCisgICAgbGlic3VmZj0gc2hsaWJzdWZmPQorICAgIDs7CisgICopCisgICAgY2FzZSAkTEQgaW4gIyBsaWJ0b29sLm00IHdpbGwgYWRkIG9uZSBvZiB0aGVzZSBzd2l0Y2hlcyB0byBMRAorICAgICotMzJ8KiItMzIgIikgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz0zMi1iaXQ7OworICAgICotbjMyfCoiLW4zMiAiKSBsaWJzdWZmPTMyIHNobGlic3VmZj1OMzIgbGlibWFnaWM9TjMyOzsKKyAgICAqLTY0fCoiLTY0ICIpIGxpYnN1ZmY9NjQgc2hsaWJzdWZmPTY0IGxpYm1hZ2ljPTY0LWJpdDs7CisgICAgKikgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7CisgICAgZXNhYworICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZJHtzaGxpYnN1ZmZ9X1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IC91c3IvbG9jYWwvbGliJHtsaWJzdWZmfSIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSIKKyAgOzsKKworIyBObyBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIExpbnV4IG9sZGxkLCBhb3V0LCBvciBjb2ZmLgorbGludXgqb2xkbGQqIHwgbGludXgqYW91dCogfCBsaW51eCpjb2ZmKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKKworIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgorbGludXgqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAkbGlibmFtZS5zbycKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbiAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgIyBUaGlzIGltcGxpZXMgbm8gZmFzdF9pbnN0YWxsLCB3aGljaCBpcyB1bmFjY2VwdGFibGUuCisgICMgU29tZSByZXdvcmsgd2lsbCBiZSBuZWVkZWQgdG8gYWxsb3cgZm9yIGZhc3RfaW5zdGFsbAorICAjIGJlZm9yZSB0aGlzIGNhbiBiZSBlbmFibGVkLgorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisKKyAgIyBXZSB1c2VkIHRvIHRlc3QgZm9yIC9saWIvbGQuc28uMSBhbmQgZGlzYWJsZSBzaGFyZWQgbGlicmFyaWVzIG9uCisgICMgcG93ZXJwYywgYmVjYXVzZSBNa0xpbnV4IG9ubHkgc3VwcG9ydGVkIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB0aGUKKyAgIyBHTlUgZHluYW1pYyBsaW5rZXIuICBTaW5jZSB0aGlzIHdhcyBicm9rZW4gd2l0aCBjcm9zcyBjb21waWxlcnMsCisgICMgbW9zdCBwb3dlcnBjLWxpbnV4IGJveGVzIHN1cHBvcnQgZHluYW1pYyBsaW5raW5nIHRoZXNlIGRheXMgYW5kCisgICMgcGVvcGxlIGNhbiBhbHdheXMgLS1kaXNhYmxlLXNoYXJlZCwgdGhlIHRlc3Qgd2FzIHJlbW92ZWQsIGFuZCB3ZQorICAjIGFzc3VtZSB0aGUgR05VL0xpbnV4IGR5bmFtaWMgbGlua2VyIGlzIGluIHVzZS4KKyAgZHluYW1pY19saW5rZXI9J0dOVS9MaW51eCBsZC5zbycKKyAgOzsKKworbmV0YnNkKikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0uc28kdmVyc3VmZml4JworICAgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgICAgZHluYW1pY19saW5rZXI9J05ldEJTRCAoYS5vdXQpIGxkLnNvJworICBlbHNlCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28gJHtsaWJuYW1lfS5zbycKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCisgICAgZHluYW1pY19saW5rZXI9J05ldEJTRCBsZC5lbGZfc28nCisgIGZpCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCituZXdzb3M2KQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgOzsKKworb3BlbmJzZCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorICAgIGNhc2UgIiRob3N0X29zIiBpbgorICAgIG9wZW5ic2QyLltbODldXSB8IG9wZW5ic2QyLltbODldXS4qKQorICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICA7OworICAgICopCisgICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgICA7OworICAgIGVzYWMKKyAgZWxzZQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgZmkKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfS5zbyR2ZXJzdWZmaXgnCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIDs7CisKK29zMiopCisgIGxpYm5hbWVfc3BlYz0nJG5hbWUnCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLmRsbCAkbGlibmFtZS5hJworICBkeW5hbWljX2xpbmtlcj0nT1MvMiBsZC5leGUnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorICA7OworCitvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgIHZlcnNpb25fdHlwZT1vc2YKKyAgbmVlZF92ZXJzaW9uPW5vCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbycKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28gJGxpYm5hbWUuc28nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9zaGxpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIvY21wbHJzL2NjIC91c3IvbGliIC91c3IvbG9jYWwvbGliIC92YXIvc2hsaWIiCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIgorICA7OworCitzY28zLjJ2NSopCisgIHZlcnNpb25fdHlwZT1vc2YKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAkbGlibmFtZS5zbycKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworc29sYXJpcyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAjIGxkZCBjb21wbGFpbnMgdW5sZXNzIGxpYnJhcmllcyBhcmUgZXhlY3V0YWJsZQorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCAreCAkbGliJworICA7OworCitzdW5vczQqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfS5zbyR2ZXJzdWZmaXgnCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3Vzci9ldGMiIGxkY29uZmlnICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIG5lZWRfbGliX3ByZWZpeD1ubworICBmaQorICBuZWVkX3ZlcnNpb249eWVzCisgIDs7CisKK3N5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKiB8IHN5c3Y1KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGNhc2UgJGhvc3RfdmVuZG9yIGluCisgICAgc25pKQorICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICA7OworICAgIG1vdG9yb2xhKQorICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICBuZWVkX3ZlcnNpb249bm8KKyAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvbGliIC91c3IvbGliIC91c3IvY2NzL2xpYicKKyAgICAgIDs7CisgIGVzYWMKKyAgOzsKKwordXRzNCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAkbGlibmFtZS5zbycKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitkZ3V4KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworc3lzdjQqTVAqKQorICBpZiB0ZXN0IC1kIC91c3IvbmVjIDt0aGVuCisgICAgdmVyc2lvbl90eXBlPWxpbnV4CisgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5zby4kdmVyc3VmZml4ICRsaWJuYW1lLnNvLiRtYWpvciAkbGlibmFtZS5zbycKKyAgICBzb25hbWVfc3BlYz0nJGxpYm5hbWUuc28uJG1ham9yJworICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGZpCisgIDs7CisKKyopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7Citlc2FjCitBQ19NU0dfUkVTVUxUKFskZHluYW1pY19saW5rZXJdKQordGVzdCAiJGR5bmFtaWNfbGlua2VyIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKworIyBSZXBvcnQgdGhlIGZpbmFsIGNvbnNlcXVlbmNlcy4KK0FDX01TR19DSEVDS0lORyhbaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzXSkKK0FDX01TR19SRVNVTFQoWyRjYW5fYnVpbGRfc2hhcmVkXSkKKworQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXNdKQordGVzdCAiJGNhbl9idWlsZF9zaGFyZWQiID0gIm5vIiAmJiBlbmFibGVfc2hhcmVkPW5vCisKKyMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAorIyBhcmUgYWxsIGJ1aWx0IGZyb20gUElDLgorY2FzZSAiJGhvc3Rfb3MiIGluCithaXgzKikKKyAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgICBhcmNoaXZlX2NtZHM9IiRhcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRsaWIiCisgICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJworICBmaQorICA7OworCithaXg0KikKKyAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0ICYmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IG5vIDsgdGhlbgorICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCisgIGZpCisgIDs7Citlc2FjCitBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3NoYXJlZF0pCisKK0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzXSkKKyMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgordGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzIHx8IGVuYWJsZV9zdGF0aWM9eWVzCitBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3N0YXRpY10pCisKK2lmIHRlc3QgIiRoYXJkY29kZV9hY3Rpb24iID0gcmVsaW5rOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCitlbGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzIHx8CisgICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IG5lY2Vzc2FyeQorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5lZWRsZXNzCitmaQorCit2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iUEFUSCAkc2hsaWJwYXRoX3ZhciAkcnVucGF0aF92YXIiCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICB2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIEdDQ19FWEVDX1BSRUZJWCBDT01QSUxFUl9QQVRIIExJQlJBUllfUEFUSCIKK2ZpCisKK0FDX0xJQlRPT0xfRExPUEVOX1NFTEYKKworaWYgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIGNhc2UgJGFyY2hpdmVfY21kcyBpbgorICAqJ34nKikKKyAgICAjIEZJWE1FOiB3ZSBtYXkgaGF2ZSB0byBkZWFsIHdpdGggbXVsdGktY29tbWFuZCBzZXF1ZW5jZXMuCisgICAgOzsKKyAgJyRDQyAnKikKKyAgICAjIFRlc3Qgd2hldGhlciB0aGUgY29tcGlsZXIgaW1wbGljaXRseSBsaW5rcyB3aXRoIC1sYyBzaW5jZSBvbiBzb21lCisgICAgIyBzeXN0ZW1zLCAtbGdjYyBoYXMgdG8gY29tZSBiZWZvcmUgLWxjLiBJZiBnY2MgYWxyZWFkeSBwYXNzZXMgLWxjCisgICAgIyB0byBsZCwgZG9uJ3QgYWRkIC1sYyBiZWZvcmUgLWxnY2MuCisgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW5dKQorICAgIEFDX0NBQ0hFX1ZBTChbbHRfY3ZfYXJjaGl2ZV9jbWRzX25lZWRfbGNdLAorICAgIFskcm0gY29uZnRlc3QqCisgICAgZWNobyAnc3RhdGljIGludCBkdW1teTsnID4gY29uZnRlc3QuJGFjX2V4dAorCisgICAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KKyAgICAgIHNvbmFtZT1jb25mdGVzdAorICAgICAgbGliPWNvbmZ0ZXN0CisgICAgICBsaWJvYmpzPWNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgICAgIGRlcGxpYnM9CisgICAgICB3bD0kbHRfY3ZfcHJvZ19jY193bAorICAgICAgY29tcGlsZXJfZmxhZ3M9LXYKKyAgICAgIGxpbmtlcl9mbGFncz0tdgorICAgICAgdmVyc3RyaW5nPQorICAgICAgb3V0cHV0X29iamRpcj0uCisgICAgICBsaWJuYW1lPWNvbmZ0ZXN0CisgICAgICBzYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnPSRhbGxvd191bmRlZmluZWRfZmxhZworICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9CisgICAgICBpZiBBQ19UUllfRVZBTChhcmNoaXZlX2NtZHMgMlw+XCYxIFx8IGdyZXAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMSkKKyAgICAgIHRoZW4KKwlsdF9jdl9hcmNoaXZlX2NtZHNfbmVlZF9sYz1ubworICAgICAgZWxzZQorCWx0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjPXllcworICAgICAgZmkKKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPSRzYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnCisgICAgZWxzZQorICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1CisgICAgZmldKQorICAgIEFDX01TR19SRVNVTFQoWyRsdF9jdl9hcmNoaXZlX2NtZHNfbmVlZF9sY10pCisgICAgOzsKKyAgZXNhYworZmkKK25lZWRfbGM9JHtsdF9jdl9hcmNoaXZlX2NtZHNfbmVlZF9sYy15ZXN9CisKKyMgVGhlIHNlY29uZCBjbGF1c2Ugc2hvdWxkIG9ubHkgZmlyZSB3aGVuIGJvb3RzdHJhcHBpbmcgdGhlCisjIGxpYnRvb2wgZGlzdHJpYnV0aW9uLCBvdGhlcndpc2UgeW91IGZvcmdvdCB0byBzaGlwIGx0bWFpbi5zaAorIyB3aXRoIHlvdXIgcGFja2FnZSwgYW5kIHlvdSB3aWxsIGdldCBjb21wbGFpbnRzIHRoYXQgdGhlcmUgYXJlCisjIG5vIHJ1bGVzIHRvIGdlbmVyYXRlIGx0bWFpbi5zaC4KK2lmIHRlc3QgLWYgIiRsdG1haW4iOyB0aGVuCisgIDoKK2Vsc2UKKyAgIyBJZiB0aGVyZSBpcyBubyBNYWtlZmlsZSB5ZXQsIHdlIHJlbHkgb24gYSBtYWtlIHJ1bGUgdG8gZXhlY3V0ZQorICAjIGBjb25maWcuc3RhdHVzIC0tcmVjaGVjaycgdG8gcmVydW4gdGhlc2UgdGVzdHMgYW5kIGNyZWF0ZSB0aGUKKyAgIyBsaWJ0b29sIHNjcmlwdCB0aGVuLgorICB0ZXN0IC1mIE1ha2VmaWxlICYmIG1ha2UgIiRsdG1haW4iCitmaQorCitpZiB0ZXN0IC1mICIkbHRtYWluIjsgdGhlbgorICB0cmFwICIkcm0gXCIke29maWxlfVRcIjsgZXhpdCAxIiAxIDIgMTUKKyAgJHJtIC1mICIke29maWxlfVQiCisKKyAgZWNobyBjcmVhdGluZyAkb2ZpbGUKKworICAjIE5vdyBxdW90ZSBhbGwgdGhlIHRoaW5ncyB0aGF0IG1heSBjb250YWluIG1ldGFjaGFyYWN0ZXJzIHdoaWxlIGJlaW5nCisgICMgY2FyZWZ1bCBub3QgdG8gb3ZlcnF1b3RlIHRoZSBBQ19TVUJTVGVkIHZhbHVlcy4gIFdlIHRha2UgY29waWVzIG9mIHRoZQorICAjIHZhcmlhYmxlcyBhbmQgcXVvdGUgdGhlIGNvcGllcyBmb3IgZ2VuZXJhdGlvbiBvZiB0aGUgbGlidG9vbCBzY3JpcHQuCisgIGZvciB2YXIgaW4gZWNobyBvbGRfQ0Mgb2xkX0NGTEFHUyBcCisgICAgQVIgQVJfRkxBR1MgQVMgQ0MgTEQgTE5fUyBOTSBTSEVMTCBcCisgICAgcmVsb2FkX2ZsYWcgcmVsb2FkX2NtZHMgd2wgXAorICAgIHBpY19mbGFnIGxpbmtfc3RhdGljX2ZsYWcgbm9fYnVpbHRpbl9mbGFnIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYyBcCisgICAgdGhyZWFkX3NhZmVfZmxhZ19zcGVjIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIGxpYm5hbWVfc3BlYyBcCisgICAgbGlicmFyeV9uYW1lc19zcGVjIHNvbmFtZV9zcGVjIFwKKyAgICBSQU5MSUIgb2xkX2FyY2hpdmVfY21kcyBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIG9sZF9wb3N0aW5zdGFsbF9jbWRzIFwKKyAgICBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIGFyY2hpdmVfY21kcyBhcmNoaXZlX2V4cHN5bV9jbWRzIHBvc3RpbnN0YWxsX2NtZHMgXAorICAgIHBvc3R1bmluc3RhbGxfY21kcyBleHRyYWN0X2V4cHN5bXNfY21kcyBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcyBcCisgICAgb2xkX3N0cmlwbGliIHN0cmlwbGliIGZpbGVfbWFnaWNfY21kIGV4cG9ydF9zeW1ib2xzX2NtZHMgXAorICAgIGRlcGxpYnNfY2hlY2tfbWV0aG9kIGFsbG93X3VuZGVmaW5lZF9mbGFnIG5vX3VuZGVmaW5lZF9mbGFnIFwKKyAgICBmaW5pc2hfY21kcyBmaW5pc2hfZXZhbCBnbG9iYWxfc3ltYm9sX3BpcGUgZ2xvYmFsX3N5bWJvbF90b19jZGVjbCBcCisgICAgZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcyBcCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yICBcCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjIFwKKyAgICBjb21waWxlcl9jX28gY29tcGlsZXJfb19sbyBuZWVkX2xvY2tzIGV4Y2x1ZGVfZXhwc3ltcyBpbmNsdWRlX2V4cHN5bXM7IGRvCisKKyAgICBjYXNlICR2YXIgaW4KKyAgICByZWxvYWRfY21kcyB8IG9sZF9hcmNoaXZlX2NtZHMgfCBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIHwgXAorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIHwgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyB8IFwKKyAgICBleHBvcnRfc3ltYm9sc19jbWRzIHwgYXJjaGl2ZV9jbWRzIHwgYXJjaGl2ZV9leHBzeW1fY21kcyB8IFwKKyAgICBleHRyYWN0X2V4cHN5bXNfY21kcyB8IG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzIHwgXAorICAgIHBvc3RpbnN0YWxsX2NtZHMgfCBwb3N0dW5pbnN0YWxsX2NtZHMgfCBcCisgICAgZmluaXNoX2NtZHMgfCBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgfCBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYykKKyAgICAgICMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KKyAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRkb3VibGVfcXVvdGVfc3Vic3RcIiAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCIgLWUgXCJcJGRlbGF5X3ZhcmlhYmxlX3N1YnN0XCJcYFxcXCIiCisgICAgICA7OworICAgICopCisgICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCJcYFxcXCIiCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorCisgIGNhdCA8PF9fRU9GX18gPiAiJHtvZmlsZX1UIgorIyEgJFNIRUxMCisKKyMgYCRlY2hvICIkb2ZpbGUiIHwgc2VkICdzJV4uKi8lJSdgIC0gUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5ICRQUk9HUkFNIChHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QKQorIyBOT1RFOiBDaGFuZ2VzIG1hZGUgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdDogbG9vayBhdCBsdG1haW4uc2guCisjCisjIENvcHlyaWdodCAoQykgMTk5Ni0yMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBPcmlnaW5hbGx5IGJ5IEdvcmRvbiBNYXR6aWdrZWl0IDxnb3JkQGdudS5haS5taXQuZWR1PiwgMTk5NgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKKyMgU2VkIHRoYXQgaGVscHMgdXMgYXZvaWQgYWNjaWRlbnRhbGx5IHRyaWdnZXJpbmcgZWNobygxKSBvcHRpb25zIGxpa2UgLW4uCitYc2VkPSJzZWQgLWUgcy9eWC8vIgorCisjIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAorIyBpZiBDRFBBVEggaXMgc2V0LgoraWYgdGVzdCAiWFwke0NEUEFUSCtzZXR9IiA9IFhzZXQ7IHRoZW4gQ0RQQVRIPTo7IGV4cG9ydCBDRFBBVEg7IGZpCisKKyMgIyMjIEJFR0lOIExJQlRPT0wgQ09ORklHCisKKyMgTGlidG9vbCB3YXMgY29uZmlndXJlZCBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKKworIyBTaGVsbCB0byB1c2Ugd2hlbiBpbnZva2luZyBzaGVsbCBzY3JpcHRzLgorU0hFTEw9JGx0X1NIRUxMCisKKyMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4KK2J1aWxkX2xpYnRvb2xfbGlicz0kZW5hYmxlX3NoYXJlZAorCisjIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuCitidWlsZF9vbGRfbGlicz0kZW5hYmxlX3N0YXRpYworCisjIFdoZXRoZXIgb3Igbm90IHRvIGFkZCAtbGMgZm9yIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCitidWlsZF9saWJ0b29sX25lZWRfbGM9JG5lZWRfbGMKKworIyBXaGV0aGVyIG9yIG5vdCB0byBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24uCitmYXN0X2luc3RhbGw9JGVuYWJsZV9mYXN0X2luc3RhbGwKKworIyBUaGUgaG9zdCBzeXN0ZW0uCitob3N0X2FsaWFzPSRob3N0X2FsaWFzCitob3N0PSRob3N0CisKKyMgQW4gZWNobyBwcm9ncmFtIHRoYXQgZG9lcyBub3QgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgorZWNobz0kbHRfZWNobworCisjIFRoZSBhcmNoaXZlci4KK0FSPSRsdF9BUgorQVJfRkxBR1M9JGx0X0FSX0ZMQUdTCisKKyMgVGhlIGRlZmF1bHQgQyBjb21waWxlci4KK0NDPSRsdF9DQworCisjIElzIHRoZSBjb21waWxlciB0aGUgR05VIEMgY29tcGlsZXI/Cit3aXRoX2djYz0kR0NDCisKKyMgVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllcy4KK0xEPSRsdF9MRAorCisjIFdoZXRoZXIgd2UgbmVlZCBoYXJkIG9yIHNvZnQgbGlua3MuCitMTl9TPSRsdF9MTl9TCisKKyMgQSBCU0QtY29tcGF0aWJsZSBubSBwcm9ncmFtLgorTk09JGx0X05NCisKKyMgQSBzeW1ib2wgc3RyaXBwaW5nIHByb2dyYW0KK1NUUklQPSRTVFJJUAorCisjIFVzZWQgdG8gZXhhbWluZSBsaWJyYXJpZXMgd2hlbiBmaWxlX21hZ2ljX2NtZCBiZWdpbnMgImZpbGUiCitNQUdJQ19DTUQ9JE1BR0lDX0NNRAorCisjIFVzZWQgb24gY3lnd2luOiBETEwgY3JlYXRpb24gcHJvZ3JhbS4KK0RMTFRPT0w9IiRETExUT09MIgorCisjIFVzZWQgb24gY3lnd2luOiBvYmplY3QgZHVtcGVyLgorT0JKRFVNUD0iJE9CSkRVTVAiCisKKyMgVXNlZCBvbiBjeWd3aW46IGFzc2VtYmxlci4KK0FTPSRsdF9BUworCisjIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlcy4KK29iamRpcj0kb2JqZGlyCisKKyMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KK3JlbG9hZF9mbGFnPSRsdF9yZWxvYWRfZmxhZworcmVsb2FkX2NtZHM9JGx0X3JlbG9hZF9jbWRzCisKKyMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KK3dsPSRsdF93bAorCisjIE9iamVjdCBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIm8iKS4KK29iamV4dD0iJGFjX29iamV4dCIKKworIyBPbGQgYXJjaGl2ZSBzdWZmaXggKG5vcm1hbGx5ICJhIikuCitsaWJleHQ9IiRsaWJleHQiCisKKyMgRXhlY3V0YWJsZSBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIiIpLgorZXhlZXh0PSIkZXhlZXh0IgorCisjIEFkZGl0aW9uYWwgY29tcGlsZXIgZmxhZ3MgZm9yIGJ1aWxkaW5nIGxpYnJhcnkgb2JqZWN0cy4KK3BpY19mbGFnPSRsdF9waWNfZmxhZworcGljX21vZGU9JHBpY19tb2RlCisKKyMgRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zPworY29tcGlsZXJfY19vPSRsdF9jb21waWxlcl9jX28KKworIyBDYW4gd2Ugd3JpdGUgZGlyZWN0bHkgdG8gYSAubG8gPworY29tcGlsZXJfb19sbz0kbHRfY29tcGlsZXJfb19sbworCisjIE11c3Qgd2UgbG9jayBmaWxlcyB3aGVuIGRvaW5nIGNvbXBpbGF0aW9uID8KK25lZWRfbG9ja3M9JGx0X25lZWRfbG9ja3MKKworIyBEbyB3ZSBuZWVkIHRoZSBsaWIgcHJlZml4IGZvciBtb2R1bGVzPworbmVlZF9saWJfcHJlZml4PSRuZWVkX2xpYl9wcmVmaXgKKworIyBEbyB3ZSBuZWVkIGEgdmVyc2lvbiBmb3IgbGlicmFyaWVzPworbmVlZF92ZXJzaW9uPSRuZWVkX3ZlcnNpb24KKworIyBXaGV0aGVyIGRsb3BlbiBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc3VwcG9ydD0kZW5hYmxlX2Rsb3BlbgorCisjIFdoZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KK2Rsb3Blbl9zZWxmPSRlbmFibGVfZGxvcGVuX3NlbGYKKworIyBXaGV0aGVyIGRsb3BlbiBvZiBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc2VsZl9zdGF0aWM9JGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWMKKworIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgorbGlua19zdGF0aWNfZmxhZz0kbHRfbGlua19zdGF0aWNfZmxhZworCisjIENvbXBpbGVyIGZsYWcgdG8gdHVybiBvZmYgYnVpbHRpbiBmdW5jdGlvbnMuCitub19idWlsdGluX2ZsYWc9JGx0X25vX2J1aWx0aW5fZmxhZworCisjIENvbXBpbGVyIGZsYWcgdG8gYWxsb3cgcmVmbGV4aXZlIGRsb3BlbnMuCitleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JGx0X2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlYworCisjIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlcy4KK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSRsdF93aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYworCisjIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgdGhyZWFkLXNhZmUgb2JqZWN0cy4KK3RocmVhZF9zYWZlX2ZsYWdfc3BlYz0kbHRfdGhyZWFkX3NhZmVfZmxhZ19zcGVjCisKKyMgTGlicmFyeSB2ZXJzaW9uaW5nIHR5cGUuCit2ZXJzaW9uX3R5cGU9JHZlcnNpb25fdHlwZQorCisjIEZvcm1hdCBvZiBsaWJyYXJ5IG5hbWUgcHJlZml4LgorbGlibmFtZV9zcGVjPSRsdF9saWJuYW1lX3NwZWMKKworIyBMaXN0IG9mIGFyY2hpdmUgbmFtZXMuICBGaXJzdCBuYW1lIGlzIHRoZSByZWFsIG9uZSwgdGhlIHJlc3QgYXJlIGxpbmtzLgorIyBUaGUgbGFzdCBuYW1lIGlzIHRoZSBvbmUgdGhhdCB0aGUgbGlua2VyIGZpbmRzIHdpdGggLWxOQU1FLgorbGlicmFyeV9uYW1lc19zcGVjPSRsdF9saWJyYXJ5X25hbWVzX3NwZWMKKworIyBUaGUgY29kZWQgbmFtZSBvZiB0aGUgbGlicmFyeSwgaWYgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgbmFtZS4KK3NvbmFtZV9zcGVjPSRsdF9zb25hbWVfc3BlYworCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYW4gb2xkLXN0eWxlIGFyY2hpdmUuCitSQU5MSUI9JGx0X1JBTkxJQgorb2xkX2FyY2hpdmVfY21kcz0kbHRfb2xkX2FyY2hpdmVfY21kcworb2xkX3Bvc3RpbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0aW5zdGFsbF9jbWRzCitvbGRfcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdHVuaW5zdGFsbF9jbWRzCisKKyMgQ3JlYXRlIGFuIG9sZC1zdHlsZSBhcmNoaXZlIGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KK29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMKKworIyBDcmVhdGUgYSB0ZW1wb3Jhcnkgb2xkLXN0eWxlIGFyY2hpdmUgdG8gbGluayBpbnN0ZWFkIG9mIGEgc2hhcmVkIGFyY2hpdmUuCitvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGEgc2hhcmVkIGFyY2hpdmUuCithcmNoaXZlX2NtZHM9JGx0X2FyY2hpdmVfY21kcworYXJjaGl2ZV9leHBzeW1fY21kcz0kbHRfYXJjaGl2ZV9leHBzeW1fY21kcworcG9zdGluc3RhbGxfY21kcz0kbHRfcG9zdGluc3RhbGxfY21kcworcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9wb3N0dW5pbnN0YWxsX2NtZHMKKworIyBDb21tYW5kcyB0byBzdHJpcCBsaWJyYXJpZXMuCitvbGRfc3RyaXBsaWI9JGx0X29sZF9zdHJpcGxpYgorc3RyaXBsaWI9JGx0X3N0cmlwbGliCisKKyMgTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgZGVwZW5kZW50IGxpYnJhcmllcyBhcmUgc2hhcmVkIG9iamVjdHMuCitkZXBsaWJzX2NoZWNrX21ldGhvZD0kbHRfZGVwbGlic19jaGVja19tZXRob2QKKworIyBDb21tYW5kIHRvIHVzZSB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID09IGZpbGVfbWFnaWMuCitmaWxlX21hZ2ljX2NtZD0kbHRfZmlsZV9tYWdpY19jbWQKKworIyBGbGFnIHRoYXQgYWxsb3dzIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB1bmRlZmluZWQgc3ltYm9scyB0byBiZSBidWlsdC4KK2FsbG93X3VuZGVmaW5lZF9mbGFnPSRsdF9hbGxvd191bmRlZmluZWRfZmxhZworCisjIEZsYWcgdGhhdCBmb3JjZXMgbm8gdW5kZWZpbmVkIHN5bWJvbHMuCitub191bmRlZmluZWRfZmxhZz0kbHRfbm9fdW5kZWZpbmVkX2ZsYWcKKworIyBDb21tYW5kcyB1c2VkIHRvIGZpbmlzaCBhIGxpYnRvb2wgbGlicmFyeSBpbnN0YWxsYXRpb24gaW4gYSBkaXJlY3RvcnkuCitmaW5pc2hfY21kcz0kbHRfZmluaXNoX2NtZHMKKworIyBTYW1lIGFzIGFib3ZlLCBidXQgYSBzaW5nbGUgc2NyaXB0IGZyYWdtZW50IHRvIGJlIGV2YWxlZCBidXQgbm90IHNob3duLgorZmluaXNoX2V2YWw9JGx0X2ZpbmlzaF9ldmFsCisKKyMgVGFrZSB0aGUgb3V0cHV0IG9mIG5tIGFuZCBwcm9kdWNlIGEgbGlzdGluZyBvZiByYXcgc3ltYm9scyBhbmQgQyBuYW1lcy4KK2dsb2JhbF9zeW1ib2xfcGlwZT0kbHRfZ2xvYmFsX3N5bWJvbF9waXBlCisKKyMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgorZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0kbHRfZ2xvYmFsX3N5bWJvbF90b19jZGVjbAorCisjIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpcgorZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0kbHRfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcworCisjIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHJ1bnRpbWUgcGF0aCB2YXJpYWJsZS4KK3J1bnBhdGhfdmFyPSRydW5wYXRoX3ZhcgorCisjIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHBhdGggdmFyaWFibGUuCitzaGxpYnBhdGhfdmFyPSRzaGxpYnBhdGhfdmFyCisKKyMgSXMgc2hsaWJwYXRoIHNlYXJjaGVkIGJlZm9yZSB0aGUgaGFyZC1jb2RlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoPworc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPSRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgKKworIyBIb3cgdG8gaGFyZGNvZGUgYSBzaGFyZWQgbGlicmFyeSBwYXRoIGludG8gYW4gZXhlY3V0YWJsZS4KK2hhcmRjb2RlX2FjdGlvbj0kaGFyZGNvZGVfYWN0aW9uCisKKyMgV2hldGhlciB3ZSBzaG91bGQgaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIGxpYnJhcmllcy4KK2hhcmRjb2RlX2ludG9fbGlicz0kaGFyZGNvZGVfaW50b19saWJzCisKKyMgRmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgorIyBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0LgoraGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYworCisjIFdoZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAtcnBhdGggZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgoraGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0kbHRfaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcgorCisjIFNldCB0byB5ZXMgaWYgdXNpbmcgRElSL2xpYk5BTUUuc28gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQorIyByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfZGlyZWN0PSRoYXJkY29kZV9kaXJlY3QKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIHRoZSAtTERJUiBmbGFnIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKKyMgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX21pbnVzX0w9JGhhcmRjb2RlX21pbnVzX0wKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIFNITElCUEFUSF9WQVI9RElSIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50bworIyB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX3NobGlicGF0aF92YXI9JGhhcmRjb2RlX3NobGlicGF0aF92YXIKKworIyBWYXJpYWJsZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBzYXZlZCBpbiBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0cyBhbmQKKyMgcmVzdG9yZWQgYXQgcmVsaW5rIHRpbWUuCit2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIgorCisjIFdoZXRoZXIgbGlidG9vbCBtdXN0IGxpbmsgYSBwcm9ncmFtIGFnYWluc3QgYWxsIGl0cyBkZXBlbmRlbmN5IGxpYnJhcmllcy4KK2xpbmtfYWxsX2RlcGxpYnM9JGxpbmtfYWxsX2RlcGxpYnMKKworIyBDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKK3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisKKyMgUnVuLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRsdF9zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYworCisjIEZpeCB0aGUgc2hlbGwgdmFyaWFibGUgXCRzcmNmaWxlIGZvciB0aGUgY29tcGlsZXIuCitmaXhfc3JjZmlsZV9wYXRoPSIkZml4X3NyY2ZpbGVfcGF0aCIKKworIyBTZXQgdG8geWVzIGlmIGV4cG9ydGVkIHN5bWJvbHMgYXJlIHJlcXVpcmVkLgorYWx3YXlzX2V4cG9ydF9zeW1ib2xzPSRhbHdheXNfZXhwb3J0X3N5bWJvbHMKKworIyBUaGUgY29tbWFuZHMgdG8gbGlzdCBleHBvcnRlZCBzeW1ib2xzLgorZXhwb3J0X3N5bWJvbHNfY21kcz0kbHRfZXhwb3J0X3N5bWJvbHNfY21kcworCisjIFRoZSBjb21tYW5kcyB0byBleHRyYWN0IHRoZSBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCitleHRyYWN0X2V4cHN5bXNfY21kcz0kbHRfZXh0cmFjdF9leHBzeW1zX2NtZHMKKworIyBTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzLgorZXhjbHVkZV9leHBzeW1zPSRsdF9leGNsdWRlX2V4cHN5bXMKKworIyBTeW1ib2xzIHRoYXQgbXVzdCBhbHdheXMgYmUgZXhwb3J0ZWQuCitpbmNsdWRlX2V4cHN5bXM9JGx0X2luY2x1ZGVfZXhwc3ltcworCisjICMjIyBFTkQgTElCVE9PTCBDT05GSUcKKworX19FT0ZfXworCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4MyopCisgICAgY2F0IDw8XEVPRiA+PiAiJHtvZmlsZX1UIgorCisjIEFJWCBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhlIEdDQyBjb2xsZWN0MiBwcm9ncmFtLiAgRm9yIHNvbWUKKyMgcmVhc29uLCBpZiB3ZSBzZXQgdGhlIENPTExFQ1RfTkFNRVMgZW52aXJvbm1lbnQgdmFyaWFibGUsIHRoZSBwcm9ibGVtcworIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgoraWYgdGVzdCAiWCR7Q09MTEVDVF9OQU1FUytzZXR9IiAhPSBYc2V0OyB0aGVuCisgIENPTExFQ1RfTkFNRVM9CisgIGV4cG9ydCBDT0xMRUNUX05BTUVTCitmaQorRU9GCisgICAgOzsKKyAgZXNhYworCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgb3MyKikKKyAgICBjYXQgPDwnRU9GJyA+PiAiJHtvZmlsZX1UIgorICAgICAgIyBUaGlzIGlzIGEgc291cmNlIHByb2dyYW0gdGhhdCBpcyB1c2VkIHRvIGNyZWF0ZSBkbGxzIG9uIFdpbmRvd3MKKyAgICAgICMgRG9uJ3QgcmVtb3ZlIG5vciBtb2RpZnkgdGhlIHN0YXJ0aW5nIGFuZCBjbG9zaW5nIGNvbW1lbnRzCisjIC8qIGx0ZGxsLmMgc3RhcnRzIGhlcmUgKi8KKyMgI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjICNpbmNsdWRlIDx3aW5kb3dzLmg+CisjICN1bmRlZiBXSU4zMl9MRUFOX0FORF9NRUFOCisjICNpbmNsdWRlIDxzdGRpby5oPgorIworIyAjaWZuZGVmIF9fQ1lHV0lOX18KKyMgIyAgaWZkZWYgX19DWUdXSU4zMl9fCisjICMgICAgZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCisjICMgIGVuZGlmCisjICNlbmRpZgorIworIyAjaWZkZWYgX19jcGx1c3BsdXMKKyMgZXh0ZXJuICJDIiB7CisjICNlbmRpZgorIyBCT09MIEFQSUVOVFJZIERsbE1haW4gKEhJTlNUQU5DRSBoSW5zdCwgRFdPUkQgcmVhc29uLCBMUFZPSUQgcmVzZXJ2ZWQpOworIyAjaWZkZWYgX19jcGx1c3BsdXMKKyMgfQorIyAjZW5kaWYKKyMKKyMgI2lmZGVmIF9fQ1lHV0lOX18KKyMgI2luY2x1ZGUgPGN5Z3dpbi9jeWd3aW5fZGxsLmg+CisjIERFQ0xBUkVfQ1lHV0lOX0RMTCggRGxsTWFpbiApOworIyAjZW5kaWYKKyMgSElOU1RBTkNFIF9faERsbEluc3RhbmNlX2Jhc2U7CisjCisjIEJPT0wgQVBJRU5UUlkKKyMgRGxsTWFpbiAoSElOU1RBTkNFIGhJbnN0LCBEV09SRCByZWFzb24sIExQVk9JRCByZXNlcnZlZCkKKyMgeworIyAgIF9faERsbEluc3RhbmNlX2Jhc2UgPSBoSW5zdDsKKyMgICByZXR1cm4gVFJVRTsKKyMgfQorIyAvKiBsdGRsbC5jIGVuZHMgaGVyZSAqLworCSMgVGhpcyBpcyBhIHNvdXJjZSBwcm9ncmFtIHRoYXQgaXMgdXNlZCB0byBjcmVhdGUgaW1wb3J0IGxpYnJhcmllcworCSMgb24gV2luZG93cyBmb3IgZGxscyB3aGljaCBsYWNrIHRoZW0uIERvbid0IHJlbW92ZSBub3IgbW9kaWZ5IHRoZQorCSMgc3RhcnRpbmcgYW5kIGNsb3NpbmcgY29tbWVudHMKKyMgLyogaW1wZ2VuLmMgc3RhcnRzIGhlcmUgKi8KKyMgLyogICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBsaWJ0b29sLgorIworIyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisjICAqLworIworIyAjaW5jbHVkZSA8c3RkaW8uaD4JCS8qIGZvciBwcmludGYoKSAqLworIyAjaW5jbHVkZSA8dW5pc3RkLmg+CQkvKiBmb3Igb3BlbigpLCBsc2VlaygpLCByZWFkKCkgKi8KKyMgI2luY2x1ZGUgPGZjbnRsLmg+CQkvKiBmb3IgT19SRE9OTFksIE9fQklOQVJZICovCisjICNpbmNsdWRlIDxzdHJpbmcuaD4JCS8qIGZvciBzdHJkdXAoKSAqLworIworIyAvKiBPX0JJTkFSWSBpc24ndCByZXF1aXJlZCAob3IgZXZlbiBkZWZpbmVkIHNvbWV0aW1lcykgdW5kZXIgVW5peCAqLworIyAjaWZuZGVmIE9fQklOQVJZCisjICNkZWZpbmUgT19CSU5BUlkgMAorIyAjZW5kaWYKKyMKKyMgc3RhdGljIHVuc2lnbmVkIGludAorIyBwZV9nZXQxNiAoZmQsIG9mZnNldCkKKyMgICAgICBpbnQgZmQ7CisjICAgICAgaW50IG9mZnNldDsKKyMgeworIyAgIHVuc2lnbmVkIGNoYXIgYlsyXTsKKyMgICBsc2VlayAoZmQsIG9mZnNldCwgU0VFS19TRVQpOworIyAgIHJlYWQgKGZkLCBiLCAyKTsKKyMgICByZXR1cm4gYlswXSArIChiWzFdPDw4KTsKKyMgfQorIworIyBzdGF0aWMgdW5zaWduZWQgaW50CisjIHBlX2dldDMyIChmZCwgb2Zmc2V0KQorIyAgICAgaW50IGZkOworIyAgICAgaW50IG9mZnNldDsKKyMgeworIyAgIHVuc2lnbmVkIGNoYXIgYls0XTsKKyMgICBsc2VlayAoZmQsIG9mZnNldCwgU0VFS19TRVQpOworIyAgIHJlYWQgKGZkLCBiLCA0KTsKKyMgICByZXR1cm4gYlswXSArIChiWzFdPDw4KSArIChiWzJdPDwxNikgKyAoYlszXTw8MjQpOworIyB9CisjCisjIHN0YXRpYyB1bnNpZ25lZCBpbnQKKyMgcGVfYXMzMiAocHRyKQorIyAgICAgIHZvaWQgKnB0cjsKKyMgeworIyAgIHVuc2lnbmVkIGNoYXIgKmIgPSBwdHI7CisjICAgcmV0dXJuIGJbMF0gKyAoYlsxXTw8OCkgKyAoYlsyXTw8MTYpICsgKGJbM108PDI0KTsKKyMgfQorIworIyBpbnQKKyMgbWFpbiAoYXJnYywgYXJndikKKyMgICAgIGludCBhcmdjOworIyAgICAgY2hhciAqYXJndltdOworIyB7CisjICAgICBpbnQgZGxsOworIyAgICAgdW5zaWduZWQgbG9uZyBwZV9oZWFkZXJfb2Zmc2V0LCBvcHRoZHJfb2ZzLCBudW1fZW50cmllcywgaTsKKyMgICAgIHVuc2lnbmVkIGxvbmcgZXhwb3J0X3J2YSwgZXhwb3J0X3NpemUsIG5zZWN0aW9ucywgc2VjcHRyLCBleHBwdHI7CisjICAgICB1bnNpZ25lZCBsb25nIG5hbWVfcnZhcywgbmV4cDsKKyMgICAgIHVuc2lnbmVkIGNoYXIgKmV4cGRhdGEsICplcnZhOworIyAgICAgY2hhciAqZmlsZW5hbWUsICpkbGxfbmFtZTsKKyMKKyMgICAgIGZpbGVuYW1lID0gYXJndlsxXTsKKyMKKyMgICAgIGRsbCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZfE9fQklOQVJZKTsKKyMgICAgIGlmIChkbGwgPCAxKQorIyAJcmV0dXJuIDE7CisjCisjICAgICBkbGxfbmFtZSA9IGZpbGVuYW1lOworIworIyAgICAgZm9yIChpPTA7IGZpbGVuYW1lW2ldOyBpKyspCisjIAlpZiAoZmlsZW5hbWVbaV0gPT0gJy8nIHx8IGZpbGVuYW1lW2ldID09ICdcXCcgIHx8IGZpbGVuYW1lW2ldID09ICc6JykKKyMgCSAgICBkbGxfbmFtZSA9IGZpbGVuYW1lICsgaSArMTsKKyMKKyMgICAgIHBlX2hlYWRlcl9vZmZzZXQgPSBwZV9nZXQzMiAoZGxsLCAweDNjKTsKKyMgICAgIG9wdGhkcl9vZnMgPSBwZV9oZWFkZXJfb2Zmc2V0ICsgNCArIDIwOworIyAgICAgbnVtX2VudHJpZXMgPSBwZV9nZXQzMiAoZGxsLCBvcHRoZHJfb2ZzICsgOTIpOworIworIyAgICAgaWYgKG51bV9lbnRyaWVzIDwgMSkgLyogbm8gZXhwb3J0cyAqLworIyAJcmV0dXJuIDE7CisjCisjICAgICBleHBvcnRfcnZhID0gcGVfZ2V0MzIgKGRsbCwgb3B0aGRyX29mcyArIDk2KTsKKyMgICAgIGV4cG9ydF9zaXplID0gcGVfZ2V0MzIgKGRsbCwgb3B0aGRyX29mcyArIDEwMCk7CisjICAgICBuc2VjdGlvbnMgPSBwZV9nZXQxNiAoZGxsLCBwZV9oZWFkZXJfb2Zmc2V0ICsgNCArMik7CisjICAgICBzZWNwdHIgPSAocGVfaGVhZGVyX29mZnNldCArIDQgKyAyMCArCisjIAkgICAgICBwZV9nZXQxNiAoZGxsLCBwZV9oZWFkZXJfb2Zmc2V0ICsgNCArIDE2KSk7CisjCisjICAgICBleHBwdHIgPSAwOworIyAgICAgZm9yIChpID0gMDsgaSA8IG5zZWN0aW9uczsgaSsrKQorIyAgICAgeworIyAJY2hhciBzbmFtZVs4XTsKKyMgCXVuc2lnbmVkIGxvbmcgc2VjcHRyMSA9IHNlY3B0ciArIDQwICogaTsKKyMgCXVuc2lnbmVkIGxvbmcgdmFkZHIgPSBwZV9nZXQzMiAoZGxsLCBzZWNwdHIxICsgMTIpOworIyAJdW5zaWduZWQgbG9uZyB2c2l6ZSA9IHBlX2dldDMyIChkbGwsIHNlY3B0cjEgKyAxNik7CisjIAl1bnNpZ25lZCBsb25nIGZwdHIgPSBwZV9nZXQzMiAoZGxsLCBzZWNwdHIxICsgMjApOworIyAJbHNlZWsoZGxsLCBzZWNwdHIxLCBTRUVLX1NFVCk7CisjIAlyZWFkKGRsbCwgc25hbWUsIDgpOworIyAJaWYgKHZhZGRyIDw9IGV4cG9ydF9ydmEgJiYgdmFkZHIrdnNpemUgPiBleHBvcnRfcnZhKQorIyAJeworIyAJICAgIGV4cHB0ciA9IGZwdHIgKyAoZXhwb3J0X3J2YSAtIHZhZGRyKTsKKyMgCSAgICBpZiAoZXhwb3J0X3J2YSArIGV4cG9ydF9zaXplID4gdmFkZHIgKyB2c2l6ZSkKKyMgCQlleHBvcnRfc2l6ZSA9IHZzaXplIC0gKGV4cG9ydF9ydmEgLSB2YWRkcik7CisjIAkgICAgYnJlYWs7CisjIAl9CisjICAgICB9CisjCisjICAgICBleHBkYXRhID0gKHVuc2lnbmVkIGNoYXIqKW1hbGxvYyhleHBvcnRfc2l6ZSk7CisjICAgICBsc2VlayAoZGxsLCBleHBwdHIsIFNFRUtfU0VUKTsKKyMgICAgIHJlYWQgKGRsbCwgZXhwZGF0YSwgZXhwb3J0X3NpemUpOworIyAgICAgZXJ2YSA9IGV4cGRhdGEgLSBleHBvcnRfcnZhOworIworIyAgICAgbmV4cCA9IHBlX2FzMzIgKGV4cGRhdGErMjQpOworIyAgICAgbmFtZV9ydmFzID0gcGVfYXMzMiAoZXhwZGF0YSszMik7CisjCisjICAgICBwcmludGYgKCJFWFBPUlRTXG4iKTsKKyMgICAgIGZvciAoaSA9IDA7IGk8bmV4cDsgaSsrKQorIyAgICAgeworIyAJdW5zaWduZWQgbG9uZyBuYW1lX3J2YSA9IHBlX2FzMzIgKGVydmErbmFtZV9ydmFzK2kqNCk7CisjIAlwcmludGYgKCJcdCVzIEAgJWxkIDtcbiIsIGVydmErbmFtZV9ydmEsIDErIGkpOworIyAgICAgfQorIworIyAgICAgcmV0dXJuIDA7CisjIH0KKyMgLyogaW1wZ2VuLmMgZW5kcyBoZXJlICovCisKK0VPRgorICAgIDs7CisgIGVzYWMKKworICAjIFdlIHVzZSBzZWQgaW5zdGVhZCBvZiBjYXQgYmVjYXVzZSBiYXNoIG9uIERKR1BQIGdldHMgY29uZnVzZWQgaWYKKyAgIyBpZiBmaW5kcyBtaXhlZCBDUi9MRiBhbmQgTEYtb25seSBsaW5lcy4gIFNpbmNlIHNlZCBvcGVyYXRlcyBpbgorICAjIHRleHQgbW9kZSwgaXQgcHJvcGVybHkgY29udmVydHMgbGluZXMgdG8gQ1IvTEYuICBUaGlzIGJhc2ggcHJvYmxlbQorICAjIGlzIHJlcG9ydGVkbHkgZml4ZWQsIGJ1dCB3aHkgbm90IHJ1biBvbiBvbGQgdmVyc2lvbnMgdG9vPworICBzZWQgJyRxJyAiJGx0bWFpbiIgPj4gIiR7b2ZpbGV9VCIgfHwgKHJtIC1mICIke29maWxlfVQiOyBleGl0IDEpCisKKyAgbXYgLWYgIiR7b2ZpbGV9VCIgIiRvZmlsZSIgfHwgXAorICAgIChybSAtZiAiJG9maWxlIiAmJiBjcCAiJHtvZmlsZX1UIiAiJG9maWxlIiAmJiBybSAtZiAiJHtvZmlsZX1UIikKKyAgY2htb2QgK3ggIiRvZmlsZSIKK2ZpCisKK10pIyBfTFRfQUNfTFRDT05GSUdfSEFDSworCisjIEFDX0xJQlRPT0xfRExPUEVOIC0gZW5hYmxlIGNoZWNrcyBmb3IgZGxvcGVuIHN1cHBvcnQKK0FDX0RFRlVOKFtBQ19MSUJUT09MX0RMT1BFTl0sIFtBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pXSkKKworIyBBQ19MSUJUT09MX1dJTjMyX0RMTCAtIGRlY2xhcmUgcGFja2FnZSBzdXBwb3J0IGZvciBidWlsZGluZyB3aW4zMiBkbGwncworQUNfREVGVU4oW0FDX0xJQlRPT0xfV0lOMzJfRExMXSwgW0FDX0JFRk9SRShbJDBdLCBbQUNfTElCVE9PTF9TRVRVUF0pXSkKKworIyBBQ19FTkFCTEVfU0hBUkVEIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zaGFyZWQgZmxhZworIyBVc2FnZTogQUNfRU5BQkxFX1NIQVJFRFsoREVGQVVMVCldCisjICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCisjICAgYHllcycuCitBQ19ERUZVTihbQUNfRU5BQkxFX1NIQVJFRF0sCitbZGVmaW5lKFtBQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKK0FDX0FSR19FTkFCTEUoc2hhcmVkLAorY2hhbmdlcXVvdGUoPDwsID4+KWRubAorPDwgIC0tZW5hYmxlLXNoYXJlZFs9UEtHU10gIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgW2RlZmF1bHQ9Pj5BQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFRdLAorY2hhbmdlcXVvdGUoWywgXSlkbmwKK1twPSR7UEFDS0FHRS1kZWZhdWx0fQorY2FzZSAkZW5hYmxldmFsIGluCit5ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7CitubykgZW5hYmxlX3NoYXJlZD1ubyA7OworKikKKyAgZW5hYmxlX3NoYXJlZD1ubworICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgorICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisgICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKyAgICAgIGVuYWJsZV9zaGFyZWQ9eWVzCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgOzsKK2VzYWNdLAorZW5hYmxlX3NoYXJlZD1BQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFQpZG5sCitdKQorCisjIEFDX0RJU0FCTEVfU0hBUkVEIC0gc2V0IHRoZSBkZWZhdWx0IHNoYXJlZCBmbGFnIHRvIC0tZGlzYWJsZS1zaGFyZWQKK0FDX0RFRlVOKFtBQ19ESVNBQkxFX1NIQVJFRF0sCitbQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfU0VUVVBdKWRubAorQUNfRU5BQkxFX1NIQVJFRChubyldKQorCisjIEFDX0VOQUJMRV9TVEFUSUMgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXN0YXRpYyBmbGFnCisjIFVzYWdlOiBBQ19FTkFCTEVfU1RBVElDWyhERUZBVUxUKV0KKyMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KKyMgICBgeWVzJy4KK0FDX0RFRlVOKFtBQ19FTkFCTEVfU1RBVElDXSwKK1tkZWZpbmUoW0FDX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAorQUNfQVJHX0VOQUJMRShzdGF0aWMsCitjaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCis8PCAgLS1lbmFibGUtc3RhdGljWz1QS0dTXSAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBbZGVmYXVsdD0+PkFDX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sCitjaGFuZ2VxdW90ZShbLCBdKWRubAorW3A9JHtQQUNLQUdFLWRlZmF1bHR9CitjYXNlICRlbmFibGV2YWwgaW4KK3llcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKK25vKSBlbmFibGVfc3RhdGljPW5vIDs7CisqKQorICBlbmFibGVfc3RhdGljPW5vCisgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCisgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKyAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorICAgICAgZW5hYmxlX3N0YXRpYz15ZXMKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICA7OworZXNhY10sCitlbmFibGVfc3RhdGljPUFDX0VOQUJMRV9TVEFUSUNfREVGQVVMVClkbmwKK10pCisKKyMgQUNfRElTQUJMRV9TVEFUSUMgLSBzZXQgdGhlIGRlZmF1bHQgc3RhdGljIGZsYWcgdG8gLS1kaXNhYmxlLXN0YXRpYworQUNfREVGVU4oW0FDX0RJU0FCTEVfU1RBVElDXSwKK1tBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCitBQ19FTkFCTEVfU1RBVElDKG5vKV0pCisKKworIyBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1mYXN0LWluc3RhbGwgZmxhZworIyBVc2FnZTogQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTFsoREVGQVVMVCldCisjICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCisjICAgYHllcycuCitBQ19ERUZVTihbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF0sCitbZGVmaW5lKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKK0FDX0FSR19FTkFCTEUoZmFzdC1pbnN0YWxsLAorY2hhbmdlcXVvdGUoPDwsID4+KWRubAorPDwgIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10gIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBbZGVmYXVsdD0+PkFDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVF0sCitjaGFuZ2VxdW90ZShbLCBdKWRubAorW3A9JHtQQUNLQUdFLWRlZmF1bHR9CitjYXNlICRlbmFibGV2YWwgaW4KK3llcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKK25vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7CisqKQorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCisgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCisgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKyAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICA7OworZXNhY10sCitlbmFibGVfZmFzdF9pbnN0YWxsPUFDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVClkbmwKK10pCisKKyMgQUNfRElTQUJMRV9GQVNUX0lOU1RBTEwgLSBzZXQgdGhlIGRlZmF1bHQgdG8gLS1kaXNhYmxlLWZhc3QtaW5zdGFsbAorQUNfREVGVU4oW0FDX0RJU0FCTEVfRkFTVF9JTlNUQUxMXSwKK1tBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCitBQ19FTkFCTEVfRkFTVF9JTlNUQUxMKG5vKV0pCisKKyMgQUNfTElCVE9PTF9QSUNNT0RFIC0gaW1wbGVtZW50IHRoZSAtLXdpdGgtcGljIGZsYWcKKyMgVXNhZ2U6IEFDX0xJQlRPT0xfUElDTU9ERVsoTU9ERSldCisjICAgV2hlcmUgTU9ERSBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCisjICAgYGJvdGgnLgorQUNfREVGVU4oW0FDX0xJQlRPT0xfUElDTU9ERV0sCitbQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfU0VUVVBdKWRubAorcGljX21vZGU9aWZlbHNlKCQjLDEsJDEsZGVmYXVsdCldKQorCisKKyMgQUNfUEFUSF9UT09MX1BSRUZJWCAtIGZpbmQgYSBmaWxlIHByb2dyYW0gd2hpY2ggY2FuIHJlY29nbmlzZSBzaGFyZWQgbGlicmFyeQorQUNfREVGVU4oW0FDX1BBVEhfVE9PTF9QUkVGSVhdLAorW0FDX01TR19DSEVDS0lORyhbZm9yICQxXSkKK0FDX0NBQ0hFX1ZBTChsdF9jdl9wYXRoX01BR0lDX0NNRCwKK1tjYXNlICRNQUdJQ19DTUQgaW4KKyAgLyopCisgIGx0X2N2X3BhdGhfTUFHSUNfQ01EPSIkTUFHSUNfQ01EIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgPzovKikKKyAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KKyAgOzsKKyAgKikKKyAgYWNfc2F2ZV9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiCisgIElGUz0iJHtJRlM9ICAgfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorZG5sICRhY19kdW1teSBmb3JjZXMgc3BsaXR0aW5nIG9uIGNvbnN0YW50IHVzZXItc3VwcGxpZWQgcGF0aHMuCitkbmwgUE9TSVguMiB3b3JkIHNwbGl0dGluZyBpcyBkb25lIG9ubHkgb24gdGhlIG91dHB1dCBvZiB3b3JkIGV4cGFuc2lvbnMsCitkbmwgbm90IGV2ZXJ5IHdvcmQuICBUaGlzIGNsb3NlcyBhIGxvbmdzdGFuZGluZyBzaCBzZWN1cml0eSBob2xlLgorICBhY19kdW1teT0iaWZlbHNlKFskMl0sICwgJFBBVEgsIFskMl0pIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kMTsgdGhlbgorICAgICAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRhY19kaXIvJDEiCisgICAgICBpZiB0ZXN0IC1uICIkZmlsZV9tYWdpY190ZXN0X2ZpbGUiOyB0aGVuCisJY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KKwkiZmlsZV9tYWdpYyAiKikKKwkgIGZpbGVfbWFnaWNfcmVnZXg9ImBleHByIFwiJGRlcGxpYnNfY2hlY2tfbWV0aG9kXCIgOiBcImZpbGVfbWFnaWMgXCguKlwpXCJgIgorCSAgTUFHSUNfQ01EPSIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiCisJICBpZiBldmFsICRmaWxlX21hZ2ljX2NtZCBcJGZpbGVfbWFnaWNfdGVzdF9maWxlIDI+IC9kZXYvbnVsbCB8CisJICAgIGVncmVwICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgOgorCSAgZWxzZQorCSAgICBjYXQgPDxFT0YgMT4mMgorCisqKiogV2FybmluZzogdGhlIGNvbW1hbmQgbGlidG9vbCB1c2VzIHRvIGRldGVjdCBzaGFyZWQgbGlicmFyaWVzLAorKioqICRmaWxlX21hZ2ljX2NtZCwgcHJvZHVjZXMgb3V0cHV0IHRoYXQgbGlidG9vbCBjYW5ub3QgcmVjb2duaXplLgorKioqIFRoZSByZXN1bHQgaXMgdGhhdCBsaWJ0b29sIG1heSBmYWlsIHRvIHJlY29nbml6ZSBzaGFyZWQgbGlicmFyaWVzCisqKiogYXMgc3VjaC4gIFRoaXMgd2lsbCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzIHRoYXQKKyoqKiBkZXBlbmQgb24gc2hhcmVkIGxpYnJhcmllcywgYnV0IHByb2dyYW1zIGxpbmtlZCB3aXRoIHN1Y2ggbGlidG9vbAorKioqIGxpYnJhcmllcyB3aWxsIHdvcmsgcmVnYXJkbGVzcyBvZiB0aGlzIHByb2JsZW0uICBOZXZlcnRoZWxlc3MsIHlvdQorKioqIG1heSB3YW50IHRvIHJlcG9ydCB0aGUgcHJvYmxlbSB0byB5b3VyIHN5c3RlbSBtYW5hZ2VyIGFuZC9vciB0bworKioqIGJ1Zy1saWJ0b29sQGdudS5vcmcKKworRU9GCisJICBmaSA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIE1BR0lDX0NNRD0iJGFjX3NhdmVfTUFHSUNfQ01EIgorICA7OworZXNhY10pCitNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKK2lmIHRlc3QgLW4gIiRNQUdJQ19DTUQiOyB0aGVuCisgIEFDX01TR19SRVNVTFQoJE1BR0lDX0NNRCkKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChubykKK2ZpCitdKQorCisKKyMgQUNfUEFUSF9NQUdJQyAtIGZpbmQgYSBmaWxlIHByb2dyYW0gd2hpY2ggY2FuIHJlY29nbmlzZSBhIHNoYXJlZCBsaWJyYXJ5CitBQ19ERUZVTihbQUNfUEFUSF9NQUdJQ10sCitbQUNfUkVRVUlSRShbQUNfQ0hFQ0tfVE9PTF9QUkVGSVhdKWRubAorQUNfUEFUSF9UT09MX1BSRUZJWCgke2FjX3Rvb2xfcHJlZml4fWZpbGUsIC91c3IvYmluOiRQQVRIKQoraWYgdGVzdCAteiAiJGx0X2N2X3BhdGhfTUFHSUNfQ01EIjsgdGhlbgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICAgQUNfUEFUSF9UT09MX1BSRUZJWChmaWxlLCAvdXNyL2JpbjokUEFUSCkKKyAgZWxzZQorICAgIE1BR0lDX0NNRD06CisgIGZpCitmaQorXSkKKworCisjIEFDX1BST0dfTEQgLSBmaW5kIHRoZSBwYXRoIHRvIHRoZSBHTlUgb3Igbm9uLUdOVSBsaW5rZXIKK0FDX0RFRlVOKFtBQ19QUk9HX0xEXSwKK1tBQ19BUkdfV0lUSChnbnUtbGQsCitbICAtLXdpdGgtZ251LWxkICAgICAgICAgICBhc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgW2RlZmF1bHQ9bm9dXSwKK3Rlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcywgd2l0aF9nbnVfbGQ9bm8pCitBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCitBQ19SRVFVSVJFKFtfTFRfQUNfTElCVE9PTF9TWVNfUEFUSF9TRVBBUkFUT1JdKWRubAorYWNfcHJvZz1sZAoraWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCisgIEFDX01TR19DSEVDS0lORyhbZm9yIGxkIHVzZWQgYnkgR0NDXSkKKyAgY2FzZSAkaG9zdCBpbgorICAqLSotbWluZ3cqKQorICAgICMgZ2NjIGxlYXZlcyBhIHRyYWlsaW5nIGNhcnJpYWdlIHJldHVybiB3aGljaCB1cHNldHMgbWluZ3cKKyAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjUgfCB0ciAtZCAnXDAxNSdgIDs7CisgICopCisgICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YCA7OworICBlc2FjCisgIGNhc2UgJGFjX3Byb2cgaW4KKyAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KKyAgICBbW1xcL11dKiB8IFtbQS1aYS16XV06W1tcXC9dXSopCisgICAgICByZV9kaXJlbHQ9Jy9bW14vXV1bW14vXV0qL1wuXC4vJworICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKKyAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCisgICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KKwlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCisgICAgICBkb25lCisgICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKKyAgICAgIDs7CisgICIiKQorICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgorICAgIGFjX3Byb2c9bGQKKyAgICA7OworICAqKQorICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KKyAgICB3aXRoX2dudV9sZD11bmtub3duCisgICAgOzsKKyAgZXNhYworZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgIEFDX01TR19DSEVDS0lORyhbZm9yIEdOVSBsZF0pCitlbHNlCisgIEFDX01TR19DSEVDS0lORyhbZm9yIG5vbi1HTlUgbGRdKQorZmkKK0FDX0NBQ0hFX1ZBTChsdF9jdl9wYXRoX0xELAorW2lmIHRlc3QgLXogIiRMRCI7IHRoZW4KKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciIHx8IHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ckYWNfZXhlZXh0IjsgdGhlbgorICAgICAgbHRfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKKyAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKKyAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KKyAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgorICAgICAgaWYgIiRsdF9jdl9wYXRoX0xEIiAtdiAyPiYxIDwgL2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgorCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKKyAgICAgIGVsc2UKKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZWxzZQorICBsdF9jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorZmldKQorTEQ9IiRsdF9jdl9wYXRoX0xEIgoraWYgdGVzdCAtbiAiJExEIjsgdGhlbgorICBBQ19NU0dfUkVTVUxUKCRMRCkKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChubykKK2ZpCit0ZXN0IC16ICIkTEQiICYmIEFDX01TR19FUlJPUihbbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEhdKQorQUNfUFJPR19MRF9HTlUKK10pCisKKyMgQUNfUFJPR19MRF9HTlUgLQorQUNfREVGVU4oW0FDX1BST0dfTERfR05VXSwKK1tBQ19DQUNIRV9DSEVDSyhbaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGRdLCBsdF9jdl9wcm9nX2dudV9sZCwKK1sjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgoraWYgJExEIC12IDI+JjEgPC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgMT4mNTsgdGhlbgorICBsdF9jdl9wcm9nX2dudV9sZD15ZXMKK2Vsc2UKKyAgbHRfY3ZfcHJvZ19nbnVfbGQ9bm8KK2ZpXSkKK3dpdGhfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZAorXSkKKworIyBBQ19QUk9HX0xEX1JFTE9BRF9GTEFHIC0gZmluZCByZWxvYWQgZmxhZyBmb3IgbGlua2VyCisjICAgLS0gUE9SVE1FIFNvbWUgbGlua2VycyBtYXkgbmVlZCBhIGRpZmZlcmVudCByZWxvYWQgZmxhZy4KK0FDX0RFRlVOKFtBQ19QUk9HX0xEX1JFTE9BRF9GTEFHXSwKK1tBQ19DQUNIRV9DSEVDSyhbZm9yICRMRCBvcHRpb24gdG8gcmVsb2FkIG9iamVjdCBmaWxlc10sIGx0X2N2X2xkX3JlbG9hZF9mbGFnLAorW2x0X2N2X2xkX3JlbG9hZF9mbGFnPSctciddKQorcmVsb2FkX2ZsYWc9JGx0X2N2X2xkX3JlbG9hZF9mbGFnCit0ZXN0IC1uICIkcmVsb2FkX2ZsYWciICYmIHJlbG9hZF9mbGFnPSIgJHJlbG9hZF9mbGFnIgorXSkKKworIyBBQ19ERVBMSUJTX0NIRUNLX01FVEhPRCAtIGhvdyB0byBjaGVjayBmb3IgbGlicmFyeSBkZXBlbmRlbmNpZXMKKyMgIC0tIFBPUlRNRSBmaWxsIGluIHdpdGggdGhlIGR5bmFtaWMgbGlicmFyeSBjaGFyYWN0ZXJpc3RpY3MKK0FDX0RFRlVOKFtBQ19ERVBMSUJTX0NIRUNLX01FVEhPRF0sCitbQUNfQ0FDSEVfQ0hFQ0soW2hvdyB0byByZWNvZ25pc2UgZGVwZW5kYW50IGxpYnJhcmllc10sCitsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZCwKK1tsdF9jdl9maWxlX21hZ2ljX2NtZD0nJE1BR0lDX0NNRCcKK2x0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPQorbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J3Vua25vd24nCisjIE5lZWQgdG8gc2V0IHRoZSBwcmVjZWRpbmcgdmFyaWFibGUgb24gYWxsIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQKKyMgaW50ZXJsaWJyYXJ5IGRlcGVuZGVuY2llcy4KKyMgJ25vbmUnIC0tIGRlcGVuZGVuY2llcyBub3Qgc3VwcG9ydGVkLgorIyBgdW5rbm93bicgLS0gc2FtZSBhcyBub25lLCBidXQgZG9jdW1lbnRzIHRoYXQgd2UgcmVhbGx5IGRvbid0IGtub3cuCisjICdwYXNzX2FsbCcgLS0gYWxsIGRlcGVuZGVuY2llcyBwYXNzZWQgd2l0aCBubyBjaGVja3MuCisjICd0ZXN0X2NvbXBpbGUnIC0tIGNoZWNrIGJ5IG1ha2luZyB0ZXN0IHByb2dyYW0uCisjICdmaWxlX21hZ2ljIFtbcmVnZXhdXScgLS0gY2hlY2sgYnkgbG9va2luZyBmb3IgZmlsZXMgaW4gbGlicmFyeSBwYXRoCisjIHdoaWNoIHJlc3BvbmRzIHRvIHRoZSAkZmlsZV9tYWdpY19jbWQgd2l0aCBhIGdpdmVuIGVncmVwIHJlZ2V4LgorIyBJZiB5b3UgaGF2ZSBgZmlsZScgb3IgZXF1aXZhbGVudCBvbiB5b3VyIHN5c3RlbSBhbmQgeW91J3JlIG5vdCBzdXJlCisjIHdoZXRoZXIgYHBhc3NfYWxsJyB3aWxsICphbHdheXMqIHdvcmssIHlvdSBwcm9iYWJseSB3YW50IHRoaXMgb25lLgorCitjYXNlICRob3N0X29zIGluCithaXg0KiB8IGFpeDUqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitiZW9zKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworYnNkaTQqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgW1swLTldXVtbMC05XV0qLWJpdCBbW01MXV1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYiknCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvdXNyL2Jpbi9maWxlIC1MJworICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vc2hsaWIvbGliYy5zbworICA7OworCitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIGZpbGUgZm9ybWF0IHBlaSotaTM4NiguKmFyY2hpdGVjdHVyZTogaTM4Nik/JworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nJE9CSkRVTVAgLWYnCisgIDs7CisKK2RhcndpbiogfCByaGFwc29keSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIE1hY2gtTyBkeW5hbWljYWxseSBsaW5rZWQgc2hhcmVkIGxpYnJhcnknCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvdXNyL2Jpbi9maWxlIC1MJworICBjYXNlICIkaG9zdF9vcyIgaW4KKyAgcmhhcHNvZHkqIHwgZGFyd2luMS5bWzAxMl1dKQorICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL1N5c3RlbS5mcmFtZXdvcmsvVmVyc2lvbnMvKi9TeXN0ZW0gfCBoZWFkIC0xYAorICAgIDs7CisgICopICMgRGFyd2luIDEuMyBvbgorICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPScvdXNyL2xpYi9saWJTeXN0ZW0uZHlsaWInCisgICAgOzsKKyAgZXNhYworICA7OworCitmcmVlYnNkKikKKyAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPiAvZGV2L251bGw7IHRoZW4KKyAgICBjYXNlICRob3N0X2NwdSBpbgorICAgIGkqODYgKQorICAgICAgIyBOb3Qgc3VyZSB3aGV0aGVyIHRoZSBwcmVzZW5jZSBvZiBPcGVuQlNEIGhlcmUgd2FzIGEgbWlzdGFrZS4KKyAgICAgICMgTGV0J3MgYWNjZXB0IGJvdGggb2YgdGhlbSB1bnRpbCB0aGlzIGlzIGNsZWFyZWQgdXAuCisgICAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoRnJlZUJTRHxPcGVuQlNEKS9pW1szLTldXTg2IChjb21wYWN0ICk/ZGVtYW5kIHBhZ2VkIHNoYXJlZCBsaWJyYXJ5JworICAgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQorICAgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL3Vzci9saWIvbGliYy5zby4qYAorICAgICAgOzsKKyAgICBlc2FjCisgIGVsc2UKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICBmaQorICA7OworCitnbnUqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitocHV4MTAuMjAqfGhwdXgxMSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzW1swLTldXVtbMC05XV1bWzAtOV1dfFBBLVJJU0NbWzAtOV1dLltbMC05XV0pIHNoYXJlZCBsaWJyYXJ5JworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCisgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2xpYmMuc2wKKyAgOzsKKworaXJpeDUqIHwgaXJpeDYqKQorICBjYXNlICRob3N0X29zIGluCisgIGlyaXg1KikKKyAgICAjIHRoaXMgd2lsbCBiZSBvdmVycmlkZGVuIHdpdGggcGFzc19hbGwsIGJ1dCBsZXQgdXMga2VlcCBpdCBqdXN0IGluIGNhc2UKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0iZmlsZV9tYWdpYyBFTEYgMzItYml0IE1TQiBkeW5hbWljIGxpYiBNSVBTIC0gdmVyc2lvbiAxIgorICAgIDs7CisgICopCisgICAgY2FzZSAkTEQgaW4KKyAgICAqLTMyfCoiLTMyICIpIGxpYm1hZ2ljPTMyLWJpdDs7CisgICAgKi1uMzJ8KiItbjMyICIpIGxpYm1hZ2ljPU4zMjs7CisgICAgKi02NHwqIi02NCAiKSBsaWJtYWdpYz02NC1iaXQ7OworICAgICopIGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKKyAgICBlc2FjCisgICAgIyB0aGlzIHdpbGwgYmUgb3ZlcnJpZGRlbiB3aXRoIHBhc3NfYWxsLCBidXQgbGV0IHVzIGtlZXAgaXQganVzdCBpbiBjYXNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9ImZpbGVfbWFnaWMgRUxGICR7bGlibWFnaWN9IE1TQiBtaXBzLVtbMTIzNF1dIGR5bmFtaWMgbGliIE1JUFMgLSB2ZXJzaW9uIDEiCisgICAgOzsKKyAgZXNhYworICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvbGliJHtsaWJzdWZmfS9saWJjLnNvKmAKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgorbGludXgqKQorICBjYXNlICRob3N0X2NwdSBpbgorICBhbHBoYSogfCBocHBhKiB8IGkqODYgfCBwb3dlcnBjKiB8IHNwYXJjKiB8IGlhNjQqIHwgczM5MCogfCBtNjgqIHwgbWlwcyogKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsIDs7CisgICopCisgICAgIyBnbGliYyB1cCB0byAyLjEuMSBkb2VzIG5vdCBwZXJmb3JtIHNvbWUgcmVsb2NhdGlvbnMgb24gQVJNCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tMTV1dU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIgKScgOzsKKyAgZXNhYworICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvbGliL2xpYmMuc28qIC9saWIvbGliYy0qLnNvYAorICA7OworCituZXRic2QqKQorICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbW14vXC5dXStcLnNvXC5bWzAtOV1dK1wuW1swLTldXSskJworICBlbHNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYltbXi9cLl1dK1wuc28kJworICBmaQorICA7OworCituZXdvczYqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgW1swLTldXVtbMC05XV0qLWJpdCBbW01MXV1TQiAoZXhlY3V0YWJsZXxkeW5hbWljIGxpYiknCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKKyAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvbGlibmxzLnNvCisgIDs7CisKK29wZW5ic2QqKQorICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCisgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC91c3IvbGliL2xpYmMuc28uKmAKKyAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tMTV1dU0Igc2hhcmVkIG9iamVjdCcKKyAgZWxzZQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIE9wZW5CU0QuKiBzaGFyZWQgbGlicmFyeScKKyAgZmkKKyAgOzsKKworb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAjIHRoaXMgd2lsbCBiZSBvdmVycmlkZGVuIHdpdGggcGFzc19hbGwsIGJ1dCBsZXQgdXMga2VlcCBpdCBqdXN0IGluIGNhc2UKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgQ09GRiBmb3JtYXQgYWxwaGEgc2hhcmVkIGxpYnJhcnknCisgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9zaGxpYi9saWJjLnNvCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK3NjbzMuMnY1KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworc29sYXJpcyopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9saWIvbGliYy5zbworICA7OworCitzeXN2NXV3W1s3OF1dKiB8IHN5c3Y0KnV3MiopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK3N5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKiB8IHN5c3Y1KikKKyAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKyAgbW90b3JvbGEpCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tNTF1dU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIpIE1bWzAtOV1dW1swLTldXSogVmVyc2lvbiBbWzAtOV1dJworICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC91c3IvbGliL2xpYmMuc28qYAorICAgIDs7CisgIG5jcikKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICAgIDs7CisgIHNlcXVlbnQpCisgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy9iaW4vZmlsZScKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgW1swLTldXVtbMC05XV0qLWJpdCBbW0xNXV1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYiApJworICAgIDs7CisgIHNuaSkKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL2Jpbi9maWxlJworICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSJmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTE1dXVNCIGR5bmFtaWMgbGliIgorICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9saWIvbGliYy5zbworICAgIDs7CisgIGVzYWMKKyAgOzsKK2VzYWMKK10pCitmaWxlX21hZ2ljX2NtZD0kbHRfY3ZfZmlsZV9tYWdpY19jbWQKK2RlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZAorXSkKKworCisjIEFDX1BST0dfTk0gLSBmaW5kIHRoZSBwYXRoIHRvIGEgQlNELWNvbXBhdGlibGUgbmFtZSBsaXN0ZXIKK0FDX0RFRlVOKFtBQ19QUk9HX05NXSwKK1tBQ19SRVFVSVJFKFtfTFRfQUNfTElCVE9PTF9TWVNfUEFUSF9TRVBBUkFUT1JdKWRubAorQUNfTVNHX0NIRUNLSU5HKFtmb3IgQlNELWNvbXBhdGlibGUgbm1dKQorQUNfQ0FDSEVfVkFMKGx0X2N2X3BhdGhfTk0sCitbaWYgdGVzdCAtbiAiJE5NIjsgdGhlbgorICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KKyAgbHRfY3ZfcGF0aF9OTT0iJE5NIgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2JpbiAvdXNyL3VjYiAvYmluOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgdG1wX25tPSRhY19kaXIvJHthY190b29sX3ByZWZpeH1ubQorICAgIGlmIHRlc3QgLWYgJHRtcF9ubSB8fCB0ZXN0IC1mICR0bXBfbm0kYWNfZXhlZXh0IDsgdGhlbgorICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCisgICAgICAjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgorICAgICAgIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAorICAgICAgIyBUcnU2NCdzIG5tIGNvbXBsYWlucyB0aGF0IC9kZXYvbnVsbCBpcyBhbiBpbnZhbGlkIG9iamVjdCBmaWxlCisgICAgICBpZiAoJHRtcF9ubSAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgJygvZGV2L251bGx8SW52YWxpZCBmaWxlIG9yIG9iamVjdCB0eXBlKScgPi9kZXYvbnVsbDsgdGhlbgorCWx0X2N2X3BhdGhfTk09IiR0bXBfbm0gLUIiCisJYnJlYWsKKyAgICAgIGVsaWYgKCR0bXBfbm0gLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCisJbHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSAtcCIKKwlicmVhaworICAgICAgZWxzZQorCWx0X2N2X3BhdGhfTk09JHtsdF9jdl9wYXRoX05NPSIkdG1wX25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0CisJY29udGludWUgIyBzbyB0aGF0IHdlIGNhbiB0cnkgdG8gZmluZCBvbmUgdGhhdCBzdXBwb3J0cyBCU0QgZmxhZ3MKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGx0X2N2X3BhdGhfTk0iICYmIGx0X2N2X3BhdGhfTk09bm0KK2ZpXSkKK05NPSIkbHRfY3ZfcGF0aF9OTSIKK0FDX01TR19SRVNVTFQoWyROTV0pCitdKQorCisjIEFDX0NIRUNLX0xJQk0gLSBjaGVjayBmb3IgbWF0aCBsaWJyYXJ5CitBQ19ERUZVTihbQUNfQ0hFQ0tfTElCTV0sCitbQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorTElCTT0KK2Nhc2UgJGhvc3QgaW4KKyotKi1iZW9zKiB8ICotKi1jeWd3aW4qIHwgKi0qLXB3MzIqKQorICAjIFRoZXNlIHN5c3RlbSBkb24ndCBoYXZlIGxpYm0KKyAgOzsKKyotbmNyLXN5c3Y0LjMqKQorICBBQ19DSEVDS19MSUIobXcsIF9td3ZhbGlkY2hlY2tsLCBMSUJNPSItbG13IikKKyAgQUNfQ0hFQ0tfTElCKG0sIG1haW4sIExJQk09IiRMSUJNIC1sbSIpCisgIDs7CisqKQorICBBQ19DSEVDS19MSUIobSwgbWFpbiwgTElCTT0iLWxtIikKKyAgOzsKK2VzYWMKK10pCisKKyMgQUNfTElCTFRETF9DT05WRU5JRU5DRVsoZGlyKV0gLSBzZXRzIExJQkxUREwgdG8gdGhlIGxpbmsgZmxhZ3MgZm9yCisjIHRoZSBsaWJsdGRsIGNvbnZlbmllbmNlIGxpYnJhcnkgYW5kIElOQ0xUREwgdG8gdGhlIGluY2x1ZGUgZmxhZ3MgZm9yCisjIHRoZSBsaWJsdGRsIGhlYWRlciBhbmQgYWRkcyAtLWVuYWJsZS1sdGRsLWNvbnZlbmllbmNlIHRvIHRoZQorIyBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0IExJQkxUREwgYW5kIElOQ0xUREwgYXJlIG5vdAorIyBBQ19TVUJTVGVkLCBub3IgaXMgQUNfQ09ORklHX1NVQkRJUlMgY2FsbGVkLiAgSWYgRElSIGlzIG5vdAorIyBwcm92aWRlZCwgaXQgaXMgYXNzdW1lZCB0byBiZSBgbGlibHRkbCcuICBMSUJMVERMIHdpbGwgYmUgcHJlZml4ZWQKKyMgd2l0aCAnJHt0b3BfYnVpbGRkaXJ9LycgYW5kIElOQ0xUREwgd2lsbCBiZSBwcmVmaXhlZCB3aXRoCisjICcke3RvcF9zcmNkaXJ9LycgKG5vdGUgdGhlIHNpbmdsZSBxdW90ZXMhKS4gIElmIHlvdXIgcGFja2FnZSBpcyBub3QKKyMgZmxhdCBhbmQgeW91J3JlIG5vdCB1c2luZyBhdXRvbWFrZSwgZGVmaW5lIHRvcF9idWlsZGRpciBhbmQKKyMgdG9wX3NyY2RpciBhcHByb3ByaWF0ZWx5IGluIHRoZSBNYWtlZmlsZXMuCitBQ19ERUZVTihbQUNfTElCTFRETF9DT05WRU5JRU5DRV0sCitbQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfU0VUVVBdKWRubAorICBjYXNlICRlbmFibGVfbHRkbF9jb252ZW5pZW5jZSBpbgorICBubykgQUNfTVNHX0VSUk9SKFt0aGlzIHBhY2thZ2UgbmVlZHMgYSBjb252ZW5pZW5jZSBsaWJsdGRsXSkgOzsKKyAgIiIpIGVuYWJsZV9sdGRsX2NvbnZlbmllbmNlPXllcworICAgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAtLWVuYWJsZS1sdGRsLWNvbnZlbmllbmNlIiA7OworICBlc2FjCisgIExJQkxUREw9JyR7dG9wX2J1aWxkZGlyfS8naWZlbHNlKCQjLDEsWyQxXSxbJ2xpYmx0ZGwnXSkvbGlibHRkbGMubGEKKyAgSU5DTFRETD0nLUkke3RvcF9zcmNkaXJ9LydpZmVsc2UoJCMsMSxbJDFdLFsnbGlibHRkbCddKQorXSkKKworIyBBQ19MSUJMVERMX0lOU1RBTExBQkxFWyhkaXIpXSAtIHNldHMgTElCTFRETCB0byB0aGUgbGluayBmbGFncyBmb3IKKyMgdGhlIGxpYmx0ZGwgaW5zdGFsbGFibGUgbGlicmFyeSBhbmQgSU5DTFRETCB0byB0aGUgaW5jbHVkZSBmbGFncyBmb3IKKyMgdGhlIGxpYmx0ZGwgaGVhZGVyIGFuZCBhZGRzIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbCB0byB0aGUgY29uZmlndXJlCisjIGFyZ3VtZW50cy4gIE5vdGUgdGhhdCBMSUJMVERMIGFuZCBJTkNMVERMIGFyZSBub3QgQUNfU1VCU1RlZCwgbm9yIGlzCisjIEFDX0NPTkZJR19TVUJESVJTIGNhbGxlZC4gIElmIERJUiBpcyBub3QgcHJvdmlkZWQgYW5kIGFuIGluc3RhbGxlZAorIyBsaWJsdGRsIGlzIG5vdCBmb3VuZCwgaXQgaXMgYXNzdW1lZCB0byBiZSBgbGlibHRkbCcuICBMSUJMVERMIHdpbGwKKyMgYmUgcHJlZml4ZWQgd2l0aCAnJHt0b3BfYnVpbGRkaXJ9LycgYW5kIElOQ0xUREwgd2lsbCBiZSBwcmVmaXhlZAorIyB3aXRoICcke3RvcF9zcmNkaXJ9LycgKG5vdGUgdGhlIHNpbmdsZSBxdW90ZXMhKS4gIElmIHlvdXIgcGFja2FnZSBpcworIyBub3QgZmxhdCBhbmQgeW91J3JlIG5vdCB1c2luZyBhdXRvbWFrZSwgZGVmaW5lIHRvcF9idWlsZGRpciBhbmQKKyMgdG9wX3NyY2RpciBhcHByb3ByaWF0ZWx5IGluIHRoZSBNYWtlZmlsZXMuCisjIEluIHRoZSBmdXR1cmUsIHRoaXMgbWFjcm8gbWF5IGhhdmUgdG8gYmUgY2FsbGVkIGFmdGVyIEFDX1BST0dfTElCVE9PTC4KK0FDX0RFRlVOKFtBQ19MSUJMVERMX0lOU1RBTExBQkxFXSwKK1tBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCisgIEFDX0NIRUNLX0xJQihsdGRsLCBtYWluLAorICBbdGVzdCB4IiRlbmFibGVfbHRkbF9pbnN0YWxsIiAhPSB4eWVzICYmIGVuYWJsZV9sdGRsX2luc3RhbGw9bm9dLAorICBbaWYgdGVzdCB4IiRlbmFibGVfbHRkbF9pbnN0YWxsIiA9IHhubzsgdGhlbgorICAgICBBQ19NU0dfV0FSTihbbGlibHRkbCBub3QgaW5zdGFsbGVkLCBidXQgaW5zdGFsbGF0aW9uIGRpc2FibGVkXSkKKyAgIGVsc2UKKyAgICAgZW5hYmxlX2x0ZGxfaW5zdGFsbD15ZXMKKyAgIGZpCisgIF0pCisgIGlmIHRlc3QgeCIkZW5hYmxlX2x0ZGxfaW5zdGFsbCIgPSB4InllcyI7IHRoZW4KKyAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbCIKKyAgICBMSUJMVERMPScke3RvcF9idWlsZGRpcn0vJ2lmZWxzZSgkIywxLFskMV0sWydsaWJsdGRsJ10pL2xpYmx0ZGwubGEKKyAgICBJTkNMVERMPSctSSR7dG9wX3NyY2Rpcn0vJ2lmZWxzZSgkIywxLFskMV0sWydsaWJsdGRsJ10pCisgIGVsc2UKKyAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbD1ubyIKKyAgICBMSUJMVERMPSItbGx0ZGwiCisgICAgSU5DTFRETD0KKyAgZmkKK10pCisKKyMgb2xkIG5hbWVzCitBQ19ERUZVTihbQU1fUFJPR19MSUJUT09MXSwgICBbQUNfUFJPR19MSUJUT09MXSkKK0FDX0RFRlVOKFtBTV9FTkFCTEVfU0hBUkVEXSwgIFtBQ19FTkFCTEVfU0hBUkVEKCRAKV0pCitBQ19ERUZVTihbQU1fRU5BQkxFX1NUQVRJQ10sICBbQUNfRU5BQkxFX1NUQVRJQygkQCldKQorQUNfREVGVU4oW0FNX0RJU0FCTEVfU0hBUkVEXSwgW0FDX0RJU0FCTEVfU0hBUkVEKCRAKV0pCitBQ19ERUZVTihbQU1fRElTQUJMRV9TVEFUSUNdLCBbQUNfRElTQUJMRV9TVEFUSUMoJEApXSkKK0FDX0RFRlVOKFtBTV9QUk9HX0xEXSwgICAgICAgIFtBQ19QUk9HX0xEXSkKK0FDX0RFRlVOKFtBTV9QUk9HX05NXSwgICAgICAgIFtBQ19QUk9HX05NXSkKKworIyBUaGlzIGlzIGp1c3QgdG8gc2lsZW5jZSBhY2xvY2FsIGFib3V0IHRoZSBtYWNybyBub3QgYmVpbmcgdXNlZAoraWZlbHNlKFtBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTF0pCisKZGlmZiAtLWdpdCBhL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9hcGFjaGVfZ3NvYXAuaCBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9hcGFjaGVfZ3NvYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjQwYTg2Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL2FwYWNoZV9nc29hcC5oCkBAIC0wLDAgKzEsMTc4IEBACisvKiogSW50ZXJmYWNlIGJldHdlZW4gdGhlIGFwYWNoZSBodHRwIC0gc2VydmVyIChodHRwOi8vaHR0cGQuYXBhY2hlLm9yZykgYW5kIHRoZSBnc29hcCBTT0FQIHN0YWNrIChodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcC5odG1sKSAgCisgICogQGZpbGUgYXBhY2hlX2dzb2FwLmgKKyAgKi8KKyNpZm5kZWYgX0FQQUNIRV9HU09BUF9IX0lOQ0xVREVECisjZGVmaW5lIF9BUEFDSEVfR1NPQVBfSF9JTkNMVURFRAorCisvKgorICogbmVlZCB0byBpbmNsdWRlIGh0dHBkLmggZm9yIHJlcXVlc3QgcmVjIGRlZmluaXRpb24gCisgKi8KKyNpbmNsdWRlIDxodHRwZC5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworCisjZGVmaW5lIEFQQUNIRV9HU09BUF9JTlRFUkZBQ0VfVkVSU0lPTiA2CisjZGVmaW5lIEFQQUNIRV9IVFRQU0VSVkVSX0VOVFJZX1BPSU5UICJhcGFjaGVfaW5pdF9zb2FwX2ludGVyZmFjZSIKKworICAgIC8qCisgICAgICogY2FsbHMgc29hcF9zZXJ2ZSBpbnNpZGUgc2hhcmVkIGxpYnJhcnkgCisgICAgICovCisgICAgdHlwZWRlZiBTT0FQX0ZNQUMxIHZvaWQgKFNPQVBfRk1BQzIgKiBhcGFjaGVfc29hcF9pbml0X2ZuKSAoc3RydWN0IHNvYXAgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X3JlYyAqKTsKKworICAgIC8qCisgICAgICogY2FsbHMgc29hcF9pbml0IGluc2lkZSBzaGFyZWQgbGlicmFyeQorICAgICAqLworICAgIHR5cGVkZWYgU09BUF9GTUFDMSBpbnQgKFNPQVBfRk1BQzIgKiBhcGFjaGVfc29hcF9zZXJ2ZV9mbikgKHN0cnVjdCBzb2FwICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF9yZWMgKik7CisKKyAgICAvKgorICAgICAqIGNhbGxzIHNvYXBfZGVzdHJveSBpbnNpZGUgc2hhcmVkIGxpYnJhcnkgCisgICAgICovCisgICAgdHlwZWRlZiBTT0FQX0ZNQUMxIHZvaWQgKFNPQVBfRk1BQzIgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGVfc29hcF9kZXN0cm95X2ZuKSAoc3RydWN0IHNvYXAgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfcmVjICopOworCisgICAgLyoKKyAgICAgKiBjYWxscyBzb2FwX2VuZCBpbnNpZGUgc2hhcmVkIGxpYnJhcnkgCisgICAgICovCisgICAgdHlwZWRlZiBTT0FQX0ZNQUMxIHZvaWQgKFNPQVBfRk1BQzIgKiBhcGFjaGVfc29hcF9lbmRfZm4pIChzdHJ1Y3Qgc29hcCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF9yZWMgKik7CisKKyAgICAvKgorICAgICAqIGNhbGxzIHNvYXBfZG9uZSBpbnNpZGUgc2hhcmVkIGxpYnJhcnkgCisgICAgICovCisgICAgdHlwZWRlZiBTT0FQX0ZNQUMxIHZvaWQgKFNPQVBfRk1BQzIgKiBhcGFjaGVfc29hcF9kb25lX2ZuKSAoc3RydWN0IHNvYXAgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X3JlYyAqKTsKKworICAgIHR5cGVkZWYgU09BUF9GTUFDMSBpbnQgKFNPQVBfRk1BQzIgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZV9zb2FwX3JlZ2lzdGVyX3BsdWdpbl9mbikgKHN0cnVjdCBzb2FwICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqZmNyZWF0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHNvYXAgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBfcGx1Z2luICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfcmVjICopOworCisgICAgdHlwZWRlZiBTT0FQX0ZNQUMxIHZvaWQgKlNPQVBfRk1BQzIoKmFwYWNoZV9zb2FwX2xvb2t1cF9wbHVnaW5fZm4pIChzdHJ1Y3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXAgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X3JlYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKik7CisKKyAgICAvKgorICAgICAqIHRoZSBjYWxsYmFja3Mgbm9ybWFsbHkgdXNlZCBpbiB0aGUgYXBhY2hlX3NvYXBfaW50ZXJmYWNlIAorICAgICAqLworICAgIFNPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIGFwYWNoZV9zb2FwX3NvYXBfZGVzdHJveShzdHJ1Y3Qgc29hcCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X3JlYyAqIHIpOworICAgIFNPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIGFwYWNoZV9kZWZhdWx0X3NvYXBfaW5pdChzdHJ1Y3Qgc29hcCAqc29hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF9yZWMgKiByKTsKKyAgICBTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIGFwYWNoZV9kZWZhdWx0X3NvYXBfc2VydmUoc3RydWN0IHNvYXAgKnNvYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfcmVjICogcik7CisgICAgU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgYXBhY2hlX2RlZmF1bHRfc29hcF9lbmQoc3RydWN0IHNvYXAgKnNvYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF9yZWMgKiByKTsKKyAgICBTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBhcGFjaGVfZGVmYXVsdF9zb2FwX2RvbmUoc3RydWN0IHNvYXAgKnNvYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfcmVjICogcik7CisgICAgU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBhcGFjaGVfZGVmYXVsdF9zb2FwX3JlZ2lzdGVyX3BsdWdpbl9hcmcoc3RydWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcCAqLCBpbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmY3JlYXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcF9wbHVnaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X3JlYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcik7CisgICAgU09BUF9GTUFDMSB2b2lkICpTT0FQX0ZNQUMyIGFwYWNoZV9kZWZhdWx0X3NvYXBfbG9va3VwX3BsdWdpbihzdHJ1Y3Qgc29hcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAsIGNvbnN0IGNoYXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwbHVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X3JlYyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByKTsKKworICAgIHN0cnVjdCBhcGFjaGVfc29hcF9pbnRlcmZhY2UgeworICAgICAgICB1bnNpZ25lZCBpbnQgbGVuOyAgICAgICAvLy88IGxlbmd0aCBvZiB0aGlzIHN0cnVjdCBpbiBieXRlcyAoZm9yIHZlcnNpb24gY29udHJvbCkuCisgICAgICAgIHVuc2lnbmVkIGludCBpbnRlcmZhY2VfdmVyc2lvbjsKKyAgICAgICAgYXBhY2hlX3NvYXBfaW5pdF9mbiBmc29hcF9pbml0OworICAgICAgICBhcGFjaGVfc29hcF9zZXJ2ZV9mbiBmc29hcF9zZXJ2ZTsKKyAgICAgICAgYXBhY2hlX3NvYXBfZGVzdHJveV9mbiBmc29hcF9kZXN0cm95OworICAgICAgICBhcGFjaGVfc29hcF9lbmRfZm4gZnNvYXBfZW5kOworICAgICAgICBhcGFjaGVfc29hcF9kb25lX2ZuIGZzb2FwX2RvbmU7CisgICAgICAgIGFwYWNoZV9zb2FwX3JlZ2lzdGVyX3BsdWdpbl9mbiBmc29hcF9yZWdpc3Rlcl9wbHVnaW5fYXJnOworICAgICAgICBhcGFjaGVfc29hcF9sb29rdXBfcGx1Z2luX2ZuIGZzb2FwX2xvb2t1cF9wbHVnaW47CisgICAgICAgIHZvaWQgKnJlc2VydmVkOyAgICAgICAgIC8vLzwgdmFyaWFibGUgcmVzZXJ2ZWQgZm9yIGFwYWNoZSBtb2R1bGUsIG11c3Qgbm90IGJlIGNoYW5nZWQgYnkgc2VydmVyIHNoYXJlZCBsaWJyYXJ5LgorICAgICAgICBzdHJ1Y3QgTmFtZXNwYWNlICpuYW1lc3BhY2VzOworICAgICAgICB2b2lkICgqc29hcF9zZXJpYWxpemVoZWFkZXIpIChzdHJ1Y3Qgc29hcCAqIHNvYXApOworICAgICAgICBpbnQgKCpzb2FwX3B1dGhlYWRlcikgKHN0cnVjdCBzb2FwICogc29hcCk7CisgICAgICAgIGludCAoKnNvYXBfZ2V0aGVhZGVyKSAoc3RydWN0IHNvYXAgKiBzb2FwKTsKKyAgICAgICAgdm9pZCAoKnNvYXBfZmF1bHQpIChzdHJ1Y3Qgc29hcCAqIHNvYXApOworICAgICAgICB2b2lkICgqc29hcF9zZXJpYWxpemVmYXVsdCkgKHN0cnVjdCBzb2FwICogc29hcCk7CisgICAgICAgIGludCAoKnNvYXBfcHV0ZmF1bHQpIChzdHJ1Y3Qgc29hcCAqIHNvYXApOworICAgICAgICBpbnQgKCpzb2FwX2dldGZhdWx0KSAoc3RydWN0IHNvYXAgKiBzb2FwKTsKKyAgICAgICAgY29uc3QgY2hhciAqKigqc29hcF9mYXVsdGNvZGUpIChzdHJ1Y3Qgc29hcCAqIHNvYXApOworICAgICAgICBjb25zdCBjaGFyICoqKCpzb2FwX2ZhdWx0c3RyaW5nKSAoc3RydWN0IHNvYXAgKiBzb2FwKTsKKyAgICAgICAgY29uc3QgY2hhciAqKigqc29hcF9mYXVsdGRldGFpbCkgKHN0cnVjdCBzb2FwICogc29hcCk7CisgICAgICAgIHZvaWQgKCpzb2FwX21hcmtlbGVtZW50KSAoc3RydWN0IHNvYXAgKiwgY29uc3Qgdm9pZCAqLCBpbnQpOworICAgICAgICBpbnQgKCpzb2FwX3B1dGVsZW1lbnQpIChzdHJ1Y3Qgc29hcCAqLCBjb25zdCB2b2lkICosIGNvbnN0IGNoYXIgKiwgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQpOworICAgICAgICB2b2lkICooKnNvYXBfZ2V0ZWxlbWVudCkgKHN0cnVjdCBzb2FwICosIGludCAqKTsKKyAgICB9OworCisgICAgdHlwZWRlZiB2b2lkICgqYXBhY2hlX2luaXRfc29hcF9pbnRlcmZhY2VfZm4pIChzdHJ1Y3QgYXBhY2hlX3NvYXBfaW50ZXJmYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLCByZXF1ZXN0X3JlYyAqKTsKKworICAgIC8qCisgICAgICogZXhwb3J0ZWQgc2hhcmVkIGxpYnJhcnkgZnVuY3Rpb24gY2FsbGVkIGJ5IG1vZF9nc29hcCBmcm9tIHdpdGhpbiBhcGFjaGUgaHR0cCBzZXJ2ZXIgCisgICAgICogKiBUaGlzIGZ1bmN0aW9uIGZpbGxzIHRoZSBtZW1iZXJzIG9mIHRoZSBhcGFjaGVfc29hcF9pbnRlcmZhY2Ugc3RydWN0LiAKKyAgICAgKi8KKyAgICBTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBhcGFjaGVfaW5pdF9zb2FwX2ludGVyZmFjZShzdHJ1Y3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGVfc29hcF9pbnRlcmZhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLCByZXF1ZXN0X3JlYyAqIHIpOworCisjZGVmaW5lIElNUExFTUVOVF9HU09BUF9TRVJWRVIoKSBcCitzdGF0aWMgU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgYXBhY2hlX3NvYXBfc29hcF9kZXN0cm95KHN0cnVjdCBzb2FwICpzb2FwLCByZXF1ZXN0X3JlYyAqcikge3JldHVybiBzb2FwX2Rlc3Ryb3koc29hcCk7fVwKK3N0YXRpYyBTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBhcGFjaGVfZGVmYXVsdF9zb2FwX2luaXQoc3RydWN0IHNvYXAgKnNvYXAsIHJlcXVlc3RfcmVjICpyKSB7cmV0dXJuIHNvYXBfaW5pdChzb2FwKTt9XAorc3RhdGljIFNPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgYXBhY2hlX2RlZmF1bHRfc29hcF9zZXJ2ZShzdHJ1Y3Qgc29hcCAqc29hcCwgcmVxdWVzdF9yZWMgKnIpIHtyZXR1cm4gc29hcF9zZXJ2ZShzb2FwKTt9XAorc3RhdGljIFNPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIGFwYWNoZV9kZWZhdWx0X3NvYXBfZW5kKHN0cnVjdCBzb2FwICpzb2FwLCByZXF1ZXN0X3JlYyAqcikge3JldHVybiBzb2FwX2VuZChzb2FwKTt9XAorc3RhdGljIFNPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIGFwYWNoZV9kZWZhdWx0X3NvYXBfZG9uZShzdHJ1Y3Qgc29hcCAqc29hcCwgcmVxdWVzdF9yZWMgKnIpIHtyZXR1cm4gc29hcF9kb25lKHNvYXApO31cCitzdGF0aWMgU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBhcGFjaGVfZGVmYXVsdF9zb2FwX3JlZ2lzdGVyX3BsdWdpbl9hcmcoc3RydWN0IHNvYXAgKnNvYXAsIGludCAoKmZjcmVhdGUpKHN0cnVjdCBzb2FwICosIHN0cnVjdCBzb2FwX3BsdWdpbiAqLCB2b2lkICopLCB2b2lkICphcmcsIHJlcXVlc3RfcmVjICpyKXtyZXR1cm4gc29hcF9yZWdpc3Rlcl9wbHVnaW5fYXJnKHNvYXAsIGZjcmVhdGUsIGFyZyk7fVwKK3N0YXRpYyBTT0FQX0ZNQUMxIHZvaWQqIFNPQVBfRk1BQzIgYXBhY2hlX2RlZmF1bHRfc29hcF9sb29rdXBfcGx1Z2luKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpwbHVnaW4sIHJlcXVlc3RfcmVjICpyKSB7cmV0dXJuIHNvYXBfbG9va3VwX3BsdWdpbihzb2FwLCBwbHVnaW4pO31cCit2b2lkIGFwYWNoZV9pbml0X3NvYXBfaW50ZXJmYWNlKHN0cnVjdCBhcGFjaGVfc29hcF9pbnRlcmZhY2UgKnBJbnQsIHJlcXVlc3RfcmVjICpyKSB7XAorIHBJbnQtPmxlbiA9IHNpemVvZihzdHJ1Y3QgYXBhY2hlX3NvYXBfaW50ZXJmYWNlKTtcCisgcEludC0+aW50ZXJmYWNlX3ZlcnNpb24gPSBBUEFDSEVfR1NPQVBfSU5URVJGQUNFX1ZFUlNJT047XAorIHBJbnQtPmZzb2FwX2luaXQgPSBhcGFjaGVfZGVmYXVsdF9zb2FwX2luaXQ7IFwKKyBwSW50LT5mc29hcF9zZXJ2ZSA9IGFwYWNoZV9kZWZhdWx0X3NvYXBfc2VydmU7XAorIHBJbnQtPmZzb2FwX2Rlc3Ryb3kgPSBhcGFjaGVfc29hcF9zb2FwX2Rlc3Ryb3k7XAorIHBJbnQtPmZzb2FwX2VuZCA9IGFwYWNoZV9kZWZhdWx0X3NvYXBfZW5kO1wKKyBwSW50LT5mc29hcF9kb25lID0gYXBhY2hlX2RlZmF1bHRfc29hcF9kb25lO1wKKyBwSW50LT5mc29hcF9yZWdpc3Rlcl9wbHVnaW5fYXJnID0gYXBhY2hlX2RlZmF1bHRfc29hcF9yZWdpc3Rlcl9wbHVnaW5fYXJnO1wKKyBwSW50LT5mc29hcF9sb29rdXBfcGx1Z2luID0gYXBhY2hlX2RlZmF1bHRfc29hcF9sb29rdXBfcGx1Z2luO1wKKyBwSW50LT5yZXNlcnZlZCA9IDA7XAorIHBJbnQtPm5hbWVzcGFjZXMgPSBuYW1lc3BhY2VzO1wKKyBwSW50LT5zb2FwX3NlcmlhbGl6ZWhlYWRlciA9IHNvYXBfc2VyaWFsaXplaGVhZGVyO1wKKyBwSW50LT5zb2FwX3B1dGhlYWRlciA9IHNvYXBfcHV0aGVhZGVyO1wKKyBwSW50LT5zb2FwX2dldGhlYWRlciA9IHNvYXBfZ2V0aGVhZGVyO1wKKyBwSW50LT5zb2FwX2ZhdWx0ID0gc29hcF9mYXVsdDtcCisgcEludC0+c29hcF9zZXJpYWxpemVmYXVsdCA9IHNvYXBfc2VyaWFsaXplZmF1bHQ7XAorIHBJbnQtPnNvYXBfcHV0ZmF1bHQgPSBzb2FwX3B1dGZhdWx0O1wKKyBwSW50LT5zb2FwX2dldGZhdWx0ID0gc29hcF9nZXRmYXVsdDtcCisgcEludC0+c29hcF9mYXVsdGNvZGUgPSBzb2FwX2ZhdWx0Y29kZTtcCisgcEludC0+c29hcF9mYXVsdHN0cmluZyA9IHNvYXBfZmF1bHRzdHJpbmc7XAorIHBJbnQtPnNvYXBfZmF1bHRkZXRhaWwgPSBzb2FwX2ZhdWx0ZGV0YWlsO1wKKyBwSW50LT5zb2FwX21hcmtlbGVtZW50ID0gc29hcF9tYXJrZWxlbWVudDtcCisgcEludC0+c29hcF9nZXRlbGVtZW50ID0gc29hcF9nZXRlbGVtZW50O1wKKyBwSW50LT5zb2FwX3B1dGVsZW1lbnQgPSBzb2FwX3B1dGVsZW1lbnQ7XAorfQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLy9fX2NwbHVzcGx1cworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvL19BUEFDSEVfR1NPQVBfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL2FwYWNoZV9pbmRleC5odG1sIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL2FwYWNoZV9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZmJiYjcKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvYXBhY2hlX2luZGV4Lmh0bWwKQEAgLTAsMCArMSwzMjUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIvL0VOIj4NCis8SFRNTD4NCis8SEVBRD4NCisJPE1FVEEgSFRUUC1FUVVJVj0iQ09OVEVOVC1UWVBFIiBDT05URU5UPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMTUiPg0KKwk8VElUTEU+bW9kX2dzb2FwIC0gQXBhY2hlIEhUVFAgU2VydmVyIFNPQVAgbG9hZGFibGUgbW9kdWxlIGZvciAubmV0IFNlPC9USVRMRT4NCisJPE1FVEEgTkFNRT0iR0VORVJBVE9SIiBDT05URU5UPSJNaWNyb3NvZnQgRnJvbnRQYWdlIDQuMCI+DQorCTxNRVRBIE5BTUU9IkNSRUFURUQiIENPTlRFTlQ9IjIwMDEwNTE4OzIzMDgyNjAwIj4NCisJPE1FVEEgTkFNRT0iQ0hBTkdFREJZIiBDT05URU5UPSIgIj4NCisJPE1FVEEgTkFNRT0iQ0hBTkdFRCIgQ09OVEVOVD0iMjAwMjA5MjA7MTI3MDcwMCI+DQorCTxNRVRBIE5BTUU9IkRFU0NSSVBUSU9OIiBDT05URU5UPSJTT0FQIG1vZHVsZSBmb3IgQXBhY2hlIEhUVFAtU2VydmVyIHRvIHJ1biBTT0FQIGFuZCAuTkVUKHRtKSBTZXJ2aWNlcyB1bmRlciBsaW51eCI+DQorCTxNRVRBIE5BTUU9IktFWVdPUkRTIiBDT05URU5UPSJtb2RfZ3NvYXAsIGdzb2FwLCBhcGFjaGUsIEhUVFAsIFNlcnZlciwgQXBhY2hlIEhUVFAgU2VydmVyLCAuTkVULCAuTkVUIGZvciBsaW51eCwgb3BlbiBzb3VyY2UiPg0KKzwvSEVBRD4NCis8Qk9EWT4NCis8SDEgQUxJR049Q0VOVEVSPjxGT05UIEZBQ0U9IlZlcmFuZGEiPlNPQVAgYW5kIC5uZXQgc2VydmljZXMgZm9yDQorQXBhY2hlIEhUVFAgU2VydmVyPC9GT05UPjwvSDE+DQorPFAgQUxJR049Q0VOVEVSPlRoaXMgaXMgYW4gb3BlbiBzb3VyY2UgY29udHJpYnV0aW9uIGZvciA8QSBIUkVGPSJodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcC5odG1sIj5nc29hcDwvQT4sDQordG8gZW5hYmxlIDxBIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9odHRwZCI+QXBhY2hlIEhUVFAgU2VydmVyPC9BPg0KK3RvIHJ1biA8QSBIUkVGPSJodHRwOi8vd3d3LnczLm9yZy9UUi9TT0FQLyI+U09BUDwvQT4gYW5kIC5uZXQNCitzZXJ2aWNlcyBvbiBMaW51eCBhbmQgb3RoZXIgVW5pY2VzLiANCis8L1A+DQorPEgxPk92ZXJ2aWV3PC9IMT4NCis8UD5UbyBidWlsZCBhbmQgY29uZmlndXJlIHRoZSBtb2RfZ3NvYXAgU09BUCBzZXJ2aWNlIHlvdSBoYXZlIHRvIGRvDQordGhyZWUgbWFpbiBwYXJ0czogDQorPC9QPg0KKzxPTD4NCisJPExJPjxQPkJ1aWxkIG1vZF9nc29hcCwgd2hpY2ggaXMgYSBTT0FQIHNlcnZlciBpbmRlcGVuZGVudCBnZW5lcmljDQorCW1vZHVsZSB0byBhbGxvdyBnc29hcCBzaGFyZWQgbGlicmFyaWVzIHRvIGJlIHBsdWdnZWQgaW50byBBcGFjaGUNCisJSFRUUCBTZXJ2ZXIuIEl0IGNvbnRhaW5zIHRoZSBpbmZyYXN0cnVjdHVyZSB0byBkeW5hbWljYWxseSBsb2FkIHRoZQ0KKwlyZXF1aXJlZCBnc29hcCBzZXJ2ZXJzIGF0IHJ1bnRpbWUsIGFuZCB0aGUgYWRkaXRpb25hbCByZXF1aXJlZA0KKwlzaGFyZWQgbGlicmFyaWVzIG5vdCBzdGF0aWNhbGx5IGxpbmtlZCBpbnRvIGFwYWNoZSBzZXJ2ZXIuIG1vZF9nc29hcA0KKwlwYXNzZXMgdGhlIFNPQVAgcmVxdWVzdHMgcmVjZWl2ZWQgZnJvbSB0aGUgY2xpZW50cywgYW5kIGNhbGxzIGludG8NCisJdGhlIFNPQVAgc2VydmVyIHNoYXJlZCBsaWJyYXJpZXMgYW5kIHJldHVybnMgdGhlIHJlc3BvbnNlIHRvIHRoZQ0KKwljbGllbnRzLjwvUD4NCisJPExJPjxQPkJ1aWxkIG9uZSBvciBtb3JlIGdzb2FwIHNoYXJlZCBsaWJyYXJpZXMgdGhhdCBpbXBsZW1lbnQgdGhlDQorCVNPQVAgc2VydmljZXMuIEFzIGEgc2FtcGxlIGEgc2ltcGxlIGNhbGN1bGF0b3Igd2FzIHVzZWQuDQorCUltcGxlbWVudGluZyBvdGhlciBTT0FQIHNlcnZlcnMgaXMgc3RyYWlnaHQgZm9yd2FyZC4gUGxlYXNlIHNlZQ0KKwk8QSBIUkVGPSJodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcC5odG1sIj5nc29hcDwvQT4gZm9yDQorCWRldGFpbHMgb2YgaG93IHRvIHVzZSBzb2FwY3BwMiB0byBnZW5lcmF0ZSB0aGUgd3NkbCAsIHRoZSBDKysgYW5kDQorCXRoZSBvdGhlciByZWxhdGVkIGNvZGUgZm9yIHlvdXIgb3duIFNPQVAgc2VydmljZXMuIA0KKwk8L1A+DQorCTxMST48UD5UaGUgY29uZmlndXJhdGlvbiBpbnN0cnVjdGlvbnMgZm9yIHRoZSBhcGFjaGUgaHR0cCBzZXJ2ZXIgaW4NCisJaHR0cGQuY29uZi4gVGhpcyBzcGVjaWZpZXMgd2hpY2ggc2hhcmVkIGxpYnJhcmllcyBhcmUgYWxsb3dlZCB0byBiZQ0KKwlsb2FkZWQgaW50byB0aGUgYXBhY2hlIHNlcnZlciBwcm9jZXNzIGFuZCB3aGVyZSB0aGV5IHJlc2lkZS48L1A+DQorPC9PTD4NCis8UD5UaGUgYnVpbGQgcHJvY2VzcyB1c2VzIDxGT05UIEZBQ0U9IlZlcmFuZGEiPjxBIEhSRUY9Imh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRtYWtlIj5BdXRvbWFrZTwvQT4NCis8L0ZPTlQ+LiBJbnNpZGUgdGhhdCBtb2RfZ3NvYXAuc28gaXMgYnVpbHQgaW4gdGhlIHN0YW5kYXJkIEFwYWNoZSB3YXkNCit1c2luZyBhcHhzLiA8Rk9OVCBGQUNFPSJWZXJhbmRhIj5QbGVhc2UgZG8gbm90IGJlIHNob2NrZWQgYWJvdXQgdGhlDQorbG9uZyBkZXNjcmlwdGlvbiB0aGF0IGZvbGxvd3MuIEl0IGlzIHJhdGhlciBkZXRhaWxsZWQsIHVzZXJzDQorYWNxdWFpbnRlZCB3aXRoIGFwYWNoZSBodHRwIHNlcnZlciB3aWxsIHNraXAgbW9zdCBvZiBpdC48L0ZPTlQ+PC9QPg0KKzxIMT48Rk9OVCBGQUNFPSJWZXJhbmRhIj4xLiBCdWlsZGluZyB0aGUgQXBhY2hlIFNPQVAgc2VydmVyPC9GT05UPjwvSDE+DQorPFA+PEZPTlQgRkFDRT0iVmVyYW5kYSI+SW4gb3JkZXIgdG8gcmVkdWNlIGRvd25sb2FkIHRpbWVzIHlvdSBtdXN0DQorZG93bmxvYWQgYW5kIHVucGFjayB0aGUgcmVxdWlyZWQgc3RhbmRhcmQgcGFja2FnZXMgbGlrZSBhcGFjaGUgc2VydmVyDQorc2VwYXJhdGVseSBmcm9tIHRoZWlyIG9yaWdpbmFsIGxvY2F0aW9ucy4gRm9yIGJ1aWxkaW5nIEkgdXNlZCBsaWJ0b29sDQorMS40IGRvd25sb2FkZWQgZnJvbSA8QSBIUkVGPSJodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvbGlidG9vbCI+aHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYnRvb2w8L0E+LA0KK2JlIHN1cmUgdG8gaGF2ZSBpdCBpbnN0YWxsZWQuIEFsc28gYmUgc3VyZSB0aGF0IHlvdSBoYXZlIGFweHMsIHdoaWNoDQorY29tZXMgd2l0aCB0aGUgYXBhY2hlIGh0dHAgc2VydmVyIGRpc3RyaWJ1dGlvbiwgaW4geW91ciBwYXRoLiA8L0ZPTlQ+DQorPC9QPg0KKzxIMj5CdWlsZCBpbnN0cnVjdGlvbnM8L0gyPg0KKzxVTD4NCisJPExJPjxQPk1ha2Ugc3VyZSB0aGF0IGFwYWNoZSBodHRwIHNlcnZlciBpcyBpbnN0YWxsZWQsIG90aGVyd2lzZSA8Rk9OVCBGQUNFPSJWZXJhbmRhIj5kb3dubG9hZA0KKyAgICAgIGJ1aWxkIGFuZCBpbnN0YWxsIGFwYWNoZV8xLjMuMjYudGFyLmd6IG9yIGhpZ2hlcg0KKwkobm90IDIuMC4qIG9yIGhpZ2hlcikgZnJvbSA8L0ZPTlQ+PEEgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2h0dHBkIj48Rk9OVCBGQUNFPSJWZXJhbmRhIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvaHR0cGQ8YnI+DQorICAgICAgPC9GT05UPjwvQT48Zm9udCBmYWNlPSJWZXJhbmRhIj5UaGlzIHdpbGwgYWxzbyBpbnN0YWxsIGFweHMsIHRoZSBhcGFjaGUNCisgICAgICBidWlsZCB0b29sIHRoYXQgaXMgcmVxdWlyZWQgdG8gY29tcGlsZSBtb2RfZ3NvYXAgYXMgYSBtb2R1bGUuIEFsc28gY2hlY2sgdGhlIGZpcnN0IGxpbmUgb2YNCisJYXB4cywgc28gdGhhdCBpdCByZWFsbHkgcG9pbnRzIHRvIHlvdXIgcGVybCBleGVjdXRhYmxlLjwvZm9udD4NCisJPC9QPg0KKwk8TEk+PFA+PEZPTlQgRkFDRT0iVmVyYW5kYSI+ZG93bmxvYWQgYW5kIGluc3RhbGwgZ3NvYXAgZnJvbSA8QSBIUkVGPSJodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcC5odG1sIj5odHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcC5odG1sPC9BPjwvRk9OVD4NCisJPC9QPg0KKwk8TEk+PFA+PEZPTlQgRkFDRT0iVmVyYW5kYSI+ZG93bmxvYWQgdGhlIGN1cnJlbnQgZ3NvYXBfYXBhY2hlXzAuMC41LnRneiBmcm9tDQorCTxBIEhSRUY9Imh0dHA6Ly93d3cud2Vid2FyZS5hdC9TT0FQL2FwYWNoZV9nc29hcC4wLjAuNS50Z3oiPmh0dHA6Ly93d3cud2Vid2FyZS5hdC9TT0FQL2FwYWNoZV9nc29hcC4wLjAuNS50Z3o8L0E+DQorICAgICAgPC9GT05UPnRvIDxGT05UIEZBQ0U9IlZlcmFuZGEiPi91c3IvbG9jYWwvc3JjIGFuZCB1bnBhY2sgaXQgd2l0aDo8YnI+DQorICAgICAgPC9GT05UPjxmb250IGZhY2U9IkNvdXJpZXIgTmV3Ij50YXIgLXh6ZiBhcGFjaGVfZ3NvYXAuMC4wLjUudGd6Jm5ic3A7PC9mb250PjwvUD4NCisJPExJPjxQPmNoYW5nZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQgaGFzIGJlZW4gY3JlYXRlZCBieSB0aGUgc3RlcCBhYm92ZSBhbmQNCisgICAgICBydW4gdGhlIGZvbGxvd2luZzo8YnI+DQorICAgICAgPGZvbnQgZmFjZT0iQ291cmllciBOZXciPi4vY29uZmlndXJlJm5ic3A7PGJyPg0KKyAgICAgIG1ha2U8QlI+PC9mb250Pjxmb250IGZhY2U9IkNvdXJpZXIsIG1vbm9zcGFjZSI+PEJSPjwvZm9udD48Rk9OVCBGQUNFPSJWZXJhbmRhIj5UaGlzIHNob3VsZCBidWlsZA0KKyAgICAgIC4vbW9kX2dzb2FwL21vZF9nc29hcC5zbyBhbmQgLi9leGFtcGxlL2NhbGN1bGF0b3IvLmxpYnMvbGliQ2FsY3VsYXRvci5zbyAodGhlDQorCS5saWJzIHN1YmRpcmVjdG9yeSBpcyBoaWRkZW4pLiBsaWI8L0ZPTlQ+Q2FsY3VsYXRvci5zbyBpcyBhIHNoYXJlZA0KKwlsaWJyYXJ5IHRoYXQgY29udGFpbnMgdGhlIGdzb2FwIHNlcnZlciBnZW5lcmF0ZWQgd2l0aCBzb2FwY3BwMi4gWW91DQorCWNhbiB1c2UgaXQgYXMgYSB0ZW1wbGF0ZSBmb3IgeW91ciBvd24gc2VydmVycy4gU2VlIGxhdGVyLiBUaGlzIGJ1aWxkIHN0ZXANCisgICAgICBhbHNvIGNvcGllcyBtb2RfZ3NvYXAuc28gdG8gdGhlIGxvY2F0aW9uIG9mIHlvdXIgb3RoZXIgYXBhY2hlDQorCW1vZHVsZXMgKGUuZy4gL3Vzci9sb2NhbC9hcGFjaGUvbGliZXhlYykuPC9QPg0KKzwvVUw+DQorPEgyPkJ1aWxkaW5nIGEgZGVidWdnaW5nIHZlcnNpb248L0gyPg0KKzxQPlRoZSBzdGVwcyBhYm92ZSBhcmUgZW5vdWdoIGZvciBydW5uaW5nIHRoZSByZWxlYXNlIHZlcnNpb24uIElmIHlvdQ0KK3dhbnQgdG8gZG8gZGVidWdnaW5nIGZvciBtb2RfZ3NvYXAuYyBhbmQvb3IgeW91ciBzZXJ2ZXJzLCB5b3UgbXVzdA0KK2VuYWJsZSBkZWJ1Z2dpbmcgY29kZS4gVGhpcyBpcyBkZXNjcmliZWQgaW4gdGhpcyBwYXJhZ3JhcGguIFNraXAgaXQNCitpZiB5b3UgZG8gbm90IG5lZWQgZGVidWdnaW5nLiANCis8L1A+DQorPFA+WW91IGNhbiBlbmFibGUgZGVidWdnaW5nIGZvciBtb2RfZ3NvYXAuYyBieSB1c2luZw0KKy0tZW5hYmxlLWRlYnVnPEJSPjxGT05UIEZBQ0U9IkNvdXJpZXIsIG1vbm9zcGFjZSI+Li9jb25maWd1cmUNCistLWVuYWJsZS1kZWJ1ZzwvRk9OVD48L1A+DQorPFA+RGVidWdnaW5nIGlzIGVhc2llciB3aGVuIHlvdSBsaW5rIG1vZF9nc29hcC5jIHN0YXRpY2FsbHkgaW50bw0KK2h0dHBkLCB0aGUgQXBhY2hlIFNlcnZlci48L1A+DQorPFA+Rm9yIHRoYXQgdG8gdGhlIGZvbGxvd2luZzogPEJSPkNvcHkgdGhlIHdob2xlIG1vZF9nc29hcA0KK3N1YmRpcmVjdG9yeSB0byA8Rk9OVCBGQUNFPSJWZXJhbmRhIj5+L2FwYWNoZV8xLjMuMjY8L0ZPTlQ+L3NyYy9tb2R1bGVzLzxCUj5OZXh0DQorRWRpdCB0aGUgQ29uZmlndXJhdGlvbiBmaWxlIChpdCBpcyBsb2NhdGVkIGluIH4vYXBhY2hlL3NyYykuPEJSPkFkZA0KK3RoZSBmb2xsb3dpbmcgbGluZXM6PEJSPjxTUEFOIFNUWUxFPSJmb250LXdlaWdodDogbWVkaXVtIj48Rk9OVCBTSVpFPTM+PEZPTlQgRkFDRT0iQ291cmllciwgbW9ub3NwYWNlIj4jDQorZ29hcCBTT0FQIGV4dGVuc2lvbiBtb2R1bGUuIDxCUj5BZGRNb2R1bGUNCittb2R1bGVzL21vZF9nc29hcC9tb2RfZ3NvYXAubyA8L0ZPTlQ+PC9GT05UPjwvU1BBTj4NCis8L1A+DQorPFVMPg0KKwk8TEk+PFA+PEZPTlQgRkFDRT0iVGltZXMsIHNlcmlmIj5pbiB0aGUgc2FtZSBmaWxlIGxvY2F0ZSBpbiB0aGUNCisJc2VjdGlvbiBNYWtlZmlsZSBjb25maWd1cmF0aW9uIHRoZSBsaW5lIGNvbnRhaW5pbmcgRVhUUkFfTElCUyBhbmQNCisJYWRkIGNoYW5nZSB0aGUgbGluZXMgdG8gdGhlIGZvbGxvd2luZzoNCisJPEJSPjwvRk9OVD48Rk9OVCBTSVpFPTM+PEZPTlQgRkFDRT0iQ291cmllciwgbW9ub3NwYWNlIj5FWFRSQV9DRkxBR1M9LWc8QlI+RVhUUkFfTERGTEFHUz08QlI+RVhUUkFfTElCUz0tbGRsDQorCS1scHRocmVhZDxCUj5FWFRSQV9JTkNMVURFUz0tSX4vYXBhY2hlX2dzb2FwLjAuMC41PC9GT05UPjwvRk9OVD48L1A+DQorICAgICAgPFA+PGZvbnQgc2l6ZT0iMyI+U2VlIHRoZSBzYW1wbGUgQ29uZmlndXJhdGlvbiBmaWxlIHRoYXQgaXMgaW4gdGhlDQorICAgICAgZG93bmxvYWRlZCBzb3VyY2VzIGZvciBhbiBleGFtcGxlLjwvZm9udD48L1A+DQorCTxQPjxGT05UIEZBQ0U9IlRpbWVzLCBzZXJpZiI+VGhlcmUgaXMgYWxzbyBhIGNvbmZpZyBkaXJlY3RvcnkgYmVsb3cNCisJbW9kX2dzb2FwLCB3aGljaCBjb250YWlucyBzYW1wbGUgZmlsZXMgZWRpdGVkIGluIHRoZSB3YXkgZGVzY3JpYmVkDQorCWhlcmUsIHdoZXJlIHlvdSBjYW4gY29tcGFyZSB5b3VyIGNoYW5nZXMuPC9GT05UPjwvUD4NCis8L1VMPg0KKzxVTD4NCisJPExJPjxQPjxGT05UIEZBQ0U9IlRpbWVzLCBzZXJpZiI+UnVuIHRoZSBzcmMvQ29uZmlndXJlIHNjcmlwdDo8L0ZPTlQ+PEZPTlQgRkFDRT0iQ291cmllciwgbW9ub3NwYWNlIj48QlI+Y2QNCisJfi9hcGFjaGUtMS4zLjI2L3NyYzxCUj4uL0NvbmZpZ3VyZTxCUj48QlI+PC9GT05UPjxGT05UIEZBQ0U9IlRpbWVzLCBzZXJpZiI+VGhpcw0KKwl3aWxsIGJ1aWxkIHRoZSBNYWtlZmlsZSBmb3IgdGhlIHNlcnZlciBpdHNlbGYuPEJSPjxGT05UIFNJWkU9Mj5Ob3RlOg0KKwlkbyBub3QgcnVuIH4uL2FwYWNoZS0xLjMuMjYvY29uZmlndXJlIGFmdGVyIGl0LCB0aGlzIHdpbGwgb3ZlcndyaXRlDQorCXRoZSBNYWtlZmlsZXMgZ2VuZXJhdGVkIGFib3ZlLiA8L0ZPTlQ+PC9GT05UPg0KKwk8L1A+DQorPC9VTD4NCis8VUw+DQorCTxMST48UD48Rk9OVCBGQUNFPSJUaW1lcywgc2VyaWYiPkJ1aWxkIHRoZSBBcGFjaGUgU2VydmVyLCB0b2dldGhlcg0KKwl3aXRoIHRoZSBtb2RfZ3NvYXAgYnkgcnVubmluZyBpbiB0aGUgY3VycmVudCB+L2FwYWNoZV8xLjMuMjYvc3JjDQorCWRpcmVjdG9yeTo8Rk9OVCBGQUNFPSJDb3VyaWVyLCBtb25vc3BhY2UiPjxCUj5tYWtlPC9GT05UPjwvRk9OVD48L1A+DQorPC9VTD4NCis8VUw+DQorCTxMST48UD48Rk9OVCBGQUNFPSJDb3VyaWVyLCBtb25vc3BhY2UiPjxGT05UIEZBQ0U9IlRpbWVzLCBzZXJpZiI+VGhlDQorCXByZXZpb3VzIHN0ZXAgc2hvdWxkIGhhdmUgcHJvZHVjZWQgdGhlIGZpbGUgaHR0cGQ8QlI+Q2hlY2sgdGhhdCB0aGUNCisJbW9kX2dzb2FwIGhhcyByZWFsbHkgYmVlbiBsaW5rZWQgY29ycmVjdGx5IGJ5IHJ1bm5pbmc6PC9GT05UPjxCUj4uL2h0dHBkDQorCS1sPEJSPjxGT05UIEZBQ0U9IlRpbWVzLCBzZXJpZiI+VGhpcyBzaG91bGQgbGlzdCBhcyBhIG1vZHVsZSBhbW9uZw0KKwlvdGhlcnMgYWxzbyBtb2RfZ3NvYXAuYyBhbmQgbW9kX3NvLmM8L0ZPTlQ+PC9GT05UPjwvUD4NCis8L1VMPg0KKzxVTD4NCisJPExJPjxQPjxGT05UIEZBQ0U9IkNvdXJpZXIsIG1vbm9zcGFjZSI+PEZPTlQgRkFDRT0iVGltZXMsIHNlcmlmIj5Jbg0KKwl0aGUgbmV4dCBzdGVwIHdlIGluc3RhbGwgYXBhY2hlIHRvIGEgZGlyZWN0b3J5IG9mIGl0cyBvd24gYnkgcnVubmluZw0KKwl0aGUgc3RhbmRhcmQgYXBhY2hlIGluc3RhbGwgY29tbWFuZCBmcm9tIHRoZSB+L2FwYWNoZV8xLjMuMjYNCisJZGlyZWN0b3J5LiBCZWZvcmUgZG9pbmcgc28sIHJlYWQgdGhlIFJFQURNRS5jb25maWd1cmUgZmlsZSBpbiB0aGUNCisJYXBhY2hlIGRpc3RyaWJ1dGlvbi4gQWZ0ZXIgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLCBydW4gdGhlDQorCWZvbGxvd2luZyBjb21tYW5kIGZyb20gfi9hcGFjaGVfMS4zLjI2OiA8L0ZPTlQ+PEJSPm1ha2UgaW5zdGFsbDxCUj48Rk9OVCBGQUNFPSJUaW1lcywgc2VyaWYiPlRoaXMNCisJd2lsbCBnZW5lcmF0ZSB0aGUgYXBhY2hlIHNlcnZlciBpbiB0aGUgZGlyZWN0b3J5IHlvdSBzcGVjaWZpZWQgKG9yDQorCXVzdWFsbHkgL3Vzci9sb2NhbC9hcGFjaGUgaWYgeW91IGRpZCBub3QgZG8gc28pLiBUaGlzIHN0ZXAgd2lsbCBhbHNvDQorCWdlbmVyYXRlIHRoZSBodHRwZC5jb25mIGZpbGUgdGhhdCB3ZSBuZWVkIGZvciBkZWJ1Z2dpbmcuIFlvdSBjYW4gb2YNCisJY291cnNlIG9taXQgdGhpcyBzdGVwLCBpZiB3YXMgb25seSBkb25lIHRvIGVhc2lseSBnZXQgYSB3b3JraW5nDQorCWFwYWNoZSBkaXN0cmlidXRpb24gb24geW91ciBtYWNoaW5lLCBhbmQgYSBodHRwZC5jb25mIGZpbGUgdGhhdCB3ZQ0KKwltdXN0IGNoYW5nZSBpbiB0aGUgbmV4dCBzdGVwcy4gSWYgeW91IGFscmVhZHkgaGF2ZSBhIHdvcmtpbmcNCisJaW5zdGFsbGF0aW9uLCB5b3UgY2FuIHVzZSB0aGF0LiA8L0ZPTlQ+PC9GT05UPg0KKwk8L1A+DQorPC9VTD4NCis8SDI+PEJSPjxCUj4NCis8Rk9OVCBTSVpFPTY+Mi4gSW1wbGVtZW50aW5nIHlvdXINCitvd24gU2VydmVyczwvRk9OVD4NCis8L0gyPg0KKzxQPkluIG15IG9waW5pb24gaXQgaXMgbm90IGEgZ29vZCBpZGVhIHRvIHN0YXJ0IG9mZiB3aXRoIGdzb2FwIHNlcnZlcg0KK3Byb2dyYW1taW5nIGJ5IHVzaW5nIHRoaXMgYXBhY2hlIG1vZHVsZS4gQmVmb3JlIGRvaW5nIHNvIChhbmQNCitlc3BlY2lhbGx5IGJlZm9yZSBzZW5kaW5nIHF1ZXN0aW9ucykgcGxlYXNlIGdvIHRvIHRoZSA8QSBIUkVGPSJodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcC5odG1sIj5nc29hcA0KK2hvbWUgcGFnZTwvQT4gYW5kIGxvb2sgYXQgdGhlIHZlcnkgZ29vZCBhbmQgZGV0YWlsbGVkIGV4YW1wbGVzIGFuZA0KK2RvY3VtZW50YXRpb24gdGhlcmUuIEltcGxlbWVudCB5b3VyIHNlcnZlciBhcyBhIHN0YW5kYWxvbmUgc2VydmVyIGFuZA0KK3Rlc3QgaXQuIE9uY2UgdGhhdCB3b3JrcywgeW91IGNhbiBlYXNpbHkgY29udmVydCBpdCB0byBydW4gd2l0aA0KK21vZF9nc29hcC4gSG93IHRvIGNvbnZlcnQgeW91ciBzZXJ2ZXIgdG8gc3VwcG9ydCBtb2RfZ3NvYXAgaXMNCitkZXNjcmliZWQgYmVsb3cgaW4gdGhpcyBjaGFwdGVyLjwvUD4NCis8UD5UaGUgb25seSBhZGRpdGlvbmFsIHRoaW5nIHlvdSBtdXN0IGRvIHRvIGVuYWJsZSB5b3VyIG93biBnc29hcA0KK1NlcnZlciB0byBiZSBhYmxlIHRvIHBsdWcgaW50byBBcGFjaGUgSFRUUCBzZXJ2ZXIgaXMgdG8gYWRkIHRoZSBsaW5lcw0KK2JlbG93IHRvIHlvdXIgc291cmNlIGNvZGUgYW5kIGJ1aWxkIHRoZW0gYXMgc2hhcmVkIGxpYnJhcmllcy4gVGhlbg0KK3RoZSByZXF1aXJlZCBlbnRyeSBwb2ludHMgd2lsbCBiZSBleHBvcnRlZC4gDQorPC9QPg0KKzxQPkFkZCB0aGUgZm9sbG93aW5nIDIgbGluZXMgdG8geW91ciBTT0FQIHNlcnZlciBzb3VyY2UgY29kZToNCis8QlI+PEZPTlQgRkFDRT0iQ291cmllciwgbW9ub3NwYWNlIj4jaW5jbHVkZQ0KKyZxdW90O2FwYWNoZV9nc29hcC5oJnF1b3Q7PEJSPklNUExFTUVOVF9HU09BUF9TRVJWRVIoKTwvRk9OVD48L1A+DQorPFA+PEZPTlQgU0laRT0zPjxGT05UIEZBQ0U9IlRpbWVzLCBzZXJpZiI+WW91IGFsc28gbXVzdCBjaGFuZ2UNCitNYWtlPC9GT05UPjwvRk9OVD5maWxlLmFtIGFjY29yZGluZ2x5IHRvIGFkZCB5b3VyIHNvdXJjZSBmaWxlcyBhbmQNCityZW5hbWUgYW5kIHJ1biBhdXRvY29uZiwgYXV0b21ha2UsIC4vY29uZmlndXJlIGFnYWluIG9mIGNvdXJzZS4NCithcGFjaGVfZ3NvYXAuaCBjYW1lIHdpdGggdGhlIDxGT05UIEZBQ0U9IlZlcmFuZGEiPmdzb2FwX2FwYWNoZV8qLnRneg0KK3RoYXQgeW91IGRvd25sb2FkZWQgYWJvdmUgYW5kIHdpbGwgYmUgaW4gdGhlIGluY2x1ZGUgcGF0aCBvZiB0aGUNCitjb21waWxlci48L0ZPTlQ+PC9QPg0KKzxQPlRoZXJlIGlzIGFsc28gYSBDb25zb2xlU2VydmVyIHN1YnByb2plY3QsIHRoYXQgYWxsb3dzIHlvdSB0byBidWlsZA0KK2FuZCB0ZXN0IHlvdXIgb3duIGdzb2FwIHNlcnZlciBzaGFyZWQgbGlicmFyaWVzIGluZGVwZW50IG9mIEFwYWNoZQ0KK3NlcnZlci4gSXQgaXMgcmVjb21tZW5kZWQgdG8gdGVzdCB5b3VyIHNlcnZlcnMgd2l0aCB0aGlzIHNvYXB0ZXN0DQorcHJvZ3JhbSBiZWZvcmUgeW91IHRyeSB0byB1c2UgaXQgaW4gQXBhY2hlIFNlcnZlci4gQ2hhbmdlIHRoZSBzZWFyY2gNCitwYXRoIGZvciB0aGUgbGlicmFyeSBhbmQgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgbmVhciB0aGUgdG9wIG9mIHRoZQ0KK2ZpbGUgQ29uc29sZVNlcnZlci5jcHAgZm9yIHRlc3RpbmcuIEFub3RoZXIgc3ViZGlyZWN0b3J5IGZvbyBpcyB0aGVyZQ0KK2ZvciB0ZXN0aW5nLCBpZiB5b3Ugc3RpbGwgZ2V0IGZpbGUgbm90IGZvdW5kIGVycm9ycyBpbiB0aGUgYXR0ZW1wdCB0bw0KK2xvYWQgYSBzaGFyZWQgbGlicmFyeS4gZm9vIGRvZXMgbm90IGRlcGVuZCBvbiBvdGhlciBsaWJyYXJpZXMgYW5kDQord2lsbCBsb2FkIGFsc28gaWYgeW91ciBwYXRoIGlzIG5vdCBjb3JyZWN0LiBPZiBjb3Vyc2UgaXQgd2lsbCBub3QNCit3b3JrIGFzIGEgc29hcCBzZXJ2ZXIsIGl0IGlzIG9ubHkgdGhlcmUgdG8gZ2V0IHlvdXIgZGlyZWN0b3J5DQorc2V0dGluZ3MgY29ycmVjdC48L1A+DQorPFAgQUxJR049TEVGVD5JZiB5b3Ugd2FudCB0byBoYXZlIGEgZ3JhcGhpY2FsIGRldmVsb3BtZW50IGVudmlyb25tZW50DQoreW91IGNhbiB1c2UgPEEgSFJFRj0iaHR0cDovL3d3dy5rZGV2ZWxvcC5vcmcvIj5rZGV2ZWxvcDwvQT4uIFNlZQ0KK2JlbG93IGhvdyB0byB1c2UgdGhhdC4gQnV0IGFsc28gd29ya2luZyB3aXRoIGVtYWNzIGFuZCBrZGJnIGlzIGZpbmUuDQorRm9yIGltcGxlbWVudGluZyB5b3VyIG93biBTT0FQIHNlcnZlcnMgcGxlYXNlIGRvd25sb2FkIHRoZSBzdGFuZGFyZA0KKzxBIEhSRUY9Imh0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9zb2FwLmh0bWwiPmdzb2FwPC9BPiBwYWNrYWdlDQorYW5kIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIHRoZXJlLiBUaGUgc2VydmVycyB3ZSB1c2UgYXJlIHNlcGFyYXRlZA0KK2ludG8gYSBzaGFyZWQgbGlicmFyeSBvZiBpdHMgb3duLCB0byBhbGxvdyB0aGUgYXBhY2hlIHNlcnZlciB0byBsb2FkDQordGhlbSBvbiBkZW1hbmQuPC9QPg0KKzxQPjxGT05UIEZBQ0U9Ikx1Y2lkYSwgc2Fucy1zZXJpZiI+PEZPTlQgU0laRT02PjxCPjMuIENvbmZpZ3VyYXRpb24NCitvZiBodHRwZC5jb25mPC9CPjwvRk9OVD48L0ZPTlQ+PC9QPg0KKzxQPjxGT05UIEZBQ0U9IlRpbWVzLCBzZXJpZiI+PEZPTlQgU0laRT0zPk5vdyBhZnRlciB0aGUgYmluYXJpZXMgYXJlDQorYnVpbHQsIGl0IGlzIG5lY2Vzc2FyeSB0byB0ZWxsIEFwYWNoZSBzZXJ2ZXIgd2hlcmUgdG8gZmluZCB0aGUNCitsaWJyYXJpZXMgdG8gYW5zd2VyIHRoZSBzb2FwIHJlcXVlc3RzIGNvbWluZyBpbi4gTG9jYXRlIHRoZQ0KK2h0dHBkLmNvbmYgZmlsZSB0aGF0IGlzIGluIHVzZSBvbiB5b3VyIGluc3RhbGxhdGlvbiAoZS5nLg0KK34vYXBhY2hlLTEuMy4yNi9jb25mL2h0dHBkLmNvbmYgb3IgL3Vzci9sb2NhbC9hcGFjaGUvY29uZi9odHRwZC5jb25mKQ0KK2FuZCBtYWtlIHlvdXIgY2hhbmdlcy48L0ZPTlQ+PC9GT05UPjwvUD4NCis8VUw+DQorCTxMST48UD48Rk9OVCBGQUNFPSJUaW1lcywgc2VyaWYiPmh0dHBkLmNvbmYgZmlsZSBtdXN0IGJlIGVkaXRlZC4NCisJPEJSPlRoaXMgZmlsZSB3aWxsIGFsc28gYmUgdXNlZCB0byBleHBsaWNpdGx5IHN0YXJ0IGRlYnVnZ2luZyBvZiB0aGUNCisJYXBhY2hlIHNlcnZlciBwcm9jZXNzIGh0dHBkIGFuZCBzdGVwIGludG8gbW9kX2dzb2FwIHdpdGggZS5nLiA8QSBIUkVGPSJodHRwOi8vbWVtYmVycy5uZXh0cmEuYXQvam9oc2l4dC9rZGJnLmh0bWwiPmtkYmc8L0E+DQorCWRlYnVnZ2VyLiBUaGUgc2FtZSBmaWxlIGlzIHVzZWQgd2hlbiB5b3UgcnVuIGFwYWNoZSBhcyBhIGRhZW1vbi4NCisJVGhpcyBwcm9jZWR1cmUgaXMgaWRlbnRpY2FsIHRvIHdoYXQgaXMgZGVzY3JpYmVkIGluIHRoZSBleGFtcGxlDQorCW1vZHVsZSBSRUFETUUgaW4gdGhlIHN0YW5kYXJkIEFwYWNoZSBkaXN0cmlidXRpb24sIG9ubHkgd2l0aA0KKwlkaWZmZXJlbnQgbmFtZXMuIEFzIGEgZmlyc3Qgc3RlcCB5b3UgbXVzdCB0ZWxsIGFwYWNoZSB0byBsb2FkDQorCW1vZF9nc29hcC4gQWRkIHRoZSBsaW5lOjxCUj48Rk9OVCBGQUNFPSJDb3VyaWVyLCBtb25vc3BhY2UiPkxvYWRNb2R1bGUNCisJZ3NvYXBfbW9kdWxlIGxpYmV4ZWMvbW9kX2dzb2FwLnNvPC9GT05UPjxCUj5iZWxvdyB0aGUgcGxhY2Ugd2hlcmUNCisJdGhlIGNvbW1lbnQ6IDxCUj48Rk9OVCBGQUNFPSJDb3VyaWVyLCBtb25vc3BhY2UiPiMgRHluYW1pYyBTaGFyZWQNCisJT2JqZWN0IChEU08pIFN1cHBvcnQ8L0ZPTlQ+PEJSPmlzIGxvY2F0ZWQgKGxpYmV4ZWMvbW9kX2dzb2FwLnNvIGlzDQorCXRoZSBwbGFjZSB3aGVyZSBzaGFyZWQgbW9kdWxlcyBhcmUgaW5zdGFsbGVkIGFzIGEgZGVmYXVsdCwgc2VlIG90aGVyDQorCWV4aXN0aW5nIGNvbW1lbnRlZCBMb2FkTW9kdWxlIGluc3RydWN0aW9ucyBpbiB5b3VyIGh0dHBkLmNvbmYgZmlsZQ0KKwlhcyBleGFtcGxlcykuIGdzb2FwX21vZHVsZSBpcyB0aGUgbW9kdWxlIG5hbWUgaGFyZGNvZGVkIGluDQorCW1vZF9nc29hcC5jIDxCUj5OZXh0IGFkZCB0aGUgZm9sbG93aW5nIGxpbmVzIHRvIGh0dHBkLmNvbmYsIG5lYXIgdGhlDQorCW90aGVyICZsdDtMb2NhdGlvbiZndDsgc2VjdGlvbnM6PEJSPjxGT05UIEZBQ0U9IkNvdXJpZXIsIG1vbm9zcGFjZSI+Iw0KKwlTT0FQIGhhbmRsZXIgKHNlZSA8L0ZPTlQ+PEEgSFJFRj0iaHR0cDovL3d3dy5hYmVyZ2VyLmF0L1NPQVAiPjxGT05UIEZBQ0U9IkNvdXJpZXIsIG1vbm9zcGFjZSI+aHR0cDovL3d3dy5hYmVyZ2VyLmF0L1NPQVA8L0ZPTlQ+PC9BPjxGT05UIEZBQ0U9IkNvdXJpZXIsIG1vbm9zcGFjZSI+KTxCUj4mbHQ7SWZNb2R1bGUNCisJbW9kX2dzb2FwLmMmZ3Q7PEJSPiZsdDtMb2NhdGlvbiAvc29hcCZndDs8QlI+U2V0SGFuZGxlcg0KKwlnc29hcC1oYW5kbGVyPEJSPlNPQVBMaWJyYXJ5IC9ob21lL215dXNlcm5hbWUvZ3NvYXA8L0ZPTlQ+PC9GT05UPjxmb250IGZhY2U9IkNvdXJpZXIsIG1vbm9zcGFjZSI+LjAuMC41PC9mb250PjxGT05UIEZBQ0U9IlRpbWVzLCBzZXJpZiI+PEZPTlQgRkFDRT0iQ291cmllciwgbW9ub3NwYWNlIj4vYXBhY2hlL2V4YW1wbGUvY2FsY3VsYXRvci8ubGlicy9saWJDYWxjdWxhdG9yLnNvPEJSPiZsdDsvTG9jYXRpb24mZ3Q7PEJSPiZsdDsvSWZNb2R1bGUmZ3Q7PC9GT05UPjxCUj48Rk9OVCBTSVpFPTM+WW91DQorCWNhbiBwYXN0ZSB0aGUgbGluZXMgYWJvdmUgZnJvbSB0aGUgc2FtcGxlIGZpbGUgaW4gY29uZmlnDQorCXN1YmRpcmVjdG9yeS4gT2YgY291cnNlIHlvdSBtdXN0IGNoYW5nZSBteXVzZXJuYW1lIHRvIHlvdXIgbG9naW4NCisJbmFtZSwgYXMgYWJvdmUsIHNvIHRoYXQgdGhlIHN0cmluZyAvaG9tZS9teXVzZXJuYW1lIGFib3ZlDQorCWNvcnJlc3BvbmRzIHRvIHlvdXIgaG9tZSBkaXJlY3RvcnkuIERvIG5vdCB1c2UgfiBmb3IgeW91ciBob21lDQorCWRpcmVjdG9yeSBoZXJlLiBUaGlzIHdpbGwgbm90IGJlIHJlc29sdmVkIGJ5IGRsb3BlbigpISA8QlI+VGhlDQorCWlzb2FwLWhhbmRsZXIga25vd3MgMiBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZXM6PEJSPjxCPjxVPlNPQVBMaWJyYXJ5PC9VPjwvQj4NCisJaXMgdGhlIGZ1bGwgcGF0aCB0byB0aGUgbGlicmFyeSB0aGF0IGNvbnRhaW5zIHlvdXIgU09BUCBzZXJ2ZXINCisJc2hhcmVkIGxpYnJhcnksIHdpdGggdGhlIG1hbmRhdG9yeSBleHBvcnRlZCBmdW5jdGlvbiBhcyBkZWZpbmVkIGluDQorCXRoZSBpbmNsdWRlIGZpbGUgYXBhY2hlX2dzb2FwLmguIEl0IHRlbGxzIHRoZSBleHRlbnNpb24gd2hhdCBzaGFyZWQNCisJb2JqZWN0IGxpYnJhcnkgdG8gbG9hZCB0byBzZXJ2ZSB0aGUgU09BUCByZXF1ZXN0cyBmb3IgdGhpcyBsb2NhdGlvbg0KKwlhdCBydW50aW1lLiBZb3UgbXVzdCBjaGFuZ2UgdGhlIHBhdGggb2YgY291cnNlIHRvIHRoZSBmdWxsIHBhdGggb2YNCisJeW91ciBzZXJ2ZXIuIEl0IGlzIGJldHRlciB0byBzcGVjaWZpeSB0aGUgZnVsbCBwYXRoLCBhbmQgbm90IHRvIHVzZQ0KKwl0aGUgTERfTElCUkFSWV9QQVRIIGR1ZSB0byBzZWN1cml0eSByZWFzb25zLjxCUj48Qj48VT48U1BBTiBTVFlMRT0iZm9udC1zdHlsZTogbm9ybWFsIj5TdXBwb3J0TGlicmFyeTwvU1BBTj48L1U+PC9CPg0KKwlhcmUgYWxsIHRoZSBsaWJyYXJpZXMgbmVlZGVkIGFkZGl0aW9uYWxseSBieSB5b3VyIFNvYXAgc2VydmVyIHNoYXJlZA0KKwlsaWJyYXJ5LiBUaGV5IGFyZSBkeW5hbWljYWxseSBsb2FkZWQgaW50byB0aGUgYXBhY2hlIHNlcnZlciBwcm9jZXNzDQorCWh0dHBkIHdoZW4gdGhpcyBpbnN0cnVjdGlvbiBpcyBlbmNvdW50ZXJlZC4gT3RoZXJ3aXNlIGl0IHdvdWxkIGJlDQorCW5lY2Vzc2FyeSB0byBzdGF0aWNhbGx5IGxpbmsgdGhlc2UgbGlicmFyaWVzIGFuZCByZWJ1aWxkIGh0dHBkIGFuZA0KKwltb2RfZ3NvYXAgZXZlcnkgdGltZSB5b3UgY2hhbmdlIHNvbWV0aGluZy4gVGhpcyB3YXMgbm90IHRoZSBkZXNpcmVkDQorCWdvYWwuPC9GT05UPjwvRk9OVD48L1A+DQorCTxMST48UD48Rk9OVCBGQUNFPSJUaW1lcywgc2VyaWYiPk5vdyB0ZXN0IGlmIHRoZSBBcGFjaGUgU2VydmVyDQorCWl0c2VsZiBpcyBjb3JyZWN0bHkgY29uZmlndXJlZCwgcnVuIHRoZSBmb2xsb3dpbmcgZnJvbSB5b3VyDQorCX4vYXBhY2hlLTEuMy4yNi9zcmMgZGlyZWN0b3J5OjxCUj48Rk9OVCBGQUNFPSJDb3VyaWVyLCBtb25vc3BhY2UiPi4vaHR0cGQNCisJLVggLWYgL3Vzci9sb2NhbC9hcGFjaGUvY29uZi9odHRwZC5jb25mPC9GT05UPjwvRk9OVD48L1A+DQorCTxMST48UD48Rk9OVCBGQUNFPSJUaW1lcywgc2VyaWYiPlRoaXMgd2lsbCBsYXVuY2ggdGhlIHNlcnZlciBpbg0KKwljb25zb2xlIG1vZGUgKGRvZXMgbm90IHJldHVybiB1bnRpbCB5b3UgY2FuY2VsIGl0KS4gVGhlbiBvcGVuIHlvdXINCisJZmF2b3VyaXRlIFdlYiBCcm93c2VyIGFuZCBicm93c2UgdG86PEJSPjxBIEhSRUY9Imh0dHA6Ly8xMjcuMC4wLjE6ODA4MC9zb2FwP3N0cnVjdHVyZXMiPjxGT05UIEZBQ0U9IkNvdXJpZXIsIG1vbm9zcGFjZSI+aHR0cDovLzEyNy4wLjAuMTo4MDgwPEJSPjwvRk9OVD48L0E+VGhpcw0KKwlzaG91bGQgZ2l2ZSBhc3RhbmRhcmQgYXBhY2hlIHJlc3BvbnNlLCBoYXMgbm90aGluZyB0byBkbyB3aXRoIHlvdXINCisJbW9kX2dzb2FwIHlldC4gVGhlIHBvcnQgODA4MCB3YXMgYWxzbyBzZXQgaW4gaHR0cGQuY29uZiwgaWYgeW91DQorCWRvbid0IGdldCBhIHJlc3BvbnNlLCBjaGVjayB0aGUgcG9ydCBhbmQgc2VlIHRoZSBlcnJvcl9sb2cgZmlsZS4gRm9yDQorCXRoZSBwcm9kdWN0aW9uIHNlcnZlciBpdCBtYXliZSB3aWxsIGJlIHBvcnQgODAsIHdoaWNoIHlvdSBkbyBub3QNCisJbmVlZCB0byBzcGVjaWZ5IGV4cGxpY2l0bHkgaW4gdGhlIGJyb3dzZXIgdGhlbi4gQnV0IGZvciBkZWJ1Z2dpbmcgSQ0KKwlyZWNvbW1lbmQgdG8gc3RheSB3aXRoIHBvcnQgODA4MCwgYmVjYXVzZSBmb3IgcG9ydCA4MCB5b3Ugd291bGQgbmVlZA0KKwlyb290IHByaXZpbGVkZ2VzIGZvciBkZWJ1Z2dpbmcuPEJSPlRoaXMgcmVxdWVzdCBzaG91bGQgZ2l2ZSBhDQorCXJlc3BvbnNlIGZyb20gYXBhY2hlLjwvRk9OVD48L1A+DQorCTxMST48UD48Rk9OVCBGQUNFPSJUaW1lcywgc2VyaWYiPkFzIGEgbmV4dCBzdGVwIGxldCB1cyB0ZXN0IGlmIHlvdXINCisJbW9kX2dzb2FwIHJlc3BvbmRzLiBUaGUgcmVxdWVzdCBtdXN0IGNvbnRhaW4gdGhlIGxvY2F0aW9uIHlvdSBnYXZlDQorCWluIHRoZSAmbHQ7TG9jYXRpb24mZ3Q7IGRpcmVjdGl2ZS4gPEZPTlQgRkFDRT0iVGltZXMsIHNlcmlmIj5FbnRlcg0KKwlhcyBhZGRyZXNzIGluIHlvdXIgYnJvd3Nlcjo8L0ZPTlQ+PEJSPjxBIEhSRUY9Imh0dHA6Ly8xMjcuMC4wLjE6ODA4MC9zb2FwIj5odHRwOi8vMTI3LjAuMC4xOjgwODAvc29hcDxCUj48L0E+VGhpcw0KKwlzaG91bGQgZ2l2ZSBhIHJlc3BvbnNlIGZyb20gbW9kX2dzb2FwLCBhbiBlcnJvciBtZXNzYWdlLCBiZWNhdXNlDQorCXlvdXIgYnJvd3NlciB3aWxsIHByb3BhYmx5IG5vdCBzZW5kIHRoZSByZXF1aXJlZCBTT0FQQWN0aW9uIGhlYWRlci4NCisJU29tZXRoaW5nIGlzIHdyb25nIGlmIHlvdSBnZXQgYW4gdXJsIG5vdCBmb3VuZCBvciBhIGRpcmVjdG9yeQ0KKwlsaXN0aW5nIGFzIGEgcmVzcG9uc2UuIEluIHRoYXQgY2FzZSBjaGVjayBpZiB5b3UgcmVhbGx5IGFkZGVkIHRoZQ0KKwlMb2FkTW9kdWxlIGluc3RydWN0aW9uIGRlc2NyaWJlZCBhYm92ZSBwcm9wZXJseS4gPEJSPk5vdGU6IHRoZSBzb2FwDQorCXZpcnR1YWwgZGlyZWN0b3J5IHdhcyBkZWZpbmVkIGJ5IHlvdXJzZWxmIGluIHRoZSAmbHQ7TG9jYXRpb24mZ3Q7DQorCWluc3RydWN0aW9uIGFib3ZlLiBEbyA8Qj48VT5ub3Q8L1U+PC9CPiBjcmVhdGUgYSBwaHlzaWNhbCBzb2FwDQorCWRpcmVjdG9yeSBpbiB5b3VyIGRvY3VtZW50IHJvb3QgITwvRk9OVD48L1A+DQorCTxMST48UD48Rk9OVCBGQUNFPSJUaW1lcywgc2VyaWYiPldlbGwsIG5vdyBpdCBpcyB0aW1lIHRvIGNoZWNrIGlmDQorCUFwYWNoZSBTZXJ2ZXIgY2FuIGFuc3dlciB5b3VyIFNPQVAgcmVxdWVzdHMuIFJ1biB0aGUgY2FsY3VsYXRvcg0KKwljbGllbnQgZGVtbyBwcm9ncmFtLiBJdCBoYXMgYmVlbiBidWlsdCBieSB0aGUgbWFrZWZpbGUgYWxyZWFkeS4NCisJRW50ZXIgdGhlIGZvbGxvd2luZzo8QlI+PC9GT05UPjxGT05UIEZBQ0U9IkNvdXJpZXIsIG1vbm9zcGFjZSI+Y2QNCisJfi9hcGFjaGUtZ3NvYXAvZXhhbXBsZS9jYWxjdWxhdG9yPEJSPi4vY2xpZW50IDEgKyAyPC9GT05UPjxCUj5UaGlzDQorCXNob3VsZCBhbnN3ZXIgdGhlIFNPQVAgcmVxdWVzdHMgbGlrZSB0aGUgZ3NvYXAgd2ViIHNlcnZpY2UgZG9lcywgYnV0DQorCW9mIGNvdXJzZSB3aXRoIGFsbCB0aGUgcXVhbGl0eSwgc3BlZWQsIHNjYWxhYmlsaXR5LCBzdGFiaWxpdHkgZXRjLg0KKwlvZiB0aGUgd29ybGQncyBtb3N0IHBvcHVsYXIgaHR0cCBzZXJ2ZXIuPC9QPg0KKzwvVUw+DQorPEgxPlByb2dyYW1taW5nIGFuZCBEZWJ1Z2dpbmcgVGlwczwvSDE+DQorPEgyPkxvb2t1cCB0aGUgZXJyb3IgbG9nIGZpbGUgb2YgQXBhY2hlIFNlcnZlcjwvSDI+DQorPFA+bW9kX2dzb2FwIGxvZ3MgYXBhY2hlIGVycm9ycyBpbiB0aGUgc3RhbmRhcmQgd2F5LiBTbyBzZWUgdGhlDQorYXBhY2hlIGxvZyBmaWxlLCB0eXBpY2FsbHkgaXQgaXMgbG9jYXRlZCBhdA0KKy91c3IvbG9jYWwvYXBhY2hlL2xvZ3MvYXBhY2hlX2xvZy48L1A+DQorPEgzPkJlIHN1cmUgeW91IERlYnVnIHRoZSBjb3JyZWN0IHByb2Nlc3M8L0gzPg0KKzxQPlNvbWV0aW1lcyB3aGVuIHlvdSBleGl0IHRoZSBkZWJ1Z2dlciBpdCBjYW4gaGFwcGVuIHRoYXQgdGhlIGh0dHBkDQorcHJvY2VzcyBpcyBzdGlsbCBhbGl2ZS4gU28gYmVmb3JlIHlvdSBjb250aW51ZSwgaXQgbWlnaHQgYmUgYSBnb29kDQoraWRlYSB0byBydW48QlI+cHMgLWVmIHwgZ3JlcCBodHRwZDxCUj50byBzZWUgaWYgdGhlcmUgaXMgc3RpbGwgYQ0KK3NlcnZlciBhbGl2ZSwgd2hpY2ggc2hvdWxkIGJlIGtpbGxlZCBiZWZvcmUgdGhlIG5leHQgZGVidWdnaW5nDQorc2Vzc2lvbi4gRm9yIGtpbGxpbmcgYWxsIGFjdGl2ZSBodHRwZCBwcm9jZXNzZXMgSSB1c2U6PEJSPjxGT05UIEZBQ0U9IkNvdXJpZXIsIG1vbm9zcGFjZSI+a2lsbA0KK2BwcyAtZWYgfCBncmVwIGh0dHBkIHwgc2VkIC1lJnF1b3Q7cy9cICogLzovZyZxdW90OyB8IGN1dCAtZjIgLWQ6YDwvRk9OVD4NCis8L1A+DQorPFA+WW91IGRvIG5vdCBkZWJ1ZyB0aGUgcHJvY2VzcyAvdXNyL2xvY2FsL2FwYWNoZS9iaW4vaHR0cGQsIGJ1dCB0aGUNCitodHRwZCBwcm9ncmFtIHRoYXQgeW91IGJ1aWxkIGluIHlvdXIgc291cmNlIGNvZGUgZGlyZWN0b3J5DQorfi9hcGFjaGUvc3JjLiBUaGUga2V5IHRvIHN1Y2Nlc3NmdWwgZGVidWdnaW5nIGlzIHRoZSAtWCBmbGFnLiBTbyBpbg0KK3lvdXIgZGVidWdnZXIgcnVuIGh0dHBkIGZyb20gfi9hcGFjaGUvc3JjLCBidXQgdXNlIHRoZSBzYW1lDQorY29uZmlndXJhdGlvbiBmaWxlIGFzIHlvdXIgcHJvZHVjdGlvbiBzZXJ2ZXIgd2lsbCB1c2UuIFVzZSB0aGUNCitmb2xsb3dpbmcgY29tbWFuZGxpbmUgdG8gc3RhcnQgZGVidWdnaW5nOjxCUj48Rk9OVCBGQUNFPSJDb3VyaWVyLCBtb25vc3BhY2UiPi4vaHR0cGQNCistWCAtZiAvdXNyL2xvY2FsL2FwYWNoZS9jb25mL2h0dHBkLmNvbmY8L0ZPTlQ+PC9QPg0KKzxQPjxGT05UIEZBQ0U9IlRpbWVzLCBzZXJpZiI+V2hlbiB0aGUgcHJvY2VzcyBpcyBzdGFydGVkIGluIHRoZQ0KK2RlYnVnZ2VyLCBzZXQgeW91ciBicmVha3BvaW50cyBhbmQgdXNlIHlvdXIgZmF2b3VyaXRlIGJyb3dzZXIgYW5kDQorcmVmcmVzaCB0aGUgcGFnZSA8QSBIUkVGPSJodHRwOi8vMTI3LjAuMC4xOjgwODAvc29hcCI+aHR0cDovLzEyNy4wLjAuMTo4MDgwL3NvYXA8L0E+Lg0KKzwvRk9OVD4NCis8L1A+DQorPFA+Jm5ic3A7IA0KKzwvUD4NCis8UD48Rk9OVCBGQUNFPSJUaW1lcywgc2VyaWYiPlNlZSBhbHNvIHRoZSBGcmVxdWVudGx5IGFza2VkIFF1ZXN0aW9ucw0KK2F0IHRoZSBlbmQgb2YmbmJzcDsgdGhlIDxBIEhSRUY9Imlpc19pbmRleC5odG1sIj5JSVMgZGVzY3JpcHRpb248L0E+LjwvRk9OVD4NCis8L1A+DQorPEgyPkhvdyB0byB1c2Uga2RldmVsb3AgZm9yIFByb2dyYW1taW5nIGFuZCBEZWJ1Z2dpbmcgb2YgQXBhY2hlDQorbW9kdWxlcyANCis8L0gyPg0KKzxQPklmIHlvdSB3YW50IHRvIHVzZSA8QSBIUkVGPSJodHRwOi8vd3d3LmtkZXZlbG9wLm9yZy8iPjxGT05UIEZBQ0U9IlRpbWVzLCBzZXJpZiI+a2RldmVsb3A8L0ZPTlQ+PC9BPjxGT05UIEZBQ0U9IlRpbWVzLCBzZXJpZiI+DQordG8gZGVidWcgQXBhY2hlIHRoZW4geW91IGNhbiBjaGFuZ2UgdG8gdGhlIGRpcmVjdG9yeSB+L2FwYWNoZS9zcmMgYW5kDQorcnVuOjxCUj48L0ZPTlQ+PEZPTlQgRkFDRT0iQ291cmllciwgbW9ub3NwYWNlIj5raW1wb3J0ICZndDsNCithcGFjaGUua2RldnByajwvRk9OVD48L1A+DQorPFA+QWZ0ZXIgdGhhdCB5b3UgY2FuIG9wZW4gYXBhY2hlLmtkZXZwcmogYXMgYSBrZGV2ZWxvcCBwcm9qZWN0LiBVc2UNCit0aGUgYXBwcm9wcmlhdGUgZGlhbG9ncyBpbiB5b3VyIGRlYnVnZ2luZyBlbnZpcm9ubWVudCB0byBzZXQgdGhlDQorY29tbWFuZGxpbmUgYXJndW1lbnRzIGZvciBkZWJ1Z2dpbmcuIDxCUj48QlI+PEJSPg0KKzwvUD4NCis8UD5JIGhvcGUgeW91IHdpbGwgaGF2ZSBmdW4gd2l0aCB0aGlzLiANCis8L1A+DQorPFA+RW5qb3ksIA0KKzwvUD4NCis8UD48QSBIUkVGPSJodHRwOi8vd3d3LndlYndhcmUuYXQvIj5DaHJpc3RpYW4gQWJlcmdlcjwvQT4uPC9QPg0KKzwvQk9EWT4NCis8L0hUTUw+DQpkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL2NvbmZpZy5ndWVzcyBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9jb25maWcuZ3Vlc3MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmVhZDgwYQotLS0gL2Rldi9udWxsCisrKyBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9jb25maWcuZ3Vlc3MKQEAgLTAsMCArMSwxMzI3IEBACisjISAvYmluL3NoCisjIEF0dGVtcHQgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUuCisjICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxCisjICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK3RpbWVzdGFtcD0nMjAwMS0wOC0yMScKKworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKKyMgV3JpdHRlbiBieSBQZXIgQm90aG5lciA8Ym90aG5lckBjeWdudXMuY29tPi4KKyMgUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uCisjCisjIFRoaXMgc2NyaXB0IGF0dGVtcHRzIHRvIGd1ZXNzIGEgY2Fub25pY2FsIHN5c3RlbSBuYW1lIHNpbWlsYXIgdG8KKyMgY29uZmlnLnN1Yi4gIElmIGl0IHN1Y2NlZWRzLCBpdCBwcmludHMgdGhlIHN5c3RlbSBuYW1lIG9uIHN0ZG91dCwgYW5kCisjIGV4aXRzIHdpdGggMC4gIE90aGVyd2lzZSwgaXQgZXhpdHMgd2l0aCAxLgorIworIyBUaGUgcGxhbiBpcyB0aGF0IHRoaXMgY2FuIGJlIGNhbGxlZCBieSBjb25maWd1cmUgc2NyaXB0cyBpZiB5b3UKKyMgZG9uJ3Qgc3BlY2lmeSBhbiBleHBsaWNpdCBidWlsZCBzeXN0ZW0gdHlwZS4KKworbWU9YGVjaG8gIiQwIiB8IHNlZCAtZSAncywuKi8sLCdgCisKK3VzYWdlPSJcCitVc2FnZTogJDAgW09QVElPTl0KKworT3V0cHV0IHRoZSBjb25maWd1cmF0aW9uIG5hbWUgb2YgdGhlIHN5c3RlbSBcYCRtZScgaXMgcnVuIG9uLgorCitPcGVyYXRpb24gbW9kZXM6CisgIC1oLCAtLWhlbHAgICAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAorICAtdCwgLS10aW1lLXN0YW1wICAgcHJpbnQgZGF0ZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiwgdGhlbiBleGl0CisgIC12LCAtLXZlcnNpb24gICAgICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0CisKK1JlcG9ydCBidWdzIGFuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4iCisKK3ZlcnNpb249IlwKK0dOVSBjb25maWcuZ3Vlc3MgKCR0aW1lc3RhbXApCisKK09yaWdpbmFsbHkgd3JpdHRlbiBieSBQZXIgQm90aG5lci4KK0NvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCit3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4iCisKK2hlbHA9IgorVHJ5IFxgJG1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorCisjIFBhcnNlIGNvbW1hbmQgbGluZQord2hpbGUgdGVzdCAkIyAtZ3QgMCA7IGRvCisgIGNhc2UgJDEgaW4KKyAgICAtLXRpbWUtc3RhbXAgfCAtLXRpbWUqIHwgLXQgKQorICAgICAgIGVjaG8gIiR0aW1lc3RhbXAiIDsgZXhpdCAwIDs7CisgICAgLS12ZXJzaW9uIHwgLXYgKQorICAgICAgIGVjaG8gIiR2ZXJzaW9uIiA7IGV4aXQgMCA7OworICAgIC0taGVscCB8IC0taCogfCAtaCApCisgICAgICAgZWNobyAiJHVzYWdlIjsgZXhpdCAwIDs7CisgICAgLS0gKSAgICAgIyBTdG9wIG9wdGlvbiBwcm9jZXNzaW5nCisgICAgICAgc2hpZnQ7IGJyZWFrIDs7CisgICAgLSApCSMgVXNlIHN0ZGluIGFzIGlucHV0LgorICAgICAgIGJyZWFrIDs7CisgICAgLSogKQorICAgICAgIGVjaG8gIiRtZTogaW52YWxpZCBvcHRpb24gJDEkaGVscCIgPiYyCisgICAgICAgZXhpdCAxIDs7CisgICAgKiApCisgICAgICAgYnJlYWsgOzsKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0ICQjICE9IDA7IHRoZW4KKyAgZWNobyAiJG1lOiB0b28gbWFueSBhcmd1bWVudHMkaGVscCIgPiYyCisgIGV4aXQgMQorZmkKKworCitkdW1teT1kdW1teS0kJAordHJhcCAncm0gLWYgJGR1bW15LmMgJGR1bW15Lm8gJGR1bW15LnJlbCAkZHVtbXk7IGV4aXQgMScgMSAyIDE1CisKKyMgQ0NfRk9SX0JVSUxEIC0tIGNvbXBpbGVyIHVzZWQgYnkgdGhpcyBzY3JpcHQuCisjIEhpc3RvcmljYWxseSwgYENDX0ZPUl9CVUlMRCcgdXNlZCB0byBiZSBuYW1lZCBgSE9TVF9DQycuIFdlIHN0aWxsCisjIHVzZSBgSE9TVF9DQycgaWYgZGVmaW5lZCwgYnV0IGl0IGlzIGRlcHJlY2F0ZWQuCisKK3NldF9jY19mb3JfYnVpbGQ9J2Nhc2UgJENDX0ZPUl9CVUlMRCwkSE9TVF9DQywkQ0MgaW4KKyAsLCkgICAgZWNobyAiaW50IGR1bW15KCl7fSIgPiAkZHVtbXkuYyA7CisJZm9yIGMgaW4gY2MgZ2NjIGM4OSA7IGRvCisJICAoJGMgJGR1bW15LmMgLWMgLW8gJGR1bW15Lm8pID4vZGV2L251bGwgMj4mMSA7CisJICBpZiB0ZXN0ICQ/ID0gMCA7IHRoZW4KKwkgICAgIENDX0ZPUl9CVUlMRD0iJGMiOyBicmVhayA7CisJICBmaSA7CisJZG9uZSA7CisJcm0gLWYgJGR1bW15LmMgJGR1bW15Lm8gJGR1bW15LnJlbCA7CisJaWYgdGVzdCB4IiRDQ19GT1JfQlVJTEQiID0geCA7IHRoZW4KKwkgIENDX0ZPUl9CVUlMRD1ub19jb21waWxlcl9mb3VuZCA7CisJZmkKKwk7OworICwsKikgICBDQ19GT1JfQlVJTEQ9JENDIDs7CisgLCosKikgIENDX0ZPUl9CVUlMRD0kSE9TVF9DQyA7OworZXNhYycKKworIyBUaGlzIGlzIG5lZWRlZCB0byBmaW5kIHVuYW1lIG9uIGEgUHlyYW1pZCBPU3ggd2hlbiBydW4gaW4gdGhlIEJTRCB1bml2ZXJzZS4KKyMgKGdoYXppQG5vYy5ydXRnZXJzLmVkdSAxOTk0LTA4LTI0KQoraWYgKHRlc3QgLWYgLy5hdHRiaW4vdW5hbWUpID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwlQQVRIPSRQQVRIOi8uYXR0YmluIDsgZXhwb3J0IFBBVEgKK2ZpCisKK1VOQU1FX01BQ0hJTkU9YCh1bmFtZSAtbSkgMj4vZGV2L251bGxgIHx8IFVOQU1FX01BQ0hJTkU9dW5rbm93bgorVU5BTUVfUkVMRUFTRT1gKHVuYW1lIC1yKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfUkVMRUFTRT11bmtub3duCitVTkFNRV9TWVNURU09YCh1bmFtZSAtcykgMj4vZGV2L251bGxgICB8fCBVTkFNRV9TWVNURU09dW5rbm93bgorVU5BTUVfVkVSU0lPTj1gKHVuYW1lIC12KSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfVkVSU0lPTj11bmtub3duCisKK2Nhc2UgIiR7VU5BTUVfTUFDSElORX0iIGluCisgICAgaT84NikKKwl0ZXN0IC16ICIkVkVORE9SIiAmJiBWRU5ET1I9cGMKKwk7OworICAgICopCisJdGVzdCAteiAiJFZFTkRPUiIgJiYgVkVORE9SPXVua25vd24KKwk7OworZXNhYwordGVzdCAtZiAvZXRjL1N1U0UtcmVsZWFzZSAmJiBWRU5ET1I9c3VzZQorCisjIE5vdGU6IG9yZGVyIGlzIHNpZ25pZmljYW50IC0gdGhlIGNhc2UgYnJhbmNoZXMgYXJlIG5vdCBleGNsdXNpdmUuCisKK2Nhc2UgIiR7VU5BTUVfTUFDSElORX06JHtVTkFNRV9TWVNURU19OiR7VU5BTUVfUkVMRUFTRX06JHtVTkFNRV9WRVJTSU9OfSIgaW4KKyAgICAqOk5ldEJTRDoqOiopCisJIyBOZXRic2QgKG5ic2QpIHRhcmdldHMgc2hvdWxkICh3aGVyZSBhcHBsaWNhYmxlKSBtYXRjaCBvbmUgb3IKKwkjIG1vcmUgb2YgdGhlIHR1cHBsZXM6ICotKi1uZXRic2RlbGYqLCAqLSotbmV0YnNkYW91dCosCisJIyAqLSotbmV0YnNkZWNvZmYqIGFuZCAqLSotbmV0YnNkKi4gIEZvciB0YXJnZXRzIHRoYXQgcmVjZW50bHkKKwkjIHN3aXRjaGVkIHRvIEVMRiwgKi0qLW5ldGJzZCogd291bGQgc2VsZWN0IHRoZSBvbGQKKwkjIG9iamVjdCBmaWxlIGZvcm1hdC4gIFRoaXMgcHJvdmlkZXMgYm90aCBmb3J3YXJkCisJIyBjb21wYXRpYmlsaXR5IGFuZCBhIGNvbnNpc3RlbnQgbWVjaGFuaXNtIGZvciBzZWxlY3RpbmcgdGhlCisJIyBvYmplY3QgZmlsZSBmb3JtYXQuCisJIyBEZXRlcm1pbmUgdGhlIG1hY2hpbmUvdmVuZG9yIChpcyB0aGUgdmVuZG9yIHJlbGV2YW50KS4KKwljYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgorCSAgICBhbWlnYSkgbWFjaGluZT1tNjhrLXVua25vd24gOzsKKwkgICAgYXJtMzIpIG1hY2hpbmU9YXJtLXVua25vd24gOzsKKwkgICAgYXRhcmkqKSBtYWNoaW5lPW02OGstYXRhcmkgOzsKKwkgICAgc3VuMyopIG1hY2hpbmU9bTY4ay1zdW4gOzsKKwkgICAgbWFjNjhrKSBtYWNoaW5lPW02OGstYXBwbGUgOzsKKwkgICAgbWFjcHBjKSBtYWNoaW5lPXBvd2VycGMtYXBwbGUgOzsKKwkgICAgaHAzWzAtOV1bMDVdKSBtYWNoaW5lPW02OGstaHAgOzsKKwkgICAgaWJtcnR8cm9tcC1pYm0pIG1hY2hpbmU9cm9tcC1pYm0gOzsKKwkgICAgKikgbWFjaGluZT0ke1VOQU1FX01BQ0hJTkV9LXVua25vd24gOzsKKwllc2FjCisJIyBUaGUgT3BlcmF0aW5nIFN5c3RlbSBpbmNsdWRpbmcgb2JqZWN0IGZvcm1hdCwgaWYgaXQgaGFzIHN3aXRjaGVkCisJIyB0byBFTEYgcmVjZW50bHksIG9yIHdpbGwgaW4gdGhlIGZ1dHVyZS4KKwljYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgorCSAgICBpMzg2fHNwYXJjfGFtaWdhfGFybSp8aHAzMDB8bXZtZTY4a3x2YXh8YXRhcml8bHVuYTY4a3xtYWM2OGt8bmV3czY4a3xuZXh0NjhrfHBjNTMyfHN1bjMqfHg2OGspCisJCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkJaWYgZWNobyBfX0VMRl9fIHwgJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsIFwKKwkJCXwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGwKKwkJdGhlbgorCQkgICAgIyBPbmNlIGFsbCB1dGlsaXRpZXMgY2FuIGJlIEVDT0ZGIChuZXRic2RlY29mZikgb3IgYS5vdXQgKG5ldGJzZGFvdXQpLgorCQkgICAgIyBSZXR1cm4gbmV0YnNkIGZvciBlaXRoZXIuICBGSVg/CisJCSAgICBvcz1uZXRic2QKKwkJZWxzZQorCQkgICAgb3M9bmV0YnNkZWxmCisJCWZpCisJCTs7CisJICAgICopCisJICAgICAgICBvcz1uZXRic2QKKwkJOzsKKwllc2FjCisJIyBUaGUgT1MgcmVsZWFzZQorCXJlbGVhc2U9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qL1wuLydgCisJIyBTaW5jZSBDUFVfVFlQRS1NQU5VRkFDVFVSRVItS0VSTkVMLU9QRVJBVElOR19TWVNURU06CisJIyBjb250YWlucyByZWR1bmRhbnQgaW5mb3JtYXRpb24sIHRoZSBzaG9ydGVyIGZvcm06CisJIyBDUFVfVFlQRS1NQU5VRkFDVFVSRVItT1BFUkFUSU5HX1NZU1RFTSBpcyB1c2VkLgorCWVjaG8gIiR7bWFjaGluZX0tJHtvc30ke3JlbGVhc2V9IgorCWV4aXQgMCA7OworICAgIGFscGhhOk9TRjE6KjoqKQorCWlmIHRlc3QgJFVOQU1FX1JFTEVBU0UgPSAiVjQuMCI7IHRoZW4KKwkJVU5BTUVfUkVMRUFTRT1gL3Vzci9zYmluL3NpemVyIC12IHwgYXdrICd7cHJpbnQgJDN9J2AKKwlmaQorCSMgQSBWbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCB2ZXJzaW9uLgorCSMgQSBUbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCBmaWVsZCB0ZXN0IHZlcnNpb24uCisJIyBBIFhuLm4gdmVyc2lvbiBpcyBhbiB1bnJlbGVhc2VkIGV4cGVyaW1lbnRhbCBiYXNlbGV2ZWwuCisJIyAxLjIgdXNlcyAiMS4yIiBmb3IgdW5hbWUgLXIuCisJY2F0IDw8RU9GID4kZHVtbXkucworCS5kYXRhCitcJExmb3JtYXQ6CisJLmJ5dGUgMzcsMTAwLDQ1LDM3LDEyMCwxMCwwCSMgIiVkLSV4XG4iCisKKwkudGV4dAorCS5nbG9ibCBtYWluCisJLmFsaWduIDQKKwkuZW50IG1haW4KK21haW46CisJLmZyYW1lIFwkMzAsMTYsXCQyNiwwCisJbGRncCBcJDI5LDAoXCQyNykKKwkucHJvbG9ndWUgMQorCS5sb25nIDB4NDdlMDNkODAgIyBpbXBsdmVyIFwkMAorCWxkYSBcJDIsLTEKKwkubG9uZyAweDQ3ZTIwYzIxICMgYW1hc2sgXCQyLFwkMQorCWxkYSBcJDE2LFwkTGZvcm1hdAorCW1vdiBcJDAsXCQxNworCW5vdCBcJDEsXCQxOAorCWpzciBcJDI2LHByaW50ZgorCWxkZ3AgXCQyOSwwKFwkMjYpCisJbW92IDAsXCQxNgorCWpzciBcJDI2LGV4aXQKKwkuZW5kIG1haW4KK0VPRgorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkkQ0NfRk9SX0JVSUxEICRkdW1teS5zIC1vICRkdW1teSAyPi9kZXYvbnVsbAorCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuCisJCWNhc2UgYC4vJGR1bW15YCBpbgorCQkJMC0wKQorCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhIgorCQkJCTs7CisJCQkxLTApCisJCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjUiCisJCQkJOzsKKwkJCTEtMSkKKwkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NTYiCisJCQkJOzsKKwkJCTEtMTAxKQorCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTYiCisJCQkJOzsKKwkJCTItMzAzKQorCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2IgorCQkJCTs7CisJCQkyLTMwNykKKwkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjciCisJCQkJOzsKKwkJCTItMTMwNykKKwkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiCisJCQkJOzsKKwkJZXNhYworCWZpCisJcm0gLWYgJGR1bW15LnMgJGR1bW15CisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWRlYy1vc2ZgZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL15bVlRYXS8vJyB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKwlleGl0IDAgOzsKKyAgICBBbHBoYVwgKjpXaW5kb3dzX05UKjoqKQorCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KKwkjIFNob3VsZCB3ZSBjaGFuZ2UgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQKKwkjIG9mIHRoZSBzcGVjaWZpYyBBbHBoYSBtb2RlbD8KKwllY2hvIGFscGhhLXBjLWludGVyaXgKKwlleGl0IDAgOzsKKyAgICAyMTA2NDpXaW5kb3dzX05UOjUwOjMpCisJZWNobyBhbHBoYS1kZWMtd2lubnQzLjUKKwlleGl0IDAgOzsKKyAgICBBbWlnYSo6VU5JWF9TeXN0ZW1fVjo0LjA6KikKKwllY2hvIG02OGstdW5rbm93bi1zeXN2NAorCWV4aXQgMDs7CisgICAgYW1pZ2E6T3BlbkJTRDoqOiopCisJZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICAqOltBYV1taWdhW09vXVtTc106KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWFtaWdhb3MKKwlleGl0IDAgOzsKKyAgICBhcmM2NDpPcGVuQlNEOio6KikKKwllY2hvIG1pcHM2NGVsLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBhcmM6T3BlbkJTRDoqOiopCisJZWNobyBtaXBzZWwtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIGhrbWlwczpPcGVuQlNEOio6KikKKwllY2hvIG1pcHMtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHBtYXg6T3BlbkJTRDoqOiopCisJZWNobyBtaXBzZWwtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHNnaTpPcGVuQlNEOio6KikKKwllY2hvIG1pcHMtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHdncmlzYzpPcGVuQlNEOio6KikKKwllY2hvIG1pcHNlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgKjpPUy8zOTA6KjoqKQorCWVjaG8gaTM3MC1pYm0tb3BlbmVkaXRpb24KKwlleGl0IDAgOzsKKyAgICBhcm06UklTQyo6MS5bMDEyXSo6Knxhcm06cmlzY2l4OjEuWzAxMl0qOiopCisJZWNobyBhcm0tYWNvcm4tcmlzY2l4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMDs7CisgICAgU1IyPzAxOkhJLVVYL01QUDoqOiogfCBTUjgwMDA6SEktVVgvTVBQOio6KikKKwllY2hvIGhwcGExLjEtaGl0YWNoaS1oaXV4bXBwCisJZXhpdCAwOzsKKyAgICBQeXJhbWlkKjpPU3gqOio6KiB8IE1JUyo6T1N4KjoqOiogfCBNSVMqOlNNUF9EQy1PU3gqOio6KikKKwkjIGFrZWVAd3BkaXMwMy53cGFmYi5hZi5taWwgKEVhcmxlIEYuIEFrZSkgY29udHJpYnV0ZWQgTUlTIGFuZCBOSUxFLgorCWlmIHRlc3QgImAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgIiA9IGF0dCA7IHRoZW4KKwkJZWNobyBweXJhbWlkLXB5cmFtaWQtc3lzdjMKKwllbHNlCisJCWVjaG8gcHlyYW1pZC1weXJhbWlkLWJzZAorCWZpCisJZXhpdCAwIDs7CisgICAgTklMRSo6KjoqOmRjb3N4KQorCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN2cjQKKwlleGl0IDAgOzsKKyAgICBzdW40SDpTdW5PUzo1Lio6KikKKwllY2hvIHNwYXJjLWhhbC1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgMCA7OworICAgIHN1bjQqOlN1bk9TOjUuKjoqIHwgdGFkcG9sZSo6U3VuT1M6NS4qOiopCisJZWNobyBzcGFyYy1zdW4tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDAgOzsKKyAgICBpODZwYzpTdW5PUzo1Lio6KikKKwllY2hvIGkzODYtcGMtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDAgOzsKKyAgICBzdW40KjpTdW5PUzo2KjoqKQorCSMgQWNjb3JkaW5nIHRvIGNvbmZpZy5zdWIsIHRoaXMgaXMgdGhlIHByb3BlciB3YXkgdG8gY2Fub25pY2FsaXplCisJIyBTdW5PUzYuICBIYXJkIHRvIGd1ZXNzIGV4YWN0bHkgd2hhdCBTdW5PUzYgd2lsbCBiZSBsaWtlLCBidXQKKwkjIGl0J3MgbGlrZWx5IHRvIGJlIG1vcmUgbGlrZSBTb2xhcmlzIHRoYW4gU3VuT1M0LgorCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMzYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCAwIDs7CisgICAgc3VuNCo6U3VuT1M6KjoqKQorCWNhc2UgImAvdXNyL2Jpbi9hcmNoIC1rYCIgaW4KKwkgICAgU2VyaWVzKnxTNCopCisJCVVOQU1FX1JFTEVBU0U9YHVuYW1lIC12YAorCQk7OworCWVzYWMKKwkjIEphcGFuZXNlIExhbmd1YWdlIHZlcnNpb25zIGhhdmUgYSB2ZXJzaW9uIG51bWJlciBsaWtlIGA0LjEuMy1KTCcuCisJZWNobyBzcGFyYy1zdW4tc3Vub3NgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vJ2AKKwlleGl0IDAgOzsKKyAgICBzdW4zKjpTdW5PUzoqOiopCisJZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBzdW4qOio6NC4yQlNEOiopCisJVU5BTUVfUkVMRUFTRT1gKGhlYWQgLTEgL2V0Yy9tb3RkIHwgYXdrICd7cHJpbnQgc3Vic3RyKCQ1LDEsMyl9JykgMj4vZGV2L251bGxgCisJdGVzdCAieCR7VU5BTUVfUkVMRUFTRX0iID0gIngiICYmIFVOQU1FX1JFTEVBU0U9MworCWNhc2UgImAvYmluL2FyY2hgIiBpbgorCSAgICBzdW4zKQorCQllY2hvIG02OGstc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCQk7OworCSAgICBzdW40KQorCQllY2hvIHNwYXJjLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwkJOzsKKwllc2FjCisJZXhpdCAwIDs7CisgICAgYXVzaHA6U3VuT1M6KjoqKQorCWVjaG8gc3BhcmMtYXVzcGV4LXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHNwYXJjKjpOZXRCU0Q6KikKKwllY2hvIGB1bmFtZSAtcGAtdW5rbm93bi1uZXRic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgYXRhcmkqOk9wZW5CU0Q6KjoqKQorCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgIyBUaGUgc2l0dWF0aW9uIGZvciBNaU5UIGlzIGEgbGl0dGxlIGNvbmZ1c2luZy4gIFRoZSBtYWNoaW5lIG5hbWUKKyAgICAjIGNhbiBiZSB2aXJ0dWFsbHkgZXZlcnl0aGluZyAoZXZlcnl0aGluZyB3aGljaCBpcyBub3QKKyAgICAjICJhdGFyaXN0IiBvciAiYXRhcmlzdGUiIGF0IGxlYXN0IHNob3VsZCBoYXZlIGEgcHJvY2Vzc29yCisgICAgIyA+IG02ODAwMCkuICBUaGUgc3lzdGVtIG5hbWUgcmFuZ2VzIGZyb20gIk1pTlQiIG92ZXIgIkZyZWVNaU5UIgorICAgICMgdG8gdGhlIGxvd2VyY2FzZSB2ZXJzaW9uICJtaW50IiAob3IgImZyZWVtaW50IikuICBGaW5hbGx5CisgICAgIyB0aGUgc3lzdGVtIG5hbWUgIlRPUyIgZGVub3RlcyBhIHN5c3RlbSB3aGljaCBpcyBhY3R1YWxseSBub3QKKyAgICAjIE1pTlQuICBCdXQgTWlOVCBpcyBkb3dud2FyZCBjb21wYXRpYmxlIHRvIFRPUywgc28gdGhpcyBzaG91bGQKKyAgICAjIGJlIG5vIHByb2JsZW0uCisgICAgYXRhcmlzdFtlXToqTWlOVDoqOiogfCBhdGFyaXN0W2VdOiptaW50Oio6KiB8IGF0YXJpc3RbZV06KlRPUzoqOiopCisgICAgICAgIGVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIGF0YXJpKjoqTWlOVDoqOiogfCBhdGFyaSo6Km1pbnQ6KjoqIHwgYXRhcmlzdFtlXToqVE9TOio6KikKKwllY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KKyAgICAgICAgZXhpdCAwIDs7CisgICAgKmZhbGNvbio6Kk1pTlQ6KjoqIHwgKmZhbGNvbio6Km1pbnQ6KjoqIHwgKmZhbGNvbio6KlRPUzoqOiopCisgICAgICAgIGVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIG1pbGFuKjoqTWlOVDoqOiogfCBtaWxhbio6Km1pbnQ6KjoqIHwgKm1pbGFuKjoqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLW1pbGFuLW1pbnQke1VOQU1FX1JFTEVBU0V9CisgICAgICAgIGV4aXQgMCA7OworICAgIGhhZGVzKjoqTWlOVDoqOiogfCBoYWRlcyo6Km1pbnQ6KjoqIHwgKmhhZGVzKjoqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLWhhZGVzLW1pbnQke1VOQU1FX1JFTEVBU0V9CisgICAgICAgIGV4aXQgMCA7OworICAgICo6Kk1pTlQ6KjoqIHwgKjoqbWludDoqOiogfCAqOipUT1M6KjoqKQorICAgICAgICBlY2hvIG02OGstdW5rbm93bi1taW50JHtVTkFNRV9SRUxFQVNFfQorICAgICAgICBleGl0IDAgOzsKKyAgICBzdW4zKjpPcGVuQlNEOio6KikKKwllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIG1hYzY4azpPcGVuQlNEOio6KikKKwllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIG12bWU2OGs6T3BlbkJTRDoqOiopCisJZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBtdm1lODhrOk9wZW5CU0Q6KjoqKQorCWVjaG8gbTg4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgcG93ZXJwYzptYWNodGVuOio6KikKKwllY2hvIHBvd2VycGMtYXBwbGUtbWFjaHRlbiR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBSSVNDKjpNYWNoOio6KikKKwllY2hvIG1pcHMtZGVjLW1hY2hfYnNkNC4zCisJZXhpdCAwIDs7CisgICAgUklTQyo6VUxUUklYOio6KikKKwllY2hvIG1pcHMtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBWQVgqOlVMVFJJWCo6KjoqKQorCWVjaG8gdmF4LWRlYy11bHRyaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgMjAyMDpDTElYOio6KiB8IDI0MzA6Q0xJWDoqOiopCisJZWNobyBjbGlwcGVyLWludGVyZ3JhcGgtY2xpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBtaXBzOio6KjpVTUlQUyB8IG1pcHM6KjoqOlJJU0NvcykKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworI2lmZGVmIF9fY3BsdXNwbHVzCisjaW5jbHVkZSA8c3RkaW8uaD4gIC8qIGZvciBwcmludGYoKSBwcm90b3R5cGUgKi8KKwlpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeworI2Vsc2UKKwlpbnQgbWFpbiAoYXJnYywgYXJndikgaW50IGFyZ2M7IGNoYXIgKmFyZ3ZbXTsgeworI2VuZGlmCisJI2lmIGRlZmluZWQgKGhvc3RfbWlwcykgJiYgZGVmaW5lZCAoTUlQU0VCKQorCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NZU1YpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzeXN2XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7CisJI2VuZGlmCisJI2lmIGRlZmluZWQgKFNZU1RZUEVfU1ZSNCkKKwkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N2cjRcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKKwkjZW5kaWYKKwkjaWYgZGVmaW5lZCAoU1lTVFlQRV9CU0Q0MykgfHwgZGVmaW5lZChTWVNUWVBFX0JTRCkKKwkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc2JzZFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOworCSNlbmRpZgorCSNlbmRpZgorCSAgZXhpdCAoLTEpOworCX0KK0VPRgorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkkQ0NfRk9SX0JVSUxEICRkdW1teS5jIC1vICRkdW1teSBcCisJICAmJiAuLyRkdW1teSBgZWNobyAiJHtVTkFNRV9SRUxFQVNFfSIgfCBzZWQgLW4gJ3MvXChbMC05XSpcKS4qL1wxL3AnYCBcCisJICAmJiBybSAtZiAkZHVtbXkuYyAkZHVtbXkgJiYgZXhpdCAwCisJcm0gLWYgJGR1bW15LmMgJGR1bW15CisJZWNobyBtaXBzLW1pcHMtcmlzY29zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIE1vdG9yb2xhOlBvd2VyTUFYX09TOio6KikKKwllY2hvIHBvd2VycGMtbW90b3JvbGEtcG93ZXJtYXgKKwlleGl0IDAgOzsKKyAgICBOaWdodF9IYXdrOlBvd2VyX1VOSVg6KjoqKQorCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJ1bml4CisJZXhpdCAwIDs7CisgICAgbTg4azpDWC9VWDo3KjoqKQorCWVjaG8gbTg4ay1oYXJyaXMtY3h1eDcKKwlleGl0IDAgOzsKKyAgICBtODhrOio6NCo6UjQqKQorCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2NAorCWV4aXQgMCA7OworICAgIG04OGs6KjozKjpSMyopCisJZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCisJZXhpdCAwIDs7CisgICAgQVZpaU9OOmRndXg6KjoqKQorICAgICAgICAjIERHL1VYIHJldHVybnMgQVZpaU9OIGZvciBhbGwgYXJjaGl0ZWN0dXJlcworICAgICAgICBVTkFNRV9QUk9DRVNTT1I9YC91c3IvYmluL3VuYW1lIC1wYAorCWlmIFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMDAgXSB8fCBbICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTEwIF0KKwl0aGVuCisJICAgIGlmIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0gbTg4a2RndXhlbGZ4IF0gfHwgXAorCSAgICAgICBbICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IHggXQorCSAgICB0aGVuCisJCWVjaG8gbTg4ay1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQorCSAgICBlbHNlCisJCWVjaG8gbTg4ay1kZy1kZ3V4YmNzJHtVTkFNRV9SRUxFQVNFfQorCSAgICBmaQorCWVsc2UKKwkgICAgZWNobyBpNTg2LWRnLWRndXgke1VOQU1FX1JFTEVBU0V9CisJZmkKKyAJZXhpdCAwIDs7CisgICAgTTg4KjpEb2xwaGluT1M6KjoqKQkjIERvbHBoaW5PUyAoU1ZSMykKKwllY2hvIG04OGstZG9scGhpbi1zeXN2MworCWV4aXQgMCA7OworICAgIE04OCo6KjpSMyo6KikKKwkjIERlbHRhIDg4ayBzeXN0ZW0gcnVubmluZyBTVlIzCisJZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCisJZXhpdCAwIDs7CisgICAgWEQ4OCo6KjoqOiopICMgVGVrdHJvbml4IFhEODggc3lzdGVtIHJ1bm5pbmcgVVRla1YgKFNWUjMpCisJZWNobyBtODhrLXRla3Ryb25peC1zeXN2MworCWV4aXQgMCA7OworICAgIFRlazQzWzAtOV1bMC05XTpVVGVrOio6KikgIyBUZWt0cm9uaXggNDMwMCBzeXN0ZW0gcnVubmluZyBVVGVrIChCU0QpCisJZWNobyBtNjhrLXRla3Ryb25peC1ic2QKKwlleGl0IDAgOzsKKyAgICAqOklSSVgqOio6KikKKwllY2hvIG1pcHMtc2dpLWlyaXhgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vZydgCisJZXhpdCAwIDs7CisgICAgPz8/Pz8/Pz86QUlYPzpbMTJdLjE6MikgICAjIEFJWCAyLjIuMSBvciBBSVggMi4xLjEgaXMgUlQvUEMgQUlYLgorCWVjaG8gcm9tcC1pYm0tYWl4ICAgICAgIyB1bmFtZSAtbSBnaXZlcyBhbiA4IGhleC1jb2RlIENQVSBpZAorCWV4aXQgMCA7OyAgICAgICAgICAgICAgIyBOb3RlIHRoYXQ6IGVjaG8gIidgdW5hbWUgLXNgJyIgZ2l2ZXMgJ0FJWCAnCisgICAgaSo4NjpBSVg6KjoqKQorCWVjaG8gaTM4Ni1pYm0tYWl4CisJZXhpdCAwIDs7CisgICAgaWE2NDpBSVg6KjoqKQorCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgorCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAorCWVsc2UKKwkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KKwlmaQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1pYm0tYWl4JHtJQk1fUkVWfQorCWV4aXQgMCA7OworICAgICo6QUlYOjI6MykKKwlpZiBncmVwIGJvczMyNSAvdXNyL2luY2x1ZGUvc3RkaW8uaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJc2VkICdzL14JCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJCSNpbmNsdWRlIDxzeXMvc3lzdGVtY2ZnLmg+CisKKwkJbWFpbigpCisJCQl7CisJCQlpZiAoIV9fcG93ZXJfcGMoKSkKKwkJCQlleGl0KDEpOworCQkJcHV0cygicG93ZXJwYy1pYm0tYWl4My4yLjUiKTsKKwkJCWV4aXQoMCk7CisJCQl9CitFT0YKKwkJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCQkkQ0NfRk9SX0JVSUxEICRkdW1teS5jIC1vICRkdW1teSAmJiAuLyRkdW1teSAmJiBybSAtZiAkZHVtbXkuYyAkZHVtbXkgJiYgZXhpdCAwCisJCXJtIC1mICRkdW1teS5jICRkdW1teQorCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjUKKwllbGlmIGdyZXAgYm9zMzI0IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjQKKwllbHNlCisJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIKKwlmaQorCWV4aXQgMCA7OworICAgICo6QUlYOio6WzQ1XSkKKwlJQk1fQ1BVX0lEPWAvdXNyL3NiaW4vbHNkZXYgLUMgLWMgcHJvY2Vzc29yIC1TIGF2YWlsYWJsZSB8IGhlYWQgLTEgfCBhd2sgJ3sgcHJpbnQgJDEgfSdgCisJaWYgL3Vzci9zYmluL2xzYXR0ciAtRWwgJHtJQk1fQ1BVX0lEfSB8IGdyZXAgJyBQT1dFUicgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCUlCTV9BUkNIPXJzNjAwMAorCWVsc2UKKwkJSUJNX0FSQ0g9cG93ZXJwYworCWZpCisJaWYgWyAteCAvdXNyL2Jpbi9vc2xldmVsIF0gOyB0aGVuCisJCUlCTV9SRVY9YC91c3IvYmluL29zbGV2ZWxgCisJZWxzZQorCQlJQk1fUkVWPSR7VU5BTUVfVkVSU0lPTn0uJHtVTkFNRV9SRUxFQVNFfQorCWZpCisJZWNobyAke0lCTV9BUkNIfS1pYm0tYWl4JHtJQk1fUkVWfQorCWV4aXQgMCA7OworICAgICo6QUlYOio6KikKKwllY2hvIHJzNjAwMC1pYm0tYWl4CisJZXhpdCAwIDs7CisgICAgaWJtcnQ6NC40QlNEOip8cm9tcC1pYm06QlNEOiopCisJZWNobyByb21wLWlibS1ic2Q0LjQKKwlleGl0IDAgOzsKKyAgICBpYm1ydDoqQlNEOip8cm9tcC1pYm06QlNEOiopICAgICAgICAgICAgIyBjb3ZlcnMgUlQvUEMgQlNEIGFuZAorCWVjaG8gcm9tcC1pYm0tYnNkJHtVTkFNRV9SRUxFQVNFfSAgICMgNC4zIHdpdGggdW5hbWUgYWRkZWQgdG8KKwlleGl0IDAgOzsgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlcG9ydDogcm9tcC1pYm0gQlNEIDQuMworICAgICo6Qk9TWDoqOiopCisJZWNobyByczYwMDAtYnVsbC1ib3N4CisJZXhpdCAwIDs7CisgICAgRFBYLzI/MDA6Qi5PLlMuOio6KikKKwllY2hvIG02OGstYnVsbC1zeXN2MworCWV4aXQgMCA7OworICAgIDkwMDAvWzM0XT8/OjQuM2JzZDoxLio6KikKKwllY2hvIG02OGstaHAtYnNkCisJZXhpdCAwIDs7CisgICAgaHAzMDA6NC40QlNEOio6KiB8IDkwMDAvWzM0XT8/OjQuM2JzZDoyLio6KikKKwllY2hvIG02OGstaHAtYnNkNC40CisJZXhpdCAwIDs7CisgICAgOTAwMC9bMzQ2NzhdPz86SFAtVVg6KjoqKQorCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAorCWNhc2UgIiR7VU5BTUVfTUFDSElORX0iIGluCisJICAgIDkwMDAvMzE/ICkgICAgICAgICAgICBIUF9BUkNIPW02ODAwMCA7OworCSAgICA5MDAwL1szNF0/PyApICAgICAgICAgSFBfQVJDSD1tNjhrIDs7CisJICAgIDkwMDAvWzY3OF1bMC05XVswLTldKQorICAgICAgICAgICAgICBjYXNlICIke0hQVVhfUkVWfSIgaW4KKyAgICAgICAgICAgICAgICAxMS5bMC05XVswLTldKQorICAgICAgICAgICAgICAgICAgaWYgWyAteCAvdXNyL2Jpbi9nZXRjb25mIF07IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgc2NfY3B1X3ZlcnNpb249YC91c3IvYmluL2dldGNvbmYgU0NfQ1BVX1ZFUlNJT04gMj4vZGV2L251bGxgCisgICAgICAgICAgICAgICAgICAgIHNjX2tlcm5lbF9iaXRzPWAvdXNyL2Jpbi9nZXRjb25mIFNDX0tFUk5FTF9CSVRTIDI+L2Rldi9udWxsYAorICAgICAgICAgICAgICAgICAgICBjYXNlICIke3NjX2NwdV92ZXJzaW9ufSIgaW4KKyAgICAgICAgICAgICAgICAgICAgICA1MjMpIEhQX0FSQ0g9ImhwcGExLjAiIDs7ICMgQ1BVX1BBX1JJU0MxXzAKKyAgICAgICAgICAgICAgICAgICAgICA1MjgpIEhQX0FSQ0g9ImhwcGExLjEiIDs7ICMgQ1BVX1BBX1JJU0MxXzEKKyAgICAgICAgICAgICAgICAgICAgICA1MzIpICAgICAgICAgICAgICAgICAgICAgICMgQ1BVX1BBX1JJU0MyXzAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIiR7c2Nfa2VybmVsX2JpdHN9IiBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAzMikgSFBfQVJDSD0iaHBwYTIuMG4iIDs7CisgICAgICAgICAgICAgICAgICAgICAgICAgIDY0KSBIUF9BUkNIPSJocHBhMi4wdyIgOzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVzYWMgOzsKKyAgICAgICAgICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgICAgICAgZmkgOzsKKyAgICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgICBpZiBbICIke0hQX0FSQ0h9IiA9ICIiIF07IHRoZW4KKyAgICAgICAgICAgICAgc2VkICdzL14gICAgICAgICAgICAgIC8vJyA8PCBFT0YgPiRkdW1teS5jCisKKyAgICAgICAgICAgICAgI2RlZmluZSBfSFBVWF9TT1VSQ0UKKyAgICAgICAgICAgICAgI2luY2x1ZGUgPHN0ZGxpYi5oPgorICAgICAgICAgICAgICAjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyAgICAgICAgICAgICAgaW50IG1haW4gKCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAjaWYgZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpCisgICAgICAgICAgICAgICAgICBsb25nIGJpdHMgPSBzeXNjb25mKF9TQ19LRVJORUxfQklUUyk7CisgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgbG9uZyBjcHUgID0gc3lzY29uZiAoX1NDX0NQVV9WRVJTSU9OKTsKKworICAgICAgICAgICAgICAgICAgc3dpdGNoIChjcHUpCisgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMCIpOyBicmVhazsKKyAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MxXzE6IHB1dHMgKCJocHBhMS4xIik7IGJyZWFrOworICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzJfMDoKKyAgICAgICAgICAgICAgI2lmIGRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKQorICAgICAgICAgICAgICAJICAgIHN3aXRjaCAoYml0cykKKyAgICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAgIAkJY2FzZSA2NDogcHV0cyAoImhwcGEyLjB3Iik7IGJyZWFrOworICAgICAgICAgICAgICAJCWNhc2UgMzI6IHB1dHMgKCJocHBhMi4wbiIpOyBicmVhazsKKyAgICAgICAgICAgICAgCQlkZWZhdWx0OiBwdXRzICgiaHBwYTIuMCIpOyBicmVhazsKKyAgICAgICAgICAgICAgCQl9IGJyZWFrOworICAgICAgICAgICAgICAjZWxzZSAgLyogIWRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKSAqLworICAgICAgICAgICAgICAJICAgIHB1dHMgKCJocHBhMi4wIik7IGJyZWFrOworICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgCWRlZmF1bHQ6IHB1dHMgKCJocHBhMS4wIik7IGJyZWFrOworICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgZXhpdCAoMCk7CisgICAgICAgICAgICAgIH0KK0VPRgorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEICRkdW1teS5jIC1vICRkdW1teSAyPi9kZXYvbnVsbCApICYmIEhQX0FSQ0g9YC4vJGR1bW15YAorCWlmIHRlc3QgLXogIiRIUF9BUkNIIjsgdGhlbiBIUF9BUkNIPWhwcGE7IGZpCisJcm0gLWYgJGR1bW15LmMgJGR1bW15CisJZmkgOzsKKwllc2FjCisJZWNobyAke0hQX0FSQ0h9LWhwLWhwdXgke0hQVVhfUkVWfQorCWV4aXQgMCA7OworICAgIGlhNjQ6SFAtVVg6KjoqKQorCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAorCWVjaG8gaWE2NC1ocC1ocHV4JHtIUFVYX1JFVn0KKwlleGl0IDAgOzsKKyAgICAzMDUwKjpISS1VWDoqOiopCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkjaW5jbHVkZSA8dW5pc3RkLmg+CisJaW50CisJbWFpbiAoKQorCXsKKwkgIGxvbmcgY3B1ID0gc3lzY29uZiAoX1NDX0NQVV9WRVJTSU9OKTsKKwkgIC8qIFRoZSBvcmRlciBtYXR0ZXJzLCBiZWNhdXNlIENQVV9JU19IUF9NQzY4SyBlcnJvbmVvdXNseSByZXR1cm5zCisJICAgICB0cnVlIGZvciBDUFVfUEFfUklTQzFfMC4gIENQVV9JU19QQV9SSVNDIHJldHVybnMgY29ycmVjdAorCSAgICAgcmVzdWx0cywgaG93ZXZlci4gICovCisJICBpZiAoQ1BVX0lTX1BBX1JJU0MgKGNwdSkpCisJICAgIHsKKwkgICAgICBzd2l0Y2ggKGNwdSkKKwkJeworCQkgIGNhc2UgQ1BVX1BBX1JJU0MxXzA6IHB1dHMgKCJocHBhMS4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJICBjYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCSAgY2FzZSBDUFVfUEFfUklTQzJfMDogcHV0cyAoImhwcGEyLjAtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQkgIGRlZmF1bHQ6IHB1dHMgKCJocHBhLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJfQorCSAgICB9CisJICBlbHNlIGlmIChDUFVfSVNfSFBfTUM2OEsgKGNwdSkpCisJICAgIHB1dHMgKCJtNjhrLWhpdGFjaGktaGl1eHdlMiIpOworCSAgZWxzZSBwdXRzICgidW5rbm93bi1oaXRhY2hpLWhpdXh3ZTIiKTsKKwkgIGV4aXQgKDApOworCX0KK0VPRgorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkkQ0NfRk9SX0JVSUxEICRkdW1teS5jIC1vICRkdW1teSAmJiAuLyRkdW1teSAmJiBybSAtZiAkZHVtbXkuYyAkZHVtbXkgJiYgZXhpdCAwCisJcm0gLWYgJGR1bW15LmMgJGR1bW15CisJZWNobyB1bmtub3duLWhpdGFjaGktaGl1eHdlMgorCWV4aXQgMCA7OworICAgIDkwMDAvNz8/OjQuM2JzZDoqOiogfCA5MDAwLzg/Wzc5XTo0LjNic2Q6KjoqICkKKwllY2hvIGhwcGExLjEtaHAtYnNkCisJZXhpdCAwIDs7CisgICAgOTAwMC84Pz86NC4zYnNkOio6KikKKwllY2hvIGhwcGExLjAtaHAtYnNkCisJZXhpdCAwIDs7CisgICAgKjk/Pyo6TVBFL2lYOio6KiB8ICozMDAwKjpNUEUvaVg6KjoqKQorCWVjaG8gaHBwYTEuMC1ocC1tcGVpeAorCWV4aXQgMCA7OworICAgIGhwNz8/Ok9TRjE6KjoqIHwgaHA4P1s3OV06T1NGMToqOiogKQorCWVjaG8gaHBwYTEuMS1ocC1vc2YKKwlleGl0IDAgOzsKKyAgICBocDg/PzpPU0YxOio6KikKKwllY2hvIGhwcGExLjAtaHAtb3NmCisJZXhpdCAwIDs7CisgICAgaSo4NjpPU0YxOio6KikKKwlpZiBbIC14IC91c3Ivc2Jpbi9zeXN2ZXJzaW9uIF0gOyB0aGVuCisJICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjFtaworCWVsc2UKKwkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMQorCWZpCisJZXhpdCAwIDs7CisgICAgcGFyaXNjKjpMaXRlcyo6KjoqKQorCWVjaG8gaHBwYTEuMS1ocC1saXRlcworCWV4aXQgMCA7OworICAgIGhwcGEqOk9wZW5CU0Q6KjoqKQorCWVjaG8gaHBwYS11bmtub3duLW9wZW5ic2QKKwlleGl0IDAgOzsKKyAgICBDMSo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMxKjoqKQorCWVjaG8gYzEtY29udmV4LWJzZAorICAgICAgICBleGl0IDAgOzsKKyAgICBDMio6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMyKjoqKQorCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYworCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAorCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCisJZmkKKyAgICAgICAgZXhpdCAwIDs7CisgICAgQzM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM0KjoqKQorCWVjaG8gYzM0LWNvbnZleC1ic2QKKyAgICAgICAgZXhpdCAwIDs7CisgICAgQzM4KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM4KjoqKQorCWVjaG8gYzM4LWNvbnZleC1ic2QKKyAgICAgICAgZXhpdCAwIDs7CisgICAgQzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDNCo6KikKKwllY2hvIGM0LWNvbnZleC1ic2QKKyAgICAgICAgZXhpdCAwIDs7CisgICAgQ1JBWSpYLU1QOio6KjoqKQorCWVjaG8geG1wLWNyYXktdW5pY29zCisgICAgICAgIGV4aXQgMCA7OworICAgIENSQVkqWS1NUDoqOio6KikKKwllY2hvIHltcC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgMCA7OworICAgIENSQVkqW0EtWl05MDoqOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IFwKKwl8IHNlZCAtZSAncy9DUkFZLipcKFtBLVpdOTBcKS9cMS8nIFwKKwkgICAgICAtZSB5L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaL2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LyBcCisJICAgICAgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgMCA7OworICAgIENSQVkqVFM6KjoqOiopCisJZWNobyB0OTAtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDAgOzsKKyAgICBDUkFZKlQzRDoqOio6KikKKwllY2hvIGFscGhhLWNyYXktdW5pY29zbWske1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDAgOzsKKyAgICBDUkFZKlQzRToqOio6KikKKwllY2hvIGFscGhhZXY1LWNyYXktdW5pY29zbWske1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDAgOzsKKyAgICBDUkFZKlNWMToqOio6KikKKwllY2hvIHN2MS1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgMCA7OworICAgIENSQVktMjoqOio6KikKKwllY2hvIGNyYXkyLWNyYXktdW5pY29zCisgICAgICAgIGV4aXQgMCA7OworICAgIEYzMFswMV06VU5JWF9TeXN0ZW1fVjoqOiogfCBGNzAwOlVOSVhfU3lzdGVtX1Y6KjoqKQorCUZVSklUU1VfUFJPQz1gdW5hbWUgLW0gfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgICAgICAgIEZVSklUU1VfU1lTPWB1bmFtZSAtcCB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy9cLy8vJ2AKKyAgICAgICAgRlVKSVRTVV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy8gL18vJ2AKKyAgICAgICAgZWNobyAiJHtGVUpJVFNVX1BST0N9LWZ1aml0c3UtJHtGVUpJVFNVX1NZU30ke0ZVSklUU1VfUkVMfSIKKyAgICAgICAgZXhpdCAwIDs7CisgICAgaHAzMDA6T3BlbkJTRDoqOiopCisJZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBpKjg2OkJTRC8zODY6KjoqIHwgaSo4NjpCU0QvT1M6KjoqIHwgKjpBc2NlbmRcIEVtYmVkZGVkL09TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtYnNkaSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBzcGFyYyo6QlNEL09TOio6KikKKwllY2hvIHNwYXJjLXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICAqOkJTRC9PUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICAqOkZyZWVCU0Q6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWZyZWVic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgCisJZXhpdCAwIDs7CisgICAgKjpPcGVuQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vcGVuYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qL1wuLydgCisJZXhpdCAwIDs7CisgICAgaSo6Q1lHV0lOKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1jeWd3aW4KKwlleGl0IDAgOzsKKyAgICBpKjpNSU5HVyo6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbWluZ3czMgorCWV4aXQgMCA7OworICAgIGkqOlBXKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1wdzMyCisJZXhpdCAwIDs7CisgICAgaSo6V2luZG93c19OVCo6KiB8IFBlbnRpdW0qOldpbmRvd3NfTlQqOiopCisJIyBIb3cgZG8gd2Uga25vdyBpdCdzIEludGVyaXggcmF0aGVyIHRoYW4gdGhlIGdlbmVyaWMgUE9TSVggc3Vic3lzdGVtPworCSMgSXQgYWxzbyBjb25mbGljdHMgd2l0aCBwcmUtMi4wIHZlcnNpb25zIG9mIEFUJlQgVVdJTi4gU2hvdWxkIHdlCisJIyBVTkFNRV9NQUNISU5FIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YgdW5hbWUgaW5zdGVhZCBvZiBpMzg2PworCWVjaG8gaTM4Ni1wYy1pbnRlcml4CisJZXhpdCAwIDs7CisgICAgaSo6VVdJTio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtdXdpbgorCWV4aXQgMCA7OworICAgIHAqOkNZR1dJTio6KikKKwllY2hvIHBvd2VycGNsZS11bmtub3duLWN5Z3dpbgorCWV4aXQgMCA7OworICAgIHByZXAqOlN1bk9TOjUuKjoqKQorCWVjaG8gcG93ZXJwY2xlLXVua25vd24tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDAgOzsKKyAgICAqOkdOVToqOiopCisJZWNobyBgZWNobyAke1VOQU1FX01BQ0hJTkV9fHNlZCAtZSAncyxbLS9dLiokLCwnYC11bmtub3duLWdudWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLC8uKiQsLCdgCisJZXhpdCAwIDs7CisgICAgaSo4NjpNaW5peDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1pbml4CisJZXhpdCAwIDs7CisgICAgYXJtKjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LSR7VkVORE9SfS1saW51eAorCWV4aXQgMCA7OworICAgIGlhNjQ6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS0ke1ZFTkRPUn0tbGludXgKKwlleGl0IDAgOzsKKyAgICBtNjgqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tJHtWRU5ET1J9LWxpbnV4CisJZXhpdCAwIDs7CisgICAgbWlwczpMaW51eDoqOiopCisJY2FzZSBgc2VkIC1uICcvXmJ5dGUvcy9eLio6IFwoLipcKSBlbmRpYW4vXDEvcCcgPCAvcHJvYy9jcHVpbmZvYCBpbgorCSAgYmlnKSAgICBlY2hvIG1pcHMtJHtWRU5ET1J9LWxpbnV4ICYmIGV4aXQgMCA7OworCSAgbGl0dGxlKSBlY2hvIG1pcHNlbC0ke1ZFTkRPUn0tbGludXggJiYgZXhpdCAwIDs7CisJZXNhYworCWNhc2UgYHNlZCAtbiAnL15zeXN0ZW0gdHlwZS9zL14uKjogXChbXiBdKlwpLiovXDEvcCcgPCAvcHJvYy9jcHVpbmZvYCBpbgorCSAgU0dJfHNnaSkgICAgZWNobyBtaXBzLSR7VkVORE9SfS1saW51eC1nbnUgJiYgZXhpdCAwIDs7CisJZXNhYworCTs7CisgICAgcHBjOkxpbnV4Oio6KnxwcGM2NDpMaW51eDoqOiopCisJZWNobyBwb3dlcnBjLSR7VkVORE9SfS1saW51eAorCWV4aXQgMCA7OworICAgIHBwYzY0OkxpbnV4Oio6KikKKwllY2hvIHBvd2VycGM2NC11bmtub3duLWxpbnV4LWdudQorCWV4aXQgMCA7OworICAgIGFscGhhOkxpbnV4Oio6KikKKwljYXNlIGBzZWQgLW4gJy9eY3B1IG1vZGVsL3MvXi4qOiBcKC4qXCkvXDEvcCcgPCAvcHJvYy9jcHVpbmZvYCBpbgorCSAgRVY1KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjUgOzsKKwkgIEVWNTYpICBVTkFNRV9NQUNISU5FPWFscGhhZXY1NiA7OworCSAgUENBNTYpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OworCSAgUENBNTcpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OworCSAgRVY2KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjYgOzsKKwkgIEVWNjcpICBVTkFNRV9NQUNISU5FPWFscGhhZXY2NyA7OworCSAgRVY2OCopIFVOQU1FX01BQ0hJTkU9YWxwaGFldjY4IDs7CisgICAgICAgIGVzYWMKKwlvYmpkdW1wIC0tcHJpdmF0ZS1oZWFkZXJzIC9iaW4vc2ggfCBncmVwIGxkLnNvLjEgPi9kZXYvbnVsbAorCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuIExJQkM9ImxpYmMxIiA7IGVsc2UgTElCQz0iIiA7IGZpCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LSR7VkVORE9SfS1saW51eCR7TElCQ30KKwlleGl0IDAgOzsKKyAgICBwYXJpc2M6TGludXg6KjoqIHwgaHBwYTpMaW51eDoqOiopCisJIyBMb29rIGZvciBDUFUgbGV2ZWwKKwljYXNlIGBncmVwICdeY3B1W15hLXpdKjonIC9wcm9jL2NwdWluZm8gMj4vZGV2L251bGwgfCBjdXQgLWQnICcgLWYyYCBpbgorCSAgUEE3KikgZWNobyBocHBhMS4xLSR7VkVORE9SfS1saW51eCA7OworCSAgUEE4KikgZWNobyBocHBhMi4wLSR7VkVORE9SfS1saW51eCA7OworCSAgKikgICAgZWNobyBocHBhLSR7VkVORE9SfS1saW51eCA7OworCWVzYWMKKwlleGl0IDAgOzsKKyAgICBwYXJpc2M2NDpMaW51eDoqOiogfCBocHBhNjQ6TGludXg6KjoqKQorCWVjaG8gaHBwYTY0LSR7VkVORE9SfS1saW51eAorCWV4aXQgMCA7OworICAgIHMzOTA6TGludXg6KjoqIHwgczM5MHg6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1pYm0tbGludXgKKwlleGl0IDAgOzsKKyAgICBzaCo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS0ke1ZFTkRPUn0tbGludXgKKwlleGl0IDAgOzsKKyAgICBzcGFyYzpMaW51eDoqOiogfCBzcGFyYzY0OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tJHtWRU5ET1J9LWxpbnV4CisJZXhpdCAwIDs7CisgICAgeDg2XzY0OkxpbnV4Oio6KikKKwllY2hvIHg4Nl82NC0ke1ZFTkRPUn0tbGludXgKKwlleGl0IDAgOzsKKyAgICBpKjg2OkxpbnV4Oio6KikKKwkjIFRoZSBCRkQgbGlua2VyIGtub3dzIHdoYXQgdGhlIGRlZmF1bHQgb2JqZWN0IGZpbGUgZm9ybWF0IGlzLCBzbworCSMgZmlyc3Qgc2VlIGlmIGl0IHdpbGwgdGVsbCB1cy4gY2QgdG8gdGhlIHJvb3QgZGlyZWN0b3J5IHRvIHByZXZlbnQKKwkjIHByb2JsZW1zIHdpdGggb3RoZXIgcHJvZ3JhbXMgb3IgZGlyZWN0b3JpZXMgY2FsbGVkIGBsZCcgaW4gdGhlIHBhdGguCisJbGRfc3VwcG9ydGVkX3RhcmdldHM9YGNkIC87IGxkIC0taGVscCAyPiYxIFwKKwkJCSB8IHNlZCAtbmUgJy9zdXBwb3J0ZWQgdGFyZ2V0czovIWQKKwkJCQkgICAgcy9bIAldWyAJXSovIC9nCisJCQkJICAgIHMvLipzdXBwb3J0ZWQgdGFyZ2V0czogKi8vCisJCQkJICAgIHMvIC4qLy8KKwkJCQkgICAgcCdgCisgICAgICAgIGNhc2UgIiRsZF9zdXBwb3J0ZWRfdGFyZ2V0cyIgaW4KKwkgIGVsZjMyLWkzODYpCisJCVRFTlRBVElWRT0iJHtVTkFNRV9NQUNISU5FfS0ke1ZFTkRPUn0tbGludXgiCisJCTs7CisJICBhLm91dC1pMzg2LWxpbnV4KQorCQllY2hvICIke1VOQU1FX01BQ0hJTkV9LSR7VkVORE9SfS1saW51eGFvdXQiCisJCWV4aXQgMCA7OwkJCisJICBjb2ZmLWkzODYpCisJCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tJHtWRU5ET1J9LWxpbnV4Y29mZiIKKwkJZXhpdCAwIDs7CisJICAiIikKKwkJIyBFaXRoZXIgYSBwcmUtQkZEIGEub3V0IGxpbmtlciAobGludXhvbGRsZCkgb3IKKwkJIyBvbmUgdGhhdCBkb2VzIG5vdCBnaXZlIHVzIHVzZWZ1bCAtLWhlbHAuCisJCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tJHtWRU5ET1J9LWxpbnV4b2xkbGQiCisJCWV4aXQgMCA7OworCWVzYWMKKwkjIERldGVybWluZSB3aGV0aGVyIHRoZSBkZWZhdWx0IGNvbXBpbGVyIGlzIGEub3V0IG9yIGVsZgorCWNhdCA+JGR1bW15LmMgPDxFT0YKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2lmZGVmIF9fY3BsdXNwbHVzCisjaW5jbHVkZSA8c3RkaW8uaD4gIC8qIGZvciBwcmludGYoKSBwcm90b3R5cGUgKi8KKwlpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeworI2Vsc2UKKwlpbnQgbWFpbiAoYXJnYywgYXJndikgaW50IGFyZ2M7IGNoYXIgKmFyZ3ZbXTsgeworI2VuZGlmCisjaWZkZWYgX19FTEZfXworIyBpZmRlZiBfX0dMSUJDX18KKyMgIGlmIF9fR0xJQkNfXyA+PSAyCisgICAgcHJpbnRmICgiJXMtJHtWRU5ET1J9LWxpbnV4XG4iLCBhcmd2WzFdKTsKKyMgIGVsc2UKKyAgICBwcmludGYgKCIlcy0ke1ZFTkRPUn0tbGludXhsaWJjMVxuIiwgYXJndlsxXSk7CisjICBlbmRpZgorIyBlbHNlCisgICBwcmludGYgKCIlcy0ke1ZFTkRPUn0tbGludXhsaWJjMVxuIiwgYXJndlsxXSk7CisjIGVuZGlmCisjZWxzZQorICBwcmludGYgKCIlcy0ke1ZFTkRPUn0tbGludXhhb3V0XG4iLCBhcmd2WzFdKTsKKyNlbmRpZgorICByZXR1cm4gMDsKK30KK0VPRgorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkkQ0NfRk9SX0JVSUxEICRkdW1teS5jIC1vICRkdW1teSAyPi9kZXYvbnVsbCAmJiAuLyRkdW1teSAiJHtVTkFNRV9NQUNISU5FfSIgJiYgcm0gLWYgJGR1bW15LmMgJGR1bW15ICYmIGV4aXQgMAorCXJtIC1mICRkdW1teS5jICRkdW1teQorCXRlc3QgeCIke1RFTlRBVElWRX0iICE9IHggJiYgZWNobyAiJHtURU5UQVRJVkV9IiAmJiBleGl0IDAKKwk7OworICAgIGkqODY6RFlOSVgvcHR4OjQqOiopCisJIyBwdHggNC4wIGRvZXMgdW5hbWUgLXMgY29ycmVjdGx5LCB3aXRoIERZTklYL3B0eCBpbiB0aGVyZS4KKwkjIGVhcmxpZXIgdmVyc2lvbnMgYXJlIG1lc3NlZCB1cCBhbmQgcHV0IHRoZSBub2RlbmFtZSBpbiBib3RoCisJIyBzeXNuYW1lIGFuZCBub2RlbmFtZS4KKwllY2hvIGkzODYtc2VxdWVudC1zeXN2NAorCWV4aXQgMCA7OworICAgIGkqODY6VU5JWF9TVjo0LjJNUDoyLiopCisgICAgICAgICMgVW5peHdhcmUgaXMgYW4gb2Zmc2hvb3Qgb2YgU1ZSNCwgYnV0IGl0IGhhcyBpdHMgb3duIHZlcnNpb24KKyAgICAgICAgIyBudW1iZXIgc2VyaWVzIHN0YXJ0aW5nIHdpdGggMi4uLgorICAgICAgICAjIEkgYW0gbm90IHBvc2l0aXZlIHRoYXQgb3RoZXIgU1ZSNCBzeXN0ZW1zIHdvbid0IG1hdGNoIHRoaXMsCisJIyBJIGp1c3QgaGF2ZSB0byBob3BlLiAgLS0gcm1zLgorICAgICAgICAjIFVzZSBzeXN2NC4ydXcuLi4gc28gdGhhdCBzeXN2NCogbWF0Y2hlcyBpdC4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjQuMnV3JHtVTkFNRV9WRVJTSU9OfQorCWV4aXQgMCA7OworICAgIGkqODY6Kjo0Lio6KiB8IGkqODY6U1lTVEVNX1Y6NC4qOiopCisJVU5BTUVfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgJ3MvXC9NUCQvLydgCisJaWYgZ3JlcCBOb3ZlbGwgL3Vzci9pbmNsdWRlL2xpbmsuaCA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bml2ZWwtc3lzdiR7VU5BTUVfUkVMfQorCWVsc2UKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Yke1VOQU1FX1JFTH0KKwlmaQorCWV4aXQgMCA7OworICAgIGkqODY6Kjo1Ols3OF0qKQorCWNhc2UgYC9iaW4vdW5hbWUgLVggfCBncmVwICJeTWFjaGluZSJgIGluCisJICAgICo0ODYqKQkgICAgIFVOQU1FX01BQ0hJTkU9aTQ4NiA7OworCSAgICAqUGVudGl1bSkJICAgICBVTkFNRV9NQUNISU5FPWk1ODYgOzsKKwkgICAgKlBlbnQqfCpDZWxlcm9uKSBVTkFNRV9NQUNISU5FPWk2ODYgOzsKKwllc2FjCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0ke1VOQU1FX1NZU1RFTX0ke1VOQU1FX1ZFUlNJT059CisJZXhpdCAwIDs7CisgICAgaSo4NjoqOjMuMjoqKQorCWlmIHRlc3QgLWYgL3Vzci9vcHRpb25zL2NiLm5hbWU7IHRoZW4KKwkJVU5BTUVfUkVMPWBzZWQgLW4gJ3MvLipWZXJzaW9uIC8vcCcgPC91c3Ivb3B0aW9ucy9jYi5uYW1lYAorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtaXNjJFVOQU1FX1JFTAorCWVsaWYgL2Jpbi91bmFtZSAtWCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgorCQlVTkFNRV9SRUw9YCgvYmluL3VuYW1lIC1YfGVncmVwIFJlbGVhc2V8c2VkIC1lICdzLy4qPSAvLycpYAorCQkoL2Jpbi91bmFtZSAtWHxlZ3JlcCBpODA0ODYgPi9kZXYvbnVsbCkgJiYgVU5BTUVfTUFDSElORT1pNDg2CisJCSgvYmluL3VuYW1lIC1YfGVncmVwICdeTWFjaGluZS4qUGVudGl1bScgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNTg2CisJCSgvYmluL3VuYW1lIC1YfGVncmVwICdeTWFjaGluZS4qUGVudCA/SUknID4vZGV2L251bGwpIFwKKwkJCSYmIFVOQU1FX01BQ0hJTkU9aTY4NgorCQkoL2Jpbi91bmFtZSAtWHxlZ3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0gUHJvJyA+L2Rldi9udWxsKSBcCisJCQkmJiBVTkFNRV9NQUNISU5FPWk2ODYKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXNjbyRVTkFNRV9SRUwKKwllbHNlCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2MzIKKwlmaQorCWV4aXQgMCA7OworICAgIGkqODY6KkRPUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1zZG9zZGpncHAKKwlleGl0IDAgOzsKKyAgICBwYzoqOio6KikKKwkjIExlZnQgaGVyZSBmb3IgY29tcGF0aWJpbGl0eToKKyAgICAgICAgIyB1bmFtZSAtbSBwcmludHMgZm9yIERKR1BQIGFsd2F5cyAncGMnLCBidXQgaXQgcHJpbnRzIG5vdGhpbmcgYWJvdXQKKyAgICAgICAgIyB0aGUgcHJvY2Vzc29yLCBzbyB3ZSBwbGF5IHNhZmUgYnkgYXNzdW1pbmcgaTM4Ni4KKwllY2hvIGkzODYtcGMtbXNkb3NkamdwcAorICAgICAgICBleGl0IDAgOzsKKyAgICBJbnRlbDpNYWNoOjMqOiopCisJZWNobyBpMzg2LXBjLW1hY2gzCisJZXhpdCAwIDs7CisgICAgcGFyYWdvbjoqOio6KikKKwllY2hvIGk4NjAtaW50ZWwtb3NmMQorCWV4aXQgMCA7OworICAgIGk4NjA6Kjo0Lio6KikgIyBpODYwLVNWUjQKKwlpZiBncmVwIFN0YXJkZW50IC91c3IvaW5jbHVkZS9zeXMvdWFkbWluLmggPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorCSAgZWNobyBpODYwLXN0YXJkZW50LXN5c3Yke1VOQU1FX1JFTEVBU0V9ICMgU3RhcmRlbnQgVmlzdHJhIGk4NjAtU1ZSNAorCWVsc2UgIyBBZGQgb3RoZXIgaTg2MC1TVlI0IHZlbmRvcnMgYmVsb3cgYXMgdGhleSBhcmUgZGlzY292ZXJlZC4KKwkgIGVjaG8gaTg2MC11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9ICAjIFVua25vd24gaTg2MC1TVlI0CisJZmkKKwlleGl0IDAgOzsKKyAgICBtaW5pKjpDVElYOlNZUyo1OiopCisJIyAibWluaWZyYW1lIgorCWVjaG8gbTY4MDEwLWNvbnZlcmdlbnQtc3lzdgorCWV4aXQgMCA7OworICAgIE02OCo6KjpSM1ZbNTY3XSo6KikKKwl0ZXN0IC1yIC9zeXNWNjggJiYgZWNobyAnbTY4ay1tb3Rvcm9sYS1zeXN2JyAmJiBleGl0IDAgOzsKKyAgICAzWzM0XT8/Oio6NC4wOjMuMCB8IDNbMzRdPz9BOio6NC4wOjMuMCB8IDNbMzRdPz8sKjoqOjQuMDozLjAgfCA0ODUwOio6NC4wOjMuMCkKKwlPU19SRUw9JycKKwl0ZXN0IC1yIC9ldGMvLnJlbGlkIFwKKwkmJiBPU19SRUw9LmBzZWQgLW4gJ3MvW14gXSogW14gXSogXChbMC05XVswLTldXCkuKi9cMS9wJyA8IC9ldGMvLnJlbGlkYAorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAorCSAgJiYgZWNobyBpNDg2LW5jci1zeXN2NC4zJHtPU19SRUx9ICYmIGV4aXQgMAorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgZW50aXVtID4vZGV2L251bGwgXAorCSAgJiYgZWNobyBpNTg2LW5jci1zeXN2NC4zJHtPU19SRUx9ICYmIGV4aXQgMCA7OworICAgIDNbMzRdPz86Kjo0LjA6KiB8IDNbMzRdPz8sKjoqOjQuMDoqKQorICAgICAgICAvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKKyAgICAgICAgICAmJiBlY2hvIGk0ODYtbmNyLXN5c3Y0ICYmIGV4aXQgMCA7OworICAgIG02OCo6THlueE9TOjIuKjoqIHwgbTY4KjpMeW54T1M6My4wKjoqKQorCWVjaG8gbTY4ay11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBtYzY4MDMwOlVOSVhfU3lzdGVtX1Y6NC4qOiopCisJZWNobyBtNjhrLWF0YXJpLXN5c3Y0CisJZXhpdCAwIDs7CisgICAgaSo4NjpMeW54T1M6Mi4qOiogfCBpKjg2Okx5bnhPUzozLlswMV0qOiogfCBpKjg2Okx5bnhPUzo0LjAqOiopCisJZWNobyBpMzg2LXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIFRTVU5BTUk6THlueE9TOjIuKjoqKQorCWVjaG8gc3BhcmMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgcnM2MDAwOkx5bnhPUzoyLio6KikKKwllY2hvIHJzNjAwMC11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBQb3dlclBDOkx5bnhPUzoyLio6KiB8IFBvd2VyUEM6THlueE9TOjMuWzAxXSo6KiB8IFBvd2VyUEM6THlueE9TOjQuMCo6KikKKwllY2hvIHBvd2VycGMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgU01bQkVdUzpVTklYX1NWOio6KikKKwllY2hvIG1pcHMtZGRlLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgUk0qOlJlbGlhbnRVTklYLSo6KjoqKQorCWVjaG8gbWlwcy1zbmktc3lzdjQKKwlleGl0IDAgOzsKKyAgICBSTSo6U0lOSVgtKjoqOiopCisJZWNobyBtaXBzLXNuaS1zeXN2NAorCWV4aXQgMCA7OworICAgICo6U0lOSVgtKjoqOiopCisJaWYgdW5hbWUgLXAgMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KKwkJVU5BTUVfTUFDSElORT1gKHVuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXNuaS1zeXN2NAorCWVsc2UKKwkJZWNobyBuczMyay1zbmktc3lzdgorCWZpCisJZXhpdCAwIDs7CisgICAgUEVOVElVTToqOjQuMCo6KikgIyBVbmlzeXMgYENsZWFyUGF0aCBITVAgSVggNDAwMCcgU1ZSNC9NUCBlZmZvcnQKKyAgICAgICAgICAgICAgICAgICAgICAjIHNheXMgPFJpY2hhcmQuTS5CYXJ0ZWxAY2NNYWlsLkNlbnN1cy5HT1Y+CisgICAgICAgIGVjaG8gaTU4Ni11bmlzeXMtc3lzdjQKKyAgICAgICAgZXhpdCAwIDs7CisgICAgKjpVTklYX1N5c3RlbV9WOjQqOkZUWCopCisJIyBGcm9tIEdlcmFsZCBIZXdlcyA8aGV3ZXNAb3Blbm1hcmtldC5jb20+LgorCSMgSG93IGFib3V0IGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHN0cmF0dXMgYXJjaGl0ZWN0dXJlcz8gLWRqbQorCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXN5c3Y0CisJZXhpdCAwIDs7CisgICAgKjoqOio6RlRYKikKKwkjIEZyb20gc2VhbmZAc3dkYy5zdHJhdHVzLmNvbS4KKwllY2hvIGk4NjAtc3RyYXR1cy1zeXN2NAorCWV4aXQgMCA7OworICAgICo6Vk9TOio6KikKKwkjIEZyb20gUGF1bC5HcmVlbkBzdHJhdHVzLmNvbS4KKwllY2hvIGhwcGExLjEtc3RyYXR1cy12b3MKKwlleGl0IDAgOzsKKyAgICBtYzY4KjpBL1VYOio6KikKKwllY2hvIG02OGstYXBwbGUtYXV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIG5ld3MqOk5FV1MtT1M6Nio6KikKKwllY2hvIG1pcHMtc29ueS1uZXdzb3M2CisJZXhpdCAwIDs7CisgICAgUlszNF0wMDA6KlN5c3RlbV9WKjoqOiogfCBSNDAwMDpVTklYX1NZU1Y6KjoqIHwgUiowMDA6VU5JWF9TVjoqOiopCisJaWYgWyAtZCAvdXNyL25lYyBdOyB0aGVuCisJICAgICAgICBlY2hvIG1pcHMtbmVjLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZWxzZQorCSAgICAgICAgZWNobyBtaXBzLXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0KKwlmaQorICAgICAgICBleGl0IDAgOzsKKyAgICBCZUJveDpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gaGFyZHdhcmUgbWFkZSBieSBCZSwgUFBDIG9ubHkuCisJZWNobyBwb3dlcnBjLWJlLWJlb3MKKwlleGl0IDAgOzsKKyAgICBCZU1hYzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gTWFjIG9yIE1hYyBjbG9uZSwgUFBDIG9ubHkuCisJZWNobyBwb3dlcnBjLWFwcGxlLWJlb3MKKwlleGl0IDAgOzsKKyAgICBCZVBDOkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBJbnRlbCBQQyBjb21wYXRpYmxlLgorCWVjaG8gaTU4Ni1wYy1iZW9zCisJZXhpdCAwIDs7CisgICAgU1gtNDpTVVBFUi1VWDoqOiopCisJZWNobyBzeDQtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgU1gtNTpTVVBFUi1VWDoqOiopCisJZWNobyBzeDUtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgUG93ZXIqOlJoYXBzb2R5Oio6KikKKwllY2hvIHBvd2VycGMtYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgKjpSaGFwc29keToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWFwcGxlLXJoYXBzb2R5JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgICo6RGFyd2luOio6KikKKwllY2hvIGB1bmFtZSAtcGAtYXBwbGUtZGFyd2luJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgICo6cHJvY250byo6KjoqIHwgKjpRTlg6WzAxMjM0NTY3ODldKjoqKQorCWlmIHRlc3QgIiR7VU5BTUVfTUFDSElORX0iID0gIng4NnBjIjsgdGhlbgorCQlVTkFNRV9NQUNISU5FPXBjCisJZmkKKwllY2hvIGB1bmFtZSAtcGAtJHtVTkFNRV9NQUNISU5FfS1udG8tcW54CisJZXhpdCAwIDs7CisgICAgKjpRTlg6Kjo0KikKKwllY2hvIGkzODYtcGMtcW54CisJZXhpdCAwIDs7CisgICAgTlNSLVtLV106Tk9OU1RPUF9LRVJORUw6KjoqKQorCWVjaG8gbnNyLXRhbmRlbS1uc2ske1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgKjpOb25TdG9wLVVYOio6KikKKwllY2hvIG1pcHMtY29tcGFxLW5vbnN0b3B1eAorCWV4aXQgMCA7OworICAgIEJTMjAwMDpQT1NJWCo6KjoqKQorCWVjaG8gYnMyMDAwLXNpZW1lbnMtc3lzdgorCWV4aXQgMCA7OworICAgIERTLyo6VU5JWF9TeXN0ZW1fVjoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LSR7VU5BTUVfU1lTVEVNfS0ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgKjpQbGFuOToqOiopCisJIyAidW5hbWUgLW0iIGlzIG5vdCBjb25zaXN0ZW50LCBzbyB1c2UgJGNwdXR5cGUgaW5zdGVhZC4gMzg2CisJIyBpcyBjb252ZXJ0ZWQgdG8gaTM4NiBmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlciB4ODYKKwkjIG9wZXJhdGluZyBzeXN0ZW1zLgorCWlmIHRlc3QgIiRjcHV0eXBlIiA9ICIzODYiOyB0aGVuCisJICAgIFVOQU1FX01BQ0hJTkU9aTM4NgorCWVsc2UKKwkgICAgVU5BTUVfTUFDSElORT0iJGNwdXR5cGUiCisJZmkKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1wbGFuOQorCWV4aXQgMCA7OworICAgIGkqODY6T1MvMjoqOiopCisJIyBJZiB3ZSB3ZXJlIGFibGUgdG8gZmluZCBgdW5hbWUnLCB0aGVuIEVNWCBVbml4IGNvbXBhdGliaWxpdHkKKwkjIGlzIHByb2JhYmx5IGluc3RhbGxlZC4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtb3MyLWVteAorCWV4aXQgMCA7OworICAgICo6VE9QUy0xMDoqOiopCisJZWNobyBwZHAxMC11bmtub3duLXRvcHMxMAorCWV4aXQgMCA7OworICAgICo6VEVORVg6KjoqKQorCWVjaG8gcGRwMTAtdW5rbm93bi10ZW5leAorCWV4aXQgMCA7OworICAgIEtTMTA6VE9QUy0yMDoqOiogfCBLTDEwOlRPUFMtMjA6KjoqIHwgVFlQRTQ6VE9QUy0yMDoqOiopCisJZWNobyBwZHAxMC1kZWMtdG9wczIwCisJZXhpdCAwIDs7CisgICAgWEtMLTE6VE9QUy0yMDoqOiogfCBUWVBFNTpUT1BTLTIwOio6KikKKwllY2hvIHBkcDEwLXhrbC10b3BzMjAKKwlleGl0IDAgOzsKKyAgICAqOlRPUFMtMjA6KjoqKQorCWVjaG8gcGRwMTAtdW5rbm93bi10b3BzMjAKKwlleGl0IDAgOzsKKyAgICAqOklUUzoqOiopCisJZWNobyBwZHAxMC11bmtub3duLWl0cworCWV4aXQgMCA7OworICAgIGkqODY6WFRTLTMwMDoqOlNUT1ApCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc3RvcAorCWV4aXQgMCA7OworZXNhYworCisjZWNobyAnKE5vIHVuYW1lIGNvbW1hbmQgb3IgdW5hbWUgb3V0cHV0IG5vdCByZWNvZ25pemVkLiknIDE+JjIKKyNlY2hvICIke1VOQU1FX01BQ0hJTkV9OiR7VU5BTUVfU1lTVEVNfToke1VOQU1FX1JFTEVBU0V9OiR7VU5BTUVfVkVSU0lPTn0iIDE+JjIKKworY2F0ID4kZHVtbXkuYyA8PEVPRgorI2lmZGVmIF9TRVFVRU5UXworIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMgaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKyNlbmRpZgorbWFpbiAoKQoreworI2lmIGRlZmluZWQgKHNvbnkpCisjaWYgZGVmaW5lZCAoTUlQU0VCKQorICAvKiBCRkQgd2FudHMgImJzZCIgaW5zdGVhZCBvZiAibmV3c29zIi4gIFBlcmhhcHMgQkZEIHNob3VsZCBiZSBjaGFuZ2VkLAorICAgICBJIGRvbid0IGtub3cuLi4uICAqLworICBwcmludGYgKCJtaXBzLXNvbnktYnNkXG4iKTsgZXhpdCAoMCk7CisjZWxzZQorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorICBwcmludGYgKCJtNjhrLXNvbnktbmV3c29zJXNcbiIsCisjaWZkZWYgTkVXU09TNAorICAgICAgICAgICI0IgorI2Vsc2UKKwkgICIiCisjZW5kaWYKKyAgICAgICAgICk7IGV4aXQgKDApOworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fYXJtKSAmJiBkZWZpbmVkIChfX2Fjb3JuKSAmJiBkZWZpbmVkIChfX3VuaXgpCisgIHByaW50ZiAoImFybS1hY29ybi1yaXNjaXgiKTsgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKGhwMzAwKSAmJiAhZGVmaW5lZCAoaHB1eCkKKyAgcHJpbnRmICgibTY4ay1ocC1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoTmVYVCkKKyNpZiAhZGVmaW5lZCAoX19BUkNISVRFQ1RVUkVfXykKKyNkZWZpbmUgX19BUkNISVRFQ1RVUkVfXyAibTY4ayIKKyNlbmRpZgorICBpbnQgdmVyc2lvbjsKKyAgdmVyc2lvbj1gKGhvc3RpbmZvIHwgc2VkIC1uICdzLy4qTmVYVCBNYWNoIFwoWzAtOV0qXCkuKi9cMS9wJykgMj4vZGV2L251bGxgOworICBpZiAodmVyc2lvbiA8IDQpCisgICAgcHJpbnRmICgiJXMtbmV4dC1uZXh0c3RlcCVkXG4iLCBfX0FSQ0hJVEVDVFVSRV9fLCB2ZXJzaW9uKTsKKyAgZWxzZQorICAgIHByaW50ZiAoIiVzLW5leHQtb3BlbnN0ZXAlZFxuIiwgX19BUkNISVRFQ1RVUkVfXywgdmVyc2lvbik7CisgIGV4aXQgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChNVUxUSU1BWCkgfHwgZGVmaW5lZCAobjE2KQorI2lmIGRlZmluZWQgKFVNQVhWKQorICBwcmludGYgKCJuczMyay1lbmNvcmUtc3lzdlxuIik7IGV4aXQgKDApOworI2Vsc2UKKyNpZiBkZWZpbmVkIChDTVUpCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1tYWNoXG4iKTsgZXhpdCAoMCk7CisjZWxzZQorICBwcmludGYgKCJuczMyay1lbmNvcmUtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfXzM4NkJTRF9fKQorICBwcmludGYgKCJpMzg2LXBjLWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChzZXF1ZW50KQorI2lmIGRlZmluZWQgKGkzODYpCisgIHByaW50ZiAoImkzODYtc2VxdWVudC1keW5peFxuIik7IGV4aXQgKDApOworI2VuZGlmCisjaWYgZGVmaW5lZCAobnMzMjAwMCkKKyAgcHJpbnRmICgibnMzMmstc2VxdWVudC1keW5peFxuIik7IGV4aXQgKDApOworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9TRVFVRU5UXykKKyAgICBzdHJ1Y3QgdXRzbmFtZSB1bjsKKworICAgIHVuYW1lKCZ1bik7CisKKyAgICBpZiAoc3RybmNtcCh1bi52ZXJzaW9uLCAiVjIiLCAyKSA9PSAwKSB7CisJcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eDJcbiIpOyBleGl0ICgwKTsKKyAgICB9CisgICAgaWYgKHN0cm5jbXAodW4udmVyc2lvbiwgIlYxIiwgMikgPT0gMCkgeyAvKiBYWFggaXMgVjEgY29ycmVjdD8gKi8KKwlwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4MVxuIik7IGV4aXQgKDApOworICAgIH0KKyAgICBwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4XG4iKTsgZXhpdCAoMCk7CisKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAodmF4KQorIyBpZiAhZGVmaW5lZCAodWx0cml4KQorIyAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjICBpZiBkZWZpbmVkIChCU0QpCisjICAgaWYgQlNEID09IDQzCisgICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZDQuM1xuIik7IGV4aXQgKDApOworIyAgIGVsc2UKKyMgICAgaWYgQlNEID09IDE5OTAwNgorICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2Q0LjNyZW5vXG4iKTsgZXhpdCAoMCk7CisjICAgIGVsc2UKKyAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkXG4iKTsgZXhpdCAoMCk7CisjICAgIGVuZGlmCisjICAgZW5kaWYKKyMgIGVsc2UKKyAgICBwcmludGYgKCJ2YXgtZGVjLWJzZFxuIik7IGV4aXQgKDApOworIyAgZW5kaWYKKyMgZWxzZQorICAgIHByaW50ZiAoInZheC1kZWMtdWx0cml4XG4iKTsgZXhpdCAoMCk7CisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKGFsbGlhbnQpICYmIGRlZmluZWQgKGk4NjApCisgIHByaW50ZiAoImk4NjAtYWxsaWFudC1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorCisgIGV4aXQgKDEpOworfQorRU9GCisKK2V2YWwgJHNldF9jY19mb3JfYnVpbGQKKyRDQ19GT1JfQlVJTEQgJGR1bW15LmMgLW8gJGR1bW15IDI+L2Rldi9udWxsICYmIC4vJGR1bW15ICYmIHJtIC1mICRkdW1teS5jICRkdW1teSAmJiBleGl0IDAKK3JtIC1mICRkdW1teS5jICRkdW1teQorCisjIEFwb2xsb3MgcHV0IHRoZSBzeXN0ZW0gdHlwZSBpbiB0aGUgZW52aXJvbm1lbnQuCisKK3Rlc3QgLWQgL3Vzci9hcG9sbG8gJiYgeyBlY2hvICR7SVNQfS1hcG9sbG8tJHtTWVNUWVBFfTsgZXhpdCAwOyB9CisKKyMgQ29udmV4IHZlcnNpb25zIHRoYXQgcHJlZGF0ZSB1bmFtZSBjYW4gdXNlIGdldHN5c2luZm8oMSkKKworaWYgWyAteCAvdXNyL2NvbnZleC9nZXRzeXNpbmZvIF0KK3RoZW4KKyAgICBjYXNlIGBnZXRzeXNpbmZvIC1mIGNwdV90eXBlYCBpbgorICAgIGMxKikKKwllY2hvIGMxLWNvbnZleC1ic2QKKwlleGl0IDAgOzsKKyAgICBjMiopCisJaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCisJdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCisJZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKKwlmaQorCWV4aXQgMCA7OworICAgIGMzNCopCisJZWNobyBjMzQtY29udmV4LWJzZAorCWV4aXQgMCA7OworICAgIGMzOCopCisJZWNobyBjMzgtY29udmV4LWJzZAorCWV4aXQgMCA7OworICAgIGM0KikKKwllY2hvIGM0LWNvbnZleC1ic2QKKwlleGl0IDAgOzsKKyAgICBlc2FjCitmaQorCitjYXQgPiYyIDw8RU9GCiskMDogdW5hYmxlIHRvIGd1ZXNzIHN5c3RlbSB0eXBlCisKK1RoaXMgc2NyaXB0LCBsYXN0IG1vZGlmaWVkICR0aW1lc3RhbXAsIGhhcyBmYWlsZWQgdG8gcmVjb2duaXplCit0aGUgb3BlcmF0aW5nIHN5c3RlbSB5b3UgYXJlIHVzaW5nLiBJdCBpcyBhZHZpc2VkIHRoYXQgeW91Citkb3dubG9hZCB0aGUgbW9zdCB1cCB0byBkYXRlIHZlcnNpb24gb2YgdGhlIGNvbmZpZyBzY3JpcHRzIGZyb20KKworICAgIGZ0cDovL2Z0cC5nbnUub3JnL3B1Yi9nbnUvY29uZmlnLworCitJZiB0aGUgdmVyc2lvbiB5b3UgcnVuICgkMCkgaXMgYWxyZWFkeSB1cCB0byBkYXRlLCBwbGVhc2UKK3NlbmQgdGhlIGZvbGxvd2luZyBkYXRhIGFuZCBhbnkgaW5mb3JtYXRpb24geW91IHRoaW5rIG1pZ2h0IGJlCitwZXJ0aW5lbnQgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+IGluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIG5lZWRlZAoraW5mb3JtYXRpb24gdG8gaGFuZGxlIHlvdXIgc3lzdGVtLgorCitjb25maWcuZ3Vlc3MgdGltZXN0YW1wID0gJHRpbWVzdGFtcAorCit1bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKworL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKy9iaW4vdW5hbWUgLVggICAgID0gYCgvYmluL3VuYW1lIC1YKSAyPi9kZXYvbnVsbGAKKworaG9zdGluZm8gICAgICAgICAgICAgICA9IGAoaG9zdGluZm8pIDI+L2Rldi9udWxsYAorL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgCisvdXNyL2Jpbi9hcmNoIC1rICAgICAgID0gYCgvdXNyL2Jpbi9hcmNoIC1rKSAyPi9kZXYvbnVsbGAKKy9iaW4vYXJjaCAgICAgICAgICAgICAgPSBgKC9iaW4vYXJjaCkgMj4vZGV2L251bGxgCisvdXNyL2Jpbi9vc2xldmVsICAgICAgID0gYCgvdXNyL2Jpbi9vc2xldmVsKSAyPi9kZXYvbnVsbGAKKy91c3IvY29udmV4L2dldHN5c2luZm8gPSBgKC91c3IvY29udmV4L2dldHN5c2luZm8pIDI+L2Rldi9udWxsYAorCitVTkFNRV9NQUNISU5FID0gJHtVTkFNRV9NQUNISU5FfQorVU5BTUVfUkVMRUFTRSA9ICR7VU5BTUVfUkVMRUFTRX0KK1VOQU1FX1NZU1RFTSAgPSAke1VOQU1FX1NZU1RFTX0KK1VOQU1FX1ZFUlNJT04gPSAke1VOQU1FX1ZFUlNJT059CitFT0YKKworZXhpdCAxCisKKyMgTG9jYWwgdmFyaWFibGVzOgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJ0aW1lc3RhbXA9JyIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkIgorIyB0aW1lLXN0YW1wLWVuZDogIiciCisjIEVuZDoKZGlmZiAtLWdpdCBhL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9jb25maWcuaCBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wMWNiZmNhCi0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL2NvbmZpZy5oCkBAIC0wLDAgKzEsODAgQEAKKy8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgKi8KKy8qIGNvbmZpZy5oLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFycGEvaW5ldC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9BUlBBX0lORVRfSCAxCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGRsZmNuLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX0RMRkNOX0ggMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxlcnJuby5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9FUlJOT19IIDEKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBgZ2V0Y3dkJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9HRVRDV0QgMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxpbnR0eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9JTlRUWVBFU19IIDEKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bHRkbC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9MVERMX0ggMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfTUVNT1JZX0ggMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGBtZW1zZXQnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX01FTVNFVCAxCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5ldGRiLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX05FVERCX0ggMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxuZXRpbmV0L2luLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX05FVElORVRfSU5fSCAxCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGludC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVERJTlRfSCAxCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZHNvYXAyLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NURFNPQVAyX0ggMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NUUklOR1NfSCAxCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9pb2N0bC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TWVNfSU9DVExfSCAxCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zb2NrZXQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1lTX1NPQ0tFVF9IIDEKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NZU19USU1FX0ggMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfVU5JU1REX0ggMQorCisvKiBOYW1lIG9mIHBhY2thZ2UgKi8KKyNkZWZpbmUgUEFDS0FHRSAibW9kX2dzb2FwIgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICovCisjZGVmaW5lIFNURENfSEVBREVSUyAxCisKKy8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KKyNkZWZpbmUgVkVSU0lPTiAiMC4wLjUiCisKKy8qIERlZmluZSB0byBlbXB0eSBpZiBgY29uc3QnIGRvZXMgbm90IGNvbmZvcm0gdG8gQU5TSSBDLiAqLworLyogI3VuZGVmIGNvbnN0ICovCisKKy8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lcyBub3QgZGVmaW5lLiAqLworLyogI3VuZGVmIHNpemVfdCAqLwpkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL2NvbmZpZy5oLmluIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL2NvbmZpZy5oLmluCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZiNWI5N2QKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvY29uZmlnLmguaW4KQEAgLTAsMCArMSw3OSBAQAorLyogY29uZmlnLmguaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8YXJwYS9pbmV0Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfQVJQQV9JTkVUX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZGxmY24uaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9ETEZDTl9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGVycm5vLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfRVJSTk9fSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGBnZXRjd2QnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfR0VUQ1dECisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfSU5UVFlQRVNfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsdGRsLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTFRETF9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX01FTU9SWV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgYG1lbXNldCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9NRU1TRVQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmV0ZGIuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9ORVREQl9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5ldGluZXQvaW4uaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9ORVRJTkVUX0lOX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW50Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1RESU5UX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1RETElCX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3Rkc29hcDIuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVERTT0FQMl9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVFJJTkdTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1RSSU5HX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2lvY3RsLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX0lPQ1RMX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3NvY2tldC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19TT0NLRVRfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19TVEFUX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfVElNRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19UWVBFU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1VOSVNURF9ICisKKy8qIE5hbWUgb2YgcGFja2FnZSAqLworI3VuZGVmIFBBQ0tBR0UKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLworI3VuZGVmIFNURENfSEVBREVSUworCisvKiBWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlICovCisjdW5kZWYgVkVSU0lPTgorCisvKiBEZWZpbmUgdG8gZW1wdHkgaWYgYGNvbnN0JyBkb2VzIG5vdCBjb25mb3JtIHRvIEFOU0kgQy4gKi8KKyN1bmRlZiBjb25zdAorCisvKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXMgbm90IGRlZmluZS4gKi8KKyN1bmRlZiBzaXplX3QKZGlmZiAtLWdpdCBhL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9jb25maWcubG9nIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL2NvbmZpZy5sb2cKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGQyNmY4OAotLS0gL2Rldi9udWxsCisrKyBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9jb25maWcubG9nCkBAIC0wLDAgKzEsNjgwIEBACitUaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQorcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KKworSXQgd2FzIGNyZWF0ZWQgYnkgY29uZmlndXJlLCB3aGljaCB3YXMKK2dlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi41Mi4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcworCisgICQgLi9jb25maWd1cmUgCisKKyMjIC0tLS0tLS0tLS0gIyMKKyMjIFBsYXRmb3JtLiAgIyMKKyMjIC0tLS0tLS0tLS0gIyMKKworaG9zdG5hbWUgPSByZWR1eAordW5hbWUgLW0gPSBpNjg2Cit1bmFtZSAtciA9IDIuNC4xOC00R0IKK3VuYW1lIC1zID0gTGludXgKK3VuYW1lIC12ID0gIzEgV2VkIE1hciAyNyAxMzo1NzowNSBVVEMgMjAwMgorCisvdXNyL2Jpbi91bmFtZSAtcCA9IHVua25vd24KKy9iaW4vdW5hbWUgLVggICAgID0gdW5rbm93bgorCisvYmluL2FyY2ggICAgICAgICAgICAgID0gaTY4NgorL3Vzci9iaW4vYXJjaCAtayAgICAgICA9IHVua25vd24KKy91c3IvY29udmV4L2dldHN5c2luZm8gPSB1bmtub3duCitob3N0aW5mbyAgICAgICAgICAgICAgID0gdW5rbm93bgorL2Jpbi9tYWNoaW5lICAgICAgICAgICA9IHVua25vd24KKy91c3IvYmluL29zbGV2ZWwgICAgICAgPSB1bmtub3duCisvYmluL3VuaXZlcnNlICAgICAgICAgID0gdW5rbm93bgorCitQQVRIID0gL2hvbWUvYWJlcmdlci9iaW46L3Vzci9sb2NhbC9iaW46L3Vzci9iaW46L3Vzci9YMTFSNi9iaW46L2JpbjovdXNyL2dhbWVzOi9vcHQvZ25vbWUvYmluOi9vcHQva2RlMy9iaW46L29wdC9rZGUyL2Jpbjovb3B0L2tkZS9iaW46L3Vzci9vcGVud2luL2JpbjovdXNyL2xpYi9TbWFsbEVpZmZlbC9iaW46L3Vzci9saWIvamF2YS9iaW46L29wdC9nbm9tZS9iaW46L3Vzci9saWIvcXQtMi4xLjEvYmluOi91c3IvbG9jYWwvYXBhY2hlL2JpbjovdXNyL2xvY2FsL2FwYWNoZS9iaW4KKworIyMgLS0tLS0tLS0tLS0tICMjCisjIyBDb3JlIHRlc3RzLiAgIyMKKyMjIC0tLS0tLS0tLS0tLSAjIworCitjb25maWd1cmU6MTE0MzogUEFUSD0iLjsuIjsgY29uZnRlc3Quc2gKKy4vY29uZmlndXJlOiBjb25mdGVzdC5zaDogY29tbWFuZCBub3QgZm91bmQKK2NvbmZpZ3VyZToxMTQ2OiAkPyA9IDEyNworY29uZmlndXJlOjExODY6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlCitjb25maWd1cmU6MTIwNDogcmVzdWx0OiBpNjg2LXN1c2UtbGludXgKK2NvbmZpZ3VyZToxMjE0OiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlCitjb25maWd1cmU6MTIyODogcmVzdWx0OiBpNjg2LXN1c2UtbGludXgKK2NvbmZpZ3VyZToxMjM4OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUKK2NvbmZpZ3VyZToxMjUyOiByZXN1bHQ6IGk2ODYtc3VzZS1saW51eAorY29uZmlndXJlOjEyODA6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwKK2NvbmZpZ3VyZToxMzI5OiByZXN1bHQ6IC91c3IvYmluL2dpbnN0YWxsIC1jCitjb25maWd1cmU6MTM0MDogY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lCitjb25maWd1cmU6MTM4MzogcmVzdWx0OiB5ZXMKK2NvbmZpZ3VyZToxNDE2OiBjaGVja2luZyBmb3IgbWF3aworY29uZmlndXJlOjE0NDI6IHJlc3VsdDogbm8KK2NvbmZpZ3VyZToxNDE2OiBjaGVja2luZyBmb3IgZ2F3aworY29uZmlndXJlOjE0MzE6IGZvdW5kIC91c3IvYmluL2dhd2sKK2NvbmZpZ3VyZToxNDM5OiByZXN1bHQ6IGdhd2sKK2NvbmZpZ3VyZToxNDQ5OiBjaGVja2luZyB3aGV0aGVyIG1ha2Ugc2V0cyAke01BS0V9Citjb25maWd1cmU6MTQ2OTogcmVzdWx0OiB5ZXMKK2NvbmZpZ3VyZToxNTgwOiBjaGVja2luZyBmb3Igc29hcGNwcDIKK2NvbmZpZ3VyZToxNTk1OiBmb3VuZCAvdXNyL2xvY2FsL2Jpbi9zb2FwY3BwMgorY29uZmlndXJlOjE2MDM6IHJlc3VsdDogeWVzCitjb25maWd1cmU6MTY5MDogY2hlY2tpbmcgZm9yIGdjYworY29uZmlndXJlOjE3MDU6IGZvdW5kIC91c3IvYmluL2djYworY29uZmlndXJlOjE3MTM6IHJlc3VsdDogZ2NjCitjb25maWd1cmU6MTk0MTogY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgdmVyc2lvbgorY29uZmlndXJlOjE5NDQ6IGdjYyAtLXZlcnNpb24gPC9kZXYvbnVsbCA+JjUKKzIuOTUuMworY29uZmlndXJlOjE5NDc6ICQ/ID0gMAorY29uZmlndXJlOjE5NDk6IGdjYyAtdiA8L2Rldi9udWxsID4mNQorUmVhZGluZyBzcGVjcyBmcm9tIC91c3IvbGliL2djYy1saWIvaTQ4Ni1zdXNlLWxpbnV4LzIuOTUuMy9zcGVjcworZ2NjIHZlcnNpb24gMi45NS4zIDIwMDEwMzE1IChTdVNFKQorY29uZmlndXJlOjE5NTI6ICQ/ID0gMAorY29uZmlndXJlOjE5NTQ6IGdjYyAtViA8L2Rldi9udWxsID4mNQorZ2NjOiBhcmd1bWVudCB0byBgLVYnIGlzIG1pc3NpbmcKK2NvbmZpZ3VyZToxOTU3OiAkPyA9IDEKK2NvbmZpZ3VyZToxOTc3OiBjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dAorY29uZmlndXJlOjE5ODA6IGdjYyAgICBjb25mdGVzdC5jICA+JjUKK2NvbmZpZ3VyZToxOTgzOiAkPyA9IDAKK2NvbmZpZ3VyZToyMDEyOiByZXN1bHQ6IGEub3V0Citjb25maWd1cmU6MjAxNzogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3JrcworY29uZmlndXJlOjIwMjM6IC4vYS5vdXQKK2NvbmZpZ3VyZToyMDI2OiAkPyA9IDAKK2NvbmZpZ3VyZToyMDQxOiByZXN1bHQ6IHllcworY29uZmlndXJlOjIwNDg6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNvbXBpbGluZworY29uZmlndXJlOjIwNTA6IHJlc3VsdDogbm8KK2NvbmZpZ3VyZToyMDUzOiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgKK2NvbmZpZ3VyZToyMDU1OiBnY2MgLW8gY29uZnRlc3QgICAgY29uZnRlc3QuYyAgPiY1Citjb25maWd1cmU6MjA1ODogJD8gPSAwCitjb25maWd1cmU6MjA4MDogcmVzdWx0OiAKK2NvbmZpZ3VyZToyMDg2OiBjaGVja2luZyBmb3Igb2JqZWN0IHN1ZmZpeAorY29uZmlndXJlOjIxMDQ6IGdjYyAtYyAgIGNvbmZ0ZXN0LmMgPiY1Citjb25maWd1cmU6MjEwNzogJD8gPSAwCitjb25maWd1cmU6MjEyNjogcmVzdWx0OiBvCitjb25maWd1cmU6MjEzMDogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyCitjb25maWd1cmU6MjE1MTogZ2NjIC1jICAgY29uZnRlc3QuYyA+JjUKK2NvbmZpZ3VyZToyMTU0OiAkPyA9IDAKK2NvbmZpZ3VyZToyMTU3OiB0ZXN0IC1zIGNvbmZ0ZXN0Lm8KK2NvbmZpZ3VyZToyMTYwOiAkPyA9IDAKK2NvbmZpZ3VyZToyMTcyOiByZXN1bHQ6IHllcworY29uZmlndXJlOjIxNzg6IGNoZWNraW5nIHdoZXRoZXIgZ2NjIGFjY2VwdHMgLWcKK2NvbmZpZ3VyZToyMTk2OiBnY2MgLWMgLWcgIGNvbmZ0ZXN0LmMgPiY1Citjb25maWd1cmU6MjE5OTogJD8gPSAwCitjb25maWd1cmU6MjIwMjogdGVzdCAtcyBjb25mdGVzdC5vCitjb25maWd1cmU6MjIwNTogJD8gPSAwCitjb25maWd1cmU6MjIxNTogcmVzdWx0OiB5ZXMKK2NvbmZpZ3VyZToyMjQyOiBnY2MgLWMgLWcgLU8yICBjb25mdGVzdC5jID4mNQorY29uZnRlc3QuYzoyOiBwYXJzZSBlcnJvciBiZWZvcmUgYG1lJworY29uZmlndXJlOjIyNDU6ICQ/ID0gMQorY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6CisjaWZuZGVmIF9fY3BsdXNwbHVzCisgIGNob2tlIG1lCisjZW5kaWYKK2NvbmZpZ3VyZToyMzUxOiBjaGVja2luZyBmb3Igc3R5bGUgb2YgaW5jbHVkZSB1c2VkIGJ5IG1ha2UKK2NvbmZpZ3VyZToyMzc4OiByZXN1bHQ6IEdOVQorY29uZmlndXJlOjIzODQ6IGNoZWNraW5nIGRlcGVuZGVuY3kgc3R5bGUgb2YgZ2NjCitjb25maWd1cmU6MjQ0NjogcmVzdWx0OiBnY2MKK2NvbmZpZ3VyZToyNDU1OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvcgorY29uZmlndXJlOjI0ODE6IGdjYyAtRSAgY29uZnRlc3QuYworY29uZmlndXJlOjI0ODc6ICQ/ID0gMAorY29uZmlndXJlOjI1MTQ6IGdjYyAtRSAgY29uZnRlc3QuYworY29uZmlndXJlOjI1MTE6IGFjX25vbmV4aXN0ZW50Lmg6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKK2NvbmZpZ3VyZToyNTIwOiAkPyA9IDEKK2NvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOgorI2xpbmUgMjUxMCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KK2NvbmZpZ3VyZToyNTU3OiByZXN1bHQ6IGdjYyAtRQorY29uZmlndXJlOjI1NzI6IGdjYyAtRSAgY29uZnRlc3QuYworY29uZmlndXJlOjI1Nzg6ICQ/ID0gMAorY29uZmlndXJlOjI2MDU6IGdjYyAtRSAgY29uZnRlc3QuYworY29uZmlndXJlOjI2MDI6IGFjX25vbmV4aXN0ZW50Lmg6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKK2NvbmZpZ3VyZToyNjExOiAkPyA9IDEKK2NvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOgorI2xpbmUgMjYwMSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KK2NvbmZpZ3VyZToyNjk5OiBjaGVja2luZyBmb3IgZysrCitjb25maWd1cmU6MjcxNDogZm91bmQgL3Vzci9iaW4vZysrCitjb25maWd1cmU6MjcyMjogcmVzdWx0OiBnKysKK2NvbmZpZ3VyZToyNzM3OiBjaGVja2luZyBmb3IgQysrIGNvbXBpbGVyIHZlcnNpb24KK2NvbmZpZ3VyZToyNzQwOiBnKysgLS12ZXJzaW9uIDwvZGV2L251bGwgPiY1CisyLjk1LjMKK2NvbmZpZ3VyZToyNzQzOiAkPyA9IDAKK2NvbmZpZ3VyZToyNzQ1OiBnKysgLXYgPC9kZXYvbnVsbCA+JjUKK1JlYWRpbmcgc3BlY3MgZnJvbSAvdXNyL2xpYi9nY2MtbGliL2k0ODYtc3VzZS1saW51eC8yLjk1LjMvc3BlY3MKK2djYyB2ZXJzaW9uIDIuOTUuMyAyMDAxMDMxNSAoU3VTRSkKK2NvbmZpZ3VyZToyNzQ4OiAkPyA9IDAKK2NvbmZpZ3VyZToyNzUwOiBnKysgLVYgPC9kZXYvbnVsbCA+JjUKK2crKzogYXJndW1lbnQgdG8gYC1WJyBtaXNzaW5nCisKK2NvbmZpZ3VyZToyNzUzOiAkPyA9IDEKK2NvbmZpZ3VyZToyNzU2OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMrKyBjb21waWxlcgorY29uZmlndXJlOjI3Nzc6IGcrKyAtYyAgIGNvbmZ0ZXN0LmNjID4mNQorY29uZmlndXJlOjI3ODA6ICQ/ID0gMAorY29uZmlndXJlOjI3ODM6IHRlc3QgLXMgY29uZnRlc3QubworY29uZmlndXJlOjI3ODY6ICQ/ID0gMAorY29uZmlndXJlOjI3OTg6IHJlc3VsdDogeWVzCitjb25maWd1cmU6MjgwNDogY2hlY2tpbmcgd2hldGhlciBnKysgYWNjZXB0cyAtZworY29uZmlndXJlOjI4MjI6IGcrKyAtYyAtZyAgY29uZnRlc3QuY2MgPiY1Citjb25maWd1cmU6MjgyNTogJD8gPSAwCitjb25maWd1cmU6MjgyODogdGVzdCAtcyBjb25mdGVzdC5vCitjb25maWd1cmU6MjgzMTogJD8gPSAwCitjb25maWd1cmU6Mjg0MTogcmVzdWx0OiB5ZXMKK2NvbmZpZ3VyZToyODgxOiBnKysgLWMgICBjb25mdGVzdC5jYyA+JjUKK2NvbmZpZ3VyZToyODg0OiAkPyA9IDAKK2NvbmZpZ3VyZToyODg3OiB0ZXN0IC1zIGNvbmZ0ZXN0Lm8KK2NvbmZpZ3VyZToyODkwOiAkPyA9IDAKK2NvbmZpZ3VyZToyOTEyOiBnKysgLWMgICBjb25mdGVzdC5jYyA+JjUKK2NvbmZpZ3VyZToyOTE1OiAkPyA9IDAKK2NvbmZpZ3VyZToyOTE4OiB0ZXN0IC1zIGNvbmZ0ZXN0Lm8KK2NvbmZpZ3VyZToyOTIxOiAkPyA9IDAKK2NvbmZpZ3VyZToyOTQ1OiBjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mIGcrKworY29uZmlndXJlOjMwMDc6IHJlc3VsdDogZ2NjCitjb25maWd1cmU6MzAxMzogY2hlY2tpbmcgZm9yIGFweHMKK2NvbmZpZ3VyZTozMDI4OiBmb3VuZCAvdXNyL2xvY2FsL2FwYWNoZS9iaW4vYXB4cworY29uZmlndXJlOjMwMzY6IHJlc3VsdDogeWVzCitjb25maWd1cmU6MzE0NDogY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDCitjb25maWd1cmU6MzIwNzogcmVzdWx0OiAvdXNyL2k0ODYtc3VzZS1saW51eC9iaW4vbGQKK2NvbmZpZ3VyZTozMjE2OiBjaGVja2luZyBpZiB0aGUgbGlua2VyICgvdXNyL2k0ODYtc3VzZS1saW51eC9iaW4vbGQpIGlzIEdOVSBsZAorR05VIGxkIHZlcnNpb24gMi4xMS45Mi4wLjEwIDIwMDExMDIxIChTdVNFKQorY29uZmlndXJlOjMyMjg6IHJlc3VsdDogeWVzCitjb25maWd1cmU6MzIzMjogY2hlY2tpbmcgZm9yIC91c3IvaTQ4Ni1zdXNlLWxpbnV4L2Jpbi9sZCBvcHRpb24gdG8gcmVsb2FkIG9iamVjdCBmaWxlcworY29uZmlndXJlOjMyMzk6IHJlc3VsdDogLXIKK2NvbmZpZ3VyZTozMjQ0OiBjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0KK2NvbmZpZ3VyZTozMjgwOiByZXN1bHQ6IC91c3IvYmluL25tIC1CCitjb25maWd1cmU6MzI4MzogY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcworY29uZmlndXJlOjMyODc6IHJlc3VsdDogeWVzCitjb25maWd1cmU6MzI5NDogY2hlY2tpbmcgaG93IHRvIHJlY29nbmlzZSBkZXBlbmRhbnQgbGlicmFyaWVzCitjb25maWd1cmU6MzQ3MjogcmVzdWx0OiBwYXNzX2FsbAorY29uZmlndXJlOjM0Nzg6IGNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgL3Vzci9iaW4vbm0gLUIgb3V0cHV0Citjb25maWd1cmU6MzU1OTogZ2NjIC1jIC1nIC1PMiAgY29uZnRlc3QuYyA+JjUKK2NvbmZpZ3VyZTozNTYyOiAkPyA9IDAKK2NvbmZpZ3VyZTozNTY2OiAvdXNyL2Jpbi9ubSAtQiBjb25mdGVzdC5vIFx8IHNlZCAtbiAtZSAncy9eLipbIAldXChbQUJDREdJU1RXXVtBQkNER0lTVFddKlwpWyAJXVsgCV0qXChcKVwoW19BLVphLXpdW19BLVphLXowLTldKlwpJC9cMSBcMlwzIFwzL3AnIFw+IGNvbmZ0ZXN0Lm5tCitjb25maWd1cmU6MzU2OTogJD8gPSAwCitjb25maWd1cmU6MzYyMTogZ2NjIC1vIGNvbmZ0ZXN0IC1nIC1PMiAgIGNvbmZ0ZXN0LmMgY29uZnRzdG0ubyA+JjUKK2NvbmZpZ3VyZTozNjI0OiAkPyA9IDAKK2NvbmZpZ3VyZTozNjY4OiByZXN1bHQ6IG9rCitjb25maWd1cmU6MzY3NTogY2hlY2tpbmcgZm9yIGRsZmNuLmgKK2NvbmZpZ3VyZTozNjg1OiBnY2MgLUUgIGNvbmZ0ZXN0LmMKK2NvbmZpZ3VyZTozNjkxOiAkPyA9IDAKK2NvbmZpZ3VyZTozNzEwOiByZXN1bHQ6IHllcworY29uZmlndXJlOjM4OTc6IGNoZWNraW5nIGZvciByYW5saWIKK2NvbmZpZ3VyZTozOTEyOiBmb3VuZCAvdXNyL2Jpbi9yYW5saWIKK2NvbmZpZ3VyZTozOTIxOiByZXN1bHQ6IHJhbmxpYgorY29uZmlndXJlOjM5NzE6IGNoZWNraW5nIGZvciBzdHJpcAorY29uZmlndXJlOjM5ODY6IGZvdW5kIC91c3IvYmluL3N0cmlwCitjb25maWd1cmU6Mzk5NTogcmVzdWx0OiBzdHJpcAorY29uZmlndXJlOjQ1MTA6IGNoZWNraW5nIGZvciBvYmpkaXIKK2NvbmZpZ3VyZTo0NTIxOiByZXN1bHQ6IC5saWJzCitjb25maWd1cmU6NDUzNjogY2hlY2tpbmcgZm9yIGdjYyBvcHRpb24gdG8gcHJvZHVjZSBQSUMKK2NvbmZpZ3VyZTo0Njg2OiByZXN1bHQ6IC1mUElDCitjb25maWd1cmU6NDY5MDogY2hlY2tpbmcgaWYgZ2NjIFBJQyBmbGFnIC1mUElDIHdvcmtzCitjb25maWd1cmU6NDcxMDogZ2NjIC1jIC1nIC1PMiAtZlBJQyAtRFBJQyAgY29uZnRlc3QuYyA+JjUKK2NvbmZpZ3VyZTo0NzEzOiAkPyA9IDAKK2NvbmZpZ3VyZTo0NzE2OiB0ZXN0IC1zIGNvbmZ0ZXN0Lm8KK2NvbmZpZ3VyZTo0NzE5OiAkPyA9IDAKK2NvbmZpZ3VyZTo0NzU1OiByZXN1bHQ6IHllcworY29uZmlndXJlOjQ3NzE6IGNoZWNraW5nIGlmIGdjYyBzdGF0aWMgZmxhZyAtc3RhdGljIHdvcmtzCitjb25maWd1cmU6NDc5MjogZ2NjIC1vIGNvbmZ0ZXN0IC1nIC1PMiAgIC1zdGF0aWMgY29uZnRlc3QuYyAgPiY1Citjb25maWd1cmU6NDc5NTogJD8gPSAwCitjb25maWd1cmU6NDc5ODogdGVzdCAtcyBjb25mdGVzdAorY29uZmlndXJlOjQ4MDE6ICQ/ID0gMAorY29uZmlndXJlOjQ4MTU6IHJlc3VsdDogeWVzCitjb25maWd1cmU6NDgyNjogY2hlY2tpbmcgaWYgZ2NjIHN1cHBvcnRzIC1jIC1vIGZpbGUubworY29uZmlndXJlOjQ4NDY6IGdjYyAtYyAtZyAtTzIgLW8gb3V0L2NvbmZ0ZXN0Mi5vICBjb25mdGVzdC5jID4mNQorY29uZmlndXJlOjQ4NzA6IHJlc3VsdDogeWVzCitjb25maWd1cmU6NDg3NTogY2hlY2tpbmcgaWYgZ2NjIHN1cHBvcnRzIC1jIC1vIGZpbGUubG8KK2NvbmZpZ3VyZTo0ODk5OiBnY2MgLWMgLWcgLU8yIC1jIC1vIGNvbmZ0ZXN0LmxvICBjb25mdGVzdC5jID4mNQorY29uZmlndXJlOjQ5MDI6ICQ/ID0gMAorY29uZmlndXJlOjQ5MDU6IHRlc3QgLXMgY29uZnRlc3QubG8KK2NvbmZpZ3VyZTo0OTA4OiAkPyA9IDAKK2NvbmZpZ3VyZTo0OTI5OiByZXN1bHQ6IHllcworY29uZmlndXJlOjQ5NjA6IGNoZWNraW5nIGlmIGdjYyBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zCitjb25maWd1cmU6NDk3OTogZ2NjIC1jIC1nIC1PMiAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIC1jIGNvbmZ0ZXN0LmMgIGNvbmZ0ZXN0LmMgPiY1Citjb25maWd1cmU6NDk4MjogJD8gPSAwCitjb25maWd1cmU6NDk4NTogdGVzdCAtcyBjb25mdGVzdC5vCitjb25maWd1cmU6NDk4ODogJD8gPSAwCitjb25maWd1cmU6NTAwNDogcmVzdWx0OiB5ZXMKK2NvbmZpZ3VyZTo1MDE1OiBjaGVja2luZyB3aGV0aGVyIHRoZSBsaW5rZXIgKC91c3IvaTQ4Ni1zdXNlLWxpbnV4L2Jpbi9sZCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcworY29uZmlndXJlOjU2OTU6IHJlc3VsdDogeWVzCitjb25maWd1cmU6NTcwMDogY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcworY29uZmlndXJlOjU3MjQ6IHJlc3VsdDogaW1tZWRpYXRlCitjb25maWd1cmU6NTcyOTogY2hlY2tpbmcgd2hldGhlciBzdHJpcHBpbmcgbGlicmFyaWVzIGlzIHBvc3NpYmxlCitjb25maWd1cmU6NTczNDogcmVzdWx0OiB5ZXMKK2NvbmZpZ3VyZTo1NzQ1OiBjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MKK2NvbmZpZ3VyZTo2MTM4OiByZXN1bHQ6IEdOVS9MaW51eCBsZC5zbworY29uZmlndXJlOjYxNDM6IGNoZWNraW5nIGlmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcworY29uZmlndXJlOjYxNDU6IHJlc3VsdDogeWVzCitjb25maWd1cmU6NjE0ODogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzCitjb25maWd1cmU6NjE2OTogcmVzdWx0OiB5ZXMKK2NvbmZpZ3VyZTo2MTcyOiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMKK2NvbmZpZ3VyZTo2MTc2OiByZXN1bHQ6IHllcworY29uZmlndXJlOjYyMTQ6IGNoZWNraW5nIGZvciBzaGxfbG9hZAorY29uZmlndXJlOjYyNTE6IGdjYyAtbyBjb25mdGVzdCAtZyAtTzIgICBjb25mdGVzdC5jICA+JjUKKy90bXAvY2NHZ0VXTGIubzogSW4gZnVuY3Rpb24gYG1haW4nOgorL2hvbWUvYWJlcmdlci9hcGFjaGVfZ3NvYXAuMC4wLjUvY29uZmlndXJlOjYyNDI6IHVuZGVmaW5lZCByZWZlcmVuY2UgdG8gYHNobF9sb2FkJworY29sbGVjdDI6IGxkIHJldHVybmVkIDEgZXhpdCBzdGF0dXMKK2NvbmZpZ3VyZTo2MjU0OiAkPyA9IDEKK2NvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOgorI2xpbmUgNjIyMCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBzaGxfbG9hZCAoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBzaGxfbG9hZCAoKTsKK2NoYXIgKCpmKSAoKTsKKworaW50CittYWluICgpCit7CisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfc2hsX2xvYWQpIHx8IGRlZmluZWQgKF9fc3R1Yl9fX3NobF9sb2FkKQorY2hva2UgbWUKKyNlbHNlCitmID0gc2hsX2xvYWQ7CisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorY29uZmlndXJlOjYyNzA6IHJlc3VsdDogbm8KK2NvbmZpZ3VyZTo2Mjc1OiBjaGVja2luZyBmb3Igc2hsX2xvYWQgaW4gLWxkbGQKK2NvbmZpZ3VyZTo2MzAyOiBnY2MgLW8gY29uZnRlc3QgLWcgLU8yICAgY29uZnRlc3QuYyAtbGRsZCAgID4mNQorL3Vzci9pNDg2LXN1c2UtbGludXgvYmluL2xkOiBjYW5ub3QgZmluZCAtbGRsZAorY29sbGVjdDI6IGxkIHJldHVybmVkIDEgZXhpdCBzdGF0dXMKK2NvbmZpZ3VyZTo2MzA1OiAkPyA9IDEKK2NvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOgorI2xpbmUgNjI4MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgc2hsX2xvYWQgKCk7CitpbnQKK21haW4gKCkKK3sKK3NobF9sb2FkICgpOworICA7CisgIHJldHVybiAwOworfQorY29uZmlndXJlOjYzMjI6IHJlc3VsdDogbm8KK2NvbmZpZ3VyZTo2MzI3OiBjaGVja2luZyBmb3IgZGxvcGVuCitjb25maWd1cmU6NjM2NDogZ2NjIC1vIGNvbmZ0ZXN0IC1nIC1PMiAgIGNvbmZ0ZXN0LmMgID4mNQorL3RtcC9jY3FrVXh5ay5vOiBJbiBmdW5jdGlvbiBgbWFpbic6CisvaG9tZS9hYmVyZ2VyL2FwYWNoZV9nc29hcC4wLjAuNS9jb25maWd1cmU6NjM1NTogdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBgZGxvcGVuJworY29sbGVjdDI6IGxkIHJldHVybmVkIDEgZXhpdCBzdGF0dXMKK2NvbmZpZ3VyZTo2MzY3OiAkPyA9IDEKK2NvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOgorI2xpbmUgNjMzMyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBkbG9wZW4gKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgZGxvcGVuICgpOworY2hhciAoKmYpICgpOworCitpbnQKK21haW4gKCkKK3sKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl9kbG9wZW4pIHx8IGRlZmluZWQgKF9fc3R1Yl9fX2Rsb3BlbikKK2Nob2tlIG1lCisjZWxzZQorZiA9IGRsb3BlbjsKKyNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9Citjb25maWd1cmU6NjM4MzogcmVzdWx0OiBubworY29uZmlndXJlOjYzODg6IGNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbAorY29uZmlndXJlOjY0MTU6IGdjYyAtbyBjb25mdGVzdCAtZyAtTzIgICBjb25mdGVzdC5jIC1sZGwgICA+JjUKK2NvbmZpZ3VyZTo2NDE4OiAkPyA9IDAKK2NvbmZpZ3VyZTo2NDIxOiB0ZXN0IC1zIGNvbmZ0ZXN0Citjb25maWd1cmU6NjQyNDogJD8gPSAwCitjb25maWd1cmU6NjQzNTogcmVzdWx0OiB5ZXMKK2NvbmZpZ3VyZTo2NTc1OiBjaGVja2luZyB3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZgorY29uZmlndXJlOjY2NDc6IGdjYyAtbyBjb25mdGVzdCAtZyAtTzIgIC1ESEFWRV9ETEZDTl9IICAtV2wsLS1leHBvcnQtZHluYW1pYyBjb25mdGVzdC5jIC1sZGwgID4mNQorY29uZmlndXJlOjY2NTA6ICQ/ID0gMAorY29uZmlndXJlOjY2Njc6IHJlc3VsdDogeWVzCitjb25maWd1cmU6NjY3MjogY2hlY2tpbmcgd2hldGhlciBhIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYKK2NvbmZpZ3VyZTo2NzQ0OiBnY2MgLW8gY29uZnRlc3QgLWcgLU8yICAtREhBVkVfRExGQ05fSCAgLVdsLC0tZXhwb3J0LWR5bmFtaWMgLXN0YXRpYyBjb25mdGVzdC5jIC1sZGwgID4mNQorY29uZmlndXJlOjY3NDc6ICQ/ID0gMAorY29uZmlndXJlOjY3NjQ6IHJlc3VsdDogbm8KK2NvbmZpZ3VyZTo2Nzk0OiBjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4KK2NvbmZpZ3VyZTo2ODAyOiBnY2MgLWMgLWcgLU8yICBjb25mdGVzdC5jID4mNQorY29uZmlndXJlOjY4MDU6ICQ/ID0gMAorY29uZmlndXJlOjY4MTk6IGdjYyAtc2hhcmVkIGNvbmZ0ZXN0Lm8gIC12IC1XbCwtc29uYW1lIC1XbCxjb25mdGVzdCAtbyBjb25mdGVzdCAyXD5cJjEgXHwgZ3JlcCAgLWxjICBcPi9kZXYvbnVsbCAyXD5cJjEKK2NvbmZpZ3VyZTo2ODIyOiAkPyA9IDAKK2NvbmZpZ3VyZTo2ODM1OiByZXN1bHQ6IG5vCitjb25maWd1cmU6NzQ0ODogY2hlY2tpbmcgZm9yIGdldGN3ZAorY29uZmlndXJlOjc0ODU6IGdjYyAtbyBjb25mdGVzdCAtZyAtTzIgICBjb25mdGVzdC5jICA+JjUKK2NvbmZpZ3VyZTo3NDg4OiAkPyA9IDAKK2NvbmZpZ3VyZTo3NDkxOiB0ZXN0IC1zIGNvbmZ0ZXN0Citjb25maWd1cmU6NzQ5NDogJD8gPSAwCitjb25maWd1cmU6NzUwNDogcmVzdWx0OiB5ZXMKK2NvbmZpZ3VyZTo3NTE3OiBjaGVja2luZyBmb3IgbWVtc2V0Citjb25maWd1cmU6NzU1NDogZ2NjIC1vIGNvbmZ0ZXN0IC1nIC1PMiAgIGNvbmZ0ZXN0LmMgID4mNQorY29uZmlndXJlOjc1MzM6IHdhcm5pbmc6IGNvbmZsaWN0aW5nIHR5cGVzIGZvciBidWlsdC1pbiBmdW5jdGlvbiBgbWVtc2V0JworY29uZmlndXJlOjc1NTc6ICQ/ID0gMAorY29uZmlndXJlOjc1NjA6IHRlc3QgLXMgY29uZnRlc3QKK2NvbmZpZ3VyZTo3NTYzOiAkPyA9IDAKK2NvbmZpZ3VyZTo3NTczOiByZXN1bHQ6IHllcworY29uZmlndXJlOjc1ODc6IGNoZWNraW5nIGZvciBtYXdrCitjb25maWd1cmU6NzYxMDogcmVzdWx0OiBnYXdrCitjb25maWd1cmU6NzYzMjogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbAorY29uZmlndXJlOjc2ODE6IHJlc3VsdDogL3Vzci9iaW4vZ2luc3RhbGwgLWMKK2NvbmZpZ3VyZTo3NzMwOiBjaGVja2luZyBmb3IgcmFubGliCitjb25maWd1cmU6Nzc1NDogcmVzdWx0OiByYW5saWIKK2NvbmZpZ3VyZTo3NzY2OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcworY29uZmlndXJlOjc3ODA6IGdjYyAtRSAgY29uZnRlc3QuYworY29uZmlndXJlOjc3ODY6ICQ/ID0gMAorY29uZmlndXJlOjc4NzM6IGdjYyAtbyBjb25mdGVzdCAtZyAtTzIgICBjb25mdGVzdC5jICA+JjUKK2NvbmZpZ3VyZTo3ODc2OiAkPyA9IDAKK2NvbmZpZ3VyZTo3ODc4OiAuL2NvbmZ0ZXN0Citjb25maWd1cmU6Nzg4MTogJD8gPSAwCitjb25maWd1cmU6Nzg5NDogcmVzdWx0OiB5ZXMKK2NvbmZpZ3VyZTo3OTA0OiBjaGVja2luZyBmb3IgZ2NjIG9wdGlvbiB0byBhY2NlcHQgQU5TSSBDCitjb25maWd1cmU6Nzk2MTogZ2NjICAtYyAtZyAtTzIgIGNvbmZ0ZXN0LmMgPiY1Citjb25maWd1cmU6Nzk2NDogJD8gPSAwCitjb25maWd1cmU6Nzk2NzogdGVzdCAtcyBjb25mdGVzdC5vCitjb25maWd1cmU6Nzk3MDogJD8gPSAwCitjb25maWd1cmU6Nzk4NzogcmVzdWx0OiBub25lIG5lZWRlZAorY29uZmlndXJlOjc5OTU6IGNoZWNraW5nIGZvciBhbiBBTlNJIEMtY29uZm9ybWluZyBjb25zdAorY29uZmlndXJlOjgwNTk6IGdjYyAtYyAtZyAtTzIgIGNvbmZ0ZXN0LmMgPiY1Citjb25maWd1cmU6ODA2MjogJD8gPSAwCitjb25maWd1cmU6ODA2NTogdGVzdCAtcyBjb25mdGVzdC5vCitjb25maWd1cmU6ODA2ODogJD8gPSAwCitjb25maWd1cmU6ODA3ODogcmVzdWx0OiB5ZXMKK2NvbmZpZ3VyZTo4MDk0OiBjaGVja2luZyBmb3Igc3lzL3R5cGVzLmgKK2NvbmZpZ3VyZTo4MTA2OiBnY2MgLWMgLWcgLU8yICBjb25mdGVzdC5jID4mNQorY29uZmlndXJlOjgxMDk6ICQ/ID0gMAorY29uZmlndXJlOjgxMTI6IHRlc3QgLXMgY29uZnRlc3QubworY29uZmlndXJlOjgxMTU6ICQ/ID0gMAorY29uZmlndXJlOjgxMjU6IHJlc3VsdDogeWVzCitjb25maWd1cmU6ODA5NDogY2hlY2tpbmcgZm9yIHN5cy9zdGF0LmgKK2NvbmZpZ3VyZTo4MTA2OiBnY2MgLWMgLWcgLU8yICBjb25mdGVzdC5jID4mNQorY29uZmlndXJlOjgxMDk6ICQ/ID0gMAorY29uZmlndXJlOjgxMTI6IHRlc3QgLXMgY29uZnRlc3QubworY29uZmlndXJlOjgxMTU6ICQ/ID0gMAorY29uZmlndXJlOjgxMjU6IHJlc3VsdDogeWVzCitjb25maWd1cmU6ODA5NDogY2hlY2tpbmcgZm9yIHN0ZGxpYi5oCitjb25maWd1cmU6ODEwNjogZ2NjIC1jIC1nIC1PMiAgY29uZnRlc3QuYyA+JjUKK2NvbmZpZ3VyZTo4MTA5OiAkPyA9IDAKK2NvbmZpZ3VyZTo4MTEyOiB0ZXN0IC1zIGNvbmZ0ZXN0Lm8KK2NvbmZpZ3VyZTo4MTE1OiAkPyA9IDAKK2NvbmZpZ3VyZTo4MTI1OiByZXN1bHQ6IHllcworY29uZmlndXJlOjgwOTQ6IGNoZWNraW5nIGZvciBzdHJpbmcuaAorY29uZmlndXJlOjgxMDY6IGdjYyAtYyAtZyAtTzIgIGNvbmZ0ZXN0LmMgPiY1Citjb25maWd1cmU6ODEwOTogJD8gPSAwCitjb25maWd1cmU6ODExMjogdGVzdCAtcyBjb25mdGVzdC5vCitjb25maWd1cmU6ODExNTogJD8gPSAwCitjb25maWd1cmU6ODEyNTogcmVzdWx0OiB5ZXMKK2NvbmZpZ3VyZTo4MDk0OiBjaGVja2luZyBmb3IgbWVtb3J5LmgKK2NvbmZpZ3VyZTo4MTA2OiBnY2MgLWMgLWcgLU8yICBjb25mdGVzdC5jID4mNQorY29uZmlndXJlOjgxMDk6ICQ/ID0gMAorY29uZmlndXJlOjgxMTI6IHRlc3QgLXMgY29uZnRlc3QubworY29uZmlndXJlOjgxMTU6ICQ/ID0gMAorY29uZmlndXJlOjgxMjU6IHJlc3VsdDogeWVzCitjb25maWd1cmU6ODA5NDogY2hlY2tpbmcgZm9yIHN0cmluZ3MuaAorY29uZmlndXJlOjgxMDY6IGdjYyAtYyAtZyAtTzIgIGNvbmZ0ZXN0LmMgPiY1Citjb25maWd1cmU6ODEwOTogJD8gPSAwCitjb25maWd1cmU6ODExMjogdGVzdCAtcyBjb25mdGVzdC5vCitjb25maWd1cmU6ODExNTogJD8gPSAwCitjb25maWd1cmU6ODEyNTogcmVzdWx0OiB5ZXMKK2NvbmZpZ3VyZTo4MDk0OiBjaGVja2luZyBmb3IgaW50dHlwZXMuaAorY29uZmlndXJlOjgxMDY6IGdjYyAtYyAtZyAtTzIgIGNvbmZ0ZXN0LmMgPiY1Citjb25maWd1cmU6ODEwOTogJD8gPSAwCitjb25maWd1cmU6ODExMjogdGVzdCAtcyBjb25mdGVzdC5vCitjb25maWd1cmU6ODExNTogJD8gPSAwCitjb25maWd1cmU6ODEyNTogcmVzdWx0OiB5ZXMKK2NvbmZpZ3VyZTo4MDk0OiBjaGVja2luZyBmb3Igc3RkaW50LmgKK2NvbmZpZ3VyZTo4MTA2OiBnY2MgLWMgLWcgLU8yICBjb25mdGVzdC5jID4mNQorY29uZmlndXJlOjgxMDk6ICQ/ID0gMAorY29uZmlndXJlOjgxMTI6IHRlc3QgLXMgY29uZnRlc3QubworY29uZmlndXJlOjgxMTU6ICQ/ID0gMAorY29uZmlndXJlOjgxMjU6IHJlc3VsdDogeWVzCitjb25maWd1cmU6ODA5NDogY2hlY2tpbmcgZm9yIHVuaXN0ZC5oCitjb25maWd1cmU6ODEwNjogZ2NjIC1jIC1nIC1PMiAgY29uZnRlc3QuYyA+JjUKK2NvbmZpZ3VyZTo4MTA5OiAkPyA9IDAKK2NvbmZpZ3VyZTo4MTEyOiB0ZXN0IC1zIGNvbmZ0ZXN0Lm8KK2NvbmZpZ3VyZTo4MTE1OiAkPyA9IDAKK2NvbmZpZ3VyZTo4MTI1OiByZXN1bHQ6IHllcworY29uZmlndXJlOjgxMzU6IGNoZWNraW5nIGZvciBzaXplX3QKK2NvbmZpZ3VyZTo4MTU2OiBnY2MgLWMgLWcgLU8yICBjb25mdGVzdC5jID4mNQorY29uZmlndXJlOjgxNTk6ICQ/ID0gMAorY29uZmlndXJlOjgxNjI6IHRlc3QgLXMgY29uZnRlc3QubworY29uZmlndXJlOjgxNjU6ICQ/ID0gMAorY29uZmlndXJlOjgxNzU6IHJlc3VsdDogeWVzCitjb25maWd1cmU6ODE5MDogY2hlY2tpbmcgZm9yIHN5cy90eXBlcy5oCitjb25maWd1cmU6ODIyNTogcmVzdWx0OiB5ZXMKK2NvbmZpZ3VyZTo4MTkwOiBjaGVja2luZyBmb3Igc3lzL3NvY2tldC5oCitjb25maWd1cmU6ODIwMDogZ2NjIC1FICBjb25mdGVzdC5jCitjb25maWd1cmU6ODIwNjogJD8gPSAwCitjb25maWd1cmU6ODIyNTogcmVzdWx0OiB5ZXMKK2NvbmZpZ3VyZTo4MTkwOiBjaGVja2luZyBmb3IgdW5pc3RkLmgKK2NvbmZpZ3VyZTo4MjI1OiByZXN1bHQ6IHllcworY29uZmlndXJlOjgxOTA6IGNoZWNraW5nIGZvciBuZXRpbmV0L2luLmgKK2NvbmZpZ3VyZTo4MjAwOiBnY2MgLUUgIGNvbmZ0ZXN0LmMKK2NvbmZpZ3VyZTo4MjA2OiAkPyA9IDAKK2NvbmZpZ3VyZTo4MjI1OiByZXN1bHQ6IHllcworY29uZmlndXJlOjgyMzg6IGNoZWNraW5nIGZvciBhcnBhL2luZXQuaAorY29uZmlndXJlOjgyNDg6IGdjYyAtRSAgY29uZnRlc3QuYworY29uZmlndXJlOjgyNTQ6ICQ/ID0gMAorY29uZmlndXJlOjgyNzM6IHJlc3VsdDogeWVzCitjb25maWd1cmU6ODIzODogY2hlY2tpbmcgZm9yIG5ldGRiLmgKK2NvbmZpZ3VyZTo4MjQ4OiBnY2MgLUUgIGNvbmZ0ZXN0LmMKK2NvbmZpZ3VyZTo4MjU0OiAkPyA9IDAKK2NvbmZpZ3VyZTo4MjczOiByZXN1bHQ6IHllcworY29uZmlndXJlOjgyMzg6IGNoZWNraW5nIGZvciBzeXMvaW9jdGwuaAorY29uZmlndXJlOjgyNDg6IGdjYyAtRSAgY29uZnRlc3QuYworY29uZmlndXJlOjgyNTQ6ICQ/ID0gMAorY29uZmlndXJlOjgyNzM6IHJlc3VsdDogeWVzCitjb25maWd1cmU6ODIzODogY2hlY2tpbmcgZm9yIGVycm5vLmgKK2NvbmZpZ3VyZTo4MjQ4OiBnY2MgLUUgIGNvbmZ0ZXN0LmMKK2NvbmZpZ3VyZTo4MjU0OiAkPyA9IDAKK2NvbmZpZ3VyZTo4MjczOiByZXN1bHQ6IHllcworY29uZmlndXJlOjgyODY6IGNoZWNraW5nIGZvciBzeXMvdGltZS5oCitjb25maWd1cmU6ODI5NjogZ2NjIC1FICBjb25mdGVzdC5jCitjb25maWd1cmU6ODMwMjogJD8gPSAwCitjb25maWd1cmU6ODMyMTogcmVzdWx0OiB5ZXMKK2NvbmZpZ3VyZTo4MzM0OiBjaGVja2luZyBmb3IgbHRkbC5oCitjb25maWd1cmU6ODM0NDogZ2NjIC1FICBjb25mdGVzdC5jCitjb25maWd1cmU6ODM1MDogJD8gPSAwCitjb25maWd1cmU6ODM2OTogcmVzdWx0OiB5ZXMKK2NvbmZpZ3VyZTo4MzgyOiBjaGVja2luZyBmb3Igc3Rkc29hcDIuaAorY29uZmlndXJlOjgzOTI6IGdjYyAtRSAgY29uZnRlc3QuYworY29uZmlndXJlOjgzOTg6ICQ/ID0gMAorY29uZmlndXJlOjg0MTc6IHJlc3VsdDogeWVzCitjb25maWd1cmU6ODUwNzogY3JlYXRpbmcgLi9jb25maWcuc3RhdHVzCisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBSdW5uaW5nIGNvbmZpZy5zdGF0dXMuICAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKworVGhpcyBmaWxlIHdhcyBleHRlbmRlZCBieSBjb25maWcuc3RhdHVzIDIuNTIsIGV4ZWN1dGVkIHdpdGgKKyAgQ09ORklHX0ZJTEVTICAgID0gCisgIENPTkZJR19IRUFERVJTICA9IAorICBDT05GSUdfTElOS1MgICAgPSAKKyAgQ09ORklHX0NPTU1BTkRTID0gCisgID4gLi9jb25maWcuc3RhdHVzIAorb24gcmVkdXgKKworY29uZmlnLnN0YXR1czo5MDE3OiBjcmVhdGluZyBNYWtlZmlsZQorY29uZmlnLnN0YXR1czo5MDE3OiBjcmVhdGluZyBDb25zb2xlU2VydmVyL01ha2VmaWxlCitjb25maWcuc3RhdHVzOjkwMTc6IGNyZWF0aW5nIENvbnNvbGVTZXJ2ZXIvZm9vL01ha2VmaWxlCitjb25maWcuc3RhdHVzOjkwMTc6IGNyZWF0aW5nIGV4YW1wbGUvTWFrZWZpbGUKK2NvbmZpZy5zdGF0dXM6OTAxNzogY3JlYXRpbmcgZXhhbXBsZS9jYWxjdWxhdG9yL01ha2VmaWxlCitjb25maWcuc3RhdHVzOjkwMTc6IGNyZWF0aW5nIG1vZF9nc29hcC9NYWtlZmlsZQorY29uZmlnLnN0YXR1czo5MTA5OiBjcmVhdGluZyBjb25maWcuaAorY29uZmlnLnN0YXR1czo5MjUwOiBjb25maWcuaCBpcyB1bmNoYW5nZWQKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIENhY2hlIHZhcmlhYmxlcy4gICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLSAjIworCithY19jdl9idWlsZD1pNjg2LXN1c2UtbGludXgKK2FjX2N2X2J1aWxkX2FsaWFzPWk2ODYtc3VzZS1saW51eAorYWNfY3ZfY19jb21waWxlcl9nbnU9eWVzCithY19jdl9jX2NvbnN0PXllcworYWNfY3ZfY3h4X2NvbXBpbGVyX2dudT15ZXMKK2FjX2N2X2Vudl9DQ19zZXQ9CithY19jdl9lbnZfQ0NfdmFsdWU9CithY19jdl9lbnZfQ0ZMQUdTX3NldD0KK2FjX2N2X2Vudl9DRkxBR1NfdmFsdWU9CithY19jdl9lbnZfQ1BQRkxBR1Nfc2V0PQorYWNfY3ZfZW52X0NQUEZMQUdTX3ZhbHVlPQorYWNfY3ZfZW52X0NQUF9zZXQ9CithY19jdl9lbnZfQ1BQX3ZhbHVlPQorYWNfY3ZfZW52X0NYWEZMQUdTX3NldD0KK2FjX2N2X2Vudl9DWFhGTEFHU192YWx1ZT0KK2FjX2N2X2Vudl9DWFhfc2V0PQorYWNfY3ZfZW52X0NYWF92YWx1ZT0KK2FjX2N2X2Vudl9MREZMQUdTX3NldD0KK2FjX2N2X2Vudl9MREZMQUdTX3ZhbHVlPQorYWNfY3ZfZW52X2J1aWxkX2FsaWFzX3NldD0KK2FjX2N2X2Vudl9idWlsZF9hbGlhc192YWx1ZT0KK2FjX2N2X2Vudl9ob3N0X2FsaWFzX3NldD0KK2FjX2N2X2Vudl9ob3N0X2FsaWFzX3ZhbHVlPQorYWNfY3ZfZW52X3RhcmdldF9hbGlhc19zZXQ9CithY19jdl9lbnZfdGFyZ2V0X2FsaWFzX3ZhbHVlPQorYWNfY3ZfZnVuY19kbG9wZW49bm8KK2FjX2N2X2Z1bmNfZ2V0Y3dkPXllcworYWNfY3ZfZnVuY19tZW1zZXQ9eWVzCithY19jdl9mdW5jX3NobF9sb2FkPW5vCithY19jdl9oZWFkZXJfYXJwYV9pbmV0X2g9eWVzCithY19jdl9oZWFkZXJfZGxmY25faD15ZXMKK2FjX2N2X2hlYWRlcl9lcnJub19oPXllcworYWNfY3ZfaGVhZGVyX2ludHR5cGVzX2g9eWVzCithY19jdl9oZWFkZXJfbHRkbF9oPXllcworYWNfY3ZfaGVhZGVyX21lbW9yeV9oPXllcworYWNfY3ZfaGVhZGVyX25ldGRiX2g9eWVzCithY19jdl9oZWFkZXJfbmV0aW5ldF9pbl9oPXllcworYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCithY19jdl9oZWFkZXJfc3RkaW50X2g9eWVzCithY19jdl9oZWFkZXJfc3RkbGliX2g9eWVzCithY19jdl9oZWFkZXJfc3Rkc29hcDJfaD15ZXMKK2FjX2N2X2hlYWRlcl9zdHJpbmdfaD15ZXMKK2FjX2N2X2hlYWRlcl9zdHJpbmdzX2g9eWVzCithY19jdl9oZWFkZXJfc3lzX2lvY3RsX2g9eWVzCithY19jdl9oZWFkZXJfc3lzX3NvY2tldF9oPXllcworYWNfY3ZfaGVhZGVyX3N5c19zdGF0X2g9eWVzCithY19jdl9oZWFkZXJfc3lzX3RpbWVfaD15ZXMKK2FjX2N2X2hlYWRlcl9zeXNfdHlwZXNfaD15ZXMKK2FjX2N2X2hlYWRlcl91bmlzdGRfaD15ZXMKK2FjX2N2X2hvc3Q9aTY4Ni1zdXNlLWxpbnV4CithY19jdl9ob3N0X2FsaWFzPWk2ODYtc3VzZS1saW51eAorYWNfY3ZfbGliX2RsX2Rsb3Blbj15ZXMKK2FjX2N2X2xpYl9kbGRfc2hsX2xvYWQ9bm8KK2FjX2N2X29iamV4dD1vCithY19jdl9wYXRoX2luc3RhbGw9JCcvdXNyL2Jpbi9naW5zdGFsbCAtYycKK2FjX2N2X3Byb2dfQVdLPWdhd2sKK2FjX2N2X3Byb2dfQ1BQPSQnZ2NjIC1FJworYWNfY3ZfcHJvZ19FWElTVFNfQVBYUz15ZXMKK2FjX2N2X3Byb2dfRVhJU1RTX0dTT0FQPXllcworYWNfY3ZfcHJvZ19hY19jdF9DQz1nY2MKK2FjX2N2X3Byb2dfYWNfY3RfQ1hYPWcrKworYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9cmFubGliCithY19jdl9wcm9nX2FjX2N0X1NUUklQPXN0cmlwCithY19jdl9wcm9nX2NjX2c9eWVzCithY19jdl9wcm9nX2NjX3N0ZGM9CithY19jdl9wcm9nX2N4eF9nPXllcworYWNfY3ZfcHJvZ19tYWtlX21ha2Vfc2V0PXllcworYWNfY3ZfdGFyZ2V0PWk2ODYtc3VzZS1saW51eAorYWNfY3ZfdGFyZ2V0X2FsaWFzPWk2ODYtc3VzZS1saW51eAorYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCithbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1nY2MKK2FtX2N2X0NYWF9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1nY2MKK2x0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjPW5vCitsdF9jdl9jb21waWxlcl9jX289eWVzCitsdF9jdl9jb21waWxlcl9vX2xvPXllcworbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKK2x0X2N2X2Rsb3Blbj1kbG9wZW4KK2x0X2N2X2Rsb3Blbl9saWJzPS1sZGwKK2x0X2N2X2Rsb3Blbl9zZWxmPXllcworbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPW5vCitsdF9jdl9maWxlX21hZ2ljX2NtZD0kJyRNQUdJQ19DTUQnCitsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0kJy9saWIvbGliYy5zby42IC9saWIvbGliYy5zby42LmJhY2t1cCAvbGliL2xpYmMtKi5zbycKK2x0X2N2X2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9JCdzZWQgLW4gLWUgXCdzL146IFxcKFteIF0qXFwpICQvICB7XFwiXFwxXFwiLCAobHRfcHRyKSAwfSwvcFwnIC1lIFwncy9eW0JDREVHUlNUXSBcXChbXiBdKlxcKSBcXChbXiBdKlxcKSQvICB7IlxcMiIsIChsdF9wdHIpIFxcJlxcMn0sL3BcJycKK2x0X2N2X2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9JCdzZWQgLW4gLWUgXCdzL14uIC4qIFxcKC4qXFwpJC9leHRlcm4gY2hhciBcXDE7L3BcJycKK2x0X2N2X2xkX3JlbG9hZF9mbGFnPS1yCitsdF9jdl9wYXRoX0xEPS91c3IvaTQ4Ni1zdXNlLWxpbnV4L2Jpbi9sZAorbHRfY3ZfcGF0aF9OTT0kJy91c3IvYmluL25tIC1CJworbHRfY3ZfcHJvZ19jY19jYW5fYnVpbGRfc2hhcmVkPXllcworbHRfY3ZfcHJvZ19jY19ub19idWlsdGluPQorbHRfY3ZfcHJvZ19jY19waWM9JCcgLWZQSUMnCitsdF9jdl9wcm9nX2NjX3BpY193b3Jrcz15ZXMKK2x0X2N2X3Byb2dfY2Nfc2hsaWI9CitsdF9jdl9wcm9nX2NjX3N0YXRpYz0tc3RhdGljCitsdF9jdl9wcm9nX2NjX3N0YXRpY193b3Jrcz15ZXMKK2x0X2N2X3Byb2dfY2Nfd2w9LVdsLAorbHRfY3ZfcHJvZ19nbnVfbGQ9eWVzCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSQnc2VkIC1uIC1lIFwncy9eLipbIFx0XVxcKFtBQkNER0lTVFddW0FCQ0RHSVNUV10qXFwpWyBcdF1bIFx0XSpcXChcXClcXChbX0EtWmEtel1bX0EtWmEtejAtOV0qXFwpJC9cXDEgXFwyXFwzIFxcMy9wXCcnCitsdF9jdl9zeXNfcGF0aF9zZXBhcmF0b3I9OgorCisjIyAtLS0tLS0tLS0tLS0gIyMKKyMjIGNvbmZkZWZzLmguICAjIworIyMgLS0tLS0tLS0tLS0tICMjCisKKyNkZWZpbmUgUEFDS0FHRSAibW9kX2dzb2FwIgorI2RlZmluZSBWRVJTSU9OICIwLjAuNSIKKyNkZWZpbmUgSEFWRV9ETEZDTl9IIDEKKyNkZWZpbmUgSEFWRV9HRVRDV0QgMQorI2RlZmluZSBIQVZFX01FTVNFVCAxCisjZGVmaW5lIFNURENfSEVBREVSUyAxCisjZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQorI2RlZmluZSBIQVZFX1NZU19TVEFUX0ggMQorI2RlZmluZSBIQVZFX1NURExJQl9IIDEKKyNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCisjZGVmaW5lIEhBVkVfTUVNT1JZX0ggMQorI2RlZmluZSBIQVZFX1NUUklOR1NfSCAxCisjZGVmaW5lIEhBVkVfSU5UVFlQRVNfSCAxCisjZGVmaW5lIEhBVkVfU1RESU5UX0ggMQorI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKKyNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSCAxCisjZGVmaW5lIEhBVkVfU1lTX1NPQ0tFVF9IIDEKKyNkZWZpbmUgSEFWRV9VTklTVERfSCAxCisjZGVmaW5lIEhBVkVfTkVUSU5FVF9JTl9IIDEKKyNkZWZpbmUgSEFWRV9BUlBBX0lORVRfSCAxCisjZGVmaW5lIEhBVkVfTkVUREJfSCAxCisjZGVmaW5lIEhBVkVfU1lTX0lPQ1RMX0ggMQorI2RlZmluZSBIQVZFX0VSUk5PX0ggMQorI2RlZmluZSBIQVZFX1NZU19USU1FX0ggMQorI2RlZmluZSBIQVZFX0xURExfSCAxCisjZGVmaW5lIEhBVkVfU1REU09BUDJfSCAxCisKKworY29uZmlndXJlOiBleGl0IDAKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIFJ1bm5pbmcgY29uZmlnLnN0YXR1cy4gICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCitUaGlzIGZpbGUgd2FzIGV4dGVuZGVkIGJ5IGNvbmZpZy5zdGF0dXMgMi41MiwgZXhlY3V0ZWQgd2l0aAorICBDT05GSUdfRklMRVMgICAgPSAKKyAgQ09ORklHX0hFQURFUlMgID0gY29uZmlnLmgKKyAgQ09ORklHX0xJTktTICAgID0gCisgIENPTkZJR19DT01NQU5EUyA9IAorICA+IC4vY29uZmlnLnN0YXR1cyAKK29uIHJlZHV4CisKK2NvbmZpZy5zdGF0dXM6OTEwOTogY3JlYXRpbmcgY29uZmlnLmgKK2NvbmZpZy5zdGF0dXM6OTI1MDogY29uZmlnLmggaXMgdW5jaGFuZ2VkCmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvY29uZmlnLnN0YXR1cyBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9jb25maWcuc3RhdHVzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjlmZjI4YzMKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvY29uZmlnLnN0YXR1cwpAQCAtMCwwICsxLDc3NyBAQAorIyEgL2Jpbi9zaAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKKyMgY29uZmlndXJlLCBpcyBpbiBjb25maWcubG9nIGlmIGl0IGV4aXN0cy4KKworZGVidWc9ZmFsc2UKK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CithY19jc19pbnZvY2F0aW9uPSIkMCAkQCIKKworIyBCZSBCb3VybmUgY29tcGF0aWJsZQoraWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CitlbGlmIHRlc3QgLW4gIiR7QkFTSF9WRVJTSU9OK3NldH0iICYmIChzZXQgLW8gcG9zaXgpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBzZXQgLW8gcG9zaXgKK2ZpCisKKyMgTmFtZSBvZiB0aGUgZXhlY3V0YWJsZS4KK2FzX21lPWBlY2hvICIkMCIgfHNlZCAncywuKltcXC9dLCwnYAorCitpZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc19leHByPWV4cHIKK2Vsc2UKKyAgYXNfZXhwcj1mYWxzZQorZmkKKworcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKK2VjaG8gPmNvbmYkJC5maWxlCitpZiBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KKyAgIyBXZSBjb3VsZCBqdXN0IGNoZWNrIGZvciBESkdQUDsgYnV0IHRoaXMgdGVzdCBhKSB3b3JrcyBiKSBpcyBtb3JlIGdlbmVyaWMKKyAgIyBhbmQgYykgd2lsbCByZW1haW4gdmFsaWQgb25jZSBESkdQUCBzdXBwb3J0cyBzeW1saW5rcyAoREpHUFAgMi4wNCkuCisgIGlmIHRlc3QgLWYgY29uZiQkLmV4ZTsgdGhlbgorICAgICMgRG9uJ3QgdXNlIGxuIGF0IGFsbDsgd2UgZG9uJ3QgaGF2ZSBhbnkgbGlua3MKKyAgICBhc19sbl9zPSdjcCAtcCcKKyAgZWxzZQorICAgIGFzX2xuX3M9J2xuIC1zJworICBmaQorZWxpZiBsbiBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfbG5fcz1sbgorZWxzZQorICBhc19sbl9zPSdjcCAtcCcKK2ZpCitybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZmlsZQorCithc19leGVjdXRhYmxlX3A9InRlc3QgLWYiCisKKyMgU3VwcG9ydCB1bnNldCB3aGVuIHBvc3NpYmxlLgoraWYgKEZPTz1GT087IHVuc2V0IEZPTykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX3Vuc2V0PXVuc2V0CitlbHNlCisgIGFzX3Vuc2V0PWZhbHNlCitmaQorCisjIE5MUyBudWlzYW5jZXMuCiskYXNfdW5zZXQgTEFORyB8fCB0ZXN0ICIke0xBTkcrc2V0fSIgIT0gc2V0IHx8IHsgTEFORz1DOyBleHBvcnQgTEFORzsgfQorJGFzX3Vuc2V0IExDX0FMTCB8fCB0ZXN0ICIke0xDX0FMTCtzZXR9IiAhPSBzZXQgfHwgeyBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgfQorJGFzX3Vuc2V0IExDX1RJTUUgfHwgdGVzdCAiJHtMQ19USU1FK3NldH0iICE9IHNldCB8fCB7IExDX1RJTUU9QzsgZXhwb3J0IExDX1RJTUU7IH0KKyRhc191bnNldCBMQ19DVFlQRSB8fCB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICE9IHNldCB8fCB7IExDX0NUWVBFPUM7IGV4cG9ydCBMQ19DVFlQRTsgfQorJGFzX3Vuc2V0IExBTkdVQUdFIHx8IHRlc3QgIiR7TEFOR1VBR0Urc2V0fSIgIT0gc2V0IHx8IHsgTEFOR1VBR0U9QzsgZXhwb3J0IExBTkdVQUdFOyB9CiskYXNfdW5zZXQgTENfQ09MTEFURSB8fCB0ZXN0ICIke0xDX0NPTExBVEUrc2V0fSIgIT0gc2V0IHx8IHsgTENfQ09MTEFURT1DOyBleHBvcnQgTENfQ09MTEFURTsgfQorJGFzX3Vuc2V0IExDX05VTUVSSUMgfHwgdGVzdCAiJHtMQ19OVU1FUklDK3NldH0iICE9IHNldCB8fCB7IExDX05VTUVSSUM9QzsgZXhwb3J0IExDX05VTUVSSUM7IH0KKyRhc191bnNldCBMQ19NRVNTQUdFUyB8fCB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iICE9IHNldCB8fCB7IExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgfQorCisjIElGUworIyBXZSBuZWVkIHNwYWNlLCB0YWIgYW5kIG5ldyBsaW5lLCBpbiBwcmVjaXNlbHkgdGhhdCBvcmRlci4KK2FzX25sPScKKycKK0lGUz0iIAkkYXNfbmwiCisKKyMgQ0RQQVRILgorJGFzX3Vuc2V0IENEUEFUSCB8fCB0ZXN0ICIke0NEUEFUSCtzZXR9IiAhPSBzZXQgfHwgeyBDRFBBVEg9OjsgZXhwb3J0IENEUEFUSDsgfQorCitleGVjIDY+JjEKKworY29uZmlnX2ZpbGVzPSIgTWFrZWZpbGUgQ29uc29sZVNlcnZlci9NYWtlZmlsZSBDb25zb2xlU2VydmVyL2Zvby9NYWtlZmlsZSBleGFtcGxlL01ha2VmaWxlIGV4YW1wbGUvY2FsY3VsYXRvci9NYWtlZmlsZSBtb2RfZ3NvYXAvTWFrZWZpbGUiCitjb25maWdfaGVhZGVycz0iIGNvbmZpZy5oIgorY29uZmlnX2NvbW1hbmRzPSIgZGVmYXVsdC0xIgorCithY19jc191c2FnZT0iXAorXGAkYXNfbWUnIGluc3RhbnRpYXRlcyBmaWxlcyBmcm9tIHRlbXBsYXRlcyBhY2NvcmRpbmcgdG8gdGhlCitjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisKK1VzYWdlOiAkMCBbT1BUSU9OU10gW0ZJTEVdLi4uCisKKyAgLWgsIC0taGVscCAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAorICAtViwgLS12ZXJzaW9uICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKKyAgLWQsIC0tZGVidWcgICAgICBkb24ndCByZW1vdmUgdGVtcG9yYXJ5IGZpbGVzCisgICAgICAtLXJlY2hlY2sgICAgdXBkYXRlICRhc19tZSBieSByZWNvbmZpZ3VyaW5nIGluIHRoZSBzYW1lIGNvbmRpdGlvbnMKKyAgLS1maWxlPUZJTEVbOlRFTVBMQVRFXQorICAgICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgRklMRQorICAtLWhlYWRlcj1GSUxFWzpURU1QTEFURV0KKyAgICAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZSB0aGUgY29uZmlndXJhdGlvbiBoZWFkZXIgRklMRQorCitDb25maWd1cmF0aW9uIGZpbGVzOgorJGNvbmZpZ19maWxlcworCitDb25maWd1cmF0aW9uIGhlYWRlcnM6CiskY29uZmlnX2hlYWRlcnMKKworQ29uZmlndXJhdGlvbiBjb21tYW5kczoKKyRjb25maWdfY29tbWFuZHMKKworUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1hdXRvY29uZkBnbnUub3JnPi4iCithY19jc192ZXJzaW9uPSJcCitjb25maWcuc3RhdHVzCitjb25maWd1cmVkIGJ5IC4vY29uZmlndXJlLCBnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNTIsCisgIHdpdGggb3B0aW9ucyBcIlwiCisKK0NvcHlyaWdodCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK1RoaXMgY29uZmlnLnN0YXR1cyBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LiIKK3NyY2Rpcj0uCitJTlNUQUxMPSIvdXNyL2Jpbi9naW5zdGFsbCAtYyIKKyMgSWYgbm8gZmlsZSBhcmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLCB0aGVuIHdlIG5lZWQgdG8gcHJvdmlkZSBkZWZhdWx0CisjIHZhbHVlLiAgQnkgd2UgbmVlZCB0byBrbm93IGlmIGZpbGVzIHdlcmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgorYWNfbmVlZF9kZWZhdWx0cz06Cit3aGlsZSB0ZXN0ICQjICE9IDAKK2RvCisgIGNhc2UgJDEgaW4KKyAgLS0qPSopCisgICAgYWNfb3B0aW9uPWBleHByICJ4JDEiIDogJ3hcKFtePV0qXCk9J2AKKyAgICBhY19vcHRhcmc9YGV4cHIgIngkMSIgOiAneFtePV0qPVwoLipcKSdgCisgICAgc2hpZnQKKyAgICBzZXQgZHVtbXkgIiRhY19vcHRpb24iICIkYWNfb3B0YXJnIiAkezErIiRAIn0KKyAgICBzaGlmdAorICAgIDs7CisgIC0qKTs7CisgICopICMgVGhpcyBpcyBub3QgYW4gb3B0aW9uLCBzbyB0aGUgdXNlciBoYXMgcHJvYmFibHkgZ2l2ZW4gZXhwbGljaXQKKyAgICAgIyBhcmd1bWVudHMuCisgICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OworICBlc2FjCisKKyAgY2FzZSAkMSBpbgorICAjIEhhbmRsaW5nIG9mIHRoZSBvcHRpb25zLgorICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKKyAgICBlY2hvICJydW5uaW5nIC9iaW4vc2ggLi9jb25maWd1cmUgIiAgIiAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKKyAgICBleGVjIC9iaW4vc2ggLi9jb25maWd1cmUgIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7CisgIC0tdmVyc2lvbiB8IC0tdmVycyogfCAtViApCisgICAgZWNobyAiJGFjX2NzX3ZlcnNpb24iOyBleGl0IDAgOzsKKyAgLS1oZSB8IC0taCkKKyAgICAjIENvbmZsaWN0IGJldHdlZW4gLS1oZWxwIGFuZCAtLWhlYWRlcgorICAgIHsgeyBlY2hvICIkYXNfbWU6ODY4MzogZXJyb3I6IGFtYmlndW91cyBvcHRpb246ICQxCitUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBhbWJpZ3VvdXMgb3B0aW9uOiAkMQorVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworICAtLWhlbHAgfCAtLWhlbCB8IC1oICkKKyAgICBlY2hvICIkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKKyAgLS1kZWJ1ZyB8IC0tZCogfCAtZCApCisgICAgZGVidWc9OiA7OworICAtLWZpbGUgfCAtLWZpbCB8IC0tZmkgfCAtLWYgKQorICAgIHNoaWZ0CisgICAgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTICQxIgorICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OworICAtLWhlYWRlciB8IC0taGVhZGUgfCAtLWhlYWQgfCAtLWhlYSApCisgICAgc2hpZnQKKyAgICBDT05GSUdfSEVBREVSUz0iJENPTkZJR19IRUFERVJTICQxIgorICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OworCisgICMgVGhpcyBpcyBhbiBlcnJvci4KKyAgLSopIHsgeyBlY2hvICIkYXNfbWU6ODcwMjogZXJyb3I6IHVucmVjb2duaXplZCBvcHRpb246ICQxCitUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiB1bnJlY29nbml6ZWQgb3B0aW9uOiAkMQorVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0gOzsKKworICAqKSBhY19jb25maWdfdGFyZ2V0cz0iJGFjX2NvbmZpZ190YXJnZXRzICQxIiA7OworCisgIGVzYWMKKyAgc2hpZnQKK2RvbmUKKworZXhlYyA1Pj5jb25maWcubG9nCitjYXQgPiY1IDw8IF9BQ0VPRgorCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgUnVubmluZyBjb25maWcuc3RhdHVzLiAgIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisKK1RoaXMgZmlsZSB3YXMgZXh0ZW5kZWQgYnkgJGFzX21lIDIuNTIsIGV4ZWN1dGVkIHdpdGgKKyAgQ09ORklHX0ZJTEVTICAgID0gJENPTkZJR19GSUxFUworICBDT05GSUdfSEVBREVSUyAgPSAkQ09ORklHX0hFQURFUlMKKyAgQ09ORklHX0xJTktTICAgID0gJENPTkZJR19MSU5LUworICBDT05GSUdfQ09NTUFORFMgPSAkQ09ORklHX0NPTU1BTkRTCisgID4gJGFjX2NzX2ludm9jYXRpb24KK29uIGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAorCitfQUNFT0YKKyMKKyMgSU5JVC1DT01NQU5EUyBzZWN0aW9uLgorIworCitBTURFUF9UUlVFPSIiCithY19hdXhfZGlyPSIuIgorCitmb3IgYWNfY29uZmlnX3RhcmdldCBpbiAkYWNfY29uZmlnX3RhcmdldHMKK2RvCisgIGNhc2UgIiRhY19jb25maWdfdGFyZ2V0IiBpbgorICAjIEhhbmRsaW5nIG9mIGFyZ3VtZW50cy4KKyAgIk1ha2VmaWxlIiApIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBNYWtlZmlsZSIgOzsKKyAgIkNvbnNvbGVTZXJ2ZXIvTWFrZWZpbGUiICkgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIENvbnNvbGVTZXJ2ZXIvTWFrZWZpbGUiIDs7CisgICJDb25zb2xlU2VydmVyL2Zvby9NYWtlZmlsZSIgKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgQ29uc29sZVNlcnZlci9mb28vTWFrZWZpbGUiIDs7CisgICJleGFtcGxlL01ha2VmaWxlIiApIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBleGFtcGxlL01ha2VmaWxlIiA7OworICAiZXhhbXBsZS9jYWxjdWxhdG9yL01ha2VmaWxlIiApIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBleGFtcGxlL2NhbGN1bGF0b3IvTWFrZWZpbGUiIDs7CisgICJtb2RfZ3NvYXAvTWFrZWZpbGUiICkgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIG1vZF9nc29hcC9NYWtlZmlsZSIgOzsKKyAgImRlZmF1bHQtMSIgKSBDT05GSUdfQ09NTUFORFM9IiRDT05GSUdfQ09NTUFORFMgZGVmYXVsdC0xIiA7OworICAiY29uZmlnLmgiICkgQ09ORklHX0hFQURFUlM9IiRDT05GSUdfSEVBREVSUyBjb25maWcuaCIgOzsKKyAgKikgeyB7IGVjaG8gIiRhc19tZTo4NzU1OiBlcnJvcjogaW52YWxpZCBhcmd1bWVudDogJGFjX2NvbmZpZ190YXJnZXQiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBhcmd1bWVudDogJGFjX2NvbmZpZ190YXJnZXQiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworICBlc2FjCitkb25lCisKKyMgSWYgdGhlIHVzZXIgZGlkIG5vdCB1c2UgdGhlIGFyZ3VtZW50cyB0byBzcGVjaWZ5IHRoZSBpdGVtcyB0byBpbnN0YW50aWF0ZSwKKyMgdGhlbiB0aGUgZW52dmFyIGludGVyZmFjZSBpcyB1c2VkLiAgU2V0IG9ubHkgdGhvc2UgdGhhdCBhcmUgbm90LgorIyBXZSB1c2UgdGhlIGxvbmcgZm9ybSBmb3IgdGhlIGRlZmF1bHQgYXNzaWdubWVudCBiZWNhdXNlIG9mIGFuIGV4dHJlbWVseQorIyBiaXphcnJlIGJ1ZyBvbiBTdW5PUyA0LjEuMy4KK2lmICRhY19uZWVkX2RlZmF1bHRzOyB0aGVuCisgIHRlc3QgIiR7Q09ORklHX0ZJTEVTK3NldH0iID0gc2V0IHx8IENPTkZJR19GSUxFUz0kY29uZmlnX2ZpbGVzCisgIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0hFQURFUlM9JGNvbmZpZ19oZWFkZXJzCisgIHRlc3QgIiR7Q09ORklHX0NPTU1BTkRTK3NldH0iID0gc2V0IHx8IENPTkZJR19DT01NQU5EUz0kY29uZmlnX2NvbW1hbmRzCitmaQorCisjIENyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnksIGFuZCBob29rIGZvciBpdHMgcmVtb3ZhbCB1bmxlc3MgZGVidWdnaW5nLgorJGRlYnVnIHx8Cit7CisgIHRyYXAgJ2V4aXRfc3RhdHVzPSQ/OyBybSAtcmYgJHRtcCAmJiBleGl0ICRleGl0X3N0YXR1cycgMAorICB0cmFwICd7IChleGl0IDEpOyBleGl0IDE7IH0nIDEgMiAxMyAxNQorfQorCisjIENyZWF0ZSBhIChzZWN1cmUpIHRtcCBkaXJlY3RvcnkgZm9yIHRtcCBmaWxlcy4KKzogJHtUTVBESVI9L3RtcH0KK3sKKyAgdG1wPWAodW1hc2sgMDc3ICYmIG1rdGVtcCAtZCAtcSAiJFRNUERJUi9jc1hYWFhYWCIpIDI+L2Rldi9udWxsYCAmJgorICB0ZXN0IC1uICIkdG1wIiAmJiB0ZXN0IC1kICIkdG1wIgorfSAgfHwKK3sKKyAgdG1wPSRUTVBESVIvY3MkJC0kUkFORE9NCisgICh1bWFzayAwNzcgJiYgbWtkaXIgJHRtcCkKK30gfHwKK3sKKyAgIGVjaG8gIiRtZTogY2Fubm90IGNyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gJFRNUERJUiIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH0KK30KKworCisjCisjIENPTkZJR19GSUxFUyBzZWN0aW9uLgorIworCisjIE5vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIHNjcmlwdHMgaWYgdGhlcmUgYXJlIG5vIENPTkZJR19GSUxFUy4KKyMgVGhpcyBoYXBwZW5zIGZvciBpbnN0YW5jZSB3aGVuIC4vY29uZmlnLnN0YXR1cyBjb25maWcuaAoraWYgdGVzdCAtbiAiJENPTkZJR19GSUxFUyI7IHRoZW4KKyAgIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KKyAgc2VkICdzLyxAL0BALzsgcy9ALC9AQC87IHMvLDt0IHQkL0A7dCB0LzsgL0A7dCB0JC9zL1tcXCYsXS9cXCYvZzsKKyAgIHMvQEAvLEAvOyBzL0BAL0AsLzsgcy9AO3QgdCQvLDt0IHQvJyA+JHRtcC9zdWJzLnNlZCA8PFxDRU9GCitzLEBTSEVMTEAsL2Jpbi9zaCw7dCB0CitzLEBleGVjX3ByZWZpeEAsJHtwcmVmaXh9LDt0IHQKK3MsQHByZWZpeEAsL3Vzci9sb2NhbCw7dCB0CitzLEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCxzLHgseCwsO3QgdAorcyxAYmluZGlyQCwke2V4ZWNfcHJlZml4fS9iaW4sO3QgdAorcyxAc2JpbmRpckAsJHtleGVjX3ByZWZpeH0vc2Jpbiw7dCB0CitzLEBsaWJleGVjZGlyQCwke2V4ZWNfcHJlZml4fS9saWJleGVjLDt0IHQKK3MsQGRhdGFkaXJALCR7cHJlZml4fS9zaGFyZSw7dCB0CitzLEBzeXNjb25mZGlyQCwke3ByZWZpeH0vZXRjLDt0IHQKK3MsQHNoYXJlZHN0YXRlZGlyQCwke3ByZWZpeH0vY29tLDt0IHQKK3MsQGxvY2Fsc3RhdGVkaXJALCR7cHJlZml4fS92YXIsO3QgdAorcyxAbGliZGlyQCwke2V4ZWNfcHJlZml4fS9saWIsO3QgdAorcyxAaW5jbHVkZWRpckAsJHtwcmVmaXh9L2luY2x1ZGUsO3QgdAorcyxAb2xkaW5jbHVkZWRpckAsL3Vzci9pbmNsdWRlLDt0IHQKK3MsQGluZm9kaXJALCR7cHJlZml4fS9pbmZvLDt0IHQKK3MsQG1hbmRpckAsJHtwcmVmaXh9L21hbiw7dCB0CitzLEBQQUNLQUdFX05BTUVALCw7dCB0CitzLEBQQUNLQUdFX1RBUk5BTUVALCw7dCB0CitzLEBQQUNLQUdFX1ZFUlNJT05ALCw7dCB0CitzLEBQQUNLQUdFX1NUUklOR0AsLDt0IHQKK3MsQFBBQ0tBR0VfQlVHUkVQT1JUQCwsO3QgdAorcyxAYnVpbGRfYWxpYXNALGk2ODYtc3VzZS1saW51eCw7dCB0CitzLEBob3N0X2FsaWFzQCxpNjg2LXN1c2UtbGludXgsO3QgdAorcyxAdGFyZ2V0X2FsaWFzQCxpNjg2LXN1c2UtbGludXgsO3QgdAorcyxARUNIT19DQCwsO3QgdAorcyxARUNIT19OQCwtbiw7dCB0CitzLEBFQ0hPX1RALCw7dCB0CitzLEBQQVRIX1NFUEFSQVRPUkAsOiw7dCB0CitzLEBERUZTQCwtREhBVkVfQ09ORklHX0gsO3QgdAorcyxATElCU0AsLDt0IHQKK3MsQGJ1aWxkQCxpNjg2LXN1c2UtbGludXgsO3QgdAorcyxAYnVpbGRfY3B1QCxpNjg2LDt0IHQKK3MsQGJ1aWxkX3ZlbmRvckAsc3VzZSw7dCB0CitzLEBidWlsZF9vc0AsbGludXgsO3QgdAorcyxAaG9zdEAsaTY4Ni1zdXNlLWxpbnV4LDt0IHQKK3MsQGhvc3RfY3B1QCxpNjg2LDt0IHQKK3MsQGhvc3RfdmVuZG9yQCxzdXNlLDt0IHQKK3MsQGhvc3Rfb3NALGxpbnV4LDt0IHQKK3MsQHRhcmdldEAsaTY4Ni1zdXNlLWxpbnV4LDt0IHQKK3MsQHRhcmdldF9jcHVALGk2ODYsO3QgdAorcyxAdGFyZ2V0X3ZlbmRvckAsc3VzZSw7dCB0CitzLEB0YXJnZXRfb3NALGxpbnV4LDt0IHQKK3MsQElOU1RBTExfUFJPR1JBTUAsJHtJTlNUQUxMfSw7dCB0CitzLEBJTlNUQUxMX1NDUklQVEAsJHtJTlNUQUxMfSw7dCB0CitzLEBJTlNUQUxMX0RBVEFALCR7SU5TVEFMTH0gLW0gNjQ0LDt0IHQKK3MsQFBBQ0tBR0VALG1vZF9nc29hcCw7dCB0CitzLEBWRVJTSU9OQCwwLjAuNSw7dCB0CitzLEBFWEVFWFRALCw7dCB0CitzLEBPQkpFWFRALG8sO3QgdAorcyxAQUNMT0NBTEAsJHtTSEVMTH0gL2hvbWUvYWJlcmdlci9hcGFjaGVfZ3NvYXAuMC4wLjUvbWlzc2luZyAtLXJ1biBhY2xvY2FsLDt0IHQKK3MsQEFVVE9DT05GQCwke1NIRUxMfSAvaG9tZS9hYmVyZ2VyL2FwYWNoZV9nc29hcC4wLjAuNS9taXNzaW5nIC0tcnVuIGF1dG9jb25mLDt0IHQKK3MsQEFVVE9NQUtFQCwke1NIRUxMfSAvaG9tZS9hYmVyZ2VyL2FwYWNoZV9nc29hcC4wLjAuNS9taXNzaW5nIC0tcnVuIGF1dG9tYWtlLDt0IHQKK3MsQEFVVE9IRUFERVJALCR7U0hFTEx9IC9ob21lL2FiZXJnZXIvYXBhY2hlX2dzb2FwLjAuMC41L21pc3NpbmcgLS1ydW4gYXV0b2hlYWRlciw7dCB0CitzLEBNQUtFSU5GT0AsJHtTSEVMTH0gL2hvbWUvYWJlcmdlci9hcGFjaGVfZ3NvYXAuMC4wLjUvbWlzc2luZyAtLXJ1biBtYWtlaW5mbyw7dCB0CitzLEBBTVRBUkAsJHtTSEVMTH0gL2hvbWUvYWJlcmdlci9hcGFjaGVfZ3NvYXAuMC4wLjUvbWlzc2luZyAtLXJ1biB0YXIsO3QgdAorcyxAaW5zdGFsbF9zaEAsL2hvbWUvYWJlcmdlci9hcGFjaGVfZ3NvYXAuMC4wLjUvaW5zdGFsbC1zaCw7dCB0CitzLEBJTlNUQUxMX1NUUklQX1BST0dSQU1ALCR7U0hFTEx9ICQoaW5zdGFsbF9zaCkgLWMgLXMsO3QgdAorcyxAQVdLQCxnYXdrLDt0IHQKK3MsQFNFVF9NQUtFQCwsO3QgdAorcyxAQU1ERVBfVFJVRUAsLDt0IHQKK3MsQEFNREVQX0ZBTFNFQCwjLDt0IHQKK3MsQEFNREVQQkFDS1NMQVNIQCxcLDt0IHQKK3MsQERFUERJUkAsLmRlcHMsO3QgdAorcyxARVhJU1RTX0dTT0FQQCx5ZXMsO3QgdAorcyxAREVCVUdfVFJVRUAsIyw7dCB0CitzLEBERUJVR19GQUxTRUAsLDt0IHQKK3MsQENYWERFQlVHREVGSU5FU0AsLURfTkRFQlVHLDt0IHQKK3MsQEFQWFNfQ1hYX09QVElPTlNALCw7dCB0CitzLEBDQ0AsZ2NjLDt0IHQKK3MsQENGTEFHU0AsLWcgLU8yLDt0IHQKK3MsQExERkxBR1NALCw7dCB0CitzLEBDUFBGTEFHU0AsLDt0IHQKK3MsQGFjX2N0X0NDQCxnY2MsO3QgdAorcyxAYW1fX2luY2x1ZGVALGluY2x1ZGUsO3QgdAorcyxAYW1fX3F1b3RlQCwsO3QgdAorcyxAQ0NERVBNT0RFQCxkZXBtb2RlPWdjYyw7dCB0CitzLEBDUFBALGdjYyAtRSw7dCB0CitzLEBDWFhALGcrKyw7dCB0CitzLEBDWFhGTEFHU0AsIC1PMiw7dCB0CitzLEBhY19jdF9DWFhALGcrKyw7dCB0CitzLEBDWFhERVBNT0RFQCxkZXBtb2RlPWdjYyw7dCB0CitzLEBFWElTVFNfQVBYU0AseWVzLDt0IHQKK3MsQExOX1NALGxuIC1zLDt0IHQKK3MsQEVDSE9ALGVjaG8sO3QgdAorcyxAUkFOTElCQCxyYW5saWIsO3QgdAorcyxAYWNfY3RfUkFOTElCQCxyYW5saWIsO3QgdAorcyxAU1RSSVBALHN0cmlwLDt0IHQKK3MsQGFjX2N0X1NUUklQQCxzdHJpcCw7dCB0CitzLEBETExUT09MQCxkbGx0b29sLDt0IHQKK3MsQGFjX2N0X0RMTFRPT0xALCw7dCB0CitzLEBBU0AsYXMsO3QgdAorcyxAYWNfY3RfQVNALCw7dCB0CitzLEBPQkpEVU1QQCxvYmpkdW1wLDt0IHQKK3MsQGFjX2N0X09CSkRVTVBALCw7dCB0CitzLEBMSUJUT09MQCwkKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCw7dCB0CitzLEBMSUJUT09MX0RFUFNALC4vbHRtYWluLnNoLDt0IHQKK0NFT0YKKworICAjIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAorICAjIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KKyAgYWNfbWF4X3NlZF9saW5lcz00OAorICBhY19zZWRfZnJhZz0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KKyAgYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCisgIGFjX2VuZD0kYWNfbWF4X3NlZF9saW5lcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCisgIGFjX21vcmVfbGluZXM9OgorICBhY19zZWRfY21kcz0KKyAgd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCisgICAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCisgICAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgJHRtcC9zdWJzLnNlZCA+JHRtcC9zdWJzLmZyYWcKKyAgICBlbHNlCisgICAgICBzZWQgIiR7YWNfZW5kfXEiICR0bXAvc3Vicy5zZWQgPiR0bXAvc3Vicy5mcmFnCisgICAgZmkKKyAgICBpZiB0ZXN0ICEgLXMgJHRtcC9zdWJzLmZyYWc7IHRoZW4KKyAgICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKKyAgICBlbHNlCisgICAgICAjIFRoZSBwdXJwb3NlIG9mIHRoZSBsYWJlbCBhbmQgb2YgdGhlIGJyYW5jaGluZyBjb25kaXRpb24gaXMgdG8KKyAgICAgICMgc3BlZWQgdXAgdGhlIHNlZCBwcm9jZXNzaW5nIChpZiB0aGVyZSBhcmUgbm8gYEAnIGF0IGFsbCwgdGhlcmUKKyAgICAgICMgaXMgbm8gbmVlZCB0byBicm93c2UgYW55IG9mIHRoZSBzdWJzdGl0dXRpb25zKS4KKyAgICAgICMgVGhlc2UgYXJlIHRoZSB0d28gZXh0cmEgc2VkIGNvbW1hbmRzIG1lbnRpb25lZCBhYm92ZS4KKyAgICAgIChlY2hvICc6dAorICAvQFthLXpBLVpfXVthLXpBLVpfMC05XSpALyFiJyAmJiBjYXQgJHRtcC9zdWJzLmZyYWcpID4kdG1wL3N1YnMtJGFjX3NlZF9mcmFnLnNlZAorICAgICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICAJYWNfc2VkX2NtZHM9InNlZCAtZiAkdG1wL3N1YnMtJGFjX3NlZF9mcmFnLnNlZCIKKyAgICAgIGVsc2UKKyAgCWFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgJHRtcC9zdWJzLSRhY19zZWRfZnJhZy5zZWQiCisgICAgICBmaQorICAgICAgYWNfc2VkX2ZyYWc9YGV4cHIgJGFjX3NlZF9mcmFnICsgMWAKKyAgICAgIGFjX2JlZz0kYWNfZW5kCisgICAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2xpbmVzYAorICAgIGZpCisgIGRvbmUKKyAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICAgIGFjX3NlZF9jbWRzPWNhdAorICBmaQorZmkgIyB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIgorCitmb3IgYWNfZmlsZSBpbiA6ICRDT05GSUdfRklMRVM7IGRvIHRlc3QgIngkYWNfZmlsZSIgPSB4OiAmJiBjb250aW51ZQorICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgLSB8ICo6LSB8ICo6LToqICkgIyBpbnB1dCBmcm9tIHN0ZGluCisgICAgICAgIGNhdCA+JHRtcC9zdGRpbgorICAgICAgICBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSIgfCBzZWQgJ3MsW146XSo6LCwnYAorICAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSIgfCBzZWQgJ3MsOi4qLCwnYCA7OworICAqOiogKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSIgfCBzZWQgJ3MsW146XSo6LCwnYAorICAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSIgfCBzZWQgJ3MsOi4qLCwnYCA7OworICAqICkgICBhY19maWxlX2luPSRhY19maWxlLmluIDs7CisgIGVzYWMKKworICAjIENvbXB1dGUgQHNyY2RpckAsIEB0b3Bfc3JjZGlyQCwgYW5kIEBJTlNUQUxMQCBmb3Igc3ViZGlyZWN0b3JpZXMuCisgIGFjX2Rpcj1gJGFzX2V4cHIgWCIkYWNfZmlsZSIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKyAgICAgICAgIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisgICAgICAgICBYIiRhY19maWxlIiA6ICdYXCgvL1wpJCcgXHwgXAorICAgICAgICAgWCIkYWNfZmlsZSIgOiAnWFwoL1wpJyBcfCBcCisgICAgICAgICAuICAgICA6ICdcKC5cKScgMj4vZGV2L251bGwgfHwKK2VjaG8gWCIkYWNfZmlsZSIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKVteL10uKi97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKSQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wpLioveyBzLy9cMS87IHE7IH0KKyAgCSAgcy8uKi8uLzsgcSdgCisgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICAgIHsgY2FzZSAiJGFjX2RpciIgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSogKSBhc19pbmNyX2Rpcj07OworICAqKSAgICAgICAgICAgICAgICAgICAgICBhc19pbmNyX2Rpcj0uOzsKK2VzYWMKK2FzX2R1bW15PSIkYWNfZGlyIgorZm9yIGFzX21rZGlyX2RpciBpbiBgSUZTPScvXFwnOyBzZXQgWCAkYXNfZHVtbXk7IHNoaWZ0OyBlY2hvICIkQCJgOyBkbworICBjYXNlICRhc19ta2Rpcl9kaXIgaW4KKyAgICAjIFNraXAgRE9TIGRyaXZlc3BlYworICAgID86KSBhc19pbmNyX2Rpcj0kYXNfbWtkaXJfZGlyIDs7CisgICAgKikKKyAgICAgIGFzX2luY3JfZGlyPSRhc19pbmNyX2Rpci8kYXNfbWtkaXJfZGlyCisgICAgICB0ZXN0IC1kICIkYXNfaW5jcl9kaXIiIHx8IG1rZGlyICIkYXNfaW5jcl9kaXIiCisgICAgOzsKKyAgZXNhYworZG9uZTsgfQorCisgICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzLF5cLi8sLCdgIgorICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCisgICAgYWNfZG90cz1gZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzLC9bXi9dKiwuLi8sZydgCisgIGVsc2UKKyAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQorICBmaQorCisgIGNhc2UgJHNyY2RpciBpbgorICAuKSAgYWNfc3JjZGlyPS4KKyAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbgorICAgICAgICAgYWNfdG9wX3NyY2Rpcj0uCisgICAgICBlbHNlCisgICAgICAgICBhY190b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzIHwgc2VkICdzLC8kLCwnYAorICAgICAgZmkgOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKQorICAgICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKKyAgICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpciA7OworICAqKSAjIFJlbGF0aXZlIHBhdGguCisgICAgYWNfc3JjZGlyPSRhY19kb3RzJHNyY2RpciRhY19kaXJfc3VmZml4CisgICAgYWNfdG9wX3NyY2Rpcj0kYWNfZG90cyRzcmNkaXIgOzsKKyAgZXNhYworCisgIGNhc2UgJElOU1RBTEwgaW4KKyAgW1xcLyRdKiB8ID86W1xcL10qICkgYWNfSU5TVEFMTD0kSU5TVEFMTCA7OworICAqKSBhY19JTlNUQUxMPSRhY19kb3RzJElOU1RBTEwgOzsKKyAgZXNhYworCisgIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KKyAgICB7IGVjaG8gIiRhc19tZTo5MDE3OiBjcmVhdGluZyAkYWNfZmlsZSIgPiY1CitlY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19maWxlIiA+JjY7fQorICAgIHJtIC1mICIkYWNfZmlsZSIKKyAgZmkKKyAgIyBMZXQncyBzdGlsbCBwcmV0ZW5kIGl0IGlzIGBjb25maWd1cmUnIHdoaWNoIGluc3RhbnRpYXRlcyAoaS5lLiwgZG9uJ3QKKyAgIyB1c2UgJGFzX21lKSwgcGVvcGxlIHdvdWxkIGJlIHN1cnByaXNlZCB0byByZWFkOgorICAjICAgIC8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlnLnN0YXR1cy4gICovCisgIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VkICdzLC4qLywsJ2AgYnkgY29uZmlndXJlLiIKKworICAjIEZpcnN0IGxvb2sgZm9yIHRoZSBpbnB1dCBmaWxlcyBpbiB0aGUgYnVpbGQgdHJlZSwgb3RoZXJ3aXNlIGluIHRoZQorICAjIHNyYyB0cmVlLgorICBhY19maWxlX2lucHV0cz1gSUZTPToKKyAgICBmb3IgZiBpbiAkYWNfZmlsZV9pbjsgZG8KKyAgICAgIGNhc2UgJGYgaW4KKyAgICAgIC0pIGVjaG8gJHRtcC9zdGRpbiA7OworICAgICAgW1xcLyRdKikKKyAgICAgICAgICMgQWJzb2x1dGUgKGNhbid0IGJlIERPUy1zdHlsZSwgYXMgSUZTPTopCisgICAgICAgICB0ZXN0IC1mICIkZiIgfHwgeyB7IGVjaG8gIiRhc19tZTo5MDM1OiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGYiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGYiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICAgICAgIGVjaG8gJGY7OworICAgICAgKikgIyBSZWxhdGl2ZQorICAgICAgICAgaWYgdGVzdCAtZiAiJGYiOyB0aGVuCisgICAgICAgICAgICMgQnVpbGQgdHJlZQorICAgICAgICAgICBlY2hvICRmCisgICAgICAgICBlbGlmIHRlc3QgLWYgIiRzcmNkaXIvJGYiOyB0aGVuCisgICAgICAgICAgICMgU291cmNlIHRyZWUKKyAgICAgICAgICAgZWNobyAkc3JjZGlyLyRmCisgICAgICAgICBlbHNlCisgICAgICAgICAgICMgL2Rldi9udWxsIHRyZWUKKyAgICAgICAgICAgeyB7IGVjaG8gIiRhc19tZTo5MDQ4OiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGYiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGYiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICAgICAgIGZpOzsKKyAgICAgIGVzYWMKKyAgICBkb25lYCB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KKyAgc2VkICIvXlsgCV0qVlBBVEhbIAldKj0veworcy86KlwkKHNyY2Rpcik6Ki86LzsKK3MvOipcJHtzcmNkaXJ9OiovOi87CitzLzoqQHNyY2RpckA6Ki86LzsKK3MvXlwoW149XSo9WyAJXSpcKToqL1wxLzsKK3MvOiokLy87CitzL15bXj1dKj1bIAldKiQvLzsKK30KKworOnQKKy9AW2EtekEtWl9dW2EtekEtWl8wLTldKkAvIWIKK3MsQGNvbmZpZ3VyZV9pbnB1dEAsJGNvbmZpZ3VyZV9pbnB1dCw7dCB0CitzLEBzcmNkaXJALCRhY19zcmNkaXIsO3QgdAorcyxAdG9wX3NyY2RpckAsJGFjX3RvcF9zcmNkaXIsO3QgdAorcyxASU5TVEFMTEAsJGFjX0lOU1RBTEwsO3QgdAorIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiR0bXAvb3V0CisgIHJtIC1mICR0bXAvc3RkaW4KKyAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgorICAgIG12ICR0bXAvb3V0ICRhY19maWxlCisgIGVsc2UKKyAgICBjYXQgJHRtcC9vdXQKKyAgICBybSAtZiAkdG1wL291dAorICBmaQorCitkb25lCisKKyMKKyMgQ09ORklHX0hFQURFUiBzZWN0aW9uLgorIworCisjIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQorIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCBhbmQgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgorIworIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgorYWNfZEE9J3MsXlwoWyAJXSpcKSNcKFsgCV0qZGVmaW5lWyAJXVsgCV0qXCknCithY19kQj0nWyAJXS4qJCxcMSNcMicKK2FjX2RDPScgJworYWNfZEQ9Jyw7dCcKKyMgYWNfdSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGhvdXQgdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCithY191QT0ncyxeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKK2FjX3VCPSckLFwxI1wyZGVmaW5lXDMnCithY191Qz0nICcKK2FjX3VEPScsO3QnCisKK2ZvciBhY19maWxlIGluIDogJENPTkZJR19IRUFERVJTOyBkbyB0ZXN0ICJ4JGFjX2ZpbGUiID0geDogJiYgY29udGludWUKKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICRhY19maWxlIGluCisgIC0gfCAqOi0gfCAqOi06KiApICMgaW5wdXQgZnJvbSBzdGRpbgorICAgICAgICBjYXQgPiR0bXAvc3RkaW4KKyAgICAgICAgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLFteOl0qOiwsJ2AKKyAgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLDouKiwsJ2AgOzsKKyAgKjoqICkgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLFteOl0qOiwsJ2AKKyAgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLDouKiwsJ2AgOzsKKyAgKiApICAgYWNfZmlsZV9pbj0kYWNfZmlsZS5pbiA7OworICBlc2FjCisKKyAgdGVzdCB4IiRhY19maWxlIiAhPSB4LSAmJiB7IGVjaG8gIiRhc19tZTo5MTA5OiBjcmVhdGluZyAkYWNfZmlsZSIgPiY1CitlY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19maWxlIiA+JjY7fQorCisgICMgRmlyc3QgbG9vayBmb3IgdGhlIGlucHV0IGZpbGVzIGluIHRoZSBidWlsZCB0cmVlLCBvdGhlcndpc2UgaW4gdGhlCisgICMgc3JjIHRyZWUuCisgIGFjX2ZpbGVfaW5wdXRzPWBJRlM9OgorICAgIGZvciBmIGluICRhY19maWxlX2luOyBkbworICAgICAgY2FzZSAkZiBpbgorICAgICAgLSkgZWNobyAkdG1wL3N0ZGluIDs7CisgICAgICBbXFwvJF0qKQorICAgICAgICAgIyBBYnNvbHV0ZSAoY2FuJ3QgYmUgRE9TLXN0eWxlLCBhcyBJRlM9OikKKyAgICAgICAgIHRlc3QgLWYgIiRmIiB8fCB7IHsgZWNobyAiJGFzX21lOjkxMjA6IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgICAgICAgZWNobyAkZjs7CisgICAgICAqKSAjIFJlbGF0aXZlCisgICAgICAgICBpZiB0ZXN0IC1mICIkZiI7IHRoZW4KKyAgICAgICAgICAgIyBCdWlsZCB0cmVlCisgICAgICAgICAgIGVjaG8gJGYKKyAgICAgICAgIGVsaWYgdGVzdCAtZiAiJHNyY2Rpci8kZiI7IHRoZW4KKyAgICAgICAgICAgIyBTb3VyY2UgdHJlZQorICAgICAgICAgICBlY2hvICRzcmNkaXIvJGYKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIyAvZGV2L251bGwgdHJlZQorICAgICAgICAgICB7IHsgZWNobyAiJGFzX21lOjkxMzM6IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgICAgICAgZmk7OworICAgICAgZXNhYworICAgIGRvbmVgIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorICAjIFJlbW92ZSB0aGUgdHJhaWxpbmcgc3BhY2VzLgorICBzZWQgJ3MvWyAJXSokLy8nICRhY19maWxlX2lucHV0cyA+JHRtcC9pbgorCisgICMgSGFuZGxlIGFsbCB0aGUgI2RlZmluZSB0ZW1wbGF0ZXMgb25seSBpZiBuZWNlc3NhcnkuCisgIGlmIGVncmVwICJeWyAJXSojWyAJXSpkZWZpbmUiICR0bXAvaW4gPi9kZXYvbnVsbDsgdGhlbgorICAjIElmIHRoZXJlIGFyZSBubyBkZWZpbmVzLCB3ZSBtYXkgaGF2ZSBhbiBlbXB0eSBpZi9maQorICA6CisgIGNhdCA+JHRtcC9kZWZpbmVzLnNlZCA8PENFT0YKKy9eWyAJXSojWyAJXSpkZWZpbmUvIWIKK3QgY2xyCis6IGNscgorJHthY19kQX1QQUNLQUdFJHthY19kQn1QQUNLQUdFJHthY19kQ30ibW9kX2dzb2FwIiR7YWNfZER9Ciske2FjX2RBfVZFUlNJT04ke2FjX2RCfVZFUlNJT04ke2FjX2RDfSIwLjAuNSIke2FjX2REfQorJHthY19kQX1IQVZFX0RMRkNOX0gke2FjX2RCfUhBVkVfRExGQ05fSCR7YWNfZEN9MSR7YWNfZER9Ciske2FjX2RBfUhBVkVfR0VUQ1dEJHthY19kQn1IQVZFX0dFVENXRCR7YWNfZEN9MSR7YWNfZER9Ciske2FjX2RBfUhBVkVfTUVNU0VUJHthY19kQn1IQVZFX01FTVNFVCR7YWNfZEN9MSR7YWNfZER9Ciske2FjX2RBfVNURENfSEVBREVSUyR7YWNfZEJ9U1REQ19IRUFERVJTJHthY19kQ30xJHthY19kRH0KKyR7YWNfZEF9SEFWRV9TWVNfVFlQRVNfSCR7YWNfZEJ9SEFWRV9TWVNfVFlQRVNfSCR7YWNfZEN9MSR7YWNfZER9Ciske2FjX2RBfUhBVkVfU1lTX1NUQVRfSCR7YWNfZEJ9SEFWRV9TWVNfU1RBVF9IJHthY19kQ30xJHthY19kRH0KKyR7YWNfZEF9SEFWRV9TVERMSUJfSCR7YWNfZEJ9SEFWRV9TVERMSUJfSCR7YWNfZEN9MSR7YWNfZER9Ciske2FjX2RBfUhBVkVfU1RSSU5HX0gke2FjX2RCfUhBVkVfU1RSSU5HX0gke2FjX2RDfTEke2FjX2REfQorJHthY19kQX1IQVZFX01FTU9SWV9IJHthY19kQn1IQVZFX01FTU9SWV9IJHthY19kQ30xJHthY19kRH0KKyR7YWNfZEF9SEFWRV9TVFJJTkdTX0gke2FjX2RCfUhBVkVfU1RSSU5HU19IJHthY19kQ30xJHthY19kRH0KKyR7YWNfZEF9SEFWRV9JTlRUWVBFU19IJHthY19kQn1IQVZFX0lOVFRZUEVTX0gke2FjX2RDfTEke2FjX2REfQorJHthY19kQX1IQVZFX1NURElOVF9IJHthY19kQn1IQVZFX1NURElOVF9IJHthY19kQ30xJHthY19kRH0KKyR7YWNfZEF9SEFWRV9VTklTVERfSCR7YWNfZEJ9SEFWRV9VTklTVERfSCR7YWNfZEN9MSR7YWNfZER9Ciske2FjX2RBfUhBVkVfU1lTX1RZUEVTX0gke2FjX2RCfUhBVkVfU1lTX1RZUEVTX0gke2FjX2RDfTEke2FjX2REfQorJHthY19kQX1IQVZFX1NZU19TT0NLRVRfSCR7YWNfZEJ9SEFWRV9TWVNfU09DS0VUX0gke2FjX2RDfTEke2FjX2REfQorJHthY19kQX1IQVZFX1VOSVNURF9IJHthY19kQn1IQVZFX1VOSVNURF9IJHthY19kQ30xJHthY19kRH0KKyR7YWNfZEF9SEFWRV9ORVRJTkVUX0lOX0gke2FjX2RCfUhBVkVfTkVUSU5FVF9JTl9IJHthY19kQ30xJHthY19kRH0KKyR7YWNfZEF9SEFWRV9BUlBBX0lORVRfSCR7YWNfZEJ9SEFWRV9BUlBBX0lORVRfSCR7YWNfZEN9MSR7YWNfZER9Ciske2FjX2RBfUhBVkVfTkVUREJfSCR7YWNfZEJ9SEFWRV9ORVREQl9IJHthY19kQ30xJHthY19kRH0KKyR7YWNfZEF9SEFWRV9TWVNfSU9DVExfSCR7YWNfZEJ9SEFWRV9TWVNfSU9DVExfSCR7YWNfZEN9MSR7YWNfZER9Ciske2FjX2RBfUhBVkVfRVJSTk9fSCR7YWNfZEJ9SEFWRV9FUlJOT19IJHthY19kQ30xJHthY19kRH0KKyR7YWNfZEF9SEFWRV9TWVNfVElNRV9IJHthY19kQn1IQVZFX1NZU19USU1FX0gke2FjX2RDfTEke2FjX2REfQorJHthY19kQX1IQVZFX0xURExfSCR7YWNfZEJ9SEFWRV9MVERMX0gke2FjX2RDfTEke2FjX2REfQorJHthY19kQX1IQVZFX1NURFNPQVAyX0gke2FjX2RCfUhBVkVfU1REU09BUDJfSCR7YWNfZEN9MSR7YWNfZER9CitDRU9GCisgIHNlZCAtZiAkdG1wL2RlZmluZXMuc2VkICR0bXAvaW4gPiR0bXAvb3V0CisgIHJtIC1mICR0bXAvaW4KKyAgbXYgJHRtcC9vdXQgJHRtcC9pbgorCisgIGZpICMgZWdyZXAKKworICAjIEhhbmRsZSBhbGwgdGhlICN1bmRlZiB0ZW1wbGF0ZXMKKyAgY2F0ID4kdG1wL3VuZGVmcy5zZWQgPDxDRU9GCisvXlsgCV0qI1sgCV0qdW5kZWYvIWIKK3QgY2xyCis6IGNscgorJHthY191QX1QQUNLQUdFJHthY191Qn1QQUNLQUdFJHthY191Q30ibW9kX2dzb2FwIiR7YWNfdUR9Ciske2FjX3VBfVZFUlNJT04ke2FjX3VCfVZFUlNJT04ke2FjX3VDfSIwLjAuNSIke2FjX3VEfQorJHthY191QX1IQVZFX0RMRkNOX0gke2FjX3VCfUhBVkVfRExGQ05fSCR7YWNfdUN9MSR7YWNfdUR9Ciske2FjX3VBfUhBVkVfR0VUQ1dEJHthY191Qn1IQVZFX0dFVENXRCR7YWNfdUN9MSR7YWNfdUR9Ciske2FjX3VBfUhBVkVfTUVNU0VUJHthY191Qn1IQVZFX01FTVNFVCR7YWNfdUN9MSR7YWNfdUR9Ciske2FjX3VBfVNURENfSEVBREVSUyR7YWNfdUJ9U1REQ19IRUFERVJTJHthY191Q30xJHthY191RH0KKyR7YWNfdUF9SEFWRV9TWVNfVFlQRVNfSCR7YWNfdUJ9SEFWRV9TWVNfVFlQRVNfSCR7YWNfdUN9MSR7YWNfdUR9Ciske2FjX3VBfUhBVkVfU1lTX1NUQVRfSCR7YWNfdUJ9SEFWRV9TWVNfU1RBVF9IJHthY191Q30xJHthY191RH0KKyR7YWNfdUF9SEFWRV9TVERMSUJfSCR7YWNfdUJ9SEFWRV9TVERMSUJfSCR7YWNfdUN9MSR7YWNfdUR9Ciske2FjX3VBfUhBVkVfU1RSSU5HX0gke2FjX3VCfUhBVkVfU1RSSU5HX0gke2FjX3VDfTEke2FjX3VEfQorJHthY191QX1IQVZFX01FTU9SWV9IJHthY191Qn1IQVZFX01FTU9SWV9IJHthY191Q30xJHthY191RH0KKyR7YWNfdUF9SEFWRV9TVFJJTkdTX0gke2FjX3VCfUhBVkVfU1RSSU5HU19IJHthY191Q30xJHthY191RH0KKyR7YWNfdUF9SEFWRV9JTlRUWVBFU19IJHthY191Qn1IQVZFX0lOVFRZUEVTX0gke2FjX3VDfTEke2FjX3VEfQorJHthY191QX1IQVZFX1NURElOVF9IJHthY191Qn1IQVZFX1NURElOVF9IJHthY191Q30xJHthY191RH0KKyR7YWNfdUF9SEFWRV9VTklTVERfSCR7YWNfdUJ9SEFWRV9VTklTVERfSCR7YWNfdUN9MSR7YWNfdUR9Ciske2FjX3VBfUhBVkVfU1lTX1RZUEVTX0gke2FjX3VCfUhBVkVfU1lTX1RZUEVTX0gke2FjX3VDfTEke2FjX3VEfQorJHthY191QX1IQVZFX1NZU19TT0NLRVRfSCR7YWNfdUJ9SEFWRV9TWVNfU09DS0VUX0gke2FjX3VDfTEke2FjX3VEfQorJHthY191QX1IQVZFX1VOSVNURF9IJHthY191Qn1IQVZFX1VOSVNURF9IJHthY191Q30xJHthY191RH0KKyR7YWNfdUF9SEFWRV9ORVRJTkVUX0lOX0gke2FjX3VCfUhBVkVfTkVUSU5FVF9JTl9IJHthY191Q30xJHthY191RH0KKyR7YWNfdUF9SEFWRV9BUlBBX0lORVRfSCR7YWNfdUJ9SEFWRV9BUlBBX0lORVRfSCR7YWNfdUN9MSR7YWNfdUR9Ciske2FjX3VBfUhBVkVfTkVUREJfSCR7YWNfdUJ9SEFWRV9ORVREQl9IJHthY191Q30xJHthY191RH0KKyR7YWNfdUF9SEFWRV9TWVNfSU9DVExfSCR7YWNfdUJ9SEFWRV9TWVNfSU9DVExfSCR7YWNfdUN9MSR7YWNfdUR9Ciske2FjX3VBfUhBVkVfRVJSTk9fSCR7YWNfdUJ9SEFWRV9FUlJOT19IJHthY191Q30xJHthY191RH0KKyR7YWNfdUF9SEFWRV9TWVNfVElNRV9IJHthY191Qn1IQVZFX1NZU19USU1FX0gke2FjX3VDfTEke2FjX3VEfQorJHthY191QX1IQVZFX0xURExfSCR7YWNfdUJ9SEFWRV9MVERMX0gke2FjX3VDfTEke2FjX3VEfQorJHthY191QX1IQVZFX1NURFNPQVAyX0gke2FjX3VCfUhBVkVfU1REU09BUDJfSCR7YWNfdUN9MSR7YWNfdUR9CitzLF5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiwvKiAmICovLAorQ0VPRgorICBzZWQgLWYgJHRtcC91bmRlZnMuc2VkICR0bXAvaW4gPiR0bXAvb3V0CisgIHJtIC1mICR0bXAvaW4KKyAgbXYgJHRtcC9vdXQgJHRtcC9pbgorCisgICMgTGV0J3Mgc3RpbGwgcHJldGVuZCBpdCBpcyBgY29uZmlndXJlJyB3aGljaCBpbnN0YW50aWF0ZXMgKGkuZS4sIGRvbid0CisgICMgdXNlICRhc19tZSksIHBlb3BsZSB3b3VsZCBiZSBzdXJwcmlzZWQgdG8gcmVhZDoKKyAgIyAgICAvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZy5zdGF0dXMuICAqLworICBpZiB0ZXN0IHgiJGFjX2ZpbGUiID0geC07IHRoZW4KKyAgICBlY2hvICIvKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiR0bXAvY29uZmlnLmgKKyAgZWxzZQorICAgIGVjaG8gIi8qICRhY19maWxlLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgKi8iID4kdG1wL2NvbmZpZy5oCisgIGZpCisgIGNhdCAkdG1wL2luID4+JHRtcC9jb25maWcuaAorICBybSAtZiAkdG1wL2luCisgIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KKyAgICBpZiBjbXAgLXMgJGFjX2ZpbGUgJHRtcC9jb25maWcuaCAyPi9kZXYvbnVsbDsgdGhlbgorICAgICAgeyBlY2hvICIkYXNfbWU6OTI1MDogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjUKK2VjaG8gIiRhc19tZTogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjY7fQorICAgIGVsc2UKKyAgICAgIGFjX2Rpcj1gJGFzX2V4cHIgWCIkYWNfZmlsZSIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKyAgICAgICAgIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisgICAgICAgICBYIiRhY19maWxlIiA6ICdYXCgvL1wpJCcgXHwgXAorICAgICAgICAgWCIkYWNfZmlsZSIgOiAnWFwoL1wpJyBcfCBcCisgICAgICAgICAuICAgICA6ICdcKC5cKScgMj4vZGV2L251bGwgfHwKK2VjaG8gWCIkYWNfZmlsZSIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKVteL10uKi97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKSQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wpLioveyBzLy9cMS87IHE7IH0KKyAgCSAgcy8uKi8uLzsgcSdgCisgICAgICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgICAgICAgeyBjYXNlICIkYWNfZGlyIiBpbgorICBbXFwvXSogfCA/OltcXC9dKiApIGFzX2luY3JfZGlyPTs7CisgICopICAgICAgICAgICAgICAgICAgICAgIGFzX2luY3JfZGlyPS47OworZXNhYworYXNfZHVtbXk9IiRhY19kaXIiCitmb3IgYXNfbWtkaXJfZGlyIGluIGBJRlM9Jy9cXCc7IHNldCBYICRhc19kdW1teTsgc2hpZnQ7IGVjaG8gIiRAImA7IGRvCisgIGNhc2UgJGFzX21rZGlyX2RpciBpbgorICAgICMgU2tpcCBET1MgZHJpdmVzcGVjCisgICAgPzopIGFzX2luY3JfZGlyPSRhc19ta2Rpcl9kaXIgOzsKKyAgICAqKQorICAgICAgYXNfaW5jcl9kaXI9JGFzX2luY3JfZGlyLyRhc19ta2Rpcl9kaXIKKyAgICAgIHRlc3QgLWQgIiRhc19pbmNyX2RpciIgfHwgbWtkaXIgIiRhc19pbmNyX2RpciIKKyAgICA7OworICBlc2FjCitkb25lOyB9CisKKyAgICAgIGZpCisgICAgICBybSAtZiAkYWNfZmlsZQorICAgICAgbXYgJHRtcC9jb25maWcuaCAkYWNfZmlsZQorICAgIGZpCisgIGVsc2UKKyAgICBjYXQgJHRtcC9jb25maWcuaAorICAgIHJtIC1mICR0bXAvY29uZmlnLmgKKyAgZmkKKyAgIyBSdW4gdGhlIGNvbW1hbmRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZS4KKyAgY2FzZSAkYWNfZmlsZSBpbgorICAgIGNvbmZpZy5oICkgIyB1cGRhdGUgdGhlIHRpbWVzdGFtcAorZWNobyB0aW1lc3RhbXAgPiIuL3N0YW1wLWgxIgorIDs7CisgIGVzYWMKK2RvbmUKKworIworIyBDT05GSUdfQ09NTUFORFMgc2VjdGlvbi4KKyMKK2ZvciBhY19maWxlIGluIDogJENPTkZJR19DT01NQU5EUzsgZG8gdGVzdCAieCRhY19maWxlIiA9IHg6ICYmIGNvbnRpbnVlCisgIGFjX2Rlc3Q9YGVjaG8gIiRhY19maWxlIiB8IHNlZCAncyw6LiosLCdgCisgIGFjX3NvdXJjZT1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLFteOl0qOiwsJ2AKKworICBjYXNlICRhY19kZXN0IGluCisgICAgZGVmYXVsdC0xICkKK3Rlc3QgeCIkQU1ERVBfVFJVRSIgIT0geCIiIHx8Citmb3IgbWYgaW4gJENPTkZJR19GSUxFUzsgZG8KKyAgY2FzZSAiJG1mIiBpbgorICBNYWtlZmlsZSkgZGlycGFydD0uOzsKKyAgKi9NYWtlZmlsZSkgZGlycGFydD1gZWNobyAiJG1mIiB8IHNlZCAtZSAnc3wvW14vXSokfHwnYDs7CisgICopIGNvbnRpbnVlOzsKKyAgZXNhYworICBncmVwICdeREVQX0ZJTEVTICo9ICpbXiAjXScgPCAiJG1mIiA+IC9kZXYvbnVsbCB8fCBjb250aW51ZQorICAjIEV4dHJhY3QgdGhlIGRlZmluaXRpb24gb2YgREVQX0ZJTEVTIGZyb20gdGhlIE1ha2VmaWxlIHdpdGhvdXQKKyAgIyBydW5uaW5nIGBtYWtlJy4KKyAgREVQRElSPWBzZWQgLW4gLWUgJy9eREVQRElSID0gLyBzLy8vcCcgPCAiJG1mImAKKyAgdGVzdCAteiAiJERFUERJUiIgJiYgY29udGludWUKKyAgIyBXaGVuIHVzaW5nIGFuc2kya25yLCBVIG1heSBiZSBlbXB0eSBvciBhbiB1bmRlcnNjb3JlOyBleHBhbmQgaXQKKyAgVT1gc2VkIC1uIC1lICcvXlUgPSAvIHMvLy9wJyA8ICIkbWYiYAorICB0ZXN0IC1kICIkZGlycGFydC8kREVQRElSIiB8fCBta2RpciAiJGRpcnBhcnQvJERFUERJUiIKKyAgIyBXZSBpbnZva2Ugc2VkIHR3aWNlIGJlY2F1c2UgaXQgaXMgdGhlIHNpbXBsZXN0IGFwcHJvYWNoIHRvCisgICMgY2hhbmdpbmcgJChERVBESVIpIHRvIGl0cyBhY3R1YWwgdmFsdWUgaW4gdGhlIGV4cGFuc2lvbi4KKyAgZm9yIGZpbGUgaW4gYHNlZCAtbiAtZSAnCisgICAgL15ERVBfRklMRVMgPSAuKlxcXFwkLyB7CisgICAgICBzL15ERVBfRklMRVMgPSAvLworICAgICAgOmxvb3AKKwlzL1xcXFwkLy8KKwlwCisJbgorCS9cXFxcJC8gYiBsb29wCisgICAgICBwCisgICAgfQorICAgIC9eREVQX0ZJTEVTID0gLyBzL15ERVBfRklMRVMgPSAvL3AnIDwgIiRtZiIgfCBcCisgICAgICAgc2VkIC1lICdzL1wkKERFUERJUikvJyIkREVQRElSIicvZycgLWUgJ3MvXCRVLyciJFUiJy9nJ2A7IGRvCisgICAgIyBNYWtlIHN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHMuCisgICAgdGVzdCAtZiAiJGRpcnBhcnQvJGZpbGUiICYmIGNvbnRpbnVlCisgICAgZmRpcj1gZWNobyAiJGZpbGUiIHwgc2VkIC1lICdzfC9bXi9dKiR8fCdgCisgICAgJGFjX2F1eF9kaXIvbWtpbnN0YWxsZGlycyAiJGRpcnBhcnQvJGZkaXIiID4gL2Rldi9udWxsIDI+JjEKKyAgICAjIGVjaG8gImNyZWF0aW5nICRkaXJwYXJ0LyRmaWxlIgorICAgIGVjaG8gJyMgZHVtbXknID4gIiRkaXJwYXJ0LyRmaWxlIgorICBkb25lCitkb25lCisgOzsKKyAgZXNhYworZG9uZQorCit7IChleGl0IDApOyBleGl0IDA7IH0KZGlmZiAtLWdpdCBhL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9jb25maWcuc3ViIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL2NvbmZpZy5zdWIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODNmNGIwMQotLS0gL2Rldi9udWxsCisrKyBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9jb25maWcuc3ViCkBAIC0wLDAgKzEsMTQxMCBAQAorIyEgL2Jpbi9zaAorIyBDb25maWd1cmF0aW9uIHZhbGlkYXRpb24gc3Vicm91dGluZSBzY3JpcHQuCisjICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxCisjICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK3RpbWVzdGFtcD0nMjAwMS0wOC0xMycKKworIyBUaGlzIGZpbGUgaXMgKGluIHByaW5jaXBsZSkgY29tbW9uIHRvIEFMTCBHTlUgc29mdHdhcmUuCisjIFRoZSBwcmVzZW5jZSBvZiBhIG1hY2hpbmUgaW4gdGhpcyBmaWxlIHN1Z2dlc3RzIHRoYXQgU09NRSBHTlUgc29mdHdhcmUKKyMgY2FuIGhhbmRsZSB0aGF0IG1hY2hpbmUuICBJdCBkb2VzIG5vdCBpbXBseSBBTEwgR05VIHNvZnR3YXJlIGNhbi4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorIyBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKKyMgUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uCisjCisjIENvbmZpZ3VyYXRpb24gc3Vicm91dGluZSB0byB2YWxpZGF0ZSBhbmQgY2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiB0eXBlLgorIyBTdXBwbHkgdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIHR5cGUgYXMgYW4gYXJndW1lbnQuCisjIElmIGl0IGlzIGludmFsaWQsIHdlIHByaW50IGFuIGVycm9yIG1lc3NhZ2Ugb24gc3RkZXJyIGFuZCBleGl0IHdpdGggY29kZSAxLgorIyBPdGhlcndpc2UsIHdlIHByaW50IHRoZSBjYW5vbmljYWwgY29uZmlnIHR5cGUgb24gc3Rkb3V0IGFuZCBzdWNjZWVkLgorCisjIFRoaXMgZmlsZSBpcyBzdXBwb3NlZCB0byBiZSB0aGUgc2FtZSBmb3IgYWxsIEdOVSBwYWNrYWdlcworIyBhbmQgcmVjb2duaXplIGFsbCB0aGUgQ1BVIHR5cGVzLCBzeXN0ZW0gdHlwZXMgYW5kIGFsaWFzZXMKKyMgdGhhdCBhcmUgbWVhbmluZ2Z1bCB3aXRoICphbnkqIEdOVSBzb2Z0d2FyZS4KKyMgRWFjaCBwYWNrYWdlIGlzIHJlc3BvbnNpYmxlIGZvciByZXBvcnRpbmcgd2hpY2ggdmFsaWQgY29uZmlndXJhdGlvbnMKKyMgaXQgZG9lcyBub3Qgc3VwcG9ydC4gIFRoZSB1c2VyIHNob3VsZCBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoCisjIGEgZmFpbHVyZSB0byBzdXBwb3J0IGEgdmFsaWQgY29uZmlndXJhdGlvbiBmcm9tIGEgbWVhbmluZ2xlc3MKKyMgY29uZmlndXJhdGlvbi4KKworIyBUaGUgZ29hbCBvZiB0aGlzIGZpbGUgaXMgdG8gbWFwIGFsbCB0aGUgdmFyaW91cyB2YXJpYXRpb25zIG9mIGEgZ2l2ZW4KKyMgbWFjaGluZSBzcGVjaWZpY2F0aW9uIGludG8gYSBzaW5nbGUgc3BlY2lmaWNhdGlvbiBpbiB0aGUgZm9ybToKKyMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0KKyMgb3IgaW4gc29tZSBjYXNlcywgdGhlIG5ld2VyIGZvdXItcGFydCBmb3JtOgorIwlDUFVfVFlQRS1NQU5VRkFDVFVSRVItS0VSTkVMLU9QRVJBVElOR19TWVNURU0KKyMgSXQgaXMgd3JvbmcgdG8gZWNobyBhbnkgb3RoZXIgdHlwZSBvZiBzcGVjaWZpY2F0aW9uLgorCittZT1gZWNobyAiJDAiIHwgc2VkIC1lICdzLC4qLywsJ2AKKwordXNhZ2U9IlwKK1VzYWdlOiAkMCBbT1BUSU9OXSBDUFUtTUZSLU9QU1lTCisgICAgICAgJDAgW09QVElPTl0gQUxJQVMKKworQ2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiBuYW1lLgorCitPcGVyYXRpb24gbW9kZXM6CisgIC1oLCAtLWhlbHAgICAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAorICAtdCwgLS10aW1lLXN0YW1wICAgcHJpbnQgZGF0ZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiwgdGhlbiBleGl0CisgIC12LCAtLXZlcnNpb24gICAgICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0CisKK1JlcG9ydCBidWdzIGFuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4iCisKK3ZlcnNpb249IlwKK0dOVSBjb25maWcuc3ViICgkdGltZXN0YW1wKQorCitDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTword2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIgorCitoZWxwPSIKK1RyeSBcYCRtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKworIyBQYXJzZSBjb21tYW5kIGxpbmUKK3doaWxlIHRlc3QgJCMgLWd0IDAgOyBkbworICBjYXNlICQxIGluCisgICAgLS10aW1lLXN0YW1wIHwgLS10aW1lKiB8IC10ICkKKyAgICAgICBlY2hvICIkdGltZXN0YW1wIiA7IGV4aXQgMCA7OworICAgIC0tdmVyc2lvbiB8IC12ICkKKyAgICAgICBlY2hvICIkdmVyc2lvbiIgOyBleGl0IDAgOzsKKyAgICAtLWhlbHAgfCAtLWgqIHwgLWggKQorICAgICAgIGVjaG8gIiR1c2FnZSI7IGV4aXQgMCA7OworICAgIC0tICkgICAgICMgU3RvcCBvcHRpb24gcHJvY2Vzc2luZworICAgICAgIHNoaWZ0OyBicmVhayA7OworICAgIC0gKQkjIFVzZSBzdGRpbiBhcyBpbnB1dC4KKyAgICAgICBicmVhayA7OworICAgIC0qICkKKyAgICAgICBlY2hvICIkbWU6IGludmFsaWQgb3B0aW9uICQxJGhlbHAiCisgICAgICAgZXhpdCAxIDs7CisKKyAgICAqbG9jYWwqKQorICAgICAgICMgRmlyc3QgcGFzcyB0aHJvdWdoIGFueSBsb2NhbCBtYWNoaW5lIHR5cGVzLgorICAgICAgIGVjaG8gJDEKKyAgICAgICBleGl0IDA7OworCisgICAgKiApCisgICAgICAgYnJlYWsgOzsKKyAgZXNhYworZG9uZQorCitjYXNlICQjIGluCisgMCkgZWNobyAiJG1lOiBtaXNzaW5nIGFyZ3VtZW50JGhlbHAiID4mMgorICAgIGV4aXQgMTs7CisgMSkgOzsKKyAqKSBlY2hvICIkbWU6IHRvbyBtYW55IGFyZ3VtZW50cyRoZWxwIiA+JjIKKyAgICBleGl0IDE7OworZXNhYworCisjIFNlcGFyYXRlIHdoYXQgdGhlIHVzZXIgZ2F2ZSBpbnRvIENQVS1DT01QQU5ZIGFuZCBPUyBvciBLRVJORUwtT1MgKGlmIGFueSkuCisjIEhlcmUgd2UgbXVzdCByZWNvZ25pemUgYWxsIHRoZSB2YWxpZCBLRVJORUwtT1MgY29tYmluYXRpb25zLgorbWF5YmVfb3M9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wyLydgCitjYXNlICRtYXliZV9vcyBpbgorICBudG8tcW54KiB8IGxpbnV4LWdudSogfCBzdG9ybS1jaGFvcyogfCBvczItZW14KiB8IHdpbmRvd3MzMi0qKQorICAgIG9zPS0kbWF5YmVfb3MKKyAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMS8nYAorICAgIDs7CisgICopCisgICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy8tW14tXSokLy8nYAorICAgIGlmIFsgJGJhc2ljX21hY2hpbmUgIT0gJDEgXQorICAgIHRoZW4gb3M9YGVjaG8gJDEgfCBzZWQgJ3MvLiotLy0vJ2AKKyAgICBlbHNlIG9zPTsgZmkKKyAgICA7OworZXNhYworCisjIyMgTGV0J3MgcmVjb2duaXplIGNvbW1vbiBtYWNoaW5lcyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMgc28KKyMjIyB0aGF0IHRoaW5ncyBsaWtlIGNvbmZpZy5zdWIgZGVjc3RhdGlvbi0zMTAwIHdvcmsuICBXZSBhbHNvCisjIyMgcmVjb2duaXplIHNvbWUgbWFudWZhY3R1cmVycyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMsIHNvIHdlCisjIyMgY2FuIHByb3ZpZGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyBiZWxvdy4KK2Nhc2UgJG9zIGluCisJLXN1bipvcyopCisJCSMgUHJldmVudCBmb2xsb3dpbmcgY2xhdXNlIGZyb20gaGFuZGxpbmcgdGhpcyBpbnZhbGlkIGlucHV0LgorCQk7OworCS1kZWMqIHwgLW1pcHMqIHwgLXNlcXVlbnQqIHwgLWVuY29yZSogfCAtcGM1MzIqIHwgLXNnaSogfCAtc29ueSogfCBcCisJLWF0dCogfCAtNzMwMCogfCAtMzMwMCogfCAtZGVsdGEqIHwgLW1vdG9yb2xhKiB8IC1zdW5bMjM0XSogfCBcCisJLXVuaWNvbSogfCAtaWJtKiB8IC1uZXh0IHwgLWhwIHwgLWlzaSogfCAtYXBvbGxvIHwgLWFsdG9zKiB8IFwKKwktY29udmVyZ2VudCogfCAtbmNyKiB8IC1uZXdzIHwgLTMyKiB8IC0zNjAwKiB8IC0zMTAwKiB8IC1oaXRhY2hpKiB8XAorCS1jWzEyM10qIHwgLWNvbnZleCogfCAtc3VuIHwgLWNyZHMgfCAtb21yb24qIHwgLWRnIHwgLXVsdHJhIHwgLXR0aSogfCBcCisJLWhhcnJpcyB8IC1kb2xwaGluIHwgLWhpZ2hsZXZlbCB8IC1nb3VsZCB8IC1jYm0gfCAtbnMgfCAtbWFzc2NvbXAgfCBcCisJLWFwcGxlIHwgLWF4aXMpCisJCW9zPQorCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisJLXNpbSB8IC1jaXNjbyB8IC1va2kgfCAtd2VjIHwgLXdpbmJvbmQpCisJCW9zPQorCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisJLXNjb3V0KQorCQk7OworCS13cnMpCisJCW9zPS12eHdvcmtzCisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKwktY2hvcnVzb3MqKQorCQlvcz0tY2hvcnVzb3MKKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworIAktY2hvcnVzcmRiKQorIAkJb3M9LWNob3J1c3JkYgorCQliYXNpY19tYWNoaW5lPSQxCisgCQk7OworCS1oaXV4KikKKwkJb3M9LWhpdXh3ZTIKKwkJOzsKKwktc2NvNSkKKwkJb3M9LXNjbzMuMnY1CisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvNCkKKwkJb3M9LXNjbzMuMnY0CisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvMy4yLls0LTldKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzL3NjbzMuMi4vc2NvMy4ydi8nYAorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzMuMnZbNC05XSopCisJCSMgRG9uJ3QgZm9yZ2V0IHZlcnNpb24gaWYgaXQgaXMgMy4ydjQgb3IgbmV3ZXIuCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvKikKKwkJb3M9LXNjbzMuMnYyCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktdWRrKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1pc2MpCisJCW9zPS1pc2MyLjIKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1jbGl4KikKKwkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWludGVyZ3JhcGgKKwkJOzsKKwktaXNjKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1seW54KikKKwkJb3M9LWx5bnhvcworCQk7OworCS1wdHgqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXNlcXVlbnQvJ2AKKwkJOzsKKwktd2luZG93c250KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzL3dpbmRvd3NudC93aW5udC8nYAorCQk7OworCS1wc29zKikKKwkJb3M9LXBzb3MKKwkJOzsKKwktbWludCB8IC1taW50WzAtOV0qKQorCQliYXNpY19tYWNoaW5lPW02OGstYXRhcmkKKwkJb3M9LW1pbnQKKwkJOzsKK2VzYWMKKworIyBEZWNvZGUgYWxpYXNlcyBmb3IgY2VydGFpbiBDUFUtQ09NUEFOWSBjb21iaW5hdGlvbnMuCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRob3V0IGNvbXBhbnkgbmFtZS4KKwkjIFNvbWUgYXJlIG9taXR0ZWQgaGVyZSBiZWNhdXNlIHRoZXkgaGF2ZSBzcGVjaWFsIG1lYW5pbmdzIGJlbG93LgorCTE3NTBhIHwgNTgwIFwKKwl8IGEyOWsgXAorCXwgYWxwaGEgfCBhbHBoYWV2WzQtOF0gfCBhbHBoYWV2NTYgfCBhbHBoYWV2Nls3OF0gfCBhbHBoYXBjYTVbNjddIFwKKwl8IGFyYyB8IGFybSB8IGFybVtibF1lIHwgYXJtZVtsYl0gfCBhcm12WzIzNDVdIHwgYXJtdlszNDVdW2xiXSB8IGF2ciBcCisJfCBjNHggfCBjbGlwcGVyIFwKKwl8IGQxMHYgfCBkMzB2IHwgZHNwMTZ4eCBcCisJfCBmcjMwIFwKKwl8IGg4MzAwIHwgaDg1MDAgfCBocHBhIHwgaHBwYTEuWzAxXSB8IGhwcGEyLjAgfCBocHBhMi4wW253XSB8IGhwcGE2NCBcCisJfCBpMzcwIHwgaTg2MCB8IGk5NjAgfCBpYTY0IFwKKwl8IG0zMnIgfCBtNjgwMDAgfCBtNjhrIHwgbTg4ayB8IG1jb3JlIFwKKwl8IG1pcHMxNiB8IG1pcHM2NCB8IG1pcHM2NGVsIHwgbWlwczY0b3Jpb24gfCBtaXBzNjRvcmlvbmVsIFwKKwl8IG1pcHM2NHZyNDEwMCB8IG1pcHM2NHZyNDEwMGVsIHwgbWlwczY0dnI0MzAwIFwKKwl8IG1pcHM2NHZyNDMwMGVsIHwgbWlwczY0dnI1MDAwIHwgbWlwczY0dnI1MDAwZWwgXAorCXwgbWlwc2JlIHwgbWlwc2VsIHwgbWlwc2xlIHwgbWlwc3R4MzkgfCBtaXBzdHgzOWVsIFwKKwl8IG1uMTAyMDAgfCBtbjEwMzAwIFwKKwl8IG5zMTZrIHwgbnMzMmsgXAorCXwgb3BlbnJpc2MgXAorCXwgcGRwMTAgfCBwZHAxMSB8IHBqIHwgcGpsIFwKKwl8IHBvd2VycGMgfCBwb3dlcnBjNjQgfCBwb3dlcnBjNjRsZSB8IHBvd2VycGNsZSB8IHBwY2JlIFwKKwl8IHB5cmFtaWQgXAorCXwgczM5MCB8IHMzOTB4IFwKKwl8IHNoIHwgc2hbMzRdIHwgc2hbMzRdZWIgfCBzaGJlIHwgc2hsZSBcCisJfCBzcGFyYyB8IHNwYXJjNjQgfCBzcGFyY2xldCB8IHNwYXJjbGl0ZSB8IHNwYXJjdjkgfCBzcGFyY3Y5YiBcCisJfCBzdHJvbmdhcm0gXAorCXwgdGFob2UgfCB0aHVtYiB8IHRpYzgwIHwgdHJvbiBcCisJfCB2ODUwIFwKKwl8IHdlMzJrIFwKKwl8IHg4NiB8IHhzY2FsZSBcCisJfCB6OGspCisJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgorCQk7OworCW02ODExIHwgbTY4aGMxMSB8IG02ODEyIHwgbTY4aGMxMikKKwkJIyBNb3Rvcm9sYSA2OEhDMTEvMTIuCisJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgorCQlvcz0tbm9uZQorCQk7OworCW04ODExMCB8IG02ODBbMTIzNDZdMCB8IG02ODM/MiB8IG02ODM2MCB8IG01MjAwIHwgdjcwIHwgdzY1IHwgejhrKQorCQk7OworCisJIyBXZSB1c2UgYHBjJyByYXRoZXIgdGhhbiBgdW5rbm93bicKKwkjIGJlY2F1c2UgKDEpIHRoYXQncyB3aGF0IHRoZXkgbm9ybWFsbHkgYXJlLCBhbmQKKwkjICgyKSB0aGUgd29yZCAidW5rbm93biIgdGVuZHMgdG8gY29uZnVzZSBiZWdpbm5pbmcgdXNlcnMuCisJaSo4NiB8IHg4Nl82NCkKKwkgIGJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtcGMKKwkgIDs7CisJIyBPYmplY3QgaWYgbW9yZSB0aGFuIG9uZSBjb21wYW55IG5hbWUgd29yZC4KKwkqLSotKikKKwkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBtYWNoaW5lIFxgJGJhc2ljX21hY2hpbmVcJyBub3QgcmVjb2duaXplZCAxPiYyCisJCWV4aXQgMQorCQk7OworCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aCBjb21wYW55IG5hbWUuCisJNTgwLSogXAorCXwgYTI5ay0qIFwKKwl8IGFscGhhLSogfCBhbHBoYWV2WzQtOF0tKiB8IGFscGhhZXY1Ni0qIHwgYWxwaGFldjZbNzhdLSogXAorCXwgYWxwaGFwY2E1WzY3XS0qIHwgYXJjLSogXAorCXwgYXJtLSogIHwgYXJtYmUtKiB8IGFybWxlLSogfCBhcm12Ki0qIFwKKwl8IGJzMjAwMC0qIFwKKwl8IGNbMTIzXSogfCBjMzAtKiB8IFtjanRdOTAtKiB8IGM1NHgtKiBcCisJfCBjbGlwcGVyLSogfCBjcmF5Mi0qIHwgY3lkcmEtKiBcCisJfCBkMTB2LSogfCBkMzB2LSogXAorCXwgZWx4c2ktKiBcCisJfCBmMzBbMDFdLSogfCBmNzAwLSogfCBmcjMwLSogfCBmeDgwLSogXAorCXwgaDgzMDAtKiB8IGg4NTAwLSogXAorCXwgaHBwYS0qIHwgaHBwYTEuWzAxXS0qIHwgaHBwYTIuMC0qIHwgaHBwYTIuMFtud10tKiB8IGhwcGE2NC0qIFwKKwl8IGkqODYtKiB8IGk4NjAtKiB8IGk5NjAtKiB8IGlhNjQtKiBcCisJfCBtMzJyLSogXAorCXwgbTY4MDAwLSogfCBtNjgwWzAxMjM0XTAtKiB8IG02ODM2MC0qIHwgbTY4Mz8yLSogfCBtNjhrLSogXAorCXwgbTg4MTEwLSogfCBtODhrLSogfCBtY29yZS0qIFwKKwl8IG1pcHMtKiB8IG1pcHMxNi0qIHwgbWlwczY0LSogfCBtaXBzNjRlbC0qIHwgbWlwczY0b3Jpb24tKiBcCisJfCBtaXBzNjRvcmlvbmVsLSogfCBtaXBzNjR2cjQxMDAtKiB8IG1pcHM2NHZyNDEwMGVsLSogXAorCXwgbWlwczY0dnI0MzAwLSogfCBtaXBzNjR2cjQzMDBlbC0qIHwgbWlwc2JlLSogfCBtaXBzZWwtKiBcCisJfCBtaXBzbGUtKiB8IG1pcHN0eDM5LSogfCBtaXBzdHgzOWVsLSogXAorCXwgbm9uZS0qIHwgbnAxLSogfCBuczE2ay0qIHwgbnMzMmstKiBcCisJfCBvcmlvbi0qIFwKKwl8IHBkcDEwLSogfCBwZHAxMS0qIHwgcGotKiB8IHBqbC0qIHwgcG4tKiB8IHBvd2VyLSogXAorCXwgcG93ZXJwYy0qIHwgcG93ZXJwYzY0LSogfCBwb3dlcnBjNjRsZS0qIHwgcG93ZXJwY2xlLSogfCBwcGNiZS0qIFwKKwl8IHB5cmFtaWQtKiBcCisJfCByb21wLSogfCByczYwMDAtKiBcCisJfCBzMzkwLSogfCBzMzkweC0qIFwKKwl8IHNoLSogfCBzaFszNF0tKiB8IHNoWzM0XWViLSogfCBzaGJlLSogfCBzaGxlLSogXAorCXwgc3BhcmMtKiB8IHNwYXJjNjQtKiB8IHNwYXJjODZ4LSogfCBzcGFyY2xpdGUtKiBcCisJfCBzcGFyY3Y5LSogfCBzcGFyY3Y5Yi0qIHwgc3Ryb25nYXJtLSogfCBzdjEtKiBcCisJfCB0M2UtKiB8IHRhaG9lLSogfCB0aHVtYi0qIHwgdGljMzAtKiB8IHRpYzU0eC0qIHwgdGljODAtKiB8IHRyb24tKiBcCisJfCB2ODUwLSogfCB2YXgtKiBcCisJfCB3ZTMyay0qIFwKKwl8IHg4Ni0qIHwgeDg2XzY0LSogfCB4bXAtKiB8IHhwczEwMC0qIHwgeHNjYWxlLSogXAorCXwgeW1wLSogXAorCXwgejhrLSopCisJCTs7CisJIyBSZWNvZ25pemUgdGhlIHZhcmlvdXMgbWFjaGluZSBuYW1lcyBhbmQgYWxpYXNlcyB3aGljaCBzdGFuZAorCSMgZm9yIGEgQ1BVIHR5cGUgYW5kIGEgY29tcGFueSBhbmQgc29tZXRpbWVzIGV2ZW4gYW4gT1MuCisJMzg2YnNkKQorCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgorCQlvcz0tYnNkCisJCTs7CisJM2IxIHwgNzMwMCB8IDczMDAtYXR0IHwgYXR0LTczMDAgfCBwYzczMDAgfCBzYWZhcmkgfCB1bml4cGMpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWF0dAorCQk7OworCTNiKikKKwkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKKwkJOzsKKwlhMjlraGlmKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKwlhZG9iZTY4aykKKwkJYmFzaWNfbWFjaGluZT1tNjgwMTAtYWRvYmUKKwkJb3M9LXNjb3V0CisJCTs7CisJYWxsaWFudCB8IGZ4ODApCisJCWJhc2ljX21hY2hpbmU9Zng4MC1hbGxpYW50CisJCTs7CisJYWx0b3MgfCBhbHRvczMwNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hbHRvcworCQk7OworCWFtMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstbm9uZQorCQlvcz0tYnNkCisJCTs7CisJYW1kYWhsKQorCQliYXNpY19tYWNoaW5lPTU4MC1hbWRhaGwKKwkJb3M9LXN5c3YKKwkJOzsKKwlhbWlnYSB8IGFtaWdhLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCisJCTs7CisJYW1pZ2FvcyB8IGFtaWdhZG9zKQorCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgorCQlvcz0tYW1pZ2FvcworCQk7OworCWFtaWdhdW5peCB8IGFtaXgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCisJCW9zPS1zeXN2NAorCQk7OworCWFwb2xsbzY4KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBvbGxvCisJCW9zPS1zeXN2CisJCTs7CisJYXBvbGxvNjhic2QpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KKwkJb3M9LWJzZAorCQk7OworCWF1eCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFwcGxlCisJCW9zPS1hdXgKKwkJOzsKKwliYWxhbmNlKQorCQliYXNpY19tYWNoaW5lPW5zMzJrLXNlcXVlbnQKKwkJb3M9LWR5bml4CisJCTs7CisJY29udmV4LWMxKQorCQliYXNpY19tYWNoaW5lPWMxLWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMyKQorCQliYXNpY19tYWNoaW5lPWMyLWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMzMikKKwkJYmFzaWNfbWFjaGluZT1jMzItY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzM0KQorCQliYXNpY19tYWNoaW5lPWMzNC1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMzgpCisJCWJhc2ljX21hY2hpbmU9YzM4LWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY3JheSB8IHltcCkKKwkJYmFzaWNfbWFjaGluZT15bXAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJY3JheTIpCisJCWJhc2ljX21hY2hpbmU9Y3JheTItY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJW2NqdF05MCkKKwkJYmFzaWNfbWFjaGluZT0ke2Jhc2ljX21hY2hpbmV9LWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCWNyZHMgfCB1bm9zKQorCQliYXNpY19tYWNoaW5lPW02OGstY3JkcworCQk7OworCWNyaXMgfCBjcmlzLSogfCBldHJheCopCisJCWJhc2ljX21hY2hpbmU9Y3Jpcy1heGlzCisJCTs7CisJZGEzMCB8IGRhMzAtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWRhMzAKKwkJOzsKKwlkZWNzdGF0aW9uIHwgZGVjc3RhdGlvbi0zMTAwIHwgcG1heCB8IHBtYXgtKiB8IHBtaW4gfCBkZWMzMTAwIHwgZGVjc3RhdG4pCisJCWJhc2ljX21hY2hpbmU9bWlwcy1kZWMKKwkJOzsKKwlkZWx0YSB8IDMzMDAgfCBtb3Rvcm9sYS0zMzAwIHwgbW90b3JvbGEtZGVsdGEgXAorCSAgICAgIHwgMzMwMC1tb3Rvcm9sYSB8IGRlbHRhLW1vdG9yb2xhKQorCQliYXNpY19tYWNoaW5lPW02OGstbW90b3JvbGEKKwkJOzsKKwlkZWx0YTg4KQorCQliYXNpY19tYWNoaW5lPW04OGstbW90b3JvbGEKKwkJb3M9LXN5c3YzCisJCTs7CisJZHB4MjAgfCBkcHgyMC0qKQorCQliYXNpY19tYWNoaW5lPXJzNjAwMC1idWxsCisJCW9zPS1ib3N4CisJCTs7CisJZHB4MiogfCBkcHgyKi1idWxsKQorCQliYXNpY19tYWNoaW5lPW02OGstYnVsbAorCQlvcz0tc3lzdjMKKwkJOzsKKwllYm1vbjI5aykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAorCQlvcz0tZWJtb24KKwkJOzsKKwllbHhzaSkKKwkJYmFzaWNfbWFjaGluZT1lbHhzaS1lbHhzaQorCQlvcz0tYnNkCisJCTs7CisJZW5jb3JlIHwgdW1heCB8IG1tYXgpCisJCWJhc2ljX21hY2hpbmU9bnMzMmstZW5jb3JlCisJCTs7CisJZXMxODAwIHwgT1NFNjhrIHwgb3NlNjhrIHwgb3NlIHwgT1NFKQorCQliYXNpY19tYWNoaW5lPW02OGstZXJpY3Nzb24KKwkJb3M9LW9zZQorCQk7OworCWZ4MjgwMCkKKwkJYmFzaWNfbWFjaGluZT1pODYwLWFsbGlhbnQKKwkJOzsKKwlnZW5peCkKKwkJYmFzaWNfbWFjaGluZT1uczMyay1ucworCQk7OworCWdtaWNybykKKwkJYmFzaWNfbWFjaGluZT10cm9uLWdtaWNybworCQlvcz0tc3lzdgorCQk7OworCWdvMzIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tZ28zMgorCQk7OworCWgzMDUwciogfCBoaXV4KikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKKwkJb3M9LWhpdXh3ZTIKKwkJOzsKKwloODMwMGhtcykKKwkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCisJCW9zPS1obXMKKwkJOzsKKwloODMwMHhyYXkpCisJCWJhc2ljX21hY2hpbmU9aDgzMDAtaGl0YWNoaQorCQlvcz0teHJheQorCQk7OworCWg4NTAwaG1zKQorCQliYXNpY19tYWNoaW5lPWg4NTAwLWhpdGFjaGkKKwkJb3M9LWhtcworCQk7OworCWhhcnJpcykKKwkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcworCQlvcz0tc3lzdjMKKwkJOzsKKwlocDMwMC0qKQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJOzsKKwlocDMwMGJzZCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCW9zPS1ic2QKKwkJOzsKKwlocDMwMGhwdXgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQlvcz0taHB1eAorCQk7OworCWhwM2s5WzAtOV1bMC05XSB8IGhwOVswLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAorCQk7OworCWhwOWsyWzAtOV1bMC05XSB8IGhwOWszMVswLTldKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1ocAorCQk7OworCWhwOWszWzItOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCTs7CisJaHA5azZbMC05XVswLTldIHwgaHA2WzAtOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCisJCTs7CisJaHA5azdbMC03OV1bMC05XSB8IGhwN1swLTc5XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrNzhbMC05XSB8IGhwNzhbMC05XSkKKwkJIyBGSVhNRTogcmVhbGx5IGhwcGEyLjAtaHAKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azhbNjddMSB8IGhwOFs2N10xIHwgaHA5azgwWzI0XSB8IGhwODBbMjRdIHwgaHA5azhbNzhdOSB8IGhwOFs3OF05IHwgaHA5azg5MyB8IGhwODkzKQorCQkjIEZJWE1FOiByZWFsbHkgaHBwYTIuMC1ocAorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrOFswLTldWzEzNjc5XSB8IGhwOFswLTldWzEzNjc5XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azhbMC05XVswLTldIHwgaHA4WzAtOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCisJCTs7CisJaHBwYS1uZXh0KQorCQlvcz0tbmV4dHN0ZXAzCisJCTs7CisJaHBwYW9zZikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCW9zPS1vc2YKKwkJOzsKKwlocHBybykKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCW9zPS1wcm9lbGYKKwkJOzsKKwlpMzcwLWlibSogfCBpYm0qKQorCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCisJCTs7CisjIEknbSBub3Qgc3VyZSB3aGF0ICJTeXN2MzIiIG1lYW5zLiAgU2hvdWxkIHRoaXMgYmUgc3lzdjMuMj8KKwlpKjg2djMyKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXN5c3YzMgorCQk7OworCWkqODZ2NCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc3lzdjQKKwkJOzsKKwlpKjg2dikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zeXN2CisJCTs7CisJaSo4NnNvbDIpCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc29sYXJpczIKKwkJOzsKKwlpMzg2bWFjaCkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LW1hY2gKKwkJb3M9LW1hY2gKKwkJOzsKKwlpMzg2LXZzdGEgfCB2c3RhKQorCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgorCQlvcz0tdnN0YQorCQk7OworCWlyaXMgfCBpcmlzNGQpCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zZ2kKKwkJY2FzZSAkb3MgaW4KKwkJICAgIC1pcml4KikKKwkJCTs7CisJCSAgICAqKQorCQkJb3M9LWlyaXg0CisJCQk7OworCQllc2FjCisJCTs7CisJaXNpNjggfCBpc2kpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1pc2kKKwkJb3M9LXN5c3YKKwkJOzsKKwltODhrLW9tcm9uKikKKwkJYmFzaWNfbWFjaGluZT1tODhrLW9tcm9uCisJCTs7CisJbWFnbnVtIHwgbTMyMzApCisJCWJhc2ljX21hY2hpbmU9bWlwcy1taXBzCisJCW9zPS1zeXN2CisJCTs7CisJbWVybGluKQorCQliYXNpY19tYWNoaW5lPW5zMzJrLXV0ZWsKKwkJb3M9LXN5c3YKKwkJOzsKKwltaW5ndzMyKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LW1pbmd3MzIKKwkJOzsKKwltaW5pZnJhbWUpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWNvbnZlcmdlbnQKKwkJOzsKKwkqbWludCB8IC1taW50WzAtOV0qIHwgKk1pTlQgfCAqTWlOVFswLTldKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWF0YXJpCisJCW9zPS1taW50CisJCTs7CisJbWlwc2VsKi1saW51eCopCisJCWJhc2ljX21hY2hpbmU9bWlwc2VsLXVua25vd24KKwkJOzsKKwltaXBzKi1saW51eCopCisJCWJhc2ljX21hY2hpbmU9bWlwcy11bmtub3duCisJCTs7CisJbWlwczMqLSopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgCisJCTs7CisJbWlwczMqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYC11bmtub3duCisJCTs7CisJbW1peCopCisJCWJhc2ljX21hY2hpbmU9bW1peC1rbnV0aAorCQlvcz0tbW1peHdhcmUKKwkJOzsKKwltb25pdG9yKQorCQliYXNpY19tYWNoaW5lPW02OGstcm9tNjhrCisJCW9zPS1jb2ZmCisJCTs7CisJbXNkb3MpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tbXNkb3MKKwkJOzsKKwltdnMpCisJCWJhc2ljX21hY2hpbmU9aTM3MC1pYm0KKwkJb3M9LW12cworCQk7OworCW5jcjMwMDApCisJCWJhc2ljX21hY2hpbmU9aTQ4Ni1uY3IKKwkJb3M9LXN5c3Y0CisJCTs7CisJbmV0YnNkMzg2KQorCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgorCQlvcz0tbmV0YnNkCisJCTs7CisJbmV0d2luZGVyKQorCQliYXNpY19tYWNoaW5lPWFybXY0bC1yZWJlbAorCQlvcz0tbGludXgKKwkJOzsKKwluZXdzIHwgbmV3czcwMCB8IG5ld3M4MDAgfCBuZXdzOTAwKQorCQliYXNpY19tYWNoaW5lPW02OGstc29ueQorCQlvcz0tbmV3c29zCisJCTs7CisJbmV3czEwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4MDMwLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5ld3MtMzYwMCB8IHJpc2MtbmV3cykKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5lY3Y3MCkKKwkJYmFzaWNfbWFjaGluZT12NzAtbmVjCisJCW9zPS1zeXN2CisJCTs7CisJbmV4dCB8IG0qLW5leHQgKQorCQliYXNpY19tYWNoaW5lPW02OGstbmV4dAorCQljYXNlICRvcyBpbgorCQkgICAgLW5leHRzdGVwKiApCisJCQk7OworCQkgICAgLW5zMiopCisJCSAgICAgIG9zPS1uZXh0c3RlcDIKKwkJCTs7CisJCSAgICAqKQorCQkgICAgICBvcz0tbmV4dHN0ZXAzCisJCQk7OworCQllc2FjCisJCTs7CisJbmgzMDAwKQorCQliYXNpY19tYWNoaW5lPW02OGstaGFycmlzCisJCW9zPS1jeHV4CisJCTs7CisJbmhbNDVdMDAwKQorCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCisJCW9zPS1jeHV4CisJCTs7CisJbmluZHk5NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC1pbnRlbAorCQlvcz0tbmluZHkKKwkJOzsKKwltb245NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC1pbnRlbAorCQlvcz0tbW9uOTYwCisJCTs7CisJbm9uc3RvcHV4KQorCQliYXNpY19tYWNoaW5lPW1pcHMtY29tcGFxCisJCW9zPS1ub25zdG9wdXgKKwkJOzsKKwlucDEpCisJCWJhc2ljX21hY2hpbmU9bnAxLWdvdWxkCisJCTs7CisJbnNyLXRhbmRlbSkKKwkJYmFzaWNfbWFjaGluZT1uc3ItdGFuZGVtCisJCTs7CisJb3A1MG4tKiB8IG9wNjBjLSopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKKwkJb3M9LXByb2VsZgorCQk7OworCU9TRTY4MDAwIHwgb3NlNjgwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWVyaWNzc29uCisJCW9zPS1vc2UKKwkJOzsKKwlvczY4aykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW5vbmUKKwkJb3M9LW9zNjhrCisJCTs7CisJcGEtaGl0YWNoaSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKKwkJb3M9LWhpdXh3ZTIKKwkJOzsKKwlwYXJhZ29uKQorCQliYXNpY19tYWNoaW5lPWk4NjAtaW50ZWwKKwkJb3M9LW9zZgorCQk7OworCXBiZCkKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy10dGkKKwkJOzsKKwlwYmIpCisJCWJhc2ljX21hY2hpbmU9bTY4ay10dGkKKwkJOzsKKyAgICAgICAgcGM1MzIgfCBwYzUzMi0qKQorCQliYXNpY19tYWNoaW5lPW5zMzJrLXBjNTMyCisJCTs7CisJcGVudGl1bSB8IHA1IHwgazUgfCBrNiB8IG5leGdlbikKKwkJYmFzaWNfbWFjaGluZT1pNTg2LXBjCisJCTs7CisJcGVudGl1bXBybyB8IHA2IHwgNng4NiB8IGF0aGxvbikKKwkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCisJCTs7CisJcGVudGl1bWlpIHwgcGVudGl1bTIpCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1wYworCQk7OworCXBlbnRpdW0tKiB8IHA1LSogfCBrNS0qIHwgazYtKiB8IG5leGdlbi0qKQorCQliYXNpY19tYWNoaW5lPWk1ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwZW50aXVtcHJvLSogfCBwNi0qIHwgNng4Ni0qIHwgYXRobG9uLSopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW1paS0qIHwgcGVudGl1bTItKikKKwkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcG4pCisJCWJhc2ljX21hY2hpbmU9cG4tZ291bGQKKwkJOzsKKwlwb3dlcikJYmFzaWNfbWFjaGluZT1wb3dlci1pYm0KKwkJOzsKKwlwcGMpCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCisJICAgICAgICA7OworCXBwYzY0KSAgYmFzaWNfbWFjaGluZT1wb3dlcnBjLXVua25vd24KKwkJOzsKKwlwcGMtKikJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHBjbGUgfCBwb3dlcnBjbGl0dGxlIHwgcHBjLWxlIHwgcG93ZXJwYy1saXR0bGUpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwY2xlLXVua25vd24KKwkgICAgICAgIDs7CisJcHBjbGUtKiB8IHBvd2VycGNsaXR0bGUtKikKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwcGM2NCkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjQtdW5rbm93bgorCSAgICAgICAgOzsKKwlwcGM2NC0qKSBiYXNpY19tYWNoaW5lPXBvd2VycGM2NC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBwYzY0bGUgfCBwb3dlcnBjNjRsaXR0bGUgfCBwcGM2NC1sZSB8IHBvd2VycGM2NC1saXR0bGUpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0bGUtdW5rbm93bgorCSAgICAgICAgOzsKKwlwcGM2NGxlLSogfCBwb3dlcnBjNjRsaXR0bGUtKikKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjRsZS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBzMikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LWlibQorCQk7OworCXB3MzIpCisJCWJhc2ljX21hY2hpbmU9aTU4Ni11bmtub3duCisJCW9zPS1wdzMyCisJCTs7CisJcm9tNjhrKQorCQliYXNpY19tYWNoaW5lPW02OGstcm9tNjhrCisJCW9zPS1jb2ZmCisJCTs7CisJcm1bNDZdMDApCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zaWVtZW5zCisJCTs7CisJcnRwYyB8IHJ0cGMtKikKKwkJYmFzaWNfbWFjaGluZT1yb21wLWlibQorCQk7OworCXNhMjkyMDApCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LXVkaQorCQk7OworCXNlcXVlbnQpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50CisJCTs7CisJc2gpCisJCWJhc2ljX21hY2hpbmU9c2gtaGl0YWNoaQorCQlvcz0taG1zCisJCTs7CisJc3BhcmNsaXRlLXdycykKKwkJYmFzaWNfbWFjaGluZT1zcGFyY2xpdGUtd3JzCisJCW9zPS12eHdvcmtzCisJCTs7CisJc3BzNykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKKwkJb3M9LXN5c3YyCisJCTs7CisJc3B1cikKKwkJYmFzaWNfbWFjaGluZT1zcHVyLXVua25vd24KKwkJOzsKKwlzdDIwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4ay10YW5kZW0KKwkJOzsKKwlzdHJhdHVzKQorCQliYXNpY19tYWNoaW5lPWk4NjAtc3RyYXR1cworCQlvcz0tc3lzdjQKKwkJOzsKKwlzdW4yKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJOzsKKwlzdW4yb3MzKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjJvczQpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuM29zMykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQlvcz0tc3Vub3MzCisJCTs7CisJc3VuM29zNCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuNG9zMykKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjRvczQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zdW5vczQKKwkJOzsKKwlzdW40c29sMikKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJc3VuMyB8IHN1bjMtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQk7OworCXN1bjQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCTs7CisJc3VuMzg2IHwgc3VuMzg2aSB8IHJvYWRydW5uZXIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1zdW4KKwkJOzsKKwlzdjEpCisJCWJhc2ljX21hY2hpbmU9c3YxLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCXN5bW1ldHJ5KQorCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAorCQlvcz0tZHluaXgKKwkJOzsKKwl0M2UpCisJCWJhc2ljX21hY2hpbmU9dDNlLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCXRpYzU0eCB8IGM1NHgqKQorCQliYXNpY19tYWNoaW5lPXRpYzU0eC11bmtub3duCisJCW9zPS1jb2ZmCisJCTs7CisJdHgzOSkKKwkJYmFzaWNfbWFjaGluZT1taXBzdHgzOS11bmtub3duCisJCTs7CisJdHgzOWVsKQorCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5ZWwtdW5rbm93bgorCQk7OworCXRvd2VyIHwgdG93ZXItMzIpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1uY3IKKwkJOzsKKwl1ZGkyOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LXVkaQorCQk7OworCXVsdHJhMykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLW55dQorCQlvcz0tc3ltMQorCQk7OworCXY4MTAgfCBuZWN2ODEwKQorCQliYXNpY19tYWNoaW5lPXY4MTAtbmVjCisJCW9zPS1ub25lCisJCTs7CisJdmF4dikKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCW9zPS1zeXN2CisJCTs7CisJdm1zKQorCQliYXNpY19tYWNoaW5lPXZheC1kZWMKKwkJb3M9LXZtcworCQk7OworCXZwcCp8dnh8dngtKikKKyAgICAgICAgICAgICAgIGJhc2ljX21hY2hpbmU9ZjMwMS1mdWppdHN1CisgICAgICAgICAgICAgICA7OworCXZ4d29ya3M5NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwl2eHdvcmtzNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwl2eHdvcmtzMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstd3JzCisJCW9zPS12eHdvcmtzCisJCTs7CisJdzY1KikKKwkJYmFzaWNfbWFjaGluZT13NjUtd2RjCisJCW9zPS1ub25lCisJCTs7CisJdzg5ay0qKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtd2luYm9uZAorCQlvcz0tcHJvZWxmCisJCTs7CisJd2luZG93czMyKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LXdpbmRvd3MzMi1tc3ZjcnQKKwkJOzsKKwl4bXApCisJCWJhc2ljX21hY2hpbmU9eG1wLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworICAgICAgICB4cHMgfCB4cHMxMDApCisJCWJhc2ljX21hY2hpbmU9eHBzMTAwLWhvbmV5d2VsbAorCQk7OworCXo4ay0qLWNvZmYpCisJCWJhc2ljX21hY2hpbmU9ejhrLXVua25vd24KKwkJb3M9LXNpbQorCQk7OworCW5vbmUpCisJCWJhc2ljX21hY2hpbmU9bm9uZS1ub25lCisJCW9zPS1ub25lCisJCTs7CisKKyMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgbWFudWZhY3R1cmVyIG9mIGNlcnRhaW4gQ1BVIHR5cGVzLiAgSXQgaXMgaW4KKyMgc29tZSBjYXNlcyB0aGUgb25seSBtYW51ZmFjdHVyZXIsIGluIG90aGVycywgaXQgaXMgdGhlIG1vc3QgcG9wdWxhci4KKwl3ODlrKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtd2luYm9uZAorCQk7OworCW9wNTBuKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCisJCTs7CisJb3A2MGMpCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKKwkJOzsKKwltaXBzKQorCQljYXNlICRvcyBpbgorCQlsaW51eCopCisJCQliYXNpY19tYWNoaW5lPW1pcHMtdW5rbm93bgorCQkJOzsKKwkJKikKKwkJCWJhc2ljX21hY2hpbmU9bWlwcy1taXBzCisJCQk7OworCQllc2FjCisJCTs7CisJcm9tcCkKKwkJYmFzaWNfbWFjaGluZT1yb21wLWlibQorCQk7OworCXJzNjAwMCkKKwkJYmFzaWNfbWFjaGluZT1yczYwMDAtaWJtCisJCTs7CisJdmF4KQorCQliYXNpY19tYWNoaW5lPXZheC1kZWMKKwkJOzsKKwlwZHAxMCkKKwkJIyB0aGVyZSBhcmUgbWFueSBjbG9uZXMsIHNvIERFQyBpcyBub3QgYSBzYWZlIGJldAorCQliYXNpY19tYWNoaW5lPXBkcDEwLXVua25vd24KKwkJOzsKKwlwZHAxMSkKKwkJYmFzaWNfbWFjaGluZT1wZHAxMS1kZWMKKwkJOzsKKwl3ZTMyaykKKwkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKKwkJOzsKKwlzaDMgfCBzaDQgfCBzaDNlYiB8IHNoNGViKQorCQliYXNpY19tYWNoaW5lPXNoLXVua25vd24KKwkJOzsKKwlzcGFyYyB8IHNwYXJjdjkgfCBzcGFyY3Y5YikKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJOzsKKyAgICAgICAgY3lkcmEpCisJCWJhc2ljX21hY2hpbmU9Y3lkcmEtY3lkcm9tZQorCQk7OworCW9yaW9uKQorCQliYXNpY19tYWNoaW5lPW9yaW9uLWhpZ2hsZXZlbAorCQk7OworCW9yaW9uMTA1KQorCQliYXNpY19tYWNoaW5lPWNsaXBwZXItaGlnaGxldmVsCisJCTs7CisJbWFjIHwgbXB3IHwgbWFjLW1wdykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFwcGxlCisJCTs7CisJcG1hYyB8IHBtYWMtbXB3KQorCQliYXNpY19tYWNoaW5lPXBvd2VycGMtYXBwbGUKKwkJOzsKKwljNHgqKQorCQliYXNpY19tYWNoaW5lPWM0eC1ub25lCisJCW9zPS1jb2ZmCisJCTs7CisJKi11bmtub3duKQorCQkjIE1ha2Ugc3VyZSB0byBtYXRjaCBhbiBhbHJlYWR5LWNhbm9uaWNhbGl6ZWQgbWFjaGluZSBuYW1lLgorCQk7OworCSopCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKK2VzYWMKKworIyBIZXJlIHdlIGNhbm9uaWNhbGl6ZSBjZXJ0YWluIGFsaWFzZXMgZm9yIG1hbnVmYWN0dXJlcnMuCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJKi1kaWdpdGFsKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9kaWdpdGFsLiovZGVjLydgCisJCTs7CisJKi1jb21tb2RvcmUqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL2NvbW1vZG9yZS4qL2NibS8nYAorCQk7OworCSopCisJCTs7Citlc2FjCisKKyMgRGVjb2RlIG1hbnVmYWN0dXJlci1zcGVjaWZpYyBhbGlhc2VzIGZvciBjZXJ0YWluIG9wZXJhdGluZyBzeXN0ZW1zLgorCitpZiBbIHgiJG9zIiAhPSB4IiIgXQordGhlbgorY2FzZSAkb3MgaW4KKyAgICAgICAgIyBGaXJzdCBtYXRjaCBzb21lIHN5c3RlbSB0eXBlIGFsaWFzZXMKKyAgICAgICAgIyB0aGF0IG1pZ2h0IGdldCBjb25mdXNlZCB3aXRoIHZhbGlkIHN5c3RlbSB0eXBlcy4KKwkjIC1zb2xhcmlzKiBpcyBhIGJhc2ljIHN5c3RlbSB0eXBlLCB3aXRoIHRoaXMgb25lIGV4Y2VwdGlvbi4KKwktc29sYXJpczEgfCAtc29sYXJpczEuKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNvbGFyaXMxfHN1bm9zNHwnYAorCQk7OworCS1zb2xhcmlzKQorCQlvcz0tc29sYXJpczIKKwkJOzsKKwktc3ZyNCopCisJCW9zPS1zeXN2NAorCQk7OworCS11bml4d2FyZSopCisJCW9zPS1zeXN2NC4ydXcKKwkJOzsKKwktZ251L2xpbnV4KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGdudS9saW51eHxsaW51eC1nbnV8J2AKKwkJOzsKKwkjIEZpcnN0IGFjY2VwdCB0aGUgYmFzaWMgc3lzdGVtIHR5cGVzLgorCSMgVGhlIHBvcnRhYmxlIHN5c3RlbXMgY29tZXMgZmlyc3QuCisJIyBFYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOIEEgKiwgdG8gbWF0Y2ggYSB2ZXJzaW9uIG51bWJlci4KKwkjIC1zeXN2KiBpcyBub3QgaGVyZSBiZWNhdXNlIGl0IGNvbWVzIGxhdGVyLCBhZnRlciBzeXN2cjQuCisJLWdudSogfCAtYnNkKiB8IC1tYWNoKiB8IC1taW5peCogfCAtZ2VuaXgqIHwgLXVsdHJpeCogfCAtaXJpeCogXAorCSAgICAgIHwgLSp2bXMqIHwgLXNjbyogfCAtZXNpeCogfCAtaXNjKiB8IC1haXgqIHwgLXN1bm9zIHwgLXN1bm9zWzM0XSpcCisJICAgICAgfCAtaHB1eCogfCAtdW5vcyogfCAtb3NmKiB8IC1sdW5hKiB8IC1kZ3V4KiB8IC1zb2xhcmlzKiB8IC1zeW0qIFwKKwkgICAgICB8IC1hbWlnYW9zKiB8IC1hbWlnYWRvcyogfCAtbXNkb3MqIHwgLW5ld3NvcyogfCAtdW5pY29zKiB8IC1hb2YqIFwKKwkgICAgICB8IC1hb3MqIFwKKwkgICAgICB8IC1uaW5keSogfCAtdnhzaW0qIHwgLXZ4d29ya3MqIHwgLWVibW9uKiB8IC1obXMqIHwgLW12cyogXAorCSAgICAgIHwgLWNsaXgqIHwgLXJpc2NvcyogfCAtdW5pcGx1cyogfCAtaXJpcyogfCAtcnR1KiB8IC14ZW5peCogXAorCSAgICAgIHwgLWhpdXgqIHwgLTM4NmJzZCogfCAtbmV0YnNkKiB8IC1vcGVuYnNkKiB8IC1mcmVlYnNkKiB8IC1yaXNjaXgqIFwKKwkgICAgICB8IC1seW54b3MqIHwgLWJvc3gqIHwgLW5leHRzdGVwKiB8IC1jeHV4KiB8IC1hb3V0KiB8IC1lbGYqIHwgLW9hYmkqIFwKKwkgICAgICB8IC1wdHgqIHwgLWNvZmYqIHwgLWVjb2ZmKiB8IC13aW5udCogfCAtZG9tYWluKiB8IC12c3RhKiBcCisJICAgICAgfCAtdWRpKiB8IC1lYWJpKiB8IC1saXRlcyogfCAtaWVlZSogfCAtZ28zMiogfCAtYXV4KiBcCisJICAgICAgfCAtY2hvcnVzb3MqIHwgLWNob3J1c3JkYiogXAorCSAgICAgIHwgLWN5Z3dpbiogfCAtcGUqIHwgLXBzb3MqIHwgLW1vc3MqIHwgLXByb2VsZiogfCAtcnRlbXMqIFwKKwkgICAgICB8IC1taW5ndzMyKiB8IC1saW51eCogfCAtdXhwdiogfCAtYmVvcyogfCAtbXBlaXgqIHwgLXVkayogXAorCSAgICAgIHwgLWludGVyaXgqIHwgLXV3aW4qIHwgLXJoYXBzb2R5KiB8IC1kYXJ3aW4qIHwgLW9wZW5lZCogXAorCSAgICAgIHwgLW9wZW5zdGVwKiB8IC1vc2tpdCogfCAtY29uaXgqIHwgLXB3MzIqIHwgLW5vbnN0b3B1eCogXAorCSAgICAgIHwgLXN0b3JtLWNoYW9zKiB8IC10b3BzMTAqIHwgLXRlbmV4KiB8IC10b3BzMjAqIHwgLWl0cyogXAorCSAgICAgIHwgLW9zMiogfCAtdm9zKikKKwkjIFJlbWVtYmVyLCBlYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCisJCTs7CisJLXFueCopCisJCWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkJICAgIHg4Ni0qIHwgaSo4Ni0qKQorCQkJOzsKKwkJICAgICopCisJCQlvcz0tbnRvJG9zCisJCQk7OworCQllc2FjCisJCTs7CisJLW50byopCisJCW9zPS1udG8tcW54CisJCTs7CisJLXNpbSB8IC1lczE4MDAqIHwgLWhtcyogfCAteHJheSB8IC1vczY4ayogfCAtbm9uZSogfCAtdjg4ciogXAorCSAgICAgIHwgLXdpbmRvd3MqIHwgLW9zeCB8IC1hYnVnIHwgLW5ldHdhcmUqIHwgLW9zOSogfCAtYmVvcyogXAorCSAgICAgIHwgLW1hY29zKiB8IC1tcHcqIHwgLW1hZ2ljKiB8IC1tbWl4d2FyZSogfCAtbW9uOTYwKiB8IC1sbmV3cyopCisJCTs7CisJLW1hYyopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xtYWN8bWFjb3N8J2AKKwkJOzsKKwktc3Vub3M1KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNXxzb2xhcmlzMnwnYAorCQk7OworCS1zdW5vczYqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M2fHNvbGFyaXMzfCdgCisJCTs7CisJLW9wZW5lZCopCisJCW9zPS1vcGVuZWRpdGlvbgorCQk7OworCS13aW5jZSopCisJCW9zPS13aW5jZQorCQk7OworCS1vc2Zyb3NlKikKKwkJb3M9LW9zZnJvc2UKKwkJOzsKKwktb3NmKikKKwkJb3M9LW9zZgorCQk7OworCS11dGVrKikKKwkJb3M9LWJzZAorCQk7OworCS1keW5peCopCisJCW9zPS1ic2QKKwkJOzsKKwktYWNpcyopCisJCW9zPS1hb3MKKwkJOzsKKwktMzg2YnNkKQorCQlvcz0tYnNkCisJCTs7CisJLWN0aXgqIHwgLXV0cyopCisJCW9zPS1zeXN2CisJCTs7CisJLW5zMiApCisJICAgICAgICBvcz0tbmV4dHN0ZXAyCisJCTs7CisJLW5zayopCisJCW9zPS1uc2sKKwkJOzsKKwkjIFByZXNlcnZlIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBzaW5peDUuCisJLXNpbml4NS4qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c2luaXh8c3lzdnwnYAorCQk7OworCS1zaW5peCopCisJCW9zPS1zeXN2NAorCQk7OworCS10cml0b24qKQorCQlvcz0tc3lzdjMKKwkJOzsKKwktb3NzKikKKwkJb3M9LXN5c3YzCisJCTs7CisJLXN2cjQpCisJCW9zPS1zeXN2NAorCQk7OworCS1zdnIzKQorCQlvcz0tc3lzdjMKKwkJOzsKKwktc3lzdnI0KQorCQlvcz0tc3lzdjQKKwkJOzsKKwkjIFRoaXMgbXVzdCBjb21lIGFmdGVyIC1zeXN2cjQuCisJLXN5c3YqKQorCQk7OworCS1vc2UqKQorCQlvcz0tb3NlCisJCTs7CisJLWVzMTgwMCopCisJCW9zPS1vc2UKKwkJOzsKKwkteGVuaXgpCisJCW9zPS14ZW5peAorCQk7OworICAgICAgICAtKm1pbnQgfCAtbWludFswLTldKiB8IC0qTWlOVCB8IC1NaU5UWzAtOV0qKQorCSAgICAgICAgb3M9LW1pbnQKKwkJOzsKKwktbm9uZSkKKwkJOzsKKwkqKQorCQkjIEdldCByaWQgb2YgdGhlIGAtJyBhdCB0aGUgYmVnaW5uaW5nIG9mICRvcy4KKwkJb3M9YGVjaG8gJG9zIHwgc2VkICdzL1teLV0qLS8vJ2AKKwkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBzeXN0ZW0gXGAkb3NcJyBub3QgcmVjb2duaXplZCAxPiYyCisJCWV4aXQgMQorCQk7OworZXNhYworZWxzZQorCisjIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIHRoYXQgY29tZSB3aXRoIHZhcmlvdXMgbWFjaGluZXMuCisjIFRoZSB2YWx1ZSBzaG91bGQgYmUgd2hhdCB0aGUgdmVuZG9yIGN1cnJlbnRseSBzaGlwcyBvdXQgdGhlIGRvb3Igd2l0aCB0aGVpcgorIyBtYWNoaW5lIG9yIHB1dCBhbm90aGVyIHdheSwgdGhlIG1vc3QgcG9wdWxhciBvcyBwcm92aWRlZCB3aXRoIHRoZSBtYWNoaW5lLgorCisjIE5vdGUgdGhhdCBpZiB5b3UncmUgZ29pbmcgdG8gdHJ5IHRvIG1hdGNoICItTUFOVUZBQ1RVUkVSIiBoZXJlIChzYXksCisjICItc3VuIiksIHRoZW4geW91IGhhdmUgdG8gdGVsbCB0aGUgY2FzZSBzdGF0ZW1lbnQgdXAgdG93YXJkcyB0aGUgdG9wCisjIHRoYXQgTUFOVUZBQ1RVUkVSIGlzbid0IGFuIG9wZXJhdGluZyBzeXN0ZW0uICBPdGhlcndpc2UsIGNvZGUgYWJvdmUKKyMgd2lsbCBzaWduYWwgYW4gZXJyb3Igc2F5aW5nIHRoYXQgTUFOVUZBQ1RVUkVSIGlzbid0IGFuIG9wZXJhdGluZworIyBzeXN0ZW0sIGFuZCB3ZSdsbCBuZXZlciBnZXQgdG8gdGhpcyBwb2ludC4KKworY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSotYWNvcm4pCisJCW9zPS1yaXNjaXgxLjIKKwkJOzsKKwlhcm0qLXJlYmVsKQorCQlvcz0tbGludXgKKwkJOzsKKwlhcm0qLXNlbWkpCisJCW9zPS1hb3V0CisJCTs7CisJcGRwMTAtKikKKwkJb3M9LXRvcHMyMAorCQk7OworICAgICAgICBwZHAxMS0qKQorCQlvcz0tbm9uZQorCQk7OworCSotZGVjIHwgdmF4LSopCisJCW9zPS11bHRyaXg0LjIKKwkJOzsKKwltNjgqLWFwb2xsbykKKwkJb3M9LWRvbWFpbgorCQk7OworCWkzODYtc3VuKQorCQlvcz0tc3Vub3M0LjAuMgorCQk7OworCW02ODAwMC1zdW4pCisJCW9zPS1zdW5vczMKKwkJIyBUaGlzIGFsc28gZXhpc3RzIGluIHRoZSBjb25maWd1cmUgcHJvZ3JhbSwgYnV0IHdhcyBub3QgdGhlCisJCSMgZGVmYXVsdC4KKwkJIyBvcz0tc3Vub3M0CisJCTs7CisJbTY4Ki1jaXNjbykKKwkJb3M9LWFvdXQKKwkJOzsKKwltaXBzKi1jaXNjbykKKwkJb3M9LWVsZgorCQk7OworCW1pcHMqLSopCisJCW9zPS1lbGYKKwkJOzsKKwkqLXR0aSkJIyBtdXN0IGJlIGJlZm9yZSBzcGFyYyBlbnRyeSBvciB3ZSBnZXQgdGhlIHdyb25nIG9zLgorCQlvcz0tc3lzdjMKKwkJOzsKKwlzcGFyYy0qIHwgKi1zdW4pCisJCW9zPS1zdW5vczQuMS4xCisJCTs7CisJKi1iZSkKKwkJb3M9LWJlb3MKKwkJOzsKKwkqLWlibSkKKwkJb3M9LWFpeAorCQk7OworCSotd2VjKQorCQlvcz0tcHJvZWxmCisJCTs7CisJKi13aW5ib25kKQorCQlvcz0tcHJvZWxmCisJCTs7CisJKi1va2kpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwkqLWhwKQorCQlvcz0taHB1eAorCQk7OworCSotaGl0YWNoaSkKKwkJb3M9LWhpdXgKKwkJOzsKKwlpODYwLSogfCAqLWF0dCB8ICotbmNyIHwgKi1hbHRvcyB8ICotbW90b3JvbGEgfCAqLWNvbnZlcmdlbnQpCisJCW9zPS1zeXN2CisJCTs7CisJKi1jYm0pCisJCW9zPS1hbWlnYW9zCisJCTs7CisJKi1kZykKKwkJb3M9LWRndXgKKwkJOzsKKwkqLWRvbHBoaW4pCisJCW9zPS1zeXN2MworCQk7OworCW02OGstY2N1cikKKwkJb3M9LXJ0dQorCQk7OworCW04OGstb21yb24qKQorCQlvcz0tbHVuYQorCQk7OworCSotbmV4dCApCisJCW9zPS1uZXh0c3RlcAorCQk7OworCSotc2VxdWVudCkKKwkJb3M9LXB0eAorCQk7OworCSotY3JkcykKKwkJb3M9LXVub3MKKwkJOzsKKwkqLW5zKQorCQlvcz0tZ2VuaXgKKwkJOzsKKwlpMzcwLSopCisJCW9zPS1tdnMKKwkJOzsKKwkqLW5leHQpCisJCW9zPS1uZXh0c3RlcDMKKwkJOzsKKyAgICAgICAgKi1nb3VsZCkKKwkJb3M9LXN5c3YKKwkJOzsKKyAgICAgICAgKi1oaWdobGV2ZWwpCisJCW9zPS1ic2QKKwkJOzsKKwkqLWVuY29yZSkKKwkJb3M9LWJzZAorCQk7OworICAgICAgICAqLXNnaSkKKwkJb3M9LWlyaXgKKwkJOzsKKyAgICAgICAgKi1zaWVtZW5zKQorCQlvcz0tc3lzdjQKKwkJOzsKKwkqLW1hc3Njb21wKQorCQlvcz0tcnR1CisJCTs7CisJZjMwWzAxXS1mdWppdHN1IHwgZjcwMC1mdWppdHN1KQorCQlvcz0tdXhwdgorCQk7OworCSotcm9tNjhrKQorCQlvcz0tY29mZgorCQk7OworCSotKmJ1ZykKKwkJb3M9LWNvZmYKKwkJOzsKKwkqLWFwcGxlKQorCQlvcz0tbWFjb3MKKwkJOzsKKwkqLWF0YXJpKikKKwkJb3M9LW1pbnQKKwkJOzsKKwkqKQorCQlvcz0tbm9uZQorCQk7OworZXNhYworZmkKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBrbm93IHRoZSBvcywgYW5kIHRoZSBDUFUgdHlwZSwgYnV0IG5vdCB0aGUKKyMgbWFudWZhY3R1cmVyLiAgV2UgcGljayB0aGUgbG9naWNhbCBtYW51ZmFjdHVyZXIuCit2ZW5kb3I9dW5rbm93bgorY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSotdW5rbm93bikKKwkJY2FzZSAkb3MgaW4KKwkJCS1yaXNjaXgqKQorCQkJCXZlbmRvcj1hY29ybgorCQkJCTs7CisJCQktc3Vub3MqKQorCQkJCXZlbmRvcj1zdW4KKwkJCQk7OworCQkJLWFpeCopCisJCQkJdmVuZG9yPWlibQorCQkJCTs7CisJCQktYmVvcyopCisJCQkJdmVuZG9yPWJlCisJCQkJOzsKKwkJCS1ocHV4KikKKwkJCQl2ZW5kb3I9aHAKKwkJCQk7OworCQkJLW1wZWl4KikKKwkJCQl2ZW5kb3I9aHAKKwkJCQk7OworCQkJLWhpdXgqKQorCQkJCXZlbmRvcj1oaXRhY2hpCisJCQkJOzsKKwkJCS11bm9zKikKKwkJCQl2ZW5kb3I9Y3JkcworCQkJCTs7CisJCQktZGd1eCopCisJCQkJdmVuZG9yPWRnCisJCQkJOzsKKwkJCS1sdW5hKikKKwkJCQl2ZW5kb3I9b21yb24KKwkJCQk7OworCQkJLWdlbml4KikKKwkJCQl2ZW5kb3I9bnMKKwkJCQk7OworCQkJLW12cyogfCAtb3BlbmVkKikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS1wdHgqKQorCQkJCXZlbmRvcj1zZXF1ZW50CisJCQkJOzsKKwkJCS12eHNpbSogfCAtdnh3b3JrcyopCisJCQkJdmVuZG9yPXdycworCQkJCTs7CisJCQktYXV4KikKKwkJCQl2ZW5kb3I9YXBwbGUKKwkJCQk7OworCQkJLWhtcyopCisJCQkJdmVuZG9yPWhpdGFjaGkKKwkJCQk7OworCQkJLW1wdyogfCAtbWFjb3MqKQorCQkJCXZlbmRvcj1hcHBsZQorCQkJCTs7CisJCQktKm1pbnQgfCAtbWludFswLTldKiB8IC0qTWlOVCB8IC1NaU5UWzAtOV0qKQorCQkJCXZlbmRvcj1hdGFyaQorCQkJCTs7CisJCQktdm9zKikKKwkJCQl2ZW5kb3I9c3RyYXR1cworCQkJCTs7CisJCWVzYWMKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAicy91bmtub3duLyR2ZW5kb3IvImAKKwkJOzsKK2VzYWMKKworZWNobyAkYmFzaWNfbWFjaGluZSRvcworZXhpdCAwCisKKyMgTG9jYWwgdmFyaWFibGVzOgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJ0aW1lc3RhbXA9JyIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkIgorIyB0aW1lLXN0YW1wLWVuZDogIiciCisjIEVuZDoKZGlmZiAtLWdpdCBhL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9jb25maWd1cmUgYi9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFmOWJiODUKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvY29uZmlndXJlCkBAIC0wLDAgKzEsOTM3NCBAQAorIyEgL2Jpbi9zaAorIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgorIyBHZW5lcmF0ZWQgYnkgQXV0b2NvbmYgMi41Mi4KKyMKKyMgQ29weXJpZ2h0IDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KKyMKKyMgRGlwbC4tSW5nLiBDaHJpc3RpYW4gQWJlcmdlciAoaHR0cDovL3d3dy5hYmVyZ2VyLmF0KQorCisjIEZpbmQgdGhlIGNvcnJlY3QgUEFUSCBzZXBhcmF0b3IuICBVc3VhbGx5IHRoaXMgaXMgYDonLCBidXQKKyMgREpHUFAgdXNlcyBgOycgbGlrZSBET1MuCitpZiB0ZXN0ICJYJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBYc2V0OyB0aGVuCisgIFVOQU1FPSR7VU5BTUUtYHVuYW1lIDI+L2Rldi9udWxsYH0KKyAgY2FzZSBYJFVOQU1FIGluCisgICAgKi1ET1MpIGx0X2N2X3N5c19wYXRoX3NlcGFyYXRvcj0nOycgOzsKKyAgICAqKSAgICAgbHRfY3Zfc3lzX3BhdGhfc2VwYXJhdG9yPSc6JyA7OworICBlc2FjCisgIFBBVEhfU0VQQVJBVE9SPSRsdF9jdl9zeXNfcGF0aF9zZXBhcmF0b3IKK2ZpCisKKyMgQ2hlY2sgdGhhdCB3ZSBhcmUgcnVubmluZyB1bmRlciB0aGUgY29ycmVjdCBzaGVsbC4KK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisKK2Nhc2UgWCRFQ0hPIGluCitYKi0tZmFsbGJhY2stZWNobykKKyAgIyBSZW1vdmUgb25lIGxldmVsIG9mIHF1b3RhdGlvbiAod2hpY2ggd2FzIHJlcXVpcmVkIGZvciBNYWtlKS4KKyAgRUNITz1gZWNobyAiJEVDSE8iIHwgc2VkICdzLFxcXFxcJFxcJDAsJyQwJywnYAorICA7OworZXNhYworCitlY2hvPSR7RUNITy1lY2hvfQoraWYgdGVzdCAiWCQxIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgorICAjIERpc2NhcmQgdGhlIC0tbm8tcmVleGVjIGZsYWcsIGFuZCBjb250aW51ZS4KKyAgc2hpZnQKK2VsaWYgdGVzdCAiWCQxIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KKyAgIyBBdm9pZCBpbmxpbmUgZG9jdW1lbnQgaGVyZSwgaXQgbWF5IGJlIGxlZnQgb3ZlcgorICA6CitlbGlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JzsgdGhlbgorICAjIFlpcHBlZSwgJGVjaG8gd29ya3MhCisgIDoKK2Vsc2UKKyAgIyBSZXN0YXJ0IHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLgorICBleGVjICRTSEVMTCAiJDAiIC0tbm8tcmVleGVjICR7MSsiJEAifQorZmkKKworaWYgdGVzdCAiWCQxIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KKyAgIyB1c2VkIGFzIGZhbGxiYWNrIGVjaG8KKyAgc2hpZnQKKyAgY2F0IDw8RU9GCisKK0VPRgorICBleGl0IDAKK2ZpCisKKyMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0CisjIGlmIENEUEFUSCBpcyBzZXQuCitpZiB0ZXN0ICJYJHtDRFBBVEgrc2V0fSIgPSBYc2V0OyB0aGVuIENEUEFUSD06OyBleHBvcnQgQ0RQQVRIOyBmaQorCitpZiB0ZXN0IC16ICIkRUNITyI7IHRoZW4KK2lmIHRlc3QgIlgke2VjaG9fdGVzdF9zdHJpbmcrc2V0fSIgIT0gWHNldDsgdGhlbgorIyBmaW5kIGEgc3RyaW5nIGFzIGxhcmdlIGFzIHBvc3NpYmxlLCBhcyBsb25nIGFzIHRoZSBzaGVsbCBjYW4gY29wZSB3aXRoIGl0CisgIGZvciBjbWQgaW4gJ3NlZCA1MHEgIiQwIicgJ3NlZCAyMHEgIiQwIicgJ3NlZCAxMHEgIiQwIicgJ3NlZCAycSAiJDAiJyAnZWNobyB0ZXN0JzsgZG8KKyAgICAjIGV4cGVjdGVkIHNpemVzOiBsZXNzIHRoYW4gMktiLCAxS2IsIDUxMiBieXRlcywgMTYgYnl0ZXMsIC4uLgorICAgIGlmIChlY2hvX3Rlc3Rfc3RyaW5nPSJgZXZhbCAkY21kYCIpIDI+L2Rldi9udWxsICYmCisgICAgICAgZWNob190ZXN0X3N0cmluZz0iYGV2YWwgJGNtZGAiICYmCisgICAgICAgKHRlc3QgIlgkZWNob190ZXN0X3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGwKKyAgICB0aGVuCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKK2ZpCisKK2lmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgorICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRlY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgorICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCisgIDoKK2Vsc2UKKyAgIyBUaGUgU29sYXJpcywgQUlYLCBhbmQgRGlnaXRhbCBVbml4IGRlZmF1bHQgZWNobyBwcm9ncmFtcyB1bnF1b3RlCisgICMgYmFja3NsYXNoZXMuICBUaGlzIG1ha2VzIGl0IGltcG9zc2libGUgdG8gcXVvdGUgYmFja3NsYXNoZXMgdXNpbmcKKyAgIyAgIGVjaG8gIiRzb21ldGhpbmciIHwgc2VkICdzL1xcL1xcXFwvZycKKyAgIworICAjIFNvLCBmaXJzdCB3ZSBsb29rIGZvciBhIHdvcmtpbmcgZWNobyBpbiB0aGUgdXNlcidzIFBBVEguCisKKyAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgZm9yIGRpciBpbiAkUEFUSCAvdXNyL3VjYjsgZG8KKyAgICBpZiAodGVzdCAtZiAkZGlyL2VjaG8gfHwgdGVzdCAtZiAkZGlyL2VjaG8kYWNfZXhlZXh0KSAmJgorICAgICAgIHRlc3QgIlhgKCRkaXIvZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKKyAgICAgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJGRpci9lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgorICAgICAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgorICAgICAgZWNobz0iJGRpci9lY2hvIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJHNhdmVfaWZzIgorCisgIGlmIHRlc3QgIlgkZWNobyIgPSBYZWNobzsgdGhlbgorICAgICMgV2UgZGlkbid0IGZpbmQgYSBiZXR0ZXIgZWNobywgc28gbG9vayBmb3IgYWx0ZXJuYXRpdmVzLgorICAgIGlmIHRlc3QgIlhgKHByaW50IC1yICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgorICAgICAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YChwcmludCAtciAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKKyAgICAgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KKyAgICAgICMgVGhpcyBzaGVsbCBoYXMgYSBidWlsdGluIHByaW50IC1yIHRoYXQgZG9lcyB0aGUgdHJpY2suCisgICAgICBlY2hvPSdwcmludCAtcicKKyAgICBlbGlmICh0ZXN0IC1mIC9iaW4va3NoIHx8IHRlc3QgLWYgL2Jpbi9rc2gkYWNfZXhlZXh0KSAmJgorCSB0ZXN0ICJYJENPTkZJR19TSEVMTCIgIT0gWC9iaW4va3NoOyB0aGVuCisgICAgICAjIElmIHdlIGhhdmUga3NoLCB0cnkgcnVubmluZyBjb25maWd1cmUgYWdhaW4gd2l0aCBpdC4KKyAgICAgIE9SSUdJTkFMX0NPTkZJR19TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorICAgICAgZXhwb3J0IE9SSUdJTkFMX0NPTkZJR19TSEVMTAorICAgICAgQ09ORklHX1NIRUxMPS9iaW4va3NoCisgICAgICBleHBvcnQgQ09ORklHX1NIRUxMCisgICAgICBleGVjICRDT05GSUdfU0hFTEwgIiQwIiAtLW5vLXJlZXhlYyAkezErIiRAIn0KKyAgICBlbHNlCisgICAgICAjIFRyeSB1c2luZyBwcmludGYuCisgICAgICBlY2hvPSdwcmludGYgJXNcbicKKyAgICAgIGlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgorCSBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJGVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCisJIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgorCSMgQ29vbCwgcHJpbnRmIHdvcmtzCisJOgorICAgICAgZWxpZiBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJE9SSUdJTkFMX0NPTkZJR19TSEVMTCAiJDAiIC0tZmFsbGJhY2stZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAgJiYKKwkgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gJ1hcdCcgJiYKKwkgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJE9SSUdJTkFMX0NPTkZJR19TSEVMTCAiJDAiIC0tZmFsbGJhY2stZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKKwkgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KKwlDT05GSUdfU0hFTEw9JE9SSUdJTkFMX0NPTkZJR19TSEVMTAorCWV4cG9ydCBDT05GSUdfU0hFTEwKKwlTSEVMTD0iJENPTkZJR19TSEVMTCIKKwlleHBvcnQgU0hFTEwKKwllY2hvPSIkQ09ORklHX1NIRUxMICQwIC0tZmFsbGJhY2stZWNobyIKKyAgICAgIGVsaWYgZWNob190ZXN0aW5nX3N0cmluZz1gKCRDT05GSUdfU0hFTEwgIiQwIiAtLWZhbGxiYWNrLWVjaG8gJ1x0JykgMj4vZGV2L251bGxgICYmCisJICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICdYXHQnICYmCisJICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRDT05GSUdfU0hFTEwgIiQwIiAtLWZhbGxiYWNrLWVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCisJICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCisJZWNobz0iJENPTkZJR19TSEVMTCAkMCAtLWZhbGxiYWNrLWVjaG8iCisgICAgICBlbHNlCisJIyBtYXliZSB3aXRoIGEgc21hbGxlciBzdHJpbmcuLi4KKwlwcmV2PToKKworCWZvciBjbWQgaW4gJ2VjaG8gdGVzdCcgJ3NlZCAycSAiJDAiJyAnc2VkIDEwcSAiJDAiJyAnc2VkIDIwcSAiJDAiJyAnc2VkIDUwcSAiJDAiJzsgZG8KKwkgIGlmICh0ZXN0ICJYJGVjaG9fdGVzdF9zdHJpbmciID0gIlhgZXZhbCAkY21kYCIpIDI+L2Rldi9udWxsCisJICB0aGVuCisJICAgIGJyZWFrCisJICBmaQorCSAgcHJldj0iJGNtZCIKKwlkb25lCisKKwlpZiB0ZXN0ICIkcHJldiIgIT0gJ3NlZCA1MHEgIiQwIic7IHRoZW4KKwkgIGVjaG9fdGVzdF9zdHJpbmc9YGV2YWwgJHByZXZgCisJICBleHBvcnQgZWNob190ZXN0X3N0cmluZworCSAgZXhlYyAke09SSUdJTkFMX0NPTkZJR19TSEVMTC0ke0NPTkZJR19TSEVMTC0vYmluL3NofX0gIiQwIiAkezErIiRAIn0KKwllbHNlCisJICAjIE9vcHMuICBXZSBsb3N0IGNvbXBsZXRlbHksIHNvIGp1c3Qgc3RpY2sgd2l0aCBlY2hvLgorCSAgZWNobz1lY2hvCisJZmkKKyAgICAgIGZpCisgICAgZmkKKyAgZmkKK2ZpCitmaQorCisjIENvcHkgZWNobyBhbmQgcXVvdGUgdGhlIGNvcHkgc3VpdGFibHkgZm9yIHBhc3NpbmcgdG8gbGlidG9vbCBmcm9tCisjIHRoZSBNYWtlZmlsZSwgaW5zdGVhZCBvZiBxdW90aW5nIHRoZSBvcmlnaW5hbCwgd2hpY2ggaXMgdXNlZCBsYXRlci4KK0VDSE89JGVjaG8KK2lmIHRlc3QgIlgkRUNITyIgPSAiWCRDT05GSUdfU0hFTEwgJDAgLS1mYWxsYmFjay1lY2hvIjsgdGhlbgorICAgRUNITz0iJENPTkZJR19TSEVMTCBcXFwkXCQwIC0tZmFsbGJhY2stZWNobyIKK2ZpCisKKyMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KK2FzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JworYXNfY3JfTEVUVEVSUz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCithc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKK2FzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKK2FzX2NyX2FsbnVtPSRhc19jcl9MZXR0ZXJzJGFzX2NyX2RpZ2l0cworCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZS4KK2FzX3RyX3NoPSJzZWQgeSUqKyVwcCU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyIKKworIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgorYXNfdHJfY3BwPSJzZWQgeSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnIgorCisjIEJlIEJvdXJuZSBjb21wYXRpYmxlCitpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgZW11bGF0ZSBzaAorICBOVUxMQ01EPToKK2VsaWYgdGVzdCAtbiAiJHtCQVNIX1ZFUlNJT04rc2V0fSIgJiYgKHNldCAtbyBwb3NpeCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHNldCAtbyBwb3NpeAorZmkKKworIyBOYW1lIG9mIHRoZSBleGVjdXRhYmxlLgorYXNfbWU9YGVjaG8gIiQwIiB8c2VkICdzLC4qW1xcL10sLCdgCisKK2lmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX2V4cHI9ZXhwcgorZWxzZQorICBhc19leHByPWZhbHNlCitmaQorCitybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZmlsZQorZWNobyA+Y29uZiQkLmZpbGUKK2lmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICAjIFdlIGNvdWxkIGp1c3QgY2hlY2sgZm9yIERKR1BQOyBidXQgdGhpcyB0ZXN0IGEpIHdvcmtzIGIpIGlzIG1vcmUgZ2VuZXJpYworICAjIGFuZCBjKSB3aWxsIHJlbWFpbiB2YWxpZCBvbmNlIERKR1BQIHN1cHBvcnRzIHN5bWxpbmtzIChESkdQUCAyLjA0KS4KKyAgaWYgdGVzdCAtZiBjb25mJCQuZXhlOyB0aGVuCisgICAgIyBEb24ndCB1c2UgbG4gYXQgYWxsOyB3ZSBkb24ndCBoYXZlIGFueSBsaW5rcworICAgIGFzX2xuX3M9J2NwIC1wJworICBlbHNlCisgICAgYXNfbG5fcz0nbG4gLXMnCisgIGZpCitlbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19sbl9zPWxuCitlbHNlCisgIGFzX2xuX3M9J2NwIC1wJworZmkKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCisKK2FzX2V4ZWN1dGFibGVfcD0idGVzdCAtZiIKKworIyBTdXBwb3J0IHVuc2V0IHdoZW4gcG9zc2libGUuCitpZiAoRk9PPUZPTzsgdW5zZXQgRk9PKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfdW5zZXQ9dW5zZXQKK2Vsc2UKKyAgYXNfdW5zZXQ9ZmFsc2UKK2ZpCisKKyMgTkxTIG51aXNhbmNlcy4KKyRhc191bnNldCBMQU5HIHx8IHRlc3QgIiR7TEFORytzZXR9IiAhPSBzZXQgfHwgeyBMQU5HPUM7IGV4cG9ydCBMQU5HOyB9CiskYXNfdW5zZXQgTENfQUxMIHx8IHRlc3QgIiR7TENfQUxMK3NldH0iICE9IHNldCB8fCB7IExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyB9CiskYXNfdW5zZXQgTENfVElNRSB8fCB0ZXN0ICIke0xDX1RJTUUrc2V0fSIgIT0gc2V0IHx8IHsgTENfVElNRT1DOyBleHBvcnQgTENfVElNRTsgfQorJGFzX3Vuc2V0IExDX0NUWVBFIHx8IHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgIT0gc2V0IHx8IHsgTENfQ1RZUEU9QzsgZXhwb3J0IExDX0NUWVBFOyB9CiskYXNfdW5zZXQgTEFOR1VBR0UgfHwgdGVzdCAiJHtMQU5HVUFHRStzZXR9IiAhPSBzZXQgfHwgeyBMQU5HVUFHRT1DOyBleHBvcnQgTEFOR1VBR0U7IH0KKyRhc191bnNldCBMQ19DT0xMQVRFIHx8IHRlc3QgIiR7TENfQ09MTEFURStzZXR9IiAhPSBzZXQgfHwgeyBMQ19DT0xMQVRFPUM7IGV4cG9ydCBMQ19DT0xMQVRFOyB9CiskYXNfdW5zZXQgTENfTlVNRVJJQyB8fCB0ZXN0ICIke0xDX05VTUVSSUMrc2V0fSIgIT0gc2V0IHx8IHsgTENfTlVNRVJJQz1DOyBleHBvcnQgTENfTlVNRVJJQzsgfQorJGFzX3Vuc2V0IExDX01FU1NBR0VTIHx8IHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgIT0gc2V0IHx8IHsgTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyB9CisKKyMgSUZTCisjIFdlIG5lZWQgc3BhY2UsIHRhYiBhbmQgbmV3IGxpbmUsIGluIHByZWNpc2VseSB0aGF0IG9yZGVyLgorYXNfbmw9JworJworSUZTPSIgCSRhc19ubCIKKworIyBDRFBBVEguCiskYXNfdW5zZXQgQ0RQQVRIIHx8IHRlc3QgIiR7Q0RQQVRIK3NldH0iICE9IHNldCB8fCB7IENEUEFUSD06OyBleHBvcnQgQ0RQQVRIOyB9CisKKyMgTmFtZSBvZiB0aGUgaG9zdC4KKyMgaG9zdG5hbWUgb24gc29tZSBzeXN0ZW1zIChTVlIzLjIsIExpbnV4KSByZXR1cm5zIGEgYm9ndXMgZXhpdCBzdGF0dXMsCisjIHNvIHVuYW1lIGdldHMgcnVuIHRvby4KK2FjX2hvc3RuYW1lPWAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAorCitleGVjIDY+JjEKKworIworIyBJbml0aWFsaXphdGlvbnMuCisjCithY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCitjcm9zc19jb21waWxpbmc9bm8KK3N1YmRpcnM9CitNRkxBR1M9IE1BS0VGTEFHUz0KK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisKKyMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KKyMgVGhpcyB2YXJpYWJsZSBzZWVtcyBvYnNvbGV0ZS4gIEl0IHNob3VsZCBwcm9iYWJseSBiZSByZW1vdmVkLCBhbmQKKyMgb25seSBhY19tYXhfc2VkX2xpbmVzIHNob3VsZCBiZSB1c2VkLgorOiAke2FjX21heF9oZXJlX2xpbmVzPTM4fQorCithY191bmlxdWVfZmlsZT0ibW9kX2dzb2FwL21vZF9nc29hcC5jIgorYWNfdW5pcXVlX2ZpbGU9Im1vZF9nc29hcC9tb2RfZ3NvYXAuYyIKKyMgRmFjdG9yaW5nIGRlZmF1bHQgaGVhZGVycyBmb3IgbW9zdCB0ZXN0cy4KK2FjX2luY2x1ZGVzX2RlZmF1bHQ9IlwKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmIEhBVkVfU1lTX1RZUEVTX0gKKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKyNpZiBIQVZFX1NZU19TVEFUX0gKKyMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2lmIFNURENfSEVBREVSUworIyBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgaW5jbHVkZSA8c3RkZGVmLmg+CisjZWxzZQorIyBpZiBIQVZFX1NURExJQl9ICisjICBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgZW5kaWYKKyNlbmRpZgorI2lmIEhBVkVfU1RSSU5HX0gKKyMgaWYgIVNURENfSEVBREVSUyAmJiBIQVZFX01FTU9SWV9ICisjICBpbmNsdWRlIDxtZW1vcnkuaD4KKyMgZW5kaWYKKyMgaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKyNpZiBIQVZFX1NUUklOR1NfSAorIyBpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNpZiBIQVZFX0lOVFRZUEVTX0gKKyMgaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbHNlCisjIGlmIEhBVkVfU1RESU5UX0gKKyMgIGluY2x1ZGUgPHN0ZGludC5oPgorIyBlbmRpZgorI2VuZGlmCisjaWYgSEFWRV9VTklTVERfSAorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZiIKKworIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgorYWNfaW5pdF9oZWxwPQorYWNfaW5pdF92ZXJzaW9uPWZhbHNlCisjIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAorIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgorY2FjaGVfZmlsZT0vZGV2L251bGwKK2V4ZWNfcHJlZml4PU5PTkUKK25vX2NyZWF0ZT0KK25vX3JlY3Vyc2lvbj0KK3ByZWZpeD1OT05FCitwcm9ncmFtX3ByZWZpeD1OT05FCitwcm9ncmFtX3N1ZmZpeD1OT05FCitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAorc2lsZW50PQorc2l0ZT0KK3NyY2Rpcj0KK3ZlcmJvc2U9Cit4X2luY2x1ZGVzPU5PTkUKK3hfbGlicmFyaWVzPU5PTkUKKworIyBJbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9wdGlvbnMuCisjIFRoZXNlIGFyZSBsZWZ0IHVuZXhwYW5kZWQgc28gdXNlcnMgY2FuICJtYWtlIGluc3RhbGwgZXhlY19wcmVmaXg9L2ZvbyIKKyMgYW5kIGFsbCB0aGUgdmFyaWFibGVzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIGJhc2VkIG9uIGV4ZWNfcHJlZml4CisjIGJ5IGRlZmF1bHQgd2lsbCBhY3R1YWxseSBjaGFuZ2UuCisjIFVzZSBicmFjZXMgaW5zdGVhZCBvZiBwYXJlbnMgYmVjYXVzZSBzaCwgcGVybCwgZXRjLiBhbHNvIGFjY2VwdCB0aGVtLgorYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCitzYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJworbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKK2RhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKK3N5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCitzaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKK2xvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCitsaWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKK2luY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJworb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJworaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCittYW5kaXI9JyR7cHJlZml4fS9tYW4nCisKKyMgSWRlbnRpdHkgb2YgdGhpcyBwYWNrYWdlLgorUEFDS0FHRV9OQU1FPQorUEFDS0FHRV9UQVJOQU1FPQorUEFDS0FHRV9WRVJTSU9OPQorUEFDS0FHRV9TVFJJTkc9CitQQUNLQUdFX0JVR1JFUE9SVD0KKworYWNfcHJldj0KK2ZvciBhY19vcHRpb24KK2RvCisgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKKyAgICBhY19wcmV2PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgYWNfb3B0YXJnPWBleHByICJ4JGFjX29wdGlvbiIgOiAneFtePV0qPVwoLipcKSdgCisKKyAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KKworICBjYXNlICRhY19vcHRpb24gaW4KKworICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQorICAgIGFjX3ByZXY9YmluZGlyIDs7CisgIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCisgICAgYmluZGlyPSRhY19vcHRhcmcgOzsKKworICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQorICAgIGFjX3ByZXY9YnVpbGRfYWxpYXMgOzsKKyAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCisgICAgYnVpbGRfYWxpYXM9JGFjX29wdGFyZyA7OworCisgIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKKyAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCisgICAgYWNfcHJldj1jYWNoZV9maWxlIDs7CisgIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAorICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQorICAgIGNhY2hlX2ZpbGU9JGFjX29wdGFyZyA7OworCisgIC0tY29uZmlnLWNhY2hlIHwgLUMpCisgICAgY2FjaGVfZmlsZT1jb25maWcuY2FjaGUgOzsKKworICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKKyAgICBhY19wcmV2PWRhdGFkaXIgOzsKKyAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCisgIHwgLS1kYT0qKQorICAgIGRhdGFkaXI9JGFjX29wdGFyZyA7OworCisgIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKKyAgICBhY19mZWF0dXJlPWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZGlzYWJsZS1cKC4qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX2ZlYXR1cmUiIDogIi4qW14tXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY19mZWF0dXJlIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmUgfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgImVuYWJsZV8kYWNfZmVhdHVyZT1ubyIgOzsKKworICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSplbmFibGUtXChbXj1dKlwpJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgZXhwciAieCRhY19mZWF0dXJlIiA6ICIuKlteLV8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgZmVhdHVyZSBuYW1lOiAkYWNfZmVhdHVyZSIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlIHwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICRhY19vcHRpb24gaW4KKyAgICAgICo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0YXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgImVuYWJsZV8kYWNfZmVhdHVyZT0nJGFjX29wdGFyZyciIDs7CisKKyAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAorICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCisgIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQorICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKKyAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCisgIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCisgIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQorICAgIGV4ZWNfcHJlZml4PSRhY19vcHRhcmcgOzsKKworICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgorICAgIHdpdGhfZ2FzPXllcyA7OworCisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLWgpCisgICAgYWNfaW5pdF9oZWxwPWxvbmcgOzsKKyAgLWhlbHA9ciogfCAtLWhlbHA9ciogfCAtLWhlbD1yKiB8IC0taGU9ciogfCAtaHIqKQorICAgIGFjX2luaXRfaGVscD1yZWN1cnNpdmUgOzsKKyAgLWhlbHA9cyogfCAtLWhlbHA9cyogfCAtLWhlbD1zKiB8IC0taGU9cyogfCAtaHMqKQorICAgIGFjX2luaXRfaGVscD1zaG9ydCA7OworCisgIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQorICAgIGFjX3ByZXY9aG9zdF9hbGlhcyA7OworICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQorICAgIGhvc3RfYWxpYXM9JGFjX29wdGFyZyA7OworCisgIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKKyAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKKyAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKKyAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKKyAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQorICAgIGluY2x1ZGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCisgICAgYWNfcHJldj1pbmZvZGlyIDs7CisgIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCisgICAgaW5mb2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKKyAgICBhY19wcmV2PWxpYmRpciA7OworICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCisgICAgbGliZGlyPSRhY19vcHRhcmcgOzsKKworICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCisgIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQorICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OworICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAorICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKKyAgICBsaWJleGVjZGlyPSRhY19vcHRhcmcgOzsKKworICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCisgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKKyAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCisgICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7CisgIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAorICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKKyAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQorICAgIGxvY2Fsc3RhdGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCisgICAgYWNfcHJldj1tYW5kaXIgOzsKKyAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQorICAgIG1hbmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLW5mcCB8IC0tbmZwIHwgLS1uZikKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgorICAgIHdpdGhfZnA9bm8gOzsKKworICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpCisgICAgbm9fY3JlYXRlPXllcyA7OworCisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKKyAgICBub19yZWN1cnNpb249eWVzIDs7CisKKyAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAorICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKKyAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQorICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OworICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKKyAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAorICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQorICAgIG9sZGluY2x1ZGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCisgICAgYWNfcHJldj1wcmVmaXggOzsKKyAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQorICAgIHByZWZpeD0kYWNfb3B0YXJnIDs7CisKKyAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKKyAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCisgICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OworICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKKyAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQorICAgIHByb2dyYW1fcHJlZml4PSRhY19vcHRhcmcgOzsKKworICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAorICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKKyAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7CisgIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAorICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCisgICAgcHJvZ3JhbV9zdWZmaXg9JGFjX29wdGFyZyA7OworCisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAorICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKKyAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQorICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAorICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCisgIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKKyAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSRhY19vcHRhcmcgOzsKKworICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICBzaWxlbnQ9eWVzIDs7CisKKyAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCisgICAgYWNfcHJldj1zYmluZGlyIDs7CisgIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCisgIHwgLS1zYmk9KiB8IC0tc2I9KikKKyAgICBzYmluZGlyPSRhY19vcHRhcmcgOzsKKworICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKKyAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCisgIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCisgIHwgLS1zaGEgfCAtLXNoKQorICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKKyAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCisgIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCisgIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAorICB8IC0tc2hhPSogfCAtLXNoPSopCisgICAgc2hhcmVkc3RhdGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCisgICAgYWNfcHJldj1zaXRlIDs7CisgIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCisgICAgc2l0ZT0kYWNfb3B0YXJnIDs7CisKKyAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKKyAgICBhY19wcmV2PXNyY2RpciA7OworICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQorICAgIHNyY2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAorICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKKyAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKKyAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKKyAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQorICAgIHN5c2NvbmZkaXI9JGFjX29wdGFyZyA7OworCisgIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCisgICAgYWNfcHJldj10YXJnZXRfYWxpYXMgOzsKKyAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQorICAgIHRhcmdldF9hbGlhcz0kYWNfb3B0YXJnIDs7CisKKyAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKKyAgICB2ZXJib3NlPXllcyA7OworCisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLVYpCisgICAgYWNfaW5pdF92ZXJzaW9uPTogOzsKKworICAtd2l0aC0qIHwgLS13aXRoLSopCisgICAgYWNfcGFja2FnZT1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKndpdGgtXChbXj1dKlwpJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgZXhwciAieCRhY19wYWNrYWdlIiA6ICIuKlteLV8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgcGFja2FnZSBuYW1lOiAkYWNfcGFja2FnZSIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgJGFjX29wdGlvbiBpbgorICAgICAgKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRhcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAid2l0aF8kYWNfcGFja2FnZT0nJGFjX29wdGFyZyciIDs7CisKKyAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQorICAgIGFjX3BhY2thZ2U9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSp3aXRob3V0LVwoLipcKSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfcGFja2FnZSIgOiAiLipbXi1fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIHBhY2thZ2UgbmFtZTogJGFjX3BhY2thZ2UiID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZSB8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAid2l0aF8kYWNfcGFja2FnZT1ubyIgOzsKKworICAtLXgpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgorICAgIHdpdGhfeD15ZXMgOzsKKworICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCisgIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCisgICAgYWNfcHJldj14X2luY2x1ZGVzIDs7CisgIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCisgIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKKyAgICB4X2luY2x1ZGVzPSRhY19vcHRhcmcgOzsKKworICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAorICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKKyAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7CisgIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKKyAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCisgICAgeF9saWJyYXJpZXM9JGFjX29wdGFyZyA7OworCisgIC0qKSB7IGVjaG8gIiRhc19tZTogZXJyb3I6IHVucmVjb2duaXplZCBvcHRpb246ICRhY19vcHRpb24KK1RyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgIDs7CisKKyAgKj0qKQorICAgIGFjX2VudnZhcj1gZXhwciAieCRhY19vcHRpb24iIDogJ3hcKFtePV0qXCk9J2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgZXhwciAieCRhY19lbnZ2YXIiIDogIi4qW15fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIHZhcmlhYmxlIG5hbWU6ICRhY19lbnZ2YXIiID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICAgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0YXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYAorICAgIGV2YWwgIiRhY19lbnZ2YXI9JyRhY19vcHRhcmcnIgorICAgIGV4cG9ydCAkYWNfZW52dmFyIDs7CisKKyAgKikKKyAgICAjIEZJWE1FOiBzaG91bGQgYmUgcmVtb3ZlZCBpbiBhdXRvY29uZiAzLjAuCisgICAgZWNobyAiJGFzX21lOiBXQVJOSU5HOiB5b3Ugc2hvdWxkIHVzZSAtLWJ1aWxkLCAtLWhvc3QsIC0tdGFyZ2V0IiA+JjIKKyAgICBleHByICJ4JGFjX29wdGlvbiIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIGVjaG8gIiRhc19tZTogV0FSTklORzogaW52YWxpZCBob3N0IHR5cGU6ICRhY19vcHRpb24iID4mMgorICAgIDogJHtidWlsZF9hbGlhcz0kYWNfb3B0aW9ufSAke2hvc3RfYWxpYXM9JGFjX29wdGlvbn0gJHt0YXJnZXRfYWxpYXM9JGFjX29wdGlvbn0KKyAgICA7OworCisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgIGFjX29wdGlvbj0tLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AKKyAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvICRhY19vcHRpb24iID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitmaQorCisjIEJlIHN1cmUgdG8gaGF2ZSBhYnNvbHV0ZSBwYXRocy4KK2ZvciBhY192YXIgaW4gZXhlY19wcmVmaXggcHJlZml4CitkbworICBldmFsIGFjX3ZhbD0kYGVjaG8gJGFjX3ZhcmAKKyAgY2FzZSAkYWNfdmFsIGluCisgICAgW1xcLyRdKiB8ID86W1xcL10qIHwgTk9ORSB8ICcnICkgOzsKKyAgICAqKSAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBleHBlY3RlZCBhbiBhYnNvbHV0ZSBwYXRoIGZvciAtLSRhY192YXI6ICRhY192YWwiID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKKyAgZXNhYworZG9uZQorCisjIEJlIHN1cmUgdG8gaGF2ZSBhYnNvbHV0ZSBwYXRocy4KK2ZvciBhY192YXIgaW4gYmluZGlyIHNiaW5kaXIgbGliZXhlY2RpciBkYXRhZGlyIHN5c2NvbmZkaXIgc2hhcmVkc3RhdGVkaXIgXAorICAgICAgICAgICAgICBsb2NhbHN0YXRlZGlyIGxpYmRpciBpbmNsdWRlZGlyIG9sZGluY2x1ZGVkaXIgaW5mb2RpciBtYW5kaXIKK2RvCisgIGV2YWwgYWNfdmFsPSRgZWNobyAkYWNfdmFyYAorICBjYXNlICRhY192YWwgaW4KKyAgICBbXFwvJF0qIHwgPzpbXFwvXSogKSA7OworICAgICopICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGV4cGVjdGVkIGFuIGFic29sdXRlIHBhdGggZm9yIC0tJGFjX3ZhcjogJGFjX3ZhbCIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworICBlc2FjCitkb25lCisKKyMgVGhlcmUgbWlnaHQgYmUgcGVvcGxlIHdobyBkZXBlbmQgb24gdGhlIG9sZCBicm9rZW4gYmVoYXZpb3I6IGAkaG9zdCcKKyMgdXNlZCB0byBob2xkIHRoZSBhcmd1bWVudCBvZiAtLWhvc3QgZXRjLgorYnVpbGQ9JGJ1aWxkX2FsaWFzCitob3N0PSRob3N0X2FsaWFzCit0YXJnZXQ9JHRhcmdldF9hbGlhcworCisjIEZJWE1FOiBzaG91bGQgYmUgcmVtb3ZlZCBpbiBhdXRvY29uZiAzLjAuCitpZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiICE9IHg7IHRoZW4KKyAgaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgPSB4OyB0aGVuCisgICAgY3Jvc3NfY29tcGlsaW5nPW1heWJlCisgICAgZWNobyAiJGFzX21lOiBXQVJOSU5HOiBJZiB5b3Ugd2FudGVkIHRvIHNldCB0aGUgLS1idWlsZCB0eXBlLCBkb24ndCB1c2UgLS1ob3N0LgorICAgIElmIGEgY3Jvc3MgY29tcGlsZXIgaXMgZGV0ZWN0ZWQgdGhlbiBjcm9zcyBjb21waWxlIG1vZGUgd2lsbCBiZSB1c2VkLiIgPiYyCisgIGVsaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgIT0gIngkaG9zdF9hbGlhcyI7IHRoZW4KKyAgICBjcm9zc19jb21waWxpbmc9eWVzCisgIGZpCitmaQorCithY190b29sX3ByZWZpeD0KK3Rlc3QgLW4gIiRob3N0X2FsaWFzIiAmJiBhY190b29sX3ByZWZpeD0kaG9zdF9hbGlhcy0KKwordGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgZXhlYyA2Pi9kZXYvbnVsbAorCisjIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCitpZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgorICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcworICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KKyAgYWNfcHJvZz0kMAorICBhY19jb25mZGlyPWBlY2hvICIkYWNfcHJvZyIgfCBzZWQgJ3MlW1xcL11bXlxcL11bXlxcL10qJCUlJ2AKKyAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgorICBzcmNkaXI9JGFjX2NvbmZkaXIKKyAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgICAgc3JjZGlyPS4uCisgIGZpCitlbHNlCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KK2ZpCitpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCisgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICBlbHNlCisgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgIGZpCitmaQorc3JjZGlyPWBlY2hvICIkc3JjZGlyIiB8IHNlZCAncyVcKFteXFwvXVwpW1xcL10qJCVcMSUnYAorYWNfZW52X2J1aWxkX2FsaWFzX3NldD0ke2J1aWxkX2FsaWFzK3NldH0KK2FjX2Vudl9idWlsZF9hbGlhc192YWx1ZT0kYnVpbGRfYWxpYXMKK2FjX2N2X2Vudl9idWlsZF9hbGlhc19zZXQ9JHtidWlsZF9hbGlhcytzZXR9CithY19jdl9lbnZfYnVpbGRfYWxpYXNfdmFsdWU9JGJ1aWxkX2FsaWFzCithY19lbnZfaG9zdF9hbGlhc19zZXQ9JHtob3N0X2FsaWFzK3NldH0KK2FjX2Vudl9ob3N0X2FsaWFzX3ZhbHVlPSRob3N0X2FsaWFzCithY19jdl9lbnZfaG9zdF9hbGlhc19zZXQ9JHtob3N0X2FsaWFzK3NldH0KK2FjX2N2X2Vudl9ob3N0X2FsaWFzX3ZhbHVlPSRob3N0X2FsaWFzCithY19lbnZfdGFyZ2V0X2FsaWFzX3NldD0ke3RhcmdldF9hbGlhcytzZXR9CithY19lbnZfdGFyZ2V0X2FsaWFzX3ZhbHVlPSR0YXJnZXRfYWxpYXMKK2FjX2N2X2Vudl90YXJnZXRfYWxpYXNfc2V0PSR7dGFyZ2V0X2FsaWFzK3NldH0KK2FjX2N2X2Vudl90YXJnZXRfYWxpYXNfdmFsdWU9JHRhcmdldF9hbGlhcworYWNfZW52X0NDX3NldD0ke0NDK3NldH0KK2FjX2Vudl9DQ192YWx1ZT0kQ0MKK2FjX2N2X2Vudl9DQ19zZXQ9JHtDQytzZXR9CithY19jdl9lbnZfQ0NfdmFsdWU9JENDCithY19lbnZfQ0ZMQUdTX3NldD0ke0NGTEFHUytzZXR9CithY19lbnZfQ0ZMQUdTX3ZhbHVlPSRDRkxBR1MKK2FjX2N2X2Vudl9DRkxBR1Nfc2V0PSR7Q0ZMQUdTK3NldH0KK2FjX2N2X2Vudl9DRkxBR1NfdmFsdWU9JENGTEFHUworYWNfZW52X0xERkxBR1Nfc2V0PSR7TERGTEFHUytzZXR9CithY19lbnZfTERGTEFHU192YWx1ZT0kTERGTEFHUworYWNfY3ZfZW52X0xERkxBR1Nfc2V0PSR7TERGTEFHUytzZXR9CithY19jdl9lbnZfTERGTEFHU192YWx1ZT0kTERGTEFHUworYWNfZW52X0NQUEZMQUdTX3NldD0ke0NQUEZMQUdTK3NldH0KK2FjX2Vudl9DUFBGTEFHU192YWx1ZT0kQ1BQRkxBR1MKK2FjX2N2X2Vudl9DUFBGTEFHU19zZXQ9JHtDUFBGTEFHUytzZXR9CithY19jdl9lbnZfQ1BQRkxBR1NfdmFsdWU9JENQUEZMQUdTCithY19lbnZfQ1BQX3NldD0ke0NQUCtzZXR9CithY19lbnZfQ1BQX3ZhbHVlPSRDUFAKK2FjX2N2X2Vudl9DUFBfc2V0PSR7Q1BQK3NldH0KK2FjX2N2X2Vudl9DUFBfdmFsdWU9JENQUAorYWNfZW52X0NYWF9zZXQ9JHtDWFgrc2V0fQorYWNfZW52X0NYWF92YWx1ZT0kQ1hYCithY19jdl9lbnZfQ1hYX3NldD0ke0NYWCtzZXR9CithY19jdl9lbnZfQ1hYX3ZhbHVlPSRDWFgKK2FjX2Vudl9DWFhGTEFHU19zZXQ9JHtDWFhGTEFHUytzZXR9CithY19lbnZfQ1hYRkxBR1NfdmFsdWU9JENYWEZMQUdTCithY19jdl9lbnZfQ1hYRkxBR1Nfc2V0PSR7Q1hYRkxBR1Mrc2V0fQorYWNfY3ZfZW52X0NYWEZMQUdTX3ZhbHVlPSRDWFhGTEFHUworCisjCisjIFJlcG9ydCB0aGUgLS1oZWxwIG1lc3NhZ2UuCisjCitpZiB0ZXN0ICIkYWNfaW5pdF9oZWxwIiA9ICJsb25nIjsgdGhlbgorICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KKyAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgorICBjYXQgPDxFT0YKK1xgY29uZmlndXJlJyBjb25maWd1cmVzIHRoaXMgcGFja2FnZSB0byBhZGFwdCB0byBtYW55IGtpbmRzIG9mIHN5c3RlbXMuCisKK1VzYWdlOiAkMCBbT1BUSU9OXS4uLiBbVkFSPVZBTFVFXS4uLgorCitUbyBhc3NpZ24gZW52aXJvbm1lbnQgdmFyaWFibGVzIChlLmcuLCBDQywgQ0ZMQUdTLi4uKSwgc3BlY2lmeSB0aGVtIGFzCitWQVI9VkFMVUUuICBTZWUgYmVsb3cgZm9yIGRlc2NyaXB0aW9ucyBvZiBzb21lIG9mIHRoZSB1c2VmdWwgdmFyaWFibGVzLgorCitEZWZhdWx0cyBmb3IgdGhlIG9wdGlvbnMgYXJlIHNwZWNpZmllZCBpbiBicmFja2V0cy4KKworQ29uZmlndXJhdGlvbjoKKyAgLWgsIC0taGVscCAgICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQKKyAgICAgIC0taGVscD1zaG9ydCAgICAgICAgZGlzcGxheSBvcHRpb25zIHNwZWNpZmljIHRvIHRoaXMgcGFja2FnZQorICAgICAgLS1oZWxwPXJlY3Vyc2l2ZSAgICBkaXNwbGF5IHRoZSBzaG9ydCBoZWxwIG9mIGFsbCB0aGUgaW5jbHVkZWQgcGFja2FnZXMKKyAgLVYsIC0tdmVyc2lvbiAgICAgICAgICAgZGlzcGxheSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0CisgIC1xLCAtLXF1aWV0LCAtLXNpbGVudCAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcworICAgICAgLS1jYWNoZS1maWxlPUZJTEUgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRSBbZGlzYWJsZWRdCisgIC1DLCAtLWNvbmZpZy1jYWNoZSAgICAgIGFsaWFzIGZvciBcYC0tY2FjaGUtZmlsZT1jb25maWcuY2FjaGUnCisgIC1uLCAtLW5vLWNyZWF0ZSAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCisgICAgICAtLXNyY2Rpcj1ESVIgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIFxgLi4nXQorCitFT0YKKworICBjYXQgPDxFT0YKK0luc3RhbGxhdGlvbiBkaXJlY3RvcmllczoKKyAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCisgIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVhdCisKK0J5IGRlZmF1bHQsIFxgbWFrZSBpbnN0YWxsJyB3aWxsIGluc3RhbGwgYWxsIHRoZSBmaWxlcyBpbgorXGAkYWNfZGVmYXVsdF9wcmVmaXgvYmluJywgXGAkYWNfZGVmYXVsdF9wcmVmaXgvbGliJyBldGMuICBZb3UgY2FuIHNwZWNpZnkKK2FuIGluc3RhbGxhdGlvbiBwcmVmaXggb3RoZXIgdGhhbiBcYCRhY19kZWZhdWx0X3ByZWZpeCcgdXNpbmcgXGAtLXByZWZpeCcsCitmb3IgaW5zdGFuY2UgXGAtLXByZWZpeD1cJEhPTUUnLgorCitGb3IgYmV0dGVyIGNvbnRyb2wsIHVzZSB0aGUgb3B0aW9ucyBiZWxvdy4KKworRmluZSB0dW5pbmcgb2YgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcmllczoKKyAgLS1iaW5kaXI9RElSICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIFtFUFJFRklYL2Jpbl0KKyAgLS1zYmluZGlyPURJUiAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgW0VQUkVGSVgvc2Jpbl0KKyAgLS1saWJleGVjZGlyPURJUiAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIFtFUFJFRklYL2xpYmV4ZWNdCisgIC0tZGF0YWRpcj1ESVIgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIFtQUkVGSVgvc2hhcmVdCisgIC0tc3lzY29uZmRpcj1ESVIgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgW1BSRUZJWC9ldGNdCisgIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbUFJFRklYL2NvbV0KKyAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgW1BSRUZJWC92YXJdCisgIC0tbGliZGlyPURJUiAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIFtFUFJFRklYL2xpYl0KKyAgLS1pbmNsdWRlZGlyPURJUiAgICAgICBDIGhlYWRlciBmaWxlcyBbUFJFRklYL2luY2x1ZGVdCisgIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgWy91c3IvaW5jbHVkZV0KKyAgLS1pbmZvZGlyPURJUiAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gW1BSRUZJWC9pbmZvXQorICAtLW1hbmRpcj1ESVIgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIFtQUkVGSVgvbWFuXQorRU9GCisKKyAgY2F0IDw8XEVPRgorCitQcm9ncmFtIG5hbWVzOgorICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCAgICAgICAgICAgIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYICAgICAgICAgICAgYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTSAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworCitTeXN0ZW0gdHlwZXM6CisgIC0tYnVpbGQ9QlVJTEQgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW2d1ZXNzZWRdCisgIC0taG9zdD1IT1NUICAgICAgIGJ1aWxkIHByb2dyYW1zIHRvIHJ1biBvbiBIT1NUIFtCVUlMRF0KKyAgLS10YXJnZXQ9VEFSR0VUICAgY29uZmlndXJlIGZvciBidWlsZGluZyBjb21waWxlcnMgZm9yIFRBUkdFVCBbSE9TVF0KK0VPRgorZmkKKworaWYgdGVzdCAtbiAiJGFjX2luaXRfaGVscCI7IHRoZW4KKworICBjYXQgPDxcRU9GCisKK09wdGlvbmFsIEZlYXR1cmVzOgorICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCisgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KKyAgLS1kaXNhYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgU3BlZWRzIHVwIG9uZS10aW1lIGJ1aWxkcworICAtLWVuYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nICBEbyBub3QgcmVqZWN0IHNsb3cgZGVwZW5kZW5jeSBleHRyYWN0b3JzCisgIC0tZW5hYmxlLWRlYnVnCWFkZCBkZWJ1ZyBzeW1ib2xzIHRvIGNvbXBpbGVyIGFuZCBsaW5rZXIgb3V0cHV0IGZvciBzb3VyY2UgY29kZSBkZWJ1Z2dpbmcKKyAgLS1lbmFibGUtc2hhcmVkPVBLR1MgIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgZGVmYXVsdD15ZXMKKyAgLS1lbmFibGUtc3RhdGljPVBLR1MgIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgZGVmYXVsdD15ZXMKKyAgLS1lbmFibGUtZmFzdC1pbnN0YWxsPVBLR1MgIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBkZWZhdWx0PXllcworICAtLWRpc2FibGUtbGlidG9vbC1sb2NrICBhdm9pZCBsb2NraW5nIChtaWdodCBicmVhayBwYXJhbGxlbCBidWlsZHMpCisKK09wdGlvbmFsIFBhY2thZ2VzOgorICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KKyAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQorICAtLXdpdGgtZ251LWxkICAgICAgICAgICBhc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgZGVmYXVsdD1ubworICAtLXdpdGgtcGljICAgICAgICAgICAgICB0cnkgdG8gdXNlIG9ubHkgUElDL25vbi1QSUMgb2JqZWN0cyBkZWZhdWx0PXVzZSBib3RoCisKK1NvbWUgaW5mbHVlbnRpYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzOgorICBDQyAgICAgICAgICBDIGNvbXBpbGVyIGNvbW1hbmQKKyAgQ0ZMQUdTICAgICAgQyBjb21waWxlciBmbGFncworICBMREZMQUdTICAgICBsaW5rZXIgZmxhZ3MsIGUuZy4gLUw8bGliIGRpcj4gaWYgeW91IGhhdmUgbGlicmFyaWVzIGluIGEKKyAgICAgICAgICAgICAgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxsaWIgZGlyPgorICBDUFBGTEFHUyAgICBDL0MrKyBwcmVwcm9jZXNzb3IgZmxhZ3MsIGUuZy4gLUk8aW5jbHVkZSBkaXI+IGlmIHlvdSBoYXZlCisgICAgICAgICAgICAgIGhlYWRlcnMgaW4gYSBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGluY2x1ZGUgZGlyPgorICBDUFAgICAgICAgICBDIHByZXByb2Nlc3NvcgorICBDWFggICAgICAgICBDKysgY29tcGlsZXIgY29tbWFuZAorICBDWFhGTEFHUyAgICBDKysgY29tcGlsZXIgZmxhZ3MKKworVXNlIHRoZXNlIHZhcmlhYmxlcyB0byBvdmVycmlkZSB0aGUgY2hvaWNlcyBtYWRlIGJ5IGBjb25maWd1cmUnIG9yIHRvIGhlbHAKK2l0IHRvIGZpbmQgbGlicmFyaWVzIGFuZCBwcm9ncmFtcyB3aXRoIG5vbnN0YW5kYXJkIG5hbWVzL2xvY2F0aW9ucy4KKworRU9GCitmaQorCitpZiB0ZXN0ICIkYWNfaW5pdF9oZWxwIiA9ICJyZWN1cnNpdmUiOyB0aGVuCisgICMgSWYgdGhlcmUgYXJlIHN1YmRpcnMsIHJlcG9ydCB0aGVpciBzcGVjaWZpYyAtLWhlbHAuCisgIGFjX3BvcGRpcj1gcHdkYAorICBmb3IgYWNfc3ViZGlyIGluIDogJGFjX3N1YmRpcnNfYWxsOyBkbyB0ZXN0ICJ4JGFjX3N1YmRpciIgPSB4OiAmJiBjb250aW51ZQorICAgIGNkICRhY19zdWJkaXIKKyAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluIC8kYWNfc3ViZGlyLgorICAgIGFjX2RvdHM9YGVjaG8gJGFjX3N1YmRpciB8CisgICAgICAgICAgICAgc2VkICdzLF5cLi8sLDtzLFteL10kLCYvLDtzLFteL10qLywuLi8sZydgCisKKyAgICBjYXNlICRzcmNkaXIgaW4KKyAgICAuKSAjIE5vIC0tc3JjZGlyIG9wdGlvbi4gIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KKyAgICAgIGFjX3N1Yl9zcmNkaXI9JHNyY2RpciA7OworICAgIFtcXC9dKiB8ID86W1xcL10qICkgIyBBYnNvbHV0ZSBwYXRoLgorICAgICAgYWNfc3ViX3NyY2Rpcj0kc3JjZGlyLyRhY19zdWJkaXIgOzsKKyAgICAqKSAjIFJlbGF0aXZlIHBhdGguCisgICAgICBhY19zdWJfc3JjZGlyPSRhY19kb3RzJHNyY2Rpci8kYWNfc3ViZGlyIDs7CisgICAgZXNhYworCisgICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmU7IG90aGVyd2lzZSBnZXQgQ3lnbnVzIHN0eWxlIGNvbmZpZ3VyZS4KKyAgICBpZiB0ZXN0IC1mICRhY19zdWJfc3JjZGlyL2NvbmZpZ3VyZS5nbnU7IHRoZW4KKyAgICAgIGVjaG8KKyAgICAgICRTSEVMTCAkYWNfc3ViX3NyY2Rpci9jb25maWd1cmUuZ251ICAtLWhlbHA9cmVjdXJzaXZlCisgICAgZWxpZiB0ZXN0IC1mICRhY19zdWJfc3JjZGlyL2NvbmZpZ3VyZTsgdGhlbgorICAgICAgZWNobworICAgICAgJFNIRUxMICRhY19zdWJfc3JjZGlyL2NvbmZpZ3VyZSAgLS1oZWxwPXJlY3Vyc2l2ZQorICAgIGVsaWYgdGVzdCAtZiAkYWNfc3ViX3NyY2Rpci9jb25maWd1cmUuYWMgfHwKKyAgICAgICAgICAgdGVzdCAtZiAkYWNfc3ViX3NyY2Rpci9jb25maWd1cmUuaW47IHRoZW4KKyAgICAgIGVjaG8KKyAgICAgICRhY19jb25maWd1cmUgLS1oZWxwCisgICAgZWxzZQorICAgICAgZWNobyAiJGFzX21lOiBXQVJOSU5HOiBubyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGluICRhY19zdWJkaXIiID4mMgorICAgIGZpCisgICAgY2QgJGFjX3BvcGRpcgorICBkb25lCitmaQorCit0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIiAmJiBleGl0IDAKK2lmICRhY19pbml0X3ZlcnNpb247IHRoZW4KKyAgY2F0IDw8XEVPRgorCitDb3B5cmlnaHQgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorCitEaXBsLi1JbmcuIENocmlzdGlhbiBBYmVyZ2VyIChodHRwOi8vd3d3LmFiZXJnZXIuYXQpCitFT0YKKyAgZXhpdCAwCitmaQorZXhlYyA1PmNvbmZpZy5sb2cKK2NhdCA+JjUgPDxFT0YKK1RoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCitydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgorCitJdCB3YXMgY3JlYXRlZCBieSAkYXNfbWUsIHdoaWNoIHdhcworZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjUyLiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCisKKyAgJCAkMCAkQAorCitFT0YKK3sKK2NhdCA8PF9BU1VOQU1FCisjIyAtLS0tLS0tLS0tICMjCisjIyBQbGF0Zm9ybS4gICMjCisjIyAtLS0tLS0tLS0tICMjCisKK2hvc3RuYW1lID0gYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCit1bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKworL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCisvYmluL3VuYW1lIC1YICAgICA9IGAoL2Jpbi91bmFtZSAtWCkgMj4vZGV2L251bGwgICAgIHx8IGVjaG8gdW5rbm93bmAKKworL2Jpbi9hcmNoICAgICAgICAgICAgICA9IGAoL2Jpbi9hcmNoKSAyPi9kZXYvbnVsbCAgICAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9iaW4vYXJjaCAtayAgICAgICA9IGAoL3Vzci9iaW4vYXJjaCAtaykgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAoraG9zdGluZm8gICAgICAgICAgICAgICA9IGAoaG9zdGluZm8pIDI+L2Rldi9udWxsICAgICAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorL2Jpbi9tYWNoaW5lICAgICAgICAgICA9IGAoL2Jpbi9tYWNoaW5lKSAyPi9kZXYvbnVsbCAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9iaW4vb3NsZXZlbCAgICAgICA9IGAoL3Vzci9iaW4vb3NsZXZlbCkgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAorL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGwgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorCitQQVRIID0gJFBBVEgKKworX0FTVU5BTUUKK30gPiY1CisKK2NhdCA+JjUgPDxFT0YKKyMjIC0tLS0tLS0tLS0tLSAjIworIyMgQ29yZSB0ZXN0cy4gICMjCisjIyAtLS0tLS0tLS0tLS0gIyMKKworRU9GCisKKyMgS2VlcCBhIHRyYWNlIG9mIHRoZSBjb21tYW5kIGxpbmUuCisjIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKyMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGEtY2hhcmFjdGVycy4KK2FjX2NvbmZpZ3VyZV9hcmdzPQorYWNfc2VwPQorZm9yIGFjX2FyZworZG8KKyAgY2FzZSAkYWNfYXJnIGluCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykgOzsKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OworICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP1wiXCddKikKKyAgICBhY19hcmc9YGVjaG8gIiRhY19hcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgCisgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyRhY19zZXAnJGFjX2FyZyciCisgICAgYWNfc2VwPSIgIiA7OworICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzJGFjX3NlcCRhY19hcmciCisgICAgIGFjX3NlcD0iICIgOzsKKyAgZXNhYworICAjIEdldCByaWQgb2YgdGhlIGxlYWRpbmcgc3BhY2UuCitkb25lCisKKyMgV2hlbiBpbnRlcnJ1cHRlZCBvciBleGl0J2QsIGNsZWFudXAgdGVtcG9yYXJ5IGZpbGVzLCBhbmQgY29tcGxldGUKKyMgY29uZmlnLmxvZy4gIFdlIHJlbW92ZSBjb21tZW50cyBiZWNhdXNlIGFueXdheSB0aGUgcXVvdGVzIGluIHRoZXJlCisjIHdvdWxkIGNhdXNlIHByb2JsZW1zIG9yIGxvb2sgdWdseS4KK3RyYXAgJ2V4aXRfc3RhdHVzPSQ/CisgICMgU2F2ZSBpbnRvIGNvbmZpZy5sb2cgc29tZSBpbmZvcm1hdGlvbiB0aGF0IG1pZ2h0IGhlbHAgaW4gZGVidWdnaW5nLgorICBlY2hvID4mNQorICBlY2hvICIjIyAtLS0tLS0tLS0tLS0tLS0tLSAjIyIgPiY1CisgIGVjaG8gIiMjIENhY2hlIHZhcmlhYmxlcy4gICMjIiA+JjUKKyAgZWNobyAiIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMiID4mNQorICBlY2hvID4mNQorICAjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAoreworICAoc2V0KSAyPiYxIHwKKyAgICBjYXNlIGAoYWNfc3BhY2U9JyInIicgJyInIic7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCisgICAgKmFjX3NwYWNlPVwgKikKKyAgICAgIHNlZCAtbiBcCisgICAgICAgICJzLyciJyInLyciJyInXFxcXCciJyInJyInIicvZzsKKyAgICAJICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSciJyInXFwyJyInIicvcCIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIHNlZCAtbiBcCisgICAgICAgICJzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPVxcMi9wIgorICAgICAgOzsKKyAgICBlc2FjOworfSA+JjUKKyAgc2VkICIvXiQvZCIgY29uZmRlZnMuaCA+Y29uZnRlc3QubG9nCisgIGlmIHRlc3QgLXMgY29uZnRlc3QubG9nOyB0aGVuCisgICAgZWNobyA+JjUKKyAgICBlY2hvICIjIyAtLS0tLS0tLS0tLS0gIyMiID4mNQorICAgIGVjaG8gIiMjIGNvbmZkZWZzLmguICAjIyIgPiY1CisgICAgZWNobyAiIyMgLS0tLS0tLS0tLS0tICMjIiA+JjUKKyAgICBlY2hvID4mNQorICAgIGNhdCBjb25mdGVzdC5sb2cgPiY1CisgIGZpCisgIChlY2hvOyBlY2hvKSA+JjUKKyAgdGVzdCAiJGFjX3NpZ25hbCIgIT0gMCAmJgorICAgIGVjaG8gIiRhc19tZTogY2F1Z2h0IHNpZ25hbCAkYWNfc2lnbmFsIiA+JjUKKyAgZWNobyAiJGFzX21lOiBleGl0ICRleGl0X3N0YXR1cyIgPiY1CisgIHJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSBjb25mJCQqICRhY19jbGVhbl9maWxlcyAmJgorICAgIGV4aXQgJGV4aXRfc3RhdHVzCisgICAgICcgMAorZm9yIGFjX3NpZ25hbCBpbiAxIDIgMTMgMTU7IGRvCisgIHRyYXAgJ2FjX3NpZ25hbD0nJGFjX3NpZ25hbCc7IHsgKGV4aXQgMSk7IGV4aXQgMTsgfScgJGFjX3NpZ25hbAorZG9uZQorYWNfc2lnbmFsPTAKKworIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KK3JtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAorIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCitlY2hvID5jb25mZGVmcy5oCisKKyMgTGV0IHRoZSBzaXRlIGZpbGUgc2VsZWN0IGFuIGFsdGVybmF0ZSBjYWNoZSBmaWxlIGlmIGl0IHdhbnRzIHRvLgorIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KK2lmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KKyAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCisgICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGVsc2UKKyAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGZpCitmaQorZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCisgIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCisgICAgeyBlY2hvICIkYXNfbWU6MTA1MzogbG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIiA+JjUKK2VjaG8gIiRhc19tZTogbG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIiA+JjY7fQorICAgIGNhdCAiJGFjX3NpdGVfZmlsZSIgPiY1CisgICAgLiAiJGFjX3NpdGVfZmlsZSIKKyAgZmkKK2RvbmUKKworaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgICMgU29tZSB2ZXJzaW9ucyBvZiBiYXNoIHdpbGwgZmFpbCB0byBzb3VyY2UgL2Rldi9udWxsIChzcGVjaWFsCisgICMgZmlsZXMgYWN0dWFsbHkpLCBzbyB3ZSBhdm9pZCBkb2luZyB0aGF0LgorICBpZiB0ZXN0IC1mICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgICB7IGVjaG8gIiRhc19tZToxMDY0OiBsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKK2VjaG8gIiRhc19tZTogbG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKyAgICBjYXNlICRjYWNoZV9maWxlIGluCisgICAgICBbXFwvXSogfCA/OltcXC9dKiApIC4gJGNhY2hlX2ZpbGU7OworICAgICAgKikgICAgICAgICAgICAgICAgICAgICAgLiAuLyRjYWNoZV9maWxlOzsKKyAgICBlc2FjCisgIGZpCitlbHNlCisgIHsgZWNobyAiJGFzX21lOjEwNzI6IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKK2VjaG8gIiRhc19tZTogY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9CisgID4kY2FjaGVfZmlsZQorZmkKKworIyBDaGVjayB0aGF0IHRoZSBwcmVjaW91cyB2YXJpYWJsZXMgc2F2ZWQgaW4gdGhlIGNhY2hlIGhhdmUga2VwdCB0aGUgc2FtZQorIyB2YWx1ZS4KK2FjX2NhY2hlX2NvcnJ1cHRlZD1mYWxzZQorZm9yIGFjX3ZhciBpbiBgKHNldCkgMj4mMSB8CisgICAgICAgICAgICAgICBzZWQgLW4gJ3MvXmFjX2Vudl9cKFthLXpBLVpfMC05XSpcKV9zZXQ9LiovXDEvcCdgOyBkbworICBldmFsIGFjX29sZF9zZXQ9XCRhY19jdl9lbnZfJHthY192YXJ9X3NldAorICBldmFsIGFjX25ld19zZXQ9XCRhY19lbnZfJHthY192YXJ9X3NldAorICBldmFsIGFjX29sZF92YWw9IlwkYWNfY3ZfZW52XyR7YWNfdmFyfV92YWx1ZSIKKyAgZXZhbCBhY19uZXdfdmFsPSJcJGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWUiCisgIGNhc2UgJGFjX29sZF9zZXQsJGFjX25ld19zZXQgaW4KKyAgICBzZXQsKQorICAgICAgeyBlY2hvICIkYXNfbWU6MTA4ODogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjI7fQorICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKKyAgICAsc2V0KQorICAgICAgeyBlY2hvICIkYXNfbWU6MTA5MjogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mMjt9CisgICAgICBhY19jYWNoZV9jb3JydXB0ZWQ9OiA7OworICAgICwpOzsKKyAgICAqKQorICAgICAgaWYgdGVzdCAieCRhY19vbGRfdmFsIiAhPSAieCRhY19uZXdfdmFsIjsgdGhlbgorICAgICAgICB7IGVjaG8gIiRhc19tZToxMDk4OiBlcnJvcjogXGAkYWNfdmFyJyBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjI7fQorICAgICAgICB7IGVjaG8gIiRhc19tZToxMTAwOiAgIGZvcm1lciB2YWx1ZTogICRhY19vbGRfdmFsIiA+JjUKK2VjaG8gIiRhc19tZTogICBmb3JtZXIgdmFsdWU6ICAkYWNfb2xkX3ZhbCIgPiYyO30KKyAgICAgICAgeyBlY2hvICIkYXNfbWU6MTEwMjogICBjdXJyZW50IHZhbHVlOiAkYWNfbmV3X3ZhbCIgPiY1CitlY2hvICIkYXNfbWU6ICAgY3VycmVudCB2YWx1ZTogJGFjX25ld192YWwiID4mMjt9CisgICAgICAgIGFjX2NhY2hlX2NvcnJ1cHRlZD06CisgICAgICBmaTs7CisgIGVzYWMKKyAgIyBQYXNzIHByZWNpb3VzIHZhcmlhYmxlcyB0byBjb25maWcuc3RhdHVzLiAgSXQgZG9lc24ndCBtYXR0ZXIgaWYKKyAgIyB3ZSBwYXNzIHNvbWUgdHdpY2UgKGluIGFkZGl0aW9uIHRvIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzKS4KKyAgaWYgdGVzdCAiJGFjX25ld19zZXQiID0gc2V0OyB0aGVuCisgICAgY2FzZSAkYWNfbmV3X3ZhbCBpbgorICAgICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XCJcJ10qKQorICAgICAgYWNfYXJnPSRhY192YXI9YGVjaG8gIiRhY19uZXdfdmFsIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYAorICAgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciCisgICAgICA7OworICAgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX3Zhcj0kYWNfbmV3X3ZhbCIKKyAgICAgICA7OworICAgIGVzYWMKKyAgZmkKK2RvbmUKK2lmICRhY19jYWNoZV9jb3JydXB0ZWQ7IHRoZW4KKyAgeyBlY2hvICIkYXNfbWU6MTEyMTogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjaGFuZ2VzIGluIHRoZSBlbnZpcm9ubWVudCBjYW4gY29tcHJvbWlzZSB0aGUgYnVpbGQiID4mMjt9CisgIHsgeyBlY2hvICIkYXNfbWU6MTEyMzogZXJyb3I6IHJ1biBcYG1ha2UgZGlzdGNsZWFuJyBhbmQvb3IgXGBybSAkY2FjaGVfZmlsZScgYW5kIHN0YXJ0IG92ZXIiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogcnVuIFxgbWFrZSBkaXN0Y2xlYW4nIGFuZC9vciBcYHJtICRjYWNoZV9maWxlJyBhbmQgc3RhcnQgb3ZlciIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCitjYXNlIGBlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzYCxgZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzYCBpbgorICAqYyosLW4qKSBFQ0hPX049IEVDSE9fQz0nCisnIEVDSE9fVD0nCScgOzsKKyAgKmMqLCogICkgRUNIT19OPS1uIEVDSE9fQz0gRUNIT19UPSA7OworICAqKSAgICAgIEVDSE9fTj0gRUNIT19DPSdcYycgRUNIT19UPSA7OworZXNhYworZWNobyAiIyEgJFNIRUxMIiA+Y29uZnRlc3Quc2gKK2VjaG8gICJleGl0IDAiICAgPj5jb25mdGVzdC5zaAorY2htb2QgK3ggY29uZnRlc3Quc2gKK2lmIHsgKGVjaG8gIiRhc19tZToxMTQzOiBQQVRIPVwiLjsuXCI7IGNvbmZ0ZXN0LnNoIikgPiY1CisgIChQQVRIPSIuOy4iOyBjb25mdGVzdC5zaCkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjExNDY6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgorICBhY19wYXRoX3NlcGFyYXRvcj0nOycKK2Vsc2UKKyAgYWNfcGF0aF9zZXBhcmF0b3I9OgorZmkKK1BBVEhfU0VQQVJBVE9SPSIkYWNfcGF0aF9zZXBhcmF0b3IiCitybSAtZiBjb25mdGVzdC5zaAorCithY19hdXhfZGlyPQorZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KKyAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgorICAgIGJyZWFrCisgIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgorICAgIGJyZWFrCisgIGVsaWYgdGVzdCAtZiAkYWNfZGlyL3NodG9vbDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL3NodG9vbCBpbnN0YWxsIC1jIgorICAgIGJyZWFrCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KKyAgeyB7IGVjaG8gIiRhc19tZToxMTcyOiBlcnJvcjogY2Fubm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKK2FjX2NvbmZpZ19ndWVzcz0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcyIKK2FjX2NvbmZpZ19zdWI9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIgorYWNfY29uZmlndXJlPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlndXJlIiAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCisKKyMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KKyRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxIHx8CisgIHsgeyBlY2hvICIkYXNfbWU6MTE4MjogZXJyb3I6IGNhbm5vdCBydW4gJGFjX2NvbmZpZ19zdWIiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IHJ1biAkYWNfY29uZmlnX3N1YiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCitlY2hvICIkYXNfbWU6MTE4NjogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZS4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfYnVpbGQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYWNfY3ZfYnVpbGRfYWxpYXM9JGJ1aWxkX2FsaWFzCit0ZXN0IC16ICIkYWNfY3ZfYnVpbGRfYWxpYXMiICYmCisgIGFjX2N2X2J1aWxkX2FsaWFzPWAkYWNfY29uZmlnX2d1ZXNzYAordGVzdCAteiAiJGFjX2N2X2J1aWxkX2FsaWFzIiAmJgorICB7IHsgZWNobyAiJGFzX21lOjExOTU6IGVycm9yOiBjYW5ub3QgZ3Vlc3MgYnVpbGQgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGd1ZXNzIGJ1aWxkIHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CithY19jdl9idWlsZD1gJGFjX2NvbmZpZ19zdWIgJGFjX2N2X2J1aWxkX2FsaWFzYCB8fAorICB7IHsgZWNobyAiJGFzX21lOjExOTk6IGVycm9yOiAkYWNfY29uZmlnX3N1YiAkYWNfY3ZfYnVpbGRfYWxpYXMgZmFpbGVkLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiAkYWNfY29uZmlnX3N1YiAkYWNfY3ZfYnVpbGRfYWxpYXMgZmFpbGVkLiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCitmaQorZWNobyAiJGFzX21lOjEyMDQ6IHJlc3VsdDogJGFjX2N2X2J1aWxkIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9idWlsZCIgPiY2CitidWlsZD0kYWNfY3ZfYnVpbGQKK2J1aWxkX2NwdT1gZWNobyAkYWNfY3ZfYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAorYnVpbGRfdmVuZG9yPWBlY2hvICRhY19jdl9idWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCitidWlsZF9vcz1gZWNobyAkYWNfY3ZfYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorCit0ZXN0IC16ICIkYnVpbGRfYWxpYXMiICYmCisgIGJ1aWxkX2FsaWFzPSRhY19jdl9idWlsZAorCitlY2hvICIkYXNfbWU6MTIxNDogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X2hvc3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYWNfY3ZfaG9zdF9hbGlhcz0kaG9zdF9hbGlhcwordGVzdCAteiAiJGFjX2N2X2hvc3RfYWxpYXMiICYmCisgIGFjX2N2X2hvc3RfYWxpYXM9JGFjX2N2X2J1aWxkX2FsaWFzCithY19jdl9ob3N0PWAkYWNfY29uZmlnX3N1YiAkYWNfY3ZfaG9zdF9hbGlhc2AgfHwKKyAgeyB7IGVjaG8gIiRhc19tZToxMjIzOiBlcnJvcjogJGFjX2NvbmZpZ19zdWIgJGFjX2N2X2hvc3RfYWxpYXMgZmFpbGVkIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6ICRhY19jb25maWdfc3ViICRhY19jdl9ob3N0X2FsaWFzIGZhaWxlZCIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCitmaQorZWNobyAiJGFzX21lOjEyMjg6IHJlc3VsdDogJGFjX2N2X2hvc3QiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hvc3QiID4mNgoraG9zdD0kYWNfY3ZfaG9zdAoraG9zdF9jcHU9YGVjaG8gJGFjX2N2X2hvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAoraG9zdF92ZW5kb3I9YGVjaG8gJGFjX2N2X2hvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAoraG9zdF9vcz1gZWNobyAkYWNfY3ZfaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCisKK3Rlc3QgLXogIiRob3N0X2FsaWFzIiAmJgorICBob3N0X2FsaWFzPSRhY19jdl9ob3N0CisKK2VjaG8gIiRhc19tZToxMjM4OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3RhcmdldCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19jdl90YXJnZXRfYWxpYXM9JHRhcmdldF9hbGlhcwordGVzdCAieCRhY19jdl90YXJnZXRfYWxpYXMiID0gIngiICYmCisgIGFjX2N2X3RhcmdldF9hbGlhcz0kYWNfY3ZfaG9zdF9hbGlhcworYWNfY3ZfdGFyZ2V0PWAkYWNfY29uZmlnX3N1YiAkYWNfY3ZfdGFyZ2V0X2FsaWFzYCB8fAorICB7IHsgZWNobyAiJGFzX21lOjEyNDc6IGVycm9yOiAkYWNfY29uZmlnX3N1YiAkYWNfY3ZfdGFyZ2V0X2FsaWFzIGZhaWxlZCIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiAkYWNfY29uZmlnX3N1YiAkYWNfY3ZfdGFyZ2V0X2FsaWFzIGZhaWxlZCIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCitmaQorZWNobyAiJGFzX21lOjEyNTI6IHJlc3VsdDogJGFjX2N2X3RhcmdldCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfdGFyZ2V0IiA+JjYKK3RhcmdldD0kYWNfY3ZfdGFyZ2V0Cit0YXJnZXRfY3B1PWBlY2hvICRhY19jdl90YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAordGFyZ2V0X3ZlbmRvcj1gZWNobyAkYWNfY3ZfdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK3RhcmdldF9vcz1gZWNobyAkYWNfY3ZfdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKKworIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgorIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgordGVzdCAtbiAiJHRhcmdldF9hbGlhcyIgJiYKKyAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAorICAgIE5PTkVOT05Fcyx4LHgsICYmCisgIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KK3Rlc3QgLXogIiR0YXJnZXRfYWxpYXMiICYmCisgIHRhcmdldF9hbGlhcz0kYWNfY3ZfdGFyZ2V0CisKKyMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAorIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCisjIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKKyMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCisjIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKKyMgSVJJWCAvc2Jpbi9pbnN0YWxsCisjIEFJWCAvYmluL2luc3RhbGwKKyMgQW1pZ2FPUyAvQy9pbnN0YWxsLCB3aGljaCBpbnN0YWxscyBib290YmxvY2tzIG9uIGZsb3BweSBkaXNjcworIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKKyMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncworIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgorIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCitlY2hvICIkYXNfbWU6MTI4MDogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgICAgYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSRhY19wYXRoX3NlcGFyYXRvcgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIElGUz0kYWNfc2F2ZV9JRlMKKyAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KKyAgICBjYXNlICRhY19kaXIvIGluCisgICAgLyB8IC4vIHwgLi8vIHwgL2NDLyogXAorICAgIHwgL2V0Yy8qIHwgL3Vzci9zYmluLyogfCAvdXNyL2V0Yy8qIHwgL3NiaW4vKiB8IC91c3IvYWZzd3MvYmluLyogXAorICAgIHwgL3Vzci91Y2IvKiApIDs7CisgICAgKikKKyAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCisgICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKKyAgICAgICMgYnkgZGVmYXVsdC4KKyAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KKyAgICAgICAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFjX2Rpci8kYWNfcHJvZyI7IHRoZW4KKwkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCisgICAgICAgICAgICBncmVwIGRzcG1zZyAiJGFjX2Rpci8kYWNfcHJvZyIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KKwkgICAgOgorCSAgZWxpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorCSAgICBncmVwIHB3cGx1cyAiJGFjX2Rpci8kYWNfcHJvZyIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgcHJvZ3JhbS1zcGVjaWZpYyBpbnN0YWxsIHNjcmlwdCB1c2VkIGJ5IEhQIHB3cGx1cy0tZG9uJ3QgdXNlLgorCSAgICA6CisJICBlbHNlCisJICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKKwkgICAgYnJlYWsgMgorCSAgZmkKKwlmaQorICAgICAgZG9uZQorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKworZmkKKyAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgICBJTlNUQUxMPSRhY19jdl9wYXRoX2luc3RhbGwKKyAgZWxzZQorICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKKyAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKKyAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcworICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCisgICAgSU5TVEFMTD0kYWNfaW5zdGFsbF9zaAorICBmaQorZmkKK2VjaG8gIiRhc19tZToxMzI5OiByZXN1bHQ6ICRJTlNUQUxMIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRJTlNUQUxMIiA+JjYKKworIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgorIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KK3Rlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKKwordGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMfScKKwordGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKKworZWNobyAiJGFzX21lOjEzNDA6IGNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZS4uLiAkRUNIT19DIiA+JjYKKyMgSnVzdCBpbiBjYXNlCitzbGVlcCAxCitlY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0LmZpbGUKKyMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKKyMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQorIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcworIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKKyMgZGlyZWN0b3J5KS4KK2lmICgKKyAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZSAyPiAvZGV2L251bGxgCisgICBpZiB0ZXN0ICIkKiIgPSAiWCI7IHRoZW4KKyAgICAgICMgLUwgZGlkbid0IHdvcmsuCisgICAgICBzZXQgWCBgbHMgLXQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZWAKKyAgIGZpCisgICBybSAtZiBjb25mdGVzdC5maWxlCisgICBpZiB0ZXN0ICIkKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZSIgXAorICAgICAgJiYgdGVzdCAiJCoiICE9ICJYIGNvbmZ0ZXN0LmZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCisKKyAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KKyAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKKyAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKKyAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KKyAgICAgIHsgeyBlY2hvICIkYXNfbWU6MTM2NDogZXJyb3I6IGxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KK2FsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgorYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudCIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgZmkKKworICAgdGVzdCAiJDIiID0gY29uZnRlc3QuZmlsZQorICAgKQordGhlbgorICAgIyBPay4KKyAgIDoKK2Vsc2UKKyAgIHsgeyBlY2hvICIkYXNfbWU6MTM3NzogZXJyb3I6IG5ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQorQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2siID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCitDaGVjayB5b3VyIHN5c3RlbSBjbG9jayIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKK2VjaG8gIiRhc19tZToxMzgzOiByZXN1bHQ6IHllcyIgPiY1CitlY2hvICIke0VDSE9fVH15ZXMiID4mNgordGVzdCAiJHByb2dyYW1fcHJlZml4IiAhPSBOT05FICYmCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXiwkcHJvZ3JhbV9wcmVmaXgsOyRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgorIyBVc2UgYSBkb3VibGUgJCBzbyBtYWtlIGlnbm9yZXMgaXQuCit0ZXN0ICIkcHJvZ3JhbV9zdWZmaXgiICE9IE5PTkUgJiYKKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxcJCwkcHJvZ3JhbV9zdWZmaXgsOyRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgorIyBEb3VibGUgYW55IFwgb3IgJC4gIGVjaG8gbWlnaHQgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgorIyBCeSBkZWZhdWx0IHdhcyBgcyx4LHgnLCByZW1vdmUgaXQgaWYgdXNlbGVzcy4KK2NhdCA8PFxfQUNFT0YgPmNvbmZ0ZXN0LnNlZAorcy9bXFwkXS8mJi9nO3MvO3MseCx4LCQvLworX0FDRU9GCitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPWBlY2hvICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIHwgc2VkIC1mIGNvbmZ0ZXN0LnNlZGAKK3JtIGNvbmZ0ZXN0LnNlZAorCisjIGV4cGFuZCAkYWNfYXV4X2RpciB0byBhbiBhYnNvbHV0ZSBwYXRoCithbV9hdXhfZGlyPWBDRFBBVEg9OjsgY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAorCit0ZXN0IHgiJHtNSVNTSU5HK3NldH0iID0geHNldCB8fCBNSVNTSU5HPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvbWlzc2luZyIKKyMgVXNlIGV2YWwgdG8gZXhwYW5kICRTSEVMTAoraWYgZXZhbCAiJE1JU1NJTkcgLS1ydW4gdHJ1ZSI7IHRoZW4KKyAgYW1fbWlzc2luZ19ydW49IiRNSVNTSU5HIC0tcnVuICIKK2Vsc2UKKyAgYW1fbWlzc2luZ19ydW49CisgIGFtX2JhY2t0aWNrPSdgJworICB7IGVjaG8gIiRhc19tZToxNDA4OiBXQVJOSU5HOiAke2FtX2JhY2t0aWNrfW1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmciID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAke2FtX2JhY2t0aWNrfW1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmciID4mMjt9CitmaQorCitmb3IgYWNfcHJvZyBpbiBtYXdrIGdhd2sgbmF3ayBhd2sKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6MTQxNjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX0FXSytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQVdLIjsgdGhlbgorICBhY19jdl9wcm9nX0FXSz0iJEFXSyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIGFjX3NhdmVfSUZTPSRJRlM7IElGUz0kYWNfcGF0aF9zZXBhcmF0b3IKK2FjX2R1bW15PSIkUEFUSCIKK2ZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICBJRlM9JGFjX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICRhc19leGVjdXRhYmxlX3AgIiRhY19kaXIvJGFjX3dvcmQiIHx8IGNvbnRpbnVlCithY19jdl9wcm9nX0FXSz0iJGFjX3Byb2ciCitlY2hvICIkYXNfbWU6MTQzMTogZm91bmQgJGFjX2Rpci8kYWNfd29yZCIgPiY1CiticmVhaworZG9uZQorCitmaQorZmkKK0FXSz0kYWNfY3ZfcHJvZ19BV0sKK2lmIHRlc3QgLW4gIiRBV0siOyB0aGVuCisgIGVjaG8gIiRhc19tZToxNDM5OiByZXN1bHQ6ICRBV0siID4mNQorZWNobyAiJHtFQ0hPX1R9JEFXSyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZToxNDQyOiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgdGVzdCAtbiAiJEFXSyIgJiYgYnJlYWsKK2RvbmUKKworZWNobyAiJGFzX21lOjE0NDk6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9Li4uICRFQ0hPX0MiID4mNgorc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5LC4vKy0sX19wXywnYAoraWYgZXZhbCAidGVzdCBcIlwke2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCtzZXR9XCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QubWFrZSA8PFxFT0YKK2FsbDoKKwlAZWNobyAnYWNfbWFrZXRlbXA9IiR7TUFLRX0iJworRU9GCisjIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KK2V2YWwgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdC5tYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKK2lmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KKyAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCitlbHNlCisgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCitmaQorcm0gLWYgY29uZnRlc3QubWFrZQorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X3Byb2dfbWFrZV8nJHthY19tYWtlfV9zZXRgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhc19tZToxNDY5OiByZXN1bHQ6IHllcyIgPiY1CitlY2hvICIke0VDSE9fVH15ZXMiID4mNgorICBTRVRfTUFLRT0KK2Vsc2UKKyAgZWNobyAiJGFzX21lOjE0NzM6IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCitmaQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZGVwZW5kZW5jeS10cmFja2luZyBvciAtLWRpc2FibGUtZGVwZW5kZW5jeS10cmFja2luZyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIgorCitmaTsKK2lmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubzsgdGhlbgorICBhbV9kZXBjb21wPSIkYWNfYXV4X2Rpci9kZXBjb21wIgorICBBTURFUEJBQ0tTTEFTSD0nXCcKK2ZpCisKK2lmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubzsgdGhlbgorICBBTURFUF9UUlVFPQorICBBTURFUF9GQUxTRT0nIycKK2Vsc2UKKyAgQU1ERVBfVFJVRT0nIycKKyAgQU1ERVBfRkFMU0U9CitmaQorCitybSAtZiAuZGVwcyAyPi9kZXYvbnVsbAorbWtkaXIgLmRlcHMgMj4vZGV2L251bGwKK2lmIHRlc3QgLWQgLmRlcHM7IHRoZW4KKyAgREVQRElSPS5kZXBzCitlbHNlCisgICMgTVMtRE9TIGRvZXMgbm90IGFsbG93IGZpbGVuYW1lcyB0aGF0IGJlZ2luIHdpdGggYSBkb3QuCisgIERFUERJUj1fZGVwcworZmkKK3JtZGlyIC5kZXBzIDI+L2Rldi9udWxsCisKKyMgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAoraWYgdGVzdCAiYENEUEFUSD06OyBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYKKyAgIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCisgIHsgeyBlY2hvICIkYXNfbWU6MTUwOTogZXJyb3I6IHNvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gXCJtYWtlIGRpc3RjbGVhblwiIHRoZXJlIGZpcnN0IiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IHNvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gXCJtYWtlIGRpc3RjbGVhblwiIHRoZXJlIGZpcnN0IiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitmaQorCisjIERlZmluZSB0aGUgaWRlbnRpdHkgb2YgdGhlIHBhY2thZ2UuCitQQUNLQUdFPW1vZF9nc29hcAorVkVSU0lPTj0wLjAuNQorCitjYXQgPj5jb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIFBBQ0tBR0UgIiRQQUNLQUdFIgorRU9GCisKK2NhdCA+PmNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgVkVSU0lPTiAiJFZFUlNJT04iCitFT0YKKworIyBBdXRvY29uZiAyLjUwIHdhbnRzIHRvIGRpc2FsbG93IEFNXyBuYW1lcy4gIFdlIGV4cGxpY2l0bHkgYWxsb3cKKyMgdGhlIG9uZXMgd2UgY2FyZSBhYm91dC4KKworIyBBdXRvY29uZiAyLjUwIGFsd2F5cyBjb21wdXRlcyBFWEVFWFQuICBIb3dldmVyIHdlIG5lZWQgdG8gYmUKKyMgY29tcGF0aWJsZSB3aXRoIDIuMTMsIGZvciBub3cuICBTbyB3ZSBhbHdheXMgZGVmaW5lIEVYRUVYVCwgYnV0IHdlCisjIGRvbid0IGNvbXB1dGUgaXQuCisKKyMgU2ltaWxhciBmb3IgT0JKRVhUIC0tIG9ubHkgd2Ugb25seSB1c2UgT0JKRVhUIGlmIHRoZSB1c2VyIGFjdHVhbGx5CisjIHJlcXVlc3RzIHRoYXQgaXQgYmUgdXNlZC4gIFRoaXMgaXMgYSBiaXQgZHVtYi4KKzogJHtPQkpFWFQ9b30KKworIyBTb21lIHRvb2xzIEF1dG9tYWtlIG5lZWRzLgorCitBQ0xPQ0FMPSR7QUNMT0NBTC0iJHthbV9taXNzaW5nX3J1bn1hY2xvY2FsIn0KKworQVVUT0NPTkY9JHtBVVRPQ09ORi0iJHthbV9taXNzaW5nX3J1bn1hdXRvY29uZiJ9CisKK0FVVE9NQUtFPSR7QVVUT01BS0UtIiR7YW1fbWlzc2luZ19ydW59YXV0b21ha2UifQorCitBVVRPSEVBREVSPSR7QVVUT0hFQURFUi0iJHthbV9taXNzaW5nX3J1bn1hdXRvaGVhZGVyIn0KKworTUFLRUlORk89JHtNQUtFSU5GTy0iJHthbV9taXNzaW5nX3J1bn1tYWtlaW5mbyJ9CisKK0FNVEFSPSR7QU1UQVItIiR7YW1fbWlzc2luZ19ydW59dGFyIn0KKworaW5zdGFsbF9zaD0ke2luc3RhbGxfc2gtIiRhbV9hdXhfZGlyL2luc3RhbGwtc2gifQorCitJTlNUQUxMX1NUUklQX1BST0dSQU09Ilwke1NIRUxMfSBcJChpbnN0YWxsX3NoKSAtYyAtcyIKKworIyBXZSBuZWVkIGF3ayBmb3IgdGhlICJjaGVjayIgdGFyZ2V0LiAgVGhlIHN5c3RlbSAiYXdrIiBpcyBiYWQgb24KKyMgc29tZSBwbGF0Zm9ybXMuCisKKwkJICAgIAkJICAgIAkJICAgIGFjX2NvbmZpZ19oZWFkZXJzPSIkYWNfY29uZmlnX2hlYWRlcnMgY29uZmlnLmgiCisKKyNBQ19BUkdfV0lUSChnc29hcCwKKyMgICAgWyAgLS13aXRoLWdzb2FwPTxwYXRoPiAgIHByZWZpeCBvZiBnc29hcCBwb3J0IGluc3RhbGxhdGlvbi4gZS5nLiAvdXNyL2xvY2FsL3NvYXBjcHAgb3IgL2hvbWUvbXl1c2VybmFtZS9nc29hcF0sCisjICAgIFtHU09BUF9QUkVGSVg9JHdpdGhfZ3NvYXBdLAorIyAgICBBQ19NU0dfRVJST1IoW1lvdSBtdXN0IGNhbGwgY29uZmlndXJlIHdpdGggdGhlIC0td2l0aC1nc29hcD08cGF0aD4gb3B0aW9uLiA8cGF0aD4gaXMgdGhlIHBhdGggd2hlcmUgeW91IHVucGFja2VkIHRoZSBnc29hcCBkaXN0cmlidXRpb24gdG8uCisjICAgIFRoZSBoZWFkZXJzIGFuZCBzb3VyY2UgZG93bmxvYWRlZCBmcm9tIGh0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9zb2FwLmh0bWwgbXVzdCBiZSBhdmFpbGFibGUuCisjICAgIGUuZy4gLS13aXRoLWdzb2FwPS91c3IvbG9jYWwvZ3NvYXBdKQorIykKKworI0FDX0NIRUNLX0ZJTEUoW1skd2l0aF9nc29hcC9zdGRzb2FwMi5oXV0sIFtlY2hvIHN0ZHNvYXAyLmggZm91bmQgaW4gJHdpdGhfZ3NvYXBdLCBBQ19NU0dfRVJST1IoWyR3aXRoX2dzb2FwIGRvZXMgbm90IGNvbnRhaW4gc3Rkc29hcDIuaF0pKQorCisjQUNfU1VCU1QoR1NPQVBfUFJFRklYKQorI0dTT0FQX0NQUF9TUkM9IiR7R1NPQVBfUFJFRklYfS9zdGRzb2FwMi5jcHAiCisjR1NPQVBfQ19TUkM9IiR7R1NPQVBfUFJFRklYfS9zdGRzb2FwMi5jIgorI0dTT0FQX0lOQ0xVREU9Ii1JJHtHU09BUF9QUkVGSVh9IgorI0FDX1NVQlNUKEdTT0FQX0NQUF9TUkMpCisjQUNfU1VCU1QoR1NPQVBfQ19TUkMpCisjQUNfU1VCU1QoR1NPQVBfSU5DTFVERSkKKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJzb2FwY3BwMiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgc29hcGNwcDI7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZToxNTgwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfRVhJU1RTX0dTT0FQK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRFWElTVFNfR1NPQVAiOyB0aGVuCisgIGFjX2N2X3Byb2dfRVhJU1RTX0dTT0FQPSIkRVhJU1RTX0dTT0FQIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSRhY19wYXRoX3NlcGFyYXRvcgorYWNfZHVtbXk9IiRQQVRIIgorZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgIElGUz0kYWNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgJGFzX2V4ZWN1dGFibGVfcCAiJGFjX2Rpci8kYWNfd29yZCIgfHwgY29udGludWUKK2FjX2N2X3Byb2dfRVhJU1RTX0dTT0FQPSJ5ZXMiCitlY2hvICIkYXNfbWU6MTU5NTogZm91bmQgJGFjX2Rpci8kYWNfd29yZCIgPiY1CiticmVhaworZG9uZQorCitmaQorZmkKK0VYSVNUU19HU09BUD0kYWNfY3ZfcHJvZ19FWElTVFNfR1NPQVAKK2lmIHRlc3QgLW4gIiRFWElTVFNfR1NPQVAiOyB0aGVuCisgIGVjaG8gIiRhc19tZToxNjAzOiByZXN1bHQ6ICRFWElTVFNfR1NPQVAiID4mNQorZWNobyAiJHtFQ0hPX1R9JEVYSVNUU19HU09BUCIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZToxNjA2OiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKK2lmIHRlc3QgLXogIiRFWElTVFNfR1NPQVAiOyB0aGVuCisgICB7IHsgZWNobyAiJGFzX21lOjE2MTE6IGVycm9yOiBwbGVhc2UgaW5zdGFsbCBnc29hcCAtIGh0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9zb2FwLmh0bWwiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogcGxlYXNlIGluc3RhbGwgZ3NvYXAgLSBodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcC5odG1sIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitmaQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZGVidWcgb3IgLS1kaXNhYmxlLWRlYnVnIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2RlYnVnK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9kZWJ1ZyIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpIGRlYnVnPXRydWUgOzsKKyAgbm8pICBkZWJ1Zz1mYWxzZSA7OworICAqKSB7IHsgZWNobyAiJGFzX21lOjE2MjI6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciAtLWVuYWJsZS1kZWJ1ZyIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciAtLWVuYWJsZS1kZWJ1ZyIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfSA7OworZXNhYworZWxzZQorICBkZWJ1Zz1mYWxzZQorZmk7CisKK2lmIHRlc3QgeCRkZWJ1ZyA9IHh0cnVlOyB0aGVuCisgIERFQlVHX1RSVUU9CisgIERFQlVHX0ZBTFNFPScjJworZWxzZQorICBERUJVR19UUlVFPScjJworICBERUJVR19GQUxTRT0KK2ZpCisKK0NYWEZMQUdTPSIiCitpZiB0ZXN0IHgkZGVidWcgPSB4dHJ1ZTsgdGhlbgorICAgQ1hYREVCVUdERUZJTkVTPSItRF9ERUJVRyIKKyAgIEFQWFNfQ1hYX09QVElPTlM9Ii1XYywtZyIKK2Vsc2UKKyAgIENYWERFQlVHREVGSU5FUz0iLURfTkRFQlVHIgorICAgQVBYU19DWFhfT1BUSU9OUz0iIgorZmkKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQoraWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Z2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWdjYzsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOjE2NTU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIGFjX3NhdmVfSUZTPSRJRlM7IElGUz0kYWNfcGF0aF9zZXBhcmF0b3IKK2FjX2R1bW15PSIkUEFUSCIKK2ZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICBJRlM9JGFjX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICRhc19leGVjdXRhYmxlX3AgIiRhY19kaXIvJGFjX3dvcmQiIHx8IGNvbnRpbnVlCithY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWdjYyIKK2VjaG8gIiRhc19tZToxNjcwOiBmb3VuZCAkYWNfZGlyLyRhY193b3JkIiA+JjUKK2JyZWFrCitkb25lCisKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFzX21lOjE2Nzg6IHJlc3VsdDogJENDIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDQyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZToxNjgxOiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19DQyI7IHRoZW4KKyAgYWNfY3RfQ0M9JENDCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZToxNjkwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBhY19zYXZlX0lGUz0kSUZTOyBJRlM9JGFjX3BhdGhfc2VwYXJhdG9yCithY19kdW1teT0iJFBBVEgiCitmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgSUZTPSRhY19zYXZlX0lGUworICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAkYXNfZXhlY3V0YWJsZV9wICIkYWNfZGlyLyRhY193b3JkIiB8fCBjb250aW51ZQorYWNfY3ZfcHJvZ19hY19jdF9DQz0iZ2NjIgorZWNobyAiJGFzX21lOjE3MDU6IGZvdW5kICRhY19kaXIvJGFjX3dvcmQiID4mNQorYnJlYWsKK2RvbmUKKworZmkKK2ZpCithY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQworaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICBlY2hvICIkYXNfbWU6MTcxMzogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N0X0NDIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOjE3MTY6IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworICBDQz0kYWNfY3RfQ0MKK2Vsc2UKKyAgQ0M9IiRhY19jdl9wcm9nX0NDIgorZmkKKworaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1jYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1jYzsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOjE3Mjk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIGFjX3NhdmVfSUZTPSRJRlM7IElGUz0kYWNfcGF0aF9zZXBhcmF0b3IKK2FjX2R1bW15PSIkUEFUSCIKK2ZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICBJRlM9JGFjX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICRhc19leGVjdXRhYmxlX3AgIiRhY19kaXIvJGFjX3dvcmQiIHx8IGNvbnRpbnVlCithY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWNjIgorZWNobyAiJGFzX21lOjE3NDQ6IGZvdW5kICRhY19kaXIvJGFjX3dvcmQiID4mNQorYnJlYWsKK2RvbmUKKworZmkKK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYXNfbWU6MTc1MjogcmVzdWx0OiAkQ0MiID4mNQorZWNobyAiJHtFQ0hPX1R9JENDIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOjE3NTU6IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX0NDIjsgdGhlbgorICBhY19jdF9DQz0kQ0MKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZToxNzY0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBhY19zYXZlX0lGUz0kSUZTOyBJRlM9JGFjX3BhdGhfc2VwYXJhdG9yCithY19kdW1teT0iJFBBVEgiCitmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgSUZTPSRhY19zYXZlX0lGUworICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAkYXNfZXhlY3V0YWJsZV9wICIkYWNfZGlyLyRhY193b3JkIiB8fCBjb250aW51ZQorYWNfY3ZfcHJvZ19hY19jdF9DQz0iY2MiCitlY2hvICIkYXNfbWU6MTc3OTogZm91bmQgJGFjX2Rpci8kYWNfd29yZCIgPiY1CiticmVhaworZG9uZQorCitmaQorZmkKK2FjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCitpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIGVjaG8gIiRhc19tZToxNzg3OiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3RfQ0MiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6MTc5MDogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgIENDPSRhY19jdF9DQworZWxzZQorICBDQz0iJGFjX2N2X3Byb2dfQ0MiCitmaQorCitmaQoraWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjYzsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOjE4MDM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KKyAgYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSRhY19wYXRoX3NlcGFyYXRvcgorYWNfZHVtbXk9IiRQQVRIIgorZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgIElGUz0kYWNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgJGFzX2V4ZWN1dGFibGVfcCAiJGFjX2Rpci8kYWNfd29yZCIgfHwgY29udGludWUKK2lmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgorICBhY19wcm9nX3JlamVjdGVkPXllcworICBjb250aW51ZQorZmkKK2FjX2N2X3Byb2dfQ0M9ImNjIgorZWNobyAiJGFzX21lOjE4MjM6IGZvdW5kICRhY19kaXIvJGFjX3dvcmQiID4mNQorYnJlYWsKK2RvbmUKKworaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgorICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCisgIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQworICBzaGlmdAorICBpZiB0ZXN0ICQjICE9IDA7IHRoZW4KKyAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KKyAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCisgICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCisgICAgc2hpZnQKKyAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICR7MSsiJEAifQorICAgIHNoaWZ0CisgICAgYWNfY3ZfcHJvZ19DQz0iJEAiCisgIGZpCitmaQorZmkKK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYXNfbWU6MTg0NTogcmVzdWx0OiAkQ0MiID4mNQorZWNobyAiJHtFQ0hPX1R9JENDIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOjE4NDg6IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworZmkKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICBmb3IgYWNfcHJvZyBpbiBjbAorICBkbworICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6MTg1OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSRhY19wYXRoX3NlcGFyYXRvcgorYWNfZHVtbXk9IiRQQVRIIgorZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgIElGUz0kYWNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgJGFzX2V4ZWN1dGFibGVfcCAiJGFjX2Rpci8kYWNfd29yZCIgfHwgY29udGludWUKK2FjX2N2X3Byb2dfQ0M9IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgorZWNobyAiJGFzX21lOjE4NzQ6IGZvdW5kICRhY19kaXIvJGFjX3dvcmQiID4mNQorYnJlYWsKK2RvbmUKKworZmkKK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYXNfbWU6MTg4MjogcmVzdWx0OiAkQ0MiID4mNQorZWNobyAiJHtFQ0hPX1R9JENDIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOjE4ODU6IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworICAgIHRlc3QgLW4gIiRDQyIgJiYgYnJlYWsKKyAgZG9uZQorZmkKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgYWNfY3RfQ0M9JENDCisgIGZvciBhY19wcm9nIGluIGNsCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOjE4OTg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DQytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIGFjX3NhdmVfSUZTPSRJRlM7IElGUz0kYWNfcGF0aF9zZXBhcmF0b3IKK2FjX2R1bW15PSIkUEFUSCIKK2ZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICBJRlM9JGFjX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICRhc19leGVjdXRhYmxlX3AgIiRhY19kaXIvJGFjX3dvcmQiIHx8IGNvbnRpbnVlCithY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfcHJvZyIKK2VjaG8gIiRhc19tZToxOTEzOiBmb3VuZCAkYWNfZGlyLyRhY193b3JkIiA+JjUKK2JyZWFrCitkb25lCisKK2ZpCitmaQorYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKK2lmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgZWNobyAiJGFzX21lOjE5MjE6IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdF9DQyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZToxOTI0OiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgdGVzdCAtbiAiJGFjX2N0X0NDIiAmJiBicmVhaworZG9uZQorCisgIENDPSRhY19jdF9DQworZmkKKworZmkKKwordGVzdCAteiAiJENDIiAmJiB7IHsgZWNobyAiJGFzX21lOjE5MzY6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCisjIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCitlY2hvICIkYXNfbWU6MTk0MToiIFwKKyAgICAgImNoZWNraW5nIGZvciBDIGNvbXBpbGVyIHZlcnNpb24iID4mNQorYWNfY29tcGlsZXI9YHNldCBYICRhY19jb21waWxlOyBlY2hvICQyYAoreyAoZXZhbCBlY2hvICIkYXNfbWU6MTk0NDogXCIkYWNfY29tcGlsZXIgLS12ZXJzaW9uIDwvZGV2L251bGwgPiY1XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGVyIC0tdmVyc2lvbiA8L2Rldi9udWxsID4mNSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjE5NDc6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfQoreyAoZXZhbCBlY2hvICIkYXNfbWU6MTk0OTogXCIkYWNfY29tcGlsZXIgLXYgPC9kZXYvbnVsbCA+JjVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZXIgLXYgPC9kZXYvbnVsbCA+JjUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZToxOTUyOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KK3sgKGV2YWwgZWNobyAiJGFzX21lOjE5NTQ6IFwiJGFjX2NvbXBpbGVyIC1WIDwvZGV2L251bGwgPiY1XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGVyIC1WIDwvZGV2L251bGwgPiY1KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6MTk1NzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9CisKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorI2xpbmUgMTk2MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2FjX2NsZWFuX2ZpbGVzX3NhdmU9JGFjX2NsZWFuX2ZpbGVzCithY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzIGEub3V0IGEuZXhlIgorIyBUcnkgdG8gY3JlYXRlIGFuIGV4ZWN1dGFibGUgd2l0aG91dCAtbyBmaXJzdCwgZGlzcmVnYXJkIGEub3V0LgorIyBJdCB3aWxsIGhlbHAgdXMgZGlhZ25vc2UgYnJva2VuIGNvbXBpbGVycywgYW5kIGZpbmRpbmcgb3V0IGFuIGludHVpdGlvbgorIyBvZiBleGVleHQuCitlY2hvICIkYXNfbWU6MTk3NzogY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dC4uLiAkRUNIT19DIiA+JjYKK2FjX2xpbmtfZGVmYXVsdD1gZWNobyAiJGFjX2xpbmsiIHwgc2VkICdzLyAtbyAqY29uZnRlc3RbXiBdKi8vJ2AKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOjE5ODA6IFwiJGFjX2xpbmtfZGVmYXVsdFwiIikgPiY1CisgIChldmFsICRhY19saW5rX2RlZmF1bHQpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZToxOTgzOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IHRoZW4KKyAgIyBGaW5kIHRoZSBvdXRwdXQsIHN0YXJ0aW5nIGZyb20gdGhlIG1vc3QgbGlrZWx5LiAgVGhpcyBzY2hlbWUgaXMKKyMgbm90IHJvYnVzdCB0byBqdW5rIGluIGAuJywgaGVuY2UgZ28gdG8gd2lsZGNhcmRzIChhLiopIG9ubHkgYXMgYSBsYXN0CisjIHJlc29ydC4KK2ZvciBhY19maWxlIGluIGBscyBhLmV4ZSBjb25mdGVzdC5leGUgMj4vZGV2L251bGw7CisgICAgICAgICAgICAgICAgbHMgYS5vdXQgY29uZnRlc3QgMj4vZGV2L251bGw7CisgICAgICAgICAgICAgICAgbHMgYS4qIGNvbmZ0ZXN0LiogMj4vZGV2L251bGxgOyBkbworICBjYXNlICRhY19maWxlIGluCisgICAgKi4kYWNfZXh0IHwgKi5vIHwgKi5vYmogfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiApIDs7CisgICAgYS5vdXQgKSAjIFdlIGZvdW5kIHRoZSBkZWZhdWx0IGV4ZWN1dGFibGUsIGJ1dCBleGVleHQ9JycgaXMgbW9zdAorICAgICAgICAgICAgIyBjZXJ0YWlubHkgcmlnaHQuCisgICAgICAgICAgICBicmVhazs7CisgICAgKi4qICkgYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmlsZSIgOiAnW14uXSpcKFwuLipcKSdgCisgICAgICAgICAgIyBGSVhNRTogSSBiZWxpZXZlIHdlIGV4cG9ydCBhY19jdl9leGVleHQgZm9yIExpYnRvb2wgLS1ha2ltLgorICAgICAgICAgIGV4cG9ydCBhY19jdl9leGVleHQKKyAgICAgICAgICBicmVhazs7CisgICAgKiApIGJyZWFrOzsKKyAgZXNhYworZG9uZQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Cit7IHsgZWNobyAiJGFzX21lOjIwMDY6IGVycm9yOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzIiA+JjI7fQorICAgeyAoZXhpdCA3Nyk7IGV4aXQgNzc7IH07IH0KK2ZpCisKK2FjX2V4ZWV4dD0kYWNfY3ZfZXhlZXh0CitlY2hvICIkYXNfbWU6MjAxMjogcmVzdWx0OiAkYWNfZmlsZSIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfZmlsZSIgPiY2CisKKyMgQ2hlY2sgdGhlIGNvbXBpbGVyIHByb2R1Y2VzIGV4ZWN1dGFibGVzIHdlIGNhbiBydW4uICBJZiBub3QsIGVpdGhlcgorIyB0aGUgY29tcGlsZXIgaXMgYnJva2VuLCBvciB3ZSBjcm9zcyBjb21waWxlLgorZWNobyAiJGFzX21lOjIwMTc6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgd29ya3MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIHdvcmtzLi4uICRFQ0hPX0MiID4mNgorIyBGSVhNRTogVGhlc2UgY3Jvc3MgY29tcGlsZXIgaGFja3Mgc2hvdWxkIGJlIHJlbW92ZWQgZm9yIEF1dG9jb25mIDMuMAorIyBJZiBub3QgY3Jvc3MgY29tcGlsaW5nLCBjaGVjayB0aGF0IHdlIGNhbiBydW4gYSBzaW1wbGUgcHJvZ3JhbS4KK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IHllczsgdGhlbgorICBpZiB7IGFjX3RyeT0nLi8kYWNfZmlsZScKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6MjAyMzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjIwMjY6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICAgIGNyb3NzX2NvbXBpbGluZz1ubworICBlbHNlCisgICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSBtYXliZTsgdGhlbgorCWNyb3NzX2NvbXBpbGluZz15ZXMKKyAgICBlbHNlCisJeyB7IGVjaG8gIiRhc19tZToyMDMzOiBlcnJvcjogY2Fubm90IHJ1biBDIGNvbXBpbGVkIHByb2dyYW1zLgorSWYgeW91IG1lYW50IHRvIGNyb3NzIGNvbXBpbGUsIHVzZSBcYC0taG9zdCcuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gQyBjb21waWxlZCBwcm9ncmFtcy4KK0lmIHlvdSBtZWFudCB0byBjcm9zcyBjb21waWxlLCB1c2UgXGAtLWhvc3QnLiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgIGZpCisgIGZpCitmaQorZWNobyAiJGFzX21lOjIwNDE6IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2CisKK3JtIC1mIGEub3V0IGEuZXhlIGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dAorYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKKyMgQ2hlY2sgdGhlIGNvbXBpbGVyIHByb2R1Y2VzIGV4ZWN1dGFibGVzIHdlIGNhbiBydW4uICBJZiBub3QsIGVpdGhlcgorIyB0aGUgY29tcGlsZXIgaXMgYnJva2VuLCBvciB3ZSBjcm9zcyBjb21waWxlLgorZWNobyAiJGFzX21lOjIwNDg6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNvbXBpbGluZyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNvbXBpbGluZy4uLiAkRUNIT19DIiA+JjYKK2VjaG8gIiRhc19tZToyMDUwOiByZXN1bHQ6ICRjcm9zc19jb21waWxpbmciID4mNQorZWNobyAiJHtFQ0hPX1R9JGNyb3NzX2NvbXBpbGluZyIgPiY2CisKK2VjaG8gIiRhc19tZToyMDUzOiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXguLi4gJEVDSE9fQyIgPiY2CitpZiB7IChldmFsIGVjaG8gIiRhc19tZToyMDU1OiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZToyMDU4OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IHRoZW4KKyAgIyBJZiBib3RoIGBjb25mdGVzdC5leGUnIGFuZCBgY29uZnRlc3QnIGFyZSBgcHJlc2VudCcgKHdlbGwsIG9ic2VydmFibGUpCisjIGNhdGNoIGBjb25mdGVzdC5leGUnLiAgRm9yIGluc3RhbmNlIHdpdGggQ3lnd2luLCBgbHMgY29uZnRlc3QnIHdpbGwKKyMgd29yayBwcm9wZXJseSAoaS5lLiwgcmVmZXIgdG8gYGNvbmZ0ZXN0LmV4ZScpLCB3aGlsZSBpdCB3b24ndCB3aXRoCisjIGBybScuCitmb3IgYWNfZmlsZSBpbiBgKGxzIGNvbmZ0ZXN0LmV4ZTsgbHMgY29uZnRlc3Q7IGxzIGNvbmZ0ZXN0LiopIDI+L2Rldi9udWxsYDsgZG8KKyAgY2FzZSAkYWNfZmlsZSBpbgorICAgICouJGFjX2V4dCB8ICoubyB8ICoub2JqIHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgKSA7OworICAgICouKiApIGFjX2N2X2V4ZWV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJ1teLl0qXChcLi4qXCknYAorICAgICAgICAgIGV4cG9ydCBhY19jdl9leGVleHQKKyAgICAgICAgICBicmVhazs7CisgICAgKiApIGJyZWFrOzsKKyAgZXNhYworZG9uZQorZWxzZQorICB7IHsgZWNobyAiJGFzX21lOjIwNzQ6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBFWEVFWFQ6IGNhbm5vdCBjb21waWxlIGFuZCBsaW5rIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIEVYRUVYVDogY2Fubm90IGNvbXBpbGUgYW5kIGxpbmsiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKK3JtIC1mIGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dAorZWNobyAiJGFzX21lOjIwODA6IHJlc3VsdDogJGFjX2N2X2V4ZWV4dCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfZXhlZXh0IiA+JjYKKworcm0gLWYgY29uZnRlc3QuJGFjX2V4dAorRVhFRVhUPSRhY19jdl9leGVleHQKK2FjX2V4ZWV4dD0kRVhFRVhUCitlY2hvICIkYXNfbWU6MjA4NjogY2hlY2tpbmcgZm9yIG9iamVjdCBzdWZmaXgiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igb2JqZWN0IHN1ZmZpeC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3Zfb2JqZXh0K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorI2xpbmUgMjA5MiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqCitpZiB7IChldmFsIGVjaG8gIiRhc19tZToyMTA0OiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZToyMTA3OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IHRoZW4KKyAgZm9yIGFjX2ZpbGUgaW4gYChscyBjb25mdGVzdC5vIGNvbmZ0ZXN0Lm9iajsgbHMgY29uZnRlc3QuKikgMj4vZGV2L251bGxgOyBkbworICBjYXNlICRhY19maWxlIGluCisgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgKSA7OworICAgICopIGFjX2N2X29iamV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJy4qXC5cKC4qXCknYAorICAgICAgIGJyZWFrOzsKKyAgZXNhYworZG9uZQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Cit7IHsgZWNobyAiJGFzX21lOjIxMTk6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBPQkpFWFQ6IGNhbm5vdCBjb21waWxlIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIE9CSkVYVDogY2Fubm90IGNvbXBpbGUiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKK3JtIC1mIGNvbmZ0ZXN0LiRhY19jdl9vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2VjaG8gIiRhc19tZToyMTI2OiByZXN1bHQ6ICRhY19jdl9vYmpleHQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X29iamV4dCIgPiY2CitPQkpFWFQ9JGFjX2N2X29iamV4dAorYWNfb2JqZXh0PSRPQkpFWFQKK2VjaG8gIiRhc19tZToyMTMwOiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X2NfY29tcGlsZXJfZ251K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorI2xpbmUgMjEzNiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludAorbWFpbiAoKQoreworI2lmbmRlZiBfX0dOVUNfXworICAgICAgIGNob2tlIG1lCisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZToyMTUxOiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZToyMTU0OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKyAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOjIxNTc6IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZToyMTYwOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY29tcGlsZXJfZ251PXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CithY19jb21waWxlcl9nbnU9bm8KK2ZpCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2FjX2N2X2NfY29tcGlsZXJfZ251PSRhY19jb21waWxlcl9nbnUKKworZmkKK2VjaG8gIiRhc19tZToyMTcyOiByZXN1bHQ6ICRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNgorR0NDPWB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXMgJiYgZWNobyB5ZXNgCithY190ZXN0X0NGTEFHUz0ke0NGTEFHUytzZXR9CithY19zYXZlX0NGTEFHUz0kQ0ZMQUdTCitDRkxBR1M9Ii1nIgorZWNobyAiJGFzX21lOjIxNzg6IGNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWciID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2NjX2crc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisjbGluZSAyMTg0ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6MjE5NjogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6MjE5OTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZToyMjAyOiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6MjIwNTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X3Byb2dfY2NfZz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK2NhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorYWNfY3ZfcHJvZ19jY19nPW5vCitmaQorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOjIyMTU6IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfZyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfcHJvZ19jY19nIiA+JjYKK2lmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KKyAgQ0ZMQUdTPSRhY19zYXZlX0NGTEFHUworZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0iLWciCisgIGZpCitlbHNlCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9CisgIGZpCitmaQorIyBTb21lIHBlb3BsZSB1c2UgYSBDKysgY29tcGlsZXIgdG8gY29tcGlsZSBDLiAgU2luY2Ugd2UgdXNlIGBleGl0JywKKyMgaW4gQysrIHdlIG5lZWQgdG8gZGVjbGFyZSBpdC4gIEluIGNhc2Ugc29tZW9uZSB1c2VzIHRoZSBzYW1lIGNvbXBpbGVyCisjIGZvciBib3RoIGNvbXBpbGluZyBDIGFuZCBDKysgd2UgbmVlZCB0byBoYXZlIHRoZSBDKysgY29tcGlsZXIgZGVjaWRlCisjIHRoZSBkZWNsYXJhdGlvbiBvZiBleGl0LCBzaW5jZSBpdCdzIHRoZSBtb3N0IGRlbWFuZGluZyBlbnZpcm9ubWVudC4KK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorI2lmbmRlZiBfX2NwbHVzcGx1cworICBjaG9rZSBtZQorI2VuZGlmCitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOjIyNDI6IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjIyNDU6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6MjI0ODogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjIyNTE6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBmb3IgYWNfZGVjbGFyYXRpb24gaW4gXAorICAgJydcCisgICAnI2luY2x1ZGUgPHN0ZGxpYi5oPicgXAorICAgJ2V4dGVybiAiQyIgdm9pZCBzdGQ6OmV4aXQgKGludCkgdGhyb3cgKCk7IHVzaW5nIHN0ZDo6ZXhpdDsnIFwKKyAgICdleHRlcm4gIkMiIHZvaWQgc3RkOjpleGl0IChpbnQpOyB1c2luZyBzdGQ6OmV4aXQ7JyBcCisgICAnZXh0ZXJuICJDIiB2b2lkIGV4aXQgKGludCkgdGhyb3cgKCk7JyBcCisgICAnZXh0ZXJuICJDIiB2b2lkIGV4aXQgKGludCk7JyBcCisgICAndm9pZCBleGl0IChpbnQpOycKK2RvCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorI2xpbmUgMjI2MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CiskYWNfZGVjbGFyYXRpb24KK2ludAorbWFpbiAoKQoreworZXhpdCAoNDIpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZToyMjc2OiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZToyMjc5OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKyAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOjIyODI6IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZToyMjg1OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Citjb250aW51ZQorZmkKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyNsaW5lIDIyOTUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorJGFjX2RlY2xhcmF0aW9uCitpbnQKK21haW4gKCkKK3sKK2V4aXQgKDQyKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6MjMwNzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6MjMxMDogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZToyMzEzOiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6MjMxNjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGJyZWFrCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKK2ZpCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2RvbmUKK3JtIC1mIGNvbmZ0ZXN0KgoraWYgdGVzdCAtbiAiJGFjX2RlY2xhcmF0aW9uIjsgdGhlbgorICBlY2hvICcjaWZkZWYgX19jcGx1c3BsdXMnID4+Y29uZmRlZnMuaAorICBlY2hvICRhY19kZWNsYXJhdGlvbiAgICAgID4+Y29uZmRlZnMuaAorICBlY2hvICcjZW5kaWYnICAgICAgICAgICAgID4+Y29uZmRlZnMuaAorZmkKKworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CitmaQorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKK2FjX2NvbmZpZ19jb21tYW5kcz0iJGFjX2NvbmZpZ19jb21tYW5kcyBkZWZhdWx0LTEiCisKK2FtX21ha2U9JHtNQUtFLW1ha2V9CitjYXQgPiBjb25maW5jIDw8ICdFTkQnCitkb2l0OgorCUBlY2hvIGRvbmUKK0VORAorIyBJZiB3ZSBkb24ndCBmaW5kIGFuIGluY2x1ZGUgZGlyZWN0aXZlLCBqdXN0IGNvbW1lbnQgb3V0IHRoZSBjb2RlLgorZWNobyAiJGFzX21lOjIzNTE6IGNoZWNraW5nIGZvciBzdHlsZSBvZiBpbmNsdWRlIHVzZWQgYnkgJGFtX21ha2UiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc3R5bGUgb2YgaW5jbHVkZSB1c2VkIGJ5ICRhbV9tYWtlLi4uICRFQ0hPX0MiID4mNgorYW1fX2luY2x1ZGU9JyMnCithbV9fcXVvdGU9CitfYW1fcmVzdWx0PW5vbmUKKyMgRmlyc3QgdHJ5IEdOVSBtYWtlIHN0eWxlIGluY2x1ZGUuCitlY2hvICJpbmNsdWRlIGNvbmZpbmMiID4gY29uZm1mCisjIFdlIGdyZXAgb3V0IGBFbnRlcmluZyBkaXJlY3RvcnknIGFuZCBgTGVhdmluZyBkaXJlY3RvcnknCisjIG1lc3NhZ2VzIHdoaWNoIGNhbiBvY2N1ciBpZiBgdycgZW5kcyB1cCBpbiBNQUtFRkxBR1MuCisjIEluIHBhcnRpY3VsYXIgd2UgZG9uJ3QgbG9vayBhdCBgXm1ha2U6JyBiZWNhdXNlIEdOVSBtYWtlIG1pZ2h0CisjIGJlIGludm9rZWQgdW5kZXIgc29tZSBvdGhlciBuYW1lICh1c3VhbGx5ICJnbWFrZSIpLCBpbiB3aGljaAorIyBjYXNlIGl0IHByaW50cyBpdHMgbmV3IG5hbWUgaW5zdGVhZCBvZiBgbWFrZScuCitpZiB0ZXN0ICJgJGFtX21ha2UgLXMgLWYgY29uZm1mIDI+IC9kZXYvbnVsbCB8IGZncmVwIC12ICdpbmcgZGlyZWN0b3J5J2AiID0gImRvbmUiOyB0aGVuCisgICBhbV9faW5jbHVkZT1pbmNsdWRlCisgICBhbV9fcXVvdGU9CisgICBfYW1fcmVzdWx0PUdOVQorZmkKKyMgTm93IHRyeSBCU0QgbWFrZSBzdHlsZSBpbmNsdWRlLgoraWYgdGVzdCAiJGFtX19pbmNsdWRlIiA9ICIjIjsgdGhlbgorICAgZWNobyAnLmluY2x1ZGUgImNvbmZpbmMiJyA+IGNvbmZtZgorICAgaWYgdGVzdCAiYCRhbV9tYWtlIC1zIC1mIGNvbmZtZiAyPiAvZGV2L251bGxgIiA9ICJkb25lIjsgdGhlbgorICAgICAgYW1fX2luY2x1ZGU9LmluY2x1ZGUKKyAgICAgIGFtX19xdW90ZT0nIicKKyAgICAgIF9hbV9yZXN1bHQ9QlNECisgICBmaQorZmkKKworZWNobyAiJGFzX21lOjIzNzg6IHJlc3VsdDogJF9hbV9yZXN1bHQiID4mNQorZWNobyAiJHtFQ0hPX1R9JF9hbV9yZXN1bHQiID4mNgorcm0gLWYgY29uZmluYyBjb25mbWYKKworZGVwY2M9IiRDQyIgICBhbV9jb21waWxlcl9saXN0PQorCitlY2hvICIkYXNfbWU6MjM4NDogY2hlY2tpbmcgZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAteiAiJEFNREVQX1RSVUUiICYmIHRlc3QgLWYgIiRhbV9kZXBjb21wIjsgdGhlbgorICAjIFdlIG1ha2UgYSBzdWJkaXIgYW5kIGRvIHRoZSB0ZXN0cyB0aGVyZS4gIE90aGVyd2lzZSB3ZSBjYW4gZW5kIHVwCisgICMgbWFraW5nIGJvZ3VzIGZpbGVzIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCBhbmQgbmV2ZXIgcmVtb3ZlLiAgRm9yCisgICMgaW5zdGFuY2UgaXQgd2FzIHJlcG9ydGVkIHRoYXQgb24gSFAtVVggdGhlIGdjYyB0ZXN0IHdpbGwgZW5kIHVwCisgICMgbWFraW5nIGEgZHVtbXkgZmlsZSBuYW1lZCBgRCcgLS0gYmVjYXVzZSBgLU1EJyBtZWFucyBgcHV0IHRoZSBvdXRwdXQKKyAgIyBpbiBEJy4KKyAgbWtkaXIgY29uZnRlc3QuZGlyCisgICMgQ29weSBkZXBjb21wIHRvIHN1YmRpciBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b24ndCBmaW5kIGl0IGlmIHdlJ3JlCisgICMgdXNpbmcgYSByZWxhdGl2ZSBkaXJlY3RvcnkuCisgIGNwICIkYW1fZGVwY29tcCIgY29uZnRlc3QuZGlyCisgIGNkIGNvbmZ0ZXN0LmRpcgorCisgIGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKKyAgaWYgdGVzdCAiJGFtX2NvbXBpbGVyX2xpc3QiID0gIiI7IHRoZW4KKyAgICAgYW1fY29tcGlsZXJfbGlzdD1gc2VkIC1uICdzL14jKlwoW2EtekEtWjAtOV0qXCkpJC9cMS9wJyA8IC4vZGVwY29tcGAKKyAgZmkKKyAgZm9yIGRlcG1vZGUgaW4gJGFtX2NvbXBpbGVyX2xpc3Q7IGRvCisgICAgIyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZXNlIGZpbGVzIGZvciBlYWNoIHRlc3QsIGFzIHRoZSBjb21waWxlciBtYXkKKyAgICAjIG92ZXJ3cml0ZSBzb21lIG9mIHRoZW0gd2hlbiB0ZXN0aW5nIHdpdGggb2JzY3VyZSBjb21tYW5kIGxpbmVzLgorICAgICMgVGhpcyBoYXBwZW5zIGF0IGxlYXN0IHdpdGggdGhlIEFJWCBDIGNvbXBpbGVyLgorICAgIGVjaG8gJyNpbmNsdWRlICJjb25mdGVzdC5oIicgPiBjb25mdGVzdC5jCisgICAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LmgKKyAgICBlY2hvICIke2FtX19pbmNsdWRlfSAke2FtX19xdW90ZX1jb25mdGVzdC5QbyR7YW1fX3F1b3RlfSIgPiBjb25mbWYKKworICAgIGNhc2UgJGRlcG1vZGUgaW4KKyAgICBub3NpZGVlZmZlY3QpCisgICAgICAjIGFmdGVyIHRoaXMgdGFnLCBtZWNoYW5pc21zIGFyZSBub3QgYnkgc2lkZS1lZmZlY3QsIHNvIHRoZXknbGwKKyAgICAgICMgb25seSBiZSB1c2VkIHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQKKyAgICAgIGlmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciID0geHllczsgdGhlbgorCWNvbnRpbnVlCisgICAgICBlbHNlCisJYnJlYWsKKyAgICAgIGZpCisgICAgICA7OworICAgIG5vbmUpIGJyZWFrIDs7CisgICAgZXNhYworICAgICMgV2UgY2hlY2sgd2l0aCBgLWMnIGFuZCBgLW8nIGZvciB0aGUgc2FrZSBvZiB0aGUgImRhc2htc3Rkb3V0IgorICAgICMgbW9kZS4gIEl0IHR1cm5zIG91dCB0aGF0IHRoZSBTdW5Qcm8gQysrIGNvbXBpbGVyIGRvZXMgbm90IHByb3Blcmx5CisgICAgIyBoYW5kbGUgYC1NIC1vJywgYW5kIHdlIG5lZWQgdG8gZGV0ZWN0IHRoaXMuCisgICAgaWYgZGVwbW9kZT0kZGVwbW9kZSBcCisgICAgICAgc291cmNlPWNvbmZ0ZXN0LmMgb2JqZWN0PWNvbmZ0ZXN0Lm8gXAorICAgICAgIGRlcGZpbGU9Y29uZnRlc3QuUG8gdG1wZGVwZmlsZT1jb25mdGVzdC5UUG8gXAorICAgICAgICRTSEVMTCAuL2RlcGNvbXAgJGRlcGNjIC1jIGNvbmZ0ZXN0LmMgLW8gY29uZnRlc3QubyA+L2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICBncmVwIGNvbmZ0ZXN0LmggY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgorICAgICAgICR7TUFLRS1tYWtlfSAtcyAtZiBjb25mbWYgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9JGRlcG1vZGUKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorCisgIGNkIC4uCisgIHJtIC1yZiBjb25mdGVzdC5kaXIKK2Vsc2UKKyAgYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQorZmkKKworZmkKK2VjaG8gIiRhc19tZToyNDQ2OiByZXN1bHQ6ICRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPiY1CitlY2hvICIke0VDSE9fVH0kYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID4mNgorQ0NERVBNT0RFPSJkZXBtb2RlPSRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorZWNobyAiJGFzX21lOjI0NTU6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IuLi4gJEVDSE9fQyIgPiY2CisjIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgoraWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KKyAgQ1BQPQorZmkKK2lmIHRlc3QgLXogIiRDUFAiOyB0aGVuCisgIGlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DUFArc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgICAgICMgRG91YmxlIHF1b3RlcyBiZWNhdXNlIENQUCBuZWVkcyB0byBiZSBleHBhbmRlZAorICAgIGZvciBDUFAgaW4gIiRDQyAtRSIgIiRDQyAtRSAtdHJhZGl0aW9uYWwtY3BwIiAiL2xpYi9jcHAiCisgICAgZG8KKyAgICAgIGFjX3ByZXByb2Nfb2s9ZmFsc2UKK2ZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworZG8KKyAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYworICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKyAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorI2xpbmUgMjQ3NiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisgICAgICAgICAgICAgICAgICAgICBTeW50YXggZXJyb3IKK19BQ0VPRgoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6MjQ4MTogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQorICAoZXZhbCAkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBlZ3JlcCAtdiAnXiAqXCsnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6MjQ4NzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGw7IHRoZW4KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBhY19jcHBfZXJyPSRhY19jX3ByZXByb2Nfd2Fybl9mbGFnCisgIGVsc2UKKyAgICBhY19jcHBfZXJyPQorICBmaQorZWxzZQorICBhY19jcHBfZXJyPXllcworZmkKK2lmIHRlc3QgLXogIiRhY19jcHBfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCitjb250aW51ZQorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CisKKyAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbi1leGlzdGVudCBoZWFkZXJzCisgICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorI2xpbmUgMjUxMCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KK19BQ0VPRgoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6MjUxNDogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQorICAoZXZhbCAkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBlZ3JlcCAtdiAnXiAqXCsnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6MjUyMDogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGw7IHRoZW4KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBhY19jcHBfZXJyPSRhY19jX3ByZXByb2Nfd2Fybl9mbGFnCisgIGVsc2UKKyAgICBhY19jcHBfZXJyPQorICBmaQorZWxzZQorICBhY19jcHBfZXJyPXllcworZmkKK2lmIHRlc3QgLXogIiRhY19jcHBfZXJyIjsgdGhlbgorICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgorY29udGludWUKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgICMgUGFzc2VzIGJvdGggdGVzdHMuCithY19wcmVwcm9jX29rPToKK2JyZWFrCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKworZG9uZQorIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoraWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4KKyAgYnJlYWsKK2ZpCisKKyAgICBkb25lCisgICAgYWNfY3ZfcHJvZ19DUFA9JENQUAorCitmaQorICBDUFA9JGFjX2N2X3Byb2dfQ1BQCitlbHNlCisgIGFjX2N2X3Byb2dfQ1BQPSRDUFAKK2ZpCitlY2hvICIkYXNfbWU6MjU1NzogcmVzdWx0OiAkQ1BQIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDUFAiID4mNgorYWNfcHJlcHJvY19vaz1mYWxzZQorZm9yIGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCitkbworICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCisgICMgd2l0aCBhIGZyZXNoIGNyb3NzLWNvbXBpbGVyIHdvcmtzLgorICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisjbGluZSAyNTY3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyAgICAgICAgICAgICAgICAgICAgIFN5bnRheCBlcnJvcgorX0FDRU9GCitpZiB7IChldmFsIGVjaG8gIiRhc19tZToyNTcyOiBcIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dFwiIikgPiY1CisgIChldmFsICRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGVncmVwIC12ICdeICpcKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZToyNTc4OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbDsgdGhlbgorICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGFjX2NwcF9lcnI9JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcKKyAgZWxzZQorICAgIGFjX2NwcF9lcnI9CisgIGZpCitlbHNlCisgIGFjX2NwcF9lcnI9eWVzCitmaQoraWYgdGVzdCAteiAiJGFjX2NwcF9lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKworICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uLWV4aXN0ZW50IGhlYWRlcnMKKyAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisjbGluZSAyNjAxICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgorX0FDRU9GCitpZiB7IChldmFsIGVjaG8gIiRhc19tZToyNjA1OiBcIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dFwiIikgPiY1CisgIChldmFsICRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGVncmVwIC12ICdeICpcKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZToyNjExOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbDsgdGhlbgorICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGFjX2NwcF9lcnI9JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcKKyAgZWxzZQorICAgIGFjX2NwcF9lcnI9CisgIGZpCitlbHNlCisgIGFjX2NwcF9lcnI9eWVzCitmaQoraWYgdGVzdCAteiAiJGFjX2NwcF9lcnIiOyB0aGVuCisgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCitjb250aW51ZQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KK2FjX3ByZXByb2Nfb2s9OgorYnJlYWsKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorCitkb25lCisjIEJlY2F1c2Ugb2YgYGJyZWFrJywgX0FDX1BSRVBST0NfSUZFTFNFJ3MgY2xlYW5pbmcgY29kZSB3YXMgc2tpcHBlZC4KK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitpZiAkYWNfcHJlcHJvY19vazsgdGhlbgorICA6CitlbHNlCisgIHsgeyBlY2hvICIkYXNfbWU6MjYzOTogZXJyb3I6IEMgcHJlcHJvY2Vzc29yIFwiJENQUFwiIGZhaWxzIHNhbml0eSBjaGVjayIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBDIHByZXByb2Nlc3NvciBcIiRDUFBcIiBmYWlscyBzYW5pdHkgY2hlY2siID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworYWNfZXh0PWNjCithY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQoraWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICBmb3IgYWNfcHJvZyBpbiAkQ0NDIGcrKyBjKysgZ3BwIGFDQyBDQyBjeHggY2MrKyBjbCBGQ0MgS0NDIFJDQyB4bENfciB4bEMKKyAgZG8KKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOjI2NjA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DWFgrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENYWCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DWFg9IiRDWFgiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBhY19zYXZlX0lGUz0kSUZTOyBJRlM9JGFjX3BhdGhfc2VwYXJhdG9yCithY19kdW1teT0iJFBBVEgiCitmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgSUZTPSRhY19zYXZlX0lGUworICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAkYXNfZXhlY3V0YWJsZV9wICIkYWNfZGlyLyRhY193b3JkIiB8fCBjb250aW51ZQorYWNfY3ZfcHJvZ19DWFg9IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgorZWNobyAiJGFzX21lOjI2NzU6IGZvdW5kICRhY19kaXIvJGFjX3dvcmQiID4mNQorYnJlYWsKK2RvbmUKKworZmkKK2ZpCitDWFg9JGFjX2N2X3Byb2dfQ1hYCitpZiB0ZXN0IC1uICIkQ1hYIjsgdGhlbgorICBlY2hvICIkYXNfbWU6MjY4MzogcmVzdWx0OiAkQ1hYIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDWFgiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6MjY4NjogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgICAgdGVzdCAtbiAiJENYWCIgJiYgYnJlYWsKKyAgZG9uZQorZmkKK2lmIHRlc3QgLXogIiRDWFgiOyB0aGVuCisgIGFjX2N0X0NYWD0kQ1hYCisgIGZvciBhY19wcm9nIGluICRDQ0MgZysrIGMrKyBncHAgYUNDIENDIGN4eCBjYysrIGNsIEZDQyBLQ0MgUkNDIHhsQ19yIHhsQworZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZToyNjk5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ1hYK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9DWFgiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfQ1hYPSIkYWNfY3RfQ1hYIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSRhY19wYXRoX3NlcGFyYXRvcgorYWNfZHVtbXk9IiRQQVRIIgorZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgIElGUz0kYWNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgJGFzX2V4ZWN1dGFibGVfcCAiJGFjX2Rpci8kYWNfd29yZCIgfHwgY29udGludWUKK2FjX2N2X3Byb2dfYWNfY3RfQ1hYPSIkYWNfcHJvZyIKK2VjaG8gIiRhc19tZToyNzE0OiBmb3VuZCAkYWNfZGlyLyRhY193b3JkIiA+JjUKK2JyZWFrCitkb25lCisKK2ZpCitmaQorYWNfY3RfQ1hYPSRhY19jdl9wcm9nX2FjX2N0X0NYWAoraWYgdGVzdCAtbiAiJGFjX2N0X0NYWCI7IHRoZW4KKyAgZWNobyAiJGFzX21lOjI3MjI6IHJlc3VsdDogJGFjX2N0X0NYWCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3RfQ1hYIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOjI3MjU6IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworICB0ZXN0IC1uICIkYWNfY3RfQ1hYIiAmJiBicmVhaworZG9uZQordGVzdCAtbiAiJGFjX2N0X0NYWCIgfHwgYWNfY3RfQ1hYPSJnKysiCisKKyAgQ1hYPSRhY19jdF9DWFgKK2ZpCisKKyMgUHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlci4KK2VjaG8gIiRhc19tZToyNzM3OiIgXAorICAgICAiY2hlY2tpbmcgZm9yIEMrKyBjb21waWxlciB2ZXJzaW9uIiA+JjUKK2FjX2NvbXBpbGVyPWBzZXQgWCAkYWNfY29tcGlsZTsgZWNobyAkMmAKK3sgKGV2YWwgZWNobyAiJGFzX21lOjI3NDA6IFwiJGFjX2NvbXBpbGVyIC0tdmVyc2lvbiA8L2Rldi9udWxsID4mNVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlciAtLXZlcnNpb24gPC9kZXYvbnVsbCA+JjUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZToyNzQzOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KK3sgKGV2YWwgZWNobyAiJGFzX21lOjI3NDU6IFwiJGFjX2NvbXBpbGVyIC12IDwvZGV2L251bGwgPiY1XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGVyIC12IDwvZGV2L251bGwgPiY1KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6Mjc0ODogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9Cit7IChldmFsIGVjaG8gIiRhc19tZToyNzUwOiBcIiRhY19jb21waWxlciAtViA8L2Rldi9udWxsID4mNVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlciAtViA8L2Rldi9udWxsID4mNSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjI3NTM6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfQorCitlY2hvICIkYXNfbWU6Mjc1NjogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDKysgY29tcGlsZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMrKyBjb21waWxlci4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfY3h4X2NvbXBpbGVyX2dudStzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyNsaW5lIDI3NjIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQKK21haW4gKCkKK3sKKyNpZm5kZWYgX19HTlVDX18KKyAgICAgICBjaG9rZSBtZQorI2VuZGlmCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6Mjc3NzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6Mjc4MDogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZToyNzgzOiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6Mjc4NjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2NvbXBpbGVyX2dudT15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK2NhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorYWNfY29tcGlsZXJfZ251PW5vCitmaQorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CithY19jdl9jeHhfY29tcGlsZXJfZ251PSRhY19jb21waWxlcl9nbnUKKworZmkKK2VjaG8gIiRhc19tZToyNzk4OiByZXN1bHQ6ICRhY19jdl9jeHhfY29tcGlsZXJfZ251IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9jeHhfY29tcGlsZXJfZ251IiA+JjYKK0dYWD1gdGVzdCAkYWNfY29tcGlsZXJfZ251ID0geWVzICYmIGVjaG8geWVzYAorYWNfdGVzdF9DWFhGTEFHUz0ke0NYWEZMQUdTK3NldH0KK2FjX3NhdmVfQ1hYRkxBR1M9JENYWEZMQUdTCitDWFhGTEFHUz0iLWciCitlY2hvICIkYXNfbWU6MjgwNDogY2hlY2tpbmcgd2hldGhlciAkQ1hYIGFjY2VwdHMgLWciID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICRDWFggYWNjZXB0cyAtZy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19jeHhfZytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyNsaW5lIDI4MTAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZToyODIyOiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZToyODI1OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKyAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOjI4Mjg6IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZToyODMxOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfcHJvZ19jeHhfZz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK2NhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorYWNfY3ZfcHJvZ19jeHhfZz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2VjaG8gIiRhc19tZToyODQxOiByZXN1bHQ6ICRhY19jdl9wcm9nX2N4eF9nIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9wcm9nX2N4eF9nIiA+JjYKK2lmIHRlc3QgIiRhY190ZXN0X0NYWEZMQUdTIiA9IHNldDsgdGhlbgorICBDWFhGTEFHUz0kYWNfc2F2ZV9DWFhGTEFHUworZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2N4eF9nID0geWVzOyB0aGVuCisgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICAgQ1hYRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENYWEZMQUdTPSItZyIKKyAgZmkKK2Vsc2UKKyAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICBDWFhGTEFHUz0iLU8yIgorICBlbHNlCisgICAgQ1hYRkxBR1M9CisgIGZpCitmaQorZm9yIGFjX2RlY2xhcmF0aW9uIGluIFwKKyAgICcnXAorICAgJyNpbmNsdWRlIDxzdGRsaWIuaD4nIFwKKyAgICdleHRlcm4gIkMiIHZvaWQgc3RkOjpleGl0IChpbnQpIHRocm93ICgpOyB1c2luZyBzdGQ6OmV4aXQ7JyBcCisgICAnZXh0ZXJuICJDIiB2b2lkIHN0ZDo6ZXhpdCAoaW50KTsgdXNpbmcgc3RkOjpleGl0OycgXAorICAgJ2V4dGVybiAiQyIgdm9pZCBleGl0IChpbnQpIHRocm93ICgpOycgXAorICAgJ2V4dGVybiAiQyIgdm9pZCBleGl0IChpbnQpOycgXAorICAgJ3ZvaWQgZXhpdCAoaW50KTsnCitkbworICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyNsaW5lIDI4NjggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorJGFjX2RlY2xhcmF0aW9uCitpbnQKK21haW4gKCkKK3sKK2V4aXQgKDQyKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6Mjg4MTogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6Mjg4NDogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZToyODg3OiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6Mjg5MDogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK2NhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorY29udGludWUKK2ZpCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisjbGluZSAyOTAwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyRhY19kZWNsYXJhdGlvbgoraW50CittYWluICgpCit7CitleGl0ICg0Mik7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOjI5MTI6IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjI5MTU6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6MjkxODogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjI5MjE6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBicmVhaworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CitmaQorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Citkb25lCitybSAtZiBjb25mdGVzdCoKK2lmIHRlc3QgLW4gIiRhY19kZWNsYXJhdGlvbiI7IHRoZW4KKyAgZWNobyAnI2lmZGVmIF9fY3BsdXNwbHVzJyA+PmNvbmZkZWZzLmgKKyAgZWNobyAkYWNfZGVjbGFyYXRpb24gICAgICA+PmNvbmZkZWZzLmgKKyAgZWNobyAnI2VuZGlmJyAgICAgICAgICAgICA+PmNvbmZkZWZzLmgKK2ZpCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworZGVwY2M9IiRDWFgiICBhbV9jb21waWxlcl9saXN0PQorCitlY2hvICIkYXNfbWU6Mjk0NTogY2hlY2tpbmcgZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLXogIiRBTURFUF9UUlVFIiAmJiB0ZXN0IC1mICIkYW1fZGVwY29tcCI7IHRoZW4KKyAgIyBXZSBtYWtlIGEgc3ViZGlyIGFuZCBkbyB0aGUgdGVzdHMgdGhlcmUuICBPdGhlcndpc2Ugd2UgY2FuIGVuZCB1cAorICAjIG1ha2luZyBib2d1cyBmaWxlcyB0aGF0IHdlIGRvbid0IGtub3cgYWJvdXQgYW5kIG5ldmVyIHJlbW92ZS4gIEZvcgorICAjIGluc3RhbmNlIGl0IHdhcyByZXBvcnRlZCB0aGF0IG9uIEhQLVVYIHRoZSBnY2MgdGVzdCB3aWxsIGVuZCB1cAorICAjIG1ha2luZyBhIGR1bW15IGZpbGUgbmFtZWQgYEQnIC0tIGJlY2F1c2UgYC1NRCcgbWVhbnMgYHB1dCB0aGUgb3V0cHV0CisgICMgaW4gRCcuCisgIG1rZGlyIGNvbmZ0ZXN0LmRpcgorICAjIENvcHkgZGVwY29tcCB0byBzdWJkaXIgYmVjYXVzZSBvdGhlcndpc2Ugd2Ugd29uJ3QgZmluZCBpdCBpZiB3ZSdyZQorICAjIHVzaW5nIGEgcmVsYXRpdmUgZGlyZWN0b3J5LgorICBjcCAiJGFtX2RlcGNvbXAiIGNvbmZ0ZXN0LmRpcgorICBjZCBjb25mdGVzdC5kaXIKKworICBhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQorICBpZiB0ZXN0ICIkYW1fY29tcGlsZXJfbGlzdCIgPSAiIjsgdGhlbgorICAgICBhbV9jb21waWxlcl9saXN0PWBzZWQgLW4gJ3MvXiMqXChbYS16QS1aMC05XSpcKSkkL1wxL3AnIDwgLi9kZXBjb21wYAorICBmaQorICBmb3IgZGVwbW9kZSBpbiAkYW1fY29tcGlsZXJfbGlzdDsgZG8KKyAgICAjIFdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlc2UgZmlsZXMgZm9yIGVhY2ggdGVzdCwgYXMgdGhlIGNvbXBpbGVyIG1heQorICAgICMgb3ZlcndyaXRlIHNvbWUgb2YgdGhlbSB3aGVuIHRlc3Rpbmcgd2l0aCBvYnNjdXJlIGNvbW1hbmQgbGluZXMuCisgICAgIyBUaGlzIGhhcHBlbnMgYXQgbGVhc3Qgd2l0aCB0aGUgQUlYIEMgY29tcGlsZXIuCisgICAgZWNobyAnI2luY2x1ZGUgImNvbmZ0ZXN0LmgiJyA+IGNvbmZ0ZXN0LmMKKyAgICBlY2hvICdpbnQgaTsnID4gY29uZnRlc3QuaAorICAgIGVjaG8gIiR7YW1fX2luY2x1ZGV9ICR7YW1fX3F1b3RlfWNvbmZ0ZXN0LlBvJHthbV9fcXVvdGV9IiA+IGNvbmZtZgorCisgICAgY2FzZSAkZGVwbW9kZSBpbgorICAgIG5vc2lkZWVmZmVjdCkKKyAgICAgICMgYWZ0ZXIgdGhpcyB0YWcsIG1lY2hhbmlzbXMgYXJlIG5vdCBieSBzaWRlLWVmZmVjdCwgc28gdGhleSdsbAorICAgICAgIyBvbmx5IGJlIHVzZWQgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZAorICAgICAgaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgPSB4eWVzOyB0aGVuCisJY29udGludWUKKyAgICAgIGVsc2UKKwlicmVhaworICAgICAgZmkKKyAgICAgIDs7CisgICAgbm9uZSkgYnJlYWsgOzsKKyAgICBlc2FjCisgICAgIyBXZSBjaGVjayB3aXRoIGAtYycgYW5kIGAtbycgZm9yIHRoZSBzYWtlIG9mIHRoZSAiZGFzaG1zdGRvdXQiCisgICAgIyBtb2RlLiAgSXQgdHVybnMgb3V0IHRoYXQgdGhlIFN1blBybyBDKysgY29tcGlsZXIgZG9lcyBub3QgcHJvcGVybHkKKyAgICAjIGhhbmRsZSBgLU0gLW8nLCBhbmQgd2UgbmVlZCB0byBkZXRlY3QgdGhpcy4KKyAgICBpZiBkZXBtb2RlPSRkZXBtb2RlIFwKKyAgICAgICBzb3VyY2U9Y29uZnRlc3QuYyBvYmplY3Q9Y29uZnRlc3QubyBcCisgICAgICAgZGVwZmlsZT1jb25mdGVzdC5QbyB0bXBkZXBmaWxlPWNvbmZ0ZXN0LlRQbyBcCisgICAgICAgJFNIRUxMIC4vZGVwY29tcCAkZGVwY2MgLWMgY29uZnRlc3QuYyAtbyBjb25mdGVzdC5vID4vZGV2L251bGwgMj4mMSAmJgorICAgICAgIGdyZXAgY29uZnRlc3QuaCBjb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgJHtNQUtFLW1ha2V9IC1zIC1mIGNvbmZtZiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICBhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9JGRlcG1vZGUKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorCisgIGNkIC4uCisgIHJtIC1yZiBjb25mdGVzdC5kaXIKK2Vsc2UKKyAgYW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKK2ZpCisKK2ZpCitlY2hvICIkYXNfbWU6MzAwNzogcmVzdWx0OiAkYW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID4mNgorQ1hYREVQTU9ERT0iZGVwbW9kZT0kYW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIgorCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImFweHMiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGFweHM7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTozMDEzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfRVhJU1RTX0FQWFMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJEVYSVNUU19BUFhTIjsgdGhlbgorICBhY19jdl9wcm9nX0VYSVNUU19BUFhTPSIkRVhJU1RTX0FQWFMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBhY19zYXZlX0lGUz0kSUZTOyBJRlM9JGFjX3BhdGhfc2VwYXJhdG9yCithY19kdW1teT0iJFBBVEgiCitmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgSUZTPSRhY19zYXZlX0lGUworICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAkYXNfZXhlY3V0YWJsZV9wICIkYWNfZGlyLyRhY193b3JkIiB8fCBjb250aW51ZQorYWNfY3ZfcHJvZ19FWElTVFNfQVBYUz0ieWVzIgorZWNobyAiJGFzX21lOjMwMjg6IGZvdW5kICRhY19kaXIvJGFjX3dvcmQiID4mNQorYnJlYWsKK2RvbmUKKworZmkKK2ZpCitFWElTVFNfQVBYUz0kYWNfY3ZfcHJvZ19FWElTVFNfQVBYUworaWYgdGVzdCAtbiAiJEVYSVNUU19BUFhTIjsgdGhlbgorICBlY2hvICIkYXNfbWU6MzAzNjogcmVzdWx0OiAkRVhJU1RTX0FQWFMiID4mNQorZWNobyAiJHtFQ0hPX1R9JEVYSVNUU19BUFhTIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOjMwMzk6IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworaWYgdGVzdCAteiAiJEVYSVNUU19BUFhTIjsgdGhlbgorICAgeyB7IGVjaG8gIiRhc19tZTozMDQ0OiBlcnJvcjogcGxlYXNlIGluc3RhbGwgdGhlIGFwYWNoZSBhcHhzIHRvb2wuIERvd25sb2FkIGFwYWNoZSBodHRwIHNlcnZlciBmcm9tIGh0dHA6Ly93d3cuYXBhY2hlLm9yZywgY29tcGlsZSBhbmQgaW5zdGFsbCBpdCBhbmQgbWFrZSBzdXJlIHRoYXQgYXB4cyBpcyBpbiB5b3VyIHBhdGgiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogcGxlYXNlIGluc3RhbGwgdGhlIGFwYWNoZSBhcHhzIHRvb2wuIERvd25sb2FkIGFwYWNoZSBodHRwIHNlcnZlciBmcm9tIGh0dHA6Ly93d3cuYXBhY2hlLm9yZywgY29tcGlsZSBhbmQgaW5zdGFsbCBpdCBhbmQgbWFrZSBzdXJlIHRoYXQgYXB4cyBpcyBpbiB5b3VyIHBhdGgiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKK2lmIHRlc3QgIiRHQ0MiOyB0aGVuCisgICBpZiB0ZXN0IHgkZGVidWcgPSB4dHJ1ZTsgdGhlbgorCSAgQ1hYRkxBR1M9IiRDWFhGTEFHUyAtZyIKKyAgIGVsc2UKKwkgIENYWEZMQUdTPSIkQ1hYRkxBR1MgLU8yIgorICAgZmkKK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaGFyZWQgb3IgLS1kaXNhYmxlLXNoYXJlZCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaGFyZWQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NoYXJlZCIKKyAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KK2Nhc2UgJGVuYWJsZXZhbCBpbgoreWVzKSBlbmFibGVfc2hhcmVkPXllcyA7Oworbm8pIGVuYWJsZV9zaGFyZWQ9bm8gOzsKKyopCisgIGVuYWJsZV9zaGFyZWQ9bm8KKyAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKKyAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisgICAgICBlbmFibGVfc2hhcmVkPXllcworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIDs7Citlc2FjCitlbHNlCisgIGVuYWJsZV9zaGFyZWQ9eWVzCitmaTsKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zdGF0aWMgb3IgLS1kaXNhYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3N0YXRpYyIKKyAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KK2Nhc2UgJGVuYWJsZXZhbCBpbgoreWVzKSBlbmFibGVfc3RhdGljPXllcyA7Oworbm8pIGVuYWJsZV9zdGF0aWM9bm8gOzsKKyopCisgIGVuYWJsZV9zdGF0aWM9bm8KKyAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKKyAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisgICAgICBlbmFibGVfc3RhdGljPXllcworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIDs7Citlc2FjCitlbHNlCisgIGVuYWJsZV9zdGF0aWM9eWVzCitmaTsKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1mYXN0LWluc3RhbGwgb3IgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9mYXN0X2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIKKyAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KK2Nhc2UgJGVuYWJsZXZhbCBpbgoreWVzKSBlbmFibGVfZmFzdF9pbnN0YWxsPXllcyA7Oworbm8pIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8gOzsKKyopCisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KKyAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKKyAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisgICAgICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIDs7Citlc2FjCitlbHNlCisgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCitmaTsKKyMgRmluZCB0aGUgY29ycmVjdCBQQVRIIHNlcGFyYXRvci4gIFVzdWFsbHkgdGhpcyBpcyBgOicsIGJ1dAorIyBESkdQUCB1c2VzIGA7JyBsaWtlIERPUy4KK2lmIHRlc3QgIlgke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IFhzZXQ7IHRoZW4KKyAgVU5BTUU9JHtVTkFNRS1gdW5hbWUgMj4vZGV2L251bGxgfQorICBjYXNlIFgkVU5BTUUgaW4KKyAgICAqLURPUykgbHRfY3Zfc3lzX3BhdGhfc2VwYXJhdG9yPSc7JyA7OworICAgICopICAgICBsdF9jdl9zeXNfcGF0aF9zZXBhcmF0b3I9JzonIDs7CisgIGVzYWMKKyAgUEFUSF9TRVBBUkFUT1I9JGx0X2N2X3N5c19wYXRoX3NlcGFyYXRvcgorZmkKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1nbnUtbGQgb3IgLS13aXRob3V0LWdudS1sZCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfZ251X2xkK3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX2dudV9sZCIKKyAgdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzCitlbHNlCisgIHdpdGhfZ251X2xkPW5vCitmaTsKK2FjX3Byb2c9bGQKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgorICBlY2hvICIkYXNfbWU6MzE0NDogY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDLi4uICRFQ0hPX0MiID4mNgorICBjYXNlICRob3N0IGluCisgICotKi1taW5ndyopCisgICAgIyBnY2MgbGVhdmVzIGEgdHJhaWxpbmcgY2FycmlhZ2UgcmV0dXJuIHdoaWNoIHVwc2V0cyBtaW5ndworICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNSB8IHRyIC1kICdcMDE1J2AgOzsKKyAgKikKKyAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgIDs7CisgIGVzYWMKKyAgY2FzZSAkYWNfcHJvZyBpbgorICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgorICAgIFtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikKKyAgICAgIHJlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLycKKyAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRoIG9mIGxkCisgICAgICBhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgJ3MlXFxcXCUvJWcnYAorICAgICAgd2hpbGUgZWNobyAkYWNfcHJvZyB8IGdyZXAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCisJYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICJzJSRyZV9kaXJlbHQlLyUiYAorICAgICAgZG9uZQorICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCisgICAgICA7OworICAiIikKKyAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KKyAgICBhY19wcm9nPWxkCisgICAgOzsKKyAgKikKKyAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCisgICAgd2l0aF9nbnVfbGQ9dW5rbm93bgorICAgIDs7CisgIGVzYWMKK2VsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICBlY2hvICIkYXNfbWU6MzE3NDogY2hlY2tpbmcgZm9yIEdOVSBsZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBHTlUgbGQuLi4gJEVDSE9fQyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTozMTc3OiBjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBub24tR05VIGxkLi4uICRFQ0hPX0MiID4mNgorZmkKK2lmIHRlc3QgIiR7bHRfY3ZfcGF0aF9MRCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIiB8fCB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nJGFjX2V4ZWV4dCI7IHRoZW4KKyAgICAgIGx0X2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCisgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCisgICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCisgICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KKyAgICAgIGlmICIkbHRfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCisgICAgICBlbHNlCisJdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2Vsc2UKKyAgbHRfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KK2ZpCitmaQorCitMRD0iJGx0X2N2X3BhdGhfTEQiCitpZiB0ZXN0IC1uICIkTEQiOyB0aGVuCisgIGVjaG8gIiRhc19tZTozMjA3OiByZXN1bHQ6ICRMRCIgPiY1CitlY2hvICIke0VDSE9fVH0kTEQiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6MzIxMDogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQordGVzdCAteiAiJExEIiAmJiB7IHsgZWNobyAiJGFzX21lOjMyMTM6IGVycm9yOiBubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSCIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSCIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZWNobyAiJGFzX21lOjMyMTY6IGNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2x0X2N2X3Byb2dfZ251X2xkK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgICMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCitpZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCisgIGx0X2N2X3Byb2dfZ251X2xkPXllcworZWxzZQorICBsdF9jdl9wcm9nX2dudV9sZD1ubworZmkKK2ZpCitlY2hvICIkYXNfbWU6MzIyODogcmVzdWx0OiAkbHRfY3ZfcHJvZ19nbnVfbGQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X2N2X3Byb2dfZ251X2xkIiA+JjYKK3dpdGhfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZAorCitlY2hvICIkYXNfbWU6MzIzMjogY2hlY2tpbmcgZm9yICRMRCBvcHRpb24gdG8gcmVsb2FkIG9iamVjdCBmaWxlcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkTEQgb3B0aW9uIHRvIHJlbG9hZCBvYmplY3QgZmlsZXMuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2x0X2N2X2xkX3JlbG9hZF9mbGFnK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGx0X2N2X2xkX3JlbG9hZF9mbGFnPSctcicKK2ZpCitlY2hvICIkYXNfbWU6MzIzOTogcmVzdWx0OiAkbHRfY3ZfbGRfcmVsb2FkX2ZsYWciID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X2N2X2xkX3JlbG9hZF9mbGFnIiA+JjYKK3JlbG9hZF9mbGFnPSRsdF9jdl9sZF9yZWxvYWRfZmxhZwordGVzdCAtbiAiJHJlbG9hZF9mbGFnIiAmJiByZWxvYWRfZmxhZz0iICRyZWxvYWRfZmxhZyIKKworZWNobyAiJGFzX21lOjMyNDQ6IGNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubS4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7bHRfY3ZfcGF0aF9OTStzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCisgICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorICBsdF9jdl9wYXRoX05NPSIkTk0iCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICB0bXBfbm09JGFjX2Rpci8ke2FjX3Rvb2xfcHJlZml4fW5tCisgICAgaWYgdGVzdCAtZiAkdG1wX25tIHx8IHRlc3QgLWYgJHRtcF9ubSRhY19leGVleHQgOyB0aGVuCisgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KKyAgICAgICMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6CisgICAgICAjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCisgICAgICAjIFRydTY0J3Mgbm0gY29tcGxhaW5zIHRoYXQgL2Rldi9udWxsIGlzIGFuIGludmFsaWQgb2JqZWN0IGZpbGUKKyAgICAgIGlmICgkdG1wX25tIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAnKC9kZXYvbnVsbHxJbnZhbGlkIGZpbGUgb3Igb2JqZWN0IHR5cGUpJyA+L2Rldi9udWxsOyB0aGVuCisJbHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSAtQiIKKwlicmVhaworICAgICAgZWxpZiAoJHRtcF9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KKwlsdF9jdl9wYXRoX05NPSIkdG1wX25tIC1wIgorCWJyZWFrCisgICAgICBlbHNlCisJbHRfY3ZfcGF0aF9OTT0ke2x0X2N2X3BhdGhfTk09IiR0bXBfbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKKwljb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkbHRfY3ZfcGF0aF9OTSIgJiYgbHRfY3ZfcGF0aF9OTT1ubQorZmkKK2ZpCisKK05NPSIkbHRfY3ZfcGF0aF9OTSIKK2VjaG8gIiRhc19tZTozMjgwOiByZXN1bHQ6ICROTSIgPiY1CitlY2hvICIke0VDSE9fVH0kTk0iID4mNgorCitlY2hvICIkYXNfbWU6MzI4MzogY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MuLi4gJEVDSE9fQyIgPiY2CitMTl9TPSRhc19sbl9zCitpZiB0ZXN0ICIkTE5fUyIgPSAibG4gLXMiOyB0aGVuCisgIGVjaG8gIiRhc19tZTozMjg3OiByZXN1bHQ6IHllcyIgPiY1CitlY2hvICIke0VDSE9fVH15ZXMiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6MzI5MDogcmVzdWx0OiBubywgdXNpbmcgJExOX1MiID4mNQorZWNobyAiJHtFQ0hPX1R9bm8sIHVzaW5nICRMTl9TIiA+JjYKK2ZpCisKK2VjaG8gIiRhc19tZTozMjk0OiBjaGVja2luZyBob3cgdG8gcmVjb2duaXNlIGRlcGVuZGFudCBsaWJyYXJpZXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBob3cgdG8gcmVjb2duaXNlIGRlcGVuZGFudCBsaWJyYXJpZXMuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2x0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSckTUFHSUNfQ01EJworbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9CitsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0ndW5rbm93bicKKyMgTmVlZCB0byBzZXQgdGhlIHByZWNlZGluZyB2YXJpYWJsZSBvbiBhbGwgcGxhdGZvcm1zIHRoYXQgc3VwcG9ydAorIyBpbnRlcmxpYnJhcnkgZGVwZW5kZW5jaWVzLgorIyAnbm9uZScgLS0gZGVwZW5kZW5jaWVzIG5vdCBzdXBwb3J0ZWQuCisjIGB1bmtub3duJyAtLSBzYW1lIGFzIG5vbmUsIGJ1dCBkb2N1bWVudHMgdGhhdCB3ZSByZWFsbHkgZG9uJ3Qga25vdy4KKyMgJ3Bhc3NfYWxsJyAtLSBhbGwgZGVwZW5kZW5jaWVzIHBhc3NlZCB3aXRoIG5vIGNoZWNrcy4KKyMgJ3Rlc3RfY29tcGlsZScgLS0gY2hlY2sgYnkgbWFraW5nIHRlc3QgcHJvZ3JhbS4KKyMgJ2ZpbGVfbWFnaWMgW1tyZWdleF1dJyAtLSBjaGVjayBieSBsb29raW5nIGZvciBmaWxlcyBpbiBsaWJyYXJ5IHBhdGgKKyMgd2hpY2ggcmVzcG9uZHMgdG8gdGhlICRmaWxlX21hZ2ljX2NtZCB3aXRoIGEgZ2l2ZW4gZWdyZXAgcmVnZXguCisjIElmIHlvdSBoYXZlIGBmaWxlJyBvciBlcXVpdmFsZW50IG9uIHlvdXIgc3lzdGVtIGFuZCB5b3UncmUgbm90IHN1cmUKKyMgd2hldGhlciBgcGFzc19hbGwnIHdpbGwgKmFsd2F5cyogd29yaywgeW91IHByb2JhYmx5IHdhbnQgdGhpcyBvbmUuCisKK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeDQqIHwgYWl4NSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2Jlb3MqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitic2RpNCopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW01MXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliKScKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy91c3IvYmluL2ZpbGUgLUwnCisgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9zaGxpYi9saWJjLnNvCisgIDs7CisKK2N5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgZmlsZSBmb3JtYXQgcGVpKi1pMzg2KC4qYXJjaGl0ZWN0dXJlOiBpMzg2KT8nCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSckT0JKRFVNUCAtZicKKyAgOzsKKworZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgTWFjaC1PIGR5bmFtaWNhbGx5IGxpbmtlZCBzaGFyZWQgbGlicmFyeScKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy91c3IvYmluL2ZpbGUgLUwnCisgIGNhc2UgIiRob3N0X29zIiBpbgorICByaGFwc29keSogfCBkYXJ3aW4xLlswMTJdKQorICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL1N5c3RlbS5mcmFtZXdvcmsvVmVyc2lvbnMvKi9TeXN0ZW0gfCBoZWFkIC0xYAorICAgIDs7CisgICopICMgRGFyd2luIDEuMyBvbgorICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPScvdXNyL2xpYi9saWJTeXN0ZW0uZHlsaWInCisgICAgOzsKKyAgZXNhYworICA7OworCitmcmVlYnNkKikKKyAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPiAvZGV2L251bGw7IHRoZW4KKyAgICBjYXNlICRob3N0X2NwdSBpbgorICAgIGkqODYgKQorICAgICAgIyBOb3Qgc3VyZSB3aGV0aGVyIHRoZSBwcmVzZW5jZSBvZiBPcGVuQlNEIGhlcmUgd2FzIGEgbWlzdGFrZS4KKyAgICAgICMgTGV0J3MgYWNjZXB0IGJvdGggb2YgdGhlbSB1bnRpbCB0aGlzIGlzIGNsZWFyZWQgdXAuCisgICAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoRnJlZUJTRHxPcGVuQlNEKS9pWzMtOV04NiAoY29tcGFjdCApP2RlbWFuZCBwYWdlZCBzaGFyZWQgbGlicmFyeScKKyAgICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKKyAgICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC91c3IvbGliL2xpYmMuc28uKmAKKyAgICAgIDs7CisgICAgZXNhYworICBlbHNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgZmkKKyAgOzsKKworZ251KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworaHB1eDEwLjIwKnxocHV4MTEqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1swLTldWzAtOV1bMC05XXxQQS1SSVNDWzAtOV0uWzAtOV0pIHNoYXJlZCBsaWJyYXJ5JworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCisgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2xpYmMuc2wKKyAgOzsKKworaXJpeDUqIHwgaXJpeDYqKQorICBjYXNlICRob3N0X29zIGluCisgIGlyaXg1KikKKyAgICAjIHRoaXMgd2lsbCBiZSBvdmVycmlkZGVuIHdpdGggcGFzc19hbGwsIGJ1dCBsZXQgdXMga2VlcCBpdCBqdXN0IGluIGNhc2UKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0iZmlsZV9tYWdpYyBFTEYgMzItYml0IE1TQiBkeW5hbWljIGxpYiBNSVBTIC0gdmVyc2lvbiAxIgorICAgIDs7CisgICopCisgICAgY2FzZSAkTEQgaW4KKyAgICAqLTMyfCoiLTMyICIpIGxpYm1hZ2ljPTMyLWJpdDs7CisgICAgKi1uMzJ8KiItbjMyICIpIGxpYm1hZ2ljPU4zMjs7CisgICAgKi02NHwqIi02NCAiKSBsaWJtYWdpYz02NC1iaXQ7OworICAgICopIGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKKyAgICBlc2FjCisgICAgIyB0aGlzIHdpbGwgYmUgb3ZlcnJpZGRlbiB3aXRoIHBhc3NfYWxsLCBidXQgbGV0IHVzIGtlZXAgaXQganVzdCBpbiBjYXNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9ImZpbGVfbWFnaWMgRUxGICR7bGlibWFnaWN9IE1TQiBtaXBzLVsxMjM0XSBkeW5hbWljIGxpYiBNSVBTIC0gdmVyc2lvbiAxIgorICAgIDs7CisgIGVzYWMKKyAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL2xpYiR7bGlic3VmZn0vbGliYy5zbypgCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKKyMgVGhpcyBtdXN0IGJlIExpbnV4IEVMRi4KK2xpbnV4KikKKyAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgYWxwaGEqIHwgaHBwYSogfCBpKjg2IHwgcG93ZXJwYyogfCBzcGFyYyogfCBpYTY0KiB8IHMzOTAqIHwgbTY4KiB8IG1pcHMqICkKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbCA7OworICAqKQorICAgICMgZ2xpYmMgdXAgdG8gMi4xLjEgZG9lcyBub3QgcGVyZm9ybSBzb21lIHJlbG9jYXRpb25zIG9uIEFSTQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW0xNXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliICknIDs7CisgIGVzYWMKKyAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL2xpYi9saWJjLnNvKiAvbGliL2xpYmMtKi5zb2AKKyAgOzsKKworbmV0YnNkKikKKyAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPiAvZGV2L251bGw7IHRoZW4KKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW14vXC5dK1wuc29cLlswLTldK1wuWzAtOV0rJCcKKyAgZWxzZQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbXi9cLl0rXC5zbyQnCisgIGZpCisgIDs7CisKK25ld29zNiopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW01MXVNCIChleGVjdXRhYmxlfGR5bmFtaWMgbGliKScKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQorICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9saWJubHMuc28KKyAgOzsKKworb3BlbmJzZCopCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKKyAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL3Vzci9saWIvbGliYy5zby4qYAorICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtMTV1TQiBzaGFyZWQgb2JqZWN0JworICBlbHNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgT3BlbkJTRC4qIHNoYXJlZCBsaWJyYXJ5JworICBmaQorICA7OworCitvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgICMgdGhpcyB3aWxsIGJlIG92ZXJyaWRkZW4gd2l0aCBwYXNzX2FsbCwgYnV0IGxldCB1cyBrZWVwIGl0IGp1c3QgaW4gY2FzZQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBDT0ZGIGZvcm1hdCBhbHBoYSBzaGFyZWQgbGlicmFyeScKKyAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3NobGliL2xpYmMuc28KKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworc2NvMy4ydjUqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitzb2xhcmlzKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L2xpYi9saWJjLnNvCisgIDs7CisKK3N5c3Y1dXdbNzhdKiB8IHN5c3Y0KnV3MiopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK3N5c3Y0IHwgc3lzdjQuMnV3MiogfCBzeXN2NC4zKiB8IHN5c3Y1KikKKyAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKyAgbW90b3JvbGEpCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTUxdU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIpIE1bMC05XVswLTldKiBWZXJzaW9uIFswLTldJworICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC91c3IvbGliL2xpYmMuc28qYAorICAgIDs7CisgIG5jcikKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICAgIDs7CisgIHNlcXVlbnQpCisgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy9iaW4vZmlsZScKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtMTV1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYiApJworICAgIDs7CisgIHNuaSkKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL2Jpbi9maWxlJworICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSJmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW0xNXVNCIGR5bmFtaWMgbGliIgorICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9saWIvbGliYy5zbworICAgIDs7CisgIGVzYWMKKyAgOzsKK2VzYWMKKworZmkKK2VjaG8gIiRhc19tZTozNDcyOiByZXN1bHQ6ICRsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZCIgPiY1CitlY2hvICIke0VDSE9fVH0kbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2QiID4mNgorZmlsZV9tYWdpY19jbWQ9JGx0X2N2X2ZpbGVfbWFnaWNfY21kCitkZXBsaWJzX2NoZWNrX21ldGhvZD0kbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2QKKworIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KK2VjaG8gIiRhc19tZTozNDc4OiBjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKworIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCisjIFtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspXQorCisjIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCitzeW1jb2RlPSdbQkNERUdSU1RdJworCisjIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KK3N5bXBhdD0nXChbX0EtWmEtel1bX0EtWmEtejAtOV0qXCknCisKKyMgVHJhbnNmb3JtIHRoZSBhYm92ZSBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KK3N5bXhmcm09J1wxIFwyXDMgXDMnCisKKyMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KK2x0X2N2X2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKKworIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gc3ltYm9sIG5hbWUgYW5kIHN5bWJvbCBhZGRyZXNzCitsdF9jdl9nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSJzZWQgLW4gLWUgJ3MvXjogXChbXiBdKlwpICQvICB7XFxcIlwxXFxcIiwgKGx0X3B0cikgMH0sL3AnIC1lICdzL14kc3ltY29kZSBcKFteIF0qXCkgXChbXiBdKlwpJC8gIHtcIlwyXCIsIChsdF9wdHIpIFwmXDJ9LC9wJyIKKworIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeCopCisgIHN5bWNvZGU9J1tCQ0RUXScKKyAgOzsKK2N5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgc3ltY29kZT0nW0FCQ0RHSVNUV10nCisgIDs7CitocHV4KikgIyBJdHMgbGlua2VyIGRpc3Rpbmd1aXNoZXMgZGF0YSBmcm9tIGNvZGUgc3ltYm9scworICBsdF9jdl9nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gY2hhciBcMSgpOy9wJyAtZSAncy9eJHN5bWNvZGUqIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgorICBsdF9jdl9nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSJzZWQgLW4gLWUgJ3MvXjogXChbXiBdKlwpICQvICB7XFxcIlwxXFxcIiwgKGx0X3B0cikgMH0sL3AnIC1lICdzL14kc3ltY29kZSogXChbXiBdKlwpIFwoW14gXSpcKSQvICB7XCJcMlwiLCAobHRfcHRyKSBcJlwyfSwvcCciCisgIDs7Citpcml4KikKKyAgc3ltY29kZT0nW0JDREVHUlNUXScKKyAgOzsKK3NvbGFyaXMqIHwgc3lzdjUqKQorICBzeW1jb2RlPSdbQkRUXScKKyAgOzsKK3N5c3Y0KQorICBzeW1jb2RlPSdbREZOU1RVXScKKyAgOzsKK2VzYWMKKworIyBIYW5kbGUgQ1JMRiBpbiBtaW5ndyB0b29sIGNoYWluCitvcHRfY3I9CitjYXNlICRob3N0X29zIGluCittaW5ndyopCisgIG9wdF9jcj1gZWNobyAneFx7MCwxXH0nIHwgdHIgeCAnXDAxNSdgICMgb3B0aW9uIGNyIGluIHJlZ2V4cAorICA7OworZXNhYworCisjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KK2lmICROTSAtViAyPiYxIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgorICBzeW1jb2RlPSdbQUJDREdJU1RXXScKK2ZpCisKKyMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCitmb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCisKKyAgIyBXcml0ZSB0aGUgcmF3IGFuZCBDIGlkZW50aWZpZXJzLgorbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKlsgCV1cKCRzeW1jb2RlJHN5bWNvZGUqXClbIAldWyAJXSpcKCRhY19zeW1wcmZ4XCkkc3ltcGF0JG9wdF9jciQvJHN5bXhmcm0vcCciCisKKyAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCisgIHBpcGVfd29ya3M9bm8KKyAgcm0gLWYgY29uZnRlc3QqCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK2NoYXIgbm1fdGVzdF92YXI7Cit2b2lkIG5tX3Rlc3RfZnVuYygpe30KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCitpbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmMoKTtyZXR1cm4oMCk7fQorRU9GCisKKyAgaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6MzU1OTogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6MzU2MjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCisgICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCisgICAgbmxpc3Q9Y29uZnRlc3Qubm0KKyAgICBpZiB7IChldmFsIGVjaG8gIiRhc19tZTozNTY2OiBcIiROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRubGlzdFwiIikgPiY1CisgIChldmFsICROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRubGlzdCkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjM1Njk6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB0ZXN0IC1zICIkbmxpc3QiOyB0aGVuCisgICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgorICAgICAgaWYgc29ydCAiJG5saXN0IiB8IHVuaXEgPiAiJG5saXN0IlQ7IHRoZW4KKwltdiAtZiAiJG5saXN0IlQgIiRubGlzdCIKKyAgICAgIGVsc2UKKwlybSAtZiAiJG5saXN0IlQKKyAgICAgIGZpCisKKyAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KKyAgICAgIGlmIGVncmVwICcgbm1fdGVzdF92YXIkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCisJaWYgZWdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCisJICBjYXQgPDxFT0YgPiBjb25mdGVzdC4kYWNfZXh0CisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK0VPRgorCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgorCSAgZXZhbCAiJGx0X2N2X2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkbmxpc3QiID4+IGNvbmZ0ZXN0LiRhY19leHQnCisKKwkgIGNhdCA8PEVPRiA+PiBjb25mdGVzdC4kYWNfZXh0CisjaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCisjIGRlZmluZSBsdF9wdHIgdm9pZCAqCisjZWxzZQorIyBkZWZpbmUgbHRfcHRyIGNoYXIgKgorIyBkZWZpbmUgY29uc3QKKyNlbmRpZgorCisvKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KK2NvbnN0IHN0cnVjdCB7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGx0X3B0ciBhZGRyZXNzOworfQorbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Cit7CitFT0YKKwkgIHNlZCAicy9eJHN5bWNvZGUkc3ltY29kZSogXCguKlwpIFwoLipcKSQvICB7XCJcMlwiLCAobHRfcHRyKSBcJlwyfSwvIiA8ICIkbmxpc3QiID4+IGNvbmZ0ZXN0LiRhY19leHQKKwkgIGNhdCA8PFxFT0YgPj4gY29uZnRlc3QuJGFjX2V4dAorICB7MCwgKGx0X3B0cikgMH0KK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCitFT0YKKwkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCisJICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0c3RtLiRhY19vYmpleHQKKwkgIHNhdmVfTElCUz0iJExJQlMiCisJICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKKwkgIExJQlM9ImNvbmZ0c3RtLiRhY19vYmpleHQiCisJICBDRkxBR1M9IiRDRkxBR1Mkbm9fYnVpbHRpbl9mbGFnIgorCSAgaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6MzYyMTogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6MzYyNDogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KKwkgICAgcGlwZV93b3Jrcz15ZXMKKwkgIGZpCisJICBMSUJTPSIkc2F2ZV9MSUJTIgorCSAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCisJZWxzZQorCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRubGlzdCIgPiY1CisJZmkKKyAgICAgIGVsc2UKKwllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkbmxpc3QiID4mNQorICAgICAgZmkKKyAgICBlbHNlCisgICAgICBlY2hvICJjYW5ub3QgcnVuICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKKyAgICBmaQorICBlbHNlCisgICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgZmkKKyAgcm0gLWYgY29uZnRlc3QqIGNvbmZ0c3QqCisKKyAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgorICBpZiB0ZXN0ICIkcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KKyAgICBicmVhaworICBlbHNlCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0KKyAgZmkKK2RvbmUKKworZmkKKworZ2xvYmFsX3N5bWJvbF9waXBlPSIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIKK2lmIHRlc3QgLXogIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgorICBnbG9iYWxfc3ltYm9sX3RvX2NkZWNsPQorICBnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPQorZWxzZQorICBnbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSIkbHRfY3ZfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCIKKyAgZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0iJGx0X2N2X2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MiCitmaQoraWYgdGVzdCAteiAiJGdsb2JhbF9zeW1ib2xfcGlwZSRnbG9iYWxfc3ltYm9sX3RvX2NkZWMkZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcyI7Cit0aGVuCisgIGVjaG8gIiRhc19tZTozNjY1OiByZXN1bHQ6IGZhaWxlZCIgPiY1CitlY2hvICIke0VDSE9fVH1mYWlsZWQiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6MzY2ODogcmVzdWx0OiBvayIgPiY1CitlY2hvICIke0VDSE9fVH1vayIgPiY2CitmaQorCitmb3IgYWNfaGVhZGVyIGluIGRsZmNuLmgKK2RvCithc19hY19IZWFkZXI9YGVjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKK2VjaG8gIiRhc19tZTozNjc1OiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNgoraWYgZXZhbCAidGVzdCBcIlwkeyRhc19hY19IZWFkZXIrc2V0fVwiID0gc2V0IjsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyNsaW5lIDM2ODEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZWFkZXI+CitfQUNFT0YKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOjM2ODU6IFwiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0KSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZWdyZXAgLXYgJ14gKlwrJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOjM2OTE6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsOyB0aGVuCisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgYWNfY3BwX2Vycj0kYWNfY19wcmVwcm9jX3dhcm5fZmxhZworICBlbHNlCisgICAgYWNfY3BwX2Vycj0KKyAgZmkKK2Vsc2UKKyAgYWNfY3BwX2Vycj15ZXMKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3BwX2VyciI7IHRoZW4KKyAgZXZhbCAiJGFzX2FjX0hlYWRlcj15ZXMiCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBldmFsICIkYXNfYWNfSGVhZGVyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOjM3MTA6IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNQorZWNobyAiJHtFQ0hPX1R9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNgoraWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCA9IHllczsgdGhlbgorICBjYXQgPj5jb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQorRU9GCisKK2ZpCitkb25lCisKKyMgT25seSBwZXJmb3JtIHRoZSBjaGVjayBmb3IgZmlsZSwgaWYgdGhlIGNoZWNrIG1ldGhvZCByZXF1aXJlcyBpdAorY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KK2ZpbGVfbWFnaWMqKQorICBpZiB0ZXN0ICIkZmlsZV9tYWdpY19jbWQiID0gJyRNQUdJQ19DTUQnOyB0aGVuCisgICAgZWNobyAiJGFzX21lOjM3MjQ6IGNoZWNraW5nIGZvciAke2FjX3Rvb2xfcHJlZml4fWZpbGUiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJHthY190b29sX3ByZWZpeH1maWxlLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtsdF9jdl9wYXRoX01BR0lDX0NNRCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXNlICRNQUdJQ19DTUQgaW4KKyAgLyopCisgIGx0X2N2X3BhdGhfTUFHSUNfQ01EPSIkTUFHSUNfQ01EIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgPzovKikKKyAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KKyAgOzsKKyAgKikKKyAgYWNfc2F2ZV9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiCisgIElGUz0iJHtJRlM9ICAgfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iL3Vzci9iaW46JFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyR7YWNfdG9vbF9wcmVmaXh9ZmlsZTsgdGhlbgorICAgICAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRhY19kaXIvJHthY190b29sX3ByZWZpeH1maWxlIgorICAgICAgaWYgdGVzdCAtbiAiJGZpbGVfbWFnaWNfdGVzdF9maWxlIjsgdGhlbgorCWNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCisJImZpbGVfbWFnaWMgIiopCisJICBmaWxlX21hZ2ljX3JlZ2V4PSJgZXhwciBcIiRkZXBsaWJzX2NoZWNrX21ldGhvZFwiIDogXCJmaWxlX21hZ2ljIFwoLipcKVwiYCIKKwkgIE1BR0lDX0NNRD0iJGx0X2N2X3BhdGhfTUFHSUNfQ01EIgorCSAgaWYgZXZhbCAkZmlsZV9tYWdpY19jbWQgXCRmaWxlX21hZ2ljX3Rlc3RfZmlsZSAyPiAvZGV2L251bGwgfAorCSAgICBlZ3JlcCAiJGZpbGVfbWFnaWNfcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCisJICAgIDoKKwkgIGVsc2UKKwkgICAgY2F0IDw8RU9GIDE+JjIKKworKioqIFdhcm5pbmc6IHRoZSBjb21tYW5kIGxpYnRvb2wgdXNlcyB0byBkZXRlY3Qgc2hhcmVkIGxpYnJhcmllcywKKyoqKiAkZmlsZV9tYWdpY19jbWQsIHByb2R1Y2VzIG91dHB1dCB0aGF0IGxpYnRvb2wgY2Fubm90IHJlY29nbml6ZS4KKyoqKiBUaGUgcmVzdWx0IGlzIHRoYXQgbGlidG9vbCBtYXkgZmFpbCB0byByZWNvZ25pemUgc2hhcmVkIGxpYnJhcmllcworKioqIGFzIHN1Y2guICBUaGlzIHdpbGwgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcyB0aGF0CisqKiogZGVwZW5kIG9uIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCBwcm9ncmFtcyBsaW5rZWQgd2l0aCBzdWNoIGxpYnRvb2wKKyoqKiBsaWJyYXJpZXMgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhpcyBwcm9ibGVtLiAgTmV2ZXJ0aGVsZXNzLCB5b3UKKyoqKiBtYXkgd2FudCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8geW91ciBzeXN0ZW0gbWFuYWdlciBhbmQvb3IgdG8KKyoqKiBidWctbGlidG9vbEBnbnUub3JnCisKK0VPRgorCSAgZmkgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICBNQUdJQ19DTUQ9IiRhY19zYXZlX01BR0lDX0NNRCIKKyAgOzsKK2VzYWMKK2ZpCisKK01BR0lDX0NNRD0iJGx0X2N2X3BhdGhfTUFHSUNfQ01EIgoraWYgdGVzdCAtbiAiJE1BR0lDX0NNRCI7IHRoZW4KKyAgZWNobyAiJGFzX21lOjM3Nzk6IHJlc3VsdDogJE1BR0lDX0NNRCIgPiY1CitlY2hvICIke0VDSE9fVH0kTUFHSUNfQ01EIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOjM3ODI6IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworaWYgdGVzdCAteiAiJGx0X2N2X3BhdGhfTUFHSUNfQ01EIjsgdGhlbgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICAgZWNobyAiJGFzX21lOjM3ODg6IGNoZWNraW5nIGZvciBmaWxlIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGZpbGUuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2x0X2N2X3BhdGhfTUFHSUNfQ01EK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhc2UgJE1BR0lDX0NNRCBpbgorICAvKikKKyAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICA/Oi8qKQorICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorICA7OworICAqKQorICBhY19zYXZlX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIKKyAgSUZTPSIke0lGUz0gICB9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIvdXNyL2JpbjokUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvZmlsZTsgdGhlbgorICAgICAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRhY19kaXIvZmlsZSIKKyAgICAgIGlmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX3Rlc3RfZmlsZSI7IHRoZW4KKwljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorCSJmaWxlX21hZ2ljICIqKQorCSAgZmlsZV9tYWdpY19yZWdleD0iYGV4cHIgXCIkZGVwbGlic19jaGVja19tZXRob2RcIiA6IFwiZmlsZV9tYWdpYyBcKC4qXClcImAiCisJICBNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKKwkgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwkZmlsZV9tYWdpY190ZXN0X2ZpbGUgMj4gL2Rldi9udWxsIHwKKwkgICAgZWdyZXAgIiRmaWxlX21hZ2ljX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICA6CisJICBlbHNlCisJICAgIGNhdCA8PEVPRiAxPiYyCisKKyoqKiBXYXJuaW5nOiB0aGUgY29tbWFuZCBsaWJ0b29sIHVzZXMgdG8gZGV0ZWN0IHNoYXJlZCBsaWJyYXJpZXMsCisqKiogJGZpbGVfbWFnaWNfY21kLCBwcm9kdWNlcyBvdXRwdXQgdGhhdCBsaWJ0b29sIGNhbm5vdCByZWNvZ25pemUuCisqKiogVGhlIHJlc3VsdCBpcyB0aGF0IGxpYnRvb2wgbWF5IGZhaWwgdG8gcmVjb2duaXplIHNoYXJlZCBsaWJyYXJpZXMKKyoqKiBhcyBzdWNoLiAgVGhpcyB3aWxsIGFmZmVjdCB0aGUgY3JlYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMgdGhhdAorKioqIGRlcGVuZCBvbiBzaGFyZWQgbGlicmFyaWVzLCBidXQgcHJvZ3JhbXMgbGlua2VkIHdpdGggc3VjaCBsaWJ0b29sCisqKiogbGlicmFyaWVzIHdpbGwgd29yayByZWdhcmRsZXNzIG9mIHRoaXMgcHJvYmxlbS4gIE5ldmVydGhlbGVzcywgeW91CisqKiogbWF5IHdhbnQgdG8gcmVwb3J0IHRoZSBwcm9ibGVtIHRvIHlvdXIgc3lzdGVtIG1hbmFnZXIgYW5kL29yIHRvCisqKiogYnVnLWxpYnRvb2xAZ251Lm9yZworCitFT0YKKwkgIGZpIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgTUFHSUNfQ01EPSIkYWNfc2F2ZV9NQUdJQ19DTUQiCisgIDs7Citlc2FjCitmaQorCitNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKK2lmIHRlc3QgLW4gIiRNQUdJQ19DTUQiOyB0aGVuCisgIGVjaG8gIiRhc19tZTozODQzOiByZXN1bHQ6ICRNQUdJQ19DTUQiID4mNQorZWNobyAiJHtFQ0hPX1R9JE1BR0lDX0NNRCIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTozODQ2OiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgZWxzZQorICAgIE1BR0lDX0NNRD06CisgIGZpCitmaQorCisgIGZpCisgIDs7Citlc2FjCisKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1yYW5saWI7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTozODYyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfUkFOTElCK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSRhY19wYXRoX3NlcGFyYXRvcgorYWNfZHVtbXk9IiRQQVRIIgorZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgIElGUz0kYWNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgJGFzX2V4ZWN1dGFibGVfcCAiJGFjX2Rpci8kYWNfd29yZCIgfHwgY29udGludWUKK2FjX2N2X3Byb2dfUkFOTElCPSIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIKK2VjaG8gIiRhc19tZTozODc3OiBmb3VuZCAkYWNfZGlyLyRhY193b3JkIiA+JjUKK2JyZWFrCitkb25lCisKK2ZpCitmaQorUkFOTElCPSRhY19jdl9wcm9nX1JBTkxJQgoraWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgZWNobyAiJGFzX21lOjM4ODU6IHJlc3VsdDogJFJBTkxJQiIgPiY1CitlY2hvICIke0VDSE9fVH0kUkFOTElCIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOjM4ODg6IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiI7IHRoZW4KKyAgYWNfY3RfUkFOTElCPSRSQU5MSUIKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOjM4OTc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9SQU5MSUIrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9IiRhY19jdF9SQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBhY19zYXZlX0lGUz0kSUZTOyBJRlM9JGFjX3BhdGhfc2VwYXJhdG9yCithY19kdW1teT0iJFBBVEgiCitmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgSUZTPSRhY19zYXZlX0lGUworICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAkYXNfZXhlY3V0YWJsZV9wICIkYWNfZGlyLyRhY193b3JkIiB8fCBjb250aW51ZQorYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9InJhbmxpYiIKK2VjaG8gIiRhc19tZTozOTEyOiBmb3VuZCAkYWNfZGlyLyRhY193b3JkIiA+JjUKK2JyZWFrCitkb25lCisKKyAgdGVzdCAteiAiJGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCIiAmJiBhY19jdl9wcm9nX2FjX2N0X1JBTkxJQj0iOiIKK2ZpCitmaQorYWNfY3RfUkFOTElCPSRhY19jdl9wcm9nX2FjX2N0X1JBTkxJQgoraWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KKyAgZWNobyAiJGFzX21lOjM5MjE6IHJlc3VsdDogJGFjX2N0X1JBTkxJQiIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3RfUkFOTElCIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOjM5MjQ6IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworICBSQU5MSUI9JGFjX2N0X1JBTkxJQgorZWxzZQorICBSQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKK2ZpCisKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXN0cmlwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXN0cmlwOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6MzkzNjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX1NUUklQK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRTVFJJUCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19TVFJJUD0iJFNUUklQIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSRhY19wYXRoX3NlcGFyYXRvcgorYWNfZHVtbXk9IiRQQVRIIgorZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgIElGUz0kYWNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgJGFzX2V4ZWN1dGFibGVfcCAiJGFjX2Rpci8kYWNfd29yZCIgfHwgY29udGludWUKK2FjX2N2X3Byb2dfU1RSSVA9IiR7YWNfdG9vbF9wcmVmaXh9c3RyaXAiCitlY2hvICIkYXNfbWU6Mzk1MTogZm91bmQgJGFjX2Rpci8kYWNfd29yZCIgPiY1CiticmVhaworZG9uZQorCitmaQorZmkKK1NUUklQPSRhY19jdl9wcm9nX1NUUklQCitpZiB0ZXN0IC1uICIkU1RSSVAiOyB0aGVuCisgIGVjaG8gIiRhc19tZTozOTU5OiByZXN1bHQ6ICRTVFJJUCIgPiY1CitlY2hvICIke0VDSE9fVH0kU1RSSVAiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6Mzk2MjogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfU1RSSVAiOyB0aGVuCisgIGFjX2N0X1NUUklQPSRTVFJJUAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInN0cmlwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBzdHJpcDsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOjM5NzE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9TVFJJUCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfU1RSSVAiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfU1RSSVA9IiRhY19jdF9TVFJJUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIGFjX3NhdmVfSUZTPSRJRlM7IElGUz0kYWNfcGF0aF9zZXBhcmF0b3IKK2FjX2R1bW15PSIkUEFUSCIKK2ZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICBJRlM9JGFjX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICRhc19leGVjdXRhYmxlX3AgIiRhY19kaXIvJGFjX3dvcmQiIHx8IGNvbnRpbnVlCithY19jdl9wcm9nX2FjX2N0X1NUUklQPSJzdHJpcCIKK2VjaG8gIiRhc19tZTozOTg2OiBmb3VuZCAkYWNfZGlyLyRhY193b3JkIiA+JjUKK2JyZWFrCitkb25lCisKKyAgdGVzdCAteiAiJGFjX2N2X3Byb2dfYWNfY3RfU1RSSVAiICYmIGFjX2N2X3Byb2dfYWNfY3RfU1RSSVA9IjoiCitmaQorZmkKK2FjX2N0X1NUUklQPSRhY19jdl9wcm9nX2FjX2N0X1NUUklQCitpZiB0ZXN0IC1uICIkYWNfY3RfU1RSSVAiOyB0aGVuCisgIGVjaG8gIiRhc19tZTozOTk1OiByZXN1bHQ6ICRhY19jdF9TVFJJUCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3RfU1RSSVAiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6Mzk5ODogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgIFNUUklQPSRhY19jdF9TVFJJUAorZWxzZQorICBTVFJJUD0iJGFjX2N2X3Byb2dfU1RSSVAiCitmaQorCitlbmFibGVfZGxvcGVuPXllcworZW5hYmxlX3dpbjMyX2RsbD15ZXMKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWxpYnRvb2wtbG9jayBvciAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2xpYnRvb2xfbG9jaytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfbGlidG9vbF9sb2NrIgorCitmaTsKK3Rlc3QgIngkZW5hYmxlX2xpYnRvb2xfbG9jayIgIT0geG5vICYmIGVuYWJsZV9saWJ0b29sX2xvY2s9eWVzCisKKyMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAorIyBsaWJ0b29sIHN1cHBvcnQuCitjYXNlICRob3N0IGluCisqLSotaXJpeDYqKQorICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCisgIGVjaG8gJyNsaW5lIDQwMjIgImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiB7IChldmFsIGVjaG8gIiRhc19tZTo0MDIzOiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTo0MDI2OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IHRoZW4KKyAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0LiRhY19vYmpleHRgIGluCisgICAgKjMyLWJpdCopCisgICAgICBMRD0iJHtMRC1sZH0gLTMyIgorICAgICAgOzsKKyAgICAqTjMyKikKKyAgICAgIExEPSIke0xELWxkfSAtbjMyIgorICAgICAgOzsKKyAgICAqNjQtYml0KikKKyAgICAgIExEPSIke0xELWxkfSAtNjQiCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworCisqLSotc2NvMy4ydjUqKQorICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCisgIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCisgIGVjaG8gIiRhc19tZTo0MDQ3OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZi4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7bHRfY3ZfY2NfbmVlZHNfYmVsZitzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorCisgICAgIGFjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworICAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyNsaW5lIDQwNjAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6NDA3MjogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6NDA3NTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOjQwNzg6IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTo0MDgxOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK2NhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorbHRfY3ZfY2NfbmVlZHNfYmVsZj1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICAgYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCitmaQorZWNobyAiJGFzX21lOjQwOTc6IHJlc3VsdDogJGx0X2N2X2NjX25lZWRzX2JlbGYiID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X2N2X2NjX25lZWRzX2JlbGYiID4mNgorICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgorICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgorICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgorICBmaQorICA7OworCisqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiopCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbDsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOjQxMDk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19ETExUT09MK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgorICBhY19jdl9wcm9nX0RMTFRPT0w9IiRETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSRhY19wYXRoX3NlcGFyYXRvcgorYWNfZHVtbXk9IiRQQVRIIgorZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgIElGUz0kYWNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgJGFzX2V4ZWN1dGFibGVfcCAiJGFjX2Rpci8kYWNfd29yZCIgfHwgY29udGludWUKK2FjX2N2X3Byb2dfRExMVE9PTD0iJHthY190b29sX3ByZWZpeH1kbGx0b29sIgorZWNobyAiJGFzX21lOjQxMjQ6IGZvdW5kICRhY19kaXIvJGFjX3dvcmQiID4mNQorYnJlYWsKK2RvbmUKKworZmkKK2ZpCitETExUT09MPSRhY19jdl9wcm9nX0RMTFRPT0wKK2lmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgorICBlY2hvICIkYXNfbWU6NDEzMjogcmVzdWx0OiAkRExMVE9PTCIgPiY1CitlY2hvICIke0VDSE9fVH0kRExMVE9PTCIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTo0MTM1OiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19ETExUT09MIjsgdGhlbgorICBhY19jdF9ETExUT09MPSRETExUT09MCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZGxsdG9vbDsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOjQxNDQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9ETExUT09MK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9ETExUT09MIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0RMTFRPT0w9IiRhY19jdF9ETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSRhY19wYXRoX3NlcGFyYXRvcgorYWNfZHVtbXk9IiRQQVRIIgorZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgIElGUz0kYWNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgJGFzX2V4ZWN1dGFibGVfcCAiJGFjX2Rpci8kYWNfd29yZCIgfHwgY29udGludWUKK2FjX2N2X3Byb2dfYWNfY3RfRExMVE9PTD0iZGxsdG9vbCIKK2VjaG8gIiRhc19tZTo0MTU5OiBmb3VuZCAkYWNfZGlyLyRhY193b3JkIiA+JjUKK2JyZWFrCitkb25lCisKKyAgdGVzdCAteiAiJGFjX2N2X3Byb2dfYWNfY3RfRExMVE9PTCIgJiYgYWNfY3ZfcHJvZ19hY19jdF9ETExUT09MPSJmYWxzZSIKK2ZpCitmaQorYWNfY3RfRExMVE9PTD0kYWNfY3ZfcHJvZ19hY19jdF9ETExUT09MCitpZiB0ZXN0IC1uICIkYWNfY3RfRExMVE9PTCI7IHRoZW4KKyAgZWNobyAiJGFzX21lOjQxNjg6IHJlc3VsdDogJGFjX2N0X0RMTFRPT0wiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N0X0RMTFRPT0wiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6NDE3MTogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgIERMTFRPT0w9JGFjX2N0X0RMTFRPT0wKK2Vsc2UKKyAgRExMVE9PTD0iJGFjX2N2X3Byb2dfRExMVE9PTCIKK2ZpCisKKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9YXMiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9YXM7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTo0MTgzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQVMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgorICBhY19jdl9wcm9nX0FTPSIkQVMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBhY19zYXZlX0lGUz0kSUZTOyBJRlM9JGFjX3BhdGhfc2VwYXJhdG9yCithY19kdW1teT0iJFBBVEgiCitmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgSUZTPSRhY19zYXZlX0lGUworICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAkYXNfZXhlY3V0YWJsZV9wICIkYWNfZGlyLyRhY193b3JkIiB8fCBjb250aW51ZQorYWNfY3ZfcHJvZ19BUz0iJHthY190b29sX3ByZWZpeH1hcyIKK2VjaG8gIiRhc19tZTo0MTk4OiBmb3VuZCAkYWNfZGlyLyRhY193b3JkIiA+JjUKK2JyZWFrCitkb25lCisKK2ZpCitmaQorQVM9JGFjX2N2X3Byb2dfQVMKK2lmIHRlc3QgLW4gIiRBUyI7IHRoZW4KKyAgZWNobyAiJGFzX21lOjQyMDY6IHJlc3VsdDogJEFTIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRBUyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTo0MjA5OiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUyI7IHRoZW4KKyAgYWNfY3RfQVM9JEFTCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiYXMiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGFzOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6NDIxODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0FTK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9BUyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9BUz0iJGFjX2N0X0FTIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSRhY19wYXRoX3NlcGFyYXRvcgorYWNfZHVtbXk9IiRQQVRIIgorZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgIElGUz0kYWNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgJGFzX2V4ZWN1dGFibGVfcCAiJGFjX2Rpci8kYWNfd29yZCIgfHwgY29udGludWUKK2FjX2N2X3Byb2dfYWNfY3RfQVM9ImFzIgorZWNobyAiJGFzX21lOjQyMzM6IGZvdW5kICRhY19kaXIvJGFjX3dvcmQiID4mNQorYnJlYWsKK2RvbmUKKworICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19hY19jdF9BUyIgJiYgYWNfY3ZfcHJvZ19hY19jdF9BUz0iZmFsc2UiCitmaQorZmkKK2FjX2N0X0FTPSRhY19jdl9wcm9nX2FjX2N0X0FTCitpZiB0ZXN0IC1uICIkYWNfY3RfQVMiOyB0aGVuCisgIGVjaG8gIiRhc19tZTo0MjQyOiByZXN1bHQ6ICRhY19jdF9BUyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3RfQVMiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6NDI0NTogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgIEFTPSRhY19jdF9BUworZWxzZQorICBBUz0iJGFjX2N2X3Byb2dfQVMiCitmaQorCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fW9iamR1bXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9b2JqZHVtcDsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOjQyNTc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19PQkpEVU1QK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRPQkpEVU1QIjsgdGhlbgorICBhY19jdl9wcm9nX09CSkRVTVA9IiRPQkpEVU1QIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSRhY19wYXRoX3NlcGFyYXRvcgorYWNfZHVtbXk9IiRQQVRIIgorZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgIElGUz0kYWNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgJGFzX2V4ZWN1dGFibGVfcCAiJGFjX2Rpci8kYWNfd29yZCIgfHwgY29udGludWUKK2FjX2N2X3Byb2dfT0JKRFVNUD0iJHthY190b29sX3ByZWZpeH1vYmpkdW1wIgorZWNobyAiJGFzX21lOjQyNzI6IGZvdW5kICRhY19kaXIvJGFjX3dvcmQiID4mNQorYnJlYWsKK2RvbmUKKworZmkKK2ZpCitPQkpEVU1QPSRhY19jdl9wcm9nX09CSkRVTVAKK2lmIHRlc3QgLW4gIiRPQkpEVU1QIjsgdGhlbgorICBlY2hvICIkYXNfbWU6NDI4MDogcmVzdWx0OiAkT0JKRFVNUCIgPiY1CitlY2hvICIke0VDSE9fVH0kT0JKRFVNUCIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTo0MjgzOiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19PQkpEVU1QIjsgdGhlbgorICBhY19jdF9PQkpEVU1QPSRPQkpEVU1QCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAib2JqZHVtcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgb2JqZHVtcDsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOjQyOTI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9PQkpEVU1QK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9PQkpEVU1QIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X09CSkRVTVA9IiRhY19jdF9PQkpEVU1QIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSRhY19wYXRoX3NlcGFyYXRvcgorYWNfZHVtbXk9IiRQQVRIIgorZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgIElGUz0kYWNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgJGFzX2V4ZWN1dGFibGVfcCAiJGFjX2Rpci8kYWNfd29yZCIgfHwgY29udGludWUKK2FjX2N2X3Byb2dfYWNfY3RfT0JKRFVNUD0ib2JqZHVtcCIKK2VjaG8gIiRhc19tZTo0MzA3OiBmb3VuZCAkYWNfZGlyLyRhY193b3JkIiA+JjUKK2JyZWFrCitkb25lCisKKyAgdGVzdCAteiAiJGFjX2N2X3Byb2dfYWNfY3RfT0JKRFVNUCIgJiYgYWNfY3ZfcHJvZ19hY19jdF9PQkpEVU1QPSJmYWxzZSIKK2ZpCitmaQorYWNfY3RfT0JKRFVNUD0kYWNfY3ZfcHJvZ19hY19jdF9PQkpEVU1QCitpZiB0ZXN0IC1uICIkYWNfY3RfT0JKRFVNUCI7IHRoZW4KKyAgZWNobyAiJGFzX21lOjQzMTY6IHJlc3VsdDogJGFjX2N0X09CSkRVTVAiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N0X09CSkRVTVAiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6NDMxOTogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgIE9CSkRVTVA9JGFjX2N0X09CSkRVTVAKK2Vsc2UKKyAgT0JKRFVNUD0iJGFjX2N2X3Byb2dfT0JKRFVNUCIKK2ZpCisKKyAgIyByZWNlbnQgY3lnd2luIGFuZCBtaW5ndyBzeXN0ZW1zIHN1cHBseSBhIHN0dWIgRGxsTWFpbiB3aGljaCB0aGUgdXNlcgorICAjIGNhbiBvdmVycmlkZSwgYnV0IG9uIG9sZGVyIHN5c3RlbXMgd2UgaGF2ZSB0byBzdXBwbHkgb25lCisgIGVjaG8gIiRhc19tZTo0MzMwOiBjaGVja2luZyBpZiBsaWJ0b29sIHNob3VsZCBzdXBwbHkgRGxsTWFpbiBmdW5jdGlvbiIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmIGxpYnRvb2wgc2hvdWxkIHN1cHBseSBEbGxNYWluIGZ1bmN0aW9uLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtsdF9jdl9uZWVkX2RsbG1haW4rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisjbGluZSA0MzM2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50CittYWluICgpCit7CitleHRlcm4gaW50IF9fYXR0cmlidXRlX18oKF9fc3RkY2FsbF9fKSkgRGxsTWFpbih2b2lkKiwgaW50LCB2b2lkKik7CisgICAgICBEbGxNYWluICgwLCAwLCAwKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOjQzNDk6IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjQzNTI6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTo0MzU1OiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6NDM1ODogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGx0X2N2X25lZWRfZGxsbWFpbj1ubworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CitsdF9jdl9uZWVkX2RsbG1haW49eWVzCitmaQorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2VjaG8gIiRhc19tZTo0MzY4OiByZXN1bHQ6ICRsdF9jdl9uZWVkX2RsbG1haW4iID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X2N2X25lZWRfZGxsbWFpbiIgPiY2CisKKyAgY2FzZSAkaG9zdC8kQ0MgaW4KKyAgKi0qLWN5Z3dpbiovZ2NjKi1tbm8tY3lnd2luKnwqLSotbWluZ3cqKQorICAgICMgb2xkIG1pbmd3IHN5c3RlbXMgcmVxdWlyZSAiLWRsbCIgdG8gbGluayBhIERMTCwgd2hpbGUgbW9yZSByZWNlbnQgb25lcworICAgICMgcmVxdWlyZSAiLW1kbGwiCisgICAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCisgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1tZGxsIgorICAgIGVjaG8gIiRhc19tZTo0Mzc3OiBjaGVja2luZyBob3cgdG8gbGluayBETExzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaG93IHRvIGxpbmsgRExMcy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7bHRfY3ZfY2NfZGxsX3N3aXRjaCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyNsaW5lIDQzODMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6NDM5NTogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6NDM5ODogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOjQ0MDE6IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTo0NDA0OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgbHRfY3ZfY2NfZGxsX3N3aXRjaD0tbWRsbAorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CitsdF9jdl9jY19kbGxfc3dpdGNoPS1kbGwKK2ZpCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOjQ0MTQ6IHJlc3VsdDogJGx0X2N2X2NjX2RsbF9zd2l0Y2giID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X2N2X2NjX2RsbF9zd2l0Y2giID4mNgorICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIiA7OworICAqLSotY3lnd2luKiB8ICotKi1wdzMyKikKKyAgICAjIGN5Z3dpbiBzeXN0ZW1zIG5lZWQgdG8gcGFzcyAtLWRsbCB0byB0aGUgbGlua2VyLCBhbmQgbm90IGxpbmsKKyAgICAjIGNydC5vIHdoaWNoIHdpbGwgcmVxdWlyZSBhIFdpbk1haW5AMTYgZGVmaW5pdGlvbi4KKyAgICBsdF9jdl9jY19kbGxfc3dpdGNoPSItV2wsLS1kbGwgLW5vc3RhcnRmaWxlcyIgOzsKKyAgZXNhYworICA7OworCitlc2FjCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKKyMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCitYc2VkPSdzZWQgLWUgcy9eWC8vJworc2VkX3F1b3RlX3N1YnN0PSdzL1woW1xcIlxcYCRcXFxcXVwpL1xcXDEvZycKKworIyBTYW1lIGFzIGFib3ZlLCBidXQgZG8gbm90IHF1b3RlIHZhcmlhYmxlIHJlZmVyZW5jZXMuCitkb3VibGVfcXVvdGVfc3Vic3Q9J3MvXChbXFwiXFxgXFxcXF1cKS9cXFwxL2cnCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0byBkZWxheSBleHBhbnNpb24gb2YgYW4gZXNjYXBlZCBzaGVsbCB2YXJpYWJsZSBpbiBhCisjIGRvdWJsZV9xdW90ZV9zdWJzdCdlZCBzdHJpbmcuCitkZWxheV92YXJpYWJsZV9zdWJzdD0ncy9cXFxcXFxcXFxcXCQvXFxcXFxcJC9nJworCisjIENvbnN0YW50czoKK3JtPSJybSAtZiIKKworIyBHbG9iYWwgdmFyaWFibGVzOgorZGVmYXVsdF9vZmlsZT1saWJ0b29sCitjYW5fYnVpbGRfc2hhcmVkPXllcworCisjIEFsbCBrbm93biBsaW5rZXJzIHJlcXVpcmUgYSBgLmEnIGFyY2hpdmUgZm9yIHN0YXRpYyBsaW5raW5nIChleGNlcHQgTSRWQywKKyMgd2hpY2ggbmVlZHMgJy5saWInKS4KK2xpYmV4dD1hCitsdG1haW49IiRhY19hdXhfZGlyL2x0bWFpbi5zaCIKK29maWxlPSIkZGVmYXVsdF9vZmlsZSIKK3dpdGhfZ251X2xkPSIkbHRfY3ZfcHJvZ19nbnVfbGQiCituZWVkX2xvY2tzPSIkZW5hYmxlX2xpYnRvb2xfbG9jayIKKworb2xkX0NDPSIkQ0MiCitvbGRfQ0ZMQUdTPSIkQ0ZMQUdTIgorCisjIFNldCBzYW5lIGRlZmF1bHRzIGZvciB2YXJpb3VzIHZhcmlhYmxlcwordGVzdCAteiAiJEFSIiAmJiBBUj1hcgordGVzdCAteiAiJEFSX0ZMQUdTIiAmJiBBUl9GTEFHUz1jcnUKK3Rlc3QgLXogIiRBUyIgJiYgQVM9YXMKK3Rlc3QgLXogIiRDQyIgJiYgQ0M9Y2MKK3Rlc3QgLXogIiRETExUT09MIiAmJiBETExUT09MPWRsbHRvb2wKK3Rlc3QgLXogIiRMRCIgJiYgTEQ9bGQKK3Rlc3QgLXogIiRMTl9TIiAmJiBMTl9TPSJsbiAtcyIKK3Rlc3QgLXogIiRNQUdJQ19DTUQiICYmIE1BR0lDX0NNRD1maWxlCit0ZXN0IC16ICIkTk0iICYmIE5NPW5tCit0ZXN0IC16ICIkT0JKRFVNUCIgJiYgT0JKRFVNUD1vYmpkdW1wCit0ZXN0IC16ICIkUkFOTElCIiAmJiBSQU5MSUI9OgordGVzdCAteiAiJFNUUklQIiAmJiBTVFJJUD06Cit0ZXN0IC16ICIkYWNfb2JqZXh0IiAmJiBhY19vYmpleHQ9bworCitpZiB0ZXN0IHgiJGhvc3QiICE9IHgiJGJ1aWxkIjsgdGhlbgorICBhY190b29sX3ByZWZpeD0ke2hvc3RfYWxpYXN9LQorZWxzZQorICBhY190b29sX3ByZWZpeD0KK2ZpCisKK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeDMqKQorICAjIEFJWCBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhlIEdDQyBjb2xsZWN0MiBwcm9ncmFtLiAgRm9yIHNvbWUKKyAgIyByZWFzb24sIGlmIHdlIHNldCB0aGUgQ09MTEVDVF9OQU1FUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlIHByb2JsZW1zCisgICMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KKyAgaWYgdGVzdCAiWCR7Q09MTEVDVF9OQU1FUytzZXR9IiAhPSBYc2V0OyB0aGVuCisgICAgQ09MTEVDVF9OQU1FUz0KKyAgICBleHBvcnQgQ09MTEVDVF9OQU1FUworICBmaQorICA7OworZXNhYworCisjIERldGVybWluZSBjb21tYW5kcyB0byBjcmVhdGUgb2xkLXN0eWxlIHN0YXRpYyBhcmNoaXZlcy4KK29sZF9hcmNoaXZlX2NtZHM9JyRBUiAkQVJfRkxBR1MgJG9sZGxpYiRvbGRvYmpzJG9sZF9kZXBsaWJzJworb2xkX3Bvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDY0NCAkb2xkbGliJworb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0KKworaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICBvcGVuYnNkKikKKyAgICBvbGRfcG9zdGluc3RhbGxfY21kcz0iXCRSQU5MSUIgLXQgXCRvbGRsaWJ+JG9sZF9wb3N0aW5zdGFsbF9jbWRzIgorICAgIDs7CisgICopCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IlwkUkFOTElCIFwkb2xkbGlifiRvbGRfcG9zdGluc3RhbGxfY21kcyIKKyAgICA7OworICBlc2FjCisgIG9sZF9hcmNoaXZlX2NtZHM9IiRvbGRfYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkb2xkbGliIgorZmkKKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK3NldCBkdW1teSAkQ0MKK2NvbXBpbGVyPSIkMiIKKworZWNobyAiJGFzX21lOjQ1MTA6IGNoZWNraW5nIGZvciBvYmpkaXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igb2JqZGlyLi4uICRFQ0hPX0MiID4mNgorcm0gLWYgLmxpYnMgMj4vZGV2L251bGwKK21rZGlyIC5saWJzIDI+L2Rldi9udWxsCitpZiB0ZXN0IC1kIC5saWJzOyB0aGVuCisgIG9iamRpcj0ubGlicworZWxzZQorICAjIE1TLURPUyBkb2VzIG5vdCBhbGxvdyBmaWxlbmFtZXMgdGhhdCBiZWdpbiB3aXRoIGEgZG90LgorICBvYmpkaXI9X2xpYnMKK2ZpCitybWRpciAubGlicyAyPi9kZXYvbnVsbAorZWNobyAiJGFzX21lOjQ1MjE6IHJlc3VsdDogJG9iamRpciIgPiY1CitlY2hvICIke0VDSE9fVH0kb2JqZGlyIiA+JjYKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1waWMgb3IgLS13aXRob3V0LXBpYyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfcGljK3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX3BpYyIKKyAgcGljX21vZGU9IiR3aXRodmFsIgorZWxzZQorICBwaWNfbW9kZT1kZWZhdWx0CitmaTsKK3Rlc3QgLXogIiRwaWNfbW9kZSIgJiYgcGljX21vZGU9ZGVmYXVsdAorCisjIFdlIGFzc3VtZSBoZXJlIHRoYXQgdGhlIHZhbHVlIGZvciBsdF9jdl9wcm9nX2NjX3BpYyB3aWxsIG5vdCBiZSBjYWNoZWQKKyMgaW4gaXNvbGF0aW9uLCBhbmQgdGhhdCBzZWVpbmcgaXQgc2V0IChmcm9tIHRoZSBjYWNoZSkgaW5kaWNhdGVzIHRoYXQKKyMgdGhlIGFzc29jaWF0ZWQgdmFsdWVzIGFyZSBzZXQgKGluIHRoZSBjYWNoZSkgY29ycmVjdGx5IHRvby4KK2VjaG8gIiRhc19tZTo0NTM2OiBjaGVja2luZyBmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtsdF9jdl9wcm9nX2NjX3BpYytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICAgbHRfY3ZfcHJvZ19jY19waWM9CisgIGx0X2N2X3Byb2dfY2Nfc2hsaWI9CisgIGx0X2N2X3Byb2dfY2Nfd2w9CisgIGx0X2N2X3Byb2dfY2Nfc3RhdGljPQorICBsdF9jdl9wcm9nX2NjX25vX2J1aWx0aW49CisgIGx0X2N2X3Byb2dfY2NfY2FuX2J1aWxkX3NoYXJlZD0kY2FuX2J1aWxkX3NoYXJlZAorCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgbHRfY3ZfcHJvZ19jY193bD0nLVdsLCcKKyAgICBsdF9jdl9wcm9nX2NjX3N0YXRpYz0nLXN0YXRpYycKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgqKQorICAgICAgIyBCZWxvdyB0aGVyZSBpcyBhIGRpcnR5IGhhY2sgdG8gZm9yY2Ugbm9ybWFsIHN0YXRpYyBsaW5raW5nIHdpdGggLWxkbAorICAgICAgIyBUaGUgcHJvYmxlbSBpcyBiZWNhdXNlIGxpYmRsIGR5bmFtaWNhbGx5IGxpbmtlZCB3aXRoIGJvdGggbGliYyBhbmQKKyAgICAgICMgbGliQyAoQUlYIEMrKyBsaWJyYXJ5KSwgd2hpY2ggb2J2aW91c2x5IGRvZXNuJ3QgaW5jbHVkZWQgaW4gbGlicmFyaWVzCisgICAgICAjIGxpc3QgYnkgZ2NjLiBUaGlzIGNhdXNlIHVuZGVmaW5lZCBzeW1ib2xzIHdpdGggLXN0YXRpYyBmbGFncy4KKyAgICAgICMgVGhpcyBoYWNrIGFsbG93cyBDIHByb2dyYW1zIHRvIGJlIGxpbmtlZCB3aXRoICItc3RhdGljIC1sZGwiLCBidXQKKyAgICAgICMgbm90IHN1cmUgYWJvdXQgQysrIHByb2dyYW1zLgorICAgICAgbHRfY3ZfcHJvZ19jY19zdGF0aWM9IiRsdF9jdl9wcm9nX2NjX3N0YXRpYyAke2x0X2N2X3Byb2dfY2Nfd2x9LWxDIgorICAgICAgOzsKKyAgICBhbWlnYW9zKikKKyAgICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKKyAgICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAorICAgICAgIyBsaWtlIGAtbTY4MDQwJy4KKyAgICAgIGx0X2N2X3Byb2dfY2NfcGljPSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCisgICAgICA7OworICAgIGJlb3MqIHwgaXJpeDUqIHwgaXJpeDYqIHwgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCisgICAgICA7OworICAgIGRhcndpbiogfCByaGFwc29keSopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCisgICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCisgICAgICBsdF9jdl9wcm9nX2NjX3BpYz0nLWZuby1jb21tb24nCisgICAgICA7OworICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IG9zMiopCisgICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisgICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgorICAgICAgbHRfY3ZfcHJvZ19jY19waWM9Jy1ERExMX0VYUE9SVCcKKyAgICAgIDs7CisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgorCSBsdF9jdl9wcm9nX2NjX3BpYz0tS2NvbmZvcm1fcGljCisgICAgICBmaQorICAgICAgOzsKKyAgICAqKQorICAgICAgbHRfY3ZfcHJvZ19jY19waWM9Jy1mUElDJworICAgICAgOzsKKyAgICBlc2FjCisgIGVsc2UKKyAgICAjIFBPUlRNRSBDaGVjayBmb3IgUElDIGZsYWdzIGZvciB0aGUgc3lzdGVtIGNvbXBpbGVyLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgzKiB8IGFpeDQqIHwgYWl4NSopCisgICAgICBsdF9jdl9wcm9nX2NjX3dsPSctV2wsJworICAgICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCWx0X2N2X3Byb2dfY2Nfc3RhdGljPSctQnN0YXRpYycKKyAgICAgIGVsc2UKKwlsdF9jdl9wcm9nX2NjX3N0YXRpYz0nLWJuc28gLWJJOi9saWIvc3lzY2FsbHMuZXhwJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKKyAgICAgICMgSXMgdGhlcmUgYSBiZXR0ZXIgbHRfY3ZfcHJvZ19jY19zdGF0aWMgdGhhdCB3b3JrcyB3aXRoIHRoZSBidW5kbGVkIENDPworICAgICAgbHRfY3ZfcHJvZ19jY193bD0nLVdsLCcKKyAgICAgIGx0X2N2X3Byb2dfY2Nfc3RhdGljPSIke2x0X2N2X3Byb2dfY2Nfd2x9LWEgJHtsdF9jdl9wcm9nX2NjX3dsfWFyY2hpdmUiCisgICAgICBsdF9jdl9wcm9nX2NjX3BpYz0nK1onCisgICAgICA7OworCisgICAgaXJpeDUqIHwgaXJpeDYqKQorICAgICAgbHRfY3ZfcHJvZ19jY193bD0nLVdsLCcKKyAgICAgIGx0X2N2X3Byb2dfY2Nfc3RhdGljPSctbm9uX3NoYXJlZCcKKyAgICAgICMgUElDICh3aXRoIC1LUElDKSBpcyB0aGUgZGVmYXVsdC4KKyAgICAgIDs7CisKKyAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBvczIqKQorICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKyAgICAgIGx0X2N2X3Byb2dfY2NfcGljPSctRERMTF9FWFBPUlQnCisgICAgICA7OworCisgICAgbmV3c29zNikKKyAgICAgIGx0X2N2X3Byb2dfY2NfcGljPSctS1BJQycKKyAgICAgIGx0X2N2X3Byb2dfY2Nfc3RhdGljPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgICAgICAjIEFsbCBPU0YvMSBjb2RlIGlzIFBJQy4KKyAgICAgIGx0X2N2X3Byb2dfY2Nfd2w9Jy1XbCwnCisgICAgICBsdF9jdl9wcm9nX2NjX3N0YXRpYz0nLW5vbl9zaGFyZWQnCisgICAgICA7OworCisgICAgc2NvMy4ydjUqKQorICAgICAgbHRfY3ZfcHJvZ19jY19waWM9Jy1LcGljJworICAgICAgbHRfY3ZfcHJvZ19jY19zdGF0aWM9Jy1kbicKKyAgICAgIGx0X2N2X3Byb2dfY2Nfc2hsaWI9Jy1iZWxmJworICAgICAgOzsKKworICAgIHNvbGFyaXMqKQorICAgICAgbHRfY3ZfcHJvZ19jY19waWM9Jy1LUElDJworICAgICAgbHRfY3ZfcHJvZ19jY19zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgbHRfY3ZfcHJvZ19jY193bD0nLVdsLCcKKyAgICAgIDs7CisKKyAgICBzdW5vczQqKQorICAgICAgbHRfY3ZfcHJvZ19jY19waWM9Jy1QSUMnCisgICAgICBsdF9jdl9wcm9nX2NjX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICBsdF9jdl9wcm9nX2NjX3dsPSctUW9wdGlvbiBsZCAnCisgICAgICA7OworCisgICAgc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqIHwgc3lzdjUqKQorICAgICAgbHRfY3ZfcHJvZ19jY19waWM9Jy1LUElDJworICAgICAgbHRfY3ZfcHJvZ19jY19zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgaWYgdGVzdCAieCRob3N0X3ZlbmRvciIgPSB4c25pOyB0aGVuCisJbHRfY3ZfcHJvZ19jY193bD0nLUxEJworICAgICAgZWxzZQorCWx0X2N2X3Byb2dfY2Nfd2w9Jy1XbCwnCisgICAgICBmaQorICAgICAgOzsKKworICAgIHV0czQqKQorICAgICAgbHRfY3ZfcHJvZ19jY19waWM9Jy1waWMnCisgICAgICBsdF9jdl9wcm9nX2NjX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgorCWx0X2N2X3Byb2dfY2NfcGljPSctS2NvbmZvcm1fcGljJworCWx0X2N2X3Byb2dfY2Nfc3RhdGljPSctQnN0YXRpYycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgKikKKyAgICAgIGx0X2N2X3Byb2dfY2NfY2FuX2J1aWxkX3NoYXJlZD1ubworICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisKK2ZpCisKK2lmIHRlc3QgLXogIiRsdF9jdl9wcm9nX2NjX3BpYyI7IHRoZW4KKyAgZWNobyAiJGFzX21lOjQ2ODM6IHJlc3VsdDogbm9uZSIgPiY1CitlY2hvICIke0VDSE9fVH1ub25lIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOjQ2ODY6IHJlc3VsdDogJGx0X2N2X3Byb2dfY2NfcGljIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsdF9jdl9wcm9nX2NjX3BpYyIgPiY2CisKKyAgIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIHBpY19mbGFnIGFjdHVhbGx5IHdvcmtzLgorICBlY2hvICIkYXNfbWU6NDY5MDogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9jdl9wcm9nX2NjX3BpYyB3b3JrcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkbHRfY3ZfcHJvZ19jY19waWMgd29ya3MuLi4gJEVDSE9fQyIgPiY2CisgIGlmIHRlc3QgIiR7bHRfY3ZfcHJvZ19jY19waWNfd29ya3Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgICAgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgIENGTEFHUz0iJENGTEFHUyAkbHRfY3ZfcHJvZ19jY19waWMgLURQSUMiCisgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisjbGluZSA0Njk4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6NDcxMDogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6NDcxMzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTo0NzE2OiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6NDcxOTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorCSMgT24gSFAtVVgsIGJvdGggQ0MgYW5kIEdDQyBvbmx5IHdhcm4gdGhhdCBQSUMgaXMgc3VwcG9ydGVkLi4uIHRoZW4KKwkjIHRoZXkgY3JlYXRlIG5vbi1QSUMgb2JqZWN0cy4gIFNvLCBpZiB0aGVyZSB3ZXJlIGFueSB3YXJuaW5ncywgd2UKKwkjIGFzc3VtZSB0aGF0IFBJQyBpcyBub3Qgc3VwcG9ydGVkLgorCWlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisJICBsdF9jdl9wcm9nX2NjX3BpY193b3Jrcz1ubworCWVsc2UKKwkgIGx0X2N2X3Byb2dfY2NfcGljX3dvcmtzPXllcworCWZpCisJOzsKKyAgICAgICopCisJbHRfY3ZfcHJvZ19jY19waWNfd29ya3M9eWVzCisJOzsKKyAgICAgIGVzYWMKKworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgICAgICBsdF9jdl9wcm9nX2NjX3BpY193b3Jrcz1ubworCitmaQorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCisKK2ZpCisKKyAgaWYgdGVzdCAiWCRsdF9jdl9wcm9nX2NjX3BpY193b3JrcyIgPSBYbm87IHRoZW4KKyAgICBsdF9jdl9wcm9nX2NjX3BpYz0KKyAgICBsdF9jdl9wcm9nX2NjX2Nhbl9idWlsZF9zaGFyZWQ9bm8KKyAgZWxzZQorICAgIGx0X2N2X3Byb2dfY2NfcGljPSIgJGx0X2N2X3Byb2dfY2NfcGljIgorICBmaQorCisgIGVjaG8gIiRhc19tZTo0NzU1OiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NjX3BpY193b3JrcyIgPiY1CitlY2hvICIke0VDSE9fVH0kbHRfY3ZfcHJvZ19jY19waWNfd29ya3MiID4mNgorZmkKKworIyBDaGVjayBmb3IgYW55IHNwZWNpYWwgc2hhcmVkIGxpYnJhcnkgY29tcGlsYXRpb24gZmxhZ3MuCitpZiB0ZXN0IC1uICIkbHRfY3ZfcHJvZ19jY19zaGxpYiI7IHRoZW4KKyAgeyBlY2hvICIkYXNfbWU6NDc2MTogV0FSTklORzogXGAkQ0MnIHJlcXVpcmVzIFxgJGx0X2N2X3Byb2dfY2Nfc2hsaWInIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiBcYCRDQycgcmVxdWlyZXMgXGAkbHRfY3ZfcHJvZ19jY19zaGxpYicgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcyIgPiYyO30KKyAgaWYgZWNobyAiJG9sZF9DQyAkb2xkX0NGTEFHUyAiIHwgZWdyZXAgLWUgIlsgCV0kbHRfY3ZfcHJvZ19jY19zaGxpYlsgCV0iID4vZGV2L251bGw7IHRoZW4gOgorICBlbHNlCisgICB7IGVjaG8gIiRhc19tZTo0NzY1OiBXQVJOSU5HOiBhZGQgXGAkbHRfY3ZfcHJvZ19jY19zaGxpYicgdG8gdGhlIENDIG9yIENGTEFHUyBlbnYgdmFyaWFibGUgYW5kIHJlY29uZmlndXJlIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogYWRkIFxgJGx0X2N2X3Byb2dfY2Nfc2hsaWInIHRvIHRoZSBDQyBvciBDRkxBR1MgZW52IHZhcmlhYmxlIGFuZCByZWNvbmZpZ3VyZSIgPiYyO30KKyAgICBsdF9jdl9wcm9nX2NjX2Nhbl9idWlsZF9zaGFyZWQ9bm8KKyAgZmkKK2ZpCisKK2VjaG8gIiRhc19tZTo0NzcxOiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X2N2X3Byb2dfY2Nfc3RhdGljIHdvcmtzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF9jdl9wcm9nX2NjX3N0YXRpYyB3b3Jrcy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7bHRfY3ZfcHJvZ19jY19zdGF0aWNfd29ya3Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgICBsdF9jdl9wcm9nX2NjX3N0YXRpY193b3Jrcz1ubworICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICBMREZMQUdTPSIkTERGTEFHUyAkbHRfY3ZfcHJvZ19jY19zdGF0aWMiCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorI2xpbmUgNDc4MCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTo0NzkyOiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTo0Nzk1OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKyAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6NDc5ODogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjQ4MDE6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBsdF9jdl9wcm9nX2NjX3N0YXRpY193b3Jrcz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK2NhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorZmkKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKKworZmkKKworIyBCZWx0ICphbmQqIGJyYWNlcyB0byBzdG9wIG15IHRyb3VzZXJzIGZhbGxpbmcgZG93bjoKK3Rlc3QgIlgkbHRfY3ZfcHJvZ19jY19zdGF0aWNfd29ya3MiID0gWG5vICYmIGx0X2N2X3Byb2dfY2Nfc3RhdGljPQorZWNobyAiJGFzX21lOjQ4MTU6IHJlc3VsdDogJGx0X2N2X3Byb2dfY2Nfc3RhdGljX3dvcmtzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsdF9jdl9wcm9nX2NjX3N0YXRpY193b3JrcyIgPiY2CisKK3BpY19mbGFnPSIkbHRfY3ZfcHJvZ19jY19waWMiCitzcGVjaWFsX3NobGliX2NvbXBpbGVfZmxhZ3M9IiRsdF9jdl9wcm9nX2NjX3NobGliIgord2w9IiRsdF9jdl9wcm9nX2NjX3dsIgorbGlua19zdGF0aWNfZmxhZz0iJGx0X2N2X3Byb2dfY2Nfc3RhdGljIgorbm9fYnVpbHRpbl9mbGFnPSIkbHRfY3ZfcHJvZ19jY19ub19idWlsdGluIgorY2FuX2J1aWxkX3NoYXJlZD0iJGx0X2N2X3Byb2dfY2NfY2FuX2J1aWxkX3NoYXJlZCIKKworIyBDaGVjayB0byBzZWUgaWYgb3B0aW9ucyAtbyBhbmQgLWMgYXJlIHNpbXVsdGFuZW91c2x5IHN1cHBvcnRlZCBieSBjb21waWxlcgorZWNobyAiJGFzX21lOjQ4MjY6IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0Li4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtsdF9jdl9jb21waWxlcl9jX28rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKworJHJtIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCitta2RpciBjb25mdGVzdAorY2QgY29uZnRlc3QKK2VjaG8gImludCBzb21lX3ZhcmlhYmxlID0gMDsiID4gY29uZnRlc3QuJGFjX2V4dAorbWtkaXIgb3V0CisjIEFjY29yZGluZyB0byBUb20gVHJvbWV5LCBJYW4gTGFuY2UgVGF5bG9yIHJlcG9ydGVkIHRoZXJlIGFyZSBDIGNvbXBpbGVycworIyB0aGF0IHdpbGwgY3JlYXRlIHRlbXBvcmFyeSBmaWxlcyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgcmVnYXJkbGVzcyBvZgorIyB0aGUgb3V0cHV0IGRpcmVjdG9yeS4gIFRodXMsIG1ha2luZyBDV0QgcmVhZC1vbmx5IHdpbGwgY2F1c2UgdGhpcyB0ZXN0CisjIHRvIGZhaWwsIGVuYWJsaW5nIGxvY2tpbmcgb3IgYXQgbGVhc3Qgd2FybmluZyB0aGUgdXNlciBub3QgdG8gZG8gcGFyYWxsZWwKKyMgYnVpbGRzLgorY2htb2QgLXcgLgorc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCitDRkxBR1M9IiRDRkxBR1MgLW8gb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0IgorY29tcGlsZXJfY19vPW5vCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ4NDY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+b3V0L2NvbmZ0ZXN0LmVycjsgfSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dDsgdGhlbgorICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgaWYgdGVzdCAtcyBvdXQvY29uZnRlc3QuZXJyOyB0aGVuCisgICAgbHRfY3ZfY29tcGlsZXJfY19vPW5vCisgIGVsc2UKKyAgICBsdF9jdl9jb21waWxlcl9jX289eWVzCisgIGZpCitlbHNlCisgICMgQXBwZW5kIGFueSBlcnJvcnMgdG8gdGhlIGNvbmZpZy5sb2cuCisgIGNhdCBvdXQvY29uZnRlc3QuZXJyIDE+JjUKKyAgbHRfY3ZfY29tcGlsZXJfY19vPW5vCitmaQorQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCitjaG1vZCB1K3cgLgorJHJtIGNvbmZ0ZXN0KiBvdXQvKgorcm1kaXIgb3V0CitjZCAuLgorcm1kaXIgY29uZnRlc3QKKyRybSAtciBjb25mdGVzdCAyPi9kZXYvbnVsbAorCitmaQorCitjb21waWxlcl9jX289JGx0X2N2X2NvbXBpbGVyX2NfbworZWNobyAiJGFzX21lOjQ4NzA6IHJlc3VsdDogJGNvbXBpbGVyX2NfbyIgPiY1CitlY2hvICIke0VDSE9fVH0kY29tcGlsZXJfY19vIiA+JjYKKworaWYgdGVzdCB4IiRjb21waWxlcl9jX28iID0geCJ5ZXMiOyB0aGVuCisgICMgQ2hlY2sgdG8gc2VlIGlmIHdlIGNhbiB3cml0ZSB0byBhIC5sbworICBlY2hvICIkYXNfbWU6NDg3NTogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUubG8iID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS5sby4uLiAkRUNIT19DIiA+JjYKKyAgaWYgdGVzdCAiJHtsdF9jdl9jb21waWxlcl9vX2xvK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisKKyAgbHRfY3ZfY29tcGlsZXJfb19sbz1ubworICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgQ0ZMQUdTPSIkQ0ZMQUdTIC1jIC1vIGNvbmZ0ZXN0LmxvIgorICBzYXZlX29iamV4dD0iJGFjX29iamV4dCIKKyAgYWNfb2JqZXh0PWxvCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorI2xpbmUgNDg4NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludAorbWFpbiAoKQoreworaW50IHNvbWVfdmFyaWFibGUgPSAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTo0ODk5OiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTo0OTAyOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKyAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOjQ5MDU6IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTo0OTA4OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgIGx0X2N2X2NvbXBpbGVyX29fbG89bm8KKyAgICBlbHNlCisgICAgICBsdF9jdl9jb21waWxlcl9vX2xvPXllcworICAgIGZpCisKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK2NhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorZmkKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBhY19vYmpleHQ9IiRzYXZlX29iamV4dCIKKyAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCisKK2ZpCisKKyAgY29tcGlsZXJfb19sbz0kbHRfY3ZfY29tcGlsZXJfb19sbworICBlY2hvICIkYXNfbWU6NDkyOTogcmVzdWx0OiAkY29tcGlsZXJfb19sbyIgPiY1CitlY2hvICIke0VDSE9fVH0kY29tcGlsZXJfb19sbyIgPiY2CitlbHNlCisgIGNvbXBpbGVyX29fbG89bm8KK2ZpCisKKyMgQ2hlY2sgdG8gc2VlIGlmIHdlIGNhbiBkbyBoYXJkIGxpbmtzIHRvIGxvY2sgc29tZSBmaWxlcyBpZiBuZWVkZWQKK2hhcmRfbGlua3M9Im5vdHRlc3RlZCIKK2lmIHRlc3QgIiRjb21waWxlcl9jX28iID0gbm8gJiYgdGVzdCAiJG5lZWRfbG9ja3MiICE9IG5vOyB0aGVuCisgICMgZG8gbm90IG92ZXJ3cml0ZSB0aGUgdmFsdWUgb2YgbmVlZF9sb2NrcyBwcm92aWRlZCBieSB0aGUgdXNlcgorICBlY2hvICIkYXNfbWU6NDkzOTogY2hlY2tpbmcgaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzLi4uICRFQ0hPX0MiID4mNgorICBoYXJkX2xpbmtzPXllcworICAkcm0gY29uZnRlc3QqCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCisgIHRvdWNoIGNvbmZ0ZXN0LmEKKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+JjUgfHwgaGFyZF9saW5rcz1ubworICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubworICBlY2hvICIkYXNfbWU6NDk0NzogcmVzdWx0OiAkaGFyZF9saW5rcyIgPiY1CitlY2hvICIke0VDSE9fVH0kaGFyZF9saW5rcyIgPiY2CisgIGlmIHRlc3QgIiRoYXJkX2xpbmtzIiA9IG5vOyB0aGVuCisgICAgeyBlY2hvICIkYXNfbWU6NDk1MDogV0FSTklORzogXGAkQ0MnIGRvZXMgbm90IHN1cHBvcnQgXGAtYyAtbycsIHNvIFxgbWFrZSAtaicgbWF5IGJlIHVuc2FmZSIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6IFxgJENDJyBkb2VzIG5vdCBzdXBwb3J0IFxgLWMgLW8nLCBzbyBcYG1ha2UgLWonIG1heSBiZSB1bnNhZmUiID4mMjt9CisgICAgbmVlZF9sb2Nrcz13YXJuCisgIGZpCitlbHNlCisgIG5lZWRfbG9ja3M9bm8KK2ZpCisKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICMgQ2hlY2sgdG8gc2VlIGlmIG9wdGlvbnMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyBhcmUgc3VwcG9ydGVkIGJ5IGNvbXBpbGVyCisgIGVjaG8gIiRhc19tZTo0OTYwOiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zLi4uICRFQ0hPX0MiID4mNgorICBlY2hvICJpbnQgc29tZV92YXJpYWJsZSA9IDA7IiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgIENGTEFHUz0iJENGTEFHUyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIC1jIGNvbmZ0ZXN0LiRhY19leHQiCisgIGNvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucz1ubworICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyNsaW5lIDQ5NjcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQKK21haW4gKCkKK3sKK2ludCBzb21lX3ZhcmlhYmxlID0gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6NDk3OTogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6NDk4MjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTo0OTg1OiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6NDk4ODogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncworICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgICBjb21waWxlcl9ydHRpX2V4Y2VwdGlvbnM9bm8KKyAgICBlbHNlCisgICAgICBjb21waWxlcl9ydHRpX2V4Y2VwdGlvbnM9eWVzCisgICAgZmkKKworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CitmaQorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorICBlY2hvICIkYXNfbWU6NTAwNDogcmVzdWx0OiAkY29tcGlsZXJfcnR0aV9leGNlcHRpb25zIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRjb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID4mNgorCisgIGlmIHRlc3QgIiRjb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID0gInllcyI7IHRoZW4KKyAgICBub19idWlsdGluX2ZsYWc9JyAtZm5vLWJ1aWx0aW4gLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucycKKyAgZWxzZQorICAgIG5vX2J1aWx0aW5fZmxhZz0nIC1mbm8tYnVpbHRpbicKKyAgZmkKK2ZpCisKKyMgU2VlIGlmIHRoZSBsaW5rZXIgc3VwcG9ydHMgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KK2VjaG8gIiRhc19tZTo1MDE1OiBjaGVja2luZyB3aGV0aGVyIHRoZSBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgdGhlIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLi4uICRFQ0hPX0MiID4mNgorCithbGxvd191bmRlZmluZWRfZmxhZz0KK25vX3VuZGVmaW5lZF9mbGFnPQorbmVlZF9saWJfcHJlZml4PXVua25vd24KK25lZWRfdmVyc2lvbj11bmtub3duCisjIHdoZW4geW91IHNldCBuZWVkX3ZlcnNpb24gdG8gbm8sIG1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBjYXVzZSAtc2V0X3ZlcnNpb24KKyMgZmxhZ3MgdG8gYmUgbGVmdCB3aXRob3V0IGFyZ3VtZW50cworYXJjaGl2ZV9jbWRzPQorYXJjaGl2ZV9leHBzeW1fY21kcz0KK29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9CitvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0KK2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0KK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjPQordGhyZWFkX3NhZmVfZmxhZ19zcGVjPQoraGFyZGNvZGVfaW50b19saWJzPW5vCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPQoraGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0KK2hhcmRjb2RlX2RpcmVjdD1ubworaGFyZGNvZGVfbWludXNfTD1ubworaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj11bnN1cHBvcnRlZAorcnVucGF0aF92YXI9CitsaW5rX2FsbF9kZXBsaWJzPXVua25vd24KK2Fsd2F5c19leHBvcnRfc3ltYm9scz1ubworZXhwb3J0X3N5bWJvbHNfY21kcz0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCBzZWQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisjIGluY2x1ZGVfZXhwc3ltcyBzaG91bGQgYmUgYSBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBzeW1ib2xzIHRvIGJlICphbHdheXMqCisjIGluY2x1ZGVkIGluIHRoZSBzeW1ib2wgbGlzdAoraW5jbHVkZV9leHBzeW1zPQorIyBleGNsdWRlX2V4cHN5bXMgY2FuIGJlIGFuIGVncmVwIHJlZ3VsYXIgZXhwcmVzc2lvbiBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUKKyMgaXQgd2lsbCBiZSB3cmFwcGVkIGJ5IGAgKCcgYW5kIGApJCcsIHNvIG9uZSBtdXN0IG5vdCBtYXRjaCBiZWdpbm5pbmcgb3IKKyMgZW5kIG9mIGxpbmUuICBFeGFtcGxlOiBgYXxiY3wuKmQuKicgd2lsbCBleGNsdWRlIHRoZSBzeW1ib2xzIGBhJyBhbmQgYGJjJywKKyMgYXMgd2VsbCBhcyBhbnkgc3ltYm9sIHRoYXQgY29udGFpbnMgYGQnLgorZXhjbHVkZV9leHBzeW1zPSJfR0xPQkFMX09GRlNFVF9UQUJMRV8iCisjIEFsdGhvdWdoIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBpcyBhIHZhbGlkIHN5bWJvbCBDIG5hbWUsIG1vc3QgYS5vdXQKKyMgcGxhdGZvcm1zIChhYil1c2UgaXQgaW4gUElDIGNvZGUsIGJ1dCB0aGVpciBsaW5rZXJzIGdldCBjb25mdXNlZCBpZgorIyB0aGUgc3ltYm9sIGlzIGV4cGxpY2l0bHkgcmVmZXJlbmNlZC4gIFNpbmNlIHBvcnRhYmxlIGNvZGUgY2Fubm90CisjIHJlbHkgb24gdGhpcyBzeW1ib2wgbmFtZSwgaXQncyBwcm9iYWJseSBmaW5lIHRvIG5ldmVyIGluY2x1ZGUgaXQgaW4KKyMgcHJlbG9hZGVkIHN5bWJvbCB0YWJsZXMuCitleHRyYWN0X2V4cHN5bXNfY21kcz0KKworY2FzZSAkaG9zdF9vcyBpbgorY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorICAjIEZJWE1FOiB0aGUgTVNWQysrIHBvcnQgaGFzbid0IGJlZW4gdGVzdGVkIGluIGEgbG9vb29uZyB0aW1lCisgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCisgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCisgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgorICAgIHdpdGhfZ251X2xkPW5vCisgIGZpCisgIDs7CitvcGVuYnNkKikKKyAgd2l0aF9nbnVfbGQ9bm8KKyAgOzsKK2VzYWMKKworbGRfc2hsaWJzPXllcworaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAjIElmIGFyY2hpdmVfY21kcyBydW5zIExELCBub3QgQ0MsIHdsYXJjIHNob3VsZCBiZSBlbXB0eQorICB3bGFyYz0nJHt3bH0nCisKKyAgIyBTZWUgaWYgR05VIGxkIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4MyogfCBhaXg0KiB8IGFpeDUqKQorICAgICMgT24gQUlYLCB0aGUgR05VIGxpbmtlciBpcyB2ZXJ5IGJyb2tlbgorICAgICMgTm90ZTpDaGVjayBHTlUgbGlua2VyIG9uIEFJWCA1LUlBNjQgd2hlbi9pZiBpdCBiZWNvbWVzIGF2YWlsYWJsZS4KKyAgICBsZF9zaGxpYnM9bm8KKyAgICBjYXQgPDxFT0YgMT4mMgorCisqKiogV2FybmluZzogdGhlIEdOVSBsaW5rZXIsIGF0IGxlYXN0IHVwIHRvIHJlbGVhc2UgMi45LjEsIGlzIHJlcG9ydGVkCisqKiogdG8gYmUgdW5hYmxlIHRvIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIEFJWC4KKyoqKiBUaGVyZWZvcmUsIGxpYnRvb2wgaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIElmIHlvdQorKioqIHJlYWxseSBjYXJlIGZvciBzaGFyZWQgbGlicmFyaWVzLCB5b3UgbWF5IHdhbnQgdG8gbW9kaWZ5IHlvdXIgUEFUSAorKioqIHNvIHRoYXQgYSBub24tR05VIGxpbmtlciBpcyBmb3VuZCwgYW5kIHRoZW4gcmVzdGFydC4KKworRU9GCisgICAgOzsKKworICBhbWlnYW9zKikKKyAgICBhcmNoaXZlX2NtZHM9JyRybSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisKKyAgICAjIFNhbXVlbCBBLiBGYWx2byBJSSA8a2M1dGphQGRvbHBoaW4ub3BlbnByb2plY3RzLm5ldD4gcmVwb3J0cworICAgICMgdGhhdCB0aGUgc2VtYW50aWNzIG9mIGR5bmFtaWMgbGlicmFyaWVzIG9uIEFtaWdhT1MsIGF0IGxlYXN0IHVwCisgICAgIyB0byB2ZXJzaW9uIDQsIGlzIHRvIHNoYXJlIGRhdGEgYW1vbmcgbXVsdGlwbGUgcHJvZ3JhbXMgbGlua2VkCisgICAgIyB3aXRoIHRoZSBzYW1lIGR5bmFtaWMgbGlicmFyeS4gIFNpbmNlIHRoaXMgZG9lc24ndCBtYXRjaCB0aGUKKyAgICAjIGJlaGF2aW9yIG9mIHNoYXJlZCBsaWJyYXJpZXMgb24gb3RoZXIgcGxhdGZvcm1zLCB3ZSBjYW4gdXNlCisgICAgIyB0aGVtLgorICAgIGxkX3NobGlicz1ubworICAgIDs7CisKKyAgYmVvcyopCisgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZWdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKKyAgICAgICMgSm9zZXBoIEJlY2tlbmJhY2ggPGpyYjNAYmVzdC5jb20+IHNheXMgc29tZSByZWxlYXNlcyBvZiBnY2MKKyAgICAgICMgc3VwcG9ydCAtLXVuZGVmaW5lZC4gIFRoaXMgZGVzZXJ2ZXMgc29tZSBpbnZlc3RpZ2F0aW9uLiAgRklYTUUKKyAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1ub3N0YXJ0ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgIGVsc2UKKyAgICAgIGxkX3NobGlicz1ubworICAgIGZpCisgICAgOzsKKworICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgICAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcworICAgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCisgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPXllcworCisgICAgZXh0cmFjdF9leHBzeW1zX2NtZHM9J3Rlc3QgLWYgJG91dHB1dF9vYmpkaXIvaW1wZ2VuLmMgfHwgXAorICAgICAgc2VkIC1lICIvXiMgXC9cKiBpbXBnZW5cLmMgc3RhcnRzIGhlcmUgXCpcLy8sL14jIFwvXCogaW1wZ2VuLmMgZW5kcyBoZXJlIFwqXC8vIHsgcy9eIyAvLztzL14jICokLy87IHA7IH0iIC1lIGQgPCAkJycwID4gJG91dHB1dF9vYmpkaXIvaW1wZ2VuLmN+CisgICAgICB0ZXN0IC1mICRvdXRwdXRfb2JqZGlyL2ltcGdlbi5leGUgfHwgKGNkICRvdXRwdXRfb2JqZGlyICYmIFwKKyAgICAgIGlmIHRlc3QgIngkSE9TVF9DQyIgIT0gIngiIDsgdGhlbiAkSE9TVF9DQyAtbyBpbXBnZW4gaW1wZ2VuLmMgOyBcCisgICAgICBlbHNlICRDQyAtbyBpbXBnZW4gaW1wZ2VuLmMgOyBmaSl+CisgICAgICAkb3V0cHV0X29iamRpci9pbXBnZW4gJGRpci8kc29yb290ID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1kZWYnCisKKyAgICBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0nJERMTFRPT0wgLS1hcz0kQVMgLS1kbGxuYW1lICRzb25hbWUgLS1kZWYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1kZWYgLS1vdXRwdXQtbGliICRvdXRwdXRfb2JqZGlyLyRuZXdsaWInCisKKyAgICAjIGN5Z3dpbiBhbmQgbWluZ3cgZGxscyBoYXZlIGRpZmZlcmVudCBlbnRyeSBwb2ludHMgYW5kIHNldHMgb2Ygc3ltYm9scworICAgICMgdG8gZXhjbHVkZS4KKyAgICAjIEZJWE1FOiB3aGF0IGFib3V0IHZhbHVlcyBmb3IgTVNWQz8KKyAgICBkbGxfZW50cnk9X19jeWd3aW5fZGxsX2VudHJ5QDEyCisgICAgZGxsX2V4Y2x1ZGVfc3ltYm9scz1EbGxNYWluQDEyLF9jeWd3aW5fZGxsX2VudHJ5QDEyLF9jeWd3aW5fbm9uY3lnd2luX2RsbF9lbnRyeUAxMn4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgbWluZ3cqKQorICAgICAgIyBtaW5ndyB2YWx1ZXMKKyAgICAgIGRsbF9lbnRyeT1fRGxsTWFpbkNSVFN0YXJ0dXBAMTIKKyAgICAgIGRsbF9leGNsdWRlX3N5bWJvbHM9RGxsTWFpbkAxMixEbGxNYWluQ1JUU3RhcnR1cEAxMixEbGxFbnRyeVBvaW50QDEyfgorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIG1pbmd3IGFuZCBjeWd3aW4gZGlmZmVyLCBhbmQgaXQncyBzaW1wbGVzdCB0byBqdXN0IGV4Y2x1ZGUgdGhlIHVuaW9uCisgICAgIyBvZiB0aGUgdHdvIHN5bWJvbCBzZXRzLgorICAgIGRsbF9leGNsdWRlX3N5bWJvbHM9RGxsTWFpbkAxMixfY3lnd2luX2RsbF9lbnRyeUAxMixfY3lnd2luX25vbmN5Z3dpbl9kbGxfZW50cnlAMTIsRGxsTWFpbkNSVFN0YXJ0dXBAMTIsRGxsRW50cnlQb2ludEAxMgorCisgICAgIyByZWNlbnQgY3lnd2luIGFuZCBtaW5ndyBzeXN0ZW1zIHN1cHBseSBhIHN0dWIgRGxsTWFpbiB3aGljaCB0aGUgdXNlcgorICAgICMgY2FuIG92ZXJyaWRlLCBidXQgb24gb2xkZXIgc3lzdGVtcyB3ZSBoYXZlIHRvIHN1cHBseSBvbmUgKGluIGx0ZGxsLmMpCisgICAgaWYgdGVzdCAieCRsdF9jdl9uZWVkX2RsbG1haW4iID0gInh5ZXMiOyB0aGVuCisgICAgICBsdGRsbF9vYmo9JyRvdXRwdXRfb2JqZGlyLyRzb25hbWUtbHRkbGwuJyIkYWNfb2JqZXh0ICIKKyAgICAgIGx0ZGxsX2NtZHM9J3Rlc3QgLWYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1sdGRsbC5jIHx8IHNlZCAtZSAiL14jIFwvXCogbHRkbGxcLmMgc3RhcnRzIGhlcmUgXCpcLy8sL14jIFwvXCogbHRkbGwuYyBlbmRzIGhlcmUgXCpcLy8geyBzL14jIC8vOyBwOyB9IiAtZSBkIDwgJCcnMCA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUtbHRkbGwuY34KKwl0ZXN0IC1mICRvdXRwdXRfb2JqZGlyLyRzb25hbWUtbHRkbGwuJGFjX29iamV4dCB8fCAoY2QgJG91dHB1dF9vYmpkaXIgJiYgJENDIC1jICRzb25hbWUtbHRkbGwuYyl+JworICAgIGVsc2UKKyAgICAgIGx0ZGxsX29iaj0KKyAgICAgIGx0ZGxsX2NtZHM9CisgICAgZmkKKworICAgICMgRXh0cmFjdCB0aGUgc3ltYm9sIGV4cG9ydCBsaXN0IGZyb20gYW4gYC0tZXhwb3J0LWFsbCcgZGVmIGZpbGUsCisgICAgIyB0aGVuIHJlZ2VuZXJhdGUgdGhlIGRlZiBmaWxlIGZyb20gdGhlIHN5bWJvbCBleHBvcnQgbGlzdCwgc28gdGhhdAorICAgICMgdGhlIGNvbXBpbGVkIGRsbCBvbmx5IGV4cG9ydHMgdGhlIHN5bWJvbCBleHBvcnQgbGlzdC4KKyAgICAjIEJlIGNhcmVmdWwgbm90IHRvIHN0cmlwIHRoZSBEQVRBIHRhZyBsZWZ0IGJlIG5ld2VyIGRsbHRvb2xzLgorICAgIGV4cG9ydF9zeW1ib2xzX2NtZHM9IiRsdGRsbF9jbWRzIicKKyAgICAgICRETExUT09MIC0tZXhwb3J0LWFsbCAtLWV4Y2x1ZGUtc3ltYm9scyAnJGRsbF9leGNsdWRlX3N5bWJvbHMnIC0tb3V0cHV0LWRlZiAkb3V0cHV0X29iamRpci8kc29uYW1lLWRlZiAnJGx0ZGxsX29iaickbGlib2JqcyAkY29udmVuaWVuY2V+CisgICAgICBzZWQgLWUgIjEsL0VYUE9SVFMvZCIgLWUgInMvIEAgWzAtOV0qLy8iIC1lICJzLyAqOy4qJC8vIiA8ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUtZGVmID4gJGV4cG9ydF9zeW1ib2xzJworCisgICAgIyBJZiB0aGUgZXhwb3J0LXN5bWJvbHMgZmlsZSBhbHJlYWR5IGlzIGEgLmRlZiBmaWxlICgxc3QgbGluZQorICAgICMgaXMgRVhQT1JUUyksIHVzZSBpdCBhcyBpcy4KKyAgICAjIElmIERBVEEgdGFncyBmcm9tIGEgcmVjZW50IGRsbHRvb2wgYXJlIHByZXNlbnQsIGhvbm91ciB0aGVtIQorICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9J2lmIHRlc3QgInhgaGVhZCAtMSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCisJY3AgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRzb25hbWUtZGVmOworICAgICAgZWxzZQorCWVjaG8gRVhQT1JUUyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUtZGVmOworCV9sdF9oaW50PTE7CisJY2F0ICRleHBvcnRfc3ltYm9scyB8IHdoaWxlIHJlYWQgc3ltYm9sOyBkbworCSBzZXQgZHVtbXkgXCRzeW1ib2w7CisJIGNhc2UgXCQjIGluCisJICAgMikgZWNobyAiICAgXCQyIEAgXCRfbHRfaGludCA7ICIgPj4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1kZWY7OworCSAgICopIGVjaG8gIiAgICAgXCQyIEAgXCRfbHRfaGludCBcJDMgOyAiID4+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUtZGVmOzsKKwkgZXNhYzsKKwkgX2x0X2hpbnQ9YGV4cHIgMSArIFwkX2x0X2hpbnRgOworCWRvbmU7CisgICAgICBmaX4KKyAgICAgICciJGx0ZGxsX2NtZHMiJworICAgICAgJENDIC1XbCwtLWJhc2UtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLWJhc2UgJyRsdF9jdl9jY19kbGxfc3dpdGNoJyAtV2wsLWUsJyRkbGxfZW50cnknIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJyRsdGRsbF9vYmonJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfgorICAgICAgJERMTFRPT0wgLS1hcz0kQVMgLS1kbGxuYW1lICRzb25hbWUgLS1leGNsdWRlLXN5bWJvbHMgJyRkbGxfZXhjbHVkZV9zeW1ib2xzJyAtLWRlZiAkb3V0cHV0X29iamRpci8kc29uYW1lLWRlZiAtLWJhc2UtZmlsZSAkb3V0cHV0X29iamRpci8kc29uYW1lLWJhc2UgLS1vdXRwdXQtZXhwICRvdXRwdXRfb2JqZGlyLyRzb25hbWUtZXhwfgorICAgICAgJENDIC1XbCwtLWJhc2UtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLWJhc2UgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1leHAgJyRsdF9jdl9jY19kbGxfc3dpdGNoJyAtV2wsLWUsJyRkbGxfZW50cnknIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJyRsdGRsbF9vYmonJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfgorICAgICAgJERMTFRPT0wgLS1hcz0kQVMgLS1kbGxuYW1lICRzb25hbWUgLS1leGNsdWRlLXN5bWJvbHMgJyRkbGxfZXhjbHVkZV9zeW1ib2xzJyAtLWRlZiAkb3V0cHV0X29iamRpci8kc29uYW1lLWRlZiAtLWJhc2UtZmlsZSAkb3V0cHV0X29iamRpci8kc29uYW1lLWJhc2UgLS1vdXRwdXQtZXhwICRvdXRwdXRfb2JqZGlyLyRzb25hbWUtZXhwIC0tb3V0cHV0LWxpYiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kbGwuYX4KKyAgICAgICRDQyAkb3V0cHV0X29iamRpci8kc29uYW1lLWV4cCAnJGx0X2N2X2NjX2RsbF9zd2l0Y2gnIC1XbCwtZSwnJGRsbF9lbnRyeScgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAnJGx0ZGxsX29iaickbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgOzsKKworICBuZXRic2QqKQorICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLW8gJGxpYicKKyAgICAgIHdsYXJjPQorICAgIGVsc2UKKyAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgLW5vZGVmYXVsdGxpYnMgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAtbm9kZWZhdWx0bGlicyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICBmaQorICAgIDs7CisKKyAgc29sYXJpcyogfCBzeXN2NSopCisgICAgaWYgJExEIC12IDI+JjEgfCBlZ3JlcCAnQkZEIDJcLjgnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICBsZF9zaGxpYnM9bm8KKyAgICAgIGNhdCA8PEVPRiAxPiYyCisKKyoqKiBXYXJuaW5nOiBUaGUgcmVsZWFzZXMgMi44Liogb2YgdGhlIEdOVSBsaW5rZXIgY2Fubm90IHJlbGlhYmx5CisqKiogY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gU29sYXJpcyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCisqKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCisqKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjkuMSBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQorKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKKyoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgorCitFT0YKKyAgICBlbGlmICRMRCAtLWhlbHAgMj4mMSB8IGVncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICBlbHNlCisgICAgICBsZF9zaGxpYnM9bm8KKyAgICBmaQorICAgIDs7CisKKyAgc3Vub3M0KikKKyAgICBhcmNoaXZlX2NtZHM9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgd2xhcmM9CisgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICA7OworCisgICopCisgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZWdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgIGVsc2UKKyAgICAgIGxkX3NobGlicz1ubworICAgIGZpCisgICAgOzsKKyAgZXNhYworCisgIGlmIHRlc3QgIiRsZF9zaGxpYnMiID0geWVzOyB0aGVuCisgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS0tcnBhdGggJHt3bH0kbGliZGlyJworICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgICAgICAjIGRsbHRvb2wgZG9lc24ndCB1bmRlcnN0YW5kIC0td2hvbGUtYXJjaGl2ZSBldC4gYWwuCisgICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0KKyAgICAgIDs7CisgICAgKikKKyAgICAgICMgYW5jaWVudCBHTlUgbGQgZGlkbid0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlIGV0LiBhbC4KKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGVncmVwICduby13aG9sZS1hcmNoaXZlJyA+IC9kZXYvbnVsbDsgdGhlbgorCXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJworICAgICAgZWxzZQorCXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPQorICAgICAgZmkKKyAgICAgIDs7CisgICAgZXNhYworICBmaQorZWxzZQorICAjIFBPUlRNRSBmaWxsIGluIGEgZGVzY3JpcHRpb24gb2YgeW91ciBzeXN0ZW0ncyBsaW5rZXIgKG5vdCBHTlUgbGQpCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4MyopCisgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKKyAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9eWVzCisgICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJExEIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtYkU6JGV4cG9ydF9zeW1ib2xzIC1UNTEyIC1INTEyIC1iTTpTUkV+JEFSICRBUl9GTEFHUyAkbGliICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCisgICAgIyBOb3RlOiB0aGlzIGxpbmtlciBoYXJkY29kZXMgdGhlIGRpcmVjdG9yaWVzIGluIExJQlBBVEggaWYgdGhlcmUKKyAgICAjIGFyZSBubyBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgLUwuCisgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAmJiB0ZXN0IC16ICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KKyAgICAgICMgTmVpdGhlciBkaXJlY3QgaGFyZGNvZGluZyBub3Igc3RhdGljIGxpbmtpbmcgaXMgc3VwcG9ydGVkIHdpdGggYQorICAgICAgIyBicm9rZW4gY29sbGVjdDIuCisgICAgICBoYXJkY29kZV9kaXJlY3Q9dW5zdXBwb3J0ZWQKKyAgICBmaQorICAgIDs7CisKKyAgYWl4NCogfCBhaXg1KikKKyAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgICAgIyBPbiBJQTY0LCB0aGUgbGlua2VyIGRvZXMgcnVuIHRpbWUgbGlua2luZyBieSBkZWZhdWx0LCBzbyB3ZSBkb24ndAorICAgICAgIyBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCisgICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisgICAgICBleHBfc3ltX2ZsYWc9Jy1CZXhwb3J0JworICAgICAgbm9fZW50cnlfZmxhZz0iIgorICAgIGVsc2UKKyAgICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKworICAgICAgIyBUZXN0IGlmIHdlIGFyZSB0cnlpbmcgdG8gdXNlIHJ1biB0aW1lIGxpbmtpbmcgb3Igbm9ybWFsCisgICAgICAjIEFJWCBzdHlsZSBsaW5raW5nLiBJZiAtYnJ0bCBpcyBzb21ld2hlcmUgaW4gTERGTEFHUywgd2UKKyAgICAgICMgbmVlZCB0byBkbyBydW50aW1lIGxpbmtpbmcuCisgICAgICBjYXNlICRob3N0X29zIGluIGFpeDQuWzIzXXxhaXg0LlsyM10uKnxhaXg1KikKKwlmb3IgbGRfZmxhZyBpbiAkTERGTEFHUzsgZG8KKwkgIGlmICh0ZXN0ICRsZF9mbGFnID0gIi1icnRsIiB8fCB0ZXN0ICRsZF9mbGFnID0gIi1XbCwtYnJ0bCIpOyB0aGVuCisJICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9eWVzCisJICAgIGJyZWFrCisJICBmaQorCWRvbmUKKyAgICAgIGVzYWMKKworICAgICAgZXhwX3N5bV9mbGFnPSctYmV4cG9ydCcKKyAgICAgIG5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKKyAgICBmaQorCisgICAgIyBXaGVuIGxhcmdlIGV4ZWN1dGFibGVzIG9yIHNoYXJlZCBvYmplY3RzIGFyZSBidWlsdCwgQUlYIGxkIGNhbgorICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQorICAgICMgb3IgcHJvZ3JhbSByZXN1bHRzIGluICJlcnJvciBUT0Mgb3ZlcmZsb3ciIGFkZCAtbW1pbmltYWwtdG9jIHRvCisgICAgIyBDWFhGTEFHUy9DRkxBR1MgZm9yIGcrKy9nY2MuICBJbiB0aGUgY2FzZXMgd2hlcmUgdGhhdCBpcyBub3QKKyAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KKworICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICBhcmNoaXZlX2NtZHM9JycKKyAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSc6JworICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgICBjYXNlICRob3N0X29zIGluIGFpeDQuWzAxMl18YWl4NC5bMDEyXS4qKQorCWNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKKwlpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJiBcCisJICBzdHJpbmdzICIkY29sbGVjdDJuYW1lIiB8IGdyZXAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCisJdGhlbgorCSAgIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCisJICBoYXJkY29kZV9kaXJlY3Q9eWVzCisJZWxzZQorCSAgIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgorCSAgaGFyZGNvZGVfZGlyZWN0PXVuc3VwcG9ydGVkCisJICAjIEl0IGZhaWxzIHRvIGZpbmQgdW5pbnN0YWxsZWQgbGlicmFyaWVzIHdoZW4gdGhlIHVuaW5zdGFsbGVkCisJICAjIHBhdGggaXMgbm90IGxpc3RlZCBpbiB0aGUgbGlicGF0aC4gIFNldHRpbmcgaGFyZGNvZGVfbWludXNfTAorCSAgIyB0byB1bnN1cHBvcnRlZCBmb3JjZXMgcmVsaW5raW5nCisJICBoYXJkY29kZV9taW51c19MPXllcworCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworCSAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0KKwlmaQorICAgICAgZXNhYworCisgICAgICBzaGFyZWRfZmxhZz0nLXNoYXJlZCcKKyAgICBlbHNlCisgICAgICAjIG5vdCB1c2luZyBnY2MKKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJc2hhcmVkX2ZsYWc9JyR7d2x9LUcnCisgICAgICBlbHNlCisJaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICBzaGFyZWRfZmxhZz0nJHt3bH0tRycKKwllbHNlCisJICBzaGFyZWRfZmxhZz0nJHt3bH0tYk06U1JFJworCWZpCisgICAgICBmaQorICAgIGZpCisKKyAgICAjIEl0IHNlZW1zIHRoYXQgLWJleHBhbGwgY2FuIGRvIHN0cmFuZ2UgdGhpbmdzLCBzbyBpdCBpcyBiZXR0ZXIgdG8KKyAgICAjIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvIGV4cG9ydC4KKyAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9eWVzCisgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisgICAgICAjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW50aW1lIGxvYWRpbmcgZmxhZ3MgKC1icnRsKSwKKyAgICAgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPSctYmVyb2snCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ibGlicGF0aDokbGliZGlyOi91c3IvbGliOi9saWInCisgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSJcJENDIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgYGlmIHRlc3QgIngke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgIT0gIngiOyB0aGVuIGVjaG8gIiR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30iOyBlbHNlIDo7IGZpYCAnIlwke3dsfSRub19lbnRyeV9mbGFnIFwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyAkc2hhcmVkX2ZsYWciCisgICAgZWxzZQorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1SICRsaWJkaXI6L3Vzci9saWI6L2xpYicKKwlhbGxvd191bmRlZmluZWRfZmxhZz0iLXogbm9kZWZzIgorCWFyY2hpdmVfZXhwc3ltX2NtZHM9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS1oJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAnIlwke3dsfSRub19lbnRyeV9mbGFnIFwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyIKKyAgICAgIGVsc2UKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ibm9saWJwYXRoICR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6L3Vzci9saWI6L2xpYicKKwkjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW4gdGltZSBsb2FkaW5nIGZsYWdzLAorCSMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKwlhbGxvd191bmRlZmluZWRfZmxhZz0nJHt3bH0tYmVyb2snCisJIyBUaGlzIGlzIGEgYml0IHN0cmFuZ2UsIGJ1dCBpcyBzaW1pbGFyIHRvIGhvdyBBSVggdHJhZGl0aW9uYWxseSBidWlsZHMKKwkjIGl0J3Mgc2hhcmVkIGxpYnJhcmllcy4KKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICciXCR7d2x9JG5vX2VudHJ5X2ZsYWcgXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzIicgfiRBUiAtY3JsbyAkb2JqZGlyLyRsaWJuYW1lJHJlbGVhc2UuYSAkb2JqZGlyLyRzb25hbWUnCisgICAgICBmaQorICAgIGZpCisgICAgOzsKKworICBhbWlnYW9zKikKKyAgICBhcmNoaXZlX2NtZHM9JyRybSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgIyBzZWUgY29tbWVudCBhYm91dCBkaWZmZXJlbnQgc2VtYW50aWNzIG9uIHRoZSBHTlUgbGQgc2VjdGlvbgorICAgIGxkX3NobGlicz1ubworICAgIDs7CisKKyAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCisgICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KKyAgICAjIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsIGFzIHRoZXJlIGlzCisgICAgIyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScgJworICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCisgICAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5saWIgZmlsZXMsIG5vdCAuYSBmaWxlcy4KKyAgICBsaWJleHQ9bGliCisgICAgIyBGSVhNRTogU2V0dGluZyBsaW5rbmFtZXMgaGVyZSBpcyBhIGJhZCBoYWNrLgorICAgIGFyY2hpdmVfY21kcz0nJENDIC1vICRsaWIgJGxpYm9ianMgJGNvbXBpbGVyX2ZsYWdzIGBlY2hvICIkZGVwbGlicyIgfCBzZWQgLWUgJ1wnJ3MvIC1sYyQvLydcJydgIC1saW5rIC1kbGx+bGlua25hbWVzPScKKyAgICAjIFRoZSBsaW5rZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGJ1aWxkIGEgLmxpYiBmaWxlIGlmIHdlIGJ1aWxkIGEgRExMLgorICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9J3RydWUnCisgICAgIyBGSVhNRTogU2hvdWxkIGxldCB0aGUgdXNlciBzcGVjaWZ5IHRoZSBsaWIgcHJvZ3JhbS4KKyAgICBvbGRfYXJjaGl2ZV9jbWRzPSdsaWIgL09VVDokb2xkbGliJG9sZG9ianMkb2xkX2RlcGxpYnMnCisgICAgZml4X3NyY2ZpbGVfcGF0aD0nYGN5Z3BhdGggLXcgIiRzcmNmaWxlImAnCisgICAgOzsKKworICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgIGNhc2UgIiRob3N0X29zIiBpbgorICAgIHJoYXBzb2R5KiB8IGRhcndpbjEuWzAxMl0pCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nLXVuZGVmaW5lZCBzdXBwcmVzcycKKyAgICAgIDs7CisgICAgKikgIyBEYXJ3aW4gMS4zIG9uCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nLWZsYXRfbmFtZXNwYWNlIC11bmRlZmluZWQgc3VwcHJlc3MnCisgICAgICA7OworICAgIGVzYWMKKyAgICAjIEZJWE1FOiBSZWx5aW5nIG9uIHBvc2l4eSAkKCkgd2lsbCBjYXVzZSBwcm9ibGVtcyBmb3IKKyAgICAjICAgICAgICBjcm9zcy1jb21waWxhdGlvbiwgYnV0IHVuZm9ydHVuYXRlbHkgdGhlIGVjaG8gdGVzdHMgZG8gbm90CisgICAgIyAgICAgICAgeWV0IGRldGVjdCB6c2ggZWNobydzIHJlbW92YWwgb2YgXCBlc2NhcGVzLgorICAgIGFyY2hpdmVfY21kcz0nJG5vbm9wdCAkKHRlc3QgIngkbW9kdWxlIiA9IHh5ZXMgJiYgZWNobyAtYnVuZGxlIHx8IGVjaG8gLWR5bmFtaWNsaWIpICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzJGxpbmtlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmcnCisgICAgIyBXZSBuZWVkIHRvIGFkZCAnXycgdG8gdGhlIHN5bWJvbHMgaW4gJGV4cG9ydF9zeW1ib2xzIGZpcnN0CisgICAgI2FyY2hpdmVfZXhwc3ltX2NtZHM9IiRhcmNoaXZlX2NtZHMiJyAmJiBzdHJpcCAtcyAkZXhwb3J0X3N5bWJvbHMnCisgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nLWFsbF9sb2FkICRjb252ZW5pZW5jZScKKyAgICA7OworCisgIGZyZWVic2QxKikKKyAgICBsZF9zaGxpYnM9bm8KKyAgICA7OworCisgICMgRnJlZUJTRCAyLjIuWzAxMl0gYWxsb3dzIHVzIHRvIGluY2x1ZGUgYysrcnQwLm8gdG8gZ2V0IEMrKyBjb25zdHJ1Y3RvcgorICAjIHN1cHBvcnQuICBGdXR1cmUgdmVyc2lvbnMgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LCBidXQgYW4gZXhwbGljaXQgYysrcnQwLm8KKyAgIyBkb2VzIG5vdCBicmVhayBhbnl0aGluZywgYW5kIGhlbHBzIHNpZ25pZmljYW50bHkgKGF0IHRoZSBjb3N0IG9mIGEgbGl0dGxlCisgICMgZXh0cmEgc3BhY2UpLgorICBmcmVlYnNkMi4yKikKKyAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgL3Vzci9saWIvYysrcnQwLm8nCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgOzsKKworICAjIFVuZm9ydHVuYXRlbHksIG9sZGVyIHZlcnNpb25zIG9mIEZyZWVCU0QgMiBkbyBub3QgaGF2ZSB0aGlzIGZlYXR1cmUuCisgIGZyZWVic2QyKikKKyAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgIDs7CisKKyAgIyBGcmVlQlNEIDMgYW5kIGdyZWF0ZXIgdXNlcyBnY2MgLXNoYXJlZCB0byBkbyBzaGFyZWQgbGlicmFyaWVzLgorICBmcmVlYnNkKikKKyAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKKyAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgIDs7CisKKyAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGhwdXg5KikgYXJjaGl2ZV9jbWRzPSckcm0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kTEQgLWIgK2IgJGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicgOzsKKyAgICAqKSBhcmNoaXZlX2NtZHM9JyRMRCAtYiAraCAkc29uYW1lICtiICRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnIDs7CisgICAgZXNhYworICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICBoYXJkY29kZV9taW51c19MPXllcyAjIE5vdCBpbiB0aGUgc2VhcmNoIFBBVEgsIGJ1dCBhcyB0aGUgZGVmYXVsdAorCQkJICMgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJworICAgIDs7CisKKyAgaXJpeDUqIHwgaXJpeDYqKQorICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICBlbHNlCisgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisgICAgZmkKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisgICAgbGlua19hbGxfZGVwbGlicz15ZXMKKyAgICA7OworCisgIG5ldGJzZCopCisgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgIyBhLm91dAorICAgIGVsc2UKKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgICAgICMgRUxGCisgICAgZmkKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICA7OworCisgIG5ld3NvczYpCisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKyAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgOzsKKworICBvcGVuYnNkKikKKyAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tRScKKyAgICBlbHNlCisgICAgICBjYXNlICIkaG9zdF9vcyIgaW4KKyAgICAgIG9wZW5ic2RbMDFdLiogfCBvcGVuYnNkMi5bMC03XSB8IG9wZW5ic2QyLlswLTddLiopCisJYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKKyAgICAgICAgOzsKKyAgICAgICopCisgICAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICAgIDs7CisKKyAgb3MyKikKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAorICAgIGFyY2hpdmVfY21kcz0nJGVjaG8gIkxJQlJBUlkgJGxpYm5hbWUgSU5JVElOU1RBTkNFIiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyAiREVTQ1JJUFRJT04gXCIkbGlibmFtZVwiIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gREFUQSA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gIiBTSU5HTEUgTk9OU0hBUkVEIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gRVhQT1JUUyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+ZW14ZXhwICRsaWJvYmpzID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kQ0MgLVpkbGwgLVpjcnRkbGwgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJworICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9J2VteGltcCAtbyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5hICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKKyAgICA7OworCisgIG9zZjMqKQorICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCisgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworICAgIGVsc2UKKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJworICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisgICAgZmkKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisgICAgOzsKKworICBvc2Y0KiB8IG9zZjUqKQkjIGFzIG9zZjMqIHdpdGggdGhlIGFkZGl0aW9uIG9mIC1tc3ltIGZsYWcKKyAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgIGVsc2UKKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJworICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSdmb3IgaSBpbiBgY2F0ICRleHBvcnRfc3ltYm9sc2A7IGRvIHByaW50ZiAiLWV4cG9ydGVkX3N5bWJvbCAiID4+ICRsaWIuZXhwOyBlY2hvICJcJGkiID4+ICRsaWIuZXhwOyBkb25lOyBlY2hvICItaGlkZGVuIj4+ICRsaWIuZXhwfgorICAgICAgJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaW5wdXQgJGxpYi5leHAgJGxpbmtlcl9mbGFncyAkbGlib2JqcyAkZGVwbGlicyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGlifiRybSAkbGliLmV4cCcKKworICAgICAgI0JvdGggYyBhbmQgY3h4IGNvbXBpbGVyIHN1cHBvcnQgLXJwYXRoIGRpcmVjdGx5CisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctcnBhdGggJGxpYmRpcicKKyAgICBmaQorICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorICAgIDs7CisKKyAgc2NvMy4ydjUqKQorICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorICAgIGhhcmRjb2RlX3J1bnBhdGhfdmFyPXllcworICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tQmV4cG9ydCcKKyAgICA7OworCisgIHNvbGFyaXMqKQorICAgICMgZ2NjIC0tdmVyc2lvbiA8IDMuMCB3aXRob3V0IGJpbnV0aWxzIGNhbm5vdCBjcmVhdGUgc2VsZiBjb250YWluZWQKKyAgICAjIHNoYXJlZCBsaWJyYXJpZXMgcmVsaWFibHksIHJlcXVpcmluZyBsaWJnY2MuYSB0byByZXNvbHZlIHNvbWUgb2YKKyAgICAjIHRoZSBvYmplY3Qgc3ltYm9scyBnZW5lcmF0ZWQgaW4gc29tZSBjYXNlcy4gIExpYnJhcmllcyB0aGF0IHVzZQorICAgICMgYXNzZXJ0IG5lZWQgbGliZ2NjLmEgdG8gcmVzb2x2ZSBfX2VwcmludGYsIGZvciBleGFtcGxlLiAgTGlua2luZworICAgICMgYSBjb3B5IG9mIGxpYmdjYy5hIGludG8gZXZlcnkgc2hhcmVkIGxpYnJhcnkgdG8gZ3VhcmFudGVlIHJlc29sdmluZworICAgICMgc3VjaCBzeW1ib2xzIGNhdXNlcyBvdGhlciBwcm9ibGVtczogIEFjY29yZGluZyB0byBUaW0gVmFuIEhvbGRlcgorICAgICMgPHRpbS52YW4uaG9sZGVyQHBhbmRvcmEuYmU+LCBDKysgbGlicmFyaWVzIGVuZCB1cCB3aXRoIGEgc2VwYXJhdGUKKyAgICAjICh0byB0aGUgYXBwbGljYXRpb24pIGV4Y2VwdGlvbiBzdGFjayBmb3Igb25lIHRoaW5nLgorICAgIG5vX3VuZGVmaW5lZF9mbGFnPScgLXogZGVmcycKKyAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgICAgY2FzZSBgJENDIC0tdmVyc2lvbiAyPi9kZXYvbnVsbGAgaW4KKyAgICAgIFsxMl0uKikKKwljYXQgPDxFT0YgMT4mMgorCisqKiogV2FybmluZzogUmVsZWFzZXMgb2YgR0NDIGVhcmxpZXIgdGhhbiB2ZXJzaW9uIDMuMCBjYW5ub3QgcmVsaWFibHkKKyoqKiBjcmVhdGUgc2VsZiBjb250YWluZWQgc2hhcmVkIGxpYnJhcmllcyBvbiBTb2xhcmlzIHN5c3RlbXMsIHdpdGhvdXQKKyoqKiBpbnRyb2R1Y2luZyBhIGRlcGVuZGVuY3kgb24gbGliZ2NjLmEuICBUaGVyZWZvcmUsIGxpYnRvb2wgaXMgZGlzYWJsaW5nCisqKiogLW5vLXVuZGVmaW5lZCBzdXBwb3J0LCB3aGljaCB3aWxsIGF0IGxlYXN0IGFsbG93IHlvdSB0byBidWlsZCBzaGFyZWQKKyoqKiBsaWJyYXJpZXMuICBIb3dldmVyLCB5b3UgbWF5IGZpbmQgdGhhdCB3aGVuIHlvdSBsaW5rIHN1Y2ggbGlicmFyaWVzCisqKiogaW50byBhbiBhcHBsaWNhdGlvbiB3aXRob3V0IHVzaW5nIEdDQywgeW91IGhhdmUgdG8gbWFudWFsbHkgYWRkCisqKiogXGBnY2MgLS1wcmludC1saWJnY2MtZmlsZS1uYW1lXGAgdG8gdGhlIGxpbmsgY29tbWFuZC4gIFdlIHVyZ2UgeW91IHRvCisqKiogdXBncmFkZSB0byBhIG5ld2VyIHZlcnNpb24gb2YgR0NDLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gcmVidWlsZCB5b3VyCisqKiogY3VycmVudCBHQ0MgdG8gdXNlIHRoZSBHTlUgbGlua2VyIGZyb20gR05VIGJpbnV0aWxzIDIuOS4xIG9yIG5ld2VyLgorCitFT0YKKyAgICAgICAgbm9fdW5kZWZpbmVkX2ZsYWc9CisJOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICAgICMgJENDIC1zaGFyZWQgd2l0aG91dCBHTlUgbGQgd2lsbCBub3QgY3JlYXRlIGEgbGlicmFyeSBmcm9tIEMrKworICAgICMgb2JqZWN0IGZpbGVzIGFuZCBhIHN0YXRpYyBsaWJzdGRjKyssIGJldHRlciBhdm9pZCBpdCBieSBub3cKKyAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJCSRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfiRybSAkbGliLmV4cCcKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBzb2xhcmlzMi5bMC01XSB8IHNvbGFyaXMyLlswLTVdLiopIDs7CisgICAgKikgIyBTdXBwb3J0ZWQgc2luY2UgU29sYXJpcyAyLjYgKG1heWJlIDIuNS4xPykKKyAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScteiBhbGxleHRyYWN0JGNvbnZlbmllbmNlIC16IGRlZmF1bHRleHRyYWN0JyA7OworICAgIGVzYWMKKyAgICBsaW5rX2FsbF9kZXBsaWJzPXllcworICAgIDs7CisKKyAgc3Vub3M0KikKKyAgICBpZiB0ZXN0ICJ4JGhvc3RfdmVuZG9yIiA9IHhzZXF1ZW50OyB0aGVuCisgICAgICAjIFVzZSAkQ0MgdG8gbGluayB1bmRlciBzZXF1ZW50LCBiZWNhdXNlIGl0IHRocm93cyBpbiBzb21lIGV4dHJhIC5vCisgICAgICAjIGZpbGVzIHRoYXQgbWFrZSAuaW5pdCBhbmQgLmZpbmkgc2VjdGlvbnMgd29yay4KKyAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1HICR7d2x9LWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICBlbHNlCisgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnN0YXRpYyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgZmkKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgIDs7CisKKyAgc3lzdjQpCisgICAgaWYgdGVzdCAieCRob3N0X3ZlbmRvciIgPSB4c25vOyB0aGVuCisgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtQnN5bWJvbGljIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcyAjIGlzIHRoaXMgcmVhbGx5IHRydWU/Pz8KKyAgICBlbHNlCisgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD1ubyAjTW90b3JvbGEgbWFudWFsIHNheXMgeWVzLCBidXQgbXkgdGVzdHMgc2F5IHRoZXkgbGllCisgICAgZmkKKyAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgIDs7CisKKyAgc3lzdjQuMyopCisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nLUJleHBvcnQnCisgICAgOzsKKworICBzeXN2NSopCisgICAgbm9fdW5kZWZpbmVkX2ZsYWc9JyAteiB0ZXh0JworICAgICMgJENDIC1zaGFyZWQgd2l0aG91dCBHTlUgbGQgd2lsbCBub3QgY3JlYXRlIGEgbGlicmFyeSBmcm9tIEMrKworICAgICMgb2JqZWN0IGZpbGVzIGFuZCBhIHN0YXRpYyBsaWJzdGRjKyssIGJldHRlciBhdm9pZCBpdCBieSBub3cKKyAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJCSRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfiRybSAkbGliLmV4cCcKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPQorICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisgICAgOzsKKworICB1dHM0KikKKyAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgIDs7CisKKyAgZGd1eCopCisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICA7OworCisgIHN5c3Y0Kk1QKikKKyAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgICBoYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKKyAgICAgIGxkX3NobGlicz15ZXMKKyAgICBmaQorICAgIDs7CisKKyAgc3lzdjQuMnV3MiopCisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICBoYXJkY29kZV9taW51c19MPW5vCisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgIGhhcmRjb2RlX3J1bnBhdGhfdmFyPXllcworICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgOzsKKworICBzeXN2NXV3NyogfCB1bml4d2FyZTcqKQorICAgIG5vX3VuZGVmaW5lZF9mbGFnPScke3dsfS16ICR7d2x9dGV4dCcKKyAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICBlbHNlCisgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtRyAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICBmaQorICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKyAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgOzsKKworICAqKQorICAgIGxkX3NobGlicz1ubworICAgIDs7CisgIGVzYWMKK2ZpCitlY2hvICIkYXNfbWU6NTY5NTogcmVzdWx0OiAkbGRfc2hsaWJzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsZF9zaGxpYnMiID4mNgordGVzdCAiJGxkX3NobGlicyIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKKyMgQ2hlY2sgaGFyZGNvZGluZyBhdHRyaWJ1dGVzLgorZWNobyAiJGFzX21lOjU3MDA6IGNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zLi4uICRFQ0hPX0MiID4mNgoraGFyZGNvZGVfYWN0aW9uPQoraWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiIHx8IFwKKyAgIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KKworICAjIFdlIGNhbiBoYXJkY29kZSBub24tZXhpc3RhbnQgZGlyZWN0b3JpZXMuCisgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiICE9IG5vICYmCisgICAgICMgSWYgdGhlIG9ubHkgbWVjaGFuaXNtIHRvIGF2b2lkIGhhcmRjb2RpbmcgaXMgc2hsaWJwYXRoX3Zhciwgd2UKKyAgICAgIyBoYXZlIHRvIHJlbGluaywgb3RoZXJ3aXNlIHdlIG1pZ2h0IGxpbmsgd2l0aCBhbiBpbnN0YWxsZWQgbGlicmFyeQorICAgICAjIHdoZW4gd2Ugc2hvdWxkIGJlIGxpbmtpbmcgd2l0aCBhIHlldC10by1iZS1pbnN0YWxsZWQgb25lCisgICAgICMjIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiAhPSBubyAmJgorICAgICB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgIT0gbm87IHRoZW4KKyAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgorICAgIGhhcmRjb2RlX2FjdGlvbj1yZWxpbmsKKyAgZWxzZQorICAgICMgV2UgY2FuIGxpbmsgd2l0aG91dCBoYXJkY29kaW5nLCBhbmQgd2UgY2FuIGhhcmRjb2RlIG5vbmV4aXN0aW5nIGRpcnMuCisgICAgaGFyZGNvZGVfYWN0aW9uPWltbWVkaWF0ZQorICBmaQorZWxzZQorICAjIFdlIGNhbm5vdCBoYXJkY29kZSBhbnl0aGluZywgb3IgZWxzZSB3ZSBjYW4gb25seSBoYXJkY29kZSBleGlzdGluZworICAjIGRpcmVjdG9yaWVzLgorICBoYXJkY29kZV9hY3Rpb249dW5zdXBwb3J0ZWQKK2ZpCitlY2hvICIkYXNfbWU6NTcyNDogcmVzdWx0OiAkaGFyZGNvZGVfYWN0aW9uIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRoYXJkY29kZV9hY3Rpb24iID4mNgorCitzdHJpcGxpYj0KK29sZF9zdHJpcGxpYj0KK2VjaG8gIiRhc19tZTo1NzI5OiBjaGVja2luZyB3aGV0aGVyIHN0cmlwcGluZyBsaWJyYXJpZXMgaXMgcG9zc2libGUiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHN0cmlwcGluZyBsaWJyYXJpZXMgaXMgcG9zc2libGUuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0IC1uICIkU1RSSVAiICYmICRTVFJJUCAtViAyPiYxIHwgZ3JlcCAiR05VIHN0cmlwIiA+L2Rldi9udWxsOyB0aGVuCisgIHRlc3QgLXogIiRvbGRfc3RyaXBsaWIiICYmIG9sZF9zdHJpcGxpYj0iJFNUUklQIC0tc3RyaXAtZGVidWciCisgIHRlc3QgLXogIiRzdHJpcGxpYiIgJiYgc3RyaXBsaWI9IiRTVFJJUCAtLXN0cmlwLXVubmVlZGVkIgorICBlY2hvICIkYXNfbWU6NTczNDogcmVzdWx0OiB5ZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOjU3Mzc6IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworcmVsb2FkX2NtZHM9JyRMRCRyZWxvYWRfZmxhZyAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJwordGVzdCAteiAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiAmJiBkZXBsaWJzX2NoZWNrX21ldGhvZD11bmtub3duCisKKyMgUE9SVE1FIEZpbGwgaW4geW91ciBsZC5zbyBjaGFyYWN0ZXJpc3RpY3MKK2VjaG8gIiRhc19tZTo1NzQ1OiBjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MuLi4gJEVDSE9fQyIgPiY2CitsaWJyYXJ5X25hbWVzX3NwZWM9CitsaWJuYW1lX3NwZWM9J2xpYiRuYW1lJworc29uYW1lX3NwZWM9Citwb3N0aW5zdGFsbF9jbWRzPQorcG9zdHVuaW5zdGFsbF9jbWRzPQorZmluaXNoX2NtZHM9CitmaW5pc2hfZXZhbD0KK3NobGlicGF0aF92YXI9CitzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9dW5rbm93bgordmVyc2lvbl90eXBlPW5vbmUKK2R5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIgorc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgorCitjYXNlICRob3N0X29zIGluCithaXgzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICRsaWJuYW1lLmEnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorCisgICMgQUlYIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIHdlIGFwcGVuZCBhIG1ham9yIHZlcnNpb24gdG8gdGhlIG5hbWUuCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKKyAgOzsKKworYWl4NCogfCBhaXg1KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgICAgIyBBSVggNSBzdXBwb3J0cyBJQTY0CisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJGxpYm5hbWUuc28nCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgZWxzZQorICAgICMgV2l0aCBHQ0MgdXAgdG8gMi45NS54LCBjb2xsZWN0MiB3b3VsZCBjcmVhdGUgYW4gaW1wb3J0IGZpbGUKKyAgICAjIGZvciBkZXBlbmRlbmNlIGxpYnJhcmllcy4gIFRoZSBpbXBvcnQgZmlsZSB3b3VsZCBzdGFydCB3aXRoCisgICAgIyB0aGUgbGluZSBgIyEgLicuICBUaGlzIHdvdWxkIGNhdXNlIHRoZSBnZW5lcmF0ZWQgbGlicmFyeSB0bworICAgICMgZGVwZW5kIG9uIGAuJywgYWx3YXlzIGFuIGludmFsaWQgbGlicmFyeS4gIFRoaXMgd2FzIGZpeGVkIGluCisgICAgIyBkZXZlbG9wbWVudCBzbmFwc2hvdHMgb2YgR0NDIHByaW9yIHRvIDMuMC4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXg0IHwgYWl4NC5bMDFdIHwgYWl4NC5bMDFdLiopCisJaWYgeyBlY2hvICcjaWYgX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDk3KScKKwkgICAgIGVjaG8gJyB5ZXMgJworCSAgICAgZWNobyAnI2VuZGlmJzsgfSB8ICR7Q0N9IC1FIC0gfCBncmVwIHllcyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgOgorCWVsc2UKKwkgIGNhbl9idWlsZF9zaGFyZWQ9bm8KKwlmaQorCTs7CisgICAgZXNhYworICAgICMgQUlYIChvbiBQb3dlciopIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIGN1cnJlbnRseSB3ZSBjYW4KKyAgICAjIG5vdCBoYXJkY29kZSBjb3JyZWN0IHNvbmFtZSBpbnRvIGV4ZWN1dGFibGUuIFByb2JhYmx5IHdlIGNhbgorICAgICMgYWRkIHZlcnNpb25pbmcgc3VwcG9ydCB0byBjb2xsZWN0Miwgc28gYWRkaXRpb25hbCBsaW5rcyBjYW4KKyAgICAjIGJlIHVzZWZ1bCBpbiBmdXR1cmUuCisgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisgICAgICAjIElmIHVzaW5nIHJ1biB0aW1lIGxpbmtpbmcgKG9uIEFJWCA0LjIgb3IgbGF0ZXIpIHVzZSBsaWI8bmFtZT4uc28KKyAgICAgICMgaW5zdGVhZCBvZiBsaWI8bmFtZT4uYSB0byBsZXQgcGVvcGxlIGtub3cgdGhhdCB0aGVzZSBhcmUgbm90CisgICAgICAjIHR5cGljYWwgQUlYIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAkbGlibmFtZS5zbycKKyAgICBlbHNlCisgICAgICAjIFdlIHByZXNlcnZlIC5hIGFzIGV4dGVuc2lvbiBmb3Igc2hhcmVkIGxpYnJhcmllcyB0aHJvdWdoIEFJWDQuMgorICAgICAgIyBhbmQgbGF0ZXIgd2hlbiB3ZSBhcmUgbm90IGRvaW5nIHJ1biB0aW1lIGxpbmtpbmcuCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LmEgJGxpYm5hbWUuYScKKyAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKKyAgICBmaQorICAgIHNobGlicGF0aF92YXI9TElCUEFUSAorICBmaQorICA7OworCithbWlnYW9zKikKKyAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5peGxpYnJhcnkgJGxpYm5hbWUuYScKKyAgIyBDcmVhdGUgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSBlbnRyaWVzIGluIC9zeXMvbGlicy4KKyAgZmluaXNoX2V2YWw9J2ZvciBsaWIgaW4gYGxzICRsaWJkaXIvKi5peGxpYnJhcnkgMj4vZGV2L251bGxgOyBkbyBsaWJuYW1lPWAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ1wnJ3MlXi4qL1woW14vXSpcKVwuaXhsaWJyYXJ5JCVcMSUnXCcnYDsgdGVzdCAkcm0gL3N5cy9saWJzLyR7bGlibmFtZX1faXhsaWJyYXJ5LmE7ICRzaG93ICIoY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSkiOyAoY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSkgfHwgZXhpdCAxOyBkb25lJworICA7OworCitiZW9zKikKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9LnNvJworICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCisgIHNobGlicGF0aF92YXI9TElCUkFSWV9QQVRICisgIDs7CisKK2JzZGk0KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAkbGlibmFtZS5zbycKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL1gxMS9saWIgL3Vzci9jb250cmliL2xpYiAvbGliIC91c3IvbG9jYWwvbGliIgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgorICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9LXJkeW5hbWljCisgICMgdGhlIGRlZmF1bHQgbGQuc28uY29uZiBhbHNvIGNvbnRhaW5zIC91c3IvY29udHJpYi9saWIgYW5kCisgICMgL3Vzci9YMTFSNi9saWIgKC91c3IvWDExIGlzIGEgbGluayB0byAvdXNyL1gxMVI2KSwgYnV0IGxldCB1cyBhbGxvdworICAjIGxpYnRvb2wgdG8gaGFyZC1jb2RlIHRoZXNlIGludG8gcHJvZ3JhbXMKKyAgOzsKKworY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorICB2ZXJzaW9uX3R5cGU9d2luZG93cworICBuZWVkX3ZlcnNpb249bm8KKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIGNhc2UgJEdDQywkaG9zdF9vcyBpbgorICB5ZXMsY3lnd2luKikKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLmRsbC5hJworICAgIHNvbmFtZV9zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvY3lnLydgYGVjaG8gJHtyZWxlYXNlfSB8IHNlZCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0uZGxsJworICAgIHBvc3RpbnN0YWxsX2NtZHM9J2RscGF0aD1gYmFzaCAyPiYxIC1jICdcJycuICRkaXIvJHtmaWxlfWk7ZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxkaXI9JGRlc3RkaXIvYGRpcm5hbWUgXCRkbHBhdGhgfgorICAgICAgdGVzdCAtZCBcJGRsZGlyIHx8IG1rZGlyIC1wIFwkZGxkaXJ+CisgICAgICAkaW5zdGFsbF9wcm9nIC5saWJzLyRkbG5hbWUgXCRkbGRpci8kZGxuYW1lJworICAgIHBvc3R1bmluc3RhbGxfY21kcz0nZGxkbGw9YGJhc2ggMj4mMSAtYyAnXCcnLiAkZmlsZTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxwYXRoPSRkaXIvXCRkbGRsbH4KKyAgICAgICAkcm0gXCRkbHBhdGgnCisgICAgOzsKKyAgeWVzLG1pbmd3KikKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgc2VkIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fS5kbGwnCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgc2VkIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLzsvIC9nImAKKyAgICA7OworICB5ZXMscHczMiopCisgICAgbGlicmFyeV9uYW1lc19zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvcHcvJ2BgZWNobyAke3JlbGVhc2V9IHwgc2VkIC1lICdzLy4vLS9nJ2Ake3ZlcnN1ZmZpeH0uZGxsJworICAgIDs7CisgICopCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8IHNlZCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0uZGxsICRsaWJuYW1lLmxpYicKKyAgICA7OworICBlc2FjCisgIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCisgICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgorICBzaGxpYnBhdGhfdmFyPVBBVEgKKyAgOzsKKworZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGR5bGQiCisgIHZlcnNpb25fdHlwZT1kYXJ3aW4KKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICAjIEZJWE1FOiBSZWx5aW5nIG9uIHBvc2l4eSAkKCkgd2lsbCBjYXVzZSBwcm9ibGVtcyBmb3IKKyAgIyAgICAgICAgY3Jvc3MtY29tcGlsYXRpb24sIGJ1dCB1bmZvcnR1bmF0ZWx5IHRoZSBlY2hvIHRlc3RzIGRvIG5vdAorICAjICAgICAgICB5ZXQgZGV0ZWN0IHpzaCBlY2hvJ3MgcmVtb3ZhbCBvZiBcIGVzY2FwZXMuCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3ZlcnN1ZmZpeH0uJCh0ZXN0IC4kbW9kdWxlID0gLnllcyAmJiBlY2hvIHNvIHx8IGVjaG8gZHlsaWIpICR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0uJCh0ZXN0IC4kbW9kdWxlID0gLnllcyAmJiBlY2hvIHNvIHx8IGVjaG8gZHlsaWIpICR7bGlibmFtZX0uJCh0ZXN0IC4kbW9kdWxlID0gLnllcyAmJiBlY2hvIHNvIHx8IGVjaG8gZHlsaWIpJworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfS4kKHRlc3QgLiRtb2R1bGUgPSAueWVzICYmIGVjaG8gc28gfHwgZWNobyBkeWxpYiknCisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgc2hsaWJwYXRoX3Zhcj1EWUxEX0xJQlJBUllfUEFUSAorICA7OworCitmcmVlYnNkMSopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7CisKK2ZyZWVic2QqKQorICBvYmpmb3JtYXQ9YHRlc3QgLXggL3Vzci9iaW4vb2JqZm9ybWF0ICYmIC91c3IvYmluL29iamZvcm1hdCB8fCBlY2hvIGFvdXRgCisgIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKKyAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisgICAgZnJlZWJzZC1lbGYqKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28gJGxpYm5hbWUuc28nCisgICAgICBuZWVkX3ZlcnNpb249bm8KKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgOzsKKyAgICBmcmVlYnNkLSopCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAkbGlibmFtZS5zbyR2ZXJzdWZmaXgnCisgICAgICBuZWVkX3ZlcnNpb249eWVzCisgICAgICA7OworICBlc2FjCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgZnJlZWJzZDIqKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICA7OworICAqKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICBlc2FjCisgIDs7CisKK2dudSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHttYWpvcn0gJHtsaWJuYW1lfS5zbycKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2hwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCisgICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgorICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBzaGxpYnBhdGhfdmFyPVNITElCX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vICMgK3MgaXMgcmVxdWlyZWQgdG8gZW5hYmxlIFNITElCX1BBVEgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbCR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc2wkbWFqb3IgJGxpYm5hbWUuc2wnCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbCRtYWpvcicKKyAgIyBIUC1VWCBydW5zICpyZWFsbHkqIHNsb3dseSB1bmxlc3Mgc2hhcmVkIGxpYnJhcmllcyBhcmUgbW9kZSA1NTUuCisgIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDU1NSAkbGliJworICA7OworCitpcml4NSogfCBpcml4NiopCisgIHZlcnNpb25fdHlwZT1pcml4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyAkbGlibmFtZS5zbycKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBpcml4NSopCisgICAgbGlic3VmZj0gc2hsaWJzdWZmPQorICAgIDs7CisgICopCisgICAgY2FzZSAkTEQgaW4gIyBsaWJ0b29sLm00IHdpbGwgYWRkIG9uZSBvZiB0aGVzZSBzd2l0Y2hlcyB0byBMRAorICAgICotMzJ8KiItMzIgIikgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz0zMi1iaXQ7OworICAgICotbjMyfCoiLW4zMiAiKSBsaWJzdWZmPTMyIHNobGlic3VmZj1OMzIgbGlibWFnaWM9TjMyOzsKKyAgICAqLTY0fCoiLTY0ICIpIGxpYnN1ZmY9NjQgc2hsaWJzdWZmPTY0IGxpYm1hZ2ljPTY0LWJpdDs7CisgICAgKikgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7CisgICAgZXNhYworICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZJHtzaGxpYnN1ZmZ9X1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IC91c3IvbG9jYWwvbGliJHtsaWJzdWZmfSIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSIKKyAgOzsKKworIyBObyBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIExpbnV4IG9sZGxkLCBhb3V0LCBvciBjb2ZmLgorbGludXgqb2xkbGQqIHwgbGludXgqYW91dCogfCBsaW51eCpjb2ZmKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKKworIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgorbGludXgqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAkbGlibmFtZS5zbycKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbiAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgIyBUaGlzIGltcGxpZXMgbm8gZmFzdF9pbnN0YWxsLCB3aGljaCBpcyB1bmFjY2VwdGFibGUuCisgICMgU29tZSByZXdvcmsgd2lsbCBiZSBuZWVkZWQgdG8gYWxsb3cgZm9yIGZhc3RfaW5zdGFsbAorICAjIGJlZm9yZSB0aGlzIGNhbiBiZSBlbmFibGVkLgorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisKKyAgIyBXZSB1c2VkIHRvIHRlc3QgZm9yIC9saWIvbGQuc28uMSBhbmQgZGlzYWJsZSBzaGFyZWQgbGlicmFyaWVzIG9uCisgICMgcG93ZXJwYywgYmVjYXVzZSBNa0xpbnV4IG9ubHkgc3VwcG9ydGVkIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB0aGUKKyAgIyBHTlUgZHluYW1pYyBsaW5rZXIuICBTaW5jZSB0aGlzIHdhcyBicm9rZW4gd2l0aCBjcm9zcyBjb21waWxlcnMsCisgICMgbW9zdCBwb3dlcnBjLWxpbnV4IGJveGVzIHN1cHBvcnQgZHluYW1pYyBsaW5raW5nIHRoZXNlIGRheXMgYW5kCisgICMgcGVvcGxlIGNhbiBhbHdheXMgLS1kaXNhYmxlLXNoYXJlZCwgdGhlIHRlc3Qgd2FzIHJlbW92ZWQsIGFuZCB3ZQorICAjIGFzc3VtZSB0aGUgR05VL0xpbnV4IGR5bmFtaWMgbGlua2VyIGlzIGluIHVzZS4KKyAgZHluYW1pY19saW5rZXI9J0dOVS9MaW51eCBsZC5zbycKKyAgOzsKKworbmV0YnNkKikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0uc28kdmVyc3VmZml4JworICAgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgICAgZHluYW1pY19saW5rZXI9J05ldEJTRCAoYS5vdXQpIGxkLnNvJworICBlbHNlCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28gJHtsaWJuYW1lfS5zbycKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCisgICAgZHluYW1pY19saW5rZXI9J05ldEJTRCBsZC5lbGZfc28nCisgIGZpCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCituZXdzb3M2KQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgOzsKKworb3BlbmJzZCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorICAgIGNhc2UgIiRob3N0X29zIiBpbgorICAgIG9wZW5ic2QyLls4OV0gfCBvcGVuYnNkMi5bODldLiopCisgICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICAgIDs7CisgICAgKikKKyAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICAgIDs7CisgICAgZXNhYworICBlbHNlCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBmaQorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9LnNvJHZlcnN1ZmZpeCcKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworb3MyKikKKyAgbGlibmFtZV9zcGVjPSckbmFtZScKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuZGxsICRsaWJuYW1lLmEnCisgIGR5bmFtaWNfbGlua2VyPSdPUy8yIGxkLmV4ZScKKyAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisgIDs7CisKK29zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgdmVyc2lvbl90eXBlPW9zZgorICBuZWVkX3ZlcnNpb249bm8KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyAkbGlibmFtZS5zbycKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL3NobGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYi9jbXBscnMvY2MgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIgL3Zhci9zaGxpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiCisgIDs7CisKK3NjbzMuMnY1KikKKyAgdmVyc2lvbl90eXBlPW9zZgorICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitzb2xhcmlzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICMgbGRkIGNvbXBsYWlucyB1bmxlc3MgbGlicmFyaWVzIGFyZSBleGVjdXRhYmxlCisgIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kICt4ICRsaWInCisgIDs7CisKK3N1bm9zNCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9LnNvJHZlcnN1ZmZpeCcKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovdXNyL2V0YyIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgbmVlZF9saWJfcHJlZml4PW5vCisgIGZpCisgIG5lZWRfdmVyc2lvbj15ZXMKKyAgOzsKKworc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqIHwgc3lzdjUqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKyAgICBzbmkpCisgICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICAgIDs7CisgICAgbW90b3JvbGEpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIG5lZWRfdmVyc2lvbj1ubworICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9jY3MvbGliJworICAgICAgOzsKKyAgZXNhYworICA7OworCit1dHM0KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIDs7CisKK2RndXgqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAkbGlibmFtZS5zbycKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitzeXN2NCpNUCopCisgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKyAgICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLnNvLiR2ZXJzdWZmaXggJGxpYm5hbWUuc28uJG1ham9yICRsaWJuYW1lLnNvJworICAgIHNvbmFtZV9zcGVjPSckbGlibmFtZS5zby4kbWFqb3InCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgZmkKKyAgOzsKKworKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKK2VzYWMKK2VjaG8gIiRhc19tZTo2MTM4OiByZXN1bHQ6ICRkeW5hbWljX2xpbmtlciIgPiY1CitlY2hvICIke0VDSE9fVH0kZHluYW1pY19saW5rZXIiID4mNgordGVzdCAiJGR5bmFtaWNfbGlua2VyIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKworIyBSZXBvcnQgdGhlIGZpbmFsIGNvbnNlcXVlbmNlcy4KK2VjaG8gIiRhc19tZTo2MTQzOiBjaGVja2luZyBpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gJEVDSE9fQyIgPiY2CitlY2hvICIkYXNfbWU6NjE0NTogcmVzdWx0OiAkY2FuX2J1aWxkX3NoYXJlZCIgPiY1CitlY2hvICIke0VDSE9fVH0kY2FuX2J1aWxkX3NoYXJlZCIgPiY2CisKK2VjaG8gIiRhc19tZTo2MTQ4OiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuLi4gJEVDSE9fQyIgPiY2Cit0ZXN0ICIkY2FuX2J1aWxkX3NoYXJlZCIgPSAibm8iICYmIGVuYWJsZV9zaGFyZWQ9bm8KKworIyBPbiBBSVgsIHNoYXJlZCBsaWJyYXJpZXMgYW5kIHN0YXRpYyBsaWJyYXJpZXMgdXNlIHRoZSBzYW1lIG5hbWVzcGFjZSwgYW5kCisjIGFyZSBhbGwgYnVpbHQgZnJvbSBQSUMuCitjYXNlICIkaG9zdF9vcyIgaW4KK2FpeDMqKQorICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICAgIGFyY2hpdmVfY21kcz0iJGFyY2hpdmVfY21kc35cJFJBTkxJQiBcJGxpYiIKKyAgICBwb3N0aW5zdGFsbF9jbWRzPSckUkFOTElCICRsaWInCisgIGZpCisgIDs7CisKK2FpeDQqKQorICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQgJiYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0gbm8gOyB0aGVuCisgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgZmkKKyAgOzsKK2VzYWMKK2VjaG8gIiRhc19tZTo2MTY5OiByZXN1bHQ6ICRlbmFibGVfc2hhcmVkIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRlbmFibGVfc2hhcmVkIiA+JjYKKworZWNobyAiJGFzX21lOjYxNzI6IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4uLiAkRUNIT19DIiA+JjYKKyMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgordGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzIHx8IGVuYWJsZV9zdGF0aWM9eWVzCitlY2hvICIkYXNfbWU6NjE3NjogcmVzdWx0OiAkZW5hYmxlX3N0YXRpYyIgPiY1CitlY2hvICIke0VDSE9fVH0kZW5hYmxlX3N0YXRpYyIgPiY2CisKK2lmIHRlc3QgIiRoYXJkY29kZV9hY3Rpb24iID0gcmVsaW5rOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCitlbGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzIHx8CisgICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IG5lY2Vzc2FyeQorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5lZWRsZXNzCitmaQorCit2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iUEFUSCAkc2hsaWJwYXRoX3ZhciAkcnVucGF0aF92YXIiCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICB2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIEdDQ19FWEVDX1BSRUZJWCBDT01QSUxFUl9QQVRIIExJQlJBUllfUEFUSCIKK2ZpCisKK2lmIHRlc3QgIngkZW5hYmxlX2Rsb3BlbiIgIT0geHllczsgdGhlbgorICBlbmFibGVfZGxvcGVuPXVua25vd24KKyAgZW5hYmxlX2Rsb3Blbl9zZWxmPXVua25vd24KKyAgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duCitlbHNlCisgIGx0X2N2X2Rsb3Blbj1ubworICBsdF9jdl9kbG9wZW5fbGlicz0KKworICBjYXNlICRob3N0X29zIGluCisgIGJlb3MqKQorICAgIGx0X2N2X2Rsb3Blbj0ibG9hZF9hZGRfb24iCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCisgICAgOzsKKworICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgICAgbHRfY3ZfZGxvcGVuPSJMb2FkTGlicmFyeSIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgIDs7CisKKyAgKikKKyAgICBlY2hvICIkYXNfbWU6NjIxNDogY2hlY2tpbmcgZm9yIHNobF9sb2FkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHNobF9sb2FkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9mdW5jX3NobF9sb2FkK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorI2xpbmUgNjIyMCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBzaGxfbG9hZCAoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBzaGxfbG9hZCAoKTsKK2NoYXIgKCpmKSAoKTsKKworaW50CittYWluICgpCit7CisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfc2hsX2xvYWQpIHx8IGRlZmluZWQgKF9fc3R1Yl9fX3NobF9sb2FkKQorY2hva2UgbWUKKyNlbHNlCitmID0gc2hsX2xvYWQ7CisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6NjI1MTogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6NjI1NDogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOjYyNTc6IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTo2MjYwOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfZnVuY19zaGxfbG9hZD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK2NhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorYWNfY3ZfZnVuY19zaGxfbG9hZD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitlY2hvICIkYXNfbWU6NjI3MDogcmVzdWx0OiAkYWNfY3ZfZnVuY19zaGxfbG9hZCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfZnVuY19zaGxfbG9hZCIgPiY2CitpZiB0ZXN0ICRhY19jdl9mdW5jX3NobF9sb2FkID0geWVzOyB0aGVuCisgIGx0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiCitlbHNlCisgIGVjaG8gIiRhc19tZTo2Mjc1OiBjaGVja2luZyBmb3Igc2hsX2xvYWQgaW4gLWxkbGQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc2hsX2xvYWQgaW4gLWxkbGQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X2xpYl9kbGRfc2hsX2xvYWQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxkbGQgICRMSUJTIgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisjbGluZSA2MjgzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBzaGxfbG9hZCAoKTsKK2ludAorbWFpbiAoKQoreworc2hsX2xvYWQgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTo2MzAyOiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTo2MzA1OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKyAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6NjMwODogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjYzMTE6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9saWJfZGxkX3NobF9sb2FkPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CithY19jdl9saWJfZGxkX3NobF9sb2FkPW5vCitmaQorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK2VjaG8gIiRhc19tZTo2MzIyOiByZXN1bHQ6ICRhY19jdl9saWJfZGxkX3NobF9sb2FkIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfZGxkX3NobF9sb2FkIiA+JjYKK2lmIHRlc3QgJGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQgPSB5ZXM7IHRoZW4KKyAgbHRfY3ZfZGxvcGVuPSJzaGxfbG9hZCIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1kbGQiCitlbHNlCisgIGVjaG8gIiRhc19tZTo2MzI3OiBjaGVja2luZyBmb3IgZGxvcGVuIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGRsb3Blbi4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfZnVuY19kbG9wZW4rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisjbGluZSA2MzMzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIGRsb3BlbiAoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBkbG9wZW4gKCk7CitjaGFyICgqZikgKCk7CisKK2ludAorbWFpbiAoKQoreworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViX2Rsb3BlbikgfHwgZGVmaW5lZCAoX19zdHViX19fZGxvcGVuKQorY2hva2UgbWUKKyNlbHNlCitmID0gZGxvcGVuOworI2VuZGlmCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOjYzNjQ6IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjYzNjc6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTo2MzcwOiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6NjM3MzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X2Z1bmNfZGxvcGVuPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CithY19jdl9mdW5jX2Rsb3Blbj1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitlY2hvICIkYXNfbWU6NjM4MzogcmVzdWx0OiAkYWNfY3ZfZnVuY19kbG9wZW4iID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2Z1bmNfZGxvcGVuIiA+JjYKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfZGxvcGVuID0geWVzOyB0aGVuCisgIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIgorZWxzZQorICBlY2hvICIkYXNfbWU6NjM4ODogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9saWJfZGxfZGxvcGVuK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sZGwgICRMSUJTIgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisjbGluZSA2Mzk2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBkbG9wZW4gKCk7CitpbnQKK21haW4gKCkKK3sKK2Rsb3BlbiAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOjY0MTU6IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjY0MTg6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTo2NDIxOiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6NjQyNDogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X2xpYl9kbF9kbG9wZW49eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKK2FjX2N2X2xpYl9kbF9kbG9wZW49bm8KK2ZpCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQorZWNobyAiJGFzX21lOjY0MzU6IHJlc3VsdDogJGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNgoraWYgdGVzdCAkYWNfY3ZfbGliX2RsX2Rsb3BlbiA9IHllczsgdGhlbgorICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiCitlbHNlCisgIGVjaG8gIiRhc19tZTo2NDQwOiBjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sc3ZsZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxzdmxkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9saWJfc3ZsZF9kbG9wZW4rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxzdmxkICAkTElCUyIKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorI2xpbmUgNjQ0OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgZGxvcGVuICgpOworaW50CittYWluICgpCit7CitkbG9wZW4gKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTo2NDY3OiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTo2NDcwOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKyAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6NjQ3MzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjY0NzY6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9saWJfc3ZsZF9kbG9wZW49eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKK2FjX2N2X2xpYl9zdmxkX2Rsb3Blbj1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCitlY2hvICIkYXNfbWU6NjQ4NzogcmVzdWx0OiAkYWNfY3ZfbGliX3N2bGRfZGxvcGVuIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfc3ZsZF9kbG9wZW4iID4mNgoraWYgdGVzdCAkYWNfY3ZfbGliX3N2bGRfZGxvcGVuID0geWVzOyB0aGVuCisgIGx0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxzdmxkIgorZWxzZQorICBlY2hvICIkYXNfbWU6NjQ5MjogY2hlY2tpbmcgZm9yIGRsZF9saW5rIGluIC1sZGxkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGRsZF9saW5rIGluIC1sZGxkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9saWJfZGxkX2RsZF9saW5rK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sZGxkICAkTElCUyIKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorI2xpbmUgNjUwMCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgZGxkX2xpbmsgKCk7CitpbnQKK21haW4gKCkKK3sKK2RsZF9saW5rICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6NjUxOTogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6NjUyMjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOjY1MjU6IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTo2NTI4OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfbGliX2RsZF9kbGRfbGluaz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK2NhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorYWNfY3ZfbGliX2RsZF9kbGRfbGluaz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCitlY2hvICIkYXNfbWU6NjUzOTogcmVzdWx0OiAkYWNfY3ZfbGliX2RsZF9kbGRfbGluayIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX2RsZF9kbGRfbGluayIgPiY2CitpZiB0ZXN0ICRhY19jdl9saWJfZGxkX2RsZF9saW5rID0geWVzOyB0aGVuCisgIGx0X2N2X2Rsb3Blbj0iZGxkX2xpbmsiIGx0X2N2X2Rsb3Blbl9saWJzPSItZGxkIgorZmkKKworZmkKKworZmkKKworZmkKKworZmkKKworZmkKKworICAgIDs7CisgIGVzYWMKKworICBpZiB0ZXN0ICJ4JGx0X2N2X2Rsb3BlbiIgIT0geG5vOyB0aGVuCisgICAgZW5hYmxlX2Rsb3Blbj15ZXMKKyAgZWxzZQorICAgIGVuYWJsZV9kbG9wZW49bm8KKyAgZmkKKworICBjYXNlICRsdF9jdl9kbG9wZW4gaW4KKyAgZGxvcGVuKQorICAgIHNhdmVfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKKyAgICAgICAgdGVzdCAieCRhY19jdl9oZWFkZXJfZGxmY25faCIgPSB4eWVzICYmIENQUEZMQUdTPSIkQ1BQRkxBR1MgLURIQVZFX0RMRkNOX0giCisKKyAgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgIGV2YWwgTERGTEFHUz1cIlwkTERGTEFHUyAkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKKworICAgIHNhdmVfTElCUz0iJExJQlMiCisgICAgTElCUz0iJGx0X2N2X2Rsb3Blbl9saWJzICRMSUJTIgorCisgICAgZWNobyAiJGFzX21lOjY1NzU6IGNoZWNraW5nIHdoZXRoZXIgYSBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBhIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2x0X2N2X2Rsb3Blbl9zZWxmK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIAkgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgbHRfY3ZfZGxvcGVuX3NlbGY9Y3Jvc3MKK2Vsc2UKKyAgICBsdF9kbHVua25vd249MDsgbHRfZGxub191c2NvcmU9MTsgbHRfZGxuZWVkX3VzY29yZT0yCisgIGx0X3N0YXR1cz0kbHRfZGx1bmtub3duCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDY1ODYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaWYgSEFWRV9ETEZDTl9ICisjaW5jbHVkZSA8ZGxmY24uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmZGVmIFJUTERfR0xPQkFMCisjICBkZWZpbmUgTFRfRExHTE9CQUwJCVJUTERfR0xPQkFMCisjZWxzZQorIyAgaWZkZWYgRExfR0xPQkFMCisjICAgIGRlZmluZSBMVF9ETEdMT0JBTAkJRExfR0xPQkFMCisjICBlbHNlCisjICAgIGRlZmluZSBMVF9ETEdMT0JBTAkJMAorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBXZSBtYXkgaGF2ZSB0byBkZWZpbmUgTFRfRExMQVpZX09SX05PVyBpbiB0aGUgY29tbWFuZCBsaW5lIGlmIHdlCisgICBmaW5kIG91dCBpdCBkb2VzIG5vdCB3b3JrIGluIHNvbWUgcGxhdGZvcm0uICovCisjaWZuZGVmIExUX0RMTEFaWV9PUl9OT1cKKyMgIGlmZGVmIFJUTERfTEFaWQorIyAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkJUlRMRF9MQVpZCisjICBlbHNlCisjICAgIGlmZGVmIERMX0xBWlkKKyMgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkJRExfTEFaWQorIyAgICBlbHNlCisjICAgICAgaWZkZWYgUlRMRF9OT1cKKyMgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCVJUTERfTk9XCisjICAgICAgZWxzZQorIyAgICAgICAgaWZkZWYgRExfTk9XCisjICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCURMX05PVworIyAgICAgICAgZWxzZQorIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkwCisjICAgICAgICBlbmRpZgorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB2b2lkIGV4aXQgKGludCk7CisjZW5kaWYKKwordm9pZCBmbm9yZCgpIHsgaW50IGk9NDI7fQoraW50IG1haW4gKCkKK3sKKyAgdm9pZCAqc2VsZiA9IGRsb3BlbiAoMCwgTFRfRExHTE9CQUx8TFRfRExMQVpZX09SX05PVyk7CisgIGludCBzdGF0dXMgPSAkbHRfZGx1bmtub3duOworCisgIGlmIChzZWxmKQorICAgIHsKKyAgICAgIGlmIChkbHN5bSAoc2VsZiwiZm5vcmQiKSkgICAgICAgc3RhdHVzID0gJGx0X2Rsbm9fdXNjb3JlOworICAgICAgZWxzZSBpZiAoZGxzeW0oIHNlbGYsIl9mbm9yZCIpKSBzdGF0dXMgPSAkbHRfZGxuZWVkX3VzY29yZTsKKyAgICAgIC8qIGRsY2xvc2UgKHNlbGYpOyAqLworICAgIH0KKworICAgIGV4aXQgKHN0YXR1cyk7Cit9CitFT0YKKyAgaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6NjY0NzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6NjY1MDogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gMj4vZGV2L251bGw7IHRoZW4KKyAgICAoLi9jb25mdGVzdDsgZXhpdDsgKSAyPi9kZXYvbnVsbAorICAgIGx0X3N0YXR1cz0kPworICAgIGNhc2UgeCRsdF9zdGF0dXMgaW4KKyAgICAgIHgkbHRfZGxub191c2NvcmUpIGx0X2N2X2Rsb3Blbl9zZWxmPXllcyA7OworICAgICAgeCRsdF9kbG5lZWRfdXNjb3JlKSBsdF9jdl9kbG9wZW5fc2VsZj15ZXMgOzsKKyAgICAgIHgkbHRfdW5rbm93bnx4KikgbHRfY3ZfZGxvcGVuX3NlbGY9bm8gOzsKKyAgICBlc2FjCisgIGVsc2UgOgorICAgICMgY29tcGlsYXRpb24gZmFpbGVkCisgICAgbHRfY3ZfZGxvcGVuX3NlbGY9bm8KKyAgZmkKK2ZpCitybSAtZnIgY29uZnRlc3QqCisKK2ZpCitlY2hvICIkYXNfbWU6NjY2NzogcmVzdWx0OiAkbHRfY3ZfZGxvcGVuX3NlbGYiID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X2N2X2Rsb3Blbl9zZWxmIiA+JjYKKworICAgIGlmIHRlc3QgIngkbHRfY3ZfZGxvcGVuX3NlbGYiID0geHllczsgdGhlbgorICAgICAgTERGTEFHUz0iJExERkxBR1MgJGxpbmtfc3RhdGljX2ZsYWciCisgICAgICBlY2hvICIkYXNfbWU6NjY3MjogY2hlY2tpbmcgd2hldGhlciBhIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIGEgc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZi4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7bHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIAkgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPWNyb3NzCitlbHNlCisgICAgbHRfZGx1bmtub3duPTA7IGx0X2Rsbm9fdXNjb3JlPTE7IGx0X2RsbmVlZF91c2NvcmU9MgorICBsdF9zdGF0dXM9JGx0X2RsdW5rbm93bgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA2NjgzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2lmIEhBVkVfRExGQ05fSAorI2luY2x1ZGUgPGRsZmNuLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZmRlZiBSVExEX0dMT0JBTAorIyAgZGVmaW5lIExUX0RMR0xPQkFMCQlSVExEX0dMT0JBTAorI2Vsc2UKKyMgIGlmZGVmIERMX0dMT0JBTAorIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCURMX0dMT0JBTAorIyAgZWxzZQorIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCTAKKyMgIGVuZGlmCisjZW5kaWYKKworLyogV2UgbWF5IGhhdmUgdG8gZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cgaW4gdGhlIGNvbW1hbmQgbGluZSBpZiB3ZQorICAgZmluZCBvdXQgaXQgZG9lcyBub3Qgd29yayBpbiBzb21lIHBsYXRmb3JtLiAqLworI2lmbmRlZiBMVF9ETExBWllfT1JfTk9XCisjICBpZmRlZiBSVExEX0xBWlkKKyMgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCVJUTERfTEFaWQorIyAgZWxzZQorIyAgICBpZmRlZiBETF9MQVpZCisjICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCURMX0xBWlkKKyMgICAgZWxzZQorIyAgICAgIGlmZGVmIFJUTERfTk9XCisjICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlSVExEX05PVworIyAgICAgIGVsc2UKKyMgICAgICAgIGlmZGVmIERMX05PVworIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlETF9OT1cKKyMgICAgICAgIGVsc2UKKyMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJMAorIyAgICAgICAgZW5kaWYKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgdm9pZCBleGl0IChpbnQpOworI2VuZGlmCisKK3ZvaWQgZm5vcmQoKSB7IGludCBpPTQyO30KK2ludCBtYWluICgpCit7CisgIHZvaWQgKnNlbGYgPSBkbG9wZW4gKDAsIExUX0RMR0xPQkFMfExUX0RMTEFaWV9PUl9OT1cpOworICBpbnQgc3RhdHVzID0gJGx0X2RsdW5rbm93bjsKKworICBpZiAoc2VsZikKKyAgICB7CisgICAgICBpZiAoZGxzeW0gKHNlbGYsImZub3JkIikpICAgICAgIHN0YXR1cyA9ICRsdF9kbG5vX3VzY29yZTsKKyAgICAgIGVsc2UgaWYgKGRsc3ltKCBzZWxmLCJfZm5vcmQiKSkgc3RhdHVzID0gJGx0X2RsbmVlZF91c2NvcmU7CisgICAgICAvKiBkbGNsb3NlIChzZWxmKTsgKi8KKyAgICB9CisKKyAgICBleGl0IChzdGF0dXMpOworfQorRU9GCisgIGlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjY3NDQ6IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjY3NDc6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9IDI+L2Rldi9udWxsOyB0aGVuCisgICAgKC4vY29uZnRlc3Q7IGV4aXQ7ICkgMj4vZGV2L251bGwKKyAgICBsdF9zdGF0dXM9JD8KKyAgICBjYXNlIHgkbHRfc3RhdHVzIGluCisgICAgICB4JGx0X2Rsbm9fdXNjb3JlKSBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9eWVzIDs7CisgICAgICB4JGx0X2RsbmVlZF91c2NvcmUpIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz15ZXMgOzsKKyAgICAgIHgkbHRfdW5rbm93bnx4KikgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPW5vIDs7CisgICAgZXNhYworICBlbHNlIDoKKyAgICAjIGNvbXBpbGF0aW9uIGZhaWxlZAorICAgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1ubworICBmaQorZmkKK3JtIC1mciBjb25mdGVzdCoKKworZmkKK2VjaG8gIiRhc19tZTo2NzY0OiByZXN1bHQ6ICRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyIgPiY2CisgICAgZmkKKworICAgIENQUEZMQUdTPSIkc2F2ZV9DUFBGTEFHUyIKKyAgICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgOzsKKyAgZXNhYworCisgIGNhc2UgJGx0X2N2X2Rsb3Blbl9zZWxmIGluCisgIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmPSRsdF9jdl9kbG9wZW5fc2VsZiA7OworICAqKSBlbmFibGVfZGxvcGVuX3NlbGY9dW5rbm93biA7OworICBlc2FjCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIGluCisgIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz0kbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIDs7CisgICopIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93biA7OworICBlc2FjCitmaQorCitpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgY2FzZSAkYXJjaGl2ZV9jbWRzIGluCisgIConficqKQorICAgICMgRklYTUU6IHdlIG1heSBoYXZlIHRvIGRlYWwgd2l0aCBtdWx0aS1jb21tYW5kIHNlcXVlbmNlcy4KKyAgICA7OworICAnJENDICcqKQorICAgICMgVGVzdCB3aGV0aGVyIHRoZSBjb21waWxlciBpbXBsaWNpdGx5IGxpbmtzIHdpdGggLWxjIHNpbmNlIG9uIHNvbWUKKyAgICAjIHN5c3RlbXMsIC1sZ2NjIGhhcyB0byBjb21lIGJlZm9yZSAtbGMuIElmIGdjYyBhbHJlYWR5IHBhc3NlcyAtbGMKKyAgICAjIHRvIGxkLCBkb24ndCBhZGQgLWxjIGJlZm9yZSAtbGdjYy4KKyAgICBlY2hvICIkYXNfbWU6Njc5NDogY2hlY2tpbmcgd2hldGhlciAtbGMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbGlua2VkIGluIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciAtbGMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbGlua2VkIGluLi4uICRFQ0hPX0MiID4mNgorICAgIGlmIHRlc3QgIiR7bHRfY3ZfYXJjaGl2ZV9jbWRzX25lZWRfbGMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgJHJtIGNvbmZ0ZXN0KgorICAgIGVjaG8gJ3N0YXRpYyBpbnQgZHVtbXk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKKworICAgIGlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjY4MDI6IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjY4MDU6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgorICAgICAgc29uYW1lPWNvbmZ0ZXN0CisgICAgICBsaWI9Y29uZnRlc3QKKyAgICAgIGxpYm9ianM9Y29uZnRlc3QuJGFjX29iamV4dAorICAgICAgZGVwbGlicz0KKyAgICAgIHdsPSRsdF9jdl9wcm9nX2NjX3dsCisgICAgICBjb21waWxlcl9mbGFncz0tdgorICAgICAgbGlua2VyX2ZsYWdzPS12CisgICAgICB2ZXJzdHJpbmc9CisgICAgICBvdXRwdXRfb2JqZGlyPS4KKyAgICAgIGxpYm5hbWU9Y29uZnRlc3QKKyAgICAgIHNhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGFsbG93X3VuZGVmaW5lZF9mbGFnCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0KKyAgICAgIGlmIHsgKGV2YWwgZWNobyAiJGFzX21lOjY4MTk6IFwiJGFyY2hpdmVfY21kcyAyXD5cJjEgXHwgZ3JlcCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxXCIiKSA+JjUKKyAgKGV2YWwgJGFyY2hpdmVfY21kcyAyXD5cJjEgXHwgZ3JlcCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6NjgyMjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9CisgICAgICB0aGVuCisJbHRfY3ZfYXJjaGl2ZV9jbWRzX25lZWRfbGM9bm8KKyAgICAgIGVsc2UKKwlsdF9jdl9hcmNoaXZlX2NtZHNfbmVlZF9sYz15ZXMKKyAgICAgIGZpCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0kc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZworICAgIGVsc2UKKyAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQorICAgIGZpCitmaQorCisgICAgZWNobyAiJGFzX21lOjY4MzU6IHJlc3VsdDogJGx0X2N2X2FyY2hpdmVfY21kc19uZWVkX2xjIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsdF9jdl9hcmNoaXZlX2NtZHNfbmVlZF9sYyIgPiY2CisgICAgOzsKKyAgZXNhYworZmkKK25lZWRfbGM9JHtsdF9jdl9hcmNoaXZlX2NtZHNfbmVlZF9sYy15ZXN9CisKKyMgVGhlIHNlY29uZCBjbGF1c2Ugc2hvdWxkIG9ubHkgZmlyZSB3aGVuIGJvb3RzdHJhcHBpbmcgdGhlCisjIGxpYnRvb2wgZGlzdHJpYnV0aW9uLCBvdGhlcndpc2UgeW91IGZvcmdvdCB0byBzaGlwIGx0bWFpbi5zaAorIyB3aXRoIHlvdXIgcGFja2FnZSwgYW5kIHlvdSB3aWxsIGdldCBjb21wbGFpbnRzIHRoYXQgdGhlcmUgYXJlCisjIG5vIHJ1bGVzIHRvIGdlbmVyYXRlIGx0bWFpbi5zaC4KK2lmIHRlc3QgLWYgIiRsdG1haW4iOyB0aGVuCisgIDoKK2Vsc2UKKyAgIyBJZiB0aGVyZSBpcyBubyBNYWtlZmlsZSB5ZXQsIHdlIHJlbHkgb24gYSBtYWtlIHJ1bGUgdG8gZXhlY3V0ZQorICAjIGBjb25maWcuc3RhdHVzIC0tcmVjaGVjaycgdG8gcmVydW4gdGhlc2UgdGVzdHMgYW5kIGNyZWF0ZSB0aGUKKyAgIyBsaWJ0b29sIHNjcmlwdCB0aGVuLgorICB0ZXN0IC1mIE1ha2VmaWxlICYmIG1ha2UgIiRsdG1haW4iCitmaQorCitpZiB0ZXN0IC1mICIkbHRtYWluIjsgdGhlbgorICB0cmFwICIkcm0gXCIke29maWxlfVRcIjsgZXhpdCAxIiAxIDIgMTUKKyAgJHJtIC1mICIke29maWxlfVQiCisKKyAgZWNobyBjcmVhdGluZyAkb2ZpbGUKKworICAjIE5vdyBxdW90ZSBhbGwgdGhlIHRoaW5ncyB0aGF0IG1heSBjb250YWluIG1ldGFjaGFyYWN0ZXJzIHdoaWxlIGJlaW5nCisgICMgY2FyZWZ1bCBub3QgdG8gb3ZlcnF1b3RlIHRoZSBBQ19TVUJTVGVkIHZhbHVlcy4gIFdlIHRha2UgY29waWVzIG9mIHRoZQorICAjIHZhcmlhYmxlcyBhbmQgcXVvdGUgdGhlIGNvcGllcyBmb3IgZ2VuZXJhdGlvbiBvZiB0aGUgbGlidG9vbCBzY3JpcHQuCisgIGZvciB2YXIgaW4gZWNobyBvbGRfQ0Mgb2xkX0NGTEFHUyBcCisgICAgQVIgQVJfRkxBR1MgQVMgQ0MgTEQgTE5fUyBOTSBTSEVMTCBcCisgICAgcmVsb2FkX2ZsYWcgcmVsb2FkX2NtZHMgd2wgXAorICAgIHBpY19mbGFnIGxpbmtfc3RhdGljX2ZsYWcgbm9fYnVpbHRpbl9mbGFnIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYyBcCisgICAgdGhyZWFkX3NhZmVfZmxhZ19zcGVjIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIGxpYm5hbWVfc3BlYyBcCisgICAgbGlicmFyeV9uYW1lc19zcGVjIHNvbmFtZV9zcGVjIFwKKyAgICBSQU5MSUIgb2xkX2FyY2hpdmVfY21kcyBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIG9sZF9wb3N0aW5zdGFsbF9jbWRzIFwKKyAgICBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIGFyY2hpdmVfY21kcyBhcmNoaXZlX2V4cHN5bV9jbWRzIHBvc3RpbnN0YWxsX2NtZHMgXAorICAgIHBvc3R1bmluc3RhbGxfY21kcyBleHRyYWN0X2V4cHN5bXNfY21kcyBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcyBcCisgICAgb2xkX3N0cmlwbGliIHN0cmlwbGliIGZpbGVfbWFnaWNfY21kIGV4cG9ydF9zeW1ib2xzX2NtZHMgXAorICAgIGRlcGxpYnNfY2hlY2tfbWV0aG9kIGFsbG93X3VuZGVmaW5lZF9mbGFnIG5vX3VuZGVmaW5lZF9mbGFnIFwKKyAgICBmaW5pc2hfY21kcyBmaW5pc2hfZXZhbCBnbG9iYWxfc3ltYm9sX3BpcGUgZ2xvYmFsX3N5bWJvbF90b19jZGVjbCBcCisgICAgZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcyBcCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yICBcCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjIFwKKyAgICBjb21waWxlcl9jX28gY29tcGlsZXJfb19sbyBuZWVkX2xvY2tzIGV4Y2x1ZGVfZXhwc3ltcyBpbmNsdWRlX2V4cHN5bXM7IGRvCisKKyAgICBjYXNlICR2YXIgaW4KKyAgICByZWxvYWRfY21kcyB8IG9sZF9hcmNoaXZlX2NtZHMgfCBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIHwgXAorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIHwgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyB8IFwKKyAgICBleHBvcnRfc3ltYm9sc19jbWRzIHwgYXJjaGl2ZV9jbWRzIHwgYXJjaGl2ZV9leHBzeW1fY21kcyB8IFwKKyAgICBleHRyYWN0X2V4cHN5bXNfY21kcyB8IG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzIHwgXAorICAgIHBvc3RpbnN0YWxsX2NtZHMgfCBwb3N0dW5pbnN0YWxsX2NtZHMgfCBcCisgICAgZmluaXNoX2NtZHMgfCBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgfCBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYykKKyAgICAgICMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KKyAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRkb3VibGVfcXVvdGVfc3Vic3RcIiAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCIgLWUgXCJcJGRlbGF5X3ZhcmlhYmxlX3N1YnN0XCJcYFxcXCIiCisgICAgICA7OworICAgICopCisgICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCJcYFxcXCIiCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorCisgIGNhdCA8PF9fRU9GX18gPiAiJHtvZmlsZX1UIgorIyEgJFNIRUxMCisKKyMgYCRlY2hvICIkb2ZpbGUiIHwgc2VkICdzJV4uKi8lJSdgIC0gUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5ICRQUk9HUkFNIChHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QKQorIyBOT1RFOiBDaGFuZ2VzIG1hZGUgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdDogbG9vayBhdCBsdG1haW4uc2guCisjCisjIENvcHlyaWdodCAoQykgMTk5Ni0yMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBPcmlnaW5hbGx5IGJ5IEdvcmRvbiBNYXR6aWdrZWl0IDxnb3JkQGdudS5haS5taXQuZWR1PiwgMTk5NgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKKyMgU2VkIHRoYXQgaGVscHMgdXMgYXZvaWQgYWNjaWRlbnRhbGx5IHRyaWdnZXJpbmcgZWNobygxKSBvcHRpb25zIGxpa2UgLW4uCitYc2VkPSJzZWQgLWUgcy9eWC8vIgorCisjIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAorIyBpZiBDRFBBVEggaXMgc2V0LgoraWYgdGVzdCAiWFwke0NEUEFUSCtzZXR9IiA9IFhzZXQ7IHRoZW4gQ0RQQVRIPTo7IGV4cG9ydCBDRFBBVEg7IGZpCisKKyMgIyMjIEJFR0lOIExJQlRPT0wgQ09ORklHCisKKyMgTGlidG9vbCB3YXMgY29uZmlndXJlZCBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKKworIyBTaGVsbCB0byB1c2Ugd2hlbiBpbnZva2luZyBzaGVsbCBzY3JpcHRzLgorU0hFTEw9JGx0X1NIRUxMCisKKyMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4KK2J1aWxkX2xpYnRvb2xfbGlicz0kZW5hYmxlX3NoYXJlZAorCisjIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuCitidWlsZF9vbGRfbGlicz0kZW5hYmxlX3N0YXRpYworCisjIFdoZXRoZXIgb3Igbm90IHRvIGFkZCAtbGMgZm9yIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCitidWlsZF9saWJ0b29sX25lZWRfbGM9JG5lZWRfbGMKKworIyBXaGV0aGVyIG9yIG5vdCB0byBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24uCitmYXN0X2luc3RhbGw9JGVuYWJsZV9mYXN0X2luc3RhbGwKKworIyBUaGUgaG9zdCBzeXN0ZW0uCitob3N0X2FsaWFzPSRob3N0X2FsaWFzCitob3N0PSRob3N0CisKKyMgQW4gZWNobyBwcm9ncmFtIHRoYXQgZG9lcyBub3QgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgorZWNobz0kbHRfZWNobworCisjIFRoZSBhcmNoaXZlci4KK0FSPSRsdF9BUgorQVJfRkxBR1M9JGx0X0FSX0ZMQUdTCisKKyMgVGhlIGRlZmF1bHQgQyBjb21waWxlci4KK0NDPSRsdF9DQworCisjIElzIHRoZSBjb21waWxlciB0aGUgR05VIEMgY29tcGlsZXI/Cit3aXRoX2djYz0kR0NDCisKKyMgVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllcy4KK0xEPSRsdF9MRAorCisjIFdoZXRoZXIgd2UgbmVlZCBoYXJkIG9yIHNvZnQgbGlua3MuCitMTl9TPSRsdF9MTl9TCisKKyMgQSBCU0QtY29tcGF0aWJsZSBubSBwcm9ncmFtLgorTk09JGx0X05NCisKKyMgQSBzeW1ib2wgc3RyaXBwaW5nIHByb2dyYW0KK1NUUklQPSRTVFJJUAorCisjIFVzZWQgdG8gZXhhbWluZSBsaWJyYXJpZXMgd2hlbiBmaWxlX21hZ2ljX2NtZCBiZWdpbnMgImZpbGUiCitNQUdJQ19DTUQ9JE1BR0lDX0NNRAorCisjIFVzZWQgb24gY3lnd2luOiBETEwgY3JlYXRpb24gcHJvZ3JhbS4KK0RMTFRPT0w9IiRETExUT09MIgorCisjIFVzZWQgb24gY3lnd2luOiBvYmplY3QgZHVtcGVyLgorT0JKRFVNUD0iJE9CSkRVTVAiCisKKyMgVXNlZCBvbiBjeWd3aW46IGFzc2VtYmxlci4KK0FTPSRsdF9BUworCisjIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlcy4KK29iamRpcj0kb2JqZGlyCisKKyMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KK3JlbG9hZF9mbGFnPSRsdF9yZWxvYWRfZmxhZworcmVsb2FkX2NtZHM9JGx0X3JlbG9hZF9jbWRzCisKKyMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KK3dsPSRsdF93bAorCisjIE9iamVjdCBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIm8iKS4KK29iamV4dD0iJGFjX29iamV4dCIKKworIyBPbGQgYXJjaGl2ZSBzdWZmaXggKG5vcm1hbGx5ICJhIikuCitsaWJleHQ9IiRsaWJleHQiCisKKyMgRXhlY3V0YWJsZSBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIiIpLgorZXhlZXh0PSIkZXhlZXh0IgorCisjIEFkZGl0aW9uYWwgY29tcGlsZXIgZmxhZ3MgZm9yIGJ1aWxkaW5nIGxpYnJhcnkgb2JqZWN0cy4KK3BpY19mbGFnPSRsdF9waWNfZmxhZworcGljX21vZGU9JHBpY19tb2RlCisKKyMgRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zPworY29tcGlsZXJfY19vPSRsdF9jb21waWxlcl9jX28KKworIyBDYW4gd2Ugd3JpdGUgZGlyZWN0bHkgdG8gYSAubG8gPworY29tcGlsZXJfb19sbz0kbHRfY29tcGlsZXJfb19sbworCisjIE11c3Qgd2UgbG9jayBmaWxlcyB3aGVuIGRvaW5nIGNvbXBpbGF0aW9uID8KK25lZWRfbG9ja3M9JGx0X25lZWRfbG9ja3MKKworIyBEbyB3ZSBuZWVkIHRoZSBsaWIgcHJlZml4IGZvciBtb2R1bGVzPworbmVlZF9saWJfcHJlZml4PSRuZWVkX2xpYl9wcmVmaXgKKworIyBEbyB3ZSBuZWVkIGEgdmVyc2lvbiBmb3IgbGlicmFyaWVzPworbmVlZF92ZXJzaW9uPSRuZWVkX3ZlcnNpb24KKworIyBXaGV0aGVyIGRsb3BlbiBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc3VwcG9ydD0kZW5hYmxlX2Rsb3BlbgorCisjIFdoZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KK2Rsb3Blbl9zZWxmPSRlbmFibGVfZGxvcGVuX3NlbGYKKworIyBXaGV0aGVyIGRsb3BlbiBvZiBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc2VsZl9zdGF0aWM9JGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWMKKworIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgorbGlua19zdGF0aWNfZmxhZz0kbHRfbGlua19zdGF0aWNfZmxhZworCisjIENvbXBpbGVyIGZsYWcgdG8gdHVybiBvZmYgYnVpbHRpbiBmdW5jdGlvbnMuCitub19idWlsdGluX2ZsYWc9JGx0X25vX2J1aWx0aW5fZmxhZworCisjIENvbXBpbGVyIGZsYWcgdG8gYWxsb3cgcmVmbGV4aXZlIGRsb3BlbnMuCitleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JGx0X2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlYworCisjIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlcy4KK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSRsdF93aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYworCisjIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgdGhyZWFkLXNhZmUgb2JqZWN0cy4KK3RocmVhZF9zYWZlX2ZsYWdfc3BlYz0kbHRfdGhyZWFkX3NhZmVfZmxhZ19zcGVjCisKKyMgTGlicmFyeSB2ZXJzaW9uaW5nIHR5cGUuCit2ZXJzaW9uX3R5cGU9JHZlcnNpb25fdHlwZQorCisjIEZvcm1hdCBvZiBsaWJyYXJ5IG5hbWUgcHJlZml4LgorbGlibmFtZV9zcGVjPSRsdF9saWJuYW1lX3NwZWMKKworIyBMaXN0IG9mIGFyY2hpdmUgbmFtZXMuICBGaXJzdCBuYW1lIGlzIHRoZSByZWFsIG9uZSwgdGhlIHJlc3QgYXJlIGxpbmtzLgorIyBUaGUgbGFzdCBuYW1lIGlzIHRoZSBvbmUgdGhhdCB0aGUgbGlua2VyIGZpbmRzIHdpdGggLWxOQU1FLgorbGlicmFyeV9uYW1lc19zcGVjPSRsdF9saWJyYXJ5X25hbWVzX3NwZWMKKworIyBUaGUgY29kZWQgbmFtZSBvZiB0aGUgbGlicmFyeSwgaWYgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgbmFtZS4KK3NvbmFtZV9zcGVjPSRsdF9zb25hbWVfc3BlYworCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYW4gb2xkLXN0eWxlIGFyY2hpdmUuCitSQU5MSUI9JGx0X1JBTkxJQgorb2xkX2FyY2hpdmVfY21kcz0kbHRfb2xkX2FyY2hpdmVfY21kcworb2xkX3Bvc3RpbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0aW5zdGFsbF9jbWRzCitvbGRfcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdHVuaW5zdGFsbF9jbWRzCisKKyMgQ3JlYXRlIGFuIG9sZC1zdHlsZSBhcmNoaXZlIGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KK29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMKKworIyBDcmVhdGUgYSB0ZW1wb3Jhcnkgb2xkLXN0eWxlIGFyY2hpdmUgdG8gbGluayBpbnN0ZWFkIG9mIGEgc2hhcmVkIGFyY2hpdmUuCitvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGEgc2hhcmVkIGFyY2hpdmUuCithcmNoaXZlX2NtZHM9JGx0X2FyY2hpdmVfY21kcworYXJjaGl2ZV9leHBzeW1fY21kcz0kbHRfYXJjaGl2ZV9leHBzeW1fY21kcworcG9zdGluc3RhbGxfY21kcz0kbHRfcG9zdGluc3RhbGxfY21kcworcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9wb3N0dW5pbnN0YWxsX2NtZHMKKworIyBDb21tYW5kcyB0byBzdHJpcCBsaWJyYXJpZXMuCitvbGRfc3RyaXBsaWI9JGx0X29sZF9zdHJpcGxpYgorc3RyaXBsaWI9JGx0X3N0cmlwbGliCisKKyMgTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgZGVwZW5kZW50IGxpYnJhcmllcyBhcmUgc2hhcmVkIG9iamVjdHMuCitkZXBsaWJzX2NoZWNrX21ldGhvZD0kbHRfZGVwbGlic19jaGVja19tZXRob2QKKworIyBDb21tYW5kIHRvIHVzZSB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID09IGZpbGVfbWFnaWMuCitmaWxlX21hZ2ljX2NtZD0kbHRfZmlsZV9tYWdpY19jbWQKKworIyBGbGFnIHRoYXQgYWxsb3dzIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB1bmRlZmluZWQgc3ltYm9scyB0byBiZSBidWlsdC4KK2FsbG93X3VuZGVmaW5lZF9mbGFnPSRsdF9hbGxvd191bmRlZmluZWRfZmxhZworCisjIEZsYWcgdGhhdCBmb3JjZXMgbm8gdW5kZWZpbmVkIHN5bWJvbHMuCitub191bmRlZmluZWRfZmxhZz0kbHRfbm9fdW5kZWZpbmVkX2ZsYWcKKworIyBDb21tYW5kcyB1c2VkIHRvIGZpbmlzaCBhIGxpYnRvb2wgbGlicmFyeSBpbnN0YWxsYXRpb24gaW4gYSBkaXJlY3RvcnkuCitmaW5pc2hfY21kcz0kbHRfZmluaXNoX2NtZHMKKworIyBTYW1lIGFzIGFib3ZlLCBidXQgYSBzaW5nbGUgc2NyaXB0IGZyYWdtZW50IHRvIGJlIGV2YWxlZCBidXQgbm90IHNob3duLgorZmluaXNoX2V2YWw9JGx0X2ZpbmlzaF9ldmFsCisKKyMgVGFrZSB0aGUgb3V0cHV0IG9mIG5tIGFuZCBwcm9kdWNlIGEgbGlzdGluZyBvZiByYXcgc3ltYm9scyBhbmQgQyBuYW1lcy4KK2dsb2JhbF9zeW1ib2xfcGlwZT0kbHRfZ2xvYmFsX3N5bWJvbF9waXBlCisKKyMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgorZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0kbHRfZ2xvYmFsX3N5bWJvbF90b19jZGVjbAorCisjIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpcgorZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0kbHRfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcworCisjIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHJ1bnRpbWUgcGF0aCB2YXJpYWJsZS4KK3J1bnBhdGhfdmFyPSRydW5wYXRoX3ZhcgorCisjIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHBhdGggdmFyaWFibGUuCitzaGxpYnBhdGhfdmFyPSRzaGxpYnBhdGhfdmFyCisKKyMgSXMgc2hsaWJwYXRoIHNlYXJjaGVkIGJlZm9yZSB0aGUgaGFyZC1jb2RlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoPworc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPSRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgKKworIyBIb3cgdG8gaGFyZGNvZGUgYSBzaGFyZWQgbGlicmFyeSBwYXRoIGludG8gYW4gZXhlY3V0YWJsZS4KK2hhcmRjb2RlX2FjdGlvbj0kaGFyZGNvZGVfYWN0aW9uCisKKyMgV2hldGhlciB3ZSBzaG91bGQgaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIGxpYnJhcmllcy4KK2hhcmRjb2RlX2ludG9fbGlicz0kaGFyZGNvZGVfaW50b19saWJzCisKKyMgRmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgorIyBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0LgoraGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYworCisjIFdoZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAtcnBhdGggZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgoraGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0kbHRfaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcgorCisjIFNldCB0byB5ZXMgaWYgdXNpbmcgRElSL2xpYk5BTUUuc28gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQorIyByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfZGlyZWN0PSRoYXJkY29kZV9kaXJlY3QKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIHRoZSAtTERJUiBmbGFnIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKKyMgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX21pbnVzX0w9JGhhcmRjb2RlX21pbnVzX0wKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIFNITElCUEFUSF9WQVI9RElSIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50bworIyB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX3NobGlicGF0aF92YXI9JGhhcmRjb2RlX3NobGlicGF0aF92YXIKKworIyBWYXJpYWJsZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBzYXZlZCBpbiBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0cyBhbmQKKyMgcmVzdG9yZWQgYXQgcmVsaW5rIHRpbWUuCit2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIgorCisjIFdoZXRoZXIgbGlidG9vbCBtdXN0IGxpbmsgYSBwcm9ncmFtIGFnYWluc3QgYWxsIGl0cyBkZXBlbmRlbmN5IGxpYnJhcmllcy4KK2xpbmtfYWxsX2RlcGxpYnM9JGxpbmtfYWxsX2RlcGxpYnMKKworIyBDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKK3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisKKyMgUnVuLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRsdF9zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYworCisjIEZpeCB0aGUgc2hlbGwgdmFyaWFibGUgXCRzcmNmaWxlIGZvciB0aGUgY29tcGlsZXIuCitmaXhfc3JjZmlsZV9wYXRoPSIkZml4X3NyY2ZpbGVfcGF0aCIKKworIyBTZXQgdG8geWVzIGlmIGV4cG9ydGVkIHN5bWJvbHMgYXJlIHJlcXVpcmVkLgorYWx3YXlzX2V4cG9ydF9zeW1ib2xzPSRhbHdheXNfZXhwb3J0X3N5bWJvbHMKKworIyBUaGUgY29tbWFuZHMgdG8gbGlzdCBleHBvcnRlZCBzeW1ib2xzLgorZXhwb3J0X3N5bWJvbHNfY21kcz0kbHRfZXhwb3J0X3N5bWJvbHNfY21kcworCisjIFRoZSBjb21tYW5kcyB0byBleHRyYWN0IHRoZSBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCitleHRyYWN0X2V4cHN5bXNfY21kcz0kbHRfZXh0cmFjdF9leHBzeW1zX2NtZHMKKworIyBTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzLgorZXhjbHVkZV9leHBzeW1zPSRsdF9leGNsdWRlX2V4cHN5bXMKKworIyBTeW1ib2xzIHRoYXQgbXVzdCBhbHdheXMgYmUgZXhwb3J0ZWQuCitpbmNsdWRlX2V4cHN5bXM9JGx0X2luY2x1ZGVfZXhwc3ltcworCisjICMjIyBFTkQgTElCVE9PTCBDT05GSUcKKworX19FT0ZfXworCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4MyopCisgICAgY2F0IDw8XEVPRiA+PiAiJHtvZmlsZX1UIgorCisjIEFJWCBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhlIEdDQyBjb2xsZWN0MiBwcm9ncmFtLiAgRm9yIHNvbWUKKyMgcmVhc29uLCBpZiB3ZSBzZXQgdGhlIENPTExFQ1RfTkFNRVMgZW52aXJvbm1lbnQgdmFyaWFibGUsIHRoZSBwcm9ibGVtcworIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgoraWYgdGVzdCAiWCR7Q09MTEVDVF9OQU1FUytzZXR9IiAhPSBYc2V0OyB0aGVuCisgIENPTExFQ1RfTkFNRVM9CisgIGV4cG9ydCBDT0xMRUNUX05BTUVTCitmaQorRU9GCisgICAgOzsKKyAgZXNhYworCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgb3MyKikKKyAgICBjYXQgPDwnRU9GJyA+PiAiJHtvZmlsZX1UIgorICAgICAgIyBUaGlzIGlzIGEgc291cmNlIHByb2dyYW0gdGhhdCBpcyB1c2VkIHRvIGNyZWF0ZSBkbGxzIG9uIFdpbmRvd3MKKyAgICAgICMgRG9uJ3QgcmVtb3ZlIG5vciBtb2RpZnkgdGhlIHN0YXJ0aW5nIGFuZCBjbG9zaW5nIGNvbW1lbnRzCisjIC8qIGx0ZGxsLmMgc3RhcnRzIGhlcmUgKi8KKyMgI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjICNpbmNsdWRlIDx3aW5kb3dzLmg+CisjICN1bmRlZiBXSU4zMl9MRUFOX0FORF9NRUFOCisjICNpbmNsdWRlIDxzdGRpby5oPgorIworIyAjaWZuZGVmIF9fQ1lHV0lOX18KKyMgIyAgaWZkZWYgX19DWUdXSU4zMl9fCisjICMgICAgZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCisjICMgIGVuZGlmCisjICNlbmRpZgorIworIyAjaWZkZWYgX19jcGx1c3BsdXMKKyMgZXh0ZXJuICJDIiB7CisjICNlbmRpZgorIyBCT09MIEFQSUVOVFJZIERsbE1haW4gKEhJTlNUQU5DRSBoSW5zdCwgRFdPUkQgcmVhc29uLCBMUFZPSUQgcmVzZXJ2ZWQpOworIyAjaWZkZWYgX19jcGx1c3BsdXMKKyMgfQorIyAjZW5kaWYKKyMKKyMgI2lmZGVmIF9fQ1lHV0lOX18KKyMgI2luY2x1ZGUgPGN5Z3dpbi9jeWd3aW5fZGxsLmg+CisjIERFQ0xBUkVfQ1lHV0lOX0RMTCggRGxsTWFpbiApOworIyAjZW5kaWYKKyMgSElOU1RBTkNFIF9faERsbEluc3RhbmNlX2Jhc2U7CisjCisjIEJPT0wgQVBJRU5UUlkKKyMgRGxsTWFpbiAoSElOU1RBTkNFIGhJbnN0LCBEV09SRCByZWFzb24sIExQVk9JRCByZXNlcnZlZCkKKyMgeworIyAgIF9faERsbEluc3RhbmNlX2Jhc2UgPSBoSW5zdDsKKyMgICByZXR1cm4gVFJVRTsKKyMgfQorIyAvKiBsdGRsbC5jIGVuZHMgaGVyZSAqLworCSMgVGhpcyBpcyBhIHNvdXJjZSBwcm9ncmFtIHRoYXQgaXMgdXNlZCB0byBjcmVhdGUgaW1wb3J0IGxpYnJhcmllcworCSMgb24gV2luZG93cyBmb3IgZGxscyB3aGljaCBsYWNrIHRoZW0uIERvbid0IHJlbW92ZSBub3IgbW9kaWZ5IHRoZQorCSMgc3RhcnRpbmcgYW5kIGNsb3NpbmcgY29tbWVudHMKKyMgLyogaW1wZ2VuLmMgc3RhcnRzIGhlcmUgKi8KKyMgLyogICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBsaWJ0b29sLgorIworIyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisjICAqLworIworIyAjaW5jbHVkZSA8c3RkaW8uaD4JCS8qIGZvciBwcmludGYoKSAqLworIyAjaW5jbHVkZSA8dW5pc3RkLmg+CQkvKiBmb3Igb3BlbigpLCBsc2VlaygpLCByZWFkKCkgKi8KKyMgI2luY2x1ZGUgPGZjbnRsLmg+CQkvKiBmb3IgT19SRE9OTFksIE9fQklOQVJZICovCisjICNpbmNsdWRlIDxzdHJpbmcuaD4JCS8qIGZvciBzdHJkdXAoKSAqLworIworIyAvKiBPX0JJTkFSWSBpc24ndCByZXF1aXJlZCAob3IgZXZlbiBkZWZpbmVkIHNvbWV0aW1lcykgdW5kZXIgVW5peCAqLworIyAjaWZuZGVmIE9fQklOQVJZCisjICNkZWZpbmUgT19CSU5BUlkgMAorIyAjZW5kaWYKKyMKKyMgc3RhdGljIHVuc2lnbmVkIGludAorIyBwZV9nZXQxNiAoZmQsIG9mZnNldCkKKyMgICAgICBpbnQgZmQ7CisjICAgICAgaW50IG9mZnNldDsKKyMgeworIyAgIHVuc2lnbmVkIGNoYXIgYlsyXTsKKyMgICBsc2VlayAoZmQsIG9mZnNldCwgU0VFS19TRVQpOworIyAgIHJlYWQgKGZkLCBiLCAyKTsKKyMgICByZXR1cm4gYlswXSArIChiWzFdPDw4KTsKKyMgfQorIworIyBzdGF0aWMgdW5zaWduZWQgaW50CisjIHBlX2dldDMyIChmZCwgb2Zmc2V0KQorIyAgICAgaW50IGZkOworIyAgICAgaW50IG9mZnNldDsKKyMgeworIyAgIHVuc2lnbmVkIGNoYXIgYls0XTsKKyMgICBsc2VlayAoZmQsIG9mZnNldCwgU0VFS19TRVQpOworIyAgIHJlYWQgKGZkLCBiLCA0KTsKKyMgICByZXR1cm4gYlswXSArIChiWzFdPDw4KSArIChiWzJdPDwxNikgKyAoYlszXTw8MjQpOworIyB9CisjCisjIHN0YXRpYyB1bnNpZ25lZCBpbnQKKyMgcGVfYXMzMiAocHRyKQorIyAgICAgIHZvaWQgKnB0cjsKKyMgeworIyAgIHVuc2lnbmVkIGNoYXIgKmIgPSBwdHI7CisjICAgcmV0dXJuIGJbMF0gKyAoYlsxXTw8OCkgKyAoYlsyXTw8MTYpICsgKGJbM108PDI0KTsKKyMgfQorIworIyBpbnQKKyMgbWFpbiAoYXJnYywgYXJndikKKyMgICAgIGludCBhcmdjOworIyAgICAgY2hhciAqYXJndltdOworIyB7CisjICAgICBpbnQgZGxsOworIyAgICAgdW5zaWduZWQgbG9uZyBwZV9oZWFkZXJfb2Zmc2V0LCBvcHRoZHJfb2ZzLCBudW1fZW50cmllcywgaTsKKyMgICAgIHVuc2lnbmVkIGxvbmcgZXhwb3J0X3J2YSwgZXhwb3J0X3NpemUsIG5zZWN0aW9ucywgc2VjcHRyLCBleHBwdHI7CisjICAgICB1bnNpZ25lZCBsb25nIG5hbWVfcnZhcywgbmV4cDsKKyMgICAgIHVuc2lnbmVkIGNoYXIgKmV4cGRhdGEsICplcnZhOworIyAgICAgY2hhciAqZmlsZW5hbWUsICpkbGxfbmFtZTsKKyMKKyMgICAgIGZpbGVuYW1lID0gYXJndlsxXTsKKyMKKyMgICAgIGRsbCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZfE9fQklOQVJZKTsKKyMgICAgIGlmIChkbGwgPCAxKQorIyAJcmV0dXJuIDE7CisjCisjICAgICBkbGxfbmFtZSA9IGZpbGVuYW1lOworIworIyAgICAgZm9yIChpPTA7IGZpbGVuYW1lW2ldOyBpKyspCisjIAlpZiAoZmlsZW5hbWVbaV0gPT0gJy8nIHx8IGZpbGVuYW1lW2ldID09ICdcXCcgIHx8IGZpbGVuYW1lW2ldID09ICc6JykKKyMgCSAgICBkbGxfbmFtZSA9IGZpbGVuYW1lICsgaSArMTsKKyMKKyMgICAgIHBlX2hlYWRlcl9vZmZzZXQgPSBwZV9nZXQzMiAoZGxsLCAweDNjKTsKKyMgICAgIG9wdGhkcl9vZnMgPSBwZV9oZWFkZXJfb2Zmc2V0ICsgNCArIDIwOworIyAgICAgbnVtX2VudHJpZXMgPSBwZV9nZXQzMiAoZGxsLCBvcHRoZHJfb2ZzICsgOTIpOworIworIyAgICAgaWYgKG51bV9lbnRyaWVzIDwgMSkgLyogbm8gZXhwb3J0cyAqLworIyAJcmV0dXJuIDE7CisjCisjICAgICBleHBvcnRfcnZhID0gcGVfZ2V0MzIgKGRsbCwgb3B0aGRyX29mcyArIDk2KTsKKyMgICAgIGV4cG9ydF9zaXplID0gcGVfZ2V0MzIgKGRsbCwgb3B0aGRyX29mcyArIDEwMCk7CisjICAgICBuc2VjdGlvbnMgPSBwZV9nZXQxNiAoZGxsLCBwZV9oZWFkZXJfb2Zmc2V0ICsgNCArMik7CisjICAgICBzZWNwdHIgPSAocGVfaGVhZGVyX29mZnNldCArIDQgKyAyMCArCisjIAkgICAgICBwZV9nZXQxNiAoZGxsLCBwZV9oZWFkZXJfb2Zmc2V0ICsgNCArIDE2KSk7CisjCisjICAgICBleHBwdHIgPSAwOworIyAgICAgZm9yIChpID0gMDsgaSA8IG5zZWN0aW9uczsgaSsrKQorIyAgICAgeworIyAJY2hhciBzbmFtZVs4XTsKKyMgCXVuc2lnbmVkIGxvbmcgc2VjcHRyMSA9IHNlY3B0ciArIDQwICogaTsKKyMgCXVuc2lnbmVkIGxvbmcgdmFkZHIgPSBwZV9nZXQzMiAoZGxsLCBzZWNwdHIxICsgMTIpOworIyAJdW5zaWduZWQgbG9uZyB2c2l6ZSA9IHBlX2dldDMyIChkbGwsIHNlY3B0cjEgKyAxNik7CisjIAl1bnNpZ25lZCBsb25nIGZwdHIgPSBwZV9nZXQzMiAoZGxsLCBzZWNwdHIxICsgMjApOworIyAJbHNlZWsoZGxsLCBzZWNwdHIxLCBTRUVLX1NFVCk7CisjIAlyZWFkKGRsbCwgc25hbWUsIDgpOworIyAJaWYgKHZhZGRyIDw9IGV4cG9ydF9ydmEgJiYgdmFkZHIrdnNpemUgPiBleHBvcnRfcnZhKQorIyAJeworIyAJICAgIGV4cHB0ciA9IGZwdHIgKyAoZXhwb3J0X3J2YSAtIHZhZGRyKTsKKyMgCSAgICBpZiAoZXhwb3J0X3J2YSArIGV4cG9ydF9zaXplID4gdmFkZHIgKyB2c2l6ZSkKKyMgCQlleHBvcnRfc2l6ZSA9IHZzaXplIC0gKGV4cG9ydF9ydmEgLSB2YWRkcik7CisjIAkgICAgYnJlYWs7CisjIAl9CisjICAgICB9CisjCisjICAgICBleHBkYXRhID0gKHVuc2lnbmVkIGNoYXIqKW1hbGxvYyhleHBvcnRfc2l6ZSk7CisjICAgICBsc2VlayAoZGxsLCBleHBwdHIsIFNFRUtfU0VUKTsKKyMgICAgIHJlYWQgKGRsbCwgZXhwZGF0YSwgZXhwb3J0X3NpemUpOworIyAgICAgZXJ2YSA9IGV4cGRhdGEgLSBleHBvcnRfcnZhOworIworIyAgICAgbmV4cCA9IHBlX2FzMzIgKGV4cGRhdGErMjQpOworIyAgICAgbmFtZV9ydmFzID0gcGVfYXMzMiAoZXhwZGF0YSszMik7CisjCisjICAgICBwcmludGYgKCJFWFBPUlRTXG4iKTsKKyMgICAgIGZvciAoaSA9IDA7IGk8bmV4cDsgaSsrKQorIyAgICAgeworIyAJdW5zaWduZWQgbG9uZyBuYW1lX3J2YSA9IHBlX2FzMzIgKGVydmErbmFtZV9ydmFzK2kqNCk7CisjIAlwcmludGYgKCJcdCVzIEAgJWxkIDtcbiIsIGVydmErbmFtZV9ydmEsIDErIGkpOworIyAgICAgfQorIworIyAgICAgcmV0dXJuIDA7CisjIH0KKyMgLyogaW1wZ2VuLmMgZW5kcyBoZXJlICovCisKK0VPRgorICAgIDs7CisgIGVzYWMKKworICAjIFdlIHVzZSBzZWQgaW5zdGVhZCBvZiBjYXQgYmVjYXVzZSBiYXNoIG9uIERKR1BQIGdldHMgY29uZnVzZWQgaWYKKyAgIyBpZiBmaW5kcyBtaXhlZCBDUi9MRiBhbmQgTEYtb25seSBsaW5lcy4gIFNpbmNlIHNlZCBvcGVyYXRlcyBpbgorICAjIHRleHQgbW9kZSwgaXQgcHJvcGVybHkgY29udmVydHMgbGluZXMgdG8gQ1IvTEYuICBUaGlzIGJhc2ggcHJvYmxlbQorICAjIGlzIHJlcG9ydGVkbHkgZml4ZWQsIGJ1dCB3aHkgbm90IHJ1biBvbiBvbGQgdmVyc2lvbnMgdG9vPworICBzZWQgJyRxJyAiJGx0bWFpbiIgPj4gIiR7b2ZpbGV9VCIgfHwgKHJtIC1mICIke29maWxlfVQiOyBleGl0IDEpCisKKyAgbXYgLWYgIiR7b2ZpbGV9VCIgIiRvZmlsZSIgfHwgXAorICAgIChybSAtZiAiJG9maWxlIiAmJiBjcCAiJHtvZmlsZX1UIiAiJG9maWxlIiAmJiBybSAtZiAiJHtvZmlsZX1UIikKKyAgY2htb2QgK3ggIiRvZmlsZSIKK2ZpCisKKyMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKK0xJQlRPT0xfREVQUz0iJGFjX2F1eF9kaXIvbHRtYWluLnNoIgorCisjIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgorTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCisKKyMgUHJldmVudCBtdWx0aXBsZSBleHBhbnNpb24KKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNoYXJlZCBvciAtLWRpc2FibGUtc2hhcmVkIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NoYXJlZCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2hhcmVkIgorICBwPSR7UEFDS0FHRS1kZWZhdWx0fQorY2FzZSAkZW5hYmxldmFsIGluCit5ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7CitubykgZW5hYmxlX3NoYXJlZD1ubyA7OworKikKKyAgZW5hYmxlX3NoYXJlZD1ubworICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgorICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisgICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKyAgICAgIGVuYWJsZV9zaGFyZWQ9eWVzCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgOzsKK2VzYWMKK2Vsc2UKKyAgZW5hYmxlX3NoYXJlZD15ZXMKK2ZpOworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0YXRpYyBvciAtLWRpc2FibGUtc3RhdGljIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3N0YXRpYytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc3RhdGljIgorICBwPSR7UEFDS0FHRS1kZWZhdWx0fQorY2FzZSAkZW5hYmxldmFsIGluCit5ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7CitubykgZW5hYmxlX3N0YXRpYz1ubyA7OworKikKKyAgZW5hYmxlX3N0YXRpYz1ubworICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgorICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisgICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKyAgICAgIGVuYWJsZV9zdGF0aWM9eWVzCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgOzsKK2VzYWMKK2Vsc2UKKyAgZW5hYmxlX3N0YXRpYz15ZXMKK2ZpOworCitmb3IgYWNfZnVuYyBpbiBnZXRjd2QKK2RvCithc19hY192YXI9YGVjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAorZWNobyAiJGFzX21lOjc0NDg6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfZnVuYy4uLiAkRUNIT19DIiA+JjYKK2lmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfdmFyK3NldH1cIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisjbGluZSA3NDU0ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jICgpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jICgpOworY2hhciAoKmYpICgpOworCitpbnQKK21haW4gKCkKK3sKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKK2YgPSAkYWNfZnVuYzsKKyNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTo3NDg1OiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTo3NDg4OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKyAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6NzQ5MTogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjc0OTQ6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBldmFsICIkYXNfYWNfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK2NhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorZXZhbCAiJGFzX2FjX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOjc1MDQ6IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AiID4mNQorZWNobyAiJHtFQ0hPX1R9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AiID4mNgoraWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCA9IHllczsgdGhlbgorICBjYXQgPj5jb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKK0VPRgorCitmaQorZG9uZQorCitmb3IgYWNfZnVuYyBpbiBtZW1zZXQKK2RvCithc19hY192YXI9YGVjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAorZWNobyAiJGFzX21lOjc1MTc6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfZnVuYy4uLiAkRUNIT19DIiA+JjYKK2lmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfdmFyK3NldH1cIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisjbGluZSA3NTIzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jICgpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jICgpOworY2hhciAoKmYpICgpOworCitpbnQKK21haW4gKCkKK3sKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKK2YgPSAkYWNfZnVuYzsKKyNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTo3NTU0OiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTo3NTU3OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKyAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6NzU2MDogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjc1NjM6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBldmFsICIkYXNfYWNfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK2NhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorZXZhbCAiJGFzX2FjX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOjc1NzM6IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AiID4mNQorZWNobyAiJHtFQ0hPX1R9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AiID4mNgoraWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCA9IHllczsgdGhlbgorICBjYXQgPj5jb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKK0VPRgorCitmaQorZG9uZQorCitmb3IgYWNfcHJvZyBpbiBtYXdrIGdhd2sgbmF3ayBhd2sKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6NzU4NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX0FXSytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQVdLIjsgdGhlbgorICBhY19jdl9wcm9nX0FXSz0iJEFXSyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIGFjX3NhdmVfSUZTPSRJRlM7IElGUz0kYWNfcGF0aF9zZXBhcmF0b3IKK2FjX2R1bW15PSIkUEFUSCIKK2ZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICBJRlM9JGFjX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICRhc19leGVjdXRhYmxlX3AgIiRhY19kaXIvJGFjX3dvcmQiIHx8IGNvbnRpbnVlCithY19jdl9wcm9nX0FXSz0iJGFjX3Byb2ciCitlY2hvICIkYXNfbWU6NzYwMjogZm91bmQgJGFjX2Rpci8kYWNfd29yZCIgPiY1CiticmVhaworZG9uZQorCitmaQorZmkKK0FXSz0kYWNfY3ZfcHJvZ19BV0sKK2lmIHRlc3QgLW4gIiRBV0siOyB0aGVuCisgIGVjaG8gIiRhc19tZTo3NjEwOiByZXN1bHQ6ICRBV0siID4mNQorZWNobyAiJHtFQ0hPX1R9JEFXSyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTo3NjEzOiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgdGVzdCAtbiAiJEFXSyIgJiYgYnJlYWsKK2RvbmUKKworIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCisjIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKKyMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgorIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKKyMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAorIyBJUklYIC9zYmluL2luc3RhbGwKKyMgQUlYIC9iaW4vaW5zdGFsbAorIyBBbWlnYU9TIC9DL2luc3RhbGwsIHdoaWNoIGluc3RhbGxzIGJvb3RibG9ja3Mgb24gZmxvcHB5IGRpc2NzCisjIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZworIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCisjIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCisjIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KK2VjaG8gIiRhc19tZTo3NjMyOiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgoraWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgICBhY19zYXZlX0lGUz0kSUZTOyBJRlM9JGFjX3BhdGhfc2VwYXJhdG9yCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgSUZTPSRhY19zYXZlX0lGUworICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgorICAgIGNhc2UgJGFjX2Rpci8gaW4KKyAgICAvIHwgLi8gfCAuLy8gfCAvY0MvKiBcCisgICAgfCAvZXRjLyogfCAvdXNyL3NiaW4vKiB8IC91c3IvZXRjLyogfCAvc2Jpbi8qIHwgL3Vzci9hZnN3cy9iaW4vKiBcCisgICAgfCAvdXNyL3VjYi8qICkgOzsKKyAgICAqKQorICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KKyAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAorICAgICAgIyBieSBkZWZhdWx0LgorICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbworICAgICAgICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYWNfZGlyLyRhY19wcm9nIjsgdGhlbgorCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKyAgICAgICAgICAgIGdyZXAgZHNwbXNnICIkYWNfZGlyLyRhY19wcm9nIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgorCSAgICA6CisJICBlbGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCisJICAgIGdyZXAgcHdwbHVzICIkYWNfZGlyLyRhY19wcm9nIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgIyBwcm9ncmFtLXNwZWNpZmljIGluc3RhbGwgc2NyaXB0IHVzZWQgYnkgSFAgcHdwbHVzLS1kb24ndCB1c2UuCisJICAgIDoKKwkgIGVsc2UKKwkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgorCSAgICBicmVhayAyCisJICBmaQorCWZpCisgICAgICBkb25lCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorCitmaQorICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorICAgIElOU1RBTEw9JGFjX2N2X3BhdGhfaW5zdGFsbAorICBlbHNlCisgICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQorICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAorICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCisgICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KKyAgICBJTlNUQUxMPSRhY19pbnN0YWxsX3NoCisgIGZpCitmaQorZWNobyAiJGFzX21lOjc2ODE6IHJlc3VsdDogJElOU1RBTEwiID4mNQorZWNobyAiJHtFQ0hPX1R9JElOU1RBTEwiID4mNgorCisjIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCisjIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgordGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JworCitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1yYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9cmFubGliOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6NzY5NTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX1JBTkxJQitzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIGFjX3NhdmVfSUZTPSRJRlM7IElGUz0kYWNfcGF0aF9zZXBhcmF0b3IKK2FjX2R1bW15PSIkUEFUSCIKK2ZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICBJRlM9JGFjX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICRhc19leGVjdXRhYmxlX3AgIiRhY19kaXIvJGFjX3dvcmQiIHx8IGNvbnRpbnVlCithY19jdl9wcm9nX1JBTkxJQj0iJHthY190b29sX3ByZWZpeH1yYW5saWIiCitlY2hvICIkYXNfbWU6NzcxMDogZm91bmQgJGFjX2Rpci8kYWNfd29yZCIgPiY1CiticmVhaworZG9uZQorCitmaQorZmkKK1JBTkxJQj0kYWNfY3ZfcHJvZ19SQU5MSUIKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGVjaG8gIiRhc19tZTo3NzE4OiByZXN1bHQ6ICRSQU5MSUIiID4mNQorZWNobyAiJHtFQ0hPX1R9JFJBTkxJQiIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTo3NzIxOiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiOyB0aGVuCisgIGFjX2N0X1JBTkxJQj0kUkFOTElCCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTo3NzMwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfUkFOTElCK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9SQU5MSUIiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSIkYWNfY3RfUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSRhY19wYXRoX3NlcGFyYXRvcgorYWNfZHVtbXk9IiRQQVRIIgorZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgIElGUz0kYWNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgJGFzX2V4ZWN1dGFibGVfcCAiJGFjX2Rpci8kYWNfd29yZCIgfHwgY29udGludWUKK2FjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSJyYW5saWIiCitlY2hvICIkYXNfbWU6Nzc0NTogZm91bmQgJGFjX2Rpci8kYWNfd29yZCIgPiY1CiticmVhaworZG9uZQorCisgIHRlc3QgLXogIiRhY19jdl9wcm9nX2FjX2N0X1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9IjoiCitmaQorZmkKK2FjX2N0X1JBTkxJQj0kYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUIKK2lmIHRlc3QgLW4gIiRhY19jdF9SQU5MSUIiOyB0aGVuCisgIGVjaG8gIiRhc19tZTo3NzU0OiByZXN1bHQ6ICRhY19jdF9SQU5MSUIiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N0X1JBTkxJQiIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTo3NzU3OiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgUkFOTElCPSRhY19jdF9SQU5MSUIKK2Vsc2UKKyAgUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCitmaQorCitlY2hvICIkYXNfbWU6Nzc2NjogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX3N0ZGMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisjbGluZSA3NzcyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorCitfQUNFT0YKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOjc3ODA6IFwiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0KSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZWdyZXAgLXYgJ14gKlwrJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOjc3ODY6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsOyB0aGVuCisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgYWNfY3BwX2Vycj0kYWNfY19wcmVwcm9jX3dhcm5fZmxhZworICBlbHNlCisgICAgYWNfY3BwX2Vycj0KKyAgZmkKK2Vsc2UKKyAgYWNfY3BwX2Vycj15ZXMKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3BwX2VyciI7IHRoZW4KKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisjbGluZSA3ODA4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICA6CitlbHNlCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisjbGluZSA3ODI2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIDoKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisjbGluZSA3ODQ3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2lmICgoJyAnICYgMHgwRkYpID09IDB4MDIwKQorIyBkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQorIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQorI2Vsc2UKKyMgZGVmaW5lIElTTE9XRVIoYykgKCgnYScgPD0gKGMpICYmIChjKSA8PSAnaScpIFwKKyAgICAgICAgICAgICAgICAgICAgIHx8ICgnaicgPD0gKGMpICYmIChjKSA8PSAncicpIFwKKyAgICAgICAgICAgICAgICAgICAgIHx8ICgncycgPD0gKGMpICYmIChjKSA8PSAneicpKQorIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICgoYykgfCAweDQwKSA6IChjKSkKKyNlbmRpZgorCisjZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQoraW50CittYWluICgpCit7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKQorICAgICAgICB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkKKyAgICAgIGV4aXQoMik7CisgIGV4aXQgKDApOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOjc4NzM6IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjc4NzY6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOjc4Nzg6IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTo3ODgxOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQorZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK2NhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb3JlIGNvcmUuKiAqLmNvcmUgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2ZpCitmaQorZWNobyAiJGFzX21lOjc4OTQ6IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9oZWFkZXJfc3RkYyIgPiY2CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBTVERDX0hFQURFUlMgMQorRU9GCisKK2ZpCisKK2VjaG8gIiRhc19tZTo3OTA0OiBjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgQU5TSSBDIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRDQyBvcHRpb24gdG8gYWNjZXB0IEFOU0kgQy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19jY19zdGRjK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2N2X3Byb2dfY2Nfc3RkYz1ubworYWNfc2F2ZV9DQz0kQ0MKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorI2xpbmUgNzkxMiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorLyogTW9zdCBvZiB0aGUgZm9sbG93aW5nIHRlc3RzIGFyZSBzdG9sZW4gZnJvbSBSQ1MgNS43J3Mgc3JjL2NvbmYuc2guICAqLworc3RydWN0IGJ1ZiB7IGludCB4OyB9OworRklMRSAqICgqcmNzb3BlbikgKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KTsKK3N0YXRpYyBjaGFyICplIChwLCBpKQorICAgICBjaGFyICoqcDsKKyAgICAgaW50IGk7Cit7CisgIHJldHVybiBwW2ldOworfQorc3RhdGljIGNoYXIgKmYgKGNoYXIgKiAoKmcpIChjaGFyICoqLCBpbnQpLCBjaGFyICoqcCwgLi4uKQoreworICBjaGFyICpzOworICB2YV9saXN0IHY7CisgIHZhX3N0YXJ0ICh2LHApOworICBzID0gZyAocCwgdmFfYXJnICh2LGludCkpOworICB2YV9lbmQgKHYpOworICByZXR1cm4gczsKK30KK2ludCB0ZXN0IChpbnQgaSwgZG91YmxlIHgpOworc3RydWN0IHMxIHtpbnQgKCpmKSAoaW50IGEpO307CitzdHJ1Y3QgczIge2ludCAoKmYpIChkb3VibGUgYSk7fTsKK2ludCBwYWlybmFtZXMgKGludCwgY2hhciAqKiwgRklMRSAqKCopKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KSwgaW50LCBpbnQpOworaW50IGFyZ2M7CitjaGFyICoqYXJndjsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGYgKGUsIGFyZ3YsIDApICE9IGFyZ3ZbMF0gIHx8ICBmIChlLCBhcmd2LCAxKSAhPSBhcmd2WzFdOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCisjIERvbid0IHRyeSBnY2MgLWFuc2k7IHRoYXQgdHVybnMgb2ZmIHVzZWZ1bCBleHRlbnNpb25zIGFuZAorIyBicmVha3Mgc29tZSBzeXN0ZW1zJyBoZWFkZXIgZmlsZXMuCisjIEFJWAkJCS1xbGFuZ2x2bD1hbnNpCisjIFVsdHJpeCBhbmQgT1NGLzEJLXN0ZDEKKyMgSFAtVVggMTAuMjAgYW5kIGxhdGVyCS1BZQorIyBIUC1VWCBvbGRlciB2ZXJzaW9ucwktQWEgLURfSFBVWF9TT1VSQ0UKKyMgU1ZSNAkJCS1YYyAtRF9fRVhURU5TSU9OU19fCitmb3IgYWNfYXJnIGluICIiIC1xbGFuZ2x2bD1hbnNpIC1zdGQxIC1BZSAiLUFhIC1EX0hQVVhfU09VUkNFIiAiLVhjIC1EX19FWFRFTlNJT05TX18iCitkbworICBDQz0iJGFjX3NhdmVfQ0MgJGFjX2FyZyIKKyAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6Nzk2MTogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6Nzk2NDogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTo3OTY3OiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6Nzk3MDogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X3Byb2dfY2Nfc3RkYz0kYWNfYXJnCiticmVhaworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CitmaQorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorZG9uZQorcm0gLWYgY29uZnRlc3QuJGFjX2V4dCBjb25mdGVzdC4kYWNfb2JqZXh0CitDQz0kYWNfc2F2ZV9DQworCitmaQorCitjYXNlICJ4JGFjX2N2X3Byb2dfY2Nfc3RkYyIgaW4KKyAgeHx4bm8pCisgICAgZWNobyAiJGFzX21lOjc5ODc6IHJlc3VsdDogbm9uZSBuZWVkZWQiID4mNQorZWNobyAiJHtFQ0hPX1R9bm9uZSBuZWVkZWQiID4mNiA7OworICAqKQorICAgIGVjaG8gIiRhc19tZTo3OTkwOiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX3N0ZGMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3Byb2dfY2Nfc3RkYyIgPiY2CisgICAgQ0M9IiRDQyAkYWNfY3ZfcHJvZ19jY19zdGRjIiA7OworZXNhYworCitlY2hvICIkYXNfbWU6Nzk5NTogY2hlY2tpbmcgZm9yIGFuIEFOU0kgQy1jb25mb3JtaW5nIGNvbnN0IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGFuIEFOU0kgQy1jb25mb3JtaW5nIGNvbnN0Li4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9jX2NvbnN0K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorI2xpbmUgODAwMSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludAorbWFpbiAoKQoreworLyogRklYTUU6IEluY2x1ZGUgdGhlIGNvbW1lbnRzIHN1Z2dlc3RlZCBieSBQYXVsLiAqLworI2lmbmRlZiBfX2NwbHVzcGx1cworICAvKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLworICB0eXBlZGVmIGludCBjaGFyc2V0WzJdOworICBjb25zdCBjaGFyc2V0IHg7CisgIC8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCisgIGNoYXIgY29uc3QgKmNvbnN0ICpjY3A7CisgIGNoYXIgKipwOworICAvKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLworICBzdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307CisgIHN0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OworICAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCisgICAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluCisgICAgIGFuIGFybSBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQKKyAgICAgZXhwcmVzc2lvbiAqLworICBjb25zdCBjaGFyICpnID0gInN0cmluZyI7CisgIGNjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKKyAgLyogSFBVWCA3LjAgY2MgcmVqZWN0cyB0aGVzZS4gKi8KKyAgKytjY3A7CisgIHAgPSAoY2hhcioqKSBjY3A7CisgIGNjcCA9IChjaGFyIGNvbnN0ICpjb25zdCAqKSBwOworICB7IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLworICAgIGNoYXIgKnQ7CisgICAgY2hhciBjb25zdCAqcyA9IDAgPyAoY2hhciAqKSAwIDogKGNoYXIgY29uc3QgKikgMDsKKworICAgICp0KysgPSAwOworICB9CisgIHsgLyogU29tZW9uZSB0aGlua3MgdGhlIFN1biBzdXBwb3NlZGx5LUFOU0kgY29tcGlsZXIgd2lsbCByZWplY3QgdGhpcy4gICovCisgICAgaW50IHhbXSA9IHsyNSwgMTd9OworICAgIGNvbnN0IGludCAqZm9vID0gJnhbMF07CisgICAgKytmb287CisgIH0KKyAgeyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCisgICAgdHlwZWRlZiBjb25zdCBpbnQgKmlwdHI7CisgICAgaXB0ciBwID0gMDsKKyAgICArK3A7CisgIH0KKyAgeyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCisgICAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLworICAgIHN0cnVjdCBzIHsgaW50IGo7IGNvbnN0IGludCAqYXBbM107IH07CisgICAgc3RydWN0IHMgKmI7IGItPmogPSA1OworICB9CisgIHsgLyogVUxUUklYLTMyIFYzLjEgKFJldiA5KSB2Y2MgcmVqZWN0cyB0aGlzICovCisgICAgY29uc3QgaW50IGZvbyA9IDEwOworICB9CisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTo4MDU5OiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTo4MDYyOiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKyAgICAgICAgIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOjgwNjU6IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTo4MDY4OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfY19jb25zdD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK2NhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorYWNfY3ZfY19jb25zdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2VjaG8gIiRhc19tZTo4MDc4OiByZXN1bHQ6ICRhY19jdl9jX2NvbnN0IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9jX2NvbnN0IiA+JjYKK2lmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBjb25zdAorRU9GCisKK2ZpCisKKyMgT24gSVJJWCA1LjMsIHN5cy90eXBlcyBhbmQgaW50dHlwZXMuaCBhcmUgY29uZmxpY3RpbmcuCisKK2ZvciBhY19oZWFkZXIgaW4gc3lzL3R5cGVzLmggc3lzL3N0YXQuaCBzdGRsaWIuaCBzdHJpbmcuaCBtZW1vcnkuaCBzdHJpbmdzLmggXAorICAgICAgICAgICAgICAgICAgaW50dHlwZXMuaCBzdGRpbnQuaCB1bmlzdGQuaAorZG8KK2FzX2FjX0hlYWRlcj1gZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAorZWNobyAiJGFzX21lOjgwOTQ6IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2CitpZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX0hlYWRlcitzZXR9XCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorI2xpbmUgODEwMCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorI2luY2x1ZGUgPCRhY19oZWFkZXI+CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOjgxMDY6IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjgxMDk6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorICAgICAgICAgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6ODExMjogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOjgxMTU6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBldmFsICIkYXNfYWNfSGVhZGVyPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK2NhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorZXZhbCAiJGFzX2FjX0hlYWRlcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitlY2hvICIkYXNfbWU6ODEyNTogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY1CitlY2hvICIke0VDSE9fVH1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY2CitpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgID0geWVzOyB0aGVuCisgIGNhdCA+PmNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCitFT0YKKworZmkKK2RvbmUKKworZWNobyAiJGFzX21lOjgxMzU6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc2l6ZV90Li4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl90eXBlX3NpemVfdCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyNsaW5lIDgxNDEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorJGFjX2luY2x1ZGVzX2RlZmF1bHQKK2ludAorbWFpbiAoKQoreworaWYgKChzaXplX3QgKikgMCkKKyAgcmV0dXJuIDA7CitpZiAoc2l6ZW9mIChzaXplX3QpKQorICByZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6ODE1NjogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6ODE1OTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisgICAgICAgICB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTo4MTYyOiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6ODE2NTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X3R5cGVfc2l6ZV90PXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CithY19jdl90eXBlX3NpemVfdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2VjaG8gIiRhc19tZTo4MTc1OiByZXN1bHQ6ICRhY19jdl90eXBlX3NpemVfdCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9zaXplX3QiID4mNgoraWYgdGVzdCAkYWNfY3ZfdHlwZV9zaXplX3QgPSB5ZXM7IHRoZW4KKyAgOgorZWxzZQorCitjYXQgPj5jb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIHNpemVfdCB1bnNpZ25lZAorRU9GCisKK2ZpCisKK2ZvciBhY19oZWFkZXIgaW4gc3lzL3R5cGVzLmggc3lzL3NvY2tldC5oIHVuaXN0ZC5oIG5ldGluZXQvaW4uaAorZG8KK2FzX2FjX0hlYWRlcj1gZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAorZWNobyAiJGFzX21lOjgxOTA6IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2CitpZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX0hlYWRlcitzZXR9XCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorI2xpbmUgODE5NiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hlYWRlcj4KK19BQ0VPRgoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6ODIwMDogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQorICAoZXZhbCAkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBlZ3JlcCAtdiAnXiAqXCsnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6ODIwNjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGw7IHRoZW4KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBhY19jcHBfZXJyPSRhY19jX3ByZXByb2Nfd2Fybl9mbGFnCisgIGVsc2UKKyAgICBhY19jcHBfZXJyPQorICBmaQorZWxzZQorICBhY19jcHBfZXJyPXllcworZmkKK2lmIHRlc3QgLXogIiRhY19jcHBfZXJyIjsgdGhlbgorICBldmFsICIkYXNfYWNfSGVhZGVyPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIGV2YWwgIiRhc19hY19IZWFkZXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitlY2hvICIkYXNfbWU6ODIyNTogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY1CitlY2hvICIke0VDSE9fVH1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY2CitpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgID0geWVzOyB0aGVuCisgIGNhdCA+PmNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCitFT0YKKworZmkKK2RvbmUKKworZm9yIGFjX2hlYWRlciBpbiBhcnBhL2luZXQuaCBuZXRkYi5oIHN5cy9pb2N0bC5oIGVycm5vLmgKK2RvCithc19hY19IZWFkZXI9YGVjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKK2VjaG8gIiRhc19tZTo4MjM4OiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNgoraWYgZXZhbCAidGVzdCBcIlwkeyRhc19hY19IZWFkZXIrc2V0fVwiID0gc2V0IjsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyNsaW5lIDgyNDQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZWFkZXI+CitfQUNFT0YKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOjgyNDg6IFwiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0KSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZWdyZXAgLXYgJ14gKlwrJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOjgyNTQ6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsOyB0aGVuCisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgYWNfY3BwX2Vycj0kYWNfY19wcmVwcm9jX3dhcm5fZmxhZworICBlbHNlCisgICAgYWNfY3BwX2Vycj0KKyAgZmkKK2Vsc2UKKyAgYWNfY3BwX2Vycj15ZXMKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3BwX2VyciI7IHRoZW4KKyAgZXZhbCAiJGFzX2FjX0hlYWRlcj15ZXMiCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBldmFsICIkYXNfYWNfSGVhZGVyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOjgyNzM6IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNQorZWNobyAiJHtFQ0hPX1R9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNgoraWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCA9IHllczsgdGhlbgorICBjYXQgPj5jb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQorRU9GCisKK2ZpCitkb25lCisKK2ZvciBhY19oZWFkZXIgaW4gc3lzL3RpbWUuaAorZG8KK2FzX2FjX0hlYWRlcj1gZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAorZWNobyAiJGFzX21lOjgyODY6IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2CitpZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX0hlYWRlcitzZXR9XCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorI2xpbmUgODI5MiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hlYWRlcj4KK19BQ0VPRgoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6ODI5NjogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQorICAoZXZhbCAkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBlZ3JlcCAtdiAnXiAqXCsnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6ODMwMjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGw7IHRoZW4KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBhY19jcHBfZXJyPSRhY19jX3ByZXByb2Nfd2Fybl9mbGFnCisgIGVsc2UKKyAgICBhY19jcHBfZXJyPQorICBmaQorZWxzZQorICBhY19jcHBfZXJyPXllcworZmkKK2lmIHRlc3QgLXogIiRhY19jcHBfZXJyIjsgdGhlbgorICBldmFsICIkYXNfYWNfSGVhZGVyPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIGV2YWwgIiRhc19hY19IZWFkZXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitlY2hvICIkYXNfbWU6ODMyMTogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY1CitlY2hvICIke0VDSE9fVH1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY2CitpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgID0geWVzOyB0aGVuCisgIGNhdCA+PmNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCitFT0YKKworZmkKK2RvbmUKKworZm9yIGFjX2hlYWRlciBpbiBsdGRsLmgKK2RvCithc19hY19IZWFkZXI9YGVjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKK2VjaG8gIiRhc19tZTo4MzM0OiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNgoraWYgZXZhbCAidGVzdCBcIlwkeyRhc19hY19IZWFkZXIrc2V0fVwiID0gc2V0IjsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyNsaW5lIDgzNDAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZWFkZXI+CitfQUNFT0YKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOjgzNDQ6IFwiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0KSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZWdyZXAgLXYgJ14gKlwrJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOjgzNTA6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsOyB0aGVuCisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgYWNfY3BwX2Vycj0kYWNfY19wcmVwcm9jX3dhcm5fZmxhZworICBlbHNlCisgICAgYWNfY3BwX2Vycj0KKyAgZmkKK2Vsc2UKKyAgYWNfY3BwX2Vycj15ZXMKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3BwX2VyciI7IHRoZW4KKyAgZXZhbCAiJGFzX2FjX0hlYWRlcj15ZXMiCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBldmFsICIkYXNfYWNfSGVhZGVyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOjgzNjk6IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNQorZWNobyAiJHtFQ0hPX1R9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNgoraWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCA9IHllczsgdGhlbgorICBjYXQgPj5jb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQorRU9GCisKK2ZpCitkb25lCisKK2ZvciBhY19oZWFkZXIgaW4gc3Rkc29hcDIuaAorZG8KK2FzX2FjX0hlYWRlcj1gZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAorZWNobyAiJGFzX21lOjgzODI6IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2CitpZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX0hlYWRlcitzZXR9XCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorI2xpbmUgODM4OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hlYWRlcj4KK19BQ0VPRgoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6ODM5MjogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQorICAoZXZhbCAkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBlZ3JlcCAtdiAnXiAqXCsnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6ODM5ODogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGw7IHRoZW4KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBhY19jcHBfZXJyPSRhY19jX3ByZXByb2Nfd2Fybl9mbGFnCisgIGVsc2UKKyAgICBhY19jcHBfZXJyPQorICBmaQorZWxzZQorICBhY19jcHBfZXJyPXllcworZmkKK2lmIHRlc3QgLXogIiRhY19jcHBfZXJyIjsgdGhlbgorICBldmFsICIkYXNfYWNfSGVhZGVyPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIGV2YWwgIiRhc19hY19IZWFkZXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitlY2hvICIkYXNfbWU6ODQxNzogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY1CitlY2hvICIke0VDSE9fVH1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY2CitpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgID0geWVzOyB0aGVuCisgIGNhdCA+PmNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCitFT0YKKworZmkKK2RvbmUKKworYWNfY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIE1ha2VmaWxlIENvbnNvbGVTZXJ2ZXIvTWFrZWZpbGUgQ29uc29sZVNlcnZlci9mb28vTWFrZWZpbGUgZXhhbXBsZS9NYWtlZmlsZSBleGFtcGxlL2NhbGN1bGF0b3IvTWFrZWZpbGUgbW9kX2dzb2FwL01ha2VmaWxlIgorY2F0ID5jb25mY2FjaGUgPDxcX0FDRU9GCisjIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKKyMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQorIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucywgc2VlIGNvbmZpZ3VyZSdzIG9wdGlvbiAtLWNvbmZpZy1jYWNoZS4KKyMgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLiAgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3QKKyMgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorIworIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQKKyMgdGhlIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgorIworIyBgYWNfY3ZfZW52X2ZvbycgdmFyaWFibGVzIChzZXQgb3IgdW5zZXQpIHdpbGwgYmUgb3ZlcnJpZGVuIHdoZW4KKyMgbG9hZGluZyB0aGlzIGZpbGUsIG90aGVyICp1bnNldCogYGFjX2N2X2Zvbycgd2lsbCBiZSBhc3NpZ25lZCB0aGUKKyMgZm9sbG93aW5nIHZhbHVlcy4KKworX0FDRU9GCisKKyMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCisjIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgorIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgorIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCisjIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgoreworICAoc2V0KSAyPiYxIHwKKyAgICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgorICAgICphY19zcGFjZT1cICopCisgICAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlCisgICAgICAjIHN1YnN0aXR1dGlvbiB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KKyAgICAgIHNlZCAtbiBcCisgICAgICAgICJzLycvJ1xcXFwnJy9nOworICAgIAkgIHMvXlxcKFtfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKlxcKT1cXCguKlxcKS9cXDE9J1xcMicvcCIKKyAgICAgIDs7CisgICAgKikKKyAgICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCisgICAgICBzZWQgLW4gXAorICAgICAgICAicy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT1cXDIvcCIKKyAgICAgIDs7CisgICAgZXNhYzsKK30gfAorICBzZWQgJworICAgICB0IGNsZWFyCisgICAgIDogY2xlYXIKKyAgICAgcy9eXChbXj1dKlwpPVwoLipbe31dLipcKSQvdGVzdCAiJHtcMStzZXR9IiA9IHNldCB8fCAmLworICAgICB0IGVuZAorICAgICAvXmFjX2N2X2Vudi8hcy9eXChbXj1dKlwpPVwoLipcKSQvXDE9JHtcMT1cMn0vCisgICAgIDogZW5kJyA+PmNvbmZjYWNoZQoraWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbiA6OyBlbHNlCisgIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KKyAgICB0ZXN0ICJ4JGNhY2hlX2ZpbGUiICE9ICJ4L2Rldi9udWxsIiAmJiBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgICBjYXQgY29uZmNhY2hlID4kY2FjaGVfZmlsZQorICBlbHNlCisgICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIGZpCitmaQorcm0gLWYgY29uZmNhY2hlCisKK3Rlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKKyMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgordGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JworCisjIFZQQVRIIG1heSBjYXVzZSB0cm91YmxlIHdpdGggc29tZSBtYWtlcywgc28gd2UgcmVtb3ZlICQoc3JjZGlyKSwKKyMgJHtzcmNkaXJ9IGFuZCBAc3JjZGlyQCBmcm9tIFZQQVRIIGlmIHNyY2RpciBpcyAiLiIsIHN0cmlwIGxlYWRpbmcgYW5kCisjIHRyYWlsaW5nIGNvbG9ucyBhbmQgdGhlbiByZW1vdmUgdGhlIHdob2xlIGxpbmUgaWYgVlBBVEggYmVjb21lcyBlbXB0eQorIyAoYWN0dWFsbHkgd2UgbGVhdmUgYW4gZW1wdHkgbGluZSB0byBwcmVzZXJ2ZSBsaW5lIG51bWJlcnMpLgoraWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KKyAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPS97CitzLzoqXCQoc3JjZGlyKToqLzovOworcy86Klwke3NyY2Rpcn06Ki86LzsKK3MvOipAc3JjZGlyQDoqLzovOworcy9eXChbXj1dKj1bIAldKlwpOiovXDEvOworcy86KiQvLzsKK3MvXltePV0qPVsgCV0qJC8vOworfScKK2ZpCisKK0RFRlM9LURIQVZFX0NPTkZJR19ICisKKzogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KK2FjX2NsZWFuX2ZpbGVzX3NhdmU9JGFjX2NsZWFuX2ZpbGVzCithY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzICRDT05GSUdfU1RBVFVTIgoreyBlY2hvICIkYXNfbWU6ODUwNzogY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNQorZWNobyAiJGFzX21lOiBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiY2O30KK2NhdCA+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKKyMhICRTSEVMTAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKKyMgY29uZmlndXJlLCBpcyBpbiBjb25maWcubG9nIGlmIGl0IGV4aXN0cy4KKworZGVidWc9ZmFsc2UKK1NIRUxMPVwke0NPTkZJR19TSEVMTC0kU0hFTEx9CithY19jc19pbnZvY2F0aW9uPSJcJDAgXCRAIgorCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCisjIEJlIEJvdXJuZSBjb21wYXRpYmxlCitpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgZW11bGF0ZSBzaAorICBOVUxMQ01EPToKK2VsaWYgdGVzdCAtbiAiJHtCQVNIX1ZFUlNJT04rc2V0fSIgJiYgKHNldCAtbyBwb3NpeCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHNldCAtbyBwb3NpeAorZmkKKworIyBOYW1lIG9mIHRoZSBleGVjdXRhYmxlLgorYXNfbWU9YGVjaG8gIiQwIiB8c2VkICdzLC4qW1xcL10sLCdgCisKK2lmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX2V4cHI9ZXhwcgorZWxzZQorICBhc19leHByPWZhbHNlCitmaQorCitybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZmlsZQorZWNobyA+Y29uZiQkLmZpbGUKK2lmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICAjIFdlIGNvdWxkIGp1c3QgY2hlY2sgZm9yIERKR1BQOyBidXQgdGhpcyB0ZXN0IGEpIHdvcmtzIGIpIGlzIG1vcmUgZ2VuZXJpYworICAjIGFuZCBjKSB3aWxsIHJlbWFpbiB2YWxpZCBvbmNlIERKR1BQIHN1cHBvcnRzIHN5bWxpbmtzIChESkdQUCAyLjA0KS4KKyAgaWYgdGVzdCAtZiBjb25mJCQuZXhlOyB0aGVuCisgICAgIyBEb24ndCB1c2UgbG4gYXQgYWxsOyB3ZSBkb24ndCBoYXZlIGFueSBsaW5rcworICAgIGFzX2xuX3M9J2NwIC1wJworICBlbHNlCisgICAgYXNfbG5fcz0nbG4gLXMnCisgIGZpCitlbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19sbl9zPWxuCitlbHNlCisgIGFzX2xuX3M9J2NwIC1wJworZmkKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCisKK2FzX2V4ZWN1dGFibGVfcD0idGVzdCAtZiIKKworIyBTdXBwb3J0IHVuc2V0IHdoZW4gcG9zc2libGUuCitpZiAoRk9PPUZPTzsgdW5zZXQgRk9PKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfdW5zZXQ9dW5zZXQKK2Vsc2UKKyAgYXNfdW5zZXQ9ZmFsc2UKK2ZpCisKKyMgTkxTIG51aXNhbmNlcy4KKyRhc191bnNldCBMQU5HIHx8IHRlc3QgIiR7TEFORytzZXR9IiAhPSBzZXQgfHwgeyBMQU5HPUM7IGV4cG9ydCBMQU5HOyB9CiskYXNfdW5zZXQgTENfQUxMIHx8IHRlc3QgIiR7TENfQUxMK3NldH0iICE9IHNldCB8fCB7IExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyB9CiskYXNfdW5zZXQgTENfVElNRSB8fCB0ZXN0ICIke0xDX1RJTUUrc2V0fSIgIT0gc2V0IHx8IHsgTENfVElNRT1DOyBleHBvcnQgTENfVElNRTsgfQorJGFzX3Vuc2V0IExDX0NUWVBFIHx8IHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgIT0gc2V0IHx8IHsgTENfQ1RZUEU9QzsgZXhwb3J0IExDX0NUWVBFOyB9CiskYXNfdW5zZXQgTEFOR1VBR0UgfHwgdGVzdCAiJHtMQU5HVUFHRStzZXR9IiAhPSBzZXQgfHwgeyBMQU5HVUFHRT1DOyBleHBvcnQgTEFOR1VBR0U7IH0KKyRhc191bnNldCBMQ19DT0xMQVRFIHx8IHRlc3QgIiR7TENfQ09MTEFURStzZXR9IiAhPSBzZXQgfHwgeyBMQ19DT0xMQVRFPUM7IGV4cG9ydCBMQ19DT0xMQVRFOyB9CiskYXNfdW5zZXQgTENfTlVNRVJJQyB8fCB0ZXN0ICIke0xDX05VTUVSSUMrc2V0fSIgIT0gc2V0IHx8IHsgTENfTlVNRVJJQz1DOyBleHBvcnQgTENfTlVNRVJJQzsgfQorJGFzX3Vuc2V0IExDX01FU1NBR0VTIHx8IHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgIT0gc2V0IHx8IHsgTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyB9CisKKyMgSUZTCisjIFdlIG5lZWQgc3BhY2UsIHRhYiBhbmQgbmV3IGxpbmUsIGluIHByZWNpc2VseSB0aGF0IG9yZGVyLgorYXNfbmw9JworJworSUZTPSIgCSRhc19ubCIKKworIyBDRFBBVEguCiskYXNfdW5zZXQgQ0RQQVRIIHx8IHRlc3QgIiR7Q0RQQVRIK3NldH0iICE9IHNldCB8fCB7IENEUEFUSD06OyBleHBvcnQgQ0RQQVRIOyB9CisKK2V4ZWMgNj4mMQorCitfQUNFT0YKKworIyBGaWxlcyB0aGF0IGNvbmZpZy5zdGF0dXMgd2FzIG1hZGUgZm9yLgoraWYgdGVzdCAtbiAiJGFjX2NvbmZpZ19maWxlcyI7IHRoZW4KKyAgZWNobyAiY29uZmlnX2ZpbGVzPVwiJGFjX2NvbmZpZ19maWxlc1wiIiA+PiRDT05GSUdfU1RBVFVTCitmaQorCitpZiB0ZXN0IC1uICIkYWNfY29uZmlnX2hlYWRlcnMiOyB0aGVuCisgIGVjaG8gImNvbmZpZ19oZWFkZXJzPVwiJGFjX2NvbmZpZ19oZWFkZXJzXCIiID4+JENPTkZJR19TVEFUVVMKK2ZpCisKK2lmIHRlc3QgLW4gIiRhY19jb25maWdfbGlua3MiOyB0aGVuCisgIGVjaG8gImNvbmZpZ19saW5rcz1cIiRhY19jb25maWdfbGlua3NcIiIgPj4kQ09ORklHX1NUQVRVUworZmkKKworaWYgdGVzdCAtbiAiJGFjX2NvbmZpZ19jb21tYW5kcyI7IHRoZW4KKyAgZWNobyAiY29uZmlnX2NvbW1hbmRzPVwiJGFjX2NvbmZpZ19jb21tYW5kc1wiIiA+PiRDT05GSUdfU1RBVFVTCitmaQorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxFT0YKKworYWNfY3NfdXNhZ2U9IlwKK1xgJGFzX21lJyBpbnN0YW50aWF0ZXMgZmlsZXMgZnJvbSB0ZW1wbGF0ZXMgYWNjb3JkaW5nIHRvIHRoZQorY3VycmVudCBjb25maWd1cmF0aW9uLgorCitVc2FnZTogJDAgW09QVElPTlNdIFtGSUxFXS4uLgorCisgIC1oLCAtLWhlbHAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKKyAgLVYsIC0tdmVyc2lvbiAgICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0CisgIC1kLCAtLWRlYnVnICAgICAgZG9uJ3QgcmVtb3ZlIHRlbXBvcmFyeSBmaWxlcworICAgICAgLS1yZWNoZWNrICAgIHVwZGF0ZSAkYXNfbWUgYnkgcmVjb25maWd1cmluZyBpbiB0aGUgc2FtZSBjb25kaXRpb25zCisgIC0tZmlsZT1GSUxFWzpURU1QTEFURV0KKyAgICAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIEZJTEUKKyAgLS1oZWFkZXI9RklMRVs6VEVNUExBVEVdCisgICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGUgdGhlIGNvbmZpZ3VyYXRpb24gaGVhZGVyIEZJTEUKKworQ29uZmlndXJhdGlvbiBmaWxlczoKKyRjb25maWdfZmlsZXMKKworQ29uZmlndXJhdGlvbiBoZWFkZXJzOgorJGNvbmZpZ19oZWFkZXJzCisKK0NvbmZpZ3VyYXRpb24gY29tbWFuZHM6CiskY29uZmlnX2NvbW1hbmRzCisKK1JlcG9ydCBidWdzIHRvIDxidWctYXV0b2NvbmZAZ251Lm9yZz4uIgorRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8RU9GCithY19jc192ZXJzaW9uPSJcXAorY29uZmlnLnN0YXR1cworY29uZmlndXJlZCBieSAkMCwgZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjUyLAorICB3aXRoIG9wdGlvbnMgXFwiYGVjaG8gIiRhY19jb25maWd1cmVfYXJncyIgfCBzZWQgJ3MvW1xcIiJcYFwkXS9cXFxcJi9nJ2BcXCIKKworQ29weXJpZ2h0IDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorVGhpcyBjb25maWcuc3RhdHVzIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCitnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuIgorc3JjZGlyPSRzcmNkaXIKK0lOU1RBTEw9IiRJTlNUQUxMIgorRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XEVPRgorIyBJZiBubyBmaWxlIGFyZSBzcGVjaWZpZWQgYnkgdGhlIHVzZXIsIHRoZW4gd2UgbmVlZCB0byBwcm92aWRlIGRlZmF1bHQKKyMgdmFsdWUuICBCeSB3ZSBuZWVkIHRvIGtub3cgaWYgZmlsZXMgd2VyZSBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuCithY19uZWVkX2RlZmF1bHRzPToKK3doaWxlIHRlc3QgJCMgIT0gMAorZG8KKyAgY2FzZSAkMSBpbgorICAtLSo9KikKKyAgICBhY19vcHRpb249YGV4cHIgIngkMSIgOiAneFwoW149XSpcKT0nYAorICAgIGFjX29wdGFyZz1gZXhwciAieCQxIiA6ICd4W149XSo9XCguKlwpJ2AKKyAgICBzaGlmdAorICAgIHNldCBkdW1teSAiJGFjX29wdGlvbiIgIiRhY19vcHRhcmciICR7MSsiJEAifQorICAgIHNoaWZ0CisgICAgOzsKKyAgLSopOzsKKyAgKikgIyBUaGlzIGlzIG5vdCBhbiBvcHRpb24sIHNvIHRoZSB1c2VyIGhhcyBwcm9iYWJseSBnaXZlbiBleHBsaWNpdAorICAgICAjIGFyZ3VtZW50cy4KKyAgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7CisgIGVzYWMKKworICBjYXNlICQxIGluCisgICMgSGFuZGxpbmcgb2YgdGhlIG9wdGlvbnMuCitFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8RU9GCisgIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQorICAgIGVjaG8gInJ1bm5pbmcgJFNIRUxMICQwICIgJGFjX2NvbmZpZ3VyZV9hcmdzICIgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCisgICAgZXhlYyAkU0hFTEwgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7CitFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XEVPRgorICAtLXZlcnNpb24gfCAtLXZlcnMqIHwgLVYgKQorICAgIGVjaG8gIiRhY19jc192ZXJzaW9uIjsgZXhpdCAwIDs7CisgIC0taGUgfCAtLWgpCisgICAgIyBDb25mbGljdCBiZXR3ZWVuIC0taGVscCBhbmQgLS1oZWFkZXIKKyAgICB7IHsgZWNobyAiJGFzX21lOjg2ODM6IGVycm9yOiBhbWJpZ3VvdXMgb3B0aW9uOiAkMQorVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogYW1iaWd1b3VzIG9wdGlvbjogJDEKK1RyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKKyAgLS1oZWxwIHwgLS1oZWwgfCAtaCApCisgICAgZWNobyAiJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7CisgIC0tZGVidWcgfCAtLWQqIHwgLWQgKQorICAgIGRlYnVnPTogOzsKKyAgLS1maWxlIHwgLS1maWwgfCAtLWZpIHwgLS1mICkKKyAgICBzaGlmdAorICAgIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyAkMSIKKyAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlOzsKKyAgLS1oZWFkZXIgfCAtLWhlYWRlIHwgLS1oZWFkIHwgLS1oZWEgKQorICAgIHNoaWZ0CisgICAgQ09ORklHX0hFQURFUlM9IiRDT05GSUdfSEVBREVSUyAkMSIKKyAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlOzsKKworICAjIFRoaXMgaXMgYW4gZXJyb3IuCisgIC0qKSB7IHsgZWNobyAiJGFzX21lOjg3MDI6IGVycm9yOiB1bnJlY29nbml6ZWQgb3B0aW9uOiAkMQorVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogdW5yZWNvZ25pemVkIG9wdGlvbjogJDEKK1RyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9IDs7CisKKyAgKikgYWNfY29uZmlnX3RhcmdldHM9IiRhY19jb25maWdfdGFyZ2V0cyAkMSIgOzsKKworICBlc2FjCisgIHNoaWZ0Citkb25lCisKK2V4ZWMgNT4+Y29uZmlnLmxvZworY2F0ID4mNSA8PCBfQUNFT0YKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIFJ1bm5pbmcgY29uZmlnLnN0YXR1cy4gICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCitUaGlzIGZpbGUgd2FzIGV4dGVuZGVkIGJ5ICRhc19tZSAyLjUyLCBleGVjdXRlZCB3aXRoCisgIENPTkZJR19GSUxFUyAgICA9ICRDT05GSUdfRklMRVMKKyAgQ09ORklHX0hFQURFUlMgID0gJENPTkZJR19IRUFERVJTCisgIENPTkZJR19MSU5LUyAgICA9ICRDT05GSUdfTElOS1MKKyAgQ09ORklHX0NPTU1BTkRTID0gJENPTkZJR19DT01NQU5EUworICA+ICRhY19jc19pbnZvY2F0aW9uCitvbiBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKKworX0FDRU9GCitFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxFT0YKKyMKKyMgSU5JVC1DT01NQU5EUyBzZWN0aW9uLgorIworCitBTURFUF9UUlVFPSIkQU1ERVBfVFJVRSIKK2FjX2F1eF9kaXI9IiRhY19hdXhfZGlyIgorCitFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcRU9GCitmb3IgYWNfY29uZmlnX3RhcmdldCBpbiAkYWNfY29uZmlnX3RhcmdldHMKK2RvCisgIGNhc2UgIiRhY19jb25maWdfdGFyZ2V0IiBpbgorICAjIEhhbmRsaW5nIG9mIGFyZ3VtZW50cy4KKyAgIk1ha2VmaWxlIiApIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBNYWtlZmlsZSIgOzsKKyAgIkNvbnNvbGVTZXJ2ZXIvTWFrZWZpbGUiICkgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIENvbnNvbGVTZXJ2ZXIvTWFrZWZpbGUiIDs7CisgICJDb25zb2xlU2VydmVyL2Zvby9NYWtlZmlsZSIgKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgQ29uc29sZVNlcnZlci9mb28vTWFrZWZpbGUiIDs7CisgICJleGFtcGxlL01ha2VmaWxlIiApIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBleGFtcGxlL01ha2VmaWxlIiA7OworICAiZXhhbXBsZS9jYWxjdWxhdG9yL01ha2VmaWxlIiApIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBleGFtcGxlL2NhbGN1bGF0b3IvTWFrZWZpbGUiIDs7CisgICJtb2RfZ3NvYXAvTWFrZWZpbGUiICkgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIG1vZF9nc29hcC9NYWtlZmlsZSIgOzsKKyAgImRlZmF1bHQtMSIgKSBDT05GSUdfQ09NTUFORFM9IiRDT05GSUdfQ09NTUFORFMgZGVmYXVsdC0xIiA7OworICAiY29uZmlnLmgiICkgQ09ORklHX0hFQURFUlM9IiRDT05GSUdfSEVBREVSUyBjb25maWcuaCIgOzsKKyAgKikgeyB7IGVjaG8gIiRhc19tZTo4NzU1OiBlcnJvcjogaW52YWxpZCBhcmd1bWVudDogJGFjX2NvbmZpZ190YXJnZXQiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBhcmd1bWVudDogJGFjX2NvbmZpZ190YXJnZXQiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworICBlc2FjCitkb25lCisKKyMgSWYgdGhlIHVzZXIgZGlkIG5vdCB1c2UgdGhlIGFyZ3VtZW50cyB0byBzcGVjaWZ5IHRoZSBpdGVtcyB0byBpbnN0YW50aWF0ZSwKKyMgdGhlbiB0aGUgZW52dmFyIGludGVyZmFjZSBpcyB1c2VkLiAgU2V0IG9ubHkgdGhvc2UgdGhhdCBhcmUgbm90LgorIyBXZSB1c2UgdGhlIGxvbmcgZm9ybSBmb3IgdGhlIGRlZmF1bHQgYXNzaWdubWVudCBiZWNhdXNlIG9mIGFuIGV4dHJlbWVseQorIyBiaXphcnJlIGJ1ZyBvbiBTdW5PUyA0LjEuMy4KK2lmICRhY19uZWVkX2RlZmF1bHRzOyB0aGVuCisgIHRlc3QgIiR7Q09ORklHX0ZJTEVTK3NldH0iID0gc2V0IHx8IENPTkZJR19GSUxFUz0kY29uZmlnX2ZpbGVzCisgIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0hFQURFUlM9JGNvbmZpZ19oZWFkZXJzCisgIHRlc3QgIiR7Q09ORklHX0NPTU1BTkRTK3NldH0iID0gc2V0IHx8IENPTkZJR19DT01NQU5EUz0kY29uZmlnX2NvbW1hbmRzCitmaQorCisjIENyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnksIGFuZCBob29rIGZvciBpdHMgcmVtb3ZhbCB1bmxlc3MgZGVidWdnaW5nLgorJGRlYnVnIHx8Cit7CisgIHRyYXAgJ2V4aXRfc3RhdHVzPSQ/OyBybSAtcmYgJHRtcCAmJiBleGl0ICRleGl0X3N0YXR1cycgMAorICB0cmFwICd7IChleGl0IDEpOyBleGl0IDE7IH0nIDEgMiAxMyAxNQorfQorCisjIENyZWF0ZSBhIChzZWN1cmUpIHRtcCBkaXJlY3RvcnkgZm9yIHRtcCBmaWxlcy4KKzogJHtUTVBESVI9L3RtcH0KK3sKKyAgdG1wPWAodW1hc2sgMDc3ICYmIG1rdGVtcCAtZCAtcSAiJFRNUERJUi9jc1hYWFhYWCIpIDI+L2Rldi9udWxsYCAmJgorICB0ZXN0IC1uICIkdG1wIiAmJiB0ZXN0IC1kICIkdG1wIgorfSAgfHwKK3sKKyAgdG1wPSRUTVBESVIvY3MkJC0kUkFORE9NCisgICh1bWFzayAwNzcgJiYgbWtkaXIgJHRtcCkKK30gfHwKK3sKKyAgIGVjaG8gIiRtZTogY2Fubm90IGNyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gJFRNUERJUiIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH0KK30KKworRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8RU9GCisKKyMKKyMgQ09ORklHX0ZJTEVTIHNlY3Rpb24uCisjCisKKyMgTm8gbmVlZCB0byBnZW5lcmF0ZSB0aGUgc2NyaXB0cyBpZiB0aGVyZSBhcmUgbm8gQ09ORklHX0ZJTEVTLgorIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdoZW4gLi9jb25maWcuc3RhdHVzIGNvbmZpZy5oCitpZiB0ZXN0IC1uICJcJENPTkZJR19GSUxFUyI7IHRoZW4KKyAgIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KKyAgc2VkICdzLyxAL0BALzsgcy9ALC9AQC87IHMvLDt0IHRcJC9AO3QgdC87IC9AO3QgdFwkL3MvW1xcXFwmLF0vXFxcXCYvZzsKKyAgIHMvQEAvLEAvOyBzL0BAL0AsLzsgcy9AO3QgdFwkLyw7dCB0LycgPlwkdG1wL3N1YnMuc2VkIDw8XFxDRU9GCitzLEBTSEVMTEAsJFNIRUxMLDt0IHQKK3MsQGV4ZWNfcHJlZml4QCwkZXhlY19wcmVmaXgsO3QgdAorcyxAcHJlZml4QCwkcHJlZml4LDt0IHQKK3MsQHByb2dyYW1fdHJhbnNmb3JtX25hbWVALCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lLDt0IHQKK3MsQGJpbmRpckAsJGJpbmRpciw7dCB0CitzLEBzYmluZGlyQCwkc2JpbmRpciw7dCB0CitzLEBsaWJleGVjZGlyQCwkbGliZXhlY2Rpciw7dCB0CitzLEBkYXRhZGlyQCwkZGF0YWRpciw7dCB0CitzLEBzeXNjb25mZGlyQCwkc3lzY29uZmRpciw7dCB0CitzLEBzaGFyZWRzdGF0ZWRpckAsJHNoYXJlZHN0YXRlZGlyLDt0IHQKK3MsQGxvY2Fsc3RhdGVkaXJALCRsb2NhbHN0YXRlZGlyLDt0IHQKK3MsQGxpYmRpckAsJGxpYmRpciw7dCB0CitzLEBpbmNsdWRlZGlyQCwkaW5jbHVkZWRpciw7dCB0CitzLEBvbGRpbmNsdWRlZGlyQCwkb2xkaW5jbHVkZWRpciw7dCB0CitzLEBpbmZvZGlyQCwkaW5mb2Rpciw7dCB0CitzLEBtYW5kaXJALCRtYW5kaXIsO3QgdAorcyxAUEFDS0FHRV9OQU1FQCwkUEFDS0FHRV9OQU1FLDt0IHQKK3MsQFBBQ0tBR0VfVEFSTkFNRUAsJFBBQ0tBR0VfVEFSTkFNRSw7dCB0CitzLEBQQUNLQUdFX1ZFUlNJT05ALCRQQUNLQUdFX1ZFUlNJT04sO3QgdAorcyxAUEFDS0FHRV9TVFJJTkdALCRQQUNLQUdFX1NUUklORyw7dCB0CitzLEBQQUNLQUdFX0JVR1JFUE9SVEAsJFBBQ0tBR0VfQlVHUkVQT1JULDt0IHQKK3MsQGJ1aWxkX2FsaWFzQCwkYnVpbGRfYWxpYXMsO3QgdAorcyxAaG9zdF9hbGlhc0AsJGhvc3RfYWxpYXMsO3QgdAorcyxAdGFyZ2V0X2FsaWFzQCwkdGFyZ2V0X2FsaWFzLDt0IHQKK3MsQEVDSE9fQ0AsJEVDSE9fQyw7dCB0CitzLEBFQ0hPX05ALCRFQ0hPX04sO3QgdAorcyxARUNIT19UQCwkRUNIT19ULDt0IHQKK3MsQFBBVEhfU0VQQVJBVE9SQCwkUEFUSF9TRVBBUkFUT1IsO3QgdAorcyxAREVGU0AsJERFRlMsO3QgdAorcyxATElCU0AsJExJQlMsO3QgdAorcyxAYnVpbGRALCRidWlsZCw7dCB0CitzLEBidWlsZF9jcHVALCRidWlsZF9jcHUsO3QgdAorcyxAYnVpbGRfdmVuZG9yQCwkYnVpbGRfdmVuZG9yLDt0IHQKK3MsQGJ1aWxkX29zQCwkYnVpbGRfb3MsO3QgdAorcyxAaG9zdEAsJGhvc3QsO3QgdAorcyxAaG9zdF9jcHVALCRob3N0X2NwdSw7dCB0CitzLEBob3N0X3ZlbmRvckAsJGhvc3RfdmVuZG9yLDt0IHQKK3MsQGhvc3Rfb3NALCRob3N0X29zLDt0IHQKK3MsQHRhcmdldEAsJHRhcmdldCw7dCB0CitzLEB0YXJnZXRfY3B1QCwkdGFyZ2V0X2NwdSw7dCB0CitzLEB0YXJnZXRfdmVuZG9yQCwkdGFyZ2V0X3ZlbmRvciw7dCB0CitzLEB0YXJnZXRfb3NALCR0YXJnZXRfb3MsO3QgdAorcyxASU5TVEFMTF9QUk9HUkFNQCwkSU5TVEFMTF9QUk9HUkFNLDt0IHQKK3MsQElOU1RBTExfU0NSSVBUQCwkSU5TVEFMTF9TQ1JJUFQsO3QgdAorcyxASU5TVEFMTF9EQVRBQCwkSU5TVEFMTF9EQVRBLDt0IHQKK3MsQFBBQ0tBR0VALCRQQUNLQUdFLDt0IHQKK3MsQFZFUlNJT05ALCRWRVJTSU9OLDt0IHQKK3MsQEVYRUVYVEAsJEVYRUVYVCw7dCB0CitzLEBPQkpFWFRALCRPQkpFWFQsO3QgdAorcyxAQUNMT0NBTEAsJEFDTE9DQUwsO3QgdAorcyxAQVVUT0NPTkZALCRBVVRPQ09ORiw7dCB0CitzLEBBVVRPTUFLRUAsJEFVVE9NQUtFLDt0IHQKK3MsQEFVVE9IRUFERVJALCRBVVRPSEVBREVSLDt0IHQKK3MsQE1BS0VJTkZPQCwkTUFLRUlORk8sO3QgdAorcyxAQU1UQVJALCRBTVRBUiw7dCB0CitzLEBpbnN0YWxsX3NoQCwkaW5zdGFsbF9zaCw7dCB0CitzLEBJTlNUQUxMX1NUUklQX1BST0dSQU1ALCRJTlNUQUxMX1NUUklQX1BST0dSQU0sO3QgdAorcyxAQVdLQCwkQVdLLDt0IHQKK3MsQFNFVF9NQUtFQCwkU0VUX01BS0UsO3QgdAorcyxAQU1ERVBfVFJVRUAsJEFNREVQX1RSVUUsO3QgdAorcyxAQU1ERVBfRkFMU0VALCRBTURFUF9GQUxTRSw7dCB0CitzLEBBTURFUEJBQ0tTTEFTSEAsJEFNREVQQkFDS1NMQVNILDt0IHQKK3MsQERFUERJUkAsJERFUERJUiw7dCB0CitzLEBFWElTVFNfR1NPQVBALCRFWElTVFNfR1NPQVAsO3QgdAorcyxAREVCVUdfVFJVRUAsJERFQlVHX1RSVUUsO3QgdAorcyxAREVCVUdfRkFMU0VALCRERUJVR19GQUxTRSw7dCB0CitzLEBDWFhERUJVR0RFRklORVNALCRDWFhERUJVR0RFRklORVMsO3QgdAorcyxAQVBYU19DWFhfT1BUSU9OU0AsJEFQWFNfQ1hYX09QVElPTlMsO3QgdAorcyxAQ0NALCRDQyw7dCB0CitzLEBDRkxBR1NALCRDRkxBR1MsO3QgdAorcyxATERGTEFHU0AsJExERkxBR1MsO3QgdAorcyxAQ1BQRkxBR1NALCRDUFBGTEFHUyw7dCB0CitzLEBhY19jdF9DQ0AsJGFjX2N0X0NDLDt0IHQKK3MsQGFtX19pbmNsdWRlQCwkYW1fX2luY2x1ZGUsO3QgdAorcyxAYW1fX3F1b3RlQCwkYW1fX3F1b3RlLDt0IHQKK3MsQENDREVQTU9ERUAsJENDREVQTU9ERSw7dCB0CitzLEBDUFBALCRDUFAsO3QgdAorcyxAQ1hYQCwkQ1hYLDt0IHQKK3MsQENYWEZMQUdTQCwkQ1hYRkxBR1MsO3QgdAorcyxAYWNfY3RfQ1hYQCwkYWNfY3RfQ1hYLDt0IHQKK3MsQENYWERFUE1PREVALCRDWFhERVBNT0RFLDt0IHQKK3MsQEVYSVNUU19BUFhTQCwkRVhJU1RTX0FQWFMsO3QgdAorcyxATE5fU0AsJExOX1MsO3QgdAorcyxARUNIT0AsJEVDSE8sO3QgdAorcyxAUkFOTElCQCwkUkFOTElCLDt0IHQKK3MsQGFjX2N0X1JBTkxJQkAsJGFjX2N0X1JBTkxJQiw7dCB0CitzLEBTVFJJUEAsJFNUUklQLDt0IHQKK3MsQGFjX2N0X1NUUklQQCwkYWNfY3RfU1RSSVAsO3QgdAorcyxARExMVE9PTEAsJERMTFRPT0wsO3QgdAorcyxAYWNfY3RfRExMVE9PTEAsJGFjX2N0X0RMTFRPT0wsO3QgdAorcyxAQVNALCRBUyw7dCB0CitzLEBhY19jdF9BU0AsJGFjX2N0X0FTLDt0IHQKK3MsQE9CSkRVTVBALCRPQkpEVU1QLDt0IHQKK3MsQGFjX2N0X09CSkRVTVBALCRhY19jdF9PQkpEVU1QLDt0IHQKK3MsQExJQlRPT0xALCRMSUJUT09MLDt0IHQKK3MsQExJQlRPT0xfREVQU0AsJExJQlRPT0xfREVQUyw7dCB0CitDRU9GCisKK0VPRgorCisgIGNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XEVPRgorICAjIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAorICAjIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KKyAgYWNfbWF4X3NlZF9saW5lcz00OAorICBhY19zZWRfZnJhZz0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KKyAgYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCisgIGFjX2VuZD0kYWNfbWF4X3NlZF9saW5lcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCisgIGFjX21vcmVfbGluZXM9OgorICBhY19zZWRfY21kcz0KKyAgd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCisgICAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCisgICAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgJHRtcC9zdWJzLnNlZCA+JHRtcC9zdWJzLmZyYWcKKyAgICBlbHNlCisgICAgICBzZWQgIiR7YWNfZW5kfXEiICR0bXAvc3Vicy5zZWQgPiR0bXAvc3Vicy5mcmFnCisgICAgZmkKKyAgICBpZiB0ZXN0ICEgLXMgJHRtcC9zdWJzLmZyYWc7IHRoZW4KKyAgICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKKyAgICBlbHNlCisgICAgICAjIFRoZSBwdXJwb3NlIG9mIHRoZSBsYWJlbCBhbmQgb2YgdGhlIGJyYW5jaGluZyBjb25kaXRpb24gaXMgdG8KKyAgICAgICMgc3BlZWQgdXAgdGhlIHNlZCBwcm9jZXNzaW5nIChpZiB0aGVyZSBhcmUgbm8gYEAnIGF0IGFsbCwgdGhlcmUKKyAgICAgICMgaXMgbm8gbmVlZCB0byBicm93c2UgYW55IG9mIHRoZSBzdWJzdGl0dXRpb25zKS4KKyAgICAgICMgVGhlc2UgYXJlIHRoZSB0d28gZXh0cmEgc2VkIGNvbW1hbmRzIG1lbnRpb25lZCBhYm92ZS4KKyAgICAgIChlY2hvICc6dAorICAvQFthLXpBLVpfXVthLXpBLVpfMC05XSpALyFiJyAmJiBjYXQgJHRtcC9zdWJzLmZyYWcpID4kdG1wL3N1YnMtJGFjX3NlZF9mcmFnLnNlZAorICAgICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICAJYWNfc2VkX2NtZHM9InNlZCAtZiAkdG1wL3N1YnMtJGFjX3NlZF9mcmFnLnNlZCIKKyAgICAgIGVsc2UKKyAgCWFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgJHRtcC9zdWJzLSRhY19zZWRfZnJhZy5zZWQiCisgICAgICBmaQorICAgICAgYWNfc2VkX2ZyYWc9YGV4cHIgJGFjX3NlZF9mcmFnICsgMWAKKyAgICAgIGFjX2JlZz0kYWNfZW5kCisgICAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2xpbmVzYAorICAgIGZpCisgIGRvbmUKKyAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICAgIGFjX3NlZF9jbWRzPWNhdAorICBmaQorZmkgIyB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIgorCitFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XEVPRgorZm9yIGFjX2ZpbGUgaW4gOiAkQ09ORklHX0ZJTEVTOyBkbyB0ZXN0ICJ4JGFjX2ZpbGUiID0geDogJiYgY29udGludWUKKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICRhY19maWxlIGluCisgIC0gfCAqOi0gfCAqOi06KiApICMgaW5wdXQgZnJvbSBzdGRpbgorICAgICAgICBjYXQgPiR0bXAvc3RkaW4KKyAgICAgICAgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLFteOl0qOiwsJ2AKKyAgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLDouKiwsJ2AgOzsKKyAgKjoqICkgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLFteOl0qOiwsJ2AKKyAgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLDouKiwsJ2AgOzsKKyAgKiApICAgYWNfZmlsZV9pbj0kYWNfZmlsZS5pbiA7OworICBlc2FjCisKKyAgIyBDb21wdXRlIEBzcmNkaXJALCBAdG9wX3NyY2RpckAsIGFuZCBASU5TVEFMTEAgZm9yIHN1YmRpcmVjdG9yaWVzLgorICBhY19kaXI9YCRhc19leHByIFgiJGFjX2ZpbGUiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisgICAgICAgICBYIiRhY19maWxlIiA6ICdYXCgvL1wpW14vXScgXHwgXAorICAgICAgICAgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKSQnIFx8IFwKKyAgICAgICAgIFgiJGFjX2ZpbGUiIDogJ1hcKC9cKScgXHwgXAorICAgICAgICAgLiAgICAgOiAnXCguXCknIDI+L2Rldi9udWxsIHx8CitlY2hvIFgiJGFjX2ZpbGUiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wvXClbXi9dLioveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wvXCkkL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cKS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIHMvLiovLi87IHEnYAorICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgICB7IGNhc2UgIiRhY19kaXIiIGluCisgIFtcXC9dKiB8ID86W1xcL10qICkgYXNfaW5jcl9kaXI9OzsKKyAgKikgICAgICAgICAgICAgICAgICAgICAgYXNfaW5jcl9kaXI9Ljs7Citlc2FjCithc19kdW1teT0iJGFjX2RpciIKK2ZvciBhc19ta2Rpcl9kaXIgaW4gYElGUz0nL1xcJzsgc2V0IFggJGFzX2R1bW15OyBzaGlmdDsgZWNobyAiJEAiYDsgZG8KKyAgY2FzZSAkYXNfbWtkaXJfZGlyIGluCisgICAgIyBTa2lwIERPUyBkcml2ZXNwZWMKKyAgICA/OikgYXNfaW5jcl9kaXI9JGFzX21rZGlyX2RpciA7OworICAgICopCisgICAgICBhc19pbmNyX2Rpcj0kYXNfaW5jcl9kaXIvJGFzX21rZGlyX2RpcgorICAgICAgdGVzdCAtZCAiJGFzX2luY3JfZGlyIiB8fCBta2RpciAiJGFzX2luY3JfZGlyIgorICAgIDs7CisgIGVzYWMKK2RvbmU7IH0KKworICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyxeXC4vLCwnYCIKKyAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorICAgIGFjX2RvdHM9YGVjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAncywvW14vXSosLi4vLGcnYAorICBlbHNlCisgICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KKyAgZmkKKworICBjYXNlICRzcmNkaXIgaW4KKyAgLikgIGFjX3NyY2Rpcj0uCisgICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4KKyAgICAgICAgIGFjX3RvcF9zcmNkaXI9LgorICAgICAgZWxzZQorICAgICAgICAgYWNfdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90cyB8IHNlZCAncywvJCwsJ2AKKyAgICAgIGZpIDs7CisgIFtcXC9dKiB8ID86W1xcL10qICkKKyAgICAgIGFjX3NyY2Rpcj0kc3JjZGlyJGFjX2Rpcl9zdWZmaXg7CisgICAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKKyAgKikgIyBSZWxhdGl2ZSBwYXRoLgorICAgIGFjX3NyY2Rpcj0kYWNfZG90cyRzcmNkaXIkYWNfZGlyX3N1ZmZpeAorICAgIGFjX3RvcF9zcmNkaXI9JGFjX2RvdHMkc3JjZGlyIDs7CisgIGVzYWMKKworICBjYXNlICRJTlNUQUxMIGluCisgIFtcXC8kXSogfCA/OltcXC9dKiApIGFjX0lOU1RBTEw9JElOU1RBTEwgOzsKKyAgKikgYWNfSU5TVEFMTD0kYWNfZG90cyRJTlNUQUxMIDs7CisgIGVzYWMKKworICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCisgICAgeyBlY2hvICIkYXNfbWU6OTAxNzogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNQorZWNobyAiJGFzX21lOiBjcmVhdGluZyAkYWNfZmlsZSIgPiY2O30KKyAgICBybSAtZiAiJGFjX2ZpbGUiCisgIGZpCisgICMgTGV0J3Mgc3RpbGwgcHJldGVuZCBpdCBpcyBgY29uZmlndXJlJyB3aGljaCBpbnN0YW50aWF0ZXMgKGkuZS4sIGRvbid0CisgICMgdXNlICRhc19tZSksIHBlb3BsZSB3b3VsZCBiZSBzdXJwcmlzZWQgdG8gcmVhZDoKKyAgIyAgICAvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZy5zdGF0dXMuICAqLworICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW4gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZCAncywuKi8sLCdgIGJ5IGNvbmZpZ3VyZS4iCisKKyAgIyBGaXJzdCBsb29rIGZvciB0aGUgaW5wdXQgZmlsZXMgaW4gdGhlIGJ1aWxkIHRyZWUsIG90aGVyd2lzZSBpbiB0aGUKKyAgIyBzcmMgdHJlZS4KKyAgYWNfZmlsZV9pbnB1dHM9YElGUz06CisgICAgZm9yIGYgaW4gJGFjX2ZpbGVfaW47IGRvCisgICAgICBjYXNlICRmIGluCisgICAgICAtKSBlY2hvICR0bXAvc3RkaW4gOzsKKyAgICAgIFtcXC8kXSopCisgICAgICAgICAjIEFic29sdXRlIChjYW4ndCBiZSBET1Mtc3R5bGUsIGFzIElGUz06KQorICAgICAgICAgdGVzdCAtZiAiJGYiIHx8IHsgeyBlY2hvICIkYXNfbWU6OTAzNTogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRmIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRmIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICAgICAgICBlY2hvICRmOzsKKyAgICAgICopICMgUmVsYXRpdmUKKyAgICAgICAgIGlmIHRlc3QgLWYgIiRmIjsgdGhlbgorICAgICAgICAgICAjIEJ1aWxkIHRyZWUKKyAgICAgICAgICAgZWNobyAkZgorICAgICAgICAgZWxpZiB0ZXN0IC1mICIkc3JjZGlyLyRmIjsgdGhlbgorICAgICAgICAgICAjIFNvdXJjZSB0cmVlCisgICAgICAgICAgIGVjaG8gJHNyY2Rpci8kZgorICAgICAgICAgZWxzZQorICAgICAgICAgICAjIC9kZXYvbnVsbCB0cmVlCisgICAgICAgICAgIHsgeyBlY2hvICIkYXNfbWU6OTA0ODogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRmIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRmIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICAgICAgICBmaTs7CisgICAgICBlc2FjCisgICAgZG9uZWAgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9CitFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8RU9GCisgIHNlZCAiJGFjX3Zwc3ViCiskZXh0cmFzdWIKK0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcRU9GCis6dAorL0BbYS16QS1aX11bYS16QS1aXzAtOV0qQC8hYgorcyxAY29uZmlndXJlX2lucHV0QCwkY29uZmlndXJlX2lucHV0LDt0IHQKK3MsQHNyY2RpckAsJGFjX3NyY2Rpciw7dCB0CitzLEB0b3Bfc3JjZGlyQCwkYWNfdG9wX3NyY2Rpciw7dCB0CitzLEBJTlNUQUxMQCwkYWNfSU5TVEFMTCw7dCB0CisiICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+JHRtcC9vdXQKKyAgcm0gLWYgJHRtcC9zdGRpbgorICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCisgICAgbXYgJHRtcC9vdXQgJGFjX2ZpbGUKKyAgZWxzZQorICAgIGNhdCAkdG1wL291dAorICAgIHJtIC1mICR0bXAvb3V0CisgIGZpCisKK2RvbmUKK0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcRU9GCisKKyMKKyMgQ09ORklHX0hFQURFUiBzZWN0aW9uLgorIworCisjIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQorIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCBhbmQgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgorIworIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgorYWNfZEE9J3MsXlwoWyAJXSpcKSNcKFsgCV0qZGVmaW5lWyAJXVsgCV0qXCknCithY19kQj0nWyAJXS4qJCxcMSNcMicKK2FjX2RDPScgJworYWNfZEQ9Jyw7dCcKKyMgYWNfdSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGhvdXQgdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCithY191QT0ncyxeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKK2FjX3VCPSckLFwxI1wyZGVmaW5lXDMnCithY191Qz0nICcKK2FjX3VEPScsO3QnCisKK2ZvciBhY19maWxlIGluIDogJENPTkZJR19IRUFERVJTOyBkbyB0ZXN0ICJ4JGFjX2ZpbGUiID0geDogJiYgY29udGludWUKKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICRhY19maWxlIGluCisgIC0gfCAqOi0gfCAqOi06KiApICMgaW5wdXQgZnJvbSBzdGRpbgorICAgICAgICBjYXQgPiR0bXAvc3RkaW4KKyAgICAgICAgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLFteOl0qOiwsJ2AKKyAgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLDouKiwsJ2AgOzsKKyAgKjoqICkgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLFteOl0qOiwsJ2AKKyAgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLDouKiwsJ2AgOzsKKyAgKiApICAgYWNfZmlsZV9pbj0kYWNfZmlsZS5pbiA7OworICBlc2FjCisKKyAgdGVzdCB4IiRhY19maWxlIiAhPSB4LSAmJiB7IGVjaG8gIiRhc19tZTo5MTA5OiBjcmVhdGluZyAkYWNfZmlsZSIgPiY1CitlY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19maWxlIiA+JjY7fQorCisgICMgRmlyc3QgbG9vayBmb3IgdGhlIGlucHV0IGZpbGVzIGluIHRoZSBidWlsZCB0cmVlLCBvdGhlcndpc2UgaW4gdGhlCisgICMgc3JjIHRyZWUuCisgIGFjX2ZpbGVfaW5wdXRzPWBJRlM9OgorICAgIGZvciBmIGluICRhY19maWxlX2luOyBkbworICAgICAgY2FzZSAkZiBpbgorICAgICAgLSkgZWNobyAkdG1wL3N0ZGluIDs7CisgICAgICBbXFwvJF0qKQorICAgICAgICAgIyBBYnNvbHV0ZSAoY2FuJ3QgYmUgRE9TLXN0eWxlLCBhcyBJRlM9OikKKyAgICAgICAgIHRlc3QgLWYgIiRmIiB8fCB7IHsgZWNobyAiJGFzX21lOjkxMjA6IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgICAgICAgZWNobyAkZjs7CisgICAgICAqKSAjIFJlbGF0aXZlCisgICAgICAgICBpZiB0ZXN0IC1mICIkZiI7IHRoZW4KKyAgICAgICAgICAgIyBCdWlsZCB0cmVlCisgICAgICAgICAgIGVjaG8gJGYKKyAgICAgICAgIGVsaWYgdGVzdCAtZiAiJHNyY2Rpci8kZiI7IHRoZW4KKyAgICAgICAgICAgIyBTb3VyY2UgdHJlZQorICAgICAgICAgICBlY2hvICRzcmNkaXIvJGYKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIyAvZGV2L251bGwgdHJlZQorICAgICAgICAgICB7IHsgZWNobyAiJGFzX21lOjkxMzM6IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgICAgICAgZmk7OworICAgICAgZXNhYworICAgIGRvbmVgIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorICAjIFJlbW92ZSB0aGUgdHJhaWxpbmcgc3BhY2VzLgorICBzZWQgJ3MvWyAJXSokLy8nICRhY19maWxlX2lucHV0cyA+JHRtcC9pbgorCitFT0YKKworIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIHR3byBzZWQgc2NyaXB0cywgYGNvbmZ0ZXN0LmRlZmluZXMnIGFuZAorIyBgY29uZnRlc3QudW5kZWZzJywgdGhhdCBzdWJzdGl0dXRlcyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvCisjIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBUaGUgZmlyc3QgaGFuZGxlcyBgI2RlZmluZScKKyMgdGVtcGxhdGVzLCBhbmQgdGhlIHNlY29uZCBgI3VuZGVmJyB0ZW1wbGF0ZXMuCisjIEFuZCBmaXJzdDogUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluCisjIGNvbmZpZy5zdGF0dXMuICBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudAorIyBpbiBjb25maWcuc3RhdHVzLgorcm0gLWYgY29uZnRlc3QuZGVmaW5lcyBjb25mdGVzdC51bmRlZnMKKyMgVXNpbmcgYSBoZXJlIGRvY3VtZW50IGluc3RlYWQgb2YgYSBzdHJpbmcgcmVkdWNlcyB0aGUgcXVvdGluZyBuaWdodG1hcmUuCisjIFB1dHRpbmcgY29tbWVudHMgaW4gc2VkIHNjcmlwdHMgaXMgbm90IHBvcnRhYmxlLgorIworIyBgZW5kJyBpcyB1c2VkIHRvIGF2b2lkIHRoYXQgdGhlIHNlY29uZCBtYWluIHNlZCBjb21tYW5kIChtZWFudCBmb3IKKyMgMC1hcnkgQ1BQIG1hY3JvcykgYXBwbGllcyB0byBuLWFyeSBtYWNybyBkZWZpbml0aW9ucy4KKyMgU2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIGZvciBgY2xlYXInLgorY2F0ID5jb25mZGVmMnNlZC5zZWQgPDxcRU9GCitzL1tcXCYsXS9cXCYvZworcyxbXFwkYF0sXFwmLGcKK3QgY2xlYXIKKzogY2xlYXIKK3MsXlsgCV0qI1sgCV0qZGVmaW5lWyAJXVsgCV0qXChcKFteIAkoXVteIAkoXSpcKShbXildKilcKVsgCV0qXCguKlwpJCwke2FjX2RBfVwyJHthY19kQn1cMSR7YWNfZEN9XDMke2FjX2REfSxncAordCBlbmQKK3MsXlsgCV0qI1sgCV0qZGVmaW5lWyAJXVsgCV0qXChbXiAJXVteIAldKlwpWyAJXSpcKC4qXCkkLCR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9LGdwCis6IGVuZAorRU9GCisjIElmIHNvbWUgbWFjcm9zIHdlcmUgY2FsbGVkIHNldmVyYWwgdGltZXMgdGhlcmUgbWlnaHQgYmUgc2V2ZXJhbCB0aW1lcworIyB0aGUgc2FtZSAjZGVmaW5lcywgd2hpY2ggaXMgdXNlbGVzcy4gIE5ldmVydGhlbGVzcywgd2UgbWF5IG5vdCB3YW50IHRvCisjIHNvcnQgdGhlbSwgc2luY2Ugd2Ugd2FudCB0aGUgKmxhc3QqIEFDLURFRklORSB0byBiZSBob25vcmVkLgordW5pcSBjb25mZGVmcy5oIHwgc2VkIC1uIC1mIGNvbmZkZWYyc2VkLnNlZCA+Y29uZnRlc3QuZGVmaW5lcworc2VkICdzL2FjX2QvYWNfdS9nJyBjb25mdGVzdC5kZWZpbmVzID5jb25mdGVzdC51bmRlZnMKK3JtIC1mIGNvbmZkZWYyc2VkLnNlZAorCisjIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCisjIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCisjIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KK2NhdCA+PmNvbmZ0ZXN0LnVuZGVmcyA8PFxFT0YKK3MsXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qLC8qICYgKi8sCitFT0YKKworIyBCcmVhayB1cCBjb25mdGVzdC5kZWZpbmVzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uIHRoZSBzaXplCisjIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vICgxMDAgY21kcykuCitlY2hvICcgICMgSGFuZGxlIGFsbCB0aGUgI2RlZmluZSB0ZW1wbGF0ZXMgb25seSBpZiBuZWNlc3NhcnkuJyA+PiRDT05GSUdfU1RBVFVTCitlY2hvICcgIGlmIGVncmVwICJeWyAJXSojWyAJXSpkZWZpbmUiICR0bXAvaW4gPi9kZXYvbnVsbDsgdGhlbicgPj4kQ09ORklHX1NUQVRVUworZWNobyAnICAjIElmIHRoZXJlIGFyZSBubyBkZWZpbmVzLCB3ZSBtYXkgaGF2ZSBhbiBlbXB0eSBpZi9maScgPj4kQ09ORklHX1NUQVRVUworZWNobyAnICA6JyA+PiRDT05GSUdfU1RBVFVTCitybSAtZiBjb25mdGVzdC50YWlsCit3aGlsZSBncmVwIC4gY29uZnRlc3QuZGVmaW5lcyA+L2Rldi9udWxsCitkbworICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gJHRtcC9kZWZpbmVzLnNlZC4KKyAgZWNobyAnICBjYXQgPiR0bXAvZGVmaW5lcy5zZWQgPDxDRU9GJyA+PiRDT05GSUdfU1RBVFVTCisgICMgU3BlZWQgdXA6IGRvbid0IGNvbnNpZGVyIHRoZSBub24gYCNkZWZpbmUnIGxpbmVzLgorICBlY2hvICcvXlsgCV0qI1sgCV0qZGVmaW5lLyFiJyA+PiRDT05GSUdfU1RBVFVTCisgICMgV29yayBhcm91bmQgdGhlIGZvcmdldC10by1yZXNldC10aGUtZmxhZyBidWcuCisgIGVjaG8gJ3QgY2xyJyA+PiRDT05GSUdfU1RBVFVTCisgIGVjaG8gJzogY2xyJyA+PiRDT05GSUdfU1RBVFVTCisgIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QuZGVmaW5lcyA+PiRDT05GSUdfU1RBVFVTCisgIGVjaG8gJ0NFT0YKKyAgc2VkIC1mICR0bXAvZGVmaW5lcy5zZWQgJHRtcC9pbiA+JHRtcC9vdXQKKyAgcm0gLWYgJHRtcC9pbgorICBtdiAkdG1wL291dCAkdG1wL2luCisnID4+JENPTkZJR19TVEFUVVMKKyAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LmRlZmluZXMgPmNvbmZ0ZXN0LnRhaWwKKyAgcm0gLWYgY29uZnRlc3QuZGVmaW5lcworICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LmRlZmluZXMKK2RvbmUKK3JtIC1mIGNvbmZ0ZXN0LmRlZmluZXMKK2VjaG8gJyAgZmkgIyBlZ3JlcCcgPj4kQ09ORklHX1NUQVRVUworZWNobyA+PiRDT05GSUdfU1RBVFVTCisKKyMgQnJlYWsgdXAgY29uZnRlc3QudW5kZWZzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uIHRoZSBzaXplCisjIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vICgxMDAgY21kcykuCitlY2hvICcgICMgSGFuZGxlIGFsbCB0aGUgI3VuZGVmIHRlbXBsYXRlcycgPj4kQ09ORklHX1NUQVRVUworcm0gLWYgY29uZnRlc3QudGFpbAord2hpbGUgZ3JlcCAuIGNvbmZ0ZXN0LnVuZGVmcyA+L2Rldi9udWxsCitkbworICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gJHRtcC91bmRlZnMuc2VkLgorICBlY2hvICcgIGNhdCA+JHRtcC91bmRlZnMuc2VkIDw8Q0VPRicgPj4kQ09ORklHX1NUQVRVUworICAjIFNwZWVkIHVwOiBkb24ndCBjb25zaWRlciB0aGUgbm9uIGAjdW5kZWYnCisgIGVjaG8gJy9eWyAJXSojWyAJXSp1bmRlZi8hYicgPj4kQ09ORklHX1NUQVRVUworICAjIFdvcmsgYXJvdW5kIHRoZSBmb3JnZXQtdG8tcmVzZXQtdGhlLWZsYWcgYnVnLgorICBlY2hvICd0IGNscicgPj4kQ09ORklHX1NUQVRVUworICBlY2hvICc6IGNscicgPj4kQ09ORklHX1NUQVRVUworICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnVuZGVmcyA+PiRDT05GSUdfU1RBVFVTCisgIGVjaG8gJ0NFT0YKKyAgc2VkIC1mICR0bXAvdW5kZWZzLnNlZCAkdG1wL2luID4kdG1wL291dAorICBybSAtZiAkdG1wL2luCisgIG12ICR0bXAvb3V0ICR0bXAvaW4KKycgPj4kQ09ORklHX1NUQVRVUworICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudW5kZWZzID5jb25mdGVzdC50YWlsCisgIHJtIC1mIGNvbmZ0ZXN0LnVuZGVmcworICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnVuZGVmcworZG9uZQorcm0gLWYgY29uZnRlc3QudW5kZWZzCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XEVPRgorICAjIExldCdzIHN0aWxsIHByZXRlbmQgaXQgaXMgYGNvbmZpZ3VyZScgd2hpY2ggaW5zdGFudGlhdGVzIChpLmUuLCBkb24ndAorICAjIHVzZSAkYXNfbWUpLCBwZW9wbGUgd291bGQgYmUgc3VycHJpc2VkIHRvIHJlYWQ6CisgICMgICAgLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWcuc3RhdHVzLiAgKi8KKyAgaWYgdGVzdCB4IiRhY19maWxlIiA9IHgtOyB0aGVuCisgICAgZWNobyAiLyogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgKi8iID4kdG1wL2NvbmZpZy5oCisgIGVsc2UKKyAgICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+JHRtcC9jb25maWcuaAorICBmaQorICBjYXQgJHRtcC9pbiA+PiR0bXAvY29uZmlnLmgKKyAgcm0gLWYgJHRtcC9pbgorICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCisgICAgaWYgY21wIC1zICRhY19maWxlICR0bXAvY29uZmlnLmggMj4vZGV2L251bGw7IHRoZW4KKyAgICAgIHsgZWNobyAiJGFzX21lOjkyNTA6ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY1CitlY2hvICIkYXNfbWU6ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY2O30KKyAgICBlbHNlCisgICAgICBhY19kaXI9YCRhc19leHByIFgiJGFjX2ZpbGUiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisgICAgICAgICBYIiRhY19maWxlIiA6ICdYXCgvL1wpW14vXScgXHwgXAorICAgICAgICAgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKSQnIFx8IFwKKyAgICAgICAgIFgiJGFjX2ZpbGUiIDogJ1hcKC9cKScgXHwgXAorICAgICAgICAgLiAgICAgOiAnXCguXCknIDI+L2Rldi9udWxsIHx8CitlY2hvIFgiJGFjX2ZpbGUiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wvXClbXi9dLioveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wvXCkkL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cKS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIHMvLiovLi87IHEnYAorICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgICAgICAgIHsgY2FzZSAiJGFjX2RpciIgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSogKSBhc19pbmNyX2Rpcj07OworICAqKSAgICAgICAgICAgICAgICAgICAgICBhc19pbmNyX2Rpcj0uOzsKK2VzYWMKK2FzX2R1bW15PSIkYWNfZGlyIgorZm9yIGFzX21rZGlyX2RpciBpbiBgSUZTPScvXFwnOyBzZXQgWCAkYXNfZHVtbXk7IHNoaWZ0OyBlY2hvICIkQCJgOyBkbworICBjYXNlICRhc19ta2Rpcl9kaXIgaW4KKyAgICAjIFNraXAgRE9TIGRyaXZlc3BlYworICAgID86KSBhc19pbmNyX2Rpcj0kYXNfbWtkaXJfZGlyIDs7CisgICAgKikKKyAgICAgIGFzX2luY3JfZGlyPSRhc19pbmNyX2Rpci8kYXNfbWtkaXJfZGlyCisgICAgICB0ZXN0IC1kICIkYXNfaW5jcl9kaXIiIHx8IG1rZGlyICIkYXNfaW5jcl9kaXIiCisgICAgOzsKKyAgZXNhYworZG9uZTsgfQorCisgICAgICBmaQorICAgICAgcm0gLWYgJGFjX2ZpbGUKKyAgICAgIG12ICR0bXAvY29uZmlnLmggJGFjX2ZpbGUKKyAgICBmaQorICBlbHNlCisgICAgY2F0ICR0bXAvY29uZmlnLmgKKyAgICBybSAtZiAkdG1wL2NvbmZpZy5oCisgIGZpCisgICMgUnVuIHRoZSBjb21tYW5kcyBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGUuCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgICBjb25maWcuaCApICMgdXBkYXRlIHRoZSB0aW1lc3RhbXAKK2VjaG8gdGltZXN0YW1wID4iLi9zdGFtcC1oMSIKKyA7OworICBlc2FjCitkb25lCitFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XEVPRgorCisjCisjIENPTkZJR19DT01NQU5EUyBzZWN0aW9uLgorIworZm9yIGFjX2ZpbGUgaW4gOiAkQ09ORklHX0NPTU1BTkRTOyBkbyB0ZXN0ICJ4JGFjX2ZpbGUiID0geDogJiYgY29udGludWUKKyAgYWNfZGVzdD1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLDouKiwsJ2AKKyAgYWNfc291cmNlPWBlY2hvICIkYWNfZmlsZSIgfCBzZWQgJ3MsW146XSo6LCwnYAorCisgIGNhc2UgJGFjX2Rlc3QgaW4KKyAgICBkZWZhdWx0LTEgKQordGVzdCB4IiRBTURFUF9UUlVFIiAhPSB4IiIgfHwKK2ZvciBtZiBpbiAkQ09ORklHX0ZJTEVTOyBkbworICBjYXNlICIkbWYiIGluCisgIE1ha2VmaWxlKSBkaXJwYXJ0PS47OworICAqL01ha2VmaWxlKSBkaXJwYXJ0PWBlY2hvICIkbWYiIHwgc2VkIC1lICdzfC9bXi9dKiR8fCdgOzsKKyAgKikgY29udGludWU7OworICBlc2FjCisgIGdyZXAgJ15ERVBfRklMRVMgKj0gKlteICNdJyA8ICIkbWYiID4gL2Rldi9udWxsIHx8IGNvbnRpbnVlCisgICMgRXh0cmFjdCB0aGUgZGVmaW5pdGlvbiBvZiBERVBfRklMRVMgZnJvbSB0aGUgTWFrZWZpbGUgd2l0aG91dAorICAjIHJ1bm5pbmcgYG1ha2UnLgorICBERVBESVI9YHNlZCAtbiAtZSAnL15ERVBESVIgPSAvIHMvLy9wJyA8ICIkbWYiYAorICB0ZXN0IC16ICIkREVQRElSIiAmJiBjb250aW51ZQorICAjIFdoZW4gdXNpbmcgYW5zaTJrbnIsIFUgbWF5IGJlIGVtcHR5IG9yIGFuIHVuZGVyc2NvcmU7IGV4cGFuZCBpdAorICBVPWBzZWQgLW4gLWUgJy9eVSA9IC8gcy8vL3AnIDwgIiRtZiJgCisgIHRlc3QgLWQgIiRkaXJwYXJ0LyRERVBESVIiIHx8IG1rZGlyICIkZGlycGFydC8kREVQRElSIgorICAjIFdlIGludm9rZSBzZWQgdHdpY2UgYmVjYXVzZSBpdCBpcyB0aGUgc2ltcGxlc3QgYXBwcm9hY2ggdG8KKyAgIyBjaGFuZ2luZyAkKERFUERJUikgdG8gaXRzIGFjdHVhbCB2YWx1ZSBpbiB0aGUgZXhwYW5zaW9uLgorICBmb3IgZmlsZSBpbiBgc2VkIC1uIC1lICcKKyAgICAvXkRFUF9GSUxFUyA9IC4qXFxcXCQvIHsKKyAgICAgIHMvXkRFUF9GSUxFUyA9IC8vCisgICAgICA6bG9vcAorCXMvXFxcXCQvLworCXAKKwluCisJL1xcXFwkLyBiIGxvb3AKKyAgICAgIHAKKyAgICB9CisgICAgL15ERVBfRklMRVMgPSAvIHMvXkRFUF9GSUxFUyA9IC8vcCcgPCAiJG1mIiB8IFwKKyAgICAgICBzZWQgLWUgJ3MvXCQoREVQRElSKS8nIiRERVBESVIiJy9nJyAtZSAncy9cJFUvJyIkVSInL2cnYDsgZG8KKyAgICAjIE1ha2Ugc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0cy4KKyAgICB0ZXN0IC1mICIkZGlycGFydC8kZmlsZSIgJiYgY29udGludWUKKyAgICBmZGlyPWBlY2hvICIkZmlsZSIgfCBzZWQgLWUgJ3N8L1teL10qJHx8J2AKKyAgICAkYWNfYXV4X2Rpci9ta2luc3RhbGxkaXJzICIkZGlycGFydC8kZmRpciIgPiAvZGV2L251bGwgMj4mMQorICAgICMgZWNobyAiY3JlYXRpbmcgJGRpcnBhcnQvJGZpbGUiCisgICAgZWNobyAnIyBkdW1teScgPiAiJGRpcnBhcnQvJGZpbGUiCisgIGRvbmUKK2RvbmUKKyA7OworICBlc2FjCitkb25lCitFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcRU9GCisKK3sgKGV4aXQgMCk7IGV4aXQgMDsgfQorRU9GCitjaG1vZCAreCAkQ09ORklHX1NUQVRVUworYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKKworIyBjb25maWd1cmUgaXMgd3JpdGluZyB0byBjb25maWcubG9nLCBhbmQgdGhlbiBjYWxscyBjb25maWcuc3RhdHVzLgorIyBjb25maWcuc3RhdHVzIGRvZXMgaXRzIG93biByZWRpcmVjdGlvbiwgYXBwZW5kaW5nIHRvIGNvbmZpZy5sb2cuCisjIFVuZm9ydHVuYXRlbHksIG9uIERPUyB0aGlzIGZhaWxzLCBhcyBjb25maWcubG9nIGlzIHN0aWxsIGtlcHQgb3BlbgorIyBieSBjb25maWd1cmUsIHNvIGNvbmZpZy5zdGF0dXMgd29uJ3QgYmUgYWJsZSB0byB3cml0ZSB0byBpdDsgaXRzCisjIG91dHB1dCBpcyBzaW1wbHkgZGlzY2FyZGVkLiAgU28gd2UgZXhlYyB0aGUgRkQgdG8gL2Rldi9udWxsLAorIyBlZmZlY3RpdmVseSBjbG9zaW5nIGNvbmZpZy5sb2csIHNvIGl0IGNhbiBiZSBwcm9wZXJseSAocmUpb3BlbmVkIGFuZAorIyBhcHBlbmRlZCB0byBieSBjb25maWcuc3RhdHVzLiAgV2hlbiBjb21pbmcgYmFjayB0byBjb25maWd1cmUsIHdlCisjIG5lZWQgdG8gbWFrZSB0aGUgRkQgYXZhaWxhYmxlIGFnYWluLgoraWYgdGVzdCAiJG5vX2NyZWF0ZSIgIT0geWVzOyB0aGVuCisgIGFjX2NzX3N1Y2Nlc3M9OgorICBleGVjIDU+L2Rldi9udWxsCisgICRTSEVMTCAkQ09ORklHX1NUQVRVUyB8fCBhY19jc19zdWNjZXNzPWZhbHNlCisgIGV4ZWMgNT4+Y29uZmlnLmxvZworICAjIFVzZSB8fCwgbm90ICYmLCB0byBhdm9pZCBleGl0aW5nIGZyb20gdGhlIGlmIHdpdGggJD8gPSAxLCB3aGljaAorICAjIHdvdWxkIG1ha2UgY29uZmlndXJlIGZhaWwgaWYgdGhpcyBpcyB0aGUgbGFzdCBpbnN0cnVjdGlvbi4KKyAgJGFjX2NzX3N1Y2Nlc3MgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9CitmaQorCmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvY29uZmlndXJlLmluIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL2NvbmZpZ3VyZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNDNjOGU5Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL2NvbmZpZ3VyZS5pbgpAQCAtMCwwICsxLDExMyBAQAorZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCitBQ19JTklUKG1vZF9nc29hcC9tb2RfZ3NvYXAuYykKKworQUNfQ09ORklHX1NSQ0RJUihtb2RfZ3NvYXAvbW9kX2dzb2FwLmMpCitBQ19DT1BZUklHSFQoW0RpcGwuLUluZy4gQ2hyaXN0aWFuIEFiZXJnZXIgKGh0dHA6Ly93d3cuYWJlcmdlci5hdCldKQorQUNfQ0FOT05JQ0FMX0hPU1QKK0FDX0NBTk9OSUNBTF9TWVNURU0KK0FNX0lOSVRfQVVUT01BS0UobW9kX2dzb2FwLCAwLjAuNSkKK0FNX0NPTkZJR19IRUFERVIoY29uZmlnLmgpCitkbmwgQUNfQ09ORklHX0hFQURFUlMoY29uZmlnLmgpCisKK2RubCBBc2sgdXNlciBmb3IgcGF0aCB0byBnc29hcCBsaWJyYXJ5OgorI0FDX0FSR19XSVRIKGdzb2FwLAorIyAgICBbICAtLXdpdGgtZ3NvYXA9PHBhdGg+ICAgcHJlZml4IG9mIGdzb2FwIHBvcnQgaW5zdGFsbGF0aW9uLiBlLmcuIC91c3IvbG9jYWwvc29hcGNwcCBvciAvaG9tZS9teXVzZXJuYW1lL2dzb2FwXSwKKyMgICAgW0dTT0FQX1BSRUZJWD0kd2l0aF9nc29hcF0sCisjICAgIEFDX01TR19FUlJPUihbWW91IG11c3QgY2FsbCBjb25maWd1cmUgd2l0aCB0aGUgLS13aXRoLWdzb2FwPTxwYXRoPiBvcHRpb24uIDxwYXRoPiBpcyB0aGUgcGF0aCB3aGVyZSB5b3UgdW5wYWNrZWQgdGhlIGdzb2FwIGRpc3RyaWJ1dGlvbiB0by4KKyMgICAgVGhlIGhlYWRlcnMgYW5kIHNvdXJjZSBkb3dubG9hZGVkIGZyb20gaHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL3NvYXAuaHRtbCBtdXN0IGJlIGF2YWlsYWJsZS4KKyMgICAgZS5nLiAtLXdpdGgtZ3NvYXA9L3Vzci9sb2NhbC9nc29hcF0pCisjKQorCisjQUNfQ0hFQ0tfRklMRShbWyR3aXRoX2dzb2FwL3N0ZHNvYXAyLmhdXSwgW2VjaG8gc3Rkc29hcDIuaCBmb3VuZCBpbiAkd2l0aF9nc29hcF0sIEFDX01TR19FUlJPUihbJHdpdGhfZ3NvYXAgZG9lcyBub3QgY29udGFpbiBzdGRzb2FwMi5oXSkpCisKKworCisjQUNfU1VCU1QoR1NPQVBfUFJFRklYKQorI0dTT0FQX0NQUF9TUkM9IiR7R1NPQVBfUFJFRklYfS9zdGRzb2FwMi5jcHAiCisjR1NPQVBfQ19TUkM9IiR7R1NPQVBfUFJFRklYfS9zdGRzb2FwMi5jIgorI0dTT0FQX0lOQ0xVREU9Ii1JJHtHU09BUF9QUkVGSVh9IgorI0FDX1NVQlNUKEdTT0FQX0NQUF9TUkMpCisjQUNfU1VCU1QoR1NPQVBfQ19TUkMpCisjQUNfU1VCU1QoR1NPQVBfSU5DTFVERSkKKworQUNfQ0hFQ0tfUFJPRyhFWElTVFNfR1NPQVAsIHNvYXBjcHAyLCB5ZXMsICkKK2lmIHRlc3QgLXogIiRFWElTVFNfR1NPQVAiOyB0aGVuCisgICBBQ19NU0dfRVJST1IoW3BsZWFzZSBpbnN0YWxsIGdzb2FwIC0gaHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL3NvYXAuaHRtbF0pCitmaQorCitkbmwgdGhlIGRlYnVnIGJ1aWxkIG9wdGlvbnMgYWRkcyBzeW1ib2xzIHRvIGNvbXBpbGVyIG91dHB1dCAoLWcgZm9yIGcrKykgCitBQ19BUkdfRU5BQkxFKGRlYnVnLAorWyAgLS1lbmFibGUtZGVidWcJYWRkIGRlYnVnIHN5bWJvbHMgdG8gY29tcGlsZXIgYW5kIGxpbmtlciBvdXRwdXQgZm9yIHNvdXJjZSBjb2RlIGRlYnVnZ2luZ10sCitbY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpIGRlYnVnPXRydWUgOzsKKyAgbm8pICBkZWJ1Zz1mYWxzZSA7OworICAqKSBBQ19NU0dfRVJST1IoYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgLS1lbmFibGUtZGVidWcpIDs7Citlc2FjXSxbZGVidWc9ZmFsc2VdKQorQU1fQ09ORElUSU9OQUwoREVCVUcsIHRlc3QgeCRkZWJ1ZyA9IHh0cnVlKQorCitDWFhGTEFHUz0iIgoraWYgdGVzdCB4JGRlYnVnID0geHRydWU7IHRoZW4KKyAgIENYWERFQlVHREVGSU5FUz0iLURfREVCVUciCisgICBBUFhTX0NYWF9PUFRJT05TPSItV2MsLWciCitlbHNlIAorICAgQ1hYREVCVUdERUZJTkVTPSItRF9OREVCVUciCisgICBBUFhTX0NYWF9PUFRJT05TPSIiCitmaQkJCQkJICAKK0FDX1NVQlNUKENYWERFQlVHREVGSU5FUykKK0FDX1NVQlNUKEFQWFNfQ1hYX09QVElPTlMpCitkbmwgQUNfQ0hFQ0tfQ09NUElMRVJTCitBQ19QUk9HX0NDCitBQ19QUk9HX0NQUAorQUNfUFJPR19DWFgKKworQUNfQ0hFQ0tfUFJPRyhFWElTVFNfQVBYUywgYXB4cywgeWVzLCApCitpZiB0ZXN0IC16ICIkRVhJU1RTX0FQWFMiOyB0aGVuCisgICBBQ19NU0dfRVJST1IoW3BsZWFzZSBpbnN0YWxsIHRoZSBhcGFjaGUgYXB4cyB0b29sLiBEb3dubG9hZCBhcGFjaGUgaHR0cCBzZXJ2ZXIgZnJvbSBodHRwOi8vd3d3LmFwYWNoZS5vcmcsIGNvbXBpbGUgYW5kIGluc3RhbGwgaXQgYW5kIG1ha2Ugc3VyZSB0aGF0IGFweHMgaXMgaW4geW91ciBwYXRoXSkKK2ZpCisKK2RubCBFeHRyYSBwYXJhbXMgZm9yIGdjYworaWYgdGVzdCAiJEdDQyI7IHRoZW4KKyAgIGlmIHRlc3QgeCRkZWJ1ZyA9IHh0cnVlOyB0aGVuCisJICBDWFhGTEFHUz0iJENYWEZMQUdTIC1nIgorICAgZWxzZSAKKwkgIENYWEZMQUdTPSIkQ1hYRkxBR1MgLU8yIgorICAgZmkJCQkJCSAgCitmaQorQUNfU1VCU1QoQ1hYRkxBR1MpCisKK0FDX0xJQlRPT0xfRExPUEVOCitBQ19MSUJUT09MX1dJTjMyX0RMTAorQU1fUFJPR19MSUJUT09MCitBQ19TVUJTVChMSUJUT09MX0RFUFMpCitBQ19FTkFCTEVfU0hBUkVEKHllcykKK0FDX0VOQUJMRV9TVEFUSUMoeWVzKQorCitkbmwgY2hlY2sgZm9yIGZ1bmN0aW9ucy4KK0FDX0NIRUNLX0ZVTkNTKFtnZXRjd2RdKQorQUNfQ0hFQ0tfRlVOQ1MoW21lbXNldF0pCisKK2RubCBDaGVja3MgZm9yIHByb2dyYW1zLgorQUNfUFJPR19BV0sKK0FDX1BST0dfSU5TVEFMTAorQUNfUFJPR19SQU5MSUIKK2RubCBDaGVja3MgZm9yIGxpYnJhcmllcy4KKworZG5sIENoZWNrcyBmb3IgaGVhZGVyIGZpbGVzLgorQUNfSEVBREVSX1NUREMKKworZG5sIENoZWNrcyBmb3IgdHlwZWRlZnMsIHN0cnVjdHVyZXMsIGFuZCBjb21waWxlciBjaGFyYWN0ZXJpc3RpY3MuCitBQ19DX0NPTlNUCitBQ19UWVBFX1NJWkVfVAorQUNfQ0hFQ0tfSEVBREVSUyhzeXMvdHlwZXMuaCBzeXMvc29ja2V0LmggdW5pc3RkLmggbmV0aW5ldC9pbi5oKQorQUNfQ0hFQ0tfSEVBREVSUyhhcnBhL2luZXQuaCBuZXRkYi5oIHN5cy9pb2N0bC5oIGVycm5vLmgpCitBQ19DSEVDS19IRUFERVJTKHN5cy90aW1lLmgpCitBQ19DSEVDS19IRUFERVJTKGx0ZGwuaCkKK0FDX0NIRUNLX0hFQURFUlMoc3Rkc29hcDIuaCkKKworZG5sIEFDX0NIRUNLX0xJQihzb2NrZXQsIHNvY2tldCwgW0xJQlNPQ0tFVD0iLWxzb2NrZXQgLWxuc2wiXSkgZG5sIGZvciBTb2xhcmlzJyBYMTEKK2RubCBBQ19TVUJTVChMSUJTT0NLRVQpCisKK2RubCBDaGVja3MgZm9yIGxpYnJhcnkgZnVuY3Rpb25zLgorZG5sIEFDX0FSR19QUk9HUkFNCisKK0FDX09VVFBVVChNYWtlZmlsZSBDb25zb2xlU2VydmVyL01ha2VmaWxlIENvbnNvbGVTZXJ2ZXIvZm9vL01ha2VmaWxlIGV4YW1wbGUvTWFrZWZpbGUgZXhhbXBsZS9jYWxjdWxhdG9yL01ha2VmaWxlIG1vZF9nc29hcC9NYWtlZmlsZSkKZGlmZiAtLWdpdCBhL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9jb25maWd1cmUuc2NhbiBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9jb25maWd1cmUuc2NhbgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45ZTY1Y2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL2NvbmZpZ3VyZS5zY2FuCkBAIC0wLDAgKzEsNDEgQEAKKyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KK0FDX0lOSVQoRlVMTC1QQUNLQUdFLU5BTUUsIFZFUlNJT04sIEJVRy1SRVBPUlQtQUREUkVTUykKK0FDX0NPTkZJR19TUkNESVIoW2NvbmZpZy5oLmluXSkKK0FDX0NPTkZJR19IRUFERVIoW2NvbmZpZy5oXSkKKworIyBDaGVja3MgZm9yIHByb2dyYW1zLgorQUNfUFJPR19DWFgKK0FDX1BST0dfQ0MKK0FDX1BST0dfQ1BQCitBQ19QUk9HX0lOU1RBTEwKK0FDX1BST0dfTE5fUworQUNfUFJPR19NQUtFX1NFVAorQUNfUFJPR19SQU5MSUIKK0FDX1BST0dfQVdLCisKKyMgQ2hlY2tzIGZvciBsaWJyYXJpZXMuCisjIEZJWE1FOiBSZXBsYWNlIGBtYWluJyB3aXRoIGEgZnVuY3Rpb24gaW4gYC1sZSc6CitBQ19DSEVDS19MSUIoW2VdLCBbbWFpbl0pCisjIEZJWE1FOiBSZXBsYWNlIGBtYWluJyB3aXRoIGEgZnVuY3Rpb24gaW4gYC1saW5rcyc6CitBQ19DSEVDS19MSUIoW2lua3NdLCBbbWFpbl0pCisjIEZJWE1FOiBSZXBsYWNlIGBtYWluJyB3aXRoIGEgZnVuY3Rpb24gaW4gYC1sbHRkbCc6CitBQ19DSEVDS19MSUIoW2x0ZGxdLCBbbWFpbl0pCisjIEZJWE1FOiBSZXBsYWNlIGBtYWluJyB3aXRoIGEgZnVuY3Rpb24gaW4gYC1scHRocmVhZCc6CitBQ19DSEVDS19MSUIoW3B0aHJlYWRdLCBbbWFpbl0pCisKKyMgQ2hlY2tzIGZvciBoZWFkZXIgZmlsZXMuCitBQ19DSEVDS19IRUFERVJTKFttZW1vcnkuaCB1bmlzdGQuaF0pCisKKyMgQ2hlY2tzIGZvciB0eXBlZGVmcywgc3RydWN0dXJlcywgYW5kIGNvbXBpbGVyIGNoYXJhY3RlcmlzdGljcy4KK0FDX0NfQ09OU1QKKworIyBDaGVja3MgZm9yIGxpYnJhcnkgZnVuY3Rpb25zLgorQUNfSEVBREVSX1NUREMKK0FDX0NIRUNLX0ZVTkNTKFtnZXRjd2QgbWVtc2V0XSkKKworQUNfQ09ORklHX0ZJTEVTKFtDb25zb2xlU2VydmVyL01ha2VmaWxlCisgICAgICAgICAgICAgICAgIENvbnNvbGVTZXJ2ZXIvZm9vL01ha2VmaWxlCisgICAgICAgICAgICAgICAgIE1ha2VmaWxlCisgICAgICAgICAgICAgICAgIGV4YW1wbGUvY2FsY3VsYXRvci9NYWtlZmlsZQorICAgICAgICAgICAgICAgICBtb2RfZ3NvYXAvTWFrZWZpbGVdKQorQUNfT1VUUFVUCmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvZGVwY29tcCBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9kZXBjb21wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ODk5NjUKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvZGVwY29tcApAQCAtMCwwICsxLDQxMSBAQAorIyEgL2Jpbi9zaAorCisjIGRlcGNvbXAgLSBjb21waWxlIGEgcHJvZ3JhbSBnZW5lcmF0aW5nIGRlcGVuZGVuY2llcyBhcyBzaWRlLWVmZmVjdHMKKyMgQ29weXJpZ2h0IDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorIyAwMjExMS0xMzA3LCBVU0EuCisKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisjIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBBbGV4YW5kcmUgT2xpdmEgPG9saXZhQGRjYy51bmljYW1wLmJyPi4KKworaWYgdGVzdCAteiAiJGRlcG1vZGUiIHx8IHRlc3QgLXogIiRzb3VyY2UiIHx8IHRlc3QgLXogIiRvYmplY3QiOyB0aGVuCisgIGVjaG8gImRlcGNvbXA6IFZhcmlhYmxlcyBzb3VyY2UsIG9iamVjdCBhbmQgZGVwbW9kZSBtdXN0IGJlIHNldCIgMT4mMgorICBleGl0IDEKK2ZpCisjIGBsaWJ0b29sJyBjYW4gYWxzbyBiZSBzZXQgdG8gYHllcycgb3IgYG5vJy4KKworZGVwZmlsZT0ke2RlcGZpbGUtYGVjaG8gIiRvYmplY3QiIHwgc2VkICdzLFwoW14vXSpcKSQsLmRlcHMvXDEsO3MvXC5cKFteLl0qXCkkLy5QXDEvJ2B9Cit0bXBkZXBmaWxlPSR7dG1wZGVwZmlsZS1gZWNobyAiJGRlcGZpbGUiIHwgc2VkICdzL1wuXChbXi5dKlwpJC8uVFwxLydgfQorCitybSAtZiAiJHRtcGRlcGZpbGUiCisKKyMgU29tZSBtb2RlcyB3b3JrIGp1c3QgbGlrZSBvdGhlciBtb2RlcywgYnV0IHVzZSBkaWZmZXJlbnQgZmxhZ3MuICBXZQorIyBwYXJhbWV0ZXJpemUgaGVyZSwgYnV0IHN0aWxsIGxpc3QgdGhlIG1vZGVzIGluIHRoZSBiaWcgY2FzZSBiZWxvdywKKyMgdG8gbWFrZSBkZXBlbmQubTQgZWFzaWVyIHRvIHdyaXRlLiAgTm90ZSB0aGF0IHdlICpjYW5ub3QqIHVzZSBhIGNhc2UKKyMgaGVyZSwgYmVjYXVzZSB0aGlzIGZpbGUgY2FuIG9ubHkgY29udGFpbiBvbmUgY2FzZSBzdGF0ZW1lbnQuCitpZiB0ZXN0ICIkZGVwbW9kZSIgPSBocDsgdGhlbgorICAjIEhQIGNvbXBpbGVyIHVzZXMgLU0gYW5kIG5vIGV4dHJhIGFyZy4KKyAgZ2NjZmxhZz0tTQorICBkZXBtb2RlPWdjYworZmkKKworaWYgdGVzdCAiJGRlcG1vZGUiID0gZGFzaFhtc3Rkb3V0OyB0aGVuCisgICAjIFRoaXMgaXMganVzdCBsaWtlIGRhc2htc3Rkb3V0IHdpdGggYSBkaWZmZXJlbnQgYXJndW1lbnQuCisgICBkYXNobWZsYWc9LXhNCisgICBkZXBtb2RlPWRhc2htc3Rkb3V0CitmaQorCitjYXNlICIkZGVwbW9kZSIgaW4KK2djYzMpCisjIyBnY2MgMyBpbXBsZW1lbnRzIGRlcGVuZGVuY3kgdHJhY2tpbmcgdGhhdCBkb2VzIGV4YWN0bHkgd2hhdAorIyMgd2Ugd2FudC4gIFlheSEgIE5vdGU6IGZvciBzb21lIHJlYXNvbiBsaWJ0b29sIDEuNCBkb2Vzbid0IGxpa2UKKyMjIGl0IGlmIC1NRCAtTVAgY29tZXMgYWZ0ZXIgdGhlIC1NRiBzdHVmZi4gIEhtbS4KKyAgIiRAIiAtTVQgIiRvYmplY3QiIC1NRCAtTVAgLU1GICIkdG1wZGVwZmlsZSIKKyAgc3RhdD0kPworICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKKyAgZWxzZQorICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgICBleGl0ICRzdGF0CisgIGZpCisgIG12ICIkdG1wZGVwZmlsZSIgIiRkZXBmaWxlIgorICA7OworCitnY2MpCisjIyBUaGVyZSBhcmUgdmFyaW91cyB3YXlzIHRvIGdldCBkZXBlbmRlbmN5IG91dHB1dCBmcm9tIGdjYy4gIEhlcmUncworIyMgd2h5IHdlIHBpY2sgdGhpcyByYXRoZXIgb2JzY3VyZSBtZXRob2Q6CisjIyAtIERvbid0IHdhbnQgdG8gdXNlIC1NRCBiZWNhdXNlIHdlJ2QgbGlrZSB0aGUgZGVwZW5kZW5jaWVzIHRvIGVuZAorIyMgICB1cCBpbiBhIHN1YmRpci4gIEhhdmluZyB0byByZW5hbWUgYnkgaGFuZCBpcyB1Z2x5LgorIyMgICAoV2UgbWlnaHQgZW5kIHVwIGRvaW5nIHRoaXMgYW55d2F5IHRvIHN1cHBvcnQgb3RoZXIgY29tcGlsZXJzLikKKyMjIC0gVGhlIERFUEVOREVOQ0lFU19PVVRQVVQgZW52aXJvbm1lbnQgdmFyaWFibGUgbWFrZXMgZ2NjIGFjdCBsaWtlCisjIyAgIC1NTSwgbm90IC1NIChkZXNwaXRlIHdoYXQgdGhlIGRvY3Mgc2F5KS4KKyMjIC0gVXNpbmcgLU0gZGlyZWN0bHkgbWVhbnMgcnVubmluZyB0aGUgY29tcGlsZXIgdHdpY2UgKGV2ZW4gd29yc2UKKyMjICAgdGhhbiByZW5hbWluZykuCisgIGlmIHRlc3QgLXogIiRnY2NmbGFnIjsgdGhlbgorICAgIGdjY2ZsYWc9LU1ELAorICBmaQorICAiJEAiIC1XcCwiJGdjY2ZsYWckdG1wZGVwZmlsZSIKKyAgc3RhdD0kPworICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKKyAgZWxzZQorICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgICBleGl0ICRzdGF0CisgIGZpCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKKyAgYWxwaGE9QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5egorIyMgVGhlIHNlY29uZCAtZSBleHByZXNzaW9uIGhhbmRsZXMgRE9TLXN0eWxlIGZpbGUgbmFtZXMgd2l0aCBkcml2ZSBsZXR0ZXJzLgorICBzZWQgLWUgJ3MvXlteOl0qOiAvIC8nIFwKKyAgICAgIC1lICdzL15bJyRhbHBoYSddOlwvW146XSo6IC8gLycgPCAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKKyMjIFRoaXMgbmV4dCBwaWVjZSBvZiBtYWdpYyBhdm9pZHMgdGhlIGBkZWxldGVkIGhlYWRlciBmaWxlJyBwcm9ibGVtLgorIyMgVGhlIHByb2JsZW0gaXMgdGhhdCB3aGVuIGEgaGVhZGVyIGZpbGUgd2hpY2ggYXBwZWFycyBpbiBhIC5QIGZpbGUKKyMjIGlzIGRlbGV0ZWQsIHRoZSBkZXBlbmRlbmN5IGNhdXNlcyBtYWtlIHRvIGRpZSAoYmVjYXVzZSB0aGVyZSBpcworIyMgdHlwaWNhbGx5IG5vIHdheSB0byByZWJ1aWxkIHRoZSBoZWFkZXIpLiAgV2UgYXZvaWQgdGhpcyBieSBhZGRpbmcKKyMjIGR1bW15IGRlcGVuZGVuY2llcyBmb3IgZWFjaCBoZWFkZXIgZmlsZS4gIFRvbyBiYWQgZ2NjIGRvZXNuJ3QgZG8KKyMjIHRoaXMgZm9yIHVzIGRpcmVjdGx5LgorICB0ciAnICcgJworJyA8ICIkdG1wZGVwZmlsZSIgfAorIyMgU29tZSB2ZXJzaW9ucyBvZiBnY2MgcHV0IGEgc3BhY2UgYmVmb3JlIHRoZSBgOicuICBPbiB0aGUgdGhlb3J5CisjIyB0aGF0IHRoZSBzcGFjZSBtZWFucyBzb21ldGhpbmcsIHdlIGFkZCBhIHNwYWNlIHRvIHRoZSBvdXRwdXQgYXMKKyMjIHdlbGwuCisjIyBTb21lIHZlcnNpb25zIG9mIHRoZSBIUFVYIDEwLjIwIHNlZCBjYW4ndCBwcm9jZXNzIHRoaXMgaW52b2NhdGlvbgorIyMgY29ycmVjdGx5LiAgQnJlYWtpbmcgaXQgaW50byB0d28gc2VkIGludm9jYXRpb25zIGlzIGEgd29ya2Fyb3VuZC4KKyAgICBzZWQgLWUgJ3MvXlxcJC8vJyAtZSAnL14kL2QnIC1lICcvOiQvZCcgfCBzZWQgLWUgJ3MvJC8gOi8nID4+ICIkZGVwZmlsZSIKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCitocCkKKyAgIyBUaGlzIGNhc2UgZXhpc3RzIG9ubHkgdG8gbGV0IGRlcGVuZC5tNCBkbyBpdHMgd29yay4gIEl0IHdvcmtzIGJ5CisgICMgbG9va2luZyBhdCB0aGUgdGV4dCBvZiB0aGlzIHNjcmlwdC4gIFRoaXMgY2FzZSB3aWxsIG5ldmVyIGJlIHJ1biwKKyAgIyBzaW5jZSBpdCBpcyBjaGVja2VkIGZvciBhYm92ZS4KKyAgZXhpdCAxCisgIDs7CisKK3NnaSkKKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgIiRAIiAiLVdwLC1NRHVwZGF0ZSwkdG1wZGVwZmlsZSIKKyAgZWxzZQorICAgICIkQCIgLU1EdXBkYXRlICIkdG1wZGVwZmlsZSIKKyAgZmkKKyAgc3RhdD0kPworICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKKyAgZWxzZQorICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgICBleGl0ICRzdGF0CisgIGZpCisgIHJtIC1mICIkZGVwZmlsZSIKKworICBpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZSI7IHRoZW4gICMgeWVzLCB0aGUgc291cmNlZmlsZSBkZXBlbmQgb24gb3RoZXIgZmlsZXMKKyAgICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgorCisgICAgIyBDbGlwIG9mZiB0aGUgaW5pdGlhbCBlbGVtZW50ICh0aGUgZGVwZW5kZW50KS4gIERvbid0IHRyeSB0byBiZQorICAgICMgY2xldmVyIGFuZCByZXBsYWNlIHRoaXMgd2l0aCBzZWQgY29kZSwgYXMgSVJJWCBzZWQgd29uJ3QgaGFuZGxlCisgICAgIyBsaW5lcyB3aXRoIG1vcmUgdGhhbiBhIGZpeGVkIG51bWJlciBvZiBjaGFyYWN0ZXJzICg0MDk2IGluCisgICAgIyBJUklYIDYuMiBzZWQsIDgxOTIgaW4gSVJJWCA2LjUpLiAgV2UgYWxzbyByZW1vdmUgY29tbWVudCBsaW5lczsKKyAgICAjIHRoZSBJUklYIGNjIGFkZHMgY29tbWVudHMgbGlrZSBgIzpmZWMnIHRvIHRoZSBlbmQgb2YgdGhlCisgICAgIyBkZXBlbmRlbmN5IGxpbmUuCisgICAgdHIgJyAnICcKKycgPCAiJHRtcGRlcGZpbGUiIFwKKyAgICB8IHNlZCAtZSAncy9eLipcLm86Ly8nIC1lICdzLyMuKiQvLycgLWUgJy9eJC8gZCcgfCBcCisgICAgdHIgJworJyAnICcgPj4gJGRlcGZpbGUKKyAgICBlY2hvID4+ICRkZXBmaWxlCisKKyAgICAjIFRoZSBzZWNvbmQgcGFzcyBnZW5lcmF0ZXMgYSBkdW1teSBlbnRyeSBmb3IgZWFjaCBoZWFkZXIgZmlsZS4KKyAgICB0ciAnICcgJworJyA8ICIkdG1wZGVwZmlsZSIgXAorICAgfCBzZWQgLWUgJ3MvXi4qXC5vOi8vJyAtZSAncy8jLiokLy8nIC1lICcvXiQvIGQnIC1lICdzLyQvOi8nIFwKKyAgID4+ICRkZXBmaWxlCisgIGVsc2UKKyAgICAjIFRoZSBzb3VyY2VmaWxlIGRvZXMgbm90IGNvbnRhaW4gYW55IGRlcGVuZGVuY2llcywgc28ganVzdAorICAgICMgc3RvcmUgYSBkdW1teSBjb21tZW50IGxpbmUsIHRvIGF2b2lkIGVycm9ycyB3aXRoIHRoZSBNYWtlZmlsZQorICAgICMgImluY2x1ZGUgYmFzZW5hbWUuUGxvIiBzY2hlbWUuCisgICAgZWNobyAiI2R1bW15IiA+ICIkZGVwZmlsZSIKKyAgZmkKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCithaXgpCisgICMgVGhlIEMgZm9yIEFJWCBDb21waWxlciB1c2VzIC1NIGFuZCBvdXRwdXRzIHRoZSBkZXBlbmRlbmNpZXMKKyAgIyBpbiBhIC51IGZpbGUuICBUaGlzIGZpbGUgYWx3YXlzIGxpdmVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKyAgIyBBbHNvLCB0aGUgQUlYIGNvbXBpbGVyIHB1dHMgYCRvYmplY3Q6JyBhdCB0aGUgc3RhcnQgb2YgZWFjaCBsaW5lOworICAjICRvYmplY3QgZG9lc24ndCBoYXZlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbi4KKyAgc3RyaXBwZWQ9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzLF4uKi8sLCcgLWUgJ3MvXCguKlwpXC4uKiQvXDEvJ2AKKyAgdG1wZGVwZmlsZT0iJHN0cmlwcGVkLnUiCisgIG91dG5hbWU9IiRzdHJpcHBlZC5vIgorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICAiJEAiIC1XYywtTQorICBlbHNlCisgICAgIiRAIiAtTQorICBmaQorCisgIHN0YXQ9JD8KKyAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6CisgIGVsc2UKKyAgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICAgZXhpdCAkc3RhdAorICBmaQorCisgIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbgorICAgICMgRWFjaCBsaW5lIGlzIG9mIHRoZSBmb3JtIGBmb28ubzogZGVwZW5kZW50LmgnLgorICAgICMgRG8gdHdvIHBhc3Nlcywgb25lIHRvIGp1c3QgY2hhbmdlIHRoZXNlIHRvCisgICAgIyBgJG9iamVjdDogZGVwZW5kZW50LmgnIGFuZCBvbmUgdG8gc2ltcGx5IGBkZXBlbmRlbnQuaDonLgorICAgIHNlZCAtZSAicyxeJG91dG5hbWU6LCRvYmplY3QgOiwiIDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgICBzZWQgLWUgInMsXiRvdXRuYW1lOiBcKC4qXCkkLFwxOiwiIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisgIGVsc2UKKyAgICAjIFRoZSBzb3VyY2VmaWxlIGRvZXMgbm90IGNvbnRhaW4gYW55IGRlcGVuZGVuY2llcywgc28ganVzdAorICAgICMgc3RvcmUgYSBkdW1teSBjb21tZW50IGxpbmUsIHRvIGF2b2lkIGVycm9ycyB3aXRoIHRoZSBNYWtlZmlsZQorICAgICMgImluY2x1ZGUgYmFzZW5hbWUuUGxvIiBzY2hlbWUuCisgICAgZWNobyAiI2R1bW15IiA+ICIkZGVwZmlsZSIKKyAgZmkKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCit0cnU2NCkKKyAgICMgVGhlIFRydTY0IEFJWCBjb21waWxlciB1c2VzIC1NRCB0byBnZW5lcmF0ZSBkZXBlbmRlbmNpZXMgYXMgYSBzaWRlCisgICAjIGVmZmVjdC4gIGBjYyAtTUQgLW8gZm9vLm8gLi4uJyBwdXRzIHRoZSBkZXBlbmRlbmNpZXMgaW50byBgZm9vLm8uZCcuCisgICAjIEF0IGxlYXN0IG9uIEFscGhhL1JlZGhhdCA2LjEsIENvbXBhcSBDQ0MgVjYuMi01MDQgc2VlbXMgdG8gcHV0IAorICAgIyBkZXBlbmRlbmNpZXMgaW4gYGZvby5kJyBpbnN0ZWFkLCBzbyB3ZSBjaGVjayBmb3IgdGhhdCB0b28uCisgICAjIFN1YmRpcmVjdG9yaWVzIGFyZSByZXNwZWN0ZWQuCisKKyAgIHRtcGRlcGZpbGUxPSIkb2JqZWN0LmQiCisgICB0bXBkZXBmaWxlMj1gZWNobyAiJG9iamVjdCIgfCBzZWQgLWUgJ3MvLm8kLy5kLydgIAorICAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgICAiJEAiIC1XYywtTUQKKyAgIGVsc2UKKyAgICAgICIkQCIgLU1ECisgICBmaQorCisgICBzdGF0PSQ/CisgICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKKyAgIGVsc2UKKyAgICAgIHJtIC1mICIkdG1wZGVwZmlsZTEiICIkdG1wZGVwZmlsZTIiCisgICAgICBleGl0ICRzdGF0CisgICBmaQorCisgICBpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZTEiOyB0aGVuCisgICAgICB0bXBkZXBmaWxlPSIkdG1wZGVwZmlsZTEiCisgICBlbHNlCisgICAgICB0bXBkZXBmaWxlPSIkdG1wZGVwZmlsZTIiCisgICBmaQorICAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCisgICAgICBzZWQgLWUgInMsXi4qXC5bYS16XSo6LCRvYmplY3Q6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgorICAgICAgIyBUaGF0J3MgYSBzcGFjZSBhbmQgYSB0YWIgaW4gdGhlIFtdLgorICAgICAgc2VkIC1lICdzLF4uKlwuW2Etel0qOlsgCV0qLCwnIC1lICdzLCQsOiwnIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisgICBlbHNlCisgICAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgorICAgZmkKKyAgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgIDs7CisKKyNub3NpZGVlZmZlY3QpCisgICMgVGhpcyBjb21tZW50IGFib3ZlIGlzIHVzZWQgYnkgYXV0b21ha2UgdG8gdGVsbCBzaWRlLWVmZmVjdAorICAjIGRlcGVuZGVuY3kgdHJhY2tpbmcgbWVjaGFuaXNtcyBmcm9tIHNsb3dlciBvbmVzLgorCitkYXNobXN0ZG91dCkKKyAgIyBJbXBvcnRhbnQgbm90ZTogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIG1vZGUsIGEgY29tcGlsZXIgKm11c3QqCisgICMgYWx3YXlzIHdyaXRlIHRoZSBwcm9wcm9jZXNzZWQgZmlsZSB0byBzdGRvdXQsIHJlZ2FyZGxlc3Mgb2YgLW8sCisgICMgYmVjYXVzZSB3ZSBtdXN0IHVzZSAtbyB3aGVuIHJ1bm5pbmcgbGlidG9vbC4KKyAgdGVzdCAteiAiJGRhc2htZmxhZyIgJiYgZGFzaG1mbGFnPS1NCisgICggSUZTPSIgIgorICAgIGNhc2UgIiAkKiAiIGluCisgICAgKiIgLS1tb2RlPWNvbXBpbGUgIiopICMgdGhpcyBpcyBsaWJ0b29sLCBsZXQgdXMgbWFrZSBpdCBxdWlldAorICAgICAgZm9yIGFyZworICAgICAgZG8gIyBjeWNsZSBvdmVyIHRoZSBhcmd1bWVudHMKKyAgICAgICAgY2FzZSAiJGFyZyIgaW4KKwkiLS1tb2RlPWNvbXBpbGUiKQorCSAgIyBpbnNlcnQgLS1xdWlldCBiZWZvcmUgIi0tbW9kZT1jb21waWxlIgorCSAgc2V0IGZub3JkICIkQCIgLS1xdWlldAorCSAgc2hpZnQgIyBmbm9yZAorCSAgOzsKKwllc2FjCisJc2V0IGZub3JkICIkQCIgIiRhcmciCisJc2hpZnQgIyBmbm9yZAorCXNoaWZ0ICMgIiRhcmciCisgICAgICBkb25lCisgICAgICA7OworICAgIGVzYWMKKyAgICAiJEAiICRkYXNobWZsYWcgfCBzZWQgJ3M6XlteOl0qXDpbIAldKjonIiRvYmplY3QiJ1w6IDonID4gIiR0bXBkZXBmaWxlIgorICApICYKKyAgcHJvYz0kIQorICAiJEAiCisgIHN0YXQ9JD8KKyAgd2FpdCAiJHByb2MiCisgIGlmIHRlc3QgIiRzdGF0IiAhPSAwOyB0aGVuIGV4aXQgJHN0YXQ7IGZpCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgY2F0IDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgdHIgJyAnICcKKycgPCAiJHRtcGRlcGZpbGUiIHwgXAorIyMgU29tZSB2ZXJzaW9ucyBvZiB0aGUgSFBVWCAxMC4yMCBzZWQgY2FuJ3QgcHJvY2VzcyB0aGlzIGludm9jYXRpb24KKyMjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCisgICAgc2VkIC1lICdzL15cXCQvLycgLWUgJy9eJC9kJyAtZSAnLzokL2QnIHwgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKworZGFzaFhtc3Rkb3V0KQorICAjIFRoaXMgY2FzZSBvbmx5IGV4aXN0cyB0byBzYXRpc2Z5IGRlcGVuZC5tNC4gIEl0IGlzIG5ldmVyIGFjdHVhbGx5CisgICMgcnVuLCBhcyB0aGlzIG1vZGUgaXMgc3BlY2lhbGx5IHJlY29nbml6ZWQgaW4gdGhlIHByZWFtYmxlLgorICBleGl0IDEKKyAgOzsKKworbWFrZWRlcGVuZCkKKyAgIyBYIG1ha2VkZXBlbmQKKyAgKAorICAgIHNoaWZ0CisgICAgY2xlYXJlZD1ubworICAgIGZvciBhcmcgaW4gIiRAIjsgZG8KKyAgICAgIGNhc2UgJGNsZWFyZWQgaW4gbm8pCisgICAgICAgIHNldCAiIjsgc2hpZnQKKwljbGVhcmVkPXllcworICAgICAgZXNhYworICAgICAgY2FzZSAiJGFyZyIgaW4KKyAgICAgICAgLUQqfC1JKikKKwkgIHNldCBmbm9yZCAiJEAiICIkYXJnIjsgc2hpZnQ7OworCS0qKQorCSAgOzsKKwkqKQorCSAgc2V0IGZub3JkICIkQCIgIiRhcmciOyBzaGlmdDs7CisgICAgICBlc2FjCisgICAgZG9uZQorICAgIG9ial9zdWZmaXg9ImBlY2hvICRvYmplY3QgfCBzZWQgJ3MvXi4qXC4vLi8nYCIKKyAgICB0b3VjaCAiJHRtcGRlcGZpbGUiCisgICAgJHtNQUtFREVQRU5ELW1ha2VkZXBlbmR9IDI+L2Rldi9udWxsIC1vIiRvYmpfc3VmZml4IiAtZiIkdG1wZGVwZmlsZSIgIiRAIgorICApICYKKyAgcHJvYz0kIQorICAiJEAiCisgIHN0YXQ9JD8KKyAgd2FpdCAiJHByb2MiCisgIGlmIHRlc3QgIiRzdGF0IiAhPSAwOyB0aGVuIGV4aXQgJHN0YXQ7IGZpCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgY2F0IDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgdGFpbCArMyAiJHRtcGRlcGZpbGUiIHwgdHIgJyAnICcKKycgfCBcCisjIyBTb21lIHZlcnNpb25zIG9mIHRoZSBIUFVYIDEwLjIwIHNlZCBjYW4ndCBwcm9jZXNzIHRoaXMgaW52b2NhdGlvbgorIyMgY29ycmVjdGx5LiAgQnJlYWtpbmcgaXQgaW50byB0d28gc2VkIGludm9jYXRpb25zIGlzIGEgd29ya2Fyb3VuZC4KKyAgICBzZWQgLWUgJ3MvXlxcJC8vJyAtZSAnL14kL2QnIC1lICcvOiQvZCcgfCBzZWQgLWUgJ3MvJC8gOi8nID4+ICIkZGVwZmlsZSIKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIiAiJHRtcGRlcGZpbGUiLmJhaworICA7OworCitjcHApCisgICMgSW1wb3J0YW50IG5vdGU6IGluIG9yZGVyIHRvIHN1cHBvcnQgdGhpcyBtb2RlLCBhIGNvbXBpbGVyICptdXN0KgorICAjIGFsd2F5cyB3cml0ZSB0aGUgcHJvcHJvY2Vzc2VkIGZpbGUgdG8gc3Rkb3V0LCByZWdhcmRsZXNzIG9mIC1vLAorICAjIGJlY2F1c2Ugd2UgbXVzdCB1c2UgLW8gd2hlbiBydW5uaW5nIGxpYnRvb2wuCisgICggSUZTPSIgIgorICAgIGNhc2UgIiAkKiAiIGluCisgICAgKiIgLS1tb2RlPWNvbXBpbGUgIiopCisgICAgICBmb3IgYXJnCisgICAgICBkbyAjIGN5Y2xlIG92ZXIgdGhlIGFyZ3VtZW50cworICAgICAgICBjYXNlICRhcmcgaW4KKwkiLS1tb2RlPWNvbXBpbGUiKQorCSAgIyBpbnNlcnQgLS1xdWlldCBiZWZvcmUgIi0tbW9kZT1jb21waWxlIgorCSAgc2V0IGZub3JkICIkQCIgLS1xdWlldAorCSAgc2hpZnQgIyBmbm9yZAorCSAgOzsKKwllc2FjCisJc2V0IGZub3JkICIkQCIgIiRhcmciCisJc2hpZnQgIyBmbm9yZAorCXNoaWZ0ICMgIiRhcmciCisgICAgICBkb25lCisgICAgICA7OworICAgIGVzYWMKKyAgICAiJEAiIC1FIHwKKyAgICBzZWQgLW4gJy9eIyBbMC05XVswLTldKiAiXChbXiJdKlwpIi4qLyBzOjogXDEgXFw6cCcgfAorICAgIHNlZCAnJCBzOiBcXCQ6OicgPiAiJHRtcGRlcGZpbGUiCisgICkgJgorICBwcm9jPSQhCisgICIkQCIKKyAgc3RhdD0kPworICB3YWl0ICIkcHJvYyIKKyAgaWYgdGVzdCAiJHN0YXQiICE9IDA7IHRoZW4gZXhpdCAkc3RhdDsgZmkKKyAgcm0gLWYgIiRkZXBmaWxlIgorICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgorICBjYXQgPCAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKKyAgc2VkIDwgIiR0bXBkZXBmaWxlIiAnL14kL2Q7cy9eIC8vO3MvIFxcJC8vO3MvJC8gOi8nID4+ICIkZGVwZmlsZSIKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCittc3Zpc3VhbGNwcCkKKyAgIyBJbXBvcnRhbnQgbm90ZTogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIG1vZGUsIGEgY29tcGlsZXIgKm11c3QqCisgICMgYWx3YXlzIHdyaXRlIHRoZSBwcm9wcm9jZXNzZWQgZmlsZSB0byBzdGRvdXQsIHJlZ2FyZGxlc3Mgb2YgLW8sCisgICMgYmVjYXVzZSB3ZSBtdXN0IHVzZSAtbyB3aGVuIHJ1bm5pbmcgbGlidG9vbC4KKyAgKCBJRlM9IiAiCisgICAgY2FzZSAiICQqICIgaW4KKyAgICAqIiAtLW1vZGU9Y29tcGlsZSAiKikKKyAgICAgIGZvciBhcmcKKyAgICAgIGRvICMgY3ljbGUgb3ZlciB0aGUgYXJndW1lbnRzCisgICAgICAgIGNhc2UgJGFyZyBpbgorCSItLW1vZGU9Y29tcGlsZSIpCisJICAjIGluc2VydCAtLXF1aWV0IGJlZm9yZSAiLS1tb2RlPWNvbXBpbGUiCisJICBzZXQgZm5vcmQgIiRAIiAtLXF1aWV0CisJICBzaGlmdCAjIGZub3JkCisJICA7OworCWVzYWMKKwlzZXQgZm5vcmQgIiRAIiAiJGFyZyIKKwlzaGlmdCAjIGZub3JkCisJc2hpZnQgIyAiJGFyZyIKKyAgICAgIGRvbmUKKyAgICAgIDs7CisgICAgZXNhYworICAgICIkQCIgLUUgfAorICAgIHNlZCAtbiAnL14jbGluZSBbMC05XVswLTldKiAiXChbXiJdKlwpIi8gczo6ZWNobyAiYGN5Z3BhdGggLXUgXFwiXDFcXCJgIjpwJyB8IHNvcnQgfCB1bmlxID4gIiR0bXBkZXBmaWxlIgorICApICYKKyAgcHJvYz0kIQorICAiJEAiCisgIHN0YXQ9JD8KKyAgd2FpdCAiJHByb2MiCisgIGlmIHRlc3QgIiRzdGF0IiAhPSAwOyB0aGVuIGV4aXQgJHN0YXQ7IGZpCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKKyAgLiAiJHRtcGRlcGZpbGUiIHwgc2VkICdzJSAlXFwgJWcnIHwgc2VkIC1uICcvXlwoLipcKSQvIHM6OglcMSBcXDpwJyA+PiAiJGRlcGZpbGUiCisgIGVjaG8gIgkiID4+ICIkZGVwZmlsZSIKKyAgLiAiJHRtcGRlcGZpbGUiIHwgc2VkICdzJSAlXFwgJWcnIHwgc2VkIC1uICcvXlwoLipcKSQvIHM6OlwxXDo6cCcgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK25vbmUpCisgIGV4ZWMgIiRAIgorICA7OworCisqKQorICBlY2hvICJVbmtub3duIGRlcG1vZGUgJGRlcG1vZGUiIDE+JjIKKyAgZXhpdCAxCisgIDs7Citlc2FjCisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL2V4YW1wbGUvTWFrZWZpbGUgYi9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvZXhhbXBsZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTc2YmFkCi0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL2V4YW1wbGUvTWFrZWZpbGUKQEAgLTAsMCArMSwzNDQgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYXV0b21ha2UgMS41IGZyb20gTWFrZWZpbGUuYW0uCisKKyMgQ29weXJpZ2h0IDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCisKKworIyMjIyMjIyBUaGlzIGlzIHRoZSBpbnB1dCBmaWxlIGZvciBhdXRvbWFrZSwgd2hpY2ggd2lsbCBnZW5lcmF0ZSBNYWtlZmlsZS5pbiAjIyMjIyMjIyMjCisKK1NIRUxMID0gL2Jpbi9zaAorCitzcmNkaXIgPSAuCit0b3Bfc3JjZGlyID0gLi4KKworcHJlZml4ID0gL3Vzci9sb2NhbAorZXhlY19wcmVmaXggPSAke3ByZWZpeH0KKworYmluZGlyID0gJHtleGVjX3ByZWZpeH0vYmluCitzYmluZGlyID0gJHtleGVjX3ByZWZpeH0vc2JpbgorbGliZXhlY2RpciA9ICR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMKK2RhdGFkaXIgPSAke3ByZWZpeH0vc2hhcmUKK3N5c2NvbmZkaXIgPSAke3ByZWZpeH0vZXRjCitzaGFyZWRzdGF0ZWRpciA9ICR7cHJlZml4fS9jb20KK2xvY2Fsc3RhdGVkaXIgPSAke3ByZWZpeH0vdmFyCitsaWJkaXIgPSAke2V4ZWNfcHJlZml4fS9saWIKK2luZm9kaXIgPSAke3ByZWZpeH0vaW5mbworbWFuZGlyID0gJHtwcmVmaXh9L21hbgoraW5jbHVkZWRpciA9ICR7cHJlZml4fS9pbmNsdWRlCitvbGRpbmNsdWRlZGlyID0gL3Vzci9pbmNsdWRlCitwa2dkYXRhZGlyID0gJChkYXRhZGlyKS9tb2RfZ3NvYXAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9tb2RfZ3NvYXAKK3BrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL21vZF9nc29hcAordG9wX2J1aWxkZGlyID0gLi4KKworQUNMT0NBTCA9ICR7U0hFTEx9IC9ob21lL2FiZXJnZXIvYXBhY2hlX2dzb2FwLjAuMC41L21pc3NpbmcgLS1ydW4gYWNsb2NhbAorQVVUT0NPTkYgPSAke1NIRUxMfSAvaG9tZS9hYmVyZ2VyL2FwYWNoZV9nc29hcC4wLjAuNS9taXNzaW5nIC0tcnVuIGF1dG9jb25mCitBVVRPTUFLRSA9ICR7U0hFTEx9IC9ob21lL2FiZXJnZXIvYXBhY2hlX2dzb2FwLjAuMC41L21pc3NpbmcgLS1ydW4gYXV0b21ha2UKK0FVVE9IRUFERVIgPSAke1NIRUxMfSAvaG9tZS9hYmVyZ2VyL2FwYWNoZV9nc29hcC4wLjAuNS9taXNzaW5nIC0tcnVuIGF1dG9oZWFkZXIKKworSU5TVEFMTCA9IC91c3IvYmluL2dpbnN0YWxsIC1jCitJTlNUQUxMX1BST0dSQU0gPSAke0lOU1RBTEx9CitJTlNUQUxMX0RBVEEgPSAke0lOU1RBTEx9IC1tIDY0NAorSU5TVEFMTF9TQ1JJUFQgPSAke0lOU1RBTEx9CitJTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQordHJhbnNmb3JtID0gcyx4LHgsCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX2FsaWFzID0gaTY4Ni1zdXNlLWxpbnV4CitidWlsZF90cmlwbGV0ID0gaTY4Ni1zdXNlLWxpbnV4Citob3N0X2FsaWFzID0gaTY4Ni1zdXNlLWxpbnV4Citob3N0X3RyaXBsZXQgPSBpNjg2LXN1c2UtbGludXgKK3RhcmdldF9hbGlhcyA9IGk2ODYtc3VzZS1saW51eAordGFyZ2V0X3RyaXBsZXQgPSBpNjg2LXN1c2UtbGludXgKK0FNVEFSID0gJHtTSEVMTH0gL2hvbWUvYWJlcmdlci9hcGFjaGVfZ3NvYXAuMC4wLjUvbWlzc2luZyAtLXJ1biB0YXIKK0FQWFNfQ1hYX09QVElPTlMgPSAKK0FTID0gYXMKK0FXSyA9IGdhd2sKK0NDID0gZ2NjCitDUFAgPSBnY2MgLUUKK0NYWCA9IGcrKworQ1hYREVCVUdERUZJTkVTID0gLURfTkRFQlVHCitDWFhGTEFHUyA9ICAtTzIKK0RFUERJUiA9IC5kZXBzCitETExUT09MID0gZGxsdG9vbAorRUNITyA9IGVjaG8KK0VYRUVYVCA9IAorRVhJU1RTX0FQWFMgPSB5ZXMKK0VYSVNUU19HU09BUCA9IHllcworSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gJHtTSEVMTH0gJChpbnN0YWxsX3NoKSAtYyAtcworTElCVE9PTCA9ICQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sCitMSUJUT09MX0RFUFMgPSAuL2x0bWFpbi5zaAorTE5fUyA9IGxuIC1zCitPQkpEVU1QID0gb2JqZHVtcAorT0JKRVhUID0gbworUEFDS0FHRSA9IG1vZF9nc29hcAorUkFOTElCID0gcmFubGliCitTVFJJUCA9IHN0cmlwCitWRVJTSU9OID0gMC4wLjUKK2FtX19pbmNsdWRlID0gaW5jbHVkZQorYW1fX3F1b3RlID0gCitpbnN0YWxsX3NoID0gL2hvbWUvYWJlcmdlci9hcGFjaGVfZ3NvYXAuMC4wLjUvaW5zdGFsbC1zaAorCitTVUJESVJTID0gY2FsY3VsYXRvcgorQ0xFQU5GSUxFUyA9ICp+CisKK0FVVE9NQUtFX09QVElPTlMgPSBmb3JlaWduIDEuNAorc3ViZGlyID0gZXhhbXBsZQorbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycworQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK0RJU1RfU09VUkNFUyA9CisKK1JFQ1VSU0lWRV9UQVJHRVRTID0gaW5mby1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZSBpbnN0YWxsLWluZm8tcmVjdXJzaXZlIFwKKwl1bmluc3RhbGwtaW5mby1yZWN1cnNpdmUgYWxsLXJlY3Vyc2l2ZSBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIFwKKwlpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIGluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBpbnN0YWxsLXJlY3Vyc2l2ZSBcCisJdW5pbnN0YWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZQorRElTVF9DT01NT04gPSBNYWtlZmlsZS5hbSBNYWtlZmlsZS5pbgorRElTVF9TVUJESVJTID0gJChTVUJESVJTKQorYWxsOiBhbGwtcmVjdXJzaXZlCisKKy5TVUZGSVhFUzoKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKKworZGlzdGNsZWFuLWxpYnRvb2w6CisJLXJtIC1mIGxpYnRvb2wKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogIE1ha2VmaWxlLmFtICAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gIGV4YW1wbGUvTWFrZWZpbGUKK01ha2VmaWxlOiAgJChzcmNkaXIpL01ha2VmaWxlLmluICAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCWNkICQodG9wX2J1aWxkZGlyKSAmJiBcCisJICBDT05GSUdfSEVBREVSUz0gQ09ORklHX0xJTktTPSBcCisJICBDT05GSUdfRklMRVM9JChzdWJkaXIpLyRAICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwordW5pbnN0YWxsLWluZm8tYW06CisKKyMgVGhpcyBkaXJlY3RvcnkncyBzdWJkaXJlY3RvcmllcyBhcmUgbW9zdGx5IGluZGVwZW5kZW50OyB5b3UgY2FuIGNkCisjIGludG8gdGhlbSBhbmQgcnVuIGBtYWtlJyB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhpcyBNYWtlZmlsZS4KKyMgVG8gY2hhbmdlIHRoZSB2YWx1ZXMgb2YgYG1ha2UnIHZhcmlhYmxlczogaW5zdGVhZCBvZiBlZGl0aW5nIE1ha2VmaWxlcywKKyMgKDEpIGlmIHRoZSB2YXJpYWJsZSBpcyBzZXQgaW4gYGNvbmZpZy5zdGF0dXMnLCBlZGl0IGBjb25maWcuc3RhdHVzJworIyAgICAgKHdoaWNoIHdpbGwgY2F1c2UgdGhlIE1ha2VmaWxlcyB0byBiZSByZWdlbmVyYXRlZCB3aGVuIHlvdSBydW4gYG1ha2UnKTsKKyMgKDIpIG90aGVyd2lzZSwgcGFzcyB0aGUgZGVzaXJlZCB2YWx1ZXMgb24gdGhlIGBtYWtlJyBjb21tYW5kIGxpbmUuCiskKFJFQ1VSU0lWRV9UQVJHRVRTKToKKwlAc2V0IGZub3JkICQoTUFLRUZMQUdTKTsgYW1mPSQkMjsgXAorCWRvdF9zZWVuPW5vOyBcCisJdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKKwkgICAgZG90X3NlZW49eWVzOyBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCisJICBlbHNlIFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKKwkgIGZpOyBcCisJICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKKwkgICB8fCBjYXNlICIkJGFtZiIgaW4gKj0qKSBleGl0IDE7OyAqayopIGZhaWw9eWVzOzsgKikgZXhpdCAxOzsgZXNhYzsgXAorCWRvbmU7IFwKKwlpZiB0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyI7IHRoZW4gXAorCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgIiQkdGFyZ2V0LWFtIiB8fCBleGl0IDE7IFwKKwlmaTsgdGVzdCAteiAiJCRmYWlsIgorCittb3N0bHljbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlIGRpc3RjbGVhbi1yZWN1cnNpdmUgXAorbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmU6CisJQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKKwlkb3Rfc2Vlbj1ubzsgXAorCWNhc2UgIiRAIiBpbiBcCisJICBkaXN0Y2xlYW4tKiB8IG1haW50YWluZXItY2xlYW4tKikgbGlzdD0nJChESVNUX1NVQkRJUlMpJyA7OyBcCisJICAqKSBsaXN0PSckKFNVQkRJUlMpJyA7OyBcCisJZXNhYzsgXAorCXJldj0nJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiA6OyBlbHNlIFwKKwkgICAgcmV2PSIkJHN1YmRpciAkJHJldiI7IFwKKwkgIGZpOyBcCisJZG9uZTsgXAorCXJldj0iJCRyZXYgLiI7IFwKKwl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCisJZm9yIHN1YmRpciBpbiAkJHJldjsgZG8gXAorCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKKwkgIGVsc2UgXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAorCSAgZmk7IFwKKwkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAorCSAgIHx8IGNhc2UgIiQkYW1mIiBpbiAqPSopIGV4aXQgMTs7ICprKikgZmFpbD15ZXM7OyAqKSBleGl0IDE7OyBlc2FjOyBcCisJZG9uZSAmJiB0ZXN0IC16ICIkJGZhaWwiCit0YWdzLXJlY3Vyc2l2ZToKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRhZ3MpOyBcCisJZG9uZQorCit0YWdzOiBUQUdTCisKK0lEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJbWtpZCAtZklEICQkdW5pcXVlICQoTElTUCkKKworVEFHUzogdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCXRhZ3M9OyBcCisJaGVyZT1gcHdkYDsgXAorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKKwkgICAgdGVzdCAtZiAkJHN1YmRpci9UQUdTICYmIHRhZ3M9IiQkdGFncyAtaSAkJGhlcmUvJCRzdWJkaXIvVEFHUyI7IFwKKwkgIGZpOyBcCisJZG9uZTsgXAorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAorCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAorCXRlc3QgLXogIiQoRVRBR1NfQVJHUykkJHVuaXF1ZSQoTElTUCkkJHRhZ3MiIFwKKwkgIHx8IGV0YWdzICQoRVRBR1NfQVJHUykgJCR0YWdzICAkJHVuaXF1ZSAkKExJU1ApCisKK0dUQUdTOgorCWhlcmU9YENEUEFUSD06ICYmIGNkICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmIGNkICQodG9wX3NyY2RpcikgXAorCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAkJGhlcmUKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRICisKK0RJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCisKK3RvcF9kaXN0ZGlyID0gLi4KK2Rpc3RkaXIgPSAkKHRvcF9kaXN0ZGlyKS8kKFBBQ0tBR0UpLSQoVkVSU0lPTikKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQGZvciBmaWxlIGluICQoRElTVEZJTEVTKTsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgZGlyPWBlY2hvICIkJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAorCSAgaWYgdGVzdCAiJCRkaXIiICE9ICIkJGZpbGUiICYmIHRlc3QgIiQkZGlyIiAhPSAiLiI7IHRoZW4gXAorCSAgICAkKG1raW5zdGFsbGRpcnMpICIkKGRpc3RkaXIpLyQkZGlyIjsgXAorCSAgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGNwIC1wUiAkJGQvJCRmaWxlICQoZGlzdGRpcikgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCisJZm9yIHN1YmRpciBpbiAkKFNVQkRJUlMpOyBkbyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAorCSAgICB0ZXN0IC1kICQoZGlzdGRpcikvJCRzdWJkaXIgXAorCSAgICB8fCBta2RpciAkKGRpc3RkaXIpLyQkc3ViZGlyIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICAgIChjZCAkJHN1YmRpciAmJiBcCisJICAgICAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAorCSAgICAgICAgdG9wX2Rpc3RkaXI9IiQodG9wX2Rpc3RkaXIpIiBcCisJICAgICAgICBkaXN0ZGlyPS4uLyQoZGlzdGRpcikvJCRzdWJkaXIgXAorCSAgICAgICAgZGlzdGRpcikgXAorCSAgICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stcmVjdXJzaXZlCithbGwtYW06IE1ha2VmaWxlCitpbnN0YWxsZGlyczogaW5zdGFsbGRpcnMtcmVjdXJzaXZlCitpbnN0YWxsZGlycy1hbToKKworaW5zdGFsbDogaW5zdGFsbC1yZWN1cnNpdmUKK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlCit1bmluc3RhbGw6IHVuaW5zdGFsbC1yZWN1cnNpdmUKKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stcmVjdXJzaXZlCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKKwkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoQ0xFQU5GSUxFUykKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXJtIC1mIE1ha2VmaWxlICQoQ09ORklHX0NMRUFOX0ZJTEVTKSBzdGFtcC1oIHN0YW1wLWhbMC05XSoKKworbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCitjbGVhbjogY2xlYW4tcmVjdXJzaXZlCisKK2NsZWFuLWFtOiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlCisKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWxpYnRvb2wgXAorCWRpc3RjbGVhbi10YWdzCisKK2R2aTogZHZpLXJlY3Vyc2l2ZQorCitkdmktYW06CisKK2luZm86IGluZm8tcmVjdXJzaXZlCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbToKKworaW5zdGFsbC1leGVjLWFtOgorCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKKworaW5zdGFsbC1tYW46CisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKKworbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wKKwordW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtaW5mby1hbQorCit1bmluc3RhbGwtaW5mbzogdW5pbnN0YWxsLWluZm8tcmVjdXJzaXZlCisKKy5QSE9OWTogJChSRUNVUlNJVkVfVEFSR0VUUykgR1RBR1MgYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBcCisJY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIGNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4gXAorCWRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi1yZWN1cnNpdmUgXAorCWRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIGR2aS1hbSBkdmktcmVjdXJzaXZlIGluZm8gaW5mby1hbSBcCisJaW5mby1yZWN1cnNpdmUgaW5zdGFsbCBpbnN0YWxsLWFtIGluc3RhbGwtZGF0YSBpbnN0YWxsLWRhdGEtYW0gXAorCWluc3RhbGwtZGF0YS1yZWN1cnNpdmUgaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBcCisJaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBpbnN0YWxsLWluZm8gaW5zdGFsbC1pbmZvLWFtIFwKKwlpbnN0YWxsLWluZm8tcmVjdXJzaXZlIGluc3RhbGwtbWFuIGluc3RhbGwtcmVjdXJzaXZlIFwKKwlpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgXAorCWluc3RhbGxkaXJzLWFtIGluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBtYWludGFpbmVyLWNsZWFuIFwKKwltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUgbW9zdGx5Y2xlYW4gXAorCW1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbCBtb3N0bHljbGVhbi1yZWN1cnNpdmUgXAorCXRhZ3MgdGFncy1yZWN1cnNpdmUgdW5pbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwtaW5mby1hbSBcCisJdW5pbnN0YWxsLWluZm8tcmVjdXJzaXZlIHVuaW5zdGFsbC1yZWN1cnNpdmUKKworIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL2V4YW1wbGUvTWFrZWZpbGUuYW0gYi9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvZXhhbXBsZS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjQ3MjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL2V4YW1wbGUvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw4IEBACisjIyMjIyMjIFRoaXMgaXMgdGhlIGlucHV0IGZpbGUgZm9yIGF1dG9tYWtlLCB3aGljaCB3aWxsIGdlbmVyYXRlIE1ha2VmaWxlLmluICMjIyMjIyMjIyMKKworU1VCRElSUz1jYWxjdWxhdG9yCitDTEVBTkZJTEVTPSAqfgorCisjIyBub3QgYSBHTlUgcGFja2FnZS4gWW91IGNhbiByZW1vdmUgdGhpcyBsaW5lLCBpZgorIyMgeW91IGhhdmUgYWxsIG5lZWRlZCBmaWxlcywgdGhhdCBhIEdOVSBwYWNrYWdlIG5lZWRzCitBVVRPTUFLRV9PUFRJT05TID0gZm9yZWlnbiAxLjQKZGlmZiAtLWdpdCBhL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9leGFtcGxlL01ha2VmaWxlLmluIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL2V4YW1wbGUvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNkYzk5NQotLS0gL2Rldi9udWxsCisrKyBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9leGFtcGxlL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMzQ0IEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGF1dG9tYWtlIDEuNSBmcm9tIE1ha2VmaWxlLmFtLgorCisjIENvcHlyaWdodCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxCisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorCisjIyMjIyMjIFRoaXMgaXMgdGhlIGlucHV0IGZpbGUgZm9yIGF1dG9tYWtlLCB3aGljaCB3aWxsIGdlbmVyYXRlIE1ha2VmaWxlLmluICMjIyMjIyMjIyMKKworU0hFTEwgPSBAU0hFTExACisKK3NyY2RpciA9IEBzcmNkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitWUEFUSCA9IEBzcmNkaXJACitwcmVmaXggPSBAcHJlZml4QAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACisKK2JpbmRpciA9IEBiaW5kaXJACitzYmluZGlyID0gQHNiaW5kaXJACitsaWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACitkYXRhZGlyID0gQGRhdGFkaXJACitzeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACitzaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK2xpYmRpciA9IEBsaWJkaXJACitpbmZvZGlyID0gQGluZm9kaXJACittYW5kaXIgPSBAbWFuZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAorb2xkaW5jbHVkZWRpciA9IC91c3IvaW5jbHVkZQorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK3RvcF9idWlsZGRpciA9IC4uCisKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FVVE9DT05GID0gQEFVVE9DT05GQAorQVVUT01BS0UgPSBAQVVUT01BS0VACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACisKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACitJTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQordHJhbnNmb3JtID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfdHJpcGxldCA9IEBob3N0QAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RhcmdldF90cmlwbGV0ID0gQHRhcmdldEAKK0FNVEFSID0gQEFNVEFSQAorQVBYU19DWFhfT1BUSU9OUyA9IEBBUFhTX0NYWF9PUFRJT05TQAorQVMgPSBAQVNACitBV0sgPSBAQVdLQAorQ0MgPSBAQ0NACitDUFAgPSBAQ1BQQAorQ1hYID0gQENYWEAKK0NYWERFQlVHREVGSU5FUyA9IEBDWFhERUJVR0RFRklORVNACitDWFhGTEFHUyA9IEBDWFhGTEFHU0AKK0RFUERJUiA9IEBERVBESVJACitETExUT09MID0gQERMTFRPT0xACitFQ0hPID0gQEVDSE9ACitFWEVFWFQgPSBARVhFRVhUQAorRVhJU1RTX0FQWFMgPSBARVhJU1RTX0FQWFNACitFWElTVFNfR1NPQVAgPSBARVhJU1RTX0dTT0FQQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0xJQlRPT0wgPSBATElCVE9PTEAKK0xJQlRPT0xfREVQUyA9IEBMSUJUT09MX0RFUFNACitMTl9TID0gQExOX1NACitPQkpEVU1QID0gQE9CSkRVTVBACitPQkpFWFQgPSBAT0JKRVhUQAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUkFOTElCID0gQFJBTkxJQkAKK1NUUklQID0gQFNUUklQQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fcXVvdGUgPSBAYW1fX3F1b3RlQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAorCitTVUJESVJTID0gY2FsY3VsYXRvcgorQ0xFQU5GSUxFUyA9ICp+CisKK0FVVE9NQUtFX09QVElPTlMgPSBmb3JlaWduIDEuNAorc3ViZGlyID0gZXhhbXBsZQorbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycworQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK0RJU1RfU09VUkNFUyA9CisKK1JFQ1VSU0lWRV9UQVJHRVRTID0gaW5mby1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZSBpbnN0YWxsLWluZm8tcmVjdXJzaXZlIFwKKwl1bmluc3RhbGwtaW5mby1yZWN1cnNpdmUgYWxsLXJlY3Vyc2l2ZSBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIFwKKwlpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIGluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBpbnN0YWxsLXJlY3Vyc2l2ZSBcCisJdW5pbnN0YWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZQorRElTVF9DT01NT04gPSBNYWtlZmlsZS5hbSBNYWtlZmlsZS5pbgorRElTVF9TVUJESVJTID0gJChTVUJESVJTKQorYWxsOiBhbGwtcmVjdXJzaXZlCisKKy5TVUZGSVhFUzoKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKKworZGlzdGNsZWFuLWxpYnRvb2w6CisJLXJtIC1mIGxpYnRvb2wKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogIE1ha2VmaWxlLmFtICAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gIGV4YW1wbGUvTWFrZWZpbGUKK01ha2VmaWxlOiAgJChzcmNkaXIpL01ha2VmaWxlLmluICAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCWNkICQodG9wX2J1aWxkZGlyKSAmJiBcCisJICBDT05GSUdfSEVBREVSUz0gQ09ORklHX0xJTktTPSBcCisJICBDT05GSUdfRklMRVM9JChzdWJkaXIpLyRAICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwordW5pbnN0YWxsLWluZm8tYW06CisKKyMgVGhpcyBkaXJlY3RvcnkncyBzdWJkaXJlY3RvcmllcyBhcmUgbW9zdGx5IGluZGVwZW5kZW50OyB5b3UgY2FuIGNkCisjIGludG8gdGhlbSBhbmQgcnVuIGBtYWtlJyB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhpcyBNYWtlZmlsZS4KKyMgVG8gY2hhbmdlIHRoZSB2YWx1ZXMgb2YgYG1ha2UnIHZhcmlhYmxlczogaW5zdGVhZCBvZiBlZGl0aW5nIE1ha2VmaWxlcywKKyMgKDEpIGlmIHRoZSB2YXJpYWJsZSBpcyBzZXQgaW4gYGNvbmZpZy5zdGF0dXMnLCBlZGl0IGBjb25maWcuc3RhdHVzJworIyAgICAgKHdoaWNoIHdpbGwgY2F1c2UgdGhlIE1ha2VmaWxlcyB0byBiZSByZWdlbmVyYXRlZCB3aGVuIHlvdSBydW4gYG1ha2UnKTsKKyMgKDIpIG90aGVyd2lzZSwgcGFzcyB0aGUgZGVzaXJlZCB2YWx1ZXMgb24gdGhlIGBtYWtlJyBjb21tYW5kIGxpbmUuCiskKFJFQ1VSU0lWRV9UQVJHRVRTKToKKwlAc2V0IGZub3JkICQoTUFLRUZMQUdTKTsgYW1mPSQkMjsgXAorCWRvdF9zZWVuPW5vOyBcCisJdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKKwkgICAgZG90X3NlZW49eWVzOyBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCisJICBlbHNlIFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKKwkgIGZpOyBcCisJICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKKwkgICB8fCBjYXNlICIkJGFtZiIgaW4gKj0qKSBleGl0IDE7OyAqayopIGZhaWw9eWVzOzsgKikgZXhpdCAxOzsgZXNhYzsgXAorCWRvbmU7IFwKKwlpZiB0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyI7IHRoZW4gXAorCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgIiQkdGFyZ2V0LWFtIiB8fCBleGl0IDE7IFwKKwlmaTsgdGVzdCAteiAiJCRmYWlsIgorCittb3N0bHljbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlIGRpc3RjbGVhbi1yZWN1cnNpdmUgXAorbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmU6CisJQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKKwlkb3Rfc2Vlbj1ubzsgXAorCWNhc2UgIiRAIiBpbiBcCisJICBkaXN0Y2xlYW4tKiB8IG1haW50YWluZXItY2xlYW4tKikgbGlzdD0nJChESVNUX1NVQkRJUlMpJyA7OyBcCisJICAqKSBsaXN0PSckKFNVQkRJUlMpJyA7OyBcCisJZXNhYzsgXAorCXJldj0nJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiA6OyBlbHNlIFwKKwkgICAgcmV2PSIkJHN1YmRpciAkJHJldiI7IFwKKwkgIGZpOyBcCisJZG9uZTsgXAorCXJldj0iJCRyZXYgLiI7IFwKKwl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCisJZm9yIHN1YmRpciBpbiAkJHJldjsgZG8gXAorCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKKwkgIGVsc2UgXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAorCSAgZmk7IFwKKwkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAorCSAgIHx8IGNhc2UgIiQkYW1mIiBpbiAqPSopIGV4aXQgMTs7ICprKikgZmFpbD15ZXM7OyAqKSBleGl0IDE7OyBlc2FjOyBcCisJZG9uZSAmJiB0ZXN0IC16ICIkJGZhaWwiCit0YWdzLXJlY3Vyc2l2ZToKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRhZ3MpOyBcCisJZG9uZQorCit0YWdzOiBUQUdTCisKK0lEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJbWtpZCAtZklEICQkdW5pcXVlICQoTElTUCkKKworVEFHUzogdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCXRhZ3M9OyBcCisJaGVyZT1gcHdkYDsgXAorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKKwkgICAgdGVzdCAtZiAkJHN1YmRpci9UQUdTICYmIHRhZ3M9IiQkdGFncyAtaSAkJGhlcmUvJCRzdWJkaXIvVEFHUyI7IFwKKwkgIGZpOyBcCisJZG9uZTsgXAorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAorCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAorCXRlc3QgLXogIiQoRVRBR1NfQVJHUykkJHVuaXF1ZSQoTElTUCkkJHRhZ3MiIFwKKwkgIHx8IGV0YWdzICQoRVRBR1NfQVJHUykgJCR0YWdzICAkJHVuaXF1ZSAkKExJU1ApCisKK0dUQUdTOgorCWhlcmU9YENEUEFUSD06ICYmIGNkICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmIGNkICQodG9wX3NyY2RpcikgXAorCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAkJGhlcmUKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRICisKK0RJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCisKK3RvcF9kaXN0ZGlyID0gLi4KK2Rpc3RkaXIgPSAkKHRvcF9kaXN0ZGlyKS8kKFBBQ0tBR0UpLSQoVkVSU0lPTikKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQGZvciBmaWxlIGluICQoRElTVEZJTEVTKTsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgZGlyPWBlY2hvICIkJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAorCSAgaWYgdGVzdCAiJCRkaXIiICE9ICIkJGZpbGUiICYmIHRlc3QgIiQkZGlyIiAhPSAiLiI7IHRoZW4gXAorCSAgICAkKG1raW5zdGFsbGRpcnMpICIkKGRpc3RkaXIpLyQkZGlyIjsgXAorCSAgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGNwIC1wUiAkJGQvJCRmaWxlICQoZGlzdGRpcikgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCisJZm9yIHN1YmRpciBpbiAkKFNVQkRJUlMpOyBkbyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAorCSAgICB0ZXN0IC1kICQoZGlzdGRpcikvJCRzdWJkaXIgXAorCSAgICB8fCBta2RpciAkKGRpc3RkaXIpLyQkc3ViZGlyIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICAgIChjZCAkJHN1YmRpciAmJiBcCisJICAgICAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAorCSAgICAgICAgdG9wX2Rpc3RkaXI9IiQodG9wX2Rpc3RkaXIpIiBcCisJICAgICAgICBkaXN0ZGlyPS4uLyQoZGlzdGRpcikvJCRzdWJkaXIgXAorCSAgICAgICAgZGlzdGRpcikgXAorCSAgICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stcmVjdXJzaXZlCithbGwtYW06IE1ha2VmaWxlCitpbnN0YWxsZGlyczogaW5zdGFsbGRpcnMtcmVjdXJzaXZlCitpbnN0YWxsZGlycy1hbToKKworaW5zdGFsbDogaW5zdGFsbC1yZWN1cnNpdmUKK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlCit1bmluc3RhbGw6IHVuaW5zdGFsbC1yZWN1cnNpdmUKKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stcmVjdXJzaXZlCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKKwkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoQ0xFQU5GSUxFUykKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXJtIC1mIE1ha2VmaWxlICQoQ09ORklHX0NMRUFOX0ZJTEVTKSBzdGFtcC1oIHN0YW1wLWhbMC05XSoKKworbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCitjbGVhbjogY2xlYW4tcmVjdXJzaXZlCisKK2NsZWFuLWFtOiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlCisKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWxpYnRvb2wgXAorCWRpc3RjbGVhbi10YWdzCisKK2R2aTogZHZpLXJlY3Vyc2l2ZQorCitkdmktYW06CisKK2luZm86IGluZm8tcmVjdXJzaXZlCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbToKKworaW5zdGFsbC1leGVjLWFtOgorCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKKworaW5zdGFsbC1tYW46CisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKKworbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wKKwordW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtaW5mby1hbQorCit1bmluc3RhbGwtaW5mbzogdW5pbnN0YWxsLWluZm8tcmVjdXJzaXZlCisKKy5QSE9OWTogJChSRUNVUlNJVkVfVEFSR0VUUykgR1RBR1MgYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBcCisJY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIGNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4gXAorCWRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi1yZWN1cnNpdmUgXAorCWRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIGR2aS1hbSBkdmktcmVjdXJzaXZlIGluZm8gaW5mby1hbSBcCisJaW5mby1yZWN1cnNpdmUgaW5zdGFsbCBpbnN0YWxsLWFtIGluc3RhbGwtZGF0YSBpbnN0YWxsLWRhdGEtYW0gXAorCWluc3RhbGwtZGF0YS1yZWN1cnNpdmUgaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBcCisJaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBpbnN0YWxsLWluZm8gaW5zdGFsbC1pbmZvLWFtIFwKKwlpbnN0YWxsLWluZm8tcmVjdXJzaXZlIGluc3RhbGwtbWFuIGluc3RhbGwtcmVjdXJzaXZlIFwKKwlpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgXAorCWluc3RhbGxkaXJzLWFtIGluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBtYWludGFpbmVyLWNsZWFuIFwKKwltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUgbW9zdGx5Y2xlYW4gXAorCW1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbCBtb3N0bHljbGVhbi1yZWN1cnNpdmUgXAorCXRhZ3MgdGFncy1yZWN1cnNpdmUgdW5pbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwtaW5mby1hbSBcCisJdW5pbnN0YWxsLWluZm8tcmVjdXJzaXZlIHVuaW5zdGFsbC1yZWN1cnNpdmUKKworIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL2V4YW1wbGUvY2FsY3VsYXRvci8ua2RiZ3JjLmNsaWVudCBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9leGFtcGxlL2NhbGN1bGF0b3IvLmtkYmdyYy5jbGllbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMzOWE3MQotLS0gL2Rldi9udWxsCisrKyBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9leGFtcGxlL2NhbGN1bGF0b3IvLmtkYmdyYy5jbGllbnQKQEAgLTAsMCArMSwyOCBAQAorW0JyZWFrcG9pbnQgMF0KK0VuYWJsZWQ9dHJ1ZQorRmlsZT1jYWxjY2xudC5jcHAKK0xpbmU9MTIKK1RlbXBvcmFyeT1mYWxzZQorCitbQnJlYWtwb2ludCAxXQorRW5hYmxlZD10cnVlCitGaWxlPS4uLy4uLy4uL3N0ZHNvYXAyLmNwcAorTGluZT01MTA1CitUZW1wb3Jhcnk9ZmFsc2UKKworW0JyZWFrcG9pbnQgMl0KK0VuYWJsZWQ9dHJ1ZQorRmlsZT0uLi8uLi8uLi9zdGRzb2FwMi5jcHAKK0xpbmU9NDg0CitUZW1wb3Jhcnk9ZmFsc2UKKworW0dlbmVyYWxdCitEZWJ1Z2dlckNtZFN0cj0KK0ZpbGVWZXJzaW9uPTEKK1Byb2dyYW1BcmdzPTEgKyAyCitUVFlMZXZlbD03CitXb3JraW5nRGlyZWN0b3J5PQorCitbTWVtb3J5XQorQ29sdW1uV2lkdGhzPTgwLDAKK051bUV4cHJzPTAKZGlmZiAtLWdpdCBhL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9leGFtcGxlL2NhbGN1bGF0b3IvTWFrZWZpbGUgYi9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvZXhhbXBsZS9jYWxjdWxhdG9yL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3OWYxYjIKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvZXhhbXBsZS9jYWxjdWxhdG9yL01ha2VmaWxlCkBAIC0wLDAgKzEsMzg0IEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGF1dG9tYWtlIDEuNSBmcm9tIE1ha2VmaWxlLmFtLgorCisjIENvcHlyaWdodCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxCisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworCisKK1NIRUxMID0gL2Jpbi9zaAorCitzcmNkaXIgPSAuCit0b3Bfc3JjZGlyID0gLi4vLi4KKworcHJlZml4ID0gL3Vzci9sb2NhbAorZXhlY19wcmVmaXggPSAke3ByZWZpeH0KKworYmluZGlyID0gJHtleGVjX3ByZWZpeH0vYmluCitzYmluZGlyID0gJHtleGVjX3ByZWZpeH0vc2JpbgorbGliZXhlY2RpciA9ICR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMKK2RhdGFkaXIgPSAke3ByZWZpeH0vc2hhcmUKK3N5c2NvbmZkaXIgPSAke3ByZWZpeH0vZXRjCitzaGFyZWRzdGF0ZWRpciA9ICR7cHJlZml4fS9jb20KK2xvY2Fsc3RhdGVkaXIgPSAke3ByZWZpeH0vdmFyCitsaWJkaXIgPSAke2V4ZWNfcHJlZml4fS9saWIKK2luZm9kaXIgPSAke3ByZWZpeH0vaW5mbworbWFuZGlyID0gJHtwcmVmaXh9L21hbgoraW5jbHVkZWRpciA9ICR7cHJlZml4fS9pbmNsdWRlCitvbGRpbmNsdWRlZGlyID0gL3Vzci9pbmNsdWRlCitwa2dkYXRhZGlyID0gJChkYXRhZGlyKS9tb2RfZ3NvYXAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9tb2RfZ3NvYXAKK3BrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL21vZF9nc29hcAordG9wX2J1aWxkZGlyID0gLi4vLi4KKworQUNMT0NBTCA9ICR7U0hFTEx9IC9ob21lL2FiZXJnZXIvYXBhY2hlX2dzb2FwLjAuMC41L21pc3NpbmcgLS1ydW4gYWNsb2NhbAorQVVUT0NPTkYgPSAke1NIRUxMfSAvaG9tZS9hYmVyZ2VyL2FwYWNoZV9nc29hcC4wLjAuNS9taXNzaW5nIC0tcnVuIGF1dG9jb25mCitBVVRPTUFLRSA9ICR7U0hFTEx9IC9ob21lL2FiZXJnZXIvYXBhY2hlX2dzb2FwLjAuMC41L21pc3NpbmcgLS1ydW4gYXV0b21ha2UKK0FVVE9IRUFERVIgPSAke1NIRUxMfSAvaG9tZS9hYmVyZ2VyL2FwYWNoZV9nc29hcC4wLjAuNS9taXNzaW5nIC0tcnVuIGF1dG9oZWFkZXIKKworSU5TVEFMTCA9IC91c3IvYmluL2dpbnN0YWxsIC1jCitJTlNUQUxMX1BST0dSQU0gPSAke0lOU1RBTEx9CitJTlNUQUxMX0RBVEEgPSAke0lOU1RBTEx9IC1tIDY0NAorSU5TVEFMTF9TQ1JJUFQgPSAke0lOU1RBTEx9CitJTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQordHJhbnNmb3JtID0gcyx4LHgsCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX2FsaWFzID0gaTY4Ni1zdXNlLWxpbnV4CitidWlsZF90cmlwbGV0ID0gaTY4Ni1zdXNlLWxpbnV4Citob3N0X2FsaWFzID0gaTY4Ni1zdXNlLWxpbnV4Citob3N0X3RyaXBsZXQgPSBpNjg2LXN1c2UtbGludXgKK3RhcmdldF9hbGlhcyA9IGk2ODYtc3VzZS1saW51eAordGFyZ2V0X3RyaXBsZXQgPSBpNjg2LXN1c2UtbGludXgKK0FNVEFSID0gJHtTSEVMTH0gL2hvbWUvYWJlcmdlci9hcGFjaGVfZ3NvYXAuMC4wLjUvbWlzc2luZyAtLXJ1biB0YXIKK0FQWFNfQ1hYX09QVElPTlMgPSAKK0FTID0gYXMKK0FXSyA9IGdhd2sKK0NDID0gZ2NjCitDUFAgPSBnY2MgLUUKK0NYWCA9IGcrKworQ1hYREVCVUdERUZJTkVTID0gLURfTkRFQlVHCitDWFhGTEFHUyA9ICAtTzIKK0RFUERJUiA9IC5kZXBzCitETExUT09MID0gZGxsdG9vbAorRUNITyA9IGVjaG8KK0VYRUVYVCA9IAorRVhJU1RTX0FQWFMgPSB5ZXMKK0VYSVNUU19HU09BUCA9IHllcworSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gJHtTSEVMTH0gJChpbnN0YWxsX3NoKSAtYyAtcworTElCVE9PTCA9ICQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sCitMSUJUT09MX0RFUFMgPSAuL2x0bWFpbi5zaAorTE5fUyA9IGxuIC1zCitPQkpEVU1QID0gb2JqZHVtcAorT0JKRVhUID0gbworUEFDS0FHRSA9IG1vZF9nc29hcAorUkFOTElCID0gcmFubGliCitTVFJJUCA9IHN0cmlwCitWRVJTSU9OID0gMC4wLjUKK2FtX19pbmNsdWRlID0gaW5jbHVkZQorYW1fX3F1b3RlID0gCitpbnN0YWxsX3NoID0gL2hvbWUvYWJlcmdlci9hcGFjaGVfZ3NvYXAuMC4wLjUvaW5zdGFsbC1zaAorCitBTV9DUFBGTEFHUyA9IC1EX1JFRU5UUkFOVCAkKENYWERFQlVHREVGSU5FUykgLURERUJVRworCitDTEVBTkZJTEVTID0gKn4gKi5sb2cgKi54bWwgY2FsYy5uc21hcCBzb2FwQy5jcHAgc29hcEguaCBzb2FwU2VydmVyLmNwcCBucy54c2QgY2FsYy53c2RsIHNvYXBDbGllbnQuY3BwIHNvYXBTdHViLmggY2xpZW50CisKK0JVSUxUX1NPVVJDRVMgPSBzb2FwU2VydmVyLmNwcCBzb2FwQy5jcHAgY2FsYy5uc21hcCBzb2FwSC5oIG5zLnhzZCBjYWxjLndzZGwgY2FsYy5uc21hcAorCitsaWJfTFRMSUJSQVJJRVMgPSBsaWJDYWxjdWxhdG9yLmxhCisKK25vaW5zdF9QUk9HUkFNUyA9IGNsaWVudAorCitjbGllbnRfU09VUkNFUyA9IGNhbGNjbG50LmNwcCBzb2FwQy5jcHAgc29hcENsaWVudC5jcHAKKworbGliQ2FsY3VsYXRvcl9sYV9TT1VSQ0VTID0gXAorICAgIGNhbGN1bGF0b3IuY3BwIFwKKwlzb2FwU2VydmVyLmNwcCBcCisJc29hcEMuY3BwCisKKworbGliQ2FsY3VsYXRvcl9sYV9MSUJBREQgPSAKKworY2xpZW50X0xEQUREID0gLWxnc29hcCsrCitsaWJDYWxjdWxhdG9yX2xhX0xERkxBR1MgPSAtdmVyc2lvbi1pbmZvIDA6MDowIC1tb2R1bGUgLWxnc29hcCsrCisKK0lOQ0xVREVTID0gLUkkKHRvcF9idWlsZGRpcikKK3N1YmRpciA9IGV4YW1wbGUvY2FsY3VsYXRvcgorbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycworQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK0xUTElCUkFSSUVTID0gJChsaWJfTFRMSUJSQVJJRVMpCisKK2xpYkNhbGN1bGF0b3JfbGFfREVQRU5ERU5DSUVTID0KK2FtX2xpYkNhbGN1bGF0b3JfbGFfT0JKRUNUUyA9IGNhbGN1bGF0b3IubG8gc29hcFNlcnZlci5sbyBzb2FwQy5sbworbGliQ2FsY3VsYXRvcl9sYV9PQkpFQ1RTID0gJChhbV9saWJDYWxjdWxhdG9yX2xhX09CSkVDVFMpCitub2luc3RfUFJPR1JBTVMgPSBjbGllbnQkKEVYRUVYVCkKK1BST0dSQU1TID0gJChub2luc3RfUFJPR1JBTVMpCisKK2FtX2NsaWVudF9PQkpFQ1RTID0gY2FsY2NsbnQuJChPQkpFWFQpIHNvYXBDLiQoT0JKRVhUKSBcCisJc29hcENsaWVudC4kKE9CSkVYVCkKK2NsaWVudF9PQkpFQ1RTID0gJChhbV9jbGllbnRfT0JKRUNUUykKK2NsaWVudF9ERVBFTkRFTkNJRVMgPQorY2xpZW50X0xERkxBR1MgPQorCitERUZTID0gLURIQVZFX0NPTkZJR19ICitERUZBVUxUX0lOQ0xVREVTID0gIC1JLiAtSSQoc3JjZGlyKSAtSSQodG9wX2J1aWxkZGlyKQorQ1BQRkxBR1MgPSAKK0xERkxBR1MgPSAKK0xJQlMgPSAKK2RlcGNvbXAgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2RlcGNvbXAKK0RFUF9GSUxFUyA9ICQoREVQRElSKS9jYWxjY2xudC5QbyAkKERFUERJUikvY2FsY3VsYXRvci5QbG8gXAorCSQoREVQRElSKS9zb2FwQy5QbG8gJChERVBESVIpL3NvYXBDLlBvIFwKKwkkKERFUERJUikvc29hcENsaWVudC5QbyAkKERFUERJUikvc29hcFNlcnZlci5QbG8KK0NYWENPTVBJTEUgPSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpIFwKKwkkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKQorTFRDWFhDT01QSUxFID0gJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENYWCkgJChERUZTKSBcCisJJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBcCisJJChBTV9DWFhGTEFHUykgJChDWFhGTEFHUykKK0NYWExEID0gJChDWFgpCitDWFhMSU5LID0gJChMSUJUT09MKSAtLW1vZGU9bGluayAkKENYWExEKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSBcCisJJChBTV9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACitESVNUX1NPVVJDRVMgPSAkKGxpYkNhbGN1bGF0b3JfbGFfU09VUkNFUykgJChjbGllbnRfU09VUkNFUykKK0RJU1RfQ09NTU9OID0gTWFrZWZpbGUuYW0gTWFrZWZpbGUuaW4KK1NPVVJDRVMgPSAkKGxpYkNhbGN1bGF0b3JfbGFfU09VUkNFUykgJChjbGllbnRfU09VUkNFUykKKworYWxsOiAkKEJVSUxUX1NPVVJDRVMpCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYWxsLWFtCisKKy5TVUZGSVhFUzoKKy5TVUZGSVhFUzogLmNwcCAubG8gLm8gLm9iagorCittb3N0bHljbGVhbi1saWJ0b29sOgorCS1ybSAtZiAqLmxvCisKK2NsZWFuLWxpYnRvb2w6CisJLXJtIC1yZiAubGlicyBfbGlicworCitkaXN0Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgbGlidG9vbAorJChzcmNkaXIpL01ha2VmaWxlLmluOiAgTWFrZWZpbGUuYW0gICQodG9wX3NyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkKKwljZCAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZ251ICBleGFtcGxlL2NhbGN1bGF0b3IvTWFrZWZpbGUKK01ha2VmaWxlOiAgJChzcmNkaXIpL01ha2VmaWxlLmluICAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCWNkICQodG9wX2J1aWxkZGlyKSAmJiBcCisJICBDT05GSUdfSEVBREVSUz0gQ09ORklHX0xJTktTPSBcCisJICBDT05GSUdfRklMRVM9JChzdWJkaXIpLyRAICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworaW5zdGFsbC1saWJMVExJQlJBUklFUzogJChsaWJfTFRMSUJSQVJJRVMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpCisJQGxpc3Q9JyQobGliX0xUTElCUkFSSUVTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAorCSAgICBlY2hvICIgJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTEwpICQoSU5TVEFMTF9TVFJJUF9GTEFHKSAkJHAgJChERVNURElSKSQobGliZGlyKS8kJHAiOyBcCisJICAgICQoTElCVE9PTCkgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMKSAkKElOU1RBTExfU1RSSVBfRkxBRykgJCRwICQoREVTVERJUikkKGxpYmRpcikvJCRwOyBcCisJICBlbHNlIDo7IGZpOyBcCisJZG9uZQorCit1bmluc3RhbGwtbGliTFRMSUJSQVJJRVM6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChsaWJfTFRMSUJSQVJJRVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBlY2hvICIgJChMSUJUT09MKSAtLW1vZGU9dW5pbnN0YWxsIHJtIC1mICQoREVTVERJUikkKGxpYmRpcikvJCRwIjsgXAorCSAgJChMSUJUT09MKSAtLW1vZGU9dW5pbnN0YWxsIHJtIC1mICQoREVTVERJUikkKGxpYmRpcikvJCRwOyBcCisJZG9uZQorCitjbGVhbi1saWJMVExJQlJBUklFUzoKKwktdGVzdCAteiAiJChsaWJfTFRMSUJSQVJJRVMpIiB8fCBybSAtZiAkKGxpYl9MVExJQlJBUklFUykKK2xpYkNhbGN1bGF0b3IubGE6ICQobGliQ2FsY3VsYXRvcl9sYV9PQkpFQ1RTKSAkKGxpYkNhbGN1bGF0b3JfbGFfREVQRU5ERU5DSUVTKSAKKwkkKENYWExJTkspIC1ycGF0aCAkKGxpYmRpcikgJChsaWJDYWxjdWxhdG9yX2xhX0xERkxBR1MpICQobGliQ2FsY3VsYXRvcl9sYV9PQkpFQ1RTKSAkKGxpYkNhbGN1bGF0b3JfbGFfTElCQUREKSAkKExJQlMpCisKK2NsZWFuLW5vaW5zdFBST0dSQU1TOgorCS10ZXN0IC16ICIkKG5vaW5zdF9QUk9HUkFNUykiIHx8IHJtIC1mICQobm9pbnN0X1BST0dSQU1TKQorY2xpZW50JChFWEVFWFQpOiAkKGNsaWVudF9PQkpFQ1RTKSAkKGNsaWVudF9ERVBFTkRFTkNJRVMpIAorCUBybSAtZiBjbGllbnQkKEVYRUVYVCkKKwkkKENYWExJTkspICQoY2xpZW50X0xERkxBR1MpICQoY2xpZW50X09CSkVDVFMpICQoY2xpZW50X0xEQUREKSAkKExJQlMpCisKK21vc3RseWNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICouJChPQkpFWFQpIGNvcmUgKi5jb3JlCisKK2Rpc3RjbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLnRhYi5jCisKK2luY2x1ZGUgJChERVBESVIpL2NhbGNjbG50LlBvCitpbmNsdWRlICQoREVQRElSKS9jYWxjdWxhdG9yLlBsbworaW5jbHVkZSAkKERFUERJUikvc29hcEMuUGxvCitpbmNsdWRlICQoREVQRElSKS9zb2FwQy5QbworaW5jbHVkZSAkKERFUERJUikvc29hcENsaWVudC5QbworaW5jbHVkZSAkKERFUERJUikvc29hcFNlcnZlci5QbG8KKworZGlzdGNsZWFuLWRlcGVuZDoKKwktcm0gLXJmICQoREVQRElSKQorCisuY3BwLm86CisJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBcCisJZGVwZmlsZT0nJChERVBESVIpLyQqLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvJCouVFBvJyBcCisJJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIFwKKwkkKENYWENPTVBJTEUpIC1jIC1vICRAIGB0ZXN0IC1mICQ8IHx8IGVjaG8gJyQoc3JjZGlyKS8nYCQ8CisKKy5jcHAub2JqOgorCXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gXAorCWRlcGZpbGU9JyQoREVQRElSKS8kKi5QbycgdG1wZGVwZmlsZT0nJChERVBESVIpLyQqLlRQbycgXAorCSQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBcCisJJChDWFhDT01QSUxFKSAtYyAtbyAkQCBgY3lncGF0aCAtdyAkPGAKKworLmNwcC5sbzoKKwlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPXllcyBcCisJZGVwZmlsZT0nJChERVBESVIpLyQqLlBsbycgdG1wZGVwZmlsZT0nJChERVBESVIpLyQqLlRQbG8nIFwKKwkkKENYWERFUE1PREUpICQoZGVwY29tcCkgXAorCSQoTFRDWFhDT01QSUxFKSAtYyAtbyAkQCBgdGVzdCAtZiAkPCB8fCBlY2hvICckKHNyY2RpcikvJ2AkPAorQ1hYREVQTU9ERSA9IGRlcG1vZGU9Z2NjCit1bmluc3RhbGwtaW5mby1hbToKKwordGFnczogVEFHUworCitJRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAorCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAorCW1raWQgLWZJRCAkJHVuaXF1ZSAkKExJU1ApCisKK1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJdGFncz07IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJdGVzdCAteiAiJChFVEFHU19BUkdTKSQkdW5pcXVlJChMSVNQKSQkdGFncyIgXAorCSAgfHwgZXRhZ3MgJChFVEFHU19BUkdTKSAkJHRhZ3MgICQkdW5pcXVlICQoTElTUCkKKworR1RBR1M6CisJaGVyZT1gQ0RQQVRIPTogJiYgY2QgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAorCSAgJiYgY2QgJCh0b3Bfc3JjZGlyKSBcCisJICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICQkaGVyZQorCitkaXN0Y2xlYW4tdGFnczoKKwktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEgKKworRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKKwordG9wX2Rpc3RkaXIgPSAuLi8uLgorZGlzdGRpciA9ICQodG9wX2Rpc3RkaXIpLyQoUEFDS0FHRSktJChWRVJTSU9OKQorCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwlAZm9yIGZpbGUgaW4gJChESVNURklMRVMpOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBkaXI9YGVjaG8gIiQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICBpZiB0ZXN0ICIkJGRpciIgIT0gIiQkZmlsZSIgJiYgdGVzdCAiJCRkaXIiICE9ICIuIjsgdGhlbiBcCisJICAgICQobWtpbnN0YWxsZGlycykgIiQoZGlzdGRpcikvJCRkaXIiOyBcCisJICBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgY3AgLXBSICQkZC8kJGZpbGUgJChkaXN0ZGlyKSBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKK2NoZWNrLWFtOiBhbGwtYW0KK2NoZWNrOiBjaGVjay1hbQorYWxsLWFtOiBNYWtlZmlsZSAkKExUTElCUkFSSUVTKSAkKFBST0dSQU1TKQorCitpbnN0YWxsZGlyczoKKwkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGxpYmRpcikKKworaW5zdGFsbDogaW5zdGFsbC1hbQoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCit1bmluc3RhbGw6IHVuaW5zdGFsbC1hbQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQorCitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgYHRlc3QgLXogJyQoU1RSSVApJyB8fCBcCisJICAgIGVjaG8gIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciYCBpbnN0YWxsCittb3N0bHljbGVhbi1nZW5lcmljOgorCitjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENMRUFORklMRVMpIiB8fCBybSAtZiAkKENMRUFORklMRVMpCisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS1ybSAtZiBNYWtlZmlsZSAkKENPTkZJR19DTEVBTl9GSUxFUykgc3RhbXAtaCBzdGFtcC1oWzAtOV0qCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorCS10ZXN0IC16ICIkKEJVSUxUX1NPVVJDRVMpIiB8fCBybSAtZiAkKEJVSUxUX1NPVVJDRVMpCitjbGVhbjogY2xlYW4tYW0KKworY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGliTFRMSUJSQVJJRVMgY2xlYW4tbGlidG9vbCBcCisJY2xlYW4tbm9pbnN0UFJPR1JBTVMgbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KKworZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZGVwZW5kIFwKKwlkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1hbQorCitkdmktYW06CisKK2luZm86IGluZm8tYW0KKworaW5mby1hbToKKworaW5zdGFsbC1kYXRhLWFtOgorCitpbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtbGliTFRMSUJSQVJJRVMKKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KKworaW5zdGFsbC1tYW46CisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCittYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCisKK21vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQorCittb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIFwKKwltb3N0bHljbGVhbi1saWJ0b29sCisKK3VuaW5zdGFsbC1hbTogdW5pbnN0YWxsLWluZm8tYW0gdW5pbnN0YWxsLWxpYkxUTElCUkFSSUVTCisKKy5QSE9OWTogR1RBR1MgYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1nZW5lcmljIFwKKwljbGVhbi1saWJMVExJQlJBUklFUyBjbGVhbi1saWJ0b29sIGNsZWFuLW5vaW5zdFBST0dSQU1TIFwKKwlkaXN0Y2xlYW4gZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWRlcGVuZCBkaXN0Y2xlYW4tZ2VuZXJpYyBcCisJZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLXRhZ3MgZGlzdGRpciBkdmkgZHZpLWFtIGluZm8gXAorCWluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIGluc3RhbGwtZGF0YSBpbnN0YWxsLWRhdGEtYW0gXAorCWluc3RhbGwtZXhlYyBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBcCisJaW5zdGFsbC1saWJMVExJQlJBUklFUyBpbnN0YWxsLW1hbiBpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBcCisJaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIG1haW50YWluZXItY2xlYW4gXAorCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBtb3N0bHljbGVhbi1jb21waWxlIFwKKwltb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wgdGFncyB1bmluc3RhbGwgXAorCXVuaW5zdGFsbC1hbSB1bmluc3RhbGwtaW5mby1hbSB1bmluc3RhbGwtbGliTFRMSUJSQVJJRVMKKworCitjYWxjdWxhdG9yLmNwcDogY2FsYy5uc21hcCBzb2FwSC5oCisKK3NvYXBDLmNwcCBzb2FwU2VydmVyLmNwcCBucy5uc21hcCBucy54c2QgY2FsYy53c2RsIHNvYXBILmggY2FsYy5uc21hcDogY2FsY3VsYXRvci5oCisJc29hcGNwcDIgY2FsY3VsYXRvci5oCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvZXhhbXBsZS9jYWxjdWxhdG9yL01ha2VmaWxlLmFtIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL2V4YW1wbGUvY2FsY3VsYXRvci9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGFkNTYxCi0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL2V4YW1wbGUvY2FsY3VsYXRvci9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDMyIEBACisjIyB0aGlzIGZpbGUgaXMgaW5wdXQgZm9yIGF1dG9tYWtlIGFuZCB3aWxsIGdlbmVyYXRlIE1ha2VmaWxlLmluCisKK0FNX0NQUEZMQUdTPS1EX1JFRU5UUkFOVCAkKENYWERFQlVHREVGSU5FUykgLURERUJVRworCitDTEVBTkZJTEVTPSp+ICoubG9nICoueG1sIGNhbGMubnNtYXAgc29hcEMuY3BwIHNvYXBILmggc29hcFNlcnZlci5jcHAgbnMueHNkIGNhbGMud3NkbCBzb2FwQ2xpZW50LmNwcCBzb2FwU3R1Yi5oIGNsaWVudAorCisKK0JVSUxUX1NPVVJDRVMgPSBzb2FwU2VydmVyLmNwcCBzb2FwQy5jcHAgY2FsYy5uc21hcCBzb2FwSC5oIG5zLnhzZCBjYWxjLndzZGwgY2FsYy5uc21hcAorCitsaWJfTFRMSUJSQVJJRVMgPSBsaWJDYWxjdWxhdG9yLmxhCisKK25vaW5zdF9QUk9HUkFNUyA9IGNsaWVudAorCitjbGllbnRfU09VUkNFUz1jYWxjY2xudC5jcHAgc29hcEMuY3BwIHNvYXBDbGllbnQuY3BwCisKK2NhbGN1bGF0b3IuY3BwOiBjYWxjLm5zbWFwIHNvYXBILmgKKworbGliQ2FsY3VsYXRvcl9sYV9TT1VSQ0VTID0gXAorICAgIGNhbGN1bGF0b3IuY3BwIFwKKwlzb2FwU2VydmVyLmNwcCBcCisJc29hcEMuY3BwCisKK2xpYkNhbGN1bGF0b3JfbGFfTElCQUREID0gCisKK2NsaWVudF9MREFERD0tbGdzb2FwKysKK2xpYkNhbGN1bGF0b3JfbGFfTERGTEFHUyA9IC12ZXJzaW9uLWluZm8gMDowOjAgLW1vZHVsZSAtbGdzb2FwKysKKworSU5DTFVERVM9LUkkKHRvcF9idWlsZGRpcikKKworc29hcEMuY3BwIHNvYXBTZXJ2ZXIuY3BwIG5zLm5zbWFwIG5zLnhzZCBjYWxjLndzZGwgc29hcEguaCBjYWxjLm5zbWFwOiBjYWxjdWxhdG9yLmgKKwlzb2FwY3BwMiBjYWxjdWxhdG9yLmgKKwpkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL2V4YW1wbGUvY2FsY3VsYXRvci9NYWtlZmlsZS5pbiBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9leGFtcGxlL2NhbGN1bGF0b3IvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwNTY1ZgotLS0gL2Rldi9udWxsCisrKyBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9leGFtcGxlL2NhbGN1bGF0b3IvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwzODQgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYXV0b21ha2UgMS41IGZyb20gTWFrZWZpbGUuYW0uCisKKyMgQ29weXJpZ2h0IDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACisKK1NIRUxMID0gQFNIRUxMQAorCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorVlBBVEggPSBAc3JjZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAorCitiaW5kaXIgPSBAYmluZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorZGF0YWRpciA9IEBkYXRhZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACitsaWJkaXIgPSBAbGliZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAorbWFuZGlyID0gQG1hbmRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK29sZGluY2x1ZGVkaXIgPSAvdXNyL2luY2x1ZGUKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAorcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACit0b3BfYnVpbGRkaXIgPSAuLi8uLgorCitBQ0xPQ0FMID0gQEFDTE9DQUxACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAorCitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKK3RyYW5zZm9ybSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorTk9STUFMX0lOU1RBTEwgPSA6CitQUkVfSU5TVEFMTCA9IDoKK1BPU1RfSU5TVEFMTCA9IDoKK05PUk1BTF9VTklOU1RBTEwgPSA6CitQUkVfVU5JTlNUQUxMID0gOgorUE9TVF9VTklOU1RBTEwgPSA6CitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK3RhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACit0YXJnZXRfdHJpcGxldCA9IEB0YXJnZXRACitBTVRBUiA9IEBBTVRBUkAKK0FQWFNfQ1hYX09QVElPTlMgPSBAQVBYU19DWFhfT1BUSU9OU0AKK0FTID0gQEFTQAorQVdLID0gQEFXS0AKK0NDID0gQENDQAorQ1BQID0gQENQUEAKK0NYWCA9IEBDWFhACitDWFhERUJVR0RFRklORVMgPSBAQ1hYREVCVUdERUZJTkVTQAorQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACitERVBESVIgPSBAREVQRElSQAorRExMVE9PTCA9IEBETExUT09MQAorRUNITyA9IEBFQ0hPQAorRVhFRVhUID0gQEVYRUVYVEAKK0VYSVNUU19BUFhTID0gQEVYSVNUU19BUFhTQAorRVhJU1RTX0dTT0FQID0gQEVYSVNUU19HU09BUEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitMSUJUT09MID0gQExJQlRPT0xACitMSUJUT09MX0RFUFMgPSBATElCVE9PTF9ERVBTQAorTE5fUyA9IEBMTl9TQAorT0JKRFVNUCA9IEBPQkpEVU1QQAorT0JKRVhUID0gQE9CSkVYVEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1JBTkxJQiA9IEBSQU5MSUJACitTVFJJUCA9IEBTVFJJUEAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2luc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKKworQU1fQ1BQRkxBR1MgPSAtRF9SRUVOVFJBTlQgJChDWFhERUJVR0RFRklORVMpIC1EREVCVUcKKworQ0xFQU5GSUxFUyA9ICp+ICoubG9nICoueG1sIGNhbGMubnNtYXAgc29hcEMuY3BwIHNvYXBILmggc29hcFNlcnZlci5jcHAgbnMueHNkIGNhbGMud3NkbCBzb2FwQ2xpZW50LmNwcCBzb2FwU3R1Yi5oIGNsaWVudAorCitCVUlMVF9TT1VSQ0VTID0gc29hcFNlcnZlci5jcHAgc29hcEMuY3BwIGNhbGMubnNtYXAgc29hcEguaCBucy54c2QgY2FsYy53c2RsIGNhbGMubnNtYXAKKworbGliX0xUTElCUkFSSUVTID0gbGliQ2FsY3VsYXRvci5sYQorCitub2luc3RfUFJPR1JBTVMgPSBjbGllbnQKKworY2xpZW50X1NPVVJDRVMgPSBjYWxjY2xudC5jcHAgc29hcEMuY3BwIHNvYXBDbGllbnQuY3BwCisKK2xpYkNhbGN1bGF0b3JfbGFfU09VUkNFUyA9IFwKKyAgICBjYWxjdWxhdG9yLmNwcCBcCisJc29hcFNlcnZlci5jcHAgXAorCXNvYXBDLmNwcAorCisKK2xpYkNhbGN1bGF0b3JfbGFfTElCQUREID0gCisKK2NsaWVudF9MREFERCA9IC1sZ3NvYXArKworbGliQ2FsY3VsYXRvcl9sYV9MREZMQUdTID0gLXZlcnNpb24taW5mbyAwOjA6MCAtbW9kdWxlIC1sZ3NvYXArKworCitJTkNMVURFUyA9IC1JJCh0b3BfYnVpbGRkaXIpCitzdWJkaXIgPSBleGFtcGxlL2NhbGN1bGF0b3IKK21raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMKK0NPTkZJR19IRUFERVIgPSAkKHRvcF9idWlsZGRpcikvY29uZmlnLmgKK0NPTkZJR19DTEVBTl9GSUxFUyA9CitMVExJQlJBUklFUyA9ICQobGliX0xUTElCUkFSSUVTKQorCitsaWJDYWxjdWxhdG9yX2xhX0RFUEVOREVOQ0lFUyA9CithbV9saWJDYWxjdWxhdG9yX2xhX09CSkVDVFMgPSBjYWxjdWxhdG9yLmxvIHNvYXBTZXJ2ZXIubG8gc29hcEMubG8KK2xpYkNhbGN1bGF0b3JfbGFfT0JKRUNUUyA9ICQoYW1fbGliQ2FsY3VsYXRvcl9sYV9PQkpFQ1RTKQorbm9pbnN0X1BST0dSQU1TID0gY2xpZW50JChFWEVFWFQpCitQUk9HUkFNUyA9ICQobm9pbnN0X1BST0dSQU1TKQorCithbV9jbGllbnRfT0JKRUNUUyA9IGNhbGNjbG50LiQoT0JKRVhUKSBzb2FwQy4kKE9CSkVYVCkgXAorCXNvYXBDbGllbnQuJChPQkpFWFQpCitjbGllbnRfT0JKRUNUUyA9ICQoYW1fY2xpZW50X09CSkVDVFMpCitjbGllbnRfREVQRU5ERU5DSUVTID0KK2NsaWVudF9MREZMQUdTID0KKworREVGUyA9IEBERUZTQAorREVGQVVMVF9JTkNMVURFUyA9ICAtSS4gLUkkKHNyY2RpcikgLUkkKHRvcF9idWlsZGRpcikKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorTERGTEFHUyA9IEBMREZMQUdTQAorTElCUyA9IEBMSUJTQAorZGVwY29tcCA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvZGVwY29tcAorQEFNREVQX1RSVUVAREVQX0ZJTEVTID0gJChERVBESVIpL2NhbGNjbG50LlBvICQoREVQRElSKS9jYWxjdWxhdG9yLlBsbyBcCitAQU1ERVBfVFJVRUAJJChERVBESVIpL3NvYXBDLlBsbyAkKERFUERJUikvc29hcEMuUG8gXAorQEFNREVQX1RSVUVACSQoREVQRElSKS9zb2FwQ2xpZW50LlBvICQoREVQRElSKS9zb2FwU2VydmVyLlBsbworQ1hYQ09NUElMRSA9ICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgXAorCSQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpCitMVENYWENPTVBJTEUgPSAkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ1hYKSAkKERFRlMpIFwKKwkkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIFwKKwkkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKQorQ1hYTEQgPSAkKENYWCkKK0NYWExJTksgPSAkKExJQlRPT0wpIC0tbW9kZT1saW5rICQoQ1hYTEQpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpIFwKKwkkKEFNX0xERkxBR1MpICQoTERGTEFHUykgLW8gJEAKK0RJU1RfU09VUkNFUyA9ICQobGliQ2FsY3VsYXRvcl9sYV9TT1VSQ0VTKSAkKGNsaWVudF9TT1VSQ0VTKQorRElTVF9DT01NT04gPSBNYWtlZmlsZS5hbSBNYWtlZmlsZS5pbgorU09VUkNFUyA9ICQobGliQ2FsY3VsYXRvcl9sYV9TT1VSQ0VTKSAkKGNsaWVudF9TT1VSQ0VTKQorCithbGw6ICQoQlVJTFRfU09VUkNFUykKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbGwtYW0KKworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuY3BwIC5sbyAubyAub2JqCisKK21vc3RseWNsZWFuLWxpYnRvb2w6CisJLXJtIC1mICoubG8KKworY2xlYW4tbGlidG9vbDoKKwktcm0gLXJmIC5saWJzIF9saWJzCisKK2Rpc3RjbGVhbi1saWJ0b29sOgorCS1ybSAtZiBsaWJ0b29sCiskKHNyY2RpcikvTWFrZWZpbGUuaW46ICBNYWtlZmlsZS5hbSAgJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KQorCWNkICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1nbnUgIGV4YW1wbGUvY2FsY3VsYXRvci9NYWtlZmlsZQorTWFrZWZpbGU6ICAkKHNyY2RpcikvTWFrZWZpbGUuaW4gICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmIFwKKwkgIENPTkZJR19IRUFERVJTPSBDT05GSUdfTElOS1M9IFwKKwkgIENPTkZJR19GSUxFUz0kKHN1YmRpcikvJEAgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCitpbnN0YWxsLWxpYkxUTElCUkFSSUVTOiAkKGxpYl9MVExJQlJBUklFUykKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGxpYmRpcikKKwlAbGlzdD0nJChsaWJfTFRMSUJSQVJJRVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBcCisJICAgIGVjaG8gIiAkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTCkgJChJTlNUQUxMX1NUUklQX0ZMQUcpICQkcCAkKERFU1RESVIpJChsaWJkaXIpLyQkcCI7IFwKKwkgICAgJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTEwpICQoSU5TVEFMTF9TVFJJUF9GTEFHKSAkJHAgJChERVNURElSKSQobGliZGlyKS8kJHA7IFwKKwkgIGVsc2UgOjsgZmk7IFwKKwlkb25lCisKK3VuaW5zdGFsbC1saWJMVExJQlJBUklFUzoKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKGxpYl9MVExJQlJBUklFUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGVjaG8gIiAkKExJQlRPT0wpIC0tbW9kZT11bmluc3RhbGwgcm0gLWYgJChERVNURElSKSQobGliZGlyKS8kJHAiOyBcCisJICAkKExJQlRPT0wpIC0tbW9kZT11bmluc3RhbGwgcm0gLWYgJChERVNURElSKSQobGliZGlyKS8kJHA7IFwKKwlkb25lCisKK2NsZWFuLWxpYkxUTElCUkFSSUVTOgorCS10ZXN0IC16ICIkKGxpYl9MVExJQlJBUklFUykiIHx8IHJtIC1mICQobGliX0xUTElCUkFSSUVTKQorbGliQ2FsY3VsYXRvci5sYTogJChsaWJDYWxjdWxhdG9yX2xhX09CSkVDVFMpICQobGliQ2FsY3VsYXRvcl9sYV9ERVBFTkRFTkNJRVMpIAorCSQoQ1hYTElOSykgLXJwYXRoICQobGliZGlyKSAkKGxpYkNhbGN1bGF0b3JfbGFfTERGTEFHUykgJChsaWJDYWxjdWxhdG9yX2xhX09CSkVDVFMpICQobGliQ2FsY3VsYXRvcl9sYV9MSUJBREQpICQoTElCUykKKworY2xlYW4tbm9pbnN0UFJPR1JBTVM6CisJLXRlc3QgLXogIiQobm9pbnN0X1BST0dSQU1TKSIgfHwgcm0gLWYgJChub2luc3RfUFJPR1JBTVMpCitjbGllbnQkKEVYRUVYVCk6ICQoY2xpZW50X09CSkVDVFMpICQoY2xpZW50X0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIGNsaWVudCQoRVhFRVhUKQorCSQoQ1hYTElOSykgJChjbGllbnRfTERGTEFHUykgJChjbGllbnRfT0JKRUNUUykgJChjbGllbnRfTERBREQpICQoTElCUykKKworbW9zdGx5Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi4kKE9CSkVYVCkgY29yZSAqLmNvcmUKKworZGlzdGNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICoudGFiLmMKKworQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQCQoREVQRElSKS9jYWxjY2xudC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVAJChERVBESVIpL2NhbGN1bGF0b3IuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAkKERFUERJUikvc29hcEMuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAkKERFUERJUikvc29hcEMuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQCQoREVQRElSKS9zb2FwQ2xpZW50LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAkKERFUERJUikvc29hcFNlcnZlci5QbG9AYW1fX3F1b3RlQAorCitkaXN0Y2xlYW4tZGVwZW5kOgorCS1ybSAtcmYgJChERVBESVIpCisKKy5jcHAubzoKK0BBTURFUF9UUlVFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQAlkZXBmaWxlPSckKERFUERJUikvJCouUG8nIHRtcGRlcGZpbGU9JyQoREVQRElSKS8kKi5UUG8nIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQAkkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorCSQoQ1hYQ09NUElMRSkgLWMgLW8gJEAgYHRlc3QgLWYgJDwgfHwgZWNobyAnJChzcmNkaXIpLydgJDwKKworLmNwcC5vYmo6CitAQU1ERVBfVFJVRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUAJZGVwZmlsZT0nJChERVBESVIpLyQqLlBvJyB0bXBkZXBmaWxlPSckKERFUERJUikvJCouVFBvJyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUAJJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKKwkkKENYWENPTVBJTEUpIC1jIC1vICRAIGBjeWdwYXRoIC13ICQ8YAorCisuY3BwLmxvOgorQEFNREVQX1RSVUVACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQAlkZXBmaWxlPSckKERFUERJUikvJCouUGxvJyB0bXBkZXBmaWxlPSckKERFUERJUikvJCouVFBsbycgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVACSQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACisJJChMVENYWENPTVBJTEUpIC1jIC1vICRAIGB0ZXN0IC1mICQ8IHx8IGVjaG8gJyQoc3JjZGlyKS8nYCQ8CitDWFhERVBNT0RFID0gQENYWERFUE1PREVACit1bmluc3RhbGwtaW5mby1hbToKKwordGFnczogVEFHUworCitJRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAorCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAorCW1raWQgLWZJRCAkJHVuaXF1ZSAkKExJU1ApCisKK1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJdGFncz07IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJdGVzdCAteiAiJChFVEFHU19BUkdTKSQkdW5pcXVlJChMSVNQKSQkdGFncyIgXAorCSAgfHwgZXRhZ3MgJChFVEFHU19BUkdTKSAkJHRhZ3MgICQkdW5pcXVlICQoTElTUCkKKworR1RBR1M6CisJaGVyZT1gQ0RQQVRIPTogJiYgY2QgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAorCSAgJiYgY2QgJCh0b3Bfc3JjZGlyKSBcCisJICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICQkaGVyZQorCitkaXN0Y2xlYW4tdGFnczoKKwktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEgKKworRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKKwordG9wX2Rpc3RkaXIgPSAuLi8uLgorZGlzdGRpciA9ICQodG9wX2Rpc3RkaXIpLyQoUEFDS0FHRSktJChWRVJTSU9OKQorCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwlAZm9yIGZpbGUgaW4gJChESVNURklMRVMpOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBkaXI9YGVjaG8gIiQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICBpZiB0ZXN0ICIkJGRpciIgIT0gIiQkZmlsZSIgJiYgdGVzdCAiJCRkaXIiICE9ICIuIjsgdGhlbiBcCisJICAgICQobWtpbnN0YWxsZGlycykgIiQoZGlzdGRpcikvJCRkaXIiOyBcCisJICBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgY3AgLXBSICQkZC8kJGZpbGUgJChkaXN0ZGlyKSBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKK2NoZWNrLWFtOiBhbGwtYW0KK2NoZWNrOiBjaGVjay1hbQorYWxsLWFtOiBNYWtlZmlsZSAkKExUTElCUkFSSUVTKSAkKFBST0dSQU1TKQorCitpbnN0YWxsZGlyczoKKwkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGxpYmRpcikKKworaW5zdGFsbDogaW5zdGFsbC1hbQoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCit1bmluc3RhbGw6IHVuaW5zdGFsbC1hbQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQorCitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgYHRlc3QgLXogJyQoU1RSSVApJyB8fCBcCisJICAgIGVjaG8gIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciYCBpbnN0YWxsCittb3N0bHljbGVhbi1nZW5lcmljOgorCitjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENMRUFORklMRVMpIiB8fCBybSAtZiAkKENMRUFORklMRVMpCisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS1ybSAtZiBNYWtlZmlsZSAkKENPTkZJR19DTEVBTl9GSUxFUykgc3RhbXAtaCBzdGFtcC1oWzAtOV0qCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorCS10ZXN0IC16ICIkKEJVSUxUX1NPVVJDRVMpIiB8fCBybSAtZiAkKEJVSUxUX1NPVVJDRVMpCitjbGVhbjogY2xlYW4tYW0KKworY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGliTFRMSUJSQVJJRVMgY2xlYW4tbGlidG9vbCBcCisJY2xlYW4tbm9pbnN0UFJPR1JBTVMgbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KKworZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZGVwZW5kIFwKKwlkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1hbQorCitkdmktYW06CisKK2luZm86IGluZm8tYW0KKworaW5mby1hbToKKworaW5zdGFsbC1kYXRhLWFtOgorCitpbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtbGliTFRMSUJSQVJJRVMKKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KKworaW5zdGFsbC1tYW46CisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCittYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCisKK21vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQorCittb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIFwKKwltb3N0bHljbGVhbi1saWJ0b29sCisKK3VuaW5zdGFsbC1hbTogdW5pbnN0YWxsLWluZm8tYW0gdW5pbnN0YWxsLWxpYkxUTElCUkFSSUVTCisKKy5QSE9OWTogR1RBR1MgYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1nZW5lcmljIFwKKwljbGVhbi1saWJMVExJQlJBUklFUyBjbGVhbi1saWJ0b29sIGNsZWFuLW5vaW5zdFBST0dSQU1TIFwKKwlkaXN0Y2xlYW4gZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWRlcGVuZCBkaXN0Y2xlYW4tZ2VuZXJpYyBcCisJZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLXRhZ3MgZGlzdGRpciBkdmkgZHZpLWFtIGluZm8gXAorCWluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIGluc3RhbGwtZGF0YSBpbnN0YWxsLWRhdGEtYW0gXAorCWluc3RhbGwtZXhlYyBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBcCisJaW5zdGFsbC1saWJMVExJQlJBUklFUyBpbnN0YWxsLW1hbiBpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBcCisJaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIG1haW50YWluZXItY2xlYW4gXAorCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBtb3N0bHljbGVhbi1jb21waWxlIFwKKwltb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wgdGFncyB1bmluc3RhbGwgXAorCXVuaW5zdGFsbC1hbSB1bmluc3RhbGwtaW5mby1hbSB1bmluc3RhbGwtbGliTFRMSUJSQVJJRVMKKworCitjYWxjdWxhdG9yLmNwcDogY2FsYy5uc21hcCBzb2FwSC5oCisKK3NvYXBDLmNwcCBzb2FwU2VydmVyLmNwcCBucy5uc21hcCBucy54c2QgY2FsYy53c2RsIHNvYXBILmggY2FsYy5uc21hcDogY2FsY3VsYXRvci5oCisJc29hcGNwcDIgY2FsY3VsYXRvci5oCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvZXhhbXBsZS9jYWxjdWxhdG9yL2NhbGNjbG50LmNwcCBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9leGFtcGxlL2NhbGN1bGF0b3IvY2FsY2NsbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYTgwMGUKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvZXhhbXBsZS9jYWxjdWxhdG9yL2NhbGNjbG50LmNwcApAQCAtMCwwICsxLDI1IEBACisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAic29hcEguaCIKKyNpbmNsdWRlICJjYWxjLm5zbWFwIgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7IAorICBzdHJ1Y3Qgc29hcCAqc29hcCA9IHNvYXBfbmV3KCk7CisgIGludCBhLCBiLCByZXN1bHQ7CisgIGlmKGFyZ2MgPiAzICkKKyAgeyBhID0gYXRvaShhcmd2WzFdKTsKKyAgICBiID0gYXRvaShhcmd2WzNdKTsKKyAgfQorICBlbHNlCisgICAgICByZXR1cm4gLTE7CisKKyAgc3dpdGNoICgqYXJndlsyXSkgeworICBjYXNlICcrJzoKKyAgICBpZihzb2FwX2NhbGxfbnNfX2FkZChzb2FwLCAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3NvYXAiLCAiY2FsY3VsYXRlIiwgYSwgYiwgJnJlc3VsdCkgPT0gMCkKKyAgICAgIHByaW50ZigiJWQrJWQ9JWRcbiIsIGEsIGIsIHJlc3VsdCk7CisgICAgZWxzZQorICAgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRvdXQpOworICAgIGJyZWFrOworIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvZXhhbXBsZS9jYWxjdWxhdG9yL2NhbGN1bGF0b3IuY3BwIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL2V4YW1wbGUvY2FsY3VsYXRvci9jYWxjdWxhdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzE4ZWY4Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL2V4YW1wbGUvY2FsY3VsYXRvci9jYWxjdWxhdG9yLmNwcApAQCAtMCwwICsxLDU2IEBACisvKiogRGVtbyBvZiBhIGNhbGN1bGF0b3IgZ3NvYXAgc2VydmljZSBpbXBsZW1lbnRlZCBhcyBhIHNoYXJlZCBsaWJyYXJ5IHRoYXQgY2FuIGJlIGxvYWRlZCBmcm9tIEFwYWNoZSBIdHRwIFNlcnZlci4KKyAqIEBhdXRob3IgQ2hyaXN0aWFuIEFiZXJnZXIgKGh0dHA6Ly93d3cuYWJlcmdlci5hdCkKKyAqIEBmaWxlIGNhbGN1bGF0b3IuY3BwCisgKi8KKworI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAic29hcEguaCIKKyNpbmNsdWRlICJhcGFjaGVfZ3NvYXAuaCIKKyNpbmNsdWRlICJjYWxjLm5zbWFwIiAvLyBsaW5rIHRoZSBuYW1lc3BhY2UKKworSU1QTEVNRU5UX0dTT0FQX1NFUlZFUigpIC8vLzwgdGhpcyBtYWNybyBkZWZpbmVzIHRoZSBuZWNlc3NhcnkgZXhwb3J0cyBmcm9tIHRoZSBkbGwuCisKK2ludCBuc19fYWRkKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgYSwgaW50IGIsIGludCAqcmVzdWx0KSB7CisJKnJlc3VsdCA9IGEgKyBiOworCXJldHVybiBTT0FQX09LOworfQoraW50IG5zX19zdWJ0cmFjdChzdHJ1Y3Qgc29hcCAqLCBpbnQgYSwgaW50IGIsIGludCAqcmVzdWx0KSB7CisJKnJlc3VsdCA9IGEgLSBiOworCXJldHVybiBTT0FQX09LOworfQoraW50IG5zX19tdXRpcGx5KHN0cnVjdCBzb2FwICosIGludCBhLCBpbnQgYiwgaW50ICpyZXN1bHQpIHsKKwkqcmVzdWx0ID0gYSAqIGI7CisJcmV0dXJuIFNPQVBfT0s7Cit9CitpbnQgbnNfX2RpdmlkZShzdHJ1Y3Qgc29hcCAqIHNvYXAsIGludCBhLCBpbnQgYiwgaW50ICpyZXN1bHQpIHsKKwlpZiAoZmFicyhhKSA+IERCTF9FUFNJTE9OKSB7CisJCSpyZXN1bHQgPSBhIC8gYjsKKwl9IGVsc2UgeworCSAgcmV0dXJuIHNvYXBfcmVjZWl2ZXJfZmF1bHQoc29hcCwgImRpdmlkZSBieSB6ZXJvIGluIG5zX19kaXZpZGUiLCAibWFrZSBzdXJlIGRpdmlzb3IgaXMgPiAwIik7CisJfQorCXJldHVybiBTT0FQX09LOworfQorLyoKK2ludCBtYWluKHZvaWQpIHsKKwlzdHJ1Y3Qgc29hcCBzb2FwOworCXNvYXBfaW5pdCgmc29hcCk7CisJaW50IG1hc3RlciA9IHNvYXBfYmluZCgmc29hcCwgImxvY2FsaG9zdCIsIDgwODAsIDEwMCk7CisJaWYgKG1hc3RlciA8IDApIHsKKwkJc29hcF9wcmludF9mYXVsdCgmc29hcCwgc3RkZXJyKTsKKwkJZXhpdCgtMSk7CisJfQorCWZwcmludGYoc3RkZXJyLCAiU29ja2V0IGNvbm5lY3Rpb24gc3VjY2Vzc1xuIik7CisJd2hpbGUoMSkgeworCQlpbnQgY2xpZW50ID0gc29hcF9hY2NlcHQoJnNvYXApOworCQlpZiAoY2xpZW50IDwgMCkgeworCQkJc29hcF9wcmludF9mYXVsdCgmc29hcCwgc3RkZXJyKTsKKwkJCWV4aXQoLTIpOworCQl9CisJCWZwcmludGYoc3RkZXJyLCAiQ2xpZW50IGNvbm5lY3RlZFxuIik7CisJCXNvYXBfc2VydmUoJnNvYXApOworCQlzb2FwX2VuZCgmc29hcCk7CisJfQorfQorKi8KKwpkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL2V4YW1wbGUvY2FsY3VsYXRvci9jYWxjdWxhdG9yLmggYi9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvZXhhbXBsZS9jYWxjdWxhdG9yL2NhbGN1bGF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjU2NmZhCi0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL2V4YW1wbGUvY2FsY3VsYXRvci9jYWxjdWxhdG9yLmgKQEAgLTAsMCArMSw3IEBACisvL2dzb2FwIG5zIHNlcnZpY2UgbmFtZToJY2FsYworLy9nc29hcCBucyBzZXJ2aWNlIGxvY2F0aW9uOglodHRwOi8vbG9jYWxob3N0L2NhbGMKKy8vZ3NvYXAgbnMgc2VydmljZSBuYW1lc3BhY2U6CWNhbGMKKy8vZ3NvYXAgbnMgc2NoZW1hIG5hbWVzcGFjZToJY2FsYworLy9nc2FwIG5zIHNlcnZpY2UgZXhlY3V0YWJsZTogZ3NvYXAKK2ludCBuc19fYWRkKGludCBhLCBpbnQgYiwgaW50ICpyZXN1bHQpOworCmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvZXhhbXBsZS9jYWxjdWxhdG9yL3NvYXBjYWxjUHJveHkuaCBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9leGFtcGxlL2NhbGN1bGF0b3Ivc29hcGNhbGNQcm94eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0N2I5NWUKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvZXhhbXBsZS9jYWxjdWxhdG9yL3NvYXBjYWxjUHJveHkuaApAQCAtMCwwICsxLDE4IEBACisvKiBzb2FwY2FsY1Byb3h5LmgKKyAgIEdlbmVyYXRlZCBieSBnU09BUCAyLjIuMWEgZnJvbSBjYWxjdWxhdG9yLmgKKyAgIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIFJvYmVydCBBLiB2YW4gRW5nZWxlbgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyovCisKKyNpZm5kZWYgY2FsY19ICisjZGVmaW5lIGNhbGNfSAorI2luY2x1ZGUgInNvYXBILmgiCitjbGFzcyBjYWxjCit7ICAgcHVibGljOgorCXN0cnVjdCBzb2FwICpzb2FwOworCWNvbnN0IGNoYXIgKmVuZHBvaW50OworCWNhbGMoKSB7IHNvYXAgPSBzb2FwX25ldygpOyBlbmRwb2ludCA9ICJodHRwOi8vbG9jYWxob3N0L2NhbGMiOyB9OworCX5jYWxjKCkgeyBpZiAoc29hcCkgeyBzb2FwX2Rlc3Ryb3koc29hcCk7IHNvYXBfZW5kKHNvYXApOyBzb2FwX2RvbmUoc29hcCk7IGZyZWUoKHZvaWQqKXNvYXApOyB9IH07CisJaW50IGFkZChpbnQgYSwgaW50IGIsIGludCAqcmVzdWx0KSB7IHJldHVybiBzb2FwID8gc29hcF9jYWxsX25zX19hZGQoc29hcCwgZW5kcG9pbnQsIE5VTEwsIGEsIGIsIHJlc3VsdCkgOiBTT0FQX0VPTTsgfTsKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9leGFtcGxlL2NhbGN1bGF0b3IvdGVzdGl0IGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL2V4YW1wbGUvY2FsY3VsYXRvci90ZXN0aXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNkZDczOQotLS0gL2Rldi9udWxsCisrKyBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9leGFtcGxlL2NhbGN1bGF0b3IvdGVzdGl0CkBAIC0wLDAgKzEsMTAgQEAKKyMhIC9iaW4vYmFzaAorCitybSAtZiBSRUNWLmxvZworLi9jbGllbnQgMSArIDIKKworaWYgWyAtZiBSRUNWLmxvZyBdIDsgdGhlbiBcCisJY2F0IFJFQ1YubG9nOyBcCitlbHNlIFwKKwllY2hvICJXaGVuIHlvdSByZWNvbXBpbGUgYm90aCBnc29hcCBhbmQgdGhpcyBwcm9qZWN0IHdpdGggY29uZmlndXJlIC0tZW5hYmxlLWRlYnVnLCB0aGVuIGEgcHJvdG9jb2wgbG9nIGZpbGUgd2lsbCBiZSBnZW5lcmF0ZWQuIFVzZSB0aGF0IGluIGNhc2Ugb2YgcHJvYmxlbXMgYmVmb3JlIHlvdSB3cml0ZSBtYWlsIHRvIGFiZXJnZXIuIgorZmkKZGlmZiAtLWdpdCBhL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9pbnN0YWxsLXNoIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL2luc3RhbGwtc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlkZTIzOAotLS0gL2Rldi9udWxsCisrKyBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9pbnN0YWxsLXNoCkBAIC0wLDAgKzEsMjUxIEBACisjIS9iaW4vc2gKKyMKKyMgaW5zdGFsbCAtIGluc3RhbGwgYSBwcm9ncmFtLCBzY3JpcHQsIG9yIGRhdGFmaWxlCisjIFRoaXMgY29tZXMgZnJvbSBYMTFSNSAobWl0L3V0aWwvc2NyaXB0cy9pbnN0YWxsLnNoKS4KKyMKKyMgQ29weXJpZ2h0IDE5OTEgYnkgdGhlIE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyMKKyMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisjIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CisjIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorIyBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCisjIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIE0uSS5ULiBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvcgorIyBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCisjIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIE0uSS5ULiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlCisjIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIgorIyB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyMKKyMgQ2FsbGluZyB0aGlzIHNjcmlwdCBpbnN0YWxsLXNoIGlzIHByZWZlcnJlZCBvdmVyIGluc3RhbGwuc2gsIHRvIHByZXZlbnQKKyMgYG1ha2UnIGltcGxpY2l0IHJ1bGVzIGZyb20gY3JlYXRpbmcgYSBmaWxlIGNhbGxlZCBpbnN0YWxsIGZyb20gaXQKKyMgd2hlbiB0aGVyZSBpcyBubyBNYWtlZmlsZS4KKyMKKyMgVGhpcyBzY3JpcHQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBCU0QgaW5zdGFsbCBzY3JpcHQsIGJ1dCB3YXMgd3JpdHRlbgorIyBmcm9tIHNjcmF0Y2guICBJdCBjYW4gb25seSBpbnN0YWxsIG9uZSBmaWxlIGF0IGEgdGltZSwgYSByZXN0cmljdGlvbgorIyBzaGFyZWQgd2l0aCBtYW55IE9TJ3MgaW5zdGFsbCBwcm9ncmFtcy4KKworCisjIHNldCBET0lUUFJPRyB0byBlY2hvIHRvIHRlc3QgdGhpcyBzY3JpcHQKKworIyBEb24ndCB1c2UgOi0gc2luY2UgNC4zQlNEIGFuZCBlYXJsaWVyIHNoZWxscyBkb24ndCBsaWtlIGl0LgorZG9pdD0iJHtET0lUUFJPRy19IgorCisKKyMgcHV0IGluIGFic29sdXRlIHBhdGhzIGlmIHlvdSBkb24ndCBoYXZlIHRoZW0gaW4geW91ciBwYXRoOyBvciB1c2UgZW52LiB2YXJzLgorCittdnByb2c9IiR7TVZQUk9HLW12fSIKK2NwcHJvZz0iJHtDUFBST0ctY3B9IgorY2htb2Rwcm9nPSIke0NITU9EUFJPRy1jaG1vZH0iCitjaG93bnByb2c9IiR7Q0hPV05QUk9HLWNob3dufSIKK2NoZ3JwcHJvZz0iJHtDSEdSUFBST0ctY2hncnB9Igorc3RyaXBwcm9nPSIke1NUUklQUFJPRy1zdHJpcH0iCitybXByb2c9IiR7Uk1QUk9HLXJtfSIKK21rZGlycHJvZz0iJHtNS0RJUlBST0ctbWtkaXJ9IgorCit0cmFuc2Zvcm1iYXNlbmFtZT0iIgordHJhbnNmb3JtX2FyZz0iIgoraW5zdGNtZD0iJG12cHJvZyIKK2NobW9kY21kPSIkY2htb2Rwcm9nIDA3NTUiCitjaG93bmNtZD0iIgorY2hncnBjbWQ9IiIKK3N0cmlwY21kPSIiCitybWNtZD0iJHJtcHJvZyAtZiIKK212Y21kPSIkbXZwcm9nIgorc3JjPSIiCitkc3Q9IiIKK2Rpcl9hcmc9IiIKKword2hpbGUgWyB4IiQxIiAhPSB4IF07IGRvCisgICAgY2FzZSAkMSBpbgorCS1jKSBpbnN0Y21kPSIkY3Bwcm9nIgorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktZCkgZGlyX2FyZz10cnVlCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1tKSBjaG1vZGNtZD0iJGNobW9kcHJvZyAkMiIKKwkgICAgc2hpZnQKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLW8pIGNob3duY21kPSIkY2hvd25wcm9nICQyIgorCSAgICBzaGlmdAorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktZykgY2hncnBjbWQ9IiRjaGdycHByb2cgJDIiCisJICAgIHNoaWZ0CisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1zKSBzdHJpcGNtZD0iJHN0cmlwcHJvZyIKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLXQ9KikgdHJhbnNmb3JtYXJnPWBlY2hvICQxIHwgc2VkICdzLy10PS8vJ2AKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLWI9KikgdHJhbnNmb3JtYmFzZW5hbWU9YGVjaG8gJDEgfCBzZWQgJ3MvLWI9Ly8nYAorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwkqKSAgaWYgWyB4IiRzcmMiID0geCBdCisJICAgIHRoZW4KKwkJc3JjPSQxCisJICAgIGVsc2UKKwkJIyB0aGlzIGNvbG9uIGlzIHRvIHdvcmsgYXJvdW5kIGEgMzg2QlNEIC9iaW4vc2ggYnVnCisJCToKKwkJZHN0PSQxCisJICAgIGZpCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKyAgICBlc2FjCitkb25lCisKK2lmIFsgeCIkc3JjIiA9IHggXQordGhlbgorCWVjaG8gImluc3RhbGw6CW5vIGlucHV0IGZpbGUgc3BlY2lmaWVkIgorCWV4aXQgMQorZWxzZQorCXRydWUKK2ZpCisKK2lmIFsgeCIkZGlyX2FyZyIgIT0geCBdOyB0aGVuCisJZHN0PSRzcmMKKwlzcmM9IiIKKwkKKwlpZiBbIC1kICRkc3QgXTsgdGhlbgorCQlpbnN0Y21kPToKKwkJY2htb2RjbWQ9IiIKKwllbHNlCisJCWluc3RjbWQ9bWtkaXIKKwlmaQorZWxzZQorCisjIFdhaXRpbmcgZm9yIHRoaXMgdG8gYmUgZGV0ZWN0ZWQgYnkgdGhlICIkaW5zdGNtZCAkc3JjICRkc3R0bXAiIGNvbW1hbmQKKyMgbWlnaHQgY2F1c2UgZGlyZWN0b3JpZXMgdG8gYmUgY3JlYXRlZCwgd2hpY2ggd291bGQgYmUgZXNwZWNpYWxseSBiYWQgCisjIGlmICRzcmMgKGFuZCB0aHVzICRkc3R0bXApIGNvbnRhaW5zICcqJy4KKworCWlmIFsgLWYgJHNyYyAtbyAtZCAkc3JjIF0KKwl0aGVuCisJCXRydWUKKwllbHNlCisJCWVjaG8gImluc3RhbGw6ICAkc3JjIGRvZXMgbm90IGV4aXN0IgorCQlleGl0IDEKKwlmaQorCQorCWlmIFsgeCIkZHN0IiA9IHggXQorCXRoZW4KKwkJZWNobyAiaW5zdGFsbDoJbm8gZGVzdGluYXRpb24gc3BlY2lmaWVkIgorCQlleGl0IDEKKwllbHNlCisJCXRydWUKKwlmaQorCisjIElmIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LCBhcHBlbmQgdGhlIGlucHV0IGZpbGVuYW1lOyBpZiB5b3VyIHN5c3RlbQorIyBkb2VzIG5vdCBsaWtlIGRvdWJsZSBzbGFzaGVzIGluIGZpbGVuYW1lcywgeW91IG1heSBuZWVkIHRvIGFkZCBzb21lIGxvZ2ljCisKKwlpZiBbIC1kICRkc3QgXQorCXRoZW4KKwkJZHN0PSIkZHN0Ii9gYmFzZW5hbWUgJHNyY2AKKwllbHNlCisJCXRydWUKKwlmaQorZmkKKworIyMgdGhpcyBzZWQgY29tbWFuZCBlbXVsYXRlcyB0aGUgZGlybmFtZSBjb21tYW5kCitkc3RkaXI9YGVjaG8gJGRzdCB8IHNlZCAtZSAncyxbXi9dKiQsLDtzLC8kLCw7cyxeJCwuLCdgCisKKyMgTWFrZSBzdXJlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBleGlzdHMuCisjICB0aGlzIHBhcnQgaXMgdGFrZW4gZnJvbSBOb2FoIEZyaWVkbWFuJ3MgbWtpbnN0YWxsZGlycyBzY3JpcHQKKworIyBTa2lwIGxvdHMgb2Ygc3RhdCBjYWxscyBpbiB0aGUgdXN1YWwgY2FzZS4KK2lmIFsgISAtZCAiJGRzdGRpciIgXTsgdGhlbgorZGVmYXVsdElGUz0nCQorJworSUZTPSIke0lGUy0ke2RlZmF1bHRJRlN9fSIKKworb0lGUz0iJHtJRlN9IgorIyBTb21lIHNoJ3MgY2FuJ3QgaGFuZGxlIElGUz0vIGZvciBzb21lIHJlYXNvbi4KK0lGUz0nJScKK3NldCAtIGBlY2hvICR7ZHN0ZGlyfSB8IHNlZCAtZSAnc0AvQCVAZycgLWUgJ3NAXiVAL0AnYAorSUZTPSIke29JRlN9IgorCitwYXRoY29tcD0nJworCit3aGlsZSBbICQjIC1uZSAwIF0gOyBkbworCXBhdGhjb21wPSIke3BhdGhjb21wfSR7MX0iCisJc2hpZnQKKworCWlmIFsgISAtZCAiJHtwYXRoY29tcH0iIF0gOworICAgICAgICB0aGVuCisJCSRta2RpcnByb2cgIiR7cGF0aGNvbXB9IgorCWVsc2UKKwkJdHJ1ZQorCWZpCisKKwlwYXRoY29tcD0iJHtwYXRoY29tcH0vIgorZG9uZQorZmkKKworaWYgWyB4IiRkaXJfYXJnIiAhPSB4IF0KK3RoZW4KKwkkZG9pdCAkaW5zdGNtZCAkZHN0ICYmCisKKwlpZiBbIHgiJGNob3duY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNob3duY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpICYmCisJaWYgWyB4IiRjaGdycGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaGdycGNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaSAmJgorCWlmIFsgeCIkc3RyaXBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkc3RyaXBjbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkgJiYKKwlpZiBbIHgiJGNobW9kY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNobW9kY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpCitlbHNlCisKKyMgSWYgd2UncmUgZ29pbmcgdG8gcmVuYW1lIHRoZSBmaW5hbCBleGVjdXRhYmxlLCBkZXRlcm1pbmUgdGhlIG5hbWUgbm93LgorCisJaWYgWyB4IiR0cmFuc2Zvcm1hcmciID0geCBdIAorCXRoZW4KKwkJZHN0ZmlsZT1gYmFzZW5hbWUgJGRzdGAKKwllbHNlCisJCWRzdGZpbGU9YGJhc2VuYW1lICRkc3QgJHRyYW5zZm9ybWJhc2VuYW1lIHwgCisJCQlzZWQgJHRyYW5zZm9ybWFyZ2AkdHJhbnNmb3JtYmFzZW5hbWUKKwlmaQorCisjIGRvbid0IGFsbG93IHRoZSBzZWQgY29tbWFuZCB0byBjb21wbGV0ZWx5IGVsaW1pbmF0ZSB0aGUgZmlsZW5hbWUKKworCWlmIFsgeCIkZHN0ZmlsZSIgPSB4IF0gCisJdGhlbgorCQlkc3RmaWxlPWBiYXNlbmFtZSAkZHN0YAorCWVsc2UKKwkJdHJ1ZQorCWZpCisKKyMgTWFrZSBhIHRlbXAgZmlsZSBuYW1lIGluIHRoZSBwcm9wZXIgZGlyZWN0b3J5LgorCisJZHN0dG1wPSRkc3RkaXIvI2luc3QuJCQjCisKKyMgTW92ZSBvciBjb3B5IHRoZSBmaWxlIG5hbWUgdG8gdGhlIHRlbXAgbmFtZQorCisJJGRvaXQgJGluc3RjbWQgJHNyYyAkZHN0dG1wICYmCisKKwl0cmFwICJybSAtZiAke2RzdHRtcH0iIDAgJiYKKworIyBhbmQgc2V0IGFueSBvcHRpb25zOyBkbyBjaG1vZCBsYXN0IHRvIHByZXNlcnZlIHNldHVpZCBiaXRzCisKKyMgSWYgYW55IG9mIHRoZXNlIGZhaWwsIHdlIGFib3J0IHRoZSB3aG9sZSB0aGluZy4gIElmIHdlIHdhbnQgdG8KKyMgaWdub3JlIGVycm9ycyBmcm9tIGFueSBvZiB0aGVzZSwganVzdCBtYWtlIHN1cmUgbm90IHRvIGlnbm9yZQorIyBlcnJvcnMgZnJvbSB0aGUgYWJvdmUgIiRkb2l0ICRpbnN0Y21kICRzcmMgJGRzdHRtcCIgY29tbWFuZC4KKworCWlmIFsgeCIkY2hvd25jbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hvd25jbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCisJaWYgWyB4IiRjaGdycGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaGdycGNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKKwlpZiBbIHgiJHN0cmlwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJHN0cmlwY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgorCWlmIFsgeCIkY2htb2RjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2htb2RjbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCisKKyMgTm93IHJlbmFtZSB0aGUgZmlsZSB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbi4KKworCSRkb2l0ICRybWNtZCAtZiAkZHN0ZGlyLyRkc3RmaWxlICYmCisJJGRvaXQgJG12Y21kICRkc3R0bXAgJGRzdGRpci8kZHN0ZmlsZSAKKworZmkgJiYKKworCitleGl0IDAKZGlmZiAtLWdpdCBhL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9saWJ0b29sIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL2xpYnRvb2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdhMWFmNwotLS0gL2Rldi9udWxsCisrKyBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9saWJ0b29sCkBAIC0wLDAgKzEsNTI4NSBAQAorIyEgL2Jpbi9zaAorCisjIGxpYnRvb2wgLSBQcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgIChHTlUgbW9kX2dzb2FwIDAuMC41KQorIyBOT1RFOiBDaGFuZ2VzIG1hZGUgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdDogbG9vayBhdCBsdG1haW4uc2guCisjCisjIENvcHlyaWdodCAoQykgMTk5Ni0yMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBPcmlnaW5hbGx5IGJ5IEdvcmRvbiBNYXR6aWdrZWl0IDxnb3JkQGdudS5haS5taXQuZWR1PiwgMTk5NgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKKyMgU2VkIHRoYXQgaGVscHMgdXMgYXZvaWQgYWNjaWRlbnRhbGx5IHRyaWdnZXJpbmcgZWNobygxKSBvcHRpb25zIGxpa2UgLW4uCitYc2VkPSJzZWQgLWUgcy9eWC8vIgorCisjIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAorIyBpZiBDRFBBVEggaXMgc2V0LgoraWYgdGVzdCAiWCR7Q0RQQVRIK3NldH0iID0gWHNldDsgdGhlbiBDRFBBVEg9OjsgZXhwb3J0IENEUEFUSDsgZmkKKworIyAjIyMgQkVHSU4gTElCVE9PTCBDT05GSUcKKworIyBMaWJ0b29sIHdhcyBjb25maWd1cmVkIG9uIGhvc3QgcmVkdXg6CisKKyMgU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0cy4KK1NIRUxMPSIvYmluL3NoIgorCisjIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuCitidWlsZF9saWJ0b29sX2xpYnM9eWVzCisKKyMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4KK2J1aWxkX29sZF9saWJzPXllcworCisjIFdoZXRoZXIgb3Igbm90IHRvIGFkZCAtbGMgZm9yIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCitidWlsZF9saWJ0b29sX25lZWRfbGM9bm8KKworIyBXaGV0aGVyIG9yIG5vdCB0byBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24uCitmYXN0X2luc3RhbGw9eWVzCisKKyMgVGhlIGhvc3Qgc3lzdGVtLgoraG9zdF9hbGlhcz1pNjg2LXN1c2UtbGludXgKK2hvc3Q9aTY4Ni1zdXNlLWxpbnV4CisKKyMgQW4gZWNobyBwcm9ncmFtIHRoYXQgZG9lcyBub3QgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgorZWNobz0iZWNobyIKKworIyBUaGUgYXJjaGl2ZXIuCitBUj0iYXIiCitBUl9GTEFHUz0iY3J1IgorCisjIFRoZSBkZWZhdWx0IEMgY29tcGlsZXIuCitDQz0iZ2NjIgorCisjIElzIHRoZSBjb21waWxlciB0aGUgR05VIEMgY29tcGlsZXI/Cit3aXRoX2djYz15ZXMKKworIyBUaGUgbGlua2VyIHVzZWQgdG8gYnVpbGQgbGlicmFyaWVzLgorTEQ9Ii91c3IvaTQ4Ni1zdXNlLWxpbnV4L2Jpbi9sZCIKKworIyBXaGV0aGVyIHdlIG5lZWQgaGFyZCBvciBzb2Z0IGxpbmtzLgorTE5fUz0ibG4gLXMiCisKKyMgQSBCU0QtY29tcGF0aWJsZSBubSBwcm9ncmFtLgorTk09Ii91c3IvYmluL25tIC1CIgorCisjIEEgc3ltYm9sIHN0cmlwcGluZyBwcm9ncmFtCitTVFJJUD1zdHJpcAorCisjIFVzZWQgdG8gZXhhbWluZSBsaWJyYXJpZXMgd2hlbiBmaWxlX21hZ2ljX2NtZCBiZWdpbnMgImZpbGUiCitNQUdJQ19DTUQ9ZmlsZQorCisjIFVzZWQgb24gY3lnd2luOiBETEwgY3JlYXRpb24gcHJvZ3JhbS4KK0RMTFRPT0w9ImRsbHRvb2wiCisKKyMgVXNlZCBvbiBjeWd3aW46IG9iamVjdCBkdW1wZXIuCitPQkpEVU1QPSJvYmpkdW1wIgorCisjIFVzZWQgb24gY3lnd2luOiBhc3NlbWJsZXIuCitBUz0iYXMiCisKKyMgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRlbXBvcmFyeSBsaWJ0b29sIGZpbGVzLgorb2JqZGlyPS5saWJzCisKKyMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KK3JlbG9hZF9mbGFnPSIgLXIiCityZWxvYWRfY21kcz0iXCRMRFwkcmVsb2FkX2ZsYWcgLW8gXCRvdXRwdXRcJHJlbG9hZF9vYmpzIgorCisjIEhvdyB0byBwYXNzIGEgbGlua2VyIGZsYWcgdGhyb3VnaCB0aGUgY29tcGlsZXIuCit3bD0iLVdsLCIKKworIyBPYmplY3QgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICJvIikuCitvYmpleHQ9Im8iCisKKyMgT2xkIGFyY2hpdmUgc3VmZml4IChub3JtYWxseSAiYSIpLgorbGliZXh0PSJhIgorCisjIEV4ZWN1dGFibGUgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICIiKS4KK2V4ZWV4dD0iIgorCisjIEFkZGl0aW9uYWwgY29tcGlsZXIgZmxhZ3MgZm9yIGJ1aWxkaW5nIGxpYnJhcnkgb2JqZWN0cy4KK3BpY19mbGFnPSIgLWZQSUMiCitwaWNfbW9kZT1kZWZhdWx0CisKKyMgRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zPworY29tcGlsZXJfY19vPSJ5ZXMiCisKKyMgQ2FuIHdlIHdyaXRlIGRpcmVjdGx5IHRvIGEgLmxvID8KK2NvbXBpbGVyX29fbG89InllcyIKKworIyBNdXN0IHdlIGxvY2sgZmlsZXMgd2hlbiBkb2luZyBjb21waWxhdGlvbiA/CituZWVkX2xvY2tzPSJubyIKKworIyBEbyB3ZSBuZWVkIHRoZSBsaWIgcHJlZml4IGZvciBtb2R1bGVzPworbmVlZF9saWJfcHJlZml4PW5vCisKKyMgRG8gd2UgbmVlZCBhIHZlcnNpb24gZm9yIGxpYnJhcmllcz8KK25lZWRfdmVyc2lvbj1ubworCisjIFdoZXRoZXIgZGxvcGVuIGlzIHN1cHBvcnRlZC4KK2Rsb3Blbl9zdXBwb3J0PXllcworCisjIFdoZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KK2Rsb3Blbl9zZWxmPXllcworCisjIFdoZXRoZXIgZGxvcGVuIG9mIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KK2Rsb3Blbl9zZWxmX3N0YXRpYz1ubworCisjIENvbXBpbGVyIGZsYWcgdG8gcHJldmVudCBkeW5hbWljIGxpbmtpbmcuCitsaW5rX3N0YXRpY19mbGFnPSItc3RhdGljIgorCisjIENvbXBpbGVyIGZsYWcgdG8gdHVybiBvZmYgYnVpbHRpbiBmdW5jdGlvbnMuCitub19idWlsdGluX2ZsYWc9IiAtZm5vLWJ1aWx0aW4gLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIKKworIyBDb21waWxlciBmbGFnIHRvIGFsbG93IHJlZmxleGl2ZSBkbG9wZW5zLgorZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPSJcJHt3bH0tLWV4cG9ydC1keW5hbWljIgorCisjIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlcy4KK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSJcJHt3bH0tLXdob2xlLWFyY2hpdmVcJGNvbnZlbmllbmNlIFwke3dsfS0tbm8td2hvbGUtYXJjaGl2ZSIKKworIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHRocmVhZC1zYWZlIG9iamVjdHMuCit0aHJlYWRfc2FmZV9mbGFnX3NwZWM9IiIKKworIyBMaWJyYXJ5IHZlcnNpb25pbmcgdHlwZS4KK3ZlcnNpb25fdHlwZT1saW51eAorCisjIEZvcm1hdCBvZiBsaWJyYXJ5IG5hbWUgcHJlZml4LgorbGlibmFtZV9zcGVjPSJsaWJcJG5hbWUiCisKKyMgTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KKyMgVGhlIGxhc3QgbmFtZSBpcyB0aGUgb25lIHRoYXQgdGhlIGxpbmtlciBmaW5kcyB3aXRoIC1sTkFNRS4KK2xpYnJhcnlfbmFtZXNfc3BlYz0iXCR7bGlibmFtZX1cJHtyZWxlYXNlfS5zb1wkdmVyc3VmZml4IFwke2xpYm5hbWV9XCR7cmVsZWFzZX0uc29cJG1ham9yIFwkbGlibmFtZS5zbyIKKworIyBUaGUgY29kZWQgbmFtZSBvZiB0aGUgbGlicmFyeSwgaWYgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgbmFtZS4KK3NvbmFtZV9zcGVjPSJcJHtsaWJuYW1lfVwke3JlbGVhc2V9LnNvXCRtYWpvciIKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlLgorUkFOTElCPSJyYW5saWIiCitvbGRfYXJjaGl2ZV9jbWRzPSJcJEFSIFwkQVJfRkxBR1MgXCRvbGRsaWJcJG9sZG9ianNcJG9sZF9kZXBsaWJzflwkUkFOTElCIFwkb2xkbGliIgorb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IlwkUkFOTElCIFwkb2xkbGlifmNobW9kIDY0NCBcJG9sZGxpYiIKK29sZF9wb3N0dW5pbnN0YWxsX2NtZHM9IiIKKworIyBDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgorb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0iIgorCisjIENyZWF0ZSBhIHRlbXBvcmFyeSBvbGQtc3R5bGUgYXJjaGl2ZSB0byBsaW5rIGluc3RlYWQgb2YgYSBzaGFyZWQgYXJjaGl2ZS4KK29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzPSIiCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhIHNoYXJlZCBhcmNoaXZlLgorYXJjaGl2ZV9jbWRzPSJcJENDIC1zaGFyZWQgXCRsaWJvYmpzIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzIFwke3dsfS1zb25hbWUgXCR3bFwkc29uYW1lIC1vIFwkbGliIgorYXJjaGl2ZV9leHBzeW1fY21kcz0iXCRDQyAtc2hhcmVkIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyBcJHt3bH0tc29uYW1lIFwkd2xcJHNvbmFtZSBcJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSBcJHdsXCRleHBvcnRfc3ltYm9scyAtbyBcJGxpYiIKK3Bvc3RpbnN0YWxsX2NtZHM9IiIKK3Bvc3R1bmluc3RhbGxfY21kcz0iIgorCisjIENvbW1hbmRzIHRvIHN0cmlwIGxpYnJhcmllcy4KK29sZF9zdHJpcGxpYj0ic3RyaXAgLS1zdHJpcC1kZWJ1ZyIKK3N0cmlwbGliPSJzdHJpcCAtLXN0cmlwLXVubmVlZGVkIgorCisjIE1ldGhvZCB0byBjaGVjayB3aGV0aGVyIGRlcGVuZGVudCBsaWJyYXJpZXMgYXJlIHNoYXJlZCBvYmplY3RzLgorZGVwbGlic19jaGVja19tZXRob2Q9InBhc3NfYWxsIgorCisjIENvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPT0gZmlsZV9tYWdpYy4KK2ZpbGVfbWFnaWNfY21kPSJcJE1BR0lDX0NNRCIKKworIyBGbGFnIHRoYXQgYWxsb3dzIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB1bmRlZmluZWQgc3ltYm9scyB0byBiZSBidWlsdC4KK2FsbG93X3VuZGVmaW5lZF9mbGFnPSIiCisKKyMgRmxhZyB0aGF0IGZvcmNlcyBubyB1bmRlZmluZWQgc3ltYm9scy4KK25vX3VuZGVmaW5lZF9mbGFnPSIiCisKKyMgQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5LgorZmluaXNoX2NtZHM9IlBBVEg9XFxcIlxcXCRQQVRIOi9zYmluXFxcIiBsZGNvbmZpZyAtbiBcJGxpYmRpciIKKworIyBTYW1lIGFzIGFib3ZlLCBidXQgYSBzaW5nbGUgc2NyaXB0IGZyYWdtZW50IHRvIGJlIGV2YWxlZCBidXQgbm90IHNob3duLgorZmluaXNoX2V2YWw9IiIKKworIyBUYWtlIHRoZSBvdXRwdXQgb2Ygbm0gYW5kIHByb2R1Y2UgYSBsaXN0aW5nIG9mIHJhdyBzeW1ib2xzIGFuZCBDIG5hbWVzLgorZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qWyAJXVxcKFtBQkNER0lTVFddW0FCQ0RHSVNUV10qXFwpWyAJXVsgCV0qXFwoXFwpXFwoW19BLVphLXpdW19BLVphLXowLTldKlxcKVwkL1xcMSBcXDJcXDMgXFwzL3AnIgorCisjIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KK2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eLiAuKiBcXCguKlxcKVwkL2V4dGVybiBjaGFyIFxcMTsvcCciCisKKyMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBDIG5hbWUgYWRkcmVzcyBwYWlyCitnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSJzZWQgLW4gLWUgJ3MvXjogXFwoW14gXSpcXCkgXCQvICB7XFxcIlxcMVxcXCIsIChsdF9wdHIpIDB9LC9wJyAtZSAncy9eW0JDREVHUlNUXSBcXChbXiBdKlxcKSBcXChbXiBdKlxcKVwkLyAge1wiXFwyXCIsIChsdF9wdHIpIFxcJlxcMn0sL3AnIgorCisjIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHJ1bnRpbWUgcGF0aCB2YXJpYWJsZS4KK3J1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisKKyMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZS4KK3NobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisKKyMgSXMgc2hsaWJwYXRoIHNlYXJjaGVkIGJlZm9yZSB0aGUgaGFyZC1jb2RlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoPworc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisKKyMgSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGUuCitoYXJkY29kZV9hY3Rpb249aW1tZWRpYXRlCisKKyMgV2hldGhlciB3ZSBzaG91bGQgaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIGxpYnJhcmllcy4KK2hhcmRjb2RlX2ludG9fbGlicz15ZXMKKworIyBGbGFnIHRvIGhhcmRjb2RlICRsaWJkaXIgaW50byBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4KKyMgVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiAkbGliZGlyIGRvZXMgbm90IGV4aXN0LgoraGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0iXCR7d2x9LS1ycGF0aCBcJHt3bH1cJGxpYmRpciIKKworIyBXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgLXJwYXRoIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudC4KK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9IiIKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIERJUi9saWJOQU1FLnNvIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKKyMgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX2RpcmVjdD1ubworCisjIFNldCB0byB5ZXMgaWYgdXNpbmcgdGhlIC1MRElSIGZsYWcgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQorIyByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfbWludXNfTD1ubworCisjIFNldCB0byB5ZXMgaWYgdXNpbmcgU0hMSUJQQVRIX1ZBUj1ESVIgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvCisjIHRoZSByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj11bnN1cHBvcnRlZAorCisjIFZhcmlhYmxlcyB3aG9zZSB2YWx1ZXMgc2hvdWxkIGJlIHNhdmVkIGluIGxpYnRvb2wgd3JhcHBlciBzY3JpcHRzIGFuZAorIyByZXN0b3JlZCBhdCByZWxpbmsgdGltZS4KK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSJQQVRIIExEX0xJQlJBUllfUEFUSCBMRF9SVU5fUEFUSCBHQ0NfRVhFQ19QUkVGSVggQ09NUElMRVJfUEFUSCBMSUJSQVJZX1BBVEgiCisKKyMgV2hldGhlciBsaWJ0b29sIG11c3QgbGluayBhIHByb2dyYW0gYWdhaW5zdCBhbGwgaXRzIGRlcGVuZGVuY3kgbGlicmFyaWVzLgorbGlua19hbGxfZGVwbGlicz11bmtub3duCisKKyMgQ29tcGlsZS10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCitzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCisKKyMgUnVuLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIgorCisjIEZpeCB0aGUgc2hlbGwgdmFyaWFibGUgJHNyY2ZpbGUgZm9yIHRoZSBjb21waWxlci4KK2ZpeF9zcmNmaWxlX3BhdGg9IiIKKworIyBTZXQgdG8geWVzIGlmIGV4cG9ydGVkIHN5bWJvbHMgYXJlIHJlcXVpcmVkLgorYWx3YXlzX2V4cG9ydF9zeW1ib2xzPW5vCisKKyMgVGhlIGNvbW1hbmRzIHRvIGxpc3QgZXhwb3J0ZWQgc3ltYm9scy4KK2V4cG9ydF9zeW1ib2xzX2NtZHM9IlwkTk0gXCRsaWJvYmpzIFwkY29udmVuaWVuY2UgfCBcJGdsb2JhbF9zeW1ib2xfcGlwZSB8IHNlZCAncy8uKiAvLycgfCBzb3J0IHwgdW5pcSA+IFwkZXhwb3J0X3N5bWJvbHMiCisKKyMgVGhlIGNvbW1hbmRzIHRvIGV4dHJhY3QgdGhlIGV4cG9ydGVkIHN5bWJvbCBsaXN0IGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KK2V4dHJhY3RfZXhwc3ltc19jbWRzPSIiCisKKyMgU3ltYm9scyB0aGF0IHNob3VsZCBub3QgYmUgbGlzdGVkIGluIHRoZSBwcmVsb2FkZWQgc3ltYm9scy4KK2V4Y2x1ZGVfZXhwc3ltcz0iX0dMT0JBTF9PRkZTRVRfVEFCTEVfIgorCisjIFN5bWJvbHMgdGhhdCBtdXN0IGFsd2F5cyBiZSBleHBvcnRlZC4KK2luY2x1ZGVfZXhwc3ltcz0iIgorCisjICMjIyBFTkQgTElCVE9PTCBDT05GSUcKKworIyBsdG1haW4uc2ggLSBQcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KKyMgTk9URTogQ2hhbmdpbmcgdGhpcyBmaWxlIHdpbGwgbm90IGFmZmVjdCBhbnl0aGluZyB1bnRpbCB5b3UgcmVydW4gY29uZmlndXJlLgorIworIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIE9yaWdpbmFsbHkgYnkgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBDaGVjayB0aGF0IHdlIGhhdmUgYSB3b3JraW5nICRlY2hvLgoraWYgdGVzdCAiWCQxIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgorICAjIERpc2NhcmQgdGhlIC0tbm8tcmVleGVjIGZsYWcsIGFuZCBjb250aW51ZS4KKyAgc2hpZnQKK2VsaWYgdGVzdCAiWCQxIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KKyAgIyBBdm9pZCBpbmxpbmUgZG9jdW1lbnQgaGVyZSwgaXQgbWF5IGJlIGxlZnQgb3ZlcgorICA6CitlbGlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JzsgdGhlbgorICAjIFlpcHBlZSwgJGVjaG8gd29ya3MhCisgIDoKK2Vsc2UKKyAgIyBSZXN0YXJ0IHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLCBhbmQgdGhlbiBtYXliZSAkZWNobyB3aWxsIHdvcmsuCisgIGV4ZWMgJFNIRUxMICIkMCIgLS1uby1yZWV4ZWMgJHsxKyIkQCJ9CitmaQorCitpZiB0ZXN0ICJYJDEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgorICAjIHVzZWQgYXMgZmFsbGJhY2sgZWNobworICBzaGlmdAorICBjYXQgPDxFT0YKKyQqCitFT0YKKyAgZXhpdCAwCitmaQorCisjIFRoZSBuYW1lIG9mIHRoaXMgcHJvZ3JhbS4KK3Byb2duYW1lPWAkZWNobyAiJDAiIHwgc2VkICdzJV4uKi8lJSdgCittb2RlbmFtZT0iJHByb2duYW1lIgorCisjIENvbnN0YW50cy4KK1BST0dSQU09bHRtYWluLnNoCitQQUNLQUdFPWxpYnRvb2wKK1ZFUlNJT049MS40LjIKK1RJTUVTVEFNUD0iICgxLjkyMi4yLjUzIDIwMDEvMDkvMTEgMDM6MTg6NTIpIgorCitkZWZhdWx0X21vZGU9CitoZWxwPSJUcnkgXGAkcHJvZ25hbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCittYWdpYz0iJSUlTUFHSUMgdmFyaWFibGUlJSUiCitta2Rpcj0ibWtkaXIiCittdj0ibXYgLWYiCitybT0icm0gLWYiCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKKyMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCitYc2VkPSdzZWQgLWUgMXMvXlgvLycKK3NlZF9xdW90ZV9zdWJzdD0ncy9cKFtcXGBcXCIkXFxcXF1cKS9cXFwxL2cnCitTUDJOTD0ndHIgXDA0MCBcMDEyJworTkwyU1A9J3RyIFwwMTVcMDEyIFwwNDBcMDQwJworCisjIE5MUyBudWlzYW5jZXMuCisjIE9ubHkgc2V0IExBTkcgYW5kIExDX0FMTCB0byBDIGlmIGFscmVhZHkgc2V0LgorIyBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5IGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQKKyMgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KKyMgV2Ugc2F2ZSB0aGUgb2xkIHZhbHVlcyB0byByZXN0b3JlIGR1cmluZyBleGVjdXRlIG1vZGUuCitpZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbgorICBzYXZlX0xDX0FMTD0iJExDX0FMTCI7IExDX0FMTD1DOyBleHBvcnQgTENfQUxMCitmaQoraWYgdGVzdCAiJHtMQU5HK3NldH0iID0gc2V0OyB0aGVuCisgIHNhdmVfTEFORz0iJExBTkciOyBMQU5HPUM7IGV4cG9ydCBMQU5HCitmaQorCisjIE1ha2Ugc3VyZSBJRlMgaGFzIGEgc2Vuc2libGUgZGVmYXVsdAorOiAke0lGUz0iIAkifQorCitpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXMgJiYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiAhPSB5ZXM7IHRoZW4KKyAgZWNobyAiJG1vZGVuYW1lOiBub3QgY29uZmlndXJlZCB0byBidWlsZCBhbnkga2luZCBvZiBsaWJyYXJ5IiAxPiYyCisgIGVjaG8gIkZhdGFsIGNvbmZpZ3VyYXRpb24gZXJyb3IuICBTZWUgdGhlICRQQUNLQUdFIGRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCisgIGV4aXQgMQorZmkKKworIyBHbG9iYWwgdmFyaWFibGVzLgorbW9kZT0kZGVmYXVsdF9tb2RlCitub25vcHQ9CitwcmV2PQorcHJldm9wdD0KK3J1bj0KK3Nob3c9IiRlY2hvIgorc2hvd19oZWxwPQorZXhlY3V0ZV9kbGZpbGVzPQorbG8ybz0icy9cXC5sb1wkLy4ke29iamV4dH0vIgorbzJsbz0icy9cXC4ke29iamV4dH1cJC8ubG8vIgorCisjIFBhcnNlIG91ciBjb21tYW5kIGxpbmUgb3B0aW9ucyBvbmNlLCB0aG9yb3VnaGx5Lgord2hpbGUgdGVzdCAkIyAtZ3QgMAorZG8KKyAgYXJnPSIkMSIKKyAgc2hpZnQKKworICBjYXNlICRhcmcgaW4KKyAgLSo9Kikgb3B0YXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OworICAqKSBvcHRhcmc9IDs7CisgIGVzYWMKKworICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCisgICAgY2FzZSAkcHJldiBpbgorICAgIGV4ZWN1dGVfZGxmaWxlcykKKyAgICAgIGV4ZWN1dGVfZGxmaWxlcz0iJGV4ZWN1dGVfZGxmaWxlcyAkYXJnIgorICAgICAgOzsKKyAgICAqKQorICAgICAgZXZhbCAiJHByZXY9XCRhcmciCisgICAgICA7OworICAgIGVzYWMKKworICAgIHByZXY9CisgICAgcHJldm9wdD0KKyAgICBjb250aW51ZQorICBmaQorCisgICMgSGF2ZSB3ZSBzZWVuIGEgbm9uLW9wdGlvbmFsIGFyZ3VtZW50IHlldD8KKyAgY2FzZSAkYXJnIGluCisgIC0taGVscCkKKyAgICBzaG93X2hlbHA9eWVzCisgICAgOzsKKworICAtLXZlcnNpb24pCisgICAgZWNobyAiJFBST0dSQU0gKEdOVSAkUEFDS0FHRSkgJFZFUlNJT04kVElNRVNUQU1QIgorICAgIGV4aXQgMAorICAgIDs7CisKKyAgLS1jb25maWcpCisgICAgc2VkIC1lICcxLC9eIyAjIyMgQkVHSU4gTElCVE9PTCBDT05GSUcvZCcgLWUgJy9eIyAjIyMgRU5EIExJQlRPT0wgQ09ORklHLywkZCcgJDAKKyAgICBleGl0IDAKKyAgICA7OworCisgIC0tZGVidWcpCisgICAgZWNobyAiJHByb2duYW1lOiBlbmFibGluZyBzaGVsbCB0cmFjZSBtb2RlIgorICAgIHNldCAteAorICAgIDs7CisKKyAgLS1kcnktcnVuIHwgLW4pCisgICAgcnVuPToKKyAgICA7OworCisgIC0tZmVhdHVyZXMpCisgICAgZWNobyAiaG9zdDogJGhvc3QiCisgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgIGVjaG8gImVuYWJsZSBzaGFyZWQgbGlicmFyaWVzIgorICAgIGVsc2UKKyAgICAgIGVjaG8gImRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyIKKyAgICBmaQorICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgIGVjaG8gImVuYWJsZSBzdGF0aWMgbGlicmFyaWVzIgorICAgIGVsc2UKKyAgICAgIGVjaG8gImRpc2FibGUgc3RhdGljIGxpYnJhcmllcyIKKyAgICBmaQorICAgIGV4aXQgMAorICAgIDs7CisKKyAgLS1maW5pc2gpIG1vZGU9ImZpbmlzaCIgOzsKKworICAtLW1vZGUpIHByZXZvcHQ9Ii0tbW9kZSIgcHJldj1tb2RlIDs7CisgIC0tbW9kZT0qKSBtb2RlPSIkb3B0YXJnIiA7OworCisgIC0tcXVpZXQgfCAtLXNpbGVudCkKKyAgICBzaG93PToKKyAgICA7OworCisgIC1kbG9wZW4pCisgICAgcHJldm9wdD0iLWRsb3BlbiIKKyAgICBwcmV2PWV4ZWN1dGVfZGxmaWxlcworICAgIDs7CisKKyAgLSopCisgICAgJGVjaG8gIiRtb2RlbmFtZTogdW5yZWNvZ25pemVkIG9wdGlvbiBcYCRhcmcnIiAxPiYyCisgICAgJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgZXhpdCAxCisgICAgOzsKKworICAqKQorICAgIG5vbm9wdD0iJGFyZyIKKyAgICBicmVhaworICAgIDs7CisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAtbiAiJHByZXZvcHQiOyB0aGVuCisgICRlY2hvICIkbW9kZW5hbWU6IG9wdGlvbiBcYCRwcmV2b3B0JyByZXF1aXJlcyBhbiBhcmd1bWVudCIgMT4mMgorICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgZXhpdCAxCitmaQorCisjIElmIHRoaXMgdmFyaWFibGUgaXMgc2V0IGluIGFueSBvZiB0aGUgYWN0aW9ucywgdGhlIGNvbW1hbmQgaW4gaXQKKyMgd2lsbCBiZSBleGVjZWQgYXQgdGhlIGVuZC4gIFRoaXMgcHJldmVudHMgaGVyZS1kb2N1bWVudHMgZnJvbSBiZWluZworIyBsZWZ0IG92ZXIgYnkgc2hlbGxzLgorZXhlY19jbWQ9CisKK2lmIHRlc3QgLXogIiRzaG93X2hlbHAiOyB0aGVuCisKKyAgIyBJbmZlciB0aGUgb3BlcmF0aW9uIG1vZGUuCisgIGlmIHRlc3QgLXogIiRtb2RlIjsgdGhlbgorICAgIGNhc2UgJG5vbm9wdCBpbgorICAgICpjYyB8ICorKyB8IGdjYyogfCAqLWdjYyopCisgICAgICBtb2RlPWxpbmsKKyAgICAgIGZvciBhcmcKKyAgICAgIGRvCisJY2FzZSAkYXJnIGluCisJLWMpCisJICAgbW9kZT1jb21waWxlCisJICAgYnJlYWsKKwkgICA7OworCWVzYWMKKyAgICAgIGRvbmUKKyAgICAgIDs7CisgICAgKmRiIHwgKmRieCB8ICpzdHJhY2UgfCAqdHJ1c3MpCisgICAgICBtb2RlPWV4ZWN1dGUKKyAgICAgIDs7CisgICAgKmluc3RhbGwqfGNwfG12KQorICAgICAgbW9kZT1pbnN0YWxsCisgICAgICA7OworICAgICpybSkKKyAgICAgIG1vZGU9dW5pbnN0YWxsCisgICAgICA7OworICAgICopCisgICAgICAjIElmIHdlIGhhdmUgbm8gbW9kZSwgYnV0IGRsZmlsZXMgd2VyZSBzcGVjaWZpZWQsIHRoZW4gZG8gZXhlY3V0ZSBtb2RlLgorICAgICAgdGVzdCAtbiAiJGV4ZWN1dGVfZGxmaWxlcyIgJiYgbW9kZT1leGVjdXRlCisKKyAgICAgICMgSnVzdCB1c2UgdGhlIGRlZmF1bHQgb3BlcmF0aW9uIG1vZGUuCisgICAgICBpZiB0ZXN0IC16ICIkbW9kZSI7IHRoZW4KKwlpZiB0ZXN0IC1uICIkbm9ub3B0IjsgdGhlbgorCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY2Fubm90IGluZmVyIG9wZXJhdGlvbiBtb2RlIGZyb20gXGAkbm9ub3B0JyIgMT4mMgorCWVsc2UKKwkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCBpbmZlciBvcGVyYXRpb24gbW9kZSB3aXRob3V0IE1PREUtQVJHUyIgMT4mMgorCWZpCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisKKyAgIyBPbmx5IGV4ZWN1dGUgbW9kZSBpcyBhbGxvd2VkIHRvIGhhdmUgLWRsb3BlbiBmbGFncy4KKyAgaWYgdGVzdCAtbiAiJGV4ZWN1dGVfZGxmaWxlcyIgJiYgdGVzdCAiJG1vZGUiICE9IGV4ZWN1dGU7IHRoZW4KKyAgICAkZWNobyAiJG1vZGVuYW1lOiB1bnJlY29nbml6ZWQgb3B0aW9uIFxgLWRsb3BlbiciIDE+JjIKKyAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICBleGl0IDEKKyAgZmkKKworICAjIENoYW5nZSB0aGUgaGVscCBtZXNzYWdlIHRvIGEgbW9kZS1zcGVjaWZpYyBvbmUuCisgIGdlbmVyaWNfaGVscD0iJGhlbHAiCisgIGhlbHA9IlRyeSBcYCRtb2RlbmFtZSAtLWhlbHAgLS1tb2RlPSRtb2RlJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCisKKyAgIyBUaGVzZSBtb2RlcyBhcmUgaW4gb3JkZXIgb2YgZXhlY3V0aW9uIGZyZXF1ZW5jeSBzbyB0aGF0IHRoZXkgcnVuIHF1aWNrbHkuCisgIGNhc2UgJG1vZGUgaW4KKyAgIyBsaWJ0b29sIGNvbXBpbGUgbW9kZQorICBjb21waWxlKQorICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGNvbXBpbGUiCisgICAgIyBHZXQgdGhlIGNvbXBpbGF0aW9uIGNvbW1hbmQgYW5kIHRoZSBzb3VyY2UgZmlsZS4KKyAgICBiYXNlX2NvbXBpbGU9CisgICAgcHJldj0KKyAgICBsYXN0YXJnPQorICAgIHNyY2ZpbGU9IiRub25vcHQiCisgICAgc3VwcHJlc3Nfb3V0cHV0PQorCisgICAgdXNlcl90YXJnZXQ9bm8KKyAgICBmb3IgYXJnCisgICAgZG8KKyAgICAgIGNhc2UgJHByZXYgaW4KKyAgICAgICIiKSA7OworICAgICAgeGNvbXBpbGVyKQorCSMgQWVzdGhldGljYWxseSBxdW90ZSB0aGUgcHJldmlvdXMgYXJndW1lbnQuCisJcHJldj0KKwlsYXN0YXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorCisJY2FzZSAkYXJnIGluCisJIyBEb3VibGUtcXVvdGUgYXJncyBjb250YWluaW5nIG90aGVyIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgorCSMgTWFueSBCb3VybmUgc2hlbGxzIGNhbm5vdCBoYW5kbGUgY2xvc2UgYnJhY2tldHMgY29ycmVjdGx5CisJIyBpbiBzY2FuIHNldHMsIHNvIHdlIHNwZWNpZnkgaXQgc2VwYXJhdGVseS4KKwkqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKKwkgIGFyZz0iXCIkYXJnXCIiCisJICA7OworCWVzYWMKKworCSMgQWRkIHRoZSBwcmV2aW91cyBhcmd1bWVudCB0byBiYXNlX2NvbXBpbGUuCisJaWYgdGVzdCAteiAiJGJhc2VfY29tcGlsZSI7IHRoZW4KKwkgIGJhc2VfY29tcGlsZT0iJGxhc3RhcmciCisJZWxzZQorCSAgYmFzZV9jb21waWxlPSIkYmFzZV9jb21waWxlICRsYXN0YXJnIgorCWZpCisJY29udGludWUKKwk7OworICAgICAgZXNhYworCisgICAgICAjIEFjY2VwdCBhbnkgY29tbWFuZC1saW5lIG9wdGlvbnMuCisgICAgICBjYXNlICRhcmcgaW4KKyAgICAgIC1vKQorCWlmIHRlc3QgIiR1c2VyX3RhcmdldCIgIT0gIm5vIjsgdGhlbgorCSAgJGVjaG8gIiRtb2RlbmFtZTogeW91IGNhbm5vdCBzcGVjaWZ5IFxgLW8nIG1vcmUgdGhhbiBvbmNlIiAxPiYyCisJICBleGl0IDEKKwlmaQorCXVzZXJfdGFyZ2V0PW5leHQKKwk7OworCisgICAgICAtc3RhdGljKQorCWJ1aWxkX29sZF9saWJzPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLXByZWZlci1waWMpCisJcGljX21vZGU9eWVzCisJY29udGludWUKKwk7OworCisgICAgICAtcHJlZmVyLW5vbi1waWMpCisJcGljX21vZGU9bm8KKwljb250aW51ZQorCTs7CisKKyAgICAgIC1YY29tcGlsZXIpCisJcHJldj14Y29tcGlsZXIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1XYywqKQorCWFyZ3M9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAicy9eLVdjLC8vImAKKwlsYXN0YXJnPQorCXNhdmVfaWZzPSIkSUZTIjsgSUZTPScsJworCWZvciBhcmcgaW4gJGFyZ3M7IGRvCisJICBJRlM9IiRzYXZlX2lmcyIKKworCSAgIyBEb3VibGUtcXVvdGUgYXJncyBjb250YWluaW5nIG90aGVyIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgorCSAgIyBNYW55IEJvdXJuZSBzaGVsbHMgY2Fubm90IGhhbmRsZSBjbG9zZSBicmFja2V0cyBjb3JyZWN0bHkKKwkgICMgaW4gc2NhbiBzZXRzLCBzbyB3ZSBzcGVjaWZ5IGl0IHNlcGFyYXRlbHkuCisJICBjYXNlICRhcmcgaW4KKwkgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCisJICAgIGFyZz0iXCIkYXJnXCIiCisJICAgIDs7CisJICBlc2FjCisJICBsYXN0YXJnPSIkbGFzdGFyZyAkYXJnIgorCWRvbmUKKwlJRlM9IiRzYXZlX2lmcyIKKwlsYXN0YXJnPWAkZWNobyAiWCRsYXN0YXJnIiB8ICRYc2VkIC1lICJzL14gLy8iYAorCisJIyBBZGQgdGhlIGFyZ3VtZW50cyB0byBiYXNlX2NvbXBpbGUuCisJaWYgdGVzdCAteiAiJGJhc2VfY29tcGlsZSI7IHRoZW4KKwkgIGJhc2VfY29tcGlsZT0iJGxhc3RhcmciCisJZWxzZQorCSAgYmFzZV9jb21waWxlPSIkYmFzZV9jb21waWxlICRsYXN0YXJnIgorCWZpCisJY29udGludWUKKwk7OworICAgICAgZXNhYworCisgICAgICBjYXNlICR1c2VyX3RhcmdldCBpbgorICAgICAgbmV4dCkKKwkjIFRoZSBuZXh0IG9uZSBpcyB0aGUgLW8gdGFyZ2V0IG5hbWUKKwl1c2VyX3RhcmdldD15ZXMKKwljb250aW51ZQorCTs7CisgICAgICB5ZXMpCisJIyBXZSBnb3QgdGhlIG91dHB1dCBmaWxlCisJdXNlcl90YXJnZXQ9c2V0CisJbGlib2JqPSIkYXJnIgorCWNvbnRpbnVlCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgIyBBY2NlcHQgdGhlIGN1cnJlbnQgYXJndW1lbnQgYXMgdGhlIHNvdXJjZSBmaWxlLgorICAgICAgbGFzdGFyZz0iJHNyY2ZpbGUiCisgICAgICBzcmNmaWxlPSIkYXJnIgorCisgICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgdGhlIHByZXZpb3VzIGFyZ3VtZW50LgorCisgICAgICAjIEJhY2tzbGFzaGlmeSBhbnkgYmFja3NsYXNoZXMsIGRvdWJsZSBxdW90ZXMsIGFuZCBkb2xsYXIgc2lnbnMuCisgICAgICAjIFRoZXNlIGFyZSB0aGUgb25seSBjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIHNwZWNpYWxseQorICAgICAgIyBpbnRlcnByZXRlZCBpbnNpZGUgb2YgZG91YmxlLXF1b3RlZCBzY3JpbmdzLgorICAgICAgbGFzdGFyZz1gJGVjaG8gIlgkbGFzdGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisKKyAgICAgICMgRG91YmxlLXF1b3RlIGFyZ3MgY29udGFpbmluZyBvdGhlciBzaGVsbCBtZXRhY2hhcmFjdGVycy4KKyAgICAgICMgTWFueSBCb3VybmUgc2hlbGxzIGNhbm5vdCBoYW5kbGUgY2xvc2UgYnJhY2tldHMgY29ycmVjdGx5CisgICAgICAjIGluIHNjYW4gc2V0cywgc28gd2Ugc3BlY2lmeSBpdCBzZXBhcmF0ZWx5LgorICAgICAgY2FzZSAkbGFzdGFyZyBpbgorICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCisJbGFzdGFyZz0iXCIkbGFzdGFyZ1wiIgorCTs7CisgICAgICBlc2FjCisKKyAgICAgICMgQWRkIHRoZSBwcmV2aW91cyBhcmd1bWVudCB0byBiYXNlX2NvbXBpbGUuCisgICAgICBpZiB0ZXN0IC16ICIkYmFzZV9jb21waWxlIjsgdGhlbgorCWJhc2VfY29tcGlsZT0iJGxhc3RhcmciCisgICAgICBlbHNlCisJYmFzZV9jb21waWxlPSIkYmFzZV9jb21waWxlICRsYXN0YXJnIgorICAgICAgZmkKKyAgICBkb25lCisKKyAgICBjYXNlICR1c2VyX3RhcmdldCBpbgorICAgIHNldCkKKyAgICAgIDs7CisgICAgbm8pCisgICAgICAjIEdldCB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSBvYmplY3QuCisgICAgICBsaWJvYmo9YCRlY2hvICJYJHNyY2ZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKyAgICAgIDs7CisgICAgKikKKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSB0YXJnZXQgd2l0aCBcYC1vJyIgMT4mMgorICAgICAgZXhpdCAxCisgICAgICA7OworICAgIGVzYWMKKworICAgICMgUmVjb2duaXplIHNldmVyYWwgZGlmZmVyZW50IGZpbGUgc3VmZml4ZXMuCisgICAgIyBJZiB0aGUgdXNlciBzcGVjaWZpZXMgLW8gZmlsZS5vLCBpdCBpcyByZXBsYWNlZCB3aXRoIGZpbGUubG8KKyAgICB4Zm9ybT0nW2NDRlNmbXNvXScKKyAgICBjYXNlICRsaWJvYmogaW4KKyAgICAqLmFkYSkgeGZvcm09YWRhIDs7CisgICAgKi5hZGIpIHhmb3JtPWFkYiA7OworICAgICouYWRzKSB4Zm9ybT1hZHMgOzsKKyAgICAqLmFzbSkgeGZvcm09YXNtIDs7CisgICAgKi5jKyspIHhmb3JtPWMrKyA7OworICAgICouY2MpIHhmb3JtPWNjIDs7CisgICAgKi5jcHApIHhmb3JtPWNwcCA7OworICAgICouY3h4KSB4Zm9ybT1jeHggOzsKKyAgICAqLmY5MCkgeGZvcm09ZjkwIDs7CisgICAgKi5mb3IpIHhmb3JtPWZvciA7OworICAgIGVzYWMKKworICAgIGxpYm9iaj1gJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICJzL1wuJHhmb3JtJC8ubG8vImAKKworICAgIGNhc2UgJGxpYm9iaiBpbgorICAgICoubG8pIG9iaj1gJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICIkbG8ybyJgIDs7CisgICAgKikKKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBkZXRlcm1pbmUgbmFtZSBvZiBsaWJyYXJ5IG9iamVjdCBmcm9tIFxgJGxpYm9iaiciIDE+JjIKKyAgICAgIGV4aXQgMQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBpZiB0ZXN0IC16ICIkYmFzZV9jb21waWxlIjsgdGhlbgorICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIGNvbXBpbGF0aW9uIGNvbW1hbmQiIDE+JjIKKyAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgZXhpdCAxCisgICAgZmkKKworICAgICMgRGVsZXRlIGFueSBsZWZ0b3ZlciBsaWJyYXJ5IG9iamVjdHMuCisgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorICAgICAgcmVtb3ZlbGlzdD0iJG9iaiAkbGlib2JqIgorICAgIGVsc2UKKyAgICAgIHJlbW92ZWxpc3Q9IiRsaWJvYmoiCisgICAgZmkKKworICAgICRydW4gJHJtICRyZW1vdmVsaXN0CisgICAgdHJhcCAiJHJ1biAkcm0gJHJlbW92ZWxpc3Q7IGV4aXQgMSIgMSAyIDE1CisKKyAgICAjIE9uIEN5Z3dpbiB0aGVyZSdzIG5vICJyZWFsIiBQSUMgZmxhZyBzbyB3ZSBtdXN0IGJ1aWxkIGJvdGggb2JqZWN0IHR5cGVzCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IG9zMiopCisgICAgICBwaWNfbW9kZT1kZWZhdWx0CisgICAgICA7OworICAgIGVzYWMKKyAgICBpZiB0ZXN0ICRwaWNfbW9kZSA9IG5vICYmIHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgIT0gcGFzc19hbGw7IHRoZW4KKyAgICAgICMgbm9uLVBJQyBjb2RlIGluIHNoYXJlZCBsaWJyYXJpZXMgaXMgbm90IHN1cHBvcnRlZAorICAgICAgcGljX21vZGU9ZGVmYXVsdAorICAgIGZpCisKKyAgICAjIENhbGN1bGF0ZSB0aGUgZmlsZW5hbWUgb2YgdGhlIG91dHB1dCBvYmplY3QgaWYgY29tcGlsZXIgZG9lcworICAgICMgbm90IHN1cHBvcnQgLW8gd2l0aCAtYworICAgIGlmIHRlc3QgIiRjb21waWxlcl9jX28iID0gbm87IHRoZW4KKyAgICAgIG91dHB1dF9vYmo9YCRlY2hvICJYJHNyY2ZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJyAtZSAncyVcLlteLl0qJCUlJ2AuJHtvYmpleHR9CisgICAgICBsb2NrZmlsZT0iJG91dHB1dF9vYmoubG9jayIKKyAgICAgIHJlbW92ZWxpc3Q9IiRyZW1vdmVsaXN0ICRvdXRwdXRfb2JqICRsb2NrZmlsZSIKKyAgICAgIHRyYXAgIiRydW4gJHJtICRyZW1vdmVsaXN0OyBleGl0IDEiIDEgMiAxNQorICAgIGVsc2UKKyAgICAgIG5lZWRfbG9ja3M9bm8KKyAgICAgIGxvY2tmaWxlPQorICAgIGZpCisKKyAgICAjIExvY2sgdGhpcyBjcml0aWNhbCBzZWN0aW9uIGlmIGl0IGlzIG5lZWRlZAorICAgICMgV2UgdXNlIHRoaXMgc2NyaXB0IGZpbGUgdG8gbWFrZSB0aGUgbGluaywgaXQgYXZvaWRzIGNyZWF0aW5nIGEgbmV3IGZpbGUKKyAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB5ZXM7IHRoZW4KKyAgICAgIHVudGlsICRydW4gbG4gIiQwIiAiJGxvY2tmaWxlIiAyPi9kZXYvbnVsbDsgZG8KKwkkc2hvdyAiV2FpdGluZyBmb3IgJGxvY2tmaWxlIHRvIGJlIHJlbW92ZWQiCisJc2xlZXAgMgorICAgICAgZG9uZQorICAgIGVsaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybjsgdGhlbgorICAgICAgaWYgdGVzdCAtZiAiJGxvY2tmaWxlIjsgdGhlbgorCWVjaG8gIlwKKyoqKiBFUlJPUiwgJGxvY2tmaWxlIGV4aXN0cyBhbmQgY29udGFpbnM6CitgY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAKKworVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbm90aGVyIHByb2Nlc3MgaXMgdHJ5aW5nIHRvIHVzZSB0aGUgc2FtZQordGVtcG9yYXJ5IG9iamVjdCBmaWxlLCBhbmQgbGlidG9vbCBjb3VsZCBub3Qgd29yayBhcm91bmQgaXQgYmVjYXVzZQoreW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IFxgLWMnIGFuZCBcYC1vJyB0b2dldGhlci4gIElmIHlvdQorcmVwZWF0IHRoaXMgY29tcGlsYXRpb24sIGl0IG1heSBzdWNjZWVkLCBieSBjaGFuY2UsIGJ1dCB5b3UgaGFkIGJldHRlcgorYXZvaWQgcGFyYWxsZWwgYnVpbGRzIChtYWtlIC1qKSBpbiB0aGlzIHBsYXRmb3JtLCBvciBnZXQgYSBiZXR0ZXIKK2NvbXBpbGVyLiIKKworCSRydW4gJHJtICRyZW1vdmVsaXN0CisJZXhpdCAxCisgICAgICBmaQorICAgICAgZWNobyAkc3JjZmlsZSA+ICIkbG9ja2ZpbGUiCisgICAgZmkKKworICAgIGlmIHRlc3QgLW4gIiRmaXhfc3JjZmlsZV9wYXRoIjsgdGhlbgorICAgICAgZXZhbCBzcmNmaWxlPVwiJGZpeF9zcmNmaWxlX3BhdGhcIgorICAgIGZpCisKKyAgICAjIE9ubHkgYnVpbGQgYSBQSUMgb2JqZWN0IGlmIHdlIGFyZSBidWlsZGluZyBsaWJ0b29sIGxpYnJhcmllcy4KKyAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorICAgICAgIyBXaXRob3V0IHRoaXMgYXNzaWdubWVudCwgYmFzZV9jb21waWxlIGdldHMgZW1wdGllZC4KKyAgICAgIGZic2RfaGlkZW91c19zaF9idWc9JGJhc2VfY29tcGlsZQorCisgICAgICBpZiB0ZXN0ICIkcGljX21vZGUiICE9IG5vOyB0aGVuCisJIyBBbGwgcGxhdGZvcm1zIHVzZSAtRFBJQywgdG8gbm90aWZ5IHByZXByb2Nlc3NlZCBhc3NlbWJsZXIgY29kZS4KKwljb21tYW5kPSIkYmFzZV9jb21waWxlICRzcmNmaWxlICRwaWNfZmxhZyAtRFBJQyIKKyAgICAgIGVsc2UKKwkjIERvbid0IGJ1aWxkIFBJQyBjb2RlCisJY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkc3JjZmlsZSIKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisJbG9fbGlib2JqPSIkbGlib2JqIgorCWRpcj1gJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisJaWYgdGVzdCAiWCRkaXIiID0gIlgkbGlib2JqIjsgdGhlbgorCSAgZGlyPSIkb2JqZGlyIgorCWVsc2UKKwkgIGRpcj0iJGRpci8kb2JqZGlyIgorCWZpCisJbGlib2JqPSIkZGlyLyJgJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisKKwlpZiB0ZXN0IC1kICIkZGlyIjsgdGhlbgorCSAgJHNob3cgIiRybSAkbGlib2JqIgorCSAgJHJ1biAkcm0gJGxpYm9iagorCWVsc2UKKwkgICRzaG93ICIkbWtkaXIgJGRpciIKKwkgICRydW4gJG1rZGlyICRkaXIKKwkgIHN0YXR1cz0kPworCSAgaWYgdGVzdCAkc3RhdHVzIC1uZSAwICYmIHRlc3QgISAtZCAkZGlyOyB0aGVuCisJICAgIGV4aXQgJHN0YXR1cworCSAgZmkKKwlmaQorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiRjb21waWxlcl9vX2xvIiA9IHllczsgdGhlbgorCW91dHB1dF9vYmo9IiRsaWJvYmoiCisJY29tbWFuZD0iJGNvbW1hbmQgLW8gJG91dHB1dF9vYmoiCisgICAgICBlbGlmIHRlc3QgIiRjb21waWxlcl9jX28iID0geWVzOyB0aGVuCisJb3V0cHV0X29iaj0iJG9iaiIKKwljb21tYW5kPSIkY29tbWFuZCAtbyAkb3V0cHV0X29iaiIKKyAgICAgIGZpCisKKyAgICAgICRydW4gJHJtICIkb3V0cHV0X29iaiIKKyAgICAgICRzaG93ICIkY29tbWFuZCIKKyAgICAgIGlmICRydW4gZXZhbCAiJGNvbW1hbmQiOyB0aGVuIDoKKyAgICAgIGVsc2UKKwl0ZXN0IC1uICIkb3V0cHV0X29iaiIgJiYgJHJ1biAkcm0gJHJlbW92ZWxpc3QKKwlleGl0IDEKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHdhcm4gJiYKKwkgdGVzdCB4ImBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYCIgIT0geCIkc3JjZmlsZSI7IHRoZW4KKwllY2hvICJcCisqKiogRVJST1IsICRsb2NrZmlsZSBjb250YWluczoKK2BjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAorCitidXQgaXQgc2hvdWxkIGNvbnRhaW46Ciskc3JjZmlsZQorCitUaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCit0ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCit5b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91CityZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCithdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgorY29tcGlsZXIuIgorCisJJHJ1biAkcm0gJHJlbW92ZWxpc3QKKwlleGl0IDEKKyAgICAgIGZpCisKKyAgICAgICMgSnVzdCBtb3ZlIHRoZSBvYmplY3QgaWYgbmVlZGVkLCB0aGVuIGdvIG9uIHRvIGNvbXBpbGUgdGhlIG5leHQgb25lCisgICAgICBpZiB0ZXN0IHgiJG91dHB1dF9vYmoiICE9IHgiJGxpYm9iaiI7IHRoZW4KKwkkc2hvdyAiJG12ICRvdXRwdXRfb2JqICRsaWJvYmoiCisJaWYgJHJ1biAkbXYgJG91dHB1dF9vYmogJGxpYm9iajsgdGhlbiA6CisJZWxzZQorCSAgZXJyb3I9JD8KKwkgICRydW4gJHJtICRyZW1vdmVsaXN0CisJICBleGl0ICRlcnJvcgorCWZpCisgICAgICBmaQorCisgICAgICAjIElmIHdlIGhhdmUgbm8gcGljX2ZsYWcsIHRoZW4gY29weSB0aGUgb2JqZWN0IGludG8gcGxhY2UgYW5kIGZpbmlzaC4KKyAgICAgIGlmICh0ZXN0IC16ICIkcGljX2ZsYWciIHx8IHRlc3QgIiRwaWNfbW9kZSIgIT0gZGVmYXVsdCkgJiYKKwkgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorCSMgUmVuYW1lIHRoZSAubG8gZnJvbSB3aXRoaW4gb2JqZGlyIHRvIG9iagorCWlmIHRlc3QgLWYgJG9iajsgdGhlbgorCSAgJHNob3cgJHJtICRvYmoKKwkgICRydW4gJHJtICRvYmoKKwlmaQorCisJJHNob3cgIiRtdiAkbGlib2JqICRvYmoiCisJaWYgJHJ1biAkbXYgJGxpYm9iaiAkb2JqOyB0aGVuIDoKKwllbHNlCisJICBlcnJvcj0kPworCSAgJHJ1biAkcm0gJHJlbW92ZWxpc3QKKwkgIGV4aXQgJGVycm9yCisJZmkKKworCXhkaXI9YCRlY2hvICJYJG9iaiIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAorCWlmIHRlc3QgIlgkeGRpciIgPSAiWCRvYmoiOyB0aGVuCisJICB4ZGlyPSIuIgorCWVsc2UKKwkgIHhkaXI9IiR4ZGlyIgorCWZpCisJYmFzZW9iaj1gJGVjaG8gIlgkb2JqIiB8ICRYc2VkIC1lICJzJS4qLyUlImAKKwlsaWJvYmo9YCRlY2hvICJYJGJhc2VvYmoiIHwgJFhzZWQgLWUgIiRvMmxvImAKKwkjIE5vdyBhcnJhbmdlIHRoYXQgb2JqIGFuZCBsb19saWJvYmogYmVjb21lIHRoZSBzYW1lIGZpbGUKKwkkc2hvdyAiKGNkICR4ZGlyICYmICRMTl9TICRiYXNlb2JqICRsaWJvYmopIgorCWlmICRydW4gZXZhbCAnKGNkICR4ZGlyICYmICRMTl9TICRiYXNlb2JqICRsaWJvYmopJzsgdGhlbgorCSAgIyBVbmxvY2sgdGhlIGNyaXRpY2FsIHNlY3Rpb24gaWYgaXQgd2FzIGxvY2tlZAorCSAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiICE9IG5vOyB0aGVuCisJICAgICRydW4gJHJtICIkbG9ja2ZpbGUiCisJICBmaQorCSAgZXhpdCAwCisJZWxzZQorCSAgZXJyb3I9JD8KKwkgICRydW4gJHJtICRyZW1vdmVsaXN0CisJICBleGl0ICRlcnJvcgorCWZpCisgICAgICBmaQorCisgICAgICAjIEFsbG93IGVycm9yIG1lc3NhZ2VzIG9ubHkgZnJvbSB0aGUgZmlyc3QgY29tcGlsYXRpb24uCisgICAgICBzdXBwcmVzc19vdXRwdXQ9JyA+L2Rldi9udWxsIDI+JjEnCisgICAgZmkKKworICAgICMgT25seSBidWlsZCBhIHBvc2l0aW9uLWRlcGVuZGVudCBvYmplY3QgaWYgd2UgYnVpbGQgb2xkIGxpYnJhcmllcy4KKyAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkcGljX21vZGUiICE9IHllczsgdGhlbgorCSMgRG9uJ3QgYnVpbGQgUElDIGNvZGUKKwljb21tYW5kPSIkYmFzZV9jb21waWxlICRzcmNmaWxlIgorICAgICAgZWxzZQorCSMgQWxsIHBsYXRmb3JtcyB1c2UgLURQSUMsIHRvIG5vdGlmeSBwcmVwcm9jZXNzZWQgYXNzZW1ibGVyIGNvZGUuCisJY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkc3JjZmlsZSAkcGljX2ZsYWcgLURQSUMiCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJGNvbXBpbGVyX2NfbyIgPSB5ZXM7IHRoZW4KKwljb21tYW5kPSIkY29tbWFuZCAtbyAkb2JqIgorCW91dHB1dF9vYmo9IiRvYmoiCisgICAgICBmaQorCisgICAgICAjIFN1cHByZXNzIGNvbXBpbGVyIG91dHB1dCBpZiB3ZSBhbHJlYWR5IGRpZCBhIFBJQyBjb21waWxhdGlvbi4KKyAgICAgIGNvbW1hbmQ9IiRjb21tYW5kJHN1cHByZXNzX291dHB1dCIKKyAgICAgICRydW4gJHJtICIkb3V0cHV0X29iaiIKKyAgICAgICRzaG93ICIkY29tbWFuZCIKKyAgICAgIGlmICRydW4gZXZhbCAiJGNvbW1hbmQiOyB0aGVuIDoKKyAgICAgIGVsc2UKKwkkcnVuICRybSAkcmVtb3ZlbGlzdAorCWV4aXQgMQorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybiAmJgorCSB0ZXN0IHgiYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgIiAhPSB4IiRzcmNmaWxlIjsgdGhlbgorCWVjaG8gIlwKKyoqKiBFUlJPUiwgJGxvY2tmaWxlIGNvbnRhaW5zOgorYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgCisKK2J1dCBpdCBzaG91bGQgY29udGFpbjoKKyRzcmNmaWxlCisKK1RoaXMgaW5kaWNhdGVzIHRoYXQgYW5vdGhlciBwcm9jZXNzIGlzIHRyeWluZyB0byB1c2UgdGhlIHNhbWUKK3RlbXBvcmFyeSBvYmplY3QgZmlsZSwgYW5kIGxpYnRvb2wgY291bGQgbm90IHdvcmsgYXJvdW5kIGl0IGJlY2F1c2UKK3lvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBcYC1jJyBhbmQgXGAtbycgdG9nZXRoZXIuICBJZiB5b3UKK3JlcGVhdCB0aGlzIGNvbXBpbGF0aW9uLCBpdCBtYXkgc3VjY2VlZCwgYnkgY2hhbmNlLCBidXQgeW91IGhhZCBiZXR0ZXIKK2F2b2lkIHBhcmFsbGVsIGJ1aWxkcyAobWFrZSAtaikgaW4gdGhpcyBwbGF0Zm9ybSwgb3IgZ2V0IGEgYmV0dGVyCitjb21waWxlci4iCisKKwkkcnVuICRybSAkcmVtb3ZlbGlzdAorCWV4aXQgMQorICAgICAgZmkKKworICAgICAgIyBKdXN0IG1vdmUgdGhlIG9iamVjdCBpZiBuZWVkZWQKKyAgICAgIGlmIHRlc3QgeCIkb3V0cHV0X29iaiIgIT0geCIkb2JqIjsgdGhlbgorCSRzaG93ICIkbXYgJG91dHB1dF9vYmogJG9iaiIKKwlpZiAkcnVuICRtdiAkb3V0cHV0X29iaiAkb2JqOyB0aGVuIDoKKwllbHNlCisJICBlcnJvcj0kPworCSAgJHJ1biAkcm0gJHJlbW92ZWxpc3QKKwkgIGV4aXQgJGVycm9yCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgQ3JlYXRlIGFuIGludmFsaWQgbGlidG9vbCBvYmplY3QgaWYgbm8gUElDLCBzbyB0aGF0IHdlIGRvIG5vdAorICAgICAgIyBhY2NpZGVudGFsbHkgbGluayBpdCBpbnRvIGEgcHJvZ3JhbS4KKyAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgorCSRzaG93ICJlY2hvIHRpbWVzdGFtcCA+ICRsaWJvYmoiCisJJHJ1biBldmFsICJlY2hvIHRpbWVzdGFtcCA+IFwkbGlib2JqIiB8fCBleGl0ICQ/CisgICAgICBlbHNlCisJIyBNb3ZlIHRoZSAubG8gZnJvbSB3aXRoaW4gb2JqZGlyCisJJHNob3cgIiRtdiAkbGlib2JqICRsb19saWJvYmoiCisJaWYgJHJ1biAkbXYgJGxpYm9iaiAkbG9fbGlib2JqOyB0aGVuIDoKKwllbHNlCisJICBlcnJvcj0kPworCSAgJHJ1biAkcm0gJHJlbW92ZWxpc3QKKwkgIGV4aXQgJGVycm9yCisJZmkKKyAgICAgIGZpCisgICAgZmkKKworICAgICMgVW5sb2NrIHRoZSBjcml0aWNhbCBzZWN0aW9uIGlmIGl0IHdhcyBsb2NrZWQKKyAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgIT0gbm87IHRoZW4KKyAgICAgICRydW4gJHJtICIkbG9ja2ZpbGUiCisgICAgZmkKKworICAgIGV4aXQgMAorICAgIDs7CisKKyAgIyBsaWJ0b29sIGxpbmsgbW9kZQorICBsaW5rIHwgcmVsaW5rKQorICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGxpbmsiCisgICAgY2FzZSAkaG9zdCBpbgorICAgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqKQorICAgICAgIyBJdCBpcyBpbXBvc3NpYmxlIHRvIGxpbmsgYSBkbGwgd2l0aG91dCB0aGlzIHNldHRpbmcsIGFuZAorICAgICAgIyB3ZSBzaG91bGRuJ3QgZm9yY2UgdGhlIG1ha2VmaWxlIG1haW50YWluZXIgdG8gZmlndXJlIG91dAorICAgICAgIyB3aGljaCBzeXN0ZW0gd2UgYXJlIGNvbXBpbGluZyBmb3IgaW4gb3JkZXIgdG8gcGFzcyBhbiBleHRyYQorICAgICAgIyBmbGFnIGZvciBldmVyeSBsaWJ0b29sIGludm9rYXRpb24uCisgICAgICAjIGFsbG93X3VuZGVmaW5lZD1ubworCisgICAgICAjIEZJWE1FOiBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBhcmUgcHJvYmxlbXMgd2l0aCB0aGUgYWJvdmUgd2hlbiB0cnlpbmcKKyAgICAgICMgdG8gbWFrZSBhIGRsbCB3aGljaCBoYXMgdW5kZWZpbmVkIHN5bWJvbHMsIGluIHdoaWNoIGNhc2Ugbm90CisgICAgICAjIGV2ZW4gYSBzdGF0aWMgbGlicmFyeSBpcyBidWlsdC4gIEZvciBub3csIHdlIG5lZWQgdG8gc3BlY2lmeQorICAgICAgIyAtbm8tdW5kZWZpbmVkIG9uIHRoZSBsaWJ0b29sIGxpbmsgbGluZSB3aGVuIHdlIGNhbiBiZSBjZXJ0YWluCisgICAgICAjIHRoYXQgYWxsIHN5bWJvbHMgYXJlIHNhdGlzZmllZCwgb3RoZXJ3aXNlIHdlIGdldCBhIHN0YXRpYyBsaWJyYXJ5LgorICAgICAgYWxsb3dfdW5kZWZpbmVkPXllcworICAgICAgOzsKKyAgICAqKQorICAgICAgYWxsb3dfdW5kZWZpbmVkPXllcworICAgICAgOzsKKyAgICBlc2FjCisgICAgbGlidG9vbF9hcmdzPSIkbm9ub3B0IgorICAgIGNvbXBpbGVfY29tbWFuZD0iJG5vbm9wdCIKKyAgICBmaW5hbGl6ZV9jb21tYW5kPSIkbm9ub3B0IgorCisgICAgY29tcGlsZV9ycGF0aD0KKyAgICBmaW5hbGl6ZV9ycGF0aD0KKyAgICBjb21waWxlX3NobGlicGF0aD0KKyAgICBmaW5hbGl6ZV9zaGxpYnBhdGg9CisgICAgY29udmVuaWVuY2U9CisgICAgb2xkX2NvbnZlbmllbmNlPQorICAgIGRlcGxpYnM9CisgICAgb2xkX2RlcGxpYnM9CisgICAgY29tcGlsZXJfZmxhZ3M9CisgICAgbGlua2VyX2ZsYWdzPQorICAgIGRsbHNlYXJjaHBhdGg9CisgICAgbGliX3NlYXJjaF9wYXRoPWBwd2RgCisKKyAgICBhdm9pZF92ZXJzaW9uPW5vCisgICAgZGxmaWxlcz0KKyAgICBkbHByZWZpbGVzPQorICAgIGRsc2VsZj1ubworICAgIGV4cG9ydF9keW5hbWljPW5vCisgICAgZXhwb3J0X3N5bWJvbHM9CisgICAgZXhwb3J0X3N5bWJvbHNfcmVnZXg9CisgICAgZ2VuZXJhdGVkPQorICAgIGxpYm9ianM9CisgICAgbHRsaWJzPQorICAgIG1vZHVsZT1ubworICAgIG5vX2luc3RhbGw9bm8KKyAgICBvYmpzPQorICAgIHByZWZlcl9zdGF0aWNfbGlicz1ubworICAgIHByZWxvYWQ9bm8KKyAgICBwcmV2PQorICAgIHByZXZhcmc9CisgICAgcmVsZWFzZT0KKyAgICBycGF0aD0KKyAgICB4cnBhdGg9CisgICAgcGVybV9ycGF0aD0KKyAgICB0ZW1wX3JwYXRoPQorICAgIHRocmVhZF9zYWZlPW5vCisgICAgdmluZm89CisKKyAgICAjIFdlIG5lZWQgdG8ga25vdyAtc3RhdGljLCB0byBnZXQgdGhlIHJpZ2h0IG91dHB1dCBmaWxlbmFtZXMuCisgICAgZm9yIGFyZworICAgIGRvCisgICAgICBjYXNlICRhcmcgaW4KKyAgICAgIC1hbGwtc3RhdGljIHwgLXN0YXRpYykKKwlpZiB0ZXN0ICJYJGFyZyIgPSAiWC1hbGwtc3RhdGljIjsgdGhlbgorCSAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAteiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCisJICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNvbXBsZXRlIHN0YXRpYyBsaW5raW5nIGlzIGltcG9zc2libGUgaW4gdGhpcyBjb25maWd1cmF0aW9uIiAxPiYyCisJICBmaQorCSAgaWYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCisJICAgIGRsb3Blbl9zZWxmPSRkbG9wZW5fc2VsZl9zdGF0aWMKKwkgIGZpCisJZWxzZQorCSAgaWYgdGVzdCAteiAiJHBpY19mbGFnIiAmJiB0ZXN0IC1uICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KKwkgICAgZGxvcGVuX3NlbGY9JGRsb3Blbl9zZWxmX3N0YXRpYworCSAgZmkKKwlmaQorCWJ1aWxkX2xpYnRvb2xfbGlicz1ubworCWJ1aWxkX29sZF9saWJzPXllcworCXByZWZlcl9zdGF0aWNfbGlicz15ZXMKKwlicmVhaworCTs7CisgICAgICBlc2FjCisgICAgZG9uZQorCisgICAgIyBTZWUgaWYgb3VyIHNoYXJlZCBhcmNoaXZlcyBkZXBlbmQgb24gc3RhdGljIGFyY2hpdmVzLgorICAgIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIiAmJiBidWlsZF9vbGRfbGlicz15ZXMKKworICAgICMgR28gdGhyb3VnaCB0aGUgYXJndW1lbnRzLCB0cmFuc2Zvcm1pbmcgdGhlbSBvbiB0aGUgd2F5LgorICAgIHdoaWxlIHRlc3QgJCMgLWd0IDA7IGRvCisgICAgICBhcmc9IiQxIgorICAgICAgc2hpZnQKKyAgICAgIGNhc2UgJGFyZyBpbgorICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCisJcWFyZz1cImAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYFwiICMjIyB0ZXN0c3VpdGU6IHNraXAgbmVzdGVkIHF1b3RpbmcgdGVzdAorCTs7CisgICAgICAqKSBxYXJnPSRhcmcgOzsKKyAgICAgIGVzYWMKKyAgICAgIGxpYnRvb2xfYXJncz0iJGxpYnRvb2xfYXJncyAkcWFyZyIKKworICAgICAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgICAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KKwljYXNlICRwcmV2IGluCisJb3V0cHV0KQorCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIEBPVVRQVVRAIgorCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgQE9VVFBVVEAiCisJICA7OworCWVzYWMKKworCWNhc2UgJHByZXYgaW4KKwlkbGZpbGVzfGRscHJlZmlsZXMpCisJICBpZiB0ZXN0ICIkcHJlbG9hZCIgPSBubzsgdGhlbgorCSAgICAjIEFkZCB0aGUgc3ltYm9sIG9iamVjdCBpbnRvIHRoZSBsaW5raW5nIGNvbW1hbmRzLgorCSAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgQFNZTUZJTEVAIgorCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCBAU1lNRklMRUAiCisJICAgIHByZWxvYWQ9eWVzCisJICBmaQorCSAgY2FzZSAkYXJnIGluCisJICAqLmxhIHwgKi5sbykgOzsgICMgV2UgaGFuZGxlIHRoZXNlIGNhc2VzIGJlbG93LgorCSAgZm9yY2UpCisJICAgIGlmIHRlc3QgIiRkbHNlbGYiID0gbm87IHRoZW4KKwkgICAgICBkbHNlbGY9bmVlZGxlc3MKKwkgICAgICBleHBvcnRfZHluYW1pYz15ZXMKKwkgICAgZmkKKwkgICAgcHJldj0KKwkgICAgY29udGludWUKKwkgICAgOzsKKwkgIHNlbGYpCisJICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KKwkgICAgICBkbHNlbGY9eWVzCisJICAgIGVsaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlcyAmJiB0ZXN0ICIkZGxvcGVuX3NlbGYiICE9IHllczsgdGhlbgorCSAgICAgIGRsc2VsZj15ZXMKKwkgICAgZWxzZQorCSAgICAgIGRsc2VsZj1uZWVkbGVzcworCSAgICAgIGV4cG9ydF9keW5hbWljPXllcworCSAgICBmaQorCSAgICBwcmV2PQorCSAgICBjb250aW51ZQorCSAgICA7OworCSAgKikKKwkgICAgaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgorCSAgICAgIGRsZmlsZXM9IiRkbGZpbGVzICRhcmciCisJICAgIGVsc2UKKwkgICAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkYXJnIgorCSAgICBmaQorCSAgICBwcmV2PQorCSAgICBjb250aW51ZQorCSAgICA7OworCSAgZXNhYworCSAgOzsKKwlleHBzeW1zKQorCSAgZXhwb3J0X3N5bWJvbHM9IiRhcmciCisJICBpZiB0ZXN0ICEgLWYgIiRhcmciOyB0aGVuCisJICAgICRlY2hvICIkbW9kZW5hbWU6IHN5bWJvbCBmaWxlIFxgJGFyZycgZG9lcyBub3QgZXhpc3QiCisJICAgIGV4aXQgMQorCSAgZmkKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlleHBzeW1zX3JlZ2V4KQorCSAgZXhwb3J0X3N5bWJvbHNfcmVnZXg9IiRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJcmVsZWFzZSkKKwkgIHJlbGVhc2U9Ii0kYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCXJwYXRoIHwgeHJwYXRoKQorCSAgIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCisJICBjYXNlICRhcmcgaW4KKwkgIFtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgOzsKKwkgICopCisJICAgICRlY2hvICIkbW9kZW5hbWU6IG9ubHkgYWJzb2x1dGUgcnVuLXBhdGhzIGFyZSBhbGxvd2VkIiAxPiYyCisJICAgIGV4aXQgMQorCSAgICA7OworCSAgZXNhYworCSAgaWYgdGVzdCAiJHByZXYiID0gcnBhdGg7IHRoZW4KKwkgICAgY2FzZSAiJHJwYXRoICIgaW4KKwkgICAgKiIgJGFyZyAiKikgOzsKKwkgICAgKikgcnBhdGg9IiRycGF0aCAkYXJnIiA7OworCSAgICBlc2FjCisJICBlbHNlCisJICAgIGNhc2UgIiR4cnBhdGggIiBpbgorCSAgICAqIiAkYXJnICIqKSA7OworCSAgICAqKSB4cnBhdGg9IiR4cnBhdGggJGFyZyIgOzsKKwkgICAgZXNhYworCSAgZmkKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwl4Y29tcGlsZXIpCisJICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRxYXJnIgorCSAgcHJldj0KKwkgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkcWFyZyIKKwkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRxYXJnIgorCSAgY29udGludWUKKwkgIDs7CisJeGxpbmtlcikKKwkgIGxpbmtlcl9mbGFncz0iJGxpbmtlcl9mbGFncyAkcWFyZyIKKwkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJHdsJHFhcmciCisJICBwcmV2PQorCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICR3bCRxYXJnIgorCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJHdsJHFhcmciCisJICBjb250aW51ZQorCSAgOzsKKwkqKQorCSAgZXZhbCAiJHByZXY9XCJcJGFyZ1wiIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCWVzYWMKKyAgICAgIGZpICMgdGVzdCAtbiAkcHJldgorCisgICAgICBwcmV2YXJnPSIkYXJnIgorCisgICAgICBjYXNlICRhcmcgaW4KKyAgICAgIC1hbGwtc3RhdGljKQorCWlmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgorCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRsaW5rX3N0YXRpY19mbGFnIgorCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGxpbmtfc3RhdGljX2ZsYWciCisJZmkKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1hbGxvdy11bmRlZmluZWQpCisJIyBGSVhNRTogcmVtb3ZlIHRoaXMgZmxhZyBzb21ldGltZSBpbiB0aGUgZnV0dXJlLgorCSRlY2hvICIkbW9kZW5hbWU6IFxgLWFsbG93LXVuZGVmaW5lZCcgaXMgZGVwcmVjYXRlZCBiZWNhdXNlIGl0IGlzIHRoZSBkZWZhdWx0IiAxPiYyCisJY29udGludWUKKwk7OworCisgICAgICAtYXZvaWQtdmVyc2lvbikKKwlhdm9pZF92ZXJzaW9uPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLWRsb3BlbikKKwlwcmV2PWRsZmlsZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1kbHByZW9wZW4pCisJcHJldj1kbHByZWZpbGVzCisJY29udGludWUKKwk7OworCisgICAgICAtZXhwb3J0LWR5bmFtaWMpCisJZXhwb3J0X2R5bmFtaWM9eWVzCisJY29udGludWUKKwk7OworCisgICAgICAtZXhwb3J0LXN5bWJvbHMgfCAtZXhwb3J0LXN5bWJvbHMtcmVnZXgpCisJaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiB8fCB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCisJICAkZWNobyAiJG1vZGVuYW1lOiBtb3JlIHRoYW4gb25lIC1leHBvcnRlZC1zeW1ib2xzIGFyZ3VtZW50IGlzIG5vdCBhbGxvd2VkIgorCSAgZXhpdCAxCisJZmkKKwlpZiB0ZXN0ICJYJGFyZyIgPSAiWC1leHBvcnQtc3ltYm9scyI7IHRoZW4KKwkgIHByZXY9ZXhwc3ltcworCWVsc2UKKwkgIHByZXY9ZXhwc3ltc19yZWdleAorCWZpCisJY29udGludWUKKwk7OworCisgICAgICAjIFRoZSBuYXRpdmUgSVJJWCBsaW5rZXIgdW5kZXJzdGFuZHMgLUxBTkc6KiwgLUxJU1Q6KiBhbmQgLUxOTzoqCisgICAgICAjIHNvLCBpZiB3ZSBzZWUgdGhlc2UgZmxhZ3MgYmUgY2FyZWZ1bCBub3QgdG8gdHJlYXQgdGhlbSBsaWtlIC1MCisgICAgICAtTFtBLVpdW0EtWl0qOiopCisJY2FzZSAkd2l0aF9nY2MvJGhvc3QgaW4KKwluby8qLSotaXJpeCopCisJICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGFyZyIKKwkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRhcmciCisJICA7OworCWVzYWMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1MKikKKwlkaXI9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncy9eLUwvLydgCisJIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCisJY2FzZSAkZGlyIGluCisJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OworCSopCisJICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCisJICBpZiB0ZXN0IC16ICIkYWJzZGlyIjsgdGhlbgorCSAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZGV0ZXJtaW5lIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIG9mIFxgJGRpciciIDE+JjIKKwkgICAgZXhpdCAxCisJICBmaQorCSAgZGlyPSIkYWJzZGlyIgorCSAgOzsKKwllc2FjCisJY2FzZSAiJGRlcGxpYnMgIiBpbgorCSoiIC1MJGRpciAiKikgOzsKKwkqKQorCSAgZGVwbGlicz0iJGRlcGxpYnMgLUwkZGlyIgorCSAgbGliX3NlYXJjaF9wYXRoPSIkbGliX3NlYXJjaF9wYXRoICRkaXIiCisJICA7OworCWVzYWMKKwljYXNlICRob3N0IGluCisJKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLW9zMiopCisJICBjYXNlIDokZGxsc2VhcmNocGF0aDogaW4KKwkgICoiOiRkaXI6IiopIDs7CisJICAqKSBkbGxzZWFyY2hwYXRoPSIkZGxsc2VhcmNocGF0aDokZGlyIjs7CisJICBlc2FjCisJICA7OworCWVzYWMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1sKikKKwlpZiB0ZXN0ICJYJGFyZyIgPSAiWC1sYyIgfHwgdGVzdCAiWCRhcmciID0gIlgtbG0iOyB0aGVuCisJICBjYXNlICRob3N0IGluCisJICAqLSotY3lnd2luKiB8ICotKi1wdzMyKiB8ICotKi1iZW9zKikKKwkgICAgIyBUaGVzZSBzeXN0ZW1zIGRvbid0IGFjdHVhbGx5IGhhdmUgYSBDIG9yIG1hdGggbGlicmFyeSAoYXMgc3VjaCkKKwkgICAgY29udGludWUKKwkgICAgOzsKKwkgICotKi1taW5ndyogfCAqLSotb3MyKikKKwkgICAgIyBUaGVzZSBzeXN0ZW1zIGRvbid0IGFjdHVhbGx5IGhhdmUgYSBDIGxpYnJhcnkgKGFzIHN1Y2gpCisJICAgIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiAmJiBjb250aW51ZQorCSAgICA7OworCSAgKi0qLW9wZW5ic2QqKQorCSAgICAjIERvIG5vdCBpbmNsdWRlIGxpYmMgZHVlIHRvIHVzIGhhdmluZyBsaWJjL2xpYmNfci4KKwkgICAgdGVzdCAiWCRhcmciID0gIlgtbGMiICYmIGNvbnRpbnVlCisJICAgIDs7CisJICBlc2FjCisJIGVsaWYgdGVzdCAiWCRhcmciID0gIlgtbGNfciI7IHRoZW4KKwkgIGNhc2UgJGhvc3QgaW4KKwkgICotKi1vcGVuYnNkKikKKwkgICAgIyBEbyBub3QgaW5jbHVkZSBsaWJjX3IgZGlyZWN0bHksIHVzZSAtcHRocmVhZCBmbGFnLgorCSAgICBjb250aW51ZQorCSAgICA7OworCSAgZXNhYworCWZpCisJZGVwbGlicz0iJGRlcGxpYnMgJGFyZyIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1tb2R1bGUpCisJbW9kdWxlPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLW5vLWZhc3QtaW5zdGFsbCkKKwlmYXN0X2luc3RhbGw9bm8KKwljb250aW51ZQorCTs7CisKKyAgICAgIC1uby1pbnN0YWxsKQorCWNhc2UgJGhvc3QgaW4KKwkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKikKKwkgICMgVGhlIFBBVEggaGFja2VyeSBpbiB3cmFwcGVyIHNjcmlwdHMgaXMgcmVxdWlyZWQgb24gV2luZG93cworCSAgIyBpbiBvcmRlciBmb3IgdGhlIGxvYWRlciB0byBmaW5kIGFueSBkbGxzIGl0IG5lZWRzLgorCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtbm8taW5zdGFsbCcgaXMgaWdub3JlZCBmb3IgJGhvc3QiIDE+JjIKKwkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGFzc3VtaW5nIFxgLW5vLWZhc3QtaW5zdGFsbCcgaW5zdGVhZCIgMT4mMgorCSAgZmFzdF9pbnN0YWxsPW5vCisJICA7OworCSopIG5vX2luc3RhbGw9eWVzIDs7CisJZXNhYworCWNvbnRpbnVlCisJOzsKKworICAgICAgLW5vLXVuZGVmaW5lZCkKKwlhbGxvd191bmRlZmluZWQ9bm8KKwljb250aW51ZQorCTs7CisKKyAgICAgIC1vKSBwcmV2PW91dHB1dCA7OworCisgICAgICAtcmVsZWFzZSkKKwlwcmV2PXJlbGVhc2UKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1ycGF0aCkKKwlwcmV2PXJwYXRoCisJY29udGludWUKKwk7OworCisgICAgICAtUikKKwlwcmV2PXhycGF0aAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLVIqKQorCWRpcj1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzL14tUi8vJ2AKKwkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KKwljYXNlICRkaXIgaW4KKwlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIDs7CisJKikKKwkgICRlY2hvICIkbW9kZW5hbWU6IG9ubHkgYWJzb2x1dGUgcnVuLXBhdGhzIGFyZSBhbGxvd2VkIiAxPiYyCisJICBleGl0IDEKKwkgIDs7CisJZXNhYworCWNhc2UgIiR4cnBhdGggIiBpbgorCSoiICRkaXIgIiopIDs7CisJKikgeHJwYXRoPSIkeHJwYXRoICRkaXIiIDs7CisJZXNhYworCWNvbnRpbnVlCisJOzsKKworICAgICAgLXN0YXRpYykKKwkjIFRoZSBlZmZlY3RzIG9mIC1zdGF0aWMgYXJlIGRlZmluZWQgaW4gYSBwcmV2aW91cyBsb29wLgorCSMgV2UgdXNlZCB0byBkbyB0aGUgc2FtZSBhcyAtYWxsLXN0YXRpYyBvbiBwbGF0Zm9ybXMgdGhhdAorCSMgZGlkbid0IGhhdmUgYSBQSUMgZmxhZywgYnV0IHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIGVmZmVjdHMKKwkjIHdvdWxkIGJlIGVxdWl2YWxlbnQgd2FzIHdyb25nLiAgSXQgd291bGQgYnJlYWsgb24gYXQgbGVhc3QKKwkjIERpZ2l0YWwgVW5peCBhbmQgQUlYLgorCWNvbnRpbnVlCisJOzsKKworICAgICAgLXRocmVhZC1zYWZlKQorCXRocmVhZF9zYWZlPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLXZlcnNpb24taW5mbykKKwlwcmV2PXZpbmZvCisJY29udGludWUKKwk7OworCisgICAgICAtV2MsKikKKwlhcmdzPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiIC1lICdzL14tV2MsLy8nYAorCWFyZz0KKwlzYXZlX2lmcz0iJElGUyI7IElGUz0nLCcKKwlmb3IgZmxhZyBpbiAkYXJnczsgZG8KKwkgIElGUz0iJHNhdmVfaWZzIgorCSAgY2FzZSAkZmxhZyBpbgorCSAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKKwkgICAgZmxhZz0iXCIkZmxhZ1wiIgorCSAgICA7OworCSAgZXNhYworCSAgYXJnPSIkYXJnICR3bCRmbGFnIgorCSAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkZmxhZyIKKwlkb25lCisJSUZTPSIkc2F2ZV9pZnMiCisJYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgInMvXiAvLyJgCisJOzsKKworICAgICAgLVdsLCopCisJYXJncz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0IiAtZSAncy9eLVdsLC8vJ2AKKwlhcmc9CisJc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JywnCisJZm9yIGZsYWcgaW4gJGFyZ3M7IGRvCisJICBJRlM9IiRzYXZlX2lmcyIKKwkgIGNhc2UgJGZsYWcgaW4KKwkgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCisJICAgIGZsYWc9IlwiJGZsYWdcIiIKKwkgICAgOzsKKwkgIGVzYWMKKwkgIGFyZz0iJGFyZyAkd2wkZmxhZyIKKwkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJHdsJGZsYWciCisJICBsaW5rZXJfZmxhZ3M9IiRsaW5rZXJfZmxhZ3MgJGZsYWciCisJZG9uZQorCUlGUz0iJHNhdmVfaWZzIgorCWFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICJzL14gLy8iYAorCTs7CisKKyAgICAgIC1YY29tcGlsZXIpCisJcHJldj14Y29tcGlsZXIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1YbGlua2VyKQorCXByZXY9eGxpbmtlcgorCWNvbnRpbnVlCisJOzsKKworICAgICAgIyBTb21lIG90aGVyIGNvbXBpbGVyIGZsYWcuCisgICAgICAtKiB8ICsqKQorCSMgVW5rbm93biBhcmd1bWVudHMgaW4gYm90aCBmaW5hbGl6ZV9jb21tYW5kIGFuZCBjb21waWxlX2NvbW1hbmQgbmVlZAorCSMgdG8gYmUgYWVzdGhldGljYWxseSBxdW90ZWQgYmVjYXVzZSB0aGV5IGFyZSBldmFsZWQgbGF0ZXIuCisJYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorCWNhc2UgJGFyZyBpbgorCSpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorCSAgYXJnPSJcIiRhcmdcIiIKKwkgIDs7CisJZXNhYworCTs7CisKKyAgICAgICoubG8gfCAqLiRvYmpleHQpCisJIyBBIGxpYnJhcnkgb3Igc3RhbmRhcmQgb2JqZWN0LgorCWlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KKwkgICMgVGhpcyBmaWxlIHdhcyBzcGVjaWZpZWQgd2l0aCAtZGxvcGVuLgorCSAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiA9IHllczsgdGhlbgorCSAgICBkbGZpbGVzPSIkZGxmaWxlcyAkYXJnIgorCSAgICBwcmV2PQorCSAgICBjb250aW51ZQorCSAgZWxzZQorCSAgICAjIElmIGxpYnRvb2wgb2JqZWN0cyBhcmUgdW5zdXBwb3J0ZWQsIHRoZW4gd2UgbmVlZCB0byBwcmVsb2FkLgorCSAgICBwcmV2PWRscHJlZmlsZXMKKwkgIGZpCisJZmkKKworCWlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KKwkgICMgUHJlbG9hZCB0aGUgb2xkLXN0eWxlIG9iamVjdC4KKwkgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICJgJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkbG8ybyJgCisJICBwcmV2PQorCWVsc2UKKwkgIGNhc2UgJGFyZyBpbgorCSAgKi5sbykgbGlib2Jqcz0iJGxpYm9ianMgJGFyZyIgOzsKKwkgICopIG9ianM9IiRvYmpzICRhcmciIDs7CisJICBlc2FjCisJZmkKKwk7OworCisgICAgICAqLiRsaWJleHQpCisJIyBBbiBhcmNoaXZlLgorCWRlcGxpYnM9IiRkZXBsaWJzICRhcmciCisJb2xkX2RlcGxpYnM9IiRvbGRfZGVwbGlicyAkYXJnIgorCWNvbnRpbnVlCisJOzsKKworICAgICAgKi5sYSkKKwkjIEEgbGlidG9vbC1jb250cm9sbGVkIGxpYnJhcnkuCisKKwlpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCisJICAjIFRoaXMgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRsb3Blbi4KKwkgIGRsZmlsZXM9IiRkbGZpbGVzICRhcmciCisJICBwcmV2PQorCWVsaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgorCSAgIyBUaGUgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRscHJlb3Blbi4KKwkgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRhcmciCisJICBwcmV2PQorCWVsc2UKKwkgIGRlcGxpYnM9IiRkZXBsaWJzICRhcmciCisJZmkKKwljb250aW51ZQorCTs7CisKKyAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBhcmd1bWVudC4KKyAgICAgICopCisJIyBVbmtub3duIGFyZ3VtZW50cyBpbiBib3RoIGZpbmFsaXplX2NvbW1hbmQgYW5kIGNvbXBpbGVfY29tbWFuZCBuZWVkCisJIyB0byBiZSBhZXN0aGV0aWNhbGx5IHF1b3RlZCBiZWNhdXNlIHRoZXkgYXJlIGV2YWxlZCBsYXRlci4KKwlhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisJY2FzZSAkYXJnIGluCisJKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCisJICBhcmc9IlwiJGFyZ1wiIgorCSAgOzsKKwllc2FjCisJOzsKKyAgICAgIGVzYWMgIyBhcmcKKworICAgICAgIyBOb3cgYWN0dWFsbHkgc3Vic3RpdHV0ZSB0aGUgYXJndW1lbnQgaW50byB0aGUgY29tbWFuZHMuCisgICAgICBpZiB0ZXN0IC1uICIkYXJnIjsgdGhlbgorCWNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYXJnIgorCWZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRhcmciCisgICAgICBmaQorICAgIGRvbmUgIyBhcmd1bWVudCBwYXJzaW5nIGxvb3AKKworICAgIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgorICAgICAgJGVjaG8gIiRtb2RlbmFtZTogdGhlIFxgJHByZXZhcmcnIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIgMT4mMgorICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgICBleGl0IDEKKyAgICBmaQorCisgICAgaWYgdGVzdCAiJGV4cG9ydF9keW5hbWljIiA9IHllcyAmJiB0ZXN0IC1uICIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIjsgdGhlbgorICAgICAgZXZhbCBhcmc9XCIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKKyAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYXJnIgorICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKKyAgICBmaQorCisgICAgIyBjYWxjdWxhdGUgdGhlIG5hbWUgb2YgdGhlIGZpbGUsIHdpdGhvdXQgaXRzIGRpcmVjdG9yeQorICAgIG91dHB1dG5hbWU9YCRlY2hvICJYJG91dHB1dCIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorICAgIGxpYm9ianNfc2F2ZT0iJGxpYm9ianMiCisKKyAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KKyAgICAgICMgZ2V0IHRoZSBkaXJlY3RvcmllcyBsaXN0ZWQgaW4gJHNobGlicGF0aF92YXIKKyAgICAgIGV2YWwgc2hsaWJfc2VhcmNoX3BhdGg9XGBcJGVjaG8gXCJYXCR7JHNobGlicGF0aF92YXJ9XCIgXHwgXCRYc2VkIC1lIFwncy86LyAvZ1wnXGAKKyAgICBlbHNlCisgICAgICBzaGxpYl9zZWFyY2hfcGF0aD0KKyAgICBmaQorICAgIGV2YWwgc3lzX2xpYl9zZWFyY2hfcGF0aD1cIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWNcIgorICAgIGV2YWwgc3lzX2xpYl9kbHNlYXJjaF9wYXRoPVwiJHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjXCIKKworICAgIG91dHB1dF9vYmpkaXI9YCRlY2hvICJYJG91dHB1dCIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAorICAgIGlmIHRlc3QgIlgkb3V0cHV0X29iamRpciIgPSAiWCRvdXRwdXQiOyB0aGVuCisgICAgICBvdXRwdXRfb2JqZGlyPSIkb2JqZGlyIgorICAgIGVsc2UKKyAgICAgIG91dHB1dF9vYmpkaXI9IiRvdXRwdXRfb2JqZGlyLyRvYmpkaXIiCisgICAgZmkKKyAgICAjIENyZWF0ZSB0aGUgb2JqZWN0IGRpcmVjdG9yeS4KKyAgICBpZiB0ZXN0ICEgLWQgJG91dHB1dF9vYmpkaXI7IHRoZW4KKyAgICAgICRzaG93ICIkbWtkaXIgJG91dHB1dF9vYmpkaXIiCisgICAgICAkcnVuICRta2RpciAkb3V0cHV0X29iamRpcgorICAgICAgc3RhdHVzPSQ/CisgICAgICBpZiB0ZXN0ICRzdGF0dXMgLW5lIDAgJiYgdGVzdCAhIC1kICRvdXRwdXRfb2JqZGlyOyB0aGVuCisJZXhpdCAkc3RhdHVzCisgICAgICBmaQorICAgIGZpCisKKyAgICAjIERldGVybWluZSB0aGUgdHlwZSBvZiBvdXRwdXQKKyAgICBjYXNlICRvdXRwdXQgaW4KKyAgICAiIikKKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYW4gb3V0cHV0IGZpbGUiIDE+JjIKKyAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgZXhpdCAxCisgICAgICA7OworICAgICouJGxpYmV4dCkgbGlua21vZGU9b2xkbGliIDs7CisgICAgKi5sbyB8ICouJG9iamV4dCkgbGlua21vZGU9b2JqIDs7CisgICAgKi5sYSkgbGlua21vZGU9bGliIDs7CisgICAgKikgbGlua21vZGU9cHJvZyA7OyAjIEFueXRoaW5nIGVsc2Ugc2hvdWxkIGJlIGEgcHJvZ3JhbS4KKyAgICBlc2FjCisKKyAgICBzcGVjaWFsZGVwbGlicz0KKyAgICBsaWJzPQorICAgICMgRmluZCBhbGwgaW50ZXJkZXBlbmRlbnQgZGVwbGlicyBieSBzZWFyY2hpbmcgZm9yIGxpYnJhcmllcworICAgICMgdGhhdCBhcmUgbGlua2VkIG1vcmUgdGhhbiBvbmNlIChlLmcuIC1sYSAtbGIgLWxhKQorICAgIGZvciBkZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisgICAgICBjYXNlICIkbGlicyAiIGluCisgICAgICAqIiAkZGVwbGliICIqKSBzcGVjaWFsZGVwbGlicz0iJHNwZWNpYWxkZXBsaWJzICRkZXBsaWIiIDs7CisgICAgICBlc2FjCisgICAgICBsaWJzPSIkbGlicyAkZGVwbGliIgorICAgIGRvbmUKKyAgICBkZXBsaWJzPQorICAgIG5ld2RlcGVuZGVuY3lfbGlicz0KKyAgICBuZXdsaWJfc2VhcmNoX3BhdGg9CisgICAgbmVlZF9yZWxpbms9bm8gIyB3aGV0aGVyIHdlJ3JlIGxpbmtpbmcgYW55IHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzCisgICAgbm90aW5zdF9kZXBsaWJzPSAjIG5vdC1pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMKKyAgICBub3RpbnN0X3BhdGg9ICMgcGF0aHMgdGhhdCBjb250YWluIG5vdC1pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMKKyAgICBjYXNlICRsaW5rbW9kZSBpbgorICAgIGxpYikKKwlwYXNzZXM9ImNvbnYgbGluayIKKwlmb3IgZmlsZSBpbiAkZGxmaWxlcyAkZGxwcmVmaWxlczsgZG8KKwkgIGNhc2UgJGZpbGUgaW4KKwkgICoubGEpIDs7CisJICAqKQorCSAgICAkZWNobyAiJG1vZGVuYW1lOiBsaWJyYXJpZXMgY2FuIFxgLWRsb3Blbicgb25seSBsaWJ0b29sIGxpYnJhcmllczogJGZpbGUiIDE+JjIKKwkgICAgZXhpdCAxCisJICAgIDs7CisJICBlc2FjCisJZG9uZQorCTs7CisgICAgcHJvZykKKwljb21waWxlX2RlcGxpYnM9CisJZmluYWxpemVfZGVwbGlicz0KKwlhbGxkZXBsaWJzPW5vCisJbmV3ZGxmaWxlcz0KKwluZXdkbHByZWZpbGVzPQorCXBhc3Nlcz0iY29udiBzY2FuIGRsb3BlbiBkbHByZW9wZW4gbGluayIKKwk7OworICAgICopICBwYXNzZXM9ImNvbnYiCisJOzsKKyAgICBlc2FjCisgICAgZm9yIHBhc3MgaW4gJHBhc3NlczsgZG8KKyAgICAgIGlmIHRlc3QgJGxpbmttb2RlID0gcHJvZzsgdGhlbgorCSMgRGV0ZXJtaW5lIHdoaWNoIGZpbGVzIHRvIHByb2Nlc3MKKwljYXNlICRwYXNzIGluCisJZGxvcGVuKQorCSAgbGlicz0iJGRsZmlsZXMiCisJICBzYXZlX2RlcGxpYnM9IiRkZXBsaWJzIiAjIENvbGxlY3QgZGxwcmVvcGVuZWQgbGlicmFyaWVzCisJICBkZXBsaWJzPQorCSAgOzsKKwlkbHByZW9wZW4pIGxpYnM9IiRkbHByZWZpbGVzIiA7OworCWxpbmspIGxpYnM9IiRkZXBsaWJzICVERVBMSUJTJSAkZGVwZW5kZW5jeV9saWJzIiA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBmb3IgZGVwbGliIGluICRsaWJzOyBkbworCWxpYj0KKwlmb3VuZD1ubworCWNhc2UgJGRlcGxpYiBpbgorCS1sKikKKwkgIGlmIHRlc3QgJGxpbmttb2RlID0gb2xkbGliICYmIHRlc3QgJGxpbmttb2RlID0gb2JqOyB0aGVuCisJICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWwnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzL29iamVjdHM6ICRkZXBsaWIiIDE+JjIKKwkgICAgY29udGludWUKKwkgIGZpCisJICBpZiB0ZXN0ICRwYXNzID0gY29udjsgdGhlbgorCSAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICBjb250aW51ZQorCSAgZmkKKwkgIG5hbWU9YCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLWwvLydgCisJICBmb3Igc2VhcmNoZGlyIGluICRuZXdsaWJfc2VhcmNoX3BhdGggJGxpYl9zZWFyY2hfcGF0aCAkc3lzX2xpYl9zZWFyY2hfcGF0aCAkc2hsaWJfc2VhcmNoX3BhdGg7IGRvCisJICAgICMgU2VhcmNoIHRoZSBsaWJ0b29sIGxpYnJhcnkKKwkgICAgbGliPSIkc2VhcmNoZGlyL2xpYiR7bmFtZX0ubGEiCisJICAgIGlmIHRlc3QgLWYgIiRsaWIiOyB0aGVuCisJICAgICAgZm91bmQ9eWVzCisJICAgICAgYnJlYWsKKwkgICAgZmkKKwkgIGRvbmUKKwkgIGlmIHRlc3QgIiRmb3VuZCIgIT0geWVzOyB0aGVuCisJICAgICMgZGVwbGliIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIGxpYnRvb2wgbGlicmFyeQorCSAgICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KKwkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgICB0ZXN0ICRsaW5rbW9kZSA9IGxpYiAmJiBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkgICAgZmkKKwkgICAgY29udGludWUKKwkgIGZpCisJICA7OyAjIC1sCisJLUwqKQorCSAgY2FzZSAkbGlua21vZGUgaW4KKwkgIGxpYikKKwkgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgdGVzdCAkcGFzcyA9IGNvbnYgJiYgY29udGludWUKKwkgICAgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCisJICAgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAiYCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLUwvLydgCisJICAgIDs7CisJICBwcm9nKQorCSAgICBpZiB0ZXN0ICRwYXNzID0gY29udjsgdGhlbgorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgICAgY29udGludWUKKwkgICAgZmkKKwkgICAgaWYgdGVzdCAkcGFzcyA9IHNjYW47IHRoZW4KKwkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICAgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAiYCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLUwvLydgCisJICAgIGVsc2UKKwkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBmaQorCSAgICA7OworCSAgKikKKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtTCcgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMvb2JqZWN0czogJGRlcGxpYiIgMT4mMgorCSAgICA7OworCSAgZXNhYyAjIGxpbmttb2RlCisJICBjb250aW51ZQorCSAgOzsgIyAtTAorCS1SKikKKwkgIGlmIHRlc3QgJHBhc3MgPSBsaW5rOyB0aGVuCisJICAgIGRpcj1gJGVjaG8gIlgkZGVwbGliIiB8ICRYc2VkIC1lICdzL14tUi8vJ2AKKwkgICAgIyBNYWtlIHN1cmUgdGhlIHhycGF0aCBjb250YWlucyBvbmx5IHVuaXF1ZSBkaXJlY3Rvcmllcy4KKwkgICAgY2FzZSAiJHhycGF0aCAiIGluCisJICAgICoiICRkaXIgIiopIDs7CisJICAgICopIHhycGF0aD0iJHhycGF0aCAkZGlyIiA7OworCSAgICBlc2FjCisJICBmaQorCSAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgIGNvbnRpbnVlCisJICA7OworCSoubGEpIGxpYj0iJGRlcGxpYiIgOzsKKwkqLiRsaWJleHQpCisJICBpZiB0ZXN0ICRwYXNzID0gY29udjsgdGhlbgorCSAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICBjb250aW51ZQorCSAgZmkKKwkgIGNhc2UgJGxpbmttb2RlIGluCisJICBsaWIpCisJICAgIGlmIHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgIT0gcGFzc19hbGw7IHRoZW4KKwkgICAgICBlY2hvCisJICAgICAgZWNobyAiKioqIFdhcm5pbmc6IFRoaXMgbGlicmFyeSBuZWVkcyBzb21lIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgYnkgJGRlcGxpYi4iCisJICAgICAgZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKKwkgICAgICBlY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgorCSAgICAgIGVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZS4iCisJICAgIGVsc2UKKwkgICAgICBlY2hvCisJICAgICAgZWNobyAiKioqIFdhcm5pbmc6IExpbmtpbmcgdGhlIHNoYXJlZCBsaWJyYXJ5ICRvdXRwdXQgYWdhaW5zdCB0aGUiCisJICAgICAgZWNobyAiKioqIHN0YXRpYyBsaWJyYXJ5ICRkZXBsaWIgaXMgbm90IHBvcnRhYmxlISIKKwkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICBmaQorCSAgICBjb250aW51ZQorCSAgICA7OworCSAgcHJvZykKKwkgICAgaWYgdGVzdCAkcGFzcyAhPSBsaW5rOyB0aGVuCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgZWxzZQorCSAgICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgorCSAgICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCisJICAgIGZpCisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICBlc2FjICMgbGlua21vZGUKKwkgIDs7ICMgKi4kbGliZXh0CisJKi5sbyB8ICouJG9iamV4dCkKKwkgIGlmIHRlc3QgJHBhc3MgPSBkbHByZW9wZW4gfHwgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiAhPSB5ZXMgfHwgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBubzsgdGhlbgorCSAgICAjIElmIHRoZXJlIGlzIG5vIGRsb3BlbiBzdXBwb3J0IG9yIHdlJ3JlIGxpbmtpbmcgc3RhdGljYWxseSwKKwkgICAgIyB3ZSBuZWVkIHRvIHByZWxvYWQuCisJICAgIG5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRkZXBsaWIiCisJICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgorCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgZWxzZQorCSAgICBuZXdkbGZpbGVzPSIkbmV3ZGxmaWxlcyAkZGVwbGliIgorCSAgZmkKKwkgIGNvbnRpbnVlCisJICA7OworCSVERVBMSUJTJSkKKwkgIGFsbGRlcGxpYnM9eWVzCisJICBjb250aW51ZQorCSAgOzsKKwllc2FjICMgY2FzZSAkZGVwbGliCisJaWYgdGVzdCAkZm91bmQgPSB5ZXMgfHwgdGVzdCAtZiAiJGxpYiI7IHRoZW4gOgorCWVsc2UKKwkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIHRoZSBsaWJyYXJ5IFxgJGxpYiciIDE+JjIKKwkgIGV4aXQgMQorCWZpCisKKwkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgorCWlmIChzZWQgLWUgJzJxJyAkbGliIHwgZWdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKwllbHNlCisJICAkZWNobyAiJG1vZGVuYW1lOiBcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgorCSAgZXhpdCAxCisJZmkKKworCWxhZGlyPWAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKKwl0ZXN0ICJYJGxhZGlyIiA9ICJYJGxpYiIgJiYgbGFkaXI9Ii4iCisKKwlkbG5hbWU9CisJZGxvcGVuPQorCWRscHJlb3Blbj0KKwlsaWJkaXI9CisJbGlicmFyeV9uYW1lcz0KKwlvbGRfbGlicmFyeT0KKwkjIElmIHRoZSBsaWJyYXJ5IHdhcyBpbnN0YWxsZWQgd2l0aCBhbiBvbGQgcmVsZWFzZSBvZiBsaWJ0b29sLAorCSMgaXQgd2lsbCBub3QgcmVkZWZpbmUgdmFyaWFibGUgaW5zdGFsbGVkLgorCWluc3RhbGxlZD15ZXMKKworCSMgUmVhZCB0aGUgLmxhIGZpbGUKKwljYXNlICRsaWIgaW4KKwkqLyogfCAqXFwqKSAuICRsaWIgOzsKKwkqKSAuIC4vJGxpYiA7OworCWVzYWMKKworCWlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAibGliLGxpbmsiIHx8CisJICAgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLHNjYW4iIHx8CisJICAgeyB0ZXN0ICRsaW5rbW9kZSA9IG9sZGxpYiAmJiB0ZXN0ICRsaW5rbW9kZSA9IG9iajsgfTsgdGhlbgorCSAgICMgQWRkIGRsW3ByZV1vcGVuZWQgZmlsZXMgb2YgZGVwbGliCisJICB0ZXN0IC1uICIkZGxvcGVuIiAmJiBkbGZpbGVzPSIkZGxmaWxlcyAkZGxvcGVuIgorCSAgdGVzdCAtbiAiJGRscHJlb3BlbiIgJiYgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGRscHJlb3BlbiIKKwlmaQorCisJaWYgdGVzdCAkcGFzcyA9IGNvbnY7IHRoZW4KKwkgICMgT25seSBjaGVjayBmb3IgY29udmVuaWVuY2UgbGlicmFyaWVzCisJICBkZXBsaWJzPSIkbGliICRkZXBsaWJzIgorCSAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KKwkgICAgaWYgdGVzdCAteiAiJG9sZF9saWJyYXJ5IjsgdGhlbgorCSAgICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIG5hbWUgb2YgbGluayBsaWJyYXJ5IGZvciBcYCRsaWInIiAxPiYyCisJICAgICAgZXhpdCAxCisJICAgIGZpCisJICAgICMgSXQgaXMgYSBsaWJ0b29sIGNvbnZlbmllbmNlIGxpYnJhcnksIHNvIGFkZCBpbiBpdHMgb2JqZWN0cy4KKwkgICAgY29udmVuaWVuY2U9IiRjb252ZW5pZW5jZSAkbGFkaXIvJG9iamRpci8kb2xkX2xpYnJhcnkiCisJICAgIG9sZF9jb252ZW5pZW5jZT0iJG9sZF9jb252ZW5pZW5jZSAkbGFkaXIvJG9iamRpci8kb2xkX2xpYnJhcnkiCisJICAgIHRtcF9saWJzPQorCSAgICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgICBjYXNlICIkdG1wX2xpYnMgIiBpbgorCSAgICAgICoiICRkZXBsaWIgIiopIHNwZWNpYWxkZXBsaWJzPSIkc3BlY2lhbGRlcGxpYnMgJGRlcGxpYiIgOzsKKwkgICAgICBlc2FjCisJICAgICAgdG1wX2xpYnM9IiR0bXBfbGlicyAkZGVwbGliIgorCSAgICBkb25lCisJICBlbGlmIHRlc3QgJGxpbmttb2RlICE9IHByb2cgJiYgdGVzdCAkbGlua21vZGUgIT0gbGliOyB0aGVuCisJICAgICRlY2hvICIkbW9kZW5hbWU6IFxgJGxpYicgaXMgbm90IGEgY29udmVuaWVuY2UgbGlicmFyeSIgMT4mMgorCSAgICBleGl0IDEKKwkgIGZpCisJICBjb250aW51ZQorCWZpICMgJHBhc3MgPSBjb252CisKKwkjIEdldCB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSB3ZSBsaW5rIGFnYWluc3QuCisJbGlua2xpYj0KKwlmb3IgbCBpbiAkb2xkX2xpYnJhcnkgJGxpYnJhcnlfbmFtZXM7IGRvCisJICBsaW5rbGliPSIkbCIKKwlkb25lCisJaWYgdGVzdCAteiAiJGxpbmtsaWIiOyB0aGVuCisJICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBuYW1lIG9mIGxpbmsgbGlicmFyeSBmb3IgXGAkbGliJyIgMT4mMgorCSAgZXhpdCAxCisJZmkKKworCSMgVGhpcyBsaWJyYXJ5IHdhcyBzcGVjaWZpZWQgd2l0aCAtZGxvcGVuLgorCWlmIHRlc3QgJHBhc3MgPSBkbG9wZW47IHRoZW4KKwkgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCisJICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCAtZGxvcGVuIGEgY29udmVuaWVuY2UgbGlicmFyeTogXGAkbGliJyIgMT4mMgorCSAgICBleGl0IDEKKwkgIGZpCisJICBpZiB0ZXN0IC16ICIkZGxuYW1lIiB8fCB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiICE9IHllcyB8fCB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG5vOyB0aGVuCisJICAgICMgSWYgdGhlcmUgaXMgbm8gZGxuYW1lLCBubyBkbG9wZW4gc3VwcG9ydCBvciB3ZSdyZSBsaW5raW5nCisJICAgICMgc3RhdGljYWxseSwgd2UgbmVlZCB0byBwcmVsb2FkLgorCSAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkbGliIgorCSAgZWxzZQorCSAgICBuZXdkbGZpbGVzPSIkbmV3ZGxmaWxlcyAkbGliIgorCSAgZmkKKwkgIGNvbnRpbnVlCisJZmkgIyAkcGFzcyA9IGRsb3BlbgorCisJIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCisJY2FzZSAkbGFkaXIgaW4KKwlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFic19sYWRpcj0iJGxhZGlyIiA7OworCSopCisJICBhYnNfbGFkaXI9YGNkICIkbGFkaXIiICYmIHB3ZGAKKwkgIGlmIHRlc3QgLXogIiRhYnNfbGFkaXIiOyB0aGVuCisJICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCBkZXRlcm1pbmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgb2YgXGAkbGFkaXInIiAxPiYyCisJICAgICRlY2hvICIkbW9kZW5hbWU6IHBhc3NpbmcgaXQgbGl0ZXJhbGx5IHRvIHRoZSBsaW5rZXIsIGFsdGhvdWdoIGl0IG1pZ2h0IGZhaWwiIDE+JjIKKwkgICAgYWJzX2xhZGlyPSIkbGFkaXIiCisJICBmaQorCSAgOzsKKwllc2FjCisJbGFuYW1lPWAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKworCSMgRmluZCB0aGUgcmVsZXZhbnQgb2JqZWN0IGRpcmVjdG9yeSBhbmQgbGlicmFyeSBuYW1lLgorCWlmIHRlc3QgIlgkaW5zdGFsbGVkIiA9IFh5ZXM7IHRoZW4KKwkgIGlmIHRlc3QgISAtZiAiJGxpYmRpci8kbGlua2xpYiIgJiYgdGVzdCAtZiAiJGFic19sYWRpci8kbGlua2xpYiI7IHRoZW4KKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogbGlicmFyeSBcYCRsaWInIHdhcyBtb3ZlZC4iIDE+JjIKKwkgICAgZGlyPSIkbGFkaXIiCisJICAgIGFic2Rpcj0iJGFic19sYWRpciIKKwkgICAgbGliZGlyPSIkYWJzX2xhZGlyIgorCSAgZWxzZQorCSAgICBkaXI9IiRsaWJkaXIiCisJICAgIGFic2Rpcj0iJGxpYmRpciIKKwkgIGZpCisJZWxzZQorCSAgZGlyPSIkbGFkaXIvJG9iamRpciIKKwkgIGFic2Rpcj0iJGFic19sYWRpci8kb2JqZGlyIgorCSAgIyBSZW1vdmUgdGhpcyBzZWFyY2ggcGF0aCBsYXRlcgorCSAgbm90aW5zdF9wYXRoPSIkbm90aW5zdF9wYXRoICRhYnNfbGFkaXIiCisJZmkgIyAkaW5zdGFsbGVkID0geWVzCisJbmFtZT1gJGVjaG8gIlgkbGFuYW1lIiB8ICRYc2VkIC1lICdzL1wubGEkLy8nIC1lICdzL15saWIvLydgCisKKwkjIFRoaXMgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRscHJlb3Blbi4KKwlpZiB0ZXN0ICRwYXNzID0gZGxwcmVvcGVuOyB0aGVuCisJICBpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgorCSAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgLWRscHJlb3BlbiBhIGNvbnZlbmllbmNlIGxpYnJhcnk6IFxgJGxpYiciIDE+JjIKKwkgICAgZXhpdCAxCisJICBmaQorCSAgIyBQcmVmZXIgdXNpbmcgYSBzdGF0aWMgbGlicmFyeSAoc28gdGhhdCBubyBzaWxseSBfRFlOQU1JQyBzeW1ib2xzCisJICAjIGFyZSByZXF1aXJlZCB0byBsaW5rKS4KKwkgIGlmIHRlc3QgLW4gIiRvbGRfbGlicmFyeSI7IHRoZW4KKwkgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGRpci8kb2xkX2xpYnJhcnkiCisJICAjIE90aGVyd2lzZSwgdXNlIHRoZSBkbG5hbWUsIHNvIHRoYXQgbHRfZGxvcGVuIGZpbmRzIGl0LgorCSAgZWxpZiB0ZXN0IC1uICIkZGxuYW1lIjsgdGhlbgorCSAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkZGlyLyRkbG5hbWUiCisJICBlbHNlCisJICAgIG5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRkaXIvJGxpbmtsaWIiCisJICBmaQorCWZpICMgJHBhc3MgPSBkbHByZW9wZW4KKworCWlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCisJICAjIExpbmsgdGhlIGNvbnZlbmllbmNlIGxpYnJhcnkKKwkgIGlmIHRlc3QgJGxpbmttb2RlID0gbGliOyB0aGVuCisJICAgIGRlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRkZXBsaWJzIgorCSAgZWxpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KKwkgICAgY29tcGlsZV9kZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkY29tcGlsZV9kZXBsaWJzIgorCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkZmluYWxpemVfZGVwbGlicyIKKwkgIGVsc2UKKwkgICAgZGVwbGlicz0iJGxpYiAkZGVwbGlicyIKKwkgIGZpCisJICBjb250aW51ZQorCWZpCisKKwlpZiB0ZXN0ICRsaW5rbW9kZSA9IHByb2cgJiYgdGVzdCAkcGFzcyAhPSBsaW5rOyB0aGVuCisJICBuZXdsaWJfc2VhcmNoX3BhdGg9IiRuZXdsaWJfc2VhcmNoX3BhdGggJGxhZGlyIgorCSAgZGVwbGlicz0iJGxpYiAkZGVwbGlicyIKKworCSAgbGlua2FsbGRlcGxpYnM9bm8KKwkgIGlmIHRlc3QgIiRsaW5rX2FsbF9kZXBsaWJzIiAhPSBubyB8fCB0ZXN0IC16ICIkbGlicmFyeV9uYW1lcyIgfHwKKwkgICAgIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbm87IHRoZW4KKwkgICAgbGlua2FsbGRlcGxpYnM9eWVzCisJICBmaQorCisJICB0bXBfbGlicz0KKwkgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KKwkgICAgY2FzZSAkZGVwbGliIGluCisJICAgIC1MKikgbmV3bGliX3NlYXJjaF9wYXRoPSIkbmV3bGliX3NlYXJjaF9wYXRoICJgJGVjaG8gIlgkZGVwbGliIiB8ICRYc2VkIC1lICdzL14tTC8vJ2A7OyAjIyMgdGVzdHN1aXRlOiBza2lwIG5lc3RlZCBxdW90aW5nIHRlc3QKKwkgICAgZXNhYworCSAgICAjIE5lZWQgdG8gbGluayBhZ2FpbnN0IGFsbCBkZXBlbmRlbmN5X2xpYnM/CisJICAgIGlmIHRlc3QgJGxpbmthbGxkZXBsaWJzID0geWVzOyB0aGVuCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgZWxzZQorCSAgICAgICMgTmVlZCB0byBoYXJkY29kZSBzaGFyZWQgbGlicmFyeSBwYXRocworCSAgICAgICMgb3IvYW5kIGxpbmsgYWdhaW5zdCBzdGF0aWMgbGlicmFyaWVzCisJICAgICAgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCisJICAgIGZpCisJICAgIGNhc2UgIiR0bXBfbGlicyAiIGluCisJICAgICoiICRkZXBsaWIgIiopIHNwZWNpYWxkZXBsaWJzPSIkc3BlY2lhbGRlcGxpYnMgJGRlcGxpYiIgOzsKKwkgICAgZXNhYworCSAgICB0bXBfbGlicz0iJHRtcF9saWJzICRkZXBsaWIiCisJICBkb25lICMgZm9yIGRlcGxpYgorCSAgY29udGludWUKKwlmaSAjICRsaW5rbW9kZSA9IHByb2cuLi4KKworCWxpbmtfc3RhdGljPW5vICMgV2hldGhlciB0aGUgZGVwbGliIHdpbGwgYmUgbGlua2VkIHN0YXRpY2FsbHkKKwlpZiB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyIgJiYKKwkgICB7IHRlc3QgIiRwcmVmZXJfc3RhdGljX2xpYnMiID0gbm8gfHwgdGVzdCAteiAiJG9sZF9saWJyYXJ5IjsgfTsgdGhlbgorCSAgIyBMaW5rIGFnYWluc3QgdGhpcyBzaGFyZWQgbGlicmFyeQorCisJICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayIgfHwKKwkgICB7IHRlc3QgJGxpbmttb2RlID0gbGliICYmIHRlc3QgJGhhcmRjb2RlX2ludG9fbGlicyA9IHllczsgfTsgdGhlbgorCSAgICAjIEhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGguCisJICAgICMgU2tpcCBkaXJlY3RvcmllcyB0aGF0IGFyZSBpbiB0aGUgc3lzdGVtIGRlZmF1bHQgcnVuLXRpbWUKKwkgICAgIyBzZWFyY2ggcGF0aC4KKwkgICAgY2FzZSAiICRzeXNfbGliX2Rsc2VhcmNoX3BhdGggIiBpbgorCSAgICAqIiAkYWJzZGlyICIqKSA7OworCSAgICAqKQorCSAgICAgIGNhc2UgIiRjb21waWxlX3JwYXRoICIgaW4KKwkgICAgICAqIiAkYWJzZGlyICIqKSA7OworCSAgICAgICopIGNvbXBpbGVfcnBhdGg9IiRjb21waWxlX3JwYXRoICRhYnNkaXIiCisJICAgICAgZXNhYworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgY2FzZSAiICRzeXNfbGliX2Rsc2VhcmNoX3BhdGggIiBpbgorCSAgICAqIiAkbGliZGlyICIqKSA7OworCSAgICAqKQorCSAgICAgIGNhc2UgIiRmaW5hbGl6ZV9ycGF0aCAiIGluCisJICAgICAgKiIgJGxpYmRpciAiKikgOzsKKwkgICAgICAqKSBmaW5hbGl6ZV9ycGF0aD0iJGZpbmFsaXplX3JwYXRoICRsaWJkaXIiCisJICAgICAgZXNhYworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgaWYgdGVzdCAkbGlua21vZGUgPSBwcm9nOyB0aGVuCisJICAgICAgIyBXZSBuZWVkIHRvIGhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGgKKwkgICAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KKwkJIyBNYWtlIHN1cmUgdGhlIHJwYXRoIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGRpcmVjdG9yaWVzLgorCQljYXNlICIkdGVtcF9ycGF0aCAiIGluCisJCSoiICRkaXIgIiopIDs7CisJCSoiICRhYnNkaXIgIiopIDs7CisJCSopIHRlbXBfcnBhdGg9IiR0ZW1wX3JwYXRoICRkaXIiIDs7CisJCWVzYWMKKwkgICAgICBmaQorCSAgICBmaQorCSAgZmkgIyAkbGlua21vZGUsJHBhc3MgPSBwcm9nLGxpbmsuLi4KKworCSAgaWYgdGVzdCAiJGFsbGRlcGxpYnMiID0geWVzICYmCisJICAgICB7IHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgPSBwYXNzX2FsbCB8fAorCSAgICAgICB7IHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmCisJCSB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyI7IH07IH07IHRoZW4KKwkgICAgIyBXZSBvbmx5IG5lZWQgdG8gc2VhcmNoIGZvciBzdGF0aWMgbGlicmFyaWVzCisJICAgIGNvbnRpbnVlCisJICBmaQorCisJICBpZiB0ZXN0ICIkaW5zdGFsbGVkIiA9IG5vOyB0aGVuCisJICAgIG5vdGluc3RfZGVwbGlicz0iJG5vdGluc3RfZGVwbGlicyAkbGliIgorCSAgICBuZWVkX3JlbGluaz15ZXMKKwkgIGZpCisKKwkgIGlmIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcyI7IHRoZW4KKwkgICAgIyBmaWd1cmUgb3V0IHRoZSBzb25hbWUKKwkgICAgc2V0IGR1bW15ICRsaWJyYXJ5X25hbWVzCisJICAgIHJlYWxuYW1lPSIkMiIKKwkgICAgc2hpZnQ7IHNoaWZ0CisJICAgIGxpYm5hbWU9YGV2YWwgXFwkZWNobyBcIiRsaWJuYW1lX3NwZWNcImAKKwkgICAgIyB1c2UgZGxuYW1lIGlmIHdlIGdvdCBpdC4gaXQncyBwZXJmZWN0bHkgZ29vZCwgbm8/CisJICAgIGlmIHRlc3QgLW4gIiRkbG5hbWUiOyB0aGVuCisJICAgICAgc29uYW1lPSIkZGxuYW1lIgorCSAgICBlbGlmIHRlc3QgLW4gIiRzb25hbWVfc3BlYyI7IHRoZW4KKwkgICAgICAjIGJsZWggd2luZG93cworCSAgICAgIGNhc2UgJGhvc3QgaW4KKwkgICAgICAqY3lnd2luKikKKwkJbWFqb3I9YGV4cHIgJGN1cnJlbnQgLSAkYWdlYAorCQl2ZXJzdWZmaXg9Ii0kbWFqb3IiCisJCTs7CisJICAgICAgZXNhYworCSAgICAgIGV2YWwgc29uYW1lPVwiJHNvbmFtZV9zcGVjXCIKKwkgICAgZWxzZQorCSAgICAgIHNvbmFtZT0iJHJlYWxuYW1lIgorCSAgICBmaQorCisJICAgICMgTWFrZSBhIG5ldyBuYW1lIGZvciB0aGUgZXh0cmFjdF9leHBzeW1zX2NtZHMgdG8gdXNlCisJICAgIHNvcm9vdD0iJHNvbmFtZSIKKwkgICAgc29uYW1lPWBlY2hvICRzb3Jvb3QgfCBzZWQgLWUgJ3MvXi4qXC8vLydgCisJICAgIG5ld2xpYj0ibGliaW1wLWBlY2hvICRzb25hbWUgfCBzZWQgJ3MvXmxpYi8vO3MvXC5kbGwkLy8nYC5hIgorCisJICAgICMgSWYgdGhlIGxpYnJhcnkgaGFzIG5vIGV4cG9ydCBsaXN0LCB0aGVuIGNyZWF0ZSBvbmUgbm93CisJICAgIGlmIHRlc3QgLWYgIiRvdXRwdXRfb2JqZGlyLyRzb25hbWUtZGVmIjsgdGhlbiA6CisJICAgIGVsc2UKKwkgICAgICAkc2hvdyAiZXh0cmFjdGluZyBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIFxgJHNvbmFtZSciCisJICAgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJICAgICAgZXZhbCBjbWRzPVwiJGV4dHJhY3RfZXhwc3ltc19jbWRzXCIKKwkgICAgICBmb3IgY21kIGluICRjbWRzOyBkbworCQlJRlM9IiRzYXZlX2lmcyIKKwkJJHNob3cgIiRjbWQiCisJCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPworCSAgICAgIGRvbmUKKwkgICAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgZmkKKworCSAgICAjIENyZWF0ZSAkbmV3bGliCisJICAgIGlmIHRlc3QgLWYgIiRvdXRwdXRfb2JqZGlyLyRuZXdsaWIiOyB0aGVuIDo7IGVsc2UKKwkgICAgICAkc2hvdyAiZ2VuZXJhdGluZyBpbXBvcnQgbGlicmFyeSBmb3IgXGAkc29uYW1lJyIKKwkgICAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKwkgICAgICBldmFsIGNtZHM9XCIkb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNcIgorCSAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCisJCUlGUz0iJHNhdmVfaWZzIgorCQkkc2hvdyAiJGNtZCIKKwkJJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/CisJICAgICAgZG9uZQorCSAgICAgIElGUz0iJHNhdmVfaWZzIgorCSAgICBmaQorCSAgICAjIG1ha2Ugc3VyZSB0aGUgbGlicmFyeSB2YXJpYWJsZXMgYXJlIHBvaW50aW5nIHRvIHRoZSBuZXcgbGlicmFyeQorCSAgICBkaXI9JG91dHB1dF9vYmpkaXIKKwkgICAgbGlua2xpYj0kbmV3bGliCisJICBmaSAjIHRlc3QgLW4gJG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzCisKKwkgIGlmIHRlc3QgJGxpbmttb2RlID0gcHJvZyB8fCB0ZXN0ICIkbW9kZSIgIT0gcmVsaW5rOyB0aGVuCisJICAgIGFkZF9zaGxpYnBhdGg9CisJICAgIGFkZF9kaXI9CisJICAgIGFkZD0KKwkgICAgbGliX2xpbmtlZD15ZXMKKwkgICAgY2FzZSAkaGFyZGNvZGVfYWN0aW9uIGluCisJICAgIGltbWVkaWF0ZSB8IHVuc3VwcG9ydGVkKQorCSAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0gbm87IHRoZW4KKwkJYWRkPSIkZGlyLyRsaW5rbGliIgorCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0gbm87IHRoZW4KKwkJY2FzZSAkaG9zdCBpbgorCQkqLSotc3Vub3MqKSBhZGRfc2hsaWJwYXRoPSIkZGlyIiA7OworCQllc2FjCisJCWFkZF9kaXI9Ii1MJGRpciIKKwkJYWRkPSItbCRuYW1lIgorCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0gbm87IHRoZW4KKwkJYWRkX3NobGlicGF0aD0iJGRpciIKKwkJYWRkPSItbCRuYW1lIgorCSAgICAgIGVsc2UKKwkJbGliX2xpbmtlZD1ubworCSAgICAgIGZpCisJICAgICAgOzsKKwkgICAgcmVsaW5rKQorCSAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0geWVzOyB0aGVuCisJCWFkZD0iJGRpci8kbGlua2xpYiIKKwkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IHllczsgdGhlbgorCQlhZGRfZGlyPSItTCRkaXIiCisJCWFkZD0iLWwkbmFtZSIKKwkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgorCQlhZGRfc2hsaWJwYXRoPSIkZGlyIgorCQlhZGQ9Ii1sJG5hbWUiCisJICAgICAgZWxzZQorCQlsaWJfbGlua2VkPW5vCisJICAgICAgZmkKKwkgICAgICA7OworCSAgICAqKSBsaWJfbGlua2VkPW5vIDs7CisJICAgIGVzYWMKKworCSAgICBpZiB0ZXN0ICIkbGliX2xpbmtlZCIgIT0geWVzOyB0aGVuCisJICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY29uZmlndXJhdGlvbiBlcnJvcjogdW5zdXBwb3J0ZWQgaGFyZGNvZGUgcHJvcGVydGllcyIKKwkgICAgICBleGl0IDEKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0IC1uICIkYWRkX3NobGlicGF0aCI7IHRoZW4KKwkgICAgICBjYXNlIDokY29tcGlsZV9zaGxpYnBhdGg6IGluCisJICAgICAgKiI6JGFkZF9zaGxpYnBhdGg6IiopIDs7CisJICAgICAgKikgY29tcGlsZV9zaGxpYnBhdGg9IiRjb21waWxlX3NobGlicGF0aCRhZGRfc2hsaWJwYXRoOiIgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICAgIGlmIHRlc3QgJGxpbmttb2RlID0gcHJvZzsgdGhlbgorCSAgICAgIHRlc3QgLW4gIiRhZGRfZGlyIiAmJiBjb21waWxlX2RlcGxpYnM9IiRhZGRfZGlyICRjb21waWxlX2RlcGxpYnMiCisJICAgICAgdGVzdCAtbiAiJGFkZCIgJiYgY29tcGlsZV9kZXBsaWJzPSIkYWRkICRjb21waWxlX2RlcGxpYnMiCisJICAgIGVsc2UKKwkgICAgICB0ZXN0IC1uICIkYWRkX2RpciIgJiYgZGVwbGlicz0iJGFkZF9kaXIgJGRlcGxpYnMiCisJICAgICAgdGVzdCAtbiAiJGFkZCIgJiYgZGVwbGlicz0iJGFkZCAkZGVwbGlicyIKKwkgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSB5ZXMgJiYgXAorCQkgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiICE9IHllcyAmJiBcCisJCSB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSB5ZXM7IHRoZW4KKwkJY2FzZSA6JGZpbmFsaXplX3NobGlicGF0aDogaW4KKwkJKiI6JGxpYmRpcjoiKikgOzsKKwkJKikgZmluYWxpemVfc2hsaWJwYXRoPSIkZmluYWxpemVfc2hsaWJwYXRoJGxpYmRpcjoiIDs7CisJCWVzYWMKKwkgICAgICBmaQorCSAgICBmaQorCSAgZmkKKworCSAgaWYgdGVzdCAkbGlua21vZGUgPSBwcm9nIHx8IHRlc3QgIiRtb2RlIiA9IHJlbGluazsgdGhlbgorCSAgICBhZGRfc2hsaWJwYXRoPQorCSAgICBhZGRfZGlyPQorCSAgICBhZGQ9CisJICAgICMgRmluYWxpemUgY29tbWFuZCBmb3IgYm90aCBpcyBzaW1wbGU6IGp1c3QgaGFyZGNvZGUgaXQuCisJICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0geWVzOyB0aGVuCisJICAgICAgYWRkPSIkbGliZGlyLyRsaW5rbGliIgorCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IHllczsgdGhlbgorCSAgICAgIGFkZF9kaXI9Ii1MJGxpYmRpciIKKwkgICAgICBhZGQ9Ii1sJG5hbWUiCisJICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCisJICAgICAgY2FzZSA6JGZpbmFsaXplX3NobGlicGF0aDogaW4KKwkgICAgICAqIjokbGliZGlyOiIqKSA7OworCSAgICAgICopIGZpbmFsaXplX3NobGlicGF0aD0iJGZpbmFsaXplX3NobGlicGF0aCRsaWJkaXI6IiA7OworCSAgICAgIGVzYWMKKwkgICAgICBhZGQ9Ii1sJG5hbWUiCisJICAgIGVsc2UKKwkgICAgICAjIFdlIGNhbm5vdCBzZWVtIHRvIGhhcmRjb2RlIGl0LCBndWVzcyB3ZSdsbCBmYWtlIGl0LgorCSAgICAgIGlmIHRlc3QgIlgkaW5zdGFsbGVkIiA9IFh5ZXM7IHRoZW4KKwkgICAgICAgIGFkZF9kaXI9Ii1MJGxpYmRpciIKKwkgICAgICBlbHNlCisJICAgICAgICBhZGRfZGlyPSItTCRERVNURElSJGxpYmRpciIKKwkgICAgICBmaQorCSAgICAgIGFkZD0iLWwkbmFtZSIKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0ICRsaW5rbW9kZSA9IHByb2c7IHRoZW4KKwkgICAgICB0ZXN0IC1uICIkYWRkX2RpciIgJiYgZmluYWxpemVfZGVwbGlicz0iJGFkZF9kaXIgJGZpbmFsaXplX2RlcGxpYnMiCisJICAgICAgdGVzdCAtbiAiJGFkZCIgJiYgZmluYWxpemVfZGVwbGlicz0iJGFkZCAkZmluYWxpemVfZGVwbGlicyIKKwkgICAgZWxzZQorCSAgICAgIHRlc3QgLW4gIiRhZGRfZGlyIiAmJiBkZXBsaWJzPSIkYWRkX2RpciAkZGVwbGlicyIKKwkgICAgICB0ZXN0IC1uICIkYWRkIiAmJiBkZXBsaWJzPSIkYWRkICRkZXBsaWJzIgorCSAgICBmaQorCSAgZmkKKwllbGlmIHRlc3QgJGxpbmttb2RlID0gcHJvZzsgdGhlbgorCSAgaWYgdGVzdCAiJGFsbGRlcGxpYnMiID0geWVzICYmCisJICAgICB7IHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgPSBwYXNzX2FsbCB8fAorCSAgICAgICB7IHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmCisJCSB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyI7IH07IH07IHRoZW4KKwkgICAgIyBXZSBvbmx5IG5lZWQgdG8gc2VhcmNoIGZvciBzdGF0aWMgbGlicmFyaWVzCisJICAgIGNvbnRpbnVlCisJICBmaQorCisJICAjIFRyeSB0byBsaW5rIHRoZSBzdGF0aWMgbGlicmFyeQorCSAgIyBIZXJlIHdlIGFzc3VtZSB0aGF0IG9uZSBvZiBoYXJkY29kZV9kaXJlY3Qgb3IgaGFyZGNvZGVfbWludXNfTAorCSAgIyBpcyBub3QgdW5zdXBwb3J0ZWQuICBUaGlzIGlzIHZhbGlkIG9uIGFsbCBrbm93biBzdGF0aWMgYW5kCisJICAjIHNoYXJlZCBwbGF0Zm9ybXMuCisJICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSB1bnN1cHBvcnRlZDsgdGhlbgorCSAgICB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIGxpbmtsaWI9IiRvbGRfbGlicmFyeSIKKwkgICAgY29tcGlsZV9kZXBsaWJzPSIkZGlyLyRsaW5rbGliICRjb21waWxlX2RlcGxpYnMiCisJICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkaXIvJGxpbmtsaWIgJGZpbmFsaXplX2RlcGxpYnMiCisJICBlbHNlCisJICAgIGNvbXBpbGVfZGVwbGlicz0iLWwkbmFtZSAtTCRkaXIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgZmluYWxpemVfZGVwbGlicz0iLWwkbmFtZSAtTCRkaXIgJGZpbmFsaXplX2RlcGxpYnMiCisJICBmaQorCWVsaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKwkgICMgTm90IGEgc2hhcmVkIGxpYnJhcnkKKwkgIGlmIHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgIT0gcGFzc19hbGw7IHRoZW4KKwkgICAgIyBXZSdyZSB0cnlpbmcgbGluayBhIHNoYXJlZCBsaWJyYXJ5IGFnYWluc3QgYSBzdGF0aWMgb25lCisJICAgICMgYnV0IHRoZSBzeXN0ZW0gZG9lc24ndCBzdXBwb3J0IGl0LgorCisJICAgICMgSnVzdCBwcmludCBhIHdhcm5pbmcgYW5kIGFkZCB0aGUgbGlicmFyeSB0byBkZXBlbmRlbmN5X2xpYnMgc28KKwkgICAgIyB0aGF0IHRoZSBwcm9ncmFtIGNhbiBiZSBsaW5rZWQgYWdhaW5zdCB0aGUgc3RhdGljIGxpYnJhcnkuCisJICAgIGVjaG8KKwkgICAgZWNobyAiKioqIFdhcm5pbmc6IFRoaXMgbGlicmFyeSBuZWVkcyBzb21lIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgYnkgJGxpYi4iCisJICAgIGVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCisJICAgIGVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCisJICAgIGVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZS4iCisJICAgIGlmIHRlc3QgIiRtb2R1bGUiID0geWVzOyB0aGVuCisJICAgICAgZWNobyAiKioqIFRoZXJlZm9yZSwgbGlidG9vbCB3aWxsIGNyZWF0ZSBhIHN0YXRpYyBtb2R1bGUsIHRoYXQgc2hvdWxkIHdvcmsgIgorCSAgICAgIGVjaG8gIioqKiBhcyBsb25nIGFzIHRoZSBkbG9wZW5pbmcgYXBwbGljYXRpb24gaXMgbGlua2VkIHdpdGggdGhlIC1kbG9wZW4gZmxhZy4iCisJICAgICAgaWYgdGVzdCAteiAiJGdsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KKwkJZWNobworCQllY2hvICIqKiogSG93ZXZlciwgdGhpcyB3b3VsZCBvbmx5IHdvcmsgaWYgbGlidG9vbCB3YXMgYWJsZSB0byBleHRyYWN0IHN5bWJvbCIKKwkJZWNobyAiKioqIGxpc3RzIGZyb20gYSBwcm9ncmFtLCB1c2luZyBcYG5tJyBvciBlcXVpdmFsZW50LCBidXQgbGlidG9vbCBjb3VsZCIKKwkJZWNobyAiKioqIG5vdCBmaW5kIHN1Y2ggYSBwcm9ncmFtLiAgU28sIHRoaXMgbW9kdWxlIGlzIHByb2JhYmx5IHVzZWxlc3MuIgorCQllY2hvICIqKiogXGBubScgZnJvbSBHTlUgYmludXRpbHMgYW5kIGEgZnVsbCByZWJ1aWxkIG1heSBoZWxwLiIKKwkgICAgICBmaQorCSAgICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSBubzsgdGhlbgorCQlidWlsZF9saWJ0b29sX2xpYnM9bW9kdWxlCisJCWJ1aWxkX29sZF9saWJzPXllcworCSAgICAgIGVsc2UKKwkJYnVpbGRfbGlidG9vbF9saWJzPW5vCisJICAgICAgZmkKKwkgICAgZmkKKwkgIGVsc2UKKwkgICAgY29udmVuaWVuY2U9IiRjb252ZW5pZW5jZSAkZGlyLyRvbGRfbGlicmFyeSIKKwkgICAgb2xkX2NvbnZlbmllbmNlPSIkb2xkX2NvbnZlbmllbmNlICRkaXIvJG9sZF9saWJyYXJ5IgorCSAgICBkZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkZGVwbGlicyIKKwkgICAgbGlua19zdGF0aWM9eWVzCisJICBmaQorCWZpICMgbGluayBzaGFyZWQvc3RhdGljIGxpYnJhcnk/CisKKwlpZiB0ZXN0ICRsaW5rbW9kZSA9IGxpYjsgdGhlbgorCSAgaWYgdGVzdCAtbiAiJGRlcGVuZGVuY3lfbGlicyIgJiYKKwkgICAgIHsgdGVzdCAkaGFyZGNvZGVfaW50b19saWJzICE9IHllcyB8fCB0ZXN0ICRidWlsZF9vbGRfbGlicyA9IHllcyB8fAorCSAgICAgICB0ZXN0ICRsaW5rX3N0YXRpYyA9IHllczsgfTsgdGhlbgorCSAgICAjIEV4dHJhY3QgLVIgZnJvbSBkZXBlbmRlbmN5X2xpYnMKKwkgICAgdGVtcF9kZXBsaWJzPQorCSAgICBmb3IgbGliZGlyIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAgICAgY2FzZSAkbGliZGlyIGluCisJICAgICAgLVIqKSB0ZW1wX3hycGF0aD1gJGVjaG8gIlgkbGliZGlyIiB8ICRYc2VkIC1lICdzL14tUi8vJ2AKKwkJICAgY2FzZSAiICR4cnBhdGggIiBpbgorCQkgICAqIiAkdGVtcF94cnBhdGggIiopIDs7CisJCSAgICopIHhycGF0aD0iJHhycGF0aCAkdGVtcF94cnBhdGgiOzsKKwkJICAgZXNhYzs7CisJICAgICAgKikgdGVtcF9kZXBsaWJzPSIkdGVtcF9kZXBsaWJzICRsaWJkaXIiOzsKKwkgICAgICBlc2FjCisJICAgIGRvbmUKKwkgICAgZGVwZW5kZW5jeV9saWJzPSIkdGVtcF9kZXBsaWJzIgorCSAgZmkKKworCSAgbmV3bGliX3NlYXJjaF9wYXRoPSIkbmV3bGliX3NlYXJjaF9wYXRoICRhYnNkaXIiCisJICAjIExpbmsgYWdhaW5zdCB0aGlzIGxpYnJhcnkKKwkgIHRlc3QgIiRsaW5rX3N0YXRpYyIgPSBubyAmJiBuZXdkZXBlbmRlbmN5X2xpYnM9IiRhYnNfbGFkaXIvJGxhbmFtZSAkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgIyAuLi4gYW5kIGl0cyBkZXBlbmRlbmN5X2xpYnMKKwkgIHRtcF9saWJzPQorCSAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkgICAgY2FzZSAiJHRtcF9saWJzICIgaW4KKwkgICAgKiIgJGRlcGxpYiAiKikgc3BlY2lhbGRlcGxpYnM9IiRzcGVjaWFsZGVwbGlicyAkZGVwbGliIiA7OworCSAgICBlc2FjCisJICAgIHRtcF9saWJzPSIkdG1wX2xpYnMgJGRlcGxpYiIKKwkgIGRvbmUKKworCSAgaWYgdGVzdCAkbGlua19hbGxfZGVwbGlicyAhPSBubzsgdGhlbgorCSAgICAjIEFkZCB0aGUgc2VhcmNoIHBhdGhzIG9mIGFsbCBkZXBlbmRlbmN5IGxpYnJhcmllcworCSAgICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAgICAgY2FzZSAkZGVwbGliIGluCisJICAgICAgLUwqKSBwYXRoPSIkZGVwbGliIiA7OworCSAgICAgICoubGEpCisJCWRpcj1gJGVjaG8gIlgkZGVwbGliIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisJCXRlc3QgIlgkZGlyIiA9ICJYJGRlcGxpYiIgJiYgZGlyPSIuIgorCQkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KKwkJY2FzZSAkZGlyIGluCisJCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgYWJzZGlyPSIkZGlyIiA7OworCQkqKQorCQkgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKKwkJICBpZiB0ZXN0IC16ICIkYWJzZGlyIjsgdGhlbgorCQkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY2Fubm90IGRldGVybWluZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBvZiBcYCRkaXInIiAxPiYyCisJCSAgICBhYnNkaXI9IiRkaXIiCisJCSAgZmkKKwkJICA7OworCQllc2FjCisJCWlmIGdyZXAgIl5pbnN0YWxsZWQ9bm8iICRkZXBsaWIgPiAvZGV2L251bGw7IHRoZW4KKwkJICBwYXRoPSItTCRhYnNkaXIvJG9iamRpciIKKwkJZWxzZQorCQkgIGV2YWwgbGliZGlyPWBzZWQgLW4gLWUgJ3MvXmxpYmRpcj1cKC4qXCkkL1wxL3AnICRkZXBsaWJgCisJCSAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KKwkJICAgICRlY2hvICIkbW9kZW5hbWU6IFxgJGRlcGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCisJCSAgICBleGl0IDEKKwkJICBmaQorCQkgIGlmIHRlc3QgIiRhYnNkaXIiICE9ICIkbGliZGlyIjsgdGhlbgorCQkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAkZGVwbGliJyBzZWVtcyB0byBiZSBtb3ZlZCIgMT4mMgorCQkgIGZpCisJCSAgcGF0aD0iLUwkYWJzZGlyIgorCQlmaQorCQk7OworCSAgICAgICopIGNvbnRpbnVlIDs7CisJICAgICAgZXNhYworCSAgICAgIGNhc2UgIiAkZGVwbGlicyAiIGluCisJICAgICAgKiIgJHBhdGggIiopIDs7CisJICAgICAgKikgZGVwbGlicz0iJGRlcGxpYnMgJHBhdGgiIDs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICBmaSAjIGxpbmtfYWxsX2RlcGxpYnMgIT0gbm8KKwlmaSAjIGxpbmttb2RlID0gbGliCisgICAgICBkb25lICMgZm9yIGRlcGxpYiBpbiAkbGlicworICAgICAgaWYgdGVzdCAkcGFzcyA9IGRscHJlb3BlbjsgdGhlbgorCSMgTGluayB0aGUgZGxwcmVvcGVuZWQgbGlicmFyaWVzIGJlZm9yZSBvdGhlciBsaWJyYXJpZXMKKwlmb3IgZGVwbGliIGluICRzYXZlX2RlcGxpYnM7IGRvCisJICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCWRvbmUKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICRwYXNzICE9IGRsb3BlbjsgdGhlbgorCXRlc3QgJHBhc3MgIT0gc2NhbiAmJiBkZXBlbmRlbmN5X2xpYnM9IiRuZXdkZXBlbmRlbmN5X2xpYnMiCisJaWYgdGVzdCAkcGFzcyAhPSBjb252OyB0aGVuCisJICAjIE1ha2Ugc3VyZSBsaWJfc2VhcmNoX3BhdGggY29udGFpbnMgb25seSB1bmlxdWUgZGlyZWN0b3JpZXMuCisJICBsaWJfc2VhcmNoX3BhdGg9CisJICBmb3IgZGlyIGluICRuZXdsaWJfc2VhcmNoX3BhdGg7IGRvCisJICAgIGNhc2UgIiRsaWJfc2VhcmNoX3BhdGggIiBpbgorCSAgICAqIiAkZGlyICIqKSA7OworCSAgICAqKSBsaWJfc2VhcmNoX3BhdGg9IiRsaWJfc2VhcmNoX3BhdGggJGRpciIgOzsKKwkgICAgZXNhYworCSAgZG9uZQorCSAgbmV3bGliX3NlYXJjaF9wYXRoPQorCWZpCisKKwlpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiICE9ICJwcm9nLGxpbmsiOyB0aGVuCisJICB2YXJzPSJkZXBsaWJzIgorCWVsc2UKKwkgIHZhcnM9ImNvbXBpbGVfZGVwbGlicyBmaW5hbGl6ZV9kZXBsaWJzIgorCWZpCisJZm9yIHZhciBpbiAkdmFycyBkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAjIEFkZCBsaWJyYXJpZXMgdG8gJHZhciBpbiByZXZlcnNlIG9yZGVyCisJICBldmFsIHRtcF9saWJzPVwiXCQkdmFyXCIKKwkgIG5ld19saWJzPQorCSAgZm9yIGRlcGxpYiBpbiAkdG1wX2xpYnM7IGRvCisJICAgIGNhc2UgJGRlcGxpYiBpbgorCSAgICAtTCopIG5ld19saWJzPSIkZGVwbGliICRuZXdfbGlicyIgOzsKKwkgICAgKikKKwkgICAgICBjYXNlICIgJHNwZWNpYWxkZXBsaWJzICIgaW4KKwkgICAgICAqIiAkZGVwbGliICIqKSBuZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiIDs7CisJICAgICAgKikKKwkJY2FzZSAiICRuZXdfbGlicyAiIGluCisJCSoiICRkZXBsaWIgIiopIDs7CisJCSopIG5ld19saWJzPSIkZGVwbGliICRuZXdfbGlicyIgOzsKKwkJZXNhYworCQk7OworCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICBlc2FjCisJICBkb25lCisJICB0bXBfbGlicz0KKwkgIGZvciBkZXBsaWIgaW4gJG5ld19saWJzOyBkbworCSAgICBjYXNlICRkZXBsaWIgaW4KKwkgICAgLUwqKQorCSAgICAgIGNhc2UgIiAkdG1wX2xpYnMgIiBpbgorCSAgICAgICoiICRkZXBsaWIgIiopIDs7CisJICAgICAgKikgdG1wX2xpYnM9IiR0bXBfbGlicyAkZGVwbGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICAqKSB0bXBfbGlicz0iJHRtcF9saWJzICRkZXBsaWIiIDs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwkgIGV2YWwgJHZhcj1cIiR0bXBfbGlic1wiCisJZG9uZSAjIGZvciB2YXIKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkcGFzcyIgPSAiY29udiIgJiYKKyAgICAgICB7IHRlc3QgIiRsaW5rbW9kZSIgPSAibGliIiB8fCB0ZXN0ICIkbGlua21vZGUiID0gInByb2ciOyB9OyB0aGVuCisJbGlicz0iJGRlcGxpYnMiICMgcmVzZXQgbGlicworCWRlcGxpYnM9CisgICAgICBmaQorICAgIGRvbmUgIyBmb3IgcGFzcworICAgIGlmIHRlc3QgJGxpbmttb2RlID0gcHJvZzsgdGhlbgorICAgICAgZGxmaWxlcz0iJG5ld2RsZmlsZXMiCisgICAgICBkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyIKKyAgICBmaQorCisgICAgY2FzZSAkbGlua21vZGUgaW4KKyAgICBvbGRsaWIpCisgICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIiB8fCB0ZXN0ICIkZGxzZWxmIiAhPSBubzsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRycGF0aCI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1ycGF0aCcgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiR4cnBhdGgiOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtUicgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiR2aW5mbyI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC12ZXJzaW9uLWluZm8nIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiB8fCB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtZXhwb3J0LXN5bWJvbHMnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCisgICAgICBmaQorCisgICAgICAjIE5vdyBzZXQgdGhlIHZhcmlhYmxlcyBmb3IgYnVpbGRpbmcgb2xkIGxpYnJhcmllcy4KKyAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubworICAgICAgb2xkbGlicz0iJG91dHB1dCIKKyAgICAgIG9ianM9IiRvYmpzJG9sZF9kZXBsaWJzIgorICAgICAgOzsKKworICAgIGxpYikKKyAgICAgICMgTWFrZSBzdXJlIHdlIG9ubHkgZ2VuZXJhdGUgbGlicmFyaWVzIG9mIHRoZSBmb3JtIGBsaWJOQU1FLmxhJy4KKyAgICAgIGNhc2UgJG91dHB1dG5hbWUgaW4KKyAgICAgIGxpYiopCisJbmFtZT1gJGVjaG8gIlgkb3V0cHV0bmFtZSIgfCAkWHNlZCAtZSAncy9cLmxhJC8vJyAtZSAncy9ebGliLy8nYAorCWV2YWwgbGlibmFtZT1cIiRsaWJuYW1lX3NwZWNcIgorCTs7CisgICAgICAqKQorCWlmIHRlc3QgIiRtb2R1bGUiID0gbm87IHRoZW4KKwkgICRlY2hvICIkbW9kZW5hbWU6IGxpYnRvb2wgbGlicmFyeSBcYCRvdXRwdXQnIG11c3QgYmVnaW4gd2l0aCBcYGxpYiciIDE+JjIKKwkgICRlY2hvICIkaGVscCIgMT4mMgorCSAgZXhpdCAxCisJZmkKKwlpZiB0ZXN0ICIkbmVlZF9saWJfcHJlZml4IiAhPSBubzsgdGhlbgorCSAgIyBBZGQgdGhlICJsaWIiIHByZWZpeCBmb3IgbW9kdWxlcyBpZiByZXF1aXJlZAorCSAgbmFtZT1gJGVjaG8gIlgkb3V0cHV0bmFtZSIgfCAkWHNlZCAtZSAncy9cLmxhJC8vJ2AKKwkgIGV2YWwgbGlibmFtZT1cIiRsaWJuYW1lX3NwZWNcIgorCWVsc2UKKwkgIGxpYm5hbWU9YCRlY2hvICJYJG91dHB1dG5hbWUiIHwgJFhzZWQgLWUgJ3MvXC5sYSQvLydgCisJZmkKKwk7OworICAgICAgZXNhYworCisgICAgICBpZiB0ZXN0IC1uICIkb2JqcyI7IHRoZW4KKwlpZiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCisJICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgYnVpbGQgbGlidG9vbCBsaWJyYXJ5IFxgJG91dHB1dCcgZnJvbSBub24tbGlidG9vbCBvYmplY3RzIG9uIHRoaXMgaG9zdDokb2JqcyIgMj4mMQorCSAgZXhpdCAxCisJZWxzZQorCSAgZWNobworCSAgZWNobyAiKioqIFdhcm5pbmc6IExpbmtpbmcgdGhlIHNoYXJlZCBsaWJyYXJ5ICRvdXRwdXQgYWdhaW5zdCB0aGUgbm9uLWxpYnRvb2wiCisJICBlY2hvICIqKiogb2JqZWN0cyAkb2JqcyBpcyBub3QgcG9ydGFibGUhIgorCSAgbGlib2Jqcz0iJGxpYm9ianMgJG9ianMiCisJZmkKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRkbHNlbGYiICE9IG5vOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtZGxvcGVuIHNlbGYnIGlzIGlnbm9yZWQgZm9yIGxpYnRvb2wgbGlicmFyaWVzIiAxPiYyCisgICAgICBmaQorCisgICAgICBzZXQgZHVtbXkgJHJwYXRoCisgICAgICBpZiB0ZXN0ICQjIC1ndCAyOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogaWdub3JpbmcgbXVsdGlwbGUgXGAtcnBhdGgncyBmb3IgYSBsaWJ0b29sIGxpYnJhcnkiIDE+JjIKKyAgICAgIGZpCisgICAgICBpbnN0YWxsX2xpYmRpcj0iJDIiCisKKyAgICAgIG9sZGxpYnM9CisgICAgICBpZiB0ZXN0IC16ICIkcnBhdGgiOyB0aGVuCisJaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKwkgICMgQnVpbGRpbmcgYSBsaWJ0b29sIGNvbnZlbmllbmNlIGxpYnJhcnkuCisJICBsaWJleHQ9YWwKKwkgIG9sZGxpYnM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQgJG9sZGxpYnMiCisJICBidWlsZF9saWJ0b29sX2xpYnM9Y29udmVuaWVuY2UKKwkgIGJ1aWxkX29sZF9saWJzPXllcworCWZpCisKKwlpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCisJICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC12ZXJzaW9uLWluZm8nIGlzIGlnbm9yZWQgZm9yIGNvbnZlbmllbmNlIGxpYnJhcmllcyIgMT4mMgorCWZpCisKKwlpZiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KKwkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIGNvbnZlbmllbmNlIGxpYnJhcmllcyIgMT4mMgorCWZpCisgICAgICBlbHNlCisKKwkjIFBhcnNlIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFyZ3VtZW50LgorCXNhdmVfaWZzPSIkSUZTIjsgSUZTPSc6JworCXNldCBkdW1teSAkdmluZm8gMCAwIDAKKwlJRlM9IiRzYXZlX2lmcyIKKworCWlmIHRlc3QgLW4gIiQ4IjsgdGhlbgorCSAgJGVjaG8gIiRtb2RlbmFtZTogdG9vIG1hbnkgcGFyYW1ldGVycyB0byBcYC12ZXJzaW9uLWluZm8nIiAxPiYyCisJICAkZWNobyAiJGhlbHAiIDE+JjIKKwkgIGV4aXQgMQorCWZpCisKKwljdXJyZW50PSIkMiIKKwlyZXZpc2lvbj0iJDMiCisJYWdlPSIkNCIKKworCSMgQ2hlY2sgdGhhdCBlYWNoIG9mIHRoZSB0aGluZ3MgYXJlIHZhbGlkIG51bWJlcnMuCisJY2FzZSAkY3VycmVudCBpbgorCTAgfCBbMS05XSB8IFsxLTldWzAtOV0gfCBbMS05XVswLTldWzAtOV0pIDs7CisJKikKKwkgICRlY2hvICIkbW9kZW5hbWU6IENVUlJFTlQgXGAkY3VycmVudCcgaXMgbm90IGEgbm9ubmVnYXRpdmUgaW50ZWdlciIgMT4mMgorCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCisJICBleGl0IDEKKwkgIDs7CisJZXNhYworCisJY2FzZSAkcmV2aXNpb24gaW4KKwkwIHwgWzEtOV0gfCBbMS05XVswLTldIHwgWzEtOV1bMC05XVswLTldKSA7OworCSopCisJICAkZWNobyAiJG1vZGVuYW1lOiBSRVZJU0lPTiBcYCRyZXZpc2lvbicgaXMgbm90IGEgbm9ubmVnYXRpdmUgaW50ZWdlciIgMT4mMgorCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCisJICBleGl0IDEKKwkgIDs7CisJZXNhYworCisJY2FzZSAkYWdlIGluCisJMCB8IFsxLTldIHwgWzEtOV1bMC05XSB8IFsxLTldWzAtOV1bMC05XSkgOzsKKwkqKQorCSAgJGVjaG8gIiRtb2RlbmFtZTogQUdFIFxgJGFnZScgaXMgbm90IGEgbm9ubmVnYXRpdmUgaW50ZWdlciIgMT4mMgorCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCisJICBleGl0IDEKKwkgIDs7CisJZXNhYworCisJaWYgdGVzdCAkYWdlIC1ndCAkY3VycmVudDsgdGhlbgorCSAgJGVjaG8gIiRtb2RlbmFtZTogQUdFIFxgJGFnZScgaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IGludGVyZmFjZSBudW1iZXIgXGAkY3VycmVudCciIDE+JjIKKwkgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgorCSAgZXhpdCAxCisJZmkKKworCSMgQ2FsY3VsYXRlIHRoZSB2ZXJzaW9uIHZhcmlhYmxlcy4KKwltYWpvcj0KKwl2ZXJzdWZmaXg9CisJdmVyc3RyaW5nPQorCWNhc2UgJHZlcnNpb25fdHlwZSBpbgorCW5vbmUpIDs7CisKKwlkYXJ3aW4pCisJICAjIExpa2UgTGludXgsIGJ1dCB3aXRoIHRoZSBjdXJyZW50IHZlcnNpb24gYXZhaWxhYmxlIGluCisJICAjIHZlcnN0cmluZyBmb3IgY29kaW5nIGl0IGludG8gdGhlIGxpYnJhcnkgaGVhZGVyCisJICBtYWpvcj0uYGV4cHIgJGN1cnJlbnQgLSAkYWdlYAorCSAgdmVyc3VmZml4PSIkbWFqb3IuJGFnZS4kcmV2aXNpb24iCisJICAjIERhcndpbiBsZCBkb2Vzbid0IGxpa2UgMCBmb3IgdGhlc2Ugb3B0aW9ucy4uLgorCSAgbWlub3JfY3VycmVudD1gZXhwciAkY3VycmVudCArIDFgCisJICB2ZXJzdHJpbmc9Ii1jb21wYXRpYmlsaXR5X3ZlcnNpb24gJG1pbm9yX2N1cnJlbnQgLWN1cnJlbnRfdmVyc2lvbiAkbWlub3JfY3VycmVudC4kcmV2aXNpb24iCisJICA7OworCisJZnJlZWJzZC1hb3V0KQorCSAgbWFqb3I9Ii4kY3VycmVudCIKKwkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50LiRyZXZpc2lvbiI7CisJICA7OworCisJZnJlZWJzZC1lbGYpCisJICBtYWpvcj0iLiRjdXJyZW50IgorCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQiOworCSAgOzsKKworCWlyaXgpCisJICBtYWpvcj1gZXhwciAkY3VycmVudCAtICRhZ2UgKyAxYAorCSAgdmVyc3RyaW5nPSJzZ2kkbWFqb3IuJHJldmlzaW9uIgorCisJICAjIEFkZCBpbiBhbGwgdGhlIGludGVyZmFjZXMgdGhhdCB3ZSBhcmUgY29tcGF0aWJsZSB3aXRoLgorCSAgbG9vcD0kcmV2aXNpb24KKwkgIHdoaWxlIHRlc3QgJGxvb3AgIT0gMDsgZG8KKwkgICAgaWZhY2U9YGV4cHIgJHJldmlzaW9uIC0gJGxvb3BgCisJICAgIGxvb3A9YGV4cHIgJGxvb3AgLSAxYAorCSAgICB2ZXJzdHJpbmc9InNnaSRtYWpvci4kaWZhY2U6JHZlcnN0cmluZyIKKwkgIGRvbmUKKworCSAgIyBCZWZvcmUgdGhpcyBwb2ludCwgJG1ham9yIG11c3Qgbm90IGNvbnRhaW4gYC4nLgorCSAgbWFqb3I9LiRtYWpvcgorCSAgdmVyc3VmZml4PSIkbWFqb3IuJHJldmlzaW9uIgorCSAgOzsKKworCWxpbnV4KQorCSAgbWFqb3I9LmBleHByICRjdXJyZW50IC0gJGFnZWAKKwkgIHZlcnN1ZmZpeD0iJG1ham9yLiRhZ2UuJHJldmlzaW9uIgorCSAgOzsKKworCW9zZikKKwkgIG1ham9yPWBleHByICRjdXJyZW50IC0gJGFnZWAKKwkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50LiRhZ2UuJHJldmlzaW9uIgorCSAgdmVyc3RyaW5nPSIkY3VycmVudC4kYWdlLiRyZXZpc2lvbiIKKworCSAgIyBBZGQgaW4gYWxsIHRoZSBpbnRlcmZhY2VzIHRoYXQgd2UgYXJlIGNvbXBhdGlibGUgd2l0aC4KKwkgIGxvb3A9JGFnZQorCSAgd2hpbGUgdGVzdCAkbG9vcCAhPSAwOyBkbworCSAgICBpZmFjZT1gZXhwciAkY3VycmVudCAtICRsb29wYAorCSAgICBsb29wPWBleHByICRsb29wIC0gMWAKKwkgICAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nOiR7aWZhY2V9LjAiCisJICBkb25lCisKKwkgICMgTWFrZSBleGVjdXRhYmxlcyBkZXBlbmQgb24gb3VyIGN1cnJlbnQgdmVyc2lvbi4KKwkgIHZlcnN0cmluZz0iJHZlcnN0cmluZzoke2N1cnJlbnR9LjAiCisJICA7OworCisJc3Vub3MpCisJICBtYWpvcj0iLiRjdXJyZW50IgorCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQuJHJldmlzaW9uIgorCSAgOzsKKworCXdpbmRvd3MpCisJICAjIFVzZSAnLScgcmF0aGVyIHRoYW4gJy4nLCBzaW5jZSB3ZSBvbmx5IHdhbnQgb25lCisJICAjIGV4dGVuc2lvbiBvbiBET1MgOC4zIGZpbGVzeXN0ZW1zLgorCSAgbWFqb3I9YGV4cHIgJGN1cnJlbnQgLSAkYWdlYAorCSAgdmVyc3VmZml4PSItJG1ham9yIgorCSAgOzsKKworCSopCisJICAkZWNobyAiJG1vZGVuYW1lOiB1bmtub3duIGxpYnJhcnkgdmVyc2lvbiB0eXBlIFxgJHZlcnNpb25fdHlwZSciIDE+JjIKKwkgIGVjaG8gIkZhdGFsIGNvbmZpZ3VyYXRpb24gZXJyb3IuICBTZWUgdGhlICRQQUNLQUdFIGRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCisJICBleGl0IDEKKwkgIDs7CisJZXNhYworCisJIyBDbGVhciB0aGUgdmVyc2lvbiBpbmZvIGlmIHdlIGRlZmF1bHRlZCwgYW5kIHRoZXkgc3BlY2lmaWVkIGEgcmVsZWFzZS4KKwlpZiB0ZXN0IC16ICIkdmluZm8iICYmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgorCSAgbWFqb3I9CisJICB2ZXJzdHJpbmc9IjAuMCIKKwkgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgorCSAgZGFyd2luKQorCSAgICAjIHdlIGNhbid0IGNoZWNrIGZvciAiMC4wIiBpbiBhcmNoaXZlX2NtZHMgZHVlIHRvIHF1b3RpbmcKKwkgICAgIyBwcm9ibGVtcywgc28gd2UgcmVzZXQgaXQgY29tcGxldGVseQorCSAgICB2ZXJzdHJpbmc9IiIKKwkgICAgOzsKKwkgICopCisJICAgIHZlcnN0cmluZz0iMC4wIgorCSAgICA7OworCSAgZXNhYworCSAgaWYgdGVzdCAiJG5lZWRfdmVyc2lvbiIgPSBubzsgdGhlbgorCSAgICB2ZXJzdWZmaXg9CisJICBlbHNlCisJICAgIHZlcnN1ZmZpeD0iLjAuMCIKKwkgIGZpCisJZmkKKworCSMgUmVtb3ZlIHZlcnNpb24gaW5mbyBmcm9tIG5hbWUgaWYgdmVyc2lvbmluZyBzaG91bGQgYmUgYXZvaWRlZAorCWlmIHRlc3QgIiRhdm9pZF92ZXJzaW9uIiA9IHllcyAmJiB0ZXN0ICIkbmVlZF92ZXJzaW9uIiA9IG5vOyB0aGVuCisJICBtYWpvcj0KKwkgIHZlcnN1ZmZpeD0KKwkgIHZlcnN0cmluZz0iIgorCWZpCisKKwkjIENoZWNrIHRvIHNlZSBpZiB0aGUgYXJjaGl2ZSB3aWxsIGhhdmUgdW5kZWZpbmVkIHN5bWJvbHMuCisJaWYgdGVzdCAiJGFsbG93X3VuZGVmaW5lZCIgPSB5ZXM7IHRoZW4KKwkgIGlmIHRlc3QgIiRhbGxvd191bmRlZmluZWRfZmxhZyIgPSB1bnN1cHBvcnRlZDsgdGhlbgorCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiB1bmRlZmluZWQgc3ltYm9scyBub3QgYWxsb3dlZCBpbiAkaG9zdCBzaGFyZWQgbGlicmFyaWVzIiAxPiYyCisJICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubworCSAgICBidWlsZF9vbGRfbGlicz15ZXMKKwkgIGZpCisJZWxzZQorCSAgIyBEb24ndCBhbGxvdyB1bmRlZmluZWQgc3ltYm9scy4KKwkgIGFsbG93X3VuZGVmaW5lZF9mbGFnPSIkbm9fdW5kZWZpbmVkX2ZsYWciCisJZmkKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRtb2RlIiAhPSByZWxpbms7IHRoZW4KKwkjIFJlbW92ZSBvdXIgb3V0cHV0cy4KKwkkc2hvdyAiJHtybX1yICRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiogJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfSR7cmVsZWFzZX0uKiIKKwkkcnVuICR7cm19ciAkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSAkb3V0cHV0X29iamRpci8kbGlibmFtZS4qICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0ke3JlbGVhc2V9LioKKyAgICAgIGZpCisKKyAgICAgICMgTm93IHNldCB0aGUgdmFyaWFibGVzIGZvciBidWlsZGluZyBvbGQgbGlicmFyaWVzLgorICAgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllcyAmJiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSBjb252ZW5pZW5jZSA7IHRoZW4KKwlvbGRsaWJzPSIkb2xkbGlicyAkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0IgorCisJIyBUcmFuc2Zvcm0gLmxvIGZpbGVzIHRvIC5vIGZpbGVzLgorCW9sZG9ianM9IiRvYmpzICJgJGVjaG8gIlgkbGlib2JqcyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAnL1wuJyR7bGliZXh0fSckL2QnIC1lICIkbG8ybyIgfCAkTkwyU1BgCisgICAgICBmaQorCisgICAgICAjIEVsaW1pbmF0ZSBhbGwgdGVtcG9yYXJ5IGRpcmVjdG9yaWVzLgorICAgICAgZm9yIHBhdGggaW4gJG5vdGluc3RfcGF0aDsgZG8KKwlsaWJfc2VhcmNoX3BhdGg9YGVjaG8gIiRsaWJfc2VhcmNoX3BhdGggIiB8IHNlZCAtZSAncyUgJHBhdGggJSAlZydgCisJZGVwbGlicz1gZWNobyAiJGRlcGxpYnMgIiB8IHNlZCAtZSAncyUgLUwkcGF0aCAlICVnJ2AKKwlkZXBlbmRlbmN5X2xpYnM9YGVjaG8gIiRkZXBlbmRlbmN5X2xpYnMgIiB8IHNlZCAtZSAncyUgLUwkcGF0aCAlICVnJ2AKKyAgICAgIGRvbmUKKworICAgICAgaWYgdGVzdCAtbiAiJHhycGF0aCI7IHRoZW4KKwkjIElmIHRoZSB1c2VyIHNwZWNpZmllZCBhbnkgcnBhdGggZmxhZ3MsIHRoZW4gYWRkIHRoZW0uCisJdGVtcF94cnBhdGg9CisJZm9yIGxpYmRpciBpbiAkeHJwYXRoOyBkbworCSAgdGVtcF94cnBhdGg9IiR0ZW1wX3hycGF0aCAtUiRsaWJkaXIiCisJICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgorCSAgKiIgJGxpYmRpciAiKikgOzsKKwkgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIgOzsKKwkgIGVzYWMKKwlkb25lCisJaWYgdGVzdCAkaGFyZGNvZGVfaW50b19saWJzICE9IHllcyB8fCB0ZXN0ICRidWlsZF9vbGRfbGlicyA9IHllczsgdGhlbgorCSAgZGVwZW5kZW5jeV9saWJzPSIkdGVtcF94cnBhdGggJGRlcGVuZGVuY3lfbGlicyIKKwlmaQorICAgICAgZmkKKworICAgICAgIyBNYWtlIHN1cmUgZGxmaWxlcyBjb250YWlucyBvbmx5IHVuaXF1ZSBmaWxlcyB0aGF0IHdvbid0IGJlIGRscHJlb3BlbmVkCisgICAgICBvbGRfZGxmaWxlcz0iJGRsZmlsZXMiCisgICAgICBkbGZpbGVzPQorICAgICAgZm9yIGxpYiBpbiAkb2xkX2RsZmlsZXM7IGRvCisJY2FzZSAiICRkbHByZWZpbGVzICRkbGZpbGVzICIgaW4KKwkqIiAkbGliICIqKSA7OworCSopIGRsZmlsZXM9IiRkbGZpbGVzICRsaWIiIDs7CisJZXNhYworICAgICAgZG9uZQorCisgICAgICAjIE1ha2Ugc3VyZSBkbHByZWZpbGVzIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGZpbGVzCisgICAgICBvbGRfZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMiCisgICAgICBkbHByZWZpbGVzPQorICAgICAgZm9yIGxpYiBpbiAkb2xkX2RscHJlZmlsZXM7IGRvCisJY2FzZSAiJGRscHJlZmlsZXMgIiBpbgorCSoiICRsaWIgIiopIDs7CisJKikgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGxpYiIgOzsKKwllc2FjCisgICAgICBkb25lCisKKyAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisJaWYgdGVzdCAtbiAiJHJwYXRoIjsgdGhlbgorCSAgY2FzZSAkaG9zdCBpbgorCSAgKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLW9zMiogfCAqLSotYmVvcyopCisJICAgICMgdGhlc2Ugc3lzdGVtcyBkb24ndCBhY3R1YWxseSBoYXZlIGEgYyBsaWJyYXJ5IChhcyBzdWNoKSEKKwkgICAgOzsKKwkgICotKi1yaGFwc29keSogfCAqLSotZGFyd2luMS5bMDEyXSkKKwkgICAgIyBSaGFwc29keSBDIGxpYnJhcnkgaXMgaW4gdGhlIFN5c3RlbSBmcmFtZXdvcmsKKwkgICAgZGVwbGlicz0iJGRlcGxpYnMgLWZyYW1ld29yayBTeXN0ZW0iCisJICAgIDs7CisJICAqLSotbmV0YnNkKikKKwkgICAgIyBEb24ndCBsaW5rIHdpdGggbGliYyB1bnRpbCB0aGUgYS5vdXQgbGQuc28gaXMgZml4ZWQuCisJICAgIDs7CisJICAqLSotb3BlbmJzZCopCisJICAgICMgRG8gbm90IGluY2x1ZGUgbGliYyBkdWUgdG8gdXMgaGF2aW5nIGxpYmMvbGliY19yLgorCSAgICA7OworCSAgKikKKwkgICAgIyBBZGQgbGliYyB0byBkZXBsaWJzIG9uIGFsbCBvdGhlciBzeXN0ZW1zIGlmIG5lY2Vzc2FyeS4KKwkgICAgaWYgdGVzdCAkYnVpbGRfbGlidG9vbF9uZWVkX2xjID0gInllcyI7IHRoZW4KKwkgICAgICBkZXBsaWJzPSIkZGVwbGlicyAtbGMiCisJICAgIGZpCisJICAgIDs7CisJICBlc2FjCisJZmkKKworCSMgVHJhbnNmb3JtIGRlcGxpYnMgaW50byBvbmx5IGRlcGxpYnMgdGhhdCBjYW4gYmUgbGlua2VkIGluIHNoYXJlZC4KKwluYW1lX3NhdmU9JG5hbWUKKwlsaWJuYW1lX3NhdmU9JGxpYm5hbWUKKwlyZWxlYXNlX3NhdmU9JHJlbGVhc2UKKwl2ZXJzdWZmaXhfc2F2ZT0kdmVyc3VmZml4CisJbWFqb3Jfc2F2ZT0kbWFqb3IKKwkjIEknbSBub3Qgc3VyZSBpZiBJJ20gdHJlYXRpbmcgdGhlIHJlbGVhc2UgY29ycmVjdGx5LiAgSSB0aGluaworCSMgcmVsZWFzZSBzaG91bGQgc2hvdyB1cCBpbiB0aGUgLWwgKGllIC1sZ21wNSkgc28gd2UgZG9uJ3Qgd2FudCB0bworCSMgYWRkIGl0IGluIHR3aWNlLiAgSXMgdGhhdCBjb3JyZWN0PworCXJlbGVhc2U9IiIKKwl2ZXJzdWZmaXg9IiIKKwltYWpvcj0iIgorCW5ld2RlcGxpYnM9CisJZHJvcHBlZGRlcHM9bm8KKwljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorCXBhc3NfYWxsKQorCSAgIyBEb24ndCBjaGVjayBmb3Igc2hhcmVkL3N0YXRpYy4gIEV2ZXJ5dGhpbmcgd29ya3MuCisJICAjIFRoaXMgbWlnaHQgYmUgYSBsaXR0bGUgbmFpdmUuICBXZSBtaWdodCB3YW50IHRvIGNoZWNrCisJICAjIHdoZXRoZXIgdGhlIGxpYnJhcnkgZXhpc3RzIG9yIG5vdC4gIEJ1dCB0aGlzIGlzIG9uCisJICAjIG9zZjMgJiBvc2Y0IGFuZCBJJ20gbm90IHJlYWxseSBzdXJlLi4uIEp1c3QKKwkgICMgaW1wbGVtZW50aW5nIHdoYXQgd2FzIGFscmVhZHkgdGhlIGJlaGF2aW91ci4KKwkgIG5ld2RlcGxpYnM9JGRlcGxpYnMKKwkgIDs7CisJdGVzdF9jb21waWxlKQorCSAgIyBUaGlzIGNvZGUgc3RyZXNzZXMgdGhlICJsaWJyYXJpZXMgYXJlIHByb2dyYW1zIiBwYXJhZGlnbSB0byBpdHMKKwkgICMgbGltaXRzLiBNYXliZSBldmVuIGJyZWFrcyBpdC4gIFdlIGNvbXBpbGUgYSBwcm9ncmFtLCBsaW5raW5nIGl0CisJICAjIGFnYWluc3QgdGhlIGRlcGxpYnMgYXMgYSBwcm94eSBmb3IgdGhlIGxpYnJhcnkuICBUaGVuIHdlIGNhbiBjaGVjaworCSAgIyB3aGV0aGVyIHRoZXkgbGlua2VkIGluIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkgd2l0aCBsZGQuCisJICAkcm0gY29uZnRlc3QuYworCSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgorCSAgaW50IG1haW4oKSB7IHJldHVybiAwOyB9CitFT0YKKwkgICRybSBjb25mdGVzdAorCSAgJENDIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgJGRlcGxpYnMKKwkgIGlmIHRlc3QgJD8gLWVxIDAgOyB0aGVuCisJICAgIGxkZF9vdXRwdXQ9YGxkZCBjb25mdGVzdGAKKwkgICAgZm9yIGkgaW4gJGRlcGxpYnM7IGRvCisJICAgICAgbmFtZT0iYGV4cHIgJGkgOiAnLWxcKC4qXCknYCIKKwkgICAgICAjIElmICRuYW1lIGlzIGVtcHR5IHdlIGFyZSBvcGVyYXRpbmcgb24gYSAtTCBhcmd1bWVudC4KKwkgICAgICBpZiB0ZXN0IC1uICIkbmFtZSIgJiYgdGVzdCAiJG5hbWUiICE9ICIwIjsgdGhlbgorCQlsaWJuYW1lPWBldmFsIFxcJGVjaG8gXCIkbGlibmFtZV9zcGVjXCJgCisJCWRlcGxpYl9tYXRjaGVzPWBldmFsIFxcJGVjaG8gXCIkbGlicmFyeV9uYW1lc19zcGVjXCJgCisJCXNldCBkdW1teSAkZGVwbGliX21hdGNoZXMKKwkJZGVwbGliX21hdGNoPSQyCisJCWlmIHRlc3QgYGV4cHIgIiRsZGRfb3V0cHV0IiA6ICIuKiRkZXBsaWJfbWF0Y2giYCAtbmUgMCA7IHRoZW4KKwkJICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkaSIKKwkJZWxzZQorCQkgIGRyb3BwZWRkZXBzPXllcworCQkgIGVjaG8KKwkJICBlY2hvICIqKiogV2FybmluZzogVGhpcyBsaWJyYXJ5IG5lZWRzIHNvbWUgZnVuY3Rpb25hbGl0eSBwcm92aWRlZCBieSAkaS4iCisJCSAgZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKKwkJICBlY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgorCQkgIGVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZS4iCisJCWZpCisJICAgICAgZWxzZQorCQluZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkaSIKKwkgICAgICBmaQorCSAgICBkb25lCisJICBlbHNlCisJICAgICMgRXJyb3Igb2NjdXJlZCBpbiB0aGUgZmlyc3QgY29tcGlsZS4gIExldCdzIHRyeSB0byBzYWx2YWdlIHRoZSBzaXR1YXRpb246CisJICAgICMgQ29tcGlsZSBhIHNlcGVyYXRlIHByb2dyYW0gZm9yIGVhY2ggbGlicmFyeS4KKwkgICAgZm9yIGkgaW4gJGRlcGxpYnM7IGRvCisJICAgICAgbmFtZT0iYGV4cHIgJGkgOiAnLWxcKC4qXCknYCIKKwkgICAgICMgSWYgJG5hbWUgaXMgZW1wdHkgd2UgYXJlIG9wZXJhdGluZyBvbiBhIC1MIGFyZ3VtZW50LgorCSAgICAgIGlmIHRlc3QgLW4gIiRuYW1lIiAmJiB0ZXN0ICIkbmFtZSIgIT0gIjAiOyB0aGVuCisJCSRybSBjb25mdGVzdAorCQkkQ0MgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAkaQorCQkjIERpZCBpdCB3b3JrPworCQlpZiB0ZXN0ICQ/IC1lcSAwIDsgdGhlbgorCQkgIGxkZF9vdXRwdXQ9YGxkZCBjb25mdGVzdGAKKwkJICBsaWJuYW1lPWBldmFsIFxcJGVjaG8gXCIkbGlibmFtZV9zcGVjXCJgCisJCSAgZGVwbGliX21hdGNoZXM9YGV2YWwgXFwkZWNobyBcIiRsaWJyYXJ5X25hbWVzX3NwZWNcImAKKwkJICBzZXQgZHVtbXkgJGRlcGxpYl9tYXRjaGVzCisJCSAgZGVwbGliX21hdGNoPSQyCisJCSAgaWYgdGVzdCBgZXhwciAiJGxkZF9vdXRwdXQiIDogIi4qJGRlcGxpYl9tYXRjaCJgIC1uZSAwIDsgdGhlbgorCQkgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCisJCSAgZWxzZQorCQkgICAgZHJvcHBlZGRlcHM9eWVzCisJCSAgICBlY2hvCisJCSAgICBlY2hvICIqKiogV2FybmluZzogVGhpcyBsaWJyYXJ5IG5lZWRzIHNvbWUgZnVuY3Rpb25hbGl0eSBwcm92aWRlZCBieSAkaS4iCisJCSAgICBlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCQkgICAgZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkJICAgIGVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZS4iCisJCSAgZmkKKwkJZWxzZQorCQkgIGRyb3BwZWRkZXBzPXllcworCQkgIGVjaG8KKwkJICBlY2hvICIqKiogV2FybmluZyEgIExpYnJhcnkgJGkgaXMgbmVlZGVkIGJ5IHRoaXMgbGlicmFyeSBidXQgSSB3YXMgbm90IGFibGUgdG8iCisJCSAgZWNobyAiKioqICBtYWtlIGl0IGxpbmsgaW4hICBZb3Ugd2lsbCBwcm9iYWJseSBuZWVkIHRvIGluc3RhbGwgaXQgb3Igc29tZSIKKwkJICBlY2hvICIqKiogbGlicmFyeSB0aGF0IGl0IGRlcGVuZHMgb24gYmVmb3JlIHRoaXMgbGlicmFyeSB3aWxsIGJlIGZ1bGx5IgorCQkgIGVjaG8gIioqKiBmdW5jdGlvbmFsLiAgSW5zdGFsbGluZyBpdCBiZWZvcmUgY29udGludWluZyB3b3VsZCBiZSBldmVuIGJldHRlci4iCisJCWZpCisJICAgICAgZWxzZQorCQluZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkaSIKKwkgICAgICBmaQorCSAgICBkb25lCisJICBmaQorCSAgOzsKKwlmaWxlX21hZ2ljKikKKwkgIHNldCBkdW1teSAkZGVwbGlic19jaGVja19tZXRob2QKKwkgIGZpbGVfbWFnaWNfcmVnZXg9YGV4cHIgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgOiAiJDIgXCguKlwpImAKKwkgIGZvciBhX2RlcGxpYiBpbiAkZGVwbGliczsgZG8KKwkgICAgbmFtZT0iYGV4cHIgJGFfZGVwbGliIDogJy1sXCguKlwpJ2AiCisJICAgICMgSWYgJG5hbWUgaXMgZW1wdHkgd2UgYXJlIG9wZXJhdGluZyBvbiBhIC1MIGFyZ3VtZW50LgorCSAgICBpZiB0ZXN0IC1uICIkbmFtZSIgJiYgdGVzdCAiJG5hbWUiICE9ICIwIjsgdGhlbgorCSAgICAgIGxpYm5hbWU9YGV2YWwgXFwkZWNobyBcIiRsaWJuYW1lX3NwZWNcImAKKwkgICAgICBmb3IgaSBpbiAkbGliX3NlYXJjaF9wYXRoICRzeXNfbGliX3NlYXJjaF9wYXRoICRzaGxpYl9zZWFyY2hfcGF0aDsgZG8KKwkJICAgIHBvdGVudGlhbF9saWJzPWBscyAkaS8kbGlibmFtZVsuLV0qIDI+L2Rldi9udWxsYAorCQkgICAgZm9yIHBvdGVudF9saWIgaW4gJHBvdGVudGlhbF9saWJzOyBkbworCQkgICAgICAjIEZvbGxvdyBzb2Z0IGxpbmtzLgorCQkgICAgICBpZiBscyAtbExkICIkcG90ZW50X2xpYiIgMj4vZGV2L251bGwgXAorCQkJIHwgZ3JlcCAiIC0+ICIgPi9kZXYvbnVsbDsgdGhlbgorCQkJY29udGludWUKKwkJICAgICAgZmkKKwkJICAgICAgIyBUaGUgc3RhdGVtZW50IGFib3ZlIHRyaWVzIHRvIGF2b2lkIGVudGVyaW5nIGFuCisJCSAgICAgICMgZW5kbGVzcyBsb29wIGJlbG93LCBpbiBjYXNlIG9mIGN5Y2xpYyBsaW5rcy4KKwkJICAgICAgIyBXZSBtaWdodCBzdGlsbCBlbnRlciBhbiBlbmRsZXNzIGxvb3AsIHNpbmNlIGEgbGluaworCQkgICAgICAjIGxvb3AgY2FuIGJlIGNsb3NlZCB3aGlsZSB3ZSBmb2xsb3cgbGlua3MsCisJCSAgICAgICMgYnV0IHNvIHdoYXQ/CisJCSAgICAgIHBvdGxpYj0iJHBvdGVudF9saWIiCisJCSAgICAgIHdoaWxlIHRlc3QgLWggIiRwb3RsaWIiIDI+L2Rldi9udWxsOyBkbworCQkJcG90bGlibGluaz1gbHMgLWxkICRwb3RsaWIgfCBzZWQgJ3MvLiogLT4gLy8nYAorCQkJY2FzZSAkcG90bGlibGluayBpbgorCQkJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBwb3RsaWI9IiRwb3RsaWJsaW5rIjs7CisJCQkqKSBwb3RsaWI9YCRlY2hvICJYJHBvdGxpYiIgfCAkWHNlZCAtZSAncyxbXi9dKiQsLCdgIiRwb3RsaWJsaW5rIjs7CisJCQllc2FjCisJCSAgICAgIGRvbmUKKwkJICAgICAgaWYgZXZhbCAkZmlsZV9tYWdpY19jbWQgXCJcJHBvdGxpYlwiIDI+L2Rldi9udWxsIFwKKwkJCSB8IHNlZCAxMHEgXAorCQkJIHwgZWdyZXAgIiRmaWxlX21hZ2ljX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgorCQkJbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgorCQkJYV9kZXBsaWI9IiIKKwkJCWJyZWFrIDIKKwkJICAgICAgZmkKKwkJICAgIGRvbmUKKwkgICAgICBkb25lCisJICAgICAgaWYgdGVzdCAtbiAiJGFfZGVwbGliIiA7IHRoZW4KKwkJZHJvcHBlZGRlcHM9eWVzCisJCWVjaG8KKwkJZWNobyAiKioqIFdhcm5pbmc6IFRoaXMgbGlicmFyeSBuZWVkcyBzb21lIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgYnkgJGFfZGVwbGliLiIKKwkJZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKKwkJZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkJZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlLiIKKwkgICAgICBmaQorCSAgICBlbHNlCisJICAgICAgIyBBZGQgYSAtTCBhcmd1bWVudC4KKwkgICAgICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkYV9kZXBsaWIiCisJICAgIGZpCisJICBkb25lICMgR29uZSB0aHJvdWdoIGFsbCBkZXBsaWJzLgorCSAgOzsKKwltYXRjaF9wYXR0ZXJuKikKKwkgIHNldCBkdW1teSAkZGVwbGlic19jaGVja19tZXRob2QKKwkgIG1hdGNoX3BhdHRlcm5fcmVnZXg9YGV4cHIgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgOiAiJDIgXCguKlwpImAKKwkgIGZvciBhX2RlcGxpYiBpbiAkZGVwbGliczsgZG8KKwkgICAgbmFtZT0iYGV4cHIgJGFfZGVwbGliIDogJy1sXCguKlwpJ2AiCisJICAgICMgSWYgJG5hbWUgaXMgZW1wdHkgd2UgYXJlIG9wZXJhdGluZyBvbiBhIC1MIGFyZ3VtZW50LgorCSAgICBpZiB0ZXN0IC1uICIkbmFtZSIgJiYgdGVzdCAiJG5hbWUiICE9ICIwIjsgdGhlbgorCSAgICAgIGxpYm5hbWU9YGV2YWwgXFwkZWNobyBcIiRsaWJuYW1lX3NwZWNcImAKKwkgICAgICBmb3IgaSBpbiAkbGliX3NlYXJjaF9wYXRoICRzeXNfbGliX3NlYXJjaF9wYXRoICRzaGxpYl9zZWFyY2hfcGF0aDsgZG8KKwkJcG90ZW50aWFsX2xpYnM9YGxzICRpLyRsaWJuYW1lWy4tXSogMj4vZGV2L251bGxgCisJCWZvciBwb3RlbnRfbGliIGluICRwb3RlbnRpYWxfbGliczsgZG8KKwkJICBpZiBldmFsIGVjaG8gXCIkcG90ZW50X2xpYlwiIDI+L2Rldi9udWxsIFwKKwkJICAgICAgfCBzZWQgMTBxIFwKKwkJICAgICAgfCBlZ3JlcCAiJG1hdGNoX3BhdHRlcm5fcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCisJCSAgICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkYV9kZXBsaWIiCisJCSAgICBhX2RlcGxpYj0iIgorCQkgICAgYnJlYWsgMgorCQkgIGZpCisJCWRvbmUKKwkgICAgICBkb25lCisJICAgICAgaWYgdGVzdCAtbiAiJGFfZGVwbGliIiA7IHRoZW4KKwkJZHJvcHBlZGRlcHM9eWVzCisJCWVjaG8KKwkJZWNobyAiKioqIFdhcm5pbmc6IFRoaXMgbGlicmFyeSBuZWVkcyBzb21lIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgYnkgJGFfZGVwbGliLiIKKwkJZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKKwkJZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkJZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlLiIKKwkgICAgICBmaQorCSAgICBlbHNlCisJICAgICAgIyBBZGQgYSAtTCBhcmd1bWVudC4KKwkgICAgICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkYV9kZXBsaWIiCisJICAgIGZpCisJICBkb25lICMgR29uZSB0aHJvdWdoIGFsbCBkZXBsaWJzLgorCSAgOzsKKwlub25lIHwgdW5rbm93biB8ICopCisJICBuZXdkZXBsaWJzPSIiCisJICBpZiAkZWNobyAiWCAkZGVwbGlicyIgfCAkWHNlZCAtZSAncy8gLWxjJC8vJyBcCisJICAgICAgIC1lICdzLyAtW0xSXVteIF0qLy9nJyAtZSAncy9bIAldLy9nJyB8CisJICAgICBncmVwIC4gPi9kZXYvbnVsbDsgdGhlbgorCSAgICBlY2hvCisJICAgIGlmIHRlc3QgIlgkZGVwbGlic19jaGVja19tZXRob2QiID0gIlhub25lIjsgdGhlbgorCSAgICAgIGVjaG8gIioqKiBXYXJuaW5nOiBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGlzIHBsYXRmb3JtLiIKKwkgICAgZWxzZQorCSAgICAgIGVjaG8gIioqKiBXYXJuaW5nOiBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyBhcmUgbm90IGtub3duIHRvIGJlIHN1cHBvcnRlZC4iCisJICAgIGZpCisJICAgIGVjaG8gIioqKiBBbGwgZGVjbGFyZWQgaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIGJlaW5nIGRyb3BwZWQuIgorCSAgICBkcm9wcGVkZGVwcz15ZXMKKwkgIGZpCisJICA7OworCWVzYWMKKwl2ZXJzdWZmaXg9JHZlcnN1ZmZpeF9zYXZlCisJbWFqb3I9JG1ham9yX3NhdmUKKwlyZWxlYXNlPSRyZWxlYXNlX3NhdmUKKwlsaWJuYW1lPSRsaWJuYW1lX3NhdmUKKwluYW1lPSRuYW1lX3NhdmUKKworCWNhc2UgJGhvc3QgaW4KKwkqLSotcmhhcHNvZHkqIHwgKi0qLWRhcndpbjEuWzAxMl0pCisJICAjIE9uIFJoYXBzb2R5IHJlcGxhY2UgdGhlIEMgbGlicmFyeSBpcyB0aGUgU3lzdGVtIGZyYW1ld29yaworCSAgbmV3ZGVwbGlicz1gJGVjaG8gIlggJG5ld2RlcGxpYnMiIHwgJFhzZWQgLWUgJ3MvIC1sYyAvIC1mcmFtZXdvcmsgU3lzdGVtIC8nYAorCSAgOzsKKwllc2FjCisKKwlpZiB0ZXN0ICIkZHJvcHBlZGRlcHMiID0geWVzOyB0aGVuCisJICBpZiB0ZXN0ICIkbW9kdWxlIiA9IHllczsgdGhlbgorCSAgICBlY2hvCisJICAgIGVjaG8gIioqKiBXYXJuaW5nOiBsaWJ0b29sIGNvdWxkIG5vdCBzYXRpc2Z5IGFsbCBkZWNsYXJlZCBpbnRlci1saWJyYXJ5IgorCSAgICBlY2hvICIqKiogZGVwZW5kZW5jaWVzIG9mIG1vZHVsZSAkbGlibmFtZS4gIFRoZXJlZm9yZSwgbGlidG9vbCB3aWxsIGNyZWF0ZSIKKwkgICAgZWNobyAiKioqIGEgc3RhdGljIG1vZHVsZSwgdGhhdCBzaG91bGQgd29yayBhcyBsb25nIGFzIHRoZSBkbG9wZW5pbmciCisJICAgIGVjaG8gIioqKiBhcHBsaWNhdGlvbiBpcyBsaW5rZWQgd2l0aCB0aGUgLWRsb3BlbiBmbGFnLiIKKwkgICAgaWYgdGVzdCAteiAiJGdsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KKwkgICAgICBlY2hvCisJICAgICAgZWNobyAiKioqIEhvd2V2ZXIsIHRoaXMgd291bGQgb25seSB3b3JrIGlmIGxpYnRvb2wgd2FzIGFibGUgdG8gZXh0cmFjdCBzeW1ib2wiCisJICAgICAgZWNobyAiKioqIGxpc3RzIGZyb20gYSBwcm9ncmFtLCB1c2luZyBcYG5tJyBvciBlcXVpdmFsZW50LCBidXQgbGlidG9vbCBjb3VsZCIKKwkgICAgICBlY2hvICIqKiogbm90IGZpbmQgc3VjaCBhIHByb2dyYW0uICBTbywgdGhpcyBtb2R1bGUgaXMgcHJvYmFibHkgdXNlbGVzcy4iCisJICAgICAgZWNobyAiKioqIFxgbm0nIGZyb20gR05VIGJpbnV0aWxzIGFuZCBhIGZ1bGwgcmVidWlsZCBtYXkgaGVscC4iCisJICAgIGZpCisJICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSBubzsgdGhlbgorCSAgICAgIG9sZGxpYnM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQiCisJICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQorCSAgICAgIGJ1aWxkX29sZF9saWJzPXllcworCSAgICBlbHNlCisJICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCisJICAgIGZpCisJICBlbHNlCisJICAgIGVjaG8gIioqKiBUaGUgaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgdGhhdCBoYXZlIGJlZW4gZHJvcHBlZCBoZXJlIHdpbGwgYmUiCisJICAgIGVjaG8gIioqKiBhdXRvbWF0aWNhbGx5IGFkZGVkIHdoZW5ldmVyIGEgcHJvZ3JhbSBpcyBsaW5rZWQgd2l0aCB0aGlzIGxpYnJhcnkiCisJICAgIGVjaG8gIioqKiBvciBpcyBkZWNsYXJlZCB0byAtZGxvcGVuIGl0LiIKKworCSAgICBpZiB0ZXN0ICRhbGxvd191bmRlZmluZWQgPSBubzsgdGhlbgorCSAgICAgIGVjaG8KKwkgICAgICBlY2hvICIqKiogU2luY2UgdGhpcyBsaWJyYXJ5IG11c3Qgbm90IGNvbnRhaW4gdW5kZWZpbmVkIHN5bWJvbHMsIgorCSAgICAgIGVjaG8gIioqKiBiZWNhdXNlIGVpdGhlciB0aGUgcGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCB0aGVtIG9yIgorCSAgICAgIGVjaG8gIioqKiBpdCB3YXMgZXhwbGljaXRseSByZXF1ZXN0ZWQgd2l0aCAtbm8tdW5kZWZpbmVkLCIKKwkgICAgICBlY2hvICIqKiogbGlidG9vbCB3aWxsIG9ubHkgY3JlYXRlIGEgc3RhdGljIHZlcnNpb24gb2YgaXQuIgorCSAgICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSBubzsgdGhlbgorCQlvbGRsaWJzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0IgorCQlidWlsZF9saWJ0b29sX2xpYnM9bW9kdWxlCisJCWJ1aWxkX29sZF9saWJzPXllcworCSAgICAgIGVsc2UKKwkJYnVpbGRfbGlidG9vbF9saWJzPW5vCisJICAgICAgZmkKKwkgICAgZmkKKwkgIGZpCisJZmkKKwkjIERvbmUgY2hlY2tpbmcgZGVwbGlicyEKKwlkZXBsaWJzPSRuZXdkZXBsaWJzCisgICAgICBmaQorCisgICAgICAjIEFsbCB0aGUgbGlicmFyeS1zcGVjaWZpYyB2YXJpYWJsZXMgKGluc3RhbGxfbGliZGlyIGlzIHNldCBhYm92ZSkuCisgICAgICBsaWJyYXJ5X25hbWVzPQorICAgICAgb2xkX2xpYnJhcnk9CisgICAgICBkbG5hbWU9CisKKyAgICAgICMgVGVzdCBhZ2Fpbiwgd2UgbWF5IGhhdmUgZGVjaWRlZCBub3QgdG8gYnVpbGQgaXQgYW55IG1vcmUKKyAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisJaWYgdGVzdCAkaGFyZGNvZGVfaW50b19saWJzID0geWVzOyB0aGVuCisJICAjIEhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGhzCisJICBoYXJkY29kZV9saWJkaXJzPQorCSAgZGVwX3JwYXRoPQorCSAgcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCIKKwkgIHRlc3QgIiRtb2RlIiAhPSByZWxpbmsgJiYgcnBhdGg9IiRjb21waWxlX3JwYXRoJHJwYXRoIgorCSAgZm9yIGxpYmRpciBpbiAkcnBhdGg7IGRvCisJICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgorCSAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgorCQlpZiB0ZXN0IC16ICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKwkJICBoYXJkY29kZV9saWJkaXJzPSIkbGliZGlyIgorCQllbHNlCisJCSAgIyBKdXN0IGFjY3VtdWxhdGUgdGhlIHVuaXF1ZSBsaWJkaXJzLgorCQkgIGNhc2UgJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIGluCisJCSAgKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQorCQkgICAgOzsKKwkJICAqKQorCQkgICAgaGFyZGNvZGVfbGliZGlycz0iJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIiCisJCSAgICA7OworCQkgIGVzYWMKKwkJZmkKKwkgICAgICBlbHNlCisJCWV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKwkJZGVwX3JwYXRoPSIkZGVwX3JwYXRoICRmbGFnIgorCSAgICAgIGZpCisJICAgIGVsaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgorCSAgICAgIGNhc2UgIiRwZXJtX3JwYXRoICIgaW4KKwkgICAgICAqIiAkbGliZGlyICIqKSA7OworCSAgICAgICopIHBlcm1fcnBhdGg9IiRwZXJtX3JwYXRoICRsaWJkaXIiIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgZG9uZQorCSAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KKwkgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgorCSAgICAgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJICAgIGxpYmRpcj0iJGhhcmRjb2RlX2xpYmRpcnMiCisJICAgIGV2YWwgZGVwX3JwYXRoPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorCSAgZmkKKwkgIGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciIgJiYgdGVzdCAtbiAiJHBlcm1fcnBhdGgiOyB0aGVuCisJICAgICMgV2Ugc2hvdWxkIHNldCB0aGUgcnVucGF0aF92YXIuCisJICAgIHJwYXRoPQorCSAgICBmb3IgZGlyIGluICRwZXJtX3JwYXRoOyBkbworCSAgICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKKwkgICAgZG9uZQorCSAgICBldmFsICIkcnVucGF0aF92YXI9JyRycGF0aFwkJHJ1bnBhdGhfdmFyJzsgZXhwb3J0ICRydW5wYXRoX3ZhciIKKwkgIGZpCisJICB0ZXN0IC1uICIkZGVwX3JwYXRoIiAmJiBkZXBsaWJzPSIkZGVwX3JwYXRoICRkZXBsaWJzIgorCWZpCisKKwlzaGxpYnBhdGg9IiRmaW5hbGl6ZV9zaGxpYnBhdGgiCisJdGVzdCAiJG1vZGUiICE9IHJlbGluayAmJiBzaGxpYnBhdGg9IiRjb21waWxlX3NobGlicGF0aCRzaGxpYnBhdGgiCisJaWYgdGVzdCAtbiAiJHNobGlicGF0aCI7IHRoZW4KKwkgIGV2YWwgIiRzaGxpYnBhdGhfdmFyPSckc2hsaWJwYXRoXCQkc2hsaWJwYXRoX3Zhcic7IGV4cG9ydCAkc2hsaWJwYXRoX3ZhciIKKwlmaQorCisJIyBHZXQgdGhlIHJlYWwgYW5kIGxpbmsgbmFtZXMgb2YgdGhlIGxpYnJhcnkuCisJZXZhbCBsaWJyYXJ5X25hbWVzPVwiJGxpYnJhcnlfbmFtZXNfc3BlY1wiCisJc2V0IGR1bW15ICRsaWJyYXJ5X25hbWVzCisJcmVhbG5hbWU9IiQyIgorCXNoaWZ0OyBzaGlmdAorCisJaWYgdGVzdCAtbiAiJHNvbmFtZV9zcGVjIjsgdGhlbgorCSAgZXZhbCBzb25hbWU9XCIkc29uYW1lX3NwZWNcIgorCWVsc2UKKwkgIHNvbmFtZT0iJHJlYWxuYW1lIgorCWZpCisJdGVzdCAteiAiJGRsbmFtZSIgJiYgZGxuYW1lPSRzb25hbWUKKworCWxpYj0iJG91dHB1dF9vYmpkaXIvJHJlYWxuYW1lIgorCWZvciBsaW5rCisJZG8KKwkgIGxpbmtuYW1lcz0iJGxpbmtuYW1lcyAkbGluayIKKwlkb25lCisKKwkjIEVuc3VyZSB0aGF0IHdlIGhhdmUgLm8gb2JqZWN0cyBmb3IgbGlua2VycyB3aGljaCBkaXNsaWtlIC5sbworCSMgKGUuZy4gYWl4KSBpbiBjYXNlIHdlIGFyZSBydW5uaW5nIC0tZGlzYWJsZS1zdGF0aWMKKwlmb3Igb2JqIGluICRsaWJvYmpzOyBkbworCSAgeGRpcj1gJGVjaG8gIlgkb2JqIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisJICBpZiB0ZXN0ICJYJHhkaXIiID0gIlgkb2JqIjsgdGhlbgorCSAgICB4ZGlyPSIuIgorCSAgZWxzZQorCSAgICB4ZGlyPSIkeGRpciIKKwkgIGZpCisJICBiYXNlb2JqPWAkZWNobyAiWCRvYmoiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKwkgIG9sZG9iaj1gJGVjaG8gIlgkYmFzZW9iaiIgfCAkWHNlZCAtZSAiJGxvMm8iYAorCSAgaWYgdGVzdCAhIC1mICR4ZGlyLyRvbGRvYmo7IHRoZW4KKwkgICAgJHNob3cgIihjZCAkeGRpciAmJiAke0xOX1N9ICRiYXNlb2JqICRvbGRvYmopIgorCSAgICAkcnVuIGV2YWwgJyhjZCAkeGRpciAmJiAke0xOX1N9ICRiYXNlb2JqICRvbGRvYmopJyB8fCBleGl0ICQ/CisJICBmaQorCWRvbmUKKworCSMgVXNlIHN0YW5kYXJkIG9iamVjdHMgaWYgdGhleSBhcmUgcGljCisJdGVzdCAteiAiJHBpY19mbGFnIiAmJiBsaWJvYmpzPWAkZWNobyAiWCRsaWJvYmpzIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCisKKwkjIFByZXBhcmUgdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgc3ltYm9scworCWlmIHRlc3QgLXogIiRleHBvcnRfc3ltYm9scyI7IHRoZW4KKwkgIGlmIHRlc3QgIiRhbHdheXNfZXhwb3J0X3N5bWJvbHMiID0geWVzIHx8IHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KKwkgICAgJHNob3cgImdlbmVyYXRpbmcgc3ltYm9sIGxpc3QgZm9yIFxgJGxpYm5hbWUubGEnIgorCSAgICBleHBvcnRfc3ltYm9scz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZXhwIgorCSAgICAkcnVuICRybSAkZXhwb3J0X3N5bWJvbHMKKwkgICAgZXZhbCBjbWRzPVwiJGV4cG9ydF9zeW1ib2xzX2NtZHNcIgorCSAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKwkgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KKwkgICAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgICAkc2hvdyAiJGNtZCIKKwkgICAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KKwkgICAgZG9uZQorCSAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgorCSAgICAgICRzaG93ICJlZ3JlcCAtZSBcIiRleHBvcnRfc3ltYm9sc19yZWdleFwiIFwiJGV4cG9ydF9zeW1ib2xzXCIgPiBcIiR7ZXhwb3J0X3N5bWJvbHN9VFwiIgorCSAgICAgICRydW4gZXZhbCAnZWdyZXAgLWUgIiRleHBvcnRfc3ltYm9sc19yZWdleCIgIiRleHBvcnRfc3ltYm9scyIgPiAiJHtleHBvcnRfc3ltYm9sc31UIicKKwkgICAgICAkc2hvdyAiJG12IFwiJHtleHBvcnRfc3ltYm9sc31UXCIgXCIkZXhwb3J0X3N5bWJvbHNcIiIKKwkgICAgICAkcnVuIGV2YWwgJyRtdiAiJHtleHBvcnRfc3ltYm9sc31UIiAiJGV4cG9ydF9zeW1ib2xzIicKKwkgICAgZmkKKwkgIGZpCisJZmkKKworCWlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGluY2x1ZGVfZXhwc3ltcyI7IHRoZW4KKwkgICRydW4gZXZhbCAnJGVjaG8gIlgkaW5jbHVkZV9leHBzeW1zIiB8ICRTUDJOTCA+PiAiJGV4cG9ydF9zeW1ib2xzIicKKwlmaQorCisJaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIjsgdGhlbgorCSAgaWYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgorCSAgICBldmFsIGxpYm9ianM9XCJcJGxpYm9ianMgJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjXCIKKwkgIGVsc2UKKwkgICAgZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9eCIKKwkgICAgJHNob3cgIiR7cm19ciAkZ2VudG9wIgorCSAgICAkcnVuICR7cm19ciAiJGdlbnRvcCIKKwkgICAgJHNob3cgIm1rZGlyICRnZW50b3AiCisJICAgICRydW4gbWtkaXIgIiRnZW50b3AiCisJICAgIHN0YXR1cz0kPworCSAgICBpZiB0ZXN0ICRzdGF0dXMgLW5lIDAgJiYgdGVzdCAhIC1kICIkZ2VudG9wIjsgdGhlbgorCSAgICAgIGV4aXQgJHN0YXR1cworCSAgICBmaQorCSAgICBnZW5lcmF0ZWQ9IiRnZW5lcmF0ZWQgJGdlbnRvcCIKKworCSAgICBmb3IgeGxpYiBpbiAkY29udmVuaWVuY2U7IGRvCisJICAgICAgIyBFeHRyYWN0IHRoZSBvYmplY3RzLgorCSAgICAgIGNhc2UgJHhsaWIgaW4KKwkgICAgICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIHhhYnM9IiR4bGliIiA7OworCSAgICAgICopIHhhYnM9YHB3ZGAiLyR4bGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgICB4bGliPWAkZWNobyAiWCR4bGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisJICAgICAgeGRpcj0iJGdlbnRvcC8keGxpYiIKKworCSAgICAgICRzaG93ICIke3JtfXIgJHhkaXIiCisJICAgICAgJHJ1biAke3JtfXIgIiR4ZGlyIgorCSAgICAgICRzaG93ICJta2RpciAkeGRpciIKKwkgICAgICAkcnVuIG1rZGlyICIkeGRpciIKKwkgICAgICBzdGF0dXM9JD8KKwkgICAgICBpZiB0ZXN0ICRzdGF0dXMgLW5lIDAgJiYgdGVzdCAhIC1kICIkeGRpciI7IHRoZW4KKwkJZXhpdCAkc3RhdHVzCisJICAgICAgZmkKKwkgICAgICAkc2hvdyAiKGNkICR4ZGlyICYmICRBUiB4ICR4YWJzKSIKKwkgICAgICAkcnVuIGV2YWwgIihjZCBcJHhkaXIgJiYgJEFSIHggXCR4YWJzKSIgfHwgZXhpdCAkPworCisJICAgICAgbGlib2Jqcz0iJGxpYm9ianMgImBmaW5kICR4ZGlyIC1uYW1lIFwqLm8gLXByaW50IC1vIC1uYW1lIFwqLmxvIC1wcmludCB8ICROTDJTUGAKKwkgICAgZG9uZQorCSAgZmkKKwlmaQorCisJaWYgdGVzdCAiJHRocmVhZF9zYWZlIiA9IHllcyAmJiB0ZXN0IC1uICIkdGhyZWFkX3NhZmVfZmxhZ19zcGVjIjsgdGhlbgorCSAgZXZhbCBmbGFnPVwiJHRocmVhZF9zYWZlX2ZsYWdfc3BlY1wiCisJICBsaW5rZXJfZmxhZ3M9IiRsaW5rZXJfZmxhZ3MgJGZsYWciCisJZmkKKworCSMgTWFrZSBhIGJhY2t1cCBvZiB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSB3aGVuIHJlbGlua2luZworCWlmIHRlc3QgIiRtb2RlIiA9IHJlbGluazsgdGhlbgorCSAgJHJ1biBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICR7cmVhbG5hbWV9VSAmJiAkbXYgJHJlYWxuYW1lICR7cmVhbG5hbWV9VSknIHx8IGV4aXQgJD8KKwlmaQorCisJIyBEbyBlYWNoIG9mIHRoZSBhcmNoaXZlIGNvbW1hbmRzLgorCWlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGFyY2hpdmVfZXhwc3ltX2NtZHMiOyB0aGVuCisJICBldmFsIGNtZHM9XCIkYXJjaGl2ZV9leHBzeW1fY21kc1wiCisJZWxzZQorCSAgZXZhbCBjbWRzPVwiJGFyY2hpdmVfY21kc1wiCisJZmkKKwlzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKwlmb3IgY21kIGluICRjbWRzOyBkbworCSAgSUZTPSIkc2F2ZV9pZnMiCisJICAkc2hvdyAiJGNtZCIKKwkgICRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPworCWRvbmUKKwlJRlM9IiRzYXZlX2lmcyIKKworCSMgUmVzdG9yZSB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSBhbmQgZXhpdAorCWlmIHRlc3QgIiRtb2RlIiA9IHJlbGluazsgdGhlbgorCSAgJHJ1biBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICR7cmVhbG5hbWV9VCAmJiAkbXYgJHJlYWxuYW1lICR7cmVhbG5hbWV9VCAmJiAkbXYgIiRyZWFsbmFtZSJVICRyZWFsbmFtZSknIHx8IGV4aXQgJD8KKwkgIGV4aXQgMAorCWZpCisKKwkjIENyZWF0ZSBsaW5rcyB0byB0aGUgcmVhbCBsaWJyYXJ5LgorCWZvciBsaW5rbmFtZSBpbiAkbGlua25hbWVzOyBkbworCSAgaWYgdGVzdCAiJHJlYWxuYW1lIiAhPSAiJGxpbmtuYW1lIjsgdGhlbgorCSAgICAkc2hvdyAiKGNkICRvdXRwdXRfb2JqZGlyICYmICRybSAkbGlua25hbWUgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZSkiCisJICAgICRydW4gZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRybSAkbGlua25hbWUgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZSknIHx8IGV4aXQgJD8KKwkgIGZpCisJZG9uZQorCisJIyBJZiAtbW9kdWxlIG9yIC1leHBvcnQtZHluYW1pYyB3YXMgc3BlY2lmaWVkLCBzZXQgdGhlIGRsbmFtZS4KKwlpZiB0ZXN0ICIkbW9kdWxlIiA9IHllcyB8fCB0ZXN0ICIkZXhwb3J0X2R5bmFtaWMiID0geWVzOyB0aGVuCisJICAjIE9uIGFsbCBrbm93biBvcGVyYXRpbmcgc3lzdGVtcywgdGhlc2UgYXJlIGlkZW50aWNhbC4KKwkgIGRsbmFtZT0iJHNvbmFtZSIKKwlmaQorICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBvYmopCisgICAgICBpZiB0ZXN0IC1uICIkZGVwbGlicyI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1sJyBhbmQgXGAtTCcgYXJlIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRkbGZpbGVzJGRscHJlZmlsZXMiIHx8IHRlc3QgIiRkbHNlbGYiICE9IG5vOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtZGxvcGVuJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkcnBhdGgiOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcnBhdGgnIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiR4cnBhdGgiOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtUicgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJHZpbmZvIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXZlcnNpb24taW5mbycgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcmVsZWFzZScgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgorICAgICAgZmkKKworICAgICAgY2FzZSAkb3V0cHV0IGluCisgICAgICAqLmxvKQorCWlmIHRlc3QgLW4gIiRvYmpzJG9sZF9kZXBsaWJzIjsgdGhlbgorCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGJ1aWxkIGxpYnJhcnkgb2JqZWN0IFxgJG91dHB1dCcgZnJvbSBub24tbGlidG9vbCBvYmplY3RzIiAxPiYyCisJICBleGl0IDEKKwlmaQorCWxpYm9iaj0iJG91dHB1dCIKKwlvYmo9YCRlY2hvICJYJG91dHB1dCIgfCAkWHNlZCAtZSAiJGxvMm8iYAorCTs7CisgICAgICAqKQorCWxpYm9iaj0KKwlvYmo9IiRvdXRwdXQiCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgIyBEZWxldGUgdGhlIG9sZCBvYmplY3RzLgorICAgICAgJHJ1biAkcm0gJG9iaiAkbGlib2JqCisKKyAgICAgICMgT2JqZWN0cyBmcm9tIGNvbnZlbmllbmNlIGxpYnJhcmllcy4gIFRoaXMgYXNzdW1lcworICAgICAgIyBzaW5nbGUtdmVyc2lvbiBjb252ZW5pZW5jZSBsaWJyYXJpZXMuICBXaGVuZXZlciB3ZSBjcmVhdGUKKyAgICAgICMgZGlmZmVyZW50IG9uZXMgZm9yIFBJQy9ub24tUElDLCB0aGlzIHdlJ2xsIGhhdmUgdG8gZHVwbGljYXRlCisgICAgICAjIHRoZSBleHRyYWN0aW9uLgorICAgICAgcmVsb2FkX2NvbnZfb2Jqcz0KKyAgICAgIGdlbnRvcD0KKyAgICAgICMgcmVsb2FkX2NtZHMgcnVucyAkTEQgZGlyZWN0bHksIHNvIGxldCB1cyBnZXQgcmlkIG9mCisgICAgICAjIC1XbCBmcm9tIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjCisgICAgICB3bD0KKworICAgICAgaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIjsgdGhlbgorCWlmIHRlc3QgLW4gIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KKwkgIGV2YWwgcmVsb2FkX2NvbnZfb2Jqcz1cIlwkcmVsb2FkX29ianMgJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjXCIKKwllbHNlCisJICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b2JqfXgiCisJICAkc2hvdyAiJHtybX1yICRnZW50b3AiCisJICAkcnVuICR7cm19ciAiJGdlbnRvcCIKKwkgICRzaG93ICJta2RpciAkZ2VudG9wIgorCSAgJHJ1biBta2RpciAiJGdlbnRvcCIKKwkgIHN0YXR1cz0kPworCSAgaWYgdGVzdCAkc3RhdHVzIC1uZSAwICYmIHRlc3QgISAtZCAiJGdlbnRvcCI7IHRoZW4KKwkgICAgZXhpdCAkc3RhdHVzCisJICBmaQorCSAgZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICRnZW50b3AiCisKKwkgIGZvciB4bGliIGluICRjb252ZW5pZW5jZTsgZG8KKwkgICAgIyBFeHRyYWN0IHRoZSBvYmplY3RzLgorCSAgICBjYXNlICR4bGliIGluCisJICAgIFtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgeGFicz0iJHhsaWIiIDs7CisJICAgICopIHhhYnM9YHB3ZGAiLyR4bGliIiA7OworCSAgICBlc2FjCisJICAgIHhsaWI9YCRlY2hvICJYJHhsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKwkgICAgeGRpcj0iJGdlbnRvcC8keGxpYiIKKworCSAgICAkc2hvdyAiJHtybX1yICR4ZGlyIgorCSAgICAkcnVuICR7cm19ciAiJHhkaXIiCisJICAgICRzaG93ICJta2RpciAkeGRpciIKKwkgICAgJHJ1biBta2RpciAiJHhkaXIiCisJICAgIHN0YXR1cz0kPworCSAgICBpZiB0ZXN0ICRzdGF0dXMgLW5lIDAgJiYgdGVzdCAhIC1kICIkeGRpciI7IHRoZW4KKwkgICAgICBleGl0ICRzdGF0dXMKKwkgICAgZmkKKwkgICAgJHNob3cgIihjZCAkeGRpciAmJiAkQVIgeCAkeGFicykiCisJICAgICRydW4gZXZhbCAiKGNkIFwkeGRpciAmJiAkQVIgeCBcJHhhYnMpIiB8fCBleGl0ICQ/CisKKwkgICAgcmVsb2FkX2NvbnZfb2Jqcz0iJHJlbG9hZF9vYmpzICJgZmluZCAkeGRpciAtbmFtZSBcKi5vIC1wcmludCAtbyAtbmFtZSBcKi5sbyAtcHJpbnQgfCAkTkwyU1BgCisJICBkb25lCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgQ3JlYXRlIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgorICAgICAgcmVsb2FkX29ianM9IiRvYmpzJG9sZF9kZXBsaWJzICJgJGVjaG8gIlgkbGlib2JqcyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAnL1wuJyR7bGliZXh0fSQnL2QnIC1lICcvXC5saWIkL2QnIC1lICIkbG8ybyIgfCAkTkwyU1BgIiAkcmVsb2FkX2NvbnZfb2JqcyIgIyMjIHRlc3RzdWl0ZTogc2tpcCBuZXN0ZWQgcXVvdGluZyB0ZXN0CisKKyAgICAgIG91dHB1dD0iJG9iaiIKKyAgICAgIGV2YWwgY21kcz1cIiRyZWxvYWRfY21kc1wiCisgICAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKyAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCisJSUZTPSIkc2F2ZV9pZnMiCisJJHNob3cgIiRjbWQiCisJJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/CisgICAgICBkb25lCisgICAgICBJRlM9IiRzYXZlX2lmcyIKKworICAgICAgIyBFeGl0IGlmIHdlIGFyZW4ndCBkb2luZyBhIGxpYnJhcnkgb2JqZWN0IGZpbGUuCisgICAgICBpZiB0ZXN0IC16ICIkbGlib2JqIjsgdGhlbgorCWlmIHRlc3QgLW4gIiRnZW50b3AiOyB0aGVuCisJICAkc2hvdyAiJHtybX1yICRnZW50b3AiCisJICAkcnVuICR7cm19ciAkZ2VudG9wCisJZmkKKworCWV4aXQgMAorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCisJaWYgdGVzdCAtbiAiJGdlbnRvcCI7IHRoZW4KKwkgICRzaG93ICIke3JtfXIgJGdlbnRvcCIKKwkgICRydW4gJHtybX1yICRnZW50b3AKKwlmaQorCisJIyBDcmVhdGUgYW4gaW52YWxpZCBsaWJ0b29sIG9iamVjdCBpZiBubyBQSUMsIHNvIHRoYXQgd2UgZG9uJ3QKKwkjIGFjY2lkZW50YWxseSBsaW5rIGl0IGludG8gYSBwcm9ncmFtLgorCSRzaG93ICJlY2hvIHRpbWVzdGFtcCA+ICRsaWJvYmoiCisJJHJ1biBldmFsICJlY2hvIHRpbWVzdGFtcCA+ICRsaWJvYmoiIHx8IGV4aXQgJD8KKwlleGl0IDAKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRwaWNfZmxhZyIgfHwgdGVzdCAiJHBpY19tb2RlIiAhPSBkZWZhdWx0OyB0aGVuCisJIyBPbmx5IGRvIGNvbW1hbmRzIGlmIHdlIHJlYWxseSBoYXZlIGRpZmZlcmVudCBQSUMgb2JqZWN0cy4KKwlyZWxvYWRfb2Jqcz0iJGxpYm9ianMgJHJlbG9hZF9jb252X29ianMiCisJb3V0cHV0PSIkbGlib2JqIgorCWV2YWwgY21kcz1cIiRyZWxvYWRfY21kc1wiCisJc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJZm9yIGNtZCBpbiAkY21kczsgZG8KKwkgIElGUz0iJHNhdmVfaWZzIgorCSAgJHNob3cgIiRjbWQiCisJICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KKwlkb25lCisJSUZTPSIkc2F2ZV9pZnMiCisgICAgICBlbHNlCisJIyBKdXN0IGNyZWF0ZSBhIHN5bWxpbmsuCisJJHNob3cgJHJtICRsaWJvYmoKKwkkcnVuICRybSAkbGlib2JqCisJeGRpcj1gJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisJaWYgdGVzdCAiWCR4ZGlyIiA9ICJYJGxpYm9iaiI7IHRoZW4KKwkgIHhkaXI9Ii4iCisJZWxzZQorCSAgeGRpcj0iJHhkaXIiCisJZmkKKwliYXNlb2JqPWAkZWNobyAiWCRsaWJvYmoiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKwlvbGRvYmo9YCRlY2hvICJYJGJhc2VvYmoiIHwgJFhzZWQgLWUgIiRsbzJvImAKKwkkc2hvdyAiKGNkICR4ZGlyICYmICRMTl9TICRvbGRvYmogJGJhc2VvYmopIgorCSRydW4gZXZhbCAnKGNkICR4ZGlyICYmICRMTl9TICRvbGRvYmogJGJhc2VvYmopJyB8fCBleGl0ICQ/CisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkZ2VudG9wIjsgdGhlbgorCSRzaG93ICIke3JtfXIgJGdlbnRvcCIKKwkkcnVuICR7cm19ciAkZ2VudG9wCisgICAgICBmaQorCisgICAgICBleGl0IDAKKyAgICAgIDs7CisKKyAgICBwcm9nKQorICAgICAgY2FzZSAkaG9zdCBpbgorCSpjeWd3aW4qKSBvdXRwdXQ9YGVjaG8gJG91dHB1dCB8IHNlZCAtZSAncywuZXhlJCwsO3MsJCwuZXhlLCdgIDs7CisgICAgICBlc2FjCisgICAgICBpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBwcm9ncmFtcyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcmVsZWFzZScgaXMgaWdub3JlZCBmb3IgcHJvZ3JhbXMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRwcmVsb2FkIiA9IHllczsgdGhlbgorCWlmIHRlc3QgIiRkbG9wZW5fc3VwcG9ydCIgPSB1bmtub3duICYmIHRlc3QgIiRkbG9wZW5fc2VsZiIgPSB1bmtub3duICYmCisJICAgdGVzdCAiJGRsb3Blbl9zZWxmX3N0YXRpYyIgPSB1bmtub3duOyB0aGVuCisJICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYEFDX0xJQlRPT0xfRExPUEVOJyBub3QgdXNlZC4gQXNzdW1pbmcgbm8gZGxvcGVuIHN1cHBvcnQuIgorCWZpCisgICAgICBmaQorCisgICAgICBjYXNlICRob3N0IGluCisgICAgICAqLSotcmhhcHNvZHkqIHwgKi0qLWRhcndpbjEuWzAxMl0pCisJIyBPbiBSaGFwc29keSByZXBsYWNlIHRoZSBDIGxpYnJhcnkgaXMgdGhlIFN5c3RlbSBmcmFtZXdvcmsKKwljb21waWxlX2RlcGxpYnM9YCRlY2hvICJYICRjb21waWxlX2RlcGxpYnMiIHwgJFhzZWQgLWUgJ3MvIC1sYyAvIC1mcmFtZXdvcmsgU3lzdGVtIC8nYAorCWZpbmFsaXplX2RlcGxpYnM9YCRlY2hvICJYICRmaW5hbGl6ZV9kZXBsaWJzIiB8ICRYc2VkIC1lICdzLyAtbGMgLyAtZnJhbWV3b3JrIFN5c3RlbSAvJ2AKKwk7OworICAgICAgZXNhYworCisgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGNvbXBpbGVfZGVwbGlicyIKKyAgICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRmaW5hbGl6ZV9kZXBsaWJzIgorCisgICAgICBpZiB0ZXN0IC1uICIkcnBhdGgkeHJwYXRoIjsgdGhlbgorCSMgSWYgdGhlIHVzZXIgc3BlY2lmaWVkIGFueSBycGF0aCBmbGFncywgdGhlbiBhZGQgdGhlbS4KKwlmb3IgbGliZGlyIGluICRycGF0aCAkeHJwYXRoOyBkbworCSAgIyBUaGlzIGlzIHRoZSBtYWdpYyB0byB1c2UgLXJwYXRoLgorCSAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KKwkgICoiICRsaWJkaXIgIiopIDs7CisJICAqKSBmaW5hbGl6ZV9ycGF0aD0iJGZpbmFsaXplX3JwYXRoICRsaWJkaXIiIDs7CisJICBlc2FjCisJZG9uZQorICAgICAgZmkKKworICAgICAgIyBOb3cgaGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aHMKKyAgICAgIHJwYXRoPQorICAgICAgaGFyZGNvZGVfbGliZGlycz0KKyAgICAgIGZvciBsaWJkaXIgaW4gJGNvbXBpbGVfcnBhdGggJGZpbmFsaXplX3JwYXRoOyBkbworCWlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgorCSAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiOyB0aGVuCisJICAgIGlmIHRlc3QgLXogIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgorCSAgICAgIGhhcmRjb2RlX2xpYmRpcnM9IiRsaWJkaXIiCisJICAgIGVsc2UKKwkgICAgICAjIEp1c3QgYWNjdW11bGF0ZSB0aGUgdW5pcXVlIGxpYmRpcnMuCisJICAgICAgY2FzZSAkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IgaW4KKwkgICAgICAqIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiopCisJCTs7CisJICAgICAgKikKKwkJaGFyZGNvZGVfbGliZGlycz0iJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIiCisJCTs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgZWxzZQorCSAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisJICAgIHJwYXRoPSIkcnBhdGggJGZsYWciCisJICBmaQorCWVsaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgorCSAgY2FzZSAiJHBlcm1fcnBhdGggIiBpbgorCSAgKiIgJGxpYmRpciAiKikgOzsKKwkgICopIHBlcm1fcnBhdGg9IiRwZXJtX3JwYXRoICRsaWJkaXIiIDs7CisJICBlc2FjCisJZmkKKwljYXNlICRob3N0IGluCisJKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLW9zMiopCisJICBjYXNlIDokZGxsc2VhcmNocGF0aDogaW4KKwkgICoiOiRsaWJkaXI6IiopIDs7CisJICAqKSBkbGxzZWFyY2hwYXRoPSIkZGxsc2VhcmNocGF0aDokbGliZGlyIjs7CisJICBlc2FjCisJICA7OworCWVzYWMKKyAgICAgIGRvbmUKKyAgICAgICMgU3Vic3RpdHV0ZSB0aGUgaGFyZGNvZGVkIGxpYmRpcnMgaW50byB0aGUgcnBhdGguCisgICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIgJiYKKwkgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJbGliZGlyPSIkaGFyZGNvZGVfbGliZGlycyIKKwlldmFsIHJwYXRoPVwiICRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKyAgICAgIGZpCisgICAgICBjb21waWxlX3JwYXRoPSIkcnBhdGgiCisKKyAgICAgIHJwYXRoPQorICAgICAgaGFyZGNvZGVfbGliZGlycz0KKyAgICAgIGZvciBsaWJkaXIgaW4gJGZpbmFsaXplX3JwYXRoOyBkbworCWlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgorCSAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiOyB0aGVuCisJICAgIGlmIHRlc3QgLXogIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgorCSAgICAgIGhhcmRjb2RlX2xpYmRpcnM9IiRsaWJkaXIiCisJICAgIGVsc2UKKwkgICAgICAjIEp1c3QgYWNjdW11bGF0ZSB0aGUgdW5pcXVlIGxpYmRpcnMuCisJICAgICAgY2FzZSAkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IgaW4KKwkgICAgICAqIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiopCisJCTs7CisJICAgICAgKikKKwkJaGFyZGNvZGVfbGliZGlycz0iJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIiCisJCTs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgZWxzZQorCSAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisJICAgIHJwYXRoPSIkcnBhdGggJGZsYWciCisJICBmaQorCWVsaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgorCSAgY2FzZSAiJGZpbmFsaXplX3Blcm1fcnBhdGggIiBpbgorCSAgKiIgJGxpYmRpciAiKikgOzsKKwkgICopIGZpbmFsaXplX3Blcm1fcnBhdGg9IiRmaW5hbGl6ZV9wZXJtX3JwYXRoICRsaWJkaXIiIDs7CisJICBlc2FjCisJZmkKKyAgICAgIGRvbmUKKyAgICAgICMgU3Vic3RpdHV0ZSB0aGUgaGFyZGNvZGVkIGxpYmRpcnMgaW50byB0aGUgcnBhdGguCisgICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIgJiYKKwkgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJbGliZGlyPSIkaGFyZGNvZGVfbGliZGlycyIKKwlldmFsIHJwYXRoPVwiICRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKyAgICAgIGZpCisgICAgICBmaW5hbGl6ZV9ycGF0aD0iJHJwYXRoIgorCisgICAgICBpZiB0ZXN0IC1uICIkbGlib2JqcyIgJiYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorCSMgVHJhbnNmb3JtIGFsbCB0aGUgbGlicmFyeSBvYmplY3RzIGludG8gc3RhbmRhcmQgb2JqZWN0cy4KKwljb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAorCWZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFNQMk5MIHwgJFhzZWQgLWUgIiRsbzJvIiB8ICROTDJTUGAKKyAgICAgIGZpCisKKyAgICAgIGRsc3ltcz0KKyAgICAgIGlmIHRlc3QgLW4gIiRkbGZpbGVzJGRscHJlZmlsZXMiIHx8IHRlc3QgIiRkbHNlbGYiICE9IG5vOyB0aGVuCisJaWYgdGVzdCAtbiAiJE5NIiAmJiB0ZXN0IC1uICIkZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgorCSAgZGxzeW1zPSIke291dHB1dG5hbWV9Uy5jIgorCWVsc2UKKwkgICRlY2hvICIkbW9kZW5hbWU6IG5vdCBjb25maWd1cmVkIHRvIGV4dHJhY3QgZ2xvYmFsIHN5bWJvbHMgZnJvbSBkbHByZW9wZW5lZCBmaWxlcyIgMT4mMgorCWZpCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkZGxzeW1zIjsgdGhlbgorCWNhc2UgJGRsc3ltcyBpbgorCSIiKSA7OworCSouYykKKwkgICMgRGlzY292ZXIgdGhlIG5saXN0IG9mIGVhY2ggb2YgdGhlIGRsZmlsZXMuCisJICBubGlzdD0iJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfS5ubSIKKworCSAgJHNob3cgIiRybSAkbmxpc3QgJHtubGlzdH1TICR7bmxpc3R9VCIKKwkgICRydW4gJHJtICIkbmxpc3QiICIke25saXN0fVMiICIke25saXN0fVQiCisKKwkgICMgUGFyc2UgdGhlIG5hbWUgbGlzdCBpbnRvIGEgc291cmNlIGZpbGUuCisJICAkc2hvdyAiY3JlYXRpbmcgJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIKKworCSAgdGVzdCAteiAiJHJ1biIgJiYgJGVjaG8gPiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIgIlwKKy8qICRkbHN5bXMgLSBzeW1ib2wgcmVzb2x1dGlvbiB0YWJsZSBmb3IgXGAkb3V0cHV0bmFtZScgZGxzeW0gZW11bGF0aW9uLiAqLworLyogR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIC0gR05VICRQQUNLQUdFICRWRVJTSU9OJFRJTUVTVEFNUCAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiBcIkNcIiB7CisjZW5kaWYKKworLyogUHJldmVudCB0aGUgb25seSBraW5kIG9mIGRlY2xhcmF0aW9uIGNvbmZsaWN0cyB3ZSBjYW4gbWFrZS4gKi8KKyNkZWZpbmUgbHRfcHJlbG9hZGVkX3N5bWJvbHMgc29tZV9vdGhlcl9zeW1ib2wKKworLyogRXh0ZXJuYWwgc3ltYm9sIGRlY2xhcmF0aW9ucyBmb3IgdGhlIGNvbXBpbGVyLiAqL1wKKyIKKworCSAgaWYgdGVzdCAiJGRsc2VsZiIgPSB5ZXM7IHRoZW4KKwkgICAgJHNob3cgImdlbmVyYXRpbmcgc3ltYm9sIGxpc3QgZm9yIFxgJG91dHB1dCciCisKKwkgICAgdGVzdCAteiAiJHJ1biIgJiYgJGVjaG8gJzogQFBST0dSQU1AICcgPiAiJG5saXN0IgorCisJICAgICMgQWRkIG91ciBvd24gcHJvZ3JhbSBvYmplY3RzIHRvIHRoZSBzeW1ib2wgbGlzdC4KKwkgICAgcHJvZ2ZpbGVzPWAkZWNobyAiWCRvYmpzJG9sZF9kZXBsaWJzIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCisJICAgIGZvciBhcmcgaW4gJHByb2dmaWxlczsgZG8KKwkgICAgICAkc2hvdyAiZXh0cmFjdGluZyBnbG9iYWwgQyBzeW1ib2xzIGZyb20gXGAkYXJnJyIKKwkgICAgICAkcnVuIGV2YWwgIiROTSAkYXJnIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+PiAnJG5saXN0JyIKKwkgICAgZG9uZQorCisJICAgIGlmIHRlc3QgLW4gIiRleGNsdWRlX2V4cHN5bXMiOyB0aGVuCisJICAgICAgJHJ1biBldmFsICdlZ3JlcCAtdiAiICgkZXhjbHVkZV9leHBzeW1zKSQiICIkbmxpc3QiID4gIiRubGlzdCJUJworCSAgICAgICRydW4gZXZhbCAnJG12ICIkbmxpc3QiVCAiJG5saXN0IicKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCisJICAgICAgJHJ1biBldmFsICdlZ3JlcCAtZSAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IiAiJG5saXN0IiA+ICIkbmxpc3QiVCcKKwkgICAgICAkcnVuIGV2YWwgJyRtdiAiJG5saXN0IlQgIiRubGlzdCInCisJICAgIGZpCisKKwkgICAgIyBQcmVwYXJlIHRoZSBsaXN0IG9mIGV4cG9ydGVkIHN5bWJvbHMKKwkgICAgaWYgdGVzdCAteiAiJGV4cG9ydF9zeW1ib2xzIjsgdGhlbgorCSAgICAgIGV4cG9ydF9zeW1ib2xzPSIkb3V0cHV0X29iamRpci8kb3V0cHV0LmV4cCIKKwkgICAgICAkcnVuICRybSAkZXhwb3J0X3N5bWJvbHMKKwkgICAgICAkcnVuIGV2YWwgInNlZCAtbiAtZSAnL146IEBQUk9HUkFNQCQvZCcgLWUgJ3MvXi4qIFwoLipcKSQvXDEvcCcgIic8ICIkbmxpc3QiID4gIiRleHBvcnRfc3ltYm9scyInCisJICAgIGVsc2UKKwkgICAgICAkcnVuIGV2YWwgInNlZCAtZSAncy9cKFtdWy4qXiRdXCkvXFxcMS9nJyAtZSAncy9eLyAvJyAtZSAncy8kLyQvJyInIDwgIiRleHBvcnRfc3ltYm9scyIgPiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dC5leHAiJworCSAgICAgICRydW4gZXZhbCAnZ3JlcCAtZiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dC5leHAiIDwgIiRubGlzdCIgPiAiJG5saXN0IlQnCisJICAgICAgJHJ1biBldmFsICdtdiAiJG5saXN0IlQgIiRubGlzdCInCisJICAgIGZpCisJICBmaQorCisJICBmb3IgYXJnIGluICRkbHByZWZpbGVzOyBkbworCSAgICAkc2hvdyAiZXh0cmFjdGluZyBnbG9iYWwgQyBzeW1ib2xzIGZyb20gXGAkYXJnJyIKKwkgICAgbmFtZT1gZWNobyAiJGFyZyIgfCBzZWQgLWUgJ3MlXi4qLyUlJ2AKKwkgICAgJHJ1biBldmFsICdlY2hvICI6ICRuYW1lICIgPj4gIiRubGlzdCInCisJICAgICRydW4gZXZhbCAiJE5NICRhcmcgfCAkZ2xvYmFsX3N5bWJvbF9waXBlID4+ICckbmxpc3QnIgorCSAgZG9uZQorCisJICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgorCSAgICAjIE1ha2Ugc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IGFuIGVtcHR5IGZpbGUuCisJICAgIHRlc3QgLWYgIiRubGlzdCIgfHwgOiA+ICIkbmxpc3QiCisKKwkgICAgaWYgdGVzdCAtbiAiJGV4Y2x1ZGVfZXhwc3ltcyI7IHRoZW4KKwkgICAgICBlZ3JlcCAtdiAiICgkZXhjbHVkZV9leHBzeW1zKSQiICIkbmxpc3QiID4gIiRubGlzdCJUCisJICAgICAgJG12ICIkbmxpc3QiVCAiJG5saXN0IgorCSAgICBmaQorCisJICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCisJICAgIGlmIGdyZXAgLXYgIl46ICIgPCAiJG5saXN0IiB8IHNvcnQgKzIgfCB1bmlxID4gIiRubGlzdCJTOyB0aGVuCisJICAgICAgOgorCSAgICBlbHNlCisJICAgICAgZ3JlcCAtdiAiXjogIiA8ICIkbmxpc3QiID4gIiRubGlzdCJTCisJICAgIGZpCisKKwkgICAgaWYgdGVzdCAtZiAiJG5saXN0IlM7IHRoZW4KKwkgICAgICBldmFsICIkZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRubGlzdCJTID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIicKKwkgICAgZWxzZQorCSAgICAgIGVjaG8gJy8qIE5PTkUgKi8nID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIgorCSAgICBmaQorCisJICAgICRlY2hvID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIiAiXAorCisjdW5kZWYgbHRfcHJlbG9hZGVkX3N5bWJvbHMKKworI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXworIyBkZWZpbmUgbHRfcHRyIHZvaWQgKgorI2Vsc2UKKyMgZGVmaW5lIGx0X3B0ciBjaGFyICoKKyMgZGVmaW5lIGNvbnN0CisjZW5kaWYKKworLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCitjb25zdCBzdHJ1Y3QgeworICBjb25zdCBjaGFyICpuYW1lOworICBsdF9wdHIgYWRkcmVzczsKK30KK2x0X3ByZWxvYWRlZF9zeW1ib2xzW10gPQore1wKKyIKKworCSAgICBldmFsICIkZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcyIgPCAiJG5saXN0IiA+PiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIKKworCSAgICAkZWNobyA+PiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIgIlwKKyAgezAsIChsdF9wdHIpIDB9Cit9OworCisvKiBUaGlzIHdvcmtzIGFyb3VuZCBhIHByb2JsZW0gaW4gRnJlZUJTRCBsaW5rZXIgKi8KKyNpZmRlZiBGUkVFQlNEX1dPUktBUk9VTkQKK3N0YXRpYyBjb25zdCB2b2lkICpsdF9wcmVsb2FkZWRfc2V0dXAoKSB7CisgIHJldHVybiBsdF9wcmVsb2FkZWRfc3ltYm9sczsKK30KKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZlwKKyIKKwkgIGZpCisKKwkgIHBpY19mbGFnX2Zvcl9zeW10YWJsZT0KKwkgIGNhc2UgJGhvc3QgaW4KKwkgICMgY29tcGlsaW5nIHRoZSBzeW1ib2wgdGFibGUgZmlsZSB3aXRoIHBpY19mbGFnIHdvcmtzIGFyb3VuZAorCSAgIyBhIEZyZWVCU0QgYnVnIHRoYXQgY2F1c2VzIHByb2dyYW1zIHRvIGNyYXNoIHdoZW4gLWxtIGlzCisJICAjIGxpbmtlZCBiZWZvcmUgYW55IG90aGVyIFBJQyBvYmplY3QuICBCdXQgd2UgbXVzdCBub3QgdXNlCisJICAjIHBpY19mbGFnIHdoZW4gbGlua2luZyB3aXRoIC1zdGF0aWMuICBUaGUgcHJvYmxlbSBleGlzdHMgaW4KKwkgICMgRnJlZUJTRCAyLjIuNiBhbmQgaXMgZml4ZWQgaW4gRnJlZUJTRCAzLjEuCisJICAqLSotZnJlZWJzZDIqfCotKi1mcmVlYnNkMy4wKnwqLSotZnJlZWJzZGVsZjMuMCopCisJICAgIGNhc2UgIiRjb21waWxlX2NvbW1hbmQgIiBpbgorCSAgICAqIiAtc3RhdGljICIqKSA7OworCSAgICAqKSBwaWNfZmxhZ19mb3Jfc3ltdGFibGU9IiAkcGljX2ZsYWcgLURQSUMgLURGUkVFQlNEX1dPUktBUk9VTkQiOzsKKwkgICAgZXNhYzs7CisJICAqLSotaHB1eCopCisJICAgIGNhc2UgIiRjb21waWxlX2NvbW1hbmQgIiBpbgorCSAgICAqIiAtc3RhdGljICIqKSA7OworCSAgICAqKSBwaWNfZmxhZ19mb3Jfc3ltdGFibGU9IiAkcGljX2ZsYWcgLURQSUMiOzsKKwkgICAgZXNhYworCSAgZXNhYworCisJICAjIE5vdyBjb21waWxlIHRoZSBkeW5hbWljIHN5bWJvbCBmaWxlLgorCSAgJHNob3cgIihjZCAkb3V0cHV0X29iamRpciAmJiAkQ0MgLWMkbm9fYnVpbHRpbl9mbGFnJHBpY19mbGFnX2Zvcl9zeW10YWJsZSBcIiRkbHN5bXNcIikiCisJICAkcnVuIGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkQ0MgLWMkbm9fYnVpbHRpbl9mbGFnJHBpY19mbGFnX2Zvcl9zeW10YWJsZSAiJGRsc3ltcyIpJyB8fCBleGl0ICQ/CisKKwkgICMgQ2xlYW4gdXAgdGhlIGdlbmVyYXRlZCBmaWxlcy4KKwkgICRzaG93ICIkcm0gJG91dHB1dF9vYmpkaXIvJGRsc3ltcyAkbmxpc3QgJHtubGlzdH1TICR7bmxpc3R9VCIKKwkgICRydW4gJHJtICIkb3V0cHV0X29iamRpci8kZGxzeW1zIiAiJG5saXN0IiAiJHtubGlzdH1TIiAiJHtubGlzdH1UIgorCisJICAjIFRyYW5zZm9ybSB0aGUgc3ltYm9sIGZpbGUgaW50byB0aGUgY29ycmVjdCBuYW1lLgorCSAgY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSUiYAorCSAgZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVAU1lNRklMRUAlJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfVMuJHtvYmpleHR9JSJgCisJICA7OworCSopCisJICAkZWNobyAiJG1vZGVuYW1lOiB1bmtub3duIHN1ZmZpeCBmb3IgXGAkZGxzeW1zJyIgMT4mMgorCSAgZXhpdCAxCisJICA7OworCWVzYWMKKyAgICAgIGVsc2UKKwkjIFdlIGtlZXAgZ29pbmcganVzdCBpbiBjYXNlIHRoZSB1c2VyIGRpZG4ndCByZWZlciB0bworCSMgbHRfcHJlbG9hZGVkX3N5bWJvbHMuICBUaGUgbGlua2VyIHdpbGwgZmFpbCBpZiBnbG9iYWxfc3ltYm9sX3BpcGUKKwkjIHJlYWxseSB3YXMgcmVxdWlyZWQuCisKKwkjIE51bGxpZnkgdGhlIHN5bWJvbCBmaWxlLgorCWNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJSBAU1lNRklMRUAlJSJgCisJZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyUgQFNZTUZJTEVAJSUiYAorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAkbmVlZF9yZWxpbmsgPSBubyB8fCB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXM7IHRoZW4KKwkjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCisJY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0IiclZydgCisJbGlua19jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCisKKwkjIFdlIGhhdmUgbm8gdW5pbnN0YWxsZWQgbGlicmFyeSBkZXBlbmRlbmNpZXMsIHNvIGZpbmFsaXplIHJpZ2h0IG5vdy4KKwkkc2hvdyAiJGxpbmtfY29tbWFuZCIKKwkkcnVuIGV2YWwgIiRsaW5rX2NvbW1hbmQiCisJc3RhdHVzPSQ/CisKKwkjIERlbGV0ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzLgorCWlmIHRlc3QgLW4gIiRkbHN5bXMiOyB0aGVuCisJICAkc2hvdyAiJHJtICRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSIKKwkgICRydW4gJHJtICIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0iCisJZmkKKworCWV4aXQgJHN0YXR1cworICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCisJIyBXZSBzaG91bGQgc2V0IHRoZSBzaGxpYnBhdGhfdmFyCisJcnBhdGg9CisJZm9yIGRpciBpbiAkdGVtcF9ycGF0aDsgZG8KKwkgIGNhc2UgJGRpciBpbgorCSAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKQorCSAgICAjIEFic29sdXRlIHBhdGguCisJICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKKwkgICAgOzsKKwkgICopCisJICAgICMgUmVsYXRpdmUgcGF0aDogYWRkIGEgdGhpc2RpciBlbnRyeS4KKwkgICAgcnBhdGg9IiRycGF0aFwkdGhpc2Rpci8kZGlyOiIKKwkgICAgOzsKKwkgIGVzYWMKKwlkb25lCisJdGVtcF9ycGF0aD0iJHJwYXRoIgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGNvbXBpbGVfc2hsaWJwYXRoJGZpbmFsaXplX3NobGlicGF0aCI7IHRoZW4KKwljb21waWxlX2NvbW1hbmQ9IiRzaGxpYnBhdGhfdmFyPVwiJGNvbXBpbGVfc2hsaWJwYXRoJGZpbmFsaXplX3NobGlicGF0aFwkJHNobGlicGF0aF92YXJcIiAkY29tcGlsZV9jb21tYW5kIgorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgLW4gIiRmaW5hbGl6ZV9zaGxpYnBhdGgiOyB0aGVuCisJZmluYWxpemVfY29tbWFuZD0iJHNobGlicGF0aF92YXI9XCIkZmluYWxpemVfc2hsaWJwYXRoXCQkc2hsaWJwYXRoX3ZhclwiICRmaW5hbGl6ZV9jb21tYW5kIgorICAgICAgZmkKKworICAgICAgY29tcGlsZV92YXI9CisgICAgICBmaW5hbGl6ZV92YXI9CisgICAgICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisJaWYgdGVzdCAtbiAiJHBlcm1fcnBhdGgiOyB0aGVuCisJICAjIFdlIHNob3VsZCBzZXQgdGhlIHJ1bnBhdGhfdmFyLgorCSAgcnBhdGg9CisJICBmb3IgZGlyIGluICRwZXJtX3JwYXRoOyBkbworCSAgICBycGF0aD0iJHJwYXRoJGRpcjoiCisJICBkb25lCisJICBjb21waWxlX3Zhcj0iJHJ1bnBhdGhfdmFyPVwiJHJwYXRoXCQkcnVucGF0aF92YXJcIiAiCisJZmkKKwlpZiB0ZXN0IC1uICIkZmluYWxpemVfcGVybV9ycGF0aCI7IHRoZW4KKwkgICMgV2Ugc2hvdWxkIHNldCB0aGUgcnVucGF0aF92YXIuCisJICBycGF0aD0KKwkgIGZvciBkaXIgaW4gJGZpbmFsaXplX3Blcm1fcnBhdGg7IGRvCisJICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKKwkgIGRvbmUKKwkgIGZpbmFsaXplX3Zhcj0iJHJ1bnBhdGhfdmFyPVwiJHJwYXRoXCQkcnVucGF0aF92YXJcIiAiCisJZmkKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRub19pbnN0YWxsIiA9IHllczsgdGhlbgorCSMgV2UgZG9uJ3QgbmVlZCB0byBjcmVhdGUgYSB3cmFwcGVyIHNjcmlwdC4KKwlsaW5rX2NvbW1hbmQ9IiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKKwkjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCisJbGlua19jb21tYW5kPWAkZWNobyAiWCRsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0IiclZydgCisJIyBEZWxldGUgdGhlIG9sZCBvdXRwdXQgZmlsZS4KKwkkcnVuICRybSAkb3V0cHV0CisJIyBMaW5rIHRoZSBleGVjdXRhYmxlIGFuZCBleGl0CisJJHNob3cgIiRsaW5rX2NvbW1hbmQiCisJJHJ1biBldmFsICIkbGlua19jb21tYW5kIiB8fCBleGl0ICQ/CisJZXhpdCAwCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfYWN0aW9uIiA9IHJlbGluazsgdGhlbgorCSMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAorCWxpbmtfY29tbWFuZD0iJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgorCXJlbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGZpbmFsaXplX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCisKKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiB0aGlzIHBsYXRmb3JtIGRvZXMgbm90IGxpa2UgdW5pbnN0YWxsZWQgc2hhcmVkIGxpYnJhcmllcyIgMT4mMgorCSRlY2hvICIkbW9kZW5hbWU6IFxgJG91dHB1dCcgd2lsbCBiZSByZWxpbmtlZCBkdXJpbmcgaW5zdGFsbGF0aW9uIiAxPiYyCisgICAgICBlbHNlCisJaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgIT0gbm87IHRoZW4KKwkgIGxpbmtfY29tbWFuZD0iJGZpbmFsaXplX3ZhciRjb21waWxlX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCisJICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllczsgdGhlbgorCSAgICByZWxpbmtfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlXCRwcm9nZGlyL1wkZmlsZSVnJ2AKKwkgIGVsc2UKKwkgICAgIyBmYXN0X2luc3RhbGwgaXMgc2V0IHRvIG5lZWRsZXNzCisJICAgIHJlbGlua19jb21tYW5kPQorCSAgZmkKKwllbHNlCisJICBsaW5rX2NvbW1hbmQ9IiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKKwkgIHJlbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGZpbmFsaXplX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KKyAgICAgIGxpbmtfY29tbWFuZD1gJGVjaG8gIlgkbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUiJyVnJ2AKKworICAgICAgIyBEZWxldGUgdGhlIG9sZCBvdXRwdXQgZmlsZXMuCisgICAgICAkcnVuICRybSAkb3V0cHV0ICRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lICRvdXRwdXRfb2JqZGlyL2x0LSRvdXRwdXRuYW1lCisKKyAgICAgICRzaG93ICIkbGlua19jb21tYW5kIgorICAgICAgJHJ1biBldmFsICIkbGlua19jb21tYW5kIiB8fCBleGl0ICQ/CisKKyAgICAgICMgTm93IGNyZWF0ZSB0aGUgd3JhcHBlciBzY3JpcHQuCisgICAgICAkc2hvdyAiY3JlYXRpbmcgJG91dHB1dCIKKworICAgICAgIyBRdW90ZSB0aGUgcmVsaW5rIGNvbW1hbmQgZm9yIHNoaXBwaW5nLgorICAgICAgaWYgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIjsgdGhlbgorCSMgUHJlc2VydmUgYW55IHZhcmlhYmxlcyB0aGF0IG1heSBhZmZlY3QgY29tcGlsZXIgYmVoYXZpb3IKKwlmb3IgdmFyIGluICR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluazsgZG8KKwkgIGlmIGV2YWwgdGVzdCAteiBcIlwkeyR2YXIrc2V0fVwiOyB0aGVuCisJICAgIHJlbGlua19jb21tYW5kPSJ7IHRlc3QgLXogXCJcJHskdmFyK3NldH1cIiB8fCB1bnNldCAkdmFyIHx8IHsgJHZhcj07IGV4cG9ydCAkdmFyOyB9OyB9OyAkcmVsaW5rX2NvbW1hbmQiCisJICBlbGlmIGV2YWwgdmFyX3ZhbHVlPVwkJHZhcjsgdGVzdCAteiAiJHZhcl92YWx1ZSI7IHRoZW4KKwkgICAgcmVsaW5rX2NvbW1hbmQ9IiR2YXI9OyBleHBvcnQgJHZhcjsgJHJlbGlua19jb21tYW5kIgorCSAgZWxzZQorCSAgICB2YXJfdmFsdWU9YCRlY2hvICJYJHZhcl92YWx1ZSIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisJICAgIHJlbGlua19jb21tYW5kPSIkdmFyPVwiJHZhcl92YWx1ZVwiOyBleHBvcnQgJHZhcjsgJHJlbGlua19jb21tYW5kIgorCSAgZmkKKwlkb25lCisJcmVsaW5rX2NvbW1hbmQ9ImNkIGBwd2RgOyAkcmVsaW5rX2NvbW1hbmQiCisJcmVsaW5rX2NvbW1hbmQ9YCRlY2hvICJYJHJlbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICAgIGZpCisKKyAgICAgICMgUXVvdGUgJGVjaG8gZm9yIHNoaXBwaW5nLgorICAgICAgaWYgdGVzdCAiWCRlY2hvIiA9ICJYJFNIRUxMICQwIC0tZmFsbGJhY2stZWNobyI7IHRoZW4KKwljYXNlICQwIGluCisJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBxZWNobz0iJFNIRUxMICQwIC0tZmFsbGJhY2stZWNobyI7OworCSopIHFlY2hvPSIkU0hFTEwgYHB3ZGAvJDAgLS1mYWxsYmFjay1lY2hvIjs7CisJZXNhYworCXFlY2hvPWAkZWNobyAiWCRxZWNobyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgICBlbHNlCisJcWVjaG89YCRlY2hvICJYJGVjaG8iIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgICAgZmkKKworICAgICAgIyBPbmx5IGFjdHVhbGx5IGRvIHRoaW5ncyBpZiBvdXIgcnVuIGNvbW1hbmQgaXMgbm9uLW51bGwuCisgICAgICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgorCSMgd2luMzIgd2lsbCB0aGluayB0aGUgc2NyaXB0IGlzIGEgYmluYXJ5IGlmIGl0IGhhcworCSMgYSAuZXhlIHN1ZmZpeCwgc28gd2Ugc3RyaXAgaXQgb2ZmIGhlcmUuCisJY2FzZSAkb3V0cHV0IGluCisJICAqLmV4ZSkgb3V0cHV0PWBlY2hvICRvdXRwdXR8c2VkICdzLC5leGUkLCwnYCA7OworCWVzYWMKKwkjIHRlc3QgZm9yIGN5Z3dpbiBiZWNhdXNlIG12IGZhaWxzIHcvbyAuZXhlIGV4dGVuc2lvbnMKKwljYXNlICRob3N0IGluCisJICAqY3lnd2luKikgZXhlZXh0PS5leGUgOzsKKwkgICopIGV4ZWV4dD0gOzsKKwllc2FjCisJJHJtICRvdXRwdXQKKwl0cmFwICIkcm0gJG91dHB1dDsgZXhpdCAxIiAxIDIgMTUKKworCSRlY2hvID4gJG91dHB1dCAiXAorIyEgJFNIRUxMCisKKyMgJG91dHB1dCAtIHRlbXBvcmFyeSB3cmFwcGVyIHNjcmlwdCBmb3IgJG9iamRpci8kb3V0cHV0bmFtZQorIyBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QCisjCisjIFRoZSAkb3V0cHV0IHByb2dyYW0gY2Fubm90IGJlIGRpcmVjdGx5IGV4ZWN1dGVkIHVudGlsIGFsbCB0aGUgbGlidG9vbAorIyBsaWJyYXJpZXMgdGhhdCBpdCBkZXBlbmRzIG9uIGFyZSBpbnN0YWxsZWQuCisjCisjIFRoaXMgd3JhcHBlciBzY3JpcHQgc2hvdWxkIG5ldmVyIGJlIG1vdmVkIG91dCBvZiB0aGUgYnVpbGQgZGlyZWN0b3J5LgorIyBJZiBpdCBpcywgaXQgd2lsbCBub3Qgb3BlcmF0ZSBjb3JyZWN0bHkuCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKKyMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCitYc2VkPSdzZWQgLWUgMXMvXlgvLycKK3NlZF9xdW90ZV9zdWJzdD0nJHNlZF9xdW90ZV9zdWJzdCcKKworIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKKyMgaWYgQ0RQQVRIIGlzIHNldC4KK2lmIHRlc3QgXCJcJHtDRFBBVEgrc2V0fVwiID0gc2V0OyB0aGVuIENEUEFUSD06OyBleHBvcnQgQ0RQQVRIOyBmaQorCityZWxpbmtfY29tbWFuZD1cIiRyZWxpbmtfY29tbWFuZFwiCisKKyMgVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBkZXRlcm1pbmVzIG91ciBvcGVyYXRpb24gbW9kZS4KK2lmIHRlc3QgXCJcJGxpYnRvb2xfaW5zdGFsbF9tYWdpY1wiID0gXCIkbWFnaWNcIjsgdGhlbgorICAjIGluc3RhbGwgbW9kZSBuZWVkcyB0aGUgZm9sbG93aW5nIHZhcmlhYmxlOgorICBub3RpbnN0X2RlcGxpYnM9JyRub3RpbnN0X2RlcGxpYnMnCitlbHNlCisgICMgV2hlbiB3ZSBhcmUgc291cmNlZCBpbiBleGVjdXRlIG1vZGUsIFwkZmlsZSBhbmQgXCRlY2hvIGFyZSBhbHJlYWR5IHNldC4KKyAgaWYgdGVzdCBcIlwkbGlidG9vbF9leGVjdXRlX21hZ2ljXCIgIT0gXCIkbWFnaWNcIjsgdGhlbgorICAgIGVjaG89XCIkcWVjaG9cIgorICAgIGZpbGU9XCJcJDBcIgorICAgICMgTWFrZSBzdXJlIGVjaG8gd29ya3MuCisgICAgaWYgdGVzdCBcIlhcJDFcIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgorICAgICAgIyBEaXNjYXJkIHRoZSAtLW5vLXJlZXhlYyBmbGFnLCBhbmQgY29udGludWUuCisgICAgICBzaGlmdAorICAgIGVsaWYgdGVzdCBcIlhcYChcJGVjaG8gJ1x0JykgMj4vZGV2L251bGxcYFwiID0gJ1hcdCc7IHRoZW4KKyAgICAgICMgWWlwcGVlLCBcJGVjaG8gd29ya3MhCisgICAgICA6CisgICAgZWxzZQorICAgICAgIyBSZXN0YXJ0IHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLCBhbmQgdGhlbiBtYXliZSBcJGVjaG8gd2lsbCB3b3JrLgorICAgICAgZXhlYyAkU0hFTEwgXCJcJDBcIiAtLW5vLXJlZXhlYyBcJHsxK1wiXCRAXCJ9CisgICAgZmkKKyAgZmlcCisiCisJJGVjaG8gPj4gJG91dHB1dCAiXAorCisgICMgRmluZCB0aGUgZGlyZWN0b3J5IHRoYXQgdGhpcyBzY3JpcHQgbGl2ZXMgaW4uCisgIHRoaXNkaXI9XGBcJGVjaG8gXCJYXCRmaWxlXCIgfCBcJFhzZWQgLWUgJ3MlL1teL10qJCUlJ1xgCisgIHRlc3QgXCJ4XCR0aGlzZGlyXCIgPSBcInhcJGZpbGVcIiAmJiB0aGlzZGlyPS4KKworICAjIEZvbGxvdyBzeW1ib2xpYyBsaW5rcyB1bnRpbCB3ZSBnZXQgdG8gdGhlIHJlYWwgdGhpc2Rpci4KKyAgZmlsZT1cYGxzIC1sZCBcIlwkZmlsZVwiIHwgc2VkIC1uICdzLy4qLT4gLy9wJ1xgCisgIHdoaWxlIHRlc3QgLW4gXCJcJGZpbGVcIjsgZG8KKyAgICBkZXN0ZGlyPVxgXCRlY2hvIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJS9bXi9dKlwkJSUnXGAKKworICAgICMgSWYgdGhlcmUgd2FzIGEgZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBjaGFuZ2UgdGhpc2Rpci4KKyAgICBpZiB0ZXN0IFwieFwkZGVzdGRpclwiICE9IFwieFwkZmlsZVwiOyB0aGVuCisgICAgICBjYXNlIFwiXCRkZXN0ZGlyXCIgaW4KKyAgICAgIFtcXFxcL10qIHwgW0EtWmEtel06W1xcXFwvXSopIHRoaXNkaXI9XCJcJGRlc3RkaXJcIiA7OworICAgICAgKikgdGhpc2Rpcj1cIlwkdGhpc2Rpci9cJGRlc3RkaXJcIiA7OworICAgICAgZXNhYworICAgIGZpCisKKyAgICBmaWxlPVxgXCRlY2hvIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJV4uKi8lJSdcYAorICAgIGZpbGU9XGBscyAtbGQgXCJcJHRoaXNkaXIvXCRmaWxlXCIgfCBzZWQgLW4gJ3MvLiotPiAvL3AnXGAKKyAgZG9uZQorCisgICMgVHJ5IHRvIGdldCB0aGUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUuCisgIGFic2Rpcj1cYGNkIFwiXCR0aGlzZGlyXCIgJiYgcHdkXGAKKyAgdGVzdCAtbiBcIlwkYWJzZGlyXCIgJiYgdGhpc2Rpcj1cIlwkYWJzZGlyXCIKKyIKKworCWlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzOyB0aGVuCisJICBlY2hvID4+ICRvdXRwdXQgIlwKKyAgcHJvZ3JhbT1sdC0nJG91dHB1dG5hbWUnJGV4ZWV4dAorICBwcm9nZGlyPVwiXCR0aGlzZGlyLyRvYmpkaXJcIgorCisgIGlmIHRlc3QgISAtZiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiB8fCBcXAorICAgICB7IGZpbGU9XGBscyAtMWR0IFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIFwiXCRwcm9nZGlyLy4uL1wkcHJvZ3JhbVwiIDI+L2Rldi9udWxsIHwgc2VkIDFxXGA7IFxcCisgICAgICAgdGVzdCBcIlhcJGZpbGVcIiAhPSBcIlhcJHByb2dkaXIvXCRwcm9ncmFtXCI7IH07IHRoZW4KKworICAgIGZpbGU9XCJcJFwkLVwkcHJvZ3JhbVwiCisKKyAgICBpZiB0ZXN0ICEgLWQgXCJcJHByb2dkaXJcIjsgdGhlbgorICAgICAgJG1rZGlyIFwiXCRwcm9nZGlyXCIKKyAgICBlbHNlCisgICAgICAkcm0gXCJcJHByb2dkaXIvXCRmaWxlXCIKKyAgICBmaSIKKworCSAgZWNobyA+PiAkb3V0cHV0ICJcCisKKyAgICAjIHJlbGluayBleGVjdXRhYmxlIGlmIG5lY2Vzc2FyeQorICAgIGlmIHRlc3QgLW4gXCJcJHJlbGlua19jb21tYW5kXCI7IHRoZW4KKyAgICAgIGlmIHJlbGlua19jb21tYW5kX291dHB1dD1cYGV2YWwgXCRyZWxpbmtfY29tbWFuZCAyPiYxXGA7IHRoZW4gOgorICAgICAgZWxzZQorCSRlY2hvIFwiXCRyZWxpbmtfY29tbWFuZF9vdXRwdXRcIiA+JjIKKwkkcm0gXCJcJHByb2dkaXIvXCRmaWxlXCIKKwlleGl0IDEKKyAgICAgIGZpCisgICAgZmkKKworICAgICRtdiBcIlwkcHJvZ2Rpci9cJGZpbGVcIiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiAyPi9kZXYvbnVsbCB8fAorICAgIHsgJHJtIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOworICAgICAgJG12IFwiXCRwcm9nZGlyL1wkZmlsZVwiIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB9CisgICAgJHJtIFwiXCRwcm9nZGlyL1wkZmlsZVwiCisgIGZpIgorCWVsc2UKKwkgIGVjaG8gPj4gJG91dHB1dCAiXAorICBwcm9ncmFtPSckb3V0cHV0bmFtZScKKyAgcHJvZ2Rpcj1cIlwkdGhpc2Rpci8kb2JqZGlyXCIKKyIKKwlmaQorCisJZWNobyA+PiAkb3V0cHV0ICJcCisKKyAgaWYgdGVzdCAtZiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIjsgdGhlbiIKKworCSMgRXhwb3J0IG91ciBzaGxpYnBhdGhfdmFyIGlmIHdlIGhhdmUgb25lLgorCWlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzICYmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIiAmJiB0ZXN0IC1uICIkdGVtcF9ycGF0aCI7IHRoZW4KKwkgICRlY2hvID4+ICRvdXRwdXQgIlwKKyAgICAjIEFkZCBvdXIgb3duIGxpYnJhcnkgcGF0aCB0byAkc2hsaWJwYXRoX3ZhcgorICAgICRzaGxpYnBhdGhfdmFyPVwiJHRlbXBfcnBhdGhcJCRzaGxpYnBhdGhfdmFyXCIKKworICAgICMgU29tZSBzeXN0ZW1zIGNhbm5vdCBjb3BlIHdpdGggY29sb24tdGVybWluYXRlZCAkc2hsaWJwYXRoX3ZhcgorICAgICMgVGhlIHNlY29uZCBjb2xvbiBpcyBhIHdvcmthcm91bmQgZm9yIGEgYnVnIGluIEJlT1MgUjQgc2VkCisgICAgJHNobGlicGF0aF92YXI9XGBcJGVjaG8gXCJYXCQkc2hsaWJwYXRoX3ZhclwiIHwgXCRYc2VkIC1lICdzLzo6KlwkLy8nXGAKKworICAgIGV4cG9ydCAkc2hsaWJwYXRoX3ZhcgorIgorCWZpCisKKwkjIGZpeHVwIHRoZSBkbGwgc2VhcmNocGF0aCBpZiB3ZSBuZWVkIHRvLgorCWlmIHRlc3QgLW4gIiRkbGxzZWFyY2hwYXRoIjsgdGhlbgorCSAgJGVjaG8gPj4gJG91dHB1dCAiXAorICAgICMgQWRkIHRoZSBkbGwgc2VhcmNoIHBhdGggY29tcG9uZW50cyB0byB0aGUgZXhlY3V0YWJsZSBQQVRICisgICAgUEFUSD0kZGxsc2VhcmNocGF0aDpcJFBBVEgKKyIKKwlmaQorCisJJGVjaG8gPj4gJG91dHB1dCAiXAorICAgIGlmIHRlc3QgXCJcJGxpYnRvb2xfZXhlY3V0ZV9tYWdpY1wiICE9IFwiJG1hZ2ljXCI7IHRoZW4KKyAgICAgICMgUnVuIHRoZSBhY3R1YWwgcHJvZ3JhbSB3aXRoIG91ciBhcmd1bWVudHMuCisiCisJY2FzZSAkaG9zdCBpbgorCSMgd2luMzIgc3lzdGVtcyBuZWVkIHRvIHVzZSB0aGUgcHJvZyBwYXRoIGZvciBkbGwKKwkjIGxvb2t1cCB0byB3b3JrCisJKi0qLWN5Z3dpbiogfCAqLSotcHczMiopCisJICAkZWNobyA+PiAkb3V0cHV0ICJcCisgICAgICBleGVjIFwkcHJvZ2Rpci9cJHByb2dyYW0gXCR7MStcIlwkQFwifQorIgorCSAgOzsKKworCSMgQmFja3NsYXNoZXMgc2VwYXJhdGUgZGlyZWN0b3JpZXMgb24gcGxhaW4gd2luZG93cworCSotKi1taW5ndyB8ICotKi1vczIqKQorCSAgJGVjaG8gPj4gJG91dHB1dCAiXAorICAgICAgZXhlYyBcJHByb2dkaXJcXFxcXCRwcm9ncmFtIFwkezErXCJcJEBcIn0KKyIKKwkgIDs7CisKKwkqKQorCSAgJGVjaG8gPj4gJG91dHB1dCAiXAorICAgICAgIyBFeHBvcnQgdGhlIHBhdGggdG8gdGhlIHByb2dyYW0uCisgICAgICBQQVRIPVwiXCRwcm9nZGlyOlwkUEFUSFwiCisgICAgICBleHBvcnQgUEFUSAorCisgICAgICBleGVjIFwkcHJvZ3JhbSBcJHsxK1wiXCRAXCJ9CisiCisJICA7OworCWVzYWMKKwkkZWNobyA+PiAkb3V0cHV0ICJcCisgICAgICBcJGVjaG8gXCJcJDA6IGNhbm5vdCBleGVjIFwkcHJvZ3JhbSBcJHsxK1wiXCRAXCJ9XCIKKyAgICAgIGV4aXQgMQorICAgIGZpCisgIGVsc2UKKyAgICAjIFRoZSBwcm9ncmFtIGRvZXNuJ3QgZXhpc3QuCisgICAgXCRlY2hvIFwiXCQwOiBlcnJvcjogXCRwcm9nZGlyL1wkcHJvZ3JhbSBkb2VzIG5vdCBleGlzdFwiIDE+JjIKKyAgICBcJGVjaG8gXCJUaGlzIHNjcmlwdCBpcyBqdXN0IGEgd3JhcHBlciBmb3IgXCRwcm9ncmFtLlwiIDE+JjIKKyAgICBlY2hvIFwiU2VlIHRoZSAkUEFDS0FHRSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLlwiIDE+JjIKKyAgICBleGl0IDEKKyAgZmkKK2ZpXAorIgorCWNobW9kICt4ICRvdXRwdXQKKyAgICAgIGZpCisgICAgICBleGl0IDAKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgIyBTZWUgaWYgd2UgbmVlZCB0byBidWlsZCBhbiBvbGQtZmFzaGlvbmVkIGFyY2hpdmUuCisgICAgZm9yIG9sZGxpYiBpbiAkb2xkbGliczsgZG8KKworICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBjb252ZW5pZW5jZTsgdGhlbgorCW9sZG9ianM9IiRsaWJvYmpzX3NhdmUiCisJYWRkbGlicz0iJGNvbnZlbmllbmNlIgorCWJ1aWxkX2xpYnRvb2xfbGlicz1ubworICAgICAgZWxzZQorCWlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbW9kdWxlOyB0aGVuCisJICBvbGRvYmpzPSIkbGlib2Jqc19zYXZlIgorCSAgYnVpbGRfbGlidG9vbF9saWJzPW5vCisJZWxzZQorCSAgb2xkb2Jqcz0iJG9ianMkb2xkX2RlcGxpYnMgImAkZWNobyAiWCRsaWJvYmpzX3NhdmUiIHwgJFNQMk5MIHwgJFhzZWQgLWUgJy9cLicke2xpYmV4dH0nJC9kJyAtZSAnL1wubGliJC9kJyAtZSAiJGxvMm8iIHwgJE5MMlNQYAorCWZpCisJYWRkbGlicz0iJG9sZF9jb252ZW5pZW5jZSIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRhZGRsaWJzIjsgdGhlbgorCWdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfXgiCisJJHNob3cgIiR7cm19ciAkZ2VudG9wIgorCSRydW4gJHtybX1yICIkZ2VudG9wIgorCSRzaG93ICJta2RpciAkZ2VudG9wIgorCSRydW4gbWtkaXIgIiRnZW50b3AiCisJc3RhdHVzPSQ/CisJaWYgdGVzdCAkc3RhdHVzIC1uZSAwICYmIHRlc3QgISAtZCAiJGdlbnRvcCI7IHRoZW4KKwkgIGV4aXQgJHN0YXR1cworCWZpCisJZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICRnZW50b3AiCisKKwkjIEFkZCBpbiBtZW1iZXJzIGZyb20gY29udmVuaWVuY2UgYXJjaGl2ZXMuCisJZm9yIHhsaWIgaW4gJGFkZGxpYnM7IGRvCisJICAjIEV4dHJhY3QgdGhlIG9iamVjdHMuCisJICBjYXNlICR4bGliIGluCisJICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIHhhYnM9IiR4bGliIiA7OworCSAgKikgeGFicz1gcHdkYCIvJHhsaWIiIDs7CisJICBlc2FjCisJICB4bGliPWAkZWNobyAiWCR4bGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisJICB4ZGlyPSIkZ2VudG9wLyR4bGliIgorCisJICAkc2hvdyAiJHtybX1yICR4ZGlyIgorCSAgJHJ1biAke3JtfXIgIiR4ZGlyIgorCSAgJHNob3cgIm1rZGlyICR4ZGlyIgorCSAgJHJ1biBta2RpciAiJHhkaXIiCisJICBzdGF0dXM9JD8KKwkgIGlmIHRlc3QgJHN0YXR1cyAtbmUgMCAmJiB0ZXN0ICEgLWQgIiR4ZGlyIjsgdGhlbgorCSAgICBleGl0ICRzdGF0dXMKKwkgIGZpCisJICAkc2hvdyAiKGNkICR4ZGlyICYmICRBUiB4ICR4YWJzKSIKKwkgICRydW4gZXZhbCAiKGNkIFwkeGRpciAmJiAkQVIgeCBcJHhhYnMpIiB8fCBleGl0ICQ/CisKKwkgIG9sZG9ianM9IiRvbGRvYmpzICJgZmluZCAkeGRpciAtbmFtZSBcKi4ke29iamV4dH0gLXByaW50IC1vIC1uYW1lIFwqLmxvIC1wcmludCB8ICROTDJTUGAKKwlkb25lCisgICAgICBmaQorCisgICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KKyAgICAgIGlmIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIiAmJiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorCWV2YWwgY21kcz1cIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzXCIKKyAgICAgIGVsc2UKKwkjIEVuc3VyZSB0aGF0IHdlIGhhdmUgLm8gb2JqZWN0cyBpbiBwbGFjZSBpbiBjYXNlIHdlIGRlY2lkZWQKKwkjIG5vdCB0byBidWlsZCBhIHNoYXJlZCBsaWJyYXJ5LCBhbmQgaGF2ZSBmYWxsZW4gYmFjayB0byBidWlsZGluZworCSMgc3RhdGljIGxpYnMgZXZlbiB0aG91Z2ggLS1kaXNhYmxlLXN0YXRpYyB3YXMgcGFzc2VkIQorCWZvciBvbGRvYmogaW4gJG9sZG9ianM7IGRvCisJICBpZiB0ZXN0ICEgLWYgJG9sZG9iajsgdGhlbgorCSAgICB4ZGlyPWAkZWNobyAiWCRvbGRvYmoiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKKwkgICAgaWYgdGVzdCAiWCR4ZGlyIiA9ICJYJG9sZG9iaiI7IHRoZW4KKwkgICAgICB4ZGlyPSIuIgorCSAgICBlbHNlCisJICAgICAgeGRpcj0iJHhkaXIiCisJICAgIGZpCisJICAgIGJhc2VvYmo9YCRlY2hvICJYJG9sZG9iaiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCSAgICBvYmo9YCRlY2hvICJYJGJhc2VvYmoiIHwgJFhzZWQgLWUgIiRvMmxvImAKKwkgICAgJHNob3cgIihjZCAkeGRpciAmJiAke0xOX1N9ICRvYmogJGJhc2VvYmopIgorCSAgICAkcnVuIGV2YWwgJyhjZCAkeGRpciAmJiAke0xOX1N9ICRvYmogJGJhc2VvYmopJyB8fCBleGl0ICQ/CisJICBmaQorCWRvbmUKKworCWV2YWwgY21kcz1cIiRvbGRfYXJjaGl2ZV9jbWRzXCIKKyAgICAgIGZpCisgICAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKyAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCisJSUZTPSIkc2F2ZV9pZnMiCisJJHNob3cgIiRjbWQiCisJJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/CisgICAgICBkb25lCisgICAgICBJRlM9IiRzYXZlX2lmcyIKKyAgICBkb25lCisKKyAgICBpZiB0ZXN0IC1uICIkZ2VuZXJhdGVkIjsgdGhlbgorICAgICAgJHNob3cgIiR7cm19ciRnZW5lcmF0ZWQiCisgICAgICAkcnVuICR7cm19ciRnZW5lcmF0ZWQKKyAgICBmaQorCisgICAgIyBOb3cgY3JlYXRlIHRoZSBsaWJ0b29sIGFyY2hpdmUuCisgICAgY2FzZSAkb3V0cHV0IGluCisgICAgKi5sYSkKKyAgICAgIG9sZF9saWJyYXJ5PQorICAgICAgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllcyAmJiBvbGRfbGlicmFyeT0iJGxpYm5hbWUuJGxpYmV4dCIKKyAgICAgICRzaG93ICJjcmVhdGluZyAkb3V0cHV0IgorCisgICAgICAjIFByZXNlcnZlIGFueSB2YXJpYWJsZXMgdGhhdCBtYXkgYWZmZWN0IGNvbXBpbGVyIGJlaGF2aW9yCisgICAgICBmb3IgdmFyIGluICR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluazsgZG8KKwlpZiBldmFsIHRlc3QgLXogXCJcJHskdmFyK3NldH1cIjsgdGhlbgorCSAgcmVsaW5rX2NvbW1hbmQ9InsgdGVzdCAteiBcIlwkeyR2YXIrc2V0fVwiIHx8IHVuc2V0ICR2YXIgfHwgeyAkdmFyPTsgZXhwb3J0ICR2YXI7IH07IH07ICRyZWxpbmtfY29tbWFuZCIKKwllbGlmIGV2YWwgdmFyX3ZhbHVlPVwkJHZhcjsgdGVzdCAteiAiJHZhcl92YWx1ZSI7IHRoZW4KKwkgIHJlbGlua19jb21tYW5kPSIkdmFyPTsgZXhwb3J0ICR2YXI7ICRyZWxpbmtfY29tbWFuZCIKKwllbHNlCisJICB2YXJfdmFsdWU9YCRlY2hvICJYJHZhcl92YWx1ZSIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisJICByZWxpbmtfY29tbWFuZD0iJHZhcj1cIiR2YXJfdmFsdWVcIjsgZXhwb3J0ICR2YXI7ICRyZWxpbmtfY29tbWFuZCIKKwlmaQorICAgICAgZG9uZQorICAgICAgIyBRdW90ZSB0aGUgbGluayBjb21tYW5kIGZvciBzaGlwcGluZy4KKyAgICAgIHJlbGlua19jb21tYW5kPSJjZCBgcHdkYDsgJFNIRUxMICQwIC0tbW9kZT1yZWxpbmsgJGxpYnRvb2xfYXJncyIKKyAgICAgIHJlbGlua19jb21tYW5kPWAkZWNobyAiWCRyZWxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisKKyAgICAgICMgT25seSBjcmVhdGUgdGhlIG91dHB1dCBpZiBub3QgYSBkcnkgcnVuLgorICAgICAgaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KKwlmb3IgaW5zdGFsbGVkIGluIG5vIHllczsgZG8KKwkgIGlmIHRlc3QgIiRpbnN0YWxsZWQiID0geWVzOyB0aGVuCisJICAgIGlmIHRlc3QgLXogIiRpbnN0YWxsX2xpYmRpciI7IHRoZW4KKwkgICAgICBicmVhaworCSAgICBmaQorCSAgICBvdXRwdXQ9IiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lImkKKwkgICAgIyBSZXBsYWNlIGFsbCB1bmluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcyB3aXRoIHRoZSBpbnN0YWxsZWQgb25lcworCSAgICBuZXdkZXBlbmRlbmN5X2xpYnM9CisJICAgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KKwkgICAgICBjYXNlICRkZXBsaWIgaW4KKwkgICAgICAqLmxhKQorCQluYW1lPWAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKwkJZXZhbCBsaWJkaXI9YHNlZCAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGRlcGxpYmAKKwkJaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KKwkJICAkZWNobyAiJG1vZGVuYW1lOiBcYCRkZXBsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgorCQkgIGV4aXQgMQorCQlmaQorCQluZXdkZXBlbmRlbmN5X2xpYnM9IiRuZXdkZXBlbmRlbmN5X2xpYnMgJGxpYmRpci8kbmFtZSIKKwkJOzsKKwkgICAgICAqKSBuZXdkZXBlbmRlbmN5X2xpYnM9IiRuZXdkZXBlbmRlbmN5X2xpYnMgJGRlcGxpYiIgOzsKKwkgICAgICBlc2FjCisJICAgIGRvbmUKKwkgICAgZGVwZW5kZW5jeV9saWJzPSIkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgICBuZXdkbGZpbGVzPQorCSAgICBmb3IgbGliIGluICRkbGZpbGVzOyBkbworCSAgICAgIG5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCSAgICAgIGV2YWwgbGliZGlyPWBzZWQgLW4gLWUgJ3MvXmxpYmRpcj1cKC4qXCkkL1wxL3AnICRsaWJgCisJICAgICAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KKwkJJGVjaG8gIiRtb2RlbmFtZTogXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKKwkJZXhpdCAxCisJICAgICAgZmkKKwkgICAgICBuZXdkbGZpbGVzPSIkbmV3ZGxmaWxlcyAkbGliZGlyLyRuYW1lIgorCSAgICBkb25lCisJICAgIGRsZmlsZXM9IiRuZXdkbGZpbGVzIgorCSAgICBuZXdkbHByZWZpbGVzPQorCSAgICBmb3IgbGliIGluICRkbHByZWZpbGVzOyBkbworCSAgICAgIG5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCSAgICAgIGV2YWwgbGliZGlyPWBzZWQgLW4gLWUgJ3MvXmxpYmRpcj1cKC4qXCkkL1wxL3AnICRsaWJgCisJICAgICAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KKwkJJGVjaG8gIiRtb2RlbmFtZTogXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKKwkJZXhpdCAxCisJICAgICAgZmkKKwkgICAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkbGliZGlyLyRuYW1lIgorCSAgICBkb25lCisJICAgIGRscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzIgorCSAgZmkKKwkgICRybSAkb3V0cHV0CisJICAjIHBsYWNlIGRsbmFtZSBpbiBjb3JyZWN0IHBvc2l0aW9uIGZvciBjeWd3aW4KKwkgIHRkbG5hbWU9JGRsbmFtZQorCSAgY2FzZSAkaG9zdCwkb3V0cHV0LCRpbnN0YWxsZWQsJG1vZHVsZSwkZGxuYW1lIGluCisJICAgICpjeWd3aW4qLCpsYWkseWVzLG5vLCouZGxsKSB0ZGxuYW1lPS4uL2Jpbi8kZGxuYW1lIDs7CisJICBlc2FjCisJICAkZWNobyA+ICRvdXRwdXQgIlwKKyMgJG91dHB1dG5hbWUgLSBhIGxpYnRvb2wgbGlicmFyeSBmaWxlCisjIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAtIEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVAKKyMKKyMgUGxlYXNlIERPIE5PVCBkZWxldGUgdGhpcyBmaWxlIQorIyBJdCBpcyBuZWNlc3NhcnkgZm9yIGxpbmtpbmcgdGhlIGxpYnJhcnkuCisKKyMgVGhlIG5hbWUgdGhhdCB3ZSBjYW4gZGxvcGVuKDMpLgorZGxuYW1lPSckdGRsbmFtZScKKworIyBOYW1lcyBvZiB0aGlzIGxpYnJhcnkuCitsaWJyYXJ5X25hbWVzPSckbGlicmFyeV9uYW1lcycKKworIyBUaGUgbmFtZSBvZiB0aGUgc3RhdGljIGFyY2hpdmUuCitvbGRfbGlicmFyeT0nJG9sZF9saWJyYXJ5JworCisjIExpYnJhcmllcyB0aGF0IHRoaXMgb25lIGRlcGVuZHMgdXBvbi4KK2RlcGVuZGVuY3lfbGlicz0nJGRlcGVuZGVuY3lfbGlicycKKworIyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciAkbGlibmFtZS4KK2N1cnJlbnQ9JGN1cnJlbnQKK2FnZT0kYWdlCityZXZpc2lvbj0kcmV2aXNpb24KKworIyBJcyB0aGlzIGFuIGFscmVhZHkgaW5zdGFsbGVkIGxpYnJhcnk/CitpbnN0YWxsZWQ9JGluc3RhbGxlZAorCisjIEZpbGVzIHRvIGRsb3Blbi9kbHByZW9wZW4KK2Rsb3Blbj0nJGRsZmlsZXMnCitkbHByZW9wZW49JyRkbHByZWZpbGVzJworCisjIERpcmVjdG9yeSB0aGF0IHRoaXMgbGlicmFyeSBuZWVkcyB0byBiZSBpbnN0YWxsZWQgaW46CitsaWJkaXI9JyRpbnN0YWxsX2xpYmRpciciCisJICBpZiB0ZXN0ICIkaW5zdGFsbGVkIiA9IG5vICYmIHRlc3QgJG5lZWRfcmVsaW5rID0geWVzOyB0aGVuCisJICAgICRlY2hvID4+ICRvdXRwdXQgIlwKK3JlbGlua19jb21tYW5kPVwiJHJlbGlua19jb21tYW5kXCIiCisJICBmaQorCWRvbmUKKyAgICAgIGZpCisKKyAgICAgICMgRG8gYSBzeW1ib2xpYyBsaW5rIHNvIHRoYXQgdGhlIGxpYnRvb2wgYXJjaGl2ZSBjYW4gYmUgZm91bmQgaW4KKyAgICAgICMgTERfTElCUkFSWV9QQVRIIGJlZm9yZSB0aGUgcHJvZ3JhbSBpcyBpbnN0YWxsZWQuCisgICAgICAkc2hvdyAiKGNkICRvdXRwdXRfb2JqZGlyICYmICRybSAkb3V0cHV0bmFtZSAmJiAkTE5fUyAuLi8kb3V0cHV0bmFtZSAkb3V0cHV0bmFtZSkiCisgICAgICAkcnVuIGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJG91dHB1dG5hbWUgJiYgJExOX1MgLi4vJG91dHB1dG5hbWUgJG91dHB1dG5hbWUpJyB8fCBleGl0ICQ/CisgICAgICA7OworICAgIGVzYWMKKyAgICBleGl0IDAKKyAgICA7OworCisgICMgbGlidG9vbCBpbnN0YWxsIG1vZGUKKyAgaW5zdGFsbCkKKyAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBpbnN0YWxsIgorCisgICAgIyBUaGVyZSBtYXkgYmUgYW4gb3B0aW9uYWwgc2goMSkgYXJndW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgorICAgICMgaW5zdGFsbF9wcm9nIChlc3BlY2lhbGx5IG9uIFdpbmRvd3MgTlQpLgorICAgIGlmIHRlc3QgIiRub25vcHQiID0gIiRTSEVMTCIgfHwgdGVzdCAiJG5vbm9wdCIgPSAvYmluL3NoIHx8CisgICAgICAgIyBBbGxvdyB0aGUgdXNlIG9mIEdOVSBzaHRvb2wncyBpbnN0YWxsIGNvbW1hbmQuCisgICAgICAgJGVjaG8gIlgkbm9ub3B0IiB8ICRYc2VkIHwgZ3JlcCBzaHRvb2wgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSBpdC4KKyAgICAgIGFyZz1gJGVjaG8gIlgkbm9ub3B0IiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICAgIGNhc2UgJGFyZyBpbgorICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSopCisJYXJnPSJcIiRhcmdcIiIKKwk7OworICAgICAgZXNhYworICAgICAgaW5zdGFsbF9wcm9nPSIkYXJnICIKKyAgICAgIGFyZz0iJDEiCisgICAgICBzaGlmdAorICAgIGVsc2UKKyAgICAgIGluc3RhbGxfcHJvZz0KKyAgICAgIGFyZz0iJG5vbm9wdCIKKyAgICBmaQorCisgICAgIyBUaGUgcmVhbCBmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgdGhlIG5hbWUgb2YgdGhlIGluc3RhbGxhdGlvbiBwcm9ncmFtLgorICAgICMgQWVzdGhldGljYWxseSBxdW90ZSBpdC4KKyAgICBhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgY2FzZSAkYXJnIGluCisgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSopCisgICAgICBhcmc9IlwiJGFyZ1wiIgorICAgICAgOzsKKyAgICBlc2FjCisgICAgaW5zdGFsbF9wcm9nPSIkaW5zdGFsbF9wcm9nJGFyZyIKKworICAgICMgV2UgbmVlZCB0byBhY2NlcHQgYXQgbGVhc3QgYWxsIHRoZSBCU0QgaW5zdGFsbCBmbGFncy4KKyAgICBkZXN0PQorICAgIGZpbGVzPQorICAgIG9wdHM9CisgICAgcHJldj0KKyAgICBpbnN0YWxsX3R5cGU9CisgICAgaXNkaXI9bm8KKyAgICBzdHJpcG1lPQorICAgIGZvciBhcmcKKyAgICBkbworICAgICAgaWYgdGVzdCAtbiAiJGRlc3QiOyB0aGVuCisJZmlsZXM9IiRmaWxlcyAkZGVzdCIKKwlkZXN0PSIkYXJnIgorCWNvbnRpbnVlCisgICAgICBmaQorCisgICAgICBjYXNlICRhcmcgaW4KKyAgICAgIC1kKSBpc2Rpcj15ZXMgOzsKKyAgICAgIC1mKSBwcmV2PSItZiIgOzsKKyAgICAgIC1nKSBwcmV2PSItZyIgOzsKKyAgICAgIC1tKSBwcmV2PSItbSIgOzsKKyAgICAgIC1vKSBwcmV2PSItbyIgOzsKKyAgICAgIC1zKQorCXN0cmlwbWU9IiAtcyIKKwljb250aW51ZQorCTs7CisgICAgICAtKikgOzsKKworICAgICAgKikKKwkjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZGVkIGFuIGFyZ3VtZW50LCB0aGVuIHNraXAgaXQuCisJaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCisJICBwcmV2PQorCWVsc2UKKwkgIGRlc3Q9IiRhcmciCisJICBjb250aW51ZQorCWZpCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIHRoZSBhcmd1bWVudC4KKyAgICAgIGFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICAgIGNhc2UgJGFyZyBpbgorICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSopCisJYXJnPSJcIiRhcmdcIiIKKwk7OworICAgICAgZXNhYworICAgICAgaW5zdGFsbF9wcm9nPSIkaW5zdGFsbF9wcm9nICRhcmciCisgICAgZG9uZQorCisgICAgaWYgdGVzdCAteiAiJGluc3RhbGxfcHJvZyI7IHRoZW4KKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYW4gaW5zdGFsbCBwcm9ncmFtIiAxPiYyCisgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IHRoZSBcYCRwcmV2JyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQiIDE+JjIKKyAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgZXhpdCAxCisgICAgZmkKKworICAgIGlmIHRlc3QgLXogIiRmaWxlcyI7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogIiRkZXN0IjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IG5vIGZpbGUgb3IgZGVzdGluYXRpb24gc3BlY2lmaWVkIiAxPiYyCisgICAgICBlbHNlCisJJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIGRlc3RpbmF0aW9uIiAxPiYyCisgICAgICBmaQorICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgICBleGl0IDEKKyAgICBmaQorCisgICAgIyBTdHJpcCBhbnkgdHJhaWxpbmcgc2xhc2ggZnJvbSB0aGUgZGVzdGluYXRpb24uCisgICAgZGVzdD1gJGVjaG8gIlgkZGVzdCIgfCAkWHNlZCAtZSAncyUvJCUlJ2AKKworICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LgorICAgIHRlc3QgLWQgIiRkZXN0IiAmJiBpc2Rpcj15ZXMKKyAgICBpZiB0ZXN0ICIkaXNkaXIiID0geWVzOyB0aGVuCisgICAgICBkZXN0ZGlyPSIkZGVzdCIKKyAgICAgIGRlc3RuYW1lPQorICAgIGVsc2UKKyAgICAgIGRlc3RkaXI9YCRlY2hvICJYJGRlc3QiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKKyAgICAgIHRlc3QgIlgkZGVzdGRpciIgPSAiWCRkZXN0IiAmJiBkZXN0ZGlyPS4KKyAgICAgIGRlc3RuYW1lPWAkZWNobyAiWCRkZXN0IiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisKKyAgICAgICMgTm90IGEgZGlyZWN0b3J5LCBzbyBjaGVjayB0byBzZWUgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBmaWxlIHNwZWNpZmllZC4KKyAgICAgIHNldCBkdW1teSAkZmlsZXMKKyAgICAgIGlmIHRlc3QgJCMgLWd0IDI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiBcYCRkZXN0JyBpcyBub3QgYSBkaXJlY3RvcnkiIDE+JjIKKwkkZWNobyAiJGhlbHAiIDE+JjIKKwlleGl0IDEKKyAgICAgIGZpCisgICAgZmkKKyAgICBjYXNlICRkZXN0ZGlyIGluCisgICAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OworICAgICopCisgICAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCisJY2FzZSAkZmlsZSBpbgorCSoubG8pIDs7CisJKikKKwkgICRlY2hvICIkbW9kZW5hbWU6IFxgJGRlc3RkaXInIG11c3QgYmUgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUiIDE+JjIKKwkgICRlY2hvICIkaGVscCIgMT4mMgorCSAgZXhpdCAxCisJICA7OworCWVzYWMKKyAgICAgIGRvbmUKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgIyBUaGlzIHZhcmlhYmxlIHRlbGxzIHdyYXBwZXIgc2NyaXB0cyBqdXN0IHRvIHNldCB2YXJpYWJsZXMgcmF0aGVyCisgICAgIyB0aGFuIHJ1bm5pbmcgdGhlaXIgcHJvZ3JhbXMuCisgICAgbGlidG9vbF9pbnN0YWxsX21hZ2ljPSIkbWFnaWMiCisKKyAgICBzdGF0aWNsaWJzPQorICAgIGZ1dHVyZV9saWJkaXJzPQorICAgIGN1cnJlbnRfbGliZGlycz0KKyAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCisKKyAgICAgICMgRG8gZWFjaCBpbnN0YWxsYXRpb24uCisgICAgICBjYXNlICRmaWxlIGluCisgICAgICAqLiRsaWJleHQpCisJIyBEbyB0aGUgc3RhdGljIGxpYnJhcmllcyBsYXRlci4KKwlzdGF0aWNsaWJzPSIkc3RhdGljbGlicyAkZmlsZSIKKwk7OworCisgICAgICAqLmxhKQorCSMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCisJaWYgKHNlZCAtZSAnMnEnICRmaWxlIHwgZWdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKwllbHNlCisJICAkZWNobyAiJG1vZGVuYW1lOiBcYCRmaWxlJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKKwkgICRlY2hvICIkaGVscCIgMT4mMgorCSAgZXhpdCAxCisJZmkKKworCWxpYnJhcnlfbmFtZXM9CisJb2xkX2xpYnJhcnk9CisJcmVsaW5rX2NvbW1hbmQ9CisJIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCisJY2FzZSAkZmlsZSBpbgorCSovKiB8ICpcXCopIC4gJGZpbGUgOzsKKwkqKSAuIC4vJGZpbGUgOzsKKwllc2FjCisKKwkjIEFkZCB0aGUgbGliZGlyIHRvIGN1cnJlbnRfbGliZGlycyBpZiBpdCBpcyB0aGUgZGVzdGluYXRpb24uCisJREVTVERJUj0KKwlpZiB0ZXN0ICJYJGRlc3RkaXIiID0gIlgkbGliZGlyIjsgdGhlbgorCSAgY2FzZSAiJGN1cnJlbnRfbGliZGlycyAiIGluCisJICAqIiAkbGliZGlyICIqKSA7OworCSAgKikgY3VycmVudF9saWJkaXJzPSIkY3VycmVudF9saWJkaXJzICRsaWJkaXIiIDs7CisJICBlc2FjCisJZWxzZQorCSAgY2FzZSAiJGRlc3RkaXIiIGluCisJICAgICoiJGxpYmRpciIpCisJICAgICAgREVTVERJUj1gJGVjaG8gIiRkZXN0ZGlyIiB8IHNlZCAtZSAncyEnIiRsaWJkaXIiJyQhISdgCisJICAgICAgaWYgdGVzdCAiWCRkZXN0ZGlyIiAhPSAiWCRERVNURElSJGxpYmRpciI7IHRoZW4KKwkJREVTVERJUj0KKwkgICAgICBmaQorCSAgICAgIDs7CisJICBlc2FjCisJICAjIE5vdGUgdGhlIGxpYmRpciBhcyBhIGZ1dHVyZSBsaWJkaXIuCisJICBjYXNlICIkZnV0dXJlX2xpYmRpcnMgIiBpbgorCSAgKiIgJGxpYmRpciAiKikgOzsKKwkgICopIGZ1dHVyZV9saWJkaXJzPSIkZnV0dXJlX2xpYmRpcnMgJGxpYmRpciIgOzsKKwkgIGVzYWMKKwlmaQorCisJZGlyPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgLworCXRlc3QgIlgkZGlyIiA9ICJYJGZpbGUvIiAmJiBkaXI9CisJZGlyPSIkZGlyJG9iamRpciIKKworCWlmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KKwkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHJlbGlua2luZyBcYCRmaWxlJyIgMT4mMgorCSAgZXhwb3J0IERFU1RESVIKKwkgICRzaG93ICIkcmVsaW5rX2NvbW1hbmQiCisJICBpZiAkcnVuIGV2YWwgIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4gOgorCSAgZWxzZQorCSAgICAkZWNobyAiJG1vZGVuYW1lOiBlcnJvcjogcmVsaW5rIFxgJGZpbGUnIHdpdGggdGhlIGFib3ZlIGNvbW1hbmQgYmVmb3JlIGluc3RhbGxpbmcgaXQiIDE+JjIKKwkgICAgY29udGludWUKKwkgIGZpCisJZmkKKwl1bnNldCBERVNURElSCisKKwkjIFNlZSB0aGUgbmFtZXMgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5LgorCXNldCBkdW1teSAkbGlicmFyeV9uYW1lcworCWlmIHRlc3QgLW4gIiQyIjsgdGhlbgorCSAgcmVhbG5hbWU9IiQyIgorCSAgc2hpZnQKKwkgIHNoaWZ0CisKKwkgIHNyY25hbWU9IiRyZWFsbmFtZSIKKwkgIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCIgJiYgc3JjbmFtZT0iJHJlYWxuYW1lIlQKKworCSAgIyBJbnN0YWxsIHRoZSBzaGFyZWQgbGlicmFyeSBhbmQgYnVpbGQgdGhlIHN5bWxpbmtzLgorCSAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJGRpci8kc3JjbmFtZSAkZGVzdGRpci8kcmVhbG5hbWUiCisJICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgJGRpci8kc3JjbmFtZSAkZGVzdGRpci8kcmVhbG5hbWUiIHx8IGV4aXQgJD8KKwkgIGlmIHRlc3QgLW4gIiRzdHJpcG1lIiAmJiB0ZXN0IC1uICIkc3RyaXBsaWIiOyB0aGVuCisJICAgICRzaG93ICIkc3RyaXBsaWIgJGRlc3RkaXIvJHJlYWxuYW1lIgorCSAgICAkcnVuIGV2YWwgIiRzdHJpcGxpYiAkZGVzdGRpci8kcmVhbG5hbWUiIHx8IGV4aXQgJD8KKwkgIGZpCisKKwkgIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KKwkgICAgIyBEZWxldGUgdGhlIG9sZCBzeW1saW5rcywgYW5kIGNyZWF0ZSBuZXcgb25lcy4KKwkgICAgZm9yIGxpbmtuYW1lCisJICAgIGRvCisJICAgICAgaWYgdGVzdCAiJGxpbmtuYW1lIiAhPSAiJHJlYWxuYW1lIjsgdGhlbgorCQkkc2hvdyAiKGNkICRkZXN0ZGlyICYmICRybSAkbGlua25hbWUgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZSkiCisJCSRydW4gZXZhbCAiKGNkICRkZXN0ZGlyICYmICRybSAkbGlua25hbWUgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZSkiCisJICAgICAgZmkKKwkgICAgZG9uZQorCSAgZmkKKworCSAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3RpbnN0YWxsIGNvbW1hbmRzLgorCSAgbGliPSIkZGVzdGRpci8kcmVhbG5hbWUiCisJICBldmFsIGNtZHM9XCIkcG9zdGluc3RhbGxfY21kc1wiCisJICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKwkgIGZvciBjbWQgaW4gJGNtZHM7IGRvCisJICAgIElGUz0iJHNhdmVfaWZzIgorCSAgICAkc2hvdyAiJGNtZCIKKwkgICAgJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/CisJICBkb25lCisJICBJRlM9IiRzYXZlX2lmcyIKKwlmaQorCisJIyBJbnN0YWxsIHRoZSBwc2V1ZG8tbGlicmFyeSBmb3IgaW5mb3JtYXRpb24gcHVycG9zZXMuCisJbmFtZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCWluc3RuYW1lPSIkZGlyLyRuYW1lImkKKwkkc2hvdyAiJGluc3RhbGxfcHJvZyAkaW5zdG5hbWUgJGRlc3RkaXIvJG5hbWUiCisJJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nICRpbnN0bmFtZSAkZGVzdGRpci8kbmFtZSIgfHwgZXhpdCAkPworCisJIyBNYXliZSBpbnN0YWxsIHRoZSBzdGF0aWMgbGlicmFyeSwgdG9vLgorCXRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYgc3RhdGljbGlicz0iJHN0YXRpY2xpYnMgJGRpci8kb2xkX2xpYnJhcnkiCisJOzsKKworICAgICAgKi5sbykKKwkjIEluc3RhbGwgKGkuZS4gY29weSkgYSBsaWJ0b29sIG9iamVjdC4KKworCSMgRmlndXJlIG91dCBkZXN0aW5hdGlvbiBmaWxlIG5hbWUsIGlmIGl0IHdhc24ndCBhbHJlYWR5IHNwZWNpZmllZC4KKwlpZiB0ZXN0IC1uICIkZGVzdG5hbWUiOyB0aGVuCisJICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RuYW1lIgorCWVsc2UKKwkgIGRlc3RmaWxlPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisJICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RmaWxlIgorCWZpCisKKwkjIERlZHVjZSB0aGUgbmFtZSBvZiB0aGUgZGVzdGluYXRpb24gb2xkLXN0eWxlIG9iamVjdCBmaWxlLgorCWNhc2UgJGRlc3RmaWxlIGluCisJKi5sbykKKwkgIHN0YXRpY2Rlc3Q9YCRlY2hvICJYJGRlc3RmaWxlIiB8ICRYc2VkIC1lICIkbG8ybyJgCisJICA7OworCSouJG9iamV4dCkKKwkgIHN0YXRpY2Rlc3Q9IiRkZXN0ZmlsZSIKKwkgIGRlc3RmaWxlPQorCSAgOzsKKwkqKQorCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGNvcHkgYSBsaWJ0b29sIG9iamVjdCB0byBcYCRkZXN0ZmlsZSciIDE+JjIKKwkgICRlY2hvICIkaGVscCIgMT4mMgorCSAgZXhpdCAxCisJICA7OworCWVzYWMKKworCSMgSW5zdGFsbCB0aGUgbGlidG9vbCBvYmplY3QgaWYgcmVxdWVzdGVkLgorCWlmIHRlc3QgLW4gIiRkZXN0ZmlsZSI7IHRoZW4KKwkgICRzaG93ICIkaW5zdGFsbF9wcm9nICRmaWxlICRkZXN0ZmlsZSIKKwkgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyAkZmlsZSAkZGVzdGZpbGUiIHx8IGV4aXQgJD8KKwlmaQorCisJIyBJbnN0YWxsIHRoZSBvbGQgb2JqZWN0IGlmIGVuYWJsZWQuCisJaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorCSAgIyBEZWR1Y2UgdGhlIG5hbWUgb2YgdGhlIG9sZC1zdHlsZSBvYmplY3QgZmlsZS4KKwkgIHN0YXRpY29iaj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAiJGxvMm8iYAorCisJICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkc3RhdGljb2JqICRzdGF0aWNkZXN0IgorCSAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nIFwkc3RhdGljb2JqIFwkc3RhdGljZGVzdCIgfHwgZXhpdCAkPworCWZpCisJZXhpdCAwCisJOzsKKworICAgICAgKikKKwkjIEZpZ3VyZSBvdXQgZGVzdGluYXRpb24gZmlsZSBuYW1lLCBpZiBpdCB3YXNuJ3QgYWxyZWFkeSBzcGVjaWZpZWQuCisJaWYgdGVzdCAtbiAiJGRlc3RuYW1lIjsgdGhlbgorCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0bmFtZSIKKwllbHNlCisJICBkZXN0ZmlsZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0ZmlsZSIKKwlmaQorCisJIyBEbyBhIHRlc3QgdG8gc2VlIGlmIHRoaXMgaXMgcmVhbGx5IGEgbGlidG9vbCBwcm9ncmFtLgorCWlmIChzZWQgLWUgJzRxJyAkZmlsZSB8IGVncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgbm90aW5zdF9kZXBsaWJzPQorCSAgcmVsaW5rX2NvbW1hbmQ9CisKKwkgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgorCSAgY2FzZSAkZmlsZSBpbgorCSAgKi8qIHwgKlxcKikgLiAkZmlsZSA7OworCSAgKikgLiAuLyRmaWxlIDs7CisJICBlc2FjCisKKwkgICMgQ2hlY2sgdGhlIHZhcmlhYmxlcyB0aGF0IHNob3VsZCBoYXZlIGJlZW4gc2V0LgorCSAgaWYgdGVzdCAteiAiJG5vdGluc3RfZGVwbGlicyI7IHRoZW4KKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogaW52YWxpZCBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0IFxgJGZpbGUnIiAxPiYyCisJICAgIGV4aXQgMQorCSAgZmkKKworCSAgZmluYWxpemU9eWVzCisJICBmb3IgbGliIGluICRub3RpbnN0X2RlcGxpYnM7IGRvCisJICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgZWFjaCBsaWJyYXJ5IGlzIGluc3RhbGxlZC4KKwkgICAgbGliZGlyPQorCSAgICBpZiB0ZXN0IC1mICIkbGliIjsgdGhlbgorCSAgICAgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgorCSAgICAgIGNhc2UgJGxpYiBpbgorCSAgICAgICovKiB8ICpcXCopIC4gJGxpYiA7OworCSAgICAgICopIC4gLi8kbGliIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgICBsaWJmaWxlPSIkbGliZGlyLyJgJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJWcnYCAjIyMgdGVzdHN1aXRlOiBza2lwIG5lc3RlZCBxdW90aW5nIHRlc3QKKwkgICAgaWYgdGVzdCAtbiAiJGxpYmRpciIgJiYgdGVzdCAhIC1mICIkbGliZmlsZSI7IHRoZW4KKwkgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYCRsaWInIGhhcyBub3QgYmVlbiBpbnN0YWxsZWQgaW4gXGAkbGliZGlyJyIgMT4mMgorCSAgICAgIGZpbmFsaXplPW5vCisJICAgIGZpCisJICBkb25lCisKKwkgIHJlbGlua19jb21tYW5kPQorCSAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCisJICBjYXNlICRmaWxlIGluCisJICAqLyogfCAqXFwqKSAuICRmaWxlIDs7CisJICAqKSAuIC4vJGZpbGUgOzsKKwkgIGVzYWMKKworCSAgb3V0cHV0bmFtZT0KKwkgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0gbm8gJiYgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIjsgdGhlbgorCSAgICBpZiB0ZXN0ICIkZmluYWxpemUiID0geWVzICYmIHRlc3QgLXogIiRydW4iOyB0aGVuCisJICAgICAgdG1wZGlyPSIvdG1wIgorCSAgICAgIHRlc3QgLW4gIiRUTVBESVIiICYmIHRtcGRpcj0iJFRNUERJUiIKKwkgICAgICB0bXBkaXI9IiR0bXBkaXIvbGlidG9vbC0kJCIKKwkgICAgICBpZiAkbWtkaXIgLXAgIiR0bXBkaXIiICYmIGNobW9kIDcwMCAiJHRtcGRpciI7IHRoZW4gOgorCSAgICAgIGVsc2UKKwkJJGVjaG8gIiRtb2RlbmFtZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBcYCR0bXBkaXInIiAxPiYyCisJCWNvbnRpbnVlCisJICAgICAgZmkKKwkgICAgICBmaWxlPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisJICAgICAgb3V0cHV0bmFtZT0iJHRtcGRpci8kZmlsZSIKKwkgICAgICAjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCisJICAgICAgcmVsaW5rX2NvbW1hbmQ9YCRlY2hvICJYJHJlbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dG5hbWUiJyVnJ2AKKworCSAgICAgICRzaG93ICIkcmVsaW5rX2NvbW1hbmQiCisJICAgICAgaWYgJHJ1biBldmFsICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuIDoKKwkgICAgICBlbHNlCisJCSRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiByZWxpbmsgXGAkZmlsZScgd2l0aCB0aGUgYWJvdmUgY29tbWFuZCBiZWZvcmUgaW5zdGFsbGluZyBpdCIgMT4mMgorCQkke3JtfXIgIiR0bXBkaXIiCisJCWNvbnRpbnVlCisJICAgICAgZmkKKwkgICAgICBmaWxlPSIkb3V0cHV0bmFtZSIKKwkgICAgZWxzZQorCSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCByZWxpbmsgXGAkZmlsZSciIDE+JjIKKwkgICAgZmkKKwkgIGVsc2UKKwkgICAgIyBJbnN0YWxsIHRoZSBiaW5hcnkgdGhhdCB3ZSBjb21waWxlZCBlYXJsaWVyLgorCSAgICBmaWxlPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICJzJVwoW14vXSpcKSQlJG9iamRpci9cMSUiYAorCSAgZmkKKwlmaQorCisJIyByZW1vdmUgLmV4ZSBzaW5jZSBjeWd3aW4gL3Vzci9iaW4vaW5zdGFsbCB3aWxsIGFwcGVuZCBhbm90aGVyCisJIyBvbmUgYW55d2F5cworCWNhc2UgJGluc3RhbGxfcHJvZywkaG9zdCBpbgorCS91c3IvYmluL2luc3RhbGwqLCpjeWd3aW4qKQorCSAgY2FzZSAkZmlsZTokZGVzdGZpbGUgaW4KKwkgICouZXhlOiouZXhlKQorCSAgICAjIHRoaXMgaXMgb2sKKwkgICAgOzsKKwkgICouZXhlOiopCisJICAgIGRlc3RmaWxlPSRkZXN0ZmlsZS5leGUKKwkgICAgOzsKKwkgICo6Ki5leGUpCisJICAgIGRlc3RmaWxlPWBlY2hvICRkZXN0ZmlsZSB8IHNlZCAtZSAncywuZXhlJCwsJ2AKKwkgICAgOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworCSRzaG93ICIkaW5zdGFsbF9wcm9nJHN0cmlwbWUgJGZpbGUgJGRlc3RmaWxlIgorCSRydW4gZXZhbCAiJGluc3RhbGxfcHJvZ1wkc3RyaXBtZSBcJGZpbGUgXCRkZXN0ZmlsZSIgfHwgZXhpdCAkPworCXRlc3QgLW4gIiRvdXRwdXRuYW1lIiAmJiAke3JtfXIgIiR0bXBkaXIiCisJOzsKKyAgICAgIGVzYWMKKyAgICBkb25lCisKKyAgICBmb3IgZmlsZSBpbiAkc3RhdGljbGliczsgZG8KKyAgICAgIG5hbWU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKworICAgICAgIyBTZXQgdXAgdGhlIHJhbmxpYiBwYXJhbWV0ZXJzLgorICAgICAgb2xkbGliPSIkZGVzdGRpci8kbmFtZSIKKworICAgICAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJGZpbGUgJG9sZGxpYiIKKyAgICAgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyBcJGZpbGUgXCRvbGRsaWIiIHx8IGV4aXQgJD8KKworICAgICAgaWYgdGVzdCAtbiAiJHN0cmlwbWUiICYmIHRlc3QgLW4gIiRzdHJpcGxpYiI7IHRoZW4KKwkkc2hvdyAiJG9sZF9zdHJpcGxpYiAkb2xkbGliIgorCSRydW4gZXZhbCAiJG9sZF9zdHJpcGxpYiAkb2xkbGliIiB8fCBleGl0ICQ/CisgICAgICBmaQorCisgICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgcG9zdGluc3RhbGwgY29tbWFuZHMuCisgICAgICBldmFsIGNtZHM9XCIkb2xkX3Bvc3RpbnN0YWxsX2NtZHNcIgorICAgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisgICAgICBmb3IgY21kIGluICRjbWRzOyBkbworCUlGUz0iJHNhdmVfaWZzIgorCSRzaG93ICIkY21kIgorCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPworICAgICAgZG9uZQorICAgICAgSUZTPSIkc2F2ZV9pZnMiCisgICAgZG9uZQorCisgICAgaWYgdGVzdCAtbiAiJGZ1dHVyZV9saWJkaXJzIjsgdGhlbgorICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogcmVtZW1iZXIgdG8gcnVuIFxgJHByb2duYW1lIC0tZmluaXNoJGZ1dHVyZV9saWJkaXJzJyIgMT4mMgorICAgIGZpCisKKyAgICBpZiB0ZXN0IC1uICIkY3VycmVudF9saWJkaXJzIjsgdGhlbgorICAgICAgIyBNYXliZSBqdXN0IGRvIGEgZHJ5IHJ1bi4KKyAgICAgIHRlc3QgLW4gIiRydW4iICYmIGN1cnJlbnRfbGliZGlycz0iIC1uJGN1cnJlbnRfbGliZGlycyIKKyAgICAgIGV4ZWNfY21kPSckU0hFTEwgJDAgLS1maW5pc2gkY3VycmVudF9saWJkaXJzJworICAgIGVsc2UKKyAgICAgIGV4aXQgMAorICAgIGZpCisgICAgOzsKKworICAjIGxpYnRvb2wgZmluaXNoIG1vZGUKKyAgZmluaXNoKQorICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGZpbmlzaCIKKyAgICBsaWJkaXJzPSIkbm9ub3B0IgorICAgIGFkbWluY21kcz0KKworICAgIGlmIHRlc3QgLW4gIiRmaW5pc2hfY21kcyRmaW5pc2hfZXZhbCIgJiYgdGVzdCAtbiAiJGxpYmRpcnMiOyB0aGVuCisgICAgICBmb3IgZGlyCisgICAgICBkbworCWxpYmRpcnM9IiRsaWJkaXJzICRkaXIiCisgICAgICBkb25lCisKKyAgICAgIGZvciBsaWJkaXIgaW4gJGxpYmRpcnM7IGRvCisJaWYgdGVzdCAtbiAiJGZpbmlzaF9jbWRzIjsgdGhlbgorCSAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIGZpbmlzaCBjb21tYW5kcy4KKwkgIGV2YWwgY21kcz1cIiRmaW5pc2hfY21kc1wiCisJICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKwkgIGZvciBjbWQgaW4gJGNtZHM7IGRvCisJICAgIElGUz0iJHNhdmVfaWZzIgorCSAgICAkc2hvdyAiJGNtZCIKKwkgICAgJHJ1biBldmFsICIkY21kIiB8fCBhZG1pbmNtZHM9IiRhZG1pbmNtZHMKKyAgICAgICAkY21kIgorCSAgZG9uZQorCSAgSUZTPSIkc2F2ZV9pZnMiCisJZmkKKwlpZiB0ZXN0IC1uICIkZmluaXNoX2V2YWwiOyB0aGVuCisJICAjIERvIHRoZSBzaW5nbGUgZmluaXNoX2V2YWwuCisJICBldmFsIGNtZHM9XCIkZmluaXNoX2V2YWxcIgorCSAgJHJ1biBldmFsICIkY21kcyIgfHwgYWRtaW5jbWRzPSIkYWRtaW5jbWRzCisgICAgICAgJGNtZHMiCisJZmkKKyAgICAgIGRvbmUKKyAgICBmaQorCisgICAgIyBFeGl0IGhlcmUgaWYgdGhleSB3YW50ZWQgc2lsZW50IG1vZGUuCisgICAgdGVzdCAiJHNob3ciID0gIjoiICYmIGV4aXQgMAorCisgICAgZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKyAgICBlY2hvICJMaWJyYXJpZXMgaGF2ZSBiZWVuIGluc3RhbGxlZCBpbjoiCisgICAgZm9yIGxpYmRpciBpbiAkbGliZGlyczsgZG8KKyAgICAgIGVjaG8gIiAgICRsaWJkaXIiCisgICAgZG9uZQorICAgIGVjaG8KKyAgICBlY2hvICJJZiB5b3UgZXZlciBoYXBwZW4gdG8gd2FudCB0byBsaW5rIGFnYWluc3QgaW5zdGFsbGVkIGxpYnJhcmllcyIKKyAgICBlY2hvICJpbiBhIGdpdmVuIGRpcmVjdG9yeSwgTElCRElSLCB5b3UgbXVzdCBlaXRoZXIgdXNlIGxpYnRvb2wsIGFuZCIKKyAgICBlY2hvICJzcGVjaWZ5IHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBsaWJyYXJ5LCBvciB1c2UgdGhlIFxgLUxMSUJESVInIgorICAgIGVjaG8gImZsYWcgZHVyaW5nIGxpbmtpbmcgYW5kIGRvIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nOiIKKyAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KKyAgICAgIGVjaG8gIiAgIC0gYWRkIExJQkRJUiB0byB0aGUgXGAkc2hsaWJwYXRoX3ZhcicgZW52aXJvbm1lbnQgdmFyaWFibGUiCisgICAgICBlY2hvICIgICAgIGR1cmluZyBleGVjdXRpb24iCisgICAgZmkKKyAgICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisgICAgICBlY2hvICIgICAtIGFkZCBMSUJESVIgdG8gdGhlIFxgJHJ1bnBhdGhfdmFyJyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKKyAgICAgIGVjaG8gIiAgICAgZHVyaW5nIGxpbmtpbmciCisgICAgZmkKKyAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KKyAgICAgIGxpYmRpcj1MSUJESVIKKyAgICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKworICAgICAgZWNobyAiICAgLSB1c2UgdGhlIFxgJGZsYWcnIGxpbmtlciBmbGFnIgorICAgIGZpCisgICAgaWYgdGVzdCAtbiAiJGFkbWluY21kcyI7IHRoZW4KKyAgICAgIGVjaG8gIiAgIC0gaGF2ZSB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yIHJ1biB0aGVzZSBjb21tYW5kczokYWRtaW5jbWRzIgorICAgIGZpCisgICAgaWYgdGVzdCAtZiAvZXRjL2xkLnNvLmNvbmY7IHRoZW4KKyAgICAgIGVjaG8gIiAgIC0gaGF2ZSB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yIGFkZCBMSUJESVIgdG8gXGAvZXRjL2xkLnNvLmNvbmYnIgorICAgIGZpCisgICAgZWNobworICAgIGVjaG8gIlNlZSBhbnkgb3BlcmF0aW5nIHN5c3RlbSBkb2N1bWVudGF0aW9uIGFib3V0IHNoYXJlZCBsaWJyYXJpZXMgZm9yIgorICAgIGVjaG8gIm1vcmUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIGxkKDEpIGFuZCBsZC5zbyg4KSBtYW51YWwgcGFnZXMuIgorICAgIGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisgICAgZXhpdCAwCisgICAgOzsKKworICAjIGxpYnRvb2wgZXhlY3V0ZSBtb2RlCisgIGV4ZWN1dGUpCisgICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogZXhlY3V0ZSIKKworICAgICMgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBjb21tYW5kIG5hbWUuCisgICAgY21kPSIkbm9ub3B0IgorICAgIGlmIHRlc3QgLXogIiRjbWQiOyB0aGVuCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgQ09NTUFORCIgMT4mMgorICAgICAgJGVjaG8gIiRoZWxwIgorICAgICAgZXhpdCAxCisgICAgZmkKKworICAgICMgSGFuZGxlIC1kbG9wZW4gZmxhZ3MgaW1tZWRpYXRlbHkuCisgICAgZm9yIGZpbGUgaW4gJGV4ZWN1dGVfZGxmaWxlczsgZG8KKyAgICAgIGlmIHRlc3QgISAtZiAiJGZpbGUiOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogXGAkZmlsZScgaXMgbm90IGEgZmlsZSIgMT4mMgorCSRlY2hvICIkaGVscCIgMT4mMgorCWV4aXQgMQorICAgICAgZmkKKworICAgICAgZGlyPQorICAgICAgY2FzZSAkZmlsZSBpbgorICAgICAgKi5sYSkKKwkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgorCWlmIChzZWQgLWUgJzJxJyAkZmlsZSB8IGVncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisJZWxzZQorCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKKwkgICRlY2hvICIkaGVscCIgMT4mMgorCSAgZXhpdCAxCisJZmkKKworCSMgUmVhZCB0aGUgbGlidG9vbCBsaWJyYXJ5LgorCWRsbmFtZT0KKwlsaWJyYXJ5X25hbWVzPQorCisJIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCisJY2FzZSAkZmlsZSBpbgorCSovKiB8ICpcXCopIC4gJGZpbGUgOzsKKwkqKSAuIC4vJGZpbGUgOzsKKwllc2FjCisKKwkjIFNraXAgdGhpcyBsaWJyYXJ5IGlmIGl0IGNhbm5vdCBiZSBkbG9wZW5lZC4KKwlpZiB0ZXN0IC16ICIkZGxuYW1lIjsgdGhlbgorCSAgIyBXYXJuIGlmIGl0IHdhcyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiICYmICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgJGZpbGUnIHdhcyBub3QgbGlua2VkIHdpdGggXGAtZXhwb3J0LWR5bmFtaWMnIgorCSAgY29udGludWUKKwlmaQorCisJZGlyPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisJdGVzdCAiWCRkaXIiID0gIlgkZmlsZSIgJiYgZGlyPS4KKworCWlmIHRlc3QgLWYgIiRkaXIvJG9iamRpci8kZGxuYW1lIjsgdGhlbgorCSAgZGlyPSIkZGlyLyRvYmpkaXIiCisJZWxzZQorCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGZpbmQgXGAkZGxuYW1lJyBpbiBcYCRkaXInIG9yIFxgJGRpci8kb2JqZGlyJyIgMT4mMgorCSAgZXhpdCAxCisJZmkKKwk7OworCisgICAgICAqLmxvKQorCSMgSnVzdCBhZGQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSAubG8gZmlsZS4KKwlkaXI9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKKwl0ZXN0ICJYJGRpciIgPSAiWCRmaWxlIiAmJiBkaXI9LgorCTs7CisKKyAgICAgICopCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZyBcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIG5vbi1saWJ0b29sIGxpYnJhcmllcyBhbmQgb2JqZWN0cyIgMT4mMgorCWNvbnRpbnVlCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgIyBHZXQgdGhlIGFic29sdXRlIHBhdGhuYW1lLgorICAgICAgYWJzZGlyPWBjZCAiJGRpciIgJiYgcHdkYAorICAgICAgdGVzdCAtbiAiJGFic2RpciIgJiYgZGlyPSIkYWJzZGlyIgorCisgICAgICAjIE5vdyBhZGQgdGhlIGRpcmVjdG9yeSB0byBzaGxpYnBhdGhfdmFyLgorICAgICAgaWYgZXZhbCAidGVzdCAteiBcIlwkJHNobGlicGF0aF92YXJcIiI7IHRoZW4KKwlldmFsICIkc2hsaWJwYXRoX3Zhcj1cIlwkZGlyXCIiCisgICAgICBlbHNlCisJZXZhbCAiJHNobGlicGF0aF92YXI9XCJcJGRpcjpcJCRzaGxpYnBhdGhfdmFyXCIiCisgICAgICBmaQorICAgIGRvbmUKKworICAgICMgVGhpcyB2YXJpYWJsZSB0ZWxscyB3cmFwcGVyIHNjcmlwdHMganVzdCB0byBzZXQgc2hsaWJwYXRoX3ZhcgorICAgICMgcmF0aGVyIHRoYW4gcnVubmluZyB0aGVpciBwcm9ncmFtcy4KKyAgICBsaWJ0b29sX2V4ZWN1dGVfbWFnaWM9IiRtYWdpYyIKKworICAgICMgQ2hlY2sgaWYgYW55IG9mIHRoZSBhcmd1bWVudHMgaXMgYSB3cmFwcGVyIHNjcmlwdC4KKyAgICBhcmdzPQorICAgIGZvciBmaWxlCisgICAgZG8KKyAgICAgIGNhc2UgJGZpbGUgaW4KKyAgICAgIC0qKSA7OworICAgICAgKikKKwkjIERvIGEgdGVzdCB0byBzZWUgaWYgdGhpcyBpcyByZWFsbHkgYSBsaWJ0b29sIHByb2dyYW0uCisJaWYgKHNlZCAtZSAnNHEnICRmaWxlIHwgZWdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KKwkgIGNhc2UgJGZpbGUgaW4KKwkgICovKiB8ICpcXCopIC4gJGZpbGUgOzsKKwkgICopIC4gLi8kZmlsZSA7OworCSAgZXNhYworCisJICAjIFRyYW5zZm9ybSBhcmcgdG8gd3JhcHBlZCBuYW1lLgorCSAgZmlsZT0iJHByb2dkaXIvJHByb2dyYW0iCisJZmkKKwk7OworICAgICAgZXNhYworICAgICAgIyBRdW90ZSBhcmd1bWVudHMgKHRvIHByZXNlcnZlIHNoZWxsIG1ldGFjaGFyYWN0ZXJzKS4KKyAgICAgIGZpbGU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgICAgYXJncz0iJGFyZ3MgXCIkZmlsZVwiIgorICAgIGRvbmUKKworICAgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCisgICAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KKwkjIEV4cG9ydCB0aGUgc2hsaWJwYXRoX3Zhci4KKwlldmFsICJleHBvcnQgJHNobGlicGF0aF92YXIiCisgICAgICBmaQorCisgICAgICAjIFJlc3RvcmUgc2F2ZWQgZW52aXJvbWVudCB2YXJpYWJsZXMKKyAgICAgIGlmIHRlc3QgIiR7c2F2ZV9MQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4KKwlMQ19BTEw9IiRzYXZlX0xDX0FMTCI7IGV4cG9ydCBMQ19BTEwKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIke3NhdmVfTEFORytzZXR9IiA9IHNldDsgdGhlbgorCUxBTkc9IiRzYXZlX0xBTkciOyBleHBvcnQgTEFORworICAgICAgZmkKKworICAgICAgIyBOb3cgcHJlcGFyZSB0byBhY3R1YWxseSBleGVjIHRoZSBjb21tYW5kLgorICAgICAgZXhlY19jbWQ9JyIkY21kIiRhcmdzJworICAgIGVsc2UKKyAgICAgICMgRGlzcGxheSB3aGF0IHdvdWxkIGJlIGRvbmUuCisgICAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KKwlldmFsICJcJGVjaG8gXCJcJHNobGlicGF0aF92YXI9XCQkc2hsaWJwYXRoX3ZhclwiIgorCSRlY2hvICJleHBvcnQgJHNobGlicGF0aF92YXIiCisgICAgICBmaQorICAgICAgJGVjaG8gIiRjbWQkYXJncyIKKyAgICAgIGV4aXQgMAorICAgIGZpCisgICAgOzsKKworICAjIGxpYnRvb2wgY2xlYW4gYW5kIHVuaW5zdGFsbCBtb2RlCisgIGNsZWFuIHwgdW5pbnN0YWxsKQorICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6ICRtb2RlIgorICAgIHJtPSIkbm9ub3B0IgorICAgIGZpbGVzPQorICAgIHJtZm9yY2U9CisgICAgZXhpdF9zdGF0dXM9MAorCisgICAgIyBUaGlzIHZhcmlhYmxlIHRlbGxzIHdyYXBwZXIgc2NyaXB0cyBqdXN0IHRvIHNldCB2YXJpYWJsZXMgcmF0aGVyCisgICAgIyB0aGFuIHJ1bm5pbmcgdGhlaXIgcHJvZ3JhbXMuCisgICAgbGlidG9vbF9pbnN0YWxsX21hZ2ljPSIkbWFnaWMiCisKKyAgICBmb3IgYXJnCisgICAgZG8KKyAgICAgIGNhc2UgJGFyZyBpbgorICAgICAgLWYpIHJtPSIkcm0gJGFyZyI7IHJtZm9yY2U9eWVzIDs7CisgICAgICAtKikgcm09IiRybSAkYXJnIiA7OworICAgICAgKikgZmlsZXM9IiRmaWxlcyAkYXJnIiA7OworICAgICAgZXNhYworICAgIGRvbmUKKworICAgIGlmIHRlc3QgLXogIiRybSI7IHRoZW4KKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYW4gUk0gcHJvZ3JhbSIgMT4mMgorICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgICBleGl0IDEKKyAgICBmaQorCisgICAgcm1kaXJzPQorCisgICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbworICAgICAgZGlyPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisgICAgICBpZiB0ZXN0ICJYJGRpciIgPSAiWCRmaWxlIjsgdGhlbgorCWRpcj0uCisJb2JqZGlyPSIkb2JqZGlyIgorICAgICAgZWxzZQorCW9iamRpcj0iJGRpci8kb2JqZGlyIgorICAgICAgZmkKKyAgICAgIG5hbWU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKyAgICAgIHRlc3QgJG1vZGUgPSB1bmluc3RhbGwgJiYgb2JqZGlyPSIkZGlyIgorCisgICAgICAjIFJlbWVtYmVyIG9iamRpciBmb3IgcmVtb3ZhbCBsYXRlciwgYmVpbmcgY2FyZWZ1bCB0byBhdm9pZCBkdXBsaWNhdGVzCisgICAgICBpZiB0ZXN0ICRtb2RlID0gY2xlYW47IHRoZW4KKwljYXNlICIgJHJtZGlycyAiIGluCisJICAqIiAkb2JqZGlyICIqKSA7OworCSAgKikgcm1kaXJzPSIkcm1kaXJzICRvYmpkaXIiIDs7CisJZXNhYworICAgICAgZmkKKworICAgICAgIyBEb24ndCBlcnJvciBpZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0IGFuZCBybSAtZiB3YXMgdXNlZC4KKyAgICAgIGlmICh0ZXN0IC1MICIkZmlsZSIpID4vZGV2L251bGwgMj4mMSBcCisJfHwgKHRlc3QgLWggIiRmaWxlIikgPi9kZXYvbnVsbCAyPiYxIFwKKwl8fCB0ZXN0IC1mICIkZmlsZSI7IHRoZW4KKwk6CisgICAgICBlbGlmIHRlc3QgLWQgIiRmaWxlIjsgdGhlbgorCWV4aXRfc3RhdHVzPTEKKwljb250aW51ZQorICAgICAgZWxpZiB0ZXN0ICIkcm1mb3JjZSIgPSB5ZXM7IHRoZW4KKwljb250aW51ZQorICAgICAgZmkKKworICAgICAgcm1maWxlcz0iJGZpbGUiCisKKyAgICAgIGNhc2UgJG5hbWUgaW4KKyAgICAgICoubGEpCisJIyBQb3NzaWJseSBhIGxpYnRvb2wgYXJjaGl2ZSwgc28gdmVyaWZ5IGl0LgorCWlmIChzZWQgLWUgJzJxJyAkZmlsZSB8IGVncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgLiAkZGlyLyRuYW1lCisKKwkgICMgRGVsZXRlIHRoZSBsaWJ0b29sIGxpYnJhcmllcyBhbmQgc3ltbGlua3MuCisJICBmb3IgbiBpbiAkbGlicmFyeV9uYW1lczsgZG8KKwkgICAgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci8kbiIKKwkgIGRvbmUKKwkgIHRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci8kb2xkX2xpYnJhcnkiCisJICB0ZXN0ICRtb2RlID0gY2xlYW4gJiYgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci8kbmFtZSAkb2JqZGlyLyR7bmFtZX1pIgorCisJICBpZiB0ZXN0ICRtb2RlID0gdW5pbnN0YWxsOyB0aGVuCisJICAgIGlmIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIjsgdGhlbgorCSAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0dW5pbnN0YWxsIGNvbW1hbmRzLgorCSAgICAgIGV2YWwgY21kcz1cIiRwb3N0dW5pbnN0YWxsX2NtZHNcIgorCSAgICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JworCSAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCisJCUlGUz0iJHNhdmVfaWZzIgorCQkkc2hvdyAiJGNtZCIKKwkJJHJ1biBldmFsICIkY21kIgorCQlpZiB0ZXN0ICQ/ICE9IDAgJiYgdGVzdCAiJHJtZm9yY2UiICE9IHllczsgdGhlbgorCQkgIGV4aXRfc3RhdHVzPTEKKwkJZmkKKwkgICAgICBkb25lCisJICAgICAgSUZTPSIkc2F2ZV9pZnMiCisJICAgIGZpCisKKwkgICAgaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IjsgdGhlbgorCSAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBvbGRfcG9zdHVuaW5zdGFsbCBjb21tYW5kcy4KKwkgICAgICBldmFsIGNtZHM9XCIkb2xkX3Bvc3R1bmluc3RhbGxfY21kc1wiCisJICAgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KKwkJSUZTPSIkc2F2ZV9pZnMiCisJCSRzaG93ICIkY21kIgorCQkkcnVuIGV2YWwgIiRjbWQiCisJCWlmIHRlc3QgJD8gIT0gMCAmJiB0ZXN0ICIkcm1mb3JjZSIgIT0geWVzOyB0aGVuCisJCSAgZXhpdF9zdGF0dXM9MQorCQlmaQorCSAgICAgIGRvbmUKKwkgICAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgZmkKKwkgICAgIyBGSVhNRTogc2hvdWxkIHJlaW5zdGFsbCB0aGUgYmVzdCByZW1haW5pbmcgc2hhcmVkIGxpYnJhcnkuCisJICBmaQorCWZpCisJOzsKKworICAgICAgKi5sbykKKwlpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisJICBvbGRvYmo9YCRlY2hvICJYJG5hbWUiIHwgJFhzZWQgLWUgIiRsbzJvImAKKwkgIHJtZmlsZXM9IiRybWZpbGVzICRkaXIvJG9sZG9iaiIKKwlmaQorCTs7CisKKyAgICAgICopCisJIyBEbyBhIHRlc3QgdG8gc2VlIGlmIHRoaXMgaXMgYSBsaWJ0b29sIHByb2dyYW0uCisJaWYgdGVzdCAkbW9kZSA9IGNsZWFuICYmCisJICAgKHNlZCAtZSAnNHEnICRmaWxlIHwgZWdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICByZWxpbmtfY29tbWFuZD0KKwkgIC4gJGRpci8kZmlsZQorCisJICBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyLyRuYW1lICRvYmpkaXIvJHtuYW1lfVMuJHtvYmpleHR9IgorCSAgaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSB5ZXMgJiYgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIjsgdGhlbgorCSAgICBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyL2x0LSRuYW1lIgorCSAgZmkKKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgICAkc2hvdyAiJHJtICRybWZpbGVzIgorICAgICAgJHJ1biAkcm0gJHJtZmlsZXMgfHwgZXhpdF9zdGF0dXM9MQorICAgIGRvbmUKKworICAgICMgVHJ5IHRvIHJlbW92ZSB0aGUgJHtvYmpkaXJ9cyBpbiB0aGUgZGlyZWN0b3JpZXMgd2hlcmUgd2UgZGVsZXRlZCBmaWxlcworICAgIGZvciBkaXIgaW4gJHJtZGlyczsgZG8KKyAgICAgIGlmIHRlc3QgLWQgIiRkaXIiOyB0aGVuCisJJHNob3cgInJtZGlyICRkaXIiCisJJHJ1biBybWRpciAkZGlyID4vZGV2L251bGwgMj4mMQorICAgICAgZmkKKyAgICBkb25lCisKKyAgICBleGl0ICRleGl0X3N0YXR1cworICAgIDs7CisKKyAgIiIpCisgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIE1PREUiIDE+JjIKKyAgICAkZWNobyAiJGdlbmVyaWNfaGVscCIgMT4mMgorICAgIGV4aXQgMQorICAgIDs7CisgIGVzYWMKKworICBpZiB0ZXN0IC16ICIkZXhlY19jbWQiOyB0aGVuCisgICAgJGVjaG8gIiRtb2RlbmFtZTogaW52YWxpZCBvcGVyYXRpb24gbW9kZSBcYCRtb2RlJyIgMT4mMgorICAgICRlY2hvICIkZ2VuZXJpY19oZWxwIiAxPiYyCisgICAgZXhpdCAxCisgIGZpCitmaSAjIHRlc3QgLXogIiRzaG93X2hlbHAiCisKK2lmIHRlc3QgLW4gIiRleGVjX2NtZCI7IHRoZW4KKyAgZXZhbCBleGVjICRleGVjX2NtZAorICBleGl0IDEKK2ZpCisKKyMgV2UgbmVlZCB0byBkaXNwbGF5IGhlbHAgZm9yIGVhY2ggb2YgdGhlIG1vZGVzLgorY2FzZSAkbW9kZSBpbgorIiIpICRlY2hvIFwKKyJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIFtNT0RFLUFSR10uLi4KKworUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCisKKyAgICAtLWNvbmZpZyAgICAgICAgICBzaG93IGFsbCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcworICAgIC0tZGVidWcgICAgICAgICAgIGVuYWJsZSB2ZXJib3NlIHNoZWxsIHRyYWNpbmcKKy1uLCAtLWRyeS1ydW4gICAgICAgICBkaXNwbGF5IGNvbW1hbmRzIHdpdGhvdXQgbW9kaWZ5aW5nIGFueSBmaWxlcworICAgIC0tZmVhdHVyZXMgICAgICAgIGRpc3BsYXkgYmFzaWMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAorICAgIC0tZmluaXNoICAgICAgICAgIHNhbWUgYXMgXGAtLW1vZGU9ZmluaXNoJworICAgIC0taGVscCAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAtLW1vZGU9TU9ERSAgICAgICB1c2Ugb3BlcmF0aW9uIG1vZGUgTU9ERSBbZGVmYXVsdD1pbmZlcnJlZCBmcm9tIE1PREUtQVJHU10KKyAgICAtLXF1aWV0ICAgICAgICAgICBzYW1lIGFzIFxgLS1zaWxlbnQnCisgICAgLS1zaWxlbnQgICAgICAgICAgZG9uJ3QgcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcworICAgIC0tdmVyc2lvbiAgICAgICAgIHByaW50IHZlcnNpb24gaW5mb3JtYXRpb24KKworTU9ERSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCisgICAgICBjbGVhbiAgICAgICAgICAgcmVtb3ZlIGZpbGVzIGZyb20gdGhlIGJ1aWxkIGRpcmVjdG9yeQorICAgICAgY29tcGlsZSAgICAgICAgIGNvbXBpbGUgYSBzb3VyY2UgZmlsZSBpbnRvIGEgbGlidG9vbCBvYmplY3QKKyAgICAgIGV4ZWN1dGUgICAgICAgICBhdXRvbWF0aWNhbGx5IHNldCBsaWJyYXJ5IHBhdGgsIHRoZW4gcnVuIGEgcHJvZ3JhbQorICAgICAgZmluaXNoICAgICAgICAgIGNvbXBsZXRlIHRoZSBpbnN0YWxsYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMKKyAgICAgIGluc3RhbGwgICAgICAgICBpbnN0YWxsIGxpYnJhcmllcyBvciBleGVjdXRhYmxlcworICAgICAgbGluayAgICAgICAgICAgIGNyZWF0ZSBhIGxpYnJhcnkgb3IgYW4gZXhlY3V0YWJsZQorICAgICAgdW5pbnN0YWxsICAgICAgIHJlbW92ZSBsaWJyYXJpZXMgZnJvbSBhbiBpbnN0YWxsZWQgZGlyZWN0b3J5CisKK01PREUtQVJHUyB2YXJ5IGRlcGVuZGluZyBvbiB0aGUgTU9ERS4gIFRyeSBcYCRtb2RlbmFtZSAtLWhlbHAgLS1tb2RlPU1PREUnIGZvcgorYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIE1PREUuIgorICBleGl0IDAKKyAgOzsKKworY2xlYW4pCisgICRlY2hvIFwKKyJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1jbGVhbiBSTSBbUk0tT1BUSU9OXS4uLiBGSUxFLi4uCisKK1JlbW92ZSBmaWxlcyBmcm9tIHRoZSBidWlsZCBkaXJlY3RvcnkuCisKK1JNIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIHRvIHVzZSB0byBkZWxldGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggRklMRQorKHR5cGljYWxseSBcYC9iaW4vcm0nKS4gIFJNLU9QVElPTlMgYXJlIG9wdGlvbnMgKHN1Y2ggYXMgXGAtZicpIHRvIGJlIHBhc3NlZAordG8gUk0uCisKK0lmIEZJTEUgaXMgYSBsaWJ0b29sIGxpYnJhcnksIG9iamVjdCBvciBwcm9ncmFtLCBhbGwgdGhlIGZpbGVzIGFzc29jaWF0ZWQKK3dpdGggaXQgYXJlIGRlbGV0ZWQuIE90aGVyd2lzZSwgb25seSBGSUxFIGl0c2VsZiBpcyBkZWxldGVkIHVzaW5nIFJNLiIKKyAgOzsKKworY29tcGlsZSkKKyAgJGVjaG8gXAorIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWNvbXBpbGUgQ09NUElMRS1DT01NQU5ELi4uIFNPVVJDRUZJTEUKKworQ29tcGlsZSBhIHNvdXJjZSBmaWxlIGludG8gYSBsaWJ0b29sIGxpYnJhcnkgb2JqZWN0LgorCitUaGlzIG1vZGUgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgb3B0aW9uczoKKworICAtbyBPVVRQVVQtRklMRSAgICBzZXQgdGhlIG91dHB1dCBmaWxlIG5hbWUgdG8gT1VUUFVULUZJTEUKKyAgLXByZWZlci1waWMgICAgICAgdHJ5IHRvIGJ1aWxkaW5nIFBJQyBvYmplY3RzIG9ubHkKKyAgLXByZWZlci1ub24tcGljICAgdHJ5IHRvIGJ1aWxkaW5nIG5vbi1QSUMgb2JqZWN0cyBvbmx5CisgIC1zdGF0aWMgICAgICAgICAgIGFsd2F5cyBidWlsZCBhIFxgLm8nIGZpbGUgc3VpdGFibGUgZm9yIHN0YXRpYyBsaW5raW5nCisKK0NPTVBJTEUtQ09NTUFORCBpcyBhIGNvbW1hbmQgdG8gYmUgdXNlZCBpbiBjcmVhdGluZyBhIFxgc3RhbmRhcmQnIG9iamVjdCBmaWxlCitmcm9tIHRoZSBnaXZlbiBTT1VSQ0VGSUxFLgorCitUaGUgb3V0cHV0IGZpbGUgbmFtZSBpcyBkZXRlcm1pbmVkIGJ5IHJlbW92aW5nIHRoZSBkaXJlY3RvcnkgY29tcG9uZW50IGZyb20KK1NPVVJDRUZJTEUsIHRoZW4gc3Vic3RpdHV0aW5nIHRoZSBDIHNvdXJjZSBjb2RlIHN1ZmZpeCBcYC5jJyB3aXRoIHRoZQorbGlicmFyeSBvYmplY3Qgc3VmZml4LCBcYC5sbycuIgorICA7OworCitleGVjdXRlKQorICAkZWNobyBcCisiVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9ZXhlY3V0ZSBDT01NQU5EIFtBUkdTXS4uLgorCitBdXRvbWF0aWNhbGx5IHNldCBsaWJyYXJ5IHBhdGgsIHRoZW4gcnVuIGEgcHJvZ3JhbS4KKworVGhpcyBtb2RlIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG9wdGlvbnM6CisKKyAgLWRsb3BlbiBGSUxFICAgICAgYWRkIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBGSUxFIHRvIHRoZSBsaWJyYXJ5IHBhdGgKKworVGhpcyBtb2RlIHNldHMgdGhlIGxpYnJhcnkgcGF0aCBlbnZpcm9ubWVudCB2YXJpYWJsZSBhY2NvcmRpbmcgdG8gXGAtZGxvcGVuJworZmxhZ3MuCisKK0lmIGFueSBvZiB0aGUgQVJHUyBhcmUgbGlidG9vbCBleGVjdXRhYmxlIHdyYXBwZXJzLCB0aGVuIHRoZXkgYXJlIHRyYW5zbGF0ZWQKK2ludG8gdGhlaXIgY29ycmVzcG9uZGluZyB1bmluc3RhbGxlZCBiaW5hcnksIGFuZCBhbnkgb2YgdGhlaXIgcmVxdWlyZWQgbGlicmFyeQorZGlyZWN0b3JpZXMgYXJlIGFkZGVkIHRvIHRoZSBsaWJyYXJ5IHBhdGguCisKK1RoZW4sIENPTU1BTkQgaXMgZXhlY3V0ZWQsIHdpdGggQVJHUyBhcyBhcmd1bWVudHMuIgorICA7OworCitmaW5pc2gpCisgICRlY2hvIFwKKyJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1maW5pc2ggW0xJQkRJUl0uLi4KKworQ29tcGxldGUgdGhlIGluc3RhbGxhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcy4KKworRWFjaCBMSUJESVIgaXMgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBsaWJ0b29sIGxpYnJhcmllcy4KKworVGhlIGNvbW1hbmRzIHRoYXQgdGhpcyBtb2RlIGV4ZWN1dGVzIG1heSByZXF1aXJlIHN1cGVydXNlciBwcml2aWxlZ2VzLiAgVXNlCit0aGUgXGAtLWRyeS1ydW4nIG9wdGlvbiBpZiB5b3UganVzdCB3YW50IHRvIHNlZSB3aGF0IHdvdWxkIGJlIGV4ZWN1dGVkLiIKKyAgOzsKKworaW5zdGFsbCkKKyAgJGVjaG8gXAorIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWluc3RhbGwgSU5TVEFMTC1DT01NQU5ELi4uCisKK0luc3RhbGwgZXhlY3V0YWJsZXMgb3IgbGlicmFyaWVzLgorCitJTlNUQUxMLUNPTU1BTkQgaXMgdGhlIGluc3RhbGxhdGlvbiBjb21tYW5kLiAgVGhlIGZpcnN0IGNvbXBvbmVudCBzaG91bGQgYmUKK2VpdGhlciB0aGUgXGBpbnN0YWxsJyBvciBcYGNwJyBwcm9ncmFtLgorCitUaGUgcmVzdCBvZiB0aGUgY29tcG9uZW50cyBhcmUgaW50ZXJwcmV0ZWQgYXMgYXJndW1lbnRzIHRvIHRoYXQgY29tbWFuZCAob25seQorQlNELWNvbXBhdGlibGUgaW5zdGFsbCBvcHRpb25zIGFyZSByZWNvZ25pemVkKS4iCisgIDs7CisKK2xpbmspCisgICRlY2hvIFwKKyJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1saW5rIExJTkstQ09NTUFORC4uLgorCitMaW5rIG9iamVjdCBmaWxlcyBvciBsaWJyYXJpZXMgdG9nZXRoZXIgdG8gZm9ybSBhbm90aGVyIGxpYnJhcnksIG9yIHRvCitjcmVhdGUgYW4gZXhlY3V0YWJsZSBwcm9ncmFtLgorCitMSU5LLUNPTU1BTkQgaXMgYSBjb21tYW5kIHVzaW5nIHRoZSBDIGNvbXBpbGVyIHRoYXQgeW91IHdvdWxkIHVzZSB0byBjcmVhdGUKK2EgcHJvZ3JhbSBmcm9tIHNldmVyYWwgb2JqZWN0IGZpbGVzLgorCitUaGUgZm9sbG93aW5nIGNvbXBvbmVudHMgb2YgTElOSy1DT01NQU5EIGFyZSB0cmVhdGVkIHNwZWNpYWxseToKKworICAtYWxsLXN0YXRpYyAgICAgICBkbyBub3QgZG8gYW55IGR5bmFtaWMgbGlua2luZyBhdCBhbGwKKyAgLWF2b2lkLXZlcnNpb24gICAgZG8gbm90IGFkZCBhIHZlcnNpb24gc3VmZml4IGlmIHBvc3NpYmxlCisgIC1kbG9wZW4gRklMRSAgICAgIFxgLWRscHJlb3BlbicgRklMRSBpZiBpdCBjYW5ub3QgYmUgZGxvcGVuZWQgYXQgcnVudGltZQorICAtZGxwcmVvcGVuIEZJTEUgICBsaW5rIGluIEZJTEUgYW5kIGFkZCBpdHMgc3ltYm9scyB0byBsdF9wcmVsb2FkZWRfc3ltYm9scworICAtZXhwb3J0LWR5bmFtaWMgICBhbGxvdyBzeW1ib2xzIGZyb20gT1VUUFVULUZJTEUgdG8gYmUgcmVzb2x2ZWQgd2l0aCBkbHN5bSgzKQorICAtZXhwb3J0LXN5bWJvbHMgU1lNRklMRQorCQkgICAgdHJ5IHRvIGV4cG9ydCBvbmx5IHRoZSBzeW1ib2xzIGxpc3RlZCBpbiBTWU1GSUxFCisgIC1leHBvcnQtc3ltYm9scy1yZWdleCBSRUdFWAorCQkgICAgdHJ5IHRvIGV4cG9ydCBvbmx5IHRoZSBzeW1ib2xzIG1hdGNoaW5nIFJFR0VYCisgIC1MTElCRElSICAgICAgICAgIHNlYXJjaCBMSUJESVIgZm9yIHJlcXVpcmVkIGluc3RhbGxlZCBsaWJyYXJpZXMKKyAgLWxOQU1FICAgICAgICAgICAgT1VUUFVULUZJTEUgcmVxdWlyZXMgdGhlIGluc3RhbGxlZCBsaWJyYXJ5IGxpYk5BTUUKKyAgLW1vZHVsZSAgICAgICAgICAgYnVpbGQgYSBsaWJyYXJ5IHRoYXQgY2FuIGRsb3BlbmVkCisgIC1uby1mYXN0LWluc3RhbGwgIGRpc2FibGUgdGhlIGZhc3QtaW5zdGFsbCBtb2RlCisgIC1uby1pbnN0YWxsICAgICAgIGxpbmsgYSBub3QtaW5zdGFsbGFibGUgZXhlY3V0YWJsZQorICAtbm8tdW5kZWZpbmVkICAgICBkZWNsYXJlIHRoYXQgYSBsaWJyYXJ5IGRvZXMgbm90IHJlZmVyIHRvIGV4dGVybmFsIHN5bWJvbHMKKyAgLW8gT1VUUFVULUZJTEUgICAgY3JlYXRlIE9VVFBVVC1GSUxFIGZyb20gdGhlIHNwZWNpZmllZCBvYmplY3RzCisgIC1yZWxlYXNlIFJFTEVBU0UgIHNwZWNpZnkgcGFja2FnZSByZWxlYXNlIGluZm9ybWF0aW9uCisgIC1ycGF0aCBMSUJESVIgICAgIHRoZSBjcmVhdGVkIGxpYnJhcnkgd2lsbCBldmVudHVhbGx5IGJlIGluc3RhbGxlZCBpbiBMSUJESVIKKyAgLVJbIF1MSUJESVIgICAgICAgYWRkIExJQkRJUiB0byB0aGUgcnVudGltZSBwYXRoIG9mIHByb2dyYW1zIGFuZCBsaWJyYXJpZXMKKyAgLXN0YXRpYyAgICAgICAgICAgZG8gbm90IGRvIGFueSBkeW5hbWljIGxpbmtpbmcgb2YgbGlidG9vbCBsaWJyYXJpZXMKKyAgLXZlcnNpb24taW5mbyBDVVJSRU5UWzpSRVZJU0lPTls6QUdFXV0KKwkJICAgIHNwZWNpZnkgbGlicmFyeSB2ZXJzaW9uIGluZm8gW2VhY2ggdmFyaWFibGUgZGVmYXVsdHMgdG8gMF0KKworQWxsIG90aGVyIG9wdGlvbnMgKGFyZ3VtZW50cyBiZWdpbm5pbmcgd2l0aCBcYC0nKSBhcmUgaWdub3JlZC4KKworRXZlcnkgb3RoZXIgYXJndW1lbnQgaXMgdHJlYXRlZCBhcyBhIGZpbGVuYW1lLiAgRmlsZXMgZW5kaW5nIGluIFxgLmxhJyBhcmUKK3RyZWF0ZWQgYXMgdW5pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMsIG90aGVyIGZpbGVzIGFyZSBzdGFuZGFyZCBvciBsaWJyYXJ5CitvYmplY3QgZmlsZXMuCisKK0lmIHRoZSBPVVRQVVQtRklMRSBlbmRzIGluIFxgLmxhJywgdGhlbiBhIGxpYnRvb2wgbGlicmFyeSBpcyBjcmVhdGVkLAorb25seSBsaWJyYXJ5IG9iamVjdHMgKFxgLmxvJyBmaWxlcykgbWF5IGJlIHNwZWNpZmllZCwgYW5kIFxgLXJwYXRoJyBpcworcmVxdWlyZWQsIGV4Y2VwdCB3aGVuIGNyZWF0aW5nIGEgY29udmVuaWVuY2UgbGlicmFyeS4KKworSWYgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5hJyBvciBcYC5saWInLCB0aGVuIGEgc3RhbmRhcmQgbGlicmFyeSBpcyBjcmVhdGVkCit1c2luZyBcYGFyJyBhbmQgXGByYW5saWInLCBvciBvbiBXaW5kb3dzIHVzaW5nIFxgbGliJy4KKworSWYgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5sbycgb3IgXGAuJHtvYmpleHR9JywgdGhlbiBhIHJlbG9hZGFibGUgb2JqZWN0IGZpbGUKK2lzIGNyZWF0ZWQsIG90aGVyd2lzZSBhbiBleGVjdXRhYmxlIHByb2dyYW0gaXMgY3JlYXRlZC4iCisgIDs7CisKK3VuaW5zdGFsbCkKKyAgJGVjaG8gXAorIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPXVuaW5zdGFsbCBSTSBbUk0tT1BUSU9OXS4uLiBGSUxFLi4uCisKK1JlbW92ZSBsaWJyYXJpZXMgZnJvbSBhbiBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgorCitSTSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB0byB1c2UgdG8gZGVsZXRlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIEZJTEUKKyh0eXBpY2FsbHkgXGAvYmluL3JtJykuICBSTS1PUFRJT05TIGFyZSBvcHRpb25zIChzdWNoIGFzIFxgLWYnKSB0byBiZSBwYXNzZWQKK3RvIFJNLgorCitJZiBGSUxFIGlzIGEgbGlidG9vbCBsaWJyYXJ5LCBhbGwgdGhlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBpdCBhcmUgZGVsZXRlZC4KK090aGVyd2lzZSwgb25seSBGSUxFIGl0c2VsZiBpcyBkZWxldGVkIHVzaW5nIFJNLiIKKyAgOzsKKworKikKKyAgJGVjaG8gIiRtb2RlbmFtZTogaW52YWxpZCBvcGVyYXRpb24gbW9kZSBcYCRtb2RlJyIgMT4mMgorICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgZXhpdCAxCisgIDs7Citlc2FjCisKK2VjaG8KKyRlY2hvICJUcnkgXGAkbW9kZW5hbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBvdGhlciBtb2Rlcy4iCisKK2V4aXQgMAorCisjIExvY2FsIFZhcmlhYmxlczoKKyMgbW9kZTpzaGVsbC1zY3JpcHQKKyMgc2gtaW5kZW50YXRpb246MgorIyBFbmQ6CmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvbHRtYWluLnNoIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL2x0bWFpbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lODJlNDhhCi0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL2x0bWFpbi5zaApAQCAtMCwwICsxLDQ5OTkgQEAKKyMgbHRtYWluLnNoIC0gUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCisjIE5PVEU6IENoYW5naW5nIHRoaXMgZmlsZSB3aWxsIG5vdCBhZmZlY3QgYW55dGhpbmcgdW50aWwgeW91IHJlcnVuIGNvbmZpZ3VyZS4KKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxCisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBPcmlnaW5hbGx5IGJ5IEdvcmRvbiBNYXR6aWdrZWl0IDxnb3JkQGdudS5haS5taXQuZWR1PiwgMTk5NgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKKyMgQ2hlY2sgdGhhdCB3ZSBoYXZlIGEgd29ya2luZyAkZWNoby4KK2lmIHRlc3QgIlgkMSIgPSBYLS1uby1yZWV4ZWM7IHRoZW4KKyAgIyBEaXNjYXJkIHRoZSAtLW5vLXJlZXhlYyBmbGFnLCBhbmQgY29udGludWUuCisgIHNoaWZ0CitlbGlmIHRlc3QgIlgkMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCisgICMgQXZvaWQgaW5saW5lIGRvY3VtZW50IGhlcmUsIGl0IG1heSBiZSBsZWZ0IG92ZXIKKyAgOgorZWxpZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCc7IHRoZW4KKyAgIyBZaXBwZWUsICRlY2hvIHdvcmtzIQorICA6CitlbHNlCisgICMgUmVzdGFydCB1bmRlciB0aGUgY29ycmVjdCBzaGVsbCwgYW5kIHRoZW4gbWF5YmUgJGVjaG8gd2lsbCB3b3JrLgorICBleGVjICRTSEVMTCAiJDAiIC0tbm8tcmVleGVjICR7MSsiJEAifQorZmkKKworaWYgdGVzdCAiWCQxIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KKyAgIyB1c2VkIGFzIGZhbGxiYWNrIGVjaG8KKyAgc2hpZnQKKyAgY2F0IDw8RU9GCiskKgorRU9GCisgIGV4aXQgMAorZmkKKworIyBUaGUgbmFtZSBvZiB0aGlzIHByb2dyYW0uCitwcm9nbmFtZT1gJGVjaG8gIiQwIiB8IHNlZCAncyVeLiovJSUnYAorbW9kZW5hbWU9IiRwcm9nbmFtZSIKKworIyBDb25zdGFudHMuCitQUk9HUkFNPWx0bWFpbi5zaAorUEFDS0FHRT1saWJ0b29sCitWRVJTSU9OPTEuNC4yCitUSU1FU1RBTVA9IiAoMS45MjIuMi41MyAyMDAxLzA5LzExIDAzOjE4OjUyKSIKKworZGVmYXVsdF9tb2RlPQoraGVscD0iVHJ5IFxgJHByb2duYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorbWFnaWM9IiUlJU1BR0lDIHZhcmlhYmxlJSUlIgorbWtkaXI9Im1rZGlyIgorbXY9Im12IC1mIgorcm09InJtIC1mIgorCisjIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCisjIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgorWHNlZD0nc2VkIC1lIDFzL15YLy8nCitzZWRfcXVvdGVfc3Vic3Q9J3MvXChbXFxgXFwiJFxcXFxdXCkvXFxcMS9nJworU1AyTkw9J3RyIFwwNDAgXDAxMicKK05MMlNQPSd0ciBcMDE1XDAxMiBcMDQwXDA0MCcKKworIyBOTFMgbnVpc2FuY2VzLgorIyBPbmx5IHNldCBMQU5HIGFuZCBMQ19BTEwgdG8gQyBpZiBhbHJlYWR5IHNldC4KKyMgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseSBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kCisjIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCisjIFdlIHNhdmUgdGhlIG9sZCB2YWx1ZXMgdG8gcmVzdG9yZSBkdXJpbmcgZXhlY3V0ZSBtb2RlLgoraWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgc2F2ZV9MQ19BTEw9IiRMQ19BTEwiOyBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTAorZmkKK2lmIHRlc3QgIiR7TEFORytzZXR9IiA9IHNldDsgdGhlbgorICBzYXZlX0xBTkc9IiRMQU5HIjsgTEFORz1DOyBleHBvcnQgTEFORworZmkKKworIyBNYWtlIHN1cmUgSUZTIGhhcyBhIHNlbnNpYmxlIGRlZmF1bHQKKzogJHtJRlM9IiAJIn0KKworaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzICYmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgIT0geWVzOyB0aGVuCisgIGVjaG8gIiRtb2RlbmFtZTogbm90IGNvbmZpZ3VyZWQgdG8gYnVpbGQgYW55IGtpbmQgb2YgbGlicmFyeSIgMT4mMgorICBlY2hvICJGYXRhbCBjb25maWd1cmF0aW9uIGVycm9yLiAgU2VlIHRoZSAkUEFDS0FHRSBkb2NzIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgMT4mMgorICBleGl0IDEKK2ZpCisKKyMgR2xvYmFsIHZhcmlhYmxlcy4KK21vZGU9JGRlZmF1bHRfbW9kZQorbm9ub3B0PQorcHJldj0KK3ByZXZvcHQ9CitydW49CitzaG93PSIkZWNobyIKK3Nob3dfaGVscD0KK2V4ZWN1dGVfZGxmaWxlcz0KK2xvMm89InMvXFwubG9cJC8uJHtvYmpleHR9LyIKK28ybG89InMvXFwuJHtvYmpleHR9XCQvLmxvLyIKKworIyBQYXJzZSBvdXIgY29tbWFuZCBsaW5lIG9wdGlvbnMgb25jZSwgdGhvcm91Z2hseS4KK3doaWxlIHRlc3QgJCMgLWd0IDAKK2RvCisgIGFyZz0iJDEiCisgIHNoaWZ0CisKKyAgY2FzZSAkYXJnIGluCisgIC0qPSopIG9wdGFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKKyAgKikgb3B0YXJnPSA7OworICBlc2FjCisKKyAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgorICAgIGNhc2UgJHByZXYgaW4KKyAgICBleGVjdXRlX2RsZmlsZXMpCisgICAgICBleGVjdXRlX2RsZmlsZXM9IiRleGVjdXRlX2RsZmlsZXMgJGFyZyIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGV2YWwgIiRwcmV2PVwkYXJnIgorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBwcmV2PQorICAgIHByZXZvcHQ9CisgICAgY29udGludWUKKyAgZmkKKworICAjIEhhdmUgd2Ugc2VlbiBhIG5vbi1vcHRpb25hbCBhcmd1bWVudCB5ZXQ/CisgIGNhc2UgJGFyZyBpbgorICAtLWhlbHApCisgICAgc2hvd19oZWxwPXllcworICAgIDs7CisKKyAgLS12ZXJzaW9uKQorICAgIGVjaG8gIiRQUk9HUkFNIChHTlUgJFBBQ0tBR0UpICRWRVJTSU9OJFRJTUVTVEFNUCIKKyAgICBleGl0IDAKKyAgICA7OworCisgIC0tY29uZmlnKQorICAgIHNlZCAtZSAnMSwvXiMgIyMjIEJFR0lOIExJQlRPT0wgQ09ORklHL2QnIC1lICcvXiMgIyMjIEVORCBMSUJUT09MIENPTkZJRy8sJGQnICQwCisgICAgZXhpdCAwCisgICAgOzsKKworICAtLWRlYnVnKQorICAgIGVjaG8gIiRwcm9nbmFtZTogZW5hYmxpbmcgc2hlbGwgdHJhY2UgbW9kZSIKKyAgICBzZXQgLXgKKyAgICA7OworCisgIC0tZHJ5LXJ1biB8IC1uKQorICAgIHJ1bj06CisgICAgOzsKKworICAtLWZlYXR1cmVzKQorICAgIGVjaG8gImhvc3Q6ICRob3N0IgorICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisgICAgICBlY2hvICJlbmFibGUgc2hhcmVkIGxpYnJhcmllcyIKKyAgICBlbHNlCisgICAgICBlY2hvICJkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMiCisgICAgZmkKKyAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisgICAgICBlY2hvICJlbmFibGUgc3RhdGljIGxpYnJhcmllcyIKKyAgICBlbHNlCisgICAgICBlY2hvICJkaXNhYmxlIHN0YXRpYyBsaWJyYXJpZXMiCisgICAgZmkKKyAgICBleGl0IDAKKyAgICA7OworCisgIC0tZmluaXNoKSBtb2RlPSJmaW5pc2giIDs7CisKKyAgLS1tb2RlKSBwcmV2b3B0PSItLW1vZGUiIHByZXY9bW9kZSA7OworICAtLW1vZGU9KikgbW9kZT0iJG9wdGFyZyIgOzsKKworICAtLXF1aWV0IHwgLS1zaWxlbnQpCisgICAgc2hvdz06CisgICAgOzsKKworICAtZGxvcGVuKQorICAgIHByZXZvcHQ9Ii1kbG9wZW4iCisgICAgcHJldj1leGVjdXRlX2RsZmlsZXMKKyAgICA7OworCisgIC0qKQorICAgICRlY2hvICIkbW9kZW5hbWU6IHVucmVjb2duaXplZCBvcHRpb24gXGAkYXJnJyIgMT4mMgorICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgIGV4aXQgMQorICAgIDs7CisKKyAgKikKKyAgICBub25vcHQ9IiRhcmciCisgICAgYnJlYWsKKyAgICA7OworICBlc2FjCitkb25lCisKK2lmIHRlc3QgLW4gIiRwcmV2b3B0IjsgdGhlbgorICAkZWNobyAiJG1vZGVuYW1lOiBvcHRpb24gXGAkcHJldm9wdCcgcmVxdWlyZXMgYW4gYXJndW1lbnQiIDE+JjIKKyAgJGVjaG8gIiRoZWxwIiAxPiYyCisgIGV4aXQgMQorZmkKKworIyBJZiB0aGlzIHZhcmlhYmxlIGlzIHNldCBpbiBhbnkgb2YgdGhlIGFjdGlvbnMsIHRoZSBjb21tYW5kIGluIGl0CisjIHdpbGwgYmUgZXhlY2VkIGF0IHRoZSBlbmQuICBUaGlzIHByZXZlbnRzIGhlcmUtZG9jdW1lbnRzIGZyb20gYmVpbmcKKyMgbGVmdCBvdmVyIGJ5IHNoZWxscy4KK2V4ZWNfY21kPQorCitpZiB0ZXN0IC16ICIkc2hvd19oZWxwIjsgdGhlbgorCisgICMgSW5mZXIgdGhlIG9wZXJhdGlvbiBtb2RlLgorICBpZiB0ZXN0IC16ICIkbW9kZSI7IHRoZW4KKyAgICBjYXNlICRub25vcHQgaW4KKyAgICAqY2MgfCAqKysgfCBnY2MqIHwgKi1nY2MqKQorICAgICAgbW9kZT1saW5rCisgICAgICBmb3IgYXJnCisgICAgICBkbworCWNhc2UgJGFyZyBpbgorCS1jKQorCSAgIG1vZGU9Y29tcGlsZQorCSAgIGJyZWFrCisJICAgOzsKKwllc2FjCisgICAgICBkb25lCisgICAgICA7OworICAgICpkYiB8ICpkYnggfCAqc3RyYWNlIHwgKnRydXNzKQorICAgICAgbW9kZT1leGVjdXRlCisgICAgICA7OworICAgICppbnN0YWxsKnxjcHxtdikKKyAgICAgIG1vZGU9aW5zdGFsbAorICAgICAgOzsKKyAgICAqcm0pCisgICAgICBtb2RlPXVuaW5zdGFsbAorICAgICAgOzsKKyAgICAqKQorICAgICAgIyBJZiB3ZSBoYXZlIG5vIG1vZGUsIGJ1dCBkbGZpbGVzIHdlcmUgc3BlY2lmaWVkLCB0aGVuIGRvIGV4ZWN1dGUgbW9kZS4KKyAgICAgIHRlc3QgLW4gIiRleGVjdXRlX2RsZmlsZXMiICYmIG1vZGU9ZXhlY3V0ZQorCisgICAgICAjIEp1c3QgdXNlIHRoZSBkZWZhdWx0IG9wZXJhdGlvbiBtb2RlLgorICAgICAgaWYgdGVzdCAteiAiJG1vZGUiOyB0aGVuCisJaWYgdGVzdCAtbiAiJG5vbm9wdCI7IHRoZW4KKwkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCBpbmZlciBvcGVyYXRpb24gbW9kZSBmcm9tIFxgJG5vbm9wdCciIDE+JjIKKwllbHNlCisJICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgaW5mZXIgb3BlcmF0aW9uIG1vZGUgd2l0aG91dCBNT0RFLUFSR1MiIDE+JjIKKwlmaQorICAgICAgZmkKKyAgICAgIDs7CisgICAgZXNhYworICBmaQorCisgICMgT25seSBleGVjdXRlIG1vZGUgaXMgYWxsb3dlZCB0byBoYXZlIC1kbG9wZW4gZmxhZ3MuCisgIGlmIHRlc3QgLW4gIiRleGVjdXRlX2RsZmlsZXMiICYmIHRlc3QgIiRtb2RlIiAhPSBleGVjdXRlOyB0aGVuCisgICAgJGVjaG8gIiRtb2RlbmFtZTogdW5yZWNvZ25pemVkIG9wdGlvbiBcYC1kbG9wZW4nIiAxPiYyCisgICAgJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgZXhpdCAxCisgIGZpCisKKyAgIyBDaGFuZ2UgdGhlIGhlbHAgbWVzc2FnZSB0byBhIG1vZGUtc3BlY2lmaWMgb25lLgorICBnZW5lcmljX2hlbHA9IiRoZWxwIgorICBoZWxwPSJUcnkgXGAkbW9kZW5hbWUgLS1oZWxwIC0tbW9kZT0kbW9kZScgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorCisgICMgVGhlc2UgbW9kZXMgYXJlIGluIG9yZGVyIG9mIGV4ZWN1dGlvbiBmcmVxdWVuY3kgc28gdGhhdCB0aGV5IHJ1biBxdWlja2x5LgorICBjYXNlICRtb2RlIGluCisgICMgbGlidG9vbCBjb21waWxlIG1vZGUKKyAgY29tcGlsZSkKKyAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBjb21waWxlIgorICAgICMgR2V0IHRoZSBjb21waWxhdGlvbiBjb21tYW5kIGFuZCB0aGUgc291cmNlIGZpbGUuCisgICAgYmFzZV9jb21waWxlPQorICAgIHByZXY9CisgICAgbGFzdGFyZz0KKyAgICBzcmNmaWxlPSIkbm9ub3B0IgorICAgIHN1cHByZXNzX291dHB1dD0KKworICAgIHVzZXJfdGFyZ2V0PW5vCisgICAgZm9yIGFyZworICAgIGRvCisgICAgICBjYXNlICRwcmV2IGluCisgICAgICAiIikgOzsKKyAgICAgIHhjb21waWxlcikKKwkjIEFlc3RoZXRpY2FsbHkgcXVvdGUgdGhlIHByZXZpb3VzIGFyZ3VtZW50LgorCXByZXY9CisJbGFzdGFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKworCWNhc2UgJGFyZyBpbgorCSMgRG91YmxlLXF1b3RlIGFyZ3MgY29udGFpbmluZyBvdGhlciBzaGVsbCBtZXRhY2hhcmFjdGVycy4KKwkjIE1hbnkgQm91cm5lIHNoZWxscyBjYW5ub3QgaGFuZGxlIGNsb3NlIGJyYWNrZXRzIGNvcnJlY3RseQorCSMgaW4gc2NhbiBzZXRzLCBzbyB3ZSBzcGVjaWZ5IGl0IHNlcGFyYXRlbHkuCisJKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCisJICBhcmc9IlwiJGFyZ1wiIgorCSAgOzsKKwllc2FjCisKKwkjIEFkZCB0aGUgcHJldmlvdXMgYXJndW1lbnQgdG8gYmFzZV9jb21waWxlLgorCWlmIHRlc3QgLXogIiRiYXNlX2NvbXBpbGUiOyB0aGVuCisJICBiYXNlX2NvbXBpbGU9IiRsYXN0YXJnIgorCWVsc2UKKwkgIGJhc2VfY29tcGlsZT0iJGJhc2VfY29tcGlsZSAkbGFzdGFyZyIKKwlmaQorCWNvbnRpbnVlCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgIyBBY2NlcHQgYW55IGNvbW1hbmQtbGluZSBvcHRpb25zLgorICAgICAgY2FzZSAkYXJnIGluCisgICAgICAtbykKKwlpZiB0ZXN0ICIkdXNlcl90YXJnZXQiICE9ICJubyI7IHRoZW4KKwkgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBjYW5ub3Qgc3BlY2lmeSBcYC1vJyBtb3JlIHRoYW4gb25jZSIgMT4mMgorCSAgZXhpdCAxCisJZmkKKwl1c2VyX3RhcmdldD1uZXh0CisJOzsKKworICAgICAgLXN0YXRpYykKKwlidWlsZF9vbGRfbGlicz15ZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1wcmVmZXItcGljKQorCXBpY19tb2RlPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLXByZWZlci1ub24tcGljKQorCXBpY19tb2RlPW5vCisJY29udGludWUKKwk7OworCisgICAgICAtWGNvbXBpbGVyKQorCXByZXY9eGNvbXBpbGVyCisJY29udGludWUKKwk7OworCisgICAgICAtV2MsKikKKwlhcmdzPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgInMvXi1XYywvLyJgCisJbGFzdGFyZz0KKwlzYXZlX2lmcz0iJElGUyI7IElGUz0nLCcKKwlmb3IgYXJnIGluICRhcmdzOyBkbworCSAgSUZTPSIkc2F2ZV9pZnMiCisKKwkgICMgRG91YmxlLXF1b3RlIGFyZ3MgY29udGFpbmluZyBvdGhlciBzaGVsbCBtZXRhY2hhcmFjdGVycy4KKwkgICMgTWFueSBCb3VybmUgc2hlbGxzIGNhbm5vdCBoYW5kbGUgY2xvc2UgYnJhY2tldHMgY29ycmVjdGx5CisJICAjIGluIHNjYW4gc2V0cywgc28gd2Ugc3BlY2lmeSBpdCBzZXBhcmF0ZWx5LgorCSAgY2FzZSAkYXJnIGluCisJICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorCSAgICBhcmc9IlwiJGFyZ1wiIgorCSAgICA7OworCSAgZXNhYworCSAgbGFzdGFyZz0iJGxhc3RhcmcgJGFyZyIKKwlkb25lCisJSUZTPSIkc2F2ZV9pZnMiCisJbGFzdGFyZz1gJGVjaG8gIlgkbGFzdGFyZyIgfCAkWHNlZCAtZSAicy9eIC8vImAKKworCSMgQWRkIHRoZSBhcmd1bWVudHMgdG8gYmFzZV9jb21waWxlLgorCWlmIHRlc3QgLXogIiRiYXNlX2NvbXBpbGUiOyB0aGVuCisJICBiYXNlX2NvbXBpbGU9IiRsYXN0YXJnIgorCWVsc2UKKwkgIGJhc2VfY29tcGlsZT0iJGJhc2VfY29tcGlsZSAkbGFzdGFyZyIKKwlmaQorCWNvbnRpbnVlCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgY2FzZSAkdXNlcl90YXJnZXQgaW4KKyAgICAgIG5leHQpCisJIyBUaGUgbmV4dCBvbmUgaXMgdGhlIC1vIHRhcmdldCBuYW1lCisJdXNlcl90YXJnZXQ9eWVzCisJY29udGludWUKKwk7OworICAgICAgeWVzKQorCSMgV2UgZ290IHRoZSBvdXRwdXQgZmlsZQorCXVzZXJfdGFyZ2V0PXNldAorCWxpYm9iaj0iJGFyZyIKKwljb250aW51ZQorCTs7CisgICAgICBlc2FjCisKKyAgICAgICMgQWNjZXB0IHRoZSBjdXJyZW50IGFyZ3VtZW50IGFzIHRoZSBzb3VyY2UgZmlsZS4KKyAgICAgIGxhc3Rhcmc9IiRzcmNmaWxlIgorICAgICAgc3JjZmlsZT0iJGFyZyIKKworICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIHRoZSBwcmV2aW91cyBhcmd1bWVudC4KKworICAgICAgIyBCYWNrc2xhc2hpZnkgYW55IGJhY2tzbGFzaGVzLCBkb3VibGUgcXVvdGVzLCBhbmQgZG9sbGFyIHNpZ25zLgorICAgICAgIyBUaGVzZSBhcmUgdGhlIG9ubHkgY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBzcGVjaWFsbHkKKyAgICAgICMgaW50ZXJwcmV0ZWQgaW5zaWRlIG9mIGRvdWJsZS1xdW90ZWQgc2NyaW5ncy4KKyAgICAgIGxhc3Rhcmc9YCRlY2hvICJYJGxhc3RhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorCisgICAgICAjIERvdWJsZS1xdW90ZSBhcmdzIGNvbnRhaW5pbmcgb3RoZXIgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCisgICAgICAjIE1hbnkgQm91cm5lIHNoZWxscyBjYW5ub3QgaGFuZGxlIGNsb3NlIGJyYWNrZXRzIGNvcnJlY3RseQorICAgICAgIyBpbiBzY2FuIHNldHMsIHNvIHdlIHNwZWNpZnkgaXQgc2VwYXJhdGVseS4KKyAgICAgIGNhc2UgJGxhc3RhcmcgaW4KKyAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorCWxhc3Rhcmc9IlwiJGxhc3RhcmdcIiIKKwk7OworICAgICAgZXNhYworCisgICAgICAjIEFkZCB0aGUgcHJldmlvdXMgYXJndW1lbnQgdG8gYmFzZV9jb21waWxlLgorICAgICAgaWYgdGVzdCAteiAiJGJhc2VfY29tcGlsZSI7IHRoZW4KKwliYXNlX2NvbXBpbGU9IiRsYXN0YXJnIgorICAgICAgZWxzZQorCWJhc2VfY29tcGlsZT0iJGJhc2VfY29tcGlsZSAkbGFzdGFyZyIKKyAgICAgIGZpCisgICAgZG9uZQorCisgICAgY2FzZSAkdXNlcl90YXJnZXQgaW4KKyAgICBzZXQpCisgICAgICA7OworICAgIG5vKQorICAgICAgIyBHZXQgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgb2JqZWN0LgorICAgICAgbGlib2JqPWAkZWNobyAiWCRzcmNmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisgICAgICA7OworICAgICopCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgdGFyZ2V0IHdpdGggXGAtbyciIDE+JjIKKyAgICAgIGV4aXQgMQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIFJlY29nbml6ZSBzZXZlcmFsIGRpZmZlcmVudCBmaWxlIHN1ZmZpeGVzLgorICAgICMgSWYgdGhlIHVzZXIgc3BlY2lmaWVzIC1vIGZpbGUubywgaXQgaXMgcmVwbGFjZWQgd2l0aCBmaWxlLmxvCisgICAgeGZvcm09J1tjQ0ZTZm1zb10nCisgICAgY2FzZSAkbGlib2JqIGluCisgICAgKi5hZGEpIHhmb3JtPWFkYSA7OworICAgICouYWRiKSB4Zm9ybT1hZGIgOzsKKyAgICAqLmFkcykgeGZvcm09YWRzIDs7CisgICAgKi5hc20pIHhmb3JtPWFzbSA7OworICAgICouYysrKSB4Zm9ybT1jKysgOzsKKyAgICAqLmNjKSB4Zm9ybT1jYyA7OworICAgICouY3BwKSB4Zm9ybT1jcHAgOzsKKyAgICAqLmN4eCkgeGZvcm09Y3h4IDs7CisgICAgKi5mOTApIHhmb3JtPWY5MCA7OworICAgICouZm9yKSB4Zm9ybT1mb3IgOzsKKyAgICBlc2FjCisKKyAgICBsaWJvYmo9YCRlY2hvICJYJGxpYm9iaiIgfCAkWHNlZCAtZSAicy9cLiR4Zm9ybSQvLmxvLyJgCisKKyAgICBjYXNlICRsaWJvYmogaW4KKyAgICAqLmxvKSBvYmo9YCRlY2hvICJYJGxpYm9iaiIgfCAkWHNlZCAtZSAiJGxvMm8iYCA7OworICAgICopCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZGV0ZXJtaW5lIG5hbWUgb2YgbGlicmFyeSBvYmplY3QgZnJvbSBcYCRsaWJvYmonIiAxPiYyCisgICAgICBleGl0IDEKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgaWYgdGVzdCAteiAiJGJhc2VfY29tcGlsZSI7IHRoZW4KKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBjb21waWxhdGlvbiBjb21tYW5kIiAxPiYyCisgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICAjIERlbGV0ZSBhbnkgbGVmdG92ZXIgbGlicmFyeSBvYmplY3RzLgorICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgIHJlbW92ZWxpc3Q9IiRvYmogJGxpYm9iaiIKKyAgICBlbHNlCisgICAgICByZW1vdmVsaXN0PSIkbGlib2JqIgorICAgIGZpCisKKyAgICAkcnVuICRybSAkcmVtb3ZlbGlzdAorICAgIHRyYXAgIiRydW4gJHJtICRyZW1vdmVsaXN0OyBleGl0IDEiIDEgMiAxNQorCisgICAgIyBPbiBDeWd3aW4gdGhlcmUncyBubyAicmVhbCIgUElDIGZsYWcgc28gd2UgbXVzdCBidWlsZCBib3RoIG9iamVjdCB0eXBlcworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBvczIqKQorICAgICAgcGljX21vZGU9ZGVmYXVsdAorICAgICAgOzsKKyAgICBlc2FjCisgICAgaWYgdGVzdCAkcGljX21vZGUgPSBubyAmJiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCisgICAgICAjIG5vbi1QSUMgY29kZSBpbiBzaGFyZWQgbGlicmFyaWVzIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgIHBpY19tb2RlPWRlZmF1bHQKKyAgICBmaQorCisgICAgIyBDYWxjdWxhdGUgdGhlIGZpbGVuYW1lIG9mIHRoZSBvdXRwdXQgb2JqZWN0IGlmIGNvbXBpbGVyIGRvZXMKKyAgICAjIG5vdCBzdXBwb3J0IC1vIHdpdGggLWMKKyAgICBpZiB0ZXN0ICIkY29tcGlsZXJfY19vIiA9IG5vOyB0aGVuCisgICAgICBvdXRwdXRfb2JqPWAkZWNobyAiWCRzcmNmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJScgLWUgJ3MlXC5bXi5dKiQlJSdgLiR7b2JqZXh0fQorICAgICAgbG9ja2ZpbGU9IiRvdXRwdXRfb2JqLmxvY2siCisgICAgICByZW1vdmVsaXN0PSIkcmVtb3ZlbGlzdCAkb3V0cHV0X29iaiAkbG9ja2ZpbGUiCisgICAgICB0cmFwICIkcnVuICRybSAkcmVtb3ZlbGlzdDsgZXhpdCAxIiAxIDIgMTUKKyAgICBlbHNlCisgICAgICBuZWVkX2xvY2tzPW5vCisgICAgICBsb2NrZmlsZT0KKyAgICBmaQorCisgICAgIyBMb2NrIHRoaXMgY3JpdGljYWwgc2VjdGlvbiBpZiBpdCBpcyBuZWVkZWQKKyAgICAjIFdlIHVzZSB0aGlzIHNjcmlwdCBmaWxlIHRvIG1ha2UgdGhlIGxpbmssIGl0IGF2b2lkcyBjcmVhdGluZyBhIG5ldyBmaWxlCisgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0geWVzOyB0aGVuCisgICAgICB1bnRpbCAkcnVuIGxuICIkMCIgIiRsb2NrZmlsZSIgMj4vZGV2L251bGw7IGRvCisJJHNob3cgIldhaXRpbmcgZm9yICRsb2NrZmlsZSB0byBiZSByZW1vdmVkIgorCXNsZWVwIDIKKyAgICAgIGRvbmUKKyAgICBlbGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHdhcm47IHRoZW4KKyAgICAgIGlmIHRlc3QgLWYgIiRsb2NrZmlsZSI7IHRoZW4KKwllY2hvICJcCisqKiogRVJST1IsICRsb2NrZmlsZSBleGlzdHMgYW5kIGNvbnRhaW5zOgorYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgCisKK1RoaXMgaW5kaWNhdGVzIHRoYXQgYW5vdGhlciBwcm9jZXNzIGlzIHRyeWluZyB0byB1c2UgdGhlIHNhbWUKK3RlbXBvcmFyeSBvYmplY3QgZmlsZSwgYW5kIGxpYnRvb2wgY291bGQgbm90IHdvcmsgYXJvdW5kIGl0IGJlY2F1c2UKK3lvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBcYC1jJyBhbmQgXGAtbycgdG9nZXRoZXIuICBJZiB5b3UKK3JlcGVhdCB0aGlzIGNvbXBpbGF0aW9uLCBpdCBtYXkgc3VjY2VlZCwgYnkgY2hhbmNlLCBidXQgeW91IGhhZCBiZXR0ZXIKK2F2b2lkIHBhcmFsbGVsIGJ1aWxkcyAobWFrZSAtaikgaW4gdGhpcyBwbGF0Zm9ybSwgb3IgZ2V0IGEgYmV0dGVyCitjb21waWxlci4iCisKKwkkcnVuICRybSAkcmVtb3ZlbGlzdAorCWV4aXQgMQorICAgICAgZmkKKyAgICAgIGVjaG8gJHNyY2ZpbGUgPiAiJGxvY2tmaWxlIgorICAgIGZpCisKKyAgICBpZiB0ZXN0IC1uICIkZml4X3NyY2ZpbGVfcGF0aCI7IHRoZW4KKyAgICAgIGV2YWwgc3JjZmlsZT1cIiRmaXhfc3JjZmlsZV9wYXRoXCIKKyAgICBmaQorCisgICAgIyBPbmx5IGJ1aWxkIGEgUElDIG9iamVjdCBpZiB3ZSBhcmUgYnVpbGRpbmcgbGlidG9vbCBsaWJyYXJpZXMuCisgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgICMgV2l0aG91dCB0aGlzIGFzc2lnbm1lbnQsIGJhc2VfY29tcGlsZSBnZXRzIGVtcHRpZWQuCisgICAgICBmYnNkX2hpZGVvdXNfc2hfYnVnPSRiYXNlX2NvbXBpbGUKKworICAgICAgaWYgdGVzdCAiJHBpY19tb2RlIiAhPSBubzsgdGhlbgorCSMgQWxsIHBsYXRmb3JtcyB1c2UgLURQSUMsIHRvIG5vdGlmeSBwcmVwcm9jZXNzZWQgYXNzZW1ibGVyIGNvZGUuCisJY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkc3JjZmlsZSAkcGljX2ZsYWcgLURQSUMiCisgICAgICBlbHNlCisJIyBEb24ndCBidWlsZCBQSUMgY29kZQorCWNvbW1hbmQ9IiRiYXNlX2NvbXBpbGUgJHNyY2ZpbGUiCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorCWxvX2xpYm9iaj0iJGxpYm9iaiIKKwlkaXI9YCRlY2hvICJYJGxpYm9iaiIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAorCWlmIHRlc3QgIlgkZGlyIiA9ICJYJGxpYm9iaiI7IHRoZW4KKwkgIGRpcj0iJG9iamRpciIKKwllbHNlCisJICBkaXI9IiRkaXIvJG9iamRpciIKKwlmaQorCWxpYm9iaj0iJGRpci8iYCRlY2hvICJYJGxpYm9iaiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCisJaWYgdGVzdCAtZCAiJGRpciI7IHRoZW4KKwkgICRzaG93ICIkcm0gJGxpYm9iaiIKKwkgICRydW4gJHJtICRsaWJvYmoKKwllbHNlCisJICAkc2hvdyAiJG1rZGlyICRkaXIiCisJICAkcnVuICRta2RpciAkZGlyCisJICBzdGF0dXM9JD8KKwkgIGlmIHRlc3QgJHN0YXR1cyAtbmUgMCAmJiB0ZXN0ICEgLWQgJGRpcjsgdGhlbgorCSAgICBleGl0ICRzdGF0dXMKKwkgIGZpCisJZmkKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkY29tcGlsZXJfb19sbyIgPSB5ZXM7IHRoZW4KKwlvdXRwdXRfb2JqPSIkbGlib2JqIgorCWNvbW1hbmQ9IiRjb21tYW5kIC1vICRvdXRwdXRfb2JqIgorICAgICAgZWxpZiB0ZXN0ICIkY29tcGlsZXJfY19vIiA9IHllczsgdGhlbgorCW91dHB1dF9vYmo9IiRvYmoiCisJY29tbWFuZD0iJGNvbW1hbmQgLW8gJG91dHB1dF9vYmoiCisgICAgICBmaQorCisgICAgICAkcnVuICRybSAiJG91dHB1dF9vYmoiCisgICAgICAkc2hvdyAiJGNvbW1hbmQiCisgICAgICBpZiAkcnVuIGV2YWwgIiRjb21tYW5kIjsgdGhlbiA6CisgICAgICBlbHNlCisJdGVzdCAtbiAiJG91dHB1dF9vYmoiICYmICRydW4gJHJtICRyZW1vdmVsaXN0CisJZXhpdCAxCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB3YXJuICYmCisJIHRlc3QgeCJgY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAiICE9IHgiJHNyY2ZpbGUiOyB0aGVuCisJZWNobyAiXAorKioqIEVSUk9SLCAkbG9ja2ZpbGUgY29udGFpbnM6CitgY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAKKworYnV0IGl0IHNob3VsZCBjb250YWluOgorJHNyY2ZpbGUKKworVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbm90aGVyIHByb2Nlc3MgaXMgdHJ5aW5nIHRvIHVzZSB0aGUgc2FtZQordGVtcG9yYXJ5IG9iamVjdCBmaWxlLCBhbmQgbGlidG9vbCBjb3VsZCBub3Qgd29yayBhcm91bmQgaXQgYmVjYXVzZQoreW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IFxgLWMnIGFuZCBcYC1vJyB0b2dldGhlci4gIElmIHlvdQorcmVwZWF0IHRoaXMgY29tcGlsYXRpb24sIGl0IG1heSBzdWNjZWVkLCBieSBjaGFuY2UsIGJ1dCB5b3UgaGFkIGJldHRlcgorYXZvaWQgcGFyYWxsZWwgYnVpbGRzIChtYWtlIC1qKSBpbiB0aGlzIHBsYXRmb3JtLCBvciBnZXQgYSBiZXR0ZXIKK2NvbXBpbGVyLiIKKworCSRydW4gJHJtICRyZW1vdmVsaXN0CisJZXhpdCAxCisgICAgICBmaQorCisgICAgICAjIEp1c3QgbW92ZSB0aGUgb2JqZWN0IGlmIG5lZWRlZCwgdGhlbiBnbyBvbiB0byBjb21waWxlIHRoZSBuZXh0IG9uZQorICAgICAgaWYgdGVzdCB4IiRvdXRwdXRfb2JqIiAhPSB4IiRsaWJvYmoiOyB0aGVuCisJJHNob3cgIiRtdiAkb3V0cHV0X29iaiAkbGlib2JqIgorCWlmICRydW4gJG12ICRvdXRwdXRfb2JqICRsaWJvYmo7IHRoZW4gOgorCWVsc2UKKwkgIGVycm9yPSQ/CisJICAkcnVuICRybSAkcmVtb3ZlbGlzdAorCSAgZXhpdCAkZXJyb3IKKwlmaQorICAgICAgZmkKKworICAgICAgIyBJZiB3ZSBoYXZlIG5vIHBpY19mbGFnLCB0aGVuIGNvcHkgdGhlIG9iamVjdCBpbnRvIHBsYWNlIGFuZCBmaW5pc2guCisgICAgICBpZiAodGVzdCAteiAiJHBpY19mbGFnIiB8fCB0ZXN0ICIkcGljX21vZGUiICE9IGRlZmF1bHQpICYmCisJIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KKwkjIFJlbmFtZSB0aGUgLmxvIGZyb20gd2l0aGluIG9iamRpciB0byBvYmoKKwlpZiB0ZXN0IC1mICRvYmo7IHRoZW4KKwkgICRzaG93ICRybSAkb2JqCisJICAkcnVuICRybSAkb2JqCisJZmkKKworCSRzaG93ICIkbXYgJGxpYm9iaiAkb2JqIgorCWlmICRydW4gJG12ICRsaWJvYmogJG9iajsgdGhlbiA6CisJZWxzZQorCSAgZXJyb3I9JD8KKwkgICRydW4gJHJtICRyZW1vdmVsaXN0CisJICBleGl0ICRlcnJvcgorCWZpCisKKwl4ZGlyPWAkZWNobyAiWCRvYmoiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKKwlpZiB0ZXN0ICJYJHhkaXIiID0gIlgkb2JqIjsgdGhlbgorCSAgeGRpcj0iLiIKKwllbHNlCisJICB4ZGlyPSIkeGRpciIKKwlmaQorCWJhc2VvYmo9YCRlY2hvICJYJG9iaiIgfCAkWHNlZCAtZSAicyUuKi8lJSJgCisJbGlib2JqPWAkZWNobyAiWCRiYXNlb2JqIiB8ICRYc2VkIC1lICIkbzJsbyJgCisJIyBOb3cgYXJyYW5nZSB0aGF0IG9iaiBhbmQgbG9fbGlib2JqIGJlY29tZSB0aGUgc2FtZSBmaWxlCisJJHNob3cgIihjZCAkeGRpciAmJiAkTE5fUyAkYmFzZW9iaiAkbGlib2JqKSIKKwlpZiAkcnVuIGV2YWwgJyhjZCAkeGRpciAmJiAkTE5fUyAkYmFzZW9iaiAkbGlib2JqKSc7IHRoZW4KKwkgICMgVW5sb2NrIHRoZSBjcml0aWNhbCBzZWN0aW9uIGlmIGl0IHdhcyBsb2NrZWQKKwkgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgorCSAgICAkcnVuICRybSAiJGxvY2tmaWxlIgorCSAgZmkKKwkgIGV4aXQgMAorCWVsc2UKKwkgIGVycm9yPSQ/CisJICAkcnVuICRybSAkcmVtb3ZlbGlzdAorCSAgZXhpdCAkZXJyb3IKKwlmaQorICAgICAgZmkKKworICAgICAgIyBBbGxvdyBlcnJvciBtZXNzYWdlcyBvbmx5IGZyb20gdGhlIGZpcnN0IGNvbXBpbGF0aW9uLgorICAgICAgc3VwcHJlc3Nfb3V0cHV0PScgPi9kZXYvbnVsbCAyPiYxJworICAgIGZpCisKKyAgICAjIE9ubHkgYnVpbGQgYSBwb3NpdGlvbi1kZXBlbmRlbnQgb2JqZWN0IGlmIHdlIGJ1aWxkIG9sZCBsaWJyYXJpZXMuCisgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorICAgICAgaWYgdGVzdCAiJHBpY19tb2RlIiAhPSB5ZXM7IHRoZW4KKwkjIERvbid0IGJ1aWxkIFBJQyBjb2RlCisJY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkc3JjZmlsZSIKKyAgICAgIGVsc2UKKwkjIEFsbCBwbGF0Zm9ybXMgdXNlIC1EUElDLCB0byBub3RpZnkgcHJlcHJvY2Vzc2VkIGFzc2VtYmxlciBjb2RlLgorCWNvbW1hbmQ9IiRiYXNlX2NvbXBpbGUgJHNyY2ZpbGUgJHBpY19mbGFnIC1EUElDIgorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiRjb21waWxlcl9jX28iID0geWVzOyB0aGVuCisJY29tbWFuZD0iJGNvbW1hbmQgLW8gJG9iaiIKKwlvdXRwdXRfb2JqPSIkb2JqIgorICAgICAgZmkKKworICAgICAgIyBTdXBwcmVzcyBjb21waWxlciBvdXRwdXQgaWYgd2UgYWxyZWFkeSBkaWQgYSBQSUMgY29tcGlsYXRpb24uCisgICAgICBjb21tYW5kPSIkY29tbWFuZCRzdXBwcmVzc19vdXRwdXQiCisgICAgICAkcnVuICRybSAiJG91dHB1dF9vYmoiCisgICAgICAkc2hvdyAiJGNvbW1hbmQiCisgICAgICBpZiAkcnVuIGV2YWwgIiRjb21tYW5kIjsgdGhlbiA6CisgICAgICBlbHNlCisJJHJ1biAkcm0gJHJlbW92ZWxpc3QKKwlleGl0IDEKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHdhcm4gJiYKKwkgdGVzdCB4ImBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYCIgIT0geCIkc3JjZmlsZSI7IHRoZW4KKwllY2hvICJcCisqKiogRVJST1IsICRsb2NrZmlsZSBjb250YWluczoKK2BjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAorCitidXQgaXQgc2hvdWxkIGNvbnRhaW46Ciskc3JjZmlsZQorCitUaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCit0ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCit5b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91CityZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCithdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgorY29tcGlsZXIuIgorCisJJHJ1biAkcm0gJHJlbW92ZWxpc3QKKwlleGl0IDEKKyAgICAgIGZpCisKKyAgICAgICMgSnVzdCBtb3ZlIHRoZSBvYmplY3QgaWYgbmVlZGVkCisgICAgICBpZiB0ZXN0IHgiJG91dHB1dF9vYmoiICE9IHgiJG9iaiI7IHRoZW4KKwkkc2hvdyAiJG12ICRvdXRwdXRfb2JqICRvYmoiCisJaWYgJHJ1biAkbXYgJG91dHB1dF9vYmogJG9iajsgdGhlbiA6CisJZWxzZQorCSAgZXJyb3I9JD8KKwkgICRydW4gJHJtICRyZW1vdmVsaXN0CisJICBleGl0ICRlcnJvcgorCWZpCisgICAgICBmaQorCisgICAgICAjIENyZWF0ZSBhbiBpbnZhbGlkIGxpYnRvb2wgb2JqZWN0IGlmIG5vIFBJQywgc28gdGhhdCB3ZSBkbyBub3QKKyAgICAgICMgYWNjaWRlbnRhbGx5IGxpbmsgaXQgaW50byBhIHByb2dyYW0uCisgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXM7IHRoZW4KKwkkc2hvdyAiZWNobyB0aW1lc3RhbXAgPiAkbGlib2JqIgorCSRydW4gZXZhbCAiZWNobyB0aW1lc3RhbXAgPiBcJGxpYm9iaiIgfHwgZXhpdCAkPworICAgICAgZWxzZQorCSMgTW92ZSB0aGUgLmxvIGZyb20gd2l0aGluIG9iamRpcgorCSRzaG93ICIkbXYgJGxpYm9iaiAkbG9fbGlib2JqIgorCWlmICRydW4gJG12ICRsaWJvYmogJGxvX2xpYm9iajsgdGhlbiA6CisJZWxzZQorCSAgZXJyb3I9JD8KKwkgICRydW4gJHJtICRyZW1vdmVsaXN0CisJICBleGl0ICRlcnJvcgorCWZpCisgICAgICBmaQorICAgIGZpCisKKyAgICAjIFVubG9jayB0aGUgY3JpdGljYWwgc2VjdGlvbiBpZiBpdCB3YXMgbG9ja2VkCisgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiICE9IG5vOyB0aGVuCisgICAgICAkcnVuICRybSAiJGxvY2tmaWxlIgorICAgIGZpCisKKyAgICBleGl0IDAKKyAgICA7OworCisgICMgbGlidG9vbCBsaW5rIG1vZGUKKyAgbGluayB8IHJlbGluaykKKyAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBsaW5rIgorICAgIGNhc2UgJGhvc3QgaW4KKyAgICAqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKikKKyAgICAgICMgSXQgaXMgaW1wb3NzaWJsZSB0byBsaW5rIGEgZGxsIHdpdGhvdXQgdGhpcyBzZXR0aW5nLCBhbmQKKyAgICAgICMgd2Ugc2hvdWxkbid0IGZvcmNlIHRoZSBtYWtlZmlsZSBtYWludGFpbmVyIHRvIGZpZ3VyZSBvdXQKKyAgICAgICMgd2hpY2ggc3lzdGVtIHdlIGFyZSBjb21waWxpbmcgZm9yIGluIG9yZGVyIHRvIHBhc3MgYW4gZXh0cmEKKyAgICAgICMgZmxhZyBmb3IgZXZlcnkgbGlidG9vbCBpbnZva2F0aW9uLgorICAgICAgIyBhbGxvd191bmRlZmluZWQ9bm8KKworICAgICAgIyBGSVhNRTogVW5mb3J0dW5hdGVseSwgdGhlcmUgYXJlIHByb2JsZW1zIHdpdGggdGhlIGFib3ZlIHdoZW4gdHJ5aW5nCisgICAgICAjIHRvIG1ha2UgYSBkbGwgd2hpY2ggaGFzIHVuZGVmaW5lZCBzeW1ib2xzLCBpbiB3aGljaCBjYXNlIG5vdAorICAgICAgIyBldmVuIGEgc3RhdGljIGxpYnJhcnkgaXMgYnVpbHQuICBGb3Igbm93LCB3ZSBuZWVkIHRvIHNwZWNpZnkKKyAgICAgICMgLW5vLXVuZGVmaW5lZCBvbiB0aGUgbGlidG9vbCBsaW5rIGxpbmUgd2hlbiB3ZSBjYW4gYmUgY2VydGFpbgorICAgICAgIyB0aGF0IGFsbCBzeW1ib2xzIGFyZSBzYXRpc2ZpZWQsIG90aGVyd2lzZSB3ZSBnZXQgYSBzdGF0aWMgbGlicmFyeS4KKyAgICAgIGFsbG93X3VuZGVmaW5lZD15ZXMKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGFsbG93X3VuZGVmaW5lZD15ZXMKKyAgICAgIDs7CisgICAgZXNhYworICAgIGxpYnRvb2xfYXJncz0iJG5vbm9wdCIKKyAgICBjb21waWxlX2NvbW1hbmQ9IiRub25vcHQiCisgICAgZmluYWxpemVfY29tbWFuZD0iJG5vbm9wdCIKKworICAgIGNvbXBpbGVfcnBhdGg9CisgICAgZmluYWxpemVfcnBhdGg9CisgICAgY29tcGlsZV9zaGxpYnBhdGg9CisgICAgZmluYWxpemVfc2hsaWJwYXRoPQorICAgIGNvbnZlbmllbmNlPQorICAgIG9sZF9jb252ZW5pZW5jZT0KKyAgICBkZXBsaWJzPQorICAgIG9sZF9kZXBsaWJzPQorICAgIGNvbXBpbGVyX2ZsYWdzPQorICAgIGxpbmtlcl9mbGFncz0KKyAgICBkbGxzZWFyY2hwYXRoPQorICAgIGxpYl9zZWFyY2hfcGF0aD1gcHdkYAorCisgICAgYXZvaWRfdmVyc2lvbj1ubworICAgIGRsZmlsZXM9CisgICAgZGxwcmVmaWxlcz0KKyAgICBkbHNlbGY9bm8KKyAgICBleHBvcnRfZHluYW1pYz1ubworICAgIGV4cG9ydF9zeW1ib2xzPQorICAgIGV4cG9ydF9zeW1ib2xzX3JlZ2V4PQorICAgIGdlbmVyYXRlZD0KKyAgICBsaWJvYmpzPQorICAgIGx0bGlicz0KKyAgICBtb2R1bGU9bm8KKyAgICBub19pbnN0YWxsPW5vCisgICAgb2Jqcz0KKyAgICBwcmVmZXJfc3RhdGljX2xpYnM9bm8KKyAgICBwcmVsb2FkPW5vCisgICAgcHJldj0KKyAgICBwcmV2YXJnPQorICAgIHJlbGVhc2U9CisgICAgcnBhdGg9CisgICAgeHJwYXRoPQorICAgIHBlcm1fcnBhdGg9CisgICAgdGVtcF9ycGF0aD0KKyAgICB0aHJlYWRfc2FmZT1ubworICAgIHZpbmZvPQorCisgICAgIyBXZSBuZWVkIHRvIGtub3cgLXN0YXRpYywgdG8gZ2V0IHRoZSByaWdodCBvdXRwdXQgZmlsZW5hbWVzLgorICAgIGZvciBhcmcKKyAgICBkbworICAgICAgY2FzZSAkYXJnIGluCisgICAgICAtYWxsLXN0YXRpYyB8IC1zdGF0aWMpCisJaWYgdGVzdCAiWCRhcmciID0gIlgtYWxsLXN0YXRpYyI7IHRoZW4KKwkgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmIHRlc3QgLXogIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgorCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjb21wbGV0ZSBzdGF0aWMgbGlua2luZyBpcyBpbXBvc3NpYmxlIGluIHRoaXMgY29uZmlndXJhdGlvbiIgMT4mMgorCSAgZmkKKwkgIGlmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgorCSAgICBkbG9wZW5fc2VsZj0kZGxvcGVuX3NlbGZfc3RhdGljCisJICBmaQorCWVsc2UKKwkgIGlmIHRlc3QgLXogIiRwaWNfZmxhZyIgJiYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCisJICAgIGRsb3Blbl9zZWxmPSRkbG9wZW5fc2VsZl9zdGF0aWMKKwkgIGZpCisJZmkKKwlidWlsZF9saWJ0b29sX2xpYnM9bm8KKwlidWlsZF9vbGRfbGlicz15ZXMKKwlwcmVmZXJfc3RhdGljX2xpYnM9eWVzCisJYnJlYWsKKwk7OworICAgICAgZXNhYworICAgIGRvbmUKKworICAgICMgU2VlIGlmIG91ciBzaGFyZWQgYXJjaGl2ZXMgZGVwZW5kIG9uIHN0YXRpYyBhcmNoaXZlcy4KKyAgICB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyIgJiYgYnVpbGRfb2xkX2xpYnM9eWVzCisKKyAgICAjIEdvIHRocm91Z2ggdGhlIGFyZ3VtZW50cywgdHJhbnNmb3JtaW5nIHRoZW0gb24gdGhlIHdheS4KKyAgICB3aGlsZSB0ZXN0ICQjIC1ndCAwOyBkbworICAgICAgYXJnPSIkMSIKKyAgICAgIHNoaWZ0CisgICAgICBjYXNlICRhcmcgaW4KKyAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorCXFhcmc9XCJgJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImBcIiAjIyMgdGVzdHN1aXRlOiBza2lwIG5lc3RlZCBxdW90aW5nIHRlc3QKKwk7OworICAgICAgKikgcWFyZz0kYXJnIDs7CisgICAgICBlc2FjCisgICAgICBsaWJ0b29sX2FyZ3M9IiRsaWJ0b29sX2FyZ3MgJHFhcmciCisKKyAgICAgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICAgICAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCisJY2FzZSAkcHJldiBpbgorCW91dHB1dCkKKwkgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCBAT1VUUFVUQCIKKwkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIEBPVVRQVVRAIgorCSAgOzsKKwllc2FjCisKKwljYXNlICRwcmV2IGluCisJZGxmaWxlc3xkbHByZWZpbGVzKQorCSAgaWYgdGVzdCAiJHByZWxvYWQiID0gbm87IHRoZW4KKwkgICAgIyBBZGQgdGhlIHN5bWJvbCBvYmplY3QgaW50byB0aGUgbGlua2luZyBjb21tYW5kcy4KKwkgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIEBTWU1GSUxFQCIKKwkgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgQFNZTUZJTEVAIgorCSAgICBwcmVsb2FkPXllcworCSAgZmkKKwkgIGNhc2UgJGFyZyBpbgorCSAgKi5sYSB8ICoubG8pIDs7ICAjIFdlIGhhbmRsZSB0aGVzZSBjYXNlcyBiZWxvdy4KKwkgIGZvcmNlKQorCSAgICBpZiB0ZXN0ICIkZGxzZWxmIiA9IG5vOyB0aGVuCisJICAgICAgZGxzZWxmPW5lZWRsZXNzCisJICAgICAgZXhwb3J0X2R5bmFtaWM9eWVzCisJICAgIGZpCisJICAgIHByZXY9CisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICBzZWxmKQorCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCisJICAgICAgZGxzZWxmPXllcworCSAgICBlbGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXMgJiYgdGVzdCAiJGRsb3Blbl9zZWxmIiAhPSB5ZXM7IHRoZW4KKwkgICAgICBkbHNlbGY9eWVzCisJICAgIGVsc2UKKwkgICAgICBkbHNlbGY9bmVlZGxlc3MKKwkgICAgICBleHBvcnRfZHluYW1pYz15ZXMKKwkgICAgZmkKKwkgICAgcHJldj0KKwkgICAgY29udGludWUKKwkgICAgOzsKKwkgICopCisJICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KKwkgICAgICBkbGZpbGVzPSIkZGxmaWxlcyAkYXJnIgorCSAgICBlbHNlCisJICAgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGFyZyIKKwkgICAgZmkKKwkgICAgcHJldj0KKwkgICAgY29udGludWUKKwkgICAgOzsKKwkgIGVzYWMKKwkgIDs7CisJZXhwc3ltcykKKwkgIGV4cG9ydF9zeW1ib2xzPSIkYXJnIgorCSAgaWYgdGVzdCAhIC1mICIkYXJnIjsgdGhlbgorCSAgICAkZWNobyAiJG1vZGVuYW1lOiBzeW1ib2wgZmlsZSBcYCRhcmcnIGRvZXMgbm90IGV4aXN0IgorCSAgICBleGl0IDEKKwkgIGZpCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJZXhwc3ltc19yZWdleCkKKwkgIGV4cG9ydF9zeW1ib2xzX3JlZ2V4PSIkYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCXJlbGVhc2UpCisJICByZWxlYXNlPSItJGFyZyIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlycGF0aCB8IHhycGF0aCkKKwkgICMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgorCSAgY2FzZSAkYXJnIGluCisJICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIDs7CisJICAqKQorCSAgICAkZWNobyAiJG1vZGVuYW1lOiBvbmx5IGFic29sdXRlIHJ1bi1wYXRocyBhcmUgYWxsb3dlZCIgMT4mMgorCSAgICBleGl0IDEKKwkgICAgOzsKKwkgIGVzYWMKKwkgIGlmIHRlc3QgIiRwcmV2IiA9IHJwYXRoOyB0aGVuCisJICAgIGNhc2UgIiRycGF0aCAiIGluCisJICAgICoiICRhcmcgIiopIDs7CisJICAgICopIHJwYXRoPSIkcnBhdGggJGFyZyIgOzsKKwkgICAgZXNhYworCSAgZWxzZQorCSAgICBjYXNlICIkeHJwYXRoICIgaW4KKwkgICAgKiIgJGFyZyAiKikgOzsKKwkgICAgKikgeHJwYXRoPSIkeHJwYXRoICRhcmciIDs7CisJICAgIGVzYWMKKwkgIGZpCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJeGNvbXBpbGVyKQorCSAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkcWFyZyIKKwkgIHByZXY9CisJICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJHFhcmciCisJICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkcWFyZyIKKwkgIGNvbnRpbnVlCisJICA7OworCXhsaW5rZXIpCisJICBsaW5rZXJfZmxhZ3M9IiRsaW5rZXJfZmxhZ3MgJHFhcmciCisJICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICR3bCRxYXJnIgorCSAgcHJldj0KKwkgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkd2wkcWFyZyIKKwkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICR3bCRxYXJnIgorCSAgY29udGludWUKKwkgIDs7CisJKikKKwkgIGV2YWwgIiRwcmV2PVwiXCRhcmdcIiIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwllc2FjCisgICAgICBmaSAjIHRlc3QgLW4gJHByZXYKKworICAgICAgcHJldmFyZz0iJGFyZyIKKworICAgICAgY2FzZSAkYXJnIGluCisgICAgICAtYWxsLXN0YXRpYykKKwlpZiB0ZXN0IC1uICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KKwkgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkbGlua19zdGF0aWNfZmxhZyIKKwkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRsaW5rX3N0YXRpY19mbGFnIgorCWZpCisJY29udGludWUKKwk7OworCisgICAgICAtYWxsb3ctdW5kZWZpbmVkKQorCSMgRklYTUU6IHJlbW92ZSB0aGlzIGZsYWcgc29tZXRpbWUgaW4gdGhlIGZ1dHVyZS4KKwkkZWNobyAiJG1vZGVuYW1lOiBcYC1hbGxvdy11bmRlZmluZWQnIGlzIGRlcHJlY2F0ZWQgYmVjYXVzZSBpdCBpcyB0aGUgZGVmYXVsdCIgMT4mMgorCWNvbnRpbnVlCisJOzsKKworICAgICAgLWF2b2lkLXZlcnNpb24pCisJYXZvaWRfdmVyc2lvbj15ZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1kbG9wZW4pCisJcHJldj1kbGZpbGVzCisJY29udGludWUKKwk7OworCisgICAgICAtZGxwcmVvcGVuKQorCXByZXY9ZGxwcmVmaWxlcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLWV4cG9ydC1keW5hbWljKQorCWV4cG9ydF9keW5hbWljPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLWV4cG9ydC1zeW1ib2xzIHwgLWV4cG9ydC1zeW1ib2xzLXJlZ2V4KQorCWlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgfHwgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgorCSAgJGVjaG8gIiRtb2RlbmFtZTogbW9yZSB0aGFuIG9uZSAtZXhwb3J0ZWQtc3ltYm9scyBhcmd1bWVudCBpcyBub3QgYWxsb3dlZCIKKwkgIGV4aXQgMQorCWZpCisJaWYgdGVzdCAiWCRhcmciID0gIlgtZXhwb3J0LXN5bWJvbHMiOyB0aGVuCisJICBwcmV2PWV4cHN5bXMKKwllbHNlCisJICBwcmV2PWV4cHN5bXNfcmVnZXgKKwlmaQorCWNvbnRpbnVlCisJOzsKKworICAgICAgIyBUaGUgbmF0aXZlIElSSVggbGlua2VyIHVuZGVyc3RhbmRzIC1MQU5HOiosIC1MSVNUOiogYW5kIC1MTk86KgorICAgICAgIyBzbywgaWYgd2Ugc2VlIHRoZXNlIGZsYWdzIGJlIGNhcmVmdWwgbm90IHRvIHRyZWF0IHRoZW0gbGlrZSAtTAorICAgICAgLUxbQS1aXVtBLVpdKjoqKQorCWNhc2UgJHdpdGhfZ2NjLyRob3N0IGluCisJbm8vKi0qLWlyaXgqKQorCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhcmciCisJICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkYXJnIgorCSAgOzsKKwllc2FjCisJY29udGludWUKKwk7OworCisgICAgICAtTCopCisJZGlyPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MvXi1MLy8nYAorCSMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgorCWNhc2UgJGRpciBpbgorCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgOzsKKwkqKQorCSAgYWJzZGlyPWBjZCAiJGRpciIgJiYgcHdkYAorCSAgaWYgdGVzdCAteiAiJGFic2RpciI7IHRoZW4KKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGRldGVybWluZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBvZiBcYCRkaXInIiAxPiYyCisJICAgIGV4aXQgMQorCSAgZmkKKwkgIGRpcj0iJGFic2RpciIKKwkgIDs7CisJZXNhYworCWNhc2UgIiRkZXBsaWJzICIgaW4KKwkqIiAtTCRkaXIgIiopIDs7CisJKikKKwkgIGRlcGxpYnM9IiRkZXBsaWJzIC1MJGRpciIKKwkgIGxpYl9zZWFyY2hfcGF0aD0iJGxpYl9zZWFyY2hfcGF0aCAkZGlyIgorCSAgOzsKKwllc2FjCisJY2FzZSAkaG9zdCBpbgorCSotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqKQorCSAgY2FzZSA6JGRsbHNlYXJjaHBhdGg6IGluCisJICAqIjokZGlyOiIqKSA7OworCSAgKikgZGxsc2VhcmNocGF0aD0iJGRsbHNlYXJjaHBhdGg6JGRpciI7OworCSAgZXNhYworCSAgOzsKKwllc2FjCisJY29udGludWUKKwk7OworCisgICAgICAtbCopCisJaWYgdGVzdCAiWCRhcmciID0gIlgtbGMiIHx8IHRlc3QgIlgkYXJnIiA9ICJYLWxtIjsgdGhlbgorCSAgY2FzZSAkaG9zdCBpbgorCSAgKi0qLWN5Z3dpbiogfCAqLSotcHczMiogfCAqLSotYmVvcyopCisJICAgICMgVGhlc2Ugc3lzdGVtcyBkb24ndCBhY3R1YWxseSBoYXZlIGEgQyBvciBtYXRoIGxpYnJhcnkgKGFzIHN1Y2gpCisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICAqLSotbWluZ3cqIHwgKi0qLW9zMiopCisJICAgICMgVGhlc2Ugc3lzdGVtcyBkb24ndCBhY3R1YWxseSBoYXZlIGEgQyBsaWJyYXJ5IChhcyBzdWNoKQorCSAgICB0ZXN0ICJYJGFyZyIgPSAiWC1sYyIgJiYgY29udGludWUKKwkgICAgOzsKKwkgICotKi1vcGVuYnNkKikKKwkgICAgIyBEbyBub3QgaW5jbHVkZSBsaWJjIGR1ZSB0byB1cyBoYXZpbmcgbGliYy9saWJjX3IuCisJICAgIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiAmJiBjb250aW51ZQorCSAgICA7OworCSAgZXNhYworCSBlbGlmIHRlc3QgIlgkYXJnIiA9ICJYLWxjX3IiOyB0aGVuCisJICBjYXNlICRob3N0IGluCisJICAqLSotb3BlbmJzZCopCisJICAgICMgRG8gbm90IGluY2x1ZGUgbGliY19yIGRpcmVjdGx5LCB1c2UgLXB0aHJlYWQgZmxhZy4KKwkgICAgY29udGludWUKKwkgICAgOzsKKwkgIGVzYWMKKwlmaQorCWRlcGxpYnM9IiRkZXBsaWJzICRhcmciCisJY29udGludWUKKwk7OworCisgICAgICAtbW9kdWxlKQorCW1vZHVsZT15ZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1uby1mYXN0LWluc3RhbGwpCisJZmFzdF9pbnN0YWxsPW5vCisJY29udGludWUKKwk7OworCisgICAgICAtbm8taW5zdGFsbCkKKwljYXNlICRob3N0IGluCisJKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLW9zMiopCisJICAjIFRoZSBQQVRIIGhhY2tlcnkgaW4gd3JhcHBlciBzY3JpcHRzIGlzIHJlcXVpcmVkIG9uIFdpbmRvd3MKKwkgICMgaW4gb3JkZXIgZm9yIHRoZSBsb2FkZXIgdG8gZmluZCBhbnkgZGxscyBpdCBuZWVkcy4KKwkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLW5vLWluc3RhbGwnIGlzIGlnbm9yZWQgZm9yICRob3N0IiAxPiYyCisJICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBhc3N1bWluZyBcYC1uby1mYXN0LWluc3RhbGwnIGluc3RlYWQiIDE+JjIKKwkgIGZhc3RfaW5zdGFsbD1ubworCSAgOzsKKwkqKSBub19pbnN0YWxsPXllcyA7OworCWVzYWMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1uby11bmRlZmluZWQpCisJYWxsb3dfdW5kZWZpbmVkPW5vCisJY29udGludWUKKwk7OworCisgICAgICAtbykgcHJldj1vdXRwdXQgOzsKKworICAgICAgLXJlbGVhc2UpCisJcHJldj1yZWxlYXNlCisJY29udGludWUKKwk7OworCisgICAgICAtcnBhdGgpCisJcHJldj1ycGF0aAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLVIpCisJcHJldj14cnBhdGgKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1SKikKKwlkaXI9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncy9eLVIvLydgCisJIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCisJY2FzZSAkZGlyIGluCisJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OworCSopCisJICAkZWNobyAiJG1vZGVuYW1lOiBvbmx5IGFic29sdXRlIHJ1bi1wYXRocyBhcmUgYWxsb3dlZCIgMT4mMgorCSAgZXhpdCAxCisJICA7OworCWVzYWMKKwljYXNlICIkeHJwYXRoICIgaW4KKwkqIiAkZGlyICIqKSA7OworCSopIHhycGF0aD0iJHhycGF0aCAkZGlyIiA7OworCWVzYWMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1zdGF0aWMpCisJIyBUaGUgZWZmZWN0cyBvZiAtc3RhdGljIGFyZSBkZWZpbmVkIGluIGEgcHJldmlvdXMgbG9vcC4KKwkjIFdlIHVzZWQgdG8gZG8gdGhlIHNhbWUgYXMgLWFsbC1zdGF0aWMgb24gcGxhdGZvcm1zIHRoYXQKKwkjIGRpZG4ndCBoYXZlIGEgUElDIGZsYWcsIGJ1dCB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBlZmZlY3RzCisJIyB3b3VsZCBiZSBlcXVpdmFsZW50IHdhcyB3cm9uZy4gIEl0IHdvdWxkIGJyZWFrIG9uIGF0IGxlYXN0CisJIyBEaWdpdGFsIFVuaXggYW5kIEFJWC4KKwljb250aW51ZQorCTs7CisKKyAgICAgIC10aHJlYWQtc2FmZSkKKwl0aHJlYWRfc2FmZT15ZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC12ZXJzaW9uLWluZm8pCisJcHJldj12aW5mbworCWNvbnRpbnVlCisJOzsKKworICAgICAgLVdjLCopCisJYXJncz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0IiAtZSAncy9eLVdjLC8vJ2AKKwlhcmc9CisJc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JywnCisJZm9yIGZsYWcgaW4gJGFyZ3M7IGRvCisJICBJRlM9IiRzYXZlX2lmcyIKKwkgIGNhc2UgJGZsYWcgaW4KKwkgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCisJICAgIGZsYWc9IlwiJGZsYWdcIiIKKwkgICAgOzsKKwkgIGVzYWMKKwkgIGFyZz0iJGFyZyAkd2wkZmxhZyIKKwkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJGZsYWciCisJZG9uZQorCUlGUz0iJHNhdmVfaWZzIgorCWFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICJzL14gLy8iYAorCTs7CisKKyAgICAgIC1XbCwqKQorCWFyZ3M9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCIgLWUgJ3MvXi1XbCwvLydgCisJYXJnPQorCXNhdmVfaWZzPSIkSUZTIjsgSUZTPScsJworCWZvciBmbGFnIGluICRhcmdzOyBkbworCSAgSUZTPSIkc2F2ZV9pZnMiCisJICBjYXNlICRmbGFnIGluCisJICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorCSAgICBmbGFnPSJcIiRmbGFnXCIiCisJICAgIDs7CisJICBlc2FjCisJICBhcmc9IiRhcmcgJHdsJGZsYWciCisJICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICR3bCRmbGFnIgorCSAgbGlua2VyX2ZsYWdzPSIkbGlua2VyX2ZsYWdzICRmbGFnIgorCWRvbmUKKwlJRlM9IiRzYXZlX2lmcyIKKwlhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAicy9eIC8vImAKKwk7OworCisgICAgICAtWGNvbXBpbGVyKQorCXByZXY9eGNvbXBpbGVyCisJY29udGludWUKKwk7OworCisgICAgICAtWGxpbmtlcikKKwlwcmV2PXhsaW5rZXIKKwljb250aW51ZQorCTs7CisKKyAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBmbGFnLgorICAgICAgLSogfCArKikKKwkjIFVua25vd24gYXJndW1lbnRzIGluIGJvdGggZmluYWxpemVfY29tbWFuZCBhbmQgY29tcGlsZV9jb21tYW5kIG5lZWQKKwkjIHRvIGJlIGFlc3RoZXRpY2FsbHkgcXVvdGVkIGJlY2F1c2UgdGhleSBhcmUgZXZhbGVkIGxhdGVyLgorCWFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKwljYXNlICRhcmcgaW4KKwkqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKKwkgIGFyZz0iXCIkYXJnXCIiCisJICA7OworCWVzYWMKKwk7OworCisgICAgICAqLmxvIHwgKi4kb2JqZXh0KQorCSMgQSBsaWJyYXJ5IG9yIHN0YW5kYXJkIG9iamVjdC4KKwlpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCisJICAjIFRoaXMgZmlsZSB3YXMgc3BlY2lmaWVkIHdpdGggLWRsb3Blbi4KKwkgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmIHRlc3QgIiRkbG9wZW5fc3VwcG9ydCIgPSB5ZXM7IHRoZW4KKwkgICAgZGxmaWxlcz0iJGRsZmlsZXMgJGFyZyIKKwkgICAgcHJldj0KKwkgICAgY29udGludWUKKwkgIGVsc2UKKwkgICAgIyBJZiBsaWJ0b29sIG9iamVjdHMgYXJlIHVuc3VwcG9ydGVkLCB0aGVuIHdlIG5lZWQgdG8gcHJlbG9hZC4KKwkgICAgcHJldj1kbHByZWZpbGVzCisJICBmaQorCWZpCisKKwlpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCisJICAjIFByZWxvYWQgdGhlIG9sZC1zdHlsZSBvYmplY3QuCisJICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAiYCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJGxvMm8iYAorCSAgcHJldj0KKwllbHNlCisJICBjYXNlICRhcmcgaW4KKwkgICoubG8pIGxpYm9ianM9IiRsaWJvYmpzICRhcmciIDs7CisJICAqKSBvYmpzPSIkb2JqcyAkYXJnIiA7OworCSAgZXNhYworCWZpCisJOzsKKworICAgICAgKi4kbGliZXh0KQorCSMgQW4gYXJjaGl2ZS4KKwlkZXBsaWJzPSIkZGVwbGlicyAkYXJnIgorCW9sZF9kZXBsaWJzPSIkb2xkX2RlcGxpYnMgJGFyZyIKKwljb250aW51ZQorCTs7CisKKyAgICAgICoubGEpCisJIyBBIGxpYnRvb2wtY29udHJvbGxlZCBsaWJyYXJ5LgorCisJaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgorCSAgIyBUaGlzIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbG9wZW4uCisJICBkbGZpbGVzPSIkZGxmaWxlcyAkYXJnIgorCSAgcHJldj0KKwllbGlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KKwkgICMgVGhlIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbHByZW9wZW4uCisJICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkYXJnIgorCSAgcHJldj0KKwllbHNlCisJICBkZXBsaWJzPSIkZGVwbGlicyAkYXJnIgorCWZpCisJY29udGludWUKKwk7OworCisgICAgICAjIFNvbWUgb3RoZXIgY29tcGlsZXIgYXJndW1lbnQuCisgICAgICAqKQorCSMgVW5rbm93biBhcmd1bWVudHMgaW4gYm90aCBmaW5hbGl6ZV9jb21tYW5kIGFuZCBjb21waWxlX2NvbW1hbmQgbmVlZAorCSMgdG8gYmUgYWVzdGhldGljYWxseSBxdW90ZWQgYmVjYXVzZSB0aGV5IGFyZSBldmFsZWQgbGF0ZXIuCisJYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorCWNhc2UgJGFyZyBpbgorCSpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorCSAgYXJnPSJcIiRhcmdcIiIKKwkgIDs7CisJZXNhYworCTs7CisgICAgICBlc2FjICMgYXJnCisKKyAgICAgICMgTm93IGFjdHVhbGx5IHN1YnN0aXR1dGUgdGhlIGFyZ3VtZW50IGludG8gdGhlIGNvbW1hbmRzLgorICAgICAgaWYgdGVzdCAtbiAiJGFyZyI7IHRoZW4KKwljb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGFyZyIKKwlmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkYXJnIgorICAgICAgZmkKKyAgICBkb25lICMgYXJndW1lbnQgcGFyc2luZyBsb29wCisKKyAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IHRoZSBcYCRwcmV2YXJnJyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQiIDE+JjIKKyAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgZXhpdCAxCisgICAgZmkKKworICAgIGlmIHRlc3QgIiRleHBvcnRfZHluYW1pYyIgPSB5ZXMgJiYgdGVzdCAtbiAiJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYyI7IHRoZW4KKyAgICAgIGV2YWwgYXJnPVwiJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY1wiCisgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGFyZyIKKyAgICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRhcmciCisgICAgZmkKKworICAgICMgY2FsY3VsYXRlIHRoZSBuYW1lIG9mIHRoZSBmaWxlLCB3aXRob3V0IGl0cyBkaXJlY3RvcnkKKyAgICBvdXRwdXRuYW1lPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKyAgICBsaWJvYmpzX3NhdmU9IiRsaWJvYmpzIgorCisgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCisgICAgICAjIGdldCB0aGUgZGlyZWN0b3JpZXMgbGlzdGVkIGluICRzaGxpYnBhdGhfdmFyCisgICAgICBldmFsIHNobGliX3NlYXJjaF9wYXRoPVxgXCRlY2hvIFwiWFwkeyRzaGxpYnBhdGhfdmFyfVwiIFx8IFwkWHNlZCAtZSBcJ3MvOi8gL2dcJ1xgCisgICAgZWxzZQorICAgICAgc2hsaWJfc2VhcmNoX3BhdGg9CisgICAgZmkKKyAgICBldmFsIHN5c19saWJfc2VhcmNoX3BhdGg9XCIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjXCIKKyAgICBldmFsIHN5c19saWJfZGxzZWFyY2hfcGF0aD1cIiRzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlY1wiCisKKyAgICBvdXRwdXRfb2JqZGlyPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKKyAgICBpZiB0ZXN0ICJYJG91dHB1dF9vYmpkaXIiID0gIlgkb3V0cHV0IjsgdGhlbgorICAgICAgb3V0cHV0X29iamRpcj0iJG9iamRpciIKKyAgICBlbHNlCisgICAgICBvdXRwdXRfb2JqZGlyPSIkb3V0cHV0X29iamRpci8kb2JqZGlyIgorICAgIGZpCisgICAgIyBDcmVhdGUgdGhlIG9iamVjdCBkaXJlY3RvcnkuCisgICAgaWYgdGVzdCAhIC1kICRvdXRwdXRfb2JqZGlyOyB0aGVuCisgICAgICAkc2hvdyAiJG1rZGlyICRvdXRwdXRfb2JqZGlyIgorICAgICAgJHJ1biAkbWtkaXIgJG91dHB1dF9vYmpkaXIKKyAgICAgIHN0YXR1cz0kPworICAgICAgaWYgdGVzdCAkc3RhdHVzIC1uZSAwICYmIHRlc3QgISAtZCAkb3V0cHV0X29iamRpcjsgdGhlbgorCWV4aXQgJHN0YXR1cworICAgICAgZmkKKyAgICBmaQorCisgICAgIyBEZXRlcm1pbmUgdGhlIHR5cGUgb2Ygb3V0cHV0CisgICAgY2FzZSAkb3V0cHV0IGluCisgICAgIiIpCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIG91dHB1dCBmaWxlIiAxPiYyCisgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICAgIGV4aXQgMQorICAgICAgOzsKKyAgICAqLiRsaWJleHQpIGxpbmttb2RlPW9sZGxpYiA7OworICAgICoubG8gfCAqLiRvYmpleHQpIGxpbmttb2RlPW9iaiA7OworICAgICoubGEpIGxpbmttb2RlPWxpYiA7OworICAgICopIGxpbmttb2RlPXByb2cgOzsgIyBBbnl0aGluZyBlbHNlIHNob3VsZCBiZSBhIHByb2dyYW0uCisgICAgZXNhYworCisgICAgc3BlY2lhbGRlcGxpYnM9CisgICAgbGlicz0KKyAgICAjIEZpbmQgYWxsIGludGVyZGVwZW5kZW50IGRlcGxpYnMgYnkgc2VhcmNoaW5nIGZvciBsaWJyYXJpZXMKKyAgICAjIHRoYXQgYXJlIGxpbmtlZCBtb3JlIHRoYW4gb25jZSAoZS5nLiAtbGEgLWxiIC1sYSkKKyAgICBmb3IgZGVwbGliIGluICRkZXBsaWJzOyBkbworICAgICAgY2FzZSAiJGxpYnMgIiBpbgorICAgICAgKiIgJGRlcGxpYiAiKikgc3BlY2lhbGRlcGxpYnM9IiRzcGVjaWFsZGVwbGlicyAkZGVwbGliIiA7OworICAgICAgZXNhYworICAgICAgbGlicz0iJGxpYnMgJGRlcGxpYiIKKyAgICBkb25lCisgICAgZGVwbGlicz0KKyAgICBuZXdkZXBlbmRlbmN5X2xpYnM9CisgICAgbmV3bGliX3NlYXJjaF9wYXRoPQorICAgIG5lZWRfcmVsaW5rPW5vICMgd2hldGhlciB3ZSdyZSBsaW5raW5nIGFueSB1bmluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcworICAgIG5vdGluc3RfZGVwbGlicz0gIyBub3QtaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzCisgICAgbm90aW5zdF9wYXRoPSAjIHBhdGhzIHRoYXQgY29udGFpbiBub3QtaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzCisgICAgY2FzZSAkbGlua21vZGUgaW4KKyAgICBsaWIpCisJcGFzc2VzPSJjb252IGxpbmsiCisJZm9yIGZpbGUgaW4gJGRsZmlsZXMgJGRscHJlZmlsZXM7IGRvCisJICBjYXNlICRmaWxlIGluCisJICAqLmxhKSA7OworCSAgKikKKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogbGlicmFyaWVzIGNhbiBcYC1kbG9wZW4nIG9ubHkgbGlidG9vbCBsaWJyYXJpZXM6ICRmaWxlIiAxPiYyCisJICAgIGV4aXQgMQorCSAgICA7OworCSAgZXNhYworCWRvbmUKKwk7OworICAgIHByb2cpCisJY29tcGlsZV9kZXBsaWJzPQorCWZpbmFsaXplX2RlcGxpYnM9CisJYWxsZGVwbGlicz1ubworCW5ld2RsZmlsZXM9CisJbmV3ZGxwcmVmaWxlcz0KKwlwYXNzZXM9ImNvbnYgc2NhbiBkbG9wZW4gZGxwcmVvcGVuIGxpbmsiCisJOzsKKyAgICAqKSAgcGFzc2VzPSJjb252IgorCTs7CisgICAgZXNhYworICAgIGZvciBwYXNzIGluICRwYXNzZXM7IGRvCisgICAgICBpZiB0ZXN0ICRsaW5rbW9kZSA9IHByb2c7IHRoZW4KKwkjIERldGVybWluZSB3aGljaCBmaWxlcyB0byBwcm9jZXNzCisJY2FzZSAkcGFzcyBpbgorCWRsb3BlbikKKwkgIGxpYnM9IiRkbGZpbGVzIgorCSAgc2F2ZV9kZXBsaWJzPSIkZGVwbGlicyIgIyBDb2xsZWN0IGRscHJlb3BlbmVkIGxpYnJhcmllcworCSAgZGVwbGlicz0KKwkgIDs7CisJZGxwcmVvcGVuKSBsaWJzPSIkZGxwcmVmaWxlcyIgOzsKKwlsaW5rKSBsaWJzPSIkZGVwbGlicyAlREVQTElCUyUgJGRlcGVuZGVuY3lfbGlicyIgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgZm9yIGRlcGxpYiBpbiAkbGliczsgZG8KKwlsaWI9CisJZm91bmQ9bm8KKwljYXNlICRkZXBsaWIgaW4KKwktbCopCisJICBpZiB0ZXN0ICRsaW5rbW9kZSA9IG9sZGxpYiAmJiB0ZXN0ICRsaW5rbW9kZSA9IG9iajsgdGhlbgorCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1sJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcy9vYmplY3RzOiAkZGVwbGliIiAxPiYyCisJICAgIGNvbnRpbnVlCisJICBmaQorCSAgaWYgdGVzdCAkcGFzcyA9IGNvbnY7IHRoZW4KKwkgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgY29udGludWUKKwkgIGZpCisJICBuYW1lPWAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgJ3MvXi1sLy8nYAorCSAgZm9yIHNlYXJjaGRpciBpbiAkbmV3bGliX3NlYXJjaF9wYXRoICRsaWJfc2VhcmNoX3BhdGggJHN5c19saWJfc2VhcmNoX3BhdGggJHNobGliX3NlYXJjaF9wYXRoOyBkbworCSAgICAjIFNlYXJjaCB0aGUgbGlidG9vbCBsaWJyYXJ5CisJICAgIGxpYj0iJHNlYXJjaGRpci9saWIke25hbWV9LmxhIgorCSAgICBpZiB0ZXN0IC1mICIkbGliIjsgdGhlbgorCSAgICAgIGZvdW5kPXllcworCSAgICAgIGJyZWFrCisJICAgIGZpCisJICBkb25lCisJICBpZiB0ZXN0ICIkZm91bmQiICE9IHllczsgdGhlbgorCSAgICAjIGRlcGxpYiBkb2Vzbid0IHNlZW0gdG8gYmUgYSBsaWJ0b29sIGxpYnJhcnkKKwkgICAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCisJICAgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCisJICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKKwkgICAgZWxzZQorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgICAgdGVzdCAkbGlua21vZGUgPSBsaWIgJiYgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCisJICAgIGZpCisJICAgIGNvbnRpbnVlCisJICBmaQorCSAgOzsgIyAtbAorCS1MKikKKwkgIGNhc2UgJGxpbmttb2RlIGluCisJICBsaWIpCisJICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIHRlc3QgJHBhc3MgPSBjb252ICYmIGNvbnRpbnVlCisJICAgIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgICBuZXdsaWJfc2VhcmNoX3BhdGg9IiRuZXdsaWJfc2VhcmNoX3BhdGggImAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgJ3MvXi1MLy8nYAorCSAgICA7OworCSAgcHJvZykKKwkgICAgaWYgdGVzdCAkcGFzcyA9IGNvbnY7IHRoZW4KKwkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICAgIGNvbnRpbnVlCisJICAgIGZpCisJICAgIGlmIHRlc3QgJHBhc3MgPSBzY2FuOyB0aGVuCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgICBuZXdsaWJfc2VhcmNoX3BhdGg9IiRuZXdsaWJfc2VhcmNoX3BhdGggImAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgJ3MvXi1MLy8nYAorCSAgICBlbHNlCisJICAgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCisJICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKKwkgICAgZmkKKwkgICAgOzsKKwkgICopCisJICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLUwnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzL29iamVjdHM6ICRkZXBsaWIiIDE+JjIKKwkgICAgOzsKKwkgIGVzYWMgIyBsaW5rbW9kZQorCSAgY29udGludWUKKwkgIDs7ICMgLUwKKwktUiopCisJICBpZiB0ZXN0ICRwYXNzID0gbGluazsgdGhlbgorCSAgICBkaXI9YCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLVIvLydgCisJICAgICMgTWFrZSBzdXJlIHRoZSB4cnBhdGggY29udGFpbnMgb25seSB1bmlxdWUgZGlyZWN0b3JpZXMuCisJICAgIGNhc2UgIiR4cnBhdGggIiBpbgorCSAgICAqIiAkZGlyICIqKSA7OworCSAgICAqKSB4cnBhdGg9IiR4cnBhdGggJGRpciIgOzsKKwkgICAgZXNhYworCSAgZmkKKwkgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICBjb250aW51ZQorCSAgOzsKKwkqLmxhKSBsaWI9IiRkZXBsaWIiIDs7CisJKi4kbGliZXh0KQorCSAgaWYgdGVzdCAkcGFzcyA9IGNvbnY7IHRoZW4KKwkgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgY29udGludWUKKwkgIGZpCisJICBjYXNlICRsaW5rbW9kZSBpbgorCSAgbGliKQorCSAgICBpZiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCisJICAgICAgZWNobworCSAgICAgIGVjaG8gIioqKiBXYXJuaW5nOiBUaGlzIGxpYnJhcnkgbmVlZHMgc29tZSBmdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5ICRkZXBsaWIuIgorCSAgICAgIGVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCisJICAgICAgZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkgICAgICBlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUuIgorCSAgICBlbHNlCisJICAgICAgZWNobworCSAgICAgIGVjaG8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBzaGFyZWQgbGlicmFyeSAkb3V0cHV0IGFnYWluc3QgdGhlIgorCSAgICAgIGVjaG8gIioqKiBzdGF0aWMgbGlicmFyeSAkZGVwbGliIGlzIG5vdCBwb3J0YWJsZSEiCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgZmkKKwkgICAgY29udGludWUKKwkgICAgOzsKKwkgIHByb2cpCisJICAgIGlmIHRlc3QgJHBhc3MgIT0gbGluazsgdGhlbgorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIGVsc2UKKwkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBmaQorCSAgICBjb250aW51ZQorCSAgICA7OworCSAgZXNhYyAjIGxpbmttb2RlCisJICA7OyAjICouJGxpYmV4dAorCSoubG8gfCAqLiRvYmpleHQpCisJICBpZiB0ZXN0ICRwYXNzID0gZGxwcmVvcGVuIHx8IHRlc3QgIiRkbG9wZW5fc3VwcG9ydCIgIT0geWVzIHx8IHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbm87IHRoZW4KKwkgICAgIyBJZiB0aGVyZSBpcyBubyBkbG9wZW4gc3VwcG9ydCBvciB3ZSdyZSBsaW5raW5nIHN0YXRpY2FsbHksCisJICAgICMgd2UgbmVlZCB0byBwcmVsb2FkLgorCSAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkZGVwbGliIgorCSAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKKwkgIGVsc2UKKwkgICAgbmV3ZGxmaWxlcz0iJG5ld2RsZmlsZXMgJGRlcGxpYiIKKwkgIGZpCisJICBjb250aW51ZQorCSAgOzsKKwklREVQTElCUyUpCisJICBhbGxkZXBsaWJzPXllcworCSAgY29udGludWUKKwkgIDs7CisJZXNhYyAjIGNhc2UgJGRlcGxpYgorCWlmIHRlc3QgJGZvdW5kID0geWVzIHx8IHRlc3QgLWYgIiRsaWIiOyB0aGVuIDoKKwllbHNlCisJICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCB0aGUgbGlicmFyeSBcYCRsaWInIiAxPiYyCisJICBleGl0IDEKKwlmaQorCisJIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KKwlpZiAoc2VkIC1lICcycScgJGxpYiB8IGVncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisJZWxzZQorCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKKwkgIGV4aXQgMQorCWZpCisKKwlsYWRpcj1gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisJdGVzdCAiWCRsYWRpciIgPSAiWCRsaWIiICYmIGxhZGlyPSIuIgorCisJZGxuYW1lPQorCWRsb3Blbj0KKwlkbHByZW9wZW49CisJbGliZGlyPQorCWxpYnJhcnlfbmFtZXM9CisJb2xkX2xpYnJhcnk9CisJIyBJZiB0aGUgbGlicmFyeSB3YXMgaW5zdGFsbGVkIHdpdGggYW4gb2xkIHJlbGVhc2Ugb2YgbGlidG9vbCwKKwkjIGl0IHdpbGwgbm90IHJlZGVmaW5lIHZhcmlhYmxlIGluc3RhbGxlZC4KKwlpbnN0YWxsZWQ9eWVzCisKKwkjIFJlYWQgdGhlIC5sYSBmaWxlCisJY2FzZSAkbGliIGluCisJKi8qIHwgKlxcKikgLiAkbGliIDs7CisJKikgLiAuLyRsaWIgOzsKKwllc2FjCisKKwlpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gImxpYixsaW5rIiB8fAorCSAgIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxzY2FuIiB8fAorCSAgIHsgdGVzdCAkbGlua21vZGUgPSBvbGRsaWIgJiYgdGVzdCAkbGlua21vZGUgPSBvYmo7IH07IHRoZW4KKwkgICAjIEFkZCBkbFtwcmVdb3BlbmVkIGZpbGVzIG9mIGRlcGxpYgorCSAgdGVzdCAtbiAiJGRsb3BlbiIgJiYgZGxmaWxlcz0iJGRsZmlsZXMgJGRsb3BlbiIKKwkgIHRlc3QgLW4gIiRkbHByZW9wZW4iICYmIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRkbHByZW9wZW4iCisJZmkKKworCWlmIHRlc3QgJHBhc3MgPSBjb252OyB0aGVuCisJICAjIE9ubHkgY2hlY2sgZm9yIGNvbnZlbmllbmNlIGxpYnJhcmllcworCSAgZGVwbGlicz0iJGxpYiAkZGVwbGlicyIKKwkgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCisJICAgIGlmIHRlc3QgLXogIiRvbGRfbGlicmFyeSI7IHRoZW4KKwkgICAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBuYW1lIG9mIGxpbmsgbGlicmFyeSBmb3IgXGAkbGliJyIgMT4mMgorCSAgICAgIGV4aXQgMQorCSAgICBmaQorCSAgICAjIEl0IGlzIGEgbGlidG9vbCBjb252ZW5pZW5jZSBsaWJyYXJ5LCBzbyBhZGQgaW4gaXRzIG9iamVjdHMuCisJICAgIGNvbnZlbmllbmNlPSIkY29udmVuaWVuY2UgJGxhZGlyLyRvYmpkaXIvJG9sZF9saWJyYXJ5IgorCSAgICBvbGRfY29udmVuaWVuY2U9IiRvbGRfY29udmVuaWVuY2UgJGxhZGlyLyRvYmpkaXIvJG9sZF9saWJyYXJ5IgorCSAgICB0bXBfbGlicz0KKwkgICAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgICAgY2FzZSAiJHRtcF9saWJzICIgaW4KKwkgICAgICAqIiAkZGVwbGliICIqKSBzcGVjaWFsZGVwbGlicz0iJHNwZWNpYWxkZXBsaWJzICRkZXBsaWIiIDs7CisJICAgICAgZXNhYworCSAgICAgIHRtcF9saWJzPSIkdG1wX2xpYnMgJGRlcGxpYiIKKwkgICAgZG9uZQorCSAgZWxpZiB0ZXN0ICRsaW5rbW9kZSAhPSBwcm9nICYmIHRlc3QgJGxpbmttb2RlICE9IGxpYjsgdGhlbgorCSAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCRsaWInIGlzIG5vdCBhIGNvbnZlbmllbmNlIGxpYnJhcnkiIDE+JjIKKwkgICAgZXhpdCAxCisJICBmaQorCSAgY29udGludWUKKwlmaSAjICRwYXNzID0gY29udgorCisJIyBHZXQgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgd2UgbGluayBhZ2FpbnN0LgorCWxpbmtsaWI9CisJZm9yIGwgaW4gJG9sZF9saWJyYXJ5ICRsaWJyYXJ5X25hbWVzOyBkbworCSAgbGlua2xpYj0iJGwiCisJZG9uZQorCWlmIHRlc3QgLXogIiRsaW5rbGliIjsgdGhlbgorCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGZpbmQgbmFtZSBvZiBsaW5rIGxpYnJhcnkgZm9yIFxgJGxpYiciIDE+JjIKKwkgIGV4aXQgMQorCWZpCisKKwkjIFRoaXMgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRsb3Blbi4KKwlpZiB0ZXN0ICRwYXNzID0gZGxvcGVuOyB0aGVuCisJICBpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgorCSAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgLWRsb3BlbiBhIGNvbnZlbmllbmNlIGxpYnJhcnk6IFxgJGxpYiciIDE+JjIKKwkgICAgZXhpdCAxCisJICBmaQorCSAgaWYgdGVzdCAteiAiJGRsbmFtZSIgfHwgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiAhPSB5ZXMgfHwgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBubzsgdGhlbgorCSAgICAjIElmIHRoZXJlIGlzIG5vIGRsbmFtZSwgbm8gZGxvcGVuIHN1cHBvcnQgb3Igd2UncmUgbGlua2luZworCSAgICAjIHN0YXRpY2FsbHksIHdlIG5lZWQgdG8gcHJlbG9hZC4KKwkgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGxpYiIKKwkgIGVsc2UKKwkgICAgbmV3ZGxmaWxlcz0iJG5ld2RsZmlsZXMgJGxpYiIKKwkgIGZpCisJICBjb250aW51ZQorCWZpICMgJHBhc3MgPSBkbG9wZW4KKworCSMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgorCWNhc2UgJGxhZGlyIGluCisJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBhYnNfbGFkaXI9IiRsYWRpciIgOzsKKwkqKQorCSAgYWJzX2xhZGlyPWBjZCAiJGxhZGlyIiAmJiBwd2RgCisJICBpZiB0ZXN0IC16ICIkYWJzX2xhZGlyIjsgdGhlbgorCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgZGV0ZXJtaW5lIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIG9mIFxgJGxhZGlyJyIgMT4mMgorCSAgICAkZWNobyAiJG1vZGVuYW1lOiBwYXNzaW5nIGl0IGxpdGVyYWxseSB0byB0aGUgbGlua2VyLCBhbHRob3VnaCBpdCBtaWdodCBmYWlsIiAxPiYyCisJICAgIGFic19sYWRpcj0iJGxhZGlyIgorCSAgZmkKKwkgIDs7CisJZXNhYworCWxhbmFtZT1gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisKKwkjIEZpbmQgdGhlIHJlbGV2YW50IG9iamVjdCBkaXJlY3RvcnkgYW5kIGxpYnJhcnkgbmFtZS4KKwlpZiB0ZXN0ICJYJGluc3RhbGxlZCIgPSBYeWVzOyB0aGVuCisJICBpZiB0ZXN0ICEgLWYgIiRsaWJkaXIvJGxpbmtsaWIiICYmIHRlc3QgLWYgIiRhYnNfbGFkaXIvJGxpbmtsaWIiOyB0aGVuCisJICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGxpYnJhcnkgXGAkbGliJyB3YXMgbW92ZWQuIiAxPiYyCisJICAgIGRpcj0iJGxhZGlyIgorCSAgICBhYnNkaXI9IiRhYnNfbGFkaXIiCisJICAgIGxpYmRpcj0iJGFic19sYWRpciIKKwkgIGVsc2UKKwkgICAgZGlyPSIkbGliZGlyIgorCSAgICBhYnNkaXI9IiRsaWJkaXIiCisJICBmaQorCWVsc2UKKwkgIGRpcj0iJGxhZGlyLyRvYmpkaXIiCisJICBhYnNkaXI9IiRhYnNfbGFkaXIvJG9iamRpciIKKwkgICMgUmVtb3ZlIHRoaXMgc2VhcmNoIHBhdGggbGF0ZXIKKwkgIG5vdGluc3RfcGF0aD0iJG5vdGluc3RfcGF0aCAkYWJzX2xhZGlyIgorCWZpICMgJGluc3RhbGxlZCA9IHllcworCW5hbWU9YCRlY2hvICJYJGxhbmFtZSIgfCAkWHNlZCAtZSAncy9cLmxhJC8vJyAtZSAncy9ebGliLy8nYAorCisJIyBUaGlzIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbHByZW9wZW4uCisJaWYgdGVzdCAkcGFzcyA9IGRscHJlb3BlbjsgdGhlbgorCSAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IC1kbHByZW9wZW4gYSBjb252ZW5pZW5jZSBsaWJyYXJ5OiBcYCRsaWInIiAxPiYyCisJICAgIGV4aXQgMQorCSAgZmkKKwkgICMgUHJlZmVyIHVzaW5nIGEgc3RhdGljIGxpYnJhcnkgKHNvIHRoYXQgbm8gc2lsbHkgX0RZTkFNSUMgc3ltYm9scworCSAgIyBhcmUgcmVxdWlyZWQgdG8gbGluaykuCisJICBpZiB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiOyB0aGVuCisJICAgIG5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRkaXIvJG9sZF9saWJyYXJ5IgorCSAgIyBPdGhlcndpc2UsIHVzZSB0aGUgZGxuYW1lLCBzbyB0aGF0IGx0X2Rsb3BlbiBmaW5kcyBpdC4KKwkgIGVsaWYgdGVzdCAtbiAiJGRsbmFtZSI7IHRoZW4KKwkgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGRpci8kZGxuYW1lIgorCSAgZWxzZQorCSAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkZGlyLyRsaW5rbGliIgorCSAgZmkKKwlmaSAjICRwYXNzID0gZGxwcmVvcGVuCisKKwlpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgorCSAgIyBMaW5rIHRoZSBjb252ZW5pZW5jZSBsaWJyYXJ5CisJICBpZiB0ZXN0ICRsaW5rbW9kZSA9IGxpYjsgdGhlbgorCSAgICBkZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkZGVwbGlicyIKKwkgIGVsaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCisJICAgIGNvbXBpbGVfZGVwbGlicz0iJGRpci8kb2xkX2xpYnJhcnkgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgZmluYWxpemVfZGVwbGlicz0iJGRpci8kb2xkX2xpYnJhcnkgJGZpbmFsaXplX2RlcGxpYnMiCisJICBlbHNlCisJICAgIGRlcGxpYnM9IiRsaWIgJGRlcGxpYnMiCisJICBmaQorCSAgY29udGludWUKKwlmaQorCisJaWYgdGVzdCAkbGlua21vZGUgPSBwcm9nICYmIHRlc3QgJHBhc3MgIT0gbGluazsgdGhlbgorCSAgbmV3bGliX3NlYXJjaF9wYXRoPSIkbmV3bGliX3NlYXJjaF9wYXRoICRsYWRpciIKKwkgIGRlcGxpYnM9IiRsaWIgJGRlcGxpYnMiCisKKwkgIGxpbmthbGxkZXBsaWJzPW5vCisJICBpZiB0ZXN0ICIkbGlua19hbGxfZGVwbGlicyIgIT0gbm8gfHwgdGVzdCAteiAiJGxpYnJhcnlfbmFtZXMiIHx8CisJICAgICB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG5vOyB0aGVuCisJICAgIGxpbmthbGxkZXBsaWJzPXllcworCSAgZmkKKworCSAgdG1wX2xpYnM9CisJICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAgIGNhc2UgJGRlcGxpYiBpbgorCSAgICAtTCopIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAiYCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncy9eLUwvLydgOzsgIyMjIHRlc3RzdWl0ZTogc2tpcCBuZXN0ZWQgcXVvdGluZyB0ZXN0CisJICAgIGVzYWMKKwkgICAgIyBOZWVkIHRvIGxpbmsgYWdhaW5zdCBhbGwgZGVwZW5kZW5jeV9saWJzPworCSAgICBpZiB0ZXN0ICRsaW5rYWxsZGVwbGlicyA9IHllczsgdGhlbgorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIGVsc2UKKwkgICAgICAjIE5lZWQgdG8gaGFyZGNvZGUgc2hhcmVkIGxpYnJhcnkgcGF0aHMKKwkgICAgICAjIG9yL2FuZCBsaW5rIGFnYWluc3Qgc3RhdGljIGxpYnJhcmllcworCSAgICAgIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgICBmaQorCSAgICBjYXNlICIkdG1wX2xpYnMgIiBpbgorCSAgICAqIiAkZGVwbGliICIqKSBzcGVjaWFsZGVwbGlicz0iJHNwZWNpYWxkZXBsaWJzICRkZXBsaWIiIDs7CisJICAgIGVzYWMKKwkgICAgdG1wX2xpYnM9IiR0bXBfbGlicyAkZGVwbGliIgorCSAgZG9uZSAjIGZvciBkZXBsaWIKKwkgIGNvbnRpbnVlCisJZmkgIyAkbGlua21vZGUgPSBwcm9nLi4uCisKKwlsaW5rX3N0YXRpYz1ubyAjIFdoZXRoZXIgdGhlIGRlcGxpYiB3aWxsIGJlIGxpbmtlZCBzdGF0aWNhbGx5CisJaWYgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiICYmCisJICAgeyB0ZXN0ICIkcHJlZmVyX3N0YXRpY19saWJzIiA9IG5vIHx8IHRlc3QgLXogIiRvbGRfbGlicmFyeSI7IH07IHRoZW4KKwkgICMgTGluayBhZ2FpbnN0IHRoaXMgc2hhcmVkIGxpYnJhcnkKKworCSAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiIHx8CisJICAgeyB0ZXN0ICRsaW5rbW9kZSA9IGxpYiAmJiB0ZXN0ICRoYXJkY29kZV9pbnRvX2xpYnMgPSB5ZXM7IH07IHRoZW4KKwkgICAgIyBIYXJkY29kZSB0aGUgbGlicmFyeSBwYXRoLgorCSAgICAjIFNraXAgZGlyZWN0b3JpZXMgdGhhdCBhcmUgaW4gdGhlIHN5c3RlbSBkZWZhdWx0IHJ1bi10aW1lCisJICAgICMgc2VhcmNoIHBhdGguCisJICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KKwkgICAgKiIgJGFic2RpciAiKikgOzsKKwkgICAgKikKKwkgICAgICBjYXNlICIkY29tcGlsZV9ycGF0aCAiIGluCisJICAgICAgKiIgJGFic2RpciAiKikgOzsKKwkgICAgICAqKSBjb21waWxlX3JwYXRoPSIkY29tcGlsZV9ycGF0aCAkYWJzZGlyIgorCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KKwkgICAgKiIgJGxpYmRpciAiKikgOzsKKwkgICAgKikKKwkgICAgICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgorCSAgICAgICoiICRsaWJkaXIgIiopIDs7CisJICAgICAgKikgZmluYWxpemVfcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCAkbGliZGlyIgorCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIGlmIHRlc3QgJGxpbmttb2RlID0gcHJvZzsgdGhlbgorCSAgICAgICMgV2UgbmVlZCB0byBoYXJkY29kZSB0aGUgbGlicmFyeSBwYXRoCisJICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCisJCSMgTWFrZSBzdXJlIHRoZSBycGF0aCBjb250YWlucyBvbmx5IHVuaXF1ZSBkaXJlY3Rvcmllcy4KKwkJY2FzZSAiJHRlbXBfcnBhdGggIiBpbgorCQkqIiAkZGlyICIqKSA7OworCQkqIiAkYWJzZGlyICIqKSA7OworCQkqKSB0ZW1wX3JwYXRoPSIkdGVtcF9ycGF0aCAkZGlyIiA7OworCQllc2FjCisJICAgICAgZmkKKwkgICAgZmkKKwkgIGZpICMgJGxpbmttb2RlLCRwYXNzID0gcHJvZyxsaW5rLi4uCisKKwkgIGlmIHRlc3QgIiRhbGxkZXBsaWJzIiA9IHllcyAmJgorCSAgICAgeyB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiID0gcGFzc19hbGwgfHwKKwkgICAgICAgeyB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJgorCQkgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiOyB9OyB9OyB0aGVuCisJICAgICMgV2Ugb25seSBuZWVkIHRvIHNlYXJjaCBmb3Igc3RhdGljIGxpYnJhcmllcworCSAgICBjb250aW51ZQorCSAgZmkKKworCSAgaWYgdGVzdCAiJGluc3RhbGxlZCIgPSBubzsgdGhlbgorCSAgICBub3RpbnN0X2RlcGxpYnM9IiRub3RpbnN0X2RlcGxpYnMgJGxpYiIKKwkgICAgbmVlZF9yZWxpbms9eWVzCisJICBmaQorCisJICBpZiB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMiOyB0aGVuCisJICAgICMgZmlndXJlIG91dCB0aGUgc29uYW1lCisJICAgIHNldCBkdW1teSAkbGlicmFyeV9uYW1lcworCSAgICByZWFsbmFtZT0iJDIiCisJICAgIHNoaWZ0OyBzaGlmdAorCSAgICBsaWJuYW1lPWBldmFsIFxcJGVjaG8gXCIkbGlibmFtZV9zcGVjXCJgCisJICAgICMgdXNlIGRsbmFtZSBpZiB3ZSBnb3QgaXQuIGl0J3MgcGVyZmVjdGx5IGdvb2QsIG5vPworCSAgICBpZiB0ZXN0IC1uICIkZGxuYW1lIjsgdGhlbgorCSAgICAgIHNvbmFtZT0iJGRsbmFtZSIKKwkgICAgZWxpZiB0ZXN0IC1uICIkc29uYW1lX3NwZWMiOyB0aGVuCisJICAgICAgIyBibGVoIHdpbmRvd3MKKwkgICAgICBjYXNlICRob3N0IGluCisJICAgICAgKmN5Z3dpbiopCisJCW1ham9yPWBleHByICRjdXJyZW50IC0gJGFnZWAKKwkJdmVyc3VmZml4PSItJG1ham9yIgorCQk7OworCSAgICAgIGVzYWMKKwkgICAgICBldmFsIHNvbmFtZT1cIiRzb25hbWVfc3BlY1wiCisJICAgIGVsc2UKKwkgICAgICBzb25hbWU9IiRyZWFsbmFtZSIKKwkgICAgZmkKKworCSAgICAjIE1ha2UgYSBuZXcgbmFtZSBmb3IgdGhlIGV4dHJhY3RfZXhwc3ltc19jbWRzIHRvIHVzZQorCSAgICBzb3Jvb3Q9IiRzb25hbWUiCisJICAgIHNvbmFtZT1gZWNobyAkc29yb290IHwgc2VkIC1lICdzL14uKlwvLy8nYAorCSAgICBuZXdsaWI9ImxpYmltcC1gZWNobyAkc29uYW1lIHwgc2VkICdzL15saWIvLztzL1wuZGxsJC8vJ2AuYSIKKworCSAgICAjIElmIHRoZSBsaWJyYXJ5IGhhcyBubyBleHBvcnQgbGlzdCwgdGhlbiBjcmVhdGUgb25lIG5vdworCSAgICBpZiB0ZXN0IC1mICIkb3V0cHV0X29iamRpci8kc29uYW1lLWRlZiI7IHRoZW4gOgorCSAgICBlbHNlCisJICAgICAgJHNob3cgImV4dHJhY3RpbmcgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBcYCRzb25hbWUnIgorCSAgICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JworCSAgICAgIGV2YWwgY21kcz1cIiRleHRyYWN0X2V4cHN5bXNfY21kc1wiCisJICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KKwkJSUZTPSIkc2F2ZV9pZnMiCisJCSRzaG93ICIkY21kIgorCQkkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KKwkgICAgICBkb25lCisJICAgICAgSUZTPSIkc2F2ZV9pZnMiCisJICAgIGZpCisKKwkgICAgIyBDcmVhdGUgJG5ld2xpYgorCSAgICBpZiB0ZXN0IC1mICIkb3V0cHV0X29iamRpci8kbmV3bGliIjsgdGhlbiA6OyBlbHNlCisJICAgICAgJHNob3cgImdlbmVyYXRpbmcgaW1wb3J0IGxpYnJhcnkgZm9yIFxgJHNvbmFtZSciCisJICAgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJICAgICAgZXZhbCBjbWRzPVwiJG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzXCIKKwkgICAgICBmb3IgY21kIGluICRjbWRzOyBkbworCQlJRlM9IiRzYXZlX2lmcyIKKwkJJHNob3cgIiRjbWQiCisJCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPworCSAgICAgIGRvbmUKKwkgICAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgZmkKKwkgICAgIyBtYWtlIHN1cmUgdGhlIGxpYnJhcnkgdmFyaWFibGVzIGFyZSBwb2ludGluZyB0byB0aGUgbmV3IGxpYnJhcnkKKwkgICAgZGlyPSRvdXRwdXRfb2JqZGlyCisJICAgIGxpbmtsaWI9JG5ld2xpYgorCSAgZmkgIyB0ZXN0IC1uICRvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcworCisJICBpZiB0ZXN0ICRsaW5rbW9kZSA9IHByb2cgfHwgdGVzdCAiJG1vZGUiICE9IHJlbGluazsgdGhlbgorCSAgICBhZGRfc2hsaWJwYXRoPQorCSAgICBhZGRfZGlyPQorCSAgICBhZGQ9CisJICAgIGxpYl9saW5rZWQ9eWVzCisJICAgIGNhc2UgJGhhcmRjb2RlX2FjdGlvbiBpbgorCSAgICBpbW1lZGlhdGUgfCB1bnN1cHBvcnRlZCkKKwkgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IG5vOyB0aGVuCisJCWFkZD0iJGRpci8kbGlua2xpYiIKKwkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IG5vOyB0aGVuCisJCWNhc2UgJGhvc3QgaW4KKwkJKi0qLXN1bm9zKikgYWRkX3NobGlicGF0aD0iJGRpciIgOzsKKwkJZXNhYworCQlhZGRfZGlyPSItTCRkaXIiCisJCWFkZD0iLWwkbmFtZSIKKwkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IG5vOyB0aGVuCisJCWFkZF9zaGxpYnBhdGg9IiRkaXIiCisJCWFkZD0iLWwkbmFtZSIKKwkgICAgICBlbHNlCisJCWxpYl9saW5rZWQ9bm8KKwkgICAgICBmaQorCSAgICAgIDs7CisJICAgIHJlbGluaykKKwkgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IHllczsgdGhlbgorCQlhZGQ9IiRkaXIvJGxpbmtsaWIiCisJICAgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSB5ZXM7IHRoZW4KKwkJYWRkX2Rpcj0iLUwkZGlyIgorCQlhZGQ9Ii1sJG5hbWUiCisJICAgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSB5ZXM7IHRoZW4KKwkJYWRkX3NobGlicGF0aD0iJGRpciIKKwkJYWRkPSItbCRuYW1lIgorCSAgICAgIGVsc2UKKwkJbGliX2xpbmtlZD1ubworCSAgICAgIGZpCisJICAgICAgOzsKKwkgICAgKikgbGliX2xpbmtlZD1ubyA7OworCSAgICBlc2FjCisKKwkgICAgaWYgdGVzdCAiJGxpYl9saW5rZWQiICE9IHllczsgdGhlbgorCSAgICAgICRlY2hvICIkbW9kZW5hbWU6IGNvbmZpZ3VyYXRpb24gZXJyb3I6IHVuc3VwcG9ydGVkIGhhcmRjb2RlIHByb3BlcnRpZXMiCisJICAgICAgZXhpdCAxCisJICAgIGZpCisKKwkgICAgaWYgdGVzdCAtbiAiJGFkZF9zaGxpYnBhdGgiOyB0aGVuCisJICAgICAgY2FzZSA6JGNvbXBpbGVfc2hsaWJwYXRoOiBpbgorCSAgICAgICoiOiRhZGRfc2hsaWJwYXRoOiIqKSA7OworCSAgICAgICopIGNvbXBpbGVfc2hsaWJwYXRoPSIkY29tcGlsZV9zaGxpYnBhdGgkYWRkX3NobGlicGF0aDoiIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgICBpZiB0ZXN0ICRsaW5rbW9kZSA9IHByb2c7IHRoZW4KKwkgICAgICB0ZXN0IC1uICIkYWRkX2RpciIgJiYgY29tcGlsZV9kZXBsaWJzPSIkYWRkX2RpciAkY29tcGlsZV9kZXBsaWJzIgorCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGNvbXBpbGVfZGVwbGlicz0iJGFkZCAkY29tcGlsZV9kZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgdGVzdCAtbiAiJGFkZF9kaXIiICYmIGRlcGxpYnM9IiRhZGRfZGlyICRkZXBsaWJzIgorCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGRlcGxpYnM9IiRhZGQgJGRlcGxpYnMiCisJICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0geWVzICYmIFwKKwkJIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiAhPSB5ZXMgJiYgXAorCQkgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCisJCWNhc2UgOiRmaW5hbGl6ZV9zaGxpYnBhdGg6IGluCisJCSoiOiRsaWJkaXI6IiopIDs7CisJCSopIGZpbmFsaXplX3NobGlicGF0aD0iJGZpbmFsaXplX3NobGlicGF0aCRsaWJkaXI6IiA7OworCQllc2FjCisJICAgICAgZmkKKwkgICAgZmkKKwkgIGZpCisKKwkgIGlmIHRlc3QgJGxpbmttb2RlID0gcHJvZyB8fCB0ZXN0ICIkbW9kZSIgPSByZWxpbms7IHRoZW4KKwkgICAgYWRkX3NobGlicGF0aD0KKwkgICAgYWRkX2Rpcj0KKwkgICAgYWRkPQorCSAgICAjIEZpbmFsaXplIGNvbW1hbmQgZm9yIGJvdGggaXMgc2ltcGxlOiBqdXN0IGhhcmRjb2RlIGl0LgorCSAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IHllczsgdGhlbgorCSAgICAgIGFkZD0iJGxpYmRpci8kbGlua2xpYiIKKwkgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSB5ZXM7IHRoZW4KKwkgICAgICBhZGRfZGlyPSItTCRsaWJkaXIiCisJICAgICAgYWRkPSItbCRuYW1lIgorCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgorCSAgICAgIGNhc2UgOiRmaW5hbGl6ZV9zaGxpYnBhdGg6IGluCisJICAgICAgKiI6JGxpYmRpcjoiKikgOzsKKwkgICAgICAqKSBmaW5hbGl6ZV9zaGxpYnBhdGg9IiRmaW5hbGl6ZV9zaGxpYnBhdGgkbGliZGlyOiIgOzsKKwkgICAgICBlc2FjCisJICAgICAgYWRkPSItbCRuYW1lIgorCSAgICBlbHNlCisJICAgICAgIyBXZSBjYW5ub3Qgc2VlbSB0byBoYXJkY29kZSBpdCwgZ3Vlc3Mgd2UnbGwgZmFrZSBpdC4KKwkgICAgICBpZiB0ZXN0ICJYJGluc3RhbGxlZCIgPSBYeWVzOyB0aGVuCisJICAgICAgICBhZGRfZGlyPSItTCRsaWJkaXIiCisJICAgICAgZWxzZQorCSAgICAgICAgYWRkX2Rpcj0iLUwkREVTVERJUiRsaWJkaXIiCisJICAgICAgZmkKKwkgICAgICBhZGQ9Ii1sJG5hbWUiCisJICAgIGZpCisKKwkgICAgaWYgdGVzdCAkbGlua21vZGUgPSBwcm9nOyB0aGVuCisJICAgICAgdGVzdCAtbiAiJGFkZF9kaXIiICYmIGZpbmFsaXplX2RlcGxpYnM9IiRhZGRfZGlyICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGZpbmFsaXplX2RlcGxpYnM9IiRhZGQgJGZpbmFsaXplX2RlcGxpYnMiCisJICAgIGVsc2UKKwkgICAgICB0ZXN0IC1uICIkYWRkX2RpciIgJiYgZGVwbGlicz0iJGFkZF9kaXIgJGRlcGxpYnMiCisJICAgICAgdGVzdCAtbiAiJGFkZCIgJiYgZGVwbGlicz0iJGFkZCAkZGVwbGlicyIKKwkgICAgZmkKKwkgIGZpCisJZWxpZiB0ZXN0ICRsaW5rbW9kZSA9IHByb2c7IHRoZW4KKwkgIGlmIHRlc3QgIiRhbGxkZXBsaWJzIiA9IHllcyAmJgorCSAgICAgeyB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiID0gcGFzc19hbGwgfHwKKwkgICAgICAgeyB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJgorCQkgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiOyB9OyB9OyB0aGVuCisJICAgICMgV2Ugb25seSBuZWVkIHRvIHNlYXJjaCBmb3Igc3RhdGljIGxpYnJhcmllcworCSAgICBjb250aW51ZQorCSAgZmkKKworCSAgIyBUcnkgdG8gbGluayB0aGUgc3RhdGljIGxpYnJhcnkKKwkgICMgSGVyZSB3ZSBhc3N1bWUgdGhhdCBvbmUgb2YgaGFyZGNvZGVfZGlyZWN0IG9yIGhhcmRjb2RlX21pbnVzX0wKKwkgICMgaXMgbm90IHVuc3VwcG9ydGVkLiAgVGhpcyBpcyB2YWxpZCBvbiBhbGwga25vd24gc3RhdGljIGFuZAorCSAgIyBzaGFyZWQgcGxhdGZvcm1zLgorCSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0gdW5zdXBwb3J0ZWQ7IHRoZW4KKwkgICAgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBsaW5rbGliPSIkb2xkX2xpYnJhcnkiCisJICAgIGNvbXBpbGVfZGVwbGlicz0iJGRpci8kbGlua2xpYiAkY29tcGlsZV9kZXBsaWJzIgorCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGlyLyRsaW5rbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgZWxzZQorCSAgICBjb21waWxlX2RlcGxpYnM9Ii1sJG5hbWUgLUwkZGlyICRjb21waWxlX2RlcGxpYnMiCisJICAgIGZpbmFsaXplX2RlcGxpYnM9Ii1sJG5hbWUgLUwkZGlyICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgZmkKKwllbGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisJICAjIE5vdCBhIHNoYXJlZCBsaWJyYXJ5CisJICBpZiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCisJICAgICMgV2UncmUgdHJ5aW5nIGxpbmsgYSBzaGFyZWQgbGlicmFyeSBhZ2FpbnN0IGEgc3RhdGljIG9uZQorCSAgICAjIGJ1dCB0aGUgc3lzdGVtIGRvZXNuJ3Qgc3VwcG9ydCBpdC4KKworCSAgICAjIEp1c3QgcHJpbnQgYSB3YXJuaW5nIGFuZCBhZGQgdGhlIGxpYnJhcnkgdG8gZGVwZW5kZW5jeV9saWJzIHNvCisJICAgICMgdGhhdCB0aGUgcHJvZ3JhbSBjYW4gYmUgbGlua2VkIGFnYWluc3QgdGhlIHN0YXRpYyBsaWJyYXJ5LgorCSAgICBlY2hvCisJICAgIGVjaG8gIioqKiBXYXJuaW5nOiBUaGlzIGxpYnJhcnkgbmVlZHMgc29tZSBmdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5ICRsaWIuIgorCSAgICBlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCSAgICBlY2hvICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgorCSAgICBlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUuIgorCSAgICBpZiB0ZXN0ICIkbW9kdWxlIiA9IHllczsgdGhlbgorCSAgICAgIGVjaG8gIioqKiBUaGVyZWZvcmUsIGxpYnRvb2wgd2lsbCBjcmVhdGUgYSBzdGF0aWMgbW9kdWxlLCB0aGF0IHNob3VsZCB3b3JrICIKKwkgICAgICBlY2hvICIqKiogYXMgbG9uZyBhcyB0aGUgZGxvcGVuaW5nIGFwcGxpY2F0aW9uIGlzIGxpbmtlZCB3aXRoIHRoZSAtZGxvcGVuIGZsYWcuIgorCSAgICAgIGlmIHRlc3QgLXogIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCisJCWVjaG8KKwkJZWNobyAiKioqIEhvd2V2ZXIsIHRoaXMgd291bGQgb25seSB3b3JrIGlmIGxpYnRvb2wgd2FzIGFibGUgdG8gZXh0cmFjdCBzeW1ib2wiCisJCWVjaG8gIioqKiBsaXN0cyBmcm9tIGEgcHJvZ3JhbSwgdXNpbmcgXGBubScgb3IgZXF1aXZhbGVudCwgYnV0IGxpYnRvb2wgY291bGQiCisJCWVjaG8gIioqKiBub3QgZmluZCBzdWNoIGEgcHJvZ3JhbS4gIFNvLCB0aGlzIG1vZHVsZSBpcyBwcm9iYWJseSB1c2VsZXNzLiIKKwkJZWNobyAiKioqIFxgbm0nIGZyb20gR05VIGJpbnV0aWxzIGFuZCBhIGZ1bGwgcmVidWlsZCBtYXkgaGVscC4iCisJICAgICAgZmkKKwkgICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KKwkJYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQorCQlidWlsZF9vbGRfbGlicz15ZXMKKwkgICAgICBlbHNlCisJCWJ1aWxkX2xpYnRvb2xfbGlicz1ubworCSAgICAgIGZpCisJICAgIGZpCisJICBlbHNlCisJICAgIGNvbnZlbmllbmNlPSIkY29udmVuaWVuY2UgJGRpci8kb2xkX2xpYnJhcnkiCisJICAgIG9sZF9jb252ZW5pZW5jZT0iJG9sZF9jb252ZW5pZW5jZSAkZGlyLyRvbGRfbGlicmFyeSIKKwkgICAgZGVwbGlicz0iJGRpci8kb2xkX2xpYnJhcnkgJGRlcGxpYnMiCisJICAgIGxpbmtfc3RhdGljPXllcworCSAgZmkKKwlmaSAjIGxpbmsgc2hhcmVkL3N0YXRpYyBsaWJyYXJ5PworCisJaWYgdGVzdCAkbGlua21vZGUgPSBsaWI7IHRoZW4KKwkgIGlmIHRlc3QgLW4gIiRkZXBlbmRlbmN5X2xpYnMiICYmCisJICAgICB7IHRlc3QgJGhhcmRjb2RlX2ludG9fbGlicyAhPSB5ZXMgfHwgdGVzdCAkYnVpbGRfb2xkX2xpYnMgPSB5ZXMgfHwKKwkgICAgICAgdGVzdCAkbGlua19zdGF0aWMgPSB5ZXM7IH07IHRoZW4KKwkgICAgIyBFeHRyYWN0IC1SIGZyb20gZGVwZW5kZW5jeV9saWJzCisJICAgIHRlbXBfZGVwbGlicz0KKwkgICAgZm9yIGxpYmRpciBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICAgIGNhc2UgJGxpYmRpciBpbgorCSAgICAgIC1SKikgdGVtcF94cnBhdGg9YCRlY2hvICJYJGxpYmRpciIgfCAkWHNlZCAtZSAncy9eLVIvLydgCisJCSAgIGNhc2UgIiAkeHJwYXRoICIgaW4KKwkJICAgKiIgJHRlbXBfeHJwYXRoICIqKSA7OworCQkgICAqKSB4cnBhdGg9IiR4cnBhdGggJHRlbXBfeHJwYXRoIjs7CisJCSAgIGVzYWM7OworCSAgICAgICopIHRlbXBfZGVwbGlicz0iJHRlbXBfZGVwbGlicyAkbGliZGlyIjs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICAgIGRlcGVuZGVuY3lfbGlicz0iJHRlbXBfZGVwbGlicyIKKwkgIGZpCisKKwkgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkYWJzZGlyIgorCSAgIyBMaW5rIGFnYWluc3QgdGhpcyBsaWJyYXJ5CisJICB0ZXN0ICIkbGlua19zdGF0aWMiID0gbm8gJiYgbmV3ZGVwZW5kZW5jeV9saWJzPSIkYWJzX2xhZGlyLyRsYW5hbWUgJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkgICMgLi4uIGFuZCBpdHMgZGVwZW5kZW5jeV9saWJzCisJICB0bXBfbGlicz0KKwkgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KKwkgICAgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCisJICAgIGNhc2UgIiR0bXBfbGlicyAiIGluCisJICAgICoiICRkZXBsaWIgIiopIHNwZWNpYWxkZXBsaWJzPSIkc3BlY2lhbGRlcGxpYnMgJGRlcGxpYiIgOzsKKwkgICAgZXNhYworCSAgICB0bXBfbGlicz0iJHRtcF9saWJzICRkZXBsaWIiCisJICBkb25lCisKKwkgIGlmIHRlc3QgJGxpbmtfYWxsX2RlcGxpYnMgIT0gbm87IHRoZW4KKwkgICAgIyBBZGQgdGhlIHNlYXJjaCBwYXRocyBvZiBhbGwgZGVwZW5kZW5jeSBsaWJyYXJpZXMKKwkgICAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICAgIGNhc2UgJGRlcGxpYiBpbgorCSAgICAgIC1MKikgcGF0aD0iJGRlcGxpYiIgOzsKKwkgICAgICAqLmxhKQorCQlkaXI9YCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAorCQl0ZXN0ICJYJGRpciIgPSAiWCRkZXBsaWIiICYmIGRpcj0iLiIKKwkJIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCisJCWNhc2UgJGRpciBpbgorCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFic2Rpcj0iJGRpciIgOzsKKwkJKikKKwkJICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCisJCSAgaWYgdGVzdCAteiAiJGFic2RpciI7IHRoZW4KKwkJICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCBkZXRlcm1pbmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgb2YgXGAkZGlyJyIgMT4mMgorCQkgICAgYWJzZGlyPSIkZGlyIgorCQkgIGZpCisJCSAgOzsKKwkJZXNhYworCQlpZiBncmVwICJeaW5zdGFsbGVkPW5vIiAkZGVwbGliID4gL2Rldi9udWxsOyB0aGVuCisJCSAgcGF0aD0iLUwkYWJzZGlyLyRvYmpkaXIiCisJCWVsc2UKKwkJICBldmFsIGxpYmRpcj1gc2VkIC1uIC1lICdzL15saWJkaXI9XCguKlwpJC9cMS9wJyAkZGVwbGliYAorCQkgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCisJCSAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCRkZXBsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgorCQkgICAgZXhpdCAxCisJCSAgZmkKKwkJICBpZiB0ZXN0ICIkYWJzZGlyIiAhPSAiJGxpYmRpciI7IHRoZW4KKwkJICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgJGRlcGxpYicgc2VlbXMgdG8gYmUgbW92ZWQiIDE+JjIKKwkJICBmaQorCQkgIHBhdGg9Ii1MJGFic2RpciIKKwkJZmkKKwkJOzsKKwkgICAgICAqKSBjb250aW51ZSA7OworCSAgICAgIGVzYWMKKwkgICAgICBjYXNlICIgJGRlcGxpYnMgIiBpbgorCSAgICAgICoiICRwYXRoICIqKSA7OworCSAgICAgICopIGRlcGxpYnM9IiRkZXBsaWJzICRwYXRoIiA7OworCSAgICAgIGVzYWMKKwkgICAgZG9uZQorCSAgZmkgIyBsaW5rX2FsbF9kZXBsaWJzICE9IG5vCisJZmkgIyBsaW5rbW9kZSA9IGxpYgorICAgICAgZG9uZSAjIGZvciBkZXBsaWIgaW4gJGxpYnMKKyAgICAgIGlmIHRlc3QgJHBhc3MgPSBkbHByZW9wZW47IHRoZW4KKwkjIExpbmsgdGhlIGRscHJlb3BlbmVkIGxpYnJhcmllcyBiZWZvcmUgb3RoZXIgbGlicmFyaWVzCisJZm9yIGRlcGxpYiBpbiAkc2F2ZV9kZXBsaWJzOyBkbworCSAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwlkb25lCisgICAgICBmaQorICAgICAgaWYgdGVzdCAkcGFzcyAhPSBkbG9wZW47IHRoZW4KKwl0ZXN0ICRwYXNzICE9IHNjYW4gJiYgZGVwZW5kZW5jeV9saWJzPSIkbmV3ZGVwZW5kZW5jeV9saWJzIgorCWlmIHRlc3QgJHBhc3MgIT0gY29udjsgdGhlbgorCSAgIyBNYWtlIHN1cmUgbGliX3NlYXJjaF9wYXRoIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGRpcmVjdG9yaWVzLgorCSAgbGliX3NlYXJjaF9wYXRoPQorCSAgZm9yIGRpciBpbiAkbmV3bGliX3NlYXJjaF9wYXRoOyBkbworCSAgICBjYXNlICIkbGliX3NlYXJjaF9wYXRoICIgaW4KKwkgICAgKiIgJGRpciAiKikgOzsKKwkgICAgKikgbGliX3NlYXJjaF9wYXRoPSIkbGliX3NlYXJjaF9wYXRoICRkaXIiIDs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwkgIG5ld2xpYl9zZWFyY2hfcGF0aD0KKwlmaQorCisJaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiAhPSAicHJvZyxsaW5rIjsgdGhlbgorCSAgdmFycz0iZGVwbGlicyIKKwllbHNlCisJICB2YXJzPSJjb21waWxlX2RlcGxpYnMgZmluYWxpemVfZGVwbGlicyIKKwlmaQorCWZvciB2YXIgaW4gJHZhcnMgZGVwZW5kZW5jeV9saWJzOyBkbworCSAgIyBBZGQgbGlicmFyaWVzIHRvICR2YXIgaW4gcmV2ZXJzZSBvcmRlcgorCSAgZXZhbCB0bXBfbGlicz1cIlwkJHZhclwiCisJICBuZXdfbGlicz0KKwkgIGZvciBkZXBsaWIgaW4gJHRtcF9saWJzOyBkbworCSAgICBjYXNlICRkZXBsaWIgaW4KKwkgICAgLUwqKSBuZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiIDs7CisJICAgICopCisJICAgICAgY2FzZSAiICRzcGVjaWFsZGVwbGlicyAiIGluCisJICAgICAgKiIgJGRlcGxpYiAiKikgbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIiA7OworCSAgICAgICopCisJCWNhc2UgIiAkbmV3X2xpYnMgIiBpbgorCQkqIiAkZGVwbGliICIqKSA7OworCQkqKSBuZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiIDs7CisJCWVzYWMKKwkJOzsKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgZG9uZQorCSAgdG1wX2xpYnM9CisJICBmb3IgZGVwbGliIGluICRuZXdfbGliczsgZG8KKwkgICAgY2FzZSAkZGVwbGliIGluCisJICAgIC1MKikKKwkgICAgICBjYXNlICIgJHRtcF9saWJzICIgaW4KKwkgICAgICAqIiAkZGVwbGliICIqKSA7OworCSAgICAgICopIHRtcF9saWJzPSIkdG1wX2xpYnMgJGRlcGxpYiIgOzsKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgICAgKikgdG1wX2xpYnM9IiR0bXBfbGlicyAkZGVwbGliIiA7OworCSAgICBlc2FjCisJICBkb25lCisJICBldmFsICR2YXI9XCIkdG1wX2xpYnNcIgorCWRvbmUgIyBmb3IgdmFyCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHBhc3MiID0gImNvbnYiICYmCisgICAgICAgeyB0ZXN0ICIkbGlua21vZGUiID0gImxpYiIgfHwgdGVzdCAiJGxpbmttb2RlIiA9ICJwcm9nIjsgfTsgdGhlbgorCWxpYnM9IiRkZXBsaWJzIiAjIHJlc2V0IGxpYnMKKwlkZXBsaWJzPQorICAgICAgZmkKKyAgICBkb25lICMgZm9yIHBhc3MKKyAgICBpZiB0ZXN0ICRsaW5rbW9kZSA9IHByb2c7IHRoZW4KKyAgICAgIGRsZmlsZXM9IiRuZXdkbGZpbGVzIgorICAgICAgZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMiCisgICAgZmkKKworICAgIGNhc2UgJGxpbmttb2RlIGluCisgICAgb2xkbGliKQorICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkcnBhdGgiOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcnBhdGgnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkeHJwYXRoIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLVInIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcmVsZWFzZScgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgfHwgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWV4cG9ydC1zeW1ib2xzJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgorICAgICAgZmkKKworICAgICAgIyBOb3cgc2V0IHRoZSB2YXJpYWJsZXMgZm9yIGJ1aWxkaW5nIG9sZCBsaWJyYXJpZXMuCisgICAgICBidWlsZF9saWJ0b29sX2xpYnM9bm8KKyAgICAgIG9sZGxpYnM9IiRvdXRwdXQiCisgICAgICBvYmpzPSIkb2JqcyRvbGRfZGVwbGlicyIKKyAgICAgIDs7CisKKyAgICBsaWIpCisgICAgICAjIE1ha2Ugc3VyZSB3ZSBvbmx5IGdlbmVyYXRlIGxpYnJhcmllcyBvZiB0aGUgZm9ybSBgbGliTkFNRS5sYScuCisgICAgICBjYXNlICRvdXRwdXRuYW1lIGluCisgICAgICBsaWIqKQorCW5hbWU9YCRlY2hvICJYJG91dHB1dG5hbWUiIHwgJFhzZWQgLWUgJ3MvXC5sYSQvLycgLWUgJ3MvXmxpYi8vJ2AKKwlldmFsIGxpYm5hbWU9XCIkbGlibmFtZV9zcGVjXCIKKwk7OworICAgICAgKikKKwlpZiB0ZXN0ICIkbW9kdWxlIiA9IG5vOyB0aGVuCisJICAkZWNobyAiJG1vZGVuYW1lOiBsaWJ0b29sIGxpYnJhcnkgXGAkb3V0cHV0JyBtdXN0IGJlZ2luIHdpdGggXGBsaWInIiAxPiYyCisJICAkZWNobyAiJGhlbHAiIDE+JjIKKwkgIGV4aXQgMQorCWZpCisJaWYgdGVzdCAiJG5lZWRfbGliX3ByZWZpeCIgIT0gbm87IHRoZW4KKwkgICMgQWRkIHRoZSAibGliIiBwcmVmaXggZm9yIG1vZHVsZXMgaWYgcmVxdWlyZWQKKwkgIG5hbWU9YCRlY2hvICJYJG91dHB1dG5hbWUiIHwgJFhzZWQgLWUgJ3MvXC5sYSQvLydgCisJICBldmFsIGxpYm5hbWU9XCIkbGlibmFtZV9zcGVjXCIKKwllbHNlCisJICBsaWJuYW1lPWAkZWNobyAiWCRvdXRwdXRuYW1lIiB8ICRYc2VkIC1lICdzL1wubGEkLy8nYAorCWZpCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgaWYgdGVzdCAtbiAiJG9ianMiOyB0aGVuCisJaWYgdGVzdCAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiAhPSBwYXNzX2FsbDsgdGhlbgorCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGJ1aWxkIGxpYnRvb2wgbGlicmFyeSBcYCRvdXRwdXQnIGZyb20gbm9uLWxpYnRvb2wgb2JqZWN0cyBvbiB0aGlzIGhvc3Q6JG9ianMiIDI+JjEKKwkgIGV4aXQgMQorCWVsc2UKKwkgIGVjaG8KKwkgIGVjaG8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBzaGFyZWQgbGlicmFyeSAkb3V0cHV0IGFnYWluc3QgdGhlIG5vbi1saWJ0b29sIgorCSAgZWNobyAiKioqIG9iamVjdHMgJG9ianMgaXMgbm90IHBvcnRhYmxlISIKKwkgIGxpYm9ianM9IiRsaWJvYmpzICRvYmpzIgorCWZpCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkZGxzZWxmIiAhPSBubzsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWRsb3BlbiBzZWxmJyBpcyBpZ25vcmVkIGZvciBsaWJ0b29sIGxpYnJhcmllcyIgMT4mMgorICAgICAgZmkKKworICAgICAgc2V0IGR1bW15ICRycGF0aAorICAgICAgaWYgdGVzdCAkIyAtZ3QgMjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGlnbm9yaW5nIG11bHRpcGxlIFxgLXJwYXRoJ3MgZm9yIGEgbGlidG9vbCBsaWJyYXJ5IiAxPiYyCisgICAgICBmaQorICAgICAgaW5zdGFsbF9saWJkaXI9IiQyIgorCisgICAgICBvbGRsaWJzPQorICAgICAgaWYgdGVzdCAteiAiJHJwYXRoIjsgdGhlbgorCWlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisJICAjIEJ1aWxkaW5nIGEgbGlidG9vbCBjb252ZW5pZW5jZSBsaWJyYXJ5LgorCSAgbGliZXh0PWFsCisJICBvbGRsaWJzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0ICRvbGRsaWJzIgorCSAgYnVpbGRfbGlidG9vbF9saWJzPWNvbnZlbmllbmNlCisJICBidWlsZF9vbGRfbGlicz15ZXMKKwlmaQorCisJaWYgdGVzdCAtbiAiJHZpbmZvIjsgdGhlbgorCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBjb252ZW5pZW5jZSBsaWJyYXJpZXMiIDE+JjIKKwlmaQorCisJaWYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCisJICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBjb252ZW5pZW5jZSBsaWJyYXJpZXMiIDE+JjIKKwlmaQorICAgICAgZWxzZQorCisJIyBQYXJzZSB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhcmd1bWVudC4KKwlzYXZlX2lmcz0iJElGUyI7IElGUz0nOicKKwlzZXQgZHVtbXkgJHZpbmZvIDAgMCAwCisJSUZTPSIkc2F2ZV9pZnMiCisKKwlpZiB0ZXN0IC1uICIkOCI7IHRoZW4KKwkgICRlY2hvICIkbW9kZW5hbWU6IHRvbyBtYW55IHBhcmFtZXRlcnMgdG8gXGAtdmVyc2lvbi1pbmZvJyIgMT4mMgorCSAgJGVjaG8gIiRoZWxwIiAxPiYyCisJICBleGl0IDEKKwlmaQorCisJY3VycmVudD0iJDIiCisJcmV2aXNpb249IiQzIgorCWFnZT0iJDQiCisKKwkjIENoZWNrIHRoYXQgZWFjaCBvZiB0aGUgdGhpbmdzIGFyZSB2YWxpZCBudW1iZXJzLgorCWNhc2UgJGN1cnJlbnQgaW4KKwkwIHwgWzEtOV0gfCBbMS05XVswLTldIHwgWzEtOV1bMC05XVswLTldKSA7OworCSopCisJICAkZWNobyAiJG1vZGVuYW1lOiBDVVJSRU5UIFxgJGN1cnJlbnQnIGlzIG5vdCBhIG5vbm5lZ2F0aXZlIGludGVnZXIiIDE+JjIKKwkgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgorCSAgZXhpdCAxCisJICA7OworCWVzYWMKKworCWNhc2UgJHJldmlzaW9uIGluCisJMCB8IFsxLTldIHwgWzEtOV1bMC05XSB8IFsxLTldWzAtOV1bMC05XSkgOzsKKwkqKQorCSAgJGVjaG8gIiRtb2RlbmFtZTogUkVWSVNJT04gXGAkcmV2aXNpb24nIGlzIG5vdCBhIG5vbm5lZ2F0aXZlIGludGVnZXIiIDE+JjIKKwkgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgorCSAgZXhpdCAxCisJICA7OworCWVzYWMKKworCWNhc2UgJGFnZSBpbgorCTAgfCBbMS05XSB8IFsxLTldWzAtOV0gfCBbMS05XVswLTldWzAtOV0pIDs7CisJKikKKwkgICRlY2hvICIkbW9kZW5hbWU6IEFHRSBcYCRhZ2UnIGlzIG5vdCBhIG5vbm5lZ2F0aXZlIGludGVnZXIiIDE+JjIKKwkgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgorCSAgZXhpdCAxCisJICA7OworCWVzYWMKKworCWlmIHRlc3QgJGFnZSAtZ3QgJGN1cnJlbnQ7IHRoZW4KKwkgICRlY2hvICIkbW9kZW5hbWU6IEFHRSBcYCRhZ2UnIGlzIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBpbnRlcmZhY2UgbnVtYmVyIFxgJGN1cnJlbnQnIiAxPiYyCisJICAkZWNobyAiJG1vZGVuYW1lOiBcYCR2aW5mbycgaXMgbm90IHZhbGlkIHZlcnNpb24gaW5mb3JtYXRpb24iIDE+JjIKKwkgIGV4aXQgMQorCWZpCisKKwkjIENhbGN1bGF0ZSB0aGUgdmVyc2lvbiB2YXJpYWJsZXMuCisJbWFqb3I9CisJdmVyc3VmZml4PQorCXZlcnN0cmluZz0KKwljYXNlICR2ZXJzaW9uX3R5cGUgaW4KKwlub25lKSA7OworCisJZGFyd2luKQorCSAgIyBMaWtlIExpbnV4LCBidXQgd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIGF2YWlsYWJsZSBpbgorCSAgIyB2ZXJzdHJpbmcgZm9yIGNvZGluZyBpdCBpbnRvIHRoZSBsaWJyYXJ5IGhlYWRlcgorCSAgbWFqb3I9LmBleHByICRjdXJyZW50IC0gJGFnZWAKKwkgIHZlcnN1ZmZpeD0iJG1ham9yLiRhZ2UuJHJldmlzaW9uIgorCSAgIyBEYXJ3aW4gbGQgZG9lc24ndCBsaWtlIDAgZm9yIHRoZXNlIG9wdGlvbnMuLi4KKwkgIG1pbm9yX2N1cnJlbnQ9YGV4cHIgJGN1cnJlbnQgKyAxYAorCSAgdmVyc3RyaW5nPSItY29tcGF0aWJpbGl0eV92ZXJzaW9uICRtaW5vcl9jdXJyZW50IC1jdXJyZW50X3ZlcnNpb24gJG1pbm9yX2N1cnJlbnQuJHJldmlzaW9uIgorCSAgOzsKKworCWZyZWVic2QtYW91dCkKKwkgIG1ham9yPSIuJGN1cnJlbnQiCisJICB2ZXJzdWZmaXg9Ii4kY3VycmVudC4kcmV2aXNpb24iOworCSAgOzsKKworCWZyZWVic2QtZWxmKQorCSAgbWFqb3I9Ii4kY3VycmVudCIKKwkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50IjsKKwkgIDs7CisKKwlpcml4KQorCSAgbWFqb3I9YGV4cHIgJGN1cnJlbnQgLSAkYWdlICsgMWAKKwkgIHZlcnN0cmluZz0ic2dpJG1ham9yLiRyZXZpc2lvbiIKKworCSAgIyBBZGQgaW4gYWxsIHRoZSBpbnRlcmZhY2VzIHRoYXQgd2UgYXJlIGNvbXBhdGlibGUgd2l0aC4KKwkgIGxvb3A9JHJldmlzaW9uCisJICB3aGlsZSB0ZXN0ICRsb29wICE9IDA7IGRvCisJICAgIGlmYWNlPWBleHByICRyZXZpc2lvbiAtICRsb29wYAorCSAgICBsb29wPWBleHByICRsb29wIC0gMWAKKwkgICAgdmVyc3RyaW5nPSJzZ2kkbWFqb3IuJGlmYWNlOiR2ZXJzdHJpbmciCisJICBkb25lCisKKwkgICMgQmVmb3JlIHRoaXMgcG9pbnQsICRtYWpvciBtdXN0IG5vdCBjb250YWluIGAuJy4KKwkgIG1ham9yPS4kbWFqb3IKKwkgIHZlcnN1ZmZpeD0iJG1ham9yLiRyZXZpc2lvbiIKKwkgIDs7CisKKwlsaW51eCkKKwkgIG1ham9yPS5gZXhwciAkY3VycmVudCAtICRhZ2VgCisJICB2ZXJzdWZmaXg9IiRtYWpvci4kYWdlLiRyZXZpc2lvbiIKKwkgIDs7CisKKwlvc2YpCisJICBtYWpvcj1gZXhwciAkY3VycmVudCAtICRhZ2VgCisJICB2ZXJzdWZmaXg9Ii4kY3VycmVudC4kYWdlLiRyZXZpc2lvbiIKKwkgIHZlcnN0cmluZz0iJGN1cnJlbnQuJGFnZS4kcmV2aXNpb24iCisKKwkgICMgQWRkIGluIGFsbCB0aGUgaW50ZXJmYWNlcyB0aGF0IHdlIGFyZSBjb21wYXRpYmxlIHdpdGguCisJICBsb29wPSRhZ2UKKwkgIHdoaWxlIHRlc3QgJGxvb3AgIT0gMDsgZG8KKwkgICAgaWZhY2U9YGV4cHIgJGN1cnJlbnQgLSAkbG9vcGAKKwkgICAgbG9vcD1gZXhwciAkbG9vcCAtIDFgCisJICAgIHZlcnN0cmluZz0iJHZlcnN0cmluZzoke2lmYWNlfS4wIgorCSAgZG9uZQorCisJICAjIE1ha2UgZXhlY3V0YWJsZXMgZGVwZW5kIG9uIG91ciBjdXJyZW50IHZlcnNpb24uCisJICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmc6JHtjdXJyZW50fS4wIgorCSAgOzsKKworCXN1bm9zKQorCSAgbWFqb3I9Ii4kY3VycmVudCIKKwkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50LiRyZXZpc2lvbiIKKwkgIDs7CisKKwl3aW5kb3dzKQorCSAgIyBVc2UgJy0nIHJhdGhlciB0aGFuICcuJywgc2luY2Ugd2Ugb25seSB3YW50IG9uZQorCSAgIyBleHRlbnNpb24gb24gRE9TIDguMyBmaWxlc3lzdGVtcy4KKwkgIG1ham9yPWBleHByICRjdXJyZW50IC0gJGFnZWAKKwkgIHZlcnN1ZmZpeD0iLSRtYWpvciIKKwkgIDs7CisKKwkqKQorCSAgJGVjaG8gIiRtb2RlbmFtZTogdW5rbm93biBsaWJyYXJ5IHZlcnNpb24gdHlwZSBcYCR2ZXJzaW9uX3R5cGUnIiAxPiYyCisJICBlY2hvICJGYXRhbCBjb25maWd1cmF0aW9uIGVycm9yLiAgU2VlIHRoZSAkUEFDS0FHRSBkb2NzIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgMT4mMgorCSAgZXhpdCAxCisJICA7OworCWVzYWMKKworCSMgQ2xlYXIgdGhlIHZlcnNpb24gaW5mbyBpZiB3ZSBkZWZhdWx0ZWQsIGFuZCB0aGV5IHNwZWNpZmllZCBhIHJlbGVhc2UuCisJaWYgdGVzdCAteiAiJHZpbmZvIiAmJiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KKwkgIG1ham9yPQorCSAgdmVyc3RyaW5nPSIwLjAiCisJICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KKwkgIGRhcndpbikKKwkgICAgIyB3ZSBjYW4ndCBjaGVjayBmb3IgIjAuMCIgaW4gYXJjaGl2ZV9jbWRzIGR1ZSB0byBxdW90aW5nCisJICAgICMgcHJvYmxlbXMsIHNvIHdlIHJlc2V0IGl0IGNvbXBsZXRlbHkKKwkgICAgdmVyc3RyaW5nPSIiCisJICAgIDs7CisJICAqKQorCSAgICB2ZXJzdHJpbmc9IjAuMCIKKwkgICAgOzsKKwkgIGVzYWMKKwkgIGlmIHRlc3QgIiRuZWVkX3ZlcnNpb24iID0gbm87IHRoZW4KKwkgICAgdmVyc3VmZml4PQorCSAgZWxzZQorCSAgICB2ZXJzdWZmaXg9Ii4wLjAiCisJICBmaQorCWZpCisKKwkjIFJlbW92ZSB2ZXJzaW9uIGluZm8gZnJvbSBuYW1lIGlmIHZlcnNpb25pbmcgc2hvdWxkIGJlIGF2b2lkZWQKKwlpZiB0ZXN0ICIkYXZvaWRfdmVyc2lvbiIgPSB5ZXMgJiYgdGVzdCAiJG5lZWRfdmVyc2lvbiIgPSBubzsgdGhlbgorCSAgbWFqb3I9CisJICB2ZXJzdWZmaXg9CisJICB2ZXJzdHJpbmc9IiIKKwlmaQorCisJIyBDaGVjayB0byBzZWUgaWYgdGhlIGFyY2hpdmUgd2lsbCBoYXZlIHVuZGVmaW5lZCBzeW1ib2xzLgorCWlmIHRlc3QgIiRhbGxvd191bmRlZmluZWQiID0geWVzOyB0aGVuCisJICBpZiB0ZXN0ICIkYWxsb3dfdW5kZWZpbmVkX2ZsYWciID0gdW5zdXBwb3J0ZWQ7IHRoZW4KKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogdW5kZWZpbmVkIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gJGhvc3Qgc2hhcmVkIGxpYnJhcmllcyIgMT4mMgorCSAgICBidWlsZF9saWJ0b29sX2xpYnM9bm8KKwkgICAgYnVpbGRfb2xkX2xpYnM9eWVzCisJICBmaQorCWVsc2UKKwkgICMgRG9uJ3QgYWxsb3cgdW5kZWZpbmVkIHN5bWJvbHMuCisJICBhbGxvd191bmRlZmluZWRfZmxhZz0iJG5vX3VuZGVmaW5lZF9mbGFnIgorCWZpCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkbW9kZSIgIT0gcmVsaW5rOyB0aGVuCisJIyBSZW1vdmUgb3VyIG91dHB1dHMuCisJJHNob3cgIiR7cm19ciAkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSAkb3V0cHV0X29iamRpci8kbGlibmFtZS4qICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0ke3JlbGVhc2V9LioiCisJJHJ1biAke3JtfXIgJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuKiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9JHtyZWxlYXNlfS4qCisgICAgICBmaQorCisgICAgICAjIE5vdyBzZXQgdGhlIHZhcmlhYmxlcyBmb3IgYnVpbGRpbmcgb2xkIGxpYnJhcmllcy4KKyAgICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXMgJiYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0gY29udmVuaWVuY2UgOyB0aGVuCisJb2xkbGlicz0iJG9sZGxpYnMgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCIKKworCSMgVHJhbnNmb3JtIC5sbyBmaWxlcyB0byAubyBmaWxlcy4KKwlvbGRvYmpzPSIkb2JqcyAiYCRlY2hvICJYJGxpYm9ianMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgJy9cLicke2xpYmV4dH0nJC9kJyAtZSAiJGxvMm8iIHwgJE5MMlNQYAorICAgICAgZmkKKworICAgICAgIyBFbGltaW5hdGUgYWxsIHRlbXBvcmFyeSBkaXJlY3Rvcmllcy4KKyAgICAgIGZvciBwYXRoIGluICRub3RpbnN0X3BhdGg7IGRvCisJbGliX3NlYXJjaF9wYXRoPWBlY2hvICIkbGliX3NlYXJjaF9wYXRoICIgfCBzZWQgLWUgJ3MlICRwYXRoICUgJWcnYAorCWRlcGxpYnM9YGVjaG8gIiRkZXBsaWJzICIgfCBzZWQgLWUgJ3MlIC1MJHBhdGggJSAlZydgCisJZGVwZW5kZW5jeV9saWJzPWBlY2hvICIkZGVwZW5kZW5jeV9saWJzICIgfCBzZWQgLWUgJ3MlIC1MJHBhdGggJSAlZydgCisgICAgICBkb25lCisKKyAgICAgIGlmIHRlc3QgLW4gIiR4cnBhdGgiOyB0aGVuCisJIyBJZiB0aGUgdXNlciBzcGVjaWZpZWQgYW55IHJwYXRoIGZsYWdzLCB0aGVuIGFkZCB0aGVtLgorCXRlbXBfeHJwYXRoPQorCWZvciBsaWJkaXIgaW4gJHhycGF0aDsgZG8KKwkgIHRlbXBfeHJwYXRoPSIkdGVtcF94cnBhdGggLVIkbGliZGlyIgorCSAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KKwkgICoiICRsaWJkaXIgIiopIDs7CisJICAqKSBmaW5hbGl6ZV9ycGF0aD0iJGZpbmFsaXplX3JwYXRoICRsaWJkaXIiIDs7CisJICBlc2FjCisJZG9uZQorCWlmIHRlc3QgJGhhcmRjb2RlX2ludG9fbGlicyAhPSB5ZXMgfHwgdGVzdCAkYnVpbGRfb2xkX2xpYnMgPSB5ZXM7IHRoZW4KKwkgIGRlcGVuZGVuY3lfbGlicz0iJHRlbXBfeHJwYXRoICRkZXBlbmRlbmN5X2xpYnMiCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgTWFrZSBzdXJlIGRsZmlsZXMgY29udGFpbnMgb25seSB1bmlxdWUgZmlsZXMgdGhhdCB3b24ndCBiZSBkbHByZW9wZW5lZAorICAgICAgb2xkX2RsZmlsZXM9IiRkbGZpbGVzIgorICAgICAgZGxmaWxlcz0KKyAgICAgIGZvciBsaWIgaW4gJG9sZF9kbGZpbGVzOyBkbworCWNhc2UgIiAkZGxwcmVmaWxlcyAkZGxmaWxlcyAiIGluCisJKiIgJGxpYiAiKikgOzsKKwkqKSBkbGZpbGVzPSIkZGxmaWxlcyAkbGliIiA7OworCWVzYWMKKyAgICAgIGRvbmUKKworICAgICAgIyBNYWtlIHN1cmUgZGxwcmVmaWxlcyBjb250YWlucyBvbmx5IHVuaXF1ZSBmaWxlcworICAgICAgb2xkX2RscHJlZmlsZXM9IiRkbHByZWZpbGVzIgorICAgICAgZGxwcmVmaWxlcz0KKyAgICAgIGZvciBsaWIgaW4gJG9sZF9kbHByZWZpbGVzOyBkbworCWNhc2UgIiRkbHByZWZpbGVzICIgaW4KKwkqIiAkbGliICIqKSA7OworCSopIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRsaWIiIDs7CisJZXNhYworICAgICAgZG9uZQorCisgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorCWlmIHRlc3QgLW4gIiRycGF0aCI7IHRoZW4KKwkgIGNhc2UgJGhvc3QgaW4KKwkgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqIHwgKi0qLWJlb3MqKQorCSAgICAjIHRoZXNlIHN5c3RlbXMgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhIGMgbGlicmFyeSAoYXMgc3VjaCkhCisJICAgIDs7CisJICAqLSotcmhhcHNvZHkqIHwgKi0qLWRhcndpbjEuWzAxMl0pCisJICAgICMgUmhhcHNvZHkgQyBsaWJyYXJ5IGlzIGluIHRoZSBTeXN0ZW0gZnJhbWV3b3JrCisJICAgIGRlcGxpYnM9IiRkZXBsaWJzIC1mcmFtZXdvcmsgU3lzdGVtIgorCSAgICA7OworCSAgKi0qLW5ldGJzZCopCisJICAgICMgRG9uJ3QgbGluayB3aXRoIGxpYmMgdW50aWwgdGhlIGEub3V0IGxkLnNvIGlzIGZpeGVkLgorCSAgICA7OworCSAgKi0qLW9wZW5ic2QqKQorCSAgICAjIERvIG5vdCBpbmNsdWRlIGxpYmMgZHVlIHRvIHVzIGhhdmluZyBsaWJjL2xpYmNfci4KKwkgICAgOzsKKwkgICopCisJICAgICMgQWRkIGxpYmMgdG8gZGVwbGlicyBvbiBhbGwgb3RoZXIgc3lzdGVtcyBpZiBuZWNlc3NhcnkuCisJICAgIGlmIHRlc3QgJGJ1aWxkX2xpYnRvb2xfbmVlZF9sYyA9ICJ5ZXMiOyB0aGVuCisJICAgICAgZGVwbGlicz0iJGRlcGxpYnMgLWxjIgorCSAgICBmaQorCSAgICA7OworCSAgZXNhYworCWZpCisKKwkjIFRyYW5zZm9ybSBkZXBsaWJzIGludG8gb25seSBkZXBsaWJzIHRoYXQgY2FuIGJlIGxpbmtlZCBpbiBzaGFyZWQuCisJbmFtZV9zYXZlPSRuYW1lCisJbGlibmFtZV9zYXZlPSRsaWJuYW1lCisJcmVsZWFzZV9zYXZlPSRyZWxlYXNlCisJdmVyc3VmZml4X3NhdmU9JHZlcnN1ZmZpeAorCW1ham9yX3NhdmU9JG1ham9yCisJIyBJJ20gbm90IHN1cmUgaWYgSSdtIHRyZWF0aW5nIHRoZSByZWxlYXNlIGNvcnJlY3RseS4gIEkgdGhpbmsKKwkjIHJlbGVhc2Ugc2hvdWxkIHNob3cgdXAgaW4gdGhlIC1sIChpZSAtbGdtcDUpIHNvIHdlIGRvbid0IHdhbnQgdG8KKwkjIGFkZCBpdCBpbiB0d2ljZS4gIElzIHRoYXQgY29ycmVjdD8KKwlyZWxlYXNlPSIiCisJdmVyc3VmZml4PSIiCisJbWFqb3I9IiIKKwluZXdkZXBsaWJzPQorCWRyb3BwZWRkZXBzPW5vCisJY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KKwlwYXNzX2FsbCkKKwkgICMgRG9uJ3QgY2hlY2sgZm9yIHNoYXJlZC9zdGF0aWMuICBFdmVyeXRoaW5nIHdvcmtzLgorCSAgIyBUaGlzIG1pZ2h0IGJlIGEgbGl0dGxlIG5haXZlLiAgV2UgbWlnaHQgd2FudCB0byBjaGVjaworCSAgIyB3aGV0aGVyIHRoZSBsaWJyYXJ5IGV4aXN0cyBvciBub3QuICBCdXQgdGhpcyBpcyBvbgorCSAgIyBvc2YzICYgb3NmNCBhbmQgSSdtIG5vdCByZWFsbHkgc3VyZS4uLiBKdXN0CisJICAjIGltcGxlbWVudGluZyB3aGF0IHdhcyBhbHJlYWR5IHRoZSBiZWhhdmlvdXIuCisJICBuZXdkZXBsaWJzPSRkZXBsaWJzCisJICA7OworCXRlc3RfY29tcGlsZSkKKwkgICMgVGhpcyBjb2RlIHN0cmVzc2VzIHRoZSAibGlicmFyaWVzIGFyZSBwcm9ncmFtcyIgcGFyYWRpZ20gdG8gaXRzCisJICAjIGxpbWl0cy4gTWF5YmUgZXZlbiBicmVha3MgaXQuICBXZSBjb21waWxlIGEgcHJvZ3JhbSwgbGlua2luZyBpdAorCSAgIyBhZ2FpbnN0IHRoZSBkZXBsaWJzIGFzIGEgcHJveHkgZm9yIHRoZSBsaWJyYXJ5LiAgVGhlbiB3ZSBjYW4gY2hlY2sKKwkgICMgd2hldGhlciB0aGV5IGxpbmtlZCBpbiBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5IHdpdGggbGRkLgorCSAgJHJtIGNvbmZ0ZXN0LmMKKwkgIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKKwkgIGludCBtYWluKCkgeyByZXR1cm4gMDsgfQorRU9GCisJICAkcm0gY29uZnRlc3QKKwkgICRDQyAtbyBjb25mdGVzdCBjb25mdGVzdC5jICRkZXBsaWJzCisJICBpZiB0ZXN0ICQ/IC1lcSAwIDsgdGhlbgorCSAgICBsZGRfb3V0cHV0PWBsZGQgY29uZnRlc3RgCisJICAgIGZvciBpIGluICRkZXBsaWJzOyBkbworCSAgICAgIG5hbWU9ImBleHByICRpIDogJy1sXCguKlwpJ2AiCisJICAgICAgIyBJZiAkbmFtZSBpcyBlbXB0eSB3ZSBhcmUgb3BlcmF0aW5nIG9uIGEgLUwgYXJndW1lbnQuCisJICAgICAgaWYgdGVzdCAtbiAiJG5hbWUiICYmIHRlc3QgIiRuYW1lIiAhPSAiMCI7IHRoZW4KKwkJbGlibmFtZT1gZXZhbCBcXCRlY2hvIFwiJGxpYm5hbWVfc3BlY1wiYAorCQlkZXBsaWJfbWF0Y2hlcz1gZXZhbCBcXCRlY2hvIFwiJGxpYnJhcnlfbmFtZXNfc3BlY1wiYAorCQlzZXQgZHVtbXkgJGRlcGxpYl9tYXRjaGVzCisJCWRlcGxpYl9tYXRjaD0kMgorCQlpZiB0ZXN0IGBleHByICIkbGRkX291dHB1dCIgOiAiLiokZGVwbGliX21hdGNoImAgLW5lIDAgOyB0aGVuCisJCSAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCisJCWVsc2UKKwkJICBkcm9wcGVkZGVwcz15ZXMKKwkJICBlY2hvCisJCSAgZWNobyAiKioqIFdhcm5pbmc6IFRoaXMgbGlicmFyeSBuZWVkcyBzb21lIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgYnkgJGkuIgorCQkgIGVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCisJCSAgZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkJICBlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUuIgorCQlmaQorCSAgICAgIGVsc2UKKwkJbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCisJICAgICAgZmkKKwkgICAgZG9uZQorCSAgZWxzZQorCSAgICAjIEVycm9yIG9jY3VyZWQgaW4gdGhlIGZpcnN0IGNvbXBpbGUuICBMZXQncyB0cnkgdG8gc2FsdmFnZSB0aGUgc2l0dWF0aW9uOgorCSAgICAjIENvbXBpbGUgYSBzZXBlcmF0ZSBwcm9ncmFtIGZvciBlYWNoIGxpYnJhcnkuCisJICAgIGZvciBpIGluICRkZXBsaWJzOyBkbworCSAgICAgIG5hbWU9ImBleHByICRpIDogJy1sXCguKlwpJ2AiCisJICAgICAjIElmICRuYW1lIGlzIGVtcHR5IHdlIGFyZSBvcGVyYXRpbmcgb24gYSAtTCBhcmd1bWVudC4KKwkgICAgICBpZiB0ZXN0IC1uICIkbmFtZSIgJiYgdGVzdCAiJG5hbWUiICE9ICIwIjsgdGhlbgorCQkkcm0gY29uZnRlc3QKKwkJJENDIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgJGkKKwkJIyBEaWQgaXQgd29yaz8KKwkJaWYgdGVzdCAkPyAtZXEgMCA7IHRoZW4KKwkJICBsZGRfb3V0cHV0PWBsZGQgY29uZnRlc3RgCisJCSAgbGlibmFtZT1gZXZhbCBcXCRlY2hvIFwiJGxpYm5hbWVfc3BlY1wiYAorCQkgIGRlcGxpYl9tYXRjaGVzPWBldmFsIFxcJGVjaG8gXCIkbGlicmFyeV9uYW1lc19zcGVjXCJgCisJCSAgc2V0IGR1bW15ICRkZXBsaWJfbWF0Y2hlcworCQkgIGRlcGxpYl9tYXRjaD0kMgorCQkgIGlmIHRlc3QgYGV4cHIgIiRsZGRfb3V0cHV0IiA6ICIuKiRkZXBsaWJfbWF0Y2giYCAtbmUgMCA7IHRoZW4KKwkJICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgorCQkgIGVsc2UKKwkJICAgIGRyb3BwZWRkZXBzPXllcworCQkgICAgZWNobworCQkgICAgZWNobyAiKioqIFdhcm5pbmc6IFRoaXMgbGlicmFyeSBuZWVkcyBzb21lIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgYnkgJGkuIgorCQkgICAgZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKKwkJICAgIGVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCisJCSAgICBlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUuIgorCQkgIGZpCisJCWVsc2UKKwkJICBkcm9wcGVkZGVwcz15ZXMKKwkJICBlY2hvCisJCSAgZWNobyAiKioqIFdhcm5pbmchICBMaWJyYXJ5ICRpIGlzIG5lZWRlZCBieSB0aGlzIGxpYnJhcnkgYnV0IEkgd2FzIG5vdCBhYmxlIHRvIgorCQkgIGVjaG8gIioqKiAgbWFrZSBpdCBsaW5rIGluISAgWW91IHdpbGwgcHJvYmFibHkgbmVlZCB0byBpbnN0YWxsIGl0IG9yIHNvbWUiCisJCSAgZWNobyAiKioqIGxpYnJhcnkgdGhhdCBpdCBkZXBlbmRzIG9uIGJlZm9yZSB0aGlzIGxpYnJhcnkgd2lsbCBiZSBmdWxseSIKKwkJICBlY2hvICIqKiogZnVuY3Rpb25hbC4gIEluc3RhbGxpbmcgaXQgYmVmb3JlIGNvbnRpbnVpbmcgd291bGQgYmUgZXZlbiBiZXR0ZXIuIgorCQlmaQorCSAgICAgIGVsc2UKKwkJbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCisJICAgICAgZmkKKwkgICAgZG9uZQorCSAgZmkKKwkgIDs7CisJZmlsZV9tYWdpYyopCisJICBzZXQgZHVtbXkgJGRlcGxpYnNfY2hlY2tfbWV0aG9kCisJICBmaWxlX21hZ2ljX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogIiQyIFwoLipcKSJgCisJICBmb3IgYV9kZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisJICAgIG5hbWU9ImBleHByICRhX2RlcGxpYiA6ICctbFwoLipcKSdgIgorCSAgICAjIElmICRuYW1lIGlzIGVtcHR5IHdlIGFyZSBvcGVyYXRpbmcgb24gYSAtTCBhcmd1bWVudC4KKwkgICAgaWYgdGVzdCAtbiAiJG5hbWUiICYmIHRlc3QgIiRuYW1lIiAhPSAiMCI7IHRoZW4KKwkgICAgICBsaWJuYW1lPWBldmFsIFxcJGVjaG8gXCIkbGlibmFtZV9zcGVjXCJgCisJICAgICAgZm9yIGkgaW4gJGxpYl9zZWFyY2hfcGF0aCAkc3lzX2xpYl9zZWFyY2hfcGF0aCAkc2hsaWJfc2VhcmNoX3BhdGg7IGRvCisJCSAgICBwb3RlbnRpYWxfbGlicz1gbHMgJGkvJGxpYm5hbWVbLi1dKiAyPi9kZXYvbnVsbGAKKwkJICAgIGZvciBwb3RlbnRfbGliIGluICRwb3RlbnRpYWxfbGliczsgZG8KKwkJICAgICAgIyBGb2xsb3cgc29mdCBsaW5rcy4KKwkJICAgICAgaWYgbHMgLWxMZCAiJHBvdGVudF9saWIiIDI+L2Rldi9udWxsIFwKKwkJCSB8IGdyZXAgIiAtPiAiID4vZGV2L251bGw7IHRoZW4KKwkJCWNvbnRpbnVlCisJCSAgICAgIGZpCisJCSAgICAgICMgVGhlIHN0YXRlbWVudCBhYm92ZSB0cmllcyB0byBhdm9pZCBlbnRlcmluZyBhbgorCQkgICAgICAjIGVuZGxlc3MgbG9vcCBiZWxvdywgaW4gY2FzZSBvZiBjeWNsaWMgbGlua3MuCisJCSAgICAgICMgV2UgbWlnaHQgc3RpbGwgZW50ZXIgYW4gZW5kbGVzcyBsb29wLCBzaW5jZSBhIGxpbmsKKwkJICAgICAgIyBsb29wIGNhbiBiZSBjbG9zZWQgd2hpbGUgd2UgZm9sbG93IGxpbmtzLAorCQkgICAgICAjIGJ1dCBzbyB3aGF0PworCQkgICAgICBwb3RsaWI9IiRwb3RlbnRfbGliIgorCQkgICAgICB3aGlsZSB0ZXN0IC1oICIkcG90bGliIiAyPi9kZXYvbnVsbDsgZG8KKwkJCXBvdGxpYmxpbms9YGxzIC1sZCAkcG90bGliIHwgc2VkICdzLy4qIC0+IC8vJ2AKKwkJCWNhc2UgJHBvdGxpYmxpbmsgaW4KKwkJCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgcG90bGliPSIkcG90bGlibGluayI7OworCQkJKikgcG90bGliPWAkZWNobyAiWCRwb3RsaWIiIHwgJFhzZWQgLWUgJ3MsW14vXSokLCwnYCIkcG90bGlibGluayI7OworCQkJZXNhYworCQkgICAgICBkb25lCisJCSAgICAgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwiXCRwb3RsaWJcIiAyPi9kZXYvbnVsbCBcCisJCQkgfCBzZWQgMTBxIFwKKwkJCSB8IGVncmVwICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkJCW5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKKwkJCWFfZGVwbGliPSIiCisJCQlicmVhayAyCisJCSAgICAgIGZpCisJCSAgICBkb25lCisJICAgICAgZG9uZQorCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCisJCWRyb3BwZWRkZXBzPXllcworCQllY2hvCisJCWVjaG8gIioqKiBXYXJuaW5nOiBUaGlzIGxpYnJhcnkgbmVlZHMgc29tZSBmdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5ICRhX2RlcGxpYi4iCisJCWVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCisJCWVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCisJCWVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZS4iCisJICAgICAgZmkKKwkgICAgZWxzZQorCSAgICAgICMgQWRkIGEgLUwgYXJndW1lbnQuCisJICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgorCSAgICBmaQorCSAgZG9uZSAjIEdvbmUgdGhyb3VnaCBhbGwgZGVwbGlicy4KKwkgIDs7CisJbWF0Y2hfcGF0dGVybiopCisJICBzZXQgZHVtbXkgJGRlcGxpYnNfY2hlY2tfbWV0aG9kCisJICBtYXRjaF9wYXR0ZXJuX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogIiQyIFwoLipcKSJgCisJICBmb3IgYV9kZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisJICAgIG5hbWU9ImBleHByICRhX2RlcGxpYiA6ICctbFwoLipcKSdgIgorCSAgICAjIElmICRuYW1lIGlzIGVtcHR5IHdlIGFyZSBvcGVyYXRpbmcgb24gYSAtTCBhcmd1bWVudC4KKwkgICAgaWYgdGVzdCAtbiAiJG5hbWUiICYmIHRlc3QgIiRuYW1lIiAhPSAiMCI7IHRoZW4KKwkgICAgICBsaWJuYW1lPWBldmFsIFxcJGVjaG8gXCIkbGlibmFtZV9zcGVjXCJgCisJICAgICAgZm9yIGkgaW4gJGxpYl9zZWFyY2hfcGF0aCAkc3lzX2xpYl9zZWFyY2hfcGF0aCAkc2hsaWJfc2VhcmNoX3BhdGg7IGRvCisJCXBvdGVudGlhbF9saWJzPWBscyAkaS8kbGlibmFtZVsuLV0qIDI+L2Rldi9udWxsYAorCQlmb3IgcG90ZW50X2xpYiBpbiAkcG90ZW50aWFsX2xpYnM7IGRvCisJCSAgaWYgZXZhbCBlY2hvIFwiJHBvdGVudF9saWJcIiAyPi9kZXYvbnVsbCBcCisJCSAgICAgIHwgc2VkIDEwcSBcCisJCSAgICAgIHwgZWdyZXAgIiRtYXRjaF9wYXR0ZXJuX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgorCQkgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgorCQkgICAgYV9kZXBsaWI9IiIKKwkJICAgIGJyZWFrIDIKKwkJICBmaQorCQlkb25lCisJICAgICAgZG9uZQorCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCisJCWRyb3BwZWRkZXBzPXllcworCQllY2hvCisJCWVjaG8gIioqKiBXYXJuaW5nOiBUaGlzIGxpYnJhcnkgbmVlZHMgc29tZSBmdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5ICRhX2RlcGxpYi4iCisJCWVjaG8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCisJCWVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCisJCWVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZS4iCisJICAgICAgZmkKKwkgICAgZWxzZQorCSAgICAgICMgQWRkIGEgLUwgYXJndW1lbnQuCisJICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgorCSAgICBmaQorCSAgZG9uZSAjIEdvbmUgdGhyb3VnaCBhbGwgZGVwbGlicy4KKwkgIDs7CisJbm9uZSB8IHVua25vd24gfCAqKQorCSAgbmV3ZGVwbGlicz0iIgorCSAgaWYgJGVjaG8gIlggJGRlcGxpYnMiIHwgJFhzZWQgLWUgJ3MvIC1sYyQvLycgXAorCSAgICAgICAtZSAncy8gLVtMUl1bXiBdKi8vZycgLWUgJ3MvWyAJXS8vZycgfAorCSAgICAgZ3JlcCAuID4vZGV2L251bGw7IHRoZW4KKwkgICAgZWNobworCSAgICBpZiB0ZXN0ICJYJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA9ICJYbm9uZSI7IHRoZW4KKwkgICAgICBlY2hvICIqKiogV2FybmluZzogaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBwbGF0Zm9ybS4iCisJICAgIGVsc2UKKwkgICAgICBlY2hvICIqKiogV2FybmluZzogaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBrbm93biB0byBiZSBzdXBwb3J0ZWQuIgorCSAgICBmaQorCSAgICBlY2hvICIqKiogQWxsIGRlY2xhcmVkIGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIGFyZSBiZWluZyBkcm9wcGVkLiIKKwkgICAgZHJvcHBlZGRlcHM9eWVzCisJICBmaQorCSAgOzsKKwllc2FjCisJdmVyc3VmZml4PSR2ZXJzdWZmaXhfc2F2ZQorCW1ham9yPSRtYWpvcl9zYXZlCisJcmVsZWFzZT0kcmVsZWFzZV9zYXZlCisJbGlibmFtZT0kbGlibmFtZV9zYXZlCisJbmFtZT0kbmFtZV9zYXZlCisKKwljYXNlICRob3N0IGluCisJKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQorCSAgIyBPbiBSaGFwc29keSByZXBsYWNlIHRoZSBDIGxpYnJhcnkgaXMgdGhlIFN5c3RlbSBmcmFtZXdvcmsKKwkgIG5ld2RlcGxpYnM9YCRlY2hvICJYICRuZXdkZXBsaWJzIiB8ICRYc2VkIC1lICdzLyAtbGMgLyAtZnJhbWV3b3JrIFN5c3RlbSAvJ2AKKwkgIDs7CisJZXNhYworCisJaWYgdGVzdCAiJGRyb3BwZWRkZXBzIiA9IHllczsgdGhlbgorCSAgaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXM7IHRoZW4KKwkgICAgZWNobworCSAgICBlY2hvICIqKiogV2FybmluZzogbGlidG9vbCBjb3VsZCBub3Qgc2F0aXNmeSBhbGwgZGVjbGFyZWQgaW50ZXItbGlicmFyeSIKKwkgICAgZWNobyAiKioqIGRlcGVuZGVuY2llcyBvZiBtb2R1bGUgJGxpYm5hbWUuICBUaGVyZWZvcmUsIGxpYnRvb2wgd2lsbCBjcmVhdGUiCisJICAgIGVjaG8gIioqKiBhIHN0YXRpYyBtb2R1bGUsIHRoYXQgc2hvdWxkIHdvcmsgYXMgbG9uZyBhcyB0aGUgZGxvcGVuaW5nIgorCSAgICBlY2hvICIqKiogYXBwbGljYXRpb24gaXMgbGlua2VkIHdpdGggdGhlIC1kbG9wZW4gZmxhZy4iCisJICAgIGlmIHRlc3QgLXogIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCisJICAgICAgZWNobworCSAgICAgIGVjaG8gIioqKiBIb3dldmVyLCB0aGlzIHdvdWxkIG9ubHkgd29yayBpZiBsaWJ0b29sIHdhcyBhYmxlIHRvIGV4dHJhY3Qgc3ltYm9sIgorCSAgICAgIGVjaG8gIioqKiBsaXN0cyBmcm9tIGEgcHJvZ3JhbSwgdXNpbmcgXGBubScgb3IgZXF1aXZhbGVudCwgYnV0IGxpYnRvb2wgY291bGQiCisJICAgICAgZWNobyAiKioqIG5vdCBmaW5kIHN1Y2ggYSBwcm9ncmFtLiAgU28sIHRoaXMgbW9kdWxlIGlzIHByb2JhYmx5IHVzZWxlc3MuIgorCSAgICAgIGVjaG8gIioqKiBcYG5tJyBmcm9tIEdOVSBiaW51dGlscyBhbmQgYSBmdWxsIHJlYnVpbGQgbWF5IGhlbHAuIgorCSAgICBmaQorCSAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KKwkgICAgICBvbGRsaWJzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0IgorCSAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1tb2R1bGUKKwkgICAgICBidWlsZF9vbGRfbGlicz15ZXMKKwkgICAgZWxzZQorCSAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubworCSAgICBmaQorCSAgZWxzZQorCSAgICBlY2hvICIqKiogVGhlIGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIHRoYXQgaGF2ZSBiZWVuIGRyb3BwZWQgaGVyZSB3aWxsIGJlIgorCSAgICBlY2hvICIqKiogYXV0b21hdGljYWxseSBhZGRlZCB3aGVuZXZlciBhIHByb2dyYW0gaXMgbGlua2VkIHdpdGggdGhpcyBsaWJyYXJ5IgorCSAgICBlY2hvICIqKiogb3IgaXMgZGVjbGFyZWQgdG8gLWRsb3BlbiBpdC4iCisKKwkgICAgaWYgdGVzdCAkYWxsb3dfdW5kZWZpbmVkID0gbm87IHRoZW4KKwkgICAgICBlY2hvCisJICAgICAgZWNobyAiKioqIFNpbmNlIHRoaXMgbGlicmFyeSBtdXN0IG5vdCBjb250YWluIHVuZGVmaW5lZCBzeW1ib2xzLCIKKwkgICAgICBlY2hvICIqKiogYmVjYXVzZSBlaXRoZXIgdGhlIHBsYXRmb3JtIGRvZXMgbm90IHN1cHBvcnQgdGhlbSBvciIKKwkgICAgICBlY2hvICIqKiogaXQgd2FzIGV4cGxpY2l0bHkgcmVxdWVzdGVkIHdpdGggLW5vLXVuZGVmaW5lZCwiCisJICAgICAgZWNobyAiKioqIGxpYnRvb2wgd2lsbCBvbmx5IGNyZWF0ZSBhIHN0YXRpYyB2ZXJzaW9uIG9mIGl0LiIKKwkgICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KKwkJb2xkbGlicz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCIKKwkJYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQorCQlidWlsZF9vbGRfbGlicz15ZXMKKwkgICAgICBlbHNlCisJCWJ1aWxkX2xpYnRvb2xfbGlicz1ubworCSAgICAgIGZpCisJICAgIGZpCisJICBmaQorCWZpCisJIyBEb25lIGNoZWNraW5nIGRlcGxpYnMhCisJZGVwbGlicz0kbmV3ZGVwbGlicworICAgICAgZmkKKworICAgICAgIyBBbGwgdGhlIGxpYnJhcnktc3BlY2lmaWMgdmFyaWFibGVzIChpbnN0YWxsX2xpYmRpciBpcyBzZXQgYWJvdmUpLgorICAgICAgbGlicmFyeV9uYW1lcz0KKyAgICAgIG9sZF9saWJyYXJ5PQorICAgICAgZGxuYW1lPQorCisgICAgICAjIFRlc3QgYWdhaW4sIHdlIG1heSBoYXZlIGRlY2lkZWQgbm90IHRvIGJ1aWxkIGl0IGFueSBtb3JlCisgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorCWlmIHRlc3QgJGhhcmRjb2RlX2ludG9fbGlicyA9IHllczsgdGhlbgorCSAgIyBIYXJkY29kZSB0aGUgbGlicmFyeSBwYXRocworCSAgaGFyZGNvZGVfbGliZGlycz0KKwkgIGRlcF9ycGF0aD0KKwkgIHJwYXRoPSIkZmluYWxpemVfcnBhdGgiCisJICB0ZXN0ICIkbW9kZSIgIT0gcmVsaW5rICYmIHJwYXRoPSIkY29tcGlsZV9ycGF0aCRycGF0aCIKKwkgIGZvciBsaWJkaXIgaW4gJHJwYXRoOyBkbworCSAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KKwkgICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KKwkJaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJCSAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKKwkJZWxzZQorCQkgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KKwkJICBjYXNlICRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBpbgorCQkgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKKwkJICAgIDs7CisJCSAgKikKKwkJICAgIGhhcmRjb2RlX2xpYmRpcnM9IiRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgorCQkgICAgOzsKKwkJICBlc2FjCisJCWZpCisJICAgICAgZWxzZQorCQlldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisJCWRlcF9ycGF0aD0iJGRlcF9ycGF0aCAkZmxhZyIKKwkgICAgICBmaQorCSAgICBlbGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KKwkgICAgICBjYXNlICIkcGVybV9ycGF0aCAiIGluCisJICAgICAgKiIgJGxpYmRpciAiKikgOzsKKwkgICAgICAqKSBwZXJtX3JwYXRoPSIkcGVybV9ycGF0aCAkbGliZGlyIiA7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgIGRvbmUKKwkgICMgU3Vic3RpdHV0ZSB0aGUgaGFyZGNvZGVkIGxpYmRpcnMgaW50byB0aGUgcnBhdGguCisJICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIgJiYKKwkgICAgIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgorCSAgICBsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgorCSAgICBldmFsIGRlcF9ycGF0aD1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKwkgIGZpCisJICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiICYmIHRlc3QgLW4gIiRwZXJtX3JwYXRoIjsgdGhlbgorCSAgICAjIFdlIHNob3VsZCBzZXQgdGhlIHJ1bnBhdGhfdmFyLgorCSAgICBycGF0aD0KKwkgICAgZm9yIGRpciBpbiAkcGVybV9ycGF0aDsgZG8KKwkgICAgICBycGF0aD0iJHJwYXRoJGRpcjoiCisJICAgIGRvbmUKKwkgICAgZXZhbCAiJHJ1bnBhdGhfdmFyPSckcnBhdGhcJCRydW5wYXRoX3Zhcic7IGV4cG9ydCAkcnVucGF0aF92YXIiCisJICBmaQorCSAgdGVzdCAtbiAiJGRlcF9ycGF0aCIgJiYgZGVwbGlicz0iJGRlcF9ycGF0aCAkZGVwbGlicyIKKwlmaQorCisJc2hsaWJwYXRoPSIkZmluYWxpemVfc2hsaWJwYXRoIgorCXRlc3QgIiRtb2RlIiAhPSByZWxpbmsgJiYgc2hsaWJwYXRoPSIkY29tcGlsZV9zaGxpYnBhdGgkc2hsaWJwYXRoIgorCWlmIHRlc3QgLW4gIiRzaGxpYnBhdGgiOyB0aGVuCisJICBldmFsICIkc2hsaWJwYXRoX3Zhcj0nJHNobGlicGF0aFwkJHNobGlicGF0aF92YXInOyBleHBvcnQgJHNobGlicGF0aF92YXIiCisJZmkKKworCSMgR2V0IHRoZSByZWFsIGFuZCBsaW5rIG5hbWVzIG9mIHRoZSBsaWJyYXJ5LgorCWV2YWwgbGlicmFyeV9uYW1lcz1cIiRsaWJyYXJ5X25hbWVzX3NwZWNcIgorCXNldCBkdW1teSAkbGlicmFyeV9uYW1lcworCXJlYWxuYW1lPSIkMiIKKwlzaGlmdDsgc2hpZnQKKworCWlmIHRlc3QgLW4gIiRzb25hbWVfc3BlYyI7IHRoZW4KKwkgIGV2YWwgc29uYW1lPVwiJHNvbmFtZV9zcGVjXCIKKwllbHNlCisJICBzb25hbWU9IiRyZWFsbmFtZSIKKwlmaQorCXRlc3QgLXogIiRkbG5hbWUiICYmIGRsbmFtZT0kc29uYW1lCisKKwlsaWI9IiRvdXRwdXRfb2JqZGlyLyRyZWFsbmFtZSIKKwlmb3IgbGluaworCWRvCisJICBsaW5rbmFtZXM9IiRsaW5rbmFtZXMgJGxpbmsiCisJZG9uZQorCisJIyBFbnN1cmUgdGhhdCB3ZSBoYXZlIC5vIG9iamVjdHMgZm9yIGxpbmtlcnMgd2hpY2ggZGlzbGlrZSAubG8KKwkjIChlLmcuIGFpeCkgaW4gY2FzZSB3ZSBhcmUgcnVubmluZyAtLWRpc2FibGUtc3RhdGljCisJZm9yIG9iaiBpbiAkbGlib2JqczsgZG8KKwkgIHhkaXI9YCRlY2hvICJYJG9iaiIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAorCSAgaWYgdGVzdCAiWCR4ZGlyIiA9ICJYJG9iaiI7IHRoZW4KKwkgICAgeGRpcj0iLiIKKwkgIGVsc2UKKwkgICAgeGRpcj0iJHhkaXIiCisJICBmaQorCSAgYmFzZW9iaj1gJGVjaG8gIlgkb2JqIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisJICBvbGRvYmo9YCRlY2hvICJYJGJhc2VvYmoiIHwgJFhzZWQgLWUgIiRsbzJvImAKKwkgIGlmIHRlc3QgISAtZiAkeGRpci8kb2xkb2JqOyB0aGVuCisJICAgICRzaG93ICIoY2QgJHhkaXIgJiYgJHtMTl9TfSAkYmFzZW9iaiAkb2xkb2JqKSIKKwkgICAgJHJ1biBldmFsICcoY2QgJHhkaXIgJiYgJHtMTl9TfSAkYmFzZW9iaiAkb2xkb2JqKScgfHwgZXhpdCAkPworCSAgZmkKKwlkb25lCisKKwkjIFVzZSBzdGFuZGFyZCBvYmplY3RzIGlmIHRoZXkgYXJlIHBpYworCXRlc3QgLXogIiRwaWNfZmxhZyIgJiYgbGlib2Jqcz1gJGVjaG8gIlgkbGlib2JqcyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAorCisJIyBQcmVwYXJlIHRoZSBsaXN0IG9mIGV4cG9ydGVkIHN5bWJvbHMKKwlpZiB0ZXN0IC16ICIkZXhwb3J0X3N5bWJvbHMiOyB0aGVuCisJICBpZiB0ZXN0ICIkYWx3YXlzX2V4cG9ydF9zeW1ib2xzIiA9IHllcyB8fCB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCisJICAgICRzaG93ICJnZW5lcmF0aW5nIHN5bWJvbCBsaXN0IGZvciBcYCRsaWJuYW1lLmxhJyIKKwkgICAgZXhwb3J0X3N5bWJvbHM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmV4cCIKKwkgICAgJHJ1biAkcm0gJGV4cG9ydF9zeW1ib2xzCisJICAgIGV2YWwgY21kcz1cIiRleHBvcnRfc3ltYm9sc19jbWRzXCIKKwkgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCisJICAgICAgSUZTPSIkc2F2ZV9pZnMiCisJICAgICAgJHNob3cgIiRjbWQiCisJICAgICAgJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/CisJICAgIGRvbmUKKwkgICAgSUZTPSIkc2F2ZV9pZnMiCisJICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KKwkgICAgICAkc2hvdyAiZWdyZXAgLWUgXCIkZXhwb3J0X3N5bWJvbHNfcmVnZXhcIiBcIiRleHBvcnRfc3ltYm9sc1wiID4gXCIke2V4cG9ydF9zeW1ib2xzfVRcIiIKKwkgICAgICAkcnVuIGV2YWwgJ2VncmVwIC1lICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICIkZXhwb3J0X3N5bWJvbHMiID4gIiR7ZXhwb3J0X3N5bWJvbHN9VCInCisJICAgICAgJHNob3cgIiRtdiBcIiR7ZXhwb3J0X3N5bWJvbHN9VFwiIFwiJGV4cG9ydF9zeW1ib2xzXCIiCisJICAgICAgJHJ1biBldmFsICckbXYgIiR7ZXhwb3J0X3N5bWJvbHN9VCIgIiRleHBvcnRfc3ltYm9scyInCisJICAgIGZpCisJICBmaQorCWZpCisKKwlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRpbmNsdWRlX2V4cHN5bXMiOyB0aGVuCisJICAkcnVuIGV2YWwgJyRlY2hvICJYJGluY2x1ZGVfZXhwc3ltcyIgfCAkU1AyTkwgPj4gIiRleHBvcnRfc3ltYm9scyInCisJZmkKKworCWlmIHRlc3QgLW4gIiRjb252ZW5pZW5jZSI7IHRoZW4KKwkgIGlmIHRlc3QgLW4gIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KKwkgICAgZXZhbCBsaWJvYmpzPVwiXCRsaWJvYmpzICR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY1wiCisJICBlbHNlCisJICAgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfXgiCisJICAgICRzaG93ICIke3JtfXIgJGdlbnRvcCIKKwkgICAgJHJ1biAke3JtfXIgIiRnZW50b3AiCisJICAgICRzaG93ICJta2RpciAkZ2VudG9wIgorCSAgICAkcnVuIG1rZGlyICIkZ2VudG9wIgorCSAgICBzdGF0dXM9JD8KKwkgICAgaWYgdGVzdCAkc3RhdHVzIC1uZSAwICYmIHRlc3QgISAtZCAiJGdlbnRvcCI7IHRoZW4KKwkgICAgICBleGl0ICRzdGF0dXMKKwkgICAgZmkKKwkgICAgZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICRnZW50b3AiCisKKwkgICAgZm9yIHhsaWIgaW4gJGNvbnZlbmllbmNlOyBkbworCSAgICAgICMgRXh0cmFjdCB0aGUgb2JqZWN0cy4KKwkgICAgICBjYXNlICR4bGliIGluCisJICAgICAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSB4YWJzPSIkeGxpYiIgOzsKKwkgICAgICAqKSB4YWJzPWBwd2RgIi8keGxpYiIgOzsKKwkgICAgICBlc2FjCisJICAgICAgeGxpYj1gJGVjaG8gIlgkeGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCSAgICAgIHhkaXI9IiRnZW50b3AvJHhsaWIiCisKKwkgICAgICAkc2hvdyAiJHtybX1yICR4ZGlyIgorCSAgICAgICRydW4gJHtybX1yICIkeGRpciIKKwkgICAgICAkc2hvdyAibWtkaXIgJHhkaXIiCisJICAgICAgJHJ1biBta2RpciAiJHhkaXIiCisJICAgICAgc3RhdHVzPSQ/CisJICAgICAgaWYgdGVzdCAkc3RhdHVzIC1uZSAwICYmIHRlc3QgISAtZCAiJHhkaXIiOyB0aGVuCisJCWV4aXQgJHN0YXR1cworCSAgICAgIGZpCisJICAgICAgJHNob3cgIihjZCAkeGRpciAmJiAkQVIgeCAkeGFicykiCisJICAgICAgJHJ1biBldmFsICIoY2QgXCR4ZGlyICYmICRBUiB4IFwkeGFicykiIHx8IGV4aXQgJD8KKworCSAgICAgIGxpYm9ianM9IiRsaWJvYmpzICJgZmluZCAkeGRpciAtbmFtZSBcKi5vIC1wcmludCAtbyAtbmFtZSBcKi5sbyAtcHJpbnQgfCAkTkwyU1BgCisJICAgIGRvbmUKKwkgIGZpCisJZmkKKworCWlmIHRlc3QgIiR0aHJlYWRfc2FmZSIgPSB5ZXMgJiYgdGVzdCAtbiAiJHRocmVhZF9zYWZlX2ZsYWdfc3BlYyI7IHRoZW4KKwkgIGV2YWwgZmxhZz1cIiR0aHJlYWRfc2FmZV9mbGFnX3NwZWNcIgorCSAgbGlua2VyX2ZsYWdzPSIkbGlua2VyX2ZsYWdzICRmbGFnIgorCWZpCisKKwkjIE1ha2UgYSBiYWNrdXAgb2YgdGhlIHVuaW5zdGFsbGVkIGxpYnJhcnkgd2hlbiByZWxpbmtpbmcKKwlpZiB0ZXN0ICIkbW9kZSIgPSByZWxpbms7IHRoZW4KKwkgICRydW4gZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRybSAke3JlYWxuYW1lfVUgJiYgJG12ICRyZWFsbmFtZSAke3JlYWxuYW1lfVUpJyB8fCBleGl0ICQ/CisJZmkKKworCSMgRG8gZWFjaCBvZiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KKwlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRhcmNoaXZlX2V4cHN5bV9jbWRzIjsgdGhlbgorCSAgZXZhbCBjbWRzPVwiJGFyY2hpdmVfZXhwc3ltX2NtZHNcIgorCWVsc2UKKwkgIGV2YWwgY21kcz1cIiRhcmNoaXZlX2NtZHNcIgorCWZpCisJc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJZm9yIGNtZCBpbiAkY21kczsgZG8KKwkgIElGUz0iJHNhdmVfaWZzIgorCSAgJHNob3cgIiRjbWQiCisJICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KKwlkb25lCisJSUZTPSIkc2F2ZV9pZnMiCisKKwkjIFJlc3RvcmUgdGhlIHVuaW5zdGFsbGVkIGxpYnJhcnkgYW5kIGV4aXQKKwlpZiB0ZXN0ICIkbW9kZSIgPSByZWxpbms7IHRoZW4KKwkgICRydW4gZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRybSAke3JlYWxuYW1lfVQgJiYgJG12ICRyZWFsbmFtZSAke3JlYWxuYW1lfVQgJiYgJG12ICIkcmVhbG5hbWUiVSAkcmVhbG5hbWUpJyB8fCBleGl0ICQ/CisJICBleGl0IDAKKwlmaQorCisJIyBDcmVhdGUgbGlua3MgdG8gdGhlIHJlYWwgbGlicmFyeS4KKwlmb3IgbGlua25hbWUgaW4gJGxpbmtuYW1lczsgZG8KKwkgIGlmIHRlc3QgIiRyZWFsbmFtZSIgIT0gIiRsaW5rbmFtZSI7IHRoZW4KKwkgICAgJHNob3cgIihjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJGxpbmtuYW1lICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWUpIgorCSAgICAkcnVuIGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJGxpbmtuYW1lICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWUpJyB8fCBleGl0ICQ/CisJICBmaQorCWRvbmUKKworCSMgSWYgLW1vZHVsZSBvciAtZXhwb3J0LWR5bmFtaWMgd2FzIHNwZWNpZmllZCwgc2V0IHRoZSBkbG5hbWUuCisJaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXMgfHwgdGVzdCAiJGV4cG9ydF9keW5hbWljIiA9IHllczsgdGhlbgorCSAgIyBPbiBhbGwga25vd24gb3BlcmF0aW5nIHN5c3RlbXMsIHRoZXNlIGFyZSBpZGVudGljYWwuCisJICBkbG5hbWU9IiRzb25hbWUiCisJZmkKKyAgICAgIGZpCisgICAgICA7OworCisgICAgb2JqKQorICAgICAgaWYgdGVzdCAtbiAiJGRlcGxpYnMiOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtbCcgYW5kIFxgLUwnIGFyZSBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIiB8fCB0ZXN0ICIkZGxzZWxmIiAhPSBubzsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJHJwYXRoIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJwYXRoJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkeHJwYXRoIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLVInIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiR2aW5mbyI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC12ZXJzaW9uLWluZm8nIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgIGNhc2UgJG91dHB1dCBpbgorICAgICAgKi5sbykKKwlpZiB0ZXN0IC1uICIkb2JqcyRvbGRfZGVwbGlicyI7IHRoZW4KKwkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBidWlsZCBsaWJyYXJ5IG9iamVjdCBcYCRvdXRwdXQnIGZyb20gbm9uLWxpYnRvb2wgb2JqZWN0cyIgMT4mMgorCSAgZXhpdCAxCisJZmkKKwlsaWJvYmo9IiRvdXRwdXQiCisJb2JqPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgIiRsbzJvImAKKwk7OworICAgICAgKikKKwlsaWJvYmo9CisJb2JqPSIkb3V0cHV0IgorCTs7CisgICAgICBlc2FjCisKKyAgICAgICMgRGVsZXRlIHRoZSBvbGQgb2JqZWN0cy4KKyAgICAgICRydW4gJHJtICRvYmogJGxpYm9iagorCisgICAgICAjIE9iamVjdHMgZnJvbSBjb252ZW5pZW5jZSBsaWJyYXJpZXMuICBUaGlzIGFzc3VtZXMKKyAgICAgICMgc2luZ2xlLXZlcnNpb24gY29udmVuaWVuY2UgbGlicmFyaWVzLiAgV2hlbmV2ZXIgd2UgY3JlYXRlCisgICAgICAjIGRpZmZlcmVudCBvbmVzIGZvciBQSUMvbm9uLVBJQywgdGhpcyB3ZSdsbCBoYXZlIHRvIGR1cGxpY2F0ZQorICAgICAgIyB0aGUgZXh0cmFjdGlvbi4KKyAgICAgIHJlbG9hZF9jb252X29ianM9CisgICAgICBnZW50b3A9CisgICAgICAjIHJlbG9hZF9jbWRzIHJ1bnMgJExEIGRpcmVjdGx5LCBzbyBsZXQgdXMgZ2V0IHJpZCBvZgorICAgICAgIyAtV2wgZnJvbSB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYworICAgICAgd2w9CisKKyAgICAgIGlmIHRlc3QgLW4gIiRjb252ZW5pZW5jZSI7IHRoZW4KKwlpZiB0ZXN0IC1uICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCisJICBldmFsIHJlbG9hZF9jb252X29ianM9XCJcJHJlbG9hZF9vYmpzICR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY1wiCisJZWxzZQorCSAgZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke29ian14IgorCSAgJHNob3cgIiR7cm19ciAkZ2VudG9wIgorCSAgJHJ1biAke3JtfXIgIiRnZW50b3AiCisJICAkc2hvdyAibWtkaXIgJGdlbnRvcCIKKwkgICRydW4gbWtkaXIgIiRnZW50b3AiCisJICBzdGF0dXM9JD8KKwkgIGlmIHRlc3QgJHN0YXR1cyAtbmUgMCAmJiB0ZXN0ICEgLWQgIiRnZW50b3AiOyB0aGVuCisJICAgIGV4aXQgJHN0YXR1cworCSAgZmkKKwkgIGdlbmVyYXRlZD0iJGdlbmVyYXRlZCAkZ2VudG9wIgorCisJICBmb3IgeGxpYiBpbiAkY29udmVuaWVuY2U7IGRvCisJICAgICMgRXh0cmFjdCB0aGUgb2JqZWN0cy4KKwkgICAgY2FzZSAkeGxpYiBpbgorCSAgICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIHhhYnM9IiR4bGliIiA7OworCSAgICAqKSB4YWJzPWBwd2RgIi8keGxpYiIgOzsKKwkgICAgZXNhYworCSAgICB4bGliPWAkZWNobyAiWCR4bGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisJICAgIHhkaXI9IiRnZW50b3AvJHhsaWIiCisKKwkgICAgJHNob3cgIiR7cm19ciAkeGRpciIKKwkgICAgJHJ1biAke3JtfXIgIiR4ZGlyIgorCSAgICAkc2hvdyAibWtkaXIgJHhkaXIiCisJICAgICRydW4gbWtkaXIgIiR4ZGlyIgorCSAgICBzdGF0dXM9JD8KKwkgICAgaWYgdGVzdCAkc3RhdHVzIC1uZSAwICYmIHRlc3QgISAtZCAiJHhkaXIiOyB0aGVuCisJICAgICAgZXhpdCAkc3RhdHVzCisJICAgIGZpCisJICAgICRzaG93ICIoY2QgJHhkaXIgJiYgJEFSIHggJHhhYnMpIgorCSAgICAkcnVuIGV2YWwgIihjZCBcJHhkaXIgJiYgJEFSIHggXCR4YWJzKSIgfHwgZXhpdCAkPworCisJICAgIHJlbG9hZF9jb252X29ianM9IiRyZWxvYWRfb2JqcyAiYGZpbmQgJHhkaXIgLW5hbWUgXCoubyAtcHJpbnQgLW8gLW5hbWUgXCoubG8gLXByaW50IHwgJE5MMlNQYAorCSAgZG9uZQorCWZpCisgICAgICBmaQorCisgICAgICAjIENyZWF0ZSB0aGUgb2xkLXN0eWxlIG9iamVjdC4KKyAgICAgIHJlbG9hZF9vYmpzPSIkb2JqcyRvbGRfZGVwbGlicyAiYCRlY2hvICJYJGxpYm9ianMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgJy9cLicke2xpYmV4dH0kJy9kJyAtZSAnL1wubGliJC9kJyAtZSAiJGxvMm8iIHwgJE5MMlNQYCIgJHJlbG9hZF9jb252X29ianMiICMjIyB0ZXN0c3VpdGU6IHNraXAgbmVzdGVkIHF1b3RpbmcgdGVzdAorCisgICAgICBvdXRwdXQ9IiRvYmoiCisgICAgICBldmFsIGNtZHM9XCIkcmVsb2FkX2NtZHNcIgorICAgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisgICAgICBmb3IgY21kIGluICRjbWRzOyBkbworCUlGUz0iJHNhdmVfaWZzIgorCSRzaG93ICIkY21kIgorCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPworICAgICAgZG9uZQorICAgICAgSUZTPSIkc2F2ZV9pZnMiCisKKyAgICAgICMgRXhpdCBpZiB3ZSBhcmVuJ3QgZG9pbmcgYSBsaWJyYXJ5IG9iamVjdCBmaWxlLgorICAgICAgaWYgdGVzdCAteiAiJGxpYm9iaiI7IHRoZW4KKwlpZiB0ZXN0IC1uICIkZ2VudG9wIjsgdGhlbgorCSAgJHNob3cgIiR7cm19ciAkZ2VudG9wIgorCSAgJHJ1biAke3JtfXIgJGdlbnRvcAorCWZpCisKKwlleGl0IDAKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgorCWlmIHRlc3QgLW4gIiRnZW50b3AiOyB0aGVuCisJICAkc2hvdyAiJHtybX1yICRnZW50b3AiCisJICAkcnVuICR7cm19ciAkZ2VudG9wCisJZmkKKworCSMgQ3JlYXRlIGFuIGludmFsaWQgbGlidG9vbCBvYmplY3QgaWYgbm8gUElDLCBzbyB0aGF0IHdlIGRvbid0CisJIyBhY2NpZGVudGFsbHkgbGluayBpdCBpbnRvIGEgcHJvZ3JhbS4KKwkkc2hvdyAiZWNobyB0aW1lc3RhbXAgPiAkbGlib2JqIgorCSRydW4gZXZhbCAiZWNobyB0aW1lc3RhbXAgPiAkbGlib2JqIiB8fCBleGl0ICQ/CisJZXhpdCAwCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkcGljX2ZsYWciIHx8IHRlc3QgIiRwaWNfbW9kZSIgIT0gZGVmYXVsdDsgdGhlbgorCSMgT25seSBkbyBjb21tYW5kcyBpZiB3ZSByZWFsbHkgaGF2ZSBkaWZmZXJlbnQgUElDIG9iamVjdHMuCisJcmVsb2FkX29ianM9IiRsaWJvYmpzICRyZWxvYWRfY29udl9vYmpzIgorCW91dHB1dD0iJGxpYm9iaiIKKwlldmFsIGNtZHM9XCIkcmVsb2FkX2NtZHNcIgorCXNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JworCWZvciBjbWQgaW4gJGNtZHM7IGRvCisJICBJRlM9IiRzYXZlX2lmcyIKKwkgICRzaG93ICIkY21kIgorCSAgJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/CisJZG9uZQorCUlGUz0iJHNhdmVfaWZzIgorICAgICAgZWxzZQorCSMgSnVzdCBjcmVhdGUgYSBzeW1saW5rLgorCSRzaG93ICRybSAkbGlib2JqCisJJHJ1biAkcm0gJGxpYm9iagorCXhkaXI9YCRlY2hvICJYJGxpYm9iaiIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAorCWlmIHRlc3QgIlgkeGRpciIgPSAiWCRsaWJvYmoiOyB0aGVuCisJICB4ZGlyPSIuIgorCWVsc2UKKwkgIHhkaXI9IiR4ZGlyIgorCWZpCisJYmFzZW9iaj1gJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisJb2xkb2JqPWAkZWNobyAiWCRiYXNlb2JqIiB8ICRYc2VkIC1lICIkbG8ybyJgCisJJHNob3cgIihjZCAkeGRpciAmJiAkTE5fUyAkb2xkb2JqICRiYXNlb2JqKSIKKwkkcnVuIGV2YWwgJyhjZCAkeGRpciAmJiAkTE5fUyAkb2xkb2JqICRiYXNlb2JqKScgfHwgZXhpdCAkPworICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGdlbnRvcCI7IHRoZW4KKwkkc2hvdyAiJHtybX1yICRnZW50b3AiCisJJHJ1biAke3JtfXIgJGdlbnRvcAorICAgICAgZmkKKworICAgICAgZXhpdCAwCisgICAgICA7OworCisgICAgcHJvZykKKyAgICAgIGNhc2UgJGhvc3QgaW4KKwkqY3lnd2luKikgb3V0cHV0PWBlY2hvICRvdXRwdXQgfCBzZWQgLWUgJ3MsLmV4ZSQsLDtzLCQsLmV4ZSwnYCA7OworICAgICAgZXNhYworICAgICAgaWYgdGVzdCAtbiAiJHZpbmZvIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXZlcnNpb24taW5mbycgaXMgaWdub3JlZCBmb3IgcHJvZ3JhbXMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIHByb2dyYW1zIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkcHJlbG9hZCIgPSB5ZXM7IHRoZW4KKwlpZiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0gdW5rbm93biAmJiB0ZXN0ICIkZGxvcGVuX3NlbGYiID0gdW5rbm93biAmJgorCSAgIHRlc3QgIiRkbG9wZW5fc2VsZl9zdGF0aWMiID0gdW5rbm93bjsgdGhlbgorCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGBBQ19MSUJUT09MX0RMT1BFTicgbm90IHVzZWQuIEFzc3VtaW5nIG5vIGRsb3BlbiBzdXBwb3J0LiIKKwlmaQorICAgICAgZmkKKworICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQorCSMgT24gUmhhcHNvZHkgcmVwbGFjZSB0aGUgQyBsaWJyYXJ5IGlzIHRoZSBTeXN0ZW0gZnJhbWV3b3JrCisJY29tcGlsZV9kZXBsaWJzPWAkZWNobyAiWCAkY29tcGlsZV9kZXBsaWJzIiB8ICRYc2VkIC1lICdzLyAtbGMgLyAtZnJhbWV3b3JrIFN5c3RlbSAvJ2AKKwlmaW5hbGl6ZV9kZXBsaWJzPWAkZWNobyAiWCAkZmluYWxpemVfZGVwbGlicyIgfCAkWHNlZCAtZSAncy8gLWxjIC8gLWZyYW1ld29yayBTeXN0ZW0gLydgCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRjb21waWxlX2RlcGxpYnMiCisgICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkZmluYWxpemVfZGVwbGlicyIKKworICAgICAgaWYgdGVzdCAtbiAiJHJwYXRoJHhycGF0aCI7IHRoZW4KKwkjIElmIHRoZSB1c2VyIHNwZWNpZmllZCBhbnkgcnBhdGggZmxhZ3MsIHRoZW4gYWRkIHRoZW0uCisJZm9yIGxpYmRpciBpbiAkcnBhdGggJHhycGF0aDsgZG8KKwkgICMgVGhpcyBpcyB0aGUgbWFnaWMgdG8gdXNlIC1ycGF0aC4KKwkgIGNhc2UgIiRmaW5hbGl6ZV9ycGF0aCAiIGluCisJICAqIiAkbGliZGlyICIqKSA7OworCSAgKikgZmluYWxpemVfcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCAkbGliZGlyIiA7OworCSAgZXNhYworCWRvbmUKKyAgICAgIGZpCisKKyAgICAgICMgTm93IGhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGhzCisgICAgICBycGF0aD0KKyAgICAgIGhhcmRjb2RlX2xpYmRpcnM9CisgICAgICBmb3IgbGliZGlyIGluICRjb21waWxlX3JwYXRoICRmaW5hbGl6ZV9ycGF0aDsgZG8KKwlpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KKwkgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgorCSAgICBpZiB0ZXN0IC16ICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKwkgICAgICBoYXJkY29kZV9saWJkaXJzPSIkbGliZGlyIgorCSAgICBlbHNlCisJICAgICAgIyBKdXN0IGFjY3VtdWxhdGUgdGhlIHVuaXF1ZSBsaWJkaXJzLgorCSAgICAgIGNhc2UgJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIGluCisJICAgICAgKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQorCQk7OworCSAgICAgICopCisJCWhhcmRjb2RlX2xpYmRpcnM9IiRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgorCQk7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgIGVsc2UKKwkgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorCSAgICBycGF0aD0iJHJwYXRoICRmbGFnIgorCSAgZmkKKwllbGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KKwkgIGNhc2UgIiRwZXJtX3JwYXRoICIgaW4KKwkgICoiICRsaWJkaXIgIiopIDs7CisJICAqKSBwZXJtX3JwYXRoPSIkcGVybV9ycGF0aCAkbGliZGlyIiA7OworCSAgZXNhYworCWZpCisJY2FzZSAkaG9zdCBpbgorCSotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqKQorCSAgY2FzZSA6JGRsbHNlYXJjaHBhdGg6IGluCisJICAqIjokbGliZGlyOiIqKSA7OworCSAgKikgZGxsc2VhcmNocGF0aD0iJGRsbHNlYXJjaHBhdGg6JGxpYmRpciI7OworCSAgZXNhYworCSAgOzsKKwllc2FjCisgICAgICBkb25lCisgICAgICAjIFN1YnN0aXR1dGUgdGhlIGhhcmRjb2RlZCBsaWJkaXJzIGludG8gdGhlIHJwYXRoLgorICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiICYmCisJIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgorCWxpYmRpcj0iJGhhcmRjb2RlX2xpYmRpcnMiCisJZXZhbCBycGF0aD1cIiAkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisgICAgICBmaQorICAgICAgY29tcGlsZV9ycGF0aD0iJHJwYXRoIgorCisgICAgICBycGF0aD0KKyAgICAgIGhhcmRjb2RlX2xpYmRpcnM9CisgICAgICBmb3IgbGliZGlyIGluICRmaW5hbGl6ZV9ycGF0aDsgZG8KKwlpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KKwkgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgorCSAgICBpZiB0ZXN0IC16ICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKwkgICAgICBoYXJkY29kZV9saWJkaXJzPSIkbGliZGlyIgorCSAgICBlbHNlCisJICAgICAgIyBKdXN0IGFjY3VtdWxhdGUgdGhlIHVuaXF1ZSBsaWJkaXJzLgorCSAgICAgIGNhc2UgJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIGluCisJICAgICAgKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQorCQk7OworCSAgICAgICopCisJCWhhcmRjb2RlX2xpYmRpcnM9IiRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgorCQk7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgIGVsc2UKKwkgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorCSAgICBycGF0aD0iJHJwYXRoICRmbGFnIgorCSAgZmkKKwllbGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KKwkgIGNhc2UgIiRmaW5hbGl6ZV9wZXJtX3JwYXRoICIgaW4KKwkgICoiICRsaWJkaXIgIiopIDs7CisJICAqKSBmaW5hbGl6ZV9wZXJtX3JwYXRoPSIkZmluYWxpemVfcGVybV9ycGF0aCAkbGliZGlyIiA7OworCSAgZXNhYworCWZpCisgICAgICBkb25lCisgICAgICAjIFN1YnN0aXR1dGUgdGhlIGhhcmRjb2RlZCBsaWJkaXJzIGludG8gdGhlIHJwYXRoLgorICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiICYmCisJIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgorCWxpYmRpcj0iJGhhcmRjb2RlX2xpYmRpcnMiCisJZXZhbCBycGF0aD1cIiAkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisgICAgICBmaQorICAgICAgZmluYWxpemVfcnBhdGg9IiRycGF0aCIKKworICAgICAgaWYgdGVzdCAtbiAiJGxpYm9ianMiICYmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KKwkjIFRyYW5zZm9ybSBhbGwgdGhlIGxpYnJhcnkgb2JqZWN0cyBpbnRvIHN0YW5kYXJkIG9iamVjdHMuCisJY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFNQMk5MIHwgJFhzZWQgLWUgIiRsbzJvIiB8ICROTDJTUGAKKwlmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCisgICAgICBmaQorCisgICAgICBkbHN5bXM9CisgICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIiB8fCB0ZXN0ICIkZGxzZWxmIiAhPSBubzsgdGhlbgorCWlmIHRlc3QgLW4gIiROTSIgJiYgdGVzdCAtbiAiJGdsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KKwkgIGRsc3ltcz0iJHtvdXRwdXRuYW1lfVMuYyIKKwllbHNlCisJICAkZWNobyAiJG1vZGVuYW1lOiBub3QgY29uZmlndXJlZCB0byBleHRyYWN0IGdsb2JhbCBzeW1ib2xzIGZyb20gZGxwcmVvcGVuZWQgZmlsZXMiIDE+JjIKKwlmaQorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGRsc3ltcyI7IHRoZW4KKwljYXNlICRkbHN5bXMgaW4KKwkiIikgOzsKKwkqLmMpCisJICAjIERpc2NvdmVyIHRoZSBubGlzdCBvZiBlYWNoIG9mIHRoZSBkbGZpbGVzLgorCSAgbmxpc3Q9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX0ubm0iCisKKwkgICRzaG93ICIkcm0gJG5saXN0ICR7bmxpc3R9UyAke25saXN0fVQiCisJICAkcnVuICRybSAiJG5saXN0IiAiJHtubGlzdH1TIiAiJHtubGlzdH1UIgorCisJICAjIFBhcnNlIHRoZSBuYW1lIGxpc3QgaW50byBhIHNvdXJjZSBmaWxlLgorCSAgJHNob3cgImNyZWF0aW5nICRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiCisKKwkgIHRlc3QgLXogIiRydW4iICYmICRlY2hvID4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCisvKiAkZGxzeW1zIC0gc3ltYm9sIHJlc29sdXRpb24gdGFibGUgZm9yIFxgJG91dHB1dG5hbWUnIGRsc3ltIGVtdWxhdGlvbi4gKi8KKy8qIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAtIEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gXCJDXCIgeworI2VuZGlmCisKKy8qIFByZXZlbnQgdGhlIG9ubHkga2luZCBvZiBkZWNsYXJhdGlvbiBjb25mbGljdHMgd2UgY2FuIG1ha2UuICovCisjZGVmaW5lIGx0X3ByZWxvYWRlZF9zeW1ib2xzIHNvbWVfb3RoZXJfc3ltYm9sCisKKy8qIEV4dGVybmFsIHN5bWJvbCBkZWNsYXJhdGlvbnMgZm9yIHRoZSBjb21waWxlci4gKi9cCisiCisKKwkgIGlmIHRlc3QgIiRkbHNlbGYiID0geWVzOyB0aGVuCisJICAgICRzaG93ICJnZW5lcmF0aW5nIHN5bWJvbCBsaXN0IGZvciBcYCRvdXRwdXQnIgorCisJICAgIHRlc3QgLXogIiRydW4iICYmICRlY2hvICc6IEBQUk9HUkFNQCAnID4gIiRubGlzdCIKKworCSAgICAjIEFkZCBvdXIgb3duIHByb2dyYW0gb2JqZWN0cyB0byB0aGUgc3ltYm9sIGxpc3QuCisJICAgIHByb2dmaWxlcz1gJGVjaG8gIlgkb2JqcyRvbGRfZGVwbGlicyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAorCSAgICBmb3IgYXJnIGluICRwcm9nZmlsZXM7IGRvCisJICAgICAgJHNob3cgImV4dHJhY3RpbmcgZ2xvYmFsIEMgc3ltYm9scyBmcm9tIFxgJGFyZyciCisJICAgICAgJHJ1biBldmFsICIkTk0gJGFyZyB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPj4gJyRubGlzdCciCisJICAgIGRvbmUKKworCSAgICBpZiB0ZXN0IC1uICIkZXhjbHVkZV9leHBzeW1zIjsgdGhlbgorCSAgICAgICRydW4gZXZhbCAnZWdyZXAgLXYgIiAoJGV4Y2x1ZGVfZXhwc3ltcykkIiAiJG5saXN0IiA+ICIkbmxpc3QiVCcKKwkgICAgICAkcnVuIGV2YWwgJyRtdiAiJG5saXN0IlQgIiRubGlzdCInCisJICAgIGZpCisKKwkgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgorCSAgICAgICRydW4gZXZhbCAnZWdyZXAgLWUgIiRleHBvcnRfc3ltYm9sc19yZWdleCIgIiRubGlzdCIgPiAiJG5saXN0IlQnCisJICAgICAgJHJ1biBldmFsICckbXYgIiRubGlzdCJUICIkbmxpc3QiJworCSAgICBmaQorCisJICAgICMgUHJlcGFyZSB0aGUgbGlzdCBvZiBleHBvcnRlZCBzeW1ib2xzCisJICAgIGlmIHRlc3QgLXogIiRleHBvcnRfc3ltYm9scyI7IHRoZW4KKwkgICAgICBleHBvcnRfc3ltYm9scz0iJG91dHB1dF9vYmpkaXIvJG91dHB1dC5leHAiCisJICAgICAgJHJ1biAkcm0gJGV4cG9ydF9zeW1ib2xzCisJICAgICAgJHJ1biBldmFsICJzZWQgLW4gLWUgJy9eOiBAUFJPR1JBTUAkL2QnIC1lICdzL14uKiBcKC4qXCkkL1wxL3AnICInPCAiJG5saXN0IiA+ICIkZXhwb3J0X3N5bWJvbHMiJworCSAgICBlbHNlCisJICAgICAgJHJ1biBldmFsICJzZWQgLWUgJ3MvXChbXVsuKl4kXVwpL1xcXDEvZycgLWUgJ3MvXi8gLycgLWUgJ3MvJC8kLyciJyA8ICIkZXhwb3J0X3N5bWJvbHMiID4gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXQuZXhwIicKKwkgICAgICAkcnVuIGV2YWwgJ2dyZXAgLWYgIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXQuZXhwIiA8ICIkbmxpc3QiID4gIiRubGlzdCJUJworCSAgICAgICRydW4gZXZhbCAnbXYgIiRubGlzdCJUICIkbmxpc3QiJworCSAgICBmaQorCSAgZmkKKworCSAgZm9yIGFyZyBpbiAkZGxwcmVmaWxlczsgZG8KKwkgICAgJHNob3cgImV4dHJhY3RpbmcgZ2xvYmFsIEMgc3ltYm9scyBmcm9tIFxgJGFyZyciCisJICAgIG5hbWU9YGVjaG8gIiRhcmciIHwgc2VkIC1lICdzJV4uKi8lJSdgCisJICAgICRydW4gZXZhbCAnZWNobyAiOiAkbmFtZSAiID4+ICIkbmxpc3QiJworCSAgICAkcnVuIGV2YWwgIiROTSAkYXJnIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+PiAnJG5saXN0JyIKKwkgIGRvbmUKKworCSAgaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KKwkgICAgIyBNYWtlIHN1cmUgd2UgaGF2ZSBhdCBsZWFzdCBhbiBlbXB0eSBmaWxlLgorCSAgICB0ZXN0IC1mICIkbmxpc3QiIHx8IDogPiAiJG5saXN0IgorCisJICAgIGlmIHRlc3QgLW4gIiRleGNsdWRlX2V4cHN5bXMiOyB0aGVuCisJICAgICAgZWdyZXAgLXYgIiAoJGV4Y2x1ZGVfZXhwc3ltcykkIiAiJG5saXN0IiA+ICIkbmxpc3QiVAorCSAgICAgICRtdiAiJG5saXN0IlQgIiRubGlzdCIKKwkgICAgZmkKKworCSAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgorCSAgICBpZiBncmVwIC12ICJeOiAiIDwgIiRubGlzdCIgfCBzb3J0ICsyIHwgdW5pcSA+ICIkbmxpc3QiUzsgdGhlbgorCSAgICAgIDoKKwkgICAgZWxzZQorCSAgICAgIGdyZXAgLXYgIl46ICIgPCAiJG5saXN0IiA+ICIkbmxpc3QiUworCSAgICBmaQorCisJICAgIGlmIHRlc3QgLWYgIiRubGlzdCJTOyB0aGVuCisJICAgICAgZXZhbCAiJGdsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkbmxpc3QiUyA+PiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyInCisJICAgIGVsc2UKKwkgICAgICBlY2hvICcvKiBOT05FICovJyA+PiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIKKwkgICAgZmkKKworCSAgICAkZWNobyA+PiAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIgIlwKKworI3VuZGVmIGx0X3ByZWxvYWRlZF9zeW1ib2xzCisKKyNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KKyMgZGVmaW5lIGx0X3B0ciB2b2lkICoKKyNlbHNlCisjIGRlZmluZSBsdF9wdHIgY2hhciAqCisjIGRlZmluZSBjb25zdAorI2VuZGlmCisKKy8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAqLworY29uc3Qgc3RydWN0IHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgbHRfcHRyIGFkZHJlc3M7Cit9CitsdF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KK3tcCisiCisKKwkgICAgZXZhbCAiJGdsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MiIDwgIiRubGlzdCIgPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiCisKKwkgICAgJGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCisgIHswLCAobHRfcHRyKSAwfQorfTsKKworLyogVGhpcyB3b3JrcyBhcm91bmQgYSBwcm9ibGVtIGluIEZyZWVCU0QgbGlua2VyICovCisjaWZkZWYgRlJFRUJTRF9XT1JLQVJPVU5ECitzdGF0aWMgY29uc3Qgdm9pZCAqbHRfcHJlbG9hZGVkX3NldHVwKCkgeworICByZXR1cm4gbHRfcHJlbG9hZGVkX3N5bWJvbHM7Cit9CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWZcCisiCisJICBmaQorCisJICBwaWNfZmxhZ19mb3Jfc3ltdGFibGU9CisJICBjYXNlICRob3N0IGluCisJICAjIGNvbXBpbGluZyB0aGUgc3ltYm9sIHRhYmxlIGZpbGUgd2l0aCBwaWNfZmxhZyB3b3JrcyBhcm91bmQKKwkgICMgYSBGcmVlQlNEIGJ1ZyB0aGF0IGNhdXNlcyBwcm9ncmFtcyB0byBjcmFzaCB3aGVuIC1sbSBpcworCSAgIyBsaW5rZWQgYmVmb3JlIGFueSBvdGhlciBQSUMgb2JqZWN0LiAgQnV0IHdlIG11c3Qgbm90IHVzZQorCSAgIyBwaWNfZmxhZyB3aGVuIGxpbmtpbmcgd2l0aCAtc3RhdGljLiAgVGhlIHByb2JsZW0gZXhpc3RzIGluCisJICAjIEZyZWVCU0QgMi4yLjYgYW5kIGlzIGZpeGVkIGluIEZyZWVCU0QgMy4xLgorCSAgKi0qLWZyZWVic2QyKnwqLSotZnJlZWJzZDMuMCp8Ki0qLWZyZWVic2RlbGYzLjAqKQorCSAgICBjYXNlICIkY29tcGlsZV9jb21tYW5kICIgaW4KKwkgICAgKiIgLXN0YXRpYyAiKikgOzsKKwkgICAgKikgcGljX2ZsYWdfZm9yX3N5bXRhYmxlPSIgJHBpY19mbGFnIC1EUElDIC1ERlJFRUJTRF9XT1JLQVJPVU5EIjs7CisJICAgIGVzYWM7OworCSAgKi0qLWhwdXgqKQorCSAgICBjYXNlICIkY29tcGlsZV9jb21tYW5kICIgaW4KKwkgICAgKiIgLXN0YXRpYyAiKikgOzsKKwkgICAgKikgcGljX2ZsYWdfZm9yX3N5bXRhYmxlPSIgJHBpY19mbGFnIC1EUElDIjs7CisJICAgIGVzYWMKKwkgIGVzYWMKKworCSAgIyBOb3cgY29tcGlsZSB0aGUgZHluYW1pYyBzeW1ib2wgZmlsZS4KKwkgICRzaG93ICIoY2QgJG91dHB1dF9vYmpkaXIgJiYgJENDIC1jJG5vX2J1aWx0aW5fZmxhZyRwaWNfZmxhZ19mb3Jfc3ltdGFibGUgXCIkZGxzeW1zXCIpIgorCSAgJHJ1biBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJENDIC1jJG5vX2J1aWx0aW5fZmxhZyRwaWNfZmxhZ19mb3Jfc3ltdGFibGUgIiRkbHN5bXMiKScgfHwgZXhpdCAkPworCisJICAjIENsZWFuIHVwIHRoZSBnZW5lcmF0ZWQgZmlsZXMuCisJICAkc2hvdyAiJHJtICRvdXRwdXRfb2JqZGlyLyRkbHN5bXMgJG5saXN0ICR7bmxpc3R9UyAke25saXN0fVQiCisJICAkcnVuICRybSAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIgIiRubGlzdCIgIiR7bmxpc3R9UyIgIiR7bmxpc3R9VCIKKworCSAgIyBUcmFuc2Zvcm0gdGhlIHN5bWJvbCBmaWxlIGludG8gdGhlIGNvcnJlY3QgbmFtZS4KKwkgIGNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0lImAKKwkgIGZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSUiYAorCSAgOzsKKwkqKQorCSAgJGVjaG8gIiRtb2RlbmFtZTogdW5rbm93biBzdWZmaXggZm9yIFxgJGRsc3ltcyciIDE+JjIKKwkgIGV4aXQgMQorCSAgOzsKKwllc2FjCisgICAgICBlbHNlCisJIyBXZSBrZWVwIGdvaW5nIGp1c3QgaW4gY2FzZSB0aGUgdXNlciBkaWRuJ3QgcmVmZXIgdG8KKwkjIGx0X3ByZWxvYWRlZF9zeW1ib2xzLiAgVGhlIGxpbmtlciB3aWxsIGZhaWwgaWYgZ2xvYmFsX3N5bWJvbF9waXBlCisJIyByZWFsbHkgd2FzIHJlcXVpcmVkLgorCisJIyBOdWxsaWZ5IHRoZSBzeW1ib2wgZmlsZS4KKwljb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyUgQFNZTUZJTEVAJSUiYAorCWZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlIEBTWU1GSUxFQCUlImAKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgJG5lZWRfcmVsaW5rID0gbm8gfHwgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCisJIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgorCWNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dCInJWcnYAorCWxpbmtfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgorCisJIyBXZSBoYXZlIG5vIHVuaW5zdGFsbGVkIGxpYnJhcnkgZGVwZW5kZW5jaWVzLCBzbyBmaW5hbGl6ZSByaWdodCBub3cuCisJJHNob3cgIiRsaW5rX2NvbW1hbmQiCisJJHJ1biBldmFsICIkbGlua19jb21tYW5kIgorCXN0YXR1cz0kPworCisJIyBEZWxldGUgdGhlIGdlbmVyYXRlZCBmaWxlcy4KKwlpZiB0ZXN0IC1uICIkZGxzeW1zIjsgdGhlbgorCSAgJHNob3cgIiRybSAkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0iCisJICAkcnVuICRybSAiJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfVMuJHtvYmpleHR9IgorCWZpCisKKwlleGl0ICRzdGF0dXMKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgorCSMgV2Ugc2hvdWxkIHNldCB0aGUgc2hsaWJwYXRoX3ZhcgorCXJwYXRoPQorCWZvciBkaXIgaW4gJHRlbXBfcnBhdGg7IGRvCisJICBjYXNlICRkaXIgaW4KKwkgIFtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikKKwkgICAgIyBBYnNvbHV0ZSBwYXRoLgorCSAgICBycGF0aD0iJHJwYXRoJGRpcjoiCisJICAgIDs7CisJICAqKQorCSAgICAjIFJlbGF0aXZlIHBhdGg6IGFkZCBhIHRoaXNkaXIgZW50cnkuCisJICAgIHJwYXRoPSIkcnBhdGhcJHRoaXNkaXIvJGRpcjoiCisJICAgIDs7CisJICBlc2FjCisJZG9uZQorCXRlbXBfcnBhdGg9IiRycGF0aCIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRjb21waWxlX3NobGlicGF0aCRmaW5hbGl6ZV9zaGxpYnBhdGgiOyB0aGVuCisJY29tcGlsZV9jb21tYW5kPSIkc2hsaWJwYXRoX3Zhcj1cIiRjb21waWxlX3NobGlicGF0aCRmaW5hbGl6ZV9zaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyXCIgJGNvbXBpbGVfY29tbWFuZCIKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0IC1uICIkZmluYWxpemVfc2hsaWJwYXRoIjsgdGhlbgorCWZpbmFsaXplX2NvbW1hbmQ9IiRzaGxpYnBhdGhfdmFyPVwiJGZpbmFsaXplX3NobGlicGF0aFwkJHNobGlicGF0aF92YXJcIiAkZmluYWxpemVfY29tbWFuZCIKKyAgICAgIGZpCisKKyAgICAgIGNvbXBpbGVfdmFyPQorICAgICAgZmluYWxpemVfdmFyPQorICAgICAgaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgorCWlmIHRlc3QgLW4gIiRwZXJtX3JwYXRoIjsgdGhlbgorCSAgIyBXZSBzaG91bGQgc2V0IHRoZSBydW5wYXRoX3Zhci4KKwkgIHJwYXRoPQorCSAgZm9yIGRpciBpbiAkcGVybV9ycGF0aDsgZG8KKwkgICAgcnBhdGg9IiRycGF0aCRkaXI6IgorCSAgZG9uZQorCSAgY29tcGlsZV92YXI9IiRydW5wYXRoX3Zhcj1cIiRycGF0aFwkJHJ1bnBhdGhfdmFyXCIgIgorCWZpCisJaWYgdGVzdCAtbiAiJGZpbmFsaXplX3Blcm1fcnBhdGgiOyB0aGVuCisJICAjIFdlIHNob3VsZCBzZXQgdGhlIHJ1bnBhdGhfdmFyLgorCSAgcnBhdGg9CisJICBmb3IgZGlyIGluICRmaW5hbGl6ZV9wZXJtX3JwYXRoOyBkbworCSAgICBycGF0aD0iJHJwYXRoJGRpcjoiCisJICBkb25lCisJICBmaW5hbGl6ZV92YXI9IiRydW5wYXRoX3Zhcj1cIiRycGF0aFwkJHJ1bnBhdGhfdmFyXCIgIgorCWZpCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkbm9faW5zdGFsbCIgPSB5ZXM7IHRoZW4KKwkjIFdlIGRvbid0IG5lZWQgdG8gY3JlYXRlIGEgd3JhcHBlciBzY3JpcHQuCisJbGlua19jb21tYW5kPSIkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCisJIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgorCWxpbmtfY29tbWFuZD1gJGVjaG8gIlgkbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dCInJWcnYAorCSMgRGVsZXRlIHRoZSBvbGQgb3V0cHV0IGZpbGUuCisJJHJ1biAkcm0gJG91dHB1dAorCSMgTGluayB0aGUgZXhlY3V0YWJsZSBhbmQgZXhpdAorCSRzaG93ICIkbGlua19jb21tYW5kIgorCSRydW4gZXZhbCAiJGxpbmtfY29tbWFuZCIgfHwgZXhpdCAkPworCWV4aXQgMAorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2FjdGlvbiIgPSByZWxpbms7IHRoZW4KKwkjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKKwlsaW5rX2NvbW1hbmQ9IiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKKwlyZWxpbmtfY29tbWFuZD0iJGZpbmFsaXplX3ZhciRmaW5hbGl6ZV9jb21tYW5kJGZpbmFsaXplX3JwYXRoIgorCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogdGhpcyBwbGF0Zm9ybSBkb2VzIG5vdCBsaWtlIHVuaW5zdGFsbGVkIHNoYXJlZCBsaWJyYXJpZXMiIDE+JjIKKwkkZWNobyAiJG1vZGVuYW1lOiBcYCRvdXRwdXQnIHdpbGwgYmUgcmVsaW5rZWQgZHVyaW5nIGluc3RhbGxhdGlvbiIgMT4mMgorICAgICAgZWxzZQorCWlmIHRlc3QgIiRmYXN0X2luc3RhbGwiICE9IG5vOyB0aGVuCisJICBsaW5rX2NvbW1hbmQ9IiRmaW5hbGl6ZV92YXIkY29tcGlsZV9jb21tYW5kJGZpbmFsaXplX3JwYXRoIgorCSAgaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSB5ZXM7IHRoZW4KKwkgICAgcmVsaW5rX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJVwkcHJvZ2Rpci9cJGZpbGUlZydgCisJICBlbHNlCisJICAgICMgZmFzdF9pbnN0YWxsIGlzIHNldCB0byBuZWVkbGVzcworCSAgICByZWxpbmtfY29tbWFuZD0KKwkgIGZpCisJZWxzZQorCSAgbGlua19jb21tYW5kPSIkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiCisJICByZWxpbmtfY29tbWFuZD0iJGZpbmFsaXplX3ZhciRmaW5hbGl6ZV9jb21tYW5kJGZpbmFsaXplX3JwYXRoIgorCWZpCisgICAgICBmaQorCisgICAgICAjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCisgICAgICBsaW5rX2NvbW1hbmQ9YCRlY2hvICJYJGxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lIiclZydgCisKKyAgICAgICMgRGVsZXRlIHRoZSBvbGQgb3V0cHV0IGZpbGVzLgorICAgICAgJHJ1biAkcm0gJG91dHB1dCAkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSAkb3V0cHV0X29iamRpci9sdC0kb3V0cHV0bmFtZQorCisgICAgICAkc2hvdyAiJGxpbmtfY29tbWFuZCIKKyAgICAgICRydW4gZXZhbCAiJGxpbmtfY29tbWFuZCIgfHwgZXhpdCAkPworCisgICAgICAjIE5vdyBjcmVhdGUgdGhlIHdyYXBwZXIgc2NyaXB0LgorICAgICAgJHNob3cgImNyZWF0aW5nICRvdXRwdXQiCisKKyAgICAgICMgUXVvdGUgdGhlIHJlbGluayBjb21tYW5kIGZvciBzaGlwcGluZy4KKyAgICAgIGlmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KKwkjIFByZXNlcnZlIGFueSB2YXJpYWJsZXMgdGhhdCBtYXkgYWZmZWN0IGNvbXBpbGVyIGJlaGF2aW9yCisJZm9yIHZhciBpbiAkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms7IGRvCisJICBpZiBldmFsIHRlc3QgLXogXCJcJHskdmFyK3NldH1cIjsgdGhlbgorCSAgICByZWxpbmtfY29tbWFuZD0ieyB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCIgfHwgdW5zZXQgJHZhciB8fCB7ICR2YXI9OyBleHBvcnQgJHZhcjsgfTsgfTsgJHJlbGlua19jb21tYW5kIgorCSAgZWxpZiBldmFsIHZhcl92YWx1ZT1cJCR2YXI7IHRlc3QgLXogIiR2YXJfdmFsdWUiOyB0aGVuCisJICAgIHJlbGlua19jb21tYW5kPSIkdmFyPTsgZXhwb3J0ICR2YXI7ICRyZWxpbmtfY29tbWFuZCIKKwkgIGVsc2UKKwkgICAgdmFyX3ZhbHVlPWAkZWNobyAiWCR2YXJfdmFsdWUiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorCSAgICByZWxpbmtfY29tbWFuZD0iJHZhcj1cIiR2YXJfdmFsdWVcIjsgZXhwb3J0ICR2YXI7ICRyZWxpbmtfY29tbWFuZCIKKwkgIGZpCisJZG9uZQorCXJlbGlua19jb21tYW5kPSJjZCBgcHdkYDsgJHJlbGlua19jb21tYW5kIgorCXJlbGlua19jb21tYW5kPWAkZWNobyAiWCRyZWxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgICBmaQorCisgICAgICAjIFF1b3RlICRlY2hvIGZvciBzaGlwcGluZy4KKyAgICAgIGlmIHRlc3QgIlgkZWNobyIgPSAiWCRTSEVMTCAkMCAtLWZhbGxiYWNrLWVjaG8iOyB0aGVuCisJY2FzZSAkMCBpbgorCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgcWVjaG89IiRTSEVMTCAkMCAtLWZhbGxiYWNrLWVjaG8iOzsKKwkqKSBxZWNobz0iJFNIRUxMIGBwd2RgLyQwIC0tZmFsbGJhY2stZWNobyI7OworCWVzYWMKKwlxZWNobz1gJGVjaG8gIlgkcWVjaG8iIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgICAgZWxzZQorCXFlY2hvPWAkZWNobyAiWCRlY2hvIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICAgIGZpCisKKyAgICAgICMgT25seSBhY3R1YWxseSBkbyB0aGluZ3MgaWYgb3VyIHJ1biBjb21tYW5kIGlzIG5vbi1udWxsLgorICAgICAgaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KKwkjIHdpbjMyIHdpbGwgdGhpbmsgdGhlIHNjcmlwdCBpcyBhIGJpbmFyeSBpZiBpdCBoYXMKKwkjIGEgLmV4ZSBzdWZmaXgsIHNvIHdlIHN0cmlwIGl0IG9mZiBoZXJlLgorCWNhc2UgJG91dHB1dCBpbgorCSAgKi5leGUpIG91dHB1dD1gZWNobyAkb3V0cHV0fHNlZCAncywuZXhlJCwsJ2AgOzsKKwllc2FjCisJIyB0ZXN0IGZvciBjeWd3aW4gYmVjYXVzZSBtdiBmYWlscyB3L28gLmV4ZSBleHRlbnNpb25zCisJY2FzZSAkaG9zdCBpbgorCSAgKmN5Z3dpbiopIGV4ZWV4dD0uZXhlIDs7CisJICAqKSBleGVleHQ9IDs7CisJZXNhYworCSRybSAkb3V0cHV0CisJdHJhcCAiJHJtICRvdXRwdXQ7IGV4aXQgMSIgMSAyIDE1CisKKwkkZWNobyA+ICRvdXRwdXQgIlwKKyMhICRTSEVMTAorCisjICRvdXRwdXQgLSB0ZW1wb3Jhcnkgd3JhcHBlciBzY3JpcHQgZm9yICRvYmpkaXIvJG91dHB1dG5hbWUKKyMgR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIC0gR05VICRQQUNLQUdFICRWRVJTSU9OJFRJTUVTVEFNUAorIworIyBUaGUgJG91dHB1dCBwcm9ncmFtIGNhbm5vdCBiZSBkaXJlY3RseSBleGVjdXRlZCB1bnRpbCBhbGwgdGhlIGxpYnRvb2wKKyMgbGlicmFyaWVzIHRoYXQgaXQgZGVwZW5kcyBvbiBhcmUgaW5zdGFsbGVkLgorIworIyBUaGlzIHdyYXBwZXIgc2NyaXB0IHNob3VsZCBuZXZlciBiZSBtb3ZlZCBvdXQgb2YgdGhlIGJ1aWxkIGRpcmVjdG9yeS4KKyMgSWYgaXQgaXMsIGl0IHdpbGwgbm90IG9wZXJhdGUgY29ycmVjdGx5LgorCisjIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCisjIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgorWHNlZD0nc2VkIC1lIDFzL15YLy8nCitzZWRfcXVvdGVfc3Vic3Q9JyRzZWRfcXVvdGVfc3Vic3QnCisKKyMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0CisjIGlmIENEUEFUSCBpcyBzZXQuCitpZiB0ZXN0IFwiXCR7Q0RQQVRIK3NldH1cIiA9IHNldDsgdGhlbiBDRFBBVEg9OjsgZXhwb3J0IENEUEFUSDsgZmkKKworcmVsaW5rX2NvbW1hbmQ9XCIkcmVsaW5rX2NvbW1hbmRcIgorCisjIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgZGV0ZXJtaW5lcyBvdXIgb3BlcmF0aW9uIG1vZGUuCitpZiB0ZXN0IFwiXCRsaWJ0b29sX2luc3RhbGxfbWFnaWNcIiA9IFwiJG1hZ2ljXCI7IHRoZW4KKyAgIyBpbnN0YWxsIG1vZGUgbmVlZHMgdGhlIGZvbGxvd2luZyB2YXJpYWJsZToKKyAgbm90aW5zdF9kZXBsaWJzPSckbm90aW5zdF9kZXBsaWJzJworZWxzZQorICAjIFdoZW4gd2UgYXJlIHNvdXJjZWQgaW4gZXhlY3V0ZSBtb2RlLCBcJGZpbGUgYW5kIFwkZWNobyBhcmUgYWxyZWFkeSBzZXQuCisgIGlmIHRlc3QgXCJcJGxpYnRvb2xfZXhlY3V0ZV9tYWdpY1wiICE9IFwiJG1hZ2ljXCI7IHRoZW4KKyAgICBlY2hvPVwiJHFlY2hvXCIKKyAgICBmaWxlPVwiXCQwXCIKKyAgICAjIE1ha2Ugc3VyZSBlY2hvIHdvcmtzLgorICAgIGlmIHRlc3QgXCJYXCQxXCIgPSBYLS1uby1yZWV4ZWM7IHRoZW4KKyAgICAgICMgRGlzY2FyZCB0aGUgLS1uby1yZWV4ZWMgZmxhZywgYW5kIGNvbnRpbnVlLgorICAgICAgc2hpZnQKKyAgICBlbGlmIHRlc3QgXCJYXGAoXCRlY2hvICdcdCcpIDI+L2Rldi9udWxsXGBcIiA9ICdYXHQnOyB0aGVuCisgICAgICAjIFlpcHBlZSwgXCRlY2hvIHdvcmtzIQorICAgICAgOgorICAgIGVsc2UKKyAgICAgICMgUmVzdGFydCB1bmRlciB0aGUgY29ycmVjdCBzaGVsbCwgYW5kIHRoZW4gbWF5YmUgXCRlY2hvIHdpbGwgd29yay4KKyAgICAgIGV4ZWMgJFNIRUxMIFwiXCQwXCIgLS1uby1yZWV4ZWMgXCR7MStcIlwkQFwifQorICAgIGZpCisgIGZpXAorIgorCSRlY2hvID4+ICRvdXRwdXQgIlwKKworICAjIEZpbmQgdGhlIGRpcmVjdG9yeSB0aGF0IHRoaXMgc2NyaXB0IGxpdmVzIGluLgorICB0aGlzZGlyPVxgXCRlY2hvIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJS9bXi9dKiQlJSdcYAorICB0ZXN0IFwieFwkdGhpc2RpclwiID0gXCJ4XCRmaWxlXCIgJiYgdGhpc2Rpcj0uCisKKyAgIyBGb2xsb3cgc3ltYm9saWMgbGlua3MgdW50aWwgd2UgZ2V0IHRvIHRoZSByZWFsIHRoaXNkaXIuCisgIGZpbGU9XGBscyAtbGQgXCJcJGZpbGVcIiB8IHNlZCAtbiAncy8uKi0+IC8vcCdcYAorICB3aGlsZSB0ZXN0IC1uIFwiXCRmaWxlXCI7IGRvCisgICAgZGVzdGRpcj1cYFwkZWNobyBcIlhcJGZpbGVcIiB8IFwkWHNlZCAtZSAncyUvW14vXSpcJCUlJ1xgCisKKyAgICAjIElmIHRoZXJlIHdhcyBhIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gY2hhbmdlIHRoaXNkaXIuCisgICAgaWYgdGVzdCBcInhcJGRlc3RkaXJcIiAhPSBcInhcJGZpbGVcIjsgdGhlbgorICAgICAgY2FzZSBcIlwkZGVzdGRpclwiIGluCisgICAgICBbXFxcXC9dKiB8IFtBLVphLXpdOltcXFxcL10qKSB0aGlzZGlyPVwiXCRkZXN0ZGlyXCIgOzsKKyAgICAgICopIHRoaXNkaXI9XCJcJHRoaXNkaXIvXCRkZXN0ZGlyXCIgOzsKKyAgICAgIGVzYWMKKyAgICBmaQorCisgICAgZmlsZT1cYFwkZWNobyBcIlhcJGZpbGVcIiB8IFwkWHNlZCAtZSAncyVeLiovJSUnXGAKKyAgICBmaWxlPVxgbHMgLWxkIFwiXCR0aGlzZGlyL1wkZmlsZVwiIHwgc2VkIC1uICdzLy4qLT4gLy9wJ1xgCisgIGRvbmUKKworICAjIFRyeSB0byBnZXQgdGhlIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lLgorICBhYnNkaXI9XGBjZCBcIlwkdGhpc2RpclwiICYmIHB3ZFxgCisgIHRlc3QgLW4gXCJcJGFic2RpclwiICYmIHRoaXNkaXI9XCJcJGFic2RpclwiCisiCisKKwlpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllczsgdGhlbgorCSAgZWNobyA+PiAkb3V0cHV0ICJcCisgIHByb2dyYW09bHQtJyRvdXRwdXRuYW1lJyRleGVleHQKKyAgcHJvZ2Rpcj1cIlwkdGhpc2Rpci8kb2JqZGlyXCIKKworICBpZiB0ZXN0ICEgLWYgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgfHwgXFwKKyAgICAgeyBmaWxlPVxgbHMgLTFkdCBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiBcIlwkcHJvZ2Rpci8uLi9cJHByb2dyYW1cIiAyPi9kZXYvbnVsbCB8IHNlZCAxcVxgOyBcXAorICAgICAgIHRlc3QgXCJYXCRmaWxlXCIgIT0gXCJYXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB9OyB0aGVuCisKKyAgICBmaWxlPVwiXCRcJC1cJHByb2dyYW1cIgorCisgICAgaWYgdGVzdCAhIC1kIFwiXCRwcm9nZGlyXCI7IHRoZW4KKyAgICAgICRta2RpciBcIlwkcHJvZ2RpclwiCisgICAgZWxzZQorICAgICAgJHJtIFwiXCRwcm9nZGlyL1wkZmlsZVwiCisgICAgZmkiCisKKwkgIGVjaG8gPj4gJG91dHB1dCAiXAorCisgICAgIyByZWxpbmsgZXhlY3V0YWJsZSBpZiBuZWNlc3NhcnkKKyAgICBpZiB0ZXN0IC1uIFwiXCRyZWxpbmtfY29tbWFuZFwiOyB0aGVuCisgICAgICBpZiByZWxpbmtfY29tbWFuZF9vdXRwdXQ9XGBldmFsIFwkcmVsaW5rX2NvbW1hbmQgMj4mMVxgOyB0aGVuIDoKKyAgICAgIGVsc2UKKwkkZWNobyBcIlwkcmVsaW5rX2NvbW1hbmRfb3V0cHV0XCIgPiYyCisJJHJtIFwiXCRwcm9nZGlyL1wkZmlsZVwiCisJZXhpdCAxCisgICAgICBmaQorICAgIGZpCisKKyAgICAkbXYgXCJcJHByb2dkaXIvXCRmaWxlXCIgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgMj4vZGV2L251bGwgfHwKKyAgICB7ICRybSBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIjsKKyAgICAgICRtdiBcIlwkcHJvZ2Rpci9cJGZpbGVcIiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIjsgfQorICAgICRybSBcIlwkcHJvZ2Rpci9cJGZpbGVcIgorICBmaSIKKwllbHNlCisJICBlY2hvID4+ICRvdXRwdXQgIlwKKyAgcHJvZ3JhbT0nJG91dHB1dG5hbWUnCisgIHByb2dkaXI9XCJcJHRoaXNkaXIvJG9iamRpclwiCisiCisJZmkKKworCWVjaG8gPj4gJG91dHB1dCAiXAorCisgIGlmIHRlc3QgLWYgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7IHRoZW4iCisKKwkjIEV4cG9ydCBvdXIgc2hsaWJwYXRoX3ZhciBpZiB3ZSBoYXZlIG9uZS4KKwlpZiB0ZXN0ICIkc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoIiA9IHllcyAmJiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciIgJiYgdGVzdCAtbiAiJHRlbXBfcnBhdGgiOyB0aGVuCisJICAkZWNobyA+PiAkb3V0cHV0ICJcCisgICAgIyBBZGQgb3VyIG93biBsaWJyYXJ5IHBhdGggdG8gJHNobGlicGF0aF92YXIKKyAgICAkc2hsaWJwYXRoX3Zhcj1cIiR0ZW1wX3JwYXRoXCQkc2hsaWJwYXRoX3ZhclwiCisKKyAgICAjIFNvbWUgc3lzdGVtcyBjYW5ub3QgY29wZSB3aXRoIGNvbG9uLXRlcm1pbmF0ZWQgJHNobGlicGF0aF92YXIKKyAgICAjIFRoZSBzZWNvbmQgY29sb24gaXMgYSB3b3JrYXJvdW5kIGZvciBhIGJ1ZyBpbiBCZU9TIFI0IHNlZAorICAgICRzaGxpYnBhdGhfdmFyPVxgXCRlY2hvIFwiWFwkJHNobGlicGF0aF92YXJcIiB8IFwkWHNlZCAtZSAncy86OipcJC8vJ1xgCisKKyAgICBleHBvcnQgJHNobGlicGF0aF92YXIKKyIKKwlmaQorCisJIyBmaXh1cCB0aGUgZGxsIHNlYXJjaHBhdGggaWYgd2UgbmVlZCB0by4KKwlpZiB0ZXN0IC1uICIkZGxsc2VhcmNocGF0aCI7IHRoZW4KKwkgICRlY2hvID4+ICRvdXRwdXQgIlwKKyAgICAjIEFkZCB0aGUgZGxsIHNlYXJjaCBwYXRoIGNvbXBvbmVudHMgdG8gdGhlIGV4ZWN1dGFibGUgUEFUSAorICAgIFBBVEg9JGRsbHNlYXJjaHBhdGg6XCRQQVRICisiCisJZmkKKworCSRlY2hvID4+ICRvdXRwdXQgIlwKKyAgICBpZiB0ZXN0IFwiXCRsaWJ0b29sX2V4ZWN1dGVfbWFnaWNcIiAhPSBcIiRtYWdpY1wiOyB0aGVuCisgICAgICAjIFJ1biB0aGUgYWN0dWFsIHByb2dyYW0gd2l0aCBvdXIgYXJndW1lbnRzLgorIgorCWNhc2UgJGhvc3QgaW4KKwkjIHdpbjMyIHN5c3RlbXMgbmVlZCB0byB1c2UgdGhlIHByb2cgcGF0aCBmb3IgZGxsCisJIyBsb29rdXAgdG8gd29yaworCSotKi1jeWd3aW4qIHwgKi0qLXB3MzIqKQorCSAgJGVjaG8gPj4gJG91dHB1dCAiXAorICAgICAgZXhlYyBcJHByb2dkaXIvXCRwcm9ncmFtIFwkezErXCJcJEBcIn0KKyIKKwkgIDs7CisKKwkjIEJhY2tzbGFzaGVzIHNlcGFyYXRlIGRpcmVjdG9yaWVzIG9uIHBsYWluIHdpbmRvd3MKKwkqLSotbWluZ3cgfCAqLSotb3MyKikKKwkgICRlY2hvID4+ICRvdXRwdXQgIlwKKyAgICAgIGV4ZWMgXCRwcm9nZGlyXFxcXFwkcHJvZ3JhbSBcJHsxK1wiXCRAXCJ9CisiCisJICA7OworCisJKikKKwkgICRlY2hvID4+ICRvdXRwdXQgIlwKKyAgICAgICMgRXhwb3J0IHRoZSBwYXRoIHRvIHRoZSBwcm9ncmFtLgorICAgICAgUEFUSD1cIlwkcHJvZ2RpcjpcJFBBVEhcIgorICAgICAgZXhwb3J0IFBBVEgKKworICAgICAgZXhlYyBcJHByb2dyYW0gXCR7MStcIlwkQFwifQorIgorCSAgOzsKKwllc2FjCisJJGVjaG8gPj4gJG91dHB1dCAiXAorICAgICAgXCRlY2hvIFwiXCQwOiBjYW5ub3QgZXhlYyBcJHByb2dyYW0gXCR7MStcIlwkQFwifVwiCisgICAgICBleGl0IDEKKyAgICBmaQorICBlbHNlCisgICAgIyBUaGUgcHJvZ3JhbSBkb2Vzbid0IGV4aXN0LgorICAgIFwkZWNobyBcIlwkMDogZXJyb3I6IFwkcHJvZ2Rpci9cJHByb2dyYW0gZG9lcyBub3QgZXhpc3RcIiAxPiYyCisgICAgXCRlY2hvIFwiVGhpcyBzY3JpcHQgaXMganVzdCBhIHdyYXBwZXIgZm9yIFwkcHJvZ3JhbS5cIiAxPiYyCisgICAgZWNobyBcIlNlZSB0aGUgJFBBQ0tBR0UgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cIiAxPiYyCisgICAgZXhpdCAxCisgIGZpCitmaVwKKyIKKwljaG1vZCAreCAkb3V0cHV0CisgICAgICBmaQorICAgICAgZXhpdCAwCisgICAgICA7OworICAgIGVzYWMKKworICAgICMgU2VlIGlmIHdlIG5lZWQgdG8gYnVpbGQgYW4gb2xkLWZhc2hpb25lZCBhcmNoaXZlLgorICAgIGZvciBvbGRsaWIgaW4gJG9sZGxpYnM7IGRvCisKKyAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gY29udmVuaWVuY2U7IHRoZW4KKwlvbGRvYmpzPSIkbGlib2Jqc19zYXZlIgorCWFkZGxpYnM9IiRjb252ZW5pZW5jZSIKKwlidWlsZF9saWJ0b29sX2xpYnM9bm8KKyAgICAgIGVsc2UKKwlpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG1vZHVsZTsgdGhlbgorCSAgb2xkb2Jqcz0iJGxpYm9ianNfc2F2ZSIKKwkgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubworCWVsc2UKKwkgIG9sZG9ianM9IiRvYmpzJG9sZF9kZXBsaWJzICJgJGVjaG8gIlgkbGlib2Jqc19zYXZlIiB8ICRTUDJOTCB8ICRYc2VkIC1lICcvXC4nJHtsaWJleHR9JyQvZCcgLWUgJy9cLmxpYiQvZCcgLWUgIiRsbzJvIiB8ICROTDJTUGAKKwlmaQorCWFkZGxpYnM9IiRvbGRfY29udmVuaWVuY2UiCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkYWRkbGlicyI7IHRoZW4KKwlnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgorCSRzaG93ICIke3JtfXIgJGdlbnRvcCIKKwkkcnVuICR7cm19ciAiJGdlbnRvcCIKKwkkc2hvdyAibWtkaXIgJGdlbnRvcCIKKwkkcnVuIG1rZGlyICIkZ2VudG9wIgorCXN0YXR1cz0kPworCWlmIHRlc3QgJHN0YXR1cyAtbmUgMCAmJiB0ZXN0ICEgLWQgIiRnZW50b3AiOyB0aGVuCisJICBleGl0ICRzdGF0dXMKKwlmaQorCWdlbmVyYXRlZD0iJGdlbmVyYXRlZCAkZ2VudG9wIgorCisJIyBBZGQgaW4gbWVtYmVycyBmcm9tIGNvbnZlbmllbmNlIGFyY2hpdmVzLgorCWZvciB4bGliIGluICRhZGRsaWJzOyBkbworCSAgIyBFeHRyYWN0IHRoZSBvYmplY3RzLgorCSAgY2FzZSAkeGxpYiBpbgorCSAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSB4YWJzPSIkeGxpYiIgOzsKKwkgICopIHhhYnM9YHB3ZGAiLyR4bGliIiA7OworCSAgZXNhYworCSAgeGxpYj1gJGVjaG8gIlgkeGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCSAgeGRpcj0iJGdlbnRvcC8keGxpYiIKKworCSAgJHNob3cgIiR7cm19ciAkeGRpciIKKwkgICRydW4gJHtybX1yICIkeGRpciIKKwkgICRzaG93ICJta2RpciAkeGRpciIKKwkgICRydW4gbWtkaXIgIiR4ZGlyIgorCSAgc3RhdHVzPSQ/CisJICBpZiB0ZXN0ICRzdGF0dXMgLW5lIDAgJiYgdGVzdCAhIC1kICIkeGRpciI7IHRoZW4KKwkgICAgZXhpdCAkc3RhdHVzCisJICBmaQorCSAgJHNob3cgIihjZCAkeGRpciAmJiAkQVIgeCAkeGFicykiCisJICAkcnVuIGV2YWwgIihjZCBcJHhkaXIgJiYgJEFSIHggXCR4YWJzKSIgfHwgZXhpdCAkPworCisJICBvbGRvYmpzPSIkb2xkb2JqcyAiYGZpbmQgJHhkaXIgLW5hbWUgXCouJHtvYmpleHR9IC1wcmludCAtbyAtbmFtZSBcKi5sbyAtcHJpbnQgfCAkTkwyU1BgCisJZG9uZQorICAgICAgZmkKKworICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIGFyY2hpdmUgY29tbWFuZHMuCisgICAgICBpZiB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyIgJiYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKwlldmFsIGNtZHM9XCIkb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc1wiCisgICAgICBlbHNlCisJIyBFbnN1cmUgdGhhdCB3ZSBoYXZlIC5vIG9iamVjdHMgaW4gcGxhY2UgaW4gY2FzZSB3ZSBkZWNpZGVkCisJIyBub3QgdG8gYnVpbGQgYSBzaGFyZWQgbGlicmFyeSwgYW5kIGhhdmUgZmFsbGVuIGJhY2sgdG8gYnVpbGRpbmcKKwkjIHN0YXRpYyBsaWJzIGV2ZW4gdGhvdWdoIC0tZGlzYWJsZS1zdGF0aWMgd2FzIHBhc3NlZCEKKwlmb3Igb2xkb2JqIGluICRvbGRvYmpzOyBkbworCSAgaWYgdGVzdCAhIC1mICRvbGRvYmo7IHRoZW4KKwkgICAgeGRpcj1gJGVjaG8gIlgkb2xkb2JqIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisJICAgIGlmIHRlc3QgIlgkeGRpciIgPSAiWCRvbGRvYmoiOyB0aGVuCisJICAgICAgeGRpcj0iLiIKKwkgICAgZWxzZQorCSAgICAgIHhkaXI9IiR4ZGlyIgorCSAgICBmaQorCSAgICBiYXNlb2JqPWAkZWNobyAiWCRvbGRvYmoiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKwkgICAgb2JqPWAkZWNobyAiWCRiYXNlb2JqIiB8ICRYc2VkIC1lICIkbzJsbyJgCisJICAgICRzaG93ICIoY2QgJHhkaXIgJiYgJHtMTl9TfSAkb2JqICRiYXNlb2JqKSIKKwkgICAgJHJ1biBldmFsICcoY2QgJHhkaXIgJiYgJHtMTl9TfSAkb2JqICRiYXNlb2JqKScgfHwgZXhpdCAkPworCSAgZmkKKwlkb25lCisKKwlldmFsIGNtZHM9XCIkb2xkX2FyY2hpdmVfY21kc1wiCisgICAgICBmaQorICAgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisgICAgICBmb3IgY21kIGluICRjbWRzOyBkbworCUlGUz0iJHNhdmVfaWZzIgorCSRzaG93ICIkY21kIgorCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPworICAgICAgZG9uZQorICAgICAgSUZTPSIkc2F2ZV9pZnMiCisgICAgZG9uZQorCisgICAgaWYgdGVzdCAtbiAiJGdlbmVyYXRlZCI7IHRoZW4KKyAgICAgICRzaG93ICIke3JtfXIkZ2VuZXJhdGVkIgorICAgICAgJHJ1biAke3JtfXIkZ2VuZXJhdGVkCisgICAgZmkKKworICAgICMgTm93IGNyZWF0ZSB0aGUgbGlidG9vbCBhcmNoaXZlLgorICAgIGNhc2UgJG91dHB1dCBpbgorICAgICoubGEpCisgICAgICBvbGRfbGlicmFyeT0KKyAgICAgIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXMgJiYgb2xkX2xpYnJhcnk9IiRsaWJuYW1lLiRsaWJleHQiCisgICAgICAkc2hvdyAiY3JlYXRpbmcgJG91dHB1dCIKKworICAgICAgIyBQcmVzZXJ2ZSBhbnkgdmFyaWFibGVzIHRoYXQgbWF5IGFmZmVjdCBjb21waWxlciBiZWhhdmlvcgorICAgICAgZm9yIHZhciBpbiAkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms7IGRvCisJaWYgZXZhbCB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCI7IHRoZW4KKwkgIHJlbGlua19jb21tYW5kPSJ7IHRlc3QgLXogXCJcJHskdmFyK3NldH1cIiB8fCB1bnNldCAkdmFyIHx8IHsgJHZhcj07IGV4cG9ydCAkdmFyOyB9OyB9OyAkcmVsaW5rX2NvbW1hbmQiCisJZWxpZiBldmFsIHZhcl92YWx1ZT1cJCR2YXI7IHRlc3QgLXogIiR2YXJfdmFsdWUiOyB0aGVuCisJICByZWxpbmtfY29tbWFuZD0iJHZhcj07IGV4cG9ydCAkdmFyOyAkcmVsaW5rX2NvbW1hbmQiCisJZWxzZQorCSAgdmFyX3ZhbHVlPWAkZWNobyAiWCR2YXJfdmFsdWUiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorCSAgcmVsaW5rX2NvbW1hbmQ9IiR2YXI9XCIkdmFyX3ZhbHVlXCI7IGV4cG9ydCAkdmFyOyAkcmVsaW5rX2NvbW1hbmQiCisJZmkKKyAgICAgIGRvbmUKKyAgICAgICMgUXVvdGUgdGhlIGxpbmsgY29tbWFuZCBmb3Igc2hpcHBpbmcuCisgICAgICByZWxpbmtfY29tbWFuZD0iY2QgYHB3ZGA7ICRTSEVMTCAkMCAtLW1vZGU9cmVsaW5rICRsaWJ0b29sX2FyZ3MiCisgICAgICByZWxpbmtfY29tbWFuZD1gJGVjaG8gIlgkcmVsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorCisgICAgICAjIE9ubHkgY3JlYXRlIHRoZSBvdXRwdXQgaWYgbm90IGEgZHJ5IHJ1bi4KKyAgICAgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCisJZm9yIGluc3RhbGxlZCBpbiBubyB5ZXM7IGRvCisJICBpZiB0ZXN0ICIkaW5zdGFsbGVkIiA9IHllczsgdGhlbgorCSAgICBpZiB0ZXN0IC16ICIkaW5zdGFsbF9saWJkaXIiOyB0aGVuCisJICAgICAgYnJlYWsKKwkgICAgZmkKKwkgICAgb3V0cHV0PSIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSJpCisJICAgICMgUmVwbGFjZSBhbGwgdW5pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMgd2l0aCB0aGUgaW5zdGFsbGVkIG9uZXMKKwkgICAgbmV3ZGVwZW5kZW5jeV9saWJzPQorCSAgICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAgICAgY2FzZSAkZGVwbGliIGluCisJICAgICAgKi5sYSkKKwkJbmFtZT1gJGVjaG8gIlgkZGVwbGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisJCWV2YWwgbGliZGlyPWBzZWQgLW4gLWUgJ3MvXmxpYmRpcj1cKC4qXCkkL1wxL3AnICRkZXBsaWJgCisJCWlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCisJCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkZGVwbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKKwkJICBleGl0IDEKKwkJZmkKKwkJbmV3ZGVwZW5kZW5jeV9saWJzPSIkbmV3ZGVwZW5kZW5jeV9saWJzICRsaWJkaXIvJG5hbWUiCisJCTs7CisJICAgICAgKikgbmV3ZGVwZW5kZW5jeV9saWJzPSIkbmV3ZGVwZW5kZW5jeV9saWJzICRkZXBsaWIiIDs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICAgIGRlcGVuZGVuY3lfbGlicz0iJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkgICAgbmV3ZGxmaWxlcz0KKwkgICAgZm9yIGxpYiBpbiAkZGxmaWxlczsgZG8KKwkgICAgICBuYW1lPWAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKwkgICAgICBldmFsIGxpYmRpcj1gc2VkIC1uIC1lICdzL15saWJkaXI9XCguKlwpJC9cMS9wJyAkbGliYAorCSAgICAgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCisJCSRlY2hvICIkbW9kZW5hbWU6IFxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCisJCWV4aXQgMQorCSAgICAgIGZpCisJICAgICAgbmV3ZGxmaWxlcz0iJG5ld2RsZmlsZXMgJGxpYmRpci8kbmFtZSIKKwkgICAgZG9uZQorCSAgICBkbGZpbGVzPSIkbmV3ZGxmaWxlcyIKKwkgICAgbmV3ZGxwcmVmaWxlcz0KKwkgICAgZm9yIGxpYiBpbiAkZGxwcmVmaWxlczsgZG8KKwkgICAgICBuYW1lPWAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKwkgICAgICBldmFsIGxpYmRpcj1gc2VkIC1uIC1lICdzL15saWJkaXI9XCguKlwpJC9cMS9wJyAkbGliYAorCSAgICAgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCisJCSRlY2hvICIkbW9kZW5hbWU6IFxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCisJCWV4aXQgMQorCSAgICAgIGZpCisJICAgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGxpYmRpci8kbmFtZSIKKwkgICAgZG9uZQorCSAgICBkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyIKKwkgIGZpCisJICAkcm0gJG91dHB1dAorCSAgIyBwbGFjZSBkbG5hbWUgaW4gY29ycmVjdCBwb3NpdGlvbiBmb3IgY3lnd2luCisJICB0ZGxuYW1lPSRkbG5hbWUKKwkgIGNhc2UgJGhvc3QsJG91dHB1dCwkaW5zdGFsbGVkLCRtb2R1bGUsJGRsbmFtZSBpbgorCSAgICAqY3lnd2luKiwqbGFpLHllcyxubywqLmRsbCkgdGRsbmFtZT0uLi9iaW4vJGRsbmFtZSA7OworCSAgZXNhYworCSAgJGVjaG8gPiAkb3V0cHV0ICJcCisjICRvdXRwdXRuYW1lIC0gYSBsaWJ0b29sIGxpYnJhcnkgZmlsZQorIyBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QCisjCisjIFBsZWFzZSBETyBOT1QgZGVsZXRlIHRoaXMgZmlsZSEKKyMgSXQgaXMgbmVjZXNzYXJ5IGZvciBsaW5raW5nIHRoZSBsaWJyYXJ5LgorCisjIFRoZSBuYW1lIHRoYXQgd2UgY2FuIGRsb3BlbigzKS4KK2RsbmFtZT0nJHRkbG5hbWUnCisKKyMgTmFtZXMgb2YgdGhpcyBsaWJyYXJ5LgorbGlicmFyeV9uYW1lcz0nJGxpYnJhcnlfbmFtZXMnCisKKyMgVGhlIG5hbWUgb2YgdGhlIHN0YXRpYyBhcmNoaXZlLgorb2xkX2xpYnJhcnk9JyRvbGRfbGlicmFyeScKKworIyBMaWJyYXJpZXMgdGhhdCB0aGlzIG9uZSBkZXBlbmRzIHVwb24uCitkZXBlbmRlbmN5X2xpYnM9JyRkZXBlbmRlbmN5X2xpYnMnCisKKyMgVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgJGxpYm5hbWUuCitjdXJyZW50PSRjdXJyZW50CithZ2U9JGFnZQorcmV2aXNpb249JHJldmlzaW9uCisKKyMgSXMgdGhpcyBhbiBhbHJlYWR5IGluc3RhbGxlZCBsaWJyYXJ5PworaW5zdGFsbGVkPSRpbnN0YWxsZWQKKworIyBGaWxlcyB0byBkbG9wZW4vZGxwcmVvcGVuCitkbG9wZW49JyRkbGZpbGVzJworZGxwcmVvcGVuPSckZGxwcmVmaWxlcycKKworIyBEaXJlY3RvcnkgdGhhdCB0aGlzIGxpYnJhcnkgbmVlZHMgdG8gYmUgaW5zdGFsbGVkIGluOgorbGliZGlyPSckaW5zdGFsbF9saWJkaXInIgorCSAgaWYgdGVzdCAiJGluc3RhbGxlZCIgPSBubyAmJiB0ZXN0ICRuZWVkX3JlbGluayA9IHllczsgdGhlbgorCSAgICAkZWNobyA+PiAkb3V0cHV0ICJcCityZWxpbmtfY29tbWFuZD1cIiRyZWxpbmtfY29tbWFuZFwiIgorCSAgZmkKKwlkb25lCisgICAgICBmaQorCisgICAgICAjIERvIGEgc3ltYm9saWMgbGluayBzbyB0aGF0IHRoZSBsaWJ0b29sIGFyY2hpdmUgY2FuIGJlIGZvdW5kIGluCisgICAgICAjIExEX0xJQlJBUllfUEFUSCBiZWZvcmUgdGhlIHByb2dyYW0gaXMgaW5zdGFsbGVkLgorICAgICAgJHNob3cgIihjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJG91dHB1dG5hbWUgJiYgJExOX1MgLi4vJG91dHB1dG5hbWUgJG91dHB1dG5hbWUpIgorICAgICAgJHJ1biBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICRvdXRwdXRuYW1lICYmICRMTl9TIC4uLyRvdXRwdXRuYW1lICRvdXRwdXRuYW1lKScgfHwgZXhpdCAkPworICAgICAgOzsKKyAgICBlc2FjCisgICAgZXhpdCAwCisgICAgOzsKKworICAjIGxpYnRvb2wgaW5zdGFsbCBtb2RlCisgIGluc3RhbGwpCisgICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogaW5zdGFsbCIKKworICAgICMgVGhlcmUgbWF5IGJlIGFuIG9wdGlvbmFsIHNoKDEpIGFyZ3VtZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YKKyAgICAjIGluc3RhbGxfcHJvZyAoZXNwZWNpYWxseSBvbiBXaW5kb3dzIE5UKS4KKyAgICBpZiB0ZXN0ICIkbm9ub3B0IiA9ICIkU0hFTEwiIHx8IHRlc3QgIiRub25vcHQiID0gL2Jpbi9zaCB8fAorICAgICAgICMgQWxsb3cgdGhlIHVzZSBvZiBHTlUgc2h0b29sJ3MgaW5zdGFsbCBjb21tYW5kLgorICAgICAgICRlY2hvICJYJG5vbm9wdCIgfCAkWHNlZCB8IGdyZXAgc2h0b29sID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgaXQuCisgICAgICBhcmc9YCRlY2hvICJYJG5vbm9wdCIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgICBjYXNlICRhcmcgaW4KKyAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qKQorCWFyZz0iXCIkYXJnXCIiCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIGluc3RhbGxfcHJvZz0iJGFyZyAiCisgICAgICBhcmc9IiQxIgorICAgICAgc2hpZnQKKyAgICBlbHNlCisgICAgICBpbnN0YWxsX3Byb2c9CisgICAgICBhcmc9IiRub25vcHQiCisgICAgZmkKKworICAgICMgVGhlIHJlYWwgZmlyc3QgYXJndW1lbnQgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBpbnN0YWxsYXRpb24gcHJvZ3JhbS4KKyAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgaXQuCisgICAgYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgIGNhc2UgJGFyZyBpbgorICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qKQorICAgICAgYXJnPSJcIiRhcmdcIiIKKyAgICAgIDs7CisgICAgZXNhYworICAgIGluc3RhbGxfcHJvZz0iJGluc3RhbGxfcHJvZyRhcmciCisKKyAgICAjIFdlIG5lZWQgdG8gYWNjZXB0IGF0IGxlYXN0IGFsbCB0aGUgQlNEIGluc3RhbGwgZmxhZ3MuCisgICAgZGVzdD0KKyAgICBmaWxlcz0KKyAgICBvcHRzPQorICAgIHByZXY9CisgICAgaW5zdGFsbF90eXBlPQorICAgIGlzZGlyPW5vCisgICAgc3RyaXBtZT0KKyAgICBmb3IgYXJnCisgICAgZG8KKyAgICAgIGlmIHRlc3QgLW4gIiRkZXN0IjsgdGhlbgorCWZpbGVzPSIkZmlsZXMgJGRlc3QiCisJZGVzdD0iJGFyZyIKKwljb250aW51ZQorICAgICAgZmkKKworICAgICAgY2FzZSAkYXJnIGluCisgICAgICAtZCkgaXNkaXI9eWVzIDs7CisgICAgICAtZikgcHJldj0iLWYiIDs7CisgICAgICAtZykgcHJldj0iLWciIDs7CisgICAgICAtbSkgcHJldj0iLW0iIDs7CisgICAgICAtbykgcHJldj0iLW8iIDs7CisgICAgICAtcykKKwlzdHJpcG1lPSIgLXMiCisJY29udGludWUKKwk7OworICAgICAgLSopIDs7CisKKyAgICAgICopCisJIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRlZCBhbiBhcmd1bWVudCwgdGhlbiBza2lwIGl0LgorCWlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgorCSAgcHJldj0KKwllbHNlCisJICBkZXN0PSIkYXJnIgorCSAgY29udGludWUKKwlmaQorCTs7CisgICAgICBlc2FjCisKKyAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSB0aGUgYXJndW1lbnQuCisgICAgICBhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgICBjYXNlICRhcmcgaW4KKyAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qKQorCWFyZz0iXCIkYXJnXCIiCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIGluc3RhbGxfcHJvZz0iJGluc3RhbGxfcHJvZyAkYXJnIgorICAgIGRvbmUKKworICAgIGlmIHRlc3QgLXogIiRpbnN0YWxsX3Byb2ciOyB0aGVuCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIGluc3RhbGwgcHJvZ3JhbSIgMT4mMgorICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgICBleGl0IDEKKyAgICBmaQorCisgICAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiB0aGUgXGAkcHJldicgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiAxPiYyCisgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBpZiB0ZXN0IC16ICIkZmlsZXMiOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICIkZGVzdCI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiBubyBmaWxlIG9yIGRlc3RpbmF0aW9uIHNwZWNpZmllZCIgMT4mMgorICAgICAgZWxzZQorCSRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBkZXN0aW5hdGlvbiIgMT4mMgorICAgICAgZmkKKyAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgZXhpdCAxCisgICAgZmkKKworICAgICMgU3RyaXAgYW55IHRyYWlsaW5nIHNsYXNoIGZyb20gdGhlIGRlc3RpbmF0aW9uLgorICAgIGRlc3Q9YCRlY2hvICJYJGRlc3QiIHwgJFhzZWQgLWUgJ3MlLyQlJSdgCisKKyAgICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeS4KKyAgICB0ZXN0IC1kICIkZGVzdCIgJiYgaXNkaXI9eWVzCisgICAgaWYgdGVzdCAiJGlzZGlyIiA9IHllczsgdGhlbgorICAgICAgZGVzdGRpcj0iJGRlc3QiCisgICAgICBkZXN0bmFtZT0KKyAgICBlbHNlCisgICAgICBkZXN0ZGlyPWAkZWNobyAiWCRkZXN0IiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisgICAgICB0ZXN0ICJYJGRlc3RkaXIiID0gIlgkZGVzdCIgJiYgZGVzdGRpcj0uCisgICAgICBkZXN0bmFtZT1gJGVjaG8gIlgkZGVzdCIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCisgICAgICAjIE5vdCBhIGRpcmVjdG9yeSwgc28gY2hlY2sgdG8gc2VlIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgZmlsZSBzcGVjaWZpZWQuCisgICAgICBzZXQgZHVtbXkgJGZpbGVzCisgICAgICBpZiB0ZXN0ICQjIC1ndCAyOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogXGAkZGVzdCcgaXMgbm90IGEgZGlyZWN0b3J5IiAxPiYyCisJJGVjaG8gIiRoZWxwIiAxPiYyCisJZXhpdCAxCisgICAgICBmaQorICAgIGZpCisgICAgY2FzZSAkZGVzdGRpciBpbgorICAgIFtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgOzsKKyAgICAqKQorICAgICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbworCWNhc2UgJGZpbGUgaW4KKwkqLmxvKSA7OworCSopCisJICAkZWNobyAiJG1vZGVuYW1lOiBcYCRkZXN0ZGlyJyBtdXN0IGJlIGFuIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIiAxPiYyCisJICAkZWNobyAiJGhlbHAiIDE+JjIKKwkgIGV4aXQgMQorCSAgOzsKKwllc2FjCisgICAgICBkb25lCisgICAgICA7OworICAgIGVzYWMKKworICAgICMgVGhpcyB2YXJpYWJsZSB0ZWxscyB3cmFwcGVyIHNjcmlwdHMganVzdCB0byBzZXQgdmFyaWFibGVzIHJhdGhlcgorICAgICMgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgorICAgIGxpYnRvb2xfaW5zdGFsbF9tYWdpYz0iJG1hZ2ljIgorCisgICAgc3RhdGljbGlicz0KKyAgICBmdXR1cmVfbGliZGlycz0KKyAgICBjdXJyZW50X2xpYmRpcnM9CisgICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbworCisgICAgICAjIERvIGVhY2ggaW5zdGFsbGF0aW9uLgorICAgICAgY2FzZSAkZmlsZSBpbgorICAgICAgKi4kbGliZXh0KQorCSMgRG8gdGhlIHN0YXRpYyBsaWJyYXJpZXMgbGF0ZXIuCisJc3RhdGljbGlicz0iJHN0YXRpY2xpYnMgJGZpbGUiCisJOzsKKworICAgICAgKi5sYSkKKwkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgorCWlmIChzZWQgLWUgJzJxJyAkZmlsZSB8IGVncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisJZWxzZQorCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkZmlsZScgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCisJICAkZWNobyAiJGhlbHAiIDE+JjIKKwkgIGV4aXQgMQorCWZpCisKKwlsaWJyYXJ5X25hbWVzPQorCW9sZF9saWJyYXJ5PQorCXJlbGlua19jb21tYW5kPQorCSMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgorCWNhc2UgJGZpbGUgaW4KKwkqLyogfCAqXFwqKSAuICRmaWxlIDs7CisJKikgLiAuLyRmaWxlIDs7CisJZXNhYworCisJIyBBZGQgdGhlIGxpYmRpciB0byBjdXJyZW50X2xpYmRpcnMgaWYgaXQgaXMgdGhlIGRlc3RpbmF0aW9uLgorCURFU1RESVI9CisJaWYgdGVzdCAiWCRkZXN0ZGlyIiA9ICJYJGxpYmRpciI7IHRoZW4KKwkgIGNhc2UgIiRjdXJyZW50X2xpYmRpcnMgIiBpbgorCSAgKiIgJGxpYmRpciAiKikgOzsKKwkgICopIGN1cnJlbnRfbGliZGlycz0iJGN1cnJlbnRfbGliZGlycyAkbGliZGlyIiA7OworCSAgZXNhYworCWVsc2UKKwkgIGNhc2UgIiRkZXN0ZGlyIiBpbgorCSAgICAqIiRsaWJkaXIiKQorCSAgICAgIERFU1RESVI9YCRlY2hvICIkZGVzdGRpciIgfCBzZWQgLWUgJ3MhJyIkbGliZGlyIickISEnYAorCSAgICAgIGlmIHRlc3QgIlgkZGVzdGRpciIgIT0gIlgkREVTVERJUiRsaWJkaXIiOyB0aGVuCisJCURFU1RESVI9CisJICAgICAgZmkKKwkgICAgICA7OworCSAgZXNhYworCSAgIyBOb3RlIHRoZSBsaWJkaXIgYXMgYSBmdXR1cmUgbGliZGlyLgorCSAgY2FzZSAiJGZ1dHVyZV9saWJkaXJzICIgaW4KKwkgICoiICRsaWJkaXIgIiopIDs7CisJICAqKSBmdXR1cmVfbGliZGlycz0iJGZ1dHVyZV9saWJkaXJzICRsaWJkaXIiIDs7CisJICBlc2FjCisJZmkKKworCWRpcj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYC8KKwl0ZXN0ICJYJGRpciIgPSAiWCRmaWxlLyIgJiYgZGlyPQorCWRpcj0iJGRpciRvYmpkaXIiCisKKwlpZiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCisJICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiByZWxpbmtpbmcgXGAkZmlsZSciIDE+JjIKKwkgIGV4cG9ydCBERVNURElSCisJICAkc2hvdyAiJHJlbGlua19jb21tYW5kIgorCSAgaWYgJHJ1biBldmFsICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuIDoKKwkgIGVsc2UKKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogZXJyb3I6IHJlbGluayBcYCRmaWxlJyB3aXRoIHRoZSBhYm92ZSBjb21tYW5kIGJlZm9yZSBpbnN0YWxsaW5nIGl0IiAxPiYyCisJICAgIGNvbnRpbnVlCisJICBmaQorCWZpCisJdW5zZXQgREVTVERJUgorCisJIyBTZWUgdGhlIG5hbWVzIG9mIHRoZSBzaGFyZWQgbGlicmFyeS4KKwlzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXMKKwlpZiB0ZXN0IC1uICIkMiI7IHRoZW4KKwkgIHJlYWxuYW1lPSIkMiIKKwkgIHNoaWZ0CisJICBzaGlmdAorCisJICBzcmNuYW1lPSIkcmVhbG5hbWUiCisJICB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiICYmIHNyY25hbWU9IiRyZWFsbmFtZSJUCisKKwkgICMgSW5zdGFsbCB0aGUgc2hhcmVkIGxpYnJhcnkgYW5kIGJ1aWxkIHRoZSBzeW1saW5rcy4KKwkgICRzaG93ICIkaW5zdGFsbF9wcm9nICRkaXIvJHNyY25hbWUgJGRlc3RkaXIvJHJlYWxuYW1lIgorCSAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nICRkaXIvJHNyY25hbWUgJGRlc3RkaXIvJHJlYWxuYW1lIiB8fCBleGl0ICQ/CisJICBpZiB0ZXN0IC1uICIkc3RyaXBtZSIgJiYgdGVzdCAtbiAiJHN0cmlwbGliIjsgdGhlbgorCSAgICAkc2hvdyAiJHN0cmlwbGliICRkZXN0ZGlyLyRyZWFsbmFtZSIKKwkgICAgJHJ1biBldmFsICIkc3RyaXBsaWIgJGRlc3RkaXIvJHJlYWxuYW1lIiB8fCBleGl0ICQ/CisJICBmaQorCisJICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCisJICAgICMgRGVsZXRlIHRoZSBvbGQgc3ltbGlua3MsIGFuZCBjcmVhdGUgbmV3IG9uZXMuCisJICAgIGZvciBsaW5rbmFtZQorCSAgICBkbworCSAgICAgIGlmIHRlc3QgIiRsaW5rbmFtZSIgIT0gIiRyZWFsbmFtZSI7IHRoZW4KKwkJJHNob3cgIihjZCAkZGVzdGRpciAmJiAkcm0gJGxpbmtuYW1lICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWUpIgorCQkkcnVuIGV2YWwgIihjZCAkZGVzdGRpciAmJiAkcm0gJGxpbmtuYW1lICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWUpIgorCSAgICAgIGZpCisJICAgIGRvbmUKKwkgIGZpCisKKwkgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0aW5zdGFsbCBjb21tYW5kcy4KKwkgIGxpYj0iJGRlc3RkaXIvJHJlYWxuYW1lIgorCSAgZXZhbCBjbWRzPVwiJHBvc3RpbnN0YWxsX2NtZHNcIgorCSAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJICBmb3IgY21kIGluICRjbWRzOyBkbworCSAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgJHNob3cgIiRjbWQiCisJICAgICRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPworCSAgZG9uZQorCSAgSUZTPSIkc2F2ZV9pZnMiCisJZmkKKworCSMgSW5zdGFsbCB0aGUgcHNldWRvLWxpYnJhcnkgZm9yIGluZm9ybWF0aW9uIHB1cnBvc2VzLgorCW5hbWU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKwlpbnN0bmFtZT0iJGRpci8kbmFtZSJpCisJJHNob3cgIiRpbnN0YWxsX3Byb2cgJGluc3RuYW1lICRkZXN0ZGlyLyRuYW1lIgorCSRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyAkaW5zdG5hbWUgJGRlc3RkaXIvJG5hbWUiIHx8IGV4aXQgJD8KKworCSMgTWF5YmUgaW5zdGFsbCB0aGUgc3RhdGljIGxpYnJhcnksIHRvby4KKwl0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIHN0YXRpY2xpYnM9IiRzdGF0aWNsaWJzICRkaXIvJG9sZF9saWJyYXJ5IgorCTs7CisKKyAgICAgICoubG8pCisJIyBJbnN0YWxsIChpLmUuIGNvcHkpIGEgbGlidG9vbCBvYmplY3QuCisKKwkjIEZpZ3VyZSBvdXQgZGVzdGluYXRpb24gZmlsZSBuYW1lLCBpZiBpdCB3YXNuJ3QgYWxyZWFkeSBzcGVjaWZpZWQuCisJaWYgdGVzdCAtbiAiJGRlc3RuYW1lIjsgdGhlbgorCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0bmFtZSIKKwllbHNlCisJICBkZXN0ZmlsZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0ZmlsZSIKKwlmaQorCisJIyBEZWR1Y2UgdGhlIG5hbWUgb2YgdGhlIGRlc3RpbmF0aW9uIG9sZC1zdHlsZSBvYmplY3QgZmlsZS4KKwljYXNlICRkZXN0ZmlsZSBpbgorCSoubG8pCisJICBzdGF0aWNkZXN0PWAkZWNobyAiWCRkZXN0ZmlsZSIgfCAkWHNlZCAtZSAiJGxvMm8iYAorCSAgOzsKKwkqLiRvYmpleHQpCisJICBzdGF0aWNkZXN0PSIkZGVzdGZpbGUiCisJICBkZXN0ZmlsZT0KKwkgIDs7CisJKikKKwkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBjb3B5IGEgbGlidG9vbCBvYmplY3QgdG8gXGAkZGVzdGZpbGUnIiAxPiYyCisJICAkZWNobyAiJGhlbHAiIDE+JjIKKwkgIGV4aXQgMQorCSAgOzsKKwllc2FjCisKKwkjIEluc3RhbGwgdGhlIGxpYnRvb2wgb2JqZWN0IGlmIHJlcXVlc3RlZC4KKwlpZiB0ZXN0IC1uICIkZGVzdGZpbGUiOyB0aGVuCisJICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZmlsZSAkZGVzdGZpbGUiCisJICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgJGZpbGUgJGRlc3RmaWxlIiB8fCBleGl0ICQ/CisJZmkKKworCSMgSW5zdGFsbCB0aGUgb2xkIG9iamVjdCBpZiBlbmFibGVkLgorCWlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KKwkgICMgRGVkdWNlIHRoZSBuYW1lIG9mIHRoZSBvbGQtc3R5bGUgb2JqZWN0IGZpbGUuCisJICBzdGF0aWNvYmo9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgIiRsbzJvImAKKworCSAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJHN0YXRpY29iaiAkc3RhdGljZGVzdCIKKwkgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyBcJHN0YXRpY29iaiBcJHN0YXRpY2Rlc3QiIHx8IGV4aXQgJD8KKwlmaQorCWV4aXQgMAorCTs7CisKKyAgICAgICopCisJIyBGaWd1cmUgb3V0IGRlc3RpbmF0aW9uIGZpbGUgbmFtZSwgaWYgaXQgd2Fzbid0IGFscmVhZHkgc3BlY2lmaWVkLgorCWlmIHRlc3QgLW4gIiRkZXN0bmFtZSI7IHRoZW4KKwkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdG5hbWUiCisJZWxzZQorCSAgZGVzdGZpbGU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKwkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdGZpbGUiCisJZmkKKworCSMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIHJlYWxseSBhIGxpYnRvb2wgcHJvZ3JhbS4KKwlpZiAoc2VkIC1lICc0cScgJGZpbGUgfCBlZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgIG5vdGluc3RfZGVwbGlicz0KKwkgIHJlbGlua19jb21tYW5kPQorCisJICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KKwkgIGNhc2UgJGZpbGUgaW4KKwkgICovKiB8ICpcXCopIC4gJGZpbGUgOzsKKwkgICopIC4gLi8kZmlsZSA7OworCSAgZXNhYworCisJICAjIENoZWNrIHRoZSB2YXJpYWJsZXMgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIHNldC4KKwkgIGlmIHRlc3QgLXogIiRub3RpbnN0X2RlcGxpYnMiOyB0aGVuCisJICAgICRlY2hvICIkbW9kZW5hbWU6IGludmFsaWQgbGlidG9vbCB3cmFwcGVyIHNjcmlwdCBcYCRmaWxlJyIgMT4mMgorCSAgICBleGl0IDEKKwkgIGZpCisKKwkgIGZpbmFsaXplPXllcworCSAgZm9yIGxpYiBpbiAkbm90aW5zdF9kZXBsaWJzOyBkbworCSAgICAjIENoZWNrIHRvIHNlZSB0aGF0IGVhY2ggbGlicmFyeSBpcyBpbnN0YWxsZWQuCisJICAgIGxpYmRpcj0KKwkgICAgaWYgdGVzdCAtZiAiJGxpYiI7IHRoZW4KKwkgICAgICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KKwkgICAgICBjYXNlICRsaWIgaW4KKwkgICAgICAqLyogfCAqXFwqKSAuICRsaWIgOzsKKwkgICAgICAqKSAuIC4vJGxpYiA7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgICAgbGliZmlsZT0iJGxpYmRpci8iYCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSVnJ2AgIyMjIHRlc3RzdWl0ZTogc2tpcCBuZXN0ZWQgcXVvdGluZyB0ZXN0CisJICAgIGlmIHRlc3QgLW4gIiRsaWJkaXIiICYmIHRlc3QgISAtZiAiJGxpYmZpbGUiOyB0aGVuCisJICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAkbGliJyBoYXMgbm90IGJlZW4gaW5zdGFsbGVkIGluIFxgJGxpYmRpciciIDE+JjIKKwkgICAgICBmaW5hbGl6ZT1ubworCSAgICBmaQorCSAgZG9uZQorCisJICByZWxpbmtfY29tbWFuZD0KKwkgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgorCSAgY2FzZSAkZmlsZSBpbgorCSAgKi8qIHwgKlxcKikgLiAkZmlsZSA7OworCSAgKikgLiAuLyRmaWxlIDs7CisJICBlc2FjCisKKwkgIG91dHB1dG5hbWU9CisJICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IG5vICYmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KKwkgICAgaWYgdGVzdCAiJGZpbmFsaXplIiA9IHllcyAmJiB0ZXN0IC16ICIkcnVuIjsgdGhlbgorCSAgICAgIHRtcGRpcj0iL3RtcCIKKwkgICAgICB0ZXN0IC1uICIkVE1QRElSIiAmJiB0bXBkaXI9IiRUTVBESVIiCisJICAgICAgdG1wZGlyPSIkdG1wZGlyL2xpYnRvb2wtJCQiCisJICAgICAgaWYgJG1rZGlyIC1wICIkdG1wZGlyIiAmJiBjaG1vZCA3MDAgIiR0bXBkaXIiOyB0aGVuIDoKKwkgICAgICBlbHNlCisJCSRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlIHRlbXBvcmFyeSBkaXJlY3RvcnkgXGAkdG1wZGlyJyIgMT4mMgorCQljb250aW51ZQorCSAgICAgIGZpCisJICAgICAgZmlsZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCSAgICAgIG91dHB1dG5hbWU9IiR0bXBkaXIvJGZpbGUiCisJICAgICAgIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgorCSAgICAgIHJlbGlua19jb21tYW5kPWAkZWNobyAiWCRyZWxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXRuYW1lIiclZydgCisKKwkgICAgICAkc2hvdyAiJHJlbGlua19jb21tYW5kIgorCSAgICAgIGlmICRydW4gZXZhbCAiJHJlbGlua19jb21tYW5kIjsgdGhlbiA6CisJICAgICAgZWxzZQorCQkkZWNobyAiJG1vZGVuYW1lOiBlcnJvcjogcmVsaW5rIFxgJGZpbGUnIHdpdGggdGhlIGFib3ZlIGNvbW1hbmQgYmVmb3JlIGluc3RhbGxpbmcgaXQiIDE+JjIKKwkJJHtybX1yICIkdG1wZGlyIgorCQljb250aW51ZQorCSAgICAgIGZpCisJICAgICAgZmlsZT0iJG91dHB1dG5hbWUiCisJICAgIGVsc2UKKwkgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgcmVsaW5rIFxgJGZpbGUnIiAxPiYyCisJICAgIGZpCisJICBlbHNlCisJICAgICMgSW5zdGFsbCB0aGUgYmluYXJ5IHRoYXQgd2UgY29tcGlsZWQgZWFybGllci4KKwkgICAgZmlsZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAicyVcKFteL10qXCkkJSRvYmpkaXIvXDElImAKKwkgIGZpCisJZmkKKworCSMgcmVtb3ZlIC5leGUgc2luY2UgY3lnd2luIC91c3IvYmluL2luc3RhbGwgd2lsbCBhcHBlbmQgYW5vdGhlcgorCSMgb25lIGFueXdheXMKKwljYXNlICRpbnN0YWxsX3Byb2csJGhvc3QgaW4KKwkvdXNyL2Jpbi9pbnN0YWxsKiwqY3lnd2luKikKKwkgIGNhc2UgJGZpbGU6JGRlc3RmaWxlIGluCisJICAqLmV4ZToqLmV4ZSkKKwkgICAgIyB0aGlzIGlzIG9rCisJICAgIDs7CisJICAqLmV4ZToqKQorCSAgICBkZXN0ZmlsZT0kZGVzdGZpbGUuZXhlCisJICAgIDs7CisJICAqOiouZXhlKQorCSAgICBkZXN0ZmlsZT1gZWNobyAkZGVzdGZpbGUgfCBzZWQgLWUgJ3MsLmV4ZSQsLCdgCisJICAgIDs7CisJICBlc2FjCisJICA7OworCWVzYWMKKwkkc2hvdyAiJGluc3RhbGxfcHJvZyRzdHJpcG1lICRmaWxlICRkZXN0ZmlsZSIKKwkkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2dcJHN0cmlwbWUgXCRmaWxlIFwkZGVzdGZpbGUiIHx8IGV4aXQgJD8KKwl0ZXN0IC1uICIkb3V0cHV0bmFtZSIgJiYgJHtybX1yICIkdG1wZGlyIgorCTs7CisgICAgICBlc2FjCisgICAgZG9uZQorCisgICAgZm9yIGZpbGUgaW4gJHN0YXRpY2xpYnM7IGRvCisgICAgICBuYW1lPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisKKyAgICAgICMgU2V0IHVwIHRoZSByYW5saWIgcGFyYW1ldGVycy4KKyAgICAgIG9sZGxpYj0iJGRlc3RkaXIvJG5hbWUiCisKKyAgICAgICRzaG93ICIkaW5zdGFsbF9wcm9nICRmaWxlICRvbGRsaWIiCisgICAgICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgXCRmaWxlIFwkb2xkbGliIiB8fCBleGl0ICQ/CisKKyAgICAgIGlmIHRlc3QgLW4gIiRzdHJpcG1lIiAmJiB0ZXN0IC1uICIkc3RyaXBsaWIiOyB0aGVuCisJJHNob3cgIiRvbGRfc3RyaXBsaWIgJG9sZGxpYiIKKwkkcnVuIGV2YWwgIiRvbGRfc3RyaXBsaWIgJG9sZGxpYiIgfHwgZXhpdCAkPworICAgICAgZmkKKworICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3RpbnN0YWxsIGNvbW1hbmRzLgorICAgICAgZXZhbCBjbWRzPVwiJG9sZF9wb3N0aW5zdGFsbF9jbWRzXCIKKyAgICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JworICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KKwlJRlM9IiRzYXZlX2lmcyIKKwkkc2hvdyAiJGNtZCIKKwkkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJHNhdmVfaWZzIgorICAgIGRvbmUKKworICAgIGlmIHRlc3QgLW4gIiRmdXR1cmVfbGliZGlycyI7IHRoZW4KKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHJlbWVtYmVyIHRvIHJ1biBcYCRwcm9nbmFtZSAtLWZpbmlzaCRmdXR1cmVfbGliZGlycyciIDE+JjIKKyAgICBmaQorCisgICAgaWYgdGVzdCAtbiAiJGN1cnJlbnRfbGliZGlycyI7IHRoZW4KKyAgICAgICMgTWF5YmUganVzdCBkbyBhIGRyeSBydW4uCisgICAgICB0ZXN0IC1uICIkcnVuIiAmJiBjdXJyZW50X2xpYmRpcnM9IiAtbiRjdXJyZW50X2xpYmRpcnMiCisgICAgICBleGVjX2NtZD0nJFNIRUxMICQwIC0tZmluaXNoJGN1cnJlbnRfbGliZGlycycKKyAgICBlbHNlCisgICAgICBleGl0IDAKKyAgICBmaQorICAgIDs7CisKKyAgIyBsaWJ0b29sIGZpbmlzaCBtb2RlCisgIGZpbmlzaCkKKyAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBmaW5pc2giCisgICAgbGliZGlycz0iJG5vbm9wdCIKKyAgICBhZG1pbmNtZHM9CisKKyAgICBpZiB0ZXN0IC1uICIkZmluaXNoX2NtZHMkZmluaXNoX2V2YWwiICYmIHRlc3QgLW4gIiRsaWJkaXJzIjsgdGhlbgorICAgICAgZm9yIGRpcgorICAgICAgZG8KKwlsaWJkaXJzPSIkbGliZGlycyAkZGlyIgorICAgICAgZG9uZQorCisgICAgICBmb3IgbGliZGlyIGluICRsaWJkaXJzOyBkbworCWlmIHRlc3QgLW4gIiRmaW5pc2hfY21kcyI7IHRoZW4KKwkgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBmaW5pc2ggY29tbWFuZHMuCisJICBldmFsIGNtZHM9XCIkZmluaXNoX2NtZHNcIgorCSAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJICBmb3IgY21kIGluICRjbWRzOyBkbworCSAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgJHNob3cgIiRjbWQiCisJICAgICRydW4gZXZhbCAiJGNtZCIgfHwgYWRtaW5jbWRzPSIkYWRtaW5jbWRzCisgICAgICAgJGNtZCIKKwkgIGRvbmUKKwkgIElGUz0iJHNhdmVfaWZzIgorCWZpCisJaWYgdGVzdCAtbiAiJGZpbmlzaF9ldmFsIjsgdGhlbgorCSAgIyBEbyB0aGUgc2luZ2xlIGZpbmlzaF9ldmFsLgorCSAgZXZhbCBjbWRzPVwiJGZpbmlzaF9ldmFsXCIKKwkgICRydW4gZXZhbCAiJGNtZHMiIHx8IGFkbWluY21kcz0iJGFkbWluY21kcworICAgICAgICRjbWRzIgorCWZpCisgICAgICBkb25lCisgICAgZmkKKworICAgICMgRXhpdCBoZXJlIGlmIHRoZXkgd2FudGVkIHNpbGVudCBtb2RlLgorICAgIHRlc3QgIiRzaG93IiA9ICI6IiAmJiBleGl0IDAKKworICAgIGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisgICAgZWNobyAiTGlicmFyaWVzIGhhdmUgYmVlbiBpbnN0YWxsZWQgaW46IgorICAgIGZvciBsaWJkaXIgaW4gJGxpYmRpcnM7IGRvCisgICAgICBlY2hvICIgICAkbGliZGlyIgorICAgIGRvbmUKKyAgICBlY2hvCisgICAgZWNobyAiSWYgeW91IGV2ZXIgaGFwcGVuIHRvIHdhbnQgdG8gbGluayBhZ2FpbnN0IGluc3RhbGxlZCBsaWJyYXJpZXMiCisgICAgZWNobyAiaW4gYSBnaXZlbiBkaXJlY3RvcnksIExJQkRJUiwgeW91IG11c3QgZWl0aGVyIHVzZSBsaWJ0b29sLCBhbmQiCisgICAgZWNobyAic3BlY2lmeSB0aGUgZnVsbCBwYXRobmFtZSBvZiB0aGUgbGlicmFyeSwgb3IgdXNlIHRoZSBcYC1MTElCRElSJyIKKyAgICBlY2hvICJmbGFnIGR1cmluZyBsaW5raW5nIGFuZCBkbyBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZzoiCisgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCisgICAgICBlY2hvICIgICAtIGFkZCBMSUJESVIgdG8gdGhlIFxgJHNobGlicGF0aF92YXInIGVudmlyb25tZW50IHZhcmlhYmxlIgorICAgICAgZWNobyAiICAgICBkdXJpbmcgZXhlY3V0aW9uIgorICAgIGZpCisgICAgaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgorICAgICAgZWNobyAiICAgLSBhZGQgTElCRElSIHRvIHRoZSBcYCRydW5wYXRoX3ZhcicgZW52aXJvbm1lbnQgdmFyaWFibGUiCisgICAgICBlY2hvICIgICAgIGR1cmluZyBsaW5raW5nIgorICAgIGZpCisgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCisgICAgICBsaWJkaXI9TElCRElSCisgICAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisKKyAgICAgIGVjaG8gIiAgIC0gdXNlIHRoZSBcYCRmbGFnJyBsaW5rZXIgZmxhZyIKKyAgICBmaQorICAgIGlmIHRlc3QgLW4gIiRhZG1pbmNtZHMiOyB0aGVuCisgICAgICBlY2hvICIgICAtIGhhdmUgeW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRvciBydW4gdGhlc2UgY29tbWFuZHM6JGFkbWluY21kcyIKKyAgICBmaQorICAgIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCisgICAgICBlY2hvICIgICAtIGhhdmUgeW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRvciBhZGQgTElCRElSIHRvIFxgL2V0Yy9sZC5zby5jb25mJyIKKyAgICBmaQorICAgIGVjaG8KKyAgICBlY2hvICJTZWUgYW55IG9wZXJhdGluZyBzeXN0ZW0gZG9jdW1lbnRhdGlvbiBhYm91dCBzaGFyZWQgbGlicmFyaWVzIGZvciIKKyAgICBlY2hvICJtb3JlIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSBsZCgxKSBhbmQgbGQuc28oOCkgbWFudWFsIHBhZ2VzLiIKKyAgICBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICAgIGV4aXQgMAorICAgIDs7CisKKyAgIyBsaWJ0b29sIGV4ZWN1dGUgbW9kZQorICBleGVjdXRlKQorICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGV4ZWN1dGUiCisKKyAgICAjIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgY29tbWFuZCBuYW1lLgorICAgIGNtZD0iJG5vbm9wdCIKKyAgICBpZiB0ZXN0IC16ICIkY21kIjsgdGhlbgorICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIENPTU1BTkQiIDE+JjIKKyAgICAgICRlY2hvICIkaGVscCIKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICAjIEhhbmRsZSAtZGxvcGVuIGZsYWdzIGltbWVkaWF0ZWx5LgorICAgIGZvciBmaWxlIGluICRleGVjdXRlX2RsZmlsZXM7IGRvCisgICAgICBpZiB0ZXN0ICEgLWYgIiRmaWxlIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IFxgJGZpbGUnIGlzIG5vdCBhIGZpbGUiIDE+JjIKKwkkZWNobyAiJGhlbHAiIDE+JjIKKwlleGl0IDEKKyAgICAgIGZpCisKKyAgICAgIGRpcj0KKyAgICAgIGNhc2UgJGZpbGUgaW4KKyAgICAgICoubGEpCisJIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KKwlpZiAoc2VkIC1lICcycScgJGZpbGUgfCBlZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorCWVsc2UKKwkgICRlY2hvICIkbW9kZW5hbWU6IFxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCisJICAkZWNobyAiJGhlbHAiIDE+JjIKKwkgIGV4aXQgMQorCWZpCisKKwkjIFJlYWQgdGhlIGxpYnRvb2wgbGlicmFyeS4KKwlkbG5hbWU9CisJbGlicmFyeV9uYW1lcz0KKworCSMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgorCWNhc2UgJGZpbGUgaW4KKwkqLyogfCAqXFwqKSAuICRmaWxlIDs7CisJKikgLiAuLyRmaWxlIDs7CisJZXNhYworCisJIyBTa2lwIHRoaXMgbGlicmFyeSBpZiBpdCBjYW5ub3QgYmUgZGxvcGVuZWQuCisJaWYgdGVzdCAteiAiJGRsbmFtZSI7IHRoZW4KKwkgICMgV2FybiBpZiBpdCB3YXMgYSBzaGFyZWQgbGlicmFyeS4KKwkgIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIiAmJiAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYCRmaWxlJyB3YXMgbm90IGxpbmtlZCB3aXRoIFxgLWV4cG9ydC1keW5hbWljJyIKKwkgIGNvbnRpbnVlCisJZmkKKworCWRpcj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAorCXRlc3QgIlgkZGlyIiA9ICJYJGZpbGUiICYmIGRpcj0uCisKKwlpZiB0ZXN0IC1mICIkZGlyLyRvYmpkaXIvJGRsbmFtZSI7IHRoZW4KKwkgIGRpcj0iJGRpci8kb2JqZGlyIgorCWVsc2UKKwkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIFxgJGRsbmFtZScgaW4gXGAkZGlyJyBvciBcYCRkaXIvJG9iamRpciciIDE+JjIKKwkgIGV4aXQgMQorCWZpCisJOzsKKworICAgICAgKi5sbykKKwkjIEp1c3QgYWRkIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgLmxvIGZpbGUuCisJZGlyPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisJdGVzdCAiWCRkaXIiID0gIlgkZmlsZSIgJiYgZGlyPS4KKwk7OworCisgICAgICAqKQorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmcgXGAtZGxvcGVuJyBpcyBpZ25vcmVkIGZvciBub24tbGlidG9vbCBsaWJyYXJpZXMgYW5kIG9iamVjdHMiIDE+JjIKKwljb250aW51ZQorCTs7CisgICAgICBlc2FjCisKKyAgICAgICMgR2V0IHRoZSBhYnNvbHV0ZSBwYXRobmFtZS4KKyAgICAgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKKyAgICAgIHRlc3QgLW4gIiRhYnNkaXIiICYmIGRpcj0iJGFic2RpciIKKworICAgICAgIyBOb3cgYWRkIHRoZSBkaXJlY3RvcnkgdG8gc2hsaWJwYXRoX3Zhci4KKyAgICAgIGlmIGV2YWwgInRlc3QgLXogXCJcJCRzaGxpYnBhdGhfdmFyXCIiOyB0aGVuCisJZXZhbCAiJHNobGlicGF0aF92YXI9XCJcJGRpclwiIgorICAgICAgZWxzZQorCWV2YWwgIiRzaGxpYnBhdGhfdmFyPVwiXCRkaXI6XCQkc2hsaWJwYXRoX3ZhclwiIgorICAgICAgZmkKKyAgICBkb25lCisKKyAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHNobGlicGF0aF92YXIKKyAgICAjIHJhdGhlciB0aGFuIHJ1bm5pbmcgdGhlaXIgcHJvZ3JhbXMuCisgICAgbGlidG9vbF9leGVjdXRlX21hZ2ljPSIkbWFnaWMiCisKKyAgICAjIENoZWNrIGlmIGFueSBvZiB0aGUgYXJndW1lbnRzIGlzIGEgd3JhcHBlciBzY3JpcHQuCisgICAgYXJncz0KKyAgICBmb3IgZmlsZQorICAgIGRvCisgICAgICBjYXNlICRmaWxlIGluCisgICAgICAtKikgOzsKKyAgICAgICopCisJIyBEbyBhIHRlc3QgdG8gc2VlIGlmIHRoaXMgaXMgcmVhbGx5IGEgbGlidG9vbCBwcm9ncmFtLgorCWlmIChzZWQgLWUgJzRxJyAkZmlsZSB8IGVncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCisJICBjYXNlICRmaWxlIGluCisJICAqLyogfCAqXFwqKSAuICRmaWxlIDs7CisJICAqKSAuIC4vJGZpbGUgOzsKKwkgIGVzYWMKKworCSAgIyBUcmFuc2Zvcm0gYXJnIHRvIHdyYXBwZWQgbmFtZS4KKwkgIGZpbGU9IiRwcm9nZGlyLyRwcm9ncmFtIgorCWZpCisJOzsKKyAgICAgIGVzYWMKKyAgICAgICMgUXVvdGUgYXJndW1lbnRzICh0byBwcmVzZXJ2ZSBzaGVsbCBtZXRhY2hhcmFjdGVycykuCisgICAgICBmaWxlPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICAgIGFyZ3M9IiRhcmdzIFwiJGZpbGVcIiIKKyAgICBkb25lCisKKyAgICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgorICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCisJIyBFeHBvcnQgdGhlIHNobGlicGF0aF92YXIuCisJZXZhbCAiZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgorICAgICAgZmkKKworICAgICAgIyBSZXN0b3JlIHNhdmVkIGVudmlyb21lbnQgdmFyaWFibGVzCisgICAgICBpZiB0ZXN0ICIke3NhdmVfTENfQUxMK3NldH0iID0gc2V0OyB0aGVuCisJTENfQUxMPSIkc2F2ZV9MQ19BTEwiOyBleHBvcnQgTENfQUxMCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHtzYXZlX0xBTkcrc2V0fSIgPSBzZXQ7IHRoZW4KKwlMQU5HPSIkc2F2ZV9MQU5HIjsgZXhwb3J0IExBTkcKKyAgICAgIGZpCisKKyAgICAgICMgTm93IHByZXBhcmUgdG8gYWN0dWFsbHkgZXhlYyB0aGUgY29tbWFuZC4KKyAgICAgIGV4ZWNfY21kPSciJGNtZCIkYXJncycKKyAgICBlbHNlCisgICAgICAjIERpc3BsYXkgd2hhdCB3b3VsZCBiZSBkb25lLgorICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCisJZXZhbCAiXCRlY2hvIFwiXCRzaGxpYnBhdGhfdmFyPVwkJHNobGlicGF0aF92YXJcIiIKKwkkZWNobyAiZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgorICAgICAgZmkKKyAgICAgICRlY2hvICIkY21kJGFyZ3MiCisgICAgICBleGl0IDAKKyAgICBmaQorICAgIDs7CisKKyAgIyBsaWJ0b29sIGNsZWFuIGFuZCB1bmluc3RhbGwgbW9kZQorICBjbGVhbiB8IHVuaW5zdGFsbCkKKyAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiAkbW9kZSIKKyAgICBybT0iJG5vbm9wdCIKKyAgICBmaWxlcz0KKyAgICBybWZvcmNlPQorICAgIGV4aXRfc3RhdHVzPTAKKworICAgICMgVGhpcyB2YXJpYWJsZSB0ZWxscyB3cmFwcGVyIHNjcmlwdHMganVzdCB0byBzZXQgdmFyaWFibGVzIHJhdGhlcgorICAgICMgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgorICAgIGxpYnRvb2xfaW5zdGFsbF9tYWdpYz0iJG1hZ2ljIgorCisgICAgZm9yIGFyZworICAgIGRvCisgICAgICBjYXNlICRhcmcgaW4KKyAgICAgIC1mKSBybT0iJHJtICRhcmciOyBybWZvcmNlPXllcyA7OworICAgICAgLSopIHJtPSIkcm0gJGFyZyIgOzsKKyAgICAgICopIGZpbGVzPSIkZmlsZXMgJGFyZyIgOzsKKyAgICAgIGVzYWMKKyAgICBkb25lCisKKyAgICBpZiB0ZXN0IC16ICIkcm0iOyB0aGVuCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIFJNIHByb2dyYW0iIDE+JjIKKyAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgZXhpdCAxCisgICAgZmkKKworICAgIHJtZGlycz0KKworICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KKyAgICAgIGRpcj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAorICAgICAgaWYgdGVzdCAiWCRkaXIiID0gIlgkZmlsZSI7IHRoZW4KKwlkaXI9LgorCW9iamRpcj0iJG9iamRpciIKKyAgICAgIGVsc2UKKwlvYmpkaXI9IiRkaXIvJG9iamRpciIKKyAgICAgIGZpCisgICAgICBuYW1lPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisgICAgICB0ZXN0ICRtb2RlID0gdW5pbnN0YWxsICYmIG9iamRpcj0iJGRpciIKKworICAgICAgIyBSZW1lbWJlciBvYmpkaXIgZm9yIHJlbW92YWwgbGF0ZXIsIGJlaW5nIGNhcmVmdWwgdG8gYXZvaWQgZHVwbGljYXRlcworICAgICAgaWYgdGVzdCAkbW9kZSA9IGNsZWFuOyB0aGVuCisJY2FzZSAiICRybWRpcnMgIiBpbgorCSAgKiIgJG9iamRpciAiKikgOzsKKwkgICopIHJtZGlycz0iJHJtZGlycyAkb2JqZGlyIiA7OworCWVzYWMKKyAgICAgIGZpCisKKyAgICAgICMgRG9uJ3QgZXJyb3IgaWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCBhbmQgcm0gLWYgd2FzIHVzZWQuCisgICAgICBpZiAodGVzdCAtTCAiJGZpbGUiKSA+L2Rldi9udWxsIDI+JjEgXAorCXx8ICh0ZXN0IC1oICIkZmlsZSIpID4vZGV2L251bGwgMj4mMSBcCisJfHwgdGVzdCAtZiAiJGZpbGUiOyB0aGVuCisJOgorICAgICAgZWxpZiB0ZXN0IC1kICIkZmlsZSI7IHRoZW4KKwlleGl0X3N0YXR1cz0xCisJY29udGludWUKKyAgICAgIGVsaWYgdGVzdCAiJHJtZm9yY2UiID0geWVzOyB0aGVuCisJY29udGludWUKKyAgICAgIGZpCisKKyAgICAgIHJtZmlsZXM9IiRmaWxlIgorCisgICAgICBjYXNlICRuYW1lIGluCisgICAgICAqLmxhKQorCSMgUG9zc2libHkgYSBsaWJ0b29sIGFyY2hpdmUsIHNvIHZlcmlmeSBpdC4KKwlpZiAoc2VkIC1lICcycScgJGZpbGUgfCBlZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgIC4gJGRpci8kbmFtZQorCisJICAjIERlbGV0ZSB0aGUgbGlidG9vbCBsaWJyYXJpZXMgYW5kIHN5bWxpbmtzLgorCSAgZm9yIG4gaW4gJGxpYnJhcnlfbmFtZXM7IGRvCisJICAgIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJG4iCisJICBkb25lCisJICB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJG9sZF9saWJyYXJ5IgorCSAgdGVzdCAkbW9kZSA9IGNsZWFuICYmIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJG5hbWUgJG9iamRpci8ke25hbWV9aSIKKworCSAgaWYgdGVzdCAkbW9kZSA9IHVuaW5zdGFsbDsgdGhlbgorCSAgICBpZiB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyI7IHRoZW4KKwkgICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgcG9zdHVuaW5zdGFsbCBjb21tYW5kcy4KKwkgICAgICBldmFsIGNtZHM9XCIkcG9zdHVuaW5zdGFsbF9jbWRzXCIKKwkgICAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKwkgICAgICBmb3IgY21kIGluICRjbWRzOyBkbworCQlJRlM9IiRzYXZlX2lmcyIKKwkJJHNob3cgIiRjbWQiCisJCSRydW4gZXZhbCAiJGNtZCIKKwkJaWYgdGVzdCAkPyAhPSAwICYmIHRlc3QgIiRybWZvcmNlIiAhPSB5ZXM7IHRoZW4KKwkJICBleGl0X3N0YXR1cz0xCisJCWZpCisJICAgICAgZG9uZQorCSAgICAgIElGUz0iJHNhdmVfaWZzIgorCSAgICBmaQorCisJICAgIGlmIHRlc3QgLW4gIiRvbGRfbGlicmFyeSI7IHRoZW4KKwkgICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgb2xkX3Bvc3R1bmluc3RhbGwgY29tbWFuZHMuCisJICAgICAgZXZhbCBjbWRzPVwiJG9sZF9wb3N0dW5pbnN0YWxsX2NtZHNcIgorCSAgICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JworCSAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCisJCUlGUz0iJHNhdmVfaWZzIgorCQkkc2hvdyAiJGNtZCIKKwkJJHJ1biBldmFsICIkY21kIgorCQlpZiB0ZXN0ICQ/ICE9IDAgJiYgdGVzdCAiJHJtZm9yY2UiICE9IHllczsgdGhlbgorCQkgIGV4aXRfc3RhdHVzPTEKKwkJZmkKKwkgICAgICBkb25lCisJICAgICAgSUZTPSIkc2F2ZV9pZnMiCisJICAgIGZpCisJICAgICMgRklYTUU6IHNob3VsZCByZWluc3RhbGwgdGhlIGJlc3QgcmVtYWluaW5nIHNoYXJlZCBsaWJyYXJ5LgorCSAgZmkKKwlmaQorCTs7CisKKyAgICAgICoubG8pCisJaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorCSAgb2xkb2JqPWAkZWNobyAiWCRuYW1lIiB8ICRYc2VkIC1lICIkbG8ybyJgCisJICBybWZpbGVzPSIkcm1maWxlcyAkZGlyLyRvbGRvYmoiCisJZmkKKwk7OworCisgICAgICAqKQorCSMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIGEgbGlidG9vbCBwcm9ncmFtLgorCWlmIHRlc3QgJG1vZGUgPSBjbGVhbiAmJgorCSAgIChzZWQgLWUgJzRxJyAkZmlsZSB8IGVncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgcmVsaW5rX2NvbW1hbmQ9CisJICAuICRkaXIvJGZpbGUKKworCSAgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci8kbmFtZSAkb2JqZGlyLyR7bmFtZX1TLiR7b2JqZXh0fSIKKwkgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzICYmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KKwkgICAgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci9sdC0kbmFtZSIKKwkgIGZpCisJZmkKKwk7OworICAgICAgZXNhYworICAgICAgJHNob3cgIiRybSAkcm1maWxlcyIKKyAgICAgICRydW4gJHJtICRybWZpbGVzIHx8IGV4aXRfc3RhdHVzPTEKKyAgICBkb25lCisKKyAgICAjIFRyeSB0byByZW1vdmUgdGhlICR7b2JqZGlyfXMgaW4gdGhlIGRpcmVjdG9yaWVzIHdoZXJlIHdlIGRlbGV0ZWQgZmlsZXMKKyAgICBmb3IgZGlyIGluICRybWRpcnM7IGRvCisgICAgICBpZiB0ZXN0IC1kICIkZGlyIjsgdGhlbgorCSRzaG93ICJybWRpciAkZGlyIgorCSRydW4gcm1kaXIgJGRpciA+L2Rldi9udWxsIDI+JjEKKyAgICAgIGZpCisgICAgZG9uZQorCisgICAgZXhpdCAkZXhpdF9zdGF0dXMKKyAgICA7OworCisgICIiKQorICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBNT0RFIiAxPiYyCisgICAgJGVjaG8gIiRnZW5lcmljX2hlbHAiIDE+JjIKKyAgICBleGl0IDEKKyAgICA7OworICBlc2FjCisKKyAgaWYgdGVzdCAteiAiJGV4ZWNfY21kIjsgdGhlbgorICAgICRlY2hvICIkbW9kZW5hbWU6IGludmFsaWQgb3BlcmF0aW9uIG1vZGUgXGAkbW9kZSciIDE+JjIKKyAgICAkZWNobyAiJGdlbmVyaWNfaGVscCIgMT4mMgorICAgIGV4aXQgMQorICBmaQorZmkgIyB0ZXN0IC16ICIkc2hvd19oZWxwIgorCitpZiB0ZXN0IC1uICIkZXhlY19jbWQiOyB0aGVuCisgIGV2YWwgZXhlYyAkZXhlY19jbWQKKyAgZXhpdCAxCitmaQorCisjIFdlIG5lZWQgdG8gZGlzcGxheSBoZWxwIGZvciBlYWNoIG9mIHRoZSBtb2Rlcy4KK2Nhc2UgJG1vZGUgaW4KKyIiKSAkZWNobyBcCisiVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiBbTU9ERS1BUkddLi4uCisKK1Byb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgorCisgICAgLS1jb25maWcgICAgICAgICAgc2hvdyBhbGwgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMKKyAgICAtLWRlYnVnICAgICAgICAgICBlbmFibGUgdmVyYm9zZSBzaGVsbCB0cmFjaW5nCistbiwgLS1kcnktcnVuICAgICAgICAgZGlzcGxheSBjb21tYW5kcyB3aXRob3V0IG1vZGlmeWluZyBhbnkgZmlsZXMKKyAgICAtLWZlYXR1cmVzICAgICAgICBkaXNwbGF5IGJhc2ljIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKKyAgICAtLWZpbmlzaCAgICAgICAgICBzYW1lIGFzIFxgLS1tb2RlPWZpbmlzaCcKKyAgICAtLWhlbHAgICAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgLS1tb2RlPU1PREUgICAgICAgdXNlIG9wZXJhdGlvbiBtb2RlIE1PREUgW2RlZmF1bHQ9aW5mZXJyZWQgZnJvbSBNT0RFLUFSR1NdCisgICAgLS1xdWlldCAgICAgICAgICAgc2FtZSBhcyBcYC0tc2lsZW50JworICAgIC0tc2lsZW50ICAgICAgICAgIGRvbid0IHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMKKyAgICAtLXZlcnNpb24gICAgICAgICBwcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uCisKK01PREUgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgICAgY2xlYW4gICAgICAgICAgIHJlbW92ZSBmaWxlcyBmcm9tIHRoZSBidWlsZCBkaXJlY3RvcnkKKyAgICAgIGNvbXBpbGUgICAgICAgICBjb21waWxlIGEgc291cmNlIGZpbGUgaW50byBhIGxpYnRvb2wgb2JqZWN0CisgICAgICBleGVjdXRlICAgICAgICAgYXV0b21hdGljYWxseSBzZXQgbGlicmFyeSBwYXRoLCB0aGVuIHJ1biBhIHByb2dyYW0KKyAgICAgIGZpbmlzaCAgICAgICAgICBjb21wbGV0ZSB0aGUgaW5zdGFsbGF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzCisgICAgICBpbnN0YWxsICAgICAgICAgaW5zdGFsbCBsaWJyYXJpZXMgb3IgZXhlY3V0YWJsZXMKKyAgICAgIGxpbmsgICAgICAgICAgICBjcmVhdGUgYSBsaWJyYXJ5IG9yIGFuIGV4ZWN1dGFibGUKKyAgICAgIHVuaW5zdGFsbCAgICAgICByZW1vdmUgbGlicmFyaWVzIGZyb20gYW4gaW5zdGFsbGVkIGRpcmVjdG9yeQorCitNT0RFLUFSR1MgdmFyeSBkZXBlbmRpbmcgb24gdGhlIE1PREUuICBUcnkgXGAkbW9kZW5hbWUgLS1oZWxwIC0tbW9kZT1NT0RFJyBmb3IKK2EgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBNT0RFLiIKKyAgZXhpdCAwCisgIDs7CisKK2NsZWFuKQorICAkZWNobyBcCisiVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9Y2xlYW4gUk0gW1JNLU9QVElPTl0uLi4gRklMRS4uLgorCitSZW1vdmUgZmlsZXMgZnJvbSB0aGUgYnVpbGQgZGlyZWN0b3J5LgorCitSTSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB0byB1c2UgdG8gZGVsZXRlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIEZJTEUKKyh0eXBpY2FsbHkgXGAvYmluL3JtJykuICBSTS1PUFRJT05TIGFyZSBvcHRpb25zIChzdWNoIGFzIFxgLWYnKSB0byBiZSBwYXNzZWQKK3RvIFJNLgorCitJZiBGSUxFIGlzIGEgbGlidG9vbCBsaWJyYXJ5LCBvYmplY3Qgb3IgcHJvZ3JhbSwgYWxsIHRoZSBmaWxlcyBhc3NvY2lhdGVkCit3aXRoIGl0IGFyZSBkZWxldGVkLiBPdGhlcndpc2UsIG9ubHkgRklMRSBpdHNlbGYgaXMgZGVsZXRlZCB1c2luZyBSTS4iCisgIDs7CisKK2NvbXBpbGUpCisgICRlY2hvIFwKKyJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1jb21waWxlIENPTVBJTEUtQ09NTUFORC4uLiBTT1VSQ0VGSUxFCisKK0NvbXBpbGUgYSBzb3VyY2UgZmlsZSBpbnRvIGEgbGlidG9vbCBsaWJyYXJ5IG9iamVjdC4KKworVGhpcyBtb2RlIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG9wdGlvbnM6CisKKyAgLW8gT1VUUFVULUZJTEUgICAgc2V0IHRoZSBvdXRwdXQgZmlsZSBuYW1lIHRvIE9VVFBVVC1GSUxFCisgIC1wcmVmZXItcGljICAgICAgIHRyeSB0byBidWlsZGluZyBQSUMgb2JqZWN0cyBvbmx5CisgIC1wcmVmZXItbm9uLXBpYyAgIHRyeSB0byBidWlsZGluZyBub24tUElDIG9iamVjdHMgb25seQorICAtc3RhdGljICAgICAgICAgICBhbHdheXMgYnVpbGQgYSBcYC5vJyBmaWxlIHN1aXRhYmxlIGZvciBzdGF0aWMgbGlua2luZworCitDT01QSUxFLUNPTU1BTkQgaXMgYSBjb21tYW5kIHRvIGJlIHVzZWQgaW4gY3JlYXRpbmcgYSBcYHN0YW5kYXJkJyBvYmplY3QgZmlsZQorZnJvbSB0aGUgZ2l2ZW4gU09VUkNFRklMRS4KKworVGhlIG91dHB1dCBmaWxlIG5hbWUgaXMgZGV0ZXJtaW5lZCBieSByZW1vdmluZyB0aGUgZGlyZWN0b3J5IGNvbXBvbmVudCBmcm9tCitTT1VSQ0VGSUxFLCB0aGVuIHN1YnN0aXR1dGluZyB0aGUgQyBzb3VyY2UgY29kZSBzdWZmaXggXGAuYycgd2l0aCB0aGUKK2xpYnJhcnkgb2JqZWN0IHN1ZmZpeCwgXGAubG8nLiIKKyAgOzsKKworZXhlY3V0ZSkKKyAgJGVjaG8gXAorIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWV4ZWN1dGUgQ09NTUFORCBbQVJHU10uLi4KKworQXV0b21hdGljYWxseSBzZXQgbGlicmFyeSBwYXRoLCB0aGVuIHJ1biBhIHByb2dyYW0uCisKK1RoaXMgbW9kZSBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBvcHRpb25zOgorCisgIC1kbG9wZW4gRklMRSAgICAgIGFkZCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgRklMRSB0byB0aGUgbGlicmFyeSBwYXRoCisKK1RoaXMgbW9kZSBzZXRzIHRoZSBsaWJyYXJ5IHBhdGggZW52aXJvbm1lbnQgdmFyaWFibGUgYWNjb3JkaW5nIHRvIFxgLWRsb3BlbicKK2ZsYWdzLgorCitJZiBhbnkgb2YgdGhlIEFSR1MgYXJlIGxpYnRvb2wgZXhlY3V0YWJsZSB3cmFwcGVycywgdGhlbiB0aGV5IGFyZSB0cmFuc2xhdGVkCitpbnRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgdW5pbnN0YWxsZWQgYmluYXJ5LCBhbmQgYW55IG9mIHRoZWlyIHJlcXVpcmVkIGxpYnJhcnkKK2RpcmVjdG9yaWVzIGFyZSBhZGRlZCB0byB0aGUgbGlicmFyeSBwYXRoLgorCitUaGVuLCBDT01NQU5EIGlzIGV4ZWN1dGVkLCB3aXRoIEFSR1MgYXMgYXJndW1lbnRzLiIKKyAgOzsKKworZmluaXNoKQorICAkZWNobyBcCisiVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9ZmluaXNoIFtMSUJESVJdLi4uCisKK0NvbXBsZXRlIHRoZSBpbnN0YWxsYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMuCisKK0VhY2ggTElCRElSIGlzIGEgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgbGlidG9vbCBsaWJyYXJpZXMuCisKK1RoZSBjb21tYW5kcyB0aGF0IHRoaXMgbW9kZSBleGVjdXRlcyBtYXkgcmVxdWlyZSBzdXBlcnVzZXIgcHJpdmlsZWdlcy4gIFVzZQordGhlIFxgLS1kcnktcnVuJyBvcHRpb24gaWYgeW91IGp1c3Qgd2FudCB0byBzZWUgd2hhdCB3b3VsZCBiZSBleGVjdXRlZC4iCisgIDs7CisKK2luc3RhbGwpCisgICRlY2hvIFwKKyJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1pbnN0YWxsIElOU1RBTEwtQ09NTUFORC4uLgorCitJbnN0YWxsIGV4ZWN1dGFibGVzIG9yIGxpYnJhcmllcy4KKworSU5TVEFMTC1DT01NQU5EIGlzIHRoZSBpbnN0YWxsYXRpb24gY29tbWFuZC4gIFRoZSBmaXJzdCBjb21wb25lbnQgc2hvdWxkIGJlCitlaXRoZXIgdGhlIFxgaW5zdGFsbCcgb3IgXGBjcCcgcHJvZ3JhbS4KKworVGhlIHJlc3Qgb2YgdGhlIGNvbXBvbmVudHMgYXJlIGludGVycHJldGVkIGFzIGFyZ3VtZW50cyB0byB0aGF0IGNvbW1hbmQgKG9ubHkKK0JTRC1jb21wYXRpYmxlIGluc3RhbGwgb3B0aW9ucyBhcmUgcmVjb2duaXplZCkuIgorICA7OworCitsaW5rKQorICAkZWNobyBcCisiVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9bGluayBMSU5LLUNPTU1BTkQuLi4KKworTGluayBvYmplY3QgZmlsZXMgb3IgbGlicmFyaWVzIHRvZ2V0aGVyIHRvIGZvcm0gYW5vdGhlciBsaWJyYXJ5LCBvciB0bworY3JlYXRlIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbS4KKworTElOSy1DT01NQU5EIGlzIGEgY29tbWFuZCB1c2luZyB0aGUgQyBjb21waWxlciB0aGF0IHlvdSB3b3VsZCB1c2UgdG8gY3JlYXRlCithIHByb2dyYW0gZnJvbSBzZXZlcmFsIG9iamVjdCBmaWxlcy4KKworVGhlIGZvbGxvd2luZyBjb21wb25lbnRzIG9mIExJTkstQ09NTUFORCBhcmUgdHJlYXRlZCBzcGVjaWFsbHk6CisKKyAgLWFsbC1zdGF0aWMgICAgICAgZG8gbm90IGRvIGFueSBkeW5hbWljIGxpbmtpbmcgYXQgYWxsCisgIC1hdm9pZC12ZXJzaW9uICAgIGRvIG5vdCBhZGQgYSB2ZXJzaW9uIHN1ZmZpeCBpZiBwb3NzaWJsZQorICAtZGxvcGVuIEZJTEUgICAgICBcYC1kbHByZW9wZW4nIEZJTEUgaWYgaXQgY2Fubm90IGJlIGRsb3BlbmVkIGF0IHJ1bnRpbWUKKyAgLWRscHJlb3BlbiBGSUxFICAgbGluayBpbiBGSUxFIGFuZCBhZGQgaXRzIHN5bWJvbHMgdG8gbHRfcHJlbG9hZGVkX3N5bWJvbHMKKyAgLWV4cG9ydC1keW5hbWljICAgYWxsb3cgc3ltYm9scyBmcm9tIE9VVFBVVC1GSUxFIHRvIGJlIHJlc29sdmVkIHdpdGggZGxzeW0oMykKKyAgLWV4cG9ydC1zeW1ib2xzIFNZTUZJTEUKKwkJICAgIHRyeSB0byBleHBvcnQgb25seSB0aGUgc3ltYm9scyBsaXN0ZWQgaW4gU1lNRklMRQorICAtZXhwb3J0LXN5bWJvbHMtcmVnZXggUkVHRVgKKwkJICAgIHRyeSB0byBleHBvcnQgb25seSB0aGUgc3ltYm9scyBtYXRjaGluZyBSRUdFWAorICAtTExJQkRJUiAgICAgICAgICBzZWFyY2ggTElCRElSIGZvciByZXF1aXJlZCBpbnN0YWxsZWQgbGlicmFyaWVzCisgIC1sTkFNRSAgICAgICAgICAgIE9VVFBVVC1GSUxFIHJlcXVpcmVzIHRoZSBpbnN0YWxsZWQgbGlicmFyeSBsaWJOQU1FCisgIC1tb2R1bGUgICAgICAgICAgIGJ1aWxkIGEgbGlicmFyeSB0aGF0IGNhbiBkbG9wZW5lZAorICAtbm8tZmFzdC1pbnN0YWxsICBkaXNhYmxlIHRoZSBmYXN0LWluc3RhbGwgbW9kZQorICAtbm8taW5zdGFsbCAgICAgICBsaW5rIGEgbm90LWluc3RhbGxhYmxlIGV4ZWN1dGFibGUKKyAgLW5vLXVuZGVmaW5lZCAgICAgZGVjbGFyZSB0aGF0IGEgbGlicmFyeSBkb2VzIG5vdCByZWZlciB0byBleHRlcm5hbCBzeW1ib2xzCisgIC1vIE9VVFBVVC1GSUxFICAgIGNyZWF0ZSBPVVRQVVQtRklMRSBmcm9tIHRoZSBzcGVjaWZpZWQgb2JqZWN0cworICAtcmVsZWFzZSBSRUxFQVNFICBzcGVjaWZ5IHBhY2thZ2UgcmVsZWFzZSBpbmZvcm1hdGlvbgorICAtcnBhdGggTElCRElSICAgICB0aGUgY3JlYXRlZCBsaWJyYXJ5IHdpbGwgZXZlbnR1YWxseSBiZSBpbnN0YWxsZWQgaW4gTElCRElSCisgIC1SWyBdTElCRElSICAgICAgIGFkZCBMSUJESVIgdG8gdGhlIHJ1bnRpbWUgcGF0aCBvZiBwcm9ncmFtcyBhbmQgbGlicmFyaWVzCisgIC1zdGF0aWMgICAgICAgICAgIGRvIG5vdCBkbyBhbnkgZHluYW1pYyBsaW5raW5nIG9mIGxpYnRvb2wgbGlicmFyaWVzCisgIC12ZXJzaW9uLWluZm8gQ1VSUkVOVFs6UkVWSVNJT05bOkFHRV1dCisJCSAgICBzcGVjaWZ5IGxpYnJhcnkgdmVyc2lvbiBpbmZvIFtlYWNoIHZhcmlhYmxlIGRlZmF1bHRzIHRvIDBdCisKK0FsbCBvdGhlciBvcHRpb25zIChhcmd1bWVudHMgYmVnaW5uaW5nIHdpdGggXGAtJykgYXJlIGlnbm9yZWQuCisKK0V2ZXJ5IG90aGVyIGFyZ3VtZW50IGlzIHRyZWF0ZWQgYXMgYSBmaWxlbmFtZS4gIEZpbGVzIGVuZGluZyBpbiBcYC5sYScgYXJlCit0cmVhdGVkIGFzIHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzLCBvdGhlciBmaWxlcyBhcmUgc3RhbmRhcmQgb3IgbGlicmFyeQorb2JqZWN0IGZpbGVzLgorCitJZiB0aGUgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5sYScsIHRoZW4gYSBsaWJ0b29sIGxpYnJhcnkgaXMgY3JlYXRlZCwKK29ubHkgbGlicmFyeSBvYmplY3RzIChcYC5sbycgZmlsZXMpIG1heSBiZSBzcGVjaWZpZWQsIGFuZCBcYC1ycGF0aCcgaXMKK3JlcXVpcmVkLCBleGNlcHQgd2hlbiBjcmVhdGluZyBhIGNvbnZlbmllbmNlIGxpYnJhcnkuCisKK0lmIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAuYScgb3IgXGAubGliJywgdGhlbiBhIHN0YW5kYXJkIGxpYnJhcnkgaXMgY3JlYXRlZAordXNpbmcgXGBhcicgYW5kIFxgcmFubGliJywgb3Igb24gV2luZG93cyB1c2luZyBcYGxpYicuCisKK0lmIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAubG8nIG9yIFxgLiR7b2JqZXh0fScsIHRoZW4gYSByZWxvYWRhYmxlIG9iamVjdCBmaWxlCitpcyBjcmVhdGVkLCBvdGhlcndpc2UgYW4gZXhlY3V0YWJsZSBwcm9ncmFtIGlzIGNyZWF0ZWQuIgorICA7OworCit1bmluc3RhbGwpCisgICRlY2hvIFwKKyJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT11bmluc3RhbGwgUk0gW1JNLU9QVElPTl0uLi4gRklMRS4uLgorCitSZW1vdmUgbGlicmFyaWVzIGZyb20gYW4gaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KKworUk0gaXMgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gdG8gdXNlIHRvIGRlbGV0ZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBGSUxFCisodHlwaWNhbGx5IFxgL2Jpbi9ybScpLiAgUk0tT1BUSU9OUyBhcmUgb3B0aW9ucyAoc3VjaCBhcyBcYC1mJykgdG8gYmUgcGFzc2VkCit0byBSTS4KKworSWYgRklMRSBpcyBhIGxpYnRvb2wgbGlicmFyeSwgYWxsIHRoZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggaXQgYXJlIGRlbGV0ZWQuCitPdGhlcndpc2UsIG9ubHkgRklMRSBpdHNlbGYgaXMgZGVsZXRlZCB1c2luZyBSTS4iCisgIDs7CisKKyopCisgICRlY2hvICIkbW9kZW5hbWU6IGludmFsaWQgb3BlcmF0aW9uIG1vZGUgXGAkbW9kZSciIDE+JjIKKyAgJGVjaG8gIiRoZWxwIiAxPiYyCisgIGV4aXQgMQorICA7OworZXNhYworCitlY2hvCiskZWNobyAiVHJ5IFxgJG1vZGVuYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgb3RoZXIgbW9kZXMuIgorCitleGl0IDAKKworIyBMb2NhbCBWYXJpYWJsZXM6CisjIG1vZGU6c2hlbGwtc2NyaXB0CisjIHNoLWluZGVudGF0aW9uOjIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL21pc3NpbmcgYi9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvbWlzc2luZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTdmYjVhCi0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL21pc3NpbmcKQEAgLTAsMCArMSwyODMgQEAKKyMhIC9iaW4vc2gKKyMgQ29tbW9uIHN0dWIgZm9yIGEgZmV3IG1pc3NpbmcgR05VIHByb2dyYW1zIHdoaWxlIGluc3RhbGxpbmcuCisjIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBPcmlnaW5hbGx5IGJ5IEZyYW4sY29pcyBQaW5hcmQgPHBpbmFyZEBpcm8udW1vbnRyZWFsLmNhPiwgMTk5Ni4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisjIDAyMTExLTEzMDcsIFVTQS4KKworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKK2lmIHRlc3QgJCMgLWVxIDA7IHRoZW4KKyAgZWNobyAxPiYyICJUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIgorICBleGl0IDEKK2ZpCisKK3J1bj06CisKKyMgSW4gdGhlIGNhc2VzIHdoZXJlIHRoaXMgbWF0dGVycywgYG1pc3NpbmcnIGlzIGJlaW5nIHJ1biBpbiB0aGUKKyMgc3JjZGlyIGFscmVhZHkuCitpZiB0ZXN0IC1mIGNvbmZpZ3VyZS5hYzsgdGhlbgorICBjb25maWd1cmVfYWM9Y29uZmlndXJlLmFjCitlbHNlCisgIGNvbmZpZ3VyZV9hYz1jb25maWd1cmUuaW4KK2ZpCisKK2Nhc2UgIiQxIiBpbgorLS1ydW4pCisgICMgVHJ5IHRvIHJ1biByZXF1ZXN0ZWQgcHJvZ3JhbSwgYW5kIGp1c3QgZXhpdCBpZiBpdCBzdWNjZWVkcy4KKyAgcnVuPQorICBzaGlmdAorICAiJEAiICYmIGV4aXQgMAorICA7OworZXNhYworCisjIElmIGl0IGRvZXMgbm90IGV4aXN0LCBvciBmYWlscyB0byBydW4gKHBvc3NpYmx5IGFuIG91dGRhdGVkIHZlcnNpb24pLAorIyB0cnkgdG8gZW11bGF0ZSBpdC4KK2Nhc2UgIiQxIiBpbgorCisgIC1ofC0taHwtLWhlfC0taGVsfC0taGVscCkKKyAgICBlY2hvICJcCiskMCBbT1BUSU9OXS4uLiBQUk9HUkFNIFtBUkdVTUVOVF0uLi4KKworSGFuZGxlIFxgUFJPR1JBTSBbQVJHVU1FTlRdLi4uJyBmb3Igd2hlbiBQUk9HUkFNIGlzIG1pc3NpbmcsIG9yIHJldHVybiBhbgorZXJyb3Igc3RhdHVzIGlmIHRoZXJlIGlzIG5vIGtub3duIGhhbmRsaW5nIGZvciBQUk9HUkFNLgorCitPcHRpb25zOgorICAtaCwgLS1oZWxwICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQKKyAgLXYsIC0tdmVyc2lvbiAgIG91dHB1dCB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0CisgIC0tcnVuICAgICAgICAgICB0cnkgdG8gcnVuIHRoZSBnaXZlbiBjb21tYW5kLCBhbmQgZW11bGF0ZSBpdCBpZiBpdCBmYWlscworCitTdXBwb3J0ZWQgUFJPR1JBTSB2YWx1ZXM6CisgIGFjbG9jYWwgICAgICB0b3VjaCBmaWxlIFxgYWNsb2NhbC5tNCcKKyAgYXV0b2NvbmYgICAgIHRvdWNoIGZpbGUgXGBjb25maWd1cmUnCisgIGF1dG9oZWFkZXIgICB0b3VjaCBmaWxlIFxgY29uZmlnLmguaW4nCisgIGF1dG9tYWtlICAgICB0b3VjaCBhbGwgXGBNYWtlZmlsZS5pbicgZmlsZXMKKyAgYmlzb24gICAgICAgIGNyZWF0ZSBcYHkudGFiLltjaF0nLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuW2NoXQorICBmbGV4ICAgICAgICAgY3JlYXRlIFxgbGV4Lnl5LmMnLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuYworICBoZWxwMm1hbiAgICAgdG91Y2ggdGhlIG91dHB1dCBmaWxlCisgIGxleCAgICAgICAgICBjcmVhdGUgXGBsZXgueXkuYycsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5jCisgIG1ha2VpbmZvICAgICB0b3VjaCB0aGUgb3V0cHV0IGZpbGUKKyAgdGFyICAgICAgICAgIHRyeSB0YXIsIGdudXRhciwgZ3RhciwgdGhlbiB0YXIgd2l0aG91dCBub24tcG9ydGFibGUgZmxhZ3MKKyAgeWFjYyAgICAgICAgIGNyZWF0ZSBcYHkudGFiLltjaF0nLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuW2NoXSIKKyAgICA7OworCisgIC12fC0tdnwtLXZlfC0tdmVyfC0tdmVyc3wtLXZlcnNpfC0tdmVyc2lvfC0tdmVyc2lvbikKKyAgICBlY2hvICJtaXNzaW5nIDAuMyAtIEdOVSBhdXRvbWFrZSIKKyAgICA7OworCisgIC0qKQorICAgIGVjaG8gMT4mMiAiJDA6IFVua25vd24gXGAkMScgb3B0aW9uIgorICAgIGVjaG8gMT4mMiAiVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKKyAgICBleGl0IDEKKyAgICA7OworCisgIGFjbG9jYWwpCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyBtaXNzaW5nIG9uIHlvdXIgc3lzdGVtLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBcYGFjaW5jbHVkZS5tNCcgb3IgXGAke2NvbmZpZ3VyZV9hY30nLiAgWW91IG1pZ2h0IHdhbnQKKyAgICAgICAgIHRvIGluc3RhbGwgdGhlIFxgQXV0b21ha2UnIGFuZCBcYFBlcmwnIHBhY2thZ2VzLiAgR3JhYiB0aGVtIGZyb20KKyAgICAgICAgIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICB0b3VjaCBhY2xvY2FsLm00CisgICAgOzsKKworICBhdXRvY29uZikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzIG1pc3Npbmcgb24geW91ciBzeXN0ZW0uICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIFxgJHtjb25maWd1cmVfYWN9Jy4gIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlCisgICAgICAgICBcYEF1dG9jb25mJyBhbmQgXGBHTlUgbTQnIHBhY2thZ2VzLiAgR3JhYiB0aGVtIGZyb20gYW55IEdOVQorICAgICAgICAgYXJjaGl2ZSBzaXRlLiIKKyAgICB0b3VjaCBjb25maWd1cmUKKyAgICA7OworCisgIGF1dG9oZWFkZXIpCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyBtaXNzaW5nIG9uIHlvdXIgc3lzdGVtLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBcYGFjY29uZmlnLmgnIG9yIFxgJHtjb25maWd1cmVfYWN9Jy4gIFlvdSBtaWdodCB3YW50CisgICAgICAgICB0byBpbnN0YWxsIHRoZSBcYEF1dG9jb25mJyBhbmQgXGBHTlUgbTQnIHBhY2thZ2VzLiAgR3JhYiB0aGVtCisgICAgICAgICBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICBmaWxlcz1gc2VkIC1uICdzL15bIF0qQVtDTV1fQ09ORklHX0hFQURFUihcKFteKV0qXCkpLiovXDEvcCcgJHtjb25maWd1cmVfYWN9YAorICAgIHRlc3QgLXogIiRmaWxlcyIgJiYgZmlsZXM9ImNvbmZpZy5oIgorICAgIHRvdWNoX2ZpbGVzPQorICAgIGZvciBmIGluICRmaWxlczsgZG8KKyAgICAgIGNhc2UgIiRmIiBpbgorICAgICAgKjoqKSB0b3VjaF9maWxlcz0iJHRvdWNoX2ZpbGVzICJgZWNobyAiJGYiIHwKKwkJCQkgICAgICAgc2VkIC1lICdzL15bXjpdKjovLycgLWUgJ3MvOi4qLy8nYDs7CisgICAgICAqKSB0b3VjaF9maWxlcz0iJHRvdWNoX2ZpbGVzICRmLmluIjs7CisgICAgICBlc2FjCisgICAgZG9uZQorICAgIHRvdWNoICR0b3VjaF9maWxlcworICAgIDs7CisKKyAgYXV0b21ha2UpCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyBtaXNzaW5nIG9uIHlvdXIgc3lzdGVtLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBcYE1ha2VmaWxlLmFtJywgXGBhY2luY2x1ZGUubTQnIG9yIFxgJHtjb25maWd1cmVfYWN9Jy4KKyAgICAgICAgIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlIFxgQXV0b21ha2UnIGFuZCBcYFBlcmwnIHBhY2thZ2VzLgorICAgICAgICAgR3JhYiB0aGVtIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgorICAgIGZpbmQgLiAtdHlwZSBmIC1uYW1lIE1ha2VmaWxlLmFtIC1wcmludCB8CisJICAgc2VkICdzL1wuYW0kLy5pbi8nIHwKKwkgICB3aGlsZSByZWFkIGY7IGRvIHRvdWNoICIkZiI7IGRvbmUKKyAgICA7OworCisgIGJpc29ufHlhY2MpCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyBtaXNzaW5nIG9uIHlvdXIgc3lzdGVtLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBhIFxgLnknIGZpbGUuICBZb3UgbWF5IG5lZWQgdGhlIFxgQmlzb24nIHBhY2thZ2UKKyAgICAgICAgIGluIG9yZGVyIGZvciB0aG9zZSBtb2RpZmljYXRpb25zIHRvIHRha2UgZWZmZWN0LiAgWW91IGNhbiBnZXQKKyAgICAgICAgIFxgQmlzb24nIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgorICAgIHJtIC1mIHkudGFiLmMgeS50YWIuaAorICAgIGlmIFsgJCMgLW5lIDEgXTsgdGhlbgorICAgICAgICBldmFsIExBU1RBUkc9IlwkeyQjfSIKKwljYXNlICIkTEFTVEFSRyIgaW4KKwkqLnkpCisJICAgIFNSQ0ZJTEU9YGVjaG8gIiRMQVNUQVJHIiB8IHNlZCAncy95JC9jLydgCisJICAgIGlmIFsgLWYgIiRTUkNGSUxFIiBdOyB0aGVuCisJICAgICAgICAgY3AgIiRTUkNGSUxFIiB5LnRhYi5jCisJICAgIGZpCisJICAgIFNSQ0ZJTEU9YGVjaG8gIiRMQVNUQVJHIiB8IHNlZCAncy95JC9oLydgCisJICAgIGlmIFsgLWYgIiRTUkNGSUxFIiBdOyB0aGVuCisJICAgICAgICAgY3AgIiRTUkNGSUxFIiB5LnRhYi5oCisJICAgIGZpCisJICA7OworCWVzYWMKKyAgICBmaQorICAgIGlmIFsgISAtZiB5LnRhYi5oIF07IHRoZW4KKwllY2hvID55LnRhYi5oCisgICAgZmkKKyAgICBpZiBbICEgLWYgeS50YWIuYyBdOyB0aGVuCisJZWNobyAnbWFpbigpIHsgcmV0dXJuIDA7IH0nID55LnRhYi5jCisgICAgZmkKKyAgICA7OworCisgIGxleHxmbGV4KQorICAgIGVjaG8gMT4mMiAiXAorV0FSTklORzogXGAkMScgaXMgbWlzc2luZyBvbiB5b3VyIHN5c3RlbS4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCisgICAgICAgICB5b3UgbW9kaWZpZWQgYSBcYC5sJyBmaWxlLiAgWW91IG1heSBuZWVkIHRoZSBcYEZsZXgnIHBhY2thZ2UKKyAgICAgICAgIGluIG9yZGVyIGZvciB0aG9zZSBtb2RpZmljYXRpb25zIHRvIHRha2UgZWZmZWN0LiAgWW91IGNhbiBnZXQKKyAgICAgICAgIFxgRmxleCcgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCisgICAgcm0gLWYgbGV4Lnl5LmMKKyAgICBpZiBbICQjIC1uZSAxIF07IHRoZW4KKyAgICAgICAgZXZhbCBMQVNUQVJHPSJcJHskI30iCisJY2FzZSAiJExBU1RBUkciIGluCisJKi5sKQorCSAgICBTUkNGSUxFPWBlY2hvICIkTEFTVEFSRyIgfCBzZWQgJ3MvbCQvYy8nYAorCSAgICBpZiBbIC1mICIkU1JDRklMRSIgXTsgdGhlbgorCSAgICAgICAgIGNwICIkU1JDRklMRSIgbGV4Lnl5LmMKKwkgICAgZmkKKwkgIDs7CisJZXNhYworICAgIGZpCisgICAgaWYgWyAhIC1mIGxleC55eS5jIF07IHRoZW4KKwllY2hvICdtYWluKCkgeyByZXR1cm4gMDsgfScgPmxleC55eS5jCisgICAgZmkKKyAgICA7OworCisgIGhlbHAybWFuKQorICAgIGVjaG8gMT4mMiAiXAorV0FSTklORzogXGAkMScgaXMgbWlzc2luZyBvbiB5b3VyIHN5c3RlbS4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCisJIHlvdSBtb2RpZmllZCBhIGRlcGVuZGVuY3kgb2YgYSBtYW51YWwgcGFnZS4gIFlvdSBtYXkgbmVlZCB0aGUKKwkgXGBIZWxwMm1hbicgcGFja2FnZSBpbiBvcmRlciBmb3IgdGhvc2UgbW9kaWZpY2F0aW9ucyB0byB0YWtlCisJIGVmZmVjdC4gIFlvdSBjYW4gZ2V0IFxgSGVscDJtYW4nIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgorCisgICAgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICdzLy4qLW8gXChbXiBdKlwpLiovXDEvcCdgCisgICAgaWYgdGVzdCAteiAiJGZpbGUiOyB0aGVuCisJZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICdzLy4qLS1vdXRwdXQ9XChbXiBdKlwpLiovXDEvcCdgCisgICAgZmkKKyAgICBpZiBbIC1mICIkZmlsZSIgXTsgdGhlbgorCXRvdWNoICRmaWxlCisgICAgZWxzZQorCXRlc3QgLXogIiRmaWxlIiB8fCBleGVjID4kZmlsZQorCWVjaG8gIi5hYiBoZWxwMm1hbiBpcyByZXF1aXJlZCB0byBnZW5lcmF0ZSB0aGlzIHBhZ2UiCisJZXhpdCAxCisgICAgZmkKKyAgICA7OworCisgIG1ha2VpbmZvKQorICAgIGlmIHRlc3QgLXogIiRydW4iICYmIChtYWtlaW5mbyAtLXZlcnNpb24pID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgICAjIFdlIGhhdmUgbWFrZWluZm8sIGJ1dCBpdCBmYWlsZWQuCisgICAgICAgZXhpdCAxCisgICAgZmkKKworICAgIGVjaG8gMT4mMiAiXAorV0FSTklORzogXGAkMScgaXMgbWlzc2luZyBvbiB5b3VyIHN5c3RlbS4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCisgICAgICAgICB5b3UgbW9kaWZpZWQgYSBcYC50ZXhpJyBvciBcYC50ZXhpbmZvJyBmaWxlLCBvciBhbnkgb3RoZXIgZmlsZQorICAgICAgICAgaW5kaXJlY3RseSBhZmZlY3RpbmcgdGhlIGFzcGVjdCBvZiB0aGUgbWFudWFsLiAgVGhlIHNwdXJpb3VzCisgICAgICAgICBjYWxsIG1pZ2h0IGFsc28gYmUgdGhlIGNvbnNlcXVlbmNlIG9mIHVzaW5nIGEgYnVnZ3kgXGBtYWtlJyAoQUlYLAorICAgICAgICAgRFUsIElSSVgpLiAgWW91IG1pZ2h0IHdhbnQgdG8gaW5zdGFsbCB0aGUgXGBUZXhpbmZvJyBwYWNrYWdlIG9yCisgICAgICAgICB0aGUgXGBHTlUgbWFrZScgcGFja2FnZS4gIEdyYWIgZWl0aGVyIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgorICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAncy8uKi1vIFwoW14gXSpcKS4qL1wxL3AnYAorICAgIGlmIHRlc3QgLXogIiRmaWxlIjsgdGhlbgorICAgICAgZmlsZT1gZWNobyAiJCoiIHwgc2VkICdzLy4qIFwoW14gXSpcKSAqJC9cMS8nYAorICAgICAgZmlsZT1gc2VkIC1uICcvXkBzZXRmaWxlbmFtZS8geyBzLy4qIFwoW14gXSpcKSAqJC9cMS87IHA7IHE7IH0nICRmaWxlYAorICAgIGZpCisgICAgdG91Y2ggJGZpbGUKKyAgICA7OworCisgIHRhcikKKyAgICBzaGlmdAorICAgIGlmIHRlc3QgLW4gIiRydW4iOyB0aGVuCisgICAgICBlY2hvIDE+JjIgIkVSUk9SOiBcYHRhcicgcmVxdWlyZXMgLS1ydW4iCisgICAgICBleGl0IDEKKyAgICBmaQorCisgICAgIyBXZSBoYXZlIGFscmVhZHkgdHJpZWQgdGFyIGluIHRoZSBnZW5lcmljIHBhcnQuCisgICAgIyBMb29rIGZvciBnbnV0YXIvZ3RhciBiZWZvcmUgaW52b2NhdGlvbiB0byBhdm9pZCB1Z2x5IGVycm9yCisgICAgIyBtZXNzYWdlcy4KKyAgICBpZiAoZ251dGFyIC0tdmVyc2lvbiA+IC9kZXYvbnVsbCAyPiYxKTsgdGhlbgorICAgICAgIGdudXRhciAkezErIiRAIn0gJiYgZXhpdCAwCisgICAgZmkKKyAgICBpZiAoZ3RhciAtLXZlcnNpb24gPiAvZGV2L251bGwgMj4mMSk7IHRoZW4KKyAgICAgICBndGFyICR7MSsiJEAifSAmJiBleGl0IDAKKyAgICBmaQorICAgIGZpcnN0YXJnPSIkMSIKKyAgICBpZiBzaGlmdDsgdGhlbgorCWNhc2UgIiRmaXJzdGFyZyIgaW4KKwkqbyopCisJICAgIGZpcnN0YXJnPWBlY2hvICIkZmlyc3RhcmciIHwgc2VkIHMvby8vYAorCSAgICB0YXIgIiRmaXJzdGFyZyIgJHsxKyIkQCJ9ICYmIGV4aXQgMAorCSAgICA7OworCWVzYWMKKwljYXNlICIkZmlyc3RhcmciIGluCisJKmgqKQorCSAgICBmaXJzdGFyZz1gZWNobyAiJGZpcnN0YXJnIiB8IHNlZCBzL2gvL2AKKwkgICAgdGFyICIkZmlyc3RhcmciICR7MSsiJEAifSAmJiBleGl0IDAKKwkgICAgOzsKKwllc2FjCisgICAgZmkKKworICAgIGVjaG8gMT4mMiAiXAorV0FSTklORzogSSBjYW4ndCBzZWVtIHRvIGJlIGFibGUgdG8gcnVuIFxgdGFyJyB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuCisgICAgICAgICBZb3UgbWF5IHdhbnQgdG8gaW5zdGFsbCBHTlUgdGFyIG9yIEZyZWUgcGF4dXRpbHMsIG9yIGNoZWNrIHRoZQorICAgICAgICAgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4iCisgICAgZXhpdCAxCisgICAgOzsKKworICAqKQorICAgIGVjaG8gMT4mMiAiXAorV0FSTklORzogXGAkMScgaXMgbmVlZGVkLCBhbmQgeW91IGRvIG5vdCBzZWVtIHRvIGhhdmUgaXQgaGFuZHkgb24geW91cgorICAgICAgICAgc3lzdGVtLiAgWW91IG1pZ2h0IGhhdmUgbW9kaWZpZWQgc29tZSBmaWxlcyB3aXRob3V0IGhhdmluZyB0aGUKKyAgICAgICAgIHByb3BlciB0b29scyBmb3IgZnVydGhlciBoYW5kbGluZyB0aGVtLiAgQ2hlY2sgdGhlIFxgUkVBRE1FJyBmaWxlLAorICAgICAgICAgaXQgb2Z0ZW4gdGVsbHMgeW91IGFib3V0IHRoZSBuZWVkZWQgcHJlcmVxdWlyZW1lbnRzIGZvciBpbnN0YWxsaW5nCisgICAgICAgICB0aGlzIHBhY2thZ2UuICBZb3UgbWF5IGFsc28gcGVlayBhdCBhbnkgR05VIGFyY2hpdmUgc2l0ZSwgaW4gY2FzZQorICAgICAgICAgc29tZSBvdGhlciBwYWNrYWdlIHdvdWxkIGNvbnRhaW4gdGhpcyBtaXNzaW5nIFxgJDEnIHByb2dyYW0uIgorICAgIGV4aXQgMQorICAgIDs7Citlc2FjCisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL21raW5zdGFsbGRpcnMgYi9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvbWtpbnN0YWxsZGlycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzdhMmJlCi0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL21raW5zdGFsbGRpcnMKQEAgLTAsMCArMSw0MCBAQAorIyEgL2Jpbi9zaAorIyBta2luc3RhbGxkaXJzIC0tLSBtYWtlIGRpcmVjdG9yeSBoaWVyYXJjaHkKKyMgQXV0aG9yOiBOb2FoIEZyaWVkbWFuIDxmcmllZG1hbkBwcmVwLmFpLm1pdC5lZHU+CisjIENyZWF0ZWQ6IDE5OTMtMDUtMTYKKyMgUHVibGljIGRvbWFpbgorCisjICRJZDogbWtpbnN0YWxsZGlycyx2IDEuMS4xLjEgMjAwNS8wMi8xMSAyMToyMjozMiBkdmluZXIgRXhwICQKKworZXJyc3RhdHVzPTAKKworZm9yIGZpbGUKK2RvCisgICBzZXQgZm5vcmQgYGVjaG8gIjokZmlsZSIgfCBzZWQgLW5lICdzL146XC8vIy87cy9eOi8vO3MvXC8vIC9nO3MvXiMvXC8vO3AnYAorICAgc2hpZnQKKworICAgcGF0aGNvbXA9CisgICBmb3IgZAorICAgZG8KKyAgICAgcGF0aGNvbXA9IiRwYXRoY29tcCRkIgorICAgICBjYXNlICIkcGF0aGNvbXAiIGluCisgICAgICAgLSogKSBwYXRoY29tcD0uLyRwYXRoY29tcCA7OworICAgICBlc2FjCisKKyAgICAgaWYgdGVzdCAhIC1kICIkcGF0aGNvbXAiOyB0aGVuCisgICAgICAgIGVjaG8gIm1rZGlyICRwYXRoY29tcCIKKworICAgICAgICBta2RpciAiJHBhdGhjb21wIiB8fCBsYXN0ZXJyPSQ/CisKKyAgICAgICAgaWYgdGVzdCAhIC1kICIkcGF0aGNvbXAiOyB0aGVuCisgIAkgIGVycnN0YXR1cz0kbGFzdGVycgorICAgICAgICBmaQorICAgICBmaQorCisgICAgIHBhdGhjb21wPSIkcGF0aGNvbXAvIgorICAgZG9uZQorZG9uZQorCitleGl0ICRlcnJzdGF0dXMKKworIyBta2luc3RhbGxkaXJzIGVuZHMgaGVyZQpkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL21vZF9nc29hcC8uaW5kZW50LnBybyBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9tb2RfZ3NvYXAvLmluZGVudC5wcm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMyNzA0NQotLS0gL2Rldi9udWxsCisrKyBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9tb2RfZ3NvYXAvLmluZGVudC5wcm8KQEAgLTAsMCArMSwxMCBAQAorLS1icmFjZXMtYWZ0ZXItaWYtbGluZSAKKy0taW5kZW50LWxldmVsNCAKKy1scCAtZGkxIC1udXQgLWJsaTAgLW5wY3MgCistbnNhZiAtbnNhdyAtbnNhaQorLWNkYiAtc2MKKy1uY2UKKy0tZm9ybWF0LWZpcnN0LWNvbHVtbi1jb21tZW50cworLVRoYW5kbGVyX3JlYworLS1saW5lLWxlbmd0aDgwCistLXRhYi1zaXplNApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9tb2RfZ3NvYXAvTWFrZWZpbGUgYi9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvbW9kX2dzb2FwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZTk3ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvbW9kX2dzb2FwL01ha2VmaWxlCkBAIC0wLDAgKzEsMjM4IEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGF1dG9tYWtlIDEuNSBmcm9tIE1ha2VmaWxlLmFtLgorCisjIENvcHlyaWdodCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxCisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworCisKKyNpbnB1dCBmb3IgYXV0b21ha2UgdG8gZ2VuZXJhdGUgbW9kX2dzb2FwIE1ha2VmaWxlCisKK1NIRUxMID0gL2Jpbi9zaAorCitzcmNkaXIgPSAuCit0b3Bfc3JjZGlyID0gLi4KKworcHJlZml4ID0gL3Vzci9sb2NhbAorZXhlY19wcmVmaXggPSAke3ByZWZpeH0KKworYmluZGlyID0gJHtleGVjX3ByZWZpeH0vYmluCitzYmluZGlyID0gJHtleGVjX3ByZWZpeH0vc2JpbgorbGliZXhlY2RpciA9ICR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMKK2RhdGFkaXIgPSAke3ByZWZpeH0vc2hhcmUKK3N5c2NvbmZkaXIgPSAke3ByZWZpeH0vZXRjCitzaGFyZWRzdGF0ZWRpciA9ICR7cHJlZml4fS9jb20KK2xvY2Fsc3RhdGVkaXIgPSAke3ByZWZpeH0vdmFyCitsaWJkaXIgPSAke2V4ZWNfcHJlZml4fS9saWIKK2luZm9kaXIgPSAke3ByZWZpeH0vaW5mbworbWFuZGlyID0gJHtwcmVmaXh9L21hbgoraW5jbHVkZWRpciA9ICR7cHJlZml4fS9pbmNsdWRlCitvbGRpbmNsdWRlZGlyID0gL3Vzci9pbmNsdWRlCitwa2dkYXRhZGlyID0gJChkYXRhZGlyKS9tb2RfZ3NvYXAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9tb2RfZ3NvYXAKK3BrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL21vZF9nc29hcAordG9wX2J1aWxkZGlyID0gLi4KKworQUNMT0NBTCA9ICR7U0hFTEx9IC9ob21lL2FiZXJnZXIvYXBhY2hlX2dzb2FwLjAuMC41L21pc3NpbmcgLS1ydW4gYWNsb2NhbAorQVVUT0NPTkYgPSAke1NIRUxMfSAvaG9tZS9hYmVyZ2VyL2FwYWNoZV9nc29hcC4wLjAuNS9taXNzaW5nIC0tcnVuIGF1dG9jb25mCitBVVRPTUFLRSA9ICR7U0hFTEx9IC9ob21lL2FiZXJnZXIvYXBhY2hlX2dzb2FwLjAuMC41L21pc3NpbmcgLS1ydW4gYXV0b21ha2UKK0FVVE9IRUFERVIgPSAke1NIRUxMfSAvaG9tZS9hYmVyZ2VyL2FwYWNoZV9nc29hcC4wLjAuNS9taXNzaW5nIC0tcnVuIGF1dG9oZWFkZXIKKworSU5TVEFMTCA9IC91c3IvYmluL2dpbnN0YWxsIC1jCitJTlNUQUxMX1BST0dSQU0gPSAke0lOU1RBTEx9CitJTlNUQUxMX0RBVEEgPSAke0lOU1RBTEx9IC1tIDY0NAorSU5TVEFMTF9TQ1JJUFQgPSAke0lOU1RBTEx9CitJTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQordHJhbnNmb3JtID0gcyx4LHgsCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX2FsaWFzID0gaTY4Ni1zdXNlLWxpbnV4CitidWlsZF90cmlwbGV0ID0gaTY4Ni1zdXNlLWxpbnV4Citob3N0X2FsaWFzID0gaTY4Ni1zdXNlLWxpbnV4Citob3N0X3RyaXBsZXQgPSBpNjg2LXN1c2UtbGludXgKK3RhcmdldF9hbGlhcyA9IGk2ODYtc3VzZS1saW51eAordGFyZ2V0X3RyaXBsZXQgPSBpNjg2LXN1c2UtbGludXgKK0FNVEFSID0gJHtTSEVMTH0gL2hvbWUvYWJlcmdlci9hcGFjaGVfZ3NvYXAuMC4wLjUvbWlzc2luZyAtLXJ1biB0YXIKK0FQWFNfQ1hYX09QVElPTlMgPSAKK0FTID0gYXMKK0FXSyA9IGdhd2sKK0NDID0gZ2NjCitDUFAgPSBnY2MgLUUKK0NYWCA9IGcrKworQ1hYREVCVUdERUZJTkVTID0gLURfTkRFQlVHCitDWFhGTEFHUyA9ICAtTzIKK0RFUERJUiA9IC5kZXBzCitETExUT09MID0gZGxsdG9vbAorRUNITyA9IGVjaG8KK0VYRUVYVCA9IAorRVhJU1RTX0FQWFMgPSB5ZXMKK0VYSVNUU19HU09BUCA9IHllcworSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gJHtTSEVMTH0gJChpbnN0YWxsX3NoKSAtYyAtcworTElCVE9PTCA9ICQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sCitMSUJUT09MX0RFUFMgPSAuL2x0bWFpbi5zaAorTE5fUyA9IGxuIC1zCitPQkpEVU1QID0gb2JqZHVtcAorT0JKRVhUID0gbworUEFDS0FHRSA9IG1vZF9nc29hcAorUkFOTElCID0gcmFubGliCitTVFJJUCA9IHN0cmlwCitWRVJTSU9OID0gMC4wLjUKK2FtX19pbmNsdWRlID0gaW5jbHVkZQorYW1fX3F1b3RlID0gCitpbnN0YWxsX3NoID0gL2hvbWUvYWJlcmdlci9hcGFjaGVfZ3NvYXAuMC4wLjUvaW5zdGFsbC1zaAorCitBTV9DUFBGTEFHUyA9ICQoQ1hYREVCVUdERUZJTkVTKQorSU5DTFVERVMgPSAtSSQodG9wX2J1aWxkZGlyKQorCitub2luc3RfU0NSSVBUUyA9IG1vZF9nc29hcC5zbworCitDTEVBTkZJTEVTID0gKn4gKi5vICouc28KK3N1YmRpciA9IG1vZF9nc29hcAorbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycworQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK1NDUklQVFMgPSAkKG5vaW5zdF9TQ1JJUFRTKQorCitESVNUX1NPVVJDRVMgPQorRElTVF9DT01NT04gPSBNYWtlZmlsZS5hbSBNYWtlZmlsZS5pbgorYWxsOiBhbGwtYW0KKworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuYyAuc28KKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKKworZGlzdGNsZWFuLWxpYnRvb2w6CisJLXJtIC1mIGxpYnRvb2wKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogIE1ha2VmaWxlLmFtICAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWdudSAgbW9kX2dzb2FwL01ha2VmaWxlCitNYWtlZmlsZTogICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgXAorCSAgQ09ORklHX0hFQURFUlM9IENPTkZJR19MSU5LUz0gXAorCSAgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS8kQCAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKK3VuaW5zdGFsbC1pbmZvLWFtOgordGFnczogVEFHUworVEFHUzoKKworCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorCit0b3BfZGlzdGRpciA9IC4uCitkaXN0ZGlyID0gJCh0b3BfZGlzdGRpcikvJChQQUNLQUdFKS0kKFZFUlNJT04pCisKK2Rpc3RkaXI6ICQoRElTVEZJTEVTKQorCUBmb3IgZmlsZSBpbiAkKERJU1RGSUxFUyk7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGRpcj1gZWNobyAiJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKKwkgIGlmIHRlc3QgIiQkZGlyIiAhPSAiJCRmaWxlIiAmJiB0ZXN0ICIkJGRpciIgIT0gIi4iOyB0aGVuIFwKKwkgICAgJChta2luc3RhbGxkaXJzKSAiJChkaXN0ZGlyKS8kJGRpciI7IFwKKwkgIGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBjcCAtcFIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorY2hlY2stYW06IGFsbC1hbQorY2hlY2s6IGNoZWNrLWFtCithbGwtYW06IE1ha2VmaWxlICQoU0NSSVBUUykKKworaW5zdGFsbGRpcnM6CisKK2luc3RhbGw6IGluc3RhbGwtYW0KK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQordW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KK2luc3RhbGwtc3RyaXA6CisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChDTEVBTkZJTEVTKQorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktcm0gLWYgTWFrZWZpbGUgJChDT05GSUdfQ0xFQU5fRklMRVMpIHN0YW1wLWggc3RhbXAtaFswLTldKgorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKK2NsZWFuOiBjbGVhbi1hbQorCitjbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIG1vc3RseWNsZWFuLWFtCisKK2Rpc3RjbGVhbjogZGlzdGNsZWFuLWFtCisKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWxpYnRvb2wKKworZHZpOiBkdmktYW0KKworZHZpLWFtOgorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbToKKworaW5zdGFsbC1leGVjLWFtOgorCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQorCitpbnN0YWxsLW1hbjoKKworaW5zdGFsbGNoZWNrLWFtOgorCittYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCisKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wKKwordW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtaW5mby1hbQorCisuUEhPTlk6IGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIFwKKwlkaXN0Y2xlYW4gZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGRpciBkdmkgXAorCWR2aS1hbSBpbmZvIGluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIGluc3RhbGwtZGF0YSBcCisJaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZXhlYyBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1pbmZvIFwKKwlpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgXAorCWluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBtYWludGFpbmVyLWNsZWFuIFwKKwltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCisJbW9zdGx5Y2xlYW4tbGlidG9vbCB1bmluc3RhbGwgdW5pbnN0YWxsLWFtIHVuaW5zdGFsbC1pbmZvLWFtCisKKworLmMuc286CisJYXB4cyAkKEFQWFNfQ1hYX09QVElPTlMpIC1sZ3NvYXArKyAkKElOQ0xVREVTKSAtYyAkPCAKKwljcCAkQCBgYXB4cyAtcSBMSUJFWEVDRElSYAorCittb2RfZ3NvYXAuc28gOiBtb2RfZ3NvYXAuYworIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL21vZF9nc29hcC9NYWtlZmlsZS5hbSBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9tb2RfZ3NvYXAvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdlZTMxZgotLS0gL2Rldi9udWxsCisrKyBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9tb2RfZ3NvYXAvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxNiBAQAorI2lucHV0IGZvciBhdXRvbWFrZSB0byBnZW5lcmF0ZSBtb2RfZ3NvYXAgTWFrZWZpbGUKKworQU1fQ1BQRkxBR1M9ICQoQ1hYREVCVUdERUZJTkVTKQorSU5DTFVERVM9LUkkKHRvcF9idWlsZGRpcikKKworbm9pbnN0X1NDUklQVFM9bW9kX2dzb2FwLnNvCisKKy5jLnNvOgorCWFweHMgJChBUFhTX0NYWF9PUFRJT05TKSAtbGdzb2FwKysgJChJTkNMVURFUykgLWMgJDwgCisJI2NwICRAIGBhcHhzIC1xIExJQkVYRUNESVJgCisKK21vZF9nc29hcC5zbyA6IG1vZF9nc29hcC5jCisKK0NMRUFORklMRVM9Kn4gKi5vICouc28KKworCmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvbW9kX2dzb2FwL01ha2VmaWxlLmluIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL21vZF9nc29hcC9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODQ1ZDYzCi0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL21vZF9nc29hcC9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDIzOCBAQAorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhdXRvbWFrZSAxLjUgZnJvbSBNYWtlZmlsZS5hbS4KKworIyBDb3B5cmlnaHQgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMQorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK0BTRVRfTUFLRUAKKworI2lucHV0IGZvciBhdXRvbWFrZSB0byBnZW5lcmF0ZSBtb2RfZ3NvYXAgTWFrZWZpbGUKKworU0hFTEwgPSBAU0hFTExACisKK3NyY2RpciA9IEBzcmNkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitWUEFUSCA9IEBzcmNkaXJACitwcmVmaXggPSBAcHJlZml4QAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACisKK2JpbmRpciA9IEBiaW5kaXJACitzYmluZGlyID0gQHNiaW5kaXJACitsaWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACitkYXRhZGlyID0gQGRhdGFkaXJACitzeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACitzaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK2xpYmRpciA9IEBsaWJkaXJACitpbmZvZGlyID0gQGluZm9kaXJACittYW5kaXIgPSBAbWFuZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAorb2xkaW5jbHVkZWRpciA9IC91c3IvaW5jbHVkZQorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK3RvcF9idWlsZGRpciA9IC4uCisKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FVVE9DT05GID0gQEFVVE9DT05GQAorQVVUT01BS0UgPSBAQVVUT01BS0VACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACisKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACitJTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQordHJhbnNmb3JtID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfdHJpcGxldCA9IEBob3N0QAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RhcmdldF90cmlwbGV0ID0gQHRhcmdldEAKK0FNVEFSID0gQEFNVEFSQAorQVBYU19DWFhfT1BUSU9OUyA9IEBBUFhTX0NYWF9PUFRJT05TQAorQVMgPSBAQVNACitBV0sgPSBAQVdLQAorQ0MgPSBAQ0NACitDUFAgPSBAQ1BQQAorQ1hYID0gQENYWEAKK0NYWERFQlVHREVGSU5FUyA9IEBDWFhERUJVR0RFRklORVNACitDWFhGTEFHUyA9IEBDWFhGTEFHU0AKK0RFUERJUiA9IEBERVBESVJACitETExUT09MID0gQERMTFRPT0xACitFQ0hPID0gQEVDSE9ACitFWEVFWFQgPSBARVhFRVhUQAorRVhJU1RTX0FQWFMgPSBARVhJU1RTX0FQWFNACitFWElTVFNfR1NPQVAgPSBARVhJU1RTX0dTT0FQQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0xJQlRPT0wgPSBATElCVE9PTEAKK0xJQlRPT0xfREVQUyA9IEBMSUJUT09MX0RFUFNACitMTl9TID0gQExOX1NACitPQkpEVU1QID0gQE9CSkRVTVBACitPQkpFWFQgPSBAT0JKRVhUQAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUkFOTElCID0gQFJBTkxJQkAKK1NUUklQID0gQFNUUklQQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fcXVvdGUgPSBAYW1fX3F1b3RlQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAorCitBTV9DUFBGTEFHUyA9ICQoQ1hYREVCVUdERUZJTkVTKQorSU5DTFVERVMgPSAtSSQodG9wX2J1aWxkZGlyKQorCitub2luc3RfU0NSSVBUUyA9IG1vZF9nc29hcC5zbworCitDTEVBTkZJTEVTID0gKn4gKi5vICouc28KK3N1YmRpciA9IG1vZF9nc29hcAorbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycworQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK1NDUklQVFMgPSAkKG5vaW5zdF9TQ1JJUFRTKQorCitESVNUX1NPVVJDRVMgPQorRElTVF9DT01NT04gPSBNYWtlZmlsZS5hbSBNYWtlZmlsZS5pbgorYWxsOiBhbGwtYW0KKworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuYyAuc28KKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKKworZGlzdGNsZWFuLWxpYnRvb2w6CisJLXJtIC1mIGxpYnRvb2wKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogIE1ha2VmaWxlLmFtICAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWdudSAgbW9kX2dzb2FwL01ha2VmaWxlCitNYWtlZmlsZTogICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgXAorCSAgQ09ORklHX0hFQURFUlM9IENPTkZJR19MSU5LUz0gXAorCSAgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS8kQCAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKK3VuaW5zdGFsbC1pbmZvLWFtOgordGFnczogVEFHUworVEFHUzoKKworCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorCit0b3BfZGlzdGRpciA9IC4uCitkaXN0ZGlyID0gJCh0b3BfZGlzdGRpcikvJChQQUNLQUdFKS0kKFZFUlNJT04pCisKK2Rpc3RkaXI6ICQoRElTVEZJTEVTKQorCUBmb3IgZmlsZSBpbiAkKERJU1RGSUxFUyk7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGRpcj1gZWNobyAiJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKKwkgIGlmIHRlc3QgIiQkZGlyIiAhPSAiJCRmaWxlIiAmJiB0ZXN0ICIkJGRpciIgIT0gIi4iOyB0aGVuIFwKKwkgICAgJChta2luc3RhbGxkaXJzKSAiJChkaXN0ZGlyKS8kJGRpciI7IFwKKwkgIGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBjcCAtcFIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorY2hlY2stYW06IGFsbC1hbQorY2hlY2s6IGNoZWNrLWFtCithbGwtYW06IE1ha2VmaWxlICQoU0NSSVBUUykKKworaW5zdGFsbGRpcnM6CisKK2luc3RhbGw6IGluc3RhbGwtYW0KK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQordW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KK2luc3RhbGwtc3RyaXA6CisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChDTEVBTkZJTEVTKQorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktcm0gLWYgTWFrZWZpbGUgJChDT05GSUdfQ0xFQU5fRklMRVMpIHN0YW1wLWggc3RhbXAtaFswLTldKgorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKK2NsZWFuOiBjbGVhbi1hbQorCitjbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIG1vc3RseWNsZWFuLWFtCisKK2Rpc3RjbGVhbjogZGlzdGNsZWFuLWFtCisKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWxpYnRvb2wKKworZHZpOiBkdmktYW0KKworZHZpLWFtOgorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbToKKworaW5zdGFsbC1leGVjLWFtOgorCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQorCitpbnN0YWxsLW1hbjoKKworaW5zdGFsbGNoZWNrLWFtOgorCittYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCisKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wKKwordW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtaW5mby1hbQorCisuUEhPTlk6IGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIFwKKwlkaXN0Y2xlYW4gZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGRpciBkdmkgXAorCWR2aS1hbSBpbmZvIGluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIGluc3RhbGwtZGF0YSBcCisJaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZXhlYyBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1pbmZvIFwKKwlpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgXAorCWluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBtYWludGFpbmVyLWNsZWFuIFwKKwltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCisJbW9zdGx5Y2xlYW4tbGlidG9vbCB1bmluc3RhbGwgdW5pbnN0YWxsLWFtIHVuaW5zdGFsbC1pbmZvLWFtCisKKworLmMuc286CisJYXB4cyAkKEFQWFNfQ1hYX09QVElPTlMpIC1sZ3NvYXArKyAkKElOQ0xVREVTKSAtYyAkPCAKKwkjY3AgJEAgYGFweHMgLXEgTElCRVhFQ0RJUmAKKworbW9kX2dzb2FwLnNvIDogbW9kX2dzb2FwLmMKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9tb2RfZ3NvYXAvTWFrZWZpbGUudG1wbCBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9tb2RfZ3NvYXAvTWFrZWZpbGUudG1wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzk1OWJkCi0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL21vZF9nc29hcC9NYWtlZmlsZS50bXBsCkBAIC0wLDAgKzEsMTYgQEAKKworI0RlcGVuZGVuY2llcworCiskKE9CSlMpICQoT0JKU19QSUMpOiBNYWtlZmlsZQorCisjIERPIE5PVCBSRU1PVkUKK21vZF9nc29hcC5vOiBtb2RfZ3NvYXAuYyBcCisgJChJTkNESVIpL2h0dHBkLmggXAorICQoSU5DRElSKS9hcF9jb25maWcuaCAkKElOQ0RJUikvYXBfbW1uLmggXAorICQoSU5DRElSKS9hcF9jb25maWdfYXV0by5oICQoT1NESVIpL29zLmggXAorICQoSU5DRElSKS9hcF9jdHlwZS5oICQoSU5DRElSKS9oc3JlZ2V4LmggXAorICQoSU5DRElSKS9hcF9hbGxvYy5oICQoSU5DRElSKS9idWZmLmggJChJTkNESVIpL2FwLmggXAorICQoSU5DRElSKS91dGlsX3VyaS5oICQoSU5DRElSKS9odHRwX2NvbmZpZy5oIFwKKyAkKElOQ0RJUikvaHR0cF9jb3JlLmggJChJTkNESVIpL2h0dHBfbG9nLmggXAorICQoSU5DRElSKS9odHRwX21haW4uaCAkKElOQ0RJUikvaHR0cF9wcm90b2NvbC5oIFwKKyAkKElOQ0RJUikvdXRpbF9zY3JpcHQuaApkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL21vZF9nc29hcC9NYWtlZmlsZS51eCBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9tb2RfZ3NvYXAvTWFrZWZpbGUudXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzExMzc2NQotLS0gL2Rldi9udWxsCisrKyBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9tb2RfZ3NvYXAvTWFrZWZpbGUudXgKQEAgLTAsMCArMSwxNSBAQAorI2lucHV0IGZvciBhdXRvbWFrZSB0byBnZW5lcmF0ZSBtb2RfZ3NvYXAgTWFrZWZpbGUKKworYWxsOiBtb2RfZ3NvYXAuc28KKworbW9kX2dzb2FwLnNvIDogbW9kX2dzb2FwLmMgLi4vLi4vc3Rkc29hcDIuaAorCWFweHMgLVdjLC1nIC1JLi4gLUkuLi8uLiAtYyBtb2RfZ3NvYXAuYyAKKworLlBIT05ZOiBjbGVhbgorCitjbGVhbjoKKwlybSAtZiAqfiAqLm8gKi5zbworCitkaXN0Y2xlYW46CisJJChNQUtFKSBjbGVhbgorCmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvbW9kX2dzb2FwL2NvbmZpZy9Db25maWd1cmF0aW9uIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL21vZF9nc29hcC9jb25maWcvQ29uZmlndXJhdGlvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTgxMDNmCi0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL21vZF9nc29hcC9jb25maWcvQ29uZmlndXJhdGlvbgpAQCAtMCwwICsxLDQ1NCBAQAorIyBDb25maWcgZmlsZSBmb3IgdGhlIEFwYWNoZSBodHRwZC4KKworIyBDb25maWd1cmF0aW9uLnRtcGwgaXMgdGhlIHRlbXBsYXRlIGZvciBDb25maWd1cmF0aW9uLiBDb25maWd1cmF0aW9uIHNob3VsZAorIyBiZSBlZGl0ZWQgdG8gc2VsZWN0IHRoZSBtb2R1bGVzIHRvIGJlIGluY2x1ZGVkIGFzIHdlbGwgYXMgdmFyaW91cyBmbGFncworIyBmb3IgTWFrZWZpbGUuCisKKyMgVGhlIHRlbXBsYXRlIHNob3VsZCBvbmx5IGJlIGNoYW5nZWQgd2hlbiBhIG5ldyBzeXN0ZW0gb3IgbW9kdWxlIGlzIGFkZGVkLAorIyBvciBhbiBleGlzdGluZyBvbmUgbW9kaWZpZWQuIFRoaXMgd2lsbCBhbHNvIG1vc3QgbGlrZWx5IHJlcXVpcmUgc29tZSBtaW5vcgorIyBjaGFuZ2VzIHRvIENvbmZpZ3VyZSB0byByZWNvZ25pemUgdGhvc2UgY2hhbmdlcy4KKworIyBUaGVyZSBhcmUgNSB0eXBlcyBvZiBsaW5lcyBoZXJlOgorCisjICcjJyBjb21tZW50cywgZGlzdGluZ3Vpc2hlZCBieSBoYXZpbmcgYSAnIycgYXMgdGhlIGZpcnN0IG5vbi1ibGFuayBjaGFyYWN0ZXIKKyMKKyMgTWFrZWZpbGUgb3B0aW9ucywgc3VjaCBhcyBDQz1nY2MsIGV0Yy4uLgorIworIyBSdWxlcywgZGlzdGluZ3Vpc2hlZCBieSBoYXZpbmcgIlJ1bGUiIGF0IHRoZSBmcm9udC4gVGhlc2UgYXJlIHVzZWQgdG8KKyMgY29udHJvbCBDb25maWd1cmUncyBiZWhhdmlvciBhcyBmYXIgYXMgaG93IHRvIGNyZWF0ZSBNYWtlZmlsZS4KKyMKKyMgTW9kdWxlIHNlbGVjdGlvbiBsaW5lcywgZGlzdGluZ3Vpc2hlZCBieSBoYXZpbmcgJ0FkZE1vZHVsZScgYXQgdGhlIGZyb250LgorIyBUaGVzZSBsaXN0IHRoZSBjb25maWd1cmVkIG1vZHVsZXMsIGluIHByaW9yaXR5IG9yZGVyIChoaWdoZXN0IHByaW9yaXR5CisjIGxhc3QpLiAgVGhleSdyZSBkb3duIGF0IHRoZSBib3R0b20uCisjCisjIE9wdGlvbmFsIG1vZHVsZSBzZWxlY3Rpb24gbGluZXMsIGRpc3Rpbmd1aXNoZWQgYnkgaGF2aW5nIGAlTW9kdWxlJworIyBhdCB0aGUgZnJvbnQuICBUaGVzZSBzcGVjaWZ5IGEgbW9kdWxlIHRoYXQgaXMgdG8gYmUgY29tcGlsZWQgaW4gKGJ1dAorIyBub3QgZW5hYmxlZCkuICBUaGUgQWRkTW9kdWxlIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBlbmFibGUgc3VjaCBhCisjIG1vZHVsZS4gIEJ5IGRlZmF1bHQgbm8gc3VjaCBtb2R1bGVzIGFyZSBkZWZpbmVkLgorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTWFrZWZpbGUgY29uZmlndXJhdGlvbgorIworIyBUaGVzZSBhcmUgYWRkZWQgdG8gdGhlIGdlbmVyYWwgZmxhZ3MgZGV0ZXJtaW5lZCBieSBDb25maWd1cmUuCisjIEVkaXQgdGhlc2UgdG8gd29yayBhcm91bmQgQ29uZmlndXJlIGlmIG5lZWRlZC4gVGhlIEVYVFJBXyogZmFtaWx5CisjIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHJlZ3VsYXIgTWFrZWZpbGUgZmxhZ3MuIEZvciBleGFtcGxlLCBpZiB5b3UKKyMgd2FudCB0byBjb21waWxlIHdpdGggLVdhbGwsIHRoZW4gYWRkIHRoYXQgdG8gRVhUUkFfQ0ZMQUdTLiBUaGVzZQorIyB3aWxsIGJlIGFkZGVkIHRvIHdoYXRldmVyIGZsYWdzIENvbmZpZ3VyZSBkZXRlcm1pbmVzIGFzIGFwcHJvcHJpYXRlCisjIGFuZCBuZWVkZWQgZm9yIHlvdXIgcGxhdGZvcm0uCisjCisjIFlvdSBjYW4gYWxzbyBzZXQgdGhlIGNvbXBpbGVyIChDQykgYW5kIG9wdGltaXphdGlvbiAoT1BUSU0pIHVzZWQgaGVyZSBhcworIyB3ZWxsLiAgU2V0dGluZ3MgaGVyZSBoYXZlIHByaW9yaXR5OyBJZiBub3Qgc2V0LCBDb25maWd1cmUgd2lsbCBhdHRlbXB0IHRvCisjIGd1ZXNzIHRoZSBDIGNvbXBpbGVyLCBsb29raW5nIGZvciBnY2MgZmlyc3QsIHRoZW4gY2MuCisjCisjIE9wdGltaXphdGlvbiBub3RlOiAKKyMgQmUgY2FyZWZ1bCB3aGVuIGFkZGluZyBvcHRpbWl6YXRpb24gZmxhZ3MgKGxpa2UgLU8zIG9yIC1PNikgb24gdGhlIE9QVElNCisjIGVudHJ5LCBlc3BlY2lhbGx5IHdoZW4gdXNpbmcgc29tZSBHQ0MgdmFyaWFudHMuIEV4cGVyaWVuY2Ugc2hvd2VkIHRoYXQgdXNpbmcKKyMgdGhlc2UgZm9yIGNvbXBpbGluZyBBcGFjaGUgaXMgcmlza3kuIElmIHlvdSBkb24ndCB3YW50IHRvIHNlZSBBcGFjaGUgZHVtcGluZworIyBjb3JlIHJlZ3VsYXJseSB0aGVuIGF0IG1vc3QgdXNlIC1PIG9yIC1PMi4KKyMKKyMgVGhlIEVYVFJBX0RFUFMgY2FuIGJlIHVzZWQgdG8gYWRkIGV4dHJhIE1ha2VmaWxlIGRlcGVuZGVuY2llcyB0byBleHRlcm5hbAorIyBmaWxlcyAoZm9yIGluc3RhbmNlIHRoaXJkLXBhcnR5IGxpYnJhcmllcykgZm9yIHRoZSBodHRwZCB0YXJnZXQuIFRoZSBlZmZlY3QKKyMgaXMgdGhhdCBodHRwZCBpcyByZWxpbmtlZCB3aGVuIHRob3NlIGZpbGVzIGFyZSBjaGFuZ2VkLgorIworRVhUUkFfQ0ZMQUdTPS1nCitFWFRSQV9MREZMQUdTPQorRVhUUkFfTElCUz0tbHB0aHJlYWQgLWxnKysgLWxkbAorRVhUUkFfSU5DTFVERVM9LUkvaG9tZS9hYmVyZ2VyL2FwYWNoZV9nc29hcC4wLjAuNQorRVhUUkFfREVQUz0KKworI0NDPQorI0NQUD0KKyNPUFRJTT0KKyNSQU5MSUI9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTmFtZSBvZiB0aGUgaW5zdGFsbGVkIEFwYWNoZSBIVFRQIHdlYnNlcnZlci4KKyMKKyNUQVJHRVQ9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgRHluYW1pYyBTaGFyZWQgT2JqZWN0IChEU08pIHN1cHBvcnQKKyMKKyMgVGhlcmUgaXMgZXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIGNvbXBpbGluZyB0aGUgQXBhY2hlIGNvcmUgYW5kCisjIHRoZSBBcGFjaGUgbW9kdWxlcyBpbnRvIGR5bmFtaWMgc2hhcmVkIG9iamVjdCAoRFNPKSBmaWxlcyBmb3IKKyMgbWF4aW11bSBydW50aW1lIGZsZXhpYmlsaXR5LgorIworIyBUaGUgQ29uZmlndXJlIHNjcmlwdCBjdXJyZW50bHkgaGFzIG9ubHkgbGltaXRlZCBidWlsdC1pbgorIyBrbm93bGVkZ2Ugb24gaG93IHRvIGNvbXBpbGUgdGhlc2UgRFNPIGZpbGVzIGJlY2F1c2UgdGhpcyBpcworIyBoZWF2aWx5IHBsYXRmb3JtLWRlcGVuZGVudC4gVGhlIGN1cnJlbnQgc3RhdGUgb2Ygc3VwcG9ydGVkIGFuZAorIyBleHBsaWNpdGx5IHVuc3VwcG9ydGVkIHBsYXRmb3JtcyBjYW4gYmUgZm91bmQgaW4gdGhlIGZpbGUgCisjICJodGRvY3MvbWFudWFsL2Rzby5odG1sIiwgdW5kZXIgIlN1cHBvcnRlZCBQbGF0Zm9ybXMiLgorIworIyBGb3Igb3RoZXIgcGxhdGZvcm1zIHdoZXJlIHlvdSB3YW50IHRvIHVzZSB0aGUgRFNPIG1lY2hhbmlzbSB5b3UKKyMgZmlyc3QgaGF2ZSB0byBtYWtlIHN1cmUgaXQgc3VwcG9ydHMgdGhlIHByYWdtYXRpYyBkbG9wZW4oKQorIyBzeXN0ZW0gY2FsbCBhbmQgdGhlbiB5b3UgaGF2ZSB0byBwcm92aWRlIHRoZSBhcHByb3ByaWF0ZQorIyBjb21waWxlciBhbmQgbGlua2VyIGZsYWdzIGJlbG93IHRvIGNyZWF0ZSB0aGUgRFNPIGZpbGVzIG9uIHlvdXIKKyMgcGFydGljdWxhciBwbGF0Zm9ybS4KKyMKKyMgVGhlIHBsYWNlbWVudCBvZiB0aGUgQXBhY2hlIGNvcmUgaW50byBhIERTTyBmaWxlIGlzIHRyaWdnZXJlZAorIyBieSB0aGUgU0hBUkVEX0NPUkUgcnVsZSBiZWxvdyB3aGlsZSBzdXBwb3J0IGZvciBidWlsZGluZworIyBpbmRpdmlkdWFsIEFwYWNoZSBNb2R1bGVzIGFzIERTTyBmaWxlcyBhbmQgbG9hZGluZyB0aGVtIHVuZGVyCisjIHJ1bnRpbWUgd2l0aG91dCByZWNvbXBpbGF0aW9uIGlzIHRyaWdnZXJlZCBieSBgU2hhcmVkTW9kdWxlJworIyBjb21tYW5kcy4gVG8gYmUgYWJsZSB0byB1c2UgdGhlIGxhdHRlciBvbmUgZmlyc3QgZW5hYmxlIHRoZQorIyBtb2R1bGUgbW9kX3NvIChzZWUgY29ycmVzcG9uZGluZyBgQWRkTW9kdWxlJyBjb21tYW5kIGJlbG93KS4KKyMgVGhlbiBlbmFibGUgdGhlIERTTyBmZWF0dXJlIGZvciBwYXJ0aWN1bGFyIG1vZHVsZXMgaW5kaXZpZHVhbGx5CisjIGJ5IHJlcGxhY2luZyB0aGVpciBgQWRkTW9kdWxlJyBjb21tYW5kIHdpdGggYFNoYXJlZE1vZHVsZScgYW5kCisjIGNoYW5nZSB0aGUgZmlsZW5hbWUgZXh0ZW5zaW9uIGZyb20gYC5vJyB0byBgLnNvJy4gCisjCisjIFNvbWV0aW1lcyB0aGUgRFNPIGZpbGVzIG5lZWQgdG8gYmUgbGlua2VkIGFnYWluc3Qgb3RoZXIgc2hhcmVkCisjIGxpYnJhcmllcyB0byBleHBsaWNpdGx5IHJlc29sdmUgc3ltYm9scyBmcm9tIHRoZW0gd2hlbiB0aGUKKyMgaHR0cGQgcHJvZ3JhbSBub3QgYWxyZWFkeSBjb250YWlucyByZWZlcmVuY2VzIHRvIHRoZW0uIEZvcgorIyBpbnN0YW5jZSB3aGVuIGJ1aWRsaW5nIG1vZF9hdXRoX2RiIGFzIGEgRFNPIHlvdSBuZWVkIHRvIGxpbmsKKyMgdGhlIERTTyBhZ2FpbnN0IHRoZSBsaWJkYiBleHBsaWNpdHkgYmVjYXVzZSB0aGUgQXBhY2hlIGtlcm5lbAorIyBoYXMgbm8gcmVmZXJlbmNlcyBmb3IgdGhpcyBsaWJyYXJ5LiBCdXQgdGhlIHByb2JsZW0gaXMgdGhhdAorIyB0aGlzICJjaGFpbmluZyIgaXMgbm90IHN1cHBvcnRlZCBvbiBhbGwgcGxhdGZvcm1zLiBBbHRob3VnaCBvbmUKKyMgdXN1YWxseSBjYW4gbGluayBhIERTTyBhZ2FpbnN0IGFub3RoZXIgRFNPIHdpdGhvdXQgbGlua2VyCisjIGNvbXBsYWlucyB0aGUgbGlua2FnZSBpcyBub3QgcmVhbGx5IGRvbmUgb24gdGhlc2UgcGxhdGZvcm1zLgorIyBTbywgd2hlbiB5b3UgcmVjZWl2ZSAidW5yZXNvbHZlZCBzeW1ib2wiIGVycm9ycyB1bmRlciBydW50aW1lCisjIHdoZW4gdXNpbmcgdGhlIExvYWRNb2R1bGUgZGlyZWN0aXZlIGZvciBhIHBhcnRpY3VsYXIgbW9kdWxlIHRyeQorIyB0byBlbmFibGUgdGhlIFNIQVJFRF9DSEFJTiBydWxlIGJlbG93LgorCisjQ0ZMQUdTX1NITElCPQorI0xEX1NITElCPQorI0xERkxBR1NfU0hMSUI9CisjTERGTEFHU19TSExJQl9FWFBPUlQ9CisKK1J1bGUgU0hBUkVEX0NPUkU9ZGVmYXVsdAorUnVsZSBTSEFSRURfQ0hBSU49ZGVmYXVsdAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFJ1bGVzIGNvbmZpZ3VyYXRpb24KKyMKKyMgVGhlc2UgYXJlIHVzZWQgdG8gbGV0IENvbmZpZ3VyZSBrbm93IHRoYXQgd2Ugd2FudCBjZXJ0YWluCisjIGZ1bmN0aW9ucy4gVGhlIGZvcm1hdCBpczogUnVsZSBSVUxFPXZhbHVlCisjCisjIEF0IHByZXNlbnQsIG9ubHkgdGhlIGZvbGxvd2luZyBSVUxFUyBhcmUga25vd246IFdBTlRIU1JFR0VYLCBTT0NLUzQsCisjIFNPQ0tTNSwgSVJJWE5JUywgSVJJWE4zMiwgUEFSQU5PSUQsIGFuZCBERVZfUkFORE9NLgorIworIyBGb3IgYWxsIFJ1bGVzIGV4Y2VwdCBERVZfUkFORE9NLCBpZiBzZXQgdG8gInllcyIsIHRoZW4gQ29uZmlndXJlIGtub3dzCisjIHdlIHdhbnQgdGhhdCBjYXBhYmlsaXR5IGFuZCBkb2VzIHdoYXQgaXMgcmVxdWlyZWQgdG8gYWRkIGl0IGluLiBJZiBzZXQKKyMgdG8gImRlZmF1bHQiIHRoZW4gQ29uZmlndXJlIG1ha2VzIGEgImJlc3QgZ3Vlc3MiOyBpZiBzZXQgdG8gYW55dGhpbmcKKyMgZWxzZSwgb3Igbm90IHByZXNlbnQsIHRoZW4gbm90aGluZyBpcyBkb25lLgorIworIyBTT0NLUzQ6CisjICBJZiBTT0NLUzQgaXMgc2V0IHRvICd5ZXMnLCBiZSBzdXJlIHRoYXQgeW91IGFkZCB0aGUgc29ja3MgbGlicmFyeQorIyAgbG9jYXRpb24gdG8gRVhUUkFfTElCUywgb3RoZXJ3aXNlIENvbmZpZ3VyZSB3aWxsIGFzc3VtZQorIyAgIi1ML3Vzci9sb2NhbC9saWIgLWxzb2NrcyIKKyMKKyMgU09DS1M1OgorIyAgSWYgU09DS1M1IGlzIHNldCB0byAneWVzJywgYmUgc3VyZSB0aGF0IHlvdSBhZGQgdGhlIHNvY2tzNSBsaWJyYXJ5CisjICBsb2NhdGlvbiB0byBFWFRSQV9MSUJTLCBvdGhlcndpc2UgQ29uZmlndXJlIHdpbGwgYXNzdW1lCisjICAiLUwvdXNyL2xvY2FsL2xpYiAtbHNvY2tzNSIKKyMKKyMgSVJJWE5JUzoKKyMgIE9ubHkgdGFrZXMgZWZmZWN0IGlmIENvbmZpZ3VyZSBkZXRlcm1pbmVzIHRoYXQgeW91IGFyZSBydW5uaW5nCisjICBTR0kgSVJJWC4gIElmIHlvdSBhcmUgdXNpbmcgYSAoYW5jaWVudCkgNC54IHZlcnNpb24gb2YgSVJJWCwgeW91CisjICBuZWVkIHRoaXMgaWYgeW91IGFyZSB1c2luZyBOSVMgYW5kIEFwYWNoZSBuZWVkcyBhY2Nlc3MgdG8gaXQgZm9yCisjICB0aGluZ3MgbGlrZSBtb2RfdXNlcmRpci4gIFRoaXMgaXMgbm90IHJlcXVpcmVkIG9uIDUueCBhbmQgbGF0ZXIKKyMgIGFuZCB5b3Ugc2hvdWxkIG5vdCBlbmFibGUgaXQgb24gc3VjaCBzeXN0ZW1zLgorIworIyBJUklYTjMyOgorIyAgSWYgeW91IGFyZSBydW5uaW5nIGEgdmVyc2lvbiBvZiBJUklYIGFuZCBDb25maWd1cmUgZGV0ZWN0cworIyAgbjMyIGxpYnJhcmllcywgaXQgd2lsbCB1c2UgdGhvc2UgaW5zdGVhZCBvZiB0aGUgbzMyIG9uZXMuCisjCisjIFBBUkFOT0lEOgorIyAgTmV3IHdpdGggdmVyc2lvbiAxLjMsIGR1cmluZyBDb25maWd1cmUgbW9kdWxlcyBjYW4gcnVuCisjICBwcmUtcHJvZ3JhbW1lZCBzaGVsbCBjb21tYW5kcyBpbiB0aGUgc2FtZSBlbnZpcm9ubWVudCB0aGF0CisjICBDb25maWd1cmUgcnVucyBpbi4gVGhpcyBhbGxvd3MgbW9kdWxlcyB0byBjb250cm9sIGhvdyBDb25maWd1cmUKKyMgIHdvcmtzLiBOb3JtYWxseSwgQ29uZmlndXJlIHdpbGwgc2ltcGx5IG5vdGUgdGhhdCBhIG1vZHVsZQorIyAgaXMgcGVyZm9ybWluZyB0aGlzIGZ1bmN0aW9uLiBJZiBQQVJBTk9JRCBpcyBzZXQgdG8geWVzLCBpdCB3aWxsCisjICBhY3R1YWxseSBwcmludC1vdXQgdGhlIGNvZGUgdGhhdCB0aGUgbW9kdWxlcyBleGVjdXRlCisjCisjIEVYUEFUOgorIyAgSW5jbHVkZSBhbiBFeHBhdCBpbXBsZW1lbnRhdGlvbiBpbnRvIEFwYWNoZSBmb3IgdXNlIGJ5IHRoZQorIyAgbW9kdWxlcy4gSmFtZXMgQ2xhcmsncyBFeHBhdCBwYWNrYWdlIChleHBhdC1saXRlKSBpcyBidW5kbGVkCisjICB3aXRoIEFwYWNoZSBmb3IgdGhlIGNvbnZlbmllbmNlIG9mIG91ciB1c2Vycy4gVGhlIEVYUEFUIHJ1bGUKKyMgIGRldGVybWluZXMgd2hpY2ggRXhwYXQgaW1wbGVtZW50YXRpb24sIGlmIGFueSwgdG8gdXNlIGFzIGZvbGxvd3M6CisjCisjICBSdWxlIEVYUEFUPXllcyAgICAgICA6IFVzZSBzeXN0ZW0gRXhwYXQgaWYgYXZhaWxhYmxlOyBvdGhlcndpc2UKKyMgICAgICAgICAgICAgICAgICAgICAgICAgdXNlIGJ1bmRsZWQgRXhwYXQgKGxpYi9leHBhdC1saXRlKS4gSWYKKyMgICAgICAgICAgICAgICAgICAgICAgICAgbmVpdGhlciBleGlzdHMgdGhlIGJ1aWxkIHdpbGwgZmFpbAorIyAgUnVsZSBFWFBBVD1ubyAgICAgICAgOiBEb24ndCBpbmNsdWRlIEV4cGF0IGF0IGFsbAorIyAgUnVsZSBFWFBBVD1kZWZhdWx0ICAgOiBJZiBFeHBhdCBjYW4gYmUgZm91bmQgYXQgdGhlIHN5c3RlbSBvcgorIyAgICAgICAgICAgICAgICAgICAgICAgICBpbiBsaWIvZXhwYXQtbGl0ZSwgdXNlIGl0OyBvdGhlcndpc2UKKyMgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCBpdAorIyAKKyMgQ1lHV0lOX1dJTlNPQ0s6IAorIyAgVXNlIFdpbjMyIEFQSSBzeXN0ZW0gY2FsbHMgZm9yIHNvY2tldCBjb21tdW5pY2F0aW9uIGluc3RlYWQgCisjICBvZiBDeWd3aW4ncyBQT1NJWC4xIHdyYXBwZXJzLiBUaGlzIGF2b2lkcyB0aGUgQ3lnd2luIHNwZWNpZmljCisjICBpbXBsZW1lbnRhdGlvbiBhbmQgdXNlcyB0aGUgV2luMzIgbmF0aXZlIGNhbGxzLiBTaG91bGQgYmUgZmFzdGVyCisjICBhbmQgbW9yZSByZWxpYWJsZSBmb3IgaGlnaC1sb2FkIHN5c3RlbXMuICAKKyMgCisKK1J1bGUgU09DS1M0PW5vCitSdWxlIFNPQ0tTNT1ubworUnVsZSBJUklYTklTPW5vCitSdWxlIElSSVhOMzI9eWVzCitSdWxlIFBBUkFOT0lEPW5vCitSdWxlIEVYUEFUPWRlZmF1bHQKK1J1bGUgQ1lHV0lOX1dJTlNPQ0s9bm8gCisKKyMgREVWX1JBTkRPTToKKyMgIE5vdGU6IHRoaXMgcnVsZSBpcyBvbmx5IHVzZWQgd2hlbiBjb21waWxpbmcgbW9kX2F1dGhfZGlnZXN0LgorIyAgbW9kX2F1dGhfZGlnZXN0IHJlcXVpcmVzIGEgY3J5cHRvZ3JhcGhpY2FsbHkgc3Ryb25nIHJhbmRvbSBzZWVkIGZvciBpdHMKKyMgIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLiBJdCBrbm93cyB0d28gd2F5cyBvZiBnZXR0aW5nIHRoaXM6IDEpIGZyb20KKyMgIGEgZmlsZSBvciBkZXZpY2UgKHN1Y2ggYXMgIi9kZXYvcmFuZG9tIiksIG9yIDIpIGZyb20gdGhlIHRydWVyYW5kCisjICBsaWJyYXJ5LiBJZiB0aGlzIHJ1bGUgaXMgc2V0IHRvICdkZWZhdWx0JyB0aGVuIENvbmZpZ3VyZSB3aWxsIGNob29zZQorIyAgdG8gdXNlIC9kZXYvcmFuZG9tIGlmIGl0IGV4aXN0cywgZWxzZSAvZGV2L3VyYW5kb20gaWYgaXQgZXhpc3RzLAorIyAgZWxzZSB0aGUgdHJ1ZXJhbmQgbGlicmFyeS4gVG8gb3ZlcnJpZGUgdGhpcyBiZWhhdmlvdXIgc2V0IERFVl9SQU5ET00KKyMgIGVpdGhlciB0byAndHJ1ZXJhbmQnICh0byB1c2UgdGhlIGxpYnJhcnkpIG9yIHRvIGEgZGV2aWNlIG9yIGZpbGUKKyMgIChlLmcuICcvZGV2L3VyYW5kb20nKS4gSWYgdGhlIHRydWVyYW5kIGxpYnJhcnkgaXMgc2VsZWN0ZWQsIENvbmZpZ3VyZQorIyAgd2lsbCBhc3N1bWUgIi1ML3Vzci9sb2NhbC9saWIgLWxyYW5kIi4KK1J1bGUgREVWX1JBTkRPTT1kZWZhdWx0CisKKyMgVGhlIGZvbGxvd2luZyBydWxlcyBzaG91bGQgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYnkgQ29uZmlndXJlLiBIb3dldmVyLCBpZgorIyB0aGV5IGFyZSBub3Qgc2V0IGJ5IENvbmZpZ3VyZSAoYmVjYXVzZSB3ZSBkb24ndCBrbm93IHRoZSBjb3JyZWN0IHZhbHVlIGZvcgorIyB5b3VyIHBsYXRmb3JtKSwgb3IgYXJlIHNldCBpbmNvcnJlY3RseSwgeW91IG1heSBvdmVycmlkZSB0aGVtIGhlcmUuCisjIElmIHlvdSBoYXZlIHRvIGRvIHRoaXMsIHBsZWFzZSBsZXQgdXMga25vdyB3aGF0IHlvdSBzZXQgYW5kIHdoYXQgeW91cgorIyBwbGF0Zm9ybSBpcywgYnkgZmlsbGluZyBvdXQgYSBwcm9ibGVtIHJlcG9ydCBmb3JtIGF0IHRoZSBBcGFjaGUgd2ViIHNpdGU6CisjIDxodHRwOi8vYnVncy5hcGFjaGUub3JnLz4uICBJZiB5b3VyIGJyb3dzZXIgaXMgZm9ybXMtaW5jYXBhYmxlLCB5b3UKKyMgY2FuIGdldCB0aGUgaW5mb3JtYXRpb24gdG8gdXMgYnkgc2VuZGluZyBtYWlsIHRvIGFwYWNoZS1idWdzQGFwYWNoZS5vcmcuCisjCisjIFdBTlRIU1JFR0VYOgorIyAgQXBhY2hlIHJlcXVpcmVzIGEgUE9TSVggcmVnZXggaW1wbGVtZW50YXRpb24uIEhlbnJ5IFNwZW5jZXIncworIyAgZXhjZWxsZW50IHJlZ2V4IHBhY2thZ2UgaXMgaW5jbHVkZWQgd2l0aCBBcGFjaGUgYW5kIGNhbiBiZSB1c2VkCisjICBpZiBkZXNpcmVkLiBJZiB5b3VyIE9TIGhhcyBhIGRlY2VudCByZWdleCwgeW91IGNhbiBlbGVjdCB0bworIyAgbm90IHVzZSB0aGlzIG9uZSBieSBzZXR0aW5nIFdBTlRIU1JFR0VYIHRvICdubycgb3IgY29tbWVudGluZworIyAgb3V0IHRoZSBSdWxlLiBUaGUgImRlZmF1bHQiIGFjdGlvbiBpcyAieWVzIiB1bmxlc3Mgb3ZlcnJ1bGVkCisjICBieSBPUyBzcGVjaWZpY3MKKworUnVsZSBXQU5USFNSRUdFWD1kZWZhdWx0CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTW9kdWxlIGNvbmZpZ3VyYXRpb24KKyMKKyMgTW9kdWxlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgcHJpb3JpdHkgb3JkZXIgLS0tIHRoZSBvbmVzIHRoYXQgY29tZQorIyBsYXRlciBjYW4gb3ZlcnJpZGUgdGhlIGJlaGF2aW9yIG9mIHRob3NlIHRoYXQgY29tZSBlYXJsaWVyLiAgVGhpcworIyBjYW4gaGF2ZSB2aXNpYmxlIGVmZmVjdHM7IGZvciBpbnN0YW5jZSwgaWYgVXNlckRpciBmb2xsb3dlZCBBbGlhcywKKyMgeW91IGNvdWxkbid0IGFsaWFzIG91dCBhIHBhcnRpY3VsYXIgdXNlcidzIGhvbWUgZGlyZWN0b3J5LgorCisjIFRoZSBjb25maWd1cmF0aW9uIGJlbG93IGlzIHdoYXQgd2UgY29uc2lkZXIgYSBkZWNlbnQgZGVmYXVsdCAKKyMgY29uZmlndXJhdGlvbi4gIElmIHlvdSB3YW50IHRoZSBmdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5IGEgcGFydGljdWxhcgorIyBtb2R1bGUsIHJlbW92ZSB0aGUgIiMiIHNpZ24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZS4gQnV0IHJlbWVtYmVyLCAKKyMgdGhlIG1vcmUgbW9kdWxlcyB5b3UgY29tcGlsZSBpbnRvIHRoZSBzZXJ2ZXIsIHRoZSBsYXJnZXIgdGhlIGV4ZWN1dGFibGUKKyMgaXMgYW5kIHRoZSBtb3JlIG1lbW9yeSBpdCB3aWxsIHRha2UsIHNvIGlmIHlvdSBhcmUgdW5saWtlbHkgdG8gdXNlIHRoZQorIyBmdW5jdGlvbmFsaXR5IG9mIGEgcGFydGljdWxhciBtb2R1bGUgeW91IG1pZ2h0IHdpc2ggdG8gbGVhdmUgaXQgb3V0LgorCisjIyBtb2RfbW1hcF9zdGF0aWMgaXMgYW4gZXhwZXJpbWVudGFsIG1vZHVsZSwgeW91IGFsbW9zdCBjZXJ0YWlubHkKKyMjIGRvbid0IG5lZWQgaXQuICBJdCBjYW4gbWFrZSBzb21lIHdlYnNlcnZlcnMgZmFzdGVyLiAgTm8gZnVydGhlcgorIyMgZG9jdW1lbnRhdGlvbiBpcyBwcm92aWRlZCBoZXJlIGJlY2F1c2UgeW91J2QgYmUgZm9vbGlzaAorIyMgdG8gdXNlIG1vZF9tbWFwX3N0YXRpYyB3aXRob3V0IHJlYWRpbmcgdGhlIGZ1bGwgZG9jdW1lbnRhdGlvbi4KKworIyBBZGRNb2R1bGUgbW9kdWxlcy9leHBlcmltZW50YWwvbW9kX21tYXBfc3RhdGljLm8KKworIyMgbW9kX3Zob3N0X2FsaWFzIHByb3ZpZGVzIHN1cHBvcnQgZm9yIG1hc3MgdmlydHVhbCBob3N0aW5nCisjIyBieSBkeW5hbWljYWxseSBjaGFuZ2luZyB0aGUgZG9jdW1lbnQgcm9vdCBhbmQgQ0dJIGRpcmVjdG9yeQorIyMgYmFzZWQgb24gdGhlIGhvc3QgaGVhZGVyIG9yIGxvY2FsIElQIGFkZHJlc3Mgb2YgdGhlIHJlcXVlc3QuCisjIyBTZWUgIi4uL2h0ZG9jcy9tYW51YWwvdmhvc3RzL21hc3MuaHRtbCIuCisKKyMgQWRkTW9kdWxlIG1vZHVsZXMvc3RhbmRhcmQvbW9kX3Zob3N0X2FsaWFzLm8KKworIyMKKyMjIENvbmZpZyBtYW5pcHVsYXRpb24gbW9kdWxlcworIyMKKyMjIG1vZF9lbnYgc2V0cyB1cCBhZGRpdGlvbmFsIG9yIHJlc3RyaWN0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGJlCisjIyBwYXNzZWQgdG8gQ0dJL1NTSSBzY3JpcHRzLiAgSXQgaXMgbGlzdGVkIGZpcnN0IChsb3dlc3QgcHJpb3JpdHkpIHNpbmNlCisjIyBpdCBkb2VzIG5vdCBkbyBwZXItcmVxdWVzdCBzdHVmZi4KKworQWRkTW9kdWxlIG1vZHVsZXMvc3RhbmRhcmQvbW9kX2Vudi5vCisKKyMjCisjIyBSZXF1ZXN0IGxvZ2dpbmcgbW9kdWxlcworIyMKKworQWRkTW9kdWxlIG1vZHVsZXMvc3RhbmRhcmQvbW9kX2xvZ19jb25maWcubworCisjIyBPcHRpb25hbCBtb2R1bGVzIGZvciBOQ1NBIHVzZXItYWdlbnQvcmVmZXJlciBsb2dnaW5nIGNvbXBhdGliaWxpdHkKKyMjIFdlIHJlY29tbWVuZCwgaG93ZXZlciwgdGhhdCB5b3UganVzdCB1c2UgdGhlIGNvbmZpZ3VyYWJsZSBhY2Nlc3NfbG9nLgorCisjIEFkZE1vZHVsZSBtb2R1bGVzL3N0YW5kYXJkL21vZF9sb2dfYWdlbnQubworIyBBZGRNb2R1bGUgbW9kdWxlcy9zdGFuZGFyZC9tb2RfbG9nX3JlZmVyZXIubworCisjIworIyMgVHlwZSBjaGVja2luZyBtb2R1bGVzCisjIworIyMgbW9kX21pbWVfbWFnaWMgZGV0ZXJtaW5lcyB0aGUgdHlwZSBvZiBhIGZpbGUgYnkgZXhhbWluaW5nIGEgZmV3IGJ5dGVzCisjIyBvZiBpdCBhbmQgdGVzdGluZyBhZ2FpbnN0IGEgZGF0YWJhc2Ugb2YgZmlsZXR5cGUgc2lnbmF0dXJlcy4gIEl0IGlzCisjIyBiYXNlZCBvbiB0aGUgdW5peCBmaWxlKDEpIGNvbW1hbmQuCisjIyBtb2RfbWltZSBtYXBzIGZpbGVuYW1lIGV4dGVuc2lvbnMgdG8gY29udGVudCB0eXBlcywgZW5jb2RpbmdzLCBhbmQKKyMjICJtYWdpYyIgdHlwZSBoYW5kbGVycyAodGhlIGxhdHRlciBpcyBvYnNvbGV0ZWQgYnkgbW9kX2FjdGlvbnMsIGFuZAorIyMgZG9uJ3QgY29uZnVzZSBpdCB3aXRoIHRoZSBwcmV2aW91cyBtb2R1bGUpLgorIyMgbW9kX25lZ290aWF0aW9uIGFsbG93cyBjb250ZW50IHNlbGVjdGlvbiBiYXNlZCBvbiB0aGUgQWNjZXB0KiBoZWFkZXJzLgorCisjIEFkZE1vZHVsZSBtb2R1bGVzL3N0YW5kYXJkL21vZF9taW1lX21hZ2ljLm8KK0FkZE1vZHVsZSBtb2R1bGVzL3N0YW5kYXJkL21vZF9taW1lLm8KK0FkZE1vZHVsZSBtb2R1bGVzL3N0YW5kYXJkL21vZF9uZWdvdGlhdGlvbi5vCisKKyMjCisjIyBDb250ZW50IGRlbGl2ZXJ5IG1vZHVsZXMKKyMjCisjIyBUaGUgc3RhdHVzIG1vZHVsZSBhbGxvd3MgdGhlIHNlcnZlciB0byBkaXNwbGF5IGN1cnJlbnQgZGV0YWlscyBhYm91dCAKKyMjIGhvdyB3ZWxsIGl0IGlzIHBlcmZvcm1pbmcgYW5kIHdoYXQgaXQgaXMgZG9pbmcuICBDb25zaWRlciBhbHNvIGVuYWJsaW5nIAorIyMgdGhlICdFeHRlbmRlZFN0YXR1cyBPbicgZGlyZWN0aXZlIHRvIGFsbG93IGZ1bGwgc3RhdHVzIGluZm9ybWF0aW9uLgorIyMgUGxlYXNlIG5vdGUgdGhhdCBkb2luZyBzbyBjYW4gcmVzdWx0IGluIGEgcGFscGFibGUgcGVyZm9ybWFuY2UgaGl0LgorCitBZGRNb2R1bGUgbW9kdWxlcy9zdGFuZGFyZC9tb2Rfc3RhdHVzLm8KKworIyMgVGhlIEluZm8gbW9kdWxlIGRpc3BsYXlzIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzZXJ2ZXIgYW5kIAorIyMgYWxsIGluY2x1ZGVkIG1vZHVsZXMuIEl0J3MgdmVyeSB1c2VmdWwgZm9yIGRlYnVnZ2luZy4KKworIyBBZGRNb2R1bGUgbW9kdWxlcy9zdGFuZGFyZC9tb2RfaW5mby5vCisKKyMjIG1vZF9pbmNsdWRlIHRyYW5zbGF0ZXMgc2VydmVyLXNpZGUgaW5jbHVkZSAoU1NJKSBzdGF0ZW1lbnRzIGluIHRleHQgZmlsZXMuCisjIyBtb2RfYXV0b2luZGV4IGhhbmRsZXMgcmVxdWVzdHMgZm9yIGRpcmVjdG9yaWVzIHdoaWNoIGhhdmUgbm8gaW5kZXggZmlsZQorIyMgbW9kX2RpciBoYW5kbGVzIHJlcXVlc3RzIG9uIGRpcmVjdG9yaWVzIGFuZCBkaXJlY3RvcnkgaW5kZXggZmlsZXMuCisjIyBtb2RfY2dpIGhhbmRsZXMgQ0dJIHNjcmlwdHMuCisKK0FkZE1vZHVsZSBtb2R1bGVzL3N0YW5kYXJkL21vZF9pbmNsdWRlLm8KK0FkZE1vZHVsZSBtb2R1bGVzL3N0YW5kYXJkL21vZF9hdXRvaW5kZXgubworQWRkTW9kdWxlIG1vZHVsZXMvc3RhbmRhcmQvbW9kX2Rpci5vCitBZGRNb2R1bGUgbW9kdWxlcy9zdGFuZGFyZC9tb2RfY2dpLm8KKworIyMgVGhlIGFzaXMgbW9kdWxlIGltcGxlbWVudHMgIi5hc2lzIiBmaWxlIHR5cGVzLCB3aGljaCBhbGxvdyB0aGUgZW1iZWRkaW5nCisjIyBvZiBIVFRQIGhlYWRlcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZG9jdW1lbnQuICBtb2RfaW1hcCBoYW5kbGVzIGludGVybmFsIAorIyMgaW1hZ2VtYXBzIChubyBtb3JlIGNnaS1iaW4vaW1hZ2VtYXAvISkuICBtb2RfYWN0aW9ucyBpcyB1c2VkIHRvIHNwZWNpZnkgCisjIyBDR0kgc2NyaXB0cyB3aGljaCBhY3QgYXMgImhhbmRsZXJzIiBmb3IgcGFydGljdWxhciBmaWxlcywgZm9yIGV4YW1wbGUgdG8KKyMjIGF1dG9tYXRpY2FsbHkgY29udmVydCBldmVyeSBHSUYgdG8gYW5vdGhlciBmaWxlIHR5cGUuCisKK0FkZE1vZHVsZSBtb2R1bGVzL3N0YW5kYXJkL21vZF9hc2lzLm8KK0FkZE1vZHVsZSBtb2R1bGVzL3N0YW5kYXJkL21vZF9pbWFwLm8KK0FkZE1vZHVsZSBtb2R1bGVzL3N0YW5kYXJkL21vZF9hY3Rpb25zLm8KKworIyMKKyMjIFVSTCB0cmFuc2xhdGlvbiBtb2R1bGVzLgorIyMKKworIyMgVGhlIFNwZWxpbmcgbW9kdWxlIGF0dGVtcHRzIHRvIGNvcnJlY3QgbWlzc3BlbGxpbmdzIG9mIFVSTHMgdGhhdAorIyMgdXNlcnMgbWlnaHQgaGF2ZSBlbnRlcmVkLCBuYW1lbHkgYnkgY2hlY2tpbmcgY2FwaXRhbGl6YXRpb25zCisjIyBvciBieSBhbGxvd2luZyB1cCB0byBvbmUgbWlzc3BlbGxpbmcgKGNoYXJhY3RlciBpbnNlcnRpb24gLyBvbWlzc2lvbiAvCisjIyB0cmFuc3Bvc2l0aW9uL3R5cG8pLiBUaGlzIGNhdGNoZXMgdGhlIG1ham9yaXR5IG9mIG1pc3NwZWxsZWQgcmVxdWVzdHMuCisjIyBJZiBpdCBmaW5kcyBhIG1hdGNoLCBhICJzcGVsbGluZyBjb3JyZWN0ZWQiIHJlZGlyZWN0aW9uIGlzIHJldHVybmVkLgorCisjIEFkZE1vZHVsZSBtb2R1bGVzL3N0YW5kYXJkL21vZF9zcGVsaW5nLm8KKworIyMgVGhlIFVzZXJEaXIgbW9kdWxlIGZvciBzZWxlY3RpbmcgcmVzb3VyY2UgZGlyZWN0b3JpZXMgYnkgdXNlciBuYW1lCisjIyBhbmQgYSBjb21tb24gcHJlZml4LCBlLmcuLCAvfjx1c2VyPiAsIC91c3Ivd2ViLzx1c2VyPiAsIGV0Yy4KKworQWRkTW9kdWxlIG1vZHVsZXMvc3RhbmRhcmQvbW9kX3VzZXJkaXIubworCisjIyBUaGUgQWxpYXMgbW9kdWxlIHByb3ZpZGVzIHNpbXBsZSBVUkwgdHJhbnNsYXRpb24gYW5kIHJlZGlyZWN0aW9uLgorCitBZGRNb2R1bGUgbW9kdWxlcy9zdGFuZGFyZC9tb2RfYWxpYXMubworCisjIyBUaGUgVVJMIHJld3JpdGluZyBtb2R1bGUgYWxsb3dzIGZvciBwb3dlcmZ1bCBVUkktdG8tVVJJIGFuZCAKKyMjIFVSSS10by1maWxlbmFtZSBtYXBwaW5nIHVzaW5nIGEgcmVndWxhciBleHByZXNzaW9uIGJhc2VkIAorIyMgcnVsZS1jb250cm9sbGVkIHJld3JpdGluZyBlbmdpbmUuCisKKyMgQWRkTW9kdWxlIG1vZHVsZXMvc3RhbmRhcmQvbW9kX3Jld3JpdGUubworCisjIworIyMgQWNjZXNzIGNvbnRyb2wgYW5kIGF1dGhlbnRpY2F0aW9uIG1vZHVsZXMuIAorIyMKK0FkZE1vZHVsZSBtb2R1bGVzL3N0YW5kYXJkL21vZF9hY2Nlc3MubworQWRkTW9kdWxlIG1vZHVsZXMvc3RhbmRhcmQvbW9kX2F1dGgubworCisjIyBUaGUgYW5vbl9hdXRoIG1vZHVsZSBhbGxvd3MgZm9yIGFub255bW91cy1GVFAtc3R5bGUgdXNlcm5hbWUvIAorIyMgcGFzc3dvcmQgYXV0aGVudGljYXRpb24uCisKKyMgQWRkTW9kdWxlIG1vZHVsZXMvc3RhbmRhcmQvbW9kX2F1dGhfYW5vbi5vCisKKyMjIGRiX2F1dGggYW5kIGRibV9hdXRoIHdvcmsgd2l0aCBCZXJrZWxleSBEQiBmaWxlcyAtIG1ha2Ugc3VyZSB0aGVyZQorIyMgaXMgc3VwcG9ydCBmb3IgREJNIGZpbGVzIG9uIHlvdXIgc3lzdGVtLiAgWW91IG1heSBuZWVkIHRvIGdyYWIgdGhlIEdOVQorIyMgImdkYm0iIHBhY2thZ2UgaWYgbm90IGFuZCBwb3NzaWJseSBhZGp1c3QgRVhUUkFfTElCUy4gKFRoaXMgbWF5IGJlCisjIyBkb25lIGJ5IENvbmZpZ3VyZSBhdCBhIGxhdGVyIGRhdGUpCisKKyMgQWRkTW9kdWxlIG1vZHVsZXMvc3RhbmRhcmQvbW9kX2F1dGhfZGJtLm8KKyMgQWRkTW9kdWxlIG1vZHVsZXMvc3RhbmRhcmQvbW9kX2F1dGhfZGIubworCisjIyAiZGlnZXN0IiBpbXBsZW1lbnRzIEhUVFAgRGlnZXN0IEF1dGhlbnRpY2F0aW9uIHJhdGhlciB0aGFuIHRoZSBsZXNzIAorIyMgc2VjdXJlIEJhc2ljIEF1dGggdXNlZCBieSB0aGUgb3RoZXIgbW9kdWxlcy4gIFRoaXMgaXMgdGhlIG9sZCB2ZXJzaW9uLgorCisjIEFkZE1vZHVsZSBtb2R1bGVzL3N0YW5kYXJkL21vZF9kaWdlc3QubworCisjIyAiYXV0aF9kaWdlc3QiIGltcGxlbWVudHMgSFRUUC8xLjEgRGlnZXN0IEF1dGhlbnRpY2F0aW9uIChSRkMgMjYxNykKKyMjIHJhdGhlciB0aGFuIHRoZSBsZXNzIHNlY3VyZSBCYXNpYyBBdXRoIHVzZWQgYnkgdGhlIG90aGVyIG1vZHVsZXMuCisjIyBUaGlzIGlzIGFuIHVwZGF0ZWQgdmVyc2lvbiBvZiBtb2RfZGlnZXN0LCBidXQgaXQgaXMgbm90IGFzIHdlbGwgdGVzdGVkCisjIyBhbmQgaXMgdGhlcmVmb3JlIG1hcmtlZCBleHBlcmltZW50YWwuICBVc2UgZWl0aGVyIHRoZSBvbmUgYWJvdmUsIG9yCisjIyB0aGlzIG9uZSBiZWxvdywgYnV0IG5vdCBib3RoIGRpZ2VzdCBtb2R1bGVzLgorIyMgTm90ZTogaWYgeW91IGFkZCB0aGlzIG1vZHVsZSBpbiB0aGVuIHlvdSBtaWdodCBhbHNvIG5lZWQgdGhlCisjIyB0cnVlcmFuZCBsaWJyYXJ5IChhdmFpbGFibGUgZm9yIGV4YW1wbGUgZnJvbQorIyMgZnRwOi8vcmVzZWFyY2guYXR0LmNvbS9kaXN0L21hYi9saWJyYW5kLnNoYXIpIC0gc2VlIHRoZSBSdWxlCisjIyBERVZfUkFORE9NIGFib3ZlIGZvciBtb3JlIGluZm8uCisjIworIyMgTXVzdCBiZSBhZGRlZCBhYm92ZSAocnVuIGxhdGVyIHRoYW4pIHRoZSBwcm94eSBtb2R1bGUgYmVjYXVzZSB0aGUKKyMjIFdXVy1BdXRoZW50aWNhdGUgYW5kIFByb3h5LUF1dGhlbnRpY2F0ZSBoZWFkZXJzIGFyZSBwYXJzZWQgaW4gdGhlCisjIyBwb3N0LXJlYWQtcmVxdWVzdCBwaGFzZSBhbmQgaXQgbmVlZHMgdG8ga25vdyBpZiB0aGlzIGlzIGEgcHJveHkgcmVxdWVzdC4KKyMgQWRkTW9kdWxlIG1vZHVsZXMvZXhwZXJpbWVudGFsL21vZF9hdXRoX2RpZ2VzdC5vCisKKyMjIE9wdGlvbmFsIFByb3h5CisjIworIyMgVGhlIHByb3h5IG1vZHVsZSBlbmFibGVzIHRoZSBzZXJ2ZXIgdG8gYWN0IGFzIGEgcHJveHkgZm9yIG91dHNpZGUKKyMjIGh0dHAgYW5kIGZ0cCBzZXJ2aWNlcy4gSXQncyBub3QgYXMgY29tcGxldGUgYXMgaXQgY291bGQgYmUgeWV0LgorIyMgTk9URTogWW91IGRvIG5vdCB3YW50IHRoaXMgbW9kdWxlIFVOTEVTUyB5b3UgYXJlIHJ1bm5pbmcgYSBwcm94eTsKKyMjICAgICAgIGl0IGlzIG5vdCBuZWVkZWQgZm9yIG5vcm1hbCAob3JpZ2luIHNlcnZlcikgb3BlcmF0aW9uLgorCisjIEFkZE1vZHVsZSBtb2R1bGVzL3Byb3h5L2xpYnByb3h5LmEKKworIyMgT3B0aW9uYWwgcmVzcG9uc2UgaGVhZGVyIG1hbmlwdWxhdGlvbiBtb2R1bGVzLiAKKyMjCisjIyBjZXJuX21ldGEgbWltaWNzIHRoZSBiZWhhdmlvciBvZiB0aGUgQ0VSTiB3ZWIgc2VydmVyIHdpdGggcmVnYXJkcyB0byAKKyMjIG1ldGFpbmZvcm1hdGlvbiBmaWxlcy4gIAorCisjIEFkZE1vZHVsZSBtb2R1bGVzL3N0YW5kYXJkL21vZF9jZXJuX21ldGEubworCisjIyBUaGUgZXhwaXJlcyBtb2R1bGUgY2FuIGFwcGx5IEV4cGlyZXM6IGhlYWRlcnMgdG8gcmVzb3VyY2VzLAorIyMgYXMgYSBmdW5jdGlvbiBvZiBhY2Nlc3MgdGltZSBvciBtb2RpZmljYXRpb24gdGltZS4KKworIyBBZGRNb2R1bGUgbW9kdWxlcy9zdGFuZGFyZC9tb2RfZXhwaXJlcy5vCisKKyMjIFRoZSBoZWFkZXJzIG1vZHVsZSBjYW4gc2V0IGFyYml0cmFyeSBIVFRQIHJlc3BvbnNlIGhlYWRlcnMsCisjIyBhcyBjb25maWd1cmVkIGluIHNlcnZlciwgdmhvc3QsIGFjY2Vzcy5jb25mIG9yIC5odGFjY2VzcyBjb25maWdzCisKKyMgQWRkTW9kdWxlIG1vZHVsZXMvc3RhbmRhcmQvbW9kX2hlYWRlcnMubworCisjIyBNaXNjZWxsYW5lb3VzIG1vZHVsZXMKKyMjCisjIyBtb2RfdXNlcnRyYWNrIGlzIHRoZSBuZXcgbmFtZSBmb3IgbW9kX2Nvb2tpZXMuICBUaGlzIG1vZHVsZQorIyMgdXNlcyBOZXRzY2FwZSBjb29raWVzIHRvIGF1dG9tYXRpY2FsbHkgY29uc3RydWN0IGFuZCBsb2cKKyMjIGNsaWNrLXRyYWlscyBmcm9tIE5ldHNjYXBlIGNvb2tpZXMsIG9yIGNvbXBhdGlibGUgY2xpZW50cyB3aG8KKyMjIGFyZW4ndCBjb21pbmcgaW4gdmlhIHByb3h5LiAgIAorIyMKKyMjIFlvdSBkbyBub3QgbmVlZCB0aGlzLCBvciBhbnkgb3RoZXIgbW9kdWxlIHRvIGFsbG93IHlvdXIgc2l0ZQorIyMgdG8gdXNlIENvb2tpZXMuICBUaGlzIG1vZHVsZSBpcyBmb3IgdXNlciB0cmFja2luZyBvbmx5CisKKyMgQWRkTW9kdWxlIG1vZHVsZXMvc3RhbmRhcmQvbW9kX3VzZXJ0cmFjay5vCisKKyMjIFRoZSBleGFtcGxlIG1vZHVsZSwgd2hpY2ggZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgdGhlIEFQSS4gIFNlZQorIyMgdGhlIGZpbGUgbW9kdWxlcy9leGFtcGxlL1JFQURNRSBmb3IgZGV0YWlscy4gIFRoaXMgbW9kdWxlIHNob3VsZAorIyMgb25seSBiZSB1c2VkIGZvciB0ZXN0aW5nIC0tIERPIE5PVCBFTkFCTEUgSVQgb24gYSBwcm9kdWN0aW9uIHNlcnZlci4KKworIyBBZGRNb2R1bGUgbW9kdWxlcy9leGFtcGxlL21vZF9leGFtcGxlLm8KKworIyMgbW9kX3VuaXF1ZV9pZCBnZW5lcmF0ZXMgdW5pcXVlIGlkZW50aWZpZXJzIGZvciBlYWNoIGhpdCwgd2hpY2ggYXJlCisjIyBhdmFpbGFibGUgaW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFVOSVFVRV9JRC4gIEl0IG1heSBub3Qgd29yayBvbiBhbGwKKyMjIHN5c3RlbXMsIGhlbmNlIGl0IGlzIG5vdCBpbmNsdWRlZCBieSBkZWZhdWx0LgorCisjIEFkZE1vZHVsZSBtb2R1bGVzL3N0YW5kYXJkL21vZF91bmlxdWVfaWQubworCisjIyBtb2Rfc28gbGV0cyB5b3UgYWRkIG1vZHVsZXMgdG8gQXBhY2hlIHdpdGhvdXQgcmVjb21waWxpbmcuCisjIyBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGF0IHRoaXMgc3RhZ2UgYW5kIG9ubHkgc3VwcG9ydGVkIAorIyMgb24gYSBzdWJzZXQgb2YgdGhlIHBsYXRmb3JtcyB3ZSBnZW5lcmFsbHkgc3VwcG9ydC4gCisjIyBEb24ndCBjaGFuZ2UgdGhpcyBlbnRyeSB0byBhICdTaGFyZWRNb2R1bGUnIHZhcmlhbnQgKEJvb3RzdHJhcHBpbmchKQorCisjIEFkZE1vZHVsZSBtb2R1bGVzL3N0YW5kYXJkL21vZF9zby5vCisKKyMjIG1vZF9zZXRlbnZpZiBsZXRzIHlvdSBzZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGJhc2VkIG9uIHRoZSBIVFRQIGhlYWRlcgorIyMgZmllbGRzIGluIHRoZSByZXF1ZXN0OyB0aGlzIGlzIHVzZWZ1bCBmb3IgY29uZGl0aW9uYWwgSFRNTCwgZm9yIGV4YW1wbGUuCisjIyBTaW5jZSBpdCBpcyBhbHNvIHVzZWQgdG8gZGV0ZWN0IGJ1Z2d5IGJyb3dzZXJzIGZvciB3b3JrYXJvdW5kcywgaXQKKyMjIHNob3VsZCBiZSB0aGUgbGFzdCAoaGlnaGVzdCBwcmlvcml0eSkgbW9kdWxlLgorCitBZGRNb2R1bGUgbW9kdWxlcy9tb2RfZ3NvYXAvbW9kX2dzb2FwLm8KKworQWRkTW9kdWxlIG1vZHVsZXMvc3RhbmRhcmQvbW9kX3NldGVudmlmLm8KKwpkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL21vZF9nc29hcC9jb25maWcvaHR0cGQuY29uZiBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9tb2RfZ3NvYXAvY29uZmlnL2h0dHBkLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkwZjYwZAotLS0gL2Rldi9udWxsCisrKyBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9tb2RfZ3NvYXAvY29uZmlnL2h0dHBkLmNvbmYKQEAgLTAsMCArMSwxMjQyIEBACisjIworIyMgaHR0cGQuY29uZiAtLSBBcGFjaGUgSFRUUCBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmaWxlCisjIworCisjCisjIEJhc2VkIHVwb24gdGhlIE5DU0Egc2VydmVyIGNvbmZpZ3VyYXRpb24gZmlsZXMgb3JpZ2luYWxseSBieSBSb2IgTWNDb29sLgorIworIyBUaGlzIGlzIHRoZSBtYWluIEFwYWNoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmaWxlLiAgSXQgY29udGFpbnMgdGhlCisjIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcyB0aGF0IGdpdmUgdGhlIHNlcnZlciBpdHMgaW5zdHJ1Y3Rpb25zLgorIyBTZWUgPFVSTDpodHRwOi8vd3d3LmFwYWNoZS5vcmcvZG9jcy8+IGZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dAorIyB0aGUgZGlyZWN0aXZlcy4KKyMKKyMgRG8gTk9UIHNpbXBseSByZWFkIHRoZSBpbnN0cnVjdGlvbnMgaW4gaGVyZSB3aXRob3V0IHVuZGVyc3RhbmRpbmcKKyMgd2hhdCB0aGV5IGRvLiAgVGhleSdyZSBoZXJlIG9ubHkgYXMgaGludHMgb3IgcmVtaW5kZXJzLiAgSWYgeW91IGFyZSB1bnN1cmUKKyMgY29uc3VsdCB0aGUgb25saW5lIGRvY3MuIFlvdSBoYXZlIGJlZW4gd2FybmVkLiAgCisjCisjIEFmdGVyIHRoaXMgZmlsZSBpcyBwcm9jZXNzZWQsIHRoZSBzZXJ2ZXIgd2lsbCBsb29rIGZvciBhbmQgcHJvY2VzcworIyAvdXNyL2xvY2FsL2FwYWNoZS9jb25mL3NybS5jb25mIGFuZCB0aGVuIC91c3IvbG9jYWwvYXBhY2hlL2NvbmYvYWNjZXNzLmNvbmYKKyMgdW5sZXNzIHlvdSBoYXZlIG92ZXJyaWRkZW4gdGhlc2Ugd2l0aCBSZXNvdXJjZUNvbmZpZyBhbmQvb3IKKyMgQWNjZXNzQ29uZmlnIGRpcmVjdGl2ZXMgaGVyZS4KKyMKKyMgVGhlIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcyBhcmUgZ3JvdXBlZCBpbnRvIHRocmVlIGJhc2ljIHNlY3Rpb25zOgorIyAgMS4gRGlyZWN0aXZlcyB0aGF0IGNvbnRyb2wgdGhlIG9wZXJhdGlvbiBvZiB0aGUgQXBhY2hlIHNlcnZlciBwcm9jZXNzIGFzIGEKKyMgICAgIHdob2xlICh0aGUgJ2dsb2JhbCBlbnZpcm9ubWVudCcpLgorIyAgMi4gRGlyZWN0aXZlcyB0aGF0IGRlZmluZSB0aGUgcGFyYW1ldGVycyBvZiB0aGUgJ21haW4nIG9yICdkZWZhdWx0JyBzZXJ2ZXIsCisjICAgICB3aGljaCByZXNwb25kcyB0byByZXF1ZXN0cyB0aGF0IGFyZW4ndCBoYW5kbGVkIGJ5IGEgdmlydHVhbCBob3N0LgorIyAgICAgVGhlc2UgZGlyZWN0aXZlcyBhbHNvIHByb3ZpZGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSBzZXR0aW5ncworIyAgICAgb2YgYWxsIHZpcnR1YWwgaG9zdHMuCisjICAzLiBTZXR0aW5ncyBmb3IgdmlydHVhbCBob3N0cywgd2hpY2ggYWxsb3cgV2ViIHJlcXVlc3RzIHRvIGJlIHNlbnQgdG8KKyMgICAgIGRpZmZlcmVudCBJUCBhZGRyZXNzZXMgb3IgaG9zdG5hbWVzIGFuZCBoYXZlIHRoZW0gaGFuZGxlZCBieSB0aGUKKyMgICAgIHNhbWUgQXBhY2hlIHNlcnZlciBwcm9jZXNzLgorIworIyBDb25maWd1cmF0aW9uIGFuZCBsb2dmaWxlIG5hbWVzOiBJZiB0aGUgZmlsZW5hbWVzIHlvdSBzcGVjaWZ5IGZvciBtYW55CisjIG9mIHRoZSBzZXJ2ZXIncyBjb250cm9sIGZpbGVzIGJlZ2luIHdpdGggIi8iIChvciAiZHJpdmU6LyIgZm9yIFdpbjMyKSwgdGhlCisjIHNlcnZlciB3aWxsIHVzZSB0aGF0IGV4cGxpY2l0IHBhdGguICBJZiB0aGUgZmlsZW5hbWVzIGRvICpub3QqIGJlZ2luCisjIHdpdGggIi8iLCB0aGUgdmFsdWUgb2YgU2VydmVyUm9vdCBpcyBwcmVwZW5kZWQgLS0gc28gImxvZ3MvZm9vLmxvZyIKKyMgd2l0aCBTZXJ2ZXJSb290IHNldCB0byAiL3Vzci9sb2NhbC9hcGFjaGUiIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYnkgdGhlCisjIHNlcnZlciBhcyAiL3Vzci9sb2NhbC9hcGFjaGUvbG9ncy9mb28ubG9nIi4KKyMKKworIyMjIFNlY3Rpb24gMTogR2xvYmFsIEVudmlyb25tZW50CisjCisjIFRoZSBkaXJlY3RpdmVzIGluIHRoaXMgc2VjdGlvbiBhZmZlY3QgdGhlIG92ZXJhbGwgb3BlcmF0aW9uIG9mIEFwYWNoZSwKKyMgc3VjaCBhcyB0aGUgbnVtYmVyIG9mIGNvbmN1cnJlbnQgcmVxdWVzdHMgaXQgY2FuIGhhbmRsZSBvciB3aGVyZSBpdAorIyBjYW4gZmluZCBpdHMgY29uZmlndXJhdGlvbiBmaWxlcy4KKyMKKworIworIyBTZXJ2ZXJUeXBlIGlzIGVpdGhlciBpbmV0ZCwgb3Igc3RhbmRhbG9uZS4gIEluZXRkIG1vZGUgaXMgb25seSBzdXBwb3J0ZWQgb24KKyMgVW5peCBwbGF0Zm9ybXMuCisjCitTZXJ2ZXJUeXBlIHN0YW5kYWxvbmUKKworIworIyBTZXJ2ZXJSb290OiBUaGUgdG9wIG9mIHRoZSBkaXJlY3RvcnkgdHJlZSB1bmRlciB3aGljaCB0aGUgc2VydmVyJ3MKKyMgY29uZmlndXJhdGlvbiwgZXJyb3IsIGFuZCBsb2cgZmlsZXMgYXJlIGtlcHQuCisjCisjIE5PVEUhICBJZiB5b3UgaW50ZW5kIHRvIHBsYWNlIHRoaXMgb24gYW4gTkZTIChvciBvdGhlcndpc2UgbmV0d29yaykKKyMgbW91bnRlZCBmaWxlc3lzdGVtIHRoZW4gcGxlYXNlIHJlYWQgdGhlIExvY2tGaWxlIGRvY3VtZW50YXRpb24KKyMgKGF2YWlsYWJsZSBhdCA8VVJMOmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kb2NzL21vZC9jb3JlLmh0bWwjbG9ja2ZpbGU+KTsKKyMgeW91IHdpbGwgc2F2ZSB5b3Vyc2VsZiBhIGxvdCBvZiB0cm91YmxlLgorIworU2VydmVyUm9vdCAiL3Vzci9sb2NhbC9hcGFjaGUiCisKKyMKKyMgVGhlIExvY2tGaWxlIGRpcmVjdGl2ZSBzZXRzIHRoZSBwYXRoIHRvIHRoZSBsb2NrZmlsZSB1c2VkIHdoZW4gQXBhY2hlCisjIGlzIGNvbXBpbGVkIHdpdGggZWl0aGVyIFVTRV9GQ05UTF9TRVJJQUxJWkVEX0FDQ0VQVCBvcgorIyBVU0VfRkxPQ0tfU0VSSUFMSVpFRF9BQ0NFUFQuIFRoaXMgZGlyZWN0aXZlIHNob3VsZCBub3JtYWxseSBiZSBsZWZ0IGF0CisjIGl0cyBkZWZhdWx0IHZhbHVlLiBUaGUgbWFpbiByZWFzb24gZm9yIGNoYW5naW5nIGl0IGlzIGlmIHRoZSBsb2dzCisjIGRpcmVjdG9yeSBpcyBORlMgbW91bnRlZCwgc2luY2UgdGhlIGxvY2tmaWxlIE1VU1QgQkUgU1RPUkVEIE9OIEEgTE9DQUwKKyMgRElTSy4gVGhlIFBJRCBvZiB0aGUgbWFpbiBzZXJ2ZXIgcHJvY2VzcyBpcyBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIHRvCisjIHRoZSBmaWxlbmFtZS4gCisjCisjTG9ja0ZpbGUgL3Vzci9sb2NhbC9hcGFjaGUvbG9ncy9odHRwZC5sb2NrCisKKyMKKyMgUGlkRmlsZTogVGhlIGZpbGUgaW4gd2hpY2ggdGhlIHNlcnZlciBzaG91bGQgcmVjb3JkIGl0cyBwcm9jZXNzCisjIGlkZW50aWZpY2F0aW9uIG51bWJlciB3aGVuIGl0IHN0YXJ0cy4KKyMKK1BpZEZpbGUgL3Vzci9sb2NhbC9hcGFjaGUvbG9ncy9odHRwZC5waWQKKworIworIyBTY29yZUJvYXJkRmlsZTogRmlsZSB1c2VkIHRvIHN0b3JlIGludGVybmFsIHNlcnZlciBwcm9jZXNzIGluZm9ybWF0aW9uLgorIyBOb3QgYWxsIGFyY2hpdGVjdHVyZXMgcmVxdWlyZSB0aGlzLiAgQnV0IGlmIHlvdXJzIGRvZXMgKHlvdSdsbCBrbm93IGJlY2F1c2UKKyMgdGhpcyBmaWxlIHdpbGwgYmUgIGNyZWF0ZWQgd2hlbiB5b3UgcnVuIEFwYWNoZSkgdGhlbiB5b3UgKm11c3QqIGVuc3VyZSB0aGF0CisjIG5vIHR3byBpbnZvY2F0aW9ucyBvZiBBcGFjaGUgc2hhcmUgdGhlIHNhbWUgc2NvcmVib2FyZCBmaWxlLgorIworU2NvcmVCb2FyZEZpbGUgL3Vzci9sb2NhbC9hcGFjaGUvbG9ncy9odHRwZC5zY29yZWJvYXJkCisKKyMKKyMgSW4gdGhlIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24sIHRoZSBzZXJ2ZXIgd2lsbCBwcm9jZXNzIGh0dHBkLmNvbmYgKHRoaXMgCisjIGZpbGUsIHNwZWNpZmllZCBieSB0aGUgLWYgY29tbWFuZCBsaW5lIG9wdGlvbiksIHNybS5jb25mLCBhbmQgYWNjZXNzLmNvbmYgCisjIGluIHRoYXQgb3JkZXIuICBUaGUgbGF0dGVyIHR3byBmaWxlcyBhcmUgbm93IGRpc3RyaWJ1dGVkIGVtcHR5LCBhcyBpdCBpcyAKKyMgcmVjb21tZW5kZWQgdGhhdCBhbGwgZGlyZWN0aXZlcyBiZSBrZXB0IGluIGEgc2luZ2xlIGZpbGUgZm9yIHNpbXBsaWNpdHkuICAKKyMgVGhlIGNvbW1lbnRlZC1vdXQgdmFsdWVzIGJlbG93IGFyZSB0aGUgYnVpbHQtaW4gZGVmYXVsdHMuICBZb3UgY2FuIGhhdmUgdGhlIAorIyBzZXJ2ZXIgaWdub3JlIHRoZXNlIGZpbGVzIGFsdG9nZXRoZXIgYnkgdXNpbmcgIi9kZXYvbnVsbCIgKGZvciBVbml4KSBvcgorIyAibnVsIiAoZm9yIFdpbjMyKSBmb3IgdGhlIGFyZ3VtZW50cyB0byB0aGUgZGlyZWN0aXZlcy4KKyMKKyNSZXNvdXJjZUNvbmZpZyBjb25mL3NybS5jb25mCisjQWNjZXNzQ29uZmlnIGNvbmYvYWNjZXNzLmNvbmYKKworIworIyBUaW1lb3V0OiBUaGUgbnVtYmVyIG9mIHNlY29uZHMgYmVmb3JlIHJlY2VpdmVzIGFuZCBzZW5kcyB0aW1lIG91dC4KKyMKK1RpbWVvdXQgMzAwCisKKyMKKyMgS2VlcEFsaXZlOiBXaGV0aGVyIG9yIG5vdCB0byBhbGxvdyBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIChtb3JlIHRoYW4KKyMgb25lIHJlcXVlc3QgcGVyIGNvbm5lY3Rpb24pLiBTZXQgdG8gIk9mZiIgdG8gZGVhY3RpdmF0ZS4KKyMKK0tlZXBBbGl2ZSBPbgorCisjCisjIE1heEtlZXBBbGl2ZVJlcXVlc3RzOiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmVxdWVzdHMgdG8gYWxsb3cKKyMgZHVyaW5nIGEgcGVyc2lzdGVudCBjb25uZWN0aW9uLiBTZXQgdG8gMCB0byBhbGxvdyBhbiB1bmxpbWl0ZWQgYW1vdW50LgorIyBXZSByZWNvbW1lbmQgeW91IGxlYXZlIHRoaXMgbnVtYmVyIGhpZ2gsIGZvciBtYXhpbXVtIHBlcmZvcm1hbmNlLgorIworTWF4S2VlcEFsaXZlUmVxdWVzdHMgMTAwCisKKyMKKyMgS2VlcEFsaXZlVGltZW91dDogTnVtYmVyIG9mIHNlY29uZHMgdG8gd2FpdCBmb3IgdGhlIG5leHQgcmVxdWVzdCBmcm9tIHRoZQorIyBzYW1lIGNsaWVudCBvbiB0aGUgc2FtZSBjb25uZWN0aW9uLgorIworS2VlcEFsaXZlVGltZW91dCAxNQorCisjCisjIFNlcnZlci1wb29sIHNpemUgcmVndWxhdGlvbi4gIFJhdGhlciB0aGFuIG1ha2luZyB5b3UgZ3Vlc3MgaG93IG1hbnkKKyMgc2VydmVyIHByb2Nlc3NlcyB5b3UgbmVlZCwgQXBhY2hlIGR5bmFtaWNhbGx5IGFkYXB0cyB0byB0aGUgbG9hZCBpdAorIyBzZWVzIC0tLSB0aGF0IGlzLCBpdCB0cmllcyB0byBtYWludGFpbiBlbm91Z2ggc2VydmVyIHByb2Nlc3NlcyB0bworIyBoYW5kbGUgdGhlIGN1cnJlbnQgbG9hZCwgcGx1cyBhIGZldyBzcGFyZSBzZXJ2ZXJzIHRvIGhhbmRsZSB0cmFuc2llbnQKKyMgbG9hZCBzcGlrZXMgKGUuZy4sIG11bHRpcGxlIHNpbXVsdGFuZW91cyByZXF1ZXN0cyBmcm9tIGEgc2luZ2xlCisjIE5ldHNjYXBlIGJyb3dzZXIpLgorIworIyBJdCBkb2VzIHRoaXMgYnkgcGVyaW9kaWNhbGx5IGNoZWNraW5nIGhvdyBtYW55IHNlcnZlcnMgYXJlIHdhaXRpbmcKKyMgZm9yIGEgcmVxdWVzdC4gIElmIHRoZXJlIGFyZSBmZXdlciB0aGFuIE1pblNwYXJlU2VydmVycywgaXQgY3JlYXRlcworIyBhIG5ldyBzcGFyZS4gIElmIHRoZXJlIGFyZSBtb3JlIHRoYW4gTWF4U3BhcmVTZXJ2ZXJzLCBzb21lIG9mIHRoZQorIyBzcGFyZXMgZGllIG9mZi4gIFRoZSBkZWZhdWx0IHZhbHVlcyBhcmUgcHJvYmFibHkgT0sgZm9yIG1vc3Qgc2l0ZXMuCisjCitNaW5TcGFyZVNlcnZlcnMgNQorTWF4U3BhcmVTZXJ2ZXJzIDEwCisKKyMKKyMgTnVtYmVyIG9mIHNlcnZlcnMgdG8gc3RhcnQgaW5pdGlhbGx5IC0tLSBzaG91bGQgYmUgYSByZWFzb25hYmxlIGJhbGxwYXJrCisjIGZpZ3VyZS4KKyMKK1N0YXJ0U2VydmVycyA1CisKKyMKKyMgTGltaXQgb24gdG90YWwgbnVtYmVyIG9mIHNlcnZlcnMgcnVubmluZywgaS5lLiwgbGltaXQgb24gdGhlIG51bWJlcgorIyBvZiBjbGllbnRzIHdobyBjYW4gc2ltdWx0YW5lb3VzbHkgY29ubmVjdCAtLS0gaWYgdGhpcyBsaW1pdCBpcyBldmVyCisjIHJlYWNoZWQsIGNsaWVudHMgd2lsbCBiZSBMT0NLRUQgT1VULCBzbyBpdCBzaG91bGQgTk9UIEJFIFNFVCBUT08gTE9XLgorIyBJdCBpcyBpbnRlbmRlZCBtYWlubHkgYXMgYSBicmFrZSB0byBrZWVwIGEgcnVuYXdheSBzZXJ2ZXIgZnJvbSB0YWtpbmcKKyMgdGhlIHN5c3RlbSB3aXRoIGl0IGFzIGl0IHNwaXJhbHMgZG93bi4uLgorIworTWF4Q2xpZW50cyAxNTAKKworIworIyBNYXhSZXF1ZXN0c1BlckNoaWxkOiB0aGUgbnVtYmVyIG9mIHJlcXVlc3RzIGVhY2ggY2hpbGQgcHJvY2VzcyBpcworIyBhbGxvd2VkIHRvIHByb2Nlc3MgYmVmb3JlIHRoZSBjaGlsZCBkaWVzLiAgVGhlIGNoaWxkIHdpbGwgZXhpdCBzbworIyBhcyB0byBhdm9pZCBwcm9ibGVtcyBhZnRlciBwcm9sb25nZWQgdXNlIHdoZW4gQXBhY2hlIChhbmQgbWF5YmUgdGhlCisjIGxpYnJhcmllcyBpdCB1c2VzKSBsZWFrIG1lbW9yeSBvciBvdGhlciByZXNvdXJjZXMuICBPbiBtb3N0IHN5c3RlbXMsIHRoaXMKKyMgaXNuJ3QgcmVhbGx5IG5lZWRlZCwgYnV0IGEgZmV3IChzdWNoIGFzIFNvbGFyaXMpIGRvIGhhdmUgbm90YWJsZSBsZWFrcworIyBpbiB0aGUgbGlicmFyaWVzLiBGb3IgdGhlc2UgcGxhdGZvcm1zLCBzZXQgdG8gc29tZXRoaW5nIGxpa2UgMTAwMDAKKyMgb3Igc287IGEgc2V0dGluZyBvZiAwIG1lYW5zIHVubGltaXRlZC4KKyMKKyMgTk9URTogVGhpcyB2YWx1ZSBkb2VzIG5vdCBpbmNsdWRlIGtlZXBhbGl2ZSByZXF1ZXN0cyBhZnRlciB0aGUgaW5pdGlhbAorIyAgICAgICByZXF1ZXN0IHBlciBjb25uZWN0aW9uLiBGb3IgZXhhbXBsZSwgaWYgYSBjaGlsZCBwcm9jZXNzIGhhbmRsZXMKKyMgICAgICAgYW4gaW5pdGlhbCByZXF1ZXN0IGFuZCAxMCBzdWJzZXF1ZW50ICJrZXB0YWxpdmUiIHJlcXVlc3RzLCBpdAorIyAgICAgICB3b3VsZCBvbmx5IGNvdW50IGFzIDEgcmVxdWVzdCB0b3dhcmRzIHRoaXMgbGltaXQuCisjCitNYXhSZXF1ZXN0c1BlckNoaWxkIDAKKworIworIyBMaXN0ZW46IEFsbG93cyB5b3UgdG8gYmluZCBBcGFjaGUgdG8gc3BlY2lmaWMgSVAgYWRkcmVzc2VzIGFuZC9vcgorIyBwb3J0cywgaW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQuIFNlZSBhbHNvIHRoZSA8VmlydHVhbEhvc3Q+CisjIGRpcmVjdGl2ZS4KKyMKKyNMaXN0ZW4gMzAwMAorI0xpc3RlbiAxMi4zNC41Ni43ODo4MAorCisjCisjIEJpbmRBZGRyZXNzOiBZb3UgY2FuIHN1cHBvcnQgdmlydHVhbCBob3N0cyB3aXRoIHRoaXMgb3B0aW9uLiBUaGlzIGRpcmVjdGl2ZQorIyBpcyB1c2VkIHRvIHRlbGwgdGhlIHNlcnZlciB3aGljaCBJUCBhZGRyZXNzIHRvIGxpc3RlbiB0by4gSXQgY2FuIGVpdGhlcgorIyBjb250YWluICIqIiwgYW4gSVAgYWRkcmVzcywgb3IgYSBmdWxseSBxdWFsaWZpZWQgSW50ZXJuZXQgZG9tYWluIG5hbWUuCisjIFNlZSBhbHNvIHRoZSA8VmlydHVhbEhvc3Q+IGFuZCBMaXN0ZW4gZGlyZWN0aXZlcy4KKyMKKyNCaW5kQWRkcmVzcyAqCisKKyMKKyMgRHluYW1pYyBTaGFyZWQgT2JqZWN0IChEU08pIFN1cHBvcnQKKyMKKyMgVG8gYmUgYWJsZSB0byB1c2UgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYSBtb2R1bGUgd2hpY2ggd2FzIGJ1aWx0IGFzIGEgRFNPIHlvdQorIyBoYXZlIHRvIHBsYWNlIGNvcnJlc3BvbmRpbmcgYExvYWRNb2R1bGUnIGxpbmVzIGF0IHRoaXMgbG9jYXRpb24gc28gdGhlCisjIGRpcmVjdGl2ZXMgY29udGFpbmVkIGluIGl0IGFyZSBhY3R1YWxseSBhdmFpbGFibGUgX2JlZm9yZV8gdGhleSBhcmUgdXNlZC4KKyMgUGxlYXNlIHJlYWQgdGhlIGZpbGUgaHR0cDovL2h0dHBkLmFwYWNoZS5vcmcvZG9jcy9kc28uaHRtbCBmb3IgbW9yZQorIyBkZXRhaWxzIGFib3V0IHRoZSBEU08gbWVjaGFuaXNtIGFuZCBydW4gYGh0dHBkIC1sJyBmb3IgdGhlIGxpc3Qgb2YgYWxyZWFkeQorIyBidWlsdC1pbiAoc3RhdGljYWxseSBsaW5rZWQgYW5kIHRodXMgYWx3YXlzIGF2YWlsYWJsZSkgbW9kdWxlcyBpbiB5b3VyIGh0dHBkCisjIGJpbmFyeS4KKyMKKyMgTm90ZTogVGhlIG9yZGVyIGluIHdoaWNoIG1vZHVsZXMgYXJlIGxvYWRlZCBpcyBpbXBvcnRhbnQuICBEb24ndCBjaGFuZ2UKKyMgdGhlIG9yZGVyIGJlbG93IHdpdGhvdXQgZXhwZXJ0IGFkdmljZS4KKyMKKyMgRXhhbXBsZToKKyMgTG9hZE1vZHVsZSBmb29fbW9kdWxlIGxpYmV4ZWMvbW9kX2Zvby5zbworCisjaWYgeW91IGRvbid0IHVzZSBtb2RfZ3NvYXAgYXMgYSBzaGFyZWQgbGlicmFyeSwgcmVtb3ZlIHRoZSBuZXh0IGxpbmUgKGZvciBkZWJ1ZyBhbmQgc3RhdGljIGJ1aWxkcyk6CitMb2FkTW9kdWxlIGdzb2FwX21vZHVsZSBsaWJleGVjL21vZF9nc29hcC5zbworCisjCisjIEV4dGVuZGVkU3RhdHVzIGNvbnRyb2xzIHdoZXRoZXIgQXBhY2hlIHdpbGwgZ2VuZXJhdGUgImZ1bGwiIHN0YXR1cworIyBpbmZvcm1hdGlvbiAoRXh0ZW5kZWRTdGF0dXMgT24pIG9yIGp1c3QgYmFzaWMgaW5mb3JtYXRpb24gKEV4dGVuZGVkU3RhdHVzCisjIE9mZikgd2hlbiB0aGUgInNlcnZlci1zdGF0dXMiIGhhbmRsZXIgaXMgY2FsbGVkLiBUaGUgZGVmYXVsdCBpcyBPZmYuCisjCisjRXh0ZW5kZWRTdGF0dXMgT24KKworIyMjIFNlY3Rpb24gMjogJ01haW4nIHNlcnZlciBjb25maWd1cmF0aW9uCisjCisjIFRoZSBkaXJlY3RpdmVzIGluIHRoaXMgc2VjdGlvbiBzZXQgdXAgdGhlIHZhbHVlcyB1c2VkIGJ5IHRoZSAnbWFpbicKKyMgc2VydmVyLCB3aGljaCByZXNwb25kcyB0byBhbnkgcmVxdWVzdHMgdGhhdCBhcmVuJ3QgaGFuZGxlZCBieSBhCisjIDxWaXJ0dWFsSG9zdD4gZGVmaW5pdGlvbi4gIFRoZXNlIHZhbHVlcyBhbHNvIHByb3ZpZGUgZGVmYXVsdHMgZm9yCisjIGFueSA8VmlydHVhbEhvc3Q+IGNvbnRhaW5lcnMgeW91IG1heSBkZWZpbmUgbGF0ZXIgaW4gdGhlIGZpbGUuCisjCisjIEFsbCBvZiB0aGVzZSBkaXJlY3RpdmVzIG1heSBhcHBlYXIgaW5zaWRlIDxWaXJ0dWFsSG9zdD4gY29udGFpbmVycywKKyMgaW4gd2hpY2ggY2FzZSB0aGVzZSBkZWZhdWx0IHNldHRpbmdzIHdpbGwgYmUgb3ZlcnJpZGRlbiBmb3IgdGhlCisjIHZpcnR1YWwgaG9zdCBiZWluZyBkZWZpbmVkLgorIworCisjCisjIElmIHlvdXIgU2VydmVyVHlwZSBkaXJlY3RpdmUgKHNldCBlYXJsaWVyIGluIHRoZSAnR2xvYmFsIEVudmlyb25tZW50JworIyBzZWN0aW9uKSBpcyBzZXQgdG8gImluZXRkIiwgdGhlIG5leHQgZmV3IGRpcmVjdGl2ZXMgZG9uJ3QgaGF2ZSBhbnkKKyMgZWZmZWN0IHNpbmNlIHRoZWlyIHNldHRpbmdzIGFyZSBkZWZpbmVkIGJ5IHRoZSBpbmV0ZCBjb25maWd1cmF0aW9uLgorIyBTa2lwIGFoZWFkIHRvIHRoZSBTZXJ2ZXJBZG1pbiBkaXJlY3RpdmUuCisjCisKKyMKKyMgUG9ydDogVGhlIHBvcnQgdG8gd2hpY2ggdGhlIHN0YW5kYWxvbmUgc2VydmVyIGxpc3RlbnMuIEZvcgorIyBwb3J0cyA8IDEwMjMsIHlvdSB3aWxsIG5lZWQgaHR0cGQgdG8gYmUgcnVuIGFzIHJvb3QgaW5pdGlhbGx5LgorIworUG9ydCA4MDgwCisKKyMjCisjIyAgU1NMIFN1cHBvcnQKKyMjCisjIyAgV2hlbiB3ZSBhbHNvIHByb3ZpZGUgU1NMIHdlIGhhdmUgdG8gbGlzdGVuIHRvIHRoZSAKKyMjICBzdGFuZGFyZCBIVFRQIHBvcnQgKHNlZSBhYm92ZSkgYW5kIHRvIHRoZSBIVFRQUyBwb3J0CisjIworPElmRGVmaW5lIFNTTD4KK0xpc3RlbiA4MAorTGlzdGVuIDQ0MworPC9JZkRlZmluZT4KKworIworIyBJZiB5b3Ugd2lzaCBodHRwZCB0byBydW4gYXMgYSBkaWZmZXJlbnQgdXNlciBvciBncm91cCwgeW91IG11c3QgcnVuCisjIGh0dHBkIGFzIHJvb3QgaW5pdGlhbGx5IGFuZCBpdCB3aWxsIHN3aXRjaC4gIAorIworIyBVc2VyL0dyb3VwOiBUaGUgbmFtZSAob3IgI251bWJlcikgb2YgdGhlIHVzZXIvZ3JvdXAgdG8gcnVuIGh0dHBkIGFzLgorIyAgLiBPbiBTQ08gKE9EVCAzKSB1c2UgIlVzZXIgbm91c2VyIiBhbmQgIkdyb3VwIG5vZ3JvdXAiLgorIyAgLiBPbiBIUFVYIHlvdSBtYXkgbm90IGJlIGFibGUgdG8gdXNlIHNoYXJlZCBtZW1vcnkgYXMgbm9ib2R5LCBhbmQgdGhlCisjICAgIHN1Z2dlc3RlZCB3b3JrYXJvdW5kIGlzIHRvIGNyZWF0ZSBhIHVzZXIgd3d3IGFuZCB1c2UgdGhhdCB1c2VyLgorIyAgTk9URSB0aGF0IHNvbWUga2VybmVscyByZWZ1c2UgdG8gc2V0Z2lkKEdyb3VwKSBvciBzZW1jdGwoSVBDX1NFVCkKKyMgIHdoZW4gdGhlIHZhbHVlIG9mICh1bnNpZ25lZClHcm91cCBpcyBhYm92ZSA2MDAwMDsgCisjICBkb24ndCB1c2UgR3JvdXAgbm9ib2R5IG9uIHRoZXNlIHN5c3RlbXMhCisjCitVc2VyIG5vYm9keQorR3JvdXAgbm9ib2R5CisKKyMKKyMgU2VydmVyQWRtaW46IFlvdXIgYWRkcmVzcywgd2hlcmUgcHJvYmxlbXMgd2l0aCB0aGUgc2VydmVyIHNob3VsZCBiZQorIyBlLW1haWxlZC4gIFRoaXMgYWRkcmVzcyBhcHBlYXJzIG9uIHNvbWUgc2VydmVyLWdlbmVyYXRlZCBwYWdlcywgc3VjaAorIyBhcyBlcnJvciBkb2N1bWVudHMuCisjCitTZXJ2ZXJBZG1pbiBhYmVyZ2VyQHJlZHV4LmFiZXJnZXIuYXQKKworIworIyBTZXJ2ZXJOYW1lIGFsbG93cyB5b3UgdG8gc2V0IGEgaG9zdCBuYW1lIHdoaWNoIGlzIHNlbnQgYmFjayB0byBjbGllbnRzIGZvcgorIyB5b3VyIHNlcnZlciBpZiBpdCdzIGRpZmZlcmVudCB0aGFuIHRoZSBvbmUgdGhlIHByb2dyYW0gd291bGQgZ2V0IChpLmUuLCB1c2UKKyMgInd3dyIgaW5zdGVhZCBvZiB0aGUgaG9zdCdzIHJlYWwgbmFtZSkuCisjCisjIE5vdGU6IFlvdSBjYW5ub3QganVzdCBpbnZlbnQgaG9zdCBuYW1lcyBhbmQgaG9wZSB0aGV5IHdvcmsuIFRoZSBuYW1lIHlvdSAKKyMgZGVmaW5lIGhlcmUgbXVzdCBiZSBhIHZhbGlkIEROUyBuYW1lIGZvciB5b3VyIGhvc3QuIElmIHlvdSBkb24ndCB1bmRlcnN0YW5kCisjIHRoaXMsIGFzayB5b3VyIG5ldHdvcmsgYWRtaW5pc3RyYXRvci4KKyMgSWYgeW91ciBob3N0IGRvZXNuJ3QgaGF2ZSBhIHJlZ2lzdGVyZWQgRE5TIG5hbWUsIGVudGVyIGl0cyBJUCBhZGRyZXNzIGhlcmUuCisjIFlvdSB3aWxsIGhhdmUgdG8gYWNjZXNzIGl0IGJ5IGl0cyBhZGRyZXNzIChlLmcuLCBodHRwOi8vMTIzLjQ1LjY3Ljg5LykKKyMgYW55d2F5LCBhbmQgdGhpcyB3aWxsIG1ha2UgcmVkaXJlY3Rpb25zIHdvcmsgaW4gYSBzZW5zaWJsZSB3YXkuCisjCisjIDEyNy4wLjAuMSBpcyB0aGUgVENQL0lQIGxvY2FsIGxvb3AtYmFjayBhZGRyZXNzLCBvZnRlbiBuYW1lZCBsb2NhbGhvc3QuIFlvdXIgCisjIG1hY2hpbmUgYWx3YXlzIGtub3dzIGl0c2VsZiBieSB0aGlzIGFkZHJlc3MuIElmIHlvdSB1c2UgQXBhY2hlIHN0cmljdGx5IGZvciAKKyMgbG9jYWwgdGVzdGluZyBhbmQgZGV2ZWxvcG1lbnQsIHlvdSBtYXkgdXNlIDEyNy4wLjAuMSBhcyB0aGUgc2VydmVyIG5hbWUuCisjCisjU2VydmVyTmFtZSByZWR1eC5hYmVyZ2VyLmF0CisKKyMKKyMgRG9jdW1lbnRSb290OiBUaGUgZGlyZWN0b3J5IG91dCBvZiB3aGljaCB5b3Ugd2lsbCBzZXJ2ZSB5b3VyCisjIGRvY3VtZW50cy4gQnkgZGVmYXVsdCwgYWxsIHJlcXVlc3RzIGFyZSB0YWtlbiBmcm9tIHRoaXMgZGlyZWN0b3J5LCBidXQKKyMgc3ltYm9saWMgbGlua3MgYW5kIGFsaWFzZXMgbWF5IGJlIHVzZWQgdG8gcG9pbnQgdG8gb3RoZXIgbG9jYXRpb25zLgorIworRG9jdW1lbnRSb290ICIvdXNyL2xvY2FsL2FwYWNoZS9odGRvY3MiCisKKyMKKyMgRWFjaCBkaXJlY3RvcnkgdG8gd2hpY2ggQXBhY2hlIGhhcyBhY2Nlc3MsIGNhbiBiZSBjb25maWd1cmVkIHdpdGggcmVzcGVjdAorIyB0byB3aGljaCBzZXJ2aWNlcyBhbmQgZmVhdHVyZXMgYXJlIGFsbG93ZWQgYW5kL29yIGRpc2FibGVkIGluIHRoYXQKKyMgZGlyZWN0b3J5IChhbmQgaXRzIHN1YmRpcmVjdG9yaWVzKS4gCisjCisjIEZpcnN0LCB3ZSBjb25maWd1cmUgdGhlICJkZWZhdWx0IiB0byBiZSBhIHZlcnkgcmVzdHJpY3RpdmUgc2V0IG9mIAorIyBwZXJtaXNzaW9ucy4gIAorIworPERpcmVjdG9yeSAvPgorICAgIE9wdGlvbnMgRm9sbG93U3ltTGlua3MKKyAgICBBbGxvd092ZXJyaWRlIE5vbmUKKzwvRGlyZWN0b3J5PgorCisjCisjIE5vdGUgdGhhdCBmcm9tIHRoaXMgcG9pbnQgZm9yd2FyZCB5b3UgbXVzdCBzcGVjaWZpY2FsbHkgYWxsb3cKKyMgcGFydGljdWxhciBmZWF0dXJlcyB0byBiZSBlbmFibGVkIC0gc28gaWYgc29tZXRoaW5nJ3Mgbm90IHdvcmtpbmcgYXMKKyMgeW91IG1pZ2h0IGV4cGVjdCwgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgc3BlY2lmaWNhbGx5IGVuYWJsZWQgaXQKKyMgYmVsb3cuCisjCisKKyMKKyMgVGhpcyBzaG91bGQgYmUgY2hhbmdlZCB0byB3aGF0ZXZlciB5b3Ugc2V0IERvY3VtZW50Um9vdCB0by4KKyMKKzxEaXJlY3RvcnkgIi91c3IvbG9jYWwvYXBhY2hlL2h0ZG9jcyI+CisKKyMKKyMgVGhpcyBtYXkgYWxzbyBiZSAiTm9uZSIsICJBbGwiLCBvciBhbnkgY29tYmluYXRpb24gb2YgIkluZGV4ZXMiLAorIyAiSW5jbHVkZXMiLCAiRm9sbG93U3ltTGlua3MiLCAiRXhlY0NHSSIsIG9yICJNdWx0aVZpZXdzIi4KKyMKKyMgTm90ZSB0aGF0ICJNdWx0aVZpZXdzIiBtdXN0IGJlIG5hbWVkICpleHBsaWNpdGx5KiAtLS0gIk9wdGlvbnMgQWxsIgorIyBkb2Vzbid0IGdpdmUgaXQgdG8geW91LgorIworICAgIE9wdGlvbnMgSW5kZXhlcyBGb2xsb3dTeW1MaW5rcyBNdWx0aVZpZXdzCisKKyMKKyMgVGhpcyBjb250cm9scyB3aGljaCBvcHRpb25zIHRoZSAuaHRhY2Nlc3MgZmlsZXMgaW4gZGlyZWN0b3JpZXMgY2FuCisjIG92ZXJyaWRlLiBDYW4gYWxzbyBiZSAiQWxsIiwgb3IgYW55IGNvbWJpbmF0aW9uIG9mICJPcHRpb25zIiwgIkZpbGVJbmZvIiwgCisjICJBdXRoQ29uZmlnIiwgYW5kICJMaW1pdCIKKyMKKyAgICBBbGxvd092ZXJyaWRlIE5vbmUKKworIworIyBDb250cm9scyB3aG8gY2FuIGdldCBzdHVmZiBmcm9tIHRoaXMgc2VydmVyLgorIworICAgIE9yZGVyIGFsbG93LGRlbnkKKyAgICBBbGxvdyBmcm9tIGFsbAorPC9EaXJlY3Rvcnk+CisKKyMKKyMgVXNlckRpcjogVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB3aGljaCBpcyBhcHBlbmRlZCBvbnRvIGEgdXNlcidzIGhvbWUKKyMgZGlyZWN0b3J5IGlmIGEgfnVzZXIgcmVxdWVzdCBpcyByZWNlaXZlZC4KKyMKKzxJZk1vZHVsZSBtb2RfdXNlcmRpci5jPgorICAgIFVzZXJEaXIgcHVibGljX2h0bWwKKzwvSWZNb2R1bGU+CisKKyMKKyMgQ29udHJvbCBhY2Nlc3MgdG8gVXNlckRpciBkaXJlY3Rvcmllcy4gIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZQorIyBmb3IgYSBzaXRlIHdoZXJlIHRoZXNlIGRpcmVjdG9yaWVzIGFyZSByZXN0cmljdGVkIHRvIHJlYWQtb25seS4KKyMKKyM8RGlyZWN0b3J5IC9ob21lLyovcHVibGljX2h0bWw+CisjICAgIEFsbG93T3ZlcnJpZGUgRmlsZUluZm8gQXV0aENvbmZpZyBMaW1pdAorIyAgICBPcHRpb25zIE11bHRpVmlld3MgSW5kZXhlcyBTeW1MaW5rc0lmT3duZXJNYXRjaCBJbmNsdWRlc05vRXhlYworIyAgICA8TGltaXQgR0VUIFBPU1QgT1BUSU9OUyBQUk9QRklORD4KKyMgICAgICAgIE9yZGVyIGFsbG93LGRlbnkKKyMgICAgICAgIEFsbG93IGZyb20gYWxsCisjICAgIDwvTGltaXQ+CisjICAgIDxMaW1pdEV4Y2VwdCBHRVQgUE9TVCBPUFRJT05TIFBST1BGSU5EPgorIyAgICAgICAgT3JkZXIgZGVueSxhbGxvdworIyAgICAgICAgRGVueSBmcm9tIGFsbAorIyAgICA8L0xpbWl0RXhjZXB0PgorIzwvRGlyZWN0b3J5PgorCisjCisjIERpcmVjdG9yeUluZGV4OiBOYW1lIG9mIHRoZSBmaWxlIG9yIGZpbGVzIHRvIHVzZSBhcyBhIHByZS13cml0dGVuIEhUTUwKKyMgZGlyZWN0b3J5IGluZGV4LiAgU2VwYXJhdGUgbXVsdGlwbGUgZW50cmllcyB3aXRoIHNwYWNlcy4KKyMKKzxJZk1vZHVsZSBtb2RfZGlyLmM+CisgICAgRGlyZWN0b3J5SW5kZXggaW5kZXguaHRtbAorPC9JZk1vZHVsZT4KKworIworIyBBY2Nlc3NGaWxlTmFtZTogVGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gbG9vayBmb3IgaW4gZWFjaCBkaXJlY3RvcnkKKyMgZm9yIGFjY2VzcyBjb250cm9sIGluZm9ybWF0aW9uLgorIworQWNjZXNzRmlsZU5hbWUgLmh0YWNjZXNzCisKKyMKKyMgVGhlIGZvbGxvd2luZyBsaW5lcyBwcmV2ZW50IC5odGFjY2VzcyBmaWxlcyBmcm9tIGJlaW5nIHZpZXdlZCBieQorIyBXZWIgY2xpZW50cy4gIFNpbmNlIC5odGFjY2VzcyBmaWxlcyBvZnRlbiBjb250YWluIGF1dGhvcml6YXRpb24KKyMgaW5mb3JtYXRpb24sIGFjY2VzcyBpcyBkaXNhbGxvd2VkIGZvciBzZWN1cml0eSByZWFzb25zLiAgQ29tbWVudAorIyB0aGVzZSBsaW5lcyBvdXQgaWYgeW91IHdhbnQgV2ViIHZpc2l0b3JzIHRvIHNlZSB0aGUgY29udGVudHMgb2YKKyMgLmh0YWNjZXNzIGZpbGVzLiAgSWYgeW91IGNoYW5nZSB0aGUgQWNjZXNzRmlsZU5hbWUgZGlyZWN0aXZlIGFib3ZlLAorIyBiZSBzdXJlIHRvIG1ha2UgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbmdlcyBoZXJlLgorIworIyBBbHNvLCBmb2xrcyB0ZW5kIHRvIHVzZSBuYW1lcyBzdWNoIGFzIC5odHBhc3N3ZCBmb3IgcGFzc3dvcmQKKyMgZmlsZXMsIHNvIHRoaXMgd2lsbCBwcm90ZWN0IHRob3NlIGFzIHdlbGwuCisjCis8RmlsZXMgfiAiXlwuaHQiPgorICAgIE9yZGVyIGFsbG93LGRlbnkKKyAgICBEZW55IGZyb20gYWxsCisgICAgU2F0aXNmeSBBbGwKKzwvRmlsZXM+CisKKyMKKyMgQ2FjaGVOZWdvdGlhdGVkRG9jczogQnkgZGVmYXVsdCwgQXBhY2hlIHNlbmRzICJQcmFnbWE6IG5vLWNhY2hlIiB3aXRoIGVhY2gKKyMgZG9jdW1lbnQgdGhhdCB3YXMgbmVnb3RpYXRlZCBvbiB0aGUgYmFzaXMgb2YgY29udGVudC4gVGhpcyBhc2tzIHByb3h5CisjIHNlcnZlcnMgbm90IHRvIGNhY2hlIHRoZSBkb2N1bWVudC4gVW5jb21tZW50aW5nIHRoZSBmb2xsb3dpbmcgbGluZSBkaXNhYmxlcworIyB0aGlzIGJlaGF2aW9yLCBhbmQgcHJveGllcyB3aWxsIGJlIGFsbG93ZWQgdG8gY2FjaGUgdGhlIGRvY3VtZW50cy4KKyMKKyNDYWNoZU5lZ290aWF0ZWREb2NzCisKKyMKKyMgVXNlQ2Fub25pY2FsTmFtZTogIChuZXcgZm9yIDEuMykgIFdpdGggdGhpcyBzZXR0aW5nIHR1cm5lZCBvbiwgd2hlbmV2ZXIKKyMgQXBhY2hlIG5lZWRzIHRvIGNvbnN0cnVjdCBhIHNlbGYtcmVmZXJlbmNpbmcgVVJMIChhIFVSTCB0aGF0IHJlZmVycyBiYWNrCisjIHRvIHRoZSBzZXJ2ZXIgdGhlIHJlc3BvbnNlIGlzIGNvbWluZyBmcm9tKSBpdCB3aWxsIHVzZSBTZXJ2ZXJOYW1lIGFuZAorIyBQb3J0IHRvIGZvcm0gYSAiY2Fub25pY2FsIiBuYW1lLiAgV2l0aCB0aGlzIHNldHRpbmcgb2ZmLCBBcGFjaGUgd2lsbAorIyB1c2UgdGhlIGhvc3RuYW1lOnBvcnQgdGhhdCB0aGUgY2xpZW50IHN1cHBsaWVkLCB3aGVuIHBvc3NpYmxlLiAgVGhpcworIyBhbHNvIGFmZmVjdHMgU0VSVkVSX05BTUUgYW5kIFNFUlZFUl9QT1JUIGluIENHSSBzY3JpcHRzLgorIworVXNlQ2Fub25pY2FsTmFtZSBPbgorCisjCisjIFR5cGVzQ29uZmlnIGRlc2NyaWJlcyB3aGVyZSB0aGUgbWltZS50eXBlcyBmaWxlIChvciBlcXVpdmFsZW50KSBpcworIyB0byBiZSBmb3VuZC4KKyMKKzxJZk1vZHVsZSBtb2RfbWltZS5jPgorICAgIFR5cGVzQ29uZmlnIC91c3IvbG9jYWwvYXBhY2hlL2NvbmYvbWltZS50eXBlcworPC9JZk1vZHVsZT4KKworIworIyBEZWZhdWx0VHlwZSBpcyB0aGUgZGVmYXVsdCBNSU1FIHR5cGUgdGhlIHNlcnZlciB3aWxsIHVzZSBmb3IgYSBkb2N1bWVudAorIyBpZiBpdCBjYW5ub3Qgb3RoZXJ3aXNlIGRldGVybWluZSBvbmUsIHN1Y2ggYXMgZnJvbSBmaWxlbmFtZSBleHRlbnNpb25zLgorIyBJZiB5b3VyIHNlcnZlciBjb250YWlucyBtb3N0bHkgdGV4dCBvciBIVE1MIGRvY3VtZW50cywgInRleHQvcGxhaW4iIGlzCisjIGEgZ29vZCB2YWx1ZS4gIElmIG1vc3Qgb2YgeW91ciBjb250ZW50IGlzIGJpbmFyeSwgc3VjaCBhcyBhcHBsaWNhdGlvbnMKKyMgb3IgaW1hZ2VzLCB5b3UgbWF5IHdhbnQgdG8gdXNlICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iIGluc3RlYWQgdG8KKyMga2VlcCBicm93c2VycyBmcm9tIHRyeWluZyB0byBkaXNwbGF5IGJpbmFyeSBmaWxlcyBhcyB0aG91Z2ggdGhleSBhcmUKKyMgdGV4dC4KKyMKK0RlZmF1bHRUeXBlIHRleHQvcGxhaW4KKworIworIyBUaGUgbW9kX21pbWVfbWFnaWMgbW9kdWxlIGFsbG93cyB0aGUgc2VydmVyIHRvIHVzZSB2YXJpb3VzIGhpbnRzIGZyb20gdGhlCisjIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGl0c2VsZiB0byBkZXRlcm1pbmUgaXRzIHR5cGUuICBUaGUgTUlNRU1hZ2ljRmlsZQorIyBkaXJlY3RpdmUgdGVsbHMgdGhlIG1vZHVsZSB3aGVyZSB0aGUgaGludCBkZWZpbml0aW9ucyBhcmUgbG9jYXRlZC4KKyMgbW9kX21pbWVfbWFnaWMgaXMgbm90IHBhcnQgb2YgdGhlIGRlZmF1bHQgc2VydmVyICh5b3UgaGF2ZSB0byBhZGQKKyMgaXQgeW91cnNlbGYgd2l0aCBhIExvYWRNb2R1bGUgW3NlZSB0aGUgRFNPIHBhcmFncmFwaCBpbiB0aGUgJ0dsb2JhbAorIyBFbnZpcm9ubWVudCcgc2VjdGlvbl0sIG9yIHJlY29tcGlsZSB0aGUgc2VydmVyIGFuZCBpbmNsdWRlIG1vZF9taW1lX21hZ2ljCisjIGFzIHBhcnQgb2YgdGhlIGNvbmZpZ3VyYXRpb24pLCBzbyBpdCdzIGVuY2xvc2VkIGluIGFuIDxJZk1vZHVsZT4gY29udGFpbmVyLgorIyBUaGlzIG1lYW5zIHRoYXQgdGhlIE1JTUVNYWdpY0ZpbGUgZGlyZWN0aXZlIHdpbGwgb25seSBiZSBwcm9jZXNzZWQgaWYgdGhlCisjIG1vZHVsZSBpcyBwYXJ0IG9mIHRoZSBzZXJ2ZXIuCisjCis8SWZNb2R1bGUgbW9kX21pbWVfbWFnaWMuYz4KKyAgICBNSU1FTWFnaWNGaWxlIC91c3IvbG9jYWwvYXBhY2hlL2NvbmYvbWFnaWMKKzwvSWZNb2R1bGU+CisKKyMKKyMgSG9zdG5hbWVMb29rdXBzOiBMb2cgdGhlIG5hbWVzIG9mIGNsaWVudHMgb3IganVzdCB0aGVpciBJUCBhZGRyZXNzZXMKKyMgZS5nLiwgd3d3LmFwYWNoZS5vcmcgKG9uKSBvciAyMDQuNjIuMTI5LjEzMiAob2ZmKS4KKyMgVGhlIGRlZmF1bHQgaXMgb2ZmIGJlY2F1c2UgaXQnZCBiZSBvdmVyYWxsIGJldHRlciBmb3IgdGhlIG5ldCBpZiBwZW9wbGUKKyMgaGFkIHRvIGtub3dpbmdseSB0dXJuIHRoaXMgZmVhdHVyZSBvbiwgc2luY2UgZW5hYmxpbmcgaXQgbWVhbnMgdGhhdAorIyBlYWNoIGNsaWVudCByZXF1ZXN0IHdpbGwgcmVzdWx0IGluIEFUIExFQVNUIG9uZSBsb29rdXAgcmVxdWVzdCB0byB0aGUKKyMgbmFtZXNlcnZlci4KKyMKK0hvc3RuYW1lTG9va3VwcyBPZmYKKworIworIyBFcnJvckxvZzogVGhlIGxvY2F0aW9uIG9mIHRoZSBlcnJvciBsb2cgZmlsZS4KKyMgSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGFuIEVycm9yTG9nIGRpcmVjdGl2ZSB3aXRoaW4gYSA8VmlydHVhbEhvc3Q+CisjIGNvbnRhaW5lciwgZXJyb3IgbWVzc2FnZXMgcmVsYXRpbmcgdG8gdGhhdCB2aXJ0dWFsIGhvc3Qgd2lsbCBiZQorIyBsb2dnZWQgaGVyZS4gIElmIHlvdSAqZG8qIGRlZmluZSBhbiBlcnJvciBsb2dmaWxlIGZvciBhIDxWaXJ0dWFsSG9zdD4KKyMgY29udGFpbmVyLCB0aGF0IGhvc3QncyBlcnJvcnMgd2lsbCBiZSBsb2dnZWQgdGhlcmUgYW5kIG5vdCBoZXJlLgorIworRXJyb3JMb2cgL3Vzci9sb2NhbC9hcGFjaGUvbG9ncy9lcnJvcl9sb2cKKworIworIyBMb2dMZXZlbDogQ29udHJvbCB0aGUgbnVtYmVyIG9mIG1lc3NhZ2VzIGxvZ2dlZCB0byB0aGUgZXJyb3JfbG9nLgorIyBQb3NzaWJsZSB2YWx1ZXMgaW5jbHVkZTogZGVidWcsIGluZm8sIG5vdGljZSwgd2FybiwgZXJyb3IsIGNyaXQsCisjIGFsZXJ0LCBlbWVyZy4KKyMKK0xvZ0xldmVsIHdhcm4KKworIworIyBUaGUgZm9sbG93aW5nIGRpcmVjdGl2ZXMgZGVmaW5lIHNvbWUgZm9ybWF0IG5pY2tuYW1lcyBmb3IgdXNlIHdpdGgKKyMgYSBDdXN0b21Mb2cgZGlyZWN0aXZlIChzZWUgYmVsb3cpLgorIworTG9nRm9ybWF0ICIlaCAlbCAldSAldCBcIiVyXCIgJT5zICViIFwiJXtSZWZlcmVyfWlcIiBcIiV7VXNlci1BZ2VudH1pXCIiIGNvbWJpbmVkCitMb2dGb3JtYXQgIiVoICVsICV1ICV0IFwiJXJcIiAlPnMgJWIiIGNvbW1vbgorTG9nRm9ybWF0ICIle1JlZmVyZXJ9aSAtPiAlVSIgcmVmZXJlcgorTG9nRm9ybWF0ICIle1VzZXItYWdlbnR9aSIgYWdlbnQKKworIworIyBUaGUgbG9jYXRpb24gYW5kIGZvcm1hdCBvZiB0aGUgYWNjZXNzIGxvZ2ZpbGUgKENvbW1vbiBMb2dmaWxlIEZvcm1hdCkuCisjIElmIHlvdSBkbyBub3QgZGVmaW5lIGFueSBhY2Nlc3MgbG9nZmlsZXMgd2l0aGluIGEgPFZpcnR1YWxIb3N0PgorIyBjb250YWluZXIsIHRoZXkgd2lsbCBiZSBsb2dnZWQgaGVyZS4gIENvbnRyYXJpd2lzZSwgaWYgeW91ICpkbyoKKyMgZGVmaW5lIHBlci08VmlydHVhbEhvc3Q+IGFjY2VzcyBsb2dmaWxlcywgdHJhbnNhY3Rpb25zIHdpbGwgYmUKKyMgbG9nZ2VkIHRoZXJlaW4gYW5kICpub3QqIGluIHRoaXMgZmlsZS4KKyMKK0N1c3RvbUxvZyAvdXNyL2xvY2FsL2FwYWNoZS9sb2dzL2FjY2Vzc19sb2cgY29tbW9uCisKKyMKKyMgSWYgeW91IHdvdWxkIGxpa2UgdG8gaGF2ZSBhZ2VudCBhbmQgcmVmZXJlciBsb2dmaWxlcywgdW5jb21tZW50IHRoZQorIyBmb2xsb3dpbmcgZGlyZWN0aXZlcy4KKyMKKyNDdXN0b21Mb2cgL3Vzci9sb2NhbC9hcGFjaGUvbG9ncy9yZWZlcmVyX2xvZyByZWZlcmVyCisjQ3VzdG9tTG9nIC91c3IvbG9jYWwvYXBhY2hlL2xvZ3MvYWdlbnRfbG9nIGFnZW50CisKKyMKKyMgSWYgeW91IHByZWZlciBhIHNpbmdsZSBsb2dmaWxlIHdpdGggYWNjZXNzLCBhZ2VudCwgYW5kIHJlZmVyZXIgaW5mb3JtYXRpb24KKyMgKENvbWJpbmVkIExvZ2ZpbGUgRm9ybWF0KSB5b3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIGRpcmVjdGl2ZS4KKyMKKyNDdXN0b21Mb2cgL3Vzci9sb2NhbC9hcGFjaGUvbG9ncy9hY2Nlc3NfbG9nIGNvbWJpbmVkCisKKyMKKyMgT3B0aW9uYWxseSBhZGQgYSBsaW5lIGNvbnRhaW5pbmcgdGhlIHNlcnZlciB2ZXJzaW9uIGFuZCB2aXJ0dWFsIGhvc3QKKyMgbmFtZSB0byBzZXJ2ZXItZ2VuZXJhdGVkIHBhZ2VzIChlcnJvciBkb2N1bWVudHMsIEZUUCBkaXJlY3RvcnkgbGlzdGluZ3MsCisjIG1vZF9zdGF0dXMgYW5kIG1vZF9pbmZvIG91dHB1dCBldGMuLCBidXQgbm90IENHSSBnZW5lcmF0ZWQgZG9jdW1lbnRzKS4KKyMgU2V0IHRvICJFTWFpbCIgdG8gYWxzbyBpbmNsdWRlIGEgbWFpbHRvOiBsaW5rIHRvIHRoZSBTZXJ2ZXJBZG1pbi4KKyMgU2V0IHRvIG9uZSBvZjogIE9uIHwgT2ZmIHwgRU1haWwKKyMKK1NlcnZlclNpZ25hdHVyZSBPbgorCisjIEVCQ0RJQyBjb25maWd1cmF0aW9uOgorIyAob25seSBmb3IgbWFpbmZyYW1lcyB1c2luZyB0aGUgRUJDRElDIGNvZGVzZXQsIGN1cnJlbnRseSBvbmUgb2Y6CisjIEZ1aml0c3UtU2llbWVucycgQlMyMDAwL09TRCwgSUJNJ3MgT1MvMzkwIGFuZCBJQk0ncyBUUEYpISEKKyMgVGhlIGZvbGxvd2luZyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gYXNzdW1lcyB0aGF0ICJ0ZXh0IGZpbGVzIgorIyBhcmUgc3RvcmVkIGluIEVCQ0RJQyAoc28gdGhhdCB5b3UgY2FuIG9wZXJhdGUgb24gdGhlbSB1c2luZyB0aGUKKyMgbm9ybWFsIFBPU0lYIHRvb2xzIGxpa2UgZ3JlcCBhbmQgc29ydCkgd2hpbGUgImJpbmFyeSBmaWxlcyIgYXJlCisjIHN0b3JlZCB3aXRoIGlkZW50aWNhbCBvY3RldHMgYXMgb24gYW4gQVNDSUkgbWFjaGluZS4KKyMKKyMgVGhlIGRpcmVjdGl2ZXMgYXJlIGV2YWx1YXRlZCBpbiBjb25maWd1cmF0aW9uIGZpbGUgb3JkZXIsIHdpdGgKKyMgdGhlIEVCQ0RJQ0NvbnZlcnQgZGlyZWN0aXZlcyBhcHBsaWVkIGJlZm9yZSBFQkNESUNDb252ZXJ0QnlUeXBlLgorIworIyBJZiB5b3Ugd2FudCB0byBoYXZlIEFTQ0lJIEhUTUwgZG9jdW1lbnRzIGFuZCBFQkNESUMgSFRNTCBkb2N1bWVudHMKKyMgYXQgdGhlIHNhbWUgdGltZSwgeW91IGNhbiB1c2UgdGhlIGZpbGUgZXh0ZW5zaW9uIHRvIGZvcmNlCisjIGNvbnZlcnNpb24gb2ZmIGZvciB0aGUgQVNDSUkgZG9jdW1lbnRzOgorIyA+IEFkZFR5cGUgICAgICAgdGV4dC9odG1sIC5haHRtbAorIyA+IEVCQ0RJQ0NvbnZlcnQgT2ZmPUluT3V0IC5haHRtbAorIworIyBFQkNESUNDb252ZXJ0QnlUeXBlICBPbj1Jbk91dCB0ZXh0LyogbWVzc2FnZS8qIG11bHRpcGFydC8qCisjIEVCQ0RJQ0NvbnZlcnRCeVR5cGUgIE9uPUluICAgIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZAorIyBFQkNESUNDb252ZXJ0QnlUeXBlICBPbj1Jbk91dCBhcHBsaWNhdGlvbi9wb3N0c2NyaXB0IG1vZGVsL3ZybWwKKyMgRUJDRElDQ29udmVydEJ5VHlwZSBPZmY9SW5PdXQgKi8qCisKKworIworIyBBbGlhc2VzOiBBZGQgaGVyZSBhcyBtYW55IGFsaWFzZXMgYXMgeW91IG5lZWQgKHdpdGggbm8gbGltaXQpLiBUaGUgZm9ybWF0IGlzIAorIyBBbGlhcyBmYWtlbmFtZSByZWFsbmFtZQorIworPElmTW9kdWxlIG1vZF9hbGlhcy5jPgorCisgICAgIworICAgICMgTm90ZSB0aGF0IGlmIHlvdSBpbmNsdWRlIGEgdHJhaWxpbmcgLyBvbiBmYWtlbmFtZSB0aGVuIHRoZSBzZXJ2ZXIgd2lsbAorICAgICMgcmVxdWlyZSBpdCB0byBiZSBwcmVzZW50IGluIHRoZSBVUkwuICBTbyAiL2ljb25zIiBpc24ndCBhbGlhc2VkIGluIHRoaXMKKyAgICAjIGV4YW1wbGUsIG9ubHkgIi9pY29ucy8iLiAgSWYgdGhlIGZha2VuYW1lIGlzIHNsYXNoLXRlcm1pbmF0ZWQsIHRoZW4gdGhlIAorICAgICMgcmVhbG5hbWUgbXVzdCBhbHNvIGJlIHNsYXNoIHRlcm1pbmF0ZWQsIGFuZCBpZiB0aGUgZmFrZW5hbWUgb21pdHMgdGhlIAorICAgICMgdHJhaWxpbmcgc2xhc2gsIHRoZSByZWFsbmFtZSBtdXN0IGFsc28gb21pdCBpdC4KKyAgICAjCisgICAgQWxpYXMgL2ljb25zLyAiL3Vzci9sb2NhbC9hcGFjaGUvaWNvbnMvIgorCisgICAgPERpcmVjdG9yeSAiL3Vzci9sb2NhbC9hcGFjaGUvaWNvbnMiPgorICAgICAgICBPcHRpb25zIEluZGV4ZXMgTXVsdGlWaWV3cworICAgICAgICBBbGxvd092ZXJyaWRlIE5vbmUKKyAgICAgICAgT3JkZXIgYWxsb3csZGVueQorICAgICAgICBBbGxvdyBmcm9tIGFsbAorICAgIDwvRGlyZWN0b3J5PgorCisgICAgIyBUaGlzIEFsaWFzIHdpbGwgcHJvamVjdCB0aGUgb24tbGluZSBkb2N1bWVudGF0aW9uIHRyZWUgdW5kZXIgL21hbnVhbC8KKyAgICAjIGV2ZW4gaWYgeW91IGNoYW5nZSB0aGUgRG9jdW1lbnRSb290LiBDb21tZW50IGl0IGlmIHlvdSBkb24ndCB3YW50IHRvIAorICAgICMgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIG9uLWxpbmUgZG9jdW1lbnRhdGlvbi4KKyAgICAjCisgICAgQWxpYXMgL21hbnVhbC8gIi91c3IvbG9jYWwvYXBhY2hlL2h0ZG9jcy9tYW51YWwvIgorCisgICAgPERpcmVjdG9yeSAiL3Vzci9sb2NhbC9hcGFjaGUvaHRkb2NzL21hbnVhbCI+CisgICAgICAgIE9wdGlvbnMgSW5kZXhlcyBGb2xsb3dTeW1saW5rcyBNdWx0aVZpZXdzCisgICAgICAgIEFsbG93T3ZlcnJpZGUgTm9uZQorICAgICAgICBPcmRlciBhbGxvdyxkZW55CisgICAgICAgIEFsbG93IGZyb20gYWxsCisgICAgPC9EaXJlY3Rvcnk+CisKKyAgICAjCisgICAgIyBTY3JpcHRBbGlhczogVGhpcyBjb250cm9scyB3aGljaCBkaXJlY3RvcmllcyBjb250YWluIHNlcnZlciBzY3JpcHRzLgorICAgICMgU2NyaXB0QWxpYXNlcyBhcmUgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgQWxpYXNlcywgZXhjZXB0IHRoYXQKKyAgICAjIGRvY3VtZW50cyBpbiB0aGUgcmVhbG5hbWUgZGlyZWN0b3J5IGFyZSB0cmVhdGVkIGFzIGFwcGxpY2F0aW9ucyBhbmQKKyAgICAjIHJ1biBieSB0aGUgc2VydmVyIHdoZW4gcmVxdWVzdGVkIHJhdGhlciB0aGFuIGFzIGRvY3VtZW50cyBzZW50IHRvIHRoZSBjbGllbnQuCisgICAgIyBUaGUgc2FtZSBydWxlcyBhYm91dCB0cmFpbGluZyAiLyIgYXBwbHkgdG8gU2NyaXB0QWxpYXMgZGlyZWN0aXZlcyBhcyB0bworICAgICMgQWxpYXMuCisgICAgIworICAgIFNjcmlwdEFsaWFzIC9jZ2ktYmluLyAiL3Vzci9sb2NhbC9hcGFjaGUvY2dpLWJpbi8iCisKKyAgICAjCisgICAgIyAiL3Vzci9sb2NhbC9hcGFjaGUvY2dpLWJpbiIgc2hvdWxkIGJlIGNoYW5nZWQgdG8gd2hhdGV2ZXIgeW91ciBTY3JpcHRBbGlhc2VkCisgICAgIyBDR0kgZGlyZWN0b3J5IGV4aXN0cywgaWYgeW91IGhhdmUgdGhhdCBjb25maWd1cmVkLgorICAgICMKKyAgICA8RGlyZWN0b3J5ICIvdXNyL2xvY2FsL2FwYWNoZS9jZ2ktYmluIj4KKyAgICAgICAgQWxsb3dPdmVycmlkZSBOb25lCisgICAgICAgIE9wdGlvbnMgTm9uZQorICAgICAgICBPcmRlciBhbGxvdyxkZW55CisgICAgICAgIEFsbG93IGZyb20gYWxsCisgICAgPC9EaXJlY3Rvcnk+CisKKzwvSWZNb2R1bGU+CisjIEVuZCBvZiBhbGlhc2VzLgorCisjCisjIFJlZGlyZWN0IGFsbG93cyB5b3UgdG8gdGVsbCBjbGllbnRzIGFib3V0IGRvY3VtZW50cyB3aGljaCB1c2VkIHRvIGV4aXN0IGluCisjIHlvdXIgc2VydmVyJ3MgbmFtZXNwYWNlLCBidXQgZG8gbm90IGFueW1vcmUuIFRoaXMgYWxsb3dzIHlvdSB0byB0ZWxsIHRoZQorIyBjbGllbnRzIHdoZXJlIHRvIGxvb2sgZm9yIHRoZSByZWxvY2F0ZWQgZG9jdW1lbnQuCisjIEZvcm1hdDogUmVkaXJlY3Qgb2xkLVVSSSBuZXctVVJMCisjCisKKyMKKyMgRGlyZWN0aXZlcyBjb250cm9sbGluZyB0aGUgZGlzcGxheSBvZiBzZXJ2ZXItZ2VuZXJhdGVkIGRpcmVjdG9yeSBsaXN0aW5ncy4KKyMKKzxJZk1vZHVsZSBtb2RfYXV0b2luZGV4LmM+CisKKyAgICAjCisgICAgIyBGYW5jeUluZGV4aW5nIGlzIHdoZXRoZXIgeW91IHdhbnQgZmFuY3kgZGlyZWN0b3J5IGluZGV4aW5nIG9yIHN0YW5kYXJkCisgICAgIworICAgIEluZGV4T3B0aW9ucyBGYW5jeUluZGV4aW5nCisKKyAgICAjCisgICAgIyBBZGRJY29uKiBkaXJlY3RpdmVzIHRlbGwgdGhlIHNlcnZlciB3aGljaCBpY29uIHRvIHNob3cgZm9yIGRpZmZlcmVudAorICAgICMgZmlsZXMgb3IgZmlsZW5hbWUgZXh0ZW5zaW9ucy4gIFRoZXNlIGFyZSBvbmx5IGRpc3BsYXllZCBmb3IKKyAgICAjIEZhbmN5SW5kZXhlZCBkaXJlY3Rvcmllcy4KKyAgICAjCisgICAgQWRkSWNvbkJ5RW5jb2RpbmcgKENNUCwvaWNvbnMvY29tcHJlc3NlZC5naWYpIHgtY29tcHJlc3MgeC1nemlwCisKKyAgICBBZGRJY29uQnlUeXBlIChUWFQsL2ljb25zL3RleHQuZ2lmKSB0ZXh0LyoKKyAgICBBZGRJY29uQnlUeXBlIChJTUcsL2ljb25zL2ltYWdlMi5naWYpIGltYWdlLyoKKyAgICBBZGRJY29uQnlUeXBlIChTTkQsL2ljb25zL3NvdW5kMi5naWYpIGF1ZGlvLyoKKyAgICBBZGRJY29uQnlUeXBlIChWSUQsL2ljb25zL21vdmllLmdpZikgdmlkZW8vKgorCisgICAgQWRkSWNvbiAvaWNvbnMvYmluYXJ5LmdpZiAuYmluIC5leGUKKyAgICBBZGRJY29uIC9pY29ucy9iaW5oZXguZ2lmIC5ocXgKKyAgICBBZGRJY29uIC9pY29ucy90YXIuZ2lmIC50YXIKKyAgICBBZGRJY29uIC9pY29ucy93b3JsZDIuZ2lmIC53cmwgLndybC5neiAudnJtbCAudnJtIC5pdgorICAgIEFkZEljb24gL2ljb25zL2NvbXByZXNzZWQuZ2lmIC5aIC56IC50Z3ogLmd6IC56aXAKKyAgICBBZGRJY29uIC9pY29ucy9hLmdpZiAucHMgLmFpIC5lcHMKKyAgICBBZGRJY29uIC9pY29ucy9sYXlvdXQuZ2lmIC5odG1sIC5zaHRtbCAuaHRtIC5wZGYKKyAgICBBZGRJY29uIC9pY29ucy90ZXh0LmdpZiAudHh0CisgICAgQWRkSWNvbiAvaWNvbnMvYy5naWYgLmMKKyAgICBBZGRJY29uIC9pY29ucy9wLmdpZiAucGwgLnB5CisgICAgQWRkSWNvbiAvaWNvbnMvZi5naWYgLmZvcgorICAgIEFkZEljb24gL2ljb25zL2R2aS5naWYgLmR2aQorICAgIEFkZEljb24gL2ljb25zL3V1ZW5jb2RlZC5naWYgLnV1CisgICAgQWRkSWNvbiAvaWNvbnMvc2NyaXB0LmdpZiAuY29uZiAuc2ggLnNoYXIgLmNzaCAua3NoIC50Y2wKKyAgICBBZGRJY29uIC9pY29ucy90ZXguZ2lmIC50ZXgKKyAgICBBZGRJY29uIC9pY29ucy9ib21iLmdpZiBjb3JlCisKKyAgICBBZGRJY29uIC9pY29ucy9iYWNrLmdpZiAuLgorICAgIEFkZEljb24gL2ljb25zL2hhbmQucmlnaHQuZ2lmIFJFQURNRQorICAgIEFkZEljb24gL2ljb25zL2ZvbGRlci5naWYgXl5ESVJFQ1RPUlleXgorICAgIEFkZEljb24gL2ljb25zL2JsYW5rLmdpZiBeXkJMQU5LSUNPTl5eCisKKyAgICAjCisgICAgIyBEZWZhdWx0SWNvbiBpcyB3aGljaCBpY29uIHRvIHNob3cgZm9yIGZpbGVzIHdoaWNoIGRvIG5vdCBoYXZlIGFuIGljb24KKyAgICAjIGV4cGxpY2l0bHkgc2V0LgorICAgICMKKyAgICBEZWZhdWx0SWNvbiAvaWNvbnMvdW5rbm93bi5naWYKKworICAgICMKKyAgICAjIEFkZERlc2NyaXB0aW9uIGFsbG93cyB5b3UgdG8gcGxhY2UgYSBzaG9ydCBkZXNjcmlwdGlvbiBhZnRlciBhIGZpbGUgaW4KKyAgICAjIHNlcnZlci1nZW5lcmF0ZWQgaW5kZXhlcy4gIFRoZXNlIGFyZSBvbmx5IGRpc3BsYXllZCBmb3IgRmFuY3lJbmRleGVkCisgICAgIyBkaXJlY3Rvcmllcy4KKyAgICAjIEZvcm1hdDogQWRkRGVzY3JpcHRpb24gImRlc2NyaXB0aW9uIiBmaWxlbmFtZQorICAgICMKKyAgICAjQWRkRGVzY3JpcHRpb24gIkdaSVAgY29tcHJlc3NlZCBkb2N1bWVudCIgLmd6CisgICAgI0FkZERlc2NyaXB0aW9uICJ0YXIgYXJjaGl2ZSIgLnRhcgorICAgICNBZGREZXNjcmlwdGlvbiAiR1pJUCBjb21wcmVzc2VkIHRhciBhcmNoaXZlIiAudGd6CisKKyAgICAjCisgICAgIyBSZWFkbWVOYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBSRUFETUUgZmlsZSB0aGUgc2VydmVyIHdpbGwgbG9vayBmb3IgYnkKKyAgICAjIGRlZmF1bHQsIGFuZCBhcHBlbmQgdG8gZGlyZWN0b3J5IGxpc3RpbmdzLgorICAgICMKKyAgICAjIEhlYWRlck5hbWUgaXMgdGhlIG5hbWUgb2YgYSBmaWxlIHdoaWNoIHNob3VsZCBiZSBwcmVwZW5kZWQgdG8KKyAgICAjIGRpcmVjdG9yeSBpbmRleGVzLiAKKyAgICAjCisgICAgIyBJZiBNdWx0aVZpZXdzIGFyZSBhbW9uZ3N0IHRoZSBPcHRpb25zIGluIGVmZmVjdCwgdGhlIHNlcnZlciB3aWxsCisgICAgIyBmaXJzdCBsb29rIGZvciBuYW1lLmh0bWwgYW5kIGluY2x1ZGUgaXQgaWYgZm91bmQuICBJZiBuYW1lLmh0bWwKKyAgICAjIGRvZXNuJ3QgZXhpc3QsIHRoZSBzZXJ2ZXIgd2lsbCB0aGVuIGxvb2sgZm9yIG5hbWUudHh0IGFuZCBpbmNsdWRlCisgICAgIyBpdCBhcyBwbGFpbnRleHQgaWYgZm91bmQuCisgICAgIworICAgIFJlYWRtZU5hbWUgUkVBRE1FCisgICAgSGVhZGVyTmFtZSBIRUFERVIKKworICAgICMKKyAgICAjIEluZGV4SWdub3JlIGlzIGEgc2V0IG9mIGZpbGVuYW1lcyB3aGljaCBkaXJlY3RvcnkgaW5kZXhpbmcgc2hvdWxkIGlnbm9yZQorICAgICMgYW5kIG5vdCBpbmNsdWRlIGluIHRoZSBsaXN0aW5nLiAgU2hlbGwtc3R5bGUgd2lsZGNhcmRpbmcgaXMgcGVybWl0dGVkLgorICAgICMKKyAgICBJbmRleElnbm9yZSAuPz8qICp+ICojIEhFQURFUiogUkVBRE1FKiBSQ1MgQ1ZTICosdiAqLHQKKworPC9JZk1vZHVsZT4KKyMgRW5kIG9mIGluZGV4aW5nIGRpcmVjdGl2ZXMuCisKKyMKKyMgRG9jdW1lbnQgdHlwZXMuCisjCis8SWZNb2R1bGUgbW9kX21pbWUuYz4KKworICAgICMKKyAgICAjIEFkZEVuY29kaW5nIGFsbG93cyB5b3UgdG8gaGF2ZSBjZXJ0YWluIGJyb3dzZXJzIChNb3NhaWMvWCAyLjErKSB1bmNvbXByZXNzCisgICAgIyBpbmZvcm1hdGlvbiBvbiB0aGUgZmx5LiBOb3RlOiBOb3QgYWxsIGJyb3dzZXJzIHN1cHBvcnQgdGhpcy4KKyAgICAjIERlc3BpdGUgdGhlIG5hbWUgc2ltaWxhcml0eSwgdGhlIGZvbGxvd2luZyBBZGQqIGRpcmVjdGl2ZXMgaGF2ZSBub3RoaW5nCisgICAgIyB0byBkbyB3aXRoIHRoZSBGYW5jeUluZGV4aW5nIGN1c3RvbWl6YXRpb24gZGlyZWN0aXZlcyBhYm92ZS4KKyAgICAjCisgICAgQWRkRW5jb2RpbmcgeC1jb21wcmVzcyBaCisgICAgQWRkRW5jb2RpbmcgeC1nemlwIGd6IHRnegorCisgICAgIworICAgICMgQWRkTGFuZ3VhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBsYW5ndWFnZSBvZiBhIGRvY3VtZW50LiBZb3UgY2FuCisgICAgIyB0aGVuIHVzZSBjb250ZW50IG5lZ290aWF0aW9uIHRvIGdpdmUgYSBicm93c2VyIGEgZmlsZSBpbiBhIGxhbmd1YWdlCisgICAgIyBpdCBjYW4gdW5kZXJzdGFuZC4gIAorICAgICMKKyAgICAjIE5vdGUgMTogVGhlIHN1ZmZpeCBkb2VzIG5vdCBoYXZlIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBsYW5ndWFnZSAKKyAgICAjIGtleXdvcmQgLS0tIHRob3NlIHdpdGggZG9jdW1lbnRzIGluIFBvbGlzaCAod2hvc2UgbmV0LXN0YW5kYXJkIAorICAgICMgbGFuZ3VhZ2UgY29kZSBpcyBwbCkgbWF5IHdpc2ggdG8gdXNlICJBZGRMYW5ndWFnZSBwbCAucG8iIHRvIAorICAgICMgYXZvaWQgdGhlIGFtYmlndWl0eSB3aXRoIHRoZSBjb21tb24gc3VmZml4IGZvciBwZXJsIHNjcmlwdHMuCisgICAgIworICAgICMgTm90ZSAyOiBUaGUgZXhhbXBsZSBlbnRyaWVzIGJlbG93IGlsbHVzdHJhdGUgdGhhdCBpbiBxdWl0ZQorICAgICMgc29tZSBjYXNlcyB0aGUgdHdvIGNoYXJhY3RlciAnTGFuZ3VhZ2UnIGFiYnJldmlhdGlvbiBpcyBub3QKKyAgICAjIGlkZW50aWNhbCB0byB0aGUgdHdvIGNoYXJhY3RlciAnQ291bnRyeScgY29kZSBmb3IgaXRzIGNvdW50cnksCisgICAgIyBFLmcuICdEYW5tYXJrL2RrJyB2ZXJzdXMgJ0RhbmlzaC9kYScuCisgICAgIworICAgICMgTm90ZSAzOiBJbiB0aGUgY2FzZSBvZiAnbHR6JyB3ZSB2aW9sYXRlIHRoZSBSRkMgYnkgdXNpbmcgYSB0aHJlZSBjaGFyIAorICAgICMgc3BlY2lmaWVyLiBCdXQgdGhlcmUgaXMgJ3dvcmsgaW4gcHJvZ3Jlc3MnIHRvIGZpeCB0aGlzIGFuZCBnZXQgCisgICAgIyB0aGUgcmVmZXJlbmNlIGRhdGEgZm9yIHJmYzE3NjYgY2xlYW5lZCB1cC4KKyAgICAjCisgICAgIyBEYW5pc2ggKGRhKSAtIER1dGNoIChubCkgLSBFbmdsaXNoIChlbikgLSBFc3RvbmlhbiAoZWUpCisgICAgIyBGcmVuY2ggKGZyKSAtIEdlcm1hbiAoZGUpIC0gR3JlZWstTW9kZXJuIChlbCkKKyAgICAjIEl0YWxpYW4gKGl0KSAtIEtvcmVhbiAoa3IpIC0gTm9yd2VnaWFuIChubykgLSBOb3J3ZWdpYW4gTnlub3JzayAobm4pCisgICAgIyBQb3J0dWdlc2UgKHB0KSAtIEx1eGVtYm91cmdlb2lzKiAobHR6KQorICAgICMgU3BhbmlzaCAoZXMpIC0gU3dlZGlzaCAoc3YpIC0gQ2F0YWxhbiAoY2EpIC0gQ3plY2goY3opCisgICAgIyBQb2xpc2ggKHBsKSAtIEJyYXppbGlhbiBQb3J0dWd1ZXNlIChwdC1icikgLSBKYXBhbmVzZSAoamEpCisgICAgIyBSdXNzaWFuIChydSkKKyAgICAjCisgICAgQWRkTGFuZ3VhZ2UgZGEgLmRrCisgICAgQWRkTGFuZ3VhZ2UgbmwgLm5sCisgICAgQWRkTGFuZ3VhZ2UgZW4gLmVuCisgICAgQWRkTGFuZ3VhZ2UgZXQgLmVlCisgICAgQWRkTGFuZ3VhZ2UgZnIgLmZyCisgICAgQWRkTGFuZ3VhZ2UgZGUgLmRlCisgICAgQWRkTGFuZ3VhZ2UgZWwgLmVsCisgICAgQWRkTGFuZ3VhZ2UgaGUgLmhlCisgICAgQWRkQ2hhcnNldCBJU08tODg1OS04IC5pc284ODU5LTgKKyAgICBBZGRMYW5ndWFnZSBpdCAuaXQKKyAgICBBZGRMYW5ndWFnZSBqYSAuamEKKyAgICBBZGRDaGFyc2V0IElTTy0yMDIyLUpQIC5qaXMKKyAgICBBZGRMYW5ndWFnZSBrciAua3IKKyAgICBBZGRDaGFyc2V0IElTTy0yMDIyLUtSIC5pc28ta3IKKyAgICBBZGRMYW5ndWFnZSBubiAubm4KKyAgICBBZGRMYW5ndWFnZSBubyAubm8KKyAgICBBZGRMYW5ndWFnZSBwbCAucG8KKyAgICBBZGRDaGFyc2V0IElTTy04ODU5LTIgLmlzby1wbAorICAgIEFkZExhbmd1YWdlIHB0IC5wdAorICAgIEFkZExhbmd1YWdlIHB0LWJyIC5wdC1icgorICAgIEFkZExhbmd1YWdlIGx0eiAubHUKKyAgICBBZGRMYW5ndWFnZSBjYSAuY2EKKyAgICBBZGRMYW5ndWFnZSBlcyAuZXMKKyAgICBBZGRMYW5ndWFnZSBzdiAuc3YKKyAgICBBZGRMYW5ndWFnZSBjeiAuY3oKKyAgICBBZGRMYW5ndWFnZSBydSAucnUKKyAgICBBZGRMYW5ndWFnZSB6aC10dyAudHcKKyAgICBBZGRMYW5ndWFnZSB0dyAudHcKKyAgICBBZGRDaGFyc2V0IEJpZzUgICAgICAgICAuQmlnNSAgICAuYmlnNQorICAgIEFkZENoYXJzZXQgV0lORE9XUy0xMjUxIC5jcC0xMjUxCisgICAgQWRkQ2hhcnNldCBDUDg2NiAgICAgICAgLmNwODY2CisgICAgQWRkQ2hhcnNldCBJU08tODg1OS01ICAgLmlzby1ydQorICAgIEFkZENoYXJzZXQgS09JOC1SICAgICAgIC5rb2k4LXIKKyAgICBBZGRDaGFyc2V0IFVDUy0yICAgICAgICAudWNzMgorICAgIEFkZENoYXJzZXQgVUNTLTQgICAgICAgIC51Y3M0CisgICAgQWRkQ2hhcnNldCBVVEYtOCAgICAgICAgLnV0ZjgKKworICAgICMgTGFuZ3VhZ2VQcmlvcml0eSBhbGxvd3MgeW91IHRvIGdpdmUgcHJlY2VkZW5jZSB0byBzb21lIGxhbmd1YWdlcworICAgICMgaW4gY2FzZSBvZiBhIHRpZSBkdXJpbmcgY29udGVudCBuZWdvdGlhdGlvbi4KKyAgICAjCisgICAgIyBKdXN0IGxpc3QgdGhlIGxhbmd1YWdlcyBpbiBkZWNyZWFzaW5nIG9yZGVyIG9mIHByZWZlcmVuY2UuIFdlIGhhdmUKKyAgICAjIG1vcmUgb3IgbGVzcyBhbHBoYWJldGl6ZWQgdGhlbSBoZXJlLiBZb3UgcHJvYmFibHkgd2FudCB0byBjaGFuZ2UgdGhpcy4KKyAgICAjCisgICAgPElmTW9kdWxlIG1vZF9uZWdvdGlhdGlvbi5jPgorICAgICAgICBMYW5ndWFnZVByaW9yaXR5IGVuIGRhIG5sIGV0IGZyIGRlIGVsIGl0IGphIGtyIG5vIHBsIHB0IHB0LWJyIHJ1IGx0eiBjYSBlcyBzdiB0dworICAgIDwvSWZNb2R1bGU+CisKKyAgICAjCisgICAgIyBBZGRUeXBlIGFsbG93cyB5b3UgdG8gdHdlYWsgbWltZS50eXBlcyB3aXRob3V0IGFjdHVhbGx5IGVkaXRpbmcgaXQsIG9yIHRvCisgICAgIyBtYWtlIGNlcnRhaW4gZmlsZXMgdG8gYmUgY2VydGFpbiB0eXBlcy4KKyAgICAjCisgICAgQWRkVHlwZSBhcHBsaWNhdGlvbi94LXRhciAudGd6CisKKyAgICAjCisgICAgIyBBZGRIYW5kbGVyIGFsbG93cyB5b3UgdG8gbWFwIGNlcnRhaW4gZmlsZSBleHRlbnNpb25zIHRvICJoYW5kbGVycyIsCisgICAgIyBhY3Rpb25zIHVucmVsYXRlZCB0byBmaWxldHlwZS4gVGhlc2UgY2FuIGJlIGVpdGhlciBidWlsdCBpbnRvIHRoZSBzZXJ2ZXIKKyAgICAjIG9yIGFkZGVkIHdpdGggdGhlIEFjdGlvbiBjb21tYW5kIChzZWUgYmVsb3cpCisgICAgIworICAgICMgSWYgeW91IHdhbnQgdG8gdXNlIHNlcnZlciBzaWRlIGluY2x1ZGVzLCBvciBDR0kgb3V0c2lkZQorICAgICMgU2NyaXB0QWxpYXNlZCBkaXJlY3RvcmllcywgdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZXMuCisgICAgIworICAgICMgVG8gdXNlIENHSSBzY3JpcHRzOgorICAgICMKKyAgICAjQWRkSGFuZGxlciBjZ2ktc2NyaXB0IC5jZ2kKKworICAgICMKKyAgICAjIFRvIHVzZSBzZXJ2ZXItcGFyc2VkIEhUTUwgZmlsZXMKKyAgICAjCisgICAgI0FkZFR5cGUgdGV4dC9odG1sIC5zaHRtbAorICAgICNBZGRIYW5kbGVyIHNlcnZlci1wYXJzZWQgLnNodG1sCisKKyAgICAjCisgICAgIyBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lIHRvIGVuYWJsZSBBcGFjaGUncyBzZW5kLWFzaXMgSFRUUCBmaWxlCisgICAgIyBmZWF0dXJlCisgICAgIworICAgICNBZGRIYW5kbGVyIHNlbmQtYXMtaXMgYXNpcworCisgICAgIworICAgICMgSWYgeW91IHdpc2ggdG8gdXNlIHNlcnZlci1wYXJzZWQgaW1hZ2VtYXAgZmlsZXMsIHVzZQorICAgICMKKyAgICAjQWRkSGFuZGxlciBpbWFwLWZpbGUgbWFwCisKKyAgICAjCisgICAgIyBUbyBlbmFibGUgdHlwZSBtYXBzLCB5b3UgbWlnaHQgd2FudCB0byB1c2UKKyAgICAjCisgICAgI0FkZEhhbmRsZXIgdHlwZS1tYXAgdmFyCisKKzwvSWZNb2R1bGU+CisjIEVuZCBvZiBkb2N1bWVudCB0eXBlcy4KKworIworIyBBY3Rpb24gbGV0cyB5b3UgZGVmaW5lIG1lZGlhIHR5cGVzIHRoYXQgd2lsbCBleGVjdXRlIGEgc2NyaXB0IHdoZW5ldmVyCisjIGEgbWF0Y2hpbmcgZmlsZSBpcyBjYWxsZWQuIFRoaXMgZWxpbWluYXRlcyB0aGUgbmVlZCBmb3IgcmVwZWF0ZWQgVVJMCisjIHBhdGhuYW1lcyBmb3Igb2Z0LXVzZWQgQ0dJIGZpbGUgcHJvY2Vzc29ycy4KKyMgRm9ybWF0OiBBY3Rpb24gbWVkaWEvdHlwZSAvY2dpLXNjcmlwdC9sb2NhdGlvbgorIyBGb3JtYXQ6IEFjdGlvbiBoYW5kbGVyLW5hbWUgL2NnaS1zY3JpcHQvbG9jYXRpb24KKyMKKworIworIyBNZXRhRGlyOiBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBBcGFjaGUgY2FuIGZpbmQKKyMgbWV0YSBpbmZvcm1hdGlvbiBmaWxlcy4gVGhlc2UgZmlsZXMgY29udGFpbiBhZGRpdGlvbmFsIEhUVFAgaGVhZGVycworIyB0byBpbmNsdWRlIHdoZW4gc2VuZGluZyB0aGUgZG9jdW1lbnQKKyMKKyNNZXRhRGlyIC53ZWIKKworIworIyBNZXRhU3VmZml4OiBzcGVjaWZpZXMgdGhlIGZpbGUgbmFtZSBzdWZmaXggZm9yIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisjIG1ldGEgaW5mb3JtYXRpb24uCisjCisjTWV0YVN1ZmZpeCAubWV0YQorCisjCisjIEN1c3RvbWl6YWJsZSBlcnJvciByZXNwb25zZSAoQXBhY2hlIHN0eWxlKQorIyAgdGhlc2UgY29tZSBpbiB0aHJlZSBmbGF2b3JzCisjCisjICAgIDEpIHBsYWluIHRleHQKKyNFcnJvckRvY3VtZW50IDUwMCAiVGhlIHNlcnZlciBtYWRlIGEgYm9vIGJvby4KKyMgIG4uYi4gIHRoZSBzaW5nbGUgbGVhZGluZyAoIikgbWFya3MgaXQgYXMgdGV4dCwgaXQgZG9lcyBub3QgZ2V0IG91dHB1dAorIworIyAgICAyKSBsb2NhbCByZWRpcmVjdHMKKyNFcnJvckRvY3VtZW50IDQwNCAvbWlzc2luZy5odG1sCisjICB0byByZWRpcmVjdCB0byBsb2NhbCBVUkwgL21pc3NpbmcuaHRtbAorI0Vycm9yRG9jdW1lbnQgNDA0IC9jZ2ktYmluL21pc3NpbmdfaGFuZGxlci5wbAorIyAgTi5CLjogWW91IGNhbiByZWRpcmVjdCB0byBhIHNjcmlwdCBvciBhIGRvY3VtZW50IHVzaW5nIHNlcnZlci1zaWRlLWluY2x1ZGVzLgorIworIyAgICAzKSBleHRlcm5hbCByZWRpcmVjdHMKKyNFcnJvckRvY3VtZW50IDQwMiBodHRwOi8vc29tZS5vdGhlci1zZXJ2ZXIuY29tL3N1YnNjcmlwdGlvbl9pbmZvLmh0bWwKKyMgIE4uQi46IE1hbnkgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmFsCisjICByZXF1ZXN0IHdpbGwgKm5vdCogYmUgYXZhaWxhYmxlIHRvIHN1Y2ggYSBzY3JpcHQuCisKKyMKKyMgQ3VzdG9taXplIGJlaGF2aW91ciBiYXNlZCBvbiB0aGUgYnJvd3NlcgorIworPElmTW9kdWxlIG1vZF9zZXRlbnZpZi5jPgorCisgICAgIworICAgICMgVGhlIGZvbGxvd2luZyBkaXJlY3RpdmVzIG1vZGlmeSBub3JtYWwgSFRUUCByZXNwb25zZSBiZWhhdmlvci4KKyAgICAjIFRoZSBmaXJzdCBkaXJlY3RpdmUgZGlzYWJsZXMga2VlcGFsaXZlIGZvciBOZXRzY2FwZSAyLnggYW5kIGJyb3dzZXJzIHRoYXQKKyAgICAjIHNwb29mIGl0LiBUaGVyZSBhcmUga25vd24gcHJvYmxlbXMgd2l0aCB0aGVzZSBicm93c2VyIGltcGxlbWVudGF0aW9ucy4KKyAgICAjIFRoZSBzZWNvbmQgZGlyZWN0aXZlIGlzIGZvciBNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIgNC4wYjIKKyAgICAjIHdoaWNoIGhhcyBhIGJyb2tlbiBIVFRQLzEuMSBpbXBsZW1lbnRhdGlvbiBhbmQgZG9lcyBub3QgcHJvcGVybHkKKyAgICAjIHN1cHBvcnQga2VlcGFsaXZlIHdoZW4gaXQgaXMgdXNlZCBvbiAzMDEgb3IgMzAyIChyZWRpcmVjdCkgcmVzcG9uc2VzLgorICAgICMKKyAgICBCcm93c2VyTWF0Y2ggIk1vemlsbGEvMiIgbm9rZWVwYWxpdmUKKyAgICBCcm93c2VyTWF0Y2ggIk1TSUUgNFwuMGIyOyIgbm9rZWVwYWxpdmUgZG93bmdyYWRlLTEuMCBmb3JjZS1yZXNwb25zZS0xLjAKKworICAgICMKKyAgICAjIFRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlIGRpc2FibGVzIEhUVFAvMS4xIHJlc3BvbnNlcyB0byBicm93c2VycyB3aGljaAorICAgICMgYXJlIGluIHZpb2xhdGlvbiBvZiB0aGUgSFRUUC8xLjAgc3BlYyBieSBub3QgYmVpbmcgYWJsZSB0byBncm9rIGEKKyAgICAjIGJhc2ljIDEuMSByZXNwb25zZS4KKyAgICAjCisgICAgQnJvd3Nlck1hdGNoICJSZWFsUGxheWVyIDRcLjAiIGZvcmNlLXJlc3BvbnNlLTEuMAorICAgIEJyb3dzZXJNYXRjaCAiSmF2YS8xXC4wIiBmb3JjZS1yZXNwb25zZS0xLjAKKyAgICBCcm93c2VyTWF0Y2ggIkpESy8xXC4wIiBmb3JjZS1yZXNwb25zZS0xLjAKKworPC9JZk1vZHVsZT4KKyMgRW5kIG9mIGJyb3dzZXIgY3VzdG9taXphdGlvbiBkaXJlY3RpdmVzCisKKyMKKyMgQWxsb3cgc2VydmVyIHN0YXR1cyByZXBvcnRzLCB3aXRoIHRoZSBVUkwgb2YgaHR0cDovL3NlcnZlcm5hbWUvc2VydmVyLXN0YXR1cworIyBDaGFuZ2UgdGhlICIueW91ci1kb21haW4uY29tIiB0byBtYXRjaCB5b3VyIGRvbWFpbiB0byBlbmFibGUuCisjCisjPExvY2F0aW9uIC9zZXJ2ZXItc3RhdHVzPgorIyAgICBTZXRIYW5kbGVyIHNlcnZlci1zdGF0dXMKKyMgICAgT3JkZXIgZGVueSxhbGxvdworIyAgICBEZW55IGZyb20gYWxsCisjICAgIEFsbG93IGZyb20gLnlvdXItZG9tYWluLmNvbQorIzwvTG9jYXRpb24+CisKKyMKKyMgQWxsb3cgcmVtb3RlIHNlcnZlciBjb25maWd1cmF0aW9uIHJlcG9ydHMsIHdpdGggdGhlIFVSTCBvZgorIyBodHRwOi8vc2VydmVybmFtZS9zZXJ2ZXItaW5mbyAocmVxdWlyZXMgdGhhdCBtb2RfaW5mby5jIGJlIGxvYWRlZCkuCisjIENoYW5nZSB0aGUgIi55b3VyLWRvbWFpbi5jb20iIHRvIG1hdGNoIHlvdXIgZG9tYWluIHRvIGVuYWJsZS4KKyMKKyM8TG9jYXRpb24gL3NlcnZlci1pbmZvPgorIyAgICBTZXRIYW5kbGVyIHNlcnZlci1pbmZvCisjICAgIE9yZGVyIGRlbnksYWxsb3cKKyMgICAgRGVueSBmcm9tIGFsbAorIyAgICBBbGxvdyBmcm9tIC55b3VyLWRvbWFpbi5jb20KKyM8L0xvY2F0aW9uPgorCisjCisjIFRoZXJlIGhhdmUgYmVlbiByZXBvcnRzIG9mIHBlb3BsZSB0cnlpbmcgdG8gYWJ1c2UgYW4gb2xkIGJ1ZyBmcm9tIHByZS0xLjEKKyMgZGF5cy4gIFRoaXMgYnVnIGludm9sdmVkIGEgQ0dJIHNjcmlwdCBkaXN0cmlidXRlZCBhcyBhIHBhcnQgb2YgQXBhY2hlLgorIyBCeSB1bmNvbW1lbnRpbmcgdGhlc2UgbGluZXMgeW91IGNhbiByZWRpcmVjdCB0aGVzZSBhdHRhY2tzIHRvIGEgbG9nZ2luZyAKKyMgc2NyaXB0IG9uIHBoZi5hcGFjaGUub3JnLiAgT3IsIHlvdSBjYW4gcmVjb3JkIHRoZW0geW91cnNlbGYsIHVzaW5nIHRoZSBzY3JpcHQKKyMgc3VwcG9ydC9waGZfYWJ1c2VfbG9nLmNnaS4KKyMKKyM8TG9jYXRpb24gL2NnaS1iaW4vcGhmKj4KKyMgICAgRGVueSBmcm9tIGFsbAorIyAgICBFcnJvckRvY3VtZW50IDQwMyBodHRwOi8vcGhmLmFwYWNoZS5vcmcvcGhmX2FidXNlX2xvZy5jZ2kKKyM8L0xvY2F0aW9uPgorCisjCisjIFByb3h5IFNlcnZlciBkaXJlY3RpdmVzLiBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lcyB0bworIyBlbmFibGUgdGhlIHByb3h5IHNlcnZlcjoKKyMKKyM8SWZNb2R1bGUgbW9kX3Byb3h5LmM+CisjICAgIFByb3h5UmVxdWVzdHMgT24KKworIyAgICA8RGlyZWN0b3J5IHByb3h5Oio+CisjICAgICAgICBPcmRlciBkZW55LGFsbG93CisjICAgICAgICBEZW55IGZyb20gYWxsCisjICAgICAgICBBbGxvdyBmcm9tIC55b3VyLWRvbWFpbi5jb20KKyMgICAgPC9EaXJlY3Rvcnk+CisKKyAgICAjCisgICAgIyBFbmFibGUvZGlzYWJsZSB0aGUgaGFuZGxpbmcgb2YgSFRUUC8xLjEgIlZpYToiIGhlYWRlcnMuCisgICAgIyAoIkZ1bGwiIGFkZHMgdGhlIHNlcnZlciB2ZXJzaW9uOyAiQmxvY2siIHJlbW92ZXMgYWxsIG91dGdvaW5nIFZpYTogaGVhZGVycykKKyAgICAjIFNldCB0byBvbmUgb2Y6IE9mZiB8IE9uIHwgRnVsbCB8IEJsb2NrCisgICAgIworIyAgICBQcm94eVZpYSBPbgorCisgICAgIworICAgICMgVG8gZW5hYmxlIHRoZSBjYWNoZSBhcyB3ZWxsLCBlZGl0IGFuZCB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lczoKKyAgICAjIChubyBjYWNoZWluZyB3aXRob3V0IENhY2hlUm9vdCkKKyAgICAjCisjICAgIENhY2hlUm9vdCAiL3Vzci9sb2NhbC9hcGFjaGUvcHJveHkiCisjICAgIENhY2hlU2l6ZSA1CisjICAgIENhY2hlR2NJbnRlcnZhbCA0CisjICAgIENhY2hlTWF4RXhwaXJlIDI0CisjICAgIENhY2hlTGFzdE1vZGlmaWVkRmFjdG9yIDAuMQorIyAgICBDYWNoZURlZmF1bHRFeHBpcmUgMQorIyAgICBOb0NhY2hlIGEtZG9tYWluLmNvbSBhbm90aGVyLWRvbWFpbi5lZHUgam9lcy5nYXJhZ2Utc2FsZS5jb20KKworIzwvSWZNb2R1bGU+CisjIEVuZCBvZiBwcm94eSBkaXJlY3RpdmVzLgorCisjIyMgU2VjdGlvbiAzOiBWaXJ0dWFsIEhvc3RzCisjCisjIFZpcnR1YWxIb3N0OiBJZiB5b3Ugd2FudCB0byBtYWludGFpbiBtdWx0aXBsZSBkb21haW5zL2hvc3RuYW1lcyBvbiB5b3VyCisjIG1hY2hpbmUgeW91IGNhbiBzZXR1cCBWaXJ0dWFsSG9zdCBjb250YWluZXJzIGZvciB0aGVtLiBNb3N0IGNvbmZpZ3VyYXRpb25zCisjIHVzZSBvbmx5IG5hbWUtYmFzZWQgdmlydHVhbCBob3N0cyBzbyB0aGUgc2VydmVyIGRvZXNuJ3QgbmVlZCB0byB3b3JyeSBhYm91dAorIyBJUCBhZGRyZXNzZXMuIFRoaXMgaXMgaW5kaWNhdGVkIGJ5IHRoZSBhc3Rlcmlza3MgaW4gdGhlIGRpcmVjdGl2ZXMgYmVsb3cuCisjCisjIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50YXRpb24gYXQgPFVSTDpodHRwOi8vd3d3LmFwYWNoZS5vcmcvZG9jcy92aG9zdHMvPgorIyBmb3IgZnVydGhlciBkZXRhaWxzIGJlZm9yZSB5b3UgdHJ5IHRvIHNldHVwIHZpcnR1YWwgaG9zdHMuCisjCisjIFlvdSBtYXkgdXNlIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9uICctUycgdG8gdmVyaWZ5IHlvdXIgdmlydHVhbCBob3N0CisjIGNvbmZpZ3VyYXRpb24uCisKKyMKKyMgVXNlIG5hbWUtYmFzZWQgdmlydHVhbCBob3N0aW5nLgorIworI05hbWVWaXJ0dWFsSG9zdCAqCisKKyMKKyMgVmlydHVhbEhvc3QgZXhhbXBsZToKKyMgQWxtb3N0IGFueSBBcGFjaGUgZGlyZWN0aXZlIG1heSBnbyBpbnRvIGEgVmlydHVhbEhvc3QgY29udGFpbmVyLgorIyBUaGUgZmlyc3QgVmlydHVhbEhvc3Qgc2VjdGlvbiBpcyB1c2VkIGZvciByZXF1ZXN0cyB3aXRob3V0IGEga25vd24KKyMgc2VydmVyIG5hbWUuCisjCisjPFZpcnR1YWxIb3N0ICo+CisjICAgIFNlcnZlckFkbWluIHdlYm1hc3RlckBkdW1teS1ob3N0LmV4YW1wbGUuY29tCisjICAgIERvY3VtZW50Um9vdCAvd3d3L2RvY3MvZHVtbXktaG9zdC5leGFtcGxlLmNvbQorIyAgICBTZXJ2ZXJOYW1lIGR1bW15LWhvc3QuZXhhbXBsZS5jb20KKyMgICAgRXJyb3JMb2cgbG9ncy9kdW1teS1ob3N0LmV4YW1wbGUuY29tLWVycm9yX2xvZworIyAgICBDdXN0b21Mb2cgbG9ncy9kdW1teS1ob3N0LmV4YW1wbGUuY29tLWFjY2Vzc19sb2cgY29tbW9uCisjPC9WaXJ0dWFsSG9zdD4KKworIzxWaXJ0dWFsSG9zdCBfZGVmYXVsdF86Kj4KKyM8L1ZpcnR1YWxIb3N0PgorCisjIworIyMgIFNTTCBHbG9iYWwgQ29udGV4dAorIyMKKyMjICBBbGwgU1NMIGNvbmZpZ3VyYXRpb24gaW4gdGhpcyBjb250ZXh0IGFwcGxpZXMgYm90aCB0bworIyMgIHRoZSBtYWluIHNlcnZlciBhbmQgYWxsIFNTTC1lbmFibGVkIHZpcnR1YWwgaG9zdHMuCisjIworCisjCisjICAgU29tZSBNSU1FLXR5cGVzIGZvciBkb3dubG9hZGluZyBDZXJ0aWZpY2F0ZXMgYW5kIENSTHMKKyMKKzxJZkRlZmluZSBTU0w+CitBZGRUeXBlIGFwcGxpY2F0aW9uL3gteDUwOS1jYS1jZXJ0IC5jcnQKK0FkZFR5cGUgYXBwbGljYXRpb24veC1wa2NzNy1jcmwgICAgLmNybAorPC9JZkRlZmluZT4KKworPElmTW9kdWxlIG1vZF9zc2wuYz4KKworIyAgIFBhc3MgUGhyYXNlIERpYWxvZzoKKyMgICBDb25maWd1cmUgdGhlIHBhc3MgcGhyYXNlIGdhdGhlcmluZyBwcm9jZXNzLgorIyAgIFRoZSBmaWx0ZXJpbmcgZGlhbG9nIHByb2dyYW0gKGBidWlsdGluJyBpcyBhIGludGVybmFsCisjICAgdGVybWluYWwgZGlhbG9nKSBoYXMgdG8gcHJvdmlkZSB0aGUgcGFzcyBwaHJhc2Ugb24gc3Rkb3V0LgorU1NMUGFzc1BocmFzZURpYWxvZyAgYnVpbHRpbgorCisjICAgSW50ZXItUHJvY2VzcyBTZXNzaW9uIENhY2hlOgorIyAgIENvbmZpZ3VyZSB0aGUgU1NMIFNlc3Npb24gQ2FjaGU6IEZpcnN0IHRoZSBtZWNoYW5pc20gCisjICAgdG8gdXNlIGFuZCBzZWNvbmQgdGhlIGV4cGlyaW5nIHRpbWVvdXQgKGluIHNlY29uZHMpLgorI1NTTFNlc3Npb25DYWNoZSAgICAgICAgbm9uZQorI1NTTFNlc3Npb25DYWNoZSAgICAgICAgc2htaHQ6L3Vzci9sb2NhbC9hcGFjaGUvbG9ncy9zc2xfc2NhY2hlKDUxMjAwMCkKKyNTU0xTZXNzaW9uQ2FjaGUgICAgICAgIHNobWNiOi91c3IvbG9jYWwvYXBhY2hlL2xvZ3Mvc3NsX3NjYWNoZSg1MTIwMDApCitTU0xTZXNzaW9uQ2FjaGUgICAgICAgICBkYm06L3Vzci9sb2NhbC9hcGFjaGUvbG9ncy9zc2xfc2NhY2hlCitTU0xTZXNzaW9uQ2FjaGVUaW1lb3V0ICAzMDAKKworIyAgIFNlbWFwaG9yZToKKyMgICBDb25maWd1cmUgdGhlIHBhdGggdG8gdGhlIG11dHVhbCBleGNsdXNpb24gc2VtYXBob3JlIHRoZQorIyAgIFNTTCBlbmdpbmUgdXNlcyBpbnRlcm5hbGx5IGZvciBpbnRlci1wcm9jZXNzIHN5bmNocm9uaXphdGlvbi4gCitTU0xNdXRleCAgZmlsZTovdXNyL2xvY2FsL2FwYWNoZS9sb2dzL3NzbF9tdXRleAorCisjICAgUHNldWRvIFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIChQUk5HKToKKyMgICBDb25maWd1cmUgb25lIG9yIG1vcmUgc291cmNlcyB0byBzZWVkIHRoZSBQUk5HIG9mIHRoZSAKKyMgICBTU0wgbGlicmFyeS4gVGhlIHNlZWQgZGF0YSBzaG91bGQgYmUgb2YgZ29vZCByYW5kb20gcXVhbGl0eS4KKyMgICBXQVJOSU5HISBPbiBzb21lIHBsYXRmb3JtcyAvZGV2L3JhbmRvbSBibG9ja3MgaWYgbm90IGVub3VnaCBlbnRyb3B5CisjICAgaXMgYXZhaWxhYmxlLiBUaGlzIG1lYW5zIHlvdSB0aGVuIGNhbm5vdCB1c2UgdGhlIC9kZXYvcmFuZG9tIGRldmljZQorIyAgIGJlY2F1c2UgaXQgd291bGQgbGVhZCB0byB2ZXJ5IGxvbmcgY29ubmVjdGlvbiB0aW1lcyAoYXMgbG9uZyBhcworIyAgIGl0IHJlcXVpcmVzIHRvIG1ha2UgbW9yZSBlbnRyb3B5IGF2YWlsYWJsZSkuIEJ1dCB1c3VhbGx5IHRob3NlCisjICAgcGxhdGZvcm1zIGFkZGl0aW9uYWxseSBwcm92aWRlIGEgL2Rldi91cmFuZG9tIGRldmljZSB3aGljaCBkb2Vzbid0CisjICAgYmxvY2suIFNvLCBpZiBhdmFpbGFibGUsIHVzZSB0aGlzIG9uZSBpbnN0ZWFkLiBSZWFkIHRoZSBtb2Rfc3NsIFVzZXIKKyMgICBNYW51YWwgZm9yIG1vcmUgZGV0YWlscy4KK1NTTFJhbmRvbVNlZWQgc3RhcnR1cCBidWlsdGluCitTU0xSYW5kb21TZWVkIGNvbm5lY3QgYnVpbHRpbgorI1NTTFJhbmRvbVNlZWQgc3RhcnR1cCBmaWxlOi9kZXYvcmFuZG9tICA1MTIKKyNTU0xSYW5kb21TZWVkIHN0YXJ0dXAgZmlsZTovZGV2L3VyYW5kb20gNTEyCisjU1NMUmFuZG9tU2VlZCBjb25uZWN0IGZpbGU6L2Rldi9yYW5kb20gIDUxMgorI1NTTFJhbmRvbVNlZWQgY29ubmVjdCBmaWxlOi9kZXYvdXJhbmRvbSA1MTIKKworIyAgIExvZ2dpbmc6CisjICAgVGhlIGhvbWUgb2YgdGhlIGRlZGljYXRlZCBTU0wgcHJvdG9jb2wgbG9nZmlsZS4gRXJyb3JzIGFyZQorIyAgIGFkZGl0aW9uYWxseSBkdXBsaWNhdGVkIGluIHRoZSBnZW5lcmFsIGVycm9yIGxvZyBmaWxlLiAgUHV0CisjICAgdGhpcyBzb21ld2hlcmUgd2hlcmUgaXQgY2Fubm90IGJlIHVzZWQgZm9yIHN5bWxpbmsgYXR0YWNrcyBvbgorIyAgIGEgcmVhbCBzZXJ2ZXIgKGkuZS4gc29tZXdoZXJlIHdoZXJlIG9ubHkgcm9vdCBjYW4gd3JpdGUpLgorIyAgIExvZyBsZXZlbHMgYXJlIChhc2NlbmRpbmcgb3JkZXI6IGhpZ2hlciBvbmVzIGluY2x1ZGUgbG93ZXIgb25lcyk6CisjICAgbm9uZSwgZXJyb3IsIHdhcm4sIGluZm8sIHRyYWNlLCBkZWJ1Zy4KK1NTTExvZyAgICAgIC91c3IvbG9jYWwvYXBhY2hlL2xvZ3Mvc3NsX2VuZ2luZV9sb2cKK1NTTExvZ0xldmVsIGluZm8KKworPC9JZk1vZHVsZT4KKworPElmRGVmaW5lIFNTTD4KKworIyMKKyMjIFNTTCBWaXJ0dWFsIEhvc3QgQ29udGV4dAorIyMKKworPFZpcnR1YWxIb3N0IF9kZWZhdWx0Xzo0NDM+CisKKyMgIEdlbmVyYWwgc2V0dXAgZm9yIHRoZSB2aXJ0dWFsIGhvc3QKK0RvY3VtZW50Um9vdCAiL3Vzci9sb2NhbC9hcGFjaGUvaHRkb2NzIgorU2VydmVyTmFtZSByZWR1eC5hYmVyZ2VyLmF0CitTZXJ2ZXJBZG1pbiBhYmVyZ2VyQHJlZHV4LmFiZXJnZXIuYXQKK0Vycm9yTG9nIC91c3IvbG9jYWwvYXBhY2hlL2xvZ3MvZXJyb3JfbG9nCitUcmFuc2ZlckxvZyAvdXNyL2xvY2FsL2FwYWNoZS9sb2dzL2FjY2Vzc19sb2cKKworIyAgIFNTTCBFbmdpbmUgU3dpdGNoOgorIyAgIEVuYWJsZS9EaXNhYmxlIFNTTCBmb3IgdGhpcyB2aXJ0dWFsIGhvc3QuCitTU0xFbmdpbmUgb24KKworIyAgIFNTTCBDaXBoZXIgU3VpdGU6CisjICAgTGlzdCB0aGUgY2lwaGVycyB0aGF0IHRoZSBjbGllbnQgaXMgcGVybWl0dGVkIHRvIG5lZ290aWF0ZS4KKyMgICBTZWUgdGhlIG1vZF9zc2wgZG9jdW1lbnRhdGlvbiBmb3IgYSBjb21wbGV0ZSBsaXN0LgorU1NMQ2lwaGVyU3VpdGUgQUxMOiFBREg6IUVYUE9SVDU2OlJDNCtSU0E6K0hJR0g6K01FRElVTTorTE9XOitTU0x2MjorRVhQOitlTlVMTAorCisjICAgU2VydmVyIENlcnRpZmljYXRlOgorIyAgIFBvaW50IFNTTENlcnRpZmljYXRlRmlsZSBhdCBhIFBFTSBlbmNvZGVkIGNlcnRpZmljYXRlLiAgSWYKKyMgICB0aGUgY2VydGlmaWNhdGUgaXMgZW5jcnlwdGVkLCB0aGVuIHlvdSB3aWxsIGJlIHByb21wdGVkIGZvciBhCisjICAgcGFzcyBwaHJhc2UuICBOb3RlIHRoYXQgYSBraWxsIC1IVVAgd2lsbCBwcm9tcHQgYWdhaW4uIEEgdGVzdAorIyAgIGNlcnRpZmljYXRlIGNhbiBiZSBnZW5lcmF0ZWQgd2l0aCBgbWFrZSBjZXJ0aWZpY2F0ZScgdW5kZXIKKyMgICBidWlsdCB0aW1lLiBLZWVwIGluIG1pbmQgdGhhdCBpZiB5b3UndmUgYm90aCBhIFJTQSBhbmQgYSBEU0EKKyMgICBjZXJ0aWZpY2F0ZSB5b3UgY2FuIGNvbmZpZ3VyZSBib3RoIGluIHBhcmFsbGVsICh0byBhbHNvIGFsbG93CisjICAgdGhlIHVzZSBvZiBEU0EgY2lwaGVycywgZXRjLikKK1NTTENlcnRpZmljYXRlRmlsZSAvdXNyL2xvY2FsL2FwYWNoZS9jb25mL3NzbC5jcnQvc2VydmVyLmNydAorI1NTTENlcnRpZmljYXRlRmlsZSAvdXNyL2xvY2FsL2FwYWNoZS9jb25mL3NzbC5jcnQvc2VydmVyLWRzYS5jcnQKKworIyAgIFNlcnZlciBQcml2YXRlIEtleToKKyMgICBJZiB0aGUga2V5IGlzIG5vdCBjb21iaW5lZCB3aXRoIHRoZSBjZXJ0aWZpY2F0ZSwgdXNlIHRoaXMKKyMgICBkaXJlY3RpdmUgdG8gcG9pbnQgYXQgdGhlIGtleSBmaWxlLiAgS2VlcCBpbiBtaW5kIHRoYXQgaWYKKyMgICB5b3UndmUgYm90aCBhIFJTQSBhbmQgYSBEU0EgcHJpdmF0ZSBrZXkgeW91IGNhbiBjb25maWd1cmUKKyMgICBib3RoIGluIHBhcmFsbGVsICh0byBhbHNvIGFsbG93IHRoZSB1c2Ugb2YgRFNBIGNpcGhlcnMsIGV0Yy4pCitTU0xDZXJ0aWZpY2F0ZUtleUZpbGUgL3Vzci9sb2NhbC9hcGFjaGUvY29uZi9zc2wua2V5L3NlcnZlci5rZXkKKyNTU0xDZXJ0aWZpY2F0ZUtleUZpbGUgL3Vzci9sb2NhbC9hcGFjaGUvY29uZi9zc2wua2V5L3NlcnZlci1kc2Eua2V5CisKKyMgICBTZXJ2ZXIgQ2VydGlmaWNhdGUgQ2hhaW46CisjICAgUG9pbnQgU1NMQ2VydGlmaWNhdGVDaGFpbkZpbGUgYXQgYSBmaWxlIGNvbnRhaW5pbmcgdGhlCisjICAgY29uY2F0ZW5hdGlvbiBvZiBQRU0gZW5jb2RlZCBDQSBjZXJ0aWZpY2F0ZXMgd2hpY2ggZm9ybSB0aGUKKyMgICBjZXJ0aWZpY2F0ZSBjaGFpbiBmb3IgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZS4gQWx0ZXJuYXRpdmVseQorIyAgIHRoZSByZWZlcmVuY2VkIGZpbGUgY2FuIGJlIHRoZSBzYW1lIGFzIFNTTENlcnRpZmljYXRlRmlsZQorIyAgIHdoZW4gdGhlIENBIGNlcnRpZmljYXRlcyBhcmUgZGlyZWN0bHkgYXBwZW5kZWQgdG8gdGhlIHNlcnZlcgorIyAgIGNlcnRpZmljYXRlIGZvciBjb252aW5pZW5jZS4KKyNTU0xDZXJ0aWZpY2F0ZUNoYWluRmlsZSAvdXNyL2xvY2FsL2FwYWNoZS9jb25mL3NzbC5jcnQvY2EuY3J0CisKKyMgICBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgKENBKToKKyMgICBTZXQgdGhlIENBIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBwYXRoIHdoZXJlIHRvIGZpbmQgQ0EKKyMgICBjZXJ0aWZpY2F0ZXMgZm9yIGNsaWVudCBhdXRoZW50aWNhdGlvbiBvciBhbHRlcm5hdGl2ZWx5IG9uZQorIyAgIGh1Z2UgZmlsZSBjb250YWluaW5nIGFsbCBvZiB0aGVtIChmaWxlIG11c3QgYmUgUEVNIGVuY29kZWQpCisjICAgTm90ZTogSW5zaWRlIFNTTENBQ2VydGlmaWNhdGVQYXRoIHlvdSBuZWVkIGhhc2ggc3ltbGlua3MKKyMgICAgICAgICB0byBwb2ludCB0byB0aGUgY2VydGlmaWNhdGUgZmlsZXMuIFVzZSB0aGUgcHJvdmlkZWQKKyMgICAgICAgICBNYWtlZmlsZSB0byB1cGRhdGUgdGhlIGhhc2ggc3ltbGlua3MgYWZ0ZXIgY2hhbmdlcy4KKyNTU0xDQUNlcnRpZmljYXRlUGF0aCAvdXNyL2xvY2FsL2FwYWNoZS9jb25mL3NzbC5jcnQKKyNTU0xDQUNlcnRpZmljYXRlRmlsZSAvdXNyL2xvY2FsL2FwYWNoZS9jb25mL3NzbC5jcnQvY2EtYnVuZGxlLmNydAorCisjICAgQ2VydGlmaWNhdGUgUmV2b2NhdGlvbiBMaXN0cyAoQ1JMKToKKyMgICBTZXQgdGhlIENBIHJldm9jYXRpb24gcGF0aCB3aGVyZSB0byBmaW5kIENBIENSTHMgZm9yIGNsaWVudAorIyAgIGF1dGhlbnRpY2F0aW9uIG9yIGFsdGVybmF0aXZlbHkgb25lIGh1Z2UgZmlsZSBjb250YWluaW5nIGFsbAorIyAgIG9mIHRoZW0gKGZpbGUgbXVzdCBiZSBQRU0gZW5jb2RlZCkKKyMgICBOb3RlOiBJbnNpZGUgU1NMQ0FSZXZvY2F0aW9uUGF0aCB5b3UgbmVlZCBoYXNoIHN5bWxpbmtzCisjICAgICAgICAgdG8gcG9pbnQgdG8gdGhlIGNlcnRpZmljYXRlIGZpbGVzLiBVc2UgdGhlIHByb3ZpZGVkCisjICAgICAgICAgTWFrZWZpbGUgdG8gdXBkYXRlIHRoZSBoYXNoIHN5bWxpbmtzIGFmdGVyIGNoYW5nZXMuCisjU1NMQ0FSZXZvY2F0aW9uUGF0aCAvdXNyL2xvY2FsL2FwYWNoZS9jb25mL3NzbC5jcmwKKyNTU0xDQVJldm9jYXRpb25GaWxlIC91c3IvbG9jYWwvYXBhY2hlL2NvbmYvc3NsLmNybC9jYS1idW5kbGUuY3JsCisKKyMgICBDbGllbnQgQXV0aGVudGljYXRpb24gKFR5cGUpOgorIyAgIENsaWVudCBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gdHlwZSBhbmQgZGVwdGguICBUeXBlcyBhcmUKKyMgICBub25lLCBvcHRpb25hbCwgcmVxdWlyZSBhbmQgb3B0aW9uYWxfbm9fY2EuICBEZXB0aCBpcyBhCisjICAgbnVtYmVyIHdoaWNoIHNwZWNpZmllcyBob3cgZGVlcGx5IHRvIHZlcmlmeSB0aGUgY2VydGlmaWNhdGUKKyMgICBpc3N1ZXIgY2hhaW4gYmVmb3JlIGRlY2lkaW5nIHRoZSBjZXJ0aWZpY2F0ZSBpcyBub3QgdmFsaWQuCisjU1NMVmVyaWZ5Q2xpZW50IHJlcXVpcmUKKyNTU0xWZXJpZnlEZXB0aCAgMTAKKworIyAgIEFjY2VzcyBDb250cm9sOgorIyAgIFdpdGggU1NMUmVxdWlyZSB5b3UgY2FuIGRvIHBlci1kaXJlY3RvcnkgYWNjZXNzIGNvbnRyb2wgYmFzZWQKKyMgICBvbiBhcmJpdHJhcnkgY29tcGxleCBib29sZWFuIGV4cHJlc3Npb25zIGNvbnRhaW5pbmcgc2VydmVyCisjICAgdmFyaWFibGUgY2hlY2tzIGFuZCBvdGhlciBsb29rdXAgZGlyZWN0aXZlcy4gIFRoZSBzeW50YXggaXMgYQorIyAgIG1peHR1cmUgYmV0d2VlbiBDIGFuZCBQZXJsLiAgU2VlIHRoZSBtb2Rfc3NsIGRvY3VtZW50YXRpb24KKyMgICBmb3IgbW9yZSBkZXRhaWxzLgorIzxMb2NhdGlvbiAvPgorI1NTTFJlcXVpcmUgKCAgICAle1NTTF9DSVBIRVJ9ICF+IG0vXihFWFB8TlVMTCkvIFwKKyMgICAgICAgICAgICBhbmQgJXtTU0xfQ0xJRU5UX1NfRE5fT30gZXEgIlNuYWtlIE9pbCwgTHRkLiIgXAorIyAgICAgICAgICAgIGFuZCAle1NTTF9DTElFTlRfU19ETl9PVX0gaW4geyJTdGFmZiIsICJDQSIsICJEZXYifSBcCisjICAgICAgICAgICAgYW5kICV7VElNRV9XREFZfSA+PSAxIGFuZCAle1RJTUVfV0RBWX0gPD0gNSBcCisjICAgICAgICAgICAgYW5kICV7VElNRV9IT1VSfSA+PSA4IGFuZCAle1RJTUVfSE9VUn0gPD0gMjAgICAgICAgKSBcCisjICAgICAgICAgICBvciAle1JFTU9URV9BRERSfSA9fiBtL14xOTJcLjc2XC4xNjJcLlswLTldKyQvCisjPC9Mb2NhdGlvbj4KKworIyAgIFNTTCBFbmdpbmUgT3B0aW9uczoKKyMgICBTZXQgdmFyaW91cyBvcHRpb25zIGZvciB0aGUgU1NMIGVuZ2luZS4KKyMgICBvIEZha2VCYXNpY0F1dGg6CisjICAgICBUcmFuc2xhdGUgdGhlIGNsaWVudCBYLjUwOSBpbnRvIGEgQmFzaWMgQXV0aG9yaXNhdGlvbi4gIFRoaXMgbWVhbnMgdGhhdAorIyAgICAgdGhlIHN0YW5kYXJkIEF1dGgvREJNQXV0aCBtZXRob2RzIGNhbiBiZSB1c2VkIGZvciBhY2Nlc3MgY29udHJvbC4gIFRoZQorIyAgICAgdXNlciBuYW1lIGlzIHRoZSBgb25lIGxpbmUnIHZlcnNpb24gb2YgdGhlIGNsaWVudCdzIFguNTA5IGNlcnRpZmljYXRlLgorIyAgICAgTm90ZSB0aGF0IG5vIHBhc3N3b3JkIGlzIG9idGFpbmVkIGZyb20gdGhlIHVzZXIuIEV2ZXJ5IGVudHJ5IGluIHRoZSB1c2VyCisjICAgICBmaWxlIG5lZWRzIHRoaXMgcGFzc3dvcmQ6IGB4eGozMVpNVFp6a1ZBJy4KKyMgICBvIEV4cG9ydENlcnREYXRhOgorIyAgICAgVGhpcyBleHBvcnRzIHR3byBhZGRpdGlvbmFsIGVudmlyb25tZW50IHZhcmlhYmxlczogU1NMX0NMSUVOVF9DRVJUIGFuZAorIyAgICAgU1NMX1NFUlZFUl9DRVJULiBUaGVzZSBjb250YWluIHRoZSBQRU0tZW5jb2RlZCBjZXJ0aWZpY2F0ZXMgb2YgdGhlCisjICAgICBzZXJ2ZXIgKGFsd2F5cyBleGlzdGluZykgYW5kIHRoZSBjbGllbnQgKG9ubHkgZXhpc3Rpbmcgd2hlbiBjbGllbnQKKyMgICAgIGF1dGhlbnRpY2F0aW9uIGlzIHVzZWQpLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGltcG9ydCB0aGUgY2VydGlmaWNhdGVzCisjICAgICBpbnRvIENHSSBzY3JpcHRzLgorIyAgIG8gU3RkRW52VmFyczoKKyMgICAgIFRoaXMgZXhwb3J0cyB0aGUgc3RhbmRhcmQgU1NML1RMUyByZWxhdGVkIGBTU0xfKicgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorIyAgICAgUGVyIGRlZmF1bHQgdGhpcyBleHBvcnRhdGlvbiBpcyBzd2l0Y2hlZCBvZmYgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsCisjICAgICBiZWNhdXNlIHRoZSBleHRyYWN0aW9uIHN0ZXAgaXMgYW4gZXhwZW5zaXZlIG9wZXJhdGlvbiBhbmQgaXMgdXN1YWxseQorIyAgICAgdXNlbGVzcyBmb3Igc2VydmluZyBzdGF0aWMgY29udGVudC4gU28gb25lIHVzdWFsbHkgZW5hYmxlcyB0aGUKKyMgICAgIGV4cG9ydGF0aW9uIGZvciBDR0kgYW5kIFNTSSByZXF1ZXN0cyBvbmx5LgorIyAgIG8gQ29tcGF0RW52VmFyczoKKyMgICAgIFRoaXMgZXhwb3J0cyBvYnNvbGV0ZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKyMgICAgIHRvIEFwYWNoZS1TU0wgMS54LCBtb2Rfc3NsIDIuMC54LCBTaW91eCAxLjAgYW5kIFN0cm9uZ2hvbGQgMi54LiBVc2UgdGhpcworIyAgICAgdG8gcHJvdmlkZSBjb21wYXRpYmlsaXR5IHRvIGV4aXN0aW5nIENHSSBzY3JpcHRzLgorIyAgIG8gU3RyaWN0UmVxdWlyZToKKyMgICAgIFRoaXMgZGVuaWVzIGFjY2VzcyB3aGVuICJTU0xSZXF1aXJlU1NMIiBvciAiU1NMUmVxdWlyZSIgYXBwbGllZCBldmVuCisjICAgICB1bmRlciBhICJTYXRpc2Z5IGFueSIgc2l0dWF0aW9uLCBpLmUuIHdoZW4gaXQgYXBwbGllcyBhY2Nlc3MgaXMgZGVuaWVkCisjICAgICBhbmQgbm8gb3RoZXIgbW9kdWxlIGNhbiBjaGFuZ2UgaXQuCisjICAgbyBPcHRSZW5lZ290aWF0ZToKKyMgICAgIFRoaXMgZW5hYmxlcyBvcHRpbWl6ZWQgU1NMIGNvbm5lY3Rpb24gcmVuZWdvdGlhdGlvbiBoYW5kbGluZyB3aGVuIFNTTAorIyAgICAgZGlyZWN0aXZlcyBhcmUgdXNlZCBpbiBwZXItZGlyZWN0b3J5IGNvbnRleHQuIAorI1NTTE9wdGlvbnMgK0Zha2VCYXNpY0F1dGggK0V4cG9ydENlcnREYXRhICtDb21wYXRFbnZWYXJzICtTdHJpY3RSZXF1aXJlCis8RmlsZXMgfiAiXC4oY2dpfHNodG1sfHBodG1sfHBocDM/KSQiPgorICAgIFNTTE9wdGlvbnMgK1N0ZEVudlZhcnMKKzwvRmlsZXM+Cis8RGlyZWN0b3J5ICIvdXNyL2xvY2FsL2FwYWNoZS9jZ2ktYmluIj4KKyAgICBTU0xPcHRpb25zICtTdGRFbnZWYXJzCis8L0RpcmVjdG9yeT4KKworIyAgIFNTTCBQcm90b2NvbCBBZGp1c3RtZW50czoKKyMgICBUaGUgc2FmZSBhbmQgZGVmYXVsdCBidXQgc3RpbGwgU1NML1RMUyBzdGFuZGFyZCBjb21wbGlhbnQgc2h1dGRvd24KKyMgICBhcHByb2FjaCBpcyB0aGF0IG1vZF9zc2wgc2VuZHMgdGhlIGNsb3NlIG5vdGlmeSBhbGVydCBidXQgZG9lc24ndCB3YWl0IGZvcgorIyAgIHRoZSBjbG9zZSBub3RpZnkgYWxlcnQgZnJvbSBjbGllbnQuIFdoZW4geW91IG5lZWQgYSBkaWZmZXJlbnQgc2h1dGRvd24KKyMgICBhcHByb2FjaCB5b3UgY2FuIHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXM6CisjICAgbyBzc2wtdW5jbGVhbi1zaHV0ZG93bjoKKyMgICAgIFRoaXMgZm9yY2VzIGFuIHVuY2xlYW4gc2h1dGRvd24gd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQsIGkuZS4gbm8KKyMgICAgIFNTTCBjbG9zZSBub3RpZnkgYWxlcnQgaXMgc2VuZCBvciBhbGxvd2VkIHRvIHJlY2VpdmVkLiAgVGhpcyB2aW9sYXRlcworIyAgICAgdGhlIFNTTC9UTFMgc3RhbmRhcmQgYnV0IGlzIG5lZWRlZCBmb3Igc29tZSBicmFpbi1kZWFkIGJyb3dzZXJzLiBVc2UKKyMgICAgIHRoaXMgd2hlbiB5b3UgcmVjZWl2ZSBJL08gZXJyb3JzIGJlY2F1c2Ugb2YgdGhlIHN0YW5kYXJkIGFwcHJvYWNoIHdoZXJlCisjICAgICBtb2Rfc3NsIHNlbmRzIHRoZSBjbG9zZSBub3RpZnkgYWxlcnQuCisjICAgbyBzc2wtYWNjdXJhdGUtc2h1dGRvd246CisjICAgICBUaGlzIGZvcmNlcyBhbiBhY2N1cmF0ZSBzaHV0ZG93biB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZCwgaS5lLiBhCisjICAgICBTU0wgY2xvc2Ugbm90aWZ5IGFsZXJ0IGlzIHNlbmQgYW5kIG1vZF9zc2wgd2FpdHMgZm9yIHRoZSBjbG9zZSBub3RpZnkKKyMgICAgIGFsZXJ0IG9mIHRoZSBjbGllbnQuIFRoaXMgaXMgMTAwJSBTU0wvVExTIHN0YW5kYXJkIGNvbXBsaWFudCwgYnV0IGluCisjICAgICBwcmFjdGljZSBvZnRlbiBjYXVzZXMgaGFuZ2luZyBjb25uZWN0aW9ucyB3aXRoIGJyYWluLWRlYWQgYnJvd3NlcnMuIFVzZQorIyAgICAgdGhpcyBvbmx5IGZvciBicm93c2VycyB3aGVyZSB5b3Uga25vdyB0aGF0IHRoZWlyIFNTTCBpbXBsZW1lbnRhdGlvbgorIyAgICAgd29ya3MgY29ycmVjdGx5LiAKKyMgICBOb3RpY2U6IE1vc3QgcHJvYmxlbXMgb2YgYnJva2VuIGNsaWVudHMgYXJlIGFsc28gcmVsYXRlZCB0byB0aGUgSFRUUAorIyAgIGtlZXAtYWxpdmUgZmFjaWxpdHksIHNvIHlvdSB1c3VhbGx5IGFkZGl0aW9uYWxseSB3YW50IHRvIGRpc2FibGUKKyMgICBrZWVwLWFsaXZlIGZvciB0aG9zZSBjbGllbnRzLCB0b28uIFVzZSB2YXJpYWJsZSAibm9rZWVwYWxpdmUiIGZvciB0aGlzLgorIyAgIFNpbWlsYXJseSwgb25lIGhhcyB0byBmb3JjZSBzb21lIGNsaWVudHMgdG8gdXNlIEhUVFAvMS4wIHRvIHdvcmthcm91bmQKKyMgICB0aGVpciBicm9rZW4gSFRUUC8xLjEgaW1wbGVtZW50YXRpb24uIFVzZSB2YXJpYWJsZXMgImRvd25ncmFkZS0xLjAiIGFuZAorIyAgICJmb3JjZS1yZXNwb25zZS0xLjAiIGZvciB0aGlzLgorU2V0RW52SWYgVXNlci1BZ2VudCAiLipNU0lFLioiIFwKKyAgICAgICAgIG5va2VlcGFsaXZlIHNzbC11bmNsZWFuLXNodXRkb3duIFwKKyAgICAgICAgIGRvd25ncmFkZS0xLjAgZm9yY2UtcmVzcG9uc2UtMS4wCisKKyMgICBQZXItU2VydmVyIExvZ2dpbmc6CisjICAgVGhlIGhvbWUgb2YgYSBjdXN0b20gU1NMIGxvZyBmaWxlLiBVc2UgdGhpcyB3aGVuIHlvdSB3YW50IGEKKyMgICBjb21wYWN0IG5vbi1lcnJvciBTU0wgbG9nZmlsZSBvbiBhIHZpcnR1YWwgaG9zdCBiYXNpcy4KK0N1c3RvbUxvZyAvdXNyL2xvY2FsL2FwYWNoZS9sb2dzL3NzbF9yZXF1ZXN0X2xvZyBcCisgICAgICAgICAgIiV0ICVoICV7U1NMX1BST1RPQ09MfXggJXtTU0xfQ0lQSEVSfXggXCIlclwiICViIgorCis8L1ZpcnR1YWxIb3N0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworPC9JZkRlZmluZT4KKworPElmTW9kdWxlIG1vZF9nc29hcC5jPgorICAgIDxMb2NhdGlvbiAvc29hcD4KKyAgICAgICAgU2V0SGFuZGxlciBnc29hcC1oYW5kbGVyCisgICAgICAgIFNPQVBMaWJyYXJ5IC9ob21lL2FiZXJnZXIvYXBhY2hlX2dzb2FwLjAuMC41L2V4YW1wbGUvY2FsY3VsYXRvci8ubGlicy9saWJDYWxjdWxhdG9yLnNvCisgICAgPC9Mb2NhdGlvbj4KKzwvSWZNb2R1bGU+CisKZGlmZiAtLWdpdCBhL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9tb2RfZ3NvYXAvbW9kX2dzb2FwLmMgYi9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvbW9kX2dzb2FwL21vZF9nc29hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNjQ2ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvbW9kX2dzb2FwL21vZF9nc29hcC5jCkBAIC0wLDAgKzEsMTQ2MSBAQAorLyoqIEFwYWNoZSBTT0FQIG1vZHVsZSBmb3IgQXBhY2hlIDEuMy54CisgKiBAZmlsZSBtb2RfZ3NvYXAuYworICogQGF1dGhvciBDaHJpc3RpYW4gQWJlcmdlciAoaHR0cDovL3d3dy5hYmVyZ2VyLmF0KQorICogdXBkYXRlZCBieSBEYXZpZCBWaW5lciAoZHZpbmVyQGFwYWNoZS5vcmcpCisgKi8KKworI2lmICFkZWZpbmVkKF9fR05VQ19fKSB8fCBfX0dOVUNfXyA8IDIgfHwgXAorICAgIChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fIDwgNykgfHxcCisgICAgZGVmaW5lZChORVhUKQorI2lmbmRlZiBfX2F0dHJpYnV0ZV9fCisjZGVmaW5lIF9fYXR0cmlidXRlX18oX194KQorI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIE1vdmVkIGdzb2FwIGluY2x1ZGUgdG8gdG9wLiAgV2l0aG91dCB0aGlzLCB0aGVyZSdzIGEgcGFyc2UgZXJyb3IKKyAqIGludHJvZHVjZWQgaWYgZ3NvYXAgd2FzIGNvbXBpbGVkIHdpdGggLURXSVRIX09QRU5TU0wuCisgKi8KKyNpbmNsdWRlICJzdGRzb2FwMi5oIiAgICAgICAgICAgLy8gc3RhbmRhcmQgaGVhZGVyIGZvciBnc29hcAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlICJodHRwZC5oIgorI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCisjaW5jbHVkZSAiaHR0cF9jb3JlLmgiCisjaW5jbHVkZSAiaHR0cF9sb2cuaCIKKyNpbmNsdWRlICJodHRwX21haW4uaCIKKyNpbmNsdWRlICJodHRwX3Byb3RvY29sLmgiCisjaW5jbHVkZSAiaHR0cF9yZXF1ZXN0LmgiCisjaW5jbHVkZSAidXRpbF9zY3JpcHQuaCIKKyNpbmNsdWRlICJhcGFjaGVfZ3NvYXAuaCIKKwordHlwZWRlZiBpbnQgYm9vbDsKKworI2RlZmluZSBmYWxzZSAwCisjZGVmaW5lIHRydWUgKChpbnQpMHhmZmZmKQorI2RlZmluZSBJT0JVRl9DSFVOS19TSVpFIDgxOTIKKyNkZWZpbmUgR1NPQVBfSUQgIkFwYWNoZSBtb2RfZ3NvYXAgZ3NvYXAgaHR0cGQgZXh0ZW5zaW9uIDAuMC42IgorCisvKiogQSBzaGFyZWQgbGlicmFyeSBjb250YWluaW5nIGEgU09BUCBzZXJ2ZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IFNvYXBTaGFyZWRMaWJyYXJ5X1MgeworICAgIHBvb2wgKm1fcFBvb2w7CisgICAgdm9pZCAqbV9oTGlicmFyeTsgICAgICAgICAgIC8vLzwgaGFuZGxlIG9mIHRoZSBsb2FkZWQgbGlicmF5LgorICAgIGNvbnN0IGNoYXIgKm1fcHN6UGF0aDsgICAgICAvLy88IHRoZSBwYXRoIG9mIHRoZSBsaWJyYXJ5LCBpbmNsdWRpbmcgdGhlIG5hbWUuCisgICAgYm9vbCBtX2JJc1NPQVBMaWJyYXJ5OyAgICAgIC8vLzwgaXMgdGhpcyBsaWJyYXJ5IGEgU09BUCBsaWJyYXJ5IHRoYXQgY29udGFpbnMgdGhlIHNlcnZlciBmYWN0b3J5IGVudHJ5IHBvaW50PworfSBTb2FwU2hhcmVkTGlicmFyeTsKKworLyoqIFRhYmxlIG9mIHNoYXJlZCBsaWJyYXJpZXMgdGhhdCBhcmUgYWxyZWFkeSBsb2FkZWQuCisgKiBhIHNpbmdsZXRvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgU29hcFNoYXJlZExpYnJhcmllc19TIHsKKyAgICBwb29sICptX3BQb29sOworICAgIFNvYXBTaGFyZWRMaWJyYXJ5ICptX3BTT0FQTGlicmFyeTsgIC8vLzwgdGhlIG1haW4gU09BUCBsaWJyYXJ5IHRoYXQgd2lsbCBzZXJ2ZSBvdXIgcmVxdWVzdHMKKyAgICBhcnJheV9oZWFkZXIgKm1fcExpYnJhcmllczsgLy8vPCB0aGUgYXJyYXkgd2hlcmUgd2Ugc3RvcmUgb3VyIGxpYnJhcmllcy4KKyAgICBhcGFjaGVfaW5pdF9zb2FwX2ludGVyZmFjZV9mbiBtX3BmbkVudHJ5UG9pbnQ7CisgICAgc3RydWN0IGFwYWNoZV9zb2FwX2ludGVyZmFjZSAqbV9wSW50ZjsKKyAgICBib29sIG1fYkFsbExpYnJhcmllc0xvYWRlZDsgLy8vPCBoYXZlIGFsbCBsaWJyYXJpZXMgaW4gb3VyIGxpYnJhcmllcyBjb2xsZWN0aW9uIGJlZW4gYWxyZWFkeSBzdWNjZXNzZnVsbHkgbG9hZGVkPworfSBTb2FwU2hhcmVkTGlicmFyaWVzOworCisvKiogRW52aXJvbm1lbnQgdG8gd2hpY2ggcmVjb3JkIGFwcGxpZXMgKGRpcmVjdG9yeSwKKyAqIHNlcnZlciwgb3IgY29tYmluYXRpb24pLgorICovCit0eXBlZGVmIGVudW0gZW5Db25maWd1cmF0aW9uVHlwZSB7CisgICAgY3Rfc2VydmVyID0gMSwgICAgICAgICAgICAgIC8vLzwgdXNlZCBmb3IgcGVyLXNlcnZlciBjb25maWd1cmF0aW9uCisgICAgY3RfZGlyZWN0b3J5ID0gMiwgICAgICAgICAgIC8vLzwgdXNlZCBmb3IgcGVyLWRpcmVjdG9yeSBjb25maWd1cmF0aW9uCisgICAgY3RfYm90aCA9IDMgICAgICAgICAgICAgICAgIC8vLzwgdXNlZCBmb3IgYm90aAorfSBDb25maWd1cmF0aW9uVHlwZTsKKworLyoqIFN0b3JlIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHNldCBpbiB0aGUgQXBhY2hlIFNlcnZlciBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZXMuCisgKiBUaGVzZSBhcmUgc2V0IGUuZy4gaW4gdGhlIGZpbGUgaHR0cGQuY29uZgorICogSXQncyBwZXJmZWN0bHkgcmVhc29uYWJsZSB0byBoYXZlIHR3byBkaWZmZXJlbnQgc3RydWN0dXJlcyBmb3IgdGhlIHR3bworICogZGlmZmVyZW50IGVudmlyb25tZW50cy4gIFRoZSBzYW1lIGNvbW1hbmQgaGFuZGxlcnMgd2lsbCBiZSBjYWxsZWQgZm9yCisgKiBib3RoLCB0aG91Z2gsIHNvIHRoZSBoYW5kbGVycyBuZWVkIHRvIGJlIGFibGUgdG8gdGVsbCB0aGVtIGFwYXJ0LiAgT25lCisgKiBwb3NzaWJpbGl0eSBpcyBmb3IgYm90aCBzdHJ1Y3R1cmVzIHRvIHN0YXJ0IHdpdGggYW4gaW50IHdoaWNoIGlzIHplcm8gZm9yCisgKiBvbmUgYW5kIDEgZm9yIHRoZSBvdGhlci4KKyAqCisgKiBOb3RlIHRoYXQgd2hpbGUgdGhlIHBlci1kaXJlY3RvcnkgYW5kIHBlci1zZXJ2ZXIgY29uZmlndXJhdGlvbiByZWNvcmRzIGFyZQorICogYXZhaWxhYmxlIHRvIG1vc3Qgb2YgdGhlIG1vZHVsZSBoYW5kbGVycywgdGhleSBzaG91bGQgYmUgdHJlYXRlZCBhcworICogUkVBRC1PTkxZIGJ5IGFsbCBleGNlcHQgdGhlIGNvbW1hbmQgYW5kIG1lcmdlIGhhbmRsZXJzLiAgU29tZXRpbWVzIGhhbmRsZXJzCisgKiBhcmUgaGFuZGVkIGEgcmVjb3JkIHRoYXQgYXBwbGllcyB0byB0aGUgY3VycmVudCBsb2NhdGlvbiBieSBpbXBsaWNhdGlvbiBvcgorICogaW5oZXJpdGFuY2UsIGFuZCBtb2RpZnlpbmcgaXQgd2lsbCBjaGFuZ2UgdGhlIHJ1bGVzIGZvciBvdGhlciBsb2NhdGlvbnMuCisgKi8KK3R5cGVkZWYgc3RydWN0IGdzb2FwQ29uZmlndXJhdGlvbl9TIHsKKyAgICBTb2FwU2hhcmVkTGlicmFyaWVzICptX3BMaWJyYXJpZXM7CisgICAgQ29uZmlndXJhdGlvblR5cGUgbV9UeXBlOyAgIC8vLzwgdGhlIHR5cGUgb2YgY29uZmlndXJhdGlvbiBlbnZpcm9ubWVudAorfSBnc29hcENvbmZpZ3VyYXRpb247CisKKy8qKiBPdXIgaW50ZXJuYWwgcGVyIHJlcXVlc3Qgc29hcCBjb25maWd1cmF0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IGdzb2FwUmVxdWVzdENvbmZpZ3VyYXRpb25fUyB7CisgICAgcmVxdWVzdF9yZWMgKnI7ICAgICAgICAgICAgIC8vLzwgdGhlIGN1cnJlbnQgcmVxdWVzdCByZWNvcmQuCisgICAgY2hhciAqbV9wc3pBbGxIZWFkZXJzOyAgICAgIC8vLzwgYWxsIGhlYWRlcnMgcmVjZWl2ZWQgYXMgYSBzdHJpbmcsIHRoaXMgaXMgcmV0dXJuZWQgdG8gZ3NvYXAncyBodHRwX3BhcnNlIGZ1bmN0aW9uIGJlZm9yZSB3ZSByZXR1cm4gdGhlIGJvZHkuCisgICAgY29uc3QgY2hhciAqbV9wc3pDdXJyZW50SGVhZGVyUmVhZGluZ1Bvc2l0aW9uOyAgLy8vPCB0aGUgcG9zaXRpb24gd2hlcmUgdGhlIG5leHQgaGVhZGVyIHJlYWQgb3BlcmF0aW9uIHdpbGwgc3RhcnQuCisgICAgdW5zaWduZWQgaW50IG1fbkhlYWRlckxlbmd0aDsgICAvLy88IHRvdGFsIGxlbmd0aCBvZiBhbGwgaGVhZGVycyBjb25jYXRlbmF0ZWQgYXMgc3RyaW5nIAorICAgIGNoYXIgKm1fcE91dEJ1ZjsgICAgICAgICAgICAvLy88IG91dHB1dCBidWZmZXIKKyAgICBzaXplX3QgbV9uT3V0QnVmTGVuZ3RoOyAgICAgLy8vPCBhbGxvY2F0ZWQgbGVuZ3RoIG9mIG91dHB1dCBidWZmZXIKKyAgICBzaXplX3QgbV9uT3V0QnVmQ291bnQ7ICAgICAgLy8vPCBieXRlcyBpbiBvdXRwdXQgYnVmZmVyCisgICAgaW50IGhlYWRlcnNfc2VudDsgICAgICAgICAgIC8vLzwgaGF2ZSBodHRwIC0gaGVhZGVycyBhbHJlYWR5IGJlZW4gc2VudCB0byBjbGllbnQgdXM/CisgICAgaW50IGhlYWRlcnNfcmVjZWl2ZWQ7ICAgICAgIC8vLzwgaGF2ZSB0aGUgcmVxdWVzdCBoZWFkZXJzIGFscmVhZHkgYmVlbiBwYXNzZWQgdG8gZ3NvYXAgPyAKKyAgICBpbnQgKCpodHRwX3BhcnNlKSAoc3RydWN0IHNvYXAgKik7ICAvLy88IHRoZSBvcmlnaW5hbCBnc29hcCBwYXJzaW5nIGZ1bmN0aW9uLgorICAgIHN0cnVjdCBhcGFjaGVfc29hcF9pbnRlcmZhY2UgKnBJbnRmOworfSBnc29hcFJlcXVlc3RDb25maWd1cmF0aW9uOworCisKKy8qCisgKiBUbyBhdm9pZCBsZWFraW5nIG1lbW9yeSBmcm9tIHBvb2xzIG90aGVyIHRoYW4gdGhlIHBlci1yZXF1ZXN0IG9uZSwgd2UKKyAqIGFsbG9jYXRlIGEgbW9kdWxlLXByaXZhdGUgcG9vbC4KKyAqLworc3RhdGljIHBvb2wgKnRoZV9nc29hcFBvb2wgPSBOVUxMOworCisvKiogQHJldHVybiBvdXIgcG9vbCBmb3IgZ3NvYXBDb25maWd1cmF0aW9uICovCitzdGF0aWMgcG9vbCAqCitnc29hcENvbmZpZ3VyYXRpb25fZ2V0TW9kdWxlUG9vbCgpCit7CisgICAgaWYoTlVMTCA9PSB0aGVfZ3NvYXBQb29sKQorICAgIHsKKyAgICAgICAgdGhlX2dzb2FwUG9vbCA9IGFwX21ha2Vfc3ViX3Bvb2woTlVMTCk7CisgICAgfQorICAgIHJldHVybiB0aGVfZ3NvYXBQb29sOworfQorc3RhdGljIGdzb2FwQ29uZmlndXJhdGlvbiAqZ2V0Q29uZmlndXJhdGlvbihyZXF1ZXN0X3JlYyAqIHIpOworc3RhdGljIGdzb2FwUmVxdWVzdENvbmZpZ3VyYXRpb24gKmdldFJlcXVlc3RDb25maWd1cmF0aW9uKHN0cnVjdCBzb2FwICopOworCisvKioKKyAgIEBwYXJhbSBwIHRoZSBwb29sIHRvIHVzZSBmb3IgbWVtb3J5IGFsbG9jYXRpb25zLgorICAgQHBhcmFtIHBzelBhdGggdGhlIHBhdGggb2YgdGhlIGxpYnJhcnkuCisqLworc3RhdGljIHZvaWQKK1NvYXBTaGFyZWRMaWJyYXJ5X2luaXQoU29hcFNoYXJlZExpYnJhcnkgKiBUaGlzLCBwb29sICogcCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU29hcFNoYXJlZExpYnJhcnkgKiBwTGliKQoreworICAgIFRoaXMtPm1fcFBvb2wgPSBwOworICAgIFRoaXMtPm1faExpYnJhcnkgPSBOVUxMOworICAgIFRoaXMtPm1fcHN6UGF0aCA9IGFwX3BzdHJkdXAocCwgcExpYi0+bV9wc3pQYXRoKTsKKyAgICBUaGlzLT5tX2JJc1NPQVBMaWJyYXJ5ID0gcExpYi0+bV9iSXNTT0FQTGlicmFyeTsKK30KKworc3RhdGljIHZvaWQKK1NvYXBTaGFyZWRMaWJyYXJ5X2luaXQyKFNvYXBTaGFyZWRMaWJyYXJ5ICogVGhpcywgcG9vbCAqIHAsIGNvbnN0IGNoYXIgKnBzelBhdGgpCit7CisgICAgVGhpcy0+bV9wUG9vbCA9IHA7CisgICAgVGhpcy0+bV9oTGlicmFyeSA9IE5VTEw7CisgICAgVGhpcy0+bV9wc3pQYXRoID0gYXBfcHN0cmR1cChwLCBwc3pQYXRoKTsKKyAgICBUaGlzLT5tX2JJc1NPQVBMaWJyYXJ5ID0gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkCitTb2FwU2hhcmVkTGlicmFyeV9jbGVhcihTb2FwU2hhcmVkTGlicmFyeSAqIFRoaXMsIHBvb2wgKiBwKQoreworICAgIFRoaXMtPm1fcFBvb2wgPSBwOworICAgIFRoaXMtPm1faExpYnJhcnkgPSBOVUxMOworICAgIFRoaXMtPm1fcHN6UGF0aCA9IE5VTEw7CisgICAgVGhpcy0+bV9iSXNTT0FQTGlicmFyeSA9IGZhbHNlOworfQorCitzdGF0aWMgU29hcFNoYXJlZExpYnJhcnkgKgorU29hcFNoYXJlZExpYnJhcnlfY3JlYXRlKHBvb2wgKiBwKQoreworICAgIFNvYXBTaGFyZWRMaWJyYXJ5ICpUaGlzID0KKyAgICAgICAgKFNvYXBTaGFyZWRMaWJyYXJ5ICopIGFwX3BjYWxsb2MocCwgc2l6ZW9mKFNvYXBTaGFyZWRMaWJyYXJ5KSk7CisgICAgU29hcFNoYXJlZExpYnJhcnlfY2xlYXIoVGhpcywgcCk7CisgICAgcmV0dXJuIFRoaXM7Cit9CisKKy8qKgorICoJQHBhcmFtIHBUZW1wUG9vbCBwb29sIHRvIHVzZSBmb3IgYWxsb2NhdGluZyB0ZW1wb3Jhcnkgb2JqZWN0cyAoZS5nLiBlcnJvciBtZXNzYWdlKS4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKgorU29hcFNoYXJlZExpYnJhcnlfbG9hZChTb2FwU2hhcmVkTGlicmFyeSAqIFRoaXMsIHBvb2wgKiBwVGVtcFBvb2wpCit7CisgICAgY29uc3QgY2hhciAqcHN6RXJyb3IgPSBOVUxMOworICAgIGNvbnN0IGludCBuRmxhZ3MgPSBSVExEX0xBWlkgfCBSVExEX0dMT0JBTDsKKworICAgIFRoaXMtPm1faExpYnJhcnkgPSAodm9pZCAqKWRsb3BlbihUaGlzLT5tX3BzelBhdGgsIG5GbGFncyk7CisgICAgcHN6RXJyb3IgPSBkbGVycm9yKCk7CisgICAgaWYoTlVMTCA9PSBUaGlzLT5tX2hMaWJyYXJ5KQorICAgIHsKKyAgICAgICAgcHN6RXJyb3IgPQorICAgICAgICAgICAgYXBfcHNwcmludGYoTlVMTCA9PSBwVGVtcFBvb2wgPyBUaGlzLT5tX3BQb29sIDogcFRlbXBQb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1vZF9nc29hcDogJXMgbG9hZGluZyBsaWJyYXJ5ICVzIiwgcHN6RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICBUaGlzLT5tX3BzelBhdGgpOworICAgIH0KKyAgICByZXR1cm4gcHN6RXJyb3I7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZAorU29hcFNoYXJlZExpYnJhcmllc19pbml0KFNvYXBTaGFyZWRMaWJyYXJpZXMgKiBUaGlzLCBwb29sICogcCkKK3sKKyAgICBUaGlzLT5tX3BQb29sID0gcDsKKyAgICBUaGlzLT5tX3BTT0FQTGlicmFyeSA9IE5VTEw7CisgICAgVGhpcy0+bV9wTGlicmFyaWVzID0gYXBfbWFrZV9hcnJheShwLCAwLCBzaXplb2YoU29hcFNoYXJlZExpYnJhcnkgKiopKTsKKyAgICBUaGlzLT5tX2JBbGxMaWJyYXJpZXNMb2FkZWQgPSBmYWxzZTsKKyAgICBUaGlzLT5tX3BmbkVudHJ5UG9pbnQgPSBOVUxMOworICAgIFRoaXMtPm1fcEludGYgPQorICAgICAgICAoc3RydWN0IGFwYWNoZV9zb2FwX2ludGVyZmFjZSAqKWFwX3BjYWxsb2MocCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGVfc29hcF9pbnRlcmZhY2UpKTsKK30KKworc3RhdGljIFNvYXBTaGFyZWRMaWJyYXJ5ICoKK1NvYXBTaGFyZWRMaWJyYXJpZXNfZ2V0TGlicmFyeShTb2FwU2hhcmVkTGlicmFyaWVzICogVGhpcywgdW5zaWduZWQgbkluZGV4KQoreworICAgIFNvYXBTaGFyZWRMaWJyYXJ5ICoqcHBMaWJzID0gTlVMTDsKKyAgICBTb2FwU2hhcmVkTGlicmFyeSAqcExpYiA9IE5VTEw7CisKKyAgICBhc3NlcnQoTlVMTCAhPSBUaGlzKTsKKyAgICBhc3NlcnQoTlVMTCAhPSBUaGlzLT5tX3BMaWJyYXJpZXMpOworICAgIGFzc2VydChuSW5kZXggPj0gMCk7CisgICAgYXNzZXJ0KG5JbmRleCA8IFRoaXMtPm1fcExpYnJhcmllcy0+bmVsdHMpOworICAgIHBwTGlicyA9IChTb2FwU2hhcmVkTGlicmFyeSAqKikgVGhpcy0+bV9wTGlicmFyaWVzLT5lbHRzOworICAgIHBMaWIgPSBwcExpYnNbbkluZGV4XTsKKyAgICByZXR1cm4gcExpYjsKK30KKworLyoqCisgKiBAcGFyYW0gcHN6UGF0aCB0aGUgb3BlcmF0aW5nIHN5c3RlbSBuYW1lIG9mIHRoZSBsaWJyYXJ5LgorICovCitzdGF0aWMgYm9vbAorU29hcFNoYXJlZExpYnJhcmllc19jb250YWlucyhTb2FwU2hhcmVkTGlicmFyaWVzICogVGhpcywgY29uc3QgY2hhciAqcHN6UGF0aCkKK3sKKyAgICBpbnQgaSA9IDA7CisgICAgYm9vbCBiQ29udGFpbnMgPSBmYWxzZTsKKworICAgIGZvcihpID0gMDsgaSA8IFRoaXMtPm1fcExpYnJhcmllcy0+bmVsdHMgJiYgIWJDb250YWluczsgaSsrKQorICAgIHsKKyAgICAgICAgU29hcFNoYXJlZExpYnJhcnkgKnBMaWIgPSBTb2FwU2hhcmVkTGlicmFyaWVzX2dldExpYnJhcnkoVGhpcywgaSk7CisKKyAgICAgICAgYXNzZXJ0KE5VTEwgIT0gcExpYik7CisgICAgICAgIGlmKDAgPT0gc3RyY21wKHBzelBhdGgsIHBMaWItPm1fcHN6UGF0aCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJDb250YWlucyA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGJDb250YWluczsKK30KKworc3RhdGljIHZvaWQKK1NvYXBTaGFyZWRMaWJyYXJpZXNfYWRkTGlicmFyeShTb2FwU2hhcmVkTGlicmFyaWVzICogVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb2FwU2hhcmVkTGlicmFyeSAqIHBMaWJyYXJ5KQoreworICAgIGFzc2VydChOVUxMICE9IHBMaWJyYXJ5KTsKKyAgICBUaGlzLT5tX2JBbGxMaWJyYXJpZXNMb2FkZWQgPSBmYWxzZTsKKyAgICBpZighU29hcFNoYXJlZExpYnJhcmllc19jb250YWlucyhUaGlzLCBwTGlicmFyeS0+bV9wc3pQYXRoKSkKKyAgICB7CisgICAgICAgIFNvYXBTaGFyZWRMaWJyYXJ5ICoqcHBOZXdMaWIgPQorICAgICAgICAgICAgKFNvYXBTaGFyZWRMaWJyYXJ5ICoqKSBhcF9wdXNoX2FycmF5KFRoaXMtPm1fcExpYnJhcmllcyk7CisgICAgICAgICpwcE5ld0xpYiA9IHBMaWJyYXJ5OworICAgICAgICBpZihwTGlicmFyeS0+bV9iSXNTT0FQTGlicmFyeSkKKyAgICAgICAgeworICAgICAgICAgICAgVGhpcy0+bV9wU09BUExpYnJhcnkgPSBwTGlicmFyeTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKgorU29hcFNoYXJlZExpYnJhcmllc19nZXRFbnRyeVBvaW50cyhTb2FwU2hhcmVkTGlicmFyaWVzICogVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29hcFNoYXJlZExpYnJhcnkgKiBwTGliLCBwb29sICogcFRlbXBQb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X3JlYyAqIHIpCit7CisgICAgLyoKKyAgICAgKiBub3cgd2UgYWxzbyBwYXNzIHRoZSByZXF1ZXN0IHJlY29yZCAKKyAgICAgKi8KKyAgICAoKlRoaXMtPm1fcGZuRW50cnlQb2ludCkgKFRoaXMtPm1fcEludGYsIHIpOworICAgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIEByZXR1cm4gdGhlIGVycm9yIG1lc3NhZ2UgaWYgYSBsb2FkIGZhaWxlZCwgTlVMTCBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqCitTb2FwU2hhcmVkTGlicmFyaWVzX2xvYWRBbGxMaWJyYXJpZXMoU29hcFNoYXJlZExpYnJhcmllcyAqIFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbCAqIHBUZW1wUG9vbCwgcmVxdWVzdF9yZWMgKiByKQoreworICAgIGJvb2wgYkFsbExpYnJhcmllc0xvYWRlZCA9IGZhbHNlOworICAgIGNvbnN0IGNoYXIgKnBzekVycm9yID0gTlVMTDsKKyAgICBib29sIGJSZXRyeSA9IGZhbHNlOworICAgIGludCBpID0gMDsKKyAgICBpbnQgblJldHJ5ID0gMDsKKworICAgIGFzc2VydChOVUxMICE9IFRoaXMpOworCisgICAgaWYoVGhpcy0+bV9iQWxsTGlicmFyaWVzTG9hZGVkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZvcihuUmV0cnkgPSAwOyBuUmV0cnkgPCA1ICYmICFiQWxsTGlicmFyaWVzTG9hZGVkOyBuUmV0cnkrKykKKyAgICB7CisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIHBzekVycm9yID0gTlVMTDsKKyAgICAgICAgICAgIGJSZXRyeSA9IGZhbHNlOyAgICAgLy8gZG9uJ3QgdHJ5IGl0IGFnYWluLgorICAgICAgICAgICAgYkFsbExpYnJhcmllc0xvYWRlZCA9IHRydWU7CisgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBUaGlzLT5tX3BMaWJyYXJpZXMtPm5lbHRzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU29hcFNoYXJlZExpYnJhcnkgKnBMaWIgPQorICAgICAgICAgICAgICAgICAgICBTb2FwU2hhcmVkTGlicmFyaWVzX2dldExpYnJhcnkoVGhpcywgaSk7CisgICAgICAgICAgICAgICAgaWYoTlVMTCA9PSBwTGliLT5tX2hMaWJyYXJ5KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHN6RXJyb3IgPSBTb2FwU2hhcmVkTGlicmFyeV9sb2FkKHBMaWIsIHBUZW1wUG9vbCk7CisgICAgICAgICAgICAgICAgICAgIGlmKE5VTEwgPT0gcHN6RXJyb3IpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChOVUxMICE9IHBMaWItPm1faExpYnJhcnkpOworICAgICAgICAgICAgICAgICAgICAgICAgYlJldHJ5ID0gdHJ1ZTsgIC8vLzwgd2UgbG9hZGVkIG9uZSwgbGV0cyByZXRyeSB3aXRoIGFsbCBvdGhlcnMsIG1heWJlIHRoZXkgZGVwZW5kIG9uIHRoYXQuCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiQWxsTGlicmFyaWVzTG9hZGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoTlVMTCAhPSBwTGliLT5tX2hMaWJyYXJ5ICYmIHBMaWItPm1fYklzU09BUExpYnJhcnkpCisgICAgICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcGZ1biA9ICh2b2lkICopZGxzeW0ocExpYi0+bV9oTGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQQUNIRV9IVFRQU0VSVkVSX0VOVFJZX1BPSU5UKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoTlVMTCA9PSBwZnVuKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzekVycm9yID0gYXBfcHNwcmludGYocFRlbXBQb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdzb2FwOiBsb2FkIGxpYnJhcnkgXCIlc1wiIHN1Y2Nlc3MsIGJ1dCBmYWlsZWQgdG8gZmluZCB0aGUgXCIlc1wiIGVudHJ5IHBvaW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMaWItPm1fcHN6UGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQQUNIRV9IVFRQU0VSVkVSX0VOVFJZX1BPSU5UKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHN6RXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcy0+bV9wZm5FbnRyeVBvaW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFwYWNoZV9pbml0X3NvYXBfaW50ZXJmYWNlX2ZuKSBwZnVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzekVycm9yID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29hcFNoYXJlZExpYnJhcmllc19nZXRFbnRyeVBvaW50cyhUaGlzLCBwTGliLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wUG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB3aGlsZShiUmV0cnkpOworICAgIH0KKyAgICBpZihiQWxsTGlicmFyaWVzTG9hZGVkKQorICAgIHsKKyAgICAgICAgVGhpcy0+bV9iQWxsTGlicmFyaWVzTG9hZGVkID0gdHJ1ZTsKKyAgICAgICAgcHN6RXJyb3IgPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gcHN6RXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkCitTb2FwU2hhcmVkTGlicmFyaWVzX21lcmdlKFNvYXBTaGFyZWRMaWJyYXJpZXMgKiBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTb2FwU2hhcmVkTGlicmFyaWVzICogcExpYnMpCit7CisgICAgaW50IGkgPSAwOworCisgICAgYXNzZXJ0KE5VTEwgIT0gVGhpcyk7CisgICAgaWYoTlVMTCA9PSBwTGlicykKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgVGhpcy0+bV9iQWxsTGlicmFyaWVzTG9hZGVkID0gZmFsc2U7CisgICAgZm9yKGkgPSAwOyBpIDwgcExpYnMtPm1fcExpYnJhcmllcy0+bmVsdHM7IGkrKykKKyAgICB7CisgICAgICAgIFNvYXBTaGFyZWRMaWJyYXJ5ICpwTGliID0gU29hcFNoYXJlZExpYnJhcmllc19nZXRMaWJyYXJ5KHBMaWJzLCBpKTsKKworICAgICAgICBpZighU29hcFNoYXJlZExpYnJhcmllc19jb250YWlucyhUaGlzLCBwTGliLT5tX3BzelBhdGgpKQorICAgICAgICB7CisgICAgICAgICAgICBTb2FwU2hhcmVkTGlicmFyeSAqcE5ld0xpYiA9CisgICAgICAgICAgICAgICAgU29hcFNoYXJlZExpYnJhcnlfY3JlYXRlKFRoaXMtPm1fcFBvb2wpOworICAgICAgICAgICAgU29hcFNoYXJlZExpYnJhcnlfaW5pdChwTmV3TGliLCBUaGlzLT5tX3BQb29sLCBwTGliKTsKKyAgICAgICAgICAgIFNvYXBTaGFyZWRMaWJyYXJpZXNfYWRkTGlicmFyeShUaGlzLCBwTmV3TGliKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQKK1NvYXBTaGFyZWRMaWJyYXJpZXNfbWVyZ2UzKFNvYXBTaGFyZWRMaWJyYXJpZXMgKiBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU29hcFNoYXJlZExpYnJhcmllcyAqIGxpYnJhcmllczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTb2FwU2hhcmVkTGlicmFyaWVzICogbGlicmFyaWVzMikKK3sKKyAgICBTb2FwU2hhcmVkTGlicmFyaWVzX21lcmdlKFRoaXMsIGxpYnJhcmllczEpOworICAgIFNvYXBTaGFyZWRMaWJyYXJpZXNfbWVyZ2UoVGhpcywgbGlicmFyaWVzMik7Cit9CisKK3N0YXRpYyB2b2lkCitnc29hcENvbmZpZ3VyYXRpb25fbWVyZ2UoZ3NvYXBDb25maWd1cmF0aW9uICogVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBnc29hcENvbmZpZ3VyYXRpb24gKiBwUGFyZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdzb2FwQ29uZmlndXJhdGlvbiAqIHBOZXdDb25maWcpCit7CisgICAgYXNzZXJ0KE5VTEwgIT0gVGhpcyk7CisgICAgU29hcFNoYXJlZExpYnJhcmllc19tZXJnZTMoVGhpcy0+bV9wTGlicmFyaWVzLCBwUGFyZW50Q29uZmlnLT5tX3BMaWJyYXJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5ld0NvbmZpZy0+bV9wTGlicmFyaWVzKTsKKyAgICBUaGlzLT5tX1R5cGUgPSBjdF9ib3RoOworfQorCitzdGF0aWMgdm9pZAorZ3NvYXBDb25maWd1cmF0aW9uX2luaXQoZ3NvYXBDb25maWd1cmF0aW9uICogVGhpcywgcG9vbCAqIHApCit7CisgICAgVGhpcy0+bV9wTGlicmFyaWVzID0KKyAgICAgICAgKFNvYXBTaGFyZWRMaWJyYXJpZXMgKikgYXBfcGNhbGxvYyhwLCBzaXplb2YoU29hcFNoYXJlZExpYnJhcmllcykpOworICAgIFNvYXBTaGFyZWRMaWJyYXJpZXNfaW5pdChUaGlzLT5tX3BMaWJyYXJpZXMsIHApOworICAgIFRoaXMtPm1fVHlwZSA9IGN0X2RpcmVjdG9yeTsKK30KKworc3RhdGljIGdzb2FwQ29uZmlndXJhdGlvbiAqCitnc29hcENvbmZpZ3VyYXRpb25fY3JlYXRlKHBvb2wgKiBwKQoreworICAgIGdzb2FwQ29uZmlndXJhdGlvbiAqcENvbmZpZyA9CisgICAgICAgIChnc29hcENvbmZpZ3VyYXRpb24gKikgYXBfcGNhbGxvYyhwLCBzaXplb2YoZ3NvYXBDb25maWd1cmF0aW9uKSk7CisgICAgZ3NvYXBDb25maWd1cmF0aW9uX2luaXQocENvbmZpZywgcCk7CisgICAgcmV0dXJuIHBDb25maWc7Cit9CisKKy8qCisgKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKi8KK3N0YXRpYyBpbnQgZ3NvYXBfaGFuZGxlcihyZXF1ZXN0X3JlYyAqIHIpOworc3RhdGljIHZvaWQgZ3NvYXBfaW5pdChzZXJ2ZXJfcmVjICogcywgcG9vbCAqIHApOworc3RhdGljIHZvaWQgZ3NvYXBfY2hpbGRfaW5pdChzZXJ2ZXJfcmVjICogcywgcG9vbCAqIHApOworc3RhdGljIHZvaWQgZ3NvYXBfY2hpbGRfZXhpdChzZXJ2ZXJfcmVjICogcywgcG9vbCAqIHApOworc3RhdGljIHZvaWQgKmdzb2FwX2NyZWF0ZV9kaXJfY29uZmlnKHBvb2wgKiBwLCBjaGFyICpkaXJzcGVjKTsKK3N0YXRpYyB2b2lkICpnc29hcF9tZXJnZV9kaXJfY29uZmlnKHBvb2wgKiBwLCB2b2lkICpwYXJlbnRfY29uZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm5ld2xvY19jb25mKTsKK3N0YXRpYyB2b2lkICpnc29hcF9jcmVhdGVfc2VydmVyX2NvbmZpZyhwb29sICogcCwgc2VydmVyX3JlYyAqIHMpOworc3RhdGljIHZvaWQgKmdzb2FwX21lcmdlX3NlcnZlcl9jb25maWcocG9vbCAqIHAsIHZvaWQgKnNlcnZlcjFfY29uZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnNlcnZlcjJfY29uZik7CitzdGF0aWMgaW50IGdzb2FwX3Bvc3RfcmVhZF9yZXF1ZXN0KHJlcXVlc3RfcmVjICogcik7CitzdGF0aWMgaW50IGdzb2FwX3RyYW5zbGF0ZV9oYW5kbGVyKHJlcXVlc3RfcmVjICogcik7CitzdGF0aWMgaW50IGdzb2FwX2NoZWNrX3VzZXJfaWQocmVxdWVzdF9yZWMgKiByKTsKK3N0YXRpYyBpbnQgZ3NvYXBfYXV0aF9jaGVja2VyKHJlcXVlc3RfcmVjICogcik7CitzdGF0aWMgaW50IGdzb2FwX2FjY2Vzc19jaGVja2VyKHJlcXVlc3RfcmVjICogcik7CitzdGF0aWMgaW50IGdzb2FwX3R5cGVfY2hlY2tlcihyZXF1ZXN0X3JlYyAqIHIpOworc3RhdGljIGludCBnc29hcF9maXhlcl91cHBlcihyZXF1ZXN0X3JlYyAqIHIpOworc3RhdGljIGludCBnc29hcF9sb2dnZXIocmVxdWVzdF9yZWMgKiByKTsKK3N0YXRpYyBpbnQgZ3NvYXBfaGVhZGVyX3BhcnNlcihyZXF1ZXN0X3JlYyAqIHIpOworCitzdGF0aWMgYm9vbCBBZGRTaGFyZWRMaWJyYXJ5KGdzb2FwQ29uZmlndXJhdGlvbiAqIHBDb25maWcsIGNvbnN0IGNoYXIgKnBzelBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgYklzU09BUExpYnJhcnkpOworCisKKy8qCisgKiBXZSBwcm90b3R5cGVkIHRoZSB2YXJpb3VzIHN5bnRheCBmb3IgY29tbWFuZCBoYW5kbGVycyAocm91dGluZXMgdGhhdCAgICAgCisgKiBhcmUgY2FsbGVkIHdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gcGFyc2VyIGRldGVjdHMgYSBkaXJlY3RpdmUgZGVjbGFyZWQgICAgCisgKiBieSBvdXIgbW9kdWxlKSBlYXJsaWVyLiAgTm93IHdlIGFjdHVhbGx5IGRlY2xhcmUgYSAicmVhbCIgcm91dGluZSB0aGF0ICAgCisgKiB3aWxsIGJlIGludm9rZWQgYnkgdGhlIHBhcnNlciB3aGVuIG91ciAicmVhbCIgZGlyZWN0aXZlIGlzICAgICAgICAgICAgICAgCisgKiBlbmNvdW50ZXJlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBJZiBhIGNvbW1hbmQgaGFuZGxlciBlbmNvdW50ZXJzIGEgcHJvYmxlbSBwcm9jZXNzaW5nIHRoZSBkaXJlY3RpdmUsIGl0ICAgCisgKiBzaWduYWxzIHRoaXMgZmFjdCBieSByZXR1cm5pbmcgYSBub24tTlVMTCBwb2ludGVyIHRvIGEgc3RyaW5nICAgICAgICAgICAgCisgKiBkZXNjcmliaW5nIHRoZSBwcm9ibGVtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBUaGUgbWFnaWMgcmV0dXJuIHZhbHVlIERFQ0xJTkVfQ01EIGlzIHVzZWQgdG8gZGVhbCB3aXRoIGRpcmVjdGl2ZXMgICAgICAgCisgKiB0aGF0IG1pZ2h0IGJlIGRlY2xhcmVkIGJ5IG11bHRpcGxlIG1vZHVsZXMuICBJZiB0aGUgY29tbWFuZCBoYW5kbGVyICAgICAgCisgKiByZXR1cm5zIE5VTEwsIHRoZSBkaXJlY3RpdmUgd2FzIHByb2Nlc3NlZDsgaWYgaXQgcmV0dXJucyBERUNMSU5FX0NNRCwgICAgCisgKiB0aGUgbmV4dCBtb2R1bGUgKGlmIGFueSkgdGhhdCBkZWNsYXJlcyB0aGUgZGlyZWN0aXZlIGlzIGdpdmVuIGEgY2hhbmNlICAgCisgKiBhdCBpdC4gIElmIGl0IHJldHVybnMgYW55IG90aGVyIHZhbHVlLCBpdCdzIHRyZWF0ZWQgYXMgdGhlIHRleHQgb2YgYW4gICAgCisgKiBlcnJvciBtZXNzYWdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKgorICovCisKKy8qKiBDb21tYW5kIGhhbmRsZXIgZm9yIHRoZSBUQUtFMSAiU09BUExpYnJhcnkiIGRpcmVjdGl2ZS4KKyAqIFdlIHJlbWVtYmVyIHRoZSBsb2FkIHBhdGggZm9yIHRoZSBzaGFyZWQgbGlicmFyeSB0aGF0IGNvbnRhaW5zIHRoZSBTT0FQIHNlcnZlci4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKgorY21kX1NvYXBMaWJyYXJ5KGNtZF9wYXJtcyAqIGNtZCwgdm9pZCAqbWNvbmZpZywgY29uc3QgY2hhciAqcHN6UGF0aCkKK3sKKyAgICBnc29hcENvbmZpZ3VyYXRpb24gKnBDb25maWcgPSAoZ3NvYXBDb25maWd1cmF0aW9uICopIG1jb25maWc7CisKKyAgICBBZGRTaGFyZWRMaWJyYXJ5KHBDb25maWcsIHBzelBhdGgsIHRydWUpOworICAgIHJldHVybiBOVUxMOworfQorCisvKiogQ29tbWFuZCBoYW5kbGVyIGZvciB0aGUgVEFLRTEgIlNPQVBTdXBwb3J0TGlicmFyeSIgZGlyZWN0aXZlLgorICogV2UgcmVtZW1iZXIgdGhlIGxvYWQgcGF0aCBmb3IgYSBzaGFyZWQgbGlicmFyeSB0aGF0IG11c3QgYWRkaXRpb25hbGx5IGxvYWRlZC4KKyAqIFRoaXMgaXMgYSBtZWNoYW5pc20gdG8gbG9hZCBsaWJyYXJpZXMgdGhhdCB0aGUgU09BUExpYnJhcnkgZGVwZW5kcyBvbi4KKyAqIFRoaXMgdHlwZSBvZiBsaWJyYXJpZXMgZG8gbm90IGNvbnRhaW4gb3VyIHNvYXAgc2VydmVyLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqCitjbWRfU3VwcG9ydExpYnJhcnkoY21kX3Bhcm1zICogY21kLCB2b2lkICptY29uZmlnLCBjb25zdCBjaGFyICpwc3pQYXRoKQoreworICAgIGdzb2FwQ29uZmlndXJhdGlvbiAqcENvbmZpZyA9IChnc29hcENvbmZpZ3VyYXRpb24gKikgbWNvbmZpZzsKKworICAgIEFkZFNoYXJlZExpYnJhcnkocENvbmZpZywgcHN6UGF0aCwgZmFsc2UpOworICAgIHJldHVybiBOVUxMOworfQorCit0eXBlZGVmIGNvbnN0IGNoYXIgKigqY29tbWFuZF9mdW5jdGlvbl9pbnRlcmZhY2UpICgpOworCisvKiogTGlzdCBvZiBkaXJlY3RpdmVzIHNwZWNpZmljIHRvIG91ciBtb2R1bGUuCisgKi8KK3N0YXRpYyBjb25zdCBjb21tYW5kX3JlYyBnc29hcF9jbWRzW10gPSB7CisgICAgeworICAgICAiU09BUExpYnJhcnkiLCAgICAgICAgICAgICAvLy88IGRpcmVjdGl2ZSBuYW1lCisgICAgIChjb21tYW5kX2Z1bmN0aW9uX2ludGVyZmFjZSkgY21kX1NvYXBMaWJyYXJ5LCAgLy8vPCBjb25maWcgYWN0aW9uIHJvdXRpbmUKKyAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLy8vPCBhcmd1bWVudCB0byBpbmNsdWRlIGluIGNhbGwKKyAgICAgQUNDRVNTX0NPTkYsICAgICAgICAgICAgICAgLy8vPCB3aGVyZSBhdmFpbGFibGUKKyAgICAgVEFLRTEsICAgICAgICAgICAgICAgICAgICAgLy8vPCBhcmd1bWVudHMKKyAgICAgIlNPQVAgc2hhcmVkIExpYnJhcnkgdGhhdCB3aWxsIGJlIGR5bmFtaWNhbGx5IGxvYWRlZC4gLSAxIGFyZ3VtZW50IChwYXRoKSIgLy8vPCBkaXJlY3RpdmUgZGVzY3JpcHRpb24KKyAgICAgfSwKKyAgICB7CisgICAgICJTdXBwb3J0TGlicmFyeSIsICAgICAgICAgIC8vLzwgZGlyZWN0aXZlIG5hbWUKKyAgICAgKGNvbW1hbmRfZnVuY3Rpb25faW50ZXJmYWNlKSBjbWRfU3VwcG9ydExpYnJhcnksICAgLy8vPCBjb25maWcgYWN0aW9uIHJvdXRpbmUKKyAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLy8vPCBhcmd1bWVudCB0byBpbmNsdWRlIGluIGNhbGwKKyAgICAgQUNDRVNTX0NPTkYsICAgICAgICAgICAgICAgLy8vPCB3aGVyZSBhdmFpbGFibGUKKyAgICAgVEFLRTEsICAgICAgICAgICAgICAgICAgICAgLy8vPCBhcmd1bWVudHMKKyAgICAgImFkZGl0aW9uYWwgbGlicmFyeSB0aGF0IG11c3QgYmUgZHluYW1pY2FsbHkgbG9hZGVkIC0gMSBhcmd1bWVudCAocGF0aCkiICAgLy8vPCBkaXJlY3RpdmUgZGVzY3JpcHRpb24KKyAgICAgfSwKKyAgICB7TlVMTH0KK307CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogTm93IHRoZSBsaXN0IG9mIGNvbnRlbnQgaGFuZGxlcnMgYXZhaWxhYmxlIGZyb20gdGhpcyBtb2R1bGUuICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCisgKiBMaXN0IG9mIGNvbnRlbnQgaGFuZGxlcnMgb3VyIG1vZHVsZSBzdXBwbGllcy4gIEVhY2ggaGFuZGxlciBpcyBkZWZpbmVkIGJ5CisgKiB0d28gcGFydHM6IGEgbmFtZSBieSB3aGljaCBpdCBjYW4gYmUgcmVmZXJlbmNlZCAoc3VjaCBhcyBieQorICoge0FkZCxTZXR9SGFuZGxlciksIGFuZCB0aGUgYWN0dWFsIHJvdXRpbmUgbmFtZS4gIFRoZSBsaXN0IGlzIHRlcm1pbmF0ZWQgYnkKKyAqIGEgTlVMTCBibG9jaywgc2luY2UgaXQgY2FuIGJlIG9mIHZhcmlhYmxlIGxlbmd0aC4KKyAqCisgKiBOb3RlIHRoYXQgY29udGVudC1oYW5kbGVycyBhcmUgaW52b2tlZCBvbiBhIG1vc3Qtc3BlY2lmaWMgdG8gbGVhc3Qtc3BlY2lmaWMKKyAqIGJhc2lzOyB0aGF0IGlzLCBhIGhhbmRsZXIgdGhhdCBpcyBkZWNsYXJlZCBmb3IgInRleHQvcGxhaW4iIHdpbGwgYmUKKyAqIGludm9rZWQgYmVmb3JlIG9uZSB0aGF0IHdhcyBkZWNsYXJlZCBmb3IgInRleHQgLyAqIi4gIE5vdGUgYWxzbyB0aGF0CisgKiBpZiBhIGNvbnRlbnQtaGFuZGxlciByZXR1cm5zIGFueXRoaW5nIGV4Y2VwdCBERUNMSU5FRCwgbm8gb3RoZXIKKyAqIGNvbnRlbnQtaGFuZGxlcnMgd2lsbCBiZSBjYWxsZWQuCisgKi8KK3N0YXRpYyBjb25zdCBoYW5kbGVyX3JlYyBnc29hcF9oYW5kbGVyc1tdID0geworICAgIHsiZ3NvYXAtaGFuZGxlciIsIGdzb2FwX2hhbmRsZXJ9LAorICAgIHtOVUxMfQorfTsKKworLyoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEFsbCBvZiB0aGUgcm91dGluZXMgaGF2ZSBiZWVuIGRlY2xhcmVkIG5vdy4gIEhlcmUncyB0aGUgbGlzdCBvZiAgICAgICAgICAKKyAqIGRpcmVjdGl2ZXMgc3BlY2lmaWMgdG8gb3VyIG1vZHVsZSwgYW5kIGluZm9ybWF0aW9uIGFib3V0IHdoZXJlIHRoZXkgICAgICAKKyAqIG1heSBhcHBlYXIgYW5kIGhvdyB0aGUgY29tbWFuZCBwYXJzZXIgc2hvdWxkIHBhc3MgdGhlbSB0byB1cyBmb3IgICAgICAgICAKKyAqIHByb2Nlc3NpbmcuICBOb3RlIHRoYXQgY2FyZSBtdXN0IGJlIHRha2VuIHRvIGVuc3VyZSB0aGF0IHRoZXJlIGFyZSBOTyAgICAKKyAqIGNvbGxpc2lvbnMgb2YgZGlyZWN0aXZlIG5hbWVzIGJldHdlZW4gbW9kdWxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqLworCisvKgorICogTW9kdWxlIGRlZmluaXRpb24gZm9yIGNvbmZpZ3VyYXRpb24uICBJZiBhIHBhcnRpY3VsYXIgY2FsbGJhY2sgaXMgbm90CisgKiBuZWVkZWQsIHJlcGxhY2UgaXRzIHJvdXRpbmUgbmFtZSBiZWxvdyB3aXRoIHRoZSB3b3JkIE5VTEwuCisgKgorICogVGhlIG51bWJlciBpbiBicmFja2V0cyBpbmRpY2F0ZXMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSByb3V0aW5lIGlzIGNhbGxlZAorICogZHVyaW5nIHJlcXVlc3QgcHJvY2Vzc2luZy4gIE5vdGUgdGhhdCBub3QgYWxsIHJvdXRpbmVzIGFyZSBuZWNlc3NhcmlseQorICogY2FsbGVkIChzdWNoIGFzIGlmIGEgcmVzb3VyY2UgZG9lc24ndCBoYXZlIGFjY2VzcyByZXN0cmljdGlvbnMpLgorICovCisKKy8qKiBMaXN0IG9mIGNhbGxiYWNrIHJvdXRpbmVzIGFuZCBkYXRhIHN0cnVjdHVyZXMgdGhhdCBwcm92aWRlIHRoZSBob29rcyBpbnRvIG91ciBtb2R1bGUuCisgKi8KK21vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBnc29hcF9tb2R1bGUgPSB7CisgICAgU1RBTkRBUkRfTU9EVUxFX1NUVUZGLAorICAgIGdzb2FwX2luaXQsICAgICAgICAgICAgICAgICAvKiBtb2R1bGUgaW5pdGlhbGl6ZXIgKi8KKyAgICBnc29hcF9jcmVhdGVfZGlyX2NvbmZpZywgICAgLyogcGVyLWRpcmVjdG9yeSBjb25maWcgY3JlYXRvciAqLworICAgIGdzb2FwX21lcmdlX2Rpcl9jb25maWcsICAgICAvKiBkaXIgY29uZmlnIG1lcmdlciAqLworICAgIGdzb2FwX2NyZWF0ZV9zZXJ2ZXJfY29uZmlnLCAvKiBzZXJ2ZXIgY29uZmlnIGNyZWF0b3IgKi8KKyAgICBnc29hcF9tZXJnZV9zZXJ2ZXJfY29uZmlnLCAgLyogc2VydmVyIGNvbmZpZyBtZXJnZXIgKi8KKyAgICBnc29hcF9jbWRzLCAgICAgICAgICAgICAgICAgLyogY29tbWFuZCB0YWJsZSAqLworICAgIGdzb2FwX2hhbmRsZXJzLCAgICAgICAgICAgICAvKiBbOV0gbGlzdCBvZiBoYW5kbGVycyAqLworICAgIGdzb2FwX3RyYW5zbGF0ZV9oYW5kbGVyLCAgICAvKiBbMl0gZmlsZW5hbWUtdG8tVVJJIHRyYW5zbGF0aW9uICovCisgICAgZ3NvYXBfY2hlY2tfdXNlcl9pZCwgICAgICAgIC8qIFs1XSBjaGVjay92YWxpZGF0ZSB1c2VyX2lkICovCisgICAgZ3NvYXBfYXV0aF9jaGVja2VyLCAgICAgICAgIC8qIFs2XSBjaGVjayB1c2VyX2lkIGlzIHZhbGlkICpoZXJlKiAqLworICAgIGdzb2FwX2FjY2Vzc19jaGVja2VyLCAgICAgICAvKiBbNF0gY2hlY2sgYWNjZXNzIGJ5IGhvc3QgYWRkcmVzcyAqLworICAgIGdzb2FwX3R5cGVfY2hlY2tlciwgICAgICAgICAvKiBbN10gTUlNRSB0eXBlIGNoZWNrZXIvc2V0dGVyICovCisgICAgZ3NvYXBfZml4ZXJfdXBwZXIsICAgICAgICAgIC8qIFs4XSBmaXh1cHMgKi8KKyAgICBnc29hcF9sb2dnZXIsICAgICAgICAgICAgICAgLyogWzEwXSBsb2dnZXIgKi8KKyAgICBnc29hcF9oZWFkZXJfcGFyc2VyLCAgICAgICAgLyogWzNdIGhlYWRlciBwYXJzZXIgKi8KKyAgICBnc29hcF9jaGlsZF9pbml0LCAgICAgICAgICAgLyogcHJvY2VzcyBpbml0aWFsaXplciAqLworICAgIGdzb2FwX2NoaWxkX2V4aXQsICAgICAgICAgICAvKiBwcm9jZXNzIGV4aXQvY2xlYW51cCAqLworICAgIGdzb2FwX3Bvc3RfcmVhZF9yZXF1ZXN0ICAgICAvKiBbMV0gcG9zdCByZWFkX3JlcXVlc3QgaGFuZGxpbmcgKi8KK307CisKKy8qKiBoZWxwZXIgdG8gd3JpdGUgb3V0IHRoZSBoZWFkZXJzICovCitzdGF0aWMgaW50CitMaXN0SGVhZGVyc0NhbGxiYWNrKHZvaWQgKnJlYywgY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgICByZXF1ZXN0X3JlYyAqciA9IChyZXF1ZXN0X3JlYyAqKSByZWM7CisKKyAgICBhcF9ycHJpbnRmKHIsICIlczogJXM8YnI+Iiwga2V5LCB2YWx1ZSk7CisgICAgcmV0dXJuIDE7Cit9CisKKy8qKiB3cml0ZSBvdXQgdGhlIGhlYWRlcnMgb2YgdGhlIHJlcXVlc3QuICovCitzdGF0aWMgdm9pZAorTGlzdEhlYWRlcnMocmVxdWVzdF9yZWMgKiByKQoreworICAgIGFwX3RhYmxlX2RvKExpc3RIZWFkZXJzQ2FsbGJhY2ssIHIsIHItPmhlYWRlcnNfaW4sIE5VTEwpOworfQorCisvKiogc2VuZCB0aGUgZXJyb3IgbWVzc2FnZSB0byB0aGUgY2xpZW50IGJyb3dzZXIgKi8KK3N0YXRpYyB2b2lkCitTZW5kRXJyb3JNZXNzYWdlKHJlcXVlc3RfcmVjICogciwgY29uc3QgY2hhciAqcHN6RXJyb3IpCit7CisgICAgLyoKKyAgICAgKiBnc29hcENvbmZpZ3VyYXRpb24gKnBDb25maWcgPSBnZXRDb25maWd1cmF0aW9uKHIpOyAKKyAgICAgKi8KKworICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHItPnNlcnZlciwgIm1vZF9nc29hcDogJXMiLCBwc3pFcnJvcik7CisgICAgci0+Y29udGVudF90eXBlID0gInRleHQvaHRtbCI7CisgICAgYXBfc2VuZF9odHRwX2hlYWRlcihyKTsKKyAgICBhcF9ycHV0cyhET0NUWVBFX0hUTUxfM18yLCByKTsKKyAgICBhcF9ycHV0cygiPEhUTUw+XG4iLCByKTsKKyAgICBhcF9ycHV0cygiIDxIRUFEPlxuIiwgcik7CisgICAgYXBfcnB1dHMoIiAgPFRJVExFPkFwYWNoZSBTb2FwIEhhbmRsZXJcbiIsIHIpOworICAgIGFwX3JwdXRzKCIgIDwvVElUTEU+XG4iLCByKTsKKyAgICBhcF9ycHV0cygiIDwvSEVBRD5cbiIsIHIpOworICAgIGFwX3JwdXRzKCIgPEJPRFk+XG4iLCByKTsKKyAgICBhcF9ycHV0cygiICA8SDE+bW9kX2dzb2FwIEFwYWNoZSBTT0FQIFNlcnZlciBFcnJvcjwvSDE+XG4iLCByKTsKKyAgICBhcF9ycHJpbnRmKHIsCisgICAgICAgICAgICAgICAiPHA+PHN0cm9uZz4lczwvc3Ryb25nPjxicj5QbGVhc2Ugc2VlIHRoZSBkb2N1bWVudGF0aW9uIGF0IDxhIGhyZWY9XCJodHRwOi8vd3d3LndlYndhcmUuYXQvU09BUFwiPldlYldhcmU8L2E+IGZvciBkZXRhaWxzLjwvcD4iLAorICAgICAgICAgICAgICAgcHN6RXJyb3IpOworICAgIGFwX3JwdXRzKCIgIDxIMj5Db250ZW50IGhlYWRlcnMgb2YgdGhlIHJlcXVlc3Q8L0gyPlxuIiwgcik7CisgICAgTGlzdEhlYWRlcnMocik7CisgICAgYXBfcnB1dHMoIjwvQk9EWT48L0hUTUw+XG4iLCByKTsKK30KK3N0YXRpYyBpbnQKK3NlbmRfaGVhZGVyX3RvX2dzb2FwKHZvaWQgKnB2b2lkLCBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbHVlKQoreworICAgIGdzb2FwUmVxdWVzdENvbmZpZ3VyYXRpb24gKnBScUNvbmYgPSBOVUxMOworICAgIHN0cnVjdCBzb2FwICpwc29hcCA9IChzdHJ1Y3Qgc29hcCAqKXB2b2lkOworCisgICAgaWYoTlVMTCAhPSBwc29hcCkKKyAgICB7CisgICAgICAgIHBScUNvbmYgPSBnZXRSZXF1ZXN0Q29uZmlndXJhdGlvbihwc29hcCk7CisgICAgfQorICAgIGlmKE5VTEwgPT0gcFJxQ29uZikKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZigwID09IHN0cmNhc2VjbXAoa2V5LCAiU09BUEFjdGlvbiIpIHx8CisgICAgICAgMCA9PSBzdHJjYXNlY21wKGtleSwgIkNvbnRlbnQtVHlwZSIpIHx8CisgICAgICAgMCA9PSBzdHJjYXNlY21wKGtleSwgIlN0YXR1cyIpIHx8IDAgPT0gc3RyY2FzZWNtcChrZXksICJDb250ZW50LUxlbmd0aCIpKQorICAgIHsKKyAgICAgICAgcHNvYXAtPmZwYXJzZWhkcihwc29hcCwga2V5LCB2YWx1ZSk7CisgICAgfQorICAgIHJldHVybiAxOworfQorCisvKgorICogQ2FsbGJhY2sgZnVuY3Rpb25zIGZvciBnc29hcC4gV2UgbXVzdCBwYXJzZSB0aGUgaGVhZGVycyBvdXJzZWx2ZXMgYW5kIAorICogd2UgbXVzdCBoYW5kbGUgc2VuZC9yZWNlaXZlIHByb3Blcmx5LiAgCisgKi8KK3N0YXRpYyBpbnQKK2h0dHBfcG9zdF9oZWFkZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisgICAgZ3NvYXBSZXF1ZXN0Q29uZmlndXJhdGlvbiAqcFJxQ29uZiA9IGdldFJlcXVlc3RDb25maWd1cmF0aW9uKHNvYXApOworICAgIHJlcXVlc3RfcmVjICpyID0gTlVMTCA9PSBwUnFDb25mID8gTlVMTCA6IHBScUNvbmYtPnI7CisKKyAgICBpZihOVUxMICE9IHZhbHVlKQorICAgIHsKKyAgICAgICAgaWYoMCA9PSBzdHJjYXNlY21wKGtleSwgIlNPQVBBY3Rpb24iKSkKKyAgICAgICAgeworICAgICAgICAgICAgYXBfdGFibGVfc2V0KHItPmhlYWRlcnNfb3V0LCBrZXksIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKDAgPT0gc3RyY2FzZWNtcChrZXksICJDb250ZW50LVR5cGUiKSkKKyAgICAgICAgeworICAgICAgICAgICAgci0+Y29udGVudF90eXBlID0gYXBfcHN0cmR1cChyLT5wb29sLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZigwID09IHN0cmNhc2VjbXAoa2V5LCAiQ29udGVudC1MZW5ndGgiKSkKKyAgICAgICAgeworICAgICAgICAgICAgYXBfc2V0X2NvbnRlbnRfbGVuZ3RoKHIsIGF0b2kodmFsdWUpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gU09BUF9PSzsKK30KKworLyoqIGdzb2FwIGZ1bmN0aW9uIHRoYXQgcmVxdWVzdHMgdGhlIG5leHQgcGllY2Ugb2YgZGF0YSBmcm9tIHVzICovCitzdGF0aWMgc2l6ZV90CitmcmVjdihzdHJ1Y3Qgc29hcCAqcHNvYXAsIGNoYXIgKnBCdWYsIHNpemVfdCBsZW4pCit7CisgICAgcmVxdWVzdF9yZWMgKnIgPSBOVUxMOworICAgIGludCBuUmV0ID0gMDsKKyAgICBnc29hcFJlcXVlc3RDb25maWd1cmF0aW9uICpwUnFDb25mID0gZ2V0UmVxdWVzdENvbmZpZ3VyYXRpb24ocHNvYXApOworCisgICAgaWYoTlVMTCAhPSBwUnFDb25mKQorICAgIHsKKyAgICAgICAgciA9IHBScUNvbmYtPnI7CisgICAgICAgIGlmKCFwUnFDb25mLT5oZWFkZXJzX3JlY2VpdmVkKQorICAgICAgICB7CisgICAgICAgICAgICBhcF90YWJsZV9kbyhzZW5kX2hlYWRlcl90b19nc29hcCwgcHNvYXAsIHItPmhlYWRlcnNfaW4sIE5VTEwpOworICAgICAgICAgICAgcFJxQ29uZi0+aGVhZGVyc19yZWNlaXZlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYoci0+cmVtYWluaW5nID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgblJldCA9CisgICAgICAgICAgICAgICAgYXBfZ2V0X2NsaWVudF9ibG9jayhyLCBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID4gci0+cmVtYWluaW5nID8gci0+cmVtYWluaW5nIDogbGVuKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gblJldDsKK30KK3N0YXRpYyBpbnQKK2ZzZW5kKHN0cnVjdCBzb2FwICpwc29hcCwgY29uc3QgY2hhciAqcEJ1Ziwgc2l6ZV90IGxlbikKK3sKKyAgICBpbnQgblJldCA9IFNPQVBfT0s7CisgICAgZ3NvYXBSZXF1ZXN0Q29uZmlndXJhdGlvbiAqcFJxQ29uZiA9IGdldFJlcXVlc3RDb25maWd1cmF0aW9uKHBzb2FwKTsKKworICAgIGlmKE5VTEwgIT0gcFJxQ29uZikKKyAgICB7CisgICAgICAgIHJlcXVlc3RfcmVjICpyID0gcFJxQ29uZi0+cjsKKworICAgICAgICBpZighcFJxQ29uZi0+aGVhZGVyc19zZW50KQorICAgICAgICB7CisgICAgICAgICAgICBhcF9zZW5kX2h0dHBfaGVhZGVyKHIpOworICAgICAgICAgICAgcFJxQ29uZi0+aGVhZGVyc19zZW50ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBuUmV0ID0gYXBfcndyaXRlKHBCdWYsIGxlbiwgcikgPT0gbGVuID8gU09BUF9PSyA6IFNPQVBfRkFVTFQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG5SZXQgPSBTT0FQX0ZBVUxUOworICAgIH0KKyAgICByZXR1cm4gblJldDsKK30KKworLyoqIGluc3RlYWQgb2YgcmVhbCBoZWFkZXIgcGFyc2luZyB3ZSBza2lwIHRoYXQuICovCitzdGF0aWMgaW50CitodHRwX3BhcnNlKHN0cnVjdCBzb2FwICpwc29hcCkKK3sKKyAgICByZXR1cm4gU09BUF9PSzsKK30KKworLyoKKyAqIHBsdWdpbiBmdW5jdGlvbnMgCisgKi8KK3N0YXRpYyBpbnQKK21vZF9nc29hcF9wbHVnaW5fY29weShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGx1Z2luICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvYXBfcGx1Z2luICpzcmMpCit7CisgICAgKmRzdCA9ICpzcmM7CisgICAgLyoKKyAgICAgKiBzaG91bGQgdGhpcyBiZSBhIGRlZXAgY29weT8gCisgICAgICovCisgICAgcmV0dXJuIFNPQVBfT0s7Cit9CitzdGF0aWMgdm9pZAorbW9kX2dzb2FwX2RlbGV0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGx1Z2luICpwKQoreworfQorc3RhdGljIGludAorbW9kX2dzb2FwX3BsdWdpbihzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGx1Z2luICpwLCB2b2lkICphcmcpCit7CisgICAgcC0+aWQgPSBHU09BUF9JRDsKKyAgICBwLT5kYXRhID0gYXJnOworICAgIHAtPmZjb3B5ID0gbW9kX2dzb2FwX3BsdWdpbl9jb3B5OworICAgIHAtPmZkZWxldGUgPSBtb2RfZ3NvYXBfZGVsZXRlOworICAgIHJldHVybiBTT0FQX09LOworfQorc3RhdGljIHZvaWQKK3NldF9jYWxsYmFja3MocmVxdWVzdF9yZWMgKiByLCBnc29hcFJlcXVlc3RDb25maWd1cmF0aW9uICogcFJxQ29uZiwKKyAgICAgICAgICAgICAgc3RydWN0IHNvYXAgKnBzb2FwKQoreworICAgIGdzb2FwQ29uZmlndXJhdGlvbiAqcENvbmZpZyA9IGdldENvbmZpZ3VyYXRpb24ocik7CisgICAgc3RydWN0IGFwYWNoZV9zb2FwX2ludGVyZmFjZSAqcEludGYgPSBwQ29uZmlnLT5tX3BMaWJyYXJpZXMtPm1fcEludGY7CisKKyAgICBwUnFDb25mLT5yID0gcjsKKyAgICBwUnFDb25mLT5odHRwX3BhcnNlID0gcHNvYXAtPmZwYXJzZTsKKyAgICBwc29hcC0+dXNlciA9IHBScUNvbmY7CisgICAgcHNvYXAtPmZyZWN2ID0gZnJlY3Y7CisgICAgcHNvYXAtPmZzZW5kID0gZnNlbmQ7CisgICAgcHNvYXAtPmZwYXJzZSA9IGh0dHBfcGFyc2U7CisgICAgcHNvYXAtPmZwb3N0aGRyID0gaHR0cF9wb3N0X2hlYWRlcjsKKyAgICBpZihOVUxMICE9IHBJbnRmLT5mc29hcF9pbml0KQorICAgIHsKKyAgICAgICAgKCpwSW50Zi0+ZnNvYXBfcmVnaXN0ZXJfcGx1Z2luX2FyZykgKHBzb2FwLCBtb2RfZ3NvYXBfcGx1Z2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwUnFDb25mLCByKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcHNvYXAtPnVzZXIgPSBwUnFDb25mOworICAgIH0KK30KKworLyoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIE5vdyB3ZSBkZWNsYXJlIG91ciBjb250ZW50IGhhbmRsZXJzLCB3aGljaCBhcmUgaW52b2tlZCB3aGVuIHRoZSBzZXJ2ZXIgICAKKyAqIGVuY291bnRlcnMgYSBkb2N1bWVudCB3aGljaCBvdXIgbW9kdWxlIGlzIHN1cHBvc2VkIHRvIGhhdmUgYSBjaGFuY2UgdG8gICAKKyAqIHNlZS4gIChTZWUgbW9kX21pbWUncyBTZXRIYW5kbGVyIGFuZCBBZGRIYW5kbGVyIGRpcmVjdGl2ZXMsIGFuZCB0aGUgICAgICAKKyAqIG1vZF9pbmZvIGFuZCBtb2Rfc3RhdHVzIGV4YW1wbGVzLCBmb3IgbW9yZSBkZXRhaWxzLikgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFNpbmNlIGNvbnRlbnQgaGFuZGxlcnMgYXJlIGR1bXBpbmcgZGF0YSBkaXJlY3RseSBpbnRvIHRoZSBjb25uZXhpb24gICAgICAKKyAqICh1c2luZyB0aGUgciooKSByb3V0aW5lcywgc3VjaCBhcyBycHV0cygpIGFuZCBycHJpbnRmKCkpIHdpdGhvdXQgICAgICAgICAKKyAqIGludGVydmVudGlvbiBieSBvdGhlciBwYXJ0cyBvZiB0aGUgc2VydmVyLCB0aGV5IG5lZWQgdG8gbWFrZSAgICAgICAgICAgICAKKyAqIHN1cmUgYW55IGFjY3VtdWxhdGVkIEhUVFAgaGVhZGVycyBhcmUgc2VudCBmaXJzdC4gIFRoaXMgaXMgZG9uZSBieSAgICAgICAKKyAqIGNhbGxpbmcgc2VuZF9odHRwX2hlYWRlcigpLiAgT3RoZXJ3aXNlLCBubyBoZWFkZXIgd2lsbCBiZSBzZW50IGF0IGFsbCwgICAKKyAqIGFuZCB0aGUgb3V0cHV0IHNlbnQgdG8gdGhlIGNsaWVudCB3aWxsIGFjdHVhbGx5IGJlIEhUVFAtdW5jb21wbGlhbnQuICAgICAKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKioKKyAqIFNPQVAgY29udGVudCBoYW5kbGVyLgorICoKKyAqIEByZXR1cm4gdGhlIHZhbHVlIHRoYXQgaW5zdHJ1Y3RzIHRoZSBjYWxsZXIgY29uY2VybmluZyB3aGF0IGhhcHBlbmVkIGFuZCB3aGF0IHRvIGRvIG5leHQuCisgKiAgT0sgKCJ3ZSBkaWQgb3VyIHRoaW5nIikKKyAqICBERUNMSU5FRCAoInRoaXMgaXNuJ3Qgc29tZXRoaW5nIHdpdGggd2hpY2ggd2Ugd2FudCB0byBnZXQgaW52b2x2ZWQiKQorICogIEhUVFBfbXVtYmxlICgiYW4gZXJyb3Igc3RhdHVzIHNob3VsZCBiZSByZXBvcnRlZCIpCisgKi8KK3N0YXRpYyBpbnQKK2dzb2FwX2hhbmRsZXIocmVxdWVzdF9yZWMgKiByKQoreworICAgIHN0YXRpYyBjb25zdCBpbnQgblJlc3BvbnNlQnVmZmVyTGVuID0gSU9CVUZfQ0hVTktfU0laRTsKKyAgICBjb25zdCBjaGFyICpwc3pFcnJvciA9IE5VTEw7CisgICAgc3RydWN0IHNvYXAgKnBzb2FwID0gTlVMTDsKKyAgICBzdHJ1Y3QgYXBhY2hlX3NvYXBfaW50ZXJmYWNlICpwSW50ZiA9IE5VTEw7CisgICAgaW50IG5SZXQgPSAwOworCisgICAgLyoKKyAgICAgKiBjaGFyICpwc3pSZXNwb25zZSA9IGFwX3BjYWxsb2Moci0+cG9vbCwgblJlc3BvbnNlQnVmZmVyTGVuKTsgCisgICAgICovCisgICAgZ3NvYXBDb25maWd1cmF0aW9uICpwQ29uZmlnID0gZ2V0Q29uZmlndXJhdGlvbihyKTsKKyAgICBnc29hcFJlcXVlc3RDb25maWd1cmF0aW9uICpwUnFDb25mID0gTlVMTDsKKworICAgIGFzc2VydChOVUxMICE9IHBDb25maWcpOworCisgICAgcHNvYXAgPSAoc3RydWN0IHNvYXAgKilhcF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihzdHJ1Y3Qgc29hcCkpOworICAgIHBScUNvbmYgPSBhcF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihnc29hcFJlcXVlc3RDb25maWd1cmF0aW9uKSk7CisgICAgcHN6RXJyb3IgPQorICAgICAgICBTb2FwU2hhcmVkTGlicmFyaWVzX2xvYWRBbGxMaWJyYXJpZXMocENvbmZpZy0+bV9wTGlicmFyaWVzLCByLT5wb29sLCByKTsKKyAgICBwSW50ZiA9IHBDb25maWctPm1fcExpYnJhcmllcy0+bV9wSW50ZjsKKworICAgIGFwX3VwZGF0ZV9tdGltZShyLCByLT5yZXF1ZXN0X3RpbWUpOworICAgIGFwX3NldF9sYXN0X21vZGlmaWVkKHIpOworICAgIGlmKE5VTEwgIT0gcHN6RXJyb3IpCisgICAgeworICAgICAgICBzdGF0aWMgYm9vbCBiRmlyc3RUaW1lID0gdHJ1ZTsKKworICAgICAgICBpZihiRmlyc3RUaW1lKQorICAgICAgICB7CisgICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLT5zZXJ2ZXIsIHBzekVycm9yKTsKKyAgICAgICAgICAgIGJGaXJzdFRpbWUgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKE5VTEwgPT0gcHN6RXJyb3IpCisgICAgeworICAgICAgICBpZihNX1BPU1QgIT0gci0+bWV0aG9kX251bWJlciAmJiBNX0dFVCAhPSByLT5tZXRob2RfbnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBwc3pFcnJvciA9ICJPbmx5IFBPU1QgYW5kIEdFVCBhbGxvd2VkIGFzIHJlcXVlc3QgZm9yIFNPQVAhIjsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKgorICAgICAqIGFzIGEgbmV4dCBzdGVwLCB3ZSBwcmVwYXJlIGEgYnVmZmVyIHRoYXQgc2VuZHMgdGhlIHJlcXVlc3QgYXMgZmlyc3QgbGluZSB0byBnc29hcC4gCisgICAgICogVGhlbiB0aGUgcmVtYWluaW5nIGRhdGEuIAorICAgICAqIFdlIHN0YXJ0IHJldHVybmluZyBieXRlcyBvbiBmcmVjdiBmcm9tIHRoaXMgYnVmZmVyLCB1bnRpbCBpdCBpcyBlbXB0eS4gCisgICAgICogdGhlbiBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGZpZGRsZSBhcm91bmQgd2l0aCBnc29hcCdzIHJlcXVlc3QgbGluZSBwYXJzaW5nLgorICAgICAqLworICAgIGlmKE5VTEwgPT0gcHN6RXJyb3IpCisgICAgeworICAgICAgICBwUnFDb25mLT5yID0gcjsKKyAgICAgICAgcFJxQ29uZi0+aGVhZGVyc19zZW50ID0gZmFsc2U7CisgICAgICAgIHBScUNvbmYtPmhlYWRlcnNfcmVjZWl2ZWQgPSBmYWxzZTsKKyAgICAgICAgcFJxQ29uZi0+bV9wc3pBbGxIZWFkZXJzID0gTlVMTDsKKyAgICAgICAgcFJxQ29uZi0+bV9uSGVhZGVyTGVuZ3RoID0gc3RybGVuKHItPnRoZV9yZXF1ZXN0KSArIDI7CisgICAgICAgIHBScUNvbmYtPm1fcHN6Q3VycmVudEhlYWRlclJlYWRpbmdQb3NpdGlvbiA9IE5VTEw7CisgICAgICAgIHBScUNvbmYtPm1fbk91dEJ1ZkNvdW50ID0gMDsKKyAgICAgICAgcFJxQ29uZi0+bV9uT3V0QnVmTGVuZ3RoID0gblJlc3BvbnNlQnVmZmVyTGVuOworICAgICAgICBwUnFDb25mLT5tX3BPdXRCdWYgPSBhcF9wY2FsbG9jKHItPnBvb2wsIG5SZXNwb25zZUJ1ZmZlckxlbik7CisgICAgICAgIHBScUNvbmYtPmh0dHBfcGFyc2UgPSBOVUxMOworICAgICAgICBwUnFDb25mLT5tX3BzekFsbEhlYWRlcnMgPQorICAgICAgICAgICAgYXBfcGNhbGxvYyhyLT5wb29sLCBwUnFDb25mLT5tX25IZWFkZXJMZW5ndGggKyAxKTsKKyAgICAgICAgcFJxQ29uZi0+bV9wc3pDdXJyZW50SGVhZGVyUmVhZGluZ1Bvc2l0aW9uID0gcFJxQ29uZi0+bV9wc3pBbGxIZWFkZXJzOworICAgICAgICBzdHJjcHkocFJxQ29uZi0+bV9wc3pBbGxIZWFkZXJzLCByLT50aGVfcmVxdWVzdCk7CisgICAgICAgIHN0cmNhdChwUnFDb25mLT5tX3BzekFsbEhlYWRlcnMsICJcclxuIik7CisgICAgICAgIHBScUNvbmYtPnBJbnRmID0gcEludGY7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBXZSdyZSBhYm91dCB0byBzdGFydCBzZW5kaW5nIGNvbnRlbnQsIHNvIHdlIG5lZWQgdG8gZm9yY2UgdGhlIEhUVFAKKyAgICAgKiBoZWFkZXJzIHRvIGJlIHNlbnQgYXQgdGhpcyBwb2ludC4gIE90aGVyd2lzZSwgbm8gaGVhZGVycyB3aWxsIGJlIHNlbnQKKyAgICAgKiBhdCBhbGwuICBXZSBjYW4gc2V0IGFueSB3ZSBsaWtlIGZpcnN0LCBvZiBjb3Vyc2UuICAqKk5PVEUqKiBIZXJlJ3MKKyAgICAgKiB3aGVyZSB5b3Ugc2V0IHRoZSAiQ29udGVudC10eXBlIiBoZWFkZXIsIGFuZCB5b3UgZG8gc28gYnkgcHV0dGluZyBpdCBpbgorICAgICAqIHItPmNvbnRlbnRfdHlwZSwgKm5vdCogci0+aGVhZGVyc19vdXQoIkNvbnRlbnQtdHlwZSIpLiAgSWYgeW91IGRvbid0CisgICAgICogc2V0IGl0LCBpdCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoIHRoZSBzZXJ2ZXIncyBkZWZhdWx0IHR5cGUgKHR5cGljYWxseQorICAgICAqICJ0ZXh0L3BsYWluIikuICBZb3UgKm11c3QqIGFsc28gZW5zdXJlIHRoYXQgci0+Y29udGVudF90eXBlIGlzIGxvd2VyCisgICAgICogY2FzZS4KKyAgICAgKgorICAgICAqIFdlIGFsc28gbmVlZCB0byBzdGFydCBhIHRpbWVyIHNvIHRoZSBzZXJ2ZXIgY2FuIGtub3cgaWYgdGhlIGNvbm5lY3Rpb24KKyAgICAgKiBpcyBicm9rZW4uCisgICAgICovCisgICAgYXBfc29mdF90aW1lb3V0KCJnc29hcCB4bWwgcmVzcG9uc2UiLCByKTsKKyAgICAvKgorICAgICAqIElmIHdlJ3JlIG9ubHkgc3VwcG9zZWQgdG8gc2VuZCBoZWFkZXIgaW5mb3JtYXRpb24gKEhFQUQgcmVxdWVzdCksIHdlJ3JlCisgICAgICogYWxyZWFkeSB0aGVyZS4KKyAgICAgKi8KKyAgICBpZihyLT5oZWFkZXJfb25seSkKKyAgICB7CisgICAgICAgIGFwX3NlbmRfaHR0cF9oZWFkZXIocik7CisgICAgICAgIGFwX2tpbGxfdGltZW91dChyKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICBpZihOVUxMICE9IHBzekVycm9yKQorICAgIHsKKyAgICAgICAgU2VuZEVycm9yTWVzc2FnZShyLCBwc3pFcnJvcik7CisgICAgICAgIGFwX2tpbGxfdGltZW91dChyKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICBuUmV0ID0gYXBfc2V0dXBfY2xpZW50X2Jsb2NrKHIsIFJFUVVFU1RfQ0hVTktFRF9ERUNIVU5LKTsKKyAgICBpZihPSyAhPSBuUmV0KQorICAgIHsKKyAgICAgICAgU2VuZEVycm9yTWVzc2FnZShyLCAiRmFpbGVkIHRvIHN0YXJ0IHJlY2VpdmluZyBQT1NUIGJ1ZmZlciIpOworICAgICAgICBhcF9raWxsX3RpbWVvdXQocik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgblJldCA9IGFwX3Nob3VsZF9jbGllbnRfYmxvY2socik7CisgICAgaWYoMCA9PSBuUmV0KQorICAgIHsKKyAgICAgICAgU2VuZEVycm9yTWVzc2FnZShyLCAiTm8gYm9keSByZWNlaXZlZCIpOworICAgICAgICBhcF9raWxsX3RpbWVvdXQocik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBpZihOVUxMICE9IHBzekVycm9yKQorICAgIHsKKyAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgci0+c2VydmVyLCBwc3pFcnJvcik7CisgICAgICAgIFNlbmRFcnJvck1lc3NhZ2UociwgcHN6RXJyb3IpOworICAgICAgICBhcF9raWxsX3RpbWVvdXQocik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgaWYoTlVMTCAhPSBwSW50Zi0+ZnNvYXBfaW5pdCkKKyAgICB7CisgICAgICAgICgqcEludGYtPmZzb2FwX2luaXQpIChwc29hcCwgcik7CisgICAgICAgIHBzb2FwLT5uYW1lc3BhY2VzID0gcEludGYtPm5hbWVzcGFjZXM7CisgICAgICAgIHNldF9jYWxsYmFja3MociwgcFJxQ29uZiwgcHNvYXApOworICAgICAgICBpZihOVUxMICE9IHBJbnRmLT5mc29hcF9zZXJ2ZSkKKyAgICAgICAgeworICAgICAgICAgICAgKCpwSW50Zi0+ZnNvYXBfc2VydmUpIChwc29hcCwgcik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBTZW5kRXJyb3JNZXNzYWdlKHIsICJubyBzb2FwX3NlcnZlIGVudHJ5IHBvaW50Iik7CisgICAgICAgICAgICBhcF9raWxsX3RpbWVvdXQocik7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgaWYoTlVMTCAhPSBwSW50Zi0+ZnNvYXBfZGVzdHJveSkKKyAgICAgICAgeworICAgICAgICAgICAgcEludGYtPmZzb2FwX2Rlc3Ryb3kocHNvYXAsIHIpOyAvLyBub3QgYW4gZXJyb3IgaW4gMi4xLjEwIGFueSBtb3JlLgorICAgICAgICB9CisgICAgICAgIGlmKE5VTEwgIT0gcEludGYtPmZzb2FwX2VuZCkKKyAgICAgICAgeworICAgICAgICAgICAgcEludGYtPmZzb2FwX2VuZChwc29hcCwgcik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBTZW5kRXJyb3JNZXNzYWdlKHIsICJubyBzb2FwX2VuZCBlbnRyeSBwb2ludCIpOworICAgICAgICAgICAgYXBfa2lsbF90aW1lb3V0KHIpOworICAgICAgICB9CisgICAgICAgIGlmKE5VTEwgIT0gcEludGYtPmZzb2FwX2RvbmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnRmLT5mc29hcF9kb25lKHBzb2FwLCByKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFNlbmRFcnJvck1lc3NhZ2UociwgIm5vIHNvYXBfZG9uZSBlbnRyeSBwb2ludCIpOworICAgICAgICAgICAgYXBfa2lsbF90aW1lb3V0KHIpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFNlbmRFcnJvck1lc3NhZ2UociwgIm5vIHNvYXBfaW5pdCBlbnRyeSBwb2ludCIpOworICAgICAgICBhcF9raWxsX3RpbWVvdXQocik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFdlIGRpZCB3aGF0IHdlIHdhbnRlZCB0byBkbywgc28gdGVsbCB0aGUgcmVzdCBvZiB0aGUgc2VydmVyIHdlCisgICAgICogc3VjY2VlZGVkLiBXZSBuZWVkIG5vdCBkZWxldGUgcHN6UmVzcG9uc2UsIGJlY2F1c2UgaXQgd2FzIGFsbG9jYXRlZCBmcm9tIHRoZSByZXF1ZXN0IHBvb2wuCisgICAgICovCisgICAgYXBfa2lsbF90aW1lb3V0KHIpOworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICogTm93IGxldCdzIGRlY2xhcmUgcm91dGluZXMgZm9yIGVhY2ggb2YgdGhlIGNhbGxiYWNrIHBoYXNlIGluIG9yZGVyLiAgICAgIAorICogKiAoVGhhdCdzIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5J3JlIGxpc3RlZCBpbiB0aGUgY2FsbGJhY2sgbGlzdCwgKm5vdCAgICAgCisgKiAqIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgc2VydmVyIGNhbGxzIHRoZW0hICBTZWUgdGhlIGNvbW1hbmRfcmVjICAgICAgICAgICAKKyAqICogZGVjbGFyYXRpb24pLiAgTm90ZSB0aGF0IHRoZXNlIG1heSBiZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogKiBjYWxsZWQgZm9yIHNpdHVhdGlvbnMgdGhhdCBkb24ndCByZWxhdGUgcHJpbWFyaWx5IHRvIG91ciBmdW5jdGlvbiAtIGluICAgCisgKiAqIG90aGVyIHdvcmRzLCB0aGUgZml4dXAgaGFuZGxlciBzaG91bGRuJ3QgYXNzdW1lIHRoYXQgdGhlIHJlcXVlc3QgaGFzICAgICAKKyAqICogdG8gZG8gd2l0aCAiZ3NvYXAiIHN0dWZmLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAqIFdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgY29udGVudCBoYW5kbGVyLCBhbGwgb2Ygb3VyIHJvdXRpbmVzIHdpbGwgYmUgICAKKyAqICogY2FsbGVkIGZvciBlYWNoIHJlcXVlc3QsIHVubGVzcyBhbiBlYXJsaWVyIGhhbmRsZXIgZnJvbSBhbm90aGVyIG1vZHVsZSAgIAorICogKiBhYm9ydGVkIHRoZSBzZXF1ZW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICogSGFuZGxlcnMgdGhhdCBhcmUgZGVjbGFyZWQgYXMgImludCIgY2FuIHJldHVybiB0aGUgZm9sbG93aW5nOiAgICAgICAgICAgIAorICogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAqICBPSyAgICAgICAgICBIYW5kbGVyIGFjY2VwdGVkIHRoZSByZXF1ZXN0IGFuZCBkaWQgaXRzIHRoaW5nIHdpdGggaXQuICAgICAKKyAqICogIERFQ0xJTkVEICAgIEhhbmRsZXIgdG9vayBubyBhY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogKiAgSFRUUF9tdW1ibGUgSGFuZGxlciBsb29rZWQgYXQgcmVxdWVzdCBhbmQgZm91bmQgaXQgd2FudGluZy4gICAgICAgICAgICAgCisgKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICogV2hhdCB0aGUgc2VydmVyIGRvZXMgYWZ0ZXIgY2FsbGluZyBhIG1vZHVsZSBoYW5kbGVyIGRlcGVuZHMgdXBvbiB0aGUgICAgIAorICogKiBoYW5kbGVyJ3MgcmV0dXJuIHZhbHVlLiAgSW4gYWxsIGNhc2VzLCBpZiB0aGUgaGFuZGxlciByZXR1cm5zICAgICAgICAgICAgCisgKiAqIERFQ0xJTkVELCB0aGUgc2VydmVyIHdpbGwgY29udGludWUgdG8gdGhlIG5leHQgbW9kdWxlIHdpdGggYW4gaGFuZGxlciAgICAKKyAqICogZm9yIHRoZSBjdXJyZW50IHBoYXNlLiAgSG93ZXZlciwgaWYgdGhlIGhhbmRsZXIgcmV0dXJuIGEgbm9uLU9LLCAgICAgICAgIAorICogKiBub24tREVDTElORUQgc3RhdHVzLCB0aGUgc2VydmVyIGFib3J0cyB0aGUgcmVxdWVzdCByaWdodCB0aGVyZS4gIElmICAgICAgCisgKiAqIHRoZSBoYW5kbGVyIHJldHVybnMgT0ssIHRoZSBzZXJ2ZXIncyBuZXh0IGFjdGlvbiBpcyBwaGFzZS1zcGVjaWZpYzsgICAgICAKKyAqICogc2VlIHRoZSBpbmRpdmlkdWFsIGhhbmRsZXIgY29tbWVudHMgYmVsb3cgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgIAorICogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZHVyaW5nIHNlcnZlciBpbml0aWFsaXNhdGlvbi4gIEFueSBpbmZvcm1hdGlvbgorICogdGhhdCBuZWVkcyB0byBiZSByZWNvcmRlZCBtdXN0IGJlIGluIHN0YXRpYyBjZWxscywgc2luY2UgdGhlcmUncyBubworICogY29uZmlndXJhdGlvbiByZWNvcmQuCisgKgorICogVGhlcmUgaXMgbm8gcmV0dXJuIHZhbHVlLgorICovCisKK3N0YXRpYyB2b2lkCitnc29hcF9pbml0KHNlcnZlcl9yZWMgKiBzLCBwb29sICogcCkKK3sKKyAgICAvLyAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBzLCAibW9kX2dzb2FwIGluaXRpYWxpemVkIiwgTlVMTCk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBkdXJpbmcgc2VydmVyIGluaXRpYWxpc2F0aW9uIHdoZW4gYW4gaGVhdnktd2VpZ2h0CisgKiBwcm9jZXNzIChzdWNoIGFzIGEgY2hpbGQpIGlzIGJlaW5nIGluaXRpYWxpc2VkLiAgQXMgd2l0aCB0aGUKKyAqIG1vZHVsZS1pbml0aWFsaXNhdGlvbiBmdW5jdGlvbiwgYW55IGluZm9ybWF0aW9uIHRoYXQgbmVlZHMgdG8gYmUgcmVjb3JkZWQKKyAqIG11c3QgYmUgaW4gc3RhdGljIGNlbGxzLCBzaW5jZSB0aGVyZSdzIG5vIGNvbmZpZ3VyYXRpb24gcmVjb3JkLgorICoKKyAqIFRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZS4KKyAqLworCitzdGF0aWMgdm9pZAorZ3NvYXBfY2hpbGRfaW5pdChzZXJ2ZXJfcmVjICogcywgcG9vbCAqIHApCit7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGFuIGhlYXZ5LXdlaWdodCBwcm9jZXNzIChzdWNoIGFzIGEgY2hpbGQpIGlzCisgKiBiZWluZyBydW4gZG93biBvciBkZXN0cm95ZWQuICBBcyB3aXRoIHRoZSBjaGlsZC1pbml0aWFsaXNhdGlvbiBmdW5jdGlvbiwKKyAqIGFueSBpbmZvcm1hdGlvbiB0aGF0IG5lZWRzIHRvIGJlIHJlY29yZGVkIG11c3QgYmUgaW4gc3RhdGljIGNlbGxzLCBzaW5jZQorICogdGhlcmUncyBubyBjb25maWd1cmF0aW9uIHJlY29yZC4KKyAqCisgKiBUaGVyZSBpcyBubyByZXR1cm4gdmFsdWUuCisgKi8KKworc3RhdGljIHZvaWQKK2dzb2FwX2NoaWxkX2V4aXQoc2VydmVyX3JlYyAqIHMsIHBvb2wgKiBwKQoreworICAgIC8vZ3NvYXBDb25maWd1cmF0aW9uOjpnZXRMaWJyYXJpZXMoKS0+Y2xlYXIoKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgdG8gY3JlYXRlIGEgcGVyLWRpcmVjdG9yeSBjb25maWd1cmF0aW9uCisgKiByZWNvcmQuICBUaGlzIHdpbGwgYmUgY2FsbGVkIGZvciB0aGUgImRlZmF1bHQiIHNlcnZlciBlbnZpcm9ubWVudCwgYW5kIGZvcgorICogZWFjaCBkaXJlY3RvcnkgZm9yIHdoaWNoIHRoZSBwYXJzZXIgZmluZHMgYW55IG9mIG91ciBkaXJlY3RpdmVzIGFwcGxpY2FibGUuCisgKiBJZiBhIGRpcmVjdG9yeSBkb2Vzbid0IGhhdmUgYW55IG9mIG91ciBkaXJlY3RpdmVzIGludm9sdmVkIChpLmUuLCB0aGV5CisgKiBhcmVuJ3QgaW4gdGhlIC5odGFjY2VzcyBmaWxlLCBvciBhIDxMb2NhdGlvbj4sIDxEaXJlY3Rvcnk+LCBvciByZWxhdGVkCisgKiBibG9jayksIHRoaXMgcm91dGluZSB3aWxsICpub3QqIGJlIGNhbGxlZCAtIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUKKyAqIGNsb3Nlc3QgYW5jZXN0b3IgaXMgdXNlZC4KKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgcG9pbnRlciB0byB0aGUgY3JlYXRlZCBtb2R1bGUtc3BlY2lmaWMKKyAqIHN0cnVjdHVyZS4KKyAqLworc3RhdGljIHZvaWQgKgorZ3NvYXBfY3JlYXRlX2Rpcl9jb25maWcocG9vbCAqIHAsIGNoYXIgKmRpcnNwZWMpCit7CisgICAgZ3NvYXBDb25maWd1cmF0aW9uICpwQ29uZmlnID0gZ3NvYXBDb25maWd1cmF0aW9uX2NyZWF0ZShwKTsKKworICAgIHBDb25maWctPm1fVHlwZSA9IGN0X2RpcmVjdG9yeTsKKyAgICByZXR1cm4gcENvbmZpZzsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgdG8gbWVyZ2UgdHdvIHBlci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbgorICogcmVjb3Jkcy4gIFRoaXMgaXMgdHlwaWNhbGx5IGRvbmUgdG8gY29wZSB3aXRoIHRoaW5ncyBsaWtlIC5odGFjY2VzcyBmaWxlcworICogb3IgPExvY2F0aW9uPiBkaXJlY3RpdmVzIGZvciBkaXJlY3RvcmllcyB0aGF0IGFyZSBiZW5lYXRoIG9uZSBmb3Igd2hpY2ggYQorICogY29uZmlndXJhdGlvbiByZWNvcmQgd2FzIGFscmVhZHkgY3JlYXRlZC4gIFRoZSByb3V0aW5lIGhhcyB0aGUKKyAqIHJlc3BvbnNpYmlsaXR5IG9mIGNyZWF0aW5nIGEgbmV3IHJlY29yZCBhbmQgbWVyZ2luZyB0aGUgY29udGVudHMgb2YgdGhlCisgKiBvdGhlciB0d28gaW50byBpdCBhcHByb3ByaWF0ZWx5LiAgSWYgdGhlIG1vZHVsZSBkb2Vzbid0IGRlY2xhcmUgYSBtZXJnZQorICogcm91dGluZSwgdGhlIHJlY29yZCBmb3IgdGhlIGNsb3Nlc3QgYW5jZXN0b3IgbG9jYXRpb24gKHRoYXQgaGFzIG9uZSkgaXMKKyAqIHVzZWQgZXhjbHVzaXZlbHkuCisgKgorICogVGhlIHJvdXRpbmUgTVVTVCBOT1QgbW9kaWZ5IGFueSBvZiBpdHMgYXJndW1lbnRzIQorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBwb2ludGVyIHRvIHRoZSBjcmVhdGVkIG1vZHVsZS1zcGVjaWZpYyBzdHJ1Y3R1cmUKKyAqIGNvbnRhaW5pbmcgdGhlIG1lcmdlZCB2YWx1ZXMuCisgKi8KK3N0YXRpYyB2b2lkICoKK2dzb2FwX21lcmdlX2Rpcl9jb25maWcocG9vbCAqIHAsIHZvaWQgKnBhcmVudF9jb25mLCB2b2lkICpuZXdsb2NfY29uZikKK3sKKyAgICBnc29hcENvbmZpZ3VyYXRpb24gKnBNZXJnZWRDb25maWcgPSBnc29hcENvbmZpZ3VyYXRpb25fY3JlYXRlKHApOworICAgIGdzb2FwQ29uZmlndXJhdGlvbiAqcFBhcmVudENvbmZpZyA9IChnc29hcENvbmZpZ3VyYXRpb24gKikgcGFyZW50X2NvbmY7CisgICAgZ3NvYXBDb25maWd1cmF0aW9uICpwTmV3Q29uZmlnID0gKGdzb2FwQ29uZmlndXJhdGlvbiAqKSBuZXdsb2NfY29uZjsKKworICAgIGdzb2FwQ29uZmlndXJhdGlvbl9tZXJnZShwTWVyZ2VkQ29uZmlnLCBwUGFyZW50Q29uZmlnLCBwTmV3Q29uZmlnKTsKKyAgICByZXR1cm4gcE1lcmdlZENvbmZpZzsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgdG8gY3JlYXRlIGEgcGVyLXNlcnZlciBjb25maWd1cmF0aW9uCisgKiByZWNvcmQuICBJdCB3aWxsIGFsd2F5cyBiZSBjYWxsZWQgZm9yIHRoZSAiZGVmYXVsdCIgc2VydmVyLgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBwb2ludGVyIHRvIHRoZSBjcmVhdGVkIG1vZHVsZS1zcGVjaWZpYworICogc3RydWN0dXJlLgorICovCitzdGF0aWMgdm9pZCAqCitnc29hcF9jcmVhdGVfc2VydmVyX2NvbmZpZyhwb29sICogcCwgc2VydmVyX3JlYyAqIHMpCit7CisgICAgZ3NvYXBDb25maWd1cmF0aW9uICpwQ29uZmlnID0gZ3NvYXBDb25maWd1cmF0aW9uX2NyZWF0ZShwKTsKKworICAgIHBDb25maWctPm1fVHlwZSA9IGN0X3NlcnZlcjsKKyAgICByZXR1cm4gcENvbmZpZzsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgdG8gbWVyZ2UgdHdvIHBlci1zZXJ2ZXIgY29uZmlndXJhdGlvbgorICogcmVjb3Jkcy4gIFRoaXMgaXMgdHlwaWNhbGx5IGRvbmUgdG8gY29wZSB3aXRoIHRoaW5ncyBsaWtlIHZpcnR1YWwgaG9zdHMgYW5kCisgKiB0aGUgZGVmYXVsdCBzZXJ2ZXIgY29uZmlndXJhdGlvbi4gVGhlIHJvdXRpbmUgaGFzIHRoZSByZXNwb25zaWJpbGl0eSBvZgorICogY3JlYXRpbmcgYSBuZXcgcmVjb3JkIGFuZCBtZXJnaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgb3RoZXIgdHdvIGludG8gaXQKKyAqIGFwcHJvcHJpYXRlbHkuIElmIHRoZSBtb2R1bGUgZG9lc24ndCBkZWNsYXJlIGEgbWVyZ2Ugcm91dGluZSwgdGhlIG1vcmUKKyAqIHNwZWNpZmljIGV4aXN0aW5nIHJlY29yZCBpcyB1c2VkIGV4Y2x1c2l2ZWx5LgorICoKKyAqIFRoZSByb3V0aW5lIE1VU1QgTk9UIG1vZGlmeSBhbnkgb2YgaXRzIGFyZ3VtZW50cyEKKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgcG9pbnRlciB0byB0aGUgY3JlYXRlZCBtb2R1bGUtc3BlY2lmaWMgc3RydWN0dXJlCisgKiBjb250YWluaW5nIHRoZSBtZXJnZWQgdmFsdWVzLgorICovCitzdGF0aWMgdm9pZCAqCitnc29hcF9tZXJnZV9zZXJ2ZXJfY29uZmlnKHBvb2wgKiBwLCB2b2lkICpzZXJ2ZXIxX2NvbmYsIHZvaWQgKnNlcnZlcjJfY29uZikKK3sKKyAgICBnc29hcENvbmZpZ3VyYXRpb24gKnBNZXJnZWRDb25maWcgPSBnc29hcENvbmZpZ3VyYXRpb25fY3JlYXRlKHApOworICAgIGdzb2FwQ29uZmlndXJhdGlvbiAqcFNlcnZlcjFDb25maWcgPSAoZ3NvYXBDb25maWd1cmF0aW9uICopIHNlcnZlcjFfY29uZjsKKyAgICBnc29hcENvbmZpZ3VyYXRpb24gKnBTZXJ2ZXIyQ29uZmlnID0gKGdzb2FwQ29uZmlndXJhdGlvbiAqKSBzZXJ2ZXIyX2NvbmY7CisKKyAgICBnc29hcENvbmZpZ3VyYXRpb25fbWVyZ2UocE1lcmdlZENvbmZpZywgcFNlcnZlcjFDb25maWcsIHBTZXJ2ZXIyQ29uZmlnKTsKKyAgICBwTWVyZ2VkQ29uZmlnLT5tX1R5cGUgPSBjdF9zZXJ2ZXI7CisgICAgcmV0dXJuICh2b2lkICopcE1lcmdlZENvbmZpZzsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHJlcXVlc3QgaGFzIGJlZW4gcmVhZCBidXQgYmVmb3JlIGFueSBvdGhlcgorICogcGhhc2VzIGhhdmUgYmVlbiBwcm9jZXNzZWQuICBUaGlzIGFsbG93cyB1cyB0byBtYWtlIGRlY2lzaW9ucyBiYXNlZCB1cG9uCisgKiB0aGUgaW5wdXQgaGVhZGVyIGZpZWxkcy4KKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIE9LLCBERUNMSU5FRCwgb3IgSFRUUF9tdW1ibGUuICBJZiB3ZSByZXR1cm4gT0ssIG5vCisgKiBmdXJ0aGVyIG1vZHVsZXMgYXJlIGNhbGxlZCBmb3IgdGhpcyBwaGFzZS4KKyAqLworc3RhdGljIGludAorZ3NvYXBfcG9zdF9yZWFkX3JlcXVlc3QocmVxdWVzdF9yZWMgKiByKQoreworICAgIHJldHVybiBERUNMSU5FRDsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBnaXZlcyBvdXIgbW9kdWxlIGFuIG9wcG9ydHVuaXR5IHRvIHRyYW5zbGF0ZSB0aGUgVVJJIGludG8gYW4KKyAqIGFjdHVhbCBmaWxlbmFtZS4gIElmIHdlIGRvbid0IGRvIGFueXRoaW5nIHNwZWNpYWwsIHRoZSBzZXJ2ZXIncyBkZWZhdWx0CisgKiBydWxlcyAoQWxpYXMgZGlyZWN0aXZlcyBhbmQgdGhlIGxpa2UpIHdpbGwgY29udGludWUgdG8gYmUgZm9sbG93ZWQuCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyBPSywgREVDTElORUQsIG9yIEhUVFBfbXVtYmxlLiAgSWYgd2UgcmV0dXJuIE9LLCBubworICogZnVydGhlciBtb2R1bGVzIGFyZSBjYWxsZWQgZm9yIHRoaXMgcGhhc2UuCisgKi8KK3N0YXRpYyBpbnQKK2dzb2FwX3RyYW5zbGF0ZV9oYW5kbGVyKHJlcXVlc3RfcmVjICogcikKK3sKKyAgICByZXR1cm4gREVDTElORUQ7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGNoZWNrIHRoZSBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBzZW50IHdpdGgKKyAqIHRoZSByZXF1ZXN0IChzdWNoIGFzIGxvb2tpbmcgdXAgdGhlIHVzZXIgaW4gYSBkYXRhYmFzZSBhbmQgdmVyaWZ5aW5nIHRoYXQKKyAqIHRoZSBbZW5jcnlwdGVkXSBwYXNzd29yZCBzZW50IG1hdGNoZXMgdGhlIG9uZSBpbiB0aGUgZGF0YWJhc2UpLgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgT0ssIERFQ0xJTkVELCBvciBzb21lIEhUVFBfbXVtYmxlIGVycm9yICh0eXBpY2FsbHkKKyAqIEhUVFBfVU5BVVRIT1JJWkVEKS4gIElmIHdlIHJldHVybiBPSywgbm8gb3RoZXIgbW9kdWxlcyBhcmUgZ2l2ZW4gYSBjaGFuY2UKKyAqIGF0IHRoZSByZXF1ZXN0IGR1cmluZyB0aGlzIHBoYXNlLgorICovCitzdGF0aWMgaW50Citnc29hcF9jaGVja191c2VyX2lkKHJlcXVlc3RfcmVjICogcikKK3sKKyAgICByZXR1cm4gREVDTElORUQ7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGNoZWNrIHRvIHNlZSBpZiB0aGUgcmVzb3VyY2UgYmVpbmcgcmVxdWVzdGVkCisgKiByZXF1aXJlcyBhdXRob3Jpc2F0aW9uLgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgT0ssIERFQ0xJTkVELCBvciBIVFRQX211bWJsZS4gIElmIHdlIHJldHVybiBPSywgbm8KKyAqIG90aGVyIG1vZHVsZXMgYXJlIGNhbGxlZCBkdXJpbmcgdGhpcyBwaGFzZS4KKyAqCisgKiBJZiAqYWxsKiBtb2R1bGVzIHJldHVybiBERUNMSU5FRCwgdGhlIHJlcXVlc3QgaXMgYWJvcnRlZCB3aXRoIGEgc2VydmVyCisgKiBlcnJvci4KKyAqLworc3RhdGljIGludAorZ3NvYXBfYXV0aF9jaGVja2VyKHJlcXVlc3RfcmVjICogcikKK3sKKyAgICByZXR1cm4gREVDTElORUQ7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGNoZWNrIGZvciBhbnkgbW9kdWxlLXNwZWNpZmljIHJlc3RyaWN0aW9ucyBwbGFjZWQKKyAqIHVwb24gdGhlIHJlcXVlc3RlZCByZXNvdXJjZS4gIChTZWUgdGhlIG1vZF9hY2Nlc3MgbW9kdWxlIGZvciBhbiBleGFtcGxlLikKKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIE9LLCBERUNMSU5FRCwgb3IgSFRUUF9tdW1ibGUuICBBbGwgbW9kdWxlcyB3aXRoIGFuCisgKiBoYW5kbGVyIGZvciB0aGlzIHBoYXNlIGFyZSBjYWxsZWQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZWlyIHByZWRlY2Vzc29ycworICogcmV0dXJuIE9LIG9yIERFQ0xJTkVELiAgVGhlIGZpcnN0IG9uZSB0byByZXR1cm4gYW55IG90aGVyIHN0YXR1cywgaG93ZXZlciwKKyAqIHdpbGwgYWJvcnQgdGhlIHNlcXVlbmNlIChhbmQgdGhlIHJlcXVlc3QpIGFzIHVzdWFsLgorICovCitzdGF0aWMgaW50Citnc29hcF9hY2Nlc3NfY2hlY2tlcihyZXF1ZXN0X3JlYyAqIHIpCit7CisgICAgcmV0dXJuIERFQ0xJTkVEOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBkZXRlcm1pbmUgYW5kL29yIHNldCB0aGUgdmFyaW91cyBkb2N1bWVudCB0eXBlCisgKiBpbmZvcm1hdGlvbiBiaXRzLCBsaWtlIENvbnRlbnQtdHlwZSAodmlhIHItPmNvbnRlbnRfdHlwZSksIGxhbmd1YWdlLCBldAorICogY2V0ZXJhLgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgT0ssIERFQ0xJTkVELCBvciBIVFRQX211bWJsZS4gIElmIHdlIHJldHVybiBPSywgbm8KKyAqIGZ1cnRoZXIgbW9kdWxlcyBhcmUgZ2l2ZW4gYSBjaGFuY2UgYXQgdGhlIHJlcXVlc3QgZm9yIHRoaXMgcGhhc2UuCisgKi8KK3N0YXRpYyBpbnQKK2dzb2FwX3R5cGVfY2hlY2tlcihyZXF1ZXN0X3JlYyAqIHIpCit7CisgICAgcmV0dXJuIERFQ0xJTkVEOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBwZXJmb3JtIGFueSBtb2R1bGUtc3BlY2lmaWMgZml4aW5nIG9mIGhlYWRlcgorICogZmllbGRzLCBldCBjZXRlcmEuICBJdCBpcyBpbnZva2VkIGp1c3QgYmVmb3JlIGFueSBjb250ZW50LWhhbmRsZXIuCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyBPSywgREVDTElORUQsIG9yIEhUVFBfbXVtYmxlLiAgSWYgd2UgcmV0dXJuIE9LLCB0aGUKKyAqIHNlcnZlciB3aWxsIHN0aWxsIGNhbGwgYW55IHJlbWFpbmluZyBtb2R1bGVzIHdpdGggYW4gaGFuZGxlciBmb3IgdGhpcworICogcGhhc2UuCisgKi8KK3N0YXRpYyBpbnQKK2dzb2FwX2ZpeGVyX3VwcGVyKHJlcXVlc3RfcmVjICogcikKK3sKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIHBlcmZvcm0gYW55IG1vZHVsZS1zcGVjaWZpYyBsb2dnaW5nIGFjdGl2aXRpZXMKKyAqIG92ZXIgYW5kIGFib3ZlIHRoZSBub3JtYWwgc2VydmVyIHRoaW5ncy4KKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIE9LLCBERUNMSU5FRCwgb3IgSFRUUF9tdW1ibGUuICBJZiB3ZSByZXR1cm4gT0ssIGFueQorICogcmVtYWluaW5nIG1vZHVsZXMgd2l0aCBhbiBoYW5kbGVyIGZvciB0aGlzIHBoYXNlIHdpbGwgc3RpbGwgYmUgY2FsbGVkLgorICovCitzdGF0aWMgaW50Citnc29hcF9sb2dnZXIocmVxdWVzdF9yZWMgKiByKQoreworICAgIHJldHVybiBERUNMSU5FRDsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gZ2l2ZSB0aGUgbW9kdWxlIGEgY2hhbmNlIHRvIGxvb2sgYXQgdGhlIHJlcXVlc3QKKyAqIGhlYWRlcnMgYW5kIHRha2UgYW55IGFwcHJvcHJpYXRlIHNwZWNpZmljIGFjdGlvbnMgZWFybHkgaW4gdGhlIHByb2Nlc3NpbmcKKyAqIHNlcXVlbmNlLgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgT0ssIERFQ0xJTkVELCBvciBIVFRQX211bWJsZS4gIElmIHdlIHJldHVybiBPSywgYW55CisgKiByZW1haW5pbmcgbW9kdWxlcyB3aXRoIGhhbmRsZXJzIGZvciB0aGlzIHBoYXNlIHdpbGwgc3RpbGwgYmUgY2FsbGVkLgorICovCitzdGF0aWMgaW50Citnc29hcF9oZWFkZXJfcGFyc2VyKHJlcXVlc3RfcmVjICogcikKK3sKKyAgICByZXR1cm4gREVDTElORUQ7Cit9CisKKy8qKiBoZWxwZXIgZnVuY2l0b24gZm9yIGxpYnJhcnkgY29tbWFuZCBoYW5kbGVyLgorICogQHBhcmFtIHBzelBhdGggdGhlIHBhdGggb2YgdGhlIGxpYnJhcnkuCisgKiBAcGFyYW0gYklzU09BUExpYnJhcnkgdHJ1ZSBpZiBpdCBpcyBhIHNoYXJlZCBsaWJyYXJ5IGNvbnRhaW5pbmcgYSBTT0FQIHNlcnZlci4KKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbGlicmFyeSB3YXMgYWRkZWQsIGZhbHNlIGlmIGl0IHdhcyBhbGVhZHkgaW4gdGhlIGNvbGxlY3Rpb24uCisgKi8KK3N0YXRpYyBib29sCitBZGRTaGFyZWRMaWJyYXJ5KGdzb2FwQ29uZmlndXJhdGlvbiAqIHBDb25maWcsIGNvbnN0IGNoYXIgKnBzelBhdGgsCisgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgYklzU09BUExpYnJhcnkpCit7CisgICAgYm9vbCBiQWRkZWQgPSBmYWxzZTsKKyAgICBwb29sICpwUG9vbCA9IGdzb2FwQ29uZmlndXJhdGlvbl9nZXRNb2R1bGVQb29sKCk7CisKKyAgICBpZighU29hcFNoYXJlZExpYnJhcmllc19jb250YWlucyhwQ29uZmlnLT5tX3BMaWJyYXJpZXMsIHBzelBhdGgpKQorICAgIHsKKyAgICAgICAgU29hcFNoYXJlZExpYnJhcnkgKnBMaWJyYXJ5ID0gU29hcFNoYXJlZExpYnJhcnlfY3JlYXRlKHBQb29sKTsKKworICAgICAgICBTb2FwU2hhcmVkTGlicmFyeV9pbml0MihwTGlicmFyeSwgcFBvb2wsIGFwX3BzdHJkdXAocFBvb2wsIHBzelBhdGgpKTsKKyAgICAgICAgcExpYnJhcnktPm1fYklzU09BUExpYnJhcnkgPSBiSXNTT0FQTGlicmFyeTsKKyAgICAgICAgU29hcFNoYXJlZExpYnJhcmllc19hZGRMaWJyYXJ5KHBDb25maWctPm1fcExpYnJhcmllcywgcExpYnJhcnkpOworICAgICAgICBiQWRkZWQgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gYkFkZGVkOworfQorc3RhdGljIGdzb2FwQ29uZmlndXJhdGlvbiAqCitnZXRDb25maWd1cmF0aW9uKHJlcXVlc3RfcmVjICogcikKK3sKKyAgICByZXR1cm4gKGdzb2FwQ29uZmlndXJhdGlvbiAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5wZXJfZGlyX2NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3NvYXBfbW9kdWxlKTsKK30KK3N0YXRpYyBnc29hcFJlcXVlc3RDb25maWd1cmF0aW9uICoKK2dldFJlcXVlc3RDb25maWd1cmF0aW9uKHN0cnVjdCBzb2FwICpzb2FwKQoreworICAgIGdzb2FwUmVxdWVzdENvbmZpZ3VyYXRpb24gKnBScUNvbmYgPQorICAgICAgICAoZ3NvYXBSZXF1ZXN0Q29uZmlndXJhdGlvbiAqKSBzb2FwLT5mcGx1Z2luKHNvYXAsIEdTT0FQX0lEKTsKKyAgICByZXR1cm4gcFJxQ29uZjsKK30KKworCisvKgorICogUGF0Y2ggZnJvbSBSeWFuIFRyb2xsCisgKgorICogSW1wbG1lbWVudCB0aGVzZSBhcyB3ZWFrIHN5bWJvbHMsIGFsbG93aW5nIHN5bWJvbCBjaGVja2luZyBkdXJpbmcKKyAqIGNvbXBpbGF0aW9uIHRvIHN1Y2NlZWQsIGV2ZW4gd2hlbiBhbm90aGVyIG9iamVjdCBpcyBhY3R1YWxseQorICogcHJvdmlkaW5nIHRoZXNlIHN5bWJvbHMgYXQgcnVudGltZS4KKyAqLworU09BUF9OTUFDIHN0cnVjdCBOYW1lc3BhY2UgbmFtZXNwYWNlc1tdIF9fYXR0cmlidXRlX18gKCh3ZWFrKSk7CitTT0FQX05NQUMgc3RydWN0IE5hbWVzcGFjZSBuYW1lc3BhY2VzW10gPSB7CisgICAgeyJTT0FQLUVOViIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIsCisgICAgICJodHRwOi8vd3d3LnczLm9yZy8qL3NvYXAtZW52ZWxvcGUifSwKKyAgICB7IlNPQVAtRU5DIiwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiwKKyAgICAgImh0dHA6Ly93d3cudzMub3JnLyovc29hcC1lbmNvZGluZyJ9LAorICAgIHsieHNpIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKKyAgICAgImh0dHA6Ly93d3cudzMub3JnLyovWE1MU2NoZW1hLWluc3RhbmNlIn0sCisgICAgeyJ4c2QiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLAorICAgICAiaHR0cDovL3d3dy53My5vcmcvKi9YTUxTY2hlbWEifSwKKyAgICB7TlVMTCwgTlVMTH0KK307CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplaGVhZGVyKHN0cnVjdCBzb2FwICpzb2FwKQorICAgIF9fYXR0cmlidXRlX18gKCh3ZWFrKSk7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNAorc29hcF9zZXJpYWxpemVoZWFkZXIoc3RydWN0IHNvYXAgKnNvYXApCit7CisgICAgZ3NvYXBSZXF1ZXN0Q29uZmlndXJhdGlvbiAqcFJxQ29uZiA9IGdldFJlcXVlc3RDb25maWd1cmF0aW9uKHNvYXApOworCisgICAgcFJxQ29uZi0+cEludGYtPnNvYXBfc2VyaWFsaXplaGVhZGVyKHNvYXApOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0aGVhZGVyKHN0cnVjdCBzb2FwICpzb2FwKQorICAgIF9fYXR0cmlidXRlX18gKCh3ZWFrKSk7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0Citzb2FwX3B1dGhlYWRlcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyAgICBnc29hcFJlcXVlc3RDb25maWd1cmF0aW9uICpwUnFDb25mID0gZ2V0UmVxdWVzdENvbmZpZ3VyYXRpb24oc29hcCk7CisKKyAgICByZXR1cm4gcFJxQ29uZi0+cEludGYtPnNvYXBfcHV0aGVhZGVyKHNvYXApOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfZ2V0aGVhZGVyKHN0cnVjdCBzb2FwICpzb2FwKQorICAgIF9fYXR0cmlidXRlX18gKCh3ZWFrKSk7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0Citzb2FwX2dldGhlYWRlcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyAgICBnc29hcFJlcXVlc3RDb25maWd1cmF0aW9uICpwUnFDb25mID0gZ2V0UmVxdWVzdENvbmZpZ3VyYXRpb24oc29hcCk7CisKKyAgICByZXR1cm4gcFJxQ29uZi0+cEludGYtPnNvYXBfZ2V0aGVhZGVyKHNvYXApOworfQorCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwKSBfX2F0dHJpYnV0ZV9fICgod2VhaykpOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQKK3NvYXBfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXApCit7CisgICAgZ3NvYXBSZXF1ZXN0Q29uZmlndXJhdGlvbiAqcFJxQ29uZiA9IGdldFJlcXVlc3RDb25maWd1cmF0aW9uKHNvYXApOworCisgICAgcFJxQ29uZi0+cEludGYtPnNvYXBfZmF1bHQoc29hcCk7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplZmF1bHQoc3RydWN0IHNvYXAgKnNvYXApCisgICAgX19hdHRyaWJ1dGVfXyAoKHdlYWspKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0Citzb2FwX3NlcmlhbGl6ZWZhdWx0KHN0cnVjdCBzb2FwICpzb2FwKQoreworICAgIGdzb2FwUmVxdWVzdENvbmZpZ3VyYXRpb24gKnBScUNvbmYgPSBnZXRSZXF1ZXN0Q29uZmlndXJhdGlvbihzb2FwKTsKKworICAgIHBScUNvbmYtPnBJbnRmLT5zb2FwX3NlcmlhbGl6ZWZhdWx0KHNvYXApOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0ZmF1bHQoc3RydWN0IHNvYXAgKnNvYXApCisgICAgX19hdHRyaWJ1dGVfXyAoKHdlYWspKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQKK3NvYXBfcHV0ZmF1bHQoc3RydWN0IHNvYXAgKnNvYXApCit7CisgICAgZ3NvYXBSZXF1ZXN0Q29uZmlndXJhdGlvbiAqcFJxQ29uZiA9IGdldFJlcXVlc3RDb25maWd1cmF0aW9uKHNvYXApOworCisgICAgcmV0dXJuIHBScUNvbmYtPnBJbnRmLT5zb2FwX3B1dGZhdWx0KHNvYXApOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfZ2V0ZmF1bHQoc3RydWN0IHNvYXAgKnNvYXApCisgICAgX19hdHRyaWJ1dGVfXyAoKHdlYWspKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQKK3NvYXBfZ2V0ZmF1bHQoc3RydWN0IHNvYXAgKnNvYXApCit7CisgICAgZ3NvYXBSZXF1ZXN0Q29uZmlndXJhdGlvbiAqcFJxQ29uZiA9IGdldFJlcXVlc3RDb25maWd1cmF0aW9uKHNvYXApOworCisgICAgcmV0dXJuIHBScUNvbmYtPnBJbnRmLT5zb2FwX2dldGZhdWx0KHNvYXApOworfQorCitTT0FQX0ZNQUMzIGNvbnN0IGNoYXIgKipTT0FQX0ZNQUM0IHNvYXBfZmF1bHRjb2RlKHN0cnVjdCBzb2FwICpzb2FwKQorICAgIF9fYXR0cmlidXRlX18gKCh3ZWFrKSk7CitTT0FQX0ZNQUMzIGNvbnN0IGNoYXIgKipTT0FQX0ZNQUM0Citzb2FwX2ZhdWx0Y29kZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyAgICBnc29hcFJlcXVlc3RDb25maWd1cmF0aW9uICpwUnFDb25mID0gZ2V0UmVxdWVzdENvbmZpZ3VyYXRpb24oc29hcCk7CisKKyAgICByZXR1cm4gcFJxQ29uZi0+cEludGYtPnNvYXBfZmF1bHRjb2RlKHNvYXApOworfQorCitTT0FQX0ZNQUMzIGNvbnN0IGNoYXIgKipTT0FQX0ZNQUM0IHNvYXBfZmF1bHRzdHJpbmcoc3RydWN0IHNvYXAgKnNvYXApCisgICAgX19hdHRyaWJ1dGVfXyAoKHdlYWspKTsKK1NPQVBfRk1BQzMgY29uc3QgY2hhciAqKlNPQVBfRk1BQzQKK3NvYXBfZmF1bHRzdHJpbmcoc3RydWN0IHNvYXAgKnNvYXApCit7CisgICAgZ3NvYXBSZXF1ZXN0Q29uZmlndXJhdGlvbiAqcFJxQ29uZiA9IGdldFJlcXVlc3RDb25maWd1cmF0aW9uKHNvYXApOworCisgICAgcmV0dXJuIHBScUNvbmYtPnBJbnRmLT5zb2FwX2ZhdWx0c3RyaW5nKHNvYXApOworfQorCitTT0FQX0ZNQUMzIGNvbnN0IGNoYXIgKipTT0FQX0ZNQUM0IHNvYXBfZmF1bHRkZXRhaWwoc3RydWN0IHNvYXAgKnNvYXApCisgICAgX19hdHRyaWJ1dGVfXyAoKHdlYWspKTsKK1NPQVBfRk1BQzMgY29uc3QgY2hhciAqKlNPQVBfRk1BQzQKK3NvYXBfZmF1bHRkZXRhaWwoc3RydWN0IHNvYXAgKnNvYXApCit7CisgICAgZ3NvYXBSZXF1ZXN0Q29uZmlndXJhdGlvbiAqcFJxQ29uZiA9IGdldFJlcXVlc3RDb25maWd1cmF0aW9uKHNvYXApOworCisgICAgcmV0dXJuIHBScUNvbmYtPnBJbnRmLT5zb2FwX2ZhdWx0ZGV0YWlsKHNvYXApOworfQorCisvKgorICogUGF0Y2ggZnJvbSBSeWFuIFRyb2xsCisgKgorICogVGhlc2UgbWF5IG5ldmVyIGJlIHVzZWQgd2l0aGluIGEgc2VydmVyIGNvbnRleHQuICBIb3dldmVyLAorICogZ3NvYXAtMi43LjBlIHJlcXVpcmVzIHRoZXNlIGZ1bmN0aW9ucyB0byBiZSBkZWZpbmVkLiAgVGh1cywKKyAqIHdlIG5lZWQgdG8gZGVmaW5lIHRoZW0gaGVyZS4KKyAqCisgKi8KK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfbWFya2VsZW1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiKSBfX2F0dHJpYnV0ZV9fICgod2VhaykpOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQKK3NvYXBfbWFya2VsZW1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKmEsIGludCBiKQoreworICAgIGdzb2FwUmVxdWVzdENvbmZpZ3VyYXRpb24gKnBScUNvbmYgPSBnZXRSZXF1ZXN0Q29uZmlndXJhdGlvbihzb2FwKTsKKworICAgIHJldHVybiBwUnFDb25mLT5wSW50Zi0+c29hcF9tYXJrZWxlbWVudChzb2FwLCBhLCBiKTsKK30KKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dGVsZW1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpiLCBpbnQgYywgaW50IGQpCisgICAgX19hdHRyaWJ1dGVfXyAoKHdlYWspKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQKK3NvYXBfcHV0ZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqYSwgY29uc3QgY2hhciAqYiwgaW50IGMsIGludCBkKQoreworICAgIGdzb2FwUmVxdWVzdENvbmZpZ3VyYXRpb24gKnBScUNvbmYgPSBnZXRSZXF1ZXN0Q29uZmlndXJhdGlvbihzb2FwKTsKKworICAgIHJldHVybiBwUnFDb25mLT5wSW50Zi0+c29hcF9wdXRlbGVtZW50KHNvYXAsIGEsIGIsIGMsIGQpOworfQorCitTT0FQX0ZNQUMzIHZvaWQgKlNPQVBfRk1BQzQgc29hcF9nZXRlbGVtZW50KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgKmEpCisgICAgX19hdHRyaWJ1dGVfXyAoKHdlYWspKTsKK1NPQVBfRk1BQzMgdm9pZCAqU09BUF9GTUFDNAorc29hcF9nZXRlbGVtZW50KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgKmEpCit7CisgICAgZ3NvYXBSZXF1ZXN0Q29uZmlndXJhdGlvbiAqcFJxQ29uZiA9IGdldFJlcXVlc3RDb25maWd1cmF0aW9uKHNvYXApOworCisgICAgcmV0dXJuIHBScUNvbmYtPnBJbnRmLT5zb2FwX2dldGVsZW1lbnQoc29hcCwgYSk7Cit9CmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvcmVxdWlyZW1lbnRzLnR4dCBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9yZXF1aXJlbWVudHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZjU4ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvcmVxdWlyZW1lbnRzLnR4dApAQCAtMCwwICsxLDMgQEAKK2FwYWNoZSBjb21waWxlZCB3aXRoIC0tZW5hYmxlLW1vZHVsZT1zbyBhbmQgaW5zdGFsbGVkCithcHhzIGluIHBhdGggYW5kIHdvcmtpbmcKK2xpYnRvb2wgaW5zdGFsbGVkLgpkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL3N0YW1wLWggYi9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvc3RhbXAtaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Nzg4ZjcwCi0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL3N0YW1wLWgKQEAgLTAsMCArMSBAQAordGltZXN0YW1wCmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvc3RhbXAtaC5pbiBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9zdGFtcC1oLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ODhmNzAKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMTMvc3RhbXAtaC5pbgpAQCAtMCwwICsxIEBACit0aW1lc3RhbXAKZGlmZiAtLWdpdCBhL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9zdGFtcC1oMSBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8xMy9zdGFtcC1oMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Nzg4ZjcwCi0tLSAvZGV2L251bGwKKysrIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzEzL3N0YW1wLWgxCkBAIC0wLDAgKzEgQEAKK3RpbWVzdGFtcApkaWZmIC0tZ2l0IGEvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzIwLy5pbmRlbnQucHJvIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzIwLy5pbmRlbnQucHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMjcwNDUKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMjAvLmluZGVudC5wcm8KQEAgLTAsMCArMSwxMCBAQAorLS1icmFjZXMtYWZ0ZXItaWYtbGluZSAKKy0taW5kZW50LWxldmVsNCAKKy1scCAtZGkxIC1udXQgLWJsaTAgLW5wY3MgCistbnNhZiAtbnNhdyAtbnNhaQorLWNkYiAtc2MKKy1uY2UKKy0tZm9ybWF0LWZpcnN0LWNvbHVtbi1jb21tZW50cworLVRoYW5kbGVyX3JlYworLS1saW5lLWxlbmd0aDgwCistLXRhYi1zaXplNApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8yMC9SRUFETUUudHh0IGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzIwL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMxM2RmMAotLS0gL2Rldi9udWxsCisrKyBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8yMC9SRUFETUUudHh0CkBAIC0wLDAgKzEsOSBAQAorYXBhY2hlX2dzb2FwLmgJCQltb2RfZ3NvYXAgbW9kdWxlIGZvciBBcGFjaGUgdjIuMAorbW9kX2dzb2FwLmMJCQltb2RfZ3NvYXAgbW9kdWxlIGZvciBBcGFjaGUgdjIuMAorbW9kX2dzb2FwLnZjcHJvagkJTVNWQyBwcm9qZWN0CisKKworSGVyZSdzIGhvdyB0byBjb21waWxlIG1vZF9nc29hcCBmb3IgYXBhY2hlIDI6CisKKy91c3IvbG9jYWwvYXBhY2hlMi9iaW4vYXB4cyAtYSAtaSAtYyAtSS9wYXRoL3RvL2dzb2FwL2luc3RhbGxhdGlvbiBtb2RfZ3NvYXAuYworCmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMjAvYXBhY2hlX2dzb2FwLmggYi9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMjAvYXBhY2hlX2dzb2FwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZlOGViOAotLS0gL2Rldi9udWxsCisrKyBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8yMC9hcGFjaGVfZ3NvYXAuaApAQCAtMCwwICsxLDE4NSBAQAorLyoqIEludGVyZmFjZSBiZXR3ZWVuIHRoZSBhcGFjaGUgaHR0cCAtIHNlcnZlciAoaHR0cDovL2h0dHBkLmFwYWNoZS5vcmcpIGFuZCB0aGUgZ3NvYXAgU09BUCBzdGFjayAoaHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL3NvYXAuaHRtbCkgIAorICAqIEBmaWxlIGFwYWNoZV9nc29hcC5oCisgICovCisjaWZuZGVmIF9BUEFDSEVfR1NPQVBfSF9JTkNMVURFRAorI2RlZmluZSBfQVBBQ0hFX0dTT0FQX0hfSU5DTFVERUQKKworLyoKKyAqIG5lZWQgdG8gaW5jbHVkZSBodHRwZC5oIGZvciByZXF1ZXN0IHJlYyBkZWZpbml0aW9uIAorICovCisjaW5jbHVkZSA8aHR0cGQuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKworI2RlZmluZSBBUEFDSEVfR1NPQVBfSU5URVJGQUNFX1ZFUlNJT04gNgorI2RlZmluZSBBUEFDSEVfSFRUUFNFUlZFUl9FTlRSWV9QT0lOVCAiYXBhY2hlX2luaXRfc29hcF9pbnRlcmZhY2UiCisKKyAgICAvKgorICAgICAqIGNhbGxzIHNvYXBfc2VydmUgaW5zaWRlIHNoYXJlZCBsaWJyYXJ5IAorICAgICAqLworICAgIHR5cGVkZWYgU09BUF9GTUFDMSB2b2lkIChTT0FQX0ZNQUMyICogYXBhY2hlX3NvYXBfaW5pdF9mbikgKHN0cnVjdCBzb2FwICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF9yZWMgKik7CisKKyAgICAvKgorICAgICAqIGNhbGxzIHNvYXBfaW5pdCBpbnNpZGUgc2hhcmVkIGxpYnJhcnkKKyAgICAgKi8KKyAgICB0eXBlZGVmIFNPQVBfRk1BQzEgaW50IChTT0FQX0ZNQUMyICogYXBhY2hlX3NvYXBfc2VydmVfZm4pIChzdHJ1Y3Qgc29hcCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfcmVjICopOworCisgICAgLyoKKyAgICAgKiBjYWxscyBzb2FwX2Rlc3Ryb3kgaW5zaWRlIHNoYXJlZCBsaWJyYXJ5IAorICAgICAqLworICAgIHR5cGVkZWYgU09BUF9GTUFDMSB2b2lkIChTT0FQX0ZNQUMyICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlX3NvYXBfZGVzdHJveV9mbikgKHN0cnVjdCBzb2FwICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X3JlYyAqKTsKKworICAgIC8qCisgICAgICogY2FsbHMgc29hcF9lbmQgaW5zaWRlIHNoYXJlZCBsaWJyYXJ5IAorICAgICAqLworICAgIHR5cGVkZWYgU09BUF9GTUFDMSB2b2lkIChTT0FQX0ZNQUMyICogYXBhY2hlX3NvYXBfZW5kX2ZuKSAoc3RydWN0IHNvYXAgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfcmVjICopOworCisgICAgLyoKKyAgICAgKiBjYWxscyBzb2FwX2RvbmUgaW5zaWRlIHNoYXJlZCBsaWJyYXJ5IAorICAgICAqLworICAgIHR5cGVkZWYgU09BUF9GTUFDMSB2b2lkIChTT0FQX0ZNQUMyICogYXBhY2hlX3NvYXBfZG9uZV9mbikgKHN0cnVjdCBzb2FwICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF9yZWMgKik7CisKKyAgICB0eXBlZGVmIFNPQVBfRk1BQzEgaW50IChTT0FQX0ZNQUMyICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGVfc29hcF9yZWdpc3Rlcl9wbHVnaW5fZm4pIChzdHJ1Y3Qgc29hcCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKmZjcmVhdGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb2FwICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwX3BsdWdpbiAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X3JlYyAqKTsKKworICAgIHR5cGVkZWYgU09BUF9GTUFDMSB2b2lkICpTT0FQX0ZNQUMyKCphcGFjaGVfc29hcF9sb29rdXBfcGx1Z2luX2ZuKSAoc3RydWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF9yZWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopOworCisgICAgLyoKKyAgICAgKiB0aGUgY2FsbGJhY2tzIG5vcm1hbGx5IHVzZWQgaW4gdGhlIGFwYWNoZV9zb2FwX2ludGVyZmFjZSAKKyAgICAgKi8KKyAgICBTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBhcGFjaGVfc29hcF9zb2FwX2Rlc3Ryb3koc3RydWN0IHNvYXAgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF9yZWMgKiByKTsKKyAgICBTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBhcGFjaGVfZGVmYXVsdF9zb2FwX2luaXQoc3RydWN0IHNvYXAgKnNvYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfcmVjICogcik7CisgICAgU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBhcGFjaGVfZGVmYXVsdF9zb2FwX3NlcnZlKHN0cnVjdCBzb2FwICpzb2FwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X3JlYyAqIHIpOworICAgIFNPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIGFwYWNoZV9kZWZhdWx0X3NvYXBfZW5kKHN0cnVjdCBzb2FwICpzb2FwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfcmVjICogcik7CisgICAgU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgYXBhY2hlX2RlZmF1bHRfc29hcF9kb25lKHN0cnVjdCBzb2FwICpzb2FwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X3JlYyAqIHIpOworICAgIFNPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgYXBhY2hlX2RlZmF1bHRfc29hcF9yZWdpc3Rlcl9wbHVnaW5fYXJnKHN0cnVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXAgKiwgaW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZmNyZWF0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXAgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBfcGx1Z2luCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF9yZWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHIpOworICAgIFNPQVBfRk1BQzEgdm9pZCAqU09BUF9GTUFDMiBhcGFjaGVfZGVmYXVsdF9zb2FwX2xvb2t1cF9wbHVnaW4oc3RydWN0IHNvYXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwLCBjb25zdCBjaGFyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGx1Z2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF9yZWMgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcik7CisKKyAgICBzdHJ1Y3QgYXBhY2hlX3NvYXBfaW50ZXJmYWNlIHsKKyAgICAgICAgdW5zaWduZWQgaW50IGxlbjsgICAgICAgLy8vPCBsZW5ndGggb2YgdGhpcyBzdHJ1Y3QgaW4gYnl0ZXMgKGZvciB2ZXJzaW9uIGNvbnRyb2wpLgorICAgICAgICB1bnNpZ25lZCBpbnQgaW50ZXJmYWNlX3ZlcnNpb247CisgICAgICAgIGFwYWNoZV9zb2FwX2luaXRfZm4gZnNvYXBfaW5pdDsKKyAgICAgICAgYXBhY2hlX3NvYXBfc2VydmVfZm4gZnNvYXBfc2VydmU7CisgICAgICAgIGFwYWNoZV9zb2FwX2Rlc3Ryb3lfZm4gZnNvYXBfZGVzdHJveTsKKyAgICAgICAgYXBhY2hlX3NvYXBfZW5kX2ZuIGZzb2FwX2VuZDsKKyAgICAgICAgYXBhY2hlX3NvYXBfZG9uZV9mbiBmc29hcF9kb25lOworICAgICAgICBhcGFjaGVfc29hcF9yZWdpc3Rlcl9wbHVnaW5fZm4gZnNvYXBfcmVnaXN0ZXJfcGx1Z2luX2FyZzsKKyAgICAgICAgYXBhY2hlX3NvYXBfbG9va3VwX3BsdWdpbl9mbiBmc29hcF9sb29rdXBfcGx1Z2luOworICAgICAgICB2b2lkICpyZXNlcnZlZDsgICAgICAgICAvLy88IHZhcmlhYmxlIHJlc2VydmVkIGZvciBhcGFjaGUgbW9kdWxlLCBtdXN0IG5vdCBiZSBjaGFuZ2VkIGJ5IHNlcnZlciBzaGFyZWQgbGlicmFyeS4KKyAgICAgICAgc3RydWN0IE5hbWVzcGFjZSAqbmFtZXNwYWNlczsKKyAgICAgICAgdm9pZCAoKnNvYXBfc2VyaWFsaXplaGVhZGVyKSAoc3RydWN0IHNvYXAgKiBzb2FwKTsKKyAgICAgICAgaW50ICgqc29hcF9wdXRoZWFkZXIpIChzdHJ1Y3Qgc29hcCAqIHNvYXApOworICAgICAgICBpbnQgKCpzb2FwX2dldGhlYWRlcikgKHN0cnVjdCBzb2FwICogc29hcCk7CisgICAgICAgIHZvaWQgKCpzb2FwX2ZhdWx0KSAoc3RydWN0IHNvYXAgKiBzb2FwKTsKKyAgICAgICAgdm9pZCAoKnNvYXBfc2VyaWFsaXplZmF1bHQpIChzdHJ1Y3Qgc29hcCAqIHNvYXApOworICAgICAgICBpbnQgKCpzb2FwX3B1dGZhdWx0KSAoc3RydWN0IHNvYXAgKiBzb2FwKTsKKyAgICAgICAgaW50ICgqc29hcF9nZXRmYXVsdCkgKHN0cnVjdCBzb2FwICogc29hcCk7CisgICAgICAgIGNvbnN0IGNoYXIgKiooKnNvYXBfZmF1bHRjb2RlKSAoc3RydWN0IHNvYXAgKiBzb2FwKTsKKyAgICAgICAgY29uc3QgY2hhciAqKigqc29hcF9mYXVsdHN0cmluZykgKHN0cnVjdCBzb2FwICogc29hcCk7CisgICAgICAgIGNvbnN0IGNoYXIgKiooKnNvYXBfZmF1bHRkZXRhaWwpIChzdHJ1Y3Qgc29hcCAqIHNvYXApOworICAgICAgICB2b2lkICgqc29hcF9tYXJrZWxlbWVudCkgKHN0cnVjdCBzb2FwICosIGNvbnN0IHZvaWQgKiwgaW50KTsKKyAgICAgICAgaW50ICgqc29hcF9wdXRlbGVtZW50KSAoc3RydWN0IHNvYXAgKiwgY29uc3Qgdm9pZCAqLCBjb25zdCBjaGFyICosIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KTsKKyAgICAgICAgdm9pZCAqKCpzb2FwX2dldGVsZW1lbnQpIChzdHJ1Y3Qgc29hcCAqLCBpbnQgKik7CisgICAgfTsKKworICAgIHR5cGVkZWYgdm9pZCAoKmFwYWNoZV9pbml0X3NvYXBfaW50ZXJmYWNlX2ZuKSAoc3RydWN0IGFwYWNoZV9zb2FwX2ludGVyZmFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiwgcmVxdWVzdF9yZWMgKik7CisKKyAgICAvKgorICAgICAqIGV4cG9ydGVkIHNoYXJlZCBsaWJyYXJ5IGZ1bmN0aW9uIGNhbGxlZCBieSBtb2RfZ3NvYXAgZnJvbSB3aXRoaW4gYXBhY2hlIGh0dHAgc2VydmVyIAorICAgICAqICBUaGlzIGZ1bmN0aW9uIGZpbGxzIHRoZSBtZW1iZXJzIG9mIHRoZSBhcGFjaGVfc29hcF9pbnRlcmZhY2Ugc3RydWN0LiAKKyAgICAgKi8KKyAgICBTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBhcGFjaGVfaW5pdF9zb2FwX2ludGVyZmFjZShzdHJ1Y3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGVfc29hcF9pbnRlcmZhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLCByZXF1ZXN0X3JlYyAqIHIpOworCisjZGVmaW5lIElNUExFTUVOVF9HU09BUF9TRVJWRVIoKSBcCisgU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgYXBhY2hlX3NvYXBfc29hcF9kZXN0cm95KHN0cnVjdCBzb2FwICpzb2FwLCByZXF1ZXN0X3JlYyAqcikgXAorICAgIHtyZXR1cm4gc29hcF9kZXN0cm95KHNvYXApO31cCisgU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgYXBhY2hlX2RlZmF1bHRfc29hcF9pbml0KHN0cnVjdCBzb2FwICpzb2FwLCByZXF1ZXN0X3JlYyAqcikgXAorICAgIHtyZXR1cm4gc29hcF9pbml0KHNvYXApO31cCisgU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBhcGFjaGVfZGVmYXVsdF9zb2FwX3NlcnZlKHN0cnVjdCBzb2FwICpzb2FwLCByZXF1ZXN0X3JlYyAqcikgXAorICAgIHtyZXR1cm4gc29hcF9zZXJ2ZShzb2FwKTt9XAorIFNPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIGFwYWNoZV9kZWZhdWx0X3NvYXBfZW5kKHN0cnVjdCBzb2FwICpzb2FwLCByZXF1ZXN0X3JlYyAqcikgXAorICAgIHtyZXR1cm4gc29hcF9lbmQoc29hcCk7fVwKKyBTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBhcGFjaGVfZGVmYXVsdF9zb2FwX2RvbmUoc3RydWN0IHNvYXAgKnNvYXAsIHJlcXVlc3RfcmVjICpyKSBcCisgICAge3JldHVybiBzb2FwX2RvbmUoc29hcCk7fVwKKyBTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIGFwYWNoZV9kZWZhdWx0X3NvYXBfcmVnaXN0ZXJfcGx1Z2luX2FyZyhzdHJ1Y3Qgc29hcCAqc29hcCwgaW50ICgqZmNyZWF0ZSkoc3RydWN0IHNvYXAgKiwgc3RydWN0IHNvYXBfcGx1Z2luICosIHZvaWQgKiksIHZvaWQgKmFyZywgcmVxdWVzdF9yZWMgKnIpIFwKKyAgICB7cmV0dXJuIHNvYXBfcmVnaXN0ZXJfcGx1Z2luX2FyZyhzb2FwLCBmY3JlYXRlLCBhcmcpO31cCisgU09BUF9GTUFDMSB2b2lkKiBTT0FQX0ZNQUMyIGFwYWNoZV9kZWZhdWx0X3NvYXBfbG9va3VwX3BsdWdpbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcGx1Z2luLCByZXF1ZXN0X3JlYyAqcikgXAorICAgIHtyZXR1cm4gc29hcF9sb29rdXBfcGx1Z2luKHNvYXAsIHBsdWdpbik7fVwKK3ZvaWQgYXBhY2hlX2luaXRfc29hcF9pbnRlcmZhY2Uoc3RydWN0IGFwYWNoZV9zb2FwX2ludGVyZmFjZSAqcEludCwgcmVxdWVzdF9yZWMgKnIpIHtcCisgcEludC0+bGVuID0gc2l6ZW9mKHN0cnVjdCBhcGFjaGVfc29hcF9pbnRlcmZhY2UpO1wKKyBwSW50LT5pbnRlcmZhY2VfdmVyc2lvbiA9IEFQQUNIRV9HU09BUF9JTlRFUkZBQ0VfVkVSU0lPTjtcCisgcEludC0+ZnNvYXBfaW5pdCA9IGFwYWNoZV9kZWZhdWx0X3NvYXBfaW5pdDsgXAorIHBJbnQtPmZzb2FwX3NlcnZlID0gYXBhY2hlX2RlZmF1bHRfc29hcF9zZXJ2ZTtcCisgcEludC0+ZnNvYXBfZGVzdHJveSA9IGFwYWNoZV9zb2FwX3NvYXBfZGVzdHJveTtcCisgcEludC0+ZnNvYXBfZW5kID0gYXBhY2hlX2RlZmF1bHRfc29hcF9lbmQ7XAorIHBJbnQtPmZzb2FwX2RvbmUgPSBhcGFjaGVfZGVmYXVsdF9zb2FwX2RvbmU7XAorIHBJbnQtPmZzb2FwX3JlZ2lzdGVyX3BsdWdpbl9hcmcgPSBhcGFjaGVfZGVmYXVsdF9zb2FwX3JlZ2lzdGVyX3BsdWdpbl9hcmc7XAorIHBJbnQtPmZzb2FwX2xvb2t1cF9wbHVnaW4gPSBhcGFjaGVfZGVmYXVsdF9zb2FwX2xvb2t1cF9wbHVnaW47XAorIHBJbnQtPnJlc2VydmVkID0gMDtcCisgcEludC0+bmFtZXNwYWNlcyA9IG5hbWVzcGFjZXM7XAorIHBJbnQtPnNvYXBfc2VyaWFsaXplaGVhZGVyID0gc29hcF9zZXJpYWxpemVoZWFkZXI7XAorIHBJbnQtPnNvYXBfcHV0aGVhZGVyID0gc29hcF9wdXRoZWFkZXI7XAorIHBJbnQtPnNvYXBfZ2V0aGVhZGVyID0gc29hcF9nZXRoZWFkZXI7XAorIHBJbnQtPnNvYXBfZmF1bHQgPSBzb2FwX2ZhdWx0O1wKKyBwSW50LT5zb2FwX3NlcmlhbGl6ZWZhdWx0ID0gc29hcF9zZXJpYWxpemVmYXVsdDtcCisgcEludC0+c29hcF9wdXRmYXVsdCA9IHNvYXBfcHV0ZmF1bHQ7XAorIHBJbnQtPnNvYXBfZ2V0ZmF1bHQgPSBzb2FwX2dldGZhdWx0O1wKKyBwSW50LT5zb2FwX2ZhdWx0Y29kZSA9IHNvYXBfZmF1bHRjb2RlO1wKKyBwSW50LT5zb2FwX2ZhdWx0c3RyaW5nID0gc29hcF9mYXVsdHN0cmluZztcCisgcEludC0+c29hcF9mYXVsdGRldGFpbCA9IHNvYXBfZmF1bHRkZXRhaWw7XAorIHBJbnQtPnNvYXBfbWFya2VsZW1lbnQgPSBzb2FwX21hcmtlbGVtZW50O1wKKyBwSW50LT5zb2FwX2dldGVsZW1lbnQgPSBzb2FwX2dldGVsZW1lbnQ7XAorIHBJbnQtPnNvYXBfcHV0ZWxlbWVudCA9IHNvYXBfcHV0ZWxlbWVudDtcCit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvL19fY3BsdXNwbHVzCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8vX0FQQUNIRV9HU09BUF9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMjAvbW9kX2dzb2FwLmMgYi9tb2RfZ3NvYXAvbW9kX2dzb2FwLTAuNi9hcGFjaGVfMjAvbW9kX2dzb2FwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk3Mzk5MQotLS0gL2Rldi9udWxsCisrKyBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8yMC9tb2RfZ3NvYXAuYwpAQCAtMCwwICsxLDEzMTQgQEAKKy8qKiBBcGFjaGUgZ1NPQVAgbW9kdWxlIGZvciBBcGFjaGUgMi4wCisgKiBAZmlsZSBtb2RfZ3NvYXAuYworICoKKyAqIGF1dGhvciBDaHJpc3RpYW4gQWJlcmdlciAoaHR0cDovL3d3dy5hYmVyZ2VyLmF0KQorICogcG9ydGVkIHRvIDIuMCBNaWNrIFdhbGwgKG1pY2tAbWlja2FuZHdlbmR5LmNvbSkKKyAqIHVwZGF0ZWQgYnkgUm9iZXJ0IHZhbiBFbmdlbGVuIChlbmdlbGVuQGFjbS5vcmcpCisgKiB1cGRhdGVkIGJ5IERhdmlkIFZpbmVyIChkdmluZXJAYXBhY2hlLm9yZykKKyAqCisgKiBDb250cmlidXRlZCB0byB0aGUgZ1NPQVAgcGFja2FnZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGdTT0FQCisgKiBvcGVuIHNvdXJjZSBwdWJsaWMgbGljZW5zZS4KKyAqCisgKi8KKyNpZiAhZGVmaW5lZChfX0dOVUNfXykgfHwgX19HTlVDX18gPCAyIHx8IFwKKyAgICAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA8IDcpIHx8XAorICAgIGRlZmluZWQoTkVYVCkKKyNpZm5kZWYgX19hdHRyaWJ1dGVfXworI2RlZmluZSBfX2F0dHJpYnV0ZV9fKF9feCkKKyNlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorLy8jaW5jbHVkZSA8bHRkbC5oPgorI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSAiYXByX3N0cmluZ3MuaCIKKyNpbmNsdWRlICJhcHJfZm5tYXRjaC5oIgorI2luY2x1ZGUgImFwcl9zdHJpbmdzLmgiCisjaW5jbHVkZSAiYXByX2xpYi5oIgorI2luY2x1ZGUgImFwcl9wb29scy5oIgorCisjZGVmaW5lIEFQUl9XQU5UX1NUUkZVTkMKKyNpbmNsdWRlICJhcHJfd2FudC5oIgorCisjaW5jbHVkZSAiaHR0cGQuaCIKKyNpbmNsdWRlICJodHRwX3JlcXVlc3QuaCIKKyNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgorI2luY2x1ZGUgImh0dHBfY29yZS5oIgorI2luY2x1ZGUgImh0dHBfbG9nLmgiCisjaW5jbHVkZSAiaHR0cF9tYWluLmgiCisjaW5jbHVkZSAiaHR0cF9wcm90b2NvbC5oIgorI2luY2x1ZGUgImh0dHBfcmVxdWVzdC5oIgorI2luY2x1ZGUgInV0aWxfc2NyaXB0LmgiCisjaW5jbHVkZSAic3Rkc29hcDIuaCIgICAgICAgICAgIC8vIHN0YW5kYXJkIGhlYWRlciBmb3IgZ3NvYXAKKyNpbmNsdWRlICJhcGFjaGVfZ3NvYXAuaCIKKwordHlwZWRlZiBpbnQgYm9vbDsKKworI2RlZmluZSBmYWxzZSAwCisjZGVmaW5lIHRydWUgKChpbnQpMHhmZmZmKQorI2RlZmluZSBJT0JVRl9DSFVOS19TSVpFIDgxOTIKKyNkZWZpbmUgR1NPQVBfSUQgIkFwYWNoZSAyLjAgbW9kX2dzb2FwIGdzb2FwIGh0dHBkIGV4dGVuc2lvbiAwLjAuNiIKKworc3RhdGljIGNoYXIgbW9kX2dzb2FwX2lkW10gPSBHU09BUF9JRDsKKworLyoqIEEgc2hhcmVkIGxpYnJhcnkgY29udGFpbmluZyBhIFNPQVAgc2VydmVyLgorICovCit0eXBlZGVmIHN0cnVjdCBTb2FwU2hhcmVkTGlicmFyeV9TIHsKKyAgICBhcHJfcG9vbF90ICptX3BQb29sOworI2lmZGVmIFdJTjMyCisjZGVmaW5lIERMU1lNKGEsYikgR2V0UHJvY0FkZHJlc3MoYSxiKQorI2RlZmluZSBETE9QRU4oYSxiKSBMb2FkTGlicmFyeShhKQorICAgIEhNT0RVTEUgbV9oTGlicmFyeTsKKyNlbHNlCisjZGVmaW5lIERMU1lNKGEsYikgZGxzeW0oYSxiKQorI2RlZmluZSBETE9QRU4oYSxiKSBkbG9wZW4oYSxiKQorICAgIHZvaWQgKm1faExpYnJhcnk7ICAgICAgICAgICAvLy88IGhhbmRsZSBvZiB0aGUgbG9hZGVkIGxpYnJheS4KKyNlbmRpZgorICAgIGNvbnN0IGNoYXIgKm1fcHN6UGF0aDsgICAgICAvLy88IHRoZSBwYXRoIG9mIHRoZSBsaWJyYXJ5LCBpbmNsdWRpbmcgdGhlIG5hbWUuCisgICAgYm9vbCBtX2JJc1NPQVBMaWJyYXJ5OyAgICAgIC8vLzwgaXMgdGhpcyBsaWJyYXJ5IGEgU09BUCBsaWJyYXJ5IHRoYXQgY29udGFpbnMgdGhlIHNlcnZlciBmYWN0b3J5IGVudHJ5IHBvaW50PworfSBTb2FwU2hhcmVkTGlicmFyeTsKKworLyoqIFRhYmxlIG9mIHNoYXJlZCBsaWJyYXJpZXMgdGhhdCBhcmUgYWxyZWFkeSBsb2FkZWQuCisgKiBhIHNpbmdsZXRvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgU29hcFNoYXJlZExpYnJhcmllc19TIHsKKyAgICBhcHJfcG9vbF90ICptX3BQb29sOworICAgIFNvYXBTaGFyZWRMaWJyYXJ5ICptX3BTT0FQTGlicmFyeTsgIC8vLzwgdGhlIG1haW4gU09BUCBsaWJyYXJ5IHRoYXQgd2lsbCBzZXJ2ZSBvdXIgcmVxdWVzdHMKKyAgICBhcHJfYXJyYXlfaGVhZGVyX3QgKm1fcExpYnJhcmllczsgICAvLy88IHRoZSBhcnJheSB3aGVyZSB3ZSBzdG9yZSBvdXIgbGlicmFyaWVzLgorICAgIGFwYWNoZV9pbml0X3NvYXBfaW50ZXJmYWNlX2ZuIG1fcGZuRW50cnlQb2ludDsKKyAgICBzdHJ1Y3QgYXBhY2hlX3NvYXBfaW50ZXJmYWNlICptX3BJbnRmOworICAgIGJvb2wgbV9iQWxsTGlicmFyaWVzTG9hZGVkOyAvLy88IGhhdmUgYWxsIGxpYnJhcmllcyBpbiBvdXIgbGlicmFyaWVzIGNvbGxlY3Rpb24gYmVlbiBhbHJlYWR5IHN1Y2Nlc3NmdWxseSBsb2FkZWQ/Cit9IFNvYXBTaGFyZWRMaWJyYXJpZXM7CisKKy8qKiBFbnZpcm9ubWVudCB0byB3aGljaCByZWNvcmQgYXBwbGllcyAoZGlyZWN0b3J5LAorICogc2VydmVyLCBvciBjb21iaW5hdGlvbikuCisgKi8KK3R5cGVkZWYgZW51bSBlbkNvbmZpZ3VyYXRpb25UeXBlIHsKKyAgICBjdF9zZXJ2ZXIgPSAxLCAgICAgICAgICAgICAgLy8vPCB1c2VkIGZvciBwZXItc2VydmVyIGNvbmZpZ3VyYXRpb24KKyAgICBjdF9kaXJlY3RvcnkgPSAyLCAgICAgICAgICAgLy8vPCB1c2VkIGZvciBwZXItZGlyZWN0b3J5IGNvbmZpZ3VyYXRpb24KKyAgICBjdF9ib3RoID0gMyAgICAgICAgICAgICAgICAgLy8vPCB1c2VkIGZvciBib3RoCit9IENvbmZpZ3VyYXRpb25UeXBlOworCisvKiogU3RvcmUgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gc2V0IGluIHRoZSBBcGFjaGUgU2VydmVyIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcy4KKyAqIFRoZXNlIGFyZSBzZXQgZS5nLiBpbiB0aGUgZmlsZSBodHRwZC5jb25mCisgKiBJdCdzIHBlcmZlY3RseSByZWFzb25hYmxlIHRvIGhhdmUgdHdvIGRpZmZlcmVudCBzdHJ1Y3R1cmVzIGZvciB0aGUgdHdvCisgKiBkaWZmZXJlbnQgZW52aXJvbm1lbnRzLiAgVGhlIHNhbWUgY29tbWFuZCBoYW5kbGVycyB3aWxsIGJlIGNhbGxlZCBmb3IKKyAqIGJvdGgsIHRob3VnaCwgc28gdGhlIGhhbmRsZXJzIG5lZWQgdG8gYmUgYWJsZSB0byB0ZWxsIHRoZW0gYXBhcnQuICBPbmUKKyAqIHBvc3NpYmlsaXR5IGlzIGZvciBib3RoIHN0cnVjdHVyZXMgdG8gc3RhcnQgd2l0aCBhbiBpbnQgd2hpY2ggaXMgemVybyBmb3IKKyAqIG9uZSBhbmQgMSBmb3IgdGhlIG90aGVyLgorICoKKyAqIE5vdGUgdGhhdCB3aGlsZSB0aGUgcGVyLWRpcmVjdG9yeSBhbmQgcGVyLXNlcnZlciBjb25maWd1cmF0aW9uIHJlY29yZHMgYXJlCisgKiBhdmFpbGFibGUgdG8gbW9zdCBvZiB0aGUgbW9kdWxlIGhhbmRsZXJzLCB0aGV5IHNob3VsZCBiZSB0cmVhdGVkIGFzCisgKiBSRUFELU9OTFkgYnkgYWxsIGV4Y2VwdCB0aGUgY29tbWFuZCBhbmQgbWVyZ2UgaGFuZGxlcnMuICBTb21ldGltZXMgaGFuZGxlcnMKKyAqIGFyZSBoYW5kZWQgYSByZWNvcmQgdGhhdCBhcHBsaWVzIHRvIHRoZSBjdXJyZW50IGxvY2F0aW9uIGJ5IGltcGxpY2F0aW9uIG9yCisgKiBpbmhlcml0YW5jZSwgYW5kIG1vZGlmeWluZyBpdCB3aWxsIGNoYW5nZSB0aGUgcnVsZXMgZm9yIG90aGVyIGxvY2F0aW9ucy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZ3NvYXBDb25maWd1cmF0aW9uX1MgeworICAgIFNvYXBTaGFyZWRMaWJyYXJpZXMgKm1fcExpYnJhcmllczsKKyAgICBDb25maWd1cmF0aW9uVHlwZSBtX1R5cGU7ICAgLy8vPCB0aGUgdHlwZSBvZiBjb25maWd1cmF0aW9uIGVudmlyb25tZW50Cit9IGdzb2FwQ29uZmlndXJhdGlvbjsKKworLyoqIE91ciBpbnRlcm5hbCBwZXIgcmVxdWVzdCBzb2FwIGNvbmZpZ3VyYXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZ3NvYXBSZXF1ZXN0Q29uZmlndXJhdGlvbl9TIHsKKyAgICByZXF1ZXN0X3JlYyAqcjsgICAgICAgICAgICAgLy8vPCB0aGUgY3VycmVudCByZXF1ZXN0IHJlY29yZC4KKyAgICBjaGFyICptX3BzekFsbEhlYWRlcnM7ICAgICAgLy8vPCBhbGwgaGVhZGVycyByZWNlaXZlZCBhcyBhIHN0cmluZywgdGhpcyBpcyByZXR1cm5lZCB0byBnc29hcCdzIGh0dHBfcGFyc2UgZnVuY3Rpb24gYmVmb3JlIHdlIHJldHVybiB0aGUgYm9keS4KKyAgICBjb25zdCBjaGFyICptX3BzekN1cnJlbnRIZWFkZXJSZWFkaW5nUG9zaXRpb247ICAvLy88IHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgbmV4dCBoZWFkZXIgcmVhZCBvcGVyYXRpb24gd2lsbCBzdGFydC4KKyAgICB1bnNpZ25lZCBpbnQgbV9uSGVhZGVyTGVuZ3RoOyAgIC8vLzwgdG90YWwgbGVuZ3RoIG9mIGFsbCBoZWFkZXJzIGNvbmNhdGVuYXRlZCBhcyBzdHJpbmcgCisgICAgY2hhciAqbV9wT3V0QnVmOyAgICAgICAgICAgIC8vLzwgb3V0cHV0IGJ1ZmZlcgorICAgIHNpemVfdCBtX25PdXRCdWZMZW5ndGg7ICAgICAvLy88IGFsbG9jYXRlZCBsZW5ndGggb2Ygb3V0cHV0IGJ1ZmZlcgorICAgIHNpemVfdCBtX25PdXRCdWZDb3VudDsgICAgICAvLy88IGJ5dGVzIGluIG91dHB1dCBidWZmZXIKKyAgICBpbnQgaGVhZGVyc19zZW50OyAgICAgICAgICAgLy8vPCBoYXZlIGh0dHAgLSBoZWFkZXJzIGFscmVhZHkgYmVlbiBzZW50IHRvIGNsaWVudCB1cz8KKyAgICBpbnQgaGVhZGVyc19yZWNlaXZlZDsgICAgICAgLy8vPCBoYXZlIHRoZSByZXF1ZXN0IGhlYWRlcnMgYWxyZWFkeSBiZWVuIHBhc3NlZCB0byBnc29hcCA/IAorICAgIGludCAoKmh0dHBfcGFyc2UpIChzdHJ1Y3Qgc29hcCAqKTsgIC8vLzwgdGhlIG9yaWdpbmFsIGdzb2FwIHBhcnNpbmcgZnVuY3Rpb24uCisgICAgc3RydWN0IGFwYWNoZV9zb2FwX2ludGVyZmFjZSAqcEludGY7Cit9IGdzb2FwUmVxdWVzdENvbmZpZ3VyYXRpb247CisKKworLyoKKyAqIFRvIGF2b2lkIGxlYWtpbmcgbWVtb3J5IGZyb20gcG9vbHMgb3RoZXIgdGhhbiB0aGUgcGVyLXJlcXVlc3Qgb25lLCB3ZQorICogYWxsb2NhdGUgYSBtb2R1bGUtcHJpdmF0ZSBwb29sLgorICovCitzdGF0aWMgYXByX3Bvb2xfdCAqdGhlX2dzb2FwUG9vbCA9IE5VTEw7CisKKy8qKiBAcmV0dXJuIG91ciBhcHJfcG9vbF90Zm9yIGdzb2FwQ29uZmlndXJhdGlvbiAqLworc3RhdGljIGFwcl9wb29sX3QgKgorZ3NvYXBDb25maWd1cmF0aW9uX2dldE1vZHVsZVBvb2woKQoreworICAgIGlmKE5VTEwgPT0gdGhlX2dzb2FwUG9vbCkKKyAgICB7CisgICAgICAgIGFwcl9wb29sX2NyZWF0ZV9leCgmdGhlX2dzb2FwUG9vbCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgfQorICAgIHJldHVybiB0aGVfZ3NvYXBQb29sOworfQorc3RhdGljIGdzb2FwQ29uZmlndXJhdGlvbiAqZ2V0Q29uZmlndXJhdGlvbihyZXF1ZXN0X3JlYyAqIHIpOworc3RhdGljIGdzb2FwUmVxdWVzdENvbmZpZ3VyYXRpb24gKmdldFJlcXVlc3RDb25maWd1cmF0aW9uKHN0cnVjdCBzb2FwICopOworCisvKioKKyAgIEBwYXJhbSBwIHRoZSBhcHJfcG9vbF90dG8gdXNlIGZvciBtZW1vcnkgYWxsb2NhdGlvbnMuCisgICBAcGFyYW0gcHN6UGF0aCB0aGUgcGF0aCBvZiB0aGUgbGlicmFyeS4KKyovCitzdGF0aWMgdm9pZAorU29hcFNoYXJlZExpYnJhcnlfaW5pdChTb2FwU2hhcmVkTGlicmFyeSAqIFRoaXMsIGFwcl9wb29sX3QgKiBwLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb2FwU2hhcmVkTGlicmFyeSAqIHBMaWIpCit7CisgICAgVGhpcy0+bV9wUG9vbCA9IHA7CisgICAgVGhpcy0+bV9oTGlicmFyeSA9IE5VTEw7CisgICAgVGhpcy0+bV9wc3pQYXRoID0gYXByX3BzdHJkdXAocCwgcExpYi0+bV9wc3pQYXRoKTsKKyAgICBUaGlzLT5tX2JJc1NPQVBMaWJyYXJ5ID0gcExpYi0+bV9iSXNTT0FQTGlicmFyeTsKK30KK3N0YXRpYyB2b2lkCitTb2FwU2hhcmVkTGlicmFyeV9pbml0MihTb2FwU2hhcmVkTGlicmFyeSAqIFRoaXMsIGFwcl9wb29sX3QgKiBwLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHN6UGF0aCkKK3sKKyAgICBUaGlzLT5tX3BQb29sID0gcDsKKyAgICBUaGlzLT5tX2hMaWJyYXJ5ID0gTlVMTDsKKyAgICBUaGlzLT5tX3BzelBhdGggPSBhcHJfcHN0cmR1cChwLCBwc3pQYXRoKTsKKyAgICBUaGlzLT5tX2JJc1NPQVBMaWJyYXJ5ID0gZmFsc2U7Cit9CitzdGF0aWMgdm9pZAorU29hcFNoYXJlZExpYnJhcnlfY2xlYXIoU29hcFNoYXJlZExpYnJhcnkgKiBUaGlzLCBhcHJfcG9vbF90ICogcCkKK3sKKyAgICBUaGlzLT5tX3BQb29sID0gcDsKKyAgICBUaGlzLT5tX2hMaWJyYXJ5ID0gTlVMTDsKKyAgICBUaGlzLT5tX3BzelBhdGggPSBOVUxMOworICAgIFRoaXMtPm1fYklzU09BUExpYnJhcnkgPSBmYWxzZTsKK30KK3N0YXRpYyBTb2FwU2hhcmVkTGlicmFyeSAqCitTb2FwU2hhcmVkTGlicmFyeV9jcmVhdGUoYXByX3Bvb2xfdCAqIHApCit7CisgICAgU29hcFNoYXJlZExpYnJhcnkgKlRoaXMgPQorICAgICAgICAoU29hcFNoYXJlZExpYnJhcnkgKikgYXByX3BjYWxsb2MocCwgc2l6ZW9mKFNvYXBTaGFyZWRMaWJyYXJ5KSk7CisgICAgU29hcFNoYXJlZExpYnJhcnlfY2xlYXIoVGhpcywgcCk7CisgICAgcmV0dXJuIFRoaXM7Cit9CisKKy8qCisgKiBTb2FwU2hhcmVkTGlicmFyeV9hc3NpZ24oU29hcFNoYXJlZExpYnJhcnkgKlRoaXMsIFNvYXBTaGFyZWRMaWJyYXJ5ICpwTGliKSB7CisgKiBUaGlzLT5tX3BQb29sID0gcExpYi0+bV9wUG9vbDsKKyAqIFRoaXMtPm1faExpYnJhcnkgPSBOVUxMOworICogVGhpcy0+bV9wc3pQYXRoID0gYXBfc3RyZHVwKG1fcFBvb2wsIHBMaWItPm1fcHN6UGF0aCk7CisgKiBUaGlzLT5tX2JJc1NvYXBMaWJyYXJ5ID0gcExpYi0+bV9iSXNTb2FwTGlicmFyeTsKKyAqIH0KKyAqLworLyoqCisgKglAcGFyYW0gcFRlbXBQb29sIHBvb2wgdG8gdXNlIGZvciBhbGxvY2F0aW5nIHRlbXBvcmFyeSBvYmplY3RzIChlLmcuIGVycm9yIG1lc3NhZ2UpLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqCitTb2FwU2hhcmVkTGlicmFyeV9sb2FkKFNvYXBTaGFyZWRMaWJyYXJ5ICogVGhpcywgYXByX3Bvb2xfdCAqIHBUZW1wUG9vbCkKK3sKKyAgICBjb25zdCBjaGFyICpwc3pFcnJvciA9IE5VTEw7CisKKyNpZmRlZiBXSU4zMgorICAgIFRoaXMtPm1faExpYnJhcnkgPSBETE9QRU4oVGhpcy0+bV9wc3pQYXRoKTsKKworICAgIGlmKCFUaGlzLT5tX2hMaWJyYXJ5KQorICAgIHsKKyAgICAgICAgTFBWT0lEIGxwTXNnQnVmOworCisgICAgICAgIEZvcm1hdE1lc3NhZ2UoRk9STUFUX01FU1NBR0VfQUxMT0NBVEVfQlVGRkVSIHwgRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0gfCBGT1JNQVRfTUVTU0FHRV9JR05PUkVfSU5TRVJUUywgTlVMTCwgR2V0TGFzdEVycm9yKCksIE1BS0VMQU5HSUQoTEFOR19ORVVUUkFMLCBTVUJMQU5HX0RFRkFVTFQpLCAvLyBEZWZhdWx0IGxhbmd1YWdlCisgICAgICAgICAgICAgICAgICAgICAgKExQVFNUUikgJiBscE1zZ0J1ZiwgMCwgTlVMTCk7CisgICAgICAgIHBzekVycm9yID0KKyAgICAgICAgICAgIGFwcl9wc3ByaW50ZihOVUxMID09IHBUZW1wUG9vbCA/IFRoaXMtPm1fcFBvb2wgOiBwVGVtcFBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgIkxvYWQgb2YgJXMgZmFpbGVkIHdpdGggJXMiLCBUaGlzLT5tX3BzelBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgbHBNc2dCdWYpOworICAgICAgICBMb2NhbEZyZWUobHBNc2dCdWYpOworCisgICAgfQorI2Vsc2UKKyAgICBjb25zdCBpbnQgbkZsYWdzID0gUlRMRF9MQVpZIHwgUlRMRF9HTE9CQUw7CisKKyAgICBUaGlzLT5tX2hMaWJyYXJ5ID0gKHZvaWQgKilETE9QRU4oVGhpcy0+bV9wc3pQYXRoLCBuRmxhZ3MpOworICAgIHBzekVycm9yID0gZGxlcnJvcigpOworI2VuZGlmCisgICAgaWYoTlVMTCA9PSBUaGlzLT5tX2hMaWJyYXJ5KQorICAgIHsKKyAgICAgICAgcHN6RXJyb3IgPQorICAgICAgICAgICAgYXByX3BzcHJpbnRmKE5VTEwgPT0gcFRlbXBQb29sID8gVGhpcy0+bV9wUG9vbCA6IHBUZW1wUG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAibW9kX2dzb2FwOiAlcyBsb2FkaW5nIGxpYnJhcnkgJXMiLCBwc3pFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzLT5tX3BzelBhdGgpOworICAgIH0KKworICAgIHJldHVybiBwc3pFcnJvcjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkCitTb2FwU2hhcmVkTGlicmFyaWVzX2luaXQoU29hcFNoYXJlZExpYnJhcmllcyAqIFRoaXMsIGFwcl9wb29sX3QgKiBwKQoreworICAgIFRoaXMtPm1fcFNPQVBMaWJyYXJ5ID0gTlVMTDsKKyAgICBUaGlzLT5tX3BQb29sID0gcDsKKyAgICBUaGlzLT5tX3BTT0FQTGlicmFyeSA9IE5VTEw7CisgICAgVGhpcy0+bV9wTGlicmFyaWVzID0gYXByX2FycmF5X21ha2UocCwgMCwgc2l6ZW9mKFNvYXBTaGFyZWRMaWJyYXJ5ICoqKSk7CisgICAgVGhpcy0+bV9iQWxsTGlicmFyaWVzTG9hZGVkID0gZmFsc2U7CisgICAgVGhpcy0+bV9wZm5FbnRyeVBvaW50ID0gTlVMTDsKKyAgICBUaGlzLT5tX3BJbnRmID0KKyAgICAgICAgKHN0cnVjdCBhcGFjaGVfc29hcF9pbnRlcmZhY2UgKilhcHJfcGNhbGxvYyhwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlX3NvYXBfaW50ZXJmYWNlKSk7Cit9CitzdGF0aWMgU29hcFNoYXJlZExpYnJhcnkgKgorU29hcFNoYXJlZExpYnJhcmllc19nZXRMaWJyYXJ5KFNvYXBTaGFyZWRMaWJyYXJpZXMgKiBUaGlzLCB1bnNpZ25lZCBuSW5kZXgpCit7CisgICAgU29hcFNoYXJlZExpYnJhcnkgKipwcExpYnMgPSBOVUxMOworICAgIFNvYXBTaGFyZWRMaWJyYXJ5ICpwTGliID0gTlVMTDsKKworICAgIGFzc2VydChOVUxMICE9IFRoaXMpOworICAgIGFzc2VydChOVUxMICE9IFRoaXMtPm1fcExpYnJhcmllcyk7CisgICAgYXNzZXJ0KG5JbmRleCA+PSAwKTsKKyAgICBhc3NlcnQobkluZGV4IDwgVGhpcy0+bV9wTGlicmFyaWVzLT5uZWx0cyk7CisgICAgcHBMaWJzID0gKFNvYXBTaGFyZWRMaWJyYXJ5ICoqKSBUaGlzLT5tX3BMaWJyYXJpZXMtPmVsdHM7CisgICAgcExpYiA9IHBwTGlic1tuSW5kZXhdOworICAgIHJldHVybiBwTGliOworfQorCisvKioKKyAqIEBwYXJhbSBwc3pQYXRoIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG5hbWUgb2YgdGhlIGxpYnJhcnkuCisgKi8KK3N0YXRpYyBib29sCitTb2FwU2hhcmVkTGlicmFyaWVzX2NvbnRhaW5zKFNvYXBTaGFyZWRMaWJyYXJpZXMgKiBUaGlzLCBjb25zdCBjaGFyICpwc3pQYXRoKQoreworICAgIGludCBpID0gMDsKKyAgICBib29sIGJDb250YWlucyA9IGZhbHNlOworCisgICAgZm9yKGkgPSAwOyBpIDwgVGhpcy0+bV9wTGlicmFyaWVzLT5uZWx0cyAmJiAhYkNvbnRhaW5zOyBpKyspCisgICAgeworICAgICAgICBTb2FwU2hhcmVkTGlicmFyeSAqcExpYiA9IFNvYXBTaGFyZWRMaWJyYXJpZXNfZ2V0TGlicmFyeShUaGlzLCBpKTsKKworICAgICAgICBhc3NlcnQoTlVMTCAhPSBwTGliKTsKKyAgICAgICAgaWYoMCA9PSBzdHJjbXAocHN6UGF0aCwgcExpYi0+bV9wc3pQYXRoKSkKKyAgICAgICAgeworICAgICAgICAgICAgYkNvbnRhaW5zID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYkNvbnRhaW5zOworfQorc3RhdGljIHZvaWQKK1NvYXBTaGFyZWRMaWJyYXJpZXNfYWRkTGlicmFyeShTb2FwU2hhcmVkTGlicmFyaWVzICogVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb2FwU2hhcmVkTGlicmFyeSAqIHBMaWJyYXJ5KQoreworICAgIGFzc2VydChOVUxMICE9IHBMaWJyYXJ5KTsKKyAgICBUaGlzLT5tX2JBbGxMaWJyYXJpZXNMb2FkZWQgPSBmYWxzZTsKKyAgICBpZighU29hcFNoYXJlZExpYnJhcmllc19jb250YWlucyhUaGlzLCBwTGlicmFyeS0+bV9wc3pQYXRoKSkKKyAgICB7CisgICAgICAgIFNvYXBTaGFyZWRMaWJyYXJ5ICoqcHBOZXdMaWIgPQorICAgICAgICAgICAgKFNvYXBTaGFyZWRMaWJyYXJ5ICoqKSBhcHJfYXJyYXlfcHVzaChUaGlzLT5tX3BMaWJyYXJpZXMpOworICAgICAgICAqcHBOZXdMaWIgPSBwTGlicmFyeTsKKyAgICAgICAgaWYocExpYnJhcnktPm1fYklzU09BUExpYnJhcnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRoaXMtPm1fcFNPQVBMaWJyYXJ5ID0gcExpYnJhcnk7CisgICAgICAgIH0KKyAgICB9Cit9CitzdGF0aWMgY29uc3QgY2hhciAqCitTb2FwU2hhcmVkTGlicmFyaWVzX2dldEVudHJ5UG9pbnRzKFNvYXBTaGFyZWRMaWJyYXJpZXMgKiBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb2FwU2hhcmVkTGlicmFyeSAqIHBMaWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcl9wb29sX3QgKiBwVGVtcFBvb2wsIHJlcXVlc3RfcmVjICogcikKK3sKKyAgICAvKgorICAgICAqIG5vdyB3ZSBhbHNvIHBhc3MgdGhlIHJlcXVlc3QgcmVjb3JkIAorICAgICAqLworICAgICgqVGhpcy0+bV9wZm5FbnRyeVBvaW50KSAoVGhpcy0+bV9wSW50Ziwgcik7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogQHJldHVybiB0aGUgZXJyb3IgbWVzc2FnZSBpZiBhIGxvYWQgZmFpbGVkLCBOVUxMIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoKK1NvYXBTaGFyZWRMaWJyYXJpZXNfbG9hZEFsbExpYnJhcmllcyhTb2FwU2hhcmVkTGlicmFyaWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGlzLCBhcHJfcG9vbF90ICogcFRlbXBQb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfcmVjICogcikKK3sKKyAgICBib29sIGJBbGxMaWJyYXJpZXNMb2FkZWQgPSBmYWxzZTsKKyAgICBjb25zdCBjaGFyICpwc3pFcnJvciA9IE5VTEw7CisgICAgYm9vbCBiUmV0cnkgPSBmYWxzZTsKKyAgICBpbnQgaSA9IDA7CisgICAgaW50IG5SZXRyeSA9IDA7CisKKyAgICBhc3NlcnQoTlVMTCAhPSBUaGlzKTsKKworCisgICAgaWYoVGhpcy0+bV9iQWxsTGlicmFyaWVzTG9hZGVkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZvcihuUmV0cnkgPSAwOyBuUmV0cnkgPCA1ICYmICFiQWxsTGlicmFyaWVzTG9hZGVkOyBuUmV0cnkrKykKKyAgICB7CisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIHBzekVycm9yID0gTlVMTDsKKyAgICAgICAgICAgIGJSZXRyeSA9IGZhbHNlOyAgICAgLy8gZG9uJ3QgdHJ5IGl0IGFnYWluLgorICAgICAgICAgICAgYkFsbExpYnJhcmllc0xvYWRlZCA9IHRydWU7CisgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBUaGlzLT5tX3BMaWJyYXJpZXMtPm5lbHRzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU29hcFNoYXJlZExpYnJhcnkgKnBMaWIgPQorICAgICAgICAgICAgICAgICAgICBTb2FwU2hhcmVkTGlicmFyaWVzX2dldExpYnJhcnkoVGhpcywgaSk7CisgICAgICAgICAgICAgICAgaWYoTlVMTCA9PSBwTGliLT5tX2hMaWJyYXJ5KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHN6RXJyb3IgPSBTb2FwU2hhcmVkTGlicmFyeV9sb2FkKHBMaWIsIHBUZW1wUG9vbCk7CisgICAgICAgICAgICAgICAgICAgIGlmKE5VTEwgPT0gcHN6RXJyb3IpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChOVUxMICE9IHBMaWItPm1faExpYnJhcnkpOworICAgICAgICAgICAgICAgICAgICAgICAgYlJldHJ5ID0gdHJ1ZTsgIC8vLzwgd2UgbG9hZGVkIG9uZSwgbGV0cyByZXRyeSB3aXRoIGFsbCBvdGhlcnMsIG1heWJlIHRoZXkgZGVwZW5kIG9uIHRoYXQuCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiQWxsTGlicmFyaWVzTG9hZGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoTlVMTCAhPSBwTGliLT5tX2hMaWJyYXJ5ICYmIHBMaWItPm1fYklzU09BUExpYnJhcnkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBmdW4gPSAodm9pZCAqKURMU1lNKHBMaWItPm1faExpYnJhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEFDSEVfSFRUUFNFUlZFUl9FTlRSWV9QT0lOVCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKE5VTEwgPT0gcGZ1bikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3pFcnJvciA9IGFwcl9wc3ByaW50ZihwVGVtcFBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdzb2FwOiBsb2FkIGxpYnJhcnkgXCIlc1wiIHN1Y2Nlc3MsIGJ1dCBmYWlsZWQgdG8gZmluZCB0aGUgXCIlc1wiIGVudHJ5IHBvaW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGliLT5tX3BzelBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBBQ0hFX0hUVFBTRVJWRVJfRU5UUllfUE9JTlQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwc3pFcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzLT5tX3BmbkVudHJ5UG9pbnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXBhY2hlX2luaXRfc29hcF9pbnRlcmZhY2VfZm4pIHBmdW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN6RXJyb3IgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb2FwU2hhcmVkTGlicmFyaWVzX2dldEVudHJ5UG9pbnRzKFRoaXMsIHBMaWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBQb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzekVycm9yID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXByX3BzcHJpbnRmKE5VTEwgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wUG9vbCA/IFRoaXMtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUG9vbCA6IHBUZW1wUG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb2RfZ3NvYXA6IGhhcyBnb3QgZW50cnlwb2ludCAlcyBmcm9tIGxpYnJhcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBBQ0hFX0hUVFBTRVJWRVJfRU5UUllfUE9JTlQpOworCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUoYlJldHJ5KTsKKyAgICB9CisgICAgaWYoYkFsbExpYnJhcmllc0xvYWRlZCkKKyAgICB7CisgICAgICAgIFRoaXMtPm1fYkFsbExpYnJhcmllc0xvYWRlZCA9IHRydWU7CisgICAgICAgIHBzekVycm9yID0gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHBzekVycm9yOworfQorc3RhdGljIHZvaWQKK1NvYXBTaGFyZWRMaWJyYXJpZXNfbWVyZ2UoU29hcFNoYXJlZExpYnJhcmllcyAqIFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNvYXBTaGFyZWRMaWJyYXJpZXMgKiBwTGlicykKK3sKKyAgICBpbnQgaSA9IDA7CisKKyAgICBhc3NlcnQoTlVMTCAhPSBUaGlzKTsKKyAgICBpZihOVUxMID09IHBMaWJzKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBUaGlzLT5tX2JBbGxMaWJyYXJpZXNMb2FkZWQgPSBmYWxzZTsKKyAgICBmb3IoaSA9IDA7IGkgPCBwTGlicy0+bV9wTGlicmFyaWVzLT5uZWx0czsgaSsrKQorICAgIHsKKyAgICAgICAgU29hcFNoYXJlZExpYnJhcnkgKnBMaWIgPSBTb2FwU2hhcmVkTGlicmFyaWVzX2dldExpYnJhcnkocExpYnMsIGkpOworCisgICAgICAgIGlmKCFTb2FwU2hhcmVkTGlicmFyaWVzX2NvbnRhaW5zKFRoaXMsIHBMaWItPm1fcHN6UGF0aCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNvYXBTaGFyZWRMaWJyYXJ5ICpwTmV3TGliID0KKyAgICAgICAgICAgICAgICBTb2FwU2hhcmVkTGlicmFyeV9jcmVhdGUoVGhpcy0+bV9wUG9vbCk7CisgICAgICAgICAgICBTb2FwU2hhcmVkTGlicmFyeV9pbml0KHBOZXdMaWIsIFRoaXMtPm1fcFBvb2wsIHBMaWIpOworICAgICAgICAgICAgU29hcFNoYXJlZExpYnJhcmllc19hZGRMaWJyYXJ5KFRoaXMsIHBOZXdMaWIpOworICAgICAgICB9CisgICAgfQorfQorc3RhdGljIHZvaWQKK1NvYXBTaGFyZWRMaWJyYXJpZXNfbWVyZ2UzKFNvYXBTaGFyZWRMaWJyYXJpZXMgKiBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU29hcFNoYXJlZExpYnJhcmllcyAqIGxpYnJhcmllczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTb2FwU2hhcmVkTGlicmFyaWVzICogbGlicmFyaWVzMikKK3sKKyAgICBTb2FwU2hhcmVkTGlicmFyaWVzX21lcmdlKFRoaXMsIGxpYnJhcmllczEpOworICAgIFNvYXBTaGFyZWRMaWJyYXJpZXNfbWVyZ2UoVGhpcywgbGlicmFyaWVzMik7Cit9CitzdGF0aWMgdm9pZAorZ3NvYXBDb25maWd1cmF0aW9uX21lcmdlKGdzb2FwQ29uZmlndXJhdGlvbiAqIFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ3NvYXBDb25maWd1cmF0aW9uICogcFBhcmVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBnc29hcENvbmZpZ3VyYXRpb24gKiBwTmV3Q29uZmlnKQoreworICAgIGFzc2VydChOVUxMICE9IFRoaXMpOworICAgIFNvYXBTaGFyZWRMaWJyYXJpZXNfbWVyZ2UzKFRoaXMtPm1fcExpYnJhcmllcywgcFBhcmVudENvbmZpZy0+bV9wTGlicmFyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXdDb25maWctPm1fcExpYnJhcmllcyk7CisgICAgVGhpcy0+bV9UeXBlID0gY3RfYm90aDsKK30KK3N0YXRpYyB2b2lkCitnc29hcENvbmZpZ3VyYXRpb25faW5pdChnc29hcENvbmZpZ3VyYXRpb24gKiBUaGlzLCBhcHJfcG9vbF90ICogcCkKK3sKKyAgICBUaGlzLT5tX3BMaWJyYXJpZXMgPQorICAgICAgICAoU29hcFNoYXJlZExpYnJhcmllcyAqKSBhcHJfcGNhbGxvYyhwLCBzaXplb2YoU29hcFNoYXJlZExpYnJhcmllcykpOworICAgIFNvYXBTaGFyZWRMaWJyYXJpZXNfaW5pdChUaGlzLT5tX3BMaWJyYXJpZXMsIHApOworICAgIFRoaXMtPm1fVHlwZSA9IGN0X2RpcmVjdG9yeTsKK30KK3N0YXRpYyBnc29hcENvbmZpZ3VyYXRpb24gKgorZ3NvYXBDb25maWd1cmF0aW9uX2NyZWF0ZShhcHJfcG9vbF90ICogcCkKK3sKKyAgICBnc29hcENvbmZpZ3VyYXRpb24gKnBDb25maWcgPQorICAgICAgICAoZ3NvYXBDb25maWd1cmF0aW9uICopIGFwcl9wY2FsbG9jKHAsIHNpemVvZihnc29hcENvbmZpZ3VyYXRpb24pKTsKKyAgICBnc29hcENvbmZpZ3VyYXRpb25faW5pdChwQ29uZmlnLCBwKTsKKyAgICByZXR1cm4gcENvbmZpZzsKK30KKworLyoKKyAqIGZvcndhcmQgZGVjbGFyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqLworc3RhdGljIGludCBnc29hcF9oYW5kbGVyKHJlcXVlc3RfcmVjICogcik7CitzdGF0aWMgaW50IGdzb2FwX2luaXQoYXByX3Bvb2xfdCAqIHAsIGFwcl9wb29sX3QgKiBwdGVtcCwgYXByX3Bvb2xfdCAqIHBsb2csCisgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX3JlYyAqIHBzcmVjKTsKK3N0YXRpYyB2b2lkICpnc29hcF9jcmVhdGVfZGlyX2NvbmZpZyhhcHJfcG9vbF90ICogcCwgY2hhciAqZGlyc3BlYyk7CitzdGF0aWMgdm9pZCAqZ3NvYXBfbWVyZ2VfZGlyX2NvbmZpZyhhcHJfcG9vbF90ICogcCwgdm9pZCAqcGFyZW50X2NvbmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpuZXdsb2NfY29uZik7CitzdGF0aWMgdm9pZCAqZ3NvYXBfY3JlYXRlX3NlcnZlcl9jb25maWcoYXByX3Bvb2xfdCAqIHAsIHNlcnZlcl9yZWMgKiBzKTsKK3N0YXRpYyB2b2lkICpnc29hcF9tZXJnZV9zZXJ2ZXJfY29uZmlnKGFwcl9wb29sX3QgKiBwLCB2b2lkICpzZXJ2ZXIxX2NvbmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpzZXJ2ZXIyX2NvbmYpOworCitzdGF0aWMgYm9vbCBBZGRTaGFyZWRMaWJyYXJ5KGdzb2FwQ29uZmlndXJhdGlvbiAqIHBDb25maWcsIGNvbnN0IGNoYXIgKnBzelBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgYklzU09BUExpYnJhcnkpOworCisKKy8qCisgKiAqCisgKiAqIFdlIHByb3RvdHlwZWQgdGhlIHZhcmlvdXMgc3ludGF4IGZvciBjb21tYW5kIGhhbmRsZXJzIChyb3V0aW5lcyB0aGF0ICAgICAKKyAqICogYXJlIGNhbGxlZCB3aGVuIHRoZSBjb25maWd1cmF0aW9uIHBhcnNlciBkZXRlY3RzIGEgZGlyZWN0aXZlIGRlY2xhcmVkICAgIAorICogKiBieSBvdXIgbW9kdWxlKSBlYXJsaWVyLiAgTm93IHdlIGFjdHVhbGx5IGRlY2xhcmUgYSAicmVhbCIgcm91dGluZSB0aGF0ICAgCisgKiAqIHdpbGwgYmUgaW52b2tlZCBieSB0aGUgcGFyc2VyIHdoZW4gb3VyICJyZWFsIiBkaXJlY3RpdmUgaXMgICAgICAgICAgICAgICAKKyAqICogZW5jb3VudGVyZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCisgKiAqIElmIGEgY29tbWFuZCBoYW5kbGVyIGVuY291bnRlcnMgYSBwcm9ibGVtIHByb2Nlc3NpbmcgdGhlIGRpcmVjdGl2ZSwgaXQgICAKKyAqICogc2lnbmFscyB0aGlzIGZhY3QgYnkgcmV0dXJuaW5nIGEgbm9uLU5VTEwgcG9pbnRlciB0byBhIHN0cmluZyAgICAgICAgICAgIAorICogKiBkZXNjcmliaW5nIHRoZSBwcm9ibGVtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAKKyAqICogVGhlIG1hZ2ljIHJldHVybiB2YWx1ZSBERUNMSU5FX0NNRCBpcyB1c2VkIHRvIGRlYWwgd2l0aCBkaXJlY3RpdmVzICAgICAgIAorICogKiB0aGF0IG1pZ2h0IGJlIGRlY2xhcmVkIGJ5IG11bHRpcGxlIG1vZHVsZXMuICBJZiB0aGUgY29tbWFuZCBoYW5kbGVyICAgICAgCisgKiAqIHJldHVybnMgTlVMTCwgdGhlIGRpcmVjdGl2ZSB3YXMgcHJvY2Vzc2VkOyBpZiBpdCByZXR1cm5zIERFQ0xJTkVfQ01ELCAgICAKKyAqICogdGhlIG5leHQgbW9kdWxlIChpZiBhbnkpIHRoYXQgZGVjbGFyZXMgdGhlIGRpcmVjdGl2ZSBpcyBnaXZlbiBhIGNoYW5jZSAgIAorICogKiBhdCBpdC4gIElmIGl0IHJldHVybnMgYW55IG90aGVyIHZhbHVlLCBpdCdzIHRyZWF0ZWQgYXMgdGhlIHRleHQgb2YgYW4gICAgCisgKiAqIGVycm9yIG1lc3NhZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqLworCisvKiogQ29tbWFuZCBoYW5kbGVyIGZvciB0aGUgVEFLRTEgIlNPQVBMaWJyYXJ5IiBkaXJlY3RpdmUuCisgKiBXZSByZW1lbWJlciB0aGUgbG9hZCBwYXRoIGZvciB0aGUgc2hhcmVkIGxpYnJhcnkgdGhhdCBjb250YWlucyB0aGUgU09BUCBzZXJ2ZXIuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoKK2NtZF9Tb2FwTGlicmFyeShjbWRfcGFybXMgKiBjbWQsIHZvaWQgKm1jb25maWcsIGNvbnN0IGNoYXIgKnBzelBhdGgpCit7CisgICAgZ3NvYXBDb25maWd1cmF0aW9uICpwQ29uZmlnID0gKGdzb2FwQ29uZmlndXJhdGlvbiAqKSBtY29uZmlnOworCisgICAgQWRkU2hhcmVkTGlicmFyeShwQ29uZmlnLCBwc3pQYXRoLCB0cnVlKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqIENvbW1hbmQgaGFuZGxlciBmb3IgdGhlIFRBS0UxICJTT0FQU3VwcG9ydExpYnJhcnkiIGRpcmVjdGl2ZS4KKyAqIFdlIHJlbWVtYmVyIHRoZSBsb2FkIHBhdGggZm9yIGEgc2hhcmVkIGxpYnJhcnkgdGhhdCBtdXN0IGFkZGl0aW9uYWxseSBsb2FkZWQuCisgKiBUaGlzIGlzIGEgbWVjaGFuaXNtIHRvIGxvYWQgbGlicmFyaWVzIHRoYXQgdGhlIFNPQVBMaWJyYXJ5IGRlcGVuZHMgb24uCisgKiBUaGlzIHR5cGUgb2YgbGlicmFyaWVzIGRvIG5vdCBjb250YWluIG91ciBzb2FwIHNlcnZlci4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKgorY21kX1N1cHBvcnRMaWJyYXJ5KGNtZF9wYXJtcyAqIGNtZCwgdm9pZCAqbWNvbmZpZywgY29uc3QgY2hhciAqcHN6UGF0aCkKK3sKKyAgICBnc29hcENvbmZpZ3VyYXRpb24gKnBDb25maWcgPSAoZ3NvYXBDb25maWd1cmF0aW9uICopIG1jb25maWc7CisKKyAgICBBZGRTaGFyZWRMaWJyYXJ5KHBDb25maWcsIHBzelBhdGgsIGZhbHNlKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordHlwZWRlZiBjb25zdCBjaGFyICooKmNvbW1hbmRfZnVuY3Rpb25faW50ZXJmYWNlKSAoKTsKKworLyoqIExpc3Qgb2YgZGlyZWN0aXZlcyBzcGVjaWZpYyB0byBvdXIgbW9kdWxlLgorICovCitzdGF0aWMgY29uc3QgY29tbWFuZF9yZWMgZ3NvYXBfY21kc1tdID0geworICAgIEFQX0lOSVRfVEFLRTEoIlNPQVBMaWJyYXJ5IiwgICAgLy8vPCBkaXJlY3RpdmUgbmFtZQorICAgICAgICAgICAgICAgICAgKGNvbW1hbmRfZnVuY3Rpb25faW50ZXJmYWNlKSBjbWRfU29hcExpYnJhcnksIC8vLzwgY29uZmlnIGFjdGlvbiByb3V0aW5lCisgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgIC8vLzwgYXJndW1lbnQgdG8gaW5jbHVkZSBpbiBjYWxsCisgICAgICAgICAgICAgICAgICBBQ0NFU1NfQ09ORiwgIC8vLzwgd2hlcmUgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgICAiU09BUCBzaGFyZWQgTGlicmFyeSB0aGF0IHdpbGwgYmUgZHluYW1pY2FsbHkgbG9hZGVkLiAtIDEgYXJndW1lbnQgKHBhdGgpIiAgICAvLy88IGRpcmVjdGl2ZSBkZXNjcmlwdGlvbgorICAgICAgICApLAorICAgIEFQX0lOSVRfVEFLRTEoIlN1cHBvcnRMaWJyYXJ5IiwgLy8vPCBkaXJlY3RpdmUgbmFtZQorICAgICAgICAgICAgICAgICAgKGNvbW1hbmRfZnVuY3Rpb25faW50ZXJmYWNlKSBjbWRfU3VwcG9ydExpYnJhcnksICAvLy88IGNvbmZpZyBhY3Rpb24gcm91dGluZQorICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAvLy88IGFyZ3VtZW50IHRvIGluY2x1ZGUgaW4gY2FsbAorICAgICAgICAgICAgICAgICAgQUNDRVNTX0NPTkYsICAvLy88IHdoZXJlIGF2YWlsYWJsZQorICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWwgbGlicmFyeSB0aGF0IG11c3QgYmUgZHluYW1pY2FsbHkgbG9hZGVkIC0gMSBhcmd1bWVudCAocGF0aCkiICAvLy88IGRpcmVjdGl2ZSBkZXNjcmlwdGlvbgorICAgICAgICApLAorICAgIHtOVUxMfQorfTsKKworLyoKKyAqIEFsbCBvZiB0aGUgcm91dGluZXMgaGF2ZSBiZWVuIGRlY2xhcmVkIG5vdy4gIEhlcmUncyB0aGUgbGlzdCBvZiAgICAgICAgICAKKyAqIGRpcmVjdGl2ZXMgc3BlY2lmaWMgdG8gb3VyIG1vZHVsZSwgYW5kIGluZm9ybWF0aW9uIGFib3V0IHdoZXJlIHRoZXkgICAgICAKKyAqIG1heSBhcHBlYXIgYW5kIGhvdyB0aGUgY29tbWFuZCBwYXJzZXIgc2hvdWxkIHBhc3MgdGhlbSB0byB1cyBmb3IgICAgICAgICAKKyAqIHByb2Nlc3NpbmcuICBOb3RlIHRoYXQgY2FyZSBtdXN0IGJlIHRha2VuIHRvIGVuc3VyZSB0aGF0IHRoZXJlIGFyZSBOTyAgICAKKyAqIGNvbGxpc2lvbnMgb2YgZGlyZWN0aXZlIG5hbWVzIGJldHdlZW4gbW9kdWxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqLworCisvKgorICogTW9kdWxlIGRlZmluaXRpb24gZm9yIGNvbmZpZ3VyYXRpb24uICBJZiBhIHBhcnRpY3VsYXIgY2FsbGJhY2sgaXMgbm90CisgKiBuZWVkZWQsIHJlcGxhY2UgaXRzIHJvdXRpbmUgbmFtZSBiZWxvdyB3aXRoIHRoZSB3b3JkIE5VTEwuCisgKgorICogVGhlIG51bWJlciBpbiBicmFja2V0cyBpbmRpY2F0ZXMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSByb3V0aW5lIGlzIGNhbGxlZAorICogZHVyaW5nIHJlcXVlc3QgcHJvY2Vzc2luZy4gIE5vdGUgdGhhdCBub3QgYWxsIHJvdXRpbmVzIGFyZSBuZWNlc3NhcmlseQorICogY2FsbGVkIChzdWNoIGFzIGlmIGEgcmVzb3VyY2UgZG9lc24ndCBoYXZlIGFjY2VzcyByZXN0cmljdGlvbnMpLgorICovCisKKy8qKiBMaXN0IG9mIGNhbGxiYWNrIHJvdXRpbmVzIGFuZCBkYXRhIHN0cnVjdHVyZXMgdGhhdCBwcm92aWRlIHRoZSBob29rcyBpbnRvIG91ciBtb2R1bGUuCisgKi8KKworc3RhdGljIHZvaWQKK2dzb2FwX2hvb2tzKGFwcl9wb29sX3QgKiBwKQoreworICAgIC8vIEkgdGhpbmsgdGhpcyBpcyB0aGUgY2FsbCB0byBtYWtlIHRvIHJlZ2lzdGVyIGEgaGFuZGxlciBmb3IgbWV0aG9kIGNhbGxzIChHRVQgUFVUIGV0LiBhbC4pLgorICAgIC8vIFdlIHdpbGwgYXNrIHRvIGJlIGxhc3Qgc28gdGhhdCB0aGUgY29tbWVudCBoYXMgYSBoaWdoZXIgdGVuZGVuY3kgdG8KKyAgICAvLyBnbyBhdCB0aGUgZW5kLgorICAgIGFwX2hvb2tfaGFuZGxlcihnc29hcF9oYW5kbGVyLCBOVUxMLCBOVUxMLCBBUFJfSE9PS19MQVNUKTsKKworICAgIC8vUmVnaXN0ZXIgYSBoYW5kbGVyIGZvciBwb3N0IGNvbmZpZyBwcm9jZXNzaW5nIAorICAgIGFwX2hvb2tfcG9zdF9jb25maWcoZ3NvYXBfaW5pdCwgTlVMTCwgTlVMTCwgQVBSX0hPT0tfTUlERExFKTsKK30KKworCittb2R1bGUgQVBfTU9EVUxFX0RFQ0xBUkVfREFUQSBnc29hcF9tb2R1bGUgPSB7CisgICAgU1RBTkRBUkQyMF9NT0RVTEVfU1RVRkYsCisgICAgZ3NvYXBfY3JlYXRlX2Rpcl9jb25maWcsICAgIC8qIHBlci1kaXJlY3RvcnkgY29uZmlnIGNyZWF0b3IgKi8KKyAgICBnc29hcF9tZXJnZV9kaXJfY29uZmlnLCAgICAgLyogZGlyIGNvbmZpZyBtZXJnZXIgKi8KKyAgICBnc29hcF9jcmVhdGVfc2VydmVyX2NvbmZpZywgLyogc2VydmVyIGNvbmZpZyBjcmVhdG9yICovCisgICAgZ3NvYXBfbWVyZ2Vfc2VydmVyX2NvbmZpZywgIC8qIHNlcnZlciBjb25maWcgbWVyZ2VyICovCisgICAgZ3NvYXBfY21kcywgICAgICAgICAgICAgICAgIC8qIGNvbW1hbmQgdGFibGUgKi8KKyAgICBnc29hcF9ob29rcywgICAgICAgICAgICAgICAgLypob29rcyAqLworfTsKKworLyoqIGhlbHBlciB0byB3cml0ZSBvdXQgdGhlIGhlYWRlcnMgKi8KK3N0YXRpYyBpbnQKK0xpc3RIZWFkZXJzQ2FsbGJhY2sodm9pZCAqcmVjLCBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbHVlKQoreworICAgIHJlcXVlc3RfcmVjICpyID0gKHJlcXVlc3RfcmVjICopIHJlYzsKKworICAgIGFwX3JwcmludGYociwgIiVzOiAlczxicj4iLCBrZXksIHZhbHVlKTsKKyAgICByZXR1cm4gMTsKK30KKworLyoqIHdyaXRlIG91dCB0aGUgaGVhZGVycyBvZiB0aGUgcmVxdWVzdC4gKi8KK3N0YXRpYyB2b2lkCitMaXN0SGVhZGVycyhyZXF1ZXN0X3JlYyAqIHIpCit7CisgICAgYXByX3RhYmxlX2RvKExpc3RIZWFkZXJzQ2FsbGJhY2ssIHIsIHItPmhlYWRlcnNfaW4sIE5VTEwpOworfQorCisvKiogc2VuZCB0aGUgZXJyb3IgbWVzc2FnZSB0byB0aGUgY2xpZW50IGJyb3dzZXIgKi8KK3N0YXRpYyB2b2lkCitTZW5kRXJyb3JNZXNzYWdlKHJlcXVlc3RfcmVjICogciwgY29uc3QgY2hhciAqcHN6RXJyb3IpCit7CisgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgMCwgci0+c2VydmVyLCAibW9kX2dzb2FwOiAlcyIsCisgICAgICAgICAgICAgICAgIHBzekVycm9yKTsKKyAgICByLT5jb250ZW50X3R5cGUgPSAidGV4dC9odG1sIjsKKyAgICBhcF9ycHV0cyhET0NUWVBFX0hUTUxfM18yLCByKTsKKyAgICBhcF9ycHV0cygiPEhUTUw+XG4iLCByKTsKKyAgICBhcF9ycHV0cygiIDxIRUFEPlxuIiwgcik7CisgICAgYXBfcnB1dHMoIiAgPFRJVExFPkFwYWNoZSBTb2FwIEhhbmRsZXJcbiIsIHIpOworICAgIGFwX3JwdXRzKCIgIDwvVElUTEU+XG4iLCByKTsKKyAgICBhcF9ycHV0cygiIDwvSEVBRD5cbiIsIHIpOworICAgIGFwX3JwdXRzKCIgPEJPRFk+XG4iLCByKTsKKyAgICBhcF9ycHV0cygiICA8SDE+bW9kX2dzb2FwIEFwYWNoZSBTT0FQIFNlcnZlciBFcnJvcjwvSDE+XG4iLCByKTsKKyAgICBhcF9ycHJpbnRmKHIsCisgICAgICAgICAgICAgICAiPHA+PHN0cm9uZz4lczwvc3Ryb25nPjxicj5QbGVhc2Ugc2VlIHRoZSBkb2N1bWVudGF0aW9uIGF0IDxhIGhyZWY9XCJodHRwOi8vd3d3LndlYndhcmUuYXQvU09BUFwiPldlYldhcmU8L2E+IGZvciBkZXRhaWxzLjwvcD4iLAorICAgICAgICAgICAgICAgcHN6RXJyb3IpOworICAgIGFwX3JwdXRzKCIgIDxIMj5Db250ZW50IGhlYWRlcnMgb2YgdGhlIHJlcXVlc3Q8L0gyPlxuIiwgcik7CisgICAgTGlzdEhlYWRlcnMocik7CisgICAgYXBfcnB1dHMoIjwvQk9EWT48L0hUTUw+XG4iLCByKTsKK30KK3N0YXRpYyBpbnQKK3NlbmRfaGVhZGVyX3RvX2dzb2FwKHZvaWQgKnB2b2lkLCBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbHVlKQoreworICAgIGdzb2FwUmVxdWVzdENvbmZpZ3VyYXRpb24gKnBScUNvbmYgPSBOVUxMOworICAgIHN0cnVjdCBzb2FwICpwc29hcCA9IChzdHJ1Y3Qgc29hcCAqKXB2b2lkOworCisgICAgaWYoTlVMTCAhPSBwc29hcCkKKyAgICB7CisgICAgICAgIHBScUNvbmYgPSBnZXRSZXF1ZXN0Q29uZmlndXJhdGlvbihwc29hcCk7CisgICAgfQorICAgIGlmKE5VTEwgPT0gcFJxQ29uZikKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZigwID09IHN0cmNhc2VjbXAoa2V5LCAiU09BUEFjdGlvbiIpIHx8CisgICAgICAgMCA9PSBzdHJjYXNlY21wKGtleSwgIkNvbnRlbnQtVHlwZSIpIHx8CisgICAgICAgMCA9PSBzdHJjYXNlY21wKGtleSwgIlN0YXR1cyIpIHx8IDAgPT0gc3RyY2FzZWNtcChrZXksICJDb250ZW50LUxlbmd0aCIpKQorICAgIHsKKyAgICAgICAgcHNvYXAtPmZwYXJzZWhkcihwc29hcCwga2V5LCB2YWx1ZSk7CisgICAgfQorICAgIHJldHVybiAxOworfQorCisvKgorICogQ2FsbGJhY2sgZnVuY3Rpb25zIGZvciBnc29hcC4gV2UgbXVzdCBwYXJzZSB0aGUgaGVhZGVycyBvdXJzZWx2ZXMgYW5kIAorICogIHdlIG11c3QgaGFuZGxlIHNlbmQvcmVjZWl2ZSBwcm9wZXJseS4gIAorICovCitzdGF0aWMgaW50CitodHRwX3Bvc3RfaGVhZGVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbHVlKQoreworICAgIGdzb2FwUmVxdWVzdENvbmZpZ3VyYXRpb24gKnBScUNvbmYgPSBnZXRSZXF1ZXN0Q29uZmlndXJhdGlvbihzb2FwKTsKKyAgICByZXF1ZXN0X3JlYyAqciA9IE5VTEwgPT0gcFJxQ29uZiA/IE5VTEwgOiBwUnFDb25mLT5yOworCisgICAgaWYoTlVMTCAhPSB2YWx1ZSkKKyAgICB7CisgICAgICAgIGlmKDAgPT0gc3RyY2FzZWNtcChrZXksICJTT0FQQWN0aW9uIikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwcl90YWJsZV9zZXQoci0+aGVhZGVyc19vdXQsIGtleSwgdmFsdWUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoMCA9PSBzdHJjYXNlY21wKGtleSwgIkNvbnRlbnQtVHlwZSIpKQorICAgICAgICB7CisgICAgICAgICAgICByLT5jb250ZW50X3R5cGUgPSBhcHJfcHN0cmR1cChyLT5wb29sLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZigwID09IHN0cmNhc2VjbXAoa2V5LCAiQ29udGVudC1MZW5ndGgiKSkKKyAgICAgICAgeworICAgICAgICAgICAgYXBfc2V0X2NvbnRlbnRfbGVuZ3RoKHIsIGF0b2kodmFsdWUpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gU09BUF9PSzsKK30KKworLyoqIAorZ3NvYXAgZnVuY3Rpb24gdGhhdCByZXF1ZXN0cyB0aGUgbmV4dCBwaWVjZSBvZiBkYXRhIGZyb20gdXMgKi8KK3N0YXRpYyBzaXplX3QKK2ZyZWN2KHN0cnVjdCBzb2FwICpwc29hcCwgY2hhciAqcEJ1ZiwgYXByX3NpemVfdCBsZW4pCit7CisgICAgcmVxdWVzdF9yZWMgKnIgPSBOVUxMOworICAgIGFwcl9zaXplX3QgblJldCA9IDA7CisgICAgZ3NvYXBSZXF1ZXN0Q29uZmlndXJhdGlvbiAqcFJxQ29uZiA9IGdldFJlcXVlc3RDb25maWd1cmF0aW9uKHBzb2FwKTsKKworICAgIGlmKE5VTEwgIT0gcFJxQ29uZikKKyAgICB7CisgICAgICAgIHIgPSBwUnFDb25mLT5yOworICAgICAgICBpZighcFJxQ29uZi0+aGVhZGVyc19yZWNlaXZlZCkKKyAgICAgICAgeworICAgICAgICAgICAgYXByX3RhYmxlX2RvKHNlbmRfaGVhZGVyX3RvX2dzb2FwLCBwc29hcCwgci0+aGVhZGVyc19pbiwgTlVMTCk7CisgICAgICAgICAgICBwUnFDb25mLT5oZWFkZXJzX3JlY2VpdmVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZihyLT5yZW1haW5pbmcgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBuUmV0ID0KKyAgICAgICAgICAgICAgICBhcF9nZXRfY2xpZW50X2Jsb2NrKHIsIHBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPiByLT5yZW1haW5pbmcgPyByLT5yZW1haW5pbmcgOiBsZW4pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBuUmV0OworfQorc3RhdGljIGludAorZnNlbmQoc3RydWN0IHNvYXAgKnBzb2FwLCBjb25zdCBjaGFyICpwQnVmLCBhcHJfc2l6ZV90IGxlbikKK3sKKyAgICBpbnQgblJldCA9IFNPQVBfT0s7CisgICAgZ3NvYXBSZXF1ZXN0Q29uZmlndXJhdGlvbiAqcFJxQ29uZiA9IGdldFJlcXVlc3RDb25maWd1cmF0aW9uKHBzb2FwKTsKKworICAgIGlmKE5VTEwgIT0gcFJxQ29uZikKKyAgICB7CisgICAgICAgIHJlcXVlc3RfcmVjICpyID0gcFJxQ29uZi0+cjsKKworICAgICAgICBpZighcFJxQ29uZi0+aGVhZGVyc19zZW50KQorICAgICAgICB7CisgICAgICAgICAgICAvLyAgICAgICAgICBhcF9zZW5kX2h0dHBfaGVhZGVyKHIpOworICAgICAgICAgICAgcFJxQ29uZi0+aGVhZGVyc19zZW50ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBuUmV0ID0gYXBfcndyaXRlKHBCdWYsIGxlbiwgcikgPT0gbGVuID8gU09BUF9PSyA6IFNPQVBfRkFVTFQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG5SZXQgPSBTT0FQX0ZBVUxUOworICAgIH0KKyAgICByZXR1cm4gblJldDsKK30KKworLyoqIGluc3RlYWQgb2YgcmVhbCBoZWFkZXIgcGFyc2luZyB3ZSBza2lwIHRoYXQuICovCitzdGF0aWMgaW50CitodHRwX3BhcnNlKHN0cnVjdCBzb2FwICpwc29hcCkKK3sKKyAgICByZXR1cm4gU09BUF9PSzsKK30KKworLyoqIG1ha2Ugc3VyZSB3ZSBnbyB0aHJvdWdoIHNvYXBfc2VuZF9mYXVsdCgpLCB3aGljaCBjYWxscyBmcG9sbCAqLworc3RhdGljIGludAorZnBvbGwoc3RydWN0IHNvYXAgKnBzb2FwKQoreworICAgIHJldHVybiBTT0FQX09LOworfQorCisvKgorICogcGx1Z2luIGZ1bmN0aW9ucyAKKyAqLworc3RhdGljIGludAorbW9kX2dzb2FwX3BsdWdpbl9jb3B5KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbHVnaW4gKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnNyYykKK3sKKyAgICAvKgorICAgICAqIHNob3VsZCB0aGlzIGJlIGEgZGVlcCBjb3B5PyAKKyAgICAgKi8KKyAgICAqZHN0ID0gKnNyYzsKKyAgICByZXR1cm4gU09BUF9PSzsKK30KK3N0YXRpYyB2b2lkCittb2RfZ3NvYXBfZGVsZXRlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnApCit7Cit9CitzdGF0aWMgaW50Cittb2RfZ3NvYXBfcGx1Z2luKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnAsIHZvaWQgKmFyZykKK3sKKyAgICBwLT5pZCA9IG1vZF9nc29hcF9pZDsKKyAgICBwLT5kYXRhID0gYXJnOworICAgIHAtPmZjb3B5ID0gbW9kX2dzb2FwX3BsdWdpbl9jb3B5OworICAgIHAtPmZkZWxldGUgPSBtb2RfZ3NvYXBfZGVsZXRlOworICAgIHJldHVybiBTT0FQX09LOworfQorc3RhdGljIHZvaWQKK3NldF9jYWxsYmFja3MocmVxdWVzdF9yZWMgKiByLCBnc29hcFJlcXVlc3RDb25maWd1cmF0aW9uICogcFJxQ29uZiwKKyAgICAgICAgICAgICAgc3RydWN0IHNvYXAgKnBzb2FwKQoreworICAgIGdzb2FwQ29uZmlndXJhdGlvbiAqcENvbmZpZyA9IGdldENvbmZpZ3VyYXRpb24ocik7CisgICAgc3RydWN0IGFwYWNoZV9zb2FwX2ludGVyZmFjZSAqcEludGYgPSBwQ29uZmlnLT5tX3BMaWJyYXJpZXMtPm1fcEludGY7CisKKyAgICBwUnFDb25mLT5yID0gcjsKKyAgICBwUnFDb25mLT5odHRwX3BhcnNlID0gcHNvYXAtPmZwYXJzZTsKKyAgICBwc29hcC0+dXNlciA9IHBScUNvbmY7CisgICAgcHNvYXAtPmZyZWN2ID0gZnJlY3Y7CisgICAgcHNvYXAtPmZzZW5kID0gZnNlbmQ7CisgICAgcHNvYXAtPmZwYXJzZSA9IGh0dHBfcGFyc2U7CisgICAgcHNvYXAtPmZwb3N0aGRyID0gaHR0cF9wb3N0X2hlYWRlcjsKKyAgICBwc29hcC0+ZnBvbGwgPSBmcG9sbDsKKyAgICBpZihOVUxMICE9IHBJbnRmLT5mc29hcF9pbml0KQorICAgIHsKKyAgICAgICAgKCpwSW50Zi0+ZnNvYXBfcmVnaXN0ZXJfcGx1Z2luX2FyZykgKHBzb2FwLCBtb2RfZ3NvYXBfcGx1Z2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwUnFDb25mLCByKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcHNvYXAtPnVzZXIgPSBwUnFDb25mOworICAgIH0KK30KKworLyoKKyAqIAorICogKiBOb3cgd2UgZGVjbGFyZSBvdXIgY29udGVudCBoYW5kbGVycywgd2hpY2ggYXJlIGludm9rZWQgd2hlbiB0aGUgc2VydmVyICAgCisgKiAqIGVuY291bnRlcnMgYSBkb2N1bWVudCB3aGljaCBvdXIgbW9kdWxlIGlzIHN1cHBvc2VkIHRvIGhhdmUgYSBjaGFuY2UgdG8gICAKKyAqICogc2VlLiAgKFNlZSBtb2RfbWltZSdzIFNldEhhbmRsZXIgYW5kIEFkZEhhbmRsZXIgZGlyZWN0aXZlcywgYW5kIHRoZSAgICAgIAorICogKiBtb2RfaW5mbyBhbmQgbW9kX3N0YXR1cyBleGFtcGxlcywgZm9yIG1vcmUgZGV0YWlscy4pICAgICAgICAgICAgICAgICAgICAgCisgKiAKKyAqICogU2luY2UgY29udGVudCBoYW5kbGVycyBhcmUgZHVtcGluZyBkYXRhIGRpcmVjdGx5IGludG8gdGhlIGNvbm5leGlvbiAgICAgIAorICogKiAodXNpbmcgdGhlIHIqKCkgcm91dGluZXMsIHN1Y2ggYXMgcnB1dHMoKSBhbmQgcnByaW50ZigpKSB3aXRob3V0ICAgICAgICAgCisgKiAqIGludGVydmVudGlvbiBieSBvdGhlciBwYXJ0cyBvZiB0aGUgc2VydmVyLCB0aGV5IG5lZWQgdG8gbWFrZSAgICAgICAgICAgICAKKyAqICogc3VyZSBhbnkgYWNjdW11bGF0ZWQgSFRUUCBoZWFkZXJzIGFyZSBzZW50IGZpcnN0LiAgVGhpcyBpcyBkb25lIGJ5ICAgICAgIAorICogKiBjYWxsaW5nIHNlbmRfaHR0cF9oZWFkZXIoKS4gIE90aGVyd2lzZSwgbm8gaGVhZGVyIHdpbGwgYmUgc2VudCBhdCBhbGwsICAgCisgKiAqIGFuZCB0aGUgb3V0cHV0IHNlbnQgdG8gdGhlIGNsaWVudCB3aWxsIGFjdHVhbGx5IGJlIEhUVFAtdW5jb21wbGlhbnQuICAgICAKKyAqLworCisvKioKKyAqIFNPQVAgY29udGVudCBoYW5kbGVyLgorICoKKyAqIEByZXR1cm4gdGhlIHZhbHVlIHRoYXQgaW5zdHJ1Y3RzIHRoZSBjYWxsZXIgY29uY2VybmluZyB3aGF0IGhhcHBlbmVkIGFuZCB3aGF0IHRvIGRvIG5leHQuCisgKiAgT0sgKCJ3ZSBkaWQgb3VyIHRoaW5nIikKKyAqICBERUNMSU5FRCAoInRoaXMgaXNuJ3Qgc29tZXRoaW5nIHdpdGggd2hpY2ggd2Ugd2FudCB0byBnZXQgaW52b2x2ZWQiKQorICogIEhUVFBfbXVtYmxlICgiYW4gZXJyb3Igc3RhdHVzIHNob3VsZCBiZSByZXBvcnRlZCIpCisgKi8KK3N0YXRpYyBpbnQKK2dzb2FwX2hhbmRsZXIocmVxdWVzdF9yZWMgKiByKQoreworICAgIHN0YXRpYyBjb25zdCBpbnQgblJlc3BvbnNlQnVmZmVyTGVuID0gSU9CVUZfQ0hVTktfU0laRTsKKyAgICBjb25zdCBjaGFyICpwc3pFcnJvciA9IE5VTEw7CisgICAgc3RydWN0IHNvYXAgKnBzb2FwID0gTlVMTDsKKyAgICBzdHJ1Y3QgYXBhY2hlX3NvYXBfaW50ZXJmYWNlICpwSW50ZiA9IE5VTEw7CisgICAgaW50IG5SZXQgPSAwOworICAgIGNoYXIgKnBzelJlc3BvbnNlID0gTlVMTDsKKyAgICBnc29hcENvbmZpZ3VyYXRpb24gKnBDb25maWcgPSBnZXRDb25maWd1cmF0aW9uKHIpOworICAgIGdzb2FwUmVxdWVzdENvbmZpZ3VyYXRpb24gKnBScUNvbmYgPSBOVUxMOworCisgICAgLyoKKyAgICAgKiBvbmx5IGhhbmRsZSBzb2FwIHJlcXVlc3RzIAorICAgICAqLworICAgIGlmKCFzdHJzdHIoci0+aGFuZGxlciwgInNvYXAiKSkKKyAgICAgICAgcmV0dXJuIERFQ0xJTkVEOworCisgICAgLyoKKyAgICAgKiBvbmx5IGhhbmRsZSBQT1NUIHJlcXVlc3RzIAorICAgICAqLworICAgIGlmKHItPm1ldGhvZF9udW1iZXIgIT0gTV9QT1NUICYmIHItPm1ldGhvZF9udW1iZXIgIT0gTV9HRVQpCisgICAgICAgIHJldHVybiBERUNMSU5FRDsKKworICAgIHBzelJlc3BvbnNlID0gYXByX3BjYWxsb2Moci0+cG9vbCwgblJlc3BvbnNlQnVmZmVyTGVuKTsKKyAgICBhc3NlcnQoTlVMTCAhPSBwQ29uZmlnKTsKKworICAgIHBzb2FwID0gKHN0cnVjdCBzb2FwICopYXByX3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKHN0cnVjdCBzb2FwKSk7CisgICAgcFJxQ29uZiA9IGFwcl9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihnc29hcFJlcXVlc3RDb25maWd1cmF0aW9uKSk7CisgICAgcHN6RXJyb3IgPQorICAgICAgICBTb2FwU2hhcmVkTGlicmFyaWVzX2xvYWRBbGxMaWJyYXJpZXMocENvbmZpZy0+bV9wTGlicmFyaWVzLCByLT5wb29sLCByKTsKKworICAgIHBJbnRmID0gcENvbmZpZy0+bV9wTGlicmFyaWVzLT5tX3BJbnRmOworCisgICAgYXBfdXBkYXRlX210aW1lKHIsIHItPnJlcXVlc3RfdGltZSk7CisgICAgYXBfc2V0X2xhc3RfbW9kaWZpZWQocik7CisgICAgaWYoTlVMTCAhPSBwc3pFcnJvcikKKyAgICB7CisgICAgICAgIHN0YXRpYyBib29sIGJGaXJzdFRpbWUgPSB0cnVlOworCisgICAgICAgIGlmKGJGaXJzdFRpbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIDAsIHItPnNlcnZlciwgcHN6RXJyb3IpOworICAgICAgICAgICAgYkZpcnN0VGltZSA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBhcyBhIG5leHQgc3RlcCwgd2UgcHJlcGFyZSBhIGJ1ZmZlciB0aGF0IHNlbmRzIHRoZSByZXF1ZXN0IGFzIGZpcnN0IGxpbmUgdG8gZ3NvYXAuIAorICAgICAqIFRoZW4gdGhlIHJlbWFpbmluZyBkYXRhLiAKKyAgICAgKiBXZSBzdGFydCByZXR1cm5pbmcgYnl0ZXMgb24gZnJlY3YgZnJvbSB0aGlzIGJ1ZmZlciwgdW50aWwgaXQgaXMgZW1wdHkuIAorICAgICAqIHRoZW4gaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBmaWRkbGUgYXJvdW5kIHdpdGggZ3NvYXAncyByZXF1ZXN0IGxpbmUgcGFyc2luZy4KKyAgICAgKi8KKyAgICBpZihOVUxMID09IHBzekVycm9yKQorICAgIHsKKyAgICAgICAgcFJxQ29uZi0+ciA9IHI7CisgICAgICAgIHBScUNvbmYtPmhlYWRlcnNfc2VudCA9IGZhbHNlOworICAgICAgICBwUnFDb25mLT5oZWFkZXJzX3JlY2VpdmVkID0gZmFsc2U7CisgICAgICAgIHBScUNvbmYtPm1fcHN6QWxsSGVhZGVycyA9IE5VTEw7CisgICAgICAgIHBScUNvbmYtPm1fbkhlYWRlckxlbmd0aCA9IHN0cmxlbihyLT50aGVfcmVxdWVzdCkgKyAyOworICAgICAgICBwUnFDb25mLT5tX3BzekN1cnJlbnRIZWFkZXJSZWFkaW5nUG9zaXRpb24gPSBOVUxMOworICAgICAgICBwUnFDb25mLT5tX25PdXRCdWZDb3VudCA9IDA7CisgICAgICAgIHBScUNvbmYtPm1fbk91dEJ1Zkxlbmd0aCA9IG5SZXNwb25zZUJ1ZmZlckxlbjsKKyAgICAgICAgcFJxQ29uZi0+bV9wT3V0QnVmID0gYXByX3BjYWxsb2Moci0+cG9vbCwgblJlc3BvbnNlQnVmZmVyTGVuKTsKKyAgICAgICAgcFJxQ29uZi0+aHR0cF9wYXJzZSA9IE5VTEw7CisgICAgICAgIHBScUNvbmYtPm1fcHN6QWxsSGVhZGVycyA9CisgICAgICAgICAgICBhcHJfcGNhbGxvYyhyLT5wb29sLCBwUnFDb25mLT5tX25IZWFkZXJMZW5ndGggKyAxKTsKKyAgICAgICAgcFJxQ29uZi0+bV9wc3pDdXJyZW50SGVhZGVyUmVhZGluZ1Bvc2l0aW9uID0gcFJxQ29uZi0+bV9wc3pBbGxIZWFkZXJzOworICAgICAgICBzdHJjcHkocFJxQ29uZi0+bV9wc3pBbGxIZWFkZXJzLCByLT50aGVfcmVxdWVzdCk7CisgICAgICAgIHN0cmNhdChwUnFDb25mLT5tX3BzekFsbEhlYWRlcnMsICJcclxuIik7CisgICAgICAgIHBScUNvbmYtPnBJbnRmID0gcEludGY7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBXZSdyZSBhYm91dCB0byBzdGFydCBzZW5kaW5nIGNvbnRlbnQsIHNvIHdlIG5lZWQgdG8gZm9yY2UgdGhlIEhUVFAKKyAgICAgKiBoZWFkZXJzIHRvIGJlIHNlbnQgYXQgdGhpcyBwb2ludC4gIE90aGVyd2lzZSwgbm8gaGVhZGVycyB3aWxsIGJlIHNlbnQKKyAgICAgKiBhdCBhbGwuICBXZSBjYW4gc2V0IGFueSB3ZSBsaWtlIGZpcnN0LCBvZiBjb3Vyc2UuICAqKk5PVEUqKiBIZXJlJ3MKKyAgICAgKiB3aGVyZSB5b3Ugc2V0IHRoZSAiQ29udGVudC10eXBlIiBoZWFkZXIsIGFuZCB5b3UgZG8gc28gYnkgcHV0dGluZyBpdCBpbgorICAgICAqIHItPmNvbnRlbnRfdHlwZSwgKm5vdCogci0+aGVhZGVyc19vdXQoIkNvbnRlbnQtdHlwZSIpLiAgSWYgeW91IGRvbid0CisgICAgICogc2V0IGl0LCBpdCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoIHRoZSBzZXJ2ZXIncyBkZWZhdWx0IHR5cGUgKHR5cGljYWxseQorICAgICAqICJ0ZXh0L3BsYWluIikuICBZb3UgKm11c3QqIGFsc28gZW5zdXJlIHRoYXQgci0+Y29udGVudF90eXBlIGlzIGxvd2VyCisgICAgICogY2FzZS4KKyAgICAgKgorICAgICAqLworCisgICAgLyoKKyAgICAgKiBJZiB3ZSdyZSBvbmx5IHN1cHBvc2VkIHRvIHNlbmQgaGVhZGVyIGluZm9ybWF0aW9uIChIRUFEIHJlcXVlc3QpLCB3ZSdyZQorICAgICAqIGFscmVhZHkgdGhlcmUuCisgICAgICovCisgICAgaWYoci0+aGVhZGVyX29ubHkpCisgICAgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIGlmKE5VTEwgIT0gcHN6RXJyb3IpCisgICAgeworICAgICAgICBTZW5kRXJyb3JNZXNzYWdlKHIsIHBzekVycm9yKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICBuUmV0ID0gYXBfc2V0dXBfY2xpZW50X2Jsb2NrKHIsIFJFUVVFU1RfQ0hVTktFRF9ERUNIVU5LKTsKKyAgICBpZihPSyAhPSBuUmV0KQorICAgIHsKKyAgICAgICAgU2VuZEVycm9yTWVzc2FnZShyLCAiRmFpbGVkIHRvIHN0YXJ0IHJlY2VpdmluZyBQT1NUIGJ1ZmZlciIpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIG5SZXQgPSBhcF9zaG91bGRfY2xpZW50X2Jsb2NrKHIpOworICAgIGlmKDAgPT0gblJldCkKKyAgICB7CisgICAgICAgIFNlbmRFcnJvck1lc3NhZ2UociwgIk5vIGJvZHkgcmVjZWl2ZWQiKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGlmKE5VTEwgIT0gcHN6RXJyb3IpCisgICAgeworICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCAwLCByLT5zZXJ2ZXIsIHBzekVycm9yKTsKKyAgICAgICAgU2VuZEVycm9yTWVzc2FnZShyLCBwc3pFcnJvcik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgaWYoTlVMTCAhPSBwSW50Zi0+ZnNvYXBfaW5pdCkKKyAgICB7CisgICAgICAgICgqcEludGYtPmZzb2FwX2luaXQpIChwc29hcCwgcik7CisgICAgICAgIHBzb2FwLT5uYW1lc3BhY2VzID0gcEludGYtPm5hbWVzcGFjZXM7CisgICAgICAgIHNldF9jYWxsYmFja3MociwgcFJxQ29uZiwgcHNvYXApOworICAgICAgICBpZihOVUxMICE9IHBJbnRmLT5mc29hcF9zZXJ2ZSkKKyAgICAgICAgeworICAgICAgICAgICAgblJldCA9ICgqcEludGYtPmZzb2FwX3NlcnZlKSAocHNvYXAsIHIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgU2VuZEVycm9yTWVzc2FnZShyLCAibm8gc29hcF9zZXJ2ZSBlbnRyeSBwb2ludCIpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIGlmKE5VTEwgIT0gcEludGYtPmZzb2FwX2Rlc3Ryb3kpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnRmLT5mc29hcF9kZXN0cm95KHBzb2FwLCByKTsgLy8gbm90IGFuIGVycm9yIGluIDIuMS4xMCBhbnkgbW9yZS4KKyAgICAgICAgfQorICAgICAgICBpZihOVUxMICE9IHBJbnRmLT5mc29hcF9lbmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnRmLT5mc29hcF9lbmQocHNvYXAsIHIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgU2VuZEVycm9yTWVzc2FnZShyLCAibm8gc29hcF9lbmQgZW50cnkgcG9pbnQiKTsKKyAgICAgICAgfQorICAgICAgICBpZihOVUxMICE9IHBJbnRmLT5mc29hcF9kb25lKQorICAgICAgICB7CisgICAgICAgICAgICBwSW50Zi0+ZnNvYXBfZG9uZShwc29hcCwgcik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBTZW5kRXJyb3JNZXNzYWdlKHIsICJubyBzb2FwX2RvbmUgZW50cnkgcG9pbnQiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBTZW5kRXJyb3JNZXNzYWdlKHIsICJubyBzb2FwX2luaXQgZW50cnkgcG9pbnQiKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIC8qCisgICAgICogV2UgZGlkIHdoYXQgd2Ugd2FudGVkIHRvIGRvLCBzbyB0ZWxsIHRoZSByZXN0IG9mIHRoZSBzZXJ2ZXIgd2UKKyAgICAgKiBzdWNjZWVkZWQuIFdlIG5lZWQgbm90IGRlbGV0ZSBwc3pSZXNwb25zZSwgYmVjYXVzZSBpdCB3YXMgYWxsb2NhdGVkIGZyb20gdGhlIHJlcXVlc3QgcG9vbC4KKyAgICAgKi8KKyAgICByZXR1cm4gT0s7Cit9CisKKy8qCisgKiBOb3cgbGV0J3MgZGVjbGFyZSByb3V0aW5lcyBmb3IgZWFjaCBvZiB0aGUgY2FsbGJhY2sgcGhhc2UgaW4gb3JkZXIuICAgICAgCisgKiAoVGhhdCdzIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5J3JlIGxpc3RlZCBpbiB0aGUgY2FsbGJhY2sgbGlzdCwgKm5vdCAgICAgCisgKiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIHNlcnZlciBjYWxscyB0aGVtISAgU2VlIHRoZSBjb21tYW5kX3JlYyAgICAgICAgICAgCisgKiBkZWNsYXJhdGlvbikuICBOb3RlIHRoYXQgdGhlc2UgbWF5IGJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBjYWxsZWQgZm9yIHNpdHVhdGlvbnMgdGhhdCBkb24ndCByZWxhdGUgcHJpbWFyaWx5IHRvIG91ciBmdW5jdGlvbiAtIGluICAgCisgKiBvdGhlciB3b3JkcywgdGhlIGZpeHVwIGhhbmRsZXIgc2hvdWxkbid0IGFzc3VtZSB0aGF0IHRoZSByZXF1ZXN0IGhhcyAgICAgCisgKiB0byBkbyB3aXRoICJnc29hcCIgc3R1ZmYuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgCisgKiBXaXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIGNvbnRlbnQgaGFuZGxlciwgYWxsIG9mIG91ciByb3V0aW5lcyB3aWxsIGJlICAgCisgKiBjYWxsZWQgZm9yIGVhY2ggcmVxdWVzdCwgdW5sZXNzIGFuIGVhcmxpZXIgaGFuZGxlciBmcm9tIGFub3RoZXIgbW9kdWxlICAgCisgKiBhYm9ydGVkIHRoZSBzZXF1ZW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKgorICogSGFuZGxlcnMgdGhhdCBhcmUgZGVjbGFyZWQgYXMgImludCIgY2FuIHJldHVybiB0aGUgZm9sbG93aW5nOiAgICAgICAgICAgIAorICogT0sgICAgICAgICAgSGFuZGxlciBhY2NlcHRlZCB0aGUgcmVxdWVzdCBhbmQgZGlkIGl0cyB0aGluZyB3aXRoIGl0LiAgICAgCisgKiBERUNMSU5FRCAgICBIYW5kbGVyIHRvb2sgbm8gYWN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEhUVFBfbXVtYmxlIEhhbmRsZXIgbG9va2VkIGF0IHJlcXVlc3QgYW5kIGZvdW5kIGl0IHdhbnRpbmcuICAgICAgICAgICAgIAorIAorICogV2hhdCB0aGUgc2VydmVyIGRvZXMgYWZ0ZXIgY2FsbGluZyBhIG1vZHVsZSBoYW5kbGVyIGRlcGVuZHMgdXBvbiB0aGUgICAgIAorICogaGFuZGxlcidzIHJldHVybiB2YWx1ZS4gIEluIGFsbCBjYXNlcywgaWYgdGhlIGhhbmRsZXIgcmV0dXJucyAgICAgICAgICAgIAorICogREVDTElORUQsIHRoZSBzZXJ2ZXIgd2lsbCBjb250aW51ZSB0byB0aGUgbmV4dCBtb2R1bGUgd2l0aCBhbiBoYW5kbGVyICAgIAorICogZm9yIHRoZSBjdXJyZW50IHBoYXNlLiAgSG93ZXZlciwgaWYgdGhlIGhhbmRsZXIgcmV0dXJuIGEgbm9uLU9LLCAgICAgICAgIAorICogbm9uLURFQ0xJTkVEIHN0YXR1cywgdGhlIHNlcnZlciBhYm9ydHMgdGhlIHJlcXVlc3QgcmlnaHQgdGhlcmUuICBJZiAgICAgIAorICogdGhlIGhhbmRsZXIgcmV0dXJucyBPSywgdGhlIHNlcnZlcidzIG5leHQgYWN0aW9uIGlzIHBoYXNlLXNwZWNpZmljOyAgICAgIAorICogc2VlIHRoZSBpbmRpdmlkdWFsIGhhbmRsZXIgY29tbWVudHMgYmVsb3cgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgIAorICovCisKKy8qCisgKiAKKyAqICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZHVyaW5nIHNlcnZlciBpbml0aWFsaXNhdGlvbi4gIEFueSBpbmZvcm1hdGlvbgorICogKiB0aGF0IG5lZWRzIHRvIGJlIHJlY29yZGVkIG11c3QgYmUgaW4gc3RhdGljIGNlbGxzLCBzaW5jZSB0aGVyZSdzIG5vCisgKiAqIGNvbmZpZ3VyYXRpb24gcmVjb3JkLgorICogKgorICogKiBUaGVyZSBpcyBubyByZXR1cm4gdmFsdWUuCisgKi8KKworc3RhdGljIGludAorZ3NvYXBfaW5pdChhcHJfcG9vbF90ICogcCwgYXByX3Bvb2xfdCAqIHB0ZW1wLCBhcHJfcG9vbF90ICogcGxvZywKKyAgICAgICAgICAgc2VydmVyX3JlYyAqIHBzcmVjKQoreworICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19JTkZPLCAwLCBwc3JlYywgIm1vZF9nc29hcCBpbml0aWFsaXplZCIpOworICAgIHJldHVybiBPSzsKK30KKworCisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIHRvIGNyZWF0ZSBhIHBlci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbgorICogcmVjb3JkLiAgVGhpcyB3aWxsIGJlIGNhbGxlZCBmb3IgdGhlICJkZWZhdWx0IiBzZXJ2ZXIgZW52aXJvbm1lbnQsIGFuZCBmb3IKKyAqIGVhY2ggZGlyZWN0b3J5IGZvciB3aGljaCB0aGUgcGFyc2VyIGZpbmRzIGFueSBvZiBvdXIgZGlyZWN0aXZlcyBhcHBsaWNhYmxlLgorICogSWYgYSBkaXJlY3RvcnkgZG9lc24ndCBoYXZlIGFueSBvZiBvdXIgZGlyZWN0aXZlcyBpbnZvbHZlZCAoaS5lLiwgdGhleQorICogYXJlbid0IGluIHRoZSAuaHRhY2Nlc3MgZmlsZSwgb3IgYSA8TG9jYXRpb24+LCA8RGlyZWN0b3J5Piwgb3IgcmVsYXRlZAorICogYmxvY2spLCB0aGlzIHJvdXRpbmUgd2lsbCAqbm90KiBiZSBjYWxsZWQgLSB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhlCisgKiBjbG9zZXN0IGFuY2VzdG9yIGlzIHVzZWQuCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyBhIHBvaW50ZXIgdG8gdGhlIGNyZWF0ZWQgbW9kdWxlLXNwZWNpZmljCisgKiBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyB2b2lkICoKK2dzb2FwX2NyZWF0ZV9kaXJfY29uZmlnKGFwcl9wb29sX3QgKiBwLCBjaGFyICpkaXJzcGVjKQoreworICAgIGdzb2FwQ29uZmlndXJhdGlvbiAqcENvbmZpZyA9IGdzb2FwQ29uZmlndXJhdGlvbl9jcmVhdGUocCk7CisKKyAgICBwQ29uZmlnLT5tX1R5cGUgPSBjdF9kaXJlY3Rvcnk7CisgICAgcmV0dXJuIHBDb25maWc7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIHRvIG1lcmdlIHR3byBwZXItZGlyZWN0b3J5IGNvbmZpZ3VyYXRpb24KKyAqIHJlY29yZHMuICBUaGlzIGlzIHR5cGljYWxseSBkb25lIHRvIGNvcGUgd2l0aCB0aGluZ3MgbGlrZSAuaHRhY2Nlc3MgZmlsZXMKKyAqIG9yIDxMb2NhdGlvbj4gZGlyZWN0aXZlcyBmb3IgZGlyZWN0b3JpZXMgdGhhdCBhcmUgYmVuZWF0aCBvbmUgZm9yIHdoaWNoIGEKKyAqIGNvbmZpZ3VyYXRpb24gcmVjb3JkIHdhcyBhbHJlYWR5IGNyZWF0ZWQuICBUaGUgcm91dGluZSBoYXMgdGhlCisgKiByZXNwb25zaWJpbGl0eSBvZiBjcmVhdGluZyBhIG5ldyByZWNvcmQgYW5kIG1lcmdpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZQorICogb3RoZXIgdHdvIGludG8gaXQgYXBwcm9wcmlhdGVseS4gIElmIHRoZSBtb2R1bGUgZG9lc24ndCBkZWNsYXJlIGEgbWVyZ2UKKyAqIHJvdXRpbmUsIHRoZSByZWNvcmQgZm9yIHRoZSBjbG9zZXN0IGFuY2VzdG9yIGxvY2F0aW9uICh0aGF0IGhhcyBvbmUpIGlzCisgKiB1c2VkIGV4Y2x1c2l2ZWx5LgorICoKKyAqIFRoZSByb3V0aW5lIE1VU1QgTk9UIG1vZGlmeSBhbnkgb2YgaXRzIGFyZ3VtZW50cyEKKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgcG9pbnRlciB0byB0aGUgY3JlYXRlZCBtb2R1bGUtc3BlY2lmaWMgc3RydWN0dXJlCisgKiBjb250YWluaW5nIHRoZSBtZXJnZWQgdmFsdWVzLgorICovCitzdGF0aWMgdm9pZCAqCitnc29hcF9tZXJnZV9kaXJfY29uZmlnKGFwcl9wb29sX3QgKiBwLCB2b2lkICpwYXJlbnRfY29uZiwgdm9pZCAqbmV3bG9jX2NvbmYpCit7CisgICAgZ3NvYXBDb25maWd1cmF0aW9uICpwTWVyZ2VkQ29uZmlnID0gZ3NvYXBDb25maWd1cmF0aW9uX2NyZWF0ZShwKTsKKyAgICBnc29hcENvbmZpZ3VyYXRpb24gKnBQYXJlbnRDb25maWcgPSAoZ3NvYXBDb25maWd1cmF0aW9uICopIHBhcmVudF9jb25mOworICAgIGdzb2FwQ29uZmlndXJhdGlvbiAqcE5ld0NvbmZpZyA9IChnc29hcENvbmZpZ3VyYXRpb24gKikgbmV3bG9jX2NvbmY7CisKKyAgICBnc29hcENvbmZpZ3VyYXRpb25fbWVyZ2UocE1lcmdlZENvbmZpZywgcFBhcmVudENvbmZpZywgcE5ld0NvbmZpZyk7CisgICAgcmV0dXJuIHBNZXJnZWRDb25maWc7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIHRvIGNyZWF0ZSBhIHBlci1zZXJ2ZXIgY29uZmlndXJhdGlvbgorICogcmVjb3JkLiAgSXQgd2lsbCBhbHdheXMgYmUgY2FsbGVkIGZvciB0aGUgImRlZmF1bHQiIHNlcnZlci4KKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgcG9pbnRlciB0byB0aGUgY3JlYXRlZCBtb2R1bGUtc3BlY2lmaWMKKyAqIHN0cnVjdHVyZS4KKyAqLworc3RhdGljIHZvaWQgKgorZ3NvYXBfY3JlYXRlX3NlcnZlcl9jb25maWcoYXByX3Bvb2xfdCAqIHAsIHNlcnZlcl9yZWMgKiBzKQoreworICAgIGdzb2FwQ29uZmlndXJhdGlvbiAqcENvbmZpZyA9IGdzb2FwQ29uZmlndXJhdGlvbl9jcmVhdGUocCk7CisKKyAgICBwQ29uZmlnLT5tX1R5cGUgPSBjdF9zZXJ2ZXI7CisgICAgcmV0dXJuIHBDb25maWc7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIHRvIG1lcmdlIHR3byBwZXItc2VydmVyIGNvbmZpZ3VyYXRpb24KKyAqIHJlY29yZHMuICBUaGlzIGlzIHR5cGljYWxseSBkb25lIHRvIGNvcGUgd2l0aCB0aGluZ3MgbGlrZSB2aXJ0dWFsIGhvc3RzIGFuZAorICogdGhlIGRlZmF1bHQgc2VydmVyIGNvbmZpZ3VyYXRpb24uIFRoZSByb3V0aW5lIGhhcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YKKyAqIGNyZWF0aW5nIGEgbmV3IHJlY29yZCBhbmQgbWVyZ2luZyB0aGUgY29udGVudHMgb2YgdGhlIG90aGVyIHR3byBpbnRvIGl0CisgKiBhcHByb3ByaWF0ZWx5LiBJZiB0aGUgbW9kdWxlIGRvZXNuJ3QgZGVjbGFyZSBhIG1lcmdlIHJvdXRpbmUsIHRoZSBtb3JlCisgKiBzcGVjaWZpYyBleGlzdGluZyByZWNvcmQgaXMgdXNlZCBleGNsdXNpdmVseS4KKyAqCisgKiBUaGUgcm91dGluZSBNVVNUIE5PVCBtb2RpZnkgYW55IG9mIGl0cyBhcmd1bWVudHMhCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyBhIHBvaW50ZXIgdG8gdGhlIGNyZWF0ZWQgbW9kdWxlLXNwZWNpZmljIHN0cnVjdHVyZQorICogY29udGFpbmluZyB0aGUgbWVyZ2VkIHZhbHVlcy4KKyAqLworc3RhdGljIHZvaWQgKgorZ3NvYXBfbWVyZ2Vfc2VydmVyX2NvbmZpZyhhcHJfcG9vbF90ICogcCwgdm9pZCAqc2VydmVyMV9jb25mLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpzZXJ2ZXIyX2NvbmYpCit7CisgICAgZ3NvYXBDb25maWd1cmF0aW9uICpwTWVyZ2VkQ29uZmlnID0gZ3NvYXBDb25maWd1cmF0aW9uX2NyZWF0ZShwKTsKKyAgICBnc29hcENvbmZpZ3VyYXRpb24gKnBTZXJ2ZXIxQ29uZmlnID0gKGdzb2FwQ29uZmlndXJhdGlvbiAqKSBzZXJ2ZXIxX2NvbmY7CisgICAgZ3NvYXBDb25maWd1cmF0aW9uICpwU2VydmVyMkNvbmZpZyA9IChnc29hcENvbmZpZ3VyYXRpb24gKikgc2VydmVyMl9jb25mOworCisgICAgZ3NvYXBDb25maWd1cmF0aW9uX21lcmdlKHBNZXJnZWRDb25maWcsIHBTZXJ2ZXIxQ29uZmlnLCBwU2VydmVyMkNvbmZpZyk7CisgICAgcE1lcmdlZENvbmZpZy0+bV9UeXBlID0gY3Rfc2VydmVyOworICAgIHJldHVybiAodm9pZCAqKXBNZXJnZWRDb25maWc7Cit9CisKKworCisvKiogaGVscGVyIGZ1bmNpdG9uIGZvciBsaWJyYXJ5IGNvbW1hbmQgaGFuZGxlci4KKyAqIEBwYXJhbSBwc3pQYXRoIHRoZSBwYXRoIG9mIHRoZSBsaWJyYXJ5LgorICogQHBhcmFtIGJJc1NPQVBMaWJyYXJ5IHRydWUgaWYgaXQgaXMgYSBzaGFyZWQgbGlicmFyeSBjb250YWluaW5nIGEgU09BUCBzZXJ2ZXIuCisgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGxpYnJhcnkgd2FzIGFkZGVkLCBmYWxzZSBpZiBpdCB3YXMgYWxlYWR5IGluIHRoZSBjb2xsZWN0aW9uLgorICovCitzdGF0aWMgYm9vbAorQWRkU2hhcmVkTGlicmFyeShnc29hcENvbmZpZ3VyYXRpb24gKiBwQ29uZmlnLCBjb25zdCBjaGFyICpwc3pQYXRoLAorICAgICAgICAgICAgICAgICBjb25zdCBib29sIGJJc1NPQVBMaWJyYXJ5KQoreworICAgIGJvb2wgYkFkZGVkID0gZmFsc2U7CisgICAgYXByX3Bvb2xfdCAqcFBvb2wgPSBnc29hcENvbmZpZ3VyYXRpb25fZ2V0TW9kdWxlUG9vbCgpOworCisgICAgaWYoIVNvYXBTaGFyZWRMaWJyYXJpZXNfY29udGFpbnMocENvbmZpZy0+bV9wTGlicmFyaWVzLCBwc3pQYXRoKSkKKyAgICB7CisgICAgICAgIFNvYXBTaGFyZWRMaWJyYXJ5ICpwTGlicmFyeSA9IFNvYXBTaGFyZWRMaWJyYXJ5X2NyZWF0ZShwUG9vbCk7CisKKyAgICAgICAgU29hcFNoYXJlZExpYnJhcnlfaW5pdDIocExpYnJhcnksIHBQb29sLCBhcHJfcHN0cmR1cChwUG9vbCwgcHN6UGF0aCkpOworICAgICAgICBwTGlicmFyeS0+bV9iSXNTT0FQTGlicmFyeSA9IGJJc1NPQVBMaWJyYXJ5OworICAgICAgICBTb2FwU2hhcmVkTGlicmFyaWVzX2FkZExpYnJhcnkocENvbmZpZy0+bV9wTGlicmFyaWVzLCBwTGlicmFyeSk7CisgICAgICAgIGJBZGRlZCA9IHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGJBZGRlZDsKK30KK3N0YXRpYyBnc29hcENvbmZpZ3VyYXRpb24gKgorZ2V0Q29uZmlndXJhdGlvbihyZXF1ZXN0X3JlYyAqIHIpCit7CisgICAgcmV0dXJuIChnc29hcENvbmZpZ3VyYXRpb24gKikgYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdzb2FwX21vZHVsZSk7Cit9CitzdGF0aWMgZ3NvYXBSZXF1ZXN0Q29uZmlndXJhdGlvbiAqCitnZXRSZXF1ZXN0Q29uZmlndXJhdGlvbihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyAgICBnc29hcFJlcXVlc3RDb25maWd1cmF0aW9uICpwUnFDb25mID0KKyAgICAgICAgKGdzb2FwUmVxdWVzdENvbmZpZ3VyYXRpb24gKikgc29hcC0+ZnBsdWdpbihzb2FwLCBtb2RfZ3NvYXBfaWQpOworICAgIHJldHVybiBwUnFDb25mOworfQorCisKKy8qCisgKiBQYXRjaCBmcm9tIFJ5YW4gVHJvbGwKKyAqCisgKiBJbXBsbWVtZW50IHRoZXNlIGFzIHdlYWsgc3ltYm9scywgYWxsb3dpbmcgc3ltYm9sIGNoZWNraW5nIGR1cmluZworICogY29tcGlsYXRpb24gdG8gc3VjY2VlZCwgZXZlbiB3aGVuIGFub3RoZXIgb2JqZWN0IGlzIGFjdHVhbGx5CisgKiBwcm92aWRpbmcgdGhlc2Ugc3ltYm9scyBhdCBydW50aW1lLgorICovCitTT0FQX05NQUMgc3RydWN0IE5hbWVzcGFjZSBuYW1lc3BhY2VzW10gX19hdHRyaWJ1dGVfXyAoKHdlYWspKTsKK1NPQVBfTk1BQyBzdHJ1Y3QgTmFtZXNwYWNlIG5hbWVzcGFjZXNbXSA9IHsKKyAgICB7IlNPQVAtRU5WIiwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIiwKKyAgICAgImh0dHA6Ly93d3cudzMub3JnLyovc29hcC1lbnZlbG9wZSJ9LAorICAgIHsiU09BUC1FTkMiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLAorICAgICAiaHR0cDovL3d3dy53My5vcmcvKi9zb2FwLWVuY29kaW5nIn0sCisgICAgeyJ4c2kiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAorICAgICAiaHR0cDovL3d3dy53My5vcmcvKi9YTUxTY2hlbWEtaW5zdGFuY2UifSwKKyAgICB7InhzZCIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsCisgICAgICJodHRwOi8vd3d3LnczLm9yZy8qL1hNTFNjaGVtYSJ9LAorICAgIHtOVUxMLCBOVUxMfQorfTsKKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVoZWFkZXIoc3RydWN0IHNvYXAgKnNvYXApCisgICAgX19hdHRyaWJ1dGVfXyAoKHdlYWspKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0Citzb2FwX3NlcmlhbGl6ZWhlYWRlcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyAgICBnc29hcFJlcXVlc3RDb25maWd1cmF0aW9uICpwUnFDb25mID0gZ2V0UmVxdWVzdENvbmZpZ3VyYXRpb24oc29hcCk7CisKKyAgICBwUnFDb25mLT5wSW50Zi0+c29hcF9zZXJpYWxpemVoZWFkZXIoc29hcCk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRoZWFkZXIoc3RydWN0IHNvYXAgKnNvYXApCisgICAgX19hdHRyaWJ1dGVfXyAoKHdlYWspKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQKK3NvYXBfcHV0aGVhZGVyKHN0cnVjdCBzb2FwICpzb2FwKQoreworICAgIGdzb2FwUmVxdWVzdENvbmZpZ3VyYXRpb24gKnBScUNvbmYgPSBnZXRSZXF1ZXN0Q29uZmlndXJhdGlvbihzb2FwKTsKKworICAgIHJldHVybiBwUnFDb25mLT5wSW50Zi0+c29hcF9wdXRoZWFkZXIoc29hcCk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9nZXRoZWFkZXIoc3RydWN0IHNvYXAgKnNvYXApCisgICAgX19hdHRyaWJ1dGVfXyAoKHdlYWspKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQKK3NvYXBfZ2V0aGVhZGVyKHN0cnVjdCBzb2FwICpzb2FwKQoreworICAgIGdzb2FwUmVxdWVzdENvbmZpZ3VyYXRpb24gKnBScUNvbmYgPSBnZXRSZXF1ZXN0Q29uZmlndXJhdGlvbihzb2FwKTsKKworICAgIHJldHVybiBwUnFDb25mLT5wSW50Zi0+c29hcF9nZXRoZWFkZXIoc29hcCk7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXApIF9fYXR0cmlidXRlX18gKCh3ZWFrKSk7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNAorc29hcF9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyAgICBnc29hcFJlcXVlc3RDb25maWd1cmF0aW9uICpwUnFDb25mID0gZ2V0UmVxdWVzdENvbmZpZ3VyYXRpb24oc29hcCk7CisKKyAgICBwUnFDb25mLT5wSW50Zi0+c29hcF9mYXVsdChzb2FwKTsKK30KKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVmYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCkKKyAgICBfX2F0dHJpYnV0ZV9fICgod2VhaykpOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQKK3NvYXBfc2VyaWFsaXplZmF1bHQoc3RydWN0IHNvYXAgKnNvYXApCit7CisgICAgZ3NvYXBSZXF1ZXN0Q29uZmlndXJhdGlvbiAqcFJxQ29uZiA9IGdldFJlcXVlc3RDb25maWd1cmF0aW9uKHNvYXApOworCisgICAgcFJxQ29uZi0+cEludGYtPnNvYXBfc2VyaWFsaXplZmF1bHQoc29hcCk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRmYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCkKKyAgICBfX2F0dHJpYnV0ZV9fICgod2VhaykpOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNAorc29hcF9wdXRmYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyAgICBnc29hcFJlcXVlc3RDb25maWd1cmF0aW9uICpwUnFDb25mID0gZ2V0UmVxdWVzdENvbmZpZ3VyYXRpb24oc29hcCk7CisKKyAgICByZXR1cm4gcFJxQ29uZi0+cEludGYtPnNvYXBfcHV0ZmF1bHQoc29hcCk7Cit9CisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9nZXRmYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCkKKyAgICBfX2F0dHJpYnV0ZV9fICgod2VhaykpOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNAorc29hcF9nZXRmYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyAgICBnc29hcFJlcXVlc3RDb25maWd1cmF0aW9uICpwUnFDb25mID0gZ2V0UmVxdWVzdENvbmZpZ3VyYXRpb24oc29hcCk7CisKKyAgICByZXR1cm4gcFJxQ29uZi0+cEludGYtPnNvYXBfZ2V0ZmF1bHQoc29hcCk7Cit9CisKK1NPQVBfRk1BQzMgY29uc3QgY2hhciAqKlNPQVBfRk1BQzQgc29hcF9mYXVsdGNvZGUoc3RydWN0IHNvYXAgKnNvYXApCisgICAgX19hdHRyaWJ1dGVfXyAoKHdlYWspKTsKK1NPQVBfRk1BQzMgY29uc3QgY2hhciAqKlNPQVBfRk1BQzQKK3NvYXBfZmF1bHRjb2RlKHN0cnVjdCBzb2FwICpzb2FwKQoreworICAgIGdzb2FwUmVxdWVzdENvbmZpZ3VyYXRpb24gKnBScUNvbmYgPSBnZXRSZXF1ZXN0Q29uZmlndXJhdGlvbihzb2FwKTsKKworICAgIHJldHVybiBwUnFDb25mLT5wSW50Zi0+c29hcF9mYXVsdGNvZGUoc29hcCk7Cit9CisKK1NPQVBfRk1BQzMgY29uc3QgY2hhciAqKlNPQVBfRk1BQzQgc29hcF9mYXVsdHN0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCkKKyAgICBfX2F0dHJpYnV0ZV9fICgod2VhaykpOworU09BUF9GTUFDMyBjb25zdCBjaGFyICoqU09BUF9GTUFDNAorc29hcF9mYXVsdHN0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyAgICBnc29hcFJlcXVlc3RDb25maWd1cmF0aW9uICpwUnFDb25mID0gZ2V0UmVxdWVzdENvbmZpZ3VyYXRpb24oc29hcCk7CisKKyAgICByZXR1cm4gcFJxQ29uZi0+cEludGYtPnNvYXBfZmF1bHRzdHJpbmcoc29hcCk7Cit9CisKK1NPQVBfRk1BQzMgY29uc3QgY2hhciAqKlNPQVBfRk1BQzQgc29hcF9mYXVsdGRldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCkKKyAgICBfX2F0dHJpYnV0ZV9fICgod2VhaykpOworU09BUF9GTUFDMyBjb25zdCBjaGFyICoqU09BUF9GTUFDNAorc29hcF9mYXVsdGRldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyAgICBnc29hcFJlcXVlc3RDb25maWd1cmF0aW9uICpwUnFDb25mID0gZ2V0UmVxdWVzdENvbmZpZ3VyYXRpb24oc29hcCk7CisKKyAgICByZXR1cm4gcFJxQ29uZi0+cEludGYtPnNvYXBfZmF1bHRkZXRhaWwoc29hcCk7Cit9CisKKy8qCisgKiBQYXRjaCBmcm9tIFJ5YW4gVHJvbGwKKyAqCisgKiBUaGVzZSBtYXkgbmV2ZXIgYmUgdXNlZCB3aXRoaW4gYSBzZXJ2ZXIgY29udGV4dC4gIEhvd2V2ZXIsCisgKiBnc29hcC0yLjcuMGUgcmVxdWlyZXMgdGhlc2UgZnVuY3Rpb25zIHRvIGJlIGRlZmluZWQuICBUaHVzLAorICogd2UgbmVlZCB0byBkZWZpbmUgdGhlbSBoZXJlLgorICoKKyAqLworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9tYXJrZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGIpIF9fYXR0cmlidXRlX18gKCh3ZWFrKSk7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNAorc29hcF9tYXJrZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqYSwgaW50IGIpCit7CisgICAgZ3NvYXBSZXF1ZXN0Q29uZmlndXJhdGlvbiAqcFJxQ29uZiA9IGdldFJlcXVlc3RDb25maWd1cmF0aW9uKHNvYXApOworCisgICAgcmV0dXJuIHBScUNvbmYtPnBJbnRmLT5zb2FwX21hcmtlbGVtZW50KHNvYXAsIGEsIGIpOworfQorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0ZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmIsIGludCBjLCBpbnQgZCkKKyAgICBfX2F0dHJpYnV0ZV9fICgod2VhaykpOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNAorc29hcF9wdXRlbGVtZW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICphLCBjb25zdCBjaGFyICpiLCBpbnQgYywgaW50IGQpCit7CisgICAgZ3NvYXBSZXF1ZXN0Q29uZmlndXJhdGlvbiAqcFJxQ29uZiA9IGdldFJlcXVlc3RDb25maWd1cmF0aW9uKHNvYXApOworCisgICAgcmV0dXJuIHBScUNvbmYtPnBJbnRmLT5zb2FwX3B1dGVsZW1lbnQoc29hcCwgYSwgYiwgYywgZCk7Cit9CisKK1NPQVBfRk1BQzMgdm9pZCAqU09BUF9GTUFDNCBzb2FwX2dldGVsZW1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGludCAqYSkKKyAgICBfX2F0dHJpYnV0ZV9fICgod2VhaykpOworU09BUF9GTUFDMyB2b2lkICpTT0FQX0ZNQUM0Citzb2FwX2dldGVsZW1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGludCAqYSkKK3sKKyAgICBnc29hcFJlcXVlc3RDb25maWd1cmF0aW9uICpwUnFDb25mID0gZ2V0UmVxdWVzdENvbmZpZ3VyYXRpb24oc29hcCk7CisKKyAgICByZXR1cm4gcFJxQ29uZi0+cEludGYtPnNvYXBfZ2V0ZWxlbWVudChzb2FwLCBhKTsKK30KZGlmZiAtLWdpdCBhL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8yMC9tb2RfZ3NvYXAudmNwcm9qIGIvbW9kX2dzb2FwL21vZF9nc29hcC0wLjYvYXBhY2hlXzIwL21vZF9nc29hcC52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUwNWU4MwotLS0gL2Rldi9udWxsCisrKyBiL21vZF9nc29hcC9tb2RfZ3NvYXAtMC42L2FwYWNoZV8yMC9tb2RfZ3NvYXAudmNwcm9qCkBAIC0wLDAgKzEsMTE1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nID0gIldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI3LjAwIg0KKwlOYW1lPSJtb2RfZ3NvYXAiDQorCVByb2plY3RHVUlEPSJ7Qjk5MDQwNTYtQjJBMC00NDMzLUIzRDUtM0IxMDc2Mjc4NUU1fSINCisJS2V5d29yZD0iV2luMzJQcm9qIj4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIi8+DQorCTwvUGxhdGZvcm1zPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iRGVidWciDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJEZWJ1ZyINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCSANCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XSU5OVD0weDA1MDE7V0lOVkVSPTB4MDUwMTtfV0lOMzJfSUU9MHgwNjAzO1dJTjMyO19ERUJVRztfV0lORE9XUztTT0FQX0ZNQUMxPV9fZGVjbHNwZWMoZGxsZXhwb3J0KTtTT0FQX0NNQUM9X18oZGxsZXhwb3J0KTtXSVRIX05PTkFNRVNQQUNFUyINCisJCQkJIA0KKwkJCQkgDQorCQkJCSANCisJCQkJIA0KKwkJCQkgDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iZmFsc2UiDQorCQkJCSAvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJsaWJhcHIubGliIGxpYmh0dHBkLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iYzovYXBhY2hlMi9tb2R1bGVzLyQoUHJvamVjdE5hbWUpLnNvIg0KKwkJCQkgDQorCQkJCUFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM9IkM6XGFwYWNoZVxsaWIiDQorCQkJCU1vZHVsZURlZmluaXRpb25GaWxlPSIiDQorCQkJCQ0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIkKE91dERpcikvbW9kX2dzb2FwLnBkYiINCisJCQkJU3ViU3lzdGVtPSIyIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIi8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSJSZWxlYXNlIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iUmVsZWFzZSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCSANCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCU9taXRGcmFtZVBvaW50ZXJzPSJUUlVFIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dJTk5UPTB4MDUwMTtXSU5WRVI9MHgwNTAxO19XSU4zMl9JRT0weDA2MDM7V0lOMzI7TkRFQlVHO19XSU5ET1dTIg0KKwkJCQlTdHJpbmdQb29saW5nPSJUUlVFIg0KKwkJCQkgDQorCQkJCSANCisJCQkJIA0KKwkJCQkgDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iZmFsc2UiDQorCQkJCSAvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvbW9kX2dzb2FwLmV4ZSINCisJCQkJIA0KKwkJCQlNb2R1bGVEZWZpbml0aW9uRmlsZT0ibW9kX2dzb3AuZGVmIg0KKwkJCQkNCisJCQkJU3ViU3lzdGVtPSIyIg0KKwkJCQlPcHRpbWl6ZVJlZmVyZW5jZXM9IjIiDQorCQkJCUVuYWJsZUNPTURBVEZvbGRpbmc9IjIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPEZpbGVzPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9ImFwYWNoZV9nc29hcC5oIj4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSJtb2RfZ3NvYXAuYyI+DQorCQk8L0ZpbGU+DQorCTwvRmlsZXM+DQorCTxHbG9iYWxzPg0KKwk8L0dsb2JhbHM+DQorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3BsdWdpbi9SRUFETUUudHh0IGIvcGx1Z2luL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY3YjFmOQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbi9SRUFETUUudHh0CkBAIC0wLDAgKzEsMTYgQEAKK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHBsdWdpbnMgZm9yIGV4dGVuZGluZyB0aGUgZ1NPQVAgZW5naW5lJ3MgY2FwYWJpbGl0aWVzLgorCitodHRwZGEuKglIVFRQIERpZ2VzdCBBdXRoZW50aWNhdGlvbgoraHR0cGdldC4qCUhUVFAgR0VUIG1ldGhvZCBzdXBwb3J0CitodHRwZm9ybS4qCUhUVFAgUE9TVCBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQgc3VwcG9ydAoraHR0cHBvc3QuKglIVFRQIFBPU1QgbWV0aG9kIHN1cHBvcnQgZm9yIGV4YW1wbGUgbm9uLVNPQVAgcmVxdWVzdHMKK2h0dHBtZDUuKglIVFRQIE1ENSBjaGVja3N1bXMKK2xvZ2dpbmcuKglNZXNzYWdlIGxvZ2dpbmcgKHNlbGVjdGl2ZSBpbmJvdW5kL291dGJvdW5kKQorcGx1Z2luLioJRXhhbXBsZSBwbHVnaW4gZm9yIGFzcGlyaW5nIHBsdWdpbiBkZXZlbG9wZXJzCit3c3NlYXBpLioJV1MtU2VjdXJpdHkgKHdzc2UpIHBsdWdpbgorCitTdXBwb3J0aW5nIG1vZHVsZXM6CisKK3NtZGV2cC4qCUVWUC1iYXNlZCAoc2lnbmVkKSBtZXNzYWdlIGRpZ2VzdCBlbmdpbmUKK21kNWV2cC4qCU1ENSBFVlAgaW50ZXJmYWNlIGZvciBodHRwZGEgYW5kIGh0dHBtZDUKK3RocmVhZHMuKglUaHJlYWRzLCBtdXRleCwgYW5kIGNvbmRpdGlvbiB2YXJpYWJsZXMKZGlmZiAtLWdpdCBhL3BsdWdpbi9odHRwZGEuYyBiL3BsdWdpbi9odHRwZGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTI4OTFjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2luL2h0dHBkYS5jCkBAIC0wLDAgKzEsNzQzIEBACisvKgorCitodHRwZGEuYworCitnU09BUCBIVFRQIERpZ2VzdCBBdXRoZW50aWNhdGlvbiBwbHVnaW4uCitTdXBwb3J0cyBib3RoIEJhc2ljIGFuZCBEaWdlc3QgYXV0aGVudGljYXRpb24uCisKK1VzYWdlIChjbGllbnQgc2lkZSwgc2VlIGh0dHBkYXRlc3QuaC8uYyBmb3IgZXhhbXBsZSk6Citzb2FwX3JlZ2lzdGVyX3BsdWdpbigmc29hcCwgaHR0cF9kYSk7CitpZiAoc29hcF9jYWxsX25zX19tZXRob2QoJnNvYXAsIC4uLikgIT0gU09BUF9PSykKK3sgaWYgKHNvYXAuZXJyb3IgPT0gNDAxKSAvLyBIVFRQIGF1dGhlbnRpY2F0aW9uIGlzIHJlcXVpcmVkCisgIHsgaWYgKCFzdHJjbXAoc29hcC5hdXRocmVhbG0sIGF1dGhyZWFsbSkpIC8vIGNoZWNrIGF1dGhlbnRpY2F0aW9uIHJlYWxtCisgICAgeyBzdHJ1Y3QgaHR0cF9kYV9pbmZvIGluZm87IC8vIHRvIHN0b3JlIHVzZXJpZCBhbmQgcGFzc3dkCisgICAgICBodHRwX2RhX3NhdmUoJnNvYXAsICZpbmZvLCBhdXRocmVhbG0sIHVzZXJpZCwgcGFzc3dkKTsKKyAgICAgIGlmIChzb2FwX2NhbGxfbnNfX21ldGhvZCgmc29hcCwgLi4uKSA9PSBTT0FQX09LKQorICAgICAgeyAuLi4KKyAgICAgICAgc29hcF9lbmQoJnNvYXApOworCS4uLiAvLyB1c2VyaWQgYW5kIHBhc3N3ZCB3ZXJlIGRlYWxsb2NhdGVkCisgICAgICAgIGh0dHBfZGFfcmVzdG9yZSgmc29hcCwgJmluZm8pOyAvLyBnZXQgdXNlcmlkIGFuZCBwYXNzd2QgYWZ0ZXIgc29hcF9lbmQoKQorICAgICAgICBpZiAoIXNvYXBfY2FsbF9uc19fbWV0aG9kKCZzb2FwLCAuLi4pID09IFNPQVBfT0spCisJICAuLi4KKyAgICAgICAgaHR0cF9kYV9yZWxlYXNlKCZzb2FwLCAmaW5mbyk7IC8vIHJlbW92ZSB1c2VyaWQgYW5kIHBhc3N3ZAorCitVc2FnZSAoc2VydmVyIHNpZGUsIHNlZSBodHRwZGF0ZXN0LmgvLmMgZm9yIGV4YW1wbGUpOgorc29hcF9yZWdpc3Rlcl9wbHVnaW4oJnNvYXAsIGh0dHBfZGEpOworLi4uCitzb2FwX3NlcnZlKCZzb2FwKTsKKy4uLgoraW50IG5zX19tZXRob2Qoc3RydWN0IHNvYXAgKnNvYXAsIC4uLikKK3sgaWYgKHNvYXAtPnVzZXJpZCAmJiBzb2FwLT5wYXNzd2QpIC8vIEJhc2ljIGF1dGhlbnRpY2F0aW9uCisgIHsgaWYgKCFzdHJjbXAoc29hcC0+dXNlcmlkLCB1c2VyaWQpICYmICFzdHJjbXAoc29hcC0+cGFzc3dkLCBwYXNzd2QpKQorICAgIHsgLi4uIC8vIGNhbiBhbHNvIGNoZWNrIHNvYXAtPmF1dGhyZWFsbSAKKyAgICAgIHJldHVybiBTT0FQX09LOworICAgIH0KKyAgfQorICBlbHNlIGlmIChzb2FwLT5hdXRocmVhbG0gJiYgc29hcC0+dXNlcmlkKSAvLyBEaWdlc3QgYXV0aGVudGljYXRpb24KKyAgeyBwYXNzd2QgPSAuLi4gLy8gZGF0YWJhc2UgbG9va3VwIG9uIHVzZXJpZCBhbmQgYXV0aHJlYWxtIHRvIGZpbmQgcGFzc3dkCisgICAgaWYgKCFzdHJjbXAoc29hcC0+YXV0aHJlYWxtLCBhdXRocmVhbG0pICYmICFzdHJjbXAoc29hcC0+dXNlcmlkLCB1c2VyaWQpKQorICAgIHsgaWYgKCFodHRwX2RhX3ZlcmlmeV9wb3N0KHNvYXAsIHBhc3N3ZCkpIC8vIEhUVFAgUE9TVCBEQSB2ZXJpZmljYXRpb24KKyAgICAgIHsgLi4uCisgICAgICAgIHJldHVybiBTT0FQX09LOworICAgICAgfQorICAgIH0KKyAgfQorICBzb2FwLT5hdXRocmVhbG0gPSBhdXRocmVhbG07IC8vIHJlYWxtIHRvIHNlbmQgdG8gY2xpZW50CisgIHJldHVybiA0MDE7IC8vIE5vdCBhdXRob3JpemVkLCBjaGFsbGVuZ2Ugd2l0aCBkaWdlc3QgYXV0aGVudGljYXRpb24KK30KKworQ29tcGlsZSB3aXRoIC1EV0lUSF9PUEVOU1NMCitMaW5rIHdpdGggT3BlblNTTCAoZm9yIG1kNWV2cC5jKSwgaHR0cGRhLmMsIG1kNWV2cC5jLCBhbmQgdGhyZWFkcy5jCisKK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgcGFydCBvZiB0aGUgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXM6CitHUEwsIHRoZSBnU09BUCBwdWJsaWMgbGljZW5zZSwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIHB1YmxpYyBsaWNlbnNlLgorCitUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBnU09BUCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMworKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCitMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK2h0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9zb2FwbGljZW5zZS5odG1sCitTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAorV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCitmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLgorQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSwgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaW5jbHVkZSAiaHR0cGRhLmgiCisKK2NvbnN0IGNoYXIgaHR0cF9kYV9pZFsxMl0gPSBIVFRQX0RBX0lEOworCisvKiBzZXNzaW9uIGRhdGFiYXNlIGFuZCBsb2NrICovCitzdGF0aWMgc3RydWN0IGh0dHBfZGFfc2Vzc2lvbiAqaHR0cF9kYV9zZXNzaW9uID0gTlVMTDsKK3N0YXRpYyBNVVRFWF9UWVBFIGh0dHBfZGFfc2Vzc2lvbl9sb2NrOworCisjZGVmaW5lIEhUVFBfREFfTk9OQ0VMRU4gMjEKKyNkZWZpbmUgSFRUUF9EQV9PUEFRVUVMRU4gOQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqCUZvcndhcmQgZGVjbHMKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IGh0dHBfZGFfaW5pdChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IGh0dHBfZGFfZGF0YSAqZGF0YSk7CitzdGF0aWMgaW50IGh0dHBfZGFfY29weShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGx1Z2luICpkc3QsIHN0cnVjdCBzb2FwX3BsdWdpbiAqc3JjKTsKK3N0YXRpYyB2b2lkIGh0dHBfZGFfZGVsZXRlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnApOworCitzdGF0aWMgaW50IGh0dHBfZGFfcG9zdF9oZWFkZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsKTsKK3N0YXRpYyBpbnQgaHR0cF9kYV9wYXJzZV9oZWFkZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsKTsKK3N0YXRpYyBpbnQgaHR0cF9kYV9wcmVwYXJlaW5pdChzdHJ1Y3Qgc29hcCAqc29hcCk7CitzdGF0aWMgaW50IGh0dHBfZGFfcHJlcGFyZXNlbmQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7CitzdGF0aWMgaW50IGh0dHBfZGFfcHJlcGFyZXJlY3Yoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7CitzdGF0aWMgaW50IGh0dHBfZGFfZGlzY29ubmVjdChzdHJ1Y3Qgc29hcCAqc29hcCk7CisKK3N0YXRpYyBpbnQgaHR0cF9kYV92ZXJpZnlfbWV0aG9kKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICptZXRob2QsIGNoYXIgKnBhc3N3ZCk7CitzdGF0aWMgdm9pZCBodHRwX2RhX3Nlc3Npb25fc3RhcnQoY29uc3QgY2hhciAqcmVhbG0sIGNvbnN0IGNoYXIgKm5vbmNlLCBjb25zdCBjaGFyICpvcGFxdWUpOworc3RhdGljIGludCBodHRwX2RhX3Nlc3Npb25fdXBkYXRlKGNvbnN0IGNoYXIgKnJlYWxtLCBjb25zdCBjaGFyICpub25jZSwgY29uc3QgY2hhciAqb3BhcXVlLCBjb25zdCBjaGFyICpjbm9uY2UsIGNvbnN0IGNoYXIgKm5jb3VudCk7CitzdGF0aWMgdm9pZCBodHRwX2RhX3Nlc3Npb25fY2xlYW51cCgpOworCit2b2lkIGh0dHBfZGFfY2FsY19ub25jZShzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciBub25jZVtIVFRQX0RBX05PTkNFTEVOXSk7Cit2b2lkIGh0dHBfZGFfY2FsY19vcGFxdWUoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgb3BhcXVlW0hUVFBfREFfT1BBUVVFTEVOXSk7CitzdGF0aWMgdm9pZCBodHRwX2RhX2NhbGNfSEExKHN0cnVjdCBzb2FwICpzb2FwLCB2b2lkICoqY29udGV4dCwgY2hhciAqYWxnLCBjaGFyICp1c2VyaWQsIGNoYXIgKnJlYWxtLCBjaGFyICpwYXNzd2QsIGNoYXIgKm5vbmNlLCBjaGFyICpjbm9uY2UsIGNoYXIgSEExaGV4WzMzXSk7CitzdGF0aWMgdm9pZCBodHRwX2RhX2NhbGNfcmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIHZvaWQgKipjb250ZXh0LCBjaGFyIEhBMWhleFszM10sIGNoYXIgKm5vbmNlLCBjaGFyICpuY291bnQsIGNoYXIgKmNub25jZSwgY2hhciAqcW9wLCBjaGFyICptZXRob2QsIGNoYXIgKnVyaSwgY2hhciBlbnRpdHlIQWhleFszM10sIGNoYXIgcmVzcG9uc2VbMzNdKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglQbHVnaW4gcmVnaXN0cnkKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgaHR0cF9kYShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGx1Z2luICpwLCB2b2lkICphcmcpCit7CisgIHAtPmlkID0gaHR0cF9kYV9pZDsKKyAgcC0+ZGF0YSA9ICh2b2lkKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IGh0dHBfZGFfZGF0YSkpOworICBwLT5mY29weSA9IGh0dHBfZGFfY29weTsKKyAgcC0+ZmRlbGV0ZSA9IGh0dHBfZGFfZGVsZXRlOworICBpZiAocC0+ZGF0YSkKKyAgeworICAgIGlmIChodHRwX2RhX2luaXQoc29hcCwgKHN0cnVjdCBodHRwX2RhX2RhdGEqKXAtPmRhdGEpKQorICAgIHsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5kYXRhKTsKKyAgICAgIHJldHVybiBTT0FQX0VPTTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK3N0YXRpYyBpbnQgaHR0cF9kYV9pbml0KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgaHR0cF9kYV9kYXRhICpkYXRhKQoreworICBkYXRhLT5mcG9zdGhkciA9IHNvYXAtPmZwb3N0aGRyOworICBzb2FwLT5mcG9zdGhkciA9IGh0dHBfZGFfcG9zdF9oZWFkZXI7CisgIGRhdGEtPmZwYXJzZWhkciA9IHNvYXAtPmZwYXJzZWhkcjsKKyAgc29hcC0+ZnBhcnNlaGRyID0gaHR0cF9kYV9wYXJzZV9oZWFkZXI7CisgIGRhdGEtPmZwcmVwYXJlaW5pdCA9IHNvYXAtPmZwcmVwYXJlaW5pdDsKKyAgc29hcC0+ZnByZXBhcmVpbml0ID0gaHR0cF9kYV9wcmVwYXJlaW5pdDsKKyAgZGF0YS0+Y29udGV4dCA9IE5VTEw7CisgIG1lbXNldChkYXRhLT5kaWdlc3QsIDAsIHNpemVvZihkYXRhLT5kaWdlc3QpKTsKKworICByZXR1cm4gU09BUF9PSzsKK30KKworc3RhdGljIGludCBodHRwX2RhX2NvcHkoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3BsdWdpbiAqZHN0LCBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnNyYykKK3sKKyAgKmRzdCA9ICpzcmM7CisgIGRzdC0+ZGF0YSA9ICh2b2lkKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IGh0dHBfZGFfZGF0YSkpOworICBtZW1jcHkoZHN0LT5kYXRhLCBzcmMtPmRhdGEsIHNpemVvZihzdHJ1Y3QgaHR0cF9kYV9kYXRhKSk7CisgICgoc3RydWN0IGh0dHBfZGFfZGF0YSopZHN0LT5kYXRhKS0+Y29udGV4dCA9IE5VTEw7CisgIG1lbXNldCgoKHN0cnVjdCBodHRwX2RhX2RhdGEqKWRzdC0+ZGF0YSktPmRpZ2VzdCwgMCwgc2l6ZW9mKCgoc3RydWN0IGh0dHBfZGFfZGF0YSopZHN0LT5kYXRhKS0+ZGlnZXN0KSk7CisgICgoc3RydWN0IGh0dHBfZGFfZGF0YSopZHN0LT5kYXRhKS0+bm9uY2UgPSBOVUxMOworICAoKHN0cnVjdCBodHRwX2RhX2RhdGEqKWRzdC0+ZGF0YSktPm9wYXF1ZSA9IE5VTEw7CisgICgoc3RydWN0IGh0dHBfZGFfZGF0YSopZHN0LT5kYXRhKS0+cW9wID0gTlVMTDsKKyAgKChzdHJ1Y3QgaHR0cF9kYV9kYXRhKilkc3QtPmRhdGEpLT5hbGcgPSBOVUxMOworICAoKHN0cnVjdCBodHRwX2RhX2RhdGEqKWRzdC0+ZGF0YSktPm5jID0gMDsKKyAgKChzdHJ1Y3QgaHR0cF9kYV9kYXRhKilkc3QtPmRhdGEpLT5uY291bnQgPSBOVUxMOworICAoKHN0cnVjdCBodHRwX2RhX2RhdGEqKWRzdC0+ZGF0YSktPmNub25jZSA9IE5VTEw7CisgICgoc3RydWN0IGh0dHBfZGFfZGF0YSopZHN0LT5kYXRhKS0+cmVzcG9uc2UgPSBOVUxMOworICByZXR1cm4gU09BUF9PSzsKK30KKworc3RhdGljIHZvaWQgaHR0cF9kYV9kZWxldGUoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3BsdWdpbiAqcCkKK3sKKyAgc3RydWN0IGh0dHBfZGFfZGF0YSAqZGF0YSA9IChzdHJ1Y3QgaHR0cF9kYV9kYXRhKilzb2FwX2xvb2t1cF9wbHVnaW4oc29hcCwgaHR0cF9kYV9pZCk7CisgIGlmIChkYXRhKQorICB7CisgICAgaWYgKGRhdGEtPmNvbnRleHQpCisgICAgICBtZDVfaGFuZGxlcihzb2FwLCAmZGF0YS0+Y29udGV4dCwgTUQ1X0RFTEVURSwgTlVMTCwgMCk7CisgICAgU09BUF9GUkVFKHNvYXAsIGRhdGEpOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJQ2FsbGJhY2tzCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBodHRwX2RhX3Bvc3RfaGVhZGVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbCkKK3sKKyAgc3RydWN0IGh0dHBfZGFfZGF0YSAqZGF0YSA9IChzdHJ1Y3QgaHR0cF9kYV9kYXRhKilzb2FwX2xvb2t1cF9wbHVnaW4oc29hcCwgaHR0cF9kYV9pZCk7CisKKyAgaWYgKCFkYXRhKQorICAgIHJldHVybiBTT0FQX1BMVUdJTl9FUlJPUjsKKworICAvKiBjbGllbnQncyBIVFRQIEF1dGhvcml6YXRpb24gcmVzcG9uc2UgKi8KKyAgaWYgKGtleSAmJiAhc3RyY21wKGtleSwgIkF1dGhvcml6YXRpb24iKSkKKyAgeworICAgIGNoYXIgSEExWzMzXSwgZW50aXR5SEFoZXhbMzNdLCByZXNwb25zZVszM107CisgICAgY2hhciBjbm9uY2VbSFRUUF9EQV9OT05DRUxFTl07CisgICAgY2hhciBuY291bnRbOV07CisgICAgY2hhciAqcW9wLCAqbWV0aG9kOworCisgICAgbWQ1X2hhbmRsZXIoc29hcCwgJmRhdGEtPmNvbnRleHQsIE1ENV9GSU5BTCwgZGF0YS0+ZGlnZXN0LCAwKTsKKworICAgIGh0dHBfZGFfY2FsY19ub25jZShzb2FwLCBjbm9uY2UpOworICAgIGh0dHBfZGFfY2FsY19IQTEoc29hcCwgJmRhdGEtPmNvbnRleHQsIGRhdGEtPmFsZywgc29hcC0+dXNlcmlkLCBzb2FwLT5hdXRocmVhbG0sIHNvYXAtPnBhc3N3ZCwgZGF0YS0+bm9uY2UsIGNub25jZSwgSEExKTsKKworICAgIGlmIChkYXRhLT5xb3AgJiYgIXNvYXBfdGFnX2NtcChkYXRhLT5xb3AsICIqYXV0aC1pbnQqIikpCisgICAgeworICAgICAgcW9wID0gImF1dGgtaW50IjsKKyAgICAgIHNvYXBfczJoZXgoc29hcCwgZGF0YS0+ZGlnZXN0LCBlbnRpdHlIQWhleCwgMTYpOworICAgIH0KKyAgICBlbHNlIGlmIChkYXRhLT5xb3ApCisgICAgICBxb3AgPSAiYXV0aCI7CisgICAgZWxzZQorICAgICAgcW9wID0gTlVMTDsKKworICAgIGlmIChzb2FwLT5zdGF0dXMgPT0gU09BUF9HRVQpCisgICAgICBtZXRob2QgPSAiR0VUIjsKKyAgICBlbHNlCisgICAgICBtZXRob2QgPSAiUE9TVCI7CisKKyAgICBzcHJpbnRmKG5jb3VudCwgIiU4LjhseCIsIGRhdGEtPm5jKyspOworCisgICAgaHR0cF9kYV9jYWxjX3Jlc3BvbnNlKHNvYXAsICZkYXRhLT5jb250ZXh0LCBIQTEsIGRhdGEtPm5vbmNlLCBuY291bnQsIGNub25jZSwgcW9wLCBtZXRob2QsIHNvYXAtPnBhdGgsIGVudGl0eUhBaGV4LCByZXNwb25zZSk7CisKKyAgICBpZiAocW9wKQorICAgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICJEaWdlc3QgcmVhbG09XCIlc1wiLCB1c2VybmFtZT1cIiVzXCIsIG5vbmNlPVwiJXNcIiwgdXJpPVwiJXNcIiwgcW9wPVwiJXNcIiwgbmM9JXMsIGNub25jZT1cIiVzXCIsIHJlc3BvbnNlPVwiJXNcIiwgb3BhcXVlPVwiJXNcIiIsIHNvYXAtPmF1dGhyZWFsbSwgc29hcC0+dXNlcmlkLCBkYXRhLT5ub25jZSwgc29hcC0+cGF0aCwgcW9wLCBuY291bnQsIGNub25jZSwgcmVzcG9uc2UsIGRhdGEtPm9wYXF1ZSk7CisgICAgZWxzZQorICAgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICJEaWdlc3QgcmVhbG09XCIlc1wiLCB1c2VybmFtZT1cIiVzXCIsIG5vbmNlPVwiJXNcIiwgdXJpPVwiJXNcIiwgcmVzcG9uc2U9XCIlc1wiLCBvcGFxdWU9XCIlc1wiIiwgc29hcC0+YXV0aHJlYWxtLCBzb2FwLT51c2VyaWQsIGRhdGEtPm5vbmNlLCBzb2FwLT5wYXRoLCByZXNwb25zZSwgZGF0YS0+b3BhcXVlKTsKKworICAgIHJldHVybiBkYXRhLT5mcG9zdGhkcihzb2FwLCBrZXksIHNvYXAtPnRtcGJ1Zik7CisgIH0KKworICAvKiBzZXJ2ZXIncyBIVFRQIEF1dGhvcml6YXRpb24gcmVzcG9uc2UgKi8KKyAgaWYgKGtleSAmJiAhc3RyY21wKGtleSwgIldXVy1BdXRoZW50aWNhdGUiKSkKKyAgeworICAgIGNoYXIgbm9uY2VbSFRUUF9EQV9OT05DRUxFTl07CisgICAgY2hhciBvcGFxdWVbSFRUUF9EQV9PUEFRVUVMRU5dOworCisgICAgaHR0cF9kYV9jYWxjX25vbmNlKHNvYXAsIG5vbmNlKTsKKyAgICBodHRwX2RhX2NhbGNfb3BhcXVlKHNvYXAsIG9wYXF1ZSk7CisKKyAgICBodHRwX2RhX3Nlc3Npb25fc3RhcnQoc29hcC0+YXV0aHJlYWxtLCBub25jZSwgb3BhcXVlKTsKKworICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiRGlnZXN0IHJlYWxtPVwiJXNcIiwgcW9wPVwiYXV0aCxhdXRoLWludFwiLCBub25jZT1cIiVzXCIsIG9wYXF1ZT1cIiVzXCIiLCBzb2FwLT5hdXRocmVhbG0sIG5vbmNlLCBvcGFxdWUpOworCisgICAgcmV0dXJuIGRhdGEtPmZwb3N0aGRyKHNvYXAsIGtleSwgc29hcC0+dG1wYnVmKTsKKyAgfQorCisgIHJldHVybiBkYXRhLT5mcG9zdGhkcihzb2FwLCBrZXksIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgaHR0cF9kYV9wYXJzZV9oZWFkZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsKQoreworICBzdHJ1Y3QgaHR0cF9kYV9kYXRhICpkYXRhID0gKHN0cnVjdCBodHRwX2RhX2RhdGEqKXNvYXBfbG9va3VwX3BsdWdpbihzb2FwLCBodHRwX2RhX2lkKTsKKworICBpZiAoIWRhdGEpCisgICAgcmV0dXJuIFNPQVBfUExVR0lOX0VSUk9SOworCisgIC8qIGNoZWNrIGlmIHNlcnZlciByZWNlaXZlZCBBdXRob3JpemF0aW9uIERpZ2VzdCBIVFRQIGhlYWRlciBmcm9tIGNsaWVudCAqLworICBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJBdXRob3JpemF0aW9uIikgJiYgIXNvYXBfdGFnX2NtcCh2YWwsICJEaWdlc3QgKiIpKQorICB7CisgICAgc29hcC0+YXV0aHJlYWxtID0gc29hcF9zdHJkdXAoc29hcCwgc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwgKyA3LCAicmVhbG0iKSk7CisgICAgc29hcC0+dXNlcmlkID0gc29hcF9zdHJkdXAoc29hcCwgc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwgKyA3LCAidXNlcm5hbWUiKSk7CisgICAgc29hcC0+cGFzc3dkID0gTlVMTDsKKyAgICBkYXRhLT5ub25jZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsICsgNywgIm5vbmNlIikpOworICAgIGRhdGEtPm9wYXF1ZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsICsgNywgIm9wYXF1ZSIpKTsKKyAgICBkYXRhLT5xb3AgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCArIDcsICJxb3AiKSk7CisgICAgZGF0YS0+YWxnID0gTlVMTDsKKyAgICBkYXRhLT5uY291bnQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCArIDcsICJuYyIpKTsKKyAgICBkYXRhLT5jbm9uY2UgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCArIDcsICJjbm9uY2UiKSk7CisgICAgZGF0YS0+cmVzcG9uc2UgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCArIDcsICJyZXNwb25zZSIpKTsKKyAgICBpZiAoZGF0YS0+cW9wICYmICFzb2FwX3RhZ19jbXAoZGF0YS0+cW9wLCAiYXV0aC1pbnQiKSkKKyAgICB7CisgICAgICBpZiAoc29hcC0+ZnByZXBhcmVyZWN2ICE9IGh0dHBfZGFfcHJlcGFyZXJlY3YpCisgICAgICB7CisgICAgICAgIGRhdGEtPmZwcmVwYXJlcmVjdiA9IHNvYXAtPmZwcmVwYXJlcmVjdjsKKyAgICAgICAgc29hcC0+ZnByZXBhcmVyZWN2ID0gaHR0cF9kYV9wcmVwYXJlcmVjdjsKKyAgICAgIH0KKyAgICAgIGlmIChzb2FwLT5mZGlzY29ubmVjdCAhPSBodHRwX2RhX2Rpc2Nvbm5lY3QpCisgICAgICB7CisgICAgICAgIGRhdGEtPmZkaXNjb25uZWN0ID0gc29hcC0+ZmRpc2Nvbm5lY3Q7CisgICAgICAgIHNvYXAtPmZkaXNjb25uZWN0ID0gaHR0cF9kYV9kaXNjb25uZWN0OworICAgICAgfQorICAgICAgbWQ1X2hhbmRsZXIoc29hcCwgJmRhdGEtPmNvbnRleHQsIE1ENV9JTklULCBOVUxMLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKworICAvKiBjaGVjayBpZiBjbGllbnQgcmVjZWl2ZWQgV1dXLUF1dGhlbnRpY2F0ZSBEaWdlc3QgSFRUUCBoZWFkZXIgZnJvbSBzZXJ2ZXIgKi8KKyAgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiV1dXLUF1dGhlbnRpY2F0ZSIpICYmICFzb2FwX3RhZ19jbXAodmFsLCAiRGlnZXN0ICoiKSkKKyAgeworICAgIHNvYXAtPmF1dGhyZWFsbSA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsICsgNywgInJlYWxtIikpOworICAgIGRhdGEtPm5vbmNlID0gc29hcF9zdHJkdXAoc29hcCwgc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwgKyA3LCAibm9uY2UiKSk7CisgICAgZGF0YS0+b3BhcXVlID0gc29hcF9zdHJkdXAoc29hcCwgc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwgKyA3LCAib3BhcXVlIikpOworICAgIGRhdGEtPnFvcCA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsICsgNywgInFvcCIpKTsKKyAgICBkYXRhLT5hbGcgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCArIDcsICJhbGdvcml0aG0iKSk7CisgICAgZGF0YS0+bmMgPSAxOworICAgIGRhdGEtPm5jb3VudCA9IE5VTEw7CisgICAgZGF0YS0+Y25vbmNlID0gTlVMTDsKKyAgICBkYXRhLT5yZXNwb25zZSA9IE5VTEw7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKworICByZXR1cm4gZGF0YS0+ZnBhcnNlaGRyKHNvYXAsIGtleSwgdmFsKTsKK30KKworc3RhdGljIGludCBodHRwX2RhX3ByZXBhcmVpbml0KHN0cnVjdCBzb2FwICpzb2FwKQoreworICBzdHJ1Y3QgaHR0cF9kYV9kYXRhICpkYXRhID0gKHN0cnVjdCBodHRwX2RhX2RhdGEqKXNvYXBfbG9va3VwX3BsdWdpbihzb2FwLCBodHRwX2RhX2lkKTsKKworICBpZiAoIWRhdGEpCisgICAgcmV0dXJuIFNPQVBfUExVR0lOX0VSUk9SOworCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pICE9IFNPQVBfSU9fU1RPUkUgJiYgKHNvYXAtPm1vZGUgJiAoU09BUF9FTkNfRElNRSB8IFNPQVBfRU5DX01JTUUpKSkKKyAgeyAvKiBUT0RPOiBoYW5kbGUgYXR0YWNobWVudHMgYXV0b21hdGljYWxseSwgZG9lcyBub3Qgd29yayB5ZXQgKi8KKyAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0lPOworICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19TVE9SRTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBpZiAoc29hcC0+ZnByZXBhcmVyZWN2ID09IGh0dHBfZGFfcHJlcGFyZXJlY3YpCisgICAgICBzb2FwLT5mcHJlcGFyZXJlY3YgPSBkYXRhLT5mcHJlcGFyZXJlY3Y7CisgICAgaWYgKHNvYXAtPmZkaXNjb25uZWN0ID09IGh0dHBfZGFfZGlzY29ubmVjdCkKKyAgICAgIHNvYXAtPmZkaXNjb25uZWN0ID0gZGF0YS0+ZmRpc2Nvbm5lY3Q7CisKKyAgICBpZiAoc29hcC0+dXNlcmlkICYmIHNvYXAtPnBhc3N3ZCkKKyAgICB7CisgICAgICBtZDVfaGFuZGxlcihzb2FwLCAmZGF0YS0+Y29udGV4dCwgTUQ1X0lOSVQsIE5VTEwsIDApOworICAgICAgaWYgKHNvYXAtPmZwcmVwYXJlc2VuZCAhPSBodHRwX2RhX3ByZXBhcmVzZW5kKQorICAgICAgeworICAgICAgICBkYXRhLT5mcHJlcGFyZXNlbmQgPSBzb2FwLT5mcHJlcGFyZXNlbmQ7CisgICAgICAgIHNvYXAtPmZwcmVwYXJlc2VuZCA9IGh0dHBfZGFfcHJlcGFyZXNlbmQ7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGRhdGEtPmZwcmVwYXJlaW5pdCkKKyAgICAgIHJldHVybiBkYXRhLT5mcHJlcGFyZWluaXQoc29hcCk7CisgIH0KKworICByZXR1cm4gU09BUF9PSzsKK30KKworc3RhdGljIGludCBodHRwX2RhX3ByZXBhcmVzZW5kKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisgIHN0cnVjdCBodHRwX2RhX2RhdGEgKmRhdGEgPSAoc3RydWN0IGh0dHBfZGFfZGF0YSopc29hcF9sb29rdXBfcGx1Z2luKHNvYXAsIGh0dHBfZGFfaWQpOworCisgIGlmICghZGF0YSkKKyAgICByZXR1cm4gU09BUF9QTFVHSU5fRVJST1I7CisKKyAgbWQ1X2hhbmRsZXIoc29hcCwgJmRhdGEtPmNvbnRleHQsIE1ENV9VUERBVEUsIChjaGFyKilidWYsIGxlbik7CisKKyAgaWYgKGRhdGEtPmZwcmVwYXJlc2VuZCkKKyAgICByZXR1cm4gZGF0YS0+ZnByZXBhcmVzZW5kKHNvYXAsIGJ1ZiwgbGVuKTsKKworICByZXR1cm4gU09BUF9PSzsKK30KKworc3RhdGljIGludCBodHRwX2RhX3ByZXBhcmVyZWN2KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisgIHN0cnVjdCBodHRwX2RhX2RhdGEgKmRhdGEgPSAoc3RydWN0IGh0dHBfZGFfZGF0YSopc29hcF9sb29rdXBfcGx1Z2luKHNvYXAsIGh0dHBfZGFfaWQpOworCisgIGlmICghZGF0YSkKKyAgICByZXR1cm4gU09BUF9QTFVHSU5fRVJST1I7CisKKyAgbWQ1X2hhbmRsZXIoc29hcCwgJmRhdGEtPmNvbnRleHQsIE1ENV9VUERBVEUsIChjaGFyKilidWYsIGxlbik7CisKKyAgaWYgKGRhdGEtPmZwcmVwYXJlcmVjdikKKyAgICByZXR1cm4gZGF0YS0+ZnByZXBhcmVyZWN2KHNvYXAsIGJ1ZiwgbGVuKTsKKworICByZXR1cm4gU09BUF9PSzsKK30KKworc3RhdGljIGludCBodHRwX2RhX2Rpc2Nvbm5lY3Qoc3RydWN0IHNvYXAgKnNvYXApCit7CisgIHN0cnVjdCBodHRwX2RhX2RhdGEgKmRhdGEgPSAoc3RydWN0IGh0dHBfZGFfZGF0YSopc29hcF9sb29rdXBfcGx1Z2luKHNvYXAsIGh0dHBfZGFfaWQpOworCisgIGlmICghZGF0YSkKKyAgICByZXR1cm4gU09BUF9QTFVHSU5fRVJST1I7CisKKyAgbWQ1X2hhbmRsZXIoc29hcCwgJmRhdGEtPmNvbnRleHQsIE1ENV9GSU5BTCwgZGF0YS0+ZGlnZXN0LCAwKTsKKworICBzb2FwLT5mcHJlcGFyZXJlY3YgPSBkYXRhLT5mcHJlcGFyZXJlY3Y7CisgIHNvYXAtPmZkaXNjb25uZWN0ID0gZGF0YS0+ZmRpc2Nvbm5lY3Q7CisKKyAgaWYgKHNvYXAtPmZkaXNjb25uZWN0KQorICAgIHJldHVybiBzb2FwLT5mZGlzY29ubmVjdChzb2FwKTsKKworICByZXR1cm4gU09BUF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglDbGllbnQtc2lkZSBkaWdlc3QgYXV0aGVudGljYXRpb24gc3RhdGUgbWFuYWdlbWVudAorICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgaHR0cF9kYV9zYXZlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgaHR0cF9kYV9pbmZvICppbmZvLCBjb25zdCBjaGFyICpyZWFsbSwgY29uc3QgY2hhciAqdXNlcmlkLCBjb25zdCBjaGFyICpwYXNzd2QpCit7CisgIHN0cnVjdCBodHRwX2RhX2RhdGEgKmRhdGEgPSAoc3RydWN0IGh0dHBfZGFfZGF0YSopc29hcF9sb29rdXBfcGx1Z2luKHNvYXAsIGh0dHBfZGFfaWQpOworICBpZiAoIWRhdGEpCisgICAgcmV0dXJuOworICBpbmZvLT5hdXRocmVhbG0gPSBzb2FwLT5hdXRocmVhbG0gPSBzb2FwX3N0cmR1cChOVUxMLCByZWFsbSk7CisgIGluZm8tPnVzZXJpZCA9IHNvYXAtPnVzZXJpZCA9IHNvYXBfc3RyZHVwKE5VTEwsIHVzZXJpZCk7CisgIGluZm8tPnBhc3N3ZCA9IHNvYXAtPnBhc3N3ZCA9IHNvYXBfc3RyZHVwKE5VTEwsIHBhc3N3ZCk7CisgIGluZm8tPm5vbmNlID0gc29hcF9zdHJkdXAoTlVMTCwgZGF0YS0+bm9uY2UpOworICBpbmZvLT5vcGFxdWUgPSBzb2FwX3N0cmR1cChOVUxMLCBkYXRhLT5vcGFxdWUpOworICBpbmZvLT5xb3AgPSBzb2FwX3N0cmR1cChOVUxMLCBkYXRhLT5xb3ApOworICBpbmZvLT5hbGcgPSBzb2FwX3N0cmR1cChOVUxMLCBkYXRhLT5hbGcpOworfQorCit2b2lkIGh0dHBfZGFfcmVzdG9yZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IGh0dHBfZGFfaW5mbyAqaW5mbykKK3sKKyAgc3RydWN0IGh0dHBfZGFfZGF0YSAqZGF0YSA9IChzdHJ1Y3QgaHR0cF9kYV9kYXRhKilzb2FwX2xvb2t1cF9wbHVnaW4oc29hcCwgaHR0cF9kYV9pZCk7CisgIGlmICghZGF0YSkKKyAgICByZXR1cm47CisgIHNvYXAtPmF1dGhyZWFsbSA9IGluZm8tPmF1dGhyZWFsbTsKKyAgc29hcC0+dXNlcmlkID0gaW5mby0+dXNlcmlkOworICBzb2FwLT5wYXNzd2QgPSBpbmZvLT5wYXNzd2Q7CisgIGRhdGEtPm5vbmNlID0gaW5mby0+bm9uY2U7CisgIGRhdGEtPm9wYXF1ZSA9IGluZm8tPm9wYXF1ZTsKKyAgZGF0YS0+cW9wID0gaW5mby0+cW9wOworICBkYXRhLT5hbGcgPSBpbmZvLT5hbGc7Cit9CisKK3ZvaWQgaHR0cF9kYV9yZWxlYXNlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgaHR0cF9kYV9pbmZvICppbmZvKQoreworICBzdHJ1Y3QgaHR0cF9kYV9kYXRhICpkYXRhID0gKHN0cnVjdCBodHRwX2RhX2RhdGEqKXNvYXBfbG9va3VwX3BsdWdpbihzb2FwLCBodHRwX2RhX2lkKTsKKyAgaWYgKCFkYXRhKQorICAgIHJldHVybjsKKworICBzb2FwLT5hdXRocmVhbG0gPSBOVUxMOworICBzb2FwLT51c2VyaWQgPSBOVUxMOworICBzb2FwLT5wYXNzd2QgPSBOVUxMOworICBkYXRhLT5ub25jZSA9IE5VTEw7CisgIGRhdGEtPm9wYXF1ZSA9IE5VTEw7CisgIGRhdGEtPnFvcCA9IE5VTEw7CisgIGRhdGEtPmFsZyA9IE5VTEw7CisKKyAgaWYgKGluZm8tPmF1dGhyZWFsbSkKKyAgeworICAgIGZyZWUoaW5mby0+YXV0aHJlYWxtKTsKKyAgICBpbmZvLT5hdXRocmVhbG0gPSBOVUxMOworICB9CisgIGlmIChpbmZvLT51c2VyaWQpCisgIHsKKyAgICBmcmVlKGluZm8tPnVzZXJpZCk7CisgICAgaW5mby0+dXNlcmlkID0gTlVMTDsKKyAgfQorICBpZiAoaW5mby0+cGFzc3dkKQorICB7CisgICAgZnJlZShpbmZvLT5wYXNzd2QpOworICAgIGluZm8tPnBhc3N3ZCA9IE5VTEw7CisgIH0KKyAgaWYgKGluZm8tPm5vbmNlKQorICB7CisgICAgZnJlZShpbmZvLT5ub25jZSk7CisgICAgaW5mby0+bm9uY2UgPSBOVUxMOworICB9CisgIGlmIChpbmZvLT5vcGFxdWUpCisgIHsKKyAgICBmcmVlKGluZm8tPm9wYXF1ZSk7CisgICAgaW5mby0+b3BhcXVlID0gTlVMTDsKKyAgfQorICBpZiAoaW5mby0+cW9wKQorICB7CisgICAgZnJlZShpbmZvLT5xb3ApOworICAgIGluZm8tPnFvcCA9IE5VTEw7CisgIH0KKyAgaWYgKGluZm8tPmFsZykKKyAgeworICAgIGZyZWUoaW5mby0+YWxnKTsKKyAgICBpbmZvLT5hbGcgPSBOVUxMOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJU2VydmVyLXNpZGUgZGlnZXN0IGF1dGhlbnRpY2F0aW9uIHZlcmlmaWNhdGlvbgorICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBodHRwX2RhX3ZlcmlmeV9wb3N0KHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpwYXNzd2QpCit7CisgIHJldHVybiBodHRwX2RhX3ZlcmlmeV9tZXRob2Qoc29hcCwgIlBPU1QiLCBwYXNzd2QpOworfQorCitpbnQgaHR0cF9kYV92ZXJpZnlfZ2V0KHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpwYXNzd2QpCit7CisgIHJldHVybiBodHRwX2RhX3ZlcmlmeV9tZXRob2Qoc29hcCwgIkdFVCIsIHBhc3N3ZCk7Cit9CisKK3N0YXRpYyBpbnQgaHR0cF9kYV92ZXJpZnlfbWV0aG9kKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICptZXRob2QsIGNoYXIgKnBhc3N3ZCkKK3sKKyAgc3RydWN0IGh0dHBfZGFfZGF0YSAqZGF0YSA9IChzdHJ1Y3QgaHR0cF9kYV9kYXRhKilzb2FwX2xvb2t1cF9wbHVnaW4oc29hcCwgaHR0cF9kYV9pZCk7CisgIGNoYXIgSEExWzMzXSwgZW50aXR5SEFoZXhbMzNdLCByZXNwb25zZVszM107CisKKyAgaWYgKCFkYXRhKQorICAgIHJldHVybiBTT0FQX0VSUjsKKworICAvKiByZWplY3QgaWYgbm9uZSBvciBiYXNpYyBhdXRoZW50aWNhdGlvbiB3YXMgdXNlZCAqLworICBpZiAoIXNvYXAtPmF1dGhyZWFsbQorICAgfHwgIXNvYXAtPnVzZXJpZAorICAgfHwgc29hcC0+cGFzc3dkKQkvKiBwYXNzd2QgaXMgc2V0IHdoZW4gYmFzaWMgYXV0aCBpcyB1c2VkICovCisgICAgcmV0dXJuIFNPQVBfRVJSOworCisgIC8qIHJlcXVpcmUgYXQgbGVhc3QgcW9wPSJhdXRoIiB0byBwcmV2ZW50IHJlcGxheSBhdHRhY2tzICovCisgIGlmICghZGF0YS0+cW9wKQorICAgIHJldHVybiBTT0FQX0VSUjsKKworICBpZiAoaHR0cF9kYV9zZXNzaW9uX3VwZGF0ZShzb2FwLT5hdXRocmVhbG0sIGRhdGEtPm5vbmNlLCBkYXRhLT5vcGFxdWUsIGRhdGEtPmNub25jZSwgZGF0YS0+bmNvdW50KSkKKyAgICByZXR1cm4gU09BUF9FUlI7CisKKyAgaHR0cF9kYV9jYWxjX0hBMShzb2FwLCAmZGF0YS0+Y29udGV4dCwgTlVMTCwgc29hcC0+dXNlcmlkLCBzb2FwLT5hdXRocmVhbG0sIHBhc3N3ZCwgZGF0YS0+bm9uY2UsIGRhdGEtPmNub25jZSwgSEExKTsKKworICBpZiAoIXNvYXBfdGFnX2NtcChkYXRhLT5xb3AsICJhdXRoLWludCIpKQorICAgIHNvYXBfczJoZXgoc29hcCwgZGF0YS0+ZGlnZXN0LCBlbnRpdHlIQWhleCwgMTYpOworCisgIGh0dHBfZGFfY2FsY19yZXNwb25zZShzb2FwLCAmZGF0YS0+Y29udGV4dCwgSEExLCBkYXRhLT5ub25jZSwgZGF0YS0+bmNvdW50LCBkYXRhLT5jbm9uY2UsIGRhdGEtPnFvcCwgbWV0aG9kLCBzb2FwLT5wYXRoLCBlbnRpdHlIQWhleCwgcmVzcG9uc2UpOworCisjaWZkZWYgREVCVUcKKyAgZnByaW50ZihzdGRlcnIsICJWZXJpZnlpbmcgY2xpZW50IHJlc3BvbnNlPSVzIHdpdGggY2FsY3VsYXRlZCBkaWdlc3Q9JXNcbiIsIGRhdGEtPnJlc3BvbnNlLCByZXNwb25zZSk7CisjZW5kaWYKKworICAvKiBjaGVjayBkaWdlc3QgcmVzcG9uc2UgdmFsdWVzICovCisgIGlmIChzdHJjbXAoZGF0YS0+cmVzcG9uc2UsIHJlc3BvbnNlKSkKKyAgICByZXR1cm4gU09BUF9FUlI7CisKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJRGlnZXN0IGF1dGhlbnRpY2F0aW9uIHNlc3Npb24gZGF0YWJhc2UgbWFuYWdlbWVudAorICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGh0dHBfZGFfc2Vzc2lvbl9zdGFydChjb25zdCBjaGFyICpyZWFsbSwgY29uc3QgY2hhciAqbm9uY2UsIGNvbnN0IGNoYXIgKm9wYXF1ZSkKK3sKKyAgc3RydWN0IGh0dHBfZGFfc2Vzc2lvbiAqc2Vzc2lvbjsKKyAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CisKKyAgaWYgKG5vdyAlIDEwID09IDApIC8qIGRvbid0IGRvIHRoaXMgYWxsIHRoZSB0aW1lIHRvIGltcHJvdmUgZWZmaWNpZW5jeSAqLworICAgIGh0dHBfZGFfc2Vzc2lvbl9jbGVhbnVwKCk7CisKKyNpZmRlZiBERUJVRworICBmcHJpbnRmKHN0ZGVyciwgIlN0YXJ0aW5nIHNlc3Npb24gcmVhbG09JXMgbm9uY2U9JXNcbiIsIHJlYWxtLCBub25jZSk7CisjZW5kaWYKKworICBNVVRFWF9MT0NLKGh0dHBfZGFfc2Vzc2lvbl9sb2NrKTsKKworICBzZXNzaW9uID0gKHN0cnVjdCBodHRwX2RhX3Nlc3Npb24qKW1hbGxvYyhzaXplb2Yoc3RydWN0IGh0dHBfZGFfc2Vzc2lvbikpOworICBpZiAoc2Vzc2lvbikKKyAgeworICAgIHNlc3Npb24tPm5leHQgPSBodHRwX2RhX3Nlc3Npb247CisgICAgc2Vzc2lvbi0+bW9kaWZpZWQgPSBub3c7CisgICAgc2Vzc2lvbi0+cmVhbG0gPSBzb2FwX3N0cmR1cChOVUxMLCByZWFsbSk7CisgICAgc2Vzc2lvbi0+bm9uY2UgPSBzb2FwX3N0cmR1cChOVUxMLCBub25jZSk7CisgICAgc2Vzc2lvbi0+b3BhcXVlID0gc29hcF9zdHJkdXAoTlVMTCwgb3BhcXVlKTsKKyAgICBzZXNzaW9uLT5uYyA9IDA7CisgICAgaHR0cF9kYV9zZXNzaW9uID0gc2Vzc2lvbjsKKyAgfQorCisgIE1VVEVYX1VOTE9DSyhodHRwX2RhX3Nlc3Npb25fbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgaHR0cF9kYV9zZXNzaW9uX3VwZGF0ZShjb25zdCBjaGFyICpyZWFsbSwgY29uc3QgY2hhciAqbm9uY2UsIGNvbnN0IGNoYXIgKm9wYXF1ZSwgY29uc3QgY2hhciAqY25vbmNlLCBjb25zdCBjaGFyICpuY291bnQpCit7CisgIHN0cnVjdCBodHRwX2RhX3Nlc3Npb24gKnNlc3Npb247CisKKyAgaWYgKCFyZWFsbSB8fCAhbm9uY2UgfHwgIW9wYXF1ZSB8fCAhY25vbmNlIHx8ICFuY291bnQpCisgICAgcmV0dXJuIFNPQVBfRVJSOworCisjaWZkZWYgREVCVUcKKyAgZnByaW50ZihzdGRlcnIsICJVcGRhdGluZyBzZXNzaW9uIHJlYWxtPSVzIG5vbmNlPSVzXG4iLCByZWFsbSwgbm9uY2UpOworI2VuZGlmCisKKyAgTVVURVhfTE9DSyhodHRwX2RhX3Nlc3Npb25fbG9jayk7CisKKyAgZm9yIChzZXNzaW9uID0gaHR0cF9kYV9zZXNzaW9uOyBzZXNzaW9uOyBzZXNzaW9uID0gc2Vzc2lvbi0+bmV4dCkKKyAgICBpZiAoIXN0cmNtcChzZXNzaW9uLT5yZWFsbSwgcmVhbG0pICYmICFzdHJjbXAoc2Vzc2lvbi0+bm9uY2UsIG5vbmNlKSAmJiAhc3RyY21wKHNlc3Npb24tPm9wYXF1ZSwgb3BhcXVlKSkKKyAgICAgIGJyZWFrOworCisgIGlmIChzZXNzaW9uKQorICB7CisgICAgdW5zaWduZWQgbG9uZyBuYyA9IHNvYXBfc3RydG91bChuY291bnQsIE5VTEwsIDE2KTsKKworICAgIGlmIChzZXNzaW9uLT5uYyA+PSBuYykKKyAgICB7CisgICAgICBzZXNzaW9uLT5tb2RpZmllZCA9IDA7IC8qIHJlcGxheSBhdHRhY2s6IHRlcm1pbmF0ZSBzZXNzaW9uICovCisgICAgICBzZXNzaW9uID0gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHNlc3Npb24tPm5jID0gbmM7CisgICAgICBzZXNzaW9uLT5tb2RpZmllZCA9IHRpbWUoTlVMTCk7CisgICAgfQorICB9CisKKyAgTVVURVhfVU5MT0NLKGh0dHBfZGFfc2Vzc2lvbl9sb2NrKTsKKworICBpZiAoIXNlc3Npb24pCisgICAgcmV0dXJuIFNPQVBfRVJSOworCisgIHJldHVybiBTT0FQX09LOworfQorCitzdGF0aWMgdm9pZCBodHRwX2RhX3Nlc3Npb25fY2xlYW51cCgpCit7CisgIHN0cnVjdCBodHRwX2RhX3Nlc3Npb24gKipzZXNzaW9uOworICB0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKKworICBNVVRFWF9MT0NLKGh0dHBfZGFfc2Vzc2lvbl9sb2NrKTsKKworICBzZXNzaW9uID0gJmh0dHBfZGFfc2Vzc2lvbjsKKyAgd2hpbGUgKCpzZXNzaW9uKQorICB7CisgICAgaWYgKCgqc2Vzc2lvbiktPm1vZGlmaWVkICsgSFRUUF9EQV9TRVNTSU9OX1RJTUVPVVQgPCBub3cpCisgICAgeworICAgICAgc3RydWN0IGh0dHBfZGFfc2Vzc2lvbiAqcCA9ICpzZXNzaW9uOworCisjaWZkZWYgREVCVUcKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRGVsZXRpbmcgc2Vzc2lvbiByZWFsbT0lcyBub25jZT0lc1xuIiwgcC0+cmVhbG0sIHAtPm5vbmNlKTsKKyNlbmRpZgorCisgICAgICBpZiAocC0+cmVhbG0pCisgICAgICAgIGZyZWUocC0+cmVhbG0pOworICAgICAgaWYgKHAtPm5vbmNlKQorICAgICAgICBmcmVlKHAtPm5vbmNlKTsKKyAgICAgIGlmIChwLT5vcGFxdWUpCisgICAgICAgIGZyZWUocC0+b3BhcXVlKTsKKworICAgICAgKnNlc3Npb24gPSBwLT5uZXh0OworICAgICAgZnJlZShwKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgc2Vzc2lvbiA9ICYoKnNlc3Npb24pLT5uZXh0OworICB9CisKKyAgTVVURVhfVU5MT0NLKGh0dHBfZGFfc2Vzc2lvbl9sb2NrKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglDYWxjdWxhdGUgaGV4IG5vbmNlIGFuZCBvcGFxdWUgdmFsdWVzCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBodHRwX2RhX2NhbGNfbm9uY2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgbm9uY2VbSFRUUF9EQV9OT05DRUxFTl0pCit7CisgIHN0YXRpYyBzaG9ydCBjb3VudCA9IDB4Q0E1MzsKKyAgc3ByaW50Zihub25jZSwgIiU4Ljh4JTQuNGh4JTguOHgiLCAoaW50KXRpbWUoTlVMTCksIGNvdW50KyssIHNvYXBfcmFuZG9tKTsKK30KKwordm9pZCBodHRwX2RhX2NhbGNfb3BhcXVlKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyIG9wYXF1ZVtIVFRQX0RBX09QQVFVRUxFTl0pCit7CisgIHNwcmludGYob3BhcXVlLCAiJTguOHgiLCBzb2FwX3JhbmRvbSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJQ2FsY3VsYXRlIEhBMSwgSEEyLCBhbmQgcmVzcG9uc2UgZGlnZXN0IGFzIHBlciBSRkMgMjYxNyBzcGVjaWZpY2F0aW9uCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgaHR0cF9kYV9jYWxjX0hBMShzdHJ1Y3Qgc29hcCAqc29hcCwgdm9pZCAqKmNvbnRleHQsIGNoYXIgKmFsZywgY2hhciAqdXNlcmlkLCBjaGFyICpyZWFsbSwgY2hhciAqcGFzc3dkLCBjaGFyICpub25jZSwgY2hhciAqY25vbmNlLCBjaGFyIEhBMWhleFszM10pCit7CisgIGNoYXIgSEExWzE2XTsKKworICBtZDVfaGFuZGxlcihzb2FwLCBjb250ZXh0LCBNRDVfSU5JVCwgTlVMTCwgMCk7CisgIG1kNV9oYW5kbGVyKHNvYXAsIGNvbnRleHQsIE1ENV9VUERBVEUsIHVzZXJpZCwgc3RybGVuKHVzZXJpZCkpOworICBtZDVfaGFuZGxlcihzb2FwLCBjb250ZXh0LCBNRDVfVVBEQVRFLCAiOiIsIDEpOworICBtZDVfaGFuZGxlcihzb2FwLCBjb250ZXh0LCBNRDVfVVBEQVRFLCByZWFsbSwgc3RybGVuKHJlYWxtKSk7CisgIG1kNV9oYW5kbGVyKHNvYXAsIGNvbnRleHQsIE1ENV9VUERBVEUsICI6IiwgMSk7CisgIG1kNV9oYW5kbGVyKHNvYXAsIGNvbnRleHQsIE1ENV9VUERBVEUsIHBhc3N3ZCwgc3RybGVuKHBhc3N3ZCkpOworICBtZDVfaGFuZGxlcihzb2FwLCBjb250ZXh0LCBNRDVfRklOQUwsIEhBMSwgMCk7CisKKyAgaWYgKGFsZyAmJiAhc29hcF90YWdfY21wKGFsZywgIk1ENS1zZXNzIikpCisgIHsKKyAgICBtZDVfaGFuZGxlcihzb2FwLCBjb250ZXh0LCBNRDVfSU5JVCwgTlVMTCwgMCk7CisgICAgbWQ1X2hhbmRsZXIoc29hcCwgY29udGV4dCwgTUQ1X1VQREFURSwgSEExLCAxNik7CisgICAgbWQ1X2hhbmRsZXIoc29hcCwgY29udGV4dCwgTUQ1X1VQREFURSwgIjoiLCAxKTsKKyAgICBtZDVfaGFuZGxlcihzb2FwLCBjb250ZXh0LCBNRDVfVVBEQVRFLCBub25jZSwgc3RybGVuKG5vbmNlKSk7CisgICAgbWQ1X2hhbmRsZXIoc29hcCwgY29udGV4dCwgTUQ1X1VQREFURSwgIjoiLCAxKTsKKyAgICBtZDVfaGFuZGxlcihzb2FwLCBjb250ZXh0LCBNRDVfVVBEQVRFLCBjbm9uY2UsIHN0cmxlbihjbm9uY2UpKTsKKyAgICBtZDVfaGFuZGxlcihzb2FwLCBjb250ZXh0LCBNRDVfRklOQUwsIEhBMSwgMCk7CisgIH07CisKKyAgc29hcF9zMmhleChzb2FwLCBIQTEsIEhBMWhleCwgMTYpOworfTsKKworc3RhdGljIHZvaWQgaHR0cF9kYV9jYWxjX3Jlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCB2b2lkICoqY29udGV4dCwgY2hhciBIQTFoZXhbMzNdLCBjaGFyICpub25jZSwgY2hhciAqbmNvdW50LCBjaGFyICpjbm9uY2UsIGNoYXIgKnFvcCwgY2hhciAqbWV0aG9kLCBjaGFyICp1cmksIGNoYXIgZW50aXR5SEFoZXhbMzNdLCBjaGFyIHJlc3BvbnNlWzMzXSkKK3sKKyAgY2hhciBIQTJbMTZdLCBIQTJoZXhbMzNdLCByZXNwb25zZUhBWzE2XTsKKworICBtZDVfaGFuZGxlcihzb2FwLCBjb250ZXh0LCBNRDVfSU5JVCwgTlVMTCwgMCk7CisgIG1kNV9oYW5kbGVyKHNvYXAsIGNvbnRleHQsIE1ENV9VUERBVEUsIG1ldGhvZCwgc3RybGVuKG1ldGhvZCkpOworICBtZDVfaGFuZGxlcihzb2FwLCBjb250ZXh0LCBNRDVfVVBEQVRFLCAiOiIsIDEpOworICBtZDVfaGFuZGxlcihzb2FwLCBjb250ZXh0LCBNRDVfVVBEQVRFLCB1cmksIHN0cmxlbih1cmkpKTsKKyAgaWYgKCFzb2FwX3RhZ19jbXAocW9wLCAiYXV0aC1pbnQiKSkKKyAgeyAKKyAgICBtZDVfaGFuZGxlcihzb2FwLCBjb250ZXh0LCBNRDVfVVBEQVRFLCAiOiIsIDEpOworICAgIG1kNV9oYW5kbGVyKHNvYXAsIGNvbnRleHQsIE1ENV9VUERBVEUsIGVudGl0eUhBaGV4LCAzMik7CisgIH0KKyAgbWQ1X2hhbmRsZXIoc29hcCwgY29udGV4dCwgTUQ1X0ZJTkFMLCBIQTIsIDApOworCisgIHNvYXBfczJoZXgoc29hcCwgSEEyLCBIQTJoZXgsIDE2KTsKKworICBtZDVfaGFuZGxlcihzb2FwLCBjb250ZXh0LCBNRDVfSU5JVCwgTlVMTCwgMCk7CisgIG1kNV9oYW5kbGVyKHNvYXAsIGNvbnRleHQsIE1ENV9VUERBVEUsIEhBMWhleCwgMzIpOworICBtZDVfaGFuZGxlcihzb2FwLCBjb250ZXh0LCBNRDVfVVBEQVRFLCAiOiIsIDEpOworICBtZDVfaGFuZGxlcihzb2FwLCBjb250ZXh0LCBNRDVfVVBEQVRFLCBub25jZSwgc3RybGVuKG5vbmNlKSk7CisgIG1kNV9oYW5kbGVyKHNvYXAsIGNvbnRleHQsIE1ENV9VUERBVEUsICI6IiwgMSk7CisgIGlmIChxb3AgJiYgKnFvcCkKKyAgeworICAgIG1kNV9oYW5kbGVyKHNvYXAsIGNvbnRleHQsIE1ENV9VUERBVEUsIG5jb3VudCwgc3RybGVuKG5jb3VudCkpOworICAgIG1kNV9oYW5kbGVyKHNvYXAsIGNvbnRleHQsIE1ENV9VUERBVEUsICI6IiwgMSk7CisgICAgbWQ1X2hhbmRsZXIoc29hcCwgY29udGV4dCwgTUQ1X1VQREFURSwgY25vbmNlLCBzdHJsZW4oY25vbmNlKSk7CisgICAgbWQ1X2hhbmRsZXIoc29hcCwgY29udGV4dCwgTUQ1X1VQREFURSwgIjoiLCAxKTsKKyAgICBtZDVfaGFuZGxlcihzb2FwLCBjb250ZXh0LCBNRDVfVVBEQVRFLCBxb3AsIHN0cmxlbihxb3ApKTsKKyAgICBtZDVfaGFuZGxlcihzb2FwLCBjb250ZXh0LCBNRDVfVVBEQVRFLCAiOiIsIDEpOworICB9CisgIG1kNV9oYW5kbGVyKHNvYXAsIGNvbnRleHQsIE1ENV9VUERBVEUsIEhBMmhleCwgMzIpOworICBtZDVfaGFuZGxlcihzb2FwLCBjb250ZXh0LCBNRDVfRklOQUwsIHJlc3BvbnNlSEEsIDApOworCisgIHNvYXBfczJoZXgoc29hcCwgcmVzcG9uc2VIQSwgcmVzcG9uc2UsIDE2KTsKK30KKwpkaWZmIC0tZ2l0IGEvcGx1Z2luL2h0dHBkYS5oIGIvcGx1Z2luL2h0dHBkYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNWQ1Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW4vaHR0cGRhLmgKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisKK2h0dHBkYS5oCisKK2dTT0FQIEhUVFAgRGlnZXN0IEF1dGhlbnRpY2F0aW9uIHBsdWdpbi4KK1N1cHBvcnRzIGJvdGggQmFzaWMgYW5kIERpZ2VzdCBhdXRoZW50aWNhdGlvbi4KKworVXNhZ2UgKGNsaWVudCBzaWRlLCBzZWUgaHR0cGRhdGVzdC5oLy5jIGZvciBleGFtcGxlKToKK3NvYXBfcmVnaXN0ZXJfcGx1Z2luKCZzb2FwLCBodHRwX2RhKTsKK2lmIChzb2FwX2NhbGxfbnNfX21ldGhvZCgmc29hcCwgLi4uKSAhPSBTT0FQX09LKQoreyBpZiAoc29hcC5lcnJvciA9PSA0MDEpIC8vIEhUVFAgYXV0aGVudGljYXRpb24gaXMgcmVxdWlyZWQKKyAgeyBpZiAoIXN0cmNtcChzb2FwLmF1dGhyZWFsbSwgYXV0aHJlYWxtKSkgLy8gY2hlY2sgYXV0aGVudGljYXRpb24gcmVhbG0KKyAgICB7IHN0cnVjdCBodHRwX2RhX2luZm8gaW5mbzsgLy8gdG8gc3RvcmUgdXNlcmlkIGFuZCBwYXNzd2QKKyAgICAgIGh0dHBfZGFfc2F2ZSgmc29hcCwgJmluZm8sIGF1dGhyZWFsbSwgdXNlcmlkLCBwYXNzd2QpOworICAgICAgaWYgKHNvYXBfY2FsbF9uc19fbWV0aG9kKCZzb2FwLCAuLi4pID09IFNPQVBfT0spCisgICAgICB7IC4uLgorICAgICAgICBzb2FwX2VuZCgmc29hcCk7CisJLi4uIC8vIHVzZXJpZCBhbmQgcGFzc3dkIHdlcmUgZGVhbGxvY2F0ZWQKKyAgICAgICAgaHR0cF9kYV9yZXN0b3JlKCZzb2FwLCAmaW5mbyk7IC8vIGdldCB1c2VyaWQgYW5kIHBhc3N3ZCBhZnRlciBzb2FwX2VuZCgpCisgICAgICAgIGlmICghc29hcF9jYWxsX25zX19tZXRob2QoJnNvYXAsIC4uLikgPT0gU09BUF9PSykKKwkgIC4uLgorICAgICAgICBodHRwX2RhX3JlbGVhc2UoJnNvYXAsICZpbmZvKTsgLy8gcmVtb3ZlIHVzZXJpZCBhbmQgcGFzc3dkCisKK1VzYWdlIChzZXJ2ZXIgc2lkZSwgc2VlIGh0dHBkYXRlc3QuaC8uYyBmb3IgZXhhbXBsZSk6Citzb2FwX3JlZ2lzdGVyX3BsdWdpbigmc29hcCwgaHR0cF9kYSk7CisuLi4KK3NvYXBfc2VydmUoJnNvYXApOworLi4uCitpbnQgbnNfX21ldGhvZChzdHJ1Y3Qgc29hcCAqc29hcCwgLi4uKQoreyBpZiAoc29hcC0+dXNlcmlkICYmIHNvYXAtPnBhc3N3ZCkgLy8gQmFzaWMgYXV0aGVudGljYXRpb24KKyAgeyBpZiAoIXN0cmNtcChzb2FwLT51c2VyaWQsIHVzZXJpZCkgJiYgIXN0cmNtcChzb2FwLT5wYXNzd2QsIHBhc3N3ZCkpCisgICAgeyAuLi4KKyAgICAgIHJldHVybiBTT0FQX09LOworICAgIH0KKyAgfQorICBlbHNlIGlmIChzb2FwLT5hdXRocmVhbG0gJiYgc29hcC0+dXNlcmlkKSAvLyBEaWdlc3QgYXV0aGVudGljYXRpb24KKyAgeyBwYXNzd2QgPSAuLi4gLy8gZGF0YWJhc2UgbG9va3VwIG9uIHVzZXJpZCBhbmQgYXV0aHJlYWxtIHRvIGZpbmQgcGFzc3dkCisgICAgaWYgKCFzdHJjbXAoc29hcC0+YXV0aHJlYWxtLCBhdXRocmVhbG0pICYmICFzdHJjbXAoc29hcC0+dXNlcmlkLCB1c2VyaWQpKQorICAgIHsgaWYgKCFodHRwX2RhX3ZlcmlmeV9wb3N0KHNvYXAsIHBhc3N3ZCkpICAgICAgICAgICAgICAgICAKKyAgICAgIHsgLi4uCisgICAgICAgIHJldHVybiBTT0FQX09LOworICAgICAgfQorICAgIH0KKyAgfQorICBzb2FwLT5hdXRocmVhbG0gPSBhdXRocmVhbG07CisgIHJldHVybiA0MDE7IC8vIE5vdCBhdXRob3JpemVkLCBjaGFsbGVuZ2UgZGlnZXN0IGF1dGhlbnRpY2F0aW9uCit9CisKK0NvbXBpbGUgd2l0aCAtRFdJVEhfT1BFTlNTTAorTGluayB3aXRoIE9wZW5TU0wgKGZvciBtZDVldnAuYyksIGh0dHBkYS5jLCBtZDVldnAuYywgYW5kIHRocmVhZHMuYworCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHBhcnQgb2YgdGhlIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2VzOgorR1BMLCB0aGUgZ1NPQVAgcHVibGljIGxpY2Vuc2UsIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBwdWJsaWMgbGljZW5zZS4KKworVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZ1NPQVAgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjMKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcGxpY2Vuc2UuaHRtbAorU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKK1dJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQorZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFJvYmVydCBBLiB2YW4gRW5nZWxlbi4KK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEsIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZiBIVFRQREFfSAorI2RlZmluZSBIVFRQREFfSAorCisjaW5jbHVkZSAic3Rkc29hcDIuaCIKKyNpbmNsdWRlICJtZDVldnAuaCIgLyogcmVxdWlyZXMgTUQ1ICovCisjaW5jbHVkZSAidGhyZWFkcy5oIiAvKiBtdXRleCBmb3IgbXVsdGktdGhyZWFkZWQgc2VydmVyIGltcGxlbWVudGF0aW9ucyAqLworCisjZGVmaW5lIEhUVFBfREFfSUQgIkhUVFAtREEtMS4wIiAvKiBwbHVnaW4gaWRlbnRpZmljYXRpb24gKi8KKworI2RlZmluZSBIVFRQX0RBX1NFU1NJT05fVElNRU9VVCAoNjAwKSAvKiBzZXNzaW9ucyB0aW1lIG91dCBhZnRlciB0ZW4gbWludXRlcyAqLworCitleHRlcm4gY29uc3QgY2hhciBodHRwX2RhX2lkW107CisKK3N0cnVjdCBodHRwX2RhX2RhdGEKK3sKKyAgaW50ICgqZnBvc3RoZHIpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKyAgaW50ICgqZnBhcnNlaGRyKShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CisgIGludCAoKmZwcmVwYXJlaW5pdCkoc3RydWN0IHNvYXAqKTsKKyAgaW50ICgqZnByZXBhcmVzZW5kKShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworICBpbnQgKCpmcHJlcGFyZXJlY3YpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHNpemVfdCk7CisgIGludCAoKmZkaXNjb25uZWN0KShzdHJ1Y3Qgc29hcCopOworICB2b2lkICpjb250ZXh0OwkvKiBwdHIgdG8gTUQ1IGNvbnRleHQgZm9yIE1ENSBoYW5kbGVyICovCisgIGNoYXIgZGlnZXN0WzE2XTsJLyogTUQ1IGVudGl0eSBib2R5IGRpZ2VzdCAqLworICBjaGFyICpub25jZTsJCS8qIGNsaWVudC9zZXJ2ZXItc2lkZSBjb3B5IG9mIHNlcnZlcidzIG5vbmNlIHZhbHVlICovCisgIGNoYXIgKm9wYXF1ZTsJCS8qIGNsaWVudC9zZXJ2ZXItc2lkZSBjb3B5IG9mIHNlcnZlcidzIG9wYXF1ZSB2YWx1ZSAqLworICBjaGFyICpxb3A7CQkvKiBjbGllbnQvc2VydmVyLXNpZGUgY29weSBvZiBzZXJ2ZXIncyBxb3AgdmFsdWUocykgKi8KKyAgY2hhciAqYWxnOwkJLyogY2xpZW50LXNpZGU6IHNlcnZlcidzIGFsZ29yaXRobSB2YWx1ZSAqLworICB1bnNpZ25lZCBsb25nIG5jOwkvKiBjbGllbnQtc2lkZTogZ2VuZXJhdGVkIG5vbmNlIGNvdW50ICovCisgIGNoYXIgKm5jb3VudDsJCS8qIHNlcnZlci1zaWRlOiBjbGllbnQncyBub25jZSBjb3VudCAqLworICBjaGFyICpjbm9uY2U7CQkvKiBzZXJ2ZXItc2lkZTogY2xpZW50J3Mgbm9uY2UgKi8KKyAgY2hhciAqcmVzcG9uc2U7CS8qIHNlcnZlci1zaWRlOiBjbGllbnQncyByZXNwb25zZSBkaWdlc3Qga2V5ICovCit9OworCitzdHJ1Y3QgaHR0cF9kYV9zZXNzaW9uCit7CisgIHN0cnVjdCBodHRwX2RhX3Nlc3Npb24gKm5leHQ7CisgIHRpbWVfdCBtb2RpZmllZDsKKyAgY2hhciAqcmVhbG07CisgIGNoYXIgKm5vbmNlOworICBjaGFyICpvcGFxdWU7CisgIHVuc2lnbmVkIGxvbmcgbmM7Cit9OworCitpbnQgaHR0cF9kYShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGx1Z2luICpwLCB2b2lkICphcmcpOworCitpbnQgaHR0cF9kYV92ZXJpZnlfcG9zdChzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqcGFzc3dkKTsKK2ludCBodHRwX2RhX3ZlcmlmeV9nZXQoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnBhc3N3ZCk7CisKK3N0cnVjdCBodHRwX2RhX2luZm8KK3sKKyAgY2hhciAqYXV0aHJlYWxtOworICBjaGFyICp1c2VyaWQ7CisgIGNoYXIgKnBhc3N3ZDsKKyAgY2hhciAqbm9uY2U7CisgIGNoYXIgKm9wYXF1ZTsKKyAgY2hhciAqcW9wOworICBjaGFyICphbGc7Cit9OworCit2b2lkIGh0dHBfZGFfc2F2ZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IGh0dHBfZGFfaW5mbyAqaW5mbywgY29uc3QgY2hhciAqcmVhbG0sIGNvbnN0IGNoYXIgKnVzZXJpZCwgY29uc3QgY2hhciAqcGFzc3dkKTsKK3ZvaWQgaHR0cF9kYV9yZXN0b3JlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgaHR0cF9kYV9pbmZvICppbmZvKTsKK3ZvaWQgaHR0cF9kYV9yZWxlYXNlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgaHR0cF9kYV9pbmZvICppbmZvKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9wbHVnaW4vaHR0cGRhdGVzdC5jIGIvcGx1Z2luL2h0dHBkYXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDk4ZmM2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2luL2h0dHBkYXRlc3QuYwpAQCAtMCwwICsxLDE4NCBAQAorLyoKKworaHR0cGRhdGVzdC5jCisKK2dTT0FQIEhUVFAgRGlnZXN0IEF1dGhlbnRpY2F0aW9uIGV4YW1wbGUgYXBwbGljYXRpb24uCisKK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEsIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBwdWJsaWMgbGljZW5zZS4KKworVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZ1NPQVAgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjMKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcGxpY2Vuc2UuaHRtbAorU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKK1dJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQorZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFJvYmVydCBBLiB2YW4gRW5nZWxlbi4KK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEsIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUmVxdWlyZXMgT3BlblNTTAorCitDb21waWxlOgorCitzb2FwY3BwMiAtYyBodHRwZGF0ZXN0LmgKK2NjIC1EV0lUSF9PUEVOU1NMIC1vIGh0dHBkYXRlc3QgaHR0cGRhdGVzdC5jIHNvYXBDLmMgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuYyBodHRwZGEuYyBtZDVldnAuYyB0aHJlYWRzLmMgc3Rkc29hcDIuYyAtbHNzbCAtbGNyeXB0byAtbHoKKworKi8KKworI2luY2x1ZGUgImh0dHBkYS5oIgorI2luY2x1ZGUgInNvYXBILmgiCisjaW5jbHVkZSAibnMubnNtYXAiCisKK3N0YXRpYyBjaGFyIGF1dGhyZWFsbVtdID0gImdTT0FQIEF1dGhlbnRpY2F0aW9uIFRlc3QiOworCitpbnQgcnVuX3NlcnZlKGludCBwb3J0KTsKK2ludCBydW5fdGVzdHMoaW50LGNoYXIqKik7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgaWYgKGFyZ2MgPCAyKQorICAgIHJldHVybiBydW5fc2VydmUoODA4MCk7CisgIGVsc2UgaWYgKGFyZ2MgPCAzKQorICAgIHJldHVybiBydW5fc2VydmUoYXRvaShhcmd2WzFdKSk7CisgIGVsc2UKKyAgICByZXR1cm4gcnVuX3Rlc3RzKGFyZ2MsIGFyZ3YpOworfQorCitpbnQgcnVuX3NlcnZlKGludCBwb3J0KQoreworICBzdHJ1Y3Qgc29hcCAqc29hcCA9IHNvYXBfbmV3KCk7CisgIGludCByZXQ7CisgIHNvYXBfcmVnaXN0ZXJfcGx1Z2luKHNvYXAsIGh0dHBfZGEpOworICBpZiAoIXNvYXBfdmFsaWRfc29ja2V0KHNvYXBfYmluZChzb2FwLCBOVUxMLCBwb3J0LCAxMDApKSkKKyAgICBzb2FwX3ByaW50X2ZhdWx0KHNvYXAsIHN0ZGVycik7CisgIGVsc2UKKyAgeworICAgIGZwcmludGYoc3RkZXJyLCAiQmluZCB0byBwb3J0ICVkIHN1Y2Nlc3NmdWxcbiIsIHBvcnQpOworICAgIHNvYXAtPmFjY2VwdF90aW1lb3V0ID0gMzYwMDsgLyogbGV0IHNlcnZlciB0aW1lIG91dCBhZnRlciBvbmUgaG91ciAqLworICAgIGZvciAoOzspCisgICAgeworICAgICAgaW50IHNvY2sgPSBzb2FwX2FjY2VwdChzb2FwKTsKKyAgICAgIGlmICghc29hcF92YWxpZF9zb2NrZXQoc29jaykpCisgICAgICB7CisgICAgICAgIGlmIChzb2FwLT5lcnJudW0pCisgICAgICAgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOworICAgICAgICBlbHNlCisgICAgICAgIHsKKwkgIGZwcmludGYoc3RkZXJyLCAiU2VydmVyIHRpbWVkIG91dFxuIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZwcmludGYoc3RkZXJyLCAiQWNjZXB0aW5nIHNvY2tldCAlZCBjb25uZWN0aW9uIGZyb20gSVAgJWQuJWQuJWQuJWRcbiIsIHNvY2ssIChpbnQpKHNvYXAtPmlwPj4yNCkmMHhGRiwgKGludCkoc29hcC0+aXA+PjE2KSYweEZGLCAoaW50KShzb2FwLT5pcD4+OCkmMHhGRiwgKGludClzb2FwLT5pcCYweEZGKTsKKyAgICAgIGlmIChzb2FwX3NlcnZlKHNvYXApKQorICAgICAgICBzb2FwX3ByaW50X2ZhdWx0KHNvYXAsIHN0ZGVycik7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlNlcnZlZFxuXG4iKTsKKyAgICAgIHNvYXBfZGVzdHJveShzb2FwKTsKKyAgICAgIHNvYXBfZW5kKHNvYXApOworICAgIH0gCisgIH0KKyAgcmV0ID0gc29hcC0+ZXJyb3I7CisgIHNvYXBfZW5kKHNvYXApOworICBzb2FwX2RvbmUoc29hcCk7CisgIGZyZWUoc29hcCk7CisgIHJldHVybiByZXQ7Cit9CisKK2ludCBydW5fdGVzdHMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBzdHJ1Y3Qgc29hcCAqc29hcCA9IHNvYXBfbmV3KCk7CisgIHN0cnVjdCBuc19fZWNob1N0cmluZyByOworICBjaGFyICplbmRwb2ludCwgKmFyZzsKKyAgaW50IHJldDsKKworICBzb2FwX3JlZ2lzdGVyX3BsdWdpbihzb2FwLCBodHRwX2RhKTsKKworICBlbmRwb2ludCA9IGFyZ3ZbMV07CisgIGFyZyA9IGFyZ3ZbMl07CisKKyAgaWYgKHNvYXBfY2FsbF9uc19fZWNob1N0cmluZyhzb2FwLCBlbmRwb2ludCwgTlVMTCwgYXJnLCAmcikpCisgIHsKKyAgICBpZiAoc29hcC0+ZXJyb3IgPT0gNDAxKQorICAgIHsKKyAgICAgIGlmICghc3RyY21wKHNvYXAtPmF1dGhyZWFsbSwgYXV0aHJlYWxtKSkKKyAgICAgIHsKKwkvKiBzYXZlIHVzZXJpZCBhbmQgcGFzc3dkIGZvciBiYXNpYyBvciBkaWdlc3QgYXV0aGVudGljYXRpb24gKi8KKwlzdHJ1Y3QgaHR0cF9kYV9pbmZvIGluZm87CisJaHR0cF9kYV9zYXZlKHNvYXAsICZpbmZvLCBhdXRocmVhbG0sICJNdWZhc2EiLCAiQ2lyY2xlIE9mIExpZmUiKTsKKyAgICAgICAgaWYgKCFzb2FwX2NhbGxfbnNfX2VjaG9TdHJpbmcoc29hcCwgZW5kcG9pbnQsIE5VTEwsIGFyZywgJnIpKQorCXsKKwkgIHNvYXBfZW5kKHNvYXApOworCSAgLyogbmVlZCB0byByZXN0b3JlIGZvciBhdXRoZW50aWNhdGlvbiAqLworCSAgaHR0cF9kYV9yZXN0b3JlKHNvYXAsICZpbmZvKTsKKwkgIGlmICghc29hcF9jYWxsX25zX19lY2hvU3RyaW5nKHNvYXAsIGVuZHBvaW50LCBOVUxMLCBhcmcsICZyKSkKKyAgICAgICAgICB7CisJICAgIGlmICghc3RyY21wKGFyZywgci5hcmcpKQorICAgICAgICAgICAgICBwcmludGYoIkVjaG9TdHJpbmcgdGVzdCBPS1xuIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHByaW50ZigiVHJhbnNtaXNzaW9uIGVycm9yXG4iKTsKKwkgIH0gCisgICAgICAgIH0KKwlodHRwX2RhX3JlbGVhc2Uoc29hcCwgJmluZm8pOworCS8qIHJlZ3VsYXIgY2FsbHMgbWF5IGZvbGxvdyAqLworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoc29hcC0+ZXJyb3IpCisgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOworICByZXQgPSBzb2FwLT5lcnJvcjsKKyAgc29hcF9lbmQoc29hcCk7CisgIHNvYXBfZG9uZShzb2FwKTsKKyAgZnJlZShzb2FwKTsKKyAgcmV0dXJuIHJldDsKK30KKworaW50IG5zX19lY2hvU3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICphcmcsIHN0cnVjdCBuc19fZWNob1N0cmluZyAqcmVzcG9uc2UpCit7CisgIGlmIChzb2FwLT51c2VyaWQgJiYgc29hcC0+cGFzc3dkKQkvKiBCYXNpYyBhdXRoZW50aWNhdGlvbjogd2UgbWF5IHdhbnQgdG8gcmVqZWN0IHRoaXMgc2luY2UgdGhlIHBhc3N3b3JkIHdhcyBzZW5kIGluIHRoZSBjbGVhciAqLworICB7IGlmICghc3RyY21wKHNvYXAtPnVzZXJpZCwgIk11ZmFzYSIpCisgICAgICYmICFzdHJjbXAoc29hcC0+cGFzc3dkLCAiQ2lyY2xlIE9mIExpZmUiKSkKKyAgICB7CisgICAgICByZXNwb25zZS0+YXJnID0gYXJnOworICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgfQorICB9CisgIGVsc2UgaWYgKHNvYXAtPmF1dGhyZWFsbSAmJiBzb2FwLT51c2VyaWQpCisgIHsKKyAgICAvKiBzaW11bGF0ZSBkYXRhYmFzZSBsb29rdXAgb24gdXNlcmlkIHRvIGZpbmQgcGFzc3dkICovCisgICAgaWYgKCFzdHJjbXAoc29hcC0+YXV0aHJlYWxtLCBhdXRocmVhbG0pICYmICFzdHJjbXAoc29hcC0+dXNlcmlkLCAiTXVmYXNhIikpCisgICAgeworICAgICAgY2hhciAqcGFzc3dkID0gIkNpcmNsZSBPZiBMaWZlIjsKKworICAgICAgaWYgKCFodHRwX2RhX3ZlcmlmeV9wb3N0KHNvYXAsIHBhc3N3ZCkpCisgICAgICB7CisgICAgICAgIHJlc3BvbnNlLT5hcmcgPSBhcmc7CisgICAgICAgIHJldHVybiBTT0FQX09LOworICAgICAgfQorICAgIH0KKyAgfQorICBzb2FwLT5hdXRocmVhbG0gPSBhdXRocmVhbG07CisgIHJldHVybiA0MDE7IC8qIE5vdCBhdXRob3JpemVkLCBjaGFsbGVuZ2UgZGlnZXN0IGF1dGhlbnRpY2F0aW9uIHdpdGggaHR0cGRhIHBsdWdpbiAqLworfQpkaWZmIC0tZ2l0IGEvcGx1Z2luL2h0dHBkYXRlc3QuaCBiL3BsdWdpbi9odHRwZGF0ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYyMWM5NwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbi9odHRwZGF0ZXN0LmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKworaHR0cGRhdGVzdC5oCisKK2dTT0FQIEhUVFAgRGlnZXN0IEF1dGhlbnRpY2F0aW9uIGV4YW1wbGUgYXBwbGljYXRpb24uCisKK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEsIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBwdWJsaWMgbGljZW5zZS4KKworVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZ1NPQVAgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjMKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcGxpY2Vuc2UuaHRtbAorU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKK1dJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQorZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFJvYmVydCBBLiB2YW4gRW5nZWxlbi4KK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEsIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ29tcGlsZToKKworc29hcGNwcDIgLWMgaHR0cGRhdGVzdC5oCitjYyAtRFdJVEhfT1BFTlNTTCAtbyBodHRwZGF0ZXN0IGh0dHBkYXRlc3QuYyBzb2FwQy5jIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmMgaHR0cGRhLmMgbWQ1ZXZwLmMgdGhyZWFkcy5jIHN0ZHNvYXAyLmMgLWxzc2wgLWxjcnlwdG8gLWx6CisKKyovCisKK2ludCBuc19fZWNob1N0cmluZyhjaGFyICphcmcsIHN0cnVjdCBuc19fZWNob1N0cmluZyopOwpkaWZmIC0tZ2l0IGEvcGx1Z2luL2h0dHBmb3JtLmMgYi9wbHVnaW4vaHR0cGZvcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2IyODI0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2luL2h0dHBmb3JtLmMKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisKK2h0dHBmb3JtLmMKKworZ1NPQVAgSFRUUCBQT1NUIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBwbHVnaW4uCisKK1JlcXVpcmVzIGxpbmthZ2Ugd2l0aCBodHRwZ2V0LmMgKGZvciBxdWVyeV9rZXkgYW5kIHF1ZXJ5X3ZhbCkKKworTm90ZTogbXVsdGlwYXJ0L3JlbGF0ZWQgYW5kIG11bHRpcGFydC9mb3JtLWRhdGEgYXJlIGFscmVhZHkgaGFuZGxlZCBpbiBnU09BUC4KKworZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgcHVibGljIGxpY2Vuc2UuCisKK1RoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGdTT0FQIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4zCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKK0xpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoraHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL3NvYXBsaWNlbnNlLmh0bWwKK1NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCitXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKK2ZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK1RoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4uCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4sIEdlbml2aWEgaW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlDb21waWxlICYgbGluayB3aXRoIHN0YW5kLWFsb25lIGdTT0FQIHNlcnZlci4KKworCVVzYWdlIChzZXJ2ZXIgc2lkZSk6CisJc3RydWN0IHNvYXAgc29hcDsKKwlzb2FwX2luaXQoJnNvYXApOworCXNvYXBfcmVnaXN0ZXJfcGx1Z2luX2FyZygmc29hcCwgaHR0cF9mb3JtLCBodHRwX2Zvcm1faGFuZGxlcik7CisJLi4uCisJLi4uID0gc29hcF9jb3B5KCZzb2FwKTsgLy8gY29waWVzIHBsdWdpbiB0b28gYnV0IG5vdCBpdHMgZGF0YTogcGx1Z2luIGRhdGEgaXMgc2hhcmVkIHNpbmNlIGZjb3B5IGlzIG5vdCBzZXQKKwkuLi4KKwlzb2FwX2RvbmUoJnNvYXApOyAvLyBkZXRhY2ggcGx1Z2luIChjYWxscyBwbHVnaW4tPmZkZWxldGUpCisKKwlZb3UgbmVlZCB0byBkZWZpbmUgYSBIVFRQIGhhbmRsaW5nIGZ1bmN0aW9uIGF0IHRoZSBzZXJ2ZXItc2lkZToKKwlpbnQgaHR0cF9mb3JtX2hhbmRsZXIoc3RydWN0IHNvYXAqKQorCXdoaWNoIHdpbGwgYmUgY2FsbGVkIGZyb20gdGhlIHBsdWdpbiB1cG9uIGFuIEhUVFAgUE9TVCByZXF1ZXN0IHRoYXQKKwltYXRjaGVzIHRoZSBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQgY29udGVudC10eXBlLgorCVRoZSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGFuIGVycm9yIGNvZGUgb3IgU09BUF9TVE9QIHRvIHByZXZlbnQgdGhlCisJZ1NPQVAgZW5naW5lIGZyb20gcHJvY2Vzc2luZyB0aGUgbWVzc2FnZSBib2R5OworCisJVG8gcGFyc2UgZm9ybSBkYXRhIGluIHRoZSBoYW5kbGVyLCB1c2U6CisKKwljaGFyICpzID0gZm9ybShzb2FwKTsKKwl3aGlsZSAocykKKwl7IGNoYXIgKmtleSA9IHF1ZXJ5X2tleShzb2FwLCAmcyk7IC8vIGRlY29kZSBuZXh0IGZvcm0gc3RyaW5nIGtleQorCSAgY2hhciAqdmFsID0gcXVlcnlfdmFsKHNvYXAsICZzKTsgLy8gZGVjb2RlIG5leHQgZm9ybSBzdHJpbmcgdmFsdWUgKGlmIGFueSkKKyAgICAgICAgICAuLi4KKwl9CisKKwlUaGUgaGFuZGxlciBzaG91bGQgYWxzbyBwcm9kdWNlIGEgdmFsaWQgSFRUUCByZXNwb25zZSwgZm9yIGV4YW1wbGU6CisJc29hcF9yZXNwb25zZShzb2FwLCBTT0FQX0hUTUwpOyAvLyB1c2UgdGhpcyB0byByZXR1cm4gSFRNTCAuLi4KKwlzb2FwX3Jlc3BvbnNlKHNvYXAsIFNPQVBfT0spOyAvLyAuLi4gb3IgdXNlIHRoaXMgdG8gcmV0dXJuIGEgU09BUCBtZXNzYWdlCisJLi4uCisJc29hcF9zZW5kKHNvYXAsICI8SFRNTD4uLi48L0hUTUw+Iik7IC8vIGV4YW1wbGUgSFRNTAorCS4uLgorCXNvYXBfZW5kX3NlbmQoc29hcCk7CisKKyovCisKKyNpbmNsdWRlICJodHRwZm9ybS5oIgorCitjb25zdCBjaGFyIGh0dHBfZm9ybV9pZFsxNF0gPSBIVFRQX0ZPUk1fSUQ7CisKK3N0YXRpYyBpbnQgaHR0cF9mb3JtX2luaXQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBodHRwX2Zvcm1fZGF0YSAqZGF0YSwgaW50ICgqaGFuZGxlcikoc3RydWN0IHNvYXAqKSk7CitzdGF0aWMgdm9pZCBodHRwX2Zvcm1fZGVsZXRlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnApOworc3RhdGljIGludCBodHRwX2Zvcm1fcGFyc2VfaGVhZGVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworCitpbnQgaHR0cF9mb3JtKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnAsIHZvaWQgKmFyZykKK3sgcC0+aWQgPSBodHRwX2Zvcm1faWQ7CisgIHAtPmRhdGEgPSAodm9pZCopbWFsbG9jKHNpemVvZihzdHJ1Y3QgaHR0cF9mb3JtX2RhdGEpKTsKKyAgcC0+ZmRlbGV0ZSA9IGh0dHBfZm9ybV9kZWxldGU7CisgIGlmIChwLT5kYXRhKQorICAgIGlmIChodHRwX2Zvcm1faW5pdChzb2FwLCAoc3RydWN0IGh0dHBfZm9ybV9kYXRhKilwLT5kYXRhLCAoaW50ICgqKShzdHJ1Y3Qgc29hcCopKWFyZykpCisgICAgeyBmcmVlKHAtPmRhdGEpOyAvKiBlcnJvcjogY291bGQgbm90IGluaXQgKi8KKyAgICAgIHJldHVybiBTT0FQX0VPTTsgLyogcmV0dXJuIGVycm9yICovCisgICAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKworc3RhdGljIGludCBodHRwX2Zvcm1faW5pdChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IGh0dHBfZm9ybV9kYXRhICpkYXRhLCBpbnQgKCpoYW5kbGVyKShzdHJ1Y3Qgc29hcCopKQoreyBkYXRhLT5mcGFyc2VoZHIgPSBzb2FwLT5mcGFyc2VoZHI7IC8qIHNhdmUgb2xkIEhUVFAgaGVhZGVyIHBhcnNlciBjYWxsYmFjayAqLworICBzb2FwLT5mcGFyc2VoZHIgPSBodHRwX2Zvcm1fcGFyc2VfaGVhZGVyOyAvKiByZXBsYWNlIEhUVFAgaGVhZGVyIHBhcnNlciBjYWxsYmFjayB3aXRoIG91cnMgKi8KKyAgaWYgKGhhbmRsZXIpCisgICAgc29hcC0+ZmZvcm0gPSBoYW5kbGVyOworICByZXR1cm4gU09BUF9PSzsKK30KKworc3RhdGljIHZvaWQgaHR0cF9mb3JtX2RlbGV0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGx1Z2luICpwKQoreyBmcmVlKHAtPmRhdGEpOyAvKiBmcmVlIGFsbG9jYXRlZCBwbHVnaW4gZGF0YSAodGhpcyBmdW5jdGlvbiBpcyBub3QgY2FsbGVkIGZvciBzaGFyZWQgcGx1Z2luIGRhdGEsIGJ1dCBvbmx5IHdoZW4gdGhlIGZpbmFsIHNvYXBfZG9uZSgpIGlzIGludm9rZWQgb24gdGhlIG9yaWdpbmFsIHNvYXAgc3RydWN0KSAqLworfQorCitzdGF0aWMgaW50IGh0dHBfZm9ybV9wYXJzZV9oZWFkZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsKQoreyBzdHJ1Y3QgaHR0cF9mb3JtX2RhdGEgKmRhdGEgPSAoc3RydWN0IGh0dHBfZm9ybV9kYXRhKilzb2FwX2xvb2t1cF9wbHVnaW4oc29hcCwgaHR0cF9mb3JtX2lkKTsKKyAgaWYgKCFkYXRhKQorICAgIHJldHVybiBTT0FQX1BMVUdJTl9FUlJPUjsKKyAgc29hcC0+ZXJyb3IgPSBkYXRhLT5mcGFyc2VoZHIoc29hcCwga2V5LCB2YWwpOyAvKiBwYXJzZSBIVFRQIGhlYWRlciAqLworICBpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9PSykKKyAgeyBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LVR5cGUiKSkKKyAgICB7IC8qIGNoZWNrIGNvbnRlbnQgdHlwZTogeW91IGNhbiBmaWx0ZXIgYW55IHR5cGUgb2YgcGF5bG9hZHMgaGVyZSAqLworICAgICAgaWYgKCFzb2FwX3RhZ19jbXAodmFsLCAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikpCisgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9GT1JNOyAvKiBkZWxlZ2F0ZSBib2R5IHBhcnNpbmcgdG8gZm9ybSBoYW5kbGVyICovCisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKworY2hhciogZm9ybShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgY2hhciAqcyA9IE5VTEw7CisgIC8qIEl0IGlzIHVubGlrZWx5IGNodW5rZWQgYW5kL29yIGNvbXByZXNzZWQgUE9TVCBmb3JtcyBhcmUgc2VuZCBieSBicm93c2VycywgYnV0IHdlIG5lZWQgdG8gaGFuZGxlIHRoZW0gKi8KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSyB8fCBzb2FwLT56bGliX2luICE9IFNPQVBfWkxJQl9OT05FKQorICB7IGludCBjOworICAgIHNvYXAtPmxhYmlkeCA9IDA7CisgICAgaWYgKHNvYXBfYXBwZW5kX2xhYihzb2FwLCAiPyIsIDEpKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgZG8KKyAgICB7IHJlZ2lzdGVyIHNpemVfdCBrOworICAgICAgaWYgKHNvYXBfYXBwZW5kX2xhYihzb2FwLCBOVUxMLCAwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICBzID0gc29hcC0+bGFiYnVmICsgc29hcC0+bGFiaWR4OworICAgICAgayA9IHNvYXAtPmxhYmxlbiAtIHNvYXAtPmxhYmlkeDsKKyAgICAgIHNvYXAtPmxhYmlkeCA9IHNvYXAtPmxhYmxlbjsKKyAgICAgIHdoaWxlIChrLS0pCisgICAgICB7IGlmICgoYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKSkgPT0gRU9GKQorCSAgYnJlYWs7CisgICAgICAgICpzKysgPSBjOworICAgICAgfQorICAgIH0gd2hpbGUgKGMgIT0gRU9GKTsKKyAgICAqcyA9ICdcMCc7CisgICAgcyA9IHNvYXAtPmxhYmJ1ZjsKKyAgfQorICBlbHNlCisgIHsgaWYgKHNvYXAtPmxlbmd0aCkKKyAgICB7IHMgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc29hcC0+bGVuZ3RoICsgMik7CisgICAgICBpZiAocykKKyAgICAgIHsgY2hhciAqdCA9IHM7CisgICAgICAgIHNpemVfdCBpOworCWludCBjOworCSp0KysgPSAnPyc7CisgICAgICAgIGZvciAoaSA9IHNvYXAtPmxlbmd0aDsgaTsgaS0tKQorICAgICAgICB7IGlmICgoYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKSkgPT0gRU9GKQorCSAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworCSAgICByZXR1cm4gTlVMTDsKKwkgIH0KKwkgICp0KysgPSBjOworCX0KKyAgICAgICAgKnQgPSAnXDAnOworICAgICAgfQorICAgIH0KKyAgfQorICBzb2FwX2VuZF9yZWN2KHNvYXApOworICByZXR1cm4gczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvcGx1Z2luL2h0dHBmb3JtLmggYi9wbHVnaW4vaHR0cGZvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzQ4ODViCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2luL2h0dHBmb3JtLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKworaHR0cGZvcm0uaAorCitnU09BUCBIVFRQIFBPU1QgYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIHBsdWdpbi4KKworUmVxdWlyZXMgbGlua2FnZSB3aXRoIGh0dHBnZXQuYyAoZm9yIHF1ZXJ5X2tleSBhbmQgcXVlcnlfdmFsKQorCitOb3RlOiBtdWx0aXBhcnQvcmVsYXRlZCBhbmQgbXVsdGlwYXJ0L2Zvcm0tZGF0YSBhcmUgYWxyZWFkeSBoYW5kbGVkIGluIGdTT0FQLgorCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBwdWJsaWMgbGljZW5zZS4KKworVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZ1NPQVAgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjMKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcGxpY2Vuc2UuaHRtbAorU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKK1dJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQorZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFJvYmVydCBBLiB2YW4gRW5nZWxlbi4KK0NvcHlyaWdodCAoQykgMjAwMC0yMDA0IFJvYmVydCBBLiB2YW4gRW5nZWxlbiwgR2VuaXZpYSBpbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZm5kZWYgSFRUUEZPUk1fSAorI2RlZmluZSBIVFRQRk9STV9ICisKKyNpbmNsdWRlICJzdGRzb2FwMi5oIgorI2luY2x1ZGUgImh0dHBnZXQuaCIJLyogcmVxdWlyZSBzb2FwX2RlY29kZV9zdHJpbmcgKi8KKworI2RlZmluZSBIVFRQX0ZPUk1fSUQgIkhUVFAtRk9STS0xLjAiIC8qIHBsdWdpbiBpZGVudGlmaWNhdGlvbiAqLworCitleHRlcm4gY29uc3QgY2hhciBodHRwX2Zvcm1faWRbXTsKKworLyogVGhpcyBpcyB0aGUgbG9jYWwgcGx1Z2luIGRhdGEgc2hhcmVkIGFtb25nIGFsbCBjb3BpZXMgb2YgdGhlIHNvYXAgc3RydWN0OiAqLworc3RydWN0IGh0dHBfZm9ybV9kYXRhCit7IGludCAoKmZwYXJzZWhkcikoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOyAvKiB0byBzYXZlIGFuZCBjYWxsIHRoZSBpbnRlcm5hbCBIVFRQIGhlYWRlciBwYXJzZXIgKi8KK307CisKK2ludCBodHRwX2Zvcm0oc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9wbHVnaW4qLCB2b2lkKik7CisKK2NoYXIgKmZvcm0oc3RydWN0IHNvYXAqKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9wbHVnaW4vaHR0cGdldC5jIGIvcGx1Z2luL2h0dHBnZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2VlNWMyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2luL2h0dHBnZXQuYwpAQCAtMCwwICsxLDMxMyBAQAorLyoKKworaHR0cGdldC5jCisKK2dTT0FQIEhUVFAgR0VUIHBsdWdpbi4KKworZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgcHVibGljIGxpY2Vuc2UuCisKK1RoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGdTT0FQIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4zCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKK0xpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoraHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL3NvYXBsaWNlbnNlLmh0bWwKK1NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCitXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKK2ZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK1RoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4uCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4sIEdlbml2aWEgaW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlDb21waWxlICYgbGluayB3aXRoIHN0YW5kLWFsb25lIGdTT0FQIHNlcnZlciBmb3IgSFRUUCBHRVQgc3VwcG9ydC4KKwlDb21waWxlICYgbGluayB3aXRoIGdTT0FQIGNsaWVudHMgZm9yIGNsaWVudC1zaWRlIEhUVFAgR0VUIHJlcXVlc3RzLgorCisJVXNhZ2UgKHNlcnZlciBzaWRlKToKKwlzdHJ1Y3Qgc29hcCBzb2FwOworCXNvYXBfaW5pdCgmc29hcCk7CisJc29hcF9yZWdpc3Rlcl9wbHVnaW5fYXJnKCZzb2FwLCBodHRwX2dldCwgaHR0cF9nZXRfaGFuZGxlcik7CisJLi4uCisJLi4uID0gc29hcF9jb3B5KCZzb2FwKTsgLy8gY29waWVzIHBsdWdpbiB0b28gYnV0IG5vdCBpdHMgZGF0YTogcGx1Z2luIGRhdGEgaXMgc2hhcmVkIHNpbmNlIGZjb3B5IGlzIG5vdCBzZXQKKwkuLi4KKwlzb2FwX2RvbmUoJnNvYXApOyAvLyBkZXRhY2ggcGx1Z2luIChjYWxscyBwbHVnaW4tPmZkZWxldGUpCisKKwlZb3UgbmVlZCB0byBkZWZpbmUgYSBIVFRQIEdFVCBoYW5kbGluZyBmdW5jdGlvbiBhdCB0aGUgc2VydmVyLXNpZGU6CisJaW50IGh0dHBfZ2V0X2hhbmRsZXIoc3RydWN0IHNvYXAqKQorCXdoaWNoIHdpbGwgYmUgY2FsbGVkIGZyb20gdGhlIHBsdWdpbiB1cG9uIGFuIEhUVFAgR0VUIHJlcXVlc3QuCisJVGhlIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYW4gZXJyb3IgY29kZSBvciBTT0FQX09LOworCVRoaXMgZnVuY3Rpb24gc2hvdWxkIHByb2R1Y2UgYSB2YWxpZCBIVFRQIHJlc3BvbnNlLCBmb3IgZXhhbXBsZToKKwlzb2FwX3Jlc3BvbnNlKHNvYXAsIFNPQVBfSFRNTCk7IC8vIHVzZSB0aGlzIHRvIHJldHVybiBIVE1MIC4uLgorCXNvYXBfcmVzcG9uc2Uoc29hcCwgU09BUF9PSyk7IC8vIC4uLiBvciB1c2UgdGhpcyB0byByZXR1cm4gYSBTT0FQIG1lc3NhZ2UKKwkuLi4KKwlzb2FwX3NlbmQoc29hcCwgIjxIVE1MPi4uLjwvSFRNTD4iKTsgLy8gZXhhbXBsZSBIVE1MCisJLi4uCisJc29hcF9lbmRfc2VuZChzb2FwKTsKKwlUbyBnZXQgcXVlcnkgc3RyaW5nIGtleS12YWx1ZSBwYWlycyB3aXRoaW4gYSBzZXJ2aWNlIHJvdXRpbmUsIHVzZToKKwljaGFyICpzOworCXMgPSBxdWVyeShzb2FwKTsKKwl3aGlsZSAocykKKwl7IGNoYXIgKmtleSA9IHF1ZXJ5KHNvYXAsICZzKTsKKwkgIGNoYXIgKnZhbCA9IHF1ZXJ5KHNvYXAsICZzKTsKKwkgIC4uLgorCX0KKwlUaGlzIHdpbGwgZ2FyYmxlIHNvYXAtPnBhdGgsIHdoaWNoIGNvbnRhaW5zIHRoZSBIVFRQIHBhdGggb2YgdGhlIGZvcm06CisJL3BhdGg/cXVlcnkKKwl3aGVyZSBwYXRoIGFuZC9vciA/cXVlcnkgbWF5IGJlIGFic2VudC4gVGhlIHBhdGggaW5mbyBpcyBvYnRhaW5lZCBmcm9tCisJdGhlIEhUVFAgcmVxdWVzdCBVUkw6IGh0dHA6Ly9kb21haW4vcGF0aD9xdWVyeQorCVRoZSBVUkwgc2hvdWxkIG5vdCBleGNlZWQgdGhlIGxlbmd0aCBvZiBTT0FQX1RBR0xFTi4gQWRqdXN0IFNPQVBfVEFHTEVOCisJaW4gc3Rkc29hcDIuaCBpZiBuZWNlc3NhcnkuCisKKwlVc2FnZSAoY2xpZW50IHNpZGUpOgorCUZvciBTT0FQIGNhbGxzLCBkZWNsYXJlIGEgb25lLXdheSByZXNwb25zZSBtZXNzYWdlIGluIHRoZSBoZWFkZXIgZmlsZSwKKwlmb3IgZXhhbXBsZToKKwlpbnQgbnNfX21ldGhvZFJlc3BvbnNlKC4uLiBwYXJhbXMgLi4uLCB2b2lkKTsKKwlUaGUgcGFyYW1zIHdpbGwgaG9sZCB0aGUgcmV0dXJuIHZhbHVlcyByZXR1cm5lZCBieSB0aGUgc2VydmVyJ3MgU09BUAorCXJlc3BvbnNlIG1lc3NhZ2UuCisJQ2xpZW50IGNvZGU6CisJc3RydWN0IHNvYXAgc29hcDsKKwlzb2FwX2luaXQoJnNvYXApOworCXNvYXBfcmVnaXN0ZXJfcGx1Z2luKCZzb2FwLCBodHRwX2dldCk7IC8vIHJlZ2lzdGVyIHBsdWdpbgorCS4uLgorCWlmIChzb2FwX2dldF9jb25uZWN0KCZzb2FwLCBlbmRwb2ludCwgYWN0aW9uKSkKKwkgIC4uLiBjb25uZWN0IGVycm9yIC4uLgorICAgICAgICBlbHNlIGlmIChzb2FwX3JlY3ZfbnNfX21ldGhvZFJlc3BvbnNlKCZzb2FwLCAuLi4gcGFyYW1zIC4uLikpCisJICAuLi4gZXJyb3IgLi4uCisgICAgICAgIGVsc2UKKwkgIC4uLiBvayAuLi4KKyAgICAgICAgc29hcF9lbmQoJnNvYXApOworCXNvYXBfZG9uZSgmc29hcCk7CisJVG8gdXNlIGdlbmVyYWwgSFRUUCBHRVQsIGZvciBleGFtcGxlIHRvIHJldHJpZXZlIGFuIEhUTUwgZG9jdW1lbnQsIHVzZQorCXN0cnVjdCBzb2FwIHNvYXA7CisJc29hcF9pbml0KCZzb2FwKTsKKwlzb2FwX3JlZ2lzdGVyX3BsdWdpbigmc29hcCwgaHR0cF9nZXQpOyAvLyByZWdpc3RlciBwbHVnaW4KKwlpZiAoc29hcF9nZXRfY29ubmVjdCgmc29hcCwgZW5kcG9pbnQsIGFjdGlvbikpCisJICAuLi4gY29ubmVjdCBlcnJvciAuLi4KKwllbHNlCisJICAuLi4gZ2V0IHRoZSBkb2N1bWVudCBmcm9tIHRoZSBzb2FwLnNvY2tldCBmZCB1bnRpbCBFT0YgLi4uCisgICAgICAgIHNvYXBfZW5kKCZzb2FwKTsKKwlzb2FwX2RvbmUoJnNvYXApOworCisqLworCisjaW5jbHVkZSAiaHR0cGdldC5oIgorCitjb25zdCBjaGFyIGh0dHBfZ2V0X2lkWzEzXSA9IEhUVFBfR0VUX0lEOworCitzdGF0aWMgaW50IGh0dHBfZ2V0X2luaXQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBodHRwX2dldF9kYXRhICpkYXRhLCBpbnQgKCpoYW5kbGVyKShzdHJ1Y3Qgc29hcCopKTsKK3N0YXRpYyB2b2lkIGh0dHBfZ2V0X2RlbGV0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGx1Z2luICpwKTsKK3N0YXRpYyBpbnQgaHR0cF9nZXRfcGFyc2Uoc3RydWN0IHNvYXAgKnNvYXApOworc3RhdGljIGludCBodHRwX2Nvbm5lY3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworCitpbnQgaHR0cF9nZXQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3BsdWdpbiAqcCwgdm9pZCAqYXJnKQoreyBwLT5pZCA9IGh0dHBfZ2V0X2lkOworICBwLT5kYXRhID0gKHZvaWQqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGh0dHBfZ2V0X2RhdGEpKTsKKyAgLyogcC0+ZmNvcHkgPSBodHRwX2dldF9jb3B5OyBvYnNvbGV0ZSwgc2VlIG5vdGUgd2l0aCBodHRwX2dldF9jb3B5KCkgKi8KKyAgcC0+ZmRlbGV0ZSA9IGh0dHBfZ2V0X2RlbGV0ZTsKKyAgaWYgKHAtPmRhdGEpCisgICAgaWYgKGh0dHBfZ2V0X2luaXQoc29hcCwgKHN0cnVjdCBodHRwX2dldF9kYXRhKilwLT5kYXRhLCAoaW50ICgqKShzdHJ1Y3Qgc29hcCopKWFyZykpCisgICAgeyBmcmVlKHAtPmRhdGEpOyAvKiBlcnJvcjogY291bGQgbm90IGluaXQgKi8KKyAgICAgIHJldHVybiBTT0FQX0VPTTsgLyogcmV0dXJuIGVycm9yICovCisgICAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKworaW50IHNvYXBfZ2V0X2Nvbm5lY3Qoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjb25zdCBjaGFyICphY3Rpb24pCit7IHN0cnVjdCBodHRwX2dldF9kYXRhICpkYXRhID0gKHN0cnVjdCBodHRwX2dldF9kYXRhKilzb2FwX2xvb2t1cF9wbHVnaW4oc29hcCwgaHR0cF9nZXRfaWQpOworICBpZiAoIWRhdGEpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9QTFVHSU5fRVJST1I7CisgIHNvYXBfYmVnaW4oc29hcCk7CisgIGRhdGEtPmZwb3N0ID0gc29hcC0+ZnBvc3Q7CisgIHNvYXAtPmZwb3N0ID0gaHR0cF9jb25uZWN0OworICByZXR1cm4gc29hcF9jb25uZWN0KHNvYXAsIGVuZHBvaW50LCBhY3Rpb24pOworfQorCitzdGF0aWMgaW50IGh0dHBfY29ubmVjdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZW5kcG9pbnQsIGNvbnN0IGNoYXIgKmhvc3QsIGludCBwb3J0LCBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICphY3Rpb24sIHNpemVfdCBjb3VudCkKK3sgc3RydWN0IGh0dHBfZ2V0X2RhdGEgKmRhdGEgPSAoc3RydWN0IGh0dHBfZ2V0X2RhdGEqKXNvYXBfbG9va3VwX3BsdWdpbihzb2FwLCBodHRwX2dldF9pZCk7CisgIGlmICghZGF0YSkKKyAgICByZXR1cm4gU09BUF9QTFVHSU5fRVJST1I7CisgIHNvYXAtPnN0YXR1cyA9IFNPQVBfR0VUOworICBzb2FwLT5mcG9zdCA9IGRhdGEtPmZwb3N0OworICByZXR1cm4gc29hcC0+ZnBvc3Qoc29hcCwgZW5kcG9pbnQsIGhvc3QsIHBvcnQsIHBhdGgsIGFjdGlvbiwgY291bnQpOworfQorCitzdGF0aWMgaW50IGh0dHBfZ2V0X2luaXQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBodHRwX2dldF9kYXRhICpkYXRhLCBpbnQgKCpoYW5kbGVyKShzdHJ1Y3Qgc29hcCopKQoreyBkYXRhLT5mcGFyc2UgPSBzb2FwLT5mcGFyc2U7IC8qIHNhdmUgb2xkIEhUVFAgaGVhZGVyIHBhcnNlciBjYWxsYmFjayAqLworICBkYXRhLT5mZ2V0ID0gaGFuZGxlcjsKKyAgZGF0YS0+c3RhdF9nZXQgPSAwOworICBkYXRhLT5zdGF0X3Bvc3QgPSAwOworICBkYXRhLT5zdGF0X2ZhaWwgPSAwOworICBtZW1zZXQoZGF0YS0+bWluLCAwLCBzaXplb2YoZGF0YS0+bWluKSk7CisgIG1lbXNldChkYXRhLT5ob3VyLCAwLCBzaXplb2YoZGF0YS0+aG91cikpOworICBtZW1zZXQoZGF0YS0+ZGF5LCAwLCBzaXplb2YoZGF0YS0+ZGF5KSk7CisgIHNvYXAtPmZwYXJzZSA9IGh0dHBfZ2V0X3BhcnNlOyAvKiByZXBsYWNlIEhUVFAgaGVhZGVyIHBhcnNlciBjYWxsYmFjayB3aXRoIG91cnMgKi8KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qIFdlIHdpbGwgc2hhcmUgdGhlIHBsdWdpbiBkYXRhIGFtb25nIGFsbCBzb2FwIGNvcGllcyBjcmVhdGVkIHdpdGggc29hcF9jb3B5KCksIHNvIHdlIGRvbid0IGhhdmUgdG8gZGVmaW5lIHRoaXMKK3N0YXRpYyBpbnQgaHR0cF9nZXRfY29weShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGx1Z2luICpkc3QsIHN0cnVjdCBzb2FwX3BsdWdpbiAqc3JjKQoreyAqZHN0ID0gKnNyYzsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisqLworCitzdGF0aWMgdm9pZCBodHRwX2dldF9kZWxldGUoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3BsdWdpbiAqcCkKK3sgZnJlZShwLT5kYXRhKTsgLyogZnJlZSBhbGxvY2F0ZWQgcGx1Z2luIGRhdGEgKHRoaXMgZnVuY3Rpb24gaXMgbm90IGNhbGxlZCBmb3Igc2hhcmVkIHBsdWdpbiBkYXRhLCBidXQgb25seSB3aGVuIHRoZSBmaW5hbCBzb2FwX2RvbmUoKSBpcyBpbnZva2VkIG9uIHRoZSBvcmlnaW5hbCBzb2FwIHN0cnVjdCkgKi8KK30KKworc3RhdGljIGludCBodHRwX2dldF9wYXJzZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyNpZm5kZWYgV0lUSF9MRUFOCisgIHRpbWVfdCB0OworICBzdHJ1Y3QgdG0gVCwgKnBUOworI2VuZGlmCisgIHN0cnVjdCBodHRwX2dldF9kYXRhICpkYXRhID0gKHN0cnVjdCBodHRwX2dldF9kYXRhKilzb2FwX2xvb2t1cF9wbHVnaW4oc29hcCwgaHR0cF9nZXRfaWQpOworICBpZiAoIWRhdGEpCisgICAgcmV0dXJuIFNPQVBfUExVR0lOX0VSUk9SOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgdGltZSgmdCk7CisjaWZkZWYgSEFWRV9MT0NBTFRJTUVfUgorICBwVCA9IGxvY2FsdGltZV9yKCZ0LCAmVCk7CisjZWxzZQorICBwVCA9IGxvY2FsdGltZSgmdCk7CisjZW5kaWYKKyAgLyogdXBkYXRlcyBzaG91bGQgYmUgaW4gbXV0ZXgsIGJ1dCB3ZSBkb24ndCBtaW5kIHNvbWUgaW5hY2N1cmFjeSBpbiB0aGUgY291bnQgdG8gcHJlc2VydmUgcGVyZm9ybWFuY2UgKi8KKyAgZGF0YS0+ZGF5W3BULT50bV95ZGF5XSsrOworICBkYXRhLT5kYXlbKHBULT50bV95ZGF5ICsgMSkgJSAzNjVdID0gMDsKKyAgZGF0YS0+aG91cltwVC0+dG1faG91cl0rKzsKKyAgZGF0YS0+aG91clsocFQtPnRtX2hvdXIgKyAxKSAlIDI0XSA9IDA7CisgIGRhdGEtPm1pbltwVC0+dG1fbWluXSsrOworICBkYXRhLT5taW5bKHBULT50bV9taW4gKyAxKSAlIDYwXSA9IDA7CisjZW5kaWYKKyAgc29hcC0+ZXJyb3IgPSBkYXRhLT5mcGFyc2Uoc29hcCk7IC8qIHBhcnNlIEhUVFAgaGVhZGVyICovCisgIGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX09LKQorICB7IC8qIHVwZGF0ZSBzaG91bGQgYmUgaW4gbXV0ZXgsIGJ1dCB3ZSBkb24ndCBtaW5kIHNvbWUgaW5hY2N1cmFjeSBpbiB0aGUgY291bnQgKi8KKyAgICBkYXRhLT5zdGF0X3Bvc3QrKzsKKyAgfQorICBlbHNlIGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX0dFVF9NRVRIT0QgJiYgZGF0YS0+ZmdldCkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgICAgaWYgKChzb2FwLT5lcnJvciA9IGRhdGEtPmZnZXQoc29hcCkpKSAvKiBjYWxsIHVzZXItZGVmaW5lZCBIVFRQIEdFVCBoYW5kbGVyICovCisgICAgeyAvKiB1cGRhdGUgc2hvdWxkIGJlIGluIG11dGV4LCBidXQgd2UgZG9uJ3QgbWluZCBzb21lIGluYWNjdXJhY3kgaW4gdGhlIGNvdW50ICovCisgICAgICBkYXRhLT5zdGF0X2ZhaWwrKzsKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgLyogdXBkYXRlIHNob3VsZCBiZSBpbiBtdXRleCwgYnV0IHdlIGRvbid0IG1pbmQgc29tZSBpbmFjY3VyYWN5IGluIHRoZSBjb3VudCAqLworICAgIGRhdGEtPnN0YXRfZ2V0Kys7CisgICAgcmV0dXJuIFNPQVBfU1RPUDsgLyogc3RvcCBwcm9jZXNzaW5nIHRoZSByZXF1ZXN0IGFuZCBkbyBub3QgcmV0dXJuIFNPQVAgRmF1bHQgKi8KKyAgfQorICBlbHNlCisgIHsgLyogdXBkYXRlIHNob3VsZCBiZSBpbiBtdXRleCwgYnV0IHdlIGRvbid0IG1pbmQgc29tZSBpbmFjY3VyYWN5IGluIHRoZSBjb3VudCAqLworICAgIGRhdGEtPnN0YXRfZmFpbCsrOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKworY2hhciAqcXVlcnkoc3RydWN0IHNvYXAgKnNvYXApCit7IHJldHVybiBzdHJjaHIoc29hcC0+cGF0aCwgJz8nKTsKK30KKworY2hhciAqcXVlcnlfa2V5KHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICoqcykKK3sgY2hhciAqdCA9ICpzOworICBpZiAodCAmJiAqdCkKKyAgeyAqcyA9IChjaGFyKilzb2FwX2RlY29kZV9zdHJpbmcodCwgc3RybGVuKHQpLCB0ICsgMSk7CisgICAgcmV0dXJuIHQ7CisgIH0KKyAgcmV0dXJuICpzID0gTlVMTDsKK30KKworY2hhciAqcXVlcnlfdmFsKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICoqcykKK3sgY2hhciAqdCA9ICpzOworICBpZiAodCAmJiAqdCA9PSAnPScpCisgIHsgKnMgPSAoY2hhciopc29hcF9kZWNvZGVfc3RyaW5nKHQsIHN0cmxlbih0KSwgdCArIDEpOworICAgIHJldHVybiB0OworICB9CisgIHJldHVybiBOVUxMOworfQorCitpbnQgc29hcF9lbmNvZGVfc3RyaW5nKGNvbnN0IGNoYXIgKnMsIGNoYXIgKnQsIHNpemVfdCBsZW4pCit7IHJlZ2lzdGVyIGludCBjOworICByZWdpc3RlciBzaXplX3QgbiA9IGxlbjsKKyAgd2hpbGUgKChjID0gKnMrKykgJiYgbi0tID4gMSkKKyAgeyBpZiAoYyA9PSAnICcpIAorICAgICAgKnQrKyA9ICcrJzsKKyAgICBlbHNlIGlmIChjID09ICchJworICAgICAgICAgIHx8IGMgPT0gJyQnCisgICAgICAgICAgfHwgKGMgPj0gJygnICYmIGMgPD0gJy4nKQorICAgICAgICAgIHx8IChjID49ICcwJyAmJiBjIDw9ICc5JykKKyAgICAgICAgICB8fCAoYyA+PSAnQScgJiYgYyA8PSAnWicpCisgICAgICAgICAgfHwgYyA9PSAnXycKKyAgICAgICAgICB8fCAoYyA+PSAnYScgJiYgYyA8PSAneicpKQorICAgICAgKnQrKyA9IChjaGFyKWM7CisgICAgZWxzZSBpZiAobiA+IDIpCisgICAgeyAqdCsrID0gJyUnOworICAgICAgKnQrKyA9IChjaGFyKSgoYyA+PiA0KSArIChjID4gMTU5ID8gJzcnIDogJzAnKSk7CisgICAgICBjICY9IDB4RjsKKyAgICAgICp0KysgPSAoY2hhcikoYyArIChjID4gOSA/ICc3JyA6ICcwJykpOworICAgICAgbiAtPSAyOworICAgIH0KKyAgICBlbHNlCisgICAgICBicmVhazsKKyAgfQorICAqdCA9ICdcMCc7CisgIHJldHVybiBsZW4gLSBuOworfQorCitjb25zdCBjaGFyKiBzb2FwX2RlY29kZV9zdHJpbmcoY2hhciAqYnVmLCBzaXplX3QgbGVuLCBjb25zdCBjaGFyICp2YWwpCit7IGNvbnN0IGNoYXIgKnM7CisgIGNoYXIgKnQ7CisgIGZvciAocyA9IHZhbDsgKnM7IHMrKykKKyAgICBpZiAoKnMgIT0gJyAnICYmICpzICE9ICc9JykKKyAgICAgIGJyZWFrOworICBpZiAoKnMgPT0gJyInKQorICB7IHQgPSBidWY7CisgICAgcysrOworICAgIHdoaWxlICgqcyAmJiAqcyAhPSAnIicgJiYgLS1sZW4pCisgICAgICAqdCsrID0gKnMrKzsKKyAgICAqdCA9ICdcMCc7CisgICAgZG8gcysrOworICAgIHdoaWxlICgqcyAmJiAqcyAhPSAnJicgJiYgKnMgIT0gJz0nKTsKKyAgfQorICBlbHNlCisgIHsgdCA9IGJ1ZjsKKyAgICB3aGlsZSAoKnMgJiYgKnMgIT0gJyYnICYmICpzICE9ICc9JyAmJiAtLWxlbikKKyAgICB7IHN3aXRjaCAoKnMpCisgICAgICB7IGNhc2UgJysnOgorICAgICAgICAgICp0KysgPSAnICc7CisgICAgICAgIGNhc2UgJyAnOgorICAgICAgICAgIHMrKzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnJSc6CisgICAgICAgICAgKnQrKyA9ICgoc1sxXSA+PSAnQScgPyAoc1sxXSYweDcpICsgOSA6IHNbMV0gLSAnMCcpIDw8IDQpICsgKHNbMl0gPj0gJ0EnID8gKHNbMl0mMHg3KSArIDkgOiBzWzJdIC0gJzAnKTsKKyAgICAgICAgICBzICs9IDM7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgKnQrKyA9ICpzKys7CisgICAgICB9CisgICAgfQorICAgICp0ID0gJ1wwJzsKKyAgfQorICByZXR1cm4gczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvcGx1Z2luL2h0dHBnZXQuaCBiL3BsdWdpbi9odHRwZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZhZTdkZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbi9odHRwZ2V0LmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKworaHR0cGdldC5oCisKK2dTT0FQIEhUVFAgR0VUIHBsdWdpbi4KKworZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgcHVibGljIGxpY2Vuc2UuCisKK1RoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGdTT0FQIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4zCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKK0xpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoraHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL3NvYXBsaWNlbnNlLmh0bWwKK1NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCitXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKK2ZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK1RoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4uCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4sIEdlbml2aWEgaW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmIEhUVFBHRVRfSAorI2RlZmluZSBIVFRQR0VUX0gKKworI2luY2x1ZGUgInN0ZHNvYXAyLmgiCisKKyNkZWZpbmUgSFRUUF9HRVRfSUQgIkhUVFAtR0VULTEuMSIgLyogcGx1Z2luIGlkZW50aWZpY2F0aW9uICovCisKK2V4dGVybiBjb25zdCBjaGFyIGh0dHBfZ2V0X2lkW107CisKKy8qIFRoaXMgaXMgdGhlIGxvY2FsIHBsdWdpbiBkYXRhIHNoYXJlZCBhbW9uZyBhbGwgY29waWVzIG9mIHRoZSBzb2FwIHN0cnVjdDogKi8KK3N0cnVjdCBodHRwX2dldF9kYXRhCit7IGludCAoKmZwb3N0KShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCk7IC8qIGNsaWVudC1zaWRlIEhUVFAgR0VUIG92ZXJyaWRlICovCisgIGludCAoKmZwYXJzZSkoc3RydWN0IHNvYXAqKTsgLyogdG8gc2F2ZSBhbmQgY2FsbCB0aGUgaW50ZXJuYWwgSFRUUCBoZWFkZXIgcGFyc2VyICovCisgIGludCAoKmZnZXQpKHN0cnVjdCBzb2FwKik7IC8qIHVzZXItZGVmaW5lZCBzZXJ2ZXItc2lkZSBIVFRQIEdFVCBoYW5kbGVyICovCisgIHNpemVfdCBzdGF0X2dldDsgIC8qIEhUVFAgR0VUIHVzYWdlIHN0YXRpc3RpY3MgKi8KKyAgc2l6ZV90IHN0YXRfcG9zdDsgLyogSFRUUCBQT1NUIHVzYWdlIHN0YXRpc3RpY3MgKi8KKyAgc2l6ZV90IHN0YXRfZmFpbDsgLyogSFRUUCBmYWlsdXJlIHN0YXRpc3RpY3MgKi8KKyAgc2l6ZV90IG1pbls2MF07IC8qIEhpdHMgYnkgdGhlIG1pbnV0ZSAqLworICBzaXplX3QgaG91clsyNF07IC8qIEhpdHMgYnkgdGhlIGhvdXIgKi8KKyAgc2l6ZV90IGRheVszNjVdOyAvKiBIaXRzIGJ5IGRheSAqLworfTsKKworaW50IGh0dHBfZ2V0KHN0cnVjdCBzb2FwKiwgc3RydWN0IHNvYXBfcGx1Z2luKiwgdm9pZCopOworaW50IHNvYXBfZ2V0X2Nvbm5lY3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworCitjaGFyICpxdWVyeShzdHJ1Y3Qgc29hcCopOworY2hhciAqcXVlcnlfa2V5KHN0cnVjdCBzb2FwKiwgY2hhcioqKTsKK2NoYXIgKnF1ZXJ5X3ZhbChzdHJ1Y3Qgc29hcCosIGNoYXIqKik7CisKK2ludCBzb2FwX2VuY29kZV9zdHJpbmcoY29uc3QgY2hhciosIGNoYXIqLCBzaXplX3QpOworY29uc3QgY2hhciogc29hcF9kZWNvZGVfc3RyaW5nKGNoYXIqLCBzaXplX3QsIGNvbnN0IGNoYXIqKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9wbHVnaW4vaHR0cG1kNS5jIGIvcGx1Z2luL2h0dHBtZDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDA5MTk3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2luL2h0dHBtZDUuYwpAQCAtMCwwICsxLDIxNyBAQAorLyoKKworaHR0cG1kNS5jCisKK2dTT0FQIEhUVFAgQ29udGVudC1NRDUgZGlnZXN0IHBsdWdpbi4KKworVXNhZ2UgKGJvdGggY2xpZW50IGFuZCBzZXJ2ZXIsIHNlZSBodHRwbWQ1dGVzdC5oLy5jIGZvciBleGFtcGxlKToKK3NvYXBfcmVnaXN0ZXJfcGx1Z2luKCZzb2FwLCBodHRwX21kNSk7CitUaGlzIGVuYWJsZXMgSFRUUCBNRDUgY2hlY2tzdW0gZ2VuZXJhdGlvbiBhbmQgY2hlY2tpbmcgZm9yIFNPQVAvWE1MIG1lc3NhZ2VzCitXSVRIT1VUIGF0dGFjaG1lbnRzLgorCitDb21waWxlIHdpdGggLURXSVRIX09QRU5TU0wKK0xpbmsgd2l0aCBPcGVuU1NMIChmb3IgbWQ1ZXZwLmMpLCBodHRwbWQ1LmMsIGFuZCBtZDVldnAuYworCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHBhcnQgb2YgdGhlIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2VzOgorR1BMLCB0aGUgZ1NPQVAgcHVibGljIGxpY2Vuc2UsIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBwdWJsaWMgbGljZW5zZS4KKworVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZ1NPQVAgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjMKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcGxpY2Vuc2UuaHRtbAorU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKK1dJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQorZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFJvYmVydCBBLiB2YW4gRW5nZWxlbi4KK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEsIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJUmVxdWlyZXMgYW4gbWQ1IGVuZ2luZSwgc2VlIG1kNWV2cC5oCisKKwlpbnQgbWQ1X2hhbmRsZXIoc3RydWN0IHNvYXAgKnNvYXAsIHZvaWQgKipjb250ZXh0LCBlbnVtIG1kNV9hY3Rpb24gYWN0aW9uLCBjaGFyICpidWYsIHNpemVfdCBsZW4pCisJY29udGV4dCBjYW4gYmUgc2V0IGFuZCBwYXNzZWQgdG8gc3Vic2VxdWVudCBjYWxscy4gUGFyYW1ldGVyczoKKwlhY3Rpb24gPQorCU1ENV9JTklUOglpbml0IGNvbnRleHQKKwlNRDVfVVBEQVRFOgl1cGRhdGUgY29udGV4dCB3aXRoIGRhdGEgZnJvbSBidWYgd2l0aCBzaXplIGxlbgorCU1ENV9GSU5BTDoJZmlsbCBidWYgd2l0aCAxNiBieXRlcyBNRDUgaGFzaCB2YWx1ZQorCU1ENV9ERUxFVEU6CWRlbGV0ZSBjb250ZXh0CisJYnVmCQlpbnB1dCBkYXRhLCBvdXRwdXQgTUQ1IDEyOCBiaXQgaGFzaCB2YWx1ZQorCWxlbgkJbGVuZ3RoIG9mIGlucHV0IGRhdGEKKworCUV4YW1wbGUgY29kZToKKwlodHRwbWQ1dGVzdC5oLCBodHRwbWQ1dGVzdC5jCisKKwlMaW1pdGF0aW9uczoKKwlEb2VzIG5vdCB3b3JrIHdpdGggY29tYmluZWQgY2h1bmtlZCArIGNvbXByZXNzZWQgbWVzc2FnZXMuCisJV2hlbiBzZW5kaW5nIERJTUUvTUlNRSBhdHRhY2htZW50cywgeW91IE1VU1QgdXNlIHRoZSBTT0FQX0lPX1NUT1JFIGZsYWcKKwl0byBjb21wdXRlIHRoZSBNRDUgaGFzaCBvZiB0aGUgbWVzc2FnZSB3aXRoIGF0dGFjaG1lbnRzLiBUaGUgZmxhZworCWRpc2FibGVzIHN0cmVhbWluZyBESU1FLgorKi8KKworI2luY2x1ZGUgImh0dHBtZDUuaCIKKworY29uc3QgY2hhciBodHRwX21kNV9pZFsxM10gPSBIVFRQX01ENV9JRDsKKworc3RhdGljIGludCBodHRwX21kNV9pbml0KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgaHR0cF9tZDVfZGF0YSAqZGF0YSk7CitzdGF0aWMgaW50IGh0dHBfbWQ1X2NvcHkoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3BsdWdpbiAqZHN0LCBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnNyYyk7CitzdGF0aWMgdm9pZCBodHRwX21kNV9kZWxldGUoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3BsdWdpbiAqcCk7CisKK3N0YXRpYyBpbnQgaHR0cF9tZDVfcG9zdF9oZWFkZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsKTsKK3N0YXRpYyBpbnQgaHR0cF9tZDVfcGFyc2VfaGVhZGVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbCk7CitzdGF0aWMgaW50IGh0dHBfbWQ1X3ByZXBhcmVpbml0KHN0cnVjdCBzb2FwICpzb2FwKTsKK3N0YXRpYyBpbnQgaHR0cF9tZDVfcHJlcGFyZXNlbmQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7CitzdGF0aWMgaW50IGh0dHBfbWQ1X3ByZXBhcmVyZWN2KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pOworc3RhdGljIGludCBodHRwX21kNV9kaXNjb25uZWN0KHN0cnVjdCBzb2FwICpzb2FwKTsKKworaW50IGh0dHBfbWQ1KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnAsIHZvaWQgKmFyZykKK3sgcC0+aWQgPSBodHRwX21kNV9pZDsKKyAgcC0+ZGF0YSA9ICh2b2lkKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IGh0dHBfbWQ1X2RhdGEpKTsKKyAgcC0+ZmNvcHkgPSBodHRwX21kNV9jb3B5OworICBwLT5mZGVsZXRlID0gaHR0cF9tZDVfZGVsZXRlOworICBpZiAocC0+ZGF0YSkKKyAgICBpZiAoaHR0cF9tZDVfaW5pdChzb2FwLCAoc3RydWN0IGh0dHBfbWQ1X2RhdGEqKXAtPmRhdGEpKQorICAgIHsgU09BUF9GUkVFKHNvYXAsIHAtPmRhdGEpOyAvKiBlcnJvcjogY291bGQgbm90IGluaXQgKi8KKyAgICAgIHJldHVybiBTT0FQX0VPTTsgLyogcmV0dXJuIGVycm9yICovCisgICAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKworc3RhdGljIGludCBodHRwX21kNV9pbml0KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgaHR0cF9tZDVfZGF0YSAqZGF0YSkKK3sgZGF0YS0+ZnBvc3RoZHIgPSBzb2FwLT5mcG9zdGhkcjsKKyAgc29hcC0+ZnBvc3RoZHIgPSBodHRwX21kNV9wb3N0X2hlYWRlcjsKKyAgZGF0YS0+ZnBhcnNlaGRyID0gc29hcC0+ZnBhcnNlaGRyOworICBzb2FwLT5mcGFyc2VoZHIgPSBodHRwX21kNV9wYXJzZV9oZWFkZXI7CisgIGRhdGEtPmZwcmVwYXJlaW5pdCA9IHNvYXAtPmZwcmVwYXJlaW5pdDsKKyAgc29hcC0+ZnByZXBhcmVpbml0ID0gaHR0cF9tZDVfcHJlcGFyZWluaXQ7CisgIGRhdGEtPmZwcmVwYXJlc2VuZCA9IHNvYXAtPmZwcmVwYXJlc2VuZDsKKyAgc29hcC0+ZnByZXBhcmVzZW5kID0gaHR0cF9tZDVfcHJlcGFyZXNlbmQ7CisgIGRhdGEtPmNvbnRleHQgPSBOVUxMOworICBtZW1zZXQoZGF0YS0+ZGlnZXN0LCAwLCBzaXplb2YoZGF0YS0+ZGlnZXN0KSk7CisgIHJldHVybiBTT0FQX09LOworfQorCitzdGF0aWMgaW50IGh0dHBfbWQ1X2NvcHkoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3BsdWdpbiAqZHN0LCBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnNyYykKK3sgKmRzdCA9ICpzcmM7CisgIGRzdC0+ZGF0YSA9ICh2b2lkKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IGh0dHBfbWQ1X2RhdGEpKTsKKyAgbWVtY3B5KGRzdC0+ZGF0YSwgc3JjLT5kYXRhLCBzaXplb2Yoc3RydWN0IGh0dHBfbWQ1X2RhdGEpKTsKKyAgKChzdHJ1Y3QgaHR0cF9tZDVfZGF0YSopZHN0LT5kYXRhKS0+Y29udGV4dCA9IE5VTEw7CisgIHJldHVybiBTT0FQX09LOworfQorCitzdGF0aWMgdm9pZCBodHRwX21kNV9kZWxldGUoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3BsdWdpbiAqcCkKK3sgc3RydWN0IGh0dHBfbWQ1X2RhdGEgKmRhdGEgPSAoc3RydWN0IGh0dHBfbWQ1X2RhdGEqKXNvYXBfbG9va3VwX3BsdWdpbihzb2FwLCBodHRwX21kNV9pZCk7CisgIGlmIChkYXRhKQorICB7IG1kNV9oYW5kbGVyKHNvYXAsICZkYXRhLT5jb250ZXh0LCBNRDVfREVMRVRFLCBOVUxMLCAwKTsKKyAgICBTT0FQX0ZSRUUoc29hcCwgZGF0YSk7CisgIH0KK30KKworc3RhdGljIGludCBodHRwX21kNV9wb3N0X2hlYWRlcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWwpCit7IHN0cnVjdCBodHRwX21kNV9kYXRhICpkYXRhID0gKHN0cnVjdCBodHRwX21kNV9kYXRhKilzb2FwX2xvb2t1cF9wbHVnaW4oc29hcCwgaHR0cF9tZDVfaWQpOworICBjaGFyIGJ1ZjY0WzI1XTsgLyogMjQgYmFzZTY0IGNoYXJzICsgJ1wwJyAqLworICBpbnQgZXJyOworICBpZiAoIWRhdGEpCisgICAgcmV0dXJuIFNPQVBfUExVR0lOX0VSUk9SOworICBpZiAoIWtleSkgLyogbGFzdCBsaW5lICovCisgIHsgaWYgKChlcnIgPSBtZDVfaGFuZGxlcihzb2FwLCAmZGF0YS0+Y29udGV4dCwgTUQ1X0ZJTkFMLCBkYXRhLT5kaWdlc3QsIDApKSkKKyAgICAgIHJldHVybiBlcnI7CisgICAgZGF0YS0+ZnBvc3RoZHIoc29hcCwgIkNvbnRlbnQtTUQ1Iiwgc29hcF9zMmJhc2U2NChzb2FwLCBkYXRhLT5kaWdlc3QsIGJ1ZjY0LCAxNikpOworICB9CisgIHJldHVybiBkYXRhLT5mcG9zdGhkcihzb2FwLCBrZXksIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgaHR0cF9tZDVfcGFyc2VfaGVhZGVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbCkKK3sgc3RydWN0IGh0dHBfbWQ1X2RhdGEgKmRhdGEgPSAoc3RydWN0IGh0dHBfbWQ1X2RhdGEqKXNvYXBfbG9va3VwX3BsdWdpbihzb2FwLCBodHRwX21kNV9pZCk7CisgIGlmICghZGF0YSkKKyAgICByZXR1cm4gU09BUF9QTFVHSU5fRVJST1I7CisgIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtTUQ1IikpCisgIHsgc29hcF9iYXNlNjQycyhzb2FwLCB2YWwsIGRhdGEtPmRpZ2VzdCwgMTYsIE5VTEwpOworICAgIGRhdGEtPmZwcmVwYXJlcmVjdiA9IHNvYXAtPmZwcmVwYXJlcmVjdjsKKyAgICBzb2FwLT5mcHJlcGFyZXJlY3YgPSBodHRwX21kNV9wcmVwYXJlcmVjdjsKKyAgICBkYXRhLT5mZGlzY29ubmVjdCA9IHNvYXAtPmZkaXNjb25uZWN0OworICAgIHNvYXAtPmZkaXNjb25uZWN0ID0gaHR0cF9tZDVfZGlzY29ubmVjdDsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICByZXR1cm4gZGF0YS0+ZnBhcnNlaGRyKHNvYXAsIGtleSwgdmFsKTsKK30KKworc3RhdGljIGludCBodHRwX21kNV9wcmVwYXJlaW5pdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IGh0dHBfbWQ1X2RhdGEgKmRhdGEgPSAoc3RydWN0IGh0dHBfbWQ1X2RhdGEqKXNvYXBfbG9va3VwX3BsdWdpbihzb2FwLCBodHRwX21kNV9pZCk7CisgIGlmICghZGF0YSkKKyAgICByZXR1cm4gU09BUF9QTFVHSU5fRVJST1I7CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pICE9IFNPQVBfSU9fU1RPUkUgJiYgKHNvYXAtPm1vZGUgJiAoU09BUF9FTkNfRElNRSB8IFNPQVBfRU5DX01JTUUpKSkKKyAgeyAvKiBUT0RPOiBoYW5kbGUgYXR0YWNobWVudHMgYXV0b21hdGljYWxseSwgZG9lcyBub3Qgd29yayB5ZXQgKi8KKyAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0lPOworICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19TVE9SRTsKKyAgfQorICBlbHNlCisgIHsgbWQ1X2hhbmRsZXIoc29hcCwgJmRhdGEtPmNvbnRleHQsIE1ENV9JTklULCBOVUxMLCAwKTsKKyAgICBpZiAoc29hcC0+ZnByZXBhcmVyZWN2ID09IGh0dHBfbWQ1X3ByZXBhcmVyZWN2KQorICAgICAgc29hcC0+ZnByZXBhcmVyZWN2ID0gZGF0YS0+ZnByZXBhcmVyZWN2OworICAgIGlmIChzb2FwLT5mZGlzY29ubmVjdCA9PSBodHRwX21kNV9kaXNjb25uZWN0KQorICAgICAgc29hcC0+ZmRpc2Nvbm5lY3QgPSBkYXRhLT5mZGlzY29ubmVjdDsKKyAgICBpZiAoZGF0YS0+ZnByZXBhcmVpbml0KQorICAgICAgcmV0dXJuIGRhdGEtPmZwcmVwYXJlaW5pdChzb2FwKTsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKworc3RhdGljIGludCBodHRwX21kNV9wcmVwYXJlc2VuZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreyBzdHJ1Y3QgaHR0cF9tZDVfZGF0YSAqZGF0YSA9IChzdHJ1Y3QgaHR0cF9tZDVfZGF0YSopc29hcF9sb29rdXBfcGx1Z2luKHNvYXAsIGh0dHBfbWQ1X2lkKTsKKyAgaWYgKCFkYXRhKQorICAgIHJldHVybiBTT0FQX1BMVUdJTl9FUlJPUjsKKyAgbWQ1X2hhbmRsZXIoc29hcCwgJmRhdGEtPmNvbnRleHQsIE1ENV9VUERBVEUsIChjaGFyKilidWYsIGxlbik7CisgIGlmIChkYXRhLT5mcHJlcGFyZXNlbmQpCisgICAgcmV0dXJuIGRhdGEtPmZwcmVwYXJlc2VuZChzb2FwLCBidWYsIGxlbik7CisgIHJldHVybiBTT0FQX09LOworfQorCitzdGF0aWMgaW50IGh0dHBfbWQ1X3ByZXBhcmVyZWN2KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7IHN0cnVjdCBodHRwX21kNV9kYXRhICpkYXRhID0gKHN0cnVjdCBodHRwX21kNV9kYXRhKilzb2FwX2xvb2t1cF9wbHVnaW4oc29hcCwgaHR0cF9tZDVfaWQpOworICBpZiAoIWRhdGEpCisgICAgcmV0dXJuIFNPQVBfUExVR0lOX0VSUk9SOworICBtZDVfaGFuZGxlcihzb2FwLCAmZGF0YS0+Y29udGV4dCwgTUQ1X1VQREFURSwgKGNoYXIqKWJ1ZiwgbGVuKTsKKyAgaWYgKGRhdGEtPmZwcmVwYXJlcmVjdikKKyAgICByZXR1cm4gZGF0YS0+ZnByZXBhcmVyZWN2KHNvYXAsIGJ1ZiwgbGVuKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK3N0YXRpYyBpbnQgaHR0cF9tZDVfZGlzY29ubmVjdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IGh0dHBfbWQ1X2RhdGEgKmRhdGEgPSAoc3RydWN0IGh0dHBfbWQ1X2RhdGEqKXNvYXBfbG9va3VwX3BsdWdpbihzb2FwLCBodHRwX21kNV9pZCk7CisgIGNoYXIgZGlnZXN0WzE2XTsKKyAgaWYgKCFkYXRhKQorICAgIHJldHVybiBTT0FQX1BMVUdJTl9FUlJPUjsKKyAgbWQ1X2hhbmRsZXIoc29hcCwgJmRhdGEtPmNvbnRleHQsIE1ENV9GSU5BTCwgZGlnZXN0LCAwKTsKKyAgc29hcC0+ZnByZXBhcmVyZWN2ID0gZGF0YS0+ZnByZXBhcmVyZWN2OworICBzb2FwLT5mZGlzY29ubmVjdCA9IGRhdGEtPmZkaXNjb25uZWN0OworICBpZiAobWVtY21wKGRpZ2VzdCwgZGF0YS0+ZGlnZXN0LCAxNikpCisgICAgcmV0dXJuIHNvYXBfc2VuZGVyX2ZhdWx0KHNvYXAsICJNRDUgZGlnZXN0IG1pc21hdGNoOiBtZXNzYWdlIGNvcnJ1cHRlZCIsIE5VTEwpOworICBpZiAoc29hcC0+ZmRpc2Nvbm5lY3QpCisgICAgcmV0dXJuIHNvYXAtPmZkaXNjb25uZWN0KHNvYXApOworICByZXR1cm4gU09BUF9PSzsKK30KZGlmZiAtLWdpdCBhL3BsdWdpbi9odHRwbWQ1LmggYi9wbHVnaW4vaHR0cG1kNS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ODYwNGUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW4vaHR0cG1kNS5oCkBAIC0wLDAgKzEsNzggQEAKKy8qCisKK2h0dHBtZDUuaAorCitnU09BUCBIVFRQIENvbnRlbnQtTUQ1IGRpZ2VzdCBwbHVnaW4uCisKK1VzYWdlIChib3RoIGNsaWVudCBhbmQgc2VydmVyLCBzZWUgaHR0cG1kNXRlc3QuaC8uYyBmb3IgZXhhbXBsZSk6Citzb2FwX3JlZ2lzdGVyX3BsdWdpbigmc29hcCwgaHR0cF9tZDUpOworVGhpcyBlbmFibGVzIEhUVFAgTUQ1IGNoZWNrc3VtIGdlbmVyYXRpb24gYW5kIGNoZWNraW5nIGZvciBTT0FQL1hNTCBtZXNzYWdlcworV0lUSE9VVCBhdHRhY2htZW50cy4KKworQ29tcGlsZSB3aXRoIC1EV0lUSF9PUEVOU1NMCitMaW5rIHdpdGggT3BlblNTTCAoZm9yIG1kNWV2cC5jKSwgaHR0cG1kNS5jLCBhbmQgbWQ1ZXZwLmMKKworZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlczoKK0dQTCwgdGhlIGdTT0FQIHB1YmxpYyBsaWNlbnNlLCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgcHVibGljIGxpY2Vuc2UuCisKK1RoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGdTT0FQIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4zCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKK0xpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoraHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL3NvYXBsaWNlbnNlLmh0bWwKK1NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCitXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKK2ZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK1RoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4uCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhLCBJbmMuLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZm5kZWYgSFRUUE1ENV9ICisjZGVmaW5lIEhUVFBNRDVfSAorCisjaW5jbHVkZSAic3Rkc29hcDIuaCIKKyNpbmNsdWRlICJtZDVldnAuaCIKKworI2RlZmluZSBIVFRQX01ENV9JRCAiSFRUUC1NRDUtMS4xIiAvKiBwbHVnaW4gaWRlbnRpZmljYXRpb24gKi8KKworZXh0ZXJuIGNvbnN0IGNoYXIgaHR0cF9tZDVfaWRbXTsKKworaW50IGh0dHBfbWQ1KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnAsIHZvaWQgKmFyZyk7CisKK3N0cnVjdCBodHRwX21kNV9kYXRhCit7IGludCAoKmZwb3N0aGRyKShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CisgIGludCAoKmZwYXJzZWhkcikoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworICBpbnQgKCpmcHJlcGFyZWluaXQpKHN0cnVjdCBzb2FwKik7CisgIGludCAoKmZwcmVwYXJlc2VuZCkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc2l6ZV90KTsKKyAgaW50ICgqZnByZXBhcmVyZWN2KShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworICBpbnQgKCpmZGlzY29ubmVjdCkoc3RydWN0IHNvYXAqKTsKKyAgdm9pZCAqY29udGV4dDsKKyAgY2hhciBkaWdlc3RbMTZdOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9wbHVnaW4vaHR0cG1kNXRlc3QuYyBiL3BsdWdpbi9odHRwbWQ1dGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZDgyN2MKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW4vaHR0cG1kNXRlc3QuYwpAQCAtMCwwICsxLDczIEBACisvKgorCitodHRwbWQ1dGVzdC5jCisKK2dTT0FQIEhUVFAgQ29udGVudC1NRDUgZGlnZXN0IHBsdWdpbiBleGFtcGxlIGFwcGxpY2F0aW9uLgorCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhLCBJbmMuLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgcHVibGljIGxpY2Vuc2UuCisKK1RoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGdTT0FQIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4zCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKK0xpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoraHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL3NvYXBsaWNlbnNlLmh0bWwKK1NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCitXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKK2ZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK1RoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4uCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhLCBJbmMuLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JlcXVpcmVzIE9wZW5TU0wKKworQ29tcGlsZToKKworc29hcGNwcDIgLWMgaHR0cG1kNXRlc3QuaAorY2MgLURXSVRIX09QRU5TU0wgLW8gaHR0cG1kNXRlc3QgaHR0cG1kNXRlc3QuYyBzb2FwQy5jIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmMgaHR0cG1kNS5jIG1kNWV2cC5jIHN0ZHNvYXAyLmMgLWxzc2wgLWxjcnlwdG8gLWx6CisKKyovCisKKyNpbmNsdWRlICJodHRwbWQ1LmgiCisjaW5jbHVkZSAic29hcEguaCIKKyNpbmNsdWRlICJucy5uc21hcCIKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreyBzdHJ1Y3Qgc29hcCBzb2FwOworICBzdHJ1Y3QgbnNfX2VjaG9TdHJpbmcgcjsKKyAgc29hcF9pbml0KCZzb2FwKTsKKyAgc29hcF9yZWdpc3Rlcl9wbHVnaW4oJnNvYXAsIGh0dHBfbWQ1KTsKKyAgaWYgKGFyZ2MgPCAyKQorICAgIHNvYXBfc2VydmUoJnNvYXApOworICBlbHNlIGlmIChzb2FwX2NhbGxfbnNfX2VjaG9TdHJpbmcoJnNvYXAsICJodHRwOi8vIiwgTlVMTCwgYXJndlsxXSwgJnIpKQorICAgIHNvYXBfcHJpbnRfZmF1bHQoJnNvYXAsIHN0ZGVycik7CisgIHNvYXBfZW5kKCZzb2FwKTsKKyAgc29hcF9kb25lKCZzb2FwKTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBuc19fZWNob1N0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqYXJnLCBzdHJ1Y3QgbnNfX2VjaG9TdHJpbmcgKnJlc3BvbnNlKQoreyByZXNwb25zZS0+YXJnID0gYXJnOworICByZXR1cm4gU09BUF9PSzsKK30KZGlmZiAtLWdpdCBhL3BsdWdpbi9odHRwbWQ1dGVzdC5oIGIvcGx1Z2luL2h0dHBtZDV0ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhlNWY2YwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbi9odHRwbWQ1dGVzdC5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisKK2h0dHBtZDV0ZXN0LmgKKworZ1NPQVAgSFRUUCBDb250ZW50LU1ENSBkaWdlc3QgcGx1Z2luIGV4YW1wbGUgYXBwbGljYXRpb24uCisKK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMC0yMDA0LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEsIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBwdWJsaWMgbGljZW5zZS4KKworVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZ1NPQVAgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjMKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcGxpY2Vuc2UuaHRtbAorU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKK1dJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQorZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFJvYmVydCBBLiB2YW4gRW5nZWxlbi4KK0NvcHlyaWdodCAoQykgMjAwMC0yMDA0LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEsIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ29tcGlsZToKKworc29hcGNwcDIgLWMgaHR0cG1kNXRlc3QuaAorY2MgLURXSVRIX09QRU5TU0wgLW8gaHR0cG1kNXRlc3QgaHR0cG1kNXRlc3QuYyBzb2FwQy5jIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmMgaHR0cG1kNS5jIG1kNWV2cC5jIHN0ZHNvYXAyLmMgLWxzc2wgLWxjcnlwdG8gLWx6CisKKyovCisKK2ludCBuc19fZWNob1N0cmluZyhjaGFyICphcmcsIHN0cnVjdCBuc19fZWNob1N0cmluZyopOwpkaWZmIC0tZ2l0IGEvcGx1Z2luL2h0dHBwb3N0LmMgYi9wbHVnaW4vaHR0cHBvc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzQyZTczCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2luL2h0dHBwb3N0LmMKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisKK2h0dHBwb3N0LmMKKworZ1NPQVAgSFRUUCBQT1NUIHBsdWdpbiBmb3Igbm9uLVNPQVAgcGF5bG9hZHMuCitOb3RlOiBtdWx0aXBhcnQvcmVsYXRlZCBhbmQgbXVsdGlwYXJ0L2Zvcm0tZGF0YSBhcmUgYWxyZWFkeSBoYW5kbGVkIGluIGdTT0FQLgorCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBwdWJsaWMgbGljZW5zZS4KKworVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZ1NPQVAgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjMKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcGxpY2Vuc2UuaHRtbAorU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKK1dJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQorZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFJvYmVydCBBLiB2YW4gRW5nZWxlbi4KK0NvcHlyaWdodCAoQykgMjAwMC0yMDA0IFJvYmVydCBBLiB2YW4gRW5nZWxlbiwgR2VuaXZpYSBpbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCUNvbXBpbGUgJiBsaW5rIHdpdGggc3RhbmQtYWxvbmUgZ1NPQVAgc2VydmVyLgorCisJVXNhZ2UgKHNlcnZlciBzaWRlKToKKwlzdHJ1Y3Qgc29hcCBzb2FwOworCXNvYXBfaW5pdCgmc29hcCk7CisJc29hcF9yZWdpc3Rlcl9wbHVnaW5fYXJnKCZzb2FwLCBodHRwX3Bvc3QsIGh0dHBfcG9zdF9oYW5kbGVyKTsKKwkuLi4KKwkuLi4gPSBzb2FwX2NvcHkoJnNvYXApOyAvLyBjb3BpZXMgcGx1Z2luIHRvbyBidXQgbm90IGl0cyBkYXRhOiBwbHVnaW4gZGF0YSBpcyBzaGFyZWQgc2luY2UgZmNvcHkgaXMgbm90IHNldAorCS4uLgorCXNvYXBfZG9uZSgmc29hcCk7IC8vIGRldGFjaCBwbHVnaW4gKGNhbGxzIHBsdWdpbi0+ZmRlbGV0ZSkKKworCVlvdSBuZWVkIHRvIGRlZmluZSBhIEhUVFAgaGFuZGxpbmcgZnVuY3Rpb24gYXQgdGhlIHNlcnZlci1zaWRlOgorCWludCBodHRwX3Bvc3RfaGFuZGxlcihzdHJ1Y3Qgc29hcCopCisJd2hpY2ggd2lsbCBiZSBjYWxsZWQgZnJvbSB0aGUgcGx1Z2luIHVwb24gYW4gSFRUUCBQT1NUIHJlcXVlc3QgdGhhdAorCW1hdGNoZXMgdGhlIGNvbnRlbnQtdHlwZSByZXF1aXJlbWVudHMuCisJVGhlIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYW4gZXJyb3IgY29kZSBvciBTT0FQX1NUT1AgdG8gcHJldmVudCB0aGUKKwlnU09BUCBlbmdpbmUgZnJvbSBwcm9jZXNzaW5nIHRoZSBtZXNzYWdlIGJvZHk7CisKKwlUaGlzIGZ1bmN0aW9uIHNob3VsZCBhbHNvIHByb2R1Y2UgYSB2YWxpZCBIVFRQIHJlc3BvbnNlLCBmb3IgZXhhbXBsZToKKwlzb2FwX3Jlc3BvbnNlKHNvYXAsIFNPQVBfSFRNTCk7IC8vIHVzZSB0aGlzIHRvIHJldHVybiBIVE1MIC4uLgorCXNvYXBfcmVzcG9uc2Uoc29hcCwgU09BUF9PSyk7IC8vIC4uLiBvciB1c2UgdGhpcyB0byByZXR1cm4gYSBTT0FQIG1lc3NhZ2UKKwkuLi4KKwlzb2FwX3NlbmQoc29hcCwgIjxIVE1MPi4uLjwvSFRNTD4iKTsgLy8gZXhhbXBsZSBIVE1MCisJLi4uCisJc29hcF9lbmRfc2VuZChzb2FwKTsKKworKi8KKworI2luY2x1ZGUgImh0dHBwb3N0LmgiCisKK2NvbnN0IGNoYXIgaHR0cF9wb3N0X2lkWzE0XSA9IEhUVFBfUE9TVF9JRDsKKworc3RhdGljIGludCBodHRwX3Bvc3RfaW5pdChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IGh0dHBfcG9zdF9kYXRhICpkYXRhLCBpbnQgKCpoYW5kbGVyKShzdHJ1Y3Qgc29hcCopKTsKK3N0YXRpYyB2b2lkIGh0dHBfcG9zdF9kZWxldGUoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3BsdWdpbiAqcCk7CitzdGF0aWMgaW50IGh0dHBfcG9zdF9wYXJzZV9oZWFkZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitzdGF0aWMgaW50IGh0dHBfcG9zdF9oYW5kbGVyKHN0cnVjdCBzb2FwICpzb2FwKTsKKworaW50IGh0dHBfcG9zdChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGx1Z2luICpwLCB2b2lkICphcmcpCit7IHAtPmlkID0gaHR0cF9wb3N0X2lkOworICBwLT5kYXRhID0gKHZvaWQqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGh0dHBfcG9zdF9kYXRhKSk7CisgIHAtPmZkZWxldGUgPSBodHRwX3Bvc3RfZGVsZXRlOworICBpZiAocC0+ZGF0YSkKKyAgICBpZiAoaHR0cF9wb3N0X2luaXQoc29hcCwgKHN0cnVjdCBodHRwX3Bvc3RfZGF0YSopcC0+ZGF0YSwgKGludCAoKikoc3RydWN0IHNvYXAqKSlhcmcpKQorICAgIHsgZnJlZShwLT5kYXRhKTsgLyogZXJyb3I6IGNvdWxkIG5vdCBpbml0ICovCisgICAgICByZXR1cm4gU09BUF9FT007IC8qIHJldHVybiBlcnJvciAqLworICAgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK3N0YXRpYyBpbnQgaHR0cF9wb3N0X2luaXQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBodHRwX3Bvc3RfZGF0YSAqZGF0YSwgaW50ICgqaGFuZGxlcikoc3RydWN0IHNvYXAqKSkKK3sgZGF0YS0+ZnBhcnNlaGRyID0gc29hcC0+ZnBhcnNlaGRyOyAvKiBzYXZlIG9sZCBIVFRQIGhlYWRlciBwYXJzZXIgY2FsbGJhY2sgKi8KKyAgc29hcC0+ZnBhcnNlaGRyID0gaHR0cF9wb3N0X3BhcnNlX2hlYWRlcjsgLyogcmVwbGFjZSBIVFRQIGhlYWRlciBwYXJzZXIgY2FsbGJhY2sgd2l0aCBvdXJzICovCisgIGlmIChoYW5kbGVyKQorICAgIHNvYXAtPmZmb3JtID0gaGFuZGxlcjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK3N0YXRpYyB2b2lkIGh0dHBfcG9zdF9kZWxldGUoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3BsdWdpbiAqcCkKK3sgZnJlZShwLT5kYXRhKTsgLyogZnJlZSBhbGxvY2F0ZWQgcGx1Z2luIGRhdGEgKHRoaXMgZnVuY3Rpb24gaXMgbm90IGNhbGxlZCBmb3Igc2hhcmVkIHBsdWdpbiBkYXRhLCBidXQgb25seSB3aGVuIHRoZSBmaW5hbCBzb2FwX2RvbmUoKSBpcyBpbnZva2VkIG9uIHRoZSBvcmlnaW5hbCBzb2FwIHN0cnVjdCkgKi8KK30KKworc3RhdGljIGludCBodHRwX3Bvc3RfcGFyc2VfaGVhZGVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbCkKK3sgc3RydWN0IGh0dHBfcG9zdF9kYXRhICpkYXRhID0gKHN0cnVjdCBodHRwX3Bvc3RfZGF0YSopc29hcF9sb29rdXBfcGx1Z2luKHNvYXAsIGh0dHBfcG9zdF9pZCk7CisgIGlmICghZGF0YSkKKyAgICByZXR1cm4gU09BUF9QTFVHSU5fRVJST1I7CisgIHNvYXAtPmVycm9yID0gZGF0YS0+ZnBhcnNlaGRyKHNvYXAsIGtleSwgdmFsKTsgLyogcGFyc2UgSFRUUCBoZWFkZXIgKi8KKyAgaWYgKHNvYXAtPmVycm9yID09IFNPQVBfT0spCisgIHsgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1UeXBlIikpCisgICAgeyAvKiBjaGVjayBjb250ZW50IHR5cGU6IHlvdSBjYW4gZmlsdGVyIGFueSB0eXBlIG9mIHBheWxvYWRzIGhlcmUgKi8KKyAgICAgIGlmICghc29hcF90YWdfY21wKHZhbCwgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpKQorICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfRk9STTsgLyogZGVsZWdhdGUgYm9keSBwYXJzaW5nIHRvIGhhbmRsZXIgKi8KKyAgICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAodmFsLCAiaW1hZ2UvKiIpKQorICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfRk9STTsgLyogZGVsZWdhdGUgaW1hZ2VzIG9mIGFueSB0eXBlICovCisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvcGx1Z2luL2h0dHBwb3N0LmggYi9wbHVnaW4vaHR0cHBvc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzQ2ODliCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2luL2h0dHBwb3N0LmgKQEAgLTAsMCArMSw2MSBAQAorLyoKKworaHR0cHBvc3QuaAorCitnU09BUCBIVFRQIFBPU1QgcGx1Z2luIGZvciBub24tU09BUCBwYXlsb2Fkcy4KK05vdGU6IG11bHRpcGFydC9yZWxhdGVkIGFuZCBtdWx0aXBhcnQvZm9ybS1kYXRhIGFyZSBhbHJlYWR5IGhhbmRsZWQgaW4gZ1NPQVAuCisKK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwNC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIHB1YmxpYyBsaWNlbnNlLgorCitUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBnU09BUCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMworKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCitMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK2h0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9zb2FwbGljZW5zZS5odG1sCitTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAorV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCitmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLgorQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLCBHZW5pdmlhIGluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZiBIVFRQUE9TVF9ICisjZGVmaW5lIEhUVFBQT1NUX0gKKworI2luY2x1ZGUgInN0ZHNvYXAyLmgiCisKKyNkZWZpbmUgSFRUUF9QT1NUX0lEICJIVFRQLVBPU1QtMS4wIiAvKiBwbHVnaW4gaWRlbnRpZmljYXRpb24gKi8KKworZXh0ZXJuIGNvbnN0IGNoYXIgaHR0cF9wb3N0X2lkW107CisKKy8qIFRoaXMgaXMgdGhlIGxvY2FsIHBsdWdpbiBkYXRhIHNoYXJlZCBhbW9uZyBhbGwgY29waWVzIG9mIHRoZSBzb2FwIHN0cnVjdDogKi8KK3N0cnVjdCBodHRwX3Bvc3RfZGF0YQoreyBpbnQgKCpmcGFyc2VoZHIpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsgLyogdG8gc2F2ZSBhbmQgY2FsbCB0aGUgaW50ZXJuYWwgSFRUUCBoZWFkZXIgcGFyc2VyICovCit9OworCitpbnQgaHR0cF9wb3N0KHN0cnVjdCBzb2FwKiwgc3RydWN0IHNvYXBfcGx1Z2luKiwgdm9pZCopOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3BsdWdpbi9sb2dnaW5nLmMgYi9wbHVnaW4vbG9nZ2luZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwOTI1MTAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW4vbG9nZ2luZy5jCkBAIC0wLDAgKzEsODQgQEAKKy8qCisKK2xvZ2dpbmcuYworCitNZXNzYWdlIGxvZ2dpbmcgcGx1Z2luIGZvciB3ZWJzZXJ2ZXIuCisKK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwNC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbmNsdWRlICJsb2dnaW5nLmgiCisKK2NvbnN0IGNoYXIgbG9nZ2luZ19pZFtdID0gTE9HR0lOR19JRDsKKworc3RhdGljIGludCBsb2dnaW5nX2luaXQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBsb2dnaW5nX2RhdGEgKmRhdGEpOworc3RhdGljIHZvaWQgbG9nZ2luZ19kZWxldGUoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3BsdWdpbiAqcCk7CitzdGF0aWMgaW50IGxvZ2dpbmdfc2VuZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKTsKK3N0YXRpYyBzaXplX3QgbG9nZ2luZ19yZWN2KHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpidWYsIHNpemVfdCBsZW4pOworCitpbnQgbG9nZ2luZyhzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGx1Z2luICpwLCB2b2lkICphcmcpCit7IHAtPmlkID0gbG9nZ2luZ19pZDsKKyAgcC0+ZGF0YSA9ICh2b2lkKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBsb2dnaW5nX2RhdGEpKTsKKyAgcC0+ZmRlbGV0ZSA9IGxvZ2dpbmdfZGVsZXRlOworICBpZiAocC0+ZGF0YSkKKyAgICBpZiAobG9nZ2luZ19pbml0KHNvYXAsIChzdHJ1Y3QgbG9nZ2luZ19kYXRhKilwLT5kYXRhKSkKKyAgICB7IGZyZWUocC0+ZGF0YSk7IC8qIGVycm9yOiBjb3VsZCBub3QgaW5pdCAqLworICAgICAgcmV0dXJuIFNPQVBfRU9NOyAvKiByZXR1cm4gZXJyb3IgKi8KKyAgICB9CisgIHJldHVybiBTT0FQX09LOworfQorCitzdGF0aWMgaW50IGxvZ2dpbmdfaW5pdChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IGxvZ2dpbmdfZGF0YSAqZGF0YSkKK3sgZGF0YS0+aW5ib3VuZCA9IE5VTEw7CisgIGRhdGEtPm91dGJvdW5kID0gTlVMTDsKKyAgZGF0YS0+c3RhdF9zZW50ID0gMDsKKyAgZGF0YS0+c3RhdF9yZWN2ID0gMDsKKyAgZGF0YS0+ZnNlbmQgPSBzb2FwLT5mc2VuZDsgLyogc2F2ZSBvbGQgcmVjdiBjYWxsYmFjayAqLworICBkYXRhLT5mcmVjdiA9IHNvYXAtPmZyZWN2OyAvKiBzYXZlIG9sZCBzZW5kIGNhbGxiYWNrICovCisgIHNvYXAtPmZzZW5kID0gbG9nZ2luZ19zZW5kOyAvKiByZXBsYWNlIHNlbmQgY2FsbGJhY2sgd2l0aCBvdXJzICovCisgIHNvYXAtPmZyZWN2ID0gbG9nZ2luZ19yZWN2OyAvKiByZXBsYWNlIHJlY3YgY2FsbGJhY2sgd2l0aCBvdXJzICovCisgIHJldHVybiBTT0FQX09LOworfQorCitzdGF0aWMgdm9pZCBsb2dnaW5nX2RlbGV0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGx1Z2luICpwKQoreyBmcmVlKHAtPmRhdGEpOyAvKiBmcmVlIGFsbG9jYXRlZCBwbHVnaW4gZGF0YS4gSWYgZmNvcHkoKSBpcyBub3Qgc2V0LCB0aGVuIHRoaXMgZnVuY3Rpb24gaXMgbm90IGNhbGxlZCBmb3IgYWxsIGNvcGllcyBvZiB0aGUgcGx1Z2luIGNyZWF0ZWQgd2l0aCBzb2FwX2NvcHkoKS4gSW4gdGhpcyBleGFtcGxlLCB0aGUgZmNvcHkoKSBjYWxsYmFjayBpcyBvbWl0dGVkIGFuZCB0aGUgcGx1Z2luIGRhdGEgaXMgc2hhcmVkIGJ5IHRoZSBzb2FwIGNvcGllcyBjcmVhdGVkIHdpdGggc29hcF9jb3B5KCkgKi8KK30KKworc3RhdGljIHNpemVfdCBsb2dnaW5nX3JlY3Yoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sgc3RydWN0IGxvZ2dpbmdfZGF0YSAqZGF0YSA9IChzdHJ1Y3QgbG9nZ2luZ19kYXRhKilzb2FwX2xvb2t1cF9wbHVnaW4oc29hcCwgbG9nZ2luZ19pZCk7CisgIHNpemVfdCByZXMgPSBkYXRhLT5mcmVjdihzb2FwLCBidWYsIGxlbik7IC8qIGdldCBkYXRhIGZyb20gb2xkIHJlY3YgY2FsbGJhY2sgKi8KKyAgZGF0YS0+c3RhdF9yZWN2ICs9IHJlczsKKyAgLyogdXBkYXRlIHNob3VsZCBiZSBpbiBtdXRleCwgYnV0IHdlIGRvbid0IG1pbmQgc29tZSBpbmFjY3VyYWN5IGluIHRoZSBjb3VudCAqLworICBpZiAoZGF0YS0+aW5ib3VuZCkKKyAgICBmd3JpdGUoYnVmLCByZXMsIDEsIGRhdGEtPmluYm91bmQpOworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IGxvZ2dpbmdfc2VuZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreyBzdHJ1Y3QgbG9nZ2luZ19kYXRhICpkYXRhID0gKHN0cnVjdCBsb2dnaW5nX2RhdGEqKXNvYXBfbG9va3VwX3BsdWdpbihzb2FwLCBsb2dnaW5nX2lkKTsKKyAgLyogdXBkYXRlIHNob3VsZCBiZSBpbiBtdXRleCwgYnV0IHdlIGRvbid0IG1pbmQgc29tZSBpbmFjY3VyYWN5IGluIHRoZSBjb3VudCAqLworICBkYXRhLT5zdGF0X3NlbnQgKz0gbGVuOworICBpZiAoZGF0YS0+b3V0Ym91bmQpCisgICAgZndyaXRlKGJ1ZiwgbGVuLCAxLCBkYXRhLT5vdXRib3VuZCk7CisgIHJldHVybiBkYXRhLT5mc2VuZChzb2FwLCBidWYsIGxlbik7IC8qIHBhc3MgZGF0YSBvbiB0byBvbGQgc2VuZCBjYWxsYmFjayAqLworfQorCmRpZmYgLS1naXQgYS9wbHVnaW4vbG9nZ2luZy5oIGIvcGx1Z2luL2xvZ2dpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yzk3YzY2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2luL2xvZ2dpbmcuaApAQCAtMCwwICsxLDcxIEBACisvKgorCitsb2dnaW5nLmgKKworTWVzc2FnZSBsb2dnaW5nIHBsdWdpbi4KKworVGhpcyBwbHVnaW4gZmx1c2hlcyBtZXNzYWdlcyB0byBzdGRlcnIsIGJ1dCB5b3UgY2FuIGVhc2lseSBjaGFuZ2UgaXQgdG8gc2VuZAorZGF0YSBlbHNld2hlcmUuCisKK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgcGFydCBvZiB0aGUgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXM6CitHUEwsIHRoZSBnU09BUCBwdWJsaWMgbGljZW5zZSwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIHB1YmxpYyBsaWNlbnNlLgorCitUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBnU09BUCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMworKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCitMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK2h0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9zb2FwbGljZW5zZS5odG1sCitTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAorV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCitmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLgorQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSwgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmIExPR0dJTkdfSAorI2RlZmluZSBMT0dHSU5HX0gKKworI2luY2x1ZGUgInN0ZHNvYXAyLmgiCisKKyNkZWZpbmUgTE9HR0lOR19JRCAiTE9HR0lORy0xLjIiCisKK2V4dGVybiBjb25zdCBjaGFyIGxvZ2dpbmdfaWRbXTsKKworc3RydWN0IGxvZ2dpbmdfZGF0YQoreworICBGSUxFICppbmJvdW5kOworICBGSUxFICpvdXRib3VuZDsKKyAgc2l6ZV90IHN0YXRfc2VudDsKKyAgc2l6ZV90IHN0YXRfcmVjdjsKKyAgaW50ICgqZnNlbmQpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHNpemVfdCk7IC8qIHRvIHNhdmUgYW5kIHVzZSBzZW5kIGNhbGxiYWNrICovCisgIHNpemVfdCAoKmZyZWN2KShzdHJ1Y3Qgc29hcCosIGNoYXIqLCBzaXplX3QpOyAvKiB0byBzYXZlIGFuZCB1c2UgcmVjdiBjYWxsYmFjayAqLworfTsKKworaW50IGxvZ2dpbmcoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3BsdWdpbiAqcGx1Z2luLCB2b2lkICphcmcpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3BsdWdpbi9tZDVldnAuYyBiL3BsdWdpbi9tZDVldnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjE5MTM2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2luL21kNWV2cC5jCkBAIC0wLDAgKzEsODkgQEAKKy8qCisKK21kNWV2cC5jCisKK2dTT0FQIEhUVFAgQ29udGVudC1NRDUgZGlnZXN0IEVWUCBoYW5kbGVyIGZvciBodHRwbWQ1IHBsdWdpbgorCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHBhcnQgb2YgdGhlIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2VzOgorR1BMLCB0aGUgZ1NPQVAgcHVibGljIGxpY2Vuc2UsIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBwdWJsaWMgbGljZW5zZS4KKworVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZ1NPQVAgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjMKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcGxpY2Vuc2UuaHRtbAorU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKK1dJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQorZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFJvYmVydCBBLiB2YW4gRW5nZWxlbi4KK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEsIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2luY2x1ZGUgIm1kNWV2cC5oIgorCitpbnQgbWQ1X2hhbmRsZXIoc3RydWN0IHNvYXAgKnNvYXAsIHZvaWQgKipjb250ZXh0LCBlbnVtIG1kNV9hY3Rpb24gYWN0aW9uLCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7IEVWUF9NRF9DVFggKmN0eDsKKyAgdW5zaWduZWQgY2hhciBoYXNoW0VWUF9NQVhfTURfU0laRV07CisgIHVuc2lnbmVkIGludCBzaXplOworICBzd2l0Y2ggKGFjdGlvbikKKyAgeyBjYXNlIE1ENV9JTklUOgorI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgICAgT3BlblNTTF9hZGRfYWxsX2RpZ2VzdHMoKTsKKyNlbmRpZgorICAgICAgaWYgKCEqY29udGV4dCkKKyAgICAgIHsgKmNvbnRleHQgPSAodm9pZCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKEVWUF9NRF9DVFgpKTsKKyAgICAgICAgRVZQX01EX0NUWF9pbml0KChFVlBfTURfQ1RYKikqY29udGV4dCk7CisgICAgICB9CisgICAgICBjdHggPSAoRVZQX01EX0NUWCopKmNvbnRleHQ7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIi0tIE1ENSBJbml0ICVwXG4iLCBjdHgpKTsKKyAgICAgIEVWUF9EaWdlc3RJbml0KGN0eCwgRVZQX21kNSgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTUQ1X1VQREFURToKKyAgICAgIGN0eCA9IChFVlBfTURfQ1RYKikqY29udGV4dDsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiLS0gTUQ1IFVwZGF0ZSAlcCAtLVxuIiwgY3R4KSk7CisgICAgICBEQkdNU0coVEVTVCwgYnVmLCBsZW4pOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJcbi0tIikpOworICAgICAgRVZQX0RpZ2VzdFVwZGF0ZShjdHgsICh2b2lkKilidWYsICh1bnNpZ25lZCBpbnQpbGVuKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTUQ1X0ZJTkFMOgorICAgICAgY3R4ID0gKEVWUF9NRF9DVFgqKSpjb250ZXh0OworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICItLSBNRDUgRmluYWwgJXAgLS1cbiIsIGN0eCkpOworICAgICAgRVZQX0RpZ2VzdEZpbmFsKGN0eCwgKHZvaWQqKWhhc2gsICZzaXplKTsKKyAgICAgIG1lbWNweShidWYsIGhhc2gsIDE2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTUQ1X0RFTEVURToKKyAgICAgIGN0eCA9IChFVlBfTURfQ1RYKikqY29udGV4dDsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiLS0gTUQ1IERlbGV0ZSAlcCAtLVxuIiwgY3R4KSk7CisgICAgICBpZiAoY3R4KQorICAgICAgeyBFVlBfTURfQ1RYX2NsZWFudXAoY3R4KTsKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIGN0eCk7CisgICAgICB9CisgICAgICAqY29udGV4dCA9IE5VTEw7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CmRpZmYgLS1naXQgYS9wbHVnaW4vbWQ1ZXZwLmggYi9wbHVnaW4vbWQ1ZXZwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYyYzNiYgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbi9tZDVldnAuaApAQCAtMCwwICsxLDczIEBACisvKgorCittZDVldnAuaAorCitnU09BUCBIVFRQIENvbnRlbnQtTUQ1IGRpZ2VzdCBwbHVnaW4uCisKK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgcGFydCBvZiB0aGUgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXM6CitHUEwsIHRoZSBnU09BUCBwdWJsaWMgbGljZW5zZSwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIHB1YmxpYyBsaWNlbnNlLgorCitUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBnU09BUCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMworKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCitMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK2h0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9zb2FwbGljZW5zZS5odG1sCitTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAorV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCitmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLgorQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSwgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlEZWZpbmVzIE1ENSBoYW5kbGVyIHVzaW5nIEVWUCBpbnRlcmZhY2UgKGUuZy4gdXNpbmcgT3BlblNTTCkKKworCWludCBtZDVfaGFuZGxlcihzdHJ1Y3Qgc29hcCAqc29hcCwgdm9pZCAqKmNvbnRleHQsIGVudW0gbWQ1X2FjdGlvbiBhY3Rpb24sIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKKwljb250ZXh0IGNhbiBiZSBzZXQgYW5kIHBhc3NlZCB0byBzdWJzZXF1ZW50IGNhbGxzLiBQYXJhbWV0ZXJzOgorCWFjdGlvbiA9CisJTUQ1X0lOSVQ6CWluaXQgY29udGV4dAorCU1ENV9VUERBVEU6CXVwZGF0ZSBjb250ZXh0IHdpdGggZGF0YSBmcm9tIGJ1ZiB3aXRoIHNpemUgbGVuCisJTUQ1X0ZJTkFMOglmaWxsIGJ1ZiB3aXRoIDE2IGJ5dGVzIE1ENSBoYXNoIHZhbHVlCisJTUQ1X0RFTEVURToJZGVsZXRlIGNvbnRleHQKKwlidWYJCWlucHV0IGRhdGEsIG91dHB1dCBNRDUgMTI4IGJpdCBoYXNoIHZhbHVlCisJbGVuCQlsZW5ndGggb2YgaW5wdXQgZGF0YQorCisqLworCisjaWZuZGVmIE1ENUVWUF9ICisjZGVmaW5lIE1ENUVWUF9ICisKKyNpbmNsdWRlICJzdGRzb2FwMi5oIgorCisjaWZkZWYgV0lUSF9PUEVOU1NMCisjaW5jbHVkZSAib3BlbnNzbC9ldnAuaCIKKyNlbmRpZgorCitlbnVtIG1kNV9hY3Rpb24geyBNRDVfSU5JVCwgTUQ1X1VQREFURSwgTUQ1X0ZJTkFMLCBNRDVfREVMRVRFIH07CisKK2ludCBtZDVfaGFuZGxlcihzdHJ1Y3Qgc29hcCAqc29hcCwgdm9pZCAqKmNvbnRleHQsIGVudW0gbWQ1X2FjdGlvbiBhY3Rpb24sIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcGx1Z2luL3BsdWdpbi5jIGIvcGx1Z2luL3BsdWdpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwOGM1ODYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW4vcGx1Z2luLmMKQEAgLTAsMCArMSw4OCBAQAorLyoJcGx1Z2luLmMKKworCUV4YW1wbGUgZ1NPQVAgcGx1Zy1pbgorCisJQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJQ29tcGlsZSAmIGxpbmsgd2l0aCBnU09BUCBjbGllbnRzIGFuZCBzZXJ2aWNlcyB0byB2aWV3IFNPQVAgbWVzc2FnZXMuCisKKwlVc2FnZSAoY2xpZW50L3NlcnZlciBjb2RlKToKKwlzdHJ1Y3Qgc29hcCBzb2FwOworCXNvYXBfaW5pdCgmc29hcCk7CisJc29hcF9yZWdpc3Rlcl9wbHVnaW4oJnNvYXAsIHBsdWdpbik7IC8vIHJlZ2lzdGVyIHBsdWdpbgorCS4uLgorCS4uLiA9IHNvYXBfY29weSgmc29hcCk7IC8vIGNvcGllcyBwbHVnaW4gdG9vCisJLi4uCisJc29hcF9kb25lKCZzb2FwKTsgLy8gZGV0YWNoIHBsdWdpbgorCisJQSBwbHVnaW4gaXMgY29waWVkIHdpdGggdGhlIHNvYXBfY29weSgpIGNhbGwuIFVwb24gdGhpcyBjYWxsLCB0d28KKwlzaXR1YXRpb25zIG1heSBhcmlzZSBkZXBlbmRpbmcgb24gc2V0dGluZyB0aGUgZmNvcHkoKSBjYWxsYmFjayBhbmQKKwl0aGUgbmVlZCB0byBzaGFyZSBvciBub3Qgc2hhcmUgcGx1Z2luIGRhdGE6CisKKwkxLiBpZiB0aGUgcGx1Z2luIGZjb3B5KCkgY2FsbGJhY2sgaXMgc2V0LCBpdCB3aWxsIGJlIGNhbGxlZCB0byBhbGxvdworCSAgIHRoZSBwbHVnaW4gdG8gY29weSBpdHMgbG9jYWwgZGF0YS4gV2hlbiBzb2FwX2RvbmUoKSBpcyBjYWxsZWQgb24KKwkgICB0aGUgY29weSwgdGhlIGZkZWxldGUoKSBjYWxsYmFjayBpcyBjYWxsZWQgZm9yIGNsZWFudXAuCisKKwkyLiBpZiB0aGUgcGx1Z2luIGZjb3B5KCkgY2FsbGJhY2sgaXMgbm90IHNldCwgdGhlbiB0aGUgcGx1Z2luIGRhdGEKKwkgICB3aWxsIGJlIHNoYXJlZCAoaS5lLiB0aGUgZGF0YSBwb2ludGVyIHBvaW50cyB0byB0aGUgc2FtZSBhZGRyZXNzKS4KKwkgICBUaGUgZmRlbGV0ZSgpIGNhbGxiYWNrIHdpbGwgbm90IGJlIGNhbGxlZCB1cG9uIGEgc29hcF9kb25lKCkgb24gYQorCSAgIGNvcHkgb2YgdGhlIHNvYXAgc3RydWN0LiBUaGUgZmRlbGV0ZSgpIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIGZvcgorCSAgIHRoZSBvcmlnaW5hbCBzb2FwIHN0cnVjdCB3aXRoIHdoaWNoIHRoZSBwbHVnaW4gcmVnaXN0ZXJlZC4KKwkgICAKKyovCisKKyNpbmNsdWRlICJwbHVnaW4uaCIKKworc3RhdGljIGNvbnN0IGNoYXIgcGx1Z2luX2lkW10gPSBQTFVHSU5fSUQ7CisKK3N0YXRpYyBpbnQgcGx1Z2luX2luaXQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBwbHVnaW5fZGF0YSAqZGF0YSk7CitzdGF0aWMgaW50IHBsdWdpbl9jb3B5KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbHVnaW4gKmRzdCwgc3RydWN0IHNvYXBfcGx1Z2luICpzcmMpOworc3RhdGljIHZvaWQgcGx1Z2luX2RlbGV0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGx1Z2luICpwKTsKK3N0YXRpYyBpbnQgcGx1Z2luX3NlbmQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7CitzdGF0aWMgc2l6ZV90IHBsdWdpbl9yZWN2KHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpidWYsIHNpemVfdCBsZW4pOworCitpbnQgcGx1Z2luKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnAsIHZvaWQgKmFyZykKK3sgcC0+aWQgPSBwbHVnaW5faWQ7CisgIHAtPmRhdGEgPSAodm9pZCopbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGx1Z2luX2RhdGEpKTsKKyAgLyogb3B0aW9uYWw6IGRlZmluZSBmY29weSgpIG9wZXJhdGlvbi4gV2hlbiBkZWZpbmVkLCBmZGVsZXRlKCkgd2lsbCBiZSBjYWxsZWQgZm9yIGV2ZXJ5IGNvcHkgb2YgdGhlIHBsdWdpbiBjcmVhdGVkIHdpdGggZmNvcHkoKSwgd2hlbiBOT1QgZGVmaW5lZCwgZmRlbGV0ZSgpIHdpbGwgb25seSBiZSBjYWxsZWQgb24gdGhlIG9yaWdpbmFsIG5vbi1jb3BpZWQgcGx1Z2luICovCisgIHAtPmZjb3B5ID0gcGx1Z2luX2NvcHk7CisgIHAtPmZkZWxldGUgPSBwbHVnaW5fZGVsZXRlOworICBpZiAocC0+ZGF0YSkKKyAgICBpZiAocGx1Z2luX2luaXQoc29hcCwgKHN0cnVjdCBwbHVnaW5fZGF0YSopcC0+ZGF0YSkpCisgICAgeyBmcmVlKHAtPmRhdGEpOyAvKiBlcnJvcjogY291bGQgbm90IGluaXQgKi8KKyAgICAgIHJldHVybiBTT0FQX0VPTTsgLyogcmV0dXJuIGVycm9yICovCisgICAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKworc3RhdGljIGludCBwbHVnaW5faW5pdChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHBsdWdpbl9kYXRhICpkYXRhKQoreyBkYXRhLT5mc2VuZCA9IHNvYXAtPmZzZW5kOyAvKiBzYXZlIG9sZCByZWN2IGNhbGxiYWNrICovCisgIGRhdGEtPmZyZWN2ID0gc29hcC0+ZnJlY3Y7IC8qIHNhdmUgb2xkIHNlbmQgY2FsbGJhY2sgKi8KKyAgc29hcC0+ZnNlbmQgPSBwbHVnaW5fc2VuZDsgLyogcmVwbGFjZSBzZW5kIGNhbGxiYWNrIHdpdGggb3VycyAqLworICBzb2FwLT5mcmVjdiA9IHBsdWdpbl9yZWN2OyAvKiByZXBsYWNlIHJlY3YgY2FsbGJhY2sgd2l0aCBvdXJzICovCisgIHJldHVybiBTT0FQX09LOworfQorCitzdGF0aWMgaW50IHBsdWdpbl9jb3B5KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbHVnaW4gKmRzdCwgc3RydWN0IHNvYXBfcGx1Z2luICpzcmMpCit7IGlmICghKGRzdC0+ZGF0YSA9IChzdHJ1Y3QgcGx1Z2luX2RhdGEqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHBsdWdpbl9kYXRhKSkpKQorICAgIHJldHVybiBTT0FQX0VPTTsKKyAgKmRzdC0+ZGF0YSA9ICpzcmMtPmRhdGE7CisgIHJldHVybiBTT0FQX09LOworfQorCitzdGF0aWMgdm9pZCBwbHVnaW5fZGVsZXRlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnApCit7IGZyZWUocC0+ZGF0YSk7IC8qIGZyZWUgYWxsb2NhdGVkIHBsdWdpbiBkYXRhLiBJZiBmY29weSgpIGlzIG5vdCBzZXQsIHRoZW4gdGhpcyBmdW5jdGlvbiBpcyBub3QgY2FsbGVkIGZvciBhbGwgY29waWVzIG9mIHRoZSBwbHVnaW4gY3JlYXRlZCB3aXRoIHNvYXBfY29weSgpLiBJbiB0aGlzIGV4YW1wbGUsIHRoZSBmY29weSgpIGNhbGxiYWNrIGNhbiBiZSBzYWZlbHkgb21pdHRlZC4gV2hlbiBvbWl0dGVkLCB0aGUgcGx1Z2luIGRhdGEgaXMgc2hhcmVkIGJ5IHRoZSBzb2FwIGNvcGllcyBjcmVhdGVkIHdpdGggc29hcF9jb3B5KCkgKi8KK30KKworc3RhdGljIGludCBwbHVnaW5fc2VuZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreyBzdHJ1Y3QgcGx1Z2luX2RhdGEgKmRhdGEgPSAoc3RydWN0IHBsdWdpbl9kYXRhKilzb2FwX2xvb2t1cF9wbHVnaW4oc29hcCwgcGx1Z2luX2lkKTsKKyAgZndyaXRlKGJ1ZiwgbGVuLCAxLCBzdGRlcnIpOworICByZXR1cm4gZGF0YS0+ZnNlbmQoc29hcCwgYnVmLCBsZW4pOyAvKiBwYXNzIGRhdGEgb24gdG8gb2xkIHNlbmQgY2FsbGJhY2sgKi8KK30KKworc3RhdGljIHNpemVfdCBwbHVnaW5fcmVjdihzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreyBzdHJ1Y3QgcGx1Z2luX2RhdGEgKmRhdGEgPSAoc3RydWN0IHBsdWdpbl9kYXRhKilzb2FwX2xvb2t1cF9wbHVnaW4oc29hcCwgcGx1Z2luX2lkKTsKKyAgc2l6ZV90IHJlcyA9IGRhdGEtPmZyZWN2KHNvYXAsIGJ1ZiwgbGVuKTsgLyogZ2V0IGRhdGEgZnJvbSBvbGQgcmVjdiBjYWxsYmFjayAqLworICBmd3JpdGUoYnVmLCByZXMsIDEsIHN0ZGVycik7CisgIHJldHVybiByZXM7Cit9CmRpZmYgLS1naXQgYS9wbHVnaW4vcGx1Z2luLmggYi9wbHVnaW4vcGx1Z2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU2ZGNkYwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbi9wbHVnaW4uaApAQCAtMCwwICsxLDE4IEBACisvKglwbHVnaW4uaAorCisJRXhhbXBsZSBnU09BUCBwbHVnLWluCisKKwlDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMiBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyovCisKKyNpbmNsdWRlICJzdGRzb2FwMi5oIgorCisjZGVmaW5lIFBMVUdJTl9JRCAiUExVR0lOLTEuMCIgLyogcGx1Z2luIGlkZW50aWZpY2F0aW9uICovCisKK3N0cnVjdCBwbHVnaW5fZGF0YQoreyBpbnQgKCpmc2VuZCkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc2l6ZV90KTsgLyogZXhhbXBsZTogdG8gc2F2ZSBhbmQgdXNlIHNlbmQgY2FsbGJhY2sgKi8KKyAgc2l6ZV90ICgqZnJlY3YpKHN0cnVjdCBzb2FwKiwgY2hhciosIHNpemVfdCk7IC8qIGV4YW1wbGU6IHRvIHNhdmUgYW5kIHVzZSByZWN2IGNhbGxiYWNrICovCit9OworCitpbnQgcGx1Z2luKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnBsdWdpbiwgdm9pZCAqYXJnKTsKZGlmZiAtLWdpdCBhL3BsdWdpbi9zbWRldnAuYyBiL3BsdWdpbi9zbWRldnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDA1MjA0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2luL3NtZGV2cC5jCkBAIC0wLDAgKzEsNDkxIEBACisvKgorCitzbWRldnAuYworCitnU09BUCBFVlAgaW50ZXJmYWNlIGZvciAoc2lnbmVkKSBtZXNzYWdlIGRpZ2VzdAorCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHBhcnQgb2YgdGhlIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2VzOgorR1BMLCB0aGUgZ1NPQVAgcHVibGljIGxpY2Vuc2UsIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBwdWJsaWMgbGljZW5zZS4KKworVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZ1NPQVAgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjMKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcGxpY2Vuc2UuaHRtbAorU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKK1dJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQorZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFJvYmVydCBBLiB2YW4gRW5nZWxlbi4KK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEsIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworLyoqCisKK0BwYWdlIHNtZGV2cCBUaGUgc21kZXZwIGVuZ2luZQorCitUaGUgZ1NPQVAgc21kZXZwIGVuZ2luZSBjb21wdXRlcyAoc2lnbmVkKSBtZXNzYWdlIGRpZ2VzdHMgb3ZlciBhbnkgdHlwZSBvZiBkYXRhCit1c2luZyB0aGUgRVZQIGludGVyZmFjZSBvZiBPcGVuU1NMLiBJdCBjdXJyZW50bHkgc3VwcG9ydHMgTUQ1LCBTSEExLCBITUFDX1NIQTEsCitEU0FfU0hBMSwgYW5kIFJTQV9TSEExLgorCitBIGRpZ2VzdCBvciBzaWduYXR1cmUgYWxnb3JpdGhtIGlzIHNlbGVjdGVkIHdpdGggb25lIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzOgorCistIEByZWYgU09BUF9TTURfREdTVF9NRDUJdG8gY29tcHV0ZSBNRDUgMTI4LWJpdCBkaWdlc3RzCistIEByZWYgU09BUF9TTURfREdTVF9TSEExCXRvIGNvbXB1dGUgTUQ1IDE2MC1iaXQgZGlnZXN0cworLSBAcmVmIFNPQVBfU01EX0hNQUNfU0hBMQl0byBjb21wdXRlIEhNQUMtU0hBMSBtZXNzYWdlIGF1dGhlbnRpY2F0aW9uIGNvZGUKKy0gQHJlZiBTT0FQX1NNRF9TSUdOX0RTQV9TSEExCXRvIGNvbXB1dGUgRFNBLVNIQTEgc2lnbmF0dXJlcworLSBAcmVmIFNPQVBfU01EX1NJR05fUlNBX1NIQTEJdG8gY29tcHV0ZSBSU0EtU0hBMSBzaWduYXR1cmVzCistIEByZWYgU09BUF9TTURfVlJGWV9EU0FfU0hBMQl0byB2ZXJpZnkgRFNBLVNIQTEgc2lnbmF0dXJlcworLSBAcmVmIFNPQVBfU01EX1ZSRllfUlNBX1NIQTEJdG8gdmVyaWZ5IFJTQS1TSEExIHNpZ25hdHVyZXMKKworVGhlIHNtZGV2cCBlbmdpbmUgd3JhcHMgdGhlIEVWUCBBUEkgd2l0aCB0aHJlZSBuZXcgZnVuY3Rpb25zOgorCistIEByZWYgc29hcF9zbWRfaW5pdAl0byBpbml0aWFsaXplIHRoZSBlbmdpbmUKKy0gQHJlZiBzb2FwX3NtZF91cGRhdGUJdG8gdXBkYXRlIHRoZSBzdGF0ZSB3aXRoIGEgbWVzc2FnZSBwYXJ0CistIEByZWYgc29hcF9zbWRfZmluYWwJdG8gY29tcHV0ZSB0aGUgZGlnZXN0LCBzaWduYXR1cmUsIG9yIHZlcmlmeSBhIHNpZ25hdHVyZQorCitBIGhpZ2hlci1sZXZlbCBpbnRlcmZhY2UgZm9yIGNvbXB1dGluZyAoc2lnbmVkKSBtZXNzYWdlIGRpZ2VzdHMgb3ZlcgorbWVzc2FnZXMgcHJvZHVjZWQgYnkgdGhlIGdTT0FQIGVuZ2lucmUgaXMgZGVmaW5lZCBieSB0d28gbmV3IGZ1bmN0aW9uczoKKworLSBAcmVmIHNvYXBfc21kX2JlZ2luCXRvIHN0YXJ0IGEgZGlnZXN0IG9yIHNpZ25hdHVyZSBjb21wdXRhdGlvbi92ZXJpZmljYXRpb24KKy0gQHJlZiBzb2FwX3NtZF9lbmQJdG8gY29tcGxldGUgYSBkaWdlc3Qvc2lnbmF0dXJlIGNvbXB1dGF0aW9uL3ZlcmlmaWNhdGlvbgorCitIZXJlIGlzIGFuIGV4YW1wbGUgdG8gc2lnbiBhbiBYTUwgc2VyaWFsaXplZCBDKysgb2JqZWN0IHVzaW5nIGFuIFJTQSBwcml2YXRlCitrZXkgYXBwbGllZCB0byB0aGUgU0hBMSBkaWdlc3Qgb2YgdGhlIHNlcmlhbGl6ZWQgb2JqZWN0OgorCitAY29kZQorICAgIG5zX19PYmplY3QgKm9iamVjdCA9IC4uLjsKKyAgICBpbnQgYWxnID0gU09BUF9TTURfU0lHTl9SU0FfU0hBMTsKKyAgICBGSUxFICpmZCA9IGZvcGVuKCJrZXkucGVtIiwgInIiKTsKKyAgICBFVlBfUEtFWSAqa2V5ID0gUEVNX3JlYWRfUHJpdmF0ZUtleShmZCwgTlVMTCwgTlVMTCwgInBhc3N3b3JkIik7CisgICAgY2hhciAqc2lnID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHNvYXBfc21kX3NpemUoYWxnLCBrZXkpKTsKKyAgICBpbnQgc2lnbGVuOworICAgIGZjbG9zZShmZCk7CisgICAgaWYgKHNvYXBfc21kX2JlZ2luKHNvYXAsIGFsZywga2V5LCAwKQorICAgICB8fCBzb2FwX291dF9uc19fT2JqZWN0KHNvYXAsICJuczpPYmplY3QiLCAwLCBvYmplY3QsIE5VTEwpCisgICAgIHx8IHNvYXBfc21kX2VuZChzb2FwLCBzaWcsICZzaWdsZW4pKQorICAgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOworICAgIGVsc2UKKyAgICAgIC4uLiAvLyBzaWcgY29udGFpbnMgUlNBLVNIQTEgc2lnbmF0dXJlIG9mIGxlbmd0aCBzaWdsZW4gCitAZW5kY29kZQorCitUbyB2ZXJpZnkgdGhlIHNpZ25hdHVyZSwgd2UgdXNlIHRoZSBSU0EgcHVibGljIGtleSBhbmQgcmUtcnVuIHRoZSBvY3RldCBzdHJlYW0KKyhieSByZS1zZXJpYWxpemF0aW9uIGluIHRoaXMgZXhhbXBsZSkgdGhyb3VnaCB0aGUgc21kZXZwIGVuZ2luZSB1c2luZyB0aGUKK1NPQVBfU01EX1ZSRllfUlNBX1NIQTEgYWxnb3JpdGhtLiBOb3RlIHRoYXQgYSBQRU0gZmlsZSBtYXkgY29udGFpbiBib3RoIHRoZQorKGVuY3J5cHRlZCkgcHJpdmF0ZSBhbmQgcHVibGljIGtleXMuCisKK0Bjb2RlCisgICAgY2hhciAqc2lnID0gLi4uOworICAgIGludCBzaWdsZW4gPSAuLi47CisgICAgbnNfX09iamVjdCAqb2JqZWN0ID0gLi4uOworICAgIGludCBhbGcgPSBTT0FQX1NNRF9WUkZZX1JTQV9TSEExOworICAgIEZJTEUgKmZkID0gZm9wZW4oImtleS5wZW0iLCAiciIpOworICAgIEVWUF9QS0VZICprZXkgPSBQRU1fcmVhZF9QVUJLRVkoZmQsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIGZjbG9zZShmZCk7CisgICAgaWYgKHNvYXBfc21kX2JlZ2luKHNvYXAsIGFsZywga2V5LCAwKQorICAgICB8fCBzb2FwX291dF9uc19fT2JqZWN0KHNvYXAsICJuczpPYmplY3QiLCAwLCBvYmplY3QsIE5VTEwpCisgICAgIHx8IHNvYXBfc21kX2VuZChzb2FwLCBzaWcsICZzaWdsZW4pKQorICAgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOworICAgIGVsc2UKKyAgICAgIC4uLiAvLyBzaWcgdmVyaWZpZWQsIGkuZS4gc2lnbmVkIG9iamVjdCB3YXMgbm90IGNoYW5nZWQKK0BlbmRjb2RlCisKK1RoZSBITUFDIGFsZ29yaXRobSB1c2VzIGEgc2VjcmV0IGtleSAod2hpY2ggYm90aCB0aGUgc2VuZGVyIGFuZCByZWNlaXZlciBtdXN0CitrZWVwIHNlY3JldCkgdG8gc2lnbiBhbmQgdmVyaWZ5IGEgbWVzc2FnZToKKworQGNvZGUKKyAgICBuc19fT2JqZWN0ICpvYmplY3QgPSAuLi47CisgICAgaW50IGFsZyA9IFNPQVBfU01EX0hNQUNfU0hBMTsKKyAgICBzdGF0aWMgY2hhciBrZXlbMTZdID0KKyAgICB7IDB4ZmYsIDB4ZWUsIDB4ZGQsIDB4Y2MsIDB4YmIsIDB4YWEsIDB4OTksIDB4ODgsCisgICAgICAweDc3LCAweDY2LCAweDU1LCAweDQ0LCAweDMzLCAweDIyLCAweDExLCAweDAwIH07CisgICAgY2hhciAqc2lnID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHNvYXBfc21kX3NpemUoYWxnLCBOVUxMKSk7CisgICAgaW50IHNpZ2xlbjsKKyAgICBpZiAoc29hcF9zbWRfYmVnaW4oc29hcCwgYWxnLCBrZXksIHNpemVvZihrZXkpKQorICAgICB8fCBzb2FwX291dF9uc19fT2JqZWN0KHNvYXAsICJuczpPYmplY3QiLCAwLCBvYmplY3QsIE5VTEwpCisgICAgIHx8IHNvYXBfc21kX2VuZChzb2FwLCBzaWcsICZzaWdsZW4pKQorICAgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOworICAgIGVsc2UKKyAgICAgIC4uLiAvLyBzaWcgaG9sZHMgdGhlIHNpZ25hdHVyZQorQGVuZGNvZGUKKworTm90ZTogSE1BQyBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIHByb2NlZWRzIGJ5IHJlY29tcHV0aW5nIHRoZSBzaWduYXR1cmUgdmFsdWUKK2ZvciBjb21wYXJpc29uLgorCitBIGRpZ2VzdCBpcyBhIGhhc2ggdmFsdWUgb2YgYW4gb2N0ZXQgc3RyZWFtIGNvbXB1dGVkIHVzaW5nIHRoZSBNRDUgb3IgU0hBMQorYWxnb3JpdGhtczoKKworQGNvZGUKKyAgICBuc19fT2JqZWN0ICpvYmplY3QgPSAuLi47CisgICAgaW50IGFsZyA9IFNPQVBfU01EX0RHU1RfU0hBMTsKKyAgICBjaGFyICpkaWdlc3QgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc29hcF9zbWRfc2l6ZShhbGcsIE5VTEwpKTsKKyAgICBpbnQgZGlnZXN0bGVuOworICAgIGlmIChzb2FwX3NtZF9iZWdpbihzb2FwLCBhbGcsIE5VTEwsIDApCisgICAgIHx8IHNvYXBfb3V0X25zX19PYmplY3Qoc29hcCwgIm5zOk9iamVjdCIsIDAsIG9iamVjdCwgTlVMTCkKKyAgICAgfHwgc29hcF9zbWRfZW5kKHNvYXAsIGRpZ2VzdCwgJmRpZ2VzdGxlbikpCisgICAgICBzb2FwX3ByaW50X2ZhdWx0KHNvYXAsIHN0ZGVycik7CisgICAgZWxzZQorICAgICAgLi4uIC8vIGRpZ2VzdCBob2xkcyBoYXNoIHZhbHVlIG9mIHNlcmlhbGl6ZWQgb2JqZWN0CitAZW5kY29kZQorCitOb3RlIHRoYXQgaW5kZW50YXRpb24gKFNPQVBfWE1MX0lOREVOVCkgYW5kIGV4Yy1jMTRuIGNhbm9uaWNhbGl6YXRpb24KKyhTT0FQX1hNTF9DQU5PTklDQUwpIGFmZmVjdHMgdGhlIFhNTCBzZXJpYWxpemF0aW9uIGZvcm1hdCBhbmQsIHRoZXJlZm9yZSwKK3RoZSBkaWdlc3Qgb3Igc2lnbmF0dXJlIHByb2R1Y2VkLgorCisqLworCisjaW5jbHVkZSAic21kZXZwLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICogU3RhdGljIGxvY2FsIGZ1bmN0aW9ucyB1c2VkCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBzb2FwX3NtZF9zZW5kKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pOworc3RhdGljIHNpemVfdCBzb2FwX3NtZF9yZWN2KHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpidWYsIHNpemVfdCBsZW4pOworc3RhdGljIGludCBzb2FwX3NtZF9jaGVjayhzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfc21kX2RhdGEgKmRhdGEsIGludCBlcnIsIGNvbnN0IGNoYXIgKm1zZyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICogc29hcF9zbWQgQVBJIGZ1bmN0aW9ucworICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorQGZuIHNpemVfdCBzb2FwX3NtZF9zaXplKGludCBhbGcsIGNvbnN0IHZvaWQgKmtleSkKK0BicmllZiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygb2N0ZXRzIG5lZWRlZCB0byBzdG9yZSB0aGUgZGlnZXN0IG9yIHNpZ25hdHVyZSByZXR1cm5lZCBieSBzb2FwX3NtZF9lbmQuCitAcGFyYW1baW5dIGFsZyBpcyB0aGUgZGlnZXN0IG9yIHNpZ25hdHVyZSBhbGdvcml0aG0gdG8gYmUgdXNlZAorQHBhcmFtW2luXSBrZXkgaXMgYSBwb2ludGVyIHRvIGFuIEVWUF9QS0VZIG9iamVjdCBmb3IgUlNBL0RTQSBzaWduYXR1cmVzIG9yIE5VTEwgZm9yIGRpZ2VzdHMgYW5kIEhNQUMKK0ByZXR1cm4gc2l6ZV90IG51bWJlciBvZiBvY3RldHMgdGhhdCBpcyBuZWVkZWQgdG8gaG9sZCBkaWdlc3Qgb3Igc2lnbmF0dXJlCitAc2VlIHNvYXBfc21kX2VuZAorCitUaGUgdmFsdWVzIHJldHVybmVkIGZvciBkaWdlc3RzIGFyZSBTT0FQX1NNRF9NRDVfU0laRSBhbmQgU09BUF9TTURfU0hBMV9TSVpFLgorKi8KK3NpemVfdAorc29hcF9zbWRfc2l6ZShpbnQgYWxnLCBjb25zdCB2b2lkICprZXkpCit7IHN3aXRjaCAoYWxnKQorICB7IGNhc2UgU09BUF9TTURfREdTVF9NRDU6CisgICAgICByZXR1cm4gU09BUF9TTURfTUQ1X1NJWkU7CisgICAgY2FzZSBTT0FQX1NNRF9ER1NUX1NIQTE6CisgICAgY2FzZSBTT0FQX1NNRF9ITUFDX1NIQTE6CisgICAgICByZXR1cm4gU09BUF9TTURfU0hBMV9TSVpFOworICAgIGNhc2UgU09BUF9TTURfU0lHTl9EU0FfU0hBMToKKyAgICBjYXNlIFNPQVBfU01EX1NJR05fUlNBX1NIQTE6CisgICAgY2FzZSBTT0FQX1NNRF9WUkZZX0RTQV9TSEExOgorICAgIGNhc2UgU09BUF9TTURfVlJGWV9SU0FfU0hBMToKKyAgICAgIC8qIE9wZW5TU0wgRVZQX1BLRVlfc2l6ZSByZXR1cm5zIHNpemUgb2Ygc2lnbmF0dXJlcyBnaXZlbiBhIGtleSAqLworICAgICAgcmV0dXJuIEVWUF9QS0VZX3NpemUoKEVWUF9QS0VZKilrZXkpOworICB9CisgIHJldHVybiAwOworfQorCisvKioKK0BmbiBpbnQgc29hcF9zbWRfYmVnaW4oc3RydWN0IHNvYXAgKnNvYXAsIGludCBhbGcsIGNvbnN0IHZvaWQgKmtleSwgaW50IGtleWxlbikKK0BicmllZiBJbml0aWF0ZXMgYSBkaWdlc3Qgb3Igc2lnbmF0dXJlIGNvbXB1dGF0aW9uLgorQHBhcmFtIHNvYXAgY29udGV4dAorQHBhcmFtW2luXSBhbGcgaXMgdGhlIGRpZ2VzdCBvciBzaWduYXR1cmUgKHNpZ24vdmVyaWZpY2F0aW9uKSBhbGdvcml0aG0gdXNlZAorQHBhcmFtW2luXSBrZXkgaXMgYSBITUFDIGtleSBvciBwb2ludGVyIHRvIEVWUF9QS0VZIG9iamVjdCBvciBOVUxMIGZvciBkaWdlc3RzCitAcGFyYW1baW5dIGtleWxlbiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBITUFDIGtleSBvciAwCitAcmV0dXJuIFNPQVBfT0ssIFNPQVBfRU9NLCBvciBTT0FQX1NTTF9FUlJPUgorKi8KK2ludAorc29hcF9zbWRfYmVnaW4oc3RydWN0IHNvYXAgKnNvYXAsIGludCBhbGcsIGNvbnN0IHZvaWQgKmtleSwgaW50IGtleWxlbikKK3sgc3RydWN0IHNvYXBfc21kX2RhdGEgKmRhdGE7CisgIGRhdGEgPSAoc3RydWN0IHNvYXBfc21kX2RhdGEqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9zbWRfZGF0YSkpOworICBpZiAoIWRhdGEpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgIC8qIHNhdmUgYW5kIHNldCB0aGUgJ3VzZXInIGZpZWxkIHRvIHBhc3MgZGF0YSB0byB0aGUgY2FsbGJhY2tzICovCisgIGRhdGEtPnVzZXIgPSBzb2FwLT51c2VyOworICBzb2FwLT51c2VyID0gKHZvaWQqKWRhdGE7CisgIC8qIHNhdmUgYW5kIHNldCB0aGUgc2VuZCBhbmQgcmVjdiBjYWxsYmFja3MgKi8KKyAgZGF0YS0+ZnNlbmQgPSBzb2FwLT5mc2VuZDsKKyAgZGF0YS0+ZnJlY3YgPSBzb2FwLT5mcmVjdjsKKyAgc29hcC0+ZnNlbmQgPSBzb2FwX3NtZF9zZW5kOworICBzb2FwLT5mcmVjdiA9IHNvYXBfc21kX3JlY3Y7CisgIC8qIHNhdmUgdGhlIG1vZGUgZmxhZyAqLworICBkYXRhLT5tb2RlID0gc29hcC0+bW9kZTsKKyAgLyogY2xlYXIgdGhlIElPIGZsYWdzIGFuZCBET00gZmxhZyAqLworICBzb2FwLT5tb2RlICY9IH4oU09BUF9JTyB8IFNPQVBfSU9fTEVOR1RIIHwgU09BUF9YTUxfRE9NKTsKKyAgLyogY2xlYXIgdGhlIFhNTCBhdHRyaWJ1dGUgc3RvcmUgKi8KKyAgc29hcF9jbHJfYXR0cihzb2FwKTsKKyAgLyogbG9hZCB0aGUgbG9jYWwgWE1MIG5hbWVzcGFjZXMgc3RvcmUgKi8KKyAgc29hcF9zZXRfbG9jYWxfbmFtZXNwYWNlcyhzb2FwKTsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgICAgc29hcC0+bnMgPSAwOyAvKiBmb3IgaW4gYzE0biwgd2UgbXVzdCBoYXZlIGFsbCB4bWxucyBiaW5kaW5ncyBhdmFpbGFibGUgKi8KKyAgZWxzZQorICAgIHNvYXAtPm5zID0gMjsgLyogd2UgZG9uJ3Qgd2FudCBsZWFkaW5nIHdoaXRlc3BhY2UgaW4gc2VyaWFsaXplZCBYTUwgKi8KKyAgLyogaW5pdCB0aGUgc29hcF9zbWQgZW5naW5lICovCisgIHJldHVybiBzb2FwX3NtZF9pbml0KHNvYXAsIGRhdGEsIGFsZywga2V5LCBrZXlsZW4pOworfQorCisvKioKK0BmbiBpbnQgc29hcF9zbWRfZW5kKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpidWYsIGludCAqbGVuKQorQGJyaWVmIENvbXBsZXRlcyBhIGRpZ2VzdCBvciBzaWduYXR1cmUgY29tcHV0YXRpb24uCitAcGFyYW0gc29hcCBjb250ZXh0CitAcGFyYW1baW5dIGJ1ZiBjb250YWlucyBzaWduYXR1cmUgZm9yIHZlcmlmaWNhdGlvbiAod2hlbiB1c2luZyBhIFNPQVBfU01EX1ZSRlkgYWxnb3JpdGhtKQorQHBhcmFtW291dF0gYnVmIGlzIHBvcHVsYXRlZCB3aXRoIHRoZSBkaWdlc3Qgb3Igc2lnbmF0dXJlCitAcGFyYW1baW5dIGxlbiBwb2ludHMgdG8gbGVuZ3RoIG9mIHNpZ25hdHVyZSB0byB2ZXJpZnkgKHdoZW4gdXNpbmcgYSBTT0FQX1NNRF9WUkZZIGFsZ29yaXRobSkKK0BwYXJhbVtvdXRdIGxlbiBwb2ludHMgdG8gbGVuZ3RoIG9mIHN0b3JlZCBkaWdlc3Qgb3Igc2lnbmF0dXJlICh3aGVuIG5vdCBOVUxMKQorQHJldHVybiBTT0FQX09LLCBTT0FQX1VTRVJfRVJST1IsIG9yIFNPQVBfU1NMX0VSUk9SCisqLworaW50Citzb2FwX3NtZF9lbmQoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKmJ1ZiwgaW50ICpsZW4pCit7IHN0cnVjdCBzb2FwX3NtZF9kYXRhICpkYXRhOworICBpbnQgZXJyOworICBkYXRhID0gKHN0cnVjdCBzb2FwX3NtZF9kYXRhKilzb2FwLT51c2VyOworICBpZiAoIWRhdGEpCisgICAgcmV0dXJuIFNPQVBfVVNFUl9FUlJPUjsKKyAgLyogZmluYWxpemUgdGhlIGRpZ2VzdC9zaWduYXR1cmUgY29tcHV0YXRpb24gYW5kIHN0b3JlIGRhdGEgaW4gYnVmICsgbGVuICovCisgIC8qIGZvciBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLCBidWYgKyBsZW4gY29udGFpbiB0aGUgc2lnbmF0dXJlICovCisgIGVyciA9IHNvYXBfc21kX2ZpbmFsKHNvYXAsIGRhdGEsIGJ1ZiwgbGVuKTsKKyAgLyogcmVzdG9yZSB0aGUgY2FsbGJhY2tzICovCisgIHNvYXAtPmZzZW5kID0gZGF0YS0+ZnNlbmQ7CisgIHNvYXAtPmZyZWN2ID0gZGF0YS0+ZnJlY3Y7CisgIC8qIHJlc3RvcmUgdGhlIG1vZGUgZmxhZyAqLworICBzb2FwLT5tb2RlID0gZGF0YS0+bW9kZTsKKyAgLyogcmVzdG9yZSB0aGUgJ3VzZXInIGRhdGEgKi8KKyAgc29hcC0+dXNlciA9IGRhdGEtPnVzZXI7CisgIC8qIGZyZWUgZGF0YSAqLworICBTT0FQX0ZSRUUoc29hcCwgZGF0YSk7CisgIC8qIHJldHVybiBTT0FQX09LIG9yIGVycm9yICovCisgIHJldHVybiBlcnI7Cit9CisKKy8qKgorQGZuIGludCBzb2FwX3NtZF9pbml0KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9zbWRfZGF0YSAqZGF0YSwgaW50IGFsZywgY29uc3Qgdm9pZCAqa2V5LCBpbnQga2V5bGVuKQorQGJyaWVmIEluaXRpYXRlcyBhIChzaWduZWQpIGRpZ2VzdCBjb21wdXRhdGlvbi4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0BwYXJhbVtpbixvdXRdIGRhdGEgc21kZXZwIGVuZ2luZSBjb250ZXh0CitAcGFyYW1baW5dIGFsZyBpcyBhbGdvcml0aG0gdG8gdXNlCitAcGFyYW1baW5dIGtleSBpcyBrZXkgdG8gdXNlIG9yIE5VTEwgZm9yIGRpZ2VzdHMKK0BwYXJhbVtpbl0ga2V5bGVuIGlzIGxlbmd0aCBvZiBITUFDIGtleSAod2hlbiBwcm92aWRlZCkKK0ByZXR1cm4gU09BUF9PSyBvciBTT0FQX1NTTF9FUlJPUgorKi8KK2ludAorc29hcF9zbWRfaW5pdChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfc21kX2RhdGEgKmRhdGEsIGludCBhbGcsIGNvbnN0IHZvaWQgKmtleSwgaW50IGtleWxlbikKK3sgc3RhdGljIGludCBkb25lID0gMDsKKyAgaW50IGVyciA9IDE7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgIC8qIE9wZW5TU0w6IG1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBkaWdlc3QgYWxnb3JpdGhtcyAqLworICBpZiAoIWRvbmUpCisgIHsgZG9uZSA9IDE7CisgICAgT3BlblNTTF9hZGRfYWxsX2RpZ2VzdHMoKTsKKyAgICBPcGVuU1NMX2FkZF9hbGxfYWxnb3JpdGhtcygpOworICB9CisjZW5kaWYKKyAgLyogdGhlIGFsZ29yaXRobSB0byB1c2UgKi8KKyAgZGF0YS0+YWxnID0gYWxnOworICAvKiB0aGUga2V5IHRvIHVzZSAqLworICBkYXRhLT5rZXkgPSBrZXk7CisgIC8qIGFsbG9jYXRlIGFuZCBpbml0IHRoZSBPcGVuU1NMIEhNQUMgb3IgRVZQX01EIGNvbnRleHQgKi8KKyAgaWYgKGFsZyA9PSBTT0FQX1NNRF9ITUFDX1NIQTEpCisgIHsgZGF0YS0+Y3R4ID0gKHZvaWQqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihITUFDX0NUWCkpOworICAgIEhNQUNfQ1RYX2luaXQoKEhNQUNfQ1RYKilkYXRhLT5jdHgpOworICB9CisgIGVsc2UKKyAgeyBkYXRhLT5jdHggPSAodm9pZCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKEVWUF9NRF9DVFgpKTsKKyAgICBFVlBfTURfQ1RYX2luaXQoKEVWUF9NRF9DVFgqKWRhdGEtPmN0eCk7CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICItLSBTTUQgSW5pdCBhbGc9JWQgKCVwKSAtLVxuIiwgYWxnLCBkYXRhLT5jdHgpKTsKKyAgLyogaW5pdCB0aGUgZGlnZXN0IG9yIHNpZ25hdHVyZSBjb21wdXRhdGlvbnMgKi8KKyAgc3dpdGNoIChhbGcpCisgIHsgY2FzZSBTT0FQX1NNRF9ER1NUX01ENToKKyAgICAgIEVWUF9EaWdlc3RJbml0KChFVlBfTURfQ1RYKilkYXRhLT5jdHgsIEVWUF9tZDUoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfU01EX0RHU1RfU0hBMToKKyAgICAgIEVWUF9EaWdlc3RJbml0KChFVlBfTURfQ1RYKilkYXRhLT5jdHgsIEVWUF9zaGExKCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1NNRF9ITUFDX1NIQTE6CisgICAgICBITUFDX0luaXQoKEhNQUNfQ1RYKilkYXRhLT5jdHgsIGtleSwga2V5bGVuLCBFVlBfc2hhMSgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9TTURfU0lHTl9EU0FfU0hBMToKKyAgICAgIGVyciA9IEVWUF9TaWduSW5pdCgoRVZQX01EX0NUWCopZGF0YS0+Y3R4LCBFVlBfZHNzMSgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9TTURfU0lHTl9SU0FfU0hBMToKKyAgICAgIGVyciA9IEVWUF9TaWduSW5pdCgoRVZQX01EX0NUWCopZGF0YS0+Y3R4LCBFVlBfc2hhMSgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9TTURfVlJGWV9EU0FfU0hBMToKKyAgICAgIGVyciA9IEVWUF9WZXJpZnlJbml0KChFVlBfTURfQ1RYKilkYXRhLT5jdHgsIEVWUF9kc3MxKCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1NNRF9WUkZZX1JTQV9TSEExOgorICAgICAgZXJyID0gRVZQX1ZlcmlmeUluaXQoKEVWUF9NRF9DVFgqKWRhdGEtPmN0eCwgRVZQX3NoYTEoKSk7CisgICAgICBicmVhazsKKyAgfQorICAvKiBjaGVjayBhbmQgcmV0dXJuICovCisgIHJldHVybiBzb2FwX3NtZF9jaGVjayhzb2FwLCBkYXRhLCBlcnIsICJzb2FwX3NtZF9pbml0KCkgZmFpbGVkIik7Cit9CisKKy8qKgorQGZuIGludCBzb2FwX3NtZF91cGRhdGUoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3NtZF9kYXRhICpkYXRhLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCitAYnJpZWYgVXBkYXRlcyAoc2lnbmVkKSBkaWdlc3QgY29tcHV0YXRpb24gd2l0aCBtZXNzYWdlIHBhcnQuCitAcGFyYW0gc29hcCBjb250ZXh0CitAcGFyYW1baW4sb3V0XSBkYXRhIHNtZGV2cCBlbmdpbmUgY29udGV4dAorQHBhcmFtW2luXSBidWYgY29udGFpbnMgbWVzc2FnZSBwYXJ0CitAcGFyYW1baW5dIGxlbiBvZiBtZXNzYWdlIHBhcnQKK0ByZXR1cm4gU09BUF9PSyBvciBTT0FQX1NTTF9FUlJPUgorKi8KK2ludAorc29hcF9zbWRfdXBkYXRlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9zbWRfZGF0YSAqZGF0YSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreyBpbnQgZXJyID0gMTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICItLSBTTUQgVXBkYXRlIGFsZz0lZCAoJXApIC0tXG4iLCBkYXRhLT5hbGcsIGRhdGEtPmN0eCkpOworICBzd2l0Y2ggKGRhdGEtPmFsZykKKyAgeyBjYXNlIFNPQVBfU01EX0RHU1RfTUQ1OgorICAgIGNhc2UgU09BUF9TTURfREdTVF9TSEExOgorICAgICAgRVZQX0RpZ2VzdFVwZGF0ZSgoRVZQX01EX0NUWCopZGF0YS0+Y3R4LCAoY29uc3Qgdm9pZCopYnVmLCAodW5zaWduZWQgaW50KWxlbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfU01EX0hNQUNfU0hBMToKKyAgICAgIEhNQUNfVXBkYXRlKChITUFDX0NUWCopZGF0YS0+Y3R4LCAoY29uc3QgdW5zaWduZWQgY2hhciopYnVmLCBsZW4pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1NNRF9TSUdOX0RTQV9TSEExOgorICAgIGNhc2UgU09BUF9TTURfU0lHTl9SU0FfU0hBMToKKyAgICAgIGVyciA9IEVWUF9TaWduVXBkYXRlKChFVlBfTURfQ1RYKilkYXRhLT5jdHgsIChjb25zdCB2b2lkKilidWYsICh1bnNpZ25lZCBpbnQpbGVuKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9TTURfVlJGWV9EU0FfU0hBMToKKyAgICBjYXNlIFNPQVBfU01EX1ZSRllfUlNBX1NIQTE6CisgICAgICBlcnIgPSBFVlBfVmVyaWZ5VXBkYXRlKChFVlBfTURfQ1RYKilkYXRhLT5jdHgsIChjb25zdCB2b2lkKilidWYsICh1bnNpZ25lZCBpbnQpbGVuKTsKKyAgICAgIGJyZWFrOworICB9CisgIERCR01TRyhURVNULCBidWYsIGxlbik7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiXG4tLSIpKTsKKyAgLyogY2hlY2sgYW5kIHJldHVybiAqLworICByZXR1cm4gc29hcF9zbWRfY2hlY2soc29hcCwgZGF0YSwgZXJyLCAic29hcF9zbWRfdXBkYXRlKCkgZmFpbGVkIik7Cit9CisKKy8qKgorQGZuIGludCBzb2FwX3NtZF9maW5hbChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfc21kX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50ICpsZW4pCitAYnJpZWYgRmluYWxpemVzIChzaWduZWQpIGRpZ2VzdCBjb21wdXRhdGlvbiBhbmQgcmV0dXJucyBkaWdlc3Qgb3Igc2lnbmF0dXJlLgorQHBhcmFtIHNvYXAgY29udGV4dAorQHBhcmFtW2luLG91dF0gZGF0YSBzbWRldnAgZW5naW5lIGNvbnRleHQKK0BwYXJhbVtpbl0gYnVmIGNvbnRhaW5zIHNpZ25hdHVyZSBmb3IgdmVyaWZpY2F0aW9uIChTT0FQX1NNRF9WUkZZIGFsZ29yaXRobXMpCitAcGFyYW1bb3V0XSBidWYgaXMgcG9wdWxhdGVkIHdpdGggdGhlIGRpZ2VzdCBvciBzaWduYXR1cmUKK0BwYXJhbVtpbl0gbGVuIHBvaW50cyB0byBsZW5ndGggb2Ygc2lnbmF0dXJlIHRvIHZlcmlmeSAoU09BUF9TTURfVlJGWSBhbGdvcml0aG1zKQorQHBhcmFtW291dF0gbGVuIHBvaW50cyB0byBsZW5ndGggb2Ygc3RvcmVkIGRpZ2VzdCBvciBzaWduYXR1cmUgKHBhc3MgTlVMTCBpZiB5b3UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIHRoaXMgdmFsdWUpCitAcmV0dXJuIFNPQVBfT0sgb3IgU09BUF9TU0xfRVJST1IKKyovCitpbnQKK3NvYXBfc21kX2ZpbmFsKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9zbWRfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgKmxlbikKK3sgaW50IG4gPSAwLCBlcnIgPSAxOworICAvKiBmaW5hbGl6ZSB0aGUgZGlnZXN0IG9yIHNpZ25hdHVyZSBjb21wdXRhdGlvbiAqLworICBzd2l0Y2ggKGRhdGEtPmFsZykKKyAgeyBjYXNlIFNPQVBfU01EX0RHU1RfTUQ1OgorICAgIGNhc2UgU09BUF9TTURfREdTVF9TSEExOgorICAgICAgRVZQX0RpZ2VzdEZpbmFsKChFVlBfTURfQ1RYKilkYXRhLT5jdHgsICh1bnNpZ25lZCBjaGFyKilidWYsICZuKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9TTURfSE1BQ19TSEExOgorICAgICAgSE1BQ19GaW5hbCgoSE1BQ19DVFgqKWRhdGEtPmN0eCwgKHVuc2lnbmVkIGNoYXIqKWJ1ZiwgJm4pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1NNRF9TSUdOX0RTQV9TSEExOgorICAgIGNhc2UgU09BUF9TTURfU0lHTl9SU0FfU0hBMToKKyAgICAgIGVyciA9IEVWUF9TaWduRmluYWwoKEVWUF9NRF9DVFgqKWRhdGEtPmN0eCwgKHVuc2lnbmVkIGNoYXIqKWJ1ZiwgJm4sIChFVlBfUEtFWSopZGF0YS0+a2V5KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9TTURfVlJGWV9EU0FfU0hBMToKKyAgICBjYXNlIFNPQVBfU01EX1ZSRllfUlNBX1NIQTE6CisgICAgICBpZiAobGVuKQorICAgICAgeyBuID0gKHVuc2lnbmVkIGludCkqbGVuOworICAgICAgICBlcnIgPSBFVlBfVmVyaWZ5RmluYWwoKEVWUF9NRF9DVFgqKWRhdGEtPmN0eCwgKHVuc2lnbmVkIGNoYXIqKWJ1ZiwgbiwgKEVWUF9QS0VZKilkYXRhLT5rZXkpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBlcnIgPSAwOworICAgICAgYnJlYWs7CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICItLSBTTUQgRmluYWwgYWxnPSVkICglcCkgJWQgYnl0ZXMtLVxuIiwgZGF0YS0+YWxnLCBkYXRhLT5jdHgsIG4pKTsKKyAgREJHSEVYKFRFU1QsIGJ1Ziwgbik7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiXG4tLSIpKTsKKyAgLyogY2xlYW51cCBhbmQgZnJlZSB0aGUgSE1BQyBvciBFVlBfTUQgY29udGV4dCAqLworICBpZiAoZGF0YS0+YWxnID09IFNPQVBfU01EX0hNQUNfU0hBMSkKKyAgICBITUFDX0NUWF9jbGVhbnVwKChITUFDX0NUWCopZGF0YS0+Y3R4KTsKKyAgZWxzZQorICAgIEVWUF9NRF9DVFhfY2xlYW51cCgoRVZQX01EX0NUWCopZGF0YS0+Y3R4KTsKKyAgU09BUF9GUkVFKHNvYXAsIGRhdGEtPmN0eCk7CisgIGRhdGEtPmN0eCA9IE5VTEw7CisgIC8qIHJldHVybiBsZW5ndGggb2YgZGlnZXN0IG9yIHNpZ25hdHVyZSBwcm9kdWNlZCAqLworICBpZiAobGVuKQorICAgICpsZW4gPSAoaW50KW47CisgIC8qIGNoZWNrIGFuZCByZXR1cm4gKi8KKyAgcmV0dXJuIHNvYXBfc21kX2NoZWNrKHNvYXAsIGRhdGEsIGVyciwgInNvYXBfc21kX2ZpbmFsKCkgZmFpbGVkIik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICogU3RhdGljIGxvY2FsIGZ1bmN0aW9ucworICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorQGZuIGludCBzb2FwX3NtZF9jaGVjayhzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfc21kX2RhdGEgKmRhdGEsIGludCBlcnIsIGNvbnN0IGNoYXIgKm1zZykKK0BicmllZiBDaGVjayByZXN1bHQgb2YgaW5pdC91cGRhdGUvZmluYWwgc21kZXZwIGVuZ2luZSBvcGVyYXRpb25zLgorQHBhcmFtIHNvYXAgY29udGV4dAorQHBhcmFtW2luLG91dF0gZGF0YSBzbWRldnAgZW5naW5lIGNvbnRleHQKK0BwYXJhbVtpbl0gZXJyIE9wZW5TU0wgZXJyb3IgdmFsdWUKK0BwYXJhbVtpbl0gbXNnIGVycm9yIG1lc3NhZ2UKK0ByZXR1cm4gU09BUF9PSyBvciBTT0FQX1NTTF9FUlJPUgorKi8KK3N0YXRpYyBpbnQKK3NvYXBfc21kX2NoZWNrKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9zbWRfZGF0YSAqZGF0YSwgaW50IGVyciwgY29uc3QgY2hhciAqbXNnKQoreyBpZiAoZXJyIDw9IDApCisgIHsgdW5zaWduZWQgbG9uZyByOworICAgIHdoaWxlICgociA9IEVSUl9nZXRfZXJyb3IoKSkpCisgICAgeyBFUlJfZXJyb3Jfc3RyaW5nX24ociwgc29hcC0+bXNnYnVmLCBzaXplb2Yoc29hcC0+bXNnYnVmKSk7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIi0tIFNNRCBFcnJvciAoJWQpICVzOiAlc1xuIiwgZXJyLCBtc2csIHNvYXAtPm1zZ2J1ZikpOworICAgIH0KKyAgICBpZiAoZGF0YS0+Y3R4KQorICAgIHsgaWYgKGRhdGEtPmFsZyA9PSBTT0FQX1NNRF9ITUFDX1NIQTEpCisgICAgICAgIEhNQUNfQ1RYX2NsZWFudXAoKEhNQUNfQ1RYKilkYXRhLT5jdHgpOworICAgICAgZWxzZQorICAgICAgICBFVlBfTURfQ1RYX2NsZWFudXAoKEVWUF9NRF9DVFgqKWRhdGEtPmN0eCk7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgZGF0YS0+Y3R4KTsKKyAgICAgIGRhdGEtPmN0eCA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCBtc2csIHNvYXAtPm1zZ2J1ZiwgU09BUF9TU0xfRVJST1IpOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorCisvKioKK0BmbiBpbnQgc29hcF9zbWRfc2VuZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQorQGJyaWVmIENhbGxiYWNrIHRvIGludGVyY2VwdCBtZXNzYWdlcyBmb3IgZGlnZXN0IG9yIHNpZ25hdHVyZSBjb21wdXRhdGlvbi4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0BwYXJhbVtpbl0gYnVmIG1lc3NhZ2UKK0BwYXJhbVtpbl0gbGVuIG1lc3NhZ2UgbGVuZ3RoCitAcmV0dXJuIFNPQVBfT0sgb3IgU09BUF9TU0xfRVJST1IKKyovCitzdGF0aWMgaW50Citzb2FwX3NtZF9zZW5kKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7IHJldHVybiBzb2FwX3NtZF91cGRhdGUoc29hcCwgKHN0cnVjdCBzb2FwX3NtZF9kYXRhKilzb2FwLT51c2VyLCBidWYsIGxlbik7Cit9CisKKy8qKgorQGZuIHNpemVfdCBzb2FwX3NtZF9yZWN2KHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpidWYsIHNpemVfdCBsZW4pCitAYnJpZWYgRHVtbXkgY2FsbGJhY2sgdG8gYXZvaWQgcmVhZCBvcGVyYXRpb25zIGZyb20gYmxvY2tpbmcuCitAcmV0dXJuIDAKKyovCitzdGF0aWMgc2l6ZV90Citzb2FwX3NtZF9yZWN2KHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7IHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9wbHVnaW4vc21kZXZwLmggYi9wbHVnaW4vc21kZXZwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE1ODA4NwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbi9zbWRldnAuaApAQCAtMCwwICsxLDEyMSBAQAorLyoKKworc21kZXZwLmgKKworZ1NPQVAgRVZQIGludGVyZmFjZSBmb3IgKHNpZ25lZCkgbWVzc2FnZSBkaWdlc3QKKworZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlczoKK0dQTCwgdGhlIGdTT0FQIHB1YmxpYyBsaWNlbnNlLCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgcHVibGljIGxpY2Vuc2UuCisKK1RoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGdTT0FQIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4zCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKK0xpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoraHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL3NvYXBsaWNlbnNlLmh0bWwKK1NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCitXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKK2ZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK1RoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4uCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhLCBJbmMuLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZm5kZWYgU01ERVZQX0gKKyNkZWZpbmUgU01ERVZQX0gKKworI2luY2x1ZGUgInN0ZHNvYXAyLmgiCisKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyNpbmNsdWRlICJvcGVuc3NsL2V2cC5oIgorI2luY2x1ZGUgIm9wZW5zc2wvaG1hYy5oIgorI2luY2x1ZGUgIm9wZW5zc2wveDUwOS5oIgorI2VuZGlmCisKKy8qKiBFeHBvc2UgRVZQX1BLRVkgaW4gYSBwb3J0YWJsZSByZXByZXNlbnRhdGlvbiAqLworI2RlZmluZSBTT0FQX1NNRF9LRVlfVFlQRQlFVlBfUEtFWQorCisvKiogRXhwb3NlIEVWUF9NQVhfTURfU0laRSBpbiBhIHBvcnRhYmxlIHJlcHJlc2VudGF0aW9uICovCisjZGVmaW5lIFNPQVBfU01EX01BWF9TSVpFCUVWUF9NQVhfTURfU0laRQorCisvKiogTUQ1IGRpZ2VzdCBzaXplIGluIG9jdGV0cyAqLworI2RlZmluZSBTT0FQX1NNRF9NRDVfU0laRQkoMTYpCisKKy8qKiBTSEExIGRpZ2VzdCBzaXplIGluIG9jdGV0cyAqLworI2RlZmluZSBTT0FQX1NNRF9TSEExX1NJWkUJKDIwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqIFN1cHBvcnRlZCBhbGdvcml0aG1zCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBTT0FQX1NNRF9OT05FCQkoMCkKKy8qKiBNRDUgZGlnZXN0IGFsZ29yaXRobSAqLworI2RlZmluZSBTT0FQX1NNRF9ER1NUX01ENQkoMSkKKy8qKiBTSEExIGRpZ2VzdCBhbGdvcml0aG0gKi8KKyNkZWZpbmUgU09BUF9TTURfREdTVF9TSEExCSgyKQorLyoqIEhNQUMtU0hBMSBzaGFyZWQga2V5IHNpZ25hdHVyZSBhbGdvcml0aG0gKi8KKyNkZWZpbmUgU09BUF9TTURfSE1BQ19TSEExCSgzKQorLyoqIERTQS1TSEExIHNlY3JldCBrZXkgc2lnbmF0dXJlIGFsZ29yaXRobSAqLworI2RlZmluZSBTT0FQX1NNRF9TSUdOX0RTQV9TSEExCSg0KQorLyoqIFJTQS1TSEExIHNlY3JldCBrZXkgc2lnbmF0dXJlIGFsZ29yaXRobSAqLworI2RlZmluZSBTT0FQX1NNRF9TSUdOX1JTQV9TSEExCSg1KQorLyoqIERTQS1TSEExIHNlY3JldCBrZXkgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBhbGdvcml0aG0gKi8KKyNkZWZpbmUgU09BUF9TTURfVlJGWV9EU0FfU0hBMQkoNikKKy8qKiBSU0EtU0hBMSBzZWNyZXQga2V5IHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gYWxnb3JpdGhtICovCisjZGVmaW5lIFNPQVBfU01EX1ZSRllfUlNBX1NIQTEJKDcpCisKKy8qKgorQHN0cnVjdCBzb2FwX3NtZF9kYXRhCitAYnJpZWYgVGhlIHNtZGV2cCBlbmdpbmUgY29udGV4dCBkYXRhCisqLworc3RydWN0IHNvYXBfc21kX2RhdGEKK3sgaW50IGFsZzsJCS8qKjwgVGhlIGRpZ2VzdCBvciBzaWduYXR1cmUgYWxnb3JpdGhtIHVzZWQgKi8KKyAgdm9pZCAqY3R4OwkJLyoqPCBFVlBfTURfQ1RYIG9yIEhNQUNfQ1RYICovCisgIGNvbnN0IHZvaWQgKmtleTsJLyoqPCBFVlBfUEtFWSAqLworICBpbnQgKCpmc2VuZCkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc2l6ZV90KTsKKyAgc2l6ZV90ICgqZnJlY3YpKHN0cnVjdCBzb2FwKiwgY2hhciosIHNpemVfdCk7CisgIHNvYXBfbW9kZSBtb2RlOworICB2b2lkICp1c2VyOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKiBzb2FwX3NtZCBBUEkgZnVuY3Rpb25zCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc2l6ZV90IHNvYXBfc21kX3NpemUoaW50IGFsZywgY29uc3Qgdm9pZCAqa2V5KTsKKworaW50IHNvYXBfc21kX2JlZ2luKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgYWxnLCBjb25zdCB2b2lkICprZXksIGludCBrZXlsZW4pOworaW50IHNvYXBfc21kX2VuZChzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqYnVmLCBpbnQgKmxlbik7CisKK2ludCBzb2FwX3NtZF9pbml0KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9zbWRfZGF0YSAqZGF0YSwgaW50IGFsZywgY29uc3Qgdm9pZCAqa2V5LCBpbnQga2V5bGVuKTsKK2ludCBzb2FwX3NtZF91cGRhdGUoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3NtZF9kYXRhICpkYXRhLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pOworaW50IHNvYXBfc21kX2ZpbmFsKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9zbWRfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgKmxlbik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcGx1Z2luL3RocmVhZHMuYyBiL3BsdWdpbi90aHJlYWRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE5ODFiZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbi90aHJlYWRzLmMKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisKK3RocmVhZHMuYworCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHBhcnQgb2YgdGhlIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2VzOgorR1BMLCB0aGUgZ1NPQVAgcHVibGljIGxpY2Vuc2UsIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBwdWJsaWMgbGljZW5zZS4KKworVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZ1NPQVAgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjMKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcGxpY2Vuc2UuaHRtbAorU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKK1dJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQorZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFJvYmVydCBBLiB2YW4gRW5nZWxlbi4KK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaW5jbHVkZSAidGhyZWFkcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqCUVtdWxhdGlvbiBvZiBQT1NJWCBjb25kaXRpb24gdmFyaWFibGVzIGZvciBXSU4zMgorICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBXSU4zMgorCitpbnQgZW11bGF0ZV9wdGhyZWFkX2NvbmRfaW5pdChDT05EX1RZUEUgKmN2KQoreworICBjdi0+d2FpdGVyc19jb3VudF8gPSAwOworICBjdi0+c2lnbmFsX2V2ZW50XyA9IENyZWF0ZUV2ZW50KE5VTEwsIEZBTFNFLCBGQUxTRSwgTlVMTCk7CisKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBlbXVsYXRlX3B0aHJlYWRfY29uZF9kZXN0cm95KENPTkRfVFlQRSAqY3YpCit7CisgIENsb3NlSGFuZGxlKGN2LT5zaWduYWxfZXZlbnRfKTsKKworICByZXR1cm4gMDsKK30KKworaW50IGVtdWxhdGVfcHRocmVhZF9jb25kX3NpZ25hbChDT05EX1RZUEUgKmN2KQoreworICBpbnQgaGF2ZV93YWl0ZXJzOworCisgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZjdi0+d2FpdGVyc19jb3VudF9sb2NrXyk7CisgIGhhdmVfd2FpdGVycyA9IGN2LT53YWl0ZXJzX2NvdW50XyA+IDA7CisgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZjdi0+d2FpdGVyc19jb3VudF9sb2NrXyk7CisKKyAgaWYgKGhhdmVfd2FpdGVycykKKyAgICByZXR1cm4gU2V0RXZlbnQoY3YtPnNpZ25hbF9ldmVudF8pID09IDA7CisKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBlbXVsYXRlX3B0aHJlYWRfY29uZF93YWl0KENPTkRfVFlQRSAqY3YsIE1VVEVYX1RZUEUgKmNzKQoreworICBpbnQgcmVzdWx0OworCisgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZjdi0+d2FpdGVyc19jb3VudF9sb2NrXyk7CisgIGN2LT53YWl0ZXJzX2NvdW50XysrOworICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmY3YtPndhaXRlcnNfY291bnRfbG9ja18pOworCisgIExlYXZlQ3JpdGljYWxTZWN0aW9uKGNzKTsKKworICByZXN1bHQgPSAoV2FpdEZvclNpbmdsZU9iamVjdChjdi0+c2lnbmFsX2V2ZW50XywgSU5GSU5JVEUpID09IFdBSVRfRkFJTEVEKTsKKworICBFbnRlckNyaXRpY2FsU2VjdGlvbigmY3YtPndhaXRlcnNfY291bnRfbG9ja18pOworICBjdi0+d2FpdGVyc19jb3VudF8tLTsKKyAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmN2LT53YWl0ZXJzX2NvdW50X2xvY2tfKTsKKworICBFbnRlckNyaXRpY2FsU2VjdGlvbihjcywgSU5GSU5JVEUpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3BsdWdpbi90aHJlYWRzLmggYi9wbHVnaW4vdGhyZWFkcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ODM5ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW4vdGhyZWFkcy5oCkBAIC0wLDAgKzEsMTA1IEBACisvKgorCit0aHJlYWRzLmgKKworZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlczoKK0dQTCwgdGhlIGdTT0FQIHB1YmxpYyBsaWNlbnNlLCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgcHVibGljIGxpY2Vuc2UuCisKK1RoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGdTT0FQIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4zCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKK0xpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoraHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL3NvYXBsaWNlbnNlLmh0bWwKK1NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCitXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKK2ZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK1RoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4uCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZiBUSFJFQURTX0gKKyNkZWZpbmUgVEhSRUFEU19ICisKKyNpbmNsdWRlIDx1bmlzdGQuaD4JLyogZGVmaW5lcyBfUE9TSVhfVEhSRUFEUyBpZiBwdGhyZWFkcyBhcmUgYXZhaWxhYmxlICovCisjaWZkZWYgX1BPU0lYX1RIUkVBRFMKKyMgaW5jbHVkZSA8cHRocmVhZC5oPgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJVGhyZWFkcworICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBkZWZpbmVkKFdJTjMyKQorIyBkZWZpbmUgVEhSRUFEX1RZUEUJCUhBTkRMRQorIyBkZWZpbmUgVEhSRUFEX0lECQlHZXRDdXJyZW50VGhyZWFkSWQoKQorIyBkZWZpbmUgVEhSRUFEX0NSRUFURSh4LHkseikJKih4KSA9IF9iZWdpbnRocmVhZCgoeSksIE5VTEwsIDgqNDA5NiwgKHopKQorIyBkZWZpbmUgVEhSRUFEX0RFVEFDSCh4KQkKKyMgZGVmaW5lIFRIUkVBRF9KT0lOKHgpCQlXYWl0Rm9yU2luZ2xlT2JqZWN0KCh4KSwgSU5GSU5JVEUpCisjIGRlZmluZSBUSFJFQURfRVhJVAkJX2VuZHRocmVhZCgpCisjIGRlZmluZSBNVVRFWF9UWVBFCQlIQU5ETEUKKyMgZGVmaW5lIE1VVEVYX1NFVFVQKHgpCQkoeCkgPSBDcmVhdGVNdXRleChOVUxMLCBGQUxTRSwgTlVMTCkKKyMgZGVmaW5lIE1VVEVYX0NMRUFOVVAoeCkJQ2xvc2VIYW5kbGUoeCkKKyMgZGVmaW5lIE1VVEVYX0xPQ0soeCkJCVdhaXRGb3JTaW5nbGVPYmplY3QoKHgpLCBJTkZJTklURSkKKyMgZGVmaW5lIE1VVEVYX1VOTE9DSyh4KQlSZWxlYXNlTXV0ZXgoeCkKKyMgZGVmaW5lIENPTkRfU0VUVVAoeCkJCWVtdWxhdGVfcHRocmVhZF9jb25kX2luaXQoJih4KSkKKyMgZGVmaW5lIENPTkRfQ0xFQU5VUCh4KQllbXVsYXRlX3B0aHJlYWRfY29uZF9kZXN0cm95KCYoeCkpCisjIGRlZmluZSBDT05EX1NJR05BTCh4KQkJZW11bGF0ZV9wdGhyZWFkX3NpZ25hbCgmKHgpKQorIyBkZWZpbmUgQ09ORF9XQUlUKHgseSkJCWVtdWxhdGVfcHRocmVhZF93YWl0KCYoeCksICYoeSkpCit0eXBlZGVmIHN0cnVjdAoreyB1X2ludCB3YWl0ZXJzX2NvdW50XzsKKyAgQ1JJVElDQUxfU0VDVElPTiB3YWl0ZXJzX2NvdW50X2xvY2tfOworICBIQU5ETEUgc2lnbmFsX2V2ZW50XzsKK30gQ09ORF9UWVBFOworaW50IGVtdWxhdGVfcHRocmVhZF9jb25kX2luaXQoQ09ORF9UWVBFKik7CitpbnQgZW11bGF0ZV9wdGhyZWFkX2NvbmRfZGVzdHJveShDT05EX1RZUEUqKTsKK2ludCBlbXVsYXRlX3B0aHJlYWRfc2lnbmFsKENPTkRfVFlQRSopOworaW50IGVtdWxhdGVfcHRocmVhZF93YWl0KENPTkRfVFlQRSosIE1VVEVYX1RZUEUqKTsKKyNlbGlmIGRlZmluZWQoX1BPU0lYX1RIUkVBRFMpCisjIGRlZmluZSBUSFJFQURfVFlQRQkJcHRocmVhZF90CisjIGRlZmluZSBUSFJFQURfSUQJCXB0aHJlYWRfc2VsZigpCisjIGRlZmluZSBUSFJFQURfQ1JFQVRFKHgseSx6KQlwdGhyZWFkX2NyZWF0ZSgoeCksIE5VTEwsICh5KSwgKHopKQorIyBkZWZpbmUgVEhSRUFEX0RFVEFDSCh4KQlwdGhyZWFkX2RldGFjaCgoeCkpCisjIGRlZmluZSBUSFJFQURfSk9JTih4KQkJcHRocmVhZF9qb2luKCh4KSwgTlVMTCkKKyMgZGVmaW5lIFRIUkVBRF9FWElUCQlwdGhyZWFkX2V4aXQoTlVMTCkKKyMgZGVmaW5lIE1VVEVYX1RZUEUJCXB0aHJlYWRfbXV0ZXhfdAorIyBkZWZpbmUgTVVURVhfU0VUVVAoeCkJCXB0aHJlYWRfbXV0ZXhfaW5pdCgmKHgpLCBOVUxMKQorIyBkZWZpbmUgTVVURVhfQ0xFQU5VUCh4KQlwdGhyZWFkX211dGV4X2Rlc3Ryb3koJih4KSkKKyMgZGVmaW5lIE1VVEVYX0xPQ0soeCkJCXB0aHJlYWRfbXV0ZXhfbG9jaygmKHgpKQorIyBkZWZpbmUgTVVURVhfVU5MT0NLKHgpCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCYoeCkpCisjIGRlZmluZSBDT05EX1RZUEUJCXB0aHJlYWRfY29uZF90CisjIGRlZmluZSBDT05EX1NFVFVQKHgpCQlwdGhyZWFkX2NvbmRfaW5pdCgmKHgpLCBOVUxMKQorIyBkZWZpbmUgQ09ORF9DTEVBTlVQKHgpCXB0aHJlYWRfY29uZF9kZXN0cm95KCYoeCkpCisjIGRlZmluZSBDT05EX1NJR05BTCh4KQkJcHRocmVhZF9jb25kX3NpZ25hbCgmKHgpKQorIyBkZWZpbmUgQ09ORF9XQUlUKHgseSkJCXB0aHJlYWRfY29uZF93YWl0KCYoeCksICYoeSkpCisjZWxzZQorIyBlcnJvciAiTm8gUE9TSVggdGhyZWFkcyBkZXRlY3RlZDogd2UgbmVlZCB0aHJlYWQgYW5kIG11dGV4IG9wZXJhdGlvbnMuIFNlZSBmb3IgZXhhbXBsZSBPcGVuU1NMIC90aHJlYWRzL3RoLWxvY2suYyBvbiBob3cgdG8gaW1wbGVtZW50IG11dGV4IG9uIHlvdXIgcGxhdGZvcm0iCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9wbHVnaW4vd3NzZTJhcGkuYyBiL3BsdWdpbi93c3NlMmFwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMjhiYTEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW4vd3NzZTJhcGkuYwpAQCAtMCwwICsxLDI2NjcgQEAKKy8qCisKK3dzc2VhcGkuYworCitXUy1TZWN1cml0eSBwbHVnaW4KKworZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlczoKK0dQTCwgdGhlIGdTT0FQIHB1YmxpYyBsaWNlbnNlLCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgcHVibGljIGxpY2Vuc2UuCisKK1RoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGdTT0FQIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4zCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKK0xpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoraHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL3NvYXBsaWNlbnNlLmh0bWwKK1NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCitXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKK2ZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK1RoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4uCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworLyoqCisKK0BtYWlucGFnZQorCistIEByZWYgd3NzZSBkb2N1bWVudHMgdGhlIHdzc2UgcGx1Z2luIGZvciBXUy1TZWN1cml0eSAxLjAgc3VwcG9ydC4KKy0gQHJlZiBzbWRldnAgZG9jdW1lbnRzIHRoZSBzbWRldnAgZW5naW5lIHVzZWQgYnkgdGhlIHdzc2UgcGx1Z2luLgorCisqLworCisvKioKKworQHBhZ2Ugd3NzZSBUaGUgd3NzZSBwbHVnaW4KKworQHNlY3Rpb24gd3NzZV81IFNlY3VyaXR5IEhlYWRlcgorCitUaGUgbWF0ZXJpYWwgaW4gdGhpcyBzZWN0aW9uIHJlbGF0ZXMgdG8gdGhlIFdTLVNlY3VyaXR5IHNwZWNpZmljYXRpb24gc2VjdGlvbiA1LgorCitUbyB1c2UgdGhlIHdzc2UgcGx1Z2luOgorLSMgUnVuIHdzZGwyaCAtdCB0eXBlbWFwLmRhdCBvbiBhIFdTREwgb2YgYSBzZXJ2aWNlIHRoYXQgcmVxdWlyZXMgV1MtU2VjdXJpdHkKKyAgIGhlYWRlcnMuIFRoZSB0eXBlbWFwLmRhdCBmaWxlIGlzIHVzZWQgdG8gcmVjb2duaXplIGFuZCB0cmFuc2xhdGUgU2VjdXJpdHkKKyAgIGhlYWRlciBibG9ja3MuCistIyBSdW4gc29hcGNwcDIgb24gdGhlIGhlYWRlciBmaWxlIHByb2R1Y2VkIGJ5IHdzZGwyaC4KKy0jIChSZS0pY29tcGlsZSBzdGRzb2FwMi5jL3BwLCBkb20uYy9wcCwgc21kZXZwLmMsIHdzc2VhcGkuYyBhbmQgdGhlIGdlbmVyYXRlZAorICAgc291cmNlIGZpbGVzIHdpdGggdGhlIC1EV0lUSF9ET00gYW5kIC1EV0lUSF9PUEVOU1NMIGNvbXBpbGUgZmxhZ3Mgc2V0LiBUaGUKKyAgIHNtZGV2cC5jIGFuZCB3c3NhcGkuYyBmaWxlcyBhcmUgbG9jYXRlZCBpbiB0aGUgJ3BsdWdpbicgZGlyZWN0b3J5LgorLSMgVXNlIHRoZSB3c3NlIHBsdWdpbiBBUEkgZnVuY3Rpb25zIGRlc2NyaWJlZCBiZWxvdyB0byBhZGQgYW5kIHZlcmlmeQorICAgU2VjdXJpdHkgaGVhZGVycy4KKworQW4gZXhhbXBsZSB3c3NlIGNsaWVudC9zZXJ2ZXIgYXBwbGljYXRpb24gY2FuIGJlIGZvdW5kIGluIHNhbXBsZXMvd3NzZS4KKworVGhlIFNlY3VyaXR5IGhlYWRlciBibG9jayB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIFdTLVNlY3VyaXR5IHNjaGVtYSB3aXRoIHRoZQord3NkbDJoIHRvb2wgYW5kIFdTL1dTLXR5cGVtYXAuZGF0OgorCitAY29kZQorICAgICQgd3NkbDJoIC1jZWd4eSAtbyB3c3NlLmggLXQgV1MvV1MtdHlwZW1hcC5kYXQgV1Mvd3NzZS54c2QKK0BlbmRjb2RlCisKK1RoZSBzYW1lIHByb2Nlc3Mgd2FzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGhlYWRlciBmaWxlIGRzLmggZnJvbSB0aGUgWE1MIGRpZ2l0YWwKK3NpZ25hdHVyZXMgY29yZSBzY2hlbWEuCisKK1RoZSBpbXBvcnQvd3NzZS5oIGZpbGUgaGFzIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbiBmb3IgdGhlIFNlY3VyaXR5IGhlYWRlcgorYmxvY2s6CisKK0Bjb2RlCit0eXBlZGVmIHN0cnVjdCBfd3NzZTJfX1NlY3VyaXR5Cit7ICAgICAgIHN0cnVjdCBfd3N1X19UaW1lc3RhbXAqICAgICAgICAgICAgICAgICB3c3VfX1RpbWVzdGFtcDsKKyAgICAgICAgc3RydWN0IF93c3NlMl9fVXNlcm5hbWVUb2tlbiogICAgICAgICAgICBVc2VybmFtZVRva2VuOworICAgICAgICBzdHJ1Y3QgX3dzc2UyX19CaW5hcnlTZWN1cml0eVRva2VuKiAgICAgIEJpbmFyeVNlY3VyaXR5VG9rZW47CisgICAgICAgIHN0cnVjdCBkc19fU2lnbmF0dXJlVHlwZSogICAgICAgICAgICAgICBkc19fU2lnbmF0dXJlOworICAgICAgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUF9FTlZfX2FjdG9yOworICAgICAgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUF9FTlZfX3JvbGU7Cit9IF93c3NlMl9fU2VjdXJpdHk7CitAZW5kY29kZQorCitUbyBhZGQgYW4gZW1wdHkgU2VjdXJpdHkgaGVhZGVyIGJsb2NrIHRvIHRoZSBTT0FQIGhlYWRlciwgdXNlOgorCitAY29kZQorICAgIHNvYXBfd3NzZV9hZGRfU2VjdXJpdHkoc29hcCk7CitAZW5kY29kZQorCitUbyBkZWxldGUgYSBTZWN1cml0eSBoZWFkZXIsIHVzZToKKworQGNvZGUKKyAgICBzb2FwX3dzc2VfZGVsZXRlX1NlY3VyaXR5KHNvYXApOworQGVuZGNvZGUKKworQWRkaW5nIGFuIGVtcHR5IFNlY3VyaXR5IGhlYWRlciBibG9jayBpcyBub3QgdmVyeSB1c2VmdWwuIFdlIHdpbGwgbWFpbmx5IG1ha2UKK3VzZSBvZiB0aGUgaGlnaGVyLWxldmVsIGZ1bmN0aW9ucyBvZiB0aGUgd3NzZSBwbHVnaW4gdG8gcG9wdWxhdGUgYW5kIHZlcmlmeQorU2VjdXJpdHkgaGVhZGVyIGNvbnRlbnQuCisKK05vdGU6IFRoZSBzb2FwIGNvbnRleHQgaW5jbHVkZXMgYW4gYWN0b3IgdmFsdWUgc29hcC5hY3RvciB0aGF0IGlzIHBvcHVsYXRlZCBhbmQKK3JlbmRlcmVkIGFzIHRoZSBTT0FQLUVOVjphY3RvciAoU09BUCAxLjEpIG9yIFNPQVAtRU5WOnJvbGUgKFNPQVAgMS4yKSBhdHRyaWJ1dGUKK2luIFhNTCB3aXRoaW4gdGhlIGdlbmVyaWMgU09BUCBIZWFkZXIuIFRoZSBhdHRyaWJ1dGUgaXMgb3B0aW9uYWwsIGJ1dCBzaG91bGQgYmUKK3VzZWQgdG8gdGFyZ2V0IGEgcmVjaXBpZW50IHN1Y2ggYXMgYW4gaW50ZXJtZWRpYXRlIG5vZGUgdG8gcHJvY2VzcyB0aGUgU09BUAoraGVhZGVyLiAgSW4gY29udHJhc3QsIGFjdG9yIG9yIHJvbGUgYXR0cmlidXRlcyB3aXRoaW4gU2VjdXJpdHkgaGVhZGVyIGJsb2NrcwordGFyZ2V0IHNwZWNpZmljIHJlY2lwaWVudHMgdG8gcHJvY2VzcyB0aGUgU2VjdXJpdHkgaGVhZGVyIGJsb2NrLiBUaGUgZ1NPQVAKK2ltcGxlbWVudGF0aW9uIGRvZXMgbm90IGF1dG9tYXRlIHRoaXMgZmVhdHVyZSBhbmQgYXBwbGljYXRpb24gc2hvdWxkIHNldCBhbmQKK2NoZWNrIHRoZSBhY3Rvci9yb2xlIGF0dHJpYnV0ZSB3aGVuIG5lY2Vzc2FyeS4gSW4gYWRkaXRpb24sIHRoZSBjdXJyZW50CitpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyB0aGUgaW5jbHVzaW9uIG9mIGEgc2luZ2xlIFNlY3VyaXR5IGhlYWRlciBibG9jayBpbiB0aGUKK1NPQVAgaGVhZGVyLgorCitUbyBwb3B1bGF0ZSB0aGUgU09BUC1FTlY6YWN0b3Igb3IgU09BUC1FTlY6cm9sZSBhdHRyaWJ1dGUgd2l0aGluIHRoZSBTZWN1cml0eQoraGVhZGVyLCB1c2U6CisKK0Bjb2RlCisgICAgc29hcF93c3NlX2FkZF9TZWN1cml0eV9hY3Rvcihzb2FwLCAicmVjaXBpZW50Iik7CitAZW5kY29kZQorCitUbyBvYnRhaW4gdGhlIGFjdG9yIG9yIHJvbGUgdmFsdWUgKGUuZy4gYWZ0ZXIgcmVjZWl2aW5nIGEgbWVzc2FnZSksIHVzZToKKworQGNvZGUKKyAgICBfd3NzZTJfX1NlY3VyaXR5ICpzZWN1cml0eSA9IHNvYXBfd3NzZV9TZWN1cml0eShzb2FwKTsKKyAgICBpZiAoc2VjdXJpdHkpCisgICAgeyAuLi4gPSBzZWN1cml0eS0+U09BUF9FTlZfX2FjdG9yOyAvLyBTT0FQIDEuMQorICAgICAgLi4uID0gc2VjdXJpdHktPlNPQVBfRU5WX19yb2xlOyAgLy8gU09BUCAxLjIKK0BlbmRjb2RlCisKK1RoZSBTT0FQLUVOVjptdXN0VW5kZXJzdGFuZCBhdHRyaWJ1dGUgaXMgYXV0b21hdGljYWxseSBhZGRlZCBhbmQgY2hlY2tlZCBieSB0aGUKK2dTT0FQIGVuZ2luZS4gQSBnU09BUCBhcHBsaWNhdGlvbiBjb21waWxlZCB3aXRob3V0IFNlY3VyaXR5IHN1cHBvcnQgd2lsbCByZWplY3QKK1NlY3VyaXR5IGhlYWRlcnMuCisKK1NlY3VyaXR5IGhlYWRlciBibG9ja3MgYXJlIGF0dGFjaGVkIHRvIHRoZSBzb2FwIGNvbnRleHQsIHdoaWNoIG1lYW5zIHRoYXQgdGhlCitpbmZvcm1hdGlvbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkga2VwdCB0byBzdXBwb3J0IG11bHRpcGxlIGludm9jYXRpb25zLgorCitAc2VjdGlvbiB3c3NlXzYgU2VjdXJpdHkgVG9rZW5zCisKK1RoZSBtYXRlcmlhbCBpbiB0aGlzIHNlY3Rpb24gcmVsYXRlcyB0byB0aGUgV1MtU2VjdXJpdHkgc3BlY2lmaWNhdGlvbiBzZWN0aW9uIDYuCisKK0BzdWJzZWN0aW9uIHdzc2VfNl8yIFVzZXIgTmFtZSBUb2tlbgorCitUbyBhZGQgYSB1c2VyIG5hbWUgdG9rZW4gdG8gdGhlIFNlY3VyaXR5IGhlYWRlciBibG9jaywgdXNlOgorCitAY29kZQorICAgIHNvYXBfd3NzZV9hZGRfVXNlcm5hbWVUb2tlblRleHQoc29hcCwgIklkIiwgInVzZXJuYW1lIiwgTlVMTCk7CitAZW5kY29kZQorCitUaGUgSWQgdmFsdWUgaXMgb3B0aW9uYWwuIFdoZW4gbm9uLU5VTEwgdGhlIHVzZXIgbmFtZSB0b2tlbiBpcyBpbmNsdWRlZCBpbiB0aGUKK2RpZ2l0YWwgc2lnbmF0dXJlIHRvIHByb3RlY3QgaXRzIGludGVncml0eS4gSXQgaXMgY29tbW9uIGZvciB0aGUgd3NzZSBwbHVnaW4KK2Z1bmN0aW9ucyB0byBhY2NlcHQgc3VjaCBJZHMsIHdoaWNoIGFyZSBzZXJpYWxpemVkIGFzIHdzdTpJZCBpZGVudGlmaWVycyBmb3IKK2Nyb3NzLXJlZmVyZW5jaW5nIFhNTCBlbGVtZW50cy4gVGhlIHNpZ25hdHVyZSBlbmdpbmUgb2YgdGhlIHdzc2UgcGx1Z2luIGlzCitkZXNpZ25lZCB0byBhdXRvbWF0aWNhbGx5IHNpZ24gYWxsIHdzdTpJZCBhdHRyaWJ1dGVkIGVsZW1lbnRzIHRvIHNpbXBsaWZ5IHRoZQorY29kZSB5b3UgbmVlZCB0byB3cml0ZSB0byBpbXBsZW1lbnQgdGhlIHNpZ25pbmcgcHJvY2Vzcy4KKworVG8gYWRkIGEgdXNlciBuYW1lIHRva2VuIHdpdGggY2xlYXIgdGV4dCBwYXNzd29yZCwgdXNlOgorCitAY29kZQorICAgIHNvYXBfd3NzZV9hZGRfVXNlcm5hbWVUb2tlblRleHQoc29hcCwgIklkIiwgInVzZXJuYW1lIiwgInBhc3N3b3JkIik7CitAZW5kY29kZQorCitJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byB1c2UgQHJlZiBzb2FwX3dzc2VfYWRkX1VzZXJuYW1lVG9rZW5UZXh0IG9ubHkgaW4KK2NvbWJpbmF0aW9uIHdpdGggSFRUUFMgZW5jcnlwdGVkIHRyYW5zbWlzc2lvbiBvciBub3QgYXQgYWxsLiBBIGJldHRlcgorYWx0ZXJuYXRpdmUgaXMgdG8gdXNlIHBhc3N3b3JkIGRpZ2VzdHMuIFdpdGggcGFzc3dvcmQgZGlnZXN0IGF1dGhlbnRpY2F0aW9uLAordGhlIGRpZ2VzdCB2YWx1ZSBvZiBhIHBhc3N3b3JkICh3aXRoIG1lc3NhZ2UgY3JlYXRpb24gdGltZSBhbmQgYSByYW5kb20gbm9uY2UpCitpcyBjb21wYXJlZCBvbiBib3RoIHNpZGVzLCB0aHVzIGVsaW1pbmF0aW5nIHRoZSBuZWVkIHRvIGV4Y2hhbmdlIGEgcGFzc3dvcmQKK292ZXIgdGhlIHdpcmUuCisKK1RvIGFkZCBhIHVzZXIgbmFtZSB0b2tlbiB3aXRoIHBhc3N3b3JkIGRpZ2VzdCwgdXNlOgorCitAY29kZQorICAgIHNvYXBfd3NzZV9hZGRfVXNlcm5hbWVUb2tlbkRpZ2VzdChzb2FwLCAiSWQiLCAidXNlcm5hbWUiLCAicGFzc3dvcmQiKTsKK0BlbmRjb2RlCisKK0FsdGhvdWdoIHRoZSBwYXNzd29yZCBzdHJpbmcgaXMgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24sIGl0IGlzIG5vdCByZW5kZXJlZCBpbgorWE1MIG9yIHN0b3JlZCBpbiBhIG1lc3NhZ2UgbG9nLiBJdCBoYXMgYmVlbiBhcmd1ZWQgdGhhdCB0aGlzIGFwcHJvYWNoIGFkb3B0ZWQKK2J5IHRoZSBXUy1TZWN1cml0eSBwcm90b2NvbCBpcyBzdGlsbCB2dWxuZXJhYmxlIHNpbmNlIHRoZSBhcHBsaWNhdGlvbiByZXRyaWV2ZXMKK3RoZSBwYXNzd29yZCBpbiB0ZXh0IGZvcm0gcmVxdWlyaW5nIGEgZGF0YWJhc2UgdG8gc3RvcmUgcGFzc3dvcmRzIGluIGNsZWFyCit0ZXh0LiBIb3dldmVyLCBhIGRpZ2VzdCBhbGdvcml0aG0gY2FuIGJlIHVzZWQgdG8gaGFzaCB0aGUgcGFzc3dvcmRzIGFuZCBzdG9yZQordGhlaXIgZGlnZXN0cyBpbnN0ZWFkLCB3aGljaCBlbGltaW5hdGVzIHRoZSBuZWVkIHRvIHN0b3JlIGNsZWFyLXRleHQgcGFzc3dvcmRzLgorTm90ZSB0aGF0IHRoaXMgaXMgYSBjb21tb24gYXBwcm9hY2ggYWRvcHRlZCBieSBVbml4IGZvciBkZWNhZGVzLgorCitCeSBzZXR0aW5nIHRoZSBJZCB2YWx1ZSB0byBhIHVuaXF1ZSBzdHJpbmcsIHRoZSB1c2VyIG5hbWUgdG9rZW4gaXMgYWxzbworZGlnaXRhbGx5IHNpZ25lZCBieSB0aGUgc2lnbmF0dXJlIGVuZ2luZSBmdXJ0aGVyIHByZXZlbnRpbmcgdGFtcGVyaW5nIHdpdGggaXRzCit2YWx1ZS4KKworWW91IG11c3QgdXNlIEByZWYgc29hcF93c3NlX2FkZF9Vc2VybmFtZVRva2VuRGlnZXN0IGZvciBlYWNoIG1lc3NhZ2UgZXhjaGFuZ2UKK3RvIHJlZnJlc2ggdGhlIHBhc3N3b3JkIGRpZ2VzdCBldmVuIHdoZW4gdGhlIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgYXJlIG5vdAorY2hhbmdlZC4gT3RoZXJ3aXNlLCB0aGUgcmVjZWl2ZXIgbWlnaHQgZmxhZyB0aGUgbWVzc2FnZSBhcyBhIHJlcGxheSBhdHRhY2suCisKK0NsZWFyLXRleHQgcGFzc3dvcmRzIGFuZCBwYXNzd29yZCBkaWdlc3RzIGFyZSB2ZXJpZmllZCB3aXRoCitAcmVmIHNvYXBfd3NzZV92ZXJpZnlfUGFzc3dvcmQuIFRvIHZlcmlmeSBhIHBhc3N3b3JkIGF0IHRoZSByZWNlaXZpbmcgc2lkZSB0bworYXV0aG9yaXplIGEgcmVxdWVzdCAoZS5nLiB3aXRoaW4gYSBXZWIgc2VydmljZSBvcGVyYXRpb24pLCB1c2U6CisKK0Bjb2RlCisgICAgaW50IG5zX19teU1ldGhvZChzdHJ1Y3Qgc29hcCAqc29hcCwgLi4uKQorICAgIHsgY29uc3QgY2hhciAqdXNlcm5hbWUgPSBzb2FwX3dzc2VfZ2V0X1VzZXJuYW1lKHNvYXApOworICAgICAgY29uc3QgY2hhciAqcGFzc3dvcmQ7CisgICAgICBpZiAoIXVzZXJuYW1lKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7IC8vIG5vIHVzZXJuYW1lOiByZXR1cm4gRmFpbGVkQXV0aGVudGljYXRpb24KKyAgICAgIHBhc3N3b3JkID0gLi4uOyAvLyBsb29rdXAgcGFzc3dvcmQgb2YgdXNlcm5hbWUKKyAgICAgIGlmIChzb2FwX3dzc2VfdmVyaWZ5X1Bhc3N3b3JkKHNvYXAsIHBhc3N3b3JkKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOyAvLyBwYXNzd29yZCB2ZXJpZmljYXRpb24gZmFpbGVkOiByZXR1cm4gRmFpbGVkQXV0aGVudGljYXRpb24KKyAgICAgIC4uLiAvLyBwcm9jZXNzIHJlcXVlc3QKKyAgICAgIHJldHVybiBTT0FQX09LOworICAgIH0KK0BlbmRjb2RlCisKK05vdGUgdGhhdCB0aGUgQHJlZiBzb2FwX3dzc2VfZ2V0X1VzZXJuYW1lIGZ1bmN0aW9ucyBzZXRzIHRoZQord3NzZTpGYWlsZWRBdXRoZW50aWNhdGlvbiBmYXVsdC4gSXQgaXMgY29tbW9uIGZvciB0aGUgd3NzZSBwbHVnaW4gZnVuY3Rpb25zIHRvCityZXR1cm4gU09BUF9PSyBvciBhIHdzc2UgZmF1bHQgdGhhdCBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSBzZW5kZXIgYnkgcmV0dXJuaW5nCitzb2FwLT5lcnJvciBmcm9tIHNlcnZpY2Ugb3BlcmF0aW9ucy4gVGhlIGZhdWx0IGlzIGRpc3BsYXllZCB3aXRoIHRoZSBAcmVmCitzb2FwX3ByaW50X2ZhdWx0IGZ1bmN0aW9uLgorCitQYXNzd29yZCBkaWdlc3QgYXV0aGVudGljYXRpb24gcHJldmVudHMgbWVzc2FnZSByZXBsYXkgYXR0YWNrcy4gVGhlIHdzc2UgcGx1Z2luCitrZWVwcyBhIGRhdGFiYXNlIG9mIHBhc3N3b3JkIGRpZ2VzdHMgdG8gdGh3YXJ0IHJlcGxheSBhdHRhY2tzLiBUaGlzIGlzIHRoZQorb25seSBwYXJ0IGluIHRoZSBwbHVnaW4gY29kZSB0aGF0IHJlcXVpcmVzIG11dGV4IHByb3ZpZGVkIGJ5IHRocmVhZHMuaC4gIE9mCitjb3Vyc2UsIHRoaXMgb25seSB3b3JrcyBjb3JyZWN0bHkgaWYgdGhlIHNlcnZlciBpcyBwZXJzaXN0ZW50LCBzdWNoIGFzIGEKK3N0YW5kLWFsb25lIHNlcnZpY2UuIE5vdGUgdGhhdCBDR0ktYmFzZWQgc2VydmljZXMgZG8gbm90IGtlZXAgc3RhdGUuIE1hY2hpbmUKK2Nsb2NrcyBtdXN0IGJlIHN5bmNocm9uaXplZCBhbmQgY2xvY2sgc2tldyBzaG91bGQgbm90IGV4Y2VlZCBAcmVmCitTT0FQX1dTU0VfQ0xLU0tFVyBhdCB0aGUgc2VydmVyIHNpZGUuCisKK0BzdWJzZWN0aW9uIHdzc2VfNl8zIEJpbmFyeSBTZWN1cml0eSBUb2tlbnMKKworWDUwOSBjZXJ0aWZpY2F0ZXMgYXJlIGNvbW1vbmx5IGluY2x1ZGVkIGluIFNlY3VyaXR5IGhlYWRlciBibG9ja3MgYXMgYmluYXJ5CitzZWN1cml0eSB0b2tlbnMuIEEgY2VydGlmaWNhdGUgaXMgdXNlZCB0byB2ZXJpZnkgdGhlIGRpZ2l0YWwgc2lnbmF0dXJlIG9mIGEKK2RpZ2l0YWxseSBzaWduZWQgbWVzc2FnZSB1c2luZyB0aGUgcHVibGljIGtleSBlbWJlZGRlZCB3aXRoaW4gdGhlIGNlcnRpZmljYXRlLgorVGhlIGNlcnRpZmljYXRlIGl0c2VsZiBpcyBzaWduZWQgYnkgYSBjZXJ0aWZpY2F0ZSBhdXRob3JpdHkgKENBKSB0aGF0IHZvdWNoZXMKK2ZvciB0aGUgYXV0aGVudGljaXR5IG9mIHRoZSBjZXJ0aWZpY2F0ZSwgaS5lLiB0byBwcm92ZSB0aGUgaWRlbnRpZnkgb2YgdGhlCittZXNzYWdlIG9yaWdpbmF0b3IuIFRoaXMgdmVyaWZpY2F0aW9uIHByb2Nlc3MgaXMgaW1wb3J0YW50LCBiZWNhdXNlIGRpZ2l0YWwKK3NpZ25hdHVyZXMgYXJlIHVzZWxlc3Mgd2l0aG91dCB2ZXJpZmljYXRpb246IGFuIGF0dGFja2VyIGNvdWxkIHNpbXBseSByZXBsYWNlCit0aGUgbWVzc2FnZSwgc2lnbiBpdCwgYW5kIHJlcGxhY2UgdGhlIGNlcnRpZmljYXRlLgorCitDZXJ0aWZpY2F0ZXMgYXJlIGF1dG9tYXRpY2FsbHkgdmVyaWZpZWQgYnkgdGhlIHdzc2UgcGx1Z2luIHNpZ25hdHVyZSBlbmdpbmUKK3doZW4gcmVjZWl2ZWQgYW5kIGFjY2Vzc2VkLCB3aGljaCBtZWFucyB0aGF0IHRoZSBjZXJ0aWZpY2F0ZXMgb2YgdGhlIENBcyBtdXN0CitiZSBtYWRlIGFjY2Vzc2libGUgdG8gdGhlIHdzc2UgcGx1Z2luIGFzIGZvbGxvd3M6CisKK0Bjb2RlCisgICAgc29hcC0+Y2FmaWxlID0gImNhY2VydHMucGVtIjsgIC8vIHVzZSB0aGlzCisgICAgc29hcC0+Y2FwYXRoID0gImRpci90by9jZXJ0cyI7IC8vIGFuZC9vciBwb2ludCB0byBDQSBjZXJ0cworICAgIHNvYXAtPmNybGZpbGUgPSAicmV2b2tlZC5wZW0iOyAvLyB1c2UgQ1JMIChvcHRpb25hbCkKK0BlbmRjb2RlCisKK1RoZSBAcmVmIHNvYXBfd3NzZV92ZXJpZnlfWDUwOSBmdW5jdGlvbiBjaGVja3MgdGhlIHZhbGlkaXR5IG9mIGEgY2VydGlmaWNhdGUuCitUaGUgY2hlY2sgaXMgYXV0b21hdGljYWxseSBwZXJmb3JtZWQuIFRoZSBjaGVjayBpcyBhbHNvIHBlcmZvcm1lZCB3aGVuCityZXRyaWV2aW5nIHRoZSBjZXJ0aWZpY2F0ZSBmcm9tIGEgU2VjdXJpdHkgaGVhZGVyIGJsb2NrLCBlaXRoZXIgYXV0b21hdGljYWxseQorYnkgdGhlIHdzc2UgcGx1Z2luJ3Mgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBlbmdpbmUgb3IgbWFudWFsbHkgYXMgZm9sbG93czoKKworQGNvZGUKKyAgICBYNTA5ICpjZXJ0ID0gc29hcF93c3NlX2dldF9CaW5hcnlTZWN1cml0eVRva2VuWDUwOShzb2FwLCAiSWQiKTsKK0BlbmRjb2RlCisKK3doZXJlIElkIGlzIHRoZSBpZGVudGlmaWNhdGlvbiBzdHJpbmcgb2YgdGhlIGJpbmFyeSBzZWN1cml0eSB0b2tlbiBvciBOVUxMLgorCitUaGUgdmVyaWZpY2F0aW9uIGlzIGFuIGV4cGVuc2l2ZSBwcm9jZXNzIHRoYXQgd2lsbCBiZSBvcHRpbWl6ZWQgaW4gZnV0dXJlCityZWxlYXNlcyBieSBjYWNoaW5nIHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbi4KKworVG8gYXR0YWNoIGEgYmluYXJ5IHNlY3VyaXR5IHRva2VuIHN0b3JlZCBpbiBhIFBFTSBmaWxlIHRvIGEgU2VjdXJpdHkgaGVhZGVyCitibG9jayBmb3IgdHJhbnNtaXNzaW9uLCB1c2U6CisKK0Bjb2RlCisgICAgc29hcF93c3NlX2FkZF9CaW5hcnlTZWN1cml0eVRva2VuUEVNKHNvYXAsIE5VTEwsICJteWNlcnQucGVtIikKK0BlbmRjb2RlCisKK0EgYmluYXJ5IHNlY3VyaXR5IHRva2VuIGNhbiBiZSBhdXRvbWF0aWNhbGx5IHNpZ25lZCBieSBzZXR0aW5nIGl0cyBJZAorYXR0cmlidXRlOgorCitAY29kZQorICAgIHNvYXBfd3NzZV9hZGRfQmluYXJ5U2VjdXJpdHlUb2tlblBFTShzb2FwLCAiWDUwOVRva2VuIiwgIm15Y2VydC5wZW0iKQorQGVuZGNvZGUKKworUmVwZWF0ZWRseSBsb2FkaW5nIGEgY2VydGlmaWNhdGUgZnJvbSBhIFBFTSBmaWxlIGlzIGluZWZmaWNpZW50LiBUbyByZXVzZSBhCitjZXJ0aWZpY2F0ZSBsb2FkZWQgZnJvbSBhIFBFTSBmaWxlIGZvciBtdWx0aXBsZSBpbnZvY2F0aW9ucywgdXNlOgorCitAY29kZQorICAgIEZJTEUgKmZkID0gZm9wZW4oIm15Y2VydC5wZW0iLCAiciIpOworICAgIFg1MDkgKmNlcnQgPSBQRU1fcmVhZF9YNTA5KGZkLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBmY2xvc2UoZmQpOworICAgIGlmIChzb2FwX3dzc2VfYWRkX0JpbmFyeVNlY3VyaXR5VG9rZW5YNTA5KHNvYXAsICJYNTA5VG9rZW4iLCBjZXJ0KSkKKyAgICAgIC4uLiAvLyBhbiBlcnJvciBvY2N1cnJlZAorQGVuZGNvZGUKKworT3RoZXIgdHlwZXMgb2YgYmluYXJ5IHNlY3VyaXR5IHRva2VucyBjYW4gYmUgYWRkZWQgdG8gdGhlIFNlY3VyaXR5IGhlYWRlciBibG9jayB1c2luZzoKKworQGNvZGUKKyAgICBzb2FwX3dzc2VfYWRkX0JpbmFyeVNlY3VyaXR5VG9rZW4oc29hcCwgIklkIiwgInZhbHVlVHlwZSIsIGRhdGEsIGRhdGFsZW4pOworQGVuZGNvZGUKKworQHNlY3Rpb24gd3NzZV82XzQgWE1MIFRva2VucworCitUaGUgdXNlIGFuZCBwcm9jZXNzaW5nIHJ1bGVzIGZvciBYTUwgdG9rZW5zIHN1Y2ggYXMgU0FNTCBhc3NlcnRpb25zIGlzIHNwZWNpZmljCit0byBhbiBhcHBsaWNhdGlvbi4gIFRoZSB3c3NlIHBsdWdpbiBkb2VzIG5vdCBhdXRvbWF0ZSB0aGUgdXNlIG9mIFhNTCB0b2tlbnMuCitUaGUgZGV2ZWxvcGVyIGlzIGVuY291cmFnZWQgdG8gZ2VuZXJhdGUgY29kZSBmb3IgdGhlIFNBTUwgc2NoZW1hIHdpdGggd3NkbDJoCithbmQgYWRkIHRoZSBuZWNlc3NhcnkgYXNzZXJ0aW9ucyB0byB0aGUgU2VjdXJpdHkgaGVhZGVyIGJsb2NrOgorCitAY29kZQordHlwZWRlZiBzdHJ1Y3QgX3dzc2UyX19TZWN1cml0eQoreyAgICAgICBzdHJ1Y3QgX3dzdV9fVGltZXN0YW1wKiAgICAgICAgICAgICAgICAgd3N1X19UaW1lc3RhbXA7CisgICAgICAgIHN0cnVjdCBfd3NzZTJfX1VzZXJuYW1lVG9rZW4qICAgICAgICAgICAgVXNlcm5hbWVUb2tlbjsKKyAgICAgICAgc3RydWN0IF93c3NlMl9fQmluYXJ5U2VjdXJpdHlUb2tlbiogICAgICBCaW5hcnlTZWN1cml0eVRva2VuOworCXN0cnVjdCBfc2FtbF9fQXNzZXJ0aW9uKgkJc2FtbF9fQXNzZXJ0aW9uOyAvLyBhZGRlZAorICAgICAgICBzdHJ1Y3QgZHNfX1NpZ25hdHVyZVR5cGUqICAgICAgICAgICAgICAgZHNfX1NpZ25hdHVyZTsKKyAgICAgICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBfRU5WX19hY3RvcjsKKyAgICAgICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBfRU5WX19yb2xlOworfSBfd3NzZTJfX1NlY3VyaXR5OworQGVuZGNvZGUKKworQWx0ZXJuYXRpdmVseSwgYSBET00gY2FuIGJlIHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIFhNTCB0b2tlbnM6CisKK0Bjb2RlCisjaW1wb3J0ICJkb20uaCIKK3R5cGVkZWYgc3RydWN0IF93c3NlMl9fU2VjdXJpdHkKK3sgICAgICAgc3RydWN0IF93c3VfX1RpbWVzdGFtcCogICAgICAgICAgICAgICAgIHdzdV9fVGltZXN0YW1wOworICAgICAgICBzdHJ1Y3QgX3dzc2UyX19Vc2VybmFtZVRva2VuKiAgICAgICAgICAgIFVzZXJuYW1lVG9rZW47CisgICAgICAgIHN0cnVjdCBfd3NzZTJfX0JpbmFyeVNlY3VyaXR5VG9rZW4qICAgICAgQmluYXJ5U2VjdXJpdHlUb2tlbjsKKyAgICAgICAgc3RydWN0IGRzX19TaWduYXR1cmVUeXBlKiAgICAgICAgICAgICAgIGRzX19TaWduYXR1cmU7CisJaW50CQkJCQlfX3NpemU7CisJeHNkX19hbnlUeXBlKgkJCQlhbnk7CisgICAgICAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQX0VOVl9fYWN0b3I7CisgICAgICAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQX0VOVl9fcm9sZTsKK30gX3dzc2UyX19TZWN1cml0eTsKK0BlbmRjb2RlCisKK0BzZWN0aW9uIHdzc2VfNyBUb2tlbiBSZWZlcmVuY2VzCisKK1RoZSBtYXRlcmlhbCBpbiB0aGlzIHNlY3Rpb24gcmVsYXRlcyB0byB0aGUgV1MtU2VjdXJpdHkgc3BlY2lmaWNhdGlvbiBzZWN0aW9uIDcuCisKK1RvIHVzZSBhIGNlcnRpZmljYXRlIGZvciBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLCBhZGQgYSBkaXJlY3Qgc2VjdXJpdHkgdG9rZW4KK3JlZmVyZW5jZSBVUkkgZm9yIHRoZSB0b2tlbiB0byB0aGUgS2V5SW5mbywgZm9yIGV4YW1wbGU6CisKK0Bjb2RlCisgICAgc29hcF93c3NlX2FkZF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VVUkkoc29hcCwgIlVSSSIsICJ2YWx1ZVR5cGUiKTsKK0BlbmRjb2RlCisKK2FuZDoKKworQGNvZGUKKyAgICBzb2FwX3dzc2VfYWRkX0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZVg1MDkoc29hcCwgIlVSSSIpOworQGVuZGNvZGUKKworRm9yIFg1MDkgY2VydGlmaWNhdGVzIHdlIHVzZSB0aGlzIHRvIGFkZCBhIGJpbmFyeSBzZWN1cml0eSB0b2tlbiB3aXRoIHRoZQorY2VydGlmaWNhdGUgYW5kIGEgcmVmZXJlbmNlIHRvIHRoZSBsb2NhbCB0b2tlbjoKKworQGNvZGUKKyAgICBpZiAoc29hcF93c3NlX2FkZF9CaW5hcnlTZWN1cml0eVRva2VuWDUwOShzb2FwLCAiWDUwOVRva2VuIiwgY2VydCkKKyAgICAgfHwgc29hcF93c3NlX2FkZF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VYNTA5KHNvYXAsICIjWDUwOVRva2VuIikpCisgICAgICAuLi4gLy8gYW4gZXJyb3Igb2NjdXJyZWQKK0BlbmRjb2RlCisKK1RoaXMgZm9sbG93cyB0aGUgcmVjb21tZW5kZWQgcHJhY3RpY2UgdG8gcGxhY2UgU2VjdXJpdHkgdG9rZW4gcmVmZXJlbmNlcyBpbgordGhlIEtleUluZm8gZWxlbWVudCBvZiBhIFNpZ25hdHVyZS4gVGhlIEtleUluZm8gaXMgdXNlZCB0byB2ZXJpZnkgdGhlIHZhbGlkaXR5CitvZiBhIHNpZ25hdHVyZSB2YWx1ZS4KKworS2V5IGlkZW50aWZpZXJzIGNhbiBiZSB1c2VkIGFzIHdlbGw6CisKK0Bjb2RlCisgICAgc29hcF93c3NlX2FkZF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VLZXlJZGVudGlmaWVyKHNvYXAsICJJZCIsICJ2YWx1ZVR5cGUiLCBkYXRhLCBkYXRhbGVuKTsKK0BlbmRjb2RlCisKK0VtYmVkZGVkIHJlZmVyZW5jZXMgYXJlIGFkZGVkIHdpdGg6CisKK0Bjb2RlCisgICAgc29hcF93c3NlX2FkZF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VFbWJlZGRlZChzb2FwLCAiSWQiLCAidmFsdWVUeXBlIik7CitAZW5kY29kZQorCitUT0RPIGl0ZW06IGZ1bGwgc3VwcG9ydCBmb3IgZW1iZWRkZWQgcmVmZXJlbmNlIGlzIGN1cnJlbnRseSB1bmRlciBjb25zdHJ1Y3Rpb24uCisKK1RoZSB1c2Ugb2Yga2V5IG5hbWVzIGlzIG5vdCByZWNvbW1lbmRlZCwgYnV0IGluIGNhc2UgdGhleSBhcmUgcmVxdWlyZWQgdGhleSBjYW4KK2JlIGFkZGVkIHdpdGg6CisKK0Bjb2RlCisgICAgc29hcF93c3NlX2FkZF9LZXlJbmZvX0tleU5hbWUoc29hcCwgIm5hbWUiKTsKK0BlbmRjb2RlCisKK0BzZWN0aW9uIHdzc2VfOCBTaWduYXR1cmVzCisKK1RoZSBtYXRlcmlhbCBpbiB0aGlzIHNlY3Rpb24gcmVsYXRlcyB0byB0aGUgV1MtU2VjdXJpdHkgc3BlY2lmaWNhdGlvbiBzZWN0aW9uIDguCisKK1RoZSB3c3NlIHBsdWdpbiBtdXN0IGJlIHJlZ2lzdGVyZWQgdG8gc2lnbiBhbmQgdmVyaWZ5IG1lc3NhZ2VzOgorCitAY29kZQorICAgIHNvYXBfcmVnaXN0ZXJfcGx1Z2luKHNvYXAsIHNvYXBfd3NzZSk7CitAZW5kY29kZQorCitYTUwgc2lnbmF0dXJlcyBhcmUgdXN1YWxseSBjb21wdXRlZCBvdmVyIG5vcm1hbGl6ZWQgWE1MICh0byBlbnN1cmUgdGhlIFhNTAorcHJvY2Vzc29ycyBvZiBpbnRlcm1lZGlhdGUgbm9kZXMgY2FuIGFjY3VyYXRlbHkgcmVwcm9kdWNlIHRoZSBYTUwpLiBUbyB0aGlzCitlbmQsIHRoZSBleGNsdXNpdmUgY2Fub25pY2FsIFhNTCBzdGFuZGFyZCAoZXhjLWMxNG4pIGlzIHJlcXVpcmVkLCB3aGljaCBpcyBzZXQKK3VzaW5nIHRoZSBTT0FQX1hNTF9DQU5PTklDQUwgZmxhZzoKKworQGNvZGUKKyAgICBzdHJ1Y3Qgc29hcCAqc29hcCA9IHNvYXBfbmV3MShTT0FQX1hNTF9DQU5PTklDQUwpOworICAgIHNvYXBfcmVnaXN0ZXJfcGx1Z2luKHNvYXAsIHNvYXBfd3NzZSk7CitAZW5kY29kZQorCitJZiB5b3UgcHJlZmVyIFhNTCBpbmRlbnRhdGlvbiwgdXNlOgorCitAY29kZQorICAgIHN0cnVjdCBzb2FwICpzb2FwID0gc29hcF9uZXcxKFNPQVBfWE1MX0NBTk9OSUNBTCB8IFNPQVBfWE1MX0lOREVOVCk7CisgICAgc29hcF9yZWdpc3Rlcl9wbHVnaW4oc29hcCwgc29hcF93c3NlKTsKK0BlbmRjb2RlCisKK05leHQsIHdlIGRlY2lkZSB3aGljaCBzaWduYXR1cmUgYWxnb3JpdGhtIGlzIGFwcHJvcHJpYXRlIHRvIHVzZToKKy0gSE1BQy1TSEExIHVzZXMgYSBzZWNyZXQga2V5IChhbHNvIGtub3duIGFzIGEgc2hhcmVkIGtleSBpbiBzeW1tZXRyaWMKKyAgY3J5cHRvZ3JhcGh5KSB0byBzaWduIHRoZSBTSEExIGRpZ2VzdCBvZiB0aGUgU2lnbmVkSW5mbyBlbGVtZW50LgorLSBEU0EtU0hBMSB1c2VzIGEgRFNBIHByaXZhdGUga2V5IHRvIHNpZ24gdGhlIFNIQTEgZGlnZXN0IG9mIHRoZSBTaWduZWRJbmZvCisgIGVsZW1lbnQuCistIFJTQS1TSEExIHVzZXMgYSBSU0EgcHJpdmF0ZSBrZXkgdG8gc2lnbiB0aGUgU0hBMSBkaWdlc3Qgb2YgdGhlIFNpZ25lZEluZm8KKyAgZWxlbWVudC4KKworSE1BQy1TSEExIGlzIHRoZSBzaW1wbGVzdCBtZXRob2QsIGJ1dCByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCB5b3UgaGF2ZSB0byBtYWtlCithYnNvbHV0ZWx5IHN1cmUgdGhlIGtleSBpcyBrZXB0IHNlY3JldCBvbiBib3RoIHRoZSBzZW5kaW5nIGFuZCByZWNlaXZpbmcgc2lkZS4KK0FzIGxvbmcgYXMgdGhlIHNlY3JldCBrZXkgaXMgY29uZmlkZW50aWFsLCBtZXNzYWdlcyBhcmUgc2VjdXJlbHkgc2lnbmVkLgorSG93ZXZlciwgdGhpcyBpcyB2aXJ0dWFsbHkgaW1wb3NzaWJsZSB3aGVuIGV4Y2hhbmdpbmcgbWVzc2FnZXMgd2l0aCB1bnRydXN0ZWQKK2Rpc3BhcmF0ZSBwYXJ0aWVzLiBUaGUgYWR2YW50YWdlIG9mIEhNQUMtU0hBMSBpcyB0aGUgc3BlZWQgYnkgd2hpY2ggbWVzc2FnZXMKK2FyZSBzaWduZWQgYW5kIHZlcmlmaWVkLgorCitEU0EtU0hBMSBhbmQgUlNBLVNIQTEgcmVseSBvbiBwdWJsaWMga2V5IGNyeXB0b2dyYXBoeS4gSW4gc2ltcGxpZmllZCB0ZXJtcywgYQorbWVzc2FnZSBpcyBzaWduZWQgdXNpbmcgdGhlIChjb25maWRlbnRpYWwhKSBwcml2YXRlIGtleS4gVGhlIHB1YmxpYyBrZXkgaXMgdXNlZAordG8gdmVyaWZ5IHRoZSBzaWduYXR1cmUuIFNpbmNlIG9ubHkgdGhlIG9yaWdpbmF0aW5nIHBhcnR5IGNvdWxkIGhhdmUgdXNlZCBpdHMKK3ByaXZhdGUga2V5IHRvIHNpZ24gdGhlIG1lc3NhZ2UsIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIG1lc3NhZ2UgaXMgZ3VhcmFudGVlZC4gT2YKK2NvdXJzZSwgd2UgbXVzdCB0cnVzdCB0aGUgcHVibGljIGtleSBjYW1lIGZyb20gdGhlIG9yaWdpbmF0b3IgKGl0IGlzIG9mdGVuCitpbmNsdWRlZCBhcyBhbiBYNTA5IGNlcnRpZmljYXRlIGluIHRoZSBtZXNzYWdlKS4gVG8gdGhpcyBlbmQsIGEgdHJ1c3RlZAorY2VydGlmaWNhdGUgYXV0aG9yaXR5IHNob3VsZCBoYXZlIHNpZ25lZCB0aGUgcHVibGljIGtleSwgdGhlcmVieSBjcmVhdGluZyBhCitYNTA5IGNlcnRpZmljYXRlIHRoYXQgY29udGFpbnMgdGhlIHB1YmxpYyBrZXkgYW5kIHRoZSBpZGVudGl0eSBvZiB0aGUgbWVzc2FnZQorb3JpZ2luYXRvci4KKworQHN1YnNlY3Rpb24gd3NzZV84XzJhIFNpZ25pbmcgTWVzc2FnZXMKKworQWZ0ZXIgdGhlIHBsdWdpbiBpcyByZWdpc3RlcmVkIGFuZCBhIHNpZ25hdHVyZSBhbGdvcml0aG0gc2VsZWN0ZWQsIHRoZQorQHJlZiBzb2FwX3dzc2Vfc2lnbiBmdW5jdGlvbiBvciB0aGUgQHJlZiBzb2FwX3dzc2Vfc2lnbl9ib2R5IGZ1bmN0aW9uIGlzIHVzZWQKK3RvIGluaXRpYXRlIHRoZSBzaWduYXR1cmUgZW5naW5lIHRvIGF1dG9tYXRpY2FsbHkgc2lnbiBvdXRib3VuZCBtZXNzYWdlcy4KKworVGhlIGNvZGUgdG8gc2lnbiB0aGUgU09BUCBCb2R5IG9mIGEgbWVzc2FnZSB1c2luZyBITUFDLVNIQTEgaXM6CisKK0Bjb2RlCisgICAgc3RhdGljIGNoYXIgaG1hY19rZXlbMTZdID0KKyAgICB7IDB4ZmYsIDB4ZWUsIDB4ZGQsIDB4Y2MsIDB4YmIsIDB4YWEsIDB4OTksIDB4ODgsCisgICAgICAweDc3LCAweDY2LCAweDU1LCAweDQ0LCAweDMzLCAweDIyLCAweDExLCAweDAwIH07CisgICAgc3RydWN0IHNvYXAgKnNvYXAgPSBzb2FwX25ldzEoU09BUF9YTUxfQ0FOT05JQ0FMIHwgU09BUF9YTUxfSU5ERU5UKTsKKyAgICBzb2FwX3JlZ2lzdGVyX3BsdWdpbihzb2FwLCBzb2FwX3dzc2UpOworICAgIGlmIChzb2FwX3dzc2Vfc2lnbl9ib2R5KHNvYXAsIFNPQVBfU01EX0hNQUNfU0hBMSwgaG1hY19rZXksIHNpemVvZihobWFjX2tleSkpCisgICAgICAuLi4gLy8gYW4gZXJyb3Igb2NjdXJyZWQKKyAgICBlbHNlIGlmIChzb2FwX2NhbGxfbnNfX215TWV0aG9kKHNvYXAsIC4uLikpCisgICAgICAuLi4gLy8gYSB0cmFuc21pc3Npb24gZXJyb3Igb2NjdXJyZWQKK0BlbmRjb2RlCisKK1RoZSBobWFjX2tleSBpcyBzb21lIHNlY3JldCBrZXkgeW91IGdlbmVyYXRlZCBmb3IgdGhlIHNlbmRpbmcgc2lkZSBhbmQKK3JlY2VpdmluZyBzaWRlIChkb24ndCB1c2UgdGhlIG9uZSBzaG93biBoZXJlKS4KKworQXMgYWx3YXlzLCB1c2UgQHJlZiBzb2FwX3ByaW50X2ZhdWx0IHRvIGRpc3BsYXkgdGhlIGVycm9yIG1lc3NhZ2UuCisKK1RvIHNpZ24gdGhlIGJvZHkgb2YgYW4gb3V0Ym91bmQgU09BUCBtZXNzYWdlIHVzaW5nIFJTQS1TSEExIChEU0EtU0hBMSBpcworc2ltaWxhciksIHdlIGluY2x1ZGUgdGhlIFg1MDkgY2VydGlmaWNhdGUgd2l0aCB0aGUgcHVibGljIGtleSBhcyBhCitCaW5hcnlTZWN1cml0eVRva2VuIGluIHRoZSBoZWFkZXIgYW5kIGEgS2V5SW5mbyByZWZlcmVuY2UgdG8gdGhlIHRva2VuIHRvIGxldAorcmVjZWl2ZXJzIHVzZSB0aGUgcHVibGljIGtleSBpbiB0aGUgY2VydGlmaWNhdGUgdG8gdmVyaWZ5IHRoZSBhdXRoZW50aWNpdHkgb2YKK3RoZSBtZXNzYWdlOgorCitAY29kZQorICAgIEZJTEUgKmZkOworICAgIEVWUF9QS0VZICpyc2FfcHJpdmF0ZV9rZXk7CisgICAgWDUwOSAqY2VydDsKKyAgICBzdHJ1Y3Qgc29hcCAqc29hcCA9IHNvYXBfbmV3MShTT0FQX1hNTF9DQU5PTklDQUwgfCBTT0FQX1hNTF9JTkRFTlQpOworICAgIHNvYXBfcmVnaXN0ZXJfcGx1Z2luKHNvYXAsIHNvYXBfd3NzZSk7CisgICAgZmQgPSBmb3BlbigicHJpdmtleS5wZW0iLCAiciIpOworICAgIHJzYV9wcml2YXRlX2tleSA9IFBFTV9yZWFkX1ByaXZhdGVLZXkoZmQsIE5VTEwsIE5VTEwsICJwYXNzd29yZCIpOworICAgIGZjbG9zZShmZCk7CisgICAgZmQgPSBmb3BlbigiY2VydC5wZW0iLCAiciIpOworICAgIFg1MDkgKmNlcnQgPSBQRU1fcmVhZF9YNTA5KGZkLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBmY2xvc2UoZmQpOworICAgIGlmIChzb2FwX3dzc2VfYWRkX0JpbmFyeVNlY3VyaXR5VG9rZW5YNTA5KHNvYXAsICJYNTA5VG9rZW4iLCBjZXJ0KQorICAgICB8fCBzb2FwX3dzc2VfYWRkX0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZVg1MDkoc29hcCwgIiNYNTA5VG9rZW4iKQorICAgICB8fCBzb2FwX3dzc2Vfc2lnbl9ib2R5KHNvYXAsIFNPQVBfU01EX1NJR05fUlNBX1NIQTEsIHJzYV9wcml2YXRlX2tleSwgMCkpCisgICAgICAuLi4gLy8gYW4gZXJyb3Igb2NjdXJyZWQKKyAgICBlbHNlIGlmIChzb2FwX2NhbGxfbnNfX215TWV0aG9kKHNvYXAsIC4uLikpCisgICAgICAuLi4gLy8gYSB0cmFuc21pc3Npb24gZXJyb3Igb2NjdXJyZWQKK0BlbmRjb2RlCisKK1RoZSBwcml2YXRlIGtleSBhbmQgaXRzIGNlcnRpZmljYXRlIGFyZSBvZnRlbiBwbGFjZWQgaW4gdGhlIHNhbWUgZmlsZSwgc2VlIGUuZy4KK3NlcnZlci5wZW0gaW4gdGhlIHBhY2thZ2UuCisKK1RvIHN1bW1hcml6ZSB0aGUgc2lnbmluZyBwcm9jZXNzOgorLSMgUmVnaXN0ZXIgdGhlIHdzc2UgcGx1Z2luLgorLSMgT2J0YWluIGFuIEhNQUMgc2VjcmV0IGtleSBvciBhIERTQSBvciBSU0EgcHJpdmF0ZSBrZXkuCistIyBGb3IgRFNBIG9yIFJTQSwgb2J0YWluIHRoZSBYNTA5IGNlcnRpZmljYXRlIHdpdGggdGhlIHB1YmxpYyBrZXkgc2lnbmVkIGJ5IGEKKyAgIGNlcnRpZmljYXRlIGF1dGhvcml0eS4KKy0jIEFkZCB0aGUgWDUwOSBjZXJ0aWZpY2F0ZSBhcyBhIEJpbmFyeVNlY3VyaXR5VG9rZW4gdG8gdGhlIGhlYWRlci4KKy0jIEFkZCBhIEtleUluZm8gQmluYXJ5U2VjdXJpdHlUb2tlblJlZmVyZW5jZS4KKy0jIEludm9rZSBAcmVmIHNvYXBfd3NzZV9zaWduIG9yIEByZWYgc29hcF93c3NlX3NpZ25fYm9keSB0byBzaWduIHRoZSBtZXNzYWdlLgorLSMgQWx3YXlzIGNoZWNrIHRoZSBmdW5jdGlvbiByZXR1cm4gdmFsdWVzIGZvciBlcnJvcnMuIFlvdSBkb24ndCB3YW50IHRvCisgICBwcm9kdWNlIGFuZCBhY2NlcHQgbWVzc2FnZXMgd2l0aCBhbiBpbnZhbGlkIFNlY3VyaXR5IGhlYWRlcnMuCisKK0BzdWJzZWN0aW9uIHdzc2VfOF8yYiBTaWduaW5nIE1lc3NhZ2UgUGFydHMKKworVGhlIEByZWYgc29hcF93c3NlX3NpZ25fYm9keSBmdW5jdGlvbiBzaWducyB0aGUgZW50aXJlIFNPQVAgYm9keS4gSWYgaXQgaXMKK2Rlc2lyYWJsZSB0byBzaWduIGluZGl2aWR1YWwgcGFydHMgb2YgYSBtZXNzYWdlIHRoZSBAcmVmIHNvYXBfd3NzZV9zaWduCitmdW5jdGlvbiBzaG91bGQgYmUgdXNlZC4gTWVzc2FnZSBwYXJ0cyB3aXRoIHdzdTpJZCBhdHRyaWJ1dGVzIGFyZSBzaWduZWQuIFRoZXNlCittZXNzYWdlIHBhcnRzIHNob3VsZCBub3QgYmUgbmVzdGVkIChuZXN0ZWQgZWxlbWVudHMgd2lsbCBub3QgYmUgc2VwYXJhdGVseQorc2lnbmVkKS4KKworRm9yIGV4YW1wbGUsIGNvbnNpZGVyIGEgdHJhbnNhY3Rpb24gaW4gd2hpY2ggd2Ugb25seSB3YW50IHRvIHNpZ24gYSBjb250cmFjdCBpbgordGhlIFNPQVAgQm9keS4gVGhpcyBhbGxvd3MgdXMgdG8gbW9kaWZ5IHRoZSByZXN0IG9mIHRoZSBtZXNzYWdlIG9yIGV4dHJhY3QgdGhlCitjb250cmFjdCBpbiBYTUwgYW5kIHBhc3MgaXQgb24gd2l0aCB0aGUgc2lnbmF0dXJlLgorCitUaGUgZ1NPQVAgaGVhZGVyIGZpbGUgaW5jbHVkZXMgYSBteUNvbnRyYWN0IGRlY2xhcmF0aW9uOgorCitAY29kZQorICAgIHN0cnVjdCBuc19fbXlDb250cmFjdAorICAgIHsgQGNoYXIqIHdzdV9JZCA9ICJDb250cmFjdCI7CisgICAgICBjaGFyKiBuYW1lOworICAgICAgY2hhciogdGl0bGU7CisgICAgICBjaGFyKiB0ZXJtczsKKyAgICB9OworICAgIGludCBuc19fbXlNZXRob2Qoc3RydWN0IG5zX19teUNvbnRyYWN0IGFncmVlbWVudCwgYm9vbCogYWNjZXB0ZWQpOworQGVuZGNvZGUKKworVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHdzdTpJZCBpcyAiQ29udHJhY3QiIHNvIHRoYXQgd2UgY2FuIGluc3RhbnRpYXRlIHRoZQorc3RydWN0LCBhdXRvbWF0aWNhbGx5IHNpZ24gaXQsIGFuZCBzZW5kIGl0IGFzIGZvbGxvd3M6CisKK0Bjb2RlCisgICAgc3RydWN0IG5zX19teUNvbnRyYWN0IGNvbnRyYWN0OworICAgIGJvb2wgYWNjZXB0OworICAgIHNvYXBfZGVmYXVsdF9uc19fbXlDb250cmFjdChzb2FwLCAmY29udHJhY3QpOworICAgIGNvbnRyYWN0Lm5hbWUgPSAuLi47CisgICAgY29udHJhY3QudGl0bGUgPSAuLi47CisgICAgY29udHJhY3QudGVybXMgPSAuLi47CisgICAgaWYgKHNvYXBfd3NzZV9hZGRfQmluYXJ5U2VjdXJpdHlUb2tlblg1MDkoc29hcCwgIlg1MDlUb2tlbiIsIGNlcnQpCisgICAgIHx8IHNvYXBfd3NzZV9hZGRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlWDUwOShzb2FwLCAiI1g1MDlUb2tlbiIpCisgICAgIHx8IHNvYXBfd3NzZV9zaWduKHNvYXAsIFNPQVBfU01EX1NJR05fUlNBX1NIQTEsIHJzYV9wcml2YXRlX2tleSwgMCkpCisgICAgICAuLi4gLy8gYW4gZXJyb3Igb2NjdXJyZWQKKyAgICBlbHNlIGlmIChzb2FwX2NhbGxfbnNfX215TWV0aG9kKHNvYXAsIGNvbnRyYWN0LCAmYWNjZXB0KSkKKyAgICAgIC4uLiAvLyBhIHRyYW5zbWlzc2lvbiBlcnJvciBvY2N1cnJlZAorQGVuZGNvZGUKKworQHN1YnNlY3Rpb24gd3NzZV84XzMgU2lnbmluZyBUb2tlbnMKKworVG8gc2lnbiBzZWN1cml0eSB0b2tlbnMgc3VjaCBhcyB1c2VyIG5hbWVzLCBwYXNzd29yZHMsIGFuZCBiaW5hcnkgc2VjdXJpdHkKK3Rva2VucywganVzdCBhc3NpZ24gdGhlaXIgSWQgdmFsdWVzIHdpdGggYSB1bmlxdWUgc3RyaW5nLCBzdWNoIGFzICJUaW1lIiBmb3IKK3RpbWVzdGFtcHMgYW5kICJVc2VyIiBmb3IgdXNlciBuYW1lcy4gRm9yIGV4YW1wbGU6CisKK0Bjb2RlCisgICAgc29hcF93c3NlX2FkZF9UaW1lc3RhbXAoc29hcCwgIlRpbWUiLCA2MDApOworICAgIHNvYXBfd3NzZV9hZGRfVXNlcm5hbWVUb2tlbkRpZ2VzdChzb2FwLCAiVXNlciIsICJ1c2VybmFtZSIsICJwYXNzd29yZCIpOworICAgIC4uLiAvLyB0aGUgcmVzdCBvZiB0aGUgc2lnbmluZyBjb2RlCitAZW5kY29kZQorCitAc3Vic2VjdGlvbiB3c3NlXzhfNCBTaWduYXR1cmUgVmFsaWRhdGlvbgorCitUbyBhdXRvbWF0aWNhbGx5IHZlcmlmeSB0aGUgc2lnbmF0dXJlIG9mIGFuIGluYm91bmQgbWVzc2FnZSBzaWduZWQgd2l0aCBEU0Egb3IKK1JTQSBhbGdvcml0aG1zLCBhc3N1bWluZyB0aGUgbWVzc2FnZSBjb250YWlucyB0aGUgWDUwOSBjZXJ0aWZpY2F0ZSBhcyBhIGJpbmFyeQorc2VjdXJpdHkgdG9rZW4sIHVzZToKKworQGNvZGUKKyAgICBzdHJ1Y3Qgc29hcCAqc29hcCA9IHNvYXBfbmV3MShTT0FQX1hNTF9DQU5PTklDQUwgfCBTT0FQX1hNTF9JTkRFTlQpOworICAgIHNvYXBfcmVnaXN0ZXJfcGx1Z2luKHNvYXAsIHNvYXBfd3NzZSk7CisgICAgc29hcF93c3NlX3ZlcmlmeV9hdXRvKHNvYXAsIFNPQVBfU01EX05PTkUsIE5VTEwsIDApOworCisgICAgLy8gc2VydmVyOgorICAgIGlmIChzb2FwX3NlcnZlKHNvYXApKQorICAgICAgLi4uIC8vIGFuIGVycm9yIG9jY3VycmVkCisKKyAgICAvLyBjbGllbnQ6CisgICAgaWYgKHNvYXBfY2FsbF9uc19fbXlNZXRob2Qoc29hcCwgLi4uKSkKKyAgICAgIC4uLiAvLyBhbiBlcnJvciBvY2N1cnJlZAorQGVuZGNvZGUKKworQWxsIGxvY2FsbHkgcmVmZXJlbmNlZCBlbGVtZW50cyBpbiB0aGUgc2lnbmVkIG1lc3NhZ2Ugd2lsbCBiZSB2ZXJpZmllZC4KK0VsZW1lbnRzIHJlZmVyZW5jZWQgd2l0aCBhYnNvbHV0ZSBVUklzIGFyZSBub3QgYXV0b21hdGljYWxseSB2ZXJpZmllZC4gVGhlCityZWNlaXZlZCBtZXNzYWdlIGlzIHN0b3JlZCBpbiBhIERPTSBhY2Nlc3NpYmxlIHdpdGggc29hcC0+ZG9tLiBUaGlzIGVuYWJsZXMKK2Z1cnRoZXIgYW5hbHlzaXMgb2YgdGhlIG1lc3NhZ2UgY29udGVudC4KKworVGhlIEByZWYgc29hcF93c3NlX3ZlcmlmeV9hdXRvIGZ1bmN0aW9uIGtlZXBzIHByb2Nlc3Npbmcgc2lnbmVkIChhbmQgdW5zaWduZWQpCittZXNzYWdlcyBhcyB0aGV5IGFycml2ZS4gRm9yIHVuc2lnbmVkIG1lc3NhZ2VzIHRoaXMgY2FuIGJlIGV4cGVuc2l2ZSBhbmQgdGhlCit2ZXJpZmljYXRpb24gZW5naW5lIHNob3VsZCBiZSBzaHV0IGRvd24gdXNpbmcgQHJlZiBzb2FwX3dzc2VfdmVyaWZ5X2RvbmUuCisKK1RvIHZlcmlmeSB0aGUgSE1BQyBzaWduYXR1cmUgb2YgYW4gaW5ib3VuZCBtZXNzYWdlLCB0aGUgSE1BQyBrZXkgbXVzdCBiZQorc3VwcGxpZWQ6CisKK0Bjb2RlCisgICAgc3RhdGljIGNoYXIgaG1hY19rZXlbMTZdID0gLy8gdGhlIHNhbWUgc2VjcmV0IGtleSB0aGF0IHdhcyB1c2VkIHRvIHNpZ24KKyAgICB7IDB4ZmYsIDB4ZWUsIDB4ZGQsIDB4Y2MsIDB4YmIsIDB4YWEsIDB4OTksIDB4ODgsCisgICAgICAweDc3LCAweDY2LCAweDU1LCAweDQ0LCAweDMzLCAweDIyLCAweDExLCAweDAwIH07CisgICAgc3RydWN0IHNvYXAgKnNvYXAgPSBzb2FwX25ldzEoU09BUF9YTUxfQ0FOT05JQ0FMIHwgU09BUF9YTUxfSU5ERU5UKTsKKyAgICBzb2FwX3JlZ2lzdGVyX3BsdWdpbihzb2FwLCBzb2FwX3dzc2UpOworICAgIHNvYXBfd3NzZV92ZXJpZnlfYXV0byhzb2FwLCBTT0FQX1NNRF9ITUFDX1NIQTEsIGhtYWNfa2V5LCBzaXplb2YoaG1hY19rZXkpKTsKKworICAgIC8vIHNlcnZlcjoKKyAgICBpZiAoc29hcF9zZXJ2ZShzb2FwKSkKKyAgICAgIC4uLiAvLyBhbiBlcnJvciBvY2N1cnJlZAorCisgICAgLy8gY2xpZW50OgorICAgIGlmIChzb2FwX2NhbGxfbnNfX215TWV0aG9kKHNvYXAsIC4uLikpCisgICAgICAuLi4gLy8gYW4gZXJyb3Igb2NjdXJyZWQKK0BlbmRjb2RlCisKK1RvIHN1bW1hcml6ZSB0aGUgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBwcm9jZXNzOgorLSMgUmVnaXN0ZXIgdGhlIHdzc2UgcGx1Z2luLgorLSMgRm9yIEhNQUMsIG9idGFpbiB0aGUgSE1BQyBzZWNyZXQga2V5CistIyBVc2UgQHJlZiBzb2FwX3dzc2VfdmVyaWZ5X2F1dG8gdG8gdmVyaWZ5IGluYm91bmQgbWVzc2FnZXMuCistIyBBZnRlciByZWNlaXZpbmcgYSBtZXNzYWdlLCB0aGUgRE9NIGluIHNvYXAtPmRvbSBjYW4gYmUgdHJhdmVyc2VkIGZvciBmdXJ0aGVyICAgIGFuYWx5c2lzLgorLSMgQWx3YXlzIGNoZWNrIHRoZSBmdW5jdGlvbiByZXR1cm4gdmFsdWVzIGZvciBlcnJvcnMuIFlvdSBkb24ndCB3YW50IHRvIGFjY2VwdAorICAgYSByZXF1ZXN0IG9yIHJlc3BvbnNlIG1lc3NhZ2Ugd2l0aCBhbiBpbnZhbGlkIFNlY3VyaXR5IGhlYWRlci4KKy0jIFVzZSBAcmVmIHNvYXBfd3NzZV92ZXJpZnlfZG9uZSB0byB0ZXJtaW5hdGUgdmVyaWZpY2F0aW9uLCBlLmcuIHRvIGNvbnN1bWUKKyAgIHBsYWluIG1lc3NhZ2VzIG1vcmUgZWZmaWNpZW50bHkuCisKK0BzZWN0aW9uIHdzc2VfOSBFbmNyeXB0aW9uCisKK1RoZSBtYXRlcmlhbCBpbiB0aGlzIHNlY3Rpb24gcmVsYXRlcyB0byB0aGUgV1MtU2VjdXJpdHkgc3BlY2lmaWNhdGlvbiBzZWN0aW9uIDkuCisKK1RPRE8gaXRlbTogZW5jcnlwdGlvbiBzdXBwb3J0IGlzIHVuZGVyIGNvbnN0cnVjdGlvbi4KKworQHNlY3Rpb24gd3NzZV8xMCBTZWN1cml0eSBUaW1lc3RhbXBzCisKK1RoZSBtYXRlcmlhbCBpbiB0aGlzIHNlY3Rpb24gcmVsYXRlcyB0byB0aGUgV1MtU2VjdXJpdHkgc3BlY2lmaWNhdGlvbiBzZWN0aW9uCisxMC4KKworVG8gYWRkIGEgdGltZXN0YW1wIHdpdGggdGhlIGNyZWF0aW9uIHRpbWUgdG8gdGhlIFNlY3VyaXR5IGhlYWRlciwgdXNlOgorCitAY29kZQorICAgIHNvYXBfd3NzZV9hZGRfVGltZXN0YW1wKHNvYXAsIE5VTEwsIDApOyAvLyBubyBleHBpcmF0aW9uCitAZW5kY29kZQorCitUaGUgbGlmZXRpbWUgb2YgYSBtZXNzYWdlIChpbiBzZWNvbmRzKSBpcyBwYXNzZWQgYXMgdGhlIHRoaXJkIGFyZ3VtZW50LCB3aGljaAord2lsbCBiZSBkaXNwbGF5ZWQgYXMgdGhlIHRpbWVzdGFtcCBleHBpcmF0aW9uIHRpbWU6CisKK0Bjb2RlCisgICAgc29hcF93c3NlX2FkZF9UaW1lc3RhbXAoc29hcCwgTlVMTCwgMTApOyAvLyAxMCBzZWNvbmRzIGxpZmV0aW1lCitAZW5kY29kZQorCitUaW1lc3RhbXBzLCBsaWtlIG90aGVyIGhlYWRlciBlbGVtZW50cywgYXJlIG5vdCBhdXRvbWF0aWNhbGx5IHNlY3VyZWQgd2l0aCBhCitkaWdpdGFsIHNpZ25hdHVyZS4gVG8gc2VjdXJlIGEgdGltZXN0YW1wLCB3ZSBhZGQgYW4gaWRlbnRpZmllciAod3N1OklkKSB0byBlYWNoCitlbGVtZW50IHdlIHdhbnQgdGhlIFdTLVNlY3VyaXR5IHBsdWdpbiB0byBzaWduIHRoZXJlYnkgbWFraW5nIGl0IGltcG9zc2libGUgZm9yCitzb21lb25lIHRvIHRhbXBlciB3aXRoIHRoYXQgcGFydCBvZiB0aGUgbWVzc2FnZS4gVG8gZG8gdGhpcyBmb3IgdGhlIHRpbWVzdGFtcCwKK3dlIHNpbXBseSBwYXNzIGEgdW5pcXVlIGlkZW50aWZpY2F0aW9uIHN0cmluZyBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50OgorCitAY29kZQorICAgIHNvYXBfd3NzZV9hZGRfVGltZXN0YW1wKHNvYXAsICJUaW1lIiwgMTApOyAvLyB0aW1lc3RhbXAgd2lsbCBiZSBzaWduZWQKK0BlbmRjb2RlCisKKworKi8KKworI2luY2x1ZGUgIndzc2VhcGkuaCIKKyNpbmNsdWRlICJzbWRldnAuaCIKKyNpbmNsdWRlICJ0aHJlYWRzLmgiCS8qIG9ubHkgbmVlZCB0aHJlYWRzIHRvIGVuYWJsZSBtdXRleCBmb3IgTVQgKi8KKworLyoqIFBsdWdpbiBpZGVudGlmaWNhdGlvbiBmb3IgcGx1Z2luIHJlZ2lzdHJ5ICovCitjb25zdCBjaGFyIHNvYXBfd3NzZV9pZFsxNF0gPSBTT0FQX1dTU0VfSUQ7CisKKy8qKiBNYXhpbXVtIG51bWJlciBvZiBTaWduZWRJbmZvIFJlZmVyZW5jZXMgKi8KKyNkZWZpbmUgU09BUF9XU1NFX01BWF9SRUYJKDEwMCkKKworLyoqIENsb2NrIHNrZXcgYmV0d2VlbiBtYWNoaW5lcyAoaW4gc2VjKSB0byBmaXQgbWVzc2FnZSBleHBpcmF0aW9uIGluIHdpbmRvdyAqLworI2RlZmluZSBTT0FQX1dTU0VfQ0xLU0tFVwkoNjAwKQorCisvKiogU2l6ZSBvZiB0aGUgcmFuZG9tIG5vbmNlICovCisjZGVmaW5lIFNPQVBfV1NTRV9OT05DRUxFTgkoMjApCisvKiogRGlnZXN0IGF1dGhlbnRpY2F0aW9uIGFjY2VwdHMgbWVzc2FnZXMgdGhhdCBhcmUgbm90IG9sZGVyIHRoYW4gY3JlYXRpb24gdGltZSArIFNPQVBfV1NTRV9OT05DRVRJTUUgKi8KKyNkZWZpbmUgU09BUF9XU1NFX05PTkNFVElNRQkoU09BUF9XU1NFX0NMS1NLRVcgKyAyNDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICogQ29tbW9uIFVSSXMKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitjb25zdCBjaGFyICp3c3NlX1Bhc3N3b3JkVGV4dFVSSSA9ICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXVzZXJuYW1lLXRva2VuLXByb2ZpbGUtMS4wI1Bhc3N3b3JkVGV4dCI7Citjb25zdCBjaGFyICp3c3NlX1Bhc3N3b3JkRGlnZXN0VVJJID0gImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3MtdXNlcm5hbWUtdG9rZW4tcHJvZmlsZS0xLjAjUGFzc3dvcmREaWdlc3QiOworY29uc3QgY2hhciAqd3NzZV9CYXNlNjRCaW5hcnlVUkkgPSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy1zb2FwLW1lc3NhZ2Utc2VjdXJpdHktMS4wI0Jhc2U2NEJpbmFyeSI7Citjb25zdCBjaGFyICp3c3NlX1g1MDl2M1VSSSA9ICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXg1MDktdG9rZW4tcHJvZmlsZS0xLjAjWDUwOXYzIjsKK2NvbnN0IGNoYXIgKndzc2VfWDUwOXYzU3ViamVjdEtleUlkZW50aWZpZXJVUkkgPSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy14NTA5LXRva2VuLXByb2ZpbGUtMS4wI1g1MDlTdWJqZWN0S2V5SWRlbnRpZmllciI7CisKK2NvbnN0IGNoYXIgKmRzX3NoYTFVUkkgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiOworY29uc3QgY2hhciAqZHNfaG1hY19zaGExVVJJID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNobWFjLXNoYTEiOworY29uc3QgY2hhciAqZHNfZHNhX3NoYTFVUkkgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2RzYS1zaGExIjsKK2NvbnN0IGNoYXIgKmRzX3JzYV9zaGExVVJJID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNyc2Etc2hhMSI7CisKK2NvbnN0IGNoYXIgKmRzX1VSSSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIjsKK2NvbnN0IGNoYXIgKmMxNG5fVVJJID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyI7Citjb25zdCBjaGFyICp3c3VfVVJJID0gImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS11dGlsaXR5LTEuMC54c2QiOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqIERpZ2VzdCBhdXRoZW50aWNhdGlvbiBzZXNzaW9uCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCitAc3RydWN0IHNvYXBfd3NzZV9zZXNzaW9uCitAYnJpZWYgRGlnZXN0IGF1dGhlbnRpY2F0aW9uIHNlc3Npb24gZGF0YQorKi8KK3N0cnVjdCBzb2FwX3dzc2Vfc2Vzc2lvbgoreyBzdHJ1Y3Qgc29hcF93c3NlX3Nlc3Npb24gKm5leHQ7CS8qKjwgTmV4dCBzZXNzaW9uIGluIGxpc3QgKi8KKyAgdGltZV90IGV4cGlyZWQ7CQkJLyoqPCBTZXNzaW9uIGV4cGlyYXRpb24gKi8KKyAgY2hhciBoYXNoW1NPQVBfU01EX1NIQTFfU0laRV07CS8qKjwgU0hBMSBkaWdlc3QgKi8KKyAgY2hhciBub25jZVsxXTsgLyoqPCBOb25jZSBzdHJpbmcgZmxvd3MgaW50byByZWdpb24gYmVsb3cgdGhpcyBzdHJ1Y3QgKi8KK307CisKKy8qKiBUaGUgZGlnZXN0IGF1dGhlbnRpY2F0aW9uIHNlc3Npb24gZGF0YWJhc2UgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29hcF93c3NlX3Nlc3Npb24gKnNvYXBfd3NzZV9zZXNzaW9uID0gTlVMTDsKKworLyoqIExvY2sgZm9yIGRpZ2VzdCBhdXRoZW50aWNhdGlvbiBzZXNzaW9uIGRhdGFiYXNlIGV4Y2x1c2l2ZSBhY2Nlc3MgKi8KK3N0YXRpYyBNVVRFWF9UWVBFIHNvYXBfd3NzZV9zZXNzaW9uX2xvY2s7CisKK3N0YXRpYyBpbnQgc29hcF93c3NlX3Nlc3Npb25fdmVyaWZ5KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyIGhhc2hbU09BUF9TTURfU0hBMV9TSVpFXSwgY29uc3QgY2hhciAqY3JlYXRlZCwgY29uc3QgY2hhciAqbm9uY2UpOworc3RhdGljIHZvaWQgc29hcF93c3NlX3Nlc3Npb25fY2xlYW51cChzdHJ1Y3Qgc29hcCAqc29hcCk7CitzdGF0aWMgdm9pZCBjYWxjX2RpZ2VzdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqY3JlYXRlZCwgY29uc3QgY2hhciAqbm9uY2UsIGludCBub25jZWxlbiwgY29uc3QgY2hhciAqcGFzc3dvcmQsIGNoYXIgaGFzaFtTT0FQX1NNRF9TSEExX1NJWkVdKTsKK3N0YXRpYyB2b2lkIGNhbGNfbm9uY2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgbm9uY2VbU09BUF9XU1NFX05PTkNFTEVOXSk7CisKK3N0YXRpYyBpbnQgc29hcF93c3NlX2luaXQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3dzc2VfZGF0YSAqZGF0YSk7CitzdGF0aWMgaW50IHNvYXBfd3NzZV9jb3B5KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbHVnaW4gKmRzdCwgc3RydWN0IHNvYXBfcGx1Z2luICpzcmMpOworc3RhdGljIHZvaWQgc29hcF93c3NlX2RlbGV0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGx1Z2luICpwKTsKKworc3RhdGljIGludCBzb2FwX3dzc2VfcHJlcGFyZWluaXQoc3RydWN0IHNvYXAgKnNvYXApOworc3RhdGljIGludCBzb2FwX3dzc2VfcHJlcGFyZXNlbmQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7CitzdGF0aWMgaW50IHNvYXBfd3NzZV9wcmVwYXJlZmluYWwoc3RydWN0IHNvYXAgKnNvYXApOworc3RhdGljIHZvaWQgc29hcF93c3NlX3ByZXBhcmVjbGVhbnVwKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF93c3NlX2RhdGEgKmRhdGEpOworc3RhdGljIGludCBzb2FwX3dzc2VfZGlzY29ubmVjdChzdHJ1Y3Qgc29hcCAqc29hcCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICogd3NzZTpTZWN1cml0eSBoZWFkZXIgZWxlbWVudAorICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorQGZuIF93c3NlMl9fU2VjdXJpdHkqIHNvYXBfd3NzZV9hZGRfU2VjdXJpdHkoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYgQWRkcyBTZWN1cml0eSBoZWFkZXIgZWxlbWVudC4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0ByZXR1cm4gX3dzc2UyX19TZWN1cml0eSBvYmplY3QKKyovCitzdHJ1Y3QgX3dzc2UyX19TZWN1cml0eSoKK3NvYXBfd3NzZV9hZGRfU2VjdXJpdHkoc3RydWN0IHNvYXAgKnNvYXApCit7IERCR0ZVTigic29hcF93c3NlX2FkZF9TZWN1cml0eSIpOworICAvKiBpZiB3ZSBkb24ndCBoYXZlIGEgU09BUCBIZWFkZXIsIGNyZWF0ZSBvbmUgKi8KKyAgaWYgKCFzb2FwLT5oZWFkZXIpCisgIHsgc29hcC0+aGVhZGVyID0gKHN0cnVjdCBTT0FQX0VOVl9fSGVhZGVyKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IFNPQVBfRU5WX19IZWFkZXIpKTsKKyAgICBzb2FwX2RlZmF1bHRfU09BUF9FTlZfX0hlYWRlcihzb2FwLCBzb2FwLT5oZWFkZXIpOyAKKyAgfQorICAvKiBpZiB3ZSBkb24ndCBoYXZlIGEgd3NzZTpTZWN1cml0eSBlbGVtZW50IGluIHRoZSBTT0FQIEhlYWRlciwgY3JlYXRlIG9uZSAqLworICBpZiAoIXNvYXAtPmhlYWRlci0+d3NzZTJfX1NlY3VyaXR5KQorICB7IHNvYXAtPmhlYWRlci0+d3NzZTJfX1NlY3VyaXR5ID0gKF93c3NlMl9fU2VjdXJpdHkqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihfd3NzZTJfX1NlY3VyaXR5KSk7CisgICAgc29hcF9kZWZhdWx0X193c3NlMl9fU2VjdXJpdHkoc29hcCwgc29hcC0+aGVhZGVyLT53c3NlMl9fU2VjdXJpdHkpOworICB9CisgIHJldHVybiBzb2FwLT5oZWFkZXItPndzc2UyX19TZWN1cml0eTsKK30KKworLyoqCitAZm4gX3dzc2UyX19TZWN1cml0eSogc29hcF93c3NlX2FkZF9TZWN1cml0eV9hY3RvcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqYWN0b3IpCitAYnJpZWYgQWRkcyBTZWN1cml0eSBoZWFkZXIgZWxlbWVudCB3aXRoIGFjdG9yIG9yIHJvbGUgYXR0cmlidXRlLgorQHBhcmFtIHNvYXAgY29udGV4dAorQHBhcmFtIGFjdG9yIHN0cmluZworQHJldHVybiBfd3NzZTJfX1NlY3VyaXR5IG9iamVjdAorKi8KK3N0cnVjdCBfd3NzZTJfX1NlY3VyaXR5Kgorc29hcF93c3NlX2FkZF9TZWN1cml0eV9hY3RvcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqYWN0b3IpCit7IF93c3NlMl9fU2VjdXJpdHkgKnNlY3VyaXR5ID0gc29hcF93c3NlX2FkZF9TZWN1cml0eShzb2FwKTsKKyAgREJHRlVOMSgic29hcF93c3NlX2FkZF9TZWN1cml0eV9hY3RvciIsICJhY3Rvcj0lcyIsIGFjdG9yKTsKKyAgaWYgKHNvYXAtPm5hbWVzcGFjZXMgJiYgIXN0cmNtcChzb2FwLT5uYW1lc3BhY2VzWzBdLm5zLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iKSkKKyAgICBzZWN1cml0eS0+U09BUF9FTlZfX2FjdG9yID0gc29hcF9zdHJkdXAoc29hcCwgYWN0b3IpOworICBlbHNlCisgICAgc2VjdXJpdHktPlNPQVBfRU5WX19yb2xlID0gc29hcF9zdHJkdXAoc29hcCwgYWN0b3IpOworICByZXR1cm4gc2VjdXJpdHk7Cit9CisKKy8qKgorQGZuIHZvaWQgc29hcF93c3NlX2RlbGV0ZV9TZWN1cml0eShzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZiBEZWxldGVzIFNlY3VyaXR5IGhlYWRlciBlbGVtZW50LgorQHBhcmFtIHNvYXAgY29udGV4dAorKi8KK3ZvaWQKK3NvYXBfd3NzZV9kZWxldGVfU2VjdXJpdHkoc3RydWN0IHNvYXAgKnNvYXApCit7IERCR0ZVTigic29hcF93c3NlX2RlbGV0ZV9TZWN1cml0eSIpOworICBpZiAoc29hcC0+aGVhZGVyKQorICAgIHNvYXAtPmhlYWRlci0+d3NzZTJfX1NlY3VyaXR5ID0gTlVMTDsKK30KKworLyoqCitAZm4gX3dzc2UyX19TZWN1cml0eSogc29hcF93c3NlX1NlY3VyaXR5KHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmIFJldHVybnMgU2VjdXJpdHkgaGVhZGVyIGVsZW1lbnQgaWYgcHJlc2VudC4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0ByZXR1cm4gX3dzc2UyX19TZWN1cml0eSBvYmplY3Qgb3IgTlVMTAorKi8KK3N0cnVjdCBfd3NzZTJfX1NlY3VyaXR5Kgorc29hcF93c3NlX1NlY3VyaXR5KHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcC0+aGVhZGVyKQorICAgIHJldHVybiBzb2FwLT5oZWFkZXItPndzc2UyX19TZWN1cml0eTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICogd3NzZTpTZWN1cml0eS9kczpTaWduYXR1cmUgaGVhZGVyIGVsZW1lbnQKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKK0BmbiBkc19fU2lnbmF0dXJlVHlwZSogc29hcF93c3NlX2FkZF9TaWduYXR1cmUoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYgQWRkcyBTaWduYXR1cmUgaGVhZGVyIGVsZW1lbnQuCitAcGFyYW0gc29hcCBjb250ZXh0CitAcmV0dXJuIGRzX19TaWduYXR1cmVUeXBlIG9iamVjdAorKi8KK3N0cnVjdCBkc19fU2lnbmF0dXJlVHlwZSoKK3NvYXBfd3NzZV9hZGRfU2lnbmF0dXJlKHN0cnVjdCBzb2FwICpzb2FwKQoreyBfd3NzZTJfX1NlY3VyaXR5ICpzZWN1cml0eSA9IHNvYXBfd3NzZV9hZGRfU2VjdXJpdHkoc29hcCk7CisgIERCR0ZVTigic29hcF93c3NlX2FkZF9TaWduYXR1cmUiKTsKKyAgLyogaWYgd2UgZG9uJ3QgaGF2ZSBhIGRzOlNpZ25hdHVyZSwgY3JlYXRlIG9uZSAqLworICBpZiAoIXNlY3VyaXR5LT5kc19fU2lnbmF0dXJlKQorICB7IHNlY3VyaXR5LT5kc19fU2lnbmF0dXJlID0gKGRzX19TaWduYXR1cmVUeXBlKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2YoZHNfX1NpZ25hdHVyZVR5cGUpKTsKKyAgICBzb2FwX2RlZmF1bHRfZHNfX1NpZ25hdHVyZVR5cGUoc29hcCwgc2VjdXJpdHktPmRzX19TaWduYXR1cmUpOyAKKyAgfQorICByZXR1cm4gc2VjdXJpdHktPmRzX19TaWduYXR1cmU7Cit9CisKKy8qKgorQGZuIHZvaWQgc29hcF93c3NlX2RlbGV0ZV9TaWduYXR1cmUoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYgRGVsZXRlcyBTaWduYXR1cmUgaGVhZGVyIGVsZW1lbnQuCitAcGFyYW0gc29hcCBjb250ZXh0CisqLwordm9pZAorc29hcF93c3NlX2RlbGV0ZV9TaWduYXR1cmUoc3RydWN0IHNvYXAgKnNvYXApCit7IF93c3NlMl9fU2VjdXJpdHkgKnNlY3VyaXR5ID0gc29hcF93c3NlX1NlY3VyaXR5KHNvYXApOworICBEQkdGVU4oInNvYXBfd3NzZV9kZWxldGVfU2lnbmF0dXJlIik7CisgIGlmIChzZWN1cml0eSkKKyAgICBzZWN1cml0eS0+ZHNfX1NpZ25hdHVyZSA9IE5VTEw7Cit9CisKKy8qKgorQGZuIGRzX19TaWduYXR1cmVUeXBlKiBzb2FwX3dzc2VfU2lnbmF0dXJlKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmIFJldHVybnMgU2lnbmF0dXJlIGhlYWRlciBlbGVtZW50IGlmIHByZXNlbnQuCitAcGFyYW0gc29hcCBjb250ZXh0CitAcmV0dXJuIGRzX19TaWduYXR1cmVUeXBlIG9iamVjdCBvciBOVUxMCisqLworc3RydWN0IGRzX19TaWduYXR1cmVUeXBlKgorc29hcF93c3NlX1NpZ25hdHVyZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgX3dzc2UyX19TZWN1cml0eSAqc2VjdXJpdHkgPSBzb2FwX3dzc2VfU2VjdXJpdHkoc29hcCk7CisgIGlmIChzZWN1cml0eSkKKyAgICByZXR1cm4gc2VjdXJpdHktPmRzX19TaWduYXR1cmU7CisgIHJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqIHdzc2U6U2VjdXJpdHkvd3N1OlRpbWVzdGFtcCBoZWFkZXIgZWxlbWVudAorICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorQGZuIGludCBzb2FwX3dzc2VfYWRkX1RpbWVzdGFtcChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIHRpbWVfdCBsaWZldGltZSkKK0BicmllZiBBZGRzIFRpbWVzdGFtcCBlbGVtZW50IHdpdGggb3B0aW9uYWwgZXhwaXJhdGlvbiBkYXRlK3RpbWUgKGxpZmV0aW1lKS4KK0BwYXJhbVtpbl0gc29hcCBjb250ZXh0CitAcGFyYW1baW5dIGlkIGZvciBzaWduYXR1cmUgcmVmZXJlbmNpbmcgb3IgTlVMTAorQHBhcmFtW2luXSBsaWZldGltZSBleHByZXNzZWQgaW4gdGltZV90IHVuaXRzLCBvciAwIGZvciBubyBleHBpcmF0aW9uCitAcmV0dXJuIFNPQVBfT0sKKyovCitpbnQKK3NvYXBfd3NzZV9hZGRfVGltZXN0YW1wKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgdGltZV90IGxpZmV0aW1lKQoreyBfd3NzZTJfX1NlY3VyaXR5ICpzZWN1cml0eSA9IHNvYXBfd3NzZV9hZGRfU2VjdXJpdHkoc29hcCk7CisgIHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOworICBjaGFyICpjcmVhdGVkID0gc29hcF9zdHJkdXAoc29hcCwgc29hcF9kYXRlVGltZTJzKHNvYXAsIG5vdykpOworICBjaGFyICpleHBpcmVkID0gbGlmZXRpbWUgPyBzb2FwX3N0cmR1cChzb2FwLCBzb2FwX2RhdGVUaW1lMnMoc29hcCwgbm93ICsgbGlmZXRpbWUpKSA6IE5VTEw7CisgIERCR0ZVTjEoInNvYXBfd3NzZV9hZGRfVGltZXN0YW1wIiwgImlkPSVzIiwgaWQ/aWQ6IiIpOworICAvKiBhbGxvY2F0ZSBhIFRpbWVzdGFtcCBpZiB3ZSBkb24ndCBoYXZlIG9uZSBhbHJlYWR5ICovCisgIGlmICghc2VjdXJpdHktPndzdV9fVGltZXN0YW1wKQorICAgIHNlY3VyaXR5LT53c3VfX1RpbWVzdGFtcCA9IChfd3N1X19UaW1lc3RhbXAqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihfd3N1X19UaW1lc3RhbXApKTsKKyAgc29hcF9kZWZhdWx0X193c3VfX1RpbWVzdGFtcChzb2FwLCBzZWN1cml0eS0+d3N1X19UaW1lc3RhbXApOworICAvKiBwb3B1bGF0ZSB0aGUgd3N1OlRpbWVzdGFtcCBlbGVtZW50ICovCisgIHNlY3VyaXR5LT53c3VfX1RpbWVzdGFtcC0+d3N1X19JZCA9IHNvYXBfc3RyZHVwKHNvYXAsIGlkKTsKKyAgc2VjdXJpdHktPndzdV9fVGltZXN0YW1wLT5DcmVhdGVkID0gY3JlYXRlZDsKKyAgc2VjdXJpdHktPndzdV9fVGltZXN0YW1wLT5FeHBpcmVzID0gZXhwaXJlZDsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKgorQGZuIF93c3VfX1RpbWVzdGFtcCAqc29hcF93c3NlX1RpbWVzdGFtcChzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZiBSZXR1cm5zIFRpbWVzdGFtcCBlbGVtZW50IGlmIHByZXNlbnQuCitAcGFyYW0gc29hcCBjb250ZXh0CitAcmV0dXJuIF93c3VfX1RpbWVzdGFtcCBvYmplY3Qgb3IgTlVMTAorKi8KK3N0cnVjdCBfd3N1X19UaW1lc3RhbXAqCitzb2FwX3dzc2VfVGltZXN0YW1wKHN0cnVjdCBzb2FwICpzb2FwKQoreyBfd3NzZTJfX1NlY3VyaXR5ICpzZWN1cml0eSA9IHNvYXBfd3NzZV9TZWN1cml0eShzb2FwKTsKKyAgaWYgKHNlY3VyaXR5KQorICAgIHJldHVybiBzZWN1cml0eS0+d3N1X19UaW1lc3RhbXA7CisgIHJldHVybiBOVUxMOworfQorCisvKioKK0BmbiBpbnQgc29hcF93c3NlX3ZlcmlmeV9UaW1lc3RhbXAoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYgVmVyaWZpZXMgdGhlIFRpbWVzdGFtcC9FeHBpcmVzIGVsZW1lbnQgYWdhaW5zdCB0aGUgY3VycmVudCB0aW1lLgorQHBhcmFtIHNvYXAgY29udGV4dAorQHJldHVybiBTT0FQX09LIG9yIFNPQVBfRkFVTFQgd2l0aCB3c3NlOkZhaWxlZEF1dGhlbnRpY2F0aW9uIGZhdWx0CisKK1NldHMgd3NzZTpGYWlsZWRBdXRoZW50aWNhdGlvbiBmYXVsdCBpZiB3c3U6VGltZXN0YW1wIGlzIGV4cGlyZWQuIFRoZQorU09BUF9XU1NFX0NMS1NLRVcgdmFsdWUgaXMgdXNlZCBhcyBhIG1hcmdpbiB0byBtaXRpZ2F0ZSBjbG9jayBza2V3LiBLZWVwcworc2lsZW50IHdoZW4gbm8gdGltZXN0YW1wIGlzIHN1cHBsaWVkIG9yIG5vIGV4cGlyYXRpb24gZGF0ZSBpcyBpbmNsdWRlZCBpbiB0aGUKK3dzdTpUaW1lc3RhbXAgZWxlbWVudC4KKyovCitpbnQKK3NvYXBfd3NzZV92ZXJpZnlfVGltZXN0YW1wKHN0cnVjdCBzb2FwICpzb2FwKQoreyBfd3N1X19UaW1lc3RhbXAgKnRpbWVzdGFtcCA9IHNvYXBfd3NzZV9UaW1lc3RhbXAoc29hcCk7CisgIERCR0ZVTigic29hcF93c3NlX3ZlcmlmeV9UaW1lc3RhbXAiKTsKKyAgLyogaWYgd2UgaGF2ZSBhIHRpbWVzdGFtcCB3aXRoIGFuIGV4cGlyYXRpb24gZGF0ZSwgY2hlY2sgaXQgKi8KKyAgaWYgKHRpbWVzdGFtcCAmJiB0aW1lc3RhbXAtPkV4cGlyZXMpCisgIHsgdGltZV90IG5vdyA9IHRpbWUoTlVMTCksIGV4cGlyZWQ7CisgICAgc29hcF9zMmRhdGVUaW1lKHNvYXAsIHRpbWVzdGFtcC0+RXhwaXJlcywgJmV4cGlyZWQpOworICAgIGlmIChleHBpcmVkICsgU09BUF9XU1NFX0NMS1NLRVcgPD0gbm93KQorICAgIHsgY29uc3QgY2hhciAqY29kZSA9IHNvYXBfd3N1X190VGltZXN0YW1wRmF1bHQycyhzb2FwLCAwKTsKKyAgICAgIHJldHVybiBzb2FwX3NlbmRlcl9mYXVsdF9zdWJjb2RlKHNvYXAsIGNvZGUsICJNZXNzYWdlIGhhcyBleHBpcmVkIiwgdGltZXN0YW1wLT5FeHBpcmVzKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICogd3NzZTpTZWN1cml0eS9Vc2VybmFtZVRva2VuIGhlYWRlciBlbGVtZW50CisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCitAZm4gaW50IHNvYXBfd3NzZV9hZGRfVXNlcm5hbWVUb2tlblRleHQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICp1c2VybmFtZSwgY29uc3QgY2hhciAqcGFzc3dvcmQpCitAYnJpZWYgQWRkcyBVc2VybmFtZVRva2VuIGVsZW1lbnQgd2l0aCBvcHRpb25hbCBjbGVhci10ZXh0IHBhc3N3b3JkLgorQHBhcmFtIHNvYXAgY29udGV4dAorQHBhcmFtW2luXSBpZCBzdHJpbmcgZm9yIHNpZ25hdHVyZSByZWZlcmVuY2luZyBvciBOVUxMCitAcGFyYW1baW5dIHVzZXJuYW1lIHN0cmluZworQHBhcmFtW2luXSBwYXNzd29yZCBzdHJpbmcgb3IgTlVMTCB0byBvbWl0IHRoZSBwYXNzd29yZAorQHJldHVybiBTT0FQX09LCisKK1Bhc3N3b3JkcyBhcmUgc2VudCBpbiB0aGUgY2xlYXIsIHNvIHRyYW5zcG9ydC1sZXZlbCBlbmNyeXB0aW9uIGlzIHJlcXVpcmVkLgorTm90ZTogdGhpcyByZWxlYXNlIHN1cHBvcnRzIHRoZSB1c2Ugb2YgYXQgbW9zdCBvbmUgVXNlcm5hbWVUb2tlbiBpbiB0aGUgaGVhZGVyLgorKi8KK2ludAorc29hcF93c3NlX2FkZF9Vc2VybmFtZVRva2VuVGV4dChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKnVzZXJuYW1lLCBjb25zdCBjaGFyICpwYXNzd29yZCkKK3sgX3dzc2UyX19TZWN1cml0eSAqc2VjdXJpdHkgPSBzb2FwX3dzc2VfYWRkX1NlY3VyaXR5KHNvYXApOworICBEQkdGVU4yKCJzb2FwX3dzc2VfYWRkX1VzZXJuYW1lVG9rZW5UZXh0IiwgImlkPSVzIiwgaWQ/aWQ6IiIsICJ1c2VybmFtZT0lcyIsIHVzZXJuYW1lP3VzZXJuYW1lOiIiKTsKKyAgLyogYWxsb2NhdGUgYSBVc2VybmFtZVRva2VuIGlmIHdlIGRvbid0IGhhdmUgb25lIGFscmVhZHkgKi8KKyAgaWYgKCFzZWN1cml0eS0+VXNlcm5hbWVUb2tlbikKKyAgICBzZWN1cml0eS0+VXNlcm5hbWVUb2tlbiA9IChfd3NzZTJfX1VzZXJuYW1lVG9rZW4qKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihfd3NzZTJfX1VzZXJuYW1lVG9rZW4pKTsKKyAgc29hcF9kZWZhdWx0X193c3NlMl9fVXNlcm5hbWVUb2tlbihzb2FwLCBzZWN1cml0eS0+VXNlcm5hbWVUb2tlbik7CisgIC8qIHBvcHVsYXRlIHRoZSBVc2VybmFtZVRva2VuICovCisgIHNlY3VyaXR5LT5Vc2VybmFtZVRva2VuLT53c3VfX0lkID0gc29hcF9zdHJkdXAoc29hcCwgaWQpOworICBzZWN1cml0eS0+VXNlcm5hbWVUb2tlbi0+VXNlcm5hbWUgPSBzb2FwX3N0cmR1cChzb2FwLCB1c2VybmFtZSk7CisgIC8qIGFsbG9jYXRlIGFuZCBwb3B1bGF0ZSB0aGUgUGFzc3dvcmQgKi8KKyAgaWYgKHBhc3N3b3JkKQorICB7IHNlY3VyaXR5LT5Vc2VybmFtZVRva2VuLT5QYXNzd29yZCA9IChfd3NzZTJfX1Bhc3N3b3JkKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2YoX3dzc2UyX19QYXNzd29yZCkpOworICAgIHNvYXBfZGVmYXVsdF9fd3NzZTJfX1Bhc3N3b3JkKHNvYXAsIHNlY3VyaXR5LT5Vc2VybmFtZVRva2VuLT5QYXNzd29yZCk7CisgICAgc2VjdXJpdHktPlVzZXJuYW1lVG9rZW4tPlBhc3N3b3JkLT5UeXBlID0gKGNoYXIqKXdzc2VfUGFzc3dvcmRUZXh0VVJJOworICAgIHNlY3VyaXR5LT5Vc2VybmFtZVRva2VuLT5QYXNzd29yZC0+X19pdGVtID0gc29hcF9zdHJkdXAoc29hcCwgcGFzc3dvcmQpOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorCisvKioKK0BmbiBpbnQgc29hcF93c3NlX2FkZF9Vc2VybmFtZVRva2VuRGlnZXN0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqdXNlcm5hbWUsIGNvbnN0IGNoYXIgKnBhc3N3b3JkKQorQGJyaWVmIEFkZHMgVXNlcm5hbWVUb2tlbiBlbGVtZW50IGZvciBkaWdlc3QgYXV0aGVudGljYXRpb24uCitAcGFyYW0gc29hcCBjb250ZXh0CitAcGFyYW1baW5dIGlkIHN0cmluZyBmb3Igc2lnbmF0dXJlIHJlZmVyZW5jaW5nIG9yIE5VTEwKK0BwYXJhbVtpbl0gdXNlcm5hbWUgc3RyaW5nCitAcGFyYW1baW5dIHBhc3N3b3JkIHN0cmluZworQHJldHVybiBTT0FQX09LCisKK0NvbXB1dGVzIFNIQTEgZGlnZXN0IG9mIHRoZSB0aW1lIHN0YW1wLCBhIG5vbmNlLCBhbmQgdGhlIHBhc3N3b3JkLiBUaGUgZGlnZXN0Citwcm92aWRlcyB0aGUgYXV0aGVudGljYXRpb24gY3JlZGVudGlhbHMuIFBhc3N3b3JkcyBhcmUgTk9UIHNlbnQgaW4gdGhlIGNsZWFyLgorTm90ZTogdGhpcyByZWxlYXNlIHN1cHBvcnRzIHRoZSB1c2Ugb2YgYXQgbW9zdCBvbmUgVXNlcm5hbWVUb2tlbiBpbiB0aGUgaGVhZGVyLgorKi8KK2ludAorc29hcF93c3NlX2FkZF9Vc2VybmFtZVRva2VuRGlnZXN0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqdXNlcm5hbWUsIGNvbnN0IGNoYXIgKnBhc3N3b3JkKQoreyBfd3NzZTJfX1NlY3VyaXR5ICpzZWN1cml0eSA9IHNvYXBfd3NzZV9hZGRfU2VjdXJpdHkoc29hcCk7CisgIHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOworICBjb25zdCBjaGFyICpjcmVhdGVkID0gc29hcF9kYXRlVGltZTJzKHNvYXAsIG5vdyk7CisgIGNoYXIgSEFbU09BUF9TTURfU0hBMV9TSVpFXSwgSEFCYXNlNjRbMjldOworICBjaGFyIG5vbmNlW1NPQVBfV1NTRV9OT05DRUxFTl0sICpub25jZUJhc2U2NDsKKyAgREJHRlVOMigic29hcF93c3NlX2FkZF9Vc2VybmFtZVRva2VuRGlnZXN0IiwgImlkPSVzIiwgaWQ/aWQ6IiIsICJ1c2VybmFtZT0lcyIsIHVzZXJuYW1lP3VzZXJuYW1lOiIiKTsKKyAgLyogZ2VuZXJhdGUgYSBub25jZSAqLworICBjYWxjX25vbmNlKHNvYXAsIG5vbmNlKTsKKyAgbm9uY2VCYXNlNjQgPSBzb2FwX3MyYmFzZTY0KHNvYXAsIG5vbmNlLCBOVUxMLCBTT0FQX1dTU0VfTk9OQ0VMRU4pOworICAvKiBUT0RPOiB0aGUgc3BlY3MgYXJlIG5vdCBjbGVhcjogY29tcHV0ZSBkaWdlc3Qgb3ZlciBiaW5hcnkgbm9uY2Ugb3IgYmFzZTY0IG5vbmNlPworICBjYWxjX2RpZ2VzdChzb2FwLCBjcmVhdGVkLCBub25jZSwgU09BUF9XU1NFX05PTkNFTEVOLCBwYXNzd29yZCwgSEEpOyAqLworICAvKiBjb21wdXRlIFNIQTEoY3JlYXRlZCwgbm9uY2UsIHBhc3N3b3JkKSAqLworICBjYWxjX2RpZ2VzdChzb2FwLCBjcmVhdGVkLCBub25jZUJhc2U2NCwgc3RybGVuKG5vbmNlQmFzZTY0KSwgcGFzc3dvcmQsIEhBKTsKKyAgc29hcF9zMmJhc2U2NChzb2FwLCBIQSwgSEFCYXNlNjQsIFNPQVBfU01EX1NIQTFfU0laRSk7CisgIC8qIHBvcHVsYXRlIHRoZSBVc2VybmFtZVRva2VuIHdpdGggZGlnZXN0ICovCisgIHNvYXBfd3NzZV9hZGRfVXNlcm5hbWVUb2tlblRleHQoc29hcCwgaWQsIHVzZXJuYW1lLCBIQUJhc2U2NCk7CisgIC8qIHBvcHVsYXRlIHRoZSByZW1haW5kZXIgb2YgdGhlIHBhc3N3b3JkLCBub25jZSwgYW5kIGNyZWF0ZWQgKi8KKyAgc2VjdXJpdHktPlVzZXJuYW1lVG9rZW4tPlBhc3N3b3JkLT5UeXBlID0gKGNoYXIqKXdzc2VfUGFzc3dvcmREaWdlc3RVUkk7CisgIHNlY3VyaXR5LT5Vc2VybmFtZVRva2VuLT5Ob25jZSA9IG5vbmNlQmFzZTY0OworICBzZWN1cml0eS0+VXNlcm5hbWVUb2tlbi0+d3N1X19DcmVhdGVkID0gc29hcF9zdHJkdXAoc29hcCwgY3JlYXRlZCk7CisgIHJldHVybiBTT0FQX09LOworfQorCisvKioKK0BmbiBfd3NzZTJfX1VzZXJuYW1lVG9rZW4qIHNvYXBfd3NzZV9Vc2VybmFtZVRva2VuKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCkKK0BicmllZiBSZXR1cm5zIFVzZXJuYW1lVG9rZW4gZWxlbWVudCBpZiBwcmVzZW50LgorQHBhcmFtIHNvYXAgY29udGV4dAorQHBhcmFtW2luXSBpZCBzdHJpbmcgb2YgVXNlcm5hbWVUb2tlbiBvciBOVUxMCitAcmV0dXJuIF93c3NlMl9fVXNlcm5hbWVUb2tlbiBvYmplY3Qgb3IgTlVMTAorCitOb3RlOiB0aGlzIHJlbGVhc2Ugc3VwcG9ydHMgdGhlIHVzZSBvZiBhdCBtb3N0IG9uZSBVc2VybmFtZVRva2VuIGluIHRoZSBoZWFkZXIuCisqLworc3RydWN0IF93c3NlMl9fVXNlcm5hbWVUb2tlbioKK3NvYXBfd3NzZV9Vc2VybmFtZVRva2VuKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCkKK3sgX3dzc2UyX19TZWN1cml0eSAqc2VjdXJpdHkgPSBzb2FwX3dzc2VfU2VjdXJpdHkoc29hcCk7CisgIGlmIChzZWN1cml0eQorICAgJiYgc2VjdXJpdHktPlVzZXJuYW1lVG9rZW4KKyAgICYmICghaWQgfHwgKHNlY3VyaXR5LT5Vc2VybmFtZVRva2VuLT53c3VfX0lkCisgICAgICAgICAgICAmJiAhc3RyY21wKHNlY3VyaXR5LT5Vc2VybmFtZVRva2VuLT53c3VfX0lkLCBpZCkpKSkKKyAgICByZXR1cm4gc2VjdXJpdHktPlVzZXJuYW1lVG9rZW47CisgIHJldHVybiBOVUxMOworfQorCisvKioKK0BmbiBjb25zdCBjaGFyKiBzb2FwX3dzc2VfZ2V0X1VzZXJuYW1lKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmIFJldHVybnMgVXNlcm5hbWVUb2tlbi91c2VybmFtZSBzdHJpbmcgb3Igd3NzZTpGYWlsZWRBdXRoZW50aWNhdGlvbiBmYXVsdC4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0ByZXR1cm4gVXNlcm5hbWVUb2tlbi91c2VybmFtZSBzdHJpbmcgb3IgTlVMTCB3aXRoIHdzc2U6RmFpbGVkQXV0aGVudGljYXRpb24gZmF1bHQgZXJyb3Igc2V0CitAc2VlIHNvYXBfd3NzZV92ZXJpZnlfUGFzc3dvcmQKKworVGhlIHJldHVybmVkIHVzZXJuYW1lIHNob3VsZCBiZSB1c2VkIHRvIGxvb2t1cCB0aGUgdXNlcidzIHBhc3N3b3JkIGluIGEKK2RpY3Rpb25hcnkgb3IgZGF0YWJhc2UgZm9yIHNlcnZlci1zaWRlIGF1dGhlbnRpY2F0aW9uIHdpdGgKK3NvYXBfd3NzZV92ZXJpZnlfUGFzc3dvcmQuCisqLworY29uc3QgY2hhcioKK3NvYXBfd3NzZV9nZXRfVXNlcm5hbWUoc3RydWN0IHNvYXAgKnNvYXApCit7IF93c3NlMl9fVXNlcm5hbWVUb2tlbiAqdG9rZW4gPSBzb2FwX3dzc2VfVXNlcm5hbWVUb2tlbihzb2FwLCBOVUxMKTsKKyAgREJHRlVOKCJzb2FwX3dzc2VfZ2V0X1VzZXJuYW1lIik7CisgIGlmICh0b2tlbikKKyAgICByZXR1cm4gdG9rZW4tPlVzZXJuYW1lOworICBzb2FwX3dzc2VfZmF1bHQoc29hcCwgd3NzZTJfX0ZhaWxlZEF1dGhlbnRpY2F0aW9uLCAiQXV0aGVudGljYXRpb24gcmVxdWlyZWQiKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorQGZuIGludCBzb2FwX3dzc2VfdmVyaWZ5X1Bhc3N3b3JkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpwYXNzd29yZCkKK0BicmllZiBWZXJpZmllcyB0aGUgc3VwcGxpZWQgcGFzc3dvcmQgb3Igc2V0cyB3c3NlOkZhaWxlZEF1dGhlbnRpY2F0aW9uIGZhdWx0LgorQHBhcmFtIHNvYXAgY29udGV4dAorQHBhcmFtW2luXSBwYXNzd29yZCBzdHJpbmcgdG8gdmVyaWZ5IGFnYWluc3QKK0ByZXR1cm4gU09BUF9PSyAoYXV0aG9yaXplZCkgb3IgU09BUF9GQVVMVCB3aXRoIHdzc2U6RmFpbGVkQXV0aGVudGljYXRpb24gZmF1bHQKKworVGhlIHZlcmlmaWNhdGlvbiBzdXBwb3J0cyBib3RoIGNsZWFyLXRleHQgcGFzc3dvcmQgdmVyaWZpY2F0aW9uIGFuZCBkaWdlc3QKK3Bhc3N3b3JkIGF1dGhlbnRpY2F0aW9uLiBGb3IgZGlnZXN0IGF1dGhlbnRpY2F0aW9uIGEgaGlzdG9yeSBtZWNoYW5pc20gd2l0aCBhCitkaWdlc3QgYXV0aGVudGljYXRpb24gc2Vzc2lvbiBkYXRhYmFzZSBlbnN1cmVzIHByb3RlY3Rpb24gYWdhaW5zdCByZXBsYXkKK2F0dGFja3MuCitOb3RlOiB0aGlzIHJlbGVhc2Ugc3VwcG9ydHMgdGhlIHVzZSBvZiBhdCBtb3N0IG9uZSBVc2VybmFtZVRva2VuIGluIHRoZSBoZWFkZXIuCisqLworaW50Citzb2FwX3dzc2VfdmVyaWZ5X1Bhc3N3b3JkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpwYXNzd29yZCkKK3sgX3dzc2UyX19Vc2VybmFtZVRva2VuICp0b2tlbiA9IHNvYXBfd3NzZV9Vc2VybmFtZVRva2VuKHNvYXAsIE5VTEwpOworICBEQkdGVU4oInNvYXBfd3NzZV92ZXJpZnlfUGFzc3dvcmQiKTsKKyAgLyogaWYgd2UgaGF2ZSBhIFVzZXJuYW1lVG9rZW4gd2l0aCBhIFBhc3N3b3JkLCBjaGVjayBpdCAqLworICBpZiAodG9rZW4gJiYgdG9rZW4tPlBhc3N3b3JkKQorICB7IC8qIHBhc3N3b3JkIGRpZ2VzdCBvciB0ZXh0PyAqLworICAgIGlmICh0b2tlbi0+UGFzc3dvcmQtPlR5cGUKKyAgICAgJiYgIXN0cmNtcCh0b2tlbi0+UGFzc3dvcmQtPlR5cGUsIHdzc2VfUGFzc3dvcmREaWdlc3RVUkkpKQorICAgIHsgLyogY2hlY2sgcGFzc3dvcmQgZGlnZXN0OiBjb21wdXRlIFNIQTEoY3JlYXRlZCwgbm9uY2UsIHBhc3N3b3JkKSAqLworICAgICAgaWYgKHRva2VuLT5Ob25jZQorICAgICAgICYmIHRva2VuLT53c3VfX0NyZWF0ZWQKKyAgICAgICAmJiBzdHJsZW4odG9rZW4tPlBhc3N3b3JkLT5fX2l0ZW0pID09IDI4KQkvKiBkaWdlc3QgcHcgbGVuID0gMjggKi8KKyAgICAgIHsgY2hhciBIQTFbU09BUF9TTURfU0hBMV9TSVpFXSwgSEEyW1NPQVBfU01EX1NIQTFfU0laRV07CisJLyogVE9ETzogdGhlIHNwZWNzIGFyZSBub3QgY2xlYXI6IGNvbXB1dGUgZGlnZXN0IG92ZXIgYmluYXJ5IG5vbmNlIG9yIGJhc2U2NCBub25jZT8KKyAgICAgICAgaW50IG5vbmNlbGVuOworCWNvbnN0IGNoYXIgKm5vbmNlID0gc29hcF9iYXNlNjQycyhzb2FwLCB0b2tlbi0+Tm9uY2UsIE5VTEwsIDAsICZub25jZWxlbik7CisgICAgICAgIGNhbGNfZGlnZXN0KHNvYXAsIHRva2VuLT53c3VfX0NyZWF0ZWQsIG5vbmNlLCBub25jZWxlbiwgcGFzc3dvcmQsIEhBMSk7ICovCisgICAgICAgIC8qIGNvbXB1dGUgSEExID0gU0hBMShjcmVhdGVkLCBub25jZSwgcGFzc3dvcmQpICovCisgICAgICAgIGNhbGNfZGlnZXN0KHNvYXAsIHRva2VuLT53c3VfX0NyZWF0ZWQsIHRva2VuLT5Ob25jZSwgc3RybGVuKHRva2VuLT5Ob25jZSksIHBhc3N3b3JkLCBIQTEpOworCS8qIGdldCBIQTIgPSBzdXBwbGllZCBkaWdlc3QgZnJvbSBiYXNlNjQgUGFzc3dvcmQgKi8KKyAgICAgICAgc29hcF9iYXNlNjQycyhzb2FwLCB0b2tlbi0+UGFzc3dvcmQtPl9faXRlbSwgSEEyLCBTT0FQX1NNRF9TSEExX1NJWkUsIE5VTEwpOworICAgICAgICAvKiBjb21wYXJlIEhBMSB0byBIQTIgKi8KKyAgICAgICAgaWYgKCFtZW1jbXAoSEExLCBIQTIsIFNPQVBfU01EX1NIQTFfU0laRSkpCisJeyAvKiBhdXRob3JpemUgaWYgSEExIGFuZCBIQTIgaWRlbnRpY2FsIGFuZCBub3QgcmVwbGF5IGF0dGFjayAqLworICAgICAgICAgIGlmICghc29hcF93c3NlX3Nlc3Npb25fdmVyaWZ5KHNvYXAsIEhBMSwgdG9rZW4tPndzdV9fQ3JlYXRlZCwgdG9rZW4tPk5vbmNlKSkKKwkgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOyAKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeyAvKiBjaGVjayBwYXNzd29yZCB0ZXh0ICovCisgICAgICBpZiAoIXN0cmNtcCh0b2tlbi0+UGFzc3dvcmQtPl9faXRlbSwgcGFzc3dvcmQpKQorICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXBfd3NzZV9mYXVsdChzb2FwLCB3c3NlMl9fRmFpbGVkQXV0aGVudGljYXRpb24sICJBdXRoZW50aWNhdGlvbiByZXF1aXJlZCIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqIHdzc2U6U2VjdXJpdHkvQmluYXJ5U2VjdXJpdHlUb2tlbiBoZWFkZXIgZWxlbWVudAorICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorQGZuIGludCBzb2FwX3dzc2VfYWRkX0JpbmFyeVNlY3VyaXR5VG9rZW4oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICp2YWx1ZVR5cGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBzaXplKQorQGJyaWVmIEFkZHMgQmluYXJ5U2VjdXJpdHlUb2tlbiBlbGVtZW50LgorQHBhcmFtIHNvYXAgY29udGV4dAorQHBhcmFtW2luXSBpZCBzdHJpbmcgZm9yIHNpZ25hdHVyZSByZWZlcmVuY2luZyBvciBOVUxMCitAcGFyYW1baW5dIHZhbHVlVHlwZSBzdHJpbmcKK0BwYXJhbVtpbl0gZGF0YSBwb2ludHMgdG8gYmluYXJ5IHRva2VuIGRhdGEKK0BwYXJhbVtpbl0gc2l6ZSBpcyBsZW5ndGggb2YgYmluYXJ5IHRva2VuCitAcmV0dXJuIFNPQVBfT0sKKyovCitpbnQKK3NvYXBfd3NzZV9hZGRfQmluYXJ5U2VjdXJpdHlUb2tlbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKnZhbHVlVHlwZSwgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IHNpemUpCit7IF93c3NlMl9fU2VjdXJpdHkgKnNlY3VyaXR5ID0gc29hcF93c3NlX2FkZF9TZWN1cml0eShzb2FwKTsKKyAgREJHRlVOMigid3NzZV9hZGRfQmluYXJ5U2VjdXJpdHlUb2tlbiIsICJpZD0lcyIsIGlkP2lkOiIiLCAidmFsdWVUeXBlPSVzIiwgdmFsdWVUeXBlP3ZhbHVlVHlwZToiIik7CisgIC8qIGFsbG9jYXRlIEJpbmFyeVNlY3VyaXR5VG9rZW4gaWYgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZSAqLworICBpZiAoIXNlY3VyaXR5LT5CaW5hcnlTZWN1cml0eVRva2VuKQorICAgIHNlY3VyaXR5LT5CaW5hcnlTZWN1cml0eVRva2VuID0gKF93c3NlMl9fQmluYXJ5U2VjdXJpdHlUb2tlbiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKF93c3NlMl9fQmluYXJ5U2VjdXJpdHlUb2tlbikpOworICBzb2FwX2RlZmF1bHRfX3dzc2UyX19CaW5hcnlTZWN1cml0eVRva2VuKHNvYXAsIHNlY3VyaXR5LT5CaW5hcnlTZWN1cml0eVRva2VuKTsKKyAgLyogcG9wdWxhdGUgdGhlIEJpbmFyeVNlY3VyaXR5VG9rZW4gKi8KKyAgc2VjdXJpdHktPkJpbmFyeVNlY3VyaXR5VG9rZW4tPndzdV9fSWQgPSBzb2FwX3N0cmR1cChzb2FwLCBpZCk7CisgIHNlY3VyaXR5LT5CaW5hcnlTZWN1cml0eVRva2VuLT5WYWx1ZVR5cGUgPSBzb2FwX3N0cmR1cChzb2FwLCB2YWx1ZVR5cGUpOworICBzZWN1cml0eS0+QmluYXJ5U2VjdXJpdHlUb2tlbi0+RW5jb2RpbmdUeXBlID0gKGNoYXIqKXdzc2VfQmFzZTY0QmluYXJ5VVJJOworICBzZWN1cml0eS0+QmluYXJ5U2VjdXJpdHlUb2tlbi0+X19pdGVtID0gc29hcF9zMmJhc2U2NChzb2FwLCBkYXRhLCBOVUxMLCBzaXplKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKgorQGZuIGludCBzb2FwX3dzc2VfYWRkX0JpbmFyeVNlY3VyaXR5VG9rZW5YNTA5KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgWDUwOSAqY2VydCkKK0BicmllZiBBZGRzIEJpbmFyeVNlY3VyaXR5VG9rZW4gZWxlbWVudCB3aXRoIFg1MDkgY2VydGlmaWNhdGUuCitAcGFyYW0gc29hcCBjb250ZXh0CitAcGFyYW1baW5dIGlkIHN0cmluZyBmb3Igc2lnbmF0dXJlIHJlZmVyZW5jZQorQHBhcmFtW2luXSBjZXJ0IHBvaW50cyB0byB0aGUgWDUwOSBjZXJ0aWZpY2F0ZQorQHJldHVybiBTT0FQX09LIG9yIFNPQVBfRU9NCisKK1RoaXMgZnVuY3Rpb24gdXNlcyBpMmRfWDUwOSBmcm9tIHRoZSB0aGUgT3BlblNTTCBsaWJyYXJ5IHRvIGNvbnZlcnQgYW4gWDUwOQorb2JqZWN0IHRvIGJpbmFyeSBERVIgZm9ybWF0LgorKi8KK2ludAorc29hcF93c3NlX2FkZF9CaW5hcnlTZWN1cml0eVRva2VuWDUwOShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIFg1MDkgKmNlcnQpCit7IGludCBzaXplOworICB1bnNpZ25lZCBjaGFyICpkYXRhLCAqbmV4dDsKKyAgaWYgKCFjZXJ0KQorICAgIHJldHVybiBzb2FwX3dzc2VfZmF1bHQoc29hcCwgd3NzZTJfX0ludmFsaWRTZWN1cml0eVRva2VuLCAiSW52YWxpZCBjZXJ0aWZpY2F0ZSIpOworICAvKiBkZXRlcm1pbmUgdGhlIHN0b3JhZ2UgcmVxdWlyZW1lbnQgKi8KKyAgc2l6ZSA9IGkyZF9YNTA5KGNlcnQsIE5VTEwpOworICBpZiAoc2l6ZSA8IDApCisgICAgcmV0dXJuIHNvYXBfd3NzZV9mYXVsdChzb2FwLCB3c3NlMl9fSW52YWxpZFNlY3VyaXR5VG9rZW4sICJJbnZhbGlkIGNlcnRpZmljYXRlIik7CisgIC8qIHVzZSB0aGUgZ1NPQVAgZW5naW5lJ3MgbG9vay1hc2lkZSBidWZmZXIgdG8gdGVtcG9yYXJpbHkgaG9sZCB0aGUgY2VydCAqLworICBpZiAoc29hcF9zdG9yZV9sYWIoc29hcCwgTlVMTCwgc2l6ZSkpCisgICAgcmV0dXJuIFNPQVBfRU9NOworICBkYXRhID0gbmV4dCA9ICh1bnNpZ25lZCBjaGFyKilzb2FwLT5sYWJidWY7CisgIC8qIHN0b3JlIGluIERFUiBmb3JtYXQgKi8KKyAgaTJkX1g1MDkoY2VydCwgJm5leHQpOworICAvKiBwb3B1bGF0ZSB0aGUgQmluYXJ5U2VjdXJpdHlUb2tlbiB3aXRoIGJhc2U2NCBjZXJ0aWZpY2F0ZSBkYXRhICovCisgIHJldHVybiBzb2FwX3dzc2VfYWRkX0JpbmFyeVNlY3VyaXR5VG9rZW4oc29hcCwgaWQsIHdzc2VfWDUwOXYzVVJJLCBkYXRhLCBzaXplKTsKK30KKworLyoqCitAZm4gaW50IHNvYXBfd3NzZV9hZGRfQmluYXJ5U2VjdXJpdHlUb2tlblBFTShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQorQGJyaWVmIEFkZHMgQmluYXJ5U2VjdXJpdHlUb2tlbiBlbGVtZW50IGZyb20gYSBQRU0gZmlsZS4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0BwYXJhbVtpbl0gaWQgc3RyaW5nIGZvciBzaWduYXR1cmUgcmVmZXJlbmNlCitAcGFyYW1baW5dIGZpbGVuYW1lCitAcmV0dXJuIFNPQVBfT0sgb3IgU09BUF9GQVVMVCB3aXRoIHdzc2UyX19JbnZhbGlkU2VjdXJpdHkgZmF1bHQgd2hlbiBmaWxlIGNhbm5vdCBiZSByZWFkIG9yIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBjZXJ0aWZpY2F0ZQorCitUaGlzIGZ1bmN0aW9uIHVzZXMgUEVNX3JlYWRfWDUwOSBmcm9tIHRoZSB0aGUgT3BlblNTTCBsaWJyYXJ5IHRvIHJlYWQgYQorY2VydGlmaWNhdGUgZnJvbSBhIFBFTSBmb3JtYXR0ZWQgZmlsZS4KKyovCitpbnQKK3NvYXBfd3NzZV9hZGRfQmluYXJ5U2VjdXJpdHlUb2tlblBFTShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreyBGSUxFICpmZDsKKyAgREJHRlVOMigic29hcF93c3NlX2FkZF9CaW5hcnlTZWN1cml0eVRva2VuUEVNIiwgImlkPSVzIiwgaWQ/aWQ6IiIsICJmaWxlbmFtZT0lcyIsIGZpbGVuYW1lP2ZpbGVuYW1lOiIiKTsKKyAgaWYgKChmZCA9IGZvcGVuKGZpbGVuYW1lLCAiciIpKSkKKyAgeyAvKiByZWFkIHRoZSBjZXJ0aWZpY2F0ZSAqLworICAgIFg1MDkgKmNlcnQgPSBQRU1fcmVhZF9YNTA5KGZkLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBmY2xvc2UoZmQpOworICAgIC8qIGlmIG9rYXksIHBvcHVsYXRlIHRoZSBCaW5hcnlTZWN1cml0eVRva2VuIGVsZW1lbnQgKi8KKyAgICBpZiAoY2VydCkKKyAgICB7IGludCBlcnIgPSBzb2FwX3dzc2VfYWRkX0JpbmFyeVNlY3VyaXR5VG9rZW5YNTA5KHNvYXAsIGlkLCBjZXJ0KTsKKyAgICAgIFg1MDlfZnJlZShjZXJ0KTsKKyAgICAgIHJldHVybiBlcnI7CisgICAgfQorICB9CisgIHJldHVybiBzb2FwX3dzc2VfZmF1bHQoc29hcCwgd3NzZTJfX0ludmFsaWRTZWN1cml0eSwgIk5vIGNlcnRpZmljYXRlIik7Cit9CisKKy8qKgorQGZuIF93c3NlMl9fQmluYXJ5U2VjdXJpdHlUb2tlbiogc29hcF93c3NlX0JpbmFyeVNlY3VyaXR5VG9rZW4oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkKQorQGJyaWVmIFJldHVybnMgQmluYXJ5U2VjdXJpdHlUb2tlbiBlbGVtZW50IGlmIHByZXNlbnQuCitAcGFyYW0gc29hcCBjb250ZXh0CitAcGFyYW1baW5dIGlkIHN0cmluZyBvZiB0b2tlbiB0byBnZXQgb3IgTlVMTAorQHJldHVybiBfd3NzZTJfX0JpbmFyeVNlY3VyaXR5VG9rZW4gb2JqZWN0IG9yIE5VTEwKKyovCitzdHJ1Y3QgX3dzc2UyX19CaW5hcnlTZWN1cml0eVRva2VuKgorc29hcF93c3NlX0JpbmFyeVNlY3VyaXR5VG9rZW4oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkKQoreyBfd3NzZTJfX1NlY3VyaXR5ICpzZWN1cml0eSA9IHNvYXBfd3NzZV9TZWN1cml0eShzb2FwKTsKKyAgaWYgKHNlY3VyaXR5CisgICAmJiBzZWN1cml0eS0+QmluYXJ5U2VjdXJpdHlUb2tlbgorICAgJiYgKCFpZCB8fCAoc2VjdXJpdHktPkJpbmFyeVNlY3VyaXR5VG9rZW4tPndzdV9fSWQKKyAgICAgICAgICAgICYmICFzdHJjbXAoc2VjdXJpdHktPkJpbmFyeVNlY3VyaXR5VG9rZW4tPndzdV9fSWQsIGlkKSkpKQorICAgIHJldHVybiBzZWN1cml0eS0+QmluYXJ5U2VjdXJpdHlUb2tlbjsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorQGZuIGludCBzb2FwX3dzc2VfZ2V0X0JpbmFyeVNlY3VyaXR5VG9rZW4oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCBjaGFyICoqdmFsdWVUeXBlLCB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50ICpzaXplKQorQGJyaWVmIEdldCB3c3NlOkJpbmFyeVNlY3VyaXR5VG9rZW4gZWxlbWVudCB0b2tlbiBkYXRhIGluIGJpbmFyeSBmb3JtLgorQHBhcmFtIHNvYXAgY29udGV4dAorQHBhcmFtW2luXSBpZCBzdHJpbmcgb2YgdG9rZW4gdG8gZ2V0IG9yIE5VTEwKK0BwYXJhbVtvdXRdIHZhbHVlVHlwZSBzdHJpbmcKK0BwYXJhbVtvdXRdIGRhdGEgcG9pbnRzIHRvIGJpbmFyeSB0b2tlbiBkYXRhCitAcGFyYW1bb3V0XSBzaXplIGlzIGxlbmd0aCBvZiBiaW5hcnkgdG9rZW4KK0ByZXR1cm4gU09BUF9PSyBvciBTT0FQX0ZBVUxUIHdpdGggd3NzZTpTZWN1cml0eVRva2VuVW5hdmFpbGFibGUgZmF1bHQKKyovCitpbnQKK3NvYXBfd3NzZV9nZXRfQmluYXJ5U2VjdXJpdHlUb2tlbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIGNoYXIgKip2YWx1ZVR5cGUsIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgKnNpemUpCit7IF93c3NlMl9fQmluYXJ5U2VjdXJpdHlUb2tlbiAqdG9rZW4gPSBzb2FwX3dzc2VfQmluYXJ5U2VjdXJpdHlUb2tlbihzb2FwLCBpZCk7CisgIERCR0ZVTjEoInNvYXBfd3NzZV9nZXRfQmluYXJ5U2VjdXJpdHlUb2tlbiIsICJpZD0lcyIsIGlkP2lkOiIiKTsKKyAgaWYgKHRva2VuKQorICB7ICp2YWx1ZVR5cGUgPSB0b2tlbi0+VmFsdWVUeXBlOworICAgIC8qIGl0IGFwcGVhcnMgd2UgZG9uJ3QgbmVlZCBIZXhCaW5hcnkgYWZ0ZXIgYWxsCisgICAgaWYgKHRva2VuLT5FbmNvZGluZ1R5cGUgJiYgIXN0cmNtcCh0b2tlbi0+RW5jb2RpbmdUeXBlLCB3c3NlX0hleEJpbmFyeVVSSSkpCisgICAgICAqZGF0YSA9ICh1bnNpZ25lZCBjaGFyKilzb2FwX2hleDJzKHNvYXAsIHRva2VuLT5fX2l0ZW0sIE5VTEwsIDAsIHNpemUpOworICAgIGVsc2UKKyAgICAqLworICAgIC8qIGFzc3VtZSB0b2tlbiBpcyByZXByZXNlbnRlZCBpbiBiYXNlNjQgYnkgZGVmYXVsdCAqLworICAgICpkYXRhID0gKHVuc2lnbmVkIGNoYXIqKXNvYXBfYmFzZTY0MnMoc29hcCwgdG9rZW4tPl9faXRlbSwgTlVMTCwgMCwgc2l6ZSk7CisgICAgaWYgKCpkYXRhKQorICAgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgcmV0dXJuIHNvYXBfd3NzZV9mYXVsdChzb2FwLCB3c3NlMl9fU2VjdXJpdHlUb2tlblVuYXZhaWxhYmxlLCAiQmluYXJ5U2VjdXJpdHlUb2tlbiByZXF1aXJlZCIpOworfQorCisvKioKK0BmbiBYNTA5KiBzb2FwX3dzc2VfZ2V0X0JpbmFyeVNlY3VyaXR5VG9rZW5YNTA5KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCkKK0BicmllZiBHZXQgWDUwOSB3c3NlOkJpbmFyeVNlY3VyaXR5VG9rZW4gY2VydGlmaWNhdGUgYW5kIHZlcmlmeSBpdHMgY29udGVudC4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0BwYXJhbVtpbl0gaWQgc3RyaW5nIG9mIHRva2VuIHRvIGdldCBvciBOVUxMCitAcmV0dXJuIFg1MDkgY2VydGlmaWNhdGUgKGR5bmFtaWNhbGx5IGFsbG9jYXRlZCkgb3IgTlVMTCB3aXRoIHdzc2U6U2VjdXJpdHlUb2tlblVuYXZhaWxhYmxlIGZhdWx0CisqLworWDUwOSoKK3NvYXBfd3NzZV9nZXRfQmluYXJ5U2VjdXJpdHlUb2tlblg1MDkoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkKQoreyBYNTA5ICpjZXJ0ID0gTlVMTDsKKyAgY2hhciAqdmFsdWVUeXBlOworICB1bnNpZ25lZCBjaGFyICpkYXRhOworICBpbnQgc2l6ZTsKKyAgREJHRlVOMSgic29hcF93c3NlX2dldF9CaW5hcnlTZWN1cml0eVRva2VuWDUwOSIsICJpZD0lcyIsIGlkP2lkOiIiKTsKKyAgaWYgKCFzb2FwX3dzc2VfZ2V0X0JpbmFyeVNlY3VyaXR5VG9rZW4oc29hcCwgaWQsICZ2YWx1ZVR5cGUsICZkYXRhLCAmc2l6ZSkKKyAgICYmIHZhbHVlVHlwZQorICAgJiYgIXN0cmNtcCh2YWx1ZVR5cGUsIHdzc2VfWDUwOXYzVVJJKSkKKyAgICBjZXJ0ID0gZDJpX1g1MDkoTlVMTCwgJmRhdGEsIHNpemUpOworICAvKiB2ZXJpZnkgdGhlIGNlcnRpZmljYXRlICovCisgIGlmICghY2VydCB8fCBzb2FwX3dzc2VfdmVyaWZ5X1g1MDkoc29hcCwgY2VydCkpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBjZXJ0OworfQorCisvKioKK0BmbiBpbnQgc29hcF93c3NlX3ZlcmlmeV9YNTA5KHN0cnVjdCBzb2FwICpzb2FwLCBYNTA5ICpjZXJ0KQorQGJyaWVmIFZlcmlmaWVzIFg1MDkgY2VydGlmaWNhdGUgYWdhaW5zdCBzb2FwLT5jYWZpbGUsIHNvYXAtPmNhcGF0aCwgYW5kIHNvYXAtPmNybGZpbGUKK0BwYXJhbSBzb2FwIGNvbnRleHQKK0BwYXJhbVtpbl0gY2VydCBYNTA5IGNlcnRpZmljYXRlCitAcmV0dXJuIFNPQVBfT0sgb3IgZmF1bHQKKworVGhpcyBpcyBhbiBleHBlbnNpdmUgb3BlcmF0aW9uLCBzaW5jZSB3ZSByZWFkIHRoZSBjYWZpbGUgYW5kIGNyZWF0ZSB0aGUgb2JqZWN0cworZXZlcnkgdGltZSB3ZSBuZWVkIHRvIHZlcmlmeSBhIGNlcnRpZmljYXRlLiBGb3IgZnV0dXJlIHJlbGVhc2VzLCB3ZSBzaG91bGQKK3N0b3JlIHRoaXMgZGF0YSBwZXJtYW5lbnRseSBpbiB0aGUgZ1NPQVAgZW5naW5lIG9yIHBsdWdpbi4KKyovCitpbnQKK3NvYXBfd3NzZV92ZXJpZnlfWDUwOShzdHJ1Y3Qgc29hcCAqc29hcCwgWDUwOSAqY2VydCkKK3sgWDUwOV9TVE9SRSAqc3RvcmUgPSBOVUxMOworICBYNTA5X1NUT1JFX0NUWCAqdmVyaWZ5ID0gTlVMTDsKKyAgLyogT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXMoKTsgKi8KKyAgREJHRlVOKCJzb2FwX3dzc2VfdmVyaWZ5X1g1MDkiKTsKKyAgLyogVE9ETzogc2hvdWxkIGtlZXAgdGhlIHN0b3JlIGluIHRoZSBnU09BUCBlbmdpbmUgb3IgcGx1Z2luIHRvIGF2b2lkIGV4Y2Vzc2l2ZSBsb2FkcyAqLworICBpZiAoIShzdG9yZSA9IFg1MDlfU1RPUkVfbmV3KCkpKQorICB7IHNvYXBfcmVjZWl2ZXJfZmF1bHQoc29hcCwgInNvYXBfd3NzZV92ZXJpZnlfWDUwOSIsICJDb3VsZCBub3QgY3JlYXRlIFg1MDlfU1RPUkUgb2JqZWN0Iik7CisgICAgZ290byBlcnI7CisgIH0KKyAgWDUwOV9TVE9SRV9zZXRfdmVyaWZ5X2NiX2Z1bmMoc3RvcmUsIHNvYXAtPmZzc2x2ZXJpZnkpOworICBpZiAoc29hcC0+Y2FmaWxlIHx8IHNvYXAtPmNhcGF0aCkKKyAgeyBpZiAoWDUwOV9TVE9SRV9sb2FkX2xvY2F0aW9ucyhzdG9yZSwgc29hcC0+Y2FmaWxlLCBzb2FwLT5jYXBhdGgpICE9IDEpCisgICAgeyBzb2FwX3JlY2VpdmVyX2ZhdWx0KHNvYXAsICJzb2FwX3dzc2VfdmVyaWZ5X1g1MDkiLCAiQ291bGQgbm90IGxvYWQgQ0EgZmlsZSBvciBwYXRoIik7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0KKyNpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+IDB4MDA5MDcwMDBMKQorICBpZiAoc29hcC0+Y3JsZmlsZSkKKyAgeyBYNTA5X0xPT0tVUCAqbG9va3VwOworICAgIGlmICghKGxvb2t1cCA9IFg1MDlfU1RPUkVfYWRkX2xvb2t1cChzdG9yZSwgWDUwOV9MT09LVVBfZmlsZSgpKSkpCisgICAgeyBzb2FwX3JlY2VpdmVyX2ZhdWx0KHNvYXAsICJzb2FwX3dzc2VfdmVyaWZ5X1g1MDkiLCAiQ291bGQgbm90IGNyZWF0ZSBYNTA5X0xPT0tVUCBvYmplY3QiKTsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBpZiAoWDUwOV9sb2FkX2NybF9maWxlKGxvb2t1cCwgc29hcC0+Y3JsZmlsZSwgWDUwOV9GSUxFVFlQRV9QRU0pICE9IDEpCisgICAgeyBzb2FwX3JlY2VpdmVyX2ZhdWx0KHNvYXAsICJzb2FwX3dzc2VfdmVyaWZ5X1g1MDkiLCAiQ291bGQgbm90IHJlYWQgdGhlIENSTCBmaWxlIik7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgWDUwOV9TVE9SRV9zZXRfZmxhZ3Moc3RvcmUsIFg1MDlfVl9GTEFHX0NSTF9DSEVDSyB8IFg1MDlfVl9GTEFHX0NSTF9DSEVDS19BTEwpOworICB9CisjZW5kaWYKKyAgaWYgKCEodmVyaWZ5ID0gWDUwOV9TVE9SRV9DVFhfbmV3KCkpKQorICB7IHNvYXBfcmVjZWl2ZXJfZmF1bHQoc29hcCwgInNvYXBfd3NzZV92ZXJpZnlfWDUwOSIsICJDb3VsZCBub3QgY3JlYXRlIFg1MDlfU1RPUkVfQ1RYIG9iamVjdCIpOworICAgIGdvdG8gZXJyOworICB9CisjaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPiAweDAwOTA3MDAwTCkKKyAgaWYgKFg1MDlfU1RPUkVfQ1RYX2luaXQodmVyaWZ5LCBzdG9yZSwgY2VydCwgTlVMTCkgIT0gMSkKKyAgeyBzb2FwX3JlY2VpdmVyX2ZhdWx0KHNvYXAsICJzb2FwX3dzc2VfdmVyaWZ5X1g1MDkiLCAiQ291bGQgbm90IGluaXRpYWxpemUgWDUwOV9TVE9SRV9DVFggb2JqZWN0Iik7CisgICAgZ290byBlcnI7CisgIH0KKyNlbHNlCisgIFg1MDlfU1RPUkVfQ1RYX2luaXQodmVyaWZ5LCBzdG9yZSwgY2VydCwgTlVMTCk7CisjZW5kaWYKKyAgaWYgKFg1MDlfdmVyaWZ5X2NlcnQodmVyaWZ5KSAhPSAxKQorICB7IHNvYXBfc2VuZGVyX2ZhdWx0KHNvYXAsICJzb2FwX3dzc2VfdmVyaWZ5X1g1MDkiLCAiSW52YWxpZCBjZXJ0aWZpY2F0ZSIpOworICAgIGdvdG8gZXJyOworICB9CisgIFg1MDlfU1RPUkVfQ1RYX2ZyZWUodmVyaWZ5KTsKKyAgWDUwOV9TVE9SRV9mcmVlKHN0b3JlKTsKKyAgcmV0dXJuIFNPQVBfT0s7CitlcnI6CisgIGlmICh2ZXJpZnkpCisgICAgWDUwOV9TVE9SRV9DVFhfZnJlZSh2ZXJpZnkpOworICBpZiAoc3RvcmUpCisgICAgWDUwOV9TVE9SRV9mcmVlKHN0b3JlKTsKKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqIGRzOlNpZ25hdHVyZS9TaWduZWRJbmZvCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCitAZm4gZHNfX1NpZ25lZEluZm9UeXBlKiBzb2FwX3dzc2VfYWRkX1NpZ25lZEluZm8oc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYgQWRkcyBTaWduZWRJbmZvIGVsZW1lbnQuCitAcGFyYW0gc29hcCBjb250ZXh0CitAcmV0dXJuIGRzX19TaWduZWRJbmZvVHlwZSBvYmplY3QKKyovCitzdHJ1Y3QgZHNfX1NpZ25lZEluZm9UeXBlKgorc29hcF93c3NlX2FkZF9TaWduZWRJbmZvKHN0cnVjdCBzb2FwICpzb2FwKQoreyBkc19fU2lnbmF0dXJlVHlwZSAqc2lnbmF0dXJlID0gc29hcF93c3NlX2FkZF9TaWduYXR1cmUoc29hcCk7CisgIGlmICghc2lnbmF0dXJlLT5TaWduZWRJbmZvKQorICB7IHNpZ25hdHVyZS0+U2lnbmVkSW5mbyA9IChkc19fU2lnbmVkSW5mb1R5cGUqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihkc19fU2lnbmVkSW5mb1R5cGUpKTsKKyAgICBzb2FwX2RlZmF1bHRfZHNfX1NpZ25lZEluZm9UeXBlKHNvYXAsIHNpZ25hdHVyZS0+U2lnbmVkSW5mbyk7CisgIH0KKyAgcmV0dXJuIHNpZ25hdHVyZS0+U2lnbmVkSW5mbzsKK30KKworLyoqCitAZm4gaW50IHNvYXBfd3NzZV9hZGRfU2lnbmVkSW5mb19SZWZlcmVuY2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKlVSSSwgY29uc3QgY2hhciAqdHJhbnNmb3JtLCBjb25zdCBjaGFyICppbmNsdXNpdmVOYW1lc3BhY2VzLCBjb25zdCBjaGFyICpIQSkKK0BicmllZiBBZGRzIFNpZ25lZEluZm8gZWxlbWVudCB3aXRoIFJlZmVyZW5jZSBVUkksIHRyYW5zZm9ybSBhbGdvcml0aG0gdXNlZCwgYW5kIGRpZ2VzdCB2YWx1ZS4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0BwYXJhbVtpbl0gVVJJIHJlZmVyZW5jZQorQHBhcmFtW2luXSB0cmFuc2Zvcm0gc3RyaW5nIHNob3VsZCBiZSBjMTRuX1VSSSBmb3IgZXhjLWMxNG4gb3IgTlVMTAorQHBhcmFtW2luXSBpbmNsdXNpdmVOYW1lc3BhY2VzIHVzZWQgYnkgdGhlIGV4Yy1jMTRuIHRyYW5zZm9ybSBvciBOVUxMCitAcGFyYW1baW5dIEhBIGlzIHRoZSBTSEExIGRpZ2VzdCBpbiBiaW5hcnkgZm9ybSAobGVuZ3RoPVNPQVBfU01EX1NIQTFfU0laRSkKK0ByZXR1cm4gU09BUF9PSyBvciBTT0FQX0VPTSB3aGVuIHJlZmVyZW5jZXMgZXhjZWVkIFNPQVBfV1NTRV9NQVhfUkVGCisKK1RoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCB0byBhZGQgbW9yZSByZWZlcmVuY2VzIHRvIHRoZSB3c3NlOlNpZ25lZEluZm8KK2VsZW1lbnQuIEEgbWF4aW11bSBudW1iZXIgb2YgU09BUF9XU1NFX01BWF9SRUYgcmVmZXJlbmNlcyBjYW4gYmUgYWRkZWQuIFRoZQorZGlnZXN0IG1ldGhvZCBpcyBhbHdheXMgU0hBMS4gCitOb3RlOiBYUGF0aCB0cmFuc2Zvcm1zIGNhbm5vdCBiZSBzcGVjaWZpZWQgaW4gdGhpcyByZWxlYXNlLgorKi8KK2ludAorc29hcF93c3NlX2FkZF9TaWduZWRJbmZvX1JlZmVyZW5jZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqVVJJLCBjb25zdCBjaGFyICp0cmFuc2Zvcm0sIGNvbnN0IGNoYXIgKmluY2x1c2l2ZU5hbWVzcGFjZXMsIGNvbnN0IGNoYXIgKkhBKQoreyBkc19fU2lnbmVkSW5mb1R5cGUgKnNpZ25lZEluZm8gPSBzb2FwX3dzc2VfYWRkX1NpZ25lZEluZm8oc29hcCk7CisgIGRzX19SZWZlcmVuY2VUeXBlICpyZWZlcmVuY2U7CisgIERCR0ZVTjIoInNvYXBfd3NzZV9hZGRfU2lnbmVkSW5mb19SZWZlcmVuY2UiLCAiVVJJPSVzIiwgVVJJP1VSSToiIiwgInRyYW5zZm9ybT0lcyIsIHRyYW5zZm9ybT90cmFuc2Zvcm06IiIpOworICAvKiBpZiB0aGlzIGlzIHRoZSBmaXJzdCByZWZlcmVuY2UsIGFsbG9jYXRlIFNPQVBfV1NTRV9NQVhfUkVGIHJlZmVyZW5jZXMgKi8KKyAgaWYgKHNpZ25lZEluZm8tPl9fc2l6ZVJlZmVyZW5jZSA9PSAwKQorICAgIHNpZ25lZEluZm8tPlJlZmVyZW5jZSA9IChkc19fUmVmZXJlbmNlVHlwZSoqKXNvYXBfbWFsbG9jKHNvYXAsIFNPQVBfV1NTRV9NQVhfUkVGKnNpemVvZihkc19fUmVmZXJlbmNlVHlwZSopKTsKKyAgZWxzZQorICB7IC8qIG1heGltdW0gbnVtYmVyIG9mIHJlZmVyZW5jZXMgZXhjZWVkZWQ/ICovCisgICAgaWYgKHNpZ25lZEluZm8tPl9fc2l6ZVJlZmVyZW5jZSA+PSBTT0FQX1dTU0VfTUFYX1JFRikKKyAgICAgIHJldHVybiBTT0FQX0VPTTsKKyAgfQorICAvKiBhbGxvY2F0ZSBmcmVzaCBuZXcgcmVmZXJlbmNlICovCisgIHJlZmVyZW5jZSA9IChkc19fUmVmZXJlbmNlVHlwZSopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKGRzX19SZWZlcmVuY2VUeXBlKSk7CisgIHNvYXBfZGVmYXVsdF9kc19fUmVmZXJlbmNlVHlwZShzb2FwLCByZWZlcmVuY2UpOworICAvKiBwb3B1bGF0ZSB0aGUgVVJJICovCisgIHJlZmVyZW5jZS0+VVJJID0gc29hcF9zdHJkdXAoc29hcCwgVVJJKTsKKyAgLyogaWYgYSB0cmFuc2Zvcm0gYWxnb3JpdGhtIHdhcyB1c2VkLCBwb3B1bGF0ZSB0aGUgVHJhbnNmb3JtcyBlbGVtZW50ICovCisgIGlmICh0cmFuc2Zvcm0pCisgIHsgcmVmZXJlbmNlLT5UcmFuc2Zvcm1zID0gKGRzX19UcmFuc2Zvcm1zVHlwZSopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKGRzX19UcmFuc2Zvcm1zVHlwZSkpOworICAgIHNvYXBfZGVmYXVsdF9kc19fVHJhbnNmb3Jtc1R5cGUoc29hcCwgcmVmZXJlbmNlLT5UcmFuc2Zvcm1zKTsKKyAgICAvKiBvbmx5IG9uZSB0cmFuc2Zvcm0gKi8KKyAgICByZWZlcmVuY2UtPlRyYW5zZm9ybXMtPl9fc2l6ZVRyYW5zZm9ybSA9IDE7CisgICAgcmVmZXJlbmNlLT5UcmFuc2Zvcm1zLT5UcmFuc2Zvcm0gPSAoZHNfX1RyYW5zZm9ybVR5cGUqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihkc19fVHJhbnNmb3JtVHlwZSkpOworICAgIHNvYXBfZGVmYXVsdF9kc19fVHJhbnNmb3JtVHlwZShzb2FwLCByZWZlcmVuY2UtPlRyYW5zZm9ybXMtPlRyYW5zZm9ybSk7CisgICAgcmVmZXJlbmNlLT5UcmFuc2Zvcm1zLT5UcmFuc2Zvcm0tPkFsZ29yaXRobSA9IChjaGFyKil0cmFuc2Zvcm07CisgICAgLyogcG9wdWxhdGUgdGhlIGMxNG46SW5jbHVzaXZlTmFtZXNwYWNlcyBlbGVtZW50ICovCisgICAgaWYgKGluY2x1c2l2ZU5hbWVzcGFjZXMpCisgICAgeyByZWZlcmVuY2UtPlRyYW5zZm9ybXMtPlRyYW5zZm9ybS0+YzE0bl9fSW5jbHVzaXZlTmFtZXNwYWNlcyA9IChfYzE0bl9fSW5jbHVzaXZlTmFtZXNwYWNlcyopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKF9jMTRuX19JbmNsdXNpdmVOYW1lc3BhY2VzKSk7CisgICAgICBzb2FwX2RlZmF1bHRfX2MxNG5fX0luY2x1c2l2ZU5hbWVzcGFjZXMoc29hcCwgcmVmZXJlbmNlLT5UcmFuc2Zvcm1zLT5UcmFuc2Zvcm0tPmMxNG5fX0luY2x1c2l2ZU5hbWVzcGFjZXMpOworICAgICAgcmVmZXJlbmNlLT5UcmFuc2Zvcm1zLT5UcmFuc2Zvcm0tPmMxNG5fX0luY2x1c2l2ZU5hbWVzcGFjZXMtPlByZWZpeExpc3QgPSBzb2FwX3N0cmR1cChzb2FwLCBpbmNsdXNpdmVOYW1lc3BhY2VzKTsKKyAgICB9CisgIH0KKyAgLyogcG9wdWxhdGUgdGhlIERpZ2VzdE1ldGhvZCBlbGVtZW50ICovCisgIHJlZmVyZW5jZS0+RGlnZXN0TWV0aG9kID0gKGRzX19EaWdlc3RNZXRob2RUeXBlKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2YoZHNfX0RpZ2VzdE1ldGhvZFR5cGUpKTsKKyAgc29hcF9kZWZhdWx0X2RzX19EaWdlc3RNZXRob2RUeXBlKHNvYXAsIHJlZmVyZW5jZS0+RGlnZXN0TWV0aG9kKTsKKyAgLyogdGhlIERpZ2VzdE1ldGhvZCBhbGdvcml0aG0gaXMgYWx3YXlzIFNIQTEgKi8KKyAgcmVmZXJlbmNlLT5EaWdlc3RNZXRob2QtPkFsZ29yaXRobSA9IChjaGFyKilkc19zaGExVVJJOworICAvKiBwb3B1bGF0ZSB0aGUgRGlnZXN0VmFsdWUgZWxlbWVudCAqLworICByZWZlcmVuY2UtPkRpZ2VzdFZhbHVlID0gc29hcF9zMmJhc2U2NChzb2FwLCBIQSwgTlVMTCwgU09BUF9TTURfU0hBMV9TSVpFKTsKKyAgLyogYWRkIHRoZSBmcmVzaCBuZXcgcmVmZXJlbmNlIHRvIHRoZSBhcnJheSAqLworICBzaWduZWRJbmZvLT5SZWZlcmVuY2Vbc2lnbmVkSW5mby0+X19zaXplUmVmZXJlbmNlXSA9IHJlZmVyZW5jZTsKKyAgc2lnbmVkSW5mby0+X19zaXplUmVmZXJlbmNlKys7CisgIHJldHVybiBTT0FQX09LOworfQorCisvKioKK0BmbiBpbnQgc29hcF93c3NlX2FkZF9TaWduZWRJbmZvX1NpZ25hdHVyZU1ldGhvZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbWV0aG9kLCBpbnQgY2Fub25pY2FsKQorQGJyaWVmIEFkZHMgU2lnbmVkSW5mbyBlbGVtZW50IHdpdGggU2lnbmF0dXJlTWV0aG9kLgorQHBhcmFtIHNvYXAgY29udGV4dAorQHBhcmFtW2luXSBtZXRob2QgaXMgdGhlIFVSSSBvZiB0aGUgc2lnbmF0dXJlIGFsZ29yaXRobSAoZS5nLiBkc19yc2Ffc2hhMSkKK0BwYXJhbVtpbl0gY2Fub25pY2FsIGZsYWcgaW5kaWNhdGluZyB0aGF0IFNpZ25lZEluZm8gaXMgc2lnbmVkIGluIGV4Yy1jMTRuIGZvcm0KK0ByZXR1cm4gU09BUF9PSworCitOb3RlOiB0aGUgYzE0bjpJbmNsdXNpdmVOYW1lc3BhY2VzL1ByZWZpeExpc3QgaXMgc2V0IHRvICJTT0FQLUVOViB3c3NlIi4KKyovCitpbnQKK3NvYXBfd3NzZV9hZGRfU2lnbmVkSW5mb19TaWduYXR1cmVNZXRob2Qoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm1ldGhvZCwgaW50IGNhbm9uaWNhbCkKK3sgZHNfX1NpZ25lZEluZm9UeXBlICpzaWduZWRJbmZvID0gc29hcF93c3NlX2FkZF9TaWduZWRJbmZvKHNvYXApOworICBEQkdGVU4yKCJzb2FwX3dzc2VfYWRkX1NpZ25lZEluZm9fU2lnbmF0dXJlTWV0aG9kIiwgIm1ldGhvZD0lcyIsIG1ldGhvZD9tZXRob2Q6IiIsICJjYW5vbmljYWw9JWQiLCBjYW5vbmljYWwpOworICAvKiBpZiBzaWduZWQgaW4gZXhjLWMxNG4gZm9ybSwgcG9wdWxhdGUgQ2Fub25pY2FsaXphdGlvbk1ldGhvZCBlbGVtZW50ICovCisgIGlmIChjYW5vbmljYWwpCisgIHsgc2lnbmVkSW5mby0+Q2Fub25pY2FsaXphdGlvbk1ldGhvZCA9IChkc19fQ2Fub25pY2FsaXphdGlvbk1ldGhvZFR5cGUqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihkc19fQ2Fub25pY2FsaXphdGlvbk1ldGhvZFR5cGUpKTsKKyAgICBzb2FwX2RlZmF1bHRfZHNfX0Nhbm9uaWNhbGl6YXRpb25NZXRob2RUeXBlKHNvYXAsIHNpZ25lZEluZm8tPkNhbm9uaWNhbGl6YXRpb25NZXRob2QpOworICAgIHNpZ25lZEluZm8tPkNhbm9uaWNhbGl6YXRpb25NZXRob2QtPkFsZ29yaXRobSA9IChjaGFyKiljMTRuX1VSSTsKKyAgICAvKiBUT0RPOiBjaGVjayBjMTRuOkluY2x1c2l2ZU5hbWVzcGFjZXMvUHJlZml4TGlzdCByZXF1aXJlbWVudHMgKi8KKyAgICBzaWduZWRJbmZvLT5DYW5vbmljYWxpemF0aW9uTWV0aG9kLT5jMTRuX19JbmNsdXNpdmVOYW1lc3BhY2VzID0gKF9jMTRuX19JbmNsdXNpdmVOYW1lc3BhY2VzKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2YoX2MxNG5fX0luY2x1c2l2ZU5hbWVzcGFjZXMpKTsKKyAgICBzb2FwX2RlZmF1bHRfX2MxNG5fX0luY2x1c2l2ZU5hbWVzcGFjZXMoc29hcCwgc2lnbmVkSW5mby0+Q2Fub25pY2FsaXphdGlvbk1ldGhvZC0+YzE0bl9fSW5jbHVzaXZlTmFtZXNwYWNlcyk7CisgICAgc2lnbmVkSW5mby0+Q2Fub25pY2FsaXphdGlvbk1ldGhvZC0+YzE0bl9fSW5jbHVzaXZlTmFtZXNwYWNlcy0+UHJlZml4TGlzdCA9ICJTT0FQLUVOViB3c3NlIjsKKyAgfQorICAvKiBwb3B1bGF0ZSBTaWduYXR1cmVNZXRob2QgZWxlbWVudCAqLworICBzaWduZWRJbmZvLT5TaWduYXR1cmVNZXRob2QgPSAoZHNfX1NpZ25hdHVyZU1ldGhvZFR5cGUqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihkc19fU2lnbmF0dXJlTWV0aG9kVHlwZSkpOworICBzb2FwX2RlZmF1bHRfZHNfX1NpZ25hdHVyZU1ldGhvZFR5cGUoc29hcCwgc2lnbmVkSW5mby0+U2lnbmF0dXJlTWV0aG9kKTsKKyAgc2lnbmVkSW5mby0+U2lnbmF0dXJlTWV0aG9kLT5BbGdvcml0aG0gPSAoY2hhciopbWV0aG9kOworICByZXR1cm4gU09BUF9PSzsKK30KKworLyoqCitAZm4gZHNfX1NpZ25lZEluZm9UeXBlKiBzb2FwX3dzc2VfU2lnbmVkSW5mbyhzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZiBSZXR1cm5zIFNpZ25lZEluZm8gZWxlbWVudCBpZiBwcmVzZW50LgorQHBhcmFtIHNvYXAgY29udGV4dAorQHJldHVybiBkc19fU2lnbmVkSW5mb1R5cGUgb2JqZWN0IG9yIE5VTEwKKyovCitzdHJ1Y3QgZHNfX1NpZ25lZEluZm9UeXBlKgorc29hcF93c3NlX1NpZ25lZEluZm8oc3RydWN0IHNvYXAgKnNvYXApCit7IGRzX19TaWduYXR1cmVUeXBlICpzaWduYXR1cmUgPSBzb2FwX3dzc2VfU2lnbmF0dXJlKHNvYXApOworICBpZiAoc2lnbmF0dXJlKQorICAgIHJldHVybiBzaWduYXR1cmUtPlNpZ25lZEluZm87CisgIHJldHVybiBOVUxMOworfQorCisvKioKK0BmbiBpbnQgc29hcF93c3NlX2dldF9TaWduZWRJbmZvX1NpZ25hdHVyZU1ldGhvZChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50ICphbGcpCitAYnJpZWYgR2V0IFNpZ25hdHVyZU1ldGhvZCBhbGdvcml0aG0KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0BwYXJhbVtvdXRdIGFsZyBpcyBTT0FQX1NNRF9ITUFDX1NIQTEsIFNPQVBfU01EX1ZSRllfRFNBX1NIQTEsIG9yIFNPQVBfU01EX1ZSRllfUlNBX1NIQTEKK0ByZXR1cm4gU09BUF9PSyBvciBTT0FQX0ZBVUxUIHdpdGggd3NzZTpVbnN1cHBvcnRlZEFsZ29yaXRobSBvciB3c3NlOkZhaWxlZENoZWNrIGZhdWx0CisqLworaW50Citzb2FwX3dzc2VfZ2V0X1NpZ25lZEluZm9fU2lnbmF0dXJlTWV0aG9kKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgKmFsZykKK3sgZHNfX1NpZ25lZEluZm9UeXBlICpzaWduZWRJbmZvID0gc29hcF93c3NlX1NpZ25lZEluZm8oc29hcCk7CisgIERCR0ZVTigic29hcF93c3NlX2dldF9TaWduZWRJbmZvX1NpZ25hdHVyZU1ldGhvZCIpOworICAqYWxnID0gU09BUF9TTURfTk9ORTsKKyAgLyogaWYgd2UgaGF2ZSBhIFNpZ25lZEluZm8gZWxlbWVudCwgZ2V0IHRoZSBhbGdvcml0aG0gKi8KKyAgaWYgKHNpZ25lZEluZm8KKyAgICYmIHNpZ25lZEluZm8tPlNpZ25hdHVyZU1ldGhvZAorICAgJiYgc2lnbmVkSW5mby0+U2lnbmF0dXJlTWV0aG9kLT5BbGdvcml0aG0pCisgIHsgY29uc3QgY2hhciAqbWV0aG9kID0gc2lnbmVkSW5mby0+U2lnbmF0dXJlTWV0aG9kLT5BbGdvcml0aG07CisgICAgaWYgKCFzdHJjbXAobWV0aG9kLCBkc19obWFjX3NoYTFVUkkpKQorICAgICAgKmFsZyA9IFNPQVBfU01EX0hNQUNfU0hBMTsKKyAgICBlbHNlIGlmICghc3RyY21wKG1ldGhvZCwgZHNfZHNhX3NoYTFVUkkpKQorICAgICAgKmFsZyA9IFNPQVBfU01EX1ZSRllfRFNBX1NIQTE7CisgICAgZWxzZSBpZiAoIXN0cmNtcChtZXRob2QsIGRzX3JzYV9zaGExVVJJKSkKKyAgICAgICphbGcgPSBTT0FQX1NNRF9WUkZZX1JTQV9TSEExOworICAgIGVsc2UKKyAgICAgIHJldHVybiBzb2FwX3dzc2VfZmF1bHQoc29hcCwgd3NzZTJfX1Vuc3VwcG9ydGVkQWxnb3JpdGhtLCBtZXRob2QpOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIHJldHVybiBzb2FwX3dzc2VfZmF1bHQoc29hcCwgd3NzZTJfX0ZhaWxlZENoZWNrLCAiU2lnbmF0dXJlIHJlcXVpcmVkIik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICogZHM6U2lnbmF0dXJlL1NpZ25hdHVyZVZhbHVlCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCitAZm4gaW50IHNvYXBfd3NzZV9hZGRfU2lnbmF0dXJlVmFsdWUoc3RydWN0IHNvYXAgKnNvYXAsIGludCBhbGcsIGNvbnN0IHZvaWQgKmtleSwgaW50IGtleWxlbikKK0BicmllZiBBZGRzIFNpZ25lZEluZm8vU2lnbmF0dXJlTWV0aG9kIGVsZW1lbnQsIHNpZ25zIHRoZSBTaWduZWRJbmZvIGVsZW1lbnQsIGFuZCBhZGRzIHRoZSByZXN1bHRpbmcgU2lnbmF0dXJlVmFsdWUgZWxlbWVudC4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0BwYXJhbVtpbl0gYWxnIGlzIFNPQVBfU01EX0hNQUNfU0hBMSwgU09BUF9TTURfU0lHTl9EU0FfU0hBMSwgb3IgU09BUF9TTURfU0lHTl9SU0FfU0hBMQorQHBhcmFtW2luXSBrZXkgdG8gdXNlIHRvIHNpZ24gKEhNQUMgb3IgRVZQX1BLRVkpCitAcGFyYW1baW5dIGtleWxlbiBsZW5ndGggb2YgSE1BQyBrZXkKK0ByZXR1cm4gU09BUF9PSywgU09BUF9FT00sIG9yIGZhdWx0CisKK1RvIHNpZ24gdGhlIFNpZ25lZEluZm8gZWxlbWVudCB3aXRoIHRoaXMgZnVuY3Rpb24sIHBvcHVsYXRlIFNpZ25lZEluZm8gd2l0aAorUmVmZXJlbmNlIGVsZW1lbnRzIGZpcnN0IHVzaW5nIHNvYXBfd3NzZV9hZGRfU2lnbmVkSW5mb19SZWZlcmVuY2UuIFRoZQorU2lnbmVkSW5mbyBlbGVtZW50IG11c3Qgbm90IGJlIG1vZGlmaWVkIGFmdGVyIHNpZ25pbmcuCisKK1RoZSBTT0FQX1hNTF9JTkRFTlQgYW5kIFNPQVBfWE1MX0NBTk9OSUNBTCBmbGFncyBhcmUgdXNlZCB0byBzZXJpYWxpemUgdGhlCitTaWduZWRJbmZvIHRvIGNvbXB1dGUgdGhlIHNpZ25hdHVyZS4KKyovCitpbnQKK3NvYXBfd3NzZV9hZGRfU2lnbmF0dXJlVmFsdWUoc3RydWN0IHNvYXAgKnNvYXAsIGludCBhbGcsIGNvbnN0IHZvaWQgKmtleSwgaW50IGtleWxlbikKK3sgZHNfX1NpZ25hdHVyZVR5cGUgKnNpZ25hdHVyZSA9IHNvYXBfd3NzZV9hZGRfU2lnbmF0dXJlKHNvYXApOworICBjb25zdCBjaGFyICpjMTRuZXhjbHVkZSwgKm1ldGhvZCA9IE5VTEw7CisgIGNoYXIgKnNpZzsKKyAgaW50IHNpZ2xlbjsKKyAgREJHRlVOMSgic29hcF93c3NlX2FkZF9TaWduYXR1cmVWYWx1ZSIsICJhbGc9JWQiLCBhbGcpOworICAvKiBkZXRlcm1pbmUgc2lnbmF0dXJlIGFsZ29yaXRobSB0byB1c2UgKi8KKyAgc3dpdGNoIChhbGcpCisgIHsgY2FzZSBTT0FQX1NNRF9ITUFDX1NIQTE6CisgICAgICBtZXRob2QgPSBkc19obWFjX3NoYTFVUkk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfU01EX1NJR05fRFNBX1NIQTE6CisgICAgICBtZXRob2QgPSBkc19kc2Ffc2hhMVVSSTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9TTURfU0lHTl9SU0FfU0hBMToKKyAgICAgIG1ldGhvZCA9IGRzX3JzYV9zaGExVVJJOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBzb2FwX3dzc2VfZmF1bHQoc29hcCwgd3NzZTJfX1Vuc3VwcG9ydGVkQWxnb3JpdGhtLCBOVUxMKTsKKyAgfQorICAvKiBwb3B1bGF0ZSBTaWduZWRJbmZvL1NpZ25hdHVyZU1ldGhvZCBiYXNlZCBvbiBTT0FQX1hNTF9DQU5PTklDQUwgZmxhZyAqLworICBzb2FwX3dzc2VfYWRkX1NpZ25lZEluZm9fU2lnbmF0dXJlTWV0aG9kKHNvYXAsIG1ldGhvZCwgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpKTsKKyAgLyogdXNlIHRoZSBnU09BUCBlbmdpbmUncyBsb29rLWFzaWRlIGJ1ZmZlciB0byB0ZW1wb3JhcmlseSBob2xkIHRoZSBzaWcgKi8KKyAgaWYgKHNvYXBfc3RvcmVfbGFiKHNvYXAsIE5VTEwsIHNvYXBfc21kX3NpemUoYWxnLCBrZXkpKSkKKyAgICByZXR1cm4gU09BUF9FT007CisgIHNpZyA9IHNvYXAtPmxhYmJ1ZjsKKyAgLyogd2Ugd2lsbCBzZXJpYWxpemUgU2lnbmVkSW5mbyBhcyBpdCBhcHBlYXJzIGV4YWN0bHkgaW4gdGhlIFNPQVAgSGVhZGVyICovCisgIC8qIHNldCBpbmRlbnQgbGV2ZWwgZm9yIFhNTCBTaWduZWRJbmZvIGFzIGl0IGFwcGVhcnMgaW4gdGhlIFNPQVAgSGVhZGVyICovCisgIHNvYXAtPmxldmVsID0gNDsKKyAgLyogd2l0aCBTT0FQX1hNTF9DQU5PTklDQUwgZmxhZywgZXhjbHVkZSB0aGUgImRzIiBwcmVmaXggKi8KKyAgYzE0bmV4Y2x1ZGUgPSBzb2FwLT5jMTRuZXhjbHVkZTsKKyAgc29hcC0+YzE0bmV4Y2x1ZGUgPSAiZHMiOworICAvKiB1c2Ugc21kZXZwIGVuZ2luZSB0byBzaWduIFNpZ25lZEluZm8gKi8KKyAgaWYgKHNvYXBfc21kX2JlZ2luKHNvYXAsIGFsZywga2V5LCBrZXlsZW4pCisgICB8fCBzb2FwX291dF9kc19fU2lnbmVkSW5mb1R5cGUoc29hcCwgImRzOlNpZ25lZEluZm8iLCAwLCBzaWduYXR1cmUtPlNpZ25lZEluZm8sIE5VTEwpCisgICB8fCBzb2FwX3NtZF9lbmQoc29hcCwgc2lnLCAmc2lnbGVuKSkKKyAgICByZXR1cm4gc29hcF93c3NlX2ZhdWx0KHNvYXAsIHdzc2UyX19JbnZhbGlkU2VjdXJpdHksICJDb3VsZCBub3Qgc2lnbiIpOworICAvKiByZXN0b3JlIGMxNG5leGNsdWRlICovCisgIHNvYXAtPmMxNG5leGNsdWRlID0gYzE0bmV4Y2x1ZGU7CisgIC8qIHBvcHVsYXRlIHRoZSBTaWduYXR1cmVWYWx1ZSBlbGVtZW50ICovCisgIHNpZ25hdHVyZS0+U2lnbmF0dXJlVmFsdWUgPSBzb2FwX3MyYmFzZTY0KHNvYXAsIHNpZywgTlVMTCwgc2lnbGVuKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKgorQGZuIGludCBzb2FwX3dzc2VfdmVyaWZ5X1NpZ25hdHVyZVZhbHVlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgYWxnLCBjb25zdCB2b2lkICprZXksIGludCBrZXlsZW4pCitAYnJpZWYgVmVyaWZpZXMgdGhlIFNpZ25hdHVyZVZhbHVlIG9mIGEgU2lnbmVkSW5mbyBlbGVtZW50LgorQHBhcmFtIHNvYXAgY29udGV4dAorQHBhcmFtW2luXSBhbGcgaXMgU09BUF9TTURfSE1BQ19TSEExLCBTT0FQX1NNRF9WUkZZX0RTQV9TSEExLCBvciBTT0FQX1NNRF9WUkZZX1JTQV9TSEExIGRldGVybWluZWQgYnkgdGhlIFNpZ25lZEluZm8vU2lnbmF0dXJlTWV0aG9kCitAcGFyYW1baW5dIGtleSB0byB1c2UgdG8gdmVyaWZ5IChITUFDIG9yIEVWUF9QS0VZKQorQHBhcmFtW2luXSBrZXlsZW4gbGVuZ3RoIG9mIEhNQUMga2V5CitAcmV0dXJuIFNPQVBfT0ssIFNPQVBfRU9NLCBvciBmYXVsdAorCitUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciB0aGUgU2lnbmVkSW5mbyBlbGVtZW50IGluIHRoZSBzb2FwLT5kb20gRE9NIHRyZWUgdG8KK3ZlcmlmeSB0aGUgc2lnbmF0dXJlIGluIHRoZSBTaWduYXR1cmVWYWx1ZSBlbGVtZW50LiBVc2luZyB0aGUgRE9NIGVuc3VyZXMgd2UKK3dpbGwgdmVyaWZ5IHRoZSBzaWduYXR1cmUgb2YgYSBTaWduZWRJbmZvIGFzIGl0IHdhcyBleGFjdGx5IHJlY2VpdmVkIGJ5IHRoZQorcGFyc2VyLCBieSB1c2luZyB0aGUgLURXSVRIX0RPTSBjb21waWxlIGZsYWcgYW5kIFNPQVBfWE1MX0RPTSBydW50aW1lIGZsYWcuIElmCit0aGVyZSBpcyBubyBET00sIGl0IHZlcmlmaWVzIHRoZSBzaWduYXR1cmUgb2YgdGhlIGRlc2VyaWFsaXplZCBTaWduZWRJbmZvCitlbGVtZW50IGluIHRoZSBTT0FQIEhlYWRlci4gSG93ZXZlciwgc2VyaWFsaXppbmcgZGVzZXJpYWxpemVkIGRhdGEgbWF5IGNoYW5nZQordGhlIG9jdGV0IHN0cmVhbSB0aGF0IHdhcyBzaWduZWQsIHVubGVzcyB3ZSdyZSB1c2luZyBnU09BUCBhcyBwcm9kdWNlcnMgYW5kCitjb25zdW1lcnMgKHdpdGggdGhlIFNPQVBfWE1MX0lOREVOVCBmbGFnIHJlc2V0KS4KKyovCitpbnQKK3NvYXBfd3NzZV92ZXJpZnlfU2lnbmF0dXJlVmFsdWUoc3RydWN0IHNvYXAgKnNvYXAsIGludCBhbGcsIGNvbnN0IHZvaWQgKmtleSwgaW50IGtleWxlbikKK3sgZHNfX1NpZ25hdHVyZVR5cGUgKnNpZ25hdHVyZSA9IHNvYXBfd3NzZV9TaWduYXR1cmUoc29hcCk7CisgIERCR0ZVTjEoInNvYXBfd3NzZV92ZXJpZnlfU2lnbmF0dXJlVmFsdWUiLCAiYWxnPSVkIiwgYWxnKTsKKyAgLyogYWx3YXlzIG5lZWQgYW4gSE1BQyBzZWNyZXQga2V5IG9yIERTQS9SU0EgcHVibGljIGtleSB0byB2ZXJpZnkgKi8KKyAgaWYgKCFrZXkpCisgICAgcmV0dXJuIHNvYXBfd3NzZV9mYXVsdChzb2FwLCB3c3NlMl9fU2VjdXJpdHlUb2tlblVuYXZhaWxhYmxlLCBOVUxMKTsKKyAgLyogdmVyaWZ5IHRoZSBTaWduZWRJbmZvIGVsZW1lbnQgd2l0aCB0aGUgU2lnbmF0dXJlVmFsdWUgZWxlbWVudCAqLworICBpZiAoc2lnbmF0dXJlCisgICAmJiBzaWduYXR1cmUtPlNpZ25lZEluZm8KKyAgICYmIHNpZ25hdHVyZS0+U2lnbmF0dXJlVmFsdWUpCisgIHsgY29uc3QgY2hhciAqc2lnOworICAgIGludCBtZXRob2QsIHNpZ2xlbjsKKyAgICAvKiBjaGVjayB0aGF0IHdlIGFyZSB1c2luZyB0aGUgaW50ZW5kZWQgc2lnbmF0dXJlIGFsZ29yaXRobSAqLworICAgIGlmIChzb2FwX3dzc2VfZ2V0X1NpZ25lZEluZm9fU2lnbmF0dXJlTWV0aG9kKHNvYXAsICZtZXRob2QpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmIChhbGcgIT0gbWV0aG9kKQorICAgICAgcmV0dXJuIHNvYXBfd3NzZV9mYXVsdChzb2FwLCB3c3NlMl9fRmFpbGVkQ2hlY2ssICJJbmNvcnJlY3Qgc2lnbmF0dXJlIGFsZ29yaXRobSIpOworICAgIC8qIHJldHJpZXZlIHRoZSBzaWduYXR1cmUgKi8KKyAgICBzaWcgPSBzb2FwX2Jhc2U2NDJzKHNvYXAsIHNpZ25hdHVyZS0+U2lnbmF0dXJlVmFsdWUsIE5VTEwsIDAsICZzaWdsZW4pOworICAgIC8qIHNlYXJjaCB0aGUgRE9NIGZvciBTaWduZWRJbmZvICovCisgICAgaWYgKHNvYXAtPmRvbSkKKyAgICB7IHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICplbHQ7CisgICAgICAvKiB0cmF2ZXJzZSB0aGUgRE9NIHdoaWxlIHNlYXJjaGluZyBmb3IgU2lnbmVkSW5mbyBpbiB0aGUgZHMgbmFtZXNwYWNlICovCisgICAgICBmb3IgKGVsdCA9IHNvYXAtPmRvbTsgZWx0OyBlbHQgPSBzb2FwX2RvbV9uZXh0X2VsZW1lbnQoZWx0KSkKKyAgICAgIHsgaWYgKGVsdC0+bmFtZQorICAgICAgICAgJiYgZWx0LT5uc3RyCisJICYmICFzdHJjbXAoZWx0LT5uc3RyLCBkc19VUkkpCisJICYmICghc3RyY21wKGVsdC0+bmFtZSwgIlNpZ25lZEluZm8iKSB8fCAhc29hcF90YWdfY21wKGVsdC0+bmFtZSwgIio6U2lnbmVkSW5mbyIpKSkKKwkgIGJyZWFrOworICAgICAgfQorICAgICAgLyogZm91bmQgaXQ/ICovCisgICAgICBpZiAoZWx0KQorICAgICAgeyAvKiBvdXRwdXQgdGhlIERPTSAiYXMgaXMiICovCisJc29hcC0+bW9kZSAmPSB+U09BUF9YTUxfQ0FOT05JQ0FMOworCXNvYXAtPm1vZGUgfD0gU09BUF9ET01fQVNJUzsKKwkvKiBzaG91bGQgbm90IGluY2x1ZGUgbGVhZGluZyB3aGl0ZXNwYWNlIGluIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gKi8KKwllbHQtPmhlYWQgPSBOVUxMOworICAgICAgICAvKiB1c2Ugc21kZXZwIGVuZ2luZSB0byB2ZXJpZnkgU2lnbmVkSW5mbyAqLworICAgICAgICBpZiAoc29hcF9zbWRfYmVnaW4oc29hcCwgYWxnLCBrZXksIGtleWxlbikKKyAgICAgICAgIHx8IHNvYXBfb3V0X3hzZF9fYW55VHlwZShzb2FwLCBOVUxMLCAwLCBlbHQsIE5VTEwpCisgICAgICAgICB8fCBzb2FwX3NtZF9lbmQoc29hcCwgKGNoYXIqKXNpZywgJnNpZ2xlbikpCisgICAgICAgICAgcmV0dXJuIHNvYXBfd3NzZV9mYXVsdChzb2FwLCB3c3NlMl9fRmFpbGVkQ2hlY2ssIE5VTEwpOworICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgaW50IGVyciA9IFNPQVBfT0s7CisgICAgICBjb25zdCBjaGFyICpjMTRuZXhjbHVkZTsKKyAgICAgIHNvYXBfbW9kZSBtb2RlOworICAgICAgLyogc2VyaWFsaXplIHRoZSBTaWduZWRJbmZvIGVsZW1lbnQgYXMgaXQgYXBwZWFyZWQgaW4gdGhlIFNPQVAgSGVhZGVyICovCisgICAgICBzb2FwLT5sZXZlbCA9IDQ7CisgICAgICBjMTRuZXhjbHVkZSA9IHNvYXAtPmMxNG5leGNsdWRlOworICAgICAgc29hcC0+YzE0bmV4Y2x1ZGUgPSAiZHMiOworICAgICAgbW9kZSA9IHNvYXAtPm1vZGU7CisgICAgICBpZiAoc2lnbmF0dXJlLT5TaWduZWRJbmZvLT5DYW5vbmljYWxpemF0aW9uTWV0aG9kKQorICAgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfWE1MX0NBTk9OSUNBTDsKKyAgICAgIGVsc2UKKyAgICAgICAgc29hcC0+bW9kZSAmPSB+U09BUF9YTUxfQ0FOT05JQ0FMOworICAgICAgaWYgKHNvYXBfc21kX2JlZ2luKHNvYXAsIGFsZywga2V5LCBrZXlsZW4pCisgICAgICAgfHwgc29hcF9vdXRfZHNfX1NpZ25lZEluZm9UeXBlKHNvYXAsICJkczpTaWduZWRJbmZvIiwgMCwgc2lnbmF0dXJlLT5TaWduZWRJbmZvLCBOVUxMKQorICAgICAgIHx8IHNvYXBfc21kX2VuZChzb2FwLCAoY2hhciopc2lnLCAmc2lnbGVuKSkKKyAgICAgICAgZXJyID0gc29hcC0+ZXJyb3I7CisgICAgICBzb2FwLT5tb2RlID0gbW9kZTsKKyAgICAgIHNvYXAtPmMxNG5leGNsdWRlID0gYzE0bmV4Y2x1ZGU7CisgICAgICBpZiAoZXJyKQorICAgICAgICByZXR1cm4gc29hcF93c3NlX2ZhdWx0KHNvYXAsIHdzc2UyX19GYWlsZWRDaGVjaywgTlVMTCk7CisgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXBfd3NzZV9mYXVsdChzb2FwLCB3c3NlMl9fRmFpbGVkQ2hlY2ssICJTaWduYXR1cmUgcmVxdWlyZWQiKTsKK30KKworLyoqCitAZm4gaW50IHNvYXBfd3NzZV92ZXJpZnlfU2lnbmVkSW5mbyhzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZiBWZXJpZmllcyB0aGUgZGlnZXN0IHZhbHVlcyBvZiB0aGUgWE1MIGVsZW1lbnRzIHJlZmVyZW5jZWQgYnkgdGhlIFNpZ25lZEluZm8gUmVmZXJlbmNlcy4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0ByZXR1cm4gU09BUF9PSyBvciBmYXVsdAorCitUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciB0aGUgU2lnbmVkSW5mbyBlbGVtZW50IGluIHRoZSBzb2FwLT5kb20gRE9NIHRyZWUgdG8KK3ZlcmlmeSB0aGUgZGlnZXN0cyBjb250YWluZWQgdGhlcmVpbi4gVXNpbmcgdGhlIERPTSBlbnN1cmVzIHdlIHdpbGwgdmVyaWZ5IHRoZQorZGlnZXN0cyBvZiB0aGUgbG9jYWxseSBzaWduZWQgZWxlbWVudHMgYXMgdGhleSB3ZXJlIGV4YWN0bHkgcmVjZWl2ZWQgYnkgdGhlCitwYXJzZXIsIGJ5IHVzaW5nIHRoZSAtRFdJVEhfRE9NIGNvbXBpbGUgZmxhZyBhbmQgU09BUF9YTUxfRE9NIHJ1bnRpbWUgZmxhZy4gSWYKK3RoZXJlIGlzIG5vIERPTSwgdGhlIGZ1bmN0aW9uIGZhaWxzLgorKi8KK2ludAorc29hcF93c3NlX3ZlcmlmeV9TaWduZWRJbmZvKHN0cnVjdCBzb2FwICpzb2FwKQoreyBkc19fU2lnbmVkSW5mb1R5cGUgKnNpZ25lZEluZm8gPSBzb2FwX3dzc2VfU2lnbmVkSW5mbyhzb2FwKTsKKyAgREJHRlVOKCJzb2FwX3dzc2VfdmVyaWZ5X1NpZ25lZEluZm8iKTsKKyAgaWYgKHNpZ25lZEluZm8pCisgIHsgaW50IGk7CisgICAgLyogbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSByZWZlcmVuY2UgZWxlbWVudCAqLworICAgIGlmIChzaWduZWRJbmZvLT5fX3NpemVSZWZlcmVuY2UgPT0gMCkKKyAgICAgIHJldHVybiBzb2FwX3dzc2VfZmF1bHQoc29hcCwgd3NzZTJfX0ludmFsaWRTZWN1cml0eSwgIk5vIFNpZ25lZEluZm8vUmVmZXJlbmNlIik7CisgICAgLyogZm9yIGVhY2ggcmVmZXJlbmNlIGVsZW1lbnQsIGNoZWNrIHRoZSBkaWdlc3QgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgc2lnbmVkSW5mby0+X19zaXplUmVmZXJlbmNlOyBpKyspCisgICAgeyBkc19fUmVmZXJlbmNlVHlwZSAqcmVmZXJlbmNlID0gc2lnbmVkSW5mby0+UmVmZXJlbmNlW2ldOworICAgICAgLyogcmVmZXJlbmNlIGVsZW1lbnQgaXMgY29tcGxldGU/ICovCisgICAgICBpZiAoIXJlZmVyZW5jZS0+VVJJCisgICAgICAgfHwgIXJlZmVyZW5jZS0+RGlnZXN0TWV0aG9kCisgICAgICAgfHwgIXJlZmVyZW5jZS0+RGlnZXN0TWV0aG9kLT5BbGdvcml0aG0KKyAgICAgICB8fCAhcmVmZXJlbmNlLT5EaWdlc3RWYWx1ZSkKKyAgICAgICAgcmV0dXJuIHNvYXBfd3NzZV9mYXVsdChzb2FwLCB3c3NlMl9fSW52YWxpZFNlY3VyaXR5LCAiSW5jb21wbGV0ZSBTaWduZWRJbmZvL1JlZmVyZW5jZSIpOworICAgICAgLyogcmVmZXJlbmNlIGlzIGxvY2FsPyAqLworICAgICAgaWYgKCpyZWZlcmVuY2UtPlVSSSA9PSAnIycpCisgICAgICB7IGludCBhbGc7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgaGFzaFtTT0FQX1NNRF9NQVhfU0laRV07CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVmVyaWZ5aW5nIGRpZ2VzdCBvZiBsb2NhbGx5IHJlZmVyZW5jZWQgZGF0YSAlc1xuIiwgcmVmZXJlbmNlLT5VUkkpKTsKKwkvKiBkaWdlc3QgYWxnb3JpdGhtIHNob3VsZCBiZSBTSEExICovCisgICAgICAgIGlmICghc3RyY21wKHJlZmVyZW5jZS0+RGlnZXN0TWV0aG9kLT5BbGdvcml0aG0sIGRzX3NoYTFVUkkpKQorICAgICAgICAgIGFsZyA9IFNPQVBfU01EX0RHU1RfU0hBMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiBzb2FwX3dzc2VfZmF1bHQoc29hcCwgd3NzZTJfX1Vuc3VwcG9ydGVkQWxnb3JpdGhtLCByZWZlcmVuY2UtPkRpZ2VzdE1ldGhvZC0+QWxnb3JpdGhtKTsKKwkvKiBpZiByZWZlcmVuY2UgaGFzIGEgdHJhbnNmb3JtLCBpdCBzaG91bGQgYmUgYW4gZXhjLWMxNG4gdHJhbnNmb3JtICovCisgICAgICAgIGlmIChyZWZlcmVuY2UtPlRyYW5zZm9ybXMKKwkgJiYgKHJlZmVyZW5jZS0+VHJhbnNmb3Jtcy0+X19zaXplVHJhbnNmb3JtICE9IDEKKwkgIHx8ICFyZWZlcmVuY2UtPlRyYW5zZm9ybXMtPlRyYW5zZm9ybVswXS5BbGdvcml0aG0KKwkgIHx8IHN0cmNtcChyZWZlcmVuY2UtPlRyYW5zZm9ybXMtPlRyYW5zZm9ybVswXS5BbGdvcml0aG0sIGMxNG5fVVJJKSkpCisgICAgICAgICAgcmV0dXJuIHNvYXBfd3NzZV9mYXVsdChzb2FwLCB3c3NlMl9fVW5zdXBwb3J0ZWRBbGdvcml0aG0sIHJlZmVyZW5jZS0+VHJhbnNmb3Jtcy0+VHJhbnNmb3JtWzBdLkFsZ29yaXRobSk7CisJLyogY29udmVydCBiYXNlNjQgZGlnZXN0IHRvIGJpbmFyeSAqLworCXNvYXBfYmFzZTY0MnMoc29hcCwgcmVmZXJlbmNlLT5EaWdlc3RWYWx1ZSwgaGFzaCwgU09BUF9TTURfTUFYX1NJWkUsIE5VTEwpOworCS8qIHZlcmlmeSB0aGUgZGlnZXN0IG9mIGEgbG9jYWxseSBzaWduZWQgZWxlbWVudCAqLworICAgICAgICBpZiAoc29hcF93c3NlX3ZlcmlmeV9kaWdlc3Qoc29hcCwgYWxnLCByZWZlcmVuY2UtPlVSSSArIDEsIGhhc2gpKQorCSAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICByZXR1cm4gc29hcF93c3NlX2ZhdWx0KHNvYXAsIHdzc2UyX19JbnZhbGlkU2VjdXJpdHksICJObyBTaWduZWRJbmZvIik7Cit9CisKKy8qKgorQGZuIGludCBzb2FwX3dzc2VfdmVyaWZ5X2RpZ2VzdChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGFsZywgY29uc3QgY2hhciAqaWQsIHVuc2lnbmVkIGNoYXIgaGFzaFtTT0FQX1NNRF9NQVhfU0laRV0pCitAYnJpZWYgVmVyaWZpZXMgdGhlIGRpZ2VzdCB2YWx1ZSBvZiBhbiBYTUwgZWxlbWVudCByZWZlcmVuY2VkIGJ5IGlkIGFnYWluc3QgdGhlIGhhc2guCitAcGFyYW0gc29hcCBjb250ZXh0CitAcGFyYW1baW5dIGFsZyBkaWdlc3QgYWxnb3JpdGhtCitAcGFyYW1baW5dIGlkIHN0cmluZyBvZiB0aGUgWE1MIGVsZW1lbnQgdG8gdmVyaWZ5CitAcGFyYW1baW5dIGhhc2ggZGlnZXN0IHZhbHVlIHRvIHZlcmlmeSBhZ2FpbnN0CitAcmV0dXJuIFNPQVBfT0sgb3IgZmF1bHQKKyovCitpbnQKK3NvYXBfd3NzZV92ZXJpZnlfZGlnZXN0KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgYWxnLCBjb25zdCBjaGFyICppZCwgdW5zaWduZWQgY2hhciBoYXNoW1NPQVBfU01EX01BWF9TSVpFXSkKK3sgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKmVsdDsKKyAgREJHRlVOMSgic29hcF93c3NlX3ZlcmlmeV9kaWdlc3QiLCAiYWxnPSVkIiwgYWxnKTsKKyAgLyogdHJhdmVyc2UgdGhlIERPTSB0byBmaW5kIHRoZSBlbGVtZW50IHdpdGggbWF0Y2hpbmcgd3N1OklkIG9yIGRzOklkICovCisgIGZvciAoZWx0ID0gc29hcC0+ZG9tOyBlbHQ7IGVsdCA9IHNvYXBfZG9tX25leHRfZWxlbWVudChlbHQpKQorICB7IHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgKmF0dDsKKyAgICBmb3IgKGF0dCA9IGVsdC0+YXR0czsgYXR0OyBhdHQgPSBhdHQtPm5leHQpCisgICAgeyAvKiBjaGVjayBhdHRyaWJ1dGUgKi8KKyAgICAgIGlmIChhdHQtPm5hbWUKKyAgICAgICAmJiBhdHQtPm5zdHIKKyAgICAgICAmJiAoIXN0cmNtcChhdHQtPm5zdHIsIHdzdV9VUkkpIHx8ICFzdHJjbXAoYXR0LT5uc3RyLCBkc19VUkkpKQorICAgICAgICYmICghc3RyY21wKGF0dC0+bmFtZSwgIklkIikgfHwgIXNvYXBfdGFnX2NtcChhdHQtPm5hbWUsICIqOklkIikpKQorICAgICAgeyAvKiBmb3VuZCBhIG1hdGNoLCBjb21wYXJlIGF0dHJpYnV0ZSB2YWx1ZSB3aXRoIGlkICovCisgICAgICAgIGlmIChhdHQtPmRhdGEgJiYgIXN0cmNtcChhdHQtPmRhdGEsIGlkKSkKKyAgICAgICAgeyB1bnNpZ25lZCBjaGFyIEhBW1NPQVBfU01EX1NIQTFfU0laRV07CisgICAgICAgICAgaW50IGxlbjsKKwkgIC8qIGNvbXB1dGUgZGlnZXN0IG92ZXIgRE9NIG5vZGUgImFzIGlzIiAqLworCSAgc29hcC0+bW9kZSAmPSB+U09BUF9YTUxfQ0FOT05JQ0FMOworCSAgc29hcC0+bW9kZSB8PSBTT0FQX0RPTV9BU0lTOworCSAgLyogZG8gbm90IGhhc2ggbGVhZGluZyB3aGl0ZXNwYWNlICovCisJICBlbHQtPmhlYWQgPSBOVUxMOworICAgICAgICAgIC8qIGNvbXB1dGUgZGlnZXN0ICovCisJICBpZiAoc29hcF9zbWRfYmVnaW4oc29hcCwgYWxnLCBOVUxMLCAwKQorCSAgIHx8IHNvYXBfb3V0X3hzZF9fYW55VHlwZShzb2FwLCBOVUxMLCAwLCBlbHQsIE5VTEwpCisJICAgfHwgc29hcF9zbWRfZW5kKHNvYXAsIEhBLCAmbGVuKSkKKyAgICAgICAgICAgIHJldHVybiBzb2FwX3dzc2VfZmF1bHQoc29hcCwgd3NzZTJfX0ZhaWxlZENoZWNrLCAiQ291bGQgbm90IGNvbXB1dGUgZGlnZXN0Iik7CisJICAvKiBjb21wYXJlIGRpZ2VzdHMsIHN1Y2Nlc3MgaWYgaWRlbnRpY2FsICovCisJICBpZiAoIW1lbWNtcChoYXNoLCBIQSwgKHNpemVfdClsZW4pKQorCSAgICByZXR1cm4gU09BUF9PSzsKKyAgICAgICAgICByZXR1cm4gc29hcF93c3NlX2ZhdWx0KHNvYXAsIHdzc2UyX19GYWlsZWRDaGVjaywgIlNpZ25lZEluZm8gZGlnZXN0IG1pc21hdGNoIik7CisJfQorICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gc29hcF93c3NlX2ZhdWx0KHNvYXAsIHdzc2UyX19GYWlsZWRDaGVjaywgIlNpZ25lZEluZm8gcmVmZXJlbmNlIHRhcmdldCBub3QgZm91bmQiKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKiBkczpTaWduYXR1cmUvS2V5SW5mbworICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorQGZuIGRzX19LZXlJbmZvVHlwZSogc29hcF93c3NlX2FkZF9LZXlJbmZvKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmIEFkZHMgS2V5SW5mbyBlbGVtZW50LgorQHBhcmFtIHNvYXAgY29udGV4dAorQHJldHVybiBkc19fS2V5SW5mbyBvYmplY3QKKyovCitzdHJ1Y3QgZHNfX0tleUluZm9UeXBlKgorc29hcF93c3NlX2FkZF9LZXlJbmZvKHN0cnVjdCBzb2FwICpzb2FwKQoreyBkc19fU2lnbmF0dXJlVHlwZSAqc2lnbmF0dXJlID0gc29hcF93c3NlX2FkZF9TaWduYXR1cmUoc29hcCk7CisgIGlmICghc2lnbmF0dXJlLT5LZXlJbmZvKQorICAgIHNpZ25hdHVyZS0+S2V5SW5mbyA9IChkc19fS2V5SW5mb1R5cGUqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihkc19fS2V5SW5mb1R5cGUpKTsKKyAgc29hcF9kZWZhdWx0X2RzX19LZXlJbmZvVHlwZShzb2FwLCBzaWduYXR1cmUtPktleUluZm8pOworICByZXR1cm4gc2lnbmF0dXJlLT5LZXlJbmZvOworfQorCisvKioKK0BmbiBkc19fS2V5SW5mb1R5cGUqIHNvYXBfd3NzZV9LZXlJbmZvKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmIFJldHVybnMgS2V5SW5mbyBlbGVtZW50IGlmIHByZXNlbnQuCitAcGFyYW0gc29hcCBjb250ZXh0CitAcmV0dXJuIGRzX19LZXlJbmZvIG9iamVjdCBvciBOVUxMCisqLworc3RydWN0IGRzX19LZXlJbmZvVHlwZSoKK3NvYXBfd3NzZV9LZXlJbmZvKHN0cnVjdCBzb2FwICpzb2FwKQoreyBkc19fU2lnbmF0dXJlVHlwZSAqc2lnbmF0dXJlID0gc29hcF93c3NlX1NpZ25hdHVyZShzb2FwKTsKKyAgaWYgKHNpZ25hdHVyZSkKKyAgICByZXR1cm4gc2lnbmF0dXJlLT5LZXlJbmZvOworICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKiBkczpTaWduYXR1cmUvS2V5SW5mby9LZXlOYW1lCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCitAZm4gaW50IHNvYXBfd3NzZV9hZGRfS2V5SW5mb19LZXlOYW1lKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lKQorQGJyaWVmIEFkZHMgS2V5TmFtZSBlbGVtZW50LgorQHBhcmFtIHNvYXAgY29udGV4dAorQHBhcmFtW2luXSBuYW1lIHN0cmluZyBvZiB0aGUgS2V5TmFtZQorQHJldHVybiBTT0FQX09LCisKK05vdGU6IHRoZSByZWNvbW1lbmRlZCBtZXRob2QgdG8gYWRkIEtleSBpbmZvcm1hdGlvbiBpcyB0byB1dGlsaXplIEtleUlkZW50aWZpZXIKK2luc3RlYWQgb2YgS2V5TmFtZS4gQSBLZXlOYW1lIGlzIHVzZWZ1bCBtYWlubHkgZm9yIGludGVybmFsIHVzZS4KKyovCitpbnQKK3NvYXBfd3NzZV9hZGRfS2V5SW5mb19LZXlOYW1lKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lKQoreyBkc19fS2V5SW5mb1R5cGUgKmtleUluZm8gPSBzb2FwX3dzc2VfYWRkX0tleUluZm8oc29hcCk7CisgIERCR0ZVTjEoInNvYXBfd3NzZV9hZGRfS2V5SW5mb19LZXlOYW1lIiwgIm5hbWU9JXMiLCBuYW1lKTsKKyAgLyogcG9wdWxhdGUgdGhlIEtleU5hbWUgZWxlbWVudCAqLworICBrZXlJbmZvLT5LZXlOYW1lID0gc29hcF9zdHJkdXAoc29hcCwgbmFtZSk7CisgIHJldHVybiBTT0FQX09LOworfQorCisvKioKK0BmbiBpbnQgc29hcF93c3NlX2dldF9LZXlJbmZvX0tleU5hbWUoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYgUmV0dXJucyBLZXlOYW1lIGVsZW1lbnQgaWYgcHJlc2VudC4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0ByZXR1cm4gc3RyaW5nIG9yIE5VTEwKKyovCitjb25zdCBjaGFyKgorc29hcF93c3NlX2dldF9LZXlJbmZvX0tleU5hbWUoc3RydWN0IHNvYXAgKnNvYXApCit7IGRzX19LZXlJbmZvVHlwZSAqa2V5SW5mbyA9IHNvYXBfd3NzZV9LZXlJbmZvKHNvYXApOworICBEQkdGVU4oInNvYXBfd3NzZV9nZXRfS2V5SW5mb19LZXlOYW1lIik7CisgIGlmICgha2V5SW5mbykKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIGtleUluZm8tPktleU5hbWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICogZHM6U2lnbmF0dXJlL0tleUluZm8vd3NzZTpTZWN1cml0eVRva2VuUmVmZXJlbmNlL1JlZmVyZW5jZS9AVVJJCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCitAZm4gaW50IHNvYXBfd3NzZV9hZGRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlVVJJKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpVUkksIGNvbnN0IGNoYXIgKnZhbHVlVHlwZSkKK0BicmllZiBBZGRzIEtleUluZm8gZWxlbWVudCB3aXRoIFNlY3VyaXR5VG9rZW5SZWZlcmVuY2UgVVJJLgorQHBhcmFtIHNvYXAgY29udGV4dAorQHBhcmFtW2luXSBVUkkgc3RyaW5nIHJlZmVyZW5jaW5nIGEgc2VjdXJpdHkgdG9rZW4KK0BwYXJhbVtpbl0gdmFsdWVUeXBlIHN0cmluZyBvciBOVUxMCitAcmV0dXJuIFNPQVBfT0sKKyovCitpbnQKK3NvYXBfd3NzZV9hZGRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlVVJJKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpVUkksIGNvbnN0IGNoYXIgKnZhbHVlVHlwZSkKK3sgZHNfX0tleUluZm9UeXBlICprZXlJbmZvID0gc29hcF93c3NlX2FkZF9LZXlJbmZvKHNvYXApOworICBEQkdGVU4yKCJzb2FwX3dzc2VfYWRkX0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZVVSSSIsICJVUkk9JXMiLCBVUkk/VVJJOiIiLCAidmFsdWVUeXBlPSVzIiwgdmFsdWVUeXBlP3ZhbHVlVHlwZToiIik7CisgIC8qIGFsbG9jYXRlIFNlY3VyaXR5VG9rZW5SZWZlcmVuY2UgZWxlbWVudCBpZiB3ZSBkb24ndCBoYXZlIG9uZSBhbHJlYWR5ICovCisgIGlmICgha2V5SW5mby0+d3NzZTJfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2UpCisgICAga2V5SW5mby0+d3NzZTJfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2UgPSAoX3dzc2UyX19TZWN1cml0eVRva2VuUmVmZXJlbmNlKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2YoX3dzc2UyX19TZWN1cml0eVRva2VuUmVmZXJlbmNlKSk7CisgIHNvYXBfZGVmYXVsdF9fd3NzZTJfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2Uoc29hcCwga2V5SW5mby0+d3NzZTJfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2UpOworICAvKiBhbGxvY2F0ZSBSZWZlcmVuY2UgZWxlbWVudCAqLworICBrZXlJbmZvLT53c3NlMl9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZS0+UmVmZXJlbmNlID0gKF93c3NlMl9fUmVmZXJlbmNlKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2YoX3dzc2UyX19SZWZlcmVuY2UpKTsKKyAgc29hcF9kZWZhdWx0X193c3NlMl9fUmVmZXJlbmNlKHNvYXAsIGtleUluZm8tPndzc2UyX19TZWN1cml0eVRva2VuUmVmZXJlbmNlLT5SZWZlcmVuY2UpOworICAvKiBwb3B1bGF0ZSB0aGUgUmVmZXJlbmNlIGVsZW1lbnQgKi8KKyAga2V5SW5mby0+d3NzZTJfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2UtPlJlZmVyZW5jZS0+VVJJID0gc29hcF9zdHJkdXAoc29hcCwgVVJJKTsKKyAga2V5SW5mby0+d3NzZTJfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2UtPlJlZmVyZW5jZS0+VmFsdWVUeXBlID0gc29hcF9zdHJkdXAoc29hcCwgdmFsdWVUeXBlKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKgorQGZuIGludCBzb2FwX3dzc2VfYWRkX0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZVg1MDkoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKlVSSSkKK0BicmllZiBBZGRzIEtleUluZm8gZWxlbWVudCB3aXRoIFNlY3VyaXR5VG9rZW5SZWZlcmVuY2UgVVJJIHRvIGFuIFg1MDkgY2VydC4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0BwYXJhbVtpbl0gVVJJIHN0cmluZyByZWZlcmVuY2luZyBhbiBYNTA5IGNlcnRpZmljYXRlCitAcmV0dXJuIFNPQVBfT0sKKyovCitpbnQKK3NvYXBfd3NzZV9hZGRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlWDUwOShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqVVJJKQoreyByZXR1cm4gc29hcF93c3NlX2FkZF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VVUkkoc29hcCwgVVJJLCB3c3NlX1g1MDl2M1VSSSk7Cit9CisKKy8qKgorQGZuIGNvbnN0IGNoYXIqIHNvYXBfd3NzZV9nZXRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlVVJJKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmIFJldHVybnMgYSBTZWN1cml0eVRva2VuUmVmZXJlbmNlIFVSSSBpZiBwcmVzZW50LgorQHBhcmFtIHNvYXAgY29udGV4dAorQHJldHVybiBzdHJpbmcgb3IgTlVMTAorKi8KK2NvbnN0IGNoYXIqCitzb2FwX3dzc2VfZ2V0X0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZVVSSShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgZHNfX0tleUluZm9UeXBlICprZXlJbmZvID0gc29hcF93c3NlX0tleUluZm8oc29hcCk7CisgIGlmIChrZXlJbmZvCisgICAmJiBrZXlJbmZvLT53c3NlMl9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZQorICAgJiYga2V5SW5mby0+d3NzZTJfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2UtPlJlZmVyZW5jZSkKKyAgICByZXR1cm4ga2V5SW5mby0+d3NzZTJfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2UtPlJlZmVyZW5jZS0+VVJJOworICByZXR1cm4gTlVMTDsKK30KKworLyoqCitAZm4gWDUwOSogc29hcF93c3NlX2dldF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VYNTA5KHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmIFJldHVybnMgYSBYNTA5IGNlcnRpZmljYXRlIGlmIHByZXNlbnQgYXMgYSBCaW5hcnlTZWN1cml0eSB0b2tlbi4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0ByZXR1cm4gWDUwOSBvYmplY3Qgb3IgTlVMTCB3aXRoIHdzc2U6U2VjdXJpdHlUb2tlblVuYXZhaWxhYmxlIGZhdWx0CisqLworWDUwOSoKK3NvYXBfd3NzZV9nZXRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlWDUwOShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgY29uc3QgY2hhciAqVVJJID0gc29hcF93c3NlX2dldF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VVUkkoc29hcCk7CisgIERCR0ZVTigic29hcF93c3NlX2dldF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VYNTA5Iik7CisgIC8qIFRPRE86IGNhbid0IGh1cnQgdG8gZG91YmxlIGNoZWNrIFJlZmVyZW5jZS0+VmFsdWVUeXBlICovCisgIGlmIChVUkkgJiYgKlVSSSA9PSAnIycpCisgICAgcmV0dXJuIHNvYXBfd3NzZV9nZXRfQmluYXJ5U2VjdXJpdHlUb2tlblg1MDkoc29hcCwgVVJJICsgMSk7CisgIHJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqIGRzOlNpZ25hdHVyZS9LZXlJbmZvL3dzc2U6U2VjdXJpdHlUb2tlblJlZmVyZW5jZS9SZWZlcmVuY2UvS2V5SWRlbnRpZmllcgorICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorQGZuIGludCBzb2FwX3dzc2VfYWRkX0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZUtleUlkZW50aWZpZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICp2YWx1ZVR5cGUsIHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBzaXplKQorQGJyaWVmIEFkZHMgS2V5SW5mbyBlbGVtZW50IHdpdGggU2VjdXJpdHlUb2tlblJlZmVyZW5jZS9LZXlJZGVudGlmaWVyIGJpbmFyeSBkYXRhCitAcGFyYW0gc29hcCBjb250ZXh0CitAcGFyYW1baW5dIGlkIHN0cmluZyBmb3Igc2lnbmF0dXJlIHJlZmVyZW5jZQorQHBhcmFtW2luXSB2YWx1ZVR5cGUgc3RyaW5nCitAcGFyYW1baW5dIGRhdGEgYmluYXJ5IGRhdGEKK0BwYXJhbVtpbl0gc2l6ZSBvZiBiaW5hcnkgZGF0YQorQHJldHVybiBTT0FQX09LCisqLworaW50Citzb2FwX3dzc2VfYWRkX0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZUtleUlkZW50aWZpZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICp2YWx1ZVR5cGUsIHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBzaXplKQoreyBkc19fS2V5SW5mb1R5cGUgKmtleUluZm8gPSBzb2FwX3dzc2VfYWRkX0tleUluZm8oc29hcCk7CisgIERCR0ZVTjIoInNvYXBfd3NzZV9hZGRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlS2V5SWRlbnRpZmllciIsICJpZD0lcyIsIGlkP2lkOiIiLCAidmFsdWVUeXBlPSVzIiwgdmFsdWVUeXBlP3ZhbHVlVHlwZToiIik7CisgIC8qIGFsbG9jYXRlIFNlY3VyaXR5VG9rZW5SZWZlcmVuY2UgaWYgd2UgZG9uJ3QgaGF2ZSBvbmUgYWxyZWFkeSAqLworICBpZiAoIWtleUluZm8tPndzc2UyX19TZWN1cml0eVRva2VuUmVmZXJlbmNlKQorICAgIGtleUluZm8tPndzc2UyX19TZWN1cml0eVRva2VuUmVmZXJlbmNlID0gKF93c3NlMl9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZSopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKF93c3NlMl9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZSkpOworICBzb2FwX2RlZmF1bHRfX3dzc2UyX19TZWN1cml0eVRva2VuUmVmZXJlbmNlKHNvYXAsIGtleUluZm8tPndzc2UyX19TZWN1cml0eVRva2VuUmVmZXJlbmNlKTsKKyAgLyogYWxsb2NhdGUgS2V5SWRlbnRpZmllciAqLworICBrZXlJbmZvLT53c3NlMl9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZS0+S2V5SWRlbnRpZmllciA9IChfd3NzZTJfX0tleUlkZW50aWZpZXIqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihfd3NzZTJfX0tleUlkZW50aWZpZXIpKTsKKyAgc29hcF9kZWZhdWx0X193c3NlMl9fS2V5SWRlbnRpZmllcihzb2FwLCBrZXlJbmZvLT53c3NlMl9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZS0+S2V5SWRlbnRpZmllcik7CisgIC8qIHBvcHVsYXRlIEtleUlkZW50aWZpZXIgKi8KKyAga2V5SW5mby0+d3NzZTJfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2UtPktleUlkZW50aWZpZXItPndzdV9fSWQgPSBzb2FwX3N0cmR1cChzb2FwLCBpZCk7CisgIGtleUluZm8tPndzc2UyX19TZWN1cml0eVRva2VuUmVmZXJlbmNlLT5LZXlJZGVudGlmaWVyLT5WYWx1ZVR5cGUgPSBzb2FwX3N0cmR1cChzb2FwLCB2YWx1ZVR5cGUpOworICBrZXlJbmZvLT53c3NlMl9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZS0+S2V5SWRlbnRpZmllci0+RW5jb2RpbmdUeXBlID0gKGNoYXIqKXdzc2VfQmFzZTY0QmluYXJ5VVJJOworICBrZXlJbmZvLT53c3NlMl9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZS0+S2V5SWRlbnRpZmllci0+X19pdGVtID0gc29hcF9zMmJhc2U2NChzb2FwLCBkYXRhLCBOVUxMLCBzaXplKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKgorQGZuIGNvbnN0IGNoYXIqIHNvYXBfd3NzZV9nZXRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlS2V5SWRlbnRpZmllclZhbHVlVHlwZShzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZiBSZXR1cm5zIEtleUluZm8vU2VjdXJpdHlUb2tlblJlZmVyZW5jZS9LZXlJZGVudGlmaWVyL1ZhbHVlVHlwZSBpZiBwcmVzZW50CitAcGFyYW0gc29hcCBjb250ZXh0CitAcmV0dXJuIHN0cmluZyBvciBOVUxMCisqLworY29uc3QgY2hhcioKK3NvYXBfd3NzZV9nZXRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlS2V5SWRlbnRpZmllclZhbHVlVHlwZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgZHNfX0tleUluZm9UeXBlICprZXlJbmZvID0gc29hcF93c3NlX0tleUluZm8oc29hcCk7CisgIERCR0ZVTigic29hcF93c3NlX2dldF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VLZXlJZGVudGlmaWVyVmFsdWVUeXBlIik7CisgIGlmICgha2V5SW5mbworICAgfHwgIWtleUluZm8tPndzc2UyX19TZWN1cml0eVRva2VuUmVmZXJlbmNlCisgICB8fCAha2V5SW5mby0+d3NzZTJfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2UtPktleUlkZW50aWZpZXIpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBrZXlJbmZvLT53c3NlMl9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZS0+S2V5SWRlbnRpZmllci0+VmFsdWVUeXBlOworfQorCisvKioKK0BmbiBjb25zdCB1bnNpZ25lZCBjaGFyKiBzb2FwX3dzc2VfZ2V0X0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZUtleUlkZW50aWZpZXIoc3RydWN0IHNvYXAgKnNvYXAsIGludCAqc2l6ZSkKK0BicmllZiBSZXR1cm5zIEtleUluZm8vU2VjdXJpdHlUb2tlblJlZmVyZW5jZS9LZXlJZGVudGlmaWVyIGJpbmFyeSBkYXRhCitAcGFyYW0gc29hcCBjb250ZXh0CitAcGFyYW1bb3V0XSBzaXplIGlzIHNldCB0byB0aGUgc2l6ZSBvZiB0aGUgZGVjb2RlZCBkYXRhCitAcmV0dXJuIGRhdGEgb3IgTlVMTAorKi8KK2NvbnN0IHVuc2lnbmVkIGNoYXIqCitzb2FwX3dzc2VfZ2V0X0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZUtleUlkZW50aWZpZXIoc3RydWN0IHNvYXAgKnNvYXAsIGludCAqc2l6ZSkKK3sgZHNfX0tleUluZm9UeXBlICprZXlJbmZvID0gc29hcF93c3NlX0tleUluZm8oc29hcCk7CisgIERCR0ZVTigic29hcF93c3NlX2dldF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VLZXlJZGVudGlmaWVyIik7CisgIGlmICgha2V5SW5mbworICAgfHwgIWtleUluZm8tPndzc2UyX19TZWN1cml0eVRva2VuUmVmZXJlbmNlCisgICB8fCAha2V5SW5mby0+d3NzZTJfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2UtPktleUlkZW50aWZpZXIpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBzb2FwX2Jhc2U2NDJzKHNvYXAsIGtleUluZm8tPndzc2UyX19TZWN1cml0eVRva2VuUmVmZXJlbmNlLT5LZXlJZGVudGlmaWVyLT5fX2l0ZW0sIE5VTEwsIDAsIHNpemUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqIGRzOlNpZ25hdHVyZS9LZXlJbmZvL3dzc2U6U2VjdXJpdHlUb2tlblJlZmVyZW5jZS9SZWZlcmVuY2UvRW1iZWRkZWQKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKK0BmbiBpbnQgc29hcF93c3NlX2FkZF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VFbWJlZGRlZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKnZhbHVlVHlwZSkKK0BicmllZiBBZGRzIEtleUluZm8gZWxlbWVudCB3aXRoIEVtYmVkZGVkIFNlY3VyaXR5VG9rZW5SZWZlcmVuY2UuCitAcGFyYW0gc29hcCBjb250ZXh0CitAcGFyYW1baW5dIGlkIHN0cmluZyBmb3Igc2lnbmF0dXJlIHJlZmVyZW5jZQorQHBhcmFtW2luXSB2YWx1ZVR5cGUgc3RyaW5nCitAcmV0dXJuIFNPQVBfT0sKKworTm90ZTogdGhpcyBmdW5jdGlvbiBpcyB1bmRlciBjb25zdHJ1Y3Rpb24gYW5kIHRoZSByZXN1bHQgZGVwZW5kcyBvbiB1c2FnZQorc2NlbmFyaW9zIGRlcGxveWVkIGluIHByYWN0aWNlLgorKi8KK2ludAorc29hcF93c3NlX2FkZF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VFbWJlZGRlZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKnZhbHVlVHlwZSkKK3sgZHNfX0tleUluZm9UeXBlICprZXlJbmZvID0gc29hcF93c3NlX2FkZF9LZXlJbmZvKHNvYXApOworICBEQkdGVU4oInNvYXBfd3NzZV9nZXRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlRW1iZWRkZWQiKTsKKyAgLyogYWxsb2NhdGUgU2VjdXJpdHlUb2tlblJlZmVyZW5jZSBpZiB3ZSBkb24ndCBoYXZlIG9uZSBhbHJlYWR5ICovCisgIGlmICgha2V5SW5mby0+d3NzZTJfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2UpCisgICAga2V5SW5mby0+d3NzZTJfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2UgPSAoX3dzc2UyX19TZWN1cml0eVRva2VuUmVmZXJlbmNlKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2YoX3dzc2UyX19TZWN1cml0eVRva2VuUmVmZXJlbmNlKSk7CisgIHNvYXBfZGVmYXVsdF9fd3NzZTJfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2Uoc29hcCwga2V5SW5mby0+d3NzZTJfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2UpOworICAvKiBhbGxvY2F0ZSBFbWJlZGRlZCBlbGVtZW50ICovCisgIGtleUluZm8tPndzc2UyX19TZWN1cml0eVRva2VuUmVmZXJlbmNlLT5FbWJlZGRlZCA9IChfd3NzZTJfX0VtYmVkZGVkKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2YoX3dzc2UyX19FbWJlZGRlZCkpOworICBzb2FwX2RlZmF1bHRfX3dzc2UyX19FbWJlZGRlZChzb2FwLCBrZXlJbmZvLT53c3NlMl9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZS0+RW1iZWRkZWQpOworICAvKiBwb3B1bGF0ZSBFbWJlZGRlZCBlbGVtZW50ICovCisgIGtleUluZm8tPndzc2UyX19TZWN1cml0eVRva2VuUmVmZXJlbmNlLT5FbWJlZGRlZC0+d3N1X19JZCA9IHNvYXBfc3RyZHVwKHNvYXAsIGlkKTsKKyAga2V5SW5mby0+d3NzZTJfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2UtPkVtYmVkZGVkLT5WYWx1ZVR5cGUgPSBzb2FwX3N0cmR1cChzb2FwLCB2YWx1ZVR5cGUpOworICAvKiBUT0RPOiBBZGQgZW1iZWRkZWQgdG9rZW5zIGFuZCBhc3NlcnRpb25zLiBDb3VsZCB1c2UgRE9NIGhlcmU/CisgIGtleUluZm8tPndzc2UyX19TZWN1cml0eVRva2VuUmVmZXJlbmNlLT5FbWJlZGRlZC0+eHl6ID0gLi4uOworICAqLworICByZXR1cm4gU09BUF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKiBGYXVsdHMKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKK0BmbiBpbnQgc29hcF93c3NlX2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwLCB3c3NlMl9fRmF1bHRjb2RlRW51bSBmYXVsdCwgY29uc3QgY2hhciAqZGV0YWlsKQorQGJyaWVmIFNldHMgU09BUCBGYXVsdCAoc3ViKWNvZGUgZm9yIHNlcnZlciByZXNwb25zZS4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0BwYXJhbVtpbl0gZmF1bHQgaXMgb25lIG9mIHdzc2U6RmF1bHRjb2RlRW51bQorQHBhcmFtW2luXSBkZXRhaWwgc3RyaW5nIHdpdGggb3B0aW9uYWwgdGV4dCBtZXNzYWdlCitAcmV0dXJuIFNPQVBfRkFVTFQKKyovCitpbnQKK3NvYXBfd3NzZV9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCwgd3NzZTJfX0ZhdWx0Y29kZUVudW0gZmF1bHQsIGNvbnN0IGNoYXIgKmRldGFpbCkKK3sgY29uc3QgY2hhciAqY29kZSA9IHNvYXBfd3NzZTJfX0ZhdWx0Y29kZUVudW0ycyhzb2FwLCBmYXVsdCk7CisgIERCR0ZVTjIoInNvYXBfd3NzZV9mYXVsdCIsICJmYXVsdD0lcyIsIGNvZGU/Y29kZToiIiwgImRldGFpbD0lcyIsIGRldGFpbD9kZXRhaWw6IiIpOworICAvKiByZW1vdmUgaW5jb3JyZWN0IG9yIGluY29tcGxldGUgU2VjdXJpdHkgaGVhZGVyICovCisgIHNvYXBfd3NzZV9kZWxldGVfU2VjdXJpdHkoc29hcCk7CisgIC8qIHBvcHVsYXRlIHRoZSBTT0FQIEZhdWx0IGFzIHBlciBXUy1TZWN1cml0eSBzcGVjICovCisgIHN3aXRjaCAoZmF1bHQpCisgIHsgY2FzZSB3c3NlMl9fVW5zdXBwb3J0ZWRTZWN1cml0eVRva2VuOgorICAgICAgcmV0dXJuIHNvYXBfc2VuZGVyX2ZhdWx0X3N1YmNvZGUoc29hcCwgY29kZSwgIkFuIHVuc3VwcG9ydGVkIHRva2VuIHdhcyBwcm92aWRlZCIsIGRldGFpbCk7CisgICAgY2FzZSB3c3NlMl9fVW5zdXBwb3J0ZWRBbGdvcml0aG06CisgICAgICByZXR1cm4gc29hcF9zZW5kZXJfZmF1bHRfc3ViY29kZShzb2FwLCBjb2RlLCAiQW4gdW5zdXBwb3J0ZWQgc2lnbmF0dXJlIG9yIGVuY3J5cHRpb24gYWxnb3JpdGhtIHdhcyB1c2VkIiwgZGV0YWlsKTsKKyAgICBjYXNlIHdzc2UyX19JbnZhbGlkU2VjdXJpdHk6CisgICAgICByZXR1cm4gc29hcF9zZW5kZXJfZmF1bHRfc3ViY29kZShzb2FwLCBjb2RlLCAiQW4gZXJyb3Igd2FzIGRpc2NvdmVyZWQgcHJvY2Vzc2luZyB0aGUgPHdzc2U6U2VjdXJpdHk+IGhlYWRlciIsIGRldGFpbCk7CisgICAgY2FzZSB3c3NlMl9fSW52YWxpZFNlY3VyaXR5VG9rZW46CisgICAgICByZXR1cm4gc29hcF9zZW5kZXJfZmF1bHRfc3ViY29kZShzb2FwLCBjb2RlLCAiQW4gaW52YWxpZCBzZWN1cml0eSB0b2tlbiB3YXMgcHJvdmlkZWQiLCBkZXRhaWwpOworICAgIGNhc2Ugd3NzZTJfX0ZhaWxlZEF1dGhlbnRpY2F0aW9uOgorICAgICAgcmV0dXJuIHNvYXBfc2VuZGVyX2ZhdWx0X3N1YmNvZGUoc29hcCwgY29kZSwgIlRoZSBzZWN1cml0eSB0b2tlbiBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCBvciBhdXRob3JpemVkIiwgZGV0YWlsKTsKKyAgICBjYXNlIHdzc2UyX19GYWlsZWRDaGVjazoKKyAgICAgIHJldHVybiBzb2FwX3NlbmRlcl9mYXVsdF9zdWJjb2RlKHNvYXAsIGNvZGUsICJUaGUgc2lnbmF0dXJlIG9yIGRlY3J5cHRpb24gd2FzIGludmFsaWQiLCBkZXRhaWwpOworICAgIGNhc2Ugd3NzZTJfX1NlY3VyaXR5VG9rZW5VbmF2YWlsYWJsZToKKyAgICAgIHJldHVybiBzb2FwX3NlbmRlcl9mYXVsdF9zdWJjb2RlKHNvYXAsIGNvZGUsICJSZWZlcmVuY2VkIHNlY3VyaXR5IHRva2VuIGNvdWxkIG5vdCBiZSByZXRyaWV2ZWQiLCBkZXRhaWwpOworICB9CisgIHJldHVybiBTT0FQX0ZBVUxUOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqIERpZ2VzdCBhdXRoZW50aWNhdGlvbiBzZXNzaW9uIG1hbmFnZW1lbnQKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKK0BmbiBzdGF0aWMgaW50IHNvYXBfd3NzZV9zZXNzaW9uX3ZlcmlmeShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciBoYXNoW1NPQVBfU01EX1NIQTFfU0laRV0sIGNvbnN0IGNoYXIgKmNyZWF0ZWQsIGNvbnN0IGNoYXIgKm5vbmNlKQorQGJyaWVmIFZlcmlmaWVzIGFuZCB1cGRhdGVzIHRoZSBkaWdlc3QsIG5vbmNlLCBhbmQgY3JlYXRpb24gdGltZSBhZ2FpbnN0IHRoZSBkaWdlc3QgYXV0aGVudGljYXRpb24gc2Vzc2lvbiBkYXRhYmFzZSB0byBwcmV2ZW50IHJlcGxheSBhdHRhY2tzLgorQHBhcmFtIHNvYXAgY29udGV4dAorQHBhcmFtW2luXSBoYXNoIGJpbmFyeSBkaWdlc3QgdmFsdWUgb2YgUGFzc3dvcmREaWdlc3QKK0BwYXJhbVtpbl0gY3JlYXRlZCBzdHJpbmcKK0BwYXJhbVtpbl0gbm9uY2Ugc3RyaW5nIChiYXNlNjQpCitAcmV0dXJuIFNPQVBfT0sgb3IgU09BUF9GQVVMVAorKi8KK3N0YXRpYyBpbnQKK3NvYXBfd3NzZV9zZXNzaW9uX3ZlcmlmeShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciBoYXNoW1NPQVBfU01EX1NIQTFfU0laRV0sIGNvbnN0IGNoYXIgKmNyZWF0ZWQsIGNvbnN0IGNoYXIgKm5vbmNlKQoreyBzdHJ1Y3Qgc29hcF93c3NlX3Nlc3Npb24gKnNlc3Npb247CisgIHRpbWVfdCBleHBpcmVkLCBub3cgPSB0aW1lKE5VTEwpOworICBEQkdGVU4oInNvYXBfd3NzZV9zZXNzaW9uX3ZlcmlmeSIpOworICBzb2FwX3MyZGF0ZVRpbWUoc29hcCwgY3JlYXRlZCwgJmV4cGlyZWQpOworICAvKiBjcmVhdGlvbiB0aW1lIGluIHRoZSBmdXR1cmU/ICovCisgIGlmIChleHBpcmVkID4gbm93ICsgU09BUF9XU1NFX0NMS1NLRVcpCisgICAgcmV0dXJuIHNvYXBfd3NzZV9mYXVsdChzb2FwLCB3c3NlMl9fRmFpbGVkQXV0aGVudGljYXRpb24sICJBdXRob3JpemF0aW9uIHJlcXVlc3QgaW4gZnV0dXJlIik7CisgIGV4cGlyZWQgKz0gU09BUF9XU1NFX05PTkNFVElNRTsKKyAgLyogZXhwaXJlZD8gKi8KKyAgaWYgKGV4cGlyZWQgPD0gbm93KQorICAgIHJldHVybiBzb2FwX3dzc2VfZmF1bHQoc29hcCwgd3NzZTJfX0ZhaWxlZEF1dGhlbnRpY2F0aW9uLCAiQXV0aGVudGljYXRpb24gZXhwaXJlZCIpOworICAvKiBwdXJnZSBleHBpcmVkIG1lc3NhZ2VzLCBidXQgZG9uJ3QgZG8gdGhpcyBhbGwgdGhlIHRpbWUgdG8gaW1wcm92ZSBlZmZpY2llbmN5ICovCisgIGlmIChub3cgJSAxMCA9PSAwKQorICAgIHNvYXBfd3NzZV9zZXNzaW9uX2NsZWFudXAoc29hcCk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVmVyaWZ5aW5nIHNlc3Npb24gbm9uY2U9JXNcbiIsIG5vbmNlKSk7CisgIC8qIGVudGVyIG11dGV4IHRvIGNoZWNrIGFuZCB1cGRhdGUgc2Vzc2lvbiAqLworICBNVVRFWF9MT0NLKHNvYXBfd3NzZV9zZXNzaW9uX2xvY2spOworICBmb3IgKHNlc3Npb24gPSBzb2FwX3dzc2Vfc2Vzc2lvbjsgc2Vzc2lvbjsgc2Vzc2lvbiA9IHNlc3Npb24tPm5leHQpCisgIHsgaWYgKCFtZW1jbXAoc2Vzc2lvbi0+aGFzaCwgaGFzaCwgU09BUF9TTURfU0hBMV9TSVpFKSAmJiAhc3RyY21wKHNlc3Npb24tPm5vbmNlLCBub25jZSkpCisgICAgICBicmVhazsKKyAgfQorICAvKiBpZiBub3QgZm91bmQsIGFsbG9jYXRlIG5ldyBzZXNzaW9uIGRhdGEgKi8KKyAgaWYgKCFzZXNzaW9uKQorICB7IHNlc3Npb24gPSAoc3RydWN0IHNvYXBfd3NzZV9zZXNzaW9uKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2FwX3dzc2Vfc2Vzc2lvbikgKyBzdHJsZW4obm9uY2UpKTsKKyAgICBpZiAoc2Vzc2lvbikKKyAgICB7IHNlc3Npb24tPm5leHQgPSBzb2FwX3dzc2Vfc2Vzc2lvbjsKKyAgICAgIHNlc3Npb24tPmV4cGlyZWQgPSBleHBpcmVkOworICAgICAgbWVtY3B5KHNlc3Npb24tPmhhc2gsIGhhc2gsIFNPQVBfU01EX1NIQTFfU0laRSk7CisgICAgICBzdHJjcHkoc2Vzc2lvbi0+bm9uY2UsIG5vbmNlKTsKKyAgICAgIHNvYXBfd3NzZV9zZXNzaW9uID0gc2Vzc2lvbjsKKyAgICB9CisgICAgc2Vzc2lvbiA9IE5VTEw7CisgIH0KKyAgLyogZXhpdCBtdXRleCAqLworICBNVVRFWF9VTkxPQ0soc29hcF93c3NlX3Nlc3Npb25fbG9jayk7CisgIC8qIGlmIHJlcGxheSBhdHRhY2ssIHJldHVybiBub24tZGVzY3JpcHQgZmFpbHVyZSAqLworICBpZiAoc2Vzc2lvbikKKyAgICByZXR1cm4gc29hcF93c3NlX2ZhdWx0KHNvYXAsIHdzc2UyX19GYWlsZWRBdXRoZW50aWNhdGlvbiwgTlVMTCk7CisgIHJldHVybiBTT0FQX09LOworfQorCisvKioKK0BmbiBzdGF0aWMgdm9pZCBzb2FwX3dzc2Vfc2Vzc2lvbl9jbGVhbnVwKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmIFJlbW92ZXMgZXhwaXJlZCBhdXRoZW50aWNhdGlvbiBkYXRhIGZyb20gdGhlIGRpZ2VzdCBhdXRoZW50aWNhdGlvbiBzZXNzaW9uIGRhdGFiYXNlLgorQHBhcmFtIHNvYXAgY29udGV4dAorKi8KK3N0YXRpYyB2b2lkCitzb2FwX3dzc2Vfc2Vzc2lvbl9jbGVhbnVwKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF93c3NlX3Nlc3Npb24gKipzZXNzaW9uOworICB0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKKyAgREJHRlVOKCJzb2FwX3dzc2Vfc2Vzc2lvbl9jbGVhbnVwIik7CisgIC8qIGVudGVyIG11dGV4IHRvIHB1cmdlIGV4cGlyZWQgc2Vzc2lvbiBkYXRhICovCisgIE1VVEVYX0xPQ0soc29hcF93c3NlX3Nlc3Npb25fbG9jayk7CisgIHNlc3Npb24gPSAmc29hcF93c3NlX3Nlc3Npb247CisgIHdoaWxlICgqc2Vzc2lvbikKKyAgeyBpZiAoKCpzZXNzaW9uKS0+ZXhwaXJlZCA8IG5vdykKKyAgICB7IHN0cnVjdCBzb2FwX3dzc2Vfc2Vzc2lvbiAqcCA9ICpzZXNzaW9uOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJEZWxldGluZyBzZXNzaW9uIG5vbmNlPSVzXG4iLCBwLT5ub25jZSkpOworICAgICAgKnNlc3Npb24gPSBwLT5uZXh0OworICAgICAgZnJlZShwKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgc2Vzc2lvbiA9ICYoKnNlc3Npb24pLT5uZXh0OworICB9CisgIC8qIGV4aXQgbXV0ZXggKi8KKyAgTVVURVhfVU5MT0NLKHNvYXBfd3NzZV9zZXNzaW9uX2xvY2spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqIENhbGN1bGF0ZSBTSEExKGNyZWF0ZWQsIG5vbmNlLCBwYXNzd29yZCkgZGlnZXN0CisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCitAZm4gc3RhdGljIHZvaWQgY2FsY19kaWdlc3Qoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmNyZWF0ZWQsIGNvbnN0IGNoYXIgKm5vbmNlLCBpbnQgbm9uY2VsZW4sIGNvbnN0IGNoYXIgKnBhc3N3b3JkLCBjaGFyIGhhc2hbU09BUF9TTURfU0hBMV9TSVpFXSkKK0BicmllZiBDYWxjdWxhdGVzIGRpZ2VzdCB2YWx1ZSBTSEExKGNyZWF0ZWQsIG5vbmNlLCBwYXNzd29yZCkKK0BwYXJhbSBzb2FwIGNvbnRleHQKK0BwYXJhbVtpbl0gY3JlYXRlZCBzdHJpbmcgKFhTRCBkYXRlVGltZSBmb3JtYXQpCitAcGFyYW1baW5dIG5vbmNlIHZhbHVlCitAcGFyYW1baW5dIG5vbmNlbGVuIGxlbmd0aCBvZiBub25jZSB2YWx1ZQorQHBhcmFtW2luXSBwYXNzd29yZCBzdHJpbmcKK0BwYXJhbVtvdXRdIGhhc2ggU0hBMSBkaWdlc3QKKyovCitzdGF0aWMgdm9pZAorY2FsY19kaWdlc3Qoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmNyZWF0ZWQsIGNvbnN0IGNoYXIgKm5vbmNlLCBpbnQgbm9uY2VsZW4sIGNvbnN0IGNoYXIgKnBhc3N3b3JkLCBjaGFyIGhhc2hbU09BUF9TTURfU0hBMV9TSVpFXSkKK3sgc3RydWN0IHNvYXBfc21kX2RhdGEgY29udGV4dDsKKyAgLyogdXNlIHNtZGV2cCBlbmdpbmUgKi8KKyAgc29hcF9zbWRfaW5pdChzb2FwLCAmY29udGV4dCwgU09BUF9TTURfREdTVF9TSEExLCBOVUxMLCAwKTsKKyAgc29hcF9zbWRfdXBkYXRlKHNvYXAsICZjb250ZXh0LCBjcmVhdGVkLCBzdHJsZW4oY3JlYXRlZCkpOworICBzb2FwX3NtZF91cGRhdGUoc29hcCwgJmNvbnRleHQsIG5vbmNlLCBub25jZWxlbik7CisgIHNvYXBfc21kX3VwZGF0ZShzb2FwLCAmY29udGV4dCwgcGFzc3dvcmQsIHN0cmxlbihwYXNzd29yZCkpOworICBzb2FwX3NtZF9maW5hbChzb2FwLCAmY29udGV4dCwgaGFzaCwgTlVMTCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICogQ2FsY3VsYXRlIHJhbmRvbWl6ZWQgaGV4IG5vbmNlCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCitAZm4gc3RhdGljIHZvaWQgY2FsY19ub25jZShzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciBub25jZVtTT0FQX1dTU0VfTk9OQ0VMRU5dKQorQGJyaWVmIENhbGN1bGF0ZXMgcmFuZG9taXplZCBub25jZQorQHBhcmFtIHNvYXAgY29udGV4dAorQHBhcmFtW291dF0gbm9uY2UgdmFsdWUKKyovCitzdGF0aWMgdm9pZAorY2FsY19ub25jZShzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciBub25jZVtTT0FQX1dTU0VfTk9OQ0VMRU5dKQoreyBzdGF0aWMgc2hvcnQgY291bnQgPSAweENBNTM7CisgIGNoYXIgYnVmW1NPQVBfV1NTRV9OT05DRUxFTiArIDFdOworICAvKiBUT0RPOiBub25jZSBpcyBjb252ZXJ0ZWQgdG8gYmFzZTY0IHNvIHdlIGNvdWxkIHVzZSByYXcgYmluYXJ5IGluc3RlYWQgb2YgaGV4ICovCisgIHNwcmludGYoYnVmLCAiJTguOHglNC40aHglOC44eCIsIChpbnQpdGltZShOVUxMKSwgY291bnQrKywgc29hcF9yYW5kb20pOworICBtZW1jcHkobm9uY2UsIGJ1ZiwgU09BUF9XU1NFX05PTkNFTEVOKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKiBQbHVnaW4gcmVnaXN0cnkgZnVuY3Rpb25zCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCitAZm4gaW50IHNvYXBfd3NzZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGx1Z2luICpwLCB2b2lkICphcmcpCitAYnJpZWYgUGx1Z2luIHJlZ2lzdHJ5IGZ1bmN0aW9uLCB1c2VkIHdpdGggc29hcF9yZWdpc3Rlcl9wbHVnaW4uCitAcGFyYW0gc29hcCBjb250ZXh0CitAcGFyYW1baW4sb3V0XSBwIHBsdWdpbiBjcmVhdGVkIGluIHJlZ2lzdHJ5CitAcGFyYW1baW5dIGFyZyBwYXNzZWQgZnJvbSBzb2FwX3JlZ2lzdGVyX3BsdWdpbl9hcmcKK0ByZXR1cm4gU09BUF9PSworKi8KK2ludAorc29hcF93c3NlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnAsIHZvaWQgKmFyZykKK3sgREJHRlVOKCJzb2FwX3dzc2UiKTsKKyAgcC0+aWQgPSBzb2FwX3dzc2VfaWQ7CisgIHAtPmRhdGEgPSAodm9pZCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX3dzc2VfZGF0YSkpOworICBwLT5mY29weSA9IHNvYXBfd3NzZV9jb3B5OworICBwLT5mZGVsZXRlID0gc29hcF93c3NlX2RlbGV0ZTsKKyAgaWYgKHAtPmRhdGEpCisgIHsgaWYgKHNvYXBfd3NzZV9pbml0KHNvYXAsIChzdHJ1Y3Qgc29hcF93c3NlX2RhdGEqKXAtPmRhdGEpKQorICAgIHsgU09BUF9GUkVFKHNvYXAsIHAtPmRhdGEpOworICAgICAgcmV0dXJuIFNPQVBfRU9NOworICAgIH0KKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKworLyoqCitAZm4gaW50IHNvYXBfd3NzZV9pbml0KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF93c3NlX2RhdGEgKmRhdGEpCitAYnJpZWYgSW5pdGlhbGl6ZXMgcGx1Z2luIGRhdGEuCitAcGFyYW0gc29hcCBjb250ZXh0CitAcGFyYW1baW4sb3V0XSBkYXRhIHBsdWdpbiBkYXRhCitAcmV0dXJuIFNPQVBfT0sKKyovCitzdGF0aWMgaW50Citzb2FwX3dzc2VfaW5pdChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfd3NzZV9kYXRhICpkYXRhKQoreyBzdGF0aWMgaW50IGRvbmUgPSAwOworICBEQkdGVU4oInNvYXBfd3NzZV9pbml0Iik7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgIC8qIE9wZW5TU0w6IG1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBkaWdlc3QgYWxnb3JpdGhtcyAqLworICBpZiAoIWRvbmUpCisgIHsgZG9uZSA9IDE7CisgICAgT3BlblNTTF9hZGRfYWxsX2RpZ2VzdHMoKTsKKyAgICBPcGVuU1NMX2FkZF9hbGxfYWxnb3JpdGhtcygpOworICB9CisjZW5kaWYKKyAgZGF0YS0+c2lnbl9hbGcgPSBTT0FQX1NNRF9OT05FOworICBkYXRhLT5zaWduX2tleSA9IE5VTEw7CisgIGRhdGEtPnNpZ25fa2V5bGVuID0gMDsKKyAgZGF0YS0+dnJmeV9hbGcgPSBTT0FQX1NNRF9OT05FOworICBkYXRhLT52cmZ5X2tleSA9IE5VTEw7CisgIGRhdGEtPnZyZnlfa2V5bGVuID0gMDsKKyAgZGF0YS0+ZGlnZXN0ID0gTlVMTDsKKyAgZGF0YS0+ZnByZXBhcmVpbml0ID0gTlVMTDsKKyAgZGF0YS0+ZnByZXBhcmVzZW5kID0gTlVMTDsKKyAgZGF0YS0+ZnByZXBhcmVmaW5hbCA9IE5VTEw7CisgIGRhdGEtPmZkaXNjb25uZWN0ID0gTlVMTDsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKgorQGZuIGludCBzb2FwX3dzc2VfY29weShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGx1Z2luICpkc3QsIHN0cnVjdCBzb2FwX3BsdWdpbiAqc3JjKQorQGJyaWVmIENvcGllcyBwbHVnaW4gZGF0YSB0byBsb2NhbGl6ZSBwbHVnaW4gZGF0YSBmb3IgdGhyZWFkcy4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0BwYXJhbVtvdXRdIGRzdCB0YXJnZXQgcGx1Z2luCitAcGFyYW1baW5dIHNyYyBzb3VyY2UgcGx1Z2luCitAcmV0dXJuIFNPQVBfT0sKKyovCitzdGF0aWMgaW50Citzb2FwX3dzc2VfY29weShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGx1Z2luICpkc3QsIHN0cnVjdCBzb2FwX3BsdWdpbiAqc3JjKQoreyBEQkdGVU4oInNvYXBfd3NzZV9jb3B5Iik7CisgICpkc3QgPSAqc3JjOworICBkc3QtPmRhdGEgPSAodm9pZCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX3dzc2VfZGF0YSkpOworICBzb2FwX3dzc2VfaW5pdChzb2FwLCAoc3RydWN0IHNvYXBfd3NzZV9kYXRhKilkc3QtPmRhdGEpOworICByZXR1cm4gU09BUF9PSzsKK30KKworLyoqCitAZm4gdm9pZCBzb2FwX3dzc2VfZGVsZXRlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnApCitAYnJpZWYgRGVsZXRlcyBwbHVnaW4gZGF0YS4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0BwYXJhbVtpbixvdXRdIHAgcGx1Z2luCitAcmV0dXJuIFNPQVBfT0sKKyovCitzdGF0aWMgdm9pZAorc29hcF93c3NlX2RlbGV0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGx1Z2luICpwKQoreyBzdHJ1Y3Qgc29hcF93c3NlX2RhdGEgKmRhdGEgPSAoc3RydWN0IHNvYXBfd3NzZV9kYXRhKilzb2FwX2xvb2t1cF9wbHVnaW4oc29hcCwgc29hcF93c3NlX2lkKTsKKyAgREJHRlVOKCJzb2FwX3dzc2VfZGVsZXRlIik7CisgIGlmIChkYXRhKQorICB7IHNvYXBfd3NzZV9wcmVwYXJlY2xlYW51cChzb2FwLCBkYXRhKTsKKyAgICBTT0FQX0ZSRUUoc29hcCwgZGF0YSk7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKiBQbHVnaW4tc3BlY2lmaWMgZnVuY3Rpb25zCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCitAZm4gaW50IHNvYXBfd3NzZV9zaWduKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgYWxnLCBjb25zdCB2b2lkICprZXksIGludCBrZXlsZW4pCitAYnJpZWYgVXNlcyB0aGUgd3NzZSBwbHVnaW4gdG8gc2lnbiBhbGwgd3N1OklkIGF0dHJpYnV0ZWQgZWxlbWVudHMuCitAcGFyYW0gc29hcCBjb250ZXh0CitAcGFyYW1baW5dIGFsZyBpcyB0aGUgc2lnbmF0dXJlIGFsZ29yaXRobSBTT0FQX1NNRF9ITUFDX1NIQTEsIFNPQVBfU01EX1NJR05fRFNBX1NIQTEsIG9yIFNPQVBfU01EX1NJR05fUlNBX1NIQTEKK0BwYXJhbVtpbl0ga2V5IGlzIHRoZSBITUFDIHNlY3JldCBrZXkgb3IgRFNBL1JTQSBwcml2YXRlIEVWUF9QS0VZCitAcGFyYW1baW5dIGtleWxlbiBpcyB0aGUgSE1BQyBrZXkgbGVuZ3RoCitAcmV0dXJuIFNPQVBfT0sgb3IgZmF1bHQKKworVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBhY3R1YWxseSBzaWduIHRoZSBtZXNzYWdlLCBidXQgaW5pdGlhdGVzIHRoZSBwbHVnaW4ncworc2lnbmF0dXJlIGFsZ29yaXRobSB0byBzaWduIHRoZSBtZXNzYWdlIHVwb24gbWVzc2FnZSB0cmFuc2Zlci4KKyovCitpbnQKK3NvYXBfd3NzZV9zaWduKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgYWxnLCBjb25zdCB2b2lkICprZXksIGludCBrZXlsZW4pCit7IHN0cnVjdCBzb2FwX3dzc2VfZGlnZXN0ICpkaWdlc3QsICpuZXh0OworICBzdHJ1Y3Qgc29hcF93c3NlX2RhdGEgKmRhdGEgPSAoc3RydWN0IHNvYXBfd3NzZV9kYXRhKilzb2FwX2xvb2t1cF9wbHVnaW4oc29hcCwgc29hcF93c3NlX2lkKTsKKyAgREJHRlVOMSgic29hcF93c3NlX3NpZ24iLCAiYWxnPSVkIiwgYWxnKTsKKyAgaWYgKCFkYXRhKQorICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAic29hcF93c3NlX3NpZ24iLCAiUGx1Z2luIG5vdCByZWdpc3RlcmVkIiwgU09BUF9QTFVHSU5fRVJST1IpOworICBpZiAoIWFsZyB8fCAha2V5KQorICAgIHJldHVybiBzb2FwX3dzc2VfZmF1bHQoc29hcCwgd3NzZTJfX0ludmFsaWRTZWN1cml0eSwgIkludmFsaWQgc2lnbmF0dXJlIGFsZ29yaXRobSBvciBrZXkiKTsKKyAgLyogc3RvcmUgYWxnIGFuZCBrZXkgaW4gcGx1Z2luIGRhdGEgKi8KKyAgZGF0YS0+c2lnbl9hbGcgPSBhbGc7CisgIGRhdGEtPnNpZ25fa2V5ID0ga2V5OworICBkYXRhLT5zaWduX2tleWxlbiA9IGtleWxlbjsKKyAgLyogc2F2ZSBhbmQgc2V0IHRoZSBwbHVnaW4ncyBjYWxsYmFja3MgdG8gcHJlcHJvY2VzcyBvdXRib3VuZCBtZXNzYWdlcyAqLworICBpZiAoc29hcC0+ZnByZXBhcmVpbml0ICE9IHNvYXBfd3NzZV9wcmVwYXJlaW5pdCkKKyAgeyBkYXRhLT5mcHJlcGFyZWluaXQgPSBzb2FwLT5mcHJlcGFyZWluaXQ7CisgICAgc29hcC0+ZnByZXBhcmVpbml0ID0gc29hcF93c3NlX3ByZXBhcmVpbml0OworICB9CisgIGlmIChzb2FwLT5mcHJlcGFyZXNlbmQgIT0gc29hcF93c3NlX3ByZXBhcmVzZW5kKQorICB7IGRhdGEtPmZwcmVwYXJlc2VuZCA9IHNvYXAtPmZwcmVwYXJlc2VuZDsKKyAgICBkYXRhLT5mcHJlcGFyZWZpbmFsID0gc29hcC0+ZnByZXBhcmVmaW5hbDsKKyAgfQorICBpZiAoc29hcC0+ZnByZXBhcmVmaW5hbCAhPSBzb2FwX3dzc2VfcHJlcGFyZWZpbmFsKQorICB7IHNvYXAtPmZwcmVwYXJlc2VuZCA9IHNvYXBfd3NzZV9wcmVwYXJlc2VuZDsKKyAgICBzb2FwLT5mcHJlcGFyZWZpbmFsID0gc29hcF93c3NlX3ByZXBhcmVmaW5hbDsKKyAgfQorICAvKiBjbGVhbnVwIHRoZSBkaWdlc3QgZGF0YSAqLworICBmb3IgKGRpZ2VzdCA9IGRhdGEtPmRpZ2VzdDsgZGlnZXN0OyBkaWdlc3QgPSBuZXh0KQorICB7IG5leHQgPSBkaWdlc3QtPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIGRpZ2VzdCk7CisgIH0KKyAgZGF0YS0+ZGlnZXN0ID0gTlVMTDsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKgorQGZuIGludCBzb2FwX3dzc2Vfc2lnbl9ib2R5KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgYWxnLCBjb25zdCB2b2lkICprZXksIGludCBrZXlsZW4pCitAYnJpZWYgVXNlcyB0aGUgd3NzZSBwbHVnaW4gdG8gc2lnbiBhbGwgd3N1OklkIGF0dHJpYnV0ZWQgZWxlbWVudHMsIGluY2x1ZGluZyB0aGUgU09BUCBCb2R5IChieSBhZGRpbmcgYSB3c3U6SWQ9IkJvZHkiIGF0dHJpYnV0ZSkuCitAcGFyYW0gc29hcCBjb250ZXh0CitAcGFyYW1baW5dIGFsZyBpcyB0aGUgc2lnbmF0dXJlIGFsZ29yaXRobSBTT0FQX1NNRF9ITUFDX1NIQTEsIFNPQVBfU01EX1NJR05fRFNBX1NIQTEsIG9yIFNPQVBfU01EX1NJR05fUlNBX1NIQTEKK0BwYXJhbVtpbl0ga2V5IGlzIHRoZSBITUFDIHNlY3JldCBrZXkgb3IgRFNBL1JTQSBwcml2YXRlIEVWUF9QS0VZCitAcGFyYW1baW5dIGtleWxlbiBpcyB0aGUgSE1BQyBrZXkgbGVuZ3RoCitAcmV0dXJuIFNPQVBfT0sKKworVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBhY3R1YWxseSBzaWduIHRoZSBtZXNzYWdlLCBidXQgaW5pdGlhdGVzIHRoZSBwbHVnaW4ncworc2lnbmF0dXJlIGFsZ29yaXRobSB0byBzaWduIHRoZSBtZXNzYWdlIHVwb24gbWVzc2FnZSB0cmFuc2Zlci4KKyovCitpbnQKK3NvYXBfd3NzZV9zaWduX2JvZHkoc3RydWN0IHNvYXAgKnNvYXAsIGludCBhbGcsIGNvbnN0IHZvaWQgKmtleSwgaW50IGtleWxlbikKK3sgaW50IGVycjsKKyAgREJHRlVOMSgic29hcF93c3NlX3NpZ25fYm9keSIsICJhbGc9JWQiLCBhbGcpOworICBzb2FwLT5vbW9kZSB8PSBTT0FQX1hNTF9TRUM7CisgIGVyciA9IHNvYXBfd3NzZV9zaWduKHNvYXAsIGFsZywga2V5LCBrZXlsZW4pOworICByZXR1cm4gZXJyOworfQorCisvKioKK0BmbiBpbnQgc29hcF93c3NlX3ZlcmlmeV9pbml0KHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmIFVzZXMgdGhlIHdzc2UgcGx1Z2luIHRvIGluaXRpYXRlIHRoZSB2ZXJpZmljYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBhbmQgU2lnbmVkSW5mbyBSZWZlcmVuY2UgZGlnZXN0cy4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0ByZXR1cm4gU09BUF9PSworCitUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGFjdHVhbGx5IHZlcmlmeSB0aGUgbWVzc2FnZSwgYnV0IGluaXRpYXRlcyB0aGUgcGx1Z2luJ3MKK2RhdGEgdG8gc3RvcmUgdGhlIG1lc3NhZ2UgaW4gYSBET00gdG8gdmVyaWZ5IHRoZSBzaWduYXR1cmUuIFRoZSBzaWduYXR1cmUgYW5kCitkaWdlc3RzIGluIHRoZSBET00gbXVzdCBiZSB2ZXJpZmllZCBtYW51YWxseS4KKyovCitpbnQKK3NvYXBfd3NzZV92ZXJpZnlfaW5pdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgREJHRlVOKCJzb2FwX3dzc2VfdmVyaWZ5X2luaXQiKTsKKyAgLyogZGVzZXJpYWxpemUgaW5ib3VuZCBtZXNzYWdlIHRvIERPTSAqLworICBzb2FwLT5pbW9kZSB8PSBTT0FQX1hNTF9ET007CisgIHJldHVybiBTT0FQX09LOworfQorCisvKioKK0BmbiBpbnQgc29hcF93c3NlX3ZlcmlmeV9hdXRvKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgYWxnLCBjb25zdCB2b2lkICprZXksIHNpemVfdCBrZXlsZW4pCitAYnJpZWYgVXNlcyB0aGUgd3NzZSBwbHVnaW4gdG8gaW5pdGlhdGUgdGhlIGF1dG9tYXRpYyB2ZXJpZmljYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBhbmQgU2lnbmVkSW5mbyBSZWZlcmVuY2UgZGlnZXN0cy4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0BwYXJhbVtpbl0gYWxnIHRvIHZlcmlmeSBzaWduYXR1cmUgaWYgc2lnbmF0dXJlIGhhcyBubyBzZWNyZXQgb3IgcHVibGljIGtleSwgdXNlIFNPQVBfU01EX05PTkUgdG8gb21pdAorQHBhcmFtW2luXSBrZXkgaXMgSE1BQyBrZXkgb3IgRVZQX1BLRVkKK0BwYXJhbVtpbl0ga2V5bGVuIGlzIEhNQUMga2V5IGxlbmd0aAorQHJldHVybiBTT0FQX09LCisKK1RoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWN0dWFsbHkgdmVyaWZ5IHRoZSBtZXNzYWdlLCBidXQgaW5pdGlhdGVzIHRoZSBwbHVnaW4ncworYWxnb3JpdGhtIHRvIHN0b3JlIHRoZSBtZXNzYWdlIGluIGEgRE9NIHRvIGF1dG9tYXRpY2FsbHkgdmVyaWZ5IHRoZSBzaWduYXR1cmUKK2FuZCBkaWdlc3Rlcy4gSWYgdGhlIG1lc3NhZ2UgZG9lcyBub3QgY29udGFpbiBhIGtleSB0byB2ZXJpZnkgdGhlIHNpZ25hdHVyZSwKK3RoZSBhbGcsIGtleSwgYW5kIGtleWxlbiBwYXJhbWV0ZXJzIGFyZSB1c2VkLiBJdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGUgWDUwOQorY2VydGlmaWNhdGUgdXNlZCB0byB2ZXJpZnkgdGhlIHNpZ25hdHVyZSBpcyB2ZXJpZmllZCwgd2hpY2ggcmVxdWlyZXMKK3NvYXAtPmNhZmlsZSBhbmQvb3Igc29hcC0+Y2FwYXRoIHRvIGJlIHNldC4KKyovCitpbnQKK3NvYXBfd3NzZV92ZXJpZnlfYXV0byhzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGFsZywgY29uc3Qgdm9pZCAqa2V5LCBzaXplX3Qga2V5bGVuKQoreyBzdHJ1Y3Qgc29hcF93c3NlX2RhdGEgKmRhdGEgPSAoc3RydWN0IHNvYXBfd3NzZV9kYXRhKilzb2FwX2xvb2t1cF9wbHVnaW4oc29hcCwgc29hcF93c3NlX2lkKTsKKyAgREJHRlVOKCJzb2FwX3dzc2VfdmVyaWZ5X2F1dG8iKTsKKyAgaWYgKCFkYXRhKQorICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAic29hcF93c3NlX3ZlcmlmeV9hdXRvIiwgIlBsdWdpbiBub3QgcmVnaXN0ZXJlZCIsIFNPQVBfUExVR0lOX0VSUk9SKTsKKyAgZGF0YS0+dnJmeV9hbGcgPSBhbGc7CisgIGRhdGEtPnZyZnlfa2V5ID0ga2V5OworICBkYXRhLT52cmZ5X2tleWxlbiA9IGtleWxlbjsKKyAgaWYgKHNvYXAtPmZkaXNjb25uZWN0ICE9IHNvYXBfd3NzZV9kaXNjb25uZWN0KQorICB7IGRhdGEtPmZkaXNjb25uZWN0ID0gc29hcC0+ZmRpc2Nvbm5lY3Q7CisgICAgc29hcC0+ZmRpc2Nvbm5lY3QgPSBzb2FwX3dzc2VfZGlzY29ubmVjdDsgCisgIH0KKyAgcmV0dXJuIHNvYXBfd3NzZV92ZXJpZnlfaW5pdChzb2FwKTsKK30KKworLyoqCitAZm4gaW50IHNvYXBfd3NzZV92ZXJpZnlfZG9uZShzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZiBUZXJtaW5hdGVzIHRoZSBhdXRvbWF0aWMgdmVyaWZpY2F0aW9uIG9mIHNpZ25hdHVyZXMuCitAcGFyYW0gc29hcCBjb250ZXh0CitAcmV0dXJuIFNPQVBfT0sKKyovCitpbnQKK3NvYXBfd3NzZV92ZXJpZnlfZG9uZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfd3NzZV9kYXRhICpkYXRhID0gKHN0cnVjdCBzb2FwX3dzc2VfZGF0YSopc29hcF9sb29rdXBfcGx1Z2luKHNvYXAsIHNvYXBfd3NzZV9pZCk7CisgIERCR0ZVTigic29hcF93c3NlX3ZlcmlmeV9kb25lIik7CisgIGlmICghZGF0YSkKKyAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgInNvYXBfd3NzZV92ZXJpZnlfZG9uZSIsICJQbHVnaW4gbm90IHJlZ2lzdGVyZWQiLCBTT0FQX1BMVUdJTl9FUlJPUik7CisgIHNvYXAtPmltb2RlICY9IH5TT0FQX1hNTF9ET007CisgIGlmIChzb2FwLT5mZGlzY29ubmVjdCA9PSBzb2FwX3dzc2VfZGlzY29ubmVjdCkKKyAgICBzb2FwLT5mZGlzY29ubmVjdCA9IGRhdGEtPmZkaXNjb25uZWN0OworICByZXR1cm4gU09BUF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKiBDYWxsYmFja3MgcmVnaXN0ZXJlZCBieSBwbHVnaW4KKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKK0BmbiBpbnQgc29hcF93c3NlX3ByZXBhcmVpbml0KHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmIEluaXRpYXRlcyBtZXNzYWdlIHByZXByb2Nlc3Npbmcgd2l0aCBnU09BUCBlbmdpbmUncyBwcmVwYXJlaW5pdCBjYWxsYmFjay4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0ByZXR1cm4gU09BUF9PSyBvciBmYXVsdAorCitUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgdG8gYW5hbHl6ZSBhIG1lc3NhZ2UgYmVmb3JlIHRyYW5zbWlzc2lvbi4KKyovCitzdGF0aWMgaW50Citzb2FwX3dzc2VfcHJlcGFyZWluaXQoc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX3dzc2VfZGF0YSAqZGF0YSA9IChzdHJ1Y3Qgc29hcF93c3NlX2RhdGEqKXNvYXBfbG9va3VwX3BsdWdpbihzb2FwLCBzb2FwX3dzc2VfaWQpOworICBEQkdGVU4oInNvYXBfd3NzZV9wcmVwYXJlaW5pdCIpOworICBpZiAoIWRhdGEpCisgICAgcmV0dXJuIFNPQVBfUExVR0lOX0VSUk9SOworICBpZiAoZGF0YS0+ZnByZXBhcmVpbml0KQorICAgIHJldHVybiBkYXRhLT5mcHJlcGFyZWluaXQoc29hcCk7CisgIHJldHVybiBTT0FQX09LOworfQorCisvKioKK0BmbiBpbnQgc29hcF93c3NlX3ByZXBhcmVzZW5kKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCitAYnJpZWYgVGFrZXMgYSBwaWVjZSBvZiB0aGUgWE1MIG1lc3NhZ2UgKHRva2VuaXplZCkgdG8gY29tcHV0ZSBkaWdlc3QuCitAcGFyYW0gc29hcCBjb250ZXh0CitAcGFyYW1baW5dIGJ1ZiBzdHJpbmcgKFhNTCAidG9rZW5pemVkIikgdG8gYmUgc2VuZAorQHBhcmFtW2luXSBsZW4gYnVmIGxlbmd0aAorQHJldHVybiBTT0FQX09LIG9yIGZhdWx0CisKK1RoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB0byBhbmFseXplIGEgbWVzc2FnZSAodXN1YWxseSBkdXJpbmcgdGhlIEhUVFAgY29udGVudAorbGVuZ3RoIHBoYXNlKS4gIE5vdGU6IG5lc3RlZCBlbGVtZW50cyB3aXRoIHdzdTpJZCBhdHRyaWJ1dGVzIGNhbm5vdCBiZQoraW5kaXZpZHVhbGx5IHNpZ25lZCBpbiB0aGlzIHJlbGVhc2UuCisqLworc3RhdGljIGludAorc29hcF93c3NlX3ByZXBhcmVzZW5kKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7IHN0cnVjdCBzb2FwX3dzc2VfZGF0YSAqZGF0YSA9IChzdHJ1Y3Qgc29hcF93c3NlX2RhdGEqKXNvYXBfbG9va3VwX3BsdWdpbihzb2FwLCBzb2FwX3dzc2VfaWQpOworICBEQkdGVU4oInNvYXBfd3NzZV9wcmVwYXJlc2VuZCIpOworICBpZiAoIWRhdGEpCisgICAgcmV0dXJuIFNPQVBfUExVR0lOX0VSUk9SOworICAvKiB0aGUgZ1NPQVAgZW5naW5lIHNpZ25hbHMgdGhlIHN0YXJ0IG9mIGEgd3N1OklkIGVsZW1lbnQgKi8KKyAgaWYgKHNvYXAtPnBhcnQgPT0gU09BUF9CRUdJTl9TRUNVUklUWSkKKyAgeyAvKiBmb3VuZCBlbGVtZW50IHdpdGggd3N1OklkIGFuZCBjaGFuZ2UgZW5naW5lIHN0YXRlICovCisgICAgc29hcC0+cGFydCA9IFNPQVBfSU5fU0VDVVJJVFk7CisgICAgaWYgKGRhdGEtPmRpZ2VzdCAmJiBkYXRhLT5kaWdlc3QtPmxldmVsKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJOZXN0ZWQgaGFzaGluZyBmb3Igc2lnbmF0dXJlIG5vdCBwb3NzaWJsZSwgd3N1OklkPSclcycgaWdub3JlZFxuIiwgc29hcC0+aWQpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgLyogaW5pdGlhbGl6ZSBzbWRldnAgZW5naW5lICovCisgICAgICBzdHJ1Y3Qgc29hcF93c3NlX2RpZ2VzdCAqZGlnZXN0OworICAgICAgZGlnZXN0ID0gKHN0cnVjdCBzb2FwX3dzc2VfZGlnZXN0KilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfd3NzZV9kaWdlc3QpICsgc3RybGVuKHNvYXAtPmlkKSArIDEpOworICAgICAgZGlnZXN0LT5uZXh0ID0gZGF0YS0+ZGlnZXN0OworICAgICAgZGlnZXN0LT5sZXZlbCA9IHNvYXAtPmxldmVsOworICAgICAgc29hcF9zbWRfaW5pdChzb2FwLCAmZGlnZXN0LT5zbWQsIFNPQVBfU01EX0RHU1RfU0hBMSwgTlVMTCwgMCk7CisgICAgICBtZW1zZXQoZGlnZXN0LT5oYXNoLCAwLCBzaXplb2YoZGlnZXN0LT5oYXNoKSk7CisgICAgICBkaWdlc3QtPmlkWzBdID0gJyMnOworICAgICAgc3RyY3B5KGRpZ2VzdC0+aWQgKyAxLCBzb2FwLT5pZCk7CisgICAgICBkYXRhLT5kaWdlc3QgPSBkaWdlc3Q7CisgICAgICAvKiBvbWl0IGluZGVudCBmb3IgaW5kZW50ZWQgWE1MIChuZXh0IHRpbWUgYXJvdW5kLCB3ZSB3aWxsIGNhdGNoICc8JykgKi8KKyAgICAgIGlmICgqYnVmICE9ICc8JykKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICB9CisgIGlmIChzb2FwLT5wYXJ0ID09IFNPQVBfSU5fU0VDVVJJVFkpCisgIHsgLyogdXBkYXRlIHNtZGV2cCBlbmdpbmUgKi8KKyAgICBpZiAoZGF0YS0+ZGlnZXN0KQorICAgIHsgc29hcF9zbWRfdXBkYXRlKHNvYXAsICZkYXRhLT5kaWdlc3QtPnNtZCwgYnVmLCBsZW4pOworICAgICAgaWYgKHNvYXAtPmxldmVsIDwgZGF0YS0+ZGlnZXN0LT5sZXZlbCkKKyAgICAgIHsgc29hcC0+cGFydCA9IFNPQVBfRU5EX1NFQ1VSSVRZOworCXNvYXBfc21kX2ZpbmFsKHNvYXAsICZkYXRhLT5kaWdlc3QtPnNtZCwgZGF0YS0+ZGlnZXN0LT5oYXNoLCBOVUxMKTsKKyAgICAgICAgZGF0YS0+ZGlnZXN0LT5sZXZlbCA9IDA7CisgICAgICB9CisgICAgfQorICB9CitlbmQ6CisgIGlmIChkYXRhLT5mcHJlcGFyZXNlbmQpCisgICAgcmV0dXJuIGRhdGEtPmZwcmVwYXJlc2VuZChzb2FwLCBidWYsIGxlbik7CisgIHJldHVybiBTT0FQX09LOworfQorCisvKioKK0BmbiBpbnQgc29hcF93c3NlX3ByZXBhcmVmaW5hbChzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZiBDb2xsZWN0cyB0aGUgZGlnZXN0cyBvZiBhbGwgdGhlIHdzdTpJZCBlbGVtZW50cyBhbmQgcG9wdWxhdGVzIHRoZSBTaWduZWRJbmZvLgorQHBhcmFtIHNvYXAgY29udGV4dAorQHJldHVybiBTT0FQX09LIG9yIGZhdWx0CisKK1RoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBqdXN0IGJlZm9yZSB0aGUgbWVzc2FnZSBpcyBzZW5kLgorKi8KK3N0YXRpYyBpbnQKK3NvYXBfd3NzZV9wcmVwYXJlZmluYWwoc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX3dzc2VfZGF0YSAqZGF0YSA9IChzdHJ1Y3Qgc29hcF93c3NlX2RhdGEqKXNvYXBfbG9va3VwX3BsdWdpbihzb2FwLCBzb2FwX3dzc2VfaWQpOworICBEQkdGVU4oInNvYXBfd3NzZV9wcmVwYXJlZmluYWwiKTsKKyAgaWYgKCFkYXRhKQorICAgIHJldHVybiBTT0FQX1BMVUdJTl9FUlJPUjsKKyAgLyogbm8gbmVlZCB0byBrZWVwIGxvb2tpbmcgZm9yIHdzdTpJZCAqLworICBzb2FwLT5vbW9kZSB8PSBTT0FQX1hNTF9TRUM7CisgIGlmIChkYXRhLT5kaWdlc3QpCisgIHsgZHNfX1NpZ25hdHVyZVR5cGUgKnNpZ25hdHVyZSA9IHNvYXBfd3NzZV9TaWduYXR1cmUoc29hcCk7CisgICAgc3RydWN0IHNvYXBfd3NzZV9kaWdlc3QgKmRpZ2VzdDsKKyAgICBjb25zdCBjaGFyICp0cmFuc2Zvcm07CisgICAgaW50IHNpZ25hdHVyZV9hZGRlZCA9IDA7CisgICAgLyogaWYgbWVzc2FnZSBpcyBjYW5vbmljYWxpemVkIHBvcHVsYXRlIHRyYW5zZm9ybSBlbGVtZW50IGFjY29yZGluZ2x5ICovCisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgICAgICB0cmFuc2Zvcm0gPSBjMTRuX1VSSTsKKyAgICBlbHNlCisgICAgICB0cmFuc2Zvcm0gPSBOVUxMOworICAgIC8qIHRvIGluY3JlYXNlIHRoZSBtZXNzYWdlIGxlbmd0aCBjb3VudGVyIHdlIG5lZWQgdG8gZW1pdCB0aGUgU2lnbmF0dXJlLAorICAgICAgIFNpZ25lZEluZm8gYW5kIFNpZ25hdHVyZVZhbHVlIGVsZW1lbnRzLiBIb3dldmVyLCB0aGlzIGRvZXMgbm90IHdvcmsgaWYKKyAgICAgICB3ZSBhbHJlYWR5IHBvcHVsYXRlZCB0aGUgd3NzZTpTaWduYXR1cmUgd2l0aCBTaWduZWRJbmZvISAqLworICAgIGlmICghc2lnbmF0dXJlKQorICAgIHsgc2lnbmF0dXJlID0gc29hcF93c3NlX2FkZF9TaWduYXR1cmUoc29hcCk7CisgICAgICBzaWduYXR1cmVfYWRkZWQgPSAxOworICAgIH0KKyAgICBlbHNlIGlmIChzaWduYXR1cmUtPlNpZ25lZEluZm8pCisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIndzc2UgZXJyb3IiLCAiQ2Fubm90IHVzZSBzb2FwX3dzc2Vfc2lnbiB3aXRoIHBvcHVsYXRlZCBTaWduZWRJbmZvIiwgU09BUF9TU0xfRVJST1IpOworICAgIC8qIGFkZCB0aGUgU2lnbmVkSW5mby9SZWZlcmVuY2UgZWxlbWVudHMgZm9yIGVhY2ggZGlnZXN0ICovCisgICAgZm9yIChkaWdlc3QgPSBkYXRhLT5kaWdlc3Q7IGRpZ2VzdDsgZGlnZXN0ID0gZGlnZXN0LT5uZXh0KQorICAgICAgc29hcF93c3NlX2FkZF9TaWduZWRJbmZvX1JlZmVyZW5jZShzb2FwLCBkaWdlc3QtPmlkLCB0cmFuc2Zvcm0sICIiLCBkaWdlc3QtPmhhc2gpOworICAgIC8qIHRoZW4gY29tcHV0ZSB0aGUgc2lnbmF0dXJlIGFuZCBhZGQgaXQgKi8KKyAgICBzb2FwX3dzc2VfYWRkX1NpZ25hdHVyZVZhbHVlKHNvYXAsIGRhdGEtPnNpZ25fYWxnLCBkYXRhLT5zaWduX2tleSwgZGF0YS0+c2lnbl9rZXlsZW4pOworICAgIC8qIHRoZSBjb2RlIGJlbG93IGVuc3VyZXMgd2UgaW5jcmVhc2UgdGhlIG1lc3NhZ2UgbGVuZ3RoIGNvdW50ZXIgKi8KKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgICAgIHNvYXAtPm5zID0gMDsgLyogbmVlZCBuYW1lc3BhY2VzIGZvciBjYW5vbmljYWxpemF0aW9uICovCisgICAgaWYgKHNpZ25hdHVyZV9hZGRlZCkKKyAgICB7IHNvYXAtPmxldmVsID0gMzsgLyogaW5kZW50IGxldmVsIGZvciBYTUwgU2lnbmF0dXJlICovCisgICAgICBzb2FwX291dF9kc19fU2lnbmF0dXJlVHlwZShzb2FwLCAiZHM6U2lnbmF0dXJlIiwgMCwgc2lnbmF0dXJlLCBOVUxMKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgc29hcC0+bGV2ZWwgPSA0OyAvKiBpbmRlbnQgbGV2ZWwgZm9yIFhNTCBTaWduZWRJbmZvICovCisgICAgICBzb2FwLT5jMTRuZXhjbHVkZSA9ICJkcyI7IC8qIGRvbid0IGFkZCB4bWxuczpkcyAqLworICAgICAgc29hcF9vdXRfZHNfX1NpZ25lZEluZm9UeXBlKHNvYXAsICJkczpTaWduZWRJbmZvIiwgMCwgc2lnbmF0dXJlLT5TaWduZWRJbmZvLCBOVUxMKTsKKyAgICAgIHNvYXBfb3V0c3RyaW5nKHNvYXAsICJkczpTaWduYXR1cmVWYWx1ZSIsIDAsICZzaWduYXR1cmUtPlNpZ25hdHVyZVZhbHVlLCBOVUxMLCAwKTsKKyAgICAgIHNvYXAtPmMxNG5leGNsdWRlID0gTlVMTDsKKyAgICB9CisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9JTkRFTlQpCisgICAgICBzb2FwLT5jb3VudCArPSBzb2FwLT5sZXZlbCArIDE7IC8qIGFkZCBcbitpbmRlbnQgKi8KKyAgfQorICAvKiBSZXNldCB0aGUgY2FsbGJhY2tzIGFuZCBjbGVhbnVwIGRpZ2VzdHMgKi8KKyAgc29hcF93c3NlX3ByZXBhcmVjbGVhbnVwKHNvYXAsIGRhdGEpOworICBpZiAoc29hcC0+ZnByZXBhcmVmaW5hbCkKKyAgICByZXR1cm4gc29hcC0+ZnByZXBhcmVmaW5hbChzb2FwKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKgorQGZuIHZvaWQgc29hcF93c3NlX3ByZXBhcmVjbGVhbnVwKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF93c3NlX2RhdGEgKmRhdGEpCitAYnJpZWYgUmVzdG9yZXMgZW5naW5lIHN0YXRlLgorQHBhcmFtIHNvYXAgY29udGV4dAorQHBhcmFtW2luLG91dF0gZGF0YSBwbHVnaW4gZGF0YQorKi8KK3N0YXRpYyB2b2lkCitzb2FwX3dzc2VfcHJlcGFyZWNsZWFudXAoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3dzc2VfZGF0YSAqZGF0YSkKK3sgc3RydWN0IHNvYXBfd3NzZV9kaWdlc3QgKmRpZ2VzdCwgKm5leHQ7CisgIERCR0ZVTigic29hcF93c3NlX3ByZXBhcmVjbGVhbnVwIik7CisgIGRhdGEtPnNpZ25fYWxnID0gU09BUF9TTURfTk9ORTsKKyAgZGF0YS0+c2lnbl9rZXkgPSBOVUxMOworICBkYXRhLT5zaWduX2tleWxlbiA9IDA7CisgIGlmIChzb2FwLT5mcHJlcGFyZWluaXQgPT0gc29hcF93c3NlX3ByZXBhcmVpbml0KQorICAgIHNvYXAtPmZwcmVwYXJlaW5pdCA9IGRhdGEtPmZwcmVwYXJlaW5pdDsKKyAgaWYgKHNvYXAtPmZwcmVwYXJlc2VuZCA9PSBzb2FwX3dzc2VfcHJlcGFyZXNlbmQpCisgICAgc29hcC0+ZnByZXBhcmVzZW5kID0gZGF0YS0+ZnByZXBhcmVzZW5kOworICBpZiAoc29hcC0+ZnByZXBhcmVmaW5hbCA9PSBzb2FwX3dzc2VfcHJlcGFyZWZpbmFsKQorICAgIHNvYXAtPmZwcmVwYXJlZmluYWwgPSBkYXRhLT5mcHJlcGFyZWZpbmFsOworICBkYXRhLT5mcHJlcGFyZWluaXQgPSBOVUxMOworICBkYXRhLT5mcHJlcGFyZXNlbmQgPSBOVUxMOworICBkYXRhLT5mcHJlcGFyZWZpbmFsID0gTlVMTDsKKyAgZm9yIChkaWdlc3QgPSBkYXRhLT5kaWdlc3Q7IGRpZ2VzdDsgZGlnZXN0ID0gbmV4dCkKKyAgeyBuZXh0ID0gZGlnZXN0LT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBkaWdlc3QpOworICB9CisgIGRhdGEtPmRpZ2VzdCA9IE5VTEw7Cit9CisKKy8qKgorQGZuIGludCBzb2FwX3dzc2VfZGlzY29ubmVjdChzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZiBWZXJpZnkgc2lnbmF0dXJlIGFuZCBTaWduZWRJbmZvIGRpZ2VzdHMgaW5pdGlhdGVkIHdpdGggc29hcF93c3NlX3ZlcmlmeV9hdXRvLgorQHBhcmFtIHNvYXAgY29udGV4dAorQHJldHVybiBTT0FQX09LIG9yIGZhdWx0CitAc2VlIHNvYXBfd3NzZV92ZXJpZnlfYXV0bworCitUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQganVzdCBhZnRlciBhIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkLgorKi8KK3N0YXRpYyBpbnQKK3NvYXBfd3NzZV9kaXNjb25uZWN0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF93c3NlX2RhdGEgKmRhdGEgPSAoc3RydWN0IHNvYXBfd3NzZV9kYXRhKilzb2FwX2xvb2t1cF9wbHVnaW4oc29hcCwgc29hcF93c3NlX2lkKTsKKyAgZHNfX1NpZ25lZEluZm9UeXBlICpzaWduZWRJbmZvID0gc29hcF93c3NlX1NpZ25lZEluZm8oc29hcCk7CisgIHNvYXAtPmltb2RlICY9IH5TT0FQX1hNTF9ET007CisgIERCR0ZVTigic29hcF93c3NlX2Rpc2Nvbm5lY3QiKTsKKyAgaWYgKCFkYXRhKQorICAgIHJldHVybiBTT0FQX1BMVUdJTl9FUlJPUjsKKyAgaWYgKHNvYXAtPmZkaXNjb25uZWN0ID09IHNvYXBfd3NzZV9kaXNjb25uZWN0KQorICAgIHNvYXAtPmZkaXNjb25uZWN0ID0gZGF0YS0+ZmRpc2Nvbm5lY3Q7CisgIGlmIChzaWduZWRJbmZvKQorICB7IGludCBhbGcsIGtleWxlbjsKKyAgICBjb25zdCB2b2lkICprZXkgPSBOVUxMOworICAgIC8qIGRldGVybWluZSB3aGljaCBzaWduYXR1cmUgYWxnb3JpdGhtIHdhcyB1c2VkICovCisgICAgaWYgKHNvYXBfd3NzZV9nZXRfU2lnbmVkSW5mb19TaWduYXR1cmVNZXRob2Qoc29hcCwgJmFsZykpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgLyogZm9yIEhNQUMtU0hBMSwgdGhlIHNlY3JldCBrZXkgbWlnaHQgYmUgc3RvcmVkIGluIHRoZSBLZXlJZGVudGlmaWVyICovCisgICAgaWYgKGFsZyA9PSBTT0FQX1NNRF9ITUFDX1NIQTEpCisgICAgeyBjb25zdCBjaGFyICp2YWx1ZVR5cGUgPSBzb2FwX3dzc2VfZ2V0X0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZUtleUlkZW50aWZpZXJWYWx1ZVR5cGUoc29hcCk7CisgICAgICAvKiBpZiBpbiB0aGUgS2V5SWRlbnRpZmllciwgcmV0cmlldmUgaXQgKi8KKyAgICAgIGlmICh2YWx1ZVR5cGUgJiYgIXN0cmNtcCh2YWx1ZVR5cGUsIGRzX2htYWNfc2hhMVVSSSkpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVXNpbmcgSE1BQyBrZXkgZnJvbSBLZXlJZGVudGlmaWVyIHRvIHZlcmlmeSBzaWduYXR1cmVcbiIpKTsKKyAgICAgICAga2V5ID0gc29hcF93c3NlX2dldF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VLZXlJZGVudGlmaWVyKHNvYXAsICZrZXlsZW4pOworICAgICAgfQorICAgICAgZWxzZSBpZiAoYWxnID09IGRhdGEtPnZyZnlfYWxnKQorICAgICAgeyAvKiBnZXQgdGhlIEhNQUMgc2VjcmV0IGtleSBmcm9tIHRoZSBwbHVnaW4gKi8KKwlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVzaW5nIEhNQUMga2V5IGZyb20gcGx1Z2luIHRvIHZlcmlmeSBzaWduYXR1cmVcbiIpKTsKKyAgICAgICAga2V5ID0gZGF0YS0+dnJmeV9rZXk7CisgICAgICAgIGtleWxlbiA9IGRhdGEtPnZyZnlfa2V5bGVuOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeyBYNTA5ICpjZXJ0OworICAgICAgLyogZ2V0IHRoZSBjZXJ0aWZpY2F0ZSBmcm9tIHRoZSBLZXlJbmZvIHJlZmVyZW5jZSAqLworICAgICAgY2VydCA9IHNvYXBfd3NzZV9nZXRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlWDUwOShzb2FwKTsKKyAgICAgIC8qIG9idGFpbiB0aGUgcHVibGljIGtleSBmcm9tIHRoZSBjZXJ0ICovCisgICAgICBpZiAoY2VydCkKKyAgICAgICAga2V5ID0gWDUwOV9nZXRfcHVia2V5KGNlcnQpOworICAgICAgZWxzZSBpZiAoYWxnID09IGRhdGEtPnZyZnlfYWxnKQorICAgICAgeyAvKiBnZXQgdGhlIHB1YmxpYyBrZXkgZnJvbSB0aGUgcGx1Z2luICovCisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVXNpbmcgcHVibGljIGtleSBmcm9tIHBsdWdpbiB0byB2ZXJpZnkgc2lnbmF0dXJlXG4iKSk7CisgICAgICAgIGtleSA9IGRhdGEtPnZyZnlfa2V5OworICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgICAgICB9CisgICAgfQorICAgIC8qIGlmIHN0aWxsIG5vIGtleSwgcmV0dXJuIGZhdWx0ICovCisgICAgLyogVE9ETzogYWRkIHVzZXItZXh0ZW5zaWJsZSBtZWNoYW5pc20gdG9vIGxvb2sgZm9yIGtleSAqLworICAgIGlmICgha2V5KQorICAgICAgcmV0dXJuIHNvYXBfd3NzZV9mYXVsdChzb2FwLCB3c3NlMl9fU2VjdXJpdHlUb2tlblVuYXZhaWxhYmxlLCBOVUxMKTsKKyAgICAvKiB2ZXJpZnkgU2lnbmVkSW5mbyB3aXRoIHNpZ25hdHVyZSBhbmQgY2hlY2sgZGlnZXN0cyBvZiBsb2NhbCBlbGVtZW50cyAqLworICAgIGlmIChzb2FwX3dzc2VfdmVyaWZ5X1NpZ25hdHVyZVZhbHVlKHNvYXAsIGFsZywga2V5LCBrZXlsZW4pCisgICAgIHx8IHNvYXBfd3NzZV92ZXJpZnlfU2lnbmVkSW5mbyhzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBkYXRhLT52cmZ5X2FsZyA9IFNPQVBfU01EX05PTkU7CisgICAgaWYgKHNvYXAtPmZkaXNjb25uZWN0KQorICAgICAgcmV0dXJuIHNvYXAtPmZkaXNjb25uZWN0KHNvYXApOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIHJldHVybiBzb2FwX3dzc2VfZmF1bHQoc29hcCwgd3NzZTJfX0ZhaWxlZENoZWNrLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL3BsdWdpbi93c3NlMmFwaS5oIGIvcGx1Z2luL3dzc2UyYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkzMWNjMAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbi93c3NlMmFwaS5oCkBAIC0wLDAgKzEsMTc1IEBACisvKgorCit3c3NlYXBpLmgKKworV1MtU2VjdXJpdHkgcGx1Z2luCisKK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgcGFydCBvZiB0aGUgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXM6CitHUEwsIHRoZSBnU09BUCBwdWJsaWMgbGljZW5zZSwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIHB1YmxpYyBsaWNlbnNlLgorCitUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBnU09BUCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMworKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCitMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK2h0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9zb2FwbGljZW5zZS5odG1sCitTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAorV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCitmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLgorQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbmNsdWRlICJzb2FwSC5oIgorI2luY2x1ZGUgInNtZGV2cC5oIgorCisvKiogcGx1Z2luIGlkZW50aWZpY2F0aW9uIGZvciBwbHVnaW4gcmVnaXN0cnkgKi8KKyNkZWZpbmUgU09BUF9XU1NFX0lEICJTT0FQLVdTU0UtMC45IgorCisvKiogcGx1Z2luIGlkZW50aWZpY2F0aW9uIGZvciBwbHVnaW4gcmVnaXN0cnkgKi8KK2V4dGVybiBjb25zdCBjaGFyIHNvYXBfd3NzZV9pZFtdOworCisvKioKK0BzdHJ1Y3Qgc29hcF93c3NlX2RhdGEKK0BicmllZiB3c3NlcGkgcGx1Z2luIGRhdGEKKworVGhlIHNpZ25hdHVyZSBrZXkgKHByaXZhdGUpIGFuZCB2ZXJpZmljYXRpb24ga2V5IChwdWJsaWMpIGFyZSBrZXB0IHNlcGFyYXRlLgorKi8KK3N0cnVjdCBzb2FwX3dzc2VfZGF0YQoreyBpbnQgc2lnbl9hbGc7CQkJLyoqPCBUaGUgZGlnZXN0IG9yIHNpZ25hdHVyZSBhbGdvcml0aG0gdXNlZCAqLworICBjb25zdCB2b2lkICpzaWduX2tleTsJCS8qKjwgRVZQX1BLRVkgb3Iga2V5IHN0cmluZyBmb3IgSE1BQyAqLworICBpbnQgc2lnbl9rZXlsZW47CQkvKio8IEhNQUMga2V5IGxlbmd0aCAqLworICBpbnQgdnJmeV9hbGc7CQkJLyoqPCBUaGUgc2lnbmF0dXJlIHZlcmlmeSBhbGdvcml0aG0gdXNlZCAqLworICBjb25zdCB2b2lkICp2cmZ5X2tleTsJCS8qKjwgRVZQX1BLRVkgb3Iga2V5IHN0cmluZyBmb3IgSE1BQyB2ZXJpZnkgKi8KKyAgaW50IHZyZnlfa2V5bGVuOwkJLyoqPCBITUFDIGtleSBsZW5ndGggKi8KKyAgc3RydWN0IHNvYXBfd3NzZV9kaWdlc3QgKmRpZ2VzdDsJLyoqPCBMaXN0IG9mIElELWhhc2ggcGFpcnMgKi8KKyAgaW50ICgqZnByZXBhcmVpbml0KShzdHJ1Y3Qgc29hcCopOworICBpbnQgKCpmcHJlcGFyZXNlbmQpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHNpemVfdCk7CisgIGludCAoKmZwcmVwYXJlZmluYWwpKHN0cnVjdCBzb2FwKik7CisgIGludCAoKmZkaXNjb25uZWN0KShzdHJ1Y3Qgc29hcCopOworfTsKKworLyoqCitAc3RydWN0IHNvYXBfd3NzZV9kaWdlc3QKK0BicmllZiBEaWdlc3QgZGljdGlvbmFyeTogbGlua2VkIGxpc3Qgb2YgSUQtaGFzaCBwYWlycworCitUaGUgZGlnZXN0IGRpY3Rpb25hcnkgaXMgcG9wdWxhdGVkIGJ5IHRoZSBzb2FwX3dzc2VfcHJlcGFyZXNlbmQgY2FsbGJhY2suIFRoZQorY2FsbGJhY2sgaW50ZXJjZXB0cyBYTUwgZWxlbWVudHMgd2l0aCB3c3U6SWQgYXR0cmlidXRlcyBhbmQgY29tcHV0ZXMgdGhlIGRpZ2VzdAorZHVyaW5nIHRoZSBwcmVwcm9jZXNzaW5nIG9mIGEgbWVzc2FnZSB0cmFuc21pc3Npb24uIFRoZSAnbGV2ZWwnIGZpZWxkIGlzIHVzZWQKK3RvIGRldGVybWluZSB3aGVuIHRoZSBlbmQgb2YgYW4gZWxlbWVudCBpcyByZWFjaGVkLgorKi8KK3N0cnVjdCBzb2FwX3dzc2VfZGlnZXN0Cit7IHN0cnVjdCBzb2FwX3dzc2VfZGlnZXN0ICpuZXh0OwkvKio8IE5leHQgaW4gbGlzdCAqLworICB1bnNpZ25lZCBpbnQgbGV2ZWw7CQkJLyoqPCBYTUwgcGFyc2VyIGRlcHRoIGxldmVsICovCisgIHN0cnVjdCBzb2FwX3NtZF9kYXRhIHNtZDsJCS8qKjwgc21kZXZwIGVuZ2luZSBjb250ZXh0ICovCisgIHVuc2lnbmVkIGNoYXIgaGFzaFtTT0FQX1NNRF9NQVhfU0laRV07LyoqPCBEaWdlc3QgaGFzaCB2YWx1ZSAqLworICBjaGFyIGlkWzFdOwkJCQkvKio8IFN0cmluZyBmbG93cyBkb3duIHRoZSBzdHJ1Y3QgKi8KK307CisKK2V4dGVybiBjb25zdCBjaGFyICp3c3NlX1Bhc3N3b3JkVGV4dFVSSTsKK2V4dGVybiBjb25zdCBjaGFyICp3c3NlX1Bhc3N3b3JkRGlnZXN0VVJJOworZXh0ZXJuIGNvbnN0IGNoYXIgKndzc2VfQmFzZTY0QmluYXJ5VVJJOworZXh0ZXJuIGNvbnN0IGNoYXIgKndzc2VfWDUwOXYzVVJJOworZXh0ZXJuIGNvbnN0IGNoYXIgKndzc2VfWDUwOXYzU3ViamVjdEtleUlkZW50aWZpZXJVUkk7CisKK2V4dGVybiBjb25zdCBjaGFyICpkc19zaGExVVJJOworZXh0ZXJuIGNvbnN0IGNoYXIgKmRzX2htYWNfc2hhMVVSSTsKK2V4dGVybiBjb25zdCBjaGFyICpkc19kc2Ffc2hhMVVSSTsKK2V4dGVybiBjb25zdCBjaGFyICpkc19yc2Ffc2hhMVVSSTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKmRzX1VSSTsKK2V4dGVybiBjb25zdCBjaGFyICpjMTRuX1VSSTsKK2V4dGVybiBjb25zdCBjaGFyICp3c3VfVVJJOworCitzdHJ1Y3QgX3dzc2UyX19TZWN1cml0eSogc29hcF93c3NlX2FkZF9TZWN1cml0eShzdHJ1Y3Qgc29hcCAqc29hcCk7CitzdHJ1Y3QgX3dzc2UyX19TZWN1cml0eSogc29hcF93c3NlX2FkZF9TZWN1cml0eV9hY3RvcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqYWN0b3IpOwordm9pZCBzb2FwX3dzc2VfZGVsZXRlX1NlY3VyaXR5KHN0cnVjdCBzb2FwICpzb2FwKTsKK3N0cnVjdCBfd3NzZTJfX1NlY3VyaXR5KiBzb2FwX3dzc2VfU2VjdXJpdHkoc3RydWN0IHNvYXAgKnNvYXApOworCitzdHJ1Y3QgZHNfX1NpZ25hdHVyZVR5cGUqIHNvYXBfd3NzZV9hZGRfU2lnbmF0dXJlKHN0cnVjdCBzb2FwICpzb2FwKTsKK3ZvaWQgc29hcF93c3NlX2RlbGV0ZV9TaWduYXR1cmUoc3RydWN0IHNvYXAgKnNvYXApOworc3RydWN0IGRzX19TaWduYXR1cmVUeXBlKiBzb2FwX3dzc2VfU2lnbmF0dXJlKHN0cnVjdCBzb2FwICpzb2FwKTsKKworaW50IHNvYXBfd3NzZV9hZGRfVGltZXN0YW1wKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgdGltZV90IGxpZmV0aW1lKTsKK3N0cnVjdCBfd3N1X19UaW1lc3RhbXAgKnNvYXBfd3NzZV9UaW1lc3RhbXAoc3RydWN0IHNvYXAgKnNvYXApOworaW50IHNvYXBfd3NzZV92ZXJpZnlfVGltZXN0YW1wKHN0cnVjdCBzb2FwICpzb2FwKTsKKworaW50IHNvYXBfd3NzZV9hZGRfVXNlcm5hbWVUb2tlblRleHQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICp1c2VybmFtZSwgY29uc3QgY2hhciAqcGFzc3dvcmQpOworaW50IHNvYXBfd3NzZV9hZGRfVXNlcm5hbWVUb2tlbkRpZ2VzdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKnVzZXJuYW1lLCBjb25zdCBjaGFyICpwYXNzd29yZCk7CitzdHJ1Y3QgX3dzc2UyX19Vc2VybmFtZVRva2VuICpzb2FwX3dzc2VfVXNlcm5hbWVUb2tlbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQpOworY29uc3QgY2hhciogc29hcF93c3NlX2dldF9Vc2VybmFtZShzdHJ1Y3Qgc29hcCAqc29hcCk7CitpbnQgc29hcF93c3NlX3ZlcmlmeV9QYXNzd29yZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcGFzc3dvcmQpOworCitpbnQgc29hcF93c3NlX2FkZF9CaW5hcnlTZWN1cml0eVRva2VuKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqdmFsdWVUeXBlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgc2l6ZSk7CitpbnQgc29hcF93c3NlX2FkZF9CaW5hcnlTZWN1cml0eVRva2VuWDUwOShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIFg1MDkgKmNlcnQpOworaW50IHNvYXBfd3NzZV9hZGRfQmluYXJ5U2VjdXJpdHlUb2tlblBFTShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKK3N0cnVjdCBfd3NzZTJfX0JpbmFyeVNlY3VyaXR5VG9rZW4gKnNvYXBfd3NzZV9CaW5hcnlTZWN1cml0eVRva2VuKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCk7CitpbnQgc29hcF93c3NlX2dldF9CaW5hcnlTZWN1cml0eVRva2VuKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgY2hhciAqKnZhbHVlVHlwZSwgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCAqc2l6ZSk7CitYNTA5ICpzb2FwX3dzc2VfZ2V0X0JpbmFyeVNlY3VyaXR5VG9rZW5YNTA5KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCk7CitpbnQgc29hcF93c3NlX3ZlcmlmeV9YNTA5KHN0cnVjdCBzb2FwICpzb2FwLCBYNTA5ICpjZXJ0KTsKKworc3RydWN0IGRzX19TaWduZWRJbmZvVHlwZSAqc29hcF93c3NlX2FkZF9TaWduZWRJbmZvKHN0cnVjdCBzb2FwICpzb2FwKTsKK2ludCBzb2FwX3dzc2VfYWRkX1NpZ25lZEluZm9fUmVmZXJlbmNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpVUkksIGNvbnN0IGNoYXIgKnRyYW5zZm9ybSwgY29uc3QgY2hhciAqaW5jbHVzaXZlTmFtZXNwYWNlcywgY29uc3QgY2hhciAqSEEpOworaW50IHNvYXBfd3NzZV9hZGRfU2lnbmVkSW5mb19TaWduYXR1cmVNZXRob2Qoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm1ldGhvZCwgaW50IGNhbm9uaWNhbCk7CitzdHJ1Y3QgZHNfX1NpZ25lZEluZm9UeXBlICpzb2FwX3dzc2VfU2lnbmVkSW5mbyhzdHJ1Y3Qgc29hcCAqc29hcCk7CitpbnQgc29hcF93c3NlX2dldF9TaWduZWRJbmZvX1NpZ25hdHVyZU1ldGhvZChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50ICphbGcpOworCitpbnQgc29hcF93c3NlX2FkZF9TaWduYXR1cmVWYWx1ZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGFsZywgY29uc3Qgdm9pZCAqa2V5LCBpbnQga2V5bGVuKTsKK2ludCBzb2FwX3dzc2VfdmVyaWZ5X1NpZ25hdHVyZVZhbHVlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgYWxnLCBjb25zdCB2b2lkICprZXksIGludCBrZXlsZW4pOworaW50IHNvYXBfd3NzZV92ZXJpZnlfU2lnbmVkSW5mbyhzdHJ1Y3Qgc29hcCAqc29hcCk7CitpbnQgc29hcF93c3NlX3ZlcmlmeV9kaWdlc3Qoc3RydWN0IHNvYXAgKnNvYXAsIGludCBhbGcsIGNvbnN0IGNoYXIgKmlkLCB1bnNpZ25lZCBjaGFyIGhhc2hbU09BUF9TTURfTUFYX1NJWkVdKTsKKworc3RydWN0IGRzX19LZXlJbmZvVHlwZSAqc29hcF93c3NlX2FkZF9LZXlJbmZvKHN0cnVjdCBzb2FwICpzb2FwKTsKK3N0cnVjdCBkc19fS2V5SW5mb1R5cGUgKnNvYXBfd3NzZV9LZXlJbmZvKHN0cnVjdCBzb2FwICpzb2FwKTsKKworaW50IHNvYXBfd3NzZV9hZGRfS2V5SW5mb19LZXlOYW1lKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lKTsKK2NvbnN0IGNoYXIgKnNvYXBfd3NzZV9nZXRfS2V5SW5mb19LZXlOYW1lKHN0cnVjdCBzb2FwICpzb2FwKTsKKworaW50IHNvYXBfd3NzZV9hZGRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlVVJJKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpVUkksIGNvbnN0IGNoYXIgKnZhbHVlVHlwZSk7CitpbnQgc29hcF93c3NlX2FkZF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VYNTA5KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpVUkkpOworY29uc3QgY2hhciAqc29hcF93c3NlX2dldF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VVUkkoc3RydWN0IHNvYXAgKnNvYXApOworWDUwOSAqc29hcF93c3NlX2dldF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VYNTA5KHN0cnVjdCBzb2FwICpzb2FwKTsKKworaW50IHNvYXBfd3NzZV9hZGRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlS2V5SWRlbnRpZmllcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKnZhbHVlVHlwZSwgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IHNpemUpOworY29uc3QgY2hhciAqc29hcF93c3NlX2dldF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VLZXlJZGVudGlmaWVyVmFsdWVUeXBlKHN0cnVjdCBzb2FwICpzb2FwKTsKK2NvbnN0IHVuc2lnbmVkIGNoYXIgKnNvYXBfd3NzZV9nZXRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlS2V5SWRlbnRpZmllcihzdHJ1Y3Qgc29hcCAqc29hcCwgaW50ICpzaXplKTsKKworaW50IHNvYXBfd3NzZV9hZGRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlRW1iZWRkZWQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICp2YWx1ZVR5cGUpOworCitpbnQgc29hcF93c3NlX2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwLCBlbnVtIHdzc2UyX19GYXVsdGNvZGVFbnVtIGZhdWx0LCBjb25zdCBjaGFyICpkZXRhaWwpOworCitpbnQgc29hcF93c3NlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnAsIHZvaWQgKmFyZyk7CisKK2ludCBzb2FwX3dzc2Vfc2lnbihzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGFsZywgY29uc3Qgdm9pZCAqa2V5LCBpbnQga2V5bGVuKTsKK2ludCBzb2FwX3dzc2Vfc2lnbl9ib2R5KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgYWxnLCBjb25zdCB2b2lkICprZXksIGludCBrZXlsZW4pOworaW50IHNvYXBfd3NzZV92ZXJpZnlfaW5pdChzdHJ1Y3Qgc29hcCAqc29hcCk7CitpbnQgc29hcF93c3NlX3ZlcmlmeV9hdXRvKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgYWxnLCBjb25zdCB2b2lkICprZXksIHNpemVfdCBrZXlsZW4pOworaW50IHNvYXBfd3NzZV92ZXJpZnlfZG9uZShzdHJ1Y3Qgc29hcCAqc29hcCk7CisKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfZGVmYXVsdF94c2RfX2FueVR5cGUoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqbm9kZSk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0X3hzZF9fYW55VHlwZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICpub2RlLCBjb25zdCBjaGFyICp0eXBlKTsKK1NPQVBfRk1BQzEgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKiBTT0FQX0ZNQUMyIHNvYXBfaW5feHNkX19hbnlUeXBlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICpub2RlLCBjb25zdCBjaGFyICp0eXBlKTsKZGlmZiAtLWdpdCBhL3BsdWdpbi93c3NlYXBpLmMgYi9wbHVnaW4vd3NzZWFwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMGM0ODgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW4vd3NzZWFwaS5jCkBAIC0wLDAgKzEsMjY2NyBAQAorLyoKKword3NzZWFwaS5jCisKK1dTLVNlY3VyaXR5IHBsdWdpbgorCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHBhcnQgb2YgdGhlIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2VzOgorR1BMLCB0aGUgZ1NPQVAgcHVibGljIGxpY2Vuc2UsIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBwdWJsaWMgbGljZW5zZS4KKworVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZ1NPQVAgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjMKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcGxpY2Vuc2UuaHRtbAorU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKK1dJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQorZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFJvYmVydCBBLiB2YW4gRW5nZWxlbi4KK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisvKioKKworQG1haW5wYWdlCisKKy0gQHJlZiB3c3NlIGRvY3VtZW50cyB0aGUgd3NzZSBwbHVnaW4gZm9yIFdTLVNlY3VyaXR5IDEuMCBzdXBwb3J0LgorLSBAcmVmIHNtZGV2cCBkb2N1bWVudHMgdGhlIHNtZGV2cCBlbmdpbmUgdXNlZCBieSB0aGUgd3NzZSBwbHVnaW4uCisKKyovCisKKy8qKgorCitAcGFnZSB3c3NlIFRoZSB3c3NlIHBsdWdpbgorCitAc2VjdGlvbiB3c3NlXzUgU2VjdXJpdHkgSGVhZGVyCisKK1RoZSBtYXRlcmlhbCBpbiB0aGlzIHNlY3Rpb24gcmVsYXRlcyB0byB0aGUgV1MtU2VjdXJpdHkgc3BlY2lmaWNhdGlvbiBzZWN0aW9uIDUuCisKK1RvIHVzZSB0aGUgd3NzZSBwbHVnaW46CistIyBSdW4gd3NkbDJoIC10IHR5cGVtYXAuZGF0IG9uIGEgV1NETCBvZiBhIHNlcnZpY2UgdGhhdCByZXF1aXJlcyBXUy1TZWN1cml0eQorICAgaGVhZGVycy4gVGhlIHR5cGVtYXAuZGF0IGZpbGUgaXMgdXNlZCB0byByZWNvZ25pemUgYW5kIHRyYW5zbGF0ZSBTZWN1cml0eQorICAgaGVhZGVyIGJsb2Nrcy4KKy0jIFJ1biBzb2FwY3BwMiBvbiB0aGUgaGVhZGVyIGZpbGUgcHJvZHVjZWQgYnkgd3NkbDJoLgorLSMgKFJlLSljb21waWxlIHN0ZHNvYXAyLmMvcHAsIGRvbS5jL3BwLCBzbWRldnAuYywgd3NzZWFwaS5jIGFuZCB0aGUgZ2VuZXJhdGVkCisgICBzb3VyY2UgZmlsZXMgd2l0aCB0aGUgLURXSVRIX0RPTSBhbmQgLURXSVRIX09QRU5TU0wgY29tcGlsZSBmbGFncyBzZXQuIFRoZQorICAgc21kZXZwLmMgYW5kIHdzc2FwaS5jIGZpbGVzIGFyZSBsb2NhdGVkIGluIHRoZSAncGx1Z2luJyBkaXJlY3RvcnkuCistIyBVc2UgdGhlIHdzc2UgcGx1Z2luIEFQSSBmdW5jdGlvbnMgZGVzY3JpYmVkIGJlbG93IHRvIGFkZCBhbmQgdmVyaWZ5CisgICBTZWN1cml0eSBoZWFkZXJzLgorCitBbiBleGFtcGxlIHdzc2UgY2xpZW50L3NlcnZlciBhcHBsaWNhdGlvbiBjYW4gYmUgZm91bmQgaW4gc2FtcGxlcy93c3NlLgorCitUaGUgU2VjdXJpdHkgaGVhZGVyIGJsb2NrIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgV1MtU2VjdXJpdHkgc2NoZW1hIHdpdGggdGhlCit3c2RsMmggdG9vbCBhbmQgV1MvV1MtdHlwZW1hcC5kYXQ6CisKK0Bjb2RlCisgICAgJCB3c2RsMmggLWNlZ3h5IC1vIHdzc2UuaCAtdCBXUy9XUy10eXBlbWFwLmRhdCBXUy93c3NlLnhzZAorQGVuZGNvZGUKKworVGhlIHNhbWUgcHJvY2VzcyB3YXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgaGVhZGVyIGZpbGUgZHMuaCBmcm9tIHRoZSBYTUwgZGlnaXRhbAorc2lnbmF0dXJlcyBjb3JlIHNjaGVtYS4KKworVGhlIGltcG9ydC93c3NlLmggZmlsZSBoYXMgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uIGZvciB0aGUgU2VjdXJpdHkgaGVhZGVyCitibG9jazoKKworQGNvZGUKK3R5cGVkZWYgc3RydWN0IF93c3NlX19TZWN1cml0eQoreyAgICAgICBzdHJ1Y3QgX3dzdV9fVGltZXN0YW1wKiAgICAgICAgICAgICAgICAgd3N1X19UaW1lc3RhbXA7CisgICAgICAgIHN0cnVjdCBfd3NzZV9fVXNlcm5hbWVUb2tlbiogICAgICAgICAgICBVc2VybmFtZVRva2VuOworICAgICAgICBzdHJ1Y3QgX3dzc2VfX0JpbmFyeVNlY3VyaXR5VG9rZW4qICAgICAgQmluYXJ5U2VjdXJpdHlUb2tlbjsKKyAgICAgICAgc3RydWN0IGRzX19TaWduYXR1cmVUeXBlKiAgICAgICAgICAgICAgIGRzX19TaWduYXR1cmU7CisgICAgICAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQX0VOVl9fYWN0b3I7CisgICAgICAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQX0VOVl9fcm9sZTsKK30gX3dzc2VfX1NlY3VyaXR5OworQGVuZGNvZGUKKworVG8gYWRkIGFuIGVtcHR5IFNlY3VyaXR5IGhlYWRlciBibG9jayB0byB0aGUgU09BUCBoZWFkZXIsIHVzZToKKworQGNvZGUKKyAgICBzb2FwX3dzc2VfYWRkX1NlY3VyaXR5KHNvYXApOworQGVuZGNvZGUKKworVG8gZGVsZXRlIGEgU2VjdXJpdHkgaGVhZGVyLCB1c2U6CisKK0Bjb2RlCisgICAgc29hcF93c3NlX2RlbGV0ZV9TZWN1cml0eShzb2FwKTsKK0BlbmRjb2RlCisKK0FkZGluZyBhbiBlbXB0eSBTZWN1cml0eSBoZWFkZXIgYmxvY2sgaXMgbm90IHZlcnkgdXNlZnVsLiBXZSB3aWxsIG1haW5seSBtYWtlCit1c2Ugb2YgdGhlIGhpZ2hlci1sZXZlbCBmdW5jdGlvbnMgb2YgdGhlIHdzc2UgcGx1Z2luIHRvIHBvcHVsYXRlIGFuZCB2ZXJpZnkKK1NlY3VyaXR5IGhlYWRlciBjb250ZW50LgorCitOb3RlOiBUaGUgc29hcCBjb250ZXh0IGluY2x1ZGVzIGFuIGFjdG9yIHZhbHVlIHNvYXAuYWN0b3IgdGhhdCBpcyBwb3B1bGF0ZWQgYW5kCityZW5kZXJlZCBhcyB0aGUgU09BUC1FTlY6YWN0b3IgKFNPQVAgMS4xKSBvciBTT0FQLUVOVjpyb2xlIChTT0FQIDEuMikgYXR0cmlidXRlCitpbiBYTUwgd2l0aGluIHRoZSBnZW5lcmljIFNPQVAgSGVhZGVyLiBUaGUgYXR0cmlidXRlIGlzIG9wdGlvbmFsLCBidXQgc2hvdWxkIGJlCit1c2VkIHRvIHRhcmdldCBhIHJlY2lwaWVudCBzdWNoIGFzIGFuIGludGVybWVkaWF0ZSBub2RlIHRvIHByb2Nlc3MgdGhlIFNPQVAKK2hlYWRlci4gIEluIGNvbnRyYXN0LCBhY3RvciBvciByb2xlIGF0dHJpYnV0ZXMgd2l0aGluIFNlY3VyaXR5IGhlYWRlciBibG9ja3MKK3RhcmdldCBzcGVjaWZpYyByZWNpcGllbnRzIHRvIHByb2Nlc3MgdGhlIFNlY3VyaXR5IGhlYWRlciBibG9jay4gVGhlIGdTT0FQCitpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBhdXRvbWF0ZSB0aGlzIGZlYXR1cmUgYW5kIGFwcGxpY2F0aW9uIHNob3VsZCBzZXQgYW5kCitjaGVjayB0aGUgYWN0b3Ivcm9sZSBhdHRyaWJ1dGUgd2hlbiBuZWNlc3NhcnkuIEluIGFkZGl0aW9uLCB0aGUgY3VycmVudAoraW1wbGVtZW50YXRpb24gc3VwcG9ydHMgdGhlIGluY2x1c2lvbiBvZiBhIHNpbmdsZSBTZWN1cml0eSBoZWFkZXIgYmxvY2sgaW4gdGhlCitTT0FQIGhlYWRlci4KKworVG8gcG9wdWxhdGUgdGhlIFNPQVAtRU5WOmFjdG9yIG9yIFNPQVAtRU5WOnJvbGUgYXR0cmlidXRlIHdpdGhpbiB0aGUgU2VjdXJpdHkKK2hlYWRlciwgdXNlOgorCitAY29kZQorICAgIHNvYXBfd3NzZV9hZGRfU2VjdXJpdHlfYWN0b3Ioc29hcCwgInJlY2lwaWVudCIpOworQGVuZGNvZGUKKworVG8gb2J0YWluIHRoZSBhY3RvciBvciByb2xlIHZhbHVlIChlLmcuIGFmdGVyIHJlY2VpdmluZyBhIG1lc3NhZ2UpLCB1c2U6CisKK0Bjb2RlCisgICAgX3dzc2VfX1NlY3VyaXR5ICpzZWN1cml0eSA9IHNvYXBfd3NzZV9TZWN1cml0eShzb2FwKTsKKyAgICBpZiAoc2VjdXJpdHkpCisgICAgeyAuLi4gPSBzZWN1cml0eS0+U09BUF9FTlZfX2FjdG9yOyAvLyBTT0FQIDEuMQorICAgICAgLi4uID0gc2VjdXJpdHktPlNPQVBfRU5WX19yb2xlOyAgLy8gU09BUCAxLjIKK0BlbmRjb2RlCisKK1RoZSBTT0FQLUVOVjptdXN0VW5kZXJzdGFuZCBhdHRyaWJ1dGUgaXMgYXV0b21hdGljYWxseSBhZGRlZCBhbmQgY2hlY2tlZCBieSB0aGUKK2dTT0FQIGVuZ2luZS4gQSBnU09BUCBhcHBsaWNhdGlvbiBjb21waWxlZCB3aXRob3V0IFNlY3VyaXR5IHN1cHBvcnQgd2lsbCByZWplY3QKK1NlY3VyaXR5IGhlYWRlcnMuCisKK1NlY3VyaXR5IGhlYWRlciBibG9ja3MgYXJlIGF0dGFjaGVkIHRvIHRoZSBzb2FwIGNvbnRleHQsIHdoaWNoIG1lYW5zIHRoYXQgdGhlCitpbmZvcm1hdGlvbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkga2VwdCB0byBzdXBwb3J0IG11bHRpcGxlIGludm9jYXRpb25zLgorCitAc2VjdGlvbiB3c3NlXzYgU2VjdXJpdHkgVG9rZW5zCisKK1RoZSBtYXRlcmlhbCBpbiB0aGlzIHNlY3Rpb24gcmVsYXRlcyB0byB0aGUgV1MtU2VjdXJpdHkgc3BlY2lmaWNhdGlvbiBzZWN0aW9uIDYuCisKK0BzdWJzZWN0aW9uIHdzc2VfNl8yIFVzZXIgTmFtZSBUb2tlbgorCitUbyBhZGQgYSB1c2VyIG5hbWUgdG9rZW4gdG8gdGhlIFNlY3VyaXR5IGhlYWRlciBibG9jaywgdXNlOgorCitAY29kZQorICAgIHNvYXBfd3NzZV9hZGRfVXNlcm5hbWVUb2tlblRleHQoc29hcCwgIklkIiwgInVzZXJuYW1lIiwgTlVMTCk7CitAZW5kY29kZQorCitUaGUgSWQgdmFsdWUgaXMgb3B0aW9uYWwuIFdoZW4gbm9uLU5VTEwgdGhlIHVzZXIgbmFtZSB0b2tlbiBpcyBpbmNsdWRlZCBpbiB0aGUKK2RpZ2l0YWwgc2lnbmF0dXJlIHRvIHByb3RlY3QgaXRzIGludGVncml0eS4gSXQgaXMgY29tbW9uIGZvciB0aGUgd3NzZSBwbHVnaW4KK2Z1bmN0aW9ucyB0byBhY2NlcHQgc3VjaCBJZHMsIHdoaWNoIGFyZSBzZXJpYWxpemVkIGFzIHdzdTpJZCBpZGVudGlmaWVycyBmb3IKK2Nyb3NzLXJlZmVyZW5jaW5nIFhNTCBlbGVtZW50cy4gVGhlIHNpZ25hdHVyZSBlbmdpbmUgb2YgdGhlIHdzc2UgcGx1Z2luIGlzCitkZXNpZ25lZCB0byBhdXRvbWF0aWNhbGx5IHNpZ24gYWxsIHdzdTpJZCBhdHRyaWJ1dGVkIGVsZW1lbnRzIHRvIHNpbXBsaWZ5IHRoZQorY29kZSB5b3UgbmVlZCB0byB3cml0ZSB0byBpbXBsZW1lbnQgdGhlIHNpZ25pbmcgcHJvY2Vzcy4KKworVG8gYWRkIGEgdXNlciBuYW1lIHRva2VuIHdpdGggY2xlYXIgdGV4dCBwYXNzd29yZCwgdXNlOgorCitAY29kZQorICAgIHNvYXBfd3NzZV9hZGRfVXNlcm5hbWVUb2tlblRleHQoc29hcCwgIklkIiwgInVzZXJuYW1lIiwgInBhc3N3b3JkIik7CitAZW5kY29kZQorCitJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byB1c2UgQHJlZiBzb2FwX3dzc2VfYWRkX1VzZXJuYW1lVG9rZW5UZXh0IG9ubHkgaW4KK2NvbWJpbmF0aW9uIHdpdGggSFRUUFMgZW5jcnlwdGVkIHRyYW5zbWlzc2lvbiBvciBub3QgYXQgYWxsLiBBIGJldHRlcgorYWx0ZXJuYXRpdmUgaXMgdG8gdXNlIHBhc3N3b3JkIGRpZ2VzdHMuIFdpdGggcGFzc3dvcmQgZGlnZXN0IGF1dGhlbnRpY2F0aW9uLAordGhlIGRpZ2VzdCB2YWx1ZSBvZiBhIHBhc3N3b3JkICh3aXRoIG1lc3NhZ2UgY3JlYXRpb24gdGltZSBhbmQgYSByYW5kb20gbm9uY2UpCitpcyBjb21wYXJlZCBvbiBib3RoIHNpZGVzLCB0aHVzIGVsaW1pbmF0aW5nIHRoZSBuZWVkIHRvIGV4Y2hhbmdlIGEgcGFzc3dvcmQKK292ZXIgdGhlIHdpcmUuCisKK1RvIGFkZCBhIHVzZXIgbmFtZSB0b2tlbiB3aXRoIHBhc3N3b3JkIGRpZ2VzdCwgdXNlOgorCitAY29kZQorICAgIHNvYXBfd3NzZV9hZGRfVXNlcm5hbWVUb2tlbkRpZ2VzdChzb2FwLCAiSWQiLCAidXNlcm5hbWUiLCAicGFzc3dvcmQiKTsKK0BlbmRjb2RlCisKK0FsdGhvdWdoIHRoZSBwYXNzd29yZCBzdHJpbmcgaXMgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24sIGl0IGlzIG5vdCByZW5kZXJlZCBpbgorWE1MIG9yIHN0b3JlZCBpbiBhIG1lc3NhZ2UgbG9nLiBJdCBoYXMgYmVlbiBhcmd1ZWQgdGhhdCB0aGlzIGFwcHJvYWNoIGFkb3B0ZWQKK2J5IHRoZSBXUy1TZWN1cml0eSBwcm90b2NvbCBpcyBzdGlsbCB2dWxuZXJhYmxlIHNpbmNlIHRoZSBhcHBsaWNhdGlvbiByZXRyaWV2ZXMKK3RoZSBwYXNzd29yZCBpbiB0ZXh0IGZvcm0gcmVxdWlyaW5nIGEgZGF0YWJhc2UgdG8gc3RvcmUgcGFzc3dvcmRzIGluIGNsZWFyCit0ZXh0LiBIb3dldmVyLCBhIGRpZ2VzdCBhbGdvcml0aG0gY2FuIGJlIHVzZWQgdG8gaGFzaCB0aGUgcGFzc3dvcmRzIGFuZCBzdG9yZQordGhlaXIgZGlnZXN0cyBpbnN0ZWFkLCB3aGljaCBlbGltaW5hdGVzIHRoZSBuZWVkIHRvIHN0b3JlIGNsZWFyLXRleHQgcGFzc3dvcmRzLgorTm90ZSB0aGF0IHRoaXMgaXMgYSBjb21tb24gYXBwcm9hY2ggYWRvcHRlZCBieSBVbml4IGZvciBkZWNhZGVzLgorCitCeSBzZXR0aW5nIHRoZSBJZCB2YWx1ZSB0byBhIHVuaXF1ZSBzdHJpbmcsIHRoZSB1c2VyIG5hbWUgdG9rZW4gaXMgYWxzbworZGlnaXRhbGx5IHNpZ25lZCBieSB0aGUgc2lnbmF0dXJlIGVuZ2luZSBmdXJ0aGVyIHByZXZlbnRpbmcgdGFtcGVyaW5nIHdpdGggaXRzCit2YWx1ZS4KKworWW91IG11c3QgdXNlIEByZWYgc29hcF93c3NlX2FkZF9Vc2VybmFtZVRva2VuRGlnZXN0IGZvciBlYWNoIG1lc3NhZ2UgZXhjaGFuZ2UKK3RvIHJlZnJlc2ggdGhlIHBhc3N3b3JkIGRpZ2VzdCBldmVuIHdoZW4gdGhlIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgYXJlIG5vdAorY2hhbmdlZC4gT3RoZXJ3aXNlLCB0aGUgcmVjZWl2ZXIgbWlnaHQgZmxhZyB0aGUgbWVzc2FnZSBhcyBhIHJlcGxheSBhdHRhY2suCisKK0NsZWFyLXRleHQgcGFzc3dvcmRzIGFuZCBwYXNzd29yZCBkaWdlc3RzIGFyZSB2ZXJpZmllZCB3aXRoCitAcmVmIHNvYXBfd3NzZV92ZXJpZnlfUGFzc3dvcmQuIFRvIHZlcmlmeSBhIHBhc3N3b3JkIGF0IHRoZSByZWNlaXZpbmcgc2lkZSB0bworYXV0aG9yaXplIGEgcmVxdWVzdCAoZS5nLiB3aXRoaW4gYSBXZWIgc2VydmljZSBvcGVyYXRpb24pLCB1c2U6CisKK0Bjb2RlCisgICAgaW50IG5zX19teU1ldGhvZChzdHJ1Y3Qgc29hcCAqc29hcCwgLi4uKQorICAgIHsgY29uc3QgY2hhciAqdXNlcm5hbWUgPSBzb2FwX3dzc2VfZ2V0X1VzZXJuYW1lKHNvYXApOworICAgICAgY29uc3QgY2hhciAqcGFzc3dvcmQ7CisgICAgICBpZiAoIXVzZXJuYW1lKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7IC8vIG5vIHVzZXJuYW1lOiByZXR1cm4gRmFpbGVkQXV0aGVudGljYXRpb24KKyAgICAgIHBhc3N3b3JkID0gLi4uOyAvLyBsb29rdXAgcGFzc3dvcmQgb2YgdXNlcm5hbWUKKyAgICAgIGlmIChzb2FwX3dzc2VfdmVyaWZ5X1Bhc3N3b3JkKHNvYXAsIHBhc3N3b3JkKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOyAvLyBwYXNzd29yZCB2ZXJpZmljYXRpb24gZmFpbGVkOiByZXR1cm4gRmFpbGVkQXV0aGVudGljYXRpb24KKyAgICAgIC4uLiAvLyBwcm9jZXNzIHJlcXVlc3QKKyAgICAgIHJldHVybiBTT0FQX09LOworICAgIH0KK0BlbmRjb2RlCisKK05vdGUgdGhhdCB0aGUgQHJlZiBzb2FwX3dzc2VfZ2V0X1VzZXJuYW1lIGZ1bmN0aW9ucyBzZXRzIHRoZQord3NzZTpGYWlsZWRBdXRoZW50aWNhdGlvbiBmYXVsdC4gSXQgaXMgY29tbW9uIGZvciB0aGUgd3NzZSBwbHVnaW4gZnVuY3Rpb25zIHRvCityZXR1cm4gU09BUF9PSyBvciBhIHdzc2UgZmF1bHQgdGhhdCBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSBzZW5kZXIgYnkgcmV0dXJuaW5nCitzb2FwLT5lcnJvciBmcm9tIHNlcnZpY2Ugb3BlcmF0aW9ucy4gVGhlIGZhdWx0IGlzIGRpc3BsYXllZCB3aXRoIHRoZSBAcmVmCitzb2FwX3ByaW50X2ZhdWx0IGZ1bmN0aW9uLgorCitQYXNzd29yZCBkaWdlc3QgYXV0aGVudGljYXRpb24gcHJldmVudHMgbWVzc2FnZSByZXBsYXkgYXR0YWNrcy4gVGhlIHdzc2UgcGx1Z2luCitrZWVwcyBhIGRhdGFiYXNlIG9mIHBhc3N3b3JkIGRpZ2VzdHMgdG8gdGh3YXJ0IHJlcGxheSBhdHRhY2tzLiBUaGlzIGlzIHRoZQorb25seSBwYXJ0IGluIHRoZSBwbHVnaW4gY29kZSB0aGF0IHJlcXVpcmVzIG11dGV4IHByb3ZpZGVkIGJ5IHRocmVhZHMuaC4gIE9mCitjb3Vyc2UsIHRoaXMgb25seSB3b3JrcyBjb3JyZWN0bHkgaWYgdGhlIHNlcnZlciBpcyBwZXJzaXN0ZW50LCBzdWNoIGFzIGEKK3N0YW5kLWFsb25lIHNlcnZpY2UuIE5vdGUgdGhhdCBDR0ktYmFzZWQgc2VydmljZXMgZG8gbm90IGtlZXAgc3RhdGUuIE1hY2hpbmUKK2Nsb2NrcyBtdXN0IGJlIHN5bmNocm9uaXplZCBhbmQgY2xvY2sgc2tldyBzaG91bGQgbm90IGV4Y2VlZCBAcmVmCitTT0FQX1dTU0VfQ0xLU0tFVyBhdCB0aGUgc2VydmVyIHNpZGUuCisKK0BzdWJzZWN0aW9uIHdzc2VfNl8zIEJpbmFyeSBTZWN1cml0eSBUb2tlbnMKKworWDUwOSBjZXJ0aWZpY2F0ZXMgYXJlIGNvbW1vbmx5IGluY2x1ZGVkIGluIFNlY3VyaXR5IGhlYWRlciBibG9ja3MgYXMgYmluYXJ5CitzZWN1cml0eSB0b2tlbnMuIEEgY2VydGlmaWNhdGUgaXMgdXNlZCB0byB2ZXJpZnkgdGhlIGRpZ2l0YWwgc2lnbmF0dXJlIG9mIGEKK2RpZ2l0YWxseSBzaWduZWQgbWVzc2FnZSB1c2luZyB0aGUgcHVibGljIGtleSBlbWJlZGRlZCB3aXRoaW4gdGhlIGNlcnRpZmljYXRlLgorVGhlIGNlcnRpZmljYXRlIGl0c2VsZiBpcyBzaWduZWQgYnkgYSBjZXJ0aWZpY2F0ZSBhdXRob3JpdHkgKENBKSB0aGF0IHZvdWNoZXMKK2ZvciB0aGUgYXV0aGVudGljaXR5IG9mIHRoZSBjZXJ0aWZpY2F0ZSwgaS5lLiB0byBwcm92ZSB0aGUgaWRlbnRpZnkgb2YgdGhlCittZXNzYWdlIG9yaWdpbmF0b3IuIFRoaXMgdmVyaWZpY2F0aW9uIHByb2Nlc3MgaXMgaW1wb3J0YW50LCBiZWNhdXNlIGRpZ2l0YWwKK3NpZ25hdHVyZXMgYXJlIHVzZWxlc3Mgd2l0aG91dCB2ZXJpZmljYXRpb246IGFuIGF0dGFja2VyIGNvdWxkIHNpbXBseSByZXBsYWNlCit0aGUgbWVzc2FnZSwgc2lnbiBpdCwgYW5kIHJlcGxhY2UgdGhlIGNlcnRpZmljYXRlLgorCitDZXJ0aWZpY2F0ZXMgYXJlIGF1dG9tYXRpY2FsbHkgdmVyaWZpZWQgYnkgdGhlIHdzc2UgcGx1Z2luIHNpZ25hdHVyZSBlbmdpbmUKK3doZW4gcmVjZWl2ZWQgYW5kIGFjY2Vzc2VkLCB3aGljaCBtZWFucyB0aGF0IHRoZSBjZXJ0aWZpY2F0ZXMgb2YgdGhlIENBcyBtdXN0CitiZSBtYWRlIGFjY2Vzc2libGUgdG8gdGhlIHdzc2UgcGx1Z2luIGFzIGZvbGxvd3M6CisKK0Bjb2RlCisgICAgc29hcC0+Y2FmaWxlID0gImNhY2VydHMucGVtIjsgIC8vIHVzZSB0aGlzCisgICAgc29hcC0+Y2FwYXRoID0gImRpci90by9jZXJ0cyI7IC8vIGFuZC9vciBwb2ludCB0byBDQSBjZXJ0cworICAgIHNvYXAtPmNybGZpbGUgPSAicmV2b2tlZC5wZW0iOyAvLyB1c2UgQ1JMIChvcHRpb25hbCkKK0BlbmRjb2RlCisKK1RoZSBAcmVmIHNvYXBfd3NzZV92ZXJpZnlfWDUwOSBmdW5jdGlvbiBjaGVja3MgdGhlIHZhbGlkaXR5IG9mIGEgY2VydGlmaWNhdGUuCitUaGUgY2hlY2sgaXMgYXV0b21hdGljYWxseSBwZXJmb3JtZWQuIFRoZSBjaGVjayBpcyBhbHNvIHBlcmZvcm1lZCB3aGVuCityZXRyaWV2aW5nIHRoZSBjZXJ0aWZpY2F0ZSBmcm9tIGEgU2VjdXJpdHkgaGVhZGVyIGJsb2NrLCBlaXRoZXIgYXV0b21hdGljYWxseQorYnkgdGhlIHdzc2UgcGx1Z2luJ3Mgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBlbmdpbmUgb3IgbWFudWFsbHkgYXMgZm9sbG93czoKKworQGNvZGUKKyAgICBYNTA5ICpjZXJ0ID0gc29hcF93c3NlX2dldF9CaW5hcnlTZWN1cml0eVRva2VuWDUwOShzb2FwLCAiSWQiKTsKK0BlbmRjb2RlCisKK3doZXJlIElkIGlzIHRoZSBpZGVudGlmaWNhdGlvbiBzdHJpbmcgb2YgdGhlIGJpbmFyeSBzZWN1cml0eSB0b2tlbiBvciBOVUxMLgorCitUaGUgdmVyaWZpY2F0aW9uIGlzIGFuIGV4cGVuc2l2ZSBwcm9jZXNzIHRoYXQgd2lsbCBiZSBvcHRpbWl6ZWQgaW4gZnV0dXJlCityZWxlYXNlcyBieSBjYWNoaW5nIHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbi4KKworVG8gYXR0YWNoIGEgYmluYXJ5IHNlY3VyaXR5IHRva2VuIHN0b3JlZCBpbiBhIFBFTSBmaWxlIHRvIGEgU2VjdXJpdHkgaGVhZGVyCitibG9jayBmb3IgdHJhbnNtaXNzaW9uLCB1c2U6CisKK0Bjb2RlCisgICAgc29hcF93c3NlX2FkZF9CaW5hcnlTZWN1cml0eVRva2VuUEVNKHNvYXAsIE5VTEwsICJteWNlcnQucGVtIikKK0BlbmRjb2RlCisKK0EgYmluYXJ5IHNlY3VyaXR5IHRva2VuIGNhbiBiZSBhdXRvbWF0aWNhbGx5IHNpZ25lZCBieSBzZXR0aW5nIGl0cyBJZAorYXR0cmlidXRlOgorCitAY29kZQorICAgIHNvYXBfd3NzZV9hZGRfQmluYXJ5U2VjdXJpdHlUb2tlblBFTShzb2FwLCAiWDUwOVRva2VuIiwgIm15Y2VydC5wZW0iKQorQGVuZGNvZGUKKworUmVwZWF0ZWRseSBsb2FkaW5nIGEgY2VydGlmaWNhdGUgZnJvbSBhIFBFTSBmaWxlIGlzIGluZWZmaWNpZW50LiBUbyByZXVzZSBhCitjZXJ0aWZpY2F0ZSBsb2FkZWQgZnJvbSBhIFBFTSBmaWxlIGZvciBtdWx0aXBsZSBpbnZvY2F0aW9ucywgdXNlOgorCitAY29kZQorICAgIEZJTEUgKmZkID0gZm9wZW4oIm15Y2VydC5wZW0iLCAiciIpOworICAgIFg1MDkgKmNlcnQgPSBQRU1fcmVhZF9YNTA5KGZkLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBmY2xvc2UoZmQpOworICAgIGlmIChzb2FwX3dzc2VfYWRkX0JpbmFyeVNlY3VyaXR5VG9rZW5YNTA5KHNvYXAsICJYNTA5VG9rZW4iLCBjZXJ0KSkKKyAgICAgIC4uLiAvLyBhbiBlcnJvciBvY2N1cnJlZAorQGVuZGNvZGUKKworT3RoZXIgdHlwZXMgb2YgYmluYXJ5IHNlY3VyaXR5IHRva2VucyBjYW4gYmUgYWRkZWQgdG8gdGhlIFNlY3VyaXR5IGhlYWRlciBibG9jayB1c2luZzoKKworQGNvZGUKKyAgICBzb2FwX3dzc2VfYWRkX0JpbmFyeVNlY3VyaXR5VG9rZW4oc29hcCwgIklkIiwgInZhbHVlVHlwZSIsIGRhdGEsIGRhdGFsZW4pOworQGVuZGNvZGUKKworQHNlY3Rpb24gd3NzZV82XzQgWE1MIFRva2VucworCitUaGUgdXNlIGFuZCBwcm9jZXNzaW5nIHJ1bGVzIGZvciBYTUwgdG9rZW5zIHN1Y2ggYXMgU0FNTCBhc3NlcnRpb25zIGlzIHNwZWNpZmljCit0byBhbiBhcHBsaWNhdGlvbi4gIFRoZSB3c3NlIHBsdWdpbiBkb2VzIG5vdCBhdXRvbWF0ZSB0aGUgdXNlIG9mIFhNTCB0b2tlbnMuCitUaGUgZGV2ZWxvcGVyIGlzIGVuY291cmFnZWQgdG8gZ2VuZXJhdGUgY29kZSBmb3IgdGhlIFNBTUwgc2NoZW1hIHdpdGggd3NkbDJoCithbmQgYWRkIHRoZSBuZWNlc3NhcnkgYXNzZXJ0aW9ucyB0byB0aGUgU2VjdXJpdHkgaGVhZGVyIGJsb2NrOgorCitAY29kZQordHlwZWRlZiBzdHJ1Y3QgX3dzc2VfX1NlY3VyaXR5Cit7ICAgICAgIHN0cnVjdCBfd3N1X19UaW1lc3RhbXAqICAgICAgICAgICAgICAgICB3c3VfX1RpbWVzdGFtcDsKKyAgICAgICAgc3RydWN0IF93c3NlX19Vc2VybmFtZVRva2VuKiAgICAgICAgICAgIFVzZXJuYW1lVG9rZW47CisgICAgICAgIHN0cnVjdCBfd3NzZV9fQmluYXJ5U2VjdXJpdHlUb2tlbiogICAgICBCaW5hcnlTZWN1cml0eVRva2VuOworCXN0cnVjdCBfc2FtbF9fQXNzZXJ0aW9uKgkJc2FtbF9fQXNzZXJ0aW9uOyAvLyBhZGRlZAorICAgICAgICBzdHJ1Y3QgZHNfX1NpZ25hdHVyZVR5cGUqICAgICAgICAgICAgICAgZHNfX1NpZ25hdHVyZTsKKyAgICAgICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBfRU5WX19hY3RvcjsKKyAgICAgICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBfRU5WX19yb2xlOworfSBfd3NzZV9fU2VjdXJpdHk7CitAZW5kY29kZQorCitBbHRlcm5hdGl2ZWx5LCBhIERPTSBjYW4gYmUgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgWE1MIHRva2VuczoKKworQGNvZGUKKyNpbXBvcnQgImRvbS5oIgordHlwZWRlZiBzdHJ1Y3QgX3dzc2VfX1NlY3VyaXR5Cit7ICAgICAgIHN0cnVjdCBfd3N1X19UaW1lc3RhbXAqICAgICAgICAgICAgICAgICB3c3VfX1RpbWVzdGFtcDsKKyAgICAgICAgc3RydWN0IF93c3NlX19Vc2VybmFtZVRva2VuKiAgICAgICAgICAgIFVzZXJuYW1lVG9rZW47CisgICAgICAgIHN0cnVjdCBfd3NzZV9fQmluYXJ5U2VjdXJpdHlUb2tlbiogICAgICBCaW5hcnlTZWN1cml0eVRva2VuOworICAgICAgICBzdHJ1Y3QgZHNfX1NpZ25hdHVyZVR5cGUqICAgICAgICAgICAgICAgZHNfX1NpZ25hdHVyZTsKKwlpbnQJCQkJCV9fc2l6ZTsKKwl4c2RfX2FueVR5cGUqCQkJCWFueTsKKyAgICAgICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBfRU5WX19hY3RvcjsKKyAgICAgICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBfRU5WX19yb2xlOworfSBfd3NzZV9fU2VjdXJpdHk7CitAZW5kY29kZQorCitAc2VjdGlvbiB3c3NlXzcgVG9rZW4gUmVmZXJlbmNlcworCitUaGUgbWF0ZXJpYWwgaW4gdGhpcyBzZWN0aW9uIHJlbGF0ZXMgdG8gdGhlIFdTLVNlY3VyaXR5IHNwZWNpZmljYXRpb24gc2VjdGlvbiA3LgorCitUbyB1c2UgYSBjZXJ0aWZpY2F0ZSBmb3Igc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiwgYWRkIGEgZGlyZWN0IHNlY3VyaXR5IHRva2VuCityZWZlcmVuY2UgVVJJIGZvciB0aGUgdG9rZW4gdG8gdGhlIEtleUluZm8sIGZvciBleGFtcGxlOgorCitAY29kZQorICAgIHNvYXBfd3NzZV9hZGRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlVVJJKHNvYXAsICJVUkkiLCAidmFsdWVUeXBlIik7CitAZW5kY29kZQorCithbmQ6CisKK0Bjb2RlCisgICAgc29hcF93c3NlX2FkZF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VYNTA5KHNvYXAsICJVUkkiKTsKK0BlbmRjb2RlCisKK0ZvciBYNTA5IGNlcnRpZmljYXRlcyB3ZSB1c2UgdGhpcyB0byBhZGQgYSBiaW5hcnkgc2VjdXJpdHkgdG9rZW4gd2l0aCB0aGUKK2NlcnRpZmljYXRlIGFuZCBhIHJlZmVyZW5jZSB0byB0aGUgbG9jYWwgdG9rZW46CisKK0Bjb2RlCisgICAgaWYgKHNvYXBfd3NzZV9hZGRfQmluYXJ5U2VjdXJpdHlUb2tlblg1MDkoc29hcCwgIlg1MDlUb2tlbiIsIGNlcnQpCisgICAgIHx8IHNvYXBfd3NzZV9hZGRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlWDUwOShzb2FwLCAiI1g1MDlUb2tlbiIpKQorICAgICAgLi4uIC8vIGFuIGVycm9yIG9jY3VycmVkCitAZW5kY29kZQorCitUaGlzIGZvbGxvd3MgdGhlIHJlY29tbWVuZGVkIHByYWN0aWNlIHRvIHBsYWNlIFNlY3VyaXR5IHRva2VuIHJlZmVyZW5jZXMgaW4KK3RoZSBLZXlJbmZvIGVsZW1lbnQgb2YgYSBTaWduYXR1cmUuIFRoZSBLZXlJbmZvIGlzIHVzZWQgdG8gdmVyaWZ5IHRoZSB2YWxpZGl0eQorb2YgYSBzaWduYXR1cmUgdmFsdWUuCisKK0tleSBpZGVudGlmaWVycyBjYW4gYmUgdXNlZCBhcyB3ZWxsOgorCitAY29kZQorICAgIHNvYXBfd3NzZV9hZGRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlS2V5SWRlbnRpZmllcihzb2FwLCAiSWQiLCAidmFsdWVUeXBlIiwgZGF0YSwgZGF0YWxlbik7CitAZW5kY29kZQorCitFbWJlZGRlZCByZWZlcmVuY2VzIGFyZSBhZGRlZCB3aXRoOgorCitAY29kZQorICAgIHNvYXBfd3NzZV9hZGRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlRW1iZWRkZWQoc29hcCwgIklkIiwgInZhbHVlVHlwZSIpOworQGVuZGNvZGUKKworVE9ETyBpdGVtOiBmdWxsIHN1cHBvcnQgZm9yIGVtYmVkZGVkIHJlZmVyZW5jZSBpcyBjdXJyZW50bHkgdW5kZXIgY29uc3RydWN0aW9uLgorCitUaGUgdXNlIG9mIGtleSBuYW1lcyBpcyBub3QgcmVjb21tZW5kZWQsIGJ1dCBpbiBjYXNlIHRoZXkgYXJlIHJlcXVpcmVkIHRoZXkgY2FuCitiZSBhZGRlZCB3aXRoOgorCitAY29kZQorICAgIHNvYXBfd3NzZV9hZGRfS2V5SW5mb19LZXlOYW1lKHNvYXAsICJuYW1lIik7CitAZW5kY29kZQorCitAc2VjdGlvbiB3c3NlXzggU2lnbmF0dXJlcworCitUaGUgbWF0ZXJpYWwgaW4gdGhpcyBzZWN0aW9uIHJlbGF0ZXMgdG8gdGhlIFdTLVNlY3VyaXR5IHNwZWNpZmljYXRpb24gc2VjdGlvbiA4LgorCitUaGUgd3NzZSBwbHVnaW4gbXVzdCBiZSByZWdpc3RlcmVkIHRvIHNpZ24gYW5kIHZlcmlmeSBtZXNzYWdlczoKKworQGNvZGUKKyAgICBzb2FwX3JlZ2lzdGVyX3BsdWdpbihzb2FwLCBzb2FwX3dzc2UpOworQGVuZGNvZGUKKworWE1MIHNpZ25hdHVyZXMgYXJlIHVzdWFsbHkgY29tcHV0ZWQgb3ZlciBub3JtYWxpemVkIFhNTCAodG8gZW5zdXJlIHRoZSBYTUwKK3Byb2Nlc3NvcnMgb2YgaW50ZXJtZWRpYXRlIG5vZGVzIGNhbiBhY2N1cmF0ZWx5IHJlcHJvZHVjZSB0aGUgWE1MKS4gVG8gdGhpcworZW5kLCB0aGUgZXhjbHVzaXZlIGNhbm9uaWNhbCBYTUwgc3RhbmRhcmQgKGV4Yy1jMTRuKSBpcyByZXF1aXJlZCwgd2hpY2ggaXMgc2V0Cit1c2luZyB0aGUgU09BUF9YTUxfQ0FOT05JQ0FMIGZsYWc6CisKK0Bjb2RlCisgICAgc3RydWN0IHNvYXAgKnNvYXAgPSBzb2FwX25ldzEoU09BUF9YTUxfQ0FOT05JQ0FMKTsKKyAgICBzb2FwX3JlZ2lzdGVyX3BsdWdpbihzb2FwLCBzb2FwX3dzc2UpOworQGVuZGNvZGUKKworSWYgeW91IHByZWZlciBYTUwgaW5kZW50YXRpb24sIHVzZToKKworQGNvZGUKKyAgICBzdHJ1Y3Qgc29hcCAqc29hcCA9IHNvYXBfbmV3MShTT0FQX1hNTF9DQU5PTklDQUwgfCBTT0FQX1hNTF9JTkRFTlQpOworICAgIHNvYXBfcmVnaXN0ZXJfcGx1Z2luKHNvYXAsIHNvYXBfd3NzZSk7CitAZW5kY29kZQorCitOZXh0LCB3ZSBkZWNpZGUgd2hpY2ggc2lnbmF0dXJlIGFsZ29yaXRobSBpcyBhcHByb3ByaWF0ZSB0byB1c2U6CistIEhNQUMtU0hBMSB1c2VzIGEgc2VjcmV0IGtleSAoYWxzbyBrbm93biBhcyBhIHNoYXJlZCBrZXkgaW4gc3ltbWV0cmljCisgIGNyeXB0b2dyYXBoeSkgdG8gc2lnbiB0aGUgU0hBMSBkaWdlc3Qgb2YgdGhlIFNpZ25lZEluZm8gZWxlbWVudC4KKy0gRFNBLVNIQTEgdXNlcyBhIERTQSBwcml2YXRlIGtleSB0byBzaWduIHRoZSBTSEExIGRpZ2VzdCBvZiB0aGUgU2lnbmVkSW5mbworICBlbGVtZW50LgorLSBSU0EtU0hBMSB1c2VzIGEgUlNBIHByaXZhdGUga2V5IHRvIHNpZ24gdGhlIFNIQTEgZGlnZXN0IG9mIHRoZSBTaWduZWRJbmZvCisgIGVsZW1lbnQuCisKK0hNQUMtU0hBMSBpcyB0aGUgc2ltcGxlc3QgbWV0aG9kLCBidXQgcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQgeW91IGhhdmUgdG8gbWFrZQorYWJzb2x1dGVseSBzdXJlIHRoZSBrZXkgaXMga2VwdCBzZWNyZXQgb24gYm90aCB0aGUgc2VuZGluZyBhbmQgcmVjZWl2aW5nIHNpZGUuCitBcyBsb25nIGFzIHRoZSBzZWNyZXQga2V5IGlzIGNvbmZpZGVudGlhbCwgbWVzc2FnZXMgYXJlIHNlY3VyZWx5IHNpZ25lZC4KK0hvd2V2ZXIsIHRoaXMgaXMgdmlydHVhbGx5IGltcG9zc2libGUgd2hlbiBleGNoYW5naW5nIG1lc3NhZ2VzIHdpdGggdW50cnVzdGVkCitkaXNwYXJhdGUgcGFydGllcy4gVGhlIGFkdmFudGFnZSBvZiBITUFDLVNIQTEgaXMgdGhlIHNwZWVkIGJ5IHdoaWNoIG1lc3NhZ2VzCithcmUgc2lnbmVkIGFuZCB2ZXJpZmllZC4KKworRFNBLVNIQTEgYW5kIFJTQS1TSEExIHJlbHkgb24gcHVibGljIGtleSBjcnlwdG9ncmFwaHkuIEluIHNpbXBsaWZpZWQgdGVybXMsIGEKK21lc3NhZ2UgaXMgc2lnbmVkIHVzaW5nIHRoZSAoY29uZmlkZW50aWFsISkgcHJpdmF0ZSBrZXkuIFRoZSBwdWJsaWMga2V5IGlzIHVzZWQKK3RvIHZlcmlmeSB0aGUgc2lnbmF0dXJlLiBTaW5jZSBvbmx5IHRoZSBvcmlnaW5hdGluZyBwYXJ0eSBjb3VsZCBoYXZlIHVzZWQgaXRzCitwcml2YXRlIGtleSB0byBzaWduIHRoZSBtZXNzYWdlLCB0aGUgaW50ZWdyaXR5IG9mIHRoZSBtZXNzYWdlIGlzIGd1YXJhbnRlZWQuIE9mCitjb3Vyc2UsIHdlIG11c3QgdHJ1c3QgdGhlIHB1YmxpYyBrZXkgY2FtZSBmcm9tIHRoZSBvcmlnaW5hdG9yIChpdCBpcyBvZnRlbgoraW5jbHVkZWQgYXMgYW4gWDUwOSBjZXJ0aWZpY2F0ZSBpbiB0aGUgbWVzc2FnZSkuIFRvIHRoaXMgZW5kLCBhIHRydXN0ZWQKK2NlcnRpZmljYXRlIGF1dGhvcml0eSBzaG91bGQgaGF2ZSBzaWduZWQgdGhlIHB1YmxpYyBrZXksIHRoZXJlYnkgY3JlYXRpbmcgYQorWDUwOSBjZXJ0aWZpY2F0ZSB0aGF0IGNvbnRhaW5zIHRoZSBwdWJsaWMga2V5IGFuZCB0aGUgaWRlbnRpdHkgb2YgdGhlIG1lc3NhZ2UKK29yaWdpbmF0b3IuCisKK0BzdWJzZWN0aW9uIHdzc2VfOF8yYSBTaWduaW5nIE1lc3NhZ2VzCisKK0FmdGVyIHRoZSBwbHVnaW4gaXMgcmVnaXN0ZXJlZCBhbmQgYSBzaWduYXR1cmUgYWxnb3JpdGhtIHNlbGVjdGVkLCB0aGUKK0ByZWYgc29hcF93c3NlX3NpZ24gZnVuY3Rpb24gb3IgdGhlIEByZWYgc29hcF93c3NlX3NpZ25fYm9keSBmdW5jdGlvbiBpcyB1c2VkCit0byBpbml0aWF0ZSB0aGUgc2lnbmF0dXJlIGVuZ2luZSB0byBhdXRvbWF0aWNhbGx5IHNpZ24gb3V0Ym91bmQgbWVzc2FnZXMuCisKK1RoZSBjb2RlIHRvIHNpZ24gdGhlIFNPQVAgQm9keSBvZiBhIG1lc3NhZ2UgdXNpbmcgSE1BQy1TSEExIGlzOgorCitAY29kZQorICAgIHN0YXRpYyBjaGFyIGhtYWNfa2V5WzE2XSA9CisgICAgeyAweGZmLCAweGVlLCAweGRkLCAweGNjLCAweGJiLCAweGFhLCAweDk5LCAweDg4LAorICAgICAgMHg3NywgMHg2NiwgMHg1NSwgMHg0NCwgMHgzMywgMHgyMiwgMHgxMSwgMHgwMCB9OworICAgIHN0cnVjdCBzb2FwICpzb2FwID0gc29hcF9uZXcxKFNPQVBfWE1MX0NBTk9OSUNBTCB8IFNPQVBfWE1MX0lOREVOVCk7CisgICAgc29hcF9yZWdpc3Rlcl9wbHVnaW4oc29hcCwgc29hcF93c3NlKTsKKyAgICBpZiAoc29hcF93c3NlX3NpZ25fYm9keShzb2FwLCBTT0FQX1NNRF9ITUFDX1NIQTEsIGhtYWNfa2V5LCBzaXplb2YoaG1hY19rZXkpKQorICAgICAgLi4uIC8vIGFuIGVycm9yIG9jY3VycmVkCisgICAgZWxzZSBpZiAoc29hcF9jYWxsX25zX19teU1ldGhvZChzb2FwLCAuLi4pKQorICAgICAgLi4uIC8vIGEgdHJhbnNtaXNzaW9uIGVycm9yIG9jY3VycmVkCitAZW5kY29kZQorCitUaGUgaG1hY19rZXkgaXMgc29tZSBzZWNyZXQga2V5IHlvdSBnZW5lcmF0ZWQgZm9yIHRoZSBzZW5kaW5nIHNpZGUgYW5kCityZWNlaXZpbmcgc2lkZSAoZG9uJ3QgdXNlIHRoZSBvbmUgc2hvd24gaGVyZSkuCisKK0FzIGFsd2F5cywgdXNlIEByZWYgc29hcF9wcmludF9mYXVsdCB0byBkaXNwbGF5IHRoZSBlcnJvciBtZXNzYWdlLgorCitUbyBzaWduIHRoZSBib2R5IG9mIGFuIG91dGJvdW5kIFNPQVAgbWVzc2FnZSB1c2luZyBSU0EtU0hBMSAoRFNBLVNIQTEgaXMKK3NpbWlsYXIpLCB3ZSBpbmNsdWRlIHRoZSBYNTA5IGNlcnRpZmljYXRlIHdpdGggdGhlIHB1YmxpYyBrZXkgYXMgYQorQmluYXJ5U2VjdXJpdHlUb2tlbiBpbiB0aGUgaGVhZGVyIGFuZCBhIEtleUluZm8gcmVmZXJlbmNlIHRvIHRoZSB0b2tlbiB0byBsZXQKK3JlY2VpdmVycyB1c2UgdGhlIHB1YmxpYyBrZXkgaW4gdGhlIGNlcnRpZmljYXRlIHRvIHZlcmlmeSB0aGUgYXV0aGVudGljaXR5IG9mCit0aGUgbWVzc2FnZToKKworQGNvZGUKKyAgICBGSUxFICpmZDsKKyAgICBFVlBfUEtFWSAqcnNhX3ByaXZhdGVfa2V5OworICAgIFg1MDkgKmNlcnQ7CisgICAgc3RydWN0IHNvYXAgKnNvYXAgPSBzb2FwX25ldzEoU09BUF9YTUxfQ0FOT05JQ0FMIHwgU09BUF9YTUxfSU5ERU5UKTsKKyAgICBzb2FwX3JlZ2lzdGVyX3BsdWdpbihzb2FwLCBzb2FwX3dzc2UpOworICAgIGZkID0gZm9wZW4oInByaXZrZXkucGVtIiwgInIiKTsKKyAgICByc2FfcHJpdmF0ZV9rZXkgPSBQRU1fcmVhZF9Qcml2YXRlS2V5KGZkLCBOVUxMLCBOVUxMLCAicGFzc3dvcmQiKTsKKyAgICBmY2xvc2UoZmQpOworICAgIGZkID0gZm9wZW4oImNlcnQucGVtIiwgInIiKTsKKyAgICBYNTA5ICpjZXJ0ID0gUEVNX3JlYWRfWDUwOShmZCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgZmNsb3NlKGZkKTsKKyAgICBpZiAoc29hcF93c3NlX2FkZF9CaW5hcnlTZWN1cml0eVRva2VuWDUwOShzb2FwLCAiWDUwOVRva2VuIiwgY2VydCkKKyAgICAgfHwgc29hcF93c3NlX2FkZF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VYNTA5KHNvYXAsICIjWDUwOVRva2VuIikKKyAgICAgfHwgc29hcF93c3NlX3NpZ25fYm9keShzb2FwLCBTT0FQX1NNRF9TSUdOX1JTQV9TSEExLCByc2FfcHJpdmF0ZV9rZXksIDApKQorICAgICAgLi4uIC8vIGFuIGVycm9yIG9jY3VycmVkCisgICAgZWxzZSBpZiAoc29hcF9jYWxsX25zX19teU1ldGhvZChzb2FwLCAuLi4pKQorICAgICAgLi4uIC8vIGEgdHJhbnNtaXNzaW9uIGVycm9yIG9jY3VycmVkCitAZW5kY29kZQorCitUaGUgcHJpdmF0ZSBrZXkgYW5kIGl0cyBjZXJ0aWZpY2F0ZSBhcmUgb2Z0ZW4gcGxhY2VkIGluIHRoZSBzYW1lIGZpbGUsIHNlZSBlLmcuCitzZXJ2ZXIucGVtIGluIHRoZSBwYWNrYWdlLgorCitUbyBzdW1tYXJpemUgdGhlIHNpZ25pbmcgcHJvY2VzczoKKy0jIFJlZ2lzdGVyIHRoZSB3c3NlIHBsdWdpbi4KKy0jIE9idGFpbiBhbiBITUFDIHNlY3JldCBrZXkgb3IgYSBEU0Egb3IgUlNBIHByaXZhdGUga2V5LgorLSMgRm9yIERTQSBvciBSU0EsIG9idGFpbiB0aGUgWDUwOSBjZXJ0aWZpY2F0ZSB3aXRoIHRoZSBwdWJsaWMga2V5IHNpZ25lZCBieSBhCisgICBjZXJ0aWZpY2F0ZSBhdXRob3JpdHkuCistIyBBZGQgdGhlIFg1MDkgY2VydGlmaWNhdGUgYXMgYSBCaW5hcnlTZWN1cml0eVRva2VuIHRvIHRoZSBoZWFkZXIuCistIyBBZGQgYSBLZXlJbmZvIEJpbmFyeVNlY3VyaXR5VG9rZW5SZWZlcmVuY2UuCistIyBJbnZva2UgQHJlZiBzb2FwX3dzc2Vfc2lnbiBvciBAcmVmIHNvYXBfd3NzZV9zaWduX2JvZHkgdG8gc2lnbiB0aGUgbWVzc2FnZS4KKy0jIEFsd2F5cyBjaGVjayB0aGUgZnVuY3Rpb24gcmV0dXJuIHZhbHVlcyBmb3IgZXJyb3JzLiBZb3UgZG9uJ3Qgd2FudCB0bworICAgcHJvZHVjZSBhbmQgYWNjZXB0IG1lc3NhZ2VzIHdpdGggYW4gaW52YWxpZCBTZWN1cml0eSBoZWFkZXJzLgorCitAc3Vic2VjdGlvbiB3c3NlXzhfMmIgU2lnbmluZyBNZXNzYWdlIFBhcnRzCisKK1RoZSBAcmVmIHNvYXBfd3NzZV9zaWduX2JvZHkgZnVuY3Rpb24gc2lnbnMgdGhlIGVudGlyZSBTT0FQIGJvZHkuIElmIGl0IGlzCitkZXNpcmFibGUgdG8gc2lnbiBpbmRpdmlkdWFsIHBhcnRzIG9mIGEgbWVzc2FnZSB0aGUgQHJlZiBzb2FwX3dzc2Vfc2lnbgorZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQuIE1lc3NhZ2UgcGFydHMgd2l0aCB3c3U6SWQgYXR0cmlidXRlcyBhcmUgc2lnbmVkLiBUaGVzZQorbWVzc2FnZSBwYXJ0cyBzaG91bGQgbm90IGJlIG5lc3RlZCAobmVzdGVkIGVsZW1lbnRzIHdpbGwgbm90IGJlIHNlcGFyYXRlbHkKK3NpZ25lZCkuCisKK0ZvciBleGFtcGxlLCBjb25zaWRlciBhIHRyYW5zYWN0aW9uIGluIHdoaWNoIHdlIG9ubHkgd2FudCB0byBzaWduIGEgY29udHJhY3QgaW4KK3RoZSBTT0FQIEJvZHkuIFRoaXMgYWxsb3dzIHVzIHRvIG1vZGlmeSB0aGUgcmVzdCBvZiB0aGUgbWVzc2FnZSBvciBleHRyYWN0IHRoZQorY29udHJhY3QgaW4gWE1MIGFuZCBwYXNzIGl0IG9uIHdpdGggdGhlIHNpZ25hdHVyZS4KKworVGhlIGdTT0FQIGhlYWRlciBmaWxlIGluY2x1ZGVzIGEgbXlDb250cmFjdCBkZWNsYXJhdGlvbjoKKworQGNvZGUKKyAgICBzdHJ1Y3QgbnNfX215Q29udHJhY3QKKyAgICB7IEBjaGFyKiB3c3VfSWQgPSAiQ29udHJhY3QiOworICAgICAgY2hhciogbmFtZTsKKyAgICAgIGNoYXIqIHRpdGxlOworICAgICAgY2hhciogdGVybXM7CisgICAgfTsKKyAgICBpbnQgbnNfX215TWV0aG9kKHN0cnVjdCBuc19fbXlDb250cmFjdCBhZ3JlZW1lbnQsIGJvb2wqIGFjY2VwdGVkKTsKK0BlbmRjb2RlCisKK1RoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSB3c3U6SWQgaXMgIkNvbnRyYWN0IiBzbyB0aGF0IHdlIGNhbiBpbnN0YW50aWF0ZSB0aGUKK3N0cnVjdCwgYXV0b21hdGljYWxseSBzaWduIGl0LCBhbmQgc2VuZCBpdCBhcyBmb2xsb3dzOgorCitAY29kZQorICAgIHN0cnVjdCBuc19fbXlDb250cmFjdCBjb250cmFjdDsKKyAgICBib29sIGFjY2VwdDsKKyAgICBzb2FwX2RlZmF1bHRfbnNfX215Q29udHJhY3Qoc29hcCwgJmNvbnRyYWN0KTsKKyAgICBjb250cmFjdC5uYW1lID0gLi4uOworICAgIGNvbnRyYWN0LnRpdGxlID0gLi4uOworICAgIGNvbnRyYWN0LnRlcm1zID0gLi4uOworICAgIGlmIChzb2FwX3dzc2VfYWRkX0JpbmFyeVNlY3VyaXR5VG9rZW5YNTA5KHNvYXAsICJYNTA5VG9rZW4iLCBjZXJ0KQorICAgICB8fCBzb2FwX3dzc2VfYWRkX0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZVg1MDkoc29hcCwgIiNYNTA5VG9rZW4iKQorICAgICB8fCBzb2FwX3dzc2Vfc2lnbihzb2FwLCBTT0FQX1NNRF9TSUdOX1JTQV9TSEExLCByc2FfcHJpdmF0ZV9rZXksIDApKQorICAgICAgLi4uIC8vIGFuIGVycm9yIG9jY3VycmVkCisgICAgZWxzZSBpZiAoc29hcF9jYWxsX25zX19teU1ldGhvZChzb2FwLCBjb250cmFjdCwgJmFjY2VwdCkpCisgICAgICAuLi4gLy8gYSB0cmFuc21pc3Npb24gZXJyb3Igb2NjdXJyZWQKK0BlbmRjb2RlCisKK0BzdWJzZWN0aW9uIHdzc2VfOF8zIFNpZ25pbmcgVG9rZW5zCisKK1RvIHNpZ24gc2VjdXJpdHkgdG9rZW5zIHN1Y2ggYXMgdXNlciBuYW1lcywgcGFzc3dvcmRzLCBhbmQgYmluYXJ5IHNlY3VyaXR5Cit0b2tlbnMsIGp1c3QgYXNzaWduIHRoZWlyIElkIHZhbHVlcyB3aXRoIGEgdW5pcXVlIHN0cmluZywgc3VjaCBhcyAiVGltZSIgZm9yCit0aW1lc3RhbXBzIGFuZCAiVXNlciIgZm9yIHVzZXIgbmFtZXMuIEZvciBleGFtcGxlOgorCitAY29kZQorICAgIHNvYXBfd3NzZV9hZGRfVGltZXN0YW1wKHNvYXAsICJUaW1lIiwgNjAwKTsKKyAgICBzb2FwX3dzc2VfYWRkX1VzZXJuYW1lVG9rZW5EaWdlc3Qoc29hcCwgIlVzZXIiLCAidXNlcm5hbWUiLCAicGFzc3dvcmQiKTsKKyAgICAuLi4gLy8gdGhlIHJlc3Qgb2YgdGhlIHNpZ25pbmcgY29kZQorQGVuZGNvZGUKKworQHN1YnNlY3Rpb24gd3NzZV84XzQgU2lnbmF0dXJlIFZhbGlkYXRpb24KKworVG8gYXV0b21hdGljYWxseSB2ZXJpZnkgdGhlIHNpZ25hdHVyZSBvZiBhbiBpbmJvdW5kIG1lc3NhZ2Ugc2lnbmVkIHdpdGggRFNBIG9yCitSU0EgYWxnb3JpdGhtcywgYXNzdW1pbmcgdGhlIG1lc3NhZ2UgY29udGFpbnMgdGhlIFg1MDkgY2VydGlmaWNhdGUgYXMgYSBiaW5hcnkKK3NlY3VyaXR5IHRva2VuLCB1c2U6CisKK0Bjb2RlCisgICAgc3RydWN0IHNvYXAgKnNvYXAgPSBzb2FwX25ldzEoU09BUF9YTUxfQ0FOT05JQ0FMIHwgU09BUF9YTUxfSU5ERU5UKTsKKyAgICBzb2FwX3JlZ2lzdGVyX3BsdWdpbihzb2FwLCBzb2FwX3dzc2UpOworICAgIHNvYXBfd3NzZV92ZXJpZnlfYXV0byhzb2FwLCBTT0FQX1NNRF9OT05FLCBOVUxMLCAwKTsKKworICAgIC8vIHNlcnZlcjoKKyAgICBpZiAoc29hcF9zZXJ2ZShzb2FwKSkKKyAgICAgIC4uLiAvLyBhbiBlcnJvciBvY2N1cnJlZAorCisgICAgLy8gY2xpZW50OgorICAgIGlmIChzb2FwX2NhbGxfbnNfX215TWV0aG9kKHNvYXAsIC4uLikpCisgICAgICAuLi4gLy8gYW4gZXJyb3Igb2NjdXJyZWQKK0BlbmRjb2RlCisKK0FsbCBsb2NhbGx5IHJlZmVyZW5jZWQgZWxlbWVudHMgaW4gdGhlIHNpZ25lZCBtZXNzYWdlIHdpbGwgYmUgdmVyaWZpZWQuCitFbGVtZW50cyByZWZlcmVuY2VkIHdpdGggYWJzb2x1dGUgVVJJcyBhcmUgbm90IGF1dG9tYXRpY2FsbHkgdmVyaWZpZWQuIFRoZQorcmVjZWl2ZWQgbWVzc2FnZSBpcyBzdG9yZWQgaW4gYSBET00gYWNjZXNzaWJsZSB3aXRoIHNvYXAtPmRvbS4gVGhpcyBlbmFibGVzCitmdXJ0aGVyIGFuYWx5c2lzIG9mIHRoZSBtZXNzYWdlIGNvbnRlbnQuCisKK1RoZSBAcmVmIHNvYXBfd3NzZV92ZXJpZnlfYXV0byBmdW5jdGlvbiBrZWVwcyBwcm9jZXNzaW5nIHNpZ25lZCAoYW5kIHVuc2lnbmVkKQorbWVzc2FnZXMgYXMgdGhleSBhcnJpdmUuIEZvciB1bnNpZ25lZCBtZXNzYWdlcyB0aGlzIGNhbiBiZSBleHBlbnNpdmUgYW5kIHRoZQordmVyaWZpY2F0aW9uIGVuZ2luZSBzaG91bGQgYmUgc2h1dCBkb3duIHVzaW5nIEByZWYgc29hcF93c3NlX3ZlcmlmeV9kb25lLgorCitUbyB2ZXJpZnkgdGhlIEhNQUMgc2lnbmF0dXJlIG9mIGFuIGluYm91bmQgbWVzc2FnZSwgdGhlIEhNQUMga2V5IG11c3QgYmUKK3N1cHBsaWVkOgorCitAY29kZQorICAgIHN0YXRpYyBjaGFyIGhtYWNfa2V5WzE2XSA9IC8vIHRoZSBzYW1lIHNlY3JldCBrZXkgdGhhdCB3YXMgdXNlZCB0byBzaWduCisgICAgeyAweGZmLCAweGVlLCAweGRkLCAweGNjLCAweGJiLCAweGFhLCAweDk5LCAweDg4LAorICAgICAgMHg3NywgMHg2NiwgMHg1NSwgMHg0NCwgMHgzMywgMHgyMiwgMHgxMSwgMHgwMCB9OworICAgIHN0cnVjdCBzb2FwICpzb2FwID0gc29hcF9uZXcxKFNPQVBfWE1MX0NBTk9OSUNBTCB8IFNPQVBfWE1MX0lOREVOVCk7CisgICAgc29hcF9yZWdpc3Rlcl9wbHVnaW4oc29hcCwgc29hcF93c3NlKTsKKyAgICBzb2FwX3dzc2VfdmVyaWZ5X2F1dG8oc29hcCwgU09BUF9TTURfSE1BQ19TSEExLCBobWFjX2tleSwgc2l6ZW9mKGhtYWNfa2V5KSk7CisKKyAgICAvLyBzZXJ2ZXI6CisgICAgaWYgKHNvYXBfc2VydmUoc29hcCkpCisgICAgICAuLi4gLy8gYW4gZXJyb3Igb2NjdXJyZWQKKworICAgIC8vIGNsaWVudDoKKyAgICBpZiAoc29hcF9jYWxsX25zX19teU1ldGhvZChzb2FwLCAuLi4pKQorICAgICAgLi4uIC8vIGFuIGVycm9yIG9jY3VycmVkCitAZW5kY29kZQorCitUbyBzdW1tYXJpemUgdGhlIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gcHJvY2VzczoKKy0jIFJlZ2lzdGVyIHRoZSB3c3NlIHBsdWdpbi4KKy0jIEZvciBITUFDLCBvYnRhaW4gdGhlIEhNQUMgc2VjcmV0IGtleQorLSMgVXNlIEByZWYgc29hcF93c3NlX3ZlcmlmeV9hdXRvIHRvIHZlcmlmeSBpbmJvdW5kIG1lc3NhZ2VzLgorLSMgQWZ0ZXIgcmVjZWl2aW5nIGEgbWVzc2FnZSwgdGhlIERPTSBpbiBzb2FwLT5kb20gY2FuIGJlIHRyYXZlcnNlZCBmb3IgZnVydGhlciAgICBhbmFseXNpcy4KKy0jIEFsd2F5cyBjaGVjayB0aGUgZnVuY3Rpb24gcmV0dXJuIHZhbHVlcyBmb3IgZXJyb3JzLiBZb3UgZG9uJ3Qgd2FudCB0byBhY2NlcHQKKyAgIGEgcmVxdWVzdCBvciByZXNwb25zZSBtZXNzYWdlIHdpdGggYW4gaW52YWxpZCBTZWN1cml0eSBoZWFkZXIuCistIyBVc2UgQHJlZiBzb2FwX3dzc2VfdmVyaWZ5X2RvbmUgdG8gdGVybWluYXRlIHZlcmlmaWNhdGlvbiwgZS5nLiB0byBjb25zdW1lCisgICBwbGFpbiBtZXNzYWdlcyBtb3JlIGVmZmljaWVudGx5LgorCitAc2VjdGlvbiB3c3NlXzkgRW5jcnlwdGlvbgorCitUaGUgbWF0ZXJpYWwgaW4gdGhpcyBzZWN0aW9uIHJlbGF0ZXMgdG8gdGhlIFdTLVNlY3VyaXR5IHNwZWNpZmljYXRpb24gc2VjdGlvbiA5LgorCitUT0RPIGl0ZW06IGVuY3J5cHRpb24gc3VwcG9ydCBpcyB1bmRlciBjb25zdHJ1Y3Rpb24uCisKK0BzZWN0aW9uIHdzc2VfMTAgU2VjdXJpdHkgVGltZXN0YW1wcworCitUaGUgbWF0ZXJpYWwgaW4gdGhpcyBzZWN0aW9uIHJlbGF0ZXMgdG8gdGhlIFdTLVNlY3VyaXR5IHNwZWNpZmljYXRpb24gc2VjdGlvbgorMTAuCisKK1RvIGFkZCBhIHRpbWVzdGFtcCB3aXRoIHRoZSBjcmVhdGlvbiB0aW1lIHRvIHRoZSBTZWN1cml0eSBoZWFkZXIsIHVzZToKKworQGNvZGUKKyAgICBzb2FwX3dzc2VfYWRkX1RpbWVzdGFtcChzb2FwLCBOVUxMLCAwKTsgLy8gbm8gZXhwaXJhdGlvbgorQGVuZGNvZGUKKworVGhlIGxpZmV0aW1lIG9mIGEgbWVzc2FnZSAoaW4gc2Vjb25kcykgaXMgcGFzc2VkIGFzIHRoZSB0aGlyZCBhcmd1bWVudCwgd2hpY2gKK3dpbGwgYmUgZGlzcGxheWVkIGFzIHRoZSB0aW1lc3RhbXAgZXhwaXJhdGlvbiB0aW1lOgorCitAY29kZQorICAgIHNvYXBfd3NzZV9hZGRfVGltZXN0YW1wKHNvYXAsIE5VTEwsIDEwKTsgLy8gMTAgc2Vjb25kcyBsaWZldGltZQorQGVuZGNvZGUKKworVGltZXN0YW1wcywgbGlrZSBvdGhlciBoZWFkZXIgZWxlbWVudHMsIGFyZSBub3QgYXV0b21hdGljYWxseSBzZWN1cmVkIHdpdGggYQorZGlnaXRhbCBzaWduYXR1cmUuIFRvIHNlY3VyZSBhIHRpbWVzdGFtcCwgd2UgYWRkIGFuIGlkZW50aWZpZXIgKHdzdTpJZCkgdG8gZWFjaAorZWxlbWVudCB3ZSB3YW50IHRoZSBXUy1TZWN1cml0eSBwbHVnaW4gdG8gc2lnbiB0aGVyZWJ5IG1ha2luZyBpdCBpbXBvc3NpYmxlIGZvcgorc29tZW9uZSB0byB0YW1wZXIgd2l0aCB0aGF0IHBhcnQgb2YgdGhlIG1lc3NhZ2UuIFRvIGRvIHRoaXMgZm9yIHRoZSB0aW1lc3RhbXAsCit3ZSBzaW1wbHkgcGFzcyBhIHVuaXF1ZSBpZGVudGlmaWNhdGlvbiBzdHJpbmcgYXMgdGhlIHNlY29uZCBhcmd1bWVudDoKKworQGNvZGUKKyAgICBzb2FwX3dzc2VfYWRkX1RpbWVzdGFtcChzb2FwLCAiVGltZSIsIDEwKTsgLy8gdGltZXN0YW1wIHdpbGwgYmUgc2lnbmVkCitAZW5kY29kZQorCisKKyovCisKKyNpbmNsdWRlICJ3c3NlYXBpLmgiCisjaW5jbHVkZSAic21kZXZwLmgiCisjaW5jbHVkZSAidGhyZWFkcy5oIgkvKiBvbmx5IG5lZWQgdGhyZWFkcyB0byBlbmFibGUgbXV0ZXggZm9yIE1UICovCisKKy8qKiBQbHVnaW4gaWRlbnRpZmljYXRpb24gZm9yIHBsdWdpbiByZWdpc3RyeSAqLworY29uc3QgY2hhciBzb2FwX3dzc2VfaWRbMTRdID0gU09BUF9XU1NFX0lEOworCisvKiogTWF4aW11bSBudW1iZXIgb2YgU2lnbmVkSW5mbyBSZWZlcmVuY2VzICovCisjZGVmaW5lIFNPQVBfV1NTRV9NQVhfUkVGCSgxMDApCisKKy8qKiBDbG9jayBza2V3IGJldHdlZW4gbWFjaGluZXMgKGluIHNlYykgdG8gZml0IG1lc3NhZ2UgZXhwaXJhdGlvbiBpbiB3aW5kb3cgKi8KKyNkZWZpbmUgU09BUF9XU1NFX0NMS1NLRVcJKDYwMCkKKworLyoqIFNpemUgb2YgdGhlIHJhbmRvbSBub25jZSAqLworI2RlZmluZSBTT0FQX1dTU0VfTk9OQ0VMRU4JKDIwKQorLyoqIERpZ2VzdCBhdXRoZW50aWNhdGlvbiBhY2NlcHRzIG1lc3NhZ2VzIHRoYXQgYXJlIG5vdCBvbGRlciB0aGFuIGNyZWF0aW9uIHRpbWUgKyBTT0FQX1dTU0VfTk9OQ0VUSU1FICovCisjZGVmaW5lIFNPQVBfV1NTRV9OT05DRVRJTUUJKFNPQVBfV1NTRV9DTEtTS0VXICsgMjQwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqIENvbW1vbiBVUklzCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworY29uc3QgY2hhciAqd3NzZV9QYXNzd29yZFRleHRVUkkgPSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy11c2VybmFtZS10b2tlbi1wcm9maWxlLTEuMCNQYXNzd29yZFRleHQiOworY29uc3QgY2hhciAqd3NzZV9QYXNzd29yZERpZ2VzdFVSSSA9ICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXVzZXJuYW1lLXRva2VuLXByb2ZpbGUtMS4wI1Bhc3N3b3JkRGlnZXN0IjsKK2NvbnN0IGNoYXIgKndzc2VfQmFzZTY0QmluYXJ5VVJJID0gImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtc29hcC1tZXNzYWdlLXNlY3VyaXR5LTEuMCNCYXNlNjRCaW5hcnkiOworY29uc3QgY2hhciAqd3NzZV9YNTA5djNVUkkgPSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy14NTA5LXRva2VuLXByb2ZpbGUtMS4wI1g1MDl2MyI7Citjb25zdCBjaGFyICp3c3NlX1g1MDl2M1N1YmplY3RLZXlJZGVudGlmaWVyVVJJID0gImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3MteDUwOS10b2tlbi1wcm9maWxlLTEuMCNYNTA5U3ViamVjdEtleUlkZW50aWZpZXIiOworCitjb25zdCBjaGFyICpkc19zaGExVVJJID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIjsKK2NvbnN0IGNoYXIgKmRzX2htYWNfc2hhMVVSSSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjaG1hYy1zaGExIjsKK2NvbnN0IGNoYXIgKmRzX2RzYV9zaGExVVJJID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNkc2Etc2hhMSI7Citjb25zdCBjaGFyICpkc19yc2Ffc2hhMVVSSSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjcnNhLXNoYTEiOworCitjb25zdCBjaGFyICpkc19VUkkgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI7Citjb25zdCBjaGFyICpjMTRuX1VSSSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiOworY29uc3QgY2hhciAqd3N1X1VSSSA9ICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktdXRpbGl0eS0xLjAueHNkIjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKiBEaWdlc3QgYXV0aGVudGljYXRpb24gc2Vzc2lvbgorICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorQHN0cnVjdCBzb2FwX3dzc2Vfc2Vzc2lvbgorQGJyaWVmIERpZ2VzdCBhdXRoZW50aWNhdGlvbiBzZXNzaW9uIGRhdGEKKyovCitzdHJ1Y3Qgc29hcF93c3NlX3Nlc3Npb24KK3sgc3RydWN0IHNvYXBfd3NzZV9zZXNzaW9uICpuZXh0OwkvKio8IE5leHQgc2Vzc2lvbiBpbiBsaXN0ICovCisgIHRpbWVfdCBleHBpcmVkOwkJCS8qKjwgU2Vzc2lvbiBleHBpcmF0aW9uICovCisgIGNoYXIgaGFzaFtTT0FQX1NNRF9TSEExX1NJWkVdOwkvKio8IFNIQTEgZGlnZXN0ICovCisgIGNoYXIgbm9uY2VbMV07IC8qKjwgTm9uY2Ugc3RyaW5nIGZsb3dzIGludG8gcmVnaW9uIGJlbG93IHRoaXMgc3RydWN0ICovCit9OworCisvKiogVGhlIGRpZ2VzdCBhdXRoZW50aWNhdGlvbiBzZXNzaW9uIGRhdGFiYXNlICovCitzdGF0aWMgc3RydWN0IHNvYXBfd3NzZV9zZXNzaW9uICpzb2FwX3dzc2Vfc2Vzc2lvbiA9IE5VTEw7CisKKy8qKiBMb2NrIGZvciBkaWdlc3QgYXV0aGVudGljYXRpb24gc2Vzc2lvbiBkYXRhYmFzZSBleGNsdXNpdmUgYWNjZXNzICovCitzdGF0aWMgTVVURVhfVFlQRSBzb2FwX3dzc2Vfc2Vzc2lvbl9sb2NrOworCitzdGF0aWMgaW50IHNvYXBfd3NzZV9zZXNzaW9uX3ZlcmlmeShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciBoYXNoW1NPQVBfU01EX1NIQTFfU0laRV0sIGNvbnN0IGNoYXIgKmNyZWF0ZWQsIGNvbnN0IGNoYXIgKm5vbmNlKTsKK3N0YXRpYyB2b2lkIHNvYXBfd3NzZV9zZXNzaW9uX2NsZWFudXAoc3RydWN0IHNvYXAgKnNvYXApOworc3RhdGljIHZvaWQgY2FsY19kaWdlc3Qoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmNyZWF0ZWQsIGNvbnN0IGNoYXIgKm5vbmNlLCBpbnQgbm9uY2VsZW4sIGNvbnN0IGNoYXIgKnBhc3N3b3JkLCBjaGFyIGhhc2hbU09BUF9TTURfU0hBMV9TSVpFXSk7CitzdGF0aWMgdm9pZCBjYWxjX25vbmNlKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyIG5vbmNlW1NPQVBfV1NTRV9OT05DRUxFTl0pOworCitzdGF0aWMgaW50IHNvYXBfd3NzZV9pbml0KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF93c3NlX2RhdGEgKmRhdGEpOworc3RhdGljIGludCBzb2FwX3dzc2VfY29weShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGx1Z2luICpkc3QsIHN0cnVjdCBzb2FwX3BsdWdpbiAqc3JjKTsKK3N0YXRpYyB2b2lkIHNvYXBfd3NzZV9kZWxldGUoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3BsdWdpbiAqcCk7CisKK3N0YXRpYyBpbnQgc29hcF93c3NlX3ByZXBhcmVpbml0KHN0cnVjdCBzb2FwICpzb2FwKTsKK3N0YXRpYyBpbnQgc29hcF93c3NlX3ByZXBhcmVzZW5kKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pOworc3RhdGljIGludCBzb2FwX3dzc2VfcHJlcGFyZWZpbmFsKHN0cnVjdCBzb2FwICpzb2FwKTsKK3N0YXRpYyB2b2lkIHNvYXBfd3NzZV9wcmVwYXJlY2xlYW51cChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfd3NzZV9kYXRhICpkYXRhKTsKK3N0YXRpYyBpbnQgc29hcF93c3NlX2Rpc2Nvbm5lY3Qoc3RydWN0IHNvYXAgKnNvYXApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqIHdzc2U6U2VjdXJpdHkgaGVhZGVyIGVsZW1lbnQKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKK0BmbiBfd3NzZV9fU2VjdXJpdHkqIHNvYXBfd3NzZV9hZGRfU2VjdXJpdHkoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYgQWRkcyBTZWN1cml0eSBoZWFkZXIgZWxlbWVudC4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0ByZXR1cm4gX3dzc2VfX1NlY3VyaXR5IG9iamVjdAorKi8KK3N0cnVjdCBfd3NzZV9fU2VjdXJpdHkqCitzb2FwX3dzc2VfYWRkX1NlY3VyaXR5KHN0cnVjdCBzb2FwICpzb2FwKQoreyBEQkdGVU4oInNvYXBfd3NzZV9hZGRfU2VjdXJpdHkiKTsKKyAgLyogaWYgd2UgZG9uJ3QgaGF2ZSBhIFNPQVAgSGVhZGVyLCBjcmVhdGUgb25lICovCisgIGlmICghc29hcC0+aGVhZGVyKQorICB7IHNvYXAtPmhlYWRlciA9IChzdHJ1Y3QgU09BUF9FTlZfX0hlYWRlciopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBTT0FQX0VOVl9fSGVhZGVyKSk7CisgICAgc29hcF9kZWZhdWx0X1NPQVBfRU5WX19IZWFkZXIoc29hcCwgc29hcC0+aGVhZGVyKTsgCisgIH0KKyAgLyogaWYgd2UgZG9uJ3QgaGF2ZSBhIHdzc2U6U2VjdXJpdHkgZWxlbWVudCBpbiB0aGUgU09BUCBIZWFkZXIsIGNyZWF0ZSBvbmUgKi8KKyAgaWYgKCFzb2FwLT5oZWFkZXItPndzc2VfX1NlY3VyaXR5KQorICB7IHNvYXAtPmhlYWRlci0+d3NzZV9fU2VjdXJpdHkgPSAoX3dzc2VfX1NlY3VyaXR5Kilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2YoX3dzc2VfX1NlY3VyaXR5KSk7CisgICAgc29hcF9kZWZhdWx0X193c3NlX19TZWN1cml0eShzb2FwLCBzb2FwLT5oZWFkZXItPndzc2VfX1NlY3VyaXR5KTsKKyAgfQorICByZXR1cm4gc29hcC0+aGVhZGVyLT53c3NlX19TZWN1cml0eTsKK30KKworLyoqCitAZm4gX3dzc2VfX1NlY3VyaXR5KiBzb2FwX3dzc2VfYWRkX1NlY3VyaXR5X2FjdG9yKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICphY3RvcikKK0BicmllZiBBZGRzIFNlY3VyaXR5IGhlYWRlciBlbGVtZW50IHdpdGggYWN0b3Igb3Igcm9sZSBhdHRyaWJ1dGUuCitAcGFyYW0gc29hcCBjb250ZXh0CitAcGFyYW0gYWN0b3Igc3RyaW5nCitAcmV0dXJuIF93c3NlX19TZWN1cml0eSBvYmplY3QKKyovCitzdHJ1Y3QgX3dzc2VfX1NlY3VyaXR5Kgorc29hcF93c3NlX2FkZF9TZWN1cml0eV9hY3RvcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqYWN0b3IpCit7IF93c3NlX19TZWN1cml0eSAqc2VjdXJpdHkgPSBzb2FwX3dzc2VfYWRkX1NlY3VyaXR5KHNvYXApOworICBEQkdGVU4xKCJzb2FwX3dzc2VfYWRkX1NlY3VyaXR5X2FjdG9yIiwgImFjdG9yPSVzIiwgYWN0b3IpOworICBpZiAoc29hcC0+bmFtZXNwYWNlcyAmJiAhc3RyY21wKHNvYXAtPm5hbWVzcGFjZXNbMF0ubnMsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIpKQorICAgIHNlY3VyaXR5LT5TT0FQX0VOVl9fYWN0b3IgPSBzb2FwX3N0cmR1cChzb2FwLCBhY3Rvcik7CisgIGVsc2UKKyAgICBzZWN1cml0eS0+U09BUF9FTlZfX3JvbGUgPSBzb2FwX3N0cmR1cChzb2FwLCBhY3Rvcik7CisgIHJldHVybiBzZWN1cml0eTsKK30KKworLyoqCitAZm4gdm9pZCBzb2FwX3dzc2VfZGVsZXRlX1NlY3VyaXR5KHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmIERlbGV0ZXMgU2VjdXJpdHkgaGVhZGVyIGVsZW1lbnQuCitAcGFyYW0gc29hcCBjb250ZXh0CisqLwordm9pZAorc29hcF93c3NlX2RlbGV0ZV9TZWN1cml0eShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgREJHRlVOKCJzb2FwX3dzc2VfZGVsZXRlX1NlY3VyaXR5Iik7CisgIGlmIChzb2FwLT5oZWFkZXIpCisgICAgc29hcC0+aGVhZGVyLT53c3NlX19TZWN1cml0eSA9IE5VTEw7Cit9CisKKy8qKgorQGZuIF93c3NlX19TZWN1cml0eSogc29hcF93c3NlX1NlY3VyaXR5KHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmIFJldHVybnMgU2VjdXJpdHkgaGVhZGVyIGVsZW1lbnQgaWYgcHJlc2VudC4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0ByZXR1cm4gX3dzc2VfX1NlY3VyaXR5IG9iamVjdCBvciBOVUxMCisqLworc3RydWN0IF93c3NlX19TZWN1cml0eSoKK3NvYXBfd3NzZV9TZWN1cml0eShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXAtPmhlYWRlcikKKyAgICByZXR1cm4gc29hcC0+aGVhZGVyLT53c3NlX19TZWN1cml0eTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICogd3NzZTpTZWN1cml0eS9kczpTaWduYXR1cmUgaGVhZGVyIGVsZW1lbnQKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKK0BmbiBkc19fU2lnbmF0dXJlVHlwZSogc29hcF93c3NlX2FkZF9TaWduYXR1cmUoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYgQWRkcyBTaWduYXR1cmUgaGVhZGVyIGVsZW1lbnQuCitAcGFyYW0gc29hcCBjb250ZXh0CitAcmV0dXJuIGRzX19TaWduYXR1cmVUeXBlIG9iamVjdAorKi8KK3N0cnVjdCBkc19fU2lnbmF0dXJlVHlwZSoKK3NvYXBfd3NzZV9hZGRfU2lnbmF0dXJlKHN0cnVjdCBzb2FwICpzb2FwKQoreyBfd3NzZV9fU2VjdXJpdHkgKnNlY3VyaXR5ID0gc29hcF93c3NlX2FkZF9TZWN1cml0eShzb2FwKTsKKyAgREJHRlVOKCJzb2FwX3dzc2VfYWRkX1NpZ25hdHVyZSIpOworICAvKiBpZiB3ZSBkb24ndCBoYXZlIGEgZHM6U2lnbmF0dXJlLCBjcmVhdGUgb25lICovCisgIGlmICghc2VjdXJpdHktPmRzX19TaWduYXR1cmUpCisgIHsgc2VjdXJpdHktPmRzX19TaWduYXR1cmUgPSAoZHNfX1NpZ25hdHVyZVR5cGUqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihkc19fU2lnbmF0dXJlVHlwZSkpOworICAgIHNvYXBfZGVmYXVsdF9kc19fU2lnbmF0dXJlVHlwZShzb2FwLCBzZWN1cml0eS0+ZHNfX1NpZ25hdHVyZSk7IAorICB9CisgIHJldHVybiBzZWN1cml0eS0+ZHNfX1NpZ25hdHVyZTsKK30KKworLyoqCitAZm4gdm9pZCBzb2FwX3dzc2VfZGVsZXRlX1NpZ25hdHVyZShzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZiBEZWxldGVzIFNpZ25hdHVyZSBoZWFkZXIgZWxlbWVudC4KK0BwYXJhbSBzb2FwIGNvbnRleHQKKyovCit2b2lkCitzb2FwX3dzc2VfZGVsZXRlX1NpZ25hdHVyZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgX3dzc2VfX1NlY3VyaXR5ICpzZWN1cml0eSA9IHNvYXBfd3NzZV9TZWN1cml0eShzb2FwKTsKKyAgREJHRlVOKCJzb2FwX3dzc2VfZGVsZXRlX1NpZ25hdHVyZSIpOworICBpZiAoc2VjdXJpdHkpCisgICAgc2VjdXJpdHktPmRzX19TaWduYXR1cmUgPSBOVUxMOworfQorCisvKioKK0BmbiBkc19fU2lnbmF0dXJlVHlwZSogc29hcF93c3NlX1NpZ25hdHVyZShzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZiBSZXR1cm5zIFNpZ25hdHVyZSBoZWFkZXIgZWxlbWVudCBpZiBwcmVzZW50LgorQHBhcmFtIHNvYXAgY29udGV4dAorQHJldHVybiBkc19fU2lnbmF0dXJlVHlwZSBvYmplY3Qgb3IgTlVMTAorKi8KK3N0cnVjdCBkc19fU2lnbmF0dXJlVHlwZSoKK3NvYXBfd3NzZV9TaWduYXR1cmUoc3RydWN0IHNvYXAgKnNvYXApCit7IF93c3NlX19TZWN1cml0eSAqc2VjdXJpdHkgPSBzb2FwX3dzc2VfU2VjdXJpdHkoc29hcCk7CisgIGlmIChzZWN1cml0eSkKKyAgICByZXR1cm4gc2VjdXJpdHktPmRzX19TaWduYXR1cmU7CisgIHJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqIHdzc2U6U2VjdXJpdHkvd3N1OlRpbWVzdGFtcCBoZWFkZXIgZWxlbWVudAorICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorQGZuIGludCBzb2FwX3dzc2VfYWRkX1RpbWVzdGFtcChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIHRpbWVfdCBsaWZldGltZSkKK0BicmllZiBBZGRzIFRpbWVzdGFtcCBlbGVtZW50IHdpdGggb3B0aW9uYWwgZXhwaXJhdGlvbiBkYXRlK3RpbWUgKGxpZmV0aW1lKS4KK0BwYXJhbVtpbl0gc29hcCBjb250ZXh0CitAcGFyYW1baW5dIGlkIGZvciBzaWduYXR1cmUgcmVmZXJlbmNpbmcgb3IgTlVMTAorQHBhcmFtW2luXSBsaWZldGltZSBleHByZXNzZWQgaW4gdGltZV90IHVuaXRzLCBvciAwIGZvciBubyBleHBpcmF0aW9uCitAcmV0dXJuIFNPQVBfT0sKKyovCitpbnQKK3NvYXBfd3NzZV9hZGRfVGltZXN0YW1wKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgdGltZV90IGxpZmV0aW1lKQoreyBfd3NzZV9fU2VjdXJpdHkgKnNlY3VyaXR5ID0gc29hcF93c3NlX2FkZF9TZWN1cml0eShzb2FwKTsKKyAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CisgIGNoYXIgKmNyZWF0ZWQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwX2RhdGVUaW1lMnMoc29hcCwgbm93KSk7CisgIGNoYXIgKmV4cGlyZWQgPSBsaWZldGltZSA/IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXBfZGF0ZVRpbWUycyhzb2FwLCBub3cgKyBsaWZldGltZSkpIDogTlVMTDsKKyAgREJHRlVOMSgic29hcF93c3NlX2FkZF9UaW1lc3RhbXAiLCAiaWQ9JXMiLCBpZD9pZDoiIik7CisgIC8qIGFsbG9jYXRlIGEgVGltZXN0YW1wIGlmIHdlIGRvbid0IGhhdmUgb25lIGFscmVhZHkgKi8KKyAgaWYgKCFzZWN1cml0eS0+d3N1X19UaW1lc3RhbXApCisgICAgc2VjdXJpdHktPndzdV9fVGltZXN0YW1wID0gKF93c3VfX1RpbWVzdGFtcCopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKF93c3VfX1RpbWVzdGFtcCkpOworICBzb2FwX2RlZmF1bHRfX3dzdV9fVGltZXN0YW1wKHNvYXAsIHNlY3VyaXR5LT53c3VfX1RpbWVzdGFtcCk7CisgIC8qIHBvcHVsYXRlIHRoZSB3c3U6VGltZXN0YW1wIGVsZW1lbnQgKi8KKyAgc2VjdXJpdHktPndzdV9fVGltZXN0YW1wLT53c3VfX0lkID0gc29hcF9zdHJkdXAoc29hcCwgaWQpOworICBzZWN1cml0eS0+d3N1X19UaW1lc3RhbXAtPkNyZWF0ZWQgPSBjcmVhdGVkOworICBzZWN1cml0eS0+d3N1X19UaW1lc3RhbXAtPkV4cGlyZXMgPSBleHBpcmVkOworICByZXR1cm4gU09BUF9PSzsKK30KKworLyoqCitAZm4gX3dzdV9fVGltZXN0YW1wICpzb2FwX3dzc2VfVGltZXN0YW1wKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmIFJldHVybnMgVGltZXN0YW1wIGVsZW1lbnQgaWYgcHJlc2VudC4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0ByZXR1cm4gX3dzdV9fVGltZXN0YW1wIG9iamVjdCBvciBOVUxMCisqLworc3RydWN0IF93c3VfX1RpbWVzdGFtcCoKK3NvYXBfd3NzZV9UaW1lc3RhbXAoc3RydWN0IHNvYXAgKnNvYXApCit7IF93c3NlX19TZWN1cml0eSAqc2VjdXJpdHkgPSBzb2FwX3dzc2VfU2VjdXJpdHkoc29hcCk7CisgIGlmIChzZWN1cml0eSkKKyAgICByZXR1cm4gc2VjdXJpdHktPndzdV9fVGltZXN0YW1wOworICByZXR1cm4gTlVMTDsKK30KKworLyoqCitAZm4gaW50IHNvYXBfd3NzZV92ZXJpZnlfVGltZXN0YW1wKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmIFZlcmlmaWVzIHRoZSBUaW1lc3RhbXAvRXhwaXJlcyBlbGVtZW50IGFnYWluc3QgdGhlIGN1cnJlbnQgdGltZS4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0ByZXR1cm4gU09BUF9PSyBvciBTT0FQX0ZBVUxUIHdpdGggd3NzZTpGYWlsZWRBdXRoZW50aWNhdGlvbiBmYXVsdAorCitTZXRzIHdzc2U6RmFpbGVkQXV0aGVudGljYXRpb24gZmF1bHQgaWYgd3N1OlRpbWVzdGFtcCBpcyBleHBpcmVkLiBUaGUKK1NPQVBfV1NTRV9DTEtTS0VXIHZhbHVlIGlzIHVzZWQgYXMgYSBtYXJnaW4gdG8gbWl0aWdhdGUgY2xvY2sgc2tldy4gS2VlcHMKK3NpbGVudCB3aGVuIG5vIHRpbWVzdGFtcCBpcyBzdXBwbGllZCBvciBubyBleHBpcmF0aW9uIGRhdGUgaXMgaW5jbHVkZWQgaW4gdGhlCit3c3U6VGltZXN0YW1wIGVsZW1lbnQuCisqLworaW50Citzb2FwX3dzc2VfdmVyaWZ5X1RpbWVzdGFtcChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgX3dzdV9fVGltZXN0YW1wICp0aW1lc3RhbXAgPSBzb2FwX3dzc2VfVGltZXN0YW1wKHNvYXApOworICBEQkdGVU4oInNvYXBfd3NzZV92ZXJpZnlfVGltZXN0YW1wIik7CisgIC8qIGlmIHdlIGhhdmUgYSB0aW1lc3RhbXAgd2l0aCBhbiBleHBpcmF0aW9uIGRhdGUsIGNoZWNrIGl0ICovCisgIGlmICh0aW1lc3RhbXAgJiYgdGltZXN0YW1wLT5FeHBpcmVzKQorICB7IHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpLCBleHBpcmVkOworICAgIHNvYXBfczJkYXRlVGltZShzb2FwLCB0aW1lc3RhbXAtPkV4cGlyZXMsICZleHBpcmVkKTsKKyAgICBpZiAoZXhwaXJlZCArIFNPQVBfV1NTRV9DTEtTS0VXIDw9IG5vdykKKyAgICB7IGNvbnN0IGNoYXIgKmNvZGUgPSBzb2FwX3dzdV9fdFRpbWVzdGFtcEZhdWx0MnMoc29hcCwgMCk7CisgICAgICByZXR1cm4gc29hcF9zZW5kZXJfZmF1bHRfc3ViY29kZShzb2FwLCBjb2RlLCAiTWVzc2FnZSBoYXMgZXhwaXJlZCIsIHRpbWVzdGFtcC0+RXhwaXJlcyk7CisgICAgfQorICB9CisgIHJldHVybiBTT0FQX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqIHdzc2U6U2VjdXJpdHkvVXNlcm5hbWVUb2tlbiBoZWFkZXIgZWxlbWVudAorICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorQGZuIGludCBzb2FwX3dzc2VfYWRkX1VzZXJuYW1lVG9rZW5UZXh0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqdXNlcm5hbWUsIGNvbnN0IGNoYXIgKnBhc3N3b3JkKQorQGJyaWVmIEFkZHMgVXNlcm5hbWVUb2tlbiBlbGVtZW50IHdpdGggb3B0aW9uYWwgY2xlYXItdGV4dCBwYXNzd29yZC4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0BwYXJhbVtpbl0gaWQgc3RyaW5nIGZvciBzaWduYXR1cmUgcmVmZXJlbmNpbmcgb3IgTlVMTAorQHBhcmFtW2luXSB1c2VybmFtZSBzdHJpbmcKK0BwYXJhbVtpbl0gcGFzc3dvcmQgc3RyaW5nIG9yIE5VTEwgdG8gb21pdCB0aGUgcGFzc3dvcmQKK0ByZXR1cm4gU09BUF9PSworCitQYXNzd29yZHMgYXJlIHNlbnQgaW4gdGhlIGNsZWFyLCBzbyB0cmFuc3BvcnQtbGV2ZWwgZW5jcnlwdGlvbiBpcyByZXF1aXJlZC4KK05vdGU6IHRoaXMgcmVsZWFzZSBzdXBwb3J0cyB0aGUgdXNlIG9mIGF0IG1vc3Qgb25lIFVzZXJuYW1lVG9rZW4gaW4gdGhlIGhlYWRlci4KKyovCitpbnQKK3NvYXBfd3NzZV9hZGRfVXNlcm5hbWVUb2tlblRleHQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICp1c2VybmFtZSwgY29uc3QgY2hhciAqcGFzc3dvcmQpCit7IF93c3NlX19TZWN1cml0eSAqc2VjdXJpdHkgPSBzb2FwX3dzc2VfYWRkX1NlY3VyaXR5KHNvYXApOworICBEQkdGVU4yKCJzb2FwX3dzc2VfYWRkX1VzZXJuYW1lVG9rZW5UZXh0IiwgImlkPSVzIiwgaWQ/aWQ6IiIsICJ1c2VybmFtZT0lcyIsIHVzZXJuYW1lP3VzZXJuYW1lOiIiKTsKKyAgLyogYWxsb2NhdGUgYSBVc2VybmFtZVRva2VuIGlmIHdlIGRvbid0IGhhdmUgb25lIGFscmVhZHkgKi8KKyAgaWYgKCFzZWN1cml0eS0+VXNlcm5hbWVUb2tlbikKKyAgICBzZWN1cml0eS0+VXNlcm5hbWVUb2tlbiA9IChfd3NzZV9fVXNlcm5hbWVUb2tlbiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKF93c3NlX19Vc2VybmFtZVRva2VuKSk7CisgIHNvYXBfZGVmYXVsdF9fd3NzZV9fVXNlcm5hbWVUb2tlbihzb2FwLCBzZWN1cml0eS0+VXNlcm5hbWVUb2tlbik7CisgIC8qIHBvcHVsYXRlIHRoZSBVc2VybmFtZVRva2VuICovCisgIHNlY3VyaXR5LT5Vc2VybmFtZVRva2VuLT53c3VfX0lkID0gc29hcF9zdHJkdXAoc29hcCwgaWQpOworICBzZWN1cml0eS0+VXNlcm5hbWVUb2tlbi0+VXNlcm5hbWUgPSBzb2FwX3N0cmR1cChzb2FwLCB1c2VybmFtZSk7CisgIC8qIGFsbG9jYXRlIGFuZCBwb3B1bGF0ZSB0aGUgUGFzc3dvcmQgKi8KKyAgaWYgKHBhc3N3b3JkKQorICB7IHNlY3VyaXR5LT5Vc2VybmFtZVRva2VuLT5QYXNzd29yZCA9IChfd3NzZV9fUGFzc3dvcmQqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihfd3NzZV9fUGFzc3dvcmQpKTsKKyAgICBzb2FwX2RlZmF1bHRfX3dzc2VfX1Bhc3N3b3JkKHNvYXAsIHNlY3VyaXR5LT5Vc2VybmFtZVRva2VuLT5QYXNzd29yZCk7CisgICAgc2VjdXJpdHktPlVzZXJuYW1lVG9rZW4tPlBhc3N3b3JkLT5UeXBlID0gKGNoYXIqKXdzc2VfUGFzc3dvcmRUZXh0VVJJOworICAgIHNlY3VyaXR5LT5Vc2VybmFtZVRva2VuLT5QYXNzd29yZC0+X19pdGVtID0gc29hcF9zdHJkdXAoc29hcCwgcGFzc3dvcmQpOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorCisvKioKK0BmbiBpbnQgc29hcF93c3NlX2FkZF9Vc2VybmFtZVRva2VuRGlnZXN0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqdXNlcm5hbWUsIGNvbnN0IGNoYXIgKnBhc3N3b3JkKQorQGJyaWVmIEFkZHMgVXNlcm5hbWVUb2tlbiBlbGVtZW50IGZvciBkaWdlc3QgYXV0aGVudGljYXRpb24uCitAcGFyYW0gc29hcCBjb250ZXh0CitAcGFyYW1baW5dIGlkIHN0cmluZyBmb3Igc2lnbmF0dXJlIHJlZmVyZW5jaW5nIG9yIE5VTEwKK0BwYXJhbVtpbl0gdXNlcm5hbWUgc3RyaW5nCitAcGFyYW1baW5dIHBhc3N3b3JkIHN0cmluZworQHJldHVybiBTT0FQX09LCisKK0NvbXB1dGVzIFNIQTEgZGlnZXN0IG9mIHRoZSB0aW1lIHN0YW1wLCBhIG5vbmNlLCBhbmQgdGhlIHBhc3N3b3JkLiBUaGUgZGlnZXN0Citwcm92aWRlcyB0aGUgYXV0aGVudGljYXRpb24gY3JlZGVudGlhbHMuIFBhc3N3b3JkcyBhcmUgTk9UIHNlbnQgaW4gdGhlIGNsZWFyLgorTm90ZTogdGhpcyByZWxlYXNlIHN1cHBvcnRzIHRoZSB1c2Ugb2YgYXQgbW9zdCBvbmUgVXNlcm5hbWVUb2tlbiBpbiB0aGUgaGVhZGVyLgorKi8KK2ludAorc29hcF93c3NlX2FkZF9Vc2VybmFtZVRva2VuRGlnZXN0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqdXNlcm5hbWUsIGNvbnN0IGNoYXIgKnBhc3N3b3JkKQoreyBfd3NzZV9fU2VjdXJpdHkgKnNlY3VyaXR5ID0gc29hcF93c3NlX2FkZF9TZWN1cml0eShzb2FwKTsKKyAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CisgIGNvbnN0IGNoYXIgKmNyZWF0ZWQgPSBzb2FwX2RhdGVUaW1lMnMoc29hcCwgbm93KTsKKyAgY2hhciBIQVtTT0FQX1NNRF9TSEExX1NJWkVdLCBIQUJhc2U2NFsyOV07CisgIGNoYXIgbm9uY2VbU09BUF9XU1NFX05PTkNFTEVOXSwgKm5vbmNlQmFzZTY0OworICBEQkdGVU4yKCJzb2FwX3dzc2VfYWRkX1VzZXJuYW1lVG9rZW5EaWdlc3QiLCAiaWQ9JXMiLCBpZD9pZDoiIiwgInVzZXJuYW1lPSVzIiwgdXNlcm5hbWU/dXNlcm5hbWU6IiIpOworICAvKiBnZW5lcmF0ZSBhIG5vbmNlICovCisgIGNhbGNfbm9uY2Uoc29hcCwgbm9uY2UpOworICBub25jZUJhc2U2NCA9IHNvYXBfczJiYXNlNjQoc29hcCwgbm9uY2UsIE5VTEwsIFNPQVBfV1NTRV9OT05DRUxFTik7CisgIC8qIFRPRE86IHRoZSBzcGVjcyBhcmUgbm90IGNsZWFyOiBjb21wdXRlIGRpZ2VzdCBvdmVyIGJpbmFyeSBub25jZSBvciBiYXNlNjQgbm9uY2U/CisgIGNhbGNfZGlnZXN0KHNvYXAsIGNyZWF0ZWQsIG5vbmNlLCBTT0FQX1dTU0VfTk9OQ0VMRU4sIHBhc3N3b3JkLCBIQSk7ICovCisgIC8qIGNvbXB1dGUgU0hBMShjcmVhdGVkLCBub25jZSwgcGFzc3dvcmQpICovCisgIGNhbGNfZGlnZXN0KHNvYXAsIGNyZWF0ZWQsIG5vbmNlQmFzZTY0LCBzdHJsZW4obm9uY2VCYXNlNjQpLCBwYXNzd29yZCwgSEEpOworICBzb2FwX3MyYmFzZTY0KHNvYXAsIEhBLCBIQUJhc2U2NCwgU09BUF9TTURfU0hBMV9TSVpFKTsKKyAgLyogcG9wdWxhdGUgdGhlIFVzZXJuYW1lVG9rZW4gd2l0aCBkaWdlc3QgKi8KKyAgc29hcF93c3NlX2FkZF9Vc2VybmFtZVRva2VuVGV4dChzb2FwLCBpZCwgdXNlcm5hbWUsIEhBQmFzZTY0KTsKKyAgLyogcG9wdWxhdGUgdGhlIHJlbWFpbmRlciBvZiB0aGUgcGFzc3dvcmQsIG5vbmNlLCBhbmQgY3JlYXRlZCAqLworICBzZWN1cml0eS0+VXNlcm5hbWVUb2tlbi0+UGFzc3dvcmQtPlR5cGUgPSAoY2hhciopd3NzZV9QYXNzd29yZERpZ2VzdFVSSTsKKyAgc2VjdXJpdHktPlVzZXJuYW1lVG9rZW4tPk5vbmNlID0gbm9uY2VCYXNlNjQ7CisgIHNlY3VyaXR5LT5Vc2VybmFtZVRva2VuLT53c3VfX0NyZWF0ZWQgPSBzb2FwX3N0cmR1cChzb2FwLCBjcmVhdGVkKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKgorQGZuIF93c3NlX19Vc2VybmFtZVRva2VuKiBzb2FwX3dzc2VfVXNlcm5hbWVUb2tlbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQpCitAYnJpZWYgUmV0dXJucyBVc2VybmFtZVRva2VuIGVsZW1lbnQgaWYgcHJlc2VudC4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0BwYXJhbVtpbl0gaWQgc3RyaW5nIG9mIFVzZXJuYW1lVG9rZW4gb3IgTlVMTAorQHJldHVybiBfd3NzZV9fVXNlcm5hbWVUb2tlbiBvYmplY3Qgb3IgTlVMTAorCitOb3RlOiB0aGlzIHJlbGVhc2Ugc3VwcG9ydHMgdGhlIHVzZSBvZiBhdCBtb3N0IG9uZSBVc2VybmFtZVRva2VuIGluIHRoZSBoZWFkZXIuCisqLworc3RydWN0IF93c3NlX19Vc2VybmFtZVRva2VuKgorc29hcF93c3NlX1VzZXJuYW1lVG9rZW4oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkKQoreyBfd3NzZV9fU2VjdXJpdHkgKnNlY3VyaXR5ID0gc29hcF93c3NlX1NlY3VyaXR5KHNvYXApOworICBpZiAoc2VjdXJpdHkKKyAgICYmIHNlY3VyaXR5LT5Vc2VybmFtZVRva2VuCisgICAmJiAoIWlkIHx8IChzZWN1cml0eS0+VXNlcm5hbWVUb2tlbi0+d3N1X19JZAorICAgICAgICAgICAgJiYgIXN0cmNtcChzZWN1cml0eS0+VXNlcm5hbWVUb2tlbi0+d3N1X19JZCwgaWQpKSkpCisgICAgcmV0dXJuIHNlY3VyaXR5LT5Vc2VybmFtZVRva2VuOworICByZXR1cm4gTlVMTDsKK30KKworLyoqCitAZm4gY29uc3QgY2hhciogc29hcF93c3NlX2dldF9Vc2VybmFtZShzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZiBSZXR1cm5zIFVzZXJuYW1lVG9rZW4vdXNlcm5hbWUgc3RyaW5nIG9yIHdzc2U6RmFpbGVkQXV0aGVudGljYXRpb24gZmF1bHQuCitAcGFyYW0gc29hcCBjb250ZXh0CitAcmV0dXJuIFVzZXJuYW1lVG9rZW4vdXNlcm5hbWUgc3RyaW5nIG9yIE5VTEwgd2l0aCB3c3NlOkZhaWxlZEF1dGhlbnRpY2F0aW9uIGZhdWx0IGVycm9yIHNldAorQHNlZSBzb2FwX3dzc2VfdmVyaWZ5X1Bhc3N3b3JkCisKK1RoZSByZXR1cm5lZCB1c2VybmFtZSBzaG91bGQgYmUgdXNlZCB0byBsb29rdXAgdGhlIHVzZXIncyBwYXNzd29yZCBpbiBhCitkaWN0aW9uYXJ5IG9yIGRhdGFiYXNlIGZvciBzZXJ2ZXItc2lkZSBhdXRoZW50aWNhdGlvbiB3aXRoCitzb2FwX3dzc2VfdmVyaWZ5X1Bhc3N3b3JkLgorKi8KK2NvbnN0IGNoYXIqCitzb2FwX3dzc2VfZ2V0X1VzZXJuYW1lKHN0cnVjdCBzb2FwICpzb2FwKQoreyBfd3NzZV9fVXNlcm5hbWVUb2tlbiAqdG9rZW4gPSBzb2FwX3dzc2VfVXNlcm5hbWVUb2tlbihzb2FwLCBOVUxMKTsKKyAgREJHRlVOKCJzb2FwX3dzc2VfZ2V0X1VzZXJuYW1lIik7CisgIGlmICh0b2tlbikKKyAgICByZXR1cm4gdG9rZW4tPlVzZXJuYW1lOworICBzb2FwX3dzc2VfZmF1bHQoc29hcCwgd3NzZV9fRmFpbGVkQXV0aGVudGljYXRpb24sICJBdXRoZW50aWNhdGlvbiByZXF1aXJlZCIpOworICByZXR1cm4gTlVMTDsKK30KKworLyoqCitAZm4gaW50IHNvYXBfd3NzZV92ZXJpZnlfUGFzc3dvcmQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnBhc3N3b3JkKQorQGJyaWVmIFZlcmlmaWVzIHRoZSBzdXBwbGllZCBwYXNzd29yZCBvciBzZXRzIHdzc2U6RmFpbGVkQXV0aGVudGljYXRpb24gZmF1bHQuCitAcGFyYW0gc29hcCBjb250ZXh0CitAcGFyYW1baW5dIHBhc3N3b3JkIHN0cmluZyB0byB2ZXJpZnkgYWdhaW5zdAorQHJldHVybiBTT0FQX09LIChhdXRob3JpemVkKSBvciBTT0FQX0ZBVUxUIHdpdGggd3NzZTpGYWlsZWRBdXRoZW50aWNhdGlvbiBmYXVsdAorCitUaGUgdmVyaWZpY2F0aW9uIHN1cHBvcnRzIGJvdGggY2xlYXItdGV4dCBwYXNzd29yZCB2ZXJpZmljYXRpb24gYW5kIGRpZ2VzdAorcGFzc3dvcmQgYXV0aGVudGljYXRpb24uIEZvciBkaWdlc3QgYXV0aGVudGljYXRpb24gYSBoaXN0b3J5IG1lY2hhbmlzbSB3aXRoIGEKK2RpZ2VzdCBhdXRoZW50aWNhdGlvbiBzZXNzaW9uIGRhdGFiYXNlIGVuc3VyZXMgcHJvdGVjdGlvbiBhZ2FpbnN0IHJlcGxheQorYXR0YWNrcy4KK05vdGU6IHRoaXMgcmVsZWFzZSBzdXBwb3J0cyB0aGUgdXNlIG9mIGF0IG1vc3Qgb25lIFVzZXJuYW1lVG9rZW4gaW4gdGhlIGhlYWRlci4KKyovCitpbnQKK3NvYXBfd3NzZV92ZXJpZnlfUGFzc3dvcmQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnBhc3N3b3JkKQoreyBfd3NzZV9fVXNlcm5hbWVUb2tlbiAqdG9rZW4gPSBzb2FwX3dzc2VfVXNlcm5hbWVUb2tlbihzb2FwLCBOVUxMKTsKKyAgREJHRlVOKCJzb2FwX3dzc2VfdmVyaWZ5X1Bhc3N3b3JkIik7CisgIC8qIGlmIHdlIGhhdmUgYSBVc2VybmFtZVRva2VuIHdpdGggYSBQYXNzd29yZCwgY2hlY2sgaXQgKi8KKyAgaWYgKHRva2VuICYmIHRva2VuLT5QYXNzd29yZCkKKyAgeyAvKiBwYXNzd29yZCBkaWdlc3Qgb3IgdGV4dD8gKi8KKyAgICBpZiAodG9rZW4tPlBhc3N3b3JkLT5UeXBlCisgICAgICYmICFzdHJjbXAodG9rZW4tPlBhc3N3b3JkLT5UeXBlLCB3c3NlX1Bhc3N3b3JkRGlnZXN0VVJJKSkKKyAgICB7IC8qIGNoZWNrIHBhc3N3b3JkIGRpZ2VzdDogY29tcHV0ZSBTSEExKGNyZWF0ZWQsIG5vbmNlLCBwYXNzd29yZCkgKi8KKyAgICAgIGlmICh0b2tlbi0+Tm9uY2UKKyAgICAgICAmJiB0b2tlbi0+d3N1X19DcmVhdGVkCisgICAgICAgJiYgc3RybGVuKHRva2VuLT5QYXNzd29yZC0+X19pdGVtKSA9PSAyOCkJLyogZGlnZXN0IHB3IGxlbiA9IDI4ICovCisgICAgICB7IGNoYXIgSEExW1NPQVBfU01EX1NIQTFfU0laRV0sIEhBMltTT0FQX1NNRF9TSEExX1NJWkVdOworCS8qIFRPRE86IHRoZSBzcGVjcyBhcmUgbm90IGNsZWFyOiBjb21wdXRlIGRpZ2VzdCBvdmVyIGJpbmFyeSBub25jZSBvciBiYXNlNjQgbm9uY2U/CisgICAgICAgIGludCBub25jZWxlbjsKKwljb25zdCBjaGFyICpub25jZSA9IHNvYXBfYmFzZTY0MnMoc29hcCwgdG9rZW4tPk5vbmNlLCBOVUxMLCAwLCAmbm9uY2VsZW4pOworICAgICAgICBjYWxjX2RpZ2VzdChzb2FwLCB0b2tlbi0+d3N1X19DcmVhdGVkLCBub25jZSwgbm9uY2VsZW4sIHBhc3N3b3JkLCBIQTEpOyAqLworICAgICAgICAvKiBjb21wdXRlIEhBMSA9IFNIQTEoY3JlYXRlZCwgbm9uY2UsIHBhc3N3b3JkKSAqLworICAgICAgICBjYWxjX2RpZ2VzdChzb2FwLCB0b2tlbi0+d3N1X19DcmVhdGVkLCB0b2tlbi0+Tm9uY2UsIHN0cmxlbih0b2tlbi0+Tm9uY2UpLCBwYXNzd29yZCwgSEExKTsKKwkvKiBnZXQgSEEyID0gc3VwcGxpZWQgZGlnZXN0IGZyb20gYmFzZTY0IFBhc3N3b3JkICovCisgICAgICAgIHNvYXBfYmFzZTY0MnMoc29hcCwgdG9rZW4tPlBhc3N3b3JkLT5fX2l0ZW0sIEhBMiwgU09BUF9TTURfU0hBMV9TSVpFLCBOVUxMKTsKKyAgICAgICAgLyogY29tcGFyZSBIQTEgdG8gSEEyICovCisgICAgICAgIGlmICghbWVtY21wKEhBMSwgSEEyLCBTT0FQX1NNRF9TSEExX1NJWkUpKQorCXsgLyogYXV0aG9yaXplIGlmIEhBMSBhbmQgSEEyIGlkZW50aWNhbCBhbmQgbm90IHJlcGxheSBhdHRhY2sgKi8KKyAgICAgICAgICBpZiAoIXNvYXBfd3NzZV9zZXNzaW9uX3ZlcmlmeShzb2FwLCBIQTEsIHRva2VuLT53c3VfX0NyZWF0ZWQsIHRva2VuLT5Ob25jZSkpCisJICAgIHJldHVybiBTT0FQX09LOworICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsgCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgLyogY2hlY2sgcGFzc3dvcmQgdGV4dCAqLworICAgICAgaWYgKCFzdHJjbXAodG9rZW4tPlBhc3N3b3JkLT5fX2l0ZW0sIHBhc3N3b3JkKSkKKyAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgfQorICB9CisgIHJldHVybiBzb2FwX3dzc2VfZmF1bHQoc29hcCwgd3NzZV9fRmFpbGVkQXV0aGVudGljYXRpb24sICJBdXRoZW50aWNhdGlvbiByZXF1aXJlZCIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqIHdzc2U6U2VjdXJpdHkvQmluYXJ5U2VjdXJpdHlUb2tlbiBoZWFkZXIgZWxlbWVudAorICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorQGZuIGludCBzb2FwX3dzc2VfYWRkX0JpbmFyeVNlY3VyaXR5VG9rZW4oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICp2YWx1ZVR5cGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBzaXplKQorQGJyaWVmIEFkZHMgQmluYXJ5U2VjdXJpdHlUb2tlbiBlbGVtZW50LgorQHBhcmFtIHNvYXAgY29udGV4dAorQHBhcmFtW2luXSBpZCBzdHJpbmcgZm9yIHNpZ25hdHVyZSByZWZlcmVuY2luZyBvciBOVUxMCitAcGFyYW1baW5dIHZhbHVlVHlwZSBzdHJpbmcKK0BwYXJhbVtpbl0gZGF0YSBwb2ludHMgdG8gYmluYXJ5IHRva2VuIGRhdGEKK0BwYXJhbVtpbl0gc2l6ZSBpcyBsZW5ndGggb2YgYmluYXJ5IHRva2VuCitAcmV0dXJuIFNPQVBfT0sKKyovCitpbnQKK3NvYXBfd3NzZV9hZGRfQmluYXJ5U2VjdXJpdHlUb2tlbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKnZhbHVlVHlwZSwgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IHNpemUpCit7IF93c3NlX19TZWN1cml0eSAqc2VjdXJpdHkgPSBzb2FwX3dzc2VfYWRkX1NlY3VyaXR5KHNvYXApOworICBEQkdGVU4yKCJ3c3NlX2FkZF9CaW5hcnlTZWN1cml0eVRva2VuIiwgImlkPSVzIiwgaWQ/aWQ6IiIsICJ2YWx1ZVR5cGU9JXMiLCB2YWx1ZVR5cGU/dmFsdWVUeXBlOiIiKTsKKyAgLyogYWxsb2NhdGUgQmluYXJ5U2VjdXJpdHlUb2tlbiBpZiB3ZSBkb24ndCBhbHJlYWR5IGhhdmUgb25lICovCisgIGlmICghc2VjdXJpdHktPkJpbmFyeVNlY3VyaXR5VG9rZW4pCisgICAgc2VjdXJpdHktPkJpbmFyeVNlY3VyaXR5VG9rZW4gPSAoX3dzc2VfX0JpbmFyeVNlY3VyaXR5VG9rZW4qKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihfd3NzZV9fQmluYXJ5U2VjdXJpdHlUb2tlbikpOworICBzb2FwX2RlZmF1bHRfX3dzc2VfX0JpbmFyeVNlY3VyaXR5VG9rZW4oc29hcCwgc2VjdXJpdHktPkJpbmFyeVNlY3VyaXR5VG9rZW4pOworICAvKiBwb3B1bGF0ZSB0aGUgQmluYXJ5U2VjdXJpdHlUb2tlbiAqLworICBzZWN1cml0eS0+QmluYXJ5U2VjdXJpdHlUb2tlbi0+d3N1X19JZCA9IHNvYXBfc3RyZHVwKHNvYXAsIGlkKTsKKyAgc2VjdXJpdHktPkJpbmFyeVNlY3VyaXR5VG9rZW4tPlZhbHVlVHlwZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHZhbHVlVHlwZSk7CisgIHNlY3VyaXR5LT5CaW5hcnlTZWN1cml0eVRva2VuLT5FbmNvZGluZ1R5cGUgPSAoY2hhciopd3NzZV9CYXNlNjRCaW5hcnlVUkk7CisgIHNlY3VyaXR5LT5CaW5hcnlTZWN1cml0eVRva2VuLT5fX2l0ZW0gPSBzb2FwX3MyYmFzZTY0KHNvYXAsIGRhdGEsIE5VTEwsIHNpemUpOworICByZXR1cm4gU09BUF9PSzsKK30KKworLyoqCitAZm4gaW50IHNvYXBfd3NzZV9hZGRfQmluYXJ5U2VjdXJpdHlUb2tlblg1MDkoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCBYNTA5ICpjZXJ0KQorQGJyaWVmIEFkZHMgQmluYXJ5U2VjdXJpdHlUb2tlbiBlbGVtZW50IHdpdGggWDUwOSBjZXJ0aWZpY2F0ZS4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0BwYXJhbVtpbl0gaWQgc3RyaW5nIGZvciBzaWduYXR1cmUgcmVmZXJlbmNlCitAcGFyYW1baW5dIGNlcnQgcG9pbnRzIHRvIHRoZSBYNTA5IGNlcnRpZmljYXRlCitAcmV0dXJuIFNPQVBfT0sgb3IgU09BUF9FT00KKworVGhpcyBmdW5jdGlvbiB1c2VzIGkyZF9YNTA5IGZyb20gdGhlIHRoZSBPcGVuU1NMIGxpYnJhcnkgdG8gY29udmVydCBhbiBYNTA5CitvYmplY3QgdG8gYmluYXJ5IERFUiBmb3JtYXQuCisqLworaW50Citzb2FwX3dzc2VfYWRkX0JpbmFyeVNlY3VyaXR5VG9rZW5YNTA5KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgWDUwOSAqY2VydCkKK3sgaW50IHNpemU7CisgIHVuc2lnbmVkIGNoYXIgKmRhdGEsICpuZXh0OworICBpZiAoIWNlcnQpCisgICAgcmV0dXJuIHNvYXBfd3NzZV9mYXVsdChzb2FwLCB3c3NlX19JbnZhbGlkU2VjdXJpdHlUb2tlbiwgIkludmFsaWQgY2VydGlmaWNhdGUiKTsKKyAgLyogZGV0ZXJtaW5lIHRoZSBzdG9yYWdlIHJlcXVpcmVtZW50ICovCisgIHNpemUgPSBpMmRfWDUwOShjZXJ0LCBOVUxMKTsKKyAgaWYgKHNpemUgPCAwKQorICAgIHJldHVybiBzb2FwX3dzc2VfZmF1bHQoc29hcCwgd3NzZV9fSW52YWxpZFNlY3VyaXR5VG9rZW4sICJJbnZhbGlkIGNlcnRpZmljYXRlIik7CisgIC8qIHVzZSB0aGUgZ1NPQVAgZW5naW5lJ3MgbG9vay1hc2lkZSBidWZmZXIgdG8gdGVtcG9yYXJpbHkgaG9sZCB0aGUgY2VydCAqLworICBpZiAoc29hcF9zdG9yZV9sYWIoc29hcCwgTlVMTCwgc2l6ZSkpCisgICAgcmV0dXJuIFNPQVBfRU9NOworICBkYXRhID0gbmV4dCA9ICh1bnNpZ25lZCBjaGFyKilzb2FwLT5sYWJidWY7CisgIC8qIHN0b3JlIGluIERFUiBmb3JtYXQgKi8KKyAgaTJkX1g1MDkoY2VydCwgJm5leHQpOworICAvKiBwb3B1bGF0ZSB0aGUgQmluYXJ5U2VjdXJpdHlUb2tlbiB3aXRoIGJhc2U2NCBjZXJ0aWZpY2F0ZSBkYXRhICovCisgIHJldHVybiBzb2FwX3dzc2VfYWRkX0JpbmFyeVNlY3VyaXR5VG9rZW4oc29hcCwgaWQsIHdzc2VfWDUwOXYzVVJJLCBkYXRhLCBzaXplKTsKK30KKworLyoqCitAZm4gaW50IHNvYXBfd3NzZV9hZGRfQmluYXJ5U2VjdXJpdHlUb2tlblBFTShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQorQGJyaWVmIEFkZHMgQmluYXJ5U2VjdXJpdHlUb2tlbiBlbGVtZW50IGZyb20gYSBQRU0gZmlsZS4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0BwYXJhbVtpbl0gaWQgc3RyaW5nIGZvciBzaWduYXR1cmUgcmVmZXJlbmNlCitAcGFyYW1baW5dIGZpbGVuYW1lCitAcmV0dXJuIFNPQVBfT0sgb3IgU09BUF9GQVVMVCB3aXRoIHdzc2VfX0ludmFsaWRTZWN1cml0eSBmYXVsdCB3aGVuIGZpbGUgY2Fubm90IGJlIHJlYWQgb3IgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIGNlcnRpZmljYXRlCisKK1RoaXMgZnVuY3Rpb24gdXNlcyBQRU1fcmVhZF9YNTA5IGZyb20gdGhlIHRoZSBPcGVuU1NMIGxpYnJhcnkgdG8gcmVhZCBhCitjZXJ0aWZpY2F0ZSBmcm9tIGEgUEVNIGZvcm1hdHRlZCBmaWxlLgorKi8KK2ludAorc29hcF93c3NlX2FkZF9CaW5hcnlTZWN1cml0eVRva2VuUEVNKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7IEZJTEUgKmZkOworICBEQkdGVU4yKCJzb2FwX3dzc2VfYWRkX0JpbmFyeVNlY3VyaXR5VG9rZW5QRU0iLCAiaWQ9JXMiLCBpZD9pZDoiIiwgImZpbGVuYW1lPSVzIiwgZmlsZW5hbWU/ZmlsZW5hbWU6IiIpOworICBpZiAoKGZkID0gZm9wZW4oZmlsZW5hbWUsICJyIikpKQorICB7IC8qIHJlYWQgdGhlIGNlcnRpZmljYXRlICovCisgICAgWDUwOSAqY2VydCA9IFBFTV9yZWFkX1g1MDkoZmQsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIGZjbG9zZShmZCk7CisgICAgLyogaWYgb2theSwgcG9wdWxhdGUgdGhlIEJpbmFyeVNlY3VyaXR5VG9rZW4gZWxlbWVudCAqLworICAgIGlmIChjZXJ0KQorICAgIHsgaW50IGVyciA9IHNvYXBfd3NzZV9hZGRfQmluYXJ5U2VjdXJpdHlUb2tlblg1MDkoc29hcCwgaWQsIGNlcnQpOworICAgICAgWDUwOV9mcmVlKGNlcnQpOworICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXBfd3NzZV9mYXVsdChzb2FwLCB3c3NlX19JbnZhbGlkU2VjdXJpdHksICJObyBjZXJ0aWZpY2F0ZSIpOworfQorCisvKioKK0BmbiBfd3NzZV9fQmluYXJ5U2VjdXJpdHlUb2tlbiogc29hcF93c3NlX0JpbmFyeVNlY3VyaXR5VG9rZW4oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkKQorQGJyaWVmIFJldHVybnMgQmluYXJ5U2VjdXJpdHlUb2tlbiBlbGVtZW50IGlmIHByZXNlbnQuCitAcGFyYW0gc29hcCBjb250ZXh0CitAcGFyYW1baW5dIGlkIHN0cmluZyBvZiB0b2tlbiB0byBnZXQgb3IgTlVMTAorQHJldHVybiBfd3NzZV9fQmluYXJ5U2VjdXJpdHlUb2tlbiBvYmplY3Qgb3IgTlVMTAorKi8KK3N0cnVjdCBfd3NzZV9fQmluYXJ5U2VjdXJpdHlUb2tlbioKK3NvYXBfd3NzZV9CaW5hcnlTZWN1cml0eVRva2VuKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCkKK3sgX3dzc2VfX1NlY3VyaXR5ICpzZWN1cml0eSA9IHNvYXBfd3NzZV9TZWN1cml0eShzb2FwKTsKKyAgaWYgKHNlY3VyaXR5CisgICAmJiBzZWN1cml0eS0+QmluYXJ5U2VjdXJpdHlUb2tlbgorICAgJiYgKCFpZCB8fCAoc2VjdXJpdHktPkJpbmFyeVNlY3VyaXR5VG9rZW4tPndzdV9fSWQKKyAgICAgICAgICAgICYmICFzdHJjbXAoc2VjdXJpdHktPkJpbmFyeVNlY3VyaXR5VG9rZW4tPndzdV9fSWQsIGlkKSkpKQorICAgIHJldHVybiBzZWN1cml0eS0+QmluYXJ5U2VjdXJpdHlUb2tlbjsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorQGZuIGludCBzb2FwX3dzc2VfZ2V0X0JpbmFyeVNlY3VyaXR5VG9rZW4oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCBjaGFyICoqdmFsdWVUeXBlLCB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50ICpzaXplKQorQGJyaWVmIEdldCB3c3NlOkJpbmFyeVNlY3VyaXR5VG9rZW4gZWxlbWVudCB0b2tlbiBkYXRhIGluIGJpbmFyeSBmb3JtLgorQHBhcmFtIHNvYXAgY29udGV4dAorQHBhcmFtW2luXSBpZCBzdHJpbmcgb2YgdG9rZW4gdG8gZ2V0IG9yIE5VTEwKK0BwYXJhbVtvdXRdIHZhbHVlVHlwZSBzdHJpbmcKK0BwYXJhbVtvdXRdIGRhdGEgcG9pbnRzIHRvIGJpbmFyeSB0b2tlbiBkYXRhCitAcGFyYW1bb3V0XSBzaXplIGlzIGxlbmd0aCBvZiBiaW5hcnkgdG9rZW4KK0ByZXR1cm4gU09BUF9PSyBvciBTT0FQX0ZBVUxUIHdpdGggd3NzZTpTZWN1cml0eVRva2VuVW5hdmFpbGFibGUgZmF1bHQKKyovCitpbnQKK3NvYXBfd3NzZV9nZXRfQmluYXJ5U2VjdXJpdHlUb2tlbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIGNoYXIgKip2YWx1ZVR5cGUsIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgKnNpemUpCit7IF93c3NlX19CaW5hcnlTZWN1cml0eVRva2VuICp0b2tlbiA9IHNvYXBfd3NzZV9CaW5hcnlTZWN1cml0eVRva2VuKHNvYXAsIGlkKTsKKyAgREJHRlVOMSgic29hcF93c3NlX2dldF9CaW5hcnlTZWN1cml0eVRva2VuIiwgImlkPSVzIiwgaWQ/aWQ6IiIpOworICBpZiAodG9rZW4pCisgIHsgKnZhbHVlVHlwZSA9IHRva2VuLT5WYWx1ZVR5cGU7CisgICAgLyogaXQgYXBwZWFycyB3ZSBkb24ndCBuZWVkIEhleEJpbmFyeSBhZnRlciBhbGwKKyAgICBpZiAodG9rZW4tPkVuY29kaW5nVHlwZSAmJiAhc3RyY21wKHRva2VuLT5FbmNvZGluZ1R5cGUsIHdzc2VfSGV4QmluYXJ5VVJJKSkKKyAgICAgICpkYXRhID0gKHVuc2lnbmVkIGNoYXIqKXNvYXBfaGV4MnMoc29hcCwgdG9rZW4tPl9faXRlbSwgTlVMTCwgMCwgc2l6ZSk7CisgICAgZWxzZQorICAgICovCisgICAgLyogYXNzdW1lIHRva2VuIGlzIHJlcHJlc2VudGVkIGluIGJhc2U2NCBieSBkZWZhdWx0ICovCisgICAgKmRhdGEgPSAodW5zaWduZWQgY2hhciopc29hcF9iYXNlNjQycyhzb2FwLCB0b2tlbi0+X19pdGVtLCBOVUxMLCAwLCBzaXplKTsKKyAgICBpZiAoKmRhdGEpCisgICAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICByZXR1cm4gc29hcF93c3NlX2ZhdWx0KHNvYXAsIHdzc2VfX1NlY3VyaXR5VG9rZW5VbmF2YWlsYWJsZSwgIkJpbmFyeVNlY3VyaXR5VG9rZW4gcmVxdWlyZWQiKTsKK30KKworLyoqCitAZm4gWDUwOSogc29hcF93c3NlX2dldF9CaW5hcnlTZWN1cml0eVRva2VuWDUwOShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQpCitAYnJpZWYgR2V0IFg1MDkgd3NzZTpCaW5hcnlTZWN1cml0eVRva2VuIGNlcnRpZmljYXRlIGFuZCB2ZXJpZnkgaXRzIGNvbnRlbnQuCitAcGFyYW0gc29hcCBjb250ZXh0CitAcGFyYW1baW5dIGlkIHN0cmluZyBvZiB0b2tlbiB0byBnZXQgb3IgTlVMTAorQHJldHVybiBYNTA5IGNlcnRpZmljYXRlIChkeW5hbWljYWxseSBhbGxvY2F0ZWQpIG9yIE5VTEwgd2l0aCB3c3NlOlNlY3VyaXR5VG9rZW5VbmF2YWlsYWJsZSBmYXVsdAorKi8KK1g1MDkqCitzb2FwX3dzc2VfZ2V0X0JpbmFyeVNlY3VyaXR5VG9rZW5YNTA5KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCkKK3sgWDUwOSAqY2VydCA9IE5VTEw7CisgIGNoYXIgKnZhbHVlVHlwZTsKKyAgdW5zaWduZWQgY2hhciAqZGF0YTsKKyAgaW50IHNpemU7CisgIERCR0ZVTjEoInNvYXBfd3NzZV9nZXRfQmluYXJ5U2VjdXJpdHlUb2tlblg1MDkiLCAiaWQ9JXMiLCBpZD9pZDoiIik7CisgIGlmICghc29hcF93c3NlX2dldF9CaW5hcnlTZWN1cml0eVRva2VuKHNvYXAsIGlkLCAmdmFsdWVUeXBlLCAmZGF0YSwgJnNpemUpCisgICAmJiB2YWx1ZVR5cGUKKyAgICYmICFzdHJjbXAodmFsdWVUeXBlLCB3c3NlX1g1MDl2M1VSSSkpCisgICAgY2VydCA9IGQyaV9YNTA5KE5VTEwsICZkYXRhLCBzaXplKTsKKyAgLyogdmVyaWZ5IHRoZSBjZXJ0aWZpY2F0ZSAqLworICBpZiAoIWNlcnQgfHwgc29hcF93c3NlX3ZlcmlmeV9YNTA5KHNvYXAsIGNlcnQpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gY2VydDsKK30KKworLyoqCitAZm4gaW50IHNvYXBfd3NzZV92ZXJpZnlfWDUwOShzdHJ1Y3Qgc29hcCAqc29hcCwgWDUwOSAqY2VydCkKK0BicmllZiBWZXJpZmllcyBYNTA5IGNlcnRpZmljYXRlIGFnYWluc3Qgc29hcC0+Y2FmaWxlLCBzb2FwLT5jYXBhdGgsIGFuZCBzb2FwLT5jcmxmaWxlCitAcGFyYW0gc29hcCBjb250ZXh0CitAcGFyYW1baW5dIGNlcnQgWDUwOSBjZXJ0aWZpY2F0ZQorQHJldHVybiBTT0FQX09LIG9yIGZhdWx0CisKK1RoaXMgaXMgYW4gZXhwZW5zaXZlIG9wZXJhdGlvbiwgc2luY2Ugd2UgcmVhZCB0aGUgY2FmaWxlIGFuZCBjcmVhdGUgdGhlIG9iamVjdHMKK2V2ZXJ5IHRpbWUgd2UgbmVlZCB0byB2ZXJpZnkgYSBjZXJ0aWZpY2F0ZS4gRm9yIGZ1dHVyZSByZWxlYXNlcywgd2Ugc2hvdWxkCitzdG9yZSB0aGlzIGRhdGEgcGVybWFuZW50bHkgaW4gdGhlIGdTT0FQIGVuZ2luZSBvciBwbHVnaW4uCisqLworaW50Citzb2FwX3dzc2VfdmVyaWZ5X1g1MDkoc3RydWN0IHNvYXAgKnNvYXAsIFg1MDkgKmNlcnQpCit7IFg1MDlfU1RPUkUgKnN0b3JlID0gTlVMTDsKKyAgWDUwOV9TVE9SRV9DVFggKnZlcmlmeSA9IE5VTEw7CisgIC8qIE9wZW5TU0xfYWRkX2FsbF9hbGdvcml0aG1zKCk7ICovCisgIERCR0ZVTigic29hcF93c3NlX3ZlcmlmeV9YNTA5Iik7CisgIC8qIFRPRE86IHNob3VsZCBrZWVwIHRoZSBzdG9yZSBpbiB0aGUgZ1NPQVAgZW5naW5lIG9yIHBsdWdpbiB0byBhdm9pZCBleGNlc3NpdmUgbG9hZHMgKi8KKyAgaWYgKCEoc3RvcmUgPSBYNTA5X1NUT1JFX25ldygpKSkKKyAgeyBzb2FwX3JlY2VpdmVyX2ZhdWx0KHNvYXAsICJzb2FwX3dzc2VfdmVyaWZ5X1g1MDkiLCAiQ291bGQgbm90IGNyZWF0ZSBYNTA5X1NUT1JFIG9iamVjdCIpOworICAgIGdvdG8gZXJyOworICB9CisgIFg1MDlfU1RPUkVfc2V0X3ZlcmlmeV9jYl9mdW5jKHN0b3JlLCBzb2FwLT5mc3NsdmVyaWZ5KTsKKyAgaWYgKHNvYXAtPmNhZmlsZSB8fCBzb2FwLT5jYXBhdGgpCisgIHsgaWYgKFg1MDlfU1RPUkVfbG9hZF9sb2NhdGlvbnMoc3RvcmUsIHNvYXAtPmNhZmlsZSwgc29hcC0+Y2FwYXRoKSAhPSAxKQorICAgIHsgc29hcF9yZWNlaXZlcl9mYXVsdChzb2FwLCAic29hcF93c3NlX3ZlcmlmeV9YNTA5IiwgIkNvdWxkIG5vdCBsb2FkIENBIGZpbGUgb3IgcGF0aCIpOworICAgICAgZ290byBlcnI7CisgICAgfQorICB9CisjaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPiAweDAwOTA3MDAwTCkKKyAgaWYgKHNvYXAtPmNybGZpbGUpCisgIHsgWDUwOV9MT09LVVAgKmxvb2t1cDsKKyAgICBpZiAoIShsb29rdXAgPSBYNTA5X1NUT1JFX2FkZF9sb29rdXAoc3RvcmUsIFg1MDlfTE9PS1VQX2ZpbGUoKSkpKQorICAgIHsgc29hcF9yZWNlaXZlcl9mYXVsdChzb2FwLCAic29hcF93c3NlX3ZlcmlmeV9YNTA5IiwgIkNvdWxkIG5vdCBjcmVhdGUgWDUwOV9MT09LVVAgb2JqZWN0Iik7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgaWYgKFg1MDlfbG9hZF9jcmxfZmlsZShsb29rdXAsIHNvYXAtPmNybGZpbGUsIFg1MDlfRklMRVRZUEVfUEVNKSAhPSAxKQorICAgIHsgc29hcF9yZWNlaXZlcl9mYXVsdChzb2FwLCAic29hcF93c3NlX3ZlcmlmeV9YNTA5IiwgIkNvdWxkIG5vdCByZWFkIHRoZSBDUkwgZmlsZSIpOworICAgICAgZ290byBlcnI7CisgICAgfQorICAgIFg1MDlfU1RPUkVfc2V0X2ZsYWdzKHN0b3JlLCBYNTA5X1ZfRkxBR19DUkxfQ0hFQ0sgfCBYNTA5X1ZfRkxBR19DUkxfQ0hFQ0tfQUxMKTsKKyAgfQorI2VuZGlmCisgIGlmICghKHZlcmlmeSA9IFg1MDlfU1RPUkVfQ1RYX25ldygpKSkKKyAgeyBzb2FwX3JlY2VpdmVyX2ZhdWx0KHNvYXAsICJzb2FwX3dzc2VfdmVyaWZ5X1g1MDkiLCAiQ291bGQgbm90IGNyZWF0ZSBYNTA5X1NUT1JFX0NUWCBvYmplY3QiKTsKKyAgICBnb3RvIGVycjsKKyAgfQorI2lmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSID4gMHgwMDkwNzAwMEwpCisgIGlmIChYNTA5X1NUT1JFX0NUWF9pbml0KHZlcmlmeSwgc3RvcmUsIGNlcnQsIE5VTEwpICE9IDEpCisgIHsgc29hcF9yZWNlaXZlcl9mYXVsdChzb2FwLCAic29hcF93c3NlX3ZlcmlmeV9YNTA5IiwgIkNvdWxkIG5vdCBpbml0aWFsaXplIFg1MDlfU1RPUkVfQ1RYIG9iamVjdCIpOworICAgIGdvdG8gZXJyOworICB9CisjZWxzZQorICBYNTA5X1NUT1JFX0NUWF9pbml0KHZlcmlmeSwgc3RvcmUsIGNlcnQsIE5VTEwpOworI2VuZGlmCisgIGlmIChYNTA5X3ZlcmlmeV9jZXJ0KHZlcmlmeSkgIT0gMSkKKyAgeyBzb2FwX3NlbmRlcl9mYXVsdChzb2FwLCAic29hcF93c3NlX3ZlcmlmeV9YNTA5IiwgIkludmFsaWQgY2VydGlmaWNhdGUiKTsKKyAgICBnb3RvIGVycjsKKyAgfQorICBYNTA5X1NUT1JFX0NUWF9mcmVlKHZlcmlmeSk7CisgIFg1MDlfU1RPUkVfZnJlZShzdG9yZSk7CisgIHJldHVybiBTT0FQX09LOworZXJyOgorICBpZiAodmVyaWZ5KQorICAgIFg1MDlfU1RPUkVfQ1RYX2ZyZWUodmVyaWZ5KTsKKyAgaWYgKHN0b3JlKQorICAgIFg1MDlfU1RPUkVfZnJlZShzdG9yZSk7CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKiBkczpTaWduYXR1cmUvU2lnbmVkSW5mbworICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorQGZuIGRzX19TaWduZWRJbmZvVHlwZSogc29hcF93c3NlX2FkZF9TaWduZWRJbmZvKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmIEFkZHMgU2lnbmVkSW5mbyBlbGVtZW50LgorQHBhcmFtIHNvYXAgY29udGV4dAorQHJldHVybiBkc19fU2lnbmVkSW5mb1R5cGUgb2JqZWN0CisqLworc3RydWN0IGRzX19TaWduZWRJbmZvVHlwZSoKK3NvYXBfd3NzZV9hZGRfU2lnbmVkSW5mbyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgZHNfX1NpZ25hdHVyZVR5cGUgKnNpZ25hdHVyZSA9IHNvYXBfd3NzZV9hZGRfU2lnbmF0dXJlKHNvYXApOworICBpZiAoIXNpZ25hdHVyZS0+U2lnbmVkSW5mbykKKyAgeyBzaWduYXR1cmUtPlNpZ25lZEluZm8gPSAoZHNfX1NpZ25lZEluZm9UeXBlKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2YoZHNfX1NpZ25lZEluZm9UeXBlKSk7CisgICAgc29hcF9kZWZhdWx0X2RzX19TaWduZWRJbmZvVHlwZShzb2FwLCBzaWduYXR1cmUtPlNpZ25lZEluZm8pOworICB9CisgIHJldHVybiBzaWduYXR1cmUtPlNpZ25lZEluZm87Cit9CisKKy8qKgorQGZuIGludCBzb2FwX3dzc2VfYWRkX1NpZ25lZEluZm9fUmVmZXJlbmNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpVUkksIGNvbnN0IGNoYXIgKnRyYW5zZm9ybSwgY29uc3QgY2hhciAqaW5jbHVzaXZlTmFtZXNwYWNlcywgY29uc3QgY2hhciAqSEEpCitAYnJpZWYgQWRkcyBTaWduZWRJbmZvIGVsZW1lbnQgd2l0aCBSZWZlcmVuY2UgVVJJLCB0cmFuc2Zvcm0gYWxnb3JpdGhtIHVzZWQsIGFuZCBkaWdlc3QgdmFsdWUuCitAcGFyYW0gc29hcCBjb250ZXh0CitAcGFyYW1baW5dIFVSSSByZWZlcmVuY2UKK0BwYXJhbVtpbl0gdHJhbnNmb3JtIHN0cmluZyBzaG91bGQgYmUgYzE0bl9VUkkgZm9yIGV4Yy1jMTRuIG9yIE5VTEwKK0BwYXJhbVtpbl0gaW5jbHVzaXZlTmFtZXNwYWNlcyB1c2VkIGJ5IHRoZSBleGMtYzE0biB0cmFuc2Zvcm0gb3IgTlVMTAorQHBhcmFtW2luXSBIQSBpcyB0aGUgU0hBMSBkaWdlc3QgaW4gYmluYXJ5IGZvcm0gKGxlbmd0aD1TT0FQX1NNRF9TSEExX1NJWkUpCitAcmV0dXJuIFNPQVBfT0sgb3IgU09BUF9FT00gd2hlbiByZWZlcmVuY2VzIGV4Y2VlZCBTT0FQX1dTU0VfTUFYX1JFRgorCitUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgdG8gYWRkIG1vcmUgcmVmZXJlbmNlcyB0byB0aGUgd3NzZTpTaWduZWRJbmZvCitlbGVtZW50LiBBIG1heGltdW0gbnVtYmVyIG9mIFNPQVBfV1NTRV9NQVhfUkVGIHJlZmVyZW5jZXMgY2FuIGJlIGFkZGVkLiBUaGUKK2RpZ2VzdCBtZXRob2QgaXMgYWx3YXlzIFNIQTEuIAorTm90ZTogWFBhdGggdHJhbnNmb3JtcyBjYW5ub3QgYmUgc3BlY2lmaWVkIGluIHRoaXMgcmVsZWFzZS4KKyovCitpbnQKK3NvYXBfd3NzZV9hZGRfU2lnbmVkSW5mb19SZWZlcmVuY2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKlVSSSwgY29uc3QgY2hhciAqdHJhbnNmb3JtLCBjb25zdCBjaGFyICppbmNsdXNpdmVOYW1lc3BhY2VzLCBjb25zdCBjaGFyICpIQSkKK3sgZHNfX1NpZ25lZEluZm9UeXBlICpzaWduZWRJbmZvID0gc29hcF93c3NlX2FkZF9TaWduZWRJbmZvKHNvYXApOworICBkc19fUmVmZXJlbmNlVHlwZSAqcmVmZXJlbmNlOworICBEQkdGVU4yKCJzb2FwX3dzc2VfYWRkX1NpZ25lZEluZm9fUmVmZXJlbmNlIiwgIlVSST0lcyIsIFVSST9VUkk6IiIsICJ0cmFuc2Zvcm09JXMiLCB0cmFuc2Zvcm0/dHJhbnNmb3JtOiIiKTsKKyAgLyogaWYgdGhpcyBpcyB0aGUgZmlyc3QgcmVmZXJlbmNlLCBhbGxvY2F0ZSBTT0FQX1dTU0VfTUFYX1JFRiByZWZlcmVuY2VzICovCisgIGlmIChzaWduZWRJbmZvLT5fX3NpemVSZWZlcmVuY2UgPT0gMCkKKyAgICBzaWduZWRJbmZvLT5SZWZlcmVuY2UgPSAoZHNfX1JlZmVyZW5jZVR5cGUqKilzb2FwX21hbGxvYyhzb2FwLCBTT0FQX1dTU0VfTUFYX1JFRipzaXplb2YoZHNfX1JlZmVyZW5jZVR5cGUqKSk7CisgIGVsc2UKKyAgeyAvKiBtYXhpbXVtIG51bWJlciBvZiByZWZlcmVuY2VzIGV4Y2VlZGVkPyAqLworICAgIGlmIChzaWduZWRJbmZvLT5fX3NpemVSZWZlcmVuY2UgPj0gU09BUF9XU1NFX01BWF9SRUYpCisgICAgICByZXR1cm4gU09BUF9FT007CisgIH0KKyAgLyogYWxsb2NhdGUgZnJlc2ggbmV3IHJlZmVyZW5jZSAqLworICByZWZlcmVuY2UgPSAoZHNfX1JlZmVyZW5jZVR5cGUqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihkc19fUmVmZXJlbmNlVHlwZSkpOworICBzb2FwX2RlZmF1bHRfZHNfX1JlZmVyZW5jZVR5cGUoc29hcCwgcmVmZXJlbmNlKTsKKyAgLyogcG9wdWxhdGUgdGhlIFVSSSAqLworICByZWZlcmVuY2UtPlVSSSA9IHNvYXBfc3RyZHVwKHNvYXAsIFVSSSk7CisgIC8qIGlmIGEgdHJhbnNmb3JtIGFsZ29yaXRobSB3YXMgdXNlZCwgcG9wdWxhdGUgdGhlIFRyYW5zZm9ybXMgZWxlbWVudCAqLworICBpZiAodHJhbnNmb3JtKQorICB7IHJlZmVyZW5jZS0+VHJhbnNmb3JtcyA9IChkc19fVHJhbnNmb3Jtc1R5cGUqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihkc19fVHJhbnNmb3Jtc1R5cGUpKTsKKyAgICBzb2FwX2RlZmF1bHRfZHNfX1RyYW5zZm9ybXNUeXBlKHNvYXAsIHJlZmVyZW5jZS0+VHJhbnNmb3Jtcyk7CisgICAgLyogb25seSBvbmUgdHJhbnNmb3JtICovCisgICAgcmVmZXJlbmNlLT5UcmFuc2Zvcm1zLT5fX3NpemVUcmFuc2Zvcm0gPSAxOworICAgIHJlZmVyZW5jZS0+VHJhbnNmb3Jtcy0+VHJhbnNmb3JtID0gKGRzX19UcmFuc2Zvcm1UeXBlKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2YoZHNfX1RyYW5zZm9ybVR5cGUpKTsKKyAgICBzb2FwX2RlZmF1bHRfZHNfX1RyYW5zZm9ybVR5cGUoc29hcCwgcmVmZXJlbmNlLT5UcmFuc2Zvcm1zLT5UcmFuc2Zvcm0pOworICAgIHJlZmVyZW5jZS0+VHJhbnNmb3Jtcy0+VHJhbnNmb3JtLT5BbGdvcml0aG0gPSAoY2hhciopdHJhbnNmb3JtOworICAgIC8qIHBvcHVsYXRlIHRoZSBjMTRuOkluY2x1c2l2ZU5hbWVzcGFjZXMgZWxlbWVudCAqLworICAgIGlmIChpbmNsdXNpdmVOYW1lc3BhY2VzKQorICAgIHsgcmVmZXJlbmNlLT5UcmFuc2Zvcm1zLT5UcmFuc2Zvcm0tPmMxNG5fX0luY2x1c2l2ZU5hbWVzcGFjZXMgPSAoX2MxNG5fX0luY2x1c2l2ZU5hbWVzcGFjZXMqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihfYzE0bl9fSW5jbHVzaXZlTmFtZXNwYWNlcykpOworICAgICAgc29hcF9kZWZhdWx0X19jMTRuX19JbmNsdXNpdmVOYW1lc3BhY2VzKHNvYXAsIHJlZmVyZW5jZS0+VHJhbnNmb3Jtcy0+VHJhbnNmb3JtLT5jMTRuX19JbmNsdXNpdmVOYW1lc3BhY2VzKTsKKyAgICAgIHJlZmVyZW5jZS0+VHJhbnNmb3Jtcy0+VHJhbnNmb3JtLT5jMTRuX19JbmNsdXNpdmVOYW1lc3BhY2VzLT5QcmVmaXhMaXN0ID0gc29hcF9zdHJkdXAoc29hcCwgaW5jbHVzaXZlTmFtZXNwYWNlcyk7CisgICAgfQorICB9CisgIC8qIHBvcHVsYXRlIHRoZSBEaWdlc3RNZXRob2QgZWxlbWVudCAqLworICByZWZlcmVuY2UtPkRpZ2VzdE1ldGhvZCA9IChkc19fRGlnZXN0TWV0aG9kVHlwZSopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKGRzX19EaWdlc3RNZXRob2RUeXBlKSk7CisgIHNvYXBfZGVmYXVsdF9kc19fRGlnZXN0TWV0aG9kVHlwZShzb2FwLCByZWZlcmVuY2UtPkRpZ2VzdE1ldGhvZCk7CisgIC8qIHRoZSBEaWdlc3RNZXRob2QgYWxnb3JpdGhtIGlzIGFsd2F5cyBTSEExICovCisgIHJlZmVyZW5jZS0+RGlnZXN0TWV0aG9kLT5BbGdvcml0aG0gPSAoY2hhciopZHNfc2hhMVVSSTsKKyAgLyogcG9wdWxhdGUgdGhlIERpZ2VzdFZhbHVlIGVsZW1lbnQgKi8KKyAgcmVmZXJlbmNlLT5EaWdlc3RWYWx1ZSA9IHNvYXBfczJiYXNlNjQoc29hcCwgSEEsIE5VTEwsIFNPQVBfU01EX1NIQTFfU0laRSk7CisgIC8qIGFkZCB0aGUgZnJlc2ggbmV3IHJlZmVyZW5jZSB0byB0aGUgYXJyYXkgKi8KKyAgc2lnbmVkSW5mby0+UmVmZXJlbmNlW3NpZ25lZEluZm8tPl9fc2l6ZVJlZmVyZW5jZV0gPSByZWZlcmVuY2U7CisgIHNpZ25lZEluZm8tPl9fc2l6ZVJlZmVyZW5jZSsrOworICByZXR1cm4gU09BUF9PSzsKK30KKworLyoqCitAZm4gaW50IHNvYXBfd3NzZV9hZGRfU2lnbmVkSW5mb19TaWduYXR1cmVNZXRob2Qoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm1ldGhvZCwgaW50IGNhbm9uaWNhbCkKK0BicmllZiBBZGRzIFNpZ25lZEluZm8gZWxlbWVudCB3aXRoIFNpZ25hdHVyZU1ldGhvZC4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0BwYXJhbVtpbl0gbWV0aG9kIGlzIHRoZSBVUkkgb2YgdGhlIHNpZ25hdHVyZSBhbGdvcml0aG0gKGUuZy4gZHNfcnNhX3NoYTEpCitAcGFyYW1baW5dIGNhbm9uaWNhbCBmbGFnIGluZGljYXRpbmcgdGhhdCBTaWduZWRJbmZvIGlzIHNpZ25lZCBpbiBleGMtYzE0biBmb3JtCitAcmV0dXJuIFNPQVBfT0sKKworTm90ZTogdGhlIGMxNG46SW5jbHVzaXZlTmFtZXNwYWNlcy9QcmVmaXhMaXN0IGlzIHNldCB0byAiU09BUC1FTlYgd3NzZSIuCisqLworaW50Citzb2FwX3dzc2VfYWRkX1NpZ25lZEluZm9fU2lnbmF0dXJlTWV0aG9kKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICptZXRob2QsIGludCBjYW5vbmljYWwpCit7IGRzX19TaWduZWRJbmZvVHlwZSAqc2lnbmVkSW5mbyA9IHNvYXBfd3NzZV9hZGRfU2lnbmVkSW5mbyhzb2FwKTsKKyAgREJHRlVOMigic29hcF93c3NlX2FkZF9TaWduZWRJbmZvX1NpZ25hdHVyZU1ldGhvZCIsICJtZXRob2Q9JXMiLCBtZXRob2Q/bWV0aG9kOiIiLCAiY2Fub25pY2FsPSVkIiwgY2Fub25pY2FsKTsKKyAgLyogaWYgc2lnbmVkIGluIGV4Yy1jMTRuIGZvcm0sIHBvcHVsYXRlIENhbm9uaWNhbGl6YXRpb25NZXRob2QgZWxlbWVudCAqLworICBpZiAoY2Fub25pY2FsKQorICB7IHNpZ25lZEluZm8tPkNhbm9uaWNhbGl6YXRpb25NZXRob2QgPSAoZHNfX0Nhbm9uaWNhbGl6YXRpb25NZXRob2RUeXBlKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2YoZHNfX0Nhbm9uaWNhbGl6YXRpb25NZXRob2RUeXBlKSk7CisgICAgc29hcF9kZWZhdWx0X2RzX19DYW5vbmljYWxpemF0aW9uTWV0aG9kVHlwZShzb2FwLCBzaWduZWRJbmZvLT5DYW5vbmljYWxpemF0aW9uTWV0aG9kKTsKKyAgICBzaWduZWRJbmZvLT5DYW5vbmljYWxpemF0aW9uTWV0aG9kLT5BbGdvcml0aG0gPSAoY2hhciopYzE0bl9VUkk7CisgICAgLyogVE9ETzogY2hlY2sgYzE0bjpJbmNsdXNpdmVOYW1lc3BhY2VzL1ByZWZpeExpc3QgcmVxdWlyZW1lbnRzICovCisgICAgc2lnbmVkSW5mby0+Q2Fub25pY2FsaXphdGlvbk1ldGhvZC0+YzE0bl9fSW5jbHVzaXZlTmFtZXNwYWNlcyA9IChfYzE0bl9fSW5jbHVzaXZlTmFtZXNwYWNlcyopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKF9jMTRuX19JbmNsdXNpdmVOYW1lc3BhY2VzKSk7CisgICAgc29hcF9kZWZhdWx0X19jMTRuX19JbmNsdXNpdmVOYW1lc3BhY2VzKHNvYXAsIHNpZ25lZEluZm8tPkNhbm9uaWNhbGl6YXRpb25NZXRob2QtPmMxNG5fX0luY2x1c2l2ZU5hbWVzcGFjZXMpOworICAgIHNpZ25lZEluZm8tPkNhbm9uaWNhbGl6YXRpb25NZXRob2QtPmMxNG5fX0luY2x1c2l2ZU5hbWVzcGFjZXMtPlByZWZpeExpc3QgPSAiU09BUC1FTlYgd3NzZSI7CisgIH0KKyAgLyogcG9wdWxhdGUgU2lnbmF0dXJlTWV0aG9kIGVsZW1lbnQgKi8KKyAgc2lnbmVkSW5mby0+U2lnbmF0dXJlTWV0aG9kID0gKGRzX19TaWduYXR1cmVNZXRob2RUeXBlKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2YoZHNfX1NpZ25hdHVyZU1ldGhvZFR5cGUpKTsKKyAgc29hcF9kZWZhdWx0X2RzX19TaWduYXR1cmVNZXRob2RUeXBlKHNvYXAsIHNpZ25lZEluZm8tPlNpZ25hdHVyZU1ldGhvZCk7CisgIHNpZ25lZEluZm8tPlNpZ25hdHVyZU1ldGhvZC0+QWxnb3JpdGhtID0gKGNoYXIqKW1ldGhvZDsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKgorQGZuIGRzX19TaWduZWRJbmZvVHlwZSogc29hcF93c3NlX1NpZ25lZEluZm8oc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYgUmV0dXJucyBTaWduZWRJbmZvIGVsZW1lbnQgaWYgcHJlc2VudC4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0ByZXR1cm4gZHNfX1NpZ25lZEluZm9UeXBlIG9iamVjdCBvciBOVUxMCisqLworc3RydWN0IGRzX19TaWduZWRJbmZvVHlwZSoKK3NvYXBfd3NzZV9TaWduZWRJbmZvKHN0cnVjdCBzb2FwICpzb2FwKQoreyBkc19fU2lnbmF0dXJlVHlwZSAqc2lnbmF0dXJlID0gc29hcF93c3NlX1NpZ25hdHVyZShzb2FwKTsKKyAgaWYgKHNpZ25hdHVyZSkKKyAgICByZXR1cm4gc2lnbmF0dXJlLT5TaWduZWRJbmZvOworICByZXR1cm4gTlVMTDsKK30KKworLyoqCitAZm4gaW50IHNvYXBfd3NzZV9nZXRfU2lnbmVkSW5mb19TaWduYXR1cmVNZXRob2Qoc3RydWN0IHNvYXAgKnNvYXAsIGludCAqYWxnKQorQGJyaWVmIEdldCBTaWduYXR1cmVNZXRob2QgYWxnb3JpdGhtCitAcGFyYW0gc29hcCBjb250ZXh0CitAcGFyYW1bb3V0XSBhbGcgaXMgU09BUF9TTURfSE1BQ19TSEExLCBTT0FQX1NNRF9WUkZZX0RTQV9TSEExLCBvciBTT0FQX1NNRF9WUkZZX1JTQV9TSEExCitAcmV0dXJuIFNPQVBfT0sgb3IgU09BUF9GQVVMVCB3aXRoIHdzc2U6VW5zdXBwb3J0ZWRBbGdvcml0aG0gb3Igd3NzZTpGYWlsZWRDaGVjayBmYXVsdAorKi8KK2ludAorc29hcF93c3NlX2dldF9TaWduZWRJbmZvX1NpZ25hdHVyZU1ldGhvZChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50ICphbGcpCit7IGRzX19TaWduZWRJbmZvVHlwZSAqc2lnbmVkSW5mbyA9IHNvYXBfd3NzZV9TaWduZWRJbmZvKHNvYXApOworICBEQkdGVU4oInNvYXBfd3NzZV9nZXRfU2lnbmVkSW5mb19TaWduYXR1cmVNZXRob2QiKTsKKyAgKmFsZyA9IFNPQVBfU01EX05PTkU7CisgIC8qIGlmIHdlIGhhdmUgYSBTaWduZWRJbmZvIGVsZW1lbnQsIGdldCB0aGUgYWxnb3JpdGhtICovCisgIGlmIChzaWduZWRJbmZvCisgICAmJiBzaWduZWRJbmZvLT5TaWduYXR1cmVNZXRob2QKKyAgICYmIHNpZ25lZEluZm8tPlNpZ25hdHVyZU1ldGhvZC0+QWxnb3JpdGhtKQorICB7IGNvbnN0IGNoYXIgKm1ldGhvZCA9IHNpZ25lZEluZm8tPlNpZ25hdHVyZU1ldGhvZC0+QWxnb3JpdGhtOworICAgIGlmICghc3RyY21wKG1ldGhvZCwgZHNfaG1hY19zaGExVVJJKSkKKyAgICAgICphbGcgPSBTT0FQX1NNRF9ITUFDX1NIQTE7CisgICAgZWxzZSBpZiAoIXN0cmNtcChtZXRob2QsIGRzX2RzYV9zaGExVVJJKSkKKyAgICAgICphbGcgPSBTT0FQX1NNRF9WUkZZX0RTQV9TSEExOworICAgIGVsc2UgaWYgKCFzdHJjbXAobWV0aG9kLCBkc19yc2Ffc2hhMVVSSSkpCisgICAgICAqYWxnID0gU09BUF9TTURfVlJGWV9SU0FfU0hBMTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gc29hcF93c3NlX2ZhdWx0KHNvYXAsIHdzc2VfX1Vuc3VwcG9ydGVkQWxnb3JpdGhtLCBtZXRob2QpOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIHJldHVybiBzb2FwX3dzc2VfZmF1bHQoc29hcCwgd3NzZV9fRmFpbGVkQ2hlY2ssICJTaWduYXR1cmUgcmVxdWlyZWQiKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKiBkczpTaWduYXR1cmUvU2lnbmF0dXJlVmFsdWUKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKK0BmbiBpbnQgc29hcF93c3NlX2FkZF9TaWduYXR1cmVWYWx1ZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGFsZywgY29uc3Qgdm9pZCAqa2V5LCBpbnQga2V5bGVuKQorQGJyaWVmIEFkZHMgU2lnbmVkSW5mby9TaWduYXR1cmVNZXRob2QgZWxlbWVudCwgc2lnbnMgdGhlIFNpZ25lZEluZm8gZWxlbWVudCwgYW5kIGFkZHMgdGhlIHJlc3VsdGluZyBTaWduYXR1cmVWYWx1ZSBlbGVtZW50LgorQHBhcmFtIHNvYXAgY29udGV4dAorQHBhcmFtW2luXSBhbGcgaXMgU09BUF9TTURfSE1BQ19TSEExLCBTT0FQX1NNRF9TSUdOX0RTQV9TSEExLCBvciBTT0FQX1NNRF9TSUdOX1JTQV9TSEExCitAcGFyYW1baW5dIGtleSB0byB1c2UgdG8gc2lnbiAoSE1BQyBvciBFVlBfUEtFWSkKK0BwYXJhbVtpbl0ga2V5bGVuIGxlbmd0aCBvZiBITUFDIGtleQorQHJldHVybiBTT0FQX09LLCBTT0FQX0VPTSwgb3IgZmF1bHQKKworVG8gc2lnbiB0aGUgU2lnbmVkSW5mbyBlbGVtZW50IHdpdGggdGhpcyBmdW5jdGlvbiwgcG9wdWxhdGUgU2lnbmVkSW5mbyB3aXRoCitSZWZlcmVuY2UgZWxlbWVudHMgZmlyc3QgdXNpbmcgc29hcF93c3NlX2FkZF9TaWduZWRJbmZvX1JlZmVyZW5jZS4gVGhlCitTaWduZWRJbmZvIGVsZW1lbnQgbXVzdCBub3QgYmUgbW9kaWZpZWQgYWZ0ZXIgc2lnbmluZy4KKworVGhlIFNPQVBfWE1MX0lOREVOVCBhbmQgU09BUF9YTUxfQ0FOT05JQ0FMIGZsYWdzIGFyZSB1c2VkIHRvIHNlcmlhbGl6ZSB0aGUKK1NpZ25lZEluZm8gdG8gY29tcHV0ZSB0aGUgc2lnbmF0dXJlLgorKi8KK2ludAorc29hcF93c3NlX2FkZF9TaWduYXR1cmVWYWx1ZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGFsZywgY29uc3Qgdm9pZCAqa2V5LCBpbnQga2V5bGVuKQoreyBkc19fU2lnbmF0dXJlVHlwZSAqc2lnbmF0dXJlID0gc29hcF93c3NlX2FkZF9TaWduYXR1cmUoc29hcCk7CisgIGNvbnN0IGNoYXIgKmMxNG5leGNsdWRlLCAqbWV0aG9kID0gTlVMTDsKKyAgY2hhciAqc2lnOworICBpbnQgc2lnbGVuOworICBEQkdGVU4xKCJzb2FwX3dzc2VfYWRkX1NpZ25hdHVyZVZhbHVlIiwgImFsZz0lZCIsIGFsZyk7CisgIC8qIGRldGVybWluZSBzaWduYXR1cmUgYWxnb3JpdGhtIHRvIHVzZSAqLworICBzd2l0Y2ggKGFsZykKKyAgeyBjYXNlIFNPQVBfU01EX0hNQUNfU0hBMToKKyAgICAgIG1ldGhvZCA9IGRzX2htYWNfc2hhMVVSSTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9TTURfU0lHTl9EU0FfU0hBMToKKyAgICAgIG1ldGhvZCA9IGRzX2RzYV9zaGExVVJJOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1NNRF9TSUdOX1JTQV9TSEExOgorICAgICAgbWV0aG9kID0gZHNfcnNhX3NoYTFVUkk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIHNvYXBfd3NzZV9mYXVsdChzb2FwLCB3c3NlX19VbnN1cHBvcnRlZEFsZ29yaXRobSwgTlVMTCk7CisgIH0KKyAgLyogcG9wdWxhdGUgU2lnbmVkSW5mby9TaWduYXR1cmVNZXRob2QgYmFzZWQgb24gU09BUF9YTUxfQ0FOT05JQ0FMIGZsYWcgKi8KKyAgc29hcF93c3NlX2FkZF9TaWduZWRJbmZvX1NpZ25hdHVyZU1ldGhvZChzb2FwLCBtZXRob2QsIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKSk7CisgIC8qIHVzZSB0aGUgZ1NPQVAgZW5naW5lJ3MgbG9vay1hc2lkZSBidWZmZXIgdG8gdGVtcG9yYXJpbHkgaG9sZCB0aGUgc2lnICovCisgIGlmIChzb2FwX3N0b3JlX2xhYihzb2FwLCBOVUxMLCBzb2FwX3NtZF9zaXplKGFsZywga2V5KSkpCisgICAgcmV0dXJuIFNPQVBfRU9NOworICBzaWcgPSBzb2FwLT5sYWJidWY7CisgIC8qIHdlIHdpbGwgc2VyaWFsaXplIFNpZ25lZEluZm8gYXMgaXQgYXBwZWFycyBleGFjdGx5IGluIHRoZSBTT0FQIEhlYWRlciAqLworICAvKiBzZXQgaW5kZW50IGxldmVsIGZvciBYTUwgU2lnbmVkSW5mbyBhcyBpdCBhcHBlYXJzIGluIHRoZSBTT0FQIEhlYWRlciAqLworICBzb2FwLT5sZXZlbCA9IDQ7CisgIC8qIHdpdGggU09BUF9YTUxfQ0FOT05JQ0FMIGZsYWcsIGV4Y2x1ZGUgdGhlICJkcyIgcHJlZml4ICovCisgIGMxNG5leGNsdWRlID0gc29hcC0+YzE0bmV4Y2x1ZGU7CisgIHNvYXAtPmMxNG5leGNsdWRlID0gImRzIjsKKyAgLyogdXNlIHNtZGV2cCBlbmdpbmUgdG8gc2lnbiBTaWduZWRJbmZvICovCisgIGlmIChzb2FwX3NtZF9iZWdpbihzb2FwLCBhbGcsIGtleSwga2V5bGVuKQorICAgfHwgc29hcF9vdXRfZHNfX1NpZ25lZEluZm9UeXBlKHNvYXAsICJkczpTaWduZWRJbmZvIiwgMCwgc2lnbmF0dXJlLT5TaWduZWRJbmZvLCBOVUxMKQorICAgfHwgc29hcF9zbWRfZW5kKHNvYXAsIHNpZywgJnNpZ2xlbikpCisgICAgcmV0dXJuIHNvYXBfd3NzZV9mYXVsdChzb2FwLCB3c3NlX19JbnZhbGlkU2VjdXJpdHksICJDb3VsZCBub3Qgc2lnbiIpOworICAvKiByZXN0b3JlIGMxNG5leGNsdWRlICovCisgIHNvYXAtPmMxNG5leGNsdWRlID0gYzE0bmV4Y2x1ZGU7CisgIC8qIHBvcHVsYXRlIHRoZSBTaWduYXR1cmVWYWx1ZSBlbGVtZW50ICovCisgIHNpZ25hdHVyZS0+U2lnbmF0dXJlVmFsdWUgPSBzb2FwX3MyYmFzZTY0KHNvYXAsIHNpZywgTlVMTCwgc2lnbGVuKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKgorQGZuIGludCBzb2FwX3dzc2VfdmVyaWZ5X1NpZ25hdHVyZVZhbHVlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgYWxnLCBjb25zdCB2b2lkICprZXksIGludCBrZXlsZW4pCitAYnJpZWYgVmVyaWZpZXMgdGhlIFNpZ25hdHVyZVZhbHVlIG9mIGEgU2lnbmVkSW5mbyBlbGVtZW50LgorQHBhcmFtIHNvYXAgY29udGV4dAorQHBhcmFtW2luXSBhbGcgaXMgU09BUF9TTURfSE1BQ19TSEExLCBTT0FQX1NNRF9WUkZZX0RTQV9TSEExLCBvciBTT0FQX1NNRF9WUkZZX1JTQV9TSEExIGRldGVybWluZWQgYnkgdGhlIFNpZ25lZEluZm8vU2lnbmF0dXJlTWV0aG9kCitAcGFyYW1baW5dIGtleSB0byB1c2UgdG8gdmVyaWZ5IChITUFDIG9yIEVWUF9QS0VZKQorQHBhcmFtW2luXSBrZXlsZW4gbGVuZ3RoIG9mIEhNQUMga2V5CitAcmV0dXJuIFNPQVBfT0ssIFNPQVBfRU9NLCBvciBmYXVsdAorCitUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciB0aGUgU2lnbmVkSW5mbyBlbGVtZW50IGluIHRoZSBzb2FwLT5kb20gRE9NIHRyZWUgdG8KK3ZlcmlmeSB0aGUgc2lnbmF0dXJlIGluIHRoZSBTaWduYXR1cmVWYWx1ZSBlbGVtZW50LiBVc2luZyB0aGUgRE9NIGVuc3VyZXMgd2UKK3dpbGwgdmVyaWZ5IHRoZSBzaWduYXR1cmUgb2YgYSBTaWduZWRJbmZvIGFzIGl0IHdhcyBleGFjdGx5IHJlY2VpdmVkIGJ5IHRoZQorcGFyc2VyLCBieSB1c2luZyB0aGUgLURXSVRIX0RPTSBjb21waWxlIGZsYWcgYW5kIFNPQVBfWE1MX0RPTSBydW50aW1lIGZsYWcuIElmCit0aGVyZSBpcyBubyBET00sIGl0IHZlcmlmaWVzIHRoZSBzaWduYXR1cmUgb2YgdGhlIGRlc2VyaWFsaXplZCBTaWduZWRJbmZvCitlbGVtZW50IGluIHRoZSBTT0FQIEhlYWRlci4gSG93ZXZlciwgc2VyaWFsaXppbmcgZGVzZXJpYWxpemVkIGRhdGEgbWF5IGNoYW5nZQordGhlIG9jdGV0IHN0cmVhbSB0aGF0IHdhcyBzaWduZWQsIHVubGVzcyB3ZSdyZSB1c2luZyBnU09BUCBhcyBwcm9kdWNlcnMgYW5kCitjb25zdW1lcnMgKHdpdGggdGhlIFNPQVBfWE1MX0lOREVOVCBmbGFnIHJlc2V0KS4KKyovCitpbnQKK3NvYXBfd3NzZV92ZXJpZnlfU2lnbmF0dXJlVmFsdWUoc3RydWN0IHNvYXAgKnNvYXAsIGludCBhbGcsIGNvbnN0IHZvaWQgKmtleSwgaW50IGtleWxlbikKK3sgZHNfX1NpZ25hdHVyZVR5cGUgKnNpZ25hdHVyZSA9IHNvYXBfd3NzZV9TaWduYXR1cmUoc29hcCk7CisgIERCR0ZVTjEoInNvYXBfd3NzZV92ZXJpZnlfU2lnbmF0dXJlVmFsdWUiLCAiYWxnPSVkIiwgYWxnKTsKKyAgLyogYWx3YXlzIG5lZWQgYW4gSE1BQyBzZWNyZXQga2V5IG9yIERTQS9SU0EgcHVibGljIGtleSB0byB2ZXJpZnkgKi8KKyAgaWYgKCFrZXkpCisgICAgcmV0dXJuIHNvYXBfd3NzZV9mYXVsdChzb2FwLCB3c3NlX19TZWN1cml0eVRva2VuVW5hdmFpbGFibGUsIE5VTEwpOworICAvKiB2ZXJpZnkgdGhlIFNpZ25lZEluZm8gZWxlbWVudCB3aXRoIHRoZSBTaWduYXR1cmVWYWx1ZSBlbGVtZW50ICovCisgIGlmIChzaWduYXR1cmUKKyAgICYmIHNpZ25hdHVyZS0+U2lnbmVkSW5mbworICAgJiYgc2lnbmF0dXJlLT5TaWduYXR1cmVWYWx1ZSkKKyAgeyBjb25zdCBjaGFyICpzaWc7CisgICAgaW50IG1ldGhvZCwgc2lnbGVuOworICAgIC8qIGNoZWNrIHRoYXQgd2UgYXJlIHVzaW5nIHRoZSBpbnRlbmRlZCBzaWduYXR1cmUgYWxnb3JpdGhtICovCisgICAgaWYgKHNvYXBfd3NzZV9nZXRfU2lnbmVkSW5mb19TaWduYXR1cmVNZXRob2Qoc29hcCwgJm1ldGhvZCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKGFsZyAhPSBtZXRob2QpCisgICAgICByZXR1cm4gc29hcF93c3NlX2ZhdWx0KHNvYXAsIHdzc2VfX0ZhaWxlZENoZWNrLCAiSW5jb3JyZWN0IHNpZ25hdHVyZSBhbGdvcml0aG0iKTsKKyAgICAvKiByZXRyaWV2ZSB0aGUgc2lnbmF0dXJlICovCisgICAgc2lnID0gc29hcF9iYXNlNjQycyhzb2FwLCBzaWduYXR1cmUtPlNpZ25hdHVyZVZhbHVlLCBOVUxMLCAwLCAmc2lnbGVuKTsKKyAgICAvKiBzZWFyY2ggdGhlIERPTSBmb3IgU2lnbmVkSW5mbyAqLworICAgIGlmIChzb2FwLT5kb20pCisgICAgeyBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqZWx0OworICAgICAgLyogdHJhdmVyc2UgdGhlIERPTSB3aGlsZSBzZWFyY2hpbmcgZm9yIFNpZ25lZEluZm8gaW4gdGhlIGRzIG5hbWVzcGFjZSAqLworICAgICAgZm9yIChlbHQgPSBzb2FwLT5kb207IGVsdDsgZWx0ID0gc29hcF9kb21fbmV4dF9lbGVtZW50KGVsdCkpCisgICAgICB7IGlmIChlbHQtPm5hbWUKKyAgICAgICAgICYmIGVsdC0+bnN0cgorCSAmJiAhc3RyY21wKGVsdC0+bnN0ciwgZHNfVVJJKQorCSAmJiAoIXN0cmNtcChlbHQtPm5hbWUsICJTaWduZWRJbmZvIikgfHwgIXNvYXBfdGFnX2NtcChlbHQtPm5hbWUsICIqOlNpZ25lZEluZm8iKSkpCisJICBicmVhazsKKyAgICAgIH0KKyAgICAgIC8qIGZvdW5kIGl0PyAqLworICAgICAgaWYgKGVsdCkKKyAgICAgIHsgLyogb3V0cHV0IHRoZSBET00gImFzIGlzIiAqLworCXNvYXAtPm1vZGUgJj0gflNPQVBfWE1MX0NBTk9OSUNBTDsKKwlzb2FwLT5tb2RlIHw9IFNPQVBfRE9NX0FTSVM7CisJLyogc2hvdWxkIG5vdCBpbmNsdWRlIGxlYWRpbmcgd2hpdGVzcGFjZSBpbiBzaWduYXR1cmUgdmVyaWZpY2F0aW9uICovCisJZWx0LT5oZWFkID0gTlVMTDsKKyAgICAgICAgLyogdXNlIHNtZGV2cCBlbmdpbmUgdG8gdmVyaWZ5IFNpZ25lZEluZm8gKi8KKyAgICAgICAgaWYgKHNvYXBfc21kX2JlZ2luKHNvYXAsIGFsZywga2V5LCBrZXlsZW4pCisgICAgICAgICB8fCBzb2FwX291dF94c2RfX2FueVR5cGUoc29hcCwgTlVMTCwgMCwgZWx0LCBOVUxMKQorICAgICAgICAgfHwgc29hcF9zbWRfZW5kKHNvYXAsIChjaGFyKilzaWcsICZzaWdsZW4pKQorICAgICAgICAgIHJldHVybiBzb2FwX3dzc2VfZmF1bHQoc29hcCwgd3NzZV9fRmFpbGVkQ2hlY2ssIE5VTEwpOworICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgaW50IGVyciA9IFNPQVBfT0s7CisgICAgICBjb25zdCBjaGFyICpjMTRuZXhjbHVkZTsKKyAgICAgIHNvYXBfbW9kZSBtb2RlOworICAgICAgLyogc2VyaWFsaXplIHRoZSBTaWduZWRJbmZvIGVsZW1lbnQgYXMgaXQgYXBwZWFyZWQgaW4gdGhlIFNPQVAgSGVhZGVyICovCisgICAgICBzb2FwLT5sZXZlbCA9IDQ7CisgICAgICBjMTRuZXhjbHVkZSA9IHNvYXAtPmMxNG5leGNsdWRlOworICAgICAgc29hcC0+YzE0bmV4Y2x1ZGUgPSAiZHMiOworICAgICAgbW9kZSA9IHNvYXAtPm1vZGU7CisgICAgICBpZiAoc2lnbmF0dXJlLT5TaWduZWRJbmZvLT5DYW5vbmljYWxpemF0aW9uTWV0aG9kKQorICAgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfWE1MX0NBTk9OSUNBTDsKKyAgICAgIGVsc2UKKyAgICAgICAgc29hcC0+bW9kZSAmPSB+U09BUF9YTUxfQ0FOT05JQ0FMOworICAgICAgaWYgKHNvYXBfc21kX2JlZ2luKHNvYXAsIGFsZywga2V5LCBrZXlsZW4pCisgICAgICAgfHwgc29hcF9vdXRfZHNfX1NpZ25lZEluZm9UeXBlKHNvYXAsICJkczpTaWduZWRJbmZvIiwgMCwgc2lnbmF0dXJlLT5TaWduZWRJbmZvLCBOVUxMKQorICAgICAgIHx8IHNvYXBfc21kX2VuZChzb2FwLCAoY2hhciopc2lnLCAmc2lnbGVuKSkKKyAgICAgICAgZXJyID0gc29hcC0+ZXJyb3I7CisgICAgICBzb2FwLT5tb2RlID0gbW9kZTsKKyAgICAgIHNvYXAtPmMxNG5leGNsdWRlID0gYzE0bmV4Y2x1ZGU7CisgICAgICBpZiAoZXJyKQorICAgICAgICByZXR1cm4gc29hcF93c3NlX2ZhdWx0KHNvYXAsIHdzc2VfX0ZhaWxlZENoZWNrLCBOVUxMKTsKKyAgICAgIHJldHVybiBTT0FQX09LOworICAgIH0KKyAgfQorICByZXR1cm4gc29hcF93c3NlX2ZhdWx0KHNvYXAsIHdzc2VfX0ZhaWxlZENoZWNrLCAiU2lnbmF0dXJlIHJlcXVpcmVkIik7Cit9CisKKy8qKgorQGZuIGludCBzb2FwX3dzc2VfdmVyaWZ5X1NpZ25lZEluZm8oc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYgVmVyaWZpZXMgdGhlIGRpZ2VzdCB2YWx1ZXMgb2YgdGhlIFhNTCBlbGVtZW50cyByZWZlcmVuY2VkIGJ5IHRoZSBTaWduZWRJbmZvIFJlZmVyZW5jZXMuCitAcGFyYW0gc29hcCBjb250ZXh0CitAcmV0dXJuIFNPQVBfT0sgb3IgZmF1bHQKKworVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgdGhlIFNpZ25lZEluZm8gZWxlbWVudCBpbiB0aGUgc29hcC0+ZG9tIERPTSB0cmVlIHRvCit2ZXJpZnkgdGhlIGRpZ2VzdHMgY29udGFpbmVkIHRoZXJlaW4uIFVzaW5nIHRoZSBET00gZW5zdXJlcyB3ZSB3aWxsIHZlcmlmeSB0aGUKK2RpZ2VzdHMgb2YgdGhlIGxvY2FsbHkgc2lnbmVkIGVsZW1lbnRzIGFzIHRoZXkgd2VyZSBleGFjdGx5IHJlY2VpdmVkIGJ5IHRoZQorcGFyc2VyLCBieSB1c2luZyB0aGUgLURXSVRIX0RPTSBjb21waWxlIGZsYWcgYW5kIFNPQVBfWE1MX0RPTSBydW50aW1lIGZsYWcuIElmCit0aGVyZSBpcyBubyBET00sIHRoZSBmdW5jdGlvbiBmYWlscy4KKyovCitpbnQKK3NvYXBfd3NzZV92ZXJpZnlfU2lnbmVkSW5mbyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgZHNfX1NpZ25lZEluZm9UeXBlICpzaWduZWRJbmZvID0gc29hcF93c3NlX1NpZ25lZEluZm8oc29hcCk7CisgIERCR0ZVTigic29hcF93c3NlX3ZlcmlmeV9TaWduZWRJbmZvIik7CisgIGlmIChzaWduZWRJbmZvKQorICB7IGludCBpOworICAgIC8qIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgcmVmZXJlbmNlIGVsZW1lbnQgKi8KKyAgICBpZiAoc2lnbmVkSW5mby0+X19zaXplUmVmZXJlbmNlID09IDApCisgICAgICByZXR1cm4gc29hcF93c3NlX2ZhdWx0KHNvYXAsIHdzc2VfX0ludmFsaWRTZWN1cml0eSwgIk5vIFNpZ25lZEluZm8vUmVmZXJlbmNlIik7CisgICAgLyogZm9yIGVhY2ggcmVmZXJlbmNlIGVsZW1lbnQsIGNoZWNrIHRoZSBkaWdlc3QgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgc2lnbmVkSW5mby0+X19zaXplUmVmZXJlbmNlOyBpKyspCisgICAgeyBkc19fUmVmZXJlbmNlVHlwZSAqcmVmZXJlbmNlID0gc2lnbmVkSW5mby0+UmVmZXJlbmNlW2ldOworICAgICAgLyogcmVmZXJlbmNlIGVsZW1lbnQgaXMgY29tcGxldGU/ICovCisgICAgICBpZiAoIXJlZmVyZW5jZS0+VVJJCisgICAgICAgfHwgIXJlZmVyZW5jZS0+RGlnZXN0TWV0aG9kCisgICAgICAgfHwgIXJlZmVyZW5jZS0+RGlnZXN0TWV0aG9kLT5BbGdvcml0aG0KKyAgICAgICB8fCAhcmVmZXJlbmNlLT5EaWdlc3RWYWx1ZSkKKyAgICAgICAgcmV0dXJuIHNvYXBfd3NzZV9mYXVsdChzb2FwLCB3c3NlX19JbnZhbGlkU2VjdXJpdHksICJJbmNvbXBsZXRlIFNpZ25lZEluZm8vUmVmZXJlbmNlIik7CisgICAgICAvKiByZWZlcmVuY2UgaXMgbG9jYWw/ICovCisgICAgICBpZiAoKnJlZmVyZW5jZS0+VVJJID09ICcjJykKKyAgICAgIHsgaW50IGFsZzsKKyAgICAgICAgdW5zaWduZWQgY2hhciBoYXNoW1NPQVBfU01EX01BWF9TSVpFXTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJWZXJpZnlpbmcgZGlnZXN0IG9mIGxvY2FsbHkgcmVmZXJlbmNlZCBkYXRhICVzXG4iLCByZWZlcmVuY2UtPlVSSSkpOworCS8qIGRpZ2VzdCBhbGdvcml0aG0gc2hvdWxkIGJlIFNIQTEgKi8KKyAgICAgICAgaWYgKCFzdHJjbXAocmVmZXJlbmNlLT5EaWdlc3RNZXRob2QtPkFsZ29yaXRobSwgZHNfc2hhMVVSSSkpCisgICAgICAgICAgYWxnID0gU09BUF9TTURfREdTVF9TSEExOworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuIHNvYXBfd3NzZV9mYXVsdChzb2FwLCB3c3NlX19VbnN1cHBvcnRlZEFsZ29yaXRobSwgcmVmZXJlbmNlLT5EaWdlc3RNZXRob2QtPkFsZ29yaXRobSk7CisJLyogaWYgcmVmZXJlbmNlIGhhcyBhIHRyYW5zZm9ybSwgaXQgc2hvdWxkIGJlIGFuIGV4Yy1jMTRuIHRyYW5zZm9ybSAqLworICAgICAgICBpZiAocmVmZXJlbmNlLT5UcmFuc2Zvcm1zCisJICYmIChyZWZlcmVuY2UtPlRyYW5zZm9ybXMtPl9fc2l6ZVRyYW5zZm9ybSAhPSAxCisJICB8fCAhcmVmZXJlbmNlLT5UcmFuc2Zvcm1zLT5UcmFuc2Zvcm1bMF0uQWxnb3JpdGhtCisJICB8fCBzdHJjbXAocmVmZXJlbmNlLT5UcmFuc2Zvcm1zLT5UcmFuc2Zvcm1bMF0uQWxnb3JpdGhtLCBjMTRuX1VSSSkpKQorICAgICAgICAgIHJldHVybiBzb2FwX3dzc2VfZmF1bHQoc29hcCwgd3NzZV9fVW5zdXBwb3J0ZWRBbGdvcml0aG0sIHJlZmVyZW5jZS0+VHJhbnNmb3Jtcy0+VHJhbnNmb3JtWzBdLkFsZ29yaXRobSk7CisJLyogY29udmVydCBiYXNlNjQgZGlnZXN0IHRvIGJpbmFyeSAqLworCXNvYXBfYmFzZTY0MnMoc29hcCwgcmVmZXJlbmNlLT5EaWdlc3RWYWx1ZSwgaGFzaCwgU09BUF9TTURfTUFYX1NJWkUsIE5VTEwpOworCS8qIHZlcmlmeSB0aGUgZGlnZXN0IG9mIGEgbG9jYWxseSBzaWduZWQgZWxlbWVudCAqLworICAgICAgICBpZiAoc29hcF93c3NlX3ZlcmlmeV9kaWdlc3Qoc29hcCwgYWxnLCByZWZlcmVuY2UtPlVSSSArIDEsIGhhc2gpKQorCSAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICByZXR1cm4gc29hcF93c3NlX2ZhdWx0KHNvYXAsIHdzc2VfX0ludmFsaWRTZWN1cml0eSwgIk5vIFNpZ25lZEluZm8iKTsKK30KKworLyoqCitAZm4gaW50IHNvYXBfd3NzZV92ZXJpZnlfZGlnZXN0KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgYWxnLCBjb25zdCBjaGFyICppZCwgdW5zaWduZWQgY2hhciBoYXNoW1NPQVBfU01EX01BWF9TSVpFXSkKK0BicmllZiBWZXJpZmllcyB0aGUgZGlnZXN0IHZhbHVlIG9mIGFuIFhNTCBlbGVtZW50IHJlZmVyZW5jZWQgYnkgaWQgYWdhaW5zdCB0aGUgaGFzaC4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0BwYXJhbVtpbl0gYWxnIGRpZ2VzdCBhbGdvcml0aG0KK0BwYXJhbVtpbl0gaWQgc3RyaW5nIG9mIHRoZSBYTUwgZWxlbWVudCB0byB2ZXJpZnkKK0BwYXJhbVtpbl0gaGFzaCBkaWdlc3QgdmFsdWUgdG8gdmVyaWZ5IGFnYWluc3QKK0ByZXR1cm4gU09BUF9PSyBvciBmYXVsdAorKi8KK2ludAorc29hcF93c3NlX3ZlcmlmeV9kaWdlc3Qoc3RydWN0IHNvYXAgKnNvYXAsIGludCBhbGcsIGNvbnN0IGNoYXIgKmlkLCB1bnNpZ25lZCBjaGFyIGhhc2hbU09BUF9TTURfTUFYX1NJWkVdKQoreyBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqZWx0OworICBEQkdGVU4xKCJzb2FwX3dzc2VfdmVyaWZ5X2RpZ2VzdCIsICJhbGc9JWQiLCBhbGcpOworICAvKiB0cmF2ZXJzZSB0aGUgRE9NIHRvIGZpbmQgdGhlIGVsZW1lbnQgd2l0aCBtYXRjaGluZyB3c3U6SWQgb3IgZHM6SWQgKi8KKyAgZm9yIChlbHQgPSBzb2FwLT5kb207IGVsdDsgZWx0ID0gc29hcF9kb21fbmV4dF9lbGVtZW50KGVsdCkpCisgIHsgc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAqYXR0OworICAgIGZvciAoYXR0ID0gZWx0LT5hdHRzOyBhdHQ7IGF0dCA9IGF0dC0+bmV4dCkKKyAgICB7IC8qIGNoZWNrIGF0dHJpYnV0ZSAqLworICAgICAgaWYgKGF0dC0+bmFtZQorICAgICAgICYmIGF0dC0+bnN0cgorICAgICAgICYmICghc3RyY21wKGF0dC0+bnN0ciwgd3N1X1VSSSkgfHwgIXN0cmNtcChhdHQtPm5zdHIsIGRzX1VSSSkpCisgICAgICAgJiYgKCFzdHJjbXAoYXR0LT5uYW1lLCAiSWQiKSB8fCAhc29hcF90YWdfY21wKGF0dC0+bmFtZSwgIio6SWQiKSkpCisgICAgICB7IC8qIGZvdW5kIGEgbWF0Y2gsIGNvbXBhcmUgYXR0cmlidXRlIHZhbHVlIHdpdGggaWQgKi8KKyAgICAgICAgaWYgKGF0dC0+ZGF0YSAmJiAhc3RyY21wKGF0dC0+ZGF0YSwgaWQpKQorICAgICAgICB7IHVuc2lnbmVkIGNoYXIgSEFbU09BUF9TTURfU0hBMV9TSVpFXTsKKyAgICAgICAgICBpbnQgbGVuOworCSAgLyogY29tcHV0ZSBkaWdlc3Qgb3ZlciBET00gbm9kZSAiYXMgaXMiICovCisJICBzb2FwLT5tb2RlICY9IH5TT0FQX1hNTF9DQU5PTklDQUw7CisJICBzb2FwLT5tb2RlIHw9IFNPQVBfRE9NX0FTSVM7CisJICAvKiBkbyBub3QgaGFzaCBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KKwkgIGVsdC0+aGVhZCA9IE5VTEw7CisgICAgICAgICAgLyogY29tcHV0ZSBkaWdlc3QgKi8KKwkgIGlmIChzb2FwX3NtZF9iZWdpbihzb2FwLCBhbGcsIE5VTEwsIDApCisJICAgfHwgc29hcF9vdXRfeHNkX19hbnlUeXBlKHNvYXAsIE5VTEwsIDAsIGVsdCwgTlVMTCkKKwkgICB8fCBzb2FwX3NtZF9lbmQoc29hcCwgSEEsICZsZW4pKQorICAgICAgICAgICAgcmV0dXJuIHNvYXBfd3NzZV9mYXVsdChzb2FwLCB3c3NlX19GYWlsZWRDaGVjaywgIkNvdWxkIG5vdCBjb21wdXRlIGRpZ2VzdCIpOworCSAgLyogY29tcGFyZSBkaWdlc3RzLCBzdWNjZXNzIGlmIGlkZW50aWNhbCAqLworCSAgaWYgKCFtZW1jbXAoaGFzaCwgSEEsIChzaXplX3QpbGVuKSkKKwkgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgICAgICAgcmV0dXJuIHNvYXBfd3NzZV9mYXVsdChzb2FwLCB3c3NlX19GYWlsZWRDaGVjaywgIlNpZ25lZEluZm8gZGlnZXN0IG1pc21hdGNoIik7CisJfQorICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gc29hcF93c3NlX2ZhdWx0KHNvYXAsIHdzc2VfX0ZhaWxlZENoZWNrLCAiU2lnbmVkSW5mbyByZWZlcmVuY2UgdGFyZ2V0IG5vdCBmb3VuZCIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqIGRzOlNpZ25hdHVyZS9LZXlJbmZvCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCitAZm4gZHNfX0tleUluZm9UeXBlKiBzb2FwX3dzc2VfYWRkX0tleUluZm8oc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYgQWRkcyBLZXlJbmZvIGVsZW1lbnQuCitAcGFyYW0gc29hcCBjb250ZXh0CitAcmV0dXJuIGRzX19LZXlJbmZvIG9iamVjdAorKi8KK3N0cnVjdCBkc19fS2V5SW5mb1R5cGUqCitzb2FwX3dzc2VfYWRkX0tleUluZm8oc3RydWN0IHNvYXAgKnNvYXApCit7IGRzX19TaWduYXR1cmVUeXBlICpzaWduYXR1cmUgPSBzb2FwX3dzc2VfYWRkX1NpZ25hdHVyZShzb2FwKTsKKyAgaWYgKCFzaWduYXR1cmUtPktleUluZm8pCisgICAgc2lnbmF0dXJlLT5LZXlJbmZvID0gKGRzX19LZXlJbmZvVHlwZSopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKGRzX19LZXlJbmZvVHlwZSkpOworICBzb2FwX2RlZmF1bHRfZHNfX0tleUluZm9UeXBlKHNvYXAsIHNpZ25hdHVyZS0+S2V5SW5mbyk7CisgIHJldHVybiBzaWduYXR1cmUtPktleUluZm87Cit9CisKKy8qKgorQGZuIGRzX19LZXlJbmZvVHlwZSogc29hcF93c3NlX0tleUluZm8oc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYgUmV0dXJucyBLZXlJbmZvIGVsZW1lbnQgaWYgcHJlc2VudC4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0ByZXR1cm4gZHNfX0tleUluZm8gb2JqZWN0IG9yIE5VTEwKKyovCitzdHJ1Y3QgZHNfX0tleUluZm9UeXBlKgorc29hcF93c3NlX0tleUluZm8oc3RydWN0IHNvYXAgKnNvYXApCit7IGRzX19TaWduYXR1cmVUeXBlICpzaWduYXR1cmUgPSBzb2FwX3dzc2VfU2lnbmF0dXJlKHNvYXApOworICBpZiAoc2lnbmF0dXJlKQorICAgIHJldHVybiBzaWduYXR1cmUtPktleUluZm87CisgIHJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqIGRzOlNpZ25hdHVyZS9LZXlJbmZvL0tleU5hbWUKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKK0BmbiBpbnQgc29hcF93c3NlX2FkZF9LZXlJbmZvX0tleU5hbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUpCitAYnJpZWYgQWRkcyBLZXlOYW1lIGVsZW1lbnQuCitAcGFyYW0gc29hcCBjb250ZXh0CitAcGFyYW1baW5dIG5hbWUgc3RyaW5nIG9mIHRoZSBLZXlOYW1lCitAcmV0dXJuIFNPQVBfT0sKKworTm90ZTogdGhlIHJlY29tbWVuZGVkIG1ldGhvZCB0byBhZGQgS2V5IGluZm9ybWF0aW9uIGlzIHRvIHV0aWxpemUgS2V5SWRlbnRpZmllcgoraW5zdGVhZCBvZiBLZXlOYW1lLiBBIEtleU5hbWUgaXMgdXNlZnVsIG1haW5seSBmb3IgaW50ZXJuYWwgdXNlLgorKi8KK2ludAorc29hcF93c3NlX2FkZF9LZXlJbmZvX0tleU5hbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUpCit7IGRzX19LZXlJbmZvVHlwZSAqa2V5SW5mbyA9IHNvYXBfd3NzZV9hZGRfS2V5SW5mbyhzb2FwKTsKKyAgREJHRlVOMSgic29hcF93c3NlX2FkZF9LZXlJbmZvX0tleU5hbWUiLCAibmFtZT0lcyIsIG5hbWUpOworICAvKiBwb3B1bGF0ZSB0aGUgS2V5TmFtZSBlbGVtZW50ICovCisgIGtleUluZm8tPktleU5hbWUgPSBzb2FwX3N0cmR1cChzb2FwLCBuYW1lKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKgorQGZuIGludCBzb2FwX3dzc2VfZ2V0X0tleUluZm9fS2V5TmFtZShzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZiBSZXR1cm5zIEtleU5hbWUgZWxlbWVudCBpZiBwcmVzZW50LgorQHBhcmFtIHNvYXAgY29udGV4dAorQHJldHVybiBzdHJpbmcgb3IgTlVMTAorKi8KK2NvbnN0IGNoYXIqCitzb2FwX3dzc2VfZ2V0X0tleUluZm9fS2V5TmFtZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgZHNfX0tleUluZm9UeXBlICprZXlJbmZvID0gc29hcF93c3NlX0tleUluZm8oc29hcCk7CisgIERCR0ZVTigic29hcF93c3NlX2dldF9LZXlJbmZvX0tleU5hbWUiKTsKKyAgaWYgKCFrZXlJbmZvKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4ga2V5SW5mby0+S2V5TmFtZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKiBkczpTaWduYXR1cmUvS2V5SW5mby93c3NlOlNlY3VyaXR5VG9rZW5SZWZlcmVuY2UvUmVmZXJlbmNlL0BVUkkKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKK0BmbiBpbnQgc29hcF93c3NlX2FkZF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VVUkkoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKlVSSSwgY29uc3QgY2hhciAqdmFsdWVUeXBlKQorQGJyaWVmIEFkZHMgS2V5SW5mbyBlbGVtZW50IHdpdGggU2VjdXJpdHlUb2tlblJlZmVyZW5jZSBVUkkuCitAcGFyYW0gc29hcCBjb250ZXh0CitAcGFyYW1baW5dIFVSSSBzdHJpbmcgcmVmZXJlbmNpbmcgYSBzZWN1cml0eSB0b2tlbgorQHBhcmFtW2luXSB2YWx1ZVR5cGUgc3RyaW5nIG9yIE5VTEwKK0ByZXR1cm4gU09BUF9PSworKi8KK2ludAorc29hcF93c3NlX2FkZF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VVUkkoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKlVSSSwgY29uc3QgY2hhciAqdmFsdWVUeXBlKQoreyBkc19fS2V5SW5mb1R5cGUgKmtleUluZm8gPSBzb2FwX3dzc2VfYWRkX0tleUluZm8oc29hcCk7CisgIERCR0ZVTjIoInNvYXBfd3NzZV9hZGRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlVVJJIiwgIlVSST0lcyIsIFVSST9VUkk6IiIsICJ2YWx1ZVR5cGU9JXMiLCB2YWx1ZVR5cGU/dmFsdWVUeXBlOiIiKTsKKyAgLyogYWxsb2NhdGUgU2VjdXJpdHlUb2tlblJlZmVyZW5jZSBlbGVtZW50IGlmIHdlIGRvbid0IGhhdmUgb25lIGFscmVhZHkgKi8KKyAgaWYgKCFrZXlJbmZvLT53c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlKQorICAgIGtleUluZm8tPndzc2VfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2UgPSAoX3dzc2VfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2UqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihfd3NzZV9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZSkpOworICBzb2FwX2RlZmF1bHRfX3dzc2VfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2Uoc29hcCwga2V5SW5mby0+d3NzZV9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZSk7CisgIC8qIGFsbG9jYXRlIFJlZmVyZW5jZSBlbGVtZW50ICovCisgIGtleUluZm8tPndzc2VfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2UtPlJlZmVyZW5jZSA9IChfd3NzZV9fUmVmZXJlbmNlKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2YoX3dzc2VfX1JlZmVyZW5jZSkpOworICBzb2FwX2RlZmF1bHRfX3dzc2VfX1JlZmVyZW5jZShzb2FwLCBrZXlJbmZvLT53c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlLT5SZWZlcmVuY2UpOworICAvKiBwb3B1bGF0ZSB0aGUgUmVmZXJlbmNlIGVsZW1lbnQgKi8KKyAga2V5SW5mby0+d3NzZV9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZS0+UmVmZXJlbmNlLT5VUkkgPSBzb2FwX3N0cmR1cChzb2FwLCBVUkkpOworICBrZXlJbmZvLT53c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlLT5SZWZlcmVuY2UtPlZhbHVlVHlwZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHZhbHVlVHlwZSk7CisgIHJldHVybiBTT0FQX09LOworfQorCisvKioKK0BmbiBpbnQgc29hcF93c3NlX2FkZF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VYNTA5KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpVUkkpCitAYnJpZWYgQWRkcyBLZXlJbmZvIGVsZW1lbnQgd2l0aCBTZWN1cml0eVRva2VuUmVmZXJlbmNlIFVSSSB0byBhbiBYNTA5IGNlcnQuCitAcGFyYW0gc29hcCBjb250ZXh0CitAcGFyYW1baW5dIFVSSSBzdHJpbmcgcmVmZXJlbmNpbmcgYW4gWDUwOSBjZXJ0aWZpY2F0ZQorQHJldHVybiBTT0FQX09LCisqLworaW50Citzb2FwX3dzc2VfYWRkX0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZVg1MDkoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKlVSSSkKK3sgcmV0dXJuIHNvYXBfd3NzZV9hZGRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlVVJJKHNvYXAsIFVSSSwgd3NzZV9YNTA5djNVUkkpOworfQorCisvKioKK0BmbiBjb25zdCBjaGFyKiBzb2FwX3dzc2VfZ2V0X0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZVVSSShzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZiBSZXR1cm5zIGEgU2VjdXJpdHlUb2tlblJlZmVyZW5jZSBVUkkgaWYgcHJlc2VudC4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0ByZXR1cm4gc3RyaW5nIG9yIE5VTEwKKyovCitjb25zdCBjaGFyKgorc29hcF93c3NlX2dldF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VVUkkoc3RydWN0IHNvYXAgKnNvYXApCit7IGRzX19LZXlJbmZvVHlwZSAqa2V5SW5mbyA9IHNvYXBfd3NzZV9LZXlJbmZvKHNvYXApOworICBpZiAoa2V5SW5mbworICAgJiYga2V5SW5mby0+d3NzZV9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZQorICAgJiYga2V5SW5mby0+d3NzZV9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZS0+UmVmZXJlbmNlKQorICAgIHJldHVybiBrZXlJbmZvLT53c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlLT5SZWZlcmVuY2UtPlVSSTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorQGZuIFg1MDkqIHNvYXBfd3NzZV9nZXRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlWDUwOShzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZiBSZXR1cm5zIGEgWDUwOSBjZXJ0aWZpY2F0ZSBpZiBwcmVzZW50IGFzIGEgQmluYXJ5U2VjdXJpdHkgdG9rZW4uCitAcGFyYW0gc29hcCBjb250ZXh0CitAcmV0dXJuIFg1MDkgb2JqZWN0IG9yIE5VTEwgd2l0aCB3c3NlOlNlY3VyaXR5VG9rZW5VbmF2YWlsYWJsZSBmYXVsdAorKi8KK1g1MDkqCitzb2FwX3dzc2VfZ2V0X0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZVg1MDkoc3RydWN0IHNvYXAgKnNvYXApCit7IGNvbnN0IGNoYXIgKlVSSSA9IHNvYXBfd3NzZV9nZXRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlVVJJKHNvYXApOworICBEQkdGVU4oInNvYXBfd3NzZV9nZXRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlWDUwOSIpOworICAvKiBUT0RPOiBjYW4ndCBodXJ0IHRvIGRvdWJsZSBjaGVjayBSZWZlcmVuY2UtPlZhbHVlVHlwZSAqLworICBpZiAoVVJJICYmICpVUkkgPT0gJyMnKQorICAgIHJldHVybiBzb2FwX3dzc2VfZ2V0X0JpbmFyeVNlY3VyaXR5VG9rZW5YNTA5KHNvYXAsIFVSSSArIDEpOworICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKiBkczpTaWduYXR1cmUvS2V5SW5mby93c3NlOlNlY3VyaXR5VG9rZW5SZWZlcmVuY2UvUmVmZXJlbmNlL0tleUlkZW50aWZpZXIKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKK0BmbiBpbnQgc29hcF93c3NlX2FkZF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VLZXlJZGVudGlmaWVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqdmFsdWVUeXBlLCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgc2l6ZSkKK0BicmllZiBBZGRzIEtleUluZm8gZWxlbWVudCB3aXRoIFNlY3VyaXR5VG9rZW5SZWZlcmVuY2UvS2V5SWRlbnRpZmllciBiaW5hcnkgZGF0YQorQHBhcmFtIHNvYXAgY29udGV4dAorQHBhcmFtW2luXSBpZCBzdHJpbmcgZm9yIHNpZ25hdHVyZSByZWZlcmVuY2UKK0BwYXJhbVtpbl0gdmFsdWVUeXBlIHN0cmluZworQHBhcmFtW2luXSBkYXRhIGJpbmFyeSBkYXRhCitAcGFyYW1baW5dIHNpemUgb2YgYmluYXJ5IGRhdGEKK0ByZXR1cm4gU09BUF9PSworKi8KK2ludAorc29hcF93c3NlX2FkZF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VLZXlJZGVudGlmaWVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqdmFsdWVUeXBlLCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgc2l6ZSkKK3sgZHNfX0tleUluZm9UeXBlICprZXlJbmZvID0gc29hcF93c3NlX2FkZF9LZXlJbmZvKHNvYXApOworICBEQkdGVU4yKCJzb2FwX3dzc2VfYWRkX0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZUtleUlkZW50aWZpZXIiLCAiaWQ9JXMiLCBpZD9pZDoiIiwgInZhbHVlVHlwZT0lcyIsIHZhbHVlVHlwZT92YWx1ZVR5cGU6IiIpOworICAvKiBhbGxvY2F0ZSBTZWN1cml0eVRva2VuUmVmZXJlbmNlIGlmIHdlIGRvbid0IGhhdmUgb25lIGFscmVhZHkgKi8KKyAgaWYgKCFrZXlJbmZvLT53c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlKQorICAgIGtleUluZm8tPndzc2VfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2UgPSAoX3dzc2VfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2UqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihfd3NzZV9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZSkpOworICBzb2FwX2RlZmF1bHRfX3dzc2VfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2Uoc29hcCwga2V5SW5mby0+d3NzZV9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZSk7CisgIC8qIGFsbG9jYXRlIEtleUlkZW50aWZpZXIgKi8KKyAga2V5SW5mby0+d3NzZV9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZS0+S2V5SWRlbnRpZmllciA9IChfd3NzZV9fS2V5SWRlbnRpZmllciopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKF93c3NlX19LZXlJZGVudGlmaWVyKSk7CisgIHNvYXBfZGVmYXVsdF9fd3NzZV9fS2V5SWRlbnRpZmllcihzb2FwLCBrZXlJbmZvLT53c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlLT5LZXlJZGVudGlmaWVyKTsKKyAgLyogcG9wdWxhdGUgS2V5SWRlbnRpZmllciAqLworICBrZXlJbmZvLT53c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlLT5LZXlJZGVudGlmaWVyLT53c3VfX0lkID0gc29hcF9zdHJkdXAoc29hcCwgaWQpOworICBrZXlJbmZvLT53c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlLT5LZXlJZGVudGlmaWVyLT5WYWx1ZVR5cGUgPSBzb2FwX3N0cmR1cChzb2FwLCB2YWx1ZVR5cGUpOworICBrZXlJbmZvLT53c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlLT5LZXlJZGVudGlmaWVyLT5FbmNvZGluZ1R5cGUgPSAoY2hhciopd3NzZV9CYXNlNjRCaW5hcnlVUkk7CisgIGtleUluZm8tPndzc2VfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2UtPktleUlkZW50aWZpZXItPl9faXRlbSA9IHNvYXBfczJiYXNlNjQoc29hcCwgZGF0YSwgTlVMTCwgc2l6ZSk7CisgIHJldHVybiBTT0FQX09LOworfQorCisvKioKK0BmbiBjb25zdCBjaGFyKiBzb2FwX3dzc2VfZ2V0X0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZUtleUlkZW50aWZpZXJWYWx1ZVR5cGUoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYgUmV0dXJucyBLZXlJbmZvL1NlY3VyaXR5VG9rZW5SZWZlcmVuY2UvS2V5SWRlbnRpZmllci9WYWx1ZVR5cGUgaWYgcHJlc2VudAorQHBhcmFtIHNvYXAgY29udGV4dAorQHJldHVybiBzdHJpbmcgb3IgTlVMTAorKi8KK2NvbnN0IGNoYXIqCitzb2FwX3dzc2VfZ2V0X0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZUtleUlkZW50aWZpZXJWYWx1ZVR5cGUoc3RydWN0IHNvYXAgKnNvYXApCit7IGRzX19LZXlJbmZvVHlwZSAqa2V5SW5mbyA9IHNvYXBfd3NzZV9LZXlJbmZvKHNvYXApOworICBEQkdGVU4oInNvYXBfd3NzZV9nZXRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlS2V5SWRlbnRpZmllclZhbHVlVHlwZSIpOworICBpZiAoIWtleUluZm8KKyAgIHx8ICFrZXlJbmZvLT53c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlCisgICB8fCAha2V5SW5mby0+d3NzZV9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZS0+S2V5SWRlbnRpZmllcikKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIGtleUluZm8tPndzc2VfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2UtPktleUlkZW50aWZpZXItPlZhbHVlVHlwZTsKK30KKworLyoqCitAZm4gY29uc3QgdW5zaWduZWQgY2hhciogc29hcF93c3NlX2dldF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VLZXlJZGVudGlmaWVyKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgKnNpemUpCitAYnJpZWYgUmV0dXJucyBLZXlJbmZvL1NlY3VyaXR5VG9rZW5SZWZlcmVuY2UvS2V5SWRlbnRpZmllciBiaW5hcnkgZGF0YQorQHBhcmFtIHNvYXAgY29udGV4dAorQHBhcmFtW291dF0gc2l6ZSBpcyBzZXQgdG8gdGhlIHNpemUgb2YgdGhlIGRlY29kZWQgZGF0YQorQHJldHVybiBkYXRhIG9yIE5VTEwKKyovCitjb25zdCB1bnNpZ25lZCBjaGFyKgorc29hcF93c3NlX2dldF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VLZXlJZGVudGlmaWVyKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgKnNpemUpCit7IGRzX19LZXlJbmZvVHlwZSAqa2V5SW5mbyA9IHNvYXBfd3NzZV9LZXlJbmZvKHNvYXApOworICBEQkdGVU4oInNvYXBfd3NzZV9nZXRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlS2V5SWRlbnRpZmllciIpOworICBpZiAoIWtleUluZm8KKyAgIHx8ICFrZXlJbmZvLT53c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlCisgICB8fCAha2V5SW5mby0+d3NzZV9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZS0+S2V5SWRlbnRpZmllcikKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHNvYXBfYmFzZTY0MnMoc29hcCwga2V5SW5mby0+d3NzZV9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZS0+S2V5SWRlbnRpZmllci0+X19pdGVtLCBOVUxMLCAwLCBzaXplKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKiBkczpTaWduYXR1cmUvS2V5SW5mby93c3NlOlNlY3VyaXR5VG9rZW5SZWZlcmVuY2UvUmVmZXJlbmNlL0VtYmVkZGVkCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCitAZm4gaW50IHNvYXBfd3NzZV9hZGRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlRW1iZWRkZWQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICp2YWx1ZVR5cGUpCitAYnJpZWYgQWRkcyBLZXlJbmZvIGVsZW1lbnQgd2l0aCBFbWJlZGRlZCBTZWN1cml0eVRva2VuUmVmZXJlbmNlLgorQHBhcmFtIHNvYXAgY29udGV4dAorQHBhcmFtW2luXSBpZCBzdHJpbmcgZm9yIHNpZ25hdHVyZSByZWZlcmVuY2UKK0BwYXJhbVtpbl0gdmFsdWVUeXBlIHN0cmluZworQHJldHVybiBTT0FQX09LCisKK05vdGU6IHRoaXMgZnVuY3Rpb24gaXMgdW5kZXIgY29uc3RydWN0aW9uIGFuZCB0aGUgcmVzdWx0IGRlcGVuZHMgb24gdXNhZ2UKK3NjZW5hcmlvcyBkZXBsb3llZCBpbiBwcmFjdGljZS4KKyovCitpbnQKK3NvYXBfd3NzZV9hZGRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlRW1iZWRkZWQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICp2YWx1ZVR5cGUpCit7IGRzX19LZXlJbmZvVHlwZSAqa2V5SW5mbyA9IHNvYXBfd3NzZV9hZGRfS2V5SW5mbyhzb2FwKTsKKyAgREJHRlVOKCJzb2FwX3dzc2VfZ2V0X0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZUVtYmVkZGVkIik7CisgIC8qIGFsbG9jYXRlIFNlY3VyaXR5VG9rZW5SZWZlcmVuY2UgaWYgd2UgZG9uJ3QgaGF2ZSBvbmUgYWxyZWFkeSAqLworICBpZiAoIWtleUluZm8tPndzc2VfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2UpCisgICAga2V5SW5mby0+d3NzZV9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZSA9IChfd3NzZV9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZSopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKF93c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlKSk7CisgIHNvYXBfZGVmYXVsdF9fd3NzZV9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZShzb2FwLCBrZXlJbmZvLT53c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlKTsKKyAgLyogYWxsb2NhdGUgRW1iZWRkZWQgZWxlbWVudCAqLworICBrZXlJbmZvLT53c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlLT5FbWJlZGRlZCA9IChfd3NzZV9fRW1iZWRkZWQqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihfd3NzZV9fRW1iZWRkZWQpKTsKKyAgc29hcF9kZWZhdWx0X193c3NlX19FbWJlZGRlZChzb2FwLCBrZXlJbmZvLT53c3NlX19TZWN1cml0eVRva2VuUmVmZXJlbmNlLT5FbWJlZGRlZCk7CisgIC8qIHBvcHVsYXRlIEVtYmVkZGVkIGVsZW1lbnQgKi8KKyAga2V5SW5mby0+d3NzZV9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZS0+RW1iZWRkZWQtPndzdV9fSWQgPSBzb2FwX3N0cmR1cChzb2FwLCBpZCk7CisgIGtleUluZm8tPndzc2VfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2UtPkVtYmVkZGVkLT5WYWx1ZVR5cGUgPSBzb2FwX3N0cmR1cChzb2FwLCB2YWx1ZVR5cGUpOworICAvKiBUT0RPOiBBZGQgZW1iZWRkZWQgdG9rZW5zIGFuZCBhc3NlcnRpb25zLiBDb3VsZCB1c2UgRE9NIGhlcmU/CisgIGtleUluZm8tPndzc2VfX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2UtPkVtYmVkZGVkLT54eXogPSAuLi47CisgICovCisgIHJldHVybiBTT0FQX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqIEZhdWx0cworICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorQGZuIGludCBzb2FwX3dzc2VfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXAsIHdzc2VfX0ZhdWx0Y29kZUVudW0gZmF1bHQsIGNvbnN0IGNoYXIgKmRldGFpbCkKK0BicmllZiBTZXRzIFNPQVAgRmF1bHQgKHN1Yiljb2RlIGZvciBzZXJ2ZXIgcmVzcG9uc2UuCitAcGFyYW0gc29hcCBjb250ZXh0CitAcGFyYW1baW5dIGZhdWx0IGlzIG9uZSBvZiB3c3NlOkZhdWx0Y29kZUVudW0KK0BwYXJhbVtpbl0gZGV0YWlsIHN0cmluZyB3aXRoIG9wdGlvbmFsIHRleHQgbWVzc2FnZQorQHJldHVybiBTT0FQX0ZBVUxUCisqLworaW50Citzb2FwX3dzc2VfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXAsIHdzc2VfX0ZhdWx0Y29kZUVudW0gZmF1bHQsIGNvbnN0IGNoYXIgKmRldGFpbCkKK3sgY29uc3QgY2hhciAqY29kZSA9IHNvYXBfd3NzZV9fRmF1bHRjb2RlRW51bTJzKHNvYXAsIGZhdWx0KTsKKyAgREJHRlVOMigic29hcF93c3NlX2ZhdWx0IiwgImZhdWx0PSVzIiwgY29kZT9jb2RlOiIiLCAiZGV0YWlsPSVzIiwgZGV0YWlsP2RldGFpbDoiIik7CisgIC8qIHJlbW92ZSBpbmNvcnJlY3Qgb3IgaW5jb21wbGV0ZSBTZWN1cml0eSBoZWFkZXIgKi8KKyAgc29hcF93c3NlX2RlbGV0ZV9TZWN1cml0eShzb2FwKTsKKyAgLyogcG9wdWxhdGUgdGhlIFNPQVAgRmF1bHQgYXMgcGVyIFdTLVNlY3VyaXR5IHNwZWMgKi8KKyAgc3dpdGNoIChmYXVsdCkKKyAgeyBjYXNlIHdzc2VfX1Vuc3VwcG9ydGVkU2VjdXJpdHlUb2tlbjoKKyAgICAgIHJldHVybiBzb2FwX3NlbmRlcl9mYXVsdF9zdWJjb2RlKHNvYXAsIGNvZGUsICJBbiB1bnN1cHBvcnRlZCB0b2tlbiB3YXMgcHJvdmlkZWQiLCBkZXRhaWwpOworICAgIGNhc2Ugd3NzZV9fVW5zdXBwb3J0ZWRBbGdvcml0aG06CisgICAgICByZXR1cm4gc29hcF9zZW5kZXJfZmF1bHRfc3ViY29kZShzb2FwLCBjb2RlLCAiQW4gdW5zdXBwb3J0ZWQgc2lnbmF0dXJlIG9yIGVuY3J5cHRpb24gYWxnb3JpdGhtIHdhcyB1c2VkIiwgZGV0YWlsKTsKKyAgICBjYXNlIHdzc2VfX0ludmFsaWRTZWN1cml0eToKKyAgICAgIHJldHVybiBzb2FwX3NlbmRlcl9mYXVsdF9zdWJjb2RlKHNvYXAsIGNvZGUsICJBbiBlcnJvciB3YXMgZGlzY292ZXJlZCBwcm9jZXNzaW5nIHRoZSA8d3NzZTpTZWN1cml0eT4gaGVhZGVyIiwgZGV0YWlsKTsKKyAgICBjYXNlIHdzc2VfX0ludmFsaWRTZWN1cml0eVRva2VuOgorICAgICAgcmV0dXJuIHNvYXBfc2VuZGVyX2ZhdWx0X3N1YmNvZGUoc29hcCwgY29kZSwgIkFuIGludmFsaWQgc2VjdXJpdHkgdG9rZW4gd2FzIHByb3ZpZGVkIiwgZGV0YWlsKTsKKyAgICBjYXNlIHdzc2VfX0ZhaWxlZEF1dGhlbnRpY2F0aW9uOgorICAgICAgcmV0dXJuIHNvYXBfc2VuZGVyX2ZhdWx0X3N1YmNvZGUoc29hcCwgY29kZSwgIlRoZSBzZWN1cml0eSB0b2tlbiBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCBvciBhdXRob3JpemVkIiwgZGV0YWlsKTsKKyAgICBjYXNlIHdzc2VfX0ZhaWxlZENoZWNrOgorICAgICAgcmV0dXJuIHNvYXBfc2VuZGVyX2ZhdWx0X3N1YmNvZGUoc29hcCwgY29kZSwgIlRoZSBzaWduYXR1cmUgb3IgZGVjcnlwdGlvbiB3YXMgaW52YWxpZCIsIGRldGFpbCk7CisgICAgY2FzZSB3c3NlX19TZWN1cml0eVRva2VuVW5hdmFpbGFibGU6CisgICAgICByZXR1cm4gc29hcF9zZW5kZXJfZmF1bHRfc3ViY29kZShzb2FwLCBjb2RlLCAiUmVmZXJlbmNlZCBzZWN1cml0eSB0b2tlbiBjb3VsZCBub3QgYmUgcmV0cmlldmVkIiwgZGV0YWlsKTsKKyAgfQorICByZXR1cm4gU09BUF9GQVVMVDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKiBEaWdlc3QgYXV0aGVudGljYXRpb24gc2Vzc2lvbiBtYW5hZ2VtZW50CisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCitAZm4gc3RhdGljIGludCBzb2FwX3dzc2Vfc2Vzc2lvbl92ZXJpZnkoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgaGFzaFtTT0FQX1NNRF9TSEExX1NJWkVdLCBjb25zdCBjaGFyICpjcmVhdGVkLCBjb25zdCBjaGFyICpub25jZSkKK0BicmllZiBWZXJpZmllcyBhbmQgdXBkYXRlcyB0aGUgZGlnZXN0LCBub25jZSwgYW5kIGNyZWF0aW9uIHRpbWUgYWdhaW5zdCB0aGUgZGlnZXN0IGF1dGhlbnRpY2F0aW9uIHNlc3Npb24gZGF0YWJhc2UgdG8gcHJldmVudCByZXBsYXkgYXR0YWNrcy4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0BwYXJhbVtpbl0gaGFzaCBiaW5hcnkgZGlnZXN0IHZhbHVlIG9mIFBhc3N3b3JkRGlnZXN0CitAcGFyYW1baW5dIGNyZWF0ZWQgc3RyaW5nCitAcGFyYW1baW5dIG5vbmNlIHN0cmluZyAoYmFzZTY0KQorQHJldHVybiBTT0FQX09LIG9yIFNPQVBfRkFVTFQKKyovCitzdGF0aWMgaW50Citzb2FwX3dzc2Vfc2Vzc2lvbl92ZXJpZnkoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgaGFzaFtTT0FQX1NNRF9TSEExX1NJWkVdLCBjb25zdCBjaGFyICpjcmVhdGVkLCBjb25zdCBjaGFyICpub25jZSkKK3sgc3RydWN0IHNvYXBfd3NzZV9zZXNzaW9uICpzZXNzaW9uOworICB0aW1lX3QgZXhwaXJlZCwgbm93ID0gdGltZShOVUxMKTsKKyAgREJHRlVOKCJzb2FwX3dzc2Vfc2Vzc2lvbl92ZXJpZnkiKTsKKyAgc29hcF9zMmRhdGVUaW1lKHNvYXAsIGNyZWF0ZWQsICZleHBpcmVkKTsKKyAgLyogY3JlYXRpb24gdGltZSBpbiB0aGUgZnV0dXJlPyAqLworICBpZiAoZXhwaXJlZCA+IG5vdyArIFNPQVBfV1NTRV9DTEtTS0VXKQorICAgIHJldHVybiBzb2FwX3dzc2VfZmF1bHQoc29hcCwgd3NzZV9fRmFpbGVkQXV0aGVudGljYXRpb24sICJBdXRob3JpemF0aW9uIHJlcXVlc3QgaW4gZnV0dXJlIik7CisgIGV4cGlyZWQgKz0gU09BUF9XU1NFX05PTkNFVElNRTsKKyAgLyogZXhwaXJlZD8gKi8KKyAgaWYgKGV4cGlyZWQgPD0gbm93KQorICAgIHJldHVybiBzb2FwX3dzc2VfZmF1bHQoc29hcCwgd3NzZV9fRmFpbGVkQXV0aGVudGljYXRpb24sICJBdXRoZW50aWNhdGlvbiBleHBpcmVkIik7CisgIC8qIHB1cmdlIGV4cGlyZWQgbWVzc2FnZXMsIGJ1dCBkb24ndCBkbyB0aGlzIGFsbCB0aGUgdGltZSB0byBpbXByb3ZlIGVmZmljaWVuY3kgKi8KKyAgaWYgKG5vdyAlIDEwID09IDApCisgICAgc29hcF93c3NlX3Nlc3Npb25fY2xlYW51cChzb2FwKTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJWZXJpZnlpbmcgc2Vzc2lvbiBub25jZT0lc1xuIiwgbm9uY2UpKTsKKyAgLyogZW50ZXIgbXV0ZXggdG8gY2hlY2sgYW5kIHVwZGF0ZSBzZXNzaW9uICovCisgIE1VVEVYX0xPQ0soc29hcF93c3NlX3Nlc3Npb25fbG9jayk7CisgIGZvciAoc2Vzc2lvbiA9IHNvYXBfd3NzZV9zZXNzaW9uOyBzZXNzaW9uOyBzZXNzaW9uID0gc2Vzc2lvbi0+bmV4dCkKKyAgeyBpZiAoIW1lbWNtcChzZXNzaW9uLT5oYXNoLCBoYXNoLCBTT0FQX1NNRF9TSEExX1NJWkUpICYmICFzdHJjbXAoc2Vzc2lvbi0+bm9uY2UsIG5vbmNlKSkKKyAgICAgIGJyZWFrOworICB9CisgIC8qIGlmIG5vdCBmb3VuZCwgYWxsb2NhdGUgbmV3IHNlc3Npb24gZGF0YSAqLworICBpZiAoIXNlc3Npb24pCisgIHsgc2Vzc2lvbiA9IChzdHJ1Y3Qgc29hcF93c3NlX3Nlc3Npb24qKW1hbGxvYyhzaXplb2Yoc3RydWN0IHNvYXBfd3NzZV9zZXNzaW9uKSArIHN0cmxlbihub25jZSkpOworICAgIGlmIChzZXNzaW9uKQorICAgIHsgc2Vzc2lvbi0+bmV4dCA9IHNvYXBfd3NzZV9zZXNzaW9uOworICAgICAgc2Vzc2lvbi0+ZXhwaXJlZCA9IGV4cGlyZWQ7CisgICAgICBtZW1jcHkoc2Vzc2lvbi0+aGFzaCwgaGFzaCwgU09BUF9TTURfU0hBMV9TSVpFKTsKKyAgICAgIHN0cmNweShzZXNzaW9uLT5ub25jZSwgbm9uY2UpOworICAgICAgc29hcF93c3NlX3Nlc3Npb24gPSBzZXNzaW9uOworICAgIH0KKyAgICBzZXNzaW9uID0gTlVMTDsKKyAgfQorICAvKiBleGl0IG11dGV4ICovCisgIE1VVEVYX1VOTE9DSyhzb2FwX3dzc2Vfc2Vzc2lvbl9sb2NrKTsKKyAgLyogaWYgcmVwbGF5IGF0dGFjaywgcmV0dXJuIG5vbi1kZXNjcmlwdCBmYWlsdXJlICovCisgIGlmIChzZXNzaW9uKQorICAgIHJldHVybiBzb2FwX3dzc2VfZmF1bHQoc29hcCwgd3NzZV9fRmFpbGVkQXV0aGVudGljYXRpb24sIE5VTEwpOworICByZXR1cm4gU09BUF9PSzsKK30KKworLyoqCitAZm4gc3RhdGljIHZvaWQgc29hcF93c3NlX3Nlc3Npb25fY2xlYW51cChzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZiBSZW1vdmVzIGV4cGlyZWQgYXV0aGVudGljYXRpb24gZGF0YSBmcm9tIHRoZSBkaWdlc3QgYXV0aGVudGljYXRpb24gc2Vzc2lvbiBkYXRhYmFzZS4KK0BwYXJhbSBzb2FwIGNvbnRleHQKKyovCitzdGF0aWMgdm9pZAorc29hcF93c3NlX3Nlc3Npb25fY2xlYW51cChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfd3NzZV9zZXNzaW9uICoqc2Vzc2lvbjsKKyAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CisgIERCR0ZVTigic29hcF93c3NlX3Nlc3Npb25fY2xlYW51cCIpOworICAvKiBlbnRlciBtdXRleCB0byBwdXJnZSBleHBpcmVkIHNlc3Npb24gZGF0YSAqLworICBNVVRFWF9MT0NLKHNvYXBfd3NzZV9zZXNzaW9uX2xvY2spOworICBzZXNzaW9uID0gJnNvYXBfd3NzZV9zZXNzaW9uOworICB3aGlsZSAoKnNlc3Npb24pCisgIHsgaWYgKCgqc2Vzc2lvbiktPmV4cGlyZWQgPCBub3cpCisgICAgeyBzdHJ1Y3Qgc29hcF93c3NlX3Nlc3Npb24gKnAgPSAqc2Vzc2lvbjsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVsZXRpbmcgc2Vzc2lvbiBub25jZT0lc1xuIiwgcC0+bm9uY2UpKTsKKyAgICAgICpzZXNzaW9uID0gcC0+bmV4dDsKKyAgICAgIGZyZWUocCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHNlc3Npb24gPSAmKCpzZXNzaW9uKS0+bmV4dDsKKyAgfQorICAvKiBleGl0IG11dGV4ICovCisgIE1VVEVYX1VOTE9DSyhzb2FwX3dzc2Vfc2Vzc2lvbl9sb2NrKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKiBDYWxjdWxhdGUgU0hBMShjcmVhdGVkLCBub25jZSwgcGFzc3dvcmQpIGRpZ2VzdAorICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorQGZuIHN0YXRpYyB2b2lkIGNhbGNfZGlnZXN0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpjcmVhdGVkLCBjb25zdCBjaGFyICpub25jZSwgaW50IG5vbmNlbGVuLCBjb25zdCBjaGFyICpwYXNzd29yZCwgY2hhciBoYXNoW1NPQVBfU01EX1NIQTFfU0laRV0pCitAYnJpZWYgQ2FsY3VsYXRlcyBkaWdlc3QgdmFsdWUgU0hBMShjcmVhdGVkLCBub25jZSwgcGFzc3dvcmQpCitAcGFyYW0gc29hcCBjb250ZXh0CitAcGFyYW1baW5dIGNyZWF0ZWQgc3RyaW5nIChYU0QgZGF0ZVRpbWUgZm9ybWF0KQorQHBhcmFtW2luXSBub25jZSB2YWx1ZQorQHBhcmFtW2luXSBub25jZWxlbiBsZW5ndGggb2Ygbm9uY2UgdmFsdWUKK0BwYXJhbVtpbl0gcGFzc3dvcmQgc3RyaW5nCitAcGFyYW1bb3V0XSBoYXNoIFNIQTEgZGlnZXN0CisqLworc3RhdGljIHZvaWQKK2NhbGNfZGlnZXN0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpjcmVhdGVkLCBjb25zdCBjaGFyICpub25jZSwgaW50IG5vbmNlbGVuLCBjb25zdCBjaGFyICpwYXNzd29yZCwgY2hhciBoYXNoW1NPQVBfU01EX1NIQTFfU0laRV0pCit7IHN0cnVjdCBzb2FwX3NtZF9kYXRhIGNvbnRleHQ7CisgIC8qIHVzZSBzbWRldnAgZW5naW5lICovCisgIHNvYXBfc21kX2luaXQoc29hcCwgJmNvbnRleHQsIFNPQVBfU01EX0RHU1RfU0hBMSwgTlVMTCwgMCk7CisgIHNvYXBfc21kX3VwZGF0ZShzb2FwLCAmY29udGV4dCwgY3JlYXRlZCwgc3RybGVuKGNyZWF0ZWQpKTsKKyAgc29hcF9zbWRfdXBkYXRlKHNvYXAsICZjb250ZXh0LCBub25jZSwgbm9uY2VsZW4pOworICBzb2FwX3NtZF91cGRhdGUoc29hcCwgJmNvbnRleHQsIHBhc3N3b3JkLCBzdHJsZW4ocGFzc3dvcmQpKTsKKyAgc29hcF9zbWRfZmluYWwoc29hcCwgJmNvbnRleHQsIGhhc2gsIE5VTEwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqIENhbGN1bGF0ZSByYW5kb21pemVkIGhleCBub25jZQorICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorQGZuIHN0YXRpYyB2b2lkIGNhbGNfbm9uY2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgbm9uY2VbU09BUF9XU1NFX05PTkNFTEVOXSkKK0BicmllZiBDYWxjdWxhdGVzIHJhbmRvbWl6ZWQgbm9uY2UKK0BwYXJhbSBzb2FwIGNvbnRleHQKK0BwYXJhbVtvdXRdIG5vbmNlIHZhbHVlCisqLworc3RhdGljIHZvaWQKK2NhbGNfbm9uY2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgbm9uY2VbU09BUF9XU1NFX05PTkNFTEVOXSkKK3sgc3RhdGljIHNob3J0IGNvdW50ID0gMHhDQTUzOworICBjaGFyIGJ1ZltTT0FQX1dTU0VfTk9OQ0VMRU4gKyAxXTsKKyAgLyogVE9ETzogbm9uY2UgaXMgY29udmVydGVkIHRvIGJhc2U2NCBzbyB3ZSBjb3VsZCB1c2UgcmF3IGJpbmFyeSBpbnN0ZWFkIG9mIGhleCAqLworICBzcHJpbnRmKGJ1ZiwgIiU4Ljh4JTQuNGh4JTguOHgiLCAoaW50KXRpbWUoTlVMTCksIGNvdW50KyssIHNvYXBfcmFuZG9tKTsKKyAgbWVtY3B5KG5vbmNlLCBidWYsIFNPQVBfV1NTRV9OT05DRUxFTik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICogUGx1Z2luIHJlZ2lzdHJ5IGZ1bmN0aW9ucworICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorQGZuIGludCBzb2FwX3dzc2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3BsdWdpbiAqcCwgdm9pZCAqYXJnKQorQGJyaWVmIFBsdWdpbiByZWdpc3RyeSBmdW5jdGlvbiwgdXNlZCB3aXRoIHNvYXBfcmVnaXN0ZXJfcGx1Z2luLgorQHBhcmFtIHNvYXAgY29udGV4dAorQHBhcmFtW2luLG91dF0gcCBwbHVnaW4gY3JlYXRlZCBpbiByZWdpc3RyeQorQHBhcmFtW2luXSBhcmcgcGFzc2VkIGZyb20gc29hcF9yZWdpc3Rlcl9wbHVnaW5fYXJnCitAcmV0dXJuIFNPQVBfT0sKKyovCitpbnQKK3NvYXBfd3NzZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGx1Z2luICpwLCB2b2lkICphcmcpCit7IERCR0ZVTigic29hcF93c3NlIik7CisgIHAtPmlkID0gc29hcF93c3NlX2lkOworICBwLT5kYXRhID0gKHZvaWQqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF93c3NlX2RhdGEpKTsKKyAgcC0+ZmNvcHkgPSBzb2FwX3dzc2VfY29weTsKKyAgcC0+ZmRlbGV0ZSA9IHNvYXBfd3NzZV9kZWxldGU7CisgIGlmIChwLT5kYXRhKQorICB7IGlmIChzb2FwX3dzc2VfaW5pdChzb2FwLCAoc3RydWN0IHNvYXBfd3NzZV9kYXRhKilwLT5kYXRhKSkKKyAgICB7IFNPQVBfRlJFRShzb2FwLCBwLT5kYXRhKTsKKyAgICAgIHJldHVybiBTT0FQX0VPTTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKgorQGZuIGludCBzb2FwX3dzc2VfaW5pdChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfd3NzZV9kYXRhICpkYXRhKQorQGJyaWVmIEluaXRpYWxpemVzIHBsdWdpbiBkYXRhLgorQHBhcmFtIHNvYXAgY29udGV4dAorQHBhcmFtW2luLG91dF0gZGF0YSBwbHVnaW4gZGF0YQorQHJldHVybiBTT0FQX09LCisqLworc3RhdGljIGludAorc29hcF93c3NlX2luaXQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3dzc2VfZGF0YSAqZGF0YSkKK3sgc3RhdGljIGludCBkb25lID0gMDsKKyAgREJHRlVOKCJzb2FwX3dzc2VfaW5pdCIpOworI2lmZGVmIFdJVEhfT1BFTlNTTAorICAvKiBPcGVuU1NMOiBtYWtlIHN1cmUgd2UgaGF2ZSB0aGUgZGlnZXN0IGFsZ29yaXRobXMgKi8KKyAgaWYgKCFkb25lKQorICB7IGRvbmUgPSAxOworICAgIE9wZW5TU0xfYWRkX2FsbF9kaWdlc3RzKCk7CisgICAgT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXMoKTsKKyAgfQorI2VuZGlmCisgIGRhdGEtPnNpZ25fYWxnID0gU09BUF9TTURfTk9ORTsKKyAgZGF0YS0+c2lnbl9rZXkgPSBOVUxMOworICBkYXRhLT5zaWduX2tleWxlbiA9IDA7CisgIGRhdGEtPnZyZnlfYWxnID0gU09BUF9TTURfTk9ORTsKKyAgZGF0YS0+dnJmeV9rZXkgPSBOVUxMOworICBkYXRhLT52cmZ5X2tleWxlbiA9IDA7CisgIGRhdGEtPmRpZ2VzdCA9IE5VTEw7CisgIGRhdGEtPmZwcmVwYXJlaW5pdCA9IE5VTEw7CisgIGRhdGEtPmZwcmVwYXJlc2VuZCA9IE5VTEw7CisgIGRhdGEtPmZwcmVwYXJlZmluYWwgPSBOVUxMOworICBkYXRhLT5mZGlzY29ubmVjdCA9IE5VTEw7CisgIHJldHVybiBTT0FQX09LOworfQorCisvKioKK0BmbiBpbnQgc29hcF93c3NlX2NvcHkoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3BsdWdpbiAqZHN0LCBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnNyYykKK0BicmllZiBDb3BpZXMgcGx1Z2luIGRhdGEgdG8gbG9jYWxpemUgcGx1Z2luIGRhdGEgZm9yIHRocmVhZHMuCitAcGFyYW0gc29hcCBjb250ZXh0CitAcGFyYW1bb3V0XSBkc3QgdGFyZ2V0IHBsdWdpbgorQHBhcmFtW2luXSBzcmMgc291cmNlIHBsdWdpbgorQHJldHVybiBTT0FQX09LCisqLworc3RhdGljIGludAorc29hcF93c3NlX2NvcHkoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3BsdWdpbiAqZHN0LCBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnNyYykKK3sgREJHRlVOKCJzb2FwX3dzc2VfY29weSIpOworICAqZHN0ID0gKnNyYzsKKyAgZHN0LT5kYXRhID0gKHZvaWQqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF93c3NlX2RhdGEpKTsKKyAgc29hcF93c3NlX2luaXQoc29hcCwgKHN0cnVjdCBzb2FwX3dzc2VfZGF0YSopZHN0LT5kYXRhKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKgorQGZuIHZvaWQgc29hcF93c3NlX2RlbGV0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGx1Z2luICpwKQorQGJyaWVmIERlbGV0ZXMgcGx1Z2luIGRhdGEuCitAcGFyYW0gc29hcCBjb250ZXh0CitAcGFyYW1baW4sb3V0XSBwIHBsdWdpbgorQHJldHVybiBTT0FQX09LCisqLworc3RhdGljIHZvaWQKK3NvYXBfd3NzZV9kZWxldGUoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3BsdWdpbiAqcCkKK3sgc3RydWN0IHNvYXBfd3NzZV9kYXRhICpkYXRhID0gKHN0cnVjdCBzb2FwX3dzc2VfZGF0YSopc29hcF9sb29rdXBfcGx1Z2luKHNvYXAsIHNvYXBfd3NzZV9pZCk7CisgIERCR0ZVTigic29hcF93c3NlX2RlbGV0ZSIpOworICBpZiAoZGF0YSkKKyAgeyBzb2FwX3dzc2VfcHJlcGFyZWNsZWFudXAoc29hcCwgZGF0YSk7CisgICAgU09BUF9GUkVFKHNvYXAsIGRhdGEpOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICogUGx1Z2luLXNwZWNpZmljIGZ1bmN0aW9ucworICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorQGZuIGludCBzb2FwX3dzc2Vfc2lnbihzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGFsZywgY29uc3Qgdm9pZCAqa2V5LCBpbnQga2V5bGVuKQorQGJyaWVmIFVzZXMgdGhlIHdzc2UgcGx1Z2luIHRvIHNpZ24gYWxsIHdzdTpJZCBhdHRyaWJ1dGVkIGVsZW1lbnRzLgorQHBhcmFtIHNvYXAgY29udGV4dAorQHBhcmFtW2luXSBhbGcgaXMgdGhlIHNpZ25hdHVyZSBhbGdvcml0aG0gU09BUF9TTURfSE1BQ19TSEExLCBTT0FQX1NNRF9TSUdOX0RTQV9TSEExLCBvciBTT0FQX1NNRF9TSUdOX1JTQV9TSEExCitAcGFyYW1baW5dIGtleSBpcyB0aGUgSE1BQyBzZWNyZXQga2V5IG9yIERTQS9SU0EgcHJpdmF0ZSBFVlBfUEtFWQorQHBhcmFtW2luXSBrZXlsZW4gaXMgdGhlIEhNQUMga2V5IGxlbmd0aAorQHJldHVybiBTT0FQX09LIG9yIGZhdWx0CisKK1RoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWN0dWFsbHkgc2lnbiB0aGUgbWVzc2FnZSwgYnV0IGluaXRpYXRlcyB0aGUgcGx1Z2luJ3MKK3NpZ25hdHVyZSBhbGdvcml0aG0gdG8gc2lnbiB0aGUgbWVzc2FnZSB1cG9uIG1lc3NhZ2UgdHJhbnNmZXIuCisqLworaW50Citzb2FwX3dzc2Vfc2lnbihzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGFsZywgY29uc3Qgdm9pZCAqa2V5LCBpbnQga2V5bGVuKQoreyBzdHJ1Y3Qgc29hcF93c3NlX2RpZ2VzdCAqZGlnZXN0LCAqbmV4dDsKKyAgc3RydWN0IHNvYXBfd3NzZV9kYXRhICpkYXRhID0gKHN0cnVjdCBzb2FwX3dzc2VfZGF0YSopc29hcF9sb29rdXBfcGx1Z2luKHNvYXAsIHNvYXBfd3NzZV9pZCk7CisgIERCR0ZVTjEoInNvYXBfd3NzZV9zaWduIiwgImFsZz0lZCIsIGFsZyk7CisgIGlmICghZGF0YSkKKyAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgInNvYXBfd3NzZV9zaWduIiwgIlBsdWdpbiBub3QgcmVnaXN0ZXJlZCIsIFNPQVBfUExVR0lOX0VSUk9SKTsKKyAgaWYgKCFhbGcgfHwgIWtleSkKKyAgICByZXR1cm4gc29hcF93c3NlX2ZhdWx0KHNvYXAsIHdzc2VfX0ludmFsaWRTZWN1cml0eSwgIkludmFsaWQgc2lnbmF0dXJlIGFsZ29yaXRobSBvciBrZXkiKTsKKyAgLyogc3RvcmUgYWxnIGFuZCBrZXkgaW4gcGx1Z2luIGRhdGEgKi8KKyAgZGF0YS0+c2lnbl9hbGcgPSBhbGc7CisgIGRhdGEtPnNpZ25fa2V5ID0ga2V5OworICBkYXRhLT5zaWduX2tleWxlbiA9IGtleWxlbjsKKyAgLyogc2F2ZSBhbmQgc2V0IHRoZSBwbHVnaW4ncyBjYWxsYmFja3MgdG8gcHJlcHJvY2VzcyBvdXRib3VuZCBtZXNzYWdlcyAqLworICBpZiAoc29hcC0+ZnByZXBhcmVpbml0ICE9IHNvYXBfd3NzZV9wcmVwYXJlaW5pdCkKKyAgeyBkYXRhLT5mcHJlcGFyZWluaXQgPSBzb2FwLT5mcHJlcGFyZWluaXQ7CisgICAgc29hcC0+ZnByZXBhcmVpbml0ID0gc29hcF93c3NlX3ByZXBhcmVpbml0OworICB9CisgIGlmIChzb2FwLT5mcHJlcGFyZXNlbmQgIT0gc29hcF93c3NlX3ByZXBhcmVzZW5kKQorICB7IGRhdGEtPmZwcmVwYXJlc2VuZCA9IHNvYXAtPmZwcmVwYXJlc2VuZDsKKyAgICBkYXRhLT5mcHJlcGFyZWZpbmFsID0gc29hcC0+ZnByZXBhcmVmaW5hbDsKKyAgfQorICBpZiAoc29hcC0+ZnByZXBhcmVmaW5hbCAhPSBzb2FwX3dzc2VfcHJlcGFyZWZpbmFsKQorICB7IHNvYXAtPmZwcmVwYXJlc2VuZCA9IHNvYXBfd3NzZV9wcmVwYXJlc2VuZDsKKyAgICBzb2FwLT5mcHJlcGFyZWZpbmFsID0gc29hcF93c3NlX3ByZXBhcmVmaW5hbDsKKyAgfQorICAvKiBjbGVhbnVwIHRoZSBkaWdlc3QgZGF0YSAqLworICBmb3IgKGRpZ2VzdCA9IGRhdGEtPmRpZ2VzdDsgZGlnZXN0OyBkaWdlc3QgPSBuZXh0KQorICB7IG5leHQgPSBkaWdlc3QtPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIGRpZ2VzdCk7CisgIH0KKyAgZGF0YS0+ZGlnZXN0ID0gTlVMTDsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKgorQGZuIGludCBzb2FwX3dzc2Vfc2lnbl9ib2R5KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgYWxnLCBjb25zdCB2b2lkICprZXksIGludCBrZXlsZW4pCitAYnJpZWYgVXNlcyB0aGUgd3NzZSBwbHVnaW4gdG8gc2lnbiBhbGwgd3N1OklkIGF0dHJpYnV0ZWQgZWxlbWVudHMsIGluY2x1ZGluZyB0aGUgU09BUCBCb2R5IChieSBhZGRpbmcgYSB3c3U6SWQ9IkJvZHkiIGF0dHJpYnV0ZSkuCitAcGFyYW0gc29hcCBjb250ZXh0CitAcGFyYW1baW5dIGFsZyBpcyB0aGUgc2lnbmF0dXJlIGFsZ29yaXRobSBTT0FQX1NNRF9ITUFDX1NIQTEsIFNPQVBfU01EX1NJR05fRFNBX1NIQTEsIG9yIFNPQVBfU01EX1NJR05fUlNBX1NIQTEKK0BwYXJhbVtpbl0ga2V5IGlzIHRoZSBITUFDIHNlY3JldCBrZXkgb3IgRFNBL1JTQSBwcml2YXRlIEVWUF9QS0VZCitAcGFyYW1baW5dIGtleWxlbiBpcyB0aGUgSE1BQyBrZXkgbGVuZ3RoCitAcmV0dXJuIFNPQVBfT0sKKworVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBhY3R1YWxseSBzaWduIHRoZSBtZXNzYWdlLCBidXQgaW5pdGlhdGVzIHRoZSBwbHVnaW4ncworc2lnbmF0dXJlIGFsZ29yaXRobSB0byBzaWduIHRoZSBtZXNzYWdlIHVwb24gbWVzc2FnZSB0cmFuc2Zlci4KKyovCitpbnQKK3NvYXBfd3NzZV9zaWduX2JvZHkoc3RydWN0IHNvYXAgKnNvYXAsIGludCBhbGcsIGNvbnN0IHZvaWQgKmtleSwgaW50IGtleWxlbikKK3sgaW50IGVycjsKKyAgREJHRlVOMSgic29hcF93c3NlX3NpZ25fYm9keSIsICJhbGc9JWQiLCBhbGcpOworICBzb2FwLT5vbW9kZSB8PSBTT0FQX1hNTF9TRUM7CisgIGVyciA9IHNvYXBfd3NzZV9zaWduKHNvYXAsIGFsZywga2V5LCBrZXlsZW4pOworICByZXR1cm4gZXJyOworfQorCisvKioKK0BmbiBpbnQgc29hcF93c3NlX3ZlcmlmeV9pbml0KHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmIFVzZXMgdGhlIHdzc2UgcGx1Z2luIHRvIGluaXRpYXRlIHRoZSB2ZXJpZmljYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBhbmQgU2lnbmVkSW5mbyBSZWZlcmVuY2UgZGlnZXN0cy4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0ByZXR1cm4gU09BUF9PSworCitUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGFjdHVhbGx5IHZlcmlmeSB0aGUgbWVzc2FnZSwgYnV0IGluaXRpYXRlcyB0aGUgcGx1Z2luJ3MKK2RhdGEgdG8gc3RvcmUgdGhlIG1lc3NhZ2UgaW4gYSBET00gdG8gdmVyaWZ5IHRoZSBzaWduYXR1cmUuIFRoZSBzaWduYXR1cmUgYW5kCitkaWdlc3RzIGluIHRoZSBET00gbXVzdCBiZSB2ZXJpZmllZCBtYW51YWxseS4KKyovCitpbnQKK3NvYXBfd3NzZV92ZXJpZnlfaW5pdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgREJHRlVOKCJzb2FwX3dzc2VfdmVyaWZ5X2luaXQiKTsKKyAgLyogZGVzZXJpYWxpemUgaW5ib3VuZCBtZXNzYWdlIHRvIERPTSAqLworICBzb2FwLT5pbW9kZSB8PSBTT0FQX1hNTF9ET007CisgIHJldHVybiBTT0FQX09LOworfQorCisvKioKK0BmbiBpbnQgc29hcF93c3NlX3ZlcmlmeV9hdXRvKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgYWxnLCBjb25zdCB2b2lkICprZXksIHNpemVfdCBrZXlsZW4pCitAYnJpZWYgVXNlcyB0aGUgd3NzZSBwbHVnaW4gdG8gaW5pdGlhdGUgdGhlIGF1dG9tYXRpYyB2ZXJpZmljYXRpb24gb2YgdGhlIHNpZ25hdHVyZSBhbmQgU2lnbmVkSW5mbyBSZWZlcmVuY2UgZGlnZXN0cy4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0BwYXJhbVtpbl0gYWxnIHRvIHZlcmlmeSBzaWduYXR1cmUgaWYgc2lnbmF0dXJlIGhhcyBubyBzZWNyZXQgb3IgcHVibGljIGtleSwgdXNlIFNPQVBfU01EX05PTkUgdG8gb21pdAorQHBhcmFtW2luXSBrZXkgaXMgSE1BQyBrZXkgb3IgRVZQX1BLRVkKK0BwYXJhbVtpbl0ga2V5bGVuIGlzIEhNQUMga2V5IGxlbmd0aAorQHJldHVybiBTT0FQX09LCisKK1RoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWN0dWFsbHkgdmVyaWZ5IHRoZSBtZXNzYWdlLCBidXQgaW5pdGlhdGVzIHRoZSBwbHVnaW4ncworYWxnb3JpdGhtIHRvIHN0b3JlIHRoZSBtZXNzYWdlIGluIGEgRE9NIHRvIGF1dG9tYXRpY2FsbHkgdmVyaWZ5IHRoZSBzaWduYXR1cmUKK2FuZCBkaWdlc3Rlcy4gSWYgdGhlIG1lc3NhZ2UgZG9lcyBub3QgY29udGFpbiBhIGtleSB0byB2ZXJpZnkgdGhlIHNpZ25hdHVyZSwKK3RoZSBhbGcsIGtleSwgYW5kIGtleWxlbiBwYXJhbWV0ZXJzIGFyZSB1c2VkLiBJdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGUgWDUwOQorY2VydGlmaWNhdGUgdXNlZCB0byB2ZXJpZnkgdGhlIHNpZ25hdHVyZSBpcyB2ZXJpZmllZCwgd2hpY2ggcmVxdWlyZXMKK3NvYXAtPmNhZmlsZSBhbmQvb3Igc29hcC0+Y2FwYXRoIHRvIGJlIHNldC4KKyovCitpbnQKK3NvYXBfd3NzZV92ZXJpZnlfYXV0byhzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGFsZywgY29uc3Qgdm9pZCAqa2V5LCBzaXplX3Qga2V5bGVuKQoreyBzdHJ1Y3Qgc29hcF93c3NlX2RhdGEgKmRhdGEgPSAoc3RydWN0IHNvYXBfd3NzZV9kYXRhKilzb2FwX2xvb2t1cF9wbHVnaW4oc29hcCwgc29hcF93c3NlX2lkKTsKKyAgREJHRlVOKCJzb2FwX3dzc2VfdmVyaWZ5X2F1dG8iKTsKKyAgaWYgKCFkYXRhKQorICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAic29hcF93c3NlX3ZlcmlmeV9hdXRvIiwgIlBsdWdpbiBub3QgcmVnaXN0ZXJlZCIsIFNPQVBfUExVR0lOX0VSUk9SKTsKKyAgZGF0YS0+dnJmeV9hbGcgPSBhbGc7CisgIGRhdGEtPnZyZnlfa2V5ID0ga2V5OworICBkYXRhLT52cmZ5X2tleWxlbiA9IGtleWxlbjsKKyAgaWYgKHNvYXAtPmZkaXNjb25uZWN0ICE9IHNvYXBfd3NzZV9kaXNjb25uZWN0KQorICB7IGRhdGEtPmZkaXNjb25uZWN0ID0gc29hcC0+ZmRpc2Nvbm5lY3Q7CisgICAgc29hcC0+ZmRpc2Nvbm5lY3QgPSBzb2FwX3dzc2VfZGlzY29ubmVjdDsgCisgIH0KKyAgcmV0dXJuIHNvYXBfd3NzZV92ZXJpZnlfaW5pdChzb2FwKTsKK30KKworLyoqCitAZm4gaW50IHNvYXBfd3NzZV92ZXJpZnlfZG9uZShzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZiBUZXJtaW5hdGVzIHRoZSBhdXRvbWF0aWMgdmVyaWZpY2F0aW9uIG9mIHNpZ25hdHVyZXMuCitAcGFyYW0gc29hcCBjb250ZXh0CitAcmV0dXJuIFNPQVBfT0sKKyovCitpbnQKK3NvYXBfd3NzZV92ZXJpZnlfZG9uZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfd3NzZV9kYXRhICpkYXRhID0gKHN0cnVjdCBzb2FwX3dzc2VfZGF0YSopc29hcF9sb29rdXBfcGx1Z2luKHNvYXAsIHNvYXBfd3NzZV9pZCk7CisgIERCR0ZVTigic29hcF93c3NlX3ZlcmlmeV9kb25lIik7CisgIGlmICghZGF0YSkKKyAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgInNvYXBfd3NzZV92ZXJpZnlfZG9uZSIsICJQbHVnaW4gbm90IHJlZ2lzdGVyZWQiLCBTT0FQX1BMVUdJTl9FUlJPUik7CisgIHNvYXAtPmltb2RlICY9IH5TT0FQX1hNTF9ET007CisgIGlmIChzb2FwLT5mZGlzY29ubmVjdCA9PSBzb2FwX3dzc2VfZGlzY29ubmVjdCkKKyAgICBzb2FwLT5mZGlzY29ubmVjdCA9IGRhdGEtPmZkaXNjb25uZWN0OworICByZXR1cm4gU09BUF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKiBDYWxsYmFja3MgcmVnaXN0ZXJlZCBieSBwbHVnaW4KKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKK0BmbiBpbnQgc29hcF93c3NlX3ByZXBhcmVpbml0KHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmIEluaXRpYXRlcyBtZXNzYWdlIHByZXByb2Nlc3Npbmcgd2l0aCBnU09BUCBlbmdpbmUncyBwcmVwYXJlaW5pdCBjYWxsYmFjay4KK0BwYXJhbSBzb2FwIGNvbnRleHQKK0ByZXR1cm4gU09BUF9PSyBvciBmYXVsdAorCitUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgdG8gYW5hbHl6ZSBhIG1lc3NhZ2UgYmVmb3JlIHRyYW5zbWlzc2lvbi4KKyovCitzdGF0aWMgaW50Citzb2FwX3dzc2VfcHJlcGFyZWluaXQoc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX3dzc2VfZGF0YSAqZGF0YSA9IChzdHJ1Y3Qgc29hcF93c3NlX2RhdGEqKXNvYXBfbG9va3VwX3BsdWdpbihzb2FwLCBzb2FwX3dzc2VfaWQpOworICBEQkdGVU4oInNvYXBfd3NzZV9wcmVwYXJlaW5pdCIpOworICBpZiAoIWRhdGEpCisgICAgcmV0dXJuIFNPQVBfUExVR0lOX0VSUk9SOworICBpZiAoZGF0YS0+ZnByZXBhcmVpbml0KQorICAgIHJldHVybiBkYXRhLT5mcHJlcGFyZWluaXQoc29hcCk7CisgIHJldHVybiBTT0FQX09LOworfQorCisvKioKK0BmbiBpbnQgc29hcF93c3NlX3ByZXBhcmVzZW5kKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCitAYnJpZWYgVGFrZXMgYSBwaWVjZSBvZiB0aGUgWE1MIG1lc3NhZ2UgKHRva2VuaXplZCkgdG8gY29tcHV0ZSBkaWdlc3QuCitAcGFyYW0gc29hcCBjb250ZXh0CitAcGFyYW1baW5dIGJ1ZiBzdHJpbmcgKFhNTCAidG9rZW5pemVkIikgdG8gYmUgc2VuZAorQHBhcmFtW2luXSBsZW4gYnVmIGxlbmd0aAorQHJldHVybiBTT0FQX09LIG9yIGZhdWx0CisKK1RoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB0byBhbmFseXplIGEgbWVzc2FnZSAodXN1YWxseSBkdXJpbmcgdGhlIEhUVFAgY29udGVudAorbGVuZ3RoIHBoYXNlKS4gIE5vdGU6IG5lc3RlZCBlbGVtZW50cyB3aXRoIHdzdTpJZCBhdHRyaWJ1dGVzIGNhbm5vdCBiZQoraW5kaXZpZHVhbGx5IHNpZ25lZCBpbiB0aGlzIHJlbGVhc2UuCisqLworc3RhdGljIGludAorc29hcF93c3NlX3ByZXBhcmVzZW5kKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7IHN0cnVjdCBzb2FwX3dzc2VfZGF0YSAqZGF0YSA9IChzdHJ1Y3Qgc29hcF93c3NlX2RhdGEqKXNvYXBfbG9va3VwX3BsdWdpbihzb2FwLCBzb2FwX3dzc2VfaWQpOworICBEQkdGVU4oInNvYXBfd3NzZV9wcmVwYXJlc2VuZCIpOworICBpZiAoIWRhdGEpCisgICAgcmV0dXJuIFNPQVBfUExVR0lOX0VSUk9SOworICAvKiB0aGUgZ1NPQVAgZW5naW5lIHNpZ25hbHMgdGhlIHN0YXJ0IG9mIGEgd3N1OklkIGVsZW1lbnQgKi8KKyAgaWYgKHNvYXAtPnBhcnQgPT0gU09BUF9CRUdJTl9TRUNVUklUWSkKKyAgeyAvKiBmb3VuZCBlbGVtZW50IHdpdGggd3N1OklkIGFuZCBjaGFuZ2UgZW5naW5lIHN0YXRlICovCisgICAgc29hcC0+cGFydCA9IFNPQVBfSU5fU0VDVVJJVFk7CisgICAgaWYgKGRhdGEtPmRpZ2VzdCAmJiBkYXRhLT5kaWdlc3QtPmxldmVsKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJOZXN0ZWQgaGFzaGluZyBmb3Igc2lnbmF0dXJlIG5vdCBwb3NzaWJsZSwgd3N1OklkPSclcycgaWdub3JlZFxuIiwgc29hcC0+aWQpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgLyogaW5pdGlhbGl6ZSBzbWRldnAgZW5naW5lICovCisgICAgICBzdHJ1Y3Qgc29hcF93c3NlX2RpZ2VzdCAqZGlnZXN0OworICAgICAgZGlnZXN0ID0gKHN0cnVjdCBzb2FwX3dzc2VfZGlnZXN0KilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfd3NzZV9kaWdlc3QpICsgc3RybGVuKHNvYXAtPmlkKSArIDEpOworICAgICAgZGlnZXN0LT5uZXh0ID0gZGF0YS0+ZGlnZXN0OworICAgICAgZGlnZXN0LT5sZXZlbCA9IHNvYXAtPmxldmVsOworICAgICAgc29hcF9zbWRfaW5pdChzb2FwLCAmZGlnZXN0LT5zbWQsIFNPQVBfU01EX0RHU1RfU0hBMSwgTlVMTCwgMCk7CisgICAgICBtZW1zZXQoZGlnZXN0LT5oYXNoLCAwLCBzaXplb2YoZGlnZXN0LT5oYXNoKSk7CisgICAgICBkaWdlc3QtPmlkWzBdID0gJyMnOworICAgICAgc3RyY3B5KGRpZ2VzdC0+aWQgKyAxLCBzb2FwLT5pZCk7CisgICAgICBkYXRhLT5kaWdlc3QgPSBkaWdlc3Q7CisgICAgICAvKiBvbWl0IGluZGVudCBmb3IgaW5kZW50ZWQgWE1MIChuZXh0IHRpbWUgYXJvdW5kLCB3ZSB3aWxsIGNhdGNoICc8JykgKi8KKyAgICAgIGlmICgqYnVmICE9ICc8JykKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICB9CisgIGlmIChzb2FwLT5wYXJ0ID09IFNPQVBfSU5fU0VDVVJJVFkpCisgIHsgLyogdXBkYXRlIHNtZGV2cCBlbmdpbmUgKi8KKyAgICBpZiAoZGF0YS0+ZGlnZXN0KQorICAgIHsgc29hcF9zbWRfdXBkYXRlKHNvYXAsICZkYXRhLT5kaWdlc3QtPnNtZCwgYnVmLCBsZW4pOworICAgICAgaWYgKHNvYXAtPmxldmVsIDwgZGF0YS0+ZGlnZXN0LT5sZXZlbCkKKyAgICAgIHsgc29hcC0+cGFydCA9IFNPQVBfRU5EX1NFQ1VSSVRZOworCXNvYXBfc21kX2ZpbmFsKHNvYXAsICZkYXRhLT5kaWdlc3QtPnNtZCwgZGF0YS0+ZGlnZXN0LT5oYXNoLCBOVUxMKTsKKyAgICAgICAgZGF0YS0+ZGlnZXN0LT5sZXZlbCA9IDA7CisgICAgICB9CisgICAgfQorICB9CitlbmQ6CisgIGlmIChkYXRhLT5mcHJlcGFyZXNlbmQpCisgICAgcmV0dXJuIGRhdGEtPmZwcmVwYXJlc2VuZChzb2FwLCBidWYsIGxlbik7CisgIHJldHVybiBTT0FQX09LOworfQorCisvKioKK0BmbiBpbnQgc29hcF93c3NlX3ByZXBhcmVmaW5hbChzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZiBDb2xsZWN0cyB0aGUgZGlnZXN0cyBvZiBhbGwgdGhlIHdzdTpJZCBlbGVtZW50cyBhbmQgcG9wdWxhdGVzIHRoZSBTaWduZWRJbmZvLgorQHBhcmFtIHNvYXAgY29udGV4dAorQHJldHVybiBTT0FQX09LIG9yIGZhdWx0CisKK1RoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBqdXN0IGJlZm9yZSB0aGUgbWVzc2FnZSBpcyBzZW5kLgorKi8KK3N0YXRpYyBpbnQKK3NvYXBfd3NzZV9wcmVwYXJlZmluYWwoc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX3dzc2VfZGF0YSAqZGF0YSA9IChzdHJ1Y3Qgc29hcF93c3NlX2RhdGEqKXNvYXBfbG9va3VwX3BsdWdpbihzb2FwLCBzb2FwX3dzc2VfaWQpOworICBEQkdGVU4oInNvYXBfd3NzZV9wcmVwYXJlZmluYWwiKTsKKyAgaWYgKCFkYXRhKQorICAgIHJldHVybiBTT0FQX1BMVUdJTl9FUlJPUjsKKyAgLyogbm8gbmVlZCB0byBrZWVwIGxvb2tpbmcgZm9yIHdzdTpJZCAqLworICBzb2FwLT5vbW9kZSB8PSBTT0FQX1hNTF9TRUM7CisgIGlmIChkYXRhLT5kaWdlc3QpCisgIHsgZHNfX1NpZ25hdHVyZVR5cGUgKnNpZ25hdHVyZSA9IHNvYXBfd3NzZV9TaWduYXR1cmUoc29hcCk7CisgICAgc3RydWN0IHNvYXBfd3NzZV9kaWdlc3QgKmRpZ2VzdDsKKyAgICBjb25zdCBjaGFyICp0cmFuc2Zvcm07CisgICAgaW50IHNpZ25hdHVyZV9hZGRlZCA9IDA7CisgICAgLyogaWYgbWVzc2FnZSBpcyBjYW5vbmljYWxpemVkIHBvcHVsYXRlIHRyYW5zZm9ybSBlbGVtZW50IGFjY29yZGluZ2x5ICovCisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgICAgICB0cmFuc2Zvcm0gPSBjMTRuX1VSSTsKKyAgICBlbHNlCisgICAgICB0cmFuc2Zvcm0gPSBOVUxMOworICAgIC8qIHRvIGluY3JlYXNlIHRoZSBtZXNzYWdlIGxlbmd0aCBjb3VudGVyIHdlIG5lZWQgdG8gZW1pdCB0aGUgU2lnbmF0dXJlLAorICAgICAgIFNpZ25lZEluZm8gYW5kIFNpZ25hdHVyZVZhbHVlIGVsZW1lbnRzLiBIb3dldmVyLCB0aGlzIGRvZXMgbm90IHdvcmsgaWYKKyAgICAgICB3ZSBhbHJlYWR5IHBvcHVsYXRlZCB0aGUgd3NzZTpTaWduYXR1cmUgd2l0aCBTaWduZWRJbmZvISAqLworICAgIGlmICghc2lnbmF0dXJlKQorICAgIHsgc2lnbmF0dXJlID0gc29hcF93c3NlX2FkZF9TaWduYXR1cmUoc29hcCk7CisgICAgICBzaWduYXR1cmVfYWRkZWQgPSAxOworICAgIH0KKyAgICBlbHNlIGlmIChzaWduYXR1cmUtPlNpZ25lZEluZm8pCisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIndzc2UgZXJyb3IiLCAiQ2Fubm90IHVzZSBzb2FwX3dzc2Vfc2lnbiB3aXRoIHBvcHVsYXRlZCBTaWduZWRJbmZvIiwgU09BUF9TU0xfRVJST1IpOworICAgIC8qIGFkZCB0aGUgU2lnbmVkSW5mby9SZWZlcmVuY2UgZWxlbWVudHMgZm9yIGVhY2ggZGlnZXN0ICovCisgICAgZm9yIChkaWdlc3QgPSBkYXRhLT5kaWdlc3Q7IGRpZ2VzdDsgZGlnZXN0ID0gZGlnZXN0LT5uZXh0KQorICAgICAgc29hcF93c3NlX2FkZF9TaWduZWRJbmZvX1JlZmVyZW5jZShzb2FwLCBkaWdlc3QtPmlkLCB0cmFuc2Zvcm0sICIiLCBkaWdlc3QtPmhhc2gpOworICAgIC8qIHRoZW4gY29tcHV0ZSB0aGUgc2lnbmF0dXJlIGFuZCBhZGQgaXQgKi8KKyAgICBzb2FwX3dzc2VfYWRkX1NpZ25hdHVyZVZhbHVlKHNvYXAsIGRhdGEtPnNpZ25fYWxnLCBkYXRhLT5zaWduX2tleSwgZGF0YS0+c2lnbl9rZXlsZW4pOworICAgIC8qIHRoZSBjb2RlIGJlbG93IGVuc3VyZXMgd2UgaW5jcmVhc2UgdGhlIG1lc3NhZ2UgbGVuZ3RoIGNvdW50ZXIgKi8KKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgICAgIHNvYXAtPm5zID0gMDsgLyogbmVlZCBuYW1lc3BhY2VzIGZvciBjYW5vbmljYWxpemF0aW9uICovCisgICAgaWYgKHNpZ25hdHVyZV9hZGRlZCkKKyAgICB7IHNvYXAtPmxldmVsID0gMzsgLyogaW5kZW50IGxldmVsIGZvciBYTUwgU2lnbmF0dXJlICovCisgICAgICBzb2FwX291dF9kc19fU2lnbmF0dXJlVHlwZShzb2FwLCAiZHM6U2lnbmF0dXJlIiwgMCwgc2lnbmF0dXJlLCBOVUxMKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgc29hcC0+bGV2ZWwgPSA0OyAvKiBpbmRlbnQgbGV2ZWwgZm9yIFhNTCBTaWduZWRJbmZvICovCisgICAgICBzb2FwLT5jMTRuZXhjbHVkZSA9ICJkcyI7IC8qIGRvbid0IGFkZCB4bWxuczpkcyAqLworICAgICAgc29hcF9vdXRfZHNfX1NpZ25lZEluZm9UeXBlKHNvYXAsICJkczpTaWduZWRJbmZvIiwgMCwgc2lnbmF0dXJlLT5TaWduZWRJbmZvLCBOVUxMKTsKKyAgICAgIHNvYXBfb3V0c3RyaW5nKHNvYXAsICJkczpTaWduYXR1cmVWYWx1ZSIsIDAsICZzaWduYXR1cmUtPlNpZ25hdHVyZVZhbHVlLCBOVUxMLCAwKTsKKyAgICAgIHNvYXAtPmMxNG5leGNsdWRlID0gTlVMTDsKKyAgICB9CisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9JTkRFTlQpCisgICAgICBzb2FwLT5jb3VudCArPSBzb2FwLT5sZXZlbCArIDE7IC8qIGFkZCBcbitpbmRlbnQgKi8KKyAgfQorICAvKiBSZXNldCB0aGUgY2FsbGJhY2tzIGFuZCBjbGVhbnVwIGRpZ2VzdHMgKi8KKyAgc29hcF93c3NlX3ByZXBhcmVjbGVhbnVwKHNvYXAsIGRhdGEpOworICBpZiAoc29hcC0+ZnByZXBhcmVmaW5hbCkKKyAgICByZXR1cm4gc29hcC0+ZnByZXBhcmVmaW5hbChzb2FwKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKgorQGZuIHZvaWQgc29hcF93c3NlX3ByZXBhcmVjbGVhbnVwKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF93c3NlX2RhdGEgKmRhdGEpCitAYnJpZWYgUmVzdG9yZXMgZW5naW5lIHN0YXRlLgorQHBhcmFtIHNvYXAgY29udGV4dAorQHBhcmFtW2luLG91dF0gZGF0YSBwbHVnaW4gZGF0YQorKi8KK3N0YXRpYyB2b2lkCitzb2FwX3dzc2VfcHJlcGFyZWNsZWFudXAoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3dzc2VfZGF0YSAqZGF0YSkKK3sgc3RydWN0IHNvYXBfd3NzZV9kaWdlc3QgKmRpZ2VzdCwgKm5leHQ7CisgIERCR0ZVTigic29hcF93c3NlX3ByZXBhcmVjbGVhbnVwIik7CisgIGRhdGEtPnNpZ25fYWxnID0gU09BUF9TTURfTk9ORTsKKyAgZGF0YS0+c2lnbl9rZXkgPSBOVUxMOworICBkYXRhLT5zaWduX2tleWxlbiA9IDA7CisgIGlmIChzb2FwLT5mcHJlcGFyZWluaXQgPT0gc29hcF93c3NlX3ByZXBhcmVpbml0KQorICAgIHNvYXAtPmZwcmVwYXJlaW5pdCA9IGRhdGEtPmZwcmVwYXJlaW5pdDsKKyAgaWYgKHNvYXAtPmZwcmVwYXJlc2VuZCA9PSBzb2FwX3dzc2VfcHJlcGFyZXNlbmQpCisgICAgc29hcC0+ZnByZXBhcmVzZW5kID0gZGF0YS0+ZnByZXBhcmVzZW5kOworICBpZiAoc29hcC0+ZnByZXBhcmVmaW5hbCA9PSBzb2FwX3dzc2VfcHJlcGFyZWZpbmFsKQorICAgIHNvYXAtPmZwcmVwYXJlZmluYWwgPSBkYXRhLT5mcHJlcGFyZWZpbmFsOworICBkYXRhLT5mcHJlcGFyZWluaXQgPSBOVUxMOworICBkYXRhLT5mcHJlcGFyZXNlbmQgPSBOVUxMOworICBkYXRhLT5mcHJlcGFyZWZpbmFsID0gTlVMTDsKKyAgZm9yIChkaWdlc3QgPSBkYXRhLT5kaWdlc3Q7IGRpZ2VzdDsgZGlnZXN0ID0gbmV4dCkKKyAgeyBuZXh0ID0gZGlnZXN0LT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBkaWdlc3QpOworICB9CisgIGRhdGEtPmRpZ2VzdCA9IE5VTEw7Cit9CisKKy8qKgorQGZuIGludCBzb2FwX3dzc2VfZGlzY29ubmVjdChzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZiBWZXJpZnkgc2lnbmF0dXJlIGFuZCBTaWduZWRJbmZvIGRpZ2VzdHMgaW5pdGlhdGVkIHdpdGggc29hcF93c3NlX3ZlcmlmeV9hdXRvLgorQHBhcmFtIHNvYXAgY29udGV4dAorQHJldHVybiBTT0FQX09LIG9yIGZhdWx0CitAc2VlIHNvYXBfd3NzZV92ZXJpZnlfYXV0bworCitUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQganVzdCBhZnRlciBhIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkLgorKi8KK3N0YXRpYyBpbnQKK3NvYXBfd3NzZV9kaXNjb25uZWN0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF93c3NlX2RhdGEgKmRhdGEgPSAoc3RydWN0IHNvYXBfd3NzZV9kYXRhKilzb2FwX2xvb2t1cF9wbHVnaW4oc29hcCwgc29hcF93c3NlX2lkKTsKKyAgZHNfX1NpZ25lZEluZm9UeXBlICpzaWduZWRJbmZvID0gc29hcF93c3NlX1NpZ25lZEluZm8oc29hcCk7CisgIHNvYXAtPmltb2RlICY9IH5TT0FQX1hNTF9ET007CisgIERCR0ZVTigic29hcF93c3NlX2Rpc2Nvbm5lY3QiKTsKKyAgaWYgKCFkYXRhKQorICAgIHJldHVybiBTT0FQX1BMVUdJTl9FUlJPUjsKKyAgaWYgKHNvYXAtPmZkaXNjb25uZWN0ID09IHNvYXBfd3NzZV9kaXNjb25uZWN0KQorICAgIHNvYXAtPmZkaXNjb25uZWN0ID0gZGF0YS0+ZmRpc2Nvbm5lY3Q7CisgIGlmIChzaWduZWRJbmZvKQorICB7IGludCBhbGcsIGtleWxlbjsKKyAgICBjb25zdCB2b2lkICprZXkgPSBOVUxMOworICAgIC8qIGRldGVybWluZSB3aGljaCBzaWduYXR1cmUgYWxnb3JpdGhtIHdhcyB1c2VkICovCisgICAgaWYgKHNvYXBfd3NzZV9nZXRfU2lnbmVkSW5mb19TaWduYXR1cmVNZXRob2Qoc29hcCwgJmFsZykpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgLyogZm9yIEhNQUMtU0hBMSwgdGhlIHNlY3JldCBrZXkgbWlnaHQgYmUgc3RvcmVkIGluIHRoZSBLZXlJZGVudGlmaWVyICovCisgICAgaWYgKGFsZyA9PSBTT0FQX1NNRF9ITUFDX1NIQTEpCisgICAgeyBjb25zdCBjaGFyICp2YWx1ZVR5cGUgPSBzb2FwX3dzc2VfZ2V0X0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZUtleUlkZW50aWZpZXJWYWx1ZVR5cGUoc29hcCk7CisgICAgICAvKiBpZiBpbiB0aGUgS2V5SWRlbnRpZmllciwgcmV0cmlldmUgaXQgKi8KKyAgICAgIGlmICh2YWx1ZVR5cGUgJiYgIXN0cmNtcCh2YWx1ZVR5cGUsIGRzX2htYWNfc2hhMVVSSSkpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVXNpbmcgSE1BQyBrZXkgZnJvbSBLZXlJZGVudGlmaWVyIHRvIHZlcmlmeSBzaWduYXR1cmVcbiIpKTsKKyAgICAgICAga2V5ID0gc29hcF93c3NlX2dldF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VLZXlJZGVudGlmaWVyKHNvYXAsICZrZXlsZW4pOworICAgICAgfQorICAgICAgZWxzZSBpZiAoYWxnID09IGRhdGEtPnZyZnlfYWxnKQorICAgICAgeyAvKiBnZXQgdGhlIEhNQUMgc2VjcmV0IGtleSBmcm9tIHRoZSBwbHVnaW4gKi8KKwlEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVzaW5nIEhNQUMga2V5IGZyb20gcGx1Z2luIHRvIHZlcmlmeSBzaWduYXR1cmVcbiIpKTsKKyAgICAgICAga2V5ID0gZGF0YS0+dnJmeV9rZXk7CisgICAgICAgIGtleWxlbiA9IGRhdGEtPnZyZnlfa2V5bGVuOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeyBYNTA5ICpjZXJ0OworICAgICAgLyogZ2V0IHRoZSBjZXJ0aWZpY2F0ZSBmcm9tIHRoZSBLZXlJbmZvIHJlZmVyZW5jZSAqLworICAgICAgY2VydCA9IHNvYXBfd3NzZV9nZXRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlWDUwOShzb2FwKTsKKyAgICAgIC8qIG9idGFpbiB0aGUgcHVibGljIGtleSBmcm9tIHRoZSBjZXJ0ICovCisgICAgICBpZiAoY2VydCkKKyAgICAgICAga2V5ID0gWDUwOV9nZXRfcHVia2V5KGNlcnQpOworICAgICAgZWxzZSBpZiAoYWxnID09IGRhdGEtPnZyZnlfYWxnKQorICAgICAgeyAvKiBnZXQgdGhlIHB1YmxpYyBrZXkgZnJvbSB0aGUgcGx1Z2luICovCisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVXNpbmcgcHVibGljIGtleSBmcm9tIHBsdWdpbiB0byB2ZXJpZnkgc2lnbmF0dXJlXG4iKSk7CisgICAgICAgIGtleSA9IGRhdGEtPnZyZnlfa2V5OworICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgICAgICB9CisgICAgfQorICAgIC8qIGlmIHN0aWxsIG5vIGtleSwgcmV0dXJuIGZhdWx0ICovCisgICAgLyogVE9ETzogYWRkIHVzZXItZXh0ZW5zaWJsZSBtZWNoYW5pc20gdG9vIGxvb2sgZm9yIGtleSAqLworICAgIGlmICgha2V5KQorICAgICAgcmV0dXJuIHNvYXBfd3NzZV9mYXVsdChzb2FwLCB3c3NlX19TZWN1cml0eVRva2VuVW5hdmFpbGFibGUsIE5VTEwpOworICAgIC8qIHZlcmlmeSBTaWduZWRJbmZvIHdpdGggc2lnbmF0dXJlIGFuZCBjaGVjayBkaWdlc3RzIG9mIGxvY2FsIGVsZW1lbnRzICovCisgICAgaWYgKHNvYXBfd3NzZV92ZXJpZnlfU2lnbmF0dXJlVmFsdWUoc29hcCwgYWxnLCBrZXksIGtleWxlbikKKyAgICAgfHwgc29hcF93c3NlX3ZlcmlmeV9TaWduZWRJbmZvKHNvYXApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGRhdGEtPnZyZnlfYWxnID0gU09BUF9TTURfTk9ORTsKKyAgICBpZiAoc29hcC0+ZmRpc2Nvbm5lY3QpCisgICAgICByZXR1cm4gc29hcC0+ZmRpc2Nvbm5lY3Qoc29hcCk7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgcmV0dXJuIHNvYXBfd3NzZV9mYXVsdChzb2FwLCB3c3NlX19GYWlsZWRDaGVjaywgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9wbHVnaW4vd3NzZWFwaS5oIGIvcGx1Z2luL3dzc2VhcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTQ1OTc2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2luL3dzc2VhcGkuaApAQCAtMCwwICsxLDE3NSBAQAorLyoKKword3NzZWFwaS5oCisKK1dTLVNlY3VyaXR5IHBsdWdpbgorCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHBhcnQgb2YgdGhlIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2VzOgorR1BMLCB0aGUgZ1NPQVAgcHVibGljIGxpY2Vuc2UsIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBwdWJsaWMgbGljZW5zZS4KKworVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZ1NPQVAgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjMKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcGxpY2Vuc2UuaHRtbAorU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKK1dJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQorZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFJvYmVydCBBLiB2YW4gRW5nZWxlbi4KK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaW5jbHVkZSAic29hcEguaCIKKyNpbmNsdWRlICJzbWRldnAuaCIKKworLyoqIHBsdWdpbiBpZGVudGlmaWNhdGlvbiBmb3IgcGx1Z2luIHJlZ2lzdHJ5ICovCisjZGVmaW5lIFNPQVBfV1NTRV9JRCAiU09BUC1XU1NFLTAuOSIKKworLyoqIHBsdWdpbiBpZGVudGlmaWNhdGlvbiBmb3IgcGx1Z2luIHJlZ2lzdHJ5ICovCitleHRlcm4gY29uc3QgY2hhciBzb2FwX3dzc2VfaWRbXTsKKworLyoqCitAc3RydWN0IHNvYXBfd3NzZV9kYXRhCitAYnJpZWYgd3NzZXBpIHBsdWdpbiBkYXRhCisKK1RoZSBzaWduYXR1cmUga2V5IChwcml2YXRlKSBhbmQgdmVyaWZpY2F0aW9uIGtleSAocHVibGljKSBhcmUga2VwdCBzZXBhcmF0ZS4KKyovCitzdHJ1Y3Qgc29hcF93c3NlX2RhdGEKK3sgaW50IHNpZ25fYWxnOwkJCS8qKjwgVGhlIGRpZ2VzdCBvciBzaWduYXR1cmUgYWxnb3JpdGhtIHVzZWQgKi8KKyAgY29uc3Qgdm9pZCAqc2lnbl9rZXk7CQkvKio8IEVWUF9QS0VZIG9yIGtleSBzdHJpbmcgZm9yIEhNQUMgKi8KKyAgaW50IHNpZ25fa2V5bGVuOwkJLyoqPCBITUFDIGtleSBsZW5ndGggKi8KKyAgaW50IHZyZnlfYWxnOwkJCS8qKjwgVGhlIHNpZ25hdHVyZSB2ZXJpZnkgYWxnb3JpdGhtIHVzZWQgKi8KKyAgY29uc3Qgdm9pZCAqdnJmeV9rZXk7CQkvKio8IEVWUF9QS0VZIG9yIGtleSBzdHJpbmcgZm9yIEhNQUMgdmVyaWZ5ICovCisgIGludCB2cmZ5X2tleWxlbjsJCS8qKjwgSE1BQyBrZXkgbGVuZ3RoICovCisgIHN0cnVjdCBzb2FwX3dzc2VfZGlnZXN0ICpkaWdlc3Q7CS8qKjwgTGlzdCBvZiBJRC1oYXNoIHBhaXJzICovCisgIGludCAoKmZwcmVwYXJlaW5pdCkoc3RydWN0IHNvYXAqKTsKKyAgaW50ICgqZnByZXBhcmVzZW5kKShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworICBpbnQgKCpmcHJlcGFyZWZpbmFsKShzdHJ1Y3Qgc29hcCopOworICBpbnQgKCpmZGlzY29ubmVjdCkoc3RydWN0IHNvYXAqKTsKK307CisKKy8qKgorQHN0cnVjdCBzb2FwX3dzc2VfZGlnZXN0CitAYnJpZWYgRGlnZXN0IGRpY3Rpb25hcnk6IGxpbmtlZCBsaXN0IG9mIElELWhhc2ggcGFpcnMKKworVGhlIGRpZ2VzdCBkaWN0aW9uYXJ5IGlzIHBvcHVsYXRlZCBieSB0aGUgc29hcF93c3NlX3ByZXBhcmVzZW5kIGNhbGxiYWNrLiBUaGUKK2NhbGxiYWNrIGludGVyY2VwdHMgWE1MIGVsZW1lbnRzIHdpdGggd3N1OklkIGF0dHJpYnV0ZXMgYW5kIGNvbXB1dGVzIHRoZSBkaWdlc3QKK2R1cmluZyB0aGUgcHJlcHJvY2Vzc2luZyBvZiBhIG1lc3NhZ2UgdHJhbnNtaXNzaW9uLiBUaGUgJ2xldmVsJyBmaWVsZCBpcyB1c2VkCit0byBkZXRlcm1pbmUgd2hlbiB0aGUgZW5kIG9mIGFuIGVsZW1lbnQgaXMgcmVhY2hlZC4KKyovCitzdHJ1Y3Qgc29hcF93c3NlX2RpZ2VzdAoreyBzdHJ1Y3Qgc29hcF93c3NlX2RpZ2VzdCAqbmV4dDsJLyoqPCBOZXh0IGluIGxpc3QgKi8KKyAgdW5zaWduZWQgaW50IGxldmVsOwkJCS8qKjwgWE1MIHBhcnNlciBkZXB0aCBsZXZlbCAqLworICBzdHJ1Y3Qgc29hcF9zbWRfZGF0YSBzbWQ7CQkvKio8IHNtZGV2cCBlbmdpbmUgY29udGV4dCAqLworICB1bnNpZ25lZCBjaGFyIGhhc2hbU09BUF9TTURfTUFYX1NJWkVdOy8qKjwgRGlnZXN0IGhhc2ggdmFsdWUgKi8KKyAgY2hhciBpZFsxXTsJCQkJLyoqPCBTdHJpbmcgZmxvd3MgZG93biB0aGUgc3RydWN0ICovCit9OworCitleHRlcm4gY29uc3QgY2hhciAqd3NzZV9QYXNzd29yZFRleHRVUkk7CitleHRlcm4gY29uc3QgY2hhciAqd3NzZV9QYXNzd29yZERpZ2VzdFVSSTsKK2V4dGVybiBjb25zdCBjaGFyICp3c3NlX0Jhc2U2NEJpbmFyeVVSSTsKK2V4dGVybiBjb25zdCBjaGFyICp3c3NlX1g1MDl2M1VSSTsKK2V4dGVybiBjb25zdCBjaGFyICp3c3NlX1g1MDl2M1N1YmplY3RLZXlJZGVudGlmaWVyVVJJOworCitleHRlcm4gY29uc3QgY2hhciAqZHNfc2hhMVVSSTsKK2V4dGVybiBjb25zdCBjaGFyICpkc19obWFjX3NoYTFVUkk7CitleHRlcm4gY29uc3QgY2hhciAqZHNfZHNhX3NoYTFVUkk7CitleHRlcm4gY29uc3QgY2hhciAqZHNfcnNhX3NoYTFVUkk7CisKK2V4dGVybiBjb25zdCBjaGFyICpkc19VUkk7CitleHRlcm4gY29uc3QgY2hhciAqYzE0bl9VUkk7CitleHRlcm4gY29uc3QgY2hhciAqd3N1X1VSSTsKKworc3RydWN0IF93c3NlX19TZWN1cml0eSogc29hcF93c3NlX2FkZF9TZWN1cml0eShzdHJ1Y3Qgc29hcCAqc29hcCk7CitzdHJ1Y3QgX3dzc2VfX1NlY3VyaXR5KiBzb2FwX3dzc2VfYWRkX1NlY3VyaXR5X2FjdG9yKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICphY3Rvcik7Cit2b2lkIHNvYXBfd3NzZV9kZWxldGVfU2VjdXJpdHkoc3RydWN0IHNvYXAgKnNvYXApOworc3RydWN0IF93c3NlX19TZWN1cml0eSogc29hcF93c3NlX1NlY3VyaXR5KHN0cnVjdCBzb2FwICpzb2FwKTsKKworc3RydWN0IGRzX19TaWduYXR1cmVUeXBlKiBzb2FwX3dzc2VfYWRkX1NpZ25hdHVyZShzdHJ1Y3Qgc29hcCAqc29hcCk7Cit2b2lkIHNvYXBfd3NzZV9kZWxldGVfU2lnbmF0dXJlKHN0cnVjdCBzb2FwICpzb2FwKTsKK3N0cnVjdCBkc19fU2lnbmF0dXJlVHlwZSogc29hcF93c3NlX1NpZ25hdHVyZShzdHJ1Y3Qgc29hcCAqc29hcCk7CisKK2ludCBzb2FwX3dzc2VfYWRkX1RpbWVzdGFtcChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIHRpbWVfdCBsaWZldGltZSk7CitzdHJ1Y3QgX3dzdV9fVGltZXN0YW1wICpzb2FwX3dzc2VfVGltZXN0YW1wKHN0cnVjdCBzb2FwICpzb2FwKTsKK2ludCBzb2FwX3dzc2VfdmVyaWZ5X1RpbWVzdGFtcChzdHJ1Y3Qgc29hcCAqc29hcCk7CisKK2ludCBzb2FwX3dzc2VfYWRkX1VzZXJuYW1lVG9rZW5UZXh0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqdXNlcm5hbWUsIGNvbnN0IGNoYXIgKnBhc3N3b3JkKTsKK2ludCBzb2FwX3dzc2VfYWRkX1VzZXJuYW1lVG9rZW5EaWdlc3Qoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICp1c2VybmFtZSwgY29uc3QgY2hhciAqcGFzc3dvcmQpOworc3RydWN0IF93c3NlX19Vc2VybmFtZVRva2VuICpzb2FwX3dzc2VfVXNlcm5hbWVUb2tlbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQpOworY29uc3QgY2hhciogc29hcF93c3NlX2dldF9Vc2VybmFtZShzdHJ1Y3Qgc29hcCAqc29hcCk7CitpbnQgc29hcF93c3NlX3ZlcmlmeV9QYXNzd29yZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcGFzc3dvcmQpOworCitpbnQgc29hcF93c3NlX2FkZF9CaW5hcnlTZWN1cml0eVRva2VuKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqdmFsdWVUeXBlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgc2l6ZSk7CitpbnQgc29hcF93c3NlX2FkZF9CaW5hcnlTZWN1cml0eVRva2VuWDUwOShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIFg1MDkgKmNlcnQpOworaW50IHNvYXBfd3NzZV9hZGRfQmluYXJ5U2VjdXJpdHlUb2tlblBFTShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKK3N0cnVjdCBfd3NzZV9fQmluYXJ5U2VjdXJpdHlUb2tlbiAqc29hcF93c3NlX0JpbmFyeVNlY3VyaXR5VG9rZW4oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkKTsKK2ludCBzb2FwX3dzc2VfZ2V0X0JpbmFyeVNlY3VyaXR5VG9rZW4oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCBjaGFyICoqdmFsdWVUeXBlLCB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50ICpzaXplKTsKK1g1MDkgKnNvYXBfd3NzZV9nZXRfQmluYXJ5U2VjdXJpdHlUb2tlblg1MDkoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkKTsKK2ludCBzb2FwX3dzc2VfdmVyaWZ5X1g1MDkoc3RydWN0IHNvYXAgKnNvYXAsIFg1MDkgKmNlcnQpOworCitzdHJ1Y3QgZHNfX1NpZ25lZEluZm9UeXBlICpzb2FwX3dzc2VfYWRkX1NpZ25lZEluZm8oc3RydWN0IHNvYXAgKnNvYXApOworaW50IHNvYXBfd3NzZV9hZGRfU2lnbmVkSW5mb19SZWZlcmVuY2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKlVSSSwgY29uc3QgY2hhciAqdHJhbnNmb3JtLCBjb25zdCBjaGFyICppbmNsdXNpdmVOYW1lc3BhY2VzLCBjb25zdCBjaGFyICpIQSk7CitpbnQgc29hcF93c3NlX2FkZF9TaWduZWRJbmZvX1NpZ25hdHVyZU1ldGhvZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbWV0aG9kLCBpbnQgY2Fub25pY2FsKTsKK3N0cnVjdCBkc19fU2lnbmVkSW5mb1R5cGUgKnNvYXBfd3NzZV9TaWduZWRJbmZvKHN0cnVjdCBzb2FwICpzb2FwKTsKK2ludCBzb2FwX3dzc2VfZ2V0X1NpZ25lZEluZm9fU2lnbmF0dXJlTWV0aG9kKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgKmFsZyk7CisKK2ludCBzb2FwX3dzc2VfYWRkX1NpZ25hdHVyZVZhbHVlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgYWxnLCBjb25zdCB2b2lkICprZXksIGludCBrZXlsZW4pOworaW50IHNvYXBfd3NzZV92ZXJpZnlfU2lnbmF0dXJlVmFsdWUoc3RydWN0IHNvYXAgKnNvYXAsIGludCBhbGcsIGNvbnN0IHZvaWQgKmtleSwgaW50IGtleWxlbik7CitpbnQgc29hcF93c3NlX3ZlcmlmeV9TaWduZWRJbmZvKHN0cnVjdCBzb2FwICpzb2FwKTsKK2ludCBzb2FwX3dzc2VfdmVyaWZ5X2RpZ2VzdChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGFsZywgY29uc3QgY2hhciAqaWQsIHVuc2lnbmVkIGNoYXIgaGFzaFtTT0FQX1NNRF9NQVhfU0laRV0pOworCitzdHJ1Y3QgZHNfX0tleUluZm9UeXBlICpzb2FwX3dzc2VfYWRkX0tleUluZm8oc3RydWN0IHNvYXAgKnNvYXApOworc3RydWN0IGRzX19LZXlJbmZvVHlwZSAqc29hcF93c3NlX0tleUluZm8oc3RydWN0IHNvYXAgKnNvYXApOworCitpbnQgc29hcF93c3NlX2FkZF9LZXlJbmZvX0tleU5hbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUpOworY29uc3QgY2hhciAqc29hcF93c3NlX2dldF9LZXlJbmZvX0tleU5hbWUoc3RydWN0IHNvYXAgKnNvYXApOworCitpbnQgc29hcF93c3NlX2FkZF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VVUkkoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKlVSSSwgY29uc3QgY2hhciAqdmFsdWVUeXBlKTsKK2ludCBzb2FwX3dzc2VfYWRkX0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZVg1MDkoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKlVSSSk7Citjb25zdCBjaGFyICpzb2FwX3dzc2VfZ2V0X0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZVVSSShzdHJ1Y3Qgc29hcCAqc29hcCk7CitYNTA5ICpzb2FwX3dzc2VfZ2V0X0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZVg1MDkoc3RydWN0IHNvYXAgKnNvYXApOworCitpbnQgc29hcF93c3NlX2FkZF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VLZXlJZGVudGlmaWVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqdmFsdWVUeXBlLCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgc2l6ZSk7Citjb25zdCBjaGFyICpzb2FwX3dzc2VfZ2V0X0tleUluZm9fU2VjdXJpdHlUb2tlblJlZmVyZW5jZUtleUlkZW50aWZpZXJWYWx1ZVR5cGUoc3RydWN0IHNvYXAgKnNvYXApOworY29uc3QgdW5zaWduZWQgY2hhciAqc29hcF93c3NlX2dldF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VLZXlJZGVudGlmaWVyKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgKnNpemUpOworCitpbnQgc29hcF93c3NlX2FkZF9LZXlJbmZvX1NlY3VyaXR5VG9rZW5SZWZlcmVuY2VFbWJlZGRlZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKnZhbHVlVHlwZSk7CisKK2ludCBzb2FwX3dzc2VfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXAsIGVudW0gd3NzZV9fRmF1bHRjb2RlRW51bSBmYXVsdCwgY29uc3QgY2hhciAqZGV0YWlsKTsKKworaW50IHNvYXBfd3NzZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGx1Z2luICpwLCB2b2lkICphcmcpOworCitpbnQgc29hcF93c3NlX3NpZ24oc3RydWN0IHNvYXAgKnNvYXAsIGludCBhbGcsIGNvbnN0IHZvaWQgKmtleSwgaW50IGtleWxlbik7CitpbnQgc29hcF93c3NlX3NpZ25fYm9keShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGFsZywgY29uc3Qgdm9pZCAqa2V5LCBpbnQga2V5bGVuKTsKK2ludCBzb2FwX3dzc2VfdmVyaWZ5X2luaXQoc3RydWN0IHNvYXAgKnNvYXApOworaW50IHNvYXBfd3NzZV92ZXJpZnlfYXV0byhzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGFsZywgY29uc3Qgdm9pZCAqa2V5LCBzaXplX3Qga2V5bGVuKTsKK2ludCBzb2FwX3dzc2VfdmVyaWZ5X2RvbmUoc3RydWN0IHNvYXAgKnNvYXApOworCitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2RlZmF1bHRfeHNkX19hbnlUeXBlKHN0cnVjdCBzb2FwKiwgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKm5vZGUpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dF94c2RfX2FueVR5cGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqbm9kZSwgY29uc3QgY2hhciAqdHlwZSk7CitTT0FQX0ZNQUMxIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICogU09BUF9GTUFDMiBzb2FwX2luX3hzZF9fYW55VHlwZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqbm9kZSwgY29uc3QgY2hhciAqdHlwZSk7CmRpZmYgLS1naXQgYS9zYW1wbGVzL01ha2VmaWxlIGIvc2FtcGxlcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmE2MWEwCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9NYWtlZmlsZQpAQCAtMCwwICsxLDUyIEBACithbGw6CisJY2QgY2FsYzsgbWFrZTsgY2QgLi4KKwljZCBjazsgbWFrZTsgY2QgLi4KKwljZCBkaW1lOyBtYWtlOyBjZCAuLgorCWNkIGV2ZW50czsgbWFrZTsgY2QgLi4KKwljZCBmYWN0b3J5OyBtYWtlOyBjZCAuLgorCWNkIGZhY3Rvcnl0ZXN0OyBtYWtlOyBjZCAuLgorCWNkIGdvb2dsZWFwaTsgbWFrZTsgY2QgLi4KKwljZCBsaXN0aW5nOyBtYWtlOyBjZCAuLgorCWNkIGxvY2FsdGltZTsgbWFrZTsgY2QgLi4KKwljZCBsdTsgbWFrZTsgY2QgLi4KKwljZCBtYWdpYzsgbWFrZTsgY2QgLi4KKwljZCBtdG9tOyBtYWtlOyBjZCAuLgorCWNkIG9uZWxpbmVyczsgbWFrZTsgY2QgLi4KKwljZCBwb2x5dGVzdDsgbWFrZTsgY2QgLi4KKwljZCBxdW90ZTsgbWFrZTsgY2QgLi4KKwljZCBxdW90ZTI7IG1ha2U7IGNkIC4uCisJY2QgcXVvdGUzOyBtYWtlOyBjZCAuLgorCWNkIHF1b3RleDsgbWFrZTsgY2QgLi4KKwljZCByb3V0ZXI7IG1ha2U7IGNkICAuLgorCWNkIHJzczsgbWFrZTsgY2QgIC4uCisJY2QgeG1sLXJwYzsgbWFrZTsgY2QgIC4uCisJY2QgdWRwOyBtYWtlOyBjZCAgLi4KKwljZCB2YXJwYXJhbTsgbWFrZTsgY2QgLi4KKwljZCB3ZWJzZXJ2ZXI7IG1ha2U7IGNkIC4uCisJY2Qgd3NzZTsgbWFrZTsgY2QgLi4KK2Rpc3RjbGVhbjoKKwljZCBjYWxjOyBtYWtlIGRpc3RjbGVhbjsgY2QgLi4KKwljZCBjazsgbWFrZSBkaXN0Y2xlYW47IGNkIC4uCisJY2QgZGltZTsgbWFrZSBkaXN0Y2xlYW47IGNkIC4uCisJY2QgZXZlbnRzOyBtYWtlIGRpc3RjbGVhbjsgY2QgLi4KKwljZCBmYWN0b3J5OyBtYWtlIGRpc3RjbGVhbjsgY2QgLi4KKwljZCBmYWN0b3J5dGVzdDsgbWFrZSBkaXN0Y2xlYW47IGNkIC4uCisJY2QgZ29vZ2xlYXBpOyBtYWtlIGRpc3RjbGVhbjsgY2QgLi4KKwljZCBsaXN0aW5nOyBtYWtlIGRpc3RjbGVhbjsgY2QgLi4KKwljZCBsb2NhbHRpbWU7IG1ha2UgZGlzdGNsZWFuOyBjZCAuLgorCWNkIGx1OyBtYWtlIGRpc3RjbGVhbjsgY2QgLi4KKwljZCBtYWdpYzsgbWFrZSBkaXN0Y2xlYW47IGNkIC4uCisJY2QgbXRvbTsgbWFrZSBkaXN0Y2xlYW47IGNkIC4uCisJY2Qgb25lbGluZXJzOyBtYWtlIGRpc3RjbGVhbjsgY2QgLi4KKwljZCBwb2x5dGVzdDsgbWFrZSBkaXN0Y2xlYW47IGNkIC4uCisJY2QgcXVvdGU7IG1ha2UgZGlzdGNsZWFuOyBjZCAuLgorCWNkIHF1b3RlMjsgbWFrZSBkaXN0Y2xlYW47IGNkIC4uCisJY2QgcXVvdGUzOyBtYWtlIGRpc3RjbGVhbjsgY2QgLi4KKwljZCBxdW90ZXg7IG1ha2UgZGlzdGNsZWFuOyBjZCAuLgorCWNkIHJvdXRlcjsgbWFrZSBkaXN0Y2xlYW47IGNkIC4uCisJY2QgcnNzOyBtYWtlIGRpc3RjbGVhbjsgY2QgLi4KKwljZCB4bWwtcnBjOyBtYWtlIGRpc3RjbGVhbjsgY2QgLi4KKwljZCB1ZHA7IG1ha2UgZGlzdGNsZWFuOyBjZCAuLgorCWNkIHZhcnBhcmFtOyBtYWtlIGRpc3RjbGVhbjsgY2QgLi4KKwljZCB3ZWJzZXJ2ZXI7IG1ha2UgZGlzdGNsZWFuOyBjZCAuLgorCWNkIHdzc2U7IG1ha2UgZGlzdGNsZWFuOyBjZCAuLgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9NYWtlZmlsZVNvbGFyaXMgYi9zYW1wbGVzL01ha2VmaWxlU29sYXJpcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmUzZTk4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9NYWtlZmlsZVNvbGFyaXMKQEAgLTAsMCArMSw1MiBAQAorYWxsOgorCWNkIGNhbGM7IG1ha2UgLWYgTWFrZWZpbGVTb2xhcmlzOyBjZCAuLgorCWNkIGNrOyBtYWtlIC1mIE1ha2VmaWxlU29sYXJpczsgY2QgLi4KKwljZCBkaW1lOyBtYWtlIC1mIE1ha2VmaWxlU29sYXJpczsgY2QgLi4KKwljZCBldmVudHM7IG1ha2UgLWYgTWFrZWZpbGVTb2xhcmlzOyBjZCAuLgorCWNkIGZhY3Rvcnk7IG1ha2UgLWYgTWFrZWZpbGVTb2xhcmlzOyBjZCAuLgorCWNkIGZhY3Rvcnl0ZXN0OyBtYWtlIC1mIE1ha2VmaWxlU29sYXJpczsgY2QgLi4KKwljZCBnb29nbGVhcGk7IG1ha2UgLWYgTWFrZWZpbGVTb2xhcmlzOyBjZCAuLgorCWNkIGxpc3Rpbmc7IG1ha2UgLWYgTWFrZWZpbGVTb2xhcmlzOyBjZCAuLgorCWNkIGxvY2FsdGltZTsgbWFrZSAtZiBNYWtlZmlsZVNvbGFyaXM7IGNkIC4uCisJY2QgbHU7IG1ha2UgLWYgTWFrZWZpbGVTb2xhcmlzOyBjZCAuLgorCWNkIG1hZ2ljOyBtYWtlIC1mIE1ha2VmaWxlU29sYXJpczsgY2QgLi4KKwljZCBtdG9tOyBtYWtlIC1mIE1ha2VmaWxlU29sYXJpczsgY2QgLi4KKwljZCBvbmVsaW5lcnM7IG1ha2UgLWYgTWFrZWZpbGVTb2xhcmlzOyBjZCAuLgorCWNkIHBvbHl0ZXN0OyBtYWtlIC1mIE1ha2VmaWxlU29sYXJpczsgY2QgLi4KKwljZCBxdW90ZTsgbWFrZSAtZiBNYWtlZmlsZVNvbGFyaXM7IGNkIC4uCisJY2QgcXVvdGUyOyBtYWtlIC1mIE1ha2VmaWxlU29sYXJpczsgY2QgLi4KKwljZCBxdW90ZTM7IG1ha2UgLWYgTWFrZWZpbGVTb2xhcmlzOyBjZCAuLgorCWNkIHF1b3RleDsgbWFrZSAtZiBNYWtlZmlsZVNvbGFyaXM7IGNkIC4uCisJY2Qgcm91dGVyOyBtYWtlIC1mIE1ha2VmaWxlU29sYXJpczsgY2QgIC4uCisJY2QgcnNzOyBtYWtlIC1mIE1ha2VmaWxlU29sYXJpczsgY2QgIC4uCisJY2QgeG1sLXJwYzsgbWFrZSAtZiBNYWtlZmlsZVNvbGFyaXM7IGNkICAuLgorCWNkIHVkcDsgbWFrZSAtZiBNYWtlZmlsZVNvbGFyaXM7IGNkICAuLgorCWNkIHZhcnBhcmFtOyBtYWtlIC1mIE1ha2VmaWxlU29sYXJpczsgY2QgLi4KKwljZCB3ZWJzZXJ2ZXI7IG1ha2UgLWYgTWFrZWZpbGVTb2xhcmlzOyBjZCAuLgorCWNkIHdzc2U7IG1ha2UgLWYgTWFrZWZpbGVTb2xhcmlzOyBjZCAuLgorZGlzdGNsZWFuOgorCWNkIGNhbGM7IG1ha2UgZGlzdGNsZWFuOyBjZCAuLgorCWNkIGNrOyBtYWtlIGRpc3RjbGVhbjsgY2QgLi4KKwljZCBkaW1lOyBtYWtlIGRpc3RjbGVhbjsgY2QgLi4KKwljZCBldmVudHM7IG1ha2UgZGlzdGNsZWFuOyBjZCAuLgorCWNkIGZhY3Rvcnk7IG1ha2UgZGlzdGNsZWFuOyBjZCAuLgorCWNkIGZhY3Rvcnl0ZXN0OyBtYWtlIGRpc3RjbGVhbjsgY2QgLi4KKwljZCBnb29nbGVhcGk7IG1ha2UgZGlzdGNsZWFuOyBjZCAuLgorCWNkIGxpc3Rpbmc7IG1ha2UgZGlzdGNsZWFuOyBjZCAuLgorCWNkIGxvY2FsdGltZTsgbWFrZSBkaXN0Y2xlYW47IGNkIC4uCisJY2QgbHU7IG1ha2UgZGlzdGNsZWFuOyBjZCAuLgorCWNkIG1hZ2ljOyBtYWtlIGRpc3RjbGVhbjsgY2QgLi4KKwljZCBtdG9tOyBtYWtlIGRpc3RjbGVhbjsgY2QgLi4KKwljZCBvbmVsaW5lcnM7IG1ha2UgZGlzdGNsZWFuOyBjZCAuLgorCWNkIHBvbHl0ZXN0OyBtYWtlIGRpc3RjbGVhbjsgY2QgLi4KKwljZCBxdW90ZTsgbWFrZSBkaXN0Y2xlYW47IGNkIC4uCisJY2QgcXVvdGUyOyBtYWtlIGRpc3RjbGVhbjsgY2QgLi4KKwljZCBxdW90ZTM7IG1ha2UgZGlzdGNsZWFuOyBjZCAuLgorCWNkIHF1b3RleDsgbWFrZSBkaXN0Y2xlYW47IGNkIC4uCisJY2Qgcm91dGVyOyBtYWtlIGRpc3RjbGVhbjsgY2QgLi4KKwljZCByc3M7IG1ha2UgZGlzdGNsZWFuOyBjZCAuLgorCWNkIHhtbC1ycGM7IG1ha2UgZGlzdGNsZWFuOyBjZCAuLgorCWNkIHVkcDsgbWFrZSBkaXN0Y2xlYW47IGNkIC4uCisJY2QgdmFycGFyYW07IG1ha2UgZGlzdGNsZWFuOyBjZCAuLgorCWNkIHdlYnNlcnZlcjsgbWFrZSBkaXN0Y2xlYW47IGNkIC4uCisJY2Qgd3NzZTsgbWFrZSBkaXN0Y2xlYW47IGNkIC4uCmRpZmYgLS1naXQgYS9zYW1wbGVzL1JFQURNRS50eHQgYi9zYW1wbGVzL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFjZTQzZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvUkVBRE1FLnR4dApAQCAtMCwwICsxLDkwIEBACisKK0VYQU1QTEVTCisKK0V4YW1wbGVzIGFyZSBpbmNsdWRlZCBpbiB0aGUgJ3NhbXBsZXMnIGRpcmVjdG9yeS4gVGhlIGV4YW1wbGVzIGFyZToKKworY2FsYzoJCQkJU2ltcGxlIGNhbGN1bGF0b3IgY2xpZW50IGFuZCBzZXJ2ZXIKK2NrOgkJCQlIVFRQIGNvb2tpZSBjbGllbnQgYW5kIHNlcnZlcgorY29tcG9uZW50cy9jLCBjb21wb25lbnRzL2NwcDoJTXVsdGlwbGUgY2xpZW50cy9zZXJ2aWNlcyBpbiBvbmUgZXhlY3V0YWJsZQorZGltZToJCQkJRElNRSBhdHRhY2htZW50IGNsaWVudCBhbmQgc2VydmVyCitldmVudHM6CQkJCUFzeW5jaHJvbm91cyBvbmUtd2F5IG1lc3NhZ2luZworZmFjdG9yeToJCQlSZW1vdGUgb2JqZWN0IGZhY3RvcnkgYW5kIHNpbXBsZSBPUkIKK2ZhY3Rvcnl0ZXN0OgkJCVRlc3QgY2xpZW50IGZvciByZW1vdGUgb2JqZWN0IGZhY3RvcnkKK2dvb2dsZWFwaToJCQlHb29nbGUgV2ViIEFQSSBjbGllbnQKK2xpc3Rpbmc6CQkJWE1ldGhvZCBzZXJ2aWNlIGxpc3RpbmcgY2xpZW50Citsb2NhbHRpbWU6CQkJR2V0IGxvY2FsdGltZSBjbGllbnQKK2x1OgkJCQlMaW5lYXIgc29sdmVyIGNsaWVudCBhbmQgc2VydmVyCittYWdpYzoJCQkJTWFnaWMgU3F1YXJlcyBjbGllbnQgYW5kIHNlcnZlcgorbXRvbToJCQkJTVRPTSBhdHRhY2htZW50IGNsaWVudCBhbmQgc2VydmVyCitvbmVsaW5lcnM6CQkJU2V2ZXJhbCBvbmUtbGluZXIgY2xpZW50cyBhbmQgc2VydmljZXMKK3BvbHl0ZXN0OgkJCVBvbHltb3JwaGljIG9iamVjdCBleGNoYW5nZQorcXVvdGU6CQkJCUdldCBkZWxheWVkIHN0b2NrIHF1b3RlCitxdW90ZTI6CQkJCUdldCBkZWxheWVkIHN0b2NrIHF1b3RlIChTT0FQIGFzeW5jIG1lc3NhZ2VzKQorcXVvdGUzOgkJCQlHZXQgZGVsYXllZCBzdG9jayBxdW90ZSAod2l0aCBTdG9jayBjbGFzcykKK3F1b3RlNDoJCQkJR2V0IGRlbGF5ZWQgc3RvY2sgcXVvdGUgKHVzaW5nIFhNTCBET00pCitxdW90ZXg6CQkJCUNvbWJpbmVkIGNsaWVudC9zZXJ2ZXIgZXhhbXBsZSBpbiBvbmUKK3JvdXRlcjoJCQkJUm91dGVyIG9mIEhUVFAgbWVzc2FnZXMgb3ZlciBUQ1AvSVAKK3JzczoJCQkJUlNTIDAuOTEsIDAuOTIsIGFuZCAyLjAgc2VydmVyCitzc2w6CQkJCUhUVFBTL1NTTCBleGFtcGxlIChyZXF1aXJlcyBPcGVuU1NMKQordWRwOgkJCQlTT0FQLW92ZXItVURQIGV4YW1wbGUgY2xpZW50IGFuZCBzZXJ2ZXIKK3ZhcnBhcmFtOgkJCVZhcmlhYmxlIHBvbHltb3JwaGljIHBhcmFtZXRlcnMgY2xpZW50L3NlcnZlcgord2Vic2VydmVyOgkJCVN0YW5kLWFsb25lIFdlYiBzZXJ2ZXIgd2l0aCBhIGxvdCBvZiBmZWF0dXJlcword3NzZToJCQkJV1MtU2VjdXJpdHkgZGVtbworeG1sLXJwYzoJCQlYTUwtUlBDIHN1cHBvcnQKKworVG8gYnVpbGQgdGhlIGV4YW1wbGUgc2VydmljZXMgYW5kIGNsaWVudHMsIHR5cGUgIm1ha2UiIGluIHRoZSAnc2FtcGxlcycKK2RpcmVjdG9yeSAoU3VuIFNvbGFyaXMgdXNlcnMgc2hvdWxkIHR5cGUgIm1ha2UgLWYgTWFrZWZpbGVTb2xhcmlzIikuCisKK0RJU0NMQUlNRVIKKworV0UgVFJZIE9VUiBCRVNUIFRPIFBST1ZJREUgWU9VIFdJVEggIlJFQUwtV09STEQiIEVYQU1QTEVTIEJVVCBXRSBDQU5OT1QKK0dVQVJBTlRFRSBUSEFUIEFMTCBDTElFTlQgRVhBTVBMRVMgQ0FOIENPTk5FQ1QgVE8gVEhJUkQgUEFSVFkgV0VCIFNFUlZJQ0VTCitXSEVOIFRIRVNFIFNFUlZJQ0VTIEFSRSBET1dOIE9SIEhBVkUgQkVFTiBSRU1PVkVELgorCitNUyBXSU5ET1dTCisKK0ZvciBXaW5kb3dzIHVzZXJzLCB0aGUgYXJjaGl2ZSBpbmNsdWRlcyAnbWFnaWNfVkMnIGFuZCAncXVvdGVfVkMnIFZpc3VhbAorU3R1ZGlvIHByb2plY3RzIGluIHRoZSAnc2FtcGxlcycgZGlyZWN0b3J5LgorCitTU0wKKworVG8gdHJ5IHRoZSBTU0wtc2VjdXJlIFNPQVAgc2VydmVyLCBpbnN0YWxsIE9wZW5TU0wgYW5kIGNoYW5nZSB0aGUgb2NjdXJyZW5jZXMKK29mICJsaW5wcm9nMi5jcy5mc3UuZWR1IiBpbiBzc2xjbGllbnQuYyBhbmQgc3Nsc2VydmVyLmMgdG8gdGhlIG1hY2hpbmUgbmFtZQorKG9yIG1hY2hpbmUgSVApIHlvdSBhcmUgdXNpbmcuIEV4YW1wbGUgLnBlbSBmaWxlcyBhcmUgaW5jbHVkZWQgYnV0IHlvdSBuZWVkIHRvCitjcmVhdGUgeW91ciBvd24gLnBlbSBmaWxlcyAoc2VlIE9wZW5TU0wgZG9jdW1lbnRhdGlvbikuCisKK1RoZSBzc2xjbGllbnQgYW5kIHNzbHNlcnZlciBjb2RlcyBjYW4gdGhlbiBiZSBidWlsZCBhcyBmb2xsb3dzOgorCitzb2FwY3BwMiAtYyBzc2wuaAorZ2NjIC1EV0lUSF9PUEVOU1NMIC1vIHNzbGNsaWVudCBzc2xjbGllbnQuYyBzdGRzb2FwMi5jIHNvYXBDLmMgc29hcENsaWVudC5jIC1sc3NsIC1sY3J5cHRvCitnY2MgLURXSVRIX09QRU5TU0wgLW8gc3Nsc2VydmVyIHNzbHNlcnZlci5jIHN0ZHNvYXAyLmMgc29hcEMuYyBzb2FwU2VydmVyLmMgLWxzc2wgLWxjcnlwdG8gLWxwdGhyZWFkCisKK0NPUFlSSUdIVCBBTkQgTElDRU5TRQorCitUaGUgZ1NPQVAgZXhhbXBsZXMgaW4gdGhlICdzYW1wbGVzJyBkaXJlY3RvcnkgYXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHUEwuCitTZWUgdGhlIGdwbC50eHQgZmlsZSBmb3IgZGV0YWlscy4KKworQSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiBQbGVhc2UgY29udGFjdDoKK2NvbnRhY3RAZ2VuaXZpYS5jb20KKworZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCitBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUworRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCmRpZmYgLS1naXQgYS9zYW1wbGVzL2NhbGMvTWFrZWZpbGUgYi9zYW1wbGVzL2NhbGMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE5MjI0MQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvY2FsYy9NYWtlZmlsZQpAQCAtMCwwICsxLDIzIEBACitHU09BUD0uLi8uLi9zb2FwY3BwMgorU09BUEg9Li4vLi4vc3Rkc29hcDIuaAorU09BUEM9Li4vLi4vc3Rkc29hcDIuYworU09BUENQUD0uLi8uLi9zdGRzb2FwMi5jcHAKK0NDPWdjYworQ1BQPWcrKworTElCUz0KK0NPRkxBR1M9LU8yCitDV0ZMQUdTPS1XYWxsCitDSUZMQUdTPS1JLi4vLi4KK0NNRkxBR1M9CitDRkxBR1M9ICQoQ1dGTEFHUykgJChDT0ZMQUdTKSAkKENJRkxBR1MpICQoQ01GTEFHUykKK2FsbDoJCWNhbGNjbGllbnQgY2FsY3NlcnZlcgorY2FsY2NsaWVudDoJY2FsYy5oIGNhbGNjbGllbnQuYyAkKFNPQVBIKSAkKFNPQVBDKQorCQkkKEdTT0FQKSAtYyBjYWxjLmgKKwkJJChDQykgJChDRkxBR1MpIC1vIGNhbGNjbGllbnQgY2FsY2NsaWVudC5jIHNvYXBDLmMgc29hcENsaWVudC5jICQoU09BUEMpICQoTElCUykKK2NhbGNzZXJ2ZXI6CWNhbGMuaCBjYWxjc2VydmVyLmMgJChTT0FQSCkgJChTT0FQQykKKwkJJChHU09BUCkgLWMgY2FsYy5oCisJCSQoQ0MpICQoQ0ZMQUdTKSAtbyBjYWxjc2VydmVyIGNhbGNzZXJ2ZXIuYyBzb2FwQy5jIHNvYXBTZXJ2ZXIuYyAkKFNPQVBDKSAtbG0gJChMSUJTKQorY2xlYW46CisJCXJtIC1mICoubyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5LmgKK2Rpc3RjbGVhbjoKKwkJcm0gLWYgKi5vICoud3NkbCAqLnhzZCAqLnhtbCAqLm5zbWFwICoubG9nIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaCBjYWxjY2xpZW50IGNhbGNzZXJ2ZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvY2FsYy9NYWtlZmlsZVNvbGFyaXMgYi9zYW1wbGVzL2NhbGMvTWFrZWZpbGVTb2xhcmlzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZTEyNmEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2NhbGMvTWFrZWZpbGVTb2xhcmlzCkBAIC0wLDAgKzEsMjMgQEAKK0dTT0FQPS4uLy4uL3NvYXBjcHAyCitTT0FQSD0uLi8uLi9zdGRzb2FwMi5oCitTT0FQQz0uLi8uLi9zdGRzb2FwMi5jCitTT0FQQ1BQPS4uLy4uL3N0ZHNvYXAyLmNwcAorQ0M9Z2NjCitDUFA9ZysrCitMSUJTPS1seG5ldCAtbG5zbCAtbHNvY2tldAorQ09GTEFHUz0tTzIKK0NXRkxBR1M9LVdhbGwKK0NJRkxBR1M9LUkuLi8uLgorQ01GTEFHUz0KK0NGTEFHUz0gJChDV0ZMQUdTKSAkKENPRkxBR1MpICQoQ0lGTEFHUykgJChDTUZMQUdTKQorYWxsOgkJY2FsY2NsaWVudCBjYWxjc2VydmVyCitjYWxjY2xpZW50OgljYWxjLmggY2FsY2NsaWVudC5jICQoU09BUEgpICQoU09BUEMpCisJCSQoR1NPQVApIC1jIGNhbGMuaAorCQkkKENDKSAkKENGTEFHUykgLW8gY2FsY2NsaWVudCBjYWxjY2xpZW50LmMgc29hcEMuYyBzb2FwQ2xpZW50LmMgJChTT0FQQykgJChMSUJTKQorY2FsY3NlcnZlcjoJY2FsYy5oIGNhbGNzZXJ2ZXIuYyAkKFNPQVBIKSAkKFNPQVBDKQorCQkkKEdTT0FQKSAtYyBjYWxjLmgKKwkJJChDQykgJChDRkxBR1MpIC1vIGNhbGNzZXJ2ZXIgY2FsY3NlcnZlci5jIHNvYXBDLmMgc29hcFNlcnZlci5jICQoU09BUEMpIC1sbSAkKExJQlMpCitjbGVhbjoKKwkJcm0gLWYgKi5vIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaAorZGlzdGNsZWFuOgorCQlybSAtZiAqLm8gKi53c2RsICoueHNkICoueG1sICoubnNtYXAgKi5sb2cgc29hcEguaCBzb2FwU3R1Yi5oIHNvYXBDLmNwcCBzb2FwQy5jIHNvYXBDbGllbnQuY3BwIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmNwcCBzb2FwU2VydmVyLmMgc29hcCpQcm94eS5oIGNhbGNjbGllbnQgY2FsY3NlcnZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9jYWxjL2NhbGMuaCBiL3NhbXBsZXMvY2FsYy9jYWxjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE5MjllMgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvY2FsYy9jYWxjLmgKQEAgLTAsMCArMSwxMiBAQAorLy9nc29hcCBucyBzZXJ2aWNlIG5hbWU6CWNhbGMKKy8vZ3NvYXAgbnMgc2VydmljZSBzdHlsZToJcnBjCisvL2dzb2FwIG5zIHNlcnZpY2UgZW5jb2Rpbmc6CWVuY29kZWQKKy8vZ3NvYXAgbnMgc2VydmljZSBuYW1lc3BhY2U6CWh0dHA6Ly93ZWJzcnYuY3MuZnN1LmVkdS9+ZW5nZWxlbi9jYWxjLndzZGwKKy8vZ3NvYXAgbnMgc2VydmljZSBsb2NhdGlvbjoJaHR0cDovL3dlYnNydi5jcy5mc3UuZWR1L35lbmdlbGVuL2NhbGNzZXJ2ZXIuY2dpCisKKy8vZ3NvYXAgbnMgc2NoZW1hIG5hbWVzcGFjZTogdXJuOmNhbGMKK2ludCBuc19fYWRkKGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlICpyZXN1bHQpOworaW50IG5zX19zdWIoZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgKnJlc3VsdCk7CitpbnQgbnNfX211bChkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSAqcmVzdWx0KTsKK2ludCBuc19fZGl2KGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlICpyZXN1bHQpOworaW50IG5zX19wb3coZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgKnJlc3VsdCk7CmRpZmYgLS1naXQgYS9zYW1wbGVzL2NhbGMvY2FsY2NsaWVudC5jIGIvc2FtcGxlcy9jYWxjL2NhbGNjbGllbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTA1MmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9jYWxjL2NhbGNjbGllbnQuYwpAQCAtMCwwICsxLDQ2IEBACisjaW5jbHVkZSAic29hcEguaCIKKyNpbmNsdWRlICJjYWxjLm5zbWFwIgorCitjb25zdCBjaGFyIHNlcnZlcltdID0gImh0dHA6Ly93ZWJzcnYuY3MuZnN1LmVkdS9+ZW5nZWxlbi9jYWxjc2VydmVyLmNnaSI7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sgc3RydWN0IHNvYXAgc29hcDsKKyAgZG91YmxlIGEsIGIsIHJlc3VsdDsKKyAgaWYgKGFyZ2MgPCA0KQorICB7IGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IFthZGR8c3VifG11bHxkaXZ8cG93XSBudW0gbnVtXG4iKTsKKyAgICBleGl0KDApOworICB9CisgIHNvYXBfaW5pdCgmc29hcCk7CisgIGEgPSBzdHJ0b2QoYXJndlsyXSwgTlVMTCk7CisgIGIgPSBzdHJ0b2QoYXJndlszXSwgTlVMTCk7CisgIHN3aXRjaCAoKmFyZ3ZbMV0pCisgIHsgY2FzZSAnYSc6CisgICAgICBzb2FwX2NhbGxfbnNfX2FkZCgmc29hcCwgc2VydmVyLCAiIiwgYSwgYiwgJnJlc3VsdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlICdzJzoKKyAgICAgIHNvYXBfY2FsbF9uc19fc3ViKCZzb2FwLCBzZXJ2ZXIsICIiLCBhLCBiLCAmcmVzdWx0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ20nOgorICAgICAgc29hcF9jYWxsX25zX19tdWwoJnNvYXAsIHNlcnZlciwgIiIsIGEsIGIsICZyZXN1bHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnZCc6CisgICAgICBzb2FwX2NhbGxfbnNfX2Rpdigmc29hcCwgc2VydmVyLCAiIiwgYSwgYiwgJnJlc3VsdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlICdwJzoKKyAgICAgIHNvYXBfY2FsbF9uc19fcG93KCZzb2FwLCBzZXJ2ZXIsICIiLCBhLCBiLCAmcmVzdWx0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gY29tbWFuZFxuIik7CisgICAgICBleGl0KDApOworICB9CisgIGlmIChzb2FwLmVycm9yKQorICB7IHNvYXBfcHJpbnRfZmF1bHQoJnNvYXAsIHN0ZGVycik7CisgICAgZXhpdCgxKTsKKyAgfQorICBlbHNlCisgICAgcHJpbnRmKCJyZXN1bHQgPSAlZ1xuIiwgcmVzdWx0KTsKKyAgc29hcF9kZXN0cm95KCZzb2FwKTsKKyAgc29hcF9lbmQoJnNvYXApOworICBzb2FwX2RvbmUoJnNvYXApOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvY2FsYy9jYWxjc2VydmVyLmMgYi9zYW1wbGVzL2NhbGMvY2FsY3NlcnZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYzI2ODYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2NhbGMvY2FsY3NlcnZlci5jCkBAIC0wLDAgKzEsNjYgQEAKKyNpbmNsdWRlICJzb2FwSC5oIgorI2luY2x1ZGUgImNhbGMubnNtYXAiCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sgaW50IG0sIHM7IC8qIG1hc3RlciBhbmQgc2xhdmUgc29ja2V0cyAqLworICBzdHJ1Y3Qgc29hcCBzb2FwOworICBzb2FwX2luaXQoJnNvYXApOworICBpZiAoYXJnYyA8IDIpCisgICAgc29hcF9zZXJ2ZSgmc29hcCk7CS8qIHNlcnZlIGFzIENHSSBhcHBsaWNhdGlvbiAqLworICBlbHNlCisgIHsgbSA9IHNvYXBfYmluZCgmc29hcCwgTlVMTCwgYXRvaShhcmd2WzFdKSwgMTAwKTsKKyAgICBpZiAobSA8IDApCisgICAgeyBzb2FwX3ByaW50X2ZhdWx0KCZzb2FwLCBzdGRlcnIpOworICAgICAgZXhpdCgtMSk7CisgICAgfQorICAgIGZwcmludGYoc3RkZXJyLCAiU29ja2V0IGNvbm5lY3Rpb24gc3VjY2Vzc2Z1bDogbWFzdGVyIHNvY2tldCA9ICVkXG4iLCBtKTsKKyAgICBmb3IgKCA7IDsgKQorICAgIHsgcyA9IHNvYXBfYWNjZXB0KCZzb2FwKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiU29ja2V0IGNvbm5lY3Rpb24gc3VjY2Vzc2Z1bDogc2xhdmUgc29ja2V0ID0gJWRcbiIsIHMpOworICAgICAgaWYgKHMgPCAwKQorICAgICAgeyBzb2FwX3ByaW50X2ZhdWx0KCZzb2FwLCBzdGRlcnIpOworICAgICAgICBleGl0KC0xKTsKKyAgICAgIH0gCisgICAgICBzb2FwX3NlcnZlKCZzb2FwKTsKKyAgICAgIHNvYXBfZW5kKCZzb2FwKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9IAorCitpbnQgbnNfX2FkZChzdHJ1Y3Qgc29hcCAqc29hcCwgZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgKnJlc3VsdCkKK3sgKnJlc3VsdCA9IGEgKyBiOworICByZXR1cm4gU09BUF9PSzsKK30gCisKK2ludCBuc19fc3ViKHN0cnVjdCBzb2FwICpzb2FwLCBkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSAqcmVzdWx0KQoreyAqcmVzdWx0ID0gYSAtIGI7CisgIHJldHVybiBTT0FQX09LOworfSAKKworaW50IG5zX19tdWwoc3RydWN0IHNvYXAgKnNvYXAsIGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlICpyZXN1bHQpCit7ICpyZXN1bHQgPSBhICogYjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9IAorCitpbnQgbnNfX2RpdihzdHJ1Y3Qgc29hcCAqc29hcCwgZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgKnJlc3VsdCkKK3sgaWYgKGIpCisgICAgKnJlc3VsdCA9IGEgLyBiOworICBlbHNlCisgIHsgY2hhciAqcyA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCAxMDI0KTsKKyAgICBzcHJpbnRmKHMsICI8ZXJyb3IgeG1sbnM9XCJodHRwOi8vdGVtcHVyaS5vcmcvXCI+Q2FuJ3QgZGl2aWRlICVmIGJ5ICVmPC9lcnJvcj4iLCBhLCBiKTsKKyAgICByZXR1cm4gc29hcF9zZW5kZXJfZmF1bHQoc29hcCwgIkRpdmlzaW9uIGJ5IHplcm8iLCBzKTsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30gCisKK2ludCBuc19fcG93KHN0cnVjdCBzb2FwICpzb2FwLCBkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSAqcmVzdWx0KQoreyAqcmVzdWx0ID0gcG93KGEsIGIpOworICBpZiAoc29hcF9lcnJubyA9PSBFRE9NKQkvKiBzb2FwX2Vycm5vIGlzIGxpa2UgZXJybm8sIGJ1dCBjb21wYXRpYmxlIHdpdGggV2luMzIgKi8KKyAgeyBjaGFyICpzID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIDEwMjQpOworICAgIHNwcmludGYocywgIkNhbid0IHRha2UgdGhlIHBvd2VyIG9mICVmIHRvICVmIiwgYSwgYik7CisgICAgc3ByaW50ZihzLCAiPGVycm9yIHhtbG5zPVwiaHR0cDovL3RlbXB1cmkub3JnL1wiPkNhbid0IHRha2UgcG93ZXIgb2YgJWYgdG8gJWY8L2Vycm9yPiIsIGEsIGIpOworICAgIHJldHVybiBzb2FwX3NlbmRlcl9mYXVsdChzb2FwLCAiUG93ZXIgZnVuY3Rpb24gZG9tYWluIGVycm9yIiwgcyk7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9IApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9jYWxjX1ZDX05PSFRUUC9jYWxjLmggYi9zYW1wbGVzL2NhbGNfVkNfTk9IVFRQL2NhbGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTkyOWUyCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9jYWxjX1ZDX05PSFRUUC9jYWxjLmgKQEAgLTAsMCArMSwxMiBAQAorLy9nc29hcCBucyBzZXJ2aWNlIG5hbWU6CWNhbGMKKy8vZ3NvYXAgbnMgc2VydmljZSBzdHlsZToJcnBjCisvL2dzb2FwIG5zIHNlcnZpY2UgZW5jb2Rpbmc6CWVuY29kZWQKKy8vZ3NvYXAgbnMgc2VydmljZSBuYW1lc3BhY2U6CWh0dHA6Ly93ZWJzcnYuY3MuZnN1LmVkdS9+ZW5nZWxlbi9jYWxjLndzZGwKKy8vZ3NvYXAgbnMgc2VydmljZSBsb2NhdGlvbjoJaHR0cDovL3dlYnNydi5jcy5mc3UuZWR1L35lbmdlbGVuL2NhbGNzZXJ2ZXIuY2dpCisKKy8vZ3NvYXAgbnMgc2NoZW1hIG5hbWVzcGFjZTogdXJuOmNhbGMKK2ludCBuc19fYWRkKGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlICpyZXN1bHQpOworaW50IG5zX19zdWIoZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgKnJlc3VsdCk7CitpbnQgbnNfX211bChkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSAqcmVzdWx0KTsKK2ludCBuc19fZGl2KGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlICpyZXN1bHQpOworaW50IG5zX19wb3coZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgKnJlc3VsdCk7CmRpZmYgLS1naXQgYS9zYW1wbGVzL2NhbGNfVkNfTk9IVFRQL2NhbGMuc2xuIGIvc2FtcGxlcy9jYWxjX1ZDX05PSFRUUC9jYWxjLnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzhlMDg3Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9jYWxjX1ZDX05PSFRUUC9jYWxjLnNsbgpAQCAtMCwwICsxLDI2IEBACivvu78KK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDkuMDAKKyMgVmlzdWFsIFN0dWRpbyAyMDA1CitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImNhbGNjbGllbnQiLCAiY2FsY2NsaWVudC52Y3Byb2oiLCAie0Y2NDcyMTNGLTMxOTctNEM4MC04QTQxLTNGQjU5QUVFNUQ0M30iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImNhbGNzZXJ2ZXIiLCAiY2FsY3NlcnZlci52Y3Byb2oiLCAiezEyNDUwQjU5LUJEQ0MtNDFGMC1BQkRELTRDNzUxN0JFNjkwRH0iCitFbmRQcm9qZWN0CitHbG9iYWwKKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgorCQlEZWJ1Z3xXaW4zMiA9IERlYnVnfFdpbjMyCisJCVJlbGVhc2V8V2luMzIgPSBSZWxlYXNlfFdpbjMyCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uCisJCXtGNjQ3MjEzRi0zMTk3LTRDODAtOEE0MS0zRkI1OUFFRTVENDN9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyCisJCXtGNjQ3MjEzRi0zMTk3LTRDODAtOEE0MS0zRkI1OUFFRTVENDN9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMgorCQl7RjY0NzIxM0YtMzE5Ny00QzgwLThBNDEtM0ZCNTlBRUU1RDQzfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzIKKwkJe0Y2NDcyMTNGLTMxOTctNEM4MC04QTQxLTNGQjU5QUVFNUQ0M30uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMgorCQl7MTI0NTBCNTktQkRDQy00MUYwLUFCREQtNEM3NTE3QkU2OTBEfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMgorCQl7MTI0NTBCNTktQkRDQy00MUYwLUFCREQtNEM3NTE3QkU2OTBEfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzIKKwkJezEyNDUwQjU5LUJEQ0MtNDFGMC1BQkRELTRDNzUxN0JFNjkwRH0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXsxMjQ1MEI1OS1CRENDLTQxRjAtQUJERC00Qzc1MTdCRTY5MER9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24KKwkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFCisJRW5kR2xvYmFsU2VjdGlvbgorRW5kR2xvYmFsCmRpZmYgLS1naXQgYS9zYW1wbGVzL2NhbGNfVkNfTk9IVFRQL2NhbGNjbGllbnQuY3BwIGIvc2FtcGxlcy9jYWxjX1ZDX05PSFRUUC9jYWxjY2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzc5MjU5Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9jYWxjX1ZDX05PSFRUUC9jYWxjY2xpZW50LmNwcApAQCAtMCwwICsxLDQ4IEBACisjaW5jbHVkZSAic29hcEguaCIKKyNpbmNsdWRlICJjYWxjLm5zbWFwIgorCisvL2NvbnN0IGNoYXIgc2VydmVyW10gPSAiaHR0cDovL3dlYnNydi5jcy5mc3UuZWR1L35lbmdlbGVuL2NhbGNzZXJ2ZXIuY2dpIjsKKy8vIENoYW5nZWQgYnkgRVNMCitjb25zdCBjaGFyIHNlcnZlcltdID0gImh0dHA6Ly8xOTIuMTY4LjAuMzo5MDAxL2NhbGNzZXJ2ZXIuY2dpIjsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreyBzdHJ1Y3Qgc29hcCBzb2FwOworICBkb3VibGUgYSwgYiwgcmVzdWx0OworICBpZiAoYXJnYyA8IDQpCisgIHsgZnByaW50ZihzdGRlcnIsICJVc2FnZTogW2FkZHxzdWJ8bXVsfGRpdnxwb3ddIG51bSBudW1cbiIpOworICAgIGV4aXQoMCk7CisgIH0KKyAgc29hcF9pbml0KCZzb2FwKTsKKyAgYSA9IHN0cnRvZChhcmd2WzJdLCBOVUxMKTsKKyAgYiA9IHN0cnRvZChhcmd2WzNdLCBOVUxMKTsKKyAgc3dpdGNoICgqYXJndlsxXSkKKyAgeyBjYXNlICdhJzoKKyAgICAgIHNvYXBfY2FsbF9uc19fYWRkKCZzb2FwLCBzZXJ2ZXIsICIiLCBhLCBiLCAmcmVzdWx0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3MnOgorICAgICAgc29hcF9jYWxsX25zX19zdWIoJnNvYXAsIHNlcnZlciwgIiIsIGEsIGIsICZyZXN1bHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnbSc6CisgICAgICBzb2FwX2NhbGxfbnNfX211bCgmc29hcCwgc2VydmVyLCAiIiwgYSwgYiwgJnJlc3VsdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlICdkJzoKKyAgICAgIHNvYXBfY2FsbF9uc19fZGl2KCZzb2FwLCBzZXJ2ZXIsICIiLCBhLCBiLCAmcmVzdWx0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3AnOgorICAgICAgc29hcF9jYWxsX25zX19wb3coJnNvYXAsIHNlcnZlciwgIiIsIGEsIGIsICZyZXN1bHQpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biBjb21tYW5kXG4iKTsKKyAgICAgIGV4aXQoMCk7CisgIH0KKyAgaWYgKHNvYXAuZXJyb3IpCisgIHsgc29hcF9wcmludF9mYXVsdCgmc29hcCwgc3RkZXJyKTsKKyAgICBleGl0KDEpOworICB9CisgIGVsc2UKKyAgICBwcmludGYoInJlc3VsdCA9ICVnXG4iLCByZXN1bHQpOworICBzb2FwX2Rlc3Ryb3koJnNvYXApOworICBzb2FwX2VuZCgmc29hcCk7CisgIHNvYXBfZG9uZSgmc29hcCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9jYWxjX1ZDX05PSFRUUC9jYWxjY2xpZW50LnZjcHJvaiBiL3NhbXBsZXMvY2FsY19WQ19OT0hUVFAvY2FsY2NsaWVudC52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThlMTFiZAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvY2FsY19WQ19OT0hUVFAvY2FsY2NsaWVudC52Y3Byb2oKQEAgLTAsMCArMSwzMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI4LjAwIg0KKwlOYW1lPSJjYWxjY2xpZW50Ig0KKwlQcm9qZWN0R1VJRD0ie0Y2NDcyMTNGLTMxOTctNEM4MC04QTQxLTNGQjU5QUVFNUQ0M30iDQorCVJvb3ROYW1lc3BhY2U9ImNhbGNjbGllbnQiDQorCUtleXdvcmQ9IldpbjMyUHJvaiINCisJPg0KKwk8UGxhdGZvcm1zPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luMzIiDQorCQkvPg0KKwk8L1BsYXRmb3Jtcz4NCisJPFRvb2xGaWxlcz4NCisJPC9Ub29sRmlsZXM+DQorCTxDb25maWd1cmF0aW9ucz4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXERlYnVnIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxEZWJ1ZyINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzYwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlxEZWJ1Zy9jYWxjY2xpZW50LnRsYiINCisJCQkJSGVhZGVyRmlsZU5hbWU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCSANCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XSU5OVD0weDA1MDE7V0lOVkVSPTB4MDUwMTtfV0lOMzJfSUU9MHgwNjAzO1dJTjMyO19ERUJVRztfQ09OU09MRTtXSVRIX05PSFRUUCINCisJCQkJIA0KKwkJCQkgDQorCQkJCSANCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXERlYnVnL2NhbGNjbGllbnQucGNoIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cRGVidWcvIg0KKwkJCQlPYmplY3RGaWxlPSIuXERlYnVnLyINCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cRGVidWcvIg0KKwkJCQkgDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJIA0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dJTk5UPTB4MDUwMTtXSU5WRVI9MHgwNTAxO19XSU4zMl9JRT0weDA2MDM7X0RFQlVHIg0KKwkJCQlDdWx0dXJlPSIxMDMzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJvZGJjMzIubGliIG9kYmNjcDMyLmxpYiB3c29jazMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLlxEZWJ1Zy9jYWxjY2xpZW50LmV4ZSINCisJCQkJIA0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCQ0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXERlYnVnL2NhbGNjbGllbnQucGRiIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJT3V0cHV0RmlsZT0iLlxEZWJ1Zy9jYWxjY2xpZW50LmJzYyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cUmVsZWFzZSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cUmVsZWFzZSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzYwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlxSZWxlYXNlL2NhbGNjbGllbnQudGxiIg0KKwkJCQlIZWFkZXJGaWxlTmFtZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJIA0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XSU5OVD0weDA1MDE7V0lOVkVSPTB4MDUwMTtfV0lOMzJfSUU9MHgwNjAzO1dJTjMyO05ERUJVRztfQ09OU09MRSINCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCisJCQkJIA0KKwkJCQkgDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlxSZWxlYXNlL2NhbGNjbGllbnQucGNoIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cUmVsZWFzZS8iDQorCQkJCU9iamVjdEZpbGU9Ii5cUmVsZWFzZS8iDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXFJlbGVhc2UvIg0KKwkJCQkgDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XSU5OVD0weDA1MDE7V0lOVkVSPTB4MDUwMTtfV0lOMzJfSUU9MHgwNjAzO05ERUJVRyINCisJCQkJQ3VsdHVyZT0iMTAzMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iLlxSZWxlYXNlL2NhbGNjbGllbnQuZXhlIg0KKwkJCQkgDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlxSZWxlYXNlL2NhbGNjbGllbnQucGRiIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJT3V0cHV0RmlsZT0iLlxSZWxlYXNlL2NhbGNjbGllbnQuYnNjIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwk8L0NvbmZpZ3VyYXRpb25zPg0KKwk8UmVmZXJlbmNlcz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCINCisJCQk+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGNhbGNjbGllbnQuY3BwIg0KKwkJCQk+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJT2JqZWN0RmlsZT0iJChJbnREaXIpXCQoSW5wdXROYW1lKTEub2JqIg0KKwkJCQkJCVhNTERvY3VtZW50YXRpb25GaWxlTmFtZT0iJChJbnREaXIpXCQoSW5wdXROYW1lKTEueGRjIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCU9iamVjdEZpbGU9IiQoSW50RGlyKVwkKElucHV0TmFtZSkxLm9iaiINCisJCQkJCQlYTUxEb2N1bWVudGF0aW9uRmlsZU5hbWU9IiQoSW50RGlyKVwkKElucHV0TmFtZSkxLnhkYyINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0ic29hcEMuY3BwIg0KKwkJCQk+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XSU5OVD0weDA1MDE7V0lOVkVSPTB4MDUwMTtfV0lOMzJfSUU9MHgwNjAzOyINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dJTk5UPTB4MDUwMTtXSU5WRVI9MHgwNTAxO19XSU4zMl9JRT0weDA2MDM7Ig0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSJzb2FwQ2xpZW50LmNwcCINCisJCQkJPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0lOTlQ9MHgwNTAxO1dJTlZFUj0weDA1MDE7X1dJTjMyX0lFPTB4MDYwMzsiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XSU5OVD0weDA1MDE7V0lOVkVSPTB4MDUwMTtfV0lOMzJfSUU9MHgwNjAzOyINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0ic3Rkc29hcDIuY3BwIg0KKwkJCQk+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XSU5OVD0weDA1MDE7V0lOVkVSPTB4MDUwMTtfV0lOMzJfSUU9MHgwNjAzOyINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dJTk5UPTB4MDUwMTtXSU5WRVI9MHgwNTAxO19XSU4zMl9JRT0weDA2MDM7Ig0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiDQorCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sIg0KKwkJCT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9ImNhbGMuaCINCisJCQkJPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkJCQlEZXNjcmlwdGlvbj0iZ1NPQVAgV2ViIHNlcnZpY2UgcHJveHkvc2tlbGV0b24gYnVpbGQgb24gJChJbnB1dFBhdGgpIg0KKwkJCQkJCUNvbW1hbmRMaW5lPSIuXHNvYXBjcHAyLmV4ZSAmcXVvdDskKElucHV0UGF0aCkmcXVvdDsmI3gwRDsmI3gwQTsiDQorCQkJCQkJT3V0cHV0cz0ic29hcFN0dWIuaCBzb2FwSC5oIHNvYXBDLmNwcCBzb2FwQ2xpZW50LmNwcCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0ic29hcEguaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9InNvYXBTdHViLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSJzdGRzb2FwMi5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iUmVzb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiDQorCQkJPg0KKwkJPC9GaWx0ZXI+DQorCTwvRmlsZXM+DQorCTxHbG9iYWxzPg0KKwk8L0dsb2JhbHM+DQorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvY2FsY19WQ19OT0hUVFAvY2FsY3NlcnZlci5jcHAgYi9zYW1wbGVzL2NhbGNfVkNfTk9IVFRQL2NhbGNzZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNjhiMTEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2NhbGNfVkNfTk9IVFRQL2NhbGNzZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsMTA0IEBACisjaW5jbHVkZSAic29hcEguaCIKKyNpbmNsdWRlICJjYWxjLm5zbWFwIgorCisKKyNpZmRlZiBXSVRIX05PSFRUUAoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgc3RydWN0IHNvYXAgc29hcDsgCisgICBpbnQgbSwgczsgLy8gbWFzdGVyIGFuZCBzbGF2ZSBzb2NrZXRzIAorICAgc29hcF9pbml0KCZzb2FwKTsgCisgICAvLyBtID0gc29hcF9iaW5kKCZzb2FwLCAibWFjaGluZS5jcy5mc3UuZWR1IiwgMTgwODMsIDEwMCk7IAorICAgLy8gRVNMIGNoYW5nZWQgdG86CisgICBtID0gc29hcF9iaW5kKCZzb2FwLCAiMTkyLjE2OC4wLjMiLCA5MDAxLCAxMDApOyAKKyAgIGlmIChtIDwgMCkgCisgICAgICBzb2FwX3ByaW50X2ZhdWx0KCZzb2FwLCBzdGRlcnIpOyAKKyAgIGVsc2UKKyAgIHsgCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlNvY2tldCBjb25uZWN0aW9uIHN1Y2Nlc3NmdWw6IG1hc3RlciBzb2NrZXQgPSAlZFxuIiwgbSk7IAorICAgICAgZm9yIChpbnQgaSA9IDE7IDsgaSsrKSAKKyAgICAgIHsKKyAgICAgICAgIHMgPSBzb2FwX2FjY2VwdCgmc29hcCk7IAorICAgICAgICAgaWYgKHMgPCAwKSAKKyAgICAgICAgIHsgCisgICAgICAgICAgICBzb2FwX3ByaW50X2ZhdWx0KCZzb2FwLCBzdGRlcnIpOyAKKyAgICAgICAgICAgIGJyZWFrOyAKKyAgICAgICAgIH0gCisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVkOiBhY2NlcHRlZCBjb25uZWN0aW9uIGZyb20gSVA9JWQuJWQuJWQuJWQgc29ja2V0PSVkIiwgaSwgCisgICAgICAgICAgICAoc29hcC5pcCA+PiAyNCkmMHhGRiwgKHNvYXAuaXAgPj4gMTYpJjB4RkYsIChzb2FwLmlwID4+IDgpJjB4RkYsIHNvYXAuaXAmMHhGRiwgcyk7IAorICAgICAgICAgaWYgKHNvYXBfc2VydmUoJnNvYXApICE9IFNPQVBfT0spIC8vIHByb2Nlc3MgUlBDIHJlcXVlc3QgCisgICAgICAgICAgICBzb2FwX3ByaW50X2ZhdWx0KCZzb2FwLCBzdGRlcnIpOyAvLyBwcmludCBlcnJvciAKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicmVxdWVzdCBzZXJ2ZWRcbiIpOyAKKyAgICAgICAgIHNvYXBfZGVzdHJveSgmc29hcCk7IC8vIGNsZWFuIHVwIGNsYXNzIGluc3RhbmNlcyAKKyAgICAgICAgIHNvYXBfZW5kKCZzb2FwKTsgLy8gY2xlYW4gdXAgZXZlcnl0aGluZyBhbmQgY2xvc2Ugc29ja2V0IAorICAgICAgfSAKKyAgIH0gCisgICBzb2FwX2RvbmUoJnNvYXApOyAvLyBjbG9zZSBtYXN0ZXIgc29ja2V0IGFuZCBkZXRhY2ggZW52aXJvbm1lbnQgCit9IAorCisjZWxzZSAKKyAKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sgaW50IG0sIHM7IC8qIG1hc3RlciBhbmQgc2xhdmUgc29ja2V0cyAqLworICBzdHJ1Y3Qgc29hcCBzb2FwOworICBzb2FwX2luaXQoJnNvYXApOworICBpZiAoYXJnYyA8IDIpCisgICAgc29hcF9zZXJ2ZSgmc29hcCk7CS8qIHNlcnZlIGFzIENHSSBhcHBsaWNhdGlvbiAqLworICBlbHNlCisgIHsgbSA9IHNvYXBfYmluZCgmc29hcCwgTlVMTCwgYXRvaShhcmd2WzFdKSwgMTAwKTsKKyAgICBpZiAobSA8IDApCisgICAgeyBzb2FwX3ByaW50X2ZhdWx0KCZzb2FwLCBzdGRlcnIpOworICAgICAgZXhpdCgtMSk7CisgICAgfQorICAgIGZwcmludGYoc3RkZXJyLCAiU29ja2V0IGNvbm5lY3Rpb24gc3VjY2Vzc2Z1bDogbWFzdGVyIHNvY2tldCA9ICVkXG4iLCBtKTsKKyAgICBmb3IgKCA7IDsgKQorICAgIHsgcyA9IHNvYXBfYWNjZXB0KCZzb2FwKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiU29ja2V0IGNvbm5lY3Rpb24gc3VjY2Vzc2Z1bDogc2xhdmUgc29ja2V0ID0gJWRcbiIsIHMpOworICAgICAgaWYgKHMgPCAwKQorICAgICAgeyBzb2FwX3ByaW50X2ZhdWx0KCZzb2FwLCBzdGRlcnIpOworICAgICAgICBleGl0KC0xKTsKKyAgICAgIH0gCisgICAgICBzb2FwX3NlcnZlKCZzb2FwKTsKKyAgICAgIHNvYXBfZW5kKCZzb2FwKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9IAorI2VuZGlmCisKK2ludCBuc19fYWRkKHN0cnVjdCBzb2FwICpzb2FwLCBkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSAqcmVzdWx0KQoreyAqcmVzdWx0ID0gYSArIGI7CisgIHJldHVybiBTT0FQX09LOworfSAKKworaW50IG5zX19zdWIoc3RydWN0IHNvYXAgKnNvYXAsIGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlICpyZXN1bHQpCit7ICpyZXN1bHQgPSBhIC0gYjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9IAorCitpbnQgbnNfX211bChzdHJ1Y3Qgc29hcCAqc29hcCwgZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgKnJlc3VsdCkKK3sgKnJlc3VsdCA9IGEgKiBiOworICByZXR1cm4gU09BUF9PSzsKK30gCisKK2ludCBuc19fZGl2KHN0cnVjdCBzb2FwICpzb2FwLCBkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSAqcmVzdWx0KQoreyBpZiAoYikKKyAgICAqcmVzdWx0ID0gYSAvIGI7CisgIGVsc2UKKyAgeyBjaGFyICpzID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIDEwMjQpOworICAgIHNwcmludGYocywgIjxlcnJvciB4bWxucz1cImh0dHA6Ly90ZW1wdXJpLm9yZy9cIj5DYW4ndCBkaXZpZGUgJWYgYnkgJWY8L2Vycm9yPiIsIGEsIGIpOworICAgIHJldHVybiBzb2FwX3NlbmRlcl9mYXVsdChzb2FwLCAiRGl2aXNpb24gYnkgemVybyIsIHMpOworICB9CisgIHJldHVybiBTT0FQX09LOworfSAKKworaW50IG5zX19wb3coc3RydWN0IHNvYXAgKnNvYXAsIGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlICpyZXN1bHQpCit7ICpyZXN1bHQgPSBwb3coYSwgYik7CisgIGlmIChzb2FwX2Vycm5vID09IEVET00pCS8qIHNvYXBfZXJybm8gaXMgbGlrZSBlcnJubywgYnV0IGNvbXBhdGlibGUgd2l0aCBXaW4zMiAqLworICB7IGNoYXIgKnMgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgMTAyNCk7CisgICAgc3ByaW50ZihzLCAiQ2FuJ3QgdGFrZSB0aGUgcG93ZXIgb2YgJWYgdG8gJWYiLCBhLCBiKTsKKyAgICBzcHJpbnRmKHMsICI8ZXJyb3IgeG1sbnM9XCJodHRwOi8vdGVtcHVyaS5vcmcvXCI+Q2FuJ3QgdGFrZSBwb3dlciBvZiAlZiB0byAlZjwvZXJyb3I+IiwgYSwgYik7CisgICAgcmV0dXJuIHNvYXBfc2VuZGVyX2ZhdWx0KHNvYXAsICJQb3dlciBmdW5jdGlvbiBkb21haW4gZXJyb3IiLCBzKTsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30gCmRpZmYgLS1naXQgYS9zYW1wbGVzL2NhbGNfVkNfTk9IVFRQL2NhbGNzZXJ2ZXIudmNwcm9qIGIvc2FtcGxlcy9jYWxjX1ZDX05PSFRUUC9jYWxjc2VydmVyLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzE0YzZjCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9jYWxjX1ZDX05PSFRUUC9jYWxjc2VydmVyLnZjcHJvagpAQCAtMCwwICsxLDMxMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjguMDAiDQorCU5hbWU9ImNhbGNzZXJ2ZXIiDQorCVByb2plY3RHVUlEPSJ7MTI0NTBCNTktQkRDQy00MUYwLUFCREQtNEM3NTE3QkU2OTBEfSINCisJUm9vdE5hbWVzcGFjZT0iY2FsY3NlcnZlciINCisJS2V5d29yZD0iV2luMzJQcm9qIg0KKwk+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiINCisJCS8+DQorCTwvUGxhdGZvcm1zPg0KKwk8VG9vbEZpbGVzPg0KKwk8L1Rvb2xGaWxlcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cRGVidWciDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXERlYnVnIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNjAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIuXERlYnVnL2NhbGNzZXJ2ZXIudGxiIg0KKwkJCQlIZWFkZXJGaWxlTmFtZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJIA0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dJTk5UPTB4MDUwMTtXSU5WRVI9MHgwNTAxO19XSU4zMl9JRT0weDA2MDM7V0lOMzI7X0RFQlVHO19DT05TT0xFO1dJVEhfTk9IVFRQIg0KKwkJCQkgDQorCQkJCSANCisJCQkJIA0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cRGVidWcvY2FsY3NlcnZlci5wY2giDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlxEZWJ1Zy8iDQorCQkJCU9iamVjdEZpbGU9Ii5cRGVidWcvIg0KKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlxEZWJ1Zy8iDQorCQkJCSANCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQkgDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0lOTlQ9MHgwNTAxO1dJTlZFUj0weDA1MDE7X1dJTjMyX0lFPTB4MDYwMztfREVCVUciDQorCQkJCUN1bHR1cmU9IjEwMzMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Im9kYmMzMi5saWIgb2RiY2NwMzIubGliIHdzb2NrMzIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuXERlYnVnL2NhbGNzZXJ2ZXIuZXhlIg0KKwkJCQkgDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cRGVidWcvY2FsY3NlcnZlci5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlPdXRwdXRGaWxlPSIuXERlYnVnL2NhbGNzZXJ2ZXIuYnNjIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxSZWxlYXNlIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxSZWxlYXNlIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNjAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIuXFJlbGVhc2UvY2FsY3NlcnZlci50bGIiDQorCQkJCUhlYWRlckZpbGVOYW1lPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkgDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dJTk5UPTB4MDUwMTtXSU5WRVI9MHgwNTAxO19XSU4zMl9JRT0weDA2MDM7V0lOMzI7TkRFQlVHO19DT05TT0xFIg0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQkgDQorCQkJCSANCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXFJlbGVhc2UvY2FsY3NlcnZlci5wY2giDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlxSZWxlYXNlLyINCisJCQkJT2JqZWN0RmlsZT0iLlxSZWxlYXNlLyINCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cUmVsZWFzZS8iDQorCQkJCSANCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dJTk5UPTB4MDUwMTtXSU5WRVI9MHgwNTAxO19XSU4zMl9JRT0weDA2MDM7TkRFQlVHIg0KKwkJCQlDdWx0dXJlPSIxMDMzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlPdXRwdXRGaWxlPSIuXFJlbGVhc2UvY2FsY3NlcnZlci5leGUiDQorCQkJCSANCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXFJlbGVhc2UvY2FsY3NlcnZlci5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlPdXRwdXRGaWxlPSIuXFJlbGVhc2UvY2FsY3NlcnZlci5ic2MiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCTwvQ29uZmlndXJhdGlvbnM+DQorCTxSZWZlcmVuY2VzPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0Ig0KKwkJCT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cY2FsY3NlcnZlci5jcHAiDQorCQkJCT4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlPYmplY3RGaWxlPSIkKEludERpcilcJChJbnB1dE5hbWUpMS5vYmoiDQorCQkJCQkJWE1MRG9jdW1lbnRhdGlvbkZpbGVOYW1lPSIkKEludERpcilcJChJbnB1dE5hbWUpMS54ZGMiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJT2JqZWN0RmlsZT0iJChJbnREaXIpXCQoSW5wdXROYW1lKTEub2JqIg0KKwkJCQkJCVhNTERvY3VtZW50YXRpb25GaWxlTmFtZT0iJChJbnREaXIpXCQoSW5wdXROYW1lKTEueGRjIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSJzb2FwQy5jcHAiDQorCQkJCT4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dJTk5UPTB4MDUwMTtXSU5WRVI9MHgwNTAxO19XSU4zMl9JRT0weDA2MDM7Ig0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0lOTlQ9MHgwNTAxO1dJTlZFUj0weDA1MDE7X1dJTjMyX0lFPTB4MDYwMzsiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cc29hcFNlcnZlci5jcHAiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSJzdGRzb2FwMi5jcHAiDQorCQkJCT4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dJTk5UPTB4MDUwMTtXSU5WRVI9MHgwNTAxO19XSU4zMl9JRT0weDA2MDM7Ig0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0lOTlQ9MHgwNTAxO1dJTlZFUj0weDA1MDE7X1dJTjMyX0lFPTB4MDYwMzsiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IkhlYWRlciBGaWxlcyINCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmwiDQorCQkJPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iY2FsYy5oIg0KKwkJCQk+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCQkJCURlc2NyaXB0aW9uPSJnU09BUCBXZWIgc2VydmljZSBwcm94eS9za2VsZXRvbiBidWlsZCBvbiAkKElucHV0UGF0aCkiDQorCQkJCQkJQ29tbWFuZExpbmU9Ii5cc29hcGNwcDIuZXhlICZxdW90OyQoSW5wdXRQYXRoKSZxdW90OyYjeDBEOyYjeDBBOyINCisJCQkJCQlPdXRwdXRzPSJzb2FwU3R1Yi5oIHNvYXBILmggc29hcEMuY3BwIHNvYXBDbGllbnQuY3BwIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSJzb2FwSC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0ic29hcFN0dWIuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9InN0ZHNvYXAyLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJSZXNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9ImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZSINCisJCQk+DQorCQk8L0ZpbHRlcj4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9jYWxjX1ZDX05PSFRUUC9zb2FwY3BwMi5leGUgYi9zYW1wbGVzL2NhbGNfVkNfTk9IVFRQL3NvYXBjcHAyLmV4ZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mZWE5NWJhCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9jYWxjX1ZDX05PSFRUUC9zb2FwY3BwMi5leGUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9jYWxjX1ZDX05PSFRUUC9zdGRzb2FwMi5jcHAgYi9zYW1wbGVzL2NhbGNfVkNfTk9IVFRQL3N0ZHNvYXAyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmVkNDYwCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9jYWxjX1ZDX05PSFRUUC9zdGRzb2FwMi5jcHAKQEAgLTAsMCArMSwxMzQ0OCBAQAorLyoKKworc3Rkc29hcDIuY1twcF0gMi43LjZlCisKK2dTT0FQIHJ1bnRpbWUKKworZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlczoKK0dQTCwgdGhlIGdTT0FQIHB1YmxpYyBsaWNlbnNlLCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ29udHJpYnV0b3JzOgorCitXaW5kIFJpdmVyIFN5c3RlbXMgSW5jLiwgZm9yIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25zIHVuZGVyIGdTT0FQIHB1YmxpYyBsaWNlbnNlOgorICAtIHZ4V29ya3MgY29tcGF0aWJsZQkoI2RlZmluZSBWWFdPUktTKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIHB1YmxpYyBsaWNlbnNlLgorCitUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBnU09BUCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMworKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCitMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK2h0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9zb2FwbGljZW5zZS5odG1sCitTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAorV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCitmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLgorQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSW5zdGFsbGF0aW9uIG5vdGU6CisKK1dpbjMyIGJ1aWxkIG5lZWRzIHdpbnNvY2suZGxsIChWaXN1YWwgQysrICJ3c29jazMyLmxpYiIpCitUbyBkbyB0aGlzIGluIFZpc3VhbCBDKysgNi4wLCBnbyB0byAiUHJvamVjdCIsICJzZXR0aW5ncyIsIHNlbGVjdCB0aGUgIkxpbmsiCit0YWIgKHRoZSBwcm9qZWN0IGZpbGUgbmVlZHMgdG8gYmUgc2VsZWN0ZWQgaW4gdGhlIGZpbGUgdmlldykgYW5kIGFkZAorIndzb2NrMzIubGliIiB0byB0aGUgIk9iamVjdC9saWJyYXJ5IG1vZHVsZXMiIGVudHJ5CisKK09uIE1hYyBPUyBYIHdpdGggZ2NjIChHQ0MpIDMuMSAyMDAyMDQyMCAocHJlcmVsZWFzZSkgeW91IE1VU1QgY29tcGlsZSB3aXRoCistZnN0YWNrX2NoZWNrIHdoZW4gdXNpbmcgLU8yIGJlY2F1c2UgZ2NjIDMuMSBoYXMgYSBidWcgdGhhdCBzbWFzaGVzIHRoZSBzdGFjaword2hlbiBsb2NhbGx5IGFsbG9jYXRlZCBkYXRhIGV4Y2VlZHMgNjRLLgorCisqLworCisjaWZkZWYgQVM0MDAKKyMgcHJhZ21hIGNvbnZlcnQoODE5KQkvKiBFQkNESUMgdG8gQVNDSUkgKi8KKyNlbmRpZgorCisjaW5jbHVkZSAic3Rkc29hcDIuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitTT0FQX1NPVVJDRV9TVEFNUCgiQCgjKSBzdGRzb2FwMi5jcHAgdmVyIDIuNy42ZSAyMDA2LTAyLTE4IDEyOjAwOjAwIEdNVCIpCitleHRlcm4gIkMiIHsKKyNlbHNlCitTT0FQX1NPVVJDRV9TVEFNUCgiQCgjKSBzdGRzb2FwMi5jIHZlciAyLjcuNmUgMjAwNi0wMi0xOCAxMjowMDowMCBHTVQiKQorI2VuZGlmCisKKy8qIDhiaXQgY2hhcmFjdGVyIHJlcHJlc2VudGluZyB1bmtub3duL25vbnJlcHJlc2VudGFibGUgY2hhcmFjdGVyIGRhdGEgKGUuZy4gbm90IHN1cHBvcnRlZCBieSBjdXJyZW50IGxvY2FsZSB3aXRoIG11bHRpYnl0ZSBzdXBwb3J0IGVuYWJsZWQpICovCisjaWZuZGVmIFNPQVBfVU5LTk9XTl9DSEFSCisjZGVmaW5lIFNPQVBfVU5LTk9XTl9DSEFSICgxMjcpCisjZW5kaWYKKworLyogICAgICBFT0Y9LTEgKi8KKyNkZWZpbmUgU09BUF9MVCAoc29hcF93Y2hhcikoLTIpIC8qIFhNTCBjaGFyYWN0ZXIgJzwnICovCisjZGVmaW5lIFNPQVBfVFQgKHNvYXBfd2NoYXIpKC0zKSAvKiBYTUwgY2hhcmFjdGVyICc8LycgKi8KKyNkZWZpbmUgU09BUF9HVCAoc29hcF93Y2hhcikoLTQpIC8qIFhNTCBjaGFyYWN0ZXIgJz4nICovCisjZGVmaW5lIFNPQVBfUVQgKHNvYXBfd2NoYXIpKC01KSAvKiBYTUwgY2hhcmFjdGVyICciJyAqLworI2RlZmluZSBTT0FQX0FQIChzb2FwX3djaGFyKSgtNikgLyogWE1MIGNoYXJhY3RlciAnJycgKi8KKworI2RlZmluZSBzb2FwX2JsYW5rKGMpCQkoKGMpID49IDAgJiYgKGMpIDw9IDMyKQorI2RlZmluZSBzb2FwX25vdGJsYW5rKGMpCSgoYykgPiAzMikKKyNkZWZpbmUgc29hcF9oYXNoX3B0cihwKQkoKCh1bnNpZ25lZCBsb25nKShwKSA+PiAzKSAmIChTT0FQX1BUUkhBU0ggLSAxKSkKKworI2lmZGVmIFNPQVBfREVCVUcKK3N0YXRpYyB2b2lkIHNvYXBfaW5pdF9sb2dzKHN0cnVjdCBzb2FwKik7CitzdGF0aWMgdm9pZCBzb2FwX2Nsb3NlX2xvZ2ZpbGUoc3RydWN0IHNvYXAqLCBpbnQpOworc3RhdGljIHZvaWQgc29hcF9zZXRfbG9nZmlsZShzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciopOworc3RhdGljIHZvaWQgc29hcF9mcmVlX21odChzdHJ1Y3Qgc29hcCopOworc3RhdGljIHZvaWQgc29hcF90cmFja191bmxpbmsoc3RydWN0IHNvYXAqLCBjb25zdCB2b2lkKik7CisjZW5kaWYKKworI2lmbmRlZiBQQUxNXzIKK3N0YXRpYyBpbnQgc29hcF9zZXRfZXJyb3Ioc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgaW50KTsKK3N0YXRpYyBpbnQgc29hcF9jb3B5X2ZhdWx0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworc3RhdGljIGludCBzb2FwX2dldGF0dHJ2YWwoc3RydWN0IHNvYXAqLCBjaGFyKiwgc2l6ZV90LCBzb2FwX3djaGFyKTsKKyNlbmRpZgorCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHNvYXBfd2NoYXIgc29hcF9jaGFyKHN0cnVjdCBzb2FwKik7CitzdGF0aWMgc29hcF93Y2hhciBzb2FwX2dldF9waShzdHJ1Y3Qgc29hcCopOworc3RhdGljIGludCBzb2FwX2lzeGRpZ2l0KGludCk7CitzdGF0aWMgdm9pZCAqZnBsdWdpbihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCitzdGF0aWMgdm9pZCBzb2FwX3VwZGF0ZV9wdHJzKHN0cnVjdCBzb2FwKiwgY2hhciosIGNoYXIqLCBjaGFyKiwgY2hhciopOworc3RhdGljIGludCBzb2FwX2hhc19jb3BpZXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworc3RhdGljIHZvaWQgc29hcF9pbml0X2lodChzdHJ1Y3Qgc29hcCopOworc3RhdGljIHZvaWQgc29hcF9mcmVlX2lodChzdHJ1Y3Qgc29hcCopOworc3RhdGljIHZvaWQgc29hcF9pbml0X3BodChzdHJ1Y3Qgc29hcCopOworc3RhdGljIHZvaWQgc29hcF9mcmVlX3BodChzdHJ1Y3Qgc29hcCopOworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBjb25zdCBjaGFyICpzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyBpbnQgc29hcF9pc251bWVyaWMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKik7CitzdGF0aWMgdGltZV90IHNvYXBfdGltZWdtKHN0cnVjdCB0bSopOworc3RhdGljIHN0cnVjdCBzb2FwX25saXN0ICpzb2FwX2xvb2t1cF9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzaXplX3Qgbik7CitzdGF0aWMgc3RydWN0IHNvYXBfbmxpc3QgKnNvYXBfcHVzaF9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKm5zLCBzaG9ydCB1dGlsaXplZCk7CitzdGF0aWMgdm9pZCBzb2FwX3BvcF9ucyhzdHJ1Y3Qgc29hcCAqc29hcCk7CitzdGF0aWMgdm9pZCBzb2FwX3V0aWxpemVfbnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc2l6ZV90IG4pOworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpzb2FwX25ld19tdWx0aXBhcnQoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKiwgc3RydWN0IHNvYXBfbXVsdGlwYXJ0KiosIGNoYXIqLCBzaXplX3QpOworc3RhdGljIGludCBzb2FwX3B1dGRpbWVmaWVsZChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworc3RhdGljIGNoYXIgKnNvYXBfZ2V0ZGltZWZpZWxkKHN0cnVjdCBzb2FwKiwgc2l6ZV90KTsKK3N0YXRpYyB2b2lkIHNvYXBfc2VsZWN0X21pbWVfYm91bmRhcnkoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBpbnQgc29hcF92YWxpZF9taW1lX2JvdW5kYXJ5KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgaW50IHNvYXBfbWF0Y2hfY2lkKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyB2b2lkIHNvYXBfcmVzb2x2ZV9hdHRhY2htZW50KHN0cnVjdCBzb2FwKiwgc3RydWN0IHNvYXBfbXVsdGlwYXJ0Kik7CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgV0lUSF9HWklQCitzdGF0aWMgaW50IHNvYXBfZ2V0Z3ppcGhkcihzdHJ1Y3Qgc29hcCopOworI2VuZGlmCisKKyNpZmRlZiBXSVRIX09QRU5TU0wKK3N0YXRpYyBpbnQgc3NsX2luaXRfZG9uZSA9IDA7CitzdGF0aWMgaW50IHNzbF9hdXRoX2luaXQoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBpbnQgc3NsX3ZlcmlmeV9jYWxsYmFjayhpbnQsIFg1MDlfU1RPUkVfQ1RYKik7CitzdGF0aWMgaW50IHNzbF9wYXNzd29yZChjaGFyKiwgaW50LCBpbnQsIHZvaWQgKik7CitzdGF0aWMgY29uc3QgY2hhciAqc3NsX2Vycm9yKHN0cnVjdCBzb2FwKiwgaW50KTsKKy8qIFRoaXMgY2FsbGJhY2sgaXMgaW5jbHVkZWQgZm9yIGZ1dHVyZSByZWZlcmVuY2VzLiBJdCBzaG91bGQgbm90IGJlIGRlbGV0ZWQKK3N0YXRpYyBESCAqc3NsX3RtcF9kaChTU0wqLCBpbnQsIGludCk7CisqLworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChXSVRIX05PSFRUUCkgfHwgIWRlZmluZWQoV0lUSF9MRUFORVIpCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNvbnN0IGNoYXIgKnNvYXBfZGVjb2RlKGNoYXIqLCBzaXplX3QsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHNvYXBfd2NoYXIgc29hcF9nZXRjaHVua2NoYXIoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBjb25zdCBjaGFyICpodHRwX2Vycm9yKHN0cnVjdCBzb2FwKiwgaW50KTsKK3N0YXRpYyBpbnQgaHR0cF9wb3N0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90KTsKK3N0YXRpYyBpbnQgaHR0cF9nZXQoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBpbnQgaHR0cF9zZW5kX2hlYWRlcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyBpbnQgaHR0cF9wb3N0X2hlYWRlcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitzdGF0aWMgaW50IGh0dHBfcmVzcG9uc2Uoc3RydWN0IHNvYXAqLCBpbnQsIHNpemVfdCk7CitzdGF0aWMgaW50IGh0dHBfcGFyc2Uoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBpbnQgaHR0cF9wYXJzZV9oZWFkZXIoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50IGZzZW5kKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHNpemVfdCk7CitzdGF0aWMgc2l6ZV90IGZyZWN2KHN0cnVjdCBzb2FwKiwgY2hhciosIHNpemVfdCk7CitzdGF0aWMgaW50IHRjcF9pbml0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgY29uc3QgY2hhciAqdGNwX2Vycm9yKHN0cnVjdCBzb2FwKik7CisjaWZuZGVmIFdJVEhfSVBWNgorc3RhdGljIGludCB0Y3BfZ2V0aG9zdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKmFkZHIsIHN0cnVjdCBpbl9hZGRyICppbmFkZHIpOworI2VuZGlmCitzdGF0aWMgaW50IHRjcF9jb25uZWN0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqZW5kcG9pbnQsIGNvbnN0IGNoYXIgKmhvc3QsIGludCBwb3J0KTsKK3N0YXRpYyBpbnQgdGNwX2FjY2VwdChzdHJ1Y3Qgc29hcCosIGludCwgc3RydWN0IHNvY2thZGRyKiwgaW50Kik7CitzdGF0aWMgaW50IHRjcF9kaXNjb25uZWN0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgaW50IHRjcF9jbG9zZXNvY2tldChzdHJ1Y3Qgc29hcCosIFNPQVBfU09DS0VUKTsKK3N0YXRpYyBpbnQgdGNwX3NodXRkb3duc29ja2V0KHN0cnVjdCBzb2FwKiwgU09BUF9TT0NLRVQsIGludCk7CitzdGF0aWMgY29uc3QgY2hhciAqc29hcF9zdHJlcnJvcihzdHJ1Y3Qgc29hcCopOworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoUEFMTSkgJiYgIWRlZmluZWQoUEFMTV8yKQordW5zaWduZWQgc2hvcnQgZXJybm87CisjZW5kaWYKKworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfZW52MVs0Ml0gPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iOworc3RhdGljIGNvbnN0IGNoYXIgc29hcF9lbmMxWzQyXSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI7CitzdGF0aWMgY29uc3QgY2hhciBzb2FwX2VudjJbNDBdID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI7CitzdGF0aWMgY29uc3QgY2hhciBzb2FwX2VuYzJbNDBdID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbmNvZGluZyI7CitzdGF0aWMgY29uc3QgY2hhciBzb2FwX3JwY1szNV0gPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLXJwYyI7CisjZW5kaWYKKworI2lmbmRlZiBQQUxNXzEKK2NvbnN0IHN0cnVjdCBzb2FwX2RvdWJsZV9uYW4gc29hcF9kb3VibGVfbmFuID0gezB4RkZGRkZGRkYsIDB4RkZGRkZGRkZ9Oworc3RhdGljIGNvbnN0IGNoYXIgc29hcF9iYXNlNjRvWzY1XSA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfYmFzZTY0aVs4MV0gPSAiXDc2WFhYXDc3XDY0XDY1XDY2XDY3XDcwXDcxXDcyXDczXDc0XDc1WFhYWFhYWFwwMFwwMVwwMlwwM1wwNFwwNVwwNlwwN1wxMFwxMVwxMlwxM1wxNFwxNVwxNlwxN1wyMFwyMVwyMlwyM1wyNFwyNVwyNlwyN1wzMFwzMVhYWFhYWFwzMlwzM1wzNFwzNVwzNlwzN1w0MFw0MVw0Mlw0M1w0NFw0NVw0Nlw0N1w1MFw1MVw1Mlw1M1w1NFw1NVw1Nlw1N1w2MFw2MVw2Mlw2MyI7CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfaW5kZW50WzExXSA9ICJcblx0XHRcdFx0XHRcdFx0XHRcdCI7CisvKiBBbHRlcm5hdGl2ZSBpbmRlbnRhdGlvbiBmb3JtIGZvciBTT0FQX1hNTF9JTkRFTlQ6CitzdGF0aWMgY29uc3QgY2hhciBzb2FwX2luZGVudFsyMV0gPSAiXG4gICAgICAgICAgICAgICAgICAgIjsKKyovCisjZW5kaWYKKworc3RhdGljIGNvbnN0IGNoYXIgc29hcF9wYWRkaW5nWzRdID0gIlwwXDBcMCI7CisjZGVmaW5lIFNPQVBfU1RSX1BBRERJTkcgKHNvYXBfcGFkZGluZykKKyNkZWZpbmUgU09BUF9TVFJfRU9TIChzb2FwX3BhZGRpbmcpCisjZGVmaW5lIFNPQVBfTk9OX05VTEwgKHNvYXBfcGFkZGluZykKKworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCBodG1sX2VudGl0eV9jb2Rlc1tdID0gLyogZW50aXRpZXMgZm9yIFhIVE1MIHBhcnNpbmcgKi8KK3sgeyAxNjAsICJuYnNwIiB9LAorICB7IDE2MSwgImlleGNsIiB9LAorICB7IDE2MiwgImNlbnQiIH0sCisgIHsgMTYzLCAicG91bmQiIH0sCisgIHsgMTY0LCAiY3VycmVuIiB9LAorICB7IDE2NSwgInllbiIgfSwKKyAgeyAxNjYsICJicnZiYXIiIH0sCisgIHsgMTY3LCAic2VjdCIgfSwKKyAgeyAxNjgsICJ1bWwiIH0sCisgIHsgMTY5LCAiY29weSIgfSwKKyAgeyAxNzAsICJvcmRmIiB9LAorICB7IDE3MSwgImxhcXVvIiB9LAorICB7IDE3MiwgIm5vdCIgfSwKKyAgeyAxNzMsICJzaHkiIH0sCisgIHsgMTc0LCAicmVnIiB9LAorICB7IDE3NSwgIm1hY3IiIH0sCisgIHsgMTc2LCAiZGVnIiB9LAorICB7IDE3NywgInBsdXNtbiIgfSwKKyAgeyAxNzgsICJzdXAyIiB9LAorICB7IDE3OSwgInN1cDMiIH0sCisgIHsgMTgwLCAiYWN1dGUiIH0sCisgIHsgMTgxLCAibWljcm8iIH0sCisgIHsgMTgyLCAicGFyYSIgfSwKKyAgeyAxODMsICJtaWRkb3QiIH0sCisgIHsgMTg0LCAiY2VkaWwiIH0sCisgIHsgMTg1LCAic3VwMSIgfSwKKyAgeyAxODYsICJvcmRtIiB9LAorICB7IDE4NywgInJhcXVvIiB9LAorICB7IDE4OCwgImZyYWMxNCIgfSwKKyAgeyAxODksICJmcmFjMTIiIH0sCisgIHsgMTkwLCAiZnJhYzM0IiB9LAorICB7IDE5MSwgImlxdWVzdCIgfSwKKyAgeyAxOTIsICJBZ3JhdmUiIH0sCisgIHsgMTkzLCAiQWFjdXRlIiB9LAorICB7IDE5NCwgIkFjaXJjIiB9LAorICB7IDE5NSwgIkF0aWxkZSIgfSwKKyAgeyAxOTYsICJBdW1sIiB9LAorICB7IDE5NywgIkFyaW5nIiB9LAorICB7IDE5OCwgIkFFbGlnIiB9LAorICB7IDE5OSwgIkNjZWRpbCIgfSwKKyAgeyAyMDAsICJFZ3JhdmUiIH0sCisgIHsgMjAxLCAiRWFjdXRlIiB9LAorICB7IDIwMiwgIkVjaXJjIiB9LAorICB7IDIwMywgIkV1bWwiIH0sCisgIHsgMjA0LCAiSWdyYXZlIiB9LAorICB7IDIwNSwgIklhY3V0ZSIgfSwKKyAgeyAyMDYsICJJY2lyYyIgfSwKKyAgeyAyMDcsICJJdW1sIiB9LAorICB7IDIwOCwgIkVUSCIgfSwKKyAgeyAyMDksICJOdGlsZGUiIH0sCisgIHsgMjEwLCAiT2dyYXZlIiB9LAorICB7IDIxMSwgIk9hY3V0ZSIgfSwKKyAgeyAyMTIsICJPY2lyYyIgfSwKKyAgeyAyMTMsICJPdGlsZGUiIH0sCisgIHsgMjE0LCAiT3VtbCIgfSwKKyAgeyAyMTUsICJ0aW1lcyIgfSwKKyAgeyAyMTYsICJPc2xhc2giIH0sCisgIHsgMjE3LCAiVWdyYXZlIiB9LAorICB7IDIxOCwgIlVhY3V0ZSIgfSwKKyAgeyAyMTksICJVY2lyYyIgfSwKKyAgeyAyMjAsICJVdW1sIiB9LAorICB7IDIyMSwgIllhY3V0ZSIgfSwKKyAgeyAyMjIsICJUSE9STiIgfSwKKyAgeyAyMjMsICJzemxpZyIgfSwKKyAgeyAyMjQsICJhZ3JhdmUiIH0sCisgIHsgMjI1LCAiYWFjdXRlIiB9LAorICB7IDIyNiwgImFjaXJjIiB9LAorICB7IDIyNywgImF0aWxkZSIgfSwKKyAgeyAyMjgsICJhdW1sIiB9LAorICB7IDIyOSwgImFyaW5nIiB9LAorICB7IDIzMCwgImFlbGlnIiB9LAorICB7IDIzMSwgImNjZWRpbCIgfSwKKyAgeyAyMzIsICJlZ3JhdmUiIH0sCisgIHsgMjMzLCAiZWFjdXRlIiB9LAorICB7IDIzNCwgImVjaXJjIiB9LAorICB7IDIzNSwgImV1bWwiIH0sCisgIHsgMjM2LCAiaWdyYXZlIiB9LAorICB7IDIzNywgImlhY3V0ZSIgfSwKKyAgeyAyMzgsICJpY2lyYyIgfSwKKyAgeyAyMzksICJpdW1sIiB9LAorICB7IDI0MCwgImV0aCIgfSwKKyAgeyAyNDEsICJudGlsZGUiIH0sCisgIHsgMjQyLCAib2dyYXZlIiB9LAorICB7IDI0MywgIm9hY3V0ZSIgfSwKKyAgeyAyNDQsICJvY2lyYyIgfSwKKyAgeyAyNDUsICJvdGlsZGUiIH0sCisgIHsgMjQ2LCAib3VtbCIgfSwKKyAgeyAyNDcsICJkaXZpZGUiIH0sCisgIHsgMjQ4LCAib3NsYXNoIiB9LAorICB7IDI0OSwgInVncmF2ZSIgfSwKKyAgeyAyNTAsICJ1YWN1dGUiIH0sCisgIHsgMjUxLCAidWNpcmMiIH0sCisgIHsgMjUyLCAidXVtbCIgfSwKKyAgeyAyNTMsICJ5YWN1dGUiIH0sCisgIHsgMjU0LCAidGhvcm4iIH0sCisgIHsgMjU1LCAieXVtbCIgfSwKKyAgeyAgIDAsIE5VTEwgfQorfTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCBoX2Vycm9yX2NvZGVzW10gPQoreworI2lmZGVmIEhPU1RfTk9UX0ZPVU5EICAgCisgIHsgSE9TVF9OT1RfRk9VTkQsICJIb3N0IG5vdCBmb3VuZCIgfSwKKyNlbmRpZgorI2lmZGVmIFRSWV9BR0FJTgorICB7IFRSWV9BR0FJTiwgIlRyeSBBZ2FpbiIgfSwKKyNlbmRpZgorI2lmZGVmIE5PX1JFQ09WRVJZICAKKyAgeyBOT19SRUNPVkVSWSwgIk5vIFJlY292ZXJ5IiB9LAorI2VuZGlmCisjaWZkZWYgTk9fREFUQQorICB7IE5PX0RBVEEsICJObyBEYXRhIiB9LAorI2VuZGlmCisjaWZkZWYgTk9fQUREUkVTUworICB7IE5PX0FERFJFU1MsICJObyBBZGRyZXNzIiB9LAorI2VuZGlmCisgIHsgMCwgTlVMTCB9Cit9OworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCBoX2h0dHBfZXJyb3JfY29kZXNbXSA9Cit7IHsgMjAxLCAiQ3JlYXRlZCIgfSwKKyAgeyAyMDIsICJBY2NlcHRlZCIgfSwKKyAgeyAyMDMsICJOb24tQXV0aG9yaXRhdGl2ZSBJbmZvcm1hdGlvbiIgfSwKKyAgeyAyMDQsICJObyBDb250ZW50IiB9LAorICB7IDIwNSwgIlJlc2V0IENvbnRlbnQiIH0sCisgIHsgMjA2LCAiUGFydGlhbCBDb250ZW50IiB9LAorICB7IDMwMCwgIk11bHRpcGxlIENob2ljZXMiIH0sCisgIHsgMzAxLCAiTW92ZWQgUGVybWFuZW50bHkiIH0sCisgIHsgMzAyLCAiRm91bmQiIH0sCisgIHsgMzAzLCAiU2VlIE90aGVyIiB9LAorICB7IDMwNCwgIk5vdCBNb2RpZmllZCIgfSwKKyAgeyAzMDUsICJVc2UgUHJveHkiIH0sCisgIHsgMzA3LCAiVGVtcG9yYXJ5IFJlZGlyZWN0IiB9LAorICB7IDQwMCwgIkJhZCBSZXF1ZXN0IiB9LAorICB7IDQwMSwgIlVuYXV0aG9yaXplZCIgfSwKKyAgeyA0MDIsICJQYXltZW50IFJlcXVpcmVkIiB9LAorICB7IDQwMywgIkZvcmJpZGRlbiIgfSwKKyAgeyA0MDQsICJOb3QgRm91bmQiIH0sCisgIHsgNDA1LCAiTWV0aG9kIE5vdCBBbGxvd2VkIiB9LAorICB7IDQwNiwgIk5vdCBBY2NlcHRhYmxlIiB9LAorICB7IDQwNywgIlByb3h5IEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkIiB9LAorICB7IDQwOCwgIlJlcXVlc3QgVGltZS1vdXQiIH0sCisgIHsgNDA5LCAiQ29uZmxpY3QiIH0sCisgIHsgNDEwLCAiR29uZSIgfSwKKyAgeyA0MTEsICJMZW5ndGggUmVxdWlyZWQiIH0sCisgIHsgNDEyLCAiUHJlY29uZGl0aW9uIEZhaWxlZCIgfSwKKyAgeyA0MTMsICJSZXF1ZXN0IEVudGl0eSBUb28gTGFyZ2UiIH0sCisgIHsgNDE0LCAiUmVxdWVzdC1VUkkgVG9vIExhcmdlIiB9LAorICB7IDQxNSwgIlVuc3VwcG9ydGVkIE1lZGlhIFR5cGUiIH0sCisgIHsgNDE2LCAiUmVxdWVzdGVkIHJhbmdlIG5vdCBzYXRpc2ZpYWJsZSIgfSwKKyAgeyA0MTcsICJFeHBlY3RhdGlvbiBGYWlsZWQiIH0sCisgIHsgNTAwLCAiSW50ZXJuYWwgU2VydmVyIEVycm9yIiB9LAorICB7IDUwMSwgIk5vdCBJbXBsZW1lbnRlZCIgfSwKKyAgeyA1MDIsICJCYWQgR2F0ZXdheSIgfSwKKyAgeyA1MDMsICJTZXJ2aWNlIFVuYXZhaWxhYmxlIiB9LAorICB7IDUwNCwgIkdhdGV3YXkgVGltZS1vdXQiIH0sCisgIHsgNTA1LCAiSFRUUCBWZXJzaW9uIG5vdCBzdXBwb3J0ZWQiIH0sCisgIHsgICAwLCBOVUxMIH0KK307CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgV0lUSF9PUEVOU1NMCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgaF9zc2xfZXJyb3JfY29kZXNbXSA9Cit7CisjZGVmaW5lIF9TU0xfRVJST1IoZSkgeyBlLCAjZSB9CisgIF9TU0xfRVJST1IoU1NMX0VSUk9SX1NTTCksCisgIF9TU0xfRVJST1IoU1NMX0VSUk9SX1pFUk9fUkVUVVJOKSwKKyAgX1NTTF9FUlJPUihTU0xfRVJST1JfV0FOVF9SRUFEKSwKKyAgX1NTTF9FUlJPUihTU0xfRVJST1JfV0FOVF9XUklURSksCisgIF9TU0xfRVJST1IoU1NMX0VSUk9SX1dBTlRfQ09OTkVDVCksCisgIF9TU0xfRVJST1IoU1NMX0VSUk9SX1dBTlRfWDUwOV9MT09LVVApLAorICBfU1NMX0VSUk9SKFNTTF9FUlJPUl9TWVNDQUxMKSwKKyAgeyAwLCBOVUxMIH0KK307CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU5FUgorc3RhdGljIGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwIG1pbWVfY29kZXNbXSA9Cit7IHsgU09BUF9NSU1FXzdCSVQsCQkiN2JpdCIgfSwKKyAgeyBTT0FQX01JTUVfOEJJVCwJCSI4Yml0IiB9LAorICB7IFNPQVBfTUlNRV9CSU5BUlksCQkiYmluYXJ5IiB9LAorICB7IFNPQVBfTUlNRV9RVU9URURfUFJJTlRBQkxFLCAicXVvdGVkLXByaW50YWJsZSIgfSwKKyAgeyBTT0FQX01JTUVfQkFTRTY0LAkJImJhc2U2NCIgfSwKKyAgeyBTT0FQX01JTUVfSUVURl9UT0tFTiwJImlldGYtdG9rZW4iIH0sCisgIHsgU09BUF9NSU1FX1hfVE9LRU4sCQkieC10b2tlbiIgfSwKKyAgeyAwLAkJCQlOVUxMIH0KK307CisjZW5kaWYKKworI2lmZGVmIFdJTjMyCitzdGF0aWMgaW50IHRjcF9kb25lID0gMDsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citmc2VuZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgc2l6ZV90IG4pCit7IHJlZ2lzdGVyIGludCBud3JpdHRlbjsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiAhZGVmaW5lZChXSVRIX0xFQU4pCisgIGlmIChzb2FwLT5vcykKKyAgeyBzb2FwLT5vcy0+d3JpdGUocywgbik7CisgICAgaWYgKHNvYXAtPm9zLT5nb29kKCkpCisgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICByZXR1cm4gU09BUF9FT0Y7CisgIH0KKyNlbmRpZgorICB3aGlsZSAobikKKyAgeyBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgICB7IAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIGlmIChzb2FwLT5zZW5kX3RpbWVvdXQpCisgICAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICAgIGZkX3NldCBmZDsKKyAgICAgICAgaWYgKHNvYXAtPnNlbmRfdGltZW91dCA+IDApCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSBzb2FwLT5zZW5kX3RpbWVvdXQ7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSAtc29hcC0+c2VuZF90aW1lb3V0LzEwMDAwMDA7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gLXNvYXAtPnNlbmRfdGltZW91dCUxMDAwMDAwOworICAgICAgICB9CisgICAgICAgIEZEX1pFUk8oJmZkKTsKKyAgICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZmZCk7CisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsgcmVnaXN0ZXIgaW50IHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgTlVMTCwgJmZkLCAmZmQsICZ0aW1lb3V0KTsKKyAgICAgICAgICBpZiAociA+IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBpZiAoIXIpCisgICAgICAgICAgeyBzb2FwLT5lcnJudW0gPSAwOworICAgICAgICAgICAgcmV0dXJuIFNPQVBfRU9GOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUiAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VBR0FJTikKKyAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgICAgcmV0dXJuIFNPQVBfRU9GOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisjaWZkZWYgV0lUSF9PUEVOU1NMCisgICAgICBpZiAoc29hcC0+c3NsKQorICAgICAgICBud3JpdHRlbiA9IFNTTF93cml0ZShzb2FwLT5zc2wsIHMsIG4pOworICAgICAgZWxzZSBpZiAoc29hcC0+YmlvKQorICAgICAgICBud3JpdHRlbiA9IEJJT193cml0ZShzb2FwLT5iaW8sIHMsIG4pOworICAgICAgZWxzZQorI2VuZGlmCisjaWZkZWYgV0lUSF9VRFAKKyAgICAgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgICB7IGlmIChzb2FwLT5wZWVybGVuKQorCSAgbndyaXR0ZW4gPSBzZW5kdG8oKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgcywgbiwgc29hcC0+c29ja2V0X2ZsYWdzLCAoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlciwgc29hcC0+cGVlcmxlbik7CisgICAgICAgIGVsc2UKKwkgIG53cml0dGVuID0gc2VuZCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MpOworCS8qIHJldHJ5IGFuZCBiYWNrLW9mZiBhbGdvcml0aG0gKi8KKwkvKiBUT0RPOiB0aGlzIGlzIG5vdCB2ZXJ5IGNsZWFyIGZyb20gc3BlY3Mgc28gdmVyaWZ5IGFuZCBsaW1pdCBjb25kaXRpb25zIHVuZGVyIHdoaWNoIHdlIHNob3VsZCBsb29wIChlLmcuIEVOT0JVRlMpICovCisJaWYgKG53cml0dGVuIDwgMCkKKyAgICAgICAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgICAgICAgIGZkX3NldCBmZDsKKwkgIGludCB1ZHBfcmVwZWF0OworCSAgaW50IHVkcF9kZWxheTsKKyAgICAgICAgICBpZiAoKHNvYXAtPmNvbm5lY3RfZmxhZ3MgJiBTT19CUk9BRENBU1QpKQorCSAgICB1ZHBfcmVwZWF0ID0gMzsgLyogU09BUC1vdmVyLVVEUCBNVUxUSUNBU1RfVURQX1JFUEVBVCAtIDEgKi8KKyAgICAgICAgICBlbHNlCisJICAgIHVkcF9yZXBlYXQgPSAxOyAvKiBTT0FQLW92ZXItVURQIFVOSUNBU1RfVURQX1JFUEVBVCAtIDEgKi8KKwkgIHVkcF9kZWxheSA9IChzb2FwX3JhbmRvbSAlIDIwMSkgKyA1MDsgLyogVURQX01JTl9ERUxBWSAuLiBVRFBfTUFYX0RFTEFZICovCisJICBkbworICAgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSAwOworICAgICAgICAgICAgdGltZW91dC50dl91c2VjID0gMTAwMCAqIHVkcF9kZWxheTsgLyogbXMgKi8KKyAgICAgICAgICAgIEZEX1pFUk8oJmZkKTsKKyAgICAgICAgICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmZmQpOworICAgICAgICAgICAgc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksIE5VTEwsIE5VTEwsICZmZCwgJnRpbWVvdXQpOworCSAgICBpZiAoc29hcC0+cGVlcmxlbikKKwkgICAgICBud3JpdHRlbiA9IHNlbmR0bygoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyLCBzb2FwLT5wZWVybGVuKTsKKyAgICAgICAgICAgIGVsc2UKKwkgICAgICBud3JpdHRlbiA9IHNlbmQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgcywgbiwgc29hcC0+c29ja2V0X2ZsYWdzKTsKKwkgICAgdWRwX2RlbGF5IDw8PSAxOworCSAgICBpZiAodWRwX2RlbGF5ID4gNTAwKSAvKiBVRFBfVVBQRVJfREVMQVkgKi8KKwkgICAgICB1ZHBfZGVsYXkgPSA1MDA7CisJICB9CisJICB3aGlsZSAobndyaXR0ZW4gPCAwICYmIC0tdWRwX3JlcGVhdCA+IDApOworCX0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyNlbmRpZgorI2lmICFkZWZpbmVkKFBBTE0pICYmICFkZWZpbmVkKEFTNDAwKQorICAgICAgICBud3JpdHRlbiA9IHNlbmQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgcywgbiwgc29hcC0+c29ja2V0X2ZsYWdzKTsKKyNlbHNlCisgICAgICAgIG53cml0dGVuID0gc2VuZCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAodm9pZCopcywgbiwgc29hcC0+c29ja2V0X2ZsYWdzKTsKKyNlbmRpZgorICAgICAgaWYgKG53cml0dGVuIDw9IDApCisgICAgICB7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisJaW50IGVycjsKKyAgICAgICAgaWYgKHNvYXAtPnNzbCAmJiAoZXJyID0gU1NMX2dldF9lcnJvcihzb2FwLT5zc2wsIG53cml0dGVuKSkgIT0gU1NMX0VSUk9SX05PTkUgJiYgZXJyICE9IFNTTF9FUlJPUl9XQU5UX1JFQUQgJiYgZXJyICE9IFNTTF9FUlJPUl9XQU5UX1dSSVRFKQorICAgICAgICAgIHJldHVybiBTT0FQX0VPRjsKKyNlbmRpZgorICAgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUiAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VXT1VMREJMT0NLICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUFHQUlOKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgIHJldHVybiBTT0FQX0VPRjsKKyAgICAgICAgfQorICAgICAgICBud3JpdHRlbiA9IDA7IC8qIGFuZCBjYWxsIHdyaXRlKCkgYWdhaW4gKi8KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyNpZmRlZiBXSVRIX0ZBU1RDR0kKKyAgICAgIG53cml0dGVuID0gZndyaXRlKCh2b2lkKilzLCAxLCBuLCBzdGRvdXQpOworICAgICAgZmZsdXNoKHN0ZG91dCk7CisjZWxzZQorI2lmZGVmIFVOREVSX0NFCisgICAgICBud3JpdHRlbiA9IGZ3cml0ZShzLCAxLCBuLCBzb2FwLT5zZW5kZmQpOworI2Vsc2UKKyNpZmRlZiBWWFdPUktTCisjaWZkZWYgV01XX1JQTV9JTworICAgICAgaWYgKHNvYXAtPnJwbXJlcWlkKQorICAgICAgICBud3JpdHRlbiA9IChodHRwQmxvY2tQdXQoc29hcC0+cnBtcmVxaWQsIHMsIG4pID09IDApID8gbiA6IC0xOyAKKyAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICBud3JpdHRlbiA9IGZ3cml0ZShzLCBzaXplb2YoY2hhciksIG4sIGZkb3Blbihzb2FwLT5zZW5kZmQsICJ3IikpOworI2Vsc2UKKyAgICAgIG53cml0dGVuID0gd3JpdGUoKFNPQVBfU09DS0VUKXNvYXAtPnNlbmRmZCwgcywgbik7CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisgICAgICBpZiAobndyaXR0ZW4gPD0gMCkKKyAgICAgIHsgaWYgKHNvYXBfZXJybm8gIT0gU09BUF9FSU5UUiAmJiBzb2FwX2Vycm5vICE9IFNPQVBfRVdPVUxEQkxPQ0sgJiYgc29hcF9lcnJubyAhPSBTT0FQX0VBR0FJTikKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX2Vycm5vOworICAgICAgICAgIHJldHVybiBTT0FQX0VPRjsKKyAgICAgICAgfQorICAgICAgICBud3JpdHRlbiA9IDA7IC8qIGFuZCBjYWxsIHdyaXRlKCkgYWdhaW4gKi8KKyAgICAgIH0KKyAgICB9CisgICAgbiAtPSBud3JpdHRlbjsKKyAgICBzICs9IG53cml0dGVuOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2VuZF9yYXcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBuKQoreyBpZiAoIW4pCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgIHsgc29hcC0+Y291bnQgKz0gbjsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgICBpZiAoc29hcC0+ZnByZXBhcmVzZW5kICYmIChzb2FwLT5tb2RlICYgU09BUF9JTykgIT0gU09BUF9JT19TVE9SRSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IHNvYXAtPmZwcmVwYXJlc2VuZChzb2FwLCBzLCBuKTsKKyNlbmRpZgorICAgIHJldHVybiBTT0FQX09LOworICB9CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JTykKKyAgeyByZWdpc3RlciBzaXplX3QgaSA9IFNPQVBfQlVGTEVOIC0gc29hcC0+YnVmaWR4OworICAgIHdoaWxlIChuID49IGkpCisgICAgeyBtZW1jcHkoc29hcC0+YnVmICsgc29hcC0+YnVmaWR4LCBzLCBpKTsKKyAgICAgIHNvYXAtPmJ1ZmlkeCA9IFNPQVBfQlVGTEVOOworICAgICAgaWYgKHNvYXBfZmx1c2goc29hcCkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHMgKz0gaTsKKyAgICAgIG4gLT0gaTsKKyAgICAgIGkgPSBTT0FQX0JVRkxFTjsKKyAgICB9CisgICAgbWVtY3B5KHNvYXAtPmJ1ZiArIHNvYXAtPmJ1ZmlkeCwgcywgbik7CisgICAgc29hcC0+YnVmaWR4ICs9IG47CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgcmV0dXJuIHNvYXBfZmx1c2hfcmF3KHNvYXAsIHMsIG4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2ZsdXNoKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgbiA9IHNvYXAtPmJ1ZmlkeDsKKyAgaWYgKG4pCisgIHsgc29hcC0+YnVmaWR4ID0gMDsKKyNpZmRlZiBXSVRIX1pMSUIKKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIpCisgICAgeyBzb2FwLT5kX3N0cmVhbS5uZXh0X2luID0gKEJ5dGUqKXNvYXAtPmJ1ZjsKKyAgICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luID0gKHVuc2lnbmVkIGludCluOworI2lmZGVmIFdJVEhfR1pJUAorICAgICAgc29hcC0+el9jcmMgPSBjcmMzMihzb2FwLT56X2NyYywgKEJ5dGUqKXNvYXAtPmJ1ZiwgKHVuc2lnbmVkIGludCluKTsKKyNlbmRpZgorICAgICAgZG8KKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJEZWZsYXRpbmcgJXUgYnl0ZXNcbiIsIHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luKSk7CisgICAgICAgIGlmIChkZWZsYXRlKCZzb2FwLT5kX3N0cmVhbSwgWl9OT19GTFVTSCkgIT0gWl9PSykKKyAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVuYWJsZSB0byBkZWZsYXRlOiAlc1xuIiwgc29hcC0+ZF9zdHJlYW0ubXNnP3NvYXAtPmRfc3RyZWFtLm1zZzoiIikpOworICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCkKKyAgICAgICAgeyBpZiAoc29hcF9mbHVzaF9yYXcoc29hcCwgc29hcC0+el9idWYsIFNPQVBfQlVGTEVOKSkKKyAgICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IChCeXRlKilzb2FwLT56X2J1ZjsKKyAgICAgICAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgPSBTT0FQX0JVRkxFTjsKKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAoc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4pOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICAgIHJldHVybiBzb2FwX2ZsdXNoX3Jhdyhzb2FwLCBzb2FwLT5idWYsIG4pOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2ZsdXNoX3JhdyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgc2l6ZV90IG4pCit7IGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fU1RPUkUpCisgIHsgcmVnaXN0ZXIgY2hhciAqdDsKKyAgICBpZiAoISh0ID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBuKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICBtZW1jcHkodCwgcywgbik7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgICAgaWYgKHNvYXAtPmZwcmVwYXJlc2VuZCkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IHNvYXAtPmZwcmVwYXJlc2VuZChzb2FwLCBzLCBuKTsKKyNlbmRpZgorICAgIHJldHVybiBTT0FQX09LOworICB9CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgIHsgY2hhciB0WzE2XTsKKyAgICBzcHJpbnRmKHQsICJcclxuJWxYXHJcbiIgKyAoc29hcC0+Y2h1bmtzaXplID8gMCA6IDIpLCAodW5zaWduZWQgbG9uZyluKTsKKyAgICBEQkdNU0coU0VOVCwgdCwgc3RybGVuKHQpKTsKKyAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnNlbmQoc29hcCwgdCwgc3RybGVuKHQpKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgc29hcC0+Y2h1bmtzaXplICs9IG47CisgIH0KKyAgREJHTVNHKFNFTlQsIHMsIG4pOworI2VuZGlmCisgIHJldHVybiBzb2FwLT5lcnJvciA9IHNvYXAtPmZzZW5kKHNvYXAsIHMsIG4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMpCit7IGlmIChzKQorICAgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHN0cmxlbihzKSk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmQyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpCit7IGlmIChzb2FwX3NlbmQoc29hcCwgczEpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfc2VuZChzb2FwLCBzMik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZW5kMyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBjb25zdCBjaGFyICpzMykKK3sgaWYgKHNvYXBfc2VuZChzb2FwLCBzMSkKKyAgIHx8IHNvYXBfc2VuZChzb2FwLCBzMikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9zZW5kKHNvYXAsIHMzKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzaXplX3QKK2ZyZWN2KHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpzLCBzaXplX3QgbikKK3sgcmVnaXN0ZXIgaW50IHI7CisgIHNvYXAtPmVycm51bSA9IDA7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgIWRlZmluZWQoV0lUSF9MRUFOKQorICBpZiAoc29hcC0+aXMpCisgIHsgaWYgKHNvYXAtPmlzLT5nb29kKCkpCisgICAgICByZXR1cm4gc29hcC0+aXMtPnJlYWQocywgbikuZ2NvdW50KCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyNlbmRpZgorICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgeyBmb3IgKDs7KQorICAgIHsgCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgaWYgKHNvYXAtPnJlY3ZfdGltZW91dCkKKyAgICAgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgICAgZmRfc2V0IGZkOworICAgICAgICBpZiAoc29hcC0+cmVjdl90aW1lb3V0ID4gMCkKKyAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IHNvYXAtPnJlY3ZfdGltZW91dDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IC1zb2FwLT5yZWN2X3RpbWVvdXQvMTAwMDAwMDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAtc29hcC0+cmVjdl90aW1lb3V0JTEwMDAwMDA7CisgICAgICAgIH0KKyAgICAgICAgRkRfWkVSTygmZmQpOworICAgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJmZkKTsKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeyByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksICZmZCwgTlVMTCwgJmZkLCAmdGltZW91dCk7CisgICAgICAgICAgaWYgKHIgPiAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgaWYgKCFyKQorCSAgeyBzb2FwLT5lcnJudW0gPSAwOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUFHQUlOKQorCSAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisjaWZkZWYgV0lUSF9PUEVOU1NMCisgICAgICBpZiAoc29hcC0+c3NsKQorICAgICAgeyBpbnQgZXJyOworCXIgPSBTU0xfcmVhZChzb2FwLT5zc2wsIHMsIG4pOworICAgICAgICBpZiAociA+IDApCisgICAgICAgICAgcmV0dXJuIChzaXplX3QpcjsKKwllcnIgPSBTU0xfZ2V0X2Vycm9yKHNvYXAtPnNzbCwgcik7CisJaWYgKGVyciAhPSBTU0xfRVJST1JfTk9ORSAmJiBlcnIgIT0gU1NMX0VSUk9SX1dBTlRfUkVBRCAmJiBlcnIgIT0gU1NMX0VSUk9SX1dBTlRfV1JJVEUpCisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBlbHNlIGlmIChzb2FwLT5iaW8pCisgICAgICB7IHIgPSBCSU9fcmVhZChzb2FwLT5iaW8sIHMsIG4pOworICAgICAgICBpZiAociA+IDApCisgICAgICAgICAgcmV0dXJuIChzaXplX3QpcjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBlbHNlCisjZW5kaWYKKyAgICAgIHsgCisjaWZkZWYgV0lUSF9VRFAKKyAgICAgICAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICAgICAgeyBTT0FQX1NPQ0tMRU5fVCBrID0gKFNPQVBfU09DS0xFTl9UKXNpemVvZihzb2FwLT5wZWVyKTsKKwkgIG1lbXNldCgodm9pZCopJnNvYXAtPnBlZXIsIDAsIHNpemVvZihzb2FwLT5wZWVyKSk7CisgICAgICAgICAgciA9IHJlY3Zmcm9tKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHMsIG4sIHNvYXAtPnNvY2tldF9mbGFncywgKHN0cnVjdCBzb2NrYWRkciopJnNvYXAtPnBlZXIsICZrKTsJLyogcG9ydGFiaWxpdHkgbm90ZTogc2VlIFNPQVBfU09DS0xFTl9UIGRlZmluaXRpb24gaW4gc3Rkc29hcDIuaCAqLworCSAgc29hcC0+cGVlcmxlbiA9IChzaXplX3QpazsKKyNpZm5kZWYgV0lUSF9JUFY2CisgICAgICAgICAgc29hcC0+aXAgPSBudG9obChzb2FwLT5wZWVyLnNpbl9hZGRyLnNfYWRkcik7CisgICAgICAgICAgc29hcC0+cG9ydCA9IChpbnQpbnRvaHMoc29hcC0+cGVlci5zaW5fcG9ydCk7CisjZW5kaWYKKyAgICAgICAgfQorCWVsc2UKKyNlbmRpZgorICAgICAgICAgIHIgPSByZWN2KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHMsIG4sIHNvYXAtPnNvY2tldF9mbGFncyk7CisgICAgICAgIGlmIChyID49IDApCisgICAgICAgICAgcmV0dXJuIChzaXplX3QpcjsKKyAgICAgICAgaWYgKHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FQUdBSU4gJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FV09VTERCTE9DSykKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgfQorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgICAgZmRfc2V0IGZkOworICAgICAgICB0aW1lb3V0LnR2X3NlYyA9IDA7CisgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDEwMDAwOworICAgICAgICBGRF9aRVJPKCZmZCk7CisgICAgICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmZmQpOworI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgICAgICBpZiAoc29hcC0+c3NsICYmIFNTTF9nZXRfZXJyb3Ioc29hcC0+c3NsLCByKSA9PSBTU0xfRVJST1JfV0FOVF9XUklURSkKKyAgICAgICAgICByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksIE5VTEwsICZmZCwgJmZkLCAmdGltZW91dCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksICZmZCwgTlVMTCwgJmZkLCAmdGltZW91dCk7CisjZWxzZQorICAgICAgICByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksICZmZCwgTlVMTCwgJmZkLCAmdGltZW91dCk7CisjZW5kaWYKKyAgICAgICAgaWYgKHIgPCAwICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIpCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgfQorI2lmZGVmIFdJVEhfRkFTVENHSQorICByZXR1cm4gZnJlYWQocywgMSwgbiwgc3RkaW4pOworI2Vsc2UKKyNpZmRlZiBVTkRFUl9DRQorICByZXR1cm4gZnJlYWQocywgMSwgbiwgc29hcC0+cmVjdmZkKTsKKyNlbHNlCisjaWZkZWYgV01XX1JQTV9JTworICBpZiAoc29hcC0+cnBtcmVxaWQpCisgICAgciA9IGh0dHBCbG9ja1JlYWQoc29hcC0+cnBtcmVxaWQsIHMsIG4pOworICBlbHNlCisjZW5kaWYKKyAgciA9IHJlYWQoKFNPQVBfU09DS0VUKXNvYXAtPnJlY3ZmZCwgcywgbik7CisgIGlmIChyID49IDApCisgICAgcmV0dXJuIChzaXplX3QpcjsKKyAgc29hcC0+ZXJybnVtID0gc29hcF9lcnJubzsKKyAgcmV0dXJuIDA7CisjZW5kaWYKKyNlbmRpZgorfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc29hcF93Y2hhcgorc29hcF9nZXRjaHVua2NoYXIoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwLT5idWZpZHggPCBzb2FwLT5idWZsZW4pCisgICAgcmV0dXJuIHNvYXAtPmJ1Zltzb2FwLT5idWZpZHgrK107CisgIHNvYXAtPmJ1ZmlkeCA9IDA7CisgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmNodW5rYnVmbGVuID0gc29hcC0+ZnJlY3Yoc29hcCwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTik7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVhZCAldSBieXRlcyBmcm9tIHNvY2tldCAlZFxuIiwgKHVuc2lnbmVkIGludClzb2FwLT5idWZsZW4sIHNvYXAtPnNvY2tldCkpOworICBEQkdNU0coUkVDViwgc29hcC0+YnVmLCBzb2FwLT5idWZsZW4pOworICBpZiAoc29hcC0+YnVmbGVuKQorICAgIHJldHVybiBzb2FwLT5idWZbc29hcC0+YnVmaWR4KytdOworICByZXR1cm4gRU9GOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzb2FwX2lzeGRpZ2l0KGludCBjKQoreyByZXR1cm4gKGMgPj0gJzAnICYmIGMgPD0gJzknKSB8fCAoYyA+PSAnQScgJiYgYyA8PSAnRicpIHx8IChjID49ICdhJyAmJiBjIDw9ICdmJyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVjdl9yYXcoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNpemVfdCByZXQ7CisjaWZkZWYgV0lUSF9aTElCCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQikKKyAgeyBpZiAoc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPT0gWl9OVUxMKQorICAgICAgcmV0dXJuIEVPRjsKKyAgICBpZiAoc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4gfHwgIXNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCkKKyAgICB7IHJlZ2lzdGVyIGludCByOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbmZsYXRpbmdcbiIpKTsKKyAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gKEJ5dGUqKXNvYXAtPmJ1ZjsKKyAgICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCA9IFNPQVBfQlVGTEVOOworICAgICAgciA9IGluZmxhdGUoJnNvYXAtPmRfc3RyZWFtLCBaX05PX0ZMVVNIKTsKKyAgICAgIGlmIChyID09IFpfT0sgfHwgciA9PSBaX1NUUkVBTV9FTkQpCisgICAgICB7IHNvYXAtPmJ1ZmlkeCA9IDA7CisgICAgICAgIHNvYXAtPmJ1ZmxlbiA9IFNPQVBfQlVGTEVOIC0gc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0OworICAgICAgICBpZiAoc29hcC0+emxpYl9pbiA9PSBTT0FQX1pMSUJfR1pJUCkKKyAgICAgICAgICBzb2FwLT56X2NyYyA9IGNyYzMyKHNvYXAtPnpfY3JjLCAoQnl0ZSopc29hcC0+YnVmLCAodW5zaWduZWQgaW50KXNvYXAtPmJ1Zmxlbik7CisgICAgICAgIGlmIChyID09IFpfU1RSRUFNX0VORCkKKyAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluZmxhdGVkICVsdS0+JWx1IGJ5dGVzXG4iLCBzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiwgc29hcC0+ZF9zdHJlYW0udG90YWxfb3V0KSk7CisgICAgICAgICAgc29hcC0+el9yYXRpb19pbiA9IChmbG9hdClzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiAvIChmbG9hdClzb2FwLT5kX3N0cmVhbS50b3RhbF9vdXQ7CisgICAgICAgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSBaX05VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvYXAtPmJ1ZmxlbikKKyAgICAgICAgeyBzb2FwLT5jb3VudCArPSBzb2FwLT5idWZsZW47CisgICAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHIgIT0gWl9CVUZfRVJST1IpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5mbGF0ZSBlcnJvcjogJXNcbiIsIHNvYXAtPmRfc3RyZWFtLm1zZz9zb2FwLT5kX3N0cmVhbS5tc2c6IiIpKTsKKyAgICAgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSBaX05VTEw7CisJc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgICAgIHJldHVybiBFT0Y7CisgICAgICB9CisgICAgfQoremxpYl9hZ2FpbjoKKyAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LICYmICFzb2FwLT5jaHVua3NpemUpCisgICAgeyBtZW1jcHkoc29hcC0+YnVmLCBzb2FwLT56X2J1ZiwgU09BUF9CVUZMRU4pOworICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+el9idWZsZW47CisgICAgfQorICB9CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykgLyogcmVhZCBIVFRQIGNodW5rZWQgdHJhbnNmZXIgKi8KKyAgeyAKK2NodW5rX2FnYWluOgorICAgIGlmIChzb2FwLT5jaHVua3NpemUpCisgICAgeyBzb2FwLT5idWZsZW4gPSByZXQgPSBzb2FwLT5mcmVjdihzb2FwLCBzb2FwLT5idWYsIHNvYXAtPmNodW5rc2l6ZSA+IFNPQVBfQlVGTEVOID8gU09BUF9CVUZMRU4gOiBzb2FwLT5jaHVua3NpemUpOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHZXR0aW5nIGNodW5rOiByZWFkICV1IGJ5dGVzXG4iLCAodW5zaWduZWQgaW50KXJldCkpOworICAgICAgREJHTVNHKFJFQ1YsIHNvYXAtPmJ1ZiwgcmV0KTsKKyAgICAgIHNvYXAtPmJ1ZmlkeCA9IDA7CisgICAgICBzb2FwLT5jaHVua3NpemUgLT0gcmV0OworICAgIH0KKyAgICBlbHNlCisgICAgeyByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgICAgICBjaGFyICp0LCB0bXBbOF07CisgICAgICB0ID0gdG1wOworICAgICAgaWYgKCFzb2FwLT5jaHVua2J1ZmxlbikKKyAgICAgIHsgc29hcC0+Y2h1bmtidWZsZW4gPSByZXQgPSBzb2FwLT5mcmVjdihzb2FwLCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOKTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWFkICV1IGJ5dGVzIChjaHVua2VkKSBmcm9tIHNvY2tldCAlZFxuIiwgKHVuc2lnbmVkIGludClyZXQsIHNvYXAtPnNvY2tldCkpOworICAgICAgICBEQkdNU0coUkVDViwgc29hcC0+YnVmLCByZXQpOworICAgICAgICBzb2FwLT5idWZpZHggPSAwOworICAgICAgICBpZiAoIXJldCkKKyAgICAgICAgICByZXR1cm4gc29hcC0+YWhlYWQgPSBFT0Y7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHNvYXAtPmJ1ZmlkeCA9IHNvYXAtPmJ1ZmxlbjsKKyAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmNodW5rYnVmbGVuOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHZXR0aW5nIGNodW5rIHNpemUgKGlkeD0ldSBsZW49JXUpXG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmJ1ZmlkeCwgKHVuc2lnbmVkIGludClzb2FwLT5idWZsZW4pKTsKKyAgICAgIHdoaWxlICghc29hcF9pc3hkaWdpdCgoaW50KShjID0gc29hcF9nZXRjaHVua2NoYXIoc29hcCkpKSkKKyAgICAgICAgaWYgKChpbnQpYyA9PSBFT0YpCisJICByZXR1cm4gc29hcC0+YWhlYWQgPSBFT0Y7CisgICAgICBkbworICAgICAgICAqdCsrID0gKGNoYXIpYzsKKyAgICAgIHdoaWxlIChzb2FwX2lzeGRpZ2l0KChpbnQpKGMgPSBzb2FwX2dldGNodW5rY2hhcihzb2FwKSkpICYmIHQgLSB0bXAgPCA3KTsKKyAgICAgIHdoaWxlICgoaW50KWMgIT0gRU9GICYmIGMgIT0gJ1xuJykKKyAgICAgICAgYyA9IHNvYXBfZ2V0Y2h1bmtjaGFyKHNvYXApOworICAgICAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgIHJldHVybiBzb2FwLT5haGVhZCA9IEVPRjsKKyAgICAgICp0ID0gJ1wwJzsKKyAgICAgIHNvYXAtPmNodW5rc2l6ZSA9IHNvYXBfc3RydG91bCh0bXAsICZ0LCAxNik7CisgICAgICBpZiAoIXNvYXAtPmNodW5rc2l6ZSkKKyAgICAgIHsgc29hcC0+Y2h1bmtidWZsZW4gPSAwOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBvZiBjaHVua2VkIG1lc3NhZ2VcbiIpKTsKKwl3aGlsZSAoKGludCljICE9IEVPRiAmJiBjICE9ICdcbicpCisgICAgICAgICAgYyA9IHNvYXBfZ2V0Y2h1bmtjaGFyKHNvYXApOworICAgICAgICByZXR1cm4gc29hcC0+YWhlYWQgPSBFT0Y7CisgICAgICB9CisgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5idWZpZHggKyBzb2FwLT5jaHVua3NpemU7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk1vdmluZyBidWYgbGVuIHRvIGlkeD0ldSBsZW49JXUgKCVzKVxuIiwgKHVuc2lnbmVkIGludClzb2FwLT5idWZpZHgsICh1bnNpZ25lZCBpbnQpc29hcC0+YnVmbGVuLCB0bXApKTsKKyAgICAgIGlmIChzb2FwLT5idWZsZW4gPiBzb2FwLT5jaHVua2J1ZmxlbikKKyAgICAgIHsgc29hcC0+YnVmbGVuID0gc29hcC0+Y2h1bmtidWZsZW47CisgICAgICAgIHNvYXAtPmNodW5rc2l6ZSAtPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgICAgIHNvYXAtPmNodW5rYnVmbGVuID0gMDsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQYXNzZWQgZW5kIG9mIGJ1ZmZlciBmb3IgY2h1bmtlZCBIVFRQICgldSBieXRlcyBsZWZ0KVxuIiwgKHVuc2lnbmVkIGludCkoc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4KSkpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoc29hcC0+Y2h1bmtidWZsZW4pCisgICAgICAgIHNvYXAtPmNodW5rc2l6ZSA9IDA7CisgICAgICByZXQgPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgICBpZiAoIXJldCkKKyAgICAgICAgZ290byBjaHVua19hZ2FpbjsKKyAgICB9CisgIH0KKyAgZWxzZQorI2VuZGlmCisgIHsgc29hcC0+YnVmaWR4ID0gMDsKKyAgICBzb2FwLT5idWZsZW4gPSByZXQgPSBzb2FwLT5mcmVjdihzb2FwLCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOKTsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlYWQgJXUgYnl0ZXMgZnJvbSBzb2NrZXQgJWRcbiIsICh1bnNpZ25lZCBpbnQpcmV0LCBzb2FwLT5zb2NrZXQpKTsKKyAgICBEQkdNU0coUkVDViwgc29hcC0+YnVmLCByZXQpOworICB9CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5mcHJlcGFyZXJlY3YgJiYgKHNvYXAtPmVycm9yID0gc29hcC0+ZnByZXBhcmVyZWN2KHNvYXAsIHNvYXAtPmJ1ZiwgcmV0KSkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2VuZGlmCisjaWZkZWYgV0lUSF9aTElCCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQikKKyAgeyByZWdpc3RlciBpbnQgcjsKKyAgICBtZW1jcHkoc29hcC0+el9idWYsIHNvYXAtPmJ1ZiwgU09BUF9CVUZMRU4pOworICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfaW4gPSAoQnl0ZSopKHNvYXAtPnpfYnVmICsgc29hcC0+YnVmaWR4KTsKKyAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbiA9ICh1bnNpZ25lZCBpbnQpcmV0OworICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gKEJ5dGUqKXNvYXAtPmJ1ZjsKKyAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgPSBTT0FQX0JVRkxFTjsKKyAgICByID0gaW5mbGF0ZSgmc29hcC0+ZF9zdHJlYW0sIFpfTk9fRkxVU0gpOworICAgIGlmIChyID09IFpfT0sgfHwgciA9PSBaX1NUUkVBTV9FTkQpCisgICAgeyBzb2FwLT5idWZpZHggPSAwOworICAgICAgc29hcC0+el9idWZsZW4gPSBzb2FwLT5idWZsZW47CisgICAgICBzb2FwLT5idWZsZW4gPSByZXQgPSBTT0FQX0JVRkxFTiAtIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dDsKKyAgICAgIGlmIChzb2FwLT56bGliX2luID09IFNPQVBfWkxJQl9HWklQKQorICAgICAgICBzb2FwLT56X2NyYyA9IGNyYzMyKHNvYXAtPnpfY3JjLCAoQnl0ZSopc29hcC0+YnVmLCAodW5zaWduZWQgaW50KXNvYXAtPmJ1Zmxlbik7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluZmxhdGVkICV1IGJ5dGVzXG4iLCAodW5zaWduZWQgaW50KXJldCkpOworICAgICAgaWYgKCFyZXQpCisgICAgICAgIGdvdG8gemxpYl9hZ2FpbjsKKyAgICAgIGlmIChyID09IFpfU1RSRUFNX0VORCkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbmZsYXRlZCAlbHUtPiVsdSBieXRlc1xuIiwgc29hcC0+ZF9zdHJlYW0udG90YWxfaW4sIHNvYXAtPmRfc3RyZWFtLnRvdGFsX291dCkpOworICAgICAgICBzb2FwLT56X3JhdGlvX2luID0gKGZsb2F0KXNvYXAtPmRfc3RyZWFtLnRvdGFsX2luIC8gKGZsb2F0KXNvYXAtPmRfc3RyZWFtLnRvdGFsX291dDsKKyAgICAgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSBaX05VTEw7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVW5hYmxlIHRvIGluZmxhdGU6ICglZCkgJXNcbiIsIHIsIHNvYXAtPmRfc3RyZWFtLm1zZz9zb2FwLT5kX3N0cmVhbS5tc2c6IiIpKTsKKyAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gWl9OVUxMOworICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgICByZXR1cm4gRU9GOworICAgIH0KKyAgfQorI2VuZGlmCisgIHNvYXAtPmNvdW50ICs9IHJldDsKKyAgcmV0dXJuICFyZXQ7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVjdihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkKKyAgeyBpZiAoc29hcC0+ZGltZS5idWZsZW4pCisgICAgeyBjaGFyICpzOworICAgICAgaW50IGk7CisgICAgICB1bnNpZ25lZCBjaGFyIHRtcFsxMl07CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRJTUUgaGRyIGZvciBjaHVua2VkIERJTUUgaXMgaW4gYnVmZmVyXG4iKSk7CisgICAgICBzb2FwLT5jb3VudCArPSBzb2FwLT5kaW1lLmJ1ZmxlbiAtIHNvYXAtPmJ1ZmxlbjsKKyAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmRpbWUuYnVmbGVuOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTa2lwIHBhZGRpbmcgKCVsZCBieXRlcylcbiIsIC0obG9uZylzb2FwLT5kaW1lLnNpemUmMykpOworICAgICAgZm9yIChpID0gLShsb25nKXNvYXAtPmRpbWUuc2l6ZSYzOyBpID4gMDsgaS0tKQorICAgICAgeyBzb2FwLT5idWZpZHgrKzsKKyAgICAgICAgaWYgKHNvYXAtPmJ1ZmlkeCA+PSBzb2FwLT5idWZsZW4pCisgICAgICAgICAgaWYgKHNvYXBfcmVjdl9yYXcoc29hcCkpCisgICAgICAgICAgICByZXR1cm4gRU9GOworICAgICAgfQorICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHZXQgRElNRSBoZHIgZm9yIG5leHQgY2h1bmtcbiIpKTsKKyAgICAgIHMgPSAoY2hhciopdG1wOworICAgICAgZm9yIChpID0gMTI7IGkgPiAwOyBpLS0pCisgICAgICB7ICpzKysgPSBzb2FwLT5idWZbc29hcC0+YnVmaWR4KytdOworICAgICAgICBpZiAoc29hcC0+YnVmaWR4ID49IHNvYXAtPmJ1ZmxlbikKKyAgICAgICAgICBpZiAoc29hcF9yZWN2X3Jhdyhzb2FwKSkKKyAgICAgICAgICAgIHJldHVybiBFT0Y7CisgICAgICB9CisgICAgICBzb2FwLT5kaW1lLmZsYWdzID0gdG1wWzBdICYgMHg3OworICAgICAgc29hcC0+ZGltZS5zaXplID0gKChzaXplX3QpdG1wWzhdIDw8IDI0KSB8ICgoc2l6ZV90KXRtcFs5XSA8PCAxNikgfCAoKHNpemVfdCl0bXBbMTBdIDw8IDgpIHwgKChzaXplX3QpdG1wWzExXSk7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdldCBESU1FIGNodW5rICgldSBieXRlcylcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+ZGltZS5zaXplKSk7CisgICAgICBpZiAoc29hcC0+ZGltZS5mbGFncyAmIFNPQVBfRElNRV9DRikKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJNb3JlIGNodW5raW5nXG4iKSk7CisgICAgICAgIHNvYXAtPmRpbWUuY2h1bmtzaXplID0gc29hcC0+ZGltZS5zaXplOworICAgICAgICBpZiAoc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4ID49IHNvYXAtPmRpbWUuc2l6ZSkKKyAgICAgICAgeyBzb2FwLT5kaW1lLmJ1ZmxlbiA9IHNvYXAtPmJ1ZmxlbjsKKyAgICAgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5idWZpZHggKyBzb2FwLT5kaW1lLmNodW5rc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgc29hcC0+ZGltZS5jaHVua3NpemUgLT0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkxhc3QgY2h1bmtcbiIpKTsKKyAgICAgICAgc29hcC0+ZGltZS5idWZsZW4gPSAwOworICAgICAgICBzb2FwLT5kaW1lLmNodW5rc2l6ZSA9IDA7CisgICAgICB9CisgICAgICBzb2FwLT5jb3VudCA9IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiJXUgYnl0ZXMgcmVtYWluaW5nXG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmNvdW50KSk7CisgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICB9CisgICAgaWYgKHNvYXAtPmRpbWUuY2h1bmtzaXplKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHZXQgbmV4dCBESU1FIGhkciBmb3IgY2h1bmtlZCBESU1FICgldSBieXRlcyBjaHVuaylcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+ZGltZS5jaHVua3NpemUpKTsKKyAgICAgIGlmIChzb2FwX3JlY3ZfcmF3KHNvYXApKQorICAgICAgICByZXR1cm4gRU9GOworICAgICAgaWYgKHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeCA+PSBzb2FwLT5kaW1lLmNodW5rc2l6ZSkKKyAgICAgIHsgc29hcC0+ZGltZS5idWZsZW4gPSBzb2FwLT5idWZsZW47CisgICAgICAgIHNvYXAtPmNvdW50IC09IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeCAtIHNvYXAtPmRpbWUuY2h1bmtzaXplOworICAgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5idWZpZHggKyBzb2FwLT5kaW1lLmNodW5rc2l6ZTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgc29hcC0+ZGltZS5jaHVua3NpemUgLT0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIlbHUgYnl0ZXMgcmVtYWluaW5nLCBjb3VudD0ldVxuIiwgKHVuc2lnbmVkIGxvbmcpKHNvYXAtPmJ1Zmxlbi1zb2FwLT5idWZpZHgpLCAodW5zaWduZWQgaW50KXNvYXAtPmNvdW50KSk7CisgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICB9CisgIH0KKyNlbmRpZgorICByZXR1cm4gc29hcF9yZWN2X3Jhdyhzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3NvYXBfd2NoYXIKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0Y2hhcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICBjID0gc29hcC0+YWhlYWQ7CisgIGlmIChjKQorICB7IGlmIChjICE9IEVPRikKKyAgICAgIHNvYXAtPmFoZWFkID0gMDsKKyAgICByZXR1cm4gYzsKKyAgfQorICByZXR1cm4gc29hcF9nZXQxKHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAqCitTT0FQX0ZNQUMyCitzb2FwX2NvZGUoY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgKm1hcCwgY29uc3QgY2hhciAqc3RyKQoreyBpZiAoc3RyKQorICB7IHdoaWxlIChtYXAtPnN0cmluZykKKyAgICB7IGlmICghc3RyY21wKHN0ciwgbWFwLT5zdHJpbmcpKSAvKiBjYXNlIHNlbnNpdGl2ZSAqLworICAgICAgICByZXR1cm4gbWFwOworICAgICAgbWFwKys7CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorbG9uZworU09BUF9GTUFDMgorc29hcF9pbnRfY29kZShjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCAqbWFwLCBjb25zdCBjaGFyICpzdHIsIGxvbmcgb3RoZXIpCit7IHdoaWxlIChtYXAtPnN0cmluZykKKyAgeyBpZiAoIXNvYXBfdGFnX2NtcChzdHIsIG1hcC0+c3RyaW5nKSkgLyogY2FzZSBpbnNlbnNpdGl2ZSAqLworICAgICAgcmV0dXJuIG1hcC0+Y29kZTsKKyAgICBtYXArKzsKKyAgfQorICByZXR1cm4gb3RoZXI7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9zdHJfY29kZShjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCAqbWFwLCBsb25nIGNvZGUpCit7IHdoaWxlIChtYXAtPmNvZGUgIT0gY29kZSAmJiBtYXAtPnN0cmluZykKKyAgICBtYXArKzsKKyAgcmV0dXJuIG1hcC0+c3RyaW5nOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHNvYXBfd2NoYXIKK3NvYXBfY2hhcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgY2hhciB0bXBbOF07CisgIHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIHJlZ2lzdGVyIGNoYXIgKnMgPSB0bXA7CisgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspCisgIHsgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICBpZiAoYyA9PSAnOycgfHwgKGludCljID09IEVPRikKKyAgICAgIGJyZWFrOworICAgICpzKysgPSAoY2hhciljOworICB9CisgICpzID0gJ1wwJzsKKyAgaWYgKCp0bXAgPT0gJyMnKQorICB7IGlmICh0bXBbMV0gPT0gJ3gnIHx8IHRtcFsxXSA9PSAnWCcpCisgICAgICByZXR1cm4gc29hcF9zdHJ0b2wodG1wICsgMiwgTlVMTCwgMTYpOworICAgIHJldHVybiBhdG9sKHRtcCArIDEpOworICB9CisgIGlmICghc3RyY21wKHRtcCwgImx0IikpCisgICAgcmV0dXJuICc8JzsKKyAgaWYgKCFzdHJjbXAodG1wLCAiZ3QiKSkKKyAgICByZXR1cm4gJz4nOworICBpZiAoIXN0cmNtcCh0bXAsICJhbXAiKSkKKyAgICByZXR1cm4gJyYnOworICBpZiAoIXN0cmNtcCh0bXAsICJxdW90IikpCisgICAgcmV0dXJuICciJzsKKyAgaWYgKCFzdHJjbXAodG1wLCAiYXBvcyIpKQorICAgIHJldHVybiAnXCcnOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgcmV0dXJuIChzb2FwX3djaGFyKXNvYXBfaW50X2NvZGUoaHRtbF9lbnRpdHlfY29kZXMsIHRtcCwgU09BUF9VTktOT1dOX0NIQVIpOworI2Vsc2UKKyAgcmV0dXJuIFNPQVBfVU5LTk9XTl9DSEFSOyAvKiB1c2UgdGhpcyB0byByZXByZXNlbnQgdW5rbm93biBjb2RlICovCisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFdJVEhfTEVBTgorc29hcF93Y2hhcgorc29hcF9nZXQwKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcC0+YnVmaWR4ID49IHNvYXAtPmJ1ZmxlbiAmJiBzb2FwX3JlY3Yoc29hcCkpCisgICAgcmV0dXJuIEVPRjsKKyAgcmV0dXJuICh1bnNpZ25lZCBjaGFyKXNvYXAtPmJ1Zltzb2FwLT5idWZpZHhdOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgV0lUSF9MRUFOCitzb2FwX3djaGFyCitzb2FwX2dldDEoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwLT5idWZpZHggPj0gc29hcC0+YnVmbGVuICYmIHNvYXBfcmVjdihzb2FwKSkKKyAgICByZXR1cm4gRU9GOworICByZXR1cm4gKHVuc2lnbmVkIGNoYXIpc29hcC0+YnVmW3NvYXAtPmJ1ZmlkeCsrXTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3NvYXBfd2NoYXIKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIGMgPSBzb2FwLT5haGVhZDsKKyAgaWYgKGMpCisgIHsgaWYgKGMgIT0gRU9GKQorICAgICAgc29hcC0+YWhlYWQgPSAwOworICB9CisgIGVsc2UKKyAgICBjID0gc29hcF9nZXQxKHNvYXApOworICBmb3IgKDs7KQorICB7IGlmIChzb2FwLT5jZGF0YSkKKyAgICB7IGlmIChjID09ICddJykKKyAgICAgIHsgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgICAgaWYgKGMgPT0gJ10nKQorICAgICAgICB7IHNvYXAtPmNkYXRhID0gMDsKKyAgICAgICAgICBzb2FwX2dldDEoc29hcCk7IC8qIHNraXAgPiAqLworICAgICAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICAgIH0KKwllbHNlCisgICAgICAgIHsgc29hcF9yZXZnZXQxKHNvYXApOworICAgICAgICAgIHJldHVybiAnXSc7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGM7CisgICAgfQorICAgIHN3aXRjaCAoYykKKyAgICB7IGNhc2UgJzwnOgorICAgICAgICBkbyBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgICB3aGlsZSAoc29hcF9ibGFuayhjKSk7CisgICAgICAgIGlmIChjID09ICchJyB8fCBjID09ICc/JyB8fCBjID09ICclJykKKyAgICAgICAgeyByZWdpc3RlciBpbnQgayA9IDE7CisJICBpZiAoYyA9PSAnIScpCisgICAgICAgICAgeyBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgICAgICAgaWYgKGMgPT0gJ1snKQorICAgICAgICAgICAgeyBkbyBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgICAgICAgICB3aGlsZSAoKGludCljICE9IEVPRiAmJiBjICE9ICdbJyk7CisgICAgICAgICAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBzb2FwLT5jZGF0YSA9IDE7CisgICAgICAgICAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisJICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYyA9PSAnLScgJiYgKGMgPSBzb2FwX2dldDEoc29hcCkpID09ICctJykKKyAgICAgICAgICAgIHsgZG8KKyAgICAgICAgICAgICAgeyBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgICAgICAgICAgIGlmIChjID09ICctJyAmJiAoYyA9IHNvYXBfZ2V0MShzb2FwKSkgPT0gJy0nKQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0gd2hpbGUgKChpbnQpYyAhPSBFT0YpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKwkgIGVsc2UgaWYgKGMgPT0gJz8nKQorICAgICAgICAgICAgYyA9IHNvYXBfZ2V0X3BpKHNvYXApOworICAgICAgICAgIHdoaWxlICgoaW50KWMgIT0gRU9GKQorICAgICAgICAgIHsgaWYgKGMgPT0gJzwnKQorCSAgICAgIGsrKzsKKwkgICAgZWxzZSBpZiAoYyA9PSAnPicpCisJICAgIHsgaWYgKC0tayA8PSAwKQorCSAgICAgICAgYnJlYWs7CisJICAgIH0KKwkgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKwkgIH0KKwkgIGlmICgoaW50KWMgPT0gRU9GKQorCSAgICBicmVhazsKKyAgICAgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChjID09ICcvJykKKyAgICAgICAgICByZXR1cm4gU09BUF9UVDsKKyAgICAgICAgc29hcF9yZXZnZXQxKHNvYXApOworICAgICAgICByZXR1cm4gU09BUF9MVDsKKyAgICAgIGNhc2UgJz4nOgorICAgICAgICByZXR1cm4gU09BUF9HVDsKKyAgICAgIGNhc2UgJyInOgorICAgICAgICByZXR1cm4gU09BUF9RVDsKKyAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgcmV0dXJuIFNPQVBfQVA7CisgICAgICBjYXNlICcmJzoKKyAgICAgICAgcmV0dXJuIHNvYXBfY2hhcihzb2FwKSB8IDB4ODAwMDAwMDA7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIHJldHVybiBjOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHNvYXBfd2NoYXIKK3NvYXBfZ2V0X3BpKHN0cnVjdCBzb2FwICpzb2FwKQoreyBjaGFyIGJ1Zls2NF07CisgIHJlZ2lzdGVyIGNoYXIgKnMgPSBidWY7CisgIHJlZ2lzdGVyIGludCBpID0gc2l6ZW9mKGJ1Zik7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgLyogVGhpcyBpcyBhIHF1aWNrIHdheSB0byBwYXJzZSBYTUwgUEkgYW5kIHdlIGNvdWxkIHVzZSBhIGNhbGxiYWNrIGluc3RlYWQgdG8KKyAgICogZW5hYmxlIGFwcGxpY2F0aW9ucyB0byBpbnRlcmNlcHQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgKi8KKyAgd2hpbGUgKChpbnQpYyAhPSBFT0YgJiYgYyAhPSAnPycpCisgIHsgaWYgKC0taSA+IDApCisgICAgeyBpZiAoc29hcF9ibGFuayhjKSkKKyAgICAgICAgYyA9ICcgJzsKKyAgICAgICpzKysgPSAoY2hhciljOworICAgIH0KKyAgICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICB9CisgICpzID0gJ1wwJzsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJYTUwgUEkgPD8lcz8+XG4iLCBidWYpKTsKKyAgaWYgKCFzdHJuY21wKGJ1ZiwgInhtbCAiLCA0KSkKKyAgeyBzID0gc3Ryc3RyKGJ1ZiwgIiBlbmNvZGluZz0iKTsKKyAgICBpZiAocyAmJiBzWzEwXSkKKyAgICB7IGlmICghc29hcF90YWdfY21wKHMgKyAxMSwgImlzby04ODU5LTEqIikKKyAgICAgICB8fCAhc29hcF90YWdfY21wKHMgKyAxMSwgImxhdGluMSoiKSkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTd2l0Y2hpbmcgdG8gbGF0aW4xIGVuY29kaW5nXG4iKSk7CisgICAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfTEFUSU47CisgICAgICB9CisgICAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHMgKyAxMSwgInV0Zi04KiIpKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlN3aXRjaGluZyB0byB1dGYtOCBlbmNvZGluZ1xuIikpOworICAgICAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0VOQ19MQVRJTjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKChpbnQpYyAhPSBFT0YpCisgICAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgcmV0dXJuIGM7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfbW92ZShzdHJ1Y3Qgc29hcCAqc29hcCwgbG9uZyBuKQoreyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk1vdmluZyAlbGQgYnl0ZXMgZm9yd2FyZFxuIiwgKGxvbmcpbikpOworICBmb3IgKDsgbiA+IDA7IG4tLSkKKyAgICBpZiAoKGludClzb2FwX2dldGNoYXIoc29hcCkgPT0gRU9GKQorICAgICAgcmV0dXJuIFNPQVBfRU9GOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc2l6ZV90CitTT0FQX0ZNQUMyCitzb2FwX3RlbGwoc3RydWN0IHNvYXAgKnNvYXApCit7IHJldHVybiBzb2FwLT5jb3VudCAtIHNvYXAtPmJ1ZmxlbiArIHNvYXAtPmJ1ZmlkeCAtIChzb2FwLT5haGVhZCAhPSAwKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dHV0Zjgoc3RydWN0IHNvYXAgKnNvYXAsIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgYykKK3sgY2hhciB0bXBbMTZdOworICBpZiAoYyA+IDAgJiYgYyA8IDB4ODApCisgIHsgKnRtcCA9IChjaGFyKWM7CisgICAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgdG1wLCAxKTsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgIHsgcmVnaXN0ZXIgY2hhciAqdCA9IHRtcDsKKyAgICBpZiAoYyA8IDB4MDgwMCkKKyAgICAgICp0KysgPSAoY2hhcikoMHhDMCB8ICgoYyA+PiA2KSAmIDB4MUYpKTsKKyAgICBlbHNlCisgICAgeyBpZiAoYyA8IDB4MDEwMDAwKQorICAgICAgICAqdCsrID0gKGNoYXIpKDB4RTAgfCAoKGMgPj4gMTIpICYgMHgwRikpOworICAgICAgZWxzZQorICAgICAgeyBpZiAoYyA8IDB4MjAwMDAwKQorICAgICAgICAgICp0KysgPSAoY2hhcikoMHhGMCB8ICgoYyA+PiAxOCkgJiAweDA3KSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyBpZiAoYyA8IDB4MDQwMDAwMDApCisgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjggfCAoKGMgPj4gMjQpICYgMHgwMykpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7ICp0KysgPSAoY2hhcikoMHhGQyB8ICgoYyA+PiAzMCkgJiAweDAxKSk7CisgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMjQpICYgMHgzRikpOworICAgICAgICAgIH0KKyAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTgpICYgMHgzRikpOworICAgICAgICB9ICAgICAKKyAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDEyKSAmIDB4M0YpKTsKKyAgICAgIH0KKyAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpKTsKKyAgICB9CisgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKGMgJiAweDNGKSk7CisgICAgKnQgPSAnXDAnOworICB9CisgIGVsc2UKKyNlbmRpZgorICAgIHNwcmludGYodG1wLCAiJiMlbHU7IiwgYyk7CisgIHJldHVybiBzb2FwX3NlbmQoc29hcCwgdG1wKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3NvYXBfd2NoYXIKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0dXRmOChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjLCBjMSwgYzIsIGMzLCBjNDsKKyAgYyA9IHNvYXAtPmFoZWFkOworICBpZiAoYyA+IDB4RkYpCisgIHsgc29hcC0+YWhlYWQgPSAwOworICAgIHJldHVybiBjOworICB9CithZ2FpbjoKKyAgYyA9IHNvYXBfZ2V0KHNvYXApOworICBpZiAoYyA8IDB4ODAgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19MQVRJTikpCisgICAgcmV0dXJuIGM7CisgIGMxID0gc29hcF9nZXQxKHNvYXApOworICBpZiAoYzEgPCAweDgwKQorICB7IHNvYXBfcmV2Z2V0MShzb2FwKTsgLyogZG9lc24ndCBsb29rIGxpa2UgdGhpcyBpcyBVVEY4ICovCisgICAgcmV0dXJuIGM7CisgIH0KKyAgYzEgJj0gMHgzRjsKKyAgaWYgKGMgPCAweEUwKQorICAgIHJldHVybiAoKHNvYXBfd2NoYXIpKGMgJiAweDFGKSA8PCA2KSB8IGMxOworICBjMiA9IChzb2FwX3djaGFyKXNvYXBfZ2V0MShzb2FwKSAmIDB4M0Y7CisgIGlmIChjID09IDB4RUYgJiYgYzEgPT0gMHgzQiAmJiBjMiA9PSAweDNGKQkvKiBpZ25vcmUgVVRGLTggQk9NICovCisgICAgZ290byBhZ2FpbjsKKyAgaWYgKGMgPCAweEYwKQorICAgIHJldHVybiAoKHNvYXBfd2NoYXIpKGMgJiAweDBGKSA8PCAxMikgfCAoYzEgPDwgNikgfCBjMjsKKyAgYzMgPSAoc29hcF93Y2hhcilzb2FwX2dldDEoc29hcCkgJiAweDNGOworICBpZiAoYyA8IDB4RjgpCisgICAgcmV0dXJuICgoc29hcF93Y2hhcikoYyAmIDB4MDcpIDw8IDE4KSB8IChjMSA8PCAxMikgfCAoYzIgPDwgNikgfCBjMzsKKyAgYzQgPSAoc29hcF93Y2hhcilzb2FwX2dldDEoc29hcCkgJiAweDNGOworICBpZiAoYyA8IDB4RkMpCisgICAgcmV0dXJuICgoc29hcF93Y2hhcikoYyAmIDB4MDMpIDw8IDI0KSB8IChjMSA8PCAxOCkgfCAoYzIgPDwgMTIpIHwgKGMzIDw8IDYpIHwgYzQ7CisgIHJldHVybiAoKHNvYXBfd2NoYXIpKGMgJiAweDAxKSA8PCAzMCkgfCAoYzEgPDwgMjQpIHwgKGMyIDw8IDE4KSB8IChjMyA8PCAxMikgfCAoYzQgPDwgNikgfCAoc29hcF93Y2hhcikoc29hcF9nZXQxKHNvYXApICYgMHgzRik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0aGV4KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzLCBpbnQgbikKK3sgY2hhciBkWzJdOworICByZWdpc3RlciBpbnQgaTsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBpZiAoIShzb2FwLT5kb20tPmRhdGEgPSBzb2FwX3MyaGV4KHNvYXAsIHMsIE5VTEwsIG4pKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2VuZGlmCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgIHsgcmVnaXN0ZXIgaW50IG0gPSAqcysrOworICAgIGRbMF0gPSAoY2hhcikoKG0gPj4gNCkgKyAobSA+IDE1OSA/ICc3JyA6ICcwJykpOworICAgIG0gJj0gMHgwRjsKKyAgICBkWzFdID0gKGNoYXIpKG0gKyAobSA+IDkgPyAnNycgOiAnMCcpKTsKKyAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBkLCAyKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3Vuc2lnbmVkIGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2dldGhleChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50ICpuKQoreworI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IHNvYXAtPmRvbS0+ZGF0YSA9IHNvYXBfc3RyaW5nX2luKHNvYXAsIDAsIC0xLCAtMSk7CisgICAgcmV0dXJuICh1bnNpZ25lZCBjaGFyKilzb2FwX2hleDJzKHNvYXAsIHNvYXAtPmRvbS0+ZGF0YSwgTlVMTCwgMCwgbik7CisgIH0KKyNlbmRpZgorI2lmZGVmIFdJVEhfRkFTVAorICBzb2FwLT5sYWJpZHggPSAwOworICBmb3IgKDs7KQorICB7IHJlZ2lzdGVyIGNoYXIgKnM7CisgICAgcmVnaXN0ZXIgaW50IGksIGs7CisgICAgaWYgKHNvYXBfYXBwZW5kX2xhYihzb2FwLCBOVUxMLCAwKSkKKyAgICAgIHJldHVybiBOVUxMOworICAgIHMgPSBzb2FwLT5sYWJidWYgKyBzb2FwLT5sYWJpZHg7CisgICAgayA9IHNvYXAtPmxhYmxlbiAtIHNvYXAtPmxhYmlkeDsKKyAgICBzb2FwLT5sYWJpZHggPSBzb2FwLT5sYWJsZW47CisgICAgZm9yIChpID0gMDsgaSA8IGs7IGkrKykKKyAgICB7IHJlZ2lzdGVyIGNoYXIgZDEsIGQyOworICAgICAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICAgICAgYyA9IHNvYXBfZ2V0KHNvYXApOworICAgICAgaWYgKHNvYXBfaXN4ZGlnaXQoYykpCisgICAgICB7IGQxID0gKGNoYXIpYzsKKyAgICAgICAgYyA9IHNvYXBfZ2V0KHNvYXApOyAKKwlpZiAoc29hcF9pc3hkaWdpdChjKSkKKyAgICAgICAgICBkMiA9IChjaGFyKWM7CisgICAgICAgIGVsc2UgCisgICAgICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgdW5zaWduZWQgY2hhciAqcDsKKyAgICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgaWYgKG4pCisgICAgICAgICAgKm4gPSAoaW50KShzb2FwLT5sYWJsZW4gLSBrICsgaSk7CisgICAgICAgIHAgPSAodW5zaWduZWQgY2hhciopc29hcF9tYWxsb2Moc29hcCwgc29hcC0+bGFibGVuIC0gayArIGkpOworCWlmIChwKQorCSAgbWVtY3B5KHAsIHNvYXAtPmxhYmJ1Ziwgc29hcC0+bGFibGVuIC0gayArIGkpOworICAgICAgICByZXR1cm4gcDsKKyAgICAgIH0KKyAgICAgICpzKysgPSAoKGQxID49ICdBJyA/IChkMSAmIDB4NykgKyA5IDogZDEgLSAnMCcpIDw8IDQpICsgKGQyID49ICdBJyA/IChkMiAmIDB4NykgKyA5IDogZDIgLSAnMCcpOworICAgIH0KKyAgfQorI2Vsc2UKKyAgaWYgKHNvYXBfbmV3X2Jsb2NrKHNvYXApKQorICAgIHJldHVybiBOVUxMOworICBmb3IgKDs7KQorICB7IHJlZ2lzdGVyIGludCBpOworICAgIHJlZ2lzdGVyIGNoYXIgKnMgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIFNPQVBfQkxLTEVOKTsKKyAgICBpZiAoIXMpCisgICAgeyBzb2FwX2VuZF9ibG9jayhzb2FwKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgU09BUF9CTEtMRU47IGkrKykKKyAgICB7IHJlZ2lzdGVyIGNoYXIgZDEsIGQyOworICAgICAgcmVnaXN0ZXIgc29hcF93Y2hhciBjID0gc29hcF9nZXQoc29hcCk7CisgICAgICBpZiAoc29hcF9pc3hkaWdpdChjKSkKKyAgICAgIHsgZDEgPSAoY2hhciljOworICAgICAgICBjID0gc29hcF9nZXQoc29hcCk7IAorCWlmIChzb2FwX2lzeGRpZ2l0KGMpKQorICAgICAgICAgIGQyID0gKGNoYXIpYzsKKyAgICAgICAgZWxzZSAKKyAgICAgICAgeyBzb2FwX2VuZF9ibG9jayhzb2FwKTsKKwkgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IHVuc2lnbmVkIGNoYXIgKnA7CisgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgIGlmIChuKQorICAgICAgICAgICpuID0gc29hcF9zaXplX2Jsb2NrKHNvYXAsIGkpOworICAgICAgICBwID0gKHVuc2lnbmVkIGNoYXIqKXNvYXBfc2F2ZV9ibG9jayhzb2FwLCBOVUxMLCAwKTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgICB9CisgICAgICAqcysrID0gKChkMSA+PSAnQScgPyAoZDEgJiAweDcpICsgOSA6IGQxIC0gJzAnKSA8PCA0KSArIChkMiA+PSAnQScgPyAoZDIgJiAweDcpICsgOSA6IGQyIC0gJzAnKTsKKyAgICB9CisgIH0KKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dGJhc2U2NChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgdW5zaWduZWQgY2hhciAqcywgaW50IG4pCit7IHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIG07CisgIGNoYXIgZFs0XTsKKyAgaWYgKCFzKQorICAgIHJldHVybiBTT0FQX09LOworI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IGlmICghKHNvYXAtPmRvbS0+ZGF0YSA9IHNvYXBfczJiYXNlNjQoc29hcCwgcywgTlVMTCwgbikpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIHJldHVybiBTT0FQX09LOworICB9CisjZW5kaWYKKyAgZm9yICg7IG4gPiAyOyBuIC09IDMsIHMgKz0gMykKKyAgeyBtID0gc1swXTsKKyAgICBtID0gKG0gPDwgOCkgfCBzWzFdOworICAgIG0gPSAobSA8PCA4KSB8IHNbMl07CisgICAgZm9yIChpID0gNDsgaSA+IDA7IG0gPj49IDYpCisgICAgICBkWy0taV0gPSBzb2FwX2Jhc2U2NG9bbSAmIDB4M0ZdOworICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIGQsIDQpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmIChuID4gMCkKKyAgeyBtID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgbSA9IChtIDw8IDgpIHwgKnMrKzsKKyAgICBmb3IgKDsgaSA8IDM7IGkrKykKKyAgICAgIG0gPDw9IDg7CisgICAgZm9yIChpKys7IGkgPiAwOyBtID4+PSA2KQorICAgICAgZFstLWldID0gc29hcF9iYXNlNjRvW20gJiAweDNGXTsKKyAgICBmb3IgKGkgPSAzOyBpID4gbjsgaS0tKQorICAgICAgZFtpXSA9ICc9JzsKKyAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBkLCA0KSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3Vuc2lnbmVkIGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2dldGJhc2U2NChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50ICpuLCBpbnQgbWFsbG9jX2ZsYWcpCit7IAorI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IHNvYXAtPmRvbS0+ZGF0YSA9IHNvYXBfc3RyaW5nX2luKHNvYXAsIDAsIC0xLCAtMSk7CisgICAgcmV0dXJuICh1bnNpZ25lZCBjaGFyKilzb2FwX2Jhc2U2NDJzKHNvYXAsIHNvYXAtPmRvbS0+ZGF0YSwgTlVMTCwgMCwgbik7CisgIH0KKyNlbmRpZgorI2lmZGVmIFdJVEhfRkFTVAorICBzb2FwLT5sYWJpZHggPSAwOworICBmb3IgKDs7KQorICB7IHJlZ2lzdGVyIGludCBpLCBrOworICAgIHJlZ2lzdGVyIGNoYXIgKnM7CisgICAgaWYgKHNvYXBfYXBwZW5kX2xhYihzb2FwLCBOVUxMLCAyKSkKKyAgICAgIHJldHVybiBOVUxMOworICAgIHMgPSBzb2FwLT5sYWJidWYgKyBzb2FwLT5sYWJpZHg7CisgICAgayA9IHNvYXAtPmxhYmxlbiAtIHNvYXAtPmxhYmlkeDsKKyAgICBzb2FwLT5sYWJpZHggPSAzICogKHNvYXAtPmxhYmxlbiAvIDMpOworICAgIGlmICghcykKKyAgICAgIHJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCBrIC0gMjsgaSArPSAzKQorICAgIHsgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBtID0gMDsKKyAgICAgIHJlZ2lzdGVyIGludCBqID0gMDsKKyAgICAgIGRvCisgICAgICB7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IHNvYXBfZ2V0KHNvYXApOworICAgICAgICBpZiAoYyA9PSAnPScgfHwgYyA8IDApCisgICAgICAgIHsgdW5zaWduZWQgY2hhciAqcDsKKyAgICAgICAgICBzd2l0Y2ggKGopCisgICAgICAgICAgeyBjYXNlIDI6CisgICAgICAgICAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gNCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiAxMCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiAyKSAmIDB4RkYpOworICAgICAgICAgICAgICBpICs9IDI7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChuKQorICAgICAgICAgICAgKm4gPSAoaW50KShzb2FwLT5sYWJsZW4gLSBrICsgaSk7CisgICAgICAgICAgcCA9ICh1bnNpZ25lZCBjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzb2FwLT5sYWJsZW4gLSBrICsgaSk7CisJICBpZiAocCkKKwkgICAgbWVtY3B5KHAsIHNvYXAtPmxhYmJ1Ziwgc29hcC0+bGFibGVuIC0gayArIGkpOworICAgICAgICAgIGlmIChjID49IDApCisgICAgICAgICAgeyB3aGlsZSAoKGludCkoKGMgPSBzb2FwX2dldChzb2FwKSkgIT0gRU9GKSAmJiBjICE9IFNPQVBfTFQgJiYgYyAhPSBTT0FQX1RUKQorICAgICAgICAgICAgICA7CisJICB9CisgICAgICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgfQorICAgICAgICBjIC09ICcrJzsKKyAgICAgICAgaWYgKGMgPj0gMCAmJiBjIDw9IDc5KQorICAgICAgICB7IG0gPSAobSA8PCA2KSArIHNvYXBfYmFzZTY0aVtjXTsKKyAgICAgICAgICBqKys7CisgICAgICAgIH0KKyAgICAgIH0gd2hpbGUgKGogPCA0KTsKKyAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gMTYpICYgMHhGRik7CisgICAgICAqcysrID0gKGNoYXIpKChtID4+IDgpICYgMHhGRik7CisgICAgICAqcysrID0gKGNoYXIpKG0gJiAweEZGKTsKKyAgICB9CisgIH0KKyNlbHNlCisgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgZm9yICg7OykKKyAgeyByZWdpc3RlciBpbnQgaTsKKyAgICByZWdpc3RlciBjaGFyICpzID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCAzICogU09BUF9CTEtMRU4pOyAvKiBtdXN0IGJlIG11bHRpcGxlIG9mIDMgKi8KKyAgICBpZiAoIXMpCisgICAgeyBzb2FwX2VuZF9ibG9jayhzb2FwKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgU09BUF9CTEtMRU47IGkrKykKKyAgICB7IHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbSA9IDA7CisgICAgICByZWdpc3RlciBpbnQgaiA9IDA7CisgICAgICBkbworICAgICAgeyByZWdpc3RlciBzb2FwX3djaGFyIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgICAgICAgaWYgKGMgPT0gJz0nIHx8IGMgPCAwKQorICAgICAgICB7IHVuc2lnbmVkIGNoYXIgKnA7CisgICAgICAgICAgaSAqPSAzOworICAgICAgICAgIHN3aXRjaCAoaikKKyAgICAgICAgICB7IGNhc2UgMjoKKyAgICAgICAgICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiA0KSAmIDB4RkYpOworICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAqcysrID0gKGNoYXIpKChtID4+IDEwKSAmIDB4RkYpOworICAgICAgICAgICAgICAqcysrID0gKGNoYXIpKChtID4+IDIpICYgMHhGRik7CisgICAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG4pCisJICAgICpuID0gKGludClzb2FwX3NpemVfYmxvY2soc29hcCwgaSk7CisgICAgICAgICAgcCA9ICh1bnNpZ25lZCBjaGFyKilzb2FwX3NhdmVfYmxvY2soc29hcCwgTlVMTCwgMCk7CisgICAgICAgICAgaWYgKGMgPj0gMCkKKyAgICAgICAgICB7IHdoaWxlICgoaW50KSgoYyA9IHNvYXBfZ2V0KHNvYXApKSAhPSBFT0YpICYmIGMgIT0gU09BUF9MVCAmJiBjICE9IFNPQVBfVFQpCisgICAgICAgICAgICAgIDsKKwkgIH0KKyAgICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICAgIHJldHVybiBwOworICAgICAgICB9CisgICAgICAgIGMgLT0gJysnOworICAgICAgICBpZiAoYyA+PSAwICYmIGMgPD0gNzkpCisgICAgICAgIHsgbSA9IChtIDw8IDYpICsgc29hcF9iYXNlNjRpW2NdOworICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAoaiA8IDQpOworICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiAxNikgJiAweEZGKTsKKyAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gOCkgJiAweEZGKTsKKyAgICAgICpzKysgPSAoY2hhcikobSAmIDB4RkYpOworICAgIH0KKyAgfQorI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfeG9wX2ZvcndhcmQoc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIGNoYXIgKipwdHIsIGludCAqc2l6ZSwgY2hhciAqKmlkLCBjaGFyICoqdHlwZSwgY2hhciAqKm9wdGlvbnMpCit7IC8qIENoZWNrIE1UT00geG9wOkluY2x1ZGUgZWxlbWVudCAod2l0aGluIGhleC9iYXNlNjRCaW5hcnkpICovCisgIC8qIFRPRE86IHRoaXMgY29kZSB0byBiZSBvYnNvbGV0ZWQgd2l0aCBuZXcgaW1wb3J0L3hvcC5oIGNvbnZlbnRpb25zICovCisgIGludCBib2R5ID0gc29hcC0+Ym9keTsgLyogc2hvdWxkIHNhdmUgdHlwZSB0b28/ICovCisgIGlmICghc29hcF9wZWVrX2VsZW1lbnQoc29hcCkpCisgIHsgaWYgKCFzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgInhvcDpJbmNsdWRlIiwgMCkgJiYgKnNvYXAtPmhyZWYpCisgICAgeyBpZiAoc29hcF9kaW1lX2ZvcndhcmQoc29hcCwgcHRyLCBzaXplLCBpZCwgdHlwZSwgb3B0aW9ucykpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCBOVUxMKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBzb2FwLT5ib2R5ID0gYm9keTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9kaW1lX2ZvcndhcmQoc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIGNoYXIgKipwdHIsIGludCAqc2l6ZSwgY2hhciAqKmlkLCBjaGFyICoqdHlwZSwgY2hhciAqKm9wdGlvbnMpCit7IHN0cnVjdCBzb2FwX3hsaXN0ICp4cCA9IChzdHJ1Y3Qgc29hcF94bGlzdCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX3hsaXN0KSk7CisgICpwdHIgPSBOVUxMOworICAqc2l6ZSA9IDA7CisgICppZCA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPmhyZWYpOworICAqdHlwZSA9IE5VTEw7CisgICpvcHRpb25zID0gTlVMTDsKKyAgaWYgKCF4cCkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgeHAtPm5leHQgPSBzb2FwLT54bGlzdDsKKyAgeHAtPnB0ciA9IHB0cjsKKyAgeHAtPnNpemUgPSBzaXplOworICB4cC0+aWQgPSAqaWQ7CisgIHhwLT50eXBlID0gdHlwZTsKKyAgeHAtPm9wdGlvbnMgPSBvcHRpb25zOworICBzb2FwLT54bGlzdCA9IHhwOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3N0cmR1cChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcykKK3sgY2hhciAqdCA9IE5VTEw7CisgIGlmIChzICYmICh0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihzKSArIDEpKSkKKyAgICBzdHJjcHkodCwgcyk7CisgIHJldHVybiB0OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX25ld19ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfYmxpc3QgKnA7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTmV3IGJsb2NrIHNlcXVlbmNlIChwcmV2PSVwKVxuIiwgc29hcC0+Ymxpc3QpKTsKKyAgaWYgKCEocCA9IChzdHJ1Y3Qgc29hcF9ibGlzdCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2JsaXN0KSkpKQorICAgIHJldHVybiBTT0FQX0VPTTsgICAKKyAgcC0+bmV4dCA9IHNvYXAtPmJsaXN0OyAKKyAgcC0+cHRyID0gTlVMTDsKKyAgcC0+c2l6ZSA9IDA7CisgIHNvYXAtPmJsaXN0ID0gcDsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkKgorU09BUF9GTUFDMgorc29hcF9wdXNoX2Jsb2NrKHN0cnVjdCBzb2FwICpzb2FwLCBzaXplX3QgbikKK3sgY2hhciAqcDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQdXNoIGJsb2NrIG9mICV1IGJ5dGVzICgldSBieXRlcyB0b3RhbClcbiIsICh1bnNpZ25lZCBpbnQpbiwgKHVuc2lnbmVkIGludClzb2FwLT5ibGlzdC0+c2l6ZSArICh1bnNpZ25lZCBpbnQpbikpOworICBpZiAoIShwID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIG4gKyBzaXplb2YoY2hhciopICsgc2l6ZW9mKHNpemVfdCkpKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHJldHVybiBOVUxMOworICB9CisgICooY2hhcioqKXAgPSBzb2FwLT5ibGlzdC0+cHRyOworICAqKHNpemVfdCopKHAgKyBzaXplb2YoY2hhciopKSA9IG47CisgIHNvYXAtPmJsaXN0LT5wdHIgPSBwOworICBzb2FwLT5ibGlzdC0+c2l6ZSArPSBuOworICByZXR1cm4gcCArIHNpemVvZihjaGFyKikgKyBzaXplb2Yoc2l6ZV90KTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfcG9wX2Jsb2NrKHN0cnVjdCBzb2FwICpzb2FwKQoreyBjaGFyICpwOworICBpZiAoIXNvYXAtPmJsaXN0LT5wdHIpCisgICAgcmV0dXJuOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlBvcCBibG9ja1xuIikpOworICBwID0gc29hcC0+Ymxpc3QtPnB0cjsKKyAgc29hcC0+Ymxpc3QtPnNpemUgLT0gKihzaXplX3QqKShwICsgc2l6ZW9mKGNoYXIqKSk7CisgIHNvYXAtPmJsaXN0LT5wdHIgPSAqKGNoYXIqKilwOworICBTT0FQX0ZSRUUoc29hcCwgcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQKK3NvYXBfdXBkYXRlX3B0cnMoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnN0YXJ0LCBjaGFyICplbmQsIGNoYXIgKnAxLCBjaGFyICpwMikKK3sgaW50IGk7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZmxpc3QgKmZwOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICByZWdpc3RlciBzdHJ1Y3Qgc29hcF94bGlzdCAqeHA7CisjZW5kaWYKKyAgcmVnaXN0ZXIgdm9pZCAqcCwgKipxOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9JREhBU0g7IGkrKykKKyAgeyBmb3IgKGlwID0gc29hcC0+aWh0W2ldOyBpcDsgaXAgPSBpcC0+bmV4dCkKKyAgICB7IGlmIChpcC0+cHRyICYmIChjaGFyKilpcC0+cHRyID49IHN0YXJ0ICYmIChjaGFyKilpcC0+cHRyIDwgZW5kKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVwZGF0ZSBpZD0nJXMnICVwIC0+ICVwXG4iLCBpcC0+aWQsIGlwLT5wdHIsIChjaGFyKilpcC0+cHRyICsgKHAxLXAyKSkpOworICAgICAgICBpcC0+cHRyID0gKGNoYXIqKWlwLT5wdHIgKyAocDEtcDIpOworICAgICAgfQorICAgICAgZm9yIChxID0gJmlwLT5saW5rOyBxOyBxID0gKHZvaWQqKilwKQorICAgICAgeyBwID0gKnE7CisgICAgICAgIGlmIChwICYmIChjaGFyKilwID49IHN0YXJ0ICYmIChjaGFyKilwIDwgZW5kKQorICAgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTGluayB1cGRhdGUgaWQ9JyVzJyAlcFxuIiwgaXAtPmlkLCBwKSk7CisgICAgICAgICAgKnEgPSAoY2hhciopcCArIChwMS1wMik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZvciAocSA9ICZpcC0+Y29weTsgcTsgcSA9ICh2b2lkKiopcCkKKyAgICAgIHsgcCA9ICpxOworICAgICAgICBpZiAocCAmJiAoY2hhciopcCA+PSBzdGFydCAmJiAoY2hhciopcCA8IGVuZCkKKyAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHkgY2hhaW4gdXBkYXRlIGlkPSclcycgJXBcbiIsIGlwLT5pZCwgcCkpOworICAgICAgICAgICpxID0gKGNoYXIqKXAgKyAocDEtcDIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBmb3IgKGZwID0gaXAtPmZsaXN0OyBmcDsgZnAgPSBmcC0+bmV4dCkKKyAgICAgIHsgaWYgKChjaGFyKilmcC0+cHRyID49IHN0YXJ0ICYmIChjaGFyKilmcC0+cHRyIDwgZW5kKQorICAgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weSBsaXN0IHVwZGF0ZSBpZD0nJXMnICVwXG4iLCBpcC0+aWQsIGZwKSk7CisgICAgICAgICAgZnAtPnB0ciA9IChjaGFyKilmcC0+cHRyICsgKHAxLXAyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBmb3IgKHhwID0gc29hcC0+eGxpc3Q7IHhwOyB4cCA9IHhwLT5uZXh0KQorICB7IGlmICh4cC0+cHRyICYmIChjaGFyKil4cC0+cHRyID49IHN0YXJ0ICYmIChjaGFyKil4cC0+cHRyIDwgZW5kKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVcGRhdGUgaWQ9JyVzJyAlcCAtPiAlcFxuIiwgeHAtPmlkP3hwLT5pZDoiIiwgeHAtPnB0ciwgKGNoYXIqKXhwLT5wdHIgKyAocDEtcDIpKSk7CisgICAgICB4cC0+cHRyID0gKHVuc2lnbmVkIGNoYXIqKikoKGNoYXIqKXhwLT5wdHIgKyAocDEtcDIpKTsKKyAgICAgIHhwLT5zaXplID0gKGludCopKChjaGFyKil4cC0+c2l6ZSArIChwMS1wMikpOworICAgICAgeHAtPnR5cGUgPSAoY2hhcioqKSgoY2hhciopeHAtPnR5cGUgKyAocDEtcDIpKTsKKyAgICAgIHhwLT5vcHRpb25zID0gKGNoYXIqKikoKGNoYXIqKXhwLT5vcHRpb25zICsgKHAxLXAyKSk7CisgICAgfQorICB9CisjZW5kaWYKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NvYXBfaGFzX2NvcGllcyhzdHJ1Y3Qgc29hcCAqc29hcCwgcmVnaXN0ZXIgY29uc3QgY2hhciAqc3RhcnQsIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKmVuZCkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZmxpc3QgKmZwOworICByZWdpc3RlciBjb25zdCBjaGFyICpwOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9JREhBU0g7IGkrKykKKyAgeyBmb3IgKGlwID0gc29hcC0+aWh0W2ldOyBpcDsgaXAgPSBpcC0+bmV4dCkKKyAgICB7IGZvciAocCA9IChjb25zdCBjaGFyKilpcC0+Y29weTsgcDsgcCA9ICooY29uc3QgY2hhcioqKXApCisgICAgICAgIGlmIChwID49IHN0YXJ0ICYmIHAgPCBlbmQpCisgICAgICAgICAgcmV0dXJuIFNPQVBfRVJSOworICAgICAgZm9yIChmcCA9IGlwLT5mbGlzdDsgZnA7IGZwID0gZnAtPm5leHQpCisgICAgICAgIGlmICgoY29uc3QgY2hhciopZnAtPnB0ciA+PSBzdGFydCAmJiAoY29uc3QgY2hhciopZnAtPnB0ciA8IGVuZCkKKwkgIHJldHVybiBTT0FQX0VSUjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVzb2x2ZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZmxpc3QgKmZwOworICBzaG9ydCBmbGFnOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc29sdmluZyBmb3J3YXJkZWQgZGF0YVxuIikpOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9JREhBU0g7IGkrKykKKyAgeyBmb3IgKGlwID0gc29hcC0+aWh0W2ldOyBpcDsgaXAgPSBpcC0+bmV4dCkKKyAgICB7IGlmIChpcC0+cHRyKQorICAgICAgeyByZWdpc3RlciB2b2lkICpwLCAqKnEsICpyOworICAgICAgICBxID0gKHZvaWQqKilpcC0+bGluazsKKyAgICAgICAgaXAtPmxpbmsgPSBOVUxMOworICAgICAgICByID0gaXAtPnB0cjsKKyAgICAgICAgREJHTE9HKFRFU1QsIGlmIChxKSBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVHJhdmVyc2luZyBsaW5rIGNoYWluIHRvIHJlc29sdmUgaWQ9JyVzJ1xuIiwgaXAtPmlkKSk7CisgICAgICAgIHdoaWxlIChxKQorICAgICAgICB7IHAgPSAqcTsKKyAgICAgICAgICAqcSA9IHI7CisgICAgICAgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIi4uLiBsaW5rICVwIC0+ICVwXG4iLCBxLCByKSk7CisgICAgICAgICAgcSA9ICh2b2lkKiopcDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSBpZiAoKmlwLT5pZCA9PSAnIycpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTWlzc2luZyBkYXRhIGZvciBpZD0nJXMnXG4iLCBpcC0+aWQpKTsKKyAgICAgICAgc3RyY3B5KHNvYXAtPmlkLCBpcC0+aWQgKyAxKTsKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9NSVNTSU5HX0lEOworICAgICAgfQorICAgIH0KKyAgfQorICBkbworICB7IGZsYWcgPSAwOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x1dGlvbiBwaGFzZVxuIikpOworICAgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0lESEFTSDsgaSsrKQorICAgIHsgZm9yIChpcCA9IHNvYXAtPmlodFtpXTsgaXA7IGlwID0gaXAtPm5leHQpCisgICAgICB7IGlmIChpcC0+cHRyICYmICFzb2FwX2hhc19jb3BpZXMoc29hcCwgKGNvbnN0IGNoYXIqKWlwLT5wdHIsIChjb25zdCBjaGFyKilpcC0+cHRyICsgaXAtPnNpemUpKQorICAgICAgICB7IGlmIChpcC0+Y29weSkKKyAgICAgICAgICB7IHJlZ2lzdGVyIHZvaWQgKnAsICoqcSA9ICh2b2lkKiopaXAtPmNvcHk7CisgICAgICAgICAgICBEQkdMT0coVEVTVCwgaWYgKHEpIFNPQVBfTUVTU0FHRShmZGVidWcsICJUcmF2ZXJzaW5nIGNvcHkgY2hhaW4gdG8gcmVzb2x2ZSBpZD0nJXMnXG4iLCBpcC0+aWQpKTsKKyAgICAgICAgICAgIGlwLT5jb3B5ID0gTlVMTDsKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiLi4uIGNvcHkgJXAgLT4gJXAgKCV1IGJ5dGVzKVxuIiwgaXAtPnB0ciwgcSwgKHVuc2lnbmVkIGludClpcC0+c2l6ZSkpOworCSAgICAgIHAgPSAqcTsKKyAgICAgICAgICAgICAgbWVtY3B5KHEsIGlwLT5wdHIsIGlwLT5zaXplKTsKKyAgICAgICAgICAgICAgcSA9ICh2b2lkKiopcDsKKyAgICAgICAgICAgIH0gd2hpbGUgKHEpOworCSAgICBmbGFnID0gMTsKKwkgIH0KKyAgICAgICAgICBmb3IgKGZwID0gaXAtPmZsaXN0OyBmcDsgZnAgPSBpcC0+Zmxpc3QpCisgICAgICAgICAgeyByZWdpc3RlciB1bnNpZ25lZCBpbnQgayA9IGZwLT5sZXZlbDsKKwkgICAgcmVnaXN0ZXIgdm9pZCAqcCA9IGlwLT5wdHI7CisgICAgICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc29sdmluZyBmb3J3YXJkZWQgZGF0YSB0eXBlPSVkIGxvY2F0aW9uPSVwIGxldmVsPSV1LCV1IGlkPSclcydcbiIsIGlwLT50eXBlLCBwLCBpcC0+bGV2ZWwsIGZwLT5sZXZlbCwgaXAtPmlkKSk7CisJICAgIHdoaWxlIChpcC0+bGV2ZWwgPCBrKQorICAgICAgICAgICAgeyByZWdpc3RlciB2b2lkICoqcSA9ICh2b2lkKiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHZvaWQqKSk7ICAKKwkgICAgICBpZiAoIXEpCisJICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisJICAgICAgKnEgPSBwOworICAgICAgICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlc2NlbmRpbmcgb25lIGxldmVsLCBuZXcgbG9jYXRpb249JXAgaG9sZHM9JXAuLi5cbiIsIHEsICpxKSk7CisgICAgICAgICAgICAgIHAgPSAodm9pZCopcTsKKyAgICAgICAgICAgICAgay0tOworICAgICAgICAgICAgfQorCSAgICBpZiAoZnAtPmZjb3B5KQorCSAgICAgIGZwLT5mY29weShzb2FwLCBpcC0+dHlwZSwgZnAtPnR5cGUsIGZwLT5wdHIsIGZwLT5sZW4sIHAsIGlwLT5zaXplKTsKKwkgICAgZWxzZQorCSAgICAgIHNvYXBfZmNvcHkoc29hcCwgaXAtPnR5cGUsIGZwLT50eXBlLCBmcC0+cHRyLCBmcC0+bGVuLCBwLCBpcC0+c2l6ZSk7CisJICAgIGlwLT5mbGlzdCA9IGZwLT5uZXh0OworCSAgICBTT0FQX0ZSRUUoc29hcCwgZnApOworCSAgICBmbGFnID0gMTsKKwkgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSB3aGlsZSAoZmxhZyk7CisjaWZkZWYgU09BUF9ERUJVRworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9JREhBU0g7IGkrKykKKyAgeyBmb3IgKGlwID0gc29hcC0+aWh0W2ldOyBpcDsgaXAgPSBpcC0+bmV4dCkKKyAgICB7IGlmIChpcC0+Y29weSB8fCBpcC0+Zmxpc3QpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x1dGlvbiBlcnJvcjogZm9yd2FyZGVkIGRhdGEgZm9yIGlkPSclcycgY291bGQgbm90IGJlIHByb3BhZ2F0ZWQsIHBsZWFzZSByZXBvcnQgdGhpcyBwcm9ibGVtIHRvIHRoZSBkZXZlbG9wZXJzXG4iLCBpcC0+aWQpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyNlbmRpZgorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc29sdXRpb24gZG9uZVxuIikpOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc2l6ZV90CitTT0FQX0ZNQUMyCitzb2FwX3NpemVfYmxvY2soc3RydWN0IHNvYXAgKnNvYXAsIHNpemVfdCBuKQoreyBpZiAoc29hcC0+Ymxpc3QtPnB0cikKKyAgeyBzb2FwLT5ibGlzdC0+c2l6ZSAtPSAqKHNpemVfdCopKHNvYXAtPmJsaXN0LT5wdHIgKyBzaXplb2YoY2hhciopKSAtIG47CisgICAgKihzaXplX3QqKShzb2FwLT5ibGlzdC0+cHRyICsgc2l6ZW9mKGNoYXIqKSkgPSBuOworICB9CisgIHJldHVybiBzb2FwLT5ibGlzdC0+c2l6ZTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2ZpcnN0X2Jsb2NrKHN0cnVjdCBzb2FwICpzb2FwKQoreyBjaGFyICpwLCAqcSwgKnI7CisgIHAgPSBzb2FwLT5ibGlzdC0+cHRyOworICBpZiAoIXApCisgICAgcmV0dXJuIE5VTEw7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRmlyc3QgYmxvY2tcbiIpKTsKKyAgciA9IE5VTEw7CisgIGRvCisgIHsgcSA9ICooY2hhcioqKXA7CisgICAgKihjaGFyKiopcCA9IHI7CisgICAgciA9IHA7CisgICAgcCA9IHE7CisgIH0gd2hpbGUgKHApOworICBzb2FwLT5ibGlzdC0+cHRyID0gcjsKKyAgcmV0dXJuIHIgKyBzaXplb2YoY2hhciopICsgc2l6ZW9mKHNpemVfdCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjaGFyKgorU09BUF9GTUFDMgorc29hcF9uZXh0X2Jsb2NrKHN0cnVjdCBzb2FwICpzb2FwKQoreyBjaGFyICpwOworICBwID0gc29hcC0+Ymxpc3QtPnB0cjsKKyAgaWYgKHApCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJOZXh0IGJsb2NrXG4iKSk7CisgICAgc29hcC0+Ymxpc3QtPnB0ciA9ICooY2hhcioqKXA7CisgICAgU09BUF9GUkVFKHNvYXAsIHApOworICAgIGlmIChzb2FwLT5ibGlzdC0+cHRyKQorICAgICAgcmV0dXJuIHNvYXAtPmJsaXN0LT5wdHIgKyBzaXplb2YoY2hhciopICsgc2l6ZW9mKHNpemVfdCk7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzaXplX3QKK1NPQVBfRk1BQzIKK3NvYXBfYmxvY2tfc2l6ZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmV0dXJuICooc2l6ZV90Kikoc29hcC0+Ymxpc3QtPnB0ciArIHNpemVvZihjaGFyKikpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9lbmRfYmxvY2soc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX2JsaXN0ICpicDsKKyAgY2hhciAqcCwgKnE7CisgIGJwID0gc29hcC0+Ymxpc3Q7CisgIGlmIChicCkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBvZiBibG9jayBzZXF1ZW5jZSwgZnJlZSBhbGwgcmVtYWluaW5nIGJsb2Nrc1xuIikpOworICAgIGZvciAocCA9IGJwLT5wdHI7IHA7IHAgPSBxKQorICAgIHsgcSA9ICooY2hhcioqKXA7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgcCk7CisgICAgfQorICAgIHNvYXAtPmJsaXN0ID0gYnAtPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIGJwKTsKKyAgfQorICBEQkdMT0coVEVTVCwgaWYgKHNvYXAtPmJsaXN0KSBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzdG9yZSBwcmV2aW91cyBibG9jayBzZXF1ZW5jZVxuIikpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfc2F2ZV9ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqcCwgaW50IGZsYWcpCit7IHJlZ2lzdGVyIHNpemVfdCBuOworICByZWdpc3RlciBjaGFyICpxLCAqczsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTYXZlIGFsbCBibG9ja3MgaW4gY29udGlndW91cyBtZW1vcnkgc3BhY2Ugb2YgJXUgYnl0ZXMgKCVwLT4lcClcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+Ymxpc3QtPnNpemUsIHNvYXAtPmJsaXN0LT5wdHIsIHApKTsKKyAgaWYgKHNvYXAtPmJsaXN0LT5zaXplKQorICB7IGlmICghcCkKKyAgICAgIHAgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc29hcC0+Ymxpc3QtPnNpemUpOworICAgIGlmIChwKQorICAgIHsgZm9yIChzID0gcCwgcSA9IHNvYXBfZmlyc3RfYmxvY2soc29hcCk7IHE7IHEgPSBzb2FwX25leHRfYmxvY2soc29hcCkpCisgICAgICB7IG4gPSBzb2FwX2Jsb2NrX3NpemUoc29hcCk7CisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICAgICAgICBpZiAoZmxhZykKKwkgIHNvYXBfdXBkYXRlX3B0cnMoc29hcCwgcSwgcSArIG4sIHMsIHEpOworI2VuZGlmCisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weSAldSBieXRlcyBmcm9tICVwIHRvICVwXG4iLCAodW5zaWduZWQgaW50KW4sIHEsIHMpKTsKKyAgICAgICAgbWVtY3B5KHMsIHEsIG4pOworICAgICAgICBzICs9IG47CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgIH0KKyAgc29hcF9lbmRfYmxvY2soc29hcCk7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3B1dHNpemUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBzaXplKQoreyByZXR1cm4gc29hcF9wdXRzaXplcyhzb2FwLCB0eXBlLCAmc2l6ZSwgMSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfcHV0c2l6ZXMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGludCAqc2l6ZSwgaW50IGRpbSkKK3sgcmV0dXJuIHNvYXBfcHV0c2l6ZXNvZmZzZXRzKHNvYXAsIHR5cGUsIHNpemUsIE5VTEwsIGRpbSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfcHV0c2l6ZXNvZmZzZXRzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBpbnQgKnNpemUsIGNvbnN0IGludCAqb2Zmc2V0LCBpbnQgZGltKQoreyBpbnQgaTsKKyAgaWYgKCF0eXBlKQorICAgIHJldHVybiBOVUxMOworICBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICB7IHNwcmludGYoc29hcC0+dHlwZSwgIiVzWyVkIiwgdHlwZSwgc2l6ZVswXSk7CisgICAgZm9yIChpID0gMTsgaSA8IGRpbTsgaSsrKQorICAgICAgc3ByaW50Zihzb2FwLT50eXBlICsgc3RybGVuKHNvYXAtPnR5cGUpLCAiICVkIiwgc2l6ZVtpXSk7CisgIH0KKyAgZWxzZQorICB7IGlmIChvZmZzZXQpCisgICAgeyBzcHJpbnRmKHNvYXAtPnR5cGUsICIlc1slZCIsIHR5cGUsIHNpemVbMF0gKyBvZmZzZXRbMF0pOworICAgICAgZm9yIChpID0gMTsgaSA8IGRpbTsgaSsrKQorICAgICAgICBzcHJpbnRmKHNvYXAtPnR5cGUgKyBzdHJsZW4oc29hcC0+dHlwZSksICIsJWQiLCBzaXplW2ldICsgb2Zmc2V0W2ldKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgc3ByaW50Zihzb2FwLT50eXBlLCAiJXNbJWQiLCB0eXBlLCBzaXplWzBdKTsKKyAgICAgIGZvciAoaSA9IDE7IGkgPCBkaW07IGkrKykKKyAgICAgICAgc3ByaW50Zihzb2FwLT50eXBlICsgc3RybGVuKHNvYXAtPnR5cGUpLCAiLCVkIiwgc2l6ZVtpXSk7CisgICAgfQorICAgIHN0cmNhdChzb2FwLT50eXBlLCAiXSIpOworICB9CisgIHJldHVybiBzb2FwLT50eXBlOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3B1dG9mZnNldChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG9mZnNldCkKK3sgcmV0dXJuIHNvYXBfcHV0b2Zmc2V0cyhzb2FwLCAmb2Zmc2V0LCAxKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9wdXRvZmZzZXRzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBpbnQgKm9mZnNldCwgaW50IGRpbSkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHNwcmludGYoc29hcC0+YXJyYXlPZmZzZXQsICJbJWQiLCBvZmZzZXRbMF0pOworICBmb3IgKGkgPSAxOyBpIDwgZGltOyBpKyspCisgICAgc3ByaW50Zihzb2FwLT5hcnJheU9mZnNldCArIHN0cmxlbihzb2FwLT5hcnJheU9mZnNldCksICIsJWQiLCBvZmZzZXRbaV0pOworICBzdHJjYXQoc29hcC0+YXJyYXlPZmZzZXQsICJdIik7CisgIHJldHVybiBzb2FwLT5hcnJheU9mZnNldDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zaXplKGNvbnN0IGludCAqc2l6ZSwgaW50IGRpbSkKK3sgcmVnaXN0ZXIgaW50IGksIG4gPSBzaXplWzBdOworICBmb3IgKGkgPSAxOyBpIDwgZGltOyBpKyspCisgICAgbiAqPSBzaXplW2ldOworICByZXR1cm4gbjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRvZmZzZXRzKGNvbnN0IGNoYXIgKmF0dHIsIGNvbnN0IGludCAqc2l6ZSwgaW50ICpvZmZzZXQsIGludCBkaW0pCit7IHJlZ2lzdGVyIGludCBpLCBqID0gMDsKKyAgaWYgKG9mZnNldCkKKyAgICBmb3IgKGkgPSAwOyBpIDwgZGltICYmIGF0dHIgJiYgKmF0dHI7IGkrKykKKyAgICB7IGF0dHIrKzsKKyAgICAgIGogKj0gc2l6ZVtpXTsKKyAgICAgIGogKz0gb2Zmc2V0W2ldID0gKGludClhdG9sKGF0dHIpOworICAgICAgYXR0ciA9IHN0cmNocihhdHRyLCAnLCcpOworICAgIH0KKyAgZWxzZQorICAgIGZvciAoaSA9IDA7IGkgPCBkaW0gJiYgYXR0ciAmJiAqYXR0cjsgaSsrKQorICAgIHsgYXR0cisrOworICAgICAgaiAqPSBzaXplW2ldOworICAgICAgaiArPSAoaW50KWF0b2woYXR0cik7CisgICAgICBhdHRyID0gc3RyY2hyKGF0dHIsICcsJyk7CisgICAgfQorICByZXR1cm4gajsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRzaXplKGNvbnN0IGNoYXIgKmF0dHIxLCBjb25zdCBjaGFyICphdHRyMiwgaW50ICpqKQoreyByZWdpc3RlciBpbnQgbiwgazsKKyAgY2hhciAqczsKKyAgKmogPSAwOworICBpZiAoISphdHRyMSkKKyAgICByZXR1cm4gLTE7CisgIGlmICgqYXR0cjEgPT0gJ1snKQorICAgIGF0dHIxKys7CisgIG4gPSAxOworICBmb3IgKDs7KQorICB7IGsgPSAoaW50KXNvYXBfc3RydG9sKGF0dHIxLCAmcywgMTApOworICAgIG4gKj0gazsKKyAgICBpZiAoayA8IDAgfHwgbiA+IFNPQVBfTUFYQVJSQVlTSVpFIHx8IHMgPT0gYXR0cjEpCisgICAgICByZXR1cm4gLTE7CisgICAgYXR0cjEgPSBzdHJjaHIocywgJywnKTsKKyAgICBpZiAoIWF0dHIxKQorICAgICAgYXR0cjEgPSBzdHJjaHIocywgJyAnKTsKKyAgICBpZiAoYXR0cjIgJiYgKmF0dHIyKQorICAgIHsgYXR0cjIrKzsKKyAgICAgICpqICo9IGs7CisgICAgICBrID0gKGludClzb2FwX3N0cnRvbChhdHRyMiwgJnMsIDEwKTsKKyAgICAgICpqICs9IGs7CisgICAgICBpZiAoayA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGF0dHIyID0gczsKKyAgICB9CisgICAgaWYgKCFhdHRyMSkKKyAgICAgIGJyZWFrOworICAgIGF0dHIxKys7CisgIH0KKyAgcmV0dXJuIG4gLSAqajsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRzaXplcyhjb25zdCBjaGFyICphdHRyLCBpbnQgKnNpemUsIGludCBkaW0pCit7IHJlZ2lzdGVyIGludCBpLCBrLCBuOworICBpZiAoISphdHRyKQorICAgIHJldHVybiAtMTsKKyAgaSA9IHN0cmxlbihhdHRyKTsKKyAgbiA9IDE7CisgIGRvCisgIHsgZm9yIChpID0gaS0xOyBpID49IDA7IGktLSkKKyAgICAgIGlmIChhdHRyW2ldID09ICdbJyB8fCBhdHRyW2ldID09ICcsJyB8fCBhdHRyW2ldID09ICcgJykKKyAgICAgICAgYnJlYWs7CisgICAgayA9IChpbnQpYXRvbChhdHRyICsgaSArIDEpOworICAgIG4gKj0gc2l6ZVstLWRpbV0gPSBrOworICAgIGlmIChrIDwgMCB8fCBuID4gU09BUF9NQVhBUlJBWVNJWkUpCisgICAgICByZXR1cm4gLTE7CisgIH0gd2hpbGUgKGkgPj0gMCAmJiBhdHRyW2ldICE9ICdbJyk7CisgIHJldHVybiBuOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldHBvc2l0aW9uKGNvbnN0IGNoYXIgKmF0dHIsIGludCAqcG9zKQoreyByZWdpc3RlciBpbnQgaSwgbjsKKyAgaWYgKCEqYXR0cikKKyAgICByZXR1cm4gLTE7CisgIG4gPSAwOworICBpID0gMTsKKyAgZG8KKyAgeyBwb3NbbisrXSA9IChpbnQpYXRvbChhdHRyICsgaSk7CisgICAgd2hpbGUgKGF0dHJbaV0gJiYgYXR0cltpXSAhPSAnLCcgJiYgYXR0cltpXSAhPSAnXScpCisgICAgICBpKys7CisgICAgaWYgKGF0dHJbaV0gPT0gJywnKQorICAgICAgaSsrOworICB9IHdoaWxlIChuIDwgU09BUF9NQVhESU1TICYmIGF0dHJbaV0gJiYgYXR0cltpXSAhPSAnXScpOworICByZXR1cm4gbjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXNoX25hbWVzcGFjZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKm5zKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnA7CisgIHJlZ2lzdGVyIHN0cnVjdCBOYW1lc3BhY2UgKnA7CisgIHJlZ2lzdGVyIHNob3J0IGkgPSAtMTsKKyAgcmVnaXN0ZXIgc2l6ZV90IG4sIGs7CisgIG4gPSBzdHJsZW4oaWQpOworICBrID0gc3RybGVuKG5zKSArIDE7CisgIHAgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzOworICBpZiAocCkKKyAgeyBmb3IgKGkgPSAwOyBwLT5pZDsgcCsrLCBpKyspCisgICAgeyBpZiAocC0+bnMgJiYgIXN0cmNtcChucywgcC0+bnMpKQorICAgICAgeyBpZiAocC0+b3V0KQorICAgICAgICB7IFNPQVBfRlJFRShzb2FwLCBwLT5vdXQpOworICAgICAgICAgIHAtPm91dCA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAocC0+b3V0KQorICAgICAgeyBpZiAoIXN0cmNtcChucywgcC0+b3V0KSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHAtPmluKQorICAgICAgeyBpZiAoIXNvYXBfdGFnX2NtcChucywgcC0+aW4pKQorICAgICAgICB7IGlmICgocC0+b3V0ID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIGspKSkKKyAgICAgICAgICAgIHN0cmNweShwLT5vdXQsIG5zKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAoIXAgfHwgIXAtPmlkKQorICAgICAgaSA9IC0xOworICB9CisgIGlmIChpID49IDApCisgICAgayA9IDA7CisgIG5wID0gKHN0cnVjdCBzb2FwX25saXN0KilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfbmxpc3QpICsgbiArIGspOworICBpZiAoIW5wKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICBucC0+bmV4dCA9IHNvYXAtPm5saXN0OworICBzb2FwLT5ubGlzdCA9IG5wOworICBucC0+bGV2ZWwgPSBzb2FwLT5sZXZlbDsKKyAgbnAtPmluZGV4ID0gaTsKKyAgc3RyY3B5KG5wLT5pZCwgaWQpOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlB1c2ggbmFtZXNwYWNlIGJpbmRpbmcgKGxldmVsPSV1KSAnJXMnICclcydcbiIsIHNvYXAtPmxldmVsLCBpZCwgbnMpKTsKKyAgaWYgKGkgPCAwKQorICB7IG5wLT5ucyA9IG5wLT5pZCArIG4gKyAxOworICAgIHN0cmNweShucC0+bnMsIG5zKTsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlB1c2ggTk9UIE9LOiBubyBtYXRjaCBmb3VuZCBmb3IgJyVzJyBpbiBuYW1lc3BhY2UgbWFwcGluZyB0YWJsZSAoYWRkZWQgdG8gc3RhY2sgYW55d2F5KVxuIiwgbnMpKTsKKyAgfQorICBlbHNlCisgIHsgbnAtPm5zID0gTlVMTDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlB1c2ggT0sgKCclcycgbWF0Y2hlcyAnJXMnIGluIG5hbWVzcGFjZSB0YWJsZSlcbiIsIGlkLCBwLT5pZCkpOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9wb3BfbmFtZXNwYWNlKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnA7CisgIHdoaWxlIChzb2FwLT5ubGlzdCAmJiBzb2FwLT5ubGlzdC0+bGV2ZWwgPj0gc29hcC0+bGV2ZWwpCisgIHsgbnAgPSBzb2FwLT5ubGlzdC0+bmV4dDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlBvcHBlZCBuYW1lc3BhY2UgYmluZGluZyAobGV2ZWw9JXUpICclcydcbiIsIHNvYXAtPmxldmVsLCBzb2FwLT5ubGlzdC0+aWQpKTsKKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+bmxpc3QpOworICAgIHNvYXAtPm5saXN0ID0gbnA7CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9tYXRjaF9uYW1lc3BhY2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkMSwgY29uc3QgY2hhciAqaWQyLCBpbnQgbjEsIGludCBuMikgCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucCA9IHNvYXAtPm5saXN0OworICB3aGlsZSAobnAgJiYgKHN0cm5jbXAobnAtPmlkLCBpZDEsIG4xKSB8fCBucC0+aWRbbjFdKSkKKyAgICBucCA9IG5wLT5uZXh0OworICBpZiAobnApCisgIHsgaWYgKG5wLT5pbmRleCA8IDAKKyAgICAgfHwgKHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbbnAtPmluZGV4XS5pZAorICAgICAgJiYgKHN0cm5jbXAoc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tucC0+aW5kZXhdLmlkLCBpZDIsIG4yKQorICAgICAgIHx8IHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbbnAtPmluZGV4XS5pZFtuMl0pKSkKKyAgICAgIHJldHVybiBTT0FQX05BTUVTUEFDRTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICBpZiAobjEgPT0gMyAmJiBuMSA9PSBuMiAmJiAhc3RyY21wKGlkMSwgInhtbCIpICYmICFzdHJjbXAoaWQxLCBpZDIpKQorICAgIHJldHVybiBTT0FQX09LOworICByZXR1cm4gU09BUF9TWU5UQVhfRVJST1I7IAorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfY3VycmVudF9uYW1lc3BhY2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZykKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wOworICByZWdpc3RlciBjb25zdCBjaGFyICpzOworICBucCA9IHNvYXAtPm5saXN0OworICBpZiAoIShzID0gc3RyY2hyKHRhZywgJzonKSkpCisgIHsgd2hpbGUgKG5wICYmICpucC0+aWQpIC8qIGZpbmQgZGVmYXVsdCBuYW1lc3BhY2UsIGlmIHByZXNlbnQgKi8KKyAgICAgIG5wID0gbnAtPm5leHQ7CisgIH0KKyAgZWxzZQorICB7IHdoaWxlIChucCAmJiAoc3RybmNtcChucC0+aWQsIHRhZywgcyAtIHRhZykgfHwgbnAtPmlkW3MgLSB0YWddKSkKKyAgICAgIG5wID0gbnAtPm5leHQ7CisgICAgaWYgKCFucCkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9OQU1FU1BBQ0U7CisgIH0KKyAgaWYgKG5wKQorICB7IGlmIChucC0+aW5kZXggPj0gMCkKKyAgICAgIHJldHVybiBzb2FwLT5uYW1lc3BhY2VzW25wLT5pbmRleF0ubnM7CisgICAgaWYgKG5wLT5ucykKKyAgICAgIHJldHVybiBzb2FwX3N0cmR1cChzb2FwLCBucC0+bnMpOworICB9CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3RhZ19jbXAoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqdCkKK3sgZm9yICg7OykKKyAgeyByZWdpc3RlciBpbnQgYzEgPSAqczsKKyAgICByZWdpc3RlciBpbnQgYzIgPSAqdDsKKyAgICBpZiAoIWMxIHx8IGMxID09ICciJykKKyAgICAgIGJyZWFrOworICAgIGlmIChjMiAhPSAnLScpCisgICAgeyBpZiAoYzEgIT0gYzIpCisgICAgICB7IGlmIChjMSA+PSAnQScgJiYgYzEgPD0gJ1onKQorICAgICAgICAgIGMxICs9ICdhJyAtICdBJzsKKyAgICAgICAgaWYgKGMyID49ICdBJyAmJiBjMiA8PSAnWicpCisgICAgICAgICAgYzIgKz0gJ2EnIC0gJ0EnOworICAgICAgfQorICAgICAgaWYgKGMxICE9IGMyKQorICAgICAgeyBpZiAoYzIgIT0gJyonKQorICAgICAgICAgIHJldHVybiAxOworCWMyID0gKisrdDsKKyAgICAgICAgaWYgKCFjMikKKwkgIHJldHVybiAwOworICAgICAgICBpZiAoYzIgPj0gJ0EnICYmIGMyIDw9ICdaJykKKyAgICAgICAgICBjMiArPSAnYScgLSAnQSc7CisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsgYzEgPSAqczsKKwkgIGlmICghYzEgfHwgYzEgPT0gJyInKQorCSAgICBicmVhazsKKwkgIGlmIChjMSA+PSAnQScgJiYgYzEgPD0gJ1onKQorICAgICAgICAgICAgYzEgKz0gJ2EnIC0gJ0EnOworICAgICAgICAgIGlmIChjMSA9PSBjMiAmJiAhc29hcF90YWdfY21wKHMgKyAxLCB0ICsgMSkpCisgICAgICAgICAgICByZXR1cm4gMDsKKwkgIHMrKzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgcysrOworICAgIHQrKzsKKyAgfQorICBpZiAoKnQgPT0gJyonICYmICF0WzFdKQorICAgIHJldHVybiAwOworICByZXR1cm4gKnQ7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfbWF0Y2hfdGFnKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcxLCBjb25zdCBjaGFyICp0YWcyKQoreyByZWdpc3RlciBjb25zdCBjaGFyICpzLCAqdDsKKyAgaWYgKCF0YWcxIHx8ICF0YWcyIHx8ICEqdGFnMikKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgcyA9IHN0cmNocih0YWcxLCAnOicpOworICB0ID0gc3RyY2hyKHRhZzIsICc6Jyk7CisgIGlmICh0KQorICB7IGlmIChzKQorICAgIHsgaWYgKHRbMV0gJiYgU09BUF9TVFJDTVAocyArIDEsIHQgKyAxKSkKKyAgICAgICAgcmV0dXJuIFNPQVBfVEFHX01JU01BVENIOworICAgICAgaWYgKHQgIT0gdGFnMiAmJiBzb2FwX21hdGNoX25hbWVzcGFjZShzb2FwLCB0YWcxLCB0YWcyLCBzIC0gdGFnMSwgdCAtIHRhZzIpKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlRhZ3MgJyVzJyBhbmQgJyVzJyBtYXRjaCBidXQgbmFtZXNwYWNlcyBkaWZmZXJcbiIsIHRhZzEsIHRhZzIpKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfVEFHX01JU01BVENIOworICAgICAgfQorICAgIH0gCisgICAgZWxzZSBpZiAoU09BUF9TVFJDTVAodGFnMSwgdCArIDEpKQorICAgICAgcmV0dXJuIFNPQVBfVEFHX01JU01BVENIOworICAgIGVsc2UgaWYgKHQgIT0gdGFnMiAmJiBzb2FwX21hdGNoX25hbWVzcGFjZShzb2FwLCB0YWcxLCB0YWcyLCAwLCB0IC0gdGFnMikpCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlRhZ3MgJyVzJyBhbmQgJyVzJyBtYXRjaCBidXQgbmFtZXNwYWNlcyBkaWZmZXJcbiIsIHRhZzEsIHRhZzIpKTsKKyAgICAgIHJldHVybiBTT0FQX1RBR19NSVNNQVRDSDsKKyAgICB9CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJUYWdzIGFuZCAoZGVmYXVsdCkgbmFtZXNwYWNlcyBtYXRjaDogJyVzJyAnJXMnXG4iLCB0YWcxLCB0YWcyKSk7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgaWYgKHMpCisgIHsgaWYgKFNPQVBfU1RSQ01QKHMgKyAxLCB0YWcyKSkKKyAgICAgIHJldHVybiBTT0FQX1RBR19NSVNNQVRDSDsKKyAgfQorICBlbHNlIGlmIChTT0FQX1NUUkNNUCh0YWcxLCB0YWcyKSkKKyAgICByZXR1cm4gU09BUF9UQUdfTUlTTUFUQ0g7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVGFncyBtYXRjaDogJyVzJyAnJXMnXG4iLCB0YWcxLCB0YWcyKSk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX21hdGNoX2FycmF5KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0eXBlKQoreyBpZiAoKnNvYXAtPmFycmF5VHlwZSkKKyAgICBpZiAoc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+YXJyYXlUeXBlLCB0eXBlKQorICAgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT5hcnJheVR5cGUsICJ4c2Q6YW55VHlwZSIpCisgICAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPmFycmF5VHlwZSwgInhzZDp1ci10eXBlIikKKyAgICApCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFycmF5IHR5cGUgbWlzbWF0Y2g6ICclcycgJyVzJ1xuIiwgc29hcC0+YXJyYXlUeXBlLCB0eXBlKSk7CisgICAgICByZXR1cm4gU09BUF9UQUdfTUlTTUFUQ0g7CisgICAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqCVNTTAorICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBXSVRIX09QRU5TU0wKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JhbmQoKQoreyB1bnNpZ25lZCBjaGFyIGJ1Zls0XTsKKyAgaWYgKCFzc2xfaW5pdF9kb25lKQorICAgIHNvYXBfc3NsX2luaXQoKTsKKyAgUkFORF9wc2V1ZG9fYnl0ZXMoYnVmLCA0KTsKKyAgcmV0dXJuICooaW50KilidWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc3NsX3NlcnZlcl9jb250ZXh0KHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBzaG9ydCBmbGFncywgY29uc3QgY2hhciAqa2V5ZmlsZSwgY29uc3QgY2hhciAqcGFzc3dvcmQsIGNvbnN0IGNoYXIgKmNhZmlsZSwgY29uc3QgY2hhciAqY2FwYXRoLCBjb25zdCBjaGFyICpkaGZpbGUsIGNvbnN0IGNoYXIgKnJhbmRmaWxlLCBjb25zdCBjaGFyICpzaWQpCit7IGludCBlcnI7CisgIHNvYXAtPmtleWZpbGUgPSBrZXlmaWxlOworICBzb2FwLT5wYXNzd29yZCA9IHBhc3N3b3JkOworICBzb2FwLT5jYWZpbGUgPSBjYWZpbGU7CisgIHNvYXAtPmNhcGF0aCA9IGNhcGF0aDsKKyAgaWYgKGRoZmlsZSkKKyAgeyBzb2FwLT5kaGZpbGUgPSBkaGZpbGU7CisgICAgc29hcC0+cnNhID0gMDsKKyAgfQorICBlbHNlCisgIHsgc29hcC0+ZGhmaWxlID0gTlVMTDsKKyAgICBzb2FwLT5yc2EgPSAxOworICB9CisgIHNvYXAtPnJhbmRmaWxlID0gcmFuZGZpbGU7CisgIHNvYXAtPnJlcXVpcmVfY2xpZW50X2F1dGggPSAoZmxhZ3MgJiBTT0FQX1NTTF9SRVFVSVJFX0NMSUVOVF9BVVRIRU5USUNBVElPTik7CisgIGlmICghKGVyciA9IHNvYXAtPmZzc2xhdXRoKHNvYXApKSkKKyAgeyBpZiAoc2lkKQorICAgICAgU1NMX0NUWF9zZXRfc2Vzc2lvbl9pZF9jb250ZXh0KHNvYXAtPmN0eCwgKHVuc2lnbmVkIGNoYXIqKXNpZCwgc3RybGVuKHNpZCkpOworICB9CisgIHJldHVybiBlcnI7IAorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NzbF9jbGllbnRfY29udGV4dChzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgc2hvcnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmtleWZpbGUsIGNvbnN0IGNoYXIgKnBhc3N3b3JkLCBjb25zdCBjaGFyICpjYWZpbGUsIGNvbnN0IGNoYXIgKmNhcGF0aCwgY29uc3QgY2hhciAqcmFuZGZpbGUpCit7IHNvYXAtPmtleWZpbGUgPSBrZXlmaWxlOworICBzb2FwLT5wYXNzd29yZCA9IHBhc3N3b3JkOworICBzb2FwLT5jYWZpbGUgPSBjYWZpbGU7CisgIHNvYXAtPmNhcGF0aCA9IGNhcGF0aDsKKyAgc29hcC0+ZGhmaWxlID0gTlVMTDsKKyAgc29hcC0+cnNhID0gMDsKKyAgc29hcC0+cmFuZGZpbGUgPSByYW5kZmlsZTsKKyAgc29hcC0+cmVxdWlyZV9zZXJ2ZXJfYXV0aCA9IChmbGFncyAmIFNPQVBfU1NMX1JFUVVJUkVfU0VSVkVSX0FVVEhFTlRJQ0FUSU9OKTsKKyAgcmV0dXJuIHNvYXAtPmZzc2xhdXRoKHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zc2xfaW5pdCgpCit7IC8qIE5vdGU6IGZvciBNVCBzeXN0ZW1zLCB0aGUgbWFpbiBwcm9ncmFtIE1VU1QgY2FsbCBzb2FwX3NzbF9pbml0KCkgYmVmb3JlIGFueSB0aHJlYWRzIGFyZSBzdGFydGVkICovCisgIGlmICghc3NsX2luaXRfZG9uZSkKKyAgeyBzc2xfaW5pdF9kb25lID0gMTsKKyAgICBTU0xfbGlicmFyeV9pbml0KCk7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIFNTTF9sb2FkX2Vycm9yX3N0cmluZ3MoKTsKKyNlbmRpZgorICAgIGlmICghUkFORF9sb2FkX2ZpbGUoIi9kZXYvdXJhbmRvbSIsIDEwMjQpKQorICAgIHsgY2hhciBidWZbMTAyNF07CisgICAgICBSQU5EX3NlZWQoYnVmLCBzaXplb2YoYnVmKSk7CisgICAgICB3aGlsZSAoIVJBTkRfc3RhdHVzKCkpCisgICAgICB7IGludCByID0gcmFuZCgpOworICAgICAgICBSQU5EX3NlZWQoJnIsIHNpemVvZihpbnQpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBjb25zdCBjaGFyICoKK3NzbF9lcnJvcihzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHJldCkKK3sgaW50IGVyciA9IFNTTF9nZXRfZXJyb3Ioc29hcC0+c3NsLCByZXQpOworICBjb25zdCBjaGFyICptc2cgPSBzb2FwX3N0cl9jb2RlKGhfc3NsX2Vycm9yX2NvZGVzLCBlcnIpOworICBpZiAobXNnKQorICAgIHN0cmNweShzb2FwLT5tc2didWYsIG1zZyk7CisgIGVsc2UKKyAgICByZXR1cm4gRVJSX2Vycm9yX3N0cmluZyhlcnIsIHNvYXAtPm1zZ2J1Zik7CisgIGlmIChFUlJfcGVla19lcnJvcigpKQorICB7IHVuc2lnbmVkIGxvbmcgcjsKKyAgICBzdHJjYXQoc29hcC0+bXNnYnVmLCAiXG4iKTsKKyAgICB3aGlsZSAoKHIgPSBFUlJfZ2V0X2Vycm9yKCkpKQorICAgICAgRVJSX2Vycm9yX3N0cmluZ19uKHIsIHNvYXAtPm1zZ2J1ZiArIHN0cmxlbihzb2FwLT5tc2didWYpLCBzaXplb2Yoc29hcC0+bXNnYnVmKSAtIHN0cmxlbihzb2FwLT5tc2didWYpKTsKKyAgfSAKKyAgZWxzZQorICB7IHN3aXRjaCAocmV0KQorICAgIHsgY2FzZSAwOgorICAgICAgICBzdHJjcHkoc29hcC0+bXNnYnVmLCAiRU9GIHdhcyBvYnNlcnZlZCB0aGF0IHZpb2xhdGVzIHRoZSBwcm90b2NvbC4gVGhlIGNsaWVudCBwcm9iYWJseSBwcm92aWRlZCBpbnZhbGlkIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uLiIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgLTE6CisgICAgICAgIHNwcmludGYoc29hcC0+bXNnYnVmLCAiRXJyb3Igb2JzZXJ2ZWQgYnkgdW5kZXJseWluZyBCSU86ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsgIAorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXAtPm1zZ2J1ZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NzbF9wYXNzd29yZChjaGFyICpidWYsIGludCBudW0sIGludCByd2ZsYWcsIHZvaWQgKnVzZXJkYXRhKQoreyBpZiAobnVtIDwgKGludClzdHJsZW4oKGNoYXIqKXVzZXJkYXRhKSArIDEpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiBzdHJsZW4oc3RyY3B5KGJ1ZiwgKGNoYXIqKXVzZXJkYXRhKSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRoaXMgY2FsbGJhY2sgaXMgaW5jbHVkZWQgZm9yIGZ1dHVyZSByZWZlcmVuY2VzLiBJdCBzaG91bGQgbm90IGJlIGRlbGV0ZWQKKyNpZm5kZWYgUEFMTV8yCitzdGF0aWMgREggKgorc3NsX3RtcF9kaChTU0wgKnNzbCwgaW50IGlzX2V4cG9ydCwgaW50IGtleWxlbmd0aCkKK3sgc3RhdGljIERIICpkaDUxMiA9IE5VTEw7CisgIHN0YXRpYyBESCAqZGgxMDI0ID0gTlVMTDsKKyAgREggKmRoOworICBzd2l0Y2ggKGtleWxlbmd0aCkKKyAgeyBjYXNlIDUxMjoKKyAgICAgIGlmICghZGg1MTIpCisgICAgICB7IEJJTyAqYmlvID0gQklPX25ld19maWxlKCJkaDUxMi5wZW0iLCAiciIpOworICAgICAgICBpZiAoYmlvKQorICAgICAgICB7IGRoNTEyID0gUEVNX3JlYWRfYmlvX0RIcGFyYW1zKGJpbywgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgQklPX2ZyZWUoYmlvKTsKKyAgICAgICAgICByZXR1cm4gZGg1MTI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGRoNTEyOworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoIWRoMTAyNCkKKyAgICAgIHsgQklPICpiaW8gPSBCSU9fbmV3X2ZpbGUoImRoMTAyNC5wZW0iLCAiciIpOworICAgICAgICBpZiAoYmlvKQorICAgICAgICB7IGRoMTAyNCA9IFBFTV9yZWFkX2Jpb19ESHBhcmFtcyhiaW8sIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgICAgIEJJT19mcmVlKGJpbyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGRoID0gZGgxMDI0OworICB9CisgIHJldHVybiBkaDsKK30KKyNlbmRpZgorKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzc2xfYXV0aF9pbml0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoIXNzbF9pbml0X2RvbmUpCisgICAgc29hcF9zc2xfaW5pdCgpOworICBpZiAoIXNvYXAtPmN0eCkKKyAgeyBpZiAoIShzb2FwLT5jdHggPSBTU0xfQ1RYX25ldyhTU0x2MjNfbWV0aG9kKCkpKSkKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHNldHVwIGNvbnRleHQiLCBTT0FQX1NTTF9FUlJPUik7CisgIH0KKyAgaWYgKHNvYXAtPnJhbmRmaWxlKQorICB7IGlmICghUkFORF9sb2FkX2ZpbGUoc29hcC0+cmFuZGZpbGUsIC0xKSkKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IGxvYWQgcmFuZG9tbmVzcyIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgfQorICBpZiAoc29hcC0+Y2FmaWxlIHx8IHNvYXAtPmNhcGF0aCkKKyAgeyBpZiAoIVNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKHNvYXAtPmN0eCwgc29hcC0+Y2FmaWxlLCBzb2FwLT5jYXBhdGgpKQorICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3QgcmVhZCBDQSBmaWxlIGFuZCBkaXJlY3RvcnkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgaWYgKHNvYXAtPmNhZmlsZSAmJiBzb2FwLT5yZXF1aXJlX2NsaWVudF9hdXRoKQorICAgICAgU1NMX0NUWF9zZXRfY2xpZW50X0NBX2xpc3Qoc29hcC0+Y3R4LCBTU0xfbG9hZF9jbGllbnRfQ0FfZmlsZShzb2FwLT5jYWZpbGUpKTsKKyAgfQorICBpZiAoIVNTTF9DVFhfc2V0X2RlZmF1bHRfdmVyaWZ5X3BhdGhzKHNvYXAtPmN0eCkpCisgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3QgcmVhZCBkZWZhdWx0IENBIGZpbGUgYW5kL29yIGRpcmVjdG9yeSIsIFNPQVBfU1NMX0VSUk9SKTsKKy8qIFNlZSBiZWxvdyAqLworICBpZiAoc29hcC0+a2V5ZmlsZSkKKyAgeyBpZiAoIVNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoc29hcC0+Y3R4LCBzb2FwLT5rZXlmaWxlKSkKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHJlYWQgY2VydGlmaWNhdGUga2V5IGZpbGUiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgaWYgKHNvYXAtPnBhc3N3b3JkKQorICAgIHsgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2JfdXNlcmRhdGEoc29hcC0+Y3R4LCAodm9pZCopc29hcC0+cGFzc3dvcmQpOworICAgICAgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2Ioc29hcC0+Y3R4LCBzc2xfcGFzc3dvcmQpOworICAgIH0KKyAgICBpZiAoIVNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfZmlsZShzb2FwLT5jdHgsIHNvYXAtPmtleWZpbGUsIFNTTF9GSUxFVFlQRV9QRU0pKQorICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3QgcmVhZCBrZXkgZmlsZSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgfQorLyogU3VnZ2VzdGVkIGFsdGVybmF0aXZlIGFwcHJvYWNoIHRvIGNoZWNrIGNhZmlsZSBmaXJzdCBiZWZvcmUgdGhlIGtleSBmaWxlOgorICBpZiAoc29hcC0+cGFzc3dvcmQpCisgIHsgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2JfdXNlcmRhdGEoc29hcC0+Y3R4LCAodm9pZCopc29hcC0+cGFzc3dvcmQpOworICAgIFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiKHNvYXAtPmN0eCwgc3NsX3Bhc3N3b3JkKTsKKyAgfQorICBpZiAoIXNvYXAtPmNhZmlsZSB8fCAhU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZShzb2FwLT5jdHgsIHNvYXAtPmNhZmlsZSkpCisgIHsgaWYgKHNvYXAtPmtleWZpbGUpCisgICAgeyBpZiAoIVNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoc29hcC0+Y3R4LCBzb2FwLT5rZXlmaWxlKSkKKyAgICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3QgcmVhZCBjZXJ0aWZpY2F0ZSBvciBrZXkgZmlsZSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICAgIGlmICghU1NMX0NUWF91c2VfUHJpdmF0ZUtleV9maWxlKHNvYXAtPmN0eCwgc29hcC0+a2V5ZmlsZSwgU1NMX0ZJTEVUWVBFX1BFTSkpCisgICAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHJlYWQga2V5IGZpbGUiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgfQorICB9CisqLworICBpZiAoc29hcC0+cnNhKQorICB7IFJTQSAqcnNhID0gUlNBX2dlbmVyYXRlX2tleSgxMDI0LCBSU0FfRjQsIE5VTEwsIE5VTEwpOworICAgIGlmICghU1NMX0NUWF9zZXRfdG1wX3JzYShzb2FwLT5jdHgsIHJzYSkpCisgICAgeyBpZiAocnNhKQorICAgICAgICBSU0FfZnJlZShyc2EpOworICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3Qgc2V0IFJTQSBrZXkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgfQorICAgIFJTQV9mcmVlKHJzYSk7CisgIH0KKyAgZWxzZSBpZiAoc29hcC0+ZGhmaWxlKQorICB7IERIICpkaCA9IDA7CisgICAgQklPICpiaW87CisgICAgYmlvID0gQklPX25ld19maWxlKHNvYXAtPmRoZmlsZSwgInIiKTsKKyAgICBpZiAoIWJpbykKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHJlYWQgREggZmlsZSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICBkaCA9IFBFTV9yZWFkX2Jpb19ESHBhcmFtcyhiaW8sIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIEJJT19mcmVlKGJpbyk7CisgICAgaWYgKFNTTF9DVFhfc2V0X3RtcF9kaChzb2FwLT5jdHgsIGRoKSA8IDApCisgICAgeyBpZiAoZGgpCisgICAgICAgIERIX2ZyZWUoZGgpOworICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3Qgc2V0IERIIHBhcmFtZXRlcnMiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgfQorICAgIERIX2ZyZWUoZGgpOworICB9CisgIFNTTF9DVFhfc2V0X29wdGlvbnMoc29hcC0+Y3R4LCBTU0xfT1BfQUxMIHwgU1NMX09QX05PX1NTTHYyKTsKKyAgU1NMX0NUWF9zZXRfdmVyaWZ5KHNvYXAtPmN0eCwgc29hcC0+cmVxdWlyZV9jbGllbnRfYXV0aCA/IChTU0xfVkVSSUZZX1BFRVIgfCBTU0xfVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJUKSA6IHNvYXAtPnJlcXVpcmVfc2VydmVyX2F1dGggPyBTU0xfVkVSSUZZX1BFRVIgOiBTU0xfVkVSSUZZX05PTkUsIHNvYXAtPmZzc2x2ZXJpZnkpOworI2lmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgMHgwMDkwNTEwMEwpCisgIFNTTF9DVFhfc2V0X3ZlcmlmeV9kZXB0aChzb2FwLT5jdHgsIDEpOyAKKyNlbHNlCisgIFNTTF9DVFhfc2V0X3ZlcmlmeV9kZXB0aChzb2FwLT5jdHgsIDkpOyAKKyNlbmRpZiAgCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc3NsX3ZlcmlmeV9jYWxsYmFjayhpbnQgb2ssIFg1MDlfU1RPUkVfQ1RYICpzdG9yZSkKK3sKKyNpZmRlZiBTT0FQX0RFQlVHCisgIGlmICghb2spIAorICB7IGNoYXIgZGF0YVsyNTZdOworICAgIFg1MDkgKmNlcnQgPSBYNTA5X1NUT1JFX0NUWF9nZXRfY3VycmVudF9jZXJ0KHN0b3JlKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlNTTCB2ZXJpZnkgZXJyb3Igb3Igd2FybmluZyB3aXRoIGNlcnRpZmljYXRlIGF0IGRlcHRoICVkOiAlc1xuIiwgWDUwOV9TVE9SRV9DVFhfZ2V0X2Vycm9yX2RlcHRoKHN0b3JlKSwgWDUwOV92ZXJpZnlfY2VydF9lcnJvcl9zdHJpbmcoWDUwOV9TVE9SRV9DVFhfZ2V0X2Vycm9yKHN0b3JlKSkpOworICAgIFg1MDlfTkFNRV9vbmVsaW5lKFg1MDlfZ2V0X2lzc3Vlcl9uYW1lKGNlcnQpLCBkYXRhLCBzaXplb2YoZGF0YSkpOworICAgIGZwcmludGYoc3RkZXJyLCAiY2VydGlmaWNhdGUgaXNzdWVyICVzXG4iLCBkYXRhKTsKKyAgICBYNTA5X05BTUVfb25lbGluZShYNTA5X2dldF9zdWJqZWN0X25hbWUoY2VydCksIGRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgZnByaW50ZihzdGRlcnIsICJjZXJ0aWZpY2F0ZSBzdWJqZWN0ICVzXG4iLCBkYXRhKTsKKyAgfQorI2VuZGlmCisgIC8qIE5vdGU6IHJldHVybiAxIHRvIGNvbnRpbnVlLCBidXQgdW5zYWZlIHByb2dyZXNzIHdpbGwgYmUgdGVybWluYXRlZCBieSBTU0wgKi8KKyAgcmV0dXJuIG9rOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NzbF9hY2NlcHQoc3RydWN0IHNvYXAgKnNvYXApCit7IEJJTyAqYmlvOworICBpbnQgaSwgcjsKKyAgaWYgKCFzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIk5vIHNvY2tldCBpbiBzb2FwX3NzbF9hY2NlcHQoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgaWYgKCFzb2FwLT5jdHggJiYgKHNvYXAtPmVycm9yID0gc29hcC0+ZnNzbGF1dGgoc29hcCkpKQorICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICBpZiAoIXNvYXAtPnNzbCkKKyAgeyBzb2FwLT5zc2wgPSBTU0xfbmV3KHNvYXAtPmN0eCk7CisgICAgaWYgKCFzb2FwLT5zc2wpCisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJTU0xfbmV3KCkgZmFpbGVkIGluIHNvYXBfc3NsX2FjY2VwdCgpIiwgU09BUF9TU0xfRVJST1IpOworICB9CisgIGVsc2UKKyAgICBTU0xfY2xlYXIoc29hcC0+c3NsKTsKKyAgc29hcC0+aW1vZGUgfD0gU09BUF9FTkNfU1NMOworICBzb2FwLT5vbW9kZSB8PSBTT0FQX0VOQ19TU0w7CisjaWYgZGVmaW5lZChXSU4zMikKKyAgeyB1X2xvbmcgbm9uYmxvY2tpbmcgPSAxOworICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZJT05CSU8sICZub25ibG9ja2luZyk7CisgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgeyB1X2xvbmcgbm9uYmxvY2tpbmcgPSAxOworICAgIGlvY3RsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZJT05CSU8sIChpbnQpJm5vbmJsb2NraW5nKTsKKyAgfQorI2Vsc2UKKyAgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRl9HRVRGTCl8T19OT05CTE9DSyk7CisjZW5kaWYKKyAgYmlvID0gQklPX25ld19zb2NrZXQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgQklPX05PQ0xPU0UpOworICBTU0xfc2V0X2Jpbyhzb2FwLT5zc2wsIGJpbywgYmlvKTsKKyAgaSA9IDEwMDsgLyogMTAwICogMC4xIG1zIHJldHJpZXMgKi8KKyAgd2hpbGUgKChyID0gU1NMX2FjY2VwdChzb2FwLT5zc2wpKSA8PSAwKQorICB7IGludCBlcnIgPSBTU0xfZ2V0X2Vycm9yKHNvYXAtPnNzbCwgcik7CisgICAgaWYgKGVyciA9PSBTU0xfRVJST1JfV0FOVF9SRUFEIHx8IGVyciA9PSBTU0xfRVJST1JfV0FOVF9XUklURSkKKyAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICBmZF9zZXQgZmQ7CisgICAgICBpZiAoaS0tIDw9IDApCisgICAgICAgIGJyZWFrOworICAgICAgdGltZW91dC50dl9zZWMgPSAwOworICAgICAgdGltZW91dC50dl91c2VjID0gMTAwMDAwOworICAgICAgRkRfWkVSTygmZmQpOworICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZmZCk7CisgICAgICByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksICZmZCwgTlVMTCwgJmZkLCAmdGltZW91dCk7CisgICAgICBpZiAociA8IDAgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUikKKyAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgIHJldHVybiBTT0FQX0VPRjsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgc29hcC0+ZXJybnVtID0gZXJyOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisjaWYgZGVmaW5lZChXSU4zMikKKyAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZJT05CSU8sICZibG9ja2luZyk7CisgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgIGlvY3RsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZJT05CSU8sIChpbnQpJmJsb2NraW5nKTsKKyAgfQorI2Vsc2UKKyAgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRl9HRVRGTCkmfk9fTk9OQkxPQ0spOworI2VuZGlmCisgIGlmIChyIDw9IDApCisgIHsgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgc3NsX2Vycm9yKHNvYXAsIHIpLCAiU1NMX2FjY2VwdCgpIGZhaWxlZCBpbiBzb2FwX3NzbF9hY2NlcHQoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICByZXR1cm4gU09BUF9TU0xfRVJST1I7CisgIH0KKyAgaWYgKHNvYXAtPnJlcXVpcmVfY2xpZW50X2F1dGgpCisgIHsgWDUwOSAqcGVlcjsKKyAgICBpbnQgZXJyOworICAgIGlmICgoZXJyID0gU1NMX2dldF92ZXJpZnlfcmVzdWx0KHNvYXAtPnNzbCkpICE9IFg1MDlfVl9PSykKKyAgICB7IHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgcmV0dXJuIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCBYNTA5X3ZlcmlmeV9jZXJ0X2Vycm9yX3N0cmluZyhlcnIpLCAiU1NMIGNlcnRpZmljYXRlIHByZXNlbnRlZCBieSBwZWVyIGNhbm5vdCBiZSB2ZXJpZmllZCBpbiBzb2FwX3NzbF9hY2NlcHQoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICB9CisgICAgcGVlciA9IFNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZShzb2FwLT5zc2wpOworICAgIGlmICghcGVlcikKKyAgICB7IHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgcmV0dXJuIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIk5vIFNTTCBjZXJ0aWZpY2F0ZSB3YXMgcHJlc2VudGVkIGJ5IHRoZSBwZWVyIGluIHNvYXBfc3NsX2FjY2VwdCgpIiwgU09BUF9TU0xfRVJST1IpOworICAgIH0KKyAgICBYNTA5X2ZyZWUocGVlcik7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNlbmRpZiAvKiBXSVRIX09QRU5TU0wgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAordGNwX2luaXQoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPmVycm1vZGUgPSAxOworI2lmZGVmIFdJTjMyCisgIGlmICh0Y3BfZG9uZSkKKyAgICByZXR1cm4gMDsKKyAgZWxzZQorICB7IFdTQURBVEEgdzsKKyAgICBpZiAoV1NBU3RhcnR1cChNQUtFV09SRCgxLCAxKSwgJncpKQorICAgICAgcmV0dXJuIC0xOworICAgIHRjcF9kb25lID0gMTsKKyAgfQorI2VuZGlmCisgIHJldHVybiAwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2RvbmUoc3RydWN0IHNvYXAgKnNvYXApCit7IAorI2lmZGVmIFNPQVBfREVCVUcKKyAgaW50IGk7CisjZW5kaWYKKyAgaWYgKHNvYXBfY2hlY2tfc3RhdGUoc29hcCkpCisgICAgcmV0dXJuOworICBzb2FwX2ZyZWUoc29hcCk7CisgIHdoaWxlIChzb2FwLT5jbGlzdCkKKyAgeyBzdHJ1Y3Qgc29hcF9jbGlzdCAqcCA9IHNvYXAtPmNsaXN0LT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5jbGlzdCk7CisgICAgc29hcC0+Y2xpc3QgPSBwOworICB9CisgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOyAvKiB0byBmb3JjZSBjbG9zZSB0aGUgc29ja2V0ICovCisgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworI2lmZGVmIFdJVEhfQ09PS0lFUworICBzb2FwX2ZyZWVfY29va2llcyhzb2FwKTsKKyNlbmRpZgorICB3aGlsZSAoc29hcC0+cGx1Z2lucykKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnAgPSBzb2FwLT5wbHVnaW5zLT5uZXh0OworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVtb3ZpbmcgcGx1Z2luICclcydcbiIsIHNvYXAtPnBsdWdpbnMtPmlkKSk7CisgICAgaWYgKHNvYXAtPnBsdWdpbnMtPmZjb3B5IHx8IHNvYXAtPnN0YXRlID09IFNPQVBfSU5JVCkKKyAgICAgIHNvYXAtPnBsdWdpbnMtPmZkZWxldGUoc29hcCwgc29hcC0+cGx1Z2lucyk7CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPnBsdWdpbnMpOworICAgIHNvYXAtPnBsdWdpbnMgPSBwOworICB9CisgIHNvYXAtPmZwbHVnaW4gPSBmcGx1Z2luOworI2lmbmRlZiBXSVRIX05PSFRUUAorICBzb2FwLT5mcG9zdCA9IGh0dHBfcG9zdDsKKyAgc29hcC0+ZmdldCA9IGh0dHBfZ2V0OworICBzb2FwLT5mZm9ybSA9IE5VTEw7CisgIHNvYXAtPmZwb3N0aGRyID0gaHR0cF9wb3N0X2hlYWRlcjsKKyAgc29hcC0+ZnJlc3BvbnNlID0gaHR0cF9yZXNwb25zZTsKKyAgc29hcC0+ZnBhcnNlID0gaHR0cF9wYXJzZTsKKyAgc29hcC0+ZnBhcnNlaGRyID0gaHR0cF9wYXJzZV9oZWFkZXI7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfSVBWNgorICBzb2FwLT5mcmVzb2x2ZSA9IHRjcF9nZXRob3N0OworI2Vsc2UKKyAgc29hcC0+ZnJlc29sdmUgPSBOVUxMOworI2VuZGlmCisgIHNvYXAtPmZhY2NlcHQgPSB0Y3BfYWNjZXB0OworICBzb2FwLT5mb3BlbiA9IHRjcF9jb25uZWN0OworICBzb2FwLT5mY2xvc2UgPSB0Y3BfZGlzY29ubmVjdDsKKyAgc29hcC0+ZmNsb3Nlc29ja2V0ID0gdGNwX2Nsb3Nlc29ja2V0OworICBzb2FwLT5mc2h1dGRvd25zb2NrZXQgPSB0Y3Bfc2h1dGRvd25zb2NrZXQ7CisgIHNvYXAtPmZzZW5kID0gZnNlbmQ7CisgIHNvYXAtPmZyZWN2ID0gZnJlY3Y7CisgIHNvYXAtPmZwb2xsID0gc29hcF9wb2xsOworI2Vsc2UKKyAgc29hcC0+Zm9wZW4gPSBOVUxMOworICBzb2FwLT5mY2xvc2UgPSBOVUxMOworICBzb2FwLT5mcG9sbCA9IE5VTEw7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcC0+ZnByZXBhcmVpbml0ID0gTlVMTDsKKyAgc29hcC0+ZnByZXBhcmVzZW5kID0gTlVMTDsKKyAgc29hcC0+ZnByZXBhcmVyZWN2ID0gTlVMTDsKKyAgc29hcC0+ZnByZXBhcmVmaW5hbCA9IE5VTEw7CisjZW5kaWYKKyAgc29hcC0+ZnNldGVycm9yID0gTlVMTDsKKyAgc29hcC0+Zmlnbm9yZSA9IE5VTEw7CisgIHNvYXAtPmZzZXJ2ZWxvb3AgPSBOVUxMOworI2lmZGVmIFdJVEhfT1BFTlNTTAorICBpZiAoc29hcC0+c2Vzc2lvbikKKyAgeyBTU0xfU0VTU0lPTl9mcmVlKHNvYXAtPnNlc3Npb24pOworICAgIHNvYXAtPnNlc3Npb24gPSBOVUxMOworICB9CisjZW5kaWYKKyAgaWYgKHNvYXAtPnN0YXRlID09IFNPQVBfSU5JVCkKKyAgeyBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSkKKyAgICB7IHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyKTsKKyAgICAgIHNvYXAtPm1hc3RlciA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgIGlmIChzb2FwLT5jdHgpCisgICAgeyBTU0xfQ1RYX2ZyZWUoc29hcC0+Y3R4KTsKKyAgICAgIHNvYXAtPmN0eCA9IE5VTEw7CisgICAgfQorI2VuZGlmCisgIH0KKyNpZmRlZiBTT0FQX0RFQlVHCisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZSBsb2dmaWxlc1xuIikpOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9NQVhMT0dTOyBpKyspCisgIHsgaWYgKHNvYXAtPmxvZ2ZpbGVbaV0pCisgICAgeyBTT0FQX0ZSRUUoc29hcCwgKHZvaWQqKXNvYXAtPmxvZ2ZpbGVbaV0pOworICAgICAgc29hcC0+bG9nZmlsZVtpXSA9IE5VTEw7CisgICAgfQorICAgIHNvYXBfY2xvc2VfbG9nZmlsZShzb2FwLCBpKTsKKyAgfQorICBzb2FwX2ZyZWVfbWh0KHNvYXApOworICBzb2FwLT5zdGF0ZSA9IDA7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2NsZWFudXAoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXBfZG9uZShzb2FwKTsKKyNpZmRlZiBXSU4zMgorICBpZiAoIXRjcF9kb25lKQorICAgIHJldHVybjsKKyAgdGNwX2RvbmUgPSAwOworICBXU0FDbGVhbnVwKCk7CisjZW5kaWYKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBjb25zdCBjaGFyKgordGNwX2Vycm9yKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBjb25zdCBjaGFyICptc2cgPSBOVUxMOworICBzd2l0Y2ggKHNvYXAtPmVycm1vZGUpCisgIHsgY2FzZSAwOgorICAgICAgbXNnID0gc29hcF9zdHJlcnJvcihzb2FwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIG1zZyA9ICJXU0FTdGFydHVwIGZhaWxlZCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgeworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIG1zZyA9IHNvYXBfc3RyX2NvZGUoaF9lcnJvcl9jb2Rlcywgc29hcC0+ZXJybnVtKTsKKyAgICAgIGlmICghbXNnKQorI2VuZGlmCisgICAgICB7IHNwcmludGYoc29hcC0+bXNnYnVmLCAiVENQL1VEUCBJUCBlcnJvciAlZCIsIHNvYXAtPmVycm51bSk7CisgICAgICAgIG1zZyA9IHNvYXAtPm1zZ2J1ZjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIG1zZzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNvbnN0IGNoYXIqCitodHRwX2Vycm9yKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3RhdHVzKQoreyByZWdpc3RlciBjb25zdCBjaGFyICptc2cgPSBTT0FQX1NUUl9FT1M7CisjaWZuZGVmIFdJVEhfTEVBTgorICBtc2cgPSBzb2FwX3N0cl9jb2RlKGhfaHR0cF9lcnJvcl9jb2Rlcywgc3RhdHVzKTsKKyAgaWYgKCFtc2cpCisgICAgbXNnID0gU09BUF9TVFJfRU9TOworI2VuZGlmCisgIHJldHVybiBtc2c7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0lQVjYKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAordGNwX2dldGhvc3Qoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmFkZHIsIHN0cnVjdCBpbl9hZGRyICppbmFkZHIpCit7IHNvYXBfaW50MzIgaWFkZCA9IC0xOworICBzdHJ1Y3QgaG9zdGVudCBob3N0ZW50LCAqaG9zdCA9ICZob3N0ZW50OworI2lmZGVmIFZYV09SS1MKKyAgaW50IGhvc3RpbnQ7CisgIC8qIGluZXRfYWRkcigpLCBhbmQgaG9zdEdldEJ5TmFtZSgpIGV4cGVjdCAiY2hhciAqIjsgYWRkciBpcyBhICJjb25zdCBjaGFyICoiLiAqLworICBpYWRkID0gaW5ldF9hZGRyKChjaGFyKilhZGRyKTsKKyNlbHNlCisjaWYgZGVmaW5lZChfQUlYVkVSU0lPTl80MzEpIHx8IGRlZmluZWQoVFJVNjQpCisgIHN0cnVjdCBob3N0ZW50X2RhdGEgaHRfZGF0YTsKKyNlbmRpZgorI2lmZGVmIEFTNDAwCisgIGlhZGQgPSBpbmV0X2FkZHIoKHZvaWQqKWFkZHIpOworI2Vsc2UKKyAgaWFkZCA9IGluZXRfYWRkcihhZGRyKTsKKyNlbmRpZgorI2VuZGlmCisgIGlmIChpYWRkICE9IC0xKQorICB7IG1lbWNweShpbmFkZHIsICZpYWRkLCBzaXplb2YoaWFkZCkpOworICAgIHJldHVybiBTT0FQX09LOworICB9CisjaWYgZGVmaW5lZChfX0dMSUJDX18pCisgIGlmIChnZXRob3N0YnluYW1lX3IoYWRkciwgJmhvc3RlbnQsIHNvYXAtPmJ1ZiwgU09BUF9CVUZMRU4sICZob3N0LCAmc29hcC0+ZXJybnVtKSA8IDApCisgICAgaG9zdCA9IE5VTEw7CisjZWxpZiBkZWZpbmVkKF9BSVhWRVJTSU9OXzQzMSkgfHwgZGVmaW5lZChUUlU2NCkKKyAgbWVtc2V0KCh2b2lkKikmaHRfZGF0YSwgMCwgc2l6ZW9mKGh0X2RhdGEpKTsKKyAgaWYgKGdldGhvc3RieW5hbWVfcihhZGRyLCAmaG9zdGVudCwgJmh0X2RhdGEpIDwgMCkKKyAgeyBob3N0ID0gTlVMTDsKKyAgICBzb2FwLT5lcnJudW0gPSBoX2Vycm5vOworICB9CisjZWxpZiBkZWZpbmVkKEhBVkVfR0VUSE9TVEJZTkFNRV9SKQorICBob3N0ID0gZ2V0aG9zdGJ5bmFtZV9yKGFkZHIsICZob3N0ZW50LCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOLCAmc29hcC0+ZXJybnVtKTsKKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgLyogSWYgdGhlIEROUyByZXNvbHZlciBsaWJyYXJ5IHJlc29sdkxpYiBoYXMgYmVlbiBjb25maWd1cmVkIGluIHRoZSB2eFdvcmtzCisgICAqIGltYWdlLCBhIHF1ZXJ5IGZvciB0aGUgaG9zdCBJUCBhZGRyZXNzIGlzIHNlbnQgdG8gdGhlIEROUyBzZXJ2ZXIsIGlmIHRoZQorICAgKiBuYW1lIHdhcyBub3QgZm91bmQgaW4gdGhlIGxvY2FsIGhvc3QgdGFibGUuICovCisgIGhvc3RpbnQgPSBob3N0R2V0QnlOYW1lKChjaGFyKilhZGRyKTsKKyAgaWYgKGhvc3RpbnQgPT0gRVJST1IpCisgIHsgaG9zdCA9IE5VTEw7CisgICAgc29hcC0+ZXJybnVtID0gc29hcF9lcnJubzsgCisgIH0KKyNlbHNlCisjaWZkZWYgQVM0MDAKKyAgaWYgKCEoaG9zdCA9IGdldGhvc3RieW5hbWUoKHZvaWQqKWFkZHIpKSkKKyAgICBzb2FwLT5lcnJudW0gPSBoX2Vycm5vOworI2Vsc2UKKyAgaWYgKCEoaG9zdCA9IGdldGhvc3RieW5hbWUoYWRkcikpKQorICAgIHNvYXAtPmVycm51bSA9IGhfZXJybm87CisjZW5kaWYKKyNlbmRpZgorICBpZiAoIWhvc3QpCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJIb3N0IG5hbWUgbm90IGZvdW5kXG4iKSk7CisgICAgcmV0dXJuIFNPQVBfRVJSOworICB9CisjaWZkZWYgVlhXT1JLUworICBpbmFkZHItPnNfYWRkciA9IGhvc3RpbnQ7CisjZWxzZQorICBtZW1jcHkoaW5hZGRyLCBob3N0LT5oX2FkZHIsIGhvc3QtPmhfbGVuZ3RoKTsKKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAordGNwX2Nvbm5lY3Qoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjb25zdCBjaGFyICpob3N0LCBpbnQgcG9ydCkKK3sKKyNpZmRlZiBXSVRIX0lQVjYKKyAgc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqcmVzLCAqcmVzc2F2ZTsKKyAgaW50IGVycjsKKyNlbmRpZgorICByZWdpc3RlciBpbnQgZmQ7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpbnQgbGVuID0gU09BUF9CVUZMRU47CisgIGludCBzZXQgPSAxOworI2VuZGlmCisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0KTsKKyAgc29hcC0+c29ja2V0ID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgaWYgKHRjcF9pbml0KHNvYXApKQorICB7IHNvYXAtPmVycm51bSA9IDA7CisgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgIlRDUCBpbml0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIHNvYXAtPmVycm1vZGUgPSAwOworI2lmZGVmIFdJVEhfSVBWNgorICBtZW1zZXQoKHZvaWQqKSZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisgIGhpbnRzLmFpX2ZhbWlseSA9IFBGX1VOU1BFQzsKKyNpZmRlZiBXSVRIX1VEUAorICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19ER1JBTTsKKyAgZWxzZQorI2VuZGlmCisgICAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKyAgc29hcC0+ZXJybW9kZSA9IDI7CisgIGlmIChzb2FwLT5wcm94eV9ob3N0KQorICAgIGVyciA9IGdldGFkZHJpbmZvKHNvYXAtPnByb3h5X2hvc3QsIHNvYXBfaW50MnMoc29hcCwgc29hcC0+cHJveHlfcG9ydCksICZoaW50cywgJnJlcyk7CisgIGVsc2UKKyAgICBlcnIgPSBnZXRhZGRyaW5mbyhob3N0LCBzb2FwX2ludDJzKHNvYXAsIHBvcnQpLCAmaGludHMsICZyZXMpOworICBpZiAoZXJyKQorICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCBnYWlfc3RyZXJyb3IoZXJyKSwgImdldGFkZHJpbmZvIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIHJlc3NhdmUgPSByZXM7CithZ2FpbjoKKyAgZmQgPSAoaW50KXNvY2tldChyZXMtPmFpX2ZhbWlseSwgcmVzLT5haV9zb2NrdHlwZSwgcmVzLT5haV9wcm90b2NvbCk7CisgIHNvYXAtPmVycm1vZGUgPSAwOworI2Vsc2UKKyNpZmRlZiBXSVRIX1VEUAorICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIGZkID0gKGludClzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisgIGVsc2UKKyNlbmRpZgorICAgIGZkID0gKGludClzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOworI2VuZGlmCisgIGlmIChmZCA8IDApCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNvY2tldCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorI2lmZGVmIFNPQ0tFVF9DTE9TRV9PTl9FWEVDCisjaWZkZWYgV0lOMzIKKyNpZm5kZWYgVU5ERVJfQ0UKKyAgU2V0SGFuZGxlSW5mb3JtYXRpb24oKEhBTkRMRSlmZCwgSEFORExFX0ZMQUdfSU5IRVJJVCwgMCk7CisjZW5kaWYKKyNlbHNlCisgIGZjbnRsKGZkLCBGX1NFVEZELCAxKTsKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+Y29ubmVjdF9mbGFncyAmIFNPX0xJTkdFUikKKyAgeyBzdHJ1Y3QgbGluZ2VyIGxpbmdlcjsKKyAgICBtZW1zZXQoKHZvaWQqKSZsaW5nZXIsIDAsIHNpemVvZihsaW5nZXIpKTsKKyAgICBsaW5nZXIubF9vbm9mZiA9IDE7CisgICAgbGluZ2VyLmxfbGluZ2VyID0gMDsKKyAgICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpZmQsIFNPTF9TT0NLRVQsIFNPX0xJTkdFUiwgKGNoYXIqKSZsaW5nZXIsIHNpemVvZihzdHJ1Y3QgbGluZ2VyKSkpCisgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX0xJTkdFUiBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorICB9CisgIGlmICgoc29hcC0+Y29ubmVjdF9mbGFncyAmIH5TT19MSU5HRVIpICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKWZkLCBTT0xfU09DS0VULCBzb2FwLT5jb25uZWN0X2ZsYWdzICYgflNPX0xJTkdFUiwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBpZiAoc29hcC0+a2VlcF9hbGl2ZSAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClmZCwgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX0tFRVBBTElWRSBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpZmQsIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwgKGNoYXIqKSZsZW4sIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19TTkRCVUYgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKWZkLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsIChjaGFyKikmbGVuLCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fUkNWQlVGIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisjaWZkZWYgVENQX05PREVMQVkKKyAgaWYgKCEoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpZmQsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBUQ1BfTk9ERUxBWSBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorI2VuZGlmCisjZW5kaWYKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk9wZW5pbmcgc29ja2V0ICVkIHRvIGhvc3Q9JyVzJyBwb3J0PSVkXG4iLCBmZCwgaG9zdCwgcG9ydCkpOworI2lmbmRlZiBXSVRIX0lQVjYKKyAgc29hcC0+cGVlcmxlbiA9IHNpemVvZihzb2FwLT5wZWVyKTsKKyAgbWVtc2V0KCh2b2lkKikmc29hcC0+cGVlciwgMCwgc2l6ZW9mKHNvYXAtPnBlZXIpKTsKKyAgc29hcC0+cGVlci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgc29hcC0+ZXJybW9kZSA9IDI7CisgIGlmIChzb2FwLT5wcm94eV9ob3N0KQorICB7IGlmIChzb2FwLT5mcmVzb2x2ZShzb2FwLCBzb2FwLT5wcm94eV9ob3N0LCAmc29hcC0+cGVlci5zaW5fYWRkcikpCisgICAgeyBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiZ2V0IHByb3h5IGhvc3QgYnkgbmFtZSBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorICAgIHNvYXAtPnBlZXIuc2luX3BvcnQgPSBodG9ucygoc2hvcnQpc29hcC0+cHJveHlfcG9ydCk7CisgIH0KKyAgZWxzZQorICB7IGlmIChzb2FwLT5mcmVzb2x2ZShzb2FwLCBob3N0LCAmc29hcC0+cGVlci5zaW5fYWRkcikpCisgICAgeyBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiZ2V0IGhvc3QgYnkgbmFtZSBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorICAgIHNvYXAtPnBlZXIuc2luX3BvcnQgPSBodG9ucygoc2hvcnQpcG9ydCk7CisgIH0KKyAgc29hcC0+ZXJybW9kZSA9IDA7CisgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgcmV0dXJuIGZkOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0KQorI2lmIGRlZmluZWQoV0lOMzIpCisgIHsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sICZub25ibG9ja2luZyk7CisgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgeyB1X2xvbmcgbm9uYmxvY2tpbmcgPSAxOworICAgIGlvY3RsKChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgKGludCkoJm5vbmJsb2NraW5nKSk7IC8qIG1vZGlmaWVkIHRvIHVzZSBmZCAqLworICB9CisjZWxzZQorICAgIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX0dFVEZMKXxPX05PTkJMT0NLKTsKKyNlbmRpZgorICBlbHNlCisjaWYgZGVmaW5lZChXSU4zMikKKyAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgJmJsb2NraW5nKTsKKyAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgaW9jdGwoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAoaW50KSgmYmxvY2tpbmcpKTsKKyAgfQorI2Vsc2UKKyAgICBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9HRVRGTCkmfk9fTk9OQkxPQ0spOworI2VuZGlmCisjZW5kaWYKKyAgZm9yICg7OykKKyAgeyAKKyNpZmRlZiBXSVRIX0lQVjYKKyAgICBpZiAoY29ubmVjdCgoU09BUF9TT0NLRVQpZmQsIHJlcy0+YWlfYWRkciwgcmVzLT5haV9hZGRybGVuKSkKKyNlbHNlCisgICAgaWYgKGNvbm5lY3QoKFNPQVBfU09DS0VUKWZkLCAoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlciwgc2l6ZW9mKHNvYXAtPnBlZXIpKSkKKyNlbmRpZgorICAgIHsgCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgaWYgKHNvYXAtPmNvbm5lY3RfdGltZW91dCAmJiAoc29hcF9zb2NrZXRfZXJybm8gPT0gU09BUF9FSU5QUk9HUkVTUyB8fCBzb2FwX3NvY2tldF9lcnJubyA9PSBTT0FQX0VXT1VMREJMT0NLKSkKKyAgICAgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgICAgU09BUF9TT0NLTEVOX1QgazsKKyAgICAgICAgZmRfc2V0IGZkczsKKyAgICAgICAgaWYgKHNvYXAtPmNvbm5lY3RfdGltZW91dCA+IDApCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSBzb2FwLT5jb25uZWN0X3RpbWVvdXQ7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSAtc29hcC0+Y29ubmVjdF90aW1lb3V0LzEwMDAwMDA7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gLXNvYXAtPmNvbm5lY3RfdGltZW91dCUxMDAwMDAwOworICAgICAgICB9CisgICAgICAgIEZEX1pFUk8oJmZkcyk7CisgICAgICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpZmQsICZmZHMpOworICAgICAgICBmb3IgKDs7KQorICAgICAgICB7IGludCByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoZmQgKyAxKSwgTlVMTCwgJmZkcywgTlVMTCwgJnRpbWVvdXQpOworICAgICAgICAgIGlmIChyID4gMCkKKwkgICAgYnJlYWs7CisgICAgICAgICAgaWYgKCFyKQorICAgICAgICAgIHsgc29hcC0+ZXJybnVtID0gMDsKKyAgICAgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29ubmVjdCB0aW1lb3V0XG4iKSk7CisgICAgICAgICAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgIlRpbWVvdXQiLCAiY29ubmVjdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSKQorICAgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBjb25uZWN0IHRvIGhvc3RcbiIpKTsKKyAgICAgICAgICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJjb25uZWN0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKwlrID0gKFNPQVBfU09DS0xFTl9UKXNpemVvZihzb2FwLT5lcnJudW0pOworICAgICAgICBpZiAoIWdldHNvY2tvcHQoKFNPQVBfU09DS0VUKWZkLCBTT0xfU09DS0VULCBTT19FUlJPUiwgKGNoYXIqKSZzb2FwLT5lcnJudW0sICZrKSAmJiAhc29hcC0+ZXJybnVtKQkvKiBwb3J0YWJpbGl0eSBub3RlOiBzZWUgU09BUF9TT0NLTEVOX1QgZGVmaW5pdGlvbiBpbiBzdGRzb2FwMi5oICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IGNvbm5lY3QgdG8gaG9zdFxuIikpOworICAgICAgICBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImNvbm5lY3QgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyNlbmRpZgorI2lmZGVmIFdJVEhfSVBWNgorICAgICAgaWYgKHJlcy0+YWlfbmV4dCkKKyAgICAgIHsgcmVzID0gcmVzLT5haV9uZXh0OworICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgaWYgKHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIpCisgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBjb25uZWN0IHRvIGhvc3RcbiIpKTsKKyAgICAgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImNvbm5lY3QgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyAgICB9ICAKKyAgICBlbHNlCisgICAgICBicmVhazsKKyAgfQorI2lmZGVmIFdJVEhfSVBWNgorICBzb2FwLT5wZWVybGVuID0gMDsgLyogSVB2NjogYWxyZWFkeSBjb25uZWN0ZWQgc28gdXNlIHNlbmQoKSAqLworICBmcmVlYWRkcmluZm8ocmVzc2F2ZSk7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQpCisjaWYgZGVmaW5lZChXSU4zMikKKyAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgJmJsb2NraW5nKTsKKyAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgaW9jdGwoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAoaW50KSgmYmxvY2tpbmcpKTsKKyAgfQorI2Vsc2UKKyAgICBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9HRVRGTCkmfk9fTk9OQkxPQ0spOworI2VuZGlmCisjZW5kaWYKKyAgc29hcC0+c29ja2V0ID0gZmQ7CisgIHNvYXAtPmltb2RlICY9IH5TT0FQX0VOQ19TU0w7CisgIHNvYXAtPm9tb2RlICY9IH5TT0FQX0VOQ19TU0w7CisgIGlmICghc3RybmNtcChlbmRwb2ludCwgImh0dHBzOiIsIDYpKQorICB7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgICAgQklPICpiaW87CisgICAgaW50IHI7CisgICAgaWYgKHNvYXAtPnByb3h5X2hvc3QpCisgICAgeyBzaG9ydCB2OworICAgICAgdW5zaWduZWQgaW50IGsgPSBzb2FwLT5vbW9kZTsgLyogbWFrZSBzdXJlIHdlIG9ubHkgcGFyc2UgSFRUUCAqLworICAgICAgc2l6ZV90IG4gPSBzb2FwLT5jb3VudDsgLyogc2F2ZSB0aGUgY29udGVudCBsZW5ndGggKi8KKyAgICAgIGNoYXIgKnVzZXJpZCwgKnBhc3N3ZDsKKyAgICAgIHNvYXAtPm9tb2RlICY9IH5TT0FQX0VOQzsgLyogbWFzayBJTyBhbmQgRU5DICovCisgICAgICBzb2FwLT5vbW9kZSB8PSBTT0FQX0lPX0JVRkZFUjsKKyAgICAgIHNvYXBfYmVnaW5fc2VuZChzb2FwKTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29ubmVjdGluZyB0byBwcm94eSBzZXJ2ZXJcbiIpKTsKKyAgICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiQ09OTkVDVCAlczolZCBIVFRQLyVzIiwgaG9zdCwgcG9ydCwgc29hcC0+aHR0cF92ZXJzaW9uKTsKKyAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCBzb2FwLT50bXBidWYsIE5VTEwpKSkKKyAgICAgIHsgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIGlmIChzb2FwLT5wcm94eV91c2VyaWQgJiYgc29hcC0+cHJveHlfcGFzc3dkICYmIHN0cmxlbihzb2FwLT5wcm94eV91c2VyaWQpICsgc3RybGVuKHNvYXAtPnByb3h5X3Bhc3N3ZCkgPCA3NjEpCisgICAgICB7IHNwcmludGYoc29hcC0+dG1wYnVmICsgMjYyLCAiJXM6JXMiLCBzb2FwLT5wcm94eV91c2VyaWQsIHNvYXAtPnByb3h5X3Bhc3N3ZCk7CisgICAgICAgIHN0cmNweShzb2FwLT50bXBidWYsICJCYXNpYyAiKTsKKyAgICAgICAgc29hcF9zMmJhc2U2NChzb2FwLCAoY29uc3QgdW5zaWduZWQgY2hhciopKHNvYXAtPnRtcGJ1ZiArIDI2MiksIHNvYXAtPnRtcGJ1ZiArIDYsIHN0cmxlbihzb2FwLT50bXBidWYgKyAyNjIpKTsKKyAgICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJQcm94eS1BdXRob3JpemF0aW9uIiwgc29hcC0+dG1wYnVmKSkpCisgICAgICAgIHsgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKyAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCBOVUxMLCBOVUxMKSkKKyAgICAgICB8fCBzb2FwX2ZsdXNoKHNvYXApKQorICAgICAgeyBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgICBzb2FwLT5vbW9kZSA9IGs7CisgICAgICBrID0gc29hcC0+aW1vZGU7CisgICAgICBzb2FwLT5pbW9kZSAmPSB+U09BUF9FTkM7IC8qIG1hc2sgSU8gYW5kIEVOQyAqLworICAgICAgdiA9IHNvYXAtPnZlcnNpb247IC8qIHByZXNlcnZlICovCisgICAgICB1c2VyaWQgPSBzb2FwLT51c2VyaWQ7IC8qIHByZXNlcnZlICovCisgICAgICBwYXNzd2QgPSBzb2FwLT5wYXNzd2Q7IC8qIHByZXNlcnZlICovCisgICAgICBpZiAoc29hcF9iZWdpbl9yZWN2KHNvYXApKQorICAgICAgeyBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgICBzb2FwLT51c2VyaWQgPSB1c2VyaWQ7IC8qIHJlc3RvcmUgKi8KKyAgICAgIHNvYXAtPnBhc3N3ZCA9IHBhc3N3ZDsgLyogcmVzdG9yZSAqLworICAgICAgc29hcC0+dmVyc2lvbiA9IHY7IC8qIHJlc3RvcmUgKi8KKyAgICAgIHNvYXAtPmltb2RlID0gazsgLyogcmVzdG9yZSAqLworICAgICAgc29hcC0+Y291bnQgPSBuOyAvKiByZXN0b3JlICovCisgICAgICBzb2FwX2JlZ2luX3NlbmQoc29hcCk7CisgICAgfQorICAgIGlmICghc29hcC0+Y3R4ICYmIChzb2FwLT5lcnJvciA9IHNvYXAtPmZzc2xhdXRoKHNvYXApKSkKKyAgICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIlNTTCBhdXRoZW50aWNhdGlvbiBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKTogY2hlY2sgcGFzc3dvcmQsIGtleSBmaWxlLCBhbmQgY2EgZmlsZS4iLCBTT0FQX1NTTF9FUlJPUik7CisgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgIH0KKyAgICBzb2FwLT5zc2wgPSBTU0xfbmV3KHNvYXAtPmN0eCk7CisgICAgaWYgKCFzb2FwLT5zc2wpCisgICAgeyBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9TU0xfRVJST1I7CisgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisgICAgaWYgKHNvYXAtPnNlc3Npb24pCisgICAgeyBpZiAoIXN0cmNtcChzb2FwLT5zZXNzaW9uX2hvc3QsIGhvc3QpICYmIHNvYXAtPnNlc3Npb25fcG9ydCA9PSBwb3J0KQorICAgICAgICBTU0xfc2V0X3Nlc3Npb24oc29hcC0+c3NsLCBzb2FwLT5zZXNzaW9uKTsKKyAgICAgIFNTTF9TRVNTSU9OX2ZyZWUoc29hcC0+c2Vzc2lvbik7CisgICAgICBzb2FwLT5zZXNzaW9uID0gTlVMTDsKKyAgICB9CisgICAgc29hcC0+aW1vZGUgfD0gU09BUF9FTkNfU1NMOworICAgIHNvYXAtPm9tb2RlIHw9IFNPQVBfRU5DX1NTTDsKKyAgICBiaW8gPSBCSU9fbmV3X3NvY2tldCgoU09BUF9TT0NLRVQpZmQsIEJJT19OT0NMT1NFKTsKKyAgICBTU0xfc2V0X2Jpbyhzb2FwLT5zc2wsIGJpbywgYmlvKTsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKHNvYXAtPmNvbm5lY3RfdGltZW91dCkKKyNpZiBkZWZpbmVkKFdJTjMyKQorICAgIHsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgJm5vbmJsb2NraW5nKTsKKyAgICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgICAgeyB1X2xvbmcgbm9uYmxvY2tpbmcgPSAxOworICAgICAgaW9jdGwoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAoaW50KSgmbm9uYmxvY2tpbmcpKTsKKyAgICB9CisjZWxzZQorICAgICAgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfR0VURkwpfE9fTk9OQkxPQ0spOworI2VuZGlmCisjZW5kaWYKKyAgICBmb3IgKDs7KQorICAgIHsgaWYgKChyID0gU1NMX2Nvbm5lY3Qoc29hcC0+c3NsKSkgPD0gMCkKKyAgICAgIHsgaW50IGVyciA9IFNTTF9nZXRfZXJyb3Ioc29hcC0+c3NsLCByKTsKKyAgICAgICAgaWYgKGVyciAhPSBTU0xfRVJST1JfTk9ORSAmJiBlcnIgIT0gU1NMX0VSUk9SX1dBTlRfUkVBRCAmJiBlcnIgIT0gU1NMX0VSUk9SX1dBTlRfV1JJVEUpCisgICAgICAgIHsgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHNzbF9lcnJvcihzb2FwLCByKSwgIlNTTCBjb25uZWN0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9TU0xfRVJST1IpOworICAgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICB9CisgICAgICAgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQpCisgICAgICAgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgICAgICBmZF9zZXQgZmRzOworICAgICAgICAgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQgPiAwKQorICAgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSBzb2FwLT5jb25uZWN0X3RpbWVvdXQ7CisgICAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IC1zb2FwLT5jb25uZWN0X3RpbWVvdXQvMTAwMDAwMDsKKyAgICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IC1zb2FwLT5jb25uZWN0X3RpbWVvdXQlMTAwMDAwMDsKKyAgICAgICAgICB9CisgICAgICAgICAgRkRfWkVSTygmZmRzKTsKKyAgICAgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKWZkLCAmZmRzKTsKKyAgICAgICAgICBmb3IgKDs7KQorICAgICAgICAgIHsgaW50IHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShmZCArIDEpLCAmZmRzLCBOVUxMLCAmZmRzLCAmdGltZW91dCk7CisgICAgICAgICAgICBpZiAociA+IDApCisJICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoIXIpCisgICAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IDA7CisgICAgICAgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29ubmVjdCB0aW1lb3V0XG4iKSk7CisgICAgICAgICAgICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCAiVGltZW91dCIsICJjb25uZWN0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCSAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKHNvYXAtPmNvbm5lY3RfdGltZW91dCkKKyNpZmRlZiBXSU4zMgorICAgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgJmJsb2NraW5nKTsKKyAgICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgICAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgICAgaW9jdGwoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAoaW50KSgmYmxvY2tpbmcpKTsKKyAgICB9CisjZWxzZQorICAgICAgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfR0VURkwpJn5PX05PTkJMT0NLKTsKKyNlbmRpZgorI2VuZGlmCisgICAgaWYgKHNvYXAtPnJlcXVpcmVfc2VydmVyX2F1dGgpCisgICAgeyBYNTA5ICpwZWVyOworICAgICAgaW50IGVycjsKKyAgICAgIGlmICgoZXJyID0gU1NMX2dldF92ZXJpZnlfcmVzdWx0KHNvYXAtPnNzbCkpICE9IFg1MDlfVl9PSykKKyAgICAgIHsgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIFg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKGVyciksICJTU0wgY2VydGlmaWNhdGUgcHJlc2VudGVkIGJ5IHBlZXIgY2Fubm90IGJlIHZlcmlmaWVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyAgICAgIHBlZXIgPSBTU0xfZ2V0X3BlZXJfY2VydGlmaWNhdGUoc29hcC0+c3NsKTsKKyAgICAgIGlmICghcGVlcikKKyAgICAgIHsgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiTm8gU1NMIGNlcnRpZmljYXRlIHdhcyBwcmVzZW50ZWQgYnkgdGhlIHBlZXIgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgICAgWDUwOV9OQU1FX2dldF90ZXh0X2J5X05JRChYNTA5X2dldF9zdWJqZWN0X25hbWUocGVlciksIE5JRF9jb21tb25OYW1lLCBzb2FwLT5tc2didWYsIHNpemVvZihzb2FwLT5tc2didWYpKTsKKyAgICAgIFg1MDlfZnJlZShwZWVyKTsKKyAgICAgIGlmIChzb2FwX3RhZ19jbXAoc29hcC0+bXNnYnVmLCBob3N0KSkKKyAgICAgIHsgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiU1NMIGNlcnRpZmljYXRlIGhvc3QgbmFtZSBtaXNtYXRjaCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9TU0xfRVJST1IpOworICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfU1NMX0VSUk9SOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworI2VuZGlmCisgIH0KKyAgcmV0dXJuIGZkOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JpbmQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmhvc3QsIGludCBwb3J0LCBpbnQgYmFja2xvZykKK3sKKyNpZmRlZiBXSVRIX0lQVjYKKyAgc3RydWN0IGFkZHJpbmZvICphZGRyaW5mbyA9IE5VTEw7CisgIHN0cnVjdCBhZGRyaW5mbyBoaW50czsKKyAgc3RydWN0IGFkZHJpbmZvIHJlczsKKyAgaW50IGVycjsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaW50IGxlbiA9IFNPQVBfQlVGTEVOOworICBpbnQgc2V0ID0gMTsKKyNlbmRpZgorICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSkKKyAgeyBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKXNvYXAtPm1hc3Rlcik7CisgICAgc29hcC0+bWFzdGVyID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBzb2FwLT5zb2NrZXQgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICBzb2FwLT5lcnJtb2RlID0gMTsKKyAgaWYgKHRjcF9pbml0KHNvYXApKQorICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgIlRDUCBpbml0IGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorI2lmZGVmIFdJVEhfSVBWNgorICBtZW1zZXQoKHZvaWQqKSZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisgIGhpbnRzLmFpX2ZhbWlseSA9IFBGX1VOU1BFQzsKKyNpZmRlZiBXSVRIX1VEUAorICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19ER1JBTTsKKyAgZWxzZQorI2VuZGlmCisgICAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKyAgaGludHMuYWlfZmxhZ3MgPSBBSV9QQVNTSVZFOworICBzb2FwLT5lcnJtb2RlID0gMjsKKyAgZXJyID0gZ2V0YWRkcmluZm8oaG9zdCwgc29hcF9pbnQycyhzb2FwLCBwb3J0KSwgJmhpbnRzLCAmYWRkcmluZm8pOworICBpZiAoYWRkcmluZm8pCisgIHsgcmVzID0gKmFkZHJpbmZvOworICAgIHNvYXAtPnBlZXIgPSAqKChzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSopYWRkcmluZm8tPmFpX2FkZHIpOworICAgIHNvYXAtPnBlZXJsZW4gPSBhZGRyaW5mby0+YWlfYWRkcmxlbjsKKyAgICByZXMuYWlfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyOworICAgIHJlcy5haV9hZGRybGVuID0gc29hcC0+cGVlcmxlbjsKKyAgICBmcmVlYWRkcmluZm8oYWRkcmluZm8pOworICB9CisgIGlmIChlcnIpCisgIHsgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgZ2FpX3N0cmVycm9yKGVyciksICJnZXRhZGRyaW5mbyBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgc29hcC0+bWFzdGVyID0gc29ja2V0KHJlcy5haV9mYW1pbHksIHJlcy5haV9zb2NrdHlwZSwgcmVzLmFpX3Byb3RvY29sKTsKKyNlbHNlCisjaWZkZWYgV0lUSF9VRFAKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICBzb2FwLT5tYXN0ZXIgPSAoaW50KXNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKyAgZWxzZQorI2VuZGlmCisgICAgc29hcC0+bWFzdGVyID0gKGludClzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOworI2VuZGlmCisgIHNvYXAtPmVycm1vZGUgPSAwOworICBpZiAoIXNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic29ja2V0IGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorI2lmZGVmIFdJVEhfVURQCisgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgc29hcC0+c29ja2V0ID0gc29hcC0+bWFzdGVyOworI2VuZGlmCisjaWZkZWYgU09DS0VUX0NMT1NFX09OX0VYRUMKKyNpZmRlZiBXSU4zMgorI2lmbmRlZiBVTkRFUl9DRQorICBTZXRIYW5kbGVJbmZvcm1hdGlvbigoSEFORExFKXNvYXAtPm1hc3RlciwgSEFORExFX0ZMQUdfSU5IRVJJVCwgMCk7CisjZW5kaWYKKyNlbHNlCisgIGZjbnRsKHNvYXAtPm1hc3RlciwgRl9TRVRGRCwgMSk7CisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPmJpbmRfZmxhZ3MgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBTT0xfU09DS0VULCBzb2FwLT5iaW5kX2ZsYWdzLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIGlmICgoKHNvYXAtPmltb2RlIHwgc29hcC0+b21vZGUpICYgU09BUF9JT19LRUVQQUxJVkUpICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fS0VFUEFMSVZFIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBTT0xfU09DS0VULCBTT19TTkRCVUYsIChjaGFyKikmbGVuLCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19TTkRCVUYgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIGlmIChzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgKGNoYXIqKSZsZW4sIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX1JDVkJVRiBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNpZmRlZiBUQ1BfTk9ERUxBWQorICBpZiAoIShzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFRDUF9OT0RFTEFZIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBXSVRIX0lQVjYKKyAgc29hcC0+ZXJybW9kZSA9IDA7CisgIGlmIChiaW5kKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIHJlcy5haV9hZGRyLCByZXMuYWlfYWRkcmxlbikpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgYmluZCB0byBob3N0XG4iKSk7CisgICAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiYmluZCBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0gIAorI2Vsc2UKKyAgc29hcC0+cGVlcmxlbiA9IHNpemVvZihzb2FwLT5wZWVyKTsKKyAgbWVtc2V0KCh2b2lkKikmc29hcC0+cGVlciwgMCwgc2l6ZW9mKHNvYXAtPnBlZXIpKTsKKyAgc29hcC0+cGVlci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgc29hcC0+ZXJybW9kZSA9IDI7CisgIGlmIChob3N0KQorICB7IGlmIChzb2FwLT5mcmVzb2x2ZShzb2FwLCBob3N0LCAmc29hcC0+cGVlci5zaW5fYWRkcikpCisgICAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJnZXQgaG9zdCBieSBuYW1lIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgIH0KKyAgfQorICBlbHNlCisgICAgc29hcC0+cGVlci5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfQU5ZKTsKKyAgc29hcC0+cGVlci5zaW5fcG9ydCA9IGh0b25zKChzaG9ydClwb3J0KTsKKyAgc29hcC0+ZXJybW9kZSA9IDA7CisgIGlmIChiaW5kKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyLCBzb2FwLT5wZWVybGVuKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBiaW5kIHRvIGhvc3RcbiIpKTsKKyAgICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJiaW5kIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorI2VuZGlmCisgIGlmICghKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApICYmIGxpc3RlbigoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBiYWNrbG9nKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBiaW5kIHRvIGhvc3RcbiIpKTsKKyAgICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJsaXN0ZW4gZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9ICAKKyAgcmV0dXJuIHNvYXAtPm1hc3RlcjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wb2xsKHN0cnVjdCBzb2FwICpzb2FwKQoreyAKKyNpZm5kZWYgV0lUSF9MRUFOCisgIHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgIGZkX3NldCByZmQsIHNmZCwgeGZkOworICBpbnQgcjsKKyAgdGltZW91dC50dl9zZWMgPSAwOworICB0aW1lb3V0LnR2X3VzZWMgPSAwOworICBGRF9aRVJPKCZyZmQpOworICBGRF9aRVJPKCZzZmQpOworICBGRF9aRVJPKCZ4ZmQpOworICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgeyBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnJmZCk7CisgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZzZmQpOworICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmeGZkKTsKKyAgICByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksICZyZmQsICZzZmQsICZ4ZmQsICZ0aW1lb3V0KTsKKyAgICBpZiAociA+IDAgJiYgRkRfSVNTRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnhmZCkpCisgICAgICByID0gLTE7CisgIH0KKyAgZWxzZSBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSkKKyAgeyBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgJnNmZCk7CisgICAgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPm1hc3RlciArIDEpLCBOVUxMLCAmc2ZkLCBOVUxMLCAmdGltZW91dCk7CisgIH0KKyAgZWxzZQorICAgIHJldHVybiBTT0FQX09LOworICBpZiAociA+IDApCisgIHsKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICBpZiAoc29hcC0+aW1vZGUgJiBTT0FQX0VOQ19TU0wpCisgICAgeworICAgICAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkKKyAgICAgICAmJiBGRF9JU1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmc2ZkKQorICAgICAgICYmICghRkRfSVNTRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnJmZCkKKyAgICAgICAgfHwgU1NMX3BlZWsoc29hcC0+c3NsLCBzb2FwLT50bXBidWYsIDEpID4gMCkpCisgICAgICAgIHJldHVybiBTT0FQX09LOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICAgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpCisgICAgICAgJiYgRkRfSVNTRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnNmZCkKKyAgICAgICAmJiAoIUZEX0lTU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZyZmQpCisgICAgICAgIHx8IHJlY3YoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgc29hcC0+dG1wYnVmLCAxLCBNU0dfUEVFSykgPiAwKSkKKyAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgZWxzZSBpZiAociA8IDApCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgaWYgKChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpIHx8IHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIpCisgICAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZWxlY3QgZmFpbGVkIGluIHNvYXBfcG9sbCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9UQ1BfRVJST1I7CisgICAgfQorICB9CisgIGVsc2UKKyAgICBzb2FwLT5lcnJudW0gPSAwOworICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiUG9sbGluZzogb3RoZXIgZW5kIGRvd24gb24gc29ja2V0PSVkIHNlbGVjdD0lZFxuIiwgc29hcC0+c29ja2V0LCByKSk7CisgIHJldHVybiBTT0FQX0VPRjsKKyNlbHNlCisgIHJldHVybiBTT0FQX09LOworI2VuZGlmCit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Cit0Y3BfYWNjZXB0KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgcywgc3RydWN0IHNvY2thZGRyICphLCBpbnQgKm4pCit7IGludCBmZDsKKyAgZmQgPSAoaW50KWFjY2VwdCgoU09BUF9TT0NLRVQpcywgYSwgKFNPQVBfU09DS0xFTl9UKiluKTsJLyogcG9ydGFiaWxpdHkgbm90ZTogc2VlIFNPQVBfU09DS0xFTl9UIGRlZmluaXRpb24gaW4gc3Rkc29hcDIuaCAqLworI2lmZGVmIFNPQ0tFVF9DTE9TRV9PTl9FWEVDCisjaWZkZWYgV0lOMzIKKyNpZm5kZWYgVU5ERVJfQ0UKKyAgU2V0SGFuZGxlSW5mb3JtYXRpb24oKEhBTkRMRSlmZCwgSEFORExFX0ZMQUdfSU5IRVJJVCwgMCk7CisjZW5kaWYKKyNlbHNlCisgIGZjbnRsKGZkLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKKyNlbmRpZgorI2VuZGlmCisgIHJldHVybiBmZDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9hY2NlcHQoc3RydWN0IHNvYXAgKnNvYXApCit7IGludCBuID0gKGludClzaXplb2Yoc29hcC0+cGVlcik7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpbnQgbGVuID0gU09BUF9CVUZMRU47CisgIGludCBzZXQgPSAxOworI2VuZGlmCisgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyNpZmRlZiBXSVRIX1VEUAorICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIHJldHVybiBzb2FwLT5zb2NrZXQgPSBzb2FwLT5tYXN0ZXI7CisjZW5kaWYKKyAgbWVtc2V0KCh2b2lkKikmc29hcC0+cGVlciwgMCwgc2l6ZW9mKHNvYXAtPnBlZXIpKTsKKyAgc29hcC0+c29ja2V0ID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgc29hcC0+ZXJybW9kZSA9IDA7CisgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOworICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSkKKyAgeyBmb3IgKDs7KQorICAgIHsgCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgaWYgKHNvYXAtPmFjY2VwdF90aW1lb3V0KQorICAgICAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgICAgICBmZF9zZXQgZmQ7CisgICAgICAgIGlmIChzb2FwLT5hY2NlcHRfdGltZW91dCA+IDApCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSBzb2FwLT5hY2NlcHRfdGltZW91dDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IC1zb2FwLT5hY2NlcHRfdGltZW91dC8xMDAwMDAwOworICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IC1zb2FwLT5hY2NlcHRfdGltZW91dCUxMDAwMDAwOworICAgICAgICB9CisgICAgICAgIEZEX1pFUk8oJmZkKTsKKyAgICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsICZmZCk7CisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsgaW50IHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5tYXN0ZXIgKyAxKSwgJmZkLCAmZmQsIE5VTEwsICZ0aW1lb3V0KTsKKyAgICAgICAgICBpZiAociA+IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBpZiAoIXIpCisgICAgICAgICAgeyBzb2FwLT5lcnJudW0gPSAwOworICAgICAgICAgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlRpbWVvdXQiLCAiYWNjZXB0IGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSKQorICAgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJhY2NlcHQgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyNpZiBkZWZpbmVkKFdJTjMyKQorCXsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICAgICAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGSU9OQklPLCAmbm9uYmxvY2tpbmcpOworICAgICAgICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgICAgICAgIHsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICAgICAgICBpb2N0bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGSU9OQklPLCAoaW50KSgmbm9uYmxvY2tpbmcpKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRl9HRVRGTCl8T19OT05CTE9DSyk7CisjZW5kaWYKKyAgICAgIH0KKyAgICAgIGVsc2UKKyNpZiBkZWZpbmVkKFdJTjMyKQorICAgICAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgICAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGSU9OQklPLCAmYmxvY2tpbmcpOworICAgICAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICAgICAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgICAgICBpb2N0bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGSU9OQklPLCAoaW50KSgmYmxvY2tpbmcpKTsKKyAgICAgIH0KKyNlbHNlCisgICAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfR0VURkwpJn5PX05PTkJMT0NLKTsKKyNlbmRpZgorI2VuZGlmCisgICAgICBzb2FwLT5zb2NrZXQgPSBzb2FwLT5mYWNjZXB0KHNvYXAsIHNvYXAtPm1hc3RlciwgKHN0cnVjdCBzb2NrYWRkciopJnNvYXAtPnBlZXIsICZuKTsKKyAgICAgIHNvYXAtPnBlZXJsZW4gPSAoc2l6ZV90KW47CisgICAgICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgICAgIHsKKyNpZmRlZiBXSVRIX0lQVjYKKy8qIFVzZSBzb2FwLT5ob3N0IHRvIHN0b3JlIHRoZSBudW1lcmljIGZvcm0gb2YgdGhlIHJlbW90ZSBob3N0ICovCisgICAgICAgIGdldG5hbWVpbmZvKChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyLCBuLCBzb2FwLT5ob3N0LCBzaXplb2Yoc29hcC0+aG9zdCksIE5VTEwsIDAsIE5JX05VTUVSSUNIT1NUIHwgTklfTlVNRVJJQ1NFUlYpOyAKKyAgICAgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFjY2VwdCBzb2NrZXQgJWQgZnJvbSAlc1xuIiwgc29hcC0+c29ja2V0LCBzb2FwLT5ob3N0KSk7CisgICAgICAgIHNvYXAtPmlwID0gMDsgLyogaW5mbyBzdG9yZWQgaW4gc29hcC0+cGVlciBhbmQgc29hcC0+aG9zdCAqLworICAgICAgICBzb2FwLT5wb3J0ID0gMDsgLyogaW5mbyBzdG9yZWQgaW4gc29hcC0+cGVlciBhbmQgc29hcC0+aG9zdCAqLworI2Vsc2UKKyAgICAgICAgc29hcC0+aXAgPSBudG9obChzb2FwLT5wZWVyLnNpbl9hZGRyLnNfYWRkcik7CisgICAgICAgIHNvYXAtPnBvcnQgPSAoaW50KW50b2hzKHNvYXAtPnBlZXIuc2luX3BvcnQpOyAvKiBkb2VzIG5vdCByZXR1cm4gcG9ydCBudW1iZXIgb24gc29tZSBzeXN0ZW1zICovCisgICAgICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJBY2NlcHQgc29ja2V0ICVkIGF0IHBvcnQgJWQgZnJvbSBJUCAlZC4lZC4lZC4lZFxuIiwgc29hcC0+c29ja2V0LCBzb2FwLT5wb3J0LCAoaW50KShzb2FwLT5pcD4+MjQpJjB4RkYsIChpbnQpKHNvYXAtPmlwPj4xNikmMHhGRiwgKGludCkoc29hcC0+aXA+PjgpJjB4RkYsIChpbnQpc29hcC0+aXAmMHhGRikpOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorCWlmIChzb2FwLT5hY2NlcHRfZmxhZ3MgJiBTT19MSU5HRVIpCisgICAgICAgIHsgc3RydWN0IGxpbmdlciBsaW5nZXI7CisgICAgICAgICAgbWVtc2V0KCh2b2lkKikmbGluZ2VyLCAwLCBzaXplb2YobGluZ2VyKSk7CisgICAgICAgICAgbGluZ2VyLmxfb25vZmYgPSAxOworICAgICAgICAgIGxpbmdlci5sX2xpbmdlciA9IDA7CisJICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBTT0xfU09DS0VULCBTT19MSU5HRVIsIChjaGFyKikmbGluZ2VyLCBzaXplb2Yoc3RydWN0IGxpbmdlcikpKQorICAgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisJICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fTElOR0VSIGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworCSAgICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworCSAgfQorICAgICAgICB9CisgICAgICAgIGlmICgoc29hcC0+YWNjZXB0X2ZsYWdzICYgflNPX0xJTkdFUikgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBTT0xfU09DS0VULCBzb2FwLT5hY2NlcHRfZmxhZ3MgJiB+U09fTElOR0VSLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisJICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKChzb2FwLT5pbW9kZSB8IHNvYXAtPm9tb2RlKSAmIFNPQVBfSU9fS0VFUEFMSVZFKSAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX0tFRVBBTElWRSBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKwkgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICB9CisgICAgICAgIGlmIChzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwgKGNoYXIqKSZsZW4sIHNpemVvZihpbnQpKSkKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX1NOREJVRiBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKwkgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICB9CisgICAgICAgIGlmIChzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgKGNoYXIqKSZsZW4sIHNpemVvZihpbnQpKSkKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX1JDVkJVRiBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKwkgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICB9CisjaWZkZWYgVENQX05PREVMQVkKKyAgICAgICAgaWYgKCEoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBUQ1BfTk9ERUxBWSBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKwkgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICB9CisjZW5kaWYKKyNlbmRpZgorICAgICAgICBpZiAoc29hcC0+YWNjZXB0X3RpbWVvdXQpCisgICAgICAgIHsKKyNpZiBkZWZpbmVkKFdJTjMyKQorICAgICAgICAgIHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgICAgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRklPTkJJTywgJmJsb2NraW5nKTsKKyAgICAgICAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGSU9OQklPLCAmYmxvY2tpbmcpOworI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICAgICAgICAgIHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgICAgICAgaW9jdGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRklPTkJJTywgKGludCkoJmJsb2NraW5nKSk7CisgICAgICAgICAgaW9jdGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRklPTkJJTywgKGludCkoJmJsb2NraW5nKSk7CisjZWxpZiBkZWZpbmVkKFBBTE0pCisgICAgICAgICAgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRl9HRVRGTCwwKSZ+T19OT05CTE9DSyk7CisgICAgICAgICAgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRl9HRVRGTCwwKSZ+T19OT05CTE9DSyk7CisjZWxpZiBkZWZpbmVkKFNZTUJJQU4pCisgICAgICAgICAgbG9uZyBibG9ja2luZyA9IDA7CisgICAgICAgICAgaW9jdGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgMC8qRklPTkJJTyovLCAmYmxvY2tpbmcpOworI2Vsc2UKKyAgICAgICAgICBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGX0dFVEZMKSZ+T19OT05CTE9DSyk7CisgICAgICAgICAgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRl9HRVRGTCkmfk9fTk9OQkxPQ0spOworI2VuZGlmCisJfQorICAgICAgICBzb2FwLT5rZWVwX2FsaXZlID0gKCgoc29hcC0+aW1vZGUgfCBzb2FwLT5vbW9kZSkgJiBTT0FQX0lPX0tFRVBBTElWRSkgIT0gMCk7CisgICAgICAgIHJldHVybiBzb2FwLT5zb2NrZXQ7CisgICAgICB9CisgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUiAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VBR0FJTikKKyAgICAgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFjY2VwdCBmYWlsZWQgZnJvbSAlc1xuIiwgc29hcC0+aG9zdCkpOworICAgICAgICBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiYWNjZXB0IGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworCXNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZQorICB7IHNvYXAtPmVycm51bSA9IDA7CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAibm8gbWFzdGVyIHNvY2tldCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Cit0Y3BfZGlzY29ubmVjdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgaWYgKHNvYXAtPnNzbCkKKyAgeyBpbnQgciwgcyA9IDA7CisgICAgaWYgKHNvYXAtPnNlc3Npb24pCisgICAgICBTU0xfU0VTU0lPTl9mcmVlKHNvYXAtPnNlc3Npb24pOworICAgIGlmICgqc29hcC0+aG9zdCkKKyAgICB7IHNvYXAtPnNlc3Npb24gPSBTU0xfZ2V0MV9zZXNzaW9uKHNvYXAtPnNzbCk7CisgICAgICBpZiAoc29hcC0+c2Vzc2lvbikKKyAgICAgIHsgc3RyY3B5KHNvYXAtPnNlc3Npb25faG9zdCwgc29hcC0+aG9zdCk7CisgICAgICAgIHNvYXAtPnNlc3Npb25fcG9ydCA9IHNvYXAtPnBvcnQ7CisgICAgICB9CisgICAgfQorICAgIHIgPSBTU0xfc2h1dGRvd24oc29hcC0+c3NsKTsKKyAgICBpZiAociAhPSAxKQorICAgIHsgcyA9IEVSUl9nZXRfZXJyb3IoKTsKKyAgICAgIGlmIChzKQorICAgICAgeyBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgICAgICAgeyBzb2FwLT5mc2h1dGRvd25zb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgMSk7CisgICAgICAgICAgc29hcC0+c29ja2V0ID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgfQorICAgICAgICByID0gU1NMX3NodXRkb3duKHNvYXAtPnNzbCk7CisgICAgICB9CisgICAgfQorICAgIERCR0xPRyhURVNULCBpZiAocykgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNodXRkb3duIGZhaWxlZDogJWRcbiIsIFNTTF9nZXRfZXJyb3Ioc29hcC0+c3NsLCByKSkpOworICAgIFNTTF9mcmVlKHNvYXAtPnNzbCk7CisgICAgc29hcC0+c3NsID0gTlVMTDsKKyAgICBpZiAocykKKyAgICAgIHJldHVybiBTT0FQX1NTTF9FUlJPUjsKKyAgICBFUlJfcmVtb3ZlX3N0YXRlKDApOworICB9CisjZW5kaWYKKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkgJiYgIShzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgeyBzb2FwLT5mc2h1dGRvd25zb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgMik7CisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQpOworICAgIHNvYXAtPnNvY2tldCA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Cit0Y3BfY2xvc2Vzb2NrZXQoc3RydWN0IHNvYXAgKnNvYXAsIFNPQVBfU09DS0VUIGZkKQoreyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNsb3NlIHNvY2tldCAlZFxuIiwgKGludClmZCkpOworICByZXR1cm4gY2xvc2Vzb2NrZXQoZmQpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAordGNwX3NodXRkb3duc29ja2V0KHN0cnVjdCBzb2FwICpzb2FwLCBTT0FQX1NPQ0tFVCBmZCwgaW50IGhvdykKK3sgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTaHV0ZG93biBzb2NrZXQgJWQgaG93PSVkXG4iLCAoaW50KWZkLCBob3cpKTsKKyAgcmV0dXJuIHNodXRkb3duKGZkLCBob3cpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfY2xvc2Vzb2NrKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgc3RhdHVzID0gc29hcC0+ZXJyb3I7CisgIGlmIChzdGF0dXMgPT0gU09BUF9FT0YgfHwgc3RhdHVzID09IFNPQVBfVENQX0VSUk9SIHx8IHN0YXR1cyA9PSBTT0FQX1NTTF9FUlJPUiB8fCAhc29hcC0+a2VlcF9hbGl2ZSkKKyAgeyBpZiAoc29hcC0+ZmNsb3NlICYmIChzb2FwLT5lcnJvciA9IHNvYXAtPmZjbG9zZShzb2FwKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7CisgIH0KKyNpZmRlZiBXSVRIX1pMSUIKKyAgaWYgKHNvYXAtPnpsaWJfc3RhdGUgPT0gU09BUF9aTElCX0RFRkxBVEUpCisgICAgZGVmbGF0ZUVuZCgmc29hcC0+ZF9zdHJlYW0pOworICBlbHNlIGlmIChzb2FwLT56bGliX3N0YXRlID09IFNPQVBfWkxJQl9JTkZMQVRFKQorICAgIGluZmxhdGVFbmQoJnNvYXAtPmRfc3RyZWFtKTsKKyAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9OT05FOworI2VuZGlmCisgIHJldHVybiBzb2FwLT5lcnJvciA9IHN0YXR1czsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitzaXplX3QKK1NPQVBfRk1BQzIKK3NvYXBfaGFzaChyZWdpc3RlciBjb25zdCBjaGFyICpzKQoreyByZWdpc3RlciBzaXplX3QgaCA9IDA7CisgIHdoaWxlICgqcykKKyAgICBoID0gNjU1OTkqaCArICpzKys7CisgIHJldHVybiBoICUgU09BUF9JREhBU0g7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZAorc29hcF9pbml0X3BodChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5pdGlhbGl6aW5nIHBvaW50ZXIgaGFzaHRhYmxlXG4iKSk7CisgIHNvYXAtPnBibGsgPSBOVUxMOworICBzb2FwLT5waWR4ID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IChpbnQpU09BUF9QVFJIQVNIOyBpKyspCisgICAgc29hcC0+cGh0W2ldID0gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc3RydWN0IHNvYXAqCitTT0FQX0ZNQUMyCitzb2FwX25ldzEoc29hcF9tb2RlIG1vZGUpCit7IHJldHVybiBzb2FwX25ldzIobW9kZSwgbW9kZSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcCoKK1NPQVBfRk1BQzIKK3NvYXBfbmV3KCkKK3sgcmV0dXJuIHNvYXBfbmV3MihTT0FQX0lPX0RFRkFVTFQsIFNPQVBfSU9fREVGQVVMVCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcCoKK1NPQVBfRk1BQzIKK3NvYXBfbmV3Mihzb2FwX21vZGUgaW1vZGUsIHNvYXBfbW9kZSBvbW9kZSkKK3sgc3RydWN0IHNvYXAgKnNvYXAgPSAoc3RydWN0IHNvYXAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHNvYXApKTsKKyAgaWYgKHNvYXApCisgICAgc29hcF9pbml0Mihzb2FwLCBpbW9kZSwgb21vZGUpOworICByZXR1cm4gc29hcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZGVsKHN0cnVjdCBzb2FwICpzb2FwKQoreyBmcmVlKHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyB2b2lkCitzb2FwX2ZyZWVfcGh0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wYmxrICpwYiwgKm5leHQ7CisgIHJlZ2lzdGVyIGludCBpOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWUgcG9pbnRlciBoYXNodGFibGVcbiIpKTsKKyAgZm9yIChwYiA9IHNvYXAtPnBibGs7IHBiOyBwYiA9IG5leHQpCisgIHsgbmV4dCA9IHBiLT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBwYik7CisgIH0KKyAgc29hcC0+cGJsayA9IE5VTEw7CisgIHNvYXAtPnBpZHggPSAwOworICBmb3IgKGkgPSAwOyBpIDwgKGludClTT0FQX1BUUkhBU0g7IGkrKykKKyAgICBzb2FwLT5waHRbaV0gPSBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VtYmVkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGNvbnN0IGNoYXIgKnRhZywgaW50IHR5cGUpCit7IHJlZ2lzdGVyIGludCBpOworICBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgIGlmIChzb2FwLT52ZXJzaW9uICE9IDEpCisgICAgc29hcC0+ZW5jb2RpbmcgPSAxOworICBpZiAoYSkKKyAgICBpID0gc29hcF9hcnJheV9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCBhLCBuLCB0eXBlLCAmcHApOworICBlbHNlCisgICAgaSA9IHNvYXBfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgdHlwZSwgJnBwKTsKKyAgaWYgKGkpCisgIHsgaWYgKHNvYXBfaXNfZW1iZWRkZWQoc29hcCwgcHApCisgICAgIHx8IHNvYXBfaXNfc2luZ2xlKHNvYXAsIHBwKSkKKyAgICAgIHJldHVybiAwOworICAgIHNvYXBfc2V0X2VtYmVkZGVkKHNvYXAsIHBwKTsKKyAgfQorICByZXR1cm4gaTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wb2ludGVyX2xvb2t1cChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCwgaW50IHR5cGUsIHN0cnVjdCBzb2FwX3BsaXN0ICoqcHBwKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgICpwcHAgPSBOVUxMOworICBpZiAocCkKKyAgeyBmb3IgKHBwID0gc29hcC0+cGh0W3NvYXBfaGFzaF9wdHIocCldOyBwcDsgcHAgPSBwcC0+bmV4dCkKKyAgICB7IGlmIChwcC0+cHRyID09IHAgJiYgcHAtPnR5cGUgPT0gdHlwZSkKKyAgICAgIHsgKnBwcCA9IHBwOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkxvb2t1cCBsb2NhdGlvbj0lcCB0eXBlPSVkIGlkPSVkXG4iLCBwLCB0eXBlLCBwcC0+aWQpKTsKKyAgICAgICAgcmV0dXJuIHBwLT5pZDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJMb29rdXAgbG9jYXRpb249JXAgdHlwZT0lZDogbm90IGZvdW5kXG4iLCBwLCB0eXBlKSk7CisgIHJldHVybiAwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3BvaW50ZXJfZW50ZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgbiwgaW50IHR5cGUsIHN0cnVjdCBzb2FwX3BsaXN0ICoqcHBwKQoreyByZWdpc3RlciBpbnQgaDsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICBpZiAoIXNvYXAtPnBibGsgfHwgc29hcC0+cGlkeCA+PSBTT0FQX1BUUkJMSykKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wYmxrICpwYiA9IChzdHJ1Y3Qgc29hcF9wYmxrKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfcGJsaykpOworICAgIGlmICghcGIpCisgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHBiLT5uZXh0ID0gc29hcC0+cGJsazsKKyAgICBzb2FwLT5wYmxrID0gcGI7CisgICAgc29hcC0+cGlkeCA9IDA7CisgIH0KKyAgKnBwcCA9IHBwID0gJnNvYXAtPnBibGstPnBsaXN0W3NvYXAtPnBpZHgrK107CisgIGlmIChhKQorICAgIGggPSBzb2FwX2hhc2hfcHRyKGEtPl9fcHRyKTsKKyAgZWxzZQorICAgIGggPSBzb2FwX2hhc2hfcHRyKHApOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlBvaW50ZXIgZW50ZXIgbG9jYXRpb249JXAgYXJyYXk9JXAgc2l6ZT0lZCBkaW09JWQgdHlwZT0lZCBpZD0lZFxuIiwgcCwgYT9hLT5fX3B0cjpOVUxMLCBhP2EtPl9fc2l6ZTowLCBuLCB0eXBlLCBzb2FwLT5pZG51bSsxKSk7CisgIHBwLT5uZXh0ID0gc29hcC0+cGh0W2hdOworICBwcC0+dHlwZSA9IHR5cGU7CisgIHBwLT5tYXJrMSA9IDA7CisgIHBwLT5tYXJrMiA9IDA7CisgIHBwLT5wdHIgPSBwOworICBwcC0+YXJyYXkgPSBhOworICBzb2FwLT5waHRbaF0gPSBwcDsKKyAgcHAtPmlkID0gKytzb2FwLT5pZG51bTsKKyAgcmV0dXJuIHBwLT5pZDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9hcnJheV9wb2ludGVyX2xvb2t1cChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCwgY29uc3Qgc3RydWN0IHNvYXBfYXJyYXkgKmEsIGludCBuLCBpbnQgdHlwZSwgc3RydWN0IHNvYXBfcGxpc3QgKipwcHApCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgKnBwcCA9IE5VTEw7CisgIGlmICghcCB8fCAhYS0+X19wdHIpCisgICAgcmV0dXJuIDA7CisgIGZvciAocHAgPSBzb2FwLT5waHRbc29hcF9oYXNoX3B0cihhLT5fX3B0cildOyBwcDsgcHAgPSBwcC0+bmV4dCkKKyAgeyBpZiAocHAtPnR5cGUgPT0gdHlwZSAmJiBwcC0+YXJyYXkgJiYgcHAtPmFycmF5LT5fX3B0ciA9PSBhLT5fX3B0cikKKyAgICB7IHJlZ2lzdGVyIGludCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgaWYgKCgoY29uc3QgaW50KikmcHAtPmFycmF5LT5fX3NpemUpW2ldICE9ICgoY29uc3QgaW50KikmYS0+X19zaXplKVtpXSkKKwkgIGJyZWFrOworICAgICAgaWYgKGkgPT0gbikKKyAgICAgIHsgKnBwcCA9IHBwOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFycmF5IGxvb2t1cCBsb2NhdGlvbj0lcCB0eXBlPSVkIGlkPSVkXG4iLCBhLT5fX3B0ciwgdHlwZSwgcHAtPmlkKSk7CisgICAgICAgIHJldHVybiBwcC0+aWQ7CisgICAgICB9CisgICAgfQorICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQXJyYXkgbG9va3VwIGxvY2F0aW9uPSVwIHR5cGU9JWQ6IG5vdCBmb3VuZFxuIiwgYS0+X19wdHIsIHR5cGUpKTsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9iZWdpbl9jb3VudChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcF9jbHJfYXR0cihzb2FwKTsKKyAgc29hcF9zZXRfbG9jYWxfbmFtZXNwYWNlcyhzb2FwKTsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkgfHwgKHNvYXAtPm9tb2RlICYgU09BUF9FTkNfRElNRSkpCisgICAgc29hcC0+bW9kZSA9IHNvYXAtPm9tb2RlIHwgU09BUF9JT19MRU5HVEggfCBTT0FQX0VOQ19ESU1FOworICBlbHNlCisjZW5kaWYKKyAgeyBzb2FwLT5tb2RlID0gc29hcC0+b21vZGU7CisgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19TVE9SRQorICAgICB8fCAoKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSyB8fCAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1hNTCkpCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgICAgICAmJiAhc29hcC0+ZnByZXBhcmVzZW5kCisjZW5kaWYKKyAgICAgICkpCisgICAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0lPX0xFTkdUSDsKKyAgICBlbHNlCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fTEVOR1RIOworICB9CisjaWZkZWYgV0lUSF9aTElCCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIpICYmIChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19GTFVTSCkKKyAgeyBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkpCisgICAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0lPX0xFTkdUSDsKKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1hNTCkKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19CVUZGRVI7CisgICAgZWxzZQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX1NUT1JFOworICB9CisjZW5kaWYKKyAgaWYgKCFzb2FwLT5lbmNvZGluZ1N0eWxlICYmICEoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0dSQVBIKSkKKyAgICBzb2FwLT5tb2RlIHw9IFNPQVBfWE1MX1RSRUU7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pICYmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkpCisgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19NSU1FOworICBlbHNlCisgICAgc29hcC0+bW9kZSAmPSB+U09BUF9FTkNfTVRPTTsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKQorICAgIHNvYXBfc2VsZWN0X21pbWVfYm91bmRhcnkoc29hcCk7CisgIHNvYXAtPmRpbWUubGlzdCA9IHNvYXAtPmRpbWUubGFzdDsJLyoga2VlcCB0cmFjayBvZiBsYXN0IERJTUUgYXR0YWNobWVudCAqLworI2VuZGlmCisgIHNvYXAtPmNvdW50ID0gMDsKKyAgc29hcC0+bnMgPSAwOworICBzb2FwLT5udWxsID0gMDsKKyAgc29hcC0+cG9zaXRpb24gPSAwOworICBzb2FwLT5tdXN0VW5kZXJzdGFuZCA9IDA7CisgIHNvYXAtPmVuY29kaW5nID0gMDsKKyAgc29hcC0+cGFydCA9IFNPQVBfQkVHSU47CisgIHNvYXAtPmlkbnVtID0gMDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJCZWdpbiBjb3VudCBwaGFzZSAoc29ja2V0PSVkIG1vZGU9MHgleCBjb3VudD0lbHUpXG4iLCBzb2FwLT5zb2NrZXQsIHNvYXAtPm1vZGUsICh1bnNpZ25lZCBsb25nKXNvYXAtPmNvdW50KSk7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXAtPmRpbWUuY291bnQgPSAwOyAvKiBjb3VudCAjIG9mIGF0dGFjaG1lbnRzICovCisgIHNvYXAtPmRpbWUuc2l6ZSA9IDA7IC8qIGFjY3VtdWxhdGUgdG90YWwgc2l6ZSBvZiBhdHRhY2htZW50cyAqLworICBpZiAoc29hcC0+ZnByZXBhcmVpbml0ICYmIChzb2FwLT5tb2RlICYgU09BUF9JTykgIT0gU09BUF9JT19TVE9SRSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBzb2FwLT5mcHJlcGFyZWluaXQoc29hcCk7ICAgCisjZW5kaWYKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW5kX2NvdW50KHN0cnVjdCBzb2FwICpzb2FwKQoreyAKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPmZwcmVwYXJlZmluYWwpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gc29hcC0+ZnByZXBhcmVmaW5hbChzb2FwKTsKKyNlbmRpZgorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBvZiBjb3VudCBwaGFzZVxuIikpOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9iZWdpbl9zZW5kKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIHNvYXBfY2xyX2F0dHIoc29hcCk7CisgIHNvYXBfc2V0X2xvY2FsX25hbWVzcGFjZXMoc29hcCk7CisgIHNvYXAtPm1vZGUgPSBzb2FwLT5vbW9kZSB8IChzb2FwLT5tb2RlICYgKFNPQVBfSU9fTEVOR1RIIHwgU09BUF9FTkNfRElNRSkpOworI2lmZGVmIFdJVEhfWkxJQgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fRkxVU0gpCisgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fQlVGRkVSOworICAgIGVsc2UKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19TVE9SRTsKKyAgfQorI2VuZGlmCisjaWZkZWYgV0lUSF9VRFAKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JT19VRFApKQorICB7IHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfWE1MOworICAgIGlmIChzb2FwLT5jb3VudCA+IFNPQVBfQlVGTEVOKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9VRFBfRVJST1I7CisgIH0KKyNlbmRpZgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0ZMVVNIICYmIHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgIHsgaWYgKHNvYXAtPmNvdW50IHx8IChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpIHx8IChzb2FwLT5tb2RlICYgU09BUF9FTkNfWE1MKSkKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19CVUZGRVI7CisgICAgZWxzZQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX1NUT1JFOworICB9CisgIHNvYXAtPm1vZGUgJj0gflNPQVBfSU9fTEVOR1RIOworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX1NUT1JFKQorICAgIHNvYXBfbmV3X2Jsb2NrKHNvYXApOworICBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9JT19LRUVQQUxJVkUpKQorICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOworICBpZiAoIXNvYXAtPmVuY29kaW5nU3R5bGUgJiYgIShzb2FwLT5tb2RlICYgU09BUF9YTUxfR1JBUEgpKQorICAgIHNvYXAtPm1vZGUgfD0gU09BUF9YTUxfVFJFRTsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSkKKyAgeyBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX01JTUU7CisgICAgc29hcC0+bW9kZSAmPSB+U09BUF9FTkNfRElNRTsKKyAgfQorICBlbHNlCisgICAgc29hcC0+bW9kZSAmPSB+U09BUF9FTkNfTVRPTTsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKQorICAgIHNvYXBfc2VsZWN0X21pbWVfYm91bmRhcnkoc29hcCk7CisjaWZkZWYgV0lOMzIKKyNpZm5kZWYgVU5ERVJfQ0UKKyNpZm5kZWYgV0lUSF9GQVNUQ0dJCisgIGlmICghc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkgLyogU2V0IHdpbjMyIHN0ZG91dCBvciBzb2FwLT5zZW5kZmQgdG8gQklOQVJZLCBlLmcuIHRvIHN1cHBvcnQgRElNRSAqLworI2lmZGVmIF9fQk9STEFORENfXworICAgIHNldG1vZGUoKFNPQVBfU09DS0VUKXNvYXAtPnNlbmRmZCwgT19CSU5BUlkpOworI2Vsc2UKKyAgICBfc2V0bW9kZSgoU09BUF9TT0NLRVQpc29hcC0+c2VuZGZkLCBfT19CSU5BUlkpOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKQorICB7IHNvYXAtPmJ1ZmlkeCA9IDA7CisgICAgc29hcC0+YnVmbGVuID0gMDsKKyAgfQorICBzb2FwLT5jaHVua3NpemUgPSAwOworICBzb2FwLT5ucyA9IDA7CisgIHNvYXAtPm51bGwgPSAwOworICBzb2FwLT5wb3NpdGlvbiA9IDA7CisgIHNvYXAtPm11c3RVbmRlcnN0YW5kID0gMDsKKyAgc29hcC0+ZW5jb2RpbmcgPSAwOworICBzb2FwLT5pZG51bSA9IDA7CisgIHNvYXAtPmxldmVsID0gMDsKKyNpZmRlZiBXSVRIX1pMSUIKKyAgc29hcC0+el9yYXRpb19vdXQgPSAxLjA7CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIpICYmIHNvYXAtPnpsaWJfc3RhdGUgIT0gU09BUF9aTElCX0RFRkxBVEUpCisgIHsKKyNpZmRlZiBXSVRIX0daSVAKKyAgICBtZW1jcHkoc29hcC0+el9idWYsICJcMzdcMjEzXDEwXDBcMFwwXDBcMFwwXDM3NyIsIDEwKTsKKyAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IChCeXRlKilzb2FwLT56X2J1ZiArIDEwOworICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCA9IFNPQVBfQlVGTEVOIC0gMTA7CisgICAgc29hcC0+el9jcmMgPSBjcmMzMigwTCwgTlVMTCwgMCk7CisgICAgaWYgKGRlZmxhdGVJbml0Migmc29hcC0+ZF9zdHJlYW0sIHNvYXAtPnpfbGV2ZWwsIFpfREVGTEFURUQsIC1NQVhfV0JJVFMsIDgsIFpfREVGQVVMVF9TVFJBVEVHWSkgIT0gWl9PSykKKyNlbHNlCisgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZSopc29hcC0+el9idWY7CisgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0ID0gU09BUF9CVUZMRU47CisgICAgaWYgKGRlZmxhdGVJbml0KCZzb2FwLT5kX3N0cmVhbSwgc29hcC0+el9sZXZlbCkgIT0gWl9PSykKKyNlbmRpZgorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVmbGF0ZSBpbml0aWFsaXplZFxuIikpOworICAgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfREVGTEFURTsKKyAgfQorI2VuZGlmCisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQmVnaW4gc2VuZCBwaGFzZSAoc29ja2V0PSVkIG1vZGU9MHgleCBjb3VudD0lbHUpXG4iLCBzb2FwLT5zb2NrZXQsIHNvYXAtPm1vZGUsICh1bnNpZ25lZCBsb25nKXNvYXAtPmNvdW50KSk7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0JFR0lOOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+ZnByZXBhcmVpbml0ICYmIChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19TVE9SRSkKKyAgICBzb2FwLT5mcHJlcGFyZWluaXQoc29hcCk7ICAgCisjZW5kaWYKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9lbWJlZGRlZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCwgaW50IHQpCit7IHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgaWYgKHNvYXBfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgdCwgJnBwKSkKKyAgeyBwcC0+bWFyazEgPSAxOworICAgIHBwLT5tYXJrMiA9IDE7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbWJlZGRlZCAlcCB0eXBlPSVkIG1hcmsgc2V0IHRvIDFcbiIsIHAsIHQpKTsKKyAgfQorfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlZmVyZW5jZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCwgaW50IHQpCit7IHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgaWYgKCFwIHx8IChzb2FwLT5tb2RlICYgU09BUF9YTUxfVFJFRSkpCisgICAgcmV0dXJuIDE7CisgIGlmIChzb2FwX3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIHQsICZwcCkpCisgIHsgaWYgKHBwLT5tYXJrMSA9PSAwKQorICAgIHsgcHAtPm1hcmsxID0gMjsKKyAgICAgIHBwLT5tYXJrMiA9IDI7CisgICAgfQorICB9CisgIGVsc2UgaWYgKHNvYXBfcG9pbnRlcl9lbnRlcihzb2FwLCBwLCBOVUxMLCAwLCB0LCAmcHApKQorICB7IHBwLT5tYXJrMSA9IDA7CisgICAgcHAtPm1hcmsyID0gMDsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIDE7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVmZXJlbmNlICVwIHR5cGU9JWQgKCVkICVkKVxuIiwgcCwgdCwgKGludClwcC0+bWFyazEsIChpbnQpcHAtPm1hcmsyKSk7CisgIHJldHVybiBwcC0+bWFyazE7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYXJyYXlfcmVmZXJlbmNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGludCB0KQoreyByZWdpc3RlciBpbnQgaTsKKyAgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICBpZiAoIXAgfHwgIWEtPl9fcHRyKQorICAgIHJldHVybiAxOworICBpID0gc29hcF9hcnJheV9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCBhLCBuLCB0LCAmcHApOworICBpZiAoaSkKKyAgeyBpZiAocHAtPm1hcmsxID09IDApCisgICAgeyBwcC0+bWFyazEgPSAyOworICAgICAgcHAtPm1hcmsyID0gMjsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoIXNvYXBfcG9pbnRlcl9lbnRlcihzb2FwLCBwLCBhLCBuLCB0LCAmcHApKQorICAgIHJldHVybiAxOworICBlbHNlCisgIHsgcHAtPm1hcmsxID0gMDsKKyAgICBwcC0+bWFyazIgPSAwOworICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQXJyYXkgcmVmZXJlbmNlICVwIHB0cj0lcCBkaW09JWQgdHlwZT0lZCAoJWQgJWQpXG4iLCBwLCBhLT5fX3B0ciwgbiwgdCwgKGludClwcC0+bWFyazEsIChpbnQpcHAtPm1hcmsyKSk7CisgIHJldHVybiBwcC0+bWFyazE7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW1iZWRkZWRfaWQoc3RydWN0IHNvYXAgKnNvYXAsIGludCBpZCwgY29uc3Qgdm9pZCAqcCwgaW50IHQpCit7IHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9UUkVFKQorICAgIHJldHVybiBpZDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbWJlZGRlZF9pZCAlcCB0eXBlPSVkIGlkPSVkXG4iLCBwLCB0LCBpZCkpOworICBpZiAoc29hcC0+dmVyc2lvbiA9PSAxICYmIHNvYXAtPmVuY29kaW5nU3R5bGUgJiYgIShzb2FwLT5tb2RlICYgU09BUF9YTUxfR1JBUEgpICYmIHNvYXAtPnBhcnQgIT0gU09BUF9JTl9IRUFERVIpCisgIHsgaWYgKGlkIDwgMCkKKyAgICB7IGlkID0gc29hcF9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCB0LCAmcHApOworICAgICAgaWYgKGlkKQorICAgICAgeyBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICAgICAgICAgIHBwLT5tYXJrMSA9IDI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwcC0+bWFyazIgPSAyOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVtYmVkZGVkX2lkIG11bHRpcmVmIGlkPSVkICVwIHR5cGU9JWQgPSAoJWQgJWQpXG4iLCBpZCwgcCwgdCwgKGludClwcC0+bWFyazEsIChpbnQpcHAtPm1hcmsyKSk7CisgICAgICB9CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBpZDsKKyAgfQorICBpZiAoaWQgPCAwKQorICAgIGlkID0gc29hcF9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCB0LCAmcHApOworICBlbHNlIGlmIChpZCAmJiAhc29hcF9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCB0LCAmcHApKQorICAgIHJldHVybiAwOworICBpZiAoaWQgJiYgcHApCisgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICAgIHBwLT5tYXJrMSA9IDE7CisgICAgZWxzZQorICAgICAgcHAtPm1hcmsyID0gMTsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVtYmVkZGVkX2lkIGVtYmVkZGVkIHJlZiBpZD0lZCAlcCB0eXBlPSVkID0gKCVkICVkKVxuIiwgaWQsIHAsIHQsIChpbnQpcHAtPm1hcmsxLCAoaW50KXBwLT5tYXJrMikpOworICB9CisgIHJldHVybiBpZDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9pc19lbWJlZGRlZChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGxpc3QgKnBwKQoreyBpZiAoIXBwKQorICAgIHJldHVybiAwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIklzIGVtYmVkZGVkPyAlZCAlZFxuIiwgKGludClwcC0+bWFyazEsIChpbnQpcHAtPm1hcmsyKSk7CisgIGlmIChzb2FwLT52ZXJzaW9uID09IDEgJiYgc29hcC0+ZW5jb2RpbmdTdHlsZSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9HUkFQSCkgJiYgc29hcC0+cGFydCAhPSBTT0FQX0lOX0hFQURFUikKKyAgeyBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICAgICAgcmV0dXJuIHBwLT5tYXJrMSAhPSAwOworICAgIHJldHVybiBwcC0+bWFyazIgIT0gMDsKKyAgfQorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICAgIHJldHVybiBwcC0+bWFyazEgPT0gMTsKKyAgcmV0dXJuIHBwLT5tYXJrMiA9PSAxOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2lzX3NpbmdsZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGxpc3QgKnBwKQoreyBpZiAoc29hcC0+cGFydCA9PSBTT0FQX0lOX0hFQURFUikKKyAgICByZXR1cm4gMTsKKyAgaWYgKCFwcCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICByZXR1cm4gcHAtPm1hcmsxID09IDA7CisgIHJldHVybiBwcC0+bWFyazIgPT0gMDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2VtYmVkZGVkKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHApCit7IGlmICghcHApCisgICAgcmV0dXJuOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICAgIHBwLT5tYXJrMSA9IDE7CisgIGVsc2UKKyAgICBwcC0+bWFyazIgPSAxOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2F0dGFjaG1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgY29uc3QgY2hhciAqYWlkLCBjb25zdCBjaGFyICphdHlwZSwgY29uc3QgY2hhciAqYW9wdGlvbnMsIGludCBuLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkgCit7IHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgaW50IGk7CisgIGlmICghcCB8fCAhYS0+X19wdHIgfHwgKCFhaWQgJiYgIWF0eXBlKSkKKyAgICByZXR1cm4gc29hcF9lbGVtZW50X2lkKHNvYXAsIHRhZywgaWQsIHAsIGEsIG4sIHR5cGUsIHQpOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkF0dGFjaG1lbnQgdGFnPSclcycgaWQ9JyVzJyAoJWQpIHR5cGU9JyVzJ1xuIiwgdGFnLCBhaWQ/YWlkOiIiLCBpZCwgYXR5cGU/YXR5cGU6IiIpKTsKKyAgaSA9IHNvYXBfYXJyYXlfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgYSwgbiwgdCwgJnBwKTsKKyAgaWYgKCFpKQorICB7IGkgPSBzb2FwX3BvaW50ZXJfZW50ZXIoc29hcCwgcCwgYSwgbiwgdCwgJnBwKTsKKyAgICBpZiAoIWkpCisgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorICBpZiAoaWQgPD0gMCkKKyAgICBpZCA9IGk7CisgIGlmICghYWlkKQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCBzb2FwLT5kaW1lX2lkX2Zvcm1hdCwgaWQpOworICAgIGFpZCA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPnRtcGJ1Zik7CisgIH0KKyAgLyogQWRkIE1UT00geG9wOkluY2x1ZGUgZWxlbWVudCB3aGVuIG5lY2Vzc2FyeSAqLworICAvKiBUT0RPOiB0aGlzIGNvZGUgdG8gYmUgb2Jzb2xldGVkIHdpdGggbmV3IGltcG9ydC94b3AuaCBjb252ZW50aW9ucyAqLworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKSAmJiBzdHJjbXAodGFnLCAieG9wOkluY2x1ZGUiKSkKKyAgeyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIDAsIHR5cGUpCisgICAgIHx8IHNvYXBfZWxlbWVudF9ocmVmKHNvYXAsICJ4b3A6SW5jbHVkZSIsIDAsICJocmVmIiwgYWlkKQorICAgICB8fCBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGVsc2UgaWYgKHNvYXBfZWxlbWVudF9ocmVmKHNvYXAsIHRhZywgMCwgImhyZWYiLCBhaWQpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgeyBpZiAocHAtPm1hcmsxICE9IDMpCisgICAgeyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgICAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pCisgICAgICAgIGNvbnRlbnQgPSBzb2FwX25ld19tdWx0aXBhcnQoc29hcCwgJnNvYXAtPm1pbWUuZmlyc3QsICZzb2FwLT5taW1lLmxhc3QsIChjaGFyKilhLT5fX3B0ciwgYS0+X19zaXplKTsKKyAgICAgIGVsc2UKKyAgICAgICAgY29udGVudCA9IHNvYXBfbmV3X211bHRpcGFydChzb2FwLCAmc29hcC0+ZGltZS5maXJzdCwgJnNvYXAtPmRpbWUubGFzdCwgKGNoYXIqKWEtPl9fcHRyLCBhLT5fX3NpemUpOworICAgICAgaWYgKCFjb250ZW50KQorICAgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBpZiAoIXN0cm5jbXAoYWlkLCAiY2lkOiIsIDQpKSAvKiBSRkMgMjExMSAqLworICAgICAgeyBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pCisgICAgICAgIHsgY2hhciAqcyA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzdHJsZW4oYWlkKSAtIDEpOworCSAgaWYgKHMpCisJICB7ICpzID0gJzwnOworCSAgICBzdHJjcHkocyArIDEsIGFpZCArIDQpOworCSAgICBzdHJjYXQocywgIj4iKTsKKwkgICAgY29udGVudC0+aWQgPSBzOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgY29udGVudC0+aWQgPSBhaWQgKyA0OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBjb250ZW50LT5pZCA9IGFpZDsKKyAgICAgIGNvbnRlbnQtPnR5cGUgPSBhdHlwZTsKKyAgICAgIGNvbnRlbnQtPm9wdGlvbnMgPSBhb3B0aW9uczsKKyAgICAgIGNvbnRlbnQtPmVuY29kaW5nID0gU09BUF9NSU1FX0JJTkFSWTsKKyAgICAgIHBwLT5tYXJrMSA9IDM7CisgICAgfQorICB9CisgIGVsc2UKKyAgICBwcC0+bWFyazIgPSAzOworICByZXR1cm4gLTE7Cit9CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyB2b2lkCitzb2FwX2luaXRfaWh0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgaTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbml0aWFsaXppbmcgSUQgaGFzaHRhYmxlXG4iKSk7CisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0lESEFTSDsgaSsrKQorICAgIHNvYXAtPmlodFtpXSA9IE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZAorc29hcF9mcmVlX2lodChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICppcCwgKnA7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2ZsaXN0ICpmcCwgKmZxOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWUgSUQgaGFzaHRhYmxlXG4iKSk7CisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0lESEFTSDsgaSsrKQorICB7IGZvciAoaXAgPSBzb2FwLT5paHRbaV07IGlwOyBpcCA9IHApCisgICAgeyBmb3IgKGZwID0gaXAtPmZsaXN0OyBmcDsgZnAgPSBmcSkKKyAgICAgIHsgZnEgPSBmcC0+bmV4dDsKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIGZwKTsKKyAgICAgIH0KKyAgICAgIHAgPSBpcC0+bmV4dDsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBpcCk7CisgICAgfQorICAgIHNvYXAtPmlodFtpXSA9IE5VTEw7CisgIH0KK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwX2lsaXN0ICoKK1NPQVBfRk1BQzIKK3NvYXBfbG9va3VwKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworICBmb3IgKGlwID0gc29hcC0+aWh0W3NvYXBfaGFzaChpZCldOyBpcDsgaXAgPSBpcC0+bmV4dCkKKyAgICBpZiAoIXN0cmNtcChpcC0+aWQsIGlkKSkKKyAgICAgIHJldHVybiBpcDsKKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcF9pbGlzdCAqCitTT0FQX0ZNQUMyCitzb2FwX2VudGVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCkKK3sgcmVnaXN0ZXIgc2l6ZV90IGg7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgaXAgPSAoc3RydWN0IHNvYXBfaWxpc3QqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9pbGlzdCkgKyBzdHJsZW4oaWQpKTsKKyAgaWYgKGlwKQorICB7IGggPSBzb2FwX2hhc2goaWQpOworICAgIHN0cmNweShpcC0+aWQsIGlkKTsKKyAgICBpcC0+bmV4dCA9IHNvYXAtPmlodFtoXTsKKyAgICBzb2FwLT5paHRbaF0gPSBpcDsKKyAgICByZXR1cm4gaXA7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQqCitTT0FQX0ZNQUMyCitzb2FwX21hbGxvYyhzdHJ1Y3Qgc29hcCAqc29hcCwgc2l6ZV90IG4pCit7IHJlZ2lzdGVyIGNoYXIgKnA7CisgIGlmICghbikKKyAgICByZXR1cm4gKHZvaWQqKVNPQVBfTk9OX05VTEw7CisgIGlmICghc29hcCkKKyAgICByZXR1cm4gU09BUF9NQUxMT0Moc29hcCwgbik7CisgIG4gKz0gKC0obG9uZyluKSAmIChzaXplb2Yodm9pZCopLTEpOyAvKiBhbGlnbiBhdCA0LSwgOC0gb3IgMTYtYnl0ZSBib3VuZGFyeSAqLworICBpZiAoIShwID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIG4gKyBzaXplb2Yodm9pZCopICsgc2l6ZW9mKHNpemVfdCkpKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHJldHVybiBOVUxMOworICB9CisgIC8qIGtlZXAgY2hhaW4gb2YgYWxsb2NlZCBjZWxscyBmb3IgbGF0ZXIgZGVzdHJ1Y3Rpb24gKi8KKyAgc29hcC0+YWxsb2NlZCA9IDE7CisgICoodm9pZCoqKShwICsgbikgPSBzb2FwLT5hbGlzdDsKKyAgKihzaXplX3QqKShwICsgbiArIHNpemVvZih2b2lkKikpID0gbjsKKyAgc29hcC0+YWxpc3QgPSBwICsgbjsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitzdGF0aWMgdm9pZAorc29hcF9pbml0X21odChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCAoaW50KVNPQVBfUFRSSEFTSDsgaSsrKQorICAgIHNvYXAtPm1odFtpXSA9IE5VTEw7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitzdGF0aWMgdm9pZAorc29hcF9mcmVlX21odChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX21saXN0ICptcCwgKm1xOworICBmb3IgKGkgPSAwOyBpIDwgKGludClTT0FQX1BUUkhBU0g7IGkrKykKKyAgeyBmb3IgKG1wID0gc29hcC0+bWh0W2ldOyBtcDsgbXAgPSBtcSkKKyAgICB7IG1xID0gbXAtPm5leHQ7CisgICAgICBpZiAobXAtPmxpdmUpCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMoJWQpOiBtYWxsb2MoKSA9ICVwIG5vdCBmcmVlZCAobWVtb3J5IGxlYWsgb3IgZm9yZ290IHRvIGNhbGwgc29hcF9lbmQoKT8pXG4iLCBtcC0+ZmlsZSwgbXAtPmxpbmUsIG1wLT5wdHIpOworICAgICAgZnJlZShtcCk7CisgICAgfQorICAgIHNvYXAtPm1odFtpXSA9IE5VTEw7CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK1NPQVBfRk1BQzEKK3ZvaWQqCitTT0FQX0ZNQUMyCitzb2FwX3RyYWNrX21hbGxvYyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIHNpemVfdCBzaXplKQoreyByZWdpc3RlciB2b2lkICpwID0gbWFsbG9jKHNpemUpOworICBpZiAoc29hcCkKKyAgeyByZWdpc3RlciBpbnQgaCA9IHNvYXBfaGFzaF9wdHIocCk7CisgICAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbWxpc3QgKm1wID0gKHN0cnVjdCBzb2FwX21saXN0KiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2FwX21saXN0KSk7CisgICAgaWYgKHNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYX1RFU1RdKQorICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIlcyglZCk6IG1hbGxvYyglbHUpID0gJXBcbiIsIGZpbGUsIGxpbmUsICh1bnNpZ25lZCBsb25nKXNpemUsIHApKTsKKyAgICBtcC0+bmV4dCA9IHNvYXAtPm1odFtoXTsKKyAgICBtcC0+cHRyID0gcDsKKyAgICBtcC0+ZmlsZSA9IGZpbGU7CisgICAgbXAtPmxpbmUgPSBsaW5lOworICAgIG1wLT5saXZlID0gMTsKKyAgICBzb2FwLT5taHRbaF0gPSBtcDsKKyAgfQorICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfdHJhY2tfZnJlZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIHZvaWQgKnApCit7IHJlZ2lzdGVyIGludCBoID0gc29hcF9oYXNoX3B0cihwKTsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbWxpc3QgKm1wOworICBmb3IgKG1wID0gc29hcC0+bWh0W2hdOyBtcDsgbXAgPSBtcC0+bmV4dCkKKyAgICBpZiAobXAtPnB0ciA9PSBwKQorICAgICAgYnJlYWs7CisgIGlmIChtcCkKKyAgeyBpZiAobXAtPmxpdmUpCisgICAgeyBmcmVlKHApOworICAgICAgaWYgKHNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYX1RFU1RdKQorICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIiVzKCVkKTogZnJlZSglcClcbiIsIGZpbGUsIGxpbmUsIHApKTsKKyAgICAgIG1wLT5saXZlID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgICAgZnByaW50ZihzdGRlcnIsICIlcyglZCk6IGZyZWUoJXApIGRvdWJsZSBmcmVlIG9mIHBvaW50ZXIgbWFsbG9jZWQgYXQgJXMoJWQpXG4iLCBmaWxlLCBsaW5lLCBwLCBtcC0+ZmlsZSwgbXAtPmxpbmUpOworICB9CisgIGVsc2UKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzKCVkKTogZnJlZSglcCkgcG9pbnRlciBub3QgbWFsbG9jZWRcbiIsIGZpbGUsIGxpbmUsIHApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworc3RhdGljIHZvaWQKK3NvYXBfdHJhY2tfdW5saW5rKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwKQoreyByZWdpc3RlciBpbnQgaCA9IHNvYXBfaGFzaF9wdHIocCk7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX21saXN0ICptcDsKKyAgZm9yIChtcCA9IHNvYXAtPm1odFtoXTsgbXA7IG1wID0gbXAtPm5leHQpCisgICAgaWYgKG1wLT5wdHIgPT0gcCkKKyAgICAgIGJyZWFrOworICBpZiAobXApCisgICAgbXAtPmxpdmUgPSAwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9kZWFsbG9jKHN0cnVjdCBzb2FwICpzb2FwLCB2b2lkICpwKQoreyBpZiAoIXNvYXApCisgICAgcmV0dXJuOworICBpZiAocCkKKyAgeyByZWdpc3RlciBjaGFyICoqcTsKKyAgICBmb3IgKHEgPSAoY2hhcioqKSZzb2FwLT5hbGlzdDsgKnE7IHEgPSAqKGNoYXIqKiopcSkKKyAgICB7IGlmIChwID09ICh2b2lkKikoKnEgLSAqKHNpemVfdCopKCpxICsgc2l6ZW9mKHZvaWQqKSkpKQorICAgICAgeyAqcSA9ICoqKGNoYXIqKiopcTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlZCBkYXRhIGF0ICVwXG4iLCBwKSk7CisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgICBzb2FwX2RlbGV0ZShzb2FwLCBwKTsKKyAgfQorICBlbHNlCisgIHsgcmVnaXN0ZXIgY2hhciAqcTsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWUgYWxsIHNvYXBfbWFsbG9jKCkgZGF0YVxuIikpOworICAgIHdoaWxlIChzb2FwLT5hbGlzdCkKKyAgICB7IHEgPSAoY2hhciopc29hcC0+YWxpc3Q7CisgICAgICBzb2FwLT5hbGlzdCA9ICoodm9pZCoqKXE7CisgICAgICBxIC09ICooc2l6ZV90KikocSArIHNpemVvZih2b2lkKikpOworICAgICAgU09BUF9GUkVFKHNvYXAsIHEpOworICAgIH0KKyAgfQorICAvKiB3ZSBtdXN0IGFzc3VtZSB0aGVzZSB3ZXJlIGRlYWxsb2NhdGVkOiAqLworICBzb2FwLT5hY3Rpb24gPSBOVUxMOworICBzb2FwLT5mYXVsdCA9IE5VTEw7CisgIHNvYXAtPmhlYWRlciA9IE5VTEw7CisgIHNvYXAtPnVzZXJpZCA9IE5VTEw7CisgIHNvYXAtPnBhc3N3ZCA9IE5VTEw7CisgIHNvYXAtPmF1dGhyZWFsbSA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXBfY2xyX21pbWUoc29hcCk7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZGVsZXRlKHN0cnVjdCBzb2FwICpzb2FwLCB2b2lkICpwKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9jbGlzdCAqKmNwOworICBpZiAoc29hcF9jaGVja19zdGF0ZShzb2FwKSkKKyAgICByZXR1cm47CisgIGNwID0gJnNvYXAtPmNsaXN0OworICBpZiAocCkKKyAgeyB3aGlsZSAoKmNwKQorICAgIHsgaWYgKHAgPT0gKCpjcCktPnB0cikKKyAgICAgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfY2xpc3QgKnEgPSAqY3A7CisgICAgICAgICpjcCA9IHEtPm5leHQ7CisgICAgICAgIHEtPmZkZWxldGUocSk7CisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBxKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgY3AgPSAmKCpjcCktPm5leHQ7CisgICAgfQorICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IGRlYWxsb2MgZGF0YSAlcDogYWRkcmVzcyBub3QgaW4gbGlzdFxuIiwgcCkpOworICB9CisgIGVsc2UKKyAgeyB3aGlsZSAoKmNwKQorICAgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfY2xpc3QgKnEgPSAqY3A7CisgICAgICAqY3AgPSBxLT5uZXh0OworICAgICAgaWYgKHEtPnB0ciA9PSAodm9pZCopc29hcC0+ZmF1bHQpCisgICAgICAgIHNvYXAtPmZhdWx0ID0gTlVMTDsgLyogdGhpcyB3YXMgZGVhbGxvY2F0ZWQgKi8KKyAgICAgIGVsc2UgaWYgKHEtPnB0ciA9PSAodm9pZCopc29hcC0+aGVhZGVyKQorICAgICAgICBzb2FwLT5oZWFkZXIgPSBOVUxMOyAvKiB0aGlzIHdhcyBkZWFsbG9jYXRlZCAqLworICAgICAgcS0+ZmRlbGV0ZShxKTsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBxKTsKKyAgICB9CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwX2NsaXN0ICoKK1NPQVBfRk1BQzIKK3NvYXBfbGluayhzdHJ1Y3Qgc29hcCAqc29hcCwgdm9pZCAqcCwgaW50IHQsIGludCBuLCB2b2lkICgqZmRlbGV0ZSkoc3RydWN0IHNvYXBfY2xpc3QqKSkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfY2xpc3QgKmNwOworICBpZiAoKGNwID0gKHN0cnVjdCBzb2FwX2NsaXN0KilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfY2xpc3QpKSkpCisgIHsgY3AtPm5leHQgPSBzb2FwLT5jbGlzdDsKKyAgICBjcC0+dHlwZSA9IHQ7CisgICAgY3AtPnNpemUgPSBuOyAKKyAgICBjcC0+cHRyID0gcDsKKyAgICBjcC0+ZmRlbGV0ZSA9IGZkZWxldGU7CisgICAgc29hcC0+Y2xpc3QgPSBjcDsKKyAgfQorICByZXR1cm4gY3A7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3VubGluayhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCkKK3sgcmVnaXN0ZXIgY2hhciAqKnE7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2NsaXN0ICoqY3A7CisgIGlmICghc29hcCB8fCAhcCkKKyAgICByZXR1cm47CisgIGZvciAocSA9IChjaGFyKiopJnNvYXAtPmFsaXN0OyAqcTsgcSA9ICooY2hhcioqKilxKQorICB7IGlmIChwID09ICh2b2lkKikoKnEgLSAqKHNpemVfdCopKCpxICsgc2l6ZW9mKHZvaWQqKSkpKQorICAgIHsgKnEgPSAqKihjaGFyKioqKXE7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVubGlua2VkIGRhdGEgJXBcbiIsIHApKTsKKyNpZmRlZiBTT0FQX0RFQlVHCisgICAgICBzb2FwX3RyYWNrX3VubGluayhzb2FwLCBwKTsKKyNlbmRpZgorICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBmb3IgKGNwID0gJnNvYXAtPmNsaXN0OyAqY3A7IGNwID0gJigqY3ApLT5uZXh0KQorICB7IGlmIChwID09ICgqY3ApLT5wdHIpCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVubGlua2VkIGNsYXNzIGluc3RhbmNlICVwXG4iLCBwKSk7CisgICAgICBxID0gKGNoYXIqKikqY3A7CisgICAgICAqY3AgPSAoKmNwKS0+bmV4dDsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBxKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfbG9va3VwX3R5cGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIGlmIChpZCAmJiAqaWQpCisgIHsgaXAgPSBzb2FwX2xvb2t1cChzb2FwLCBpZCk7CisgICAgaWYgKGlwKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJMb29rdXAgaWQ9JyVzJyB0eXBlPSVkXG4iLCBpZCwgaXAtPnR5cGUpKTsKKyAgICAgIHJldHVybiBpcC0+dHlwZTsKKyAgICB9CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJsb29rdXAgdHlwZSBpZD0nJXMnIE5PVCBGT1VORCEgTmVlZCB0byBnZXQgaXQgZnJvbSB4c2k6dHlwZVxuIiwgaWQpKTsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkKgorU09BUF9GTUFDMgorc29hcF9pZF9sb29rdXAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCB2b2lkICoqcCwgaW50IHQsIHNpemVfdCBuLCB1bnNpZ25lZCBpbnQgaykKK3sgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworICB2b2lkICoqcTsKKyAgaWYgKCFwIHx8ICFpZCB8fCAhKmlkKQorICAgIHJldHVybiBwOworICBpcCA9IHNvYXBfbG9va3VwKHNvYXAsIGlkKTsgLyogbG9va3VwIHBvaW50ZXIgdG8gaGFzaCB0YWJsZSBlbnRyeSBmb3Igc3RyaW5nIGlkICovCisgIGlmICghaXApCisgIHsgaXAgPSBzb2FwX2VudGVyKHNvYXAsIGlkKTsgLyogbmV3IGhhc2ggdGFibGUgZW50cnkgZm9yIHN0cmluZyBpZCAqLworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRm9yd2FyZGluZyBmaXJzdCBocmVmPSclcycgdHlwZT0lZCAlcCAoJXUgYnl0ZXMpXG4iLCBpZCwgdCwgcCwgKHVuc2lnbmVkIGludCluKSk7CisgICAgaXAtPnR5cGUgPSB0OworICAgIGlwLT5zaXplID0gbjsgCisgICAgaXAtPmxpbmsgPSBwOworICAgIGlwLT5jb3B5ID0gTlVMTDsKKyAgICBpcC0+Zmxpc3QgPSBOVUxMOworICAgIGlwLT5wdHIgPSBOVUxMOworICAgIGlwLT5sZXZlbCA9IGs7CisgICAgKnAgPSBOVUxMOworICB9CisgIGVsc2UgaWYgKGlwLT5wdHIpCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHZlZCBocmVmPSclcycgdHlwZT0lZCBsb2NhdGlvbj0lcCAoJXUgYnl0ZXMpXG4iLCBpZCwgdCwgaXAtPnB0ciwgKHVuc2lnbmVkIGludCluKSk7CisgICAgaWYgKGlwLT50eXBlICE9IHQpCisgICAgeyBzdHJjcHkoc29hcC0+aWQsIGlkKTsKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9IUkVGOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJUeXBlIGluY29tcGF0aWJpbGl0eTogaWQgdHlwZT0lZCBocmVmIHR5cGU9JWRcbiIsIGlwLT50eXBlLCB0KSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgd2hpbGUgKGlwLT5sZXZlbCA8IGspCisgICAgeyBxID0gKHZvaWQqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yodm9pZCopKTsgIAorICAgICAgaWYgKCFxKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICpwID0gKHZvaWQqKXE7CisgICAgICBwID0gcTsKKyAgICAgIGstLTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVzY2VuZGluZyBvbmUgbGV2ZWwuLi5cbiIpKTsKKyAgICB9CisgICAgKnAgPSBpcC0+cHRyOworICB9CisgIGVsc2UgaWYgKGlwLT5sZXZlbCA+IGspCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHZpbmcgbGV2ZWwgJXUgcG9pbnRlcnMgdG8gaHJlZj0nJXMnXG4iLCBpcC0+bGV2ZWwsIGlkKSk7CisgICAgd2hpbGUgKGlwLT5sZXZlbCA+IGspCisgICAgeyB2b2lkICpzLCAqKnIgPSAmaXAtPmxpbms7CisgICAgICBxID0gKHZvaWQqKilpcC0+bGluazsKKyAgICAgIHdoaWxlIChxKQorICAgICAgeyAqciA9ICh2b2lkKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yodm9pZCopKTsKKyAgICAgICAgcyA9ICpxOworICAgICAgICAqcSA9ICpyOworICAgICAgICByID0gKHZvaWQqKikqcjsKKyAgICAgICAgcSA9ICh2b2lkKiopczsKKyAgICAgIH0KKyAgICAgICpyID0gTlVMTDsKKyAgICAgIGlwLT5zaXplID0gbjsgCisgICAgICBpcC0+Y29weSA9IE5VTEw7CisgICAgICBpcC0+bGV2ZWwgPSBpcC0+bGV2ZWwgLSAxOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJEZXNjZW5kaW5nIG9uZSBsZXZlbC4uLlxuIikpOworICAgIH0KKyAgICBxID0gKHZvaWQqKilpcC0+bGluazsKKyAgICBpcC0+bGluayA9IHA7CisgICAgKnAgPSAodm9pZCopcTsKKyAgfQorICBlbHNlCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGb3J3YXJkZWQgaHJlZj0nJXMnIHR5cGU9JWQgbG9jYXRpb249JXAgKCV1IGJ5dGVzKVxuIiwgaWQsIHQsIHAsICh1bnNpZ25lZCBpbnQpbikpOworICAgIHdoaWxlIChpcC0+bGV2ZWwgPCBrKQorICAgIHsgcSA9ICh2b2lkKiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHZvaWQqKSk7ICAKKyAgICAgICpwID0gcTsKKyAgICAgIHAgPSBxOworICAgICAgay0tOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJEZXNjZW5kaW5nIG9uZSBsZXZlbC4uLlxuIikpOworICAgIH0KKyAgICBxID0gKHZvaWQqKilpcC0+bGluazsKKyAgICBpcC0+bGluayA9IHA7CisgICAgKnAgPSAodm9pZCopcTsKKyAgfQorICByZXR1cm4gcDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQqCitTT0FQX0ZNQUMyCitzb2FwX2lkX2ZvcndhcmQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmhyZWYsIHZvaWQgKnAsIHNpemVfdCBsZW4sIGludCBzdCwgaW50IHR0LCBzaXplX3QgbiwgdW5zaWduZWQgaW50IGssIHZvaWQgKCpmY29weSkoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIHNpemVfdCwgY29uc3Qgdm9pZCosIHNpemVfdCkpCit7IHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgaWYgKCFwIHx8ICFocmVmIHx8ICEqaHJlZikKKyAgICByZXR1cm4gcDsKKyAgaXAgPSBzb2FwX2xvb2t1cChzb2FwLCBocmVmKTsgLyogbG9va3VwIHBvaW50ZXIgdG8gaGFzaCB0YWJsZSBlbnRyeSBmb3Igc3RyaW5nIGlkICovCisgIGlmICghaXApCisgIHsgaXAgPSBzb2FwX2VudGVyKHNvYXAsIGhyZWYpOyAvKiBuZXcgaGFzaCB0YWJsZSBlbnRyeSBmb3Igc3RyaW5nIGlkICovCisgICAgaXAtPnR5cGUgPSBzdDsKKyAgICBpcC0+c2l6ZSA9IG47CisgICAgaXAtPmxpbmsgPSBOVUxMOworICAgIGlwLT5jb3B5ID0gTlVMTDsKKyAgICBpcC0+cHRyID0gTlVMTDsKKyAgICBpcC0+bGV2ZWwgPSAwOworICAgIGlwLT5mbGlzdCA9IE5VTEw7CisgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk5ldyBlbnRyeSBocmVmPSclcycgdHlwZT0lZCBzaXplPSVsdSBsZXZlbD0lZCBsb2NhdGlvbj0lcFxuIiwgaHJlZiwgc3QsICh1bnNpZ25lZCBsb25nKW4sIGssIHApKTsKKyAgfQorICBlbHNlIGlmIChpcC0+dHlwZSAhPSBzdCB8fCAoaXAtPmxldmVsID09IGsgJiYgaXAtPnNpemUgIT0gbikpCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJUeXBlIGluY29tcGF0aWJpbGl0eSBpZD0nJXMnIGV4cGVjdCB0eXBlPSVkIHNpemU9JWx1IGxldmVsPSV1IGdvdCB0eXBlPSVkIHNpemU9JWx1XG4iLCBocmVmLCBpcC0+dHlwZSwgKHVuc2lnbmVkIGxvbmcpaXAtPnNpemUsIGssIHN0LCAodW5zaWduZWQgbG9uZyluKSk7CisgICAgc3RyY3B5KHNvYXAtPmlkLCBocmVmKTsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfSFJFRjsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoZmNvcHkgfHwgbiA8IHNpemVvZih2b2lkKikgfHwgKmhyZWYgIT0gJyMnKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2ZsaXN0ICpmcCA9IChzdHJ1Y3Qgc29hcF9mbGlzdCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2ZsaXN0KSk7CisgICAgaWYgKCFmcCkKKyAgICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZnAtPm5leHQgPSBpcC0+Zmxpc3Q7CisgICAgZnAtPnR5cGUgPSB0dDsKKyAgICBmcC0+cHRyID0gcDsKKyAgICBmcC0+bGV2ZWwgPSBrOworICAgIGZwLT5sZW4gPSBsZW47CisgICAgaWYgKGZjb3B5KQorICAgICAgZnAtPmZjb3B5ID0gZmNvcHk7CisgICAgZWxzZQorICAgICAgZnAtPmZjb3B5ID0gc29hcF9mY29weTsKKyAgICBpcC0+Zmxpc3QgPSBmcDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZvcndhcmRpbmcgdHlwZT0lZCAodGFyZ2V0IHR5cGU9JWQpIHNpemU9JWx1IGxvY2F0aW9uPSVwIGxldmVsPSV1IGxlbj0lbHUgaHJlZj0nJXMnXG4iLCBzdCwgdHQsICh1bnNpZ25lZCBsb25nKW4sIHAsIGssICh1bnNpZ25lZCBsb25nKWxlbiwgaHJlZikpOworICB9CisgIGVsc2UKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZvcndhcmRpbmcgY29weWluZyBhZGRyZXNzICVwIGZvciB0eXBlPSVkIGhyZWY9JyVzJ1xuIiwgcCwgc3QsIGhyZWYpKTsKKyAgICAqKHZvaWQqKilwID0gaXAtPmNvcHk7CisgICAgaXAtPmNvcHkgPSBwOworICB9CisgIHJldHVybiBwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkKgorU09BUF9GTUFDMgorc29hcF9pZF9lbnRlcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIHZvaWQgKnAsIGludCB0LCBzaXplX3QgbiwgdW5zaWduZWQgaW50IGssIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmFycmF5VHlwZSwgdm9pZCAqKCpmaW5zdGFudGlhdGUpKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopKQoreworI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworI2VuZGlmCisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJFbnRlciBpZD0nJXMnIHR5cGU9JWQgbG9jPSVwIHNpemU9JWx1IGxldmVsPSV1XG4iLCBpZCwgdCwgcCwgKHVuc2lnbmVkIGxvbmcpbiwgaykpOworICBzb2FwLT5hbGxvY2VkID0gMDsKKyAgaWYgKCFwKQorICB7IGlmIChmaW5zdGFudGlhdGUpCisgICAgICBwID0gZmluc3RhbnRpYXRlKHNvYXAsIHQsIHR5cGUsIGFycmF5VHlwZSwgJm4pOworICAgIGVsc2UKKyAgICAgIHAgPSBzb2FwX21hbGxvYyhzb2FwLCBuKTsKKyAgICBpZiAocCkKKyAgICAgIHNvYXAtPmFsbG9jZWQgPSAxOworICB9CisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICBpZiAoIWlkIHx8ICEqaWQpCisjZW5kaWYKKyAgICByZXR1cm4gcDsKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgIGlwID0gc29hcF9sb29rdXAoc29hcCwgaWQpOyAvKiBsb29rdXAgcG9pbnRlciB0byBoYXNoIHRhYmxlIGVudHJ5IGZvciBzdHJpbmcgaWQgKi8KKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkxvb2t1cCBlbnRyeSBpZD0nJXMgZm9yIGxvY2F0aW9uPSVwJ1xuIiwgaWQsIHApKTsKKyAgaWYgKCFpcCkKKyAgeyBpcCA9IHNvYXBfZW50ZXIoc29hcCwgaWQpOyAvKiBuZXcgaGFzaCB0YWJsZSBlbnRyeSBmb3Igc3RyaW5nIGlkICovCisgICAgaXAtPnR5cGUgPSB0OworICAgIGlwLT5saW5rID0gTlVMTDsKKyAgICBpcC0+Y29weSA9IE5VTEw7CisgICAgaXAtPmZsaXN0ID0gTlVMTDsKKyAgICBpcC0+c2l6ZSA9IG47CisgICAgaXAtPnB0ciA9IHA7CisgICAgaXAtPmxldmVsID0gazsKKyAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiTmV3IGVudHJ5IGlkPSclcycgdHlwZT0lZCBzaXplPSVsdSBsZXZlbD0ldSBsb2NhdGlvbj0lcFxuIiwgaWQsIHQsICh1bnNpZ25lZCBsb25nKW4sIGssIHApKTsKKyAgfQorICBlbHNlIGlmICgoaXAtPnR5cGUgIT0gdCB8fCAoaXAtPmxldmVsID09IGsgJiYgaXAtPnNpemUgIT0gbikpICYmIChpcC0+Y29weSB8fCBpcC0+Zmxpc3QpKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVHlwZSBpbmNvbXBhdGliaWxpdHkgaWQ9JyVzJyBleHBlY3QgdHlwZT0lZCBzaXplPSVsdSBsZXZlbD0ldSBnb3QgdHlwZT0lZCBzaXplPSVsdVxuIiwgaWQsIGlwLT50eXBlLCAodW5zaWduZWQgbG9uZylpcC0+c2l6ZSwgaywgdCwgKHVuc2lnbmVkIGxvbmcpbikpOworICAgIHN0cmNweShzb2FwLT5pZCwgaWQpOworICAgIHNvYXAtPmVycm9yID0gU09BUF9IUkVGOworICAgIHJldHVybiBOVUxMOworICB9CisgIGVsc2UgaWYgKGlwLT5wdHIpCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJNdWx0aXBseSBkZWZpbmVkIGlkPSclcydcbiIsIGlkKSk7CisgICAgc3RyY3B5KHNvYXAtPmlkLCBpZCk7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0RVUExJQ0FURV9JRDsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBlbHNlIAorICB7IGlwLT5zaXplID0gbjsKKyAgICBpcC0+cHRyID0gcDsKKyAgICBpcC0+bGV2ZWwgPSBrOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVXBkYXRlIGVudHJ5IGlkPSclcycgdHlwZT0lZCBsb2NhdGlvbj0lcCBzaXplPSVsdSBsZXZlbD0ldVxuIiwgaWQsIHQsIHAsICh1bnNpZ25lZCBsb25nKW4sIGspKTsKKyAgfQorICByZXR1cm4gaXAtPnB0cjsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9mY29weShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0LCBpbnQgdHQsIHZvaWQgKnAsIHNpemVfdCBsZW4sIGNvbnN0IHZvaWQgKnEsIHNpemVfdCBuKQoreyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weWluZyBkYXRhIHR5cGU9JWQgKHRhcmdldCB0eXBlPSVkKSAlcCAtPiAlcCAoJWx1IGJ5dGVzKVxuIiwgc3QsIHR0LCBxLCBwLCAodW5zaWduZWQgbG9uZyluKSk7CisgIG1lbWNweShwLCBxLCBuKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbmRfc2VuZChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5kaW1lLmxpc3QpCisgIHsgLyogU09BUCBib2R5IHJlZmVyZW5jZWQgYXR0YWNobWVudHMgbXVzdCBhcHBlYXIgZmlyc3QgKi8KKyAgICBzb2FwLT5kaW1lLmxhc3QtPm5leHQgPSBzb2FwLT5kaW1lLmZpcnN0OworICAgIHNvYXAtPmRpbWUuZmlyc3QgPSBzb2FwLT5kaW1lLmxpc3QtPm5leHQ7CisgICAgc29hcC0+ZGltZS5saXN0LT5uZXh0ID0gTlVMTDsKKyAgICBzb2FwLT5kaW1lLmxhc3QgPSBzb2FwLT5kaW1lLmxpc3Q7CisgIH0KKyAgaWYgKHNvYXBfcHV0ZGltZShzb2FwKSB8fCBzb2FwX3B1dG1pbWUoc29hcCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBzb2FwLT5taW1lLmxpc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5sYXN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5saXN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGFzdCA9IE5VTEw7CisjZW5kaWYKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgc2VuZFxuIikpOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pIC8qIG5lZWQgdG8gZmx1c2ggdGhlIHJlbWFpbmluZyBkYXRhIGluIGJ1ZmZlciAqLworICB7IGlmIChzb2FwX2ZsdXNoKHNvYXApKQorI2lmZGVmIFdJVEhfWkxJQgorICAgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCICYmIHNvYXAtPnpsaWJfc3RhdGUgPT0gU09BUF9aTElCX0RFRkxBVEUpCisgICAgICB7IHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfTk9ORTsKKyAgICAgICAgZGVmbGF0ZUVuZCgmc29hcC0+ZF9zdHJlYW0pOworICAgICAgfQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyNlbHNlCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjZW5kaWYKKyNpZmRlZiBXSVRIX1pMSUIKKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIpCisgICAgeyBpbnQgcjsKKyAgICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luID0gMDsKKyAgICAgIGRvCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVmbGF0aW5nIHJlbWFpbmRlclxuIikpOworICAgICAgICByID0gZGVmbGF0ZSgmc29hcC0+ZF9zdHJlYW0sIFpfRklOSVNIKTsKKyAgICAgICAgaWYgKHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCAhPSBTT0FQX0JVRkxFTikKKyAgICAgICAgeyBpZiAoc29hcF9mbHVzaF9yYXcoc29hcCwgc29hcC0+el9idWYsIFNPQVBfQlVGTEVOIC0gc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0KSkKKyAgICAgICAgICB7IHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfTk9ORTsKKyAgICAgICAgICAgIGRlZmxhdGVFbmQoJnNvYXAtPmRfc3RyZWFtKTsKKyAgICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKwkgIH0KKyAgICAgICAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IChCeXRlKilzb2FwLT56X2J1ZjsKKyAgICAgICAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgPSBTT0FQX0JVRkxFTjsKKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAociA9PSBaX09LKTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVmbGF0ZWQgJWx1LT4lbHUgYnl0ZXNcbiIsIHNvYXAtPmRfc3RyZWFtLnRvdGFsX2luLCBzb2FwLT5kX3N0cmVhbS50b3RhbF9vdXQpKTsKKyAgICAgIHNvYXAtPnpfcmF0aW9fb3V0ID0gKGZsb2F0KXNvYXAtPmRfc3RyZWFtLnRvdGFsX291dCAvIChmbG9hdClzb2FwLT5kX3N0cmVhbS50b3RhbF9pbjsKKyAgICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX1pMSUI7CisgICAgICBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX05PTkU7CisgICAgICBpZiAoZGVmbGF0ZUVuZCgmc29hcC0+ZF9zdHJlYW0pICE9IFpfT0sgfHwgciAhPSBaX1NUUkVBTV9FTkQpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVW5hYmxlIHRvIGVuZCBkZWZsYXRlOiAlc1xuIiwgc29hcC0+ZF9zdHJlYW0ubXNnP3NvYXAtPmRfc3RyZWFtLm1zZzoiIikpOworICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgICB9CisjaWZkZWYgV0lUSF9HWklQCisgICAgICBzb2FwLT56X2J1ZlswXSA9IHNvYXAtPnpfY3JjICYgMHhGRjsKKyAgICAgIHNvYXAtPnpfYnVmWzFdID0gKHNvYXAtPnpfY3JjID4+IDgpICYgMHhGRjsKKyAgICAgIHNvYXAtPnpfYnVmWzJdID0gKHNvYXAtPnpfY3JjID4+IDE2KSAmIDB4RkY7CisgICAgICBzb2FwLT56X2J1ZlszXSA9IChzb2FwLT56X2NyYyA+PiAyNCkgJiAweEZGOworICAgICAgc29hcC0+el9idWZbNF0gPSBzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiAmIDB4RkY7CisgICAgICBzb2FwLT56X2J1Zls1XSA9IChzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiA+PiA4KSAmIDB4RkY7CisgICAgICBzb2FwLT56X2J1Zls2XSA9IChzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiA+PiAxNikgJiAweEZGOworICAgICAgc29hcC0+el9idWZbN10gPSAoc29hcC0+ZF9zdHJlYW0udG90YWxfaW4gPj4gMjQpICYgMHhGRjsKKyAgICAgIGlmIChzb2FwX2ZsdXNoX3Jhdyhzb2FwLCBzb2FwLT56X2J1ZiwgOCkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZ3ppcCBjcmMzMj0lbHVcbiIsICh1bnNpZ25lZCBsb25nKXNvYXAtPnpfY3JjKSk7CisjZW5kaWYKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX1NUT1JFKQorICAgIHsgY2hhciAqcDsKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyAgICAgIGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpKQorICAgICAgeyBzb2FwLT5tb2RlLS07CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2VuZGluZyBidWZmZXJlZCBtZXNzYWdlIG9mIGxlbmd0aCAldVxuIiwgKHVuc2lnbmVkIGludClzb2FwLT5ibGlzdC0+c2l6ZSkpOworICAgICAgICBpZiAoc29hcC0+c3RhdHVzID49IFNPQVBfUE9TVCkKKyAgICAgICAgICBzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0KHNvYXAsIHNvYXAtPmVuZHBvaW50LCBzb2FwLT5ob3N0LCBzb2FwLT5wb3J0LCBzb2FwLT5wYXRoLCBzb2FwLT5hY3Rpb24sIHNvYXAtPmJsaXN0LT5zaXplKTsKKyAgICAgICAgZWxzZSBpZiAoc29hcC0+c3RhdHVzICE9IFNPQVBfU1RPUCkKKyAgICAgICAgICBzb2FwLT5lcnJvciA9IHNvYXAtPmZyZXNwb25zZShzb2FwLCBzb2FwLT5zdGF0dXMsIHNvYXAtPmJsaXN0LT5zaXplKTsKKyAgICAgICAgaWYgKHNvYXAtPmVycm9yIHx8IHNvYXBfZmx1c2goc29hcCkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBzb2FwLT5tb2RlKys7CisgICAgICB9CisjZW5kaWYKKyAgICAgIGZvciAocCA9IHNvYXBfZmlyc3RfYmxvY2soc29hcCk7IHA7IHAgPSBzb2FwX25leHRfYmxvY2soc29hcCkpCisgICAgICB7IERCR01TRyhTRU5ULCBwLCBzb2FwX2Jsb2NrX3NpemUoc29hcCkpOworICAgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnNlbmQoc29hcCwgcCwgc29hcF9ibG9ja19zaXplKHNvYXApKSkpCisgICAgICAgIHsgc29hcF9lbmRfYmxvY2soc29hcCk7CisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICB9CisgICAgICB9CisgICAgICBzb2FwX2VuZF9ibG9jayhzb2FwKTsKKyAgICB9CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgICAgZWxzZSBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKQorICAgIHsgREJHTVNHKFNFTlQsICJcclxuMFxyXG5cclxuIiwgNyk7CisgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnNlbmQoc29hcCwgIlxyXG4wXHJcblxyXG4iLCA3KSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisjZW5kaWYKKyAgfQorI2lmZGVmIFdJVEhfVENQRklOCisjaWZkZWYgV0lUSF9PUEVOU1NMCisgIGlmICghc29hcC0+c3NsICYmIHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkgJiYgIXNvYXAtPmtlZXBfYWxpdmUgJiYgIShzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICBzb2FwLT5mc2h1dGRvd25zb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgMSk7IC8qIFNlbmQgVENQIEZJTiAqLworI2Vsc2UKKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkgJiYgIXNvYXAtPmtlZXBfYWxpdmUgJiYgIShzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICBzb2FwLT5mc2h1dGRvd25zb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgMSk7IC8qIFNlbmQgVENQIEZJTiAqLworI2VuZGlmCisjZW5kaWYKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgb2Ygc2VuZCBwaGFzZVxuIikpOworICBzb2FwLT5vbW9kZSAmPSB+U09BUF9YTUxfU0VDOworICBzb2FwLT5jb3VudCA9IDA7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0VORDsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW5kX3JlY3Yoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPnBhcnQgPSBTT0FQX0VORDsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkgJiYgc29hcF9nZXRkaW1lKHNvYXApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgc29hcC0+ZGltZS5saXN0ID0gc29hcC0+ZGltZS5maXJzdDsKKyAgc29hcC0+ZGltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGFzdCA9IE5VTEw7CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01JTUUpICYmIHNvYXBfZ2V0bWltZShzb2FwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHNvYXAtPm1pbWUubGlzdCA9IHNvYXAtPm1pbWUuZmlyc3Q7CisgIHNvYXAtPm1pbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmxhc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gTlVMTDsKKyNlbmRpZgorICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIG9mIHJlY2VpdmUgbWVzc2FnZSBva1xuIikpOworI2lmZGVmIFdJVEhfWkxJQgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIpCisgIHsgc29hcC0+bW9kZSAmPSB+U09BUF9FTkNfWkxJQjsKKyAgICBtZW1jcHkoc29hcC0+YnVmLCBzb2FwLT56X2J1ZiwgU09BUF9CVUZMRU4pOworICAgIHNvYXAtPmJ1ZmlkeCA9IChjaGFyKilzb2FwLT5kX3N0cmVhbS5uZXh0X2luIC0gc29hcC0+el9idWY7CisgICAgc29hcC0+YnVmbGVuID0gc29hcC0+el9idWZsZW47CisgICAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9OT05FOworICAgIGlmIChpbmZsYXRlRW5kKCZzb2FwLT5kX3N0cmVhbSkgIT0gWl9PSykKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyNpZmRlZiBXSVRIX0daSVAKKyAgICBpZiAoc29hcC0+emxpYl9pbiA9PSBTT0FQX1pMSUJfR1pJUCkKKyAgICB7IHNvYXBfd2NoYXIgYzsKKyAgICAgIHNob3J0IGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgeyBpZiAoKGludCkoYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKSkgPT0gRU9GKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgICAgICBzb2FwLT56X2J1ZltpXSA9IChjaGFyKWM7CisgICAgICB9CisgICAgICBpZiAoc29hcC0+el9jcmMgIT0gKCh1TG9uZykodW5zaWduZWQgY2hhcilzb2FwLT56X2J1ZlswXSB8ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbMV0gPDwgOCkgfCAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzJdIDw8IDE2KSB8ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbM10gPDwgMjQpKSkKKyAgICAgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkd6aXAgZXJyb3I6IGNyYyBjaGVjayBmYWlsZWQsIG1lc3NhZ2UgY29ycnVwdGVkPyAoY3JjMzI9JWx1KVxuIiwgKHVuc2lnbmVkIGxvbmcpc29hcC0+el9jcmMpKTsKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgfQorICAgICAgaWYgKHNvYXAtPmRfc3RyZWFtLnRvdGFsX291dCAhPSAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzRdIHwgKCh1TG9uZykodW5zaWduZWQgY2hhcilzb2FwLT56X2J1Zls1XSA8PCA4KSB8ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbNl0gPDwgMTYpIHwgKCh1TG9uZykodW5zaWduZWQgY2hhcilzb2FwLT56X2J1Zls3XSA8PCAyNCkpKQorICAgICAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiR3ppcCBlcnJvcjogaW5jb3JyZWN0IG1lc3NhZ2UgbGVuZ3RoXG4iKSk7CisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgfQorI2VuZGlmCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgICAgd2hpbGUgKChpbnQpc29hcF9nZXRjaGFyKHNvYXApICE9IEVPRikgLyogYWR2YW5jZSB0byBsYXN0IGNodW5rICovCisgICAgICA7CisgIGlmIChzb2FwLT5mZGlzY29ubmVjdCAmJiAoc29hcC0+ZXJyb3IgPSBzb2FwLT5mZGlzY29ubmVjdChzb2FwKSkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgcmV0dXJuIHNvYXBfcmVzb2x2ZShzb2FwKTsKKyNlbHNlCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT54bGlzdCkKKyAgeyBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX01JTUVfSFJFRjsKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0RJTUVfSFJFRjsKKyAgfQorI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2ZyZWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHN0cnVjdCBOYW1lc3BhY2UgKm5zOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWUgbmFtZXNwYWNlIHN0YWNrXG4iKSk7CisgIHdoaWxlIChzb2FwLT5ubGlzdCkKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnAgPSBzb2FwLT5ubGlzdC0+bmV4dDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+bmxpc3QpOworICAgIHNvYXAtPm5saXN0ID0gbnA7CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIGFueSByZW1haW5pbmcgdGVtcCBibG9ja3NcbiIpKTsKKyAgd2hpbGUgKHNvYXAtPmJsaXN0KQorICAgIHNvYXBfZW5kX2Jsb2NrKHNvYXApOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWUgYXR0cmlidXRlIHN0b3JhZ2VcbiIpKTsKKyAgd2hpbGUgKHNvYXAtPmF0dHJpYnV0ZXMpCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfYXR0cmlidXRlICp0cCA9IHNvYXAtPmF0dHJpYnV0ZXMtPm5leHQ7CisgICAgaWYgKHNvYXAtPmF0dHJpYnV0ZXMtPnZhbHVlKQorICAgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPmF0dHJpYnV0ZXMtPnZhbHVlKTsKKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+YXR0cmlidXRlcyk7CisgICAgc29hcC0+YXR0cmlidXRlcyA9IHRwOworICB9CisjaWZkZWYgV0lUSF9GQVNUCisgIGlmIChzb2FwLT5sYWJidWYpCisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPmxhYmJ1Zik7CisgIHNvYXAtPmxhYmJ1ZiA9IE5VTEw7CisgIHNvYXAtPmxhYmxlbiA9IDA7CisgIHNvYXAtPmxhYmlkeCA9IDA7CisjZW5kaWYKKyAgbnMgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzOworICBpZiAobnMpCisgIHsgZm9yICg7IG5zLT5pZDsgbnMrKykKKyAgICB7IGlmIChucy0+b3V0KQorICAgICAgeyBpZiAoc29hcC0+ZW5jb2RpbmdTdHlsZSA9PSBucy0+b3V0KQorICAgICAgICAgIHNvYXAtPmVuY29kaW5nU3R5bGUgPSBTT0FQX1NUUl9FT1M7CisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBucy0+b3V0KTsKKyAgICAgICAgbnMtPm91dCA9IE5VTEw7CisgICAgICB9CisgICAgICBpZiAoc29hcC0+ZW5jb2RpbmdTdHlsZSA9PSBucy0+bnMpCisgICAgICAgIHNvYXAtPmVuY29kaW5nU3R5bGUgPSBTT0FQX1NUUl9FT1M7CisgICAgfQorICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzKTsKKyAgICBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzID0gTlVMTDsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICB3aGlsZSAoc29hcC0+eGxpc3QpCisgIHsgc3RydWN0IHNvYXBfeGxpc3QgKnhwID0gc29hcC0+eGxpc3QtPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPnhsaXN0KTsKKyAgICBzb2FwLT54bGlzdCA9IHhwOworICB9CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgIHNvYXBfZnJlZV9waHQoc29hcCk7CisgIHNvYXBfZnJlZV9paHQoc29hcCk7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK3N0YXRpYyB2b2lkCitzb2FwX2luaXRfbG9ncyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX01BWExPR1M7IGkrKykKKyAgeyBzb2FwLT5sb2dmaWxlW2ldID0gTlVMTDsKKyAgICBzb2FwLT5mZGVidWdbaV0gPSBOVUxMOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAhZGVmaW5lZChXSVRIX0xFQU4pIHx8IGRlZmluZWQoU09BUF9ERUJVRykKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfb3Blbl9sb2dmaWxlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgaSkKK3sgaWYgKHNvYXAtPmxvZ2ZpbGVbaV0pCisgICAgc29hcC0+ZmRlYnVnW2ldID0gZm9wZW4oc29hcC0+bG9nZmlsZVtpXSwgaSA8IDIgPyAiYWIiIDogImEiKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK3N0YXRpYyB2b2lkCitzb2FwX2Nsb3NlX2xvZ2ZpbGUoc3RydWN0IHNvYXAgKnNvYXAsIGludCBpKQoreyBpZiAoc29hcC0+ZmRlYnVnW2ldKQorICB7IGZjbG9zZShzb2FwLT5mZGVidWdbaV0pOworICAgIHNvYXAtPmZkZWJ1Z1tpXSA9IE5VTEw7CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfY2xvc2VfbG9nZmlsZXMoc3RydWN0IHNvYXAgKnNvYXApCit7IGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9NQVhMT0dTOyBpKyspCisgICAgc29hcF9jbG9zZV9sb2dmaWxlKHNvYXAsIGkpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworc3RhdGljIHZvaWQKK3NvYXBfc2V0X2xvZ2ZpbGUoc3RydWN0IHNvYXAgKnNvYXAsIGludCBpLCBjb25zdCBjaGFyICpsb2dmaWxlKQoreyBjaGFyICpzID0gTlVMTDsKKyAgc29hcF9jbG9zZV9sb2dmaWxlKHNvYXAsIGkpOworICBpZiAoc29hcC0+bG9nZmlsZVtpXSkKKyAgICBTT0FQX0ZSRUUoc29hcCwgKHZvaWQqKXNvYXAtPmxvZ2ZpbGVbaV0pOworICBpZiAobG9nZmlsZSkKKyAgICBpZiAoKHMgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKGxvZ2ZpbGUpICsgMSkpKQorICAgICAgc3RyY3B5KHMsIGxvZ2ZpbGUpOworICBzb2FwLT5sb2dmaWxlW2ldID0gczsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X3JlY3ZfbG9nZmlsZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbG9nZmlsZSkKK3sgc29hcF9zZXRfbG9nZmlsZShzb2FwLCBTT0FQX0lOREVYX1JFQ1YsIGxvZ2ZpbGUpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfc2VudF9sb2dmaWxlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpsb2dmaWxlKQoreyBzb2FwX3NldF9sb2dmaWxlKHNvYXAsIFNPQVBfSU5ERVhfU0VOVCwgbG9nZmlsZSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF90ZXN0X2xvZ2ZpbGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmxvZ2ZpbGUpCit7IHNvYXBfc2V0X2xvZ2ZpbGUoc29hcCwgU09BUF9JTkRFWF9URVNULCBsb2dmaWxlKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwKgorU09BUF9GTUFDMgorc29hcF9jb3B5KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZXR1cm4gc29hcF9jb3B5X2NvbnRleHQoKHN0cnVjdCBzb2FwKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2FwKSksIHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc3RydWN0IHNvYXAqCitTT0FQX0ZNQUMyCitzb2FwX2NvcHlfY29udGV4dChzdHJ1Y3Qgc29hcCAqY29weSwgc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwX2NoZWNrX3N0YXRlKHNvYXApKQorICAgIHJldHVybiBOVUxMOworICBpZiAoY29weSkKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnA7CisgICAgbWVtY3B5KGNvcHksIHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcCkpOworICAgIGNvcHktPnN0YXRlID0gU09BUF9DT1BZOworICAgIGNvcHktPnVzZXIgPSBOVUxMOworICAgIGNvcHktPmVycm9yID0gU09BUF9PSzsKKyAgICBjb3B5LT51c2VyaWQgPSBOVUxMOworICAgIGNvcHktPnBhc3N3ZCA9IE5VTEw7CisgICAgY29weS0+bmxpc3QgPSBOVUxMOworICAgIGNvcHktPmJsaXN0ID0gTlVMTDsKKyAgICBjb3B5LT5jbGlzdCA9IE5VTEw7CisgICAgY29weS0+YWxpc3QgPSBOVUxMOworICAgIGNvcHktPmF0dHJpYnV0ZXMgPSBOVUxMOworI2lmZGVmIFdJVEhfRkFTVAorICAgIGNvcHktPmxhYmJ1ZiA9IE5VTEw7CisgICAgY29weS0+bGFibGVuID0gMDsKKyAgICBjb3B5LT5sYWJpZHggPSAwOworI2VuZGlmCisjaWZkZWYgU09BUF9ERUJVRworICAgIHNvYXBfaW5pdF9taHQoY29weSk7CisjZW5kaWYKKyAgICBjb3B5LT5sb2NhbF9uYW1lc3BhY2VzID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgICAgc29hcF9pbml0X2lodChjb3B5KTsKKyAgICBzb2FwX2luaXRfcGh0KGNvcHkpOworI2VuZGlmCisgICAgY29weS0+aGVhZGVyID0gTlVMTDsKKyAgICBjb3B5LT5mYXVsdCA9IE5VTEw7CisgICAgY29weS0+YWN0aW9uID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisjaWZkZWYgV0lUSF9DT09LSUVTCisgICAgY29weS0+Y29va2llcyA9IHNvYXBfY29weV9jb29raWVzKGNvcHkpOworI2Vsc2UKKyAgICBjb3B5LT5jb29raWVzID0gTlVMTDsKKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgU09BUF9ERUJVRworICAgIHNvYXBfaW5pdF9sb2dzKGNvcHkpOworICAgIHNvYXBfc2V0X3JlY3ZfbG9nZmlsZShjb3B5LCBzb2FwLT5sb2dmaWxlW1NPQVBfSU5ERVhfUkVDVl0pOworICAgIHNvYXBfc2V0X3NlbnRfbG9nZmlsZShjb3B5LCBzb2FwLT5sb2dmaWxlW1NPQVBfSU5ERVhfU0VOVF0pOworICAgIHNvYXBfc2V0X3Rlc3RfbG9nZmlsZShjb3B5LCBzb2FwLT5sb2dmaWxlW1NPQVBfSU5ERVhfVEVTVF0pOworI2VuZGlmCisgICAgY29weS0+cGx1Z2lucyA9IE5VTEw7CisgICAgZm9yIChwID0gc29hcC0+cGx1Z2luczsgcDsgcCA9IHAtPm5leHQpCisgICAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnEgPSAoc3RydWN0IHNvYXBfcGx1Z2luKilTT0FQX01BTExPQyhjb3B5LCBzaXplb2Yoc3RydWN0IHNvYXBfcGx1Z2luKSk7CisgICAgICBpZiAoIXEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5aW5nIHBsdWdpbiAnJXMnXG4iLCBwLT5pZCkpOworICAgICAgKnEgPSAqcDsKKyAgICAgIGlmIChwLT5mY29weSAmJiAoc29hcC0+ZXJyb3IgPSBwLT5mY29weShjb3B5LCBxLCBwKSkpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IGNvcHkgcGx1Z2luICclcydcbiIsIHAtPmlkKSk7CisgICAgICAgIFNPQVBfRlJFRShjb3B5LCBxKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICBxLT5uZXh0ID0gY29weS0+cGx1Z2luczsKKyAgICAgIGNvcHktPnBsdWdpbnMgPSBxOworICAgIH0KKyAgfQorICBlbHNlCisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgcmV0dXJuIGNvcHk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2luaXQoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPnN0YXRlID0gU09BUF9JTklUOworICBzb2FwLT52ZXJzaW9uID0gMDsKKyAgc29hcF9pbW9kZShzb2FwLCBTT0FQX0lPX0RFRkFVTFQpOworICBzb2FwX29tb2RlKHNvYXAsIFNPQVBfSU9fREVGQVVMVCk7CisgIHNvYXAtPnBsdWdpbnMgPSBOVUxMOworICBzb2FwLT51c2VyID0gTlVMTDsKKyAgc29hcC0+dXNlcmlkID0gTlVMTDsKKyAgc29hcC0+cGFzc3dkID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyAgc29hcC0+ZnBvc3QgPSBodHRwX3Bvc3Q7CisgIHNvYXAtPmZnZXQgPSBodHRwX2dldDsKKyAgc29hcC0+ZmZvcm0gPSBOVUxMOworICBzb2FwLT5mcG9zdGhkciA9IGh0dHBfcG9zdF9oZWFkZXI7CisgIHNvYXAtPmZyZXNwb25zZSA9IGh0dHBfcmVzcG9uc2U7CisgIHNvYXAtPmZwYXJzZSA9IGh0dHBfcGFyc2U7CisgIHNvYXAtPmZwYXJzZWhkciA9IGh0dHBfcGFyc2VfaGVhZGVyOworI2VuZGlmCisgIHNvYXAtPmZjb25uZWN0ID0gTlVMTDsKKyAgc29hcC0+ZmRpc2Nvbm5lY3QgPSBOVUxMOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9JUFY2CisgIHNvYXAtPmZyZXNvbHZlID0gdGNwX2dldGhvc3Q7CisjZWxzZQorICBzb2FwLT5mcmVzb2x2ZSA9IE5VTEw7CisjZW5kaWYKKyAgc29hcC0+ZmFjY2VwdCA9IHRjcF9hY2NlcHQ7CisgIHNvYXAtPmZvcGVuID0gdGNwX2Nvbm5lY3Q7CisgIHNvYXAtPmZjbG9zZSA9IHRjcF9kaXNjb25uZWN0OworICBzb2FwLT5mY2xvc2Vzb2NrZXQgPSB0Y3BfY2xvc2Vzb2NrZXQ7CisgIHNvYXAtPmZzaHV0ZG93bnNvY2tldCA9IHRjcF9zaHV0ZG93bnNvY2tldDsKKyAgc29hcC0+ZnNlbmQgPSBmc2VuZDsKKyAgc29hcC0+ZnJlY3YgPSBmcmVjdjsKKyAgc29hcC0+ZnBvbGwgPSBzb2FwX3BvbGw7CisjZWxzZQorICBzb2FwLT5mb3BlbiA9IE5VTEw7CisgIHNvYXAtPmZjbG9zZSA9IE5VTEw7CisgIHNvYXAtPmZwb2xsID0gTlVMTDsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzb2FwLT5mcHJlcGFyZWluaXQgPSBOVUxMOworICBzb2FwLT5mcHJlcGFyZXNlbmQgPSBOVUxMOworICBzb2FwLT5mcHJlcGFyZXJlY3YgPSBOVUxMOworICBzb2FwLT5mcHJlcGFyZWZpbmFsID0gTlVMTDsKKyNlbmRpZgorICBzb2FwLT5mc2V0ZXJyb3IgPSBOVUxMOworICBzb2FwLT5maWdub3JlID0gTlVMTDsKKyAgc29hcC0+ZnNlcnZlbG9vcCA9IE5VTEw7CisgIHNvYXAtPmZwbHVnaW4gPSBmcGx1Z2luOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzb2FwLT5mZGltZXJlYWRvcGVuID0gTlVMTDsKKyAgc29hcC0+ZmRpbWV3cml0ZW9wZW4gPSBOVUxMOworICBzb2FwLT5mZGltZXJlYWRjbG9zZSA9IE5VTEw7CisgIHNvYXAtPmZkaW1ld3JpdGVjbG9zZSA9IE5VTEw7CisgIHNvYXAtPmZkaW1lcmVhZCA9IE5VTEw7CisgIHNvYXAtPmZkaW1ld3JpdGUgPSBOVUxMOworI2VuZGlmCisgIHNvYXAtPmZsb2F0X2Zvcm1hdCA9ICIlLjhnIjsgLyogLjggcHJlc2VydmVzIHNpbmdsZSBGUCBwcmVjaXNpb24gYXMgbXVjaCBhcyBwb3NzaWJsZSwgYnV0IG1pZ2h0IG5vdCBiZSB2ZXJ5IGVmZmljaWVudCAqLworICBzb2FwLT5kb3VibGVfZm9ybWF0ID0gIiUuMTdsZyI7IC8qIC4xNyBwcmVzZXJ2ZXMgZG91YmxlIEZQIHByZWNpc2lvbiBhcyBtdWNoIGFzIHBvc3NpYmxlLCBidXQgbWlnaHQgbm90IGJlIHZlcnkgZWZmaWNpZW50ICovCisgIHNvYXAtPmRpbWVfaWRfZm9ybWF0ID0gImNpZDppZCVkIjsgLyogZGVmYXVsdCBESU1FIGlkIGZvcm1hdCAqLworICBzb2FwLT5odHRwX3ZlcnNpb24gPSAiMS4xIjsKKyAgc29hcC0+YWN0b3IgPSBOVUxMOworICBzb2FwLT5tYXhfa2VlcF9hbGl2ZSA9IFNPQVBfTUFYS0VFUEFMSVZFOworICBzb2FwLT5rZWVwX2FsaXZlID0gMDsKKyAgc29hcC0+cmVjdl90aW1lb3V0ID0gMDsKKyAgc29hcC0+c2VuZF90aW1lb3V0ID0gMDsKKyAgc29hcC0+Y29ubmVjdF90aW1lb3V0ID0gMDsKKyAgc29hcC0+YWNjZXB0X3RpbWVvdXQgPSAwOworICBzb2FwLT5zb2NrZXRfZmxhZ3MgPSAwOworICBzb2FwLT5jb25uZWN0X2ZsYWdzID0gMDsKKyAgc29hcC0+YmluZF9mbGFncyA9IDA7CisgIHNvYXAtPmFjY2VwdF9mbGFncyA9IDA7CisgIHNvYXAtPmlwID0gMDsKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgc29hcC0+bGFiYnVmID0gTlVMTDsKKyAgc29hcC0+bGFibGVuID0gMDsKKyAgc29hcC0+bGFiaWR4ID0gMDsKKyNlbmRpZgorICBzb2FwLT5lbmNvZGluZ1N0eWxlID0gU09BUF9TVFJfRU9TOworI2lmbmRlZiBXSVRIX05PTkFNRVNQQUNFUworICBzb2FwLT5uYW1lc3BhY2VzID0gbmFtZXNwYWNlczsKKyNlbHNlCisgIHNvYXAtPm5hbWVzcGFjZXMgPSBOVUxMOworI2VuZGlmCisgIHNvYXAtPmxvY2FsX25hbWVzcGFjZXMgPSBOVUxMOworICBzb2FwLT5ubGlzdCA9IE5VTEw7CisgIHNvYXAtPmJsaXN0ID0gTlVMTDsKKyAgc29hcC0+Y2xpc3QgPSBOVUxMOworICBzb2FwLT5hbGlzdCA9IE5VTEw7CisgIHNvYXAtPmF0dHJpYnV0ZXMgPSBOVUxMOworICBzb2FwLT5oZWFkZXIgPSBOVUxMOworICBzb2FwLT5mYXVsdCA9IE5VTEw7CisgIHNvYXAtPm1hc3RlciA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIHNvYXAtPnNvY2tldCA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIHNvYXAtPm9zID0gTlVMTDsKKyAgc29hcC0+aXMgPSBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzb2FwLT5kb20gPSBOVUxMOworICBzb2FwLT5kaW1lLmxpc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5sYXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5saXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuYm91bmRhcnkgPSBOVUxMOworICBzb2FwLT5taW1lLnN0YXJ0ID0gTlVMTDsKKyAgc29hcC0+eGxpc3QgPSBOVUxMOworI2VuZGlmCisjaWZuZGVmIFVOREVSX0NFCisgIHNvYXAtPnJlY3ZmZCA9IDA7CisgIHNvYXAtPnNlbmRmZCA9IDE7CisjZWxzZQorICBzb2FwLT5yZWN2ZmQgPSBzdGRpbjsKKyAgc29hcC0+c2VuZGZkID0gc3Rkb3V0OworI2VuZGlmIAorICBzb2FwLT5ob3N0WzBdID0gJ1wwJzsKKyAgc29hcC0+cG9ydCA9IDA7CisgIHNvYXAtPmFjdGlvbiA9IE5VTEw7CisgIHNvYXAtPnByb3h5X2hvc3QgPSBOVUxMOworICBzb2FwLT5wcm94eV9wb3J0ID0gODA4MDsKKyAgc29hcC0+cHJveHlfdXNlcmlkID0gTlVMTDsKKyAgc29hcC0+cHJveHlfcGFzc3dkID0gTlVMTDsKKyAgc29hcC0+YXV0aHJlYWxtID0gTlVMTDsKKyAgc29hcC0+cHJvbG9nID0gTlVMTDsKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgaWYgKCFzc2xfaW5pdF9kb25lKQorICAgIHNvYXBfc3NsX2luaXQoKTsKKyAgc29hcC0+ZnNzbGF1dGggPSBzc2xfYXV0aF9pbml0OworICBzb2FwLT5mc3NsdmVyaWZ5ID0gc3NsX3ZlcmlmeV9jYWxsYmFjazsKKyAgc29hcC0+YmlvID0gTlVMTDsKKyAgc29hcC0+c3NsID0gTlVMTDsKKyAgc29hcC0+Y3R4ID0gTlVMTDsKKyAgc29hcC0+cmVxdWlyZV9zZXJ2ZXJfYXV0aCA9IDA7CisgIHNvYXAtPnJlcXVpcmVfY2xpZW50X2F1dGggPSAwOworICBzb2FwLT5yc2EgPSAwOworICBzb2FwLT5rZXlmaWxlID0gTlVMTDsKKyAgc29hcC0+cGFzc3dvcmQgPSBOVUxMOworICBzb2FwLT5kaGZpbGUgPSBOVUxMOworICBzb2FwLT5jYWZpbGUgPSBOVUxMOworICBzb2FwLT5jYXBhdGggPSBOVUxMOworICBzb2FwLT5jcmxmaWxlID0gTlVMTDsKKyAgc29hcC0+cmFuZGZpbGUgPSBOVUxMOworICBzb2FwLT5zZXNzaW9uID0gTlVMTDsKKyNlbmRpZgorI2lmZGVmIFdJVEhfWkxJQgorICBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX05PTkU7CisgIHNvYXAtPnpsaWJfaW4gPSBTT0FQX1pMSUJfTk9ORTsKKyAgc29hcC0+emxpYl9vdXQgPSBTT0FQX1pMSUJfTk9ORTsKKyAgc29hcC0+ZF9zdHJlYW0uemFsbG9jID0gTlVMTDsKKyAgc29hcC0+ZF9zdHJlYW0uemZyZWUgPSBOVUxMOworICBzb2FwLT5kX3N0cmVhbS5vcGFxdWUgPSBOVUxMOworICBzb2FwLT56X2xldmVsID0gNjsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgc29hcC0+YzE0bmluY2x1ZGUgPSBOVUxMOworICBzb2FwLT5jMTRuZXhjbHVkZSA9IE5VTEw7CisgIHNvYXAtPmNvb2tpZXMgPSBOVUxMOworICBzb2FwLT5jb29raWVfZG9tYWluID0gTlVMTDsKKyAgc29hcC0+Y29va2llX3BhdGggPSBOVUxMOworICBzb2FwLT5jb29raWVfbWF4ID0gMzI7CisjZW5kaWYKKyNpZmRlZiBTT0FQX0RFQlVHCisgIHNvYXBfaW5pdF9taHQoc29hcCk7CisgIHNvYXBfaW5pdF9sb2dzKHNvYXApOworICBzb2FwX3NldF9yZWN2X2xvZ2ZpbGUoc29hcCwgIlJFQ1YubG9nIik7CisgIHNvYXBfc2V0X3NlbnRfbG9nZmlsZShzb2FwLCAiU0VOVC5sb2ciKTsKKyAgc29hcF9zZXRfdGVzdF9sb2dmaWxlKHNvYXAsIE5VTEwpOworI2VuZGlmCisjaWZkZWYgV01XX1JQTV9JTworICBzb2FwLT5ycG1yZXFpZCA9IE5VTEw7CisjZW5kaWYKKyNpZmRlZiBQQUxNCisgIHBhbG1OZXRMaWJPcGVuKCk7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgIHNvYXBfaW5pdF9paHQoc29hcCk7CisgIHNvYXBfaW5pdF9waHQoc29hcCk7CisjZW5kaWYKKyAgc29hcF9iZWdpbihzb2FwKTsKKyNpZmRlZiBTT0FQX0RFQlVHCisgIHNvYXBfc2V0X3Rlc3RfbG9nZmlsZShzb2FwLCAiVEVTVC5sb2ciKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9pbml0MShzdHJ1Y3Qgc29hcCAqc29hcCwgc29hcF9tb2RlIG1vZGUpCit7IHNvYXBfaW5pdDIoc29hcCwgbW9kZSwgbW9kZSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2luaXQyKHN0cnVjdCBzb2FwICpzb2FwLCBzb2FwX21vZGUgaW1vZGUsIHNvYXBfbW9kZSBvbW9kZSkKK3sgc29hcF9pbml0KHNvYXApOworICBzb2FwX2ltb2RlKHNvYXAsIGltb2RlKTsKKyAgc29hcF9vbW9kZShzb2FwLCBvbW9kZSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2JlZ2luKHN0cnVjdCBzb2FwICpzb2FwKQoreyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluaXRpYWxpemluZ1xuIikpOworICBpZiAoIXNvYXAtPmtlZXBfYWxpdmUpCisgIHsgc29hcC0+YnVmbGVuID0gMDsKKyAgICBzb2FwLT5idWZpZHggPSAwOworICB9CisgIHNvYXAtPmtlZXBfYWxpdmUgPSAoKChzb2FwLT5pbW9kZSB8IHNvYXAtPm9tb2RlKSAmIFNPQVBfSU9fS0VFUEFMSVZFKSAhPSAwKTsKKyAgc29hcC0+bnVsbCA9IDA7CisgIHNvYXAtPnBvc2l0aW9uID0gMDsKKyAgc29hcC0+ZW5jb2RpbmcgPSAwOworICBzb2FwLT5tdXN0VW5kZXJzdGFuZCA9IDA7CisgIHNvYXAtPm1vZGUgPSAwOworICBzb2FwLT5ucyA9IDA7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0VORDsKKyAgc29hcC0+YWxsb2NlZCA9IDA7CisgIHNvYXAtPmNvdW50ID0gMDsKKyAgc29hcC0+bGVuZ3RoID0gMDsKKyAgc29hcC0+Y2RhdGEgPSAwOworICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIHNvYXAtPnBlZWtlZCA9IDA7CisgIHNvYXAtPmFoZWFkID0gMDsKKyAgc29hcC0+aWRudW0gPSAwOworICBzb2FwLT5sZXZlbCA9IDA7CisgIHNvYXAtPmVuZHBvaW50WzBdID0gJ1wwJzsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcC0+ZGltZS5jaHVua3NpemUgPSAwOworICBzb2FwLT5kaW1lLmJ1ZmxlbiA9IDA7CisjZW5kaWYKKyAgc29hcF9mcmVlKHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9lbmQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2NsaXN0ICpjcDsKKyAgaWYgKHNvYXBfY2hlY2tfc3RhdGUoc29hcCkpCisgICAgcmV0dXJuOworICBzb2FwX2ZyZWUoc29hcCk7CisgIHNvYXBfZGVhbGxvYyhzb2FwLCBOVUxMKTsKKyAgd2hpbGUgKHNvYXAtPmNsaXN0KQorICB7IGNwID0gc29hcC0+Y2xpc3QtPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPmNsaXN0KTsKKyAgICBzb2FwLT5jbGlzdCA9IGNwOworICB9CisgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworI2lmZGVmIFNPQVBfREVCVUcKKyAgc29hcF9jbG9zZV9sb2dmaWxlcyhzb2FwKTsKKyNlbmRpZgorI2lmZGVmIFBBTE0KKyAgcGFsbU5ldExpYkNsb3NlKCk7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZXRfbmFtZXNwYWNlcyhzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IE5hbWVzcGFjZSAqcCkKK3sgcmVnaXN0ZXIgc3RydWN0IE5hbWVzcGFjZSAqbnMgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnAsICpucSwgKm5yOworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgbGV2ZWwgPSBzb2FwLT5sZXZlbDsKKyAgc29hcC0+bmFtZXNwYWNlcyA9IHA7CisgIHNvYXAtPmxvY2FsX25hbWVzcGFjZXMgPSBOVUxMOworICBzb2FwX3NldF9sb2NhbF9uYW1lc3BhY2VzKHNvYXApOworICAvKiByZXZlcnNlIHRoZSBuYW1lc3BhY2UgbGlzdCAqLworICBucCA9IHNvYXAtPm5saXN0OworICBzb2FwLT5ubGlzdCA9IE5VTEw7CisgIGlmIChucCkKKyAgeyBucSA9IG5wLT5uZXh0OworICAgIG5wLT5uZXh0ID0gTlVMTDsKKyAgICB3aGlsZSAobnEpCisgICAgeyBuciA9IG5xLT5uZXh0OworICAgICAgbnEtPm5leHQgPSBucDsKKyAgICAgIG5wID0gbnE7CisgICAgICBucSA9IG5yOworICAgIH0KKyAgfQorICAvKiB0aGVuIHB1c2ggb24gbmV3IHN0YWNrICovCisgIHdoaWxlIChucCkKKyAgeyByZWdpc3RlciBjb25zdCBjaGFyICpzOworICAgIHNvYXAtPmxldmVsID0gbnAtPmxldmVsOyAvKiBwcmVzZXJ2ZSBlbGVtZW50IG5lc3RpbmcgbGV2ZWwgKi8KKyAgICBzID0gbnAtPm5zOworICAgIGlmICghcyAmJiBucC0+aW5kZXggPj0gMCAmJiBucykKKyAgICB7IHMgPSBuc1tucC0+aW5kZXhdLm91dDsKKyAgICAgIGlmICghcykKKyAgICAgICAgcyA9IG5zW25wLT5pbmRleF0ubnM7CisgICAgfQorICAgIGlmIChzICYmIHNvYXBfcHVzaF9uYW1lc3BhY2Uoc29hcCwgbnAtPmlkLCBzKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBucSA9IG5wOworICAgIG5wID0gbnAtPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIG5xKTsKKyAgfQorICBpZiAobnMpCisgIHsgcmVnaXN0ZXIgaW50IGk7CisgICAgZm9yIChpID0gMDsgbnNbaV0uaWQ7IGkrKykKKyAgICB7IGlmIChuc1tpXS5vdXQpCisgICAgICB7IFNPQVBfRlJFRShzb2FwLCBuc1tpXS5vdXQpOworICAgICAgICBuc1tpXS5vdXQgPSBOVUxMOworICAgICAgfQorICAgIH0KKyAgICBTT0FQX0ZSRUUoc29hcCwgbnMpOworICB9CisgIHNvYXAtPmxldmVsID0gbGV2ZWw7IC8qIHJlc3RvcmUgbGV2ZWwgKi8KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9sb2NhbF9uYW1lc3BhY2VzKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcC0+bmFtZXNwYWNlcyAmJiAhc29hcC0+bG9jYWxfbmFtZXNwYWNlcykKKyAgeyByZWdpc3RlciBjb25zdCBzdHJ1Y3QgTmFtZXNwYWNlICpuczE7CisgICAgcmVnaXN0ZXIgc3RydWN0IE5hbWVzcGFjZSAqbnMyOworICAgIHJlZ2lzdGVyIHNpemVfdCBuID0gMTsKKyAgICBmb3IgKG5zMSA9IHNvYXAtPm5hbWVzcGFjZXM7IG5zMS0+aWQ7IG5zMSsrKQorICAgICAgbisrOworICAgIG4gKj0gc2l6ZW9mKHN0cnVjdCBOYW1lc3BhY2UpOworICAgIG5zMiA9IChzdHJ1Y3QgTmFtZXNwYWNlKilTT0FQX01BTExPQyhzb2FwLCBuKTsKKyAgICBpZiAobnMyKQorICAgIHsgbWVtY3B5KG5zMiwgc29hcC0+bmFtZXNwYWNlcywgbik7CisgICAgICBpZiAobnMyWzBdLm5zKQorICAgICAgeyBpZiAoIXN0cmNtcChuczJbMF0ubnMsIHNvYXBfZW52MSkpCisgICAgICAgICAgc29hcC0+dmVyc2lvbiA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzb2FwLT52ZXJzaW9uID0gMjsKKyAgICAgIH0KKyAgICAgIHNvYXAtPmxvY2FsX25hbWVzcGFjZXMgPSBuczI7CisgICAgfQorICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY29uc3QgY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3N0cnNlYXJjaChjb25zdCBjaGFyICpiaWcsIGNvbnN0IGNoYXIgKmxpdHRsZSkKK3sgc2l6ZV90IG4gPSBzdHJsZW4obGl0dGxlKTsKKyAgY29uc3QgY2hhciAqcyA9IGJpZzsKKyAgd2hpbGUgKHMpIAorICB7IGlmICghc3RybmNtcChzLCBsaXR0bGUsIG4pICYmIChzW25dID09ICdcMCcgfHwgc1tuXSA9PSAnICcpKQorICAgICAgcmV0dXJuIHM7CisgICAgcyA9IHN0cmNocihzLCAnICcpOworICAgIGlmIChzKQorICAgICAgcysrOworICB9CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgc3RydWN0IHNvYXBfbmxpc3QgKgorc29hcF9sb29rdXBfbnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc2l6ZV90IG4pCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucDsKKyAgZm9yIChucCA9IHNvYXAtPm5saXN0OyBucDsgbnAgPSBucC0+bmV4dCkKKyAgeyBpZiAoIXN0cm5jbXAobnAtPmlkLCB0YWcsIG4pICYmICFucC0+aWRbbl0pCisgICAgICByZXR1cm4gbnA7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgc3RydWN0IHNvYXBfbmxpc3QgKgorc29hcF9wdXNoX25zKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqbnMsIHNob3J0IHV0aWxpemVkKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnA7CisgIHNpemVfdCBuLCBrOworICBpZiAoc29hcF9zdHJzZWFyY2goc29hcC0+YzE0bmV4Y2x1ZGUsIGlkKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQdXNoIG5hbWVzcGFjZSBiaW5kaW5nIChsZXZlbD0ldSkgJyVzJyAnJXMnXG4iLCBzb2FwLT5sZXZlbCwgaWQsIG5zP25zOiIiKSk7CisgIGlmICghdXRpbGl6ZWQpCisgIHsgZm9yIChucCA9IHNvYXAtPm5saXN0OyBucDsgbnAgPSBucC0+bmV4dCkKKyAgICB7IGlmICghc3RyY21wKG5wLT5pZCwgaWQpICYmICghbnAtPm5zIHx8ICFzdHJjbXAobnAtPm5zLCBucykpKQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKG5wKQorICAgIHsgaWYgKG5wLT5pbmRleCA9PSAxKQorICAgICAgICB1dGlsaXplZCA9IG5wLT5pbmRleDsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9CisgIG4gPSBzdHJsZW4oaWQpOworICBpZiAobnMpCisgICAgayA9IHN0cmxlbihucyk7CisgIGVsc2UKKyAgICBrID0gMDsKKyAgbnAgPSAoc3RydWN0IHNvYXBfbmxpc3QqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9ubGlzdCkgKyBuICsgayArIDEpOworICBpZiAoIW5wKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgbnAtPm5leHQgPSBzb2FwLT5ubGlzdDsKKyAgc29hcC0+bmxpc3QgPSBucDsKKyAgc3RyY3B5KG5wLT5pZCwgaWQpOworICBpZiAobnMpCisgIHsgbnAtPm5zID0gbnAtPmlkICsgbiArIDE7CisgICAgc3RyY3B5KG5wLT5ucywgbnMpOworICB9CisgIGVsc2UKKyAgICBucC0+bnMgPSBOVUxMOworICBucC0+bGV2ZWwgPSBzb2FwLT5sZXZlbDsKKyAgbnAtPmluZGV4ID0gdXRpbGl6ZWQ7CisgIHJldHVybiBucDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyB2b2lkCitzb2FwX3V0aWxpemVfbnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc2l6ZV90IG4pCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucCA9IHNvYXBfbG9va3VwX25zKHNvYXAsIHRhZywgbik7CisgIGlmIChucCkKKyAgeyBpZiAobnAtPmluZGV4ID09IDApCisgICAgICBzb2FwX3B1c2hfbnMoc29hcCwgbnAtPmlkLCBucC0+bnMsIDEpOworICB9CisgIGVsc2UKKyAgeyBzdHJuY3B5KHNvYXAtPnRtcGJ1ZiwgdGFnLCBuKTsKKyAgICBzb2FwLT50bXBidWZbbl0gPSAnXDAnOworICAgIHNvYXBfcHVzaF9ucyhzb2FwLCBzb2FwLT50bXBidWYsIE5VTEwsIDEpOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgdm9pZAorc29hcF9wb3BfbnMoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXBfcG9wX25hbWVzcGFjZShzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgY2hhciAqdHlwZSkKK3sgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbGVtZW50IGJlZ2luIHRhZz0nJXMnIGlkPSclZCcgdHlwZT0nJXMnXG4iLCB0YWcsIGlkLCB0eXBlP3R5cGU6IiIpKTsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqZWx0ID0gKHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50Kilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQpKTsKKyAgICBpZiAoIWVsdCkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIGVsdC0+c29hcCA9IHNvYXA7CisgICAgZWx0LT5uZXh0ID0gTlVMTDsKKyAgICBlbHQtPnBybnQgPSBzb2FwLT5kb207CisgICAgZWx0LT5uYW1lID0gc29hcF9zdHJkdXAoc29hcCwgdGFnKTsKKyAgICBlbHQtPmVsdHMgPSBOVUxMOworICAgIGVsdC0+YXR0cyA9IE5VTEw7CisgICAgZWx0LT5uc3RyID0gTlVMTDsKKyAgICBlbHQtPmRhdGEgPSBOVUxMOworICAgIGVsdC0+d2lkZSA9IE5VTEw7CisgICAgZWx0LT5ub2RlID0gTlVMTDsKKyAgICBlbHQtPnR5cGUgPSAwOworICAgIGVsdC0+aGVhZCA9IE5VTEw7CisgICAgZWx0LT50YWlsID0gTlVMTDsKKyAgICBpZiAoc29hcC0+ZG9tKQorICAgIHsgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKnAgPSBzb2FwLT5kb20tPmVsdHM7CisgICAgICBpZiAocCkKKyAgICAgIHsgd2hpbGUgKHAtPm5leHQpCisgICAgICAgICAgcCA9IHAtPm5leHQ7CisgICAgICAgIHAtPm5leHQgPSBlbHQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHNvYXAtPmRvbS0+ZWx0cyA9IGVsdDsKKyAgICB9CisgICAgc29hcC0+ZG9tID0gZWx0OworICB9CisgIGVsc2UKKyAgeworI2VuZGlmCisgICAgc29hcC0+bGV2ZWwrKzsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKCFzb2FwLT5ucykKKyAgICB7IGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgICAgICAgJiYgc29hcF9zZW5kKHNvYXAsIHNvYXAtPnByb2xvZyA/IHNvYXAtPnByb2xvZyA6ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiIpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIGVsc2UgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9JTkRFTlQpCisgICAgeyBpZiAoc29hcC0+bnMgPT0gMSAmJiBzb2FwX3NlbmRfcmF3KHNvYXAsIHNvYXBfaW5kZW50LCBzb2FwLT5sZXZlbCA8IHNpemVvZihzb2FwX2luZGVudCkgPyBzb2FwLT5sZXZlbCA6IHNpemVvZihzb2FwX2luZGVudCkgLSAxKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgc29hcC0+Ym9keSA9IDE7CisgICAgfQorI2VuZGlmCisgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgIjwiLCAxKQorICAgICB8fCBzb2FwX3NlbmQoc29hcCwgdGFnKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZmRlZiBXSVRIX0RPTQorICB9CisjZW5kaWYKKyAgaWYgKCFzb2FwLT5ucykKKyAgeyBzdHJ1Y3QgTmFtZXNwYWNlICpuczsKKyAgICBmb3IgKG5zID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlczsgbnMgJiYgbnMtPmlkOyBucysrKQorICAgIHsgaWYgKCpucy0+aWQgJiYgKG5zLT5vdXQgfHwgbnMtPm5zKSkKKyAgICAgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJ4bWxuczolcyIsIG5zLT5pZCk7CisgICAgICAgIGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCBzb2FwLT50bXBidWYsIG5zLT5vdXQgPyBucy0+b3V0IDogbnMtPm5zKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB9CisgICAgfSAgIAorICB9CisgIHNvYXAtPm5zID0gMTsgLyogc3RhcnQgd2l0aCAwIG9yIDIsIGJ1dCBzaG91bGQgYmUgb25lIHRvIGNvbnRpbnVlICovCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgeyBjb25zdCBjaGFyICpzID0gc3RyY2hyKHRhZywgJzonKTsKKyAgICBpZiAocykKKyAgICAgIHNvYXBfdXRpbGl6ZV9ucyhzb2FwLCB0YWcsIHMgLSB0YWcpOworICB9CisjZW5kaWYKKyAgaWYgKGlkID4gMCkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIl8lZCIsIGlkKTsKKyAgICBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgImlkIiwgc29hcC0+dG1wYnVmKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAodHlwZSAmJiAqdHlwZSkKKyAgeyBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgInhzaTp0eXBlIiwgdHlwZSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICAgIHsgY29uc3QgY2hhciAqcyA9IHN0cmNocih0eXBlLCAnOicpOworICAgICAgaWYgKHMpCisgICAgICAgIHNvYXBfdXRpbGl6ZV9ucyhzb2FwLCB0eXBlLCBzIC0gdHlwZSk7CisgICAgfQorI2VuZGlmCisgIH0KKyAgaWYgKHNvYXAtPm51bGwgJiYgc29hcC0+cG9zaXRpb24gPiAwKQorICB7IGludCBpOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiWyVkIiwgc29hcC0+cG9zaXRpb25zWzBdKTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgc29hcC0+cG9zaXRpb247IGkrKykKKyAgICAgIHNwcmludGYoc29hcC0+dG1wYnVmICsgc3RybGVuKHNvYXAtPnRtcGJ1ZiksICIsJWQiLCBzb2FwLT5wb3NpdGlvbnNbaV0pOworICAgIHN0cmNhdChzb2FwLT50bXBidWYsICJdIik7CisgICAgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJTT0FQLUVOQzpwb3NpdGlvbiIsIHNvYXAtPnRtcGJ1ZikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHNvYXAtPm11c3RVbmRlcnN0YW5kKQorICB7IGlmIChzb2FwLT5hY3RvciAmJiAqc29hcC0+YWN0b3IpCisgICAgeyBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgc29hcC0+dmVyc2lvbiA9PSAyID8gIlNPQVAtRU5WOnJvbGUiIDogIlNPQVAtRU5WOmFjdG9yIiwgc29hcC0+YWN0b3IpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAiU09BUC1FTlY6bXVzdFVuZGVyc3RhbmQiLCBzb2FwLT52ZXJzaW9uID09IDIgPyAidHJ1ZSIgOiAiMSIpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIHNvYXAtPm11c3RVbmRlcnN0YW5kID0gMDsKKyAgfQorICBpZiAoc29hcC0+ZW5jb2RpbmcpCisgIHsgaWYgKHNvYXAtPmVuY29kaW5nU3R5bGUgJiYgc29hcC0+bG9jYWxfbmFtZXNwYWNlcykKKyAgICB7IGlmICghKnNvYXAtPmVuY29kaW5nU3R5bGUpCisgICAgICB7IGlmIChzb2FwLT5sb2NhbF9uYW1lc3BhY2VzWzFdLm91dCkKKyAgICAgICAgICBzb2FwLT5lbmNvZGluZ1N0eWxlID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlc1sxXS5vdXQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzb2FwLT5lbmNvZGluZ1N0eWxlID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlc1sxXS5uczsKKyAgICAgIH0KKyAgICAgIGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAiU09BUC1FTlY6ZW5jb2RpbmdTdHlsZSIsIHNvYXAtPmVuY29kaW5nU3R5bGUpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIHNvYXAtPmVuY29kaW5nID0gMDsKKyAgfQorICBzb2FwLT5udWxsID0gMDsKKyAgc29hcC0+cG9zaXRpb24gPSAwOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X2JlZ2luX291dChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnR5cGUpCit7IGlmICgqdGFnID09ICctJykKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgaWYgKHNvYXBfZWxlbWVudChzb2FwLCB0YWcsIGlkLCB0eXBlKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzb2FwLCBOVUxMKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKKyNpZm5kZWYgSEFWRV9TVFJSQ0hSCitTT0FQX0ZNQUMxCitjaGFyKgorU09BUF9GTUFDMgorc29hcF9zdHJyY2hyKGNvbnN0IGNoYXIgKnMsIGludCB0KQoreyByZWdpc3RlciBjaGFyICpyID0gTlVMTDsKKyAgd2hpbGUgKCpzKQorICAgIGlmICgqcysrID09IHQpCisgICAgICByID0gKGNoYXIqKXMgLSAxOworICByZXR1cm4gcjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorI2lmbmRlZiBIQVZFX1NUUlRPTAorU09BUF9GTUFDMQorbG9uZworU09BUF9GTUFDMgorc29hcF9zdHJ0b2woY29uc3QgY2hhciAqcywgY2hhciAqKnQsIGludCBiKQoreyByZWdpc3RlciBsb25nIG4gPSAwOworICByZWdpc3RlciBpbnQgYzsKKyAgd2hpbGUgKCpzID4gMCAmJiAqcyA8PSAzMikKKyAgICBzKys7CisgIGlmIChiID09IDEwKQorICB7IHNob3J0IG5lZyA9IDA7CisgICAgaWYgKCpzID09ICctJykKKyAgICB7IHMrKzsKKyAgICAgIG5lZyA9IDE7CisgICAgfQorICAgIGVsc2UgaWYgKCpzID09ICcrJykKKyAgICAgIHMrKzsKKyAgICB3aGlsZSAoKGMgPSAqcykgJiYgYyA+PSAnMCcgJiYgYyA8PSAnOScpCisgICAgeyBpZiAobiA+PSAyMTQ3NDgzNjQgJiYgKG4gPiAyMTQ3NDgzNjQgfHwgYyA+PSAnOCcpKQorICAgICAgICBicmVhazsKKyAgICAgIG4gKj0gMTA7CisgICAgICBuICs9IGMgLSAnMCc7CisgICAgICBzKys7CisgICAgfQorICAgIGlmIChuZWcpCisgICAgICBuID0gLW47CisgIH0KKyAgZWxzZSAvKiBiID09IDE2IGFuZCB2YWx1ZSBpcyBhbHdheXMgcG9zaXRpdmUgKi8KKyAgeyB3aGlsZSAoKGMgPSAqcykpCisgICAgeyBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCisgICAgICAgIGMgLT0gJzAnOworICAgICAgZWxzZSBpZiAoYyA+PSAnQScgJiYgYyA8PSAnRicpCisgICAgICAgIGMgLT0gJ0EnIC0gMTA7CisgICAgICBlbHNlIGlmIChjID49ICdhJyAmJiBjIDw9ICdmJykKKyAgICAgICAgYyAtPSAnYScgLSAxMDsKKyAgICAgIGlmIChuID4gMHgwN0ZGRkZGRikKKyAgICAgICAgYnJlYWs7CisgICAgICBuIDw8PSA0OworICAgICAgbiArPSBjOworICAgICAgcysrOworICAgIH0KKyAgfQorICBpZiAodCkKKyAgICAqdCA9IChjaGFyKilzOworICByZXR1cm4gbjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorI2lmbmRlZiBIQVZFX1NUUlRPVUwKK1NPQVBfRk1BQzEKK3Vuc2lnbmVkIGxvbmcKK1NPQVBfRk1BQzIKK3NvYXBfc3RydG91bChjb25zdCBjaGFyICpzLCBjaGFyICoqdCwgaW50IGIpCit7IHVuc2lnbmVkIGxvbmcgbiA9IDA7CisgIHJlZ2lzdGVyIGludCBjOworICB3aGlsZSAoKnMgPiAwICYmICpzIDw9IDMyKQorICAgIHMrKzsKKyAgaWYgKGIgPT0gMTApCisgIHsgaWYgKCpzID09ICcrJykKKyAgICAgIHMrKzsKKyAgICB3aGlsZSAoKGMgPSAqcykgJiYgYyA+PSAnMCcgJiYgYyA8PSAnOScpCisgICAgeyBpZiAobiA+PSA0Mjk0OTY3MjkgJiYgKG4gPiA0Mjk0OTY3MjkgfHwgYyA+PSAnNicpKQorICAgICAgICBicmVhazsKKyAgICAgIG4gKj0gMTA7CisgICAgICBuICs9IGMgLSAnMCc7CisgICAgICBzKys7CisgICAgfQorICB9CisgIGVsc2UgLyogYiA9PSAxNiAqLworICB7IHdoaWxlICgoYyA9ICpzKSkKKyAgICB7IGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKKyAgICAgICAgYyAtPSAnMCc7CisgICAgICBlbHNlIGlmIChjID49ICdBJyAmJiBjIDw9ICdGJykKKyAgICAgICAgYyAtPSAnQScgLSAxMDsKKyAgICAgIGVsc2UgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQorICAgICAgICBjIC09ICdhJyAtIDEwOworICAgICAgaWYgKG4gPiAweDBGRkZGRkZGKQorICAgICAgICBicmVhazsKKyAgICAgIG4gPDw9IDQ7CisgICAgICBuICs9IGM7CisgICAgICBzKys7CisgICAgfQorICB9CisgIGlmICh0KQorICAgICp0ID0gKGNoYXIqKXM7CisgIHJldHVybiBuOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYXJyYXlfYmVnaW5fb3V0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqb2Zmc2V0KQoreyBpZiAoc29hcF9lbGVtZW50KHNvYXAsIHRhZywgaWQsICJTT0FQLUVOQzpBcnJheSIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgeyBjb25zdCBjaGFyICpzOworICAgIHMgPSBzb2FwX3N0cnJjaHIodHlwZSwgJ1snKTsKKyAgICBpZiAoKHNpemVfdCkocyAtIHR5cGUpIDwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZikpCisgICAgeyBzdHJuY3B5KHNvYXAtPnRtcGJ1ZiwgdHlwZSwgcyAtIHR5cGUpOworICAgICAgc29hcC0+dG1wYnVmW3MgLSB0eXBlXSA9ICdcMCc7CisgICAgICBpZiAodHlwZSAmJiAqdHlwZSAmJiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgIlNPQVAtRU5DOml0ZW1UeXBlIiwgc29hcC0+dG1wYnVmKSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIGlmIChzICYmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAiU09BUC1FTkM6YXJyYXlTaXplIiwgcyArIDEpKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgfQorICBlbHNlCisgIHsgaWYgKG9mZnNldCAmJiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgIlNPQVAtRU5DOm9mZnNldCIsIG9mZnNldCkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmICh0eXBlICYmICp0eXBlICYmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAiU09BUC1FTkM6YXJyYXlUeXBlIiwgdHlwZSkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAodHlwZSAmJiAqdHlwZSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkpCisgIHsgY29uc3QgY2hhciAqcyA9IHN0cmNocih0eXBlLCAnOicpOworICAgIGlmIChzKQorICAgICAgc29hcF91dGlsaXplX25zKHNvYXAsIHR5cGUsIHMgLSB0eXBlKTsKKyAgfQorI2VuZGlmCisgIHJldHVybiBzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzb2FwLCBOVUxMKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X3N0YXJ0X2VuZF9vdXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZykKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfYXR0cmlidXRlICp0cDsKKyNpZmRlZiBXSVRIX0RPTQorICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICoqYXR0OworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBhdHQgPSAmc29hcC0+ZG9tLT5hdHRzOworICAgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgICB7IGlmICh0cC0+dmlzaWJsZSkKKyAgICAgIHsgKmF0dCA9IChzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSkpOworCWlmICghKmF0dCkKKwkgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworCSgqYXR0KS0+bmV4dCA9IE5VTEw7CisgICAgICAgICgqYXR0KS0+bnN0ciA9IE5VTEw7CisgICAgICAgICgqYXR0KS0+bmFtZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHRwLT5uYW1lKTsKKyAgICAgICAgKCphdHQpLT5kYXRhID0gc29hcF9zdHJkdXAoc29hcCwgdHAtPnZhbHVlKTsKKyAgICAgICAgKCphdHQpLT53aWRlID0gTlVMTDsKKyAgICAgICAgKCphdHQpLT5zb2FwID0gc29hcDsKKyAgICAgICAgdHAtPnZpc2libGUgPSAwOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgeyBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnA7CisgICAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICAgIHsgaWYgKHRwLT52aXNpYmxlICYmIHRwLT5uYW1lKQorICAgICAgeyBjb25zdCBjaGFyICpzID0gc3RyY2hyKHRwLT5uYW1lLCAnOicpOworICAgICAgICBpZiAocykKKyAgICAgICAgICBzb2FwX3V0aWxpemVfbnMoc29hcCwgdHAtPm5hbWUsIHMgLSB0cC0+bmFtZSk7CisgICAgICB9CisgICAgfQorICAgIGZvciAobnAgPSBzb2FwLT5ubGlzdDsgbnA7IG5wID0gbnAtPm5leHQpCisgICAgeyBpZiAobnAtPmluZGV4ID09IDEgJiYgbnAtPm5zKQorICAgICAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgInhtbG5zOiVzIiwgbnAtPmlkKTsKKyAgICAgICAgc29hcF9zZXRfYXR0cihzb2FwLCBzb2FwLT50bXBidWYsIG5wLT5ucyk7CisgICAgICAgIG5wLT5pbmRleCA9IDI7CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYKKyAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICB7IGlmICh0cC0+dmlzaWJsZSkKKyAgICB7IGlmIChzb2FwX3NlbmQoc29hcCwgIiAiKSB8fCBzb2FwX3NlbmQoc29hcCwgdHAtPm5hbWUpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBpZiAodHAtPnZpc2libGUgPT0gMiAmJiB0cC0+dmFsdWUpCisgICAgICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsICI9XCIiLCAyKQorCSB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgdHAtPnZhbHVlLCAxKQorCSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICJcIiIsIDEpKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHRwLT52aXNpYmxlID0gMDsKKyAgICB9CisgIH0KKyAgaWYgKHRhZykKKyAgeyAKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAiPiIsIDEpCisgICAgICAgfHwgc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICBzb2FwLT5sZXZlbC0tOwkvKiBkZWNyZW1lbnQgbGV2ZWwganVzdCBiZWZvcmUgLz4gKi8KKyAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAiLz4iLCAyKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCAiPiIsIDEpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfZW5kX291dChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnKQoreyBpZiAoKnRhZyA9PSAnLScpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRWxlbWVudCBlbmRpbmcgdGFnPSclcydcbiIsIHRhZykpOworI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IGlmIChzb2FwLT5kb20tPnBybnQpCisgICAgICBzb2FwLT5kb20gPSBzb2FwLT5kb20tPnBybnQ7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgICAgc29hcF9wb3BfbnMoc29hcCk7CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfSU5ERU5UKQorICB7IGlmICghc29hcC0+Ym9keSkKKyAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHNvYXBfaW5kZW50LCBzb2FwLT5sZXZlbCA8IHNpemVvZihzb2FwX2luZGVudCkgPyBzb2FwLT5sZXZlbCA6IHNpemVvZihzb2FwX2luZGVudCkgLSAxKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBzb2FwLT5ib2R5ID0gMDsKKyAgfQorI2VuZGlmCisgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsICI8LyIsIDIpCisgICB8fCBzb2FwX3NlbmQoc29hcCwgdGFnKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHNvYXAtPmxldmVsLS07CS8qIGRlY3JlbWVudCBsZXZlbCBqdXN0IGJlZm9yZSA+ICovCisgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsICI+IiwgMSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9yZWYoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBpbnQgaHJlZikKK3sgcmVnaXN0ZXIgaW50IG4gPSAwOworICBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICAgIG4gPSAxOworICBzcHJpbnRmKHNvYXAtPmhyZWYsICIjXyVkIiwgaHJlZik7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfaHJlZihzb2FwLCB0YWcsIGlkLCAiaHJlZiIgKyBuLCBzb2FwLT5ocmVmICsgbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9ocmVmKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgY2hhciAqcmVmLCBjb25zdCBjaGFyICp2YWwpCit7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRWxlbWVudCAnJXMnIHJlZmVyZW5jZSAlcz0nJXMnXG4iLCB0YWcsIHJlZiwgdmFsKSk7CisgIGlmIChzb2FwX2VsZW1lbnQoc29hcCwgdGFnLCBpZCwgTlVMTCkKKyAgIHx8IHNvYXBfYXR0cmlidXRlKHNvYXAsIHJlZiwgdmFsKQorICAgfHwgc29hcF9lbGVtZW50X3N0YXJ0X2VuZF9vdXQoc29hcCwgdGFnKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfbnVsbChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnR5cGUpCit7IHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqdHA7CisgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgICBpZiAodHAtPnZpc2libGUpCisgICAgICBicmVhazsKKyAgaWYgKHRwIHx8IChzb2FwLT52ZXJzaW9uID09IDIgJiYgc29hcC0+cG9zaXRpb24gPiAwKSB8fCBpZCA+IDAgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9OSUwpKQorICB7IGlmIChzb2FwX2VsZW1lbnQoc29hcCwgdGFnLCBpZCwgdHlwZSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHNvYXAtPnBhcnQgIT0gU09BUF9JTl9IRUFERVIgJiYgc29hcC0+ZW5jb2RpbmdTdHlsZSkKKyAgICAgIGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAieHNpOm5pbCIsICJ0cnVlIikpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICByZXR1cm4gc29hcF9lbGVtZW50X3N0YXJ0X2VuZF9vdXQoc29hcCwgdGFnKTsKKyAgfQorICBzb2FwLT5udWxsID0gMTsKKyAgc29hcC0+cG9zaXRpb24gPSAwOworICBzb2FwLT5tdXN0VW5kZXJzdGFuZCA9IDA7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfaWQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KSAKK3sgaWYgKCFwIHx8IChhICYmICFhLT5fX3B0cikpCisgIHsgc29hcF9lbGVtZW50X251bGwoc29hcCwgdGFnLCBpZCwgdHlwZSk7CisgICAgcmV0dXJuIC0xOworICB9CisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1RSRUUpCisgICAgcmV0dXJuIDA7CisgIGlmIChpZCA8IDApCisgIHsgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICAgIGlmIChhKQorICAgICAgaWQgPSBzb2FwX2FycmF5X3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIGEsIG4sIHQsICZwcCk7CisgICAgZWxzZQorICAgICAgaWQgPSBzb2FwX3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIHQsICZwcCk7CisgICAgaWYgKGlkKQorICAgIHsgaWYgKHNvYXBfaXNfZW1iZWRkZWQoc29hcCwgcHApKQorICAgICAgeyBzb2FwX2VsZW1lbnRfcmVmKHNvYXAsIHRhZywgMCwgaWQpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBpZiAoc29hcF9pc19zaW5nbGUoc29hcCwgcHApKQorICAgICAgICByZXR1cm4gMDsKKyAgICAgIHNvYXBfc2V0X2VtYmVkZGVkKHNvYXAsIHBwKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGlkOworI2Vsc2UKKyAgcmV0dXJuIDA7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X3Jlc3VsdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnKQoreyBpZiAoc29hcC0+dmVyc2lvbiA9PSAyICYmIHNvYXAtPmVuY29kaW5nU3R5bGUpCisgICAgaWYgKHNvYXBfZWxlbWVudChzb2FwLCAiU09BUC1SUEM6cmVzdWx0IiwgMCwgTlVMTCkKKyAgICAgfHwgc29hcF9hdHRyaWJ1dGUoc29hcCwgInhtbG5zOlNPQVAtUlBDIiwgc29hcF9ycGMpCisgICAgIHx8IHNvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHNvYXAsIE5VTEwpCisgICAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCB0YWcsIDApCisgICAgIHx8IHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsICJTT0FQLVJQQzpyZXN1bHQiKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYXR0cmlidXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sgCisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAqYSA9IChzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSkpOworICAgIGEtPm5leHQgPSBzb2FwLT5kb20tPmF0dHM7CisgICAgYS0+bnN0ciA9IE5VTEw7CisgICAgYS0+bmFtZSA9IHNvYXBfc3RyZHVwKHNvYXAsIG5hbWUpOworICAgIGEtPmRhdGEgPSBzb2FwX3N0cmR1cChzb2FwLCB2YWx1ZSk7CisgICAgYS0+d2lkZSA9IE5VTEw7CisgICAgYS0+c29hcCA9IHNvYXA7CisgICAgc29hcC0+ZG9tLT5hdHRzID0gYTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgeyAvKiBUT0RPOiBjb25zaWRlciB1c2luZyB0aGlzIGNvZGUgdG8gaGFuZGxlIGRlZmF1bHQgbmFtZXNwYWNlCisgICAgaWYgKCFzdHJuY21wKG5hbWUsICJ4bWxucyIsIDUpICYmIChuYW1lWzVdID09ICc6JyB8fCBuYW1lWzVdID09ICdcMCcpKQorICAgIHsgaWYgKG5hbWVbNV0gPT0gJzonKQorICAgICAgICBzb2FwX3B1c2hfbnMoc29hcCwgbmFtZSArIDYsIHZhbHVlLCAwKTsKKyAgICAgIGVsc2UKKyAgICAgICAgc29hcF9wdXNoX25zKHNvYXAsICIiLCB2YWx1ZSwgMCk7CisgICAgfQorICAgICovCisgICAgaWYgKCFzdHJuY21wKG5hbWUsICJ4bWxuczoiLCA2KSkKKyAgICAgIHNvYXBfcHVzaF9ucyhzb2FwLCBuYW1lICsgNiwgdmFsdWUsIDApOworICAgIGVsc2UgaWYgKHNvYXBfc2V0X2F0dHIoc29hcCwgbmFtZSwgdmFsdWUpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGVsc2UKKyNlbmRpZgorICB7IGlmIChzb2FwX3NlbmQoc29hcCwgIiAiKSB8fCBzb2FwX3NlbmQoc29hcCwgbmFtZSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHZhbHVlKQorICAgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgIj1cIiIsIDIpCisgICAgICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHZhbHVlLCAxKQorICAgICAgIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIlwiIiwgMSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X2JlZ2luX2luKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBuaWxsYWJsZSkKK3sgaWYgKCFzb2FwX3BlZWtfZWxlbWVudChzb2FwKSkKKyAgeyBpZiAoc29hcC0+b3RoZXIpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1RBR19NSVNNQVRDSDsKKyAgICBpZiAodGFnICYmICp0YWcgPT0gJy0nKQorICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgaWYgKCEoc29hcC0+ZXJyb3IgPSBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50YWcsIHRhZykpKQorICAgIHsgc29hcC0+cGVla2VkID0gMDsKKyAgICAgIGlmIChzb2FwLT5ib2R5KQorICAgICAgICBzb2FwLT5sZXZlbCsrOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJCZWdpbiBlbGVtZW50IGZvdW5kIChsZXZlbD0ldSkgJyVzJz0nJXMnXG4iLCBzb2FwLT5sZXZlbCwgc29hcC0+dGFnLCB0YWc/dGFnOiIiICkpOworICAgICAgaWYgKCFuaWxsYWJsZSAmJiBzb2FwLT5udWxsICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9OVUxMOworICAgIH0KKyAgfQorICBlbHNlIGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRyAmJiB0YWcgJiYgKnRhZyA9PSAnLScpCisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9lbmRfaW4oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZykgIAoreyByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIHJlZ2lzdGVyIGNoYXIgKnM7CisgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnQ7CisgIHJlZ2lzdGVyIGludCBuID0gMDsKKyAgaWYgKHRhZyAmJiAqdGFnID09ICctJykKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgc29hcC0+bGV2ZWwtLTsKKyAgc29hcF9wb3BfbmFtZXNwYWNlKHNvYXApOworI2lmZGVmIFdJVEhfRE9NCisgIC8qIHRoaXMgd2hpdGVzcGFjZSBvciBtaXhlZCBjb250ZW50IGlzIG5vdCBpbnNpZ25pZmljYW50IGZvciBET00gKi8KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgaWYgKCFzb2FwLT5wZWVrZWQgJiYgIXNvYXBfc3RyaW5nX2luKHNvYXAsIDMsIC0xLCAtMSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHNvYXAtPmRvbS0+cHJudCkKKyAgICAgIHNvYXAtPmRvbSA9IHNvYXAtPmRvbS0+cHJudDsKKyAgfQorI2VuZGlmCisgIGlmIChzb2FwLT5wZWVrZWQpCisgIHsgaWYgKHNvYXAtPmVycm9yID09IFNPQVBfTk9fVEFHKQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICAgIGlmICgqc29hcC0+dGFnKQorICAgICAgbisrOworICAgIHNvYXAtPnBlZWtlZCA9IDA7CisgIH0KKyAgZG8KKyAgeyB3aGlsZSAoKChjID0gc29hcF9nZXQoc29hcCkpICE9IFNPQVBfVFQpKQorICAgIHsgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgICAgaWYgKGMgPT0gU09BUF9MVCkKKyAgICAgICAgbisrOworICAgICAgZWxzZSBpZiAoYyA9PSAnLycpCisgICAgICB7IGMgPSBzb2FwX2dldChzb2FwKTsKKyAgICAgICAgaWYgKGMgPT0gU09BUF9HVCkKKwkgIG4tLTsKKyAgICAgICAgZWxzZQorCSAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgIH0KKyAgICB9CisgIH0gd2hpbGUgKG4tLSk7CisgIHMgPSBzb2FwLT50YWc7CisgIHdoaWxlIChzb2FwX25vdGJsYW5rKGMgPSBzb2FwX2dldChzb2FwKSkpCisgICAgKnMrKyA9IChjaGFyKWM7CisgICpzID0gJ1wwJzsKKyAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIHdoaWxlIChzb2FwX2JsYW5rKGMpKQorICAgIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgaWYgKGMgIT0gU09BUF9HVCkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1NZTlRBWF9FUlJPUjsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgZWxlbWVudCBmb3VuZCAobGV2ZWw9JXUpICclcyc9JyVzJ1xuIiwgc29hcC0+bGV2ZWwsIHNvYXAtPnRhZywgdGFnP3RhZzoiIikpOworICBpZiAoIXRhZyB8fCAhKnRhZykKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgaWYgKChzID0gc3RyY2hyKHNvYXAtPnRhZywgJzonKSkpCisgICAgcysrOworICBlbHNlCisgICAgcyA9IHNvYXAtPnRhZzsKKyAgaWYgKCh0ID0gc3RyY2hyKHRhZywgJzonKSkpCisgICAgdCsrOworICBlbHNlCisgICAgdCA9IHRhZzsKKyAgaWYgKCFTT0FQX1NUUkNNUChzLCB0KSkKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgZWxlbWVudCB0YWcgbmFtZSBkb2VzIG5vdCBtYXRjaFxuIikpOworICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1NZTlRBWF9FUlJPUjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIgKgorU09BUF9GTUFDMgorc29hcF9hdHRyX3ZhbHVlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgZmxhZykKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfYXR0cmlidXRlICp0cDsKKyAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICAgIGlmICghc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsIG5hbWUpKQorICAgICAgYnJlYWs7CisgIGlmICh0cCAmJiB0cC0+dmlzaWJsZSA9PSAyKQorICB7IGlmIChmbGFnID09IDIgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1BST0hJQklURUQ7CisgICAgZWxzZQorICAgICAgcmV0dXJuIHRwLT52YWx1ZTsKKyAgfQorICBlbHNlIGlmIChmbGFnID09IDEgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKQorICAgIHNvYXAtPmVycm9yID0gU09BUF9SRVFVSVJFRDsKKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2F0dHIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKnRwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNldCBhdHRyaWJ1dGUgJXM9JyVzJ1xuIiwgbmFtZSwgdmFsdWU/dmFsdWU6IiIpKTsKKyAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICB7IGlmICghc3RyY21wKHRwLT5uYW1lLCBuYW1lKSkKKyAgICAgIGJyZWFrOworICB9CisgIGlmICghdHApCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJBbGxvY2F0ZSBhdHRyaWJ1dGUgJXNcbiIsIG5hbWUpKTsKKyAgICBpZiAoISh0cCA9IChzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUpICsgc3RybGVuKG5hbWUpKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICB0cC0+bnMgPSBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgICB7IHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqKnRwcCA9ICZzb2FwLT5hdHRyaWJ1dGVzOworICAgICAgY29uc3QgY2hhciAqcyA9IHN0cmNocihuYW1lLCAnOicpOworICAgICAgaWYgKCFzdHJuY21wKG5hbWUsICJ4bWxucyIsIDUpKQorICAgICAgeyBmb3IgKDsgKnRwcDsgdHBwID0gJigqdHBwKS0+bmV4dCkKKyAgICAgICAgICBpZiAoc3RybmNtcCgoKnRwcCktPm5hbWUsICJ4bWxucyIsIDUpIHx8IHN0cmNtcCgoKnRwcCktPm5hbWUgKyA1LCBuYW1lICsgNSkgPiAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlbHNlIGlmICghcykKKyAgICAgIHsgZm9yICg7ICp0cHA7IHRwcCA9ICYoKnRwcCktPm5leHQpCisgICAgICAgICAgaWYgKHN0cm5jbXAoKCp0cHApLT5uYW1lLCAieG1sbnMiLCA1KSAmJiAoKCp0cHApLT5ucyB8fCBzdHJjbXAoKCp0cHApLT5uYW1lLCBuYW1lKSA+IDApKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IGludCBrOworICAgICAgICBmb3IgKDsgKnRwcDsgdHBwID0gJigqdHBwKS0+bmV4dCkKKwl7IGlmICghc3RybmNtcCgoKnRwcCktPm5hbWUsICJ4bWxuczoiLCA2KSAmJiAhc3RybmNtcCgoKnRwcCktPm5hbWUgKyA2LCBuYW1lLCBzIC0gbmFtZSkgJiYgISgqdHBwKS0+bmFtZVs2ICsgcyAtIG5hbWVdKQorCSAgeyBpZiAoIXRwLT5ucykKKyAgICAgICAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDYW5vbmljYWxpemF0aW9uOiBwcmVmaXggJXM9JXAoJXMpXG4iLCBuYW1lLCAoKnRwcCktPm5zLCAoKnRwcCktPm5zKSk7CisJICAgICAgdHAtPm5zID0gKCp0cHApLT5uczsKKwkgICAgfQorCSAgfQorICAgICAgICAgIGVsc2UgaWYgKHN0cm5jbXAoKCp0cHApLT5uYW1lLCAieG1sbnMiLCA1KSAmJiAoKnRwcCktPm5zICYmIHRwLT5ucyAmJiAoKGsgPSBzdHJjbXAoKCp0cHApLT5ucywgdHAtPm5zKSkgPiAwIHx8ICghayAmJiBzdHJjbXAoKCp0cHApLT5uYW1lLCBuYW1lKSA+IDApKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICB0cC0+bmV4dCA9ICp0cHA7CisgICAgICAqdHBwID0gdHA7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHsgdHAtPm5leHQgPSBzb2FwLT5hdHRyaWJ1dGVzOworICAgICAgc29hcC0+YXR0cmlidXRlcyA9IHRwOworICAgIH0KKyAgICBzdHJjcHkodHAtPm5hbWUsIG5hbWUpOworICAgIHRwLT52YWx1ZSA9IE5VTEw7CisgIH0KKyAgZWxzZSBpZiAodHAtPnZpc2libGUpCisgIHsgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgZWxzZSBpZiAodmFsdWUgJiYgdHAtPnZhbHVlICYmIHRwLT5zaXplIDw9IHN0cmxlbih2YWx1ZSkpCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIGF0dHJpYnV0ZSB2YWx1ZSBvZiAlcyAoZnJlZSAlcClcbiIsIG5hbWUsIHRwLT52YWx1ZSkpOworICAgIFNPQVBfRlJFRShzb2FwLCB0cC0+dmFsdWUpOworICAgIHRwLT52YWx1ZSA9IE5VTEw7CisgICAgdHAtPm5zID0gTlVMTDsKKyAgfQorICBpZiAodmFsdWUpCisgIHsgaWYgKCF0cC0+dmFsdWUpCisgICAgeyB0cC0+c2l6ZSA9IHN0cmxlbih2YWx1ZSkgKyAxOworICAgICAgaWYgKCEodHAtPnZhbHVlID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHRwLT5zaXplKSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJBbGxvY2F0ZSBhdHRyaWJ1dGUgdmFsdWUgb2YgJXMgKCVwKVxuIiwgdHAtPm5hbWUsIHRwLT52YWx1ZSkpOworICAgIH0KKyAgICBzdHJjcHkodHAtPnZhbHVlLCB2YWx1ZSk7CisgICAgaWYgKCFzdHJuY21wKHRwLT5uYW1lLCAieG1sbnM6IiwgNikpCisgICAgICB0cC0+bnMgPSB0cC0+dmFsdWU7CisgICAgdHAtPnZpc2libGUgPSAyOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBpZiAoIXN0cmNtcChuYW1lLCAid3N1OklkIikpCisgICAgeyBzb2FwLT5wYXJ0ID0gU09BUF9CRUdJTl9TRUNVUklUWTsKKyAgICAgIHN0cm5jcHkoc29hcC0+aWQsIHZhbHVlLCBzaXplb2Yoc29hcC0+aWQpKTsKKyAgICAgIHNvYXAtPmlkW3NpemVvZihzb2FwLT5pZCktMV0gPSAnXDAnOworICAgIH0KKyNlbmRpZgorICB9CisgIGVsc2UKKyAgICB0cC0+dmlzaWJsZSA9IDE7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9jbHJfYXR0cihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfYXR0cmlidXRlICp0cDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkpCisgIHsgd2hpbGUgKHNvYXAtPmF0dHJpYnV0ZXMpCisgICAgeyB0cCA9IHNvYXAtPmF0dHJpYnV0ZXMtPm5leHQ7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+YXR0cmlidXRlcy0+dmFsdWUpOworICAgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPmF0dHJpYnV0ZXMpOworICAgICAgc29hcC0+YXR0cmlidXRlcyA9IHRwOworICAgIH0KKyAgfQorICBlbHNlCisjZW5kaWYKKyAgeyBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgICAgICB0cC0+dmlzaWJsZSA9IDA7CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK3N0YXRpYyBpbnQKK3NvYXBfZ2V0YXR0cnZhbChzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqcywgc2l6ZV90IG4sIHNvYXBfd2NoYXIgZCkKK3sgcmVnaXN0ZXIgc2l6ZV90IGk7CisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgIHsgcmVnaXN0ZXIgc29hcF93Y2hhciBjID0gc29hcF9nZXQoc29hcCk7CisgICAgc3dpdGNoIChjKQorICAgIHsKKyAgICBjYXNlIFNPQVBfVFQ6CisgICAgICAqcysrID0gJzwnOworICAgICAgc29hcF91bmdldChzb2FwLCAnLycpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0xUOgorICAgICAgKnMrKyA9ICc8JzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9HVDoKKyAgICAgIGlmIChkID09ICcgJykKKyAgICAgIHsgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgKnMgPSAnXDAnOworICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICAgIH0KKyAgICAgICpzKysgPSAnPic7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfUVQ6CisgICAgICBpZiAoYyA9PSBkKQorICAgICAgeyAqcyA9ICdcMCc7CisgICAgICAgIHJldHVybiBTT0FQX09LOworICAgICAgfQorICAgICAgKnMrKyA9ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9BUDoKKyAgICAgIGlmIChjID09IGQpCisgICAgICB7ICpzID0gJ1wwJzsKKyAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgICB9CisgICAgICAqcysrID0gJ1wnJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1x0JzoKKyAgICBjYXNlICdcbic6CisgICAgY2FzZSAnXHInOgorICAgIGNhc2UgJyAnOgorICAgIGNhc2UgJy8nOgorICAgICAgaWYgKGQgPT0gJyAnKQorICAgICAgeyBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICAqcyA9ICdcMCc7CisgICAgICAgIHJldHVybiBTT0FQX09LOworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgICAqcysrID0gKGNoYXIpYzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBXSVRIX0ZBU1QKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc3RvcmVfbGFiKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBzaXplX3QgbikKK3sgc29hcC0+bGFiaWR4ID0gMDsKKyAgcmV0dXJuIHNvYXBfYXBwZW5kX2xhYihzb2FwLCBzLCBuKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgV0lUSF9GQVNUCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2FwcGVuZF9sYWIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBuKQoreyBpZiAoc29hcC0+bGFiaWR4ICsgbiA+PSBzb2FwLT5sYWJsZW4pCisgIHsgcmVnaXN0ZXIgY2hhciAqdCA9IHNvYXAtPmxhYmJ1ZjsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVubGFyZ2luZyBsb29rLWFzaWRlIGJ1ZmZlciB0byBhcHBlbmQgZGF0YSwgb2xkIHNpemU9JWx1IiwgKHVuc2lnbmVkIGxvbmcpc29hcC0+bGFibGVuKSk7CisgICAgaWYgKHNvYXAtPmxhYmxlbiA9PSAwKQorICAgICAgc29hcC0+bGFibGVuID0gU09BUF9MQUJMRU47CisgICAgd2hpbGUgKHNvYXAtPmxhYmlkeCArIG4gPj0gc29hcC0+bGFibGVuKQorICAgICAgc29hcC0+bGFibGVuIDw8PSAxOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiLCBuZXcgc2l6ZT0lbHVcbiIsICh1bnNpZ25lZCBsb25nKXNvYXAtPmxhYmxlbikpOworICAgIHNvYXAtPmxhYmJ1ZiA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzb2FwLT5sYWJsZW4pOworICAgIGlmICghc29hcC0+bGFiYnVmKQorICAgIHsgaWYgKHQpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCB0KTsKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIH0KKyAgICBpZiAodCkKKyAgICB7IG1lbWNweShzb2FwLT5sYWJidWYsIHQsIHNvYXAtPmxhYmlkeCk7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgdCk7CisgICAgfQorICB9CisgIGlmIChzKQorICB7IG1lbWNweShzb2FwLT5sYWJidWYgKyBzb2FwLT5sYWJpZHgsIHMsIG4pOworICAgIHNvYXAtPmxhYmlkeCArPSBuOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcGVla19lbGVtZW50KHN0cnVjdCBzb2FwICpzb2FwKQoreworI2lmZGVmIFdJVEhfRE9NCisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgKiphdHQgPSBOVUxMOworICByZWdpc3RlciBjaGFyICpsZWFkID0gTlVMTDsKKyNlbmRpZgorICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKnRwOworICBjb25zdCBjaGFyICp0OworICByZWdpc3RlciBjaGFyICpzOworICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIHJlZ2lzdGVyIGludCBpOworICBpZiAoc29hcC0+cGVla2VkKQorICB7IGlmICghKnNvYXAtPnRhZykKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTk9fVEFHOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIHNvYXAtPnBlZWtlZCA9IDE7CisgIGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisjaWZkZWYgV0lUSF9ET00KKyAgLyogd2hpdGVzcGFjZSBsZWFkaW5nIHRvIHN0YXJ0IHRhZyBpcyBub3QgaW5zaWduaWZpY2FudCBmb3IgRE9NICovCisgIGlmIChzb2FwX2JsYW5rKGMpKQorICB7IHNvYXAtPmxhYmlkeCA9IDA7CisgICAgZG8KKyAgICB7IGlmIChzb2FwX2FwcGVuZF9sYWIoc29hcCwgTlVMTCwgMCkpCisgICAgICAgIHJldHVybiBTT0FQX0VPTTsKKyAgICAgIHMgPSBzb2FwLT5sYWJidWYgKyBzb2FwLT5sYWJpZHg7CisgICAgICBpID0gc29hcC0+bGFibGVuIC0gc29hcC0+bGFiaWR4OworICAgICAgc29hcC0+bGFiaWR4ID0gc29hcC0+bGFibGVuOworICAgICAgd2hpbGUgKHNvYXBfYmxhbmsoYykgJiYgaS0tKQorICAgICAgeyAqcysrID0gYzsKKyAgICAgICAgYyA9IHNvYXBfZ2V0dXRmOChzb2FwKTsKKyAgICAgIH0KKyAgICB9CisgICAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworICAgICpzID0gJ1wwJzsKKyAgICBsZWFkID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+bGFiYnVmKTsKKyAgfQorI2Vsc2UKKyAgd2hpbGUgKHNvYXBfYmxhbmsoYykpCisgICAgYyA9IHNvYXBfZ2V0dXRmOChzb2FwKTsKKyNlbmRpZgorICBpZiAoYyAhPSBTT0FQX0xUKQorICB7ICpzb2FwLT50YWcgPSAnXDAnOworICAgIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyNpZmRlZiBXSVRIX0RPTQorICAgIC8qIHdoaXRlc3BhY2UgbGVhZGluZyB0byBlbmQgdGFnIGlzIG5vdCBpbnNpZ25pZmljYW50IGZvciBET00gKi8KKyAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgICAgIHNvYXAtPmRvbS0+dGFpbCA9IHNvYXBfc3RyZHVwKHNvYXAsIGxlYWQpOworI2VuZGlmCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9OT19UQUc7CisgIH0KKyAgcyA9IHNvYXAtPnRhZzsKKyAgZG8gYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworICBpID0gc2l6ZW9mKHNvYXAtPnRhZyk7CisgIHdoaWxlIChjICE9ICc+JyAmJiBjICE9ICcvJyAmJiBzb2FwX25vdGJsYW5rKGMpKQorICB7IGlmICgtLWkgPiAwKQorICAgICAgKnMrKyA9IChjaGFyKWM7CisgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgfQorICB3aGlsZSAoc29hcF9ibGFuayhjKSkKKyAgICBjID0gc29hcF9nZXQxKHNvYXApOworICAqcyA9ICdcMCc7CisgIHNvYXAtPmlkWzBdID0gJ1wwJzsKKyAgc29hcC0+aHJlZlswXSA9ICdcMCc7CisgIHNvYXAtPnR5cGVbMF0gPSAnXDAnOworICBzb2FwLT5hcnJheVR5cGVbMF0gPSAnXDAnOworICBzb2FwLT5hcnJheVNpemVbMF0gPSAnXDAnOworICBzb2FwLT5hcnJheU9mZnNldFswXSA9ICdcMCc7CisgIHNvYXAtPm90aGVyID0gMDsKKyAgc29hcC0+cm9vdCA9IC0xOworICBzb2FwLT5wb3NpdGlvbiA9IDA7CisgIHNvYXAtPm51bGwgPSAwOworICBzb2FwLT5tdXN0VW5kZXJzdGFuZCA9IDA7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKmVsdDsKKyAgICBlbHQgPSAoc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCkpOworICAgIGlmICghZWx0KQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgZWx0LT5uZXh0ID0gTlVMTDsKKyAgICBlbHQtPm5zdHIgPSBOVUxMOworICAgIGVsdC0+bmFtZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPnRhZyk7CisgICAgZWx0LT5wcm50ID0gc29hcC0+ZG9tOworICAgIGVsdC0+ZWx0cyA9IE5VTEw7CisgICAgZWx0LT5hdHRzID0gTlVMTDsKKyAgICBlbHQtPmRhdGEgPSBOVUxMOworICAgIGVsdC0+d2lkZSA9IE5VTEw7CisgICAgZWx0LT50eXBlID0gMDsKKyAgICBlbHQtPm5vZGUgPSBOVUxMOworICAgIGVsdC0+aGVhZCA9IGxlYWQ7CisgICAgZWx0LT50YWlsID0gTlVMTDsKKyAgICBlbHQtPnNvYXAgPSBzb2FwOworICAgIGlmIChzb2FwLT5kb20pCisgICAgeyBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqcCA9IHNvYXAtPmRvbS0+ZWx0czsKKyAgICAgIGlmIChwKQorICAgICAgeyB3aGlsZSAocC0+bmV4dCkKKyAgICAgICAgICBwID0gcC0+bmV4dDsKKyAgICAgICAgcC0+bmV4dCA9IGVsdDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgc29hcC0+ZG9tLT5lbHRzID0gZWx0OworICAgIH0KKyAgICBzb2FwLT5kb20gPSBlbHQ7CisgICAgYXR0ID0gJmVsdC0+YXR0czsKKyAgfQorI2VuZGlmCisgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgICB0cC0+dmlzaWJsZSA9IDA7CisgIHdoaWxlICgoaW50KWMgIT0gRU9GICYmIGMgIT0gJz4nICYmIGMgIT0gJy8nKQorICB7IHMgPSBzb2FwLT50bXBidWY7CisgICAgaSA9IHNpemVvZihzb2FwLT50bXBidWYpOworICAgIHdoaWxlIChjICE9ICc9JyAmJiBjICE9ICc+JyAmJiBjICE9ICcvJyAmJiBzb2FwX25vdGJsYW5rKGMpKQorICAgIHsgaWYgKC0taSA+IDApCisgICAgICAgICpzKysgPSAoY2hhciljOworICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICB9CisgICAgKnMgPSAnXDAnOworICAgIGlmIChpID09IHNpemVvZihzb2FwLT50bXBidWYpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9TWU5UQVhfRVJST1I7CisjaWZkZWYgV0lUSF9ET00KKyAgICAvKiBhZGQgYXR0cmlidXRlIG5hbWUgdG8gZG9tICovCisgICAgaWYgKGF0dCkKKyAgICB7ICphdHQgPSAoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUpKTsKKyAgICAgICBpZiAoISphdHQpCisgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgICAoKmF0dCktPm5leHQgPSBOVUxMOworICAgICAgICgqYXR0KS0+bnN0ciA9IE5VTEw7CisgICAgICAgKCphdHQpLT5uYW1lID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+dG1wYnVmKTsKKyAgICAgICAoKmF0dCktPmRhdGEgPSBOVUxMOworICAgICAgICgqYXR0KS0+d2lkZSA9IE5VTEw7CisgICAgICAgKCphdHQpLT5zb2FwID0gc29hcDsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoIXN0cm5jbXAoc29hcC0+dG1wYnVmLCAieG1sbnMiLCA1KSkKKyAgICB7IGlmIChzb2FwLT50bXBidWZbNV0gPT0gJzonKQorICAgICAgeyBzb2FwLT50bXBidWZbNV0gPSAnXDAnOworICAgICAgICB0ID0gc29hcC0+dG1wYnVmICsgNjsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHNvYXAtPnRtcGJ1Zls1XSkKKyAgICAgICAgdCA9IE5VTEw7CisgICAgICBlbHNlCisgICAgICAgIHQgPSBTT0FQX1NUUl9FT1M7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHQgPSBOVUxMOworICAgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgICB7IGlmICghU09BUF9TVFJDTVAodHAtPm5hbWUsIHNvYXAtPnRtcGJ1ZikpCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIXRwKQorICAgIHsgdHAgPSAoc3RydWN0IHNvYXBfYXR0cmlidXRlKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfYXR0cmlidXRlKSArIHN0cmxlbihzb2FwLT50bXBidWYpKTsKKyAgICAgIGlmICghdHApCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgc3RyY3B5KHRwLT5uYW1lLCBzb2FwLT50bXBidWYpOworICAgICAgdHAtPnZhbHVlID0gTlVMTDsKKyAgICAgIHRwLT5zaXplID0gMDsKKyAgICAgIHRwLT5uZXh0ID0gc29hcC0+YXR0cmlidXRlczsKKyAgICAgIHNvYXAtPmF0dHJpYnV0ZXMgPSB0cDsKKyAgICB9CisgICAgd2hpbGUgKHNvYXBfYmxhbmsoYykpCisgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworICAgIGlmIChjID09ICc9JykKKyAgICB7IGRvIGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisgICAgICB3aGlsZSAoc29hcF9ibGFuayhjKSk7CisgICAgICBpZiAoYyAhPSBTT0FQX1FUICYmIGMgIT0gU09BUF9BUCkKKyAgICAgIHsgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgYyA9ICcgJzsgLyogYmxhbmsgZGVsaW1pdGVyICovCisgICAgICB9CisgICAgICBpZiAoc29hcF9nZXRhdHRydmFsKHNvYXAsIHRwLT52YWx1ZSwgdHAtPnNpemUsIGMpKQorICAgICAgeworI2lmZGVmIFdJVEhfRkFTVAorICAgICAgICBpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9FT00pCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisJaWYgKHNvYXBfc3RvcmVfbGFiKHNvYXAsIHRwLT52YWx1ZSwgdHAtPnNpemUpKQorCSAgcmV0dXJuIHNvYXAtPmVycm9yOworCWlmICh0cC0+dmFsdWUpCisJICBTT0FQX0ZSRUUoc29hcCwgdHAtPnZhbHVlKTsKKwlmb3IgKDs7KQorCXsgaWYgKHNvYXBfZ2V0YXR0cnZhbChzb2FwLCBzb2FwLT5sYWJidWYgKyBzb2FwLT5sYWJpZHgsIHNvYXAtPmxhYmxlbiAtIHNvYXAtPmxhYmlkeCwgYykpCisJICB7IGlmIChzb2FwLT5lcnJvciAhPSBTT0FQX0VPTSkKKwkgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisJICAgIHNvYXAtPmxhYmlkeCA9IHNvYXAtPmxhYmxlbjsKKwkgICAgaWYgKHNvYXBfYXBwZW5kX2xhYihzb2FwLCBOVUxMLCAwKSkKKwkgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisJICB9CisJICBlbHNlCisJICAgIGJyZWFrOworCX0KKwlpZiAoc29hcC0+bGFiaWR4KQorICAgICAgICAgIHRwLT5zaXplID0gc29hcC0+bGFibGVuOworCWVsc2UKKwl7IHRwLT5zaXplID0gc3RybGVuKHNvYXAtPmxhYmJ1ZikgKyAxOworICAgICAgICAgIGlmICh0cC0+c2l6ZSA8IFNPQVBfTEFCTEVOKQorCSAgICB0cC0+c2l6ZSA9IFNPQVBfTEFCTEVOOworICAgICAgICB9CisJaWYgKCEodHAtPnZhbHVlID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHRwLT5zaXplKSkpCisJICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgICAgc3RyY3B5KHRwLT52YWx1ZSwgc29hcC0+bGFiYnVmKTsKKyNlbHNlCisJc2l6ZV90IG47CisgICAgICAgIGlmIChzb2FwLT5lcnJvciAhPSBTT0FQX0VPTSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgICAgICAgaWYgKHNvYXBfbmV3X2Jsb2NrKHNvYXApKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeyBpZiAoIShzID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBTT0FQX0JMS0xFTikpKQorICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICAgIGlmIChzb2FwX2dldGF0dHJ2YWwoc29hcCwgcywgU09BUF9CTEtMRU4sIGMpKQorICAgICAgICAgIHsgaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfRU9NKQorICAgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisJbiA9IHRwLT5zaXplICsgc29hcC0+Ymxpc3QtPnNpemU7CisgICAgICAgIGlmICghKHMgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgbikpKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgICBpZiAodHAtPnZhbHVlKQorICAgICAgICB7IG1lbWNweShzLCB0cC0+dmFsdWUsIHRwLT5zaXplKTsKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgdHAtPnZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBzb2FwX3NhdmVfYmxvY2soc29hcCwgcyArIHRwLT5zaXplLCAwKTsKKyAgICAgICAgdHAtPnZhbHVlID0gczsKKyAgICAgICAgdHAtPnNpemUgPSBuOworI2VuZGlmCisgICAgICB9CisgICAgICBkbyBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworICAgICAgdHAtPnZpc2libGUgPSAyOyAvKiBzZWVuIHRoaXMgYXR0cmlidXRlIHcvIHZhbHVlICovCisjaWZkZWYgV0lUSF9ET00KKyAgICAgIGlmIChhdHQpCisgICAgICAgICgqYXR0KS0+ZGF0YSA9IHNvYXBfc3RyZHVwKHNvYXAsIHRwLT52YWx1ZSk7CisjZW5kaWYKKyAgICB9CisgICAgZWxzZQorICAgICAgdHAtPnZpc2libGUgPSAxOyAvKiBzZWVuIHRoaXMgYXR0cmlidXRlIHcvbyB2YWx1ZSAqLworI2lmZGVmIFdJVEhfRE9NCisgICAgaWYgKGF0dCkKKyAgICAgIGF0dCA9ICYoKmF0dCktPm5leHQ7CisjZW5kaWYKKyAgICBpZiAodCAmJiB0cC0+dmFsdWUpCisgICAgeyBpZiAoc29hcF9wdXNoX25hbWVzcGFjZShzb2FwLCB0LCB0cC0+dmFsdWUpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB0cC0+dmlzaWJsZSA9IDA7CisgICAgfQorICB9CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKGF0dCkKKyAgeyBzb2FwLT5kb20tPm5zdHIgPSBzb2FwX2N1cnJlbnRfbmFtZXNwYWNlKHNvYXAsIHNvYXAtPnRhZyk7CisgICAgZm9yIChhdHQgPSAmc29hcC0+ZG9tLT5hdHRzOyAqYXR0OyBhdHQgPSAmKCphdHQpLT5uZXh0KQorICAgICAgKCphdHQpLT5uc3RyID0gc29hcF9jdXJyZW50X25hbWVzcGFjZShzb2FwLCAoKmF0dCktPm5hbWUpOworICB9CisjZW5kaWYKKyAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIGlmICghKHNvYXAtPmJvZHkgPSAoYyAhPSAnLycpKSkKKyAgICBkbyBjID0gc29hcF9nZXQxKHNvYXApOworICAgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkKKyAgeyBpZiAoIXNvYXAtPmJvZHkgJiYgc29hcC0+ZG9tLT5wcm50KQorICAgICAgc29hcC0+ZG9tID0gc29hcC0+ZG9tLT5wcm50OworICB9CisjZW5kaWYKKyAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICB7IGlmICh0cC0+dmlzaWJsZSAmJiB0cC0+dmFsdWUpCisgICAgeyBpZiAoIXN0cmNtcCh0cC0+bmFtZSwgImlkIikpCisgICAgICB7ICpzb2FwLT5pZCA9ICcjJzsKKyAgICAgICAgc3RybmNweShzb2FwLT5pZCArIDEsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPmlkKSAtIDIpOworICAgICAgICBzb2FwLT5pZFtzaXplb2Yoc29hcC0+aWQpLTFdID0gJ1wwJzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAodHAtPm5hbWUsICJocmVmIikpCisgICAgICB7IHN0cm5jcHkoc29hcC0+aHJlZiwgdHAtPnZhbHVlLCBzaXplb2Yoc29hcC0+aHJlZikgLSAxKTsKKyAgICAgICAgc29hcC0+aHJlZltzaXplb2Yoc29hcC0+aHJlZiktMV0gPSAnXDAnOworICAgICAgfQorICAgICAgZWxzZSBpZiAoKHNvYXAtPnZlcnNpb24gPT0gMiB8fCAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0dSQVBIKSkgJiYgIXN0cmNtcCh0cC0+bmFtZSwgInJlZiIpKQorICAgICAgeyAqc29hcC0+aHJlZiA9ICcjJzsKKyAgICAgICAgc3RybmNweShzb2FwLT5ocmVmICsgMSwgdHAtPnZhbHVlLCBzaXplb2Yoc29hcC0+aHJlZikgLSAyKTsKKyAgICAgICAgc29hcC0+aHJlZltzaXplb2Yoc29hcC0+aHJlZiktMV0gPSAnXDAnOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAieHNpOnR5cGUiKSkKKyAgICAgIHsgc3RybmNweShzb2FwLT50eXBlLCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT50eXBlKSAtIDEpOworICAgICAgICBzb2FwLT50eXBlW3NpemVvZihzb2FwLT50eXBlKS0xXSA9ICdcMCc7CisgICAgICB9CisgICAgICBlbHNlIGlmIChzb2FwLT52ZXJzaW9uID09IDEgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTkM6YXJyYXlUeXBlIikpCisgICAgICB7IHMgPSBzb2FwX3N0cnJjaHIodHAtPnZhbHVlLCAnWycpOworICAgICAgICBpZiAocyAmJiAoc2l6ZV90KShzIC0gdHAtPnZhbHVlKSA8IHNpemVvZihzb2FwLT5hcnJheVR5cGUpKQorICAgICAgICB7IHN0cm5jcHkoc29hcC0+YXJyYXlUeXBlLCB0cC0+dmFsdWUsIHMgLSB0cC0+dmFsdWUpOworICAgICAgICAgIHNvYXAtPmFycmF5VHlwZVtzIC0gdHAtPnZhbHVlXSA9ICdcMCc7CisgICAgICAgICAgc3RybmNweShzb2FwLT5hcnJheVNpemUsIHMsIHNpemVvZihzb2FwLT5hcnJheVNpemUpIC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHN0cm5jcHkoc29hcC0+YXJyYXlUeXBlLCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT5hcnJheVR5cGUpIC0gMSk7CisgICAgICAgIHNvYXAtPmFycmF5U2l6ZVtzaXplb2Yoc29hcC0+YXJyYXlUeXBlKS0xXSA9ICdcMCc7CisgICAgICAgIHNvYXAtPmFycmF5VHlwZVtzaXplb2Yoc29hcC0+YXJyYXlUeXBlKS0xXSA9ICdcMCc7CisgICAgICB9CisgICAgICBlbHNlIGlmIChzb2FwLT52ZXJzaW9uID09IDIgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTkM6aXRlbVR5cGUiKSkKKyAgICAgICAgc3RybmNweShzb2FwLT5hcnJheVR5cGUsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPmFycmF5VHlwZSkgLSAxKTsKKyAgICAgIGVsc2UgaWYgKHNvYXAtPnZlcnNpb24gPT0gMiAmJiAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOQzphcnJheVNpemUiKSkKKyAgICAgICAgc3RybmNweShzb2FwLT5hcnJheVNpemUsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPmFycmF5U2l6ZSkgLSAxKTsKKyAgICAgIGVsc2UgaWYgKHNvYXAtPnZlcnNpb24gPT0gMSAmJiAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOQzpvZmZzZXQiKSkKKyAgICAgICAgc3RybmNweShzb2FwLT5hcnJheU9mZnNldCwgdHAtPnZhbHVlLCBzaXplb2Yoc29hcC0+YXJyYXlPZmZzZXQpKTsKKyAgICAgIGVsc2UgaWYgKHNvYXAtPnZlcnNpb24gPT0gMSAmJiAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOQzpwb3NpdGlvbiIpKQorICAgICAgICBzb2FwLT5wb3NpdGlvbiA9IHNvYXBfZ2V0cG9zaXRpb24odHAtPnZhbHVlLCBzb2FwLT5wb3NpdGlvbnMpOworICAgICAgZWxzZSBpZiAoc29hcC0+dmVyc2lvbiA9PSAxICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5DOnJvb3QiKSkKKyAgICAgICAgc29hcC0+cm9vdCA9ICgoIXN0cmNtcCh0cC0+dmFsdWUsICIxIikgfHwgIXN0cmNtcCh0cC0+dmFsdWUsICJ0cnVlIikpKTsKKyAgICAgIGVsc2UgaWYgKChzb2FwLT52ZXJzaW9uID09IDEgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTlY6YWN0b3IiKSkKKyAgICAgICAgICAgIHx8IChzb2FwLT52ZXJzaW9uID09IDIgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTlY6cm9sZSIpKSkKKyAgICAgIHsgaWYgKCghc29hcC0+YWN0b3IgfHwgc3RyY21wKHNvYXAtPmFjdG9yLCB0cC0+dmFsdWUpKQorICAgICAgICAgJiYgc3RyY21wKHRwLT52YWx1ZSwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvYWN0b3IvbmV4dCIpCisgICAgICAgICAmJiBzdHJjbXAodHAtPnZhbHVlLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlL3JvbGUvbmV4dCIpKQorICAgICAgICAgIHNvYXAtPm90aGVyID0gMTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5WOm11c3RVbmRlcnN0YW5kIikKKyAgICAgICAgICAgICYmICghc3RyY21wKHRwLT52YWx1ZSwgIjEiKSB8fCAhc3RyY21wKHRwLT52YWx1ZSwgInRydWUiKSkpCisgICAgICAgIHNvYXAtPm11c3RVbmRlcnN0YW5kID0gMTsKKyAgICAgIGVsc2UgaWYgKCghc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJ4c2k6bnVsbCIpCisgICAgICAgICAgICAgfHwgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAieHNpOm5pbCIpKQorICAgICAgICAgICAgJiYgKCFzdHJjbXAodHAtPnZhbHVlLCAiMSIpCisgICAgICAgICAgICAgfHwgIXN0cmNtcCh0cC0+dmFsdWUsICJ0cnVlIikpKQorICAgICAgICBzb2FwLT5udWxsID0gMTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfcmV0cnkoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgc29hcF9yZXZlcnQoc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3JldmVydChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKCFzb2FwLT5wZWVrZWQpCisgIHsgc29hcC0+cGVla2VkID0gMTsKKyAgICBpZiAoc29hcC0+Ym9keSkKKyAgICAgIHNvYXAtPmxldmVsLS07CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXZlcnRpbmcgbGFzdCBlbGVtZW50IChsZXZlbD0ldSlcbiIsIHNvYXAtPmxldmVsKSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc3RyaW5nX291dChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgaW50IGZsYWcpCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnQ7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBtYXNrID0gMHhGRkZGRkY4MFVMOworI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IHNvYXAtPmRvbS0+ZGF0YSA9IHNvYXBfc3RyZHVwKHNvYXAsIHMpOworICAgIHJldHVybiBTT0FQX09LOworICB9CisjZW5kaWYKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0NfVVRGU1RSSU5HKQorICAgIG1hc2sgPSAwOworICB0ID0gczsKKyAgd2hpbGUgKChjID0gKnQrKykpCisgIHsgc3dpdGNoIChjKQorICAgIHsgCisgICAgY2FzZSA5OgorICAgICAgaWYgKGZsYWcpCisgICAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiJiN4OTsiLCA1KSkKKwkgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgcyA9IHQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDEwOgorICAgICAgaWYgKGZsYWcgfHwgIShzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKSkKKyAgICAgIHsgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICImI3hBOyIsIDUpKQorCSAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBzID0gdDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTM6CisgICAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIiYjeEQ7IiwgNSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHMgPSB0OworICAgICAgYnJlYWs7CisgICAgY2FzZSAnJic6CisgICAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIiZhbXA7IiwgNSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHMgPSB0OworICAgICAgYnJlYWs7CisgICAgY2FzZSAnPCc6CisgICAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIiZsdDsiLCA0KSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgcyA9IHQ7CisgICAgICBicmVhazsKKyAgICBjYXNlICc+JzoKKyAgICAgIGlmICghZmxhZykKKyAgICAgIHsgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICImZ3Q7IiwgNCkpCisJICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHMgPSB0OworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnIic6CisgICAgICBpZiAoZmxhZykKKyAgICAgIHsgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICImcXVvdDsiLCA2KSkKKwkgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgcyA9IHQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmZGVmIEhBVkVfTUJUT1dDCisgICAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfQ19NQlNUUklORykKKyAgICAgIHsgd2NoYXJfdCB3YzsKKyAgICAgICAgcmVnaXN0ZXIgaW50IG0gPSBtYnRvd2MoJndjLCB0IC0gMSwgTUJfQ1VSX01BWCk7CisgICAgICAgIGlmIChtID4gMCAmJiB3YyAhPSBjKQorICAgICAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9wdXR1dGY4KHNvYXAsIHdjKSkKKyAgICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKwkgIHMgPSB0ICs9IG0gLSAxOworCSAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyNlbmRpZgorI2VuZGlmCisgICAgICBpZiAoYyAmIG1hc2spCisgICAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9wdXR1dGY4KHNvYXAsICh1bnNpZ25lZCBjaGFyKWMpKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgcyA9IHQ7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfc3RyaW5nX2luKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgZmxhZywgbG9uZyBtaW5sZW4sIGxvbmcgbWF4bGVuKQoreyByZWdpc3RlciBjaGFyICpzOworICBjaGFyICp0ID0gTlVMTDsKKyAgcmVnaXN0ZXIgc2l6ZV90IGk7CisgIHJlZ2lzdGVyIGxvbmcgbCA9IDA7CisgIHJlZ2lzdGVyIGludCBuID0gMDsKKyAgcmVnaXN0ZXIgaW50IG0gPSAwOworICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisjaWYgIWRlZmluZWQoV0lUSF9MRUFORVIpICYmIGRlZmluZWQoSEFWRV9XQ1RPTUIpCisgIGNoYXIgYnVmW01CX0xFTl9NQVggPiA4ID8gTUJfTEVOX01BWCA6IDhdOworI2Vsc2UKKyAgY2hhciBidWZbOF07CisjZW5kaWYKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlYWRpbmcgc3RyaW5nIGNvbnRlbnRcbiIpKTsKKyAgaWYgKHNvYXAtPnBlZWtlZCkKKyAgeyBpZiAoIXNvYXAtPmJvZHkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKnNvYXAtPnRhZykKKyAgICB7IG4gPSAxOworICAgICAgc29hcC0+cGVla2VkID0gMDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICB0ID0gc29hcC0+dG1wYnVmOworICAgICAgdFswXSA9ICc8JzsKKyAgICAgIHN0cm5jcHkodCArIDEsIHNvYXAtPnRhZywgc2l6ZW9mKHNvYXAtPnRtcGJ1ZikgLSAxKTsKKyAgICAgIHN0cm5jYXQodCwgIj4iLCBzaXplb2Yoc29hcC0+dG1wYnVmKSk7CisgICAgICBtID0gc3RybGVuKHNvYXAtPnRhZykgKyAyOworI2VuZGlmCisgICAgfQorICB9CisjaWZkZWYgV0lUSF9DREFUQQorICBpZiAoIWZsYWcpCisgIHsgcmVnaXN0ZXIgaW50IHN0YXRlID0gMDsKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgICBzb2FwLT5sYWJpZHggPSAwOwkJCS8qIHVzZSBsb29rLWFzaWRlIGJ1ZmZlciAqLworI2Vsc2UKKyAgICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICAgIGZvciAoOzspCisgICAgeyAKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgICAgIHJlZ2lzdGVyIHNpemVfdCBrOworICAgICAgaWYgKHNvYXBfYXBwZW5kX2xhYihzb2FwLCBOVUxMLCAwKSkJLyogYWxsb2NhdGUgbW9yZSBzcGFjZSBpbiBsb29rLWFzaWRlIGJ1ZmZlciBpZiBuZWNlc3NhcnkgKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICBzID0gc29hcC0+bGFiYnVmICsgc29hcC0+bGFiaWR4OwkvKiBzcGFjZSB0byBwb3B1bGF0ZSAqLworICAgICAgayA9IHNvYXAtPmxhYmxlbiAtIHNvYXAtPmxhYmlkeDsJLyogbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSAqLworICAgICAgc29hcC0+bGFiaWR4ID0gc29hcC0+bGFibGVuOwkvKiBjbGFpbSB0aGlzIHNwYWNlICovCisjZWxzZQorICAgICAgcmVnaXN0ZXIgc2l6ZV90IGsgPSBTT0FQX0JMS0xFTjsKKyAgICAgIGlmICghKHMgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIGspKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBrOyBpKyspCisgICAgICB7IGlmIChtID4gMCkKKyAgICAgICAgeyAqcysrID0gKnQrKzsJLyogY29weSBtdWx0aWJ5dGUgY2hhcmFjdGVycyAqLworCSAgbS0tOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisJaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIGlmIChjID49IDB4ODAgJiYgIShzb2FwLT5tb2RlICYgU09BUF9FTkNfTEFUSU4pKQorICAgICAgICB7IHNvYXBfdW5nZXQoc29hcCwgYyk7CisJICBjID0gc29hcF9nZXR1dGY4KHNvYXApOworCSAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0NfVVRGU1RSSU5HKQorICAgICAgICAgIHsgaWYgKChjICYgMHg4MDAwMDAwMCkgJiYgYyA+PSAtMHg3RkZGRkY4MCAmJiBjIDwgU09BUF9BUCkKKyAgICAgICAgICAgIHsgYyAmPSAweDdGRkZGRkZGOworICAgICAgICAgICAgICB0ID0gYnVmOworICAgICAgICAgICAgICBpZiAoYyA8IDB4MDgwMCkKKyAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4QzAgfCAoKGMgPj4gNikgJiAweDFGKSk7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeyBpZiAoYyA8IDB4MDEwMDAwKQorICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEUwIHwgKChjID4+IDEyKSAmIDB4MEYpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeyBpZiAoYyA8IDB4MjAwMDAwKQorICAgICAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjAgfCAoKGMgPj4gMTgpICYgMHgwNykpOworICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgeyBpZiAoYyA8IDB4MDQwMDAwMDApCisgICAgICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEY4IHwgKChjID4+IDI0KSAmIDB4MDMpKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7ICp0KysgPSAoY2hhcikoMHhGQyB8ICgoYyA+PiAzMCkgJiAweDAxKSk7CisgICAgICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDI0KSAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTgpICYgMHgzRikpOworICAgICAgICAgICAgICAgICAgfSAgICAgCisgICAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTIpICYgMHgzRikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gNikgJiAweDNGKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKGMgJiAweDNGKSk7CisJICAgICAgbSA9IChpbnQpKHQgLSBidWYpIC0gMTsKKyAgICAgICAgICAgICAgdCA9IGJ1ZjsKKyAgICAgICAgICAgICAgKnMrKyA9ICp0Kys7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworCSAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisJc3dpdGNoIChzdGF0ZSkKKyAgICAgICAgeyBjYXNlIDE6CisgICAgICAgICAgICBpZiAoYyA9PSAnXScpCisJICAgICAgc3RhdGUgPSA0OworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisJICBjYXNlIDI6CisJICAgIGlmIChjID09ICctJykKKyAgICAgICAgICAgICAgc3RhdGUgPSA2OworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisJICBjYXNlIDM6CisJICAgIGlmIChjID09ICc/JykKKwkgICAgICBzdGF0ZSA9IDg7CisJICAgICpzKysgPSBjOworCSAgICBjb250aW51ZTsKKyAgICAgICAgICAvKiBDREFUQSAqLworCSAgY2FzZSA0OgorCSAgICBpZiAoYyA9PSAnXScpCisgICAgICAgICAgICAgIHN0YXRlID0gNTsKKwkgICAgZWxzZQorCSAgICAgIHN0YXRlID0gMTsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworCSAgY2FzZSA1OgorCSAgICBpZiAoYyA9PSAnPicpCisJICAgICAgc3RhdGUgPSAwOworCSAgICBlbHNlCisJICAgICAgc3RhdGUgPSAxOworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisgICAgICAgICAgLyogY29tbWVudCAqLworICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIGlmIChjID09ICctJykKKwkgICAgICBzdGF0ZSA9IDc7CisJICAgIGVsc2UKKwkgICAgICBzdGF0ZSA9IDI7CisJICAgICpzKysgPSBjOworCSAgICBjb250aW51ZTsKKyAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICBpZiAoYyA9PSAnPicpCisJICAgICAgc3RhdGUgPSAwOworCSAgICBlbHNlCisJICAgICAgc3RhdGUgPSAyOworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisgICAgICAgICAgLyogUEkgKi8KKwkgIGNhc2UgODoKKyAgICAgICAgICAgIGlmIChjID09ICc+JykKKwkgICAgICBzdGF0ZSA9IDA7CisJICAgIGVsc2UKKwkgICAgICBzdGF0ZSA9IDM7CisJICAgICpzKysgPSBjOworCSAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGMpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAnLyc6CisgICAgICAgICAgaWYgKG4gPiAwKQorICAgICAgICAgIHsgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgICAgICAgICAgIGlmIChjID09ICc+JykKKyAgICAgICAgICAgICAgbi0tOworICAgICAgICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgICB9CisgICAgICAgICAgKnMrKyA9ICcvJzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnPCc6CisJICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworCSAgaWYgKGMgPT0gJy8nKQorCSAgeyBpZiAobiA9PSAwKQorCSAgICB7IGMgPSBTT0FQX1RUOworCSAgICAgIGdvdG8gZW5kOworCSAgICB9CisJICAgIG4tLTsKKwkgIH0KKwkgIGVsc2UgaWYgKGMgPT0gJyEnKQorCSAgeyBjID0gc29hcF9nZXRjaGFyKHNvYXApOworCSAgICBpZiAoYyA9PSAnWycpCisgICAgICAgICAgICB7IGRvIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgICAgICAgICAgICAgIHdoaWxlICgoaW50KWMgIT0gRU9GICYmIGMgIT0gJ1snKTsKKyAgICAgICAgICAgICAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworCSAgICAgIHQgPSAoY2hhciopIiFbQ0RBVEFbIjsKKwkgICAgICBtID0gODsKKwkgICAgICBzdGF0ZSA9IDE7CisJICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJy0nKQorCSAgICB7IGlmICgoYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKSkgPT0gJy0nKQorCSAgICAgICAgc3RhdGUgPSAyOworCSAgICAgIHQgPSAoY2hhciopIiEtIjsKKwkgICAgICBtID0gMjsKKwkgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeyB0ID0gKGNoYXIqKSIhIjsKKwkgICAgICBtID0gMTsKKwkgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworCSAgICB9CisJICAgICpzKysgPSAnPCc7CisJICAgIGJyZWFrOworCSAgfQorCSAgZWxzZSBpZiAoYyA9PSAnPycpCisJICAgIHN0YXRlID0gMzsKKwkgIGVsc2UKKwkgICAgbisrOworICAgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgICAgKnMrKyA9ICc8JzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnPic6CisgICAgICAgICAgKnMrKyA9ICc+JzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnIic6CisgICAgICAgICAgKnMrKyA9ICciJzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZmRlZiBIQVZFX1dDVE9NQgorICAgICAgICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9DX01CU1RSSU5HKQorICAgICAgICAgIHsgbSA9IHdjdG9tYihidWYsIGMgJiAweDdGRkZGRkZGKTsKKyAgICAgICAgICAgIGlmIChtID49IDEgJiYgbSA8PSAoaW50KU1CX0NVUl9NQVgpCisgICAgICAgICAgICB7IHQgPSBidWY7CisgICAgICAgICAgICAgICpzKysgPSAqdCsrOworICAgICAgICAgICAgICBtLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7ICpzKysgPSBTT0FQX1VOS05PV05fQ0hBUjsKKwkgICAgICBtID0gMDsKKwkgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisjZW5kaWYKKyNlbmRpZgorICAgICAgICAgICAgKnMrKyA9IChjaGFyKShjICYgMHhGRik7CisgICAgICAgIH0KKwlsKys7CisgICAgICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgbWF4bGVuID49IDAgJiYgbCA+IG1heGxlbikKKyAgICAgICAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiU3RyaW5nIHRvbyBsb25nOiBtYXhsZW49JWxkXG4iLCBtYXhsZW4pKTsKKyAgICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfTEVOR1RIOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgc29hcC0+bGFiaWR4ID0gMDsJCQkvKiB1c2UgbG9vay1hc2lkZSBidWZmZXIgKi8KKyNlbHNlCisgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICBmb3IgKDs7KQorICB7IAorI2lmZGVmIFdJVEhfRkFTVAorICAgIHJlZ2lzdGVyIHNpemVfdCBrOworICAgIGlmIChzb2FwX2FwcGVuZF9sYWIoc29hcCwgTlVMTCwgMCkpCS8qIGFsbG9jYXRlIG1vcmUgc3BhY2UgaW4gbG9vay1hc2lkZSBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBzID0gc29hcC0+bGFiYnVmICsgc29hcC0+bGFiaWR4OwkvKiBzcGFjZSB0byBwb3B1bGF0ZSAqLworICAgIGsgPSBzb2FwLT5sYWJsZW4gLSBzb2FwLT5sYWJpZHg7CS8qIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgKi8KKyAgICBzb2FwLT5sYWJpZHggPSBzb2FwLT5sYWJsZW47CS8qIGNsYWltIHRoaXMgc3BhY2UgKi8KKyNlbHNlCisgICAgcmVnaXN0ZXIgc2l6ZV90IGsgPSBTT0FQX0JMS0xFTjsKKyAgICBpZiAoIShzID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBrKSkpCisgICAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICAgIGZvciAoaSA9IDA7IGkgPCBrOyBpKyspCisgICAgeyBpZiAobSA+IDApCisgICAgICB7ICpzKysgPSAqdCsrOwkvKiBjb3B5IG11bHRpYnl0ZSBjaGFyYWN0ZXJzICovCisgICAgICAgIG0tLTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfQ19VVEZTVFJJTkcpCisgICAgICB7IGlmICgoKGMgPSBzb2FwX2dldChzb2FwKSkgJiAweDgwMDAwMDAwKSAmJiBjID49IC0weDdGRkZGRjgwICYmIGMgPCBTT0FQX0FQKQorICAgICAgICB7IGMgJj0gMHg3RkZGRkZGRjsKKyAgICAgICAgICB0ID0gYnVmOworICAgICAgICAgIGlmIChjIDwgMHgwODAwKQorICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEMwIHwgKChjID4+IDYpICYgMHgxRikpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7IGlmIChjIDwgMHgwMTAwMDApCisgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhFMCB8ICgoYyA+PiAxMikgJiAweDBGKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7IGlmIChjIDwgMHgyMDAwMDApCisgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEYwIHwgKChjID4+IDE4KSAmIDB4MDcpKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7IGlmIChjIDwgMHgwNDAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhGOCB8ICgoYyA+PiAyNCkgJiAweDAzKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsgKnQrKyA9IChjaGFyKSgweEZDIHwgKChjID4+IDMwKSAmIDB4MDEpKTsKKyAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAyNCkgJiAweDNGKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAxOCkgJiAweDNGKSk7CisgICAgICAgICAgICAgIH0gICAgIAorICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTIpICYgMHgzRikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDYpICYgMHgzRikpOworICAgICAgICAgIH0KKyAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoYyAmIDB4M0YpKTsKKwkgIG0gPSAoaW50KSh0IC0gYnVmKSAtIDE7CisgICAgICAgICAgdCA9IGJ1ZjsKKyAgICAgICAgICAqcysrID0gKnQrKzsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBjID0gc29hcF9nZXR1dGY4KHNvYXApOworICAgICAgc3dpdGNoIChjKQorICAgICAgeworICAgICAgY2FzZSBTT0FQX1RUOgorICAgICAgICBpZiAobiA9PSAwKQorICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICBuLS07CisgICAgICAgICpzKysgPSAnPCc7CisgICAgICAgIHQgPSAoY2hhciopIi8iOworCW0gPSAxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9MVDoKKyAgICAgICAgbisrOworICAgICAgICAqcysrID0gJzwnOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9HVDoKKyAgICAgICAgKnMrKyA9ICc+JzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfUVQ6CisgICAgICAgICpzKysgPSAnIic7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTT0FQX0FQOgorICAgICAgICAqcysrID0gJ1wnJzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICcvJzoKKyAgICAgICAgaWYgKG4gPiAwKQorICAgICAgICB7IGMgPSBzb2FwX2dldChzb2FwKTsKKyAgICAgICAgICBpZiAoYyA9PSBTT0FQX0dUKQorICAgICAgICAgICAgbi0tOworICAgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgIH0KKyAgICAgICAgKnMrKyA9ICcvJzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICc8JyB8IDB4ODAwMDAwMDA6CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICpzKysgPSAnPCc7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAqcysrID0gJyYnOworICAgICAgICAgIHQgPSAoY2hhciopImx0OyI7CisJICBtID0gMzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJz4nIHwgMHg4MDAwMDAwMDoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9ICc+JzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAnJic7CisgICAgICAgICAgdCA9IChjaGFyKikiZ3Q7IjsKKwkgIG0gPSAzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnJicgfCAweDgwMDAwMDAwOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gJyYnOworICAgICAgICBlbHNlCisgICAgICAgIHsgKnMrKyA9ICcmJzsKKyAgICAgICAgICB0ID0gKGNoYXIqKSJhbXA7IjsKKwkgIG0gPSA0OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnIicgfCAweDgwMDAwMDAwOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gJyInOworICAgICAgICBlbHNlCisgICAgICAgIHsgKnMrKyA9ICcmJzsKKyAgICAgICAgICB0ID0gKGNoYXIqKSJxdW90OyI7CisJICBtID0gNTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ1wnJyB8IDB4ODAwMDAwMDA6CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICpzKysgPSAnXCcnOworICAgICAgICBlbHNlCisgICAgICAgIHsgKnMrKyA9ICcmJzsKKyAgICAgICAgICB0ID0gKGNoYXIqKSJhcG9zOyI7CisJICBtID0gNTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICAgIGdvdG8gZW5kOworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmZGVmIEhBVkVfV0NUT01CCisgICAgICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9DX01CU1RSSU5HKQorICAgICAgICB7IG0gPSB3Y3RvbWIoYnVmLCBjICYgMHg3RkZGRkZGRik7CisgICAgICAgICAgaWYgKG0gPj0gMSAmJiBtIDw9IChpbnQpTUJfQ1VSX01BWCkKKyAgICAgICAgICB7IHQgPSBidWY7CisgICAgICAgICAgICAqcysrID0gKnQrKzsKKyAgICAgICAgICAgIG0tLTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsgKnMrKyA9IFNPQVBfVU5LTk9XTl9DSEFSOworCSAgICBtID0gMDsKKwkgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYKKyNlbmRpZgorICAgICAgICAgICpzKysgPSAoY2hhcikoYyAmIDB4RkYpOworICAgICAgfQorICAgICAgbCsrOworICAgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiBtYXhsZW4gPj0gMCAmJiBsID4gbWF4bGVuKQorICAgICAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiU3RyaW5nIHRvbyBsb25nOiBtYXhsZW49JWxkXG4iLCBtYXhsZW4pKTsKKyAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0xFTkdUSDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgfQorICB9CitlbmQ6CisgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICpzID0gJ1wwJzsKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgdCA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPmxhYmJ1Zik7CisjZWxzZQorICBzb2FwX3NpemVfYmxvY2soc29hcCwgaSsxKTsKKyAgdCA9IHNvYXBfc2F2ZV9ibG9jayhzb2FwLCBOVUxMLCAwKTsKKyNlbmRpZgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIGwgPCBtaW5sZW4pCisgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlN0cmluZyB0b28gc2hvcnQ6ICVsZCBjaGFycywgbWlubGVuPSVsZFxuIiwgbCwgbWlubGVuKSk7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0xFTkdUSDsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IGlmIChmbGFnID09IDMpCisgICAgICBzb2FwLT5kb20tPnRhaWwgPSB0OworICAgIGVsc2UKKyAgICAgIHNvYXAtPmRvbS0+ZGF0YSA9IHQ7CisgIH0KKyNlbmRpZgorICBpZiAoZmxhZyA9PSAyKQorICAgIGlmIChzb2FwX3MyUU5hbWUoc29hcCwgdCwgJnQpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiB0OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3dzdHJpbmdfb3V0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB3Y2hhcl90ICpzLCBpbnQgZmxhZykKK3sgY29uc3QgY2hhciAqdDsKKyAgY2hhciB0bXA7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyB3Y2hhcl90ICpyID0gKHdjaGFyX3QqKXM7CisgICAgaW50IG4gPSAxOworICAgIHdoaWxlICgqcisrKQorICAgICAgbisrOworICAgIHNvYXAtPmRvbS0+d2lkZSA9IHIgPSAod2NoYXJfdCopc29hcF9tYWxsb2Moc29hcCwgbiAqIHNpemVvZih3Y2hhcl90KSk7CisgICAgd2hpbGUgKG4tLSkKKyAgICAgICpyKysgPSAqcysrOworICAgIHJldHVybiBTT0FQX09LOworICB9CisjZW5kaWYKKyAgd2hpbGUgKChjID0gKnMrKykpCisgIHsgc3dpdGNoIChjKQorICAgIHsgCisgICAgY2FzZSA5OgorICAgICAgaWYgKGZsYWcpCisgICAgICAgIHQgPSAiJiN4OTsiOworICAgICAgZWxzZQorICAgICAgICB0ID0gIlx0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTA6CisgICAgICBpZiAoZmxhZyB8fCAhKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpKQorICAgICAgICB0ID0gIiYjeEE7IjsKKyAgICAgIGVsc2UKKyAgICAgICAgdCA9ICJcbiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEzOgorICAgICAgdCA9ICImI3hEOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICcmJzoKKyAgICAgIHQgPSAiJmFtcDsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnPCc6CisgICAgICB0ID0gIiZsdDsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnPic6CisgICAgICBpZiAoZmxhZykKKyAgICAgICAgdCA9ICI+IjsKKyAgICAgIGVsc2UKKwl0ID0gIiZndDsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnIic6CisgICAgICBpZiAoZmxhZykKKyAgICAgICAgdCA9ICImcXVvdDsiOworICAgICAgZWxzZQorICAgICAgICB0ID0gIlwiIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoYyA+IDAgJiYgYyA8IDB4ODApCisgICAgICB7IHRtcCA9IChjaGFyKWM7CisgICAgICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsICZ0bXAsIDEpKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHNvYXBfcHV0dXRmOChzb2FwLCAodW5zaWduZWQgbG9uZyljKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChzb2FwX3NlbmQoc29hcCwgdCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3djaGFyX3QgKgorU09BUF9GTUFDMgorc29hcF93c3RyaW5nX2luKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgZmxhZywgbG9uZyBtaW5sZW4sIGxvbmcgbWF4bGVuKQoreyB3Y2hhcl90ICpzOworICByZWdpc3RlciBpbnQgaSwgbiA9IDA7CisgIHJlZ2lzdGVyIGxvbmcgbCA9IDA7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgY29uc3QgY2hhciAqdCA9IE5VTEw7CisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWFkaW5nIHdpZGUgc3RyaW5nIGNvbnRlbnRcbiIpKTsKKyAgaWYgKHNvYXAtPnBlZWtlZCkKKyAgeyBpZiAoIXNvYXAtPmJvZHkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKnNvYXAtPnRhZykKKyAgICB7IG4gPSAxOworICAgICAgc29hcC0+cGVla2VkID0gMDsKKyAgICB9CisgIH0KKyAgaWYgKHNvYXBfbmV3X2Jsb2NrKHNvYXApKQorICAgIHJldHVybiBOVUxMOworICBmb3IgKDs7KQorICB7IGlmICghKHMgPSAod2NoYXJfdCopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIHNpemVvZih3Y2hhcl90KSpTT0FQX0JMS0xFTikpKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IFNPQVBfQkxLTEVOOyBpKyspCisgICAgeyBpZiAodCkKKyAgICAgIHsgKnMrKyA9ICh3Y2hhcl90KSp0Kys7CisgICAgICAgIGlmICghKnQpCisgICAgICAgICAgdCA9IE5VTEw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgYyA9IHNvYXBfZ2V0dXRmOChzb2FwKTsKKyAgICAgIHN3aXRjaCAoYykKKyAgICAgIHsKKyAgICAgIGNhc2UgU09BUF9UVDoKKyAgICAgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgbi0tOworICAgICAgICAqcysrID0gJzwnOworICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsICcvJyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTT0FQX0xUOgorICAgICAgICBuKys7CisgICAgICAgICpzKysgPSAnPCc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTT0FQX0dUOgorICAgICAgICAqcysrID0gJz4nOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9RVDoKKyAgICAgICAgKnMrKyA9ICciJzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfQVA6CisgICAgICAgICpzKysgPSAnXCcnOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJy8nOgorICAgICAgICBpZiAobiA+IDApCisgICAgICAgIHsgYyA9IHNvYXBfZ2V0dXRmOChzb2FwKTsKKyAgICAgICAgICBpZiAoYyA9PSBTT0FQX0dUKQorICAgICAgICAgICAgbi0tOworICAgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgIH0KKyAgICAgICAgKnMrKyA9ICcvJzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICc8JzoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9IChzb2FwX3djaGFyKSc8JzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAoc29hcF93Y2hhciknJic7CisgICAgICAgICAgdCA9ICJsdDsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnPic6CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICpzKysgPSAoc29hcF93Y2hhciknPic7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAqcysrID0gKHNvYXBfd2NoYXIpJyYnOworICAgICAgICAgIHQgPSAiZ3Q7IjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJyInOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gKHNvYXBfd2NoYXIpJyInOworICAgICAgICBlbHNlCisgICAgICAgIHsgKnMrKyA9IChzb2FwX3djaGFyKScmJzsKKyAgICAgICAgICB0ID0gInF1b3Q7IjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAqcysrID0gKHdjaGFyX3QpYyAmIDB4N0ZGRkZGRkY7CisgICAgICB9CisgICAgICBsKys7CisgICAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIG1heGxlbiA+PSAwICYmIGwgPiBtYXhsZW4pCisgICAgICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJTdHJpbmcgdG9vIGxvbmc6IG1heGxlbj0lbGRcbiIsIG1heGxlbikpOworICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfTEVOR1RIOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICB9CisgIH0KK2VuZDoKKyAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgKnMgPSAnXDAnOworICBzb2FwX3NpemVfYmxvY2soc29hcCwgc2l6ZW9mKHdjaGFyX3QpICogKGkgKyAxKSk7CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgbCA8IG1pbmxlbikKKyAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiU3RyaW5nIHRvbyBzaG9ydDogJWxkIGNoYXJzLCBtaW5sZW49JWxkXG4iLCBsLCBtaW5sZW4pKTsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfTEVOR1RIOworICAgIHJldHVybiBOVUxMOworICB9CisgIHMgPSAod2NoYXJfdCopc29hcF9zYXZlX2Jsb2NrKHNvYXAsIE5VTEwsIDApOworI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICAgIHNvYXAtPmRvbS0+d2lkZSA9IHM7CisjZW5kaWYKKyAgcmV0dXJuIHM7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2ludDJzKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbikKK3sgcmV0dXJuIHNvYXBfbG9uZzJzKHNvYXAsIChsb25nKW4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dGludChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGludCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9sb25nMnMoc29hcCwgKGxvbmcpKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MyaW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBpbnQgKnApCit7IGlmIChzKQorICB7IGNoYXIgKnI7CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBzb2FwX3Jlc2V0X2Vycm5vOworI2VuZGlmCisjZW5kaWYKKyAgICAqcCA9IChpbnQpc29hcF9zdHJ0b2wocywgJnIsIDEwKTsKKyAgICBpZiAoKHMgPT0gciAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpIHx8ICpyCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgfHwgc29hcF9lcnJubyA9PSBTT0FQX0VSQU5HRQorI2VuZGlmCisjZW5kaWYKKyAgICApCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQgKgorU09BUF9GTUFDMgorc29hcF9pbmludChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6Ynl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9IChpbnQqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihpbnQpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAoaW50Kilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKGludCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MyaW50KHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2xvbmcycyhzdHJ1Y3Qgc29hcCAqc29hcCwgbG9uZyBuKQoreyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIiVsZCIsIG4pOworICByZXR1cm4gc29hcC0+dG1wYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dGxvbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBsb25nICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX2xvbmcycyhzb2FwLCAqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJsb25nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBsb25nICpwKQoreyBpZiAocykKKyAgeyBjaGFyICpyOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgc29hcF9yZXNldF9lcnJubzsKKyNlbmRpZgorI2VuZGlmCisgICAgKnAgPSBzb2FwX3N0cnRvbChzLCAmciwgMTApOworICAgIGlmICgocyA9PSByICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkgfHwgKnIKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICB8fCBzb2FwX2Vycm5vID09IFNPQVBfRVJBTkdFCisjZW5kaWYKKyNlbmRpZgorICAgICkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2xvbmcgKgorU09BUF9GTUFDMgorc29hcF9pbmxvbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgbG9uZyAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6aW50IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6c2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpieXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKGxvbmcqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihsb25nKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKGxvbmcqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YobG9uZyksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MybG9uZyhzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9MT05HNjQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgTE9ORzY0IG4pCit7IHNwcmludGYoc29hcC0+dG1wYnVmLCBTT0FQX0xPTkdfRk9STUFULCBuKTsKKyAgcmV0dXJuIHNvYXAtPnRtcGJ1ZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRMT05HNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBMT05HNjQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfTE9ORzY0MnMoc29hcCwgKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MyTE9ORzY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBMT05HNjQgKnApCit7IGlmIChzKQorICB7CisjaWZkZWYgSEFWRV9TVFJUT0xMCisgICAgY2hhciAqcjsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgIHNvYXBfcmVzZXRfZXJybm87CisjZW5kaWYKKyNlbmRpZgorICAgICpwID0gc3RydG9sbChzLCAmciwgMTApOworICAgIGlmICgocyA9PSByICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkgfHwgKnIKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgIHx8IHNvYXBfZXJybm8gPT0gU09BUF9FUkFOR0UKKyNlbmRpZgorI2VuZGlmCisgICAgICApCisjZWxzZQorIyBpZmRlZiBIQVZFX1NTQ0FORgorICAgIGlmIChzc2NhbmYocywgU09BUF9MT05HX0ZPUk1BVCwgcCkgIT0gMSkKKyMgZW5kaWYKKyNlbmRpZgorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorTE9ORzY0ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5MT05HNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgTE9ORzY0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjppbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6cG9zaXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bmVnYXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bm9uUG9zaXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bm9uTmVnYXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bG9uZyIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6Ynl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9IChMT05HNjQqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihMT05HNjQpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAoTE9ORzY0Kilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKExPTkc2NCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MyTE9ORzY0KHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2J5dGUycyhzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciBuKQoreyByZXR1cm4gc29hcF9sb25nMnMoc29hcCwgKGxvbmcpbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0Ynl0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfbG9uZzJzKHNvYXAsIChsb25nKSpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMmJ5dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGNoYXIgKnApCit7IGlmIChzKQorICB7IGxvbmcgbjsKKyAgICBjaGFyICpyOworICAgIG4gPSBzb2FwX3N0cnRvbChzLCAmciwgMTApOworICAgIGlmIChzID09IHIgfHwgKnIgfHwgbiA8IC0xMjggfHwgbiA+IDEyNykKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgICpwID0gKGNoYXIpbjsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5ieXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGNoYXIgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAoY2hhciopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKGNoYXIpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAoY2hhciopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihjaGFyKSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJieXRlKHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3Nob3J0MnMoc3RydWN0IHNvYXAgKnNvYXAsIHNob3J0IG4pCit7IHJldHVybiBzb2FwX2xvbmcycyhzb2FwLCAobG9uZyluKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRzaG9ydChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHNob3J0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX2xvbmcycyhzb2FwLCAobG9uZykqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJzaG9ydChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgc2hvcnQgKnApCit7IGlmIChzKQorICB7IGxvbmcgbjsKKyAgICBjaGFyICpyOworICAgIG4gPSBzb2FwX3N0cnRvbChzLCAmciwgMTApOworICAgIGlmIChzID09IHIgfHwgKnIgfHwgbiA8IC0zMjc2OCB8fCBuID4gMzI3NjcpCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICAqcCA9IChzaG9ydCluOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3Nob3J0ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5zaG9ydChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzaG9ydCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6c2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpieXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKHNob3J0Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2Yoc2hvcnQpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAoc2hvcnQqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2Yoc2hvcnQpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMnNob3J0KHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2Zsb2F0MnMoc3RydWN0IHNvYXAgKnNvYXAsIGZsb2F0IG4pCit7IGNvbnN0IGNoYXIgKnM7CisgIGlmIChzb2FwX2lzbmFuKChkb3VibGUpbikpCisgICAgcyA9ICJOYU4iOworICBlbHNlIGlmIChzb2FwX2lzcGluZmYobikpCisgICAgcyA9ICJJTkYiOworICBlbHNlIGlmIChzb2FwX2lzbmluZmYobikpCisgICAgcyA9ICItSU5GIjsKKyAgZWxzZQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCBzb2FwLT5mbG9hdF9mb3JtYXQsIG4pOworICAgIHMgPSBzb2FwLT50bXBidWY7CisgIH0KKyAgcmV0dXJuIHM7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0ZmxvYXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBmbG9hdCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9mbG9hdDJzKHNvYXAsICpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMmZsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBmbG9hdCAqcCkKK3sgaWYgKHMpCisgIHsgaWYgKCEqcykKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBpZiAoIXNvYXBfdGFnX2NtcChzLCAiSU5GIikpCisgICAgICAqcCA9IEZMVF9QSU5GVFk7CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChzLCAiK0lORiIpKQorICAgICAgKnAgPSBGTFRfUElORlRZOworICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAocywgIi1JTkYiKSkKKyAgICAgICpwID0gRkxUX05JTkZUWTsKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHMsICJOYU4iKSkKKyAgICAgICpwID0gRkxUX05BTjsKKyAgICBlbHNlCisgICAgeworLyogT24gc29tZSBzeXN0ZW1zLCBzdHJ0b2YgYXBwZWFycyB0byBiZSBicm9rZW4gb3IgZG9lc24ndCBsaW5rOiB1c2Ugd2l0aCBjYXV0aW9uICovCisjaWYgZGVmaW5lZChIQVZFX1NUUlRPRikKKyAgICAgIGNoYXIgKnI7CisgICAgICAqcCA9IHN0cnRvZigoY2hhciopcywgJnIpOworICAgICAgaWYgKCpyKQorI2VsaWYgZGVmaW5lZChIQVZFX1NUUlRPRCkKKyAgICAgIGNoYXIgKnI7CisgICAgICAqcCA9IChmbG9hdClzdHJ0b2QocywgJnIpOworICAgICAgaWYgKCpyKQorI2VuZGlmCisjaWZkZWYgSEFWRV9TU0NBTkYKKyAgICAgICAgaWYgKHNzY2FuZihzLCAiJWciLCBwKSAhPSAxKQorICAgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworI2Vsc2UKKyAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisjZW5kaWYKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIGludCBzb2FwX2lzbnVtZXJpYyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdHlwZSkKK3sgaWYgKHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmZsb2F0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6ZG91YmxlIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6ZGVjaW1hbCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpwb3NpdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpuZWdhdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpub25Qb3NpdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpub25OZWdhdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpsb25nIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6aW50IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6c2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpieXRlIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRMb25nIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRJbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZFNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRCeXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIFNPQVBfRVJSOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorZmxvYXQgKgorU09BUF9GTUFDMgorc29hcF9pbmZsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGZsb2F0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlICE9ICdcMCcgJiYgc29hcF9pc251bWVyaWMoc29hcCwgdHlwZSkpCisgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgcCA9IChmbG9hdCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKGZsb2F0KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKGZsb2F0Kilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKGZsb2F0KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJmbG9hdChzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9kb3VibGUycyhzdHJ1Y3Qgc29hcCAqc29hcCwgZG91YmxlIG4pCit7IGNvbnN0IGNoYXIgKnM7CisgIGlmIChzb2FwX2lzbmFuKG4pKQorICAgIHMgPSAiTmFOIjsKKyAgZWxzZSBpZiAoc29hcF9pc3BpbmZkKG4pKQorICAgIHMgPSAiSU5GIjsKKyAgZWxzZSBpZiAoc29hcF9pc25pbmZkKG4pKQorICAgIHMgPSAiLUlORiI7CisgIGVsc2UKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1Ziwgc29hcC0+ZG91YmxlX2Zvcm1hdCwgbik7CisgICAgcyA9IHNvYXAtPnRtcGJ1ZjsKKyAgfQorICByZXR1cm4gczsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRkb3VibGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBkb3VibGUgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfZG91YmxlMnMoc29hcCwgKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MyZG91YmxlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBkb3VibGUgKnApCit7IGlmIChzKQorICB7IGlmICghKnMpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgaWYgKCFzb2FwX3RhZ19jbXAocywgIklORiIpKQorICAgICAgKnAgPSBEQkxfUElORlRZOworICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAocywgIitJTkYiKSkKKyAgICAgICpwID0gREJMX1BJTkZUWTsKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHMsICItSU5GIikpCisgICAgICAqcCA9IERCTF9OSU5GVFk7CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChzLCAiTmFOIikpCisgICAgICAqcCA9IERCTF9OQU47CisgICAgZWxzZQorICAgIHsKKyNpZmRlZiBIQVZFX1NUUlRPRAorICAgICAgY2hhciAqcjsKKyAgICAgICpwID0gc3RydG9kKHMsICZyKTsKKyAgICAgIGlmICgqcikKKyNlbmRpZgorI2lmZGVmIEhBVkVfU1NDQU5GCisgICAgICAgIGlmIChzc2NhbmYocywgIiVsZyIsIHApICE9IDEpCisgICAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisjZWxzZQorICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyNlbmRpZgorICAgIH0KKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitkb3VibGUgKgorU09BUF9GTUFDMgorc29hcF9pbmRvdWJsZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBkb3VibGUgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUgIT0gJ1wwJyAmJiBzb2FwX2lzbnVtZXJpYyhzb2FwLCB0eXBlKSkKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICBwID0gKGRvdWJsZSopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKGRvdWJsZSksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChkb3VibGUqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YoZG91YmxlKSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJkb3VibGUoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfdW5zaWduZWRCeXRlMnMoc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIGNoYXIgbikKK3sgcmV0dXJuIHNvYXBfdW5zaWduZWRMb25nMnMoc29hcCwgKHVuc2lnbmVkIGxvbmcpbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0dW5zaWduZWRCeXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgdW5zaWduZWQgY2hhciAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF91bnNpZ25lZExvbmcycyhzb2FwLCAodW5zaWduZWQgbG9uZykqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJ1bnNpZ25lZEJ5dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGNoYXIgKnApCit7IGlmIChzKQorICB7IHVuc2lnbmVkIGxvbmcgbjsKKyAgICBjaGFyICpyOworICAgIG4gPSBzb2FwX3N0cnRvdWwocywgJnIsIDEwKTsKKyAgICBpZiAocyA9PSByIHx8ICpyIHx8IG4gPiAyNTUpCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICAqcCA9ICh1bnNpZ25lZCBjaGFyKW47CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordW5zaWduZWQgY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX2ludW5zaWduZWRCeXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIGNoYXIgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkQnl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9ICh1bnNpZ25lZCBjaGFyKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YodW5zaWduZWQgY2hhciksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9ICh1bnNpZ25lZCBjaGFyKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMnVuc2lnbmVkQnl0ZShzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF91bnNpZ25lZFNob3J0MnMoc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIHNob3J0IG4pCit7IHJldHVybiBzb2FwX3Vuc2lnbmVkTG9uZzJzKHNvYXAsICh1bnNpZ25lZCBsb25nKW4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHVuc2lnbmVkU2hvcnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCB1bnNpZ25lZCBzaG9ydCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF91bnNpZ25lZExvbmcycyhzb2FwLCAodW5zaWduZWQgbG9uZykqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJ1bnNpZ25lZFNob3J0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBzaG9ydCAqcCkKK3sgaWYgKHMpCisgIHsgdW5zaWduZWQgbG9uZyBuOworICAgIGNoYXIgKnI7CisgICAgbiA9IHNvYXBfc3RydG91bChzLCAmciwgMTApOworICAgIGlmIChzID09IHIgfHwgKnIgfHwgbiA+IDY1NTM1KQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgKnAgPSAodW5zaWduZWQgc2hvcnQpbjsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit1bnNpZ25lZCBzaG9ydCAqCitTT0FQX0ZNQUMyCitzb2FwX2ludW5zaWduZWRTaG9ydChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB1bnNpZ25lZCBzaG9ydCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRTaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkQnl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9ICh1bnNpZ25lZCBzaG9ydCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKHVuc2lnbmVkIHNob3J0Kilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJ1bnNpZ25lZFNob3J0KHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3Vuc2lnbmVkSW50MnMoc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIGludCBuKQoreyByZXR1cm4gc29hcF91bnNpZ25lZExvbmcycyhzb2FwLCAodW5zaWduZWQgbG9uZyluKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXR1bnNpZ25lZEludChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIGludCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF91bnNpZ25lZExvbmcycyhzb2FwLCAodW5zaWduZWQgbG9uZykqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJ1bnNpZ25lZEludChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50ICpwKQoreyBpZiAocykKKyAgeyBjaGFyICpyOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgc29hcF9yZXNldF9lcnJubzsKKyNlbmRpZgorI2VuZGlmCisgICAgKnAgPSAodW5zaWduZWQgaW50KXNvYXBfc3RydG91bChzLCAmciwgMTApOworICAgIGlmICgocyA9PSByICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkgfHwgKnIKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICB8fCBzb2FwX2Vycm5vID09IFNPQVBfRVJBTkdFCisjZW5kaWYKKyNlbmRpZgorICAgICkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3Vuc2lnbmVkIGludCAqCitTT0FQX0ZNQUMyCitzb2FwX2ludW5zaWduZWRJbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgdW5zaWduZWQgaW50ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkU2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAodW5zaWduZWQgaW50Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YodW5zaWduZWQgaW50KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKHVuc2lnbmVkIGludCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZih1bnNpZ25lZCBpbnQpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMnVuc2lnbmVkSW50KHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3Vuc2lnbmVkTG9uZzJzKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBsb25nIG4pCit7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiJWx1Iiwgbik7CisgIHJldHVybiBzb2FwLT50bXBidWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0dW5zaWduZWRMb25nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgdW5zaWduZWQgbG9uZyAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF91bnNpZ25lZExvbmcycyhzb2FwLCAqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJ1bnNpZ25lZExvbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGxvbmcgKnApCit7IGlmIChzKQorICB7IGNoYXIgKnI7CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBzb2FwX3Jlc2V0X2Vycm5vOworI2VuZGlmCisjZW5kaWYKKyAgICAqcCA9IHNvYXBfc3RydG91bChzLCAmciwgMTApOworICAgIGlmICgocyA9PSByICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkgfHwgKnIKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICB8fCBzb2FwX2Vycm5vID09IFNPQVBfRVJBTkdFCisjZW5kaWYKKyNlbmRpZgorICAgICkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3Vuc2lnbmVkIGxvbmcgKgorU09BUF9GTUFDMgorc29hcF9pbnVuc2lnbmVkTG9uZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB1bnNpZ25lZCBsb25nICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkU2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAodW5zaWduZWQgbG9uZyopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAodW5zaWduZWQgbG9uZyopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZih1bnNpZ25lZCBsb25nKSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJ1bnNpZ25lZExvbmcoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfVUxPTkc2NDJzKHN0cnVjdCBzb2FwICpzb2FwLCBVTE9ORzY0IG4pCit7IHNwcmludGYoc29hcC0+dG1wYnVmLCBTT0FQX1VMT05HX0ZPUk1BVCwgbik7CisgIHJldHVybiBzb2FwLT50bXBidWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0VUxPTkc2NChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IFVMT05HNjQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfVUxPTkc2NDJzKHNvYXAsICpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMlVMT05HNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIFVMT05HNjQgKnApCit7IGlmIChzKQorICB7CisjaWZkZWYgSEFWRV9TVFJUT1VMTAorICAgIGNoYXIgKnI7CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBzb2FwX3Jlc2V0X2Vycm5vOworI2VuZGlmCisjZW5kaWYKKyAgICAqcCA9IHN0cnRvdWxsKHMsICZyLCAxMCk7CisgICAgaWYgKChzID09IHIgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKSB8fCAqcgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICAgfHwgc29hcF9lcnJubyA9PSBTT0FQX0VSQU5HRQorI2VuZGlmCisjZW5kaWYKKyAgICAgICkKKyNlbHNlCisjIGlmZGVmIEhBVkVfU1NDQU5GCisgICAgaWYgKHNzY2FuZihzLCBTT0FQX1VMT05HX0ZPUk1BVCwgcCkgIT0gMSkKKyMgZW5kaWYKKyNlbmRpZgorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorVUxPTkc2NCAqCitTT0FQX0ZNQUMyCitzb2FwX2luVUxPTkc2NChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBVTE9ORzY0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnBvc2l0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOm5vbk5lZ2F0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkTG9uZyIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkSW50IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRTaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkQnl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisgIHAgPSAoVUxPTkc2NCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKFVMT05HNjQpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAoVUxPTkc2NCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihVTE9ORzY0KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJVTE9ORzY0KHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMnN0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgY2hhciAqKnQpCit7ICp0ID0gTlVMTDsKKyAgaWYgKHMpCisgIHsgaWYgKCEoKnQgPSBzb2FwX3N0cmR1cChzb2FwLCBzKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICBpZiAoIShzb2FwLT5tb2RlICYgKFNPQVBfRU5DX0xBVElOIHwgU09BUF9DX1VURlNUUklORykpKQorICAgIHsgLyogVE9ETzogY29uc2lkZXIgdHJ1bmNhdGluZyBVVEY4IHRvIEFTQ0lJIGZvciByZWd1bGFyIFhNTCBhdHRyaWJ1dGUgc3RyaW5ncz8gKi8KKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MyUU5hbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGNoYXIgKip0KQoreyBpZiAocykKKyAgeyBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnA7CisgICAgY29uc3QgY2hhciAqcDsKKyAgICBpZiAoIXN0cm5jbXAocywgInhtbDoiLCA0KSkKKyAgICB7ICp0ID0gc29hcF9zdHJkdXAoc29hcCwgcyk7CisgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICB9CisgICAgbnAgPSBzb2FwLT5ubGlzdDsKKyAgICBwID0gc3RyY2hyKHMsICc6Jyk7CisgICAgaWYgKHApCisgICAgeyByZWdpc3RlciBpbnQgbiA9IHAgLSBzOworICAgICAgd2hpbGUgKG5wICYmIChzdHJuY21wKG5wLT5pZCwgcywgbikgfHwgbnAtPmlkW25dKSkKKyAgICAgICAgbnAgPSBucC0+bmV4dDsKKyAgICAgIHArKzsKKyAgICB9CisgICAgZWxzZQorICAgIHsgd2hpbGUgKG5wICYmICpucC0+aWQpCisgICAgICAgIG5wID0gbnAtPm5leHQ7CisgICAgICBwID0gczsKKyAgICB9CisgICAgaWYgKG5wKQorICAgIHsgaWYgKG5wLT5pbmRleCA+PSAwICYmIHNvYXAtPmxvY2FsX25hbWVzcGFjZXMpCisgICAgICB7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnEgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW25wLT5pbmRleF0uaWQ7CisgICAgICAgIGlmIChxKQorICAgICAgICB7IGlmICgoKnQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc3RybGVuKHApICsgc3RybGVuKHEpICsgMikpKQorICAgICAgICAgICAgc3ByaW50ZigqdCwgIiVzOiVzIiwgcSwgcCk7CisgICAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChucC0+bnMpCisgICAgICB7IGlmICgoKnQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc3RybGVuKHApICsgc3RybGVuKG5wLT5ucykgKyA0KSkpCisgICAgICAgICAgc3ByaW50ZigqdCwgIlwiJXNcIjolcyIsIG5wLT5ucywgcCk7CisgICAgICAgIHJldHVybiBTT0FQX09LOworICAgICAgfQorICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJOYW1lc3BhY2UgcHJlZml4IG9mICclcycgbm90IGRlZmluZWQgKGluZGV4PSVkLCBVUkk9JXMpXG4iLCBzLCBucC0+aW5kZXgsIG5wLT5ucz9ucC0+bnM6IiIpKTsKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTkFNRVNQQUNFOyAKKyAgICB9CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJOYW1lc3BhY2UgcHJlZml4IG9mICclcycgbm90IGRlZmluZWQsIGFzc3VtaW5nIGVtcHR5IG5hbWVzcGFjZVxuIiwgcykpOworICAgIGlmICgoKnQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc3RybGVuKHApICsgNCkpKQorICAgICAgc3ByaW50ZigqdCwgIlwiXCI6JXMiLCBwKTsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9RTmFtZTJzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzKQoreyBzdHJ1Y3QgTmFtZXNwYWNlICpwOworICBjaGFyICp0OworICBpbnQgbjsKKyAgaWYgKCFzIHx8ICpzICE9ICciJykKKyAgeworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBpZiAocyAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkpCisgICAgeyB0ID0gKGNoYXIqKXN0cmNocihzLCAnOicpOworICAgICAgaWYgKHQpCisgICAgICAgIHNvYXBfdXRpbGl6ZV9ucyhzb2FwLCBzLCB0IC0gcyk7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIHM7CisgIH0KKyAgcysrOworICBpZiAoKHAgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzKSkKKyAgeyBmb3IgKDsgcC0+aWQ7IHArKykKKyAgICB7IGlmIChwLT5ucykKKyAgICAgICAgaWYgKCFzb2FwX3RhZ19jbXAocywgcC0+bnMpKQorICAgICAgICAgIGJyZWFrOworICAgICAgaWYgKHAtPmluKQorICAgICAgICBpZiAoIXNvYXBfdGFnX2NtcChzLCBwLT5pbikpCisgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChwICYmIHAtPmlkKQorICAgIHsgcyA9IHN0cmNocihzLCAnIicpOworICAgICAgaWYgKHMpCisgICAgICB7IHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc3RybGVuKHAtPmlkKSArIHN0cmxlbihzKSk7CisgICAgICAgIHN0cmNweSh0LCBwLT5pZCk7CisJc3RyY2F0KHQsIHMgKyAxKTsKKyAgICAgICAgcmV0dXJuIHQ7CisgICAgICB9CisgICAgfQorICB9CisgIHQgPSAoY2hhciopc3RyY2hyKHMsICciJyk7CisgIGlmICh0KQorICAgIG4gPSB0IC0gczsKKyAgZWxzZQorICAgIG4gPSAwOworICB0ID0gc29hcF9zdHJkdXAoc29hcCwgcyk7CisgIHRbbl0gPSAnXDAnOworICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgInhtbG5zOl8lZCIsIHNvYXAtPmlkbnVtKyspOworICBzb2FwX3NldF9hdHRyKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgdCk7CisgIHMgPSBzdHJjaHIocywgJyInKTsKKyAgaWYgKHMpCisgIHsgdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzdHJsZW4oc29hcC0+dG1wYnVmKSArIHN0cmxlbihzKSAtIDYpOworICAgIHN0cmNweSh0LCBzb2FwLT50bXBidWYgKyA2KTsKKyAgICBzdHJjYXQodCwgcyArIDEpOworICB9CisgIHJldHVybiB0OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3Myd2NoYXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHdjaGFyX3QgKip0KQoreyB3Y2hhcl90ICpyOworICBpZiAoIXMpCisgICAgKnQgPSBOVUxMOworICBlbHNlCisgIHsgKnQgPSByID0gKHdjaGFyX3QqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZih3Y2hhcl90KSAqIChzdHJsZW4ocykgKyAxKSk7CisgICAgaWYgKCFyKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTEFUSU4pCisgICAgeyB3aGlsZSAoKnMpCisgICAgICAgICpyKysgPSAod2NoYXJfdCkqcysrOworICAgIH0KKyAgICBlbHNlCisgICAgeyAvKiBDb252ZXJ0IFVURjggdG8gd2NoYXIgKi8KKyAgICAgIHdoaWxlICgqcykKKyAgICAgIHsgcmVnaXN0ZXIgc29hcF93Y2hhciBjLCBjMSwgYzIsIGMzLCBjNDsKKyAgICAgICAgYyA9ICpzKys7CisgICAgICAgIGlmIChjIDwgMHg4MCkKKwkgICpyKysgPSAod2NoYXJfdCljOworCWVsc2UKKyAgICAgICAgeyBjMSA9IChzb2FwX3djaGFyKSpzKysgJiAweDNGOworICAgICAgICAgIGlmIChjIDwgMHhFMCkKKyAgICAgICAgICAgICpyKysgPSAod2NoYXJfdCkoKChzb2FwX3djaGFyKShjICYgMHgxRikgPDwgNikgfCBjMSk7CisgICAgICAgICAgZWxzZQorCSAgeyBjMiA9IChzb2FwX3djaGFyKSpzKysgJiAweDNGOworICAgICAgICAgICAgaWYgKGMgPCAweEYwKQorICAgICAgICAgICAgICAqcisrID0gKHdjaGFyX3QpKCgoc29hcF93Y2hhcikoYyAmIDB4MEYpIDw8IDEyKSB8IChjMSA8PCA2KSB8IGMyKTsKKyAgICAgICAgICAgIGVsc2UKKwkgICAgeyBjMyA9IChzb2FwX3djaGFyKSpzKysgJiAweDNGOworICAgICAgICAgICAgICBpZiAoYyA8IDB4RjgpCisgICAgICAgICAgICAgICAgKnIrKyA9ICh3Y2hhcl90KSgoKHNvYXBfd2NoYXIpKGMgJiAweDA3KSA8PCAxOCkgfCAoYzEgPDwgMTIpIHwgKGMyIDw8IDYpIHwgYzMpOworICAgICAgICAgICAgICBlbHNlCisJICAgICAgeyBjNCA9IChzb2FwX3djaGFyKSpzKysgJiAweDNGOworICAgICAgICAgICAgICAgIGlmIChjIDwgMHhGQykKKyAgICAgICAgICAgICAgICAgICpyKysgPSAod2NoYXJfdCkoKChzb2FwX3djaGFyKShjICYgMHgwMykgPDwgMjQpIHwgKGMxIDw8IDE4KSB8IChjMiA8PCAxMikgfCAoYzMgPDwgNikgfCBjNCk7CisgICAgICAgICAgICAgICAgZWxzZQorCQkgICpyKysgPSAod2NoYXJfdCkoKChzb2FwX3djaGFyKShjICYgMHgwMSkgPDwgMzApIHwgKGMxIDw8IDI0KSB8IChjMiA8PCAxOCkgfCAoYzMgPDwgMTIpIHwgKGM0IDw8IDYpIHwgKHNvYXBfd2NoYXIpKCpzKysgJiAweDNGKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgKnIgPSBMJ1wwJzsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3djaGFyMnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHdjaGFyX3QgKnMpCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgcmVnaXN0ZXIgY2hhciAqciwgKnQ7CisgIGNvbnN0IHdjaGFyX3QgKnEgPSBzOworICBzaXplX3QgbiA9IDA7CisgIHdoaWxlICgoYyA9ICpxKyspKQorICB7IGlmIChjID4gMCAmJiBjIDwgMHg4MCkKKyAgICAgIG4rKzsKKyAgICBlbHNlCisgICAgICBuICs9IDY7CisgIH0KKyAgciA9IHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgbiArIDEpOworICBpZiAocikKKyAgeyAvKiBDb252ZXJ0IHdjaGFyIHRvIFVURjggKi8KKyAgICB3aGlsZSAoKGMgPSAqcysrKSkKKyAgICB7IGlmIChjID4gMCAmJiBjIDwgMHg4MCkKKyAgICAgICAgKnQrKyA9IChjaGFyKWM7CisgICAgICBlbHNlCisgICAgICB7IGlmIChjIDwgMHgwODAwKQorICAgICAgICAgICp0KysgPSAoY2hhcikoMHhDMCB8ICgoYyA+PiA2KSAmIDB4MUYpKTsKKyAgICAgICAgZWxzZQorICAgICAgICB7IGlmIChjIDwgMHgwMTAwMDApCisgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RTAgfCAoKGMgPj4gMTIpICYgMHgwRikpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7IGlmIChjIDwgMHgyMDAwMDApCisgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhGMCB8ICgoYyA+PiAxOCkgJiAweDA3KSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7IGlmIChjIDwgMHgwNDAwMDAwMCkKKyAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjggfCAoKGMgPj4gMjQpICYgMHgwMykpOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsgKnQrKyA9IChjaGFyKSgweEZDIHwgKChjID4+IDMwKSAmIDB4MDEpKTsKKyAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMjQpICYgMHgzRikpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAxOCkgJiAweDNGKSk7CisgICAgICAgICAgICB9ICAgICAKKyAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAxMikgJiAweDNGKSk7CisgICAgICAgICAgfQorICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpKTsKKyAgICAgICAgfQorICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoYyAmIDB4M0YpKTsKKyAgICAgIH0KKyAgICB9CisgICAgKnQgPSAnXDAnOworICB9CisgIHJldHVybiByOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHN0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNoYXIgKmNvbnN0KnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKSAKK3sgaWQgPSBzb2FwX2VsZW1lbnRfaWQoc29hcCwgdGFnLCBpZCwgKnAsIE5VTEwsIDAsIHR5cGUsIG4pOworICBpZiAoaWQgPCAwCisgICB8fCBzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgaWQsIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgKnAsIDApCisgICB8fCBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoqCitTT0FQX0ZNQUMyCitzb2FwX2luc3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGNoYXIgKipwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCwgaW50IGZsYWcsIGxvbmcgbWlubGVuLCBsb25nIG1heGxlbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDEpKQorICB7IGlmICghdGFnIHx8ICp0YWcgIT0gJy0nIHx8IHNvYXAtPmVycm9yICE9IFNPQVBfTk9fVEFHKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICB9CisgIGlmICghcCkKKyAgICBpZiAoIShwID0gKGNoYXIqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2YoY2hhciopKSkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgaWYgKHNvYXAtPmJvZHkpCisgIHsgKnAgPSBzb2FwX3N0cmluZ19pbihzb2FwLCBmbGFnLCBtaW5sZW4sIG1heGxlbik7CisgICAgaWYgKCEqcCB8fCAhKGNoYXIqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsICpwLCB0LCBzaXplb2YoY2hhciopLCAwLCBOVUxMLCBOVUxMLCBOVUxMKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGVsc2UgaWYgKHNvYXAtPm51bGwpCisgICAgKnAgPSBOVUxMOworICBlbHNlCisgICAgKnAgPSAoY2hhciopU09BUF9TVFJfRU9TOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChjaGFyKiopc29hcF9pZF9sb29rdXAoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilwLCB0LCBzaXplb2YoY2hhcioqKSwgMCk7CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0d3N0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIHdjaGFyX3QgKmNvbnN0KnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKSAKK3sgaWQgPSBzb2FwX2VsZW1lbnRfaWQoc29hcCwgdGFnLCBpZCwgKnAsIE5VTEwsIDAsIHR5cGUsIG4pOworICBpZiAoaWQgPCAwCisgICB8fCBzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgaWQsIHR5cGUpCisgICB8fCBzb2FwX3dzdHJpbmdfb3V0KHNvYXAsICpwLCAwKQorICAgfHwgc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit3Y2hhcl90ICoqCitTT0FQX0ZNQUMyCitzb2FwX2lud3N0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB3Y2hhcl90ICoqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQsIGxvbmcgbWlubGVuLCBsb25nIG1heGxlbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDEpKQorICB7IGlmICghdGFnIHx8ICp0YWcgIT0gJy0nIHx8IHNvYXAtPmVycm9yICE9IFNPQVBfTk9fVEFHKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICB9CisgIGlmICghcCkKKyAgICBpZiAoIShwID0gKHdjaGFyX3QqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yod2NoYXJfdCopKSkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgaWYgKHNvYXAtPmJvZHkpCisgIHsgKnAgPSBzb2FwX3dzdHJpbmdfaW4oc29hcCwgMSwgbWlubGVuLCBtYXhsZW4pOworICAgIGlmICghKnAgfHwgISh3Y2hhcl90Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCAqcCwgdCwgc2l6ZW9mKHdjaGFyX3QqKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBlbHNlIGlmIChzb2FwLT5udWxsKQorICAgICpwID0gTlVMTDsKKyAgZWxzZQorICAgICpwID0gKHdjaGFyX3QqKVNPQVBfU1RSX0VPUzsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAod2NoYXJfdCoqKXNvYXBfaWRfbG9va3VwKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopcCwgdCwgc2l6ZW9mKHdjaGFyX3QqKiksIDApOworICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgdGltZV90Citzb2FwX3RpbWVnbShzdHJ1Y3QgdG0gKlQpCit7CisjaWYgZGVmaW5lZChIQVZFX1RJTUVHTSkKKyAgcmV0dXJuIHRpbWVnbShUKTsKKyNlbHNlCisgIHRpbWVfdCB0LCBnLCB6OworI2lmZGVmIEhBVkVfR01USU1FX1IKKyAgc3RydWN0IHRtIHRtLCAqdG1wID0gJnRtOworI2Vsc2UKKyAgc3RydWN0IHRtICp0bXA7CisjZW5kaWYKKyAgdCA9IG1rdGltZShUKTsKKyAgaWYgKHQgPT0gLTEpCisgICAgcmV0dXJuIC0xOworI2lmZGVmIEhBVkVfR01USU1FX1IKKyAgZ210aW1lX3IoJnQsIHRtcCk7CisjZWxzZQorICB0bXAgPSBnbXRpbWUoJnQpOworI2VuZGlmCisgIHRtcC0+dG1faXNkc3QgPSAwOworICBnID0gbWt0aW1lKHRtcCk7CisgIGlmIChnID09IC0xKQorICAgIHJldHVybiAtMTsKKyAgeiA9IGcgLSB0OworICByZXR1cm4gdCAtIHo7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2RhdGVUaW1lMnMoc3RydWN0IHNvYXAgKnNvYXAsIHRpbWVfdCBuKQoreyBzdHJ1Y3QgdG0gVCwgKnBUID0gJlQ7CisjaWYgZGVmaW5lZChIQVZFX0dNVElNRV9SKQorICBpZiAoZ210aW1lX3IoJm4sIHBUKSkKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVNaIiwgcFQpOworICAvKiBUaGUgZm9sbG93aW5nIGRlZmluZXMgd2VyZSBhZGRlZCBmb3IgVnhXb3JrcyovCisjZWxpZiBkZWZpbmVkKEhBVkVfUEdNVElNRV9SKQorICBpZiAoZ210aW1lX3IoJm4sIHBUKSkKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVNaIiwgcFQpOworI2VsaWYgZGVmaW5lZChIQVZFX1BHTVRJTUUpCisgIGlmIChnbXRpbWUoJm4sIHBUKSkKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVNaIiwgcFQpOworI2VsaWYgZGVmaW5lZChIQVZFX0dNVElNRSkKKyAgaWYgKChwVCA9IGdtdGltZSgmbikpKQorICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolU1oiLCBwVCk7CisjZWxpZiBkZWZpbmVkKEhBVkVfR0VUVElNRU9GREFZKQorICBzdHJ1Y3QgdGltZXpvbmUgdHo7CisgIG1lbXNldCgodm9pZCopJnR6LCAwLCBzaXplb2YodHopKTsKKyMgaWYgZGVmaW5lZChIQVZFX0xPQ0FMVElNRV9SKQorICBpZiAobG9jYWx0aW1lX3IoJm4sIHBUKSkKKyAgeyBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICBnZXR0aW1lb2ZkYXkoJnR2LCAmdHopOworICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIHN0cmxlbihzb2FwLT50bXBidWYpLCAiJSswM2Q6JTAyZCIsIC10ei50el9taW51dGVzd2VzdC82MCsocFQtPnRtX2lzZHN0IT0wKSwgYWJzKHR6LnR6X21pbnV0ZXN3ZXN0KSU2MCk7CisgIH0KKyMgZWxzZQorICBpZiAoKHBUID0gbG9jYWx0aW1lKCZuKSkpCisgIHsgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgZ2V0dGltZW9mZGF5KCZ0diwgJnR6KTsKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwVCk7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYgKyBzdHJsZW4oc29hcC0+dG1wYnVmKSwgIiUrMDNkOiUwMmQiLCAtdHoudHpfbWludXRlc3dlc3QvNjArKHBULT50bV9pc2RzdCE9MCksIGFicyh0ei50el9taW51dGVzd2VzdCklNjApOworICB9CisjZW5kaWYKKyNlbGlmIGRlZmluZWQoSEFWRV9GVElNRSkKKyAgc3RydWN0IHRpbWViIHQ7CisgIG1lbXNldCgodm9pZCopJnQsIDAsIHNpemVvZih0KSk7CisjIGlmIGRlZmluZWQoSEFWRV9MT0NBTFRJTUVfUikKKyAgaWYgKGxvY2FsdGltZV9yKCZuLCBwVCkpCisgIHsgZnRpbWUoJnQpOworICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIHN0cmxlbihzb2FwLT50bXBidWYpLCAiJSswM2Q6JTAyZCIsIC10LnRpbWV6b25lLzYwKyhwVC0+dG1faXNkc3QhPTApLCBhYnModC50aW1lem9uZSklNjApOworICB9CisgIC8qIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyB3ZXJlIGFkZGVkIGZvciBWeFdvcmtzKi8KKyMgZWxpZiBkZWZpbmVkKEhBVkVfUExPQ0FMVElNRV9SKQorICBpZiAobG9jYWx0aW1lX3IoJm4sIHBUKSkKKyAgeyBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwVCk7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYrc3RybGVuKHNvYXAtPnRtcGJ1ZiksICIlKzAzZDolMDJkIiwgdC50aW1lem9uZS82MCwgYWJzKHQudGltZXpvbmUpJTYwKTsKKyAgfQorIyBlbHNlCisgIGlmICgocFQgPSBsb2NhbHRpbWUoJm4pKSkKKyAgeyBmdGltZSgmdCk7CisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmICsgc3RybGVuKHNvYXAtPnRtcGJ1ZiksICIlKzAzZDolMDJkIiwgLXQudGltZXpvbmUvNjArKHBULT50bV9pc2RzdCE9MCksIGFicyh0LnRpbWV6b25lKSU2MCk7CisgIH0KKyMgZW5kaWYKKyNlbGlmIGRlZmluZWQoSEFWRV9MT0NBTFRJTUVfUikKKyAgaWYgKGxvY2FsdGltZV9yKCZuLCBwVCkpCisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworICAvKiBUaGUgZm9sbG93aW5nIGRlZmluZXMgd2VyZSBhZGRlZCBmb3IgVnhXb3JrcyovCisjZWxpZiBkZWZpbmVkKEhBVkVfUExPQ0FMVElNRV9SKQorICBpZiAobG9jYWx0aW1lX3IoJm4sIHBUKSkKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwVCk7CisjZWxzZQorICBpZiAoKHBUID0gbG9jYWx0aW1lKCZuKSkpCisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworI2VuZGlmCisgIGVsc2UKKyAgICBzdHJjcHkoc29hcC0+dG1wYnVmLCAiMTk2OS0xMi0zMVQyMzo1OTo1OVoiKTsKKyAgcmV0dXJuIHNvYXAtPnRtcGJ1ZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRkYXRlVGltZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHRpbWVfdCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9kYXRlVGltZTJzKHNvYXAsICpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMmRhdGVUaW1lKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCB0aW1lX3QgKnApCit7IGlmIChzKQorICB7IHN0cnVjdCB0bSBUOworICAgIGNoYXIgem9uZVsxNl07CisgICAgY29uc3QgY2hhciAqdDsKKyAgICBtZW1zZXQoKHZvaWQqKSZULCAwLCBzaXplb2YoVCkpOworICAgIHpvbmVbc2l6ZW9mKHpvbmUpLTFdID0gJ1wwJzsKKyAgICBpZiAoc3RyY2hyKHMsICctJykpCisgICAgICB0ID0gIiVkLSVkLSVkVCVkOiVkOiVkJTE1cyI7CisgICAgZWxzZSBpZiAoc3RyY2hyKHMsICc6JykpCisgICAgICB0ID0gIiU0ZCUyZCUyZFQlZDolZDolZCUxNXMiOworICAgIGVsc2UgLyogcGFyc2Ugbm9uLVhTRC1zdGFuZGFyZCBhbHRlcm5hdGl2ZSBJU08gODYwMSBmb3JtYXQgKi8KKyAgICAgIHQgPSAiJTRkJTJkJTJkVCUyZCUyZCUyZCUxNXMiOworICAgIHNzY2FuZihzLCB0LCAmVC50bV95ZWFyLCAmVC50bV9tb24sICZULnRtX21kYXksICZULnRtX2hvdXIsICZULnRtX21pbiwgJlQudG1fc2VjLCB6b25lKTsKKyAgICBpZiAoVC50bV95ZWFyID09IDEpCisgICAgICBULnRtX3llYXIgPSA3MDsKKyAgICBlbHNlCisgICAgICBULnRtX3llYXIgLT0gMTkwMDsKKyAgICBULnRtX21vbi0tOworICAgIGlmICgqem9uZSkKKyAgICB7IGlmICgqem9uZSA9PSAnLicpCisgICAgICB7IGZvciAocyA9IHpvbmUgKyAxOyAqczsgcysrKQorICAgICAgICAgIGlmICgqcyA8ICcwJyB8fCAqcyA+ICc5JykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBzID0gem9uZTsKKyAgICAgIGlmICgqcyA9PSAnKycgfHwgKnMgPT0gJy0nKQorICAgICAgeyBpbnQgaCA9IDAsIG0gPSAwOworICAgICAgICBpZiAoc1szXSA9PSAnOicpCisJeyBzc2NhbmYocywgIiVkOiVkIiwgJmgsICZtKTsKKwkgIGlmIChoIDwgMCkKKwkgICAgbSA9IC1tOworCX0KKwllbHNlCisJeyBtID0gKGludClhdG9sKHMpOworCSAgaCA9IG0gLyAxMDA7CisJICBtID0gbSAlIDEwMDsKKwl9CisgICAgICAgIFQudG1faG91ciAtPSBoOworICAgICAgICBULnRtX21pbiAtPSBtOworICAgICAgfQorICAgICAgVC50bV9pc2RzdCA9IDA7CisgICAgICAqcCA9IHNvYXBfdGltZWdtKCZUKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgVC50bV9pc2RzdCA9IC0xOworICAgICAgKnAgPSBta3RpbWUoJlQpOyAvKiBubyB0aW1lIHpvbmU6IHN1cHBvc2UgaXQgaXMgbG9jYWx0aW1lPyAqLworICAgIH0KKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCit0aW1lX3QgKgorU09BUF9GTUFDMgorc29hcF9pbmRhdGVUaW1lKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHRpbWVfdCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpkYXRlVGltZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisgIHAgPSAodGltZV90Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YodGltZV90KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKHRpbWVfdCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZih0aW1lX3QpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMmRhdGVUaW1lKHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRsaXRlcmFsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGNoYXIgKmNvbnN0KnApCit7IGludCBpOworICBjb25zdCBjaGFyICp0ID0gTlVMTDsKKyAgaWYgKHRhZyAmJiAqdGFnICE9ICctJykKKyAgeyBpZiAoc29hcC0+bG9jYWxfbmFtZXNwYWNlcyAmJiAodCA9IHN0cmNocih0YWcsICc6JykpKQorICAgIHsgc3RybmNweShzb2FwLT50bXBidWYsIHRhZywgdC10YWcpOworICAgICAgc29hcC0+dG1wYnVmW3QtdGFnXSA9ICdcMCc7CisgICAgICBmb3IgKGkgPSAwOyBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW2ldLmlkOyBpKyspCisgICAgICAgIGlmICghc3RyY21wKHNvYXAtPnRtcGJ1Ziwgc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tpXS5pZCkpCisgICAgICAgICAgYnJlYWs7CisgICAgICB0Kys7CisgICAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIjwlcyB4bWxucz1cIiVzXCI+IiwgdCwgc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tpXS5ucyA/IHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0ubnMgOiBTT0FQX1NUUl9FT1MpOworICAgIH0KKyAgICBlbHNlCisgICAgeyB0ID0gdGFnOworICAgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICI8JXM+IiwgdGFnKTsKKyAgICB9CisgICAgaWYgKHNvYXBfc2VuZChzb2FwLCBzb2FwLT50bXBidWYpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmIChwICYmICpwKQorICB7IGlmIChzb2FwX3NlbmQoc29hcCwgKnApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmICh0KQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiPC8lcz4iLCB0KTsKKyAgICByZXR1cm4gc29hcF9zZW5kKHNvYXAsIHNvYXAtPnRtcGJ1Zik7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoqCitTT0FQX0ZNQUMyCitzb2FwX2lubGl0ZXJhbChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBjaGFyICoqcCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDEpKQorICB7IGlmIChzb2FwLT5lcnJvciAhPSBTT0FQX05PX1RBRyB8fCBzb2FwX3VuZ2V0KHNvYXAsIHNvYXBfZ2V0KHNvYXApKSA9PSBTT0FQX1RUKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICB9CisgIGlmICghcCkKKyAgICBpZiAoIShwID0gKGNoYXIqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2YoY2hhciopKSkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgaWYgKHNvYXAtPmJvZHkpCisgICAgKnAgPSBzb2FwX3N0cmluZ19pbihzb2FwLCAwLCAtMSwgLTEpOworICBlbHNlIGlmIChzb2FwLT5udWxsKQorICAgICpwID0gTlVMTDsKKyAgZWxzZQorICAgICpwID0gKGNoYXIqKVNPQVBfU1RSX0VPUzsKKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXR3bGl0ZXJhbChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB3Y2hhcl90ICpjb25zdCpwKQoreyBpbnQgaTsKKyAgY29uc3QgY2hhciAqdCA9IE5VTEw7CisgIHdjaGFyX3QgYzsKKyAgY29uc3Qgd2NoYXJfdCAqczsKKyAgaWYgKHRhZyAmJiAqdGFnICE9ICctJykKKyAgeyBpZiAoc29hcC0+bG9jYWxfbmFtZXNwYWNlcyAmJiAodCA9IHN0cmNocih0YWcsICc6JykpKQorICAgIHsgc3RybmNweShzb2FwLT50bXBidWYsIHRhZywgdC10YWcpOworICAgICAgc29hcC0+dG1wYnVmW3QtdGFnXSA9ICdcMCc7CisgICAgICBmb3IgKGkgPSAwOyBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW2ldLmlkOyBpKyspCisgICAgICAgIGlmICghc3RyY21wKHNvYXAtPnRtcGJ1Ziwgc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tpXS5pZCkpCisgICAgICAgICAgYnJlYWs7CisgICAgICB0Kys7CisgICAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIjwlcyB4bWxucz1cIiVzXCI+IiwgdCwgc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tpXS5ucyA/IHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0ubnMgOiBTT0FQX1NUUl9FT1MpOworICAgIH0KKyAgICBlbHNlCisgICAgeyB0ID0gdGFnOworICAgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICI8JXM+IiwgdGFnKTsKKyAgICB9CisgICAgaWYgKHNvYXBfc2VuZChzb2FwLCBzb2FwLT50bXBidWYpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmIChwKQorICB7IHMgPSAqcDsKKyAgICB3aGlsZSAoKGMgPSAqcysrKSkKKyAgICAgIGlmIChzb2FwX3B1dHV0Zjgoc29hcCwgKHVuc2lnbmVkIGNoYXIpYykpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAodCkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIjwvJXM+IiwgdCk7CisgICAgcmV0dXJuIHNvYXBfc2VuZChzb2FwLCBzb2FwLT50bXBidWYpOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit3Y2hhcl90ICoqCitTT0FQX0ZNQUMyCitzb2FwX2lud2xpdGVyYWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgd2NoYXJfdCAqKnApCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAxKSkKKyAgeyBpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9OT19UQUcgfHwgc29hcF91bmdldChzb2FwLCBzb2FwX2dldChzb2FwKSkgPT0gU09BUF9UVCkKKyAgICAgIHJldHVybiBOVUxMOworICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgfQorICBpZiAoIXApCisgICAgaWYgKCEocCA9ICh3Y2hhcl90Kiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHdjaGFyX3QqKSkpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIGlmIChzb2FwLT5ib2R5KQorICAgICpwID0gc29hcF93c3RyaW5nX2luKHNvYXAsIDAsIC0xLCAtMSk7CisgIGVsc2UgaWYgKHNvYXAtPm51bGwpCisgICAgKnAgPSBOVUxMOworICBlbHNlCisgICAgKnAgPSAod2NoYXJfdCopU09BUF9TVFJfRU9TOworICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfdG9rZW4oc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNpemVfdCBpOworICByZWdpc3RlciBzb2FwX3djaGFyIGMgPSAwOworICByZWdpc3RlciBjaGFyICpzID0gc29hcC0+dG1wYnVmOworICBpZiAoIXNvYXAtPmJvZHkpCisgICAgcmV0dXJuIFNPQVBfU1RSX0VPUzsKKyAgZG8gYyA9IHNvYXBfZ2V0KHNvYXApOworICB3aGlsZSAoc29hcF9ibGFuayhjKSk7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc29hcC0+dG1wYnVmKSAtIDE7IGkrKykKKyAgeyBpZiAoYyA9PSBTT0FQX1RUIHx8IChpbnQpYyA9PSBFT0YgfHwgc29hcF9ibGFuayhjKSkKKyAgICAgIGJyZWFrOworICAgICpzKysgPSAoY2hhciljOworICAgIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgfQorICBpZiAoKGludCljID09IEVPRiB8fCBjID09IFNPQVBfVFQpCisgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgKnMgPSAnXDAnOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVsZW1lbnQgY29udGVudCB2YWx1ZT0nJXMnXG4iLCBzb2FwLT50bXBidWYpKTsKKyAgcmV0dXJuIHNvYXAtPnRtcGJ1ZjsgLyogcmV0dXJuIG5vbi1udWxsIHBvaW50ZXIgKi8KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIgKgorU09BUF9GTUFDMgorc29hcF92YWx1ZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc2l6ZV90IGk7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IDA7CisgIHJlZ2lzdGVyIGNoYXIgKnMgPSBzb2FwLT50bXBidWY7CisgIGlmICghc29hcC0+Ym9keSkKKyAgICByZXR1cm4gU09BUF9TVFJfRU9TOworICBkbyBjID0gc29hcF9nZXQoc29hcCk7CisgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZihzb2FwLT50bXBidWYpIC0gMTsgaSsrKQorICB7IGlmIChjID09IFNPQVBfVFQgfHwgKGludCljID09IEVPRikKKyAgICAgIGJyZWFrOworICAgICpzKysgPSAoY2hhciljOworICAgIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgfQorICBmb3IgKHMtLTsgaSA+IDA7IGktLSwgcy0tKQorICAgIGlmICghc29hcF9ibGFuaygqcykpCisgICAgICBicmVhazsKKyAgc1sxXSA9ICdcMCc7CisgIGlmICgoaW50KWMgPT0gRU9GIHx8IGMgPT0gU09BUF9UVCkKKyAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVsZW1lbnQgY29udGVudCB2YWx1ZT0nJXMnXG4iLCBzb2FwLT50bXBidWYpKTsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgICBzb2FwLT5kb20tPmRhdGEgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT50bXBidWYpOworI2VuZGlmCisgIHJldHVybiBzb2FwLT50bXBidWY7IC8qIHJldHVybiBub24tbnVsbCBwb2ludGVyICovCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAhZGVmaW5lZChXSVRIX0xFQU5FUikgfHwgIWRlZmluZWQoV0lUSF9OT0hUVFApCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldGxpbmUoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnMsIGludCBsZW4pCit7IGludCBpID0gbGVuOworICBzb2FwX3djaGFyIGMgPSAwOworICBmb3IgKDs7KQorICB7IHdoaWxlICgtLWkgPiAwKQorICAgIHsgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgICAgIGlmIChjID09ICdccicgfHwgYyA9PSAnXG4nKQorICAgICAgICBicmVhazsKKyAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAgICpzKysgPSAoY2hhciljOworICAgIH0KKyAgICBpZiAoYyAhPSAnXG4nKQorICAgICAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsgLyogZ290IFxyLCBub3cgZ2V0IFxuICovCisgICAgaWYgKGMgPT0gJ1xuJykKKyAgICB7ICpzID0gJ1wwJzsKKyAgICAgIGlmIChpKzEgPT0gbGVuKSAvKiBlbXB0eSBsaW5lOiBlbmQgb2YgSFRUUC9NSU1FIGhlYWRlciAqLworICAgICAgICBicmVhazsKKyAgICAgIGMgPSBzb2FwX3VuZ2V0KHNvYXAsIHNvYXBfZ2V0Y2hhcihzb2FwKSk7CisgICAgICBpZiAoYyAhPSAnICcgJiYgYyAhPSAnXHQnKSAvKiBIVFRQIGxpbmUgY29udGludWF0aW9uPyAqLworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZWxzZSBpZiAoKGludCljID09IEVPRikKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc2l6ZV90Citzb2FwX2NvdW50X2F0dGFjaG1lbnRzKHN0cnVjdCBzb2FwICpzb2FwKQoreyAKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICByZWdpc3RlciBzaXplX3QgY291bnQgPSBzb2FwLT5jb3VudDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDYWxjdWxhdGluZyB0aGUgbWVzc2FnZSBzaXplIHdpdGggYXR0YWNobWVudHMsIGN1cnJlbnQgY291bnQ9JWx1XG4iLCAodW5zaWduZWQgbG9uZyljb3VudCkpOworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKSkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNhbGN1bGF0aW5nIHRoZSBzaXplIG9mIERJTUUgYXR0YWNobWVudHNcbiIpKTsKKyAgICBmb3IgKGNvbnRlbnQgPSBzb2FwLT5kaW1lLmZpcnN0OyBjb250ZW50OyBjb250ZW50ID0gY29udGVudC0+bmV4dCkKKyAgICB7IGNvdW50ICs9IDEyICsgKChjb250ZW50LT5zaXplKzMpJih+MykpOworICAgICAgaWYgKGNvbnRlbnQtPmlkKQorICAgICAgICBjb3VudCArPSAoKHN0cmxlbihjb250ZW50LT5pZCkrMykmKH4zKSk7CisgICAgICBpZiAoY29udGVudC0+dHlwZSkKKyAgICAgICAgY291bnQgKz0gKChzdHJsZW4oY29udGVudC0+dHlwZSkrMykmKH4zKSk7CisgICAgICBpZiAoY29udGVudC0+b3B0aW9ucykKKyAgICAgICAgY291bnQgKz0gKCgoKHVuc2lnbmVkIGNoYXIpY29udGVudC0+b3B0aW9uc1syXSA8PCA4KSB8ICgodW5zaWduZWQgY2hhciljb250ZW50LT5vcHRpb25zWzNdKSkrNykmKH4zKTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2l6ZSBvZiBESU1FIGF0dGFjaG1lbnQgY29udGVudCBpcyAlbHUgYnl0ZXNcbiIsICh1bnNpZ25lZCBsb25nKWNvbnRlbnQtPnNpemUpKTsKKyAgICB9CisgIH0KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkgJiYgc29hcC0+bWltZS5ib3VuZGFyeSkKKyAgeyByZWdpc3RlciBzaXplX3QgbiA9IHN0cmxlbihzb2FwLT5taW1lLmJvdW5kYXJ5KTsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNhbGN1bGF0aW5nIHRoZSBzaXplIG9mIE1JTUUgYXR0YWNobWVudHNcbiIpKTsKKyAgICBmb3IgKGNvbnRlbnQgPSBzb2FwLT5taW1lLmZpcnN0OyBjb250ZW50OyBjb250ZW50ID0gY29udGVudC0+bmV4dCkKKyAgICB7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnM7CisgICAgICAvKiBjb3VudCBcclxuLS1ib3VuZGFyeVxyXG4gKi8KKyAgICAgIGNvdW50ICs9IDYgKyBuOworICAgICAgLyogY291bnQgQ29udGVudC1UeXBlOiAuLi5cclxuICovCisgICAgICBpZiAoY29udGVudC0+dHlwZSkKKyAgICAgICAgY291bnQgKz0gMTYgKyBzdHJsZW4oY29udGVudC0+dHlwZSk7CisgICAgICAvKiBjb3VudCBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiAuLi5cclxuICovCisgICAgICBzID0gc29hcF9zdHJfY29kZShtaW1lX2NvZGVzLCBjb250ZW50LT5lbmNvZGluZyk7CisgICAgICBpZiAocykKKyAgICAgICAgY291bnQgKz0gMjkgKyBzdHJsZW4ocyk7CisgICAgICAvKiBjb3VudCBDb250ZW50LUlEOiAuLi5cclxuICovCisgICAgICBpZiAoY29udGVudC0+aWQpCisgICAgICAgIGNvdW50ICs9IDE0ICsgc3RybGVuKGNvbnRlbnQtPmlkKTsKKyAgICAgIC8qIGNvdW50IENvbnRlbnQtTG9jYXRpb246IC4uLlxyXG4gKi8KKyAgICAgIGlmIChjb250ZW50LT5sb2NhdGlvbikKKyAgICAgICAgY291bnQgKz0gMjAgKyBzdHJsZW4oY29udGVudC0+bG9jYXRpb24pOworICAgICAgLyogY291bnQgQ29udGVudC1EZXNjcmlwdGlvbjogLi4uXHJcbiAqLworICAgICAgaWYgKGNvbnRlbnQtPmRlc2NyaXB0aW9uKQorICAgICAgICBjb3VudCArPSAyMyArIHN0cmxlbihjb250ZW50LT5sb2NhdGlvbik7CisgICAgICAvKiBjb3VudCBcclxuLi4uY29udGVudCAqLworICAgICAgY291bnQgKz0gMiArIGNvbnRlbnQtPnNpemU7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNpemUgb2YgTUlNRSBhdHRhY2htZW50IGNvbnRlbnQgaXMgJWx1IGJ5dGVzXG4iLCAodW5zaWduZWQgbG9uZyljb250ZW50LT5zaXplKSk7CisgICAgfQorICAgIC8qIGNvdW50IFxyXG4tLWJvdW5kYXJ5LS0gKi8KKyAgICBjb3VudCArPSA2ICsgbjsKKyAgfQorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk5ldyBjb3VudCBpcyAlbHUgYnl0ZXNcbiIsICh1bnNpZ25lZCBsb25nKWNvdW50KSk7CisgIHJldHVybiBjb3VudDsKKyNlbHNlCisgIHJldHVybiBzb2FwLT5jb3VudDsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc29hcF9wdXRkaW1lZmllbGQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBuKQoreyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCBuKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsIFNPQVBfU1RSX1BBRERJTkcsIC0obG9uZyluJjMpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfZGltZV9vcHRpb24oc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIHNob3J0IG9wdHlwZSwgY29uc3QgY2hhciAqb3B0aW9uKQoreyBzaXplX3QgbjsKKyAgY2hhciAqcyA9IE5VTEw7CisgIGlmIChvcHRpb24pCisgIHsgbiA9IHN0cmxlbihvcHRpb24pOworICAgIHMgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgbiArIDUpOworICAgIGlmIChzKQorICAgIHsgc1swXSA9IG9wdHlwZSA+PiA4OworICAgICAgc1sxXSA9IG9wdHlwZSAmIDB4RkY7CisgICAgICBzWzJdID0gbiA+PiA4OworICAgICAgc1szXSA9IG4gJiAweEZGOworICAgICAgc3RyY3B5KHMgKyA0LCBvcHRpb24pOworICAgIH0KKyAgfQorICByZXR1cm4gczsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dGRpbWVoZHIoc3RydWN0IHNvYXAgKnNvYXApCit7IHVuc2lnbmVkIGNoYXIgdG1wWzEyXTsKKyAgc2l6ZV90IG9wdGxlbiA9IDAsIGlkbGVuID0gMCwgdHlwZWxlbiA9IDA7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUHV0IERJTUUgaGVhZGVyIGlkPSclcydcbiIsIHNvYXAtPmRpbWUuaWQ/c29hcC0+ZGltZS5pZDoiIikpOworICBpZiAoc29hcC0+ZGltZS5vcHRpb25zKQorICAgIG9wdGxlbiA9ICgoKHVuc2lnbmVkIGNoYXIpc29hcC0+ZGltZS5vcHRpb25zWzJdIDw8IDgpIHwgKCh1bnNpZ25lZCBjaGFyKXNvYXAtPmRpbWUub3B0aW9uc1szXSkpICsgNDsKKyAgaWYgKHNvYXAtPmRpbWUuaWQpCisgICAgaWRsZW4gPSBzdHJsZW4oc29hcC0+ZGltZS5pZCk7CisgIGlmIChzb2FwLT5kaW1lLnR5cGUpCisgICAgdHlwZWxlbiA9IHN0cmxlbihzb2FwLT5kaW1lLnR5cGUpOworICB0bXBbMF0gPSBTT0FQX0RJTUVfVkVSU0lPTiB8IChzb2FwLT5kaW1lLmZsYWdzICYgMHg3KTsKKyAgdG1wWzFdID0gc29hcC0+ZGltZS5mbGFncyAmIDB4RjA7CisgIHRtcFsyXSA9IG9wdGxlbiA+PiA4OworICB0bXBbM10gPSBvcHRsZW4gJiAweEZGOworICB0bXBbNF0gPSBpZGxlbiA+PiA4OworICB0bXBbNV0gPSBpZGxlbiAmIDB4RkY7CisgIHRtcFs2XSA9IHR5cGVsZW4gPj4gODsKKyAgdG1wWzddID0gdHlwZWxlbiAmIDB4RkY7CisgIHRtcFs4XSA9IHNvYXAtPmRpbWUuc2l6ZSA+PiAyNDsKKyAgdG1wWzldID0gKHNvYXAtPmRpbWUuc2l6ZSA+PiAxNikgJiAweEZGOworICB0bXBbMTBdID0gKHNvYXAtPmRpbWUuc2l6ZSA+PiA4KSAmIDB4RkY7CisgIHRtcFsxMV0gPSBzb2FwLT5kaW1lLnNpemUgJiAweEZGOworICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAoY2hhciopdG1wLCAxMikKKyAgIHx8IHNvYXBfcHV0ZGltZWZpZWxkKHNvYXAsIHNvYXAtPmRpbWUub3B0aW9ucywgb3B0bGVuKQorICAgfHwgc29hcF9wdXRkaW1lZmllbGQoc29hcCwgc29hcC0+ZGltZS5pZCwgaWRsZW4pCisgICB8fCBzb2FwX3B1dGRpbWVmaWVsZChzb2FwLCBzb2FwLT5kaW1lLnR5cGUsIHR5cGVsZW4pKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRkaW1lKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgIGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSkKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgZm9yIChjb250ZW50ID0gc29hcC0+ZGltZS5maXJzdDsgY29udGVudDsgY29udGVudCA9IGNvbnRlbnQtPm5leHQpCisgIHsgdm9pZCAqaGFuZGxlOworICAgIHNvYXAtPmRpbWUuc2l6ZSA9IGNvbnRlbnQtPnNpemU7CisgICAgc29hcC0+ZGltZS5pZCA9IGNvbnRlbnQtPmlkOworICAgIHNvYXAtPmRpbWUudHlwZSA9IGNvbnRlbnQtPnR5cGU7CisgICAgc29hcC0+ZGltZS5vcHRpb25zID0gY29udGVudC0+b3B0aW9uczsKKyAgICBzb2FwLT5kaW1lLmZsYWdzID0gU09BUF9ESU1FX1ZFUlNJT04gfCBTT0FQX0RJTUVfTUVESUE7CisgICAgaWYgKHNvYXAtPmZkaW1lcmVhZG9wZW4gJiYgKChoYW5kbGUgPSBzb2FwLT5mZGltZXJlYWRvcGVuKHNvYXAsICh2b2lkKiljb250ZW50LT5wdHIsIGNvbnRlbnQtPmlkLCBjb250ZW50LT50eXBlLCBjb250ZW50LT5vcHRpb25zKSkgfHwgc29hcC0+ZXJyb3IpKQorICAgIHsgc2l6ZV90IHNpemUgPSBjb250ZW50LT5zaXplOworICAgICAgaWYgKCFoYW5kbGUpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZmRpbWVyZWFkb3BlbiBmYWlsZWRcbiIpKTsKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgICAgaWYgKCFjb250ZW50LT5zaXplICYmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1hNTCkgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LIHx8IChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19TVE9SRSkpCisgICAgICB7IHNpemVfdCBjaHVua3NpemUgPSBzaXplb2Yoc29hcC0+dG1wYnVmKTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDaHVua2VkIHN0cmVhbWluZyBESU1FXG4iKSk7CisgICAgICAgIGRvIAorICAgICAgICB7IHNpemUgPSBzb2FwLT5mZGltZXJlYWQoc29hcCwgaGFuZGxlLCBzb2FwLT50bXBidWYsIGNodW5rc2l6ZSk7CisgICAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJmZGltZXJlYWQgcmV0dXJuZWQgJWx1IGJ5dGVzXG4iLCAodW5zaWduZWQgbG9uZylzaXplKSk7CisgICAgICAgICAgaWYgKHNpemUgPCBjaHVua3NpemUpCisgCSAgeyBzb2FwLT5kaW1lLmZsYWdzICY9IH5TT0FQX0RJTUVfQ0Y7CisgICAgICAgICAgICBpZiAoIWNvbnRlbnQtPm5leHQpCisgICAgICAgICAgICAgIHNvYXAtPmRpbWUuZmxhZ3MgfD0gU09BUF9ESU1FX01FOworCSAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNvYXAtPmRpbWUuZmxhZ3MgfD0gU09BUF9ESU1FX0NGOworCSAgc29hcC0+ZGltZS5zaXplID0gc2l6ZTsKKyAgICAgICAgICBpZiAoc29hcF9wdXRkaW1laGRyKHNvYXApCisJICAgfHwgc29hcF9wdXRkaW1lZmllbGQoc29hcCwgc29hcC0+dG1wYnVmLCBzaXplKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGlmIChzb2FwLT5kaW1lLmlkKQorIAkgIHsgc29hcC0+ZGltZS5mbGFncyAmPSB+KFNPQVBfRElNRV9NQiB8IFNPQVBfRElNRV9NRURJQSk7CisgICAgICAgICAgICBzb2FwLT5kaW1lLmlkID0gTlVMTDsKKyAgICAgICAgICAgIHNvYXAtPmRpbWUudHlwZSA9IE5VTEw7CisgICAgICAgICAgICBzb2FwLT5kaW1lLm9wdGlvbnMgPSBOVUxMOworICAgICAgICAgIH0gIAorICAgICAgICB9IHdoaWxlIChzaXplID49IGNodW5rc2l6ZSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IGlmICghY29udGVudC0+bmV4dCkKKyAgICAgICAgICBzb2FwLT5kaW1lLmZsYWdzIHw9IFNPQVBfRElNRV9NRTsKKyAgICAgICAgaWYgKHNvYXBfcHV0ZGltZWhkcihzb2FwKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIGRvCisgICAgICAgIHsgc2l6ZV90IGJ1ZnNpemU7CisJICBpZiAoc2l6ZSA8IHNpemVvZihzb2FwLT50bXBidWYpKQorICAgICAgICAgICAgYnVmc2l6ZSA9IHNpemU7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgYnVmc2l6ZSA9IHNpemVvZihzb2FwLT50bXBidWYpOworICAgICAgICAgIGlmICghKGJ1ZnNpemUgPSBzb2FwLT5mZGltZXJlYWQoc29hcCwgaGFuZGxlLCBzb2FwLT50bXBidWYsIGJ1ZnNpemUpKSkKKyAgICAgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZmRpbWVyZWFkIGZhaWxlZDogaW5zdWZmaWNpZW50IGRhdGEgKCVsdSBieXRlcyByZW1haW5pbmcgZnJvbSAlbHUgYnl0ZXMpXG4iLCAodW5zaWduZWQgbG9uZylzaXplLCAodW5zaWduZWQgbG9uZylzb2FwLT5kaW1lLnNpemUpKTsKKyAgICAgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisJICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzb2FwLT50bXBidWYsIGJ1ZnNpemUpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgc2l6ZSAtPSBidWZzaXplOworICAgICAgICB9IHdoaWxlIChzaXplKTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJmZGltZXJlYWRjbG9zZVxuIikpOworICAgICAgICBzb2FwX3NlbmRfcmF3KHNvYXAsIFNPQVBfU1RSX1BBRERJTkcsIC0obG9uZylzb2FwLT5kaW1lLnNpemUmMyk7CisgICAgICB9CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImZkaW1lcmVhZGNsb3NlXG4iKSk7CisgICAgICBpZiAoc29hcC0+ZmRpbWVyZWFkY2xvc2UpCisgICAgICAgIHNvYXAtPmZkaW1lcmVhZGNsb3NlKHNvYXAsIGhhbmRsZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IGlmICghY29udGVudC0+bmV4dCkKKyAgICAgICAgc29hcC0+ZGltZS5mbGFncyB8PSBTT0FQX0RJTUVfTUU7CisgICAgICBpZiAoc29hcF9wdXRkaW1laGRyKHNvYXApCisgICAgICAgfHwgc29hcF9wdXRkaW1lZmllbGQoc29hcCwgKGNoYXIqKWNvbnRlbnQtPnB0ciwgY29udGVudC0+c2l6ZSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBjaGFyICoKK3NvYXBfZ2V0ZGltZWZpZWxkKHN0cnVjdCBzb2FwICpzb2FwLCBzaXplX3QgbikKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgY2hhciAqczsKKyAgY2hhciAqcCA9IE5VTEw7CisgIGlmIChuKQorICB7IHAgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgbiArIDEpOworICAgIGlmIChwKQorICAgIHsgcyA9IHA7CisgICAgICBmb3IgKGkgPSBuOyBpID4gMDsgaS0tKQorICAgICAgeyBpZiAoKGludCkoYyA9IHNvYXBfZ2V0MShzb2FwKSkgPT0gRU9GKQorICAgICAgICB7IHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgKnMrKyA9IChjaGFyKWM7CisgICAgICB9CisgICAgICAqcyA9ICdcMCc7CisgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcF9tb3ZlKHNvYXAsIC0obG9uZyluJjMpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgIH0KKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRkaW1laGRyKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIHJlZ2lzdGVyIGNoYXIgKnM7CisgIHJlZ2lzdGVyIGludCBpOworICB1bnNpZ25lZCBjaGFyIHRtcFsxMl07CisgIHNpemVfdCBvcHRsZW4sIGlkbGVuLCB0eXBlbGVuOworICBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9ESU1FX0VORDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHZXQgRElNRSBoZWFkZXJcbiIpKTsKKyAgaWYgKHNvYXAtPmRpbWUuYnVmbGVuIHx8IHNvYXAtPmRpbWUuY2h1bmtzaXplKQorICB7IGlmIChzb2FwX21vdmUoc29hcCwgKGxvbmcpKHNvYXAtPmRpbWUuc2l6ZSAtIHNvYXBfdGVsbChzb2FwKSkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgc29hcF91bmdldChzb2FwLCBzb2FwX2dldGNoYXIoc29hcCkpOyAvKiBza2lwIHBhZGRpbmcgYW5kIGdldCBoZHIgKi8KKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIi4uLiBGcm9tIGNodW5rZWRcbiIpKTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICBzID0gKGNoYXIqKXRtcDsKKyAgZm9yIChpID0gMTI7IGkgPiAwOyBpLS0pCisgIHsgaWYgKChpbnQpKGMgPSBzb2FwX2dldGNoYXIoc29hcCkpID09IEVPRikKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgICpzKysgPSAoY2hhciljOworICB9CisgIGlmICgodG1wWzBdICYgMHhGOCkgIT0gU09BUF9ESU1FX1ZFUlNJT04pCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9ESU1FX01JU01BVENIOworICBzb2FwLT5kaW1lLmZsYWdzID0gKHRtcFswXSAmIDB4NykgfCAodG1wWzFdICYgMHhGMCk7CisgIG9wdGxlbiA9ICh0bXBbMl0gPDwgOCkgfCB0bXBbM107CisgIGlkbGVuID0gKHRtcFs0XSA8PCA4KSB8IHRtcFs1XTsKKyAgdHlwZWxlbiA9ICh0bXBbNl0gPDwgOCkgfCB0bXBbN107CisgIHNvYXAtPmRpbWUuc2l6ZSA9ICh0bXBbOF0gPDwgMjQpIHwgKHRtcFs5XSA8PCAxNikgfCAodG1wWzEwXSA8PCA4KSB8IHRtcFsxMV07CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRElNRSBzaXplPSVsdSBmbGFncz0weCVYXG4iLCAodW5zaWduZWQgbG9uZylzb2FwLT5kaW1lLnNpemUsIHNvYXAtPmRpbWUuZmxhZ3MpKTsKKyAgaWYgKCEoc29hcC0+ZGltZS5vcHRpb25zID0gc29hcF9nZXRkaW1lZmllbGQoc29hcCwgb3B0bGVuKSkgJiYgc29hcC0+ZXJyb3IpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoIShzb2FwLT5kaW1lLmlkID0gc29hcF9nZXRkaW1lZmllbGQoc29hcCwgaWRsZW4pKSAmJiBzb2FwLT5lcnJvcikKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmICghKHNvYXAtPmRpbWUudHlwZSA9IHNvYXBfZ2V0ZGltZWZpZWxkKHNvYXAsIHR5cGVsZW4pKSAmJiBzb2FwLT5lcnJvcikKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRElNRSBpZD0lcywgdHlwZT0lcywgb3B0aW9ucz0lc1xuIiwgc29hcC0+ZGltZS5pZD9zb2FwLT5kaW1lLmlkOiIiLCBzb2FwLT5kaW1lLnR5cGU/c29hcC0+ZGltZS50eXBlOiIiLCBzb2FwLT5kaW1lLm9wdGlvbnM/c29hcC0+ZGltZS5vcHRpb25zKzQ6IiIpKTsKKyAgaWYgKHNvYXAtPmRpbWUuZmxhZ3MgJiBTT0FQX0RJTUVfTUUpCisgICAgc29hcC0+bW9kZSAmPSB+U09BUF9FTkNfRElNRTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRkaW1lKHN0cnVjdCBzb2FwICpzb2FwKQoreyB3aGlsZSAoc29hcC0+ZGltZS5mbGFncyAmIFNPQVBfRElNRV9DRikKKyAgeyBpZiAoc29hcF9nZXRkaW1laGRyKHNvYXApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmIChzb2FwX21vdmUoc29hcCwgc29hcC0+ZGltZS5zaXplKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICB9CisgIGlmIChzb2FwX21vdmUoc29hcCwgKChzb2FwLT5kaW1lLnNpemUrMykmKH4zKSktc29hcF90ZWxsKHNvYXApKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgZm9yICg7OykKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgICAgaWYgKHNvYXBfZ2V0ZGltZWhkcihzb2FwKSkKKyAgICAgIGJyZWFrOworICAgIGlmIChzb2FwLT5mZGltZXdyaXRlb3BlbiAmJiAoKHNvYXAtPmRpbWUucHRyID0gKGNoYXIqKXNvYXAtPmZkaW1ld3JpdGVvcGVuKHNvYXAsIHNvYXAtPmRpbWUuaWQsIHNvYXAtPmRpbWUudHlwZSwgc29hcC0+ZGltZS5vcHRpb25zKSkgfHwgc29hcC0+ZXJyb3IpKQorICAgIHsgY29uc3QgY2hhciAqaWQsICp0eXBlLCAqb3B0aW9uczsKKyAgICAgIHNpemVfdCBzaXplLCBuOworICAgICAgaWYgKCFzb2FwLT5kaW1lLnB0cikKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgaWQgPSBzb2FwLT5kaW1lLmlkOworICAgICAgdHlwZSA9IHNvYXAtPmRpbWUudHlwZTsKKyAgICAgIG9wdGlvbnMgPSBzb2FwLT5kaW1lLm9wdGlvbnM7CisgICAgICBmb3IgKDs7KQorICAgICAgeyBzaXplID0gc29hcC0+ZGltZS5zaXplOworICAgICAgICBmb3IgKDs7KQorICAgICAgICB7IG4gPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgICAgICAgaWYgKHNpemUgPCBuKQorICAgICAgICAgICAgbiA9IHNpemU7CisgICAgICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZkaW1ld3JpdGUoc29hcCwgKHZvaWQqKXNvYXAtPmRpbWUucHRyLCBzb2FwLT5idWYgKyBzb2FwLT5idWZpZHgsIG4pKSkKKyAgICAgICAgICAgIGJyZWFrOworCSAgc2l6ZSAtPSBuOworCSAgaWYgKCFzaXplKQorCSAgeyBzb2FwLT5idWZpZHggKz0gbjsKKwkgICAgYnJlYWs7CisJICB9CisJICBpZiAoc29hcF9yZWN2KHNvYXApKQorICAgICAgICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKwkgICAgZ290byBlbmQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzb2FwX21vdmUoc29hcCwgLShsb25nKXNvYXAtPmRpbWUuc2l6ZSYzKSkKKyAgICAgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworCSAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEoc29hcC0+ZGltZS5mbGFncyAmIFNPQVBfRElNRV9DRikpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChzb2FwX2dldGRpbWVoZHIoc29hcCkpCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CitlbmQ6CisgICAgICBpZiAoc29hcC0+ZmRpbWV3cml0ZWNsb3NlKQorICAgICAgICBzb2FwLT5mZGltZXdyaXRlY2xvc2Uoc29hcCwgKHZvaWQqKXNvYXAtPmRpbWUucHRyKTsKKyAgICAgIHNvYXAtPmRpbWUuc2l6ZSA9IDA7CisgICAgICBzb2FwLT5kaW1lLmlkID0gaWQ7CisgICAgICBzb2FwLT5kaW1lLnR5cGUgPSB0eXBlOworICAgICAgc29hcC0+ZGltZS5vcHRpb25zID0gb3B0aW9uczsKKyAgICB9CisgICAgZWxzZSBpZiAoc29hcC0+ZGltZS5mbGFncyAmIFNPQVBfRElNRV9DRikKKyAgICB7IGNvbnN0IGNoYXIgKmlkLCAqdHlwZSwgKm9wdGlvbnM7CisgICAgICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgICAgICByZWdpc3RlciBjaGFyICpzOworICAgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgICBpZCA9IHNvYXAtPmRpbWUuaWQ7CisgICAgICB0eXBlID0gc29hcC0+ZGltZS50eXBlOworICAgICAgb3B0aW9ucyA9IHNvYXAtPmRpbWUub3B0aW9uczsKKyAgICAgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICAgICAgcmV0dXJuIFNPQVBfRU9NOworICAgICAgZm9yICg7OykKKyAgICAgIHsgcyA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgc29hcC0+ZGltZS5zaXplKTsKKyAgICAgICAgaWYgKCFzKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgICBmb3IgKGkgPSBzb2FwLT5kaW1lLnNpemU7IGkgPiAwOyBpLS0pCisgICAgICAgIHsgaWYgKChpbnQpKGMgPSBzb2FwX2dldDEoc29hcCkpID09IEVPRikKKyAgICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgICAgICAgICpzKysgPSAoY2hhciljOworICAgICAgICB9CisgICAgICAgIGlmIChzb2FwX21vdmUoc29hcCwgLShsb25nKXNvYXAtPmRpbWUuc2l6ZSYzKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAgICAgaWYgKCEoc29hcC0+ZGltZS5mbGFncyAmIFNPQVBfRElNRV9DRikpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChzb2FwX2dldGRpbWVoZHIoc29hcCkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgICAgc29hcC0+ZGltZS5zaXplID0gc29hcC0+Ymxpc3QtPnNpemUrKzsgLyogYWxsb2NhdGUgb25lIG1vcmUgZm9yICdcMCcgKi8KKyAgICAgIGlmICghKHNvYXAtPmRpbWUucHRyID0gc29hcF9zYXZlX2Jsb2NrKHNvYXAsIE5VTEwsIDApKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgc29hcC0+ZGltZS5wdHJbc29hcC0+ZGltZS5zaXplXSA9ICdcMCc7IC8qIGZvcmNlIDAtdGVybWluYXRlZCAqLworICAgICAgc29hcC0+ZGltZS5pZCA9IGlkOworICAgICAgc29hcC0+ZGltZS50eXBlID0gdHlwZTsKKyAgICAgIHNvYXAtPmRpbWUub3B0aW9ucyA9IG9wdGlvbnM7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHNvYXAtPmRpbWUucHRyID0gc29hcF9nZXRkaW1lZmllbGQoc29hcCwgc29hcC0+ZGltZS5zaXplKTsKKyAgICBjb250ZW50ID0gc29hcF9uZXdfbXVsdGlwYXJ0KHNvYXAsICZzb2FwLT5kaW1lLmZpcnN0LCAmc29hcC0+ZGltZS5sYXN0LCBzb2FwLT5kaW1lLnB0ciwgc29hcC0+ZGltZS5zaXplKTsKKyAgICBpZiAoIWNvbnRlbnQpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICBjb250ZW50LT5pZCA9IHNvYXAtPmRpbWUuaWQ7CisgICAgY29udGVudC0+dHlwZSA9IHNvYXAtPmRpbWUudHlwZTsKKyAgICBjb250ZW50LT5vcHRpb25zID0gc29hcC0+ZGltZS5vcHRpb25zOworICAgIHNvYXBfcmVzb2x2ZV9hdHRhY2htZW50KHNvYXAsIGNvbnRlbnQpOworICAgIGlmIChzb2FwLT5lcnJvcikKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9ESU1FX0VORCkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRtaW1laGRyKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgIGRvCisgIHsgaWYgKHNvYXBfZ2V0bGluZShzb2FwLCBzb2FwLT5tc2didWYsIHNpemVvZihzb2FwLT5tc2didWYpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICB3aGlsZSAoISpzb2FwLT5tc2didWYpOworICBpZiAoc29hcC0+bXNnYnVmWzBdID09ICctJyAmJiBzb2FwLT5tc2didWZbMV0gPT0gJy0nKQorICB7IGNoYXIgKnMgPSBzb2FwLT5tc2didWYgKyBzdHJsZW4oc29hcC0+bXNnYnVmKSAtIDE7CisgICAgLyogcmVtb3ZlIHdoaXRlIHNwYWNlICovCisgICAgd2hpbGUgKHNvYXBfYmxhbmsoKnMpKQorICAgICAgcy0tOworICAgIHNbMV0gPSAnXDAnOworICAgIGlmIChzb2FwLT5taW1lLmJvdW5kYXJ5KQorICAgIHsgaWYgKHN0cmNtcChzb2FwLT5tc2didWYgKyAyLCBzb2FwLT5taW1lLmJvdW5kYXJ5KSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9NSU1FX0VSUk9SOworICAgIH0KKyAgICBlbHNlCisgICAgICBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+bXNnYnVmICsgMik7CisgICAgaWYgKHNvYXBfZ2V0bGluZShzb2FwLCBzb2FwLT5tc2didWYsIHNpemVvZihzb2FwLT5tc2didWYpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAoc29hcF9zZXRfbWltZV9hdHRhY2htZW50KHNvYXAsIE5VTEwsIDAsIFNPQVBfTUlNRV9OT05FLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgY29udGVudCA9IHNvYXAtPm1pbWUubGFzdDsKKyAgZm9yICg7OykKKyAgeyByZWdpc3RlciBjaGFyICprZXkgPSBzb2FwLT5tc2didWY7CisgICAgcmVnaXN0ZXIgY2hhciAqdmFsOworICAgIGlmICghKmtleSkKKyAgICAgIGJyZWFrOworICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJNSU1FIGhlYWRlcjogJXNcbiIsIGtleSkpOworICAgIHZhbCA9IHN0cmNocihzb2FwLT5tc2didWYsICc6Jyk7CisgICAgaWYgKHZhbCkKKyAgICB7ICp2YWwgPSAnXDAnOworICAgICAgZG8gdmFsKys7CisgICAgICB3aGlsZSAoKnZhbCAmJiAqdmFsIDw9IDMyKTsKKyAgICAgIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtSUQiKSkKKyAgICAgICAgY29udGVudC0+aWQgPSBzb2FwX3N0cmR1cChzb2FwLCB2YWwpOworICAgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LUxvY2F0aW9uIikpCisgICAgICAgIGNvbnRlbnQtPmxvY2F0aW9uID0gc29hcF9zdHJkdXAoc29hcCwgdmFsKTsKKyAgICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1EaXNwb3NpdGlvbiIpKQorICAgICAgICBjb250ZW50LT5pZCA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAibmFtZSIpKTsKKyAgICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1UeXBlIikpCisgICAgICAgIGNvbnRlbnQtPnR5cGUgPSBzb2FwX3N0cmR1cChzb2FwLCB2YWwpOworICAgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LURlc2NyaXB0aW9uIikpCisgICAgICAgIGNvbnRlbnQtPmRlc2NyaXB0aW9uID0gc29hcF9zdHJkdXAoc29hcCwgdmFsKTsKKyAgICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyIpKQorICAgICAgICBjb250ZW50LT5lbmNvZGluZyA9IChlbnVtIHNvYXBfbWltZV9lbmNvZGluZylzb2FwX2ludF9jb2RlKG1pbWVfY29kZXMsIHZhbCwgKGxvbmcpU09BUF9NSU1FX05PTkUpOworICAgIH0KKyAgICBpZiAoc29hcF9nZXRsaW5lKHNvYXAsIGtleSwgc2l6ZW9mKHNvYXAtPm1zZ2J1ZikpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0bWltZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjID0gMDsKKyAgaWYgKCFzb2FwLT5taW1lLmxhc3QpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIGZvciAoOzspCisgIHsgcmVnaXN0ZXIgc2l6ZV90IGksIG0gPSAwOworICAgIHJlZ2lzdGVyIGNoYXIgKnMsICp0ID0gTlVMTDsKKyAgICBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQgPSBzb2FwLT5taW1lLmxhc3Q7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQYXJzaW5nIE1JTUUgY29udGVudCBpZD0lcyB0eXBlPSVzXG4iLCBjb250ZW50LT5pZD9jb250ZW50LT5pZDoiIiwgY29udGVudC0+dHlwZT9jb250ZW50LT50eXBlOiIiKSk7CisgICAgaWYgKHNvYXBfbmV3X2Jsb2NrKHNvYXApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgZm9yICg7OykKKyAgICB7IHJlZ2lzdGVyIHNob3J0IGZsYWcgPSAwOworICAgICAgaWYgKCEocyA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgU09BUF9CTEtMRU4pKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICBmb3IgKGkgPSAwOyBpIDwgU09BUF9CTEtMRU47IGkrKykKKyAgICAgIHsgaWYgKG0gPiAwKQorICAgICAgICB7ICpzKysgPSAqdCsrOworCSAgbS0tOworCX0KKwllbHNlCisgICAgICAgIHsgaWYgKCFmbGFnKQorCSAgeyBjID0gc29hcF9nZXQxKHNvYXApOworCSAgICBpZiAoKGludCljID09IEVPRikKKwkgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKwkgIH0KKwkgIGlmIChmbGFnIHx8IGMgPT0gJ1xyJykKKwkgIHsgdCA9IHNvYXAtPnRtcGJ1ZjsKKwkgICAgbWVtc2V0KHQsIDAsIHNpemVvZihzb2FwLT50bXBidWYpKTsKKyAgICAgICAgICAgIHN0cmNweSh0LCAiXG4tLSIpOworICAgICAgICAgICAgaWYgKHNvYXAtPm1pbWUuYm91bmRhcnkpCisJICAgICAgc3RybmNhdCh0LCBzb2FwLT5taW1lLmJvdW5kYXJ5LCBzaXplb2Yoc29hcC0+dG1wYnVmKS00KTsKKwkgICAgZG8gYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKwkgICAgd2hpbGUgKGMgPT0gKnQrKyk7CisJICAgIGlmICgoaW50KWMgPT0gRU9GKQorCSAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworCSAgICBpZiAoISotLXQpCisJICAgICAgZ290byBlbmQ7CisJICAgICp0ID0gKGNoYXIpYzsKKwkgICAgZmxhZyA9IChjID09ICdccicpOworCSAgICBtID0gdCAtIHNvYXAtPnRtcGJ1ZiArIDEgLSBmbGFnOworCSAgICB0ID0gc29hcC0+dG1wYnVmOworCSAgICBjID0gJ1xyJzsKKwkgIH0KKwkgICpzKysgPSAoY2hhciljOworICAgICAgICB9CisgICAgICB9CisgICAgfQorZW5kOgorICAgICpzID0gJ1wwJzsgLyogZm9yY2UgMC10ZXJtaW5hdGVkICovCisgICAgY29udGVudC0+c2l6ZSA9IHNvYXBfc2l6ZV9ibG9jayhzb2FwLCBpKzEpLTE7CisgICAgY29udGVudC0+cHRyID0gc29hcF9zYXZlX2Jsb2NrKHNvYXAsIE5VTEwsIDApOworICAgIHNvYXBfcmVzb2x2ZV9hdHRhY2htZW50KHNvYXAsIGNvbnRlbnQpOworICAgIGlmIChjID09ICctJyAmJiBzb2FwX2dldGNoYXIoc29hcCkgPT0gJy0nKQorICAgICAgYnJlYWs7CisgICAgd2hpbGUgKGMgIT0gJ1xyJyAmJiAoaW50KWMgIT0gRU9GICYmIHNvYXBfYmxhbmsoYykpCisgICAgICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICAgIGlmIChjICE9ICdccicgfHwgc29hcF9nZXRjaGFyKHNvYXApICE9ICdcbicpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX01JTUVfRVJST1I7CisgICAgaWYgKHNvYXBfZ2V0bWltZWhkcihzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc29hcF9tYXRjaF9jaWQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKnQpCit7IHJlZ2lzdGVyIHNpemVfdCBuOworICBpZiAoIXMpCisgICAgcmV0dXJuIDE7CisgIGlmICghc3RyY21wKHMsIHQpKQorICAgIHJldHVybiAwOworICBpZiAoIXN0cm5jbXAocywgImNpZDoiLCA0KSkKKyAgICBzICs9IDQ7CisgIG4gPSBzdHJsZW4odCk7CisgIGlmICgqdCA9PSAnPCcpCisgIHsgdCsrOworICAgIG4gLT0gMjsKKyAgfQorICBpZiAoIXN0cm5jbXAocywgdCwgbikgJiYgIXNbbl0pCisgICAgcmV0dXJuIDA7CisgIHNvYXBfZGVjb2RlKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksIHMsIFNPQVBfU1RSX0VPUyk7CisgIGlmICghc3RybmNtcChzb2FwLT50bXBidWYsIHQsIG4pICYmICFzb2FwLT50bXBidWZbbl0pCisgICAgcmV0dXJuIDA7CisgIHJldHVybiAxOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZAorc29hcF9yZXNvbHZlX2F0dGFjaG1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudCkKK3sgaWYgKGNvbnRlbnQtPmlkKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3hsaXN0ICoqeHAgPSAmc29hcC0+eGxpc3Q7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHZpbmcgYXR0YWNobWVudCBkYXRhIGZvciBpZD0lc1xuIiwgY29udGVudC0+aWQpKTsKKyAgICB3aGlsZSAoKnhwKQorICAgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfeGxpc3QgKnhxID0gKnhwOworICAgICAgaWYgKCFzb2FwX21hdGNoX2NpZChzb2FwLCB4cS0+aWQsIGNvbnRlbnQtPmlkKSkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGb3VuZCBtYXRjaGluZyBhdHRhY2htZW50ICVzIGZvciBjb250ZW50IGlkPSVzXG4iLCB4cS0+aWQsIGNvbnRlbnQtPmlkKSk7CisJKnhwID0geHEtPm5leHQ7CisgICAgICAgICp4cS0+cHRyID0gKHVuc2lnbmVkIGNoYXIqKWNvbnRlbnQtPnB0cjsKKyAgICAgICAgKnhxLT5zaXplID0gKGludCljb250ZW50LT5zaXplOworICAgICAgICAqeHEtPnR5cGUgPSAoY2hhciopY29udGVudC0+dHlwZTsKKwlpZiAoY29udGVudC0+b3B0aW9ucykKKyAgICAgICAgICAqeHEtPm9wdGlvbnMgPSAoY2hhciopY29udGVudC0+b3B0aW9uczsKKyAgICAgICAgZWxzZQorICAgICAgICAgICp4cS0+b3B0aW9ucyA9IChjaGFyKiljb250ZW50LT5kZXNjcmlwdGlvbjsKKwlTT0FQX0ZSRUUoc29hcCwgeHEpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB4cCA9ICYoKnhwKS0+bmV4dDsKKyAgICB9CisgIH0KK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dG1pbWVoZHIoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudCkKK3sgY29uc3QgY2hhciAqczsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJNSU1FIGF0dGFjaG1lbnQgdHlwZT0lc1xuIiwgY29udGVudC0+dHlwZT9jb250ZW50LT50eXBlOiIiKSk7CisgIGlmIChzb2FwX3NlbmQzKHNvYXAsICJcclxuLS0iLCBzb2FwLT5taW1lLmJvdW5kYXJ5LCAiXHJcbiIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKGNvbnRlbnQtPnR5cGUgJiYgc29hcF9zZW5kMyhzb2FwLCAiQ29udGVudC1UeXBlOiAiLCBjb250ZW50LT50eXBlLCAiXHJcbiIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcyA9IHNvYXBfc3RyX2NvZGUobWltZV9jb2RlcywgY29udGVudC0+ZW5jb2RpbmcpOworICBpZiAocyAmJiBzb2FwX3NlbmQzKHNvYXAsICJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiAiLCBzLCAiXHJcbiIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKGNvbnRlbnQtPmlkICYmIHNvYXBfc2VuZDMoc29hcCwgIkNvbnRlbnQtSUQ6ICIsIGNvbnRlbnQtPmlkLCAiXHJcbiIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKGNvbnRlbnQtPmxvY2F0aW9uICYmIHNvYXBfc2VuZDMoc29hcCwgIkNvbnRlbnQtTG9jYXRpb246ICIsIGNvbnRlbnQtPmxvY2F0aW9uLCAiXHJcbiIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKGNvbnRlbnQtPmRlc2NyaXB0aW9uICYmIHNvYXBfc2VuZDMoc29hcCwgIkNvbnRlbnQtRGVzY3JpcHRpb246ICIsIGNvbnRlbnQtPmRlc2NyaXB0aW9uLCAiXHJcbiIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgIlxyXG4iLCAyKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dG1pbWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01JTUUpIHx8ICFzb2FwLT5taW1lLmJvdW5kYXJ5KQorICAgIHJldHVybiBTT0FQX09LOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNlbmRpbmcgTUlNRSBhdHRhY2htZW50c1xuIikpOworICBmb3IgKGNvbnRlbnQgPSBzb2FwLT5taW1lLmZpcnN0OyBjb250ZW50OyBjb250ZW50ID0gY29udGVudC0+bmV4dCkKKyAgICBpZiAoc29hcF9wdXRtaW1laGRyKHNvYXAsIGNvbnRlbnQpCisgICAgIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgY29udGVudC0+cHRyLCBjb250ZW50LT5zaXplKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfc2VuZDMoc29hcCwgIlxyXG4tLSIsIHNvYXAtPm1pbWUuYm91bmRhcnksICItLSIpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9kaW1lKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5vbW9kZSB8PSBTT0FQX0VOQ19ESU1FOworICBzb2FwLT5kaW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5sYXN0ID0gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfbWltZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqYm91bmRhcnksIGNvbnN0IGNoYXIgKnN0YXJ0KQoreyBzb2FwLT5vbW9kZSB8PSBTT0FQX0VOQ19NSU1FOworICBzb2FwLT5taW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5sYXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5ib3VuZGFyeSA9IHNvYXBfc3RyZHVwKHNvYXAsIGJvdW5kYXJ5KTsKKyAgc29hcC0+bWltZS5zdGFydCA9IHNvYXBfc3RyZHVwKHNvYXAsIHN0YXJ0KTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9jbHJfZGltZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+b21vZGUgJj0gflNPQVBfRU5DX0RJTUU7CisgIHNvYXAtPmRpbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmxhc3QgPSBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2Nscl9taW1lKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5vbW9kZSAmPSB+U09BUF9FTkNfTUlNRTsKKyAgc29hcC0+bWltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuYm91bmRhcnkgPSBOVUxMOworICBzb2FwLT5taW1lLnN0YXJ0ID0gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHN0cnVjdCBzb2FwX211bHRpcGFydCoKK3NvYXBfbmV3X211bHRpcGFydChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICoqZmlyc3QsIHN0cnVjdCBzb2FwX211bHRpcGFydCAqKmxhc3QsIGNoYXIgKnB0ciwgc2l6ZV90IHNpemUpCit7IHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgY29udGVudCA9IChzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQpKTsKKyAgaWYgKGNvbnRlbnQpCisgIHsgY29udGVudC0+bmV4dCA9IE5VTEw7CisgICAgY29udGVudC0+cHRyID0gcHRyOworICAgIGNvbnRlbnQtPnNpemUgPSBzaXplOworICAgIGNvbnRlbnQtPmlkID0gTlVMTDsKKyAgICBjb250ZW50LT50eXBlID0gTlVMTDsKKyAgICBjb250ZW50LT5vcHRpb25zID0gTlVMTDsKKyAgICBjb250ZW50LT5lbmNvZGluZyA9IFNPQVBfTUlNRV9OT05FOworICAgIGNvbnRlbnQtPmxvY2F0aW9uID0gTlVMTDsKKyAgICBjb250ZW50LT5kZXNjcmlwdGlvbiA9IE5VTEw7CisgICAgaWYgKCEqZmlyc3QpCisgICAgICAqZmlyc3QgPSBjb250ZW50OworICAgIGlmICgqbGFzdCkKKyAgICAgICgqbGFzdCktPm5leHQgPSBjb250ZW50OworICAgICpsYXN0ID0gY29udGVudDsKKyAgfQorICByZXR1cm4gY29udGVudDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NldF9kaW1lX2F0dGFjaG1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnB0ciwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmlkLCB1bnNpZ25lZCBzaG9ydCBvcHR5cGUsIGNvbnN0IGNoYXIgKm9wdGlvbikKK3sgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50ID0gc29hcF9uZXdfbXVsdGlwYXJ0KHNvYXAsICZzb2FwLT5kaW1lLmZpcnN0LCAmc29hcC0+ZGltZS5sYXN0LCBwdHIsIHNpemUpOworICBpZiAoIWNvbnRlbnQpCisgICAgcmV0dXJuIFNPQVBfRU9NOworICBjb250ZW50LT5pZCA9IHNvYXBfc3RyZHVwKHNvYXAsIGlkKTsKKyAgY29udGVudC0+dHlwZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHR5cGUpOworICBjb250ZW50LT5vcHRpb25zID0gc29hcF9kaW1lX29wdGlvbihzb2FwLCBvcHR5cGUsIG9wdGlvbik7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X21pbWVfYXR0YWNobWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqcHRyLCBzaXplX3Qgc2l6ZSwgZW51bSBzb2FwX21pbWVfZW5jb2RpbmcgZW5jb2RpbmcsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICpsb2NhdGlvbiwgY29uc3QgY2hhciAqZGVzY3JpcHRpb24pCit7IHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudCA9IHNvYXBfbmV3X211bHRpcGFydChzb2FwLCAmc29hcC0+bWltZS5maXJzdCwgJnNvYXAtPm1pbWUubGFzdCwgcHRyLCBzaXplKTsKKyAgaWYgKCFjb250ZW50KQorICAgIHJldHVybiBTT0FQX0VPTTsKKyAgY29udGVudC0+aWQgPSBzb2FwX3N0cmR1cChzb2FwLCBpZCk7CisgIGNvbnRlbnQtPnR5cGUgPSBzb2FwX3N0cmR1cChzb2FwLCB0eXBlKTsKKyAgY29udGVudC0+ZW5jb2RpbmcgPSBlbmNvZGluZzsKKyAgY29udGVudC0+bG9jYXRpb24gPSBzb2FwX3N0cmR1cChzb2FwLCBsb2NhdGlvbik7CisgIGNvbnRlbnQtPmRlc2NyaXB0aW9uID0gc29hcF9zdHJkdXAoc29hcCwgZGVzY3JpcHRpb24pOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc3RydWN0IHNvYXBfbXVsdGlwYXJ0KgorU09BUF9GTUFDMgorc29hcF9uZXh0X211bHRpcGFydChzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQpCit7IGlmIChjb250ZW50KQorICAgIHJldHVybiBjb250ZW50LT5uZXh0OworICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQKK3NvYXBfc2VsZWN0X21pbWVfYm91bmRhcnkoc3RydWN0IHNvYXAgKnNvYXApCit7IHdoaWxlICghc29hcC0+bWltZS5ib3VuZGFyeSB8fCBzb2FwX3ZhbGlkX21pbWVfYm91bmRhcnkoc29hcCkpCisgIHsgcmVnaXN0ZXIgY2hhciAqcyA9IHNvYXAtPm1pbWUuYm91bmRhcnk7CisgICAgcmVnaXN0ZXIgc2l6ZV90IG4gPSAwOworICAgIGlmIChzKQorICAgICAgbiA9IHN0cmxlbihzKTsKKyAgICBpZiAobiA8IDE2KQorICAgIHsgbiA9IDY0OworICAgICAgcyA9IHNvYXAtPm1pbWUuYm91bmRhcnkgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgbiArIDEpOworICAgICAgaWYgKCFzKQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0cmNweShzLCAiPT0iKTsKKyAgICBzICs9IDI7CisgICAgbiAtPSA0OworICAgIHdoaWxlIChuKQorICAgIHsgKnMrKyA9IHNvYXBfYmFzZTY0b1tzb2FwX3JhbmRvbSAmIDB4M0ZdOworICAgICAgbi0tOworICAgIH0KKyAgICBzdHJjcHkocywgIj09Iik7CisgIH0KKyAgaWYgKCFzb2FwLT5taW1lLnN0YXJ0KQorICAgIHNvYXAtPm1pbWUuc3RhcnQgPSAiPFNPQVAtRU5WOkVudmVsb3BlPiI7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NvYXBfdmFsaWRfbWltZV9ib3VuZGFyeShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICByZWdpc3RlciBzaXplX3QgayA9IHN0cmxlbihzb2FwLT5taW1lLmJvdW5kYXJ5KTsKKyAgZm9yIChjb250ZW50ID0gc29hcC0+bWltZS5maXJzdDsgY29udGVudDsgY29udGVudCA9IGNvbnRlbnQtPm5leHQpCisgIHsgaWYgKGNvbnRlbnQtPnB0ciAmJiBjb250ZW50LT5zaXplID49IGspCisgICAgeyByZWdpc3RlciBjb25zdCBjaGFyICpwID0gKGNvbnN0IGNoYXIqKWNvbnRlbnQtPnB0cjsgCisgICAgICByZWdpc3RlciBzaXplX3QgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjb250ZW50LT5zaXplIC0gazsgaSsrLCBwKyspCisgICAgICAgIGlmICghc3RybmNtcChwLCBzb2FwLT5taW1lLmJvdW5kYXJ5LCBrKSkKKyAgICAgICAgICByZXR1cm4gU09BUF9FUlI7CisgICAgfQorICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglIVFRQIGNvb2tpZSBoYW5kbGluZworICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBXSVRIX0NPT0tJRVMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitzaXplX3QKK1NPQVBfRk1BQzIKK3NvYXBfZW5jb2RlX2Nvb2tpZShjb25zdCBjaGFyICpzLCBjaGFyICp0LCBzaXplX3QgbGVuKQoreyByZWdpc3RlciBpbnQgYzsKKyAgcmVnaXN0ZXIgc2l6ZV90IG4gPSBsZW47CisgIHdoaWxlICgoYyA9ICpzKyspICYmIC0tbiA+IDApCisgIHsgaWYgKGMgPiAnICcgJiYgYyA8IDEyOCAmJiAhc3RyY2hyKCIoKTw+QCw7OlxcXCIvW10/PXt9IiwgYykpCisgICAgICAqdCsrID0gYzsKKyAgICBlbHNlIGlmIChuID4gMikKKyAgICB7ICp0KysgPSAnJSc7CisgICAgICAqdCsrID0gKGMgPj4gNCkgKyAoYyA+IDE1OSA/ICc3JyA6ICcwJyk7CisgICAgICBjICY9IDB4RjsKKyAgICAgICp0KysgPSBjICsgKGMgPiA5ID8gJzcnIDogJzAnKTsKKyAgICAgIG4gLT0gMjsKKyAgICB9CisgICAgZWxzZQorICAgICAgYnJlYWs7CisgIH0KKyAgKnQgPSAnXDAnOworICByZXR1cm4gbGVuIC0gbjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwX2Nvb2tpZSoKK1NPQVBfRk1BQzIKK3NvYXBfY29va2llKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgc2l6ZV90IG47CisgIGlmICghZG9tYWluKQorICAgIGRvbWFpbiA9IHNvYXAtPmNvb2tpZV9kb21haW47CisgIGlmICghcGF0aCkKKyAgICBwYXRoID0gc29hcC0+Y29va2llX3BhdGg7CisgIGlmICgqcGF0aCA9PSAnLycpCisgICAgcGF0aCsrOworICBuID0gc3RybGVuKHBhdGgpOworICBmb3IgKHAgPSBzb2FwLT5jb29raWVzOyBwOyBwID0gcC0+bmV4dCkKKyAgICBpZiAoIXN0cmNtcChwLT5uYW1lLCBuYW1lKQorICAgICAmJiBkb21haW4KKyAgICAgJiYgcC0+ZG9tYWluCisgICAgICYmICFzdHJjbXAocC0+ZG9tYWluLCBkb21haW4pCisgICAgICYmICFzdHJuY21wKHAtPnBhdGgsIHBhdGgsIG4pKQorICAgICAgYnJlYWs7CisgIHJldHVybiBwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQorc3RydWN0IHNvYXBfY29va2llKgorU09BUF9GTUFDMgorc29hcF9zZXRfY29va2llKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKipwLCAqcTsKKyAgaW50IG47CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2V0IGNvb2tpZTogJXM9JXMgZG9tYWluPSVzIHBhdGg9JXNcbiIsIG5hbWUsIHZhbHVlP3ZhbHVlOiIiLCBkb21haW4/ZG9tYWluOiIiLCBwYXRoP3BhdGg6IiIpKTsKKyAgaWYgKCFkb21haW4pCisgICAgZG9tYWluID0gc29hcC0+Y29va2llX2RvbWFpbjsKKyAgaWYgKCFwYXRoKQorICAgIHBhdGggPSBzb2FwLT5jb29raWVfcGF0aDsKKyAgaWYgKCFwYXRoKQorICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJDb29raWUgcGF0aCBub3Qgc2V0IiwgTlVMTCwgU09BUF9IVFRQX0VSUk9SKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoKnBhdGggPT0gJy8nKQorICAgIHBhdGgrKzsKKyAgcSA9IHNvYXBfY29va2llKHNvYXAsIG5hbWUsIGRvbWFpbiwgcGF0aCk7CisgIGlmICghcSkKKyAgeyBpZiAoKHEgPSAoc3RydWN0IHNvYXBfY29va2llKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfY29va2llKSkpKQorICAgIHsgaWYgKChxLT5uYW1lID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihuYW1lKSsxKSkpCisgICAgICAgIHN0cmNweShxLT5uYW1lLCBuYW1lKTsKKyAgICAgIHEtPnZhbHVlID0gTlVMTDsKKyAgICAgIHEtPmRvbWFpbiA9IE5VTEw7CisgICAgICBxLT5wYXRoID0gTlVMTDsKKyAgICAgIHEtPmV4cGlyZSA9IC0xOworICAgICAgcS0+dmVyc2lvbiA9IDA7CisgICAgICBxLT5zZWN1cmUgPSAwOworICAgICAgcS0+bW9kaWZpZWQgPSAwOworICAgICAgZm9yIChwID0gJnNvYXAtPmNvb2tpZXMsIG4gPSBzb2FwLT5jb29raWVfbWF4OyAqcCAmJiBuOyBwID0gJigqcCktPm5leHQsIG4tLSkKKyAgICAgICAgaWYgKCFzdHJjbXAoKCpwKS0+bmFtZSwgbmFtZSkgJiYgKCpwKS0+cGF0aCAmJiBzdHJjbXAoKCpwKS0+cGF0aCwgcGF0aCkgPCAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgaWYgKG4pCisgICAgICB7IHEtPm5leHQgPSAqcDsKKyAgICAgICAgKnAgPSBxOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBTT0FQX0ZSRUUoc29hcCwgcS0+bmFtZSk7CisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBxKTsKKyAgICAgICAgcSA9IE5VTEw7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyAgICBxLT5tb2RpZmllZCA9IDE7CisgIGlmIChxKQorICB7IGlmIChxLT52YWx1ZSkKKyAgICB7IFNPQVBfRlJFRShzb2FwLCBxLT52YWx1ZSk7CisgICAgICBxLT52YWx1ZSA9IE5VTEw7CisgICAgfQorICAgIGlmIChxLT5kb21haW4pCisgICAgeyBTT0FQX0ZSRUUoc29hcCwgcS0+ZG9tYWluKTsKKyAgICAgIHEtPmRvbWFpbiA9IE5VTEw7CisgICAgfQorICAgIGlmIChxLT5wYXRoKQorICAgIHsgU09BUF9GUkVFKHNvYXAsIHEtPnBhdGgpOworICAgICAgcS0+cGF0aCA9IE5VTEw7CisgICAgfQorICAgIGlmICh2YWx1ZSAmJiAqdmFsdWUgJiYgKHEtPnZhbHVlID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbih2YWx1ZSkrMSkpKQorICAgICAgc3RyY3B5KHEtPnZhbHVlLCB2YWx1ZSk7CisgICAgaWYgKGRvbWFpbiAmJiAqZG9tYWluICYmIChxLT5kb21haW4gPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKGRvbWFpbikrMSkpKQorICAgICAgc3RyY3B5KHEtPmRvbWFpbiwgZG9tYWluKTsKKyAgICBpZiAocGF0aCAmJiAqcGF0aCAmJiAocS0+cGF0aCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4ocGF0aCkrMSkpKQorICAgICAgc3RyY3B5KHEtPnBhdGgsIHBhdGgpOworICAgIHEtPnNlc3Npb24gPSAxOworICAgIHEtPmVudiA9IDA7CisgIH0KKyAgcmV0dXJuIHE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2Nscl9jb29raWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICoqcCwgKnE7CisgIGlmICghZG9tYWluKQorICAgIGRvbWFpbiA9IHNvYXAtPmNvb2tpZV9kb21haW47CisgIGlmICghZG9tYWluKQorICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJDb29raWUgZG9tYWluIG5vdCBzZXQiLCBOVUxMLCBTT0FQX0hUVFBfRVJST1IpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoIXBhdGgpCisgICAgcGF0aCA9IHNvYXAtPmNvb2tpZV9wYXRoOworICBpZiAoIXBhdGgpCisgIHsgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIkNvb2tpZSBwYXRoIG5vdCBzZXQiLCBOVUxMLCBTT0FQX0hUVFBfRVJST1IpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoKnBhdGggPT0gJy8nKQorICAgIHBhdGgrKzsKKyAgZm9yIChwID0gJnNvYXAtPmNvb2tpZXMsIHEgPSAqcDsgcTsgcSA9ICpwKQorICAgIGlmICghc3RyY21wKHEtPm5hbWUsIG5hbWUpICYmICFzdHJjbXAocS0+ZG9tYWluLCBkb21haW4pICYmICFzdHJuY21wKHEtPnBhdGgsIHBhdGgsIHN0cmxlbihxLT5wYXRoKSkpCisgICAgeyBpZiAocS0+dmFsdWUpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBxLT52YWx1ZSk7CisgICAgICBpZiAocS0+ZG9tYWluKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcS0+ZG9tYWluKTsKKyAgICAgIGlmIChxLT5wYXRoKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcS0+cGF0aCk7CisgICAgICAqcCA9IHEtPm5leHQ7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgcSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHAgPSAmcS0+bmV4dDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9jb29raWVfdmFsdWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBpZiAoKHAgPSBzb2FwX2Nvb2tpZShzb2FwLCBuYW1lLCBkb21haW4sIHBhdGgpKSkKKyAgICByZXR1cm4gcC0+dmFsdWU7CisgIHJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX2Vudl9jb29raWVfdmFsdWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBpZiAoKHAgPSBzb2FwX2Nvb2tpZShzb2FwLCBuYW1lLCBkb21haW4sIHBhdGgpKSAmJiBwLT5lbnYpCisgICAgcmV0dXJuIHAtPnZhbHVlOworICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2xvbmcKK1NPQVBfRk1BQzIKK3NvYXBfY29va2llX2V4cGlyZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGlmICgocCA9IHNvYXBfY29va2llKHNvYXAsIG5hbWUsIGRvbWFpbiwgcGF0aCkpKQorICAgIHJldHVybiBwLT5leHBpcmU7CisgIHJldHVybiAtMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZXRfY29va2llX2V4cGlyZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgbG9uZyBleHBpcmUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBpZiAoKHAgPSBzb2FwX2Nvb2tpZShzb2FwLCBuYW1lLCBkb21haW4sIHBhdGgpKSkKKyAgeyBwLT5leHBpcmUgPSBleHBpcmU7CisgICAgcC0+bW9kaWZpZWQgPSAxOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIHJldHVybiBTT0FQX0VSUjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZXRfY29va2llX3Nlc3Npb24oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBpZiAoKHAgPSBzb2FwX2Nvb2tpZShzb2FwLCBuYW1lLCBkb21haW4sIHBhdGgpKSkKKyAgeyBwLT5zZXNzaW9uID0gMTsKKyAgICBwLT5tb2RpZmllZCA9IDE7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgcmV0dXJuIFNPQVBfRVJSOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2Nscl9jb29raWVfc2Vzc2lvbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGlmICgocCA9IHNvYXBfY29va2llKHNvYXAsIG5hbWUsIGRvbWFpbiwgcGF0aCkpKQorICB7IHAtPnNlc3Npb24gPSAwOworICAgIHAtPm1vZGlmaWVkID0gMTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICByZXR1cm4gU09BUF9FUlI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0c2V0Y29va2llcyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBjaGFyICpzLCB0bXBbNDA5Nl07CisgIGNvbnN0IGNoYXIgKnQ7CisgIGZvciAocCA9IHNvYXAtPmNvb2tpZXM7IHA7IHAgPSBwLT5uZXh0KQorICB7IGlmIChwLT5tb2RpZmllZCB8fCAhcC0+ZW52KQorICAgIHsgcyA9IHRtcDsKKyAgICAgIGlmIChwLT5uYW1lKQorICAgICAgICBzICs9IHNvYXBfZW5jb2RlX2Nvb2tpZShwLT5uYW1lLCBzLCB0bXAtcys0MDY0KTsKKyAgICAgIGlmIChwLT52YWx1ZSAmJiAqcC0+dmFsdWUpCisgICAgICB7ICpzKysgPSAnPSc7CisgICAgICAgIHMgKz0gc29hcF9lbmNvZGVfY29va2llKHAtPnZhbHVlLCBzLCB0bXAtcys0MDY0KTsKKyAgICAgIH0KKyAgICAgIGlmIChwLT5kb21haW4gJiYgKGludClzdHJsZW4ocC0+ZG9tYWluKSA8IHRtcC1zKzQwNjQpCisgICAgICAgIHNwcmludGYocywgIjtEb21haW49XCIlc1wiIiwgcC0+ZG9tYWluKTsKKyAgICAgIGVsc2UgaWYgKHNvYXAtPmNvb2tpZV9kb21haW4gJiYgKGludClzdHJsZW4oc29hcC0+Y29va2llX2RvbWFpbikgPCB0bXAtcys0MDY0KQorICAgICAgICBzcHJpbnRmKHMsICI7RG9tYWluPVwiJXNcIiIsIHNvYXAtPmNvb2tpZV9kb21haW4pOworICAgICAgc3RyY2F0KHMsICI7UGF0aD1cIi8iKTsKKyAgICAgIGlmIChwLT5wYXRoKQorICAgICAgICB0ID0gcC0+cGF0aDsKKyAgICAgIGVsc2UKKyAgICAgICAgdCA9IHNvYXAtPmNvb2tpZV9wYXRoOworICAgICAgaWYgKHQpCisgICAgICB7IGlmICgqdCA9PSAnLycpCisgICAgICAgICAgdCsrOworICAgICAgICBpZiAoKGludClzdHJsZW4odCkgPCB0bXAtcys0MDY0KQorICAgICAgICAgIHN0cmNhdChzLCB0KTsKKyAgICAgIH0KKyAgICAgIHMgKz0gc3RybGVuKHMpOworICAgICAgKnMrKyA9ICciJzsKKyAgICAgIGlmIChwLT52ZXJzaW9uID4gMCkKKyAgICAgICAgc3ByaW50ZihzLCAiO1ZlcnNpb249JXUiLCBwLT52ZXJzaW9uKTsKKyAgICAgIGlmIChwLT5leHBpcmUgPj0gMCkKKyAgICAgICAgc3ByaW50ZihzLCAiO01heC1BZ2U9JWxkIiwgcC0+ZXhwaXJlKTsKKyAgICAgIGlmIChwLT5zZWN1cmUpCisgICAgICAgIHN0cmNhdChzLCAiO1NlY3VyZSIpOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTZXQtQ29va2llOiAlc1xuIiwgdG1wKSk7CisgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlNldC1Db29raWUiLCB0bXApKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRjb29raWVzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgsIGludCBzZWN1cmUpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqKnAsICpxOworICB1bnNpZ25lZCBpbnQgdmVyc2lvbiA9IDA7CisgIHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOworICBjaGFyICpzLCB0bXBbNDA5Nl07CisgIHAgPSAmc29hcC0+Y29va2llczsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTZW5kaW5nIGNvb2tpZXMgZm9yIGRvbWFpbj0lcyBwYXRoPSVzXG4iLCBkb21haW4sIHBhdGgpKTsKKyAgaWYgKCpwYXRoID09ICcvJykKKyAgICBwYXRoKys7CisgIHdoaWxlICgocSA9ICpwKSkKKyAgeyBpZiAocS0+ZXhwaXJlICYmIG5vdyA+IHEtPmV4cGlyZSkKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29va2llICVzIGV4cGlyZWRcbiIsIHEtPm5hbWUpKTsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBxLT5uYW1lKTsKKyAgICAgIGlmIChxLT52YWx1ZSkKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHEtPnZhbHVlKTsKKyAgICAgIGlmIChxLT5kb21haW4pCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBxLT5kb21haW4pOworICAgICAgaWYgKHEtPnBhdGgpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBxLT5wYXRoKTsKKyAgICAgICpwID0gcS0+bmV4dDsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBxKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgc2l6ZV90IGRvbWxlbiA9IDA7CisgICAgICBpZiAocS0+ZG9tYWluKQorICAgICAgeyBjb25zdCBjaGFyICpzID0gc3RyY2hyKHEtPmRvbWFpbiwgJzonKTsKKyAgICAgICAgaWYgKHMpCisJICBkb21sZW4gPSBzIC0gcS0+ZG9tYWluOworCWVsc2UKKyAgICAgICAgICBkb21sZW4gPSBzdHJsZW4ocS0+ZG9tYWluKTsKKyAgICAgIH0KKyAgICAgIGlmICgoIXEtPmRvbWFpbiB8fCAhc3RybmNtcChxLT5kb21haW4sIGRvbWFpbiwgZG9tbGVuKSkKKyAgICAgICAgICAmJiAoIXEtPnBhdGggfHwgIXN0cm5jbXAocS0+cGF0aCwgcGF0aCwgc3RybGVuKHEtPnBhdGgpKSkKKyAgICAgICAgICAmJiAoIXEtPnNlY3VyZSB8fCBzZWN1cmUpKQorICAgICAgeyBzID0gdG1wOworICAgICAgICBpZiAocS0+dmVyc2lvbiAhPSB2ZXJzaW9uKQorICAgICAgICB7IHNwcmludGYocywgIiRWZXJzaW9uPSV1OyIsIHEtPnZlcnNpb24pOworICAgICAgICAgIHZlcnNpb24gPSBxLT52ZXJzaW9uOworICAgICAgICB9CisgICAgICAgIGlmIChxLT5uYW1lKQorICAgICAgICAgIHMgKz0gc29hcF9lbmNvZGVfY29va2llKHEtPm5hbWUsIHMsIHRtcC1zKzQwODApOworICAgICAgICBpZiAocS0+dmFsdWUgJiYgKnEtPnZhbHVlKQorICAgICAgICB7ICpzKysgPSAnPSc7CisgICAgICAgICAgcyArPSBzb2FwX2VuY29kZV9jb29raWUocS0+dmFsdWUsIHMsIHRtcC1zKzQwODApOworICAgICAgICB9CisgICAgICAgIGlmIChxLT5wYXRoICYmIChpbnQpc3RybGVuKHEtPnBhdGgpIDwgdG1wLXMrNDA4MCkKKyAgICAgICAgeyBzcHJpbnRmKHMsICI7JFBhdGg9XCIvJXNcIiIsICgqcS0+cGF0aCA9PSAnLycgPyBxLT5wYXRoICsgMSA6IHEtPnBhdGgpKTsKKyAgICAgICAgICBzICs9IHN0cmxlbihzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocS0+ZG9tYWluICYmIChpbnQpc3RybGVuKHEtPmRvbWFpbikgPCB0bXAtcys0MDgwKQorICAgICAgICAgIHNwcmludGYocywgIjskRG9tYWluPVwiJXNcIiIsIHEtPmRvbWFpbik7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29va2llOiAlc1xuIiwgdG1wKSk7CisgICAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQ29va2llIiwgdG1wKSkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgICAgcCA9ICZxLT5uZXh0OworICAgIH0KKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0Y29va2llcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdmFsKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnAgPSBOVUxMLCAqcTsKKyAgY29uc3QgY2hhciAqczsKKyAgY2hhciAqdCwgdG1wWzQwOTZdOyAvKiBjb29raWUgc2l6ZSBpcyB1cCB0byA0MDk2IGJ5dGVzIFtSRkMyMTA5XSAqLworICBjaGFyICpkb21haW4gPSBOVUxMOworICBjaGFyICpwYXRoID0gTlVMTDsKKyAgdW5zaWduZWQgaW50IHZlcnNpb24gPSAwOworICB0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKKyAgaWYgKCF2YWwpCisgICAgcmV0dXJuOworICBzID0gdmFsOworICB3aGlsZSAoKnMpCisgIHsgcyA9IHNvYXBfZGVjb2RlX2tleSh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICBpZiAoIXNvYXBfdGFnX2NtcCh0bXAsICIkVmVyc2lvbiIpKQorICAgIHsgaWYgKChzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpKSkKKyAgICAgIHsgaWYgKHApCisgICAgICAgICAgcC0+dmVyc2lvbiA9IChpbnQpYXRvbCh0bXApOworICAgICAgICBlbHNlCisgICAgICAgICAgdmVyc2lvbiA9IChpbnQpYXRvbCh0bXApOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHRtcCwgIiRQYXRoIikpCisgICAgeyBzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgICAgaWYgKCp0bXApCisgICAgICB7IGlmICgodCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4odG1wKSsxKSkpCisgICAgICAgICAgc3RyY3B5KHQsIHRtcCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHQgPSBOVUxMOworICAgICAgaWYgKHApCisgICAgICB7IGlmIChwLT5wYXRoKQorICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5wYXRoKTsKKyAgICAgICAgcC0+cGF0aCA9IHQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IGlmIChwYXRoKQorICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwYXRoKTsKKyAgICAgICAgcGF0aCA9IHQ7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAodG1wLCAiJERvbWFpbiIpKQorICAgIHsgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgIGlmICgqdG1wKQorICAgICAgeyBpZiAoKHQgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHRtcCkrMSkpKQorICAgICAgICAgIHN0cmNweSh0LCB0bXApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB0ID0gTlVMTDsKKyAgICAgIGlmIChwKQorICAgICAgeyBpZiAocC0+ZG9tYWluKQorICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5kb21haW4pOworCXAtPmRvbWFpbiA9IHQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IGlmIChkb21haW4pCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIGRvbWFpbik7CisgICAgICAgIGRvbWFpbiA9IHQ7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHAgJiYgIXNvYXBfdGFnX2NtcCh0bXAsICJQYXRoIikpCisgICAgeyBpZiAocC0+cGF0aCkKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnBhdGgpOworICAgICAgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgIGlmICgqdG1wKQorICAgICAgeyBpZiAoKHAtPnBhdGggPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHRtcCkrMSkpKQorICAgICAgICAgIHN0cmNweShwLT5wYXRoLCB0bXApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBwLT5wYXRoID0gTlVMTDsKKyAgICB9CisgICAgZWxzZSBpZiAocCAmJiAhc29hcF90YWdfY21wKHRtcCwgIkRvbWFpbiIpKQorICAgIHsgaWYgKHAtPmRvbWFpbikKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPmRvbWFpbik7CisgICAgICBzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgICAgaWYgKCp0bXApCisgICAgICB7IGlmICgocC0+ZG9tYWluID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbih0bXApKzEpKSkKKyAgICAgICAgICBzdHJjcHkocC0+ZG9tYWluLCB0bXApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBwLT5kb21haW4gPSBOVUxMOworICAgIH0KKyAgICBlbHNlIGlmIChwICYmICFzb2FwX3RhZ19jbXAodG1wLCAiVmVyc2lvbiIpKQorICAgIHsgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgIHAtPnZlcnNpb24gPSAodW5zaWduZWQgaW50KWF0b2wodG1wKTsKKyAgICB9CisgICAgZWxzZSBpZiAocCAmJiAhc29hcF90YWdfY21wKHRtcCwgIk1heC1BZ2UiKSkKKyAgICB7IHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICBwLT5leHBpcmUgPSBub3cgKyBhdG9sKHRtcCk7CisgICAgfQorICAgIGVsc2UgaWYgKHAgJiYgIXNvYXBfdGFnX2NtcCh0bXAsICJFeHBpcmVzIikpCisgICAgeyBzdHJ1Y3QgdG0gVDsKKyAgICAgIGNoYXIgYVszXTsgCisgICAgICBzdGF0aWMgY29uc3QgY2hhciBtbnNbXSA9ICJhbmViYXJwcmF5dW51bHVnZXBjdG92ZWMiOworICAgICAgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgIGlmIChzdHJsZW4odG1wKSA+IDIwKQorICAgICAgeyBtZW1zZXQoKHZvaWQqKSZULCAwLCBzaXplb2YoVCkpOworICAgICAgICBhWzBdID0gdG1wWzRdOworICAgICAgICBhWzFdID0gdG1wWzVdOworICAgICAgICBhWzJdID0gJ1wwJzsKKyAgICAgICAgVC50bV9tZGF5ID0gKGludClhdG9sKGEpOworICAgICAgICBhWzBdID0gdG1wWzhdOworICAgICAgICBhWzFdID0gdG1wWzldOworICAgICAgICBULnRtX21vbiA9IChzdHJzdHIobW5zLCBhKSAtIG1ucykgLyAyOworICAgICAgICBhWzBdID0gdG1wWzExXTsKKyAgICAgICAgYVsxXSA9IHRtcFsxMl07CisgICAgICAgIFQudG1feWVhciA9IDEwMCArIChpbnQpYXRvbChhKTsKKyAgICAgICAgYVswXSA9IHRtcFsxM107CisgICAgICAgIGFbMV0gPSB0bXBbMTRdOworICAgICAgICBULnRtX2hvdXIgPSAoaW50KWF0b2woYSk7CisgICAgICAgIGFbMF0gPSB0bXBbMTZdOworICAgICAgICBhWzFdID0gdG1wWzE3XTsKKyAgICAgICAgVC50bV9taW4gPSAoaW50KWF0b2woYSk7CisgICAgICAgIGFbMF0gPSB0bXBbMTldOworICAgICAgICBhWzFdID0gdG1wWzIwXTsKKyAgICAgICAgVC50bV9zZWMgPSAoaW50KWF0b2woYSk7CisgICAgICAgIHAtPmV4cGlyZSA9IHNvYXBfdGltZWdtKCZUKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAocCAmJiAhc29hcF90YWdfY21wKHRtcCwgIlNlY3VyZSIpKQorICAgICAgcC0+c2VjdXJlID0gMTsKKyAgICBlbHNlCisgICAgeyBpZiAocCkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHb3QgZW52aXJvbm1lbnQgY29va2llICVzPSVzIGRvbWFpbj0lcyBwYXRoPSVzIGV4cGlyZT0lbGQgc2VjdXJlPSVkXG4iLCBwLT5uYW1lLCBwLT52YWx1ZT9wLT52YWx1ZToiIiwgcC0+ZG9tYWluP3AtPmRvbWFpbjoiIiwgcC0+cGF0aD9wLT5wYXRoOiIiLCBwLT5leHBpcmUsIHAtPnNlY3VyZSkpOworICAgICAgICBpZiAoKHEgPSBzb2FwX3NldF9jb29raWUoc29hcCwgcC0+bmFtZSwgcC0+dmFsdWUsIHAtPmRvbWFpbiwgcC0+cGF0aCkpKQorICAgICAgICB7IHEtPnZlcnNpb24gPSBwLT52ZXJzaW9uOworICAgICAgICAgIHEtPmV4cGlyZSA9IHAtPmV4cGlyZTsKKyAgICAgICAgICBxLT5zZWN1cmUgPSBwLT5zZWN1cmU7CisgICAgICAgICAgcS0+ZW52ID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAocC0+bmFtZSkKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+bmFtZSk7CisgICAgICAgIGlmIChwLT52YWx1ZSkKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+dmFsdWUpOworICAgICAgICBpZiAocC0+ZG9tYWluKQorICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5kb21haW4pOworICAgICAgICBpZiAocC0+cGF0aCkKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+cGF0aCk7CisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwKTsKKyAgICAgIH0KKyAgICAgIGlmICgocCA9IChzdHJ1Y3Qgc29hcF9jb29raWUqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9jb29raWUpKSkpCisgICAgICB7IHAtPm5hbWUgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHRtcCkrMSk7CisgICAgICAgIHN0cmNweShwLT5uYW1lLCB0bXApOworICAgICAgICBzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgICAgICBpZiAoKnRtcCkKKyAgICAgICAgeyBwLT52YWx1ZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4odG1wKSsxKTsKKyAgICAgICAgICBzdHJjcHkocC0+dmFsdWUsIHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHAtPnZhbHVlID0gTlVMTDsKKyAgICAgICAgcC0+ZG9tYWluID0gZG9tYWluOworICAgICAgICBwLT5wYXRoID0gcGF0aDsKKyAgICAgICAgcC0+ZXhwaXJlID0gMDsKKyAgICAgICAgcC0+c2VjdXJlID0gMDsKKyAgICAgICAgcC0+dmVyc2lvbiA9IHZlcnNpb247CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChwKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR290IGVudmlyb25tZW50IGNvb2tpZSAlcz0lcyBkb21haW49JXMgcGF0aD0lcyBleHBpcmU9JWxkIHNlY3VyZT0lZFxuIiwgcC0+bmFtZSwgcC0+dmFsdWU/cC0+dmFsdWU6IiIsIHAtPmRvbWFpbj9wLT5kb21haW46IiIsIHAtPnBhdGg/cC0+cGF0aDoiIiwgcC0+ZXhwaXJlLCBwLT5zZWN1cmUpKTsKKyAgICBpZiAoKHEgPSBzb2FwX3NldF9jb29raWUoc29hcCwgcC0+bmFtZSwgcC0+dmFsdWUsIHAtPmRvbWFpbiwgcC0+cGF0aCkpKQorICAgIHsgcS0+dmVyc2lvbiA9IHAtPnZlcnNpb247CisgICAgICBxLT5leHBpcmUgPSBwLT5leHBpcmU7CisgICAgICBxLT5zZWN1cmUgPSBwLT5zZWN1cmU7CisgICAgICBxLT5lbnYgPSAxOworICAgIH0KKyAgICBpZiAocC0+bmFtZSkKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5uYW1lKTsKKyAgICBpZiAocC0+dmFsdWUpCisgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+dmFsdWUpOworICAgIGlmIChwLT5kb21haW4pCisgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+ZG9tYWluKTsKKyAgICBpZiAocC0+cGF0aCkKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5wYXRoKTsKKyAgICBTT0FQX0ZSRUUoc29hcCwgcCk7CisgIH0KKyAgaWYgKGRvbWFpbikKKyAgICBTT0FQX0ZSRUUoc29hcCwgZG9tYWluKTsKKyAgaWYgKHBhdGgpCisgICAgU09BUF9GUkVFKHNvYXAsIHBhdGgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldGVudl9jb29raWVzKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGNvbnN0IGNoYXIgKnM7CisgIGNoYXIga2V5WzQwOTZdLCB2YWxbNDA5Nl07IC8qIGNvb2tpZSBzaXplIGlzIHVwIHRvIDQwOTYgYnl0ZXMgW1JGQzIxMDldICovCisgIGlmICghKHMgPSBnZXRlbnYoIkhUVFBfQ09PS0lFIikpKQorICAgIHJldHVybiBTT0FQX0VSUjsKKyAgZG8KKyAgeyBzID0gc29hcF9kZWNvZGVfa2V5KGtleSwgc2l6ZW9mKGtleSksIHMpOworICAgIHMgPSBzb2FwX2RlY29kZV92YWwodmFsLCBzaXplb2YodmFsKSwgcyk7CisgICAgcCA9IHNvYXBfc2V0X2Nvb2tpZShzb2FwLCBrZXksIHZhbCwgTlVMTCwgTlVMTCk7CisgICAgaWYgKHApCisgICAgICBwLT5lbnYgPSAxOworICB9IHdoaWxlICgqcyk7CisgIHJldHVybiBTT0FQX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQorc3RydWN0IHNvYXBfY29va2llKgorU09BUF9GTUFDMgorc29hcF9jb3B5X2Nvb2tpZXMoc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcCwgKipxLCAqcjsKKyAgcSA9ICZyOworICBmb3IgKHAgPSBzb2FwLT5jb29raWVzOyBwOyBwID0gcC0+bmV4dCkKKyAgeyBpZiAoISgqcSA9IChzdHJ1Y3Qgc29hcF9jb29raWUqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9jb29raWUpKSkpCisgICAgICByZXR1cm4gcjsKKyAgICAqKnEgPSAqcDsKKyAgICBpZiAocC0+bmFtZSkKKyAgICB7IGlmICgoKCpxKS0+bmFtZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4ocC0+bmFtZSkrMSkpKQorICAgICAgICBzdHJjcHkoKCpxKS0+bmFtZSwgcC0+bmFtZSk7CisgICAgfQorICAgIGlmIChwLT52YWx1ZSkKKyAgICB7IGlmICgoKCpxKS0+dmFsdWUgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHAtPnZhbHVlKSsxKSkpCisgICAgICAgIHN0cmNweSgoKnEpLT52YWx1ZSwgcC0+dmFsdWUpOworICAgIH0KKyAgICBpZiAocC0+ZG9tYWluKQorICAgIHsgaWYgKCgoKnEpLT5kb21haW4gPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHAtPmRvbWFpbikrMSkpKQorICAgICAgICBzdHJjcHkoKCpxKS0+ZG9tYWluLCBwLT5kb21haW4pOworICAgIH0KKyAgICBpZiAocC0+cGF0aCkKKyAgICB7IGlmICgoKCpxKS0+cGF0aCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4ocC0+cGF0aCkrMSkpKQorICAgICAgICBzdHJjcHkoKCpxKS0+cGF0aCwgcC0+cGF0aCk7CisgICAgfQorICAgIHEgPSAmKCpxKS0+bmV4dDsKKyAgfQorICAqcSA9IE5VTEw7CisgIHJldHVybiByOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9mcmVlX2Nvb2tpZXMoc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgZm9yIChwID0gc29hcC0+Y29va2llczsgcDsgcCA9IHNvYXAtPmNvb2tpZXMpCisgIHsgc29hcC0+Y29va2llcyA9IHAtPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIHAtPm5hbWUpOworICAgIGlmIChwLT52YWx1ZSkKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT52YWx1ZSk7CisgICAgaWYgKHAtPmRvbWFpbikKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5kb21haW4pOworICAgIGlmIChwLT5wYXRoKQorICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnBhdGgpOworICAgIFNPQVBfRlJFRShzb2FwLCBwKTsKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2VuZGlmIC8qIFdJVEhfQ09PS0lFUyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFdJVEhfR1pJUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NvYXBfZ2V0Z3ppcGhkcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaW50IGk7CisgIHNvYXBfd2NoYXIgYywgZiA9IDA7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR2V0IGd6aXAgaGVhZGVyXG4iKSk7CisgIGZvciAoaSA9IDA7IGkgPCA5OyBpKyspCisgIHsgaWYgKChpbnQpKGMgPSBzb2FwX2dldDEoc29hcCkgPT0gRU9GKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgIGlmIChpID09IDIpCisgICAgICBmID0gYzsKKyAgfQorICBpZiAoZiAmIDB4MDQpIC8qIEZFWFRSQSAqLworICB7IGZvciAoaSA9IHNvYXBfZ2V0MShzb2FwKSB8IChzb2FwX2dldDEoc29hcCkgPDwgOCk7IGk7IGktLSkKKyAgICAgIGlmICgoaW50KXNvYXBfZ2V0MShzb2FwKSA9PSBFT0YpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICB9CisgIGlmIChmICYgMHgwOCkgLyogRk5BTUUgKi8KKyAgICBkbworICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICB3aGlsZSAoYyAmJiAoaW50KWMgIT0gRU9GKTsKKyAgaWYgKChpbnQpYyAhPSBFT0YgJiYgKGYgJiAweDEwKSkgLyogRkNPTU1FTlQgKi8KKyAgICBkbworICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICB3aGlsZSAoYyAmJiAoaW50KWYgIT0gRU9GKTsKKyAgaWYgKChpbnQpYyAhPSBFT0YgJiYgKGYgJiAweDAxKSkgLyogRkhDUkMgKi8KKyAgeyBpZiAoKGludCkoYyA9IHNvYXBfZ2V0MShzb2FwKSkgIT0gRU9GKQorICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgfQorICBpZiAoKGludCljID09IEVPRikKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9iZWdpbl9yZWN2KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwX3djaGFyIGM7CisgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgc29hcF9mcmVlKHNvYXApOworICBzb2FwX3NldF9sb2NhbF9uYW1lc3BhY2VzKHNvYXApOworICBzb2FwLT52ZXJzaW9uID0gMDsJLyogZG9uJ3QgYXNzdW1lIHdlJ3JlIHBhcnNpbmcgU09BUCBjb250ZW50IGJ5IGRlZmF1bHQgKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgIHNvYXBfZnJlZV9paHQoc29hcCk7CisjZW5kaWYKKyAgaWYgKChzb2FwLT5pbW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgICAgc29hcC0+b21vZGUgfD0gU09BUF9JT19DSFVOSzsKKyAgc29hcC0+aW1vZGUgJj0gflNPQVBfSU87CisgIHNvYXAtPm1vZGUgPSBzb2FwLT5pbW9kZTsKKyAgaWYgKCFzb2FwLT5rZWVwX2FsaXZlKQorICB7IHNvYXAtPmJ1ZmxlbiA9IDA7CisgICAgc29hcC0+YnVmaWR4ID0gMDsKKyAgfQorICBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9JT19LRUVQQUxJVkUpKQorICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOworICBzb2FwLT5haGVhZCA9IDA7CisgIHNvYXAtPnBlZWtlZCA9IDA7CisgIHNvYXAtPmxldmVsID0gMDsKKyAgc29hcC0+cGFydCA9IFNPQVBfQkVHSU47CisgIHNvYXAtPmFsbG9jZWQgPSAwOworICBzb2FwLT5jb3VudCA9IDA7CisgIHNvYXAtPmxlbmd0aCA9IDA7CisgIHNvYXAtPmNkYXRhID0gMDsKKyAgKnNvYXAtPmVuZHBvaW50ID0gJ1wwJzsKKyAgc29hcC0+YWN0aW9uID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcC0+ZG9tID0gTlVMTDsKKyAgc29hcC0+ZGltZS5jaHVua3NpemUgPSAwOworICBzb2FwLT5kaW1lLmJ1ZmxlbiA9IDA7CisgIHNvYXAtPmRpbWUubGlzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmxhc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmxpc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5sYXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5ib3VuZGFyeSA9IE5VTEw7CisgIHNvYXAtPm1pbWUuc3RhcnQgPSBOVUxMOworICBzb2FwLT54bGlzdCA9IE5VTEw7CisjZW5kaWYKKyNpZmRlZiBXSU4zMgorI2lmbmRlZiBVTkRFUl9DRQorI2lmbmRlZiBXSVRIX0ZBU1RDR0kKKyAgaWYgKCFzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorI2lmZGVmIF9fQk9STEFORENfXworICAgIHNldG1vZGUoKFNPQVBfU09DS0VUKXNvYXAtPnJlY3ZmZCwgT19CSU5BUlkpOworI2Vsc2UKKyAgICBfc2V0bW9kZSgoU09BUF9TT0NLRVQpc29hcC0+cmVjdmZkLCBfT19CSU5BUlkpOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgV0lUSF9aTElCCisgIHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX1pMSUI7CisgIHNvYXAtPnpsaWJfaW4gPSBTT0FQX1pMSUJfTk9ORTsKKyAgc29hcC0+emxpYl9vdXQgPSBTT0FQX1pMSUJfTk9ORTsKKyAgc29hcC0+ZF9zdHJlYW0ubmV4dF9pbiA9IFpfTlVMTDsKKyAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4gPSAwOworICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IChCeXRlKilzb2FwLT5idWY7CisgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCA9IFNPQVBfQlVGTEVOOworICBzb2FwLT56X3JhdGlvX2luID0gMS4wOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5mcHJlcGFyZWluaXQpCisgICAgc29hcC0+ZnByZXBhcmVpbml0KHNvYXApOworI2VuZGlmCisgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisjaWZkZWYgV0lUSF9HWklQCisgIGlmIChjID09IDB4MUYpCisgIHsgaWYgKHNvYXBfZ2V0Z3ppcGhkcihzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAoaW5mbGF0ZUluaXQyKCZzb2FwLT5kX3N0cmVhbSwgLU1BWF9XQklUUykgIT0gWl9PSykKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX0lORkxBVEU7CisgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19aTElCOworICAgIHNvYXAtPnpsaWJfaW4gPSBTT0FQX1pMSUJfR1pJUDsKKyAgICBzb2FwLT56X2NyYyA9IGNyYzMyKDBMLCBOVUxMLCAwKTsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImd6aXAgaW5pdGlhbGl6ZWRcbiIpKTsKKyAgICBtZW1jcHkoc29hcC0+el9idWYsIHNvYXAtPmJ1ZiwgU09BUF9CVUZMRU4pOworICAgIC8qIHNob3VsZCBub3QgY2h1bmsgb3ZlciBwbGFpbiB0cmFuc3BvcnQsIHNvIHdoeSBib3RoZXIgdG8gY2hlY2s/ICovCisgICAgLyogaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykgKi8KKyAgICAvKiAgIHNvYXAtPnpfYnVmbGVuID0gc29hcC0+YnVmaWR4OyAqLworICAgIC8qIGVsc2UgKi8KKyAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X2luID0gKEJ5dGUqKShzb2FwLT56X2J1ZiArIHNvYXAtPmJ1ZmlkeCk7CisgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4gPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgc29hcC0+el9idWZsZW4gPSBzb2FwLT5idWZsZW47CisgICAgc29hcC0+YnVmbGVuID0gc29hcC0+YnVmaWR4OworICAgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgIH0gIAorI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChjID09ICctJyAmJiBzb2FwX2dldDAoc29hcCkgPT0gJy0nKQorICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfTUlNRTsKKyAgZWxzZSBpZiAoKGMgJiAweEZGRkMpID09IChTT0FQX0RJTUVfVkVSU0lPTiB8IFNPQVBfRElNRV9NQikgJiYgKHNvYXBfZ2V0MChzb2FwKSAmIDB4RkZGMCkgPT0gMHgyMCkKKyAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX0RJTUU7CisgIGVsc2UKKyNlbmRpZgorICB7IHdoaWxlIChzb2FwX2JsYW5rKGMpKQorICAgICAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgfQorICBpZiAoKGludCljID09IEVPRikKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgc29hcF91bmdldChzb2FwLCBjKTsKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyAgLyogaWYgbm90IFhNTCBvciAoc3RhcnQgb2YpQk9NIG9yIE1JTUUvRElNRS9aTElCLCBhc3N1bWUgSFRUUCBoZWFkZXIgKi8KKyAgaWYgKGMgIT0gJzwnICYmIGMgIT0gMHhFRiAmJiAhKHNvYXAtPm1vZGUgJiAoU09BUF9FTkNfTUlNRSB8IFNPQVBfRU5DX0RJTUUgfCBTT0FQX0VOQ19aTElCKSkpCisgIHsgc29hcC0+bW9kZSAmPSB+U09BUF9JTzsKKyAgICBzb2FwLT5lcnJvciA9IHNvYXAtPmZwYXJzZShzb2FwKTsKKyAgICBpZiAoc29hcC0+ZXJyb3IgJiYgc29hcC0+ZXJyb3IgPCBTT0FQX1NUT1ApCisgICAgeyBzb2FwLT5rZWVwX2FsaXZlID0gMDsgLyogZm9yY2UgY2xvc2UgbGF0ZXIgKi8KKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgICB7IHNvYXAtPmNodW5rYnVmbGVuID0gc29hcC0+YnVmbGVuOworICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+YnVmaWR4OworICAgICAgc29hcC0+Y2h1bmtzaXplID0gMDsKKyAgICB9CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgICAgZWxzZSBpZiAoc29hcC0+ZnByZXBhcmVyZWN2ICYmIHNvYXAtPmJ1ZmxlbiAhPSBzb2FwLT5idWZpZHgpCisgICAgICBzb2FwLT5mcHJlcGFyZXJlY3Yoc29hcCwgc29hcC0+YnVmICsgc29hcC0+YnVmaWR4LCBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHgpOworI2VuZGlmCisjaWZkZWYgV0lUSF9aTElCCisgICAgaWYgKHNvYXAtPnpsaWJfaW4gIT0gU09BUF9aTElCX05PTkUpCisgICAgeyAvKiBmcGFyc2Ugc2hvdWxkIG5vdCB1c2Ugc29hcF91bmdldCB0byBwdXNoIGJhY2sgbGFzdCBjaGFyICovCisjaWZkZWYgV0lUSF9HWklQCisgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgaWYgKGMgPT0gMHgxRikKKyAgICAgIHsgaWYgKHNvYXBfZ2V0Z3ppcGhkcihzb2FwKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIGlmIChpbmZsYXRlSW5pdDIoJnNvYXAtPmRfc3RyZWFtLCAtTUFYX1dCSVRTKSAhPSBaX09LKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICAgICAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9JTkZMQVRFOworICAgICAgICBzb2FwLT56X2NyYyA9IGNyYzMyKDBMLCBOVUxMLCAwKTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJnemlwIGluaXRpYWxpemVkXG4iKSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IHNvYXBfcmV2Z2V0MShzb2FwKTsKKyNlbHNlCisgICAgICB7CisjZW5kaWYKKyAgICAgICAgaWYgKGluZmxhdGVJbml0KCZzb2FwLT5kX3N0cmVhbSkgIT0gWl9PSykKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgICAgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfSU5GTEFURTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbmZsYXRlIGluaXRpYWxpemVkXG4iKSk7CisgICAgICB9CisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX1pMSUI7CisgICAgICBtZW1jcHkoc29hcC0+el9idWYsIHNvYXAtPmJ1ZiwgU09BUF9CVUZMRU4pOworICAgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9pbiA9IChCeXRlKikoc29hcC0+el9idWYgKyBzb2FwLT5idWZpZHgpOworICAgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4gPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgICBzb2FwLT56X2J1ZmxlbiA9IHNvYXAtPmJ1ZmxlbjsKKyAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmJ1ZmlkeDsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoc29hcC0+ZXJyb3IpCisgICAgeyBpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9GT1JNICYmIHNvYXAtPmZmb3JtKQorICAgICAgeyBzb2FwLT5lcnJvciA9IHNvYXAtPmZmb3JtKHNvYXApOworICAgICAgICBpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9PSykKKyAgICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfU1RPUDsgLyogcHJldmVudHMgZnVydGhlciBwcm9jZXNzaW5nICovCisgICAgICB9CisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICB9CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKQorICB7IGlmIChzb2FwX2dldG1pbWVoZHIoc29hcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgc29hcC0+bWltZS5maXJzdC0+dHlwZSwgImFwcGxpY2F0aW9uL2RpbWUiKSkKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfRElNRTsKKyAgfQorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpCisgIHsgaWYgKHNvYXBfZ2V0ZGltZWhkcihzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAoc29hcC0+ZGltZS5mbGFncyAmIFNPQVBfRElNRV9DRikKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ2h1bmtlZCBESU1FIFNPQVAgbWVzc2FnZVxuIikpOworICAgICAgc29hcC0+ZGltZS5jaHVua3NpemUgPSBzb2FwLT5kaW1lLnNpemU7CisgICAgICBpZiAoc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4ID49IHNvYXAtPmRpbWUuY2h1bmtzaXplKQorICAgICAgeyBzb2FwLT5kaW1lLmJ1ZmxlbiA9IHNvYXAtPmJ1ZmxlbjsKKyAgICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+YnVmaWR4ICsgc29hcC0+ZGltZS5jaHVua3NpemU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHNvYXAtPmRpbWUuY2h1bmtzaXplIC09IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICB9CisgICAgc29hcC0+Y291bnQgPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgIH0KKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK2h0dHBfcGFyc2Uoc3RydWN0IHNvYXAgKnNvYXApCit7IGNoYXIgaGVhZGVyW1NPQVBfSERSTEVOXSwgKnM7CisgIHVuc2lnbmVkIHNob3J0IGdldCA9IDAsIHN0YXR1cyA9IDAsIGsgPSAwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIldhaXRpbmcgZm9yIEhUVFAgcmVxdWVzdC9yZXNwb25zZS4uLlxuIikpOworICAqc29hcC0+ZW5kcG9pbnQgPSAnXDAnOworICBzb2FwLT5sZW5ndGggPSAwOworICBzb2FwLT51c2VyaWQgPSBOVUxMOworICBzb2FwLT5wYXNzd2QgPSBOVUxMOworICBzb2FwLT5hY3Rpb24gPSBOVUxMOworICBzb2FwLT5hdXRocmVhbG0gPSBOVUxMOworICBkbworICB7IGlmIChzb2FwX2dldGxpbmUoc29hcCwgc29hcC0+bXNnYnVmLCBzaXplb2Yoc29hcC0+bXNnYnVmKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkhUVFAgc3RhdHVzOiAlc1xuIiwgc29hcC0+bXNnYnVmKSk7CisgICAgZm9yICg7OykKKyAgICB7IGlmIChzb2FwX2dldGxpbmUoc29hcCwgaGVhZGVyLCBTT0FQX0hEUkxFTikpCisgICAgICB7IGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX0VPRikKKwl7IHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgICAgICAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiRU9GIGluIEhUVFAgaGVhZGVyLCBjb250aW51ZSBhbnl3YXlcbiIpKTsKKwkgIGJyZWFrOworCX0KKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgICAgaWYgKCEqaGVhZGVyKQorICAgICAgICBicmVhazsKKyAgICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJIVFRQIGhlYWRlcjogJXNcbiIsIGhlYWRlcikpOworICAgICAgcyA9IHN0cmNocihoZWFkZXIsICc6Jyk7CisgICAgICBpZiAocykKKyAgICAgIHsgKnMgPSAnXDAnOworICAgICAgICBkbyBzKys7CisgICAgICAgIHdoaWxlICgqcyAmJiAqcyA8PSAzMik7CisgICAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcGFyc2VoZHIoc29hcCwgaGVhZGVyLCBzKSkpCisgICAgICAgIHsgaWYgKHNvYXAtPmVycm9yIDwgU09BUF9TVE9QKQorCSAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisJICBzdGF0dXMgPSBzb2FwLT5lcnJvcjsKKwkgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAoKHMgPSBzdHJjaHIoc29hcC0+bXNnYnVmLCAnICcpKSkKKyAgICB7IGsgPSAodW5zaWduZWQgc2hvcnQpc29hcF9zdHJ0b3VsKHMsICZzLCAxMCk7CisgICAgICBpZiAoIXNvYXBfYmxhbmsoKnMpKQorICAgICAgICBrID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgICAgayA9IDA7CisgIH0gd2hpbGUgKGsgPT0gMTAwKTsKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZpbmlzaGVkIEhUVFAgaGVhZGVyIHBhcnNpbmdcbiIpKTsKKyAgcyA9IHN0cnN0cihzb2FwLT5tc2didWYsICJIVFRQLyIpOworICBpZiAocyAmJiBzWzddICE9ICcxJykKKyAgeyBpZiAoc29hcC0+a2VlcF9hbGl2ZSA9PSAxKQorICAgICAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7CisgICAgaWYgKGsgPT0gMCAmJiAoc29hcC0+b21vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKSAvKiBrID09IDAgZm9yIEhUVFAgcmVxdWVzdCAqLworICAgIHsgc29hcC0+aW1vZGUgfD0gU09BUF9JT19DSFVOSzsKKyAgICAgIHNvYXAtPm9tb2RlID0gKHNvYXAtPm9tb2RlICYgflNPQVBfSU8pIHwgU09BUF9JT19TVE9SRTsKKyAgICB9CisgIH0KKyAgaWYgKHNvYXAtPmtlZXBfYWxpdmUgPCAwKQorICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAxOworICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiS2VlcCBhbGl2ZSBjb25uZWN0aW9uID0gJWRcbiIsIHNvYXAtPmtlZXBfYWxpdmUpKTsKKyAgaWYgKHMgJiYgKCgoZ2V0ID0gIXN0cm5jbXAoc29hcC0+bXNnYnVmLCAiR0VUICIsIDQpKSkgfHwgIXN0cm5jbXAoc29hcC0+bXNnYnVmLCAiUE9TVCAiLCA1KSkpCisgIHsgc2l6ZV90IG0gPSBzdHJsZW4oc29hcC0+ZW5kcG9pbnQpOworICAgIHNpemVfdCBuID0gbSArIChzIC0gc29hcC0+bXNnYnVmKSAtIDUgLSAoIWdldCk7CisgICAgaWYgKG4gPj0gc2l6ZW9mKHNvYXAtPmVuZHBvaW50KSkKKyAgICAgIG4gPSBzaXplb2Yoc29hcC0+ZW5kcG9pbnQpIC0gMTsKKyAgICBzdHJuY3B5KHNvYXAtPnBhdGgsIHNvYXAtPm1zZ2J1ZiArIDQgKyAoIWdldCksIG4gLSBtKTsKKyAgICBzb2FwLT5wYXRoW24gLSBtXSA9ICdcMCc7CisgICAgc3RyY2F0KHNvYXAtPmVuZHBvaW50LCBzb2FwLT5wYXRoKTsKKyAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiVGFyZ2V0IGVuZHBvaW50PSclcydcbiIsIHNvYXAtPmVuZHBvaW50KSk7CisgICAgaWYgKGdldCkKKyAgICB7IHNvYXAtPmVycm9yID0gc29hcC0+ZmdldChzb2FwKTsKKyAgICAgIGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX09LKQorICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfU1RPUDsgLyogcHJldmVudHMgZnVydGhlciBwcm9jZXNzaW5nICovCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIGlmIChzdGF0dXMpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBzdGF0dXM7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgaWYgKGsgPT0gMCB8fCAoayA+PSAyMDAgJiYgayA8PSAyOTkpIHx8IGsgPT0gNDAwIHx8IGsgPT0gNTAwKQorICAgIHJldHVybiBTT0FQX09LOworICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiSFRUUCBlcnJvciAlZFxuIiwgaykpOworICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIkhUVFAgZXJyb3IiLCBzb2FwLT5tc2didWYsIGspOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50CitodHRwX3BhcnNlX2hlYWRlcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWwpCit7IGlmICghc29hcF90YWdfY21wKGtleSwgIkhvc3QiKSkKKyAgeyAKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICBpZiAoc29hcC0+aW1vZGUgJiBTT0FQX0VOQ19TU0wpCisgICAgICBzdHJjcHkoc29hcC0+ZW5kcG9pbnQsICJodHRwczovLyIpOworICAgIGVsc2UKKyNlbmRpZgorICAgICAgc3RyY3B5KHNvYXAtPmVuZHBvaW50LCAiaHR0cDovLyIpOworICAgIHN0cm5jYXQoc29hcC0+ZW5kcG9pbnQsIHZhbCwgc2l6ZW9mKHNvYXAtPmVuZHBvaW50KSAtIDgpOworICAgIHNvYXAtPmVuZHBvaW50W3NpemVvZihzb2FwLT5lbmRwb2ludCkgLSAxXSA9ICdcMCc7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LVR5cGUiKSkKKyAgeyBpZiAoc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwsICJhcHBsaWNhdGlvbi9kaW1lIikpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX0RJTUU7CisgICAgZWxzZSBpZiAoc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwsICJtdWx0aXBhcnQvcmVsYXRlZCIpCisgICAgICAgICAgfHwgc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwsICJtdWx0aXBhcnQvZm9ybS1kYXRhIikpCisgICAgeyBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gc29hcF9zdHJkdXAoc29hcCwgc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwsICJib3VuZGFyeSIpKTsKKyAgICAgIHNvYXAtPm1pbWUuc3RhcnQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCwgInN0YXJ0IikpOworICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19NSU1FOworICAgIH0KKyAgfQorI2VuZGlmCisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1MZW5ndGgiKSkKKyAgICBzb2FwLT5sZW5ndGggPSBzb2FwX3N0cnRvdWwodmFsLCBOVUxMLCAxMCk7CisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1FbmNvZGluZyIpKQorICB7IGlmICghc29hcF90YWdfY21wKHZhbCwgImRlZmxhdGUiKSkKKyNpZmRlZiBXSVRIX1pMSUIKKyAgICAgIHNvYXAtPnpsaWJfaW4gPSBTT0FQX1pMSUJfREVGTEFURTsKKyNlbHNlCisgICAgICByZXR1cm4gU09BUF9aTElCX0VSUk9SOworI2VuZGlmCisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcCh2YWwsICJnemlwIikpCisjaWZkZWYgV0lUSF9HWklQCisgICAgICBzb2FwLT56bGliX2luID0gU09BUF9aTElCX0daSVA7CisjZWxzZQorICAgICAgcmV0dXJuIFNPQVBfWkxJQl9FUlJPUjsKKyNlbmRpZgorICB9CisjaWZkZWYgV0lUSF9aTElCCisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQWNjZXB0LUVuY29kaW5nIikpCisgIHsKKyNpZmRlZiBXSVRIX0daSVAKKyAgICBpZiAoc3RyY2hyKHZhbCwgJyonKSB8fCBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCwgImd6aXAiKSkKKyAgICAgIHNvYXAtPnpsaWJfb3V0ID0gU09BUF9aTElCX0daSVA7CisgICAgZWxzZQorI2VuZGlmCisgICAgaWYgKHN0cmNocih2YWwsICcqJykgfHwgc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwsICJkZWZsYXRlIikpCisgICAgICBzb2FwLT56bGliX291dCA9IFNPQVBfWkxJQl9ERUZMQVRFOworICAgIGVsc2UKKyAgICAgIHNvYXAtPnpsaWJfb3V0ID0gU09BUF9aTElCX05PTkU7CisgIH0KKyNlbmRpZgorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIlRyYW5zZmVyLUVuY29kaW5nIikpCisgIHsgc29hcC0+bW9kZSAmPSB+U09BUF9JTzsKKyAgICBpZiAoIXNvYXBfdGFnX2NtcCh2YWwsICJjaHVua2VkIikpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fQ0hVTks7CisgIH0KKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb25uZWN0aW9uIikpCisgIHsgaWYgKCFzb2FwX3RhZ19jbXAodmFsLCAia2VlcC1hbGl2ZSIpKQorICAgICAgc29hcC0+a2VlcF9hbGl2ZSA9IC1zb2FwLT5rZWVwX2FsaXZlOworICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAodmFsLCAiY2xvc2UiKSkKKyAgICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOworICB9CisjaWZuZGVmIFdJVEhfTEVBTgorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkF1dGhvcml6YXRpb24iKSkKKyAgeyBpZiAoIXNvYXBfdGFnX2NtcCh2YWwsICJCYXNpYyAqIikpCisgICAgeyBpbnQgbjsKKyAgICAgIGNoYXIgKnM7CisgICAgICBzb2FwX2Jhc2U2NDJzKHNvYXAsIHZhbCArIDYsIHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZikgLSAxLCAmbik7CisgICAgICBzb2FwLT50bXBidWZbbl0gPSAnXDAnOworICAgICAgaWYgKChzID0gc3RyY2hyKHNvYXAtPnRtcGJ1ZiwgJzonKSkpCisgICAgICB7ICpzID0gJ1wwJzsKKwlzb2FwLT51c2VyaWQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT50bXBidWYpOworCXNvYXAtPnBhc3N3ZCA9IHNvYXBfc3RyZHVwKHNvYXAsIHMgKyAxKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJXV1ctQXV0aGVudGljYXRlIikpCisgICAgc29hcC0+YXV0aHJlYWxtID0gc29hcF9zdHJkdXAoc29hcCwgc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwgKyA2LCAicmVhbG0iKSk7CisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiRXhwZWN0IikpCisgIHsgaWYgKCFzb2FwX3RhZ19jbXAodmFsLCAiMTAwLWNvbnRpbnVlIikpCisgICAgeyBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkhUVFAvMS4xIDEwMCBDb250aW51ZSIsIE5VTEwpKQorICAgICAgIHx8IChzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsIE5VTEwsIE5VTEwpKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgfQorI2VuZGlmCisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiU09BUEFjdGlvbiIpKQorICB7IGlmICgqdmFsID09ICciJykKKyAgICB7IHNvYXAtPmFjdGlvbiA9IHNvYXBfc3RyZHVwKHNvYXAsIHZhbCArIDEpOworICAgICAgc29hcC0+YWN0aW9uW3N0cmxlbihzb2FwLT5hY3Rpb24pIC0gMV0gPSAnXDAnOworICAgIH0KKyAgfQorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkxvY2F0aW9uIikpCisgIHsgc3RybmNweShzb2FwLT5lbmRwb2ludCwgdmFsLCBzaXplb2Yoc29hcC0+ZW5kcG9pbnQpKTsKKyAgICBzb2FwLT5lbmRwb2ludFtzaXplb2Yoc29hcC0+ZW5kcG9pbnQpIC0gMV0gPSAnXDAnOworICB9CisjaWZkZWYgV0lUSF9DT09LSUVTCisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29va2llIikgfHwgIXNvYXBfdGFnX2NtcChrZXksICJTZXQtQ29va2llIikpCisgICAgc29hcF9nZXRjb29raWVzKHNvYXAsIHZhbCk7CisjZW5kaWYKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmICFkZWZpbmVkKFdJVEhfTk9IVFRQKSB8fCAhZGVmaW5lZChXSVRIX0xFQU5FUikKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbGluZSwgY29uc3QgY2hhciAqa2V5KQoreyByZWdpc3RlciBjb25zdCBjaGFyICpzID0gbGluZTsKKyAgaWYgKHMpCisgIHsgd2hpbGUgKCpzKQorICAgIHsgcmVnaXN0ZXIgc2hvcnQgZmxhZzsKKyAgICAgIHMgPSBzb2FwX2RlY29kZV9rZXkoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgcyk7CisgICAgICBmbGFnID0gc29hcF90YWdfY21wKHNvYXAtPnRtcGJ1Ziwga2V5KTsKKyAgICAgIHMgPSBzb2FwX2RlY29kZV92YWwoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgcyk7CisgICAgICBpZiAoIWZsYWcpCisgICAgICAgIHJldHVybiBzb2FwLT50bXBidWY7CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAhZGVmaW5lZChXSVRIX05PSFRUUCkgfHwgIWRlZmluZWQoV0lUSF9MRUFORVIpCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZGVjb2RlX2tleShjaGFyICpidWYsIHNpemVfdCBsZW4sIGNvbnN0IGNoYXIgKnZhbCkKK3sgcmV0dXJuIHNvYXBfZGVjb2RlKGJ1ZiwgbGVuLCB2YWwsICI9LDsiKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgIWRlZmluZWQoV0lUSF9OT0hUVFApIHx8ICFkZWZpbmVkKFdJVEhfTEVBTkVSKQorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2RlY29kZV92YWwoY2hhciAqYnVmLCBzaXplX3QgbGVuLCBjb25zdCBjaGFyICp2YWwpCit7IGlmICgqdmFsICE9ICc9JykKKyAgeyAqYnVmID0gJ1wwJzsKKyAgICByZXR1cm4gdmFsOworICB9CisgIHJldHVybiBzb2FwX2RlY29kZShidWYsIGxlbiwgdmFsICsgMSwgIiw7Iik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmICFkZWZpbmVkKFdJVEhfTk9IVFRQKSB8fCAhZGVmaW5lZChXSVRIX0xFQU5FUikKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY29uc3QgY2hhcioKK3NvYXBfZGVjb2RlKGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwgY29uc3QgY2hhciAqdmFsLCBjb25zdCBjaGFyICpzZXApCit7IGNvbnN0IGNoYXIgKnM7CisgIGNoYXIgKnQgPSBidWY7CisgIGZvciAocyA9IHZhbDsgKnM7IHMrKykKKyAgICBpZiAoKnMgIT0gJyAnICYmICpzICE9ICdcdCcgJiYgIXN0cmNocihzZXAsICpzKSkKKyAgICAgIGJyZWFrOworICBpZiAoKnMgPT0gJyInKQorICB7IHMrKzsKKyAgICB3aGlsZSAoKnMgJiYgKnMgIT0gJyInICYmIC0tbGVuKQorICAgICAgKnQrKyA9ICpzKys7CisgIH0KKyAgZWxzZQorICB7IHdoaWxlIChzb2FwX25vdGJsYW5rKCpzKSAmJiAhc3RyY2hyKHNlcCwgKnMpICYmIC0tbGVuKQorICAgIHsgaWYgKCpzID09ICclJykKKyAgICAgIHsgKnQrKyA9ICgoc1sxXSA+PSAnQScgPyAoc1sxXSAmIDB4NykgKyA5IDogc1sxXSAtICcwJykgPDwgNCkKKyAgICAgICAgICAgICAgKyAoc1syXSA+PSAnQScgPyAoc1syXSAmIDB4NykgKyA5IDogc1syXSAtICcwJyk7CisgICAgICAgIHMgKz0gMzsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgKnQrKyA9ICpzKys7CisgICAgfQorICB9CisgICp0ID0gJ1wwJzsKKyAgd2hpbGUgKCpzICYmICFzdHJjaHIoc2VwLCAqcykpCisgICAgcysrOworICByZXR1cm4gczsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VudmVsb3BlX2JlZ2luX291dChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc2l6ZV90IG4gPSAwOworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKSAmJiBzb2FwLT5taW1lLmJvdW5kYXJ5ICYmIHNvYXAtPm1pbWUuc3RhcnQpCisgIHsgY29uc3QgY2hhciAqczsKKyAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKSkKKyAgICAgIHMgPSAiYXBwbGljYXRpb24vZGltZSI7CisgICAgZWxzZSBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICAgICAgcyA9ICJhcHBsaWNhdGlvbi9zb2FwK3htbDsgY2hhcnNldD11dGYtOCI7CisgICAgZWxzZQorICAgICAgcyA9ICJ0ZXh0L3htbDsgY2hhcnNldD11dGYtOCI7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICItLSVzXHJcbkNvbnRlbnQtVHlwZTogJXNcclxuQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmluYXJ5XHJcbkNvbnRlbnQtSUQ6ICVzXHJcblxyXG4iLCBzb2FwLT5taW1lLmJvdW5kYXJ5LCBzLCBzb2FwLT5taW1lLnN0YXJ0KTsKKyAgICBuID0gc3RybGVuKHNvYXAtPnRtcGJ1Zik7CisgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgc29hcC0+dG1wYnVmLCBuKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICAgIHNvYXAtPmRpbWUuc2l6ZSA9IHNvYXAtPmNvdW50OwkvKiBESU1FIGluIE1JTUUgY29ycmVjdGlvbiAqLworICBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpICYmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkpCisgIHsgaWYgKHNvYXBfcHV0ZGltZWhkcihzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorI2VuZGlmCisgIHNvYXAtPnBhcnQgPSBTT0FQX0lOX0VOVkVMT1BFOworICByZXR1cm4gc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCAiU09BUC1FTlY6RW52ZWxvcGUiLCAwLCBOVUxMKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbnZlbG9wZV9lbmRfb3V0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgIlNPQVAtRU5WOkVudmVsb3BlIikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKSkKKyAgeyBzb2FwLT5kaW1lLnNpemUgPSBzb2FwLT5jb3VudCAtIHNvYXAtPmRpbWUuc2l6ZTsJLyogRElNRSBpbiBNSU1FIGNvcnJlY3Rpb24gKi8KKyAgICBzcHJpbnRmKHNvYXAtPmlkLCBzb2FwLT5kaW1lX2lkX2Zvcm1hdCwgMCk7CisgICAgc29hcC0+ZGltZS5pZCA9IHNvYXAtPmlkOworICAgIGlmIChzb2FwLT5sb2NhbF9uYW1lc3BhY2VzKQorICAgIHsgaWYgKHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbMF0ub3V0KQorICAgICAgICBzb2FwLT5kaW1lLnR5cGUgPSAoY2hhciopc29hcC0+bG9jYWxfbmFtZXNwYWNlc1swXS5vdXQ7CisgICAgICBlbHNlCisgICAgICAgIHNvYXAtPmRpbWUudHlwZSA9IChjaGFyKilzb2FwLT5sb2NhbF9uYW1lc3BhY2VzWzBdLm5zOworICAgIH0KKyAgICBzb2FwLT5kaW1lLm9wdGlvbnMgPSBOVUxMOworICAgIHNvYXAtPmRpbWUuZmxhZ3MgPSBTT0FQX0RJTUVfTUIgfCBTT0FQX0RJTUVfQUJTVVJJOworICAgIGlmICghc29hcC0+ZGltZS5maXJzdCkKKyAgICAgIHNvYXAtPmRpbWUuZmxhZ3MgfD0gU09BUF9ESU1FX01FOworICAgIHNvYXAtPmNvdW50ICs9IDEyICsgKChzdHJsZW4oc29hcC0+ZGltZS5pZCkrMykmKH4zKSkgKyAoKHN0cmxlbihzb2FwLT5kaW1lLnR5cGUpKzMpJih+MykpOworICB9CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpICYmICEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pKQorICAgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsIFNPQVBfU1RSX1BBRERJTkcsIC0obG9uZylzb2FwLT5kaW1lLnNpemUmMyk7CisjZW5kaWYKKyAgc29hcC0+cGFydCA9IFNPQVBfRU5EX0VOVkVMT1BFOworICByZXR1cm4gU09BUF9PSzsKK30gCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW52ZWxvcGVfYmVnaW5faW4oc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHN0cnVjdCBOYW1lc3BhY2UgKnA7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0lOX0VOVkVMT1BFOworICBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsICJTT0FQLUVOVjpFbnZlbG9wZSIsIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfVkVSU0lPTk1JU01BVENIOworICBwID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlczsKKyAgaWYgKHApCisgIHsgY29uc3QgY2hhciAqbnMgPSBwWzBdLm91dDsKKyAgICBpZiAoIW5zKQorICAgICAgbnMgPSBwWzBdLm5zOworICAgIGlmICghc3RyY21wKG5zLCBzb2FwX2VudjEpKQorICAgIHsgc29hcC0+dmVyc2lvbiA9IDE7IC8qIG1ha2Ugc3VyZSB3ZSB1c2UgU09BUCAxLjEgKi8KKyAgICAgIGlmIChwWzFdLm91dCkKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHBbMV0ub3V0KTsKKyAgICAgIGlmICgocFsxXS5vdXQgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHNvYXBfZW5jMSkpKSkKKyAgICAgICAgc3RyY3B5KHBbMV0ub3V0LCBzb2FwX2VuYzEpOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKG5zLCBzb2FwX2VudjIpKQorICAgIHsgc29hcC0+dmVyc2lvbiA9IDI7IC8qIG1ha2Ugc3VyZSB3ZSB1c2UgU09BUCAxLjIgKi8KKyAgICAgIGlmIChwWzFdLm91dCkKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHBbMV0ub3V0KTsKKyAgICAgIGlmICgocFsxXS5vdXQgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHNvYXBfZW5jMikpKSkKKyAgICAgICAgc3RyY3B5KHBbMV0ub3V0LCBzb2FwX2VuYzIpOworICAgIH0KKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbnZlbG9wZV9lbmRfaW4oc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPnBhcnQgPSBTT0FQX0VORF9FTlZFTE9QRTsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgIlNPQVAtRU5WOkVudmVsb3BlIik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYm9keV9iZWdpbl9vdXQoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPnBhcnQgPSBTT0FQX0lOX0JPRFk7CisgIGlmIChzb2FwLT52ZXJzaW9uID09IDEpCisgICAgc29hcC0+ZW5jb2RpbmcgPSAxOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU0VDKSAmJiBzb2FwX3NldF9hdHRyKHNvYXAsICJ3c3U6SWQiLCAiQm9keSIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNlbmRpZgorICBpZiAoc29hcF9lbGVtZW50KHNvYXAsICJTT0FQLUVOVjpCb2R5IiwgMCwgTlVMTCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X3N0YXJ0X2VuZF9vdXQoc29hcCwgTlVMTCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYm9keV9lbmRfb3V0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgIlNPQVAtRU5WOkJvZHkiKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0VORF9CT0RZOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9ib2R5X2JlZ2luX2luKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5wYXJ0ID0gU09BUF9JTl9CT0RZOworICBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsICJTT0FQLUVOVjpCb2R5IiwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoIXNvYXAtPmJvZHkpCisgICAgc29hcC0+cGFydCA9IFNPQVBfTk9fQk9EWTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYm9keV9lbmRfaW4oc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwLT5wYXJ0ID09IFNPQVBfTk9fQk9EWSkKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgc29hcC0+cGFydCA9IFNPQVBfRU5EX0JPRFk7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsICJTT0FQLUVOVjpCb2R5Iik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVjdl9oZWFkZXIoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwX2dldGhlYWRlcihzb2FwKSAmJiBzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2VuZHBvaW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICplbmRwb2ludCkKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKKyAgcmVnaXN0ZXIgc2l6ZV90IGksIG47CisgIHNvYXAtPmVuZHBvaW50WzBdID0gJ1wwJzsKKyAgc29hcC0+aG9zdFswXSA9ICdcMCc7CisgIHNvYXAtPnBhdGhbMF0gPSAnLyc7CisgIHNvYXAtPnBhdGhbMV0gPSAnXDAnOworICBzb2FwLT5wb3J0ID0gODA7CisgIGlmICghZW5kcG9pbnQgfHwgISplbmRwb2ludCkKKyAgICByZXR1cm47CisgIGlmICghc3RybmNtcChlbmRwb2ludCwgImh0dHBzOiIsIDYpKQorICAgIHNvYXAtPnBvcnQgPSA0NDM7CisgIHN0cm5jcHkoc29hcC0+ZW5kcG9pbnQsIGVuZHBvaW50LCBzaXplb2Yoc29hcC0+ZW5kcG9pbnQpIC0gMSk7CisgIHMgPSBzdHJjaHIoZW5kcG9pbnQsICc6Jyk7CisgIGlmIChzICYmIHNbMV0gPT0gJy8nICYmIHNbMl0gPT0gJy8nKQorICAgIHMgKz0gMzsKKyAgZWxzZQorICAgIHMgPSBlbmRwb2ludDsKKyAgbiA9IHN0cmxlbihzKTsKKyAgaWYgKG4gPj0gc2l6ZW9mKHNvYXAtPmhvc3QpKQorICAgIG4gPSBzaXplb2Yoc29hcC0+aG9zdCkgLSAxOworI2lmZGVmIFdJVEhfSVBWNgorICBpZiAoc1swXSA9PSAnWycpCisgIHsgcysrOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgeyBzb2FwLT5ob3N0W2ldID0gc1tpXTsKKyAgICAgIGlmIChzW2ldID09ICddJykKKyAgICAgIHsgcysrOworICAgICAgICBicmVhazsgCisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyAgeyBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIHsgc29hcC0+aG9zdFtpXSA9IHNbaV07CisgICAgICBpZiAoc1tpXSA9PSAnLycgfHwgc1tpXSA9PSAnOicpCisgICAgICAgIGJyZWFrOyAKKyAgICB9CisgIH0KKyNlbHNlCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgIHsgc29hcC0+aG9zdFtpXSA9IHNbaV07CisgICAgaWYgKHNbaV0gPT0gJy8nIHx8IHNbaV0gPT0gJzonKQorICAgICAgYnJlYWs7IAorICB9CisjZW5kaWYKKyAgc29hcC0+aG9zdFtpXSA9ICdcMCc7CisgIGlmIChzW2ldID09ICc6JykKKyAgeyBzb2FwLT5wb3J0ID0gKGludClhdG9sKHMgKyBpICsgMSk7CisgICAgZm9yIChpKys7IGkgPCBuOyBpKyspCisgICAgICBpZiAoc1tpXSA9PSAnLycpCisgICAgICAgIGJyZWFrOworICB9CisgIGlmIChzW2ldKQorICB7IHN0cm5jcHkoc29hcC0+cGF0aCwgcyArIGksIHNpemVvZihzb2FwLT5wYXRoKSk7CisgICAgc29hcC0+cGF0aFtzaXplb2Yoc29hcC0+cGF0aCkgLSAxXSA9ICdcMCc7CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9jb25uZWN0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICplbmRwb2ludCwgY29uc3QgY2hhciAqYWN0aW9uKQoreyByZXR1cm4gc29hcF9jb25uZWN0X2NvbW1hbmQoc29hcCwgU09BUF9QT1NULCBlbmRwb2ludCwgYWN0aW9uKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9jb25uZWN0X2NvbW1hbmQoc3RydWN0IHNvYXAgKnNvYXAsIGludCBodHRwX2NvbW1hbmQsIGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjb25zdCBjaGFyICphY3Rpb24pCit7IGNoYXIgaG9zdFtzaXplb2Yoc29hcC0+aG9zdCldOworICBpbnQgcG9ydDsKKyAgc2l6ZV90IGNvdW50OworICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIHN0cmNweShob3N0LCBzb2FwLT5ob3N0KTsgLyogc2F2ZSB0byBjb21wYXJlICovCisgIHBvcnQgPSBzb2FwLT5wb3J0OyAvKiBzYXZlIHRvIGNvbXBhcmUgKi8KKyAgc29hcF9zZXRfZW5kcG9pbnQoc29hcCwgZW5kcG9pbnQpOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+ZmNvbm5lY3QpCisgIHsgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZjb25uZWN0KHNvYXAsIGVuZHBvaW50LCBzb2FwLT5ob3N0LCBzb2FwLT5wb3J0KSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgZWxzZQorI2VuZGlmCisgIGlmIChzb2FwLT5mb3BlbiAmJiAqc29hcC0+aG9zdCkKKyAgeyBzb2FwLT5zdGF0dXMgPSBodHRwX2NvbW1hbmQ7CisgICAgaWYgKCFzb2FwLT5rZWVwX2FsaXZlIHx8ICFzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpIHx8IHN0cmNtcChzb2FwLT5ob3N0LCBob3N0KSB8fCBzb2FwLT5wb3J0ICE9IHBvcnQgfHwgIXNvYXAtPmZwb2xsIHx8IHNvYXAtPmZwb2xsKHNvYXApKQorICAgIHsgc29hcC0+a2VlcF9hbGl2ZSA9IDA7IC8qIHRvIGZvcmNlIGNsb3NlICovCisgICAgICBzb2FwLT5vbW9kZSAmPSB+U09BUF9JT19VRFA7IC8qIHRvIGZvcmNlIGNsb3NlICovCisgICAgICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJDb25uZWN0L3JlY29ubmVjdCB0byBob3N0PSclcycgcGF0aD0nJXMnIHBvcnQ9JWRcbiIsIHNvYXAtPmhvc3QsIHNvYXAtPnBhdGgsIHNvYXAtPnBvcnQpKTsKKyNpZmRlZiBXSVRIX1VEUAorICAgICAgaWYgKCFzdHJuY21wKGVuZHBvaW50LCAic29hcC51ZHA6IiwgOSkpCisgICAgICAgIHNvYXAtPm9tb2RlIHw9IFNPQVBfSU9fVURQOworI2VuZGlmCisgICAgICBzb2FwLT5zb2NrZXQgPSBzb2FwLT5mb3Blbihzb2FwLCBlbmRwb2ludCwgc29hcC0+aG9zdCwgc29hcC0+cG9ydCk7CisgICAgICBpZiAoc29hcC0+ZXJyb3IpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19LRUVQQUxJVkUpICE9IDApOworICAgIH0KKyAgfQorICBjb3VudCA9IHNvYXBfY291bnRfYXR0YWNobWVudHMoc29hcCk7CisgIGlmIChzb2FwX2JlZ2luX3NlbmQoc29hcCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmbmRlZiBXSVRIX05PSFRUUAorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSAhPSBTT0FQX0lPX1NUT1JFICYmICEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1hNTCkgJiYgZW5kcG9pbnQpCisgIHsgdW5zaWduZWQgaW50IGsgPSBzb2FwLT5tb2RlOworICAgIHNvYXAtPm1vZGUgJj0gfihTT0FQX0lPIHwgU09BUF9FTkNfWkxJQik7CisgICAgaWYgKChrICYgU09BUF9JTykgIT0gU09BUF9JT19GTFVTSCkKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19CVUZGRVI7CisgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0KHNvYXAsIGVuZHBvaW50LCBzb2FwLT5ob3N0LCBzb2FwLT5wb3J0LCBzb2FwLT5wYXRoLCBhY3Rpb24sIGNvdW50KSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgICAgaWYgKChrICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgICB7IGlmIChzb2FwX2ZsdXNoKHNvYXApKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorI2VuZGlmCisgICAgc29hcC0+bW9kZSA9IGs7CisgIH0KKyAgZWxzZSBpZiAoYWN0aW9uKQorICAgIHNvYXAtPmFjdGlvbiA9IHNvYXBfc3RyZHVwKHNvYXAsIGFjdGlvbik7CisgIGlmIChodHRwX2NvbW1hbmQgIT0gU09BUF9QT1NUKQorICAgIHJldHVybiBzb2FwX2VuZF9zZW5kKHNvYXApOworI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfczJiYXNlNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMsIGNoYXIgKnQsIGludCBuKQoreyByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBtOworICByZWdpc3RlciBjaGFyICpwOworICBpZiAoIXQpCisgICAgdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCAobiArIDIpIC8gMyAqIDQgKyAxKTsKKyAgaWYgKCF0KQorICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcCA9IHQ7CisgIHRbMF0gPSAnXDAnOworICBpZiAoIXMpCisgICAgcmV0dXJuIHA7CisgIGZvciAoOyBuID4gMjsgbiAtPSAzLCBzICs9IDMpCisgIHsgbSA9IHNbMF07CisgICAgbSA9IChtIDw8IDgpIHwgc1sxXTsKKyAgICBtID0gKG0gPDwgOCkgfCBzWzJdOworICAgIGZvciAoaSA9IDQ7IGkgPiAwOyBtID4+PSA2KQorICAgICAgdFstLWldID0gc29hcF9iYXNlNjRvW20gJiAweDNGXTsKKyAgICB0ICs9IDQ7CisgIH0KKyAgdFswXSA9ICdcMCc7CisgIGlmIChuID4gMCkKKyAgeyBtID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgbSA9IChtIDw8IDgpIHwgKnMrKzsKKyAgICBmb3IgKDsgaSA8IDM7IGkrKykKKyAgICAgIG0gPDw9IDg7CisgICAgZm9yIChpKys7IGkgPiAwOyBtID4+PSA2KQorICAgICAgdFstLWldID0gc29hcF9iYXNlNjRvW20gJiAweDNGXTsKKyAgICBmb3IgKGkgPSAzOyBpID4gbjsgaS0tKQorICAgICAgdFtpXSA9ICc9JzsKKyAgICB0WzRdID0gJ1wwJzsKKyAgfQorICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2Jhc2U2NDJzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBjaGFyICp0LCBzaXplX3QgbCwgaW50ICpuKQoreyByZWdpc3RlciBpbnQgaSwgaiwgYzsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBtOworICByZWdpc3RlciBjb25zdCBjaGFyICpwOworICBpZiAoIXMgfHwgISpzKQorICB7IGlmIChuKQorICAgICAgKm4gPSAwOworICAgIGlmIChzb2FwLT5lcnJvcikKKyAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBTT0FQX05PTl9OVUxMOworICB9CisgIGlmICghdCkKKyAgeyBsID0gKHN0cmxlbihzKSArIDMpIC8gNCAqIDM7CisgICAgdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBsKTsKKyAgfQorICBpZiAoIXQpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwID0gdDsKKyAgaWYgKG4pCisgICAgKm4gPSAwOworICBmb3IgKDs7KQorICB7IGZvciAoaSA9IDA7IGkgPCBTT0FQX0JMS0xFTjsgaSsrKQorICAgIHsgbSA9IDA7CisgICAgICBqID0gMDsKKyAgICAgIHdoaWxlIChqIDwgNCkKKyAgICAgIHsgYyA9ICpzKys7CisgICAgICAgIGlmIChjID09ICc9JyB8fCAhYykKKyAgICAgICAgeyBpICo9IDM7CisgICAgICAgICAgc3dpdGNoIChqKQorICAgICAgICAgIHsgY2FzZSAyOgorICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKChtID4+IDQpICYgMHhGRik7CisgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoKG0gPj4gMTApICYgMHhGRik7CisgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoKG0gPj4gMikgJiAweEZGKTsKKyAgICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobikKKwkgICAgKm4gKz0gaTsKKyAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgfQorICAgICAgICBjIC09ICcrJzsKKyAgICAgICAgaWYgKGMgPj0gMCAmJiBjIDw9IDc5KQorICAgICAgICB7IG0gPSAobSA8PCA2KSArIHNvYXBfYmFzZTY0aVtjXTsKKyAgICAgICAgICBqKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICp0KysgPSAoY2hhcikoKG0gPj4gMTYpICYgMHhGRik7CisgICAgICAqdCsrID0gKGNoYXIpKChtID4+IDgpICYgMHhGRik7CisgICAgICAqdCsrID0gKGNoYXIpKG0gJiAweEZGKTsKKyAgICAgIGlmIChsIDwgMykKKyAgICAgIHsgaWYgKG4pCisJICAqbiArPSBpOworICAgICAgICByZXR1cm4gcDsKKyAgICAgIH0KKyAgICAgIGwgLT0gMzsKKyAgICB9CisgICAgaWYgKG4pCisgICAgICAqbiArPSAzICogU09BUF9CTEtMRU47CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2NoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3MyaGV4KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzLCBjaGFyICp0LCBpbnQgbikKK3sgcmVnaXN0ZXIgY2hhciAqcDsKKyAgaWYgKCF0KQorICAgIHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgMiAqIG4gKyAxKTsKKyAgaWYgKCF0KQorICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcCA9IHQ7CisgIHRbMF0gPSAnXDAnOworICBpZiAocykKKyAgeyBmb3IgKDsgbiA+IDA7IG4tLSkKKyAgICB7IHJlZ2lzdGVyIGludCBtID0gKnMrKzsKKyAgICAgICp0KysgPSAoY2hhcikoKG0gPj4gNCkgKyAobSA+IDE1OSA/ICdhJyAtIDEwIDogJzAnKSk7CisgICAgICBtICY9IDB4MEY7CisgICAgICAqdCsrID0gKGNoYXIpKG0gKyAobSA+IDkgPyAnYScgLSAxMCA6ICcwJykpOworICAgIH0KKyAgfQorICAqdCsrID0gJ1wwJzsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9oZXgycyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgY2hhciAqdCwgc2l6ZV90IGwsIGludCAqbikKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqcDsKKyAgaWYgKCFzIHx8ICEqcykKKyAgeyBpZiAobikKKyAgICAgICpuID0gMDsKKyAgICBpZiAoc29hcC0+ZXJyb3IpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gU09BUF9OT05fTlVMTDsKKyAgfQorICBpZiAoIXQpCisgIHsgbCA9IHN0cmxlbihzKSAvIDI7CisgICAgdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBsKTsKKyAgfQorICBpZiAoIXQpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwID0gdDsKKyAgd2hpbGUgKGwpCisgIHsgcmVnaXN0ZXIgaW50IGQxLCBkMjsKKyAgICBkMSA9ICpzKys7CisgICAgaWYgKCFkMSkKKyAgICAgIGJyZWFrOworICAgIGQyID0gKnMrKzsKKyAgICBpZiAoIWQyKQorICAgICAgYnJlYWs7CisgICAgKnQrKyA9ICgoZDEgPj0gJ0EnID8gKGQxICYgMHg3KSArIDkgOiBkMSAtICcwJykgPDwgNCkgKyAoZDIgPj0gJ0EnID8gKGQyICYgMHg3KSArIDkgOiBkMiAtICcwJyk7CisgICAgbC0tOworICB9CisgIGlmIChuKQorICAgICpuID0gdCAtIHA7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dGh0dHBoZHIoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdGF0dXMsIHNpemVfdCBjb3VudCkKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqcyA9IE5VTEw7CisgIHJlZ2lzdGVyIGludCBlcnIgPSBTT0FQX09LOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICByZWdpc3RlciBjb25zdCBjaGFyICpyID0gTlVMTDsKKyNlbmRpZgorICBpZiAoc3RhdHVzID09IFNPQVBfRklMRSAmJiBzb2FwLT5odHRwX2NvbnRlbnQpCisgICAgcyA9IHNvYXAtPmh0dHBfY29udGVudDsKKyAgZWxzZSBpZiAoc3RhdHVzID09IFNPQVBfSFRNTCkKKyAgICBzID0gInRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI7CisgIGVsc2UgaWYgKGNvdW50IHx8ICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspKQorICB7IGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgICAgICBzID0gImFwcGxpY2F0aW9uL3NvYXAreG1sOyBjaGFyc2V0PXV0Zi04IjsKKyAgICBlbHNlCisgICAgICBzID0gInRleHQveG1sOyBjaGFyc2V0PXV0Zi04IjsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+bW9kZSAmIChTT0FQX0VOQ19ESU1FIHwgU09BUF9FTkNfTVRPTSkpCisgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKQorICAgIHsgciA9IHM7CisgICAgICBzID0gImFwcGxpY2F0aW9uL3hvcCt4bWw7IGNoYXJzZXQ9dXRmLTgiOworICAgIH0KKyAgICBlbHNlCisgICAgICBzID0gImFwcGxpY2F0aW9uL2RpbWUiOworICB9CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01JTUUpICYmIHNvYXAtPm1pbWUuYm91bmRhcnkgJiYgc29hcC0+c3RhdHVzICE9IFNPQVBfR0VUKQorICB7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnQgPSBzdHJjaHIocywgJzsnKTsKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIm11bHRpcGFydC9yZWxhdGVkOyBib3VuZGFyeT1cIiVzXCI7IHR5cGU9XCIiLCBzb2FwLT5taW1lLmJvdW5kYXJ5KTsKKyAgICBpZiAodCkKKyAgICAgIHN0cm5jYXQoc29hcC0+dG1wYnVmLCBzLCB0IC0gcyk7CisgICAgZWxzZQorICAgICAgc3RyY2F0KHNvYXAtPnRtcGJ1Ziwgcyk7CisgICAgaWYgKHNvYXAtPm1pbWUuc3RhcnQpCisgICAgeyBzdHJjYXQoc29hcC0+dG1wYnVmLCAiXCI7IHN0YXJ0PVwiIik7CisgICAgICBzdHJjYXQoc29hcC0+dG1wYnVmLCBzb2FwLT5taW1lLnN0YXJ0KTsKKyAgICB9CisgICAgc3RyY2F0KHNvYXAtPnRtcGJ1ZiwgIlwiIik7CisgICAgaWYgKHIpCisgICAgeyBzdHJjYXQoc29hcC0+dG1wYnVmLCAiOyBzdGFydC1pbmZvPVwiIik7CisgICAgICBzdHJjYXQoc29hcC0+dG1wYnVmLCByKTsKKyAgICAgIHN0cmNhdChzb2FwLT50bXBidWYsICJcIiIpOworICAgIH0KKyAgICBzID0gc29hcC0+dG1wYnVmOworICB9CisjZW5kaWYKKyAgaWYgKHMgJiYgKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJDb250ZW50LVR5cGUiLCBzKSkpCisgICAgcmV0dXJuIGVycjsKKyNpZmRlZiBXSVRIX1pMSUIKKyAgaWYgKHNvYXAtPm9tb2RlICYgU09BUF9FTkNfWkxJQikKKyAgeworI2lmZGVmIFdJVEhfR1pJUAorICAgIGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJDb250ZW50LUVuY29kaW5nIiwgImd6aXAiKTsKKyNlbHNlCisgICAgZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkNvbnRlbnQtRW5jb2RpbmciLCAiZGVmbGF0ZSIpOworI2VuZGlmCisgICAgaWYgKGVycikKKyAgICAgIHJldHVybiBlcnI7CisgIH0KKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgICBlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiVHJhbnNmZXItRW5jb2RpbmciLCAiY2h1bmtlZCIpOworICBlbHNlCisjZW5kaWYKKyAgaWYgKHNvYXAtPnN0YXR1cyAhPSBTT0FQX0dFVCkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIiVsdSIsICh1bnNpZ25lZCBsb25nKWNvdW50KTsKKyAgICBlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQ29udGVudC1MZW5ndGgiLCBzb2FwLT50bXBidWYpOworICB9CisgIGlmIChlcnIpCisgICAgcmV0dXJuIGVycjsKKyAgcmV0dXJuIHNvYXAtPmZwb3N0aGRyKHNvYXAsICJDb25uZWN0aW9uIiwgc29hcC0+a2VlcF9hbGl2ZSA/ICJrZWVwLWFsaXZlIiA6ICJjbG9zZSIpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50CitodHRwX2dldChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmV0dXJuIFNPQVBfR0VUX01FVEhPRDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAoraHR0cF9wb3N0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICplbmRwb2ludCwgY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQsIGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmFjdGlvbiwgc2l6ZV90IGNvdW50KQoreyByZWdpc3RlciBjb25zdCBjaGFyICpzOworICByZWdpc3RlciBpbnQgZXJyOworICBpZiAoc29hcC0+c3RhdHVzID09IFNPQVBfR0VUKQorICAgIHMgPSAiR0VUIjsKKyAgZWxzZQorICAgIHMgPSAiUE9TVCI7CisjaWZkZWYgUEFMTQorICBpZiAoIWVuZHBvaW50IHx8IChzdHJuY21wKGVuZHBvaW50LCAiaHR0cDoiLCA1KSAmJiBzdHJuY21wKGVuZHBvaW50LCAiaHR0cHM6IiwgNikgJiYgc3RybmNtcChlbmRwb2ludCwgImh0dHBnOiIsIDYpKSAmJiBzdHJuY21wKGVuZHBvaW50LCAiX2JlYW06IiwgNikgJiYgc3RybmNtcChlbmRwb2ludCwgIl9sb2NhbDoiLCA3KSAmJiBzdHJuY21wKGVuZHBvaW50LCAiX2J0b2JleDoiLCA4KSkKKyNlbHNlCisgIGlmICghZW5kcG9pbnQgfHwgKHN0cm5jbXAoZW5kcG9pbnQsICJodHRwOiIsIDUpICYmIHN0cm5jbXAoZW5kcG9pbnQsICJodHRwczoiLCA2KSAmJiBzdHJuY21wKGVuZHBvaW50LCAiaHR0cGc6IiwgNikpKQorI2VuZGlmCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIGlmIChzb2FwLT5wcm94eV9ob3N0ICYmIHN0cm5jbXAoZW5kcG9pbnQsICJodHRwczoiLCA2KSkKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIiVzICVzIEhUVFAvJXMiLCBzLCBlbmRwb2ludCwgc29hcC0+aHR0cF92ZXJzaW9uKTsKKyAgZWxzZQorICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiJXMgLyVzIEhUVFAvJXMiLCBzLCAoKnBhdGggPT0gJy8nID8gcGF0aCArIDEgOiBwYXRoKSwgc29hcC0+aHR0cF92ZXJzaW9uKTsKKyAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCBzb2FwLT50bXBidWYsIE5VTEwpKSkKKyAgICByZXR1cm4gZXJyOworICBpZiAocG9ydCAhPSA4MCkKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIiVzOiVkIiwgaG9zdCwgcG9ydCk7CisgIGVsc2UKKyAgICBzdHJjcHkoc29hcC0+dG1wYnVmLCBob3N0KTsgCisgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkhvc3QiLCBzb2FwLT50bXBidWYpKQorICAgfHwgKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJVc2VyLUFnZW50IiwgImdTT0FQLzIuNyIpKQorICAgfHwgKGVyciA9IHNvYXBfcHV0aHR0cGhkcihzb2FwLCBTT0FQX09LLCBjb3VudCkpKQorICAgIHJldHVybiBlcnI7CisjaWZkZWYgV0lUSF9aTElCCisjaWZkZWYgV0lUSF9HWklQCisgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkFjY2VwdC1FbmNvZGluZyIsICJnemlwLCBkZWZsYXRlIikpKQorI2Vsc2UKKyAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQWNjZXB0LUVuY29kaW5nIiwgImRlZmxhdGUiKSkpCisjZW5kaWYKKyAgICByZXR1cm4gZXJyOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+dXNlcmlkICYmIHNvYXAtPnBhc3N3ZCAmJiBzdHJsZW4oc29hcC0+dXNlcmlkKSArIHN0cmxlbihzb2FwLT5wYXNzd2QpIDwgNzYxKQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmICsgMjYyLCAiJXM6JXMiLCBzb2FwLT51c2VyaWQsIHNvYXAtPnBhc3N3ZCk7CisgICAgc3RyY3B5KHNvYXAtPnRtcGJ1ZiwgIkJhc2ljICIpOworICAgIHNvYXBfczJiYXNlNjQoc29hcCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKShzb2FwLT50bXBidWYgKyAyNjIpLCBzb2FwLT50bXBidWYgKyA2LCBzdHJsZW4oc29hcC0+dG1wYnVmICsgMjYyKSk7CisgICAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQXV0aG9yaXphdGlvbiIsIHNvYXAtPnRtcGJ1ZikpKQorICAgICAgcmV0dXJuIGVycjsKKyAgfQorICBpZiAoc29hcC0+cHJveHlfdXNlcmlkICYmIHNvYXAtPnByb3h5X3Bhc3N3ZCAmJiBzdHJsZW4oc29hcC0+cHJveHlfdXNlcmlkKSArIHN0cmxlbihzb2FwLT5wcm94eV9wYXNzd2QpIDwgNzYxKQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmICsgMjYyLCAiJXM6JXMiLCBzb2FwLT5wcm94eV91c2VyaWQsIHNvYXAtPnByb3h5X3Bhc3N3ZCk7CisgICAgc3RyY3B5KHNvYXAtPnRtcGJ1ZiwgIkJhc2ljICIpOworICAgIHNvYXBfczJiYXNlNjQoc29hcCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKShzb2FwLT50bXBidWYgKyAyNjIpLCBzb2FwLT50bXBidWYgKyA2LCBzdHJsZW4oc29hcC0+dG1wYnVmICsgMjYyKSk7CisgICAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiUHJveHktQXV0aG9yaXphdGlvbiIsIHNvYXAtPnRtcGJ1ZikpKQorICAgICAgcmV0dXJuIGVycjsKKyAgfQorI2VuZGlmCisjaWZkZWYgV0lUSF9DT09LSUVTCisjaWZkZWYgV0lUSF9PUEVOU1NMCisgIGlmIChzb2FwX3B1dGNvb2tpZXMoc29hcCwgaG9zdCwgcGF0aCwgc29hcC0+c3NsICE9IE5VTEwpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNlbHNlCisgIGlmIChzb2FwX3B1dGNvb2tpZXMoc29hcCwgaG9zdCwgcGF0aCwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2VuZGlmCisjZW5kaWYKKyAgaWYgKGFjdGlvbiAmJiBzb2FwLT52ZXJzaW9uID09IDEpCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJcIiVzXCIiLCBhY3Rpb24pOworICAgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlNPQVBBY3Rpb24iLCBzb2FwLT50bXBidWYpKSkKKyAgICAgIHJldHVybiBlcnI7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmZwb3N0aGRyKHNvYXAsIE5VTEwsIE5VTEwpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50CitodHRwX3NlbmRfaGVhZGVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzKQoreyByZWdpc3RlciBjb25zdCBjaGFyICp0OworICBkbworICB7IHQgPSBzdHJjaHIocywgJ1xuJyk7IC8qIGRpc2FsbG93IFxuIGluIEhUVFAgaGVhZGVycyAqLworICAgIGlmICghdCkKKyAgICAgIHQgPSBzICsgc3RybGVuKHMpOworICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBzID0gdCArIDE7CisgIH0gd2hpbGUgKCp0KTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK2h0dHBfcG9zdF9oZWFkZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsKQoreyBpZiAoa2V5KQorICB7IGlmIChodHRwX3NlbmRfaGVhZGVyKHNvYXAsIGtleSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHZhbCAmJiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAiOiAiLCAyKSB8fCBodHRwX3NlbmRfaGVhZGVyKHNvYXAsIHZhbCkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsICJcclxuIiwgMik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK2h0dHBfcmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdGF0dXMsIHNpemVfdCBjb3VudCkKK3sgcmVnaXN0ZXIgaW50IGVycjsKKyNpZmRlZiBXTVdfUlBNX0lPCisgIGlmIChzb2FwLT5ycG1yZXFpZCkKKyAgICBodHRwT3V0cHV0RW5hYmxlKHNvYXAtPnJwbXJlcWlkKTsKKyNlbmRpZgorICBpZiAoIXN0YXR1cyB8fCBzdGF0dXMgPT0gU09BUF9IVE1MIHx8IHN0YXR1cyA9PSBTT0FQX0ZJTEUpCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJPSyAyMDBcbiIpKTsKKyNpZmRlZiBXTVdfUlBNX0lPCisgICAgaWYgKHNvYXAtPnJwbXJlcWlkIHx8IHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikgfHwgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkgLyogUlBNIGJlaGF2ZXMgYXMgaWYgc3RhbmRhbG9uZSAqLworI2Vsc2UKKyAgICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSB8fCBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKSAvKiBzdGFuZGFsb25lIGFwcGxpY2F0aW9uICovCisjZW5kaWYKKyAgICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiSFRUUC8lcyAyMDAgT0siLCBzb2FwLT5odHRwX3ZlcnNpb24pOworICAgICAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCBzb2FwLT50bXBidWYsIE5VTEwpKSkKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgZWxzZSBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJTdGF0dXMiLCAiMjAwIE9LIikpKQorICAgICAgcmV0dXJuIGVycjsKKyAgfQorICBlbHNlIGlmIChzdGF0dXMgPiAyMDAgJiYgc3RhdHVzIDwgNjAwKQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiSFRUUC8lcyAlZCAlcyIsIHNvYXAtPmh0dHBfdmVyc2lvbiwgc3RhdHVzLCBodHRwX2Vycm9yKHNvYXAsIHN0YXR1cykpOworICAgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgc29hcC0+dG1wYnVmLCBOVUxMKSkpCisgICAgICByZXR1cm4gZXJyOworI2lmbmRlZiBXSVRIX0xFQU4gCisgICAgaWYgKHN0YXR1cyA9PSA0MDEpCisgICAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIkJhc2ljIHJlYWxtPVwiJXNcIiIsIHNvYXAtPmF1dGhyZWFsbSA/IHNvYXAtPmF1dGhyZWFsbSA6ICJnU09BUCBXZWIgU2VydmljZSIpOworICAgICAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiV1dXLUF1dGhlbnRpY2F0ZSIsIHNvYXAtPnRtcGJ1ZikpKQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBlbHNlIGlmICgoc3RhdHVzID49IDMwMSAmJiBzdGF0dXMgPD0gMzAzKSB8fCBzdGF0dXMgPT0gMzA3KQorICAgIHsgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiTG9jYXRpb24iLCBzb2FwLT5lbmRwb2ludCkpKQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyNlbmRpZgorICB9CisgIGVsc2UKKyAgeyBjb25zdCBjaGFyICpzID0gKnNvYXBfZmF1bHRjb2RlKHNvYXApOworICAgIGlmIChzb2FwLT52ZXJzaW9uID09IDIgJiYgIXN0cmNtcChzLCAiU09BUC1FTlY6U2VuZGVyIikpCisgICAgICBzID0gIjQwMCBCYWQgUmVxdWVzdCI7CisgICAgZWxzZQorICAgICAgcyA9ICI1MDAgSW50ZXJuYWwgU2VydmVyIEVycm9yIjsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVycm9yICVzIChzdGF0dXM9JWQpXG4iLCBzLCBzdGF0dXMpKTsKKyNpZmRlZiBXTVdfUlBNX0lPCisgICAgaWYgKHNvYXAtPnJwbXJlcWlkIHx8IHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikgfHwgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkgLyogUlBNIGJlaGF2ZXMgYXMgaWYgc3RhbmRhbG9uZSAqLworI2Vsc2UKKyAgICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSB8fCBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKSAvKiBzdGFuZGFsb25lIGFwcGxpY2F0aW9uICovCisjZW5kaWYKKyAgICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiSFRUUC8lcyAlcyIsIHNvYXAtPmh0dHBfdmVyc2lvbiwgcyk7CisgICAgICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgTlVMTCkpKQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBlbHNlIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlN0YXR1cyIsIHMpKSkKKyAgICAgIHJldHVybiBlcnI7CisgIH0KKyAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiU2VydmVyIiwgImdTT0FQLzIuNyIpKQorICAgfHwgKGVyciA9IHNvYXBfcHV0aHR0cGhkcihzb2FwLCBzdGF0dXMsIGNvdW50KSkpCisgICAgcmV0dXJuIGVycjsKKyNpZmRlZiBXSVRIX0NPT0tJRVMKKyAgaWYgKHNvYXBfcHV0c2V0Y29va2llcyhzb2FwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjZW5kaWYKKyAgcmV0dXJuIHNvYXAtPmZwb3N0aGRyKHNvYXAsIE5VTEwsIE5VTEwpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdGF0dXMpCit7IHJlZ2lzdGVyIHNpemVfdCBjb3VudDsKKyAgaWYgKCEoc29hcC0+b21vZGUgJiAoU09BUF9FTkNfWE1MIHwgU09BUF9JT19TVE9SRSAvKiB0aGlzIHRlc3RzIGZvciBjaHVua2luZyB0b28gKi8pKQorICAgJiYgKHN0YXR1cyA9PSBTT0FQX0hUTUwgfHwgc3RhdHVzID09IFNPQVBfRklMRSkpCisgIHsgc29hcC0+b21vZGUgJj0gflNPQVBfSU87CisgICAgc29hcC0+b21vZGUgfD0gU09BUF9JT19TVE9SRTsKKyAgfQorICBzb2FwLT5zdGF0dXMgPSBzdGF0dXM7CisgIGNvdW50ID0gc29hcF9jb3VudF9hdHRhY2htZW50cyhzb2FwKTsKKyAgaWYgKHNvYXBfYmVnaW5fc2VuZChzb2FwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjaWZuZGVmIFdJVEhfTk9IVFRQCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pICE9IFNPQVBfSU9fU1RPUkUgJiYgIShzb2FwLT5tb2RlICYgU09BUF9FTkNfWE1MKSkKKyAgeyByZWdpc3RlciBpbnQgbiA9IHNvYXAtPm1vZGU7CisgICAgc29hcC0+bW9kZSAmPSB+KFNPQVBfSU8gfCBTT0FQX0VOQ19aTElCKTsKKyAgICBpZiAoKG4gJiBTT0FQX0lPKSAhPSBTT0FQX0lPX0ZMVVNIKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX0JVRkZFUjsKKyAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnJlc3BvbnNlKHNvYXAsIHN0YXR1cywgY291bnQpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgICBpZiAoKG4gJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKQorICAgIHsgaWYgKHNvYXBfZmx1c2goc29hcCkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisjZW5kaWYKKyAgICBzb2FwLT5tb2RlID0gbjsKKyAgfQorI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIGNvbnN0IGNoYXIqCitzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICp0KQoreyBpZiAoKnNvYXAtPnRhZykKKyAgICBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIlZhbGlkYXRpb24gY29uc3RyYWludCB2aW9sYXRpb246ICVzJXMgaW4gZWxlbWVudCA8JXM+IiwgcywgdD90OlNPQVBfU1RSX0VPUywgc29hcC0+dGFnKTsKKyAgZWxzZQorICAgIHNwcmludGYoc29hcC0+bXNnYnVmLCAiVmFsaWRhdGlvbiBjb25zdHJhaW50IHZpb2xhdGlvbjogJXMlcyIsIHMsIHQ/dDpTT0FQX1NUUl9FT1MpOworICByZXR1cm4gc29hcC0+bXNnYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXApCit7IGNvbnN0IGNoYXIgKipjID0gc29hcF9mYXVsdGNvZGUoc29hcCk7CisgIGNvbnN0IGNoYXIgKipzID0gc29hcF9mYXVsdHN0cmluZyhzb2FwKTsKKyAgaWYgKCEqYyAmJiAhKnMgJiYgc29hcC0+ZnNldGVycm9yKQorICAgIHNvYXAtPmZzZXRlcnJvcihzb2FwLCBjLCBzKTsKKyAgaWYgKCEqYykKKyAgeyBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICAgICAgKmMgPSAiU09BUC1FTlY6U2VuZGVyIjsKKyAgICBlbHNlCisgICAgICAqYyA9ICJTT0FQLUVOVjpDbGllbnQiOworICB9CisgIGlmICgqcykKKyAgICByZXR1cm47CisgIHN3aXRjaCAoc29hcC0+ZXJyb3IpCisgIHsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgY2FzZSBTT0FQX0NMSV9GQVVMVDoKKyAgICAgICpzID0gIkNsaWVudCBmYXVsdCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfU1ZSX0ZBVUxUOgorICAgICAgKnMgPSAiU2VydmVyIGZhdWx0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9UQUdfTUlTTUFUQ0g6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgInRhZyBuYW1lIG9yIG5hbWVzcGFjZSBtaXNtYXRjaCIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1RZUEU6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgImRhdGEgdHlwZSBtaXNtYXRjaCAiLCBzb2FwLT50eXBlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9TWU5UQVhfRVJST1I6CisgICAgICAqcyA9ICJXZWxsLWZvcm1lZG5lc3MgdmlvbGF0aW9uIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9OT19UQUc6CisgICAgICAqcyA9ICJObyBYTUwgZWxlbWVudCB0YWciOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX01VU1RVTkRFUlNUQU5EOgorICAgICAgKmMgPSAiU09BUC1FTlY6TXVzdFVuZGVyc3RhbmQiOworICAgICAgc3ByaW50Zihzb2FwLT5tc2didWYsICJUaGUgZGF0YSBpbiBlbGVtZW50ICclcycgbXVzdCBiZSB1bmRlcnN0b29kIGJ1dCBjYW5ub3QgYmUgaGFuZGxlZCIsIHNvYXAtPnRhZyk7CisgICAgICAqcyA9IHNvYXAtPm1zZ2J1ZjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9WRVJTSU9OTUlTTUFUQ0g6CisgICAgICAqYyA9ICJTT0FQLUVOVjpWZXJzaW9uTWlzbWF0Y2giOworICAgICAgKnMgPSAiU09BUCB2ZXJzaW9uIG1pc21hdGNoIG9yIGludmFsaWQgU09BUCBtZXNzYWdlIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9EQVRBRU5DT0RJTkdVTktOT1dOOgorICAgICAgKmMgPSAiU09BUC1FTlY6RGF0YUVuY29kaW5nVW5rbm93biI7CisgICAgICAqcyA9ICJVbnN1cHBvcnRlZCBTT0FQIGRhdGEgZW5jb2RpbmciOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX05BTUVTUEFDRToKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAibmFtZXNwYWNlIG1pc21hdGNoIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfVVNFUl9FUlJPUjoKKyAgICAgICpzID0gIlVzZXIgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0ZBVEFMX0VSUk9SOgorICAgICAgKnMgPSAiRmF0YWwgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX05PX01FVEhPRDoKKyAgICAgIHNwcmludGYoc29hcC0+bXNnYnVmLCAiTWV0aG9kICclcycgbm90IGltcGxlbWVudGVkOiBtZXRob2QgbmFtZSBvciBuYW1lc3BhY2Ugbm90IHJlY29nbml6ZWQiLCBzb2FwLT50YWcpOworICAgICAgKnMgPSBzb2FwLT5tc2didWY7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfR0VUX01FVEhPRDoKKyAgICAgICpzID0gIkhUVFAgR0VUIG1ldGhvZCBub3QgaW1wbGVtZW50ZWQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0VPTToKKyAgICAgICpzID0gIk91dCBvZiBtZW1vcnkiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0lPQjoKKyAgICAgICpzID0gIkFycmF5IGluZGV4IG91dCBvZiBib3VuZHMiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX05VTEw6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgIm5pbCBub3QgYWxsb3dlZCIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0RVUExJQ0FURV9JRDoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAibXVsdGlwbGUgZGVmaW5pdGlvbnMgb2YgaWQgIiwgc29hcC0+aWQpOworICAgICAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgICAgICAgKnNvYXBfZmF1bHRzdWJjb2RlKHNvYXApID0gIlNPQVAtRU5DOkR1cGxpY2F0ZUlEIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9NSVNTSU5HX0lEOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJtaXNzaW5nIGlkIGZvciByZWYgIiwgc29hcC0+aWQpOworICAgICAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgICAgICAgKnNvYXBfZmF1bHRzdWJjb2RlKHNvYXApID0gIlNPQVAtRU5DOk1pc3NpbmdJRCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfSFJFRjoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAiaW5jb21wYXRpYmxlIG9iamVjdCByZWYgIiwgc29hcC0+aWQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0ZBVUxUOgorICAgICAgYnJlYWs7CisjaWZuZGVmIFdJVEhfTk9JTworICAgIGNhc2UgU09BUF9VRFBfRVJST1I6CisgICAgICAqcyA9ICJNZXNzYWdlIHRvbyBsYXJnZSBmb3IgVURQIHBhY2tldCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfVENQX0VSUk9SOgorICAgICAgKnMgPSB0Y3BfZXJyb3Ioc29hcCk7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgU09BUF9IVFRQX0VSUk9SOgorICAgICAgKnMgPSAiSFRUUCBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfU1NMX0VSUk9SOgorI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgICAgKnMgPSAiU1NMIGVycm9yIjsKKyNlbHNlCisgICAgICAqcyA9ICJPcGVuU1NMIG5vdCBpbnN0YWxsZWQ6IHJlY29tcGlsZSB3aXRoIC1EV0lUSF9PUEVOU1NMIjsKKyNlbmRpZgorICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1BMVUdJTl9FUlJPUjoKKyAgICAgICpzID0gIlBsdWdpbiByZWdpc3RyeSBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfRElNRV9FUlJPUjoKKyAgICAgICpzID0gIkRJTUUgZm9ybWF0IGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9ESU1FX0hSRUY6CisgICAgICAqcyA9ICJESU1FIGhyZWYgdG8gbWlzc2luZyBhdHRhY2htZW50IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9ESU1FX01JU01BVENIOgorICAgICAgKnMgPSAiRElNRSB2ZXJzaW9uL3RyYW5zbWlzc2lvbiBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfRElNRV9FTkQ6CisgICAgICAqcyA9ICJFbmQgb2YgRElNRSBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTUlNRV9FUlJPUjoKKyAgICAgICpzID0gIk1JTUUgZm9ybWF0IGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9NSU1FX0hSRUY6CisgICAgICAqcyA9ICJNSU1FIGhyZWYgdG8gbWlzc2luZyBhdHRhY2htZW50IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9NSU1FX0VORDoKKyAgICAgICpzID0gIkVuZCBvZiBNSU1FIGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9aTElCX0VSUk9SOgorI2lmZGVmIFdJVEhfWkxJQgorICAgICAgc3ByaW50Zihzb2FwLT5tc2didWYsICJabGliL2d6aXAgZXJyb3I6ICclcyciLCBzb2FwLT5kX3N0cmVhbS5tc2c/c29hcC0+ZF9zdHJlYW0ubXNnOiIiKTsKKyAgICAgICpzID0gc29hcC0+bXNnYnVmOworI2Vsc2UKKyAgICAgICpzID0gIlpsaWIvZ3ppcCBub3QgaW5zdGFsbGVkIGZvciAoZGUpY29tcHJlc3Npb246IHJlY29tcGlsZSB3aXRoIC1EV0lUSF9HWklQIjsKKyNlbmRpZgorICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1JFUVVJUkVEOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJtaXNzaW5nIHJlcXVpcmVkIGF0dHJpYnV0ZSIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1BST0hJQklURUQ6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgInByb2hpYml0ZWQgYXR0cmlidXRlIHByZXNlbnQiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9PQ0NVUlM6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgIm1pbi9tYXhPY2N1cnMgdmlvbGF0aW9uIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTEVOR1RIOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJjb250ZW50IGxlbmd0aCB2aW9sYXRpb24iLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9TVE9QOgorICAgICAgKnMgPSAiU3RvcHBlZDogbm8gcmVzcG9uc2Ugc2VudCI7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgU09BUF9FT0Y6CisjaWZuZGVmIFdJVEhfTk9JTworICAgICAgc3ByaW50Zihzb2FwLT5tc2didWYsICJFbmQgb2YgZmlsZSBvciBubyBpbnB1dDogJyVzJyIsIHNvYXBfc3RyZXJyb3Ioc29hcCkpOworICAgICAgKnMgPSBzb2FwLT5tc2didWY7CisgICAgICBicmVhazsKKyNlbHNlCisgICAgICAqcyA9ICJFbmQgb2YgZmlsZSBvciBubyBpbnB1dCI7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgaWYgKHNvYXAtPmVycm9yID4gMjAwICYmIHNvYXAtPmVycm9yIDwgNjAwKQorICAgICAgeyBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIkhUVFAgRXJyb3I6ICVkICVzIiwgc29hcC0+ZXJyb3IsIGh0dHBfZXJyb3Ioc29hcCwgc29hcC0+ZXJyb3IpKTsKKyAgICAgICAgKnMgPSBzb2FwLT5tc2didWY7CisgICAgICB9CisgICAgICBlbHNlCisjZW5kaWYKKyNlbmRpZgorICAgICAgeyBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIkVycm9yICVkIiwgc29hcC0+ZXJyb3IpOworICAgICAgICAqcyA9IHNvYXAtPm1zZ2J1ZjsKKyAgICAgIH0KKyAgICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2VuZF9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IHN0YXR1cyA9IHNvYXAtPmVycm9yOworICBpbnQgciA9IDE7CisgIGlmIChzdGF0dXMgPT0gU09BUF9TVE9QKQorICAgIHJldHVybiBzdGF0dXM7CisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJTZW5kaW5nIGJhY2sgZmF1bHQgc3RydWN0IGZvciBlcnJvciBjb2RlICVkXG4iLCBzb2FwLT5lcnJvcikpOworICBzb2FwLT5rZWVwX2FsaXZlID0gMDsgLyogdG8gdGVybWluYXRlIGNvbm5lY3Rpb24gKi8KKyAgc29hcF9zZXRfZmF1bHQoc29hcCk7CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICBmZF9zZXQgcmZkLCBzZmQ7CisgICAgdGltZW91dC50dl9zZWMgPSAwOworICAgIHRpbWVvdXQudHZfdXNlYyA9IDA7CisgICAgRkRfWkVSTygmcmZkKTsKKyAgICBGRF9aRVJPKCZzZmQpOworICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmcmZkKTsKKyAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnNmZCk7CisgICAgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCAmcmZkLCAmc2ZkLCBOVUxMLCAmdGltZW91dCk7CisgICAgaWYgKHIgPiAwKQorICAgIHsgaWYgKCFGRF9JU1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmc2ZkKQorICAgICAgIHx8IChGRF9JU1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmcmZkKQorICAgICAgICAmJiByZWN2KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHNvYXAtPnRtcGJ1ZiwgMSwgTVNHX1BFRUspIDwgMCkpCisgICAgICAgIHIgPSAwOworICAgIH0KKyAgfQorI2VuZGlmCisjZW5kaWYKKyAgaWYgKChzdGF0dXMgIT0gU09BUF9FT0YgfHwgKCFzb2FwLT5yZWN2X3RpbWVvdXQgJiYgIXNvYXAtPnNlbmRfdGltZW91dCkpICYmIHIgPiAwKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgICBzb2FwX3NlcmlhbGl6ZWhlYWRlcihzb2FwKTsKKyAgICBzb2FwX3NlcmlhbGl6ZWZhdWx0KHNvYXApOworICAgIHNvYXBfYmVnaW5fY291bnQoc29hcCk7CisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICB7IHNvYXBfZW52ZWxvcGVfYmVnaW5fb3V0KHNvYXApOworICAgICAgc29hcF9wdXRoZWFkZXIoc29hcCk7CisgICAgICBzb2FwX2JvZHlfYmVnaW5fb3V0KHNvYXApOworICAgICAgc29hcF9wdXRmYXVsdChzb2FwKTsKKyAgICAgIHNvYXBfYm9keV9lbmRfb3V0KHNvYXApOworICAgICAgc29hcF9lbnZlbG9wZV9lbmRfb3V0KHNvYXApOworICAgIH0KKyAgICBzb2FwX2VuZF9jb3VudChzb2FwKTsKKyAgICBpZiAoc29hcF9yZXNwb25zZShzb2FwLCBzdGF0dXMpCisgICAgIHx8IHNvYXBfZW52ZWxvcGVfYmVnaW5fb3V0KHNvYXApCisgICAgIHx8IHNvYXBfcHV0aGVhZGVyKHNvYXApCisgICAgIHx8IHNvYXBfYm9keV9iZWdpbl9vdXQoc29hcCkKKyAgICAgfHwgc29hcF9wdXRmYXVsdChzb2FwKQorICAgICB8fCBzb2FwX2JvZHlfZW5kX291dChzb2FwKQorICAgICB8fCBzb2FwX2VudmVsb3BlX2VuZF9vdXQoc29hcCkpCisgICAgICByZXR1cm4gc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgc29hcF9lbmRfc2VuZChzb2FwKTsKKyAgfQorICBzb2FwLT5lcnJvciA9IHN0YXR1czsKKyAgcmV0dXJuIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlY3ZfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBzdGF0dXMgPSBzb2FwLT5lcnJvcjsKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlY2VpdmluZyBTT0FQIEZhdWx0XG4iKSk7CisgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgaWYgKHNvYXBfZ2V0ZmF1bHQoc29hcCkpCisgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVycm9yOiBzb2FwX2dldF9zb2FwZmF1bHQoKSBmYWlsZWQuIElzIHRoaXMgYSBTT0FQIG1lc3NhZ2UgYXQgYWxsP1xuIikpOworICAgICpzb2FwX2ZhdWx0Y29kZShzb2FwKSA9IChzb2FwLT52ZXJzaW9uID09IDIgPyAiU09BUC1FTlY6U2VuZGVyIiA6ICJTT0FQLUVOVjpDbGllbnQiKTsKKyAgICBzb2FwLT5lcnJvciA9IHN0YXR1czsKKyAgICBzb2FwX3NldF9mYXVsdChzb2FwKTsKKyAgfQorICBlbHNlCisgIHsgcmVnaXN0ZXIgY29uc3QgY2hhciAqcyA9ICpzb2FwX2ZhdWx0Y29kZShzb2FwKTsKKyAgICBpZiAoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHMsICJTT0FQLUVOVjpTZXJ2ZXIiKSB8fCAhc29hcF9tYXRjaF90YWcoc29hcCwgcywgIlNPQVAtRU5WOlJlY2VpdmVyIikpCisgICAgICBzdGF0dXMgPSBTT0FQX1NWUl9GQVVMVDsgCisgICAgZWxzZSBpZiAoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHMsICJTT0FQLUVOVjpDbGllbnQiKSB8fCAhc29hcF9tYXRjaF90YWcoc29hcCwgcywgIlNPQVAtRU5WOlNlbmRlciIpKQorICAgICAgc3RhdHVzID0gU09BUF9DTElfRkFVTFQ7CisgICAgZWxzZSBpZiAoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHMsICJTT0FQLUVOVjpNdXN0VW5kZXJzdGFuZCIpKQorICAgICAgc3RhdHVzID0gU09BUF9NVVNUVU5ERVJTVEFORDsKKyAgICBlbHNlIGlmICghc29hcF9tYXRjaF90YWcoc29hcCwgcywgIlNPQVAtRU5WOlZlcnNpb25NaXNtYXRjaCIpKQorICAgICAgc3RhdHVzID0gU09BUF9WRVJTSU9OTUlTTUFUQ0g7CisgICAgZWxzZQorICAgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZhdWx0IGNvZGUgJXNcbiIsIHMpKTsKKyAgICAgIHN0YXR1cyA9IFNPQVBfRkFVTFQ7CisgICAgfQorICAgIGlmIChzb2FwX2JvZHlfZW5kX2luKHNvYXApCisgICAgIHx8IHNvYXBfZW52ZWxvcGVfZW5kX2luKHNvYXApCisgICAgIHx8IHNvYXBfZW5kX3JlY3Yoc29hcCkpCisgICAgICByZXR1cm4gc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgc29hcC0+ZXJyb3IgPSBzdGF0dXM7CisgIH0KKyAgcmV0dXJuIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmRfZW1wdHlfcmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPmNvdW50ID0gMDsKKyAgaWYgKHNvYXBfcmVzcG9uc2Uoc29hcCwgU09BUF9PSykgfHwgc29hcF9lbmRfc2VuZChzb2FwKSkKKyAgICByZXR1cm4gc29hcF9jbG9zZXNvY2soc29hcCk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVjdl9lbXB0eV9yZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXBfYmVnaW5fcmVjdihzb2FwKSB8fCBzb2FwX2VuZF9yZWN2KHNvYXApKQorICAgIHJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY29uc3QgY2hhcioKK3NvYXBfc3RyZXJyb3Ioc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBlcnIgPSBzb2FwLT5lcnJudW07CisgIGlmIChlcnIpCisgIHsKKyNpZm5kZWYgV0lOMzIKKyAgICByZXR1cm4gc3RyZXJyb3IoZXJyKTsKKyNlbHNlCisgICAgRm9ybWF0TWVzc2FnZShGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTXxGT1JNQVRfTUVTU0FHRV9JR05PUkVfSU5TRVJUUywgTlVMTCwgZXJyLCAwLCAoTFBUU1RSKSZzb2FwLT5lcnJvcnN0ciwgc2l6ZW9mKHNvYXAtPmVycm9yc3RyKSwgTlVMTCk7CisgICAgcmV0dXJuIHNvYXAtPmVycm9yc3RyOworI2VuZGlmCisgIH0KKyAgcmV0dXJuICJPcGVyYXRpb24gaW50ZXJydXB0ZWQgb3IgdGltZWQgb3V0IjsKK30KKyNlbmRpZgorI2VuZGlmIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK3N0YXRpYyBpbnQKK3NvYXBfc2V0X2Vycm9yKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdGNvZGUsIGNvbnN0IGNoYXIgKmZhdWx0c3ViY29kZSwgY29uc3QgY2hhciAqZmF1bHRzdHJpbmcsIGNvbnN0IGNoYXIgKmZhdWx0ZGV0YWlsLCBpbnQgc29hcGVycm9yKQoreyAqc29hcF9mYXVsdGNvZGUoc29hcCkgPSBmYXVsdGNvZGU7CisgIGlmIChmYXVsdHN1YmNvZGUpCisgICAgKnNvYXBfZmF1bHRzdWJjb2RlKHNvYXApID0gZmF1bHRzdWJjb2RlOworICAqc29hcF9mYXVsdHN0cmluZyhzb2FwKSA9IGZhdWx0c3RyaW5nOworICBpZiAoZmF1bHRkZXRhaWwgJiYgKmZhdWx0ZGV0YWlsKQorICB7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKipzID0gc29hcF9mYXVsdGRldGFpbChzb2FwKTsKKyAgICBpZiAocykKKyAgICAgICpzID0gZmF1bHRkZXRhaWw7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yID0gc29hcGVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCwgaW50IHNvYXBlcnJvcikKK3sgcmV0dXJuIHNvYXBfc2V0X2Vycm9yKHNvYXAsIHNvYXAtPnZlcnNpb24gPT0gMiA/ICJTT0FQLUVOVjpTZW5kZXIiIDogIlNPQVAtRU5WOkNsaWVudCIsIE5VTEwsIGZhdWx0c3RyaW5nLCBmYXVsdGRldGFpbCwgc29hcGVycm9yKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCwgaW50IHNvYXBlcnJvcikKK3sgcmV0dXJuIHNvYXBfc2V0X2Vycm9yKHNvYXAsIHNvYXAtPnZlcnNpb24gPT0gMiA/ICJTT0FQLUVOVjpSZWNlaXZlciIgOiAiU09BUC1FTlY6U2VydmVyIiwgTlVMTCwgZmF1bHRzdHJpbmcsIGZhdWx0ZGV0YWlsLCBzb2FwZXJyb3IpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorc3RhdGljIGludAorc29hcF9jb3B5X2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdGNvZGUsIGNvbnN0IGNoYXIgKmZhdWx0c3ViY29kZSwgY29uc3QgY2hhciAqZmF1bHRzdHJpbmcsIGNvbnN0IGNoYXIgKmZhdWx0ZGV0YWlsKQoreyBjaGFyICpyID0gTlVMTCwgKnMgPSBOVUxMLCAqdCA9IE5VTEw7CisgIGlmIChmYXVsdHN1YmNvZGUpCisgICAgciA9IHNvYXBfc3RyZHVwKHNvYXAsIGZhdWx0c3ViY29kZSk7CisgIGlmIChmYXVsdHN0cmluZykKKyAgICBzID0gc29hcF9zdHJkdXAoc29hcCwgZmF1bHRzdHJpbmcpOworICBpZiAoZmF1bHRkZXRhaWwpCisgICAgdCA9IHNvYXBfc3RyZHVwKHNvYXAsIGZhdWx0ZGV0YWlsKTsKKyAgcmV0dXJuIHNvYXBfc2V0X2Vycm9yKHNvYXAsIGZhdWx0Y29kZSwgciwgcywgdCwgU09BUF9GQVVMVCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2VuZGVyX2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdHN0cmluZywgY29uc3QgY2hhciAqZmF1bHRkZXRhaWwpCit7IHJldHVybiBzb2FwX3NlbmRlcl9mYXVsdF9zdWJjb2RlKHNvYXAsIE5VTEwsIGZhdWx0c3RyaW5nLCBmYXVsdGRldGFpbCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2VuZGVyX2ZhdWx0X3N1YmNvZGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZhdWx0c3ViY29kZSwgY29uc3QgY2hhciAqZmF1bHRzdHJpbmcsIGNvbnN0IGNoYXIgKmZhdWx0ZGV0YWlsKQoreyByZXR1cm4gc29hcF9jb3B5X2ZhdWx0KHNvYXAsIHNvYXAtPnZlcnNpb24gPT0gMiA/ICJTT0FQLUVOVjpTZW5kZXIiIDogIlNPQVAtRU5WOkNsaWVudCIsIGZhdWx0c3ViY29kZSwgZmF1bHRzdHJpbmcsIGZhdWx0ZGV0YWlsKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWNlaXZlcl9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRzdHJpbmcsIGNvbnN0IGNoYXIgKmZhdWx0ZGV0YWlsKQoreyByZXR1cm4gc29hcF9yZWNlaXZlcl9mYXVsdF9zdWJjb2RlKHNvYXAsIE5VTEwsIGZhdWx0c3RyaW5nLCBmYXVsdGRldGFpbCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVjZWl2ZXJfZmF1bHRfc3ViY29kZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRzdWJjb2RlLCBjb25zdCBjaGFyICpmYXVsdHN0cmluZywgY29uc3QgY2hhciAqZmF1bHRkZXRhaWwpCit7IHJldHVybiBzb2FwX2NvcHlfZmF1bHQoc29hcCwgc29hcC0+dmVyc2lvbiA9PSAyID8gIlNPQVAtRU5WOlJlY2VpdmVyIiA6ICJTT0FQLUVOVjpTZXJ2ZXIiLCBmYXVsdHN1YmNvZGUsIGZhdWx0c3RyaW5nLCBmYXVsdGRldGFpbCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCisjaWZuZGVmIFdJVEhfTk9TVERMSUIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfcHJpbnRfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXAsIEZJTEUgKmZkKQoreyBpZiAoc29hcF9jaGVja19zdGF0ZShzb2FwKSkKKyAgICBmcHJpbnRmKGZkLCAiRXJyb3I6IHNvYXAgc3RydWN0IG5vdCBpbml0aWFsaXplZFxuIik7CisgIGVsc2UgaWYgKHNvYXAtPmVycm9yKQorICB7IGNvbnN0IGNoYXIgKmMsICp2ID0gTlVMTCwgKnMsICoqZDsKKyAgICBkID0gc29hcF9mYXVsdGNvZGUoc29hcCk7CisgICAgaWYgKCEqZCkKKyAgICAgIHNvYXBfc2V0X2ZhdWx0KHNvYXApOworICAgIGMgPSAqZDsKKyAgICBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICAgICAgdiA9ICpzb2FwX2ZhdWx0c3ViY29kZShzb2FwKTsKKyAgICBzID0gKnNvYXBfZmF1bHRzdHJpbmcoc29hcCk7CisgICAgZCA9IHNvYXBfZmF1bHRkZXRhaWwoc29hcCk7CisgICAgZnByaW50ZihmZCwgIiVzJWQgZmF1bHQ6ICVzIFslc11cblwiJXNcIlxuRGV0YWlsOiAlc1xuIiwgc29hcC0+dmVyc2lvbiA/ICJTT0FQIDEuIiA6ICJFcnJvciAiLCBzb2FwLT52ZXJzaW9uID8gKGludClzb2FwLT52ZXJzaW9uIDogc29hcC0+ZXJyb3IsIGMsIHYgPyB2IDogIm5vIHN1YmNvZGUiLCBzID8gcyA6ICJbbm8gcmVhc29uXSIsIGQgJiYgKmQgPyAqZCA6ICJbbm8gZGV0YWlsXSIpOworICB9Cit9CisjZW5kaWYKKyNlbmRpZgorIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCisjaWZuZGVmIFdJVEhfTk9TVERMSUIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfcHJpbnRfZmF1bHRfbG9jYXRpb24oc3RydWN0IHNvYXAgKnNvYXAsIEZJTEUgKmZkKQoreyAKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGludCBpLCBqLCBjMSwgYzI7CisgIGlmIChzb2FwLT5lcnJvciAmJiBzb2FwLT5idWZsZW4gPiAwKQorICB7IGkgPSAoaW50KXNvYXAtPmJ1ZmlkeCAtIDE7CisgICAgaWYgKGkgPD0gMCkKKyAgICAgIGkgPSAwOworICAgIGMxID0gc29hcC0+YnVmW2ldOworICAgIHNvYXAtPmJ1ZltpXSA9ICdcMCc7CisgICAgaWYgKChpbnQpc29hcC0+YnVmbGVuID49IGkgKyAxMDI0KQorICAgICAgaiA9IGkgKyAxMDIzOworICAgIGVsc2UKKyAgICAgIGogPSAoaW50KXNvYXAtPmJ1ZmxlbiAtIDE7CisgICAgYzIgPSBzb2FwLT5idWZbal07CisgICAgc29hcC0+YnVmW2pdID0gJ1wwJzsKKyAgICBmcHJpbnRmKGZkLCAiJXMlY1xuKiogSEVSRSAqKlxuIiwgc29hcC0+YnVmLCBjMSk7CisgICAgaWYgKHNvYXAtPmJ1ZmlkeCA8IHNvYXAtPmJ1ZmxlbikKKyAgICAgIGZwcmludGYoZmQsICIlc1xuIiwgc29hcC0+YnVmICsgc29hcC0+YnVmaWR4KTsKKyAgICBzb2FwLT5idWZbaV0gPSBjMTsKKyAgICBzb2FwLT5idWZbal0gPSBjMjsKKyAgfQorI2VuZGlmCit9CisjZW5kaWYKKyNlbmRpZgorIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVnaXN0ZXJfcGx1Z2luX2FyZyhzdHJ1Y3Qgc29hcCAqc29hcCwgaW50ICgqZmNyZWF0ZSkoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9wbHVnaW4qLCB2b2lkKiksIHZvaWQgKmFyZykKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGx1Z2luICpwOworICByZWdpc3RlciBpbnQgcjsKKyAgaWYgKCEocCA9IChzdHJ1Y3Qgc29hcF9wbHVnaW4qKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9wbHVnaW4pKSkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgIHAtPmlkID0gTlVMTDsKKyAgcC0+ZGF0YSA9IE5VTEw7CisgIHAtPmZjb3B5ID0gTlVMTDsKKyAgcC0+ZmRlbGV0ZSA9IE5VTEw7CisgIHIgPSBmY3JlYXRlKHNvYXAsIHAsIGFyZyk7CisgIGlmICghciAmJiBwLT5mZGVsZXRlKQorICB7IHAtPm5leHQgPSBzb2FwLT5wbHVnaW5zOworICAgIHNvYXAtPnBsdWdpbnMgPSBwOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVnaXN0ZXJlZCAnJXMnIHBsdWdpblxuIiwgcC0+aWQpKTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCByZWdpc3RlciBwbHVnaW4gJyVzJzogcGx1Z2luIHJldHVybmVkIGVycm9yICVkIChvciBmZGVsZXRlIGNhbGxiYWNrIG5vdCBzZXQpXG4iLCBwLT5pZD9wLT5pZDoiPyIsIHIpKTsKKyAgU09BUF9GUkVFKHNvYXAsIHApOworICByZXR1cm4gcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyB2b2lkICoKK2ZwbHVnaW4oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnA7CisgIGZvciAocCA9IHNvYXAtPnBsdWdpbnM7IHA7IHAgPSBwLT5uZXh0KQorICAgIGlmIChwLT5pZCA9PSBpZCB8fCAhc3RyY21wKHAtPmlkLCBpZCkpCisgICAgICByZXR1cm4gcC0+ZGF0YTsKKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkICoKK1NPQVBfRk1BQzIKK3NvYXBfbG9va3VwX3BsdWdpbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQpCit7IHJldHVybiBzb2FwLT5mcGx1Z2luKHNvYXAsIGlkKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIF9fY3BsdXNwbHVzCisjaWZuZGVmIFdJVEhfTEVBTgorc29hcDo6c29hcCgpCit7IHNvYXBfaW5pdCh0aGlzKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJQysrIHNvYXAgc3RydWN0IG1ldGhvZHMKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIF9fY3BsdXNwbHVzCisjaWZuZGVmIFdJVEhfTEVBTgorc29hcDo6c29hcChzb2FwX21vZGUgbW9kZSkKK3sgc29hcF9pbml0MSh0aGlzLCBtb2RlKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpZm5kZWYgV0lUSF9MRUFOCitzb2FwOjpzb2FwKHNvYXBfbW9kZSBpbW9kZSwgc29hcF9tb2RlIG9tb2RlKQoreyBzb2FwX2luaXQyKHRoaXMsIGltb2RlLCBvbW9kZSk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIF9fY3BsdXNwbHVzCisjaWZuZGVmIFdJVEhfTEVBTgorc29hcDo6c29hcChzdHJ1Y3Qgc29hcCYgc29hcCkKK3sgc29hcF9jb3B5X2NvbnRleHQodGhpcywgJnNvYXApOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworI2lmbmRlZiBXSVRIX0xFQU4KK3NvYXA6On5zb2FwKCkKK3sgc29hcF9kZXN0cm95KHRoaXMpOworICBzb2FwX2VuZCh0aGlzKTsKKyAgc29hcF9kb25lKHRoaXMpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvY2FsY19WQ19OT0hUVFAvc3Rkc29hcDIuaCBiL3NhbXBsZXMvY2FsY19WQ19OT0hUVFAvc3Rkc29hcDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2Y0NWJkCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9jYWxjX1ZDX05PSFRUUC9zdGRzb2FwMi5oCkBAIC0wLDAgKzEsMjA5MyBAQAorLyoKKworc3Rkc29hcDIuaCAyLjcuNmUKKworZ1NPQVAgcnVudGltZQorCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHBhcnQgb2YgdGhlIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2VzOgorR1BMLCB0aGUgZ1NPQVAgcHVibGljIGxpY2Vuc2UsIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDb250cmlidXRvcnM6CisKK1dpbmQgUml2ZXIgU3lzdGVtcywgSW5jLiwgZm9yIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25zIChtYXJrZWQgV1JbLi4uXSk6CisgIC0gdnhXb3JrcyBjb21wYXRpYmxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgcHVibGljIGxpY2Vuc2UuCisKK1RoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGdTT0FQIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4zCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKK0xpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoraHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL3NvYXBsaWNlbnNlLmh0bWwKK1NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCitXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKK2ZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK1RoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4uCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmZGVmIFdJVEhfU09BUERFRlNfSAorIyBpbmNsdWRlICJzb2FwZGVmcy5oIgkJLyogaW5jbHVkZSB1c2VyLWRlZmluZWQgc3R1ZmYgKi8KKyNlbmRpZgorCisjaWZuZGVmIF9USFJFQURfU0FGRQorIyBkZWZpbmUgX1RIUkVBRF9TQUZFCisjZW5kaWYKKworI2lmbmRlZiBPUEVOU0VSVkVSCisjIGlmbmRlZiBfUkVFTlRSQU5UCisjICBkZWZpbmUgX1JFRU5UUkFOVAorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9GTUFDMQkvKiBzdGRzb2FwMi5oIGRlY2xhcmF0aW9uIG1hY3JvICovCisjIGRlZmluZSBTT0FQX0ZNQUMxCisjZW5kaWYKKworI2lmbmRlZiBTT0FQX0ZNQUMyCS8qIHN0ZHNvYXAyLmggZGVjbGFyYXRpb24gbWFjcm8gKi8KKyMgZGVmaW5lIFNPQVBfRk1BQzIKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfRk1BQzMJLyogKGRlKXNlcmlhbGl6ZXIgZGVjbGFyYXRpb24gbWFjcm8gKi8KKyMgZGVmaW5lIFNPQVBfRk1BQzMKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfRk1BQzNTCS8qIHN0cmluZyBjb252ZXJ0ZXIgZm9yIChkZSlzZXJpYWxpemVyIGRlY2xhcmF0aW9uIG1hY3JvICovCisjIGRlZmluZSBTT0FQX0ZNQUMzUyBTT0FQX0ZNQUMzCisjZW5kaWYKKworI2lmbmRlZiBTT0FQX0ZNQUM0CS8qIChkZSlzZXJpYWxpemVyIGRlY2xhcmF0aW9uIG1hY3JvICovCisjIGRlZmluZSBTT0FQX0ZNQUM0CisjZW5kaWYKKworI2lmbmRlZiBTT0FQX0ZNQUM0UwkvKiBzdHJpbmcgY29udmVydGVyIGZvciAoZGUpc2VyaWFsaXplciBkZWNsYXJhdGlvbiBtYWNybyAqLworIyBkZWZpbmUgU09BUF9GTUFDNFMgU09BUF9GTUFDNAorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9GTUFDNQkvKiBzdHViL3NrZWxldG9uIGRlY2xhcmF0aW9uIG1hY3JvICovCisjIGRlZmluZSBTT0FQX0ZNQUM1CisjZW5kaWYKKworI2lmbmRlZiBTT0FQX0ZNQUM2CS8qIHN0dWIvc2tlbGV0b24gZGVjbGFyYXRpb24gbWFjcm8gKi8KKyMgZGVmaW5lIFNPQVBfRk1BQzYKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfQ01BQwkvKiBjbGFzcyBkZWNsYXJhdGlvbiBtYWNybyAqLworIyBkZWZpbmUgU09BUF9DTUFDCisjZW5kaWYKKworI2lmbmRlZiBTT0FQX05NQUMJLyogbmFtZXNwYWNlIHRhYmxlIGRlY2xhcmF0aW9uIG1hY3JvICovCisjIGRlZmluZSBTT0FQX05NQUMKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfU09VUkNFX1NUQU1QCisjIGRlZmluZSBTT0FQX1NPVVJDRV9TVEFNUChzdHIpCisjZW5kaWYKKworLyogZ1NPQVAgMi43LjQgYW5kIGhpZ2hlcjogZmFzdCBsb29rLWFzaWRlIGJ1ZmZlcmluZyBpcyBzdGFibGUgKi8KKyNpZm5kZWYgV0lUSF9GQVNUCisjIGRlZmluZSBXSVRIX0ZBU1QKKyNlbmRpZgorCisjaWZkZWYgV0lUSF9MRUFORVIKKyMgaWZuZGVmIFdJVEhfTEVBTgorIyAgZGVmaW5lIFdJVEhfTEVBTgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBXSVRIX0xFQU4KKyMgaWZkZWYgV0lUSF9DT09LSUVTCisjICBlcnJvciAiQ2Fubm90IGJ1aWxkIFdJVEhfTEVBTiBjb2RlIFdJVEhfQ09PS0lFUyBlbmFibGVkIgorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgU1REU09BUF9ICisjZGVmaW5lIFNURFNPQVBfSAorCisjaWYgZGVmaW5lZChfX3Z4d29ya3MpIHx8IGRlZmluZWQoX19WWFdPUktTX18pCisjIGRlZmluZSBWWFdPUktTCisjZW5kaWYKKworI2lmZGVmIF9XSU4zMgorIyBpZm5kZWYgV0lOMzIKKyMgIGRlZmluZSBXSU4zMgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBVTkRFUl9DRQorIyBpZm5kZWYgV0lOMzIKKyMgIGRlZmluZSBXSU4zMgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX0JPUkxBTkRDX18KKyMgaWZkZWYgX19XSU4zMl9fCisjICBpZm5kZWYgV0lOMzIKKyMgICBkZWZpbmUgV0lOMzIKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fQ1lHV0lOX18KKyMgaWZuZGVmIENZR1dJTgorIyAgZGVmaW5lIENZR1dJTgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX1NZTUJJQU4zMl9fIAorIyBkZWZpbmUgU1lNQklBTgorIyB1bmRlZiBXSU4zMgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fcGFsbW9zX18pIHx8IGRlZmluZWQoUEFMTV9HQ0MpIHx8IGRlZmluZWQoX19QQUxNT1NfVFJBUFNfXykKKyMgaWZuZGVmIFBBTE0KKyMgIGRlZmluZSBQQUxNCisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19ocHV4KQorIyBpZm5kZWYgSFBfVVgKKyMgIGRlZmluZSBIUF9VWAorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fYWxwaGEpICYmICFkZWZpbmVkKF9fVk1TKQorIyBpZm5kZWYgVFJVNjQKKyMgIGRlZmluZSBUUlU2NCAKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19NVlNfXworIyBpZm5kZWYgT1MzOTAKKyMgIGRlZmluZSBPUzM5MAorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgImNvbmZpZy5oIgorIyBpZmRlZiBXSVRIX09QRU5TU0wKKyMgIGlmbmRlZiBIQVZFX09QRU5TU0xfU1NMX0gKKyMgICB1bmRlZiBXSVRIX09QRU5TU0wKKyMgIGVuZGlmCisjIGVuZGlmCisjZWxzZQorIyBpZiBkZWZpbmVkKFVOREVSX0NFKQorIyAgZGVmaW5lIFdJVEhfTEVBTgorIyAgZGVmaW5lIEhBVkVfU1NDQU5GCisjIGVsaWYgZGVmaW5lZChXSU4zMikKKyMgIGRlZmluZSBIQVZFX1NUUlJDSFIKKyMgIGRlZmluZSBIQVZFX1NUUlRPRAorIyAgZGVmaW5lIEhBVkVfU1NDQU5GCisjICBkZWZpbmUgSEFWRV9TVFJUT0wKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUwKKyMgIGRlZmluZSBIQVZFX1NZU19USU1FQl9ICisjICBkZWZpbmUgSEFWRV9GVElNRQorIyAgZGVmaW5lIEhBVkVfV0NUT01CCisjICBkZWZpbmUgSEFWRV9NQlRPV0MKKyMgIGRlZmluZSBTT0FQX0xPTkdfRk9STUFUICIlSTY0ZCIKKyMgIGRlZmluZSBTT0FQX1VMT05HX0ZPUk1BVCAiJUk2NHUiCisjIGVsaWYgZGVmaW5lZChDWUdXSU4pCisjICBkZWZpbmUgSEFWRV9TVFJSQ0hSCisjICBkZWZpbmUgSEFWRV9TVFJUT0QKKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyAgZGVmaW5lIEhBVkVfU1RSVE9MCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMCisjICBkZWZpbmUgSEFWRV9TWVNfVElNRUJfSAorIyAgZGVmaW5lIEhBVkVfRlRJTUUKKyMgIGRlZmluZSBIQVZFX1JBTkRfUgorIyAgZGVmaW5lIEhBVkVfR01USU1FX1IKKyMgIGRlZmluZSBIQVZFX0xPQ0FMVElNRV9SCisjICBkZWZpbmUgSEFWRV9XQ1RPTUIKKyMgIGRlZmluZSBIQVZFX01CVE9XQworIyBlbGlmIGRlZmluZWQoX19BUFBMRV9fKQorIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfUkFORF9SCisjICBkZWZpbmUgSEFWRV9HTVRJTUVfUgorIyAgZGVmaW5lIEhBVkVfTE9DQUxUSU1FX1IKKyMgIGRlZmluZSBIQVZFX1RJTUVHTQorIyAgZGVmaW5lIEhBVkVfV0NUT01CCisjICBkZWZpbmUgSEFWRV9NQlRPV0MKKyMgZWxpZiBkZWZpbmVkKF9BSVhWRVJTSU9OXzQzMSkKKyMgIGRlZmluZSBIQVZFX1NUUlJDSFIKKyMgIGRlZmluZSBIQVZFX1NUUlRPRAorIyAgZGVmaW5lIEhBVkVfU1NDQU5GCisjICBkZWZpbmUgSEFWRV9TVFJUT0wKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUwKKyMgIGRlZmluZSBIQVZFX1NZU19USU1FQl9ICisjICBkZWZpbmUgSEFWRV9GVElNRQorIyAgZGVmaW5lIEhBVkVfUkFORF9SCisjICBkZWZpbmUgSEFWRV9HTVRJTUVfUgorIyAgZGVmaW5lIEhBVkVfTE9DQUxUSU1FX1IKKyMgIGRlZmluZSBIQVZFX1dDVE9NQgorIyAgZGVmaW5lIEhBVkVfTUJUT1dDCisjIGVsaWYgZGVmaW5lZChIUF9VWCkKKyMgIGRlZmluZSBIQVZFX1NUUlJDSFIKKyMgIGRlZmluZSBIQVZFX1NUUlRPRAorIyAgZGVmaW5lIEhBVkVfU1NDQU5GCisjICBkZWZpbmUgSEFWRV9TVFJUT0wKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUwKKyMgIGRlZmluZSBIQVZFX1NZU19USU1FQl9ICisjICBkZWZpbmUgSEFWRV9GVElNRQorIyAgZGVmaW5lIEhBVkVfUkFORF9SCisjICBkZWZpbmUgSEFWRV9HTVRJTUVfUgorIyAgZGVmaW5lIEhBVkVfTE9DQUxUSU1FX1IKKyMgIGRlZmluZSBIQVZFX1dDVE9NQgorIyAgZGVmaW5lIEhBVkVfTUJUT1dDCisjIGVsaWYgZGVmaW5lZChGUkVFQlNEKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQorIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9MTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTEwKKyMgIGRlZmluZSBIQVZFX0dFVFRJTUVPRkRBWQorIyAgZGVmaW5lIEhBVkVfUkFORF9SCisjICBkZWZpbmUgSEFWRV9HTVRJTUVfUgorIyAgZGVmaW5lIEhBVkVfTE9DQUxUSU1FX1IKKyMgIGRlZmluZSBIQVZFX1dDVE9NQgorIyAgZGVmaW5lIEhBVkVfTUJUT1dDCisjICBkZWZpbmUgU09BUF9MT05HX0ZPUk1BVCAiJXFkIgorIyAgZGVmaW5lIFNPQVBfVUxPTkdfRk9STUFUICIlcXUiCisjIGVsaWYgZGVmaW5lZChfX1ZNUykKKyMgIGRlZmluZSBIQVZFX1NUUlJDSFIKKyMgIGRlZmluZSBIQVZFX1NUUlRPRAorIyAgZGVmaW5lIEhBVkVfU1NDQU5GCisjICBkZWZpbmUgSEFWRV9TVFJUT0wKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUwKKyMgIGRlZmluZSBIQVZFX1NZU19USU1FQl9ICisjICBkZWZpbmUgSEFWRV9GVElNRQorIyAgZGVmaW5lIEhBVkVfUkFORF9SCisjICBkZWZpbmUgSEFWRV9HTVRJTUVfUgorIyAgZGVmaW5lIEhBVkVfTE9DQUxUSU1FX1IKKyMgIGRlZmluZSBIQVZFX1dDVE9NQgorIyAgZGVmaW5lIEhBVkVfTUJUT1dDCisjIGVsaWYgZGVmaW5lZChfX0dMSUJDX18pIHx8IGRlZmluZWQoX19HTlVfXykKKyMgIGRlZmluZSBIQVZFX1NUUlJDSFIKKyMgIGRlZmluZSBIQVZFX1NUUlRPRAorIyAgZGVmaW5lIEhBVkVfU1NDQU5GCisjICBkZWZpbmUgSEFWRV9TVFJUT0wKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUwKKyMgIGRlZmluZSBIQVZFX1NUUlRPTEwKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUxMCisjICBkZWZpbmUgSEFWRV9TWVNfVElNRUJfSAorIyAgZGVmaW5lIEhBVkVfRlRJTUUKKyMgIGRlZmluZSBIQVZFX1JBTkRfUgorIyAgZGVmaW5lIEhBVkVfR01USU1FX1IKKyMgIGRlZmluZSBIQVZFX0xPQ0FMVElNRV9SCisjICBkZWZpbmUgSEFWRV9USU1FR00KKyMgIGRlZmluZSBIQVZFX1dDVE9NQgorIyAgZGVmaW5lIEhBVkVfTUJUT1dDCisjICBkZWZpbmUgSEFWRV9JU05BTgorIyBlbGlmIGRlZmluZWQoVFJVNjQpCisjICBkZWZpbmUgSEFWRV9TVFJSQ0hSCisjICBkZWZpbmUgSEFWRV9TVFJUT0QKKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyAgZGVmaW5lIEhBVkVfU1RSVE9MCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMCisjICBkZWZpbmUgSEFWRV9TVFJUT0xMCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMTAorIyAgZGVmaW5lIEhBVkVfR0VUVElNRU9GREFZCisjICBkZWZpbmUgSEFWRV9TWVNfVElNRUJfSAorIyAgZGVmaW5lIEhBVkVfUkFORF9SCisjICBkZWZpbmUgSEFWRV9HTVRJTUVfUgorIyAgZGVmaW5lIEhBVkVfTE9DQUxUSU1FX1IKKyMgIGRlZmluZSBfX1VTRV9TVERfSU9TVFJFQU0KKyMgIGRlZmluZSBIQVZFX1dDVE9NQgorIyAgZGVmaW5lIEhBVkVfTUJUT1dDCisjICBkZWZpbmUgU09BUF9MT05HX0ZPUk1BVCAiJWxkIgorIyAgZGVmaW5lIFNPQVBfVUxPTkdfRk9STUFUICIlbHUiCisjIGVsaWYgZGVmaW5lZChNQUNfQ0FSQk9OKQorIyAgZGVmaW5lIFdJVEhfTk9JTworIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfRlRJTUUKKyMgIGRlZmluZSBIQVZFX1JBTkRfUgorIyAgZGVmaW5lIEhBVkVfR0VUSE9TVEJZTkFNRV9SCisjICBkZWZpbmUgSEFWRV9HTVRJTUVfUgorIyAgZGVmaW5lIEhBVkVfTE9DQUxUSU1FX1IKKyMgIGRlZmluZSBIQVZFX1dDVE9NQgorIyAgZGVmaW5lIEhBVkVfTUJUT1dDCisjIGVsaWYgZGVmaW5lZChQQUxNKQorIyAgZGVmaW5lIFdJVEhfTEVBTgorIyAgZGVmaW5lIEhBVkVfU1RSVE9EICAgLyogc3RydG9kKCkgaXMgZGVmaW5lZCBpbiBwYWxtRnVuY3Rpb25zLmggKi8KKyMgIGluY2x1ZGUgPHN0ZGxpYi5oPgkvKiBOZWVkcyB0byBiZSBpbmNsdWRlZCBiZWZvcmUgdW5peCBoZWFkZXJzICovCisjICBpbmNsdWRlIDxzeXNfdHlwZXMuaD4KKyMgIGRlZmluZSBJR05PUkVfU1RESU9fU1RVQlMKKyMgIGluY2x1ZGUgPFN0ZElPUGFsbS5oPgorIyAgZGVmaW5lIE9fTk9OQkxPQ0sgRk5PTkJJTworIyAgaW5jbHVkZSA8c3lzX3NvY2tldC5oPgorIyAgaW5jbHVkZSAicGFsbUZ1bmN0aW9ucy5oIgorIyBlbGlmIGRlZmluZWQoU1lNQklBTikKKyMgIGRlZmluZSBXSVRIX0xFQU4KKyMgIGRlZmluZSBXSVRIX05PTkFNRVNQQUNFUworIyAgZGVmaW5lIEhBVkVfU1RSVE9ECS8qIHVzZSBTVFJUT0Qgc2luY2Ugc3NjYW5mIGRvZXNuJ3Qgc2VlbSB0byB3b3JrICovCisjICBpbmNsdWRlIDxlMzJkZWYuaD4KKyMgIGluY2x1ZGUgPHN5cy9pb2N0bC5oPgorIyBlbGlmIGRlZmluZWQoVlhXT1JLUykKKyMgIGRlZmluZSBIQVZFX1NUUlJDSFIKKyMgIGRlZmluZSBIQVZFX1NUUlRPRAorIyAgZGVmaW5lIEhBVkVfU1NDQU5GCisjICBkZWZpbmUgSEFWRV9TVFJUT0wKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUwKKyMgIGRlZmluZSBIQVZFX1BHTVRJTUVfUgorIyAgZGVmaW5lIEhBVkVfUExPQ0FMVElNRV9SCisjICBkZWZpbmUgSEFWRV9NS1RJTUUKKyMgZWxpZiBkZWZpbmVkKE9TMzkwKQorIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfU1lTX1RJTUVCX0gKKyMgIGRlZmluZSBIQVZFX0ZUSU1FCisjICBkZWZpbmUgSEFWRV9SQU5EX1IKKyMgIGRlZmluZSBIQVZFX0dNVElNRV9SCisjICBkZWZpbmUgSEFWRV9MT0NBTFRJTUVfUgorIyAgZGVmaW5lIEhBVkVfV0NUT01CCisjICBkZWZpbmUgSEFWRV9NQlRPV0MKKyMgZWxpZiBkZWZpbmVkKEFTNDAwKQorIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfU1lTX1RJTUVCX0gKKyMgIGRlZmluZSBIQVZFX0ZUSU1FCisjICBkZWZpbmUgSEFWRV9SQU5EX1IKKyMgIGRlZmluZSBIQVZFX0dNVElNRV9SCisjICBkZWZpbmUgSEFWRV9MT0NBTFRJTUVfUgorIyAgZGVmaW5lIEhBVkVfV0NUT01CCisjICBkZWZpbmUgSEFWRV9NQlRPV0MKKyMgZWxzZQorLyogRGVmYXVsdCBhc3VtcHRpb25zIG9uIHN1cHBvcnRlZCBmdW5jdGlvbnMgKi8KKyMgIGRlZmluZSBIQVZFX1NUUlJDSFIKKyMgIGRlZmluZSBIQVZFX1NUUlRPRAorIyAgZGVmaW5lIEhBVkVfU1NDQU5GCisjICBkZWZpbmUgSEFWRV9TVFJUT0wKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUwKKyMgIGRlZmluZSBIQVZFX1NZU19USU1FQl9ICisjICBkZWZpbmUgSEFWRV9GVElNRQorIyAgZGVmaW5lIEhBVkVfUkFORF9SCisjICBkZWZpbmUgSEFWRV9HRVRIT1NUQllOQU1FX1IKKyMgIGRlZmluZSBIQVZFX0dNVElNRV9SCisjICBkZWZpbmUgSEFWRV9MT0NBTFRJTUVfUgorIyAgZGVmaW5lIEhBVkVfV0NUT01CCisjICBkZWZpbmUgSEFWRV9NQlRPV0MKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBRTlggZG9lcyBub3QgaGF2ZSBhIHdvcmtpbmcgdmVyc2lvbiBvZiBzdHJ0b2YgKi8KKyNpZiBkZWZpbmVkKF9fUU5YX18pIHx8IGRlZmluZWQoUU5YKQorIyB1bmRlZiBIQVZFX1NUUlRPRgorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9MT05HX0ZPUk1BVAorIyBkZWZpbmUgU09BUF9MT05HX0ZPUk1BVCAiJWxsZCIJLyogcHJpbnRmIGZvcm1hdCBmb3IgNjQgYml0IGludHMgKi8KKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfVUxPTkdfRk9STUFUCisjIGRlZmluZSBTT0FQX1VMT05HX0ZPUk1BVCAiJWxsdSIJLyogcHJpbnRmIGZvcm1hdCBmb3IgdW5zaWduZWQgNjQgYml0IGludHMgKi8KKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9TVERMSUIKKyMgaW5jbHVkZSA8c3RkbGliLmg+CisjIGlmbmRlZiBQQUxNCisjICBpbmNsdWRlIDxzdGRpby5oPgorIyAgaW5jbHVkZSA8c3RyaW5nLmg+CisjIGVuZGlmCisjIGluY2x1ZGUgPGN0eXBlLmg+CisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiAhZGVmaW5lZChXSVRIX0xFQU4pCisjIGluY2x1ZGUgPHN0cmluZz4KKyMgaW5jbHVkZSA8aW9zdHJlYW0+CisjZW5kaWYKKworI2lmZGVmIFdJVEhfTk9IVFRQCisjIGlmbmRlZiBXSVRIX05PSU8KKy8vLy8jICBkZWZpbmUgV0lUSF9OT0lPICAgICBFU0wgVE8gRE8gOiBJIGFkZGVkIHRoZSBjb21tZW50IHRvIG1ha2UgdGhpcyB3b3JrLiBUaGlzIGlzIHZlcnkgc3RyYW5nZSB0aG91Z2ghIQorIyAgdW5kZWYgV0lUSF9DT09LSUVTCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBVTkRFUl9DRQorIyBpZm5kZWYgUEFMTQorIyAgaWZuZGVmIFdJVEhfTk9JTworIyAgIGluY2x1ZGUgPGVycm5vLmg+CisjICAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjICBlbmRpZgorIyAgaWZuZGVmIFdJVEhfTEVBTgorIyAgIGlmZGVmIEhBVkVfU1lTX1RJTUVCX0gKKyMgICAgaW5jbHVkZSA8c3lzL3RpbWViLmg+CQkvKiBmb3IgZnRpbWUoKSAqLworIyAgIGVuZGlmCisjICAgaW5jbHVkZSA8dGltZS5oPgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgT1BFTlNFUlZFUgorIyBpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjIGluY2x1ZGUgPHN5cy9zdHJlYW0uaD4KKyMgaW5jbHVkZSA8c3lzL3Byb3Rvc3cuaD4KKyAgZXh0ZXJuIGludCBoX2Vycm5vOworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9OT0lPCisjIGlmbmRlZiBXSU4zMgorIyAgaWZuZGVmIFBBTE0KKyMgICBpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjICAgaWZkZWYgVlhXT1JLUworIyAgICBpbmNsdWRlIDxzb2NrTGliLmg+CisjICAgIGluY2x1ZGUgPHNlbGVjdExpYi5oPgorIyAgIGVuZGlmCisjICAgaWZuZGVmIFZYV09SS1MKKyMgICAgaWZuZGVmIFNZTUJJQU4KKyMgICAgIGluY2x1ZGUgPHN0cmluZ3MuaD4KKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgIGlmZGVmIFNVTl9PUworIyAgICBpbmNsdWRlIDxzeXMvc3RyZWFtLmg+CQkvKiBTVU4gKi8KKyMgICAgaW5jbHVkZSA8c3lzL3NvY2tldHZhci5oPgkJLyogU1VOIDwgMi44ICg/KSAqLworIyAgIGVuZGlmCisjICAgaWZkZWYgVlhXT1JLUworIyAgICBpZmRlZiBfV1JTX0tFUk5FTAorIyAgICAgaW5jbHVkZSA8c3lzL3RpbWVzLmg+CisjICAgIGVuZGlmCisjICAgZWxzZQorIyAgICBpbmNsdWRlIDxzeXMvdGltZS5oPgorIyAgIGVuZGlmCisjICAgaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorIyAgIGlmZGVmIE9TMzkwCisjICAgIGluY2x1ZGUgPG5ldGluZXQvdGNwX3Zhci5oPgorIyAgIGVsc2UKKyMgICAgaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4gICAgICAgICAgLyogVENQX05PREVMQVkgKi8KKyMgICBlbmRpZgorIyAgIGluY2x1ZGUgPGFycGEvaW5ldC5oPgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgV0lUSF9GQVNUQ0dJCisjIGluY2x1ZGUgPGZjZ2lfc3RkaW8uaD4KKyNlbmRpZgorCisjaWZkZWYgV0lUSF9PUEVOU1NMCisjIGRlZmluZSBPUEVOU1NMX05PX0tSQjUKKyMgaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KKyMgaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyMgaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjIGlmbmRlZiBBTExPV19PTERfVkVSU0lPTlMKKyMgIGlmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgMHgwMDkwNTEwMEwpCisjICAgZXJyb3IgIk11c3QgdXNlIE9wZW5TU0wgMC45LjYgb3IgbGF0ZXIiCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBXSVRIX0daSVAKKyMgaWZuZGVmIFdJVEhfWkxJQgorIyAgZGVmaW5lIFdJVEhfWkxJQgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBXSVRIX0NBU0VJTlNFTlNJVElWRVRBR1MKKyMgZGVmaW5lIFNPQVBfU1RSQ01QIHNvYXBfdGFnX2NtcAkvKiBjYXNlIGluc2Vuc2l0dmUgWE1MIGVsZW1lbnQvYXR0cmlidXRlIG5hbWVzICovCisjZWxzZQorIyBkZWZpbmUgU09BUF9TVFJDTVAgc3RyY21wCQkvKiBjYXNlIHNlbnNpdGl2ZSBYTUwgZWxlbWVudC9hdHRyaWJ1dGUgbmFtZXMgKi8KKyNlbmRpZgorCisjaWZkZWYgV0lUSF9aTElCCisjIGluY2x1ZGUgPHpsaWIuaD4KKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9TVERMSUIKKyMgaWZuZGVmIFBBTE0KKyMgIGluY2x1ZGUgPG1hdGguaD4JLyogZm9yIGlzbmFuKCkgKi8KKyMgZW5kaWYKKyNlbmRpZgorCisvKiAjZGVmaW5lIERFQlVHICovIC8qIFVuY29tbWVudCB0byBkZWJ1ZyBzZW5kaW5nIChpbiBmaWxlIFNFTlQubG9nKSByZWNlaXZpbmcgKGluIGZpbGUgUkVDVi5sb2cpIGFuZCBtZXNzYWdlcyAoaW4gZmlsZSBURVNULmxvZykgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWZkZWYgV0lOMzIKKyMgaWZuZGVmIFVOREVSX0NFCisjICBpbmNsdWRlIDxpby5oPgorIyAgaW5jbHVkZSA8ZmNudGwuaD4KKyMgZW5kaWYKKyMgaW5jbHVkZSA8d2luc29jay5oPgorLyogIyBpbmNsdWRlIDx3aW5zb2NrMi5oPiAqLyAvKiBBbHRlcm5hdGl2ZTogdXNlIHdpbnNvY2syIChub3QgYXZhaWxhYmxlIHdpdGggZVZDKSAqLworIyBpZmRlZiBXSVRIX0lQVjYKKyMgIGluY2x1ZGUgPHdzMnRjcGlwLmg+CisjICBpbmNsdWRlIDx3c3BpYXBpLmg+CisjIGVuZGlmCisjZWxzZQorIyBpZmRlZiBWWFdPUktTCisjICBpbmNsdWRlIDxob3N0TGliLmg+CisjICBpbmNsdWRlIDxpb2N0bC5oPgorIyAgaW5jbHVkZSA8aW9MaWIuaD4KKyMgZW5kaWYKKyMgaWZuZGVmIFdJVEhfTk9JTworIyAgaWZuZGVmIFBBTE0KKyMgICBpbmNsdWRlIDxuZXRkYi5oPgorIyAgIGluY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyMgICBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgICBpbmNsdWRlIDxmY250bC5oPgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBQb3J0YWJpbGl0eTogZGVmaW5lIFNPQVBfU09DS0xFTl9UICovCisjaWYgZGVmaW5lZChfQUlYKQorIyBkZWZpbmUgU09BUF9TT0NLTEVOX1Qgc29ja2xlbl90CisjZWxpZiBkZWZpbmVkKFNPQ0tMRU5fVCkKKyMgZGVmaW5lIFNPQVBfU09DS0xFTl9UIFNPQ0tMRU5fVAorI2VsaWYgZGVmaW5lZChfX3NvY2tsZW5fdF9kZWZpbmVkKSB8fCBkZWZpbmVkKF9TT0NLTEVOX1QpIHx8IGRlZmluZWQoQ1lHV0lOKSB8fCBkZWZpbmVkKEZSRUVCU0QpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19RTlhfXykgfHwgZGVmaW5lZChRTlgpCisjIGRlZmluZSBTT0FQX1NPQ0tMRU5fVCBzb2NrbGVuX3QKKyNlbGlmIGRlZmluZWQoSVJJWCkgfHwgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfX0FQUExFX18pIHx8IGRlZmluZWQoSFBfVVgpIHx8IGRlZmluZWQoU1VOX09TKSB8fCBkZWZpbmVkKE9QRU5TRVJWRVIpIHx8IGRlZmluZWQoVFJVNjQpIHx8IGRlZmluZWQoVlhXT1JLUykKKyMgZGVmaW5lIFNPQVBfU09DS0xFTl9UIGludAorI2Vsc2UKKyMgZGVmaW5lIFNPQVBfU09DS0xFTl9UIHNpemVfdAorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9TT0NLRVQKKyMgaWZkZWYgV0lOMzIKKyMgIGRlZmluZSBTT0FQX1NPQ0tFVCBTT0NLRVQKKyMgZWxzZQorIyAgZGVmaW5lIFNPQVBfU09DS0VUIGludAorIyAgZGVmaW5lIGNsb3Nlc29ja2V0KG4pIGNsb3NlKG4pCisjIGVuZGlmCisjZW5kaWYKKworI2RlZmluZSBTT0FQX0lOVkFMSURfU09DS0VUICgtMSkKKyNkZWZpbmUgc29hcF92YWxpZF9zb2NrZXQobikgKChuKSAhPSBTT0FQX0lOVkFMSURfU09DS0VUKQorCisjaWYgZGVmaW5lZChTWU1CSUFOKQorIyBkZWZpbmUgTE9ORzY0IGxvbmcKKyMgZGVmaW5lIFVMT05HNjQgdW5zaWduZWQgTE9ORzY0CisjZWxpZiAhZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfX0dMSUJDX18pIHx8IGRlZmluZWQoX19HTlVfXykKKyMgaWZuZGVmIExPTkc2NAorIyAgZGVmaW5lIExPTkc2NCBsb25nIGxvbmcKKyMgIGRlZmluZSBVTE9ORzY0IHVuc2lnbmVkIExPTkc2NAorIyBlbmRpZgorI2VsaWYgZGVmaW5lZChVTkRFUl9DRSkKKyMgZGVmaW5lIExPTkc2NCBfX2ludDY0CisjIGRlZmluZSBVTE9ORzY0IHVuc2lnbmVkIExPTkc2NAorI2VsaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pCisjIGRlZmluZSBMT05HNjQgX19pbnQ2NAorIyBkZWZpbmUgVUxPTkc2NCB1bnNpZ25lZCBMT05HNjQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChXSU4zMikKKyMgZGVmaW5lIHNvYXBfaW50MzIgX19pbnQzMgorI2VsaWYgZGVmaW5lZChTWU1CSUFOKQorIyBkZWZpbmUgc29hcF9pbnQzMiBsb25nCisjZWxpZiBkZWZpbmVkKFBBTE0pCisjIGRlZmluZSBzb2FwX2ludDMyIEludDMyCisjZWxzZQorIyBkZWZpbmUgc29hcF9pbnQzMiBpbnQzMl90CisjZW5kaWYKKworI2lmZGVmIFdJTjMyCisjIGRlZmluZSBTT0FQX0VSQU5HRSBFUkFOR0UKKyMgZGVmaW5lIFNPQVBfRUlOVFIgV1NBRUlOVFIKKyMgZGVmaW5lIFNPQVBfRUFHQUlOIFdTQUVXT1VMREJMT0NLCisjIGRlZmluZSBTT0FQX0VXT1VMREJMT0NLIFdTQUVXT1VMREJMT0NLCisjIGRlZmluZSBTT0FQX0VJTlBST0dSRVNTIFdTQUVJTlBST0dSRVNTCisjZWxzZQorIyBkZWZpbmUgU09BUF9FUkFOR0UgRVJBTkdFCisjIGRlZmluZSBTT0FQX0VJTlRSIEVJTlRSCisjIGRlZmluZSBTT0FQX0VBR0FJTiBFQUdBSU4KKyMgaWZkZWYgU1lNQklBTgorIyAgZGVmaW5lIFNPQVBfRVdPVUxEQkxPQ0sgOTg5OAorIyAgZGVmaW5lIFNPQVBfRUlOUFJPR1JFU1MgOTg5OQorIyBlbHNlCisjICBkZWZpbmUgU09BUF9FV09VTERCTE9DSyBFV09VTERCTE9DSworIyAgZGVmaW5lIFNPQVBfRUlOUFJPR1JFU1MgRUlOUFJPR1JFU1MKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgV0lOMzIKKyMgaWZkZWYgVU5ERVJfQ0UKKyMgIGRlZmluZSBzb2FwX2Vycm5vIEdldExhc3RFcnJvcigpCisjICBkZWZpbmUgc29hcF9zb2NrZXRfZXJybm8gR2V0TGFzdEVycm9yKCkKKyMgIGRlZmluZSBzb2FwX3Jlc2V0X2Vycm5vIFNldExhc3RFcnJvcigwKQorIyBlbHNlCisjICBkZWZpbmUgc29hcF9lcnJubyBHZXRMYXN0RXJyb3IoKQorIyAgZGVmaW5lIHNvYXBfc29ja2V0X2Vycm5vIFdTQUdldExhc3RFcnJvcigpCisjICBkZWZpbmUgc29hcF9yZXNldF9lcnJubyBTZXRMYXN0RXJyb3IoMCkKKyMgZW5kaWYKKyNlbHNlCisjIGlmbmRlZiBXSVRIX05PSU8KKyMgIGRlZmluZSBzb2FwX2Vycm5vIGVycm5vCisjICBkZWZpbmUgc29hcF9zb2NrZXRfZXJybm8gZXJybm8KKyMgIGRlZmluZSBzb2FwX3Jlc2V0X2Vycm5vIChlcnJubyA9IDApCisjIGVsc2UKKyMgIGRlZmluZSBzb2FwX2Vycm5vIDAKKyMgIGRlZmluZSBzb2FwX3NvY2tldF9lcnJubyAwCisjICBkZWZpbmUgc29hcF9yZXNldF9lcnJubworIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9CVUZMRU4KKyMgaWZkZWYgV0lUSF9VRFAKKyMgIGRlZmluZSBTT0FQX0JVRkxFTiAoNjU1MzYpIC8qIG1heCBVRFAgcGFja2V0IHNpemUgKi8KKyMgZWxzZQorIyAgaWZuZGVmIFdJVEhfTEVBTgorIyAgIGRlZmluZSBTT0FQX0JVRkxFTiAoNjU1MzYpIC8qIGJ1ZmZlciBsZW5ndGggZm9yIHNvY2tldCBwYWNrZXRzLCBhbHNvIHVzZWQgYnkgZ2V0aG9zdGJ5bmFtZV9yIHNvIGRvbid0IG1ha2UgdGhpcyB0b28gc21hbGwgKi8KKyMgIGVsc2UKKyMgICBkZWZpbmUgU09BUF9CVUZMRU4gICgyMDQ4KQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBTT0FQX0xBQkxFTgorIyBkZWZpbmUgU09BUF9MQUJMRU4gICAgICg2NCkgLyogaW5pdGlhbCBsb29rLWFzaWRlIGJ1ZmZlciBsZW5ndGggKi8KKyNlbmRpZgorI2lmbmRlZiBTT0FQX1BUUkJMSworIyBkZWZpbmUgU09BUF9QVFJCTEsgICAgICgzMikgLyogYmxvY2sgYWxsb2NhdGlvbiBmb3IgcG9pbnRlciBoYXNoIHRhYmxlIGNoYWlucyAqLworI2VuZGlmCisjaWZuZGVmIFNPQVBfUFRSSEFTSAorIyBpZm5kZWYgV0lUSF9MRUFOCisjICBkZWZpbmUgU09BUF9QVFJIQVNIICgxMDI0KSAvKiBzaXplIG9mIHBvaW50ZXIgYW5hbHlzaXMgaGFzaCB0YWJsZSAobXVzdCBiZSBwb3dlciBvZiAyKSAqLworIyBlbHNlCisjICBkZWZpbmUgU09BUF9QVFJIQVNIICAgKDMyKQorIyBlbmRpZgorI2VuZGlmCisjaWZuZGVmIFNPQVBfSURIQVNICisjIGlmbmRlZiBXSVRIX0xFQU4KKyMgIGRlZmluZSBTT0FQX0lESEFTSCAgKDE5OTkpIC8qIHByaW1lIHNpemUgb2YgaGFzaCB0YWJsZSBmb3IgcGFyc2VkIGlkL3JlZiAqLworIyBlbHNlCisjICBkZWZpbmUgU09BUF9JREhBU0ggICAgKDE5KSAvKiAxOSwgMTk5ICovCisjIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgU09BUF9CTEtMRU4KKyMgaWZuZGVmIFdJVEhfTEVBTgorIyAgZGVmaW5lIFNPQVBfQkxLTEVOICAgKDI1NikgLyogc2l6ZSBvZiBibG9ja3MgdG8gY29sbGVjdCBsb25nIHN0cmluZ3MgYW5kIFhNTCBhdHRyaWJ1dGVzICovCisjIGVsc2UKKyMgIGRlZmluZSBTT0FQX0JMS0xFTiAgICAoMzIpCisjIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgU09BUF9UQUdMRU4KKyMgaWZuZGVmIFdJVEhfTEVBTgorIyAgZGVmaW5lIFNPQVBfVEFHTEVOICAoMTAyNCkgLyogbWF4aW11bSBsZW5ndGggb2YgWE1MIGVsZW1lbnQgdGFnL2F0dHJpYnV0ZSBuYW1lIG9yIGhvc3QvcGF0aCBuYW1lICsgMSAqLworIyBlbHNlCisjICBkZWZpbmUgU09BUF9UQUdMRU4gICAgKDY0KQorIyBlbmRpZgorI2VuZGlmCisjaWZuZGVmIFNPQVBfSERSTEVOCisjIGlmbmRlZiBXSVRIX0xFQU4KKyMgIGRlZmluZSBTT0FQX0hEUkxFTiAgKDgxOTIpIC8qIG1heGltdW0gbGVuZ3RoIG9mIEhUVFAgaGVhZGVyIGxpbmUgKG11c3QgYmUgPjQwOTYgdG8gcmVhZCBjb29raWVzKSAqLworIyBlbHNlCisjICBkZWZpbmUgU09BUF9IRFJMRU4gICgxMDI0KQorIyBlbmRpZgorI2VuZGlmCisjaWZuZGVmIFNPQVBfTUFYRElNUworIyBpZm5kZWYgV0lUSF9MRUFOCisjICBkZWZpbmUgU09BUF9NQVhESU1TCSAoMTYpIC8qIG1heGltdW0gYXJyYXkgZGltZW5zaW9ucyAoYXJyYXkgbmVzdGluZ3MpIG11c3QgYmUgbGVzcyB0aGFuIDY0IHRvIHByb3RlY3Qgc29hcC0+dG1wYnVmICovCisjIGVsc2UKKyMgIGRlZmluZSBTT0FQX01BWERJTVMJICAoNCkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfTUFYTE9HUworIyBkZWZpbmUgU09BUF9NQVhMT0dTCSAgKDMpIC8qIG1heCBudW1iZXIgb2YgZGVidWcgbG9ncyBwZXIgc3RydWN0IHNvYXAgZW52aXJvbm1lbnQgKi8KKyMgZGVmaW5lIFNPQVBfSU5ERVhfUkVDViAgKDApCisjIGRlZmluZSBTT0FQX0lOREVYX1NFTlQgICgxKQorIyBkZWZpbmUgU09BUF9JTkRFWF9URVNUICAoMikKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfTUFYS0VFUEFMSVZFCisjIGRlZmluZSBTT0FQX01BWEtFRVBBTElWRSAoMTAwKSAvKiBtYXggaXRlcmF0aW9ucyB0byBrZWVwIHNlcnZlciBjb25uZWN0aW9uIGFsaXZlICovCisjZW5kaWYKKworI2lmbmRlZiBTT0FQX01BWEFSUkFZU0laRQorIyBkZWZpbmUgU09BUF9NQVhBUlJBWVNJWkUgKDEwMDAwMCkgLyogInRydXN0ZWQiIG1heCBzaXplIG9mIGluYm91bmQgU09BUCBhcnJheSBmb3IgY29tcG91bmQgYXJyYXkgYWxsb2NhdGlvbiAqLworI2VuZGlmCisKKyNpZmRlZiBWWFdPUktTCisjIGlmZGVmIF9fSU5DbWF0aGggCisjICBpbmNsdWRlIDxwcml2YXRlL21hdGhQLmg+CisjICBpZm5kZWYgSEFWRV9JU05BTgorIyAgIGRlZmluZSBIQVZFX0lTTkFOCisjICBlbmRpZgorIyAgZGVmaW5lIHNvYXBfaXNuYW4obnVtKSBpc05hbihudW0pCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIFdJTjMyIAorIyBpbmNsdWRlIDxmbG9hdC5oPgorIyBpZm5kZWYgSEFWRV9JU05BTgorIyAgZGVmaW5lIEhBVkVfSVNOQU4KKyMgZW5kaWYKKyMgZGVmaW5lIHNvYXBfaXNuYW4obnVtKSBfaXNuYW4obnVtKQorI2VuZGlmCisKKyNpZmRlZiBTVU5fT1MKKyMgZGVmaW5lIHNvYXBfaXNuYW4obikgaXNuYW4obikKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoSEFWRV9JU05BTikgJiYgKGRlZmluZWQoX01BVEhfSCkgfHwgZGVmaW5lZChfTUFUSF9JTkNMVURFRCkpCisjIGRlZmluZSBIQVZFX0lTTkFOCisjZW5kaWYKKworI2lmbmRlZiBzb2FwX2lzbmFuCisjIGlmZGVmIEhBVkVfSVNOQU4KKyMgIGRlZmluZSBzb2FwX2lzbmFuKG4pIGlzbmFuKG4pCisjIGVsc2UKKyMgIGRlZmluZSBzb2FwX2lzbmFuKF8pICgwKQorIyBlbmRpZgorI2VuZGlmCisKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc29hcF9kb3VibGVfbmFuIHsgdW5zaWduZWQgaW50IG4xLCBuMjsgfSBzb2FwX2RvdWJsZV9uYW47CisKKyNpZmRlZiBWWFdPUktTCisjIGlmbmRlZiBGTFRfTUFYCisjICBkZWZpbmUgRkxUX01BWCBfQVJDSF9GTFRfTUFYCisjIGVuZGlmCisjIGlmbmRlZiBEQkxfTUFYCisjICBkZWZpbmUgREJMX01BWCBfQVJDSF9EQkxfTUFYCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBGTFRfTkFOCisjIGlmZGVmIEhBVkVfSVNOQU4KKyMgIGRlZmluZSBGTFRfTkFOICgqKGZsb2F0Kikodm9pZCopJnNvYXBfZG91YmxlX25hbikKKyMgZWxzZQorIyAgZGVmaW5lIEZMVF9OQU4gKDAuMCkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEZMVF9QSU5GVFkKKyMgaWYgZGVmaW5lZChGTFRfTUFYKQorIyAgZGVmaW5lIEZMVF9QSU5GVFkgRkxUX01BWAorIyBlbGlmIGRlZmluZWQoSFVHRV9WQUxGKQorIyAgZGVmaW5lIEZMVF9QSU5GVFkgKGZsb2F0KUhVR0VfVkFMRgorIyBlbGlmIGRlZmluZWQoSFVHRV9WQUwpCisjICBkZWZpbmUgRkxUX1BJTkZUWSAoZmxvYXQpSFVHRV9WQUwKKyMgZWxpZiBkZWZpbmVkKEZMT0FUX01BWCkKKyMgIGRlZmluZSBGTFRfUElORlRZIEZMT0FUX01BWAorIyBlbHNlCisjICBkZWZpbmUgRkxUX1BJTkZUWSAoMy40MDI4MjM0N2UrMzhGKQorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRkxUX05JTkZUWQorIyBkZWZpbmUgRkxUX05JTkZUWSAoLUZMVF9QSU5GVFkpCisjZW5kaWYKKworI2lmbmRlZiBEQkxfTkFOCisjIGlmZGVmIEhBVkVfSVNOQU4KKyMgIGRlZmluZSBEQkxfTkFOICgqKGRvdWJsZSopKHZvaWQqKSZzb2FwX2RvdWJsZV9uYW4pCisjIGVsc2UKKyMgIGRlZmluZSBEQkxfTkFOICgwLjApCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBEQkxfUElORlRZCisjIGlmIGRlZmluZWQoREJMX01BWCkKKyMgIGRlZmluZSBEQkxfUElORlRZIERCTF9NQVgKKyMgZWxpZiBkZWZpbmVkKEhVR0VfVkFMRikKKyMgIGRlZmluZSBEQkxfUElORlRZIChkb3VibGUpSFVHRV9WQUxGCisjIGVsaWYgZGVmaW5lZChIVUdFX1ZBTCkKKyMgIGRlZmluZSBEQkxfUElORlRZIChkb3VibGUpSFVHRV9WQUwKKyMgZWxpZiBkZWZpbmVkKERPVUJMRV9NQVgpCisjICBkZWZpbmUgREJMX1BJTkZUWSBET1VCTEVfTUFYCisjIGVsc2UKKyMgIGRlZmluZSBEQkxfUElORlRZICgxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOCkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIERCTF9OSU5GVFkKKyMgZGVmaW5lIERCTF9OSU5GVFkgKC1EQkxfUElORlRZKQorI2VuZGlmCisKKyNkZWZpbmUgc29hcF9pc3BpbmZkKG4pICgobikgPj0gREJMX1BJTkZUWSkKKyNkZWZpbmUgc29hcF9pc3BpbmZmKG4pICgobikgPj0gRkxUX1BJTkZUWSkKKyNkZWZpbmUgc29hcF9pc25pbmZkKG4pICgobikgPD0gREJMX05JTkZUWSkKKyNkZWZpbmUgc29hcF9pc25pbmZmKG4pICgobikgPD0gRkxUX05JTkZUWSkKKworLyogZ1NPQVAgZXJyb3IgY29kZXMgKi8KKworI2RlZmluZSBTT0FQX0VPRgkJCUVPRgorI2RlZmluZSBTT0FQX0VSUgkJCUVPRgorI2RlZmluZSBTT0FQX09LCQkJCTAKKyNkZWZpbmUgU09BUF9DTElfRkFVTFQJCQkxCisjZGVmaW5lIFNPQVBfU1ZSX0ZBVUxUCQkJMgorI2RlZmluZSBTT0FQX1RBR19NSVNNQVRDSAkJMworI2RlZmluZSBTT0FQX1RZUEUJCQk0CisjZGVmaW5lIFNPQVBfU1lOVEFYX0VSUk9SCQk1CisjZGVmaW5lIFNPQVBfTk9fVEFHCQkJNgorI2RlZmluZSBTT0FQX0lPQgkJCTcKKyNkZWZpbmUgU09BUF9NVVNUVU5ERVJTVEFORAkJOAorI2RlZmluZSBTT0FQX05BTUVTUEFDRQkJCTkKKyNkZWZpbmUgU09BUF9VU0VSX0VSUk9SCQkJMTAKKyNkZWZpbmUgU09BUF9GQVRBTF9FUlJPUgkJMTEKKyNkZWZpbmUgU09BUF9GQVVMVAkJCTEyCisjZGVmaW5lIFNPQVBfTk9fTUVUSE9ECQkJMTMKKyNkZWZpbmUgU09BUF9HRVRfTUVUSE9ECQkJMTQKKyNkZWZpbmUgU09BUF9FT00JCQkxNQorI2RlZmluZSBTT0FQX05VTEwJCQkxNgorI2RlZmluZSBTT0FQX0RVUExJQ0FURV9JRAkJMTcKKyNkZWZpbmUgU09BUF9NSVNTSU5HX0lECQkJMTgKKyNkZWZpbmUgU09BUF9IUkVGCQkJMTkKKyNkZWZpbmUgU09BUF9VRFBfRVJST1IJCQkyMAorI2RlZmluZSBTT0FQX1RDUF9FUlJPUgkJCTIxCisjZGVmaW5lIFNPQVBfSFRUUF9FUlJPUgkJCTIyCisjZGVmaW5lIFNPQVBfU1NMX0VSUk9SCQkJMjMKKyNkZWZpbmUgU09BUF9aTElCX0VSUk9SCQkJMjQKKyNkZWZpbmUgU09BUF9ESU1FX0VSUk9SCQkJMjUKKyNkZWZpbmUgU09BUF9ESU1FX0hSRUYJCQkyNgorI2RlZmluZSBTT0FQX0RJTUVfTUlTTUFUQ0gJCTI3CisjZGVmaW5lIFNPQVBfRElNRV9FTkQJCQkyOAorI2RlZmluZSBTT0FQX01JTUVfRVJST1IJCQkyOQorI2RlZmluZSBTT0FQX01JTUVfSFJFRgkJCTMwCisjZGVmaW5lIFNPQVBfTUlNRV9FTkQJCQkzMQorI2RlZmluZSBTT0FQX1ZFUlNJT05NSVNNQVRDSAkJMzIKKyNkZWZpbmUgU09BUF9QTFVHSU5fRVJST1IJCTMzCisjZGVmaW5lIFNPQVBfREFUQUVOQ09ESU5HVU5LTk9XTgkzNAorI2RlZmluZSBTT0FQX1JFUVVJUkVECQkJMzUKKyNkZWZpbmUgU09BUF9QUk9ISUJJVEVECQkJMzYKKyNkZWZpbmUgU09BUF9PQ0NVUlMJCQkzNworI2RlZmluZSBTT0FQX0xFTkdUSAkJCTM4CisKKyNkZWZpbmUgc29hcF94bWxfZXJyb3JfY2hlY2soZSkgKChlKSA9PSBTT0FQX1RBR19NSVNNQVRDSCB8fCAoZSkgPT0gU09BUF9UQUdfRU5EIHx8IChlKSA9PSBTT0FQX1NZTlRBWF9FUlJPUiB8fCAoZSkgPT0gU09BUF9OQU1FU1BBQ0UgfHwgKGUpID09IFNPQVBfRFVQTElDQVRFX0lEIHx8IChlKSA9PSBTT0FQX01JU1NJTkdfSUQgfHwgKGUpID09IFNPQVBfUkVRVUlSRUQgfHwgKGUpID09IFNPQVBfUFJPSElCSVRFRCB8fCAoZSkgPT0gU09BUF9PQ0NVUlMgfHwgKGUpID09IFNPQVBfTEVOR1RIIHx8IChlKSA9PSBTT0FQX05VTEwgfHwgKGUpID09IFNPQVBfSFJFRikKKyNkZWZpbmUgc29hcF9zb2FwX2Vycm9yX2NoZWNrKGUpICgoZSkgPT0gU09BUF9DTElfRkFVTFQgfHwgKGUpID09IFNPQVBfU1ZSX0ZBVUxUIHx8IChlKSA9PSBTT0FQX1ZFUlNJT05NSVNNQVRDSCB8fCAoZSkgPT0gU09BUF9NVVNUVU5ERVJTVEFORCB8fCAoZSkgPT0gU09BUF9GQVVMVCB8fCAoZSkgPT0gU09BUF9OT19NRVRIT0QpCisjZGVmaW5lIHNvYXBfdGNwX2Vycm9yX2NoZWNrKGUpICgoZSkgPT0gU09BUF9FT0YgfHwgKGUpID09IFNPQVBfVENQX0VSUk9SKQorI2RlZmluZSBzb2FwX3NzbF9lcnJvcl9jaGVjayhlKSAoKGUpID09IFNPQVBfU1NMX0VSUk9SKQorI2RlZmluZSBzb2FwX3psaWJfZXJyb3JfY2hlY2soZSkgKChlKSA9PSBTT0FQX1pMSUJfRVJST1IpCisjZGVmaW5lIHNvYXBfaHR0cF9lcnJvcl9jaGVjayhlKSAoKGUpID09IFNPQVBfSFRUUF9FUlJPUiB8fCAoZSkgPT0gU09BUF9HRVRfTUVUSE9EIHx8ICgoZSkgPj0gMTAwICYmIChlKSA8IDYwMCkpCisKKy8qIGdTT0FQIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGVzIDEwMCB0byA1OTkgYXJlIHJlc2VydmVkICovCisKKy8qIENvZGVzIDYwMCB0byA5OTkgYXJlIHVzZXIgZGVmaW5hYmxlICovCisKKy8qIEV4Y2VwdGlvbmFsIGdTT0FQIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGVzID49IDEwMDAgKi8KKworI2RlZmluZSBTT0FQX1NUT1AJCTEwMDAJLyogTm8gSFRUUCByZXNwb25zZSAqLworI2RlZmluZSBTT0FQX0ZPUk0JCTEwMDEJLyogRm9ybSByZXF1ZXN0L3Jlc3BvbnNlICovCisjZGVmaW5lIFNPQVBfSFRNTAkJMTAwMgkvKiBDdXN0b20gSFRNTCByZXNwb25zZSAqLworI2RlZmluZSBTT0FQX0ZJTEUJCTEwMDMJLyogQ3VzdG9tIGZpbGUtYmFzZWQgcmVzcG9uc2UgKi8KKworLyogZ1NPQVAgSFRUUCBtZXRob2QgY29kZXMgKi8KKworI2RlZmluZSBTT0FQX1BPU1QJCTIwMDAKKyNkZWZpbmUgU09BUF9HRVQJCTIwMDEKKworLyogZ1NPQVAgRElNRSAqLworCisjZGVmaW5lIFNPQVBfRElNRV9DRgkJMHgwMQorI2RlZmluZSBTT0FQX0RJTUVfTUUJCTB4MDIKKyNkZWZpbmUgU09BUF9ESU1FX01CCQkweDA0CisjZGVmaW5lIFNPQVBfRElNRV9WRVJTSU9OCTB4MDggLyogRElNRSB2ZXJzaW9uIDEgKi8KKyNkZWZpbmUgU09BUF9ESU1FX01FRElBCQkweDEwCisjZGVmaW5lIFNPQVBfRElNRV9BQlNVUkkJMHgyMAorCisvKiBnU09BUCBaTElCICovCisKKyNkZWZpbmUgU09BUF9aTElCX05PTkUJCTB4MDAKKyNkZWZpbmUgU09BUF9aTElCX0RFRkxBVEUJMHgwMQorI2RlZmluZSBTT0FQX1pMSUJfSU5GTEFURQkweDAyCisjZGVmaW5lIFNPQVBfWkxJQl9HWklQCQkweDAyCisKKy8qIGdTT0FQIHRyYW5zcG9ydCwgY29ubmVjdGlvbiwgYW5kIGNvbnRlbnQgZW5jb2RpbmcgbW9kZXMgKi8KKwordHlwZWRlZiBzb2FwX2ludDMyIHNvYXBfbW9kZTsKKworI2RlZmluZSBTT0FQX0lPCQkJMHgwMDAwMDAwMwkvKiBJTyBtYXNrICovCisjZGVmaW5lIFNPQVBfSU9fRkxVU0gJCTB4MDAwMDAwMDAJLyogZmx1c2ggb3V0cHV0IGltbWVkaWF0ZWx5LCBubyBidWZmZXJpbmcgKi8KKyNkZWZpbmUgU09BUF9JT19CVUZGRVIJCTB4MDAwMDAwMDEJLyogYnVmZmVyIG91dHB1dCBpbiBwYWNrZXRzIG9mIHNpemUgU09BUF9CVUZMRU4gKi8KKyNkZWZpbmUgU09BUF9JT19TVE9SRQkJMHgwMDAwMDAwMgkvKiBzdG9yZSBlbnRpcmUgb3V0cHV0IHRvIGRldGVybWluZSBsZW5ndGggZm9yIHRyYW5zcG9ydCAqLworI2RlZmluZSBTT0FQX0lPX0NIVU5LCQkweDAwMDAwMDAzCS8qIHVzZSBIVFRQIGNodW5rZWQgdHJhbnNmZXIgQU5EIGJ1ZmZlciBwYWNrZXRzICovCisKKyNkZWZpbmUgU09BUF9JT19VRFAJCTB4MDAwMDAwMDQKKyNkZWZpbmUgU09BUF9JT19MRU5HVEgJCTB4MDAwMDAwMDgKKyNkZWZpbmUgU09BUF9JT19LRUVQQUxJVkUJMHgwMDAwMDAxMAorCisjZGVmaW5lIFNPQVBfRU5DX0xBVElOCQkweDAwODAwMDIwCS8qIGlzby04ODU5LTEgZW5jb2RpbmcgKi8KKyNkZWZpbmUgU09BUF9FTkNfWE1MCQkweDAwMDAwMDQwCS8qIHBsYWluIFhNTCBlbmNvZGluZywgbm8gSFRUUCBoZWFkZXIgKi8KKyNkZWZpbmUgU09BUF9FTkNfRElNRQkJMHgwMDAwMDA4MAorI2RlZmluZSBTT0FQX0VOQ19NSU1FCQkweDAwMDAwMTAwCisjZGVmaW5lIFNPQVBfRU5DX01UT00JCTB4MDAwMDAyMDAKKyNkZWZpbmUgU09BUF9FTkNfWkxJQgkJMHgwMDAwMDQwMAorI2RlZmluZSBTT0FQX0VOQ19TU0wJCTB4MDAwMDA4MDAKKworI2RlZmluZSBTT0FQX0VOQwkJMHgwMDAwMEZGRgkvKiBJTyBhbmQgRU5DIG1hc2sgKi8KKworI2RlZmluZSBTT0FQX1hNTF9TVFJJQ1QJCTB4MDAwMDEwMDAJLyogc3RyaWN0IHZhbGlkYXRpb24gKi8KKyNkZWZpbmUgU09BUF9YTUxfSU5ERU5UCQkweDAwMDAyMDAwCisjZGVmaW5lIFNPQVBfWE1MX0NBTk9OSUNBTAkweDAwMDA0MDAwCS8qIEVYQyBDMTROIGNhbm9uaWNhbCBYTUwgKi8KKyNkZWZpbmUgU09BUF9YTUxfVFJFRQkJMHgwMDAwODAwMAorI2RlZmluZSBTT0FQX1hNTF9HUkFQSAkJMHgwMDAxMDAwMAorI2RlZmluZSBTT0FQX1hNTF9OSUwJCTB4MDAwMjAwMDAKKyNkZWZpbmUgU09BUF9YTUxfRE9NCQkweDAwMDQwMDAwCisjZGVmaW5lIFNPQVBfWE1MX1NFQwkJMHgwMDA4MDAwMAkvKiByZXNlcnZlZCBmb3IgV1Mgc2VjdXJpdHkgKi8KKworI2RlZmluZSBTT0FQX0NfTk9JT0IJCTB4MDAxMDAwMDAKKyNkZWZpbmUgU09BUF9DX1VURlNUUklORwkweDAwMjAwMDAwCisjZGVmaW5lIFNPQVBfQ19NQlNUUklORwkJMHgwMDQwMDAwMAorCisjZGVmaW5lIFNPQVBfRE9NX1RSRUUJCTB4MDEwMDAwMDAKKyNkZWZpbmUgU09BUF9ET01fTk9ERQkJMHgwMjAwMDAwMAorI2RlZmluZSBTT0FQX0RPTV9BU0lTCQkweDA0MDAwMDAwCisKKyNkZWZpbmUgU09BUF9JT19ERUZBVUxUCQlTT0FQX0lPX0ZMVVNICisKKy8qIFNTTCBjbGllbnQvc2VydmVyIGF1dGhlbnRpY2F0aW9uIHNldHRpbmdzICovCisKKyNkZWZpbmUgU09BUF9TU0xfTk9fQVVUSEVOVElDQVRJT04JCTB4MDAJLyogZm9yIHRlc3RpbmcgcHVycG9zZXMgKi8KKyNkZWZpbmUgU09BUF9TU0xfUkVRVUlSRV9TRVJWRVJfQVVUSEVOVElDQVRJT04JMHgwMQkvKiBjbGllbnQgcmVxdWlyZXMgc2VydmVyIHRvIGF1dGhlbnRpY2F0ZSAqLworI2RlZmluZSBTT0FQX1NTTF9SRVFVSVJFX0NMSUVOVF9BVVRIRU5USUNBVElPTgkweDAyCS8qIHNlcnZlciByZXF1aXJlcyBjbGllbnQgdG8gYXV0aGVudGljYXRlICovCisKKyNkZWZpbmUgU09BUF9TU0xfREVGQVVMVAkJCVNPQVBfU1NMX1JFUVVJUkVfU0VSVkVSX0FVVEhFTlRJQ0FUSU9OCisKKy8qIHN0YXRlICovCisKKyNkZWZpbmUgU09BUF9JTklUCTEKKyNkZWZpbmUgU09BUF9DT1BZCTIKKworI2RlZmluZSBzb2FwX2NoZWNrX3N0YXRlKHNvYXApICghKHNvYXApIHx8ICgoc29hcCktPnN0YXRlICE9IFNPQVBfSU5JVCAmJiAoc29hcCktPnN0YXRlICE9IFNPQVBfQ09QWSkpCisKKy8qIHBhcnQgKi8KKworI2RlZmluZSBTT0FQX0JFR0lOCQkwCisjZGVmaW5lIFNPQVBfSU5fRU5WRUxPUEUJMgorI2RlZmluZSBTT0FQX0lOX0hFQURFUgkJMworI2RlZmluZSBTT0FQX0VORF9IRUFERVIJCTQKKyNkZWZpbmUgU09BUF9OT19CT0RZCQk1CisjZGVmaW5lIFNPQVBfSU5fQk9EWQkJNgorI2RlZmluZSBTT0FQX0VORF9CT0RZCQk3CisjZGVmaW5lIFNPQVBfRU5EX0VOVkVMT1BFCTgKKyNkZWZpbmUgU09BUF9FTkQJCTkKKyNkZWZpbmUgU09BUF9CRUdJTl9TRUNVUklUWQkxMAorI2RlZmluZSBTT0FQX0lOX1NFQ1VSSVRZCTExCisjZGVmaW5lIFNPQVBfRU5EX1NFQ1VSSVRZCTEyCisKKy8qIERFQlVHIG1hY3JvcyAqLworCisjaWZuZGVmIFdJVEhfTEVBTgorIyBpZmRlZiBERUJVRworIyAgaWZuZGVmIFNPQVBfREVCVUcKKyMgICBkZWZpbmUgU09BUF9ERUJVRworIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgU09BUF9ERUJVRworIyBkZWZpbmUgU09BUF9NQUxMT0Moc29hcCwgc2l6ZSkgc29hcF90cmFja19tYWxsb2Moc29hcCwgX19GSUxFX18sIF9fTElORV9fLCBzaXplKQorIyBkZWZpbmUgU09BUF9GUkVFKHNvYXAsIHB0cikgc29hcF90cmFja19mcmVlKHNvYXAsIF9fRklMRV9fLCBfX0xJTkVfXywgcHRyKQorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9NQUxMT0MJCQkvKiB1c2UgbGliYyBtYWxsb2MgKi8KKyMgZGVmaW5lIFNPQVBfTUFMTE9DKHNvYXAsIHNpemUpIG1hbGxvYyhzaXplKQorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9GUkVFCQkJLyogdXNlIGxpYmMgZnJlZSAqLworIyBkZWZpbmUgU09BUF9GUkVFKHNvYXAsIHB0cikgZnJlZShwdHIpCisjZW5kaWYKKworI2lmZGVmIFNPQVBfREVCVUcKKyMgaWZuZGVmIFNPQVBfTUVTU0FHRQorIyAgZGVmaW5lIFNPQVBfTUVTU0FHRSBmcHJpbnRmCisjIGVuZGlmCisjIGlmbmRlZiBEQkdMT0cKKyMgIGRlZmluZSBEQkdMT0coREJHRklMRSwgQ01EKSBcCit7IGlmIChzb2FwKVwKKyAgeyBpZiAoIXNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYXyMjREJHRklMRV0pXAorICAgICAgc29hcF9vcGVuX2xvZ2ZpbGUoKHN0cnVjdCBzb2FwKilzb2FwLCBTT0FQX0lOREVYXyMjREJHRklMRSk7XAorICAgIGlmIChzb2FwLT5mZGVidWdbU09BUF9JTkRFWF8jI0RCR0ZJTEVdKVwKKyAgICB7IEZJTEUgKmZkZWJ1ZyA9IHNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYXyMjREJHRklMRV07XAorICAgICAgQ01EO1wKKyAgICAgIGZmbHVzaChmZGVidWcpO1wKKyAgICB9XAorICB9XAorfQorIyBlbmRpZgorIyBpZm5kZWYgREJHTVNHCisjICBkZWZpbmUgREJHTVNHKERCR0ZJTEUsIE1TRywgTEVOKSBcCit7IGlmIChzb2FwKVwKKyAgeyBpZiAoIXNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYXyMjREJHRklMRV0pXAorICAgICAgc29hcF9vcGVuX2xvZ2ZpbGUoKHN0cnVjdCBzb2FwKilzb2FwLCBTT0FQX0lOREVYXyMjREJHRklMRSk7XAorICAgIGlmIChzb2FwLT5mZGVidWdbU09BUF9JTkRFWF8jI0RCR0ZJTEVdKVwKKyAgICB7IGZ3cml0ZSgoTVNHKSwgMSwgKExFTiksIHNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYXyMjREJHRklMRV0pO1wKKyAgICAgIGZmbHVzaChzb2FwLT5mZGVidWdbU09BUF9JTkRFWF8jI0RCR0ZJTEVdKTtcCisgICAgfVwKKyAgfVwKK30KKyMgZW5kaWYKKyMgaWZuZGVmIERHQkZVTgorIyAgZGVmaW5lIERCR0ZVTihGTkFNRSkgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIlcyglZCk6ICVzKClcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgRk5BTUUpKQorIyAgZGVmaW5lIERCR0ZVTjEoRk5BTUUsIEZNVCwgQVJHKSBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIiVzKCVkKTogJXMoIkZNVCIpXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIEZOQU1FLCAoQVJHKSkpCisjICBkZWZpbmUgREJHRlVOMihGTkFNRSwgRk1UMSwgQVJHMSwgRk1UMiwgQVJHMikgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIlcyglZCk6ICVzKCJGTVQxIiwgIkZNVDIiKVxuIiwgX19GSUxFX18sIF9fTElORV9fLCBGTkFNRSwgKEFSRzEpLCAoQVJHMikpKQorIyAgZGVmaW5lIERCR0ZVTjMoRk5BTUUsIEZNVDEsIEFSRzEsIEZNVDIsIEFSRzIsIEZNVDMsIEFSRzMpIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiJXMoJWQpOiAlcygiRk1UMSIsICJGTVQyIiwgIkZNVDMiKVxuIiwgX19GSUxFX18sIF9fTElORV9fLCBGTkFNRSwgKEFSRzEpLCAoQVJHMiksIChBUkczKSkpCisjIGVuZGlmCisjIGlmbmRlZiBEQkdIRVgKKyMgIGRlZmluZSBEQkdIRVgoREJHRklMRSwgTVNHLCBMRU4pIFwKK3sgaWYgKHNvYXApXAorICB7IGlmICghc29hcC0+ZmRlYnVnW1NPQVBfSU5ERVhfIyNEQkdGSUxFXSlcCisgICAgICBzb2FwX29wZW5fbG9nZmlsZShzb2FwLCBTT0FQX0lOREVYXyMjREJHRklMRSk7XAorICAgIGlmIChzb2FwLT5mZGVidWdbU09BUF9JTkRFWF8jI0RCR0ZJTEVdKVwKKyAgICB7IGludCBpOyBjaGFyICpzO1wKKyAgICAgIGZvciAocyA9IChjaGFyKikoTVNHKSwgaSA9IChMRU4pOyBpOyBpLS0pXAorICAgICAgICBmcHJpbnRmKHNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYXyMjREJHRklMRV0sICIlMi4yaGhYICAiLCAqcysrKTtcCisgICAgICBmZmx1c2goc29hcC0+ZmRlYnVnW1NPQVBfSU5ERVhfIyNEQkdGSUxFXSk7XAorICAgIH1cCisgIH1cCit9CisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgREJHTE9HKERCR0ZJTEUsIENNRCkKKyMgZGVmaW5lIERCR01TRyhEQkdGSUxFLCBNU0csIExFTikKKyMgZGVmaW5lIERCR0ZVTihGTkFNRSkKKyMgZGVmaW5lIERCR0ZVTjEoRk5BTUUsIEZNVCwgQVJHKQorIyBkZWZpbmUgREJHRlVOMihGTkFNRSwgRk1UMSwgQVJHMSwgRk1UMiwgQVJHMikKKyMgZGVmaW5lIERCR0ZVTjMoRk5BTUUsIEZNVDEsIEFSRzEsIEZNVDIsIEFSRzIsIEZNVDMsIEFSRzMpCisjIGRlZmluZSBEQkdIRVgoREJHRklMRSwgTVNHLCBMRU4pCisjZW5kaWYKKworLyogVUNTLTQgcmVxdWlyZXMgMzIgYml0cyAoMC03RkZGRkZGRiwgdGhlIHNpZ24gYml0IGlzIHVzZWQgYnkgZ1NPQVAgdG8gZGlzdGluZ3Vpc2ggWE1MIGVudGl0aWVzKSAqLwordHlwZWRlZiBzb2FwX2ludDMyIHNvYXBfd2NoYXI7CisKKy8qIG5hbWVzcGFjZSB0YWJsZSByb3cgKi8KK3N0cnVjdCBOYW1lc3BhY2UKK3sgY29uc3QgY2hhciAqaWQ7CisgIGNvbnN0IGNoYXIgKm5zOworICBjb25zdCBjaGFyICppbjsKKyAgY2hhciAqb3V0OworfTsKKworLyogbmFtZXNwYWNlIHN0YWNrICovCitzdHJ1Y3Qgc29hcF9ubGlzdAoreyBzdHJ1Y3Qgc29hcF9ubGlzdCAqbmV4dDsKKyAgdW5zaWduZWQgaW50IGxldmVsOyAvKiBuZXN0aW5nIGRlcHRoIGxldmVsICovCisgIHNob3J0IGluZGV4OyAvKiBjb3JyZXNwb25kaW5nIGVudHJ5IGluIG5zIG1hcHBpbmcgdGFibGUgKi8KKyAgY2hhciAqbnM7IC8qIG9ubHkgc2V0IHdoZW4gcGFyc2VkIG5zIFVSSSBpcyBub3QgaW4gdGhlIG5zIG1hcHBpbmcgdGFibGUgKi8KKyAgY2hhciBpZFsxXTsgLyogdGhlIGFjdHVhbCBzdHJpbmcgdmFsdWUgZmxvd3MgaW50byB0aGUgYWxsb2NhdGVkIHJlZ2lvbiBiZWxvdyB0aGlzIHN0cnVjdCAqLworfTsKKworLyogYmxvY2sgc3RhY2sgZm9yIG5lc3RlZCBibG9jayBhbGxvY2F0aW9ucyAqLworc3RydWN0IHNvYXBfYmxpc3QKK3sgc3RydWN0IHNvYXBfYmxpc3QgKm5leHQ7CisgIGNoYXIgKnB0cjsKKyAgc2l6ZV90IHNpemU7Cit9OworCisvKiBhcnJheSBsYXlvdXQgKi8KK3N0cnVjdCBzb2FwX2FycmF5Cit7IHZvaWQgKl9fcHRyOworICBpbnQgX19zaXplOworfTsKKworLyogcG9pbnRlciBzZXJpYWxpemF0aW9uIG1hbmFnZW1lbnQgKi8KK3N0cnVjdCBzb2FwX3BsaXN0Cit7IHN0cnVjdCBzb2FwX3BsaXN0ICpuZXh0OworICBjb25zdCB2b2lkICpwdHI7CisgIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphcnJheTsKKyAgaW50IHR5cGU7CisgIGludCBpZDsKKyAgY2hhciBtYXJrMTsKKyAgY2hhciBtYXJrMjsKK307CisKKy8qIGJsb2NrIGFsbG9jYXRpb24gZm9yIHBvaW50ZXIgc2VyaWFsaXphdGlvbiBtYW5hZ2VtZW50ICovCitzdHJ1Y3Qgc29hcF9wYmxrCit7IHN0cnVjdCBzb2FwX3BibGsgKm5leHQ7CisgIHN0cnVjdCBzb2FwX3BsaXN0IHBsaXN0W1NPQVBfUFRSQkxLXTsKK307CisKKyNpZmRlZiBTT0FQX0RFQlVHCisvKiBtYWxsb2MvZnJlZSB0cmFja2luZyBmb3IgZGVidWdnaW5nICovCitzdHJ1Y3Qgc29hcF9tbGlzdAoreyBzdHJ1Y3Qgc29hcF9tbGlzdCAqbmV4dDsKKyAgY29uc3Qgdm9pZCAqcHRyOworICBjb25zdCBjaGFyICpmaWxlOworICBpbnQgbGluZTsKKyAgc2hvcnQgbGl2ZTsKK307CisjZW5kaWYKKworLyogY2xhc3MgYWxsb2NhdGlvbiBsaXN0ICovCitzdHJ1Y3Qgc29hcF9jbGlzdAoreyBzdHJ1Y3Qgc29hcF9jbGlzdCAqbmV4dDsKKyAgdm9pZCAqcHRyOworICBpbnQgdHlwZTsKKyAgaW50IHNpemU7CisgIHZvaWQgKCpmZGVsZXRlKShzdHJ1Y3Qgc29hcF9jbGlzdCopOworfTsKKworLyogYXR0cmlidXRlcyAqLworc3RydWN0IHNvYXBfYXR0cmlidXRlCit7IHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqbmV4dDsKKyAgY2hhciAqdmFsdWU7CisgIHNpemVfdCBzaXplOworICBjaGFyICpuczsKKyAgc2hvcnQgdmlzaWJsZTsKKyAgY2hhciBuYW1lWzFdOyAvKiB0aGUgYWN0dWFsIG5hbWUgc3RyaW5nIGZsb3dzIGludG8gdGhlIGFsbG9jYXRlZCByZWdpb24gYmVsb3cgdGhpcyBzdHJ1Y3QgKi8KK307CisKK3N0cnVjdCBzb2FwX2Nvb2tpZQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKm5leHQ7CisgIGNoYXIgKm5hbWU7CisgIGNoYXIgKnZhbHVlOworICBjaGFyICpkb21haW47CisgIGNoYXIgKnBhdGg7CisgIGxvbmcgZXhwaXJlOwkJLyogY2xpZW50LXNpZGU6IGxvY2FsIHRpbWUgdG8gZXhwaXJlOyBzZXJ2ZXItc2lkZTogc2Vjb25kcyB0byBleHBpcmUgKi8KKyAgdW5zaWduZWQgaW50IHZlcnNpb247CisgIHNob3J0IHNlY3VyZTsKKyAgc2hvcnQgc2Vzc2lvbjsJLyogc2VydmVyLXNpZGUgKi8KKyAgc2hvcnQgZW52OwkJLyogc2VydmVyLXNpZGU6IGdvdCBjb29raWUgZnJvbSBjbGllbnQgYW5kIHNob3VsZCBub3QgYmUgKHJlKXNlbmQgKi8KKyAgc2hvcnQgbW9kaWZpZWQ7CS8qIHNlcnZlci1zaWRlOiBjbGllbnQgY29va2llIHdhcyBtb2RpZmllZCBhbmQgc2hvdWxkIGJlIHNlbmQgKi8KK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqIFNPQVBfRk1BQzIgc29hcF9uZXh0X211bHRpcGFydChzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKTsKKworY2xhc3Mgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3IKK3sgcHVibGljOgorICBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBzb2FwX211bHRpcGFydF9pdGVyYXRvciYgaXRlcikgY29uc3QKKyAgICB7IHJldHVybiBjb250ZW50ID09IGl0ZXIuY29udGVudDsgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3Qgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3ImIGl0ZXIpIGNvbnN0CisgICAgeyByZXR1cm4gY29udGVudCAhPSBpdGVyLmNvbnRlbnQ7IH0KKyAgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICZvcGVyYXRvciooKSBjb25zdAorICAgIHsgcmV0dXJuICpjb250ZW50OyB9CisgIHNvYXBfbXVsdGlwYXJ0X2l0ZXJhdG9yICZvcGVyYXRvcisrKCkKKyAgICB7IGNvbnRlbnQgPSBzb2FwX25leHRfbXVsdGlwYXJ0KGNvbnRlbnQpOyByZXR1cm4gKnRoaXM7IH0KKyAgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3IoKSA6IGNvbnRlbnQoTlVMTCkKKyAgICB7IH0KKyAgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3Ioc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpwKSA6IGNvbnRlbnQocCkKKyAgICB7IH0KK307CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU5FUgorc3RydWN0IHNvYXBfZGltZQoreyBzaXplX3QgY291bnQ7CisgIHNpemVfdCBzaXplOworICBzaXplX3QgY2h1bmtzaXplOworICBzaXplX3QgYnVmbGVuOworICBjaGFyIGZsYWdzOworICBjaGFyICpwdHI7CisgIGNvbnN0IGNoYXIgKmlkOworICBjb25zdCBjaGFyICp0eXBlOworICBjb25zdCBjaGFyICpvcHRpb25zOworICBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmxpc3Q7CQkvKiBsaXN0IG9mIERJTUUgYXR0YWNobWVudHMgcmVjZWl2ZWQgKi8KKyAgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpmaXJzdCwgKmxhc3Q7CS8qIHRlbXBvcmFyeSBpbi9vdXQgcXVldWUgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworICBzb2FwX211bHRpcGFydF9pdGVyYXRvciBiZWdpbigpCisgICAgeyBzb2FwX211bHRpcGFydF9pdGVyYXRvciBpdGVyKGxpc3QpOyByZXR1cm4gaXRlcjsgfTsKKyAgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3IgZW5kKCkKKyAgICB7IHNvYXBfbXVsdGlwYXJ0X2l0ZXJhdG9yIGl0ZXIoTlVMTCk7IHJldHVybiBpdGVyOyB9OworI2VuZGlmCit9OworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK3N0cnVjdCBzb2FwX21pbWUKK3sgY2hhciAqYm91bmRhcnk7CQkJLyogTUlNRSBib3VuZGFyeSAqLworICBjb25zdCBjaGFyICpzdGFydDsJCQkvKiBNSU1FIHN0YXJ0IElEICovCisgIHN0cnVjdCBzb2FwX211bHRpcGFydCAqbGlzdDsJCS8qIGxpc3Qgb2YgTUlNRSBhdHRhY2htZW50cyByZWNlaXZlZCAqLworICBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmZpcnN0LCAqbGFzdDsJLyogdGVtcG9yYXJ5IGluL291dCBxdWV1ZSAqLworI2lmZGVmIF9fY3BsdXNwbHVzCisgIHNvYXBfbXVsdGlwYXJ0X2l0ZXJhdG9yIGJlZ2luKCkKKyAgICB7IHNvYXBfbXVsdGlwYXJ0X2l0ZXJhdG9yIGl0ZXIobGlzdCk7IHJldHVybiBpdGVyOyB9OworICBzb2FwX211bHRpcGFydF9pdGVyYXRvciBlbmQoKQorICAgIHsgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3IgaXRlcihOVUxMKTsgcmV0dXJuIGl0ZXI7IH07CisjZW5kaWYKK307CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU5FUgorLyogUkZDMjA0NSBNSU1FIGNvbnRlbnQgdHJhbnNmZXIgZW5jb2RpbmdzICovCitlbnVtIHNvYXBfbWltZV9lbmNvZGluZworeyBTT0FQX01JTUVfTk9ORSwKKyAgU09BUF9NSU1FXzdCSVQsCisgIFNPQVBfTUlNRV84QklULAorICBTT0FQX01JTUVfQklOQVJZLAorICBTT0FQX01JTUVfUVVPVEVEX1BSSU5UQUJMRSwKKyAgU09BUF9NSU1FX0JBU0U2NCwKKyAgU09BUF9NSU1FX0lFVEZfVE9LRU4sCisgIFNPQVBfTUlNRV9YX1RPS0VOCit9OworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKKy8qIERJTUUvTUlNRSBtdWx0aXBhcnQgbGlzdCAqLworc3RydWN0IHNvYXBfbXVsdGlwYXJ0Cit7IHN0cnVjdCBzb2FwX211bHRpcGFydCAqbmV4dDsKKyAgY2hhciAqcHRyOwkJCQkvKiBwb2ludHMgdG8gcmF3IGRhdGEgY29udGVudCAqLworICBzaXplX3Qgc2l6ZTsJCQkJLyogc2l6ZSBvZiBkYXRhIGNvbnRlbnQgKi8KKyAgY29uc3QgY2hhciAqaWQ7CQkJLyogRElNRS9NSU1FIGNvbnRlbnQgSUQgb3IgZm9ybSBkYXRhIG5hbWUgKi8KKyAgY29uc3QgY2hhciAqdHlwZTsJCQkvKiBESU1FL01JTUUgdHlwZSAoTUlNRSB0eXBlIGZvcm1hdCkgKi8KKyAgY29uc3QgY2hhciAqb3B0aW9uczsJCQkvKiBESU1FIG9wdGlvbnMgKi8KKyAgZW51bSBzb2FwX21pbWVfZW5jb2RpbmcgZW5jb2Rpbmc7CS8qIE1JTUUgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyAqLworICBjb25zdCBjaGFyICpsb2NhdGlvbjsJCQkvKiBNSU1FIENvbnRlbnQtTG9jYXRpb24gKG9wdGlvbmFsKSAqLworICBjb25zdCBjaGFyICpkZXNjcmlwdGlvbjsJCS8qIE1JTUUgQ29udGVudC1EZXNjcmlwdGlvbiAob3B0aW9uYWwpICovCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgdHlwZWRlZiBzb2FwX211bHRpcGFydF9pdGVyYXRvciBpdGVyYXRvcjsKKyNlbmRpZgorfTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTkVSCisvKiBhdHRhY2htZW50IERJTUUgYW5kIE1UT00gWE9QIGZvcndhcmRpbmcgKi8KK3N0cnVjdCBzb2FwX3hsaXN0Cit7IHN0cnVjdCBzb2FwX3hsaXN0ICpuZXh0OworICB1bnNpZ25lZCBjaGFyICoqcHRyOworICBpbnQgKnNpemU7CisgIGNoYXIgKmlkOworICBjaGFyICoqdHlwZTsKKyAgY2hhciAqKm9wdGlvbnM7Cit9OworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZmRlZiBfX2NwbHVzcGx1cworY2xhc3Mgc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yCit7IHB1YmxpYzoKKyAgc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAqYXR0OworICBjb25zdCBjaGFyICpuc3RyOworICBjb25zdCBjaGFyICpuYW1lOworICBib29sIG9wZXJhdG9yPT0oY29uc3Qgc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3ImKSBjb25zdDsKKyAgc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAmb3BlcmF0b3IqKCkgY29uc3Q7CisgIHNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvciAmb3BlcmF0b3IrKygpOworICBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IoKTsKKyAgc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUqKTsKKyAgfnNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcigpOworfTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK3N0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUKK3sgc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAqbmV4dDsKKyAgY29uc3QgY2hhciAqbnN0cjsKKyAgY2hhciAqbmFtZTsKKyAgY2hhciAqZGF0YTsKKyAgd2NoYXJfdCAqd2lkZTsKKyAgc3RydWN0IHNvYXAgKnNvYXA7CisjaWZkZWYgX19jcGx1c3BsdXMKKyAgdHlwZWRlZiBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IgaXRlcmF0b3I7CisgIHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgJnNldChjb25zdCBjaGFyICpuc3RyLCBjb25zdCBjaGFyICpuYW1lKTsJLyogc2V0IG5hbWVzcGFjZSBhbmQgbmFtZSAqLworICBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICZzZXQoY29uc3QgY2hhciAqZGF0YSk7CQkvKiBzZXQgZGF0YSAqLworICBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IgYmVnaW4oKTsKKyAgc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yIGVuZCgpOworICBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IgZmluZChjb25zdCBjaGFyICpuc3RyLCBjb25zdCBjaGFyICpuYW1lKTsKKyAgdm9pZCB1bmxpbmsoKTsKKyAgc29hcF9kb21fYXR0cmlidXRlKCk7CisgIHNvYXBfZG9tX2F0dHJpYnV0ZShzdHJ1Y3Qgc29hcCAqc29hcCk7CisgIHNvYXBfZG9tX2F0dHJpYnV0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbnN0ciwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZGF0YSk7CisgIH5zb2FwX2RvbV9hdHRyaWJ1dGUoKTsKKyNlbmRpZgorfTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZkZWYgX19jcGx1c3BsdXMKK2NsYXNzIHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IKK3sgcHVibGljOgorICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqZWx0OworICBjb25zdCBjaGFyICpuc3RyOworICBjb25zdCBjaGFyICpuYW1lOworICBpbnQgdHlwZTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3ImKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3ImKSBjb25zdDsKKyAgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgJm9wZXJhdG9yKigpIGNvbnN0OworICBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yICZvcGVyYXRvcisrKCk7CisgIHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IoKTsKKyAgc29hcF9kb21fZWxlbWVudF9pdGVyYXRvcihzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCopOworICB+c29hcF9kb21fZWxlbWVudF9pdGVyYXRvcigpOworfTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK3N0cnVjdCBzb2FwX2RvbV9lbGVtZW50Cit7IHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICpuZXh0OwkvKiBuZXh0IHNpYmxpbmcgKi8KKyAgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKnBybnQ7CS8qIHBhcmVudCAqLworICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqZWx0czsJLyogbGlzdCBvZiBjaGlsZCBlbGVtZW50cyAqLworICBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICphdHRzOwkvKiBsaXN0IG9mIGF0dHJpYnV0ZXMgKi8KKyAgY29uc3QgY2hhciAqbnN0cjsJCQkvKiBuYW1lc3BhY2Ugc3RyaW5nICovCisgIGNoYXIgKm5hbWU7CQkJCS8qIGVsZW1lbnQgdGFnIG5hbWUgKi8KKyAgY2hhciAqZGF0YTsJCQkJLyogZWxlbWVudCBjb250ZW50IGRhdGEgKHdpdGggU09BUF9DX1VURlNUUklORyBmbGFnIHNldCkgKi8KKyAgd2NoYXJfdCAqd2lkZTsJCQkvKiBlbGVtZW50IGNvbnRlbnQgZGF0YSAqLworICBpbnQgdHlwZTsJCQkJLyogb3B0aW9uYWw6IHNlcmlhbGl6ZWQgQy9DKysgZGF0YSB0eXBlICovCisgIHZvaWQgKm5vZGU7CQkJCS8qIG9wdGlvbmFsOiBwb2ludGVyIHRvIHNlcmlhbGl6ZWQgQy9DKysgZGF0YSAqLworICBjaGFyICpoZWFkOwkJCQkvKiBsZWFkaW5nIHdoaXRlc3BhY2UgdG8gc3RhcnQgdGFnICovCisgIGNoYXIgKnRhaWw7CQkJCS8qIGxlYWRpbmcgd2hpdGVzcGFjZSB0byBlbmQgdGFnICovCisgIHN0cnVjdCBzb2FwICpzb2FwOwkJCS8qIHNvYXAgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBub2RlICovCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgdHlwZWRlZiBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yIGl0ZXJhdG9yOworICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAmc2V0KGNvbnN0IGNoYXIgKm5zdHIsIGNvbnN0IGNoYXIgKm5hbWUpOworICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAmc2V0KGNvbnN0IGNoYXIgKmRhdGEpOworICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAmc2V0KHZvaWQgKm5vZGUsIGludCB0eXBlKTsKKyAgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgJmFkZChzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCopOworICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAmYWRkKHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50Jik7CisgIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICZhZGQoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSopOworICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAmYWRkKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUmKTsKKyAgc29hcF9kb21fZWxlbWVudF9pdGVyYXRvciBiZWdpbigpOworICBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yIGVuZCgpOworICBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yIGZpbmQoY29uc3QgY2hhciAqbnN0ciwgY29uc3QgY2hhciAqbmFtZSk7CisgIHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IgZmluZChpbnQgdHlwZSk7CisgIHZvaWQgdW5saW5rKCk7CisgIHNvYXBfZG9tX2VsZW1lbnQoKTsKKyAgc29hcF9kb21fZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCk7CisgIHNvYXBfZG9tX2VsZW1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5zdHIsIGNvbnN0IGNoYXIgKm5hbWUpOworICBzb2FwX2RvbV9lbGVtZW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuc3RyLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkYXRhKTsKKyAgc29hcF9kb21fZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbnN0ciwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqbm9kZSwgaW50IHR5cGUpOworICB+c29hcF9kb21fZWxlbWVudCgpOworI2VuZGlmCit9OworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqIFNPQVBfRk1BQzIgc29hcF9kb21fbmV4dF9lbGVtZW50KHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICplbHQpOworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICogU09BUF9GTUFDMiBzb2FwX2RvbV9uZXh0X2F0dHJpYnV0ZShzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICphdHQpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiAhZGVmaW5lZChXSVRIX0xFQU4pCit9CitleHRlcm4gc3RkOjpvc3RyZWFtICZvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYsIGNvbnN0IHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50Jik7CitleHRlcm4gc3RkOjppc3RyZWFtICZvcGVyYXRvcj4+KHN0ZDo6aXN0cmVhbSYsIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50Jik7CitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3Qgc29hcAoreyBzaG9ydCBzdGF0ZTsJCQkvKiAwID0gdW5pbml0aWFsaXplZCwgMSA9IGluaXRpYWxpemVkLCAyID0gY29weSBvZiBhbm90aGVyIHNvYXAgc3RydWN0ICovCisgIHNob3J0IHZlcnNpb247CQkvKiAxID0gU09BUDEuMSBhbmQgMiA9IFNPQVAxLjIgKHNldCBhdXRvbWF0aWNhbGx5IGZyb20gbmFtZXNwYWNlIFVSSSBpbiBuc21hcCB0YWJsZSkgKi8KKyAgc29hcF9tb2RlIG1vZGU7CisgIHNvYXBfbW9kZSBpbW9kZTsKKyAgc29hcF9tb2RlIG9tb2RlOworICBjb25zdCBjaGFyICpmbG9hdF9mb3JtYXQ7CS8qIHVzZXItZGVmaW5hYmxlIGZvcm1hdCBzdHJpbmcgZm9yIGZsb2F0cyAoPDEwMjQgY2hhcnMpICovCisgIGNvbnN0IGNoYXIgKmRvdWJsZV9mb3JtYXQ7CS8qIHVzZXItZGVmaW5hYmxlIGZvcm1hdCBzdHJpbmcgZm9yIGRvdWJsZXMgKDwxMDI0IGNoYXJzKSAqLworICBjb25zdCBjaGFyICpkaW1lX2lkX2Zvcm1hdDsJLyogdXNlci1kZWZpbmFibGUgZm9ybWF0IHN0cmluZyBmb3IgaW50ZWdlciBESU1FIGlkICg8U09BUF9UQUdMRU4gY2hhcnMpICovCisgIGNvbnN0IGNoYXIgKmh0dHBfdmVyc2lvbjsJLyogSFRUUCB2ZXJzaW9uIHVzZWQgIjEuMCIgb3IgIjEuMSIgKi8KKyAgY29uc3QgY2hhciAqaHR0cF9jb250ZW50OwkvKiBvcHRpb25hbCBjdXN0b20gcmVzcG9uc2UgY29udGVudCB0eXBlICh3aXRoIFNPQVBfRklMRSkgKi8KKyAgY29uc3QgY2hhciAqZW5jb2RpbmdTdHlsZTsJLyogZGVmYXVsdCA9IE5VTEwgd2hpY2ggbWVhbnMgdGhhdCBTT0FQIGVuY29kaW5nIGlzIHVzZWQgKi8KKyAgY29uc3QgY2hhciAqYWN0b3I7CQkvKiBTT0FQLUVOVjphY3RvciBvciByb2xlIGF0dHJpYnV0ZSB2YWx1ZSAqLworICBpbnQgcmVjdl90aW1lb3V0OwkJLyogd2hlbiA+IDAsIGdpdmVzIHNvY2tldCByZWN2IHRpbWVvdXQgaW4gc2Vjb25kcywgPCAwIGluIHVzZWMgKi8KKyAgaW50IHNlbmRfdGltZW91dDsJCS8qIHdoZW4gPiAwLCBnaXZlcyBzb2NrZXQgc2VuZCB0aW1lb3V0IGluIHNlY29uZHMsIDwgMCBpbiB1c2VjICovCisgIGludCBjb25uZWN0X3RpbWVvdXQ7CQkvKiB3aGVuID4gMCwgZ2l2ZXMgc29ja2V0IGNvbm5lY3QoKSB0aW1lb3V0IGluIHNlY29uZHMsIDwgMCBpbiB1c2VjICovCisgIGludCBhY2NlcHRfdGltZW91dDsJCS8qIHdoZW4gPiAwLCBnaXZlcyBzb2NrZXQgYWNjZXB0KCkgdGltZW91dCBpbiBzZWNvbmRzLCA8IDAgaW4gdXNlYyAqLworICBpbnQgc29ja2V0X2ZsYWdzOwkJLyogc29ja2V0IHJlY3YoKSBhbmQgc2VuZCgpIGZsYWdzLCBlLmcuIHNldCB0byBNU0dfTk9TSUdOQUwgdG8gZGlzYWJsZSBzaWdwaXBlICovCisgIGludCBjb25uZWN0X2ZsYWdzOwkJLyogY29ubmVjdCgpIFNPTF9TT0NLRVQgc29ja29wdCBmbGFncywgZS5nLiBzZXQgdG8gU09fREVCVUcgdG8gZGVidWcgc29ja2V0ICovCisgIGludCBiaW5kX2ZsYWdzOwkJLyogYmluZCgpIFNPTF9TT0NLRVQgc29ja29wdCBmbGFncywgZS5nLiBzZXQgdG8gU09fUkVVU0VBRERSIHRvIGVuYWJsZSByZXVzZSAqLworICBpbnQgYWNjZXB0X2ZsYWdzOwkJLyogYWNjZXB0KCkgU09MX1NPQ0tFVCBzb2Nrb3B0IGZsYWdzICovCisgIGNvbnN0IHN0cnVjdCBOYW1lc3BhY2UgKm5hbWVzcGFjZXM7CS8qIFBvaW50ZXIgdG8gZ2xvYmFsIG5hbWVzcGFjZSBtYXBwaW5nIHRhYmxlICovCisgIHN0cnVjdCBOYW1lc3BhY2UgKmxvY2FsX25hbWVzcGFjZXM7CS8qIExvY2FsIG5hbWVzcGFjZSBtYXBwaW5nIHRhYmxlICovCisgIHN0cnVjdCBzb2FwX25saXN0ICpubGlzdDsJLyogbmFtZXNwYWNlIHN0YWNrICovCisgIHN0cnVjdCBzb2FwX2JsaXN0ICpibGlzdDsJLyogYmxvY2sgYWxsb2NhdGlvbiBzdGFjayAqLworICBzdHJ1Y3Qgc29hcF9jbGlzdCAqY2xpc3Q7CS8qIGNsYXNzIGluc3RhbmNlIGFsbG9jYXRpb24gbGlzdCAqLworICB2b2lkICphbGlzdDsJCQkvKiBtZW1vcnkgYWxsb2NhdGlvbiAobWFsbG9jKSBsaXN0ICovCisgIHN0cnVjdCBzb2FwX2lsaXN0ICppaHRbU09BUF9JREhBU0hdOworICBzdHJ1Y3Qgc29hcF9wbGlzdCAqcGh0W1NPQVBfUFRSSEFTSF07CisgIHN0cnVjdCBzb2FwX3BibGsgKnBibGs7CS8qIHBsaXN0IGJsb2NrIGFsbG9jYXRpb24gKi8KKyAgc2hvcnQgcGlkeDsJCQkvKiBwbGlzdCBibG9jayBhbGxvY2F0aW9uICovCisgIHN0cnVjdCBTT0FQX0VOVl9fSGVhZGVyICpoZWFkZXI7CisgIHN0cnVjdCBTT0FQX0VOVl9fRmF1bHQgKmZhdWx0OworICBpbnQgaWRudW07CisgIHZvaWQgKnVzZXI7CQkJLyogdG8gcGFzcyB1c2VyLWRlZmluZWQgZGF0YSAqLworICBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnBsdWdpbnM7CS8qIGxpbmtlZCBsaXN0IG9mIHBsdWctaW4gZGF0YSAqLworICBjaGFyICp1c2VyaWQ7CQkJLyogSFRUUCBCYXNpYyBhdXRob3JpemF0aW9uIHVzZXJpZCAqLworICBjaGFyICpwYXNzd2Q7CQkJLyogSFRUUCBCYXNpYyBhdXRob3JpemF0aW9uIHBhc3N3ZCAqLworICBpbnQgKCpmcG9zdCkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworICBpbnQgKCpmZ2V0KShzdHJ1Y3Qgc29hcCopOworICBpbnQgKCpmZm9ybSkoc3RydWN0IHNvYXAqKTsKKyAgaW50ICgqZnBvc3RoZHIpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKyAgaW50ICgqZnJlc3BvbnNlKShzdHJ1Y3Qgc29hcCosIGludCwgc2l6ZV90KTsKKyAgaW50ICgqZnBhcnNlKShzdHJ1Y3Qgc29hcCopOworICBpbnQgKCpmcGFyc2VoZHIpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKyAgaW50ICgqZnJlc29sdmUpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHN0cnVjdCBpbl9hZGRyKiBpbmFkZHIpOworICBpbnQgKCpmY29ubmVjdCkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGludCk7CisgIGludCAoKmZkaXNjb25uZWN0KShzdHJ1Y3Qgc29hcCopOworICBpbnQgKCpmY2xvc2Vzb2NrZXQpKHN0cnVjdCBzb2FwKiwgU09BUF9TT0NLRVQpOworICBpbnQgKCpmc2h1dGRvd25zb2NrZXQpKHN0cnVjdCBzb2FwKiwgU09BUF9TT0NLRVQsIGludCk7CisgIGludCAoKmZvcGVuKShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgaW50KTsKKyAgaW50ICgqZmFjY2VwdCkoc3RydWN0IHNvYXAqLCBpbnQsIHN0cnVjdCBzb2NrYWRkciosIGludCAqbik7CisgIGludCAoKmZjbG9zZSkoc3RydWN0IHNvYXAqKTsKKyAgaW50ICgqZnNlbmQpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHNpemVfdCk7CisgIHNpemVfdCAoKmZyZWN2KShzdHJ1Y3Qgc29hcCosIGNoYXIqLCBzaXplX3QpOworICBpbnQgKCpmcG9sbCkoc3RydWN0IHNvYXAqKTsKKyAgdm9pZCAoKmZzZXRlcnJvcikoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICoqYywgY29uc3QgY2hhciAqKnMpOworICBpbnQgKCpmaWdub3JlKShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKKyAgaW50ICgqZnNlcnZlbG9vcCkoc3RydWN0IHNvYXAqKTsKKyAgdm9pZCAqKCpmcGx1Z2luKShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaW50ICgqZnByZXBhcmVpbml0KShzdHJ1Y3Qgc29hcCopOworICBpbnQgKCpmcHJlcGFyZXNlbmQpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHNpemVfdCk7CisgIGludCAoKmZwcmVwYXJlcmVjdikoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc2l6ZV90KTsKKyAgaW50ICgqZnByZXBhcmVmaW5hbCkoc3RydWN0IHNvYXAqKTsKKyAgdm9pZCAqKCpmZGltZXJlYWRvcGVuKShzdHJ1Y3Qgc29hcCosIHZvaWQqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKyAgdm9pZCAqKCpmZGltZXdyaXRlb3Blbikoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKyAgdm9pZCAoKmZkaW1lcmVhZGNsb3NlKShzdHJ1Y3Qgc29hcCosIHZvaWQqKTsKKyAgdm9pZCAoKmZkaW1ld3JpdGVjbG9zZSkoc3RydWN0IHNvYXAqLCB2b2lkKik7CisgIHNpemVfdCAoKmZkaW1lcmVhZCkoc3RydWN0IHNvYXAqLCB2b2lkKiwgY2hhciosIHNpemVfdCk7CisgIGludCAoKmZkaW1ld3JpdGUpKHN0cnVjdCBzb2FwKiwgdm9pZCosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworI2VuZGlmCisgIGludCBtYXN0ZXI7CisgIGludCBzb2NrZXQ7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgIWRlZmluZWQoV0lUSF9MRUFOKQorICBzdGQ6Om9zdHJlYW0gKm9zOworICBzdGQ6OmlzdHJlYW0gKmlzOworI2Vsc2UKKyAgdm9pZCAqb3M7CS8qIHByZXNlcnZlIGFsaWdubWVudCAqLworICB2b2lkICppczsJLyogcHJlc2VydmUgYWxpZ25tZW50ICovCisjZW5kaWYKKyNpZm5kZWYgVU5ERVJfQ0UKKyAgaW50IHNlbmRmZDsKKyAgaW50IHJlY3ZmZDsKKyNlbHNlCisgIEZJTEUgKnNlbmRmZDsKKyAgRklMRSAqcmVjdmZkOworI2VuZGlmCisjaWZkZWYgV0lOMzIKKyAgY2hhciBlcnJvcnN0clsyNTZdOwkvKiBidWYgZm9yIEZvcm1hdE1lc3NhZ2UoKSAqLworI2VuZGlmCisgIHNpemVfdCBidWZpZHg7CS8qIGluZGV4IGluIHNvYXAuYnVmW10gKi8KKyAgc2l6ZV90IGJ1ZmxlbjsJLyogbGVuZ3RoIG9mIHNvYXAuYnVmW10gY29udGVudCAqLworICBzb2FwX3djaGFyIGFoZWFkOwkvKiBwYXJzZXIgbG9va2FoZWFkICovCisgIHNob3J0IGNkYXRhOwkJLyogQ0RBVEEgcGFyc2VyIHN0YXRlICovCisgIHNob3J0IGJvZHk7CQkvKiBwYXJzZWQgWE1MIGVsZW1lbnQgaGFzIGEgYm9keSBvciBub3QgKi8KKyAgdW5zaWduZWQgaW50IGxldmVsOwkvKiBYTUwgbmVzdGluZyBsZXZlbCAqLworICBzaXplX3QgY291bnQ7CQkvKiBtZXNzYWdlIGxlbmd0aCBjb3VudGVyICovCisgIHNpemVfdCBsZW5ndGg7CS8qIG1lc3NhZ2UgbGVuZ3RoIGFzIHNldCBieSBIVFRQIGhlYWRlciAqLworI2lmZGVmIFdJVEhfRkFTVAorICBjaGFyICpsYWJidWY7CQkvKiBsb29rLWFzaWRlIGJ1ZmZlciAqLworICBzaXplX3QgbGFibGVuOwkvKiBsb29rLWFzaWRlIGJ1ZmZlciBhbGxvY2F0ZWQgbGVuZ3RoICovCisgIHNpemVfdCBsYWJpZHg7CS8qIGxvb2stYXNpZGUgYnVmZmVyIGluZGV4IHRvIGF2YWlsYWJsZSBwYXJ0ICovCisjZW5kaWYKKyAgY2hhciBidWZbU09BUF9CVUZMRU5dOy8qIHNlbmQgYW5kIHJlY2VpdmUgYnVmZmVyICovCisgIGNoYXIgdG1wYnVmWzEwMjRdOwkvKiBpbi9vdXRwdXQgYnVmZmVyIGZvciBIVFRQIGhlYWRlcnMsIHNpbXBsZVR5cGUgdmFsdWVzLCBhdHRyaWJ1dGUgbmFtZXMsIGFuZCBESU1FID49MTAyNCBieXRlcyAqLworICBjaGFyIG1zZ2J1ZlsxMDI0XTsJLyogb3V0cHV0IGJ1ZmZlciBmb3IgKGVycm9yKSBtZXNzYWdlcyA8PTEwMjQgYnl0ZXMgKi8KKyAgY2hhciB0YWdbU09BUF9UQUdMRU5dOworICBjaGFyIGlkW1NPQVBfVEFHTEVOXTsKKyAgY2hhciBocmVmW1NPQVBfVEFHTEVOXTsKKyAgY2hhciB0eXBlW1NPQVBfVEFHTEVOXTsKKyAgY2hhciBhcnJheVR5cGVbU09BUF9UQUdMRU5dOworICBjaGFyIGFycmF5U2l6ZVtTT0FQX1RBR0xFTl07CisgIGNoYXIgYXJyYXlPZmZzZXRbU09BUF9UQUdMRU5dOworICBzaG9ydCBvdGhlcjsKKyAgc2hvcnQgcG9zaXRpb247CisgIGludCBwb3NpdGlvbnNbU09BUF9NQVhESU1TXTsKKyAgc2hvcnQgcm9vdDsKKyAgc3RydWN0IHNvYXBfYXR0cmlidXRlICphdHRyaWJ1dGVzOwkvKiBhdHRyaWJ1dGUgbGlzdCAqLworICBzaG9ydCBlbmNvZGluZzsJLyogd2hlbiBzZXQsIG91dHB1dCBlbmNvZGluZ1N0eWxlICovCisgIHNob3J0IG11c3RVbmRlcnN0YW5kOwkvKiBhIG11c3RVbmRlcnN0YW5kIGVsZW1lbnQgd2FzIHBhcnNlZCBvciBpcyBvdXRwdXQgKi8KKyAgc2hvcnQga2VlcF9hbGl2ZTsJLyogY29ubmVjdGlvbiBzaG91bGQgYmUga2VwdCBvcGVuICovCisgIHNob3J0IG51bGw7CQkvKiBwYXJzZWQgWE1MIGlzIHhzaTpuaWwgKi8KKyAgc2hvcnQgbnM7CQkvKiB3aGVuIG5vdCBzZXQsIG91dHB1dCBmdWxsIHhtbG5zIGJpbmRpbmdzICovCisgIHNob3J0IHBhcnQ7CQkvKiBwYXJzaW5nIHN0YXRlICovCisgIHNob3J0IGFsbG9jZWQ7CisgIHNob3J0IHBlZWtlZDsKKyAgc2l6ZV90IGNodW5rc2l6ZTsKKyAgc2l6ZV90IGNodW5rYnVmbGVuOworICBjaGFyIGVuZHBvaW50W1NPQVBfVEFHTEVOXTsKKyAgY2hhciBwYXRoW1NPQVBfVEFHTEVOXTsKKyAgY2hhciBob3N0W1NPQVBfVEFHTEVOXTsKKyAgY2hhciAqYWN0aW9uOworICBjaGFyICphdXRocmVhbG07CQkvKiBIVFRQIGF1dGhlbnRpY2F0aW9uIHJlYWxtICovCisgIGNoYXIgKnByb2xvZzsJCQkvKiBYTUwgZGVjbGFyYXRpb24gcHJvbG9nICovCisgIHVuc2lnbmVkIGxvbmcgaXA7CQkvKiBJUCBudW1iZXIgKi8KKyAgaW50IHBvcnQ7CQkJLyogcG9ydCBudW1iZXIgKi8KKyAgdW5zaWduZWQgaW50IG1heF9rZWVwX2FsaXZlOworICBjb25zdCBjaGFyICpwcm94eV9ob3N0OwkvKiBQcm94eSBTZXJ2ZXIgaG9zdCBuYW1lICovCisgIGludCBwcm94eV9wb3J0OwkJLyogUHJveHkgU2VydmVyIHBvcnQgKGRlZmF1bHQgPSA4MDgwKSAqLworICBjb25zdCBjaGFyICpwcm94eV91c2VyaWQ7CS8qIFByb3h5IEF1dGhvcml6YXRpb24gdXNlciBuYW1lICovCisgIGNvbnN0IGNoYXIgKnByb3h5X3Bhc3N3ZDsJLyogUHJveHkgQXV0aG9yaXphdGlvbiBwYXNzd29yZCAqLworICBpbnQgc3RhdHVzOwkJCS8qIC0xIHdoZW4gcmVxdWVzdCwgZWxzZSBlcnJvciBjb2RlIHRvIGJlIHJldHVybmVkIGJ5IHNlcnZlciAqLworICBpbnQgZXJyb3I7CisgIGludCBlcnJtb2RlOworICBpbnQgZXJybnVtOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqZG9tOworICBzdHJ1Y3Qgc29hcF9kaW1lIGRpbWU7CisgIHN0cnVjdCBzb2FwX21pbWUgbWltZTsKKyAgc3RydWN0IHNvYXBfeGxpc3QgKnhsaXN0OworI2VuZGlmCisjaWYgIWRlZmluZWQoV0lUSF9MRUFOKSB8fCBkZWZpbmVkKFNPQVBfREVCVUcpCisgIGNvbnN0IGNoYXIgKmxvZ2ZpbGVbU09BUF9NQVhMT0dTXTsKKyAgRklMRSAqZmRlYnVnW1NPQVBfTUFYTE9HU107CisgIHN0cnVjdCBzb2FwX21saXN0ICptaHRbU09BUF9QVFJIQVNIXTsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgY29uc3QgY2hhciAqYzE0bmluY2x1ZGU7CisgIGNvbnN0IGNoYXIgKmMxNG5leGNsdWRlOworICBzdHJ1Y3Qgc29hcF9jb29raWUgKmNvb2tpZXM7CisgIGNvbnN0IGNoYXIgKmNvb2tpZV9kb21haW47CisgIGNvbnN0IGNoYXIgKmNvb2tpZV9wYXRoOworICBpbnQgY29va2llX21heDsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZmRlZiBXSVRIX0lQVjYKKyAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgcGVlcjsJLyogSVB2Njogc2V0IGJ5IHNvYXBfYWNjZXB0IGFuZCBieSBVRFAgcmVjdiAqLworI2Vsc2UKKyAgc3RydWN0IHNvY2thZGRyX2luIHBlZXI7CS8qIElQdjQ6IHNldCBieSBzb2FwX2Nvbm5lY3Qvc29hcF9hY2NlcHQgYW5kIGJ5IFVEUCByZWN2ICovCisjZW5kaWYKKyAgc2l6ZV90IHBlZXJsZW47CisjZW5kaWYKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgaW50ICgqZnNzbGF1dGgpKHN0cnVjdCBzb2FwKik7CisgIGludCAoKmZzc2x2ZXJpZnkpKGludCwgWDUwOV9TVE9SRV9DVFgqKTsKKyAgQklPICpiaW87CisgIFNTTCAqc3NsOworICBTU0xfQ1RYICpjdHg7CisgIHNob3J0IHJlcXVpcmVfc2VydmVyX2F1dGg7CisgIHNob3J0IHJlcXVpcmVfY2xpZW50X2F1dGg7CisgIHNob3J0IHJzYTsJCQkvKiB3aGVuIHNldCwgdXNlIFJTQSBpbnN0ZWFkIG9mIERIICovCisgIGNvbnN0IGNoYXIgKmtleWZpbGU7CisgIGNvbnN0IGNoYXIgKnBhc3N3b3JkOworICBjb25zdCBjaGFyICpkaGZpbGU7CisgIGNvbnN0IGNoYXIgKmNhZmlsZTsKKyAgY29uc3QgY2hhciAqY2FwYXRoOworICBjb25zdCBjaGFyICpjcmxmaWxlOworICBjb25zdCBjaGFyICpyYW5kZmlsZTsKKyAgU1NMX1NFU1NJT04gKnNlc3Npb247CisgIGNoYXIgc2Vzc2lvbl9ob3N0W1NPQVBfVEFHTEVOXTsKKyAgaW50IHNlc3Npb25fcG9ydDsKKyNlbmRpZgorI2lmZGVmIFdJVEhfWkxJQgorICBzaG9ydCB6bGliX3N0YXRlOwkJLyogU09BUF9aTElCX05PTkUsIFNPQVBfWkxJQl9ERUZMQVRFLCBvciBTT0FQX1pMSUJfSU5GTEFURSAqLworICBzaG9ydCB6bGliX2luOwkJLyogU09BUF9aTElCX05PTkUsIFNPQVBfWkxJQl9ERUZMQVRFLCBvciBTT0FQX1pMSUJfR1pJUCAqLworICBzaG9ydCB6bGliX291dDsJCS8qIFNPQVBfWkxJQl9OT05FLCBTT0FQX1pMSUJfREVGTEFURSwgb3IgU09BUF9aTElCX0daSVAgKi8KKyAgel9zdHJlYW0gZF9zdHJlYW07CQkvKiBkZWNvbXByZXNzaW9uIHN0cmVhbSAqLworICBjaGFyIHpfYnVmW1NPQVBfQlVGTEVOXTsJLyogYnVmZmVyICovCisgIHNpemVfdCB6X2J1ZmxlbjsKKyAgdW5zaWduZWQgc2hvcnQgel9sZXZlbDsJLyogY29tcHJlc3Npb24gbGV2ZWwgdG8gYmUgdXNlZCAoMD1ub25lLCAxPWZhc3QgdG8gOT1iZXN0KSAqLworICB1TG9uZyB6X2NyYzsJCQkvKiBpbnRlcm5hbCBnemlwIGNyYyAqLworICBmbG9hdCB6X3JhdGlvX2luOwkJLyogZGV0ZWN0ZWQgY29tcHJlc3Npb24gcmF0aW8gY29tcHJlc3NlZF9sZW5ndGgvbGVuZ3RoIG9mIGluYm91bmQgbWVzc2FnZSAqLworICBmbG9hdCB6X3JhdGlvX291dDsJCS8qIGRldGVjdGVkIGNvbXByZXNzaW9uIHJhdGlvIGNvbXByZXNzZWRfbGVuZ3RoL2xlbmd0aCBvZiBvdXRib3VuZCBtZXNzYWdlICovCisjZW5kaWYKKyNpZmRlZiBXTVdfUlBNX0lPCisgIHZvaWQgKnJwbXJlcWlkOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorI2lmZGVmIF9fY3BsdXNwbHVzCisgIHNvYXAoKTsKKyAgc29hcChzb2FwX21vZGUpOworICBzb2FwKHNvYXBfbW9kZSwgc29hcF9tb2RlKTsKKyAgc29hcChzdHJ1Y3Qgc29hcCYpOworICB+c29hcCgpOworI2VuZGlmCisjZW5kaWYKK307CisKK3N0cnVjdCBzb2FwX2NvZGVfbWFwCit7IGxvbmcgY29kZTsKKyAgY29uc3QgY2hhciAqc3RyaW5nOworfTsKKworLyogZm9yd2FyZGluZyBsaXN0ICovCitzdHJ1Y3Qgc29hcF9mbGlzdAoreyBzdHJ1Y3Qgc29hcF9mbGlzdCAqbmV4dDsKKyAgaW50IHR5cGU7CisgIHZvaWQgKnB0cjsKKyAgdW5zaWduZWQgaW50IGxldmVsOworICBzaXplX3QgbGVuOworICB2b2lkICgqZmNvcHkpKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBzaXplX3QsIGNvbnN0IHZvaWQqLCBzaXplX3QpOworfTsKKworLyogaWQtcmVmIGZvcndhcmRpbmcgbGlzdCAqLworc3RydWN0IHNvYXBfaWxpc3QKK3sgc3RydWN0IHNvYXBfaWxpc3QgKm5leHQ7CisgIGludCB0eXBlOworICBzaXplX3Qgc2l6ZTsKKyAgdm9pZCAqbGluazsKKyAgdm9pZCAqY29weTsKKyAgc3RydWN0IHNvYXBfZmxpc3QgKmZsaXN0OworICB2b2lkICpwdHI7CisgIHVuc2lnbmVkIGludCBsZXZlbDsKKyAgY2hhciBpZFsxXTsgLyogdGhlIGFjdHVhbCBpZCBzdHJpbmcgdmFsdWUgZmxvd3MgaW50byB0aGUgYWxsb2NhdGVkIHJlZ2lvbiBiZWxvdyB0aGlzIHN0cnVjdCAqLworfTsKKworc3RydWN0IHNvYXBfcGx1Z2luCit7IHN0cnVjdCBzb2FwX3BsdWdpbiAqbmV4dDsKKyAgY29uc3QgY2hhciAqaWQ7CisgIHZvaWQgKmRhdGE7CisgIGludCAoKmZjb3B5KShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGx1Z2luICpkc3QsIHN0cnVjdCBzb2FwX3BsdWdpbiAqc3JjKTsKKyAgdm9pZCAoKmZkZWxldGUpKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnApOyAvKiBzaG91bGQgZGVsZXRlIGZpZWxkcyBvZiBwbHVnaW4gb25seSBhbmQgbm90IGZyZWUocCkgKi8KK307CisKKyNpZm5kZWYgV0lUSF9OT05BTUVTUEFDRVMKK2V4dGVybiBTT0FQX05NQUMgc3RydWN0IE5hbWVzcGFjZSBuYW1lc3BhY2VzW107CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU4KKyMgZGVmaW5lIHNvYXBfZ2V0MChzb2FwKSAoKChzb2FwKS0+YnVmaWR4Pj0oc29hcCktPmJ1ZmxlbiAmJiBzb2FwX3JlY3Yoc29hcCkpID8gRU9GIDogKHVuc2lnbmVkIGNoYXIpKHNvYXApLT5idWZbKHNvYXApLT5idWZpZHhdKQorIyBkZWZpbmUgc29hcF9nZXQxKHNvYXApICgoKHNvYXApLT5idWZpZHg+PShzb2FwKS0+YnVmbGVuICYmIHNvYXBfcmVjdihzb2FwKSkgPyBFT0YgOiAodW5zaWduZWQgY2hhcikoc29hcCktPmJ1Zlsoc29hcCktPmJ1ZmlkeCsrXSkKKyNlbHNlCitzb2FwX3djaGFyIHNvYXBfZ2V0MChzdHJ1Y3Qgc29hcCopOworc29hcF93Y2hhciBzb2FwX2dldDEoc3RydWN0IHNvYXAqKTsKKyNlbmRpZgorCisjZGVmaW5lIHNvYXBfcmV2Z2V0MShzb2FwKSAoKHNvYXApLT5idWZpZHgtLSkKKyNkZWZpbmUgc29hcF91bmdldChzb2FwLCBjKSAoKHNvYXApLT5haGVhZCA9IGMpCisjZGVmaW5lIHNvYXBfcmVnaXN0ZXJfcGx1Z2luKHNvYXAsIHBsdWdpbikgc29hcF9yZWdpc3Rlcl9wbHVnaW5fYXJnKHNvYXAsIHBsdWdpbiwgTlVMTCkKKyNkZWZpbmUgc29hcF9pbW9kZShzb2FwLCBuKSAoKHNvYXApLT5tb2RlID0gKHNvYXApLT5pbW9kZSA9IChuKSkKKyNkZWZpbmUgc29hcF9zZXRfaW1vZGUoc29hcCwgbikgKChzb2FwKS0+aW1vZGUgfD0gKG4pKQorI2RlZmluZSBzb2FwX2Nscl9pbW9kZShzb2FwLCBuKSAoKHNvYXApLT5pbW9kZSAmPSB+KG4pKQorI2RlZmluZSBzb2FwX29tb2RlKHNvYXAsIG4pICgoc29hcCktPm1vZGUgPSAoc29hcCktPm9tb2RlID0gKG4pKQorI2RlZmluZSBzb2FwX3NldF9vbW9kZShzb2FwLCBuKSAoKHNvYXApLT5vbW9kZSB8PSAobikpCisjZGVmaW5lIHNvYXBfY2xyX29tb2RlKHNvYXAsIG4pICgoc29hcCktPm9tb2RlICY9IH4obikpCisjZGVmaW5lIHNvYXBfc2V0X21vZGUoc29hcCwgbikgKChzb2FwKS0+aW1vZGUgfD0gKG4pLCAoc29hcCktPm9tb2RlIHw9IChuKSkKKyNkZWZpbmUgc29hcF9jbHJfbW9kZShzb2FwLCBuKSAoKHNvYXApLT5pbW9kZSAmPSB+KG4pLCAoc29hcCktPm9tb2RlICY9IH4obikpCisjZGVmaW5lIHNvYXBfZGVzdHJveShzb2FwKSBzb2FwX2RlbGV0ZSgoc29hcCksIE5VTEwpCisKKyNpZmRlZiBIQVZFX1NUUlJDSFIKKyMgZGVmaW5lIHNvYXBfc3RycmNocihzLCB0KSBzdHJyY2hyKHMsIHQpCisjZWxzZQorIFNPQVBfRk1BQzEgY2hhciogU09BUF9GTUFDMiBzb2FwX3N0cnJjaHIoY29uc3QgY2hhciAqcywgaW50IHQpOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NUUlRPTAorIyBkZWZpbmUgc29hcF9zdHJ0b2wocywgdCwgYikgc3RydG9sKHMsIHQsIGIpCisjZWxzZQorIFNPQVBfRk1BQzEgbG9uZyBTT0FQX0ZNQUMyIHNvYXBfc3RydG9sKGNvbnN0IGNoYXIgKnMsIGNoYXIgKip0LCBpbnQgYik7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RSVE9VTAorIyBkZWZpbmUgc29hcF9zdHJ0b3VsKHMsIHQsIGIpIHN0cnRvdWwocywgdCwgYikKKyNlbHNlCisgU09BUF9GTUFDMSB1bnNpZ25lZCBsb25nIFNPQVBfRk1BQzIgc29hcF9zdHJ0b3VsKGNvbnN0IGNoYXIgKnMsIGNoYXIgKip0LCBpbnQgYik7CisjZW5kaWYKKworI2lmIGRlZmluZWQoV0lUSF9PUEVOU1NMKQorIyBkZWZpbmUgc29hcF9yYW5kb20gc29hcF9yYW5kKCkKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9yYW5kKCk7CisjZWxpZiBkZWZpbmVkKEhBVkVfUkFORE9NKQorIyBkZWZpbmUgc29hcF9yYW5kb20gKGludClyYW5kb20oKQorI2Vsc2UKKyMgZGVmaW5lIHNvYXBfcmFuZG9tIHJhbmQoKQorI2VuZGlmCisKKyNpZmRlZiBXSVRIX05PSURSRUYKKyMgZGVmaW5lIHNvYXBfZW1iZWRkZWQocywgcCwgdCkgKDApCisjIGRlZmluZSBzb2FwX2lkX2xvb2t1cChzLCBpLCBwLCB0LCBuLCBrKSAocCkKKyMgZGVmaW5lIHNvYXBfaWRfZm9yd2FyZChzLCBoLCBwLCBsZW4sIHN0LCB0dCwgbiwgaywgZmMpIChwKQorIyBkZWZpbmUgc29hcF9yZWZlcmVuY2UocywgYSwgdCkgKDEpCisjIGRlZmluZSBzb2FwX2FycmF5X3JlZmVyZW5jZShzLCBwLCBhLCBuLCB0KSAoMSkKKyMgZGVmaW5lIHNvYXBfZW1iZWQocywgcCwgYSwgbiwgdCwgcHApICgwKQorIyBkZWZpbmUgc29hcF9lbWJlZGRlZF9pZChzLCBpLCBwLCB0KSAoaSkKKyMgZGVmaW5lIHNvYXBfaXNfZW1iZWRkZWQocywgcCkgKDApCisjIGRlZmluZSBzb2FwX2lzX3NpbmdsZShzLCBwKSAoMSkKKyMgZGVmaW5lIHNvYXBfbG9va3VwX3R5cGUocywgaSkgKDApCisjIGRlZmluZSBzb2FwX2dldGluZGVwZW5kZW50KHMpICgwKQorIyBkZWZpbmUgc29hcF9wdXRpbmRlcGVuZGVudChzKSAoMCkKKyMgZGVmaW5lIHNvYXBfZ2V0ZWxlbWVudChzLCBuKSAobikKKyMgZGVmaW5lIHNvYXBfcHV0ZWxlbWVudChzLCBwLCB0LCBpLCBuKSAoMCkKKyMgZGVmaW5lIHNvYXBfbWFya2VsZW1lbnQocywgcCwgbikgKDApCisjZW5kaWYKKworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9mYXVsdChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiogU09BUF9GTUFDMiBzb2FwX2ZhdWx0Y29kZShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiogU09BUF9GTUFDMiBzb2FwX2ZhdWx0c3ViY29kZShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiogU09BUF9GTUFDMiBzb2FwX2ZhdWx0c3RyaW5nKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqKiBTT0FQX0ZNQUMyIHNvYXBfZmF1bHRkZXRhaWwoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfc2VyaWFsaXplaGVhZGVyKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0aGVhZGVyKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZ2V0aGVhZGVyKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NlcmlhbGl6ZWZhdWx0KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0ZmF1bHQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRmYXVsdChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NzbF9pbml0KCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcG9sbChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2Nvbm5lY3RfY29tbWFuZChzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9jb25uZWN0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9iaW5kKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9hY2NlcHQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zc2xfYWNjZXB0KHN0cnVjdCBzb2FwKik7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zc2xfc2VydmVyX2NvbnRleHQoc3RydWN0IHNvYXAqLCB1bnNpZ25lZCBzaG9ydCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NzbF9jbGllbnRfY29udGV4dChzdHJ1Y3Qgc29hcCosIHVuc2lnbmVkIHNob3J0LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0aHR0cGhkcihzdHJ1Y3Qgc29hcCosIGludCBzdGF0dXMsIHNpemVfdCBjb3VudCk7CisKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX2RlY29kZV9rZXkoY2hhciosIHNpemVfdCwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfZGVjb2RlX3ZhbChjaGFyKiwgc2l6ZV90LCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzEgc2l6ZV90IFNPQVBfRk1BQzIgc29hcF9oYXNoKGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfc2V0X2VuZHBvaW50KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2ZsdXNoX3JhdyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2ZsdXNoKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHNvYXBfd2NoYXIgU09BUF9GTUFDMiBzb2FwX2dldChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBzb2FwX3djaGFyIFNPQVBfRk1BQzIgc29hcF9nZXRjaGFyKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfdGFnX2NtcChjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXRfZmF1bHQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZW5kZXJfZmF1bHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NlbmRlcl9mYXVsdF9zdWJjb2RlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcmVjZWl2ZXJfZmF1bHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3JlY2VpdmVyX2ZhdWx0X3N1YmNvZGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgaW50KTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NlbmRfcmF3KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHNpemVfdCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcmVjdl9yYXcoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9yZWN2KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2VuZChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZW5kMihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2VuZDMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3B1dHV0Zjgoc3RydWN0IHNvYXAqLCB1bnNpZ25lZCBsb25nKTsKK1NPQVBfRk1BQzEgc29hcF93Y2hhciBTT0FQX0ZNQUMyIHNvYXBfZ2V0dXRmOChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0YmFzZTY0KHN0cnVjdCBzb2FwKiwgY29uc3QgdW5zaWduZWQgY2hhciosIGludCk7CitTT0FQX0ZNQUMxIHVuc2lnbmVkIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9nZXRiYXNlNjQoc3RydWN0IHNvYXAqLCBpbnQqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3B1dGhleChzdHJ1Y3Qgc29hcCosIGNvbnN0IHVuc2lnbmVkIGNoYXIqLCBpbnQpOworU09BUF9GTUFDMSB1bnNpZ25lZCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfZ2V0aGV4KHN0cnVjdCBzb2FwKiwgaW50Kik7CisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF94b3BfZm9yd2FyZChzdHJ1Y3Qgc29hcCosIHVuc2lnbmVkIGNoYXIqKiwgaW50KiwgY2hhcioqLCBjaGFyKiosIGNoYXIqKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZGltZV9mb3J3YXJkKHN0cnVjdCBzb2FwKiwgdW5zaWduZWQgY2hhcioqLCBpbnQqLCBjaGFyKiosIGNoYXIqKiwgY2hhcioqKTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3BvaW50ZXJfbG9va3VwX2lkKHN0cnVjdCBzb2FwKiwgdm9pZCAqcCwgaW50IHQsIHN0cnVjdCBzb2FwX3BsaXN0KiopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3BvaW50ZXJfbG9va3VwKHN0cnVjdCBzb2FwKiwgY29uc3Qgdm9pZCAqcCwgaW50IHQsIHN0cnVjdCBzb2FwX3BsaXN0KiopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3BvaW50ZXJfZW50ZXIoc3RydWN0IHNvYXAqLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGludCB0LCBzdHJ1Y3Qgc29hcF9wbGlzdCoqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9hcnJheV9wb2ludGVyX2xvb2t1cChzdHJ1Y3Qgc29hcCosIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgbiwgaW50IHQsIHN0cnVjdCBzb2FwX3BsaXN0KiopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VtYmVkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGNvbnN0IGNoYXIgKnRhZywgaW50IHR5cGUpOworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcF9pbGlzdCogU09BUF9GTUFDMiBzb2FwX2xvb2t1cChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgc3RydWN0IHNvYXBfaWxpc3QqIFNPQVBfRk1BQzIgc29hcF9lbnRlcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9yZXNvbHZlKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2VtYmVkZGVkKHN0cnVjdCBzb2FwKiwgY29uc3Qgdm9pZCAqcCwgaW50IHQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3JlZmVyZW5jZShzdHJ1Y3Qgc29hcCosIGNvbnN0IHZvaWQgKnAsIGludCB0KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9hcnJheV9yZWZlcmVuY2Uoc3RydWN0IHNvYXAqLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGludCB0KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbWJlZGRlZF9pZChzdHJ1Y3Qgc29hcCosIGludCBpZCwgY29uc3Qgdm9pZCAqcCwgaW50IHQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2lzX2VtYmVkZGVkKHN0cnVjdCBzb2FwKiwgc3RydWN0IHNvYXBfcGxpc3QqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9pc19zaW5nbGUoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9wbGlzdCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXRfZW1iZWRkZWQoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9wbGlzdCopOworI2VuZGlmCisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9iZWdpbl9jb3VudChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VuZF9jb3VudChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2JlZ2luX3NlbmQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbmRfc2VuZChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwKiBTT0FQX0ZNQUMyIHNvYXBfY29kZShjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCosIGNvbnN0IGNoYXIgKnN0cik7CitTT0FQX0ZNQUMxIGxvbmcgU09BUF9GTUFDMiBzb2FwX2ludF9jb2RlKGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwKiwgY29uc3QgY2hhciAqc3RyLCBsb25nIG90aGVyKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX3N0cl9jb2RlKGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwKiwgbG9uZyBjb2RlKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2dldGxpbmUoc3RydWN0IHNvYXAqLCBjaGFyKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9iZWdpbl9yZWN2KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZW5kX3JlY3Yoc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMSB2b2lkKiBTT0FQX0ZNQUMyIHNvYXBfbWFsbG9jKHN0cnVjdCBzb2FwKiwgc2l6ZV90KTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfZGVhbGxvYyhzdHJ1Y3Qgc29hcCosIHZvaWQqKTsKK1NPQVBfRk1BQzEgc3RydWN0IHNvYXBfY2xpc3QgKiBTT0FQX0ZNQUMyIHNvYXBfbGluayhzdHJ1Y3Qgc29hcCosIHZvaWQqLCBpbnQsIGludCwgdm9pZCAoKmZkZWxldGUpKHN0cnVjdCBzb2FwX2NsaXN0KikpOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF91bmxpbmsoc3RydWN0IHNvYXAqLCBjb25zdCB2b2lkKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2ZyZWUoc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMSB2b2lkKiBTT0FQX0ZNQUMyIHNvYXBfdHJhY2tfbWFsbG9jKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgc2l6ZV90KTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfdHJhY2tfZnJlZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIHZvaWQqKTsKKworI2lmbmRlZiBXSVRIX05PSURSRUYKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9sb29rdXBfdHlwZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKmlkKTsKK1NPQVBfRk1BQzEgdm9pZCogU09BUF9GTUFDMiBzb2FwX2lkX2xvb2t1cChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKmlkLCB2b2lkICoqcCwgaW50IHQsIHNpemVfdCBuLCB1bnNpZ25lZCBpbnQgayk7CitTT0FQX0ZNQUMxIHZvaWQqIFNPQVBfRk1BQzIgc29hcF9pZF9mb3J3YXJkKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqaWQsIHZvaWQgKnAsIHNpemVfdCBsZW4sIGludCBzdCwgaW50IHR0LCBzaXplX3QgbiwgdW5zaWduZWQgaW50IGssIHZvaWQoKmZjb3B5KShzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgc2l6ZV90LCBjb25zdCB2b2lkKiwgc2l6ZV90KSk7CisjZW5kaWYKK1NPQVBfRk1BQzEgdm9pZCogU09BUF9GTUFDMiBzb2FwX2lkX2VudGVyKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqaWQsIHZvaWQgKnAsIGludCB0LCBzaXplX3QgbiwgdW5zaWduZWQgaW50IGssIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmFycmF5VHlwZSwgdm9pZCAqKCpmaW5zdGFudGlhdGUpKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfZmNvcHkoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdCwgaW50IHR0LCB2b2lkICpwLCBzaXplX3QsIGNvbnN0IHZvaWQgKnEsIHNpemVfdCBuKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NpemUoY29uc3QgaW50ICosIGludCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZ2V0b2Zmc2V0cyhjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBpbnQgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRzaXplKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQgKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZ2V0c2l6ZXMoY29uc3QgY2hhciAqLCBpbnQgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRwb3NpdGlvbihjb25zdCBjaGFyICosIGludCAqKTsKKworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfcHV0c2l6ZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgY2hhciogU09BUF9GTUFDMiBzb2FwX3B1dHNpemVzb2Zmc2V0cyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBpbnQpOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfcHV0c2l6ZXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBpbnQpOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfcHV0b2Zmc2V0KHN0cnVjdCBzb2FwKiwgaW50KTsKK1NPQVBfRk1BQzEgY2hhciogU09BUF9GTUFDMiBzb2FwX3B1dG9mZnNldHMoc3RydWN0IHNvYXAqLCBjb25zdCBpbnQgKiwgaW50KTsKKyAKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9jbG9zZXNvY2soc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcCAqU09BUF9GTUFDMiBzb2FwX25ldyh2b2lkKTsKK1NPQVBfRk1BQzEgc3RydWN0IHNvYXAgKlNPQVBfRk1BQzIgc29hcF9uZXcxKHNvYXBfbW9kZSk7CitTT0FQX0ZNQUMxIHN0cnVjdCBzb2FwICpTT0FQX0ZNQUMyIHNvYXBfbmV3Mihzb2FwX21vZGUsIHNvYXBfbW9kZSk7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2RlbChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcCAqU09BUF9GTUFDMiBzb2FwX2NvcHkoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgc3RydWN0IHNvYXAgKlNPQVBfRk1BQzIgc29hcF9jb3B5X2NvbnRleHQoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9pbml0KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2luaXQxKHN0cnVjdCBzb2FwKiwgc29hcF9tb2RlKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfaW5pdDIoc3RydWN0IHNvYXAqLCBzb2FwX21vZGUsIHNvYXBfbW9kZSk7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2RvbmUoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfY2xlYW51cChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9iZWdpbihzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9lbmQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfZGVsZXRlKHN0cnVjdCBzb2FwKiwgdm9pZCopOworCisjaWZkZWYgU09BUF9ERUJVRworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXRfcmVjdl9sb2dmaWxlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXRfc2VudF9sb2dmaWxlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXRfdGVzdF9sb2dmaWxlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9jbG9zZV9sb2dmaWxlcyhzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9vcGVuX2xvZ2ZpbGUoc3RydWN0IHNvYXAqLCBpbnQpOworI2VuZGlmCisKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX3Rva2VuKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF92YWx1ZShzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfbWF0Y2hfdGFnKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfbWF0Y2hfYXJyYXkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbGVtZW50KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnR5cGUpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2FycmF5X2JlZ2luX291dChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICpvZmZzZXQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfcmVmKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGludCBocmVmKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbGVtZW50X2hyZWYoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgY2hhciAqcmVmLCBjb25zdCBjaGFyICp2YWwpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfbnVsbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICp0eXBlKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbGVtZW50X2lkKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgZCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfcmVzdWx0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbGVtZW50X2VuZF9vdXQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZyk7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9hdHRyaWJ1dGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZWxlbWVudF9iZWdpbl9pbihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IG5pbGxhYmxlKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfZW5kX2luKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3BlZWtfZWxlbWVudChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3JldHJ5KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3JldmVydChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9zdHJkdXAoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIgKiBTT0FQX0ZNQUMyIHNvYXBfc3Ryc2VhcmNoKGNvbnN0IGNoYXIgKmJpZywgY29uc3QgY2hhciAqbGl0dGxlKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3N0cmluZ19vdXQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICpzLCBpbnQgZmxhZyk7CitTT0FQX0ZNQUMxIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9zdHJpbmdfaW4oc3RydWN0IHNvYXAqLCBpbnQsIGxvbmcsIGxvbmcpOworCisjaWZuZGVmIFdJVEhfTEVBTkVSCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfd3N0cmluZ19vdXQoc3RydWN0IHNvYXAqLCBjb25zdCB3Y2hhcl90ICpzLCBpbnQgZmxhZyk7CitTT0FQX0ZNQUMxIHdjaGFyX3QqIFNPQVBfRk1BQzIgc29hcF93c3RyaW5nX2luKHN0cnVjdCBzb2FwKiwgaW50LCBsb25nLCBsb25nKTsKKyNlbmRpZgorCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfbWF0Y2hfbmFtZXNwYWNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyKiwgaW50IG4xLCBpbnQgbjIpOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2V0X25hbWVzcGFjZXMoc3RydWN0IHNvYXAqLCBzdHJ1Y3QgTmFtZXNwYWNlKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NldF9sb2NhbF9uYW1lc3BhY2VzKHN0cnVjdCBzb2FwKik7CisKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfcG9wX25hbWVzcGFjZShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3B1c2hfbmFtZXNwYWNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9jdXJyZW50X25hbWVzcGFjZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3N0b3JlX2xhYihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2FwcGVuZF9sYWIoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc2l6ZV90KTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX25ld19ibG9jayhzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSB2b2lkKiBTT0FQX0ZNQUMyIHNvYXBfcHVzaF9ibG9jayhzdHJ1Y3Qgc29hcCosIHNpemVfdCk7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3BvcF9ibG9jayhzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBzaXplX3QgU09BUF9GTUFDMiBzb2FwX3NpemVfYmxvY2soc3RydWN0IHNvYXAqLCBzaXplX3QpOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfZmlyc3RfYmxvY2soc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgY2hhciogU09BUF9GTUFDMiBzb2FwX25leHRfYmxvY2soc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgc2l6ZV90IFNPQVBfRk1BQzIgc29hcF9ibG9ja19zaXplKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9zYXZlX2Jsb2NrKHN0cnVjdCBzb2FwKiwgY2hhciosIGludCk7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2VuZF9ibG9jayhzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZW52ZWxvcGVfYmVnaW5fb3V0KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBzb2FwX2VudmVsb3BlX2VuZF9vdXQoc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VudmVsb3BlX2JlZ2luX2luKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZW52ZWxvcGVfZW5kX2luKHN0cnVjdCBzb2FwKik7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9ib2R5X2JlZ2luX291dChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2JvZHlfZW5kX291dChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfYm9keV9iZWdpbl9pbihzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2JvZHlfZW5kX2luKHN0cnVjdCBzb2FwKik7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9yZWN2X2hlYWRlcihzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcmVzcG9uc2Uoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2VuZF9lbXB0eV9yZXNwb25zZShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3JlY3ZfZW1wdHlfcmVzcG9uc2Uoc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NlbmRfZmF1bHQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9yZWN2X2ZhdWx0KHN0cnVjdCBzb2FwKik7CisKKyNpZm5kZWYgV0lUSF9OT1NURExJQgorU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9wcmludF9mYXVsdChzdHJ1Y3Qgc29hcCosIEZJTEUqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfcHJpbnRfZmF1bHRfbG9jYXRpb24oc3RydWN0IHNvYXAqLCBGSUxFKik7CisjZW5kaWYKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MyYnl0ZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjaGFyKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfczJzaG9ydChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaG9ydCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MyaW50KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MybG9uZyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBsb25nKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfczJMT05HNjQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgTE9ORzY0Kik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfczJmbG9hdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBmbG9hdCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MyZG91YmxlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGRvdWJsZSopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MydW5zaWduZWRCeXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVuc2lnbmVkIGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zMnVuc2lnbmVkU2hvcnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdW5zaWduZWQgc2hvcnQqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zMnVuc2lnbmVkSW50KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVuc2lnbmVkIGludCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MydW5zaWduZWRMb25nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVuc2lnbmVkIGxvbmcqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zMlVMT05HNjQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgVUxPTkc2NCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3Myc3RyaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNoYXIqKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfczJRTmFtZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjaGFyKiopOworCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3Myd2NoYXIoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgd2NoYXJfdCoqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zMmRhdGVUaW1lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHRpbWVfdCopOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfczJiYXNlNjQoc3RydWN0IHNvYXAqLCBjb25zdCB1bnNpZ25lZCBjaGFyKiwgY2hhciosIGludCk7CitTT0FQX0ZNQUMxIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9zMmhleChzdHJ1Y3Qgc29hcCosIGNvbnN0IHVuc2lnbmVkIGNoYXIqLCBjaGFyKiwgaW50KTsKKyNlbmRpZgorCitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9ieXRlMnMoc3RydWN0IHNvYXAqLCBjaGFyKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX3Nob3J0MnMoc3RydWN0IHNvYXAqLCBzaG9ydCk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9pbnQycyhzdHJ1Y3Qgc29hcCosIGludCk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9sb25nMnMoc3RydWN0IHNvYXAqLCBsb25nKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX0xPTkc2NDJzKHN0cnVjdCBzb2FwKiwgTE9ORzY0KTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX2Zsb2F0MnMoc3RydWN0IHNvYXAqLCBmbG9hdCk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9kb3VibGUycyhzdHJ1Y3Qgc29hcCosIGRvdWJsZSk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF91bnNpZ25lZEJ5dGUycyhzdHJ1Y3Qgc29hcCosIHVuc2lnbmVkIGNoYXIpOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfdW5zaWduZWRTaG9ydDJzKHN0cnVjdCBzb2FwKiwgdW5zaWduZWQgc2hvcnQpOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfdW5zaWduZWRJbnQycyhzdHJ1Y3Qgc29hcCosIHVuc2lnbmVkIGludCk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF91bnNpZ25lZExvbmcycyhzdHJ1Y3Qgc29hcCosIHVuc2lnbmVkIGxvbmcpOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfVUxPTkc2NDJzKHN0cnVjdCBzb2FwKiwgVUxPTkc2NCk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9RTmFtZTJzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfd2NoYXIycyhzdHJ1Y3Qgc29hcCosIGNvbnN0IHdjaGFyX3QqKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX2RhdGVUaW1lMnMoc3RydWN0IHNvYXAqLCB0aW1lX3QpOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfYmFzZTY0MnMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY2hhciosIHNpemVfdCwgaW50Kik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9oZXgycyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjaGFyKiwgc2l6ZV90LCBpbnQqKTsKKyNlbmRpZgorCisKK1NPQVBfRk1BQzEgaW50KiBTT0FQX0ZNQUMyIHNvYXBfaW5pbnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfaW5ieXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBjaGFyICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGxvbmcqIFNPQVBfRk1BQzIgc29hcF9pbmxvbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGxvbmcgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgTE9ORzY0KiBTT0FQX0ZNQUMyIHNvYXBfaW5MT05HNjQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIExPTkc2NCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBzaG9ydCogU09BUF9GTUFDMiBzb2FwX2luc2hvcnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHNob3J0ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGZsb2F0KiBTT0FQX0ZNQUMyIHNvYXBfaW5mbG9hdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgZmxvYXQgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgZG91YmxlKiBTT0FQX0ZNQUMyIHNvYXBfaW5kb3VibGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGRvdWJsZSAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSB1bnNpZ25lZCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfaW51bnNpZ25lZEJ5dGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIGNoYXIgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgdW5zaWduZWQgc2hvcnQqIFNPQVBfRk1BQzIgc29hcF9pbnVuc2lnbmVkU2hvcnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIHNob3J0ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIHVuc2lnbmVkIGludCogU09BUF9GTUFDMiBzb2FwX2ludW5zaWduZWRJbnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIGludCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSB1bnNpZ25lZCBsb25nKiBTT0FQX0ZNQUMyIHNvYXBfaW51bnNpZ25lZExvbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIGxvbmcgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgVUxPTkc2NCogU09BUF9GTUFDMiBzb2FwX2luVUxPTkc2NChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgVUxPTkc2NCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBjaGFyKiogU09BUF9GTUFDMiBzb2FwX2luc3RyaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBjaGFyICoqcCwgY29uc3QgY2hhciAqLCBpbnQsIGludCwgbG9uZywgbG9uZyk7CitTT0FQX0ZNQUMxIGNoYXIqKiBTT0FQX0ZNQUMyIHNvYXBfaW5saXRlcmFsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBjaGFyICoqcCk7CisKKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxIHRpbWVfdCogU09BUF9GTUFDMiBzb2FwX2luZGF0ZVRpbWUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHRpbWVfdCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK1NPQVBfRk1BQzEgd2NoYXJfdCoqIFNPQVBfRk1BQzIgc29hcF9pbndzdHJpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHdjaGFyX3QgKipwLCBjb25zdCBjaGFyICosIGludCwgbG9uZywgbG9uZyk7CitTT0FQX0ZNQUMxIHdjaGFyX3QqKiBTT0FQX0ZNQUMyIHNvYXBfaW53bGl0ZXJhbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgd2NoYXJfdCAqKnApOworI2VuZGlmCisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRieXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRzaG9ydChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzaG9ydCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dGludChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBpbnQgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRsb25nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGxvbmcgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRMT05HNjQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgTE9ORzY0ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0ZmxvYXQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgZmxvYXQgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRkb3VibGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgZG91YmxlICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0dW5zaWduZWRCeXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXR1bnNpZ25lZFNob3J0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIHNob3J0ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0dW5zaWduZWRJbnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgdW5zaWduZWQgaW50ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0dW5zaWduZWRMb25nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRVTE9ORzY0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IFVMT05HNjQgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRzdHJpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY2hhciAqY29uc3QqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dGxpdGVyYWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGNoYXIgKmNvbnN0KnApOworCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dGRhdGVUaW1lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHRpbWVfdCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXR3c3RyaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIHdjaGFyX3QgKmNvbnN0KnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXR3bGl0ZXJhbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgd2NoYXJfdCAqY29uc3QqcCk7CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU5FUgorU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2F0dGFjaG1lbnQoc3RydWN0IHNvYXAgKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgdm9pZCosIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBjaGFyKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9tb3ZlKHN0cnVjdCBzb2FwKiwgbG9uZyk7CitTT0FQX0ZNQUMxIHNpemVfdCBTT0FQX0ZNQUMyIHNvYXBfdGVsbChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfZGltZV9vcHRpb24oc3RydWN0IHNvYXAqLCB1bnNpZ25lZCBzaG9ydCwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2dldGRpbWVoZHIoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRkaW1lKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0ZGltZWhkcihzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3B1dGRpbWUoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRtaW1laGRyKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZ2V0bWltZShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3B1dG1pbWVoZHIoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9wdXRtaW1lKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NldF9kaW1lKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NldF9taW1lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqYm91bmRhcnksIGNvbnN0IGNoYXIgKnN0YXJ0KTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfY2xyX2RpbWUoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfY2xyX21pbWUoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZXRfZGltZV9hdHRhY2htZW50KHN0cnVjdCBzb2FwKiwgY2hhciAqcHRyLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqaWQsIHVuc2lnbmVkIHNob3J0IG9wdHlwZSwgY29uc3QgY2hhciAqb3B0aW9uKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZXRfbWltZV9hdHRhY2htZW50KHN0cnVjdCBzb2FwKiwgY2hhciAqcHRyLCBzaXplX3Qgc2l6ZSwgZW51bSBzb2FwX21pbWVfZW5jb2RpbmcgZW5jb2RpbmcsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICpsb2NhdGlvbiwgY29uc3QgY2hhciAqZGVzY3JpcHRpb24pOworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqIFNPQVBfRk1BQzIgc29hcF9uZXh0X211bHRpcGFydChzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKTsKKyNlbmRpZgorCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcmVnaXN0ZXJfcGx1Z2luX2FyZyhzdHJ1Y3Qgc29hcCosIGludCAoKmZjcmVhdGUpKHN0cnVjdCBzb2FwKiwgc3RydWN0IHNvYXBfcGx1Z2luKiwgdm9pZCopLCB2b2lkKik7CitTT0FQX0ZNQUMxIHZvaWQqIFNPQVBfRk1BQzIgc29hcF9sb29rdXBfcGx1Z2luKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9hdHRyX3ZhbHVlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgZmxhZyk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2V0X2F0dHIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfY2xyX2F0dHIoc3RydWN0IHNvYXAgKnNvYXApOworCisjaWZkZWYgV0lUSF9DT09LSUVTCitTT0FQX0ZNQUMxIHNpemVfdCBTT0FQX0ZNQUMyIHNvYXBfZW5jb2RlX2Nvb2tpZShjb25zdCBjaGFyKiwgY2hhciosIHNpemVfdCk7CitTT0FQX0ZNQUMxIGV4dGVybiBzdHJ1Y3Qgc29hcF9jb29raWUqIFNPQVBfRk1BQzIgc29hcF9zZXRfY29va2llKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBleHRlcm4gc3RydWN0IHNvYXBfY29va2llKiBTT0FQX0ZNQUMyIHNvYXBfY29va2llKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGV4dGVybiBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfY29va2llX3ZhbHVlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGV4dGVybiBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfZW52X2Nvb2tpZV92YWx1ZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBleHRlcm4gbG9uZyBTT0FQX0ZNQUMyIHNvYXBfY29va2llX2V4cGlyZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBleHRlcm4gaW50IFNPQVBfRk1BQzIgc29hcF9zZXRfY29va2llX2V4cGlyZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBsb25nLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBleHRlcm4gaW50IFNPQVBfRk1BQzIgc29hcF9zZXRfY29va2llX3Nlc3Npb24oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgZXh0ZXJuIGludCBTT0FQX0ZNQUMyIHNvYXBfY2xyX2Nvb2tpZV9zZXNzaW9uKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGV4dGVybiB2b2lkIFNPQVBfRk1BQzIgc29hcF9jbHJfY29va2llKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGV4dGVybiBpbnQgU09BUF9GTUFDMiBzb2FwX2dldGVudl9jb29raWVzKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGV4dGVybiBzdHJ1Y3Qgc29hcF9jb29raWUqIFNPQVBfRk1BQzIgc29hcF9jb3B5X2Nvb2tpZXMoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgZXh0ZXJuIHZvaWQgU09BUF9GTUFDMiBzb2FwX2ZyZWVfY29va2llcyhzdHJ1Y3Qgc29hcCopOworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBleHRlcm4gIkMiICovCisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvY2svTWFrZWZpbGUgYi9zYW1wbGVzL2NrL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MzdkNjMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2NrL01ha2VmaWxlCkBAIC0wLDAgKzEsMjMgQEAKK0dTT0FQPS4uLy4uL3NvYXBjcHAyCitTT0FQSD0uLi8uLi9zdGRzb2FwMi5oCitTT0FQQz0uLi8uLi9zdGRzb2FwMi5jCitTT0FQQ1BQPS4uLy4uL3N0ZHNvYXAyLmNwcAorQ0M9Z2NjCitDUFA9ZysrCitMSUJTPQorQ09GTEFHUz0tTzIKK0NXRkxBR1M9LVdhbGwKK0NJRkxBR1M9LUkuLi8uLgorQ01GTEFHUz0KK0NGTEFHUz0gJChDV0ZMQUdTKSAkKENPRkxBR1MpICQoQ0lGTEFHUykgJChDTUZMQUdTKQorYWxsOgkJY2tjbGllbnQgY2tzZXJ2ZXIKK2NrY2xpZW50Ogljay5oIGNrY2xpZW50LmNwcCAkKFNPQVBIKSAkKFNPQVBDUFApCisJCSQoR1NPQVApIGNrLmgKKwkJJChDUFApIC1EV0lUSF9DT09LSUVTICQoQ0ZMQUdTKSAtbyBja2NsaWVudCBja2NsaWVudC5jcHAgc29hcEMuY3BwIHNvYXBDbGllbnQuY3BwICQoU09BUENQUCkgJChMSUJTKQorY2tzZXJ2ZXI6CWNrLmggY2tzZXJ2ZXIuY3BwICQoU09BUEgpICQoU09BUENQUCkKKwkJJChHU09BUCkgY2suaAorCQkkKENQUCkgLURXSVRIX0NPT0tJRVMgJChDRkxBR1MpIC1vIGNrc2VydmVyIGNrc2VydmVyLmNwcCBzb2FwQy5jcHAgc29hcFNlcnZlci5jcHAgJChTT0FQQ1BQKSAkKExJQlMpCitjbGVhbjoKKwkJcm0gLWYgKi5vIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaAorZGlzdGNsZWFuOgorCQlybSAtZiAqLm8gKi53c2RsICoueHNkICoueG1sICoubnNtYXAgKi5sb2cgc29hcEguaCBzb2FwU3R1Yi5oIHNvYXBDLmNwcCBzb2FwQy5jIHNvYXBDbGllbnQuY3BwIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmNwcCBzb2FwU2VydmVyLmMgc29hcCpQcm94eS5oIGNrY2xpZW50IGNrc2VydmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL2NrL01ha2VmaWxlU29sYXJpcyBiL3NhbXBsZXMvY2svTWFrZWZpbGVTb2xhcmlzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3Y2NkOGIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2NrL01ha2VmaWxlU29sYXJpcwpAQCAtMCwwICsxLDIzIEBACitHU09BUD0uLi8uLi9zb2FwY3BwMgorU09BUEg9Li4vLi4vc3Rkc29hcDIuaAorU09BUEM9Li4vLi4vc3Rkc29hcDIuYworU09BUENQUD0uLi8uLi9zdGRzb2FwMi5jcHAKK0NDPWdjYworQ1BQPWcrKworTElCUz0tbHhuZXQgLWxuc2wgLWxzb2NrZXQKK0NPRkxBR1M9LU8yCitDV0ZMQUdTPS1XYWxsCitDSUZMQUdTPS1JLi4vLi4KK0NNRkxBR1M9CitDRkxBR1M9ICQoQ1dGTEFHUykgJChDT0ZMQUdTKSAkKENJRkxBR1MpICQoQ01GTEFHUykKK2FsbDoJCWNrY2xpZW50IGNrc2VydmVyCitja2NsaWVudDoJY2suaCBja2NsaWVudC5jcHAgJChTT0FQSCkgJChTT0FQQ1BQKQorCQkkKEdTT0FQKSBjay5oCisJCSQoQ1BQKSAtRFdJVEhfQ09PS0lFUyAkKENGTEFHUykgLW8gY2tjbGllbnQgY2tjbGllbnQuY3BwIHNvYXBDLmNwcCBzb2FwQ2xpZW50LmNwcCAkKFNPQVBDUFApICQoTElCUykKK2Nrc2VydmVyOgljay5oIGNrc2VydmVyLmNwcCAkKFNPQVBIKSAkKFNPQVBDUFApCisJCSQoR1NPQVApIGNrLmgKKwkJJChDUFApIC1EV0lUSF9DT09LSUVTICQoQ0ZMQUdTKSAtbyBja3NlcnZlciBja3NlcnZlci5jcHAgc29hcEMuY3BwIHNvYXBTZXJ2ZXIuY3BwICQoU09BUENQUCkgJChMSUJTKQorY2xlYW46CisJCXJtIC1mICoubyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5LmgKK2Rpc3RjbGVhbjoKKwkJcm0gLWYgKi5vICoud3NkbCAqLnhzZCAqLnhtbCAqLm5zbWFwICoubG9nIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaCBja2NsaWVudCBja3NlcnZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9jay9jay5oIGIvc2FtcGxlcy9jay9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NTRjMDQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2NrL2NrLmgKQEAgLTAsMCArMSw4IEBACisvL2dzb2FwIGNrIHNlcnZpY2UgbmFtZToJY2sKKy8vZ3NvYXAgY2sgc2VydmljZSBzdHlsZToJcnBjCisvL2dzb2FwIGNrIHNlcnZpY2UgZW5jb2Rpbmc6CWVuY29kZWQKKy8vZ3NvYXAgY2sgc2VydmljZSBsb2NhdGlvbjoJaHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL2NrLmNnaQorLy9nc29hcCBjayBzZXJ2aWNlIG5hbWVzcGFjZToJaHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL2NrLndzZGwKKworLy9nc29hcCBjayBzY2hlbWEgIG5hbWVzcGFjZToJdXJuOmNrCitpbnQgY2tfX2RlbW8oY2hhciAqKnIpOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9jay9ja2NsaWVudC5jcHAgYi9zYW1wbGVzL2NrL2NrY2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmY2YmU5Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9jay9ja2NsaWVudC5jcHAKQEAgLTAsMCArMSw4MyBAQAorI2luY2x1ZGUgInNvYXBILmgiCisjaW5jbHVkZSAiY2subnNtYXAiCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JRXhhbXBsZSBjb29raWUgY2xpZW50CisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIGNoYXIgKmNrc2VydmVyID0gImh0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9jay5jZ2kiOworCisvLyBUbyBhY2Nlc3MgYSBzdGFuZC1hbG9uZSBzZXJ2ZXIgb24gYSBwb3J0LCB1c2U6CisvLyBjaGFyIGNrc2VydmVyW10gPSAiSVA6UE9SVCI7CisvLyBjaGFyIGNrc2VydmVyW10gPSAiaHR0cDovL0lQOlBPUlQiOwkvLyBpbmNsdWRlIEhUVFAgaGVhZGVyIGluIHJlcXVlc3QKKy8vIGNoYXIgY2tzZXJ2ZXJbXSA9ICJodHRwOi8vbGlucHJvZzEuY3MuZnN1LmVkdToxODA4MSI7CisvLyBjaGFyIGNrc2VydmVyW10gPSAiIjsgLy8gdXNlIEkvTyByZWRpcmVjdAorLy8gY2hhciBja3NlcnZlcltdID0gImh0dHA6Ly8iOyAvLyB1c2UgSS9PIHJlZGlyZWN0IChpbmNsdWRlcyBIVFRQIGhlYWRlcnMpCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sgY2hhciAqcjsKKyAgc3RydWN0IHNvYXAgc29hcDsKKyAgaWYgKGFyZ2MgPj0gMikKKyAgICBja3NlcnZlciA9IGFyZ3ZbMV07CisgIHNvYXBfaW5pdCgmc29hcCk7CisKKyAgLy8gZ1NPQVAncyBjb29raWUgaGFuZGxpbmcgaXMgZnVsbHkgYXV0b21hdGljIGF0IHRoZSBjbGllbnQtc2lkZS4KKyAgLy8gQSBkYXRhYmFzZSBvZiBjb29raWVzIGlzIGtlcHQgYW5kIHJldHVybmVkIHRvIHRoZSBhcHByb3ByaWF0ZSBzZXJ2ZXJzLgorICAvLyBJbiB0aGlzIGRlbW8sIHRoZSB2YWx1ZSAoaW50KSBvZiB0aGUgKGludmlzaWJsZSkgY29va2llIGlzIHJldHVybmVkIGFzCisgIC8vIGFuIG91dHB1dCBwYXJhbWV0ZXIgYnkgdGhlIHNlcnZpY2UgdG8gZGVtb25zdHJhdGUgdGhhdCBlYWNoIGNhbGwgdXNlcworICAvLyBhIHVuaXF1ZSBhbmQgdXBkYXRlZCBjb29raWUuIENvb2tpZXMgYXJlIG5vdCBhdXRvbWF0aWNhbGx5IHNhdmVkIHRvIGEKKyAgLy8gZmlsZSBieSB0aGUgY2xpZW50LiBTbyB0aGUgaW50ZXJuYWwgY29va2llIGRhdGFiYXNlIGlzIGRpc2NhcmRlZCB3aGVuCisgIC8vIHRoZSBwcm9ncmFtIHRlcm1pbmF0ZXMuCisKKyAgLy8gVG8gYXZvaWQgImNvb2tpZSBzdG9ybXMiIGNhdXNlZCBieSBtYWxpY2lvdXMgc2VydmVycyB0aGF0IHJldHVybiBhbiAKKyAgLy8gdW5yZWFzb25hYmxlIGFtb3VudCBvZiBjb29raWVzLCBnU09BUCBjbGllbnRzL3NlcnZlcnMgYXJlIHJlc3RyaWN0ZWQgdG8KKyAgLy8gYSBkYXRhYmFzZSBzaXplIHRoYXQgdGhlIHVzZXIgY2FuIGxpbWl0ICgzMiBjb29raWVzIGJ5IGRlZmF1bHQpOgorICAKKyAgc29hcC5jb29raWVfbWF4ID0gMTA7CisKKyAgLy8gSW4gY2FzZSBhbGwgdGhyZWUgY2FsbHMgYmVsb3cgcmV0dXJuIHRoZSBzYW1lIGNvb2tpZSB2YWx1ZSAxLCB0aGUgc2VydmljZQorICAvLyAoY2suY2dpKSBpcyB1bmFibGUgdG8gcmV0dXJuIGNvb2tpZXMgKGUuZy4gYmVjYXVzZSB0aGUgV2ViIHNlcnZlciBkb2VzCisgIC8vIG5vdCBhbGxvdyBDR0kgYXBwbGljYXRpb25zIHRvIGhhbmRsZSBjb29raWVzIHdoaWNoIHRoZSB1c2VyIG5lZWQgdG8gZml4CisgIC8vIGJ5IHJlY29uZmlndXJhdGlvbiBhbmQgcmVzdGFydCBvZiB0aGUgV2ViIHNlcnZlcikuIE9yIHRoZQorICAvLyBzb2FwLmNvb2tpZV9kb21haW4gdmFsdWUgaXMgbm90IHNldCBpbiB0aGUgY2tzZXJ2ZXIgY29kZSB0byB0aGUgaG9zdCBvbgorICAvLyB3aGljaCB0aGUgc2VydmljZSBydW5zIC4KKworICAvLyBGaXJzdCBjYWxsIChubyBjb29raWVzIHJldHVybmVkIHRvIHNlcnZpY2UsIHNlcnZpY2Ugd2lsbCByZXR1cm4gYSBjb29raWUpOgorICBpZiAoc29hcF9jYWxsX2NrX19kZW1vKCZzb2FwLCBja3NlcnZlciwgTlVMTCwgJnIpKQorICB7IHNvYXBfcHJpbnRfZmF1bHQoJnNvYXAsIHN0ZGVycik7CisgICAgc29hcF9wcmludF9mYXVsdF9sb2NhdGlvbigmc29hcCwgc3RkZXJyKTsKKyAgICBleGl0KC0xKTsKKyAgfQorICBwcmludGYoIlRoZSBzZXJ2ZXIgcmVzcG9uZGVkIHdpdGg6ICVzXG4iLCByKTsKKworICAvLyBTZWNvbmQgY2FsbCAocmV0dXJuIGNvb2tpZSB0byBzZXJ2aWNlIGluZGljYXRpbmcgY29udGludWF0aW9uIG9mIHNlc3Npb24pOgorICBpZiAoc29hcF9jYWxsX2NrX19kZW1vKCZzb2FwLCBja3NlcnZlciwgTlVMTCwgJnIpKQorICB7IHNvYXBfcHJpbnRfZmF1bHQoJnNvYXAsIHN0ZGVycik7CisgICAgc29hcF9wcmludF9mYXVsdF9sb2NhdGlvbigmc29hcCwgc3RkZXJyKTsKKyAgICBleGl0KC0xKTsKKyAgfQorICBwcmludGYoIlRoZSBzZXJ2ZXIgcmVzcG9uZGVkIHdpdGg6ICVzXG4iLCByKTsKKworICAvLyBUaGlyZCBjYWxsIChyZXR1cm4gY29va2llIHRvIHNlcnZpY2UgaW5kaWNhdGluZyBjb250aW51YXRpb24gb2Ygc2Vzc2lvbik6CisgIGlmIChzb2FwX2NhbGxfY2tfX2RlbW8oJnNvYXAsIGNrc2VydmVyLCBOVUxMLCAmcikpCisgIHsgc29hcF9wcmludF9mYXVsdCgmc29hcCwgc3RkZXJyKTsKKyAgICBzb2FwX3ByaW50X2ZhdWx0X2xvY2F0aW9uKCZzb2FwLCBzdGRlcnIpOworICAgIGV4aXQoLTEpOworICB9CisgIHByaW50ZigiVGhlIHNlcnZlciByZXNwb25kZWQgd2l0aDogJXNcbiIsIHIpOworCisgIC8vIEZvdXJ0aCBjYWxsIChsZXQgY29va2llIGV4cGlyZSkKKyAgcHJpbnRmKCJXYWl0aW5nIDYgc2Vjb25kcyB0byBsZXQgY29va2llIGV4cGlyZS4uLlxuIik7CisgIHNsZWVwKDYpOyAvLyB3YWl0IHRvIGxldCBjb29raWUgZXhwaXJlCisgIGlmIChzb2FwX2NhbGxfY2tfX2RlbW8oJnNvYXAsIGNrc2VydmVyLCBOVUxMLCAmcikpCisgIHsgc29hcF9wcmludF9mYXVsdCgmc29hcCwgc3RkZXJyKTsKKyAgICBzb2FwX3ByaW50X2ZhdWx0X2xvY2F0aW9uKCZzb2FwLCBzdGRlcnIpOworICAgIGV4aXQoLTEpOworICB9CisgIHByaW50ZigiVGhlIHNlcnZlciByZXNwb25kZWQgd2l0aDogJXNcbiIsIHIpOworCisgIHNvYXBfZW5kKCZzb2FwKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL2NrL2Nrc2VydmVyLmNwcCBiL3NhbXBsZXMvY2svY2tzZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYmViOGQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2NrL2Nrc2VydmVyLmNwcApAQCAtMCwwICsxLDcyIEBACisjaW5jbHVkZSAic29hcEguaCIKKyNpbmNsdWRlICJjay5uc21hcCIKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwlFeGFtcGxlIGNvb2tpZSBzZXJ2ZXIKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBJbnN0YWxsIGFzIENHSSBhcHBsaWNhdGlvbiAoY2suY2dpKS4KKy8vIEFsdGVybmF0aXZlbHksIHJ1biBmcm9tIGNvbW1hbmQgbGluZSB0byBzdGFydCBhIHN0YW5kLWFsb25lIHNlcnZlcgorLy8gJCBjay5jZ2kgPHBvcnQ+ICYKKy8vIHdoZXJlIDxwb3J0PiBpcyBhIHBvcnQgbnVtYmVyCisvLyBQbGVhc2Ugc2VlIHRoZSBja2NsaWVudC5jcHAgZmlsZSBmb3IgY29va2llLXJlbGF0ZWQgZGV0YWlscy4KKy8vIFJlbWVtYmVyIHRvIGNoYW5nZSB0aGUgc29hcC5jb29raWVfZG9tYWluIHZhbHVlIHRvIHlvdXIgaG9zdAorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7IGludCBtLCBzOworICBzdHJ1Y3Qgc29hcCBzb2FwOworICBzb2FwX2luaXQoJnNvYXApOworICBzb2FwLmNvb2tpZV9kb21haW4gPSAid3d3LmNzLmZzdS5lZHUiOyAvLyBtdXN0IGJlIHRoZSBjdXJyZW50IGhvc3QgbmFtZSAoQ0dJL3N0YW5kYWxvbmUpCisgIC8vc29hcC5jb29raWVfZG9tYWluID0gImxpbnByb2cxLmNzLmZzdS5lZHUiOyAvLyBvdXIgc3RhbmQtYWxvbmUgbWFjaGluZQorICBzb2FwLmNvb2tpZV9wYXRoID0gIi8iOyAvLyB0aGUgcGF0aCB3aGljaCBpcyB1c2VkIHRvIGZpbHRlci9zZXQgY29va2llcyB3aXRoIHRoaXMgZGVzdGluYXRpb24KKyAgaWYgKGFyZ2MgPCAyKQorICB7IHNvYXBfZ2V0ZW52X2Nvb2tpZXMoJnNvYXApOyAvLyBDR0kgYXBwOiBncmFiIGNvb2tpZXMgZnJvbSAnSFRUUF9DT09LSUUnIGVudiB2YXIKKyAgICBzb2FwX3NlcnZlKCZzb2FwKTsKKyAgfQorICBlbHNlCisgIHsgbSA9IHNvYXBfYmluZCgmc29hcCwgTlVMTCwgYXRvaShhcmd2WzFdKSwgMTAwKTsKKyAgICBpZiAobSA8IDApCisgICAgICBleGl0KDEpOworICAgIGZwcmludGYoc3RkZXJyLCAiU29ja2V0IGNvbm5lY3Rpb24gc3VjY2Vzc2Z1bCAlZFxuIiwgbSk7CisgICAgZm9yIChpbnQgaSA9IDE7IDsgaSsrKQorICAgIHsgcyA9IHNvYXBfYWNjZXB0KCZzb2FwKTsKKyAgICAgIGlmIChzIDwgMCkKKyAgICAgICAgZXhpdCgtMSk7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVkOiBhY2NlcHRlZCAlZCBJUD0lZC4lZC4lZC4lZCAuLi4gIiwgaSwgcywgKGludCkoc29hcC5pcD4+MjQpJjB4RkYsIChpbnQpKHNvYXAuaXA+PjE2KSYweEZGLCAoaW50KShzb2FwLmlwPj44KSYweEZGLCAoaW50KXNvYXAuaXAmMHhGRik7CisgICAgICBzb2FwX3NlcnZlKCZzb2FwKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAic2VydmVkXG4iKTsKKyAgICAgIHNvYXBfZW5kKCZzb2FwKTsJCS8vIGNsZWFuIHVwIAorICAgICAgc29hcF9mcmVlX2Nvb2tpZXMoJnNvYXApOwkvLyByZW1vdmUgYWxsIG9sZCBjb29raWVzIGZyb20gZGF0YWJhc2Ugc28gbm8gaW50ZXJmZXJlbmNlIHdoZW4gbmV3IHJlcXVlc3RzIHdpdGggbmV3IGNvb2tpZXMgYXJyaXZlCisgICAgICAvLyBOb3RlOiB0aHJlYWRzIGNhbiBoYXZlIHRoZWlyIG93biBjb29raWUgREIgd2hpY2ggdGhleSBuZWVkIHRvIGNsZWFudXAgYmVmb3JlIHRoZXkgdGVybWluYXRlCisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCURlbW8gY29va2llCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworaW50IGNrX19kZW1vKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICoqcikKK3sgaW50IG47CisgIGNoYXIgKnMsIGJ1ZlsxNl07CisgIC8vIFRoZSBob3N0IGFuZCBwYXRoIGFyZSBzZXQgYnkgc29hcF9jb29raWVfZG9tYWluIGFuZCBzb2FwX2Nvb2tpZV9wYXRoCisgIC8vIHdoaWNoIE1VU1QgYmUgdGhlIGN1cnJlbnQgZG9tYWluIGFuZCBwYXRoIG9mIHRoZSBDR0kgYXBwIG9yIHN0YW5kLWFsb25lCisgIC8vIHNlcnZlciBpbiBvcmRlciB0byBhY2NlcHQgY29va2llcyBpbnRlbmRlZCBmb3IgdGhpcyBzZXJ2aWNlCisgIHMgPSBzb2FwX2Nvb2tpZV92YWx1ZShzb2FwLCAiZGVtbyIsIE5VTEwsIE5VTEwpOyAvLyBjb29raWUgd2FzIHJldHVybmVkIGJ5IGNsaWVudD8KKyAgaWYgKHMpCisgICAgbiA9IGF0b2kocykrMTsgLy8geWVzOiBpbmNyZW1lbnQgaW50IHZhbHVlIGFzIGRlbW8gZXhhbXBsZSBzZXNzaW9uCisgIGVsc2UKKyAgICBuID0gMTsgLy8gbm86IHJldHVybiBjb29raWUgd2l0aCB2YWx1ZSAxIHRvIGNsaWVudCB0byBzdGFydCBzZXNzaW9uCisgIHNwcmludGYoYnVmLCAiJWQiLCBuKTsKKyAgc29hcF9zZXRfY29va2llKHNvYXAsICJkZW1vIiwgYnVmLCBOVUxMLCBOVUxMKTsKKyAgc29hcF9zZXRfY29va2llX2V4cGlyZShzb2FwLCAiZGVtbyIsIDUsIE5VTEwsIE5VTEwpOyAvLyBjb29raWUgZXhwaXJlcyBpbiA1IHNlY29uZHMKKyAgaWYgKCgqciA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzdHJsZW4oYnVmKSsxKSkpCisgICAgc3RyY3B5KCpyLCBidWYpOworICByZXR1cm4gU09BUF9PSzsKK30KKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9jb21wb25lbnRzL1JFQURNRS50eHQgYi9zYW1wbGVzL2NvbXBvbmVudHMvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTgyYTRjCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9jb21wb25lbnRzL1JFQURNRS50eHQKQEAgLTAsMCArMSwxMyBAQAorCitUaGUgd3NkbDJoIHRvb2wgY2FuIGltcG9ydCBtdWx0aXBsZSBXU0RMIGZpbGVzIGF0IG9uY2UgdG8gY29tYmluZSBtdWx0aXBsZQorY2xpZW50cyBhbmQgc2VydmljZSBpbnRvIG9uZSBleGVjdXRhYmxlLiBIb3dldmVyLCBpZiB0aGVyZSBpcyBhIG5lZWQgdG8gYnVpbGQKK2NsaWVudHMgYW5kIHNlcnZpY2VzIGZyb20gbXVsdGlwbGUgZ1NPQVAgaGVhZGVyIGZpbGVzLCB0aGVuIGFuIGFsdGVybmF0aXZlCithcHByb2FjaCBpcyByZXF1aXJlZC4KKworVGhlIEMgYW5kIEMrKyBleGFtcGxlcyBpbiB0aGlzIGRpcmVjdG9yeSBpbGx1c3RyYXRlIGhvdyBtdWx0aXBsZSBjbGllbnRzIGFuZAorc2VydmljZXMgY2FuIGJlIGNvbXBpbGVkIGFuZCBsaW5rZWQgaW50byBvbmUgZXhlY3V0YWJsZSBmcm9tIG11bHRpcGxlIGdTT0FQCitoZWFkZXIgZmlsZXMuIFRoZSBDIGV4YW1wbGVzIGFjY29tcGxpc2ggdGhpcyBieSBtZXJnaW5nIHN0YXRpY2FsbHkgZGVjbGFyZWQKK3NlcmlhbGl6ZXJzLiBUaGUgQysrIGV4YW1wbGVzIGFjY29tcGxpc2ggdGhpcyBieSB1c2luZyBDKysgbmFtZXNwYWNlcyB0byBzZXBhcmF0ZQordGhlIHNlcmlhbGl6ZXJzLgorCitTZWUgdGhlIFJFQURNRS50eHQgaW4gdGhlIGMgYW5kIGNwcCBkaXJlY3RvcmllcyBmb3IgbW9yZSBkZXRhaWxzLgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9jb21wb25lbnRzL2MvTWFrZWZpbGUgYi9zYW1wbGVzL2NvbXBvbmVudHMvYy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWE2YmM4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9jb21wb25lbnRzL2MvTWFrZWZpbGUKQEAgLTAsMCArMSwzMSBAQAorQ0M9Z2NjCitDUFA9ZysrCitMSUJTPQorQ09GTEFHUz0tTzIKK0NXRkxBR1M9LVdhbGwKK0NJRkxBR1M9LUkuLiAtSS4uLy4uCitDTUZMQUdTPQorQ0ZMQUdTPSAkKENXRkxBR1MpICQoQ09GTEFHUykgJChDSUZMQUdTKSAkKENNRkxBR1MpCittYWluOgkJbWFpbi5jIGVudkMubyBzdGRzb2FwMi5vIHF1b3RlQ2xpZW50TGliLm8gcmF0ZUNsaWVudExpYi5vIGNhbGNTZXJ2ZXJMaWIubworCQkkKENDKSAkKENGTEFHUykgLW8gbWFpbiBtYWluLmMgZW52Qy5vIHN0ZHNvYXAyLm8gcXVvdGVDbGllbnRMaWIubyByYXRlQ2xpZW50TGliLm8gY2FsY1NlcnZlckxpYi5vCitzdGRzb2FwMi5vOglzdGRzb2FwMi5oIHN0ZHNvYXAyLmMKKwkJJChDQykgJChDRkxBR1MpIC1EV0lUSF9OT05BTUVTUEFDRVMgLWMgc3Rkc29hcDIuYworZW52Qy5vOgkJZW52LmggaGVhZGVyLmggZmF1bHQuaAorCQlzb2FwY3BwMiAtQ1MgLWNwZW52IGVudi5oCisJCSQoQ0MpICQoQ0ZMQUdTKSAtYyBlbnZDLmMKK3F1b3RlQ2xpZW50TGliLmM6CXF1b3RlLmgKKwkJc29hcGNwcDIgLUMgLWNuIC1wcXVvdGUgcXVvdGUuaAorcXVvdGVDbGllbnRMaWIubzoJcXVvdGVDbGllbnRMaWIuYworCQkkKENDKSAkKENGTEFHUykgLWMgcXVvdGVDbGllbnRMaWIuYworcmF0ZUNsaWVudExpYi5jOglyYXRlLmgKKwkJc29hcGNwcDIgLUMgLWNuIC1wcmF0ZSByYXRlLmgKK3JhdGVDbGllbnRMaWIubzoJcmF0ZUNsaWVudExpYi5jCisJCSQoQ0MpICQoQ0ZMQUdTKSAtYyByYXRlQ2xpZW50TGliLmMKK2NhbGNTZXJ2ZXJMaWIuYzoJY2FsYy5oCisJCXNvYXBjcHAyIC1TIC1jbiAtcGNhbGMgY2FsYy5oCitjYWxjU2VydmVyTGliLm86CWNhbGNTZXJ2ZXJMaWIuYworCQkkKENDKSAkKENGTEFHUykgLWMgY2FsY1NlcnZlckxpYi5jCitjbGVhbjoJCQorCQlybSAtZiAqLm8gKi5uc21hcCAqSC5oICpTdHViLmggKkMuY3BwICpDLmMgKkNsaWVudC5jcHAgKkNsaWVudC5jICpDbGllbnRMaWIuYyAqQ2xpZW50TGliLmNwcCAqU2VydmVyLmNwcCAqU2VydmVyLmMgKlNlcnZlckxpYi5jICpTZXJ2ZXJMaWIuY3BwICpTZXJ2aWNlT2JqZWN0LmggKlNlcnZpY2VQcm94eS5oCitkaXN0Y2xlYW46CQkKKwkJcm0gLWYgbWFpbiAqLm8gKi53c2RsICoueHNkICoueG1sICoubnNtYXAgKkguaCAqU3R1Yi5oICpDLmNwcCAqQy5jICpDbGllbnQuY3BwICpDbGllbnQuYyAqQ2xpZW50TGliLmMgKkNsaWVudExpYi5jcHAgKlNlcnZlci5jcHAgKlNlcnZlci5jICpTZXJ2ZXJMaWIuYyAqU2VydmVyTGliLmNwcCAqU2VydmljZU9iamVjdC5oICpTZXJ2aWNlUHJveHkuaApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9jb21wb25lbnRzL2MvUkVBRE1FLnR4dCBiL3NhbXBsZXMvY29tcG9uZW50cy9jL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAxYTVjNQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvY29tcG9uZW50cy9jL1JFQURNRS50eHQKQEAgLTAsMCArMSwxMyBAQAorVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIHRoZSAqQ2xpZW50TGliLmMgYW5kICpTZXJ2ZXJMaWIuYworZ2VuZXJhdGVkIGZpbGVzIHRvIGNvbWJpbmUgbXVsdGlwbGUgY2xpZW50cyBhbmQgc2VydmljZSBpbnRvIG9uZSBleGVjdXRhYmxlLgorCitDbGllbnRzOiBYTWV0aG9kcyBkZWxheWVkIHF1b3RlIGFuZCBleGNoYW5nZSByYXRlCitTZXJ2aWNlOiBjYWxjdWxhdG9yIHNlcnZpY2UKKworVG8gY29tcGlsZToKK21ha2UKKworVXNhZ2U6CisuL21haW4JCQkJcnVucyBDR0kgY2FsY3VsYXRvciBzZXJ2aWNlIChpbnN0YWxsIGFzIENHSSkKKy4vbWFpbiA8c3RvY2s+CQkJcmV0dXJucyBzdG9jayBxdW90ZQorLi9tYWluIDxzdG9jaz4gPGN1cnJlbmN5PglyZXR1cm5zIHN0b2NrIHF1b3RlIGluIGN1cnJlbmN5CmRpZmYgLS1naXQgYS9zYW1wbGVzL2NvbXBvbmVudHMvYy9jYWxjLmggYi9zYW1wbGVzL2NvbXBvbmVudHMvYy9jYWxjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYxNDQyMgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvY29tcG9uZW50cy9jL2NhbGMuaApAQCAtMCwwICsxLDEwIEBACisvL2dzb2FwIG5zIHNlcnZpY2UgbmFtZToJU2VydmljZQorLy9nc29hcCBucyBzZXJ2aWNlIHN0eWxlOglycGMKKy8vZ3NvYXAgbnMgc2VydmljZSBlbmNvZGluZzoJZW5jb2RlZAorLy9nc29hcCBucyBzZXJ2aWNlIGxvY2F0aW9uOglodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vY2FsYy5jZ2kKKy8vZ3NvYXAgbnMgc2VydmljZSBuYW1lc3BhY2U6CXVybjpjYWxjCisKK2ludCBuc19fYWRkKGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlICpyZXN1bHQpOworaW50IG5zX19zdWIoZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgKnJlc3VsdCk7CitpbnQgbnNfX211bChkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSAqcmVzdWx0KTsKK2ludCBuc19fZGl2KGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlICpyZXN1bHQpOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9jb21wb25lbnRzL2MvZW52LmggYi9zYW1wbGVzL2NvbXBvbmVudHMvYy9lbnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTMzMTkzCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9jb21wb25lbnRzL2MvZW52LmgKQEAgLTAsMCArMSwyMCBAQAorLyoJZW52LmgKKworCURlZmluZXMgZ1NPQVAgZW52aXJvbm1lbnQgc2hhcmVkIGJ5IGNsaWVudCBhbmQgc2VydmljZSBtb2R1bGVzCisKKwlJbXBvcnRzIFNPQVAgRmF1bHQgYW5kIFNPQVAgSGVhZGVyIHN0cnVjdHVyZXMsIHdoaWNoIHdpbGwgYmUKKwlzaGFyZWQgYnkgY2xpZW50IGFuZCBzZXJ2aWNlIG1vZHVsZXMuIFRoZSBIZWFkZXIgc3RydWN0dXJlCisJc2hvdWxkIGNvbnRhaW4gYWxsIGZpZWxkcyByZXF1aXJlZCBieSB0aGUgY2xpZW50cyBhbmQgc2VydmljZXMuCisKKwlDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMyBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4sIEdlbml2aWEgaW5jLgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlDb21waWxlOgorCXNvYXBjcHAyIC1wZW52IGVudi5oCisJYysrIC1jIGVudkMuY3BwCisJYysrIC1EV0lUSF9OT05BTUVTUEFDRVMgLWMgc3Rkc29hcDIuY3BwCisKKyovCisKKyNpbXBvcnQgImhlYWRlci5oIgkJLy8gb3B0aW9uYWwgdXNlci1kZWZpbmVkIGhlYWRlcnMKKyNpbXBvcnQgImZhdWx0LmgiCQkvLyBvcHRpb25hbCB1c2VyLWRlZmluZWQgZmF1bHQgZGV0YWlscwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9jb21wb25lbnRzL2MvZmF1bHQuaCBiL3NhbXBsZXMvY29tcG9uZW50cy9jL2ZhdWx0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFkNGI5MQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvY29tcG9uZW50cy9jL2ZhdWx0LmgKQEAgLTAsMCArMSw0MCBAQAorLyoJZmF1bHQuaAorCisJRGVmaW5lcyBvcHRpb25hbCBTT0FQIEZhdWx0IGRlcmFpbCBkYXRhIHN0cnVjdHVyZXMKKworCUNvcHlyaWdodCAoQykgMjAwMC0yMDA0IFJvYmVydCBBLiB2YW4gRW5nZWxlbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworKi8KKworLyoKKworQWRkIGFueSBkYXRhIHN0cnVjdHVyZSB5b3Ugd2FudCB0byBzZXJpYWxpemUgYXMgcGFydCBvZiB0aGUgU09BUCBGYXVsdCBkZXRhaWwKK2VsZW1lbnQuIFRoZSBkZXRhaWwgZWxlbWVudCAnX190eXBlJyBhbmQgJ3ZhbHVlJyBmaWVsZHMgc2hvdWxkIGJlIHNldCB0bwordHJhbnNtaXQgZGF0YS4gVGhlIGZpZWxkcyBhcmUgc2V0IHdoZW4gZGF0YSBvZiBjb3JyZXNwb25kaW5nIHR5cGVzIGFyZSByZWNlaXZlZC4KKworRm9yIGV4YW1wbGUsIHdlIGRlZmluZSBhbiA8ZWxlbWVudD4gb2YgbmFtZSA8ZjpteURhdGE+IHdpdGggYSBzdHJpbmcgdmVjdG9yCisobm90ZSB0aGUgbGVhZGluZyBfIGluIHRoZSBmb2xsb3dpbmcgZGVjbGFyYXRpb24pOgorCitjbGFzcyBfZl9fbXlEYXRhCit7IHB1YmxpYzoKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmcqPiAqZGF0YTsKK307CisKK1RvIHJldHVybiBhIGZhdWx0IGZyb20geW91ciBzZXJ2aWNlIGFwcGxpY2F0aW9uOgorc29hcF9zZW5kZXJfZmF1bHQoc29hcCwgIkFuIGVycm9yIG9jY3VycmVkIiwgTlVMTCkpOwkvLyBzZXQgc29hcCBmYXVsdAorc29hcC0+ZmF1bHQtPmRldGFpbCA9IChzdHJ1Y3QgU09BUF9FTlZfX0RldGFpbCopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBTT0FQX0VOVl9fRmF1bHQpKTsKK3NvYXAtPmZhdWx0LT5kZXRhaWwtPl9fdHlwZSA9IFNPQVBfVFlQRV9fZl9fbXlEYXRhOworc29hcC0+ZmF1bHQtPmRldGFpbC0+dmFsdWUgPSBzb2FwX25ld19fZl9fbXlEYXRhKHNvYXAsIC0xKTsKK3JldHVybiBTT0FQX0ZBVUxUOworCitJbiBhZGRpdGlvbiwgeW91IGNhbiBtb2RpZnkgdGhlIFNPQVBfRU5WX19EZXRhaWwgc3RydWN0IGFuZCBhZGQgeW91ciBvd24gc2V0CitvZiBmaWVsZHMsIGFzIGluOgorCitzdHJ1Y3QgU09BUF9FTlZfX0RldGFpbAoreyBzdHJ1Y3QgZl9fbXlEYXRhVHlwZSBmX19teURhdGE7CisgIGludCBfX3R5cGU7CisgIHZvaWQgKnZhbHVlOworICBjaGFyICpfX2FueTsKK307CisgCisqLwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9jb21wb25lbnRzL2MvaGVhZGVyLmggYi9zYW1wbGVzL2NvbXBvbmVudHMvYy9oZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmQzMjFhCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9jb21wb25lbnRzL2MvaGVhZGVyLmgKQEAgLTAsMCArMSwyMCBAQAorLyoJaGVhZGVyLmgKKworCURlZmluZXMgU09BUCBIZWFkZXIgZGF0YSBzdHJ1Y3R1cmUgc2hhcmVkIGJ5IGNsaWVudCBhbmQgc2VydmljZSBtb2R1bGVzLgorCUFzIGFuIGV4YW1wbGUsIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIGNhbiBiZSBpbmNsdWRlZCBpbiB0aGUgaGVhZGVyLgorCisJQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisqLworCisvL2dzb2FwIGggc2NoZW1hIG5hbWVzcGFjZTogaHR0cDovL3dlYnNydi5jcy5mc3UuZWR1L35lbmdlbGVuL2gueHNkCisKK3N0cnVjdCBoX19hdXRoZW50aWNhdGlvbgoreyBjaGFyICp1c2VyaWQ7CisgIGNoYXIgKnBhc3N3ZDsKK307CisKK3N0cnVjdCBTT0FQX0VOVl9fSGVhZGVyCit7IHN0cnVjdCBoX19hdXRoZW50aWNhdGlvbiAqaF9fY3JlZGVudGlhbHM7Cit9OworCmRpZmYgLS1naXQgYS9zYW1wbGVzL2NvbXBvbmVudHMvYy9tYWluLmMgYi9zYW1wbGVzL2NvbXBvbmVudHMvYy9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVjYTU3YwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvY29tcG9uZW50cy9jL21haW4uYwpAQCAtMCwwICsxLDU5IEBACisKKy8vIG11c3QgaW5jbHVkZSBlbnZILmggZmlyc3Q6IGl0IGRlY2xhcmVzIHRoZSBTT0FQIEhlYWRlciBhbmQgRmF1bHQgc3RydWN0dXJlcworLy8gc2hhcmVkIGFtb25nIHRoZSBjbGllbnRzIGFuZCBzZXJ2aWNlcworI2luY2x1ZGUgImVudkguaCIKKworLy8gaW5jbHVkZSB0aGUgcXVvdGUgYW5kIHJhdGUgc3R1YnMgYW5kIGNhbGMgc2tlbGV0b24KKyNpbmNsdWRlICJxdW90ZUguaCIKKyNpbmNsdWRlICJyYXRlSC5oIgorI2luY2x1ZGUgImNhbGNILmgiCisKKy8vIGluY2x1ZGUgdGhlIFhNTCBuYW1lc3BhY2UgbWFwcGluZyB0YWJsZXMKKyNpbmNsdWRlICJxdW90ZS5uc21hcCIKKyNpbmNsdWRlICJyYXRlLm5zbWFwIgorI2luY2x1ZGUgImNhbGMubnNtYXAiCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7IHN0cnVjdCBzb2FwICpzb2FwID0gc29hcF9uZXcoKTsKKyAgaWYgKGFyZ2MgPD0gMSkKKyAgICByZXR1cm4gY2FsY19zZXJ2ZShzb2FwKTsKKyAgZWxzZQorICB7IGZsb2F0IHE7CisgICAgaWYgKHNvYXBfY2FsbF9uc19fZ2V0UXVvdGUoc29hcCwgTlVMTCwgTlVMTCwgYXJndlsxXSwgJnEpKQorICAgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOworICAgIGVsc2UKKyAgICB7IGlmIChhcmdjID4gMikKKyAgICAgIHsgZmxvYXQgcjsKKyAgICAgICAgaWYgKHNvYXBfY2FsbF9uc19fZ2V0UmF0ZShzb2FwLCBOVUxMLCBOVUxMLCAidXMiLCBhcmd2WzJdLCAmcikpCisgICAgICAgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOworICAgICAgICBlbHNlCisgICAgICAgICAgcSAqPSByOworICAgICAgfQorICAgICAgcHJpbnRmKCIlczogJWdcbiIsIGFyZ3ZbMV0sIHEpOworICAgIH0KKyAgfQorICBzb2FwX2VuZChzb2FwKTsKKyAgc29hcF9kb25lKHNvYXApOworICBmcmVlKHNvYXApOworICByZXR1cm4gMDsKK30KKworaW50IG5zX19hZGQoc3RydWN0IHNvYXAgKnNvYXAsIGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlICpyZXN1bHQpCit7ICpyZXN1bHQgPSBhICsgYjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK2ludCBuc19fc3ViKHN0cnVjdCBzb2FwICpzb2FwLCBkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSAqcmVzdWx0KQoreyAqcmVzdWx0ID0gYSAtIGI7CisgIHJldHVybiBTT0FQX09LOworfQorCitpbnQgbnNfX211bChzdHJ1Y3Qgc29hcCAqc29hcCwgZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgKnJlc3VsdCkKK3sgKnJlc3VsdCA9IGEgKiBiOworICByZXR1cm4gU09BUF9PSzsKK30KKworaW50IG5zX19kaXYoc3RydWN0IHNvYXAgKnNvYXAsIGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlICpyZXN1bHQpCit7ICpyZXN1bHQgPSBhIC8gYjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL2NvbXBvbmVudHMvYy9xdW90ZS5oIGIvc2FtcGxlcy9jb21wb25lbnRzL2MvcXVvdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTdiMGRiCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9jb21wb25lbnRzL2MvcXVvdGUuaApAQCAtMCwwICsxLDggQEAKKy8vZ3NvYXAgbnMgc2VydmljZSBuYW1lOglTZXJ2aWNlCisvL2dzb2FwIG5zIHNlcnZpY2Ugc3R5bGU6CXJwYworLy9nc29hcCBucyBzZXJ2aWNlIGVuY29kaW5nOgllbmNvZGVkCisvL2dzb2FwIG5zIHNlcnZpY2UgbG9jYXRpb246CWh0dHA6Ly9zZXJ2aWNlcy54bWV0aG9kcy5uZXQvc29hcAorLy9nc29hcCBucyBzZXJ2aWNlIG5hbWVzcGFjZToJdXJuOnhtZXRob2RzLWRlbGF5ZWQtcXVvdGVzCisKKy8vZ3NvYXAgbnMgc2VydmljZSBtZXRob2QtYWN0aW9uOiBnZXRRdW90ZSAiIgoraW50IG5zX19nZXRRdW90ZShjaGFyICpzeW1ib2wsIGZsb2F0ICpSZXN1bHQpOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9jb21wb25lbnRzL2MvcmF0ZS5oIGIvc2FtcGxlcy9jb21wb25lbnRzL2MvcmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YmViODQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2NvbXBvbmVudHMvYy9yYXRlLmgKQEAgLTAsMCArMSw4IEBACisvL2dzb2FwIG5zIHNlcnZpY2UgbmFtZToJU2VydmljZQorLy9nc29hcCBucyBzZXJ2aWNlIHN0eWxlOglycGMKKy8vZ3NvYXAgbnMgc2VydmljZSBlbmNvZGluZzoJZW5jb2RlZAorLy9nc29hcCBucyBzZXJ2aWNlIGxvY2F0aW9uOglodHRwOi8vc2VydmljZXMueG1ldGhvZHMubmV0L3NvYXAKKy8vZ3NvYXAgbnMgc2VydmljZSBuYW1lc3BhY2U6CXVybjp4bWV0aG9kcy1DdXJyZW5jeUV4Y2hhbmdlCisKKy8vZ3NvYXAgbnMgc2VydmljZSBtZXRob2QtYWN0aW9uOiBnZXRSYXRlICIiCitpbnQgbnNfX2dldFJhdGUoY2hhciAqY291bnRyeTEsIGNoYXIgKmNvdW50cnkyLCBmbG9hdCAqUmVzdWx0KTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvY29tcG9uZW50cy9jcHAvTWFrZWZpbGUgYi9zYW1wbGVzL2NvbXBvbmVudHMvY3BwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMzVmZTkKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2NvbXBvbmVudHMvY3BwL01ha2VmaWxlCkBAIC0wLDAgKzEsMzEgQEAKK0NDPWdjYworQ1BQPWcrKworTElCUz0KK0NPRkxBR1M9LU8yCitDV0ZMQUdTPS1XYWxsCitDSUZMQUdTPS1JLi4gLUkuLi8uLgorQ01GTEFHUz0KK0NGTEFHUz0gJChDV0ZMQUdTKSAkKENPRkxBR1MpICQoQ0lGTEFHUykgJChDTUZMQUdTKQorbWFpbjoJCW1haW4uY3BwIGVudkMubyBzdGRzb2FwMi5vIHF1b3RlQ2xpZW50TGliLm8gcmF0ZUNsaWVudExpYi5vIGNhbGNTZXJ2ZXJMaWIubworCQkkKENQUCkgJChDRkxBR1MpIC1vIG1haW4gbWFpbi5jcHAgZW52Qy5vIHN0ZHNvYXAyLm8gcXVvdGVDbGllbnRMaWIubyByYXRlQ2xpZW50TGliLm8gY2FsY1NlcnZlckxpYi5vCitzdGRzb2FwMi5vOglzdGRzb2FwMi5oIHN0ZHNvYXAyLmNwcAorCQkkKENQUCkgJChDRkxBR1MpIC1EV0lUSF9OT05BTUVTUEFDRVMgLWMgc3Rkc29hcDIuY3BwCitlbnZDLm86CQllbnYuaCBoZWFkZXIuaCBmYXVsdC5oCisJCXNvYXBjcHAyIC1DUyAtcGVudiBlbnYuaAorCQkkKENQUCkgJChDRkxBR1MpIC1jIGVudkMuY3BwCitxdW90ZUNsaWVudExpYi5jcHA6CXF1b3RlLmgKKwkJc29hcGNwcDIgLUMgLW4gcXVvdGUuaAorcXVvdGVDbGllbnRMaWIubzoJcXVvdGVDbGllbnRMaWIuY3BwCisJCSQoQ1BQKSAkKENGTEFHUykgLWMgcXVvdGVDbGllbnRMaWIuY3BwCityYXRlQ2xpZW50TGliLmNwcDoJcmF0ZS5oCisJCXNvYXBjcHAyIC1DIC1uIHJhdGUuaAorcmF0ZUNsaWVudExpYi5vOglyYXRlQ2xpZW50TGliLmNwcAorCQkkKENQUCkgJChDRkxBR1MpIC1jIHJhdGVDbGllbnRMaWIuY3BwCitjYWxjU2VydmVyTGliLmNwcDoJY2FsYy5oCisJCXNvYXBjcHAyIC1TIC1uIGNhbGMuaAorY2FsY1NlcnZlckxpYi5vOgljYWxjU2VydmVyTGliLmNwcAorCQkkKENQUCkgJChDRkxBR1MpIC1jIGNhbGNTZXJ2ZXJMaWIuY3BwCitjbGVhbjoJCQorCQlybSAtZiAqLm8gKi5uc21hcCAqSC5oICpTdHViLmggKkMuY3BwICpDLmMgKkNsaWVudC5jcHAgKkNsaWVudC5jICpDbGllbnRMaWIuYyAqQ2xpZW50TGliLmNwcCAqU2VydmVyLmNwcCAqU2VydmVyLmMgKlNlcnZlckxpYi5jICpTZXJ2ZXJMaWIuY3BwICpTZXJ2aWNlT2JqZWN0LmggKlNlcnZpY2VQcm94eS5oCitkaXN0Y2xlYW46CQkKKwkJcm0gLWYgbWFpbiAqLm8gKi53c2RsICoueHNkICoueG1sICoubnNtYXAgKkguaCAqU3R1Yi5oICpDLmNwcCAqQy5jICpDbGllbnQuY3BwICpDbGllbnQuYyAqQ2xpZW50TGliLmMgKkNsaWVudExpYi5jcHAgKlNlcnZlci5jcHAgKlNlcnZlci5jICpTZXJ2ZXJMaWIuYyAqU2VydmVyTGliLmNwcCAqU2VydmljZU9iamVjdC5oICpTZXJ2aWNlUHJveHkuaApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9jb21wb25lbnRzL2NwcC9SRUFETUUudHh0IGIvc2FtcGxlcy9jb21wb25lbnRzL2NwcC9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZTE1MjMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2NvbXBvbmVudHMvY3BwL1JFQURNRS50eHQKQEAgLTAsMCArMSwxNSBAQAorVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIEMrKyBuYW1lc3BhY2VzIHRvIGNvbWJpbmUgY2xpZW50cyBhbmQgYQorc2VydmljZSBpbnRvIGEgc2luZ2xlIGV4ZWN1dGFibGUuCisKK1RoZSBjbGllbnQgcHJveGllcyBhbmQgc2VydmVyIG9iamVjdCBhcmUgc2VwYXJhdGVkIGJ5IEMrKyBuYW1lc3BhY2VzLgorCitDbGllbnRzOiBYTWV0aG9kcyBkZWxheWVkIHF1b3RlIGFuZCBleGNoYW5nZSByYXRlCitTZXJ2aWNlOiBjYWxjdWxhdG9yIHNlcnZpY2UKKworQ29tcGlsZToKK21ha2UKKworVXNhZ2U6CisuL21haW4JCQkJcnVucyBDR0kgY2FsY3VsYXRvciBzZXJ2aWNlIChpbnN0YWxsIGFzIENHSSkKKy4vbWFpbiA8c3RvY2s+CQkJcmV0dXJucyBzdG9jayBxdW90ZQorLi9tYWluIDxzdG9jaz4gPGN1cnJlbmN5PglyZXR1cm5zIHN0b2NrIHF1b3RlIGluIGN1cnJlbmN5CmRpZmYgLS1naXQgYS9zYW1wbGVzL2NvbXBvbmVudHMvY3BwL2NhbGMuaCBiL3NhbXBsZXMvY29tcG9uZW50cy9jcHAvY2FsYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5Y2E4NWQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2NvbXBvbmVudHMvY3BwL2NhbGMuaApAQCAtMCwwICsxLDE0IEBACituYW1lc3BhY2UgY2FsYyB7CisKKy8vZ3NvYXAgbnMgc2VydmljZSBuYW1lOglTZXJ2aWNlCisvL2dzb2FwIG5zIHNlcnZpY2Ugc3R5bGU6CXJwYworLy9nc29hcCBucyBzZXJ2aWNlIGVuY29kaW5nOgllbmNvZGVkCisvL2dzb2FwIG5zIHNlcnZpY2UgbG9jYXRpb246CWh0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9jYWxjLmNnaQorLy9nc29hcCBucyBzZXJ2aWNlIG5hbWVzcGFjZToJdXJuOmNhbGMKKworaW50IG5zX19hZGQoZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgKnJlc3VsdCk7CitpbnQgbnNfX3N1Yihkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSAqcmVzdWx0KTsKK2ludCBuc19fbXVsKGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlICpyZXN1bHQpOworaW50IG5zX19kaXYoZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgKnJlc3VsdCk7CisKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvY29tcG9uZW50cy9jcHAvZW52LmggYi9zYW1wbGVzL2NvbXBvbmVudHMvY3BwL2Vudi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MzMxOTMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2NvbXBvbmVudHMvY3BwL2Vudi5oCkBAIC0wLDAgKzEsMjAgQEAKKy8qCWVudi5oCisKKwlEZWZpbmVzIGdTT0FQIGVudmlyb25tZW50IHNoYXJlZCBieSBjbGllbnQgYW5kIHNlcnZpY2UgbW9kdWxlcworCisJSW1wb3J0cyBTT0FQIEZhdWx0IGFuZCBTT0FQIEhlYWRlciBzdHJ1Y3R1cmVzLCB3aGljaCB3aWxsIGJlCisJc2hhcmVkIGJ5IGNsaWVudCBhbmQgc2VydmljZSBtb2R1bGVzLiBUaGUgSGVhZGVyIHN0cnVjdHVyZQorCXNob3VsZCBjb250YWluIGFsbCBmaWVsZHMgcmVxdWlyZWQgYnkgdGhlIGNsaWVudHMgYW5kIHNlcnZpY2VzLgorCisJQ29weXJpZ2h0IChDKSAyMDAwLTIwMDMgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLCBHZW5pdmlhIGluYy4KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJQ29tcGlsZToKKwlzb2FwY3BwMiAtcGVudiBlbnYuaAorCWMrKyAtYyBlbnZDLmNwcAorCWMrKyAtRFdJVEhfTk9OQU1FU1BBQ0VTIC1jIHN0ZHNvYXAyLmNwcAorCisqLworCisjaW1wb3J0ICJoZWFkZXIuaCIJCS8vIG9wdGlvbmFsIHVzZXItZGVmaW5lZCBoZWFkZXJzCisjaW1wb3J0ICJmYXVsdC5oIgkJLy8gb3B0aW9uYWwgdXNlci1kZWZpbmVkIGZhdWx0IGRldGFpbHMKZGlmZiAtLWdpdCBhL3NhbXBsZXMvY29tcG9uZW50cy9jcHAvZmF1bHQuaCBiL3NhbXBsZXMvY29tcG9uZW50cy9jcHAvZmF1bHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWQ0YjkxCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9jb21wb25lbnRzL2NwcC9mYXVsdC5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCWZhdWx0LmgKKworCURlZmluZXMgb3B0aW9uYWwgU09BUCBGYXVsdCBkZXJhaWwgZGF0YSBzdHJ1Y3R1cmVzCisKKwlDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyovCisKKy8qCisKK0FkZCBhbnkgZGF0YSBzdHJ1Y3R1cmUgeW91IHdhbnQgdG8gc2VyaWFsaXplIGFzIHBhcnQgb2YgdGhlIFNPQVAgRmF1bHQgZGV0YWlsCitlbGVtZW50LiBUaGUgZGV0YWlsIGVsZW1lbnQgJ19fdHlwZScgYW5kICd2YWx1ZScgZmllbGRzIHNob3VsZCBiZSBzZXQgdG8KK3RyYW5zbWl0IGRhdGEuIFRoZSBmaWVsZHMgYXJlIHNldCB3aGVuIGRhdGEgb2YgY29ycmVzcG9uZGluZyB0eXBlcyBhcmUgcmVjZWl2ZWQuCisKK0ZvciBleGFtcGxlLCB3ZSBkZWZpbmUgYW4gPGVsZW1lbnQ+IG9mIG5hbWUgPGY6bXlEYXRhPiB3aXRoIGEgc3RyaW5nIHZlY3RvcgorKG5vdGUgdGhlIGxlYWRpbmcgXyBpbiB0aGUgZm9sbG93aW5nIGRlY2xhcmF0aW9uKToKKworY2xhc3MgX2ZfX215RGF0YQoreyBwdWJsaWM6CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nKj4gKmRhdGE7Cit9OworCitUbyByZXR1cm4gYSBmYXVsdCBmcm9tIHlvdXIgc2VydmljZSBhcHBsaWNhdGlvbjoKK3NvYXBfc2VuZGVyX2ZhdWx0KHNvYXAsICJBbiBlcnJvciBvY2N1cnJlZCIsIE5VTEwpKTsJLy8gc2V0IHNvYXAgZmF1bHQKK3NvYXAtPmZhdWx0LT5kZXRhaWwgPSAoc3RydWN0IFNPQVBfRU5WX19EZXRhaWwqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3QgU09BUF9FTlZfX0ZhdWx0KSk7Citzb2FwLT5mYXVsdC0+ZGV0YWlsLT5fX3R5cGUgPSBTT0FQX1RZUEVfX2ZfX215RGF0YTsKK3NvYXAtPmZhdWx0LT5kZXRhaWwtPnZhbHVlID0gc29hcF9uZXdfX2ZfX215RGF0YShzb2FwLCAtMSk7CityZXR1cm4gU09BUF9GQVVMVDsKKworSW4gYWRkaXRpb24sIHlvdSBjYW4gbW9kaWZ5IHRoZSBTT0FQX0VOVl9fRGV0YWlsIHN0cnVjdCBhbmQgYWRkIHlvdXIgb3duIHNldAorb2YgZmllbGRzLCBhcyBpbjoKKworc3RydWN0IFNPQVBfRU5WX19EZXRhaWwKK3sgc3RydWN0IGZfX215RGF0YVR5cGUgZl9fbXlEYXRhOworICBpbnQgX190eXBlOworICB2b2lkICp2YWx1ZTsKKyAgY2hhciAqX19hbnk7Cit9OworIAorKi8KZGlmZiAtLWdpdCBhL3NhbXBsZXMvY29tcG9uZW50cy9jcHAvaGVhZGVyLmggYi9zYW1wbGVzL2NvbXBvbmVudHMvY3BwL2hlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZTFmOTcKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2NvbXBvbmVudHMvY3BwL2hlYWRlci5oCkBAIC0wLDAgKzEsMjAgQEAKKy8qCWhlYWRlci5oCisKKwlEZWZpbmVzIFNPQVAgSGVhZGVyIGRhdGEgc3RydWN0dXJlIHNoYXJlZCBieSBjbGllbnQgYW5kIHNlcnZpY2UgbW9kdWxlcworCUFzIGFuIGV4YW1wbGUsIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIGNhbiBiZSBpbmNsdWRlZCBpbiB0aGUgaGVhZGVyLgorCisJQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisqLworCisvL2dzb2FwIGggc2NoZW1hIG5hbWVzcGFjZTogaHR0cDovL3dlYnNydi5jcy5mc3UuZWR1L35lbmdlbGVuL2gueHNkCisKK3N0cnVjdCBoX19hdXRoZW50aWNhdGlvbgoreyBjaGFyICp1c2VyaWQ7CisgIGNoYXIgKnBhc3N3ZDsKK307CisKK3N0cnVjdCBTT0FQX0VOVl9fSGVhZGVyCit7IHN0cnVjdCBoX19hdXRoZW50aWNhdGlvbiAqaF9fY3JlZGVudGlhbHM7Cit9OworCmRpZmYgLS1naXQgYS9zYW1wbGVzL2NvbXBvbmVudHMvY3BwL21haW4uY3BwIGIvc2FtcGxlcy9jb21wb25lbnRzL2NwcC9tYWluLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWY0NDk4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9jb21wb25lbnRzL2NwcC9tYWluLmNwcApAQCAtMCwwICsxLDYzIEBACisKKy8vIG11c3QgaW5jbHVkZSBlbnZILmggZmlyc3Q6IGl0IGRlY2xhcmVzIHRoZSBTT0FQIEhlYWRlciBhbmQgRmF1bHQgc3RydWN0dXJlcworLy8gc2hhcmVkIGFtb25nIHRoZSBjbGllbnRzIGFuZCBzZXJ2aWNlcworI2luY2x1ZGUgImVudkguaCIKKworLy8gaW5jbHVkZSB0aGUgcXVvdGUgYW5kIHJhdGUgcHJveGllcyBhbmQgY2FsYyBvYmplY3QKKyNpbmNsdWRlICJxdW90ZVNlcnZpY2VQcm94eS5oIgorI2luY2x1ZGUgInJhdGVTZXJ2aWNlUHJveHkuaCIKKyNpbmNsdWRlICJjYWxjU2VydmljZU9iamVjdC5oIgorCisvLyBpbmNsdWRlIHRoZSBYTUwgbmFtZXNwYWNlIG1hcHBpbmcgdGFibGVzCisjaW5jbHVkZSAicXVvdGUubnNtYXAiCisjaW5jbHVkZSAicmF0ZS5uc21hcCIKKyNpbmNsdWRlICJjYWxjLm5zbWFwIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreyBpZiAoYXJnYyA8PSAxKQorICB7IGNhbGM6OlNlcnZpY2UgY2FsYzsKKyAgICByZXR1cm4gY2FsYy5zZXJ2ZSgpOworICB9CisgIHF1b3RlOjpTZXJ2aWNlIHF1b3RlOworICBmbG9hdCBxOworICBpZiAocXVvdGUubnNfX2dldFF1b3RlKGFyZ3ZbMV0sIHEpKQorICAgIHNvYXBfcHJpbnRfZmF1bHQocXVvdGUuc29hcCwgc3RkZXJyKTsKKyAgZWxzZQorICB7IGlmIChhcmdjID4gMikKKyAgICB7IHJhdGU6OlNlcnZpY2UgcmF0ZTsKKyAgICAgIGZsb2F0IHI7CisgICAgICBpZiAocmF0ZS5uc19fZ2V0UmF0ZSgidXMiLCBhcmd2WzJdLCByKSkKKyAgICAgICAgc29hcF9wcmludF9mYXVsdChyYXRlLnNvYXAsIHN0ZGVycik7CisgICAgICBlbHNlCisgICAgICAgIHEgKj0gcjsKKyAgICB9CisgICAgY291dCA8PCBhcmd2WzFdIDw8ICI6ICIgPDwgcSA8PCBlbmRsOworICB9CisgIHJldHVybiAwOworfQorCituYW1lc3BhY2UgY2FsYyB7CisKK2ludCBuc19fYWRkKHN0cnVjdCBzb2FwICpzb2FwLCBkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSAqcmVzdWx0KQoreyAqcmVzdWx0ID0gYSArIGI7CisgIHJldHVybiBTT0FQX09LOworfQorCitpbnQgbnNfX3N1YihzdHJ1Y3Qgc29hcCAqc29hcCwgZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgKnJlc3VsdCkKK3sgKnJlc3VsdCA9IGEgLSBiOworICByZXR1cm4gU09BUF9PSzsKK30KKworaW50IG5zX19tdWwoc3RydWN0IHNvYXAgKnNvYXAsIGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlICpyZXN1bHQpCit7ICpyZXN1bHQgPSBhICogYjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK2ludCBuc19fZGl2KHN0cnVjdCBzb2FwICpzb2FwLCBkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSAqcmVzdWx0KQoreyAqcmVzdWx0ID0gYSAvIGI7CisgIHJldHVybiBTT0FQX09LOworfQorCit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL2NvbXBvbmVudHMvY3BwL3F1b3RlLmggYi9zYW1wbGVzL2NvbXBvbmVudHMvY3BwL3F1b3RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJlYzk3OAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvY29tcG9uZW50cy9jcHAvcXVvdGUuaApAQCAtMCwwICsxLDEyIEBACituYW1lc3BhY2UgcXVvdGUgeworCisvL2dzb2FwIG5zIHNlcnZpY2UgbmFtZToJU2VydmljZQorLy9nc29hcCBucyBzZXJ2aWNlIHN0eWxlOglycGMKKy8vZ3NvYXAgbnMgc2VydmljZSBlbmNvZGluZzoJZW5jb2RlZAorLy9nc29hcCBucyBzZXJ2aWNlIGxvY2F0aW9uOglodHRwOi8vc2VydmljZXMueG1ldGhvZHMubmV0L3NvYXAKKy8vZ3NvYXAgbnMgc2VydmljZSBuYW1lc3BhY2U6CXVybjp4bWV0aG9kcy1kZWxheWVkLXF1b3RlcworCisvL2dzb2FwIG5zIHNlcnZpY2UgbWV0aG9kLWFjdGlvbjogZ2V0UXVvdGUgIiIKK2ludCBuc19fZ2V0UXVvdGUoY2hhciAqc3ltYm9sLCBmbG9hdCAmUmVzdWx0KTsKKworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9jb21wb25lbnRzL2NwcC9yYXRlLmggYi9zYW1wbGVzL2NvbXBvbmVudHMvY3BwL3JhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTA5M2I3Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9jb21wb25lbnRzL2NwcC9yYXRlLmgKQEAgLTAsMCArMSwxMiBAQAorbmFtZXNwYWNlIHJhdGUgeworCisvL2dzb2FwIG5zIHNlcnZpY2UgbmFtZToJU2VydmljZQorLy9nc29hcCBucyBzZXJ2aWNlIHN0eWxlOglycGMKKy8vZ3NvYXAgbnMgc2VydmljZSBlbmNvZGluZzoJZW5jb2RlZAorLy9nc29hcCBucyBzZXJ2aWNlIGxvY2F0aW9uOglodHRwOi8vc2VydmljZXMueG1ldGhvZHMubmV0L3NvYXAKKy8vZ3NvYXAgbnMgc2VydmljZSBuYW1lc3BhY2U6CXVybjp4bWV0aG9kcy1DdXJyZW5jeUV4Y2hhbmdlCisKKy8vZ3NvYXAgbnMgc2VydmljZSBtZXRob2QtYWN0aW9uOiBnZXRSYXRlICIiCitpbnQgbnNfX2dldFJhdGUoY2hhciAqY291bnRyeTEsIGNoYXIgKmNvdW50cnkyLCBmbG9hdCAmUmVzdWx0KTsKKworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kaW1lL01ha2VmaWxlIGIvc2FtcGxlcy9kaW1lL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3Zjc4ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RpbWUvTWFrZWZpbGUKQEAgLTAsMCArMSwyMyBAQAorR1NPQVA9Li4vLi4vc29hcGNwcDIKK1NPQVBIPS4uLy4uL3N0ZHNvYXAyLmgKK1NPQVBDPS4uLy4uL3N0ZHNvYXAyLmMKK1NPQVBDUFA9Li4vLi4vc3Rkc29hcDIuY3BwCitDQz1nY2MKK0NQUD1nKysKK0xJQlM9CitDT0ZMQUdTPS1PMgorQ1dGTEFHUz0tV2FsbAorQ0lGTEFHUz0tSS4uLy4uCitDTUZMQUdTPQorQ0ZMQUdTPSAkKENXRkxBR1MpICQoQ09GTEFHUykgJChDSUZMQUdTKSAkKENNRkxBR1MpCithbGw6CQlkaW1lY2xpZW50IGRpbWVzZXJ2ZXIKK2RpbWVjbGllbnQ6CWRpbWUuaCBkaW1lY2xpZW50LmNwcCAkKFNPQVBIKSAkKFNPQVBDUFApCisJCSQoR1NPQVApIGRpbWUuaAorCQkkKENQUCkgJChDRkxBR1MpIC1vIGRpbWVjbGllbnQgZGltZWNsaWVudC5jcHAgc29hcEMuY3BwIHNvYXBDbGllbnQuY3BwICQoU09BUENQUCkgJChMSUJTKQorZGltZXNlcnZlcjoJZGltZS5oIGRpbWVzZXJ2ZXIuY3BwICQoU09BUEgpICQoU09BUENQUCkKKwkJJChHU09BUCkgZGltZS5oCisJCSQoQ1BQKSAkKENGTEFHUykgLW8gZGltZXNlcnZlciBkaW1lc2VydmVyLmNwcCBzb2FwQy5jcHAgc29hcFNlcnZlci5jcHAgJChTT0FQQ1BQKSAtbHB0aHJlYWQgJChMSUJTKQorY2xlYW46CisJCXJtIC1mICoubyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5LmgKK2Rpc3RjbGVhbjoKKwkJcm0gLWYgKi5vICoud3NkbCAqLnhzZCAqLnhtbCAqLm5zbWFwICoubG9nIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaCBkaW1lY2xpZW50IGRpbWVzZXJ2ZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGltZS9NYWtlZmlsZVNvbGFyaXMgYi9zYW1wbGVzL2RpbWUvTWFrZWZpbGVTb2xhcmlzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmY2JmZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RpbWUvTWFrZWZpbGVTb2xhcmlzCkBAIC0wLDAgKzEsMjMgQEAKK0dTT0FQPS4uLy4uL3NvYXBjcHAyCitTT0FQSD0uLi8uLi9zdGRzb2FwMi5oCitTT0FQQz0uLi8uLi9zdGRzb2FwMi5jCitTT0FQQ1BQPS4uLy4uL3N0ZHNvYXAyLmNwcAorQ0M9Z2NjCitDUFA9ZysrCitMSUJTPS1seG5ldCAtbG5zbCAtbHNvY2tldAorQ09GTEFHUz0tTzIKK0NXRkxBR1M9LVdhbGwKK0NJRkxBR1M9LUkuLi8uLgorQ01GTEFHUz0KK0NGTEFHUz0gJChDV0ZMQUdTKSAkKENPRkxBR1MpICQoQ0lGTEFHUykgJChDTUZMQUdTKQorYWxsOgkJZGltZWNsaWVudCBkaW1lc2VydmVyCitkaW1lY2xpZW50OglkaW1lLmggZGltZWNsaWVudC5jcHAgJChTT0FQSCkgJChTT0FQQ1BQKQorCQkkKEdTT0FQKSBkaW1lLmgKKwkJJChDUFApICQoQ0ZMQUdTKSAtbyBkaW1lY2xpZW50IGRpbWVjbGllbnQuY3BwIHNvYXBDLmNwcCBzb2FwQ2xpZW50LmNwcCAkKFNPQVBDUFApICQoTElCUykKK2RpbWVzZXJ2ZXI6CWRpbWUuaCBkaW1lc2VydmVyLmNwcCAkKFNPQVBIKSAkKFNPQVBDUFApCisJCSQoR1NPQVApIGRpbWUuaAorCQkkKENQUCkgJChDRkxBR1MpIC1vIGRpbWVzZXJ2ZXIgZGltZXNlcnZlci5jcHAgc29hcEMuY3BwIHNvYXBTZXJ2ZXIuY3BwICQoU09BUENQUCkgLWxwdGhyZWFkICQoTElCUykKK2NsZWFuOgorCQlybSAtZiAqLm8gc29hcEguaCBzb2FwU3R1Yi5oIHNvYXBDLmNwcCBzb2FwQy5jIHNvYXBDbGllbnQuY3BwIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmNwcCBzb2FwU2VydmVyLmMgc29hcCpQcm94eS5oCitkaXN0Y2xlYW46CisJCXJtIC1mICoubyAqLndzZGwgKi54c2QgKi54bWwgKi5uc21hcCAqLmxvZyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5LmggZGltZWNsaWVudCBkaW1lc2VydmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL2RpbWUvZGltZS5oIGIvc2FtcGxlcy9kaW1lL2RpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2I3M2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kaW1lL2RpbWUuaApAQCAtMCwwICsxLDQxIEBACisvL2dzb2FwIG5zIHNlcnZpY2UgbmFtZToJZGltZQorLy9nc29hcCBucyBzZXJ2aWNlIHN0eWxlOglycGMKKy8vZ3NvYXAgbnMgc2VydmljZSBlbmNvZGluZzoJZW5jb2RlZAorLy9nc29hcCBucyBzZXJ2aWNlIG5hbWVzcGFjZToJaHR0cDovL3dlYnNydi5jcy5mc3UuZWR1L35lbmdlbGVuL2RpbWUud3NkbAorLy9nc29hcCBucyBzZXJ2aWNlIGxvY2F0aW9uOglodHRwOi8vd2Vic3J2LmNzLmZzdS5lZHUvfmVuZ2VsZW4vZGltZXNydi5jZ2kKKworLy9nc29hcCBucyBzY2hlbWEgIG5hbWVzcGFjZToJdXJuOmRpbWUKK2NsYXNzIG5zX19EYXRhCit7IHVuc2lnbmVkIGNoYXIgKl9fcHRyOyAvKiBwb2ludHMgdG8gZGF0YSAqLworICBpbnQgX19zaXplOwkJLyogc2l6ZSBvZiBkYXRhICovCisgIGNoYXIgKmlkOwkJLyogZGltZSBhdHRhY2htZW50IElEIChzZXQgdG8gTlVMTCB0byBvYnRhaW4gdW5pcXVlIGNpZCkgKi8KKyAgY2hhciAqdHlwZTsJCS8qIGRpbWUgYXR0YWNobWVudCBjb250ZW50IHR5cGUgKi8KKyAgY2hhciAqb3B0aW9uczsJLyogZGltZSBhdHRhY2htZW50IG9wdGlvbnMgKG9wdGlvbmFsKSAqLworICBuc19fRGF0YSgpOworICBzdHJ1Y3Qgc29hcCAqc29hcDsJLyogc29hcCBjb250ZXh0IHRoYXQgY3JlYXRlZCB0aGlzIGluc3RhbmNlICovCit9OworY2xhc3MgYXJyYXlPZkRhdGEJLyogU09BUCBhcnJheSBvZiBkYXRhICovCit7IG5zX19EYXRhICpfX3B0cjsKKyAgaW50IF9fc2l6ZTsKKyAgYXJyYXlPZkRhdGEoKTsKKyAgYXJyYXlPZkRhdGEoc3RydWN0IHNvYXAqLCBpbnQpOworICB2aXJ0dWFsIH5hcnJheU9mRGF0YSgpOworICBpbnQgc2l6ZSgpOworICB2b2lkIHJlc2l6ZShpbnQpOworICBuc19fRGF0YSYgb3BlcmF0b3JbXShpbnQpIGNvbnN0OworICBzdHJ1Y3Qgc29hcCAqc29hcDsKK307CitjbGFzcyBhcnJheU9mTmFtZQkvKiBTT0FQIGFycmF5IG9mIHN0cmluZ3MgKi8KK3sgY2hhciAqKl9fcHRyOworICBpbnQgX19zaXplOworICBhcnJheU9mTmFtZSgpOworICBhcnJheU9mTmFtZShzdHJ1Y3Qgc29hcCosIGludCk7CisgIHZpcnR1YWwgfmFycmF5T2ZOYW1lKCk7CisgIGludCBzaXplKCk7CisgIHZvaWQgcmVzaXplKGludCk7CisgIGNoYXIqJiBvcGVyYXRvcltdKGludCkgY29uc3Q7CisgIHN0cnVjdCBzb2FwICpzb2FwOworfTsKK2ludCBuc19fcHV0RGF0YShhcnJheU9mRGF0YSAqZGF0YSwgYXJyYXlPZk5hbWUgKm5hbWVzKTsKK2ludCBuc19fZ2V0RGF0YShhcnJheU9mTmFtZSAqbmFtZXMsIGFycmF5T2ZEYXRhICpkYXRhKTsKK2ludCBuc19fZ2V0SW1hZ2UoY2hhciAqbmFtZSwgbnNfX0RhdGEgJmltYWdlKTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGltZS9kaW1lY2xpZW50LmNwcCBiL3NhbXBsZXMvZGltZS9kaW1lY2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGIxZjcxCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kaW1lL2RpbWVjbGllbnQuY3BwCkBAIC0wLDAgKzEsMzg4IEBACisvKglkaW1lY2xpZW50LmNwcAorCisJRXhhbXBsZSBzdHJlYW1pbmcgRElNRSBjbGllbnQgZm9yIERJTUUgc2VydmVyIChkaW1lc2VydmVyLmNwcCkuCisJU3VwcG9ydHMgdGhyZWUgbWV0aG9kczoKKworCXB1dERhdGEgc3RvcmVzIG11bHRpcGxlIGRhdGEgc2V0cyBvbiB0aGUgc2VydmVyIGFuZCByZXR1cm5zCisJCW5hbWVkIHJlZmVyZW5jZXMgdG8gZWFjaCBkYXRhIHNldAorCWdldERhdGEgcmV0cmlldmVzIGRhdGEgc2V0cyBnaXZlbiBuYW1lZCByZWZlcmVuY2VzLgorCWdldEltYWdlIGlzIGFuIGV4YW1wbGUgZmlsZS1iYXNlZCBpbWFnZSByZXRyaWV2YWwgbWV0aG9kCisKKwlDaGFuZ2UgdGhlIGVuZHBvaW50IGluIGRpbWUuaCB0byB5b3VyIG5lZWRzLgorCisJQ29weXJpZ2h0IChDKSAyMDAwLTIwMDMgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLCBHZW5pdmlhLCBJbmMuCisJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCVVzYWdlIChzZXJ2ZXIpOgorCisJU3RhcnQgZGltZXNlcnZlciBvbiB5b3VyIGhvc3QgYXQgcG9ydCA4MDg1IChzZWUgZGltZXNlcnZlci5jcHApOgorCisJZGltZXNlcnZlciA4MDg1ICYKKworCVVzYWdlIChjbGllbnQpOgorCisJZGltZWNsaWVudCBbLXBdIFstZ10gWy1pXSBuYW1lIC4uLgorCisJZGltZWNsaWVudAorCQlXaXRob3V0IGFyZ3MgcmV0cmlldmVzIGltYWdlLmpwZworCWRpbWVjbGllbnQgbmFtZQorCQlSZXRyaWV2ZXMgaW1hZ2Ugc3RvcmVkIHVuZGVyIG5hbWUKKwlkaW1lY2xpZW50IC1wIG5hbWUxIG5hbWUyIC4uLgorCQlTdG9yZXMgZmlsZXMgbmFtZTEsIG5hbWUyLCBldGMuIFRoZSBzdG9yYWdlIGtleXMgYXJlIHByaW50ZWQuCisJCVRoZSBrZXlzIHByb3ZpZGUgYWNjZXNzIHRvIHRoZSBkYXRhIG9uIHRoZSBzZXJ2ZXIuCisJZGltZWNsaWVudCAtZyBuYW1lMSBuYW1lMiAuLi4KKwkJUmV0cmlldmVzIGZpbGVzIHN0b3JlZCB1bmRlciBrZXlzIG5hbWUxLCBuYW1lMiwgZXRjLgorCQlUaGUga2V5cyBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIGtleXMgcmV0dXJuZWQgd2hlbiBzdG9yaW5nCisJCWZpbGVzLiBGaWxlcyBhcmUgc3RvcmVkIGxvY2FsbHkgdW5kZXIgdGhlIGtleSBuYW1lLgorCisJVW5peC9MaW51eDogYWRkIGEgc2lncGlwZSBoYW5kbGVyIHRvIGF2b2lkIGJyb2tlbiBwaXBlcy4KKyovCisKKyNpbmNsdWRlICJzb2FwSC5oIgorI2luY2x1ZGUgImRpbWUubnNtYXAiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKy8vIHVzZSB0aGUgZGVmYXVsdCBlbmRwb2ludCBzZXQgaW4gZGltZS5oIGZvciBkZW1vOgorY29uc3QgY2hhciAqZW5kcG9pbnQgPSBOVUxMOworLy8gdXNlIHRoZSBsb2NhbGhvc3QgZm9yIC1wIGFuZCAtZyAocHV0IGFuZCBnZXQpOgorY29uc3QgY2hhciAqbG9jYWxob3N0ID0gImh0dHA6Ly9sb2NhbGhvc3Q6ODA4NSI7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JRm9yd2FyZCBkZWNscworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyB2b2lkIHB1dERhdGEoc3RydWN0IHNvYXAqLCBpbnQsIGNoYXIqKik7CitzdGF0aWMgdm9pZCBnZXREYXRhKHN0cnVjdCBzb2FwKiwgaW50LCBjaGFyKiopOworc3RhdGljIHZvaWQgZ2V0SW1hZ2Uoc3RydWN0IHNvYXAqLCBjaGFyKik7CitzdGF0aWMgdm9pZCBzYXZlRGF0YShuc19fRGF0YSYsIGNvbnN0IGNoYXIqKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwlTdHJlYW1pbmcgRElNRSBhdHRhY2htZW50IGNvbnRlbnQgaGFuZGxlcnMKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgdm9pZCAqZGltZV9yZWFkX29wZW4oc3RydWN0IHNvYXAqLCB2b2lkKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitzdGF0aWMgdm9pZCBkaW1lX3JlYWRfY2xvc2Uoc3RydWN0IHNvYXAqLCB2b2lkKik7CitzdGF0aWMgc2l6ZV90IGRpbWVfcmVhZChzdHJ1Y3Qgc29hcCosIHZvaWQqLCBjaGFyKiwgc2l6ZV90KTsKK3N0YXRpYyB2b2lkICpkaW1lX3dyaXRlX29wZW4oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyB2b2lkIGRpbWVfd3JpdGVfY2xvc2Uoc3RydWN0IHNvYXAqLCB2b2lkKik7CitzdGF0aWMgaW50IGRpbWVfd3JpdGUoc3RydWN0IHNvYXAqLCB2b2lkKiwgY29uc3QgY2hhciosIHNpemVfdCk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JTWFpbgorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sgc3RydWN0IHNvYXAgc29hcDsKKyAgLy8gdXNlIEhUVFAgMS4xIGNodW5raW5nCisgIC8vIEhUVFAgY2h1bmtpbmcgYWxsb3dzIHN0cmVhbWluZyBvZiBESU1FIGNvbnRlbnQgd2l0aG91dCByZXF1aXJpbmcgRElNRSBhdHRhY2htZW50IHNpemUgdG8gYmUgc2V0CisgIC8vIERJTUUgYXR0YWNobWVudHMgY2FuIGJlIHN0cmVhbWVkIHdpdGhvdXQgY2h1bmtpbmcgT05MWSBpZiB0aGUgYXR0YWNobWVudCBzaXplIGlzIHNldAorICBzb2FwX2luaXQxKCZzb2FwLCBTT0FQX0lPX0NIVU5LKTsKKyAgLy8gc2V0IERJTUUgY2FsbGJhY2tzCisgIHNvYXAuZmRpbWVyZWFkb3BlbiA9IGRpbWVfcmVhZF9vcGVuOworICBzb2FwLmZkaW1lcmVhZGNsb3NlID0gZGltZV9yZWFkX2Nsb3NlOworICBzb2FwLmZkaW1lcmVhZCA9IGRpbWVfcmVhZDsKKyAgc29hcC5mZGltZXdyaXRlb3BlbiA9IGRpbWVfd3JpdGVfb3BlbjsKKyAgc29hcC5mZGltZXdyaXRlY2xvc2UgPSBkaW1lX3dyaXRlX2Nsb3NlOworICBzb2FwLmZkaW1ld3JpdGUgPSBkaW1lX3dyaXRlOworICAvLyBjb25uZWN0IHRpbWVvdXQgdmFsdWUgKG5vdCBzdXBwb3J0ZWQgYnkgTGludXgpCisgIHNvYXAuY29ubmVjdF90aW1lb3V0ID0gMTA7CisgIC8vIElPIHRpbWVvdXRzCisgIHNvYXAuc2VuZF90aW1lb3V0ID0gMzA7CisgIHNvYXAucmVjdl90aW1lb3V0ID0gMzA7CisgIC8vIFVuaXgvTGludXggU0lHUElQRSwgdGhpcyBpcyBPUyBkZXBlbmRlbnQ6CisgIC8vIHNvYXAuYWNjZXB0X2ZsYWdzID0gU09fTk9TSUdQSVBFOwkvLyBzb21lIHN5c3RlbXMgbGlrZSB0aGlzCisgIC8vIHNvYXAuc29ja2V0X2ZsYWdzID0gTVNHX05PU0lHTkFMOwkvLyBvdGhlcnMgbmVlZCB0aGlzCisgIC8vIHNpZ25hbChTSUdQSVBFLCBzaWdwaXBlX2hhbmRsZSk7CS8vIG9yIGEgc2lncGlwZSBoYW5kbGVyIChwb3J0YWJsZSkKKyAgaWYgKGFyZ2MgPCAzKQorICB7IGNoYXIgKm5hbWU7CisgICAgaWYgKGFyZ2MgPCAyKQorICAgICAgbmFtZSA9ICJpbWFnZS5qcGciOworICAgIGVsc2UKKyAgICAgIG5hbWUgPSBhcmd2WzFdOworICAgIGdldEltYWdlKCZzb2FwLCBuYW1lKTsKKyAgfQorICBlbHNlCisgIHsgc3dpdGNoIChhcmd2WzFdWzFdKQorICAgIHsgY2FzZSAncCc6CisJZW5kcG9pbnQgPSBsb2NhbGhvc3Q7CisgICAgICAgIHB1dERhdGEoJnNvYXAsIGFyZ2MsIGFyZ3YpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ2cnOgorCWVuZHBvaW50ID0gbG9jYWxob3N0OworICAgICAgICBnZXREYXRhKCZzb2FwLCBhcmdjLCBhcmd2KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBbLXBdIFstZ10gbmFtZSAuLi5cbiIpOworCWV4aXQoMCk7CisgICAgfQorICB9CisgIHNvYXBfZGVzdHJveSgmc29hcCk7CisgIHNvYXBfZW5kKCZzb2FwKTsKKyAgc29hcF9kb25lKCZzb2FwKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JSGVscGVyIGZ1bmN0aW9ucworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyB2b2lkIHB1dERhdGEoc3RydWN0IHNvYXAgKnNvYXAsIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sgYXJyYXlPZkRhdGEgZGF0YTsKKyAgYXJyYXlPZk5hbWUgbmFtZXM7CisgIGRhdGEucmVzaXplKGFyZ2MgLSAyKTsKKyAgZm9yIChpbnQgaSA9IDI7IGkgPCBhcmdjOyBpKyspCisgIHsgZGF0YVtpIC0gMl0uX19wdHIgPSAodW5zaWduZWQgY2hhciopYXJndltpXTsKKyAgICAvLyBNVVNUIHNldCBpZCBvciB0eXBlIHRvIGVuYWJsZSBESU1FCisgICAgLy8gemVybyBzaXplIGluZGljYXRlcyBzdHJlYW1pbmcgRElNRSAodGhpcyByZXF1aXJlcyBIVFRQIGNodW5raW5nKQorICAgIGRhdGFbaSAtIDJdLnR5cGUgPSAiIjsKKyAgfQorICBpZiAoc29hcF9jYWxsX25zX19wdXREYXRhKHNvYXAsIGVuZHBvaW50LCBOVUxMLCAmZGF0YSwgJm5hbWVzKSkKKyAgICBzb2FwX3ByaW50X2ZhdWx0KHNvYXAsIHN0ZGVycik7CisgIGVsc2UKKyAgeyBwcmludGYoIkRhdGEgc3RvcmVkIHdpdGgga2V5czpcbiIpOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgbmFtZXMuc2l6ZSgpOyBqKyspCisgICAgICBwcmludGYoIlx0JXNcbiIsIG5hbWVzW2pdKTsKKyAgICBwcmludGYoIlVzZSB0aGVzZSBrZXlzIHRvIHJldHJpZXZlIHRoZSBkYXRhXG4iKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBnZXREYXRhKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7IGFycmF5T2ZEYXRhIGRhdGE7CisgIGFycmF5T2ZOYW1lIG5hbWVzOworICBuYW1lcy5yZXNpemUoYXJnYyAtIDIpOworICBmb3IgKGludCBpID0gMjsgaSA8IGFyZ2M7IGkrKykKKyAgICBuYW1lc1tpIC0gMl0gPSBhcmd2W2ldOworICBzb2FwLT51c2VyID0gKHZvaWQqKW5hbWVzLl9fcHRyOworICBpZiAoc29hcF9jYWxsX25zX19nZXREYXRhKHNvYXAsIGVuZHBvaW50LCBOVUxMLCAmbmFtZXMsICZkYXRhKSkKKyAgICBzb2FwX3ByaW50X2ZhdWx0KHNvYXAsIHN0ZGVycik7CisgIGVsc2UKKyAgeyBmb3IgKGludCBqID0gMDsgaiA8IGRhdGEuc2l6ZSgpOyBqKyspCisgICAgICBpZiAoIWRhdGFbal0uaWQpCisgICAgICAgIHNhdmVEYXRhKGRhdGFbal0sIGFyZ3ZbaiArIDJdKTsKKyAgICBwcmludGYoIkRhdGEgcmV0cmlldmVkXG4iKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBnZXRJbWFnZShzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqbmFtZSkKK3sgbnNfX0RhdGEgaW1hZ2U7CisgIGFycmF5T2ZOYW1lIHRlbXA7CisgIHRlbXAucmVzaXplKDEpOworICB0ZW1wWzBdID0gbmFtZTsKKyAgc29hcC0+dXNlciA9ICh2b2lkKil0ZW1wLl9fcHRyOworICBpZiAoc29hcF9jYWxsX25zX19nZXRJbWFnZShzb2FwLCBlbmRwb2ludCwgTlVMTCwgbmFtZSwgaW1hZ2UpKQorICAgIHNvYXBfcHJpbnRfZmF1bHQoc29hcCwgc3RkZXJyKTsKKyAgZWxzZSBpZiAoaW1hZ2UuaWQpCisgIHsgaWYgKGltYWdlLl9fc2l6ZSkKKyAgICAgIHByaW50ZigiR290IGltYWdlICVzIHNpemU9JWQgdHlwZT0lcyB0aHJvdWdoIHN0cmVhbWluZyBESU1FXG4iLCBuYW1lLCBpbWFnZS5fX3NpemUsIGltYWdlLnR5cGU/aW1hZ2UudHlwZToiIik7CisgICAgZWxzZQorICAgICAgcHJpbnRmKCJHb3QgaW1hZ2UgJXMgdHlwZT0lcyB0aHJvdWdoIGNodW5rZWQgc3RyZWFtaW5nIERJTUVcbiIsIG5hbWUsIGltYWdlLnR5cGU/aW1hZ2UudHlwZToiIik7CisgIH0KKyAgZWxzZQorICB7IHByaW50ZigiR290IGltYWdlICVzXG4iLCBuYW1lKTsKKyAgICBzYXZlRGF0YShpbWFnZSwgbmFtZSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgc2F2ZURhdGEobnNfX0RhdGEmIGRhdGEsIGNvbnN0IGNoYXIgKm5hbWUpCit7IGNoYXIgKmJ1ZiA9IChjaGFyKilkYXRhLl9fcHRyOworICBpbnQgbGVuID0gZGF0YS5fX3NpemU7CisgIEZJTEUgKmZkID0gZm9wZW4obmFtZSwgIndiIik7CisgIGlmICghZmQpCisgIHsgZnByaW50ZihzdGRlcnIsICJDYW5ub3Qgc2F2ZSBmaWxlICVzXG4iLCBuYW1lKTsKKyAgICByZXR1cm47CisgIH0KKyAgd2hpbGUgKGxlbikKKyAgeyBzaXplX3QgbndyaXR0ZW4gPSBmd3JpdGUoYnVmLCAxLCBsZW4sIGZkKTsKKyAgICBpZiAoIW53cml0dGVuKQorICAgIHsgZnByaW50ZihzdGRlcnIsICJDYW5ub3Qgd3JpdGUgdG8gJXNcbiIsIG5hbWUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBsZW4gLT0gbndyaXR0ZW47CisgICAgYnVmICs9IG53cml0dGVuOworICB9CisgIHByaW50ZigiU2F2ZWQgZmlsZSAlc1xuIiwgbmFtZSk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JU3RyZWFtaW5nIERJTUUgYXR0YWNobWVudCBjb250ZW50IGhhbmRsZXJzCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIHZvaWQgKmRpbWVfcmVhZF9vcGVuKHN0cnVjdCBzb2FwICpzb2FwLCB2b2lkICpoYW5kbGUsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICpvcHRpb25zKQoreyBGSUxFICpmZDsKKyAgLy8gd2Ugc2hvdWxkIHJldHVybiBOVUxMIHdpdGhvdXQgc2V0dGluZyBzb2FwLT5lcnJvciBpZiB3ZSBkb24ndCB3YW50IHRvIHVzZSB0aGUgc3RyZWFtaW5nIGNhbGxiYWNrIGZvciB0aGlzIERJTUUgYXR0YWNobWVudC4gVGhlIGhhbmRsZSBjb250YWlucyB0aGUgbm9uLU5VTEwgX19wdHIgZmllbGQgdmFsdWUgd2hpY2ggc2hvdWxkIGhhdmUgYmVlbiBzZXQgaW4gdGhlIGFwcGxpY2F0aW9uLgorICAvLyByZXR1cm4gdmFsdWUgb2YgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIHBhc3NlZCBvbiB0byB0aGUgZmRpbWVyZWFkIGFuZCBmZGltZXJlYWRjbG9zZSBjYWxsYmFja3MuIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBub3QgYWZmZWN0IHRoZSBfX3B0ciBmaWVsZC4KKyAgZmQgPSBmb3BlbigoY2hhciopaGFuZGxlLCAicmIiKTsKKyAgcmV0dXJuICh2b2lkKilmZDsKK30KKworc3RhdGljIHZvaWQgZGltZV9yZWFkX2Nsb3NlKHN0cnVjdCBzb2FwICpzb2FwLCB2b2lkICpoYW5kbGUpCit7IGZjbG9zZSgoRklMRSopaGFuZGxlKTsKK30KKworc3RhdGljIHNpemVfdCBkaW1lX3JlYWQoc3RydWN0IHNvYXAgKnNvYXAsIHZvaWQgKmhhbmRsZSwgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreyByZXR1cm4gZnJlYWQoYnVmLCAxLCBsZW4sIChGSUxFKiloYW5kbGUpOworfQorCitzdGF0aWMgdm9pZCAqZGltZV93cml0ZV9vcGVuKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqb3B0aW9ucykKK3sgLy8gd2UgY2FuIHJldHVybiBOVUxMIHdpdGhvdXQgc2V0dGluZyBzb2FwLT5lcnJvciBpZiB3ZSBkb24ndCB3YW50IHRvIHVzZSB0aGUgc3RyZWFtaW5nIGNhbGxiYWNrIGZvciB0aGlzIERJTUUgYXR0YWNobWVudAorICBGSUxFICpoYW5kbGUgPSBOVUxMOworICBjaGFyICpuYW1lOworICAvLyBnZXQgZmlsZSBuYW1lIGZyb20gb3B0aW9ucyAobm90ICdcMCcgdGVybWluYXRlZCkKKyAgaWYgKG9wdGlvbnMpCisgIHsgc2l6ZV90IGxlbiA9ICgodW5zaWduZWQgY2hhcilvcHRpb25zWzJdIDw8IDgpIHwgKCh1bnNpZ25lZCBjaGFyKW9wdGlvbnNbM10pOyAvLyBvcHRpb24gc3RyaW5nIGxlbmd0aAorICAgIG5hbWUgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgbGVuICsgMSk7CisgICAgc3RybmNweShuYW1lLCBvcHRpb25zICsgNCwgbGVuKTsKKyAgICBuYW1lW2xlbl0gPSAnXDAnOworICAgIGhhbmRsZSA9IGZvcGVuKG5hbWUsICJ3YiIpOworICAgIGlmICghaGFuZGxlKQorICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsgLy8gY291bGQgbm90IG9wZW4gZmlsZSBmb3Igd3JpdGluZworICAgICAgc29hcC0+ZXJybnVtID0gZXJybm87IC8vIGdldCByZWFzb24KKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgfQorICBlbHNlIAorICAgIHNvYXAtPmVycm9yID0gc29hcF9yZWNlaXZlcl9mYXVsdChzb2FwLCAiQ2Fubm90IHNhdmUgdG8gZmlsZSwgYmVjYXVzZSBubyBmaWxlIG5hbWUgd2FzIHByZXNlbnQgaW4gYXR0YWNobWVudCIsIE5VTEwpOworICByZXR1cm4gKHZvaWQqKWhhbmRsZTsKK30KKworc3RhdGljIHZvaWQgZGltZV93cml0ZV9jbG9zZShzdHJ1Y3Qgc29hcCAqc29hcCwgdm9pZCAqaGFuZGxlKQoreyBmY2xvc2UoKEZJTEUqKWhhbmRsZSk7Cit9CisKK3N0YXRpYyBpbnQgZGltZV93cml0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgdm9pZCAqaGFuZGxlLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7IHdoaWxlIChsZW4pCisgIHsgc2l6ZV90IG53cml0dGVuID0gZndyaXRlKGJ1ZiwgMSwgbGVuLCAoRklMRSopaGFuZGxlKTsKKyAgICBpZiAoIW53cml0dGVuKQorICAgIHsgc29hcC0+ZXJybnVtID0gZXJybm87IC8vIGdldCByZWFzb24KKyAgICAgIHJldHVybiBTT0FQX0VPRjsKKyAgICB9CisgICAgbGVuIC09IG53cml0dGVuOworICAgIGJ1ZiArPSBud3JpdHRlbjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwluc19fRGF0YSBjbGFzcworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK25zX19EYXRhOjpuc19fRGF0YSgpCit7IF9fcHRyID0gTlVMTDsKKyAgX19zaXplID0gMDsKKyAgaWQgPSBOVUxMOworICB0eXBlID0gTlVMTDsKKyAgb3B0aW9ucyA9IE5VTEw7CisgIHNvYXAgPSBOVUxMOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCWFycmF5T2ZEYXRhIGNsYXNzCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYXJyYXlPZkRhdGE6OmFycmF5T2ZEYXRhKCkKK3sgX19wdHIgPSBOVUxMOworICBfX3NpemUgPSAwOworICBzb2FwID0gTlVMTDsKK30KKworYXJyYXlPZkRhdGE6OmFycmF5T2ZEYXRhKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbikKK3sgX19wdHIgPSBOVUxMOworICBfX3NpemUgPSAwOworICB0aGlzLT5zb2FwID0gc29hcDsKKyAgcmVzaXplKG4pOworfQorCithcnJheU9mRGF0YTo6fmFycmF5T2ZEYXRhKCkKK3sgcmVzaXplKDApOworfQorCitpbnQgYXJyYXlPZkRhdGE6OnNpemUoKQoreyByZXR1cm4gX19zaXplOworfQorCit2b2lkIGFycmF5T2ZEYXRhOjpyZXNpemUoaW50IG4pCit7IGlmIChfX3B0cikKKyAgeyBpZiAoc29hcCkgLy8gaWYgY3JlYXRlZCBieSBzb2FwIGVudmlyb25tZW50CisgICAgICBzb2FwX2RlbGV0ZShzb2FwLCBfX3B0cik7IC8vIHRoZW4gZGVsZXRlCisgICAgZWxzZQorICAgICAgZGVsZXRlW10gX19wdHI7CisgIH0KKyAgX19zaXplID0gbjsKKyAgaWYgKG4gPD0gMCkKKyAgICBfX3B0ciA9IE5VTEw7CisgIGVsc2UgaWYgKHNvYXApCisgICAgX19wdHIgPSBzb2FwX25ld19uc19fRGF0YShzb2FwLCBuKTsKKyAgZWxzZQorICAgIF9fcHRyID0gbmV3IG5zX19EYXRhW25dOworfQorCituc19fRGF0YSYgYXJyYXlPZkRhdGE6Om9wZXJhdG9yW10oaW50IGkpIGNvbnN0Cit7IGFzc2VydChfX3B0ciAmJiBpID49IDAgJiYgaSA8IF9fc2l6ZSk7CisgIHJldHVybiBfX3B0cltpXTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwlhcnJheU9mTmFtZSBjbGFzcworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2FycmF5T2ZOYW1lOjphcnJheU9mTmFtZSgpCit7IF9fcHRyID0gTlVMTDsKKyAgX19zaXplID0gMDsKKyAgc29hcCA9IE5VTEw7Cit9CisKK2FycmF5T2ZOYW1lOjphcnJheU9mTmFtZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4pCit7IF9fcHRyID0gTlVMTDsKKyAgX19zaXplID0gMDsKKyAgdGhpcy0+c29hcCA9IHNvYXA7CisgIHJlc2l6ZShuKTsKK30KKworYXJyYXlPZk5hbWU6On5hcnJheU9mTmFtZSgpCit7IHJlc2l6ZSgwKTsKK30KKworaW50IGFycmF5T2ZOYW1lOjpzaXplKCkKK3sgcmV0dXJuIF9fc2l6ZTsKK30KKwordm9pZCBhcnJheU9mTmFtZTo6cmVzaXplKGludCBuKQoreyBpZiAoX19wdHIpCisgIHsgaWYgKHNvYXApIC8vIGlmIGNyZWF0ZWQgYnkgc29hcCBlbnZpcm9ubWVudAorICAgICAgc29hcF9kZWxldGUoc29hcCwgX19wdHIpOyAvLyB0aGVuIGRlbGV0ZQorICAgIGVsc2UKKyAgICAgIGZyZWUoX19wdHIpOworICB9CisgIF9fc2l6ZSA9IG47CisgIGlmIChuIDw9IDApCisgICAgX19wdHIgPSBOVUxMOworICBlbHNlCisgIHsgaWYgKHNvYXApCisgICAgICBfX3B0ciA9IChjaGFyKiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKGNoYXIqKSAqIG4pOworICAgIGVsc2UKKyAgICAgIF9fcHRyID0gKGNoYXIqKiltYWxsb2Moc2l6ZW9mKGNoYXIqKSAqIG4pOworICAgIG1lbXNldChfX3B0ciwgMCwgbik7CisgIH0KK30KKworY2hhciomIGFycmF5T2ZOYW1lOjpvcGVyYXRvcltdKGludCBpKSBjb25zdAoreyBhc3NlcnQoX19wdHIgJiYgaSA+PSAwICYmIGkgPCBfX3NpemUpOworICByZXR1cm4gX19wdHJbaV07Cit9CisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGltZS9kaW1lc2VydmVyLmNwcCBiL3NhbXBsZXMvZGltZS9kaW1lc2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGYyYTc4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kaW1lL2RpbWVzZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsNDk1IEBACisvKglkaW1lc2VydmVyLmNwcAorCisJRXhhbXBsZSBzdHJlYW1pbmcgRElNRSBzZXJ2ZXIuIFN1cHBvcnRzIHRocmVlIG1ldGhvZHM6CisKKwlwdXREYXRhIHN0b3JlcyBtdWx0aXBsZSBkYXRhIHNldHMgb24gdGhlIHNlcnZlciBhbmQgcmV0dXJucyBuYW1lZCBrZXlzCisJCXRvIGVhY2ggZGF0YSBzZXQuIFRoZSBrZXlzIGFyZSB1bmlxdWUgYW5kIHByb3ZpZGUgYWNjZXNzIHRvCisJCXRoZSBkYXRhLiBPbmNlIGRhdGEgaXMgc3RvcmVkLCBpdCBjYW5ub3QgYmUgcmVtb3ZlZC4KKwlnZXREYXRhIHJldHJpZXZlcyBkYXRhIHNldHMgZ2l2ZW4gYSBzZXQgb2YgbmFtZWQga2V5cy4KKwlnZXRJbWFnZSBpcyBhbiBleGFtcGxlIGZpbGUtYmFzZWQgaW1hZ2UgcmV0cmlldmFsIG1ldGhvZAorCisJRGF0YSBpcyBzdG9yZWQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IG9yIHRoZSBkaXJlY3Rvcnkgc3BlY2lmaWVkCisJYnkgdGhlIFRNUERJUiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworCVJ1bnMgYXMgQ0dJIChub3QgbXVsdGktdGhyZWFkZWQpIG9yIG11bHRpLXRocmVhZGVkIHN0YW5kLWFsb25lCisJV2ViIHNlcnZpY2UKKworCUNvcHlyaWdodCAoQykgMjAwMC0yMDAzIFJvYmVydCBBLiB2YW4gRW5nZWxlbiwgR2VuaXZpYSwgSW5jLgorCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlOT1RFOiBUSEUgU0VSVkVSIFdJTEwgT05MWSBTRU5EIEZJTEVTIFRIQVQgQVJFIElOIFRIRSBDVVJSRU5UIERJUiBGT1IKKwlTRUNVUklUWSBSRUFTT05TLiBIT1dFVkVSLCBUSEUgQVVUSE9SIElTIE5PVCBSRVNQT05TSUJMRSBGT1IgQU5ZIERBTUFHRVMKKwlUSEFUIE1BWSBSRVNVTFQgRlJPTSBUSEUgVVNFIE9GIFRISVMgUFJPR1JBTS4KKwkKKwlVc2FnZToKKwlGb3Igc3RhbmQtYWxvbmUgV2ViIHNlcnZpY2UgZnVuY3Rpb25hbGl0eSwgcnVuIGZyb20gdGhlIGNvbW1hbmQgbGluZQorCXdpdGggcG9ydCBudW1iZXIgYXMgY29tbWFuZCBsaW5lIGFyZ3VtZW50LCBlLmcuCisJPiBkaW1lc2VydmVyIDgwODUgJgorCVVzZSBwb3J0IDgwIHRvIHJ1biBhcyBIVFRQIFdlYiBzZXJ2ZXIgYWNjZXNzaWJsZSBvdmVyIHRoZSBXZWIKKwlDaGFuZ2UgdGhlICdlbmRwb2ludCcgaW4gJ2RpbWVjbGllbnQuY3BwJyB0bworCWVuZHBvaW50PSJodHRwOi8vbWFjaGluZTo4MDg1IgorCXdoZXJlICdtYWNoaW5lJyBpcyB0aGUgaG9zdCBuYW1lIG9mIHRoZSBtYWNoaW5lIG9uIHdoaWNoIHRoZSBzZXJ2aWNlCisJcnVucywgb3IgJ2xvY2FsaG9zdCcgaWYgdGhlIHNlcnZlciBydW5zIG9uIHRoZSBzYW1lIG1hY2hpbmUuIEJlIGNhcmVmdWwKKwl0byBydW4gdGhlIGNsaWVudCBpbiBhIHNlcGFyYXRlIGRpcmVjdG9yeSBmcm9tIHRoZSBzZXJ2ZXIuIE90aGVyd2lzZSwKKwl0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgbWF5IGludGVyZmVyZSBpbiB0aGVpciBmaWxlIGFjY2Vzcy4KKworCVRoZSBzZXJ2aWNlIGlzIG11bHRpLXRocmVhZGVkLiBNdWx0aS10aHJlYWRpbmcgaXMgbm90IHJlcXVpcmVkLCBidXQgY2FuCisJaW1wcm92ZSBRb1MuIFJlbW92ZSB0aGUgcHRocmVhZCBjb2RlIHRvIG9idGFpbiBhIG5vbi1tdWx0aS10aHJlYWRlZAorCXNlcnZpY2UuCisKKwlVbml4L0xpbnV4OiBhZGQgYSBzaWdwaXBlIGhhbmRsZXIgdG8gYXZvaWQgYnJva2VuIHBpcGVzIHdpdGgKKwlzdGFuZC1hbG9uZSBzZXJ2ZXIuCisKKyovCisKKworI2luY2x1ZGUgInNvYXBILmgiCisjaW5jbHVkZSAiZGltZS5uc21hcCIKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CS8vIHVzZSBQdGhyZWFkcworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CS8vIHVzZSBmc3RhdCgpIGZvciBzdHJlYW1pbmcgRElNRQorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjZGVmaW5lIEJBQ0tMT0cJCSgxMDApCS8vIG1heCByZXF1ZXN0IGJhY2tsb2cKKyNkZWZpbmUgTUFYX0ZJTEVfU0laRQkoMTAwMDApCS8vIG1heCBmaWxlIHNpemUgd2hlbiBidWZmZXJpbmcgZmlsZSBmb3IgSFRUUCAxLjAgYW5kIGZpbGUgc2l6ZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCUZvcndhcmQgZGVjbHMKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgdm9pZCAqcHJvY2Vzc19yZXF1ZXN0KHZvaWQqKTsKK3N0YXRpYyBpbnQgZ2V0ZGF0YShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBuc19fRGF0YSYpOworc3RhdGljIHZvaWQgc2F2ZURhdGEobnNfX0RhdGEmLCBjb25zdCBjaGFyKik7CitzdGF0aWMgdm9pZCBzaWdwaXBlX2hhbmRsZShpbnQpOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCVN0cmVhbWluZyBESU1FIGF0dGFjaG1lbnQgY29udGVudCBoYW5kbGVycworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyB2b2lkICpkaW1lX3JlYWRfb3BlbihzdHJ1Y3Qgc29hcCosIHZvaWQqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyB2b2lkIGRpbWVfcmVhZF9jbG9zZShzdHJ1Y3Qgc29hcCosIHZvaWQqKTsKK3N0YXRpYyBzaXplX3QgZGltZV9yZWFkKHN0cnVjdCBzb2FwKiwgdm9pZCosIGNoYXIqLCBzaXplX3QpOworc3RhdGljIHZvaWQgKmRpbWVfd3JpdGVfb3BlbihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworc3RhdGljIHZvaWQgZGltZV93cml0ZV9jbG9zZShzdHJ1Y3Qgc29hcCosIHZvaWQqKTsKK3N0YXRpYyBpbnQgZGltZV93cml0ZShzdHJ1Y3Qgc29hcCosIHZvaWQqLCBjb25zdCBjaGFyKiwgc2l6ZV90KTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwlEYXRhIGZvciBzdHJlYW1pbmcgRElNRSB3cml0ZSBoYW5kbGVyCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RydWN0IGRpbWVfd3JpdGVfaGFuZGxlCit7IGNoYXIgKm5hbWU7CS8vIGZpbGUgbmFtZQorICBGSUxFICpmZDsJLy8gZmlsZSBmZAorfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwlTdGF0aWMgZGF0YQorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyBjaGFyICpUTVBESVIgPSAiLiI7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JTWFpbgorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sgc3RydWN0IHNvYXAgc29hcDsKKyAgY2hhciAqcyA9IGdldGVudigiVE1QRElSIik7CisgIGlmIChzKQorICAgIFRNUERJUiA9IHM7CisgIC8vIHVzZSBIVFRQIGNodW5raW5nIHdoZW4gcG9zc2libGUKKyAgLy8gY2h1bmtpbmcgYWxsb3dzIHN0cmVhbWluZyBvZiBESU1FIGNvbnRlbnQgd2l0aG91dCByZXF1aXJpbmcgRElNRSBhdHRhY2htZW50IHNpemUgdG8gYmUgc2V0CisgIC8vIERJTUUgYXR0YWNobWVudHMgY2FuIGJlIHN0cmVhbWVkIHdpdGhvdXQgY2h1bmtpbmcgb25seSBpZiB0aGUgYXR0YWNobWVudCBzaXplIGlzIHNldAorICBzb2FwX2luaXQxKCZzb2FwLCBTT0FQX0lPX0tFRVBBTElWRSB8IFNPQVBfSU9fQ0hVTkspOworICAvLyBzZXQgRElNRSBjYWxsYmFja3MKKyAgc29hcC5mZGltZXJlYWRvcGVuID0gZGltZV9yZWFkX29wZW47CisgIHNvYXAuZmRpbWVyZWFkY2xvc2UgPSBkaW1lX3JlYWRfY2xvc2U7CisgIHNvYXAuZmRpbWVyZWFkID0gZGltZV9yZWFkOworICBzb2FwLmZkaW1ld3JpdGVvcGVuID0gZGltZV93cml0ZV9vcGVuOworICBzb2FwLmZkaW1ld3JpdGVjbG9zZSA9IGRpbWVfd3JpdGVfY2xvc2U7CisgIHNvYXAuZmRpbWV3cml0ZSA9IGRpbWVfd3JpdGU7CisgIGlmIChhcmdjIDwgMikKKyAgeyAvLyBubyBhcmdzOiBhc3N1bWUgdGhpcyBpcyBhIENHSSBhcHBsaWNhdGlvbgorICAgIC8vIHNlcnZlIHJlcXVlc3QKKyAgICBzb2FwX3NlcnZlKCZzb2FwKTsKKyAgICAvLyBjbGVhbnVwIGNsYXNzIGluc3RhbmNlcworICAgIHNvYXBfZGVzdHJveSgmc29hcCk7CisgICAgLy8gY2xlYW51cAorICAgIHNvYXBfZW5kKCZzb2FwKTsKKyAgfQorICBlbHNlCisgIHsgc3RydWN0IHNvYXAgKnRzb2FwOworICAgIHB0aHJlYWRfdCB0aWQ7CisgICAgaW50IHBvcnQ7CisgICAgaW50IG0sIHMsIGk7CisgICAgLy8gVW5peCBTSUdQSVBFLCB0aGlzIGlzIE9TIGRlcGVuZGVudDoKKyAgICAvLyBzb2FwLmFjY2VwdF9mbGFncyA9IFNPX05PU0lHUElQRTsJLy8gc29tZSBzeXN0ZW1zIGxpa2UgdGhpcworICAgIC8vIHNvYXAuc29ja2V0X2ZsYWdzID0gTVNHX05PU0lHTkFMOwkvLyBvdGhlcnMgbmVlZCB0aGlzCisgICAgLy8gc2lnbmFsKFNJR1BJUEUsIHNpZ3BpcGVfaGFuZGxlKTsJCS8vIG9yIGEgc2lncGlwZSBoYW5kbGVyIChwb3J0YWJsZSkKKyAgICAvLyBwb3J0IGlzIGZpcnN0IGNvbW1hbmQgbGluZSBhcmd1bWVudAorICAgIHBvcnQgPSBhdG9pKGFyZ3ZbMV0pOworICAgIC8vIGJpbmQgdG8gY3VycmVudCBob3N0IGFuZCBzcGVjaWZpZWQgcG9ydAorICAgIG0gPSBzb2FwX2JpbmQoJnNvYXAsIE5VTEwsIHBvcnQsIEJBQ0tMT0cpOworICAgIC8vIGlmIHdlIGNvdWxkIG5vdCBiaW5kLCBleGl0CisgICAgaWYgKG0gPCAwKQorICAgIHsgc29hcF9wcmludF9mYXVsdCgmc29hcCwgc3RkZXJyKTsKKyAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIGZwcmludGYoc3RkZXJyLCAiU29ja2V0IGNvbm5lY3Rpb24gc3VjY2Vzc2Z1bCAlZFxuIiwgbSk7CisgICAgLy8gZGllIGFmdGVyIDI0IGhycyB3YWl0aW5nIGZvciBhY3Rpdml0eSBvbiBwb3J0CisgICAgc29hcC5hY2NlcHRfdGltZW91dCA9IDI0KjYwKjYwOworICAgIC8vIElPIHRpbWVvdXRzCisgICAgc29hcC5zZW5kX3RpbWVvdXQgPSAzMDsKKyAgICBzb2FwLnJlY3ZfdGltZW91dCA9IDMwOworICAgIC8vIGxvb3AgdGhyb3VnaCByZXF1ZXN0cworICAgIGZvciAoaSA9IDE7IDsgaSsrKQorICAgIHsgLy8gYWNjZXB0IHJlcXVlc3QKKyAgICAgIHMgPSBzb2FwX2FjY2VwdCgmc29hcCk7CisgICAgICAvLyBpZiB0aW1lb3V0IG9yIGVycm9yLCByZXBvcnQKKyAgICAgIGlmIChzIDwgMCkKKyAgICAgIHsgaWYgKHNvYXAuZXJybnVtKQorICAgICAgICAgIHNvYXBfcHJpbnRfZmF1bHQoJnNvYXAsIHN0ZGVycik7CisJZWxzZQorICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiU2VydmVyIHRpbWVkIG91dFxuIik7CisJYnJlYWs7CisgICAgICB9CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlRocmVhZCAlZCBhY2NlcHRzIHNvY2tldCAlZCBjb25uZWN0aW9uIGZyb20gSVAgJWQuJWQuJWQuJWRcbiIsIGksIHMsIChpbnQpKHNvYXAuaXA+PjI0KSYweEZGLCAoaW50KShzb2FwLmlwPj4xNikmMHhGRiwgKGludCkoc29hcC5pcD4+OCkmMHhGRiwgKGludClzb2FwLmlwJjB4RkYpOworICAgICAgLy8gY29weSBzb2FwIGVudmlyb25tZW50IGFuZCBzcGF3biB0aHJlYWQKKyAgICAgIHRzb2FwID0gc29hcF9jb3B5KCZzb2FwKTsKKyAgICAgIHB0aHJlYWRfY3JlYXRlKCZ0aWQsIE5VTEwsICh2b2lkKigqKSh2b2lkKikpcHJvY2Vzc19yZXF1ZXN0LCAodm9pZCopdHNvYXApOworICAgIH0KKyAgfQorICAvLyBkZXRhY2gKKyAgc29hcF9kb25lKCZzb2FwKTsKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgKnByb2Nlc3NfcmVxdWVzdCh2b2lkICpzb2FwKQoreyBwdGhyZWFkX2RldGFjaChwdGhyZWFkX3NlbGYoKSk7CisgIC8vIHNlcnZlIHJlcXVlc3QgKG9yIG11bHRpcGxlIHJlcXVlc3RzIHdpdGgga2VlcC1hbGl2ZSBlbmFibGVkKQorICBzb2FwX3NlcnZlKChzdHJ1Y3Qgc29hcCopc29hcCk7CisgIC8vIGNsZWFudXAgY2xhc3MgaW5zdGFuY2VzCisgIHNvYXBfZGVzdHJveSgoc3RydWN0IHNvYXAqKXNvYXApOworICAvLyBjbGVhbnVwCisgIHNvYXBfZW5kKChzdHJ1Y3Qgc29hcCopc29hcCk7CisgIC8vIGRldGFjaCB0aHJlYWQncyBjb3B5IG9mIHNvYXAgZW52aXJvbm1lbnQKKyAgc29hcF9kb25lKChzdHJ1Y3Qgc29hcCopc29hcCk7CisgIC8vIGZyZWUgc29hcCBlbnZpcm9ubWVudAorICBmcmVlKHNvYXApOworICByZXR1cm4gTlVMTDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwlTZXJ2ZXIgbWV0aG9kcworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2ludCBuc19fcHV0RGF0YShzdHJ1Y3Qgc29hcCAqc29hcCwgYXJyYXlPZkRhdGEgKmRhdGEsIGFycmF5T2ZOYW1lICpuYW1lcykKK3sgLy8gZ1NPQVAgc3dpdGNoZXMgdG8gU09BUF9JT19TVE9SRSB3aGVuIFNPQVBfSU9fQ0hVTksgKEhUVFAgY2h1bmtpbmcpIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGNsaWVudAorICAvLyBTaW5jZSBpdCBpcyB1bmRlc2lyYWJsZSB0byB1c2UgU09BUF9JT19TVE9SRSB3aXRoIHN0cmVhbWluZywgd2UgcmVzZXQgaXQgdG8gU09BUF9JT19CVUZGRVIKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fU1RPUkUpCisgICAgc29hcC0+b21vZGUgPSAoc29hcC0+b21vZGUgJiB+U09BUF9JTykgfCBTT0FQX0lPX0JVRkZFUjsKKyAgLy8gcmV0dXJuIG5hbWUgKGtleSkgZm9yIGVhY2ggZGF0YSBpdGVtCisgIG5hbWVzLT5yZXNpemUoZGF0YS0+c2l6ZSgpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLT5zaXplKCk7IGkrKykKKyAgeyBjaGFyICpzLCAqbmFtZTsKKyAgICAvLyB0aGUgaWQgZmllbGQgaXMgc2V0IHdoZW4gRElNRSB3YXMgdXNlZCBzbyB0aGUgZGltZV93cml0ZSBjYWxsYmFja3MgYWxyZWFkeSBzYXZlZCB0aGUgZmlsZQorICAgIGlmICgoKmRhdGEpW2ldLmlkKQorICAgIHsgYXNzZXJ0KCgqZGF0YSlbaV0uX19wdHIpOworICAgICAgbmFtZSA9ICgoc3RydWN0IGRpbWVfd3JpdGVfaGFuZGxlKikoKmRhdGEpW2ldLl9fcHRyKS0+bmFtZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgbmFtZSA9IHRlbXBuYW0oVE1QRElSLCAiZGF0YSIpOworICAgICAgZnByaW50ZihzdGRlcnIsICJTYXZpbmcgZmlsZSAlc1xuIiwgbmFtZSk7CisgICAgICBzYXZlRGF0YSgoKmRhdGEpW2ldLCBuYW1lKTsKKyAgICB9CisgICAgcyA9IHN0cnJjaHIobmFtZSwgJy8nKTsKKyAgICBpZiAoIXMpCisgICAgICBzID0gc3RycmNocihuYW1lLCAnXFwnKTsKKyAgICBpZiAoIXMpCisgICAgICBzID0gbmFtZTsKKyAgICBlbHNlCisgICAgICBzKys7CisgICAgKCpuYW1lcylbaV0gPSBzb2FwX3N0cmR1cChzb2FwLCBzKTsKKyAgICBpZiAoISgqZGF0YSlbaV0uaWQpCisgICAgeyAvLyBmcmVlIGRhdGEgYWxsb2NlZCB3aXRoIHRlbXBuYW0oKQorICAgICAgZnJlZShuYW1lKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK2ludCBuc19fZ2V0RGF0YShzdHJ1Y3Qgc29hcCAqc29hcCwgYXJyYXlPZk5hbWUgKm5hbWVzLCBhcnJheU9mRGF0YSAqZGF0YSkKK3sgLy8gZ1NPQVAgc3dpdGNoZXMgdG8gU09BUF9JT19TVE9SRSB3aGVuIFNPQVBfSU9fQ0hVTksgKEhUVFAgY2h1bmtpbmcpIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGNsaWVudC4KKyAgLy8gU2luY2UgaXQgaXMgdW5kZXNpcmFibGUgdG8gdXNlIFNPQVBfSU9fU1RPUkUsIHdlIHJlc2V0IGl0IHRvIFNPQVBfSU9fQlVGRkVSCisgIC8vIEltcG9ydGFudDogRElNRSBhdHRhY2htZW50cyBNQVkgYmUgdHJhbnNtaXR0ZWQgaW4gYSBwZXJtdXRlZCBvcmRlciwgc28gd2UgbXVzdCBiZSBjYXJlZnVsIHdpdGggc3RyZWFtaW5nIGRhdGEgdG8gZmlsZXMgYXQgdGhlIGNsaWVudCBzaWRlLiBUaGVyZWZvcmUsIHdlIHNhdmUgdGhlIGZpbGUgbmFtZSBpbiB0aGUgb3B0aW9ucyBmaWVsZC4KKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fU1RPUkUpCisgICAgc29hcC0+b21vZGUgPSAoc29hcC0+b21vZGUgJiB+U09BUF9JTykgfCBTT0FQX0lPX0JVRkZFUjsKKyAgaWYgKCFuYW1lcykKKyAgICByZXR1cm4gc29hcF9zZW5kZXJfZmF1bHQoc29hcCwgIk5hbWVzIHJlcXVpcmVkIiwgTlVMTCk7CisgIGRhdGEtPnJlc2l6ZShuYW1lcy0+c2l6ZSgpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy0+X19zaXplOyBpKyspCisgIHsgaWYgKCEoKm5hbWVzKVtpXSkKKyAgICAgIHJldHVybiBzb2FwX3NlbmRlcl9mYXVsdChzb2FwLCAiTmFtZSByZXF1aXJlZCIsIE5VTEwpOworICAgIGlmIChnZXRkYXRhKHNvYXAsICgqbmFtZXMpW2ldLCAoKmRhdGEpW2ldKSkKKyAgICAgIHJldHVybiBzb2FwX3NlbmRlcl9mYXVsdChzb2FwLCAiQWNjZXNzIGRlbmllZCIsIE5VTEwpOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorCitpbnQgbnNfX2dldEltYWdlKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpuYW1lLCBuc19fRGF0YSYgaW1hZ2UpCit7IGlmICghbmFtZSkKKyAgICByZXR1cm4gc29hcF9zZW5kZXJfZmF1bHQoc29hcCwgIk5hbWUgcmVxdWlyZWQiLCBOVUxMKTsKKyAgaWYgKGdldGRhdGEoc29hcCwgbmFtZSwgaW1hZ2UpKQorICAgIHJldHVybiBzb2FwX3NlbmRlcl9mYXVsdChzb2FwLCAiQWNjZXNzIGRlbmllZCIsIE5VTEwpOworICBpbWFnZS50eXBlID0gImltYWdlL2pwZWciOworICBpbWFnZS5vcHRpb25zID0gc29hcF9kaW1lX29wdGlvbihzb2FwLCAwLCBuYW1lKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JSGVscGVyIGZ1bmN0aW9ucworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyBpbnQgZ2V0ZGF0YShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgbnNfX0RhdGEmIGRhdGEpCit7IHN0cnVjdCBzdGF0IHNiOworICBGSUxFICpmZCA9IE5VTEw7CisgIGlmICghc3RyY2hyKG5hbWUsICcvJykgJiYgIXN0cmNocihuYW1lLCAnXFwnKSAmJiAhc3RyY2hyKG5hbWUsICc6JykpCisgIHsgY2hhciAqcyA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzdHJsZW4oVE1QRElSKSArIHN0cmxlbihuYW1lKSArIDIpOworICAgIHN0cmNweShzLCBUTVBESVIpOworICAgIHN0cmNhdChzLCAiLyIpOworICAgIHN0cmNweShzLCBuYW1lKTsKKyAgICBmZCA9IGZvcGVuKHMsICJyYiIpOworICB9CisgIGlmICghZmQpCisgICAgcmV0dXJuIFNPQVBfRU9GOworICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykgLy8gY2h1bmtlZCByZXNwb25zZSBpcyBwb3NzaWJsZQorICB7IGRhdGEuX19wdHIgPSAodW5zaWduZWQgY2hhciopZmQ7IC8vIG11c3Qgc2V0IHRvIG5vbi1OVUxMICh0aGlzIGlzIG91ciBmZCBoYW5kbGUgd2hpY2ggd2UgbmVlZCBpbiB0aGUgY2FsbGJhY2tzKQorICAgIGRhdGEuX19zaXplID0gMDsgLy8gemVybyBzaXplIHN0cmVhbXMgZGF0YSB3aXRoIEhUVFAgY2h1bmtpbmcKKyAgfQorICBlbHNlIGlmICghZnN0YXQoZmlsZW5vKGZkKSwgJnNiKSAmJiBzYi5zdF9zaXplID4gMCkKKyAgeyAvLyBzaW5jZSB3ZSBjYW4gZ2V0IHRoZSBsZW5ndGggb2YgdGhlIGZpbGUsIHdlIGNhbiBzdHJlYW0gaXQKKyAgICBkYXRhLl9fcHRyID0gKHVuc2lnbmVkIGNoYXIqKWZkOyAvLyBtdXN0IHNldCB0byBub24tTlVMTCAodGhpcyBpcyBvdXIgZmQgaGFuZGxlIHdoaWNoIHdlIG5lZWQgaW4gdGhlIGNhbGxiYWNrcykKKyAgICBkYXRhLl9fc2l6ZSA9IHNiLnN0X3NpemU7CisgIH0KKyAgZWxzZSAvLyB3ZSBjYW4ndCB1c2UgSFRUUCBjaHVua2luZyBhbmQgd2UgZG9uJ3Qga25vdyB0aGUgc2l6ZSwgc28gYnVmZmVyIGl0CisgIHsgaW50IGk7CisgICAgZGF0YS5fX3B0ciA9ICh1bnNpZ25lZCBjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBNQVhfRklMRV9TSVpFKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0ZJTEVfU0laRTsgaSsrKQorICAgIHsgaW50IGM7CisgICAgICBpZiAoKGMgPSBmZ2V0YyhmZCkpID09IEVPRikKKyAgICAgICAgYnJlYWs7CisgICAgICBkYXRhLl9fcHRyW2ldID0gYzsKKyAgICB9CisgICAgZmNsb3NlKGZkKTsKKyAgICBkYXRhLl9fc2l6ZSA9IGk7CisgIH0KKyAgZGF0YS50eXBlID0gIiI7IC8vIHNwZWNpZnkgbm9uLU5VTEwgaWQgb3IgdHlwZSB0byBlbmFibGUgRElNRQorICBkYXRhLm9wdGlvbnMgPSBzb2FwX2RpbWVfb3B0aW9uKHNvYXAsIDAsIG5hbWUpOworICByZXR1cm4gU09BUF9PSzsKK30KKworc3RhdGljIHZvaWQgc2F2ZURhdGEobnNfX0RhdGEmIGRhdGEsIGNvbnN0IGNoYXIgKm5hbWUpCit7IGNoYXIgKmJ1ZiA9IChjaGFyKilkYXRhLl9fcHRyOworICBpbnQgbGVuID0gZGF0YS5fX3NpemU7CisgIEZJTEUgKmZkID0gZm9wZW4obmFtZSwgIndiIik7CisgIGlmICghZmQpCisgIHsgZnByaW50ZihzdGRlcnIsICJDYW5ub3Qgc2F2ZSBmaWxlICVzXG4iLCBuYW1lKTsKKyAgICByZXR1cm47CisgIH0KKyAgd2hpbGUgKGxlbikKKyAgeyBzaXplX3QgbndyaXR0ZW4gPSBmd3JpdGUoYnVmLCAxLCBsZW4sIGZkKTsKKyAgICBpZiAoIW53cml0dGVuKQorICAgIHsgZnByaW50ZihzdGRlcnIsICJDYW5ub3Qgd3JpdGUgdG8gJXNcbiIsIG5hbWUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBsZW4gLT0gbndyaXR0ZW47CisgICAgYnVmICs9IG53cml0dGVuOworICB9Cit9CisKK3N0YXRpYyB2b2lkIHNpZ3BpcGVfaGFuZGxlKGludCB4KSB7IH0KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwlTdHJlYW1pbmcgRElNRSBhdHRhY2htZW50IGNvbnRlbnQgaGFuZGxlcnMKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgdm9pZCAqZGltZV9yZWFkX29wZW4oc3RydWN0IHNvYXAgKnNvYXAsIHZvaWQgKmhhbmRsZSwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKm9wdGlvbnMpCit7IC8vIHdlIHNob3VsZCByZXR1cm4gTlVMTCB3aXRob3V0IHNldHRpbmcgc29hcC0+ZXJyb3IgaWYgd2UgZG9uJ3Qgd2FudCB0byB1c2UgdGhlIHN0cmVhbWluZyBjYWxsYmFjayBmb3IgdGhpcyBESU1FIGF0dGFjaG1lbnQuIFRoZSBoYW5kbGUgY29udGFpbnMgdGhlIG5vbi1OVUxMIF9fcHRyIGZpZWxkIHZhbHVlIHdoaWNoIHNob3VsZCBoYXZlIGJlZW4gc2V0IGluIHRoZSBhcHBsaWNhdGlvbi4KKyAgLy8gcmV0dXJuIHZhbHVlIG9mIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBwYXNzZWQgb24gdG8gdGhlIGZkaW1lcmVhZCBhbmQgZmRpbWVyZWFkY2xvc2UgY2FsbGJhY2tzLiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgbm90IGFmZmVjdCB0aGUgX19wdHIgZmllbGQuCisgIHJldHVybiBoYW5kbGU7Cit9CisKK3N0YXRpYyB2b2lkIGRpbWVfcmVhZF9jbG9zZShzdHJ1Y3Qgc29hcCAqc29hcCwgdm9pZCAqaGFuZGxlKQoreyBmY2xvc2UoKEZJTEUqKWhhbmRsZSk7Cit9CisKK3N0YXRpYyBzaXplX3QgZGltZV9yZWFkKHN0cnVjdCBzb2FwICpzb2FwLCB2b2lkICpoYW5kbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sgcmV0dXJuIGZyZWFkKGJ1ZiwgMSwgbGVuLCAoRklMRSopaGFuZGxlKTsKK30KKworc3RhdGljIHZvaWQgKmRpbWVfd3JpdGVfb3BlbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKm9wdGlvbnMpCit7IC8vIHdlIGNhbiByZXR1cm4gTlVMTCB3aXRob3V0IHNldHRpbmcgc29hcC0+ZXJyb3IgaWYgd2UgZG9uJ3Qgd2FudCB0byB1c2UgdGhlIHN0cmVhbWluZyBjYWxsYmFjayBmb3IgdGhpcyBESU1FIGF0dGFjaG1lbnQKKyAgc3RydWN0IGRpbWVfd3JpdGVfaGFuZGxlICpoYW5kbGUgPSAoc3RydWN0IGRpbWVfd3JpdGVfaGFuZGxlKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IGRpbWVfd3JpdGVfaGFuZGxlKSk7CisgIGlmICghaGFuZGxlKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgY2hhciAqbmFtZSA9IHRlbXBuYW0oVE1QRElSLCAiZGF0YSIpOworICBmcHJpbnRmKHN0ZGVyciwgIlNhdmluZyBmaWxlICVzXG4iLCBuYW1lKTsKKyAgaGFuZGxlLT5uYW1lID0gc29hcF9zdHJkdXAoc29hcCwgbmFtZSk7CisgIGZyZWUobmFtZSk7CisgIGhhbmRsZS0+ZmQgPSBmb3BlbihoYW5kbGUtPm5hbWUsICJ3YiIpOworICBpZiAoIWhhbmRsZS0+ZmQpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsgLy8gY291bGQgbm90IG9wZW4gZmlsZSBmb3Igd3JpdGluZworICAgIHNvYXAtPmVycm51bSA9IGVycm5vOyAvLyBnZXQgcmVhc29uCisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuICh2b2lkKiloYW5kbGU7Cit9CisKK3N0YXRpYyB2b2lkIGRpbWVfd3JpdGVfY2xvc2Uoc3RydWN0IHNvYXAgKnNvYXAsIHZvaWQgKmhhbmRsZSkKK3sgZmNsb3NlKCgoc3RydWN0IGRpbWVfd3JpdGVfaGFuZGxlKiloYW5kbGUpLT5mZCk7Cit9CisKK3N0YXRpYyBpbnQgZGltZV93cml0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgdm9pZCAqaGFuZGxlLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7IHdoaWxlIChsZW4pCisgIHsgc2l6ZV90IG53cml0dGVuID0gZndyaXRlKGJ1ZiwgMSwgbGVuLCAoKHN0cnVjdCBkaW1lX3dyaXRlX2hhbmRsZSopaGFuZGxlKS0+ZmQpOworICAgIGlmICghbndyaXR0ZW4pCisgICAgeyBzb2FwLT5lcnJudW0gPSBlcnJubzsgLy8gZ2V0IHJlYXNvbgorICAgICAgcmV0dXJuIFNPQVBfRU9GOworICAgIH0KKyAgICBsZW4gLT0gbndyaXR0ZW47CisgICAgYnVmICs9IG53cml0dGVuOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCW5zX19EYXRhIGNsYXNzCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworbnNfX0RhdGE6Om5zX19EYXRhKCkKK3sgX19wdHIgPSBOVUxMOworICBfX3NpemUgPSAwOworICBpZCA9IE5VTEw7CisgIHR5cGUgPSBOVUxMOworICBvcHRpb25zID0gTlVMTDsKKyAgc29hcCA9IE5VTEw7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JYXJyYXlPZkRhdGEgY2xhc3MKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCithcnJheU9mRGF0YTo6YXJyYXlPZkRhdGEoKQoreyBfX3B0ciA9IE5VTEw7CisgIF9fc2l6ZSA9IDA7CisgIHNvYXAgPSBOVUxMOworfQorCithcnJheU9mRGF0YTo6YXJyYXlPZkRhdGEoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuKQoreyBfX3B0ciA9IE5VTEw7CisgIF9fc2l6ZSA9IDA7CisgIHRoaXMtPnNvYXAgPSBzb2FwOworICByZXNpemUobik7Cit9CisKK2FycmF5T2ZEYXRhOjp+YXJyYXlPZkRhdGEoKQoreyByZXNpemUoMCk7Cit9CisKK2ludCBhcnJheU9mRGF0YTo6c2l6ZSgpCit7IHJldHVybiBfX3NpemU7Cit9CisKK3ZvaWQgYXJyYXlPZkRhdGE6OnJlc2l6ZShpbnQgbikKK3sgaWYgKF9fcHRyKQorICB7IGlmIChzb2FwKSAvLyBpZiBjcmVhdGVkIGJ5IHNvYXAgZW52aXJvbm1lbnQKKyAgICAgIHNvYXBfZGVsZXRlKHNvYXAsIF9fcHRyKTsgLy8gdGhlbiBkZWxldGUKKyAgICBlbHNlCisgICAgICBkZWxldGVbXSBfX3B0cjsKKyAgfQorICBfX3NpemUgPSBuOworICBpZiAobiA8PSAwKQorICAgIF9fcHRyID0gTlVMTDsKKyAgZWxzZSBpZiAoc29hcCkKKyAgICBfX3B0ciA9IHNvYXBfbmV3X25zX19EYXRhKHNvYXAsIG4pOworICBlbHNlCisgICAgX19wdHIgPSBuZXcgbnNfX0RhdGFbbl07Cit9CisKK25zX19EYXRhJiBhcnJheU9mRGF0YTo6b3BlcmF0b3JbXShpbnQgaSkgY29uc3QKK3sgYXNzZXJ0KF9fcHRyICYmIGkgPj0gMCAmJiBpIDwgX19zaXplKTsKKyAgcmV0dXJuIF9fcHRyW2ldOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCWFycmF5T2ZOYW1lIGNsYXNzCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYXJyYXlPZk5hbWU6OmFycmF5T2ZOYW1lKCkKK3sgX19wdHIgPSBOVUxMOworICBfX3NpemUgPSAwOworICBzb2FwID0gTlVMTDsKK30KKworYXJyYXlPZk5hbWU6OmFycmF5T2ZOYW1lKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbikKK3sgX19wdHIgPSBOVUxMOworICBfX3NpemUgPSAwOworICB0aGlzLT5zb2FwID0gc29hcDsKKyAgcmVzaXplKG4pOworfQorCithcnJheU9mTmFtZTo6fmFycmF5T2ZOYW1lKCkKK3sgcmVzaXplKDApOworfQorCitpbnQgYXJyYXlPZk5hbWU6OnNpemUoKQoreyByZXR1cm4gX19zaXplOworfQorCit2b2lkIGFycmF5T2ZOYW1lOjpyZXNpemUoaW50IG4pCit7IGlmIChfX3B0cikKKyAgeyBpZiAoc29hcCkgLy8gaWYgY3JlYXRlZCBieSBzb2FwIGVudmlyb25tZW50CisgICAgICBzb2FwX2RlbGV0ZShzb2FwLCBfX3B0cik7IC8vIHRoZW4gZGVsZXRlCisgICAgZWxzZQorICAgICAgZnJlZShfX3B0cik7CisgIH0KKyAgX19zaXplID0gbjsKKyAgaWYgKG4gPD0gMCkKKyAgICBfX3B0ciA9IE5VTEw7CisgIGVsc2UKKyAgeyBpZiAoc29hcCkKKyAgICAgIF9fcHRyID0gKGNoYXIqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2YoY2hhciopICogbik7CisgICAgZWxzZQorICAgICAgX19wdHIgPSAoY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopICogbik7CisgICAgbWVtc2V0KF9fcHRyLCAwLCBuKTsKKyAgfQorfQorCitjaGFyKiYgYXJyYXlPZk5hbWU6Om9wZXJhdG9yW10oaW50IGkpIGNvbnN0Cit7IGFzc2VydChfX3B0ciAmJiBpID49IDAgJiYgaSA8IF9fc2l6ZSk7CisgIHJldHVybiBfX3B0cltpXTsKK30KKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kaW1lL2ltYWdlLmpwZyBiL3NhbXBsZXMvZGltZS9pbWFnZS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBhMDRlMgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGltZS9pbWFnZS5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9ldmVudHMvTWFrZWZpbGUgYi9zYW1wbGVzL2V2ZW50cy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjE2NzEyCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9ldmVudHMvTWFrZWZpbGUKQEAgLTAsMCArMSwyMyBAQAorR1NPQVA9Li4vLi4vc29hcGNwcDIKK1NPQVBIPS4uLy4uL3N0ZHNvYXAyLmgKK1NPQVBDPS4uLy4uL3N0ZHNvYXAyLmMKK1NPQVBDUFA9Li4vLi4vc3Rkc29hcDIuY3BwCitDQz1nY2MKK0NQUD1nKysKK0xJQlM9CitDT0ZMQUdTPS1PMgorQ1dGTEFHUz0tV2FsbAorQ0lGTEFHUz0tSS4uLy4uCitDTUZMQUdTPQorQ0ZMQUdTPSAkKENXRkxBR1MpICQoQ09GTEFHUykgJChDSUZMQUdTKSAkKENNRkxBR1MpCithbGw6CQlldmVudCBoYW5kbGVyCitldmVudDoJCWV2ZW50LmggZXZlbnQuYyAkKFNPQVBIKSAkKFNPQVBDKQorCQkkKEdTT0FQKSAtYyBldmVudC5oCisJCSQoQ0MpICQoQ0ZMQUdTKSAtbyBldmVudCBldmVudC5jIHNvYXBDLmMgc29hcENsaWVudC5jICQoU09BUEMpICQoTElCUykKK2hhbmRsZXI6CWV2ZW50LmggaGFuZGxlci5jICQoU09BUEgpICQoU09BUEMpCisJCSQoR1NPQVApIGV2ZW50LmgKKwkJJChDQykgJChDRkxBR1MpIC1vIGhhbmRsZXIgaGFuZGxlci5jIHNvYXBDLmMgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuYyAkKFNPQVBDKSAtbHB0aHJlYWQgJChMSUJTKQorY2xlYW46CisJCXJtIC1mICoubyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5LmgKK2Rpc3RjbGVhbjoKKwkJcm0gLWYgKi5vICoud3NkbCAqLnhzZCAqLnhtbCAqLm5zbWFwICoubG9nIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaCBldmVudCBoYW5kbGVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL2V2ZW50cy9NYWtlZmlsZVNvbGFyaXMgYi9zYW1wbGVzL2V2ZW50cy9NYWtlZmlsZVNvbGFyaXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA0OTRjOQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZXZlbnRzL01ha2VmaWxlU29sYXJpcwpAQCAtMCwwICsxLDIzIEBACitHU09BUD0uLi8uLi9zb2FwY3BwMgorU09BUEg9Li4vLi4vc3Rkc29hcDIuaAorU09BUEM9Li4vLi4vc3Rkc29hcDIuYworU09BUENQUD0uLi8uLi9zdGRzb2FwMi5jcHAKK0NDPWdjYworQ1BQPWcrKworTElCUz0tbHhuZXQgLWxzb2NrZXQgLWxuc2wKK0NPRkxBR1M9LU8yCitDV0ZMQUdTPS1XYWxsCitDSUZMQUdTPS1JLi4vLi4KK0NNRkxBR1M9CitDRkxBR1M9ICQoQ1dGTEFHUykgJChDT0ZMQUdTKSAkKENJRkxBR1MpICQoQ01GTEFHUykKK2FsbDoJCWV2ZW50IGhhbmRsZXIKK2V2ZW50OgkJZXZlbnQuaCBldmVudC5jICQoU09BUEgpICQoU09BUEMpCisJCSQoR1NPQVApIC1jIGV2ZW50LmgKKwkJJChDQykgJChDRkxBR1MpIC1vIGV2ZW50IGV2ZW50LmMgc29hcEMuYyBzb2FwQ2xpZW50LmMgJChTT0FQQykgJChMSUJTKQoraGFuZGxlcjoJZXZlbnQuaCBoYW5kbGVyLmMgJChTT0FQSCkgJChTT0FQQykKKwkJJChHU09BUCkgZXZlbnQuaAorCQkkKENDKSAkKENGTEFHUykgLW8gaGFuZGxlciBoYW5kbGVyLmMgc29hcEMuYyBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jICQoU09BUEMpIC1scHRocmVhZCAkKExJQlMpCitjbGVhbjoKKwkJcm0gLWYgKi5vIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaAorZGlzdGNsZWFuOgorCQlybSAtZiAqLm8gKi53c2RsICoueHNkICoueG1sICoubnNtYXAgKi5sb2cgc29hcEguaCBzb2FwU3R1Yi5oIHNvYXBDLmNwcCBzb2FwQy5jIHNvYXBDbGllbnQuY3BwIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmNwcCBzb2FwU2VydmVyLmMgc29hcCpQcm94eS5oIGV2ZW50IGhhbmRsZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZXZlbnRzL2V2ZW50LmMgYi9zYW1wbGVzL2V2ZW50cy9ldmVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZmM1MWEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2V2ZW50cy9ldmVudC5jCkBAIC0wLDAgKzEsODMgQEAKKy8qCWV2ZW50LmMKKworCUMtc3R5bGUgY2xpZW50CisKKwlFdmVudHMgYXJlIGJhc2VkIG9uIGFzeW5jaHJvbm91cyBvbmUtd2F5IFNPQVAgbWVzc2FnaW5nIHVzaW5nIEhUVFAKKwlrZWVwLWFsaXZlIGZvciBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zCisKKwlUaGUgJ3N5bmNocm9ub3VzJyBnbG9iYWwgZmxhZyBpbGx1c3RyYXRlcyBTT0FQIG9uZS13YXkgbWVzc2FnaW5nLAorCXdoaWNoIHJlcXVpcmVzIGFuIEhUVFAgT0sgcmVzcG9uc2Ugd2l0aCBhbiBlbXB0eSBib2R5IHRvIGJlIHJldHVybmVkCisJYnkgdGhlIHNlcnZlci4KKworCUNvcHlyaWdodCAoQykgMjAwMC0yMDAyIFJvYmVydCBBLiB2YW4gRW5nZWxlbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUNvbXBpbGU6CisJc29hcGNwcDIgLWMgZXZlbnQuaAorCWNjIC1vIGV2ZW50IGV2ZW50LmMgc3Rkc29hcDIuYyBzb2FwQy5jIHNvYXBDbGllbnQuYworCisJUnVuIChmaXJzdCBzdGFydCB0aGUgZXZlbnQgaGFuZGxlciBvbiBsb2NhbGhvc3QgcG9ydCAxODAwMCk6CisJZXZlbnQKKworKi8KKworI2luY2x1ZGUgInNvYXBILmgiCisjaW5jbHVkZSAiRXZlbnQubnNtYXAiCisKK2ludCBzeW5jaHJvbm91cyA9IDA7IC8qID0xOiBTT0FQIGludGVyb3BlcmFibGUgc3luY2hyb25vdXMgb25lLXdheSBtZXNzYWdpbmcgb3ZlciBIVFRQICovCisKKy8qIFNlcnZpY2UgZGV0YWlscyBjb3BpZWQgZnJvbSBldmVudC5oOiAqLworY29uc3QgY2hhciAqZXZlbnRfaGFuZGxlcl9lbmRwb2ludCA9ICJodHRwOi8vbG9jYWxob3N0OjE4MDAwIjsKK2NvbnN0IGNoYXIgKmV2ZW50X2hhbmRsZXJfYWN0aW9uID0gImV2ZW50IjsKKworaW50IG1haW4oKQoreyBzdHJ1Y3Qgc29hcCBzb2FwOworICBzb2FwX2luaXQyKCZzb2FwLCBTT0FQX0lPX0tFRVBBTElWRSwgU09BUF9JT19LRUVQQUxJVkUpOworICBpZiAoc29hcF9zZW5kX25zX19oYW5kbGUoJnNvYXAsIGV2ZW50X2hhbmRsZXJfZW5kcG9pbnQsIGV2ZW50X2hhbmRsZXJfYWN0aW9uLCBFVkVOVF9BKSkKKyAgICBzb2FwX3ByaW50X2ZhdWx0KCZzb2FwLCBzdGRlcnIpOworICBpZiAoc3luY2hyb25vdXMgJiYgc29hcF9yZWN2X2VtcHR5X3Jlc3BvbnNlKCZzb2FwKSkKKyAgICBzb2FwX3ByaW50X2ZhdWx0KCZzb2FwLCBzdGRlcnIpOworICBpZiAoc29hcF9zZW5kX25zX19oYW5kbGUoJnNvYXAsIGV2ZW50X2hhbmRsZXJfZW5kcG9pbnQsIGV2ZW50X2hhbmRsZXJfYWN0aW9uLCBFVkVOVF9CKSkKKyAgICBzb2FwX3ByaW50X2ZhdWx0KCZzb2FwLCBzdGRlcnIpOworICBpZiAoc3luY2hyb25vdXMgJiYgc29hcF9yZWN2X2VtcHR5X3Jlc3BvbnNlKCZzb2FwKSkKKyAgICBzb2FwX3ByaW50X2ZhdWx0KCZzb2FwLCBzdGRlcnIpOworICAvKiByZXNldCBrZWVwLWFsaXZlIHdoZW4gY2xpZW50IG5lZWRzIHRvIGluZm9ybSB0aGUgc2VydmVyIHRoYXQgaXQgd2lsbCBjbG9zZSB0aGUgY29ubmVjdGlvbi4gSXQgbWF5IHJlY29ubmVjdCBsYXRlciAqLworICBzb2FwX2Nscl9vbW9kZSgmc29hcCwgU09BUF9JT19LRUVQQUxJVkUpOworICBpZiAoc29hcF9zZW5kX25zX19oYW5kbGUoJnNvYXAsIGV2ZW50X2hhbmRsZXJfZW5kcG9pbnQsIGV2ZW50X2hhbmRsZXJfYWN0aW9uLCBFVkVOVF9DKSkKKyAgICBzb2FwX3ByaW50X2ZhdWx0KCZzb2FwLCBzdGRlcnIpOworICBpZiAoc3luY2hyb25vdXMgJiYgc29hcF9yZWN2X2VtcHR5X3Jlc3BvbnNlKCZzb2FwKSkKKyAgICBzb2FwX3ByaW50X2ZhdWx0KCZzb2FwLCBzdGRlcnIpOworICAvKiBjbG9zZSB0aGUgc29ja2V0ICovCisgIHNvYXBfY2xvc2Vzb2NrKCZzb2FwKTsKKyAgLyogZW5hYmxlIGtlZXAtYWxpdmUgd2hpY2ggaXMgcmVxdWlyZWQgdG8gYWNjZXB0IGFuZCBleGVjdXRlIG11bHRpcGxlIHJlY2VpdmVzICovCisgIHNvYXBfc2V0X29tb2RlKCZzb2FwLCBTT0FQX0lPX0tFRVBBTElWRSk7CisgIGlmIChzb2FwX3NlbmRfbnNfX2hhbmRsZSgmc29hcCwgZXZlbnRfaGFuZGxlcl9lbmRwb2ludCwgZXZlbnRfaGFuZGxlcl9hY3Rpb24sIEVWRU5UX1opKQorICAgIHNvYXBfcHJpbnRfZmF1bHQoJnNvYXAsIHN0ZGVycik7CisgIGVsc2UKKyAgeyBzdHJ1Y3QgbnNfX2hhbmRsZSByZXNwb25zZTsKKyAgICBmb3IgKDs7KQorICAgIHsgaWYgKCFzb2FwX3ZhbGlkX3NvY2tldChzb2FwLnNvY2tldCkpCisgICAgICB7IGZwcmludGYoc3RkZXJyLCAiQ29ubmVjdGlvbiB3YXMgdGVybWluYXRlZCAoa2VlcCBhbGl2ZSBkaXNhYmxlZD8pXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoc29hcF9yZWN2X25zX19oYW5kbGUoJnNvYXAsICZyZXNwb25zZSkpCisgICAgICB7IGlmIChzb2FwLmVycm9yID09IFNPQVBfRU9GKQorICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ29ubmVjdGlvbiB3YXMgZ3JhY2VmdWxseSBjbG9zZWQgYnkgc2VydmVyXG4iKTsKKyAgICAgICAgZWxzZQorCSAgc29hcF9wcmludF9mYXVsdCgmc29hcCwgc3RkZXJyKTsKKwlicmVhazsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgc3dpdGNoIChyZXNwb25zZS5ldmVudCkKKyAgICAgICAgeyBjYXNlIEVWRU5UX0E6IGZwcmludGYoc3RkZXJyLCAiQ2xpZW50IEV2ZW50OiBBXG4iKTsgYnJlYWs7CisgICAgICAgICAgY2FzZSBFVkVOVF9COiBmcHJpbnRmKHN0ZGVyciwgIkNsaWVudCBFdmVudDogQlxuIik7IGJyZWFrOworICAgICAgICAgIGNhc2UgRVZFTlRfQzogZnByaW50ZihzdGRlcnIsICJDbGllbnQgRXZlbnQ6IENcbiIpOyBicmVhazsKKyAgICAgICAgICBjYXNlIEVWRU5UX1o6IGZwcmludGYoc3RkZXJyLCAiQ2xpZW50IEV2ZW50OiBaXG4iKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgc29hcF9jbG9zZXNvY2soJnNvYXApOyAvKiBzb2FwX3NlbmQgb3BlcmF0aW9ucyBrZWVwIHRoZSBzb2NrZXQgb3BlbiB0byBwb3NzaWJseSBhY2NlcHQgcmVzcG9uc2VzLCBzbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgY2xvc2UgdGhlIHNvY2tldCBub3cgKi8KKyAgc29hcF9lbmQoJnNvYXApOyAvKiB0aGlzIHdpbGwgY2xvc2UgdGhlIHNvY2tldCB0b28gKGlmIGtlZXAgYWxpdmUgaXMgb2ZmKSwganVzdCBpbiBjYXNlICovCisgIHNvYXBfZG9uZSgmc29hcCk7IC8qIGRldGFjaCBlbnZpcm9ubWVudCAoYWxzbyBjbG9zZXMgc29ja2V0cyBldmVuIHdpdGgga2VlcC1hbGl2ZSkgKi8KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL2V2ZW50cy9ldmVudC5jcHAgYi9zYW1wbGVzL2V2ZW50cy9ldmVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI2MjAwMwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZXZlbnRzL2V2ZW50LmNwcApAQCAtMCwwICsxLDM0IEBACisvKglldmVudC5jcHAKKworCUMrKy1zdHlsZSBjbGllbnQKKworCUV2ZW50cyBiYXNlZCBvbiBhc3luY2hyb25vdXMgb25lLXdheSBTT0FQIG1lc3NhZ2luZyB1c2luZyBIVFRQCisJa2VlcC1hbGl2ZSBmb3IgcGVyc2lzdGVudCBjb25uZWN0aW9ucy4gQysrIHN0eWxlIHdpdGggUHJveHkgb2JqZWN0LgorCisJQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisJQ29tcGlsZToKKwlzb2FwY3BwMiBldmVudC5oCisJYysrIC1vIGV2ZW50IGV2ZW50LmNwcCBzdGRzb2FwMi5jcHAgc29hcEMuY3BwIHNvYXBDbGllbnQuY3BwCisKKwlSdW4gKGZpcnN0IHN0YXJ0IHRoZSBldmVudCBoYW5kbGVyIG9uIGxvY2FsaG9zdCBwb3J0IDE4MDAwKToKKwlldmVudAorCisqLworCisjaW5jbHVkZSAic29hcEV2ZW50UHJveHkuaCIKKyNpbmNsdWRlICJFdmVudC5uc21hcCIKKworaW50IG1haW4oKQoreyBFdmVudCBlOworICBzb2FwX3NldF9vbW9kZShlLnNvYXAsIFNPQVBfSU9fS0VFUEFMSVZFKTsKKyAgaWYgKGUuaGFuZGxlKEVWRU5UX0EpKQorICAgIHNvYXBfcHJpbnRfZmF1bHQoZS5zb2FwLCBzdGRlcnIpOworICBpZiAoZS5oYW5kbGUoRVZFTlRfQikpCisgICAgc29hcF9wcmludF9mYXVsdChlLnNvYXAsIHN0ZGVycik7CisgIC8qIGNvbm5lY3Rpb24gc2hvdWxkIG5vdCBiZSBrZXB0IGFsaXZlIGFmdGVyIHRoZSBsYXN0IGNhbGw6IGJlIG5pY2UgdG8gdGhlIHNlcnZlciBhbmQgdGVsbCBpdCBub3cgKi8KKyAgc29hcF9jbHJfb21vZGUoZS5zb2FwLCBTT0FQX0lPX0tFRVBBTElWRSk7CisgIGlmIChlLmhhbmRsZShFVkVOVF9DKSkKKyAgIHNvYXBfcHJpbnRfZmF1bHQoZS5zb2FwLCBzdGRlcnIpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZXZlbnRzL2V2ZW50LmggYi9zYW1wbGVzL2V2ZW50cy9ldmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZDQ1OTMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2V2ZW50cy9ldmVudC5oCkBAIC0wLDAgKzEsMTMgQEAKKy8vZ3NvYXAgbnMgc2VydmljZSBuYW1lOglFdmVudCBzZXJ2aWNlIGlzIGEgc2ltcGxlIHJlbW90ZSBldmVudCBoYW5kbGVyCisvL2dzb2FwIG5zIHNlcnZpY2Ugc3R5bGU6CXJwYworLy9nc29hcCBucyBzZXJ2aWNlIGVuY29kaW5nOgllbmNvZGVkCisvL2dzb2FwIG5zIHNlcnZpY2UgbmFtZXNwYWNlOglodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vZXZlbnQud3NkbAorLy9nc29hcCBucyBzZXJ2aWNlIGxvY2F0aW9uOglodHRwOi8vbG9jYWxob3N0OjE4MDAwCisKKy8vZ3NvYXAgbnMgc2NoZW1hIG5hbWVzcGFjZTogdXJuOmV2ZW50CisKK2VudW0gbnNfX2V2ZW50IHsgRVZFTlRfQSwgRVZFTlRfQiwgRVZFTlRfQywgRVZFTlRfWiB9OworCisvL2dzb2FwIG5zIHNlcnZpY2UgbWV0aG9kLWFjdGlvbjogaGFuZGxlICJldmVudCIKKy8vZ3NvYXAgbnMgc2VydmljZSBtZXRob2QtZG9jdW1lbnRhdGlvbjogaGFuZGxlIGhhbmRsZXMgYXN5bmNocm9ub3VzIGV2ZW50cworaW50IG5zX19oYW5kbGUoZW51bSBuc19fZXZlbnQgZXZlbnQsIHZvaWQpOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9ldmVudHMvaGFuZGxlci5jIGIvc2FtcGxlcy9ldmVudHMvaGFuZGxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NTQyZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2V2ZW50cy9oYW5kbGVyLmMKQEAgLTAsMCArMSwxMTEgQEAKKy8qCWhhbmRsZXIuYworCisJTXVsdGktdGhyZWFkZWQgc3RhbmQtYWxvbmUgZXZlbnQgaGFuZGxlciBzZXJ2aWNlCisKKwlFdmVudHMgYXJlIGJhc2VkIG9uIGFzeW5jaHJvbm91cyBvbmUtd2F5IFNPQVAgbWVzc2FnaW5nIHVzaW5nIEhUVFAKKwlrZWVwLWFsaXZlIGZvciBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zCisKKwlUaGUgJ3N5bmNocm9ub3VzJyBnbG9iYWwgZmxhZyBpbGx1c3RyYXRlcyBTT0FQIG9uZS13YXkgbWVzc2FnaW5nLAorCXdoaWNoIHJlcXVpcmVzIGFuIEhUVFAgT0sgcmVzcG9uc2Ugd2l0aCBhbiBlbXB0eSBib2R5IHRvIGJlIHJldHVybmVkCisJYnkgdGhlIHNlcnZlci4KKworCUNvcHlyaWdodCAoQykgMjAwMC0yMDAyIFJvYmVydCBBLiB2YW4gRW5nZWxlbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworCUNvbXBpbGU6CisJc29hcGNwcDIgLWMgZXZlbnQuaAorCWNjIC1vIGhhbmRsZXIgaGFuZGxlci5jIHN0ZHNvYXAyLmMgc29hcEMuYyBzb2FwU2VydmljZS5jCisKKwlSdW46CisJaGFuZGxlciAxODAwMCAmCisKKwlTZXJ2ZXIgd2lsbCB0aW1lIG91dCBhZnRlciAyNGhyIG9mIGluYWN0aXZpdHkKKworCVRoaXMgY29kZSBlbmFibGVzIGtlZXAtYWxpdmUgc3VwcG9ydCB3aGljaCBjYW4gY2F1c2UgImJyb2tlbiBwaXBlcyIKKwl3aGVuIHRoZSBjbGllbnQgcHJlbWF0dXJlbHkgY2xvc2VzIHRoZSBjb25uZWN0aW9uIHdoaWxlIGluZGljYXRpbmcKKwlpdCB3YW50cyB0aGUgY29ubmVjdGlvbiB0byBzdGF5IGFsaXZlLiBCcm9rZW4gcGlwZXMgKFNJR1BJUEUpIGNhbiBiZQorCWZpeGVkIHVzaW5nIE1TR19OT1NJR05BTCwgU09fTk9TSUdQSVBFLCBvciB3aXRoIGEgc2lnbmFsIGhhbmRsZXIsCisJYnV0IHRoaXMgaXMgbm90IHZlcnkgcG9ydGFibGUgKHNlZSBjb2RlIGJlbG93KQorCisqLworCisjaW5jbHVkZSAic29hcEguaCIKKyNpbmNsdWRlICJFdmVudC5uc21hcCIKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNkZWZpbmUgQkFDS0xPRyAoMTAwKQorI2RlZmluZSBUSU1FT1VUICgyNCo2MCo2MCkgLyogdGltZW91dCBhZnRlciAyNGhycyBvZiBpbmFjdGl2aXR5ICovCisKK3ZvaWQgKnByb2Nlc3NfcmVxdWVzdCh2b2lkKik7CisKK2ludCBzeW5jaHJvbm91cyA9IDA7IC8qID0xOiBTT0FQIGludGVyb3BlcmFibGUgc3luY2hyb25vdXMgb25lLXdheSBtZXNzYWdpbmcgb3ZlciBIVFRQICovCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sgc3RydWN0IHNvYXAgc29hcCwgKnRzb2FwOworICBwdGhyZWFkX3QgdGlkOworICBpbnQgcG9ydDsKKyAgaW50IG0sIHMsIGk7CisgIGlmIChhcmdjIDwgMikKKyAgeyBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBoYW5kbGVyIDxwb3J0PlxuIik7CisgICAgZXhpdCgxKTsKKyAgfQorICBwb3J0ID0gYXRvaShhcmd2WzFdKTsKKyAgc29hcF9pbml0Migmc29hcCwgU09BUF9JT19LRUVQQUxJVkUsIFNPQVBfSU9fS0VFUEFMSVZFKTsJLyoga2VlcCBJL08gYWxpdmUgKi8KKyAgc29hcC5hY2NlcHRfdGltZW91dCA9IFRJTUVPVVQ7CisgIHNvYXAuYmluZF9mbGFncyB8PSBTT19SRVVTRUFERFI7CS8qIGRvbid0IHVzZSB0aGlzIGluIHVuc2VjdXJlZCBlbnZpcm9ubWVudHMgKi8KKyAgLyogc29hcC5zb2NrZXRfZmxhZ3MgPSBNU0dfTk9TSUdOQUw7ICovCS8qIHVzZSB0aGlzIHRvIGRpc2FibGUgU0lHUElQRSAqLworICAvKiBzb2FwLmJpbmRfZmxhZ3MgfD0gU09fTk9TSUdQSVBFOyAqLwkvKiBvciB1c2UgdGhpcyB0byBkaXNhYmxlIFNJR1BJUEUgKi8KKyAgbSA9IHNvYXBfYmluZCgmc29hcCwgTlVMTCwgcG9ydCwgQkFDS0xPRyk7CisgIGlmIChtIDwgMCkKKyAgeyBzb2FwX3ByaW50X2ZhdWx0KCZzb2FwLCBzdGRlcnIpOworICAgIGV4aXQoMSk7CisgIH0KKyAgZnByaW50ZihzdGRlcnIsICJTb2NrZXQgY29ubmVjdGlvbiBzdWNjZXNzZnVsICVkXG4iLCBtKTsKKyAgZm9yIChpID0gMTsgOyBpKyspCisgIHsgcyA9IHNvYXBfYWNjZXB0KCZzb2FwKTsKKyAgICBpZiAocyA8IDApCisgICAgeyBpZiAoc29hcC5lcnJudW0pCisgICAgICAgIHNvYXBfcHJpbnRfZmF1bHQoJnNvYXAsIHN0ZGVycik7CisgICAgICBlbHNlCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMgdGltZWQgb3V0XG4iLCBhcmd2WzBdKTsJLyogc2hvdWxkIHJlYWxseSB3YWl0IGZvciB0aHJlYWRzIHRvIHRlcm1pbmF0ZSwgYnV0IDI0aHIgdGltZW91dCBzaG91bGQgYmUgZW5vdWdoIC4uLiAqLworICAgICAgYnJlYWs7CisgICAgfQorICAgIGZwcmludGYoc3RkZXJyLCAiVGhyZWFkICVkIGFjY2VwdHMgc29ja2V0ICVkIGNvbm5lY3Rpb24gZnJvbSBJUCAlZC4lZC4lZC4lZFxuIiwgaSwgcywgKGludCkoc29hcC5pcD4+MjQpJjB4RkYsIChpbnQpKHNvYXAuaXA+PjE2KSYweEZGLCAoaW50KShzb2FwLmlwPj44KSYweEZGLCAoaW50KXNvYXAuaXAmMHhGRik7CisgICAgdHNvYXAgPSBzb2FwX2NvcHkoJnNvYXApOworICAgIHB0aHJlYWRfY3JlYXRlKCZ0aWQsIE5VTEwsICh2b2lkKigqKSh2b2lkKikpcHJvY2Vzc19yZXF1ZXN0LCAodm9pZCopdHNvYXApOworICB9CisgIHJldHVybiAwOworfQorCit2b2lkICpwcm9jZXNzX3JlcXVlc3Qodm9pZCAqc29hcCkKK3sgc3RydWN0IHNvYXAgKnRzb2FwID0gKHN0cnVjdCBzb2FwKilzb2FwOworICBwdGhyZWFkX2RldGFjaChwdGhyZWFkX3NlbGYoKSk7CisgIHNvYXBfc2VydmUodHNvYXApOworICBzb2FwX2Rlc3Ryb3kodHNvYXApOworICBzb2FwX2VuZCh0c29hcCk7CisgIHNvYXBfZG9uZSh0c29hcCk7CisgIGZyZWUodHNvYXApOworICByZXR1cm4gTlVMTDsKK30KKworaW50IG5zX19oYW5kbGUoc3RydWN0IHNvYXAgKnNvYXAsIGVudW0gbnNfX2V2ZW50IGV2ZW50KQoreyBzd2l0Y2ggKGV2ZW50KQorICB7IC8qIGVhY2ggZXZlbnQgaXMganVzdCBjb25zdW1lZCB3aXRob3V0IHNlcnZlciByZXNwb25zZSAqLworICAgIGNhc2UgRVZFTlRfQTogZnByaW50ZihzdGRlcnIsICJTZXJ2ZXIgRXZlbnQ6IEFcbiIpOyBicmVhazsKKyAgICBjYXNlIEVWRU5UX0I6IGZwcmludGYoc3RkZXJyLCAiU2VydmVyIEV2ZW50OiBCXG4iKTsgYnJlYWs7CisgICAgY2FzZSBFVkVOVF9DOiBmcHJpbnRmKHN0ZGVyciwgIlNlcnZlciBFdmVudDogQ1xuIik7IGJyZWFrOworICAgIC8qIGFmdGVyIHJlY2VpdmluZyBldmVudCBaLCB3ZSBlY2hvIGV2ZW50cyBBIHRvIEMgYmFjayB0byB0aGUgY2xpZW50ICovCisgICAgY2FzZSBFVkVOVF9aOiBmcHJpbnRmKHN0ZGVyciwgIlNlcnZlciBFdmVudDogWlxuIik7CisgICAgeyBzdHJ1Y3Qgc29hcCAqcmVzcCA9IHNvYXBfY29weShzb2FwKTsKKyAgICAgIC8qIHRoZXNlIG11bHRpcGxlIHNlbmRzIGFzc3VtZSB0aGF0IHRoZSBjbGllbnQgZW5hYmxlZCBrZWVwLWFsaXZlICovCisgICAgICBzb2FwX3NlbmRfbnNfX2hhbmRsZShyZXNwLCAiaHR0cDovLyIsIE5VTEwsIEVWRU5UX0EpOworICAgICAgc29hcF9zZW5kX25zX19oYW5kbGUocmVzcCwgImh0dHA6Ly8iLCBOVUxMLCBFVkVOVF9CKTsKKyAgICAgIHNvYXBfc2VuZF9uc19faGFuZGxlKHJlc3AsICJodHRwOi8vIiwgTlVMTCwgRVZFTlRfQyk7CisgICAgICBzb2FwX2VuZChyZXNwKTsKKyAgICAgIHNvYXBfZG9uZShyZXNwKTsKKyAgICAgIGZyZWUocmVzcCk7CisgICAgfQorICB9CisgIGlmIChldmVudCAhPSBFVkVOVF9aICYmIHN5bmNocm9ub3VzKQorICAgIHJldHVybiBzb2FwX3NlbmRfZW1wdHlfcmVzcG9uc2Uoc29hcCk7CisgIHJldHVybiBTT0FQX09LOworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9mYWN0b3J5L01ha2VmaWxlIGIvc2FtcGxlcy9mYWN0b3J5L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMzFjNzgKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2ZhY3RvcnkvTWFrZWZpbGUKQEAgLTAsMCArMSwyMCBAQAorR1NPQVA9Li4vLi4vc29hcGNwcDIKK1NPQVBIPS4uLy4uL3N0ZHNvYXAyLmgKK1NPQVBDPS4uLy4uL3N0ZHNvYXAyLmMKK1NPQVBDUFA9Li4vLi4vc3Rkc29hcDIuY3BwCitDQz1nY2MKK0NQUD1nKysKK0xJQlM9CitDT0ZMQUdTPS1PMgorQ1dGTEFHUz0tV2FsbAorQ0lGTEFHUz0tSS4uLy4uCitDTUZMQUdTPQorQ0ZMQUdTPSAkKENXRkxBR1MpICQoQ09GTEFHUykgJChDSUZMQUdTKSAkKENNRkxBR1MpCithbGw6CQlmYWN0b3J5CitmYWN0b3J5OglmYWN0b3J5LmggZmFjdG9yeS5jcHAgJChTT0FQSCkgJChTT0FQQ1BQKQorCQkkKEdTT0FQKSBmYWN0b3J5LmgKKwkJJChDUFApICQoQ0ZMQUdTKSAtbyBmYWN0b3J5IGZhY3RvcnkuY3BwIHNvYXBDLmNwcCBzb2FwU2VydmVyLmNwcCAkKFNPQVBDUFApICQoTElCUykKK2NsZWFuOgorCQlybSAtZiAqLm8gc29hcEguaCBzb2FwU3R1Yi5oIHNvYXBDLmNwcCBzb2FwQy5jIHNvYXBDbGllbnQuY3BwIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmNwcCBzb2FwU2VydmVyLmMgc29hcCpQcm94eS5oCitkaXN0Y2xlYW46CisJCXJtIC1mICoubyAqLndzZGwgKi54c2QgKi54bWwgKi5uc21hcCAqLmxvZyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5LmggZmFjdG9yeQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9mYWN0b3J5L01ha2VmaWxlU29sYXJpcyBiL3NhbXBsZXMvZmFjdG9yeS9NYWtlZmlsZVNvbGFyaXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZlOGIyMgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZmFjdG9yeS9NYWtlZmlsZVNvbGFyaXMKQEAgLTAsMCArMSwyMCBAQAorR1NPQVA9Li4vLi4vc29hcGNwcDIKK1NPQVBIPS4uLy4uL3N0ZHNvYXAyLmgKK1NPQVBDPS4uLy4uL3N0ZHNvYXAyLmMKK1NPQVBDUFA9Li4vLi4vc3Rkc29hcDIuY3BwCitDQz1nY2MKK0NQUD1nKysKK0xJQlM9LWx4bmV0IC1sbnNsIC1sc29ja2V0CitDT0ZMQUdTPS1PMgorQ1dGTEFHUz0tV2FsbAorQ0lGTEFHUz0tSS4uLy4uCitDTUZMQUdTPQorQ0ZMQUdTPSAkKENXRkxBR1MpICQoQ09GTEFHUykgJChDSUZMQUdTKSAkKENNRkxBR1MpCithbGw6CQlmYWN0b3J5CitmYWN0b3J5OglmYWN0b3J5LmggZmFjdG9yeS5jcHAgJChTT0FQSCkgJChTT0FQQ1BQKQorCQkkKEdTT0FQKSBmYWN0b3J5LmgKKwkJJChDUFApICQoQ0ZMQUdTKSAtbyBmYWN0b3J5IGZhY3RvcnkuY3BwIHNvYXBDLmNwcCBzb2FwU2VydmVyLmNwcCAkKFNPQVBDUFApICQoTElCUykKK2NsZWFuOgorCQlybSAtZiAqLm8gc29hcEguaCBzb2FwU3R1Yi5oIHNvYXBDLmNwcCBzb2FwQy5jIHNvYXBDbGllbnQuY3BwIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmNwcCBzb2FwU2VydmVyLmMgc29hcCpQcm94eS5oCitkaXN0Y2xlYW46CisJCXJtIC1mICoubyAqLndzZGwgKi54c2QgKi54bWwgKi5uc21hcCAqLmxvZyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5LmggZmFjdG9yeQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9mYWN0b3J5L2ZhY3RvcnkuY3BwIGIvc2FtcGxlcy9mYWN0b3J5L2ZhY3RvcnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMWUwNTcKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2ZhY3RvcnkvZmFjdG9yeS5jcHAKQEAgLTAsMCArMSw0NzcgQEAKKy8qCWZhY3RvcnkuY3BwCisKKwlSZW1vdGUgb2JqZWN0IGZhY3RvcnkKKworCVRoZSByZW1vdGUgb2JqZWN0IGZhY3RvcnkgdXNlcyBhIGxlYXNlLWJhc2VkIHN5c3RlbS4gUmVtb3RlIG9iamVjdHMKKwlhcmUgcHVyZ2VkIGZyb20gdGhlIHBvb2wgd2hlbiB0aGUgbGVhc2UgZXhwaXJlcy4gU3VwcG9ydHMgaW5oZXJpdGFuY2UuCisKKwlDb21waWxlOgorCXNvYXBjcHAyIGZhY3RvcnkuaAorCWMrKyAtbyBmYWN0b3J5IGZhY3RvcnkuY3BwIHN0ZHNvYXAyLmNwcCBzb2FwQy5jcHAgc29hcFNlcnZlci5jcHAKKworCVJ1biAoZS5nLiBpbiB0aGUgYmFja2dyb3VuZCkKKwlmYWN0b3J5IDxwb3J0PgorCXdoZXJlIDxwb3J0PiBpcyBhIGF2YWlsYWJsZSBwb3J0IG51bWJlciwgZS5nLiAxODA4NQorCisJQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorKi8KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CS8vIGZvciBvcGVuKCkKKworI2luY2x1ZGUgInNvYXBILmgiCisjaW5jbHVkZSAiZmFjdG9yeS5uc21hcCIKKworI2RlZmluZSBQT09MU0laRSAxMDAwCS8vIG1heCBudW1iZXIgb2YgcmVtb3RlIG9iamVjdHMgdGhhdCBjYW4gYmUgYWxpdmUgYXQgYW55IGluc3RhbmNlCisKKyNkZWZpbmUgTEVBU0VURVJNIDYwCS8vIGxlYXNlIHRlcm0gKGluIHNlY29uZHMpLiBBbHNvIHRoZSByYXRlIGF0IHdoaWNoIG9iamVjdHMgYXJlIHB1cmdlZAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBGYWN0b3J5IGNsYXNzIG1haW50YWlucyBwb29sIG9mIG9iamVjdHMgYW5kIGNhbiBhY3QgYXMgYSBzaW1wbGUgT1JCCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgRmFjdG9yeQoreyBwdWJsaWM6CisgIHRfX3Jvb3QgKnJlZltQT09MU0laRV07CS8vIHBvb2wgb2Ygb2JqZWN0cyAodF9fcm9vdCBpcyBiYXNlIGNsYXNzKQorICB1bnNpZ25lZCBpbnQgaGFuZGxlOwkJLy8gaGFuZGxlIGdlbmVyYXRpb24gY291bnRlciAoaXMgYWxsb3dlZCB0byB3cmFwIGFyb3VuZCAzMiBiaXRzKQorICBGYWN0b3J5KCk7CisgIH5GYWN0b3J5KCk7CisgIHVuc2lnbmVkIGludCBjcmVhdGUoc3RydWN0IHNvYXAgKnNvYXAsIGVudW0gdF9fb2JqZWN0IG9iamVjdCwgY2hhciAqbmFtZSk7CisgIHVuc2lnbmVkIGludCBsb29rdXAoZW51bSB0X19vYmplY3Qgb2JqZWN0LCBjaGFyICpuYW1lKTsKKyAgdW5zaWduZWQgaW50IHJlbmFtZSh1bnNpZ25lZCBpbnQgaGFuZGxlLCBjaGFyICpuYW1lKTsKKyAgdm9pZCByZWxlYXNlKHVuc2lnbmVkIGludCBoYW5kbGUpOworICB2b2lkIHB1cmdlKHN0cnVjdCBzb2FwKiBzb2FwKTsKKyAgdF9fcm9vdCAqZ2V0KHVuc2lnbmVkIGludCBoYW5kbGUpOworICB0X19yb290ICpyb290KHVuc2lnbmVkIGludCBoYW5kbGUpOworICB0X19hZGRlciAqYWRkZXIodW5zaWduZWQgaW50IGhhbmRsZSk7CisgIHRfX2NvdW50ZXIgKmNvdW50ZXIodW5zaWduZWQgaW50IGhhbmRsZSk7CisgIGludCBzYXZlKGNvbnN0IGNoYXIgKmZpbGUpOworICBpbnQgbG9hZChjb25zdCBjaGFyICpmaWxlKTsKK307CisKKy8vIEluaXRpYWxpemUgZW1wdHkgcG9vbCBhbmQgc2V0IGhhbmRsZSBnZW5lcmF0aW9uIGNvdW50ZXIgdG8gMAorRmFjdG9yeTo6RmFjdG9yeSgpCit7IGZvciAoaW50IGkgPSAwOyBpIDwgUE9PTFNJWkU7IGkrKykKKyAgICByZWZbaV0gPSBOVUxMOworICBoYW5kbGUgPSAwOworfQorCisvLyBSZW1vdmUgYWxsIG9iamVjdHMgZnJvbSBwb29sCitGYWN0b3J5Ojp+RmFjdG9yeSgpCit7IGZvciAoaW50IGkgPSAwOyBpIDwgUE9PTFNJWkU7IGkrKykKKyAgICBpZiAocmVmW2ldKQorICAgICAgZGVsZXRlIHJlZltpXTsKK30KKworLy8gQ3JlYXRlIGEgbmV3IG9iamVjdCwgcGxhY2UgaXQgaW4gdGhlIHBvb2wsIGFuZCByZXR1cm4gaGFuZGxlCit1bnNpZ25lZCBpbnQgRmFjdG9yeTo6Y3JlYXRlKHN0cnVjdCBzb2FwICpzb2FwLCBlbnVtIHRfX29iamVjdCBvYmplY3QsIGNoYXIgKm5hbWUpCit7IGZvciAoaW50IGkgPSAwOyBpIDwgUE9PTFNJWkU7IGkrKykKKyAgICBpZiAoIXJlZlsrK2hhbmRsZSAlIFBPT0xTSVpFXSkJLy8gc3VjY2VlZHMgaWYgdGhpcyBzbG90IGlzIGF2YWlsYWJsZQorICAgIHsgdF9fcm9vdCAqciA9IE5VTEw7CisgICAgICBpZiAoIWhhbmRsZSkKKyAgICAgICAgaGFuZGxlICs9IFBPT0xTSVpFOwkJLy8gbWFrZSBzdXJlIGhhbmRsZSBpcyBuZXZlciAwICgwIGluZGljYXRlcyBpbnZhbGlkIGhhbmRsZSkKKyAgICAgIHN3aXRjaCAob2JqZWN0KQkJCS8vIHR5cGUgb2Ygb2JqZWN0IHRvIGluc3RhbnRpYXRlCisgICAgICB7IGNhc2UgUk9PVDoKKyAgICAgICAgICByID0gbmV3IHRfX3Jvb3QoKTsKKwkgIGJyZWFrOworICAgICAgICBjYXNlIEFEREVSOgorICAgICAgICAgIHIgPSBuZXcgdF9fYWRkZXIoKTsKKwkgIGJyZWFrOworICAgICAgICBjYXNlIENPVU5URVI6CisgICAgICAgICAgciA9IG5ldyB0X19jb3VudGVyKCk7CisJICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChyKQorICAgICAgeyByZWZbaGFuZGxlICUgUE9PTFNJWkVdID0gcjsJCS8vIGFkZCBvYmplY3QgdG8gdGhlIHBvb2wKKyAgICAgICAgci0+b2JqZWN0ID0gb2JqZWN0OwkJCS8vIHNhdmUgdHlwZQorCWlmIChuYW1lKQkJCQkvLyBzYXZlIG5hbWUgKGlmIGFzc2lnbmVkKQorCXsgci0+bmFtZSA9IChjaGFyKiltYWxsb2Moc3RybGVuKG5hbWUrMSkpOworCSAgc3RyY3B5KHItPm5hbWUsIG5hbWUpOworCX0KKwllbHNlCisJICByLT5uYW1lID0gTlVMTDsKKyAgICAgICAgci0+aGFuZGxlID0gaGFuZGxlOwkJCS8vIGtlZXAgaGFuZGxlIGZvciB2ZXJpZmljYXRpb24KKyAgICAgICAgci0+cmVuZXcoKTsJCQkJLy8gcmVuZXcgaXRzIGxlYXNlCisgICAgICAgIHJldHVybiBoYW5kbGU7CisgICAgICB9CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIHJldHVybiAwOworfQorCisvLyBMb29rdXAgdGhlIG5hbWUgb2YgYW4gb2JqZWN0IGFuZCByZXR1cm4gaGFuZGxlCit1bnNpZ25lZCBpbnQgRmFjdG9yeTo6bG9va3VwKGVudW0gdF9fb2JqZWN0IG9iamVjdCwgY2hhciAqbmFtZSkKK3sgZm9yIChpbnQgaSA9IDA7IGkgPCBQT09MU0laRTsgaSsrKQorICAgIGlmIChyZWZbaV0gJiYgcmVmW2ldLT5vYmplY3QgPT0gb2JqZWN0ICYmIHJlZltpXS0+bmFtZSAmJiAhc3RyY21wKHJlZltpXS0+bmFtZSwgbmFtZSkpCisgICAgeyByZWZbaV0tPnJlbmV3KCk7CisgICAgICByZXR1cm4gcmVmW2ldLT5oYW5kbGU7CisgICAgfQorICByZXR1cm4gMDsKK30KKworLy8gUmVuYW1lIG9iamVjdCBhbmQgcmV0dXJuIGhhbmRsZSBpZiBzdWNjZXNzZnVsCit1bnNpZ25lZCBpbnQgRmFjdG9yeTo6cmVuYW1lKHVuc2lnbmVkIGludCBoYW5kbGUsIGNoYXIgKm5hbWUpCit7IHRfX3Jvb3QgKnIgPSBnZXQoaGFuZGxlKTsKKyAgaWYgKHIpCisgIHsgaWYgKHItPm5hbWUpCisgICAgICBmcmVlKHItPm5hbWUpOworICAgIHItPm5hbWUgPSAoY2hhciopbWFsbG9jKHN0cmxlbihuYW1lKSsxKTsKKyAgICBzdHJjcHkoci0+bmFtZSwgbmFtZSk7CisgICAgci0+cmVuZXcoKTsKKyAgICByZXR1cm4gaGFuZGxlOworICB9CisgIHJldHVybiAwOworfQorCisvLyBnZXQgcmVmIHRvIG9iamVjdCBmcm9tIGhhbmRsZQordF9fcm9vdCAqRmFjdG9yeTo6Z2V0KHVuc2lnbmVkIGludCBoYW5kbGUpCit7IHRfX3Jvb3QgKnIgPSByZWZbaGFuZGxlICUgUE9PTFNJWkVdOworICBpZiAociAmJiByLT5oYW5kbGUgPT0gaGFuZGxlKQorICAgIHJldHVybiByOworICByZXR1cm4gTlVMTDsKK30KKworLy8gZ2V0IHJlZiB0byByb290IG9iamVjdCBmcm9tIGhhbmRsZSBhbmQgcmVuZXcgbGVhc2UKK3RfX3Jvb3QgKkZhY3Rvcnk6OnJvb3QodW5zaWduZWQgaW50IGhhbmRsZSkKK3sgdF9fcm9vdCAqciA9IGdldChoYW5kbGUpOworICBpZiAocikKKyAgICByLT5yZW5ldygpOworICByZXR1cm4gcjsKK30KKworLy8gZ2V0IHJlZiB0byBhZGRlciBvYmplY3QgZnJvbSBoYW5kbGUgYW5kIHJlbmV3IGxlYXNlCit0X19hZGRlciAqRmFjdG9yeTo6YWRkZXIodW5zaWduZWQgaW50IGhhbmRsZSkKK3sgdF9fYWRkZXIgKmEgPSAodF9fYWRkZXIqKWdldChoYW5kbGUpOworICBpZiAoYSkKKyAgeyBpZiAoYS0+b2JqZWN0ID09IEFEREVSIHx8IGEtPm9iamVjdCA9PSBDT1VOVEVSKQorICAgICAgYS0+cmVuZXcoKTsKKyAgICBlbHNlCisgICAgICBhID0gTlVMTDsKKyAgfQorICByZXR1cm4gYTsKK30KKworLy8gZ2V0IHJlZiB0byBjb3VudGVyIG9iamVjdCBmcm9tIGhhbmRsZSBhbmQgcmVuZXcgbGVhc2UKK3RfX2NvdW50ZXIgKkZhY3Rvcnk6OmNvdW50ZXIodW5zaWduZWQgaW50IGhhbmRsZSkKK3sgdF9fY291bnRlciAqYyA9ICh0X19jb3VudGVyKilnZXQoaGFuZGxlKTsKKyAgaWYgKGMpCisgIHsgaWYgKGMtPm9iamVjdCA9PSBDT1VOVEVSKQorICAgICAgYy0+cmVuZXcoKTsKKyAgICBlbHNlCisgICAgICBjID0gTlVMTDsKKyAgfQorICByZXR1cm4gYzsKK30KKworLy8gcmVtb3ZlIGFsbCBvYmplY3RzIGZyb20gcG9vbCB3aG9zZSBsZWFzZSBoYXMgZXhwaXJlZAordm9pZCBGYWN0b3J5OjpwdXJnZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgdGltZV90IHQgPSB0aW1lKE5VTEwpOwkJLy8gY3VycmVudCB0aW1lCisgIGludCBmbGFnID0gMTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBQT09MU0laRTsgaSsrKQorICB7IHRfX3Jvb3QgKnIgPSByZWZbaV07CisgICAgaWYgKHIgJiYgci0+bGVhc2UgPCB0KQkJLy8gZXhwaXJlZD8KKyAgICB7IGlmIChmbGFnKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuUHVyZ2luZyBvYmplY3RzOiIpOworICAgICAgaWYgKHItPm5hbWUpCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMoJXUpXG4iLCByLT5uYW1lLCByLT5oYW5kbGUpOworICAgICAgZWxzZQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIigldSlcbiIsIHItPmhhbmRsZSk7CisgICAgICBzb2FwX2RlbGV0ZShzb2FwLCByKTsKKyAgICAgIHJlZltpXSA9IE5VTEw7CisgICAgICBmbGFnID0gMDsKKyAgICB9CisgIH0KK30KKworLy8gcmVtb3ZlIG9iamVjdCBmcm9tIHBvb2wgYW5kIHJlbGVhc2Ugc2xvdAordm9pZCBGYWN0b3J5OjpyZWxlYXNlKHVuc2lnbmVkIGludCBoYW5kbGUpCit7IHRfX3Jvb3QgKnIgPSBnZXQoaGFuZGxlKTsKKyAgaWYgKHIpCisgICAgcmVmW2hhbmRsZSAlIFBPT0xTSVpFXSA9IE5VTEw7Cit9CisKKy8vIHNhdmUgb2JqZWN0IHBvb2wgdG8gZmlsZSAob3Igc3Rkb3V0KQoraW50IEZhY3Rvcnk6OnNhdmUoY29uc3QgY2hhciAqZmlsZSkKK3sgc3RydWN0IHNvYXAgc29hcDsJLy8gdXNlIGEgbmV3IGxvY2FsIGdTT0FQIGVudmlyb25tZW50CisgIHNvYXBfaW5pdCgmc29hcCk7CisgIHNvYXBfYmVnaW4oJnNvYXApOworICBpZiAoZmlsZSkKKyAgICBzb2FwLnNlbmRmZCA9IG9wZW4oZmlsZSwgT19DUkVBVHxPX1RSVU5DfE9fV1JPTkxZLCBTX0lSRUFEfFNfSVdSSVRFKTsKKyAgaWYgKHNvYXAuc2VuZGZkIDwgMCkKKyAgICByZXR1cm4gLTE7CisgIHNvYXBfYmVnaW5fc2VuZCgmc29hcCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgUE9PTFNJWkU7IGkrKykKKyAgICBpZiAocmVmW2ldKQorICAgIHsgcmVmW2ldLT5zb2FwX3NlcmlhbGl6ZSgmc29hcCk7CisgICAgICBzb2FwX2JlZ2luX3NlbmQoJnNvYXApOworICAgICAgcmVmW2ldLT5zb2FwX3B1dCgmc29hcCwgIml0ZW0iLCBOVUxMKTsKKyAgICAgIHNvYXBfZW5kX3NlbmQoJnNvYXApOworICAgIH0KKyAgaWYgKGZpbGUpCisgICAgY2xvc2Uoc29hcC5zZW5kZmQpOworICBzb2FwX2VuZCgmc29hcCk7CisgIHNvYXBfZG9uZSgmc29hcCk7CisgIHJldHVybiAwOworfQorCisvLyBsb2FkIG9iamVjdCBwb29sIGZyb20gZmlsZSAob3Igc3RkaW4pCitpbnQgRmFjdG9yeTo6bG9hZChjb25zdCBjaGFyICpmaWxlKQoreyBzdHJ1Y3Qgc29hcCBzb2FwOworICB0X19yb290ICpyOworICBzb2FwX2luaXQoJnNvYXApOworICBpZiAoZmlsZSkKKyAgICBzb2FwLnJlY3ZmZCA9IG9wZW4oZmlsZSwgT19SRE9OTFkpOworICBpZiAoc29hcC5yZWN2ZmQgPCAwKQorICAgIHJldHVybiAtMTsKKyAgc29hcF9iZWdpbl9yZWN2KCZzb2FwKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBQT09MU0laRTsgaSsrKQorICB7IGlmIChyZWZbaV0pCisgICAgeyBkZWxldGUgcmVmW2ldOworICAgICAgcmVmW2ldID0gTlVMTDsKKyAgICB9CisgIH0KKyAgZm9yICg7OykKKyAgeyByID0gc29hcF9pbl90X19yb290KCZzb2FwLCAiaXRlbSIsIE5VTEwsIE5VTEwpOwkvLyB1c2UgdGhlICdpbicgcm91dGluZSAoJ2dldCcgd2lsbCBhbHNvIGF0dGVtcHQgdG8gcGFyc2UgdGhlIHJlbWFpbmluZyBYTUwpCisgICAgaWYgKHIpCisgICAgICByZWZbci0+aGFuZGxlICUgUE9PTFNJWkVdID0gcjsKKyAgICBlbHNlCisgICAgICBicmVhazsKKyAgfQorICBpZiAoZmlsZSkKKyAgICBjbG9zZShzb2FwLnJlY3ZmZCk7CisgIGlmIChzb2FwLmVycm9yICE9IFNPQVBfT0sgJiYgc29hcC5lcnJvciAhPSBTT0FQX0VPRikKKyAgeyBzb2FwX3ByaW50X2ZhdWx0KCZzb2FwLCBzdGRlcnIpOworICAgIHNvYXBfcHJpbnRfZmF1bHRfbG9jYXRpb24oJnNvYXAsIHN0ZGVycik7CisgIH0KKyAgc29hcF9mcmVlKCZzb2FwKTsJLy8gZG8gbm90IGNhbGwgc29hcF9lbmQ6IHRoaXMgd291bGQgcmVtb3ZlIGFsbCBkZXNlcmlhbGl6ZWQgZGF0YQorICBzb2FwX2RvbmUoJnNvYXApOworICByZXR1cm4gMDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgTWFpbiBzZXJ2ZXIgcHJvZ3JhbQorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sgaW50IG0sIHM7CisgIHN0cnVjdCBzb2FwIHNvYXA7CisgIEZhY3RvcnkgZmFjdG9yeTsJCQkvLyBjcmVhdGUgZmFjdG9yeSBhbmQgc2ltcGxlIE9SQgorICBzb2FwX2luaXQoJnNvYXApOworICBzb2FwLnVzZXIgPSAodm9pZCopJmZhY3Rvcnk7CQkvLyBhc3NvY2lhdGUgZmFjdG9yeSB3aXRoIHJ1bi10aW1lCisgIHNvYXAuYWNjZXB0X3RpbWVvdXQgPSAxOwkJLy8gY2hlY2sgZXZlcnkgc2Vjb25kLCBpZiBub3QgdG9vIGJ1c3kgZm9yIHB1cmdpbmcgb2JqZWN0cworICBpZiAoYXJnYyA8IDIpCisgIHsgZmFjdG9yeS5sb2FkKCJmYWN0b3J5LmRhdCIpOwkvLyBpZiBDR0kgaXMgdXNlZCwgbG9hZCB0aGUgZW50aXJlIHBvb2wgKG5vdCB2ZXJ5IGVmZmljaWVudCBhbmQgdGhlcmUgbWF5IGJlIGEgY29tcGV0aXRpb24gZm9yIGFjY2VzcyB0byB0aGlzIGZpbGUhIFRoaXMgaXMganVzdCB0byBkZW1vbnN0cmF0ZSBsb2FkL3NhdmUgb2YgdGhlIGVudGlyZSBwb29sKQorICAgIGZhY3RvcnkucHVyZ2UoJnNvYXApOworICAgIHNvYXBfc2VydmUoJnNvYXApOworICAgIGZhY3Rvcnkuc2F2ZSgiZmFjdG9yeS5kYXQiKTsJLy8gLi4uIGFuZCBzYXZlIGFmdGVyd2FyZHMKKyAgfQorICBlbHNlCisgIHsgbSA9IHNvYXBfYmluZCgmc29hcCwgTlVMTCwgYXRvaShhcmd2WzFdKSwgMTAwKTsJLy8gdXNlIGNvbW1hbmQgbGluZSBhcmd1bWVudCBhcyBwb3J0IG51bWJlcgorICAgIGlmIChtIDwgMCkKKyAgICB7IHNvYXBfcHJpbnRfZmF1bHQoJnNvYXAsIHN0ZGVycik7CisgICAgICBleGl0KDEpOworICAgIH0KKyAgICBmcHJpbnRmKHN0ZGVyciwgIlNvY2tldCBjb25uZWN0aW9uIHN1Y2Nlc3NmdWwgJWRcbiIsIG0pOworICAgIGZvciAoaW50IGkgPSAxOyA7IGkrKykKKyAgICB7IHMgPSBzb2FwX2FjY2VwdCgmc29hcCk7CisgICAgICBpZiAocyA8IDApCisgICAgICB7IGlmIChzb2FwLmVycm51bSkKKyAgICAgICAgICBzb2FwX3ByaW50X2ZhdWx0KCZzb2FwLCBzdGRlcnIpOworCWVsc2UJCQkvLyBlcnJudW0gaXMgMCwgd2hpY2ggbWVhbnMgYSB0aW1lb3V0IGhhcyBvY2N1cnJlZAorCXsgZmFjdG9yeS5wdXJnZSgmc29hcCk7CS8vIHB1cmdlIG9iamVjdHMgd2hvc2UgbGVhc2UgaGFzIHJhbiBvdXQKKwkgIGNvbnRpbnVlOworCX0KKwlleGl0KDEpOworICAgICAgfQorICAgICAgZnByaW50ZihzdGRlcnIsICIlZDogYWNjZXB0ZWQgJWQgSVA9JWQuJWQuJWQuJWQgLi4uICIsIGksIHMsIChpbnQpKHNvYXAuaXA+PjI0KSYweEZGLCAoaW50KShzb2FwLmlwPj4xNikmMHhGRiwgKGludCkoc29hcC5pcD4+OCkmMHhGRiwgKGludClzb2FwLmlwJjB4RkYpOworICAgICAgc29hcF9zZXJ2ZSgmc29hcCk7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgInNlcnZlZFxuIik7CisgICAgICBzb2FwX2VuZCgmc29hcCk7CQkvLyBjbGVhbiB1cDogdGhpcyB3aWxsIHJlbW92ZSBkZXNlcmlhbGl6ZWQgZGF0YQorICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgUmVtb3RlIGZhY3RvcnkgbWV0aG9kIGltcGxlbWVudGF0aW9ucworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2ludCBuc19fY3JlYXRlKHN0cnVjdCBzb2FwICpzb2FwLCBlbnVtIHRfX29iamVjdCBvYmplY3QsIGNoYXIgKm5hbWUsIGVudW0gdF9fc3RhdHVzICZzdGF0dXMpCit7IEZhY3RvcnkgKmZhY3RvcnkgPSAoRmFjdG9yeSopc29hcC0+dXNlcjsJLy8gZ2V0IGZhY3RvcnkgZnJvbSBnU09BUCBlbnZpcm9ubWVudAorICBpZiAoIXNvYXAtPmhlYWRlcikKKyAgICBzb2FwLT5oZWFkZXIgPSAoc3RydWN0IFNPQVBfRU5WX19IZWFkZXIqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3QgU09BUF9FTlZfX0hlYWRlcikpOworICBpZiAoc29hcC0+aGVhZGVyKQorICB7IHNvYXAtPmhlYWRlci0+aF9faGFuZGxlID0gZmFjdG9yeS0+Y3JlYXRlKHNvYXAsIG9iamVjdCwgbmFtZSk7CisgICAgaWYgKHNvYXAtPmhlYWRlci0+aF9faGFuZGxlKQorICAgICAgc3RhdHVzID0gRkFDVE9SWV9PSzsKKyAgICBlbHNlCisgICAgICBzdGF0dXMgPSBGQUNUT1JZX0lOVkFMSUQ7CisgIH0KKyAgZWxzZQorICAgIHN0YXR1cyA9IEZBQ1RPUllfUkVUUlk7CisgIHJldHVybiBTT0FQX09LOworfQorCitpbnQgbnNfX2xvb2t1cChzdHJ1Y3Qgc29hcCAqc29hcCwgZW51bSB0X19vYmplY3Qgb2JqZWN0LCBjaGFyICpuYW1lLCBlbnVtIHRfX3N0YXR1cyAmc3RhdHVzKQoreyBGYWN0b3J5ICpmYWN0b3J5ID0gKEZhY3RvcnkqKXNvYXAtPnVzZXI7CS8vIGdldCBmYWN0b3J5IGZyb20gZ1NPQVAgZW52aXJvbm1lbnQKKyAgaWYgKCFzb2FwLT5oZWFkZXIpCisgICAgc29hcC0+aGVhZGVyID0gKHN0cnVjdCBTT0FQX0VOVl9fSGVhZGVyKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IFNPQVBfRU5WX19IZWFkZXIpKTsKKyAgaWYgKHNvYXAtPmhlYWRlcikKKyAgeyBzb2FwLT5oZWFkZXItPmhfX2hhbmRsZSA9IGZhY3RvcnktPmxvb2t1cChvYmplY3QsIG5hbWUpOworICAgIGlmIChzb2FwLT5oZWFkZXItPmhfX2hhbmRsZSkKKyAgICAgIHN0YXR1cyA9IEZBQ1RPUllfT0s7CisgICAgZWxzZQorICAgICAgc3RhdHVzID0gRkFDVE9SWV9OT1RGT1VORDsKKyAgfQorICBlbHNlCisgICAgc3RhdHVzID0gRkFDVE9SWV9SRVRSWTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK2ludCBuc19fcmVuYW1lKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpuYW1lLCBlbnVtIHRfX3N0YXR1cyAmc3RhdHVzKQoreyBGYWN0b3J5ICpmYWN0b3J5ID0gKEZhY3RvcnkqKXNvYXAtPnVzZXI7CS8vIGdldCBmYWN0b3J5IGZyb20gZ1NPQVAgZW52aXJvbm1lbnQKKyAgaWYgKHNvYXAtPmhlYWRlcikKKyAgeyBzb2FwLT5oZWFkZXItPmhfX2hhbmRsZSA9IGZhY3RvcnktPnJlbmFtZShzb2FwLT5oZWFkZXItPmhfX2hhbmRsZSwgbmFtZSk7CisgICAgaWYgKHNvYXAtPmhlYWRlci0+aF9faGFuZGxlKQorICAgICAgc3RhdHVzID0gRkFDVE9SWV9PSzsKKyAgICBlbHNlCisgICAgICBzdGF0dXMgPSBGQUNUT1JZX0lOVkFMSUQ7CisgIH0KKyAgZWxzZQorICAgIHN0YXR1cyA9IEZBQ1RPUllfSU5WQUxJRDsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK2ludCBuc19fcmVsZWFzZShzdHJ1Y3Qgc29hcCAqc29hcCwgZW51bSB0X19zdGF0dXMgJnN0YXR1cykKK3sgRmFjdG9yeSAqZmFjdG9yeSA9IChGYWN0b3J5Kilzb2FwLT51c2VyOwkvLyBnZXQgZmFjdG9yeSBmcm9tIGdTT0FQIGVudmlyb25tZW50CisgIGlmIChzb2FwLT5oZWFkZXIgJiYgc29hcC0+aGVhZGVyLT5oX19oYW5kbGUpCisgIHsgZmFjdG9yeS0+cmVsZWFzZShzb2FwLT5oZWFkZXItPmhfX2hhbmRsZSk7CisgICAgc3RhdHVzID0gRkFDVE9SWV9PSzsKKyAgfQorICBlbHNlCisgICAgc3RhdHVzID0gRkFDVE9SWV9JTlZBTElEOworICByZXR1cm4gU09BUF9PSzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgUmVtb3RlIGFkZGVyIG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitpbnQgbnNfX3NldChzdHJ1Y3Qgc29hcCAqc29hcCwgZG91YmxlIHZhbCwgZW51bSB0X19zdGF0dXMgJnN0YXR1cykKK3sgRmFjdG9yeSAqZmFjdG9yeSA9IChGYWN0b3J5Kilzb2FwLT51c2VyOwkvLyBnZXQgZmFjdG9yeSBmcm9tIGdTT0FQIGVudmlyb25tZW50CisgIGlmIChzb2FwLT5oZWFkZXIpCisgIHsgdF9fYWRkZXIgKmFkZGVyID0gZmFjdG9yeS0+YWRkZXIoc29hcC0+aGVhZGVyLT5oX19oYW5kbGUpOworICAgIGlmIChhZGRlcikKKyAgICB7IGFkZGVyLT5zZXQodmFsKTsKKyAgICAgIHN0YXR1cyA9IEZBQ1RPUllfT0s7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHN0YXR1cyA9IEZBQ1RPUllfSU5WQUxJRDsKKyAgfQorICBlbHNlCisgICAgc3RhdHVzID0gRkFDVE9SWV9JTlZBTElEOworICByZXR1cm4gU09BUF9PSzsKK30KKworaW50IG5zX19nZXQoc3RydWN0IHNvYXAgKnNvYXAsIGRvdWJsZSAmdmFsKQoreyBGYWN0b3J5ICpmYWN0b3J5ID0gKEZhY3RvcnkqKXNvYXAtPnVzZXI7CS8vIGdldCBmYWN0b3J5IGZyb20gZ1NPQVAgZW52aXJvbm1lbnQKKyAgdmFsID0gREJMX05BTjsKKyAgaWYgKHNvYXAtPmhlYWRlcikKKyAgeyB0X19hZGRlciAqYWRkZXIgPSBmYWN0b3J5LT5hZGRlcihzb2FwLT5oZWFkZXItPmhfX2hhbmRsZSk7CisgICAgaWYgKGFkZGVyKQorICAgICAgdmFsID0gYWRkZXItPmdldCgpOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorCitpbnQgbnNfX2FkZChzdHJ1Y3Qgc29hcCAqc29hcCwgZG91YmxlIHZhbCwgZW51bSB0X19zdGF0dXMgJnN0YXR1cykKK3sgRmFjdG9yeSAqZmFjdG9yeSA9IChGYWN0b3J5Kilzb2FwLT51c2VyOwkvLyBnZXQgZmFjdG9yeSBmcm9tIGdTT0FQIGVudmlyb25tZW50CisgIGlmIChzb2FwLT5oZWFkZXIpCisgIHsgdF9fYWRkZXIgKmFkZGVyID0gZmFjdG9yeS0+YWRkZXIoc29hcC0+aGVhZGVyLT5oX19oYW5kbGUpOworICAgIGlmIChhZGRlcikKKyAgICB7IGFkZGVyLT5hZGQodmFsKTsKKyAgICAgIHN0YXR1cyA9IEZBQ1RPUllfT0s7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHN0YXR1cyA9IEZBQ1RPUllfSU5WQUxJRDsKKyAgfQorICBlbHNlCisgICAgc3RhdHVzID0gRkFDVE9SWV9JTlZBTElEOworICByZXR1cm4gU09BUF9PSzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgUmVtb3RlIGNvdW50ZXIgbWV0aG9kIGltcGxlbWVudGF0aW9ucworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2ludCBuc19faW5jKHN0cnVjdCBzb2FwICpzb2FwLCBlbnVtIHRfX3N0YXR1cyAmc3RhdHVzKQoreyBGYWN0b3J5ICpmYWN0b3J5ID0gKEZhY3RvcnkqKXNvYXAtPnVzZXI7CS8vIGdldCBmYWN0b3J5IGZyb20gZ1NPQVAgZW52aXJvbm1lbnQKKyAgaWYgKHNvYXAtPmhlYWRlcikKKyAgeyB0X19jb3VudGVyICpjb3VudGVyID0gZmFjdG9yeS0+Y291bnRlcihzb2FwLT5oZWFkZXItPmhfX2hhbmRsZSk7CisgICAgaWYgKGNvdW50ZXIpCisgICAgeyBjb3VudGVyLT5pbmMoKTsKKyAgICAgIHN0YXR1cyA9IEZBQ1RPUllfT0s7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHN0YXR1cyA9IEZBQ1RPUllfSU5WQUxJRDsKKyAgfQorICBlbHNlCisgICAgc3RhdHVzID0gRkFDVE9SWV9JTlZBTElEOworICByZXR1cm4gU09BUF9PSzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgU2VydmVyLXNpZGUgYmFzZSBmYWN0b3J5IGNsYXNzIG1ldGhvZHMKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit0X19yb290Ojp0X19yb290KCkKK3sgfQorCit0X19yb290Ojp+dF9fcm9vdCgpCit7IGlmIChuYW1lKQorICAgIGZyZWUobmFtZSk7Cit9CisKK3ZvaWQgdF9fcm9vdDo6cmVuZXcoKQoreyBsZWFzZSA9IHRpbWUoTlVMTCkgKyBMRUFTRVRFUk07CS8vIGNhbiBhZG9wdCBhIGxlYXNpbmcgcG9saWN5IHBlciBjbGFzcworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBTZXJ2ZXItc2lkZSBhZGRlciBjbGFzcyBtZXRob2RzCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCB0X19hZGRlcjo6c2V0KGRvdWJsZSB2YWwpCit7IHRoaXMtPnZhbCA9IHZhbDsJLy8gY29weSBkYXRhIHRvIHVwZGF0ZSBzdGF0ZQorfQorCitkb3VibGUgdF9fYWRkZXI6OmdldCgpCit7IHJldHVybiB2YWw7Cit9CisKK3ZvaWQgdF9fYWRkZXI6OmFkZChkb3VibGUgdmFsKQoreyB0aGlzLT52YWwgKz0gdmFsOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBTZXJ2ZXItc2lkZSBjb3VudGVyIGNsYXNzIG1ldGhvZHMKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIHRfX2NvdW50ZXI6OmluYygpCit7IGFkZCgxLjApOworfQorCmRpZmYgLS1naXQgYS9zYW1wbGVzL2ZhY3RvcnkvZmFjdG9yeS5oIGIvc2FtcGxlcy9mYWN0b3J5L2ZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmUxZTllCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9mYWN0b3J5L2ZhY3RvcnkuaApAQCAtMCwwICsxLDE0MiBAQAorLyoJZmFjdG9yeS5oCisKKwlTZXJ2ZXItc2lkZSByZW1vdGUgb2JqZWN0IGZhY3RvcnkgZGVmaW5pdGlvbnMKKworCVNlcnZlciBjb2RlOiBmYWN0b3J5LmNwcAorCisJVGhpcyBoZWFkZXIgZmlsZSBjb250YWlucyBhbGwgdGhlIGNsYXNzIGRlY2xhcmF0aW9ucyBvZiB0aGUgcmVtb3RlCisJb2JqZWN0cyB0byBzdXBwb3J0IHNlcmlhbGl6YXRpb24gb2YgdGhlc2Ugb2JqZWN0cyBmb3Igc2VydmVyLXNpZGUKKwlzdGF0ZSBtYW5hZ2VtZW50IChzaW1wbGUgc2F2ZS9sb2FkIG9wZXJhdGlvbnMgYXJlIGltcGxlbWVudGVkKS4KKworCVRoZSByZW1vdGUgb2JqZWN0IGZhY3RvcnkgdXNlcyBhIGxlYXNlLWJhc2VkIHN5c3RlbS4gUmVtb3RlIG9iamVjdHMKKwlhcmUgcHVyZ2VkIGZyb20gdGhlIHBvb2wgd2hlbiB0aGUgbGVhc2UgZXhwaXJlcyAoc2VlIExFQVNFVEVSTSBpbgorCWZhY3RvcnkuY3BwKS4gU3VwcG9ydHMgaW5oZXJpdGFuY2UuCisKKwlDb21waWxlOgorCXNvYXBjcHAyIGZhY3RvcnkuaAorCWMrKyAtbyBmYWN0b3J5IGZhY3RvcnkuY3BwIHN0ZHNvYXAyLmNwcCBzb2FwQy5jcHAgc29hcFNlcnZlci5jcHAKKworCVJ1biAoZS5nLiBpbiB0aGUgYmFja2dyb3VuZCkKKwlmYWN0b3J5IDxwb3J0PgorCXdoZXJlIDxwb3J0PiBpcyBhIGF2YWlsYWJsZSBwb3J0IG51bWJlciwgZS5nLiAxODA4NQorCisJQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorKi8KKworLy9nc29hcCBucyBzZXJ2aWNlIG5hbWU6CWZhY3RvcnkKKy8vZ3NvYXAgbnMgc2VydmljZSBzdHlsZToJcnBjCisvL2dzb2FwIG5zIHNlcnZpY2UgZW5jb2Rpbmc6CWVuY29kZWQKKy8vZ3NvYXAgbnMgc2VydmljZSBuYW1lc3BhY2U6CWh0dHA6Ly93ZWJzcnYuY3MuZnN1LmVkdS9+ZW5nZWxlbi9mYWN0b3J5LndzZGwKKy8vZ3NvYXAgbnMgc2VydmljZSBsb2NhdGlvbjoJaHR0cDovL2xvY2FsaG9zdDoxODA4NQorCisvL2dzb2FwIG5zIHNjaGVtYSBuYW1lc3BhY2U6IHVybjpmYWN0b3J5U2VydmljZQorLy9nc29hcCB0IHNjaGVtYSBuYW1lc3BhY2U6IHVybjpmYWN0b3J5VHlwZXMKKy8vZ3NvYXAgaCBzY2hlbWEgbmFtZXNwYWNlOiB1cm46ZmFjdG9yeUhhbmRsZXMKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgU09BUCBIZWFkZXI6IHVzZWQgdG8gZXhjaGFuZ2Ugc3RhdGVmdWwgb2JqZWN0IGhhbmRsZXMKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdHJ1Y3QgU09BUF9FTlZfX0hlYWRlcgoreyBtdXN0VW5kZXJzdGFuZCB1bnNpZ25lZCBpbnQgaF9faGFuZGxlOworfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgU2VydmVyLXNpZGUgcm9vdCBjbGFzcworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2VudW0gdF9fb2JqZWN0CQkJCS8vIG9iamVjdCB0eXBlczoKK3sgUk9PVCwJCQkJCS8vIHRfX3Jvb3Qgb2JqZWN0CisgIEFEREVSLAkJCQkvLyB0X19hZGRlciBvYmplY3QKKyAgQ09VTlRFUgkJCQkvLyB0X19jb3VudGVyIG9iamVjdAorfTsKKworZW51bSB0X19zdGF0dXMJCQkJLy8gcmVtb3RlIG9iamVjdCBzdGF0dXM6Cit7IEZBQ1RPUllfT0ssCQkJCQkvLyBvaworICBGQUNUT1JZX0lOVkFMSUQsCQkJCS8vIGludmFsaWQgaGFuZGxlICh3cm9uZyB0eXBlIG9mIG9iamVjdCBvciBsZWFzZSBleHBpcmVkKQorICBGQUNUT1JZX05PVEZPVU5ELAkJCQkvLyBsb29rdXAgb3BlcmF0aW9uIG5vdCBzdWNjZXNzZnVsCisgIEZBQ1RPUllfUkVUUlkJCQkJCS8vIGNhbm5vdCBjcmVhdGUgbmV3IG9iamVjdDogdHJ5IGxhdGVyCit9OworCitjbGFzcyB0X19yb290Cit7IHB1YmxpYzoKKyAgZW51bSB0X19vYmplY3Qgb2JqZWN0OwkJLy8gb2JqZWN0IHR5cGUKKyAgY2hhciAqbmFtZTsJCQkJLy8gb2JqZWN0IG5hbWUgZm9yIGxvb2t1cCBvcGVyYXRpb24gKG9wdGlvbmFsKQorICB1bnNpZ25lZCBpbnQgaGFuZGxlOwkJCS8vIGludGVybmFsIGhhbmRsZQorICB0aW1lX3QgbGVhc2U7CQkJCS8vIGxlYXNlIGV4cGlyYXRpb24gdGltZQorICB0X19yb290KCk7CisgIHZpcnR1YWwgfnRfX3Jvb3QoKTsKKyAgdmlydHVhbCB2b2lkIHJlbmV3KCk7CQkJLy8gdG8gcmVuZXcgbGVhc2UKK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIFNlcnZlci1zaWRlIGFkZGVyIGNsYXNzIGRlcml2ZWQgZnJvbSByb290CisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgdF9fYWRkZXI6IHB1YmxpYyB0X19yb290Cit7IHB1YmxpYzoKKyAgZG91YmxlIHZhbDsJCQkJLy8gY3VycmVudCB2YWx1ZSBvZiB0aGUgYWRkZXIKKyAgdm9pZCBzZXQoZG91YmxlIHZhbCk7CQkJLy8gdG8gc2V0IHRoZSBhZGRlcgorICBkb3VibGUgZ2V0KCk7CQkJCS8vIHRvIGdldCB2YWx1ZSBvZiB0aGUgYWRkZXIKKyAgdm9pZCBhZGQoZG91YmxlIHZhbCk7CQkJLy8gdG8gYWRkIGEgdmFsdWUgdG8gdGhlIGFkZGVyCit9OworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBTZXJ2ZXItc2lkZSBjb3VudGVyIGNsYXNzIGRlcml2ZWQgZnJvbSBhZGRlcgorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NsYXNzIHRfX2NvdW50ZXI6IHB1YmxpYyB0X19hZGRlcgoreyBwdWJsaWM6CisgIHZvaWQgaW5jKCk7CQkJCS8vIHRvIGluY3JlbWVudCB0aGUgY291bnRlcgorfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgUmVtb3RlIGZhY3RvcnkgbWV0aG9kIGludGVyZmFjZXMKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvL2dzb2FwIG5zIHNlcnZpY2UgbWV0aG9kLWhlYWRlci1wYXJ0OiBjcmVhdGUgaF9faGFuZGxlCitpbnQgbnNfX2NyZWF0ZShlbnVtIHRfX29iamVjdCBvYmplY3QsIGNoYXIgKm5hbWUsIGVudW0gdF9fc3RhdHVzICZzdGF0dXMpOworCisvL2dzb2FwIG5zIHNlcnZpY2UgbWV0aG9kLWhlYWRlci1wYXJ0OiBsb29rdXAgaF9faGFuZGxlCitpbnQgbnNfX2xvb2t1cChlbnVtIHRfX29iamVjdCBvYmplY3QsIGNoYXIgKm5hbWUsIGVudW0gdF9fc3RhdHVzICZzdGF0dXMpOworCisvL2dzb2FwIG5zIHNlcnZpY2UgbWV0aG9kLWhlYWRlci1wYXJ0OiByZW5hbWUgaF9faGFuZGxlCitpbnQgbnNfX3JlbmFtZShjaGFyICpuYW1lLCBlbnVtIHRfX3N0YXR1cyAmc3RhdHVzKTsKKworLy9nc29hcCBucyBzZXJ2aWNlIG1ldGhvZC1oZWFkZXItcGFydDogcmVsZWFzZSBoX19oYW5kbGUKK2ludCBuc19fcmVsZWFzZShlbnVtIHRfX3N0YXR1cyAmc3RhdHVzKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgUmV3b3RlIGFkZGVyIG1ldGhvZCBpbnRlcmZhY2VzCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy9nc29hcCBucyBzZXJ2aWNlIG1ldGhvZC1oZWFkZXItcGFydDogc2V0IGhfX2hhbmRsZQoraW50IG5zX19zZXQoZG91YmxlIHZhbCwgZW51bSB0X19zdGF0dXMgJnN0YXR1cyk7CisKKy8vZ3NvYXAgbnMgc2VydmljZSBtZXRob2QtaGVhZGVyLXBhcnQ6IGdldCBoX19oYW5kbGUKK2ludCBuc19fZ2V0KGRvdWJsZSAmdmFsKTsKKworLy9nc29hcCBucyBzZXJ2aWNlIG1ldGhvZC1oZWFkZXItcGFydDogYWRkIGhfX2hhbmRsZQoraW50IG5zX19hZGQoZG91YmxlIHZhbCwgZW51bSB0X19zdGF0dXMgJnN0YXR1cyk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIFJlbW90ZSBjb3VudGVyIG1ldGhvZCBpbnRlcmZhY2VzCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy9nc29hcCBucyBzZXJ2aWNlIG1ldGhvZC1oZWFkZXItcGFydDogaW5jIGhfX2hhbmRsZQoraW50IG5zX19pbmMoZW51bSB0X19zdGF0dXMgJnN0YXR1cyk7CisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZmFjdG9yeXRlc3QvTWFrZWZpbGUgYi9zYW1wbGVzL2ZhY3Rvcnl0ZXN0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNDQ2MmUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2ZhY3Rvcnl0ZXN0L01ha2VmaWxlCkBAIC0wLDAgKzEsMjAgQEAKK0dTT0FQPS4uLy4uL3NvYXBjcHAyCitTT0FQSD0uLi8uLi9zdGRzb2FwMi5oCitTT0FQQz0uLi8uLi9zdGRzb2FwMi5jCitTT0FQQ1BQPS4uLy4uL3N0ZHNvYXAyLmNwcAorQ0M9Z2NjCitDUFA9ZysrCitMSUJTPQorQ09GTEFHUz0tTzIKK0NXRkxBR1M9LVdhbGwKK0NJRkxBR1M9LUkuLi8uLgorQ01GTEFHUz0KK0NGTEFHUz0gJChDV0ZMQUdTKSAkKENPRkxBR1MpICQoQ0lGTEFHUykgJChDTUZMQUdTKQorYWxsOgkJZmFjdG9yeXRlc3QKK2ZhY3Rvcnl0ZXN0OglmYWN0b3J5dGVzdC5oIGZhY3Rvcnl0ZXN0LmNwcCAkKFNPQVBIKSAkKFNPQVBDUFApCisJCSQoR1NPQVApIGZhY3Rvcnl0ZXN0LmgKKwkJJChDUFApICQoQ0ZMQUdTKSAtbyBmYWN0b3J5dGVzdCBmYWN0b3J5dGVzdC5jcHAgc29hcEMuY3BwIHNvYXBDbGllbnQuY3BwICQoU09BUENQUCkgJChMSUJTKQorY2xlYW46CisJCXJtIC1mICoubyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5LmgKK2Rpc3RjbGVhbjoKKwkJcm0gLWYgKi5vICoud3NkbCAqLnhzZCAqLnhtbCAqLm5zbWFwICoubG9nIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaCBmYWN0b3J5dGVzdApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9mYWN0b3J5dGVzdC9NYWtlZmlsZVNvbGFyaXMgYi9zYW1wbGVzL2ZhY3Rvcnl0ZXN0L01ha2VmaWxlU29sYXJpcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2RjMmYwCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9mYWN0b3J5dGVzdC9NYWtlZmlsZVNvbGFyaXMKQEAgLTAsMCArMSwyMCBAQAorR1NPQVA9Li4vLi4vc29hcGNwcDIKK1NPQVBIPS4uLy4uL3N0ZHNvYXAyLmgKK1NPQVBDPS4uLy4uL3N0ZHNvYXAyLmMKK1NPQVBDUFA9Li4vLi4vc3Rkc29hcDIuY3BwCitDQz1nY2MKK0NQUD1nKysKK0xJQlM9LWx4bmV0IC1sbnNsIC1sc29ja2V0CitDT0ZMQUdTPS1PMgorQ1dGTEFHUz0tV2FsbAorQ0lGTEFHUz0tSS4uLy4uCitDTUZMQUdTPQorQ0ZMQUdTPSAkKENXRkxBR1MpICQoQ09GTEFHUykgJChDSUZMQUdTKSAkKENNRkxBR1MpCithbGw6CQlmYWN0b3J5dGVzdAorZmFjdG9yeXRlc3Q6CWZhY3Rvcnl0ZXN0LmggZmFjdG9yeXRlc3QuY3BwICQoU09BUEgpICQoU09BUENQUCkKKwkJJChHU09BUCkgZmFjdG9yeXRlc3QuaAorCQkkKENQUCkgJChDRkxBR1MpIC1vIGZhY3Rvcnl0ZXN0IGZhY3Rvcnl0ZXN0LmNwcCBzb2FwQy5jcHAgc29hcENsaWVudC5jcHAgJChTT0FQQ1BQKSAkKExJQlMpCitjbGVhbjoKKwkJcm0gLWYgKi5vIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaAorZGlzdGNsZWFuOgorCQlybSAtZiAqLm8gKi53c2RsICoueHNkICoueG1sICoubnNtYXAgKi5sb2cgc29hcEguaCBzb2FwU3R1Yi5oIHNvYXBDLmNwcCBzb2FwQy5jIHNvYXBDbGllbnQuY3BwIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmNwcCBzb2FwU2VydmVyLmMgc29hcCpQcm94eS5oIGZhY3Rvcnl0ZXN0CmRpZmYgLS1naXQgYS9zYW1wbGVzL2ZhY3Rvcnl0ZXN0L2ZhY3Rvcnl0ZXN0LmNwcCBiL3NhbXBsZXMvZmFjdG9yeXRlc3QvZmFjdG9yeXRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNjQ4OWYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2ZhY3Rvcnl0ZXN0L2ZhY3Rvcnl0ZXN0LmNwcApAQCAtMCwwICsxLDE3MCBAQAorLyoJZmFjdG9yeXRlc3QuY3BwCisKKwlUZXN0IGNsaWVudCBmb3IgcmVtb3RlIG9iamVjdCBmYWN0b3J5CisKKwlUaGlzIGlzIGEgc2ltcGxlIGV4YW1wbGUgY2xpZW50IHByb2dyYW0gdGhhdCBkZWZpbmVzIGl0cyBvd24gcHJveHkKKwlvYmplY3RzLiBUaGUgcHJveHkgb2JqZWN0cyB1dGlsaXplIHRoZSBnU09BUCByZW1vdGUgaW50ZXJmYWNlcyB0bworCWFjY2VzcyB0aGUgcmVtb3RlIGZhY3RvcnkuIFRoZSByZW1vdGUgb2JqZWN0IGludGVyZmFjZXMgYXJlIGRlY2xhcmVkCisJaW4gZmFjdG9yeXRlc3QuaC4gU2luY2UgdGhlIHJlbW90ZSBpbnRlcmZhY2VzIGFyZSBDLXN0eWxlLCBDLWJhc2VkCisJY2xpZW50IHByb2dyYW1zIGNhbSBiZSBkZXZlbG9wZWQgdG8gYWNjZXNzIHJlbW90ZSBvYmplY3QgZmFjdG9yaWVzLgorCisJQ29tcGlsZToKKwlzb2FwY3BwMiBmYWN0b3J5dGVzdC5oCisJYysrIC1vIGZhY3Rvcnl0ZXN0IGZhY3Rvcnl0ZXN0LmNwcCBzdGRzb2FwMi5jcHAgc29hcEMuY3BwIHNvYXBDbGllbnQuY3BwCisKKwlSdW46CisJZmFjdG9yeXRlc3QgPGZhY3RvcnktZW5kcG9pbnQ+CisJd2hlcmUgPGZhY3RvcnktZW5kcG9pbnQ+IGlzIHRoZSBzZXJ2aWNlIGVuZHBvaW50IG9mIGEgZmFjdG9yeSBzZXJ2ZXIsCisJZS5nLiBodHRwOi8vbG9jYWxob3N0OjE4MDg1CisKKwlDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMiBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqLworCisjaW5jbHVkZSAic29hcEguaCIKKyNpbmNsdWRlICJmYWN0b3J5dGVzdC5uc21hcCIKKworI2luY2x1ZGUgPGlvc3RyZWFtLmg+CisKKy8vIGRlZmF1bHQgZmFjdG9yeSBzZXJ2aWNlIGVuZHBvaW50OgorY29uc3QgY2hhciAqZmFjdG9yeSA9ICJodHRwOi8vbG9jYWxob3N0OjE4MDg1IjsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgQ2xpZW50LXNpZGUgcm9vdCBwcm94eSBjbGFzcworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NsYXNzIFJvb3QKK3sgcHVibGljOgorICBjaGFyICplbmRwb2ludDsJCQkvLyBmYWN0b3J5IHNlcnZpY2UgZW5kcG9pbnQKKyAgZW51bSB0X19zdGF0dXMgc3RhdHVzOwkJLy8gc3RhdHVzIGZsYWcKKyAgc3RydWN0IHNvYXAgKnNvYXA7CQkJLy8gZ1NPQVAgZW52aXJvbm1lbnQgKGZvciBoZWFkZXIgaF9faGFuZGxlKQorICBSb290KCk7CisgIFJvb3QoY29uc3QgY2hhciAqZmFjdG9yeSwgZW51bSB0X19vYmplY3Qgb2JqZWN0LCBjaGFyICpuYW1lKTsKKyAgdmlydHVhbCB+Um9vdCgpOworICB2b2lkIHJlbmFtZShjaGFyICpuYW1lKTsKK307CisKK1Jvb3Q6OlJvb3QoKQoreyBlbmRwb2ludCA9IE5VTEw7CisgIHN0YXR1cyA9IEZBQ1RPUllfT0s7CisgIHNvYXAgPSBOVUxMOworfQorCitSb290OjpSb290KGNvbnN0IGNoYXIgKmZhY3RvcnksIGVudW0gdF9fb2JqZWN0IG9iamVjdCwgY2hhciAqbmFtZSkKK3sgc29hcCA9IHNvYXBfbmV3KCk7CisgIGVuZHBvaW50ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihmYWN0b3J5KSsxKTsKKyAgc3RyY3B5KGVuZHBvaW50LCBmYWN0b3J5KTsKKyAgc3RhdHVzID0gRkFDVE9SWV9OT1RGT1VORDsKKyAgaWYgKG5hbWUpCisgICAgaWYgKHNvYXBfY2FsbF9uc19fbG9va3VwKHNvYXAsIGVuZHBvaW50LCAiIiwgb2JqZWN0LCBuYW1lLCBzdGF0dXMpKQorICAgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOwkvLyBmb3IgZGVtbywganVzdCBwcmludAorICBpZiAoc3RhdHVzID09IEZBQ1RPUllfTk9URk9VTkQpCisgICAgZG8KKyAgICB7IGlmIChzb2FwX2NhbGxfbnNfX2NyZWF0ZShzb2FwLCBlbmRwb2ludCwgIiIsIG9iamVjdCwgbmFtZSwgc3RhdHVzKSkKKyAgICAgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOwkvLyBmb3IgZGVtbywganVzdCBwcmludAorICAgIH0gd2hpbGUgKHN0YXR1cyA9PSBGQUNUT1JZX1JFVFJZKTsKK30KKworUm9vdDo6flJvb3QoKQoreyBpZiAoc29hcF9jYWxsX25zX19yZWxlYXNlKHNvYXAsIGVuZHBvaW50LCAiIiwgc3RhdHVzKSkKKyAgICBzb2FwX3ByaW50X2ZhdWx0KHNvYXAsIHN0ZGVycik7CS8vIGZvciBkZW1vLCBqdXN0IHByaW50CisgIHNvYXBfZGVzdHJveShzb2FwKTsKKyAgc29hcF9lbmQoc29hcCk7CisgIHNvYXBfZG9uZShzb2FwKTsKKyAgZnJlZShzb2FwKTsKK30KKwordm9pZCBSb290OjpyZW5hbWUoY2hhciAqbmFtZSkKK3sgaWYgKHNvYXBfY2FsbF9uc19fcmVuYW1lKHNvYXAsIGVuZHBvaW50LCAiIiwgbmFtZSwgc3RhdHVzKSkKKyAgICBzb2FwX3ByaW50X2ZhdWx0KHNvYXAsIHN0ZGVycik7CS8vIGZvciBkZW1vLCBqdXN0IHByaW50Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIENsaWVudC1zaWRlIGFkZGVyIHByb3h5IGNsYXNzIGRlcml2ZWQgZnJvbSByb290CisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgQWRkZXI6IHB1YmxpYyBSb290Cit7IHB1YmxpYzoKKyAgQWRkZXIoKSA6IFJvb3QoZmFjdG9yeSwgQURERVIsIE5VTEwpIHt9OworICBBZGRlcihjaGFyICpuYW1lKSA6IFJvb3QoZmFjdG9yeSwgQURERVIsIG5hbWUpIHt9OworICBBZGRlcihjb25zdCBjaGFyICpmYWN0b3J5LCBlbnVtIHRfX29iamVjdCBvYmplY3QsIGNoYXIgKm5hbWUpIDogUm9vdChmYWN0b3J5LCBvYmplY3QsIG5hbWUpIHt9OworICB2b2lkIHNldChkb3VibGUgdmFsKTsJCQkvLyB0byBzZXQgdGhlIHJlbW90ZSBhZGRlcgorICBkb3VibGUgZ2V0KCk7CQkJCS8vIHRvIGdldCB2YWx1ZSBvZiB0aGUgcmVtb3RlIGFkZGVyCisgIHZvaWQgYWRkKGRvdWJsZSB2YWwpOwkJCS8vIHRvIGFkZCBhIHZhbHVlIHRvIHRoZSByZW1vdGUgYWRkZXIKK307CisKK3ZvaWQgQWRkZXI6OnNldChkb3VibGUgdmFsKQoreyBpZiAoc29hcF9jYWxsX25zX19zZXQoc29hcCwgZW5kcG9pbnQsICIiLCB2YWwsIHN0YXR1cykpCisgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOwkvLyBmb3IgZGVtbywganVzdCBwcmludAorfQorCitkb3VibGUgQWRkZXI6OmdldCgpCit7IGRvdWJsZSB2YWw7CisgIGlmIChzb2FwX2NhbGxfbnNfX2dldChzb2FwLCBlbmRwb2ludCwgIiIsIHZhbCkpCisgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOwkvLyBmb3IgZGVtbywganVzdCBwcmludAorICByZXR1cm4gdmFsOworfQorCit2b2lkIEFkZGVyOjphZGQoZG91YmxlIHZhbCkKK3sgaWYgKHNvYXBfY2FsbF9uc19fYWRkKHNvYXAsIGVuZHBvaW50LCAiIiwgdmFsLCBzdGF0dXMpKQorICAgIHNvYXBfcHJpbnRfZmF1bHQoc29hcCwgc3RkZXJyKTsJLy8gZm9yIGRlbW8sIGp1c3QgcHJpbnQKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgQ2xpZW50LXNpZGUgY291bnRlciBwcm94eSBjbGFzcyBkZXJpdmVkIGZyb20gYWRkZXIKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBDb3VudGVyOiBwdWJsaWMgQWRkZXIKK3sgcHVibGljOgorICBDb3VudGVyKCkgOiBBZGRlcihmYWN0b3J5LCBDT1VOVEVSLCBOVUxMKSB7fTsKKyAgQ291bnRlcihjaGFyICpuYW1lKSA6IEFkZGVyKGZhY3RvcnksIENPVU5URVIsIG5hbWUpIHt9OworICBDb3VudGVyKGNvbnN0IGNoYXIgKmZhY3RvcnksIGVudW0gdF9fb2JqZWN0IG9iamVjdCwgY2hhciAqbmFtZSkgOiBBZGRlcihmYWN0b3J5LCBvYmplY3QsIG5hbWUpIHt9OworICB2b2lkIGluYygpOwkJCQkvLyB0byBpbmNyZW1lbnQgdGhlIHJlbW90ZSBjb3VudGVyCit9OworCit2b2lkIENvdW50ZXI6OmluYygpCit7IGlmIChzb2FwX2NhbGxfbnNfX2luYyhzb2FwLCBlbmRwb2ludCwgIiIsIHN0YXR1cykpCisgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOwkvLyBmb3IgZGVtbywganVzdCBwcmludAorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBNYWluIGNsaWVudCB0ZXN0IHByb2dyYW0KKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7IGlmIChhcmdjID4gMSkKKyAgICBmYWN0b3J5ID0gYXJndlsxXTsJCQkvLyB1c2UgZmFjdG9yeSBmcm9tIGNvbW1hbmQgbGluZSBhcmcgYnkgZGVmYXVsdAorICBjb3V0IDw8ICJDb25uZWN0aW5nIHRvIGZhY3RvcnkgIiA8PCBmYWN0b3J5IDw8IGVuZGw7CisgIEFkZGVyIGFkZGVyOwkJCQkvLyBjcmVhdGUgdW5pcXVlIG5ldyByZW1vdGUgYWRkZXIgb2JqZWN0CisgIENvdW50ZXIgY291bnRlcjEoIm15Q291bnRlciIpOwkvLyBuZXcgY291bnRlciBvYmplY3QgIm15Q291bnRlciIgKGNyZWF0ZWQgaWYgbm90IGV4aXN0cykKKyAgQ291bnRlciBjb3VudGVyMigibXlDb3VudGVyIik7CS8vIGxvb2t1cCBhbmQgdXNlIGNvdW50ZXIgIm15Q291bnRlciIgKHRoaXMgaXMgYW4gYWxpYXMgdG8gY291bnRlcjEhKQorICBhZGRlci5zZXQoMi4wKTsKKyAgY291bnRlcjEuc2V0KGFkZGVyLmdldCgpKTsKKyAgYWRkZXIuYWRkKDMuMCk7CisgIGNvdW50ZXIxLmluYygpOworICBjb3V0IDw8ICJBZGRlcj0iIDw8IGFkZGVyLmdldCgpIDw8IGVuZGw7CisgIGNvdXQgPDwgIkNvdW50ZXI9IiA8PCBjb3VudGVyMi5nZXQoKSA8PCBlbmRsOwkJLy8gY291bnRlcjIgaXMgYW4gYWxpYXMgZm9yIGNvdW50ZXIxIHNvIHRoaXMgcHJpbnRzIHRoZSB2YWx1ZSBvZiBjb3VudGVyMQorICBjb3V0IDw8ICJTbGVlcCBmb3IgOTAgc2Vjb25kcyB0byB0ZXN0IGZhY3Rvcnkgc2VydmVyIHB1cmdpbmcgb2JqZWN0czoiIDw8IGVuZGw7CisgIC8vIGNvdW50ZXIgaXMgcGVyaW9kaWNhbGx5IGluY3JlbWVudGVkIHdoaWNoIGtlZXBzIGl0IGFsaXZlCisgIHNsZWVwKDMwKTsKKyAgY291bnRlcjEuaW5jKCk7CisgIGNvdXQgPDwgIkNvdW50ZXI9IiA8PCBjb3VudGVyMi5nZXQoKSA8PCBlbmRsOworICBzbGVlcCgzMCk7CisgIGNvdW50ZXIxLmluYygpOworICBjb3V0IDw8ICJDb3VudGVyPSIgPDwgY291bnRlcjIuZ2V0KCkgPDwgZW5kbDsKKyAgc2xlZXAoMzApOworICBjb3VudGVyMS5pbmMoKTsKKyAgY291dCA8PCAiQ291bnRlcj0iIDw8IGNvdW50ZXIyLmdldCgpIDw8IGVuZGw7CisgIC8vIGFmdGVyIDkwIHNlY3MsIHRoZSBhZGRlciBzaG91bGQgYmUgZ29uZQorICBjb3V0IDw8ICJBZGRlciBpcyBubyBsb25nZXIgYXZhaWxhYmxlOiIgPDwgZW5kbDsKKyAgYWRkZXIuYWRkKDMuMCk7CisgIGNvdXQgPDwgIkFkZGVyIHN0YXR1cyA9ICIgPDwgYWRkZXIuc3RhdHVzIDw8IGVuZGw7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9mYWN0b3J5dGVzdC9mYWN0b3J5dGVzdC5oIGIvc2FtcGxlcy9mYWN0b3J5dGVzdC9mYWN0b3J5dGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MWM5ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2ZhY3Rvcnl0ZXN0L2ZhY3Rvcnl0ZXN0LmgKQEAgLTAsMCArMSw4MSBAQAorLyoJZmFjdG9yeXRlc3QuaAorCisJQ2xpZW50LXNpZGUgcmVtb3RlIG9iamVjdCBmYWN0b3J5IGRlZmluaXRpb25zCisKKwlDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMiBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqLworCisvL2dzb2FwIG5zIHNlcnZpY2UgbmFtZToJZmFjdG9yeXRlc3QKKy8vZ3NvYXAgbnMgc2VydmljZSBzdHlsZToJcnBjCisvL2dzb2FwIG5zIHNlcnZpY2UgZW5jb2Rpbmc6CWVuY29kZWQKKy8vZ3NvYXAgbnMgc2VydmljZSBuYW1lc3BhY2U6CWh0dHA6Ly93ZWJzcnYuY3MuZnN1LmVkdS9+ZW5nZWxlbi9mYWN0b3J5LndzZGwKKy8vZ3NvYXAgbnMgc2VydmljZSBsb2NhdGlvbjoJaHR0cDovL2xvY2FsaG9zdDoxODA4NQorCisvL2dzb2FwIG5zIHNjaGVtYSBuYW1lc3BhY2U6IHVybjpmYWN0b3J5U2VydmljZQorCisvL2dzb2FwIHQgc2NoZW1hIG5hbWVzcGFjZTogdXJuOmZhY3RvcnlUeXBlcworLy9nc29hcCBoIHNjaGVtYSBuYW1lc3BhY2U6IHVybjpmYWN0b3J5SGFuZGxlcworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBTT0FQIEhlYWRlcjogdXNlZCB0byBleGNoYW5nZSBzdGF0ZWZ1bCBvYmplY3QgaGFuZGxlcworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0cnVjdCBTT0FQX0VOVl9fSGVhZGVyCit7IG11c3RVbmRlcnN0YW5kIHVuc2lnbmVkIGludCBoX19oYW5kbGU7Cit9OworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBSZW1vdGUgZmFjdG9yeSBvYmplY3RzCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworZW51bSB0X19vYmplY3QJCQkJLy8gb2JqZWN0IHR5cGVzOgoreyBST09ULAkJCQkJLy8gdF9fcm9vdCBvYmplY3QKKyAgQURERVIsCQkJCS8vIHRfX2FkZGVyIG9iamVjdAorICBDT1VOVEVSCQkJCS8vIHRfX2NvdW50ZXIgb2JqZWN0Cit9OworCitlbnVtIHRfX3N0YXR1cwkJCQkvLyByZW1vdGUgb2JqZWN0IHN0YXR1czoKK3sgRkFDVE9SWV9PSywJCQkJCS8vIG9rCisgIEZBQ1RPUllfSU5WQUxJRCwJCQkJLy8gaW52YWxpZCBoYW5kbGUgKHdyb25nIHR5cGUgb2Ygb2JqZWN0IG9yIGxlYXNlIGV4cGlyZWQpCisgIEZBQ1RPUllfTk9URk9VTkQsCQkJCS8vIGxvb2t1cCBvcGVyYXRpb24gbm90IHN1Y2Nlc3NmdWwKKyAgRkFDVE9SWV9SRVRSWQkJCQkJLy8gY2Fubm90IGNyZWF0ZSBuZXcgb2JqZWN0OiB0cnkgbGF0ZXIKK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIFJlbW90ZSBmYWN0b3J5IG1ldGhvZCBpbnRlcmZhY2VzCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworaW50IG5zX19jcmVhdGUoZW51bSB0X19vYmplY3Qgb2JqZWN0LCBjaGFyICpuYW1lLCBlbnVtIHRfX3N0YXR1cyAmc3RhdHVzKTsKKworaW50IG5zX19sb29rdXAoZW51bSB0X19vYmplY3Qgb2JqZWN0LCBjaGFyICpuYW1lLCBlbnVtIHRfX3N0YXR1cyAmc3RhdHVzKTsKKworaW50IG5zX19yZW5hbWUoY2hhciAqbmFtZSwgZW51bSB0X19zdGF0dXMgJnN0YXR1cyk7CisKK2ludCBuc19fcmVsZWFzZShlbnVtIHRfX3N0YXR1cyAmc3RhdHVzKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgUmV3b3RlIGFkZGVyIG1ldGhvZCBpbnRlcmZhY2VzCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworaW50IG5zX19zZXQoZG91YmxlIHZhbCwgZW51bSB0X19zdGF0dXMgJnN0YXR1cyk7CisKK2ludCBuc19fZ2V0KGRvdWJsZSAmdmFsKTsKKworaW50IG5zX19hZGQoZG91YmxlIHZhbCwgZW51bSB0X19zdGF0dXMgJnN0YXR1cyk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIFJlbW90ZSBjb3VudGVyIG1ldGhvZCBpbnRlcmZhY2VzCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworaW50IG5zX19pbmMoZW51bSB0X19zdGF0dXMgJnN0YXR1cyk7CisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZ29vZ2xlYXBpL01ha2VmaWxlIGIvc2FtcGxlcy9nb29nbGVhcGkvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBiNTNmZgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZ29vZ2xlYXBpL01ha2VmaWxlCkBAIC0wLDAgKzEsMjAgQEAKK0dTT0FQPS4uLy4uL3NvYXBjcHAyCitTT0FQSD0uLi8uLi9zdGRzb2FwMi5oCitTT0FQQz0uLi8uLi9zdGRzb2FwMi5jCitTT0FQQ1BQPS4uLy4uL3N0ZHNvYXAyLmNwcAorQ0M9Z2NjCitDUFA9ZysrCitMSUJTPQorQ09GTEFHUz0tTzIKK0NXRkxBR1M9LVdhbGwKK0NJRkxBR1M9LUkuLi8uLgorQ01GTEFHUz0KK0NGTEFHUz0gJChDV0ZMQUdTKSAkKENPRkxBR1MpICQoQ0lGTEFHUykgJChDTUZMQUdTKQorYWxsOgkJZ29vZ2xlYXBpCitnb29nbGVhcGk6CWdvb2dsZWFwaS5oIGdvb2dsZWFwaS5jICQoU09BUEgpICQoU09BUEMpCisJCSQoR1NPQVApIC1jIGdvb2dsZWFwaS5oCisJCSQoQ0MpICQoQ0ZMQUdTKSAtbyBnb29nbGVhcGkgZ29vZ2xlYXBpLmMgc29hcEMuYyBzb2FwQ2xpZW50LmMgJChTT0FQQykgJChMSUJTKQorY2xlYW46CisJCXJtIC1mICoubyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5LmgKK2Rpc3RjbGVhbjoKKwkJcm0gLWYgKi5vICoud3NkbCAqLnhzZCAqLnhtbCAqLm5zbWFwICoubG9nIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaCBnb29nbGVhcGkKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZ29vZ2xlYXBpL01ha2VmaWxlU29sYXJpcyBiL3NhbXBsZXMvZ29vZ2xlYXBpL01ha2VmaWxlU29sYXJpcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDdhMTM5Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9nb29nbGVhcGkvTWFrZWZpbGVTb2xhcmlzCkBAIC0wLDAgKzEsMjAgQEAKK0dTT0FQPS4uLy4uL3NvYXBjcHAyCitTT0FQSD0uLi8uLi9zdGRzb2FwMi5oCitTT0FQQz0uLi8uLi9zdGRzb2FwMi5jCitTT0FQQ1BQPS4uLy4uL3N0ZHNvYXAyLmNwcAorQ0M9Z2NjCitDUFA9ZysrCitMSUJTPS1seG5ldCAtbG5zbCAtbHNvY2tldAorQ09GTEFHUz0tTzIKK0NXRkxBR1M9LVdhbGwKK0NJRkxBR1M9LUkuLi8uLgorQ01GTEFHUz0KK0NGTEFHUz0gJChDV0ZMQUdTKSAkKENPRkxBR1MpICQoQ0lGTEFHUykgJChDTUZMQUdTKQorYWxsOgkJZ29vZ2xlYXBpCitnb29nbGVhcGk6CWdvb2dsZWFwaS5oIGdvb2dsZWFwaS5jICQoU09BUEgpICQoU09BUEMpCisJCSQoR1NPQVApIC1jIGdvb2dsZWFwaS5oCisJCSQoQ0MpICQoQ0ZMQUdTKSAtbyBnb29nbGVhcGkgZ29vZ2xlYXBpLmMgc29hcEMuYyBzb2FwQ2xpZW50LmMgJChTT0FQQykgJChMSUJTKQorY2xlYW46CisJCXJtIC1mICoubyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5LmgKK2Rpc3RjbGVhbjoKKwkJcm0gLWYgKi5vICoud3NkbCAqLnhzZCAqLnhtbCAqLm5zbWFwICoubG9nIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaCBnb29nbGVhcGkKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZ29vZ2xlYXBpL2dvb2dsZWFwaS5jIGIvc2FtcGxlcy9nb29nbGVhcGkvZ29vZ2xlYXBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVhODI5ZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZ29vZ2xlYXBpL2dvb2dsZWFwaS5jCkBAIC0wLDAgKzEsOTggQEAKKy8qCUdvb2dsZSBXZWIgQVBJCisJQ29tcGlsZSBhbmQgcnVuIGZyb20gdGhlIGNvbW1hbmQgbGluZToKKwlnb29nbGVhcGkgPGtleT4gc2VhcmNofGNhY2hlZHxzcGVsbCA8YXJnPgorCXdoZXJlIDxrZXk+IGlzIHRoZSBHb29nbGUgQVBJIGxpY2Vuc2Uga2V5IChzZWUgaHR0cDovL3d3dy5nb29nbGUuY29tL2FwaXMpCisJRXhhbXBsZToKKwlnb29nbGVhcGkgWFhYWFhYWFggc2VhcmNoIGdTT0FQCisKK1NvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCitlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorCitDb3B5cmlnaHQgKEMpIDIwMDIsIFJvYmVydCBBLiB2YW4gRW5nZWxlbiwgRmxvcmlkYSBTdGF0ZSBVbml2ZXJzaXR5LgorCisqLworCisjaW5jbHVkZSAic29hcEguaCIKKyNpbmNsdWRlICJnb29nbGVhcGkubnNtYXAiCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sgY2hhciAqa2V5LCAqZGlyLCAqYXJnOworICBzdHJ1Y3Qgc29hcCBzb2FwOworICBzb2FwX2luaXQyKCZzb2FwLCBTT0FQX0lPX0RFRkFVTFQsIFNPQVBfWE1MX1RSRUUpOworICBpZiAoYXJnYyA8PSAzKQorICB7IGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGdvb2dsZWFwaSA8a2V5PiBzZWFyY2h8Y2FjaGVkfHNwZWxsIDxhcmc+XG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBrZXkgPSBhcmd2WzFdOworICBkaXIgPSBhcmd2WzJdOworICBhcmcgPSBhcmd2WzNdOworICBpZiAoIXN0cmNtcChkaXIsICJzZWFyY2giKSkKKyAgeyBzdHJ1Y3QgYXBpX19kb0dvb2dsZVNlYXJjaFJlc3BvbnNlIHI7CisgICAgaWYgKHNvYXBfY2FsbF9hcGlfX2RvR29vZ2xlU2VhcmNoKCZzb2FwLCAiaHR0cDovL2FwaS5nb29nbGUuY29tL3NlYXJjaC9iZXRhMiIsICJ1cm46R29vZ2xlU2VhcmNoQWN0aW9uIiwga2V5LCBhcmcsIDAsIDEwLCB0cnVlXywgIiIsIGZhbHNlXywgIiIsICJsYXRpbjEiLCAibGF0aW4xIiwgJnIpKQorICAgIHsgc29hcF9wcmludF9mYXVsdCgmc29hcCwgc3RkZXJyKTsKKyAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IGludCBpOworICAgICAgcHJpbnRmKCJkb2N1bWVudEZpbHRlcmluZyAgICAgICAgICA9ICVkXG4iLCAoaW50KXIuX3JldHVybi5kb2N1bWVudEZpbHRlcmluZyk7CisgICAgICBwcmludGYoInNlYXJjaFF1ZXJ5ICAgICAgICAgICAgICAgID0gJXNcbiIsIHIuX3JldHVybi5zZWFyY2hRdWVyeT9yLl9yZXR1cm4uc2VhcmNoUXVlcnk6IjxOT05FPiIpOworICAgICAgcHJpbnRmKCJzZWFyY2hDb21tZW50cyAgICAgICAgICAgICA9ICVzXG4iLCByLl9yZXR1cm4uc2VhcmNoQ29tbWVudHM/ci5fcmV0dXJuLnNlYXJjaENvbW1lbnRzOiI8Tk9ORT4iKTsKKyAgICAgIHByaW50Zigic2VhcmNoVGlwcyAgICAgICAgICAgICAgICAgPSAlc1xuIiwgci5fcmV0dXJuLnNlYXJjaFRpcHMpOworICAgICAgcHJpbnRmKCJzZWFyY2hUaW1lICAgICAgICAgICAgICAgICA9ICVmXG4iLCByLl9yZXR1cm4uc2VhcmNoVGltZSk7CisgICAgICBwcmludGYoImVzdGltYXRlZFRvdGFsUmVzdWx0c0NvdW50ID0gJWRcbiIsIHIuX3JldHVybi5lc3RpbWF0ZWRUb3RhbFJlc3VsdHNDb3VudCk7CisgICAgICBwcmludGYoImVzdGltYXRlSXNFeGFjdCAgICAgICAgICAgID0gJWRcbiIsIChpbnQpci5fcmV0dXJuLmVzdGltYXRlSXNFeGFjdCk7CisgICAgICBwcmludGYoInN0YXJ0SW5kZXggICAgICAgICAgICAgICAgID0gJWRcbiIsIHIuX3JldHVybi5zdGFydEluZGV4KTsKKyAgICAgIHByaW50ZigiZW5kSW5kZXggICAgICAgICAgICAgICAgICAgPSAlZFxuIiwgci5fcmV0dXJuLmVuZEluZGV4KTsKKyAgICAgIHByaW50ZigicmVzdWx0RWxlbWVudHMgICAgICAgICAgICAgPSBcbiIpOworICAgICAgZm9yIChpID0gMDsgaSA8IHIuX3JldHVybi5yZXN1bHRFbGVtZW50cy5fX3NpemU7IGkrKykKKyAgICAgIHsgY29uc3QgY2hhciAqczEgPSByLl9yZXR1cm4ucmVzdWx0RWxlbWVudHMuX19wdHJbaV0uc3VtbWFyeTsKKyAgICAgICAgY29uc3QgY2hhciAqczIgPSByLl9yZXR1cm4ucmVzdWx0RWxlbWVudHMuX19wdHJbaV0uVVJMOworICAgICAgICBjb25zdCBjaGFyICpzMyA9IHIuX3JldHVybi5yZXN1bHRFbGVtZW50cy5fX3B0cltpXS5zbmlwcGV0OworICAgICAgICBjb25zdCBjaGFyICpzNCA9IHIuX3JldHVybi5yZXN1bHRFbGVtZW50cy5fX3B0cltpXS50aXRsZTsKKyAgICAgICAgY29uc3QgY2hhciAqczUgPSByLl9yZXR1cm4ucmVzdWx0RWxlbWVudHMuX19wdHJbaV0uY2FjaGVkU2l6ZTsKKyAgICAgICAgY29uc3QgY2hhciAqczYgPSByLl9yZXR1cm4ucmVzdWx0RWxlbWVudHMuX19wdHJbaV0uZGlyZWN0b3J5VGl0bGU7CisJLyogc2tpcHBlZCBwcmludGluZyBvZiBkaXJlY3RvcnlDYXRlZ29yeSBmaWVsZCAqLworICAgICAgICBwcmludGYoIlslM2RdXHRTdW1tYXJ5ICAgICAgICA9ICVzXG4iLCBpKzEsIHMxP3MxOiI8Tk9ORT4iKTsKKyAgICAgICAgcHJpbnRmKCJcdHRpdGxlICAgICAgICAgID0gJXNcbiIsIHM0P3M0OiI8Tk9ORT4iKTsKKyAgICAgICAgcHJpbnRmKCJcdFVSTCAgICAgICAgICAgID0gJXNcbiIsIHMyP3MyOiI8Tk9ORT4iKTsKKyAgICAgICAgcHJpbnRmKCJcdHNuaXBwZXQgICAgICAgID0gJXNcbiIsIHMzP3MzOiI8Tk9ORT4iKTsKKyAgICAgICAgcHJpbnRmKCJcdGNhY2hlZFNpemUgICAgID0gJXNcbiIsIHM1P3M1OiI8Tk9ORT4iKTsKKyAgICAgICAgcHJpbnRmKCJcdHJlbGF0ZWRJbmZvICAgID0gJWRcbiIsIChpbnQpci5fcmV0dXJuLnJlc3VsdEVsZW1lbnRzLl9fcHRyW2ldLnJlbGF0ZWRJbmZvcm1hdGlvblByZXNlbnQpOworICAgICAgICBwcmludGYoIlx0ZGlyZWN0b3J5VGl0bGUgPSAlc1xuIiwgczY/czY6IjxOT05FPiIpOworICAgICAgfQorICAgICAgcHJpbnRmKCJkaXJlY3RvcnlDYXRlZ29yaWVzICAgICAgPSBcbiIpOworICAgICAgZm9yIChpID0gMDsgaSA8IHIuX3JldHVybi5kaXJlY3RvcnlDYXRlZ29yaWVzLl9fc2l6ZTsgaSsrKQorICAgICAgeyBjb25zdCBjaGFyICpzMSA9IHIuX3JldHVybi5kaXJlY3RvcnlDYXRlZ29yaWVzLl9fcHRyW2ldLmZ1bGxWaWV3YWJsZU5hbWU7CisgICAgICAgIGNvbnN0IGNoYXIgKnMyID0gci5fcmV0dXJuLmRpcmVjdG9yeUNhdGVnb3JpZXMuX19wdHJbaV0uc3BlY2lhbEVuY29kaW5nOworICAgICAgICBwcmludGYoIlx0JXNcdCVzXG4iLCBzMT9zMToiPE5PTkU+IiwgczI/czI6IjxOT05FPiIpOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlIGlmICghc3RyY21wKGRpciwgImNhY2hlZCIpKQorICB7IHN0cnVjdCB4c2RfX2Jhc2U2NEJpbmFyeSByOworICAgIGlmIChzb2FwX2NhbGxfYXBpX19kb0dldENhY2hlZFBhZ2UoJnNvYXAsICJodHRwOi8vYXBpLmdvb2dsZS5jb20vc2VhcmNoL2JldGEyIiwgInVybjpHb29nbGVTZWFyY2hBY3Rpb24iLCBrZXksIGFyZywgJnIpKQorICAgIHsgc29hcF9wcmludF9mYXVsdCgmc29hcCwgc3RkZXJyKTsKKyAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IGludCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IHIuX19zaXplOyBpKyspCisgICAgICAgIHB1dGNoYXIoci5fX3B0cltpXSk7CisgICAgICBwdXRjaGFyKCdcbicpOworICAgIH0KKyAgfQorICBlbHNlIGlmICghc3RyY21wKGRpciwgInNwZWxsIikpCisgIHsgY2hhciAqcjsKKyAgICBpZiAoc29hcF9jYWxsX2FwaV9fZG9TcGVsbGluZ1N1Z2dlc3Rpb24oJnNvYXAsICJodHRwOi8vYXBpLmdvb2dsZS5jb20vc2VhcmNoL2JldGEyIiwgInVybjpHb29nbGVTZWFyY2hBY3Rpb24iLCBrZXksIGFyZywgJnIpKQorICAgIHsgc29hcF9wcmludF9mYXVsdCgmc29hcCwgc3RkZXJyKTsKKyAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHByaW50ZigiU3VnZ2VzdGVkIHNwZWxsaW5nOiAlc1xuIiwgcj9yOiI8Tk9ORT4iKTsKKyAgfQorICBlbHNlCisgICAgZnByaW50ZihzdGRlcnIsICJVbmtub3duIGRpcmVjdGl2ZVxuIik7CisgIHNvYXBfZW5kKCZzb2FwKTsgLyogcmVtb3ZlIGFsbCB0ZW1wb3JhcnkgYW5kIGRlc2VyaWFsaXplZCBkYXRhICovCisgIHNvYXBfZG9uZSgmc29hcCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9nb29nbGVhcGkvZ29vZ2xlYXBpLmggYi9zYW1wbGVzL2dvb2dsZWFwaS9nb29nbGVhcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTk2MTExCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9nb29nbGVhcGkvZ29vZ2xlYXBpLmgKQEAgLTAsMCArMSw5MyBAQAorLy8JR29vZ2xlIFdlYiBBUElzCisKKy8vZ3NvYXAgYXBpIHNlcnZpY2UgbmFtZToJZ29vZ2xlYXBpCisvL2dzb2FwIGFwaSBzZXJ2aWNlIHN0eWxlOglycGMKKy8vZ3NvYXAgYXBpIHNlcnZpY2UgZW5jb2Rpbmc6CWVuY29kZWQKKy8vZ3NvYXAgYXBpIHNlcnZpY2UgbG9jYXRpb246CWh0dHA6Ly9hcGkuZ29vZ2xlLmNvbS9zZWFyY2gvYmV0YTIKKy8vZ3NvYXAgYXBpIHNlcnZpY2UgbmFtZXNwYWNlOgl1cm46R29vZ2xlU2VhcmNoCisKK3R5cGVkZWYgY2hhciAqCXhzZF9fc3RyaW5nOworCisvLyBDKysgYWx0ZXJuYXRpdmUgZm9yIHhzZDpib29sZWFuOgorLy8gdHlwZWRlZiBib29sCXhzZF9fYm9vbGVhbjsKKy8vIHB1cmUgQyBhbHRlcm5hdGl2ZSBpczoKK3R5cGVkZWYgZW51bSB7ZmFsc2VfLCB0cnVlX30geHNkX19ib29sZWFuOworCit0eXBlZGVmIGludAl4c2RfX2ludDsKKwordHlwZWRlZiBkb3VibGUJeHNkX19kb3VibGU7CisKK3N0cnVjdCB4c2RfX2Jhc2U2NEJpbmFyeQorewl1bnNpZ25lZCBjaGFyICoJCQlfX3B0cjsKKwlpbnQJCQkJX19zaXplOworfTsKKworc3RydWN0IGFwaV9fRGlyZWN0b3J5Q2F0ZWdvcnkKK3sJeHNkX19zdHJpbmcJCQlmdWxsVmlld2FibGVOYW1lOworCXhzZF9fc3RyaW5nCQkJc3BlY2lhbEVuY29kaW5nOworfTsKKworc3RydWN0IERpcmVjdG9yeUNhdGVnb3J5QXJyYXkKK3sJc3RydWN0IGFwaV9fRGlyZWN0b3J5Q2F0ZWdvcnkgKglfX3B0cjsKKwlpbnQJCQkJX19zaXplOworfTsKKworc3RydWN0IGFwaV9fUmVzdWx0RWxlbWVudAorewl4c2RfX3N0cmluZwkJCXN1bW1hcnk7CisJeHNkX19zdHJpbmcJCQlVUkw7CisJeHNkX19zdHJpbmcJCQlzbmlwcGV0OworCXhzZF9fc3RyaW5nCQkJdGl0bGU7CisJeHNkX19zdHJpbmcJCQljYWNoZWRTaXplOworCXhzZF9fYm9vbGVhbgkJCXJlbGF0ZWRJbmZvcm1hdGlvblByZXNlbnQ7CisJeHNkX19zdHJpbmcJCQlob3N0TmFtZTsKKwlzdHJ1Y3QgYXBpX19EaXJlY3RvcnlDYXRlZ29yeQlkaXJlY3RvcnlDYXRlZ29yeTsKKwl4c2RfX3N0cmluZwkJCWRpcmVjdG9yeVRpdGxlOworfTsKKworc3RydWN0IFJlc3VsdEVsZW1lbnRBcnJheQorewlzdHJ1Y3QgYXBpX19SZXN1bHRFbGVtZW50ICoJX19wdHI7CisJaW50CQkJCV9fc2l6ZTsKK307CisKK3N0cnVjdCBhcGlfX0dvb2dsZVNlYXJjaFJlc3VsdAorewl4c2RfX2Jvb2xlYW4JCQlkb2N1bWVudEZpbHRlcmluZzsKKwl4c2RfX3N0cmluZwkJCXNlYXJjaENvbW1lbnRzOworCXhzZF9faW50CQkJZXN0aW1hdGVkVG90YWxSZXN1bHRzQ291bnQ7CisJeHNkX19ib29sZWFuCQkJZXN0aW1hdGVJc0V4YWN0OworCXN0cnVjdCBSZXN1bHRFbGVtZW50QXJyYXkJcmVzdWx0RWxlbWVudHM7CisJeHNkX19zdHJpbmcJCQlzZWFyY2hRdWVyeTsKKwl4c2RfX2ludAkJCXN0YXJ0SW5kZXg7CisJeHNkX19pbnQJCQllbmRJbmRleDsKKwl4c2RfX3N0cmluZwkJCXNlYXJjaFRpcHM7CisJc3RydWN0IERpcmVjdG9yeUNhdGVnb3J5QXJyYXkJZGlyZWN0b3J5Q2F0ZWdvcmllczsKKwl4c2RfX2RvdWJsZQkJCXNlYXJjaFRpbWU7Cit9OworCithcGlfX2RvR29vZ2xlU2VhcmNoCisoCXhzZF9fc3RyaW5nCQkJa2V5LAorCXhzZF9fc3RyaW5nCQkJcSwKKwl4c2RfX2ludAkJCXN0YXJ0LAorCXhzZF9faW50CQkJbWF4UmVzdWx0cywKKwl4c2RfX2Jvb2xlYW4JCQlmaWx0ZXIsCisJeHNkX19zdHJpbmcJCQlyZXN0cmljdF8sCisJeHNkX19ib29sZWFuCQkJc2FmZVNlYXJjaCwKKwl4c2RfX3N0cmluZwkJCWxyLAorCXhzZF9fc3RyaW5nCQkJaWUsCisJeHNkX19zdHJpbmcJCQlvZSwKKwlzdHJ1Y3QgYXBpX19kb0dvb2dsZVNlYXJjaFJlc3BvbnNlCisJewlzdHJ1Y3QgYXBpX19Hb29nbGVTZWFyY2hSZXN1bHQJX3JldHVybjsKKwl9CQkJCSpyZXNwb25zZQorKTsKKworYXBpX19kb0dldENhY2hlZFBhZ2UKKygJeHNkX19zdHJpbmcJCQlrZXksCisJeHNkX19zdHJpbmcJCQl1cmwsCisJc3RydWN0IHhzZF9fYmFzZTY0QmluYXJ5CSpfcmV0dXJuCispOworCithcGlfX2RvU3BlbGxpbmdTdWdnZXN0aW9uCisoCXhzZF9fc3RyaW5nCQkJa2V5LAorCXhzZF9fc3RyaW5nCQkJcGhyYXNlLAorCXhzZF9fc3RyaW5nCQkJKl9yZXR1cm4KKyk7CisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZ3BsLnR4dCBiL3NhbXBsZXMvZ3BsLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzQyMzdhCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9ncGwudHh0CkBAIC0wLDAgKzEsMzA5IEBACitUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkKKworVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlCiszMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoaXMgbGljZW5zZQorZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworUHJlYW1ibGUKKworVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91ciBmcmVlZG9tIHRvIHNoYXJlCithbmQgY2hhbmdlIGl0LiBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGludGVuZGVkIHRvCitndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZQorc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdAorb2YgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZQorYXV0aG9ycyBjb21taXQgdG8gdXNpbmcgaXQuIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcworY292ZXJlZCBieSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgWW91IGNhbiBhcHBseSBpdCB0bworeW91ciBwcm9ncmFtcywgdG9vLgorCitXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90IHByaWNlLiBPdXIKK0dlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSB0aGUgZnJlZWRvbSB0bworZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IgdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwKK3RoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdCBpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZQordGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQgaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdQorY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZCBhbnlvbmUgdG8gZGVueQoreW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLiBUaGVzZSByZXN0cmljdGlvbnMKK3RyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCitzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlciBncmF0aXMgb3IgZm9yCithIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0IHlvdSBoYXZlLiBZb3UgbXVzdCBtYWtlCitzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZSBjb2RlLiBBbmQgeW91IG11c3Qgc2hvdyB0aGVtCit0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIgcmlnaHRzLgorCitXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kICgyKQorb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlCithbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KKworQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4gdGhhdAorZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlIHNvZnR3YXJlLiBJZiB0aGUKK3NvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZSB3YW50IGl0cyByZWNpcGllbnRzIHRvCitrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28gdGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZAorYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsIGF1dGhvcnMnIHJlcHV0YXRpb25zLgorCitGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZSBwYXRlbnRzLiBXZSB3aXNoCit0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlIHByb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkKK29idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlIHByb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50Cit0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkgcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MKK2ZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCisKK1RoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbgorZm9sbG93LgorCitURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucyBhIG5vdGljZQorcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mCit0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuIFRoZSAiUHJvZ3JhbSIsIGJlbG93LCByZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbQorb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iIG1lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkKK2Rlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OiB0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlCitQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IKK3RyYW5zbGF0ZWQgaW50byBhbm90aGVyIGxhbmd1YWdlLiAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQKK2xpbWl0YXRpb24gaW4gdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QgY292ZXJlZCBieQordGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gVGhlIGFjdCBvZiBydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdAorcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbSBpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzCitjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieQorcnVubmluZyB0aGUgUHJvZ3JhbSkuIFdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgorCisxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3Mgc291cmNlIGNvZGUgYXMKK3lvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdSBjb25zcGljdW91c2x5IGFuZAorYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlCithbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OyBhbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUKK1Byb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCitZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQgeW91IG1heQorYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCisKKzIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24gb2YgaXQsIHRodXMKK2Zvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQgZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMKK29yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMSBhYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZgordGhlc2UgY29uZGl0aW9uczoKKworYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdAoreW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCitiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4gd2hvbGUgb3IgaW4KK3BhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueSBwYXJ0IHRoZXJlb2YsIHRvIGJlCitsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcworTGljZW5zZS4KKworYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseSB3aGVuIHJ1biwgeW91CittdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaCBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3QKK29yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbiBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlCitjb3B5cmlnaHQgbm90aWNlIGFuZCBhIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdAoreW91IHByb3ZpZGUgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlciB0aGVzZQorY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMgTGljZW5zZS4KKyhFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQKK3N1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50CithbiBhbm5vdW5jZW1lbnQuKQorCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gSWYgaWRlbnRpZmlhYmxlCitzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sIGFuZCBjYW4gYmUgcmVhc29uYWJseQorY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4gdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZAoraXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2Ugc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlCit3b3Jrcy4gQnV0IHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEKK3dvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zCitvZiB0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZSBlbnRpcmUKK3dob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QgeW91cgorcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0byBleGVyY2lzZSB0aGUKK3JpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yIGNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24KK3RoZSBQcm9ncmFtLgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtIHdpdGggdGhlCitQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YgYSBzdG9yYWdlIG9yCitkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyIHRoZSBzY29wZSBvZiB0aGlzCitMaWNlbnNlLgorCiszLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwgdW5kZXIKK1NlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZAorMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCithKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlLAord2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQorY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCitiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZSB5ZWFycywgdG8gZ2l2ZQorYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcKK3NvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nCitzb3VyY2UgY29kZSwgdG8gYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYQorbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIgdG8gZGlzdHJpYnV0ZQorY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gKFRoaXMgYWx0ZXJuYXRpdmUgaXMgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsCitkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91IHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUKK2Zvcm0gd2l0aCBzdWNoIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQorCitUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yIG1ha2luZworbW9kaWZpY2F0aW9ucyB0byBpdC4gRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlIGNvZGUgbWVhbnMgYWxsIHRoZQorc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueSBhc3NvY2lhdGVkIGludGVyZmFjZQorZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbgorb2YgdGhlIGV4ZWN1dGFibGUuIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZAorbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yCitiaW5hcnkgZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKK29wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50IGl0c2VsZgorYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCisKK0lmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKK2Zyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZQorY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcyBkaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaAordGhpcmQgcGFydGllcyBhcmUgbm90IGNvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisKKzQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBleGNlcHQgYXMKK2V4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuIEFueSBhdHRlbXB0IG90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksCitzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUKK3lvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4gSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yCityaWdodHMsIGZyb20geW91IHVuZGVyIHRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28KK2xvbmcgYXMgc3VjaCBwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKzUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdCBzaWduZWQgaXQuCitIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCitvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gVGhlc2UgYWN0aW9ucyBhcmUgcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdAorYWNjZXB0IHRoaXMgTGljZW5zZS4gVGhlcmVmb3JlLCBieSBtb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvcgorYW55IHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0bworZG8gc28sIGFuZCBhbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSwKK3RoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUgb3JpZ2luYWwgbGljZW5zb3IgdG8KK2NvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8gdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuCitZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIgcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUKK3JpZ2h0cyBncmFudGVkIGhlcmVpbi4gWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5Cit0aGlyZCBwYXJ0aWVzIHRvIHRoaXMgTGljZW5zZS4KKworNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwgY29uZGl0aW9ucworYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3Igb3RoZXJ3aXNlKSB0aGF0Citjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QgZXhjdXNlIHlvdSBmcm9tIHRoZQorY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuIElmIHlvdSBjYW5ub3QgZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5CitzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudAorb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UgbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4KK0ZvciBleGFtcGxlLCBpZiBhIHBhdGVudCBsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uCitvZiB0aGUgUHJvZ3JhbSBieSBhbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaAoreW91LCB0aGVuIHRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhbnkKK3BhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBhcHBseSBhbmQKK3RoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIgY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueSBwYXRlbnRzIG9yCitvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkgc3VjaCBjbGFpbXM7IHRoaXMKK3NlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUgaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlCitkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcyBpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuIE1hbnkKK3Blb3BsZSBoYXZlIG1hZGUgZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcgdG8KK2Rpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdCBpbXBvc2UgdGhhdAorY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8gYmUgYQorY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorCis4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbiBjZXJ0YWluCitjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlIG9yaWdpbmFsCitjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlIG1heSBhZGQgYW4gZXhwbGljaXQKK2dlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLCBzbyB0aGF0CitkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4KK3N1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcyB0aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5CitvZiB0aGlzIExpY2Vuc2UuCisKKzkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zIG9mIHRoZQorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluCitzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zCitvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIElmIHRoZSBQcm9ncmFtIHNwZWNpZmllcworYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueSBsYXRlciB2ZXJzaW9uIiwKK3lvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdAordmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIElmCit0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZQorYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZSBwcm9ncmFtcword2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvciB0byBhc2sgZm9yCitwZXJtaXNzaW9uLiBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKK3dyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuCitPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2FscyBvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZgorYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZCBvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mCitzb2Z0d2FyZSBnZW5lcmFsbHkuCisKK05PIFdBUlJBTlRZCisKKzExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWSBGT1IKK1RIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gRVhDRVBUIFdIRU4gT1RIRVJXSVNFCitTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMgUFJPVklERSBUSEUKK1BST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsCitJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORAorUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuIFNIT1VMRCBUSEUgUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVQorQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORyBXSUxMCitBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUiBSRURJU1RSSUJVVEUgVEhFCitQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywgSU5DTFVESU5HIEFOWQorR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPUgorSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBMT1NTIE9GIERBVEEgT1IgREFUQQorQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEKK0ZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIKK09SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKK0hvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCitJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0IHBvc3NpYmxlCit1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0IGZyZWUgc29mdHdhcmUKK3doaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KKworVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uIEl0IGlzIHNhZmVzdCB0byBhdHRhY2gKK3RoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseSBjb252ZXkgdGhlIGV4Y2x1c2lvbgorb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgdGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEKK3BvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDQsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbDoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKworSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcyB3aGVuIGl0CitzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKKworZ1NPQVAgdmVyc2lvbiBYLlkuWiwgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSwgSW5jLgorZ1NPQVAgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLiBUaGlzIGlzCitmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdCB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7Cit0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgorCitUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKK3BhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heSBiZQorY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCittb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgorCitUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KK3Byb3ByaWV0YXJ5IHByb2dyYW1zLiBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkgY29uc2lkZXIKK2l0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZSBsaWJyYXJ5LiBJZgordGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZAorb2YgdGhpcyBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9saXN0aW5nL01ha2VmaWxlIGIvc2FtcGxlcy9saXN0aW5nL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YWE4ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2xpc3RpbmcvTWFrZWZpbGUKQEAgLTAsMCArMSwyMCBAQAorR1NPQVA9Li4vLi4vc29hcGNwcDIKK1NPQVBIPS4uLy4uL3N0ZHNvYXAyLmgKK1NPQVBDPS4uLy4uL3N0ZHNvYXAyLmMKK1NPQVBDUFA9Li4vLi4vc3Rkc29hcDIuY3BwCitDQz1nY2MKK0NQUD1nKysKK0xJQlM9CitDT0ZMQUdTPS1PMgorQ1dGTEFHUz0tV2FsbAorQ0lGTEFHUz0tSS4uLy4uCitDTUZMQUdTPQorQ0ZMQUdTPSAkKENXRkxBR1MpICQoQ09GTEFHUykgJChDSUZMQUdTKSAkKENNRkxBR1MpCithbGw6CQlsaXN0aW5nCitsaXN0aW5nOglsaXN0aW5nLmggbGlzdGluZy5jcHAgJChTT0FQSCkgJChTT0FQQ1BQKQorCQkkKEdTT0FQKSBsaXN0aW5nLmgKKwkJJChDUFApICQoQ0ZMQUdTKSAtbyBsaXN0aW5nIGxpc3RpbmcuY3BwIHNvYXBDLmNwcCBzb2FwQ2xpZW50LmNwcCAkKFNPQVBDUFApICQoTElCUykKK2NsZWFuOgorCQlybSAtZiAqLm8gc29hcEguaCBzb2FwU3R1Yi5oIHNvYXBDLmNwcCBzb2FwQy5jIHNvYXBDbGllbnQuY3BwIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmNwcCBzb2FwU2VydmVyLmMgc29hcCpQcm94eS5oCitkaXN0Y2xlYW46CisJCXJtIC1mICoubyAqLndzZGwgKi54c2QgKi54bWwgKi5uc21hcCAqLmxvZyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5LmggbGlzdGluZwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9saXN0aW5nL01ha2VmaWxlU29sYXJpcyBiL3NhbXBsZXMvbGlzdGluZy9NYWtlZmlsZVNvbGFyaXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFlMzJjMQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvbGlzdGluZy9NYWtlZmlsZVNvbGFyaXMKQEAgLTAsMCArMSwyMCBAQAorR1NPQVA9Li4vLi4vc29hcGNwcDIKK1NPQVBIPS4uLy4uL3N0ZHNvYXAyLmgKK1NPQVBDPS4uLy4uL3N0ZHNvYXAyLmMKK1NPQVBDUFA9Li4vLi4vc3Rkc29hcDIuY3BwCitDQz1nY2MKK0NQUD1nKysKK0xJQlM9LWx4bmV0IC1sbnNsIC1sc29ja2V0CitDT0ZMQUdTPS1PMgorQ1dGTEFHUz0tV2FsbAorQ0lGTEFHUz0tSS4uLy4uCitDTUZMQUdTPQorQ0ZMQUdTPSAkKENXRkxBR1MpICQoQ09GTEFHUykgJChDSUZMQUdTKSAkKENNRkxBR1MpCithbGw6CQlsaXN0aW5nCitsaXN0aW5nOglsaXN0aW5nLmggbGlzdGluZy5jcHAgJChTT0FQSCkgJChTT0FQQ1BQKQorCQkkKEdTT0FQKSBsaXN0aW5nLmgKKwkJJChDUFApICQoQ0ZMQUdTKSAtbyBsaXN0aW5nIGxpc3RpbmcuY3BwIHNvYXBDLmNwcCBzb2FwQ2xpZW50LmNwcCAkKFNPQVBDUFApICQoTElCUykKK2NsZWFuOgorCQlybSAtZiAqLm8gc29hcEguaCBzb2FwU3R1Yi5oIHNvYXBDLmNwcCBzb2FwQy5jIHNvYXBDbGllbnQuY3BwIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmNwcCBzb2FwU2VydmVyLmMgc29hcCpQcm94eS5oCitkaXN0Y2xlYW46CisJCXJtIC1mICoubyAqLndzZGwgKi54c2QgKi54bWwgKi5uc21hcCAqLmxvZyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5LmggbGlzdGluZwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9saXN0aW5nL2xpc3RpbmcuY3BwIGIvc2FtcGxlcy9saXN0aW5nL2xpc3RpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YWYyYTYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2xpc3RpbmcvbGlzdGluZy5jcHAKQEAgLTAsMCArMSw0NyBAQAorI2luY2x1ZGUgInNvYXBYTWV0aG9kc1F1ZXJ5UHJveHkuaCIKKyNpbmNsdWRlICJYTWV0aG9kc1F1ZXJ5Lm5zbWFwIgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7IFhNZXRob2RzUXVlcnkgcXVlcnk7CisgIHByaW50ZigiQ29udGVudC10eXBlOiB0ZXh0L2h0bWxcclxuXHJcbjxodG1sPjxoMT5Nb3N0IFJlY2VudCBYbWV0aG9kcyBTZXJ2aWNlIExpc3Rpbmc8L2gxPjxwcmU+XG4iKTsKKyAgaWYgKGFyZ2MgPj0gMiAmJiBhcmd2WzFdWzFdID09ICdzJykKKyAgeyBBcnJheU9mU2VydmljZVN1bW1hcnkgc2VydmljZXM7CisgICAgaWYgKCFxdWVyeS5uc19fZ2V0QWxsU2VydmljZVN1bW1hcmllcyhzZXJ2aWNlcykpCisgICAgICBzZXJ2aWNlcy5wcmludCgpOworICAgIGVsc2UKKyAgICB7IHNvYXBfcHJpbnRfZmF1bHQocXVlcnkuc29hcCwgc3RkZXJyKTsKKyAgICAgIHNvYXBfcHJpbnRfZmF1bHRfbG9jYXRpb24ocXVlcnkuc29hcCwgc3RkZXJyKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7IEFycmF5T2ZJRE5hbWVQYWlyIHNlcnZpY2VzOworICAgIGlmICghcXVlcnkubnNfX2dldEFsbFNlcnZpY2VOYW1lcyhzZXJ2aWNlcykpCisgICAgICBzZXJ2aWNlcy5wcmludCgpOworICAgIGVsc2UKKyAgICB7IHNvYXBfcHJpbnRfZmF1bHQocXVlcnkuc29hcCwgc3RkZXJyKTsKKyAgICAgIHNvYXBfcHJpbnRfZmF1bHRfbG9jYXRpb24ocXVlcnkuc29hcCwgc3RkZXJyKTsKKyAgICB9CisgIH0KKyAgcHJpbnRmKCI8L3ByZT48L2h0bWw+XG4iKTsKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgQXJyYXlPZklETmFtZVBhaXI6OnByaW50KCkgY29uc3QKK3sgZm9yIChpbnQgaSA9IDA7IGkgPCBfX3NpemU7IGkrKykKKyAgeyB0X19JRE5hbWVQYWlyICZwYWlyID0gX19wdHJbaV07CisgICAgY2hhciAqaWQgPSBwYWlyLmlkOworICAgIGNoYXIgKm5hbWUgPSBwYWlyLm5hbWU7CisgICAgcHJpbnRmKCI8YSBocmVmPVwiaHR0cDovL3d3dy54bWV0aG9kcy5uZXQvdmUyL1ZpZXdMaXN0aW5nLnBvP2tleT0lc1wiPiVzPC9hPlxuIiwgaWQ/aWQ6IiIsIG5hbWU/bmFtZToiPyIpOworICB9Cit9CisKK3ZvaWQgQXJyYXlPZlNlcnZpY2VTdW1tYXJ5OjpwcmludCgpIGNvbnN0Cit7IGZvciAoaW50IGkgPSAwOyBpIDwgX19zaXplOyBpKyspCisgIHsgdF9fU2VydmljZVN1bW1hcnkgJnN1bW1hcnkgPSBfX3B0cltpXTsKKyAgICBjaGFyICppZCA9IHN1bW1hcnkuaWQ7CisgICAgY2hhciAqbmFtZSA9IHN1bW1hcnkubmFtZTsKKyAgICBjaGFyICpzaG9ydERlc2NyaXB0aW9uID0gc3VtbWFyeS5zaG9ydERlc2NyaXB0aW9uOworICAgIGNoYXIgKndzZGxVUkwgPSBzdW1tYXJ5LndzZGxVUkw7CisgICAgcHJpbnRmKCI8YSBocmVmPVwiaHR0cDovL3d3dy54bWV0aG9kcy5uZXQvdmUyL1ZpZXdMaXN0aW5nLnBvP2tleT0lc1wiPiVzPC9hPiBcIiVzXCIgPGEgaHJlZj1cIiVzXCI+JXM8L2E+XG4iLCBpZD9pZDoiIiwgbmFtZT9uYW1lOiI/Iiwgc2hvcnREZXNjcmlwdGlvbj9zaG9ydERlc2NyaXB0aW9uOiIiLCB3c2RsVVJMP3dzZGxVUkw6IiIsIHdzZGxVUkw/d3NkbFVSTDoibm8gV1NETCIpOworICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL2xpc3RpbmcvbGlzdGluZy5oIGIvc2FtcGxlcy9saXN0aW5nL2xpc3RpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjAyZDg4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9saXN0aW5nL2xpc3RpbmcuaApAQCAtMCwwICsxLDcwIEBACisvL2dzb2FwIG5zIHNlcnZpY2UgbmFtZToJWE1ldGhvZHNRdWVyeQorLy9nc29hcCBucyBzZXJ2aWNlIHN0eWxlOglycGMKKy8vZ3NvYXAgbnMgc2VydmljZSBlbmNvZGluZzoJZW5jb2RlZAorLy9nc29hcCBucyBzZXJ2aWNlIG5hbWVzcGFjZToJaHR0cDovL3d3dy54bWV0aG9kcy5uZXQvaW50ZXJmYWNlcy9xdWVyeS53c2RsCisvL2dzb2FwIG5zIHNlcnZpY2UgbG9jYXRpb246CWh0dHA6Ly93d3cueG1ldGhvZHMubmV0L2ludGVyZmFjZXMvcXVlcnkKKworLy9nc29hcCBucyBzY2hlbWEgbmFtZXNwYWNlOiBodHRwOi8vd3d3LnhtZXRob2RzLm5ldC9pbnRlcmZhY2VzL3F1ZXJ5CisvL2dzb2FwIHQgc2NoZW1hIG5hbWVzcGFjZTogaHR0cDovL3d3dy54bWV0aG9kcy5uZXQvaW50ZXJmYWNlcy9xdWVyeS54c2QKKworY2xhc3MgdF9fU2VydmljZVN1bW1hcnkKK3sgcHVibGljOgorICBjaGFyICpuYW1lOworICBjaGFyICppZDsKKyAgY2hhciAqc2hvcnREZXNjcmlwdGlvbjsKKyAgY2hhciAqd3NkbFVSTDsKKyAgY2hhciAqcHVibGlzaGVySUQ7Cit9OworCitjbGFzcyB0X19TZXJ2aWNlRGV0YWlsCit7IHB1YmxpYzoKKyAgY2hhciAqbmFtZTsKKyAgY2hhciAqaWQ7CisgIGNoYXIgKnNob3J0RGVzY3JpcHRpb247CisgIGNoYXIgKmRlc2NyaXB0aW9uOworICBjaGFyICppbXBsZW1lbnRhdGlvbklEOworICBjaGFyICplbWFpbDsKKyAgY2hhciAqd3NkbFVSTDsKKyAgY2hhciAqaW5mb1VSTDsKKyAgY2hhciAqZGlzY3Vzc2lvblVSTDsKKyAgY2hhciAqbm90ZXM7CisgIGNoYXIgKnRtb2RlbElEOworICBjaGFyICpwdWJsaXNoZXJJRDsKKyAgY2hhciAqdXVpZDsKK307CisKK2NsYXNzIHRfX0lETmFtZVBhaXIKK3sgcHVibGljOgorICBjaGFyICppZDsKKyAgY2hhciAqbmFtZTsKK307CisKK2NsYXNzIEFycmF5T2ZTZXJ2aWNlU3VtbWFyeQoreyBwdWJsaWM6CisgIHRfX1NlcnZpY2VTdW1tYXJ5ICpfX3B0cjsKKyAgaW50IF9fc2l6ZTsKKyAgdm9pZCBwcmludCgpIGNvbnN0OworfTsKKworY2xhc3MgQXJyYXlPZklETmFtZVBhaXIKK3sgcHVibGljOgorICB0X19JRE5hbWVQYWlyICpfX3B0cjsKKyAgaW50IF9fc2l6ZTsKKyAgdm9pZCBwcmludCgpIGNvbnN0OworfTsKKworLy9nc29hcCBucyBzZXJ2aWNlIG1ldGhvZC1hY3Rpb246IGdldEFsbFNlcnZpY2VTdW1tYXJpZXMgIiIKK25zX19nZXRBbGxTZXJ2aWNlU3VtbWFyaWVzKEFycmF5T2ZTZXJ2aWNlU3VtbWFyeSYpOworCisvL2dzb2FwIG5zIHNlcnZpY2UgbWV0aG9kLWFjdGlvbjogZ2V0U2VydmljZVN1bW1hcmllc0J5UHVibGlzaGVyICIiCituc19fZ2V0U2VydmljZVN1bW1hcmllc0J5UHVibGlzaGVyKGNoYXIgKnB1Ymxpc2hlcklELCBBcnJheU9mU2VydmljZVN1bW1hcnkmKTsKKworLy9nc29hcCBucyBzZXJ2aWNlIG1ldGhvZC1hY3Rpb246IGdldFNlcnZpY2VEZXRhaWwgIiIKK25zX19nZXRTZXJ2aWNlRGV0YWlsKGNoYXIgKmlkLCB0X19TZXJ2aWNlRGV0YWlsJik7CisKKy8vZ3NvYXAgbnMgc2VydmljZSBtZXRob2QtYWN0aW9uOiBnZXRBbGxTZXJ2aWNlTmFtZXMgIiIKK25zX19nZXRBbGxTZXJ2aWNlTmFtZXMoQXJyYXlPZklETmFtZVBhaXImKTsKKworLy9nc29hcCBucyBzZXJ2aWNlIG1ldGhvZC1hY3Rpb246IGdldFNlcnZpY2VOYW1lc0J5UHVibGlzaGVyICIiCituc19fZ2V0U2VydmljZU5hbWVzQnlQdWJsaXNoZXIoY2hhciAqcHVibGlzaGVySUQsIEFycmF5T2ZJRE5hbWVQYWlyJik7CisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvbG9jYWx0aW1lL01ha2VmaWxlIGIvc2FtcGxlcy9sb2NhbHRpbWUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ3NTRjMgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvbG9jYWx0aW1lL01ha2VmaWxlCkBAIC0wLDAgKzEsMjAgQEAKK0dTT0FQPS4uLy4uL3NvYXBjcHAyCitTT0FQSD0uLi8uLi9zdGRzb2FwMi5oCitTT0FQQz0uLi8uLi9zdGRzb2FwMi5jCitTT0FQQ1BQPS4uLy4uL3N0ZHNvYXAyLmNwcAorQ0M9Z2NjCitDUFA9ZysrCitMSUJTPQorQ09GTEFHUz0tTzIKK0NXRkxBR1M9LVdhbGwKK0NJRkxBR1M9LUkuLi8uLgorQ01GTEFHUz0KK0NGTEFHUz0gJChDV0ZMQUdTKSAkKENPRkxBR1MpICQoQ0lGTEFHUykgJChDTUZMQUdTKQorYWxsOgkJbG9jYWx0aW1lCitsb2NhbHRpbWU6CWxvY2FsdGltZS5oIGxvY2FsdGltZS5jICQoU09BUEgpICQoU09BUEMpCisJCSQoR1NPQVApIC1jIGxvY2FsdGltZS5oCisJCSQoQ0MpICQoQ0ZMQUdTKSAtbyBsb2NhbHRpbWUgbG9jYWx0aW1lLmMgc29hcEMuYyBzb2FwQ2xpZW50LmMgJChTT0FQQykgJChMSUJTKQorY2xlYW46CisJCXJtIC1mICoubyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5LmgKK2Rpc3RjbGVhbjoKKwkJcm0gLWYgKi5vICoud3NkbCAqLnhzZCAqLnhtbCAqLm5zbWFwICoubG9nIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaCBsb2NhbHRpbWUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvbG9jYWx0aW1lL01ha2VmaWxlU29sYXJpcyBiL3NhbXBsZXMvbG9jYWx0aW1lL01ha2VmaWxlU29sYXJpcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGIwZTdjCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9sb2NhbHRpbWUvTWFrZWZpbGVTb2xhcmlzCkBAIC0wLDAgKzEsMjAgQEAKK0dTT0FQPS4uLy4uL3NvYXBjcHAyCitTT0FQSD0uLi8uLi9zdGRzb2FwMi5oCitTT0FQQz0uLi8uLi9zdGRzb2FwMi5jCitTT0FQQ1BQPS4uLy4uL3N0ZHNvYXAyLmNwcAorQ0M9Z2NjCitDUFA9ZysrCitMSUJTPS1seG5ldCAtbG5zbCAtbHNvY2tldAorQ09GTEFHUz0tTzIKK0NXRkxBR1M9LVdhbGwKK0NJRkxBR1M9LUkuLi8uLgorQ01GTEFHUz0KK0NGTEFHUz0gJChDV0ZMQUdTKSAkKENPRkxBR1MpICQoQ0lGTEFHUykgJChDTUZMQUdTKQorYWxsOgkJbG9jYWx0aW1lCitsb2NhbHRpbWU6CWxvY2FsdGltZS5oIGxvY2FsdGltZS5jICQoU09BUEgpICQoU09BUEMpCisJCSQoR1NPQVApIC1jIGxvY2FsdGltZS5oCisJCSQoQ0MpICQoQ0ZMQUdTKSAtbyBsb2NhbHRpbWUgbG9jYWx0aW1lLmMgc29hcEMuYyBzb2FwQ2xpZW50LmMgJChTT0FQQykgJChMSUJTKQorY2xlYW46CisJCXJtIC1mICoubyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5LmgKK2Rpc3RjbGVhbjoKKwkJcm0gLWYgKi5vICoud3NkbCAqLnhzZCAqLnhtbCAqLm5zbWFwICoubG9nIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaCBsb2NhbHRpbWUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvbG9jYWx0aW1lL2xvY2FsdGltZS5jIGIvc2FtcGxlcy9sb2NhbHRpbWUvbG9jYWx0aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ1MGI5YgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvbG9jYWx0aW1lL2xvY2FsdGltZS5jCkBAIC0wLDAgKzEsMTQgQEAKKy8qIFRoaXMgY2xpZW50IGludm9rZXMgYSByZW1vdGUgbWV0aG9kIG9mIGEgc2VydmljZSBpbXBsZW1lbnRlZCBpbiAuTkVUIHdpdGggU09BUCBkb2MvbGl0IGVuY29kaW5nICovCisvKiBDaGFuZ2UgdGhlIFVTIHppcGNvZGUgaW4gdGhlIHN1YnJvdXRpbmUgY2FsbCB0byBvYnRhaW4geW91ciBsb2NhbCB0aW1lICovCisjaW5jbHVkZSAic29hcEguaCIKKyNpbmNsdWRlICJsb2NhbHRpbWUubnNtYXAiCitpbnQgbWFpbigpCit7IHN0cnVjdCBzb2FwIHNvYXA7CisgIGNoYXIgKnQ7CisgIHNvYXBfaW5pdCgmc29hcCk7CisgIGlmIChzb2FwX2NhbGxfbnNfX0xvY2FsVGltZUJ5WmlwQ29kZSgmc29hcCwgImh0dHA6Ly93d3cuYWxldGhlYS5uZXQvd2Vic2VydmljZXMvTG9jYWxUaW1lLmFzbXgiLCAiaHR0cDovL3d3dy5hbGV0aGVhLm5ldC93ZWJzZXJ2aWNlcy9Mb2NhbFRpbWVCeVppcENvZGUiLCAiMzIzMDYiLCAmdCkpCisgICAgc29hcF9wcmludF9mYXVsdCgmc29hcCwgc3RkZXJyKTsKKyAgZWxzZQorICAgIHByaW50ZigiVGltZSA9ICVzXG4iLCB0KTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL2xvY2FsdGltZS9sb2NhbHRpbWUuaCBiL3NhbXBsZXMvbG9jYWx0aW1lL2xvY2FsdGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZWU0YzgKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2xvY2FsdGltZS9sb2NhbHRpbWUuaApAQCAtMCwwICsxLDUgQEAKKy8vZ3NvYXAgbnMgc2VydmljZSBuYW1lOglsb2NhbHRpbWUKKy8vZ3NvYXAgbnMgc2VydmljZSBzdHlsZToJZG9jdW1lbnQKKy8vZ3NvYXAgbnMgc2VydmljZSBlbmNvZGluZzoJbGl0ZXJhbAorLy9nc29hcCBucyBzZXJ2aWNlIG5hbWVzcGFjZToJaHR0cDovL3d3dy5hbGV0aGVhLm5ldC93ZWJzZXJ2aWNlcy8KK2ludCBuc19fTG9jYWxUaW1lQnlaaXBDb2RlKGNoYXIgKlppcENvZGUsIGNoYXIgKipMb2NhbFRpbWVCeVppcENvZGVSZXN1bHQpOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9sdS9NYWtlZmlsZSBiL3NhbXBsZXMvbHUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEzNTFmOQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvbHUvTWFrZWZpbGUKQEAgLTAsMCArMSwyMyBAQAorR1NPQVA9Li4vLi4vc29hcGNwcDIKK1NPQVBIPS4uLy4uL3N0ZHNvYXAyLmgKK1NPQVBDPS4uLy4uL3N0ZHNvYXAyLmMKK1NPQVBDUFA9Li4vLi4vc3Rkc29hcDIuY3BwCitDQz1nY2MKK0NQUD1nKysKK0xJQlM9CitDT0ZMQUdTPS1PMgorQ1dGTEFHUz0tV2FsbAorQ0lGTEFHUz0tSS4uLy4uCitDTUZMQUdTPQorQ0ZMQUdTPSAkKENXRkxBR1MpICQoQ09GTEFHUykgJChDSUZMQUdTKSAkKENNRkxBR1MpCithbGw6CQlsdWNsaWVudCBsdXNlcnZlcgorbHVjbGllbnQ6CWx1LmggbHVjbGllbnQuY3BwIGx1bWF0LmNwcCAkKFNPQVBIKSAkKFNPQVBDUFApCisJCSQoR1NPQVApIGx1LmgKKwkJJChDUFApICQoQ0ZMQUdTKSAtbyBsdWNsaWVudCBsdWNsaWVudC5jcHAgbHVtYXQuY3BwIHNvYXBDLmNwcCBzb2FwQ2xpZW50LmNwcCAkKFNPQVBDUFApICQoTElCUykKK2x1c2VydmVyOglsdS5oIGx1c2VydmVyLmNwcCBsdW1hdC5jcHAgJChTT0FQSCkgJChTT0FQQ1BQKQorCQkkKEdTT0FQKSBsdS5oCisJCSQoQ1BQKSAkKENGTEFHUykgLW8gbHVzZXJ2ZXIgbHVzZXJ2ZXIuY3BwIGx1bWF0LmNwcCBzb2FwQy5jcHAgc29hcFNlcnZlci5jcHAgJChTT0FQQ1BQKSAkKExJQlMpCitjbGVhbjoKKwkJcm0gLWYgKi5vIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaAorZGlzdGNsZWFuOgorCQlybSAtZiAqLm8gKi53c2RsICoueHNkICoueG1sICoubnNtYXAgKi5sb2cgc29hcEguaCBzb2FwU3R1Yi5oIHNvYXBDLmNwcCBzb2FwQy5jIHNvYXBDbGllbnQuY3BwIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmNwcCBzb2FwU2VydmVyLmMgc29hcCpQcm94eS5oIGx1Y2xpZW50IGx1c2VydmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL2x1L01ha2VmaWxlU29sYXJpcyBiL3NhbXBsZXMvbHUvTWFrZWZpbGVTb2xhcmlzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNDY3YzUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2x1L01ha2VmaWxlU29sYXJpcwpAQCAtMCwwICsxLDIzIEBACitHU09BUD0uLi8uLi9zb2FwY3BwMgorU09BUEg9Li4vLi4vc3Rkc29hcDIuaAorU09BUEM9Li4vLi4vc3Rkc29hcDIuYworU09BUENQUD0uLi8uLi9zdGRzb2FwMi5jcHAKK0NDPWdjYworQ1BQPWcrKworTElCUz0tbHhuZXQgLWxuc2wgLWxzb2NrZXQKK0NPRkxBR1M9LU8yCitDV0ZMQUdTPS1XYWxsCitDSUZMQUdTPS1JLi4vLi4KK0NNRkxBR1M9CitDRkxBR1M9ICQoQ1dGTEFHUykgJChDT0ZMQUdTKSAkKENJRkxBR1MpICQoQ01GTEFHUykKK2FsbDoJCWx1Y2xpZW50IGx1c2VydmVyCitsdWNsaWVudDoJbHUuaCBsdWNsaWVudC5jcHAgbHVtYXQuY3BwICQoU09BUEgpICQoU09BUENQUCkKKwkJJChHU09BUCkgbHUuaAorCQkkKENQUCkgJChDRkxBR1MpIC1vIGx1Y2xpZW50IGx1Y2xpZW50LmNwcCBsdW1hdC5jcHAgc29hcEMuY3BwIHNvYXBDbGllbnQuY3BwICQoU09BUENQUCkgJChMSUJTKQorbHVzZXJ2ZXI6CWx1LmggbHVzZXJ2ZXIuY3BwIGx1bWF0LmNwcCAkKFNPQVBIKSAkKFNPQVBDUFApCisJCSQoR1NPQVApIGx1LmgKKwkJJChDUFApICQoQ0ZMQUdTKSAtbyBsdXNlcnZlciBsdXNlcnZlci5jcHAgbHVtYXQuY3BwIHNvYXBDLmNwcCBzb2FwU2VydmVyLmNwcCAkKFNPQVBDUFApICQoTElCUykKK2NsZWFuOgorCQlybSAtZiAqLm8gc29hcEguaCBzb2FwU3R1Yi5oIHNvYXBDLmNwcCBzb2FwQy5jIHNvYXBDbGllbnQuY3BwIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmNwcCBzb2FwU2VydmVyLmMgc29hcCpQcm94eS5oCitkaXN0Y2xlYW46CisJCXJtIC1mICoubyAqLndzZGwgKi54c2QgKi54bWwgKi5uc21hcCAqLmxvZyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5LmggbHVjbGllbnQgbHVzZXJ2ZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvbHUvbHUuaCBiL3NhbXBsZXMvbHUvbHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzkwOTYwCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9sdS9sdS5oCkBAIC0wLDAgKzEsODQgQEAKKy8vZ3NvYXAgbnMxIHNlcnZpY2UgbmFtZToJbHUKKy8vZ3NvYXAgbnMxIHNlcnZpY2Ugc3R5bGU6CXJwYworLy9nc29hcCBuczEgc2VydmljZSBlbmNvZGluZzoJZW5jb2RlZAorLy9nc29hcCBuczEgc2VydmljZSBuYW1lc3BhY2U6CWh0dHA6Ly93ZWJzcnYuY3MuZnN1LmVkdS9+ZW5nZWxlbi9sdS53c2RsCisvL2dzb2FwIG5zMSBzZXJ2aWNlIGxvY2F0aW9uOglodHRwOi8vd2Vic3J2LmNzLmZzdS5lZHUvfmVuZ2VsZW4vbHVzZXJ2ZXIuY2dpCisKKy8vZ3NvYXAgbnMxIHNjaGVtYSBuYW1lc3BhY2U6IHVybjpsdQordHlwZWRlZiBkb3VibGUgeHNkX19kb3VibGU7Cit0eXBlZGVmIGludCB4c2RfX2ludDsKK2NsYXNzIHZlY3RvciAvLyBkeW5hbWljIGFycmF5IG9mIHR5cGUgU09BUC1FTkM6QXJyYXkgd2l0aCBhcnJheVR5cGU9ImRvdWJsZVtdIgoreyBwdWJsaWM6CisJeHNkX19kb3VibGUJCSpfX3B0cjsgLy8gcG9pbnRlciB0byBhcnJheSBvZiBkb3VibGUKKwlpbnQJCQlfX3NpemU7IC8vIG51bWJlciBvZiBlbGVtZW50cyBwb2ludGVkIHRvCisJaW50CQkJX19vZmZzZXQ7CisJc3RydWN0IHNvYXAJCSpzb2FwOwkvLyBnU09BUCBlbnYuIGluc3RhbmNlIHdhcyBjcmVhdGVkCisJCQkJdmVjdG9yKCk7CisJCQkJdmVjdG9yKHN0cnVjdCBzb2FwICplbnYpOworCQkJCXZlY3RvcihzdHJ1Y3Qgc29hcCAqZW52LCBpbnQgc2l6ZSk7CisJCQkJdmVjdG9yKHN0cnVjdCBzb2FwICplbnYsIGludCBzdGFydCwgaW50IGVuZCk7CisJdmlydHVhbAkJCX52ZWN0b3IoKTsKKwl2aXJ0dWFsIGludAkJc3RhcnQoKTsgLy8gaW5kZXggb2YgZmlyc3QgZWxlbWVudCAoPV9fb2Zmc2V0KQorCXZpcnR1YWwgaW50CQllbmQoKTsgICAvLyBpbmRleCBvZiBsYXN0IGVsZW1lbnQKKwl2aXJ0dWFsIGludAkJc2l6ZSgpOyAgLy8gdmVjdG9yIHNpemUKKwl2aXJ0dWFsIHZvaWQJCXJlc2l6ZShpbnQgc2l6ZSk7CisJdmlydHVhbCB2b2lkCQlyZXNpemUoaW50IHN0YXJ0LCBpbnQgZW5kKTsKKwl2aXJ0dWFsIGRvdWJsZSYJCW9wZXJhdG9yW10oaW50IGkpOworCXZpcnR1YWwgZG91YmxlCQlvcGVyYXRvcigpKGludCBpKTsKKwl2aXJ0dWFsIHZvaWQJCXByaW50KCk7Cit9OworCitjbGFzcyBpdmVjdG9yIC8vIGR5bmFtaWMgYXJyYXkgb2YgdHlwZSBTT0FQLUVOQzpBcnJheSB3aXRoIGFycmF5VHlwZT0iaW50W10iCit7IHB1YmxpYzoKKwl4c2RfX2ludAkJKl9fcHRyOyAvLyBwb2ludGVyIHRvIGFycmF5IG9mIGludAorCWludAkJCV9fc2l6ZTsgLy8gbnVtYmVyIG9mIGVsZW1lbnRzIHBvaW50ZWQgdG8KKwlpbnQJCQlfX29mZnNldDsKKwlzdHJ1Y3Qgc29hcAkJKnNvYXA7CS8vIGdTT0FQIGVudi4gaW5zdGFuY2Ugd2FzIGNyZWF0ZWQKKwkJCQlpdmVjdG9yKCk7CisJCQkJaXZlY3RvcihzdHJ1Y3Qgc29hcCAqZW52KTsKKwkJCQlpdmVjdG9yKHN0cnVjdCBzb2FwICplbnYsIGludCBzaXplKTsKKwkJCQlpdmVjdG9yKHN0cnVjdCBzb2FwICplbnYsIGludCBzdGFydCwgaW50IGVuZCk7CisJdmlydHVhbAkJCX5pdmVjdG9yKCk7CisJdmlydHVhbCBpbnQJCXN0YXJ0KCk7IC8vIGluZGV4IG9mIGZpcnN0IGVsZW1lbnQgKD1fX29mZnNldCkKKwl2aXJ0dWFsIGludAkJZW5kKCk7ICAgLy8gaW5kZXggb2YgbGFzdCBlbGVtZW50CisJdmlydHVhbCBpbnQJCXNpemUoKTsgIC8vIHZlY3RvciBzaXplCisJdmlydHVhbCB2b2lkCQlyZXNpemUoaW50IHNpemUpOworCXZpcnR1YWwgdm9pZAkJcmVzaXplKGludCBzdGFydCwgaW50IGVuZCk7CisJdmlydHVhbCBpbnQmCQlvcGVyYXRvcltdKGludCBpKTsKKwl2aXJ0dWFsIGludAkJb3BlcmF0b3IoKShpbnQgaSk7CisJdmlydHVhbCB2b2lkCQlwcmludCgpOworfTsKKworY2xhc3MgbWF0cml4IC8vIGR5bmFtaWMgYXJyYXkgb2YgdHlwZSBTT0FQLUVOQzpBcnJheSB3aXRoIGFycmF5VHlwZT0iZG91YmxlW11bXSIKK3sgcHVibGljOgorCXZlY3RvcgkJCSpfX3B0cjsgLy8gcG9pbnRlciB0byBhcnJheSBvZiB2ZWN0b3JzCisJaW50CQkJX19zaXplOyAvLyBudW1iZXIgb2YgdmVjdG9ycyBwb2ludGVkIHRvCisJaW50CQkJX19vZmZzZXQ7CisJc3RydWN0IHNvYXAJCSpzb2FwOwkvLyBnU09BUCBlbnYuIGluc3RhbmNlIHdhcyBjcmVhdGVkCisJCQkJbWF0cml4KCk7CisJCQkJbWF0cml4KHN0cnVjdCBzb2FwICplbnYpOworCQkJCW1hdHJpeChzdHJ1Y3Qgc29hcCAqZW52LCBpbnQgcm93cyk7CisJCQkJbWF0cml4KHN0cnVjdCBzb2FwICplbnYsIGludCByb3dzLCBpbnQgY29scyk7CisJCQkJbWF0cml4KHN0cnVjdCBzb2FwICplbnYsIGludCByb3dzdGFydCwgaW50IHJvd2VuZCwgaW50IGNvbHN0YXJ0LCBpbnQgY29sZW5kKTsKKwl2aXJ0dWFsCQkJfm1hdHJpeCgpOworCXZpcnR1YWwgaW50CQlzdGFydCgpOworCXZpcnR1YWwgaW50CQllbmQoKTsKKwl2aXJ0dWFsIGludAkJc2l6ZSgpOworCXZpcnR1YWwgdm9pZAkJcmVzaXplKGludCByb3dzLCBpbnQgY29scyk7CisJdmlydHVhbCB2b2lkCQlyZXNpemUoaW50IHJvd3N0YXJ0LCBpbnQgcm93ZW5kLCBpbnQgY29sc3RhcnQsIGludCBjb2xlbmQpOworCXZpcnR1YWwgdmVjdG9yJgkJb3BlcmF0b3JbXShpbnQgaSk7CisJdmlydHVhbCBkb3VibGUJCW9wZXJhdG9yKCkoaW50IGksIGludCBqKTsKKwl2aXJ0dWFsIHZvaWQJCXByaW50KCk7Cit9OworLy8gTFUgZGVjb21wb3NpdGlvbiwgc2VlIE51bWVyaWNhbCBSZWNpcGllcyBmb3IgQworbnMxX19sdWRjbXAobWF0cml4ICphLCBzdHJ1Y3QgbnMxX19sdWRjbXBSZXNwb25zZSB7bWF0cml4ICphOyBpdmVjdG9yICppOyB4c2RfX2RvdWJsZSBkO30gJnJlc3VsdCk7CisvLyBiYWNrc3Vic3RpdHV0aW9uLCBzZWUgTnVtZXJpY2FsIFJlY2lwaWVzIGZvciBDCituczFfX2x1YmtzYihtYXRyaXggKmEsIGl2ZWN0b3IgKmksIHZlY3RvciAqYiwgdmVjdG9yICp4KTsKKy8vIExpbmVhciBzeXN0ZW0gc29sdmVyIHVzaW5nIExVIGRlY29tcG9zaXRpb246IHNvbHZlcyBheD1iCituczFfX2x1c29sKG1hdHJpeCAqYSwgdmVjdG9yICpiLCB2ZWN0b3IgKngpOworLy8gTGluZWFyIHN5c3RlbXMgc29sdmVyIHVzaW5nIExVIGRlY29tcG9zaXRpb246IHNvbHZlcyBheD1iIGZvciBhbGwgcm93cyBpbiB4IGFuZCBiCituczFfX2x1c29scyhtYXRyaXggKmEsIG1hdHJpeCAqYiwgbWF0cml4ICp4KTsKKy8vIE1hdHJpeCBpbnZlcnNpb24gdXNpbmcgTFUgZGVjb21wb3NpdGlvbgorbnMxX19sdWludihtYXRyaXggKmEsIG1hdHJpeCAqYik7CisvLyBEZXRlcm1pbmFudCBvZiBtYXRyaXgKK25zMV9fbHVkZXQobWF0cml4ICphLCB4c2RfX2RvdWJsZSAmZCk7CmRpZmYgLS1naXQgYS9zYW1wbGVzL2x1L2x1Y2xpZW50LmNwcCBiL3NhbXBsZXMvbHUvbHVjbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZGI0NzEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2x1L2x1Y2xpZW50LmNwcApAQCAtMCwwICsxLDY3IEBACisjaW5jbHVkZSAic29hcEguaCIKKyNpbmNsdWRlIDxpb3N0cmVhbS5oPgorCitjb25zdCBjaGFyIGx1c2VydmVyW10gPSAiaHR0cDovL3dlYnNydi5jcy5mc3UuZWR1L35lbmdlbGVuL2x1c2VydmVyLmNnaSI7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sgc3RydWN0IHNvYXAgKnNvYXAgPSBzb2FwX25ldygpOworICBjb25zdCBjaGFyICplbmRwb2ludDsKKyAgbWF0cml4IGEoc29hcCwgMyk7IC8vIG1hdHJpeCB3aXRoIDMgcm93cyBjcmVhdGVkIGluIGN1cnJlbnQgc29hcCBlbnYuCisgIC8vIHNldCB1cCBtYXRyaXggYnkgc3BlY2lmeWluZyBub24temVybyBlbGVtZW50cyBvbmx5ICh0aGlzIGlzIG9wdGlvbmFsKQorICBhWzFdLnJlc2l6ZSgxLDIpOyAvLyAyLWVsZW1lbnQgdmVjdG9yIGluZGV4ZWQgZnJvbSAxIHRvIDIKKyAgYVsxXVsxXSA9IDI7CisgIGFbMV1bMl0gPSAxOworICBhWzJdLnJlc2l6ZSgxLDMpOyAvLyAzLWVsZW1lbnQgdmVjdG9yCisgIGFbMl1bMV0gPSAxOworICBhWzJdWzJdID0gMjsKKyAgYVsyXVszXSA9IDE7CisgIGFbM10ucmVzaXplKDIsMyk7IC8vIDItZWxlbWVudCB2ZWN0b3IgaW5kZXhlZCBmcm9tIDIgdG8gMworICBhWzNdWzJdID0gMTsKKyAgYVszXVszXSA9IDI7CisgIGNvdXQgPDwgIiogRGVtb25zdHJhdGlvbiBleGFtcGxlICoiIDw8IGVuZGw7CisgIGNvdXQgPDwgIk1hdHJpeDoiIDw8IGVuZGw7CisgIGEucHJpbnQoKTsKKyAgdmVjdG9yIGIoc29hcCwgMyk7CisgIGJbMV0gPSAxOworICBiWzJdID0gMjsKKyAgYlszXSA9IDM7CisgIGNvdXQgPDwgIlZlY3RvcjoiIDw8IGVuZGw7CisgIGIucHJpbnQoKTsKKyAgdmVjdG9yIHgoc29hcCk7CisgIGlmIChhcmdjIDwgMikKKyAgICBlbmRwb2ludCA9IGx1c2VydmVyOworICBlbHNlCisgICAgZW5kcG9pbnQgPSBhcmd2WzFdOworICAvKiBzb2x2ZSBheD1iICovCisgIGlmIChzb2FwX2NhbGxfbnMxX19sdXNvbChzb2FwLCBlbmRwb2ludCwgIiIsICZhLCAmYiwgJngpKQorICB7IHNvYXBfcHJpbnRfZmF1bHQoc29hcCwgc3RkZXJyKTsKKyAgICBzb2FwX3ByaW50X2ZhdWx0X2xvY2F0aW9uKHNvYXAsIHN0ZGVycik7CisgIH0KKyAgZWxzZQorICB7IGNvdXQgPDwgIlNvbHV0aW9uIHZlY3RvciBmcm9tIHNlcnZpY2U6IiA8PCBlbmRsOworICAgIHgucHJpbnQoKTsKKyAgfQorICBtYXRyaXggYTEoc29hcCk7CisgIGlmIChzb2FwX2NhbGxfbnMxX19sdWludihzb2FwLCBlbmRwb2ludCwgIiIsICZhLCAmYTEpKQorICB7IHNvYXBfcHJpbnRfZmF1bHQoc29hcCwgc3RkZXJyKTsKKyAgICBzb2FwX3ByaW50X2ZhdWx0X2xvY2F0aW9uKHNvYXAsIHN0ZGVycik7CisgIH0KKyAgZWxzZQorICB7IGNvdXQgPDwgIkludmVyc2UgbWF0cml4IG1hdHJpeCBmcm9tIHNlcnZpY2U6IiA8PCBlbmRsOworICAgIGExLnByaW50KCk7CisgIH0KKyAgc29hcF9kZXN0cm95KHNvYXApOworICBzb2FwX2VuZChzb2FwKTsKKyAgZnJlZShzb2FwKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBOYW1lc3BhY2UgbmFtZXNwYWNlc1tdID0KK3svLyAibnMtcHJlZml4IiwgIm5zLW5hbWUiLCAibnMtcGF0dGVybiIKKyAgeyJTT0FQLUVOViIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyJ9LAorICB7IlNPQVAtRU5DIiwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIn0sCisgIHsieHNpIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgImh0dHA6Ly93d3cudzMub3JnLyovWE1MU2NoZW1hLWluc3RhbmNlIn0sCisgIHsieHNkIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiwgImh0dHA6Ly93d3cudzMub3JnLyovWE1MU2NoZW1hIn0sCisgIHsibnMxIiwgInVybjpsdSJ9LAorICB7TlVMTCwgTlVMTH0KK307CmRpZmYgLS1naXQgYS9zYW1wbGVzL2x1L2x1bWF0LmNwcCBiL3NhbXBsZXMvbHUvbHVtYXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NWMzMDYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2x1L2x1bWF0LmNwcApAQCAtMCwwICsxLDMyNyBAQAorI2luY2x1ZGUgInNvYXBILmgiCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIHZlY3RvcgorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZlY3Rvcjo6dmVjdG9yKCkKK3sgdmVjdG9yKE5VTEwpOworfQorCit2ZWN0b3I6OnZlY3RvcihzdHJ1Y3Qgc29hcCAqZW52KQoreyBzb2FwID0gZW52OworICBfX3B0ciA9IDA7CisgIF9fc2l6ZSA9IDA7CisgIF9fb2Zmc2V0ID0gMDsKK30KKwordmVjdG9yOjp2ZWN0b3Ioc3RydWN0IHNvYXAgKmVudiwgaW50IHNpemUpCit7IHNvYXAgPSBlbnY7CisgIF9fc2l6ZSA9IHNpemU7CisgIF9fb2Zmc2V0ID0gMTsKKyAgX19wdHIgPSAoZG91YmxlKilzb2FwX21hbGxvYyhzb2FwLCBzaXplKnNpemVvZihkb3VibGUpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgX19wdHJbaV0gPSAwLjA7Cit9CisKK3ZlY3Rvcjo6dmVjdG9yKHN0cnVjdCBzb2FwICplbnYsIGludCBzdGFydCwgaW50IGVuZCkKK3sgc29hcCA9IGVudjsKKyAgX19zaXplID0gZW5kLXN0YXJ0KzE7CisgIF9fb2Zmc2V0ID0gc3RhcnQ7CisgIF9fcHRyID0gKGRvdWJsZSopc29hcF9tYWxsb2Moc29hcCwgX19zaXplKnNpemVvZihkb3VibGUpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBfX3NpemU7IGkrKykKKyAgICBfX3B0cltpXSA9IDAuMDsKK30KKwordmVjdG9yOjp+dmVjdG9yKCkKK3sJLy8gbm8gZGVhbGxvY2F0aW9uOiBsZXQgZ1NPQVAgaGFuZGxlIGFsbCBkeW5hbWljIGFsbG9jYXRpb24gYW5kIGRlYWxsb2NhdGlvbgorfQorCitpbnQgdmVjdG9yOjpzdGFydCgpCit7IHJldHVybiBfX29mZnNldDsKK30KKworaW50IHZlY3Rvcjo6ZW5kKCkKK3sgcmV0dXJuIF9fc2l6ZStfX29mZnNldC0xOworfQorCitpbnQgdmVjdG9yOjpzaXplKCkKK3sgcmV0dXJuIF9fc2l6ZTsKK30KKwordm9pZCB2ZWN0b3I6OnJlc2l6ZShpbnQgc2l6ZSkKK3sgcmVzaXplKDEsIHNpemUpOworfQorCit2b2lkIHZlY3Rvcjo6cmVzaXplKGludCBzdGFydCwgaW50IGVuZCkKK3sgZG91YmxlICpwOworICBpbnQgbiwgc2l6ZSA9IGVuZC1zdGFydCsxOworICBpZiAoX19vZmZzZXQgPT0gc3RhcnQgJiYgX19zaXplID09IHNpemUpCisgICAgcmV0dXJuOyAvLyBub3RoaW5nIHRvIGRvCisgIHAgPSAoZG91YmxlKilzb2FwX21hbGxvYyhzb2FwLCBzaXplKnNpemVvZihkb3VibGUpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgcFtpXSA9IDAuMDsKKyAgaWYgKF9fcHRyKQorICB7IGlmIChzdGFydCA8IF9fb2Zmc2V0KQorICAgIHsgbiA9IChzaXplLV9fb2Zmc2V0K3N0YXJ0IDw9IF9fc2l6ZSA/IHNpemUtX19vZmZzZXQrc3RhcnQgOiBfX3NpemUpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgIHBbX19vZmZzZXQtc3RhcnQraV0gPSBfX3B0cltpXTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgbiA9IChfX3NpemUtc3RhcnQrX19vZmZzZXQgPD0gc2l6ZSA/IF9fc2l6ZS1zdGFydCtfX29mZnNldCA6IHNpemUpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgIHBbaV0gPSBfX3B0cltzdGFydC1fX29mZnNldCtpXTsKKyAgICB9CisgICAgc29hcF9kZWFsbG9jKHNvYXAsIF9fcHRyKTsKKyAgfQorICBfX3B0ciA9IHA7CisgIF9fc2l6ZSA9IHNpemU7CisgIF9fb2Zmc2V0ID0gc3RhcnQ7Cit9CisKK2RvdWJsZSYgdmVjdG9yOjpvcGVyYXRvcltdKGludCBpKQoreyByZXR1cm4gX19wdHJbaS1fX29mZnNldF07Cit9CisKK2RvdWJsZSB2ZWN0b3I6Om9wZXJhdG9yKCkoaW50IGkpCit7IGlmIChpID49IF9fb2Zmc2V0ICYmIGkgPCBfX3NpemUrX19vZmZzZXQpCisgICAgcmV0dXJuIF9fcHRyW2ktX19vZmZzZXRdOworICByZXR1cm4gMC4wOworfQorCit2b2lkIHZlY3Rvcjo6cHJpbnQoKQoreyBpbnQgaTsKKyAgZm9yIChpID0gMTsgaSA8PSBlbmQoKTsgaSsrKQorICAgIHByaW50ZigiJWYgIiwgKCp0aGlzKShpKSk7CisgIHByaW50ZigiXG4iKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgaXZlY3RvcgorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2l2ZWN0b3I6Oml2ZWN0b3IoKQoreyBpdmVjdG9yKE5VTEwpOworfQorCitpdmVjdG9yOjppdmVjdG9yKHN0cnVjdCBzb2FwICplbnYpCit7IHNvYXAgPSBlbnY7CisgIF9fcHRyID0gMDsKKyAgX19zaXplID0gMDsKK30KKworaXZlY3Rvcjo6aXZlY3RvcihzdHJ1Y3Qgc29hcCAqZW52LCBpbnQgc2l6ZSkKK3sgc29hcCA9IGVudjsKKyAgX19zaXplID0gc2l6ZTsKKyAgX19vZmZzZXQgPSAxOworICBfX3B0ciA9IChpbnQqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemUqc2l6ZW9mKGludCkpOworICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICBfX3B0cltpXSA9IDA7Cit9CisKK2l2ZWN0b3I6Oml2ZWN0b3Ioc3RydWN0IHNvYXAgKmVudiwgaW50IHN0YXJ0LCBpbnQgZW5kKQoreyBzb2FwID0gZW52OworICBfX3NpemUgPSBlbmQtc3RhcnQrMTsKKyAgX19vZmZzZXQgPSBzdGFydDsKKyAgX19wdHIgPSAoaW50Kilzb2FwX21hbGxvYyhzb2FwLCBfX3NpemUqc2l6ZW9mKGludCkpOworICBmb3IgKGludCBpID0gMDsgaSA8IF9fc2l6ZTsgaSsrKQorICAgIF9fcHRyW2ldID0gMDsKK30KKworaXZlY3Rvcjo6fml2ZWN0b3IoKQorewkvLyBubyBkZWFsbG9jYXRpb246IGxldCBnU09BUCBoYW5kbGUgYWxsIGR5bmFtaWMgYWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uCit9CisKK2ludCBpdmVjdG9yOjpzdGFydCgpCit7IHJldHVybiBfX29mZnNldDsKK30KKworaW50IGl2ZWN0b3I6OmVuZCgpCit7IHJldHVybiBfX3NpemUrX19vZmZzZXQtMTsKK30KKworaW50IGl2ZWN0b3I6OnNpemUoKQoreyByZXR1cm4gX19zaXplOworfQorCit2b2lkIGl2ZWN0b3I6OnJlc2l6ZShpbnQgc2l6ZSkKK3sgcmVzaXplKDEsIHNpemUpOworfQorCit2b2lkIGl2ZWN0b3I6OnJlc2l6ZShpbnQgc3RhcnQsIGludCBlbmQpCit7IGludCAqcDsKKyAgaW50IG4sIHNpemUgPSBlbmQtc3RhcnQrMTsKKyAgaWYgKF9fb2Zmc2V0ID09IHN0YXJ0ICYmIF9fc2l6ZSA9PSBzaXplKQorICAgIHJldHVybjsgLy8gbm90aGluZyB0byBkbworICBwID0gKGludCopc29hcF9tYWxsb2Moc29hcCwgc2l6ZSpzaXplb2YoaW50KSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgIHBbaV0gPSAwOworICBpZiAoX19wdHIpCisgIHsgaWYgKHN0YXJ0IDwgX19vZmZzZXQpCisgICAgeyBuID0gKHNpemUtX19vZmZzZXQrc3RhcnQgPD0gX19zaXplID8gc2l6ZS1fX29mZnNldCtzdGFydCA6IF9fc2l6ZSk7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgcFtfX29mZnNldC1zdGFydCtpXSA9IF9fcHRyW2ldOworICAgIH0KKyAgICBlbHNlCisgICAgeyBuID0gKF9fc2l6ZS1zdGFydCtfX29mZnNldCA8PSBzaXplID8gX19zaXplLXN0YXJ0K19fb2Zmc2V0IDogc2l6ZSk7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgcFtpXSA9IF9fcHRyW3N0YXJ0LV9fb2Zmc2V0K2ldOworICAgIH0KKyAgICBzb2FwX2RlYWxsb2Moc29hcCwgX19wdHIpOworICB9CisgIF9fcHRyID0gcDsKKyAgX19zaXplID0gc2l6ZTsKKyAgX19vZmZzZXQgPSBzdGFydDsKK30KKworaW50JiBpdmVjdG9yOjpvcGVyYXRvcltdKGludCBpKQoreyByZXR1cm4gX19wdHJbaS1fX29mZnNldF07Cit9CisKK2ludCBpdmVjdG9yOjpvcGVyYXRvcigpKGludCBpKQoreyBpZiAoaSA+PSBfX29mZnNldCAmJiBpIDwgX19zaXplK19fb2Zmc2V0KQorICAgIHJldHVybiBfX3B0cltpLV9fb2Zmc2V0XTsKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgaXZlY3Rvcjo6cHJpbnQoKQoreyBpbnQgaTsKKyAgZm9yIChpID0gMTsgaSA8PSBlbmQoKTsgaSsrKQorICAgIHByaW50ZigiJTRkICIsICgqdGhpcykoaSkpOworICBwcmludGYoIlxuIik7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIG1hdHJpeAorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK21hdHJpeDo6bWF0cml4KCkKK3sgbWF0cml4KE5VTEwpOworfQorCittYXRyaXg6Om1hdHJpeChzdHJ1Y3Qgc29hcCAqZW52KQoreyBzb2FwID0gZW52OworICBfX3B0ciA9IDA7CisgIF9fc2l6ZSA9IDA7CisgIF9fb2Zmc2V0ID0gMDsKK30KKworbWF0cml4OjptYXRyaXgoc3RydWN0IHNvYXAgKmVudiwgaW50IHJvd3MpCit7IHNvYXAgPSBlbnY7CisgIF9fcHRyID0gc29hcF9uZXdfdmVjdG9yKHNvYXAsIHJvd3MpOworICBfX3NpemUgPSByb3dzOworICBfX29mZnNldCA9IDE7Cit9CisKK21hdHJpeDo6bWF0cml4KHN0cnVjdCBzb2FwICplbnYsIGludCByb3dzLCBpbnQgY29scykKK3sgc29hcCA9IGVudjsKKyAgX19zaXplID0gcm93czsKKyAgX19vZmZzZXQgPSAxOworICBfX3B0ciA9IHNvYXBfbmV3X3ZlY3Rvcihzb2FwLCBfX3NpemUpOworICBmb3IgKGludCBpID0gMDsgaSA8IF9fc2l6ZTsgaSsrKQorICAgIF9fcHRyW2ldLnJlc2l6ZShjb2xzKTsKK30KKworbWF0cml4OjptYXRyaXgoc3RydWN0IHNvYXAgKmVudiwgaW50IHJvd3N0YXJ0LCBpbnQgcm93ZW5kLCBpbnQgY29sc3RhcnQsIGludCBjb2xlbmQpCit7IHNvYXAgPSBlbnY7CisgIF9fc2l6ZSA9IHJvd2VuZC1yb3dzdGFydCsxOworICBfX29mZnNldCA9IHJvd3N0YXJ0OworICBfX3B0ciA9IHNvYXBfbmV3X3ZlY3Rvcihzb2FwLCBfX3NpemUpOworICBmb3IgKGludCBpID0gMDsgaSA8PSBfX3NpemUtX19vZmZzZXQ7IGkrKykKKyAgICBfX3B0cltpXS5yZXNpemUoY29sc3RhcnQsIGNvbGVuZCk7Cit9CisKK21hdHJpeDo6fm1hdHJpeCgpCit7IAkvLyBubyBkZWFsbG9jYXRpb246IGxldCBnU09BUCBoYW5kbGUgYWxsIGR5bmFtaWMgYWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uCit9CisKK2ludCBtYXRyaXg6OnN0YXJ0KCkKK3sgcmV0dXJuIF9fb2Zmc2V0OworfQorCitpbnQgbWF0cml4OjplbmQoKQoreyByZXR1cm4gX19zaXplK19fb2Zmc2V0LTE7Cit9CisKK2ludCBtYXRyaXg6OnNpemUoKQoreyByZXR1cm4gX19zaXplOworfQorCit2b2lkIG1hdHJpeDo6cmVzaXplKGludCByb3dzLCBpbnQgY29scykKK3sgcmVzaXplKDEsIHJvd3MsIDEsIGNvbHMpOworfQorCit2b2lkIG1hdHJpeDo6cmVzaXplKGludCByb3dzdGFydCwgaW50IHJvd2VuZCwgaW50IGNvbHN0YXJ0LCBpbnQgY29sZW5kKQoreyBpbnQgaTsKKyAgdmVjdG9yICpwOworICBpbnQgbiwgc2l6ZSA9IHJvd2VuZC1yb3dzdGFydCsxOworICBpZiAoX19vZmZzZXQgIT0gcm93c3RhcnQgfHwgX19zaXplICE9IHJvd2VuZC1yb3dzdGFydCsxKQorICB7IGlmIChfX3B0cikKKyAgICB7IHAgPSBzb2FwX25ld192ZWN0b3Ioc29hcCwgc2l6ZSk7CisgICAgICBpZiAocm93c3RhcnQgPCBfX29mZnNldCkKKyAgICAgIHsgZm9yIChpID0gMDsgaSA8IF9fb2Zmc2V0LXJvd3N0YXJ0OyBpKyspCisgICAgICAgICAgcFtpXS5yZXNpemUoY29sc3RhcnQsIGNvbGVuZCk7CisgICAgICAgIG4gPSAoc2l6ZS1fX29mZnNldCtyb3dzdGFydCA8PSBfX3NpemUgPyBzaXplLV9fb2Zmc2V0K3Jvd3N0YXJ0IDogX19zaXplKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgeyBfX3B0cltpXS5yZXNpemUoY29sc3RhcnQsIGNvbGVuZCk7CisgICAgICAgICAgcFtfX29mZnNldC1yb3dzdGFydCtpXSA9IF9fcHRyW2ldOworICAgICAgICB9CisJZm9yICg7IGkgPCBzaXplLV9fb2Zmc2V0K3Jvd3N0YXJ0OyBpKyspCisJICBwW2ldLnJlc2l6ZShjb2xzdGFydCwgY29sZW5kKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgbiA9IChfX3NpemUtcm93c3RhcnQrX19vZmZzZXQgPD0gc2l6ZSA/IF9fc2l6ZS1yb3dzdGFydCtfX29mZnNldCA6IHNpemUpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICB7IF9fcHRyW2ldLnJlc2l6ZShjb2xzdGFydCwgY29sZW5kKTsKKyAgICAgICAgICBwW2ldID0gX19wdHJbcm93c3RhcnQtX19vZmZzZXQraV07CisgICAgICAgIH0KKyAgICAgICAgZm9yICg7IGkgPCBzaXplOyBpKyspCisgICAgICAgICAgcFtpXS5yZXNpemUoY29sc3RhcnQsIGNvbGVuZCk7CisgICAgICB9CisgICAgICBfX3B0ciA9IHA7CisgICAgICBfX3NpemUgPSBzaXplOworICAgICAgX19vZmZzZXQgPSByb3dzdGFydDsKKyAgICB9CisgICAgZWxzZQorICAgIHsgX19zaXplID0gc2l6ZTsKKyAgICAgIF9fb2Zmc2V0ID0gcm93c3RhcnQ7CisgICAgICBfX3B0ciA9IHNvYXBfbmV3X3ZlY3Rvcihzb2FwLCBzaXplKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgIF9fcHRyW2ldLnJlc2l6ZShjb2xzdGFydCwgY29sZW5kKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICBfX3B0cltpXS5yZXNpemUoY29sc3RhcnQsIGNvbGVuZCk7Cit9CisKK3ZlY3RvciYgbWF0cml4OjpvcGVyYXRvcltdKGludCBpKQoreyByZXR1cm4gX19wdHJbaS1fX29mZnNldF07Cit9CisKK2RvdWJsZSBtYXRyaXg6Om9wZXJhdG9yKCkoaW50IGksIGludCBqKQoreyBpbnQgczsKKyAgaWYgKGkgPj0gX19vZmZzZXQgJiYgaSA8IF9fc2l6ZStfX29mZnNldCkKKyAgeyBzID0gX19wdHJbaS1fX29mZnNldF0uX19vZmZzZXQ7CisgICAgaWYgKGogPj0gcyAmJiBqIDwgX19wdHJbaS1fX29mZnNldF0uX19zaXplK3MpCisgICAgICByZXR1cm4gX19wdHJbaS1fX29mZnNldF0uX19wdHJbai1zXTsKKyAgfQorICByZXR1cm4gMC4wOworfQorCit2b2lkIG1hdHJpeDo6cHJpbnQoKQoreyBpbnQgaSwgajsKKyAgZm9yIChpID0gc3RhcnQoKTsgaSA8PSBlbmQoKTsgaSsrKQorICB7IGZvciAoaiA9IDE7IGogPCAoKnRoaXMpW2ldLnN0YXJ0KCk7IGorKykKKyAgICAgIHByaW50ZigiLS0tLS0tLS0gIik7CisgICAgZm9yICg7IGogPD0gKCp0aGlzKVtpXS5lbmQoKTsgaisrKQorICAgICAgcHJpbnRmKCIlZiAiLCAoKnRoaXMpKGksIGopKTsKKyAgICBwcmludGYoIlxuIik7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvbHUvbHVzZXJ2ZXIuY3BwIGIvc2FtcGxlcy9sdS9sdXNlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMzMDU2ZgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvbHUvbHVzZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsMjc3IEBACisjaW5jbHVkZSAic29hcEguaCIKKyNpbmNsdWRlIDxtYXRoLmg+CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIG1haW4KKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7IHN0cnVjdCBzb2FwICpzb2FwOworICBpbnQgbSwgczsKKyAgc29hcCA9IHNvYXBfbmV3KCk7CisgIGlmIChhcmdjIDwgMykKKyAgICBzb2FwX3NlcnZlKHNvYXApOyAvLyBydW4gYXMgQ0dJIGFwcGxpY2F0aW9uIG92ZXIgdGhlIFdlYgorICBlbHNlIC8vIHJ1biBhcyBzdGFuZC1hbG9uZSBzZXJ2ZXIgb24gbWFjaGluZSBnaXZlbiBieSBhcmd2WzFdIGxpc3RlbmluZyB0byBwb3J0IGFyZ3ZbMl0KKyAgeyBtID0gc29hcF9iaW5kKHNvYXAsIGFyZ3ZbMV0sIGF0b2koYXJndlsyXSksIDEwMCk7CisgICAgaWYgKG0gPCAwKQorICAgIHsgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOworICAgICAgZXhpdCgtMSk7CisgICAgfQorICAgIGZwcmludGYoc3RkZXJyLCAiU29ja2V0IGNvbm5lY3Rpb24gc3VjY2Vzc2Z1bDogbWFzdGVyIHNvY2tldCA9ICVkXG4iLCBtKTsKKyAgICBmb3IgKGludCBpID0gMTsgOyBpKyspCisgICAgeyBzID0gc29hcF9hY2NlcHQoc29hcCk7CisgICAgICBpZiAocyA8IDApCisgICAgICB7IHNvYXBfcHJpbnRfZmF1bHQoc29hcCwgc3RkZXJyKTsKKyAgICAgICAgZXhpdCgtMSk7CisgICAgICB9CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVkOiBhY2NlcHRlZCBjb25uZWN0aW9uIGZyb20gSVAgPSAlZC4lZC4lZC4lZCBzb2NrZXQgPSAlZCAuLi4gIiwgaSwgKGludCkoc29hcC0+aXA+PjI0KSYweEZGLCAoaW50KShzb2FwLT5pcD4+MTYpJjB4RkYsIChpbnQpKHNvYXAtPmlwPj44KSYweEZGLCAoaW50KXNvYXAtPmlwJjB4RkYsIHMpOworICAgICAgc29hcF9zZXJ2ZShzb2FwKTsJCS8vIHByb2Nlc3MgcmVxdWVzdAorICAgICAgZnByaW50ZihzdGRlcnIsICJyZXF1ZXN0IHNlcnZlZFxuIik7CisgICAgICBzb2FwX2Rlc3Ryb3koc29hcCk7CS8vIGRlbGV0ZSBjbGFzcyBpbnN0YW5jZXMKKyAgICAgIHNvYXBfZW5kKHNvYXApOwkJLy8gY2xlYW4gdXAgZXZlcnl0aGluZyBhbmQgY2xvc2Ugc29ja2V0CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBMVSBkZWNvbXBvc2l0aW9uOiByZW1vdGUgbWV0aG9kIGludGVyZmFjZQorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2ludCBsdWRjbXAoc3RydWN0IHNvYXAqLCBtYXRyaXgmLCBpdmVjdG9yJiwgZG91YmxlJik7CisKK2ludCBuczFfX2x1ZGNtcChzdHJ1Y3Qgc29hcCAqc29hcCwgbWF0cml4ICphLCBzdHJ1Y3QgbnMxX19sdWRjbXBSZXNwb25zZSAmcmVzdWx0KQoreyByZXN1bHQuYSA9IGE7CisgIHJlc3VsdC5pID0gc29hcF9uZXdfaXZlY3Rvcihzb2FwLCAtMSk7CisgIGlmIChsdWRjbXAoc29hcCwgKnJlc3VsdC5hLCAqcmVzdWx0LmksIHJlc3VsdC5kKSkKKyAgICByZXR1cm4gc29hcF9zZW5kZXJfZmF1bHQoc29hcCwgIlNpbmd1bGFyIG1hdHJpeCBpbiByb3V0aW5lIGx1ZGNtcCIsIE5VTEwpOworICByZXR1cm4gU09BUF9PSzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgTFUgZGVjb21wb3NpdGlvbjogYWxnb3JpdGhtCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworaW50IGx1ZGNtcChzdHJ1Y3Qgc29hcCAqc29hcCwgbWF0cml4ICZhLCBpdmVjdG9yICZpbmR4LCBkb3VibGUgJmQpCit7IGludCBpLCBpbWF4ID0gMCwgaiwgaywgbjsKKyAgZG91YmxlIGJpZywgZHVtLCBzdW0sIHRlbXA7CisgIG4gPSBhLnNpemUoKTsKKyAgdmVjdG9yIHZ2KHNvYXApOworICB2di5yZXNpemUobik7CisgIGluZHgucmVzaXplKG4pOworICBkID0gMS4wOworICBmb3IgKGkgPSAxOyBpIDw9IG47IGkrKykKKyAgeyBiaWcgPSAwLjA7CisgICAgYVtpXS5yZXNpemUobik7CisgICAgZm9yIChqID0gMTsgaiA8PSBuOyBqKyspCisgICAgICBpZiAoKHRlbXAgPSBmYWJzKGFbaV1bal0pKSA+IGJpZykKKyAgICAgICAgYmlnID0gdGVtcDsKKyAgICBpZiAoYmlnID09IDAuMCkKKyAgICAgIHJldHVybiAtMTsKKyAgICB2dltpXSA9IDEuMC9iaWc7CisgIH0KKyAgZm9yIChqID0gMTsgaiA8PSBuOyBqKyspCisgIHsgZm9yIChpID0gMTsgaSA8IGo7IGkrKykKKyAgICB7IHN1bSA9IGFbaV1bal07CisgICAgICBmb3IgKGsgPSAxOyBrIDwgaTsgaysrKQorICAgICAgICBzdW0gLT0gYVtpXVtrXSphW2tdW2pdOworICAgICAgYVtpXVtqXSA9IHN1bTsKKyAgICB9CisgICAgYmlnID0gMC4wOworICAgIGZvciAoaSA9IGo7IGkgPD0gbjsgaSsrKQorICAgIHsgc3VtID0gYVtpXVtqXTsKKyAgICAgIGZvciAoayA9IDE7IGsgPCBqOyBrKyspCisgICAgICAgIHN1bSAtPSBhW2ldW2tdKmFba11bal07CisgICAgICBhW2ldW2pdID0gc3VtOworICAgICAgaWYgKChkdW0gPSB2dltpXSpmYWJzKHN1bSkpID49IGJpZykKKyAgICAgIHsgYmlnID0gZHVtOworICAgICAgICBpbWF4ID0gaTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGogIT0gaW1heCkKKyAgICB7IGZvciAoayA9IDE7IGsgPD0gbjsgaysrKQorICAgICAgeyBkdW0gPSBhW2ltYXhdW2tdOworICAgICAgICBhW2ltYXhdW2tdID0gYVtqXVtrXTsKKyAgICAgICAgYVtqXVtrXSA9IGR1bTsKKyAgICAgIH0KKyAgICAgIGQgPSAtZDsKKyAgICAgIHZ2W2ltYXhdID0gdnZbal07CisgICAgfQorICAgIGluZHhbal0gPSBpbWF4OworICAgIGlmIChhW2pdW2pdID09IDAuMCkKKyAgICAgIGFbal1bal0gPSAxLjBlLTIwOworICAgIGlmIChqICE9IG4pCisgICAgeyBkdW0gPSAxLjAvYVtqXVtqXTsKKyAgICAgIGZvciAoaSA9IGorMTsgaSA8PSBuOyBpKyspCisgICAgICAgIGFbaV1bal0gKj0gZHVtOworICAgIH0KKyAgfQorICBmb3IgKGkgPSAxOyBpIDw9IG47IGkrKykKKyAgeyBmb3IgKGogPSAxOyBqIDw9IG47IGorKykKKyAgICAgIGlmIChmYWJzKGFbaV1bal0pID4gMS4wZS0xNSkKKyAgICAgICAgYnJlYWs7CisgICAgZm9yIChrID0gbjsgayA+IGo7IGstLSkKKyAgICAgIGlmIChmYWJzKGFbaV1ba10pID4gMS4wZS0xNSkKKyAgICAgICAgYnJlYWs7CisgICAgYVtpXS5yZXNpemUoaiwgayk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIEZvcndhcmQtIGFuZCBiYWNrc3Vic3RpdHV0aW9uOiByZW1vdGUgbWV0aG9kIGludGVyZmFjZQorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2ludCBsdWJrc2IobWF0cml4JiwgaXZlY3RvciYsIHZlY3RvciAmYik7CisKK2ludCBuczFfX2x1YmtzYihzdHJ1Y3Qgc29hcCAqc29hcCwgbWF0cml4ICphLCBpdmVjdG9yICppLCB2ZWN0b3IgKmIsIHZlY3RvciAqeCkKK3sgbHVia3NiKCphLCAqaSwgKmIpOworICAqeCA9ICpiOworICByZXR1cm4gU09BUF9PSzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgRm9yd2FyZC0gYW5kIGJhY2tzdWJzdGl0dXRpb246IGFsZ29yaXRobQorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2ludCBsdWJrc2IobWF0cml4ICZhLCBpdmVjdG9yICZpbmR4LCB2ZWN0b3IgJmIpCit7IGludCBpLCBqLCBrLCBpcCwgbiwgbSwgaWkgPSAwOworICBkb3VibGUgc3VtOworICBuID0gYS5zaXplKCk7CisgIGIucmVzaXplKG4pOworICBmb3IgKGkgPSAxOyBpIDw9IG47IGkrKykKKyAgeyBpcCA9IGluZHhbaV07CisgICAgc3VtID0gYltpcF07CisgICAgYltpcF0gPSBiW2ldOworICAgIGlmIChpaSkKKyAgICB7IGsgPSBhW2ldLnN0YXJ0KCk7CisgICAgICBpZiAoaWkgPiBrKQorICAgICAgICBrID0gaWk7CisgICAgICBtID0gYVtpXS5lbmQoKTsKKyAgICAgIGlmIChpLTEgPCBtKQorICAgICAgICBtID0gaS0xOworICAgICAgZm9yIChqID0gazsgaiA8PSBtOyBqKyspCisgICAgICAgIHN1bSAtPSBhW2ldW2pdKmJbal07CisgICAgfQorICAgIGVsc2UgaWYgKHN1bSkKKyAgICAgIGlpID0gaTsKKyAgICBiW2ldID0gc3VtOworICB9CisgIGZvciAoaSA9IG47IGkgPj0gMTsgaS0tKQorICB7IHN1bSA9IGJbaV07CisgICAgayA9IGFbaV0uc3RhcnQoKTsKKyAgICBpZiAoaSsxID4gaykKKyAgICAgIGsgPSBpKzE7CisgICAgbSA9IGFbaV0uZW5kKCk7CisgICAgaWYgKG4gPCBtKQorICAgICAgbSA9IG47CisgICAgZm9yIChqID0gazsgaiA8PSBtOyBqKyspCisgICAgICBzdW0gLT0gYVtpXVtqXSpiW2pdOworICAgIGJbaV0gPSBzdW0vYVtpXVtpXTsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgTFUgc29sdmU6IHJlbW90ZSBtZXRob2QgaW50ZXJmYWNlCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworaW50IG5zMV9fbHVzb2woc3RydWN0IHNvYXAgKnNvYXAsIG1hdHJpeCAqYSwgdmVjdG9yICpiLCB2ZWN0b3IgKngpCit7IGl2ZWN0b3IgaW5keChzb2FwKTsKKyAgZG91YmxlIGQ7CisgIGlmIChsdWRjbXAoc29hcCwgKmEsIGluZHgsIGQpKQorICAgIHJldHVybiBzb2FwX3NlbmRlcl9mYXVsdChzb2FwLCAiU2luZ3VsYXIgbWF0cml4IGluIHJvdXRpbmUgbHVkY21wIiwgTlVMTCk7CisgIGx1YmtzYigqYSwgaW5keCwgKmIpOworICAqeCA9ICpiOworICByZXR1cm4gU09BUF9PSzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgTFUgc29sdmUgbXVsdGlwbGU6IHJlbW90ZSBtZXRob2QgaW50ZXJmYWNlCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworaW50IG5zMV9fbHVzb2xzKHN0cnVjdCBzb2FwICpzb2FwLCBtYXRyaXggKmEsIG1hdHJpeCAqYiwgbWF0cml4ICp4KQoreyBpdmVjdG9yIGluZHgoc29hcCk7CisgIGRvdWJsZSBkOworICBpZiAobHVkY21wKHNvYXAsICphLCBpbmR4LCBkKSkKKyAgICByZXR1cm4gc29hcF9zZW5kZXJfZmF1bHQoc29hcCwgIlNpbmd1bGFyIG1hdHJpeCBpbiByb3V0aW5lIGx1ZGNtcCIsIE5VTEwpOworICBmb3IgKGludCBpID0gMTsgaSA8PSBiLT5zaXplKCk7IGkrKykKKyAgICBsdWJrc2IoKmEsIGluZHgsICgqYilbaV0pOworICAqeCA9ICpiOworICByZXR1cm4gU09BUF9PSzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgTFUgaW52ZXJzZTogcmVtb3RlIG1ldGhvZCBpbnRlcmZhY2UKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitpbnQgbnMxX19sdWludihzdHJ1Y3Qgc29hcCAqc29hcCwgbWF0cml4ICphLCBtYXRyaXggKmIpCit7IHZlY3RvciBjb2woc29hcCk7CisgIGl2ZWN0b3IgaW5keChzb2FwKTsKKyAgZG91YmxlIGQ7CisgIGludCBpLCBqLCBrLCBuOworICBpZiAobHVkY21wKHNvYXAsICphLCBpbmR4LCBkKSkKKyAgICByZXR1cm4gc29hcF9zZW5kZXJfZmF1bHQoc29hcCwgIlNpbmd1bGFyIG1hdHJpeCBpbiByb3V0aW5lIGx1ZGNtcCIsIE5VTEwpOworICBuID0gYS0+c2l6ZSgpOworICBjb2wucmVzaXplKG4pOworICBiLT5yZXNpemUobiwgbik7CisgIGZvciAoaiA9IDE7IGogPD0gbjsgaisrKQorICB7IGZvciAoaSA9IDE7IGkgPD0gbjsgaSsrKQorICAgICAgY29sW2ldID0gMC4wOworICAgIGNvbFtqXSA9IDEuMDsKKyAgICBsdWJrc2IoKmEsIGluZHgsIGNvbCk7CisgICAgZm9yIChpID0gMTsgaSA8PSBuOyBpKyspCisgICAgICAoKmIpW2ldW2pdID0gY29sW2ldOworICB9CisgIGZvciAoaSA9IDE7IGkgPD0gbjsgaSsrKQorICB7IGZvciAoaiA9IDE7IGogPD0gbjsgaisrKQorICAgICAgaWYgKGZhYnMoKCpiKVtpXVtqXSkgPiAxLjBlLTE1KQorICAgICAgICBicmVhazsKKyAgICBmb3IgKGsgPSBuOyBrID4gajsgay0tKQorICAgICAgaWYgKGZhYnMoKCpiKVtpXVtrXSkgPiAxLjBlLTE1KQorICAgICAgICBicmVhazsKKyAgICAoKmIpW2ldLnJlc2l6ZShqLCBrKTsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgTFUgZGV0ZXJtaW5hbnQ6IHJlbW90ZSBtZXRob2QgaW50ZXJmYWNlCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworaW50IG5zMV9fbHVkZXQoc3RydWN0IHNvYXAgKnNvYXAsIG1hdHJpeCAqYSwgZG91YmxlICZkKQoreyBpdmVjdG9yIGluZHgoc29hcCk7CisgIGlmIChsdWRjbXAoc29hcCwgKmEsIGluZHgsIGQpKQorICAgIHJldHVybiBzb2FwX3NlbmRlcl9mYXVsdChzb2FwLCAiU2luZ3VsYXIgbWF0cml4IGluIHJvdXRpbmUgbHVkY21wIiwgTlVMTCk7CisgIGZvciAoaW50IGkgPSAxOyBpIDw9IGEtPl9fc2l6ZTsgaSsrKQorICAgIGQgKj0gKCphKVtpXVtpXTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK3N0cnVjdCBOYW1lc3BhY2UgbmFtZXNwYWNlc1tdID0KK3svLyAibnMtcHJlZml4IiwgIm5zLW5hbWUiLCAibnMtcGF0dGVybiIKKyAgeyJTT0FQLUVOViIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyJ9LAorICB7IlNPQVAtRU5DIiwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIn0sCisgIHsieHNpIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgImh0dHA6Ly93d3d3LnczLm9yZy8qL1hNTFNjaGVtYS1pbnN0YW5jZSJ9LAorICB7InhzZCIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsICJodHRwOi8vd3d3LnczLm9yZy8qL1hNTFNjaGVtYSJ9LAorICB7Im5zMSIsICJ1cm46bHUifSwKKyAge05VTEwsIE5VTEx9Cit9OwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9tYWdpYy9NYWtlZmlsZSBiL3NhbXBsZXMvbWFnaWMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVjNDNkMwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvbWFnaWMvTWFrZWZpbGUKQEAgLTAsMCArMSwyNiBAQAorR1NPQVA9Li4vLi4vc29hcGNwcDIKK1NPQVBIPS4uLy4uL3N0ZHNvYXAyLmgKK1NPQVBDPS4uLy4uL3N0ZHNvYXAyLmMKK1NPQVBDUFA9Li4vLi4vc3Rkc29hcDIuY3BwCitDQz1nY2MKK0NQUD1nKysKK0xJQlM9CitDT0ZMQUdTPS1PMgorQ1dGTEFHUz0tV2FsbAorQ0lGTEFHUz0tSS4uLy4uCitDTUZMQUdTPQorQ0ZMQUdTPSAkKENXRkxBR1MpICQoQ09GTEFHUykgJChDSUZMQUdTKSAkKENNRkxBR1MpCithbGw6CQltYWdpYyBtYWdpY3NlcnZlciBtdG1hZ2ljc2VydmVyCittYWdpYzoJCW1hZ2ljLmggbWFnaWMuY3BwICQoU09BUEgpICQoU09BUENQUCkKKwkJJChHU09BUCkgbWFnaWMuaAorCQkkKENQUCkgJChDRkxBR1MpIC1vIG1hZ2ljIG1hZ2ljLmNwcCBzb2FwQy5jcHAgc29hcENsaWVudC5jcHAgJChTT0FQQ1BQKSAkKExJQlMpCittYWdpY3NlcnZlcjoJbWFnaWMuaCBtYWdpY3NlcnZlci5jcHAgJChTT0FQSCkgJChTT0FQQ1BQKQorCQkkKEdTT0FQKSBtYWdpYy5oCisJCSQoQ1BQKSAkKENGTEFHUykgLW8gbWFnaWNzZXJ2ZXIgbWFnaWNzZXJ2ZXIuY3BwIHNvYXBDLmNwcCBzb2FwU2VydmVyLmNwcCAkKFNPQVBDUFApICQoTElCUykKK210bWFnaWNzZXJ2ZXI6CW1hZ2ljLmggbXRtYWdpY3NlcnZlci5jcHAgJChTT0FQSCkgJChTT0FQQ1BQKQorCQkkKEdTT0FQKSBtYWdpYy5oCisJCSQoQ1BQKSAkKENGTEFHUykgLW8gbXRtYWdpY3NlcnZlciBtdG1hZ2ljc2VydmVyLmNwcCBzb2FwQy5jcHAgc29hcFNlcnZlci5jcHAgJChTT0FQQ1BQKSAtbHB0aHJlYWQgJChMSUJTKQorY2xlYW46CisJCXJtIC1mICoubyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5LmgKK2Rpc3RjbGVhbjoKKwkJcm0gLWYgKi5vICoud3NkbCAqLnhzZCAqLnhtbCAqLm5zbWFwICoubG9nIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaCBtYWdpYyBtYWdpY3NlcnZlciBtdG1hZ2ljc2VydmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL21hZ2ljL01ha2VmaWxlU29sYXJpcyBiL3NhbXBsZXMvbWFnaWMvTWFrZWZpbGVTb2xhcmlzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhN2EzMDcKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL21hZ2ljL01ha2VmaWxlU29sYXJpcwpAQCAtMCwwICsxLDI2IEBACitHU09BUD0uLi8uLi9zb2FwY3BwMgorU09BUEg9Li4vLi4vc3Rkc29hcDIuaAorU09BUEM9Li4vLi4vc3Rkc29hcDIuYworU09BUENQUD0uLi8uLi9zdGRzb2FwMi5jcHAKK0NDPWdjYworQ1BQPWcrKworTElCUz0tbHhuZXQgLWxuc2wgLWxzb2NrZXQKK0NPRkxBR1M9LU8yCitDV0ZMQUdTPS1XYWxsCitDSUZMQUdTPS1JLi4vLi4KK0NNRkxBR1M9CitDRkxBR1M9ICQoQ1dGTEFHUykgJChDT0ZMQUdTKSAkKENJRkxBR1MpICQoQ01GTEFHUykKK2FsbDoJCW1hZ2ljIG1hZ2ljc2VydmVyIG10bWFnaWNzZXJ2ZXIKK21hZ2ljOgkJbWFnaWMuaCBtYWdpYy5jcHAgJChTT0FQSCkgJChTT0FQQ1BQKQorCQkkKEdTT0FQKSBtYWdpYy5oCisJCSQoQ1BQKSAkKENGTEFHUykgLW8gbWFnaWMgbWFnaWMuY3BwIHNvYXBDLmNwcCBzb2FwQ2xpZW50LmNwcCAkKFNPQVBDUFApICQoTElCUykKK21hZ2ljc2VydmVyOgltYWdpYy5oIG1hZ2ljc2VydmVyLmNwcCAkKFNPQVBIKSAkKFNPQVBDUFApCisJCSQoR1NPQVApIG1hZ2ljLmgKKwkJJChDUFApICQoQ0ZMQUdTKSAtbyBtYWdpY3NlcnZlciBtYWdpY3NlcnZlci5jcHAgc29hcEMuY3BwIHNvYXBTZXJ2ZXIuY3BwICQoU09BUENQUCkgJChMSUJTKQorbXRtYWdpY3NlcnZlcjoJbWFnaWMuaCBtdG1hZ2ljc2VydmVyLmNwcCAkKFNPQVBIKSAkKFNPQVBDUFApCisJCSQoR1NPQVApIG1hZ2ljLmgKKwkJJChDUFApICQoQ0ZMQUdTKSAtbyBtdG1hZ2ljc2VydmVyIG10bWFnaWNzZXJ2ZXIuY3BwIHNvYXBDLmNwcCBzb2FwU2VydmVyLmNwcCAkKFNPQVBDUFApIC1scHRocmVhZCAkKExJQlMpCitjbGVhbjoKKwkJcm0gLWYgKi5vIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaAorZGlzdGNsZWFuOgorCQlybSAtZiAqLm8gKi53c2RsICoueHNkICoueG1sICoubnNtYXAgKi5sb2cgc29hcEguaCBzb2FwU3R1Yi5oIHNvYXBDLmNwcCBzb2FwQy5jIHNvYXBDbGllbnQuY3BwIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmNwcCBzb2FwU2VydmVyLmMgc29hcCpQcm94eS5oIG1hZ2ljIG1hZ2ljc2VydmVyIG10bWFnaWNzZXJ2ZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvbWFnaWMvbWFnaWMuY3BwIGIvc2FtcGxlcy9tYWdpYy9tYWdpYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ4MTA3YgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvbWFnaWMvbWFnaWMuY3BwCkBAIC0wLDAgKzEsMTQzIEBACisjaW5jbHVkZSAic29hcEguaCIKKyNpbmNsdWRlICJtYWdpYy5uc21hcCIKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwlNYWdpYyBTcXVhcmVzIENsaWVudAorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIFRvIGFjY2VzcyBhIHN0YW5kLWFsb25lIHNlcnZlciBvbiBhIHBvcnQ6IG1hZ2ljc2VydmVyW10gPSAiSVA6UE9SVCI7CisvLyB1c2UgImh0dHA6Ly8iIHRvIGluY2x1ZGUgSFRUUCBoZWFkZXIsIGUuZzogbWFnaWNzZXJ2ZXJbXSA9ICJodHRwOi8vSVA6UE9SVCI7Citjb25zdCBjaGFyIG1hZ2ljc2VydmVyW10gPSAiaHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL21hZ2ljc2VydmVyLmNnaSI7CisvLyBUbyBzZW5kIHJlcXVlc3QgdG8gc3Rkb3V0IGFuZCByZWFkIHJlc3BvbnNlIGZyb20gc3RkaW4sIHVzZToKKy8vIGNvbnN0IGNoYXIgbWFnaWNzZXJ2ZXJbXSA9ICJodHRwOi8vIjsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreyBzdHJ1Y3Qgc29hcCBzb2FwOworICBpbnQgcjsKKyAgc29hcF9pbml0KCZzb2FwKTsKKyAgbWF0cml4ICpBID0gc29hcF9uZXdfbWF0cml4KCZzb2FwLCAtMSk7CisgIGlmIChhcmdjIDw9IDEpCisgIHsgY2hhciAqcyA9IGdldGVudigiUVVFUllfU1RSSU5HIik7CisgICAgaWYgKCFzIHx8IChyID0gYXRvaShzKSkgPT0gMCkKKyAgICAgIHIgPSByYW5kKCklMjA7CisgIH0KKyAgZWxzZQorICAgIHIgPSBhdG9pKGFyZ3ZbMV0pOworICBwcmludGYoIkNvbnRlbnQtdHlwZTogdGV4dC9odG1sXHJcblxyXG48aHRtbD48aDE+TWFnaWMgU3F1YXJlIG9mIFJhbmsgJWQ8L2gxPjxwcmU+XG4iLCByKTsKKyAgaWYgKHNvYXBfY2FsbF9uczFfX21hZ2ljKCZzb2FwLCBtYWdpY3NlcnZlciwgTlVMTCwgciwgQSkpCisgIHsgc29hcF9wcmludF9mYXVsdCgmc29hcCwgc3RkZXJyKTsKKyAgICBzb2FwX3ByaW50X2ZhdWx0X2xvY2F0aW9uKCZzb2FwLCBzdGRlcnIpOworICB9CisgIGVsc2UKKyAgeyBmb3IgKGludCBpID0gMDsgaSA8ICgqQSkuX19zaXplOyBpKyspCisgICAgeyBmb3IgKGludCBqID0gMDsgaiA8ICgqQSlbaV0uX19zaXplOyBqKyspCisgICAgICAgIHByaW50ZigiJTRkIiwgKCpBKVtpXVtqXSk7CisgICAgICBwcmludGYoIlxuIik7CisgICAgfQorICB9CisgIHByaW50ZigiPC9wcmU+PC9odG1sPlxuIik7CisgIHNvYXBfZGVzdHJveSgmc29hcCk7CisgIHNvYXBfZW5kKCZzb2FwKTsKKyAgc29hcF9kb25lKCZzb2FwKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JQ2xhc3MgdmVjdG9yIE1ldGhvZHMKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2ZWN0b3I6OnZlY3RvcigpCit7IF9fcHRyID0gMDsKKyAgX19zaXplID0gMDsKK30KKwordmVjdG9yOjp2ZWN0b3IoaW50IHNpemUpCit7IF9fcHRyID0gKGludCopc29hcF9tYWxsb2Moc29hcCwgc2l6ZSpzaXplb2YoaW50KSk7CisgIF9fc2l6ZSA9IHNpemU7Cit9CisKK3ZlY3Rvcjo6fnZlY3RvcigpCit7IHNvYXBfdW5saW5rKHNvYXAsIHRoaXMpOyAvLyBub3QgcmVxdWlyZWQsIGJ1dCBqdXN0IHRvIG1ha2Ugc3VyZSBpZiBzb21lb25lIGNhbGxzIGRlbGV0ZSBvbiB0aGlzCit9CisKK3ZvaWQgdmVjdG9yOjpyZXNpemUoaW50IHNpemUpCit7IGludCAqcDsKKyAgaWYgKF9fc2l6ZSA9PSBzaXplKQorICAgIHJldHVybjsKKyAgcCA9IChpbnQqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemUqc2l6ZW9mKGludCkpOworICBpZiAoX19wdHIpCisgIHsgZm9yIChpbnQgaSA9IDA7IGkgPCAoc2l6ZSA8PSBfX3NpemUgPyBzaXplIDogX19zaXplKTsgaSsrKQorICAgICAgcFtpXSA9IF9fcHRyW2ldOworICAgIHNvYXBfdW5saW5rKHNvYXAsIF9fcHRyKTsKKyAgICBmcmVlKF9fcHRyKTsKKyAgfQorICBfX3B0ciA9IHA7CisgIF9fc2l6ZSA9IHNpemU7Cit9CisKK2ludCYgdmVjdG9yOjpvcGVyYXRvcltdKGludCBpZHgpIGNvbnN0Cit7IGlmICghX19wdHIgfHwgaWR4IDwgMCB8fCBpZHggPj0gX19zaXplKQorICAgIGZwcmludGYoc3RkZXJyLCAiQXJyYXkgaW5kZXggb3V0IG9mIGJvdW5kc1xuIik7CisgIHJldHVybiBfX3B0cltpZHhdOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCUNsYXNzIG1hdHJpeCBNZXRob2RzCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworbWF0cml4OjptYXRyaXgoKQoreyBfX3B0ciA9IDA7CisgIF9fc2l6ZSA9IDA7Cit9CisKK21hdHJpeDo6fm1hdHJpeCgpCit7IHNvYXBfdW5saW5rKHNvYXAsIHRoaXMpOyAvLyBub3QgcmVxdWlyZWQsIGJ1dCBqdXN0IHRvIG1ha2Ugc3VyZSBpZiBzb21lb25lIGNhbGxzIGRlbGV0ZSBvbiB0aGlzCit9CisKK21hdHJpeDo6bWF0cml4KGludCByb3dzLCBpbnQgY29scykKK3sgCisgIF9fcHRyID0gc29hcF9uZXdfdmVjdG9yKHNvYXAsIHJvd3MpOworICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHM7IGkrKykKKyAgICBfX3B0cltpXS5yZXNpemUoY29scyk7CisgIF9fc2l6ZSA9IHJvd3M7Cit9CisKK3ZvaWQgbWF0cml4OjpyZXNpemUoaW50IHJvd3MsIGludCBjb2xzKQoreyBpbnQgaTsKKyAgdmVjdG9yICpwOworICBpZiAoX19zaXplICE9IHJvd3MpCisgIHsgaWYgKF9fcHRyKQorICAgIHsgcCA9IHNvYXBfbmV3X3ZlY3Rvcihzb2FwLCByb3dzKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAocm93cyA8PSBfX3NpemUgPyByb3dzIDogX19zaXplKTsgaSsrKQorICAgICAgeyBpZiAodGhpc1tpXS5fX3NpemUgIT0gY29scykKKyAgICAgICAgICAoKnRoaXMpW2ldLnJlc2l6ZShjb2xzKTsKKwkocCtpKS0+X19wdHIgPSBfX3B0cltpXS5fX3B0cjsKKwkocCtpKS0+X19zaXplID0gY29sczsKKyAgICAgIH0KKyAgICAgIGZvciAoOyBpIDwgcm93czsgaSsrKQorICAgICAgICBfX3B0cltpXS5yZXNpemUoY29scyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IAorICAgICAgX19wdHIgPSBzb2FwX25ld192ZWN0b3Ioc29hcCwgcm93cyk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93czsgaSsrKQorICAgICAgICBfX3B0cltpXS5yZXNpemUoY29scyk7CisgICAgICBfX3NpemUgPSByb3dzOworICAgIH0KKyAgfQorICBlbHNlCisgICAgZm9yIChpID0gMDsgaSA8IF9fc2l6ZTsgaSsrKQorICAgICAgX19wdHJbaV0ucmVzaXplKGNvbHMpOworfQorCit2ZWN0b3ImIG1hdHJpeDo6b3BlcmF0b3JbXShpbnQgaWR4KSBjb25zdAoreyBpZiAoIV9fcHRyIHx8IGlkeCA8IDAgfHwgaWR4ID49IF9fc2l6ZSkKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkFycmF5IGluZGV4IG91dCBvZiBib3VuZHNcbiIpOworICByZXR1cm4gX19wdHJbaWR4XTsKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvbWFnaWMvbWFnaWMuaCBiL3NhbXBsZXMvbWFnaWMvbWFnaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmE0NGZiCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9tYWdpYy9tYWdpYy5oCkBAIC0wLDAgKzEsMzYgQEAKKy8vZ3NvYXAgbnMxIHNlcnZpY2UgbmFtZToJbWFnaWMKKy8vZ3NvYXAgbnMxIHNlcnZpY2Ugc3R5bGU6CXJwYworLy9nc29hcCBuczEgc2VydmljZSBlbmNvZGluZzoJZW5jb2RlZAorLy9nc29hcCBuczEgc2VydmljZSBuYW1lc3BhY2U6CWh0dHA6Ly93ZWJzcnYuY3MuZnN1LmVkdS9+ZW5nZWxlbi9tYWdpYy53c2RsCisvL2dzb2FwIG5zMSBzZXJ2aWNlIGxvY2F0aW9uOglodHRwOi8vd2Vic3J2LmNzLmZzdS5lZHUvfmVuZ2VsZW4vbWFnaWNzZXJ2ZXIuY2dpCisvL2dzb2FwIG5zMSBzZXJ2aWNlIGRvY3VtZW50YXRpb246IERlbW8gTWFnaWMgU3F1YXJlcyBzZXJ2aWNlCisKKy8vZ3NvYXAgbnMxIHNjaGVtYSBuYW1lc3BhY2U6IHVybjpNYWdpY1NxdWFyZQorCit0eXBlZGVmIGludCB4c2RfX2ludDsKKworY2xhc3MgdmVjdG9yCit7IHB1YmxpYzoKKyAgeHNkX19pbnQgKl9fcHRyOworICBpbnQgX19zaXplOworICBzdHJ1Y3Qgc29hcCAqc29hcDsKKyAgdmVjdG9yKCk7CisgIHZlY3RvcihpbnQpOworICB2aXJ0dWFsIH52ZWN0b3IoKTsKKyAgdm9pZCByZXNpemUoaW50KTsKKyAgaW50JiBvcGVyYXRvcltdKGludCkgY29uc3Q7Cit9OworCitjbGFzcyBtYXRyaXgKK3sgcHVibGljOgorICB2ZWN0b3IgKl9fcHRyOworICBpbnQgX19zaXplOworICBzdHJ1Y3Qgc29hcCAqc29hcDsKKyAgbWF0cml4KCk7CisgIG1hdHJpeChpbnQsIGludCk7CisgIHZpcnR1YWwgfm1hdHJpeCgpOworICB2b2lkIHJlc2l6ZShpbnQsIGludCk7CisgIHZlY3RvciYgb3BlcmF0b3JbXShpbnQpIGNvbnN0OworfTsKKworaW50IG5zMV9fbWFnaWMoeHNkX19pbnQgcmFuaywgbWF0cml4ICpyZXN1bHQpOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9tYWdpYy9tYWdpY3NlcnZlci5jcHAgYi9zYW1wbGVzL21hZ2ljL21hZ2ljc2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWY4NDZkCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9tYWdpYy9tYWdpY3NlcnZlci5jcHAKQEAgLTAsMCArMSwxODkgQEAKKyNpbmNsdWRlICJzb2FwSC5oIgorI2luY2x1ZGUgIm1hZ2ljLm5zbWFwIgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCU1hZ2ljIFNxdWFyZXMgU2VydmVyCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gSW5zdGFsbCBhcyBhIENHSSBhcHBsaWNhdGlvbi4KKy8vIEFsdGVybmF0aXZlbHksIHJ1biBmcm9tIGNvbW1hbmQgbGluZSB3aXRoIGFyZ3VtZW50cyBJUCAod2hpY2ggbXVzdCBiZSB0aGUKKy8vIElQIG9mIHRoZSBjdXJyZW50IG1hY2hpbmUgeW91IGFyZSB1c2luZykgYW5kIFBPUlQgdG8gcnVuIHRoaXMgYXMgYQorLy8gc3RhbmQtYWxvbmUgc2VydmVyIG9uIGEgcG9ydC4gRm9yIGV4YW1wbGU6CisvLyA+IG1hZ2ljc2VydmVyLmNnaSAxODA4MSAmCisvLyBUbyBsZXQgJ21hZ2ljJyB0YWxrIHRvIHRoaXMgc2VydmljZSwgY2hhbmdlIHRoZSBVUkwgaW4gbWFnaWMuY3BwIGludG8KKy8vICJodHRwOi8vbG9jYWxob3N0OjE4MDgxIgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7IHN0cnVjdCBzb2FwIHNvYXA7CisgIGludCBtLCBzOworICBzb2FwX2luaXQoJnNvYXApOworICAvLyBzb2FwLmFjY2VwdF90aW1lb3V0ID0gNjA7IC8vIGRpZSBpZiBubyByZXF1ZXN0cyBhcmUgbWFkZSB3aXRoaW4gMSBtaW51dGUKKyAgaWYgKGFyZ2MgPCAyKQorICB7IHNvYXBfc2VydmUoJnNvYXApOworICAgIHNvYXBfZGVzdHJveSgmc29hcCk7CisgICAgc29hcF9lbmQoJnNvYXApOwkvLyBjbGVhbiB1cCAKKyAgfQorICBlbHNlCisgIHsgbSA9IHNvYXBfYmluZCgmc29hcCwgTlVMTCwgYXRvaShhcmd2WzFdKSwgMTAwKTsKKyAgICBpZiAobSA8IDApCisgICAgeyBzb2FwX3ByaW50X2ZhdWx0KCZzb2FwLCBzdGRlcnIpOworICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgZnByaW50ZihzdGRlcnIsICJTb2NrZXQgY29ubmVjdGlvbiBzdWNjZXNzZnVsICVkXG4iLCBtKTsKKyAgICBmb3IgKGludCBpID0gMTsgOyBpKyspCisgICAgeyBzID0gc29hcF9hY2NlcHQoJnNvYXApOworICAgICAgaWYgKHMgPCAwKQorICAgICAgeyBpZiAoc29hcC5lcnJudW0pCisgICAgICAgICAgc29hcF9wcmludF9mYXVsdCgmc29hcCwgc3RkZXJyKTsKKwllbHNlCisJICBmcHJpbnRmKHN0ZGVyciwgIlNlcnZlciB0aW1lZCBvdXRcbiIpOworCWJyZWFrOworICAgICAgfQorICAgICAgZnByaW50ZihzdGRlcnIsICIlZDogYWNjZXB0ZWQgJWQgSVA9JWQuJWQuJWQuJWQgLi4uICIsIGksIHMsIChpbnQpKHNvYXAuaXA+PjI0KSYweEZGLCAoaW50KShzb2FwLmlwPj4xNikmMHhGRiwgKGludCkoc29hcC5pcD4+OCkmMHhGRiwgKGludClzb2FwLmlwJjB4RkYpOworICAgICAgc29hcF9zZXJ2ZSgmc29hcCk7CS8vIHByb2Nlc3MgUlBDIHNrZWxldG9ucworICAgICAgZnByaW50ZihzdGRlcnIsICJzZXJ2ZWRcbiIpOworICAgICAgc29hcF9kZXN0cm95KCZzb2FwKTsKKyAgICAgIHNvYXBfZW5kKCZzb2FwKTsJLy8gY2xlYW4gdXAgCisgICAgfQorICB9CisgIHNvYXBfZG9uZSgmc29hcCk7CisgIHJldHVybiAwOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCU1hZ2ljIFNxdWFyZSBBbGdvcml0aG0KKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitpbnQgbnMxX19tYWdpYyhzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4sIG1hdHJpeCAqc3F1YXJlKQoreyBpbnQgaSwgaiwgaywgbCwga2V5ID0gMjsKKyAgaWYgKG4gPCAxKQorICAgIHJldHVybiBzb2FwX3NlbmRlcl9mYXVsdChzb2FwLCAiTmVnYXRpdmUgb3IgemVybyBzaXplIiwgIjxlcnJvciB4bWxucz1cImh0dHA6Ly90ZW1wdXJpLm9yZy9cIj5UaGUgaW5wdXQgcGFyYW1ldGVyIG11c3QgYmUgcG9zaXRpdmU8L2Vycm9yPiIpOworICBpZiAobiA+IDEwMCkKKyAgICByZXR1cm4gc29hcF9zZW5kZXJfZmF1bHQoc29hcCwgInNpemUgPiAxMDAiLCAiPGVycm9yIHhtbG5zPVwiaHR0cDovL3RlbXB1cmkub3JnL1wiPlRoZSBpbnB1dCBwYXJhbWV0ZXIgbXVzdCBub3QgYmUgdG9vIGxhcmdlPC9lcnJvcj4iKTsKKyAgc3F1YXJlLT5yZXNpemUobiwgbik7CisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgZm9yIChqID0gMDsgaiA8IG47IGorKykKKyAgICAgICgqc3F1YXJlKVtpXVtqXSA9IDA7CisgIGkgPSAwOworICBqID0gKG4tMSkvMjsKKyAgKCpzcXVhcmUpW2ldW2pdID0gMTsKKyAgd2hpbGUgKGtleSA8PSBuKm4pCisgIHsgaWYgKGktMSA8IDApCisgICAgICBrID0gbi0xOworICAgIGVsc2UKKyAgICAgIGsgPSBpLTE7CisgICAgaWYgKGotMSA8IDApCisgICAgICBsID0gbi0xOworICAgIGVsc2UKKyAgICAgIGwgPSBqLTE7CisgICAgaWYgKCgqc3F1YXJlKVtrXVtsXSkKKyAgICAgIGkgPSAoaSsxKSAlIG47CisgICAgZWxzZQorICAgIHsgaSA9IGs7CisgICAgICBqID0gbDsKKyAgICB9CisgICAgKCpzcXVhcmUpW2ldW2pdID0ga2V5OworICAgIGtleSsrOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCUNsYXNzIHZlY3RvciBNZXRob2RzCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordmVjdG9yOjp2ZWN0b3IoKQoreyBfX3B0ciA9IDA7CisgIF9fc2l6ZSA9IDA7Cit9CisKK3ZlY3Rvcjo6dmVjdG9yKGludCBuKQoreyBfX3B0ciA9IChpbnQqKXNvYXBfbWFsbG9jKHNvYXAsIG4qc2l6ZW9mKGludCkpOworICBfX3NpemUgPSBuOworfQorCit2ZWN0b3I6On52ZWN0b3IoKQoreyBzb2FwX3VubGluayhzb2FwLCB0aGlzKTsgLy8gbm90IHJlcXVpcmVkLCBidXQganVzdCB0byBtYWtlIHN1cmUgaWYgc29tZW9uZSBjYWxscyBkZWxldGUgb24gdGhpcworfQorCit2b2lkIHZlY3Rvcjo6cmVzaXplKGludCBuKQoreyBpbnQgKnA7CisgIGlmIChfX3NpemUgPT0gbikKKyAgICByZXR1cm47CisgIHAgPSAoaW50Kilzb2FwX21hbGxvYyhzb2FwLCBuKnNpemVvZihpbnQpKTsKKyAgaWYgKF9fcHRyKQorICB7IGZvciAoaW50IGkgPSAwOyBpIDwgKG4gPD0gX19zaXplID8gbiA6IF9fc2l6ZSk7IGkrKykKKyAgICAgIHBbaV0gPSBfX3B0cltpXTsKKyAgICBzb2FwX3VubGluayhzb2FwLCBfX3B0cik7CisgICAgZnJlZShfX3B0cik7CisgIH0KKyAgX19zaXplID0gbjsKKyAgX19wdHIgPSBwOworfQorCitpbnQmIHZlY3Rvcjo6b3BlcmF0b3JbXShpbnQgaSkgY29uc3QKK3sgaWYgKCFfX3B0ciB8fCBpIDwgMCB8fCBpID49IF9fc2l6ZSkKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkFycmF5IGluZGV4IG91dCBvZiBib3VuZHNcbiIpOworICByZXR1cm4gKF9fcHRyKVtpXTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwlDbGFzcyBtYXRyaXggTWV0aG9kcworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK21hdHJpeDo6bWF0cml4KCkKK3sgX19wdHIgPSAwOworICBfX3NpemUgPSAwOworfQorCittYXRyaXg6Om1hdHJpeChpbnQgcm93cywgaW50IGNvbHMpCit7IF9fcHRyID0gc29hcF9uZXdfdmVjdG9yKHNvYXAsIHJvd3MpOworICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHM7IGkrKykKKyAgICBfX3B0cltpXS5yZXNpemUoY29scyk7CisgIF9fc2l6ZSA9IHJvd3M7Cit9CisKK21hdHJpeDo6fm1hdHJpeCgpCit7IHNvYXBfdW5saW5rKHNvYXAsIHRoaXMpOyAvLyBub3QgcmVxdWlyZWQsIGJ1dCBqdXN0IHRvIG1ha2Ugc3VyZSBpZiBzb21lb25lIGNhbGxzIGRlbGV0ZSBvbiB0aGlzCit9CisKK3ZvaWQgbWF0cml4OjpyZXNpemUoaW50IHJvd3MsIGludCBjb2xzKQoreyBpbnQgaTsKKyAgdmVjdG9yICpwOworICBpZiAoX19zaXplICE9IHJvd3MpCisgIHsgaWYgKF9fcHRyKQorICAgIHsgcCA9IHNvYXBfbmV3X3ZlY3Rvcihzb2FwLCByb3dzKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAocm93cyA8PSBfX3NpemUgPyByb3dzIDogX19zaXplKTsgaSsrKQorICAgICAgeyBpZiAodGhpc1tpXS5fX3NpemUgIT0gY29scykKKyAgICAgICAgICAoKnRoaXMpW2ldLnJlc2l6ZShjb2xzKTsKKwkocCtpKS0+X19wdHIgPSBfX3B0cltpXS5fX3B0cjsKKwkocCtpKS0+X19zaXplID0gY29sczsKKyAgICAgIH0KKyAgICAgIGZvciAoOyBpIDwgcm93czsgaSsrKQorICAgICAgICBfX3B0cltpXS5yZXNpemUoY29scyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IF9fcHRyID0gc29hcF9uZXdfdmVjdG9yKHNvYXAsIHJvd3MpOworICAgICAgZm9yIChpID0gMDsgaSA8IHJvd3M7IGkrKykKKyAgICAgICAgX19wdHJbaV0ucmVzaXplKGNvbHMpOworICAgICAgX19zaXplID0gcm93czsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIGZvciAoaSA9IDA7IGkgPCBfX3NpemU7IGkrKykKKyAgICAgIF9fcHRyW2ldLnJlc2l6ZShjb2xzKTsKK30KKwordmVjdG9yJiBtYXRyaXg6Om9wZXJhdG9yW10oaW50IGkpIGNvbnN0Cit7IGlmICghX19wdHIgfHwgaSA8IDAgfHwgaSA+PSBfX3NpemUpCisgICAgZnByaW50ZihzdGRlcnIsICJBcnJheSBpbmRleCBvdXQgb2YgYm91bmRzXG4iKTsKKyAgcmV0dXJuIF9fcHRyW2ldOworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9tYWdpYy9tdG1hZ2ljc2VydmVyLmNwcCBiL3NhbXBsZXMvbWFnaWMvbXRtYWdpY3NlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q1NmUyNwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvbWFnaWMvbXRtYWdpY3NlcnZlci5jcHAKQEAgLTAsMCArMSwyMjAgQEAKKy8vCW10bWFnaWNzZXJ2ZXIuY3BwCisvLwlNdWx0aS10aHJlYWRlZCBtYWdpYyBzcXVhcmVzIHNlcnZlcgorLy8JUnVucyBhcyBDR0kgKG5vdCBtdWx0aS10aHJlYWRlZCkgb3IgbXVsdGktdGhyZWFkZWQgc3RhbmRhbG9uZQorLy8JQ29tcHV0YXRpb24gb2YgdGhlIG1hZ2ljIHNxdWFyZSBoYXMgYmVlbiBkZWxpYmVyYXRlbHkgc2xvd2VkIGRvd24gdG8KKy8vCWRlbW9uc3RyYXRlIHdvcmsgbG9hZCBpc3N1ZXMgKHNlZSBTTEVFUCBjb25zdGFudCkKKworLy8gUnVuIGZyb20gdGhlIGNvbW1hbmQgbGluZSB3aXRoIGFyZ3VtZW50cyBJUCAod2hpY2ggbXVzdCBiZSB0aGUKKy8vIElQIG9mIHRoZSBjdXJyZW50IG1hY2hpbmUgeW91IGFyZSB1c2luZykgYW5kIFBPUlQgdG8gcnVuIHRoaXMgYXMgYQorLy8gbXVsdGktdGhyZWFkZWQgc3RhbmQtYWxvbmUgc2VydmVyIG9uIGEgcG9ydC4gRm9yIGV4YW1wbGU6CisvLyA+IG10bWFnaWNzZXJ2ZXIuY2dpIDE4MDgxCisvLyBUbyBsZXQgJ21hZ2ljJyBjbGllbnQgdGFsayB0byB0aGlzIHNlcnZpY2UsIGNoYW5nZSB0aGUgVVJMIGluIGNvZGUgbWFnaWMuY3BwCisvLyBpbnRvICJsb2NhbGhvc3Q6MTgwODEiCisKKy8vIFRoaXMgZXhhbXBsZSBpbGx1c3RyYXRlcyB0d28gYWx0ZXJuYXRpdmUgc2VydmVyIGltcGxlbWVudGF0aW9ucyB3aXRoIHRocmVhZHMuCisvLyBUaGUgZmlyc3QgaW1wbGVtZW50YXRpb24gcmVjeWNsZXMgZ1NPQVAgcmVzb3VyY2VzIGJ1dCBpcyBib3VuZGVkIHRvIGEgbWF4aW11bQorLy8gbnVtYmVyIG9mIHRocmVhZHMuIEVhY2ggdGhyZWFkIG5lZWRzIHRvIGJlIGpvaW5lZCwgc28gcnVuYXdheSBwcm9jZXNzZXMgd2lsbAorLy8gaGFsdCB0aGUgc2VydmVyIGF0IHNvbWUgcG9pbnQuCisvLyBUaGUgc2Vjb25kIGltcGxlbWVudGF0aW9uIGhhcyBubyB0aHJlYWQgbGltaXRhdGlvbi4gUnVuYXdheSB0aHJlYWRzIGFyZSBub3QKKy8vIGNvbnRyb2xsZWQuCisKKyNpbmNsdWRlICJzb2FwSC5oIgorI2luY2x1ZGUgIm1hZ2ljLm5zbWFwIgorI2luY2x1ZGUgPHVuaXN0ZC5oPgkvLyBpbXBvcnQgc2xlZXAoKQorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworI2RlZmluZSBCQUNLTE9HICgxMDApCS8vIE1heC4gcmVxdWVzdCBiYWNrbG9nCisjZGVmaW5lIE1BWF9USFIgKDgpCS8vIE1heC4gdGhyZWFkcyB0byBzZXJ2ZSByZXF1ZXN0cworI2RlZmluZSBTTEVFUAkoMCkJLy8gdXNlIHRoaXMgdG8gbWFrZSBlYWNoIHRocmVhZCBzbGVlcCB0byBtaW1pYyB3b3JrIGxvYWQgbGF0ZW5jeQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCU11bHRpLVRocmVhZGVkIE1hZ2ljIFNxdWFyZXMgU2VydmVyCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCAqcHJvY2Vzc19yZXF1ZXN0KHZvaWQqKTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreyBzdHJ1Y3Qgc29hcCBzb2FwOworICBzb2FwX2luaXQoJnNvYXApOworICAvLyBzb2FwLmFjY2VwdF90aW1lb3V0ID0gNjA7IC8vIGRpZSBpZiBubyByZXF1ZXN0cyBhcmUgbWFkZSB3aXRoaW4gMSBtaW51dGUKKyAgaWYgKGFyZ2MgPCAyKQkJLy8gbm8gYXJnczogYXNzdW1lIHRoaXMgaXMgYSBDR0kgYXBwbGljYXRpb24KKyAgeyBzb2FwX3NlcnZlKCZzb2FwKTsJLy8gc2VydmUgcmVxdWVzdAorICAgIHNvYXBfZGVzdHJveSgmc29hcCk7Ly8gY2xlYW51cCBjbGFzcyBpbnN0YW5jZXMKKyAgICBzb2FwX2VuZCgmc29hcCk7CS8vIGNsZWFudXAKKyAgfQorICBlbHNlCisgIHsgcHRocmVhZF90IHRpZDsKKyAgICBpbnQgcG9ydDsKKyAgICBpbnQgbSwgcywgaTsKKyAgICBwb3J0ID0gYXRvaShhcmd2WzFdKTsKKyAgICBtID0gc29hcF9iaW5kKCZzb2FwLCBOVUxMLCBwb3J0LCBCQUNLTE9HKTsKKyAgICBpZiAobSA8IDApCisgICAgeyBzb2FwX3ByaW50X2ZhdWx0KCZzb2FwLCBzdGRlcnIpOworICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgZnByaW50ZihzdGRlcnIsICJTb2NrZXQgY29ubmVjdGlvbiBzdWNjZXNzZnVsICVkXG4iLCBtKTsKKyAgICBmb3IgKGkgPSAwOyA7IGkrKykKKyAgICB7IHMgPSBzb2FwX2FjY2VwdCgmc29hcCk7CisgICAgICBpZiAocyA8IDApCisgICAgICB7IGlmIChzb2FwLmVycm51bSkKKyAgICAgICAgICBzb2FwX3ByaW50X2ZhdWx0KCZzb2FwLCBzdGRlcnIpOworCWVsc2UKKwkgIGZwcmludGYoc3RkZXJyLCAiU2VydmVyIHRpbWVkIG91dFxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZnByaW50ZihzdGRlcnIsICJUaHJlYWQgJWQgYWNjZXB0cyBzb2NrZXQgJWQgY29ubmVjdGlvbiBmcm9tIElQICVkLiVkLiVkLiVkXG4iLCBpLCBzLCAoaW50KShzb2FwLmlwPj4yNCkmMHhGRiwgKGludCkoc29hcC5pcD4+MTYpJjB4RkYsIChpbnQpKHNvYXAuaXA+PjgpJjB4RkYsIChpbnQpc29hcC5pcCYweEZGKTsKKyAgICAgIHB0aHJlYWRfY3JlYXRlKCZ0aWQsIE5VTEwsICh2b2lkKigqKSh2b2lkKikpcHJvY2Vzc19yZXF1ZXN0LCAodm9pZCopc29hcF9jb3B5KCZzb2FwKSk7CisgICAgfQorICB9CisgIHNvYXBfZG9uZSgmc29hcCk7CisgIHJldHVybiAwOworfQorCit2b2lkICpwcm9jZXNzX3JlcXVlc3Qodm9pZCAqc29hcCkKK3sgcHRocmVhZF9kZXRhY2gocHRocmVhZF9zZWxmKCkpOworICBzb2FwX3NlcnZlKChzdHJ1Y3Qgc29hcCopc29hcCk7CisgIHNvYXBfZGVzdHJveSgoc3RydWN0IHNvYXAqKXNvYXApOworICBzb2FwX2VuZCgoc3RydWN0IHNvYXAqKXNvYXApOworICBzb2FwX2RvbmUoKHN0cnVjdCBzb2FwKilzb2FwKTsKKyAgZnJlZShzb2FwKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JTWFnaWMgU3F1YXJlIEFsZ29yaXRobQorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2ludCBuczFfX21hZ2ljKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbiwgbWF0cml4ICpzcXVhcmUpCit7IGludCBpLCBqLCBrLCBsLCBrZXkgPSAyOworICBpZiAobiA8IDEpCisgICAgcmV0dXJuIHNvYXBfc2VuZGVyX2ZhdWx0KHNvYXAsICJOZWdhdGl2ZSBvciB6ZXJvIHNpemUiLCAiPGVycm9yIHhtbG5zPVwiaHR0cDovL3RlbXB1cmkub3JnL1wiPlRoZSBpbnB1dCBwYXJhbWV0ZXIgbXVzdCBiZSBwb3NpdGl2ZTwvZXJyb3I+Iik7CisgIGlmIChuID4gMTAwKQorICAgIHJldHVybiBzb2FwX3NlbmRlcl9mYXVsdChzb2FwLCAic2l6ZSA+IDEwMCIsICI8ZXJyb3IgeG1sbnM9XCJodHRwOi8vdGVtcHVyaS5vcmcvXCI+VGhlIGlucHV0IHBhcmFtZXRlciBtdXN0IG5vdCBiZSB0b28gbGFyZ2U8L2Vycm9yPiIpOworICBzcXVhcmUtPnJlc2l6ZShuLCBuKTsKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICBmb3IgKGogPSAwOyBqIDwgbjsgaisrKQorICAgICAgKCpzcXVhcmUpW2ldW2pdID0gMDsKKyAgaSA9IDA7CisgIGogPSAobi0xKS8yOworICAoKnNxdWFyZSlbaV1bal0gPSAxOworICB3aGlsZSAoa2V5IDw9IG4qbikKKyAgeyBpZiAoaS0xIDwgMCkKKyAgICAgIGsgPSBuLTE7CisgICAgZWxzZQorICAgICAgayA9IGktMTsKKyAgICBpZiAoai0xIDwgMCkKKyAgICAgIGwgPSBuLTE7CisgICAgZWxzZQorICAgICAgbCA9IGotMTsKKyAgICBpZiAoKCpzcXVhcmUpW2tdW2xdKQorICAgICAgaSA9IChpKzEpICUgbjsKKyAgICBlbHNlCisgICAgeyBpID0gazsKKyAgICAgIGogPSBsOworICAgIH0KKyAgICAoKnNxdWFyZSlbaV1bal0gPSBrZXk7CisgICAga2V5Kys7CisgIH0KKyAgc2xlZXAoU0xFRVApOwkJLy8gbWltaWMgd29yayBsb2FkIGxhdGVuY3kKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JQ2xhc3MgdmVjdG9yIE1ldGhvZHMKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2ZWN0b3I6OnZlY3RvcigpCit7IF9fcHRyID0gMDsKKyAgX19zaXplID0gMDsKK30KKwordmVjdG9yOjp2ZWN0b3IoaW50IG4pCit7IF9fcHRyID0gKGludCopc29hcF9tYWxsb2Moc29hcCwgbipzaXplb2YoaW50KSk7CisgIF9fc2l6ZSA9IG47Cit9CisKK3ZlY3Rvcjo6fnZlY3RvcigpCit7IHNvYXBfdW5saW5rKHNvYXAsIHRoaXMpOyAvLyBub3QgcmVxdWlyZWQsIGJ1dCBqdXN0IHRvIG1ha2Ugc3VyZSBpZiBzb21lb25lIGNhbGxzIGRlbGV0ZSBvbiB0aGlzCit9CisKK3ZvaWQgdmVjdG9yOjpyZXNpemUoaW50IG4pCit7IGludCAqcDsKKyAgaWYgKF9fc2l6ZSA9PSBuKQorICAgIHJldHVybjsKKyAgcCA9IChpbnQqKXNvYXBfbWFsbG9jKHNvYXAsIG4qc2l6ZW9mKGludCkpOworICBpZiAoX19wdHIpCisgIHsgZm9yIChpbnQgaSA9IDA7IGkgPCAobiA8PSBfX3NpemUgPyBuIDogX19zaXplKTsgaSsrKQorICAgICAgcFtpXSA9IF9fcHRyW2ldOworICAgIHNvYXBfdW5saW5rKHNvYXAsIF9fcHRyKTsKKyAgICBmcmVlKF9fcHRyKTsKKyAgfQorICBfX3NpemUgPSBuOworICBfX3B0ciA9IHA7Cit9CisKK2ludCYgdmVjdG9yOjpvcGVyYXRvcltdKGludCBpKSBjb25zdAoreyBpZiAoIV9fcHRyIHx8IGkgPCAwIHx8IGkgPj0gX19zaXplKQorICAgIGZwcmludGYoc3RkZXJyLCAiQXJyYXkgaW5kZXggb3V0IG9mIGJvdW5kc1xuIik7CisgIHJldHVybiBfX3B0cltpXTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwlDbGFzcyBtYXRyaXggTWV0aG9kcworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK21hdHJpeDo6bWF0cml4KCkKK3sgX19wdHIgPSAwOworICBfX3NpemUgPSAwOworfQorCittYXRyaXg6Om1hdHJpeChpbnQgcm93cywgaW50IGNvbHMpCit7IF9fcHRyID0gc29hcF9uZXdfdmVjdG9yKHNvYXAsIHJvd3MpOworICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHM7IGkrKykKKyAgICBfX3B0cltpXS5yZXNpemUoY29scyk7CisgIF9fc2l6ZSA9IHJvd3M7Cit9CisKK21hdHJpeDo6fm1hdHJpeCgpCit7IHNvYXBfdW5saW5rKHNvYXAsIHRoaXMpOyAvLyBub3QgcmVxdWlyZWQsIGJ1dCBqdXN0IHRvIG1ha2Ugc3VyZSBpZiBzb21lb25lIGNhbGxzIGRlbGV0ZSBvbiB0aGlzCit9CisKK3ZvaWQgbWF0cml4OjpyZXNpemUoaW50IHJvd3MsIGludCBjb2xzKQoreyBpbnQgaTsKKyAgdmVjdG9yICpwOworICBpZiAoX19zaXplICE9IHJvd3MpCisgIHsgaWYgKF9fcHRyKQorICAgIHsgcCA9IHNvYXBfbmV3X3ZlY3Rvcihzb2FwLCByb3dzKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAocm93cyA8PSBfX3NpemUgPyByb3dzIDogX19zaXplKTsgaSsrKQorICAgICAgeyBpZiAodGhpc1tpXS5fX3NpemUgIT0gY29scykKKyAgICAgICAgICAoKnRoaXMpW2ldLnJlc2l6ZShjb2xzKTsKKwkocCtpKS0+X19wdHIgPSBfX3B0cltpXS5fX3B0cjsKKwkocCtpKS0+X19zaXplID0gY29sczsKKyAgICAgIH0KKyAgICAgIGZvciAoOyBpIDwgcm93czsgaSsrKQorICAgICAgICBfX3B0cltpXS5yZXNpemUoY29scyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IF9fcHRyID0gc29hcF9uZXdfdmVjdG9yKHNvYXAsIHJvd3MpOworICAgICAgZm9yIChpID0gMDsgaSA8IHJvd3M7IGkrKykKKyAgICAgICAgX19wdHJbaV0ucmVzaXplKGNvbHMpOworICAgICAgX19zaXplID0gcm93czsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIGZvciAoaSA9IDA7IGkgPCBfX3NpemU7IGkrKykKKyAgICAgIF9fcHRyW2ldLnJlc2l6ZShjb2xzKTsKK30KKwordmVjdG9yJiBtYXRyaXg6Om9wZXJhdG9yW10oaW50IGkpIGNvbnN0Cit7IGlmICghX19wdHIgfHwgaSA8IDAgfHwgaSA+PSBfX3NpemUpCisgICAgZnByaW50ZihzdGRlcnIsICJBcnJheSBpbmRleCBvdXQgb2YgYm91bmRzXG4iKTsKKyAgcmV0dXJuIF9fcHRyW2ldOworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9tYWdpY19WQy9NYWdpYzIuZHNwIGIvc2FtcGxlcy9tYWdpY19WQy9NYWdpYzIuZHNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ODIxZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL21hZ2ljX1ZDL01hZ2ljMi5kc3AKQEAgLTAsMCArMSwxNDQgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iTWFnaWMyIiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMA0KKyMgKiogRE8gTk9UIEVESVQgKioNCisNCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiAweDAxMDMNCisNCitDRkc9TWFnaWMyIC0gV2luMzIgRGVidWcNCishTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsDQorIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgIk1hZ2ljMi5tYWsiLg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFDQorIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToNCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAiTWFnaWMyLm1hayIgQ0ZHPSJNYWdpYzIgLSBXaW4zMiBEZWJ1ZyINCishTUVTU0FHRSANCishTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToNCishTUVTU0FHRSANCishTUVTU0FHRSAiTWFnaWMyIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikNCishTUVTU0FHRSAiTWFnaWMyIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpDQorIU1FU1NBR0UgDQorDQorIyBCZWdpbiBQcm9qZWN0DQorIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDANCisjIFBST1AgU2NjX1Byb2pOYW1lICIiDQorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiINCitDUFA9Y2wuZXhlDQorUlNDPXJjLmV4ZQ0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gIk1hZ2ljMiAtIFdpbjMyIFJlbGVhc2UiDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBPdXRwdXRfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4Ng0KKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2DQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIk1hZ2ljMiAtIFdpbjMyIERlYnVnIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciDQorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9HWiAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvR1ogL2MNCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgd3NvY2szMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdA0KKw0KKyFFTkRJRiANCisNCisjIEJlZ2luIFRhcmdldA0KKw0KKyMgTmFtZSAiTWFnaWMyIC0gV2luMzIgUmVsZWFzZSINCisjIE5hbWUgIk1hZ2ljMiAtIFdpbjMyIERlYnVnIg0KKyMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXG1hZ2ljY2xpZW50LmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHNvYXBDLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHNvYXBDbGllbnQuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cc3Rkc29hcDIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmwiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXG1hZ2ljLmgNCisNCishSUYgICIkKENGRykiID09ICJNYWdpYzIgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJNYWdpYzIgLSBXaW4zMiBEZWJ1ZyINCisNCisjIEJlZ2luIEN1c3RvbSBCdWlsZCAtIGdTT0FQIFdlYiBzZXJ2aWNlIHByb3h5L3NrZWxldG9uIGJ1aWxkIG9uICQoSW5wdXRQYXRoKQ0KK0lucHV0UGF0aD0uXG1hZ2ljLmgNCisNCisic29hcFN0dWIuaCBzb2FwSC5oIHNvYXBDLmNwcCBzb2FwQ2xpZW50LmNwcCBzb2FwU2VydmVyLmNwcCIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIgIiQoT1VURElSKSINCisJLlxzb2FwY3BwMi5leGUgIiQoSW5wdXRQYXRoKSINCisNCisjIEVuZCBDdXN0b20gQnVpbGQNCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cc29hcEguaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHNvYXBTdHViLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxzdGRzb2FwMi5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIlJlc291cmNlIEZpbGVzIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlIg0KKyMgRW5kIEdyb3VwDQorIyBFbmQgVGFyZ2V0DQorIyBFbmQgUHJvamVjdA0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvbWFnaWNfVkMvTWFnaWMyLmRzdyBiL3NhbXBsZXMvbWFnaWNfVkMvTWFnaWMyLmRzdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWU3NTBiCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9tYWdpY19WQy9NYWdpYzIuZHN3CkBAIC0wLDAgKzEsMjkgQEAKK01pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFdvcmtzcGFjZSBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyBXQVJOSU5HOiBETyBOT1QgRURJVCBPUiBERUxFVEUgVEhJUyBXT1JLU1BBQ0UgRklMRSENCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogIk1hZ2ljMiI9Ii5cTWFnaWMyLmRzcCIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08ND4NCit7e3sNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorR2xvYmFsOg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08Mz4NCit7e3sNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9tYWdpY19WQy9NYWdpYzIuc2xuIGIvc2FtcGxlcy9tYWdpY19WQy9NYWdpYzIuc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5Njg2YmMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL21hZ2ljX1ZDL01hZ2ljMi5zbG4KQEAgLTAsMCArMSwyMCBAQAor77u/CitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiA5LjAwCisjIFZpc3VhbCBTdHVkaW8gMjAwNQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJNYWdpYzIiLCAiTWFnaWMyLnZjcHJvaiIsICJ7QTg2MUZGQjgtQUNBRi00RTg4LTgxMjMtQjFGNjM4Qzg2RDg2fSIKK0VuZFByb2plY3QKK0dsb2JhbAorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uCisJCURlYnVnfFdpbjMyID0gRGVidWd8V2luMzIKKwkJUmVsZWFzZXxXaW4zMiA9IFJlbGVhc2V8V2luMzIKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24KKwkJe0E4NjFGRkI4LUFDQUYtNEU4OC04MTIzLUIxRjYzOEM4NkQ4Nn0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzIKKwkJe0E4NjFGRkI4LUFDQUYtNEU4OC04MTIzLUIxRjYzOEM4NkQ4Nn0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyCisJCXtBODYxRkZCOC1BQ0FGLTRFODgtODEyMy1CMUY2MzhDODZEODZ9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgorCQl7QTg2MUZGQjgtQUNBRi00RTg4LTgxMjMtQjFGNjM4Qzg2RDg2fS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9tYWdpY19WQy9NYWdpYzIudmNwcm9qIGIvc2FtcGxlcy9tYWdpY19WQy9NYWdpYzIudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkN2RhNDgKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL21hZ2ljX1ZDL01hZ2ljMi52Y3Byb2oKQEAgLTAsMCArMSwzMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI4LjAwIg0KKwlOYW1lPSJNYWdpYzIiDQorCVByb2plY3RHVUlEPSJ7QTg2MUZGQjgtQUNBRi00RTg4LTgxMjMtQjFGNjM4Qzg2RDg2fSINCisJPg0KKwk8UGxhdGZvcm1zPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luMzIiDQorCQkvPg0KKwk8L1BsYXRmb3Jtcz4NCisJPFRvb2xGaWxlcz4NCisJPC9Ub29sRmlsZXM+DQorCTxDb25maWd1cmF0aW9ucz4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cUmVsZWFzZSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cUmVsZWFzZSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzYwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlxSZWxlYXNlL01hZ2ljMi50bGIiDQorCQkJCUhlYWRlckZpbGVOYW1lPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkgDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dJTk5UPTB4MDUwMTtXSU5WRVI9MHgwNTAxO19XSU4zMl9JRT0weDA2MDM7V0lOMzI7TkRFQlVHO19DT05TT0xFIg0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQkgDQorCQkJCSANCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXFJlbGVhc2UvTWFnaWMyLnBjaCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXFJlbGVhc2UvIg0KKwkJCQlPYmplY3RGaWxlPSIuXFJlbGVhc2UvIg0KKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlxSZWxlYXNlLyINCisJCQkJIA0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0lOTlQ9MHgwNTAxO1dJTlZFUj0weDA1MDE7X1dJTjMyX0lFPTB4MDYwMztOREVCVUciDQorCQkJCUN1bHR1cmU9IjEwMzMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCU91dHB1dEZpbGU9Ii5cUmVsZWFzZS9NYWdpYzIuZXhlIg0KKwkJCQkgDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlxSZWxlYXNlL01hZ2ljMi5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlPdXRwdXRGaWxlPSIuXFJlbGVhc2UvTWFnaWMyLmJzYyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXERlYnVnIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxEZWJ1ZyINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzYwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlxEZWJ1Zy9NYWdpYzIudGxiIg0KKwkJCQlIZWFkZXJGaWxlTmFtZT0iIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJIA0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dJTk5UPTB4MDUwMTtXSU5WRVI9MHgwNTAxO19XSU4zMl9JRT0weDA2MDM7V0lOMzI7X0RFQlVHO19DT05TT0xFIg0KKwkJCQkgDQorCQkJCSANCisJCQkJIA0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cRGVidWcvTWFnaWMyLnBjaCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXERlYnVnLyINCisJCQkJT2JqZWN0RmlsZT0iLlxEZWJ1Zy8iDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXERlYnVnLyINCisJCQkJIA0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCSANCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XSU5OVD0weDA1MDE7V0lOVkVSPTB4MDUwMTtfV0lOMzJfSUU9MHgwNjAzO19ERUJVRyINCisJCQkJQ3VsdHVyZT0iMTAzMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0ib2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgd3NvY2szMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii5cRGVidWcvTWFnaWMyLmV4ZSINCisJCQkJIA0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCQ0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXERlYnVnL01hZ2ljMi5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlPdXRwdXRGaWxlPSIuXERlYnVnL01hZ2ljMi5ic2MiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCTwvQ29uZmlndXJhdGlvbnM+DQorCTxSZWZlcmVuY2VzPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0Ig0KKwkJCT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Im1hZ2ljY2xpZW50LmNwcCINCisJCQkJPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XSU5OVD0weDA1MDE7V0lOVkVSPTB4MDUwMTtfV0lOMzJfSUU9MHgwNjAzOyINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XSU5OVD0weDA1MDE7V0lOVkVSPTB4MDUwMTtfV0lOMzJfSUU9MHgwNjAzOyINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0ic29hcEMuY3BwIg0KKwkJCQk+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dJTk5UPTB4MDUwMTtXSU5WRVI9MHgwNTAxO19XSU4zMl9JRT0weDA2MDM7Ig0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dJTk5UPTB4MDUwMTtXSU5WRVI9MHgwNTAxO19XSU4zMl9JRT0weDA2MDM7Ig0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSJzb2FwQ2xpZW50LmNwcCINCisJCQkJPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XSU5OVD0weDA1MDE7V0lOVkVSPTB4MDUwMTtfV0lOMzJfSUU9MHgwNjAzOyINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XSU5OVD0weDA1MDE7V0lOVkVSPTB4MDUwMTtfV0lOMzJfSUU9MHgwNjAzOyINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0ic3Rkc29hcDIuY3BwIg0KKwkJCQk+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dJTk5UPTB4MDUwMTtXSU5WRVI9MHgwNTAxO19XSU4zMl9JRT0weDA2MDM7Ig0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dJTk5UPTB4MDUwMTtXSU5WRVI9MHgwNTAxO19XSU4zMl9JRT0weDA2MDM7Ig0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiDQorCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sIg0KKwkJCT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Im1hZ2ljLmgiDQorCQkJCT4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJCQkJRGVzY3JpcHRpb249ImdTT0FQIFdlYiBzZXJ2aWNlIHByb3h5L3NrZWxldG9uIGJ1aWxkIG9uICQoSW5wdXRQYXRoKSINCisJCQkJCQlDb21tYW5kTGluZT0iLlxzb2FwY3BwMi5leGUgJnF1b3Q7JChJbnB1dFBhdGgpJnF1b3Q7JiN4MEQ7JiN4MEE7Ig0KKwkJCQkJCU91dHB1dHM9InNvYXBTdHViLmggc29hcEguaCBzb2FwQy5jcHAgc29hcENsaWVudC5jcHAgc29hcFNlcnZlci5jcHAiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9InNvYXBILmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSJzb2FwU3R1Yi5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0ic3Rkc29hcDIuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlJlc291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlIg0KKwkJCT4NCisJCTwvRmlsdGVyPg0KKwk8L0ZpbGVzPg0KKwk8R2xvYmFscz4NCisJPC9HbG9iYWxzPg0KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS9zYW1wbGVzL21hZ2ljX1ZDL21hZ2ljLmggYi9zYW1wbGVzL21hZ2ljX1ZDL21hZ2ljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJhNDRmYgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvbWFnaWNfVkMvbWFnaWMuaApAQCAtMCwwICsxLDM2IEBACisvL2dzb2FwIG5zMSBzZXJ2aWNlIG5hbWU6CW1hZ2ljCisvL2dzb2FwIG5zMSBzZXJ2aWNlIHN0eWxlOglycGMKKy8vZ3NvYXAgbnMxIHNlcnZpY2UgZW5jb2Rpbmc6CWVuY29kZWQKKy8vZ3NvYXAgbnMxIHNlcnZpY2UgbmFtZXNwYWNlOglodHRwOi8vd2Vic3J2LmNzLmZzdS5lZHUvfmVuZ2VsZW4vbWFnaWMud3NkbAorLy9nc29hcCBuczEgc2VydmljZSBsb2NhdGlvbjoJaHR0cDovL3dlYnNydi5jcy5mc3UuZWR1L35lbmdlbGVuL21hZ2ljc2VydmVyLmNnaQorLy9nc29hcCBuczEgc2VydmljZSBkb2N1bWVudGF0aW9uOiBEZW1vIE1hZ2ljIFNxdWFyZXMgc2VydmljZQorCisvL2dzb2FwIG5zMSBzY2hlbWEgbmFtZXNwYWNlOiB1cm46TWFnaWNTcXVhcmUKKwordHlwZWRlZiBpbnQgeHNkX19pbnQ7CisKK2NsYXNzIHZlY3RvcgoreyBwdWJsaWM6CisgIHhzZF9faW50ICpfX3B0cjsKKyAgaW50IF9fc2l6ZTsKKyAgc3RydWN0IHNvYXAgKnNvYXA7CisgIHZlY3RvcigpOworICB2ZWN0b3IoaW50KTsKKyAgdmlydHVhbCB+dmVjdG9yKCk7CisgIHZvaWQgcmVzaXplKGludCk7CisgIGludCYgb3BlcmF0b3JbXShpbnQpIGNvbnN0OworfTsKKworY2xhc3MgbWF0cml4Cit7IHB1YmxpYzoKKyAgdmVjdG9yICpfX3B0cjsKKyAgaW50IF9fc2l6ZTsKKyAgc3RydWN0IHNvYXAgKnNvYXA7CisgIG1hdHJpeCgpOworICBtYXRyaXgoaW50LCBpbnQpOworICB2aXJ0dWFsIH5tYXRyaXgoKTsKKyAgdm9pZCByZXNpemUoaW50LCBpbnQpOworICB2ZWN0b3ImIG9wZXJhdG9yW10oaW50KSBjb25zdDsKK307CisKK2ludCBuczFfX21hZ2ljKHhzZF9faW50IHJhbmssIG1hdHJpeCAqcmVzdWx0KTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvbWFnaWNfVkMvbWFnaWNjbGllbnQuY3BwIGIvc2FtcGxlcy9tYWdpY19WQy9tYWdpY2NsaWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FmYmMxMQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvbWFnaWNfVkMvbWFnaWNjbGllbnQuY3BwCkBAIC0wLDAgKzEsMTQzIEBACisjaW5jbHVkZSAic29hcEguaCIKKyNpbmNsdWRlICJtYWdpYy5uc21hcCIKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwlNYWdpYyBTcXVhcmVzIENsaWVudAorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIFRvIGFjY2VzcyBhIHN0YW5kLWFsb25lIHNlcnZlciBvbiBhIHBvcnQ6IG1hZ2ljc2VydmVyW10gPSAiSVA6UE9SVCI7CisvLyB1c2UgImh0dHA6Ly8iIHRvIGluY2x1ZGUgSFRUUCBoZWFkZXI6IG1hZ2ljc2VydmVyW10gPSAiaHR0cDovL0lQOlBPUlQiOworLy8gY29uc3QgY2hhciBtYWdpY3NlcnZlcltdID0gImxpbnByb2cyLmNzLmZzdS5lZHU6MTgwODEiOworLy8gY29uc3QgY2hhciBtYWdpY3NlcnZlcltdID0gImh0dHA6Ly9kaWFibG8uY3MuZnN1LmVkdToxODA4MSI7CisvLyBjb25zdCBjaGFyIG1hZ2ljc2VydmVyW10gPSAiaHR0cDovLyI7Citjb25zdCBjaGFyIG1hZ2ljc2VydmVyW10gPSAiaHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL21hZ2ljc2VydmVyLmNnaSI7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sgc3RydWN0IHNvYXAgc29hcDsKKyAgaW50IHI7CisgIHNvYXBfaW5pdCgmc29hcCk7CisgIG1hdHJpeCAqQSA9IHNvYXBfbmV3X21hdHJpeCgmc29hcCwgLTEpOworICBpZiAoYXJnYyA8PSAxKQorICB7IGNoYXIgKnMgPSBnZXRlbnYoIlFVRVJZX1NUUklORyIpOworICAgIGlmICghcyB8fCAociA9IGF0b2kocykpID09IDApCisgICAgICByID0gcmFuZCgpJTIwOworICB9CisgIGVsc2UKKyAgICByID0gYXRvaShhcmd2WzFdKTsKKyAgcHJpbnRmKCJDb250ZW50LXR5cGU6IHRleHQvaHRtbFxyXG5cclxuPGh0bWw+PGgxPk1hZ2ljIFNxdWFyZSBvZiBSYW5rICVkPC9oMT48cHJlPlxuIiwgcik7CisgIGlmIChzb2FwX2NhbGxfbnMxX19tYWdpYygmc29hcCwgbWFnaWNzZXJ2ZXIsIE5VTEwsIHIsIEEpKQorICB7IHNvYXBfcHJpbnRfZmF1bHQoJnNvYXAsIHN0ZGVycik7CisgICAgc29hcF9wcmludF9mYXVsdF9sb2NhdGlvbigmc29hcCwgc3RkZXJyKTsKKyAgfQorICBlbHNlCisgIHsgZm9yIChpbnQgaSA9IDA7IGkgPCAoKkEpLl9fc2l6ZTsgaSsrKQorICAgIHsgZm9yIChpbnQgaiA9IDA7IGogPCAoKkEpW2ldLl9fc2l6ZTsgaisrKQorICAgICAgICBwcmludGYoIiU0ZCIsICgqQSlbaV1bal0pOworICAgICAgcHJpbnRmKCJcbiIpOworICAgIH0KKyAgfQorICBwcmludGYoIjwvcHJlPjwvaHRtbD5cbiIpOworICBzb2FwX2Rlc3Ryb3koJnNvYXApOworICBzb2FwX2VuZCgmc29hcCk7CisgIHJldHVybiAwOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCUNsYXNzIHZlY3RvciBNZXRob2RzCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordmVjdG9yOjp2ZWN0b3IoKQoreyBfX3B0ciA9IDA7CisgIF9fc2l6ZSA9IDA7Cit9CisKK3ZlY3Rvcjo6dmVjdG9yKGludCBzaXplKQoreyBfX3B0ciA9IChpbnQqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemUqc2l6ZW9mKGludCkpOworICBfX3NpemUgPSBzaXplOworfQorCit2ZWN0b3I6On52ZWN0b3IoKQoreyBzb2FwX3VubGluayhzb2FwLCB0aGlzKTsgLy8gbm90IHJlcXVpcmVkLCBidXQganVzdCB0byBtYWtlIHN1cmUgaWYgc29tZW9uZSBjYWxscyBkZWxldGUgb24gdGhpcworfQorCit2b2lkIHZlY3Rvcjo6cmVzaXplKGludCBzaXplKQoreyBpbnQgKnA7CisgIGlmIChfX3NpemUgPT0gc2l6ZSkKKyAgICByZXR1cm47CisgIHAgPSAoaW50Kilzb2FwX21hbGxvYyhzb2FwLCBzaXplKnNpemVvZihpbnQpKTsKKyAgaWYgKF9fcHRyKQorICB7IGZvciAoaW50IGkgPSAwOyBpIDwgKHNpemUgPD0gX19zaXplID8gc2l6ZSA6IF9fc2l6ZSk7IGkrKykKKyAgICAgIHBbaV0gPSBfX3B0cltpXTsKKyAgICBzb2FwX3VubGluayhzb2FwLCBfX3B0cik7CisgICAgZnJlZShfX3B0cik7CisgIH0KKyAgX19wdHIgPSBwOworICBfX3NpemUgPSBzaXplOworfQorCitpbnQmIHZlY3Rvcjo6b3BlcmF0b3JbXShpbnQgaWR4KSBjb25zdAoreyBpZiAoIV9fcHRyIHx8IGlkeCA8IDAgfHwgaWR4ID49IF9fc2l6ZSkKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkFycmF5IGluZGV4IG91dCBvZiBib3VuZHNcbiIpOworICByZXR1cm4gX19wdHJbaWR4XTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwlDbGFzcyBtYXRyaXggTWV0aG9kcworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK21hdHJpeDo6bWF0cml4KCkKK3sgX19wdHIgPSAwOworICBfX3NpemUgPSAwOworfQorCittYXRyaXg6On5tYXRyaXgoKQoreyBzb2FwX3VubGluayhzb2FwLCB0aGlzKTsgLy8gbm90IHJlcXVpcmVkLCBidXQganVzdCB0byBtYWtlIHN1cmUgaWYgc29tZW9uZSBjYWxscyBkZWxldGUgb24gdGhpcworfQorCittYXRyaXg6Om1hdHJpeChpbnQgcm93cywgaW50IGNvbHMpCit7IAorICBfX3B0ciA9IHNvYXBfbmV3X3ZlY3Rvcihzb2FwLCByb3dzKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzOyBpKyspCisgICAgX19wdHJbaV0ucmVzaXplKGNvbHMpOworICBfX3NpemUgPSByb3dzOworfQorCit2b2lkIG1hdHJpeDo6cmVzaXplKGludCByb3dzLCBpbnQgY29scykKK3sgaW50IGk7CisgIHZlY3RvciAqcDsKKyAgaWYgKF9fc2l6ZSAhPSByb3dzKQorICB7IGlmIChfX3B0cikKKyAgICB7IHAgPSBzb2FwX25ld192ZWN0b3Ioc29hcCwgcm93cyk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgKHJvd3MgPD0gX19zaXplID8gcm93cyA6IF9fc2l6ZSk7IGkrKykKKyAgICAgIHsgaWYgKHRoaXNbaV0uX19zaXplICE9IGNvbHMpCisgICAgICAgICAgKCp0aGlzKVtpXS5yZXNpemUoY29scyk7CisJKHAraSktPl9fcHRyID0gX19wdHJbaV0uX19wdHI7CisJKHAraSktPl9fc2l6ZSA9IGNvbHM7CisgICAgICB9CisgICAgICBmb3IgKDsgaSA8IHJvd3M7IGkrKykKKyAgICAgICAgX19wdHJbaV0ucmVzaXplKGNvbHMpOworICAgIH0KKyAgICBlbHNlCisgICAgeyAKKyAgICAgIF9fcHRyID0gc29hcF9uZXdfdmVjdG9yKHNvYXAsIHJvd3MpOworICAgICAgZm9yIChpID0gMDsgaSA8IHJvd3M7IGkrKykKKyAgICAgICAgX19wdHJbaV0ucmVzaXplKGNvbHMpOworICAgICAgX19zaXplID0gcm93czsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIGZvciAoaSA9IDA7IGkgPCBfX3NpemU7IGkrKykKKyAgICAgIF9fcHRyW2ldLnJlc2l6ZShjb2xzKTsKK30KKwordmVjdG9yJiBtYXRyaXg6Om9wZXJhdG9yW10oaW50IGlkeCkgY29uc3QKK3sgaWYgKCFfX3B0ciB8fCBpZHggPCAwIHx8IGlkeCA+PSBfX3NpemUpCisgICAgZnByaW50ZihzdGRlcnIsICJBcnJheSBpbmRleCBvdXQgb2YgYm91bmRzXG4iKTsKKyAgcmV0dXJuIF9fcHRyW2lkeF07Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL21hZ2ljX1ZDL3NvYXBjcHAyLmV4ZSBiL3NhbXBsZXMvbWFnaWNfVkMvc29hcGNwcDIuZXhlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZlYTk1YmEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL21hZ2ljX1ZDL3NvYXBjcHAyLmV4ZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL21hZ2ljX1ZDL3N0ZHNvYXAyLmNwcCBiL3NhbXBsZXMvbWFnaWNfVkMvc3Rkc29hcDIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZWQ0NjAKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL21hZ2ljX1ZDL3N0ZHNvYXAyLmNwcApAQCAtMCwwICsxLDEzNDQ4IEBACisvKgorCitzdGRzb2FwMi5jW3BwXSAyLjcuNmUKKworZ1NPQVAgcnVudGltZQorCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHBhcnQgb2YgdGhlIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2VzOgorR1BMLCB0aGUgZ1NPQVAgcHVibGljIGxpY2Vuc2UsIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDb250cmlidXRvcnM6CisKK1dpbmQgUml2ZXIgU3lzdGVtcyBJbmMuLCBmb3IgdGhlIGZvbGxvd2luZyBhZGRpdGlvbnMgdW5kZXIgZ1NPQVAgcHVibGljIGxpY2Vuc2U6CisgIC0gdnhXb3JrcyBjb21wYXRpYmxlCSgjZGVmaW5lIFZYV09SS1MpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgcHVibGljIGxpY2Vuc2UuCisKK1RoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGdTT0FQIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4zCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKK0xpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoraHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL3NvYXBsaWNlbnNlLmh0bWwKK1NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCitXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKK2ZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK1RoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4uCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJbnN0YWxsYXRpb24gbm90ZToKKworV2luMzIgYnVpbGQgbmVlZHMgd2luc29jay5kbGwgKFZpc3VhbCBDKysgIndzb2NrMzIubGliIikKK1RvIGRvIHRoaXMgaW4gVmlzdWFsIEMrKyA2LjAsIGdvIHRvICJQcm9qZWN0IiwgInNldHRpbmdzIiwgc2VsZWN0IHRoZSAiTGluayIKK3RhYiAodGhlIHByb2plY3QgZmlsZSBuZWVkcyB0byBiZSBzZWxlY3RlZCBpbiB0aGUgZmlsZSB2aWV3KSBhbmQgYWRkCisid3NvY2szMi5saWIiIHRvIHRoZSAiT2JqZWN0L2xpYnJhcnkgbW9kdWxlcyIgZW50cnkKKworT24gTWFjIE9TIFggd2l0aCBnY2MgKEdDQykgMy4xIDIwMDIwNDIwIChwcmVyZWxlYXNlKSB5b3UgTVVTVCBjb21waWxlIHdpdGgKKy1mc3RhY2tfY2hlY2sgd2hlbiB1c2luZyAtTzIgYmVjYXVzZSBnY2MgMy4xIGhhcyBhIGJ1ZyB0aGF0IHNtYXNoZXMgdGhlIHN0YWNrCit3aGVuIGxvY2FsbHkgYWxsb2NhdGVkIGRhdGEgZXhjZWVkcyA2NEsuCisKKyovCisKKyNpZmRlZiBBUzQwMAorIyBwcmFnbWEgY29udmVydCg4MTkpCS8qIEVCQ0RJQyB0byBBU0NJSSAqLworI2VuZGlmCisKKyNpbmNsdWRlICJzdGRzb2FwMi5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK1NPQVBfU09VUkNFX1NUQU1QKCJAKCMpIHN0ZHNvYXAyLmNwcCB2ZXIgMi43LjZlIDIwMDYtMDItMTggMTI6MDA6MDAgR01UIikKK2V4dGVybiAiQyIgeworI2Vsc2UKK1NPQVBfU09VUkNFX1NUQU1QKCJAKCMpIHN0ZHNvYXAyLmMgdmVyIDIuNy42ZSAyMDA2LTAyLTE4IDEyOjAwOjAwIEdNVCIpCisjZW5kaWYKKworLyogOGJpdCBjaGFyYWN0ZXIgcmVwcmVzZW50aW5nIHVua25vd24vbm9ucmVwcmVzZW50YWJsZSBjaGFyYWN0ZXIgZGF0YSAoZS5nLiBub3Qgc3VwcG9ydGVkIGJ5IGN1cnJlbnQgbG9jYWxlIHdpdGggbXVsdGlieXRlIHN1cHBvcnQgZW5hYmxlZCkgKi8KKyNpZm5kZWYgU09BUF9VTktOT1dOX0NIQVIKKyNkZWZpbmUgU09BUF9VTktOT1dOX0NIQVIgKDEyNykKKyNlbmRpZgorCisvKiAgICAgIEVPRj0tMSAqLworI2RlZmluZSBTT0FQX0xUIChzb2FwX3djaGFyKSgtMikgLyogWE1MIGNoYXJhY3RlciAnPCcgKi8KKyNkZWZpbmUgU09BUF9UVCAoc29hcF93Y2hhcikoLTMpIC8qIFhNTCBjaGFyYWN0ZXIgJzwvJyAqLworI2RlZmluZSBTT0FQX0dUIChzb2FwX3djaGFyKSgtNCkgLyogWE1MIGNoYXJhY3RlciAnPicgKi8KKyNkZWZpbmUgU09BUF9RVCAoc29hcF93Y2hhcikoLTUpIC8qIFhNTCBjaGFyYWN0ZXIgJyInICovCisjZGVmaW5lIFNPQVBfQVAgKHNvYXBfd2NoYXIpKC02KSAvKiBYTUwgY2hhcmFjdGVyICcnJyAqLworCisjZGVmaW5lIHNvYXBfYmxhbmsoYykJCSgoYykgPj0gMCAmJiAoYykgPD0gMzIpCisjZGVmaW5lIHNvYXBfbm90YmxhbmsoYykJKChjKSA+IDMyKQorI2RlZmluZSBzb2FwX2hhc2hfcHRyKHApCSgoKHVuc2lnbmVkIGxvbmcpKHApID4+IDMpICYgKFNPQVBfUFRSSEFTSCAtIDEpKQorCisjaWZkZWYgU09BUF9ERUJVRworc3RhdGljIHZvaWQgc29hcF9pbml0X2xvZ3Moc3RydWN0IHNvYXAqKTsKK3N0YXRpYyB2b2lkIHNvYXBfY2xvc2VfbG9nZmlsZShzdHJ1Y3Qgc29hcCosIGludCk7CitzdGF0aWMgdm9pZCBzb2FwX3NldF9sb2dmaWxlKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKik7CitzdGF0aWMgdm9pZCBzb2FwX2ZyZWVfbWh0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgdm9pZCBzb2FwX3RyYWNrX3VubGluayhzdHJ1Y3Qgc29hcCosIGNvbnN0IHZvaWQqKTsKKyNlbmRpZgorCisjaWZuZGVmIFBBTE1fMgorc3RhdGljIGludCBzb2FwX3NldF9lcnJvcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBpbnQpOworc3RhdGljIGludCBzb2FwX2NvcHlfZmF1bHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitzdGF0aWMgaW50IHNvYXBfZ2V0YXR0cnZhbChzdHJ1Y3Qgc29hcCosIGNoYXIqLCBzaXplX3QsIHNvYXBfd2NoYXIpOworI2VuZGlmCisKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc29hcF93Y2hhciBzb2FwX2NoYXIoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBzb2FwX3djaGFyIHNvYXBfZ2V0X3BpKHN0cnVjdCBzb2FwKik7CitzdGF0aWMgaW50IHNvYXBfaXN4ZGlnaXQoaW50KTsKK3N0YXRpYyB2b2lkICpmcGx1Z2luKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworI2lmbmRlZiBXSVRIX05PSURSRUYKK3N0YXRpYyB2b2lkIHNvYXBfdXBkYXRlX3B0cnMoc3RydWN0IHNvYXAqLCBjaGFyKiwgY2hhciosIGNoYXIqLCBjaGFyKik7CitzdGF0aWMgaW50IHNvYXBfaGFzX2NvcGllcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitzdGF0aWMgdm9pZCBzb2FwX2luaXRfaWh0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgdm9pZCBzb2FwX2ZyZWVfaWh0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgdm9pZCBzb2FwX2luaXRfcGh0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgdm9pZCBzb2FwX2ZyZWVfcGh0KHN0cnVjdCBzb2FwKik7CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIGNvbnN0IGNoYXIgKnNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworc3RhdGljIGludCBzb2FwX2lzbnVtZXJpYyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyB0aW1lX3Qgc29hcF90aW1lZ20oc3RydWN0IHRtKik7CitzdGF0aWMgc3RydWN0IHNvYXBfbmxpc3QgKnNvYXBfbG9va3VwX25zKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHNpemVfdCBuKTsKK3N0YXRpYyBzdHJ1Y3Qgc29hcF9ubGlzdCAqc29hcF9wdXNoX25zKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqbnMsIHNob3J0IHV0aWxpemVkKTsKK3N0YXRpYyB2b2lkIHNvYXBfcG9wX25zKHN0cnVjdCBzb2FwICpzb2FwKTsKK3N0YXRpYyB2b2lkIHNvYXBfdXRpbGl6ZV9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzaXplX3Qgbik7CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKnNvYXBfbmV3X211bHRpcGFydChzdHJ1Y3Qgc29hcCosIHN0cnVjdCBzb2FwX211bHRpcGFydCoqLCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKiwgY2hhciosIHNpemVfdCk7CitzdGF0aWMgaW50IHNvYXBfcHV0ZGltZWZpZWxkKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHNpemVfdCk7CitzdGF0aWMgY2hhciAqc29hcF9nZXRkaW1lZmllbGQoc3RydWN0IHNvYXAqLCBzaXplX3QpOworc3RhdGljIHZvaWQgc29hcF9zZWxlY3RfbWltZV9ib3VuZGFyeShzdHJ1Y3Qgc29hcCopOworc3RhdGljIGludCBzb2FwX3ZhbGlkX21pbWVfYm91bmRhcnkoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBpbnQgc29hcF9tYXRjaF9jaWQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworc3RhdGljIHZvaWQgc29hcF9yZXNvbHZlX2F0dGFjaG1lbnQoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBXSVRIX0daSVAKK3N0YXRpYyBpbnQgc29hcF9nZXRnemlwaGRyKHN0cnVjdCBzb2FwKik7CisjZW5kaWYKKworI2lmZGVmIFdJVEhfT1BFTlNTTAorc3RhdGljIGludCBzc2xfaW5pdF9kb25lID0gMDsKK3N0YXRpYyBpbnQgc3NsX2F1dGhfaW5pdChzdHJ1Y3Qgc29hcCopOworc3RhdGljIGludCBzc2xfdmVyaWZ5X2NhbGxiYWNrKGludCwgWDUwOV9TVE9SRV9DVFgqKTsKK3N0YXRpYyBpbnQgc3NsX3Bhc3N3b3JkKGNoYXIqLCBpbnQsIGludCwgdm9pZCAqKTsKK3N0YXRpYyBjb25zdCBjaGFyICpzc2xfZXJyb3Ioc3RydWN0IHNvYXAqLCBpbnQpOworLyogVGhpcyBjYWxsYmFjayBpcyBpbmNsdWRlZCBmb3IgZnV0dXJlIHJlZmVyZW5jZXMuIEl0IHNob3VsZCBub3QgYmUgZGVsZXRlZAorc3RhdGljIERIICpzc2xfdG1wX2RoKFNTTCosIGludCwgaW50KTsKKyovCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFdJVEhfTk9IVFRQKSB8fCAhZGVmaW5lZChXSVRIX0xFQU5FUikKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY29uc3QgY2hhciAqc29hcF9kZWNvZGUoY2hhciosIHNpemVfdCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc29hcF93Y2hhciBzb2FwX2dldGNodW5rY2hhcihzdHJ1Y3Qgc29hcCopOworc3RhdGljIGNvbnN0IGNoYXIgKmh0dHBfZXJyb3Ioc3RydWN0IHNvYXAqLCBpbnQpOworc3RhdGljIGludCBodHRwX3Bvc3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworc3RhdGljIGludCBodHRwX2dldChzdHJ1Y3Qgc29hcCopOworc3RhdGljIGludCBodHRwX3NlbmRfaGVhZGVyKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworc3RhdGljIGludCBodHRwX3Bvc3RfaGVhZGVyKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyBpbnQgaHR0cF9yZXNwb25zZShzdHJ1Y3Qgc29hcCosIGludCwgc2l6ZV90KTsKK3N0YXRpYyBpbnQgaHR0cF9wYXJzZShzdHJ1Y3Qgc29hcCopOworc3RhdGljIGludCBodHRwX3BhcnNlX2hlYWRlcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQgZnNlbmQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc2l6ZV90KTsKK3N0YXRpYyBzaXplX3QgZnJlY3Yoc3RydWN0IHNvYXAqLCBjaGFyKiwgc2l6ZV90KTsKK3N0YXRpYyBpbnQgdGNwX2luaXQoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBjb25zdCBjaGFyICp0Y3BfZXJyb3Ioc3RydWN0IHNvYXAqKTsKKyNpZm5kZWYgV0lUSF9JUFY2CitzdGF0aWMgaW50IHRjcF9nZXRob3N0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqYWRkciwgc3RydWN0IGluX2FkZHIgKmluYWRkcik7CisjZW5kaWYKK3N0YXRpYyBpbnQgdGNwX2Nvbm5lY3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICplbmRwb2ludCwgY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQpOworc3RhdGljIGludCB0Y3BfYWNjZXB0KHN0cnVjdCBzb2FwKiwgaW50LCBzdHJ1Y3Qgc29ja2FkZHIqLCBpbnQqKTsKK3N0YXRpYyBpbnQgdGNwX2Rpc2Nvbm5lY3Qoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBpbnQgdGNwX2Nsb3Nlc29ja2V0KHN0cnVjdCBzb2FwKiwgU09BUF9TT0NLRVQpOworc3RhdGljIGludCB0Y3Bfc2h1dGRvd25zb2NrZXQoc3RydWN0IHNvYXAqLCBTT0FQX1NPQ0tFVCwgaW50KTsKK3N0YXRpYyBjb25zdCBjaGFyICpzb2FwX3N0cmVycm9yKHN0cnVjdCBzb2FwKik7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQQUxNKSAmJiAhZGVmaW5lZChQQUxNXzIpCit1bnNpZ25lZCBzaG9ydCBlcnJubzsKKyNlbmRpZgorCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNvbnN0IGNoYXIgc29hcF9lbnYxWzQyXSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI7CitzdGF0aWMgY29uc3QgY2hhciBzb2FwX2VuYzFbNDJdID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIjsKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfZW52Mls0MF0gPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIjsKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfZW5jMls0MF0gPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVuY29kaW5nIjsKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfcnBjWzM1XSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtcnBjIjsKKyNlbmRpZgorCisjaWZuZGVmIFBBTE1fMQorY29uc3Qgc3RydWN0IHNvYXBfZG91YmxlX25hbiBzb2FwX2RvdWJsZV9uYW4gPSB7MHhGRkZGRkZGRiwgMHhGRkZGRkZGRn07CitzdGF0aWMgY29uc3QgY2hhciBzb2FwX2Jhc2U2NG9bNjVdID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOworc3RhdGljIGNvbnN0IGNoYXIgc29hcF9iYXNlNjRpWzgxXSA9ICJcNzZYWFhcNzdcNjRcNjVcNjZcNjdcNzBcNzFcNzJcNzNcNzRcNzVYWFhYWFhYXDAwXDAxXDAyXDAzXDA0XDA1XDA2XDA3XDEwXDExXDEyXDEzXDE0XDE1XDE2XDE3XDIwXDIxXDIyXDIzXDI0XDI1XDI2XDI3XDMwXDMxWFhYWFhYXDMyXDMzXDM0XDM1XDM2XDM3XDQwXDQxXDQyXDQzXDQ0XDQ1XDQ2XDQ3XDUwXDUxXDUyXDUzXDU0XDU1XDU2XDU3XDYwXDYxXDYyXDYzIjsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIGNvbnN0IGNoYXIgc29hcF9pbmRlbnRbMTFdID0gIlxuXHRcdFx0XHRcdFx0XHRcdFx0IjsKKy8qIEFsdGVybmF0aXZlIGluZGVudGF0aW9uIGZvcm0gZm9yIFNPQVBfWE1MX0lOREVOVDoKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfaW5kZW50WzIxXSA9ICJcbiAgICAgICAgICAgICAgICAgICAiOworKi8KKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciBzb2FwX3BhZGRpbmdbNF0gPSAiXDBcMFwwIjsKKyNkZWZpbmUgU09BUF9TVFJfUEFERElORyAoc29hcF9wYWRkaW5nKQorI2RlZmluZSBTT0FQX1NUUl9FT1MgKHNvYXBfcGFkZGluZykKKyNkZWZpbmUgU09BUF9OT05fTlVMTCAoc29hcF9wYWRkaW5nKQorCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwIGh0bWxfZW50aXR5X2NvZGVzW10gPSAvKiBlbnRpdGllcyBmb3IgWEhUTUwgcGFyc2luZyAqLworeyB7IDE2MCwgIm5ic3AiIH0sCisgIHsgMTYxLCAiaWV4Y2wiIH0sCisgIHsgMTYyLCAiY2VudCIgfSwKKyAgeyAxNjMsICJwb3VuZCIgfSwKKyAgeyAxNjQsICJjdXJyZW4iIH0sCisgIHsgMTY1LCAieWVuIiB9LAorICB7IDE2NiwgImJydmJhciIgfSwKKyAgeyAxNjcsICJzZWN0IiB9LAorICB7IDE2OCwgInVtbCIgfSwKKyAgeyAxNjksICJjb3B5IiB9LAorICB7IDE3MCwgIm9yZGYiIH0sCisgIHsgMTcxLCAibGFxdW8iIH0sCisgIHsgMTcyLCAibm90IiB9LAorICB7IDE3MywgInNoeSIgfSwKKyAgeyAxNzQsICJyZWciIH0sCisgIHsgMTc1LCAibWFjciIgfSwKKyAgeyAxNzYsICJkZWciIH0sCisgIHsgMTc3LCAicGx1c21uIiB9LAorICB7IDE3OCwgInN1cDIiIH0sCisgIHsgMTc5LCAic3VwMyIgfSwKKyAgeyAxODAsICJhY3V0ZSIgfSwKKyAgeyAxODEsICJtaWNybyIgfSwKKyAgeyAxODIsICJwYXJhIiB9LAorICB7IDE4MywgIm1pZGRvdCIgfSwKKyAgeyAxODQsICJjZWRpbCIgfSwKKyAgeyAxODUsICJzdXAxIiB9LAorICB7IDE4NiwgIm9yZG0iIH0sCisgIHsgMTg3LCAicmFxdW8iIH0sCisgIHsgMTg4LCAiZnJhYzE0IiB9LAorICB7IDE4OSwgImZyYWMxMiIgfSwKKyAgeyAxOTAsICJmcmFjMzQiIH0sCisgIHsgMTkxLCAiaXF1ZXN0IiB9LAorICB7IDE5MiwgIkFncmF2ZSIgfSwKKyAgeyAxOTMsICJBYWN1dGUiIH0sCisgIHsgMTk0LCAiQWNpcmMiIH0sCisgIHsgMTk1LCAiQXRpbGRlIiB9LAorICB7IDE5NiwgIkF1bWwiIH0sCisgIHsgMTk3LCAiQXJpbmciIH0sCisgIHsgMTk4LCAiQUVsaWciIH0sCisgIHsgMTk5LCAiQ2NlZGlsIiB9LAorICB7IDIwMCwgIkVncmF2ZSIgfSwKKyAgeyAyMDEsICJFYWN1dGUiIH0sCisgIHsgMjAyLCAiRWNpcmMiIH0sCisgIHsgMjAzLCAiRXVtbCIgfSwKKyAgeyAyMDQsICJJZ3JhdmUiIH0sCisgIHsgMjA1LCAiSWFjdXRlIiB9LAorICB7IDIwNiwgIkljaXJjIiB9LAorICB7IDIwNywgIkl1bWwiIH0sCisgIHsgMjA4LCAiRVRIIiB9LAorICB7IDIwOSwgIk50aWxkZSIgfSwKKyAgeyAyMTAsICJPZ3JhdmUiIH0sCisgIHsgMjExLCAiT2FjdXRlIiB9LAorICB7IDIxMiwgIk9jaXJjIiB9LAorICB7IDIxMywgIk90aWxkZSIgfSwKKyAgeyAyMTQsICJPdW1sIiB9LAorICB7IDIxNSwgInRpbWVzIiB9LAorICB7IDIxNiwgIk9zbGFzaCIgfSwKKyAgeyAyMTcsICJVZ3JhdmUiIH0sCisgIHsgMjE4LCAiVWFjdXRlIiB9LAorICB7IDIxOSwgIlVjaXJjIiB9LAorICB7IDIyMCwgIlV1bWwiIH0sCisgIHsgMjIxLCAiWWFjdXRlIiB9LAorICB7IDIyMiwgIlRIT1JOIiB9LAorICB7IDIyMywgInN6bGlnIiB9LAorICB7IDIyNCwgImFncmF2ZSIgfSwKKyAgeyAyMjUsICJhYWN1dGUiIH0sCisgIHsgMjI2LCAiYWNpcmMiIH0sCisgIHsgMjI3LCAiYXRpbGRlIiB9LAorICB7IDIyOCwgImF1bWwiIH0sCisgIHsgMjI5LCAiYXJpbmciIH0sCisgIHsgMjMwLCAiYWVsaWciIH0sCisgIHsgMjMxLCAiY2NlZGlsIiB9LAorICB7IDIzMiwgImVncmF2ZSIgfSwKKyAgeyAyMzMsICJlYWN1dGUiIH0sCisgIHsgMjM0LCAiZWNpcmMiIH0sCisgIHsgMjM1LCAiZXVtbCIgfSwKKyAgeyAyMzYsICJpZ3JhdmUiIH0sCisgIHsgMjM3LCAiaWFjdXRlIiB9LAorICB7IDIzOCwgImljaXJjIiB9LAorICB7IDIzOSwgIml1bWwiIH0sCisgIHsgMjQwLCAiZXRoIiB9LAorICB7IDI0MSwgIm50aWxkZSIgfSwKKyAgeyAyNDIsICJvZ3JhdmUiIH0sCisgIHsgMjQzLCAib2FjdXRlIiB9LAorICB7IDI0NCwgIm9jaXJjIiB9LAorICB7IDI0NSwgIm90aWxkZSIgfSwKKyAgeyAyNDYsICJvdW1sIiB9LAorICB7IDI0NywgImRpdmlkZSIgfSwKKyAgeyAyNDgsICJvc2xhc2giIH0sCisgIHsgMjQ5LCAidWdyYXZlIiB9LAorICB7IDI1MCwgInVhY3V0ZSIgfSwKKyAgeyAyNTEsICJ1Y2lyYyIgfSwKKyAgeyAyNTIsICJ1dW1sIiB9LAorICB7IDI1MywgInlhY3V0ZSIgfSwKKyAgeyAyNTQsICJ0aG9ybiIgfSwKKyAgeyAyNTUsICJ5dW1sIiB9LAorICB7ICAgMCwgTlVMTCB9Cit9OworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwIGhfZXJyb3JfY29kZXNbXSA9Cit7CisjaWZkZWYgSE9TVF9OT1RfRk9VTkQgICAKKyAgeyBIT1NUX05PVF9GT1VORCwgIkhvc3Qgbm90IGZvdW5kIiB9LAorI2VuZGlmCisjaWZkZWYgVFJZX0FHQUlOCisgIHsgVFJZX0FHQUlOLCAiVHJ5IEFnYWluIiB9LAorI2VuZGlmCisjaWZkZWYgTk9fUkVDT1ZFUlkgIAorICB7IE5PX1JFQ09WRVJZLCAiTm8gUmVjb3ZlcnkiIH0sCisjZW5kaWYKKyNpZmRlZiBOT19EQVRBCisgIHsgTk9fREFUQSwgIk5vIERhdGEiIH0sCisjZW5kaWYKKyNpZmRlZiBOT19BRERSRVNTCisgIHsgTk9fQUREUkVTUywgIk5vIEFkZHJlc3MiIH0sCisjZW5kaWYKKyAgeyAwLCBOVUxMIH0KK307CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwIGhfaHR0cF9lcnJvcl9jb2Rlc1tdID0KK3sgeyAyMDEsICJDcmVhdGVkIiB9LAorICB7IDIwMiwgIkFjY2VwdGVkIiB9LAorICB7IDIwMywgIk5vbi1BdXRob3JpdGF0aXZlIEluZm9ybWF0aW9uIiB9LAorICB7IDIwNCwgIk5vIENvbnRlbnQiIH0sCisgIHsgMjA1LCAiUmVzZXQgQ29udGVudCIgfSwKKyAgeyAyMDYsICJQYXJ0aWFsIENvbnRlbnQiIH0sCisgIHsgMzAwLCAiTXVsdGlwbGUgQ2hvaWNlcyIgfSwKKyAgeyAzMDEsICJNb3ZlZCBQZXJtYW5lbnRseSIgfSwKKyAgeyAzMDIsICJGb3VuZCIgfSwKKyAgeyAzMDMsICJTZWUgT3RoZXIiIH0sCisgIHsgMzA0LCAiTm90IE1vZGlmaWVkIiB9LAorICB7IDMwNSwgIlVzZSBQcm94eSIgfSwKKyAgeyAzMDcsICJUZW1wb3JhcnkgUmVkaXJlY3QiIH0sCisgIHsgNDAwLCAiQmFkIFJlcXVlc3QiIH0sCisgIHsgNDAxLCAiVW5hdXRob3JpemVkIiB9LAorICB7IDQwMiwgIlBheW1lbnQgUmVxdWlyZWQiIH0sCisgIHsgNDAzLCAiRm9yYmlkZGVuIiB9LAorICB7IDQwNCwgIk5vdCBGb3VuZCIgfSwKKyAgeyA0MDUsICJNZXRob2QgTm90IEFsbG93ZWQiIH0sCisgIHsgNDA2LCAiTm90IEFjY2VwdGFibGUiIH0sCisgIHsgNDA3LCAiUHJveHkgQXV0aGVudGljYXRpb24gUmVxdWlyZWQiIH0sCisgIHsgNDA4LCAiUmVxdWVzdCBUaW1lLW91dCIgfSwKKyAgeyA0MDksICJDb25mbGljdCIgfSwKKyAgeyA0MTAsICJHb25lIiB9LAorICB7IDQxMSwgIkxlbmd0aCBSZXF1aXJlZCIgfSwKKyAgeyA0MTIsICJQcmVjb25kaXRpb24gRmFpbGVkIiB9LAorICB7IDQxMywgIlJlcXVlc3QgRW50aXR5IFRvbyBMYXJnZSIgfSwKKyAgeyA0MTQsICJSZXF1ZXN0LVVSSSBUb28gTGFyZ2UiIH0sCisgIHsgNDE1LCAiVW5zdXBwb3J0ZWQgTWVkaWEgVHlwZSIgfSwKKyAgeyA0MTYsICJSZXF1ZXN0ZWQgcmFuZ2Ugbm90IHNhdGlzZmlhYmxlIiB9LAorICB7IDQxNywgIkV4cGVjdGF0aW9uIEZhaWxlZCIgfSwKKyAgeyA1MDAsICJJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IiIH0sCisgIHsgNTAxLCAiTm90IEltcGxlbWVudGVkIiB9LAorICB7IDUwMiwgIkJhZCBHYXRld2F5IiB9LAorICB7IDUwMywgIlNlcnZpY2UgVW5hdmFpbGFibGUiIH0sCisgIHsgNTA0LCAiR2F0ZXdheSBUaW1lLW91dCIgfSwKKyAgeyA1MDUsICJIVFRQIFZlcnNpb24gbm90IHN1cHBvcnRlZCIgfSwKKyAgeyAgIDAsIE5VTEwgfQorfTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBXSVRIX09QRU5TU0wKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCBoX3NzbF9lcnJvcl9jb2Rlc1tdID0KK3sKKyNkZWZpbmUgX1NTTF9FUlJPUihlKSB7IGUsICNlIH0KKyAgX1NTTF9FUlJPUihTU0xfRVJST1JfU1NMKSwKKyAgX1NTTF9FUlJPUihTU0xfRVJST1JfWkVST19SRVRVUk4pLAorICBfU1NMX0VSUk9SKFNTTF9FUlJPUl9XQU5UX1JFQUQpLAorICBfU1NMX0VSUk9SKFNTTF9FUlJPUl9XQU5UX1dSSVRFKSwKKyAgX1NTTF9FUlJPUihTU0xfRVJST1JfV0FOVF9DT05ORUNUKSwKKyAgX1NTTF9FUlJPUihTU0xfRVJST1JfV0FOVF9YNTA5X0xPT0tVUCksCisgIF9TU0xfRVJST1IoU1NMX0VSUk9SX1NZU0NBTEwpLAorICB7IDAsIE5VTEwgfQorfTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTkVSCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgbWltZV9jb2Rlc1tdID0KK3sgeyBTT0FQX01JTUVfN0JJVCwJCSI3Yml0IiB9LAorICB7IFNPQVBfTUlNRV84QklULAkJIjhiaXQiIH0sCisgIHsgU09BUF9NSU1FX0JJTkFSWSwJCSJiaW5hcnkiIH0sCisgIHsgU09BUF9NSU1FX1FVT1RFRF9QUklOVEFCTEUsICJxdW90ZWQtcHJpbnRhYmxlIiB9LAorICB7IFNPQVBfTUlNRV9CQVNFNjQsCQkiYmFzZTY0IiB9LAorICB7IFNPQVBfTUlNRV9JRVRGX1RPS0VOLAkiaWV0Zi10b2tlbiIgfSwKKyAgeyBTT0FQX01JTUVfWF9UT0tFTiwJCSJ4LXRva2VuIiB9LAorICB7IDAsCQkJCU5VTEwgfQorfTsKKyNlbmRpZgorCisjaWZkZWYgV0lOMzIKK3N0YXRpYyBpbnQgdGNwX2RvbmUgPSAwOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK2ZzZW5kKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBzaXplX3QgbikKK3sgcmVnaXN0ZXIgaW50IG53cml0dGVuOworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpICYmICFkZWZpbmVkKFdJVEhfTEVBTikKKyAgaWYgKHNvYXAtPm9zKQorICB7IHNvYXAtPm9zLT53cml0ZShzLCBuKTsKKyAgICBpZiAoc29hcC0+b3MtPmdvb2QoKSkKKyAgICAgIHJldHVybiBTT0FQX09LOworICAgIHJldHVybiBTT0FQX0VPRjsKKyAgfQorI2VuZGlmCisgIHdoaWxlIChuKQorICB7IGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICAgIHsgCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgaWYgKHNvYXAtPnNlbmRfdGltZW91dCkKKyAgICAgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgICAgZmRfc2V0IGZkOworICAgICAgICBpZiAoc29hcC0+c2VuZF90aW1lb3V0ID4gMCkKKyAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IHNvYXAtPnNlbmRfdGltZW91dDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IC1zb2FwLT5zZW5kX3RpbWVvdXQvMTAwMDAwMDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAtc29hcC0+c2VuZF90aW1lb3V0JTEwMDAwMDA7CisgICAgICAgIH0KKyAgICAgICAgRkRfWkVSTygmZmQpOworICAgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJmZkKTsKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeyByZWdpc3RlciBpbnQgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCBOVUxMLCAmZmQsICZmZCwgJnRpbWVvdXQpOworICAgICAgICAgIGlmIChyID4gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGlmICghcikKKyAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IDA7CisgICAgICAgICAgICByZXR1cm4gU09BUF9FT0Y7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUFHQUlOKQorICAgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgICByZXR1cm4gU09BUF9FT0Y7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICAgIGlmIChzb2FwLT5zc2wpCisgICAgICAgIG53cml0dGVuID0gU1NMX3dyaXRlKHNvYXAtPnNzbCwgcywgbik7CisgICAgICBlbHNlIGlmIChzb2FwLT5iaW8pCisgICAgICAgIG53cml0dGVuID0gQklPX3dyaXRlKHNvYXAtPmJpbywgcywgbik7CisgICAgICBlbHNlCisjZW5kaWYKKyNpZmRlZiBXSVRIX1VEUAorICAgICAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICAgIHsgaWYgKHNvYXAtPnBlZXJsZW4pCisJICBud3JpdHRlbiA9IHNlbmR0bygoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyLCBzb2FwLT5wZWVybGVuKTsKKyAgICAgICAgZWxzZQorCSAgbndyaXR0ZW4gPSBzZW5kKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHMsIG4sIHNvYXAtPnNvY2tldF9mbGFncyk7CisJLyogcmV0cnkgYW5kIGJhY2stb2ZmIGFsZ29yaXRobSAqLworCS8qIFRPRE86IHRoaXMgaXMgbm90IHZlcnkgY2xlYXIgZnJvbSBzcGVjcyBzbyB2ZXJpZnkgYW5kIGxpbWl0IGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggd2Ugc2hvdWxkIGxvb3AgKGUuZy4gRU5PQlVGUykgKi8KKwlpZiAobndyaXR0ZW4gPCAwKQorICAgICAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICAgICAgZmRfc2V0IGZkOworCSAgaW50IHVkcF9yZXBlYXQ7CisJICBpbnQgdWRwX2RlbGF5OworICAgICAgICAgIGlmICgoc29hcC0+Y29ubmVjdF9mbGFncyAmIFNPX0JST0FEQ0FTVCkpCisJICAgIHVkcF9yZXBlYXQgPSAzOyAvKiBTT0FQLW92ZXItVURQIE1VTFRJQ0FTVF9VRFBfUkVQRUFUIC0gMSAqLworICAgICAgICAgIGVsc2UKKwkgICAgdWRwX3JlcGVhdCA9IDE7IC8qIFNPQVAtb3Zlci1VRFAgVU5JQ0FTVF9VRFBfUkVQRUFUIC0gMSAqLworCSAgdWRwX2RlbGF5ID0gKHNvYXBfcmFuZG9tICUgMjAxKSArIDUwOyAvKiBVRFBfTUlOX0RFTEFZIC4uIFVEUF9NQVhfREVMQVkgKi8KKwkgIGRvCisgICAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IDA7CisgICAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAxMDAwICogdWRwX2RlbGF5OyAvKiBtcyAqLworICAgICAgICAgICAgRkRfWkVSTygmZmQpOworICAgICAgICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZmZCk7CisgICAgICAgICAgICBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgTlVMTCwgTlVMTCwgJmZkLCAmdGltZW91dCk7CisJICAgIGlmIChzb2FwLT5wZWVybGVuKQorCSAgICAgIG53cml0dGVuID0gc2VuZHRvKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHMsIG4sIHNvYXAtPnNvY2tldF9mbGFncywgKHN0cnVjdCBzb2NrYWRkciopJnNvYXAtPnBlZXIsIHNvYXAtPnBlZXJsZW4pOworICAgICAgICAgICAgZWxzZQorCSAgICAgIG53cml0dGVuID0gc2VuZCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MpOworCSAgICB1ZHBfZGVsYXkgPDw9IDE7CisJICAgIGlmICh1ZHBfZGVsYXkgPiA1MDApIC8qIFVEUF9VUFBFUl9ERUxBWSAqLworCSAgICAgIHVkcF9kZWxheSA9IDUwMDsKKwkgIH0KKwkgIHdoaWxlIChud3JpdHRlbiA8IDAgJiYgLS11ZHBfcmVwZWF0ID4gMCk7CisJfQorICAgICAgfQorICAgICAgZWxzZQorI2VuZGlmCisjaWYgIWRlZmluZWQoUEFMTSkgJiYgIWRlZmluZWQoQVM0MDApCisgICAgICAgIG53cml0dGVuID0gc2VuZCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MpOworI2Vsc2UKKyAgICAgICAgbndyaXR0ZW4gPSBzZW5kKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICh2b2lkKilzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MpOworI2VuZGlmCisgICAgICBpZiAobndyaXR0ZW4gPD0gMCkKKyAgICAgIHsKKyNpZmRlZiBXSVRIX09QRU5TU0wKKwlpbnQgZXJyOworICAgICAgICBpZiAoc29hcC0+c3NsICYmIChlcnIgPSBTU0xfZ2V0X2Vycm9yKHNvYXAtPnNzbCwgbndyaXR0ZW4pKSAhPSBTU0xfRVJST1JfTk9ORSAmJiBlcnIgIT0gU1NMX0VSUk9SX1dBTlRfUkVBRCAmJiBlcnIgIT0gU1NMX0VSUk9SX1dBTlRfV1JJVEUpCisgICAgICAgICAgcmV0dXJuIFNPQVBfRU9GOworI2VuZGlmCisgICAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRVdPVUxEQkxPQ0sgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FQUdBSU4pCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgcmV0dXJuIFNPQVBfRU9GOworICAgICAgICB9CisgICAgICAgIG53cml0dGVuID0gMDsgLyogYW5kIGNhbGwgd3JpdGUoKSBhZ2FpbiAqLworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworI2lmZGVmIFdJVEhfRkFTVENHSQorICAgICAgbndyaXR0ZW4gPSBmd3JpdGUoKHZvaWQqKXMsIDEsIG4sIHN0ZG91dCk7CisgICAgICBmZmx1c2goc3Rkb3V0KTsKKyNlbHNlCisjaWZkZWYgVU5ERVJfQ0UKKyAgICAgIG53cml0dGVuID0gZndyaXRlKHMsIDEsIG4sIHNvYXAtPnNlbmRmZCk7CisjZWxzZQorI2lmZGVmIFZYV09SS1MKKyNpZmRlZiBXTVdfUlBNX0lPCisgICAgICBpZiAoc29hcC0+cnBtcmVxaWQpCisgICAgICAgIG53cml0dGVuID0gKGh0dHBCbG9ja1B1dChzb2FwLT5ycG1yZXFpZCwgcywgbikgPT0gMCkgPyBuIDogLTE7IAorICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgIG53cml0dGVuID0gZndyaXRlKHMsIHNpemVvZihjaGFyKSwgbiwgZmRvcGVuKHNvYXAtPnNlbmRmZCwgInciKSk7CisjZWxzZQorICAgICAgbndyaXR0ZW4gPSB3cml0ZSgoU09BUF9TT0NLRVQpc29hcC0+c2VuZGZkLCBzLCBuKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyAgICAgIGlmIChud3JpdHRlbiA8PSAwKQorICAgICAgeyBpZiAoc29hcF9lcnJubyAhPSBTT0FQX0VJTlRSICYmIHNvYXBfZXJybm8gIT0gU09BUF9FV09VTERCTE9DSyAmJiBzb2FwX2Vycm5vICE9IFNPQVBfRUFHQUlOKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfZXJybm87CisgICAgICAgICAgcmV0dXJuIFNPQVBfRU9GOworICAgICAgICB9CisgICAgICAgIG53cml0dGVuID0gMDsgLyogYW5kIGNhbGwgd3JpdGUoKSBhZ2FpbiAqLworICAgICAgfQorICAgIH0KKyAgICBuIC09IG53cml0dGVuOworICAgIHMgKz0gbndyaXR0ZW47CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZW5kX3JhdyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgc2l6ZV90IG4pCit7IGlmICghbikKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgeyBzb2FwLT5jb3VudCArPSBuOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICAgIGlmIChzb2FwLT5mcHJlcGFyZXNlbmQgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSAhPSBTT0FQX0lPX1NUT1JFKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gc29hcC0+ZnByZXBhcmVzZW5kKHNvYXAsIHMsIG4pOworI2VuZGlmCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKQorICB7IHJlZ2lzdGVyIHNpemVfdCBpID0gU09BUF9CVUZMRU4gLSBzb2FwLT5idWZpZHg7CisgICAgd2hpbGUgKG4gPj0gaSkKKyAgICB7IG1lbWNweShzb2FwLT5idWYgKyBzb2FwLT5idWZpZHgsIHMsIGkpOworICAgICAgc29hcC0+YnVmaWR4ID0gU09BUF9CVUZMRU47CisgICAgICBpZiAoc29hcF9mbHVzaChzb2FwKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgcyArPSBpOworICAgICAgbiAtPSBpOworICAgICAgaSA9IFNPQVBfQlVGTEVOOworICAgIH0KKyAgICBtZW1jcHkoc29hcC0+YnVmICsgc29hcC0+YnVmaWR4LCBzLCBuKTsKKyAgICBzb2FwLT5idWZpZHggKz0gbjsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICByZXR1cm4gc29hcF9mbHVzaF9yYXcoc29hcCwgcywgbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZmx1c2goc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBuID0gc29hcC0+YnVmaWR4OworICBpZiAobikKKyAgeyBzb2FwLT5idWZpZHggPSAwOworI2lmZGVmIFdJVEhfWkxJQgorICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQikKKyAgICB7IHNvYXAtPmRfc3RyZWFtLm5leHRfaW4gPSAoQnl0ZSopc29hcC0+YnVmOworICAgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4gPSAodW5zaWduZWQgaW50KW47CisjaWZkZWYgV0lUSF9HWklQCisgICAgICBzb2FwLT56X2NyYyA9IGNyYzMyKHNvYXAtPnpfY3JjLCAoQnl0ZSopc29hcC0+YnVmLCAodW5zaWduZWQgaW50KW4pOworI2VuZGlmCisgICAgICBkbworICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlZmxhdGluZyAldSBieXRlc1xuIiwgc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4pKTsKKyAgICAgICAgaWYgKGRlZmxhdGUoJnNvYXAtPmRfc3RyZWFtLCBaX05PX0ZMVVNIKSAhPSBaX09LKQorICAgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVW5hYmxlIHRvIGRlZmxhdGU6ICVzXG4iLCBzb2FwLT5kX3N0cmVhbS5tc2c/c29hcC0+ZF9zdHJlYW0ubXNnOiIiKSk7CisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGlmICghc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0KQorICAgICAgICB7IGlmIChzb2FwX2ZsdXNoX3Jhdyhzb2FwLCBzb2FwLT56X2J1ZiwgU09BUF9CVUZMRU4pKQorICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gKEJ5dGUqKXNvYXAtPnpfYnVmOworICAgICAgICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCA9IFNPQVBfQlVGTEVOOworICAgICAgICB9CisgICAgICB9IHdoaWxlIChzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbik7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgICAgcmV0dXJuIHNvYXBfZmx1c2hfcmF3KHNvYXAsIHNvYXAtPmJ1Ziwgbik7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZmx1c2hfcmF3KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBzaXplX3QgbikKK3sgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19TVE9SRSkKKyAgeyByZWdpc3RlciBjaGFyICp0OworICAgIGlmICghKHQgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIG4pKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIG1lbWNweSh0LCBzLCBuKTsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgICBpZiAoc29hcC0+ZnByZXBhcmVzZW5kKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gc29hcC0+ZnByZXBhcmVzZW5kKHNvYXAsIHMsIG4pOworI2VuZGlmCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgeyBjaGFyIHRbMTZdOworICAgIHNwcmludGYodCwgIlxyXG4lbFhcclxuIiArIChzb2FwLT5jaHVua3NpemUgPyAwIDogMiksICh1bnNpZ25lZCBsb25nKW4pOworICAgIERCR01TRyhTRU5ULCB0LCBzdHJsZW4odCkpOworICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mc2VuZChzb2FwLCB0LCBzdHJsZW4odCkpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBzb2FwLT5jaHVua3NpemUgKz0gbjsKKyAgfQorICBEQkdNU0coU0VOVCwgcywgbik7CisjZW5kaWYKKyAgcmV0dXJuIHNvYXAtPmVycm9yID0gc29hcC0+ZnNlbmQoc29hcCwgcywgbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2VuZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcykKK3sgaWYgKHMpCisgICAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgcywgc3RybGVuKHMpKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2VuZDIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMikKK3sgaWYgKHNvYXBfc2VuZChzb2FwLCBzMSkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9zZW5kKHNvYXAsIHMyKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmQzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIGNvbnN0IGNoYXIgKnMzKQoreyBpZiAoc29hcF9zZW5kKHNvYXAsIHMxKQorICAgfHwgc29hcF9zZW5kKHNvYXAsIHMyKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX3NlbmQoc29hcCwgczMpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHNpemVfdAorZnJlY3Yoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnMsIHNpemVfdCBuKQoreyByZWdpc3RlciBpbnQgcjsKKyAgc29hcC0+ZXJybnVtID0gMDsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiAhZGVmaW5lZChXSVRIX0xFQU4pCisgIGlmIChzb2FwLT5pcykKKyAgeyBpZiAoc29hcC0+aXMtPmdvb2QoKSkKKyAgICAgIHJldHVybiBzb2FwLT5pcy0+cmVhZChzLCBuKS5nY291bnQoKTsKKyAgICByZXR1cm4gMDsKKyAgfQorI2VuZGlmCisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICB7IGZvciAoOzspCisgICAgeyAKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICBpZiAoc29hcC0+cmVjdl90aW1lb3V0KQorICAgICAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgICAgICBmZF9zZXQgZmQ7CisgICAgICAgIGlmIChzb2FwLT5yZWN2X3RpbWVvdXQgPiAwKQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gc29hcC0+cmVjdl90aW1lb3V0OworICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gLXNvYXAtPnJlY3ZfdGltZW91dC8xMDAwMDAwOworICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IC1zb2FwLT5yZWN2X3RpbWVvdXQlMTAwMDAwMDsKKyAgICAgICAgfQorICAgICAgICBGRF9aRVJPKCZmZCk7CisgICAgICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmZmQpOworICAgICAgICBmb3IgKDs7KQorICAgICAgICB7IHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgJmZkLCBOVUxMLCAmZmQsICZ0aW1lb3V0KTsKKyAgICAgICAgICBpZiAociA+IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBpZiAoIXIpCisJICB7IHNvYXAtPmVycm51bSA9IDA7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FQUdBSU4pCisJICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICAgIGlmIChzb2FwLT5zc2wpCisgICAgICB7IGludCBlcnI7CisJciA9IFNTTF9yZWFkKHNvYXAtPnNzbCwgcywgbik7CisgICAgICAgIGlmIChyID4gMCkKKyAgICAgICAgICByZXR1cm4gKHNpemVfdClyOworCWVyciA9IFNTTF9nZXRfZXJyb3Ioc29hcC0+c3NsLCByKTsKKwlpZiAoZXJyICE9IFNTTF9FUlJPUl9OT05FICYmIGVyciAhPSBTU0xfRVJST1JfV0FOVF9SRUFEICYmIGVyciAhPSBTU0xfRVJST1JfV0FOVF9XUklURSkKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHNvYXAtPmJpbykKKyAgICAgIHsgciA9IEJJT19yZWFkKHNvYXAtPmJpbywgcywgbik7CisgICAgICAgIGlmIChyID4gMCkKKyAgICAgICAgICByZXR1cm4gKHNpemVfdClyOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgeyAKKyNpZmRlZiBXSVRIX1VEUAorICAgICAgICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgICAgICB7IFNPQVBfU09DS0xFTl9UIGsgPSAoU09BUF9TT0NLTEVOX1Qpc2l6ZW9mKHNvYXAtPnBlZXIpOworCSAgbWVtc2V0KCh2b2lkKikmc29hcC0+cGVlciwgMCwgc2l6ZW9mKHNvYXAtPnBlZXIpKTsKKyAgICAgICAgICByID0gcmVjdmZyb20oKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgcywgbiwgc29hcC0+c29ja2V0X2ZsYWdzLCAoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlciwgJmspOwkvKiBwb3J0YWJpbGl0eSBub3RlOiBzZWUgU09BUF9TT0NLTEVOX1QgZGVmaW5pdGlvbiBpbiBzdGRzb2FwMi5oICovCisJICBzb2FwLT5wZWVybGVuID0gKHNpemVfdClrOworI2lmbmRlZiBXSVRIX0lQVjYKKyAgICAgICAgICBzb2FwLT5pcCA9IG50b2hsKHNvYXAtPnBlZXIuc2luX2FkZHIuc19hZGRyKTsKKyAgICAgICAgICBzb2FwLT5wb3J0ID0gKGludCludG9ocyhzb2FwLT5wZWVyLnNpbl9wb3J0KTsKKyNlbmRpZgorICAgICAgICB9CisJZWxzZQorI2VuZGlmCisgICAgICAgICAgciA9IHJlY3YoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgcywgbiwgc29hcC0+c29ja2V0X2ZsYWdzKTsKKyAgICAgICAgaWYgKHIgPj0gMCkKKyAgICAgICAgICByZXR1cm4gKHNpemVfdClyOworICAgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUiAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VBR0FJTiAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VXT1VMREJMT0NLKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICB9CisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgICAgICBmZF9zZXQgZmQ7CisgICAgICAgIHRpbWVvdXQudHZfc2VjID0gMDsKKyAgICAgICAgdGltZW91dC50dl91c2VjID0gMTAwMDA7CisgICAgICAgIEZEX1pFUk8oJmZkKTsKKyAgICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZmZCk7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgICAgICAgIGlmIChzb2FwLT5zc2wgJiYgU1NMX2dldF9lcnJvcihzb2FwLT5zc2wsIHIpID09IFNTTF9FUlJPUl9XQU5UX1dSSVRFKQorICAgICAgICAgIHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgTlVMTCwgJmZkLCAmZmQsICZ0aW1lb3V0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgJmZkLCBOVUxMLCAmZmQsICZ0aW1lb3V0KTsKKyNlbHNlCisgICAgICAgIHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgJmZkLCBOVUxMLCAmZmQsICZ0aW1lb3V0KTsKKyNlbmRpZgorICAgICAgICBpZiAociA8IDAgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUikKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisgICAgfQorICB9CisjaWZkZWYgV0lUSF9GQVNUQ0dJCisgIHJldHVybiBmcmVhZChzLCAxLCBuLCBzdGRpbik7CisjZWxzZQorI2lmZGVmIFVOREVSX0NFCisgIHJldHVybiBmcmVhZChzLCAxLCBuLCBzb2FwLT5yZWN2ZmQpOworI2Vsc2UKKyNpZmRlZiBXTVdfUlBNX0lPCisgIGlmIChzb2FwLT5ycG1yZXFpZCkKKyAgICByID0gaHR0cEJsb2NrUmVhZChzb2FwLT5ycG1yZXFpZCwgcywgbik7CisgIGVsc2UKKyNlbmRpZgorICByID0gcmVhZCgoU09BUF9TT0NLRVQpc29hcC0+cmVjdmZkLCBzLCBuKTsKKyAgaWYgKHIgPj0gMCkKKyAgICByZXR1cm4gKHNpemVfdClyOworICBzb2FwLT5lcnJudW0gPSBzb2FwX2Vycm5vOworICByZXR1cm4gMDsKKyNlbmRpZgorI2VuZGlmCit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzb2FwX3djaGFyCitzb2FwX2dldGNodW5rY2hhcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXAtPmJ1ZmlkeCA8IHNvYXAtPmJ1ZmxlbikKKyAgICByZXR1cm4gc29hcC0+YnVmW3NvYXAtPmJ1ZmlkeCsrXTsKKyAgc29hcC0+YnVmaWR4ID0gMDsKKyAgc29hcC0+YnVmbGVuID0gc29hcC0+Y2h1bmtidWZsZW4gPSBzb2FwLT5mcmVjdihzb2FwLCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOKTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWFkICV1IGJ5dGVzIGZyb20gc29ja2V0ICVkXG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmJ1Zmxlbiwgc29hcC0+c29ja2V0KSk7CisgIERCR01TRyhSRUNWLCBzb2FwLT5idWYsIHNvYXAtPmJ1Zmxlbik7CisgIGlmIChzb2FwLT5idWZsZW4pCisgICAgcmV0dXJuIHNvYXAtPmJ1Zltzb2FwLT5idWZpZHgrK107CisgIHJldHVybiBFT0Y7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NvYXBfaXN4ZGlnaXQoaW50IGMpCit7IHJldHVybiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHx8IChjID49ICdBJyAmJiBjIDw9ICdGJykgfHwgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWN2X3JhdyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc2l6ZV90IHJldDsKKyNpZmRlZiBXSVRIX1pMSUIKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKQorICB7IGlmIChzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9PSBaX05VTEwpCisgICAgICByZXR1cm4gRU9GOworICAgIGlmIChzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbiB8fCAhc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0KQorICAgIHsgcmVnaXN0ZXIgaW50IHI7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluZmxhdGluZ1xuIikpOworICAgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZSopc29hcC0+YnVmOworICAgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0ID0gU09BUF9CVUZMRU47CisgICAgICByID0gaW5mbGF0ZSgmc29hcC0+ZF9zdHJlYW0sIFpfTk9fRkxVU0gpOworICAgICAgaWYgKHIgPT0gWl9PSyB8fCByID09IFpfU1RSRUFNX0VORCkKKyAgICAgIHsgc29hcC0+YnVmaWR4ID0gMDsKKyAgICAgICAgc29hcC0+YnVmbGVuID0gU09BUF9CVUZMRU4gLSBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQ7CisgICAgICAgIGlmIChzb2FwLT56bGliX2luID09IFNPQVBfWkxJQl9HWklQKQorICAgICAgICAgIHNvYXAtPnpfY3JjID0gY3JjMzIoc29hcC0+el9jcmMsIChCeXRlKilzb2FwLT5idWYsICh1bnNpZ25lZCBpbnQpc29hcC0+YnVmbGVuKTsKKyAgICAgICAgaWYgKHIgPT0gWl9TVFJFQU1fRU5EKQorICAgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5mbGF0ZWQgJWx1LT4lbHUgYnl0ZXNcbiIsIHNvYXAtPmRfc3RyZWFtLnRvdGFsX2luLCBzb2FwLT5kX3N0cmVhbS50b3RhbF9vdXQpKTsKKyAgICAgICAgICBzb2FwLT56X3JhdGlvX2luID0gKGZsb2F0KXNvYXAtPmRfc3RyZWFtLnRvdGFsX2luIC8gKGZsb2F0KXNvYXAtPmRfc3RyZWFtLnRvdGFsX291dDsKKyAgICAgICAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IFpfTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc29hcC0+YnVmbGVuKQorICAgICAgICB7IHNvYXAtPmNvdW50ICs9IHNvYXAtPmJ1ZmxlbjsKKyAgICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSBpZiAociAhPSBaX0JVRl9FUlJPUikKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbmZsYXRlIGVycm9yOiAlc1xuIiwgc29hcC0+ZF9zdHJlYW0ubXNnP3NvYXAtPmRfc3RyZWFtLm1zZzoiIikpOworICAgICAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IFpfTlVMTDsKKwlzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEVPRjsKKyAgICAgIH0KKyAgICB9Cit6bGliX2FnYWluOgorICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTksgJiYgIXNvYXAtPmNodW5rc2l6ZSkKKyAgICB7IG1lbWNweShzb2FwLT5idWYsIHNvYXAtPnpfYnVmLCBTT0FQX0JVRkxFTik7CisgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT56X2J1ZmxlbjsKKyAgICB9CisgIH0KKyNlbmRpZgorI2lmbmRlZiBXSVRIX05PSFRUUAorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKSAvKiByZWFkIEhUVFAgY2h1bmtlZCB0cmFuc2ZlciAqLworICB7IAorY2h1bmtfYWdhaW46CisgICAgaWYgKHNvYXAtPmNodW5rc2l6ZSkKKyAgICB7IHNvYXAtPmJ1ZmxlbiA9IHJldCA9IHNvYXAtPmZyZWN2KHNvYXAsIHNvYXAtPmJ1Ziwgc29hcC0+Y2h1bmtzaXplID4gU09BUF9CVUZMRU4gPyBTT0FQX0JVRkxFTiA6IHNvYXAtPmNodW5rc2l6ZSk7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdldHRpbmcgY2h1bms6IHJlYWQgJXUgYnl0ZXNcbiIsICh1bnNpZ25lZCBpbnQpcmV0KSk7CisgICAgICBEQkdNU0coUkVDViwgc29hcC0+YnVmLCByZXQpOworICAgICAgc29hcC0+YnVmaWR4ID0gMDsKKyAgICAgIHNvYXAtPmNodW5rc2l6ZSAtPSByZXQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgICAgIGNoYXIgKnQsIHRtcFs4XTsKKyAgICAgIHQgPSB0bXA7CisgICAgICBpZiAoIXNvYXAtPmNodW5rYnVmbGVuKQorICAgICAgeyBzb2FwLT5jaHVua2J1ZmxlbiA9IHJldCA9IHNvYXAtPmZyZWN2KHNvYXAsIHNvYXAtPmJ1ZiwgU09BUF9CVUZMRU4pOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlYWQgJXUgYnl0ZXMgKGNodW5rZWQpIGZyb20gc29ja2V0ICVkXG4iLCAodW5zaWduZWQgaW50KXJldCwgc29hcC0+c29ja2V0KSk7CisgICAgICAgIERCR01TRyhSRUNWLCBzb2FwLT5idWYsIHJldCk7CisgICAgICAgIHNvYXAtPmJ1ZmlkeCA9IDA7CisgICAgICAgIGlmICghcmV0KQorICAgICAgICAgIHJldHVybiBzb2FwLT5haGVhZCA9IEVPRjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgc29hcC0+YnVmaWR4ID0gc29hcC0+YnVmbGVuOworICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+Y2h1bmtidWZsZW47CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdldHRpbmcgY2h1bmsgc2l6ZSAoaWR4PSV1IGxlbj0ldSlcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+YnVmaWR4LCAodW5zaWduZWQgaW50KXNvYXAtPmJ1ZmxlbikpOworICAgICAgd2hpbGUgKCFzb2FwX2lzeGRpZ2l0KChpbnQpKGMgPSBzb2FwX2dldGNodW5rY2hhcihzb2FwKSkpKQorICAgICAgICBpZiAoKGludCljID09IEVPRikKKwkgIHJldHVybiBzb2FwLT5haGVhZCA9IEVPRjsKKyAgICAgIGRvCisgICAgICAgICp0KysgPSAoY2hhciljOworICAgICAgd2hpbGUgKHNvYXBfaXN4ZGlnaXQoKGludCkoYyA9IHNvYXBfZ2V0Y2h1bmtjaGFyKHNvYXApKSkgJiYgdCAtIHRtcCA8IDcpOworICAgICAgd2hpbGUgKChpbnQpYyAhPSBFT0YgJiYgYyAhPSAnXG4nKQorICAgICAgICBjID0gc29hcF9nZXRjaHVua2NoYXIoc29hcCk7CisgICAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgcmV0dXJuIHNvYXAtPmFoZWFkID0gRU9GOworICAgICAgKnQgPSAnXDAnOworICAgICAgc29hcC0+Y2h1bmtzaXplID0gc29hcF9zdHJ0b3VsKHRtcCwgJnQsIDE2KTsKKyAgICAgIGlmICghc29hcC0+Y2h1bmtzaXplKQorICAgICAgeyBzb2FwLT5jaHVua2J1ZmxlbiA9IDA7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIG9mIGNodW5rZWQgbWVzc2FnZVxuIikpOworCXdoaWxlICgoaW50KWMgIT0gRU9GICYmIGMgIT0gJ1xuJykKKyAgICAgICAgICBjID0gc29hcF9nZXRjaHVua2NoYXIoc29hcCk7CisgICAgICAgIHJldHVybiBzb2FwLT5haGVhZCA9IEVPRjsKKyAgICAgIH0KKyAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmJ1ZmlkeCArIHNvYXAtPmNodW5rc2l6ZTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTW92aW5nIGJ1ZiBsZW4gdG8gaWR4PSV1IGxlbj0ldSAoJXMpXG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmJ1ZmlkeCwgKHVuc2lnbmVkIGludClzb2FwLT5idWZsZW4sIHRtcCkpOworICAgICAgaWYgKHNvYXAtPmJ1ZmxlbiA+IHNvYXAtPmNodW5rYnVmbGVuKQorICAgICAgeyBzb2FwLT5idWZsZW4gPSBzb2FwLT5jaHVua2J1ZmxlbjsKKyAgICAgICAgc29hcC0+Y2h1bmtzaXplIC09IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICAgICAgc29hcC0+Y2h1bmtidWZsZW4gPSAwOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlBhc3NlZCBlbmQgb2YgYnVmZmVyIGZvciBjaHVua2VkIEhUVFAgKCV1IGJ5dGVzIGxlZnQpXG4iLCAodW5zaWduZWQgaW50KShzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHgpKSk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChzb2FwLT5jaHVua2J1ZmxlbikKKyAgICAgICAgc29hcC0+Y2h1bmtzaXplID0gMDsKKyAgICAgIHJldCA9IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICAgIGlmICghcmV0KQorICAgICAgICBnb3RvIGNodW5rX2FnYWluOworICAgIH0KKyAgfQorICBlbHNlCisjZW5kaWYKKyAgeyBzb2FwLT5idWZpZHggPSAwOworICAgIHNvYXAtPmJ1ZmxlbiA9IHJldCA9IHNvYXAtPmZyZWN2KHNvYXAsIHNvYXAtPmJ1ZiwgU09BUF9CVUZMRU4pOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVhZCAldSBieXRlcyBmcm9tIHNvY2tldCAlZFxuIiwgKHVuc2lnbmVkIGludClyZXQsIHNvYXAtPnNvY2tldCkpOworICAgIERCR01TRyhSRUNWLCBzb2FwLT5idWYsIHJldCk7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPmZwcmVwYXJlcmVjdiAmJiAoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcHJlcGFyZXJlY3Yoc29hcCwgc29hcC0+YnVmLCByZXQpKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjZW5kaWYKKyNpZmRlZiBXSVRIX1pMSUIKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKQorICB7IHJlZ2lzdGVyIGludCByOworICAgIG1lbWNweShzb2FwLT56X2J1Ziwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTik7CisgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9pbiA9IChCeXRlKikoc29hcC0+el9idWYgKyBzb2FwLT5idWZpZHgpOworICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luID0gKHVuc2lnbmVkIGludClyZXQ7CisgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZSopc29hcC0+YnVmOworICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCA9IFNPQVBfQlVGTEVOOworICAgIHIgPSBpbmZsYXRlKCZzb2FwLT5kX3N0cmVhbSwgWl9OT19GTFVTSCk7CisgICAgaWYgKHIgPT0gWl9PSyB8fCByID09IFpfU1RSRUFNX0VORCkKKyAgICB7IHNvYXAtPmJ1ZmlkeCA9IDA7CisgICAgICBzb2FwLT56X2J1ZmxlbiA9IHNvYXAtPmJ1ZmxlbjsKKyAgICAgIHNvYXAtPmJ1ZmxlbiA9IHJldCA9IFNPQVBfQlVGTEVOIC0gc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0OworICAgICAgaWYgKHNvYXAtPnpsaWJfaW4gPT0gU09BUF9aTElCX0daSVApCisgICAgICAgIHNvYXAtPnpfY3JjID0gY3JjMzIoc29hcC0+el9jcmMsIChCeXRlKilzb2FwLT5idWYsICh1bnNpZ25lZCBpbnQpc29hcC0+YnVmbGVuKTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5mbGF0ZWQgJXUgYnl0ZXNcbiIsICh1bnNpZ25lZCBpbnQpcmV0KSk7CisgICAgICBpZiAoIXJldCkKKyAgICAgICAgZ290byB6bGliX2FnYWluOworICAgICAgaWYgKHIgPT0gWl9TVFJFQU1fRU5EKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluZmxhdGVkICVsdS0+JWx1IGJ5dGVzXG4iLCBzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiwgc29hcC0+ZF9zdHJlYW0udG90YWxfb3V0KSk7CisgICAgICAgIHNvYXAtPnpfcmF0aW9faW4gPSAoZmxvYXQpc29hcC0+ZF9zdHJlYW0udG90YWxfaW4gLyAoZmxvYXQpc29hcC0+ZF9zdHJlYW0udG90YWxfb3V0OworICAgICAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IFpfTlVMTDsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVbmFibGUgdG8gaW5mbGF0ZTogKCVkKSAlc1xuIiwgciwgc29hcC0+ZF9zdHJlYW0ubXNnP3NvYXAtPmRfc3RyZWFtLm1zZzoiIikpOworICAgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSBaX05VTEw7CisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICAgIHJldHVybiBFT0Y7CisgICAgfQorICB9CisjZW5kaWYKKyAgc29hcC0+Y291bnQgKz0gcmV0OworICByZXR1cm4gIXJldDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWN2KHN0cnVjdCBzb2FwICpzb2FwKQoreyAKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKQorICB7IGlmIChzb2FwLT5kaW1lLmJ1ZmxlbikKKyAgICB7IGNoYXIgKnM7CisgICAgICBpbnQgaTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgdG1wWzEyXTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRElNRSBoZHIgZm9yIGNodW5rZWQgRElNRSBpcyBpbiBidWZmZXJcbiIpKTsKKyAgICAgIHNvYXAtPmNvdW50ICs9IHNvYXAtPmRpbWUuYnVmbGVuIC0gc29hcC0+YnVmbGVuOworICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+ZGltZS5idWZsZW47CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNraXAgcGFkZGluZyAoJWxkIGJ5dGVzKVxuIiwgLShsb25nKXNvYXAtPmRpbWUuc2l6ZSYzKSk7CisgICAgICBmb3IgKGkgPSAtKGxvbmcpc29hcC0+ZGltZS5zaXplJjM7IGkgPiAwOyBpLS0pCisgICAgICB7IHNvYXAtPmJ1ZmlkeCsrOworICAgICAgICBpZiAoc29hcC0+YnVmaWR4ID49IHNvYXAtPmJ1ZmxlbikKKyAgICAgICAgICBpZiAoc29hcF9yZWN2X3Jhdyhzb2FwKSkKKyAgICAgICAgICAgIHJldHVybiBFT0Y7CisgICAgICB9CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdldCBESU1FIGhkciBmb3IgbmV4dCBjaHVua1xuIikpOworICAgICAgcyA9IChjaGFyKil0bXA7CisgICAgICBmb3IgKGkgPSAxMjsgaSA+IDA7IGktLSkKKyAgICAgIHsgKnMrKyA9IHNvYXAtPmJ1Zltzb2FwLT5idWZpZHgrK107CisgICAgICAgIGlmIChzb2FwLT5idWZpZHggPj0gc29hcC0+YnVmbGVuKQorICAgICAgICAgIGlmIChzb2FwX3JlY3ZfcmF3KHNvYXApKQorICAgICAgICAgICAgcmV0dXJuIEVPRjsKKyAgICAgIH0KKyAgICAgIHNvYXAtPmRpbWUuZmxhZ3MgPSB0bXBbMF0gJiAweDc7CisgICAgICBzb2FwLT5kaW1lLnNpemUgPSAoKHNpemVfdCl0bXBbOF0gPDwgMjQpIHwgKChzaXplX3QpdG1wWzldIDw8IDE2KSB8ICgoc2l6ZV90KXRtcFsxMF0gPDwgOCkgfCAoKHNpemVfdCl0bXBbMTFdKTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR2V0IERJTUUgY2h1bmsgKCV1IGJ5dGVzKVxuIiwgKHVuc2lnbmVkIGludClzb2FwLT5kaW1lLnNpemUpKTsKKyAgICAgIGlmIChzb2FwLT5kaW1lLmZsYWdzICYgU09BUF9ESU1FX0NGKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk1vcmUgY2h1bmtpbmdcbiIpKTsKKyAgICAgICAgc29hcC0+ZGltZS5jaHVua3NpemUgPSBzb2FwLT5kaW1lLnNpemU7CisgICAgICAgIGlmIChzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHggPj0gc29hcC0+ZGltZS5zaXplKQorICAgICAgICB7IHNvYXAtPmRpbWUuYnVmbGVuID0gc29hcC0+YnVmbGVuOworICAgICAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmJ1ZmlkeCArIHNvYXAtPmRpbWUuY2h1bmtzaXplOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzb2FwLT5kaW1lLmNodW5rc2l6ZSAtPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTGFzdCBjaHVua1xuIikpOworICAgICAgICBzb2FwLT5kaW1lLmJ1ZmxlbiA9IDA7CisgICAgICAgIHNvYXAtPmRpbWUuY2h1bmtzaXplID0gMDsKKyAgICAgIH0KKyAgICAgIHNvYXAtPmNvdW50ID0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIldSBieXRlcyByZW1haW5pbmdcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+Y291bnQpKTsKKyAgICAgIHJldHVybiBTT0FQX09LOworICAgIH0KKyAgICBpZiAoc29hcC0+ZGltZS5jaHVua3NpemUpCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdldCBuZXh0IERJTUUgaGRyIGZvciBjaHVua2VkIERJTUUgKCV1IGJ5dGVzIGNodW5rKVxuIiwgKHVuc2lnbmVkIGludClzb2FwLT5kaW1lLmNodW5rc2l6ZSkpOworICAgICAgaWYgKHNvYXBfcmVjdl9yYXcoc29hcCkpCisgICAgICAgIHJldHVybiBFT0Y7CisgICAgICBpZiAoc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4ID49IHNvYXAtPmRpbWUuY2h1bmtzaXplKQorICAgICAgeyBzb2FwLT5kaW1lLmJ1ZmxlbiA9IHNvYXAtPmJ1ZmxlbjsKKyAgICAgICAgc29hcC0+Y291bnQgLT0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4IC0gc29hcC0+ZGltZS5jaHVua3NpemU7CisgICAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmJ1ZmlkeCArIHNvYXAtPmRpbWUuY2h1bmtzaXplOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBzb2FwLT5kaW1lLmNodW5rc2l6ZSAtPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIiVsdSBieXRlcyByZW1haW5pbmcsIGNvdW50PSV1XG4iLCAodW5zaWduZWQgbG9uZykoc29hcC0+YnVmbGVuLXNvYXAtPmJ1ZmlkeCksICh1bnNpZ25lZCBpbnQpc29hcC0+Y291bnQpKTsKKyAgICAgIHJldHVybiBTT0FQX09LOworICAgIH0KKyAgfQorI2VuZGlmCisgIHJldHVybiBzb2FwX3JlY3ZfcmF3KHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc29hcF93Y2hhcgorU09BUF9GTUFDMgorc29hcF9nZXRjaGFyKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIGMgPSBzb2FwLT5haGVhZDsKKyAgaWYgKGMpCisgIHsgaWYgKGMgIT0gRU9GKQorICAgICAgc29hcC0+YWhlYWQgPSAwOworICAgIHJldHVybiBjOworICB9CisgIHJldHVybiBzb2FwX2dldDEoc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCoKK1NPQVBfRk1BQzIKK3NvYXBfY29kZShjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCAqbWFwLCBjb25zdCBjaGFyICpzdHIpCit7IGlmIChzdHIpCisgIHsgd2hpbGUgKG1hcC0+c3RyaW5nKQorICAgIHsgaWYgKCFzdHJjbXAoc3RyLCBtYXAtPnN0cmluZykpIC8qIGNhc2Ugc2Vuc2l0aXZlICovCisgICAgICAgIHJldHVybiBtYXA7CisgICAgICBtYXArKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitsb25nCitTT0FQX0ZNQUMyCitzb2FwX2ludF9jb2RlKGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwICptYXAsIGNvbnN0IGNoYXIgKnN0ciwgbG9uZyBvdGhlcikKK3sgd2hpbGUgKG1hcC0+c3RyaW5nKQorICB7IGlmICghc29hcF90YWdfY21wKHN0ciwgbWFwLT5zdHJpbmcpKSAvKiBjYXNlIGluc2Vuc2l0aXZlICovCisgICAgICByZXR1cm4gbWFwLT5jb2RlOworICAgIG1hcCsrOworICB9CisgIHJldHVybiBvdGhlcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3N0cl9jb2RlKGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwICptYXAsIGxvbmcgY29kZSkKK3sgd2hpbGUgKG1hcC0+Y29kZSAhPSBjb2RlICYmIG1hcC0+c3RyaW5nKQorICAgIG1hcCsrOworICByZXR1cm4gbWFwLT5zdHJpbmc7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc29hcF93Y2hhcgorc29hcF9jaGFyKHN0cnVjdCBzb2FwICpzb2FwKQoreyBjaGFyIHRtcFs4XTsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgcmVnaXN0ZXIgY2hhciAqcyA9IHRtcDsKKyAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykKKyAgeyBjID0gc29hcF9nZXQxKHNvYXApOworICAgIGlmIChjID09ICc7JyB8fCAoaW50KWMgPT0gRU9GKQorICAgICAgYnJlYWs7CisgICAgKnMrKyA9IChjaGFyKWM7CisgIH0KKyAgKnMgPSAnXDAnOworICBpZiAoKnRtcCA9PSAnIycpCisgIHsgaWYgKHRtcFsxXSA9PSAneCcgfHwgdG1wWzFdID09ICdYJykKKyAgICAgIHJldHVybiBzb2FwX3N0cnRvbCh0bXAgKyAyLCBOVUxMLCAxNik7CisgICAgcmV0dXJuIGF0b2wodG1wICsgMSk7CisgIH0KKyAgaWYgKCFzdHJjbXAodG1wLCAibHQiKSkKKyAgICByZXR1cm4gJzwnOworICBpZiAoIXN0cmNtcCh0bXAsICJndCIpKQorICAgIHJldHVybiAnPic7CisgIGlmICghc3RyY21wKHRtcCwgImFtcCIpKQorICAgIHJldHVybiAnJic7CisgIGlmICghc3RyY21wKHRtcCwgInF1b3QiKSkKKyAgICByZXR1cm4gJyInOworICBpZiAoIXN0cmNtcCh0bXAsICJhcG9zIikpCisgICAgcmV0dXJuICdcJyc7CisjaWZuZGVmIFdJVEhfTEVBTgorICByZXR1cm4gKHNvYXBfd2NoYXIpc29hcF9pbnRfY29kZShodG1sX2VudGl0eV9jb2RlcywgdG1wLCBTT0FQX1VOS05PV05fQ0hBUik7CisjZWxzZQorICByZXR1cm4gU09BUF9VTktOT1dOX0NIQVI7IC8qIHVzZSB0aGlzIHRvIHJlcHJlc2VudCB1bmtub3duIGNvZGUgKi8KKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgV0lUSF9MRUFOCitzb2FwX3djaGFyCitzb2FwX2dldDAoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwLT5idWZpZHggPj0gc29hcC0+YnVmbGVuICYmIHNvYXBfcmVjdihzb2FwKSkKKyAgICByZXR1cm4gRU9GOworICByZXR1cm4gKHVuc2lnbmVkIGNoYXIpc29hcC0+YnVmW3NvYXAtPmJ1ZmlkeF07Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBXSVRIX0xFQU4KK3NvYXBfd2NoYXIKK3NvYXBfZ2V0MShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXAtPmJ1ZmlkeCA+PSBzb2FwLT5idWZsZW4gJiYgc29hcF9yZWN2KHNvYXApKQorICAgIHJldHVybiBFT0Y7CisgIHJldHVybiAodW5zaWduZWQgY2hhcilzb2FwLT5idWZbc29hcC0+YnVmaWR4KytdOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc29hcF93Y2hhcgorU09BUF9GTUFDMgorc29hcF9nZXQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgYyA9IHNvYXAtPmFoZWFkOworICBpZiAoYykKKyAgeyBpZiAoYyAhPSBFT0YpCisgICAgICBzb2FwLT5haGVhZCA9IDA7CisgIH0KKyAgZWxzZQorICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgIGZvciAoOzspCisgIHsgaWYgKHNvYXAtPmNkYXRhKQorICAgIHsgaWYgKGMgPT0gJ10nKQorICAgICAgeyBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgICBpZiAoYyA9PSAnXScpCisgICAgICAgIHsgc29hcC0+Y2RhdGEgPSAwOworICAgICAgICAgIHNvYXBfZ2V0MShzb2FwKTsgLyogc2tpcCA+ICovCisgICAgICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgICAgfQorCWVsc2UKKyAgICAgICAgeyBzb2FwX3JldmdldDEoc29hcCk7CisgICAgICAgICAgcmV0dXJuICddJzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gYzsKKyAgICB9CisgICAgc3dpdGNoIChjKQorICAgIHsgY2FzZSAnPCc6CisgICAgICAgIGRvIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICAgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyAgICAgICAgaWYgKGMgPT0gJyEnIHx8IGMgPT0gJz8nIHx8IGMgPT0gJyUnKQorICAgICAgICB7IHJlZ2lzdGVyIGludCBrID0gMTsKKwkgIGlmIChjID09ICchJykKKyAgICAgICAgICB7IGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICAgICAgICBpZiAoYyA9PSAnWycpCisgICAgICAgICAgICB7IGRvIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICAgICAgICAgIHdoaWxlICgoaW50KWMgIT0gRU9GICYmIGMgIT0gJ1snKTsKKyAgICAgICAgICAgICAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIHNvYXAtPmNkYXRhID0gMTsKKyAgICAgICAgICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKwkgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjID09ICctJyAmJiAoYyA9IHNvYXBfZ2V0MShzb2FwKSkgPT0gJy0nKQorICAgICAgICAgICAgeyBkbworICAgICAgICAgICAgICB7IGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJy0nICYmIChjID0gc29hcF9nZXQxKHNvYXApKSA9PSAnLScpCisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfSB3aGlsZSAoKGludCljICE9IEVPRik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCSAgZWxzZSBpZiAoYyA9PSAnPycpCisgICAgICAgICAgICBjID0gc29hcF9nZXRfcGkoc29hcCk7CisgICAgICAgICAgd2hpbGUgKChpbnQpYyAhPSBFT0YpCisgICAgICAgICAgeyBpZiAoYyA9PSAnPCcpCisJICAgICAgaysrOworCSAgICBlbHNlIGlmIChjID09ICc+JykKKwkgICAgeyBpZiAoLS1rIDw9IDApCisJICAgICAgICBicmVhazsKKwkgICAgfQorCSAgICBjID0gc29hcF9nZXQxKHNvYXApOworCSAgfQorCSAgaWYgKChpbnQpYyA9PSBFT0YpCisJICAgIGJyZWFrOworICAgICAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMgPT0gJy8nKQorICAgICAgICAgIHJldHVybiBTT0FQX1RUOworICAgICAgICBzb2FwX3JldmdldDEoc29hcCk7CisgICAgICAgIHJldHVybiBTT0FQX0xUOworICAgICAgY2FzZSAnPic6CisgICAgICAgIHJldHVybiBTT0FQX0dUOworICAgICAgY2FzZSAnIic6CisgICAgICAgIHJldHVybiBTT0FQX1FUOworICAgICAgY2FzZSAnXCcnOgorICAgICAgICByZXR1cm4gU09BUF9BUDsKKyAgICAgIGNhc2UgJyYnOgorICAgICAgICByZXR1cm4gc29hcF9jaGFyKHNvYXApIHwgMHg4MDAwMDAwMDsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIGM7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc29hcF93Y2hhcgorc29hcF9nZXRfcGkoc3RydWN0IHNvYXAgKnNvYXApCit7IGNoYXIgYnVmWzY0XTsKKyAgcmVnaXN0ZXIgY2hhciAqcyA9IGJ1ZjsKKyAgcmVnaXN0ZXIgaW50IGkgPSBzaXplb2YoYnVmKTsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICAvKiBUaGlzIGlzIGEgcXVpY2sgd2F5IHRvIHBhcnNlIFhNTCBQSSBhbmQgd2UgY291bGQgdXNlIGEgY2FsbGJhY2sgaW5zdGVhZCB0bworICAgKiBlbmFibGUgYXBwbGljYXRpb25zIHRvIGludGVyY2VwdCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyAqLworICB3aGlsZSAoKGludCljICE9IEVPRiAmJiBjICE9ICc/JykKKyAgeyBpZiAoLS1pID4gMCkKKyAgICB7IGlmIChzb2FwX2JsYW5rKGMpKQorICAgICAgICBjID0gJyAnOworICAgICAgKnMrKyA9IChjaGFyKWM7CisgICAgfQorICAgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgIH0KKyAgKnMgPSAnXDAnOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlhNTCBQSSA8PyVzPz5cbiIsIGJ1ZikpOworICBpZiAoIXN0cm5jbXAoYnVmLCAieG1sICIsIDQpKQorICB7IHMgPSBzdHJzdHIoYnVmLCAiIGVuY29kaW5nPSIpOworICAgIGlmIChzICYmIHNbMTBdKQorICAgIHsgaWYgKCFzb2FwX3RhZ19jbXAocyArIDExLCAiaXNvLTg4NTktMSoiKQorICAgICAgIHx8ICFzb2FwX3RhZ19jbXAocyArIDExLCAibGF0aW4xKiIpKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlN3aXRjaGluZyB0byBsYXRpbjEgZW5jb2RpbmdcbiIpKTsKKyAgICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19MQVRJTjsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAocyArIDExLCAidXRmLTgqIikpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU3dpdGNoaW5nIHRvIHV0Zi04IGVuY29kaW5nXG4iKSk7CisgICAgICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX0xBVElOOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoKGludCljICE9IEVPRikKKyAgICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICByZXR1cm4gYzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9tb3ZlKHN0cnVjdCBzb2FwICpzb2FwLCBsb25nIG4pCit7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTW92aW5nICVsZCBieXRlcyBmb3J3YXJkXG4iLCAobG9uZyluKSk7CisgIGZvciAoOyBuID4gMDsgbi0tKQorICAgIGlmICgoaW50KXNvYXBfZ2V0Y2hhcihzb2FwKSA9PSBFT0YpCisgICAgICByZXR1cm4gU09BUF9FT0Y7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzaXplX3QKK1NPQVBfRk1BQzIKK3NvYXBfdGVsbChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmV0dXJuIHNvYXAtPmNvdW50IC0gc29hcC0+YnVmbGVuICsgc29hcC0+YnVmaWR4IC0gKHNvYXAtPmFoZWFkICE9IDApOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0dXRmOChzdHJ1Y3Qgc29hcCAqc29hcCwgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBjKQoreyBjaGFyIHRtcFsxNl07CisgIGlmIChjID4gMCAmJiBjIDwgMHg4MCkKKyAgeyAqdG1wID0gKGNoYXIpYzsKKyAgICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCB0bXAsIDEpOworICB9CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgeyByZWdpc3RlciBjaGFyICp0ID0gdG1wOworICAgIGlmIChjIDwgMHgwODAwKQorICAgICAgKnQrKyA9IChjaGFyKSgweEMwIHwgKChjID4+IDYpICYgMHgxRikpOworICAgIGVsc2UKKyAgICB7IGlmIChjIDwgMHgwMTAwMDApCisgICAgICAgICp0KysgPSAoY2hhcikoMHhFMCB8ICgoYyA+PiAxMikgJiAweDBGKSk7CisgICAgICBlbHNlCisgICAgICB7IGlmIChjIDwgMHgyMDAwMDApCisgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEYwIHwgKChjID4+IDE4KSAmIDB4MDcpKTsKKyAgICAgICAgZWxzZQorICAgICAgICB7IGlmIChjIDwgMHgwNDAwMDAwMCkKKyAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhGOCB8ICgoYyA+PiAyNCkgJiAweDAzKSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsgKnQrKyA9IChjaGFyKSgweEZDIHwgKChjID4+IDMwKSAmIDB4MDEpKTsKKyAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAyNCkgJiAweDNGKSk7CisgICAgICAgICAgfQorICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAxOCkgJiAweDNGKSk7CisgICAgICAgIH0gICAgIAorICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTIpICYgMHgzRikpOworICAgICAgfQorICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDYpICYgMHgzRikpOworICAgIH0KKyAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoYyAmIDB4M0YpKTsKKyAgICAqdCA9ICdcMCc7CisgIH0KKyAgZWxzZQorI2VuZGlmCisgICAgc3ByaW50Zih0bXAsICImIyVsdTsiLCBjKTsKKyAgcmV0dXJuIHNvYXBfc2VuZChzb2FwLCB0bXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc29hcF93Y2hhcgorU09BUF9GTUFDMgorc29hcF9nZXR1dGY4KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzb2FwX3djaGFyIGMsIGMxLCBjMiwgYzMsIGM0OworICBjID0gc29hcC0+YWhlYWQ7CisgIGlmIChjID4gMHhGRikKKyAgeyBzb2FwLT5haGVhZCA9IDA7CisgICAgcmV0dXJuIGM7CisgIH0KK2FnYWluOgorICBjID0gc29hcF9nZXQoc29hcCk7CisgIGlmIChjIDwgMHg4MCB8fCAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0xBVElOKSkKKyAgICByZXR1cm4gYzsKKyAgYzEgPSBzb2FwX2dldDEoc29hcCk7CisgIGlmIChjMSA8IDB4ODApCisgIHsgc29hcF9yZXZnZXQxKHNvYXApOyAvKiBkb2Vzbid0IGxvb2sgbGlrZSB0aGlzIGlzIFVURjggKi8KKyAgICByZXR1cm4gYzsKKyAgfQorICBjMSAmPSAweDNGOworICBpZiAoYyA8IDB4RTApCisgICAgcmV0dXJuICgoc29hcF93Y2hhcikoYyAmIDB4MUYpIDw8IDYpIHwgYzE7CisgIGMyID0gKHNvYXBfd2NoYXIpc29hcF9nZXQxKHNvYXApICYgMHgzRjsKKyAgaWYgKGMgPT0gMHhFRiAmJiBjMSA9PSAweDNCICYmIGMyID09IDB4M0YpCS8qIGlnbm9yZSBVVEYtOCBCT00gKi8KKyAgICBnb3RvIGFnYWluOworICBpZiAoYyA8IDB4RjApCisgICAgcmV0dXJuICgoc29hcF93Y2hhcikoYyAmIDB4MEYpIDw8IDEyKSB8IChjMSA8PCA2KSB8IGMyOworICBjMyA9IChzb2FwX3djaGFyKXNvYXBfZ2V0MShzb2FwKSAmIDB4M0Y7CisgIGlmIChjIDwgMHhGOCkKKyAgICByZXR1cm4gKChzb2FwX3djaGFyKShjICYgMHgwNykgPDwgMTgpIHwgKGMxIDw8IDEyKSB8IChjMiA8PCA2KSB8IGMzOworICBjNCA9IChzb2FwX3djaGFyKXNvYXBfZ2V0MShzb2FwKSAmIDB4M0Y7CisgIGlmIChjIDwgMHhGQykKKyAgICByZXR1cm4gKChzb2FwX3djaGFyKShjICYgMHgwMykgPDwgMjQpIHwgKGMxIDw8IDE4KSB8IChjMiA8PCAxMikgfCAoYzMgPDwgNikgfCBjNDsKKyAgcmV0dXJuICgoc29hcF93Y2hhcikoYyAmIDB4MDEpIDw8IDMwKSB8IChjMSA8PCAyNCkgfCAoYzIgPDwgMTgpIHwgKGMzIDw8IDEyKSB8IChjNCA8PCA2KSB8IChzb2FwX3djaGFyKShzb2FwX2dldDEoc29hcCkgJiAweDNGKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRoZXgoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMsIGludCBuKQoreyBjaGFyIGRbMl07CisgIHJlZ2lzdGVyIGludCBpOworI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IGlmICghKHNvYXAtPmRvbS0+ZGF0YSA9IHNvYXBfczJoZXgoc29hcCwgcywgTlVMTCwgbikpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIHJldHVybiBTT0FQX09LOworICB9CisjZW5kaWYKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgeyByZWdpc3RlciBpbnQgbSA9ICpzKys7CisgICAgZFswXSA9IChjaGFyKSgobSA+PiA0KSArIChtID4gMTU5ID8gJzcnIDogJzAnKSk7CisgICAgbSAmPSAweDBGOworICAgIGRbMV0gPSAoY2hhcikobSArIChtID4gOSA/ICc3JyA6ICcwJykpOworICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIGQsIDIpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordW5zaWduZWQgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0aGV4KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgKm4pCit7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgc29hcC0+ZG9tLT5kYXRhID0gc29hcF9zdHJpbmdfaW4oc29hcCwgMCwgLTEsIC0xKTsKKyAgICByZXR1cm4gKHVuc2lnbmVkIGNoYXIqKXNvYXBfaGV4MnMoc29hcCwgc29hcC0+ZG9tLT5kYXRhLCBOVUxMLCAwLCBuKTsKKyAgfQorI2VuZGlmCisjaWZkZWYgV0lUSF9GQVNUCisgIHNvYXAtPmxhYmlkeCA9IDA7CisgIGZvciAoOzspCisgIHsgcmVnaXN0ZXIgY2hhciAqczsKKyAgICByZWdpc3RlciBpbnQgaSwgazsKKyAgICBpZiAoc29hcF9hcHBlbmRfbGFiKHNvYXAsIE5VTEwsIDApKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgcyA9IHNvYXAtPmxhYmJ1ZiArIHNvYXAtPmxhYmlkeDsKKyAgICBrID0gc29hcC0+bGFibGVuIC0gc29hcC0+bGFiaWR4OworICAgIHNvYXAtPmxhYmlkeCA9IHNvYXAtPmxhYmxlbjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgazsgaSsrKQorICAgIHsgcmVnaXN0ZXIgY2hhciBkMSwgZDI7CisgICAgICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgICAgICBjID0gc29hcF9nZXQoc29hcCk7CisgICAgICBpZiAoc29hcF9pc3hkaWdpdChjKSkKKyAgICAgIHsgZDEgPSAoY2hhciljOworICAgICAgICBjID0gc29hcF9nZXQoc29hcCk7IAorCWlmIChzb2FwX2lzeGRpZ2l0KGMpKQorICAgICAgICAgIGQyID0gKGNoYXIpYzsKKyAgICAgICAgZWxzZSAKKyAgICAgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyB1bnNpZ25lZCBjaGFyICpwOworICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICBpZiAobikKKyAgICAgICAgICAqbiA9IChpbnQpKHNvYXAtPmxhYmxlbiAtIGsgKyBpKTsKKyAgICAgICAgcCA9ICh1bnNpZ25lZCBjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzb2FwLT5sYWJsZW4gLSBrICsgaSk7CisJaWYgKHApCisJICBtZW1jcHkocCwgc29hcC0+bGFiYnVmLCBzb2FwLT5sYWJsZW4gLSBrICsgaSk7CisgICAgICAgIHJldHVybiBwOworICAgICAgfQorICAgICAgKnMrKyA9ICgoZDEgPj0gJ0EnID8gKGQxICYgMHg3KSArIDkgOiBkMSAtICcwJykgPDwgNCkgKyAoZDIgPj0gJ0EnID8gKGQyICYgMHg3KSArIDkgOiBkMiAtICcwJyk7CisgICAgfQorICB9CisjZWxzZQorICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgcmV0dXJuIE5VTEw7CisgIGZvciAoOzspCisgIHsgcmVnaXN0ZXIgaW50IGk7CisgICAgcmVnaXN0ZXIgY2hhciAqcyA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgU09BUF9CTEtMRU4pOworICAgIGlmICghcykKKyAgICB7IHNvYXBfZW5kX2Jsb2NrKHNvYXApOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0JMS0xFTjsgaSsrKQorICAgIHsgcmVnaXN0ZXIgY2hhciBkMSwgZDI7CisgICAgICByZWdpc3RlciBzb2FwX3djaGFyIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgICAgIGlmIChzb2FwX2lzeGRpZ2l0KGMpKQorICAgICAgeyBkMSA9IChjaGFyKWM7CisgICAgICAgIGMgPSBzb2FwX2dldChzb2FwKTsgCisJaWYgKHNvYXBfaXN4ZGlnaXQoYykpCisgICAgICAgICAgZDIgPSAoY2hhciljOworICAgICAgICBlbHNlIAorICAgICAgICB7IHNvYXBfZW5kX2Jsb2NrKHNvYXApOworCSAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgdW5zaWduZWQgY2hhciAqcDsKKyAgICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgaWYgKG4pCisgICAgICAgICAgKm4gPSBzb2FwX3NpemVfYmxvY2soc29hcCwgaSk7CisgICAgICAgIHAgPSAodW5zaWduZWQgY2hhciopc29hcF9zYXZlX2Jsb2NrKHNvYXAsIE5VTEwsIDApOworICAgICAgICByZXR1cm4gcDsKKyAgICAgIH0KKyAgICAgICpzKysgPSAoKGQxID49ICdBJyA/IChkMSAmIDB4NykgKyA5IDogZDEgLSAnMCcpIDw8IDQpICsgKGQyID49ICdBJyA/IChkMiAmIDB4NykgKyA5IDogZDIgLSAnMCcpOworICAgIH0KKyAgfQorI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0YmFzZTY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzLCBpbnQgbikKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbTsKKyAgY2hhciBkWzRdOworICBpZiAoIXMpCisgICAgcmV0dXJuIFNPQVBfT0s7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgaWYgKCEoc29hcC0+ZG9tLT5kYXRhID0gc29hcF9zMmJhc2U2NChzb2FwLCBzLCBOVUxMLCBuKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNlbmRpZgorICBmb3IgKDsgbiA+IDI7IG4gLT0gMywgcyArPSAzKQorICB7IG0gPSBzWzBdOworICAgIG0gPSAobSA8PCA4KSB8IHNbMV07CisgICAgbSA9IChtIDw8IDgpIHwgc1syXTsKKyAgICBmb3IgKGkgPSA0OyBpID4gMDsgbSA+Pj0gNikKKyAgICAgIGRbLS1pXSA9IHNvYXBfYmFzZTY0b1ttICYgMHgzRl07CisgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgZCwgNCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKG4gPiAwKQorICB7IG0gPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICBtID0gKG0gPDwgOCkgfCAqcysrOworICAgIGZvciAoOyBpIDwgMzsgaSsrKQorICAgICAgbSA8PD0gODsKKyAgICBmb3IgKGkrKzsgaSA+IDA7IG0gPj49IDYpCisgICAgICBkWy0taV0gPSBzb2FwX2Jhc2U2NG9bbSAmIDB4M0ZdOworICAgIGZvciAoaSA9IDM7IGkgPiBuOyBpLS0pCisgICAgICBkW2ldID0gJz0nOworICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIGQsIDQpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordW5zaWduZWQgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0YmFzZTY0KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgKm4sIGludCBtYWxsb2NfZmxhZykKK3sgCisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgc29hcC0+ZG9tLT5kYXRhID0gc29hcF9zdHJpbmdfaW4oc29hcCwgMCwgLTEsIC0xKTsKKyAgICByZXR1cm4gKHVuc2lnbmVkIGNoYXIqKXNvYXBfYmFzZTY0MnMoc29hcCwgc29hcC0+ZG9tLT5kYXRhLCBOVUxMLCAwLCBuKTsKKyAgfQorI2VuZGlmCisjaWZkZWYgV0lUSF9GQVNUCisgIHNvYXAtPmxhYmlkeCA9IDA7CisgIGZvciAoOzspCisgIHsgcmVnaXN0ZXIgaW50IGksIGs7CisgICAgcmVnaXN0ZXIgY2hhciAqczsKKyAgICBpZiAoc29hcF9hcHBlbmRfbGFiKHNvYXAsIE5VTEwsIDIpKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgcyA9IHNvYXAtPmxhYmJ1ZiArIHNvYXAtPmxhYmlkeDsKKyAgICBrID0gc29hcC0+bGFibGVuIC0gc29hcC0+bGFiaWR4OworICAgIHNvYXAtPmxhYmlkeCA9IDMgKiAoc29hcC0+bGFibGVuIC8gMyk7CisgICAgaWYgKCFzKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IGsgLSAyOyBpICs9IDMpCisgICAgeyByZWdpc3RlciB1bnNpZ25lZCBsb25nIG0gPSAwOworICAgICAgcmVnaXN0ZXIgaW50IGogPSAwOworICAgICAgZG8KKyAgICAgIHsgcmVnaXN0ZXIgc29hcF93Y2hhciBjID0gc29hcF9nZXQoc29hcCk7CisgICAgICAgIGlmIChjID09ICc9JyB8fCBjIDwgMCkKKyAgICAgICAgeyB1bnNpZ25lZCBjaGFyICpwOworICAgICAgICAgIHN3aXRjaCAoaikKKyAgICAgICAgICB7IGNhc2UgMjoKKyAgICAgICAgICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiA0KSAmIDB4RkYpOworICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAqcysrID0gKGNoYXIpKChtID4+IDEwKSAmIDB4RkYpOworICAgICAgICAgICAgICAqcysrID0gKGNoYXIpKChtID4+IDIpICYgMHhGRik7CisgICAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG4pCisgICAgICAgICAgICAqbiA9IChpbnQpKHNvYXAtPmxhYmxlbiAtIGsgKyBpKTsKKyAgICAgICAgICBwID0gKHVuc2lnbmVkIGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHNvYXAtPmxhYmxlbiAtIGsgKyBpKTsKKwkgIGlmIChwKQorCSAgICBtZW1jcHkocCwgc29hcC0+bGFiYnVmLCBzb2FwLT5sYWJsZW4gLSBrICsgaSk7CisgICAgICAgICAgaWYgKGMgPj0gMCkKKyAgICAgICAgICB7IHdoaWxlICgoaW50KSgoYyA9IHNvYXBfZ2V0KHNvYXApKSAhPSBFT0YpICYmIGMgIT0gU09BUF9MVCAmJiBjICE9IFNPQVBfVFQpCisgICAgICAgICAgICAgIDsKKwkgIH0KKyAgICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICAgIHJldHVybiBwOworICAgICAgICB9CisgICAgICAgIGMgLT0gJysnOworICAgICAgICBpZiAoYyA+PSAwICYmIGMgPD0gNzkpCisgICAgICAgIHsgbSA9IChtIDw8IDYpICsgc29hcF9iYXNlNjRpW2NdOworICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAoaiA8IDQpOworICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiAxNikgJiAweEZGKTsKKyAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gOCkgJiAweEZGKTsKKyAgICAgICpzKysgPSAoY2hhcikobSAmIDB4RkYpOworICAgIH0KKyAgfQorI2Vsc2UKKyAgaWYgKHNvYXBfbmV3X2Jsb2NrKHNvYXApKQorICAgIHJldHVybiBOVUxMOworICBmb3IgKDs7KQorICB7IHJlZ2lzdGVyIGludCBpOworICAgIHJlZ2lzdGVyIGNoYXIgKnMgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIDMgKiBTT0FQX0JMS0xFTik7IC8qIG11c3QgYmUgbXVsdGlwbGUgb2YgMyAqLworICAgIGlmICghcykKKyAgICB7IHNvYXBfZW5kX2Jsb2NrKHNvYXApOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0JMS0xFTjsgaSsrKQorICAgIHsgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBtID0gMDsKKyAgICAgIHJlZ2lzdGVyIGludCBqID0gMDsKKyAgICAgIGRvCisgICAgICB7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IHNvYXBfZ2V0KHNvYXApOworICAgICAgICBpZiAoYyA9PSAnPScgfHwgYyA8IDApCisgICAgICAgIHsgdW5zaWduZWQgY2hhciAqcDsKKyAgICAgICAgICBpICo9IDM7CisgICAgICAgICAgc3dpdGNoIChqKQorICAgICAgICAgIHsgY2FzZSAyOgorICAgICAgICAgICAgICAqcysrID0gKGNoYXIpKChtID4+IDQpICYgMHhGRik7CisgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gMTApICYgMHhGRik7CisgICAgICAgICAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gMikgJiAweEZGKTsKKyAgICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobikKKwkgICAgKm4gPSAoaW50KXNvYXBfc2l6ZV9ibG9jayhzb2FwLCBpKTsKKyAgICAgICAgICBwID0gKHVuc2lnbmVkIGNoYXIqKXNvYXBfc2F2ZV9ibG9jayhzb2FwLCBOVUxMLCAwKTsKKyAgICAgICAgICBpZiAoYyA+PSAwKQorICAgICAgICAgIHsgd2hpbGUgKChpbnQpKChjID0gc29hcF9nZXQoc29hcCkpICE9IEVPRikgJiYgYyAhPSBTT0FQX0xUICYmIGMgIT0gU09BUF9UVCkKKyAgICAgICAgICAgICAgOworCSAgfQorICAgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgIH0KKyAgICAgICAgYyAtPSAnKyc7CisgICAgICAgIGlmIChjID49IDAgJiYgYyA8PSA3OSkKKyAgICAgICAgeyBtID0gKG0gPDwgNikgKyBzb2FwX2Jhc2U2NGlbY107CisgICAgICAgICAgaisrOworICAgICAgICB9CisgICAgICB9IHdoaWxlIChqIDwgNCk7CisgICAgICAqcysrID0gKGNoYXIpKChtID4+IDE2KSAmIDB4RkYpOworICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiA4KSAmIDB4RkYpOworICAgICAgKnMrKyA9IChjaGFyKShtICYgMHhGRik7CisgICAgfQorICB9CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF94b3BfZm9yd2FyZChzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgY2hhciAqKnB0ciwgaW50ICpzaXplLCBjaGFyICoqaWQsIGNoYXIgKip0eXBlLCBjaGFyICoqb3B0aW9ucykKK3sgLyogQ2hlY2sgTVRPTSB4b3A6SW5jbHVkZSBlbGVtZW50ICh3aXRoaW4gaGV4L2Jhc2U2NEJpbmFyeSkgKi8KKyAgLyogVE9ETzogdGhpcyBjb2RlIHRvIGJlIG9ic29sZXRlZCB3aXRoIG5ldyBpbXBvcnQveG9wLmggY29udmVudGlvbnMgKi8KKyAgaW50IGJvZHkgPSBzb2FwLT5ib2R5OyAvKiBzaG91bGQgc2F2ZSB0eXBlIHRvbz8gKi8KKyAgaWYgKCFzb2FwX3BlZWtfZWxlbWVudChzb2FwKSkKKyAgeyBpZiAoIXNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCAieG9wOkluY2x1ZGUiLCAwKSAmJiAqc29hcC0+aHJlZikKKyAgICB7IGlmIChzb2FwX2RpbWVfZm9yd2FyZChzb2FwLCBwdHIsIHNpemUsIGlkLCB0eXBlLCBvcHRpb25zKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIE5VTEwpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHNvYXAtPmJvZHkgPSBib2R5OworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2RpbWVfZm9yd2FyZChzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgY2hhciAqKnB0ciwgaW50ICpzaXplLCBjaGFyICoqaWQsIGNoYXIgKip0eXBlLCBjaGFyICoqb3B0aW9ucykKK3sgc3RydWN0IHNvYXBfeGxpc3QgKnhwID0gKHN0cnVjdCBzb2FwX3hsaXN0KilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfeGxpc3QpKTsKKyAgKnB0ciA9IE5VTEw7CisgICpzaXplID0gMDsKKyAgKmlkID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+aHJlZik7CisgICp0eXBlID0gTlVMTDsKKyAgKm9wdGlvbnMgPSBOVUxMOworICBpZiAoIXhwKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICB4cC0+bmV4dCA9IHNvYXAtPnhsaXN0OworICB4cC0+cHRyID0gcHRyOworICB4cC0+c2l6ZSA9IHNpemU7CisgIHhwLT5pZCA9ICppZDsKKyAgeHAtPnR5cGUgPSB0eXBlOworICB4cC0+b3B0aW9ucyA9IG9wdGlvbnM7CisgIHNvYXAtPnhsaXN0ID0geHA7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfc3RyZHVwKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzKQoreyBjaGFyICp0ID0gTlVMTDsKKyAgaWYgKHMgJiYgKHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc3RybGVuKHMpICsgMSkpKQorICAgIHN0cmNweSh0LCBzKTsKKyAgcmV0dXJuIHQ7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfbmV3X2Jsb2NrKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9ibGlzdCAqcDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJOZXcgYmxvY2sgc2VxdWVuY2UgKHByZXY9JXApXG4iLCBzb2FwLT5ibGlzdCkpOworICBpZiAoIShwID0gKHN0cnVjdCBzb2FwX2JsaXN0KilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfYmxpc3QpKSkpCisgICAgcmV0dXJuIFNPQVBfRU9NOyAgIAorICBwLT5uZXh0ID0gc29hcC0+Ymxpc3Q7IAorICBwLT5wdHIgPSBOVUxMOworICBwLT5zaXplID0gMDsKKyAgc29hcC0+Ymxpc3QgPSBwOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQqCitTT0FQX0ZNQUMyCitzb2FwX3B1c2hfYmxvY2soc3RydWN0IHNvYXAgKnNvYXAsIHNpemVfdCBuKQoreyBjaGFyICpwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlB1c2ggYmxvY2sgb2YgJXUgYnl0ZXMgKCV1IGJ5dGVzIHRvdGFsKVxuIiwgKHVuc2lnbmVkIGludCluLCAodW5zaWduZWQgaW50KXNvYXAtPmJsaXN0LT5zaXplICsgKHVuc2lnbmVkIGludCluKSk7CisgIGlmICghKHAgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgbiArIHNpemVvZihjaGFyKikgKyBzaXplb2Yoc2l6ZV90KSkpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgKihjaGFyKiopcCA9IHNvYXAtPmJsaXN0LT5wdHI7CisgICooc2l6ZV90KikocCArIHNpemVvZihjaGFyKikpID0gbjsKKyAgc29hcC0+Ymxpc3QtPnB0ciA9IHA7CisgIHNvYXAtPmJsaXN0LT5zaXplICs9IG47CisgIHJldHVybiBwICsgc2l6ZW9mKGNoYXIqKSArIHNpemVvZihzaXplX3QpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9wb3BfYmxvY2soc3RydWN0IHNvYXAgKnNvYXApCit7IGNoYXIgKnA7CisgIGlmICghc29hcC0+Ymxpc3QtPnB0cikKKyAgICByZXR1cm47CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUG9wIGJsb2NrXG4iKSk7CisgIHAgPSBzb2FwLT5ibGlzdC0+cHRyOworICBzb2FwLT5ibGlzdC0+c2l6ZSAtPSAqKHNpemVfdCopKHAgKyBzaXplb2YoY2hhciopKTsKKyAgc29hcC0+Ymxpc3QtPnB0ciA9ICooY2hhcioqKXA7CisgIFNPQVBfRlJFRShzb2FwLCBwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZAorc29hcF91cGRhdGVfcHRycyhzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqc3RhcnQsIGNoYXIgKmVuZCwgY2hhciAqcDEsIGNoYXIgKnAyKQoreyBpbnQgaTsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9mbGlzdCAqZnA7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3hsaXN0ICp4cDsKKyNlbmRpZgorICByZWdpc3RlciB2b2lkICpwLCAqKnE7CisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0lESEFTSDsgaSsrKQorICB7IGZvciAoaXAgPSBzb2FwLT5paHRbaV07IGlwOyBpcCA9IGlwLT5uZXh0KQorICAgIHsgaWYgKGlwLT5wdHIgJiYgKGNoYXIqKWlwLT5wdHIgPj0gc3RhcnQgJiYgKGNoYXIqKWlwLT5wdHIgPCBlbmQpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVXBkYXRlIGlkPSclcycgJXAgLT4gJXBcbiIsIGlwLT5pZCwgaXAtPnB0ciwgKGNoYXIqKWlwLT5wdHIgKyAocDEtcDIpKSk7CisgICAgICAgIGlwLT5wdHIgPSAoY2hhciopaXAtPnB0ciArIChwMS1wMik7CisgICAgICB9CisgICAgICBmb3IgKHEgPSAmaXAtPmxpbms7IHE7IHEgPSAodm9pZCoqKXApCisgICAgICB7IHAgPSAqcTsKKyAgICAgICAgaWYgKHAgJiYgKGNoYXIqKXAgPj0gc3RhcnQgJiYgKGNoYXIqKXAgPCBlbmQpCisgICAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJMaW5rIHVwZGF0ZSBpZD0nJXMnICVwXG4iLCBpcC0+aWQsIHApKTsKKyAgICAgICAgICAqcSA9IChjaGFyKilwICsgKHAxLXAyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZm9yIChxID0gJmlwLT5jb3B5OyBxOyBxID0gKHZvaWQqKilwKQorICAgICAgeyBwID0gKnE7CisgICAgICAgIGlmIChwICYmIChjaGFyKilwID49IHN0YXJ0ICYmIChjaGFyKilwIDwgZW5kKQorICAgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weSBjaGFpbiB1cGRhdGUgaWQ9JyVzJyAlcFxuIiwgaXAtPmlkLCBwKSk7CisgICAgICAgICAgKnEgPSAoY2hhciopcCArIChwMS1wMik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZvciAoZnAgPSBpcC0+Zmxpc3Q7IGZwOyBmcCA9IGZwLT5uZXh0KQorICAgICAgeyBpZiAoKGNoYXIqKWZwLT5wdHIgPj0gc3RhcnQgJiYgKGNoYXIqKWZwLT5wdHIgPCBlbmQpCisgICAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5IGxpc3QgdXBkYXRlIGlkPSclcycgJXBcbiIsIGlwLT5pZCwgZnApKTsKKyAgICAgICAgICBmcC0+cHRyID0gKGNoYXIqKWZwLT5wdHIgKyAocDEtcDIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGZvciAoeHAgPSBzb2FwLT54bGlzdDsgeHA7IHhwID0geHAtPm5leHQpCisgIHsgaWYgKHhwLT5wdHIgJiYgKGNoYXIqKXhwLT5wdHIgPj0gc3RhcnQgJiYgKGNoYXIqKXhwLT5wdHIgPCBlbmQpCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVwZGF0ZSBpZD0nJXMnICVwIC0+ICVwXG4iLCB4cC0+aWQ/eHAtPmlkOiIiLCB4cC0+cHRyLCAoY2hhciopeHAtPnB0ciArIChwMS1wMikpKTsKKyAgICAgIHhwLT5wdHIgPSAodW5zaWduZWQgY2hhcioqKSgoY2hhciopeHAtPnB0ciArIChwMS1wMikpOworICAgICAgeHAtPnNpemUgPSAoaW50KikoKGNoYXIqKXhwLT5zaXplICsgKHAxLXAyKSk7CisgICAgICB4cC0+dHlwZSA9IChjaGFyKiopKChjaGFyKil4cC0+dHlwZSArIChwMS1wMikpOworICAgICAgeHAtPm9wdGlvbnMgPSAoY2hhcioqKSgoY2hhciopeHAtPm9wdGlvbnMgKyAocDEtcDIpKTsKKyAgICB9CisgIH0KKyNlbmRpZgorfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc29hcF9oYXNfY29waWVzKHN0cnVjdCBzb2FwICpzb2FwLCByZWdpc3RlciBjb25zdCBjaGFyICpzdGFydCwgcmVnaXN0ZXIgY29uc3QgY2hhciAqZW5kKQoreyByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9mbGlzdCAqZnA7CisgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnA7CisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0lESEFTSDsgaSsrKQorICB7IGZvciAoaXAgPSBzb2FwLT5paHRbaV07IGlwOyBpcCA9IGlwLT5uZXh0KQorICAgIHsgZm9yIChwID0gKGNvbnN0IGNoYXIqKWlwLT5jb3B5OyBwOyBwID0gKihjb25zdCBjaGFyKiopcCkKKyAgICAgICAgaWYgKHAgPj0gc3RhcnQgJiYgcCA8IGVuZCkKKyAgICAgICAgICByZXR1cm4gU09BUF9FUlI7CisgICAgICBmb3IgKGZwID0gaXAtPmZsaXN0OyBmcDsgZnAgPSBmcC0+bmV4dCkKKyAgICAgICAgaWYgKChjb25zdCBjaGFyKilmcC0+cHRyID49IHN0YXJ0ICYmIChjb25zdCBjaGFyKilmcC0+cHRyIDwgZW5kKQorCSAgcmV0dXJuIFNPQVBfRVJSOworICAgIH0KKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZXNvbHZlKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9mbGlzdCAqZnA7CisgIHNob3J0IGZsYWc7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x2aW5nIGZvcndhcmRlZCBkYXRhXG4iKSk7CisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0lESEFTSDsgaSsrKQorICB7IGZvciAoaXAgPSBzb2FwLT5paHRbaV07IGlwOyBpcCA9IGlwLT5uZXh0KQorICAgIHsgaWYgKGlwLT5wdHIpCisgICAgICB7IHJlZ2lzdGVyIHZvaWQgKnAsICoqcSwgKnI7CisgICAgICAgIHEgPSAodm9pZCoqKWlwLT5saW5rOworICAgICAgICBpcC0+bGluayA9IE5VTEw7CisgICAgICAgIHIgPSBpcC0+cHRyOworICAgICAgICBEQkdMT0coVEVTVCwgaWYgKHEpIFNPQVBfTUVTU0FHRShmZGVidWcsICJUcmF2ZXJzaW5nIGxpbmsgY2hhaW4gdG8gcmVzb2x2ZSBpZD0nJXMnXG4iLCBpcC0+aWQpKTsKKyAgICAgICAgd2hpbGUgKHEpCisgICAgICAgIHsgcCA9ICpxOworICAgICAgICAgICpxID0gcjsKKyAgICAgICAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiLi4uIGxpbmsgJXAgLT4gJXBcbiIsIHEsIHIpKTsKKyAgICAgICAgICBxID0gKHZvaWQqKilwOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmICgqaXAtPmlkID09ICcjJykKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJNaXNzaW5nIGRhdGEgZm9yIGlkPSclcydcbiIsIGlwLT5pZCkpOworICAgICAgICBzdHJjcHkoc29hcC0+aWQsIGlwLT5pZCArIDEpOworICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX01JU1NJTkdfSUQ7CisgICAgICB9CisgICAgfQorICB9CisgIGRvCisgIHsgZmxhZyA9IDA7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHV0aW9uIHBoYXNlXG4iKSk7CisgICAgZm9yIChpID0gMDsgaSA8IFNPQVBfSURIQVNIOyBpKyspCisgICAgeyBmb3IgKGlwID0gc29hcC0+aWh0W2ldOyBpcDsgaXAgPSBpcC0+bmV4dCkKKyAgICAgIHsgaWYgKGlwLT5wdHIgJiYgIXNvYXBfaGFzX2NvcGllcyhzb2FwLCAoY29uc3QgY2hhciopaXAtPnB0ciwgKGNvbnN0IGNoYXIqKWlwLT5wdHIgKyBpcC0+c2l6ZSkpCisgICAgICAgIHsgaWYgKGlwLT5jb3B5KQorICAgICAgICAgIHsgcmVnaXN0ZXIgdm9pZCAqcCwgKipxID0gKHZvaWQqKilpcC0+Y29weTsKKyAgICAgICAgICAgIERCR0xPRyhURVNULCBpZiAocSkgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlRyYXZlcnNpbmcgY29weSBjaGFpbiB0byByZXNvbHZlIGlkPSclcydcbiIsIGlwLT5pZCkpOworICAgICAgICAgICAgaXAtPmNvcHkgPSBOVUxMOworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIuLi4gY29weSAlcCAtPiAlcCAoJXUgYnl0ZXMpXG4iLCBpcC0+cHRyLCBxLCAodW5zaWduZWQgaW50KWlwLT5zaXplKSk7CisJICAgICAgcCA9ICpxOworICAgICAgICAgICAgICBtZW1jcHkocSwgaXAtPnB0ciwgaXAtPnNpemUpOworICAgICAgICAgICAgICBxID0gKHZvaWQqKilwOworICAgICAgICAgICAgfSB3aGlsZSAocSk7CisJICAgIGZsYWcgPSAxOworCSAgfQorICAgICAgICAgIGZvciAoZnAgPSBpcC0+Zmxpc3Q7IGZwOyBmcCA9IGlwLT5mbGlzdCkKKyAgICAgICAgICB7IHJlZ2lzdGVyIHVuc2lnbmVkIGludCBrID0gZnAtPmxldmVsOworCSAgICByZWdpc3RlciB2b2lkICpwID0gaXAtPnB0cjsKKyAgICAgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x2aW5nIGZvcndhcmRlZCBkYXRhIHR5cGU9JWQgbG9jYXRpb249JXAgbGV2ZWw9JXUsJXUgaWQ9JyVzJ1xuIiwgaXAtPnR5cGUsIHAsIGlwLT5sZXZlbCwgZnAtPmxldmVsLCBpcC0+aWQpKTsKKwkgICAgd2hpbGUgKGlwLT5sZXZlbCA8IGspCisgICAgICAgICAgICB7IHJlZ2lzdGVyIHZvaWQgKipxID0gKHZvaWQqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yodm9pZCopKTsgIAorCSAgICAgIGlmICghcSkKKwkgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKwkgICAgICAqcSA9IHA7CisgICAgICAgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVzY2VuZGluZyBvbmUgbGV2ZWwsIG5ldyBsb2NhdGlvbj0lcCBob2xkcz0lcC4uLlxuIiwgcSwgKnEpKTsKKyAgICAgICAgICAgICAgcCA9ICh2b2lkKilxOworICAgICAgICAgICAgICBrLS07CisgICAgICAgICAgICB9CisJICAgIGlmIChmcC0+ZmNvcHkpCisJICAgICAgZnAtPmZjb3B5KHNvYXAsIGlwLT50eXBlLCBmcC0+dHlwZSwgZnAtPnB0ciwgZnAtPmxlbiwgcCwgaXAtPnNpemUpOworCSAgICBlbHNlCisJICAgICAgc29hcF9mY29weShzb2FwLCBpcC0+dHlwZSwgZnAtPnR5cGUsIGZwLT5wdHIsIGZwLT5sZW4sIHAsIGlwLT5zaXplKTsKKwkgICAgaXAtPmZsaXN0ID0gZnAtPm5leHQ7CisJICAgIFNPQVBfRlJFRShzb2FwLCBmcCk7CisJICAgIGZsYWcgPSAxOworCSAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9IHdoaWxlIChmbGFnKTsKKyNpZmRlZiBTT0FQX0RFQlVHCisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0lESEFTSDsgaSsrKQorICB7IGZvciAoaXAgPSBzb2FwLT5paHRbaV07IGlwOyBpcCA9IGlwLT5uZXh0KQorICAgIHsgaWYgKGlwLT5jb3B5IHx8IGlwLT5mbGlzdCkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHV0aW9uIGVycm9yOiBmb3J3YXJkZWQgZGF0YSBmb3IgaWQ9JyVzJyBjb3VsZCBub3QgYmUgcHJvcGFnYXRlZCwgcGxlYXNlIHJlcG9ydCB0aGlzIHByb2JsZW0gdG8gdGhlIGRldmVsb3BlcnNcbiIsIGlwLT5pZCkpOworICAgICAgfQorICAgIH0KKyAgfQorI2VuZGlmCisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x1dGlvbiBkb25lXG4iKSk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzaXplX3QKK1NPQVBfRk1BQzIKK3NvYXBfc2l6ZV9ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCwgc2l6ZV90IG4pCit7IGlmIChzb2FwLT5ibGlzdC0+cHRyKQorICB7IHNvYXAtPmJsaXN0LT5zaXplIC09ICooc2l6ZV90Kikoc29hcC0+Ymxpc3QtPnB0ciArIHNpemVvZihjaGFyKikpIC0gbjsKKyAgICAqKHNpemVfdCopKHNvYXAtPmJsaXN0LT5wdHIgKyBzaXplb2YoY2hhciopKSA9IG47CisgIH0KKyAgcmV0dXJuIHNvYXAtPmJsaXN0LT5zaXplOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZmlyc3RfYmxvY2soc3RydWN0IHNvYXAgKnNvYXApCit7IGNoYXIgKnAsICpxLCAqcjsKKyAgcCA9IHNvYXAtPmJsaXN0LT5wdHI7CisgIGlmICghcCkKKyAgICByZXR1cm4gTlVMTDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGaXJzdCBibG9ja1xuIikpOworICByID0gTlVMTDsKKyAgZG8KKyAgeyBxID0gKihjaGFyKiopcDsKKyAgICAqKGNoYXIqKilwID0gcjsKKyAgICByID0gcDsKKyAgICBwID0gcTsKKyAgfSB3aGlsZSAocCk7CisgIHNvYXAtPmJsaXN0LT5wdHIgPSByOworICByZXR1cm4gciArIHNpemVvZihjaGFyKikgKyBzaXplb2Yoc2l6ZV90KTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NoYXIqCitTT0FQX0ZNQUMyCitzb2FwX25leHRfYmxvY2soc3RydWN0IHNvYXAgKnNvYXApCit7IGNoYXIgKnA7CisgIHAgPSBzb2FwLT5ibGlzdC0+cHRyOworICBpZiAocCkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk5leHQgYmxvY2tcbiIpKTsKKyAgICBzb2FwLT5ibGlzdC0+cHRyID0gKihjaGFyKiopcDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgcCk7CisgICAgaWYgKHNvYXAtPmJsaXN0LT5wdHIpCisgICAgICByZXR1cm4gc29hcC0+Ymxpc3QtPnB0ciArIHNpemVvZihjaGFyKikgKyBzaXplb2Yoc2l6ZV90KTsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3NpemVfdAorU09BUF9GTUFDMgorc29hcF9ibG9ja19zaXplKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZXR1cm4gKihzaXplX3QqKShzb2FwLT5ibGlzdC0+cHRyICsgc2l6ZW9mKGNoYXIqKSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2VuZF9ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfYmxpc3QgKmJwOworICBjaGFyICpwLCAqcTsKKyAgYnAgPSBzb2FwLT5ibGlzdDsKKyAgaWYgKGJwKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIG9mIGJsb2NrIHNlcXVlbmNlLCBmcmVlIGFsbCByZW1haW5pbmcgYmxvY2tzXG4iKSk7CisgICAgZm9yIChwID0gYnAtPnB0cjsgcDsgcCA9IHEpCisgICAgeyBxID0gKihjaGFyKiopcDsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBwKTsKKyAgICB9CisgICAgc29hcC0+Ymxpc3QgPSBicC0+bmV4dDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgYnApOworICB9CisgIERCR0xPRyhURVNULCBpZiAoc29hcC0+Ymxpc3QpIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXN0b3JlIHByZXZpb3VzIGJsb2NrIHNlcXVlbmNlXG4iKSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjaGFyKgorU09BUF9GTUFDMgorc29hcF9zYXZlX2Jsb2NrKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpwLCBpbnQgZmxhZykKK3sgcmVnaXN0ZXIgc2l6ZV90IG47CisgIHJlZ2lzdGVyIGNoYXIgKnEsICpzOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNhdmUgYWxsIGJsb2NrcyBpbiBjb250aWd1b3VzIG1lbW9yeSBzcGFjZSBvZiAldSBieXRlcyAoJXAtPiVwKVxuIiwgKHVuc2lnbmVkIGludClzb2FwLT5ibGlzdC0+c2l6ZSwgc29hcC0+Ymxpc3QtPnB0ciwgcCkpOworICBpZiAoc29hcC0+Ymxpc3QtPnNpemUpCisgIHsgaWYgKCFwKQorICAgICAgcCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzb2FwLT5ibGlzdC0+c2l6ZSk7CisgICAgaWYgKHApCisgICAgeyBmb3IgKHMgPSBwLCBxID0gc29hcF9maXJzdF9ibG9jayhzb2FwKTsgcTsgcSA9IHNvYXBfbmV4dF9ibG9jayhzb2FwKSkKKyAgICAgIHsgbiA9IHNvYXBfYmxvY2tfc2l6ZShzb2FwKTsKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgICAgICAgIGlmIChmbGFnKQorCSAgc29hcF91cGRhdGVfcHRycyhzb2FwLCBxLCBxICsgbiwgcywgcSk7CisjZW5kaWYKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5ICV1IGJ5dGVzIGZyb20gJXAgdG8gJXBcbiIsICh1bnNpZ25lZCBpbnQpbiwgcSwgcykpOworICAgICAgICBtZW1jcHkocywgcSwgbik7CisgICAgICAgIHMgKz0gbjsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgfQorICBzb2FwX2VuZF9ibG9jayhzb2FwKTsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfcHV0c2l6ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHNpemUpCit7IHJldHVybiBzb2FwX3B1dHNpemVzKHNvYXAsIHR5cGUsICZzaXplLCAxKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9wdXRzaXplcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgaW50ICpzaXplLCBpbnQgZGltKQoreyByZXR1cm4gc29hcF9wdXRzaXplc29mZnNldHMoc29hcCwgdHlwZSwgc2l6ZSwgTlVMTCwgZGltKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9wdXRzaXplc29mZnNldHMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGludCAqc2l6ZSwgY29uc3QgaW50ICpvZmZzZXQsIGludCBkaW0pCit7IGludCBpOworICBpZiAoIXR5cGUpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgIHsgc3ByaW50Zihzb2FwLT50eXBlLCAiJXNbJWQiLCB0eXBlLCBzaXplWzBdKTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgZGltOyBpKyspCisgICAgICBzcHJpbnRmKHNvYXAtPnR5cGUgKyBzdHJsZW4oc29hcC0+dHlwZSksICIgJWQiLCBzaXplW2ldKTsKKyAgfQorICBlbHNlCisgIHsgaWYgKG9mZnNldCkKKyAgICB7IHNwcmludGYoc29hcC0+dHlwZSwgIiVzWyVkIiwgdHlwZSwgc2l6ZVswXSArIG9mZnNldFswXSk7CisgICAgICBmb3IgKGkgPSAxOyBpIDwgZGltOyBpKyspCisgICAgICAgIHNwcmludGYoc29hcC0+dHlwZSArIHN0cmxlbihzb2FwLT50eXBlKSwgIiwlZCIsIHNpemVbaV0gKyBvZmZzZXRbaV0pOworICAgIH0KKyAgICBlbHNlCisgICAgeyBzcHJpbnRmKHNvYXAtPnR5cGUsICIlc1slZCIsIHR5cGUsIHNpemVbMF0pOworICAgICAgZm9yIChpID0gMTsgaSA8IGRpbTsgaSsrKQorICAgICAgICBzcHJpbnRmKHNvYXAtPnR5cGUgKyBzdHJsZW4oc29hcC0+dHlwZSksICIsJWQiLCBzaXplW2ldKTsKKyAgICB9CisgICAgc3RyY2F0KHNvYXAtPnR5cGUsICJdIik7CisgIH0KKyAgcmV0dXJuIHNvYXAtPnR5cGU7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfcHV0b2Zmc2V0KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgb2Zmc2V0KQoreyByZXR1cm4gc29hcF9wdXRvZmZzZXRzKHNvYXAsICZvZmZzZXQsIDEpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3B1dG9mZnNldHMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGludCAqb2Zmc2V0LCBpbnQgZGltKQoreyByZWdpc3RlciBpbnQgaTsKKyAgc3ByaW50Zihzb2FwLT5hcnJheU9mZnNldCwgIlslZCIsIG9mZnNldFswXSk7CisgIGZvciAoaSA9IDE7IGkgPCBkaW07IGkrKykKKyAgICBzcHJpbnRmKHNvYXAtPmFycmF5T2Zmc2V0ICsgc3RybGVuKHNvYXAtPmFycmF5T2Zmc2V0KSwgIiwlZCIsIG9mZnNldFtpXSk7CisgIHN0cmNhdChzb2FwLT5hcnJheU9mZnNldCwgIl0iKTsKKyAgcmV0dXJuIHNvYXAtPmFycmF5T2Zmc2V0OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NpemUoY29uc3QgaW50ICpzaXplLCBpbnQgZGltKQoreyByZWdpc3RlciBpbnQgaSwgbiA9IHNpemVbMF07CisgIGZvciAoaSA9IDE7IGkgPCBkaW07IGkrKykKKyAgICBuICo9IHNpemVbaV07CisgIHJldHVybiBuOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldG9mZnNldHMoY29uc3QgY2hhciAqYXR0ciwgY29uc3QgaW50ICpzaXplLCBpbnQgKm9mZnNldCwgaW50IGRpbSkKK3sgcmVnaXN0ZXIgaW50IGksIGogPSAwOworICBpZiAob2Zmc2V0KQorICAgIGZvciAoaSA9IDA7IGkgPCBkaW0gJiYgYXR0ciAmJiAqYXR0cjsgaSsrKQorICAgIHsgYXR0cisrOworICAgICAgaiAqPSBzaXplW2ldOworICAgICAgaiArPSBvZmZzZXRbaV0gPSAoaW50KWF0b2woYXR0cik7CisgICAgICBhdHRyID0gc3RyY2hyKGF0dHIsICcsJyk7CisgICAgfQorICBlbHNlCisgICAgZm9yIChpID0gMDsgaSA8IGRpbSAmJiBhdHRyICYmICphdHRyOyBpKyspCisgICAgeyBhdHRyKys7CisgICAgICBqICo9IHNpemVbaV07CisgICAgICBqICs9IChpbnQpYXRvbChhdHRyKTsKKyAgICAgIGF0dHIgPSBzdHJjaHIoYXR0ciwgJywnKTsKKyAgICB9CisgIHJldHVybiBqOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldHNpemUoY29uc3QgY2hhciAqYXR0cjEsIGNvbnN0IGNoYXIgKmF0dHIyLCBpbnQgKmopCit7IHJlZ2lzdGVyIGludCBuLCBrOworICBjaGFyICpzOworICAqaiA9IDA7CisgIGlmICghKmF0dHIxKQorICAgIHJldHVybiAtMTsKKyAgaWYgKCphdHRyMSA9PSAnWycpCisgICAgYXR0cjErKzsKKyAgbiA9IDE7CisgIGZvciAoOzspCisgIHsgayA9IChpbnQpc29hcF9zdHJ0b2woYXR0cjEsICZzLCAxMCk7CisgICAgbiAqPSBrOworICAgIGlmIChrIDwgMCB8fCBuID4gU09BUF9NQVhBUlJBWVNJWkUgfHwgcyA9PSBhdHRyMSkKKyAgICAgIHJldHVybiAtMTsKKyAgICBhdHRyMSA9IHN0cmNocihzLCAnLCcpOworICAgIGlmICghYXR0cjEpCisgICAgICBhdHRyMSA9IHN0cmNocihzLCAnICcpOworICAgIGlmIChhdHRyMiAmJiAqYXR0cjIpCisgICAgeyBhdHRyMisrOworICAgICAgKmogKj0gazsKKyAgICAgIGsgPSAoaW50KXNvYXBfc3RydG9sKGF0dHIyLCAmcywgMTApOworICAgICAgKmogKz0gazsKKyAgICAgIGlmIChrIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgYXR0cjIgPSBzOworICAgIH0KKyAgICBpZiAoIWF0dHIxKQorICAgICAgYnJlYWs7CisgICAgYXR0cjErKzsKKyAgfQorICByZXR1cm4gbiAtICpqOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldHNpemVzKGNvbnN0IGNoYXIgKmF0dHIsIGludCAqc2l6ZSwgaW50IGRpbSkKK3sgcmVnaXN0ZXIgaW50IGksIGssIG47CisgIGlmICghKmF0dHIpCisgICAgcmV0dXJuIC0xOworICBpID0gc3RybGVuKGF0dHIpOworICBuID0gMTsKKyAgZG8KKyAgeyBmb3IgKGkgPSBpLTE7IGkgPj0gMDsgaS0tKQorICAgICAgaWYgKGF0dHJbaV0gPT0gJ1snIHx8IGF0dHJbaV0gPT0gJywnIHx8IGF0dHJbaV0gPT0gJyAnKQorICAgICAgICBicmVhazsKKyAgICBrID0gKGludClhdG9sKGF0dHIgKyBpICsgMSk7CisgICAgbiAqPSBzaXplWy0tZGltXSA9IGs7CisgICAgaWYgKGsgPCAwIHx8IG4gPiBTT0FQX01BWEFSUkFZU0laRSkKKyAgICAgIHJldHVybiAtMTsKKyAgfSB3aGlsZSAoaSA+PSAwICYmIGF0dHJbaV0gIT0gJ1snKTsKKyAgcmV0dXJuIG47Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0cG9zaXRpb24oY29uc3QgY2hhciAqYXR0ciwgaW50ICpwb3MpCit7IHJlZ2lzdGVyIGludCBpLCBuOworICBpZiAoISphdHRyKQorICAgIHJldHVybiAtMTsKKyAgbiA9IDA7CisgIGkgPSAxOworICBkbworICB7IHBvc1tuKytdID0gKGludClhdG9sKGF0dHIgKyBpKTsKKyAgICB3aGlsZSAoYXR0cltpXSAmJiBhdHRyW2ldICE9ICcsJyAmJiBhdHRyW2ldICE9ICddJykKKyAgICAgIGkrKzsKKyAgICBpZiAoYXR0cltpXSA9PSAnLCcpCisgICAgICBpKys7CisgIH0gd2hpbGUgKG4gPCBTT0FQX01BWERJTVMgJiYgYXR0cltpXSAmJiBhdHRyW2ldICE9ICddJyk7CisgIHJldHVybiBuOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1c2hfbmFtZXNwYWNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqbnMpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucDsKKyAgcmVnaXN0ZXIgc3RydWN0IE5hbWVzcGFjZSAqcDsKKyAgcmVnaXN0ZXIgc2hvcnQgaSA9IC0xOworICByZWdpc3RlciBzaXplX3QgbiwgazsKKyAgbiA9IHN0cmxlbihpZCk7CisgIGsgPSBzdHJsZW4obnMpICsgMTsKKyAgcCA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXM7CisgIGlmIChwKQorICB7IGZvciAoaSA9IDA7IHAtPmlkOyBwKyssIGkrKykKKyAgICB7IGlmIChwLT5ucyAmJiAhc3RyY21wKG5zLCBwLT5ucykpCisgICAgICB7IGlmIChwLT5vdXQpCisgICAgICAgIHsgU09BUF9GUkVFKHNvYXAsIHAtPm91dCk7CisgICAgICAgICAgcC0+b3V0ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChwLT5vdXQpCisgICAgICB7IGlmICghc3RyY21wKG5zLCBwLT5vdXQpKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZWxzZSBpZiAocC0+aW4pCisgICAgICB7IGlmICghc29hcF90YWdfY21wKG5zLCBwLT5pbikpCisgICAgICAgIHsgaWYgKChwLT5vdXQgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgaykpKQorICAgICAgICAgICAgc3RyY3B5KHAtPm91dCwgbnMpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmICghcCB8fCAhcC0+aWQpCisgICAgICBpID0gLTE7CisgIH0KKyAgaWYgKGkgPj0gMCkKKyAgICBrID0gMDsKKyAgbnAgPSAoc3RydWN0IHNvYXBfbmxpc3QqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9ubGlzdCkgKyBuICsgayk7CisgIGlmICghbnApCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgIG5wLT5uZXh0ID0gc29hcC0+bmxpc3Q7CisgIHNvYXAtPm5saXN0ID0gbnA7CisgIG5wLT5sZXZlbCA9IHNvYXAtPmxldmVsOworICBucC0+aW5kZXggPSBpOworICBzdHJjcHkobnAtPmlkLCBpZCk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUHVzaCBuYW1lc3BhY2UgYmluZGluZyAobGV2ZWw9JXUpICclcycgJyVzJ1xuIiwgc29hcC0+bGV2ZWwsIGlkLCBucykpOworICBpZiAoaSA8IDApCisgIHsgbnAtPm5zID0gbnAtPmlkICsgbiArIDE7CisgICAgc3RyY3B5KG5wLT5ucywgbnMpOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUHVzaCBOT1QgT0s6IG5vIG1hdGNoIGZvdW5kIGZvciAnJXMnIGluIG5hbWVzcGFjZSBtYXBwaW5nIHRhYmxlIChhZGRlZCB0byBzdGFjayBhbnl3YXkpXG4iLCBucykpOworICB9CisgIGVsc2UKKyAgeyBucC0+bnMgPSBOVUxMOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUHVzaCBPSyAoJyVzJyBtYXRjaGVzICclcycgaW4gbmFtZXNwYWNlIHRhYmxlKVxuIiwgaWQsIHAtPmlkKSk7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3BvcF9uYW1lc3BhY2Uoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucDsKKyAgd2hpbGUgKHNvYXAtPm5saXN0ICYmIHNvYXAtPm5saXN0LT5sZXZlbCA+PSBzb2FwLT5sZXZlbCkKKyAgeyBucCA9IHNvYXAtPm5saXN0LT5uZXh0OworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUG9wcGVkIG5hbWVzcGFjZSBiaW5kaW5nIChsZXZlbD0ldSkgJyVzJ1xuIiwgc29hcC0+bGV2ZWwsIHNvYXAtPm5saXN0LT5pZCkpOworICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5ubGlzdCk7CisgICAgc29hcC0+bmxpc3QgPSBucDsKKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX21hdGNoX25hbWVzcGFjZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQxLCBjb25zdCBjaGFyICppZDIsIGludCBuMSwgaW50IG4yKSAKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wID0gc29hcC0+bmxpc3Q7CisgIHdoaWxlIChucCAmJiAoc3RybmNtcChucC0+aWQsIGlkMSwgbjEpIHx8IG5wLT5pZFtuMV0pKQorICAgIG5wID0gbnAtPm5leHQ7CisgIGlmIChucCkKKyAgeyBpZiAobnAtPmluZGV4IDwgMAorICAgICB8fCAoc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tucC0+aW5kZXhdLmlkCisgICAgICAmJiAoc3RybmNtcChzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW25wLT5pbmRleF0uaWQsIGlkMiwgbjIpCisgICAgICAgfHwgc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tucC0+aW5kZXhdLmlkW24yXSkpKQorICAgICAgcmV0dXJuIFNPQVBfTkFNRVNQQUNFOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIGlmIChuMSA9PSAzICYmIG4xID09IG4yICYmICFzdHJjbXAoaWQxLCAieG1sIikgJiYgIXN0cmNtcChpZDEsIGlkMikpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIHJldHVybiBTT0FQX1NZTlRBWF9FUlJPUjsgCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9jdXJyZW50X25hbWVzcGFjZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnA7CisgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnM7CisgIG5wID0gc29hcC0+bmxpc3Q7CisgIGlmICghKHMgPSBzdHJjaHIodGFnLCAnOicpKSkKKyAgeyB3aGlsZSAobnAgJiYgKm5wLT5pZCkgLyogZmluZCBkZWZhdWx0IG5hbWVzcGFjZSwgaWYgcHJlc2VudCAqLworICAgICAgbnAgPSBucC0+bmV4dDsKKyAgfQorICBlbHNlCisgIHsgd2hpbGUgKG5wICYmIChzdHJuY21wKG5wLT5pZCwgdGFnLCBzIC0gdGFnKSB8fCBucC0+aWRbcyAtIHRhZ10pKQorICAgICAgbnAgPSBucC0+bmV4dDsKKyAgICBpZiAoIW5wKQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX05BTUVTUEFDRTsKKyAgfQorICBpZiAobnApCisgIHsgaWYgKG5wLT5pbmRleCA+PSAwKQorICAgICAgcmV0dXJuIHNvYXAtPm5hbWVzcGFjZXNbbnAtPmluZGV4XS5uczsKKyAgICBpZiAobnAtPm5zKQorICAgICAgcmV0dXJuIHNvYXBfc3RyZHVwKHNvYXAsIG5wLT5ucyk7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfdGFnX2NtcChjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICp0KQoreyBmb3IgKDs7KQorICB7IHJlZ2lzdGVyIGludCBjMSA9ICpzOworICAgIHJlZ2lzdGVyIGludCBjMiA9ICp0OworICAgIGlmICghYzEgfHwgYzEgPT0gJyInKQorICAgICAgYnJlYWs7CisgICAgaWYgKGMyICE9ICctJykKKyAgICB7IGlmIChjMSAhPSBjMikKKyAgICAgIHsgaWYgKGMxID49ICdBJyAmJiBjMSA8PSAnWicpCisgICAgICAgICAgYzEgKz0gJ2EnIC0gJ0EnOworICAgICAgICBpZiAoYzIgPj0gJ0EnICYmIGMyIDw9ICdaJykKKyAgICAgICAgICBjMiArPSAnYScgLSAnQSc7CisgICAgICB9CisgICAgICBpZiAoYzEgIT0gYzIpCisgICAgICB7IGlmIChjMiAhPSAnKicpCisgICAgICAgICAgcmV0dXJuIDE7CisJYzIgPSAqKyt0OworICAgICAgICBpZiAoIWMyKQorCSAgcmV0dXJuIDA7CisgICAgICAgIGlmIChjMiA+PSAnQScgJiYgYzIgPD0gJ1onKQorICAgICAgICAgIGMyICs9ICdhJyAtICdBJzsKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeyBjMSA9ICpzOworCSAgaWYgKCFjMSB8fCBjMSA9PSAnIicpCisJICAgIGJyZWFrOworCSAgaWYgKGMxID49ICdBJyAmJiBjMSA8PSAnWicpCisgICAgICAgICAgICBjMSArPSAnYScgLSAnQSc7CisgICAgICAgICAgaWYgKGMxID09IGMyICYmICFzb2FwX3RhZ19jbXAocyArIDEsIHQgKyAxKSkKKyAgICAgICAgICAgIHJldHVybiAwOworCSAgcysrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBzKys7CisgICAgdCsrOworICB9CisgIGlmICgqdCA9PSAnKicgJiYgIXRbMV0pCisgICAgcmV0dXJuIDA7CisgIHJldHVybiAqdDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9tYXRjaF90YWcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZzEsIGNvbnN0IGNoYXIgKnRhZzIpCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnMsICp0OworICBpZiAoIXRhZzEgfHwgIXRhZzIgfHwgISp0YWcyKQorICAgIHJldHVybiBTT0FQX09LOworICBzID0gc3RyY2hyKHRhZzEsICc6Jyk7CisgIHQgPSBzdHJjaHIodGFnMiwgJzonKTsKKyAgaWYgKHQpCisgIHsgaWYgKHMpCisgICAgeyBpZiAodFsxXSAmJiBTT0FQX1NUUkNNUChzICsgMSwgdCArIDEpKQorICAgICAgICByZXR1cm4gU09BUF9UQUdfTUlTTUFUQ0g7CisgICAgICBpZiAodCAhPSB0YWcyICYmIHNvYXBfbWF0Y2hfbmFtZXNwYWNlKHNvYXAsIHRhZzEsIHRhZzIsIHMgLSB0YWcxLCB0IC0gdGFnMikpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVGFncyAnJXMnIGFuZCAnJXMnIG1hdGNoIGJ1dCBuYW1lc3BhY2VzIGRpZmZlclxuIiwgdGFnMSwgdGFnMikpOworICAgICAgICByZXR1cm4gU09BUF9UQUdfTUlTTUFUQ0g7CisgICAgICB9CisgICAgfSAKKyAgICBlbHNlIGlmIChTT0FQX1NUUkNNUCh0YWcxLCB0ICsgMSkpCisgICAgICByZXR1cm4gU09BUF9UQUdfTUlTTUFUQ0g7CisgICAgZWxzZSBpZiAodCAhPSB0YWcyICYmIHNvYXBfbWF0Y2hfbmFtZXNwYWNlKHNvYXAsIHRhZzEsIHRhZzIsIDAsIHQgLSB0YWcyKSkKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVGFncyAnJXMnIGFuZCAnJXMnIG1hdGNoIGJ1dCBuYW1lc3BhY2VzIGRpZmZlclxuIiwgdGFnMSwgdGFnMikpOworICAgICAgcmV0dXJuIFNPQVBfVEFHX01JU01BVENIOworICAgIH0KKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlRhZ3MgYW5kIChkZWZhdWx0KSBuYW1lc3BhY2VzIG1hdGNoOiAnJXMnICclcydcbiIsIHRhZzEsIHRhZzIpKTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICBpZiAocykKKyAgeyBpZiAoU09BUF9TVFJDTVAocyArIDEsIHRhZzIpKQorICAgICAgcmV0dXJuIFNPQVBfVEFHX01JU01BVENIOworICB9CisgIGVsc2UgaWYgKFNPQVBfU1RSQ01QKHRhZzEsIHRhZzIpKQorICAgIHJldHVybiBTT0FQX1RBR19NSVNNQVRDSDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJUYWdzIG1hdGNoOiAnJXMnICclcydcbiIsIHRhZzEsIHRhZzIpKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfbWF0Y2hfYXJyYXkoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnR5cGUpCit7IGlmICgqc29hcC0+YXJyYXlUeXBlKQorICAgIGlmIChzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT5hcnJheVR5cGUsIHR5cGUpCisgICAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPmFycmF5VHlwZSwgInhzZDphbnlUeXBlIikKKyAgICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+YXJyYXlUeXBlLCAieHNkOnVyLXR5cGUiKQorICAgICkKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQXJyYXkgdHlwZSBtaXNtYXRjaDogJyVzJyAnJXMnXG4iLCBzb2FwLT5hcnJheVR5cGUsIHR5cGUpKTsKKyAgICAgIHJldHVybiBTT0FQX1RBR19NSVNNQVRDSDsKKyAgICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJU1NMCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIFdJVEhfT1BFTlNTTAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmFuZCgpCit7IHVuc2lnbmVkIGNoYXIgYnVmWzRdOworICBpZiAoIXNzbF9pbml0X2RvbmUpCisgICAgc29hcF9zc2xfaW5pdCgpOworICBSQU5EX3BzZXVkb19ieXRlcyhidWYsIDQpOworICByZXR1cm4gKihpbnQqKWJ1ZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zc2xfc2VydmVyX2NvbnRleHQoc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIHNob3J0IGZsYWdzLCBjb25zdCBjaGFyICprZXlmaWxlLCBjb25zdCBjaGFyICpwYXNzd29yZCwgY29uc3QgY2hhciAqY2FmaWxlLCBjb25zdCBjaGFyICpjYXBhdGgsIGNvbnN0IGNoYXIgKmRoZmlsZSwgY29uc3QgY2hhciAqcmFuZGZpbGUsIGNvbnN0IGNoYXIgKnNpZCkKK3sgaW50IGVycjsKKyAgc29hcC0+a2V5ZmlsZSA9IGtleWZpbGU7CisgIHNvYXAtPnBhc3N3b3JkID0gcGFzc3dvcmQ7CisgIHNvYXAtPmNhZmlsZSA9IGNhZmlsZTsKKyAgc29hcC0+Y2FwYXRoID0gY2FwYXRoOworICBpZiAoZGhmaWxlKQorICB7IHNvYXAtPmRoZmlsZSA9IGRoZmlsZTsKKyAgICBzb2FwLT5yc2EgPSAwOworICB9CisgIGVsc2UKKyAgeyBzb2FwLT5kaGZpbGUgPSBOVUxMOworICAgIHNvYXAtPnJzYSA9IDE7CisgIH0KKyAgc29hcC0+cmFuZGZpbGUgPSByYW5kZmlsZTsKKyAgc29hcC0+cmVxdWlyZV9jbGllbnRfYXV0aCA9IChmbGFncyAmIFNPQVBfU1NMX1JFUVVJUkVfQ0xJRU5UX0FVVEhFTlRJQ0FUSU9OKTsKKyAgaWYgKCEoZXJyID0gc29hcC0+ZnNzbGF1dGgoc29hcCkpKQorICB7IGlmIChzaWQpCisgICAgICBTU0xfQ1RYX3NldF9zZXNzaW9uX2lkX2NvbnRleHQoc29hcC0+Y3R4LCAodW5zaWduZWQgY2hhciopc2lkLCBzdHJsZW4oc2lkKSk7CisgIH0KKyAgcmV0dXJuIGVycjsgCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc3NsX2NsaWVudF9jb250ZXh0KHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBzaG9ydCBmbGFncywgY29uc3QgY2hhciAqa2V5ZmlsZSwgY29uc3QgY2hhciAqcGFzc3dvcmQsIGNvbnN0IGNoYXIgKmNhZmlsZSwgY29uc3QgY2hhciAqY2FwYXRoLCBjb25zdCBjaGFyICpyYW5kZmlsZSkKK3sgc29hcC0+a2V5ZmlsZSA9IGtleWZpbGU7CisgIHNvYXAtPnBhc3N3b3JkID0gcGFzc3dvcmQ7CisgIHNvYXAtPmNhZmlsZSA9IGNhZmlsZTsKKyAgc29hcC0+Y2FwYXRoID0gY2FwYXRoOworICBzb2FwLT5kaGZpbGUgPSBOVUxMOworICBzb2FwLT5yc2EgPSAwOworICBzb2FwLT5yYW5kZmlsZSA9IHJhbmRmaWxlOworICBzb2FwLT5yZXF1aXJlX3NlcnZlcl9hdXRoID0gKGZsYWdzICYgU09BUF9TU0xfUkVRVUlSRV9TRVJWRVJfQVVUSEVOVElDQVRJT04pOworICByZXR1cm4gc29hcC0+ZnNzbGF1dGgoc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NzbF9pbml0KCkKK3sgLyogTm90ZTogZm9yIE1UIHN5c3RlbXMsIHRoZSBtYWluIHByb2dyYW0gTVVTVCBjYWxsIHNvYXBfc3NsX2luaXQoKSBiZWZvcmUgYW55IHRocmVhZHMgYXJlIHN0YXJ0ZWQgKi8KKyAgaWYgKCFzc2xfaW5pdF9kb25lKQorICB7IHNzbF9pbml0X2RvbmUgPSAxOworICAgIFNTTF9saWJyYXJ5X2luaXQoKTsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgU1NMX2xvYWRfZXJyb3Jfc3RyaW5ncygpOworI2VuZGlmCisgICAgaWYgKCFSQU5EX2xvYWRfZmlsZSgiL2Rldi91cmFuZG9tIiwgMTAyNCkpCisgICAgeyBjaGFyIGJ1ZlsxMDI0XTsKKyAgICAgIFJBTkRfc2VlZChidWYsIHNpemVvZihidWYpKTsKKyAgICAgIHdoaWxlICghUkFORF9zdGF0dXMoKSkKKyAgICAgIHsgaW50IHIgPSByYW5kKCk7CisgICAgICAgIFJBTkRfc2VlZCgmciwgc2l6ZW9mKGludCkpOworICAgICAgfQorICAgIH0KKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNvbnN0IGNoYXIgKgorc3NsX2Vycm9yKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgcmV0KQoreyBpbnQgZXJyID0gU1NMX2dldF9lcnJvcihzb2FwLT5zc2wsIHJldCk7CisgIGNvbnN0IGNoYXIgKm1zZyA9IHNvYXBfc3RyX2NvZGUoaF9zc2xfZXJyb3JfY29kZXMsIGVycik7CisgIGlmIChtc2cpCisgICAgc3RyY3B5KHNvYXAtPm1zZ2J1ZiwgbXNnKTsKKyAgZWxzZQorICAgIHJldHVybiBFUlJfZXJyb3Jfc3RyaW5nKGVyciwgc29hcC0+bXNnYnVmKTsKKyAgaWYgKEVSUl9wZWVrX2Vycm9yKCkpCisgIHsgdW5zaWduZWQgbG9uZyByOworICAgIHN0cmNhdChzb2FwLT5tc2didWYsICJcbiIpOworICAgIHdoaWxlICgociA9IEVSUl9nZXRfZXJyb3IoKSkpCisgICAgICBFUlJfZXJyb3Jfc3RyaW5nX24ociwgc29hcC0+bXNnYnVmICsgc3RybGVuKHNvYXAtPm1zZ2J1ZiksIHNpemVvZihzb2FwLT5tc2didWYpIC0gc3RybGVuKHNvYXAtPm1zZ2J1ZikpOworICB9IAorICBlbHNlCisgIHsgc3dpdGNoIChyZXQpCisgICAgeyBjYXNlIDA6CisgICAgICAgIHN0cmNweShzb2FwLT5tc2didWYsICJFT0Ygd2FzIG9ic2VydmVkIHRoYXQgdmlvbGF0ZXMgdGhlIHByb3RvY29sLiBUaGUgY2xpZW50IHByb2JhYmx5IHByb3ZpZGVkIGludmFsaWQgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24uIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAtMToKKyAgICAgICAgc3ByaW50Zihzb2FwLT5tc2didWYsICJFcnJvciBvYnNlcnZlZCBieSB1bmRlcmx5aW5nIEJJTzogJXMiLCBzdHJlcnJvcihlcnJubykpOyAgCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gc29hcC0+bXNnYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc3NsX3Bhc3N3b3JkKGNoYXIgKmJ1ZiwgaW50IG51bSwgaW50IHJ3ZmxhZywgdm9pZCAqdXNlcmRhdGEpCit7IGlmIChudW0gPCAoaW50KXN0cmxlbigoY2hhciopdXNlcmRhdGEpICsgMSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIHN0cmxlbihzdHJjcHkoYnVmLCAoY2hhciopdXNlcmRhdGEpKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVGhpcyBjYWxsYmFjayBpcyBpbmNsdWRlZCBmb3IgZnV0dXJlIHJlZmVyZW5jZXMuIEl0IHNob3VsZCBub3QgYmUgZGVsZXRlZAorI2lmbmRlZiBQQUxNXzIKK3N0YXRpYyBESCAqCitzc2xfdG1wX2RoKFNTTCAqc3NsLCBpbnQgaXNfZXhwb3J0LCBpbnQga2V5bGVuZ3RoKQoreyBzdGF0aWMgREggKmRoNTEyID0gTlVMTDsKKyAgc3RhdGljIERIICpkaDEwMjQgPSBOVUxMOworICBESCAqZGg7CisgIHN3aXRjaCAoa2V5bGVuZ3RoKQorICB7IGNhc2UgNTEyOgorICAgICAgaWYgKCFkaDUxMikKKyAgICAgIHsgQklPICpiaW8gPSBCSU9fbmV3X2ZpbGUoImRoNTEyLnBlbSIsICJyIik7CisgICAgICAgIGlmIChiaW8pCisgICAgICAgIHsgZGg1MTIgPSBQRU1fcmVhZF9iaW9fREhwYXJhbXMoYmlvLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICBCSU9fZnJlZShiaW8pOworICAgICAgICAgIHJldHVybiBkaDUxMjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gZGg1MTI7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmICghZGgxMDI0KQorICAgICAgeyBCSU8gKmJpbyA9IEJJT19uZXdfZmlsZSgiZGgxMDI0LnBlbSIsICJyIik7CisgICAgICAgIGlmIChiaW8pCisgICAgICAgIHsgZGgxMDI0ID0gUEVNX3JlYWRfYmlvX0RIcGFyYW1zKGJpbywgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgQklPX2ZyZWUoYmlvKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZGggPSBkaDEwMjQ7CisgIH0KKyAgcmV0dXJuIGRoOworfQorI2VuZGlmCisqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NzbF9hdXRoX2luaXQoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmICghc3NsX2luaXRfZG9uZSkKKyAgICBzb2FwX3NzbF9pbml0KCk7CisgIGlmICghc29hcC0+Y3R4KQorICB7IGlmICghKHNvYXAtPmN0eCA9IFNTTF9DVFhfbmV3KFNTTHYyM19tZXRob2QoKSkpKQorICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3Qgc2V0dXAgY29udGV4dCIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgfQorICBpZiAoc29hcC0+cmFuZGZpbGUpCisgIHsgaWYgKCFSQU5EX2xvYWRfZmlsZShzb2FwLT5yYW5kZmlsZSwgLTEpKQorICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3QgbG9hZCByYW5kb21uZXNzIiwgU09BUF9TU0xfRVJST1IpOworICB9CisgIGlmIChzb2FwLT5jYWZpbGUgfHwgc29hcC0+Y2FwYXRoKQorICB7IGlmICghU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoc29hcC0+Y3R4LCBzb2FwLT5jYWZpbGUsIHNvYXAtPmNhcGF0aCkpCisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCByZWFkIENBIGZpbGUgYW5kIGRpcmVjdG9yeSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICBpZiAoc29hcC0+Y2FmaWxlICYmIHNvYXAtPnJlcXVpcmVfY2xpZW50X2F1dGgpCisgICAgICBTU0xfQ1RYX3NldF9jbGllbnRfQ0FfbGlzdChzb2FwLT5jdHgsIFNTTF9sb2FkX2NsaWVudF9DQV9maWxlKHNvYXAtPmNhZmlsZSkpOworICB9CisgIGlmICghU1NMX0NUWF9zZXRfZGVmYXVsdF92ZXJpZnlfcGF0aHMoc29hcC0+Y3R4KSkKKyAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCByZWFkIGRlZmF1bHQgQ0EgZmlsZSBhbmQvb3IgZGlyZWN0b3J5IiwgU09BUF9TU0xfRVJST1IpOworLyogU2VlIGJlbG93ICovCisgIGlmIChzb2FwLT5rZXlmaWxlKQorICB7IGlmICghU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZShzb2FwLT5jdHgsIHNvYXAtPmtleWZpbGUpKQorICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3QgcmVhZCBjZXJ0aWZpY2F0ZSBrZXkgZmlsZSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICBpZiAoc29hcC0+cGFzc3dvcmQpCisgICAgeyBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYl91c2VyZGF0YShzb2FwLT5jdHgsICh2b2lkKilzb2FwLT5wYXNzd29yZCk7CisgICAgICBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYihzb2FwLT5jdHgsIHNzbF9wYXNzd29yZCk7CisgICAgfQorICAgIGlmICghU1NMX0NUWF91c2VfUHJpdmF0ZUtleV9maWxlKHNvYXAtPmN0eCwgc29hcC0+a2V5ZmlsZSwgU1NMX0ZJTEVUWVBFX1BFTSkpCisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCByZWFkIGtleSBmaWxlIiwgU09BUF9TU0xfRVJST1IpOworICB9CisvKiBTdWdnZXN0ZWQgYWx0ZXJuYXRpdmUgYXBwcm9hY2ggdG8gY2hlY2sgY2FmaWxlIGZpcnN0IGJlZm9yZSB0aGUga2V5IGZpbGU6CisgIGlmIChzb2FwLT5wYXNzd29yZCkKKyAgeyBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYl91c2VyZGF0YShzb2FwLT5jdHgsICh2b2lkKilzb2FwLT5wYXNzd29yZCk7CisgICAgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2Ioc29hcC0+Y3R4LCBzc2xfcGFzc3dvcmQpOworICB9CisgIGlmICghc29hcC0+Y2FmaWxlIHx8ICFTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKHNvYXAtPmN0eCwgc29hcC0+Y2FmaWxlKSkKKyAgeyBpZiAoc29hcC0+a2V5ZmlsZSkKKyAgICB7IGlmICghU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZShzb2FwLT5jdHgsIHNvYXAtPmtleWZpbGUpKQorICAgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCByZWFkIGNlcnRpZmljYXRlIG9yIGtleSBmaWxlIiwgU09BUF9TU0xfRVJST1IpOworICAgICAgaWYgKCFTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X2ZpbGUoc29hcC0+Y3R4LCBzb2FwLT5rZXlmaWxlLCBTU0xfRklMRVRZUEVfUEVNKSkKKyAgICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3QgcmVhZCBrZXkgZmlsZSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICB9CisgIH0KKyovCisgIGlmIChzb2FwLT5yc2EpCisgIHsgUlNBICpyc2EgPSBSU0FfZ2VuZXJhdGVfa2V5KDEwMjQsIFJTQV9GNCwgTlVMTCwgTlVMTCk7CisgICAgaWYgKCFTU0xfQ1RYX3NldF90bXBfcnNhKHNvYXAtPmN0eCwgcnNhKSkKKyAgICB7IGlmIChyc2EpCisgICAgICAgIFJTQV9mcmVlKHJzYSk7CisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCBzZXQgUlNBIGtleSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICB9CisgICAgUlNBX2ZyZWUocnNhKTsKKyAgfQorICBlbHNlIGlmIChzb2FwLT5kaGZpbGUpCisgIHsgREggKmRoID0gMDsKKyAgICBCSU8gKmJpbzsKKyAgICBiaW8gPSBCSU9fbmV3X2ZpbGUoc29hcC0+ZGhmaWxlLCAiciIpOworICAgIGlmICghYmlvKQorICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3QgcmVhZCBESCBmaWxlIiwgU09BUF9TU0xfRVJST1IpOworICAgIGRoID0gUEVNX3JlYWRfYmlvX0RIcGFyYW1zKGJpbywgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgQklPX2ZyZWUoYmlvKTsKKyAgICBpZiAoU1NMX0NUWF9zZXRfdG1wX2RoKHNvYXAtPmN0eCwgZGgpIDwgMCkKKyAgICB7IGlmIChkaCkKKyAgICAgICAgREhfZnJlZShkaCk7CisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCBzZXQgREggcGFyYW1ldGVycyIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICB9CisgICAgREhfZnJlZShkaCk7CisgIH0KKyAgU1NMX0NUWF9zZXRfb3B0aW9ucyhzb2FwLT5jdHgsIFNTTF9PUF9BTEwgfCBTU0xfT1BfTk9fU1NMdjIpOworICBTU0xfQ1RYX3NldF92ZXJpZnkoc29hcC0+Y3R4LCBzb2FwLT5yZXF1aXJlX2NsaWVudF9hdXRoID8gKFNTTF9WRVJJRllfUEVFUiB8IFNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQpIDogc29hcC0+cmVxdWlyZV9zZXJ2ZXJfYXV0aCA/IFNTTF9WRVJJRllfUEVFUiA6IFNTTF9WRVJJRllfTk9ORSwgc29hcC0+ZnNzbHZlcmlmeSk7CisjaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCAweDAwOTA1MTAwTCkKKyAgU1NMX0NUWF9zZXRfdmVyaWZ5X2RlcHRoKHNvYXAtPmN0eCwgMSk7IAorI2Vsc2UKKyAgU1NMX0NUWF9zZXRfdmVyaWZ5X2RlcHRoKHNvYXAtPmN0eCwgOSk7IAorI2VuZGlmICAKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzc2xfdmVyaWZ5X2NhbGxiYWNrKGludCBvaywgWDUwOV9TVE9SRV9DVFggKnN0b3JlKQoreworI2lmZGVmIFNPQVBfREVCVUcKKyAgaWYgKCFvaykgCisgIHsgY2hhciBkYXRhWzI1Nl07CisgICAgWDUwOSAqY2VydCA9IFg1MDlfU1RPUkVfQ1RYX2dldF9jdXJyZW50X2NlcnQoc3RvcmUpOworICAgIGZwcmludGYoc3RkZXJyLCAiU1NMIHZlcmlmeSBlcnJvciBvciB3YXJuaW5nIHdpdGggY2VydGlmaWNhdGUgYXQgZGVwdGggJWQ6ICVzXG4iLCBYNTA5X1NUT1JFX0NUWF9nZXRfZXJyb3JfZGVwdGgoc3RvcmUpLCBYNTA5X3ZlcmlmeV9jZXJ0X2Vycm9yX3N0cmluZyhYNTA5X1NUT1JFX0NUWF9nZXRfZXJyb3Ioc3RvcmUpKSk7CisgICAgWDUwOV9OQU1FX29uZWxpbmUoWDUwOV9nZXRfaXNzdWVyX25hbWUoY2VydCksIGRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgZnByaW50ZihzdGRlcnIsICJjZXJ0aWZpY2F0ZSBpc3N1ZXIgJXNcbiIsIGRhdGEpOworICAgIFg1MDlfTkFNRV9vbmVsaW5lKFg1MDlfZ2V0X3N1YmplY3RfbmFtZShjZXJ0KSwgZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImNlcnRpZmljYXRlIHN1YmplY3QgJXNcbiIsIGRhdGEpOworICB9CisjZW5kaWYKKyAgLyogTm90ZTogcmV0dXJuIDEgdG8gY29udGludWUsIGJ1dCB1bnNhZmUgcHJvZ3Jlc3Mgd2lsbCBiZSB0ZXJtaW5hdGVkIGJ5IFNTTCAqLworICByZXR1cm4gb2s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc3NsX2FjY2VwdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgQklPICpiaW87CisgIGludCBpLCByOworICBpZiAoIXNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiTm8gc29ja2V0IGluIHNvYXBfc3NsX2FjY2VwdCgpIiwgU09BUF9TU0xfRVJST1IpOworICBpZiAoIXNvYXAtPmN0eCAmJiAoc29hcC0+ZXJyb3IgPSBzb2FwLT5mc3NsYXV0aChzb2FwKSkpCisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIGlmICghc29hcC0+c3NsKQorICB7IHNvYXAtPnNzbCA9IFNTTF9uZXcoc29hcC0+Y3R4KTsKKyAgICBpZiAoIXNvYXAtPnNzbCkKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIlNTTF9uZXcoKSBmYWlsZWQgaW4gc29hcF9zc2xfYWNjZXB0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgIH0KKyAgZWxzZQorICAgIFNTTF9jbGVhcihzb2FwLT5zc2wpOworICBzb2FwLT5pbW9kZSB8PSBTT0FQX0VOQ19TU0w7CisgIHNvYXAtPm9tb2RlIHw9IFNPQVBfRU5DX1NTTDsKKyNpZiBkZWZpbmVkKFdJTjMyKQorICB7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRklPTkJJTywgJm5vbmJsb2NraW5nKTsKKyAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICB7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgaW9jdGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRklPTkJJTywgKGludCkmbm9uYmxvY2tpbmcpOworICB9CisjZWxzZQorICBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGX0dFVEZMKXxPX05PTkJMT0NLKTsKKyNlbmRpZgorICBiaW8gPSBCSU9fbmV3X3NvY2tldCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBCSU9fTk9DTE9TRSk7CisgIFNTTF9zZXRfYmlvKHNvYXAtPnNzbCwgYmlvLCBiaW8pOworICBpID0gMTAwOyAvKiAxMDAgKiAwLjEgbXMgcmV0cmllcyAqLworICB3aGlsZSAoKHIgPSBTU0xfYWNjZXB0KHNvYXAtPnNzbCkpIDw9IDApCisgIHsgaW50IGVyciA9IFNTTF9nZXRfZXJyb3Ioc29hcC0+c3NsLCByKTsKKyAgICBpZiAoZXJyID09IFNTTF9FUlJPUl9XQU5UX1JFQUQgfHwgZXJyID09IFNTTF9FUlJPUl9XQU5UX1dSSVRFKQorICAgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgIGZkX3NldCBmZDsKKyAgICAgIGlmIChpLS0gPD0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICB0aW1lb3V0LnR2X3NlYyA9IDA7CisgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAxMDAwMDA7CisgICAgICBGRF9aRVJPKCZmZCk7CisgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJmZkKTsKKyAgICAgIHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgJmZkLCBOVUxMLCAmZmQsICZ0aW1lb3V0KTsKKyAgICAgIGlmIChyIDwgMCAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSKQorICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgcmV0dXJuIFNPQVBfRU9GOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeyBzb2FwLT5lcnJudW0gPSBlcnI7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyNpZiBkZWZpbmVkKFdJTjMyKQorICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRklPTkJJTywgJmJsb2NraW5nKTsKKyAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgaW9jdGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRklPTkJJTywgKGludCkmYmxvY2tpbmcpOworICB9CisjZWxzZQorICBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGX0dFVEZMKSZ+T19OT05CTE9DSyk7CisjZW5kaWYKKyAgaWYgKHIgPD0gMCkKKyAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCBzc2xfZXJyb3Ioc29hcCwgciksICJTU0xfYWNjZXB0KCkgZmFpbGVkIGluIHNvYXBfc3NsX2FjY2VwdCgpIiwgU09BUF9TU0xfRVJST1IpOworICAgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgIHJldHVybiBTT0FQX1NTTF9FUlJPUjsKKyAgfQorICBpZiAoc29hcC0+cmVxdWlyZV9jbGllbnRfYXV0aCkKKyAgeyBYNTA5ICpwZWVyOworICAgIGludCBlcnI7CisgICAgaWYgKChlcnIgPSBTU0xfZ2V0X3ZlcmlmeV9yZXN1bHQoc29hcC0+c3NsKSkgIT0gWDUwOV9WX09LKQorICAgIHsgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICByZXR1cm4gc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIFg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKGVyciksICJTU0wgY2VydGlmaWNhdGUgcHJlc2VudGVkIGJ5IHBlZXIgY2Fubm90IGJlIHZlcmlmaWVkIGluIHNvYXBfc3NsX2FjY2VwdCgpIiwgU09BUF9TU0xfRVJST1IpOworICAgIH0KKyAgICBwZWVyID0gU1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKHNvYXAtPnNzbCk7CisgICAgaWYgKCFwZWVyKQorICAgIHsgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICByZXR1cm4gc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiTm8gU1NMIGNlcnRpZmljYXRlIHdhcyBwcmVzZW50ZWQgYnkgdGhlIHBlZXIgaW4gc29hcF9zc2xfYWNjZXB0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgfQorICAgIFg1MDlfZnJlZShwZWVyKTsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2VuZGlmIC8qIFdJVEhfT1BFTlNTTCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Cit0Y3BfaW5pdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+ZXJybW9kZSA9IDE7CisjaWZkZWYgV0lOMzIKKyAgaWYgKHRjcF9kb25lKQorICAgIHJldHVybiAwOworICBlbHNlCisgIHsgV1NBREFUQSB3OworICAgIGlmIChXU0FTdGFydHVwKE1BS0VXT1JEKDEsIDEpLCAmdykpCisgICAgICByZXR1cm4gLTE7CisgICAgdGNwX2RvbmUgPSAxOworICB9CisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZG9uZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgCisjaWZkZWYgU09BUF9ERUJVRworICBpbnQgaTsKKyNlbmRpZgorICBpZiAoc29hcF9jaGVja19zdGF0ZShzb2FwKSkKKyAgICByZXR1cm47CisgIHNvYXBfZnJlZShzb2FwKTsKKyAgd2hpbGUgKHNvYXAtPmNsaXN0KQorICB7IHN0cnVjdCBzb2FwX2NsaXN0ICpwID0gc29hcC0+Y2xpc3QtPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPmNsaXN0KTsKKyAgICBzb2FwLT5jbGlzdCA9IHA7CisgIH0KKyAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7IC8qIHRvIGZvcmNlIGNsb3NlIHRoZSBzb2NrZXQgKi8KKyAgc29hcF9jbG9zZXNvY2soc29hcCk7CisjaWZkZWYgV0lUSF9DT09LSUVTCisgIHNvYXBfZnJlZV9jb29raWVzKHNvYXApOworI2VuZGlmCisgIHdoaWxlIChzb2FwLT5wbHVnaW5zKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BsdWdpbiAqcCA9IHNvYXAtPnBsdWdpbnMtPm5leHQ7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZW1vdmluZyBwbHVnaW4gJyVzJ1xuIiwgc29hcC0+cGx1Z2lucy0+aWQpKTsKKyAgICBpZiAoc29hcC0+cGx1Z2lucy0+ZmNvcHkgfHwgc29hcC0+c3RhdGUgPT0gU09BUF9JTklUKQorICAgICAgc29hcC0+cGx1Z2lucy0+ZmRlbGV0ZShzb2FwLCBzb2FwLT5wbHVnaW5zKTsKKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+cGx1Z2lucyk7CisgICAgc29hcC0+cGx1Z2lucyA9IHA7CisgIH0KKyAgc29hcC0+ZnBsdWdpbiA9IGZwbHVnaW47CisjaWZuZGVmIFdJVEhfTk9IVFRQCisgIHNvYXAtPmZwb3N0ID0gaHR0cF9wb3N0OworICBzb2FwLT5mZ2V0ID0gaHR0cF9nZXQ7CisgIHNvYXAtPmZmb3JtID0gTlVMTDsKKyAgc29hcC0+ZnBvc3RoZHIgPSBodHRwX3Bvc3RfaGVhZGVyOworICBzb2FwLT5mcmVzcG9uc2UgPSBodHRwX3Jlc3BvbnNlOworICBzb2FwLT5mcGFyc2UgPSBodHRwX3BhcnNlOworICBzb2FwLT5mcGFyc2VoZHIgPSBodHRwX3BhcnNlX2hlYWRlcjsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9JUFY2CisgIHNvYXAtPmZyZXNvbHZlID0gdGNwX2dldGhvc3Q7CisjZWxzZQorICBzb2FwLT5mcmVzb2x2ZSA9IE5VTEw7CisjZW5kaWYKKyAgc29hcC0+ZmFjY2VwdCA9IHRjcF9hY2NlcHQ7CisgIHNvYXAtPmZvcGVuID0gdGNwX2Nvbm5lY3Q7CisgIHNvYXAtPmZjbG9zZSA9IHRjcF9kaXNjb25uZWN0OworICBzb2FwLT5mY2xvc2Vzb2NrZXQgPSB0Y3BfY2xvc2Vzb2NrZXQ7CisgIHNvYXAtPmZzaHV0ZG93bnNvY2tldCA9IHRjcF9zaHV0ZG93bnNvY2tldDsKKyAgc29hcC0+ZnNlbmQgPSBmc2VuZDsKKyAgc29hcC0+ZnJlY3YgPSBmcmVjdjsKKyAgc29hcC0+ZnBvbGwgPSBzb2FwX3BvbGw7CisjZWxzZQorICBzb2FwLT5mb3BlbiA9IE5VTEw7CisgIHNvYXAtPmZjbG9zZSA9IE5VTEw7CisgIHNvYXAtPmZwb2xsID0gTlVMTDsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzb2FwLT5mcHJlcGFyZWluaXQgPSBOVUxMOworICBzb2FwLT5mcHJlcGFyZXNlbmQgPSBOVUxMOworICBzb2FwLT5mcHJlcGFyZXJlY3YgPSBOVUxMOworICBzb2FwLT5mcHJlcGFyZWZpbmFsID0gTlVMTDsKKyNlbmRpZgorICBzb2FwLT5mc2V0ZXJyb3IgPSBOVUxMOworICBzb2FwLT5maWdub3JlID0gTlVMTDsKKyAgc29hcC0+ZnNlcnZlbG9vcCA9IE5VTEw7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgIGlmIChzb2FwLT5zZXNzaW9uKQorICB7IFNTTF9TRVNTSU9OX2ZyZWUoc29hcC0+c2Vzc2lvbik7CisgICAgc29hcC0+c2Vzc2lvbiA9IE5VTEw7CisgIH0KKyNlbmRpZgorICBpZiAoc29hcC0+c3RhdGUgPT0gU09BUF9JTklUKQorICB7IGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpKQorICAgIHsgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIpOworICAgICAgc29hcC0+bWFzdGVyID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgICAgaWYgKHNvYXAtPmN0eCkKKyAgICB7IFNTTF9DVFhfZnJlZShzb2FwLT5jdHgpOworICAgICAgc29hcC0+Y3R4ID0gTlVMTDsKKyAgICB9CisjZW5kaWYKKyAgfQorI2lmZGVmIFNPQVBfREVCVUcKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIGxvZ2ZpbGVzXG4iKSk7CisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX01BWExPR1M7IGkrKykKKyAgeyBpZiAoc29hcC0+bG9nZmlsZVtpXSkKKyAgICB7IFNPQVBfRlJFRShzb2FwLCAodm9pZCopc29hcC0+bG9nZmlsZVtpXSk7CisgICAgICBzb2FwLT5sb2dmaWxlW2ldID0gTlVMTDsKKyAgICB9CisgICAgc29hcF9jbG9zZV9sb2dmaWxlKHNvYXAsIGkpOworICB9CisgIHNvYXBfZnJlZV9taHQoc29hcCk7CisgIHNvYXAtPnN0YXRlID0gMDsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfY2xlYW51cChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcF9kb25lKHNvYXApOworI2lmZGVmIFdJTjMyCisgIGlmICghdGNwX2RvbmUpCisgICAgcmV0dXJuOworICB0Y3BfZG9uZSA9IDA7CisgIFdTQUNsZWFudXAoKTsKKyNlbmRpZgorfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNvbnN0IGNoYXIqCit0Y3BfZXJyb3Ioc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKm1zZyA9IE5VTEw7CisgIHN3aXRjaCAoc29hcC0+ZXJybW9kZSkKKyAgeyBjYXNlIDA6CisgICAgICBtc2cgPSBzb2FwX3N0cmVycm9yKHNvYXApOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgbXNnID0gIldTQVN0YXJ0dXAgZmFpbGVkIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICB7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgbXNnID0gc29hcF9zdHJfY29kZShoX2Vycm9yX2NvZGVzLCBzb2FwLT5lcnJudW0pOworICAgICAgaWYgKCFtc2cpCisjZW5kaWYKKyAgICAgIHsgc3ByaW50Zihzb2FwLT5tc2didWYsICJUQ1AvVURQIElQIGVycm9yICVkIiwgc29hcC0+ZXJybnVtKTsKKyAgICAgICAgbXNnID0gc29hcC0+bXNnYnVmOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gbXNnOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY29uc3QgY2hhcioKK2h0dHBfZXJyb3Ioc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdGF0dXMpCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKm1zZyA9IFNPQVBfU1RSX0VPUzsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIG1zZyA9IHNvYXBfc3RyX2NvZGUoaF9odHRwX2Vycm9yX2NvZGVzLCBzdGF0dXMpOworICBpZiAoIW1zZykKKyAgICBtc2cgPSBTT0FQX1NUUl9FT1M7CisjZW5kaWYKKyAgcmV0dXJuIG1zZzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfSVBWNgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Cit0Y3BfZ2V0aG9zdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqYWRkciwgc3RydWN0IGluX2FkZHIgKmluYWRkcikKK3sgc29hcF9pbnQzMiBpYWRkID0gLTE7CisgIHN0cnVjdCBob3N0ZW50IGhvc3RlbnQsICpob3N0ID0gJmhvc3RlbnQ7CisjaWZkZWYgVlhXT1JLUworICBpbnQgaG9zdGludDsKKyAgLyogaW5ldF9hZGRyKCksIGFuZCBob3N0R2V0QnlOYW1lKCkgZXhwZWN0ICJjaGFyICoiOyBhZGRyIGlzIGEgImNvbnN0IGNoYXIgKiIuICovCisgIGlhZGQgPSBpbmV0X2FkZHIoKGNoYXIqKWFkZHIpOworI2Vsc2UKKyNpZiBkZWZpbmVkKF9BSVhWRVJTSU9OXzQzMSkgfHwgZGVmaW5lZChUUlU2NCkKKyAgc3RydWN0IGhvc3RlbnRfZGF0YSBodF9kYXRhOworI2VuZGlmCisjaWZkZWYgQVM0MDAKKyAgaWFkZCA9IGluZXRfYWRkcigodm9pZCopYWRkcik7CisjZWxzZQorICBpYWRkID0gaW5ldF9hZGRyKGFkZHIpOworI2VuZGlmCisjZW5kaWYKKyAgaWYgKGlhZGQgIT0gLTEpCisgIHsgbWVtY3B5KGluYWRkciwgJmlhZGQsIHNpemVvZihpYWRkKSk7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNpZiBkZWZpbmVkKF9fR0xJQkNfXykKKyAgaWYgKGdldGhvc3RieW5hbWVfcihhZGRyLCAmaG9zdGVudCwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTiwgJmhvc3QsICZzb2FwLT5lcnJudW0pIDwgMCkKKyAgICBob3N0ID0gTlVMTDsKKyNlbGlmIGRlZmluZWQoX0FJWFZFUlNJT05fNDMxKSB8fCBkZWZpbmVkKFRSVTY0KQorICBtZW1zZXQoKHZvaWQqKSZodF9kYXRhLCAwLCBzaXplb2YoaHRfZGF0YSkpOworICBpZiAoZ2V0aG9zdGJ5bmFtZV9yKGFkZHIsICZob3N0ZW50LCAmaHRfZGF0YSkgPCAwKQorICB7IGhvc3QgPSBOVUxMOworICAgIHNvYXAtPmVycm51bSA9IGhfZXJybm87CisgIH0KKyNlbGlmIGRlZmluZWQoSEFWRV9HRVRIT1NUQllOQU1FX1IpCisgIGhvc3QgPSBnZXRob3N0YnluYW1lX3IoYWRkciwgJmhvc3RlbnQsIHNvYXAtPmJ1ZiwgU09BUF9CVUZMRU4sICZzb2FwLT5lcnJudW0pOworI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICAvKiBJZiB0aGUgRE5TIHJlc29sdmVyIGxpYnJhcnkgcmVzb2x2TGliIGhhcyBiZWVuIGNvbmZpZ3VyZWQgaW4gdGhlIHZ4V29ya3MKKyAgICogaW1hZ2UsIGEgcXVlcnkgZm9yIHRoZSBob3N0IElQIGFkZHJlc3MgaXMgc2VudCB0byB0aGUgRE5TIHNlcnZlciwgaWYgdGhlCisgICAqIG5hbWUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgbG9jYWwgaG9zdCB0YWJsZS4gKi8KKyAgaG9zdGludCA9IGhvc3RHZXRCeU5hbWUoKGNoYXIqKWFkZHIpOworICBpZiAoaG9zdGludCA9PSBFUlJPUikKKyAgeyBob3N0ID0gTlVMTDsKKyAgICBzb2FwLT5lcnJudW0gPSBzb2FwX2Vycm5vOyAKKyAgfQorI2Vsc2UKKyNpZmRlZiBBUzQwMAorICBpZiAoIShob3N0ID0gZ2V0aG9zdGJ5bmFtZSgodm9pZCopYWRkcikpKQorICAgIHNvYXAtPmVycm51bSA9IGhfZXJybm87CisjZWxzZQorICBpZiAoIShob3N0ID0gZ2V0aG9zdGJ5bmFtZShhZGRyKSkpCisgICAgc29hcC0+ZXJybnVtID0gaF9lcnJubzsKKyNlbmRpZgorI2VuZGlmCisgIGlmICghaG9zdCkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkhvc3QgbmFtZSBub3QgZm91bmRcbiIpKTsKKyAgICByZXR1cm4gU09BUF9FUlI7CisgIH0KKyNpZmRlZiBWWFdPUktTCisgIGluYWRkci0+c19hZGRyID0gaG9zdGludDsKKyNlbHNlCisgIG1lbWNweShpbmFkZHIsIGhvc3QtPmhfYWRkciwgaG9zdC0+aF9sZW5ndGgpOworI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Cit0Y3BfY29ubmVjdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZW5kcG9pbnQsIGNvbnN0IGNoYXIgKmhvc3QsIGludCBwb3J0KQoreworI2lmZGVmIFdJVEhfSVBWNgorICBzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpyZXMsICpyZXNzYXZlOworICBpbnQgZXJyOworI2VuZGlmCisgIHJlZ2lzdGVyIGludCBmZDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGludCBsZW4gPSBTT0FQX0JVRkxFTjsKKyAgaW50IHNldCA9IDE7CisjZW5kaWYKKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQpOworICBzb2FwLT5zb2NrZXQgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICBpZiAodGNwX2luaXQoc29hcCkpCisgIHsgc29hcC0+ZXJybnVtID0gMDsKKyAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiVENQIGluaXQgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgc29hcC0+ZXJybW9kZSA9IDA7CisjaWZkZWYgV0lUSF9JUFY2CisgIG1lbXNldCgodm9pZCopJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKyAgaGludHMuYWlfZmFtaWx5ID0gUEZfVU5TUEVDOworI2lmZGVmIFdJVEhfVURQCisgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX0RHUkFNOworICBlbHNlCisjZW5kaWYKKyAgICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworICBzb2FwLT5lcnJtb2RlID0gMjsKKyAgaWYgKHNvYXAtPnByb3h5X2hvc3QpCisgICAgZXJyID0gZ2V0YWRkcmluZm8oc29hcC0+cHJveHlfaG9zdCwgc29hcF9pbnQycyhzb2FwLCBzb2FwLT5wcm94eV9wb3J0KSwgJmhpbnRzLCAmcmVzKTsKKyAgZWxzZQorICAgIGVyciA9IGdldGFkZHJpbmZvKGhvc3QsIHNvYXBfaW50MnMoc29hcCwgcG9ydCksICZoaW50cywgJnJlcyk7CisgIGlmIChlcnIpCisgIHsgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIGdhaV9zdHJlcnJvcihlcnIpLCAiZ2V0YWRkcmluZm8gZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgcmVzc2F2ZSA9IHJlczsKK2FnYWluOgorICBmZCA9IChpbnQpc29ja2V0KHJlcy0+YWlfZmFtaWx5LCByZXMtPmFpX3NvY2t0eXBlLCByZXMtPmFpX3Byb3RvY29sKTsKKyAgc29hcC0+ZXJybW9kZSA9IDA7CisjZWxzZQorI2lmZGVmIFdJVEhfVURQCisgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgZmQgPSAoaW50KXNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKyAgZWxzZQorI2VuZGlmCisgICAgZmQgPSAoaW50KXNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisjZW5kaWYKKyAgaWYgKGZkIDwgMCkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic29ja2V0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisjaWZkZWYgU09DS0VUX0NMT1NFX09OX0VYRUMKKyNpZmRlZiBXSU4zMgorI2lmbmRlZiBVTkRFUl9DRQorICBTZXRIYW5kbGVJbmZvcm1hdGlvbigoSEFORExFKWZkLCBIQU5ETEVfRkxBR19JTkhFUklULCAwKTsKKyNlbmRpZgorI2Vsc2UKKyAgZmNudGwoZmQsIEZfU0VURkQsIDEpOworI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5jb25uZWN0X2ZsYWdzICYgU09fTElOR0VSKQorICB7IHN0cnVjdCBsaW5nZXIgbGluZ2VyOworICAgIG1lbXNldCgodm9pZCopJmxpbmdlciwgMCwgc2l6ZW9mKGxpbmdlcikpOworICAgIGxpbmdlci5sX29ub2ZmID0gMTsKKyAgICBsaW5nZXIubF9saW5nZXIgPSAwOworICAgIGlmIChzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClmZCwgU09MX1NPQ0tFVCwgU09fTElOR0VSLCAoY2hhciopJmxpbmdlciwgc2l6ZW9mKHN0cnVjdCBsaW5nZXIpKSkKKyAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fTElOR0VSIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisgIH0KKyAgaWYgKChzb2FwLT5jb25uZWN0X2ZsYWdzICYgflNPX0xJTkdFUikgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpZmQsIFNPTF9TT0NLRVQsIHNvYXAtPmNvbm5lY3RfZmxhZ3MgJiB+U09fTElOR0VSLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIGlmIChzb2FwLT5rZWVwX2FsaXZlICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKWZkLCBTT0xfU09DS0VULCBTT19LRUVQQUxJVkUsIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fS0VFUEFMSVZFIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIGlmIChzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClmZCwgU09MX1NPQ0tFVCwgU09fU05EQlVGLCAoY2hhciopJmxlbiwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX1NOREJVRiBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpZmQsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgKGNoYXIqKSZsZW4sIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19SQ1ZCVUYgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNpZmRlZiBUQ1BfTk9ERUxBWQorICBpZiAoIShzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClmZCwgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFRDUF9OT0RFTEFZIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisjZW5kaWYKKyNlbmRpZgorICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiT3BlbmluZyBzb2NrZXQgJWQgdG8gaG9zdD0nJXMnIHBvcnQ9JWRcbiIsIGZkLCBob3N0LCBwb3J0KSk7CisjaWZuZGVmIFdJVEhfSVBWNgorICBzb2FwLT5wZWVybGVuID0gc2l6ZW9mKHNvYXAtPnBlZXIpOworICBtZW1zZXQoKHZvaWQqKSZzb2FwLT5wZWVyLCAwLCBzaXplb2Yoc29hcC0+cGVlcikpOworICBzb2FwLT5wZWVyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICBzb2FwLT5lcnJtb2RlID0gMjsKKyAgaWYgKHNvYXAtPnByb3h5X2hvc3QpCisgIHsgaWYgKHNvYXAtPmZyZXNvbHZlKHNvYXAsIHNvYXAtPnByb3h5X2hvc3QsICZzb2FwLT5wZWVyLnNpbl9hZGRyKSkKKyAgICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJnZXQgcHJveHkgaG9zdCBieSBuYW1lIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisgICAgc29hcC0+cGVlci5zaW5fcG9ydCA9IGh0b25zKChzaG9ydClzb2FwLT5wcm94eV9wb3J0KTsKKyAgfQorICBlbHNlCisgIHsgaWYgKHNvYXAtPmZyZXNvbHZlKHNvYXAsIGhvc3QsICZzb2FwLT5wZWVyLnNpbl9hZGRyKSkKKyAgICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJnZXQgaG9zdCBieSBuYW1lIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisgICAgc29hcC0+cGVlci5zaW5fcG9ydCA9IGh0b25zKChzaG9ydClwb3J0KTsKKyAgfQorICBzb2FwLT5lcnJtb2RlID0gMDsKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICByZXR1cm4gZmQ7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQpCisjaWYgZGVmaW5lZChXSU4zMikKKyAgeyB1X2xvbmcgbm9uYmxvY2tpbmcgPSAxOworICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgJm5vbmJsb2NraW5nKTsKKyAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICB7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgaW9jdGwoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAoaW50KSgmbm9uYmxvY2tpbmcpKTsgLyogbW9kaWZpZWQgdG8gdXNlIGZkICovCisgIH0KKyNlbHNlCisgICAgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfR0VURkwpfE9fTk9OQkxPQ0spOworI2VuZGlmCisgIGVsc2UKKyNpZiBkZWZpbmVkKFdJTjMyKQorICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAmYmxvY2tpbmcpOworICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICBpb2N0bCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sIChpbnQpKCZibG9ja2luZykpOworICB9CisjZWxzZQorICAgIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX0dFVEZMKSZ+T19OT05CTE9DSyk7CisjZW5kaWYKKyNlbmRpZgorICBmb3IgKDs7KQorICB7IAorI2lmZGVmIFdJVEhfSVBWNgorICAgIGlmIChjb25uZWN0KChTT0FQX1NPQ0tFVClmZCwgcmVzLT5haV9hZGRyLCByZXMtPmFpX2FkZHJsZW4pKQorI2Vsc2UKKyAgICBpZiAoY29ubmVjdCgoU09BUF9TT0NLRVQpZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyLCBzaXplb2Yoc29hcC0+cGVlcikpKQorI2VuZGlmCisgICAgeyAKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0ICYmIChzb2FwX3NvY2tldF9lcnJubyA9PSBTT0FQX0VJTlBST0dSRVNTIHx8IHNvYXBfc29ja2V0X2Vycm5vID09IFNPQVBfRVdPVUxEQkxPQ0spKQorICAgICAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgICAgICBTT0FQX1NPQ0tMRU5fVCBrOworICAgICAgICBmZF9zZXQgZmRzOworICAgICAgICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0ID4gMCkKKyAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IHNvYXAtPmNvbm5lY3RfdGltZW91dDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IC1zb2FwLT5jb25uZWN0X3RpbWVvdXQvMTAwMDAwMDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAtc29hcC0+Y29ubmVjdF90aW1lb3V0JTEwMDAwMDA7CisgICAgICAgIH0KKyAgICAgICAgRkRfWkVSTygmZmRzKTsKKyAgICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClmZCwgJmZkcyk7CisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsgaW50IHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShmZCArIDEpLCBOVUxMLCAmZmRzLCBOVUxMLCAmdGltZW91dCk7CisgICAgICAgICAgaWYgKHIgPiAwKQorCSAgICBicmVhazsKKyAgICAgICAgICBpZiAoIXIpCisgICAgICAgICAgeyBzb2FwLT5lcnJudW0gPSAwOworICAgICAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb25uZWN0IHRpbWVvdXRcbiIpKTsKKyAgICAgICAgICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCAiVGltZW91dCIsICJjb25uZWN0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIpCisgICAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IGNvbm5lY3QgdG8gaG9zdFxuIikpOworICAgICAgICAgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImNvbm5lY3QgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICAgIH0KKyAgICAgICAgfQorCWsgPSAoU09BUF9TT0NLTEVOX1Qpc2l6ZW9mKHNvYXAtPmVycm51bSk7CisgICAgICAgIGlmICghZ2V0c29ja29wdCgoU09BUF9TT0NLRVQpZmQsIFNPTF9TT0NLRVQsIFNPX0VSUk9SLCAoY2hhciopJnNvYXAtPmVycm51bSwgJmspICYmICFzb2FwLT5lcnJudW0pCS8qIHBvcnRhYmlsaXR5IG5vdGU6IHNlZSBTT0FQX1NPQ0tMRU5fVCBkZWZpbml0aW9uIGluIHN0ZHNvYXAyLmggKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgY29ubmVjdCB0byBob3N0XG4iKSk7CisgICAgICAgIHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiY29ubmVjdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgICAgZWxzZQorI2VuZGlmCisjaWZkZWYgV0lUSF9JUFY2CisgICAgICBpZiAocmVzLT5haV9uZXh0KQorICAgICAgeyByZXMgPSByZXMtPmFpX25leHQ7CisgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICBnb3RvIGFnYWluOworICAgICAgfQorICAgICAgZWxzZQorI2VuZGlmCisgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUikKKyAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IGNvbm5lY3QgdG8gaG9zdFxuIikpOworICAgICAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiY29ubmVjdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgIH0gIAorICAgIGVsc2UKKyAgICAgIGJyZWFrOworICB9CisjaWZkZWYgV0lUSF9JUFY2CisgIHNvYXAtPnBlZXJsZW4gPSAwOyAvKiBJUHY2OiBhbHJlYWR5IGNvbm5lY3RlZCBzbyB1c2Ugc2VuZCgpICovCisgIGZyZWVhZGRyaW5mbyhyZXNzYXZlKTsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPmNvbm5lY3RfdGltZW91dCkKKyNpZiBkZWZpbmVkKFdJTjMyKQorICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAmYmxvY2tpbmcpOworICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICBpb2N0bCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sIChpbnQpKCZibG9ja2luZykpOworICB9CisjZWxzZQorICAgIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX0dFVEZMKSZ+T19OT05CTE9DSyk7CisjZW5kaWYKKyNlbmRpZgorICBzb2FwLT5zb2NrZXQgPSBmZDsKKyAgc29hcC0+aW1vZGUgJj0gflNPQVBfRU5DX1NTTDsKKyAgc29hcC0+b21vZGUgJj0gflNPQVBfRU5DX1NTTDsKKyAgaWYgKCFzdHJuY21wKGVuZHBvaW50LCAiaHR0cHM6IiwgNikpCisgIHsKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICBCSU8gKmJpbzsKKyAgICBpbnQgcjsKKyAgICBpZiAoc29hcC0+cHJveHlfaG9zdCkKKyAgICB7IHNob3J0IHY7CisgICAgICB1bnNpZ25lZCBpbnQgayA9IHNvYXAtPm9tb2RlOyAvKiBtYWtlIHN1cmUgd2Ugb25seSBwYXJzZSBIVFRQICovCisgICAgICBzaXplX3QgbiA9IHNvYXAtPmNvdW50OyAvKiBzYXZlIHRoZSBjb250ZW50IGxlbmd0aCAqLworICAgICAgY2hhciAqdXNlcmlkLCAqcGFzc3dkOworICAgICAgc29hcC0+b21vZGUgJj0gflNPQVBfRU5DOyAvKiBtYXNrIElPIGFuZCBFTkMgKi8KKyAgICAgIHNvYXAtPm9tb2RlIHw9IFNPQVBfSU9fQlVGRkVSOworICAgICAgc29hcF9iZWdpbl9zZW5kKHNvYXApOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb25uZWN0aW5nIHRvIHByb3h5IHNlcnZlclxuIikpOworICAgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICJDT05ORUNUICVzOiVkIEhUVFAvJXMiLCBob3N0LCBwb3J0LCBzb2FwLT5odHRwX3ZlcnNpb24pOworICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgTlVMTCkpKQorICAgICAgeyBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgaWYgKHNvYXAtPnByb3h5X3VzZXJpZCAmJiBzb2FwLT5wcm94eV9wYXNzd2QgJiYgc3RybGVuKHNvYXAtPnByb3h5X3VzZXJpZCkgKyBzdHJsZW4oc29hcC0+cHJveHlfcGFzc3dkKSA8IDc2MSkKKyAgICAgIHsgc3ByaW50Zihzb2FwLT50bXBidWYgKyAyNjIsICIlczolcyIsIHNvYXAtPnByb3h5X3VzZXJpZCwgc29hcC0+cHJveHlfcGFzc3dkKTsKKyAgICAgICAgc3RyY3B5KHNvYXAtPnRtcGJ1ZiwgIkJhc2ljICIpOworICAgICAgICBzb2FwX3MyYmFzZTY0KHNvYXAsIChjb25zdCB1bnNpZ25lZCBjaGFyKikoc29hcC0+dG1wYnVmICsgMjYyKSwgc29hcC0+dG1wYnVmICsgNiwgc3RybGVuKHNvYXAtPnRtcGJ1ZiArIDI2MikpOworICAgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlByb3h5LUF1dGhvcml6YXRpb24iLCBzb2FwLT50bXBidWYpKSkKKyAgICAgICAgeyBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKyNlbmRpZgorICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsIE5VTEwsIE5VTEwpKQorICAgICAgIHx8IHNvYXBfZmx1c2goc29hcCkpCisgICAgICB7IHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyAgICAgIHNvYXAtPm9tb2RlID0gazsKKyAgICAgIGsgPSBzb2FwLT5pbW9kZTsKKyAgICAgIHNvYXAtPmltb2RlICY9IH5TT0FQX0VOQzsgLyogbWFzayBJTyBhbmQgRU5DICovCisgICAgICB2ID0gc29hcC0+dmVyc2lvbjsgLyogcHJlc2VydmUgKi8KKyAgICAgIHVzZXJpZCA9IHNvYXAtPnVzZXJpZDsgLyogcHJlc2VydmUgKi8KKyAgICAgIHBhc3N3ZCA9IHNvYXAtPnBhc3N3ZDsgLyogcHJlc2VydmUgKi8KKyAgICAgIGlmIChzb2FwX2JlZ2luX3JlY3Yoc29hcCkpCisgICAgICB7IHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyAgICAgIHNvYXAtPnVzZXJpZCA9IHVzZXJpZDsgLyogcmVzdG9yZSAqLworICAgICAgc29hcC0+cGFzc3dkID0gcGFzc3dkOyAvKiByZXN0b3JlICovCisgICAgICBzb2FwLT52ZXJzaW9uID0gdjsgLyogcmVzdG9yZSAqLworICAgICAgc29hcC0+aW1vZGUgPSBrOyAvKiByZXN0b3JlICovCisgICAgICBzb2FwLT5jb3VudCA9IG47IC8qIHJlc3RvcmUgKi8KKyAgICAgIHNvYXBfYmVnaW5fc2VuZChzb2FwKTsKKyAgICB9CisgICAgaWYgKCFzb2FwLT5jdHggJiYgKHNvYXAtPmVycm9yID0gc29hcC0+ZnNzbGF1dGgoc29hcCkpKQorICAgIHsgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiU1NMIGF1dGhlbnRpY2F0aW9uIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpOiBjaGVjayBwYXNzd29yZCwga2V5IGZpbGUsIGFuZCBjYSBmaWxlLiIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorICAgIHNvYXAtPnNzbCA9IFNTTF9uZXcoc29hcC0+Y3R4KTsKKyAgICBpZiAoIXNvYXAtPnNzbCkKKyAgICB7IHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1NTTF9FUlJPUjsKKyAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgIH0KKyAgICBpZiAoc29hcC0+c2Vzc2lvbikKKyAgICB7IGlmICghc3RyY21wKHNvYXAtPnNlc3Npb25faG9zdCwgaG9zdCkgJiYgc29hcC0+c2Vzc2lvbl9wb3J0ID09IHBvcnQpCisgICAgICAgIFNTTF9zZXRfc2Vzc2lvbihzb2FwLT5zc2wsIHNvYXAtPnNlc3Npb24pOworICAgICAgU1NMX1NFU1NJT05fZnJlZShzb2FwLT5zZXNzaW9uKTsKKyAgICAgIHNvYXAtPnNlc3Npb24gPSBOVUxMOworICAgIH0KKyAgICBzb2FwLT5pbW9kZSB8PSBTT0FQX0VOQ19TU0w7CisgICAgc29hcC0+b21vZGUgfD0gU09BUF9FTkNfU1NMOworICAgIGJpbyA9IEJJT19uZXdfc29ja2V0KChTT0FQX1NPQ0tFVClmZCwgQklPX05PQ0xPU0UpOworICAgIFNTTF9zZXRfYmlvKHNvYXAtPnNzbCwgYmlvLCBiaW8pOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0KQorI2lmIGRlZmluZWQoV0lOMzIpCisgICAgeyB1X2xvbmcgbm9uYmxvY2tpbmcgPSAxOworICAgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAmbm9uYmxvY2tpbmcpOworICAgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgICB7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgICBpb2N0bCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sIChpbnQpKCZub25ibG9ja2luZykpOworICAgIH0KKyNlbHNlCisgICAgICBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9HRVRGTCl8T19OT05CTE9DSyk7CisjZW5kaWYKKyNlbmRpZgorICAgIGZvciAoOzspCisgICAgeyBpZiAoKHIgPSBTU0xfY29ubmVjdChzb2FwLT5zc2wpKSA8PSAwKQorICAgICAgeyBpbnQgZXJyID0gU1NMX2dldF9lcnJvcihzb2FwLT5zc2wsIHIpOworICAgICAgICBpZiAoZXJyICE9IFNTTF9FUlJPUl9OT05FICYmIGVyciAhPSBTU0xfRVJST1JfV0FOVF9SRUFEICYmIGVyciAhPSBTU0xfRVJST1JfV0FOVF9XUklURSkKKyAgICAgICAgeyBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgc3NsX2Vycm9yKHNvYXAsIHIpLCAiU1NMIGNvbm5lY3QgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvYXAtPmNvbm5lY3RfdGltZW91dCkKKyAgICAgICAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgICAgICAgIGZkX3NldCBmZHM7CisgICAgICAgICAgaWYgKHNvYXAtPmNvbm5lY3RfdGltZW91dCA+IDApCisgICAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IHNvYXAtPmNvbm5lY3RfdGltZW91dDsKKyAgICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gLXNvYXAtPmNvbm5lY3RfdGltZW91dC8xMDAwMDAwOworICAgICAgICAgICAgdGltZW91dC50dl91c2VjID0gLXNvYXAtPmNvbm5lY3RfdGltZW91dCUxMDAwMDAwOworICAgICAgICAgIH0KKyAgICAgICAgICBGRF9aRVJPKCZmZHMpOworICAgICAgICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpZmQsICZmZHMpOworICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgeyBpbnQgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKGZkICsgMSksICZmZHMsIE5VTEwsICZmZHMsICZ0aW1lb3V0KTsKKyAgICAgICAgICAgIGlmIChyID4gMCkKKwkgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmICghcikKKyAgICAgICAgICAgIHsgc29hcC0+ZXJybnVtID0gMDsKKyAgICAgICAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb25uZWN0IHRpbWVvdXRcbiIpKTsKKyAgICAgICAgICAgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsICJUaW1lb3V0IiwgImNvbm5lY3QgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICAgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisJICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0KQorI2lmZGVmIFdJTjMyCisgICAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAmYmxvY2tpbmcpOworICAgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgICBpb2N0bCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sIChpbnQpKCZibG9ja2luZykpOworICAgIH0KKyNlbHNlCisgICAgICBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9HRVRGTCkmfk9fTk9OQkxPQ0spOworI2VuZGlmCisjZW5kaWYKKyAgICBpZiAoc29hcC0+cmVxdWlyZV9zZXJ2ZXJfYXV0aCkKKyAgICB7IFg1MDkgKnBlZXI7CisgICAgICBpbnQgZXJyOworICAgICAgaWYgKChlcnIgPSBTU0xfZ2V0X3ZlcmlmeV9yZXN1bHQoc29hcC0+c3NsKSkgIT0gWDUwOV9WX09LKQorICAgICAgeyBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgWDUwOV92ZXJpZnlfY2VydF9lcnJvcl9zdHJpbmcoZXJyKSwgIlNTTCBjZXJ0aWZpY2F0ZSBwcmVzZW50ZWQgYnkgcGVlciBjYW5ub3QgYmUgdmVyaWZpZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgICAgcGVlciA9IFNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZShzb2FwLT5zc2wpOworICAgICAgaWYgKCFwZWVyKQorICAgICAgeyBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJObyBTU0wgY2VydGlmaWNhdGUgd2FzIHByZXNlbnRlZCBieSB0aGUgcGVlciBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9TU0xfRVJST1IpOworICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgICBYNTA5X05BTUVfZ2V0X3RleHRfYnlfTklEKFg1MDlfZ2V0X3N1YmplY3RfbmFtZShwZWVyKSwgTklEX2NvbW1vbk5hbWUsIHNvYXAtPm1zZ2J1Ziwgc2l6ZW9mKHNvYXAtPm1zZ2J1ZikpOworICAgICAgWDUwOV9mcmVlKHBlZXIpOworICAgICAgaWYgKHNvYXBfdGFnX2NtcChzb2FwLT5tc2didWYsIGhvc3QpKQorICAgICAgeyBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJTU0wgY2VydGlmaWNhdGUgaG9zdCBuYW1lIG1pc21hdGNoIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgIHNvYXAtPmVycm9yID0gU09BUF9TU0xfRVJST1I7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisjZW5kaWYKKyAgfQorICByZXR1cm4gZmQ7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYmluZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQsIGludCBiYWNrbG9nKQoreworI2lmZGVmIFdJVEhfSVBWNgorICBzdHJ1Y3QgYWRkcmluZm8gKmFkZHJpbmZvID0gTlVMTDsKKyAgc3RydWN0IGFkZHJpbmZvIGhpbnRzOworICBzdHJ1Y3QgYWRkcmluZm8gcmVzOworICBpbnQgZXJyOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpbnQgbGVuID0gU09BUF9CVUZMRU47CisgIGludCBzZXQgPSAxOworI2VuZGlmCisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpKQorICB7IHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyKTsKKyAgICBzb2FwLT5tYXN0ZXIgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIHNvYXAtPnNvY2tldCA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIHNvYXAtPmVycm1vZGUgPSAxOworICBpZiAodGNwX2luaXQoc29hcCkpCisgIHsgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiVENQIGluaXQgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisjaWZkZWYgV0lUSF9JUFY2CisgIG1lbXNldCgodm9pZCopJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKyAgaGludHMuYWlfZmFtaWx5ID0gUEZfVU5TUEVDOworI2lmZGVmIFdJVEhfVURQCisgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX0RHUkFNOworICBlbHNlCisjZW5kaWYKKyAgICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworICBoaW50cy5haV9mbGFncyA9IEFJX1BBU1NJVkU7CisgIHNvYXAtPmVycm1vZGUgPSAyOworICBlcnIgPSBnZXRhZGRyaW5mbyhob3N0LCBzb2FwX2ludDJzKHNvYXAsIHBvcnQpLCAmaGludHMsICZhZGRyaW5mbyk7CisgIGlmIChhZGRyaW5mbykKKyAgeyByZXMgPSAqYWRkcmluZm87CisgICAgc29hcC0+cGVlciA9ICooKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKilhZGRyaW5mby0+YWlfYWRkcik7CisgICAgc29hcC0+cGVlcmxlbiA9IGFkZHJpbmZvLT5haV9hZGRybGVuOworICAgIHJlcy5haV9hZGRyID0gKHN0cnVjdCBzb2NrYWRkciopJnNvYXAtPnBlZXI7CisgICAgcmVzLmFpX2FkZHJsZW4gPSBzb2FwLT5wZWVybGVuOworICAgIGZyZWVhZGRyaW5mbyhhZGRyaW5mbyk7CisgIH0KKyAgaWYgKGVycikKKyAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCBnYWlfc3RyZXJyb3IoZXJyKSwgImdldGFkZHJpbmZvIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBzb2FwLT5tYXN0ZXIgPSBzb2NrZXQocmVzLmFpX2ZhbWlseSwgcmVzLmFpX3NvY2t0eXBlLCByZXMuYWlfcHJvdG9jb2wpOworI2Vsc2UKKyNpZmRlZiBXSVRIX1VEUAorICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIHNvYXAtPm1hc3RlciA9IChpbnQpc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworICBlbHNlCisjZW5kaWYKKyAgICBzb2FwLT5tYXN0ZXIgPSAoaW50KXNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisjZW5kaWYKKyAgc29hcC0+ZXJybW9kZSA9IDA7CisgIGlmICghc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzb2NrZXQgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisjaWZkZWYgV0lUSF9VRFAKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICBzb2FwLT5zb2NrZXQgPSBzb2FwLT5tYXN0ZXI7CisjZW5kaWYKKyNpZmRlZiBTT0NLRVRfQ0xPU0VfT05fRVhFQworI2lmZGVmIFdJTjMyCisjaWZuZGVmIFVOREVSX0NFCisgIFNldEhhbmRsZUluZm9ybWF0aW9uKChIQU5ETEUpc29hcC0+bWFzdGVyLCBIQU5ETEVfRkxBR19JTkhFUklULCAwKTsKKyNlbmRpZgorI2Vsc2UKKyAgZmNudGwoc29hcC0+bWFzdGVyLCBGX1NFVEZELCAxKTsKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+YmluZF9mbGFncyAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIFNPTF9TT0NLRVQsIHNvYXAtPmJpbmRfZmxhZ3MsIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgaWYgKCgoc29hcC0+aW1vZGUgfCBzb2FwLT5vbW9kZSkgJiBTT0FQX0lPX0tFRVBBTElWRSkgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBTT0xfU09DS0VULCBTT19LRUVQQUxJVkUsIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19LRUVQQUxJVkUgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIGlmIChzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwgKGNoYXIqKSZsZW4sIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX1NOREJVRiBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgU09MX1NPQ0tFVCwgU09fUkNWQlVGLCAoY2hhciopJmxlbiwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fUkNWQlVGIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorI2lmZGVmIFRDUF9OT0RFTEFZCisgIGlmICghKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgVENQX05PREVMQVkgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIFdJVEhfSVBWNgorICBzb2FwLT5lcnJtb2RlID0gMDsKKyAgaWYgKGJpbmQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgcmVzLmFpX2FkZHIsIHJlcy5haV9hZGRybGVuKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBiaW5kIHRvIGhvc3RcbiIpKTsKKyAgICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJiaW5kIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfSAgCisjZWxzZQorICBzb2FwLT5wZWVybGVuID0gc2l6ZW9mKHNvYXAtPnBlZXIpOworICBtZW1zZXQoKHZvaWQqKSZzb2FwLT5wZWVyLCAwLCBzaXplb2Yoc29hcC0+cGVlcikpOworICBzb2FwLT5wZWVyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICBzb2FwLT5lcnJtb2RlID0gMjsKKyAgaWYgKGhvc3QpCisgIHsgaWYgKHNvYXAtPmZyZXNvbHZlKHNvYXAsIGhvc3QsICZzb2FwLT5wZWVyLnNpbl9hZGRyKSkKKyAgICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImdldCBob3N0IGJ5IG5hbWUgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorICB9CisgIGVsc2UKKyAgICBzb2FwLT5wZWVyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9BTlkpOworICBzb2FwLT5wZWVyLnNpbl9wb3J0ID0gaHRvbnMoKHNob3J0KXBvcnQpOworICBzb2FwLT5lcnJtb2RlID0gMDsKKyAgaWYgKGJpbmQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgKHN0cnVjdCBzb2NrYWRkciopJnNvYXAtPnBlZXIsIHNvYXAtPnBlZXJsZW4pKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IGJpbmQgdG8gaG9zdFxuIikpOworICAgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImJpbmQgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisjZW5kaWYKKyAgaWYgKCEoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkgJiYgbGlzdGVuKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIGJhY2tsb2cpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IGJpbmQgdG8gaG9zdFxuIikpOworICAgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImxpc3RlbiBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0gIAorICByZXR1cm4gc29hcC0+bWFzdGVyOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3BvbGwoc3RydWN0IHNvYXAgKnNvYXApCit7IAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgZmRfc2V0IHJmZCwgc2ZkLCB4ZmQ7CisgIGludCByOworICB0aW1lb3V0LnR2X3NlYyA9IDA7CisgIHRpbWVvdXQudHZfdXNlYyA9IDA7CisgIEZEX1pFUk8oJnJmZCk7CisgIEZEX1pFUk8oJnNmZCk7CisgIEZEX1pFUk8oJnhmZCk7CisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICB7IEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmcmZkKTsKKyAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnNmZCk7CisgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZ4ZmQpOworICAgIHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgJnJmZCwgJnNmZCwgJnhmZCwgJnRpbWVvdXQpOworICAgIGlmIChyID4gMCAmJiBGRF9JU1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmeGZkKSkKKyAgICAgIHIgPSAtMTsKKyAgfQorICBlbHNlIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpKQorICB7IEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCAmc2ZkKTsKKyAgICByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+bWFzdGVyICsgMSksIE5VTEwsICZzZmQsIE5VTEwsICZ0aW1lb3V0KTsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIGlmIChyID4gMCkKKyAgeworI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgIGlmIChzb2FwLT5pbW9kZSAmIFNPQVBfRU5DX1NTTCkKKyAgICB7CisgICAgICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KQorICAgICAgICYmIEZEX0lTU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZzZmQpCisgICAgICAgJiYgKCFGRF9JU1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmcmZkKQorICAgICAgICB8fCBTU0xfcGVlayhzb2FwLT5zc2wsIHNvYXAtPnRtcGJ1ZiwgMSkgPiAwKSkKKyAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgICAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkKKyAgICAgICAmJiBGRF9JU1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmc2ZkKQorICAgICAgICYmICghRkRfSVNTRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnJmZCkKKyAgICAgICAgfHwgcmVjdigoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzb2FwLT50bXBidWYsIDEsIE1TR19QRUVLKSA+IDApKQorICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICBlbHNlIGlmIChyIDwgMCkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBpZiAoKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikgfHwgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUikKKyAgICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNlbGVjdCBmYWlsZWQgaW4gc29hcF9wb2xsKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1RDUF9FUlJPUjsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIHNvYXAtPmVycm51bSA9IDA7CisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJQb2xsaW5nOiBvdGhlciBlbmQgZG93biBvbiBzb2NrZXQ9JWQgc2VsZWN0PSVkXG4iLCBzb2FwLT5zb2NrZXQsIHIpKTsKKyAgcmV0dXJuIFNPQVBfRU9GOworI2Vsc2UKKyAgcmV0dXJuIFNPQVBfT0s7CisjZW5kaWYKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3RjcF9hY2NlcHQoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzLCBzdHJ1Y3Qgc29ja2FkZHIgKmEsIGludCAqbikKK3sgaW50IGZkOworICBmZCA9IChpbnQpYWNjZXB0KChTT0FQX1NPQ0tFVClzLCBhLCAoU09BUF9TT0NLTEVOX1QqKW4pOwkvKiBwb3J0YWJpbGl0eSBub3RlOiBzZWUgU09BUF9TT0NLTEVOX1QgZGVmaW5pdGlvbiBpbiBzdGRzb2FwMi5oICovCisjaWZkZWYgU09DS0VUX0NMT1NFX09OX0VYRUMKKyNpZmRlZiBXSU4zMgorI2lmbmRlZiBVTkRFUl9DRQorICBTZXRIYW5kbGVJbmZvcm1hdGlvbigoSEFORExFKWZkLCBIQU5ETEVfRkxBR19JTkhFUklULCAwKTsKKyNlbmRpZgorI2Vsc2UKKyAgZmNudGwoZmQsIEZfU0VURkQsIEZEX0NMT0VYRUMpOworI2VuZGlmCisjZW5kaWYKKyAgcmV0dXJuIGZkOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2FjY2VwdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaW50IG4gPSAoaW50KXNpemVvZihzb2FwLT5wZWVyKTsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGludCBsZW4gPSBTT0FQX0JVRkxFTjsKKyAgaW50IHNldCA9IDE7CisjZW5kaWYKKyAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworI2lmZGVmIFdJVEhfVURQCisgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgcmV0dXJuIHNvYXAtPnNvY2tldCA9IHNvYXAtPm1hc3RlcjsKKyNlbmRpZgorICBtZW1zZXQoKHZvaWQqKSZzb2FwLT5wZWVyLCAwLCBzaXplb2Yoc29hcC0+cGVlcikpOworICBzb2FwLT5zb2NrZXQgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICBzb2FwLT5lcnJtb2RlID0gMDsKKyAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7CisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpKQorICB7IGZvciAoOzspCisgICAgeyAKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICBpZiAoc29hcC0+YWNjZXB0X3RpbWVvdXQpCisgICAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICAgIGZkX3NldCBmZDsKKyAgICAgICAgaWYgKHNvYXAtPmFjY2VwdF90aW1lb3V0ID4gMCkKKyAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IHNvYXAtPmFjY2VwdF90aW1lb3V0OworICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gLXNvYXAtPmFjY2VwdF90aW1lb3V0LzEwMDAwMDA7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gLXNvYXAtPmFjY2VwdF90aW1lb3V0JTEwMDAwMDA7CisgICAgICAgIH0KKyAgICAgICAgRkRfWkVSTygmZmQpOworICAgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgJmZkKTsKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeyBpbnQgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPm1hc3RlciArIDEpLCAmZmQsICZmZCwgTlVMTCwgJnRpbWVvdXQpOworICAgICAgICAgIGlmIChyID4gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGlmICghcikKKyAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IDA7CisgICAgICAgICAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiVGltZW91dCIsICJhY2NlcHQgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIpCisgICAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICAgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgICAgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImFjY2VwdCBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICAgIH0KKyAgICAgICAgfQorI2lmIGRlZmluZWQoV0lOMzIpCisJeyB1X2xvbmcgbm9uYmxvY2tpbmcgPSAxOworICAgICAgICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZJT05CSU8sICZub25ibG9ja2luZyk7CisgICAgICAgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgICAgICAgeyB1X2xvbmcgbm9uYmxvY2tpbmcgPSAxOworICAgICAgICAgIGlvY3RsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZJT05CSU8sIChpbnQpKCZub25ibG9ja2luZykpOworICAgICAgICB9CisjZWxzZQorICAgICAgICBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGX0dFVEZMKXxPX05PTkJMT0NLKTsKKyNlbmRpZgorICAgICAgfQorICAgICAgZWxzZQorI2lmIGRlZmluZWQoV0lOMzIpCisgICAgICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZJT05CSU8sICZibG9ja2luZyk7CisgICAgICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgICAgICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgICAgIGlvY3RsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZJT05CSU8sIChpbnQpKCZibG9ja2luZykpOworICAgICAgfQorI2Vsc2UKKyAgICAgICAgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRl9HRVRGTCkmfk9fTk9OQkxPQ0spOworI2VuZGlmCisjZW5kaWYKKyAgICAgIHNvYXAtPnNvY2tldCA9IHNvYXAtPmZhY2NlcHQoc29hcCwgc29hcC0+bWFzdGVyLCAoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlciwgJm4pOworICAgICAgc29hcC0+cGVlcmxlbiA9IChzaXplX3QpbjsKKyAgICAgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICAgICAgeworI2lmZGVmIFdJVEhfSVBWNgorLyogVXNlIHNvYXAtPmhvc3QgdG8gc3RvcmUgdGhlIG51bWVyaWMgZm9ybSBvZiB0aGUgcmVtb3RlIGhvc3QgKi8KKyAgICAgICAgZ2V0bmFtZWluZm8oKHN0cnVjdCBzb2NrYWRkciopJnNvYXAtPnBlZXIsIG4sIHNvYXAtPmhvc3QsIHNpemVvZihzb2FwLT5ob3N0KSwgTlVMTCwgMCwgTklfTlVNRVJJQ0hPU1QgfCBOSV9OVU1FUklDU0VSVik7IAorICAgICAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiQWNjZXB0IHNvY2tldCAlZCBmcm9tICVzXG4iLCBzb2FwLT5zb2NrZXQsIHNvYXAtPmhvc3QpKTsKKyAgICAgICAgc29hcC0+aXAgPSAwOyAvKiBpbmZvIHN0b3JlZCBpbiBzb2FwLT5wZWVyIGFuZCBzb2FwLT5ob3N0ICovCisgICAgICAgIHNvYXAtPnBvcnQgPSAwOyAvKiBpbmZvIHN0b3JlZCBpbiBzb2FwLT5wZWVyIGFuZCBzb2FwLT5ob3N0ICovCisjZWxzZQorICAgICAgICBzb2FwLT5pcCA9IG50b2hsKHNvYXAtPnBlZXIuc2luX2FkZHIuc19hZGRyKTsKKyAgICAgICAgc29hcC0+cG9ydCA9IChpbnQpbnRvaHMoc29hcC0+cGVlci5zaW5fcG9ydCk7IC8qIGRvZXMgbm90IHJldHVybiBwb3J0IG51bWJlciBvbiBzb21lIHN5c3RlbXMgKi8KKyAgICAgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFjY2VwdCBzb2NrZXQgJWQgYXQgcG9ydCAlZCBmcm9tIElQICVkLiVkLiVkLiVkXG4iLCBzb2FwLT5zb2NrZXQsIHNvYXAtPnBvcnQsIChpbnQpKHNvYXAtPmlwPj4yNCkmMHhGRiwgKGludCkoc29hcC0+aXA+PjE2KSYweEZGLCAoaW50KShzb2FwLT5pcD4+OCkmMHhGRiwgKGludClzb2FwLT5pcCYweEZGKSk7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisJaWYgKHNvYXAtPmFjY2VwdF9mbGFncyAmIFNPX0xJTkdFUikKKyAgICAgICAgeyBzdHJ1Y3QgbGluZ2VyIGxpbmdlcjsKKyAgICAgICAgICBtZW1zZXQoKHZvaWQqKSZsaW5nZXIsIDAsIHNpemVvZihsaW5nZXIpKTsKKyAgICAgICAgICBsaW5nZXIubF9vbm9mZiA9IDE7CisgICAgICAgICAgbGluZ2VyLmxfbGluZ2VyID0gMDsKKwkgIGlmIChzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIFNPTF9TT0NLRVQsIFNPX0xJTkdFUiwgKGNoYXIqKSZsaW5nZXIsIHNpemVvZihzdHJ1Y3QgbGluZ2VyKSkpCisgICAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKwkgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19MSU5HRVIgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisJICAgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisJICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChzb2FwLT5hY2NlcHRfZmxhZ3MgJiB+U09fTElOR0VSKSAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIFNPTF9TT0NLRVQsIHNvYXAtPmFjY2VwdF9mbGFncyAmIH5TT19MSU5HRVIsIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKwkgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICB9CisgICAgICAgIGlmICgoKHNvYXAtPmltb2RlIHwgc29hcC0+b21vZGUpICYgU09BUF9JT19LRUVQQUxJVkUpICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fS0VFUEFMSVZFIGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworCSAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgU09MX1NPQ0tFVCwgU09fU05EQlVGLCAoY2hhciopJmxlbiwgc2l6ZW9mKGludCkpKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fU05EQlVGIGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworCSAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgU09MX1NPQ0tFVCwgU09fUkNWQlVGLCAoY2hhciopJmxlbiwgc2l6ZW9mKGludCkpKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fUkNWQlVGIGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworCSAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgIH0KKyNpZmRlZiBUQ1BfTk9ERUxBWQorICAgICAgICBpZiAoIShzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFRDUF9OT0RFTEFZIGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworCSAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgIH0KKyNlbmRpZgorI2VuZGlmCisgICAgICAgIGlmIChzb2FwLT5hY2NlcHRfdGltZW91dCkKKyAgICAgICAgeworI2lmIGRlZmluZWQoV0lOMzIpCisgICAgICAgICAgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICAgICAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGSU9OQklPLCAmYmxvY2tpbmcpOworICAgICAgICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZJT05CSU8sICZibG9ja2luZyk7CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgICAgICAgICAgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICAgICAgICBpb2N0bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGSU9OQklPLCAoaW50KSgmYmxvY2tpbmcpKTsKKyAgICAgICAgICBpb2N0bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGSU9OQklPLCAoaW50KSgmYmxvY2tpbmcpKTsKKyNlbGlmIGRlZmluZWQoUEFMTSkKKyAgICAgICAgICBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGX0dFVEZMLDApJn5PX05PTkJMT0NLKTsKKyAgICAgICAgICBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGX0dFVEZMLDApJn5PX05PTkJMT0NLKTsKKyNlbGlmIGRlZmluZWQoU1lNQklBTikKKyAgICAgICAgICBsb25nIGJsb2NraW5nID0gMDsKKyAgICAgICAgICBpb2N0bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCAwLypGSU9OQklPKi8sICZibG9ja2luZyk7CisjZWxzZQorICAgICAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfR0VURkwpJn5PX05PTkJMT0NLKTsKKyAgICAgICAgICBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGX0dFVEZMKSZ+T19OT05CTE9DSyk7CisjZW5kaWYKKwl9CisgICAgICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAoKChzb2FwLT5pbW9kZSB8IHNvYXAtPm9tb2RlKSAmIFNPQVBfSU9fS0VFUEFMSVZFKSAhPSAwKTsKKyAgICAgICAgcmV0dXJuIHNvYXAtPnNvY2tldDsKKyAgICAgIH0KKyAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUFHQUlOKQorICAgICAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiQWNjZXB0IGZhaWxlZCBmcm9tICVzXG4iLCBzb2FwLT5ob3N0KSk7CisgICAgICAgIHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJhY2NlcHQgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisJc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsgc29hcC0+ZXJybnVtID0gMDsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJubyBtYXN0ZXIgc29ja2V0IGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3RjcF9kaXNjb25uZWN0KHN0cnVjdCBzb2FwICpzb2FwKQoreworI2lmZGVmIFdJVEhfT1BFTlNTTAorICBpZiAoc29hcC0+c3NsKQorICB7IGludCByLCBzID0gMDsKKyAgICBpZiAoc29hcC0+c2Vzc2lvbikKKyAgICAgIFNTTF9TRVNTSU9OX2ZyZWUoc29hcC0+c2Vzc2lvbik7CisgICAgaWYgKCpzb2FwLT5ob3N0KQorICAgIHsgc29hcC0+c2Vzc2lvbiA9IFNTTF9nZXQxX3Nlc3Npb24oc29hcC0+c3NsKTsKKyAgICAgIGlmIChzb2FwLT5zZXNzaW9uKQorICAgICAgeyBzdHJjcHkoc29hcC0+c2Vzc2lvbl9ob3N0LCBzb2FwLT5ob3N0KTsKKyAgICAgICAgc29hcC0+c2Vzc2lvbl9wb3J0ID0gc29hcC0+cG9ydDsKKyAgICAgIH0KKyAgICB9CisgICAgciA9IFNTTF9zaHV0ZG93bihzb2FwLT5zc2wpOworICAgIGlmIChyICE9IDEpCisgICAgeyBzID0gRVJSX2dldF9lcnJvcigpOworICAgICAgaWYgKHMpCisgICAgICB7IGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICAgICAgICB7IHNvYXAtPmZzaHV0ZG93bnNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAxKTsKKyAgICAgICAgICBzb2FwLT5zb2NrZXQgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICB9CisgICAgICAgIHIgPSBTU0xfc2h1dGRvd24oc29hcC0+c3NsKTsKKyAgICAgIH0KKyAgICB9CisgICAgREJHTE9HKFRFU1QsIGlmIChzKSBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2h1dGRvd24gZmFpbGVkOiAlZFxuIiwgU1NMX2dldF9lcnJvcihzb2FwLT5zc2wsIHIpKSk7CisgICAgU1NMX2ZyZWUoc29hcC0+c3NsKTsKKyAgICBzb2FwLT5zc2wgPSBOVUxMOworICAgIGlmIChzKQorICAgICAgcmV0dXJuIFNPQVBfU1NMX0VSUk9SOworICAgIEVSUl9yZW1vdmVfc3RhdGUoMCk7CisgIH0KKyNlbmRpZgorICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSAmJiAhKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICB7IHNvYXAtPmZzaHV0ZG93bnNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAyKTsKKyAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCk7CisgICAgc29hcC0+c29ja2V0ID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3RjcF9jbG9zZXNvY2tldChzdHJ1Y3Qgc29hcCAqc29hcCwgU09BUF9TT0NLRVQgZmQpCit7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ2xvc2Ugc29ja2V0ICVkXG4iLCAoaW50KWZkKSk7CisgIHJldHVybiBjbG9zZXNvY2tldChmZCk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Cit0Y3Bfc2h1dGRvd25zb2NrZXQoc3RydWN0IHNvYXAgKnNvYXAsIFNPQVBfU09DS0VUIGZkLCBpbnQgaG93KQoreyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNodXRkb3duIHNvY2tldCAlZCBob3c9JWRcbiIsIChpbnQpZmQsIGhvdykpOworICByZXR1cm4gc2h1dGRvd24oZmQsIGhvdyk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9jbG9zZXNvY2soc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBzdGF0dXMgPSBzb2FwLT5lcnJvcjsKKyAgaWYgKHN0YXR1cyA9PSBTT0FQX0VPRiB8fCBzdGF0dXMgPT0gU09BUF9UQ1BfRVJST1IgfHwgc3RhdHVzID09IFNPQVBfU1NMX0VSUk9SIHx8ICFzb2FwLT5rZWVwX2FsaXZlKQorICB7IGlmIChzb2FwLT5mY2xvc2UgJiYgKHNvYXAtPmVycm9yID0gc29hcC0+ZmNsb3NlKHNvYXApKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBzb2FwLT5rZWVwX2FsaXZlID0gMDsKKyAgfQorI2lmZGVmIFdJVEhfWkxJQgorICBpZiAoc29hcC0+emxpYl9zdGF0ZSA9PSBTT0FQX1pMSUJfREVGTEFURSkKKyAgICBkZWZsYXRlRW5kKCZzb2FwLT5kX3N0cmVhbSk7CisgIGVsc2UgaWYgKHNvYXAtPnpsaWJfc3RhdGUgPT0gU09BUF9aTElCX0lORkxBVEUpCisgICAgaW5mbGF0ZUVuZCgmc29hcC0+ZF9zdHJlYW0pOworICBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX05PTkU7CisjZW5kaWYKKyAgcmV0dXJuIHNvYXAtPmVycm9yID0gc3RhdHVzOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3NpemVfdAorU09BUF9GTUFDMgorc29hcF9oYXNoKHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnMpCit7IHJlZ2lzdGVyIHNpemVfdCBoID0gMDsKKyAgd2hpbGUgKCpzKQorICAgIGggPSA2NTU5OSpoICsgKnMrKzsKKyAgcmV0dXJuIGggJSBTT0FQX0lESEFTSDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyB2b2lkCitzb2FwX2luaXRfcGh0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgaTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbml0aWFsaXppbmcgcG9pbnRlciBoYXNodGFibGVcbiIpKTsKKyAgc29hcC0+cGJsayA9IE5VTEw7CisgIHNvYXAtPnBpZHggPSAwOworICBmb3IgKGkgPSAwOyBpIDwgKGludClTT0FQX1BUUkhBU0g7IGkrKykKKyAgICBzb2FwLT5waHRbaV0gPSBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcCoKK1NPQVBfRk1BQzIKK3NvYXBfbmV3MShzb2FwX21vZGUgbW9kZSkKK3sgcmV0dXJuIHNvYXBfbmV3Mihtb2RlLCBtb2RlKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwKgorU09BUF9GTUFDMgorc29hcF9uZXcoKQoreyByZXR1cm4gc29hcF9uZXcyKFNPQVBfSU9fREVGQVVMVCwgU09BUF9JT19ERUZBVUxUKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwKgorU09BUF9GTUFDMgorc29hcF9uZXcyKHNvYXBfbW9kZSBpbW9kZSwgc29hcF9tb2RlIG9tb2RlKQoreyBzdHJ1Y3Qgc29hcCAqc29hcCA9IChzdHJ1Y3Qgc29hcCopbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc29hcCkpOworICBpZiAoc29hcCkKKyAgICBzb2FwX2luaXQyKHNvYXAsIGltb2RlLCBvbW9kZSk7CisgIHJldHVybiBzb2FwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9kZWwoc3RydWN0IHNvYXAgKnNvYXApCit7IGZyZWUoc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQKK3NvYXBfZnJlZV9waHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BibGsgKnBiLCAqbmV4dDsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZSBwb2ludGVyIGhhc2h0YWJsZVxuIikpOworICBmb3IgKHBiID0gc29hcC0+cGJsazsgcGI7IHBiID0gbmV4dCkKKyAgeyBuZXh0ID0gcGItPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIHBiKTsKKyAgfQorICBzb2FwLT5wYmxrID0gTlVMTDsKKyAgc29hcC0+cGlkeCA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCAoaW50KVNPQVBfUFRSSEFTSDsgaSsrKQorICAgIHNvYXAtPnBodFtpXSA9IE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW1iZWQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgbiwgY29uc3QgY2hhciAqdGFnLCBpbnQgdHlwZSkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgaWYgKHNvYXAtPnZlcnNpb24gIT0gMSkKKyAgICBzb2FwLT5lbmNvZGluZyA9IDE7CisgIGlmIChhKQorICAgIGkgPSBzb2FwX2FycmF5X3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIGEsIG4sIHR5cGUsICZwcCk7CisgIGVsc2UKKyAgICBpID0gc29hcF9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCB0eXBlLCAmcHApOworICBpZiAoaSkKKyAgeyBpZiAoc29hcF9pc19lbWJlZGRlZChzb2FwLCBwcCkKKyAgICAgfHwgc29hcF9pc19zaW5nbGUoc29hcCwgcHApKQorICAgICAgcmV0dXJuIDA7CisgICAgc29hcF9zZXRfZW1iZWRkZWQoc29hcCwgcHApOworICB9CisgIHJldHVybiBpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3BvaW50ZXJfbG9va3VwKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBpbnQgdHlwZSwgc3RydWN0IHNvYXBfcGxpc3QgKipwcHApCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgKnBwcCA9IE5VTEw7CisgIGlmIChwKQorICB7IGZvciAocHAgPSBzb2FwLT5waHRbc29hcF9oYXNoX3B0cihwKV07IHBwOyBwcCA9IHBwLT5uZXh0KQorICAgIHsgaWYgKHBwLT5wdHIgPT0gcCAmJiBwcC0+dHlwZSA9PSB0eXBlKQorICAgICAgeyAqcHBwID0gcHA7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTG9va3VwIGxvY2F0aW9uPSVwIHR5cGU9JWQgaWQ9JWRcbiIsIHAsIHR5cGUsIHBwLT5pZCkpOworICAgICAgICByZXR1cm4gcHAtPmlkOworICAgICAgfQorICAgIH0KKyAgfQorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkxvb2t1cCBsb2NhdGlvbj0lcCB0eXBlPSVkOiBub3QgZm91bmRcbiIsIHAsIHR5cGUpKTsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcG9pbnRlcl9lbnRlcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCwgY29uc3Qgc3RydWN0IHNvYXBfYXJyYXkgKmEsIGludCBuLCBpbnQgdHlwZSwgc3RydWN0IHNvYXBfcGxpc3QgKipwcHApCit7IHJlZ2lzdGVyIGludCBoOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgIGlmICghc29hcC0+cGJsayB8fCBzb2FwLT5waWR4ID49IFNPQVBfUFRSQkxLKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BibGsgKnBiID0gKHN0cnVjdCBzb2FwX3BibGsqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9wYmxrKSk7CisgICAgaWYgKCFwYikKKyAgICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcGItPm5leHQgPSBzb2FwLT5wYmxrOworICAgIHNvYXAtPnBibGsgPSBwYjsKKyAgICBzb2FwLT5waWR4ID0gMDsKKyAgfQorICAqcHBwID0gcHAgPSAmc29hcC0+cGJsay0+cGxpc3Rbc29hcC0+cGlkeCsrXTsKKyAgaWYgKGEpCisgICAgaCA9IHNvYXBfaGFzaF9wdHIoYS0+X19wdHIpOworICBlbHNlCisgICAgaCA9IHNvYXBfaGFzaF9wdHIocCk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUG9pbnRlciBlbnRlciBsb2NhdGlvbj0lcCBhcnJheT0lcCBzaXplPSVkIGRpbT0lZCB0eXBlPSVkIGlkPSVkXG4iLCBwLCBhP2EtPl9fcHRyOk5VTEwsIGE/YS0+X19zaXplOjAsIG4sIHR5cGUsIHNvYXAtPmlkbnVtKzEpKTsKKyAgcHAtPm5leHQgPSBzb2FwLT5waHRbaF07CisgIHBwLT50eXBlID0gdHlwZTsKKyAgcHAtPm1hcmsxID0gMDsKKyAgcHAtPm1hcmsyID0gMDsKKyAgcHAtPnB0ciA9IHA7CisgIHBwLT5hcnJheSA9IGE7CisgIHNvYXAtPnBodFtoXSA9IHBwOworICBwcC0+aWQgPSArK3NvYXAtPmlkbnVtOworICByZXR1cm4gcHAtPmlkOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2FycmF5X3BvaW50ZXJfbG9va3VwKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGludCB0eXBlLCBzdHJ1Y3Qgc29hcF9wbGlzdCAqKnBwcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICAqcHBwID0gTlVMTDsKKyAgaWYgKCFwIHx8ICFhLT5fX3B0cikKKyAgICByZXR1cm4gMDsKKyAgZm9yIChwcCA9IHNvYXAtPnBodFtzb2FwX2hhc2hfcHRyKGEtPl9fcHRyKV07IHBwOyBwcCA9IHBwLT5uZXh0KQorICB7IGlmIChwcC0+dHlwZSA9PSB0eXBlICYmIHBwLT5hcnJheSAmJiBwcC0+YXJyYXktPl9fcHRyID09IGEtPl9fcHRyKQorICAgIHsgcmVnaXN0ZXIgaW50IGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICBpZiAoKChjb25zdCBpbnQqKSZwcC0+YXJyYXktPl9fc2l6ZSlbaV0gIT0gKChjb25zdCBpbnQqKSZhLT5fX3NpemUpW2ldKQorCSAgYnJlYWs7CisgICAgICBpZiAoaSA9PSBuKQorICAgICAgeyAqcHBwID0gcHA7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQXJyYXkgbG9va3VwIGxvY2F0aW9uPSVwIHR5cGU9JWQgaWQ9JWRcbiIsIGEtPl9fcHRyLCB0eXBlLCBwcC0+aWQpKTsKKyAgICAgICAgcmV0dXJuIHBwLT5pZDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJBcnJheSBsb29rdXAgbG9jYXRpb249JXAgdHlwZT0lZDogbm90IGZvdW5kXG4iLCBhLT5fX3B0ciwgdHlwZSkpOworICByZXR1cm4gMDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JlZ2luX2NvdW50KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwX2Nscl9hdHRyKHNvYXApOworICBzb2FwX3NldF9sb2NhbF9uYW1lc3BhY2VzKHNvYXApOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSB8fCAoc29hcC0+b21vZGUgJiBTT0FQX0VOQ19ESU1FKSkKKyAgICBzb2FwLT5tb2RlID0gc29hcC0+b21vZGUgfCBTT0FQX0lPX0xFTkdUSCB8IFNPQVBfRU5DX0RJTUU7CisgIGVsc2UKKyNlbmRpZgorICB7IHNvYXAtPm1vZGUgPSBzb2FwLT5vbW9kZTsKKyAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX1NUT1JFCisgICAgIHx8ICgoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LIHx8IChzb2FwLT5tb2RlICYgU09BUF9FTkNfWE1MKSkKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgICAgICYmICFzb2FwLT5mcHJlcGFyZXNlbmQKKyNlbmRpZgorICAgICAgKSkKKyAgICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfSU9fTEVOR1RIOworICAgIGVsc2UKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19MRU5HVEg7CisgIH0KKyNpZmRlZiBXSVRIX1pMSUIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQikgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0ZMVVNIKQorICB7IGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSkKKyAgICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfSU9fTEVOR1RIOworICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWE1MKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX0JVRkZFUjsKKyAgICBlbHNlCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fU1RPUkU7CisgIH0KKyNlbmRpZgorICBpZiAoIXNvYXAtPmVuY29kaW5nU3R5bGUgJiYgIShzb2FwLT5tb2RlICYgU09BUF9YTUxfR1JBUEgpKQorICAgIHNvYXAtPm1vZGUgfD0gU09BUF9YTUxfVFJFRTsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSkKKyAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX01JTUU7CisgIGVsc2UKKyAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0VOQ19NVE9NOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01JTUUpCisgICAgc29hcF9zZWxlY3RfbWltZV9ib3VuZGFyeShzb2FwKTsKKyAgc29hcC0+ZGltZS5saXN0ID0gc29hcC0+ZGltZS5sYXN0OwkvKiBrZWVwIHRyYWNrIG9mIGxhc3QgRElNRSBhdHRhY2htZW50ICovCisjZW5kaWYKKyAgc29hcC0+Y291bnQgPSAwOworICBzb2FwLT5ucyA9IDA7CisgIHNvYXAtPm51bGwgPSAwOworICBzb2FwLT5wb3NpdGlvbiA9IDA7CisgIHNvYXAtPm11c3RVbmRlcnN0YW5kID0gMDsKKyAgc29hcC0+ZW5jb2RpbmcgPSAwOworICBzb2FwLT5wYXJ0ID0gU09BUF9CRUdJTjsKKyAgc29hcC0+aWRudW0gPSAwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkJlZ2luIGNvdW50IHBoYXNlIChzb2NrZXQ9JWQgbW9kZT0weCV4IGNvdW50PSVsdSlcbiIsIHNvYXAtPnNvY2tldCwgc29hcC0+bW9kZSwgKHVuc2lnbmVkIGxvbmcpc29hcC0+Y291bnQpKTsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcC0+ZGltZS5jb3VudCA9IDA7IC8qIGNvdW50ICMgb2YgYXR0YWNobWVudHMgKi8KKyAgc29hcC0+ZGltZS5zaXplID0gMDsgLyogYWNjdW11bGF0ZSB0b3RhbCBzaXplIG9mIGF0dGFjaG1lbnRzICovCisgIGlmIChzb2FwLT5mcHJlcGFyZWluaXQgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSAhPSBTT0FQX0lPX1NUT1JFKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IHNvYXAtPmZwcmVwYXJlaW5pdChzb2FwKTsgICAKKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbmRfY291bnQoc3RydWN0IHNvYXAgKnNvYXApCit7IAorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+ZnByZXBhcmVmaW5hbCkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBzb2FwLT5mcHJlcGFyZWZpbmFsKHNvYXApOworI2VuZGlmCisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIG9mIGNvdW50IHBoYXNlXG4iKSk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JlZ2luX3NlbmQoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgc29hcF9jbHJfYXR0cihzb2FwKTsKKyAgc29hcF9zZXRfbG9jYWxfbmFtZXNwYWNlcyhzb2FwKTsKKyAgc29hcC0+bW9kZSA9IHNvYXAtPm9tb2RlIHwgKHNvYXAtPm1vZGUgJiAoU09BUF9JT19MRU5HVEggfCBTT0FQX0VOQ19ESU1FKSk7CisjaWZkZWYgV0lUSF9aTElCCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIpICYmIChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19GTFVTSCkKKyAgeyBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1hNTCkKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19CVUZGRVI7CisgICAgZWxzZQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX1NUT1JFOworICB9CisjZW5kaWYKKyNpZmRlZiBXSVRIX1VEUAorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPX1VEUCkpCisgIHsgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19YTUw7CisgICAgaWYgKHNvYXAtPmNvdW50ID4gU09BUF9CVUZMRU4pCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1VEUF9FUlJPUjsKKyAgfQorI2VuZGlmCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fRkxVU0ggJiYgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgeyBpZiAoc29hcC0+Y291bnQgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX0JVRkZFUjsKKyAgICBlbHNlCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fU1RPUkU7CisgIH0KKyAgc29hcC0+bW9kZSAmPSB+U09BUF9JT19MRU5HVEg7CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fU1RPUkUpCisgICAgc29hcF9uZXdfYmxvY2soc29hcCk7CisgIGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0tFRVBBTElWRSkpCisgICAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7CisgIGlmICghc29hcC0+ZW5jb2RpbmdTdHlsZSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9HUkFQSCkpCisgICAgc29hcC0+bW9kZSB8PSBTT0FQX1hNTF9UUkVFOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpKQorICB7IHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfTUlNRTsKKyAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0VOQ19ESU1FOworICB9CisgIGVsc2UKKyAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0VOQ19NVE9NOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01JTUUpCisgICAgc29hcF9zZWxlY3RfbWltZV9ib3VuZGFyeShzb2FwKTsKKyNpZmRlZiBXSU4zMgorI2lmbmRlZiBVTkRFUl9DRQorI2lmbmRlZiBXSVRIX0ZBU1RDR0kKKyAgaWYgKCFzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKSAvKiBTZXQgd2luMzIgc3Rkb3V0IG9yIHNvYXAtPnNlbmRmZCB0byBCSU5BUlksIGUuZy4gdG8gc3VwcG9ydCBESU1FICovCisjaWZkZWYgX19CT1JMQU5EQ19fCisgICAgc2V0bW9kZSgoU09BUF9TT0NLRVQpc29hcC0+c2VuZGZkLCBPX0JJTkFSWSk7CisjZWxzZQorICAgIF9zZXRtb2RlKChTT0FQX1NPQ0tFVClzb2FwLT5zZW5kZmQsIF9PX0JJTkFSWSk7CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pCisgIHsgc29hcC0+YnVmaWR4ID0gMDsKKyAgICBzb2FwLT5idWZsZW4gPSAwOworICB9CisgIHNvYXAtPmNodW5rc2l6ZSA9IDA7CisgIHNvYXAtPm5zID0gMDsKKyAgc29hcC0+bnVsbCA9IDA7CisgIHNvYXAtPnBvc2l0aW9uID0gMDsKKyAgc29hcC0+bXVzdFVuZGVyc3RhbmQgPSAwOworICBzb2FwLT5lbmNvZGluZyA9IDA7CisgIHNvYXAtPmlkbnVtID0gMDsKKyAgc29hcC0+bGV2ZWwgPSAwOworI2lmZGVmIFdJVEhfWkxJQgorICBzb2FwLT56X3JhdGlvX291dCA9IDEuMDsKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQikgJiYgc29hcC0+emxpYl9zdGF0ZSAhPSBTT0FQX1pMSUJfREVGTEFURSkKKyAgeworI2lmZGVmIFdJVEhfR1pJUAorICAgIG1lbWNweShzb2FwLT56X2J1ZiwgIlwzN1wyMTNcMTBcMFwwXDBcMFwwXDBcMzc3IiwgMTApOworICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gKEJ5dGUqKXNvYXAtPnpfYnVmICsgMTA7CisgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0ID0gU09BUF9CVUZMRU4gLSAxMDsKKyAgICBzb2FwLT56X2NyYyA9IGNyYzMyKDBMLCBOVUxMLCAwKTsKKyAgICBpZiAoZGVmbGF0ZUluaXQyKCZzb2FwLT5kX3N0cmVhbSwgc29hcC0+el9sZXZlbCwgWl9ERUZMQVRFRCwgLU1BWF9XQklUUywgOCwgWl9ERUZBVUxUX1NUUkFURUdZKSAhPSBaX09LKQorI2Vsc2UKKyAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IChCeXRlKilzb2FwLT56X2J1ZjsKKyAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgPSBTT0FQX0JVRkxFTjsKKyAgICBpZiAoZGVmbGF0ZUluaXQoJnNvYXAtPmRfc3RyZWFtLCBzb2FwLT56X2xldmVsKSAhPSBaX09LKQorI2VuZGlmCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJEZWZsYXRlIGluaXRpYWxpemVkXG4iKSk7CisgICAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9ERUZMQVRFOworICB9CisjZW5kaWYKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJCZWdpbiBzZW5kIHBoYXNlIChzb2NrZXQ9JWQgbW9kZT0weCV4IGNvdW50PSVsdSlcbiIsIHNvYXAtPnNvY2tldCwgc29hcC0+bW9kZSwgKHVuc2lnbmVkIGxvbmcpc29hcC0+Y291bnQpKTsKKyAgc29hcC0+cGFydCA9IFNPQVBfQkVHSU47CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5mcHJlcGFyZWluaXQgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX1NUT1JFKQorICAgIHNvYXAtPmZwcmVwYXJlaW5pdChzb2FwKTsgICAKKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2VtYmVkZGVkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBpbnQgdCkKK3sgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICBpZiAoc29hcF9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCB0LCAmcHApKQorICB7IHBwLT5tYXJrMSA9IDE7CisgICAgcHAtPm1hcmsyID0gMTsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVtYmVkZGVkICVwIHR5cGU9JWQgbWFyayBzZXQgdG8gMVxuIiwgcCwgdCkpOworICB9Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVmZXJlbmNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBpbnQgdCkKK3sgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICBpZiAoIXAgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9UUkVFKSkKKyAgICByZXR1cm4gMTsKKyAgaWYgKHNvYXBfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgdCwgJnBwKSkKKyAgeyBpZiAocHAtPm1hcmsxID09IDApCisgICAgeyBwcC0+bWFyazEgPSAyOworICAgICAgcHAtPm1hcmsyID0gMjsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoc29hcF9wb2ludGVyX2VudGVyKHNvYXAsIHAsIE5VTEwsIDAsIHQsICZwcCkpCisgIHsgcHAtPm1hcmsxID0gMDsKKyAgICBwcC0+bWFyazIgPSAwOworICB9CisgIGVsc2UKKyAgICByZXR1cm4gMTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWZlcmVuY2UgJXAgdHlwZT0lZCAoJWQgJWQpXG4iLCBwLCB0LCAoaW50KXBwLT5tYXJrMSwgKGludClwcC0+bWFyazIpKTsKKyAgcmV0dXJuIHBwLT5tYXJrMTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9hcnJheV9yZWZlcmVuY2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgbiwgaW50IHQpCit7IHJlZ2lzdGVyIGludCBpOworICBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgIGlmICghcCB8fCAhYS0+X19wdHIpCisgICAgcmV0dXJuIDE7CisgIGkgPSBzb2FwX2FycmF5X3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIGEsIG4sIHQsICZwcCk7CisgIGlmIChpKQorICB7IGlmIChwcC0+bWFyazEgPT0gMCkKKyAgICB7IHBwLT5tYXJrMSA9IDI7CisgICAgICBwcC0+bWFyazIgPSAyOworICAgIH0KKyAgfQorICBlbHNlIGlmICghc29hcF9wb2ludGVyX2VudGVyKHNvYXAsIHAsIGEsIG4sIHQsICZwcCkpCisgICAgcmV0dXJuIDE7CisgIGVsc2UKKyAgeyBwcC0+bWFyazEgPSAwOworICAgIHBwLT5tYXJrMiA9IDA7CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJBcnJheSByZWZlcmVuY2UgJXAgcHRyPSVwIGRpbT0lZCB0eXBlPSVkICglZCAlZClcbiIsIHAsIGEtPl9fcHRyLCBuLCB0LCAoaW50KXBwLT5tYXJrMSwgKGludClwcC0+bWFyazIpKTsKKyAgcmV0dXJuIHBwLT5tYXJrMTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbWJlZGRlZF9pZChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGlkLCBjb25zdCB2b2lkICpwLCBpbnQgdCkKK3sgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1RSRUUpCisgICAgcmV0dXJuIGlkOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVtYmVkZGVkX2lkICVwIHR5cGU9JWQgaWQ9JWRcbiIsIHAsIHQsIGlkKSk7CisgIGlmIChzb2FwLT52ZXJzaW9uID09IDEgJiYgc29hcC0+ZW5jb2RpbmdTdHlsZSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9HUkFQSCkgJiYgc29hcC0+cGFydCAhPSBTT0FQX0lOX0hFQURFUikKKyAgeyBpZiAoaWQgPCAwKQorICAgIHsgaWQgPSBzb2FwX3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIHQsICZwcCk7CisgICAgICBpZiAoaWQpCisgICAgICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgICAgICAgcHAtPm1hcmsxID0gMjsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHBwLT5tYXJrMiA9IDI7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW1iZWRkZWRfaWQgbXVsdGlyZWYgaWQ9JWQgJXAgdHlwZT0lZCA9ICglZCAlZClcbiIsIGlkLCBwLCB0LCAoaW50KXBwLT5tYXJrMSwgKGludClwcC0+bWFyazIpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIGlkOworICB9CisgIGlmIChpZCA8IDApCisgICAgaWQgPSBzb2FwX3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIHQsICZwcCk7CisgIGVsc2UgaWYgKGlkICYmICFzb2FwX3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIHQsICZwcCkpCisgICAgcmV0dXJuIDA7CisgIGlmIChpZCAmJiBwcCkKKyAgeyBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICAgICAgcHAtPm1hcmsxID0gMTsKKyAgICBlbHNlCisgICAgICBwcC0+bWFyazIgPSAxOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW1iZWRkZWRfaWQgZW1iZWRkZWQgcmVmIGlkPSVkICVwIHR5cGU9JWQgPSAoJWQgJWQpXG4iLCBpZCwgcCwgdCwgKGludClwcC0+bWFyazEsIChpbnQpcHAtPm1hcmsyKSk7CisgIH0KKyAgcmV0dXJuIGlkOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2lzX2VtYmVkZGVkKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHApCit7IGlmICghcHApCisgICAgcmV0dXJuIDA7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSXMgZW1iZWRkZWQ/ICVkICVkXG4iLCAoaW50KXBwLT5tYXJrMSwgKGludClwcC0+bWFyazIpKTsKKyAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMSAmJiBzb2FwLT5lbmNvZGluZ1N0eWxlICYmICEoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0dSQVBIKSAmJiBzb2FwLT5wYXJ0ICE9IFNPQVBfSU5fSEVBREVSKQorICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgICByZXR1cm4gcHAtPm1hcmsxICE9IDA7CisgICAgcmV0dXJuIHBwLT5tYXJrMiAhPSAwOworICB9CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgcmV0dXJuIHBwLT5tYXJrMSA9PSAxOworICByZXR1cm4gcHAtPm1hcmsyID09IDE7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfaXNfc2luZ2xlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHApCit7IGlmIChzb2FwLT5wYXJ0ID09IFNPQVBfSU5fSEVBREVSKQorICAgIHJldHVybiAxOworICBpZiAoIXBwKQorICAgIHJldHVybiAwOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICAgIHJldHVybiBwcC0+bWFyazEgPT0gMDsKKyAgcmV0dXJuIHBwLT5tYXJrMiA9PSAwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfZW1iZWRkZWQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3BsaXN0ICpwcCkKK3sgaWYgKCFwcCkKKyAgICByZXR1cm47CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgcHAtPm1hcmsxID0gMTsKKyAgZWxzZQorICAgIHBwLT5tYXJrMiA9IDE7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYXR0YWNobWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBjb25zdCBjaGFyICphaWQsIGNvbnN0IGNoYXIgKmF0eXBlLCBjb25zdCBjaGFyICphb3B0aW9ucywgaW50IG4sIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KSAKK3sgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICBpbnQgaTsKKyAgaWYgKCFwIHx8ICFhLT5fX3B0ciB8fCAoIWFpZCAmJiAhYXR5cGUpKQorICAgIHJldHVybiBzb2FwX2VsZW1lbnRfaWQoc29hcCwgdGFnLCBpZCwgcCwgYSwgbiwgdHlwZSwgdCk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQXR0YWNobWVudCB0YWc9JyVzJyBpZD0nJXMnICglZCkgdHlwZT0nJXMnXG4iLCB0YWcsIGFpZD9haWQ6IiIsIGlkLCBhdHlwZT9hdHlwZToiIikpOworICBpID0gc29hcF9hcnJheV9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCBhLCBuLCB0LCAmcHApOworICBpZiAoIWkpCisgIHsgaSA9IHNvYXBfcG9pbnRlcl9lbnRlcihzb2FwLCBwLCBhLCBuLCB0LCAmcHApOworICAgIGlmICghaSkKKyAgICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CisgIGlmIChpZCA8PSAwKQorICAgIGlkID0gaTsKKyAgaWYgKCFhaWQpCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsIHNvYXAtPmRpbWVfaWRfZm9ybWF0LCBpZCk7CisgICAgYWlkID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+dG1wYnVmKTsKKyAgfQorICAvKiBBZGQgTVRPTSB4b3A6SW5jbHVkZSBlbGVtZW50IHdoZW4gbmVjZXNzYXJ5ICovCisgIC8qIFRPRE86IHRoaXMgY29kZSB0byBiZSBvYnNvbGV0ZWQgd2l0aCBuZXcgaW1wb3J0L3hvcC5oIGNvbnZlbnRpb25zICovCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pICYmIHN0cmNtcCh0YWcsICJ4b3A6SW5jbHVkZSIpKQorICB7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgMCwgdHlwZSkKKyAgICAgfHwgc29hcF9lbGVtZW50X2hyZWYoc29hcCwgInhvcDpJbmNsdWRlIiwgMCwgImhyZWYiLCBhaWQpCisgICAgIHx8IHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZykpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgZWxzZSBpZiAoc29hcF9lbGVtZW50X2hyZWYoc29hcCwgdGFnLCAwLCAiaHJlZiIsIGFpZCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICB7IGlmIChwcC0+bWFyazEgIT0gMykKKyAgICB7IHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkKKyAgICAgICAgY29udGVudCA9IHNvYXBfbmV3X211bHRpcGFydChzb2FwLCAmc29hcC0+bWltZS5maXJzdCwgJnNvYXAtPm1pbWUubGFzdCwgKGNoYXIqKWEtPl9fcHRyLCBhLT5fX3NpemUpOworICAgICAgZWxzZQorICAgICAgICBjb250ZW50ID0gc29hcF9uZXdfbXVsdGlwYXJ0KHNvYXAsICZzb2FwLT5kaW1lLmZpcnN0LCAmc29hcC0+ZGltZS5sYXN0LCAoY2hhciopYS0+X19wdHIsIGEtPl9fc2l6ZSk7CisgICAgICBpZiAoIWNvbnRlbnQpCisgICAgICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGlmICghc3RybmNtcChhaWQsICJjaWQ6IiwgNCkpIC8qIFJGQyAyMTExICovCisgICAgICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkKKyAgICAgICAgeyBjaGFyICpzID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihhaWQpIC0gMSk7CisJICBpZiAocykKKwkgIHsgKnMgPSAnPCc7CisJICAgIHN0cmNweShzICsgMSwgYWlkICsgNCk7CisJICAgIHN0cmNhdChzLCAiPiIpOworCSAgICBjb250ZW50LT5pZCA9IHM7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBjb250ZW50LT5pZCA9IGFpZCArIDQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIGNvbnRlbnQtPmlkID0gYWlkOworICAgICAgY29udGVudC0+dHlwZSA9IGF0eXBlOworICAgICAgY29udGVudC0+b3B0aW9ucyA9IGFvcHRpb25zOworICAgICAgY29udGVudC0+ZW5jb2RpbmcgPSBTT0FQX01JTUVfQklOQVJZOworICAgICAgcHAtPm1hcmsxID0gMzsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIHBwLT5tYXJrMiA9IDM7CisgIHJldHVybiAtMTsKK30KKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQKK3NvYXBfaW5pdF9paHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBpOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluaXRpYWxpemluZyBJRCBoYXNodGFibGVcbiIpKTsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfSURIQVNIOyBpKyspCisgICAgc29hcC0+aWh0W2ldID0gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyB2b2lkCitzb2FwX2ZyZWVfaWh0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfaWxpc3QgKmlwLCAqcDsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZmxpc3QgKmZwLCAqZnE7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZSBJRCBoYXNodGFibGVcbiIpKTsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfSURIQVNIOyBpKyspCisgIHsgZm9yIChpcCA9IHNvYXAtPmlodFtpXTsgaXA7IGlwID0gcCkKKyAgICB7IGZvciAoZnAgPSBpcC0+Zmxpc3Q7IGZwOyBmcCA9IGZxKQorICAgICAgeyBmcSA9IGZwLT5uZXh0OworICAgICAgICBTT0FQX0ZSRUUoc29hcCwgZnApOworICAgICAgfQorICAgICAgcCA9IGlwLT5uZXh0OworICAgICAgU09BUF9GUkVFKHNvYXAsIGlwKTsKKyAgICB9CisgICAgc29hcC0+aWh0W2ldID0gTlVMTDsKKyAgfQorfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorc3RydWN0IHNvYXBfaWxpc3QgKgorU09BUF9GTUFDMgorc29hcF9sb29rdXAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIGZvciAoaXAgPSBzb2FwLT5paHRbc29hcF9oYXNoKGlkKV07IGlwOyBpcCA9IGlwLT5uZXh0KQorICAgIGlmICghc3RyY21wKGlwLT5pZCwgaWQpKQorICAgICAgcmV0dXJuIGlwOworICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwX2lsaXN0ICoKK1NPQVBfRk1BQzIKK3NvYXBfZW50ZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkKQoreyByZWdpc3RlciBzaXplX3QgaDsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworICBpcCA9IChzdHJ1Y3Qgc29hcF9pbGlzdCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2lsaXN0KSArIHN0cmxlbihpZCkpOworICBpZiAoaXApCisgIHsgaCA9IHNvYXBfaGFzaChpZCk7CisgICAgc3RyY3B5KGlwLT5pZCwgaWQpOworICAgIGlwLT5uZXh0ID0gc29hcC0+aWh0W2hdOworICAgIHNvYXAtPmlodFtoXSA9IGlwOworICAgIHJldHVybiBpcDsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZCoKK1NPQVBfRk1BQzIKK3NvYXBfbWFsbG9jKHN0cnVjdCBzb2FwICpzb2FwLCBzaXplX3QgbikKK3sgcmVnaXN0ZXIgY2hhciAqcDsKKyAgaWYgKCFuKQorICAgIHJldHVybiAodm9pZCopU09BUF9OT05fTlVMTDsKKyAgaWYgKCFzb2FwKQorICAgIHJldHVybiBTT0FQX01BTExPQyhzb2FwLCBuKTsKKyAgbiArPSAoLShsb25nKW4pICYgKHNpemVvZih2b2lkKiktMSk7IC8qIGFsaWduIGF0IDQtLCA4LSBvciAxNi1ieXRlIGJvdW5kYXJ5ICovCisgIGlmICghKHAgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgbiArIHNpemVvZih2b2lkKikgKyBzaXplb2Yoc2l6ZV90KSkpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgLyoga2VlcCBjaGFpbiBvZiBhbGxvY2VkIGNlbGxzIGZvciBsYXRlciBkZXN0cnVjdGlvbiAqLworICBzb2FwLT5hbGxvY2VkID0gMTsKKyAgKih2b2lkKiopKHAgKyBuKSA9IHNvYXAtPmFsaXN0OworICAqKHNpemVfdCopKHAgKyBuICsgc2l6ZW9mKHZvaWQqKSkgPSBuOworICBzb2FwLT5hbGlzdCA9IHAgKyBuOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK3N0YXRpYyB2b2lkCitzb2FwX2luaXRfbWh0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IChpbnQpU09BUF9QVFJIQVNIOyBpKyspCisgICAgc29hcC0+bWh0W2ldID0gTlVMTDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK3N0YXRpYyB2b2lkCitzb2FwX2ZyZWVfbWh0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbWxpc3QgKm1wLCAqbXE7CisgIGZvciAoaSA9IDA7IGkgPCAoaW50KVNPQVBfUFRSSEFTSDsgaSsrKQorICB7IGZvciAobXAgPSBzb2FwLT5taHRbaV07IG1wOyBtcCA9IG1xKQorICAgIHsgbXEgPSBtcC0+bmV4dDsKKyAgICAgIGlmIChtcC0+bGl2ZSkKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyglZCk6IG1hbGxvYygpID0gJXAgbm90IGZyZWVkIChtZW1vcnkgbGVhayBvciBmb3Jnb3QgdG8gY2FsbCBzb2FwX2VuZCgpPylcbiIsIG1wLT5maWxlLCBtcC0+bGluZSwgbXAtPnB0cik7CisgICAgICBmcmVlKG1wKTsKKyAgICB9CisgICAgc29hcC0+bWh0W2ldID0gTlVMTDsKKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworU09BUF9GTUFDMQordm9pZCoKK1NPQVBfRk1BQzIKK3NvYXBfdHJhY2tfbWFsbG9jKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgc2l6ZV90IHNpemUpCit7IHJlZ2lzdGVyIHZvaWQgKnAgPSBtYWxsb2Moc2l6ZSk7CisgIGlmIChzb2FwKQorICB7IHJlZ2lzdGVyIGludCBoID0gc29hcF9oYXNoX3B0cihwKTsKKyAgICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9tbGlzdCAqbXAgPSAoc3RydWN0IHNvYXBfbWxpc3QqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHNvYXBfbWxpc3QpKTsKKyAgICBpZiAoc29hcC0+ZmRlYnVnW1NPQVBfSU5ERVhfVEVTVF0pCisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIiVzKCVkKTogbWFsbG9jKCVsdSkgPSAlcFxuIiwgZmlsZSwgbGluZSwgKHVuc2lnbmVkIGxvbmcpc2l6ZSwgcCkpOworICAgIG1wLT5uZXh0ID0gc29hcC0+bWh0W2hdOworICAgIG1wLT5wdHIgPSBwOworICAgIG1wLT5maWxlID0gZmlsZTsKKyAgICBtcC0+bGluZSA9IGxpbmU7CisgICAgbXAtPmxpdmUgPSAxOworICAgIHNvYXAtPm1odFtoXSA9IG1wOworICB9CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF90cmFja19mcmVlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgdm9pZCAqcCkKK3sgcmVnaXN0ZXIgaW50IGggPSBzb2FwX2hhc2hfcHRyKHApOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9tbGlzdCAqbXA7CisgIGZvciAobXAgPSBzb2FwLT5taHRbaF07IG1wOyBtcCA9IG1wLT5uZXh0KQorICAgIGlmIChtcC0+cHRyID09IHApCisgICAgICBicmVhazsKKyAgaWYgKG1wKQorICB7IGlmIChtcC0+bGl2ZSkKKyAgICB7IGZyZWUocCk7CisgICAgICBpZiAoc29hcC0+ZmRlYnVnW1NPQVBfSU5ERVhfVEVTVF0pCisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiJXMoJWQpOiBmcmVlKCVwKVxuIiwgZmlsZSwgbGluZSwgcCkpOworICAgICAgbXAtPmxpdmUgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzKCVkKTogZnJlZSglcCkgZG91YmxlIGZyZWUgb2YgcG9pbnRlciBtYWxsb2NlZCBhdCAlcyglZClcbiIsIGZpbGUsIGxpbmUsIHAsIG1wLT5maWxlLCBtcC0+bGluZSk7CisgIH0KKyAgZWxzZQorICAgIGZwcmludGYoc3RkZXJyLCAiJXMoJWQpOiBmcmVlKCVwKSBwb2ludGVyIG5vdCBtYWxsb2NlZFxuIiwgZmlsZSwgbGluZSwgcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitzdGF0aWMgdm9pZAorc29hcF90cmFja191bmxpbmsoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnApCit7IHJlZ2lzdGVyIGludCBoID0gc29hcF9oYXNoX3B0cihwKTsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbWxpc3QgKm1wOworICBmb3IgKG1wID0gc29hcC0+bWh0W2hdOyBtcDsgbXAgPSBtcC0+bmV4dCkKKyAgICBpZiAobXAtPnB0ciA9PSBwKQorICAgICAgYnJlYWs7CisgIGlmIChtcCkKKyAgICBtcC0+bGl2ZSA9IDA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2RlYWxsb2Moc3RydWN0IHNvYXAgKnNvYXAsIHZvaWQgKnApCit7IGlmICghc29hcCkKKyAgICByZXR1cm47CisgIGlmIChwKQorICB7IHJlZ2lzdGVyIGNoYXIgKipxOworICAgIGZvciAocSA9IChjaGFyKiopJnNvYXAtPmFsaXN0OyAqcTsgcSA9ICooY2hhcioqKilxKQorICAgIHsgaWYgKHAgPT0gKHZvaWQqKSgqcSAtICooc2l6ZV90KikoKnEgKyBzaXplb2Yodm9pZCopKSkpCisgICAgICB7ICpxID0gKiooY2hhcioqKilxOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWVkIGRhdGEgYXQgJXBcbiIsIHApKTsKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHApOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICAgIHNvYXBfZGVsZXRlKHNvYXAsIHApOworICB9CisgIGVsc2UKKyAgeyByZWdpc3RlciBjaGFyICpxOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZSBhbGwgc29hcF9tYWxsb2MoKSBkYXRhXG4iKSk7CisgICAgd2hpbGUgKHNvYXAtPmFsaXN0KQorICAgIHsgcSA9IChjaGFyKilzb2FwLT5hbGlzdDsKKyAgICAgIHNvYXAtPmFsaXN0ID0gKih2b2lkKiopcTsKKyAgICAgIHEgLT0gKihzaXplX3QqKShxICsgc2l6ZW9mKHZvaWQqKSk7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgcSk7CisgICAgfQorICB9CisgIC8qIHdlIG11c3QgYXNzdW1lIHRoZXNlIHdlcmUgZGVhbGxvY2F0ZWQ6ICovCisgIHNvYXAtPmFjdGlvbiA9IE5VTEw7CisgIHNvYXAtPmZhdWx0ID0gTlVMTDsKKyAgc29hcC0+aGVhZGVyID0gTlVMTDsKKyAgc29hcC0+dXNlcmlkID0gTlVMTDsKKyAgc29hcC0+cGFzc3dkID0gTlVMTDsKKyAgc29hcC0+YXV0aHJlYWxtID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcF9jbHJfbWltZShzb2FwKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9kZWxldGUoc3RydWN0IHNvYXAgKnNvYXAsIHZvaWQgKnApCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2NsaXN0ICoqY3A7CisgIGlmIChzb2FwX2NoZWNrX3N0YXRlKHNvYXApKQorICAgIHJldHVybjsKKyAgY3AgPSAmc29hcC0+Y2xpc3Q7CisgIGlmIChwKQorICB7IHdoaWxlICgqY3ApCisgICAgeyBpZiAocCA9PSAoKmNwKS0+cHRyKQorICAgICAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9jbGlzdCAqcSA9ICpjcDsKKyAgICAgICAgKmNwID0gcS0+bmV4dDsKKyAgICAgICAgcS0+ZmRlbGV0ZShxKTsKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHEpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBjcCA9ICYoKmNwKS0+bmV4dDsKKyAgICB9CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgZGVhbGxvYyBkYXRhICVwOiBhZGRyZXNzIG5vdCBpbiBsaXN0XG4iLCBwKSk7CisgIH0KKyAgZWxzZQorICB7IHdoaWxlICgqY3ApCisgICAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9jbGlzdCAqcSA9ICpjcDsKKyAgICAgICpjcCA9IHEtPm5leHQ7CisgICAgICBpZiAocS0+cHRyID09ICh2b2lkKilzb2FwLT5mYXVsdCkKKyAgICAgICAgc29hcC0+ZmF1bHQgPSBOVUxMOyAvKiB0aGlzIHdhcyBkZWFsbG9jYXRlZCAqLworICAgICAgZWxzZSBpZiAocS0+cHRyID09ICh2b2lkKilzb2FwLT5oZWFkZXIpCisgICAgICAgIHNvYXAtPmhlYWRlciA9IE5VTEw7IC8qIHRoaXMgd2FzIGRlYWxsb2NhdGVkICovCisgICAgICBxLT5mZGVsZXRlKHEpOworICAgICAgU09BUF9GUkVFKHNvYXAsIHEpOworICAgIH0KKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorc3RydWN0IHNvYXBfY2xpc3QgKgorU09BUF9GTUFDMgorc29hcF9saW5rKHN0cnVjdCBzb2FwICpzb2FwLCB2b2lkICpwLCBpbnQgdCwgaW50IG4sIHZvaWQgKCpmZGVsZXRlKShzdHJ1Y3Qgc29hcF9jbGlzdCopKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9jbGlzdCAqY3A7CisgIGlmICgoY3AgPSAoc3RydWN0IHNvYXBfY2xpc3QqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9jbGlzdCkpKSkKKyAgeyBjcC0+bmV4dCA9IHNvYXAtPmNsaXN0OworICAgIGNwLT50eXBlID0gdDsKKyAgICBjcC0+c2l6ZSA9IG47IAorICAgIGNwLT5wdHIgPSBwOworICAgIGNwLT5mZGVsZXRlID0gZmRlbGV0ZTsKKyAgICBzb2FwLT5jbGlzdCA9IGNwOworICB9CisgIHJldHVybiBjcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfdW5saW5rKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwKQoreyByZWdpc3RlciBjaGFyICoqcTsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfY2xpc3QgKipjcDsKKyAgaWYgKCFzb2FwIHx8ICFwKQorICAgIHJldHVybjsKKyAgZm9yIChxID0gKGNoYXIqKikmc29hcC0+YWxpc3Q7ICpxOyBxID0gKihjaGFyKioqKXEpCisgIHsgaWYgKHAgPT0gKHZvaWQqKSgqcSAtICooc2l6ZV90KikoKnEgKyBzaXplb2Yodm9pZCopKSkpCisgICAgeyAqcSA9ICoqKGNoYXIqKiopcTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVW5saW5rZWQgZGF0YSAlcFxuIiwgcCkpOworI2lmZGVmIFNPQVBfREVCVUcKKyAgICAgIHNvYXBfdHJhY2tfdW5saW5rKHNvYXAsIHApOworI2VuZGlmCisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIGZvciAoY3AgPSAmc29hcC0+Y2xpc3Q7ICpjcDsgY3AgPSAmKCpjcCktPm5leHQpCisgIHsgaWYgKHAgPT0gKCpjcCktPnB0cikKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVW5saW5rZWQgY2xhc3MgaW5zdGFuY2UgJXBcbiIsIHApKTsKKyAgICAgIHEgPSAoY2hhcioqKSpjcDsKKyAgICAgICpjcCA9ICgqY3ApLT5uZXh0OworICAgICAgU09BUF9GUkVFKHNvYXAsIHEpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9sb29rdXBfdHlwZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgaWYgKGlkICYmICppZCkKKyAgeyBpcCA9IHNvYXBfbG9va3VwKHNvYXAsIGlkKTsKKyAgICBpZiAoaXApCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkxvb2t1cCBpZD0nJXMnIHR5cGU9JWRcbiIsIGlkLCBpcC0+dHlwZSkpOworICAgICAgcmV0dXJuIGlwLT50eXBlOworICAgIH0KKyAgfQorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImxvb2t1cCB0eXBlIGlkPSclcycgTk9UIEZPVU5EISBOZWVkIHRvIGdldCBpdCBmcm9tIHhzaTp0eXBlXG4iLCBpZCkpOworICByZXR1cm4gMDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQqCitTT0FQX0ZNQUMyCitzb2FwX2lkX2xvb2t1cChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIHZvaWQgKipwLCBpbnQgdCwgc2l6ZV90IG4sIHVuc2lnbmVkIGludCBrKQoreyBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIHZvaWQgKipxOworICBpZiAoIXAgfHwgIWlkIHx8ICEqaWQpCisgICAgcmV0dXJuIHA7CisgIGlwID0gc29hcF9sb29rdXAoc29hcCwgaWQpOyAvKiBsb29rdXAgcG9pbnRlciB0byBoYXNoIHRhYmxlIGVudHJ5IGZvciBzdHJpbmcgaWQgKi8KKyAgaWYgKCFpcCkKKyAgeyBpcCA9IHNvYXBfZW50ZXIoc29hcCwgaWQpOyAvKiBuZXcgaGFzaCB0YWJsZSBlbnRyeSBmb3Igc3RyaW5nIGlkICovCisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGb3J3YXJkaW5nIGZpcnN0IGhyZWY9JyVzJyB0eXBlPSVkICVwICgldSBieXRlcylcbiIsIGlkLCB0LCBwLCAodW5zaWduZWQgaW50KW4pKTsKKyAgICBpcC0+dHlwZSA9IHQ7CisgICAgaXAtPnNpemUgPSBuOyAKKyAgICBpcC0+bGluayA9IHA7CisgICAgaXAtPmNvcHkgPSBOVUxMOworICAgIGlwLT5mbGlzdCA9IE5VTEw7CisgICAgaXAtPnB0ciA9IE5VTEw7CisgICAgaXAtPmxldmVsID0gazsKKyAgICAqcCA9IE5VTEw7CisgIH0KKyAgZWxzZSBpZiAoaXAtPnB0cikKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc29sdmVkIGhyZWY9JyVzJyB0eXBlPSVkIGxvY2F0aW9uPSVwICgldSBieXRlcylcbiIsIGlkLCB0LCBpcC0+cHRyLCAodW5zaWduZWQgaW50KW4pKTsKKyAgICBpZiAoaXAtPnR5cGUgIT0gdCkKKyAgICB7IHN0cmNweShzb2FwLT5pZCwgaWQpOworICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0hSRUY7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlR5cGUgaW5jb21wYXRpYmlsaXR5OiBpZCB0eXBlPSVkIGhyZWYgdHlwZT0lZFxuIiwgaXAtPnR5cGUsIHQpKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB3aGlsZSAoaXAtPmxldmVsIDwgaykKKyAgICB7IHEgPSAodm9pZCoqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZih2b2lkKikpOyAgCisgICAgICBpZiAoIXEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgKnAgPSAodm9pZCopcTsKKyAgICAgIHAgPSBxOworICAgICAgay0tOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJEZXNjZW5kaW5nIG9uZSBsZXZlbC4uLlxuIikpOworICAgIH0KKyAgICAqcCA9IGlwLT5wdHI7CisgIH0KKyAgZWxzZSBpZiAoaXAtPmxldmVsID4gaykKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc29sdmluZyBsZXZlbCAldSBwb2ludGVycyB0byBocmVmPSclcydcbiIsIGlwLT5sZXZlbCwgaWQpKTsKKyAgICB3aGlsZSAoaXAtPmxldmVsID4gaykKKyAgICB7IHZvaWQgKnMsICoqciA9ICZpcC0+bGluazsKKyAgICAgIHEgPSAodm9pZCoqKWlwLT5saW5rOworICAgICAgd2hpbGUgKHEpCisgICAgICB7ICpyID0gKHZvaWQqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZih2b2lkKikpOworICAgICAgICBzID0gKnE7CisgICAgICAgICpxID0gKnI7CisgICAgICAgIHIgPSAodm9pZCoqKSpyOworICAgICAgICBxID0gKHZvaWQqKilzOworICAgICAgfQorICAgICAgKnIgPSBOVUxMOworICAgICAgaXAtPnNpemUgPSBuOyAKKyAgICAgIGlwLT5jb3B5ID0gTlVMTDsKKyAgICAgIGlwLT5sZXZlbCA9IGlwLT5sZXZlbCAtIDE7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlc2NlbmRpbmcgb25lIGxldmVsLi4uXG4iKSk7CisgICAgfQorICAgIHEgPSAodm9pZCoqKWlwLT5saW5rOworICAgIGlwLT5saW5rID0gcDsKKyAgICAqcCA9ICh2b2lkKilxOworICB9CisgIGVsc2UKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZvcndhcmRlZCBocmVmPSclcycgdHlwZT0lZCBsb2NhdGlvbj0lcCAoJXUgYnl0ZXMpXG4iLCBpZCwgdCwgcCwgKHVuc2lnbmVkIGludCluKSk7CisgICAgd2hpbGUgKGlwLT5sZXZlbCA8IGspCisgICAgeyBxID0gKHZvaWQqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yodm9pZCopKTsgIAorICAgICAgKnAgPSBxOworICAgICAgcCA9IHE7CisgICAgICBrLS07CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlc2NlbmRpbmcgb25lIGxldmVsLi4uXG4iKSk7CisgICAgfQorICAgIHEgPSAodm9pZCoqKWlwLT5saW5rOworICAgIGlwLT5saW5rID0gcDsKKyAgICAqcCA9ICh2b2lkKilxOworICB9CisgIHJldHVybiBwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZCoKK1NPQVBfRk1BQzIKK3NvYXBfaWRfZm9yd2FyZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaHJlZiwgdm9pZCAqcCwgc2l6ZV90IGxlbiwgaW50IHN0LCBpbnQgdHQsIHNpemVfdCBuLCB1bnNpZ25lZCBpbnQgaywgdm9pZCAoKmZjb3B5KShzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgc2l6ZV90LCBjb25zdCB2b2lkKiwgc2l6ZV90KSkKK3sgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworICBpZiAoIXAgfHwgIWhyZWYgfHwgISpocmVmKQorICAgIHJldHVybiBwOworICBpcCA9IHNvYXBfbG9va3VwKHNvYXAsIGhyZWYpOyAvKiBsb29rdXAgcG9pbnRlciB0byBoYXNoIHRhYmxlIGVudHJ5IGZvciBzdHJpbmcgaWQgKi8KKyAgaWYgKCFpcCkKKyAgeyBpcCA9IHNvYXBfZW50ZXIoc29hcCwgaHJlZik7IC8qIG5ldyBoYXNoIHRhYmxlIGVudHJ5IGZvciBzdHJpbmcgaWQgKi8KKyAgICBpcC0+dHlwZSA9IHN0OworICAgIGlwLT5zaXplID0gbjsKKyAgICBpcC0+bGluayA9IE5VTEw7CisgICAgaXAtPmNvcHkgPSBOVUxMOworICAgIGlwLT5wdHIgPSBOVUxMOworICAgIGlwLT5sZXZlbCA9IDA7CisgICAgaXAtPmZsaXN0ID0gTlVMTDsKKyAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiTmV3IGVudHJ5IGhyZWY9JyVzJyB0eXBlPSVkIHNpemU9JWx1IGxldmVsPSVkIGxvY2F0aW9uPSVwXG4iLCBocmVmLCBzdCwgKHVuc2lnbmVkIGxvbmcpbiwgaywgcCkpOworICB9CisgIGVsc2UgaWYgKGlwLT50eXBlICE9IHN0IHx8IChpcC0+bGV2ZWwgPT0gayAmJiBpcC0+c2l6ZSAhPSBuKSkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlR5cGUgaW5jb21wYXRpYmlsaXR5IGlkPSclcycgZXhwZWN0IHR5cGU9JWQgc2l6ZT0lbHUgbGV2ZWw9JXUgZ290IHR5cGU9JWQgc2l6ZT0lbHVcbiIsIGhyZWYsIGlwLT50eXBlLCAodW5zaWduZWQgbG9uZylpcC0+c2l6ZSwgaywgc3QsICh1bnNpZ25lZCBsb25nKW4pKTsKKyAgICBzdHJjcHkoc29hcC0+aWQsIGhyZWYpOworICAgIHNvYXAtPmVycm9yID0gU09BUF9IUkVGOworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChmY29weSB8fCBuIDwgc2l6ZW9mKHZvaWQqKSB8fCAqaHJlZiAhPSAnIycpCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZmxpc3QgKmZwID0gKHN0cnVjdCBzb2FwX2ZsaXN0KilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfZmxpc3QpKTsKKyAgICBpZiAoIWZwKQorICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmcC0+bmV4dCA9IGlwLT5mbGlzdDsKKyAgICBmcC0+dHlwZSA9IHR0OworICAgIGZwLT5wdHIgPSBwOworICAgIGZwLT5sZXZlbCA9IGs7CisgICAgZnAtPmxlbiA9IGxlbjsKKyAgICBpZiAoZmNvcHkpCisgICAgICBmcC0+ZmNvcHkgPSBmY29weTsKKyAgICBlbHNlCisgICAgICBmcC0+ZmNvcHkgPSBzb2FwX2Zjb3B5OworICAgIGlwLT5mbGlzdCA9IGZwOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRm9yd2FyZGluZyB0eXBlPSVkICh0YXJnZXQgdHlwZT0lZCkgc2l6ZT0lbHUgbG9jYXRpb249JXAgbGV2ZWw9JXUgbGVuPSVsdSBocmVmPSclcydcbiIsIHN0LCB0dCwgKHVuc2lnbmVkIGxvbmcpbiwgcCwgaywgKHVuc2lnbmVkIGxvbmcpbGVuLCBocmVmKSk7CisgIH0KKyAgZWxzZQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRm9yd2FyZGluZyBjb3B5aW5nIGFkZHJlc3MgJXAgZm9yIHR5cGU9JWQgaHJlZj0nJXMnXG4iLCBwLCBzdCwgaHJlZikpOworICAgICoodm9pZCoqKXAgPSBpcC0+Y29weTsKKyAgICBpcC0+Y29weSA9IHA7CisgIH0KKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQqCitTT0FQX0ZNQUMyCitzb2FwX2lkX2VudGVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgdm9pZCAqcCwgaW50IHQsIHNpemVfdCBuLCB1bnNpZ25lZCBpbnQgaywgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqYXJyYXlUeXBlLCB2b2lkICooKmZpbnN0YW50aWF0ZSkoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90KikpCit7CisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisjZW5kaWYKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVudGVyIGlkPSclcycgdHlwZT0lZCBsb2M9JXAgc2l6ZT0lbHUgbGV2ZWw9JXVcbiIsIGlkLCB0LCBwLCAodW5zaWduZWQgbG9uZyluLCBrKSk7CisgIHNvYXAtPmFsbG9jZWQgPSAwOworICBpZiAoIXApCisgIHsgaWYgKGZpbnN0YW50aWF0ZSkKKyAgICAgIHAgPSBmaW5zdGFudGlhdGUoc29hcCwgdCwgdHlwZSwgYXJyYXlUeXBlLCAmbik7CisgICAgZWxzZQorICAgICAgcCA9IHNvYXBfbWFsbG9jKHNvYXAsIG4pOworICAgIGlmIChwKQorICAgICAgc29hcC0+YWxsb2NlZCA9IDE7CisgIH0KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgIGlmICghaWQgfHwgISppZCkKKyNlbmRpZgorICAgIHJldHVybiBwOworI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgaXAgPSBzb2FwX2xvb2t1cChzb2FwLCBpZCk7IC8qIGxvb2t1cCBwb2ludGVyIHRvIGhhc2ggdGFibGUgZW50cnkgZm9yIHN0cmluZyBpZCAqLworICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiTG9va3VwIGVudHJ5IGlkPSclcyBmb3IgbG9jYXRpb249JXAnXG4iLCBpZCwgcCkpOworICBpZiAoIWlwKQorICB7IGlwID0gc29hcF9lbnRlcihzb2FwLCBpZCk7IC8qIG5ldyBoYXNoIHRhYmxlIGVudHJ5IGZvciBzdHJpbmcgaWQgKi8KKyAgICBpcC0+dHlwZSA9IHQ7CisgICAgaXAtPmxpbmsgPSBOVUxMOworICAgIGlwLT5jb3B5ID0gTlVMTDsKKyAgICBpcC0+Zmxpc3QgPSBOVUxMOworICAgIGlwLT5zaXplID0gbjsKKyAgICBpcC0+cHRyID0gcDsKKyAgICBpcC0+bGV2ZWwgPSBrOworICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJOZXcgZW50cnkgaWQ9JyVzJyB0eXBlPSVkIHNpemU9JWx1IGxldmVsPSV1IGxvY2F0aW9uPSVwXG4iLCBpZCwgdCwgKHVuc2lnbmVkIGxvbmcpbiwgaywgcCkpOworICB9CisgIGVsc2UgaWYgKChpcC0+dHlwZSAhPSB0IHx8IChpcC0+bGV2ZWwgPT0gayAmJiBpcC0+c2l6ZSAhPSBuKSkgJiYgKGlwLT5jb3B5IHx8IGlwLT5mbGlzdCkpCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJUeXBlIGluY29tcGF0aWJpbGl0eSBpZD0nJXMnIGV4cGVjdCB0eXBlPSVkIHNpemU9JWx1IGxldmVsPSV1IGdvdCB0eXBlPSVkIHNpemU9JWx1XG4iLCBpZCwgaXAtPnR5cGUsICh1bnNpZ25lZCBsb25nKWlwLT5zaXplLCBrLCB0LCAodW5zaWduZWQgbG9uZyluKSk7CisgICAgc3RyY3B5KHNvYXAtPmlkLCBpZCk7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0hSRUY7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZWxzZSBpZiAoaXAtPnB0cikKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk11bHRpcGx5IGRlZmluZWQgaWQ9JyVzJ1xuIiwgaWQpKTsKKyAgICBzdHJjcHkoc29hcC0+aWQsIGlkKTsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfRFVQTElDQVRFX0lEOworICAgIHJldHVybiBOVUxMOworICB9CisgIGVsc2UgCisgIHsgaXAtPnNpemUgPSBuOworICAgIGlwLT5wdHIgPSBwOworICAgIGlwLT5sZXZlbCA9IGs7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVcGRhdGUgZW50cnkgaWQ9JyVzJyB0eXBlPSVkIGxvY2F0aW9uPSVwIHNpemU9JWx1IGxldmVsPSV1XG4iLCBpZCwgdCwgcCwgKHVuc2lnbmVkIGxvbmcpbiwgaykpOworICB9CisgIHJldHVybiBpcC0+cHRyOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2Zjb3B5KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3QsIGludCB0dCwgdm9pZCAqcCwgc2l6ZV90IGxlbiwgY29uc3Qgdm9pZCAqcSwgc2l6ZV90IG4pCit7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5aW5nIGRhdGEgdHlwZT0lZCAodGFyZ2V0IHR5cGU9JWQpICVwIC0+ICVwICglbHUgYnl0ZXMpXG4iLCBzdCwgdHQsIHEsIHAsICh1bnNpZ25lZCBsb25nKW4pKTsKKyAgbWVtY3B5KHAsIHEsIG4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VuZF9zZW5kKHN0cnVjdCBzb2FwICpzb2FwKQoreyAKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPmRpbWUubGlzdCkKKyAgeyAvKiBTT0FQIGJvZHkgcmVmZXJlbmNlZCBhdHRhY2htZW50cyBtdXN0IGFwcGVhciBmaXJzdCAqLworICAgIHNvYXAtPmRpbWUubGFzdC0+bmV4dCA9IHNvYXAtPmRpbWUuZmlyc3Q7CisgICAgc29hcC0+ZGltZS5maXJzdCA9IHNvYXAtPmRpbWUubGlzdC0+bmV4dDsKKyAgICBzb2FwLT5kaW1lLmxpc3QtPm5leHQgPSBOVUxMOworICAgIHNvYXAtPmRpbWUubGFzdCA9IHNvYXAtPmRpbWUubGlzdDsKKyAgfQorICBpZiAoc29hcF9wdXRkaW1lKHNvYXApIHx8IHNvYXBfcHV0bWltZShzb2FwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHNvYXAtPm1pbWUubGlzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmxhc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmxpc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5sYXN0ID0gTlVMTDsKKyNlbmRpZgorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBzZW5kXG4iKSk7CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JTykgLyogbmVlZCB0byBmbHVzaCB0aGUgcmVtYWluaW5nIGRhdGEgaW4gYnVmZmVyICovCisgIHsgaWYgKHNvYXBfZmx1c2goc29hcCkpCisjaWZkZWYgV0lUSF9aTElCCisgICAgeyBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIgJiYgc29hcC0+emxpYl9zdGF0ZSA9PSBTT0FQX1pMSUJfREVGTEFURSkKKyAgICAgIHsgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9OT05FOworICAgICAgICBkZWZsYXRlRW5kKCZzb2FwLT5kX3N0cmVhbSk7CisgICAgICB9CisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorI2Vsc2UKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNlbmRpZgorI2lmZGVmIFdJVEhfWkxJQgorICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQikKKyAgICB7IGludCByOworICAgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4gPSAwOworICAgICAgZG8KKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJEZWZsYXRpbmcgcmVtYWluZGVyXG4iKSk7CisgICAgICAgIHIgPSBkZWZsYXRlKCZzb2FwLT5kX3N0cmVhbSwgWl9GSU5JU0gpOworICAgICAgICBpZiAoc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0ICE9IFNPQVBfQlVGTEVOKQorICAgICAgICB7IGlmIChzb2FwX2ZsdXNoX3Jhdyhzb2FwLCBzb2FwLT56X2J1ZiwgU09BUF9CVUZMRU4gLSBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQpKQorICAgICAgICAgIHsgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9OT05FOworICAgICAgICAgICAgZGVmbGF0ZUVuZCgmc29hcC0+ZF9zdHJlYW0pOworICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworCSAgfQorICAgICAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gKEJ5dGUqKXNvYXAtPnpfYnVmOworICAgICAgICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCA9IFNPQVBfQlVGTEVOOworICAgICAgICB9CisgICAgICB9IHdoaWxlIChyID09IFpfT0spOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJEZWZsYXRlZCAlbHUtPiVsdSBieXRlc1xuIiwgc29hcC0+ZF9zdHJlYW0udG90YWxfaW4sIHNvYXAtPmRfc3RyZWFtLnRvdGFsX291dCkpOworICAgICAgc29hcC0+el9yYXRpb19vdXQgPSAoZmxvYXQpc29hcC0+ZF9zdHJlYW0udG90YWxfb3V0IC8gKGZsb2F0KXNvYXAtPmRfc3RyZWFtLnRvdGFsX2luOworICAgICAgc29hcC0+bW9kZSAmPSB+U09BUF9FTkNfWkxJQjsKKyAgICAgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfTk9ORTsKKyAgICAgIGlmIChkZWZsYXRlRW5kKCZzb2FwLT5kX3N0cmVhbSkgIT0gWl9PSyB8fCByICE9IFpfU1RSRUFNX0VORCkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVbmFibGUgdG8gZW5kIGRlZmxhdGU6ICVzXG4iLCBzb2FwLT5kX3N0cmVhbS5tc2c/c29hcC0+ZF9zdHJlYW0ubXNnOiIiKSk7CisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICAgIH0KKyNpZmRlZiBXSVRIX0daSVAKKyAgICAgIHNvYXAtPnpfYnVmWzBdID0gc29hcC0+el9jcmMgJiAweEZGOworICAgICAgc29hcC0+el9idWZbMV0gPSAoc29hcC0+el9jcmMgPj4gOCkgJiAweEZGOworICAgICAgc29hcC0+el9idWZbMl0gPSAoc29hcC0+el9jcmMgPj4gMTYpICYgMHhGRjsKKyAgICAgIHNvYXAtPnpfYnVmWzNdID0gKHNvYXAtPnpfY3JjID4+IDI0KSAmIDB4RkY7CisgICAgICBzb2FwLT56X2J1Zls0XSA9IHNvYXAtPmRfc3RyZWFtLnRvdGFsX2luICYgMHhGRjsKKyAgICAgIHNvYXAtPnpfYnVmWzVdID0gKHNvYXAtPmRfc3RyZWFtLnRvdGFsX2luID4+IDgpICYgMHhGRjsKKyAgICAgIHNvYXAtPnpfYnVmWzZdID0gKHNvYXAtPmRfc3RyZWFtLnRvdGFsX2luID4+IDE2KSAmIDB4RkY7CisgICAgICBzb2FwLT56X2J1Zls3XSA9IChzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiA+PiAyNCkgJiAweEZGOworICAgICAgaWYgKHNvYXBfZmx1c2hfcmF3KHNvYXAsIHNvYXAtPnpfYnVmLCA4KSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJnemlwIGNyYzMyPSVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpc29hcC0+el9jcmMpKTsKKyNlbmRpZgorICAgIH0KKyNlbmRpZgorICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fU1RPUkUpCisgICAgeyBjaGFyICpwOworI2lmbmRlZiBXSVRIX05PSFRUUAorICAgICAgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1hNTCkpCisgICAgICB7IHNvYXAtPm1vZGUtLTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTZW5kaW5nIGJ1ZmZlcmVkIG1lc3NhZ2Ugb2YgbGVuZ3RoICV1XG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmJsaXN0LT5zaXplKSk7CisgICAgICAgIGlmIChzb2FwLT5zdGF0dXMgPj0gU09BUF9QT1NUKQorICAgICAgICAgIHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3Qoc29hcCwgc29hcC0+ZW5kcG9pbnQsIHNvYXAtPmhvc3QsIHNvYXAtPnBvcnQsIHNvYXAtPnBhdGgsIHNvYXAtPmFjdGlvbiwgc29hcC0+Ymxpc3QtPnNpemUpOworICAgICAgICBlbHNlIGlmIChzb2FwLT5zdGF0dXMgIT0gU09BUF9TVE9QKQorICAgICAgICAgIHNvYXAtPmVycm9yID0gc29hcC0+ZnJlc3BvbnNlKHNvYXAsIHNvYXAtPnN0YXR1cywgc29hcC0+Ymxpc3QtPnNpemUpOworICAgICAgICBpZiAoc29hcC0+ZXJyb3IgfHwgc29hcF9mbHVzaChzb2FwKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHNvYXAtPm1vZGUrKzsKKyAgICAgIH0KKyNlbmRpZgorICAgICAgZm9yIChwID0gc29hcF9maXJzdF9ibG9jayhzb2FwKTsgcDsgcCA9IHNvYXBfbmV4dF9ibG9jayhzb2FwKSkKKyAgICAgIHsgREJHTVNHKFNFTlQsIHAsIHNvYXBfYmxvY2tfc2l6ZShzb2FwKSk7CisgICAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mc2VuZChzb2FwLCBwLCBzb2FwX2Jsb2NrX3NpemUoc29hcCkpKSkKKyAgICAgICAgeyBzb2FwX2VuZF9ibG9jayhzb2FwKTsKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHNvYXBfZW5kX2Jsb2NrKHNvYXApOworICAgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgICBlbHNlIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgICAgeyBEQkdNU0coU0VOVCwgIlxyXG4wXHJcblxyXG4iLCA3KTsKKyAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mc2VuZChzb2FwLCAiXHJcbjBcclxuXHJcbiIsIDcpKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyNlbmRpZgorICB9CisjaWZkZWYgV0lUSF9UQ1BGSU4KKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgaWYgKCFzb2FwLT5zc2wgJiYgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSAmJiAhc29hcC0+a2VlcF9hbGl2ZSAmJiAhKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIHNvYXAtPmZzaHV0ZG93bnNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAxKTsgLyogU2VuZCBUQ1AgRklOICovCisjZWxzZQorICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSAmJiAhc29hcC0+a2VlcF9hbGl2ZSAmJiAhKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIHNvYXAtPmZzaHV0ZG93bnNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAxKTsgLyogU2VuZCBUQ1AgRklOICovCisjZW5kaWYKKyNlbmRpZgorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBvZiBzZW5kIHBoYXNlXG4iKSk7CisgIHNvYXAtPm9tb2RlICY9IH5TT0FQX1hNTF9TRUM7CisgIHNvYXAtPmNvdW50ID0gMDsKKyAgc29hcC0+cGFydCA9IFNPQVBfRU5EOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbmRfcmVjdihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+cGFydCA9IFNPQVBfRU5EOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSAmJiBzb2FwX2dldGRpbWUoc29hcCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBzb2FwLT5kaW1lLmxpc3QgPSBzb2FwLT5kaW1lLmZpcnN0OworICBzb2FwLT5kaW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5sYXN0ID0gTlVMTDsKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkgJiYgc29hcF9nZXRtaW1lKHNvYXApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgc29hcC0+bWltZS5saXN0ID0gc29hcC0+bWltZS5maXJzdDsKKyAgc29hcC0+bWltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuYm91bmRhcnkgPSBOVUxMOworI2VuZGlmCisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgb2YgcmVjZWl2ZSBtZXNzYWdlIG9rXG4iKSk7CisjaWZkZWYgV0lUSF9aTElCCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQikKKyAgeyBzb2FwLT5tb2RlICY9IH5TT0FQX0VOQ19aTElCOworICAgIG1lbWNweShzb2FwLT5idWYsIHNvYXAtPnpfYnVmLCBTT0FQX0JVRkxFTik7CisgICAgc29hcC0+YnVmaWR4ID0gKGNoYXIqKXNvYXAtPmRfc3RyZWFtLm5leHRfaW4gLSBzb2FwLT56X2J1ZjsKKyAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT56X2J1ZmxlbjsKKyAgICBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX05PTkU7CisgICAgaWYgKGluZmxhdGVFbmQoJnNvYXAtPmRfc3RyZWFtKSAhPSBaX09LKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworI2lmZGVmIFdJVEhfR1pJUAorICAgIGlmIChzb2FwLT56bGliX2luID09IFNPQVBfWkxJQl9HWklQKQorICAgIHsgc29hcF93Y2hhciBjOworICAgICAgc2hvcnQgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICB7IGlmICgoaW50KShjID0gc29hcF9nZXRjaGFyKHNvYXApKSA9PSBFT0YpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgICAgIHNvYXAtPnpfYnVmW2ldID0gKGNoYXIpYzsKKyAgICAgIH0KKyAgICAgIGlmIChzb2FwLT56X2NyYyAhPSAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzBdIHwgKCh1TG9uZykodW5zaWduZWQgY2hhcilzb2FwLT56X2J1ZlsxXSA8PCA4KSB8ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbMl0gPDwgMTYpIHwgKCh1TG9uZykodW5zaWduZWQgY2hhcilzb2FwLT56X2J1ZlszXSA8PCAyNCkpKQorICAgICAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiR3ppcCBlcnJvcjogY3JjIGNoZWNrIGZhaWxlZCwgbWVzc2FnZSBjb3JydXB0ZWQ/IChjcmMzMj0lbHUpXG4iLCAodW5zaWduZWQgbG9uZylzb2FwLT56X2NyYykpOworICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgICB9CisgICAgICBpZiAoc29hcC0+ZF9zdHJlYW0udG90YWxfb3V0ICE9ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbNF0gfCAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzVdIDw8IDgpIHwgKCh1TG9uZykodW5zaWduZWQgY2hhcilzb2FwLT56X2J1Zls2XSA8PCAxNikgfCAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzddIDw8IDI0KSkpCisgICAgICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJHemlwIGVycm9yOiBpbmNvcnJlY3QgbWVzc2FnZSBsZW5ndGhcbiIpKTsKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgfQorICAgIH0KKyNlbmRpZgorICB9CisjZW5kaWYKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgICB3aGlsZSAoKGludClzb2FwX2dldGNoYXIoc29hcCkgIT0gRU9GKSAvKiBhZHZhbmNlIHRvIGxhc3QgY2h1bmsgKi8KKyAgICAgIDsKKyAgaWYgKHNvYXAtPmZkaXNjb25uZWN0ICYmIChzb2FwLT5lcnJvciA9IHNvYXAtPmZkaXNjb25uZWN0KHNvYXApKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICByZXR1cm4gc29hcF9yZXNvbHZlKHNvYXApOworI2Vsc2UKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPnhsaXN0KQorICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTUlNRV9IUkVGOworICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRElNRV9IUkVGOworICB9CisjZW5kaWYKKyAgcmV0dXJuIFNPQVBfT0s7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZnJlZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc3RydWN0IE5hbWVzcGFjZSAqbnM7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZSBuYW1lc3BhY2Ugc3RhY2tcbiIpKTsKKyAgd2hpbGUgKHNvYXAtPm5saXN0KQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucCA9IHNvYXAtPm5saXN0LT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5ubGlzdCk7CisgICAgc29hcC0+bmxpc3QgPSBucDsKKyAgfQorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWUgYW55IHJlbWFpbmluZyB0ZW1wIGJsb2Nrc1xuIikpOworICB3aGlsZSAoc29hcC0+Ymxpc3QpCisgICAgc29hcF9lbmRfYmxvY2soc29hcCk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZSBhdHRyaWJ1dGUgc3RvcmFnZVxuIikpOworICB3aGlsZSAoc29hcC0+YXR0cmlidXRlcykKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKnRwID0gc29hcC0+YXR0cmlidXRlcy0+bmV4dDsKKyAgICBpZiAoc29hcC0+YXR0cmlidXRlcy0+dmFsdWUpCisgICAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+YXR0cmlidXRlcy0+dmFsdWUpOworICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5hdHRyaWJ1dGVzKTsKKyAgICBzb2FwLT5hdHRyaWJ1dGVzID0gdHA7CisgIH0KKyNpZmRlZiBXSVRIX0ZBU1QKKyAgaWYgKHNvYXAtPmxhYmJ1ZikKKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+bGFiYnVmKTsKKyAgc29hcC0+bGFiYnVmID0gTlVMTDsKKyAgc29hcC0+bGFibGVuID0gMDsKKyAgc29hcC0+bGFiaWR4ID0gMDsKKyNlbmRpZgorICBucyA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXM7CisgIGlmIChucykKKyAgeyBmb3IgKDsgbnMtPmlkOyBucysrKQorICAgIHsgaWYgKG5zLT5vdXQpCisgICAgICB7IGlmIChzb2FwLT5lbmNvZGluZ1N0eWxlID09IG5zLT5vdXQpCisgICAgICAgICAgc29hcC0+ZW5jb2RpbmdTdHlsZSA9IFNPQVBfU1RSX0VPUzsKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIG5zLT5vdXQpOworICAgICAgICBucy0+b3V0ID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGlmIChzb2FwLT5lbmNvZGluZ1N0eWxlID09IG5zLT5ucykKKyAgICAgICAgc29hcC0+ZW5jb2RpbmdTdHlsZSA9IFNPQVBfU1RSX0VPUzsKKyAgICB9CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPmxvY2FsX25hbWVzcGFjZXMpOworICAgIHNvYXAtPmxvY2FsX25hbWVzcGFjZXMgPSBOVUxMOworICB9CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHdoaWxlIChzb2FwLT54bGlzdCkKKyAgeyBzdHJ1Y3Qgc29hcF94bGlzdCAqeHAgPSBzb2FwLT54bGlzdC0+bmV4dDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+eGxpc3QpOworICAgIHNvYXAtPnhsaXN0ID0geHA7CisgIH0KKyNlbmRpZgorI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgc29hcF9mcmVlX3BodChzb2FwKTsKKyAgc29hcF9mcmVlX2lodChzb2FwKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworc3RhdGljIHZvaWQKK3NvYXBfaW5pdF9sb2dzKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfTUFYTE9HUzsgaSsrKQorICB7IHNvYXAtPmxvZ2ZpbGVbaV0gPSBOVUxMOworICAgIHNvYXAtPmZkZWJ1Z1tpXSA9IE5VTEw7CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmICFkZWZpbmVkKFdJVEhfTEVBTikgfHwgZGVmaW5lZChTT0FQX0RFQlVHKQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9vcGVuX2xvZ2ZpbGUoc3RydWN0IHNvYXAgKnNvYXAsIGludCBpKQoreyBpZiAoc29hcC0+bG9nZmlsZVtpXSkKKyAgICBzb2FwLT5mZGVidWdbaV0gPSBmb3Blbihzb2FwLT5sb2dmaWxlW2ldLCBpIDwgMiA/ICJhYiIgOiAiYSIpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworc3RhdGljIHZvaWQKK3NvYXBfY2xvc2VfbG9nZmlsZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGkpCit7IGlmIChzb2FwLT5mZGVidWdbaV0pCisgIHsgZmNsb3NlKHNvYXAtPmZkZWJ1Z1tpXSk7CisgICAgc29hcC0+ZmRlYnVnW2ldID0gTlVMTDsKKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9jbG9zZV9sb2dmaWxlcyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX01BWExPR1M7IGkrKykKKyAgICBzb2FwX2Nsb3NlX2xvZ2ZpbGUoc29hcCwgaSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitzdGF0aWMgdm9pZAorc29hcF9zZXRfbG9nZmlsZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGksIGNvbnN0IGNoYXIgKmxvZ2ZpbGUpCit7IGNoYXIgKnMgPSBOVUxMOworICBzb2FwX2Nsb3NlX2xvZ2ZpbGUoc29hcCwgaSk7CisgIGlmIChzb2FwLT5sb2dmaWxlW2ldKQorICAgIFNPQVBfRlJFRShzb2FwLCAodm9pZCopc29hcC0+bG9nZmlsZVtpXSk7CisgIGlmIChsb2dmaWxlKQorICAgIGlmICgocyA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4obG9nZmlsZSkgKyAxKSkpCisgICAgICBzdHJjcHkocywgbG9nZmlsZSk7CisgIHNvYXAtPmxvZ2ZpbGVbaV0gPSBzOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfcmVjdl9sb2dmaWxlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpsb2dmaWxlKQoreyBzb2FwX3NldF9sb2dmaWxlKHNvYXAsIFNPQVBfSU5ERVhfUkVDViwgbG9nZmlsZSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9zZW50X2xvZ2ZpbGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmxvZ2ZpbGUpCit7IHNvYXBfc2V0X2xvZ2ZpbGUoc29hcCwgU09BUF9JTkRFWF9TRU5ULCBsb2dmaWxlKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X3Rlc3RfbG9nZmlsZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbG9nZmlsZSkKK3sgc29hcF9zZXRfbG9nZmlsZShzb2FwLCBTT0FQX0lOREVYX1RFU1QsIGxvZ2ZpbGUpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc3RydWN0IHNvYXAqCitTT0FQX0ZNQUMyCitzb2FwX2NvcHkoc3RydWN0IHNvYXAgKnNvYXApCit7IHJldHVybiBzb2FwX2NvcHlfY29udGV4dCgoc3RydWN0IHNvYXAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHNvYXApKSwgc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcCoKK1NPQVBfRk1BQzIKK3NvYXBfY29weV9jb250ZXh0KHN0cnVjdCBzb2FwICpjb3B5LCBzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXBfY2hlY2tfc3RhdGUoc29hcCkpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmIChjb3B5KQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BsdWdpbiAqcDsKKyAgICBtZW1jcHkoY29weSwgc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwKSk7CisgICAgY29weS0+c3RhdGUgPSBTT0FQX0NPUFk7CisgICAgY29weS0+dXNlciA9IE5VTEw7CisgICAgY29weS0+ZXJyb3IgPSBTT0FQX09LOworICAgIGNvcHktPnVzZXJpZCA9IE5VTEw7CisgICAgY29weS0+cGFzc3dkID0gTlVMTDsKKyAgICBjb3B5LT5ubGlzdCA9IE5VTEw7CisgICAgY29weS0+Ymxpc3QgPSBOVUxMOworICAgIGNvcHktPmNsaXN0ID0gTlVMTDsKKyAgICBjb3B5LT5hbGlzdCA9IE5VTEw7CisgICAgY29weS0+YXR0cmlidXRlcyA9IE5VTEw7CisjaWZkZWYgV0lUSF9GQVNUCisgICAgY29weS0+bGFiYnVmID0gTlVMTDsKKyAgICBjb3B5LT5sYWJsZW4gPSAwOworICAgIGNvcHktPmxhYmlkeCA9IDA7CisjZW5kaWYKKyNpZmRlZiBTT0FQX0RFQlVHCisgICAgc29hcF9pbml0X21odChjb3B5KTsKKyNlbmRpZgorICAgIGNvcHktPmxvY2FsX25hbWVzcGFjZXMgPSBOVUxMOworI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgICBzb2FwX2luaXRfaWh0KGNvcHkpOworICAgIHNvYXBfaW5pdF9waHQoY29weSk7CisjZW5kaWYKKyAgICBjb3B5LT5oZWFkZXIgPSBOVUxMOworICAgIGNvcHktPmZhdWx0ID0gTlVMTDsKKyAgICBjb3B5LT5hY3Rpb24gPSBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyNpZmRlZiBXSVRIX0NPT0tJRVMKKyAgICBjb3B5LT5jb29raWVzID0gc29hcF9jb3B5X2Nvb2tpZXMoY29weSk7CisjZWxzZQorICAgIGNvcHktPmNvb2tpZXMgPSBOVUxMOworI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBTT0FQX0RFQlVHCisgICAgc29hcF9pbml0X2xvZ3MoY29weSk7CisgICAgc29hcF9zZXRfcmVjdl9sb2dmaWxlKGNvcHksIHNvYXAtPmxvZ2ZpbGVbU09BUF9JTkRFWF9SRUNWXSk7CisgICAgc29hcF9zZXRfc2VudF9sb2dmaWxlKGNvcHksIHNvYXAtPmxvZ2ZpbGVbU09BUF9JTkRFWF9TRU5UXSk7CisgICAgc29hcF9zZXRfdGVzdF9sb2dmaWxlKGNvcHksIHNvYXAtPmxvZ2ZpbGVbU09BUF9JTkRFWF9URVNUXSk7CisjZW5kaWYKKyAgICBjb3B5LT5wbHVnaW5zID0gTlVMTDsKKyAgICBmb3IgKHAgPSBzb2FwLT5wbHVnaW5zOyBwOyBwID0gcC0+bmV4dCkKKyAgICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BsdWdpbiAqcSA9IChzdHJ1Y3Qgc29hcF9wbHVnaW4qKVNPQVBfTUFMTE9DKGNvcHksIHNpemVvZihzdHJ1Y3Qgc29hcF9wbHVnaW4pKTsKKyAgICAgIGlmICghcSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHlpbmcgcGx1Z2luICclcydcbiIsIHAtPmlkKSk7CisgICAgICAqcSA9ICpwOworICAgICAgaWYgKHAtPmZjb3B5ICYmIChzb2FwLT5lcnJvciA9IHAtPmZjb3B5KGNvcHksIHEsIHApKSkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgY29weSBwbHVnaW4gJyVzJ1xuIiwgcC0+aWQpKTsKKyAgICAgICAgU09BUF9GUkVFKGNvcHksIHEpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIHEtPm5leHQgPSBjb3B5LT5wbHVnaW5zOworICAgICAgY29weS0+cGx1Z2lucyA9IHE7CisgICAgfQorICB9CisgIGVsc2UKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICByZXR1cm4gY29weTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfaW5pdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+c3RhdGUgPSBTT0FQX0lOSVQ7CisgIHNvYXAtPnZlcnNpb24gPSAwOworICBzb2FwX2ltb2RlKHNvYXAsIFNPQVBfSU9fREVGQVVMVCk7CisgIHNvYXBfb21vZGUoc29hcCwgU09BUF9JT19ERUZBVUxUKTsKKyAgc29hcC0+cGx1Z2lucyA9IE5VTEw7CisgIHNvYXAtPnVzZXIgPSBOVUxMOworICBzb2FwLT51c2VyaWQgPSBOVUxMOworICBzb2FwLT5wYXNzd2QgPSBOVUxMOworI2lmbmRlZiBXSVRIX05PSFRUUAorICBzb2FwLT5mcG9zdCA9IGh0dHBfcG9zdDsKKyAgc29hcC0+ZmdldCA9IGh0dHBfZ2V0OworICBzb2FwLT5mZm9ybSA9IE5VTEw7CisgIHNvYXAtPmZwb3N0aGRyID0gaHR0cF9wb3N0X2hlYWRlcjsKKyAgc29hcC0+ZnJlc3BvbnNlID0gaHR0cF9yZXNwb25zZTsKKyAgc29hcC0+ZnBhcnNlID0gaHR0cF9wYXJzZTsKKyAgc29hcC0+ZnBhcnNlaGRyID0gaHR0cF9wYXJzZV9oZWFkZXI7CisjZW5kaWYKKyAgc29hcC0+ZmNvbm5lY3QgPSBOVUxMOworICBzb2FwLT5mZGlzY29ubmVjdCA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0lQVjYKKyAgc29hcC0+ZnJlc29sdmUgPSB0Y3BfZ2V0aG9zdDsKKyNlbHNlCisgIHNvYXAtPmZyZXNvbHZlID0gTlVMTDsKKyNlbmRpZgorICBzb2FwLT5mYWNjZXB0ID0gdGNwX2FjY2VwdDsKKyAgc29hcC0+Zm9wZW4gPSB0Y3BfY29ubmVjdDsKKyAgc29hcC0+ZmNsb3NlID0gdGNwX2Rpc2Nvbm5lY3Q7CisgIHNvYXAtPmZjbG9zZXNvY2tldCA9IHRjcF9jbG9zZXNvY2tldDsKKyAgc29hcC0+ZnNodXRkb3duc29ja2V0ID0gdGNwX3NodXRkb3duc29ja2V0OworICBzb2FwLT5mc2VuZCA9IGZzZW5kOworICBzb2FwLT5mcmVjdiA9IGZyZWN2OworICBzb2FwLT5mcG9sbCA9IHNvYXBfcG9sbDsKKyNlbHNlCisgIHNvYXAtPmZvcGVuID0gTlVMTDsKKyAgc29hcC0+ZmNsb3NlID0gTlVMTDsKKyAgc29hcC0+ZnBvbGwgPSBOVUxMOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXAtPmZwcmVwYXJlaW5pdCA9IE5VTEw7CisgIHNvYXAtPmZwcmVwYXJlc2VuZCA9IE5VTEw7CisgIHNvYXAtPmZwcmVwYXJlcmVjdiA9IE5VTEw7CisgIHNvYXAtPmZwcmVwYXJlZmluYWwgPSBOVUxMOworI2VuZGlmCisgIHNvYXAtPmZzZXRlcnJvciA9IE5VTEw7CisgIHNvYXAtPmZpZ25vcmUgPSBOVUxMOworICBzb2FwLT5mc2VydmVsb29wID0gTlVMTDsKKyAgc29hcC0+ZnBsdWdpbiA9IGZwbHVnaW47CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXAtPmZkaW1lcmVhZG9wZW4gPSBOVUxMOworICBzb2FwLT5mZGltZXdyaXRlb3BlbiA9IE5VTEw7CisgIHNvYXAtPmZkaW1lcmVhZGNsb3NlID0gTlVMTDsKKyAgc29hcC0+ZmRpbWV3cml0ZWNsb3NlID0gTlVMTDsKKyAgc29hcC0+ZmRpbWVyZWFkID0gTlVMTDsKKyAgc29hcC0+ZmRpbWV3cml0ZSA9IE5VTEw7CisjZW5kaWYKKyAgc29hcC0+ZmxvYXRfZm9ybWF0ID0gIiUuOGciOyAvKiAuOCBwcmVzZXJ2ZXMgc2luZ2xlIEZQIHByZWNpc2lvbiBhcyBtdWNoIGFzIHBvc3NpYmxlLCBidXQgbWlnaHQgbm90IGJlIHZlcnkgZWZmaWNpZW50ICovCisgIHNvYXAtPmRvdWJsZV9mb3JtYXQgPSAiJS4xN2xnIjsgLyogLjE3IHByZXNlcnZlcyBkb3VibGUgRlAgcHJlY2lzaW9uIGFzIG11Y2ggYXMgcG9zc2libGUsIGJ1dCBtaWdodCBub3QgYmUgdmVyeSBlZmZpY2llbnQgKi8KKyAgc29hcC0+ZGltZV9pZF9mb3JtYXQgPSAiY2lkOmlkJWQiOyAvKiBkZWZhdWx0IERJTUUgaWQgZm9ybWF0ICovCisgIHNvYXAtPmh0dHBfdmVyc2lvbiA9ICIxLjEiOworICBzb2FwLT5hY3RvciA9IE5VTEw7CisgIHNvYXAtPm1heF9rZWVwX2FsaXZlID0gU09BUF9NQVhLRUVQQUxJVkU7CisgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOworICBzb2FwLT5yZWN2X3RpbWVvdXQgPSAwOworICBzb2FwLT5zZW5kX3RpbWVvdXQgPSAwOworICBzb2FwLT5jb25uZWN0X3RpbWVvdXQgPSAwOworICBzb2FwLT5hY2NlcHRfdGltZW91dCA9IDA7CisgIHNvYXAtPnNvY2tldF9mbGFncyA9IDA7CisgIHNvYXAtPmNvbm5lY3RfZmxhZ3MgPSAwOworICBzb2FwLT5iaW5kX2ZsYWdzID0gMDsKKyAgc29hcC0+YWNjZXB0X2ZsYWdzID0gMDsKKyAgc29hcC0+aXAgPSAwOworI2lmZGVmIFdJVEhfRkFTVAorICBzb2FwLT5sYWJidWYgPSBOVUxMOworICBzb2FwLT5sYWJsZW4gPSAwOworICBzb2FwLT5sYWJpZHggPSAwOworI2VuZGlmCisgIHNvYXAtPmVuY29kaW5nU3R5bGUgPSBTT0FQX1NUUl9FT1M7CisjaWZuZGVmIFdJVEhfTk9OQU1FU1BBQ0VTCisgIHNvYXAtPm5hbWVzcGFjZXMgPSBuYW1lc3BhY2VzOworI2Vsc2UKKyAgc29hcC0+bmFtZXNwYWNlcyA9IE5VTEw7CisjZW5kaWYKKyAgc29hcC0+bG9jYWxfbmFtZXNwYWNlcyA9IE5VTEw7CisgIHNvYXAtPm5saXN0ID0gTlVMTDsKKyAgc29hcC0+Ymxpc3QgPSBOVUxMOworICBzb2FwLT5jbGlzdCA9IE5VTEw7CisgIHNvYXAtPmFsaXN0ID0gTlVMTDsKKyAgc29hcC0+YXR0cmlidXRlcyA9IE5VTEw7CisgIHNvYXAtPmhlYWRlciA9IE5VTEw7CisgIHNvYXAtPmZhdWx0ID0gTlVMTDsKKyAgc29hcC0+bWFzdGVyID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgc29hcC0+c29ja2V0ID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgc29hcC0+b3MgPSBOVUxMOworICBzb2FwLT5pcyA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXAtPmRvbSA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGlzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmxhc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmxpc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5sYXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5ib3VuZGFyeSA9IE5VTEw7CisgIHNvYXAtPm1pbWUuc3RhcnQgPSBOVUxMOworICBzb2FwLT54bGlzdCA9IE5VTEw7CisjZW5kaWYKKyNpZm5kZWYgVU5ERVJfQ0UKKyAgc29hcC0+cmVjdmZkID0gMDsKKyAgc29hcC0+c2VuZGZkID0gMTsKKyNlbHNlCisgIHNvYXAtPnJlY3ZmZCA9IHN0ZGluOworICBzb2FwLT5zZW5kZmQgPSBzdGRvdXQ7CisjZW5kaWYgCisgIHNvYXAtPmhvc3RbMF0gPSAnXDAnOworICBzb2FwLT5wb3J0ID0gMDsKKyAgc29hcC0+YWN0aW9uID0gTlVMTDsKKyAgc29hcC0+cHJveHlfaG9zdCA9IE5VTEw7CisgIHNvYXAtPnByb3h5X3BvcnQgPSA4MDgwOworICBzb2FwLT5wcm94eV91c2VyaWQgPSBOVUxMOworICBzb2FwLT5wcm94eV9wYXNzd2QgPSBOVUxMOworICBzb2FwLT5hdXRocmVhbG0gPSBOVUxMOworICBzb2FwLT5wcm9sb2cgPSBOVUxMOworI2lmZGVmIFdJVEhfT1BFTlNTTAorICBpZiAoIXNzbF9pbml0X2RvbmUpCisgICAgc29hcF9zc2xfaW5pdCgpOworICBzb2FwLT5mc3NsYXV0aCA9IHNzbF9hdXRoX2luaXQ7CisgIHNvYXAtPmZzc2x2ZXJpZnkgPSBzc2xfdmVyaWZ5X2NhbGxiYWNrOworICBzb2FwLT5iaW8gPSBOVUxMOworICBzb2FwLT5zc2wgPSBOVUxMOworICBzb2FwLT5jdHggPSBOVUxMOworICBzb2FwLT5yZXF1aXJlX3NlcnZlcl9hdXRoID0gMDsKKyAgc29hcC0+cmVxdWlyZV9jbGllbnRfYXV0aCA9IDA7CisgIHNvYXAtPnJzYSA9IDA7CisgIHNvYXAtPmtleWZpbGUgPSBOVUxMOworICBzb2FwLT5wYXNzd29yZCA9IE5VTEw7CisgIHNvYXAtPmRoZmlsZSA9IE5VTEw7CisgIHNvYXAtPmNhZmlsZSA9IE5VTEw7CisgIHNvYXAtPmNhcGF0aCA9IE5VTEw7CisgIHNvYXAtPmNybGZpbGUgPSBOVUxMOworICBzb2FwLT5yYW5kZmlsZSA9IE5VTEw7CisgIHNvYXAtPnNlc3Npb24gPSBOVUxMOworI2VuZGlmCisjaWZkZWYgV0lUSF9aTElCCisgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfTk9ORTsKKyAgc29hcC0+emxpYl9pbiA9IFNPQVBfWkxJQl9OT05FOworICBzb2FwLT56bGliX291dCA9IFNPQVBfWkxJQl9OT05FOworICBzb2FwLT5kX3N0cmVhbS56YWxsb2MgPSBOVUxMOworICBzb2FwLT5kX3N0cmVhbS56ZnJlZSA9IE5VTEw7CisgIHNvYXAtPmRfc3RyZWFtLm9wYXF1ZSA9IE5VTEw7CisgIHNvYXAtPnpfbGV2ZWwgPSA2OworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBzb2FwLT5jMTRuaW5jbHVkZSA9IE5VTEw7CisgIHNvYXAtPmMxNG5leGNsdWRlID0gTlVMTDsKKyAgc29hcC0+Y29va2llcyA9IE5VTEw7CisgIHNvYXAtPmNvb2tpZV9kb21haW4gPSBOVUxMOworICBzb2FwLT5jb29raWVfcGF0aCA9IE5VTEw7CisgIHNvYXAtPmNvb2tpZV9tYXggPSAzMjsKKyNlbmRpZgorI2lmZGVmIFNPQVBfREVCVUcKKyAgc29hcF9pbml0X21odChzb2FwKTsKKyAgc29hcF9pbml0X2xvZ3Moc29hcCk7CisgIHNvYXBfc2V0X3JlY3ZfbG9nZmlsZShzb2FwLCAiUkVDVi5sb2ciKTsKKyAgc29hcF9zZXRfc2VudF9sb2dmaWxlKHNvYXAsICJTRU5ULmxvZyIpOworICBzb2FwX3NldF90ZXN0X2xvZ2ZpbGUoc29hcCwgTlVMTCk7CisjZW5kaWYKKyNpZmRlZiBXTVdfUlBNX0lPCisgIHNvYXAtPnJwbXJlcWlkID0gTlVMTDsKKyNlbmRpZgorI2lmZGVmIFBBTE0KKyAgcGFsbU5ldExpYk9wZW4oKTsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgc29hcF9pbml0X2lodChzb2FwKTsKKyAgc29hcF9pbml0X3BodChzb2FwKTsKKyNlbmRpZgorICBzb2FwX2JlZ2luKHNvYXApOworI2lmZGVmIFNPQVBfREVCVUcKKyAgc29hcF9zZXRfdGVzdF9sb2dmaWxlKHNvYXAsICJURVNULmxvZyIpOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2luaXQxKHN0cnVjdCBzb2FwICpzb2FwLCBzb2FwX21vZGUgbW9kZSkKK3sgc29hcF9pbml0Mihzb2FwLCBtb2RlLCBtb2RlKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfaW5pdDIoc3RydWN0IHNvYXAgKnNvYXAsIHNvYXBfbW9kZSBpbW9kZSwgc29hcF9tb2RlIG9tb2RlKQoreyBzb2FwX2luaXQoc29hcCk7CisgIHNvYXBfaW1vZGUoc29hcCwgaW1vZGUpOworICBzb2FwX29tb2RlKHNvYXAsIG9tb2RlKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfYmVnaW4oc3RydWN0IHNvYXAgKnNvYXApCit7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5pdGlhbGl6aW5nXG4iKSk7CisgIGlmICghc29hcC0+a2VlcF9hbGl2ZSkKKyAgeyBzb2FwLT5idWZsZW4gPSAwOworICAgIHNvYXAtPmJ1ZmlkeCA9IDA7CisgIH0KKyAgc29hcC0+a2VlcF9hbGl2ZSA9ICgoKHNvYXAtPmltb2RlIHwgc29hcC0+b21vZGUpICYgU09BUF9JT19LRUVQQUxJVkUpICE9IDApOworICBzb2FwLT5udWxsID0gMDsKKyAgc29hcC0+cG9zaXRpb24gPSAwOworICBzb2FwLT5lbmNvZGluZyA9IDA7CisgIHNvYXAtPm11c3RVbmRlcnN0YW5kID0gMDsKKyAgc29hcC0+bW9kZSA9IDA7CisgIHNvYXAtPm5zID0gMDsKKyAgc29hcC0+cGFydCA9IFNPQVBfRU5EOworICBzb2FwLT5hbGxvY2VkID0gMDsKKyAgc29hcC0+Y291bnQgPSAwOworICBzb2FwLT5sZW5ndGggPSAwOworICBzb2FwLT5jZGF0YSA9IDA7CisgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgc29hcC0+cGVla2VkID0gMDsKKyAgc29hcC0+YWhlYWQgPSAwOworICBzb2FwLT5pZG51bSA9IDA7CisgIHNvYXAtPmxldmVsID0gMDsKKyAgc29hcC0+ZW5kcG9pbnRbMF0gPSAnXDAnOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzb2FwLT5kaW1lLmNodW5rc2l6ZSA9IDA7CisgIHNvYXAtPmRpbWUuYnVmbGVuID0gMDsKKyNlbmRpZgorICBzb2FwX2ZyZWUoc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2VuZChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfY2xpc3QgKmNwOworICBpZiAoc29hcF9jaGVja19zdGF0ZShzb2FwKSkKKyAgICByZXR1cm47CisgIHNvYXBfZnJlZShzb2FwKTsKKyAgc29hcF9kZWFsbG9jKHNvYXAsIE5VTEwpOworICB3aGlsZSAoc29hcC0+Y2xpc3QpCisgIHsgY3AgPSBzb2FwLT5jbGlzdC0+bmV4dDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+Y2xpc3QpOworICAgIHNvYXAtPmNsaXN0ID0gY3A7CisgIH0KKyAgc29hcF9jbG9zZXNvY2soc29hcCk7CisjaWZkZWYgU09BUF9ERUJVRworICBzb2FwX2Nsb3NlX2xvZ2ZpbGVzKHNvYXApOworI2VuZGlmCisjaWZkZWYgUEFMTQorICBwYWxtTmV0TGliQ2xvc2UoKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NldF9uYW1lc3BhY2VzKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgTmFtZXNwYWNlICpwKQoreyByZWdpc3RlciBzdHJ1Y3QgTmFtZXNwYWNlICpucyA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXM7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucCwgKm5xLCAqbnI7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBsZXZlbCA9IHNvYXAtPmxldmVsOworICBzb2FwLT5uYW1lc3BhY2VzID0gcDsKKyAgc29hcC0+bG9jYWxfbmFtZXNwYWNlcyA9IE5VTEw7CisgIHNvYXBfc2V0X2xvY2FsX25hbWVzcGFjZXMoc29hcCk7CisgIC8qIHJldmVyc2UgdGhlIG5hbWVzcGFjZSBsaXN0ICovCisgIG5wID0gc29hcC0+bmxpc3Q7CisgIHNvYXAtPm5saXN0ID0gTlVMTDsKKyAgaWYgKG5wKQorICB7IG5xID0gbnAtPm5leHQ7CisgICAgbnAtPm5leHQgPSBOVUxMOworICAgIHdoaWxlIChucSkKKyAgICB7IG5yID0gbnEtPm5leHQ7CisgICAgICBucS0+bmV4dCA9IG5wOworICAgICAgbnAgPSBucTsKKyAgICAgIG5xID0gbnI7CisgICAgfQorICB9CisgIC8qIHRoZW4gcHVzaCBvbiBuZXcgc3RhY2sgKi8KKyAgd2hpbGUgKG5wKQorICB7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnM7CisgICAgc29hcC0+bGV2ZWwgPSBucC0+bGV2ZWw7IC8qIHByZXNlcnZlIGVsZW1lbnQgbmVzdGluZyBsZXZlbCAqLworICAgIHMgPSBucC0+bnM7CisgICAgaWYgKCFzICYmIG5wLT5pbmRleCA+PSAwICYmIG5zKQorICAgIHsgcyA9IG5zW25wLT5pbmRleF0ub3V0OworICAgICAgaWYgKCFzKQorICAgICAgICBzID0gbnNbbnAtPmluZGV4XS5uczsKKyAgICB9CisgICAgaWYgKHMgJiYgc29hcF9wdXNoX25hbWVzcGFjZShzb2FwLCBucC0+aWQsIHMpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIG5xID0gbnA7CisgICAgbnAgPSBucC0+bmV4dDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgbnEpOworICB9CisgIGlmIChucykKKyAgeyByZWdpc3RlciBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBuc1tpXS5pZDsgaSsrKQorICAgIHsgaWYgKG5zW2ldLm91dCkKKyAgICAgIHsgU09BUF9GUkVFKHNvYXAsIG5zW2ldLm91dCk7CisgICAgICAgIG5zW2ldLm91dCA9IE5VTEw7CisgICAgICB9CisgICAgfQorICAgIFNPQVBfRlJFRShzb2FwLCBucyk7CisgIH0KKyAgc29hcC0+bGV2ZWwgPSBsZXZlbDsgLyogcmVzdG9yZSBsZXZlbCAqLworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2xvY2FsX25hbWVzcGFjZXMoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwLT5uYW1lc3BhY2VzICYmICFzb2FwLT5sb2NhbF9uYW1lc3BhY2VzKQorICB7IHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBOYW1lc3BhY2UgKm5zMTsKKyAgICByZWdpc3RlciBzdHJ1Y3QgTmFtZXNwYWNlICpuczI7CisgICAgcmVnaXN0ZXIgc2l6ZV90IG4gPSAxOworICAgIGZvciAobnMxID0gc29hcC0+bmFtZXNwYWNlczsgbnMxLT5pZDsgbnMxKyspCisgICAgICBuKys7CisgICAgbiAqPSBzaXplb2Yoc3RydWN0IE5hbWVzcGFjZSk7CisgICAgbnMyID0gKHN0cnVjdCBOYW1lc3BhY2UqKVNPQVBfTUFMTE9DKHNvYXAsIG4pOworICAgIGlmIChuczIpCisgICAgeyBtZW1jcHkobnMyLCBzb2FwLT5uYW1lc3BhY2VzLCBuKTsKKyAgICAgIGlmIChuczJbMF0ubnMpCisgICAgICB7IGlmICghc3RyY21wKG5zMlswXS5ucywgc29hcF9lbnYxKSkKKyAgICAgICAgICBzb2FwLT52ZXJzaW9uID0gMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHNvYXAtPnZlcnNpb24gPSAyOworICAgICAgfQorICAgICAgc29hcC0+bG9jYWxfbmFtZXNwYWNlcyA9IG5zMjsKKyAgICB9CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfc3Ryc2VhcmNoKGNvbnN0IGNoYXIgKmJpZywgY29uc3QgY2hhciAqbGl0dGxlKQoreyBzaXplX3QgbiA9IHN0cmxlbihsaXR0bGUpOworICBjb25zdCBjaGFyICpzID0gYmlnOworICB3aGlsZSAocykgCisgIHsgaWYgKCFzdHJuY21wKHMsIGxpdHRsZSwgbikgJiYgKHNbbl0gPT0gJ1wwJyB8fCBzW25dID09ICcgJykpCisgICAgICByZXR1cm4gczsKKyAgICBzID0gc3RyY2hyKHMsICcgJyk7CisgICAgaWYgKHMpCisgICAgICBzKys7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBzdHJ1Y3Qgc29hcF9ubGlzdCAqCitzb2FwX2xvb2t1cF9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzaXplX3QgbikKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wOworICBmb3IgKG5wID0gc29hcC0+bmxpc3Q7IG5wOyBucCA9IG5wLT5uZXh0KQorICB7IGlmICghc3RybmNtcChucC0+aWQsIHRhZywgbikgJiYgIW5wLT5pZFtuXSkKKyAgICAgIHJldHVybiBucDsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBzdHJ1Y3Qgc29hcF9ubGlzdCAqCitzb2FwX3B1c2hfbnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICpucywgc2hvcnQgdXRpbGl6ZWQpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucDsKKyAgc2l6ZV90IG4sIGs7CisgIGlmIChzb2FwX3N0cnNlYXJjaChzb2FwLT5jMTRuZXhjbHVkZSwgaWQpKQorICAgIHJldHVybiBOVUxMOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlB1c2ggbmFtZXNwYWNlIGJpbmRpbmcgKGxldmVsPSV1KSAnJXMnICclcydcbiIsIHNvYXAtPmxldmVsLCBpZCwgbnM/bnM6IiIpKTsKKyAgaWYgKCF1dGlsaXplZCkKKyAgeyBmb3IgKG5wID0gc29hcC0+bmxpc3Q7IG5wOyBucCA9IG5wLT5uZXh0KQorICAgIHsgaWYgKCFzdHJjbXAobnAtPmlkLCBpZCkgJiYgKCFucC0+bnMgfHwgIXN0cmNtcChucC0+bnMsIG5zKSkpCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAobnApCisgICAgeyBpZiAobnAtPmluZGV4ID09IDEpCisgICAgICAgIHV0aWxpemVkID0gbnAtPmluZGV4OworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIH0KKyAgbiA9IHN0cmxlbihpZCk7CisgIGlmIChucykKKyAgICBrID0gc3RybGVuKG5zKTsKKyAgZWxzZQorICAgIGsgPSAwOworICBucCA9IChzdHJ1Y3Qgc29hcF9ubGlzdCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX25saXN0KSArIG4gKyBrICsgMSk7CisgIGlmICghbnApCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBucC0+bmV4dCA9IHNvYXAtPm5saXN0OworICBzb2FwLT5ubGlzdCA9IG5wOworICBzdHJjcHkobnAtPmlkLCBpZCk7CisgIGlmIChucykKKyAgeyBucC0+bnMgPSBucC0+aWQgKyBuICsgMTsKKyAgICBzdHJjcHkobnAtPm5zLCBucyk7CisgIH0KKyAgZWxzZQorICAgIG5wLT5ucyA9IE5VTEw7CisgIG5wLT5sZXZlbCA9IHNvYXAtPmxldmVsOworICBucC0+aW5kZXggPSB1dGlsaXplZDsKKyAgcmV0dXJuIG5wOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIHZvaWQKK3NvYXBfdXRpbGl6ZV9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzaXplX3QgbikKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wID0gc29hcF9sb29rdXBfbnMoc29hcCwgdGFnLCBuKTsKKyAgaWYgKG5wKQorICB7IGlmIChucC0+aW5kZXggPT0gMCkKKyAgICAgIHNvYXBfcHVzaF9ucyhzb2FwLCBucC0+aWQsIG5wLT5ucywgMSk7CisgIH0KKyAgZWxzZQorICB7IHN0cm5jcHkoc29hcC0+dG1wYnVmLCB0YWcsIG4pOworICAgIHNvYXAtPnRtcGJ1ZltuXSA9ICdcMCc7CisgICAgc29hcF9wdXNoX25zKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgTlVMTCwgMSk7CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyB2b2lkCitzb2FwX3BvcF9ucyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcF9wb3BfbmFtZXNwYWNlKHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICp0eXBlKQoreyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVsZW1lbnQgYmVnaW4gdGFnPSclcycgaWQ9JyVkJyB0eXBlPSclcydcbiIsIHRhZywgaWQsIHR5cGU/dHlwZToiIikpOworI2lmZGVmIFdJVEhfRE9NCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICplbHQgPSAoc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCkpOworICAgIGlmICghZWx0KQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgZWx0LT5zb2FwID0gc29hcDsKKyAgICBlbHQtPm5leHQgPSBOVUxMOworICAgIGVsdC0+cHJudCA9IHNvYXAtPmRvbTsKKyAgICBlbHQtPm5hbWUgPSBzb2FwX3N0cmR1cChzb2FwLCB0YWcpOworICAgIGVsdC0+ZWx0cyA9IE5VTEw7CisgICAgZWx0LT5hdHRzID0gTlVMTDsKKyAgICBlbHQtPm5zdHIgPSBOVUxMOworICAgIGVsdC0+ZGF0YSA9IE5VTEw7CisgICAgZWx0LT53aWRlID0gTlVMTDsKKyAgICBlbHQtPm5vZGUgPSBOVUxMOworICAgIGVsdC0+dHlwZSA9IDA7CisgICAgZWx0LT5oZWFkID0gTlVMTDsKKyAgICBlbHQtPnRhaWwgPSBOVUxMOworICAgIGlmIChzb2FwLT5kb20pCisgICAgeyBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqcCA9IHNvYXAtPmRvbS0+ZWx0czsKKyAgICAgIGlmIChwKQorICAgICAgeyB3aGlsZSAocC0+bmV4dCkKKyAgICAgICAgICBwID0gcC0+bmV4dDsKKyAgICAgICAgcC0+bmV4dCA9IGVsdDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgc29hcC0+ZG9tLT5lbHRzID0gZWx0OworICAgIH0KKyAgICBzb2FwLT5kb20gPSBlbHQ7CisgIH0KKyAgZWxzZQorICB7CisjZW5kaWYKKyAgICBzb2FwLT5sZXZlbCsrOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBpZiAoIXNvYXAtPm5zKQorICAgIHsgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgICAgICAmJiBzb2FwX3NlbmQoc29hcCwgc29hcC0+cHJvbG9nID8gc29hcC0+cHJvbG9nIDogIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIikpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgZWxzZSBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0lOREVOVCkKKyAgICB7IGlmIChzb2FwLT5ucyA9PSAxICYmIHNvYXBfc2VuZF9yYXcoc29hcCwgc29hcF9pbmRlbnQsIHNvYXAtPmxldmVsIDwgc2l6ZW9mKHNvYXBfaW5kZW50KSA/IHNvYXAtPmxldmVsIDogc2l6ZW9mKHNvYXBfaW5kZW50KSAtIDEpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBzb2FwLT5ib2R5ID0gMTsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAiPCIsIDEpCisgICAgIHx8IHNvYXBfc2VuZChzb2FwLCB0YWcpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmZGVmIFdJVEhfRE9NCisgIH0KKyNlbmRpZgorICBpZiAoIXNvYXAtPm5zKQorICB7IHN0cnVjdCBOYW1lc3BhY2UgKm5zOworICAgIGZvciAobnMgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzOyBucyAmJiBucy0+aWQ7IG5zKyspCisgICAgeyBpZiAoKm5zLT5pZCAmJiAobnMtPm91dCB8fCBucy0+bnMpKQorICAgICAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgInhtbG5zOiVzIiwgbnMtPmlkKTsKKyAgICAgICAgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgbnMtPm91dCA/IG5zLT5vdXQgOiBucy0+bnMpKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIH0KKyAgICB9ICAgCisgIH0KKyAgc29hcC0+bnMgPSAxOyAvKiBzdGFydCB3aXRoIDAgb3IgMiwgYnV0IHNob3VsZCBiZSBvbmUgdG8gY29udGludWUgKi8KKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICB7IGNvbnN0IGNoYXIgKnMgPSBzdHJjaHIodGFnLCAnOicpOworICAgIGlmIChzKQorICAgICAgc29hcF91dGlsaXplX25zKHNvYXAsIHRhZywgcyAtIHRhZyk7CisgIH0KKyNlbmRpZgorICBpZiAoaWQgPiAwKQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiXyVkIiwgaWQpOworICAgIGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAiaWQiLCBzb2FwLT50bXBidWYpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmICh0eXBlICYmICp0eXBlKQorICB7IGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAieHNpOnR5cGUiLCB0eXBlKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgICAgeyBjb25zdCBjaGFyICpzID0gc3RyY2hyKHR5cGUsICc6Jyk7CisgICAgICBpZiAocykKKyAgICAgICAgc29hcF91dGlsaXplX25zKHNvYXAsIHR5cGUsIHMgLSB0eXBlKTsKKyAgICB9CisjZW5kaWYKKyAgfQorICBpZiAoc29hcC0+bnVsbCAmJiBzb2FwLT5wb3NpdGlvbiA+IDApCisgIHsgaW50IGk7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICJbJWQiLCBzb2FwLT5wb3NpdGlvbnNbMF0pOworICAgIGZvciAoaSA9IDE7IGkgPCBzb2FwLT5wb3NpdGlvbjsgaSsrKQorICAgICAgc3ByaW50Zihzb2FwLT50bXBidWYgKyBzdHJsZW4oc29hcC0+dG1wYnVmKSwgIiwlZCIsIHNvYXAtPnBvc2l0aW9uc1tpXSk7CisgICAgc3RyY2F0KHNvYXAtPnRtcGJ1ZiwgIl0iKTsKKyAgICBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgIlNPQVAtRU5DOnBvc2l0aW9uIiwgc29hcC0+dG1wYnVmKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAoc29hcC0+bXVzdFVuZGVyc3RhbmQpCisgIHsgaWYgKHNvYXAtPmFjdG9yICYmICpzb2FwLT5hY3RvcikKKyAgICB7IGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCBzb2FwLT52ZXJzaW9uID09IDIgPyAiU09BUC1FTlY6cm9sZSIgOiAiU09BUC1FTlY6YWN0b3IiLCBzb2FwLT5hY3RvcikpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJTT0FQLUVOVjptdXN0VW5kZXJzdGFuZCIsIHNvYXAtPnZlcnNpb24gPT0gMiA/ICJ0cnVlIiA6ICIxIikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgc29hcC0+bXVzdFVuZGVyc3RhbmQgPSAwOworICB9CisgIGlmIChzb2FwLT5lbmNvZGluZykKKyAgeyBpZiAoc29hcC0+ZW5jb2RpbmdTdHlsZSAmJiBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzKQorICAgIHsgaWYgKCEqc29hcC0+ZW5jb2RpbmdTdHlsZSkKKyAgICAgIHsgaWYgKHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbMV0ub3V0KQorICAgICAgICAgIHNvYXAtPmVuY29kaW5nU3R5bGUgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzWzFdLm91dDsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHNvYXAtPmVuY29kaW5nU3R5bGUgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzWzFdLm5zOworICAgICAgfQorICAgICAgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJTT0FQLUVOVjplbmNvZGluZ1N0eWxlIiwgc29hcC0+ZW5jb2RpbmdTdHlsZSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgc29hcC0+ZW5jb2RpbmcgPSAwOworICB9CisgIHNvYXAtPm51bGwgPSAwOworICBzb2FwLT5wb3NpdGlvbiA9IDA7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgY2hhciAqdHlwZSkKK3sgaWYgKCp0YWcgPT0gJy0nKQorICAgIHJldHVybiBTT0FQX09LOworICBpZiAoc29hcF9lbGVtZW50KHNvYXAsIHRhZywgaWQsIHR5cGUpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHNvYXAsIE5VTEwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorI2lmbmRlZiBIQVZFX1NUUlJDSFIKK1NPQVBfRk1BQzEKK2NoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3N0cnJjaHIoY29uc3QgY2hhciAqcywgaW50IHQpCit7IHJlZ2lzdGVyIGNoYXIgKnIgPSBOVUxMOworICB3aGlsZSAoKnMpCisgICAgaWYgKCpzKysgPT0gdCkKKyAgICAgIHIgPSAoY2hhciopcyAtIDE7CisgIHJldHVybiByOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCisjaWZuZGVmIEhBVkVfU1RSVE9MCitTT0FQX0ZNQUMxCitsb25nCitTT0FQX0ZNQUMyCitzb2FwX3N0cnRvbChjb25zdCBjaGFyICpzLCBjaGFyICoqdCwgaW50IGIpCit7IHJlZ2lzdGVyIGxvbmcgbiA9IDA7CisgIHJlZ2lzdGVyIGludCBjOworICB3aGlsZSAoKnMgPiAwICYmICpzIDw9IDMyKQorICAgIHMrKzsKKyAgaWYgKGIgPT0gMTApCisgIHsgc2hvcnQgbmVnID0gMDsKKyAgICBpZiAoKnMgPT0gJy0nKQorICAgIHsgcysrOworICAgICAgbmVnID0gMTsKKyAgICB9CisgICAgZWxzZSBpZiAoKnMgPT0gJysnKQorICAgICAgcysrOworICAgIHdoaWxlICgoYyA9ICpzKSAmJiBjID49ICcwJyAmJiBjIDw9ICc5JykKKyAgICB7IGlmIChuID49IDIxNDc0ODM2NCAmJiAobiA+IDIxNDc0ODM2NCB8fCBjID49ICc4JykpCisgICAgICAgIGJyZWFrOworICAgICAgbiAqPSAxMDsKKyAgICAgIG4gKz0gYyAtICcwJzsKKyAgICAgIHMrKzsKKyAgICB9CisgICAgaWYgKG5lZykKKyAgICAgIG4gPSAtbjsKKyAgfQorICBlbHNlIC8qIGIgPT0gMTYgYW5kIHZhbHVlIGlzIGFsd2F5cyBwb3NpdGl2ZSAqLworICB7IHdoaWxlICgoYyA9ICpzKSkKKyAgICB7IGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKKyAgICAgICAgYyAtPSAnMCc7CisgICAgICBlbHNlIGlmIChjID49ICdBJyAmJiBjIDw9ICdGJykKKyAgICAgICAgYyAtPSAnQScgLSAxMDsKKyAgICAgIGVsc2UgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQorICAgICAgICBjIC09ICdhJyAtIDEwOworICAgICAgaWYgKG4gPiAweDA3RkZGRkZGKQorICAgICAgICBicmVhazsKKyAgICAgIG4gPDw9IDQ7CisgICAgICBuICs9IGM7CisgICAgICBzKys7CisgICAgfQorICB9CisgIGlmICh0KQorICAgICp0ID0gKGNoYXIqKXM7CisgIHJldHVybiBuOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCisjaWZuZGVmIEhBVkVfU1RSVE9VTAorU09BUF9GTUFDMQordW5zaWduZWQgbG9uZworU09BUF9GTUFDMgorc29hcF9zdHJ0b3VsKGNvbnN0IGNoYXIgKnMsIGNoYXIgKip0LCBpbnQgYikKK3sgdW5zaWduZWQgbG9uZyBuID0gMDsKKyAgcmVnaXN0ZXIgaW50IGM7CisgIHdoaWxlICgqcyA+IDAgJiYgKnMgPD0gMzIpCisgICAgcysrOworICBpZiAoYiA9PSAxMCkKKyAgeyBpZiAoKnMgPT0gJysnKQorICAgICAgcysrOworICAgIHdoaWxlICgoYyA9ICpzKSAmJiBjID49ICcwJyAmJiBjIDw9ICc5JykKKyAgICB7IGlmIChuID49IDQyOTQ5NjcyOSAmJiAobiA+IDQyOTQ5NjcyOSB8fCBjID49ICc2JykpCisgICAgICAgIGJyZWFrOworICAgICAgbiAqPSAxMDsKKyAgICAgIG4gKz0gYyAtICcwJzsKKyAgICAgIHMrKzsKKyAgICB9CisgIH0KKyAgZWxzZSAvKiBiID09IDE2ICovCisgIHsgd2hpbGUgKChjID0gKnMpKQorICAgIHsgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQorICAgICAgICBjIC09ICcwJzsKKyAgICAgIGVsc2UgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKQorICAgICAgICBjIC09ICdBJyAtIDEwOworICAgICAgZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCisgICAgICAgIGMgLT0gJ2EnIC0gMTA7CisgICAgICBpZiAobiA+IDB4MEZGRkZGRkYpCisgICAgICAgIGJyZWFrOworICAgICAgbiA8PD0gNDsKKyAgICAgIG4gKz0gYzsKKyAgICAgIHMrKzsKKyAgICB9CisgIH0KKyAgaWYgKHQpCisgICAgKnQgPSAoY2hhciopczsKKyAgcmV0dXJuIG47Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9hcnJheV9iZWdpbl9vdXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICpvZmZzZXQpCit7IGlmIChzb2FwX2VsZW1lbnQoc29hcCwgdGFnLCBpZCwgIlNPQVAtRU5DOkFycmF5IikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICB7IGNvbnN0IGNoYXIgKnM7CisgICAgcyA9IHNvYXBfc3RycmNocih0eXBlLCAnWycpOworICAgIGlmICgoc2l6ZV90KShzIC0gdHlwZSkgPCBzaXplb2Yoc29hcC0+dG1wYnVmKSkKKyAgICB7IHN0cm5jcHkoc29hcC0+dG1wYnVmLCB0eXBlLCBzIC0gdHlwZSk7CisgICAgICBzb2FwLT50bXBidWZbcyAtIHR5cGVdID0gJ1wwJzsKKyAgICAgIGlmICh0eXBlICYmICp0eXBlICYmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAiU09BUC1FTkM6aXRlbVR5cGUiLCBzb2FwLT50bXBidWYpKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgaWYgKHMgJiYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJTT0FQLUVOQzphcnJheVNpemUiLCBzICsgMSkpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICB9CisgIGVsc2UKKyAgeyBpZiAob2Zmc2V0ICYmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAiU09BUC1FTkM6b2Zmc2V0Iiwgb2Zmc2V0KSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHR5cGUgJiYgKnR5cGUgJiYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJTT0FQLUVOQzphcnJheVR5cGUiLCB0eXBlKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICh0eXBlICYmICp0eXBlICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKSkKKyAgeyBjb25zdCBjaGFyICpzID0gc3RyY2hyKHR5cGUsICc6Jyk7CisgICAgaWYgKHMpCisgICAgICBzb2FwX3V0aWxpemVfbnMoc29hcCwgdHlwZSwgcyAtIHR5cGUpOworICB9CisjZW5kaWYKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHNvYXAsIE5VTEwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKnRwOworI2lmZGVmIFdJVEhfRE9NCisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgKiphdHQ7CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IGF0dCA9ICZzb2FwLT5kb20tPmF0dHM7CisgICAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICAgIHsgaWYgKHRwLT52aXNpYmxlKQorICAgICAgeyAqYXR0ID0gKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlKSk7CisJaWYgKCEqYXR0KQorCSAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisJKCphdHQpLT5uZXh0ID0gTlVMTDsKKyAgICAgICAgKCphdHQpLT5uc3RyID0gTlVMTDsKKyAgICAgICAgKCphdHQpLT5uYW1lID0gc29hcF9zdHJkdXAoc29hcCwgdHAtPm5hbWUpOworICAgICAgICAoKmF0dCktPmRhdGEgPSBzb2FwX3N0cmR1cChzb2FwLCB0cC0+dmFsdWUpOworICAgICAgICAoKmF0dCktPndpZGUgPSBOVUxMOworICAgICAgICAoKmF0dCktPnNvYXAgPSBzb2FwOworICAgICAgICB0cC0+dmlzaWJsZSA9IDA7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBTT0FQX09LOworICB9CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICB7IHN0cnVjdCBzb2FwX25saXN0ICpucDsKKyAgICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgICAgeyBpZiAodHAtPnZpc2libGUgJiYgdHAtPm5hbWUpCisgICAgICB7IGNvbnN0IGNoYXIgKnMgPSBzdHJjaHIodHAtPm5hbWUsICc6Jyk7CisgICAgICAgIGlmIChzKQorICAgICAgICAgIHNvYXBfdXRpbGl6ZV9ucyhzb2FwLCB0cC0+bmFtZSwgcyAtIHRwLT5uYW1lKTsKKyAgICAgIH0KKyAgICB9CisgICAgZm9yIChucCA9IHNvYXAtPm5saXN0OyBucDsgbnAgPSBucC0+bmV4dCkKKyAgICB7IGlmIChucC0+aW5kZXggPT0gMSAmJiBucC0+bnMpCisgICAgICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAieG1sbnM6JXMiLCBucC0+aWQpOworICAgICAgICBzb2FwX3NldF9hdHRyKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgbnAtPm5zKTsKKyAgICAgICAgbnAtPmluZGV4ID0gMjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyNlbmRpZgorICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgIHsgaWYgKHRwLT52aXNpYmxlKQorICAgIHsgaWYgKHNvYXBfc2VuZChzb2FwLCAiICIpIHx8IHNvYXBfc2VuZChzb2FwLCB0cC0+bmFtZSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIGlmICh0cC0+dmlzaWJsZSA9PSAyICYmIHRwLT52YWx1ZSkKKyAgICAgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgIj1cIiIsIDIpCisJIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCB0cC0+dmFsdWUsIDEpCisJIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIlwiIiwgMSkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgdHAtPnZpc2libGUgPSAwOworICAgIH0KKyAgfQorICBpZiAodGFnKQorICB7IAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsICI+IiwgMSkKKyAgICAgICB8fCBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHNvYXAtPmxldmVsLS07CS8qIGRlY3JlbWVudCBsZXZlbCBqdXN0IGJlZm9yZSAvPiAqLworICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsICIvPiIsIDIpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsICI+IiwgMSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9lbmRfb3V0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcpCit7IGlmICgqdGFnID09ICctJykKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbGVtZW50IGVuZGluZyB0YWc9JyVzJ1xuIiwgdGFnKSk7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgaWYgKHNvYXAtPmRvbS0+cHJudCkKKyAgICAgIHNvYXAtPmRvbSA9IHNvYXAtPmRvbS0+cHJudDsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgICBzb2FwX3BvcF9ucyhzb2FwKTsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9JTkRFTlQpCisgIHsgaWYgKCFzb2FwLT5ib2R5KQorICAgIHsgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgc29hcF9pbmRlbnQsIHNvYXAtPmxldmVsIDwgc2l6ZW9mKHNvYXBfaW5kZW50KSA/IHNvYXAtPmxldmVsIDogc2l6ZW9mKHNvYXBfaW5kZW50KSAtIDEpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIHNvYXAtPmJvZHkgPSAwOworICB9CisjZW5kaWYKKyAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgIjwvIiwgMikKKyAgIHx8IHNvYXBfc2VuZChzb2FwLCB0YWcpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgc29hcC0+bGV2ZWwtLTsJLyogZGVjcmVtZW50IGxldmVsIGp1c3QgYmVmb3JlID4gKi8KKyAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgIj4iLCAxKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X3JlZihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGludCBocmVmKQoreyByZWdpc3RlciBpbnQgbiA9IDA7CisgIGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgICAgbiA9IDE7CisgIHNwcmludGYoc29hcC0+aHJlZiwgIiNfJWQiLCBocmVmKTsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9ocmVmKHNvYXAsIHRhZywgaWQsICJocmVmIiArIG4sIHNvYXAtPmhyZWYgKyBuKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X2hyZWYoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICpyZWYsIGNvbnN0IGNoYXIgKnZhbCkKK3sgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbGVtZW50ICclcycgcmVmZXJlbmNlICVzPSclcydcbiIsIHRhZywgcmVmLCB2YWwpKTsKKyAgaWYgKHNvYXBfZWxlbWVudChzb2FwLCB0YWcsIGlkLCBOVUxMKQorICAgfHwgc29hcF9hdHRyaWJ1dGUoc29hcCwgcmVmLCB2YWwpCisgICB8fCBzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzb2FwLCB0YWcpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9udWxsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgY2hhciAqdHlwZSkKK3sgc3RydWN0IHNvYXBfYXR0cmlidXRlICp0cDsKKyAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICAgIGlmICh0cC0+dmlzaWJsZSkKKyAgICAgIGJyZWFrOworICBpZiAodHAgfHwgKHNvYXAtPnZlcnNpb24gPT0gMiAmJiBzb2FwLT5wb3NpdGlvbiA+IDApIHx8IGlkID4gMCB8fCAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX05JTCkpCisgIHsgaWYgKHNvYXBfZWxlbWVudChzb2FwLCB0YWcsIGlkLCB0eXBlKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAoc29hcC0+cGFydCAhPSBTT0FQX0lOX0hFQURFUiAmJiBzb2FwLT5lbmNvZGluZ1N0eWxlKQorICAgICAgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJ4c2k6bmlsIiwgInRydWUiKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIHJldHVybiBzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzb2FwLCB0YWcpOworICB9CisgIHNvYXAtPm51bGwgPSAxOworICBzb2FwLT5wb3NpdGlvbiA9IDA7CisgIHNvYXAtPm11c3RVbmRlcnN0YW5kID0gMDsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9pZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgbiwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpIAoreyBpZiAoIXAgfHwgKGEgJiYgIWEtPl9fcHRyKSkKKyAgeyBzb2FwX2VsZW1lbnRfbnVsbChzb2FwLCB0YWcsIGlkLCB0eXBlKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfVFJFRSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKGlkIDwgMCkKKyAgeyBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgICAgaWYgKGEpCisgICAgICBpZCA9IHNvYXBfYXJyYXlfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgYSwgbiwgdCwgJnBwKTsKKyAgICBlbHNlCisgICAgICBpZCA9IHNvYXBfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgdCwgJnBwKTsKKyAgICBpZiAoaWQpCisgICAgeyBpZiAoc29hcF9pc19lbWJlZGRlZChzb2FwLCBwcCkpCisgICAgICB7IHNvYXBfZWxlbWVudF9yZWYoc29hcCwgdGFnLCAwLCBpZCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGlmIChzb2FwX2lzX3NpbmdsZShzb2FwLCBwcCkpCisgICAgICAgIHJldHVybiAwOworICAgICAgc29hcF9zZXRfZW1iZWRkZWQoc29hcCwgcHApOworICAgIH0KKyAgfQorICByZXR1cm4gaWQ7CisjZWxzZQorICByZXR1cm4gMDsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfcmVzdWx0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcpCit7IGlmIChzb2FwLT52ZXJzaW9uID09IDIgJiYgc29hcC0+ZW5jb2RpbmdTdHlsZSkKKyAgICBpZiAoc29hcF9lbGVtZW50KHNvYXAsICJTT0FQLVJQQzpyZXN1bHQiLCAwLCBOVUxMKQorICAgICB8fCBzb2FwX2F0dHJpYnV0ZShzb2FwLCAieG1sbnM6U09BUC1SUEMiLCBzb2FwX3JwYykKKyAgICAgfHwgc29hcF9lbGVtZW50X3N0YXJ0X2VuZF9vdXQoc29hcCwgTlVMTCkKKyAgICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHRhZywgMCkKKyAgICAgfHwgc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgIlNPQVAtUlBDOnJlc3VsdCIpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9hdHRyaWJ1dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKQoreyAKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICphID0gKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlKSk7CisgICAgYS0+bmV4dCA9IHNvYXAtPmRvbS0+YXR0czsKKyAgICBhLT5uc3RyID0gTlVMTDsKKyAgICBhLT5uYW1lID0gc29hcF9zdHJkdXAoc29hcCwgbmFtZSk7CisgICAgYS0+ZGF0YSA9IHNvYXBfc3RyZHVwKHNvYXAsIHZhbHVlKTsKKyAgICBhLT53aWRlID0gTlVMTDsKKyAgICBhLT5zb2FwID0gc29hcDsKKyAgICBzb2FwLT5kb20tPmF0dHMgPSBhOworICAgIHJldHVybiBTT0FQX09LOworICB9CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICB7IC8qIFRPRE86IGNvbnNpZGVyIHVzaW5nIHRoaXMgY29kZSB0byBoYW5kbGUgZGVmYXVsdCBuYW1lc3BhY2UKKyAgICBpZiAoIXN0cm5jbXAobmFtZSwgInhtbG5zIiwgNSkgJiYgKG5hbWVbNV0gPT0gJzonIHx8IG5hbWVbNV0gPT0gJ1wwJykpCisgICAgeyBpZiAobmFtZVs1XSA9PSAnOicpCisgICAgICAgIHNvYXBfcHVzaF9ucyhzb2FwLCBuYW1lICsgNiwgdmFsdWUsIDApOworICAgICAgZWxzZQorICAgICAgICBzb2FwX3B1c2hfbnMoc29hcCwgIiIsIHZhbHVlLCAwKTsKKyAgICB9CisgICAgKi8KKyAgICBpZiAoIXN0cm5jbXAobmFtZSwgInhtbG5zOiIsIDYpKQorICAgICAgc29hcF9wdXNoX25zKHNvYXAsIG5hbWUgKyA2LCB2YWx1ZSwgMCk7CisgICAgZWxzZSBpZiAoc29hcF9zZXRfYXR0cihzb2FwLCBuYW1lLCB2YWx1ZSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgZWxzZQorI2VuZGlmCisgIHsgaWYgKHNvYXBfc2VuZChzb2FwLCAiICIpIHx8IHNvYXBfc2VuZChzb2FwLCBuYW1lKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAodmFsdWUpCisgICAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAiPVwiIiwgMikKKyAgICAgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgdmFsdWUsIDEpCisgICAgICAgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiXCIiLCAxKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfYmVnaW5faW4oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IG5pbGxhYmxlKQoreyBpZiAoIXNvYXBfcGVla19lbGVtZW50KHNvYXApKQorICB7IGlmIChzb2FwLT5vdGhlcikKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfVEFHX01JU01BVENIOworICAgIGlmICh0YWcgJiYgKnRhZyA9PSAnLScpCisgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICBpZiAoIShzb2FwLT5lcnJvciA9IHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnRhZywgdGFnKSkpCisgICAgeyBzb2FwLT5wZWVrZWQgPSAwOworICAgICAgaWYgKHNvYXAtPmJvZHkpCisgICAgICAgIHNvYXAtPmxldmVsKys7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkJlZ2luIGVsZW1lbnQgZm91bmQgKGxldmVsPSV1KSAnJXMnPSclcydcbiIsIHNvYXAtPmxldmVsLCBzb2FwLT50YWcsIHRhZz90YWc6IiIgKSk7CisgICAgICBpZiAoIW5pbGxhYmxlICYmIHNvYXAtPm51bGwgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX05VTEw7CisgICAgfQorICB9CisgIGVsc2UgaWYgKHNvYXAtPmVycm9yID09IFNPQVBfTk9fVEFHICYmIHRhZyAmJiAqdGFnID09ICctJykKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X2VuZF9pbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnKSAgCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgcmVnaXN0ZXIgY2hhciAqczsKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqdDsKKyAgcmVnaXN0ZXIgaW50IG4gPSAwOworICBpZiAodGFnICYmICp0YWcgPT0gJy0nKQorICAgIHJldHVybiBTT0FQX09LOworICBzb2FwLT5sZXZlbC0tOworICBzb2FwX3BvcF9uYW1lc3BhY2Uoc29hcCk7CisjaWZkZWYgV0lUSF9ET00KKyAgLyogdGhpcyB3aGl0ZXNwYWNlIG9yIG1peGVkIGNvbnRlbnQgaXMgbm90IGluc2lnbmlmaWNhbnQgZm9yIERPTSAqLworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBpZiAoIXNvYXAtPnBlZWtlZCAmJiAhc29hcF9zdHJpbmdfaW4oc29hcCwgMywgLTEsIC0xKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAoc29hcC0+ZG9tLT5wcm50KQorICAgICAgc29hcC0+ZG9tID0gc29hcC0+ZG9tLT5wcm50OworICB9CisjZW5kaWYKKyAgaWYgKHNvYXAtPnBlZWtlZCkKKyAgeyBpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcpCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgICAgaWYgKCpzb2FwLT50YWcpCisgICAgICBuKys7CisgICAgc29hcC0+cGVla2VkID0gMDsKKyAgfQorICBkbworICB7IHdoaWxlICgoKGMgPSBzb2FwX2dldChzb2FwKSkgIT0gU09BUF9UVCkpCisgICAgeyBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgICBpZiAoYyA9PSBTT0FQX0xUKQorICAgICAgICBuKys7CisgICAgICBlbHNlIGlmIChjID09ICcvJykKKyAgICAgIHsgYyA9IHNvYXBfZ2V0KHNvYXApOworICAgICAgICBpZiAoYyA9PSBTT0FQX0dUKQorCSAgbi0tOworICAgICAgICBlbHNlCisJICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgfQorICAgIH0KKyAgfSB3aGlsZSAobi0tKTsKKyAgcyA9IHNvYXAtPnRhZzsKKyAgd2hpbGUgKHNvYXBfbm90YmxhbmsoYyA9IHNvYXBfZ2V0KHNvYXApKSkKKyAgICAqcysrID0gKGNoYXIpYzsKKyAgKnMgPSAnXDAnOworICBpZiAoKGludCljID09IEVPRikKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgd2hpbGUgKHNvYXBfYmxhbmsoYykpCisgICAgYyA9IHNvYXBfZ2V0KHNvYXApOworICBpZiAoYyAhPSBTT0FQX0dUKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfU1lOVEFYX0VSUk9SOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBlbGVtZW50IGZvdW5kIChsZXZlbD0ldSkgJyVzJz0nJXMnXG4iLCBzb2FwLT5sZXZlbCwgc29hcC0+dGFnLCB0YWc/dGFnOiIiKSk7CisgIGlmICghdGFnIHx8ICEqdGFnKQorICAgIHJldHVybiBTT0FQX09LOworICBpZiAoKHMgPSBzdHJjaHIoc29hcC0+dGFnLCAnOicpKSkKKyAgICBzKys7CisgIGVsc2UKKyAgICBzID0gc29hcC0+dGFnOworICBpZiAoKHQgPSBzdHJjaHIodGFnLCAnOicpKSkKKyAgICB0Kys7CisgIGVsc2UKKyAgICB0ID0gdGFnOworICBpZiAoIVNPQVBfU1RSQ01QKHMsIHQpKQorICAgIHJldHVybiBTT0FQX09LOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBlbGVtZW50IHRhZyBuYW1lIGRvZXMgbm90IG1hdGNoXG4iKSk7CisgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfU1lOVEFYX0VSUk9SOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX2F0dHJfdmFsdWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBmbGFnKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKnRwOworICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgICAgaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgbmFtZSkpCisgICAgICBicmVhazsKKyAgaWYgKHRwICYmIHRwLT52aXNpYmxlID09IDIpCisgIHsgaWYgKGZsYWcgPT0gMiAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfUFJPSElCSVRFRDsKKyAgICBlbHNlCisgICAgICByZXR1cm4gdHAtPnZhbHVlOworICB9CisgIGVsc2UgaWYgKGZsYWcgPT0gMSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpCisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1JFUVVJUkVEOworICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZXRfYXR0cihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqdHA7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2V0IGF0dHJpYnV0ZSAlcz0nJXMnXG4iLCBuYW1lLCB2YWx1ZT92YWx1ZToiIikpOworICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgIHsgaWYgKCFzdHJjbXAodHAtPm5hbWUsIG5hbWUpKQorICAgICAgYnJlYWs7CisgIH0KKyAgaWYgKCF0cCkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFsbG9jYXRlIGF0dHJpYnV0ZSAlc1xuIiwgbmFtZSkpOworICAgIGlmICghKHRwID0gKHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSkgKyBzdHJsZW4obmFtZSkpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHRwLT5ucyA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICAgIHsgc3RydWN0IHNvYXBfYXR0cmlidXRlICoqdHBwID0gJnNvYXAtPmF0dHJpYnV0ZXM7CisgICAgICBjb25zdCBjaGFyICpzID0gc3RyY2hyKG5hbWUsICc6Jyk7CisgICAgICBpZiAoIXN0cm5jbXAobmFtZSwgInhtbG5zIiwgNSkpCisgICAgICB7IGZvciAoOyAqdHBwOyB0cHAgPSAmKCp0cHApLT5uZXh0KQorICAgICAgICAgIGlmIChzdHJuY21wKCgqdHBwKS0+bmFtZSwgInhtbG5zIiwgNSkgfHwgc3RyY21wKCgqdHBwKS0+bmFtZSArIDUsIG5hbWUgKyA1KSA+IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzKQorICAgICAgeyBmb3IgKDsgKnRwcDsgdHBwID0gJigqdHBwKS0+bmV4dCkKKyAgICAgICAgICBpZiAoc3RybmNtcCgoKnRwcCktPm5hbWUsICJ4bWxucyIsIDUpICYmICgoKnRwcCktPm5zIHx8IHN0cmNtcCgoKnRwcCktPm5hbWUsIG5hbWUpID4gMCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgaW50IGs7CisgICAgICAgIGZvciAoOyAqdHBwOyB0cHAgPSAmKCp0cHApLT5uZXh0KQorCXsgaWYgKCFzdHJuY21wKCgqdHBwKS0+bmFtZSwgInhtbG5zOiIsIDYpICYmICFzdHJuY21wKCgqdHBwKS0+bmFtZSArIDYsIG5hbWUsIHMgLSBuYW1lKSAmJiAhKCp0cHApLT5uYW1lWzYgKyBzIC0gbmFtZV0pCisJICB7IGlmICghdHAtPm5zKQorICAgICAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNhbm9uaWNhbGl6YXRpb246IHByZWZpeCAlcz0lcCglcylcbiIsIG5hbWUsICgqdHBwKS0+bnMsICgqdHBwKS0+bnMpKTsKKwkgICAgICB0cC0+bnMgPSAoKnRwcCktPm5zOworCSAgICB9CisJICB9CisgICAgICAgICAgZWxzZSBpZiAoc3RybmNtcCgoKnRwcCktPm5hbWUsICJ4bWxucyIsIDUpICYmICgqdHBwKS0+bnMgJiYgdHAtPm5zICYmICgoayA9IHN0cmNtcCgoKnRwcCktPm5zLCB0cC0+bnMpKSA+IDAgfHwgKCFrICYmIHN0cmNtcCgoKnRwcCktPm5hbWUsIG5hbWUpID4gMCkpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHRwLT5uZXh0ID0gKnRwcDsKKyAgICAgICp0cHAgPSB0cDsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeyB0cC0+bmV4dCA9IHNvYXAtPmF0dHJpYnV0ZXM7CisgICAgICBzb2FwLT5hdHRyaWJ1dGVzID0gdHA7CisgICAgfQorICAgIHN0cmNweSh0cC0+bmFtZSwgbmFtZSk7CisgICAgdHAtPnZhbHVlID0gTlVMTDsKKyAgfQorICBlbHNlIGlmICh0cC0+dmlzaWJsZSkKKyAgeyByZXR1cm4gU09BUF9PSzsKKyAgfQorICBlbHNlIGlmICh2YWx1ZSAmJiB0cC0+dmFsdWUgJiYgdHAtPnNpemUgPD0gc3RybGVuKHZhbHVlKSkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWUgYXR0cmlidXRlIHZhbHVlIG9mICVzIChmcmVlICVwKVxuIiwgbmFtZSwgdHAtPnZhbHVlKSk7CisgICAgU09BUF9GUkVFKHNvYXAsIHRwLT52YWx1ZSk7CisgICAgdHAtPnZhbHVlID0gTlVMTDsKKyAgICB0cC0+bnMgPSBOVUxMOworICB9CisgIGlmICh2YWx1ZSkKKyAgeyBpZiAoIXRwLT52YWx1ZSkKKyAgICB7IHRwLT5zaXplID0gc3RybGVuKHZhbHVlKSArIDE7CisgICAgICBpZiAoISh0cC0+dmFsdWUgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgdHAtPnNpemUpKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFsbG9jYXRlIGF0dHJpYnV0ZSB2YWx1ZSBvZiAlcyAoJXApXG4iLCB0cC0+bmFtZSwgdHAtPnZhbHVlKSk7CisgICAgfQorICAgIHN0cmNweSh0cC0+dmFsdWUsIHZhbHVlKTsKKyAgICBpZiAoIXN0cm5jbXAodHAtPm5hbWUsICJ4bWxuczoiLCA2KSkKKyAgICAgIHRwLT5ucyA9IHRwLT52YWx1ZTsKKyAgICB0cC0+dmlzaWJsZSA9IDI7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmICghc3RyY21wKG5hbWUsICJ3c3U6SWQiKSkKKyAgICB7IHNvYXAtPnBhcnQgPSBTT0FQX0JFR0lOX1NFQ1VSSVRZOworICAgICAgc3RybmNweShzb2FwLT5pZCwgdmFsdWUsIHNpemVvZihzb2FwLT5pZCkpOworICAgICAgc29hcC0+aWRbc2l6ZW9mKHNvYXAtPmlkKS0xXSA9ICdcMCc7CisgICAgfQorI2VuZGlmCisgIH0KKyAgZWxzZQorICAgIHRwLT52aXNpYmxlID0gMTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2Nscl9hdHRyKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKnRwOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKSkKKyAgeyB3aGlsZSAoc29hcC0+YXR0cmlidXRlcykKKyAgICB7IHRwID0gc29hcC0+YXR0cmlidXRlcy0+bmV4dDsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5hdHRyaWJ1dGVzLT52YWx1ZSk7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+YXR0cmlidXRlcyk7CisgICAgICBzb2FwLT5hdHRyaWJ1dGVzID0gdHA7CisgICAgfQorICB9CisgIGVsc2UKKyNlbmRpZgorICB7IGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgICAgIHRwLT52aXNpYmxlID0gMDsKKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorc3RhdGljIGludAorc29hcF9nZXRhdHRydmFsKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpzLCBzaXplX3Qgbiwgc29hcF93Y2hhciBkKQoreyByZWdpc3RlciBzaXplX3QgaTsKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgeyByZWdpc3RlciBzb2FwX3djaGFyIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgICBzd2l0Y2ggKGMpCisgICAgeworICAgIGNhc2UgU09BUF9UVDoKKyAgICAgICpzKysgPSAnPCc7CisgICAgICBzb2FwX3VuZ2V0KHNvYXAsICcvJyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTFQ6CisgICAgICAqcysrID0gJzwnOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0dUOgorICAgICAgaWYgKGQgPT0gJyAnKQorICAgICAgeyBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICAqcyA9ICdcMCc7CisgICAgICAgIHJldHVybiBTT0FQX09LOworICAgICAgfQorICAgICAgKnMrKyA9ICc+JzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9RVDoKKyAgICAgIGlmIChjID09IGQpCisgICAgICB7ICpzID0gJ1wwJzsKKyAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgICB9CisgICAgICAqcysrID0gJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0FQOgorICAgICAgaWYgKGMgPT0gZCkKKyAgICAgIHsgKnMgPSAnXDAnOworICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICAgIH0KKyAgICAgICpzKysgPSAnXCcnOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnXHQnOgorICAgIGNhc2UgJ1xuJzoKKyAgICBjYXNlICdccic6CisgICAgY2FzZSAnICc6CisgICAgY2FzZSAnLyc6CisgICAgICBpZiAoZCA9PSAnICcpCisgICAgICB7IHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgICpzID0gJ1wwJzsKKyAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAgICpzKysgPSAoY2hhciljOworICAgIH0KKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFdJVEhfRkFTVAorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zdG9yZV9sYWIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBuKQoreyBzb2FwLT5sYWJpZHggPSAwOworICByZXR1cm4gc29hcF9hcHBlbmRfbGFiKHNvYXAsIHMsIG4pOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBXSVRIX0ZBU1QKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYXBwZW5kX2xhYihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgc2l6ZV90IG4pCit7IGlmIChzb2FwLT5sYWJpZHggKyBuID49IHNvYXAtPmxhYmxlbikKKyAgeyByZWdpc3RlciBjaGFyICp0ID0gc29hcC0+bGFiYnVmOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5sYXJnaW5nIGxvb2stYXNpZGUgYnVmZmVyIHRvIGFwcGVuZCBkYXRhLCBvbGQgc2l6ZT0lbHUiLCAodW5zaWduZWQgbG9uZylzb2FwLT5sYWJsZW4pKTsKKyAgICBpZiAoc29hcC0+bGFibGVuID09IDApCisgICAgICBzb2FwLT5sYWJsZW4gPSBTT0FQX0xBQkxFTjsKKyAgICB3aGlsZSAoc29hcC0+bGFiaWR4ICsgbiA+PSBzb2FwLT5sYWJsZW4pCisgICAgICBzb2FwLT5sYWJsZW4gPDw9IDE7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIsIG5ldyBzaXplPSVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpc29hcC0+bGFibGVuKSk7CisgICAgc29hcC0+bGFiYnVmID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHNvYXAtPmxhYmxlbik7CisgICAgaWYgKCFzb2FwLT5sYWJidWYpCisgICAgeyBpZiAodCkKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHQpOworICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgfQorICAgIGlmICh0KQorICAgIHsgbWVtY3B5KHNvYXAtPmxhYmJ1ZiwgdCwgc29hcC0+bGFiaWR4KTsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCB0KTsKKyAgICB9CisgIH0KKyAgaWYgKHMpCisgIHsgbWVtY3B5KHNvYXAtPmxhYmJ1ZiArIHNvYXAtPmxhYmlkeCwgcywgbik7CisgICAgc29hcC0+bGFiaWR4ICs9IG47CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wZWVrX2VsZW1lbnQoc3RydWN0IHNvYXAgKnNvYXApCit7CisjaWZkZWYgV0lUSF9ET00KKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAqKmF0dCA9IE5VTEw7CisgIHJlZ2lzdGVyIGNoYXIgKmxlYWQgPSBOVUxMOworI2VuZGlmCisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqdHA7CisgIGNvbnN0IGNoYXIgKnQ7CisgIHJlZ2lzdGVyIGNoYXIgKnM7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIGlmIChzb2FwLT5wZWVrZWQpCisgIHsgaWYgKCEqc29hcC0+dGFnKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9OT19UQUc7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgc29hcC0+cGVla2VkID0gMTsKKyAgYyA9IHNvYXBfZ2V0dXRmOChzb2FwKTsKKyNpZmRlZiBXSVRIX0RPTQorICAvKiB3aGl0ZXNwYWNlIGxlYWRpbmcgdG8gc3RhcnQgdGFnIGlzIG5vdCBpbnNpZ25pZmljYW50IGZvciBET00gKi8KKyAgaWYgKHNvYXBfYmxhbmsoYykpCisgIHsgc29hcC0+bGFiaWR4ID0gMDsKKyAgICBkbworICAgIHsgaWYgKHNvYXBfYXBwZW5kX2xhYihzb2FwLCBOVUxMLCAwKSkKKyAgICAgICAgcmV0dXJuIFNPQVBfRU9NOworICAgICAgcyA9IHNvYXAtPmxhYmJ1ZiArIHNvYXAtPmxhYmlkeDsKKyAgICAgIGkgPSBzb2FwLT5sYWJsZW4gLSBzb2FwLT5sYWJpZHg7CisgICAgICBzb2FwLT5sYWJpZHggPSBzb2FwLT5sYWJsZW47CisgICAgICB3aGlsZSAoc29hcF9ibGFuayhjKSAmJiBpLS0pCisgICAgICB7ICpzKysgPSBjOworICAgICAgICBjID0gc29hcF9nZXR1dGY4KHNvYXApOworICAgICAgfQorICAgIH0KKyAgICB3aGlsZSAoc29hcF9ibGFuayhjKSk7CisgICAgKnMgPSAnXDAnOworICAgIGxlYWQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT5sYWJidWYpOworICB9CisjZWxzZQorICB3aGlsZSAoc29hcF9ibGFuayhjKSkKKyAgICBjID0gc29hcF9nZXR1dGY4KHNvYXApOworI2VuZGlmCisgIGlmIChjICE9IFNPQVBfTFQpCisgIHsgKnNvYXAtPnRhZyA9ICdcMCc7CisgICAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworI2lmZGVmIFdJVEhfRE9NCisgICAgLyogd2hpdGVzcGFjZSBsZWFkaW5nIHRvIGVuZCB0YWcgaXMgbm90IGluc2lnbmlmaWNhbnQgZm9yIERPTSAqLworICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICAgICAgc29hcC0+ZG9tLT50YWlsID0gc29hcF9zdHJkdXAoc29hcCwgbGVhZCk7CisjZW5kaWYKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX05PX1RBRzsKKyAgfQorICBzID0gc29hcC0+dGFnOworICBkbyBjID0gc29hcF9nZXQxKHNvYXApOworICB3aGlsZSAoc29hcF9ibGFuayhjKSk7CisgIGkgPSBzaXplb2Yoc29hcC0+dGFnKTsKKyAgd2hpbGUgKGMgIT0gJz4nICYmIGMgIT0gJy8nICYmIHNvYXBfbm90YmxhbmsoYykpCisgIHsgaWYgKC0taSA+IDApCisgICAgICAqcysrID0gKGNoYXIpYzsKKyAgICBjID0gc29hcF9nZXQxKHNvYXApOworICB9CisgIHdoaWxlIChzb2FwX2JsYW5rKGMpKQorICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICpzID0gJ1wwJzsKKyAgc29hcC0+aWRbMF0gPSAnXDAnOworICBzb2FwLT5ocmVmWzBdID0gJ1wwJzsKKyAgc29hcC0+dHlwZVswXSA9ICdcMCc7CisgIHNvYXAtPmFycmF5VHlwZVswXSA9ICdcMCc7CisgIHNvYXAtPmFycmF5U2l6ZVswXSA9ICdcMCc7CisgIHNvYXAtPmFycmF5T2Zmc2V0WzBdID0gJ1wwJzsKKyAgc29hcC0+b3RoZXIgPSAwOworICBzb2FwLT5yb290ID0gLTE7CisgIHNvYXAtPnBvc2l0aW9uID0gMDsKKyAgc29hcC0+bnVsbCA9IDA7CisgIHNvYXAtPm11c3RVbmRlcnN0YW5kID0gMDsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqZWx0OworICAgIGVsdCA9IChzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50KSk7CisgICAgaWYgKCFlbHQpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICBlbHQtPm5leHQgPSBOVUxMOworICAgIGVsdC0+bnN0ciA9IE5VTEw7CisgICAgZWx0LT5uYW1lID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+dGFnKTsKKyAgICBlbHQtPnBybnQgPSBzb2FwLT5kb207CisgICAgZWx0LT5lbHRzID0gTlVMTDsKKyAgICBlbHQtPmF0dHMgPSBOVUxMOworICAgIGVsdC0+ZGF0YSA9IE5VTEw7CisgICAgZWx0LT53aWRlID0gTlVMTDsKKyAgICBlbHQtPnR5cGUgPSAwOworICAgIGVsdC0+bm9kZSA9IE5VTEw7CisgICAgZWx0LT5oZWFkID0gbGVhZDsKKyAgICBlbHQtPnRhaWwgPSBOVUxMOworICAgIGVsdC0+c29hcCA9IHNvYXA7CisgICAgaWYgKHNvYXAtPmRvbSkKKyAgICB7IHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICpwID0gc29hcC0+ZG9tLT5lbHRzOworICAgICAgaWYgKHApCisgICAgICB7IHdoaWxlIChwLT5uZXh0KQorICAgICAgICAgIHAgPSBwLT5uZXh0OworICAgICAgICBwLT5uZXh0ID0gZWx0OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBzb2FwLT5kb20tPmVsdHMgPSBlbHQ7CisgICAgfQorICAgIHNvYXAtPmRvbSA9IGVsdDsKKyAgICBhdHQgPSAmZWx0LT5hdHRzOworICB9CisjZW5kaWYKKyAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICAgIHRwLT52aXNpYmxlID0gMDsKKyAgd2hpbGUgKChpbnQpYyAhPSBFT0YgJiYgYyAhPSAnPicgJiYgYyAhPSAnLycpCisgIHsgcyA9IHNvYXAtPnRtcGJ1ZjsKKyAgICBpID0gc2l6ZW9mKHNvYXAtPnRtcGJ1Zik7CisgICAgd2hpbGUgKGMgIT0gJz0nICYmIGMgIT0gJz4nICYmIGMgIT0gJy8nICYmIHNvYXBfbm90YmxhbmsoYykpCisgICAgeyBpZiAoLS1pID4gMCkKKyAgICAgICAgKnMrKyA9IChjaGFyKWM7CisgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworICAgIH0KKyAgICAqcyA9ICdcMCc7CisgICAgaWYgKGkgPT0gc2l6ZW9mKHNvYXAtPnRtcGJ1ZikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1NZTlRBWF9FUlJPUjsKKyNpZmRlZiBXSVRIX0RPTQorICAgIC8qIGFkZCBhdHRyaWJ1dGUgbmFtZSB0byBkb20gKi8KKyAgICBpZiAoYXR0KQorICAgIHsgKmF0dCA9IChzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSkpOworICAgICAgIGlmICghKmF0dCkKKyAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgICgqYXR0KS0+bmV4dCA9IE5VTEw7CisgICAgICAgKCphdHQpLT5uc3RyID0gTlVMTDsKKyAgICAgICAoKmF0dCktPm5hbWUgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT50bXBidWYpOworICAgICAgICgqYXR0KS0+ZGF0YSA9IE5VTEw7CisgICAgICAgKCphdHQpLT53aWRlID0gTlVMTDsKKyAgICAgICAoKmF0dCktPnNvYXAgPSBzb2FwOworICAgIH0KKyNlbmRpZgorICAgIGlmICghc3RybmNtcChzb2FwLT50bXBidWYsICJ4bWxucyIsIDUpKQorICAgIHsgaWYgKHNvYXAtPnRtcGJ1Zls1XSA9PSAnOicpCisgICAgICB7IHNvYXAtPnRtcGJ1Zls1XSA9ICdcMCc7CisgICAgICAgIHQgPSBzb2FwLT50bXBidWYgKyA2OworICAgICAgfQorICAgICAgZWxzZSBpZiAoc29hcC0+dG1wYnVmWzVdKQorICAgICAgICB0ID0gTlVMTDsKKyAgICAgIGVsc2UKKyAgICAgICAgdCA9IFNPQVBfU1RSX0VPUzsKKyAgICB9CisgICAgZWxzZQorICAgICAgdCA9IE5VTEw7CisgICAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICAgIHsgaWYgKCFTT0FQX1NUUkNNUCh0cC0+bmFtZSwgc29hcC0+dG1wYnVmKSkKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghdHApCisgICAgeyB0cCA9IChzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUpICsgc3RybGVuKHNvYXAtPnRtcGJ1ZikpOworICAgICAgaWYgKCF0cCkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICBzdHJjcHkodHAtPm5hbWUsIHNvYXAtPnRtcGJ1Zik7CisgICAgICB0cC0+dmFsdWUgPSBOVUxMOworICAgICAgdHAtPnNpemUgPSAwOworICAgICAgdHAtPm5leHQgPSBzb2FwLT5hdHRyaWJ1dGVzOworICAgICAgc29hcC0+YXR0cmlidXRlcyA9IHRwOworICAgIH0KKyAgICB3aGlsZSAoc29hcF9ibGFuayhjKSkKKyAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgaWYgKGMgPT0gJz0nKQorICAgIHsgZG8gYyA9IHNvYXBfZ2V0dXRmOChzb2FwKTsKKyAgICAgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyAgICAgIGlmIChjICE9IFNPQVBfUVQgJiYgYyAhPSBTT0FQX0FQKQorICAgICAgeyBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICBjID0gJyAnOyAvKiBibGFuayBkZWxpbWl0ZXIgKi8KKyAgICAgIH0KKyAgICAgIGlmIChzb2FwX2dldGF0dHJ2YWwoc29hcCwgdHAtPnZhbHVlLCB0cC0+c2l6ZSwgYykpCisgICAgICB7CisjaWZkZWYgV0lUSF9GQVNUCisgICAgICAgIGlmIChzb2FwLT5lcnJvciAhPSBTT0FQX0VPTSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKwlpZiAoc29hcF9zdG9yZV9sYWIoc29hcCwgdHAtPnZhbHVlLCB0cC0+c2l6ZSkpCisJICByZXR1cm4gc29hcC0+ZXJyb3I7CisJaWYgKHRwLT52YWx1ZSkKKwkgIFNPQVBfRlJFRShzb2FwLCB0cC0+dmFsdWUpOworCWZvciAoOzspCisJeyBpZiAoc29hcF9nZXRhdHRydmFsKHNvYXAsIHNvYXAtPmxhYmJ1ZiArIHNvYXAtPmxhYmlkeCwgc29hcC0+bGFibGVuIC0gc29hcC0+bGFiaWR4LCBjKSkKKwkgIHsgaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfRU9NKQorCSAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKwkgICAgc29hcC0+bGFiaWR4ID0gc29hcC0+bGFibGVuOworCSAgICBpZiAoc29hcF9hcHBlbmRfbGFiKHNvYXAsIE5VTEwsIDApKQorCSAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKwkgIH0KKwkgIGVsc2UKKwkgICAgYnJlYWs7CisJfQorCWlmIChzb2FwLT5sYWJpZHgpCisgICAgICAgICAgdHAtPnNpemUgPSBzb2FwLT5sYWJsZW47CisJZWxzZQorCXsgdHAtPnNpemUgPSBzdHJsZW4oc29hcC0+bGFiYnVmKSArIDE7CisgICAgICAgICAgaWYgKHRwLT5zaXplIDwgU09BUF9MQUJMRU4pCisJICAgIHRwLT5zaXplID0gU09BUF9MQUJMRU47CisgICAgICAgIH0KKwlpZiAoISh0cC0+dmFsdWUgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgdHAtPnNpemUpKSkKKwkgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgICBzdHJjcHkodHAtPnZhbHVlLCBzb2FwLT5sYWJidWYpOworI2Vsc2UKKwlzaXplX3QgbjsKKyAgICAgICAgaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfRU9NKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICAgICAgICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBmb3IgKDs7KQorICAgICAgICB7IGlmICghKHMgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIFNPQVBfQkxLTEVOKSkpCisgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgICAgaWYgKHNvYXBfZ2V0YXR0cnZhbChzb2FwLCBzLCBTT0FQX0JMS0xFTiwgYykpCisgICAgICAgICAgeyBpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9FT00pCisgICAgICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwluID0gdHAtPnNpemUgKyBzb2FwLT5ibGlzdC0+c2l6ZTsKKyAgICAgICAgaWYgKCEocyA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBuKSkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICAgIGlmICh0cC0+dmFsdWUpCisgICAgICAgIHsgbWVtY3B5KHMsIHRwLT52YWx1ZSwgdHAtPnNpemUpOworICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCB0cC0+dmFsdWUpOworICAgICAgICB9CisgICAgICAgIHNvYXBfc2F2ZV9ibG9jayhzb2FwLCBzICsgdHAtPnNpemUsIDApOworICAgICAgICB0cC0+dmFsdWUgPSBzOworICAgICAgICB0cC0+c2l6ZSA9IG47CisjZW5kaWYKKyAgICAgIH0KKyAgICAgIGRvIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICB3aGlsZSAoc29hcF9ibGFuayhjKSk7CisgICAgICB0cC0+dmlzaWJsZSA9IDI7IC8qIHNlZW4gdGhpcyBhdHRyaWJ1dGUgdy8gdmFsdWUgKi8KKyNpZmRlZiBXSVRIX0RPTQorICAgICAgaWYgKGF0dCkKKyAgICAgICAgKCphdHQpLT5kYXRhID0gc29hcF9zdHJkdXAoc29hcCwgdHAtPnZhbHVlKTsKKyNlbmRpZgorICAgIH0KKyAgICBlbHNlCisgICAgICB0cC0+dmlzaWJsZSA9IDE7IC8qIHNlZW4gdGhpcyBhdHRyaWJ1dGUgdy9vIHZhbHVlICovCisjaWZkZWYgV0lUSF9ET00KKyAgICBpZiAoYXR0KQorICAgICAgYXR0ID0gJigqYXR0KS0+bmV4dDsKKyNlbmRpZgorICAgIGlmICh0ICYmIHRwLT52YWx1ZSkKKyAgICB7IGlmIChzb2FwX3B1c2hfbmFtZXNwYWNlKHNvYXAsIHQsIHRwLT52YWx1ZSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHRwLT52aXNpYmxlID0gMDsKKyAgICB9CisgIH0KKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoYXR0KQorICB7IHNvYXAtPmRvbS0+bnN0ciA9IHNvYXBfY3VycmVudF9uYW1lc3BhY2Uoc29hcCwgc29hcC0+dGFnKTsKKyAgICBmb3IgKGF0dCA9ICZzb2FwLT5kb20tPmF0dHM7ICphdHQ7IGF0dCA9ICYoKmF0dCktPm5leHQpCisgICAgICAoKmF0dCktPm5zdHIgPSBzb2FwX2N1cnJlbnRfbmFtZXNwYWNlKHNvYXAsICgqYXR0KS0+bmFtZSk7CisgIH0KKyNlbmRpZgorICBpZiAoKGludCljID09IEVPRikKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgaWYgKCEoc29hcC0+Ym9keSA9IChjICE9ICcvJykpKQorICAgIGRvIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworI2lmZGVmIFdJVEhfRE9NCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKQorICB7IGlmICghc29hcC0+Ym9keSAmJiBzb2FwLT5kb20tPnBybnQpCisgICAgICBzb2FwLT5kb20gPSBzb2FwLT5kb20tPnBybnQ7CisgIH0KKyNlbmRpZgorICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgIHsgaWYgKHRwLT52aXNpYmxlICYmIHRwLT52YWx1ZSkKKyAgICB7IGlmICghc3RyY21wKHRwLT5uYW1lLCAiaWQiKSkKKyAgICAgIHsgKnNvYXAtPmlkID0gJyMnOworICAgICAgICBzdHJuY3B5KHNvYXAtPmlkICsgMSwgdHAtPnZhbHVlLCBzaXplb2Yoc29hcC0+aWQpIC0gMik7CisgICAgICAgIHNvYXAtPmlkW3NpemVvZihzb2FwLT5pZCktMV0gPSAnXDAnOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIXN0cmNtcCh0cC0+bmFtZSwgImhyZWYiKSkKKyAgICAgIHsgc3RybmNweShzb2FwLT5ocmVmLCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT5ocmVmKSAtIDEpOworICAgICAgICBzb2FwLT5ocmVmW3NpemVvZihzb2FwLT5ocmVmKS0xXSA9ICdcMCc7CisgICAgICB9CisgICAgICBlbHNlIGlmICgoc29hcC0+dmVyc2lvbiA9PSAyIHx8IChzb2FwLT5tb2RlICYgU09BUF9YTUxfR1JBUEgpKSAmJiAhc3RyY21wKHRwLT5uYW1lLCAicmVmIikpCisgICAgICB7ICpzb2FwLT5ocmVmID0gJyMnOworICAgICAgICBzdHJuY3B5KHNvYXAtPmhyZWYgKyAxLCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT5ocmVmKSAtIDIpOworICAgICAgICBzb2FwLT5ocmVmW3NpemVvZihzb2FwLT5ocmVmKS0xXSA9ICdcMCc7CisgICAgICB9CisgICAgICBlbHNlIGlmICghc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJ4c2k6dHlwZSIpKQorICAgICAgeyBzdHJuY3B5KHNvYXAtPnR5cGUsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPnR5cGUpIC0gMSk7CisgICAgICAgIHNvYXAtPnR5cGVbc2l6ZW9mKHNvYXAtPnR5cGUpLTFdID0gJ1wwJzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHNvYXAtPnZlcnNpb24gPT0gMSAmJiAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOQzphcnJheVR5cGUiKSkKKyAgICAgIHsgcyA9IHNvYXBfc3RycmNocih0cC0+dmFsdWUsICdbJyk7CisgICAgICAgIGlmIChzICYmIChzaXplX3QpKHMgLSB0cC0+dmFsdWUpIDwgc2l6ZW9mKHNvYXAtPmFycmF5VHlwZSkpCisgICAgICAgIHsgc3RybmNweShzb2FwLT5hcnJheVR5cGUsIHRwLT52YWx1ZSwgcyAtIHRwLT52YWx1ZSk7CisgICAgICAgICAgc29hcC0+YXJyYXlUeXBlW3MgLSB0cC0+dmFsdWVdID0gJ1wwJzsKKyAgICAgICAgICBzdHJuY3B5KHNvYXAtPmFycmF5U2l6ZSwgcywgc2l6ZW9mKHNvYXAtPmFycmF5U2l6ZSkgLSAxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgc3RybmNweShzb2FwLT5hcnJheVR5cGUsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPmFycmF5VHlwZSkgLSAxKTsKKyAgICAgICAgc29hcC0+YXJyYXlTaXplW3NpemVvZihzb2FwLT5hcnJheVR5cGUpLTFdID0gJ1wwJzsKKyAgICAgICAgc29hcC0+YXJyYXlUeXBlW3NpemVvZihzb2FwLT5hcnJheVR5cGUpLTFdID0gJ1wwJzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHNvYXAtPnZlcnNpb24gPT0gMiAmJiAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOQzppdGVtVHlwZSIpKQorICAgICAgICBzdHJuY3B5KHNvYXAtPmFycmF5VHlwZSwgdHAtPnZhbHVlLCBzaXplb2Yoc29hcC0+YXJyYXlUeXBlKSAtIDEpOworICAgICAgZWxzZSBpZiAoc29hcC0+dmVyc2lvbiA9PSAyICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5DOmFycmF5U2l6ZSIpKQorICAgICAgICBzdHJuY3B5KHNvYXAtPmFycmF5U2l6ZSwgdHAtPnZhbHVlLCBzaXplb2Yoc29hcC0+YXJyYXlTaXplKSAtIDEpOworICAgICAgZWxzZSBpZiAoc29hcC0+dmVyc2lvbiA9PSAxICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5DOm9mZnNldCIpKQorICAgICAgICBzdHJuY3B5KHNvYXAtPmFycmF5T2Zmc2V0LCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT5hcnJheU9mZnNldCkpOworICAgICAgZWxzZSBpZiAoc29hcC0+dmVyc2lvbiA9PSAxICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5DOnBvc2l0aW9uIikpCisgICAgICAgIHNvYXAtPnBvc2l0aW9uID0gc29hcF9nZXRwb3NpdGlvbih0cC0+dmFsdWUsIHNvYXAtPnBvc2l0aW9ucyk7CisgICAgICBlbHNlIGlmIChzb2FwLT52ZXJzaW9uID09IDEgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTkM6cm9vdCIpKQorICAgICAgICBzb2FwLT5yb290ID0gKCghc3RyY21wKHRwLT52YWx1ZSwgIjEiKSB8fCAhc3RyY21wKHRwLT52YWx1ZSwgInRydWUiKSkpOworICAgICAgZWxzZSBpZiAoKHNvYXAtPnZlcnNpb24gPT0gMSAmJiAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOVjphY3RvciIpKQorICAgICAgICAgICAgfHwgKHNvYXAtPnZlcnNpb24gPT0gMiAmJiAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOVjpyb2xlIikpKQorICAgICAgeyBpZiAoKCFzb2FwLT5hY3RvciB8fCBzdHJjbXAoc29hcC0+YWN0b3IsIHRwLT52YWx1ZSkpCisgICAgICAgICAmJiBzdHJjbXAodHAtPnZhbHVlLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9hY3Rvci9uZXh0IikKKyAgICAgICAgICYmIHN0cmNtcCh0cC0+dmFsdWUsICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUvcm9sZS9uZXh0IikpCisgICAgICAgICAgc29hcC0+b3RoZXIgPSAxOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTlY6bXVzdFVuZGVyc3RhbmQiKQorICAgICAgICAgICAgJiYgKCFzdHJjbXAodHAtPnZhbHVlLCAiMSIpIHx8ICFzdHJjbXAodHAtPnZhbHVlLCAidHJ1ZSIpKSkKKyAgICAgICAgc29hcC0+bXVzdFVuZGVyc3RhbmQgPSAxOworICAgICAgZWxzZSBpZiAoKCFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgInhzaTpudWxsIikKKyAgICAgICAgICAgICB8fCAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJ4c2k6bmlsIikpCisgICAgICAgICAgICAmJiAoIXN0cmNtcCh0cC0+dmFsdWUsICIxIikKKyAgICAgICAgICAgICB8fCAhc3RyY21wKHRwLT52YWx1ZSwgInRydWUiKSkpCisgICAgICAgIHNvYXAtPm51bGwgPSAxOworICAgIH0KKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9yZXRyeShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICBzb2FwX3JldmVydChzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfcmV2ZXJ0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoIXNvYXAtPnBlZWtlZCkKKyAgeyBzb2FwLT5wZWVrZWQgPSAxOworICAgIGlmIChzb2FwLT5ib2R5KQorICAgICAgc29hcC0+bGV2ZWwtLTsKKyAgfQorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJldmVydGluZyBsYXN0IGVsZW1lbnQgKGxldmVsPSV1KVxuIiwgc29hcC0+bGV2ZWwpKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zdHJpbmdfb3V0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBpbnQgZmxhZykKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqdDsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICByZWdpc3RlciBzb2FwX3djaGFyIG1hc2sgPSAweEZGRkZGRjgwVUw7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgc29hcC0+ZG9tLT5kYXRhID0gc29hcF9zdHJkdXAoc29hcCwgcyk7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNlbmRpZgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfQ19VVEZTVFJJTkcpCisgICAgbWFzayA9IDA7CisgIHQgPSBzOworICB3aGlsZSAoKGMgPSAqdCsrKSkKKyAgeyBzd2l0Y2ggKGMpCisgICAgeyAKKyAgICBjYXNlIDk6CisgICAgICBpZiAoZmxhZykKKyAgICAgIHsgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICImI3g5OyIsIDUpKQorCSAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBzID0gdDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTA6CisgICAgICBpZiAoZmxhZyB8fCAhKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpKQorICAgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIiYjeEE7IiwgNSkpCisJICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHMgPSB0OworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAxMzoKKyAgICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiJiN4RDsiLCA1KSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgcyA9IHQ7CisgICAgICBicmVhazsKKyAgICBjYXNlICcmJzoKKyAgICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiJmFtcDsiLCA1KSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgcyA9IHQ7CisgICAgICBicmVhazsKKyAgICBjYXNlICc8JzoKKyAgICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiJmx0OyIsIDQpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBzID0gdDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJz4nOgorICAgICAgaWYgKCFmbGFnKQorICAgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIiZndDsiLCA0KSkKKwkgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgcyA9IHQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICciJzoKKyAgICAgIGlmIChmbGFnKQorICAgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIiZxdW90OyIsIDYpKQorCSAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBzID0gdDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZkZWYgSEFWRV9NQlRPV0MKKyAgICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9DX01CU1RSSU5HKQorICAgICAgeyB3Y2hhcl90IHdjOworICAgICAgICByZWdpc3RlciBpbnQgbSA9IG1idG93Yygmd2MsIHQgLSAxLCBNQl9DVVJfTUFYKTsKKyAgICAgICAgaWYgKG0gPiAwICYmIHdjICE9IGMpCisgICAgICAgIHsgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3B1dHV0Zjgoc29hcCwgd2MpKQorICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworCSAgcyA9IHQgKz0gbSAtIDE7CisJICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisjZW5kaWYKKyAgICAgIGlmIChjICYgbWFzaykKKyAgICAgIHsgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3B1dHV0Zjgoc29hcCwgKHVuc2lnbmVkIGNoYXIpYykpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBzID0gdDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9zdHJpbmdfaW4oc3RydWN0IHNvYXAgKnNvYXAsIGludCBmbGFnLCBsb25nIG1pbmxlbiwgbG9uZyBtYXhsZW4pCit7IHJlZ2lzdGVyIGNoYXIgKnM7CisgIGNoYXIgKnQgPSBOVUxMOworICByZWdpc3RlciBzaXplX3QgaTsKKyAgcmVnaXN0ZXIgbG9uZyBsID0gMDsKKyAgcmVnaXN0ZXIgaW50IG4gPSAwOworICByZWdpc3RlciBpbnQgbSA9IDA7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyNpZiAhZGVmaW5lZChXSVRIX0xFQU5FUikgJiYgZGVmaW5lZChIQVZFX1dDVE9NQikKKyAgY2hhciBidWZbTUJfTEVOX01BWCA+IDggPyBNQl9MRU5fTUFYIDogOF07CisjZWxzZQorICBjaGFyIGJ1Zls4XTsKKyNlbmRpZgorICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVhZGluZyBzdHJpbmcgY29udGVudFxuIikpOworICBpZiAoc29hcC0+cGVla2VkKQorICB7IGlmICghc29hcC0+Ym9keSkKKyAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgqc29hcC0+dGFnKQorICAgIHsgbiA9IDE7CisgICAgICBzb2FwLT5wZWVrZWQgPSAwOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIHQgPSBzb2FwLT50bXBidWY7CisgICAgICB0WzBdID0gJzwnOworICAgICAgc3RybmNweSh0ICsgMSwgc29hcC0+dGFnLCBzaXplb2Yoc29hcC0+dG1wYnVmKSAtIDEpOworICAgICAgc3RybmNhdCh0LCAiPiIsIHNpemVvZihzb2FwLT50bXBidWYpKTsKKyAgICAgIG0gPSBzdHJsZW4oc29hcC0+dGFnKSArIDI7CisjZW5kaWYKKyAgICB9CisgIH0KKyNpZmRlZiBXSVRIX0NEQVRBCisgIGlmICghZmxhZykKKyAgeyByZWdpc3RlciBpbnQgc3RhdGUgPSAwOworI2lmZGVmIFdJVEhfRkFTVAorICAgIHNvYXAtPmxhYmlkeCA9IDA7CQkJLyogdXNlIGxvb2stYXNpZGUgYnVmZmVyICovCisjZWxzZQorICAgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgICAgZm9yICg7OykKKyAgICB7IAorI2lmZGVmIFdJVEhfRkFTVAorICAgICAgcmVnaXN0ZXIgc2l6ZV90IGs7CisgICAgICBpZiAoc29hcF9hcHBlbmRfbGFiKHNvYXAsIE5VTEwsIDApKQkvKiBhbGxvY2F0ZSBtb3JlIHNwYWNlIGluIGxvb2stYXNpZGUgYnVmZmVyIGlmIG5lY2Vzc2FyeSAqLworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIHMgPSBzb2FwLT5sYWJidWYgKyBzb2FwLT5sYWJpZHg7CS8qIHNwYWNlIHRvIHBvcHVsYXRlICovCisgICAgICBrID0gc29hcC0+bGFibGVuIC0gc29hcC0+bGFiaWR4OwkvKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlICovCisgICAgICBzb2FwLT5sYWJpZHggPSBzb2FwLT5sYWJsZW47CS8qIGNsYWltIHRoaXMgc3BhY2UgKi8KKyNlbHNlCisgICAgICByZWdpc3RlciBzaXplX3QgayA9IFNPQVBfQkxLTEVOOworICAgICAgaWYgKCEocyA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgaykpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICAgICAgZm9yIChpID0gMDsgaSA8IGs7IGkrKykKKyAgICAgIHsgaWYgKG0gPiAwKQorICAgICAgICB7ICpzKysgPSAqdCsrOwkvKiBjb3B5IG11bHRpYnl0ZSBjaGFyYWN0ZXJzICovCisJICBtLS07CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKwlpZiAoKGludCljID09IEVPRikKKyAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgaWYgKGMgPj0gMHg4MCAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19MQVRJTikpCisgICAgICAgIHsgc29hcF91bmdldChzb2FwLCBjKTsKKwkgIGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisJICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfQ19VVEZTVFJJTkcpCisgICAgICAgICAgeyBpZiAoKGMgJiAweDgwMDAwMDAwKSAmJiBjID49IC0weDdGRkZGRjgwICYmIGMgPCBTT0FQX0FQKQorICAgICAgICAgICAgeyBjICY9IDB4N0ZGRkZGRkY7CisgICAgICAgICAgICAgIHQgPSBidWY7CisgICAgICAgICAgICAgIGlmIChjIDwgMHgwODAwKQorICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhDMCB8ICgoYyA+PiA2KSAmIDB4MUYpKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7IGlmIChjIDwgMHgwMTAwMDApCisgICAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RTAgfCAoKGMgPj4gMTIpICYgMHgwRikpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7IGlmIChjIDwgMHgyMDAwMDApCisgICAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhGMCB8ICgoYyA+PiAxOCkgJiAweDA3KSk7CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICB7IGlmIChjIDwgMHgwNDAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjggfCAoKGMgPj4gMjQpICYgMHgwMykpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsgKnQrKyA9IChjaGFyKSgweEZDIHwgKChjID4+IDMwKSAmIDB4MDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMjQpICYgMHgzRikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAxOCkgJiAweDNGKSk7CisgICAgICAgICAgICAgICAgICB9ICAgICAKKyAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAxMikgJiAweDNGKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoYyAmIDB4M0YpKTsKKwkgICAgICBtID0gKGludCkodCAtIGJ1ZikgLSAxOworICAgICAgICAgICAgICB0ID0gYnVmOworICAgICAgICAgICAgICAqcysrID0gKnQrKzsKKyAgICAgICAgICAgICAgY29udGludWU7CisJICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKwlzd2l0Y2ggKHN0YXRlKQorICAgICAgICB7IGNhc2UgMToKKyAgICAgICAgICAgIGlmIChjID09ICddJykKKwkgICAgICBzdGF0ZSA9IDQ7CisJICAgICpzKysgPSBjOworCSAgICBjb250aW51ZTsKKwkgIGNhc2UgMjoKKwkgICAgaWYgKGMgPT0gJy0nKQorICAgICAgICAgICAgICBzdGF0ZSA9IDY7CisJICAgICpzKysgPSBjOworCSAgICBjb250aW51ZTsKKwkgIGNhc2UgMzoKKwkgICAgaWYgKGMgPT0gJz8nKQorCSAgICAgIHN0YXRlID0gODsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworICAgICAgICAgIC8qIENEQVRBICovCisJICBjYXNlIDQ6CisJICAgIGlmIChjID09ICddJykKKyAgICAgICAgICAgICAgc3RhdGUgPSA1OworCSAgICBlbHNlCisJICAgICAgc3RhdGUgPSAxOworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisJICBjYXNlIDU6CisJICAgIGlmIChjID09ICc+JykKKwkgICAgICBzdGF0ZSA9IDA7CisJICAgIGVsc2UKKwkgICAgICBzdGF0ZSA9IDE7CisJICAgICpzKysgPSBjOworCSAgICBjb250aW51ZTsKKyAgICAgICAgICAvKiBjb21tZW50ICovCisgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgaWYgKGMgPT0gJy0nKQorCSAgICAgIHN0YXRlID0gNzsKKwkgICAgZWxzZQorCSAgICAgIHN0YXRlID0gMjsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIGlmIChjID09ICc+JykKKwkgICAgICBzdGF0ZSA9IDA7CisJICAgIGVsc2UKKwkgICAgICBzdGF0ZSA9IDI7CisJICAgICpzKysgPSBjOworCSAgICBjb250aW51ZTsKKyAgICAgICAgICAvKiBQSSAqLworCSAgY2FzZSA4OgorICAgICAgICAgICAgaWYgKGMgPT0gJz4nKQorCSAgICAgIHN0YXRlID0gMDsKKwkgICAgZWxzZQorCSAgICAgIHN0YXRlID0gMzsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoYykKKyAgICAgICAgeworICAgICAgICBjYXNlICcvJzoKKyAgICAgICAgICBpZiAobiA+IDApCisgICAgICAgICAgeyBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICAgICAgICAgICAgaWYgKGMgPT0gJz4nKQorICAgICAgICAgICAgICBuLS07CisgICAgICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICAgIH0KKyAgICAgICAgICAqcysrID0gJy8nOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICc8JzoKKwkgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisJICBpZiAoYyA9PSAnLycpCisJICB7IGlmIChuID09IDApCisJICAgIHsgYyA9IFNPQVBfVFQ7CisJICAgICAgZ290byBlbmQ7CisJICAgIH0KKwkgICAgbi0tOworCSAgfQorCSAgZWxzZSBpZiAoYyA9PSAnIScpCisJICB7IGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisJICAgIGlmIChjID09ICdbJykKKyAgICAgICAgICAgIHsgZG8gYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgICAgICAgICAgICAgd2hpbGUgKChpbnQpYyAhPSBFT0YgJiYgYyAhPSAnWycpOworICAgICAgICAgICAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgICAgICAgICAgZ290byBlbmQ7CisJICAgICAgdCA9IChjaGFyKikiIVtDREFUQVsiOworCSAgICAgIG0gPSA4OworCSAgICAgIHN0YXRlID0gMTsKKwkgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnLScpCisJICAgIHsgaWYgKChjID0gc29hcF9nZXRjaGFyKHNvYXApKSA9PSAnLScpCisJICAgICAgICBzdGF0ZSA9IDI7CisJICAgICAgdCA9IChjaGFyKikiIS0iOworCSAgICAgIG0gPSAyOworCSAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7IHQgPSAoY2hhciopIiEiOworCSAgICAgIG0gPSAxOworCSAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisJICAgIH0KKwkgICAgKnMrKyA9ICc8JzsKKwkgICAgYnJlYWs7CisJICB9CisJICBlbHNlIGlmIChjID09ICc/JykKKwkgICAgc3RhdGUgPSAzOworCSAgZWxzZQorCSAgICBuKys7CisgICAgICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgICAqcysrID0gJzwnOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICc+JzoKKyAgICAgICAgICAqcysrID0gJz4nOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICAqcysrID0gJyInOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmZGVmIEhBVkVfV0NUT01CCisgICAgICAgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0NfTUJTVFJJTkcpCisgICAgICAgICAgeyBtID0gd2N0b21iKGJ1ZiwgYyAmIDB4N0ZGRkZGRkYpOworICAgICAgICAgICAgaWYgKG0gPj0gMSAmJiBtIDw9IChpbnQpTUJfQ1VSX01BWCkKKyAgICAgICAgICAgIHsgdCA9IGJ1ZjsKKyAgICAgICAgICAgICAgKnMrKyA9ICp0Kys7CisgICAgICAgICAgICAgIG0tLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgKnMrKyA9IFNPQVBfVU5LTk9XTl9DSEFSOworCSAgICAgIG0gPSAwOworCSAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyNlbmRpZgorI2VuZGlmCisgICAgICAgICAgICAqcysrID0gKGNoYXIpKGMgJiAweEZGKTsKKyAgICAgICAgfQorCWwrKzsKKyAgICAgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiBtYXhsZW4gPj0gMCAmJiBsID4gbWF4bGVuKQorICAgICAgICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJTdHJpbmcgdG9vIGxvbmc6IG1heGxlbj0lbGRcbiIsIG1heGxlbikpOworICAgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9MRU5HVEg7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyNlbmRpZgorI2lmZGVmIFdJVEhfRkFTVAorICBzb2FwLT5sYWJpZHggPSAwOwkJCS8qIHVzZSBsb29rLWFzaWRlIGJ1ZmZlciAqLworI2Vsc2UKKyAgaWYgKHNvYXBfbmV3X2Jsb2NrKHNvYXApKQorICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgIGZvciAoOzspCisgIHsgCisjaWZkZWYgV0lUSF9GQVNUCisgICAgcmVnaXN0ZXIgc2l6ZV90IGs7CisgICAgaWYgKHNvYXBfYXBwZW5kX2xhYihzb2FwLCBOVUxMLCAwKSkJLyogYWxsb2NhdGUgbW9yZSBzcGFjZSBpbiBsb29rLWFzaWRlIGJ1ZmZlciBpZiBuZWNlc3NhcnkgKi8KKyAgICAgIHJldHVybiBOVUxMOworICAgIHMgPSBzb2FwLT5sYWJidWYgKyBzb2FwLT5sYWJpZHg7CS8qIHNwYWNlIHRvIHBvcHVsYXRlICovCisgICAgayA9IHNvYXAtPmxhYmxlbiAtIHNvYXAtPmxhYmlkeDsJLyogbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSAqLworICAgIHNvYXAtPmxhYmlkeCA9IHNvYXAtPmxhYmxlbjsJLyogY2xhaW0gdGhpcyBzcGFjZSAqLworI2Vsc2UKKyAgICByZWdpc3RlciBzaXplX3QgayA9IFNPQVBfQkxLTEVOOworICAgIGlmICghKHMgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIGspKSkKKyAgICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgICAgZm9yIChpID0gMDsgaSA8IGs7IGkrKykKKyAgICB7IGlmIChtID4gMCkKKyAgICAgIHsgKnMrKyA9ICp0Kys7CS8qIGNvcHkgbXVsdGlieXRlIGNoYXJhY3RlcnMgKi8KKyAgICAgICAgbS0tOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9DX1VURlNUUklORykKKyAgICAgIHsgaWYgKCgoYyA9IHNvYXBfZ2V0KHNvYXApKSAmIDB4ODAwMDAwMDApICYmIGMgPj0gLTB4N0ZGRkZGODAgJiYgYyA8IFNPQVBfQVApCisgICAgICAgIHsgYyAmPSAweDdGRkZGRkZGOworICAgICAgICAgIHQgPSBidWY7CisgICAgICAgICAgaWYgKGMgPCAweDA4MDApCisgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4QzAgfCAoKGMgPj4gNikgJiAweDFGKSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsgaWYgKGMgPCAweDAxMDAwMCkKKyAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEUwIHwgKChjID4+IDEyKSAmIDB4MEYpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgaWYgKGMgPCAweDIwMDAwMCkKKyAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjAgfCAoKGMgPj4gMTgpICYgMHgwNykpOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsgaWYgKGMgPCAweDA0MDAwMDAwKQorICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEY4IHwgKChjID4+IDI0KSAmIDB4MDMpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeyAqdCsrID0gKGNoYXIpKDB4RkMgfCAoKGMgPj4gMzApICYgMHgwMSkpOworICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDI0KSAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDE4KSAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgfSAgICAgCisgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAxMikgJiAweDNGKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gNikgJiAweDNGKSk7CisgICAgICAgICAgfQorICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8IChjICYgMHgzRikpOworCSAgbSA9IChpbnQpKHQgLSBidWYpIC0gMTsKKyAgICAgICAgICB0ID0gYnVmOworICAgICAgICAgICpzKysgPSAqdCsrOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisgICAgICBzd2l0Y2ggKGMpCisgICAgICB7CisgICAgICBjYXNlIFNPQVBfVFQ6CisgICAgICAgIGlmIChuID09IDApCisgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIG4tLTsKKyAgICAgICAgKnMrKyA9ICc8JzsKKyAgICAgICAgdCA9IChjaGFyKikiLyI7CisJbSA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTT0FQX0xUOgorICAgICAgICBuKys7CisgICAgICAgICpzKysgPSAnPCc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTT0FQX0dUOgorICAgICAgICAqcysrID0gJz4nOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9RVDoKKyAgICAgICAgKnMrKyA9ICciJzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfQVA6CisgICAgICAgICpzKysgPSAnXCcnOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJy8nOgorICAgICAgICBpZiAobiA+IDApCisgICAgICAgIHsgYyA9IHNvYXBfZ2V0KHNvYXApOworICAgICAgICAgIGlmIChjID09IFNPQVBfR1QpCisgICAgICAgICAgICBuLS07CisgICAgICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgfQorICAgICAgICAqcysrID0gJy8nOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJzwnIHwgMHg4MDAwMDAwMDoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9ICc8JzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAnJic7CisgICAgICAgICAgdCA9IChjaGFyKikibHQ7IjsKKwkgIG0gPSAzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnPicgfCAweDgwMDAwMDAwOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gJz4nOworICAgICAgICBlbHNlCisgICAgICAgIHsgKnMrKyA9ICcmJzsKKyAgICAgICAgICB0ID0gKGNoYXIqKSJndDsiOworCSAgbSA9IDM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICcmJyB8IDB4ODAwMDAwMDA6CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICpzKysgPSAnJic7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAqcysrID0gJyYnOworICAgICAgICAgIHQgPSAoY2hhciopImFtcDsiOworCSAgbSA9IDQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICciJyB8IDB4ODAwMDAwMDA6CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICpzKysgPSAnIic7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAqcysrID0gJyYnOworICAgICAgICAgIHQgPSAoY2hhciopInF1b3Q7IjsKKwkgIG0gPSA1OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnXCcnIHwgMHg4MDAwMDAwMDoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9ICdcJyc7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAqcysrID0gJyYnOworICAgICAgICAgIHQgPSAoY2hhciopImFwb3M7IjsKKwkgIG0gPSA1OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgICAgZ290byBlbmQ7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZkZWYgSEFWRV9XQ1RPTUIKKyAgICAgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0NfTUJTVFJJTkcpCisgICAgICAgIHsgbSA9IHdjdG9tYihidWYsIGMgJiAweDdGRkZGRkZGKTsKKyAgICAgICAgICBpZiAobSA+PSAxICYmIG0gPD0gKGludClNQl9DVVJfTUFYKQorICAgICAgICAgIHsgdCA9IGJ1ZjsKKyAgICAgICAgICAgICpzKysgPSAqdCsrOworICAgICAgICAgICAgbS0tOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeyAqcysrID0gU09BUF9VTktOT1dOX0NIQVI7CisJICAgIG0gPSAwOworCSAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZgorI2VuZGlmCisgICAgICAgICAgKnMrKyA9IChjaGFyKShjICYgMHhGRik7CisgICAgICB9CisgICAgICBsKys7CisgICAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIG1heGxlbiA+PSAwICYmIGwgPiBtYXhsZW4pCisgICAgICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJTdHJpbmcgdG9vIGxvbmc6IG1heGxlbj0lbGRcbiIsIG1heGxlbikpOworICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfTEVOR1RIOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICB9CisgIH0KK2VuZDoKKyAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgKnMgPSAnXDAnOworI2lmZGVmIFdJVEhfRkFTVAorICB0ID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+bGFiYnVmKTsKKyNlbHNlCisgIHNvYXBfc2l6ZV9ibG9jayhzb2FwLCBpKzEpOworICB0ID0gc29hcF9zYXZlX2Jsb2NrKHNvYXAsIE5VTEwsIDApOworI2VuZGlmCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgbCA8IG1pbmxlbikKKyAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiU3RyaW5nIHRvbyBzaG9ydDogJWxkIGNoYXJzLCBtaW5sZW49JWxkXG4iLCBsLCBtaW5sZW4pKTsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfTEVOR1RIOworICAgIHJldHVybiBOVUxMOworICB9CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgaWYgKGZsYWcgPT0gMykKKyAgICAgIHNvYXAtPmRvbS0+dGFpbCA9IHQ7CisgICAgZWxzZQorICAgICAgc29hcC0+ZG9tLT5kYXRhID0gdDsKKyAgfQorI2VuZGlmCisgIGlmIChmbGFnID09IDIpCisgICAgaWYgKHNvYXBfczJRTmFtZShzb2FwLCB0LCAmdCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHQ7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfd3N0cmluZ19vdXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHdjaGFyX3QgKnMsIGludCBmbGFnKQoreyBjb25zdCBjaGFyICp0OworICBjaGFyIHRtcDsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IHdjaGFyX3QgKnIgPSAod2NoYXJfdCopczsKKyAgICBpbnQgbiA9IDE7CisgICAgd2hpbGUgKCpyKyspCisgICAgICBuKys7CisgICAgc29hcC0+ZG9tLT53aWRlID0gciA9ICh3Y2hhcl90Kilzb2FwX21hbGxvYyhzb2FwLCBuICogc2l6ZW9mKHdjaGFyX3QpKTsKKyAgICB3aGlsZSAobi0tKQorICAgICAgKnIrKyA9ICpzKys7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNlbmRpZgorICB3aGlsZSAoKGMgPSAqcysrKSkKKyAgeyBzd2l0Y2ggKGMpCisgICAgeyAKKyAgICBjYXNlIDk6CisgICAgICBpZiAoZmxhZykKKyAgICAgICAgdCA9ICImI3g5OyI7CisgICAgICBlbHNlCisgICAgICAgIHQgPSAiXHQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMDoKKyAgICAgIGlmIChmbGFnIHx8ICEoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkpCisgICAgICAgIHQgPSAiJiN4QTsiOworICAgICAgZWxzZQorICAgICAgICB0ID0gIlxuIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTM6CisgICAgICB0ID0gIiYjeEQ7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJyYnOgorICAgICAgdCA9ICImYW1wOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICc8JzoKKyAgICAgIHQgPSAiJmx0OyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICc+JzoKKyAgICAgIGlmIChmbGFnKQorICAgICAgICB0ID0gIj4iOworICAgICAgZWxzZQorCXQgPSAiJmd0OyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICciJzoKKyAgICAgIGlmIChmbGFnKQorICAgICAgICB0ID0gIiZxdW90OyI7CisgICAgICBlbHNlCisgICAgICAgIHQgPSAiXCIiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChjID4gMCAmJiBjIDwgMHg4MCkKKyAgICAgIHsgdG1wID0gKGNoYXIpYzsKKyAgICAgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgJnRtcCwgMSkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgICAgZWxzZSBpZiAoc29hcF9wdXR1dGY4KHNvYXAsICh1bnNpZ25lZCBsb25nKWMpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKHNvYXBfc2VuZChzb2FwLCB0KSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQord2NoYXJfdCAqCitTT0FQX0ZNQUMyCitzb2FwX3dzdHJpbmdfaW4oc3RydWN0IHNvYXAgKnNvYXAsIGludCBmbGFnLCBsb25nIG1pbmxlbiwgbG9uZyBtYXhsZW4pCit7IHdjaGFyX3QgKnM7CisgIHJlZ2lzdGVyIGludCBpLCBuID0gMDsKKyAgcmVnaXN0ZXIgbG9uZyBsID0gMDsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICBjb25zdCBjaGFyICp0ID0gTlVMTDsKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlYWRpbmcgd2lkZSBzdHJpbmcgY29udGVudFxuIikpOworICBpZiAoc29hcC0+cGVla2VkKQorICB7IGlmICghc29hcC0+Ym9keSkKKyAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgqc29hcC0+dGFnKQorICAgIHsgbiA9IDE7CisgICAgICBzb2FwLT5wZWVrZWQgPSAwOworICAgIH0KKyAgfQorICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgcmV0dXJuIE5VTEw7CisgIGZvciAoOzspCisgIHsgaWYgKCEocyA9ICh3Y2hhcl90Kilzb2FwX3B1c2hfYmxvY2soc29hcCwgc2l6ZW9mKHdjaGFyX3QpKlNPQVBfQkxLTEVOKSkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgU09BUF9CTEtMRU47IGkrKykKKyAgICB7IGlmICh0KQorICAgICAgeyAqcysrID0gKHdjaGFyX3QpKnQrKzsKKyAgICAgICAgaWYgKCEqdCkKKyAgICAgICAgICB0ID0gTlVMTDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBjID0gc29hcF9nZXR1dGY4KHNvYXApOworICAgICAgc3dpdGNoIChjKQorICAgICAgeworICAgICAgY2FzZSBTT0FQX1RUOgorICAgICAgICBpZiAobiA9PSAwKQorICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICBuLS07CisgICAgICAgICpzKysgPSAnPCc7CisgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgJy8nKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfTFQ6CisgICAgICAgIG4rKzsKKyAgICAgICAgKnMrKyA9ICc8JzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfR1Q6CisgICAgICAgICpzKysgPSAnPic7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTT0FQX1FUOgorICAgICAgICAqcysrID0gJyInOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9BUDoKKyAgICAgICAgKnMrKyA9ICdcJyc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnLyc6CisgICAgICAgIGlmIChuID4gMCkKKyAgICAgICAgeyBjID0gc29hcF9nZXR1dGY4KHNvYXApOworICAgICAgICAgIGlmIChjID09IFNPQVBfR1QpCisgICAgICAgICAgICBuLS07CisgICAgICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgfQorICAgICAgICAqcysrID0gJy8nOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJzwnOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gKHNvYXBfd2NoYXIpJzwnOworICAgICAgICBlbHNlCisgICAgICAgIHsgKnMrKyA9IChzb2FwX3djaGFyKScmJzsKKyAgICAgICAgICB0ID0gImx0OyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICc+JzoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9IChzb2FwX3djaGFyKSc+JzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAoc29hcF93Y2hhciknJic7CisgICAgICAgICAgdCA9ICJndDsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnIic6CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICpzKysgPSAoc29hcF93Y2hhciknIic7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAqcysrID0gKHNvYXBfd2NoYXIpJyYnOworICAgICAgICAgIHQgPSAicXVvdDsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICpzKysgPSAod2NoYXJfdCljICYgMHg3RkZGRkZGRjsKKyAgICAgIH0KKyAgICAgIGwrKzsKKyAgICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgbWF4bGVuID49IDAgJiYgbCA+IG1heGxlbikKKyAgICAgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlN0cmluZyB0b28gbG9uZzogbWF4bGVuPSVsZFxuIiwgbWF4bGVuKSk7CisgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9MRU5HVEg7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgIH0KKyAgfQorZW5kOgorICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAqcyA9ICdcMCc7CisgIHNvYXBfc2l6ZV9ibG9jayhzb2FwLCBzaXplb2Yod2NoYXJfdCkgKiAoaSArIDEpKTsKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiBsIDwgbWlubGVuKQorICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJTdHJpbmcgdG9vIHNob3J0OiAlbGQgY2hhcnMsIG1pbmxlbj0lbGRcbiIsIGwsIG1pbmxlbikpOworICAgIHNvYXAtPmVycm9yID0gU09BUF9MRU5HVEg7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcyA9ICh3Y2hhcl90Kilzb2FwX3NhdmVfYmxvY2soc29hcCwgTlVMTCwgMCk7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgICAgc29hcC0+ZG9tLT53aWRlID0gczsKKyNlbmRpZgorICByZXR1cm4gczsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfaW50MnMoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuKQoreyByZXR1cm4gc29hcF9sb25nMnMoc29hcCwgKGxvbmcpbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0aW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgaW50ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX2xvbmcycyhzb2FwLCAobG9uZykqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJpbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGludCAqcCkKK3sgaWYgKHMpCisgIHsgY2hhciAqcjsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgIHNvYXBfcmVzZXRfZXJybm87CisjZW5kaWYKKyNlbmRpZgorICAgICpwID0gKGludClzb2FwX3N0cnRvbChzLCAmciwgMTApOworICAgIGlmICgocyA9PSByICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkgfHwgKnIKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICB8fCBzb2FwX2Vycm5vID09IFNPQVBfRVJBTkdFCisjZW5kaWYKKyNlbmRpZgorICAgICkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludCAqCitTT0FQX0ZNQUMyCitzb2FwX2luaW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6aW50IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6c2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpieXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKGludCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKGludCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChpbnQqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YoaW50KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJpbnQoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfbG9uZzJzKHN0cnVjdCBzb2FwICpzb2FwLCBsb25nIG4pCit7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiJWxkIiwgbik7CisgIHJldHVybiBzb2FwLT50bXBidWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0bG9uZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGxvbmcgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfbG9uZzJzKHNvYXAsICpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMmxvbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGxvbmcgKnApCit7IGlmIChzKQorICB7IGNoYXIgKnI7CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBzb2FwX3Jlc2V0X2Vycm5vOworI2VuZGlmCisjZW5kaWYKKyAgICAqcCA9IHNvYXBfc3RydG9sKHMsICZyLCAxMCk7CisgICAgaWYgKChzID09IHIgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKSB8fCAqcgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgIHx8IHNvYXBfZXJybm8gPT0gU09BUF9FUkFOR0UKKyNlbmRpZgorI2VuZGlmCisgICAgKQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorbG9uZyAqCitTT0FQX0ZNQUMyCitzb2FwX2lubG9uZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBsb25nICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjppbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpzaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAobG9uZyopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKGxvbmcpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAobG9uZyopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihsb25nKSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJsb25nKHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX0xPTkc2NDJzKHN0cnVjdCBzb2FwICpzb2FwLCBMT05HNjQgbikKK3sgc3ByaW50Zihzb2FwLT50bXBidWYsIFNPQVBfTE9OR19GT1JNQVQsIG4pOworICByZXR1cm4gc29hcC0+dG1wYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dExPTkc2NChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IExPTkc2NCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9MT05HNjQycyhzb2FwLCAqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJMT05HNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIExPTkc2NCAqcCkKK3sgaWYgKHMpCisgIHsKKyNpZmRlZiBIQVZFX1NUUlRPTEwKKyAgICBjaGFyICpyOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgc29hcF9yZXNldF9lcnJubzsKKyNlbmRpZgorI2VuZGlmCisgICAgKnAgPSBzdHJ0b2xsKHMsICZyLCAxMCk7CisgICAgaWYgKChzID09IHIgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKSB8fCAqcgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICAgfHwgc29hcF9lcnJubyA9PSBTT0FQX0VSQU5HRQorI2VuZGlmCisjZW5kaWYKKyAgICAgICkKKyNlbHNlCisjIGlmZGVmIEhBVkVfU1NDQU5GCisgICAgaWYgKHNzY2FuZihzLCBTT0FQX0xPTkdfRk9STUFULCBwKSAhPSAxKQorIyBlbmRpZgorI2VuZGlmCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitMT05HNjQgKgorU09BUF9GTUFDMgorc29hcF9pbkxPTkc2NChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBMT05HNjQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpwb3NpdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpuZWdhdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpub25Qb3NpdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpub25OZWdhdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpsb25nIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6aW50IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6c2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpieXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKExPTkc2NCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKExPTkc2NCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChMT05HNjQqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YoTE9ORzY0KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJMT05HNjQoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfYnl0ZTJzKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyIG4pCit7IHJldHVybiBzb2FwX2xvbmcycyhzb2FwLCAobG9uZyluKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRieXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgY2hhciAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9sb25nMnMoc29hcCwgKGxvbmcpKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MyYnl0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgY2hhciAqcCkKK3sgaWYgKHMpCisgIHsgbG9uZyBuOworICAgIGNoYXIgKnI7CisgICAgbiA9IHNvYXBfc3RydG9sKHMsICZyLCAxMCk7CisgICAgaWYgKHMgPT0gciB8fCAqciB8fCBuIDwgLTEyOCB8fCBuID4gMTI3KQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgKnAgPSAoY2hhciluOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9pbmJ5dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgY2hhciAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6Ynl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9IChjaGFyKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YoY2hhciksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChjaGFyKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKGNoYXIpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMmJ5dGUoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfc2hvcnQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgc2hvcnQgbikKK3sgcmV0dXJuIHNvYXBfbG9uZzJzKHNvYXAsIChsb25nKW4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHNob3J0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgc2hvcnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfbG9uZzJzKHNvYXAsIChsb25nKSpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMnNob3J0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBzaG9ydCAqcCkKK3sgaWYgKHMpCisgIHsgbG9uZyBuOworICAgIGNoYXIgKnI7CisgICAgbiA9IHNvYXBfc3RydG9sKHMsICZyLCAxMCk7CisgICAgaWYgKHMgPT0gciB8fCAqciB8fCBuIDwgLTMyNzY4IHx8IG4gPiAzMjc2NykKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgICpwID0gKHNob3J0KW47CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorc2hvcnQgKgorU09BUF9GTUFDMgorc29hcF9pbnNob3J0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHNob3J0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpzaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAoc2hvcnQqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihzaG9ydCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChzaG9ydCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihzaG9ydCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3Myc2hvcnQoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZmxvYXQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgZmxvYXQgbikKK3sgY29uc3QgY2hhciAqczsKKyAgaWYgKHNvYXBfaXNuYW4oKGRvdWJsZSluKSkKKyAgICBzID0gIk5hTiI7CisgIGVsc2UgaWYgKHNvYXBfaXNwaW5mZihuKSkKKyAgICBzID0gIklORiI7CisgIGVsc2UgaWYgKHNvYXBfaXNuaW5mZihuKSkKKyAgICBzID0gIi1JTkYiOworICBlbHNlCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsIHNvYXAtPmZsb2F0X2Zvcm1hdCwgbik7CisgICAgcyA9IHNvYXAtPnRtcGJ1ZjsKKyAgfQorICByZXR1cm4gczsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRmbG9hdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGZsb2F0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX2Zsb2F0MnMoc29hcCwgKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MyZmxvYXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGZsb2F0ICpwKQoreyBpZiAocykKKyAgeyBpZiAoISpzKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIGlmICghc29hcF90YWdfY21wKHMsICJJTkYiKSkKKyAgICAgICpwID0gRkxUX1BJTkZUWTsKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHMsICIrSU5GIikpCisgICAgICAqcCA9IEZMVF9QSU5GVFk7CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChzLCAiLUlORiIpKQorICAgICAgKnAgPSBGTFRfTklORlRZOworICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAocywgIk5hTiIpKQorICAgICAgKnAgPSBGTFRfTkFOOworICAgIGVsc2UKKyAgICB7CisvKiBPbiBzb21lIHN5c3RlbXMsIHN0cnRvZiBhcHBlYXJzIHRvIGJlIGJyb2tlbiBvciBkb2Vzbid0IGxpbms6IHVzZSB3aXRoIGNhdXRpb24gKi8KKyNpZiBkZWZpbmVkKEhBVkVfU1RSVE9GKQorICAgICAgY2hhciAqcjsKKyAgICAgICpwID0gc3RydG9mKChjaGFyKilzLCAmcik7CisgICAgICBpZiAoKnIpCisjZWxpZiBkZWZpbmVkKEhBVkVfU1RSVE9EKQorICAgICAgY2hhciAqcjsKKyAgICAgICpwID0gKGZsb2F0KXN0cnRvZChzLCAmcik7CisgICAgICBpZiAoKnIpCisjZW5kaWYKKyNpZmRlZiBIQVZFX1NTQ0FORgorICAgICAgICBpZiAoc3NjYW5mKHMsICIlZyIsIHApICE9IDEpCisgICAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisjZWxzZQorICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyNlbmRpZgorICAgIH0KKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgaW50IHNvYXBfaXNudW1lcmljKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0eXBlKQoreyBpZiAoc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6ZmxvYXQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpkb3VibGUiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpkZWNpbWFsIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6aW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnBvc2l0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOm5lZ2F0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOm5vblBvc2l0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOm5vbk5lZ2F0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmxvbmciKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjppbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpzaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmJ5dGUiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZExvbmciKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkU2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gU09BUF9FUlI7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitmbG9hdCAqCitTT0FQX0ZNQUMyCitzb2FwX2luZmxvYXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgZmxvYXQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUgIT0gJ1wwJyAmJiBzb2FwX2lzbnVtZXJpYyhzb2FwLCB0eXBlKSkKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICBwID0gKGZsb2F0Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YoZmxvYXQpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAoZmxvYXQqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YoZmxvYXQpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMmZsb2F0KHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2RvdWJsZTJzKHN0cnVjdCBzb2FwICpzb2FwLCBkb3VibGUgbikKK3sgY29uc3QgY2hhciAqczsKKyAgaWYgKHNvYXBfaXNuYW4obikpCisgICAgcyA9ICJOYU4iOworICBlbHNlIGlmIChzb2FwX2lzcGluZmQobikpCisgICAgcyA9ICJJTkYiOworICBlbHNlIGlmIChzb2FwX2lzbmluZmQobikpCisgICAgcyA9ICItSU5GIjsKKyAgZWxzZQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCBzb2FwLT5kb3VibGVfZm9ybWF0LCBuKTsKKyAgICBzID0gc29hcC0+dG1wYnVmOworICB9CisgIHJldHVybiBzOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dGRvdWJsZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGRvdWJsZSAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9kb3VibGUycyhzb2FwLCAqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJkb3VibGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGRvdWJsZSAqcCkKK3sgaWYgKHMpCisgIHsgaWYgKCEqcykKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBpZiAoIXNvYXBfdGFnX2NtcChzLCAiSU5GIikpCisgICAgICAqcCA9IERCTF9QSU5GVFk7CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChzLCAiK0lORiIpKQorICAgICAgKnAgPSBEQkxfUElORlRZOworICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAocywgIi1JTkYiKSkKKyAgICAgICpwID0gREJMX05JTkZUWTsKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHMsICJOYU4iKSkKKyAgICAgICpwID0gREJMX05BTjsKKyAgICBlbHNlCisgICAgeworI2lmZGVmIEhBVkVfU1RSVE9ECisgICAgICBjaGFyICpyOworICAgICAgKnAgPSBzdHJ0b2QocywgJnIpOworICAgICAgaWYgKCpyKQorI2VuZGlmCisjaWZkZWYgSEFWRV9TU0NBTkYKKyAgICAgICAgaWYgKHNzY2FuZihzLCAiJWxnIiwgcCkgIT0gMSkKKyAgICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyNlbHNlCisgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworI2VuZGlmCisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2RvdWJsZSAqCitTT0FQX0ZNQUMyCitzb2FwX2luZG91YmxlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGRvdWJsZSAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZSAhPSAnXDAnICYmIHNvYXBfaXNudW1lcmljKHNvYXAsIHR5cGUpKQorICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgIHAgPSAoZG91YmxlKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YoZG91YmxlKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKGRvdWJsZSopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihkb3VibGUpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMmRvdWJsZShzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF91bnNpZ25lZEJ5dGUycyhzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgY2hhciBuKQoreyByZXR1cm4gc29hcF91bnNpZ25lZExvbmcycyhzb2FwLCAodW5zaWduZWQgbG9uZyluKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXR1bnNpZ25lZEJ5dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX3Vuc2lnbmVkTG9uZzJzKHNvYXAsICh1bnNpZ25lZCBsb25nKSpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMnVuc2lnbmVkQnl0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgdW5zaWduZWQgY2hhciAqcCkKK3sgaWYgKHMpCisgIHsgdW5zaWduZWQgbG9uZyBuOworICAgIGNoYXIgKnI7CisgICAgbiA9IHNvYXBfc3RydG91bChzLCAmciwgMTApOworICAgIGlmIChzID09IHIgfHwgKnIgfHwgbiA+IDI1NSkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgICpwID0gKHVuc2lnbmVkIGNoYXIpbjsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit1bnNpZ25lZCBjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfaW51bnNpZ25lZEJ5dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgdW5zaWduZWQgY2hhciAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRCeXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKHVuc2lnbmVkIGNoYXIqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZih1bnNpZ25lZCBjaGFyKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKHVuc2lnbmVkIGNoYXIqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YodW5zaWduZWQgY2hhciksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MydW5zaWduZWRCeXRlKHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3Vuc2lnbmVkU2hvcnQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgc2hvcnQgbikKK3sgcmV0dXJuIHNvYXBfdW5zaWduZWRMb25nMnMoc29hcCwgKHVuc2lnbmVkIGxvbmcpbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0dW5zaWduZWRTaG9ydChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIHNob3J0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX3Vuc2lnbmVkTG9uZzJzKHNvYXAsICh1bnNpZ25lZCBsb25nKSpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMnVuc2lnbmVkU2hvcnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIHNob3J0ICpwKQoreyBpZiAocykKKyAgeyB1bnNpZ25lZCBsb25nIG47CisgICAgY2hhciAqcjsKKyAgICBuID0gc29hcF9zdHJ0b3VsKHMsICZyLCAxMCk7CisgICAgaWYgKHMgPT0gciB8fCAqciB8fCBuID4gNjU1MzUpCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICAqcCA9ICh1bnNpZ25lZCBzaG9ydCluOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3Vuc2lnbmVkIHNob3J0ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW51bnNpZ25lZFNob3J0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIHNob3J0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZFNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRCeXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKHVuc2lnbmVkIHNob3J0Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YodW5zaWduZWQgc2hvcnQpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAodW5zaWduZWQgc2hvcnQqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YodW5zaWduZWQgc2hvcnQpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMnVuc2lnbmVkU2hvcnQoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfdW5zaWduZWRJbnQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgaW50IG4pCit7IHJldHVybiBzb2FwX3Vuc2lnbmVkTG9uZzJzKHNvYXAsICh1bnNpZ25lZCBsb25nKW4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHVuc2lnbmVkSW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgdW5zaWduZWQgaW50ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX3Vuc2lnbmVkTG9uZzJzKHNvYXAsICh1bnNpZ25lZCBsb25nKSpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMnVuc2lnbmVkSW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBpbnQgKnApCit7IGlmIChzKQorICB7IGNoYXIgKnI7CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBzb2FwX3Jlc2V0X2Vycm5vOworI2VuZGlmCisjZW5kaWYKKyAgICAqcCA9ICh1bnNpZ25lZCBpbnQpc29hcF9zdHJ0b3VsKHMsICZyLCAxMCk7CisgICAgaWYgKChzID09IHIgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKSB8fCAqcgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgIHx8IHNvYXBfZXJybm8gPT0gU09BUF9FUkFOR0UKKyNlbmRpZgorI2VuZGlmCisgICAgKQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordW5zaWduZWQgaW50ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW51bnNpZ25lZEludChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB1bnNpZ25lZCBpbnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkSW50IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRTaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkQnl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9ICh1bnNpZ25lZCBpbnQqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZih1bnNpZ25lZCBpbnQpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAodW5zaWduZWQgaW50Kilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKHVuc2lnbmVkIGludCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MydW5zaWduZWRJbnQoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfdW5zaWduZWRMb25nMnMoc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIGxvbmcgbikKK3sgc3ByaW50Zihzb2FwLT50bXBidWYsICIlbHUiLCBuKTsKKyAgcmV0dXJuIHNvYXAtPnRtcGJ1ZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXR1bnNpZ25lZExvbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCB1bnNpZ25lZCBsb25nICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX3Vuc2lnbmVkTG9uZzJzKHNvYXAsICpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMnVuc2lnbmVkTG9uZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgdW5zaWduZWQgbG9uZyAqcCkKK3sgaWYgKHMpCisgIHsgY2hhciAqcjsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgIHNvYXBfcmVzZXRfZXJybm87CisjZW5kaWYKKyNlbmRpZgorICAgICpwID0gc29hcF9zdHJ0b3VsKHMsICZyLCAxMCk7CisgICAgaWYgKChzID09IHIgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKSB8fCAqcgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgIHx8IHNvYXBfZXJybm8gPT0gU09BUF9FUkFOR0UKKyNlbmRpZgorI2VuZGlmCisgICAgKQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordW5zaWduZWQgbG9uZyAqCitTT0FQX0ZNQUMyCitzb2FwX2ludW5zaWduZWRMb25nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIGxvbmcgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkSW50IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRTaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkQnl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9ICh1bnNpZ25lZCBsb25nKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YodW5zaWduZWQgbG9uZyksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9ICh1bnNpZ25lZCBsb25nKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMnVuc2lnbmVkTG9uZyhzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9VTE9ORzY0MnMoc3RydWN0IHNvYXAgKnNvYXAsIFVMT05HNjQgbikKK3sgc3ByaW50Zihzb2FwLT50bXBidWYsIFNPQVBfVUxPTkdfRk9STUFULCBuKTsKKyAgcmV0dXJuIHNvYXAtPnRtcGJ1ZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRVTE9ORzY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgVUxPTkc2NCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9VTE9ORzY0MnMoc29hcCwgKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MyVUxPTkc2NChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgVUxPTkc2NCAqcCkKK3sgaWYgKHMpCisgIHsKKyNpZmRlZiBIQVZFX1NUUlRPVUxMCisgICAgY2hhciAqcjsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgIHNvYXBfcmVzZXRfZXJybm87CisjZW5kaWYKKyNlbmRpZgorICAgICpwID0gc3RydG91bGwocywgJnIsIDEwKTsKKyAgICBpZiAoKHMgPT0gciAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpIHx8ICpyCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgICB8fCBzb2FwX2Vycm5vID09IFNPQVBfRVJBTkdFCisjZW5kaWYKKyNlbmRpZgorICAgICAgKQorI2Vsc2UKKyMgaWZkZWYgSEFWRV9TU0NBTkYKKyAgICBpZiAoc3NjYW5mKHMsIFNPQVBfVUxPTkdfRk9STUFULCBwKSAhPSAxKQorIyBlbmRpZgorI2VuZGlmCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitVTE9ORzY0ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5VTE9ORzY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIFVMT05HNjQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6cG9zaXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bm9uTmVnYXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRMb25nIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRJbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZFNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRCeXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcCA9IChVTE9ORzY0Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YoVUxPTkc2NCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChVTE9ORzY0Kilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKFVMT05HNjQpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMlVMT05HNjQoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3Myc3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBjaGFyICoqdCkKK3sgKnQgPSBOVUxMOworICBpZiAocykKKyAgeyBpZiAoISgqdCA9IHNvYXBfc3RyZHVwKHNvYXAsIHMpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIGlmICghKHNvYXAtPm1vZGUgJiAoU09BUF9FTkNfTEFUSU4gfCBTT0FQX0NfVVRGU1RSSU5HKSkpCisgICAgeyAvKiBUT0RPOiBjb25zaWRlciB0cnVuY2F0aW5nIFVURjggdG8gQVNDSUkgZm9yIHJlZ3VsYXIgWE1MIGF0dHJpYnV0ZSBzdHJpbmdzPyAqLworICAgIH0KKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJRTmFtZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgY2hhciAqKnQpCit7IGlmIChzKQorICB7IHN0cnVjdCBzb2FwX25saXN0ICpucDsKKyAgICBjb25zdCBjaGFyICpwOworICAgIGlmICghc3RybmNtcChzLCAieG1sOiIsIDQpKQorICAgIHsgKnQgPSBzb2FwX3N0cmR1cChzb2FwLCBzKTsKKyAgICAgIHJldHVybiBTT0FQX09LOworICAgIH0KKyAgICBucCA9IHNvYXAtPm5saXN0OworICAgIHAgPSBzdHJjaHIocywgJzonKTsKKyAgICBpZiAocCkKKyAgICB7IHJlZ2lzdGVyIGludCBuID0gcCAtIHM7CisgICAgICB3aGlsZSAobnAgJiYgKHN0cm5jbXAobnAtPmlkLCBzLCBuKSB8fCBucC0+aWRbbl0pKQorICAgICAgICBucCA9IG5wLT5uZXh0OworICAgICAgcCsrOworICAgIH0KKyAgICBlbHNlCisgICAgeyB3aGlsZSAobnAgJiYgKm5wLT5pZCkKKyAgICAgICAgbnAgPSBucC0+bmV4dDsKKyAgICAgIHAgPSBzOworICAgIH0KKyAgICBpZiAobnApCisgICAgeyBpZiAobnAtPmluZGV4ID49IDAgJiYgc29hcC0+bG9jYWxfbmFtZXNwYWNlcykKKyAgICAgIHsgcmVnaXN0ZXIgY29uc3QgY2hhciAqcSA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbbnAtPmluZGV4XS5pZDsKKyAgICAgICAgaWYgKHEpCisgICAgICAgIHsgaWYgKCgqdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzdHJsZW4ocCkgKyBzdHJsZW4ocSkgKyAyKSkpCisgICAgICAgICAgICBzcHJpbnRmKCp0LCAiJXM6JXMiLCBxLCBwKTsKKyAgICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKG5wLT5ucykKKyAgICAgIHsgaWYgKCgqdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzdHJsZW4ocCkgKyBzdHJsZW4obnAtPm5zKSArIDQpKSkKKyAgICAgICAgICBzcHJpbnRmKCp0LCAiXCIlc1wiOiVzIiwgbnAtPm5zLCBwKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgICB9CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk5hbWVzcGFjZSBwcmVmaXggb2YgJyVzJyBub3QgZGVmaW5lZCAoaW5kZXg9JWQsIFVSST0lcylcbiIsIHMsIG5wLT5pbmRleCwgbnAtPm5zP25wLT5uczoiIikpOworICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9OQU1FU1BBQ0U7IAorICAgIH0KKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk5hbWVzcGFjZSBwcmVmaXggb2YgJyVzJyBub3QgZGVmaW5lZCwgYXNzdW1pbmcgZW1wdHkgbmFtZXNwYWNlXG4iLCBzKSk7CisgICAgaWYgKCgqdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzdHJsZW4ocCkgKyA0KSkpCisgICAgICBzcHJpbnRmKCp0LCAiXCJcIjolcyIsIHApOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX1FOYW1lMnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMpCit7IHN0cnVjdCBOYW1lc3BhY2UgKnA7CisgIGNoYXIgKnQ7CisgIGludCBuOworICBpZiAoIXMgfHwgKnMgIT0gJyInKQorICB7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmIChzICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKSkKKyAgICB7IHQgPSAoY2hhciopc3RyY2hyKHMsICc6Jyk7CisgICAgICBpZiAodCkKKyAgICAgICAgc29hcF91dGlsaXplX25zKHNvYXAsIHMsIHQgLSBzKTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gczsKKyAgfQorICBzKys7CisgIGlmICgocCA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXMpKQorICB7IGZvciAoOyBwLT5pZDsgcCsrKQorICAgIHsgaWYgKHAtPm5zKQorICAgICAgICBpZiAoIXNvYXBfdGFnX2NtcChzLCBwLT5ucykpCisgICAgICAgICAgYnJlYWs7CisgICAgICBpZiAocC0+aW4pCisgICAgICAgIGlmICghc29hcF90YWdfY21wKHMsIHAtPmluKSkKKyAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHAgJiYgcC0+aWQpCisgICAgeyBzID0gc3RyY2hyKHMsICciJyk7CisgICAgICBpZiAocykKKyAgICAgIHsgdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzdHJsZW4ocC0+aWQpICsgc3RybGVuKHMpKTsKKyAgICAgICAgc3RyY3B5KHQsIHAtPmlkKTsKKwlzdHJjYXQodCwgcyArIDEpOworICAgICAgICByZXR1cm4gdDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgdCA9IChjaGFyKilzdHJjaHIocywgJyInKTsKKyAgaWYgKHQpCisgICAgbiA9IHQgLSBzOworICBlbHNlCisgICAgbiA9IDA7CisgIHQgPSBzb2FwX3N0cmR1cChzb2FwLCBzKTsKKyAgdFtuXSA9ICdcMCc7CisgIHNwcmludGYoc29hcC0+dG1wYnVmLCAieG1sbnM6XyVkIiwgc29hcC0+aWRudW0rKyk7CisgIHNvYXBfc2V0X2F0dHIoc29hcCwgc29hcC0+dG1wYnVmLCB0KTsKKyAgcyA9IHN0cmNocihzLCAnIicpOworICBpZiAocykKKyAgeyB0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihzb2FwLT50bXBidWYpICsgc3RybGVuKHMpIC0gNik7CisgICAgc3RyY3B5KHQsIHNvYXAtPnRtcGJ1ZiArIDYpOworICAgIHN0cmNhdCh0LCBzICsgMSk7CisgIH0KKyAgcmV0dXJuIHQ7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJ3Y2hhcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgd2NoYXJfdCAqKnQpCit7IHdjaGFyX3QgKnI7CisgIGlmICghcykKKyAgICAqdCA9IE5VTEw7CisgIGVsc2UKKyAgeyAqdCA9IHIgPSAod2NoYXJfdCopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHdjaGFyX3QpICogKHN0cmxlbihzKSArIDEpKTsKKyAgICBpZiAoIXIpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19MQVRJTikKKyAgICB7IHdoaWxlICgqcykKKyAgICAgICAgKnIrKyA9ICh3Y2hhcl90KSpzKys7CisgICAgfQorICAgIGVsc2UKKyAgICB7IC8qIENvbnZlcnQgVVRGOCB0byB3Y2hhciAqLworICAgICAgd2hpbGUgKCpzKQorICAgICAgeyByZWdpc3RlciBzb2FwX3djaGFyIGMsIGMxLCBjMiwgYzMsIGM0OworICAgICAgICBjID0gKnMrKzsKKyAgICAgICAgaWYgKGMgPCAweDgwKQorCSAgKnIrKyA9ICh3Y2hhcl90KWM7CisJZWxzZQorICAgICAgICB7IGMxID0gKHNvYXBfd2NoYXIpKnMrKyAmIDB4M0Y7CisgICAgICAgICAgaWYgKGMgPCAweEUwKQorICAgICAgICAgICAgKnIrKyA9ICh3Y2hhcl90KSgoKHNvYXBfd2NoYXIpKGMgJiAweDFGKSA8PCA2KSB8IGMxKTsKKyAgICAgICAgICBlbHNlCisJICB7IGMyID0gKHNvYXBfd2NoYXIpKnMrKyAmIDB4M0Y7CisgICAgICAgICAgICBpZiAoYyA8IDB4RjApCisgICAgICAgICAgICAgICpyKysgPSAod2NoYXJfdCkoKChzb2FwX3djaGFyKShjICYgMHgwRikgPDwgMTIpIHwgKGMxIDw8IDYpIHwgYzIpOworICAgICAgICAgICAgZWxzZQorCSAgICB7IGMzID0gKHNvYXBfd2NoYXIpKnMrKyAmIDB4M0Y7CisgICAgICAgICAgICAgIGlmIChjIDwgMHhGOCkKKyAgICAgICAgICAgICAgICAqcisrID0gKHdjaGFyX3QpKCgoc29hcF93Y2hhcikoYyAmIDB4MDcpIDw8IDE4KSB8IChjMSA8PCAxMikgfCAoYzIgPDwgNikgfCBjMyk7CisgICAgICAgICAgICAgIGVsc2UKKwkgICAgICB7IGM0ID0gKHNvYXBfd2NoYXIpKnMrKyAmIDB4M0Y7CisgICAgICAgICAgICAgICAgaWYgKGMgPCAweEZDKQorICAgICAgICAgICAgICAgICAgKnIrKyA9ICh3Y2hhcl90KSgoKHNvYXBfd2NoYXIpKGMgJiAweDAzKSA8PCAyNCkgfCAoYzEgPDwgMTgpIHwgKGMyIDw8IDEyKSB8IChjMyA8PCA2KSB8IGM0KTsKKyAgICAgICAgICAgICAgICBlbHNlCisJCSAgKnIrKyA9ICh3Y2hhcl90KSgoKHNvYXBfd2NoYXIpKGMgJiAweDAxKSA8PCAzMCkgfCAoYzEgPDwgMjQpIHwgKGMyIDw8IDE4KSB8IChjMyA8PCAxMikgfCAoYzQgPDwgNikgfCAoc29hcF93Y2hhcikoKnMrKyAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAqciA9IEwnXDAnOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfd2NoYXIycyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgd2NoYXJfdCAqcykKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICByZWdpc3RlciBjaGFyICpyLCAqdDsKKyAgY29uc3Qgd2NoYXJfdCAqcSA9IHM7CisgIHNpemVfdCBuID0gMDsKKyAgd2hpbGUgKChjID0gKnErKykpCisgIHsgaWYgKGMgPiAwICYmIGMgPCAweDgwKQorICAgICAgbisrOworICAgIGVsc2UKKyAgICAgIG4gKz0gNjsKKyAgfQorICByID0gdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBuICsgMSk7CisgIGlmIChyKQorICB7IC8qIENvbnZlcnQgd2NoYXIgdG8gVVRGOCAqLworICAgIHdoaWxlICgoYyA9ICpzKyspKQorICAgIHsgaWYgKGMgPiAwICYmIGMgPCAweDgwKQorICAgICAgICAqdCsrID0gKGNoYXIpYzsKKyAgICAgIGVsc2UKKyAgICAgIHsgaWYgKGMgPCAweDA4MDApCisgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEMwIHwgKChjID4+IDYpICYgMHgxRikpOworICAgICAgICBlbHNlCisgICAgICAgIHsgaWYgKGMgPCAweDAxMDAwMCkKKyAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhFMCB8ICgoYyA+PiAxMikgJiAweDBGKSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsgaWYgKGMgPCAweDIwMDAwMCkKKyAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEYwIHwgKChjID4+IDE4KSAmIDB4MDcpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgaWYgKGMgPCAweDA0MDAwMDAwKQorICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhGOCB8ICgoYyA+PiAyNCkgJiAweDAzKSk7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeyAqdCsrID0gKGNoYXIpKDB4RkMgfCAoKGMgPj4gMzApICYgMHgwMSkpOworICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAyNCkgJiAweDNGKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDE4KSAmIDB4M0YpKTsKKyAgICAgICAgICAgIH0gICAgIAorICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDEyKSAmIDB4M0YpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDYpICYgMHgzRikpOworICAgICAgICB9CisgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8IChjICYgMHgzRikpOworICAgICAgfQorICAgIH0KKyAgICAqdCA9ICdcMCc7CisgIH0KKyAgcmV0dXJuIHI7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0c3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY2hhciAqY29uc3QqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pIAoreyBpZCA9IHNvYXBfZWxlbWVudF9pZChzb2FwLCB0YWcsIGlkLCAqcCwgTlVMTCwgMCwgdHlwZSwgbik7CisgIGlmIChpZCA8IDAKKyAgIHx8IHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBpZCwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCAqcCwgMCkKKyAgIHx8IHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZykpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKioKK1NPQVBfRk1BQzIKK3NvYXBfaW5zdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgY2hhciAqKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0LCBpbnQgZmxhZywgbG9uZyBtaW5sZW4sIGxvbmcgbWF4bGVuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMSkpCisgIHsgaWYgKCF0YWcgfHwgKnRhZyAhPSAnLScgfHwgc29hcC0+ZXJyb3IgIT0gU09BUF9OT19UQUcpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIH0KKyAgaWYgKCFwKQorICAgIGlmICghKHAgPSAoY2hhcioqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihjaGFyKikpKSkKKyAgICAgIHJldHVybiBOVUxMOworICBpZiAoc29hcC0+Ym9keSkKKyAgeyAqcCA9IHNvYXBfc3RyaW5nX2luKHNvYXAsIGZsYWcsIG1pbmxlbiwgbWF4bGVuKTsKKyAgICBpZiAoISpwIHx8ICEoY2hhciopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgKnAsIHQsIHNpemVvZihjaGFyKiksIDAsIE5VTEwsIE5VTEwsIE5VTEwpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZWxzZSBpZiAoc29hcC0+bnVsbCkKKyAgICAqcCA9IE5VTEw7CisgIGVsc2UKKyAgICAqcCA9IChjaGFyKilTT0FQX1NUUl9FT1M7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKGNoYXIqKilzb2FwX2lkX2xvb2t1cChzb2FwLCBzb2FwLT5ocmVmLCAodm9pZCoqKXAsIHQsIHNpemVvZihjaGFyKiopLCAwKTsKKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXR3c3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgd2NoYXJfdCAqY29uc3QqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pIAoreyBpZCA9IHNvYXBfZWxlbWVudF9pZChzb2FwLCB0YWcsIGlkLCAqcCwgTlVMTCwgMCwgdHlwZSwgbik7CisgIGlmIChpZCA8IDAKKyAgIHx8IHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBpZCwgdHlwZSkKKyAgIHx8IHNvYXBfd3N0cmluZ19vdXQoc29hcCwgKnAsIDApCisgICB8fCBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3djaGFyX3QgKioKK1NPQVBfRk1BQzIKK3NvYXBfaW53c3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHdjaGFyX3QgKipwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCwgbG9uZyBtaW5sZW4sIGxvbmcgbWF4bGVuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMSkpCisgIHsgaWYgKCF0YWcgfHwgKnRhZyAhPSAnLScgfHwgc29hcC0+ZXJyb3IgIT0gU09BUF9OT19UQUcpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIH0KKyAgaWYgKCFwKQorICAgIGlmICghKHAgPSAod2NoYXJfdCoqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZih3Y2hhcl90KikpKSkKKyAgICAgIHJldHVybiBOVUxMOworICBpZiAoc29hcC0+Ym9keSkKKyAgeyAqcCA9IHNvYXBfd3N0cmluZ19pbihzb2FwLCAxLCBtaW5sZW4sIG1heGxlbik7CisgICAgaWYgKCEqcCB8fCAhKHdjaGFyX3QqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsICpwLCB0LCBzaXplb2Yod2NoYXJfdCopLCAwLCBOVUxMLCBOVUxMLCBOVUxMKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGVsc2UgaWYgKHNvYXAtPm51bGwpCisgICAgKnAgPSBOVUxMOworICBlbHNlCisgICAgKnAgPSAod2NoYXJfdCopU09BUF9TVFJfRU9TOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9ICh3Y2hhcl90Kiopc29hcF9pZF9sb29rdXAoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilwLCB0LCBzaXplb2Yod2NoYXJfdCoqKSwgMCk7CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyB0aW1lX3QKK3NvYXBfdGltZWdtKHN0cnVjdCB0bSAqVCkKK3sKKyNpZiBkZWZpbmVkKEhBVkVfVElNRUdNKQorICByZXR1cm4gdGltZWdtKFQpOworI2Vsc2UKKyAgdGltZV90IHQsIGcsIHo7CisjaWZkZWYgSEFWRV9HTVRJTUVfUgorICBzdHJ1Y3QgdG0gdG0sICp0bXAgPSAmdG07CisjZWxzZQorICBzdHJ1Y3QgdG0gKnRtcDsKKyNlbmRpZgorICB0ID0gbWt0aW1lKFQpOworICBpZiAodCA9PSAtMSkKKyAgICByZXR1cm4gLTE7CisjaWZkZWYgSEFWRV9HTVRJTUVfUgorICBnbXRpbWVfcigmdCwgdG1wKTsKKyNlbHNlCisgIHRtcCA9IGdtdGltZSgmdCk7CisjZW5kaWYKKyAgdG1wLT50bV9pc2RzdCA9IDA7CisgIGcgPSBta3RpbWUodG1wKTsKKyAgaWYgKGcgPT0gLTEpCisgICAgcmV0dXJuIC0xOworICB6ID0gZyAtIHQ7CisgIHJldHVybiB0IC0gejsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZGF0ZVRpbWUycyhzdHJ1Y3Qgc29hcCAqc29hcCwgdGltZV90IG4pCit7IHN0cnVjdCB0bSBULCAqcFQgPSAmVDsKKyNpZiBkZWZpbmVkKEhBVkVfR01USU1FX1IpCisgIGlmIChnbXRpbWVfcigmbiwgcFQpKQorICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolU1oiLCBwVCk7CisgIC8qIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyB3ZXJlIGFkZGVkIGZvciBWeFdvcmtzKi8KKyNlbGlmIGRlZmluZWQoSEFWRV9QR01USU1FX1IpCisgIGlmIChnbXRpbWVfcigmbiwgcFQpKQorICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolU1oiLCBwVCk7CisjZWxpZiBkZWZpbmVkKEhBVkVfUEdNVElNRSkKKyAgaWYgKGdtdGltZSgmbiwgcFQpKQorICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolU1oiLCBwVCk7CisjZWxpZiBkZWZpbmVkKEhBVkVfR01USU1FKQorICBpZiAoKHBUID0gZ210aW1lKCZuKSkpCisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTWiIsIHBUKTsKKyNlbGlmIGRlZmluZWQoSEFWRV9HRVRUSU1FT0ZEQVkpCisgIHN0cnVjdCB0aW1lem9uZSB0ejsKKyAgbWVtc2V0KCh2b2lkKikmdHosIDAsIHNpemVvZih0eikpOworIyBpZiBkZWZpbmVkKEhBVkVfTE9DQUxUSU1FX1IpCisgIGlmIChsb2NhbHRpbWVfcigmbiwgcFQpKQorICB7IHN0cnVjdCB0aW1ldmFsIHR2OworICAgIGdldHRpbWVvZmRheSgmdHYsICZ0eik7CisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmICsgc3RybGVuKHNvYXAtPnRtcGJ1ZiksICIlKzAzZDolMDJkIiwgLXR6LnR6X21pbnV0ZXN3ZXN0LzYwKyhwVC0+dG1faXNkc3QhPTApLCBhYnModHoudHpfbWludXRlc3dlc3QpJTYwKTsKKyAgfQorIyBlbHNlCisgIGlmICgocFQgPSBsb2NhbHRpbWUoJm4pKSkKKyAgeyBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICBnZXR0aW1lb2ZkYXkoJnR2LCAmdHopOworICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIHN0cmxlbihzb2FwLT50bXBidWYpLCAiJSswM2Q6JTAyZCIsIC10ei50el9taW51dGVzd2VzdC82MCsocFQtPnRtX2lzZHN0IT0wKSwgYWJzKHR6LnR6X21pbnV0ZXN3ZXN0KSU2MCk7CisgIH0KKyNlbmRpZgorI2VsaWYgZGVmaW5lZChIQVZFX0ZUSU1FKQorICBzdHJ1Y3QgdGltZWIgdDsKKyAgbWVtc2V0KCh2b2lkKikmdCwgMCwgc2l6ZW9mKHQpKTsKKyMgaWYgZGVmaW5lZChIQVZFX0xPQ0FMVElNRV9SKQorICBpZiAobG9jYWx0aW1lX3IoJm4sIHBUKSkKKyAgeyBmdGltZSgmdCk7CisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmICsgc3RybGVuKHNvYXAtPnRtcGJ1ZiksICIlKzAzZDolMDJkIiwgLXQudGltZXpvbmUvNjArKHBULT50bV9pc2RzdCE9MCksIGFicyh0LnRpbWV6b25lKSU2MCk7CisgIH0KKyAgLyogVGhlIGZvbGxvd2luZyBkZWZpbmVzIHdlcmUgYWRkZWQgZm9yIFZ4V29ya3MqLworIyBlbGlmIGRlZmluZWQoSEFWRV9QTE9DQUxUSU1FX1IpCisgIGlmIChsb2NhbHRpbWVfcigmbiwgcFQpKQorICB7IHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZitzdHJsZW4oc29hcC0+dG1wYnVmKSwgIiUrMDNkOiUwMmQiLCB0LnRpbWV6b25lLzYwLCBhYnModC50aW1lem9uZSklNjApOworICB9CisjIGVsc2UKKyAgaWYgKChwVCA9IGxvY2FsdGltZSgmbikpKQorICB7IGZ0aW1lKCZ0KTsKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwVCk7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYgKyBzdHJsZW4oc29hcC0+dG1wYnVmKSwgIiUrMDNkOiUwMmQiLCAtdC50aW1lem9uZS82MCsocFQtPnRtX2lzZHN0IT0wKSwgYWJzKHQudGltZXpvbmUpJTYwKTsKKyAgfQorIyBlbmRpZgorI2VsaWYgZGVmaW5lZChIQVZFX0xPQ0FMVElNRV9SKQorICBpZiAobG9jYWx0aW1lX3IoJm4sIHBUKSkKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwVCk7CisgIC8qIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyB3ZXJlIGFkZGVkIGZvciBWeFdvcmtzKi8KKyNlbGlmIGRlZmluZWQoSEFWRV9QTE9DQUxUSU1FX1IpCisgIGlmIChsb2NhbHRpbWVfcigmbiwgcFQpKQorICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyNlbHNlCisgIGlmICgocFQgPSBsb2NhbHRpbWUoJm4pKSkKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwVCk7CisjZW5kaWYKKyAgZWxzZQorICAgIHN0cmNweShzb2FwLT50bXBidWYsICIxOTY5LTEyLTMxVDIzOjU5OjU5WiIpOworICByZXR1cm4gc29hcC0+dG1wYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dGRhdGVUaW1lKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgdGltZV90ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX2RhdGVUaW1lMnMoc29hcCwgKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MyZGF0ZVRpbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHRpbWVfdCAqcCkKK3sgaWYgKHMpCisgIHsgc3RydWN0IHRtIFQ7CisgICAgY2hhciB6b25lWzE2XTsKKyAgICBjb25zdCBjaGFyICp0OworICAgIG1lbXNldCgodm9pZCopJlQsIDAsIHNpemVvZihUKSk7CisgICAgem9uZVtzaXplb2Yoem9uZSktMV0gPSAnXDAnOworICAgIGlmIChzdHJjaHIocywgJy0nKSkKKyAgICAgIHQgPSAiJWQtJWQtJWRUJWQ6JWQ6JWQlMTVzIjsKKyAgICBlbHNlIGlmIChzdHJjaHIocywgJzonKSkKKyAgICAgIHQgPSAiJTRkJTJkJTJkVCVkOiVkOiVkJTE1cyI7CisgICAgZWxzZSAvKiBwYXJzZSBub24tWFNELXN0YW5kYXJkIGFsdGVybmF0aXZlIElTTyA4NjAxIGZvcm1hdCAqLworICAgICAgdCA9ICIlNGQlMmQlMmRUJTJkJTJkJTJkJTE1cyI7CisgICAgc3NjYW5mKHMsIHQsICZULnRtX3llYXIsICZULnRtX21vbiwgJlQudG1fbWRheSwgJlQudG1faG91ciwgJlQudG1fbWluLCAmVC50bV9zZWMsIHpvbmUpOworICAgIGlmIChULnRtX3llYXIgPT0gMSkKKyAgICAgIFQudG1feWVhciA9IDcwOworICAgIGVsc2UKKyAgICAgIFQudG1feWVhciAtPSAxOTAwOworICAgIFQudG1fbW9uLS07CisgICAgaWYgKCp6b25lKQorICAgIHsgaWYgKCp6b25lID09ICcuJykKKyAgICAgIHsgZm9yIChzID0gem9uZSArIDE7ICpzOyBzKyspCisgICAgICAgICAgaWYgKCpzIDwgJzAnIHx8ICpzID4gJzknKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHMgPSB6b25lOworICAgICAgaWYgKCpzID09ICcrJyB8fCAqcyA9PSAnLScpCisgICAgICB7IGludCBoID0gMCwgbSA9IDA7CisgICAgICAgIGlmIChzWzNdID09ICc6JykKKwl7IHNzY2FuZihzLCAiJWQ6JWQiLCAmaCwgJm0pOworCSAgaWYgKGggPCAwKQorCSAgICBtID0gLW07CisJfQorCWVsc2UKKwl7IG0gPSAoaW50KWF0b2wocyk7CisJICBoID0gbSAvIDEwMDsKKwkgIG0gPSBtICUgMTAwOworCX0KKyAgICAgICAgVC50bV9ob3VyIC09IGg7CisgICAgICAgIFQudG1fbWluIC09IG07CisgICAgICB9CisgICAgICBULnRtX2lzZHN0ID0gMDsKKyAgICAgICpwID0gc29hcF90aW1lZ20oJlQpOworICAgIH0KKyAgICBlbHNlCisgICAgeyBULnRtX2lzZHN0ID0gLTE7CisgICAgICAqcCA9IG1rdGltZSgmVCk7IC8qIG5vIHRpbWUgem9uZTogc3VwcG9zZSBpdCBpcyBsb2NhbHRpbWU/ICovCisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK3RpbWVfdCAqCitTT0FQX0ZNQUMyCitzb2FwX2luZGF0ZVRpbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgdGltZV90ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmRhdGVUaW1lIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcCA9ICh0aW1lX3QqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZih0aW1lX3QpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAodGltZV90Kilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKHRpbWVfdCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MyZGF0ZVRpbWUoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dGxpdGVyYWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgY2hhciAqY29uc3QqcCkKK3sgaW50IGk7CisgIGNvbnN0IGNoYXIgKnQgPSBOVUxMOworICBpZiAodGFnICYmICp0YWcgIT0gJy0nKQorICB7IGlmIChzb2FwLT5sb2NhbF9uYW1lc3BhY2VzICYmICh0ID0gc3RyY2hyKHRhZywgJzonKSkpCisgICAgeyBzdHJuY3B5KHNvYXAtPnRtcGJ1ZiwgdGFnLCB0LXRhZyk7CisgICAgICBzb2FwLT50bXBidWZbdC10YWddID0gJ1wwJzsKKyAgICAgIGZvciAoaSA9IDA7IHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0uaWQ7IGkrKykKKyAgICAgICAgaWYgKCFzdHJjbXAoc29hcC0+dG1wYnVmLCBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW2ldLmlkKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIHQrKzsKKyAgICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiPCVzIHhtbG5zPVwiJXNcIj4iLCB0LCBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW2ldLm5zID8gc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tpXS5ucyA6IFNPQVBfU1RSX0VPUyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IHQgPSB0YWc7CisgICAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIjwlcz4iLCB0YWcpOworICAgIH0KKyAgICBpZiAoc29hcF9zZW5kKHNvYXAsIHNvYXAtPnRtcGJ1ZikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHAgJiYgKnApCisgIHsgaWYgKHNvYXBfc2VuZChzb2FwLCAqcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHQpCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICI8LyVzPiIsIHQpOworICAgIHJldHVybiBzb2FwX3NlbmQoc29hcCwgc29hcC0+dG1wYnVmKTsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKioKK1NPQVBfRk1BQzIKK3NvYXBfaW5saXRlcmFsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGNoYXIgKipwKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMSkpCisgIHsgaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfTk9fVEFHIHx8IHNvYXBfdW5nZXQoc29hcCwgc29hcF9nZXQoc29hcCkpID09IFNPQVBfVFQpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIH0KKyAgaWYgKCFwKQorICAgIGlmICghKHAgPSAoY2hhcioqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihjaGFyKikpKSkKKyAgICAgIHJldHVybiBOVUxMOworICBpZiAoc29hcC0+Ym9keSkKKyAgICAqcCA9IHNvYXBfc3RyaW5nX2luKHNvYXAsIDAsIC0xLCAtMSk7CisgIGVsc2UgaWYgKHNvYXAtPm51bGwpCisgICAgKnAgPSBOVUxMOworICBlbHNlCisgICAgKnAgPSAoY2hhciopU09BUF9TVFJfRU9TOworICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHdsaXRlcmFsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHdjaGFyX3QgKmNvbnN0KnApCit7IGludCBpOworICBjb25zdCBjaGFyICp0ID0gTlVMTDsKKyAgd2NoYXJfdCBjOworICBjb25zdCB3Y2hhcl90ICpzOworICBpZiAodGFnICYmICp0YWcgIT0gJy0nKQorICB7IGlmIChzb2FwLT5sb2NhbF9uYW1lc3BhY2VzICYmICh0ID0gc3RyY2hyKHRhZywgJzonKSkpCisgICAgeyBzdHJuY3B5KHNvYXAtPnRtcGJ1ZiwgdGFnLCB0LXRhZyk7CisgICAgICBzb2FwLT50bXBidWZbdC10YWddID0gJ1wwJzsKKyAgICAgIGZvciAoaSA9IDA7IHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0uaWQ7IGkrKykKKyAgICAgICAgaWYgKCFzdHJjbXAoc29hcC0+dG1wYnVmLCBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW2ldLmlkKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIHQrKzsKKyAgICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiPCVzIHhtbG5zPVwiJXNcIj4iLCB0LCBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW2ldLm5zID8gc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tpXS5ucyA6IFNPQVBfU1RSX0VPUyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IHQgPSB0YWc7CisgICAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIjwlcz4iLCB0YWcpOworICAgIH0KKyAgICBpZiAoc29hcF9zZW5kKHNvYXAsIHNvYXAtPnRtcGJ1ZikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHApCisgIHsgcyA9ICpwOworICAgIHdoaWxlICgoYyA9ICpzKyspKQorICAgICAgaWYgKHNvYXBfcHV0dXRmOChzb2FwLCAodW5zaWduZWQgY2hhciljKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmICh0KQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiPC8lcz4iLCB0KTsKKyAgICByZXR1cm4gc29hcF9zZW5kKHNvYXAsIHNvYXAtPnRtcGJ1Zik7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3djaGFyX3QgKioKK1NPQVBfRk1BQzIKK3NvYXBfaW53bGl0ZXJhbChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB3Y2hhcl90ICoqcCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDEpKQorICB7IGlmIChzb2FwLT5lcnJvciAhPSBTT0FQX05PX1RBRyB8fCBzb2FwX3VuZ2V0KHNvYXAsIHNvYXBfZ2V0KHNvYXApKSA9PSBTT0FQX1RUKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICB9CisgIGlmICghcCkKKyAgICBpZiAoIShwID0gKHdjaGFyX3QqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yod2NoYXJfdCopKSkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgaWYgKHNvYXAtPmJvZHkpCisgICAgKnAgPSBzb2FwX3dzdHJpbmdfaW4oc29hcCwgMCwgLTEsIC0xKTsKKyAgZWxzZSBpZiAoc29hcC0+bnVsbCkKKyAgICAqcCA9IE5VTEw7CisgIGVsc2UKKyAgICAqcCA9ICh3Y2hhcl90KilTT0FQX1NUUl9FT1M7CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIgKgorU09BUF9GTUFDMgorc29hcF90b2tlbihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc2l6ZV90IGk7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IDA7CisgIHJlZ2lzdGVyIGNoYXIgKnMgPSBzb2FwLT50bXBidWY7CisgIGlmICghc29hcC0+Ym9keSkKKyAgICByZXR1cm4gU09BUF9TVFJfRU9TOworICBkbyBjID0gc29hcF9nZXQoc29hcCk7CisgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZihzb2FwLT50bXBidWYpIC0gMTsgaSsrKQorICB7IGlmIChjID09IFNPQVBfVFQgfHwgKGludCljID09IEVPRiB8fCBzb2FwX2JsYW5rKGMpKQorICAgICAgYnJlYWs7CisgICAgKnMrKyA9IChjaGFyKWM7CisgICAgYyA9IHNvYXBfZ2V0KHNvYXApOworICB9CisgIGlmICgoaW50KWMgPT0gRU9GIHx8IGMgPT0gU09BUF9UVCkKKyAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAqcyA9ICdcMCc7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRWxlbWVudCBjb250ZW50IHZhbHVlPSclcydcbiIsIHNvYXAtPnRtcGJ1ZikpOworICByZXR1cm4gc29hcC0+dG1wYnVmOyAvKiByZXR1cm4gbm9uLW51bGwgcG9pbnRlciAqLworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3ZhbHVlKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzaXplX3QgaTsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjID0gMDsKKyAgcmVnaXN0ZXIgY2hhciAqcyA9IHNvYXAtPnRtcGJ1ZjsKKyAgaWYgKCFzb2FwLT5ib2R5KQorICAgIHJldHVybiBTT0FQX1NUUl9FT1M7CisgIGRvIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZikgLSAxOyBpKyspCisgIHsgaWYgKGMgPT0gU09BUF9UVCB8fCAoaW50KWMgPT0gRU9GKQorICAgICAgYnJlYWs7CisgICAgKnMrKyA9IChjaGFyKWM7CisgICAgYyA9IHNvYXBfZ2V0KHNvYXApOworICB9CisgIGZvciAocy0tOyBpID4gMDsgaS0tLCBzLS0pCisgICAgaWYgKCFzb2FwX2JsYW5rKCpzKSkKKyAgICAgIGJyZWFrOworICBzWzFdID0gJ1wwJzsKKyAgaWYgKChpbnQpYyA9PSBFT0YgfHwgYyA9PSBTT0FQX1RUKQorICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRWxlbWVudCBjb250ZW50IHZhbHVlPSclcydcbiIsIHNvYXAtPnRtcGJ1ZikpOworI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICAgIHNvYXAtPmRvbS0+ZGF0YSA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPnRtcGJ1Zik7CisjZW5kaWYKKyAgcmV0dXJuIHNvYXAtPnRtcGJ1ZjsgLyogcmV0dXJuIG5vbi1udWxsIHBvaW50ZXIgKi8KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmICFkZWZpbmVkKFdJVEhfTEVBTkVSKSB8fCAhZGVmaW5lZChXSVRIX05PSFRUUCkKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0bGluZShzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqcywgaW50IGxlbikKK3sgaW50IGkgPSBsZW47CisgIHNvYXBfd2NoYXIgYyA9IDA7CisgIGZvciAoOzspCisgIHsgd2hpbGUgKC0taSA+IDApCisgICAgeyBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICAgICAgaWYgKGMgPT0gJ1xyJyB8fCBjID09ICdcbicpCisgICAgICAgIGJyZWFrOworICAgICAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgICAgKnMrKyA9IChjaGFyKWM7CisgICAgfQorICAgIGlmIChjICE9ICdcbicpCisgICAgICBjID0gc29hcF9nZXRjaGFyKHNvYXApOyAvKiBnb3QgXHIsIG5vdyBnZXQgXG4gKi8KKyAgICBpZiAoYyA9PSAnXG4nKQorICAgIHsgKnMgPSAnXDAnOworICAgICAgaWYgKGkrMSA9PSBsZW4pIC8qIGVtcHR5IGxpbmU6IGVuZCBvZiBIVFRQL01JTUUgaGVhZGVyICovCisgICAgICAgIGJyZWFrOworICAgICAgYyA9IHNvYXBfdW5nZXQoc29hcCwgc29hcF9nZXRjaGFyKHNvYXApKTsKKyAgICAgIGlmIChjICE9ICcgJyAmJiBjICE9ICdcdCcpIC8qIEhUVFAgbGluZSBjb250aW51YXRpb24/ICovCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBlbHNlIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzaXplX3QKK3NvYXBfY291bnRfYXR0YWNobWVudHMoc3RydWN0IHNvYXAgKnNvYXApCit7IAorI2lmbmRlZiBXSVRIX0xFQU5FUgorICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgIHJlZ2lzdGVyIHNpemVfdCBjb3VudCA9IHNvYXAtPmNvdW50OworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNhbGN1bGF0aW5nIHRoZSBtZXNzYWdlIHNpemUgd2l0aCBhdHRhY2htZW50cywgY3VycmVudCBjb3VudD0lbHVcbiIsICh1bnNpZ25lZCBsb25nKWNvdW50KSk7CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpICYmICEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ2FsY3VsYXRpbmcgdGhlIHNpemUgb2YgRElNRSBhdHRhY2htZW50c1xuIikpOworICAgIGZvciAoY29udGVudCA9IHNvYXAtPmRpbWUuZmlyc3Q7IGNvbnRlbnQ7IGNvbnRlbnQgPSBjb250ZW50LT5uZXh0KQorICAgIHsgY291bnQgKz0gMTIgKyAoKGNvbnRlbnQtPnNpemUrMykmKH4zKSk7CisgICAgICBpZiAoY29udGVudC0+aWQpCisgICAgICAgIGNvdW50ICs9ICgoc3RybGVuKGNvbnRlbnQtPmlkKSszKSYofjMpKTsKKyAgICAgIGlmIChjb250ZW50LT50eXBlKQorICAgICAgICBjb3VudCArPSAoKHN0cmxlbihjb250ZW50LT50eXBlKSszKSYofjMpKTsKKyAgICAgIGlmIChjb250ZW50LT5vcHRpb25zKQorICAgICAgICBjb3VudCArPSAoKCgodW5zaWduZWQgY2hhciljb250ZW50LT5vcHRpb25zWzJdIDw8IDgpIHwgKCh1bnNpZ25lZCBjaGFyKWNvbnRlbnQtPm9wdGlvbnNbM10pKSs3KSYofjMpOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTaXplIG9mIERJTUUgYXR0YWNobWVudCBjb250ZW50IGlzICVsdSBieXRlc1xuIiwgKHVuc2lnbmVkIGxvbmcpY29udGVudC0+c2l6ZSkpOworICAgIH0KKyAgfQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKSAmJiBzb2FwLT5taW1lLmJvdW5kYXJ5KQorICB7IHJlZ2lzdGVyIHNpemVfdCBuID0gc3RybGVuKHNvYXAtPm1pbWUuYm91bmRhcnkpOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ2FsY3VsYXRpbmcgdGhlIHNpemUgb2YgTUlNRSBhdHRhY2htZW50c1xuIikpOworICAgIGZvciAoY29udGVudCA9IHNvYXAtPm1pbWUuZmlyc3Q7IGNvbnRlbnQ7IGNvbnRlbnQgPSBjb250ZW50LT5uZXh0KQorICAgIHsgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKKyAgICAgIC8qIGNvdW50IFxyXG4tLWJvdW5kYXJ5XHJcbiAqLworICAgICAgY291bnQgKz0gNiArIG47CisgICAgICAvKiBjb3VudCBDb250ZW50LVR5cGU6IC4uLlxyXG4gKi8KKyAgICAgIGlmIChjb250ZW50LT50eXBlKQorICAgICAgICBjb3VudCArPSAxNiArIHN0cmxlbihjb250ZW50LT50eXBlKTsKKyAgICAgIC8qIGNvdW50IENvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IC4uLlxyXG4gKi8KKyAgICAgIHMgPSBzb2FwX3N0cl9jb2RlKG1pbWVfY29kZXMsIGNvbnRlbnQtPmVuY29kaW5nKTsKKyAgICAgIGlmIChzKQorICAgICAgICBjb3VudCArPSAyOSArIHN0cmxlbihzKTsKKyAgICAgIC8qIGNvdW50IENvbnRlbnQtSUQ6IC4uLlxyXG4gKi8KKyAgICAgIGlmIChjb250ZW50LT5pZCkKKyAgICAgICAgY291bnQgKz0gMTQgKyBzdHJsZW4oY29udGVudC0+aWQpOworICAgICAgLyogY291bnQgQ29udGVudC1Mb2NhdGlvbjogLi4uXHJcbiAqLworICAgICAgaWYgKGNvbnRlbnQtPmxvY2F0aW9uKQorICAgICAgICBjb3VudCArPSAyMCArIHN0cmxlbihjb250ZW50LT5sb2NhdGlvbik7CisgICAgICAvKiBjb3VudCBDb250ZW50LURlc2NyaXB0aW9uOiAuLi5cclxuICovCisgICAgICBpZiAoY29udGVudC0+ZGVzY3JpcHRpb24pCisgICAgICAgIGNvdW50ICs9IDIzICsgc3RybGVuKGNvbnRlbnQtPmxvY2F0aW9uKTsKKyAgICAgIC8qIGNvdW50IFxyXG4uLi5jb250ZW50ICovCisgICAgICBjb3VudCArPSAyICsgY29udGVudC0+c2l6ZTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2l6ZSBvZiBNSU1FIGF0dGFjaG1lbnQgY29udGVudCBpcyAlbHUgYnl0ZXNcbiIsICh1bnNpZ25lZCBsb25nKWNvbnRlbnQtPnNpemUpKTsKKyAgICB9CisgICAgLyogY291bnQgXHJcbi0tYm91bmRhcnktLSAqLworICAgIGNvdW50ICs9IDYgKyBuOworICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTmV3IGNvdW50IGlzICVsdSBieXRlc1xuIiwgKHVuc2lnbmVkIGxvbmcpY291bnQpKTsKKyAgcmV0dXJuIGNvdW50OworI2Vsc2UKKyAgcmV0dXJuIHNvYXAtPmNvdW50OworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzb2FwX3B1dGRpbWVmaWVsZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgc2l6ZV90IG4pCit7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIG4pKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgU09BUF9TVFJfUEFERElORywgLShsb25nKW4mMyk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9kaW1lX29wdGlvbihzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgc2hvcnQgb3B0eXBlLCBjb25zdCBjaGFyICpvcHRpb24pCit7IHNpemVfdCBuOworICBjaGFyICpzID0gTlVMTDsKKyAgaWYgKG9wdGlvbikKKyAgeyBuID0gc3RybGVuKG9wdGlvbik7CisgICAgcyA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBuICsgNSk7CisgICAgaWYgKHMpCisgICAgeyBzWzBdID0gb3B0eXBlID4+IDg7CisgICAgICBzWzFdID0gb3B0eXBlICYgMHhGRjsKKyAgICAgIHNbMl0gPSBuID4+IDg7CisgICAgICBzWzNdID0gbiAmIDB4RkY7CisgICAgICBzdHJjcHkocyArIDQsIG9wdGlvbik7CisgICAgfQorICB9CisgIHJldHVybiBzOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0ZGltZWhkcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgdW5zaWduZWQgY2hhciB0bXBbMTJdOworICBzaXplX3Qgb3B0bGVuID0gMCwgaWRsZW4gPSAwLCB0eXBlbGVuID0gMDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQdXQgRElNRSBoZWFkZXIgaWQ9JyVzJ1xuIiwgc29hcC0+ZGltZS5pZD9zb2FwLT5kaW1lLmlkOiIiKSk7CisgIGlmIChzb2FwLT5kaW1lLm9wdGlvbnMpCisgICAgb3B0bGVuID0gKCgodW5zaWduZWQgY2hhcilzb2FwLT5kaW1lLm9wdGlvbnNbMl0gPDwgOCkgfCAoKHVuc2lnbmVkIGNoYXIpc29hcC0+ZGltZS5vcHRpb25zWzNdKSkgKyA0OworICBpZiAoc29hcC0+ZGltZS5pZCkKKyAgICBpZGxlbiA9IHN0cmxlbihzb2FwLT5kaW1lLmlkKTsKKyAgaWYgKHNvYXAtPmRpbWUudHlwZSkKKyAgICB0eXBlbGVuID0gc3RybGVuKHNvYXAtPmRpbWUudHlwZSk7CisgIHRtcFswXSA9IFNPQVBfRElNRV9WRVJTSU9OIHwgKHNvYXAtPmRpbWUuZmxhZ3MgJiAweDcpOworICB0bXBbMV0gPSBzb2FwLT5kaW1lLmZsYWdzICYgMHhGMDsKKyAgdG1wWzJdID0gb3B0bGVuID4+IDg7CisgIHRtcFszXSA9IG9wdGxlbiAmIDB4RkY7CisgIHRtcFs0XSA9IGlkbGVuID4+IDg7CisgIHRtcFs1XSA9IGlkbGVuICYgMHhGRjsKKyAgdG1wWzZdID0gdHlwZWxlbiA+PiA4OworICB0bXBbN10gPSB0eXBlbGVuICYgMHhGRjsKKyAgdG1wWzhdID0gc29hcC0+ZGltZS5zaXplID4+IDI0OworICB0bXBbOV0gPSAoc29hcC0+ZGltZS5zaXplID4+IDE2KSAmIDB4RkY7CisgIHRtcFsxMF0gPSAoc29hcC0+ZGltZS5zaXplID4+IDgpICYgMHhGRjsKKyAgdG1wWzExXSA9IHNvYXAtPmRpbWUuc2l6ZSAmIDB4RkY7CisgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIChjaGFyKil0bXAsIDEyKQorICAgfHwgc29hcF9wdXRkaW1lZmllbGQoc29hcCwgc29hcC0+ZGltZS5vcHRpb25zLCBvcHRsZW4pCisgICB8fCBzb2FwX3B1dGRpbWVmaWVsZChzb2FwLCBzb2FwLT5kaW1lLmlkLCBpZGxlbikKKyAgIHx8IHNvYXBfcHV0ZGltZWZpZWxkKHNvYXAsIHNvYXAtPmRpbWUudHlwZSwgdHlwZWxlbikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dGRpbWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpKQorICAgIHJldHVybiBTT0FQX09LOworICBmb3IgKGNvbnRlbnQgPSBzb2FwLT5kaW1lLmZpcnN0OyBjb250ZW50OyBjb250ZW50ID0gY29udGVudC0+bmV4dCkKKyAgeyB2b2lkICpoYW5kbGU7CisgICAgc29hcC0+ZGltZS5zaXplID0gY29udGVudC0+c2l6ZTsKKyAgICBzb2FwLT5kaW1lLmlkID0gY29udGVudC0+aWQ7CisgICAgc29hcC0+ZGltZS50eXBlID0gY29udGVudC0+dHlwZTsKKyAgICBzb2FwLT5kaW1lLm9wdGlvbnMgPSBjb250ZW50LT5vcHRpb25zOworICAgIHNvYXAtPmRpbWUuZmxhZ3MgPSBTT0FQX0RJTUVfVkVSU0lPTiB8IFNPQVBfRElNRV9NRURJQTsKKyAgICBpZiAoc29hcC0+ZmRpbWVyZWFkb3BlbiAmJiAoKGhhbmRsZSA9IHNvYXAtPmZkaW1lcmVhZG9wZW4oc29hcCwgKHZvaWQqKWNvbnRlbnQtPnB0ciwgY29udGVudC0+aWQsIGNvbnRlbnQtPnR5cGUsIGNvbnRlbnQtPm9wdGlvbnMpKSB8fCBzb2FwLT5lcnJvcikpCisgICAgeyBzaXplX3Qgc2l6ZSA9IGNvbnRlbnQtPnNpemU7CisgICAgICBpZiAoIWhhbmRsZSkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJmZGltZXJlYWRvcGVuIGZhaWxlZFxuIikpOworICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB9CisgICAgICBpZiAoIWNvbnRlbnQtPnNpemUgJiYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfWE1MKSB8fCAoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTksgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX1NUT1JFKSkKKyAgICAgIHsgc2l6ZV90IGNodW5rc2l6ZSA9IHNpemVvZihzb2FwLT50bXBidWYpOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNodW5rZWQgc3RyZWFtaW5nIERJTUVcbiIpKTsKKyAgICAgICAgZG8gCisgICAgICAgIHsgc2l6ZSA9IHNvYXAtPmZkaW1lcmVhZChzb2FwLCBoYW5kbGUsIHNvYXAtPnRtcGJ1ZiwgY2h1bmtzaXplKTsKKyAgICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImZkaW1lcmVhZCByZXR1cm5lZCAlbHUgYnl0ZXNcbiIsICh1bnNpZ25lZCBsb25nKXNpemUpKTsKKyAgICAgICAgICBpZiAoc2l6ZSA8IGNodW5rc2l6ZSkKKyAJICB7IHNvYXAtPmRpbWUuZmxhZ3MgJj0gflNPQVBfRElNRV9DRjsKKyAgICAgICAgICAgIGlmICghY29udGVudC0+bmV4dCkKKyAgICAgICAgICAgICAgc29hcC0+ZGltZS5mbGFncyB8PSBTT0FQX0RJTUVfTUU7CisJICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgc29hcC0+ZGltZS5mbGFncyB8PSBTT0FQX0RJTUVfQ0Y7CisJICBzb2FwLT5kaW1lLnNpemUgPSBzaXplOworICAgICAgICAgIGlmIChzb2FwX3B1dGRpbWVoZHIoc29hcCkKKwkgICB8fCBzb2FwX3B1dGRpbWVmaWVsZChzb2FwLCBzb2FwLT50bXBidWYsIHNpemUpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgaWYgKHNvYXAtPmRpbWUuaWQpCisgCSAgeyBzb2FwLT5kaW1lLmZsYWdzICY9IH4oU09BUF9ESU1FX01CIHwgU09BUF9ESU1FX01FRElBKTsKKyAgICAgICAgICAgIHNvYXAtPmRpbWUuaWQgPSBOVUxMOworICAgICAgICAgICAgc29hcC0+ZGltZS50eXBlID0gTlVMTDsKKyAgICAgICAgICAgIHNvYXAtPmRpbWUub3B0aW9ucyA9IE5VTEw7CisgICAgICAgICAgfSAgCisgICAgICAgIH0gd2hpbGUgKHNpemUgPj0gY2h1bmtzaXplKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgaWYgKCFjb250ZW50LT5uZXh0KQorICAgICAgICAgIHNvYXAtPmRpbWUuZmxhZ3MgfD0gU09BUF9ESU1FX01FOworICAgICAgICBpZiAoc29hcF9wdXRkaW1laGRyKHNvYXApKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgZG8KKyAgICAgICAgeyBzaXplX3QgYnVmc2l6ZTsKKwkgIGlmIChzaXplIDwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZikpCisgICAgICAgICAgICBidWZzaXplID0gc2l6ZTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBidWZzaXplID0gc2l6ZW9mKHNvYXAtPnRtcGJ1Zik7CisgICAgICAgICAgaWYgKCEoYnVmc2l6ZSA9IHNvYXAtPmZkaW1lcmVhZChzb2FwLCBoYW5kbGUsIHNvYXAtPnRtcGJ1ZiwgYnVmc2l6ZSkpKQorICAgICAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJmZGltZXJlYWQgZmFpbGVkOiBpbnN1ZmZpY2llbnQgZGF0YSAoJWx1IGJ5dGVzIHJlbWFpbmluZyBmcm9tICVsdSBieXRlcylcbiIsICh1bnNpZ25lZCBsb25nKXNpemUsICh1bnNpZ25lZCBsb25nKXNvYXAtPmRpbWUuc2l6ZSkpOworICAgICAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKwkgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHNvYXAtPnRtcGJ1ZiwgYnVmc2l6ZSkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBzaXplIC09IGJ1ZnNpemU7CisgICAgICAgIH0gd2hpbGUgKHNpemUpOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImZkaW1lcmVhZGNsb3NlXG4iKSk7CisgICAgICAgIHNvYXBfc2VuZF9yYXcoc29hcCwgU09BUF9TVFJfUEFERElORywgLShsb25nKXNvYXAtPmRpbWUuc2l6ZSYzKTsKKyAgICAgIH0KKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZmRpbWVyZWFkY2xvc2VcbiIpKTsKKyAgICAgIGlmIChzb2FwLT5mZGltZXJlYWRjbG9zZSkKKyAgICAgICAgc29hcC0+ZmRpbWVyZWFkY2xvc2Uoc29hcCwgaGFuZGxlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgaWYgKCFjb250ZW50LT5uZXh0KQorICAgICAgICBzb2FwLT5kaW1lLmZsYWdzIHw9IFNPQVBfRElNRV9NRTsKKyAgICAgIGlmIChzb2FwX3B1dGRpbWVoZHIoc29hcCkKKyAgICAgICB8fCBzb2FwX3B1dGRpbWVmaWVsZChzb2FwLCAoY2hhciopY29udGVudC0+cHRyLCBjb250ZW50LT5zaXplKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNoYXIgKgorc29hcF9nZXRkaW1lZmllbGQoc3RydWN0IHNvYXAgKnNvYXAsIHNpemVfdCBuKQoreyByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBjaGFyICpzOworICBjaGFyICpwID0gTlVMTDsKKyAgaWYgKG4pCisgIHsgcCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBuICsgMSk7CisgICAgaWYgKHApCisgICAgeyBzID0gcDsKKyAgICAgIGZvciAoaSA9IG47IGkgPiAwOyBpLS0pCisgICAgICB7IGlmICgoaW50KShjID0gc29hcF9nZXQxKHNvYXApKSA9PSBFT0YpCisgICAgICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICAqcysrID0gKGNoYXIpYzsKKyAgICAgIH0KKyAgICAgICpzID0gJ1wwJzsKKyAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwX21vdmUoc29hcCwgLShsb25nKW4mMykpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgfQorICByZXR1cm4gcDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldGRpbWVoZHIoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgcmVnaXN0ZXIgY2hhciAqczsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIHVuc2lnbmVkIGNoYXIgdG1wWzEyXTsKKyAgc2l6ZV90IG9wdGxlbiwgaWRsZW4sIHR5cGVsZW47CisgIGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0RJTUVfRU5EOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdldCBESU1FIGhlYWRlclxuIikpOworICBpZiAoc29hcC0+ZGltZS5idWZsZW4gfHwgc29hcC0+ZGltZS5jaHVua3NpemUpCisgIHsgaWYgKHNvYXBfbW92ZShzb2FwLCAobG9uZykoc29hcC0+ZGltZS5zaXplIC0gc29hcF90ZWxsKHNvYXApKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICBzb2FwX3VuZ2V0KHNvYXAsIHNvYXBfZ2V0Y2hhcihzb2FwKSk7IC8qIHNraXAgcGFkZGluZyBhbmQgZ2V0IGhkciAqLworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiLi4uIEZyb20gY2h1bmtlZFxuIikpOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIHMgPSAoY2hhciopdG1wOworICBmb3IgKGkgPSAxMjsgaSA+IDA7IGktLSkKKyAgeyBpZiAoKGludCkoYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKSkgPT0gRU9GKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgKnMrKyA9IChjaGFyKWM7CisgIH0KKyAgaWYgKCh0bXBbMF0gJiAweEY4KSAhPSBTT0FQX0RJTUVfVkVSU0lPTikKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0RJTUVfTUlTTUFUQ0g7CisgIHNvYXAtPmRpbWUuZmxhZ3MgPSAodG1wWzBdICYgMHg3KSB8ICh0bXBbMV0gJiAweEYwKTsKKyAgb3B0bGVuID0gKHRtcFsyXSA8PCA4KSB8IHRtcFszXTsKKyAgaWRsZW4gPSAodG1wWzRdIDw8IDgpIHwgdG1wWzVdOworICB0eXBlbGVuID0gKHRtcFs2XSA8PCA4KSB8IHRtcFs3XTsKKyAgc29hcC0+ZGltZS5zaXplID0gKHRtcFs4XSA8PCAyNCkgfCAodG1wWzldIDw8IDE2KSB8ICh0bXBbMTBdIDw8IDgpIHwgdG1wWzExXTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJESU1FIHNpemU9JWx1IGZsYWdzPTB4JVhcbiIsICh1bnNpZ25lZCBsb25nKXNvYXAtPmRpbWUuc2l6ZSwgc29hcC0+ZGltZS5mbGFncykpOworICBpZiAoIShzb2FwLT5kaW1lLm9wdGlvbnMgPSBzb2FwX2dldGRpbWVmaWVsZChzb2FwLCBvcHRsZW4pKSAmJiBzb2FwLT5lcnJvcikKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmICghKHNvYXAtPmRpbWUuaWQgPSBzb2FwX2dldGRpbWVmaWVsZChzb2FwLCBpZGxlbikpICYmIHNvYXAtPmVycm9yKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKCEoc29hcC0+ZGltZS50eXBlID0gc29hcF9nZXRkaW1lZmllbGQoc29hcCwgdHlwZWxlbikpICYmIHNvYXAtPmVycm9yKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJESU1FIGlkPSVzLCB0eXBlPSVzLCBvcHRpb25zPSVzXG4iLCBzb2FwLT5kaW1lLmlkP3NvYXAtPmRpbWUuaWQ6IiIsIHNvYXAtPmRpbWUudHlwZT9zb2FwLT5kaW1lLnR5cGU6IiIsIHNvYXAtPmRpbWUub3B0aW9ucz9zb2FwLT5kaW1lLm9wdGlvbnMrNDoiIikpOworICBpZiAoc29hcC0+ZGltZS5mbGFncyAmIFNPQVBfRElNRV9NRSkKKyAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0VOQ19ESU1FOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldGRpbWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHdoaWxlIChzb2FwLT5kaW1lLmZsYWdzICYgU09BUF9ESU1FX0NGKQorICB7IGlmIChzb2FwX2dldGRpbWVoZHIoc29hcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHNvYXBfbW92ZShzb2FwLCBzb2FwLT5kaW1lLnNpemUpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIH0KKyAgaWYgKHNvYXBfbW92ZShzb2FwLCAoKHNvYXAtPmRpbWUuc2l6ZSszKSYofjMpKS1zb2FwX3RlbGwoc29hcCkpKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICBmb3IgKDs7KQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgICBpZiAoc29hcF9nZXRkaW1laGRyKHNvYXApKQorICAgICAgYnJlYWs7CisgICAgaWYgKHNvYXAtPmZkaW1ld3JpdGVvcGVuICYmICgoc29hcC0+ZGltZS5wdHIgPSAoY2hhciopc29hcC0+ZmRpbWV3cml0ZW9wZW4oc29hcCwgc29hcC0+ZGltZS5pZCwgc29hcC0+ZGltZS50eXBlLCBzb2FwLT5kaW1lLm9wdGlvbnMpKSB8fCBzb2FwLT5lcnJvcikpCisgICAgeyBjb25zdCBjaGFyICppZCwgKnR5cGUsICpvcHRpb25zOworICAgICAgc2l6ZV90IHNpemUsIG47CisgICAgICBpZiAoIXNvYXAtPmRpbWUucHRyKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBpZCA9IHNvYXAtPmRpbWUuaWQ7CisgICAgICB0eXBlID0gc29hcC0+ZGltZS50eXBlOworICAgICAgb3B0aW9ucyA9IHNvYXAtPmRpbWUub3B0aW9uczsKKyAgICAgIGZvciAoOzspCisgICAgICB7IHNpemUgPSBzb2FwLT5kaW1lLnNpemU7CisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsgbiA9IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICAgICAgICBpZiAoc2l6ZSA8IG4pCisgICAgICAgICAgICBuID0gc2l6ZTsKKyAgICAgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZmRpbWV3cml0ZShzb2FwLCAodm9pZCopc29hcC0+ZGltZS5wdHIsIHNvYXAtPmJ1ZiArIHNvYXAtPmJ1ZmlkeCwgbikpKQorICAgICAgICAgICAgYnJlYWs7CisJICBzaXplIC09IG47CisJICBpZiAoIXNpemUpCisJICB7IHNvYXAtPmJ1ZmlkeCArPSBuOworCSAgICBicmVhazsKKwkgIH0KKwkgIGlmIChzb2FwX3JlY3Yoc29hcCkpCisgICAgICAgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworCSAgICBnb3RvIGVuZDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvYXBfbW92ZShzb2FwLCAtKGxvbmcpc29hcC0+ZGltZS5zaXplJjMpKQorICAgICAgICB7IHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisJICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShzb2FwLT5kaW1lLmZsYWdzICYgU09BUF9ESU1FX0NGKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKHNvYXBfZ2V0ZGltZWhkcihzb2FwKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KK2VuZDoKKyAgICAgIGlmIChzb2FwLT5mZGltZXdyaXRlY2xvc2UpCisgICAgICAgIHNvYXAtPmZkaW1ld3JpdGVjbG9zZShzb2FwLCAodm9pZCopc29hcC0+ZGltZS5wdHIpOworICAgICAgc29hcC0+ZGltZS5zaXplID0gMDsKKyAgICAgIHNvYXAtPmRpbWUuaWQgPSBpZDsKKyAgICAgIHNvYXAtPmRpbWUudHlwZSA9IHR5cGU7CisgICAgICBzb2FwLT5kaW1lLm9wdGlvbnMgPSBvcHRpb25zOworICAgIH0KKyAgICBlbHNlIGlmIChzb2FwLT5kaW1lLmZsYWdzICYgU09BUF9ESU1FX0NGKQorICAgIHsgY29uc3QgY2hhciAqaWQsICp0eXBlLCAqb3B0aW9uczsKKyAgICAgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgICAgIHJlZ2lzdGVyIGNoYXIgKnM7CisgICAgICByZWdpc3RlciBpbnQgaTsKKyAgICAgIGlkID0gc29hcC0+ZGltZS5pZDsKKyAgICAgIHR5cGUgPSBzb2FwLT5kaW1lLnR5cGU7CisgICAgICBvcHRpb25zID0gc29hcC0+ZGltZS5vcHRpb25zOworICAgICAgaWYgKHNvYXBfbmV3X2Jsb2NrKHNvYXApKQorICAgICAgICByZXR1cm4gU09BUF9FT007CisgICAgICBmb3IgKDs7KQorICAgICAgeyBzID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBzb2FwLT5kaW1lLnNpemUpOworICAgICAgICBpZiAoIXMpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICAgIGZvciAoaSA9IHNvYXAtPmRpbWUuc2l6ZTsgaSA+IDA7IGktLSkKKyAgICAgICAgeyBpZiAoKGludCkoYyA9IHNvYXBfZ2V0MShzb2FwKSkgPT0gRU9GKQorICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgICAgICAgKnMrKyA9IChjaGFyKWM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvYXBfbW92ZShzb2FwLCAtKGxvbmcpc29hcC0+ZGltZS5zaXplJjMpKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgICAgICBpZiAoIShzb2FwLT5kaW1lLmZsYWdzICYgU09BUF9ESU1FX0NGKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKHNvYXBfZ2V0ZGltZWhkcihzb2FwKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB9CisgICAgICBzb2FwLT5kaW1lLnNpemUgPSBzb2FwLT5ibGlzdC0+c2l6ZSsrOyAvKiBhbGxvY2F0ZSBvbmUgbW9yZSBmb3IgJ1wwJyAqLworICAgICAgaWYgKCEoc29hcC0+ZGltZS5wdHIgPSBzb2FwX3NhdmVfYmxvY2soc29hcCwgTlVMTCwgMCkpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBzb2FwLT5kaW1lLnB0cltzb2FwLT5kaW1lLnNpemVdID0gJ1wwJzsgLyogZm9yY2UgMC10ZXJtaW5hdGVkICovCisgICAgICBzb2FwLT5kaW1lLmlkID0gaWQ7CisgICAgICBzb2FwLT5kaW1lLnR5cGUgPSB0eXBlOworICAgICAgc29hcC0+ZGltZS5vcHRpb25zID0gb3B0aW9uczsKKyAgICB9CisgICAgZWxzZQorICAgICAgc29hcC0+ZGltZS5wdHIgPSBzb2FwX2dldGRpbWVmaWVsZChzb2FwLCBzb2FwLT5kaW1lLnNpemUpOworICAgIGNvbnRlbnQgPSBzb2FwX25ld19tdWx0aXBhcnQoc29hcCwgJnNvYXAtPmRpbWUuZmlyc3QsICZzb2FwLT5kaW1lLmxhc3QsIHNvYXAtPmRpbWUucHRyLCBzb2FwLT5kaW1lLnNpemUpOworICAgIGlmICghY29udGVudCkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIGNvbnRlbnQtPmlkID0gc29hcC0+ZGltZS5pZDsKKyAgICBjb250ZW50LT50eXBlID0gc29hcC0+ZGltZS50eXBlOworICAgIGNvbnRlbnQtPm9wdGlvbnMgPSBzb2FwLT5kaW1lLm9wdGlvbnM7CisgICAgc29hcF9yZXNvbHZlX2F0dGFjaG1lbnQoc29hcCwgY29udGVudCk7CisgICAgaWYgKHNvYXAtPmVycm9yKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmIChzb2FwLT5lcnJvciAhPSBTT0FQX0RJTUVfRU5EKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldG1pbWVoZHIoc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgZG8KKyAgeyBpZiAoc29hcF9nZXRsaW5lKHNvYXAsIHNvYXAtPm1zZ2J1Ziwgc2l6ZW9mKHNvYXAtPm1zZ2J1ZikpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHdoaWxlICghKnNvYXAtPm1zZ2J1Zik7CisgIGlmIChzb2FwLT5tc2didWZbMF0gPT0gJy0nICYmIHNvYXAtPm1zZ2J1ZlsxXSA9PSAnLScpCisgIHsgY2hhciAqcyA9IHNvYXAtPm1zZ2J1ZiArIHN0cmxlbihzb2FwLT5tc2didWYpIC0gMTsKKyAgICAvKiByZW1vdmUgd2hpdGUgc3BhY2UgKi8KKyAgICB3aGlsZSAoc29hcF9ibGFuaygqcykpCisgICAgICBzLS07CisgICAgc1sxXSA9ICdcMCc7CisgICAgaWYgKHNvYXAtPm1pbWUuYm91bmRhcnkpCisgICAgeyBpZiAoc3RyY21wKHNvYXAtPm1zZ2J1ZiArIDIsIHNvYXAtPm1pbWUuYm91bmRhcnkpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX01JTUVfRVJST1I7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHNvYXAtPm1pbWUuYm91bmRhcnkgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT5tc2didWYgKyAyKTsKKyAgICBpZiAoc29hcF9nZXRsaW5lKHNvYXAsIHNvYXAtPm1zZ2J1Ziwgc2l6ZW9mKHNvYXAtPm1zZ2J1ZikpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmIChzb2FwX3NldF9taW1lX2F0dGFjaG1lbnQoc29hcCwgTlVMTCwgMCwgU09BUF9NSU1FX05PTkUsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICBjb250ZW50ID0gc29hcC0+bWltZS5sYXN0OworICBmb3IgKDs7KQorICB7IHJlZ2lzdGVyIGNoYXIgKmtleSA9IHNvYXAtPm1zZ2J1ZjsKKyAgICByZWdpc3RlciBjaGFyICp2YWw7CisgICAgaWYgKCEqa2V5KQorICAgICAgYnJlYWs7CisgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk1JTUUgaGVhZGVyOiAlc1xuIiwga2V5KSk7CisgICAgdmFsID0gc3RyY2hyKHNvYXAtPm1zZ2J1ZiwgJzonKTsKKyAgICBpZiAodmFsKQorICAgIHsgKnZhbCA9ICdcMCc7CisgICAgICBkbyB2YWwrKzsKKyAgICAgIHdoaWxlICgqdmFsICYmICp2YWwgPD0gMzIpOworICAgICAgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1JRCIpKQorICAgICAgICBjb250ZW50LT5pZCA9IHNvYXBfc3RyZHVwKHNvYXAsIHZhbCk7CisgICAgICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtTG9jYXRpb24iKSkKKyAgICAgICAgY29udGVudC0+bG9jYXRpb24gPSBzb2FwX3N0cmR1cChzb2FwLCB2YWwpOworICAgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LURpc3Bvc2l0aW9uIikpCisgICAgICAgIGNvbnRlbnQtPmlkID0gc29hcF9zdHJkdXAoc29hcCwgc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwsICJuYW1lIikpOworICAgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LVR5cGUiKSkKKyAgICAgICAgY29udGVudC0+dHlwZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHZhbCk7CisgICAgICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtRGVzY3JpcHRpb24iKSkKKyAgICAgICAgY29udGVudC0+ZGVzY3JpcHRpb24gPSBzb2FwX3N0cmR1cChzb2FwLCB2YWwpOworICAgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIikpCisgICAgICAgIGNvbnRlbnQtPmVuY29kaW5nID0gKGVudW0gc29hcF9taW1lX2VuY29kaW5nKXNvYXBfaW50X2NvZGUobWltZV9jb2RlcywgdmFsLCAobG9uZylTT0FQX01JTUVfTk9ORSk7CisgICAgfQorICAgIGlmIChzb2FwX2dldGxpbmUoc29hcCwga2V5LCBzaXplb2Yoc29hcC0+bXNnYnVmKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRtaW1lKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzb2FwX3djaGFyIGMgPSAwOworICBpZiAoIXNvYXAtPm1pbWUubGFzdCkKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgZm9yICg7OykKKyAgeyByZWdpc3RlciBzaXplX3QgaSwgbSA9IDA7CisgICAgcmVnaXN0ZXIgY2hhciAqcywgKnQgPSBOVUxMOworICAgIHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudCA9IHNvYXAtPm1pbWUubGFzdDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlBhcnNpbmcgTUlNRSBjb250ZW50IGlkPSVzIHR5cGU9JXNcbiIsIGNvbnRlbnQtPmlkP2NvbnRlbnQtPmlkOiIiLCBjb250ZW50LT50eXBlP2NvbnRlbnQtPnR5cGU6IiIpKTsKKyAgICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICBmb3IgKDs7KQorICAgIHsgcmVnaXN0ZXIgc2hvcnQgZmxhZyA9IDA7CisgICAgICBpZiAoIShzID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBTT0FQX0JMS0xFTikpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0JMS0xFTjsgaSsrKQorICAgICAgeyBpZiAobSA+IDApCisgICAgICAgIHsgKnMrKyA9ICp0Kys7CisJICBtLS07CisJfQorCWVsc2UKKyAgICAgICAgeyBpZiAoIWZsYWcpCisJICB7IGMgPSBzb2FwX2dldDEoc29hcCk7CisJICAgIGlmICgoaW50KWMgPT0gRU9GKQorCSAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworCSAgfQorCSAgaWYgKGZsYWcgfHwgYyA9PSAnXHInKQorCSAgeyB0ID0gc29hcC0+dG1wYnVmOworCSAgICBtZW1zZXQodCwgMCwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZikpOworICAgICAgICAgICAgc3RyY3B5KHQsICJcbi0tIik7CisgICAgICAgICAgICBpZiAoc29hcC0+bWltZS5ib3VuZGFyeSkKKwkgICAgICBzdHJuY2F0KHQsIHNvYXAtPm1pbWUuYm91bmRhcnksIHNpemVvZihzb2FwLT50bXBidWYpLTQpOworCSAgICBkbyBjID0gc29hcF9nZXRjaGFyKHNvYXApOworCSAgICB3aGlsZSAoYyA9PSAqdCsrKTsKKwkgICAgaWYgKChpbnQpYyA9PSBFT0YpCisJICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisJICAgIGlmICghKi0tdCkKKwkgICAgICBnb3RvIGVuZDsKKwkgICAgKnQgPSAoY2hhciljOworCSAgICBmbGFnID0gKGMgPT0gJ1xyJyk7CisJICAgIG0gPSB0IC0gc29hcC0+dG1wYnVmICsgMSAtIGZsYWc7CisJICAgIHQgPSBzb2FwLT50bXBidWY7CisJICAgIGMgPSAnXHInOworCSAgfQorCSAgKnMrKyA9IChjaGFyKWM7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CitlbmQ6CisgICAgKnMgPSAnXDAnOyAvKiBmb3JjZSAwLXRlcm1pbmF0ZWQgKi8KKyAgICBjb250ZW50LT5zaXplID0gc29hcF9zaXplX2Jsb2NrKHNvYXAsIGkrMSktMTsKKyAgICBjb250ZW50LT5wdHIgPSBzb2FwX3NhdmVfYmxvY2soc29hcCwgTlVMTCwgMCk7CisgICAgc29hcF9yZXNvbHZlX2F0dGFjaG1lbnQoc29hcCwgY29udGVudCk7CisgICAgaWYgKGMgPT0gJy0nICYmIHNvYXBfZ2V0Y2hhcihzb2FwKSA9PSAnLScpCisgICAgICBicmVhazsKKyAgICB3aGlsZSAoYyAhPSAnXHInICYmIChpbnQpYyAhPSBFT0YgJiYgc29hcF9ibGFuayhjKSkKKyAgICAgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgICAgaWYgKGMgIT0gJ1xyJyB8fCBzb2FwX2dldGNoYXIoc29hcCkgIT0gJ1xuJykKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTUlNRV9FUlJPUjsKKyAgICBpZiAoc29hcF9nZXRtaW1laGRyKHNvYXApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzb2FwX21hdGNoX2NpZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqdCkKK3sgcmVnaXN0ZXIgc2l6ZV90IG47CisgIGlmICghcykKKyAgICByZXR1cm4gMTsKKyAgaWYgKCFzdHJjbXAocywgdCkpCisgICAgcmV0dXJuIDA7CisgIGlmICghc3RybmNtcChzLCAiY2lkOiIsIDQpKQorICAgIHMgKz0gNDsKKyAgbiA9IHN0cmxlbih0KTsKKyAgaWYgKCp0ID09ICc8JykKKyAgeyB0Kys7CisgICAgbiAtPSAyOworICB9CisgIGlmICghc3RybmNtcChzLCB0LCBuKSAmJiAhc1tuXSkKKyAgICByZXR1cm4gMDsKKyAgc29hcF9kZWNvZGUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgcywgU09BUF9TVFJfRU9TKTsKKyAgaWYgKCFzdHJuY21wKHNvYXAtPnRtcGJ1ZiwgdCwgbikgJiYgIXNvYXAtPnRtcGJ1ZltuXSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIDE7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyB2b2lkCitzb2FwX3Jlc29sdmVfYXR0YWNobWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50KQoreyBpZiAoY29udGVudC0+aWQpCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfeGxpc3QgKip4cCA9ICZzb2FwLT54bGlzdDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc29sdmluZyBhdHRhY2htZW50IGRhdGEgZm9yIGlkPSVzXG4iLCBjb250ZW50LT5pZCkpOworICAgIHdoaWxlICgqeHApCisgICAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF94bGlzdCAqeHEgPSAqeHA7CisgICAgICBpZiAoIXNvYXBfbWF0Y2hfY2lkKHNvYXAsIHhxLT5pZCwgY29udGVudC0+aWQpKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZvdW5kIG1hdGNoaW5nIGF0dGFjaG1lbnQgJXMgZm9yIGNvbnRlbnQgaWQ9JXNcbiIsIHhxLT5pZCwgY29udGVudC0+aWQpKTsKKwkqeHAgPSB4cS0+bmV4dDsKKyAgICAgICAgKnhxLT5wdHIgPSAodW5zaWduZWQgY2hhciopY29udGVudC0+cHRyOworICAgICAgICAqeHEtPnNpemUgPSAoaW50KWNvbnRlbnQtPnNpemU7CisgICAgICAgICp4cS0+dHlwZSA9IChjaGFyKiljb250ZW50LT50eXBlOworCWlmIChjb250ZW50LT5vcHRpb25zKQorICAgICAgICAgICp4cS0+b3B0aW9ucyA9IChjaGFyKiljb250ZW50LT5vcHRpb25zOworICAgICAgICBlbHNlCisgICAgICAgICAgKnhxLT5vcHRpb25zID0gKGNoYXIqKWNvbnRlbnQtPmRlc2NyaXB0aW9uOworCVNPQVBfRlJFRShzb2FwLCB4cSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHhwID0gJigqeHApLT5uZXh0OworICAgIH0KKyAgfQorfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0bWltZWhkcihzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50KQoreyBjb25zdCBjaGFyICpzOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk1JTUUgYXR0YWNobWVudCB0eXBlPSVzXG4iLCBjb250ZW50LT50eXBlP2NvbnRlbnQtPnR5cGU6IiIpKTsKKyAgaWYgKHNvYXBfc2VuZDMoc29hcCwgIlxyXG4tLSIsIHNvYXAtPm1pbWUuYm91bmRhcnksICJcclxuIikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoY29udGVudC0+dHlwZSAmJiBzb2FwX3NlbmQzKHNvYXAsICJDb250ZW50LVR5cGU6ICIsIGNvbnRlbnQtPnR5cGUsICJcclxuIikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBzID0gc29hcF9zdHJfY29kZShtaW1lX2NvZGVzLCBjb250ZW50LT5lbmNvZGluZyk7CisgIGlmIChzICYmIHNvYXBfc2VuZDMoc29hcCwgIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6ICIsIHMsICJcclxuIikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoY29udGVudC0+aWQgJiYgc29hcF9zZW5kMyhzb2FwLCAiQ29udGVudC1JRDogIiwgY29udGVudC0+aWQsICJcclxuIikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoY29udGVudC0+bG9jYXRpb24gJiYgc29hcF9zZW5kMyhzb2FwLCAiQ29udGVudC1Mb2NhdGlvbjogIiwgY29udGVudC0+bG9jYXRpb24sICJcclxuIikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoY29udGVudC0+ZGVzY3JpcHRpb24gJiYgc29hcF9zZW5kMyhzb2FwLCAiQ29udGVudC1EZXNjcmlwdGlvbjogIiwgY29udGVudC0+ZGVzY3JpcHRpb24sICJcclxuIikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCAiXHJcbiIsIDIpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0bWltZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkgfHwgIXNvYXAtPm1pbWUuYm91bmRhcnkpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2VuZGluZyBNSU1FIGF0dGFjaG1lbnRzXG4iKSk7CisgIGZvciAoY29udGVudCA9IHNvYXAtPm1pbWUuZmlyc3Q7IGNvbnRlbnQ7IGNvbnRlbnQgPSBjb250ZW50LT5uZXh0KQorICAgIGlmIChzb2FwX3B1dG1pbWVoZHIoc29hcCwgY29udGVudCkKKyAgICAgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCBjb250ZW50LT5wdHIsIGNvbnRlbnQtPnNpemUpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9zZW5kMyhzb2FwLCAiXHJcbi0tIiwgc29hcC0+bWltZS5ib3VuZGFyeSwgIi0tIik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2RpbWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPm9tb2RlIHw9IFNPQVBfRU5DX0RJTUU7CisgIHNvYXAtPmRpbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmxhc3QgPSBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9taW1lKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpib3VuZGFyeSwgY29uc3QgY2hhciAqc3RhcnQpCit7IHNvYXAtPm9tb2RlIHw9IFNPQVBfRU5DX01JTUU7CisgIHNvYXAtPm1pbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmxhc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gc29hcF9zdHJkdXAoc29hcCwgYm91bmRhcnkpOworICBzb2FwLT5taW1lLnN0YXJ0ID0gc29hcF9zdHJkdXAoc29hcCwgc3RhcnQpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2Nscl9kaW1lKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5vbW9kZSAmPSB+U09BUF9FTkNfRElNRTsKKyAgc29hcC0+ZGltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGFzdCA9IE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfY2xyX21pbWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPm9tb2RlICY9IH5TT0FQX0VOQ19NSU1FOworICBzb2FwLT5taW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5sYXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5ib3VuZGFyeSA9IE5VTEw7CisgIHNvYXAtPm1pbWUuc3RhcnQgPSBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc3RydWN0IHNvYXBfbXVsdGlwYXJ0Kgorc29hcF9uZXdfbXVsdGlwYXJ0KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKipmaXJzdCwgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICoqbGFzdCwgY2hhciAqcHRyLCBzaXplX3Qgc2l6ZSkKK3sgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICBjb250ZW50ID0gKHN0cnVjdCBzb2FwX211bHRpcGFydCopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX211bHRpcGFydCkpOworICBpZiAoY29udGVudCkKKyAgeyBjb250ZW50LT5uZXh0ID0gTlVMTDsKKyAgICBjb250ZW50LT5wdHIgPSBwdHI7CisgICAgY29udGVudC0+c2l6ZSA9IHNpemU7CisgICAgY29udGVudC0+aWQgPSBOVUxMOworICAgIGNvbnRlbnQtPnR5cGUgPSBOVUxMOworICAgIGNvbnRlbnQtPm9wdGlvbnMgPSBOVUxMOworICAgIGNvbnRlbnQtPmVuY29kaW5nID0gU09BUF9NSU1FX05PTkU7CisgICAgY29udGVudC0+bG9jYXRpb24gPSBOVUxMOworICAgIGNvbnRlbnQtPmRlc2NyaXB0aW9uID0gTlVMTDsKKyAgICBpZiAoISpmaXJzdCkKKyAgICAgICpmaXJzdCA9IGNvbnRlbnQ7CisgICAgaWYgKCpsYXN0KQorICAgICAgKCpsYXN0KS0+bmV4dCA9IGNvbnRlbnQ7CisgICAgKmxhc3QgPSBjb250ZW50OworICB9CisgIHJldHVybiBjb250ZW50OworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2RpbWVfYXR0YWNobWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqcHRyLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqaWQsIHVuc2lnbmVkIHNob3J0IG9wdHlwZSwgY29uc3QgY2hhciAqb3B0aW9uKQoreyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQgPSBzb2FwX25ld19tdWx0aXBhcnQoc29hcCwgJnNvYXAtPmRpbWUuZmlyc3QsICZzb2FwLT5kaW1lLmxhc3QsIHB0ciwgc2l6ZSk7CisgIGlmICghY29udGVudCkKKyAgICByZXR1cm4gU09BUF9FT007CisgIGNvbnRlbnQtPmlkID0gc29hcF9zdHJkdXAoc29hcCwgaWQpOworICBjb250ZW50LT50eXBlID0gc29hcF9zdHJkdXAoc29hcCwgdHlwZSk7CisgIGNvbnRlbnQtPm9wdGlvbnMgPSBzb2FwX2RpbWVfb3B0aW9uKHNvYXAsIG9wdHlwZSwgb3B0aW9uKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZXRfbWltZV9hdHRhY2htZW50KHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpwdHIsIHNpemVfdCBzaXplLCBlbnVtIHNvYXBfbWltZV9lbmNvZGluZyBlbmNvZGluZywgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKmxvY2F0aW9uLCBjb25zdCBjaGFyICpkZXNjcmlwdGlvbikKK3sgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50ID0gc29hcF9uZXdfbXVsdGlwYXJ0KHNvYXAsICZzb2FwLT5taW1lLmZpcnN0LCAmc29hcC0+bWltZS5sYXN0LCBwdHIsIHNpemUpOworICBpZiAoIWNvbnRlbnQpCisgICAgcmV0dXJuIFNPQVBfRU9NOworICBjb250ZW50LT5pZCA9IHNvYXBfc3RyZHVwKHNvYXAsIGlkKTsKKyAgY29udGVudC0+dHlwZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHR5cGUpOworICBjb250ZW50LT5lbmNvZGluZyA9IGVuY29kaW5nOworICBjb250ZW50LT5sb2NhdGlvbiA9IHNvYXBfc3RyZHVwKHNvYXAsIGxvY2F0aW9uKTsKKyAgY29udGVudC0+ZGVzY3JpcHRpb24gPSBzb2FwX3N0cmR1cChzb2FwLCBkZXNjcmlwdGlvbik7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqCitTT0FQX0ZNQUMyCitzb2FwX25leHRfbXVsdGlwYXJ0KHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudCkKK3sgaWYgKGNvbnRlbnQpCisgICAgcmV0dXJuIGNvbnRlbnQtPm5leHQ7CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZAorc29hcF9zZWxlY3RfbWltZV9ib3VuZGFyeShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgd2hpbGUgKCFzb2FwLT5taW1lLmJvdW5kYXJ5IHx8IHNvYXBfdmFsaWRfbWltZV9ib3VuZGFyeShzb2FwKSkKKyAgeyByZWdpc3RlciBjaGFyICpzID0gc29hcC0+bWltZS5ib3VuZGFyeTsKKyAgICByZWdpc3RlciBzaXplX3QgbiA9IDA7CisgICAgaWYgKHMpCisgICAgICBuID0gc3RybGVuKHMpOworICAgIGlmIChuIDwgMTYpCisgICAgeyBuID0gNjQ7CisgICAgICBzID0gc29hcC0+bWltZS5ib3VuZGFyeSA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBuICsgMSk7CisgICAgICBpZiAoIXMpCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RyY3B5KHMsICI9PSIpOworICAgIHMgKz0gMjsKKyAgICBuIC09IDQ7CisgICAgd2hpbGUgKG4pCisgICAgeyAqcysrID0gc29hcF9iYXNlNjRvW3NvYXBfcmFuZG9tICYgMHgzRl07CisgICAgICBuLS07CisgICAgfQorICAgIHN0cmNweShzLCAiPT0iKTsKKyAgfQorICBpZiAoIXNvYXAtPm1pbWUuc3RhcnQpCisgICAgc29hcC0+bWltZS5zdGFydCA9ICI8U09BUC1FTlY6RW52ZWxvcGU+IjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc29hcF92YWxpZF9taW1lX2JvdW5kYXJ5KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgIHJlZ2lzdGVyIHNpemVfdCBrID0gc3RybGVuKHNvYXAtPm1pbWUuYm91bmRhcnkpOworICBmb3IgKGNvbnRlbnQgPSBzb2FwLT5taW1lLmZpcnN0OyBjb250ZW50OyBjb250ZW50ID0gY29udGVudC0+bmV4dCkKKyAgeyBpZiAoY29udGVudC0+cHRyICYmIGNvbnRlbnQtPnNpemUgPj0gaykKKyAgICB7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnAgPSAoY29uc3QgY2hhciopY29udGVudC0+cHRyOyAKKyAgICAgIHJlZ2lzdGVyIHNpemVfdCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IGNvbnRlbnQtPnNpemUgLSBrOyBpKyssIHArKykKKyAgICAgICAgaWYgKCFzdHJuY21wKHAsIHNvYXAtPm1pbWUuYm91bmRhcnksIGspKQorICAgICAgICAgIHJldHVybiBTT0FQX0VSUjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqCUhUVFAgY29va2llIGhhbmRsaW5nCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIFdJVEhfQ09PS0lFUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3NpemVfdAorU09BUF9GTUFDMgorc29hcF9lbmNvZGVfY29va2llKGNvbnN0IGNoYXIgKnMsIGNoYXIgKnQsIHNpemVfdCBsZW4pCit7IHJlZ2lzdGVyIGludCBjOworICByZWdpc3RlciBzaXplX3QgbiA9IGxlbjsKKyAgd2hpbGUgKChjID0gKnMrKykgJiYgLS1uID4gMCkKKyAgeyBpZiAoYyA+ICcgJyAmJiBjIDwgMTI4ICYmICFzdHJjaHIoIigpPD5ALDs6XFxcIi9bXT89e30iLCBjKSkKKyAgICAgICp0KysgPSBjOworICAgIGVsc2UgaWYgKG4gPiAyKQorICAgIHsgKnQrKyA9ICclJzsKKyAgICAgICp0KysgPSAoYyA+PiA0KSArIChjID4gMTU5ID8gJzcnIDogJzAnKTsKKyAgICAgIGMgJj0gMHhGOworICAgICAgKnQrKyA9IGMgKyAoYyA+IDkgPyAnNycgOiAnMCcpOworICAgICAgbiAtPSAyOworICAgIH0KKyAgICBlbHNlCisgICAgICBicmVhazsKKyAgfQorICAqdCA9ICdcMCc7CisgIHJldHVybiBsZW4gLSBuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQorc3RydWN0IHNvYXBfY29va2llKgorU09BUF9GTUFDMgorc29hcF9jb29raWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBzaXplX3QgbjsKKyAgaWYgKCFkb21haW4pCisgICAgZG9tYWluID0gc29hcC0+Y29va2llX2RvbWFpbjsKKyAgaWYgKCFwYXRoKQorICAgIHBhdGggPSBzb2FwLT5jb29raWVfcGF0aDsKKyAgaWYgKCpwYXRoID09ICcvJykKKyAgICBwYXRoKys7CisgIG4gPSBzdHJsZW4ocGF0aCk7CisgIGZvciAocCA9IHNvYXAtPmNvb2tpZXM7IHA7IHAgPSBwLT5uZXh0KQorICAgIGlmICghc3RyY21wKHAtPm5hbWUsIG5hbWUpCisgICAgICYmIGRvbWFpbgorICAgICAmJiBwLT5kb21haW4KKyAgICAgJiYgIXN0cmNtcChwLT5kb21haW4sIGRvbWFpbikKKyAgICAgJiYgIXN0cm5jbXAocC0+cGF0aCwgcGF0aCwgbikpCisgICAgICBicmVhazsKKyAgcmV0dXJuIHA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcF9jb29raWUqCitTT0FQX0ZNQUMyCitzb2FwX3NldF9jb29raWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqKnAsICpxOworICBpbnQgbjsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTZXQgY29va2llOiAlcz0lcyBkb21haW49JXMgcGF0aD0lc1xuIiwgbmFtZSwgdmFsdWU/dmFsdWU6IiIsIGRvbWFpbj9kb21haW46IiIsIHBhdGg/cGF0aDoiIikpOworICBpZiAoIWRvbWFpbikKKyAgICBkb21haW4gPSBzb2FwLT5jb29raWVfZG9tYWluOworICBpZiAoIXBhdGgpCisgICAgcGF0aCA9IHNvYXAtPmNvb2tpZV9wYXRoOworICBpZiAoIXBhdGgpCisgIHsgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIkNvb2tpZSBwYXRoIG5vdCBzZXQiLCBOVUxMLCBTT0FQX0hUVFBfRVJST1IpOworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmICgqcGF0aCA9PSAnLycpCisgICAgcGF0aCsrOworICBxID0gc29hcF9jb29raWUoc29hcCwgbmFtZSwgZG9tYWluLCBwYXRoKTsKKyAgaWYgKCFxKQorICB7IGlmICgocSA9IChzdHJ1Y3Qgc29hcF9jb29raWUqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9jb29raWUpKSkpCisgICAgeyBpZiAoKHEtPm5hbWUgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKG5hbWUpKzEpKSkKKyAgICAgICAgc3RyY3B5KHEtPm5hbWUsIG5hbWUpOworICAgICAgcS0+dmFsdWUgPSBOVUxMOworICAgICAgcS0+ZG9tYWluID0gTlVMTDsKKyAgICAgIHEtPnBhdGggPSBOVUxMOworICAgICAgcS0+ZXhwaXJlID0gLTE7CisgICAgICBxLT52ZXJzaW9uID0gMDsKKyAgICAgIHEtPnNlY3VyZSA9IDA7CisgICAgICBxLT5tb2RpZmllZCA9IDA7CisgICAgICBmb3IgKHAgPSAmc29hcC0+Y29va2llcywgbiA9IHNvYXAtPmNvb2tpZV9tYXg7ICpwICYmIG47IHAgPSAmKCpwKS0+bmV4dCwgbi0tKQorICAgICAgICBpZiAoIXN0cmNtcCgoKnApLT5uYW1lLCBuYW1lKSAmJiAoKnApLT5wYXRoICYmIHN0cmNtcCgoKnApLT5wYXRoLCBwYXRoKSA8IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICBpZiAobikKKyAgICAgIHsgcS0+bmV4dCA9ICpwOworICAgICAgICAqcCA9IHE7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IFNPQVBfRlJFRShzb2FwLCBxLT5uYW1lKTsKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHEpOworICAgICAgICBxID0gTlVMTDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZQorICAgIHEtPm1vZGlmaWVkID0gMTsKKyAgaWYgKHEpCisgIHsgaWYgKHEtPnZhbHVlKQorICAgIHsgU09BUF9GUkVFKHNvYXAsIHEtPnZhbHVlKTsKKyAgICAgIHEtPnZhbHVlID0gTlVMTDsKKyAgICB9CisgICAgaWYgKHEtPmRvbWFpbikKKyAgICB7IFNPQVBfRlJFRShzb2FwLCBxLT5kb21haW4pOworICAgICAgcS0+ZG9tYWluID0gTlVMTDsKKyAgICB9CisgICAgaWYgKHEtPnBhdGgpCisgICAgeyBTT0FQX0ZSRUUoc29hcCwgcS0+cGF0aCk7CisgICAgICBxLT5wYXRoID0gTlVMTDsKKyAgICB9CisgICAgaWYgKHZhbHVlICYmICp2YWx1ZSAmJiAocS0+dmFsdWUgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHZhbHVlKSsxKSkpCisgICAgICBzdHJjcHkocS0+dmFsdWUsIHZhbHVlKTsKKyAgICBpZiAoZG9tYWluICYmICpkb21haW4gJiYgKHEtPmRvbWFpbiA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4oZG9tYWluKSsxKSkpCisgICAgICBzdHJjcHkocS0+ZG9tYWluLCBkb21haW4pOworICAgIGlmIChwYXRoICYmICpwYXRoICYmIChxLT5wYXRoID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihwYXRoKSsxKSkpCisgICAgICBzdHJjcHkocS0+cGF0aCwgcGF0aCk7CisgICAgcS0+c2Vzc2lvbiA9IDE7CisgICAgcS0+ZW52ID0gMDsKKyAgfQorICByZXR1cm4gcTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfY2xyX2Nvb2tpZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKipwLCAqcTsKKyAgaWYgKCFkb21haW4pCisgICAgZG9tYWluID0gc29hcC0+Y29va2llX2RvbWFpbjsKKyAgaWYgKCFkb21haW4pCisgIHsgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIkNvb2tpZSBkb21haW4gbm90IHNldCIsIE5VTEwsIFNPQVBfSFRUUF9FUlJPUik7CisgICAgcmV0dXJuOworICB9CisgIGlmICghcGF0aCkKKyAgICBwYXRoID0gc29hcC0+Y29va2llX3BhdGg7CisgIGlmICghcGF0aCkKKyAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiQ29va2llIHBhdGggbm90IHNldCIsIE5VTEwsIFNPQVBfSFRUUF9FUlJPUik7CisgICAgcmV0dXJuOworICB9CisgIGlmICgqcGF0aCA9PSAnLycpCisgICAgcGF0aCsrOworICBmb3IgKHAgPSAmc29hcC0+Y29va2llcywgcSA9ICpwOyBxOyBxID0gKnApCisgICAgaWYgKCFzdHJjbXAocS0+bmFtZSwgbmFtZSkgJiYgIXN0cmNtcChxLT5kb21haW4sIGRvbWFpbikgJiYgIXN0cm5jbXAocS0+cGF0aCwgcGF0aCwgc3RybGVuKHEtPnBhdGgpKSkKKyAgICB7IGlmIChxLT52YWx1ZSkKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHEtPnZhbHVlKTsKKyAgICAgIGlmIChxLT5kb21haW4pCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBxLT5kb21haW4pOworICAgICAgaWYgKHEtPnBhdGgpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBxLT5wYXRoKTsKKyAgICAgICpwID0gcS0+bmV4dDsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBxKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgcCA9ICZxLT5uZXh0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX2Nvb2tpZV92YWx1ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGlmICgocCA9IHNvYXBfY29va2llKHNvYXAsIG5hbWUsIGRvbWFpbiwgcGF0aCkpKQorICAgIHJldHVybiBwLT52YWx1ZTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfZW52X2Nvb2tpZV92YWx1ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGlmICgocCA9IHNvYXBfY29va2llKHNvYXAsIG5hbWUsIGRvbWFpbiwgcGF0aCkpICYmIHAtPmVudikKKyAgICByZXR1cm4gcC0+dmFsdWU7CisgIHJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQorbG9uZworU09BUF9GTUFDMgorc29hcF9jb29raWVfZXhwaXJlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgaWYgKChwID0gc29hcF9jb29raWUoc29hcCwgbmFtZSwgZG9tYWluLCBwYXRoKSkpCisgICAgcmV0dXJuIHAtPmV4cGlyZTsKKyAgcmV0dXJuIC0xOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NldF9jb29raWVfZXhwaXJlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBsb25nIGV4cGlyZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGlmICgocCA9IHNvYXBfY29va2llKHNvYXAsIG5hbWUsIGRvbWFpbiwgcGF0aCkpKQorICB7IHAtPmV4cGlyZSA9IGV4cGlyZTsKKyAgICBwLT5tb2RpZmllZCA9IDE7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgcmV0dXJuIFNPQVBfRVJSOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NldF9jb29raWVfc2Vzc2lvbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGlmICgocCA9IHNvYXBfY29va2llKHNvYXAsIG5hbWUsIGRvbWFpbiwgcGF0aCkpKQorICB7IHAtPnNlc3Npb24gPSAxOworICAgIHAtPm1vZGlmaWVkID0gMTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICByZXR1cm4gU09BUF9FUlI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfY2xyX2Nvb2tpZV9zZXNzaW9uKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgaWYgKChwID0gc29hcF9jb29raWUoc29hcCwgbmFtZSwgZG9tYWluLCBwYXRoKSkpCisgIHsgcC0+c2Vzc2lvbiA9IDA7CisgICAgcC0+bW9kaWZpZWQgPSAxOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIHJldHVybiBTT0FQX0VSUjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRzZXRjb29raWVzKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGNoYXIgKnMsIHRtcFs0MDk2XTsKKyAgY29uc3QgY2hhciAqdDsKKyAgZm9yIChwID0gc29hcC0+Y29va2llczsgcDsgcCA9IHAtPm5leHQpCisgIHsgaWYgKHAtPm1vZGlmaWVkIHx8ICFwLT5lbnYpCisgICAgeyBzID0gdG1wOworICAgICAgaWYgKHAtPm5hbWUpCisgICAgICAgIHMgKz0gc29hcF9lbmNvZGVfY29va2llKHAtPm5hbWUsIHMsIHRtcC1zKzQwNjQpOworICAgICAgaWYgKHAtPnZhbHVlICYmICpwLT52YWx1ZSkKKyAgICAgIHsgKnMrKyA9ICc9JzsKKyAgICAgICAgcyArPSBzb2FwX2VuY29kZV9jb29raWUocC0+dmFsdWUsIHMsIHRtcC1zKzQwNjQpOworICAgICAgfQorICAgICAgaWYgKHAtPmRvbWFpbiAmJiAoaW50KXN0cmxlbihwLT5kb21haW4pIDwgdG1wLXMrNDA2NCkKKyAgICAgICAgc3ByaW50ZihzLCAiO0RvbWFpbj1cIiVzXCIiLCBwLT5kb21haW4pOworICAgICAgZWxzZSBpZiAoc29hcC0+Y29va2llX2RvbWFpbiAmJiAoaW50KXN0cmxlbihzb2FwLT5jb29raWVfZG9tYWluKSA8IHRtcC1zKzQwNjQpCisgICAgICAgIHNwcmludGYocywgIjtEb21haW49XCIlc1wiIiwgc29hcC0+Y29va2llX2RvbWFpbik7CisgICAgICBzdHJjYXQocywgIjtQYXRoPVwiLyIpOworICAgICAgaWYgKHAtPnBhdGgpCisgICAgICAgIHQgPSBwLT5wYXRoOworICAgICAgZWxzZQorICAgICAgICB0ID0gc29hcC0+Y29va2llX3BhdGg7CisgICAgICBpZiAodCkKKyAgICAgIHsgaWYgKCp0ID09ICcvJykKKyAgICAgICAgICB0Kys7CisgICAgICAgIGlmICgoaW50KXN0cmxlbih0KSA8IHRtcC1zKzQwNjQpCisgICAgICAgICAgc3RyY2F0KHMsIHQpOworICAgICAgfQorICAgICAgcyArPSBzdHJsZW4ocyk7CisgICAgICAqcysrID0gJyInOworICAgICAgaWYgKHAtPnZlcnNpb24gPiAwKQorICAgICAgICBzcHJpbnRmKHMsICI7VmVyc2lvbj0ldSIsIHAtPnZlcnNpb24pOworICAgICAgaWYgKHAtPmV4cGlyZSA+PSAwKQorICAgICAgICBzcHJpbnRmKHMsICI7TWF4LUFnZT0lbGQiLCBwLT5leHBpcmUpOworICAgICAgaWYgKHAtPnNlY3VyZSkKKyAgICAgICAgc3RyY2F0KHMsICI7U2VjdXJlIik7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNldC1Db29raWU6ICVzXG4iLCB0bXApKTsKKyAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiU2V0LUNvb2tpZSIsIHRtcCkpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICB9CisgIHJldHVybiBTT0FQX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dGNvb2tpZXMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCwgaW50IHNlY3VyZSkKK3sgc3RydWN0IHNvYXBfY29va2llICoqcCwgKnE7CisgIHVuc2lnbmVkIGludCB2ZXJzaW9uID0gMDsKKyAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CisgIGNoYXIgKnMsIHRtcFs0MDk2XTsKKyAgcCA9ICZzb2FwLT5jb29raWVzOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNlbmRpbmcgY29va2llcyBmb3IgZG9tYWluPSVzIHBhdGg9JXNcbiIsIGRvbWFpbiwgcGF0aCkpOworICBpZiAoKnBhdGggPT0gJy8nKQorICAgIHBhdGgrKzsKKyAgd2hpbGUgKChxID0gKnApKQorICB7IGlmIChxLT5leHBpcmUgJiYgbm93ID4gcS0+ZXhwaXJlKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb29raWUgJXMgZXhwaXJlZFxuIiwgcS0+bmFtZSkpOworICAgICAgU09BUF9GUkVFKHNvYXAsIHEtPm5hbWUpOworICAgICAgaWYgKHEtPnZhbHVlKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcS0+dmFsdWUpOworICAgICAgaWYgKHEtPmRvbWFpbikKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHEtPmRvbWFpbik7CisgICAgICBpZiAocS0+cGF0aCkKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHEtPnBhdGgpOworICAgICAgKnAgPSBxLT5uZXh0OworICAgICAgU09BUF9GUkVFKHNvYXAsIHEpOworICAgIH0KKyAgICBlbHNlCisgICAgeyBzaXplX3QgZG9tbGVuID0gMDsKKyAgICAgIGlmIChxLT5kb21haW4pCisgICAgICB7IGNvbnN0IGNoYXIgKnMgPSBzdHJjaHIocS0+ZG9tYWluLCAnOicpOworICAgICAgICBpZiAocykKKwkgIGRvbWxlbiA9IHMgLSBxLT5kb21haW47CisJZWxzZQorICAgICAgICAgIGRvbWxlbiA9IHN0cmxlbihxLT5kb21haW4pOworICAgICAgfQorICAgICAgaWYgKCghcS0+ZG9tYWluIHx8ICFzdHJuY21wKHEtPmRvbWFpbiwgZG9tYWluLCBkb21sZW4pKQorICAgICAgICAgICYmICghcS0+cGF0aCB8fCAhc3RybmNtcChxLT5wYXRoLCBwYXRoLCBzdHJsZW4ocS0+cGF0aCkpKQorICAgICAgICAgICYmICghcS0+c2VjdXJlIHx8IHNlY3VyZSkpCisgICAgICB7IHMgPSB0bXA7CisgICAgICAgIGlmIChxLT52ZXJzaW9uICE9IHZlcnNpb24pCisgICAgICAgIHsgc3ByaW50ZihzLCAiJFZlcnNpb249JXU7IiwgcS0+dmVyc2lvbik7CisgICAgICAgICAgdmVyc2lvbiA9IHEtPnZlcnNpb247CisgICAgICAgIH0KKyAgICAgICAgaWYgKHEtPm5hbWUpCisgICAgICAgICAgcyArPSBzb2FwX2VuY29kZV9jb29raWUocS0+bmFtZSwgcywgdG1wLXMrNDA4MCk7CisgICAgICAgIGlmIChxLT52YWx1ZSAmJiAqcS0+dmFsdWUpCisgICAgICAgIHsgKnMrKyA9ICc9JzsKKyAgICAgICAgICBzICs9IHNvYXBfZW5jb2RlX2Nvb2tpZShxLT52YWx1ZSwgcywgdG1wLXMrNDA4MCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHEtPnBhdGggJiYgKGludClzdHJsZW4ocS0+cGF0aCkgPCB0bXAtcys0MDgwKQorICAgICAgICB7IHNwcmludGYocywgIjskUGF0aD1cIi8lc1wiIiwgKCpxLT5wYXRoID09ICcvJyA/IHEtPnBhdGggKyAxIDogcS0+cGF0aCkpOworICAgICAgICAgIHMgKz0gc3RybGVuKHMpOworICAgICAgICB9CisgICAgICAgIGlmIChxLT5kb21haW4gJiYgKGludClzdHJsZW4ocS0+ZG9tYWluKSA8IHRtcC1zKzQwODApCisgICAgICAgICAgc3ByaW50ZihzLCAiOyREb21haW49XCIlc1wiIiwgcS0+ZG9tYWluKTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb29raWU6ICVzXG4iLCB0bXApKTsKKyAgICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJDb29raWUiLCB0bXApKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB9CisgICAgICBwID0gJnEtPm5leHQ7CisgICAgfQorICB9CisgIHJldHVybiBTT0FQX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9nZXRjb29raWVzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp2YWwpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcCA9IE5VTEwsICpxOworICBjb25zdCBjaGFyICpzOworICBjaGFyICp0LCB0bXBbNDA5Nl07IC8qIGNvb2tpZSBzaXplIGlzIHVwIHRvIDQwOTYgYnl0ZXMgW1JGQzIxMDldICovCisgIGNoYXIgKmRvbWFpbiA9IE5VTEw7CisgIGNoYXIgKnBhdGggPSBOVUxMOworICB1bnNpZ25lZCBpbnQgdmVyc2lvbiA9IDA7CisgIHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOworICBpZiAoIXZhbCkKKyAgICByZXR1cm47CisgIHMgPSB2YWw7CisgIHdoaWxlICgqcykKKyAgeyBzID0gc29hcF9kZWNvZGVfa2V5KHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgIGlmICghc29hcF90YWdfY21wKHRtcCwgIiRWZXJzaW9uIikpCisgICAgeyBpZiAoKHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcykpKQorICAgICAgeyBpZiAocCkKKyAgICAgICAgICBwLT52ZXJzaW9uID0gKGludClhdG9sKHRtcCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICB2ZXJzaW9uID0gKGludClhdG9sKHRtcCk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAodG1wLCAiJFBhdGgiKSkKKyAgICB7IHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICBpZiAoKnRtcCkKKyAgICAgIHsgaWYgKCh0ID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbih0bXApKzEpKSkKKyAgICAgICAgICBzdHJjcHkodCwgdG1wKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgdCA9IE5VTEw7CisgICAgICBpZiAocCkKKyAgICAgIHsgaWYgKHAtPnBhdGgpCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnBhdGgpOworICAgICAgICBwLT5wYXRoID0gdDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgaWYgKHBhdGgpCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHBhdGgpOworICAgICAgICBwYXRoID0gdDsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcCh0bXAsICIkRG9tYWluIikpCisgICAgeyBzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgICAgaWYgKCp0bXApCisgICAgICB7IGlmICgodCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4odG1wKSsxKSkpCisgICAgICAgICAgc3RyY3B5KHQsIHRtcCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHQgPSBOVUxMOworICAgICAgaWYgKHApCisgICAgICB7IGlmIChwLT5kb21haW4pCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPmRvbWFpbik7CisJcC0+ZG9tYWluID0gdDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgaWYgKGRvbWFpbikKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgZG9tYWluKTsKKyAgICAgICAgZG9tYWluID0gdDsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAocCAmJiAhc29hcF90YWdfY21wKHRtcCwgIlBhdGgiKSkKKyAgICB7IGlmIChwLT5wYXRoKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+cGF0aCk7CisgICAgICBzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgICAgaWYgKCp0bXApCisgICAgICB7IGlmICgocC0+cGF0aCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4odG1wKSsxKSkpCisgICAgICAgICAgc3RyY3B5KHAtPnBhdGgsIHRtcCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHAtPnBhdGggPSBOVUxMOworICAgIH0KKyAgICBlbHNlIGlmIChwICYmICFzb2FwX3RhZ19jbXAodG1wLCAiRG9tYWluIikpCisgICAgeyBpZiAocC0+ZG9tYWluKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+ZG9tYWluKTsKKyAgICAgIHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICBpZiAoKnRtcCkKKyAgICAgIHsgaWYgKChwLT5kb21haW4gPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHRtcCkrMSkpKQorICAgICAgICAgIHN0cmNweShwLT5kb21haW4sIHRtcCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHAtPmRvbWFpbiA9IE5VTEw7CisgICAgfQorICAgIGVsc2UgaWYgKHAgJiYgIXNvYXBfdGFnX2NtcCh0bXAsICJWZXJzaW9uIikpCisgICAgeyBzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgICAgcC0+dmVyc2lvbiA9ICh1bnNpZ25lZCBpbnQpYXRvbCh0bXApOworICAgIH0KKyAgICBlbHNlIGlmIChwICYmICFzb2FwX3RhZ19jbXAodG1wLCAiTWF4LUFnZSIpKQorICAgIHsgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgIHAtPmV4cGlyZSA9IG5vdyArIGF0b2wodG1wKTsKKyAgICB9CisgICAgZWxzZSBpZiAocCAmJiAhc29hcF90YWdfY21wKHRtcCwgIkV4cGlyZXMiKSkKKyAgICB7IHN0cnVjdCB0bSBUOworICAgICAgY2hhciBhWzNdOyAKKyAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG1uc1tdID0gImFuZWJhcnByYXl1bnVsdWdlcGN0b3ZlYyI7CisgICAgICBzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgICAgaWYgKHN0cmxlbih0bXApID4gMjApCisgICAgICB7IG1lbXNldCgodm9pZCopJlQsIDAsIHNpemVvZihUKSk7CisgICAgICAgIGFbMF0gPSB0bXBbNF07CisgICAgICAgIGFbMV0gPSB0bXBbNV07CisgICAgICAgIGFbMl0gPSAnXDAnOworICAgICAgICBULnRtX21kYXkgPSAoaW50KWF0b2woYSk7CisgICAgICAgIGFbMF0gPSB0bXBbOF07CisgICAgICAgIGFbMV0gPSB0bXBbOV07CisgICAgICAgIFQudG1fbW9uID0gKHN0cnN0cihtbnMsIGEpIC0gbW5zKSAvIDI7CisgICAgICAgIGFbMF0gPSB0bXBbMTFdOworICAgICAgICBhWzFdID0gdG1wWzEyXTsKKyAgICAgICAgVC50bV95ZWFyID0gMTAwICsgKGludClhdG9sKGEpOworICAgICAgICBhWzBdID0gdG1wWzEzXTsKKyAgICAgICAgYVsxXSA9IHRtcFsxNF07CisgICAgICAgIFQudG1faG91ciA9IChpbnQpYXRvbChhKTsKKyAgICAgICAgYVswXSA9IHRtcFsxNl07CisgICAgICAgIGFbMV0gPSB0bXBbMTddOworICAgICAgICBULnRtX21pbiA9IChpbnQpYXRvbChhKTsKKyAgICAgICAgYVswXSA9IHRtcFsxOV07CisgICAgICAgIGFbMV0gPSB0bXBbMjBdOworICAgICAgICBULnRtX3NlYyA9IChpbnQpYXRvbChhKTsKKyAgICAgICAgcC0+ZXhwaXJlID0gc29hcF90aW1lZ20oJlQpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChwICYmICFzb2FwX3RhZ19jbXAodG1wLCAiU2VjdXJlIikpCisgICAgICBwLT5zZWN1cmUgPSAxOworICAgIGVsc2UKKyAgICB7IGlmIChwKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdvdCBlbnZpcm9ubWVudCBjb29raWUgJXM9JXMgZG9tYWluPSVzIHBhdGg9JXMgZXhwaXJlPSVsZCBzZWN1cmU9JWRcbiIsIHAtPm5hbWUsIHAtPnZhbHVlP3AtPnZhbHVlOiIiLCBwLT5kb21haW4/cC0+ZG9tYWluOiIiLCBwLT5wYXRoP3AtPnBhdGg6IiIsIHAtPmV4cGlyZSwgcC0+c2VjdXJlKSk7CisgICAgICAgIGlmICgocSA9IHNvYXBfc2V0X2Nvb2tpZShzb2FwLCBwLT5uYW1lLCBwLT52YWx1ZSwgcC0+ZG9tYWluLCBwLT5wYXRoKSkpCisgICAgICAgIHsgcS0+dmVyc2lvbiA9IHAtPnZlcnNpb247CisgICAgICAgICAgcS0+ZXhwaXJlID0gcC0+ZXhwaXJlOworICAgICAgICAgIHEtPnNlY3VyZSA9IHAtPnNlY3VyZTsKKyAgICAgICAgICBxLT5lbnYgPSAxOworICAgICAgICB9CisgICAgICAgIGlmIChwLT5uYW1lKQorICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5uYW1lKTsKKyAgICAgICAgaWYgKHAtPnZhbHVlKQorICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT52YWx1ZSk7CisgICAgICAgIGlmIChwLT5kb21haW4pCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPmRvbWFpbik7CisgICAgICAgIGlmIChwLT5wYXRoKQorICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5wYXRoKTsKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHApOworICAgICAgfQorICAgICAgaWYgKChwID0gKHN0cnVjdCBzb2FwX2Nvb2tpZSopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2Nvb2tpZSkpKSkKKyAgICAgIHsgcC0+bmFtZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4odG1wKSsxKTsKKyAgICAgICAgc3RyY3B5KHAtPm5hbWUsIHRtcCk7CisgICAgICAgIHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICAgIGlmICgqdG1wKQorICAgICAgICB7IHAtPnZhbHVlID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbih0bXApKzEpOworICAgICAgICAgIHN0cmNweShwLT52YWx1ZSwgdG1wKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgcC0+dmFsdWUgPSBOVUxMOworICAgICAgICBwLT5kb21haW4gPSBkb21haW47CisgICAgICAgIHAtPnBhdGggPSBwYXRoOworICAgICAgICBwLT5leHBpcmUgPSAwOworICAgICAgICBwLT5zZWN1cmUgPSAwOworICAgICAgICBwLT52ZXJzaW9uID0gdmVyc2lvbjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKHApCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHb3QgZW52aXJvbm1lbnQgY29va2llICVzPSVzIGRvbWFpbj0lcyBwYXRoPSVzIGV4cGlyZT0lbGQgc2VjdXJlPSVkXG4iLCBwLT5uYW1lLCBwLT52YWx1ZT9wLT52YWx1ZToiIiwgcC0+ZG9tYWluP3AtPmRvbWFpbjoiIiwgcC0+cGF0aD9wLT5wYXRoOiIiLCBwLT5leHBpcmUsIHAtPnNlY3VyZSkpOworICAgIGlmICgocSA9IHNvYXBfc2V0X2Nvb2tpZShzb2FwLCBwLT5uYW1lLCBwLT52YWx1ZSwgcC0+ZG9tYWluLCBwLT5wYXRoKSkpCisgICAgeyBxLT52ZXJzaW9uID0gcC0+dmVyc2lvbjsKKyAgICAgIHEtPmV4cGlyZSA9IHAtPmV4cGlyZTsKKyAgICAgIHEtPnNlY3VyZSA9IHAtPnNlY3VyZTsKKyAgICAgIHEtPmVudiA9IDE7CisgICAgfQorICAgIGlmIChwLT5uYW1lKQorICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPm5hbWUpOworICAgIGlmIChwLT52YWx1ZSkKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT52YWx1ZSk7CisgICAgaWYgKHAtPmRvbWFpbikKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5kb21haW4pOworICAgIGlmIChwLT5wYXRoKQorICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnBhdGgpOworICAgIFNPQVBfRlJFRShzb2FwLCBwKTsKKyAgfQorICBpZiAoZG9tYWluKQorICAgIFNPQVBfRlJFRShzb2FwLCBkb21haW4pOworICBpZiAocGF0aCkKKyAgICBTT0FQX0ZSRUUoc29hcCwgcGF0aCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0ZW52X2Nvb2tpZXMoc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgY29uc3QgY2hhciAqczsKKyAgY2hhciBrZXlbNDA5Nl0sIHZhbFs0MDk2XTsgLyogY29va2llIHNpemUgaXMgdXAgdG8gNDA5NiBieXRlcyBbUkZDMjEwOV0gKi8KKyAgaWYgKCEocyA9IGdldGVudigiSFRUUF9DT09LSUUiKSkpCisgICAgcmV0dXJuIFNPQVBfRVJSOworICBkbworICB7IHMgPSBzb2FwX2RlY29kZV9rZXkoa2V5LCBzaXplb2Yoa2V5KSwgcyk7CisgICAgcyA9IHNvYXBfZGVjb2RlX3ZhbCh2YWwsIHNpemVvZih2YWwpLCBzKTsKKyAgICBwID0gc29hcF9zZXRfY29va2llKHNvYXAsIGtleSwgdmFsLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAocCkKKyAgICAgIHAtPmVudiA9IDE7CisgIH0gd2hpbGUgKCpzKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcF9jb29raWUqCitTT0FQX0ZNQUMyCitzb2FwX2NvcHlfY29va2llcyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwLCAqKnEsICpyOworICBxID0gJnI7CisgIGZvciAocCA9IHNvYXAtPmNvb2tpZXM7IHA7IHAgPSBwLT5uZXh0KQorICB7IGlmICghKCpxID0gKHN0cnVjdCBzb2FwX2Nvb2tpZSopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2Nvb2tpZSkpKSkKKyAgICAgIHJldHVybiByOworICAgICoqcSA9ICpwOworICAgIGlmIChwLT5uYW1lKQorICAgIHsgaWYgKCgoKnEpLT5uYW1lID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihwLT5uYW1lKSsxKSkpCisgICAgICAgIHN0cmNweSgoKnEpLT5uYW1lLCBwLT5uYW1lKTsKKyAgICB9CisgICAgaWYgKHAtPnZhbHVlKQorICAgIHsgaWYgKCgoKnEpLT52YWx1ZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4ocC0+dmFsdWUpKzEpKSkKKyAgICAgICAgc3RyY3B5KCgqcSktPnZhbHVlLCBwLT52YWx1ZSk7CisgICAgfQorICAgIGlmIChwLT5kb21haW4pCisgICAgeyBpZiAoKCgqcSktPmRvbWFpbiA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4ocC0+ZG9tYWluKSsxKSkpCisgICAgICAgIHN0cmNweSgoKnEpLT5kb21haW4sIHAtPmRvbWFpbik7CisgICAgfQorICAgIGlmIChwLT5wYXRoKQorICAgIHsgaWYgKCgoKnEpLT5wYXRoID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihwLT5wYXRoKSsxKSkpCisgICAgICAgIHN0cmNweSgoKnEpLT5wYXRoLCBwLT5wYXRoKTsKKyAgICB9CisgICAgcSA9ICYoKnEpLT5uZXh0OworICB9CisgICpxID0gTlVMTDsKKyAgcmV0dXJuIHI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2ZyZWVfY29va2llcyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBmb3IgKHAgPSBzb2FwLT5jb29raWVzOyBwOyBwID0gc29hcC0+Y29va2llcykKKyAgeyBzb2FwLT5jb29raWVzID0gcC0+bmV4dDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgcC0+bmFtZSk7CisgICAgaWYgKHAtPnZhbHVlKQorICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnZhbHVlKTsKKyAgICBpZiAocC0+ZG9tYWluKQorICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPmRvbWFpbik7CisgICAgaWYgKHAtPnBhdGgpCisgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+cGF0aCk7CisgICAgU09BUF9GUkVFKHNvYXAsIHApOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZW5kaWYgLyogV0lUSF9DT09LSUVTICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgV0lUSF9HWklQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc29hcF9nZXRnemlwaGRyKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpbnQgaTsKKyAgc29hcF93Y2hhciBjLCBmID0gMDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHZXQgZ3ppcCBoZWFkZXJcbiIpKTsKKyAgZm9yIChpID0gMDsgaSA8IDk7IGkrKykKKyAgeyBpZiAoKGludCkoYyA9IHNvYXBfZ2V0MShzb2FwKSA9PSBFT0YpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgaWYgKGkgPT0gMikKKyAgICAgIGYgPSBjOworICB9CisgIGlmIChmICYgMHgwNCkgLyogRkVYVFJBICovCisgIHsgZm9yIChpID0gc29hcF9nZXQxKHNvYXApIHwgKHNvYXBfZ2V0MShzb2FwKSA8PCA4KTsgaTsgaS0tKQorICAgICAgaWYgKChpbnQpc29hcF9nZXQxKHNvYXApID09IEVPRikKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIH0KKyAgaWYgKGYgJiAweDA4KSAvKiBGTkFNRSAqLworICAgIGRvCisgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworICAgIHdoaWxlIChjICYmIChpbnQpYyAhPSBFT0YpOworICBpZiAoKGludCljICE9IEVPRiAmJiAoZiAmIDB4MTApKSAvKiBGQ09NTUVOVCAqLworICAgIGRvCisgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworICAgIHdoaWxlIChjICYmIChpbnQpZiAhPSBFT0YpOworICBpZiAoKGludCljICE9IEVPRiAmJiAoZiAmIDB4MDEpKSAvKiBGSENSQyAqLworICB7IGlmICgoaW50KShjID0gc29hcF9nZXQxKHNvYXApKSAhPSBFT0YpCisgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworICB9CisgIGlmICgoaW50KWMgPT0gRU9GKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JlZ2luX3JlY3Yoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXBfd2NoYXIgYzsKKyAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICBzb2FwX2ZyZWUoc29hcCk7CisgIHNvYXBfc2V0X2xvY2FsX25hbWVzcGFjZXMoc29hcCk7CisgIHNvYXAtPnZlcnNpb24gPSAwOwkvKiBkb24ndCBhc3N1bWUgd2UncmUgcGFyc2luZyBTT0FQIGNvbnRlbnQgYnkgZGVmYXVsdCAqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgc29hcF9mcmVlX2lodChzb2FwKTsKKyNlbmRpZgorICBpZiAoKHNvYXAtPmltb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgICBzb2FwLT5vbW9kZSB8PSBTT0FQX0lPX0NIVU5LOworICBzb2FwLT5pbW9kZSAmPSB+U09BUF9JTzsKKyAgc29hcC0+bW9kZSA9IHNvYXAtPmltb2RlOworICBpZiAoIXNvYXAtPmtlZXBfYWxpdmUpCisgIHsgc29hcC0+YnVmbGVuID0gMDsKKyAgICBzb2FwLT5idWZpZHggPSAwOworICB9CisgIGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0tFRVBBTElWRSkpCisgICAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7CisgIHNvYXAtPmFoZWFkID0gMDsKKyAgc29hcC0+cGVla2VkID0gMDsKKyAgc29hcC0+bGV2ZWwgPSAwOworICBzb2FwLT5wYXJ0ID0gU09BUF9CRUdJTjsKKyAgc29hcC0+YWxsb2NlZCA9IDA7CisgIHNvYXAtPmNvdW50ID0gMDsKKyAgc29hcC0+bGVuZ3RoID0gMDsKKyAgc29hcC0+Y2RhdGEgPSAwOworICAqc29hcC0+ZW5kcG9pbnQgPSAnXDAnOworICBzb2FwLT5hY3Rpb24gPSBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzb2FwLT5kb20gPSBOVUxMOworICBzb2FwLT5kaW1lLmNodW5rc2l6ZSA9IDA7CisgIHNvYXAtPmRpbWUuYnVmbGVuID0gMDsKKyAgc29hcC0+ZGltZS5saXN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGlzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmxhc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gTlVMTDsKKyAgc29hcC0+bWltZS5zdGFydCA9IE5VTEw7CisgIHNvYXAtPnhsaXN0ID0gTlVMTDsKKyNlbmRpZgorI2lmZGVmIFdJTjMyCisjaWZuZGVmIFVOREVSX0NFCisjaWZuZGVmIFdJVEhfRkFTVENHSQorICBpZiAoIXNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisjaWZkZWYgX19CT1JMQU5EQ19fCisgICAgc2V0bW9kZSgoU09BUF9TT0NLRVQpc29hcC0+cmVjdmZkLCBPX0JJTkFSWSk7CisjZWxzZQorICAgIF9zZXRtb2RlKChTT0FQX1NPQ0tFVClzb2FwLT5yZWN2ZmQsIF9PX0JJTkFSWSk7CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBXSVRIX1pMSUIKKyAgc29hcC0+bW9kZSAmPSB+U09BUF9FTkNfWkxJQjsKKyAgc29hcC0+emxpYl9pbiA9IFNPQVBfWkxJQl9OT05FOworICBzb2FwLT56bGliX291dCA9IFNPQVBfWkxJQl9OT05FOworICBzb2FwLT5kX3N0cmVhbS5uZXh0X2luID0gWl9OVUxMOworICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbiA9IDA7CisgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gKEJ5dGUqKXNvYXAtPmJ1ZjsKKyAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0ID0gU09BUF9CVUZMRU47CisgIHNvYXAtPnpfcmF0aW9faW4gPSAxLjA7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPmZwcmVwYXJlaW5pdCkKKyAgICBzb2FwLT5mcHJlcGFyZWluaXQoc29hcCk7CisjZW5kaWYKKyAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyNpZmRlZiBXSVRIX0daSVAKKyAgaWYgKGMgPT0gMHgxRikKKyAgeyBpZiAoc29hcF9nZXRnemlwaGRyKHNvYXApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmIChpbmZsYXRlSW5pdDIoJnNvYXAtPmRfc3RyZWFtLCAtTUFYX1dCSVRTKSAhPSBaX09LKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfSU5GTEFURTsKKyAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX1pMSUI7CisgICAgc29hcC0+emxpYl9pbiA9IFNPQVBfWkxJQl9HWklQOworICAgIHNvYXAtPnpfY3JjID0gY3JjMzIoMEwsIE5VTEwsIDApOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZ3ppcCBpbml0aWFsaXplZFxuIikpOworICAgIG1lbWNweShzb2FwLT56X2J1Ziwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTik7CisgICAgLyogc2hvdWxkIG5vdCBjaHVuayBvdmVyIHBsYWluIHRyYW5zcG9ydCwgc28gd2h5IGJvdGhlciB0byBjaGVjaz8gKi8KKyAgICAvKiBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKSAqLworICAgIC8qICAgc29hcC0+el9idWZsZW4gPSBzb2FwLT5idWZpZHg7ICovCisgICAgLyogZWxzZSAqLworICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfaW4gPSAoQnl0ZSopKHNvYXAtPnpfYnVmICsgc29hcC0+YnVmaWR4KTsKKyAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbiA9IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICBzb2FwLT56X2J1ZmxlbiA9IHNvYXAtPmJ1ZmxlbjsKKyAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5idWZpZHg7CisgICAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgfSAgCisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKGMgPT0gJy0nICYmIHNvYXBfZ2V0MChzb2FwKSA9PSAnLScpCisgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19NSU1FOworICBlbHNlIGlmICgoYyAmIDB4RkZGQykgPT0gKFNPQVBfRElNRV9WRVJTSU9OIHwgU09BUF9ESU1FX01CKSAmJiAoc29hcF9nZXQwKHNvYXApICYgMHhGRkYwKSA9PSAweDIwKQorICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfRElNRTsKKyAgZWxzZQorI2VuZGlmCisgIHsgd2hpbGUgKHNvYXBfYmxhbmsoYykpCisgICAgICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICB9CisgIGlmICgoaW50KWMgPT0gRU9GKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworI2lmbmRlZiBXSVRIX05PSFRUUAorICAvKiBpZiBub3QgWE1MIG9yIChzdGFydCBvZilCT00gb3IgTUlNRS9ESU1FL1pMSUIsIGFzc3VtZSBIVFRQIGhlYWRlciAqLworICBpZiAoYyAhPSAnPCcgJiYgYyAhPSAweEVGICYmICEoc29hcC0+bW9kZSAmIChTT0FQX0VOQ19NSU1FIHwgU09BUF9FTkNfRElNRSB8IFNPQVBfRU5DX1pMSUIpKSkKKyAgeyBzb2FwLT5tb2RlICY9IH5TT0FQX0lPOworICAgIHNvYXAtPmVycm9yID0gc29hcC0+ZnBhcnNlKHNvYXApOworICAgIGlmIChzb2FwLT5lcnJvciAmJiBzb2FwLT5lcnJvciA8IFNPQVBfU1RPUCkKKyAgICB7IHNvYXAtPmtlZXBfYWxpdmUgPSAwOyAvKiBmb3JjZSBjbG9zZSBsYXRlciAqLworICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKQorICAgIHsgc29hcC0+Y2h1bmtidWZsZW4gPSBzb2FwLT5idWZsZW47CisgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5idWZpZHg7CisgICAgICBzb2FwLT5jaHVua3NpemUgPSAwOworICAgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgICBlbHNlIGlmIChzb2FwLT5mcHJlcGFyZXJlY3YgJiYgc29hcC0+YnVmbGVuICE9IHNvYXAtPmJ1ZmlkeCkKKyAgICAgIHNvYXAtPmZwcmVwYXJlcmVjdihzb2FwLCBzb2FwLT5idWYgKyBzb2FwLT5idWZpZHgsIHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeCk7CisjZW5kaWYKKyNpZmRlZiBXSVRIX1pMSUIKKyAgICBpZiAoc29hcC0+emxpYl9pbiAhPSBTT0FQX1pMSUJfTk9ORSkKKyAgICB7IC8qIGZwYXJzZSBzaG91bGQgbm90IHVzZSBzb2FwX3VuZ2V0IHRvIHB1c2ggYmFjayBsYXN0IGNoYXIgKi8KKyNpZmRlZiBXSVRIX0daSVAKKyAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICBpZiAoYyA9PSAweDFGKQorICAgICAgeyBpZiAoc29hcF9nZXRnemlwaGRyKHNvYXApKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgaWYgKGluZmxhdGVJbml0Migmc29hcC0+ZF9zdHJlYW0sIC1NQVhfV0JJVFMpICE9IFpfT0spCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgICBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX0lORkxBVEU7CisgICAgICAgIHNvYXAtPnpfY3JjID0gY3JjMzIoMEwsIE5VTEwsIDApOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImd6aXAgaW5pdGlhbGl6ZWRcbiIpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgc29hcF9yZXZnZXQxKHNvYXApOworI2Vsc2UKKyAgICAgIHsKKyNlbmRpZgorICAgICAgICBpZiAoaW5mbGF0ZUluaXQoJnNvYXAtPmRfc3RyZWFtKSAhPSBaX09LKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICAgICAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9JTkZMQVRFOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluZmxhdGUgaW5pdGlhbGl6ZWRcbiIpKTsKKyAgICAgIH0KKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfWkxJQjsKKyAgICAgIG1lbWNweShzb2FwLT56X2J1Ziwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTik7CisgICAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X2luID0gKEJ5dGUqKShzb2FwLT56X2J1ZiArIHNvYXAtPmJ1ZmlkeCk7CisgICAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbiA9IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICAgIHNvYXAtPnpfYnVmbGVuID0gc29hcC0+YnVmbGVuOworICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+YnVmaWR4OworICAgIH0KKyNlbmRpZgorICAgIGlmIChzb2FwLT5lcnJvcikKKyAgICB7IGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX0ZPUk0gJiYgc29hcC0+ZmZvcm0pCisgICAgICB7IHNvYXAtPmVycm9yID0gc29hcC0+ZmZvcm0oc29hcCk7CisgICAgICAgIGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX09LKQorICAgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9TVE9QOyAvKiBwcmV2ZW50cyBmdXJ0aGVyIHByb2Nlc3NpbmcgKi8KKyAgICAgIH0KKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgIH0KKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01JTUUpCisgIHsgaWYgKHNvYXBfZ2V0bWltZWhkcihzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAoc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCBzb2FwLT5taW1lLmZpcnN0LT50eXBlLCAiYXBwbGljYXRpb24vZGltZSIpKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19ESU1FOworICB9CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkKKyAgeyBpZiAoc29hcF9nZXRkaW1laGRyKHNvYXApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmIChzb2FwLT5kaW1lLmZsYWdzICYgU09BUF9ESU1FX0NGKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDaHVua2VkIERJTUUgU09BUCBtZXNzYWdlXG4iKSk7CisgICAgICBzb2FwLT5kaW1lLmNodW5rc2l6ZSA9IHNvYXAtPmRpbWUuc2l6ZTsKKyAgICAgIGlmIChzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHggPj0gc29hcC0+ZGltZS5jaHVua3NpemUpCisgICAgICB7IHNvYXAtPmRpbWUuYnVmbGVuID0gc29hcC0+YnVmbGVuOworICAgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5idWZpZHggKyBzb2FwLT5kaW1lLmNodW5rc2l6ZTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgc29hcC0+ZGltZS5jaHVua3NpemUgLT0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgIH0KKyAgICBzb2FwLT5jb3VudCA9IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgfQorI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAoraHR0cF9wYXJzZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgY2hhciBoZWFkZXJbU09BUF9IRFJMRU5dLCAqczsKKyAgdW5zaWduZWQgc2hvcnQgZ2V0ID0gMCwgc3RhdHVzID0gMCwgayA9IDA7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiV2FpdGluZyBmb3IgSFRUUCByZXF1ZXN0L3Jlc3BvbnNlLi4uXG4iKSk7CisgICpzb2FwLT5lbmRwb2ludCA9ICdcMCc7CisgIHNvYXAtPmxlbmd0aCA9IDA7CisgIHNvYXAtPnVzZXJpZCA9IE5VTEw7CisgIHNvYXAtPnBhc3N3ZCA9IE5VTEw7CisgIHNvYXAtPmFjdGlvbiA9IE5VTEw7CisgIHNvYXAtPmF1dGhyZWFsbSA9IE5VTEw7CisgIGRvCisgIHsgaWYgKHNvYXBfZ2V0bGluZShzb2FwLCBzb2FwLT5tc2didWYsIHNpemVvZihzb2FwLT5tc2didWYpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiSFRUUCBzdGF0dXM6ICVzXG4iLCBzb2FwLT5tc2didWYpKTsKKyAgICBmb3IgKDs7KQorICAgIHsgaWYgKHNvYXBfZ2V0bGluZShzb2FwLCBoZWFkZXIsIFNPQVBfSERSTEVOKSkKKyAgICAgIHsgaWYgKHNvYXAtPmVycm9yID09IFNPQVBfRU9GKQorCXsgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICAgICAgICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJFT0YgaW4gSFRUUCBoZWFkZXIsIGNvbnRpbnVlIGFueXdheVxuIikpOworCSAgYnJlYWs7CisJfQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB9CisgICAgICBpZiAoISpoZWFkZXIpCisgICAgICAgIGJyZWFrOworICAgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkhUVFAgaGVhZGVyOiAlc1xuIiwgaGVhZGVyKSk7CisgICAgICBzID0gc3RyY2hyKGhlYWRlciwgJzonKTsKKyAgICAgIGlmIChzKQorICAgICAgeyAqcyA9ICdcMCc7CisgICAgICAgIGRvIHMrKzsKKyAgICAgICAgd2hpbGUgKCpzICYmICpzIDw9IDMyKTsKKyAgICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZwYXJzZWhkcihzb2FwLCBoZWFkZXIsIHMpKSkKKyAgICAgICAgeyBpZiAoc29hcC0+ZXJyb3IgPCBTT0FQX1NUT1ApCisJICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKwkgIHN0YXR1cyA9IHNvYXAtPmVycm9yOworCSAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmICgocyA9IHN0cmNocihzb2FwLT5tc2didWYsICcgJykpKQorICAgIHsgayA9ICh1bnNpZ25lZCBzaG9ydClzb2FwX3N0cnRvdWwocywgJnMsIDEwKTsKKyAgICAgIGlmICghc29hcF9ibGFuaygqcykpCisgICAgICAgIGsgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgICBrID0gMDsKKyAgfSB3aGlsZSAoayA9PSAxMDApOworICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiRmluaXNoZWQgSFRUUCBoZWFkZXIgcGFyc2luZ1xuIikpOworICBzID0gc3Ryc3RyKHNvYXAtPm1zZ2J1ZiwgIkhUVFAvIik7CisgIGlmIChzICYmIHNbN10gIT0gJzEnKQorICB7IGlmIChzb2FwLT5rZWVwX2FsaXZlID09IDEpCisgICAgICBzb2FwLT5rZWVwX2FsaXZlID0gMDsKKyAgICBpZiAoayA9PSAwICYmIChzb2FwLT5vbW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspIC8qIGsgPT0gMCBmb3IgSFRUUCByZXF1ZXN0ICovCisgICAgeyBzb2FwLT5pbW9kZSB8PSBTT0FQX0lPX0NIVU5LOworICAgICAgc29hcC0+b21vZGUgPSAoc29hcC0+b21vZGUgJiB+U09BUF9JTykgfCBTT0FQX0lPX1NUT1JFOworICAgIH0KKyAgfQorICBpZiAoc29hcC0+a2VlcF9hbGl2ZSA8IDApCisgICAgc29hcC0+a2VlcF9hbGl2ZSA9IDE7CisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJLZWVwIGFsaXZlIGNvbm5lY3Rpb24gPSAlZFxuIiwgc29hcC0+a2VlcF9hbGl2ZSkpOworICBpZiAocyAmJiAoKChnZXQgPSAhc3RybmNtcChzb2FwLT5tc2didWYsICJHRVQgIiwgNCkpKSB8fCAhc3RybmNtcChzb2FwLT5tc2didWYsICJQT1NUICIsIDUpKSkKKyAgeyBzaXplX3QgbSA9IHN0cmxlbihzb2FwLT5lbmRwb2ludCk7CisgICAgc2l6ZV90IG4gPSBtICsgKHMgLSBzb2FwLT5tc2didWYpIC0gNSAtICghZ2V0KTsKKyAgICBpZiAobiA+PSBzaXplb2Yoc29hcC0+ZW5kcG9pbnQpKQorICAgICAgbiA9IHNpemVvZihzb2FwLT5lbmRwb2ludCkgLSAxOworICAgIHN0cm5jcHkoc29hcC0+cGF0aCwgc29hcC0+bXNnYnVmICsgNCArICghZ2V0KSwgbiAtIG0pOworICAgIHNvYXAtPnBhdGhbbiAtIG1dID0gJ1wwJzsKKyAgICBzdHJjYXQoc29hcC0+ZW5kcG9pbnQsIHNvYXAtPnBhdGgpOworICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJUYXJnZXQgZW5kcG9pbnQ9JyVzJ1xuIiwgc29hcC0+ZW5kcG9pbnQpKTsKKyAgICBpZiAoZ2V0KQorICAgIHsgc29hcC0+ZXJyb3IgPSBzb2FwLT5mZ2V0KHNvYXApOworICAgICAgaWYgKHNvYXAtPmVycm9yID09IFNPQVBfT0spCisgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9TVE9QOyAvKiBwcmV2ZW50cyBmdXJ0aGVyIHByb2Nlc3NpbmcgKi8KKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgaWYgKHN0YXR1cykKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IHN0YXR1czsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICBpZiAoayA9PSAwIHx8IChrID49IDIwMCAmJiBrIDw9IDI5OSkgfHwgayA9PSA0MDAgfHwgayA9PSA1MDApCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJIVFRQIGVycm9yICVkXG4iLCBrKSk7CisgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiSFRUUCBlcnJvciIsIHNvYXAtPm1zZ2J1Ziwgayk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK2h0dHBfcGFyc2VfaGVhZGVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbCkKK3sgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiSG9zdCIpKQorICB7IAorI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgIGlmIChzb2FwLT5pbW9kZSAmIFNPQVBfRU5DX1NTTCkKKyAgICAgIHN0cmNweShzb2FwLT5lbmRwb2ludCwgImh0dHBzOi8vIik7CisgICAgZWxzZQorI2VuZGlmCisgICAgICBzdHJjcHkoc29hcC0+ZW5kcG9pbnQsICJodHRwOi8vIik7CisgICAgc3RybmNhdChzb2FwLT5lbmRwb2ludCwgdmFsLCBzaXplb2Yoc29hcC0+ZW5kcG9pbnQpIC0gOCk7CisgICAgc29hcC0+ZW5kcG9pbnRbc2l6ZW9mKHNvYXAtPmVuZHBvaW50KSAtIDFdID0gJ1wwJzsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtVHlwZSIpKQorICB7IGlmIChzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCwgImFwcGxpY2F0aW9uL2RpbWUiKSkKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfRElNRTsKKyAgICBlbHNlIGlmIChzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCwgIm11bHRpcGFydC9yZWxhdGVkIikKKyAgICAgICAgICB8fCBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCwgIm11bHRpcGFydC9mb3JtLWRhdGEiKSkKKyAgICB7IHNvYXAtPm1pbWUuYm91bmRhcnkgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCwgImJvdW5kYXJ5IikpOworICAgICAgc29hcC0+bWltZS5zdGFydCA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAic3RhcnQiKSk7CisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX01JTUU7CisgICAgfQorICB9CisjZW5kaWYKKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LUxlbmd0aCIpKQorICAgIHNvYXAtPmxlbmd0aCA9IHNvYXBfc3RydG91bCh2YWwsIE5VTEwsIDEwKTsKKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LUVuY29kaW5nIikpCisgIHsgaWYgKCFzb2FwX3RhZ19jbXAodmFsLCAiZGVmbGF0ZSIpKQorI2lmZGVmIFdJVEhfWkxJQgorICAgICAgc29hcC0+emxpYl9pbiA9IFNPQVBfWkxJQl9ERUZMQVRFOworI2Vsc2UKKyAgICAgIHJldHVybiBTT0FQX1pMSUJfRVJST1I7CisjZW5kaWYKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHZhbCwgImd6aXAiKSkKKyNpZmRlZiBXSVRIX0daSVAKKyAgICAgIHNvYXAtPnpsaWJfaW4gPSBTT0FQX1pMSUJfR1pJUDsKKyNlbHNlCisgICAgICByZXR1cm4gU09BUF9aTElCX0VSUk9SOworI2VuZGlmCisgIH0KKyNpZmRlZiBXSVRIX1pMSUIKKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJBY2NlcHQtRW5jb2RpbmciKSkKKyAgeworI2lmZGVmIFdJVEhfR1pJUAorICAgIGlmIChzdHJjaHIodmFsLCAnKicpIHx8IHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAiZ3ppcCIpKQorICAgICAgc29hcC0+emxpYl9vdXQgPSBTT0FQX1pMSUJfR1pJUDsKKyAgICBlbHNlCisjZW5kaWYKKyAgICBpZiAoc3RyY2hyKHZhbCwgJyonKSB8fCBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCwgImRlZmxhdGUiKSkKKyAgICAgIHNvYXAtPnpsaWJfb3V0ID0gU09BUF9aTElCX0RFRkxBVEU7CisgICAgZWxzZQorICAgICAgc29hcC0+emxpYl9vdXQgPSBTT0FQX1pMSUJfTk9ORTsKKyAgfQorI2VuZGlmCisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiVHJhbnNmZXItRW5jb2RpbmciKSkKKyAgeyBzb2FwLT5tb2RlICY9IH5TT0FQX0lPOworICAgIGlmICghc29hcF90YWdfY21wKHZhbCwgImNodW5rZWQiKSkKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19DSFVOSzsKKyAgfQorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbm5lY3Rpb24iKSkKKyAgeyBpZiAoIXNvYXBfdGFnX2NtcCh2YWwsICJrZWVwLWFsaXZlIikpCisgICAgICBzb2FwLT5rZWVwX2FsaXZlID0gLXNvYXAtPmtlZXBfYWxpdmU7CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcCh2YWwsICJjbG9zZSIpKQorICAgICAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFOCisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQXV0aG9yaXphdGlvbiIpKQorICB7IGlmICghc29hcF90YWdfY21wKHZhbCwgIkJhc2ljICoiKSkKKyAgICB7IGludCBuOworICAgICAgY2hhciAqczsKKyAgICAgIHNvYXBfYmFzZTY0MnMoc29hcCwgdmFsICsgNiwgc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSAtIDEsICZuKTsKKyAgICAgIHNvYXAtPnRtcGJ1ZltuXSA9ICdcMCc7CisgICAgICBpZiAoKHMgPSBzdHJjaHIoc29hcC0+dG1wYnVmLCAnOicpKSkKKyAgICAgIHsgKnMgPSAnXDAnOworCXNvYXAtPnVzZXJpZCA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPnRtcGJ1Zik7CisJc29hcC0+cGFzc3dkID0gc29hcF9zdHJkdXAoc29hcCwgcyArIDEpOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIldXVy1BdXRoZW50aWNhdGUiKSkKKyAgICBzb2FwLT5hdXRocmVhbG0gPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCArIDYsICJyZWFsbSIpKTsKKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJFeHBlY3QiKSkKKyAgeyBpZiAoIXNvYXBfdGFnX2NtcCh2YWwsICIxMDAtY29udGludWUiKSkKKyAgICB7IGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiSFRUUC8xLjEgMTAwIENvbnRpbnVlIiwgTlVMTCkpCisgICAgICAgfHwgKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgTlVMTCwgTlVMTCkpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICB9CisjZW5kaWYKKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJTT0FQQWN0aW9uIikpCisgIHsgaWYgKCp2YWwgPT0gJyInKQorICAgIHsgc29hcC0+YWN0aW9uID0gc29hcF9zdHJkdXAoc29hcCwgdmFsICsgMSk7CisgICAgICBzb2FwLT5hY3Rpb25bc3RybGVuKHNvYXAtPmFjdGlvbikgLSAxXSA9ICdcMCc7CisgICAgfQorICB9CisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiTG9jYXRpb24iKSkKKyAgeyBzdHJuY3B5KHNvYXAtPmVuZHBvaW50LCB2YWwsIHNpemVvZihzb2FwLT5lbmRwb2ludCkpOworICAgIHNvYXAtPmVuZHBvaW50W3NpemVvZihzb2FwLT5lbmRwb2ludCkgLSAxXSA9ICdcMCc7CisgIH0KKyNpZmRlZiBXSVRIX0NPT0tJRVMKKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb29raWUiKSB8fCAhc29hcF90YWdfY21wKGtleSwgIlNldC1Db29raWUiKSkKKyAgICBzb2FwX2dldGNvb2tpZXMoc29hcCwgdmFsKTsKKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgIWRlZmluZWQoV0lUSF9OT0hUVFApIHx8ICFkZWZpbmVkKFdJVEhfTEVBTkVSKQorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpsaW5lLCBjb25zdCBjaGFyICprZXkpCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnMgPSBsaW5lOworICBpZiAocykKKyAgeyB3aGlsZSAoKnMpCisgICAgeyByZWdpc3RlciBzaG9ydCBmbGFnOworICAgICAgcyA9IHNvYXBfZGVjb2RlX2tleShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCBzKTsKKyAgICAgIGZsYWcgPSBzb2FwX3RhZ19jbXAoc29hcC0+dG1wYnVmLCBrZXkpOworICAgICAgcyA9IHNvYXBfZGVjb2RlX3ZhbChzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCBzKTsKKyAgICAgIGlmICghZmxhZykKKyAgICAgICAgcmV0dXJuIHNvYXAtPnRtcGJ1ZjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmICFkZWZpbmVkKFdJVEhfTk9IVFRQKSB8fCAhZGVmaW5lZChXSVRIX0xFQU5FUikKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9kZWNvZGVfa2V5KGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwgY29uc3QgY2hhciAqdmFsKQoreyByZXR1cm4gc29hcF9kZWNvZGUoYnVmLCBsZW4sIHZhbCwgIj0sOyIpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAhZGVmaW5lZChXSVRIX05PSFRUUCkgfHwgIWRlZmluZWQoV0lUSF9MRUFORVIpCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZGVjb2RlX3ZhbChjaGFyICpidWYsIHNpemVfdCBsZW4sIGNvbnN0IGNoYXIgKnZhbCkKK3sgaWYgKCp2YWwgIT0gJz0nKQorICB7ICpidWYgPSAnXDAnOworICAgIHJldHVybiB2YWw7CisgIH0KKyAgcmV0dXJuIHNvYXBfZGVjb2RlKGJ1ZiwgbGVuLCB2YWwgKyAxLCAiLDsiKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgIWRlZmluZWQoV0lUSF9OT0hUVFApIHx8ICFkZWZpbmVkKFdJVEhfTEVBTkVSKQorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBjb25zdCBjaGFyKgorc29hcF9kZWNvZGUoY2hhciAqYnVmLCBzaXplX3QgbGVuLCBjb25zdCBjaGFyICp2YWwsIGNvbnN0IGNoYXIgKnNlcCkKK3sgY29uc3QgY2hhciAqczsKKyAgY2hhciAqdCA9IGJ1ZjsKKyAgZm9yIChzID0gdmFsOyAqczsgcysrKQorICAgIGlmICgqcyAhPSAnICcgJiYgKnMgIT0gJ1x0JyAmJiAhc3RyY2hyKHNlcCwgKnMpKQorICAgICAgYnJlYWs7CisgIGlmICgqcyA9PSAnIicpCisgIHsgcysrOworICAgIHdoaWxlICgqcyAmJiAqcyAhPSAnIicgJiYgLS1sZW4pCisgICAgICAqdCsrID0gKnMrKzsKKyAgfQorICBlbHNlCisgIHsgd2hpbGUgKHNvYXBfbm90YmxhbmsoKnMpICYmICFzdHJjaHIoc2VwLCAqcykgJiYgLS1sZW4pCisgICAgeyBpZiAoKnMgPT0gJyUnKQorICAgICAgeyAqdCsrID0gKChzWzFdID49ICdBJyA/IChzWzFdICYgMHg3KSArIDkgOiBzWzFdIC0gJzAnKSA8PCA0KQorICAgICAgICAgICAgICArIChzWzJdID49ICdBJyA/IChzWzJdICYgMHg3KSArIDkgOiBzWzJdIC0gJzAnKTsKKyAgICAgICAgcyArPSAzOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICAqdCsrID0gKnMrKzsKKyAgICB9CisgIH0KKyAgKnQgPSAnXDAnOworICB3aGlsZSAoKnMgJiYgIXN0cmNocihzZXAsICpzKSkKKyAgICBzKys7CisgIHJldHVybiBzOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW52ZWxvcGVfYmVnaW5fb3V0KHN0cnVjdCBzb2FwICpzb2FwKQoreworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzaXplX3QgbiA9IDA7CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01JTUUpICYmIHNvYXAtPm1pbWUuYm91bmRhcnkgJiYgc29hcC0+bWltZS5zdGFydCkKKyAgeyBjb25zdCBjaGFyICpzOworICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpICYmICEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pKQorICAgICAgcyA9ICJhcHBsaWNhdGlvbi9kaW1lIjsKKyAgICBlbHNlIGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgICAgICBzID0gImFwcGxpY2F0aW9uL3NvYXAreG1sOyBjaGFyc2V0PXV0Zi04IjsKKyAgICBlbHNlCisgICAgICBzID0gInRleHQveG1sOyBjaGFyc2V0PXV0Zi04IjsKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIi0tJXNcclxuQ29udGVudC1UeXBlOiAlc1xyXG5Db250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiaW5hcnlcclxuQ29udGVudC1JRDogJXNcclxuXHJcbiIsIHNvYXAtPm1pbWUuYm91bmRhcnksIHMsIHNvYXAtPm1pbWUuc3RhcnQpOworICAgIG4gPSBzdHJsZW4oc29hcC0+dG1wYnVmKTsKKyAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzb2FwLT50bXBidWYsIG4pKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgc29hcC0+ZGltZS5zaXplID0gc29hcC0+Y291bnQ7CS8qIERJTUUgaW4gTUlNRSBjb3JyZWN0aW9uICovCisgIGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSkKKyAgeyBpZiAoc29hcF9wdXRkaW1laGRyKHNvYXApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisjZW5kaWYKKyAgc29hcC0+cGFydCA9IFNPQVBfSU5fRU5WRUxPUEU7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsICJTT0FQLUVOVjpFbnZlbG9wZSIsIDAsIE5VTEwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VudmVsb3BlX2VuZF9vdXQoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCAiU09BUC1FTlY6RW52ZWxvcGUiKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpICYmICEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pKQorICB7IHNvYXAtPmRpbWUuc2l6ZSA9IHNvYXAtPmNvdW50IC0gc29hcC0+ZGltZS5zaXplOwkvKiBESU1FIGluIE1JTUUgY29ycmVjdGlvbiAqLworICAgIHNwcmludGYoc29hcC0+aWQsIHNvYXAtPmRpbWVfaWRfZm9ybWF0LCAwKTsKKyAgICBzb2FwLT5kaW1lLmlkID0gc29hcC0+aWQ7CisgICAgaWYgKHNvYXAtPmxvY2FsX25hbWVzcGFjZXMpCisgICAgeyBpZiAoc29hcC0+bG9jYWxfbmFtZXNwYWNlc1swXS5vdXQpCisgICAgICAgIHNvYXAtPmRpbWUudHlwZSA9IChjaGFyKilzb2FwLT5sb2NhbF9uYW1lc3BhY2VzWzBdLm91dDsKKyAgICAgIGVsc2UKKyAgICAgICAgc29hcC0+ZGltZS50eXBlID0gKGNoYXIqKXNvYXAtPmxvY2FsX25hbWVzcGFjZXNbMF0ubnM7CisgICAgfQorICAgIHNvYXAtPmRpbWUub3B0aW9ucyA9IE5VTEw7CisgICAgc29hcC0+ZGltZS5mbGFncyA9IFNPQVBfRElNRV9NQiB8IFNPQVBfRElNRV9BQlNVUkk7CisgICAgaWYgKCFzb2FwLT5kaW1lLmZpcnN0KQorICAgICAgc29hcC0+ZGltZS5mbGFncyB8PSBTT0FQX0RJTUVfTUU7CisgICAgc29hcC0+Y291bnQgKz0gMTIgKyAoKHN0cmxlbihzb2FwLT5kaW1lLmlkKSszKSYofjMpKSArICgoc3RybGVuKHNvYXAtPmRpbWUudHlwZSkrMykmKH4zKSk7CisgIH0KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkgJiYgIShzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkpCisgICAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgU09BUF9TVFJfUEFERElORywgLShsb25nKXNvYXAtPmRpbWUuc2l6ZSYzKTsKKyNlbmRpZgorICBzb2FwLT5wYXJ0ID0gU09BUF9FTkRfRU5WRUxPUEU7CisgIHJldHVybiBTT0FQX09LOworfSAKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbnZlbG9wZV9iZWdpbl9pbihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc3RydWN0IE5hbWVzcGFjZSAqcDsKKyAgc29hcC0+cGFydCA9IFNPQVBfSU5fRU5WRUxPUEU7CisgIGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgIlNPQVAtRU5WOkVudmVsb3BlIiwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9WRVJTSU9OTUlTTUFUQ0g7CisgIHAgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzOworICBpZiAocCkKKyAgeyBjb25zdCBjaGFyICpucyA9IHBbMF0ub3V0OworICAgIGlmICghbnMpCisgICAgICBucyA9IHBbMF0ubnM7CisgICAgaWYgKCFzdHJjbXAobnMsIHNvYXBfZW52MSkpCisgICAgeyBzb2FwLT52ZXJzaW9uID0gMTsgLyogbWFrZSBzdXJlIHdlIHVzZSBTT0FQIDEuMSAqLworICAgICAgaWYgKHBbMV0ub3V0KQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcFsxXS5vdXQpOworICAgICAgaWYgKChwWzFdLm91dCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc29hcF9lbmMxKSkpKQorICAgICAgICBzdHJjcHkocFsxXS5vdXQsIHNvYXBfZW5jMSk7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAobnMsIHNvYXBfZW52MikpCisgICAgeyBzb2FwLT52ZXJzaW9uID0gMjsgLyogbWFrZSBzdXJlIHdlIHVzZSBTT0FQIDEuMiAqLworICAgICAgaWYgKHBbMV0ub3V0KQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcFsxXS5vdXQpOworICAgICAgaWYgKChwWzFdLm91dCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc29hcF9lbmMyKSkpKQorICAgICAgICBzdHJjcHkocFsxXS5vdXQsIHNvYXBfZW5jMik7CisgICAgfQorICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VudmVsb3BlX2VuZF9pbihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+cGFydCA9IFNPQVBfRU5EX0VOVkVMT1BFOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCAiU09BUC1FTlY6RW52ZWxvcGUiKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9ib2R5X2JlZ2luX291dChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+cGFydCA9IFNPQVBfSU5fQk9EWTsKKyAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMSkKKyAgICBzb2FwLT5lbmNvZGluZyA9IDE7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TRUMpICYmIHNvYXBfc2V0X2F0dHIoc29hcCwgIndzdTpJZCIsICJCb2R5IikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2VuZGlmCisgIGlmIChzb2FwX2VsZW1lbnQoc29hcCwgIlNPQVAtRU5WOkJvZHkiLCAwLCBOVUxMKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzb2FwLCBOVUxMKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9ib2R5X2VuZF9vdXQoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCAiU09BUC1FTlY6Qm9keSIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgc29hcC0+cGFydCA9IFNPQVBfRU5EX0JPRFk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JvZHlfYmVnaW5faW4oc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPnBhcnQgPSBTT0FQX0lOX0JPRFk7CisgIGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgIlNPQVAtRU5WOkJvZHkiLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmICghc29hcC0+Ym9keSkKKyAgICBzb2FwLT5wYXJ0ID0gU09BUF9OT19CT0RZOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9ib2R5X2VuZF9pbihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXAtPnBhcnQgPT0gU09BUF9OT19CT0RZKQorICAgIHJldHVybiBTT0FQX09LOworICBzb2FwLT5wYXJ0ID0gU09BUF9FTkRfQk9EWTsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgIlNPQVAtRU5WOkJvZHkiKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWN2X2hlYWRlcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXBfZ2V0aGVhZGVyKHNvYXApICYmIHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfZW5kcG9pbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmVuZHBvaW50KQoreyByZWdpc3RlciBjb25zdCBjaGFyICpzOworICByZWdpc3RlciBzaXplX3QgaSwgbjsKKyAgc29hcC0+ZW5kcG9pbnRbMF0gPSAnXDAnOworICBzb2FwLT5ob3N0WzBdID0gJ1wwJzsKKyAgc29hcC0+cGF0aFswXSA9ICcvJzsKKyAgc29hcC0+cGF0aFsxXSA9ICdcMCc7CisgIHNvYXAtPnBvcnQgPSA4MDsKKyAgaWYgKCFlbmRwb2ludCB8fCAhKmVuZHBvaW50KQorICAgIHJldHVybjsKKyAgaWYgKCFzdHJuY21wKGVuZHBvaW50LCAiaHR0cHM6IiwgNikpCisgICAgc29hcC0+cG9ydCA9IDQ0MzsKKyAgc3RybmNweShzb2FwLT5lbmRwb2ludCwgZW5kcG9pbnQsIHNpemVvZihzb2FwLT5lbmRwb2ludCkgLSAxKTsKKyAgcyA9IHN0cmNocihlbmRwb2ludCwgJzonKTsKKyAgaWYgKHMgJiYgc1sxXSA9PSAnLycgJiYgc1syXSA9PSAnLycpCisgICAgcyArPSAzOworICBlbHNlCisgICAgcyA9IGVuZHBvaW50OworICBuID0gc3RybGVuKHMpOworICBpZiAobiA+PSBzaXplb2Yoc29hcC0+aG9zdCkpCisgICAgbiA9IHNpemVvZihzb2FwLT5ob3N0KSAtIDE7CisjaWZkZWYgV0lUSF9JUFY2CisgIGlmIChzWzBdID09ICdbJykKKyAgeyBzKys7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICB7IHNvYXAtPmhvc3RbaV0gPSBzW2ldOworICAgICAgaWYgKHNbaV0gPT0gJ10nKQorICAgICAgeyBzKys7CisgICAgICAgIGJyZWFrOyAKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZQorICB7IGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgeyBzb2FwLT5ob3N0W2ldID0gc1tpXTsKKyAgICAgIGlmIChzW2ldID09ICcvJyB8fCBzW2ldID09ICc6JykKKyAgICAgICAgYnJlYWs7IAorICAgIH0KKyAgfQorI2Vsc2UKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgeyBzb2FwLT5ob3N0W2ldID0gc1tpXTsKKyAgICBpZiAoc1tpXSA9PSAnLycgfHwgc1tpXSA9PSAnOicpCisgICAgICBicmVhazsgCisgIH0KKyNlbmRpZgorICBzb2FwLT5ob3N0W2ldID0gJ1wwJzsKKyAgaWYgKHNbaV0gPT0gJzonKQorICB7IHNvYXAtPnBvcnQgPSAoaW50KWF0b2wocyArIGkgKyAxKTsKKyAgICBmb3IgKGkrKzsgaSA8IG47IGkrKykKKyAgICAgIGlmIChzW2ldID09ICcvJykKKyAgICAgICAgYnJlYWs7CisgIH0KKyAgaWYgKHNbaV0pCisgIHsgc3RybmNweShzb2FwLT5wYXRoLCBzICsgaSwgc2l6ZW9mKHNvYXAtPnBhdGgpKTsKKyAgICBzb2FwLT5wYXRoW3NpemVvZihzb2FwLT5wYXRoKSAtIDFdID0gJ1wwJzsKKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2Nvbm5lY3Qoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjb25zdCBjaGFyICphY3Rpb24pCit7IHJldHVybiBzb2FwX2Nvbm5lY3RfY29tbWFuZChzb2FwLCBTT0FQX1BPU1QsIGVuZHBvaW50LCBhY3Rpb24pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2Nvbm5lY3RfY29tbWFuZChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGh0dHBfY29tbWFuZCwgY29uc3QgY2hhciAqZW5kcG9pbnQsIGNvbnN0IGNoYXIgKmFjdGlvbikKK3sgY2hhciBob3N0W3NpemVvZihzb2FwLT5ob3N0KV07CisgIGludCBwb3J0OworICBzaXplX3QgY291bnQ7CisgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgc3RyY3B5KGhvc3QsIHNvYXAtPmhvc3QpOyAvKiBzYXZlIHRvIGNvbXBhcmUgKi8KKyAgcG9ydCA9IHNvYXAtPnBvcnQ7IC8qIHNhdmUgdG8gY29tcGFyZSAqLworICBzb2FwX3NldF9lbmRwb2ludChzb2FwLCBlbmRwb2ludCk7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5mY29ubmVjdCkKKyAgeyBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZmNvbm5lY3Qoc29hcCwgZW5kcG9pbnQsIHNvYXAtPmhvc3QsIHNvYXAtPnBvcnQpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBlbHNlCisjZW5kaWYKKyAgaWYgKHNvYXAtPmZvcGVuICYmICpzb2FwLT5ob3N0KQorICB7IHNvYXAtPnN0YXR1cyA9IGh0dHBfY29tbWFuZDsKKyAgICBpZiAoIXNvYXAtPmtlZXBfYWxpdmUgfHwgIXNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkgfHwgc3RyY21wKHNvYXAtPmhvc3QsIGhvc3QpIHx8IHNvYXAtPnBvcnQgIT0gcG9ydCB8fCAhc29hcC0+ZnBvbGwgfHwgc29hcC0+ZnBvbGwoc29hcCkpCisgICAgeyBzb2FwLT5rZWVwX2FsaXZlID0gMDsgLyogdG8gZm9yY2UgY2xvc2UgKi8KKyAgICAgIHNvYXAtPm9tb2RlICY9IH5TT0FQX0lPX1VEUDsgLyogdG8gZm9yY2UgY2xvc2UgKi8KKyAgICAgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvbm5lY3QvcmVjb25uZWN0IHRvIGhvc3Q9JyVzJyBwYXRoPSclcycgcG9ydD0lZFxuIiwgc29hcC0+aG9zdCwgc29hcC0+cGF0aCwgc29hcC0+cG9ydCkpOworI2lmZGVmIFdJVEhfVURQCisgICAgICBpZiAoIXN0cm5jbXAoZW5kcG9pbnQsICJzb2FwLnVkcDoiLCA5KSkKKyAgICAgICAgc29hcC0+b21vZGUgfD0gU09BUF9JT19VRFA7CisjZW5kaWYKKyAgICAgIHNvYXAtPnNvY2tldCA9IHNvYXAtPmZvcGVuKHNvYXAsIGVuZHBvaW50LCBzb2FwLT5ob3N0LCBzb2FwLT5wb3J0KTsKKyAgICAgIGlmIChzb2FwLT5lcnJvcikKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgc29hcC0+a2VlcF9hbGl2ZSA9ICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX0tFRVBBTElWRSkgIT0gMCk7CisgICAgfQorICB9CisgIGNvdW50ID0gc29hcF9jb3VudF9hdHRhY2htZW50cyhzb2FwKTsKKyAgaWYgKHNvYXBfYmVnaW5fc2VuZChzb2FwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjaWZuZGVmIFdJVEhfTk9IVFRQCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pICE9IFNPQVBfSU9fU1RPUkUgJiYgIShzb2FwLT5tb2RlICYgU09BUF9FTkNfWE1MKSAmJiBlbmRwb2ludCkKKyAgeyB1bnNpZ25lZCBpbnQgayA9IHNvYXAtPm1vZGU7CisgICAgc29hcC0+bW9kZSAmPSB+KFNPQVBfSU8gfCBTT0FQX0VOQ19aTElCKTsKKyAgICBpZiAoKGsgJiBTT0FQX0lPKSAhPSBTT0FQX0lPX0ZMVVNIKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX0JVRkZFUjsKKyAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3Qoc29hcCwgZW5kcG9pbnQsIHNvYXAtPmhvc3QsIHNvYXAtPnBvcnQsIHNvYXAtPnBhdGgsIGFjdGlvbiwgY291bnQpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgICBpZiAoKGsgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKQorICAgIHsgaWYgKHNvYXBfZmx1c2goc29hcCkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisjZW5kaWYKKyAgICBzb2FwLT5tb2RlID0gazsKKyAgfQorICBlbHNlIGlmIChhY3Rpb24pCisgICAgc29hcC0+YWN0aW9uID0gc29hcF9zdHJkdXAoc29hcCwgYWN0aW9uKTsKKyAgaWYgKGh0dHBfY29tbWFuZCAhPSBTT0FQX1BPU1QpCisgICAgcmV0dXJuIHNvYXBfZW5kX3NlbmQoc29hcCk7CisjZW5kaWYKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjaGFyKgorU09BUF9GTUFDMgorc29hcF9zMmJhc2U2NChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgdW5zaWduZWQgY2hhciAqcywgY2hhciAqdCwgaW50IG4pCit7IHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIG07CisgIHJlZ2lzdGVyIGNoYXIgKnA7CisgIGlmICghdCkKKyAgICB0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIChuICsgMikgLyAzICogNCArIDEpOworICBpZiAoIXQpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwID0gdDsKKyAgdFswXSA9ICdcMCc7CisgIGlmICghcykKKyAgICByZXR1cm4gcDsKKyAgZm9yICg7IG4gPiAyOyBuIC09IDMsIHMgKz0gMykKKyAgeyBtID0gc1swXTsKKyAgICBtID0gKG0gPDwgOCkgfCBzWzFdOworICAgIG0gPSAobSA8PCA4KSB8IHNbMl07CisgICAgZm9yIChpID0gNDsgaSA+IDA7IG0gPj49IDYpCisgICAgICB0Wy0taV0gPSBzb2FwX2Jhc2U2NG9bbSAmIDB4M0ZdOworICAgIHQgKz0gNDsKKyAgfQorICB0WzBdID0gJ1wwJzsKKyAgaWYgKG4gPiAwKQorICB7IG0gPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICBtID0gKG0gPDwgOCkgfCAqcysrOworICAgIGZvciAoOyBpIDwgMzsgaSsrKQorICAgICAgbSA8PD0gODsKKyAgICBmb3IgKGkrKzsgaSA+IDA7IG0gPj49IDYpCisgICAgICB0Wy0taV0gPSBzb2FwX2Jhc2U2NG9bbSAmIDB4M0ZdOworICAgIGZvciAoaSA9IDM7IGkgPiBuOyBpLS0pCisgICAgICB0W2ldID0gJz0nOworICAgIHRbNF0gPSAnXDAnOworICB9CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfYmFzZTY0MnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGNoYXIgKnQsIHNpemVfdCBsLCBpbnQgKm4pCit7IHJlZ2lzdGVyIGludCBpLCBqLCBjOworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIG07CisgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnA7CisgIGlmICghcyB8fCAhKnMpCisgIHsgaWYgKG4pCisgICAgICAqbiA9IDA7CisgICAgaWYgKHNvYXAtPmVycm9yKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFNPQVBfTk9OX05VTEw7CisgIH0KKyAgaWYgKCF0KQorICB7IGwgPSAoc3RybGVuKHMpICsgMykgLyA0ICogMzsKKyAgICB0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIGwpOworICB9CisgIGlmICghdCkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHJldHVybiBOVUxMOworICB9CisgIHAgPSB0OworICBpZiAobikKKyAgICAqbiA9IDA7CisgIGZvciAoOzspCisgIHsgZm9yIChpID0gMDsgaSA8IFNPQVBfQkxLTEVOOyBpKyspCisgICAgeyBtID0gMDsKKyAgICAgIGogPSAwOworICAgICAgd2hpbGUgKGogPCA0KQorICAgICAgeyBjID0gKnMrKzsKKyAgICAgICAgaWYgKGMgPT0gJz0nIHx8ICFjKQorICAgICAgICB7IGkgKj0gMzsKKyAgICAgICAgICBzd2l0Y2ggKGopCisgICAgICAgICAgeyBjYXNlIDI6CisgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoKG0gPj4gNCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgobSA+PiAxMCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgobSA+PiAyKSAmIDB4RkYpOworICAgICAgICAgICAgICBpICs9IDI7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChuKQorCSAgICAqbiArPSBpOworICAgICAgICAgIHJldHVybiBwOworICAgICAgICB9CisgICAgICAgIGMgLT0gJysnOworICAgICAgICBpZiAoYyA+PSAwICYmIGMgPD0gNzkpCisgICAgICAgIHsgbSA9IChtIDw8IDYpICsgc29hcF9iYXNlNjRpW2NdOworICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgKnQrKyA9IChjaGFyKSgobSA+PiAxNikgJiAweEZGKTsKKyAgICAgICp0KysgPSAoY2hhcikoKG0gPj4gOCkgJiAweEZGKTsKKyAgICAgICp0KysgPSAoY2hhcikobSAmIDB4RkYpOworICAgICAgaWYgKGwgPCAzKQorICAgICAgeyBpZiAobikKKwkgICpuICs9IGk7CisgICAgICAgIHJldHVybiBwOworICAgICAgfQorICAgICAgbCAtPSAzOworICAgIH0KKyAgICBpZiAobikKKyAgICAgICpuICs9IDMgKiBTT0FQX0JMS0xFTjsKKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfczJoZXgoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMsIGNoYXIgKnQsIGludCBuKQoreyByZWdpc3RlciBjaGFyICpwOworICBpZiAoIXQpCisgICAgdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCAyICogbiArIDEpOworICBpZiAoIXQpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwID0gdDsKKyAgdFswXSA9ICdcMCc7CisgIGlmIChzKQorICB7IGZvciAoOyBuID4gMDsgbi0tKQorICAgIHsgcmVnaXN0ZXIgaW50IG0gPSAqcysrOworICAgICAgKnQrKyA9IChjaGFyKSgobSA+PiA0KSArIChtID4gMTU5ID8gJ2EnIC0gMTAgOiAnMCcpKTsKKyAgICAgIG0gJj0gMHgwRjsKKyAgICAgICp0KysgPSAoY2hhcikobSArIChtID4gOSA/ICdhJyAtIDEwIDogJzAnKSk7CisgICAgfQorICB9CisgICp0KysgPSAnXDAnOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2hleDJzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBjaGFyICp0LCBzaXplX3QgbCwgaW50ICpuKQoreyByZWdpc3RlciBjb25zdCBjaGFyICpwOworICBpZiAoIXMgfHwgISpzKQorICB7IGlmIChuKQorICAgICAgKm4gPSAwOworICAgIGlmIChzb2FwLT5lcnJvcikKKyAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBTT0FQX05PTl9OVUxMOworICB9CisgIGlmICghdCkKKyAgeyBsID0gc3RybGVuKHMpIC8gMjsKKyAgICB0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIGwpOworICB9CisgIGlmICghdCkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHJldHVybiBOVUxMOworICB9CisgIHAgPSB0OworICB3aGlsZSAobCkKKyAgeyByZWdpc3RlciBpbnQgZDEsIGQyOworICAgIGQxID0gKnMrKzsKKyAgICBpZiAoIWQxKQorICAgICAgYnJlYWs7CisgICAgZDIgPSAqcysrOworICAgIGlmICghZDIpCisgICAgICBicmVhazsKKyAgICAqdCsrID0gKChkMSA+PSAnQScgPyAoZDEgJiAweDcpICsgOSA6IGQxIC0gJzAnKSA8PCA0KSArIChkMiA+PSAnQScgPyAoZDIgJiAweDcpICsgOSA6IGQyIC0gJzAnKTsKKyAgICBsLS07CisgIH0KKyAgaWYgKG4pCisgICAgKm4gPSB0IC0gcDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0aHR0cGhkcihzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0YXR1cywgc2l6ZV90IGNvdW50KQoreyByZWdpc3RlciBjb25zdCBjaGFyICpzID0gTlVMTDsKKyAgcmVnaXN0ZXIgaW50IGVyciA9IFNPQVBfT0s7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnIgPSBOVUxMOworI2VuZGlmCisgIGlmIChzdGF0dXMgPT0gU09BUF9GSUxFICYmIHNvYXAtPmh0dHBfY29udGVudCkKKyAgICBzID0gc29hcC0+aHR0cF9jb250ZW50OworICBlbHNlIGlmIChzdGF0dXMgPT0gU09BUF9IVE1MKQorICAgIHMgPSAidGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IjsKKyAgZWxzZSBpZiAoY291bnQgfHwgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykpCisgIHsgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgICAgIHMgPSAiYXBwbGljYXRpb24vc29hcCt4bWw7IGNoYXJzZXQ9dXRmLTgiOworICAgIGVsc2UKKyAgICAgIHMgPSAidGV4dC94bWw7IGNoYXJzZXQ9dXRmLTgiOworICB9CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5tb2RlICYgKFNPQVBfRU5DX0RJTUUgfCBTT0FQX0VOQ19NVE9NKSkKKyAgeyBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pCisgICAgeyByID0gczsKKyAgICAgIHMgPSAiYXBwbGljYXRpb24veG9wK3htbDsgY2hhcnNldD11dGYtOCI7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHMgPSAiYXBwbGljYXRpb24vZGltZSI7CisgIH0KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkgJiYgc29hcC0+bWltZS5ib3VuZGFyeSAmJiBzb2FwLT5zdGF0dXMgIT0gU09BUF9HRVQpCisgIHsgcmVnaXN0ZXIgY29uc3QgY2hhciAqdCA9IHN0cmNocihzLCAnOycpOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAibXVsdGlwYXJ0L3JlbGF0ZWQ7IGJvdW5kYXJ5PVwiJXNcIjsgdHlwZT1cIiIsIHNvYXAtPm1pbWUuYm91bmRhcnkpOworICAgIGlmICh0KQorICAgICAgc3RybmNhdChzb2FwLT50bXBidWYsIHMsIHQgLSBzKTsKKyAgICBlbHNlCisgICAgICBzdHJjYXQoc29hcC0+dG1wYnVmLCBzKTsKKyAgICBpZiAoc29hcC0+bWltZS5zdGFydCkKKyAgICB7IHN0cmNhdChzb2FwLT50bXBidWYsICJcIjsgc3RhcnQ9XCIiKTsKKyAgICAgIHN0cmNhdChzb2FwLT50bXBidWYsIHNvYXAtPm1pbWUuc3RhcnQpOworICAgIH0KKyAgICBzdHJjYXQoc29hcC0+dG1wYnVmLCAiXCIiKTsKKyAgICBpZiAocikKKyAgICB7IHN0cmNhdChzb2FwLT50bXBidWYsICI7IHN0YXJ0LWluZm89XCIiKTsKKyAgICAgIHN0cmNhdChzb2FwLT50bXBidWYsIHIpOworICAgICAgc3RyY2F0KHNvYXAtPnRtcGJ1ZiwgIlwiIik7CisgICAgfQorICAgIHMgPSBzb2FwLT50bXBidWY7CisgIH0KKyNlbmRpZgorICBpZiAocyAmJiAoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkNvbnRlbnQtVHlwZSIsIHMpKSkKKyAgICByZXR1cm4gZXJyOworI2lmZGVmIFdJVEhfWkxJQgorICBpZiAoc29hcC0+b21vZGUgJiBTT0FQX0VOQ19aTElCKQorICB7CisjaWZkZWYgV0lUSF9HWklQCisgICAgZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkNvbnRlbnQtRW5jb2RpbmciLCAiZ3ppcCIpOworI2Vsc2UKKyAgICBlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQ29udGVudC1FbmNvZGluZyIsICJkZWZsYXRlIik7CisjZW5kaWYKKyAgICBpZiAoZXJyKQorICAgICAgcmV0dXJuIGVycjsKKyAgfQorI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKQorICAgIGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJUcmFuc2Zlci1FbmNvZGluZyIsICJjaHVua2VkIik7CisgIGVsc2UKKyNlbmRpZgorICBpZiAoc29hcC0+c3RhdHVzICE9IFNPQVBfR0VUKQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiJWx1IiwgKHVuc2lnbmVkIGxvbmcpY291bnQpOworICAgIGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJDb250ZW50LUxlbmd0aCIsIHNvYXAtPnRtcGJ1Zik7CisgIH0KKyAgaWYgKGVycikKKyAgICByZXR1cm4gZXJyOworICByZXR1cm4gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkNvbm5lY3Rpb24iLCBzb2FwLT5rZWVwX2FsaXZlID8gImtlZXAtYWxpdmUiIDogImNsb3NlIik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK2h0dHBfZ2V0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZXR1cm4gU09BUF9HRVRfTUVUSE9EOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50CitodHRwX3Bvc3Qoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjb25zdCBjaGFyICpob3N0LCBpbnQgcG9ydCwgY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqYWN0aW9uLCBzaXplX3QgY291bnQpCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnM7CisgIHJlZ2lzdGVyIGludCBlcnI7CisgIGlmIChzb2FwLT5zdGF0dXMgPT0gU09BUF9HRVQpCisgICAgcyA9ICJHRVQiOworICBlbHNlCisgICAgcyA9ICJQT1NUIjsKKyNpZmRlZiBQQUxNCisgIGlmICghZW5kcG9pbnQgfHwgKHN0cm5jbXAoZW5kcG9pbnQsICJodHRwOiIsIDUpICYmIHN0cm5jbXAoZW5kcG9pbnQsICJodHRwczoiLCA2KSAmJiBzdHJuY21wKGVuZHBvaW50LCAiaHR0cGc6IiwgNikpICYmIHN0cm5jbXAoZW5kcG9pbnQsICJfYmVhbToiLCA2KSAmJiBzdHJuY21wKGVuZHBvaW50LCAiX2xvY2FsOiIsIDcpICYmIHN0cm5jbXAoZW5kcG9pbnQsICJfYnRvYmV4OiIsIDgpKQorI2Vsc2UKKyAgaWYgKCFlbmRwb2ludCB8fCAoc3RybmNtcChlbmRwb2ludCwgImh0dHA6IiwgNSkgJiYgc3RybmNtcChlbmRwb2ludCwgImh0dHBzOiIsIDYpICYmIHN0cm5jbXAoZW5kcG9pbnQsICJodHRwZzoiLCA2KSkpCisjZW5kaWYKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgaWYgKHNvYXAtPnByb3h5X2hvc3QgJiYgc3RybmNtcChlbmRwb2ludCwgImh0dHBzOiIsIDYpKQorICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiJXMgJXMgSFRUUC8lcyIsIHMsIGVuZHBvaW50LCBzb2FwLT5odHRwX3ZlcnNpb24pOworICBlbHNlCisgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICIlcyAvJXMgSFRUUC8lcyIsIHMsICgqcGF0aCA9PSAnLycgPyBwYXRoICsgMSA6IHBhdGgpLCBzb2FwLT5odHRwX3ZlcnNpb24pOworICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgTlVMTCkpKQorICAgIHJldHVybiBlcnI7CisgIGlmIChwb3J0ICE9IDgwKQorICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiJXM6JWQiLCBob3N0LCBwb3J0KTsKKyAgZWxzZQorICAgIHN0cmNweShzb2FwLT50bXBidWYsIGhvc3QpOyAKKyAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiSG9zdCIsIHNvYXAtPnRtcGJ1ZikpCisgICB8fCAoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlVzZXItQWdlbnQiLCAiZ1NPQVAvMi43IikpCisgICB8fCAoZXJyID0gc29hcF9wdXRodHRwaGRyKHNvYXAsIFNPQVBfT0ssIGNvdW50KSkpCisgICAgcmV0dXJuIGVycjsKKyNpZmRlZiBXSVRIX1pMSUIKKyNpZmRlZiBXSVRIX0daSVAKKyAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQWNjZXB0LUVuY29kaW5nIiwgImd6aXAsIGRlZmxhdGUiKSkpCisjZWxzZQorICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJBY2NlcHQtRW5jb2RpbmciLCAiZGVmbGF0ZSIpKSkKKyNlbmRpZgorICAgIHJldHVybiBlcnI7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT51c2VyaWQgJiYgc29hcC0+cGFzc3dkICYmIHN0cmxlbihzb2FwLT51c2VyaWQpICsgc3RybGVuKHNvYXAtPnBhc3N3ZCkgPCA3NjEpCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYgKyAyNjIsICIlczolcyIsIHNvYXAtPnVzZXJpZCwgc29hcC0+cGFzc3dkKTsKKyAgICBzdHJjcHkoc29hcC0+dG1wYnVmLCAiQmFzaWMgIik7CisgICAgc29hcF9zMmJhc2U2NChzb2FwLCAoY29uc3QgdW5zaWduZWQgY2hhciopKHNvYXAtPnRtcGJ1ZiArIDI2MiksIHNvYXAtPnRtcGJ1ZiArIDYsIHN0cmxlbihzb2FwLT50bXBidWYgKyAyNjIpKTsKKyAgICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJBdXRob3JpemF0aW9uIiwgc29hcC0+dG1wYnVmKSkpCisgICAgICByZXR1cm4gZXJyOworICB9CisgIGlmIChzb2FwLT5wcm94eV91c2VyaWQgJiYgc29hcC0+cHJveHlfcGFzc3dkICYmIHN0cmxlbihzb2FwLT5wcm94eV91c2VyaWQpICsgc3RybGVuKHNvYXAtPnByb3h5X3Bhc3N3ZCkgPCA3NjEpCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYgKyAyNjIsICIlczolcyIsIHNvYXAtPnByb3h5X3VzZXJpZCwgc29hcC0+cHJveHlfcGFzc3dkKTsKKyAgICBzdHJjcHkoc29hcC0+dG1wYnVmLCAiQmFzaWMgIik7CisgICAgc29hcF9zMmJhc2U2NChzb2FwLCAoY29uc3QgdW5zaWduZWQgY2hhciopKHNvYXAtPnRtcGJ1ZiArIDI2MiksIHNvYXAtPnRtcGJ1ZiArIDYsIHN0cmxlbihzb2FwLT50bXBidWYgKyAyNjIpKTsKKyAgICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJQcm94eS1BdXRob3JpemF0aW9uIiwgc29hcC0+dG1wYnVmKSkpCisgICAgICByZXR1cm4gZXJyOworICB9CisjZW5kaWYKKyNpZmRlZiBXSVRIX0NPT0tJRVMKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgaWYgKHNvYXBfcHV0Y29va2llcyhzb2FwLCBob3N0LCBwYXRoLCBzb2FwLT5zc2wgIT0gTlVMTCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2Vsc2UKKyAgaWYgKHNvYXBfcHV0Y29va2llcyhzb2FwLCBob3N0LCBwYXRoLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjZW5kaWYKKyNlbmRpZgorICBpZiAoYWN0aW9uICYmIHNvYXAtPnZlcnNpb24gPT0gMSkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIlwiJXNcIiIsIGFjdGlvbik7CisgICAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiU09BUEFjdGlvbiIsIHNvYXAtPnRtcGJ1ZikpKQorICAgICAgcmV0dXJuIGVycjsKKyAgfQorICByZXR1cm4gc29hcC0+ZnBvc3RoZHIoc29hcCwgTlVMTCwgTlVMTCk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK2h0dHBfc2VuZF9oZWFkZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMpCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnQ7CisgIGRvCisgIHsgdCA9IHN0cmNocihzLCAnXG4nKTsgLyogZGlzYWxsb3cgXG4gaW4gSFRUUCBoZWFkZXJzICovCisgICAgaWYgKCF0KQorICAgICAgdCA9IHMgKyBzdHJsZW4ocyk7CisgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIHMgPSB0ICsgMTsKKyAgfSB3aGlsZSAoKnQpOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAoraHR0cF9wb3N0X2hlYWRlcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWwpCit7IGlmIChrZXkpCisgIHsgaWYgKGh0dHBfc2VuZF9oZWFkZXIoc29hcCwga2V5KSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAodmFsICYmIChzb2FwX3NlbmRfcmF3KHNvYXAsICI6ICIsIDIpIHx8IGh0dHBfc2VuZF9oZWFkZXIoc29hcCwgdmFsKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgIlxyXG4iLCAyKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAoraHR0cF9yZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0YXR1cywgc2l6ZV90IGNvdW50KQoreyByZWdpc3RlciBpbnQgZXJyOworI2lmZGVmIFdNV19SUE1fSU8KKyAgaWYgKHNvYXAtPnJwbXJlcWlkKQorICAgIGh0dHBPdXRwdXRFbmFibGUoc29hcC0+cnBtcmVxaWQpOworI2VuZGlmCisgIGlmICghc3RhdHVzIHx8IHN0YXR1cyA9PSBTT0FQX0hUTUwgfHwgc3RhdHVzID09IFNPQVBfRklMRSkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk9LIDIwMFxuIikpOworI2lmZGVmIFdNV19SUE1fSU8KKyAgICBpZiAoc29hcC0+cnBtcmVxaWQgfHwgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSB8fCBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKSAvKiBSUE0gYmVoYXZlcyBhcyBpZiBzdGFuZGFsb25lICovCisjZWxzZQorICAgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpIHx8IHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpIC8qIHN0YW5kYWxvbmUgYXBwbGljYXRpb24gKi8KKyNlbmRpZgorICAgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJIVFRQLyVzIDIwMCBPSyIsIHNvYXAtPmh0dHBfdmVyc2lvbik7CisgICAgICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgTlVMTCkpKQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBlbHNlIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlN0YXR1cyIsICIyMDAgT0siKSkpCisgICAgICByZXR1cm4gZXJyOworICB9CisgIGVsc2UgaWYgKHN0YXR1cyA+IDIwMCAmJiBzdGF0dXMgPCA2MDApCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJIVFRQLyVzICVkICVzIiwgc29hcC0+aHR0cF92ZXJzaW9uLCBzdGF0dXMsIGh0dHBfZXJyb3Ioc29hcCwgc3RhdHVzKSk7CisgICAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCBzb2FwLT50bXBidWYsIE5VTEwpKSkKKyAgICAgIHJldHVybiBlcnI7CisjaWZuZGVmIFdJVEhfTEVBTiAKKyAgICBpZiAoc3RhdHVzID09IDQwMSkKKyAgICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiQmFzaWMgcmVhbG09XCIlc1wiIiwgc29hcC0+YXV0aHJlYWxtID8gc29hcC0+YXV0aHJlYWxtIDogImdTT0FQIFdlYiBTZXJ2aWNlIik7CisgICAgICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJXV1ctQXV0aGVudGljYXRlIiwgc29hcC0+dG1wYnVmKSkpCisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGVsc2UgaWYgKChzdGF0dXMgPj0gMzAxICYmIHN0YXR1cyA8PSAzMDMpIHx8IHN0YXR1cyA9PSAzMDcpCisgICAgeyBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJMb2NhdGlvbiIsIHNvYXAtPmVuZHBvaW50KSkpCisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorI2VuZGlmCisgIH0KKyAgZWxzZQorICB7IGNvbnN0IGNoYXIgKnMgPSAqc29hcF9mYXVsdGNvZGUoc29hcCk7CisgICAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMiAmJiAhc3RyY21wKHMsICJTT0FQLUVOVjpTZW5kZXIiKSkKKyAgICAgIHMgPSAiNDAwIEJhZCBSZXF1ZXN0IjsKKyAgICBlbHNlCisgICAgICBzID0gIjUwMCBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IiOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRXJyb3IgJXMgKHN0YXR1cz0lZClcbiIsIHMsIHN0YXR1cykpOworI2lmZGVmIFdNV19SUE1fSU8KKyAgICBpZiAoc29hcC0+cnBtcmVxaWQgfHwgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSB8fCBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKSAvKiBSUE0gYmVoYXZlcyBhcyBpZiBzdGFuZGFsb25lICovCisjZWxzZQorICAgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpIHx8IHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpIC8qIHN0YW5kYWxvbmUgYXBwbGljYXRpb24gKi8KKyNlbmRpZgorICAgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJIVFRQLyVzICVzIiwgc29hcC0+aHR0cF92ZXJzaW9uLCBzKTsKKyAgICAgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgc29hcC0+dG1wYnVmLCBOVUxMKSkpCisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGVsc2UgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiU3RhdHVzIiwgcykpKQorICAgICAgcmV0dXJuIGVycjsKKyAgfQorICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJTZXJ2ZXIiLCAiZ1NPQVAvMi43IikpCisgICB8fCAoZXJyID0gc29hcF9wdXRodHRwaGRyKHNvYXAsIHN0YXR1cywgY291bnQpKSkKKyAgICByZXR1cm4gZXJyOworI2lmZGVmIFdJVEhfQ09PS0lFUworICBpZiAoc29hcF9wdXRzZXRjb29raWVzKHNvYXApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNlbmRpZgorICByZXR1cm4gc29hcC0+ZnBvc3RoZHIoc29hcCwgTlVMTCwgTlVMTCk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0YXR1cykKK3sgcmVnaXN0ZXIgc2l6ZV90IGNvdW50OworICBpZiAoIShzb2FwLT5vbW9kZSAmIChTT0FQX0VOQ19YTUwgfCBTT0FQX0lPX1NUT1JFIC8qIHRoaXMgdGVzdHMgZm9yIGNodW5raW5nIHRvbyAqLykpCisgICAmJiAoc3RhdHVzID09IFNPQVBfSFRNTCB8fCBzdGF0dXMgPT0gU09BUF9GSUxFKSkKKyAgeyBzb2FwLT5vbW9kZSAmPSB+U09BUF9JTzsKKyAgICBzb2FwLT5vbW9kZSB8PSBTT0FQX0lPX1NUT1JFOworICB9CisgIHNvYXAtPnN0YXR1cyA9IHN0YXR1czsKKyAgY291bnQgPSBzb2FwX2NvdW50X2F0dGFjaG1lbnRzKHNvYXApOworICBpZiAoc29hcF9iZWdpbl9zZW5kKHNvYXApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgIT0gU09BUF9JT19TVE9SRSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpKQorICB7IHJlZ2lzdGVyIGludCBuID0gc29hcC0+bW9kZTsKKyAgICBzb2FwLT5tb2RlICY9IH4oU09BUF9JTyB8IFNPQVBfRU5DX1pMSUIpOworICAgIGlmICgobiAmIFNPQVBfSU8pICE9IFNPQVBfSU9fRkxVU0gpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fQlVGRkVSOworICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcmVzcG9uc2Uoc29hcCwgc3RhdHVzLCBjb3VudCkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICAgIGlmICgobiAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgICAgeyBpZiAoc29hcF9mbHVzaChzb2FwKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyNlbmRpZgorICAgIHNvYXAtPm1vZGUgPSBuOworICB9CisjZW5kaWYKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgY29uc3QgY2hhcioKK3NvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKnQpCit7IGlmICgqc29hcC0+dGFnKQorICAgIHNwcmludGYoc29hcC0+bXNnYnVmLCAiVmFsaWRhdGlvbiBjb25zdHJhaW50IHZpb2xhdGlvbjogJXMlcyBpbiBlbGVtZW50IDwlcz4iLCBzLCB0P3Q6U09BUF9TVFJfRU9TLCBzb2FwLT50YWcpOworICBlbHNlCisgICAgc3ByaW50Zihzb2FwLT5tc2didWYsICJWYWxpZGF0aW9uIGNvbnN0cmFpbnQgdmlvbGF0aW9uOiAlcyVzIiwgcywgdD90OlNPQVBfU1RSX0VPUyk7CisgIHJldHVybiBzb2FwLT5tc2didWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgY29uc3QgY2hhciAqKmMgPSBzb2FwX2ZhdWx0Y29kZShzb2FwKTsKKyAgY29uc3QgY2hhciAqKnMgPSBzb2FwX2ZhdWx0c3RyaW5nKHNvYXApOworICBpZiAoISpjICYmICEqcyAmJiBzb2FwLT5mc2V0ZXJyb3IpCisgICAgc29hcC0+ZnNldGVycm9yKHNvYXAsIGMsIHMpOworICBpZiAoISpjKQorICB7IGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgICAgICAqYyA9ICJTT0FQLUVOVjpTZW5kZXIiOworICAgIGVsc2UKKyAgICAgICpjID0gIlNPQVAtRU5WOkNsaWVudCI7CisgIH0KKyAgaWYgKCpzKQorICAgIHJldHVybjsKKyAgc3dpdGNoIChzb2FwLT5lcnJvcikKKyAgeworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBjYXNlIFNPQVBfQ0xJX0ZBVUxUOgorICAgICAgKnMgPSAiQ2xpZW50IGZhdWx0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9TVlJfRkFVTFQ6CisgICAgICAqcyA9ICJTZXJ2ZXIgZmF1bHQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1RBR19NSVNNQVRDSDoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAidGFnIG5hbWUgb3IgbmFtZXNwYWNlIG1pc21hdGNoIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfVFlQRToKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAiZGF0YSB0eXBlIG1pc21hdGNoICIsIHNvYXAtPnR5cGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1NZTlRBWF9FUlJPUjoKKyAgICAgICpzID0gIldlbGwtZm9ybWVkbmVzcyB2aW9sYXRpb24iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX05PX1RBRzoKKyAgICAgICpzID0gIk5vIFhNTCBlbGVtZW50IHRhZyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTVVTVFVOREVSU1RBTkQ6CisgICAgICAqYyA9ICJTT0FQLUVOVjpNdXN0VW5kZXJzdGFuZCI7CisgICAgICBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIlRoZSBkYXRhIGluIGVsZW1lbnQgJyVzJyBtdXN0IGJlIHVuZGVyc3Rvb2QgYnV0IGNhbm5vdCBiZSBoYW5kbGVkIiwgc29hcC0+dGFnKTsKKyAgICAgICpzID0gc29hcC0+bXNnYnVmOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1ZFUlNJT05NSVNNQVRDSDoKKyAgICAgICpjID0gIlNPQVAtRU5WOlZlcnNpb25NaXNtYXRjaCI7CisgICAgICAqcyA9ICJTT0FQIHZlcnNpb24gbWlzbWF0Y2ggb3IgaW52YWxpZCBTT0FQIG1lc3NhZ2UiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0RBVEFFTkNPRElOR1VOS05PV046CisgICAgICAqYyA9ICJTT0FQLUVOVjpEYXRhRW5jb2RpbmdVbmtub3duIjsKKyAgICAgICpzID0gIlVuc3VwcG9ydGVkIFNPQVAgZGF0YSBlbmNvZGluZyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTkFNRVNQQUNFOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJuYW1lc3BhY2UgbWlzbWF0Y2giLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9VU0VSX0VSUk9SOgorICAgICAgKnMgPSAiVXNlciBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfRkFUQUxfRVJST1I6CisgICAgICAqcyA9ICJGYXRhbCBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTk9fTUVUSE9EOgorICAgICAgc3ByaW50Zihzb2FwLT5tc2didWYsICJNZXRob2QgJyVzJyBub3QgaW1wbGVtZW50ZWQ6IG1ldGhvZCBuYW1lIG9yIG5hbWVzcGFjZSBub3QgcmVjb2duaXplZCIsIHNvYXAtPnRhZyk7CisgICAgICAqcyA9IHNvYXAtPm1zZ2J1ZjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9HRVRfTUVUSE9EOgorICAgICAgKnMgPSAiSFRUUCBHRVQgbWV0aG9kIG5vdCBpbXBsZW1lbnRlZCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfRU9NOgorICAgICAgKnMgPSAiT3V0IG9mIG1lbW9yeSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfSU9COgorICAgICAgKnMgPSAiQXJyYXkgaW5kZXggb3V0IG9mIGJvdW5kcyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTlVMTDoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAibmlsIG5vdCBhbGxvd2VkIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfRFVQTElDQVRFX0lEOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJtdWx0aXBsZSBkZWZpbml0aW9ucyBvZiBpZCAiLCBzb2FwLT5pZCk7CisgICAgICBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICAgICAgICAqc29hcF9mYXVsdHN1YmNvZGUoc29hcCkgPSAiU09BUC1FTkM6RHVwbGljYXRlSUQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX01JU1NJTkdfSUQ6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgIm1pc3NpbmcgaWQgZm9yIHJlZiAiLCBzb2FwLT5pZCk7CisgICAgICBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICAgICAgICAqc29hcF9mYXVsdHN1YmNvZGUoc29hcCkgPSAiU09BUC1FTkM6TWlzc2luZ0lEIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9IUkVGOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJpbmNvbXBhdGlibGUgb2JqZWN0IHJlZiAiLCBzb2FwLT5pZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfRkFVTFQ6CisgICAgICBicmVhazsKKyNpZm5kZWYgV0lUSF9OT0lPCisgICAgY2FzZSBTT0FQX1VEUF9FUlJPUjoKKyAgICAgICpzID0gIk1lc3NhZ2UgdG9vIGxhcmdlIGZvciBVRFAgcGFja2V0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9UQ1BfRVJST1I6CisgICAgICAqcyA9IHRjcF9lcnJvcihzb2FwKTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSBTT0FQX0hUVFBfRVJST1I6CisgICAgICAqcyA9ICJIVFRQIGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9TU0xfRVJST1I6CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgICAgICAqcyA9ICJTU0wgZXJyb3IiOworI2Vsc2UKKyAgICAgICpzID0gIk9wZW5TU0wgbm90IGluc3RhbGxlZDogcmVjb21waWxlIHdpdGggLURXSVRIX09QRU5TU0wiOworI2VuZGlmCisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfUExVR0lOX0VSUk9SOgorICAgICAgKnMgPSAiUGx1Z2luIHJlZ2lzdHJ5IGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9ESU1FX0VSUk9SOgorICAgICAgKnMgPSAiRElNRSBmb3JtYXQgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0RJTUVfSFJFRjoKKyAgICAgICpzID0gIkRJTUUgaHJlZiB0byBtaXNzaW5nIGF0dGFjaG1lbnQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0RJTUVfTUlTTUFUQ0g6CisgICAgICAqcyA9ICJESU1FIHZlcnNpb24vdHJhbnNtaXNzaW9uIGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9ESU1FX0VORDoKKyAgICAgICpzID0gIkVuZCBvZiBESU1FIGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9NSU1FX0VSUk9SOgorICAgICAgKnMgPSAiTUlNRSBmb3JtYXQgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX01JTUVfSFJFRjoKKyAgICAgICpzID0gIk1JTUUgaHJlZiB0byBtaXNzaW5nIGF0dGFjaG1lbnQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX01JTUVfRU5EOgorICAgICAgKnMgPSAiRW5kIG9mIE1JTUUgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1pMSUJfRVJST1I6CisjaWZkZWYgV0lUSF9aTElCCisgICAgICBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIlpsaWIvZ3ppcCBlcnJvcjogJyVzJyIsIHNvYXAtPmRfc3RyZWFtLm1zZz9zb2FwLT5kX3N0cmVhbS5tc2c6IiIpOworICAgICAgKnMgPSBzb2FwLT5tc2didWY7CisjZWxzZQorICAgICAgKnMgPSAiWmxpYi9nemlwIG5vdCBpbnN0YWxsZWQgZm9yIChkZSljb21wcmVzc2lvbjogcmVjb21waWxlIHdpdGggLURXSVRIX0daSVAiOworI2VuZGlmCisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfUkVRVUlSRUQ6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgIm1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfUFJPSElCSVRFRDoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAicHJvaGliaXRlZCBhdHRyaWJ1dGUgcHJlc2VudCIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX09DQ1VSUzoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAibWluL21heE9jY3VycyB2aW9sYXRpb24iLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9MRU5HVEg6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgImNvbnRlbnQgbGVuZ3RoIHZpb2xhdGlvbiIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1NUT1A6CisgICAgICAqcyA9ICJTdG9wcGVkOiBubyByZXNwb25zZSBzZW50IjsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSBTT0FQX0VPRjoKKyNpZm5kZWYgV0lUSF9OT0lPCisgICAgICBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIkVuZCBvZiBmaWxlIG9yIG5vIGlucHV0OiAnJXMnIiwgc29hcF9zdHJlcnJvcihzb2FwKSk7CisgICAgICAqcyA9IHNvYXAtPm1zZ2J1ZjsKKyAgICAgIGJyZWFrOworI2Vsc2UKKyAgICAgICpzID0gIkVuZCBvZiBmaWxlIG9yIG5vIGlucHV0IjsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdDoKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICBpZiAoc29hcC0+ZXJyb3IgPiAyMDAgJiYgc29hcC0+ZXJyb3IgPCA2MDApCisgICAgICB7IHNwcmludGYoc29hcC0+bXNnYnVmLCAiSFRUUCBFcnJvcjogJWQgJXMiLCBzb2FwLT5lcnJvciwgaHR0cF9lcnJvcihzb2FwLCBzb2FwLT5lcnJvcikpOworICAgICAgICAqcyA9IHNvYXAtPm1zZ2J1ZjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyNlbmRpZgorI2VuZGlmCisgICAgICB7IHNwcmludGYoc29hcC0+bXNnYnVmLCAiRXJyb3IgJWQiLCBzb2FwLT5lcnJvcik7CisgICAgICAgICpzID0gc29hcC0+bXNnYnVmOworICAgICAgfQorICAgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZW5kX2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgc3RhdHVzID0gc29hcC0+ZXJyb3I7CisgIGludCByID0gMTsKKyAgaWYgKHN0YXR1cyA9PSBTT0FQX1NUT1ApCisgICAgcmV0dXJuIHN0YXR1czsKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNlbmRpbmcgYmFjayBmYXVsdCBzdHJ1Y3QgZm9yIGVycm9yIGNvZGUgJWRcbiIsIHNvYXAtPmVycm9yKSk7CisgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOyAvKiB0byB0ZXJtaW5hdGUgY29ubmVjdGlvbiAqLworICBzb2FwX3NldF9mYXVsdChzb2FwKTsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgIGZkX3NldCByZmQsIHNmZDsKKyAgICB0aW1lb3V0LnR2X3NlYyA9IDA7CisgICAgdGltZW91dC50dl91c2VjID0gMDsKKyAgICBGRF9aRVJPKCZyZmQpOworICAgIEZEX1pFUk8oJnNmZCk7CisgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZyZmQpOworICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmc2ZkKTsKKyAgICByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksICZyZmQsICZzZmQsIE5VTEwsICZ0aW1lb3V0KTsKKyAgICBpZiAociA+IDApCisgICAgeyBpZiAoIUZEX0lTU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZzZmQpCisgICAgICAgfHwgKEZEX0lTU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZyZmQpCisgICAgICAgICYmIHJlY3YoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgc29hcC0+dG1wYnVmLCAxLCBNU0dfUEVFSykgPCAwKSkKKyAgICAgICAgciA9IDA7CisgICAgfQorICB9CisjZW5kaWYKKyNlbmRpZgorICBpZiAoKHN0YXR1cyAhPSBTT0FQX0VPRiB8fCAoIXNvYXAtPnJlY3ZfdGltZW91dCAmJiAhc29hcC0+c2VuZF90aW1lb3V0KSkgJiYgciA+IDApCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICAgIHNvYXBfc2VyaWFsaXplaGVhZGVyKHNvYXApOworICAgIHNvYXBfc2VyaWFsaXplZmF1bHQoc29hcCk7CisgICAgc29hcF9iZWdpbl9jb3VudChzb2FwKTsKKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICAgIHsgc29hcF9lbnZlbG9wZV9iZWdpbl9vdXQoc29hcCk7CisgICAgICBzb2FwX3B1dGhlYWRlcihzb2FwKTsKKyAgICAgIHNvYXBfYm9keV9iZWdpbl9vdXQoc29hcCk7CisgICAgICBzb2FwX3B1dGZhdWx0KHNvYXApOworICAgICAgc29hcF9ib2R5X2VuZF9vdXQoc29hcCk7CisgICAgICBzb2FwX2VudmVsb3BlX2VuZF9vdXQoc29hcCk7CisgICAgfQorICAgIHNvYXBfZW5kX2NvdW50KHNvYXApOworICAgIGlmIChzb2FwX3Jlc3BvbnNlKHNvYXAsIHN0YXR1cykKKyAgICAgfHwgc29hcF9lbnZlbG9wZV9iZWdpbl9vdXQoc29hcCkKKyAgICAgfHwgc29hcF9wdXRoZWFkZXIoc29hcCkKKyAgICAgfHwgc29hcF9ib2R5X2JlZ2luX291dChzb2FwKQorICAgICB8fCBzb2FwX3B1dGZhdWx0KHNvYXApCisgICAgIHx8IHNvYXBfYm9keV9lbmRfb3V0KHNvYXApCisgICAgIHx8IHNvYXBfZW52ZWxvcGVfZW5kX291dChzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICBzb2FwX2VuZF9zZW5kKHNvYXApOworICB9CisgIHNvYXAtPmVycm9yID0gc3RhdHVzOworICByZXR1cm4gc29hcF9jbG9zZXNvY2soc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVjdl9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IHN0YXR1cyA9IHNvYXAtPmVycm9yOworICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVjZWl2aW5nIFNPQVAgRmF1bHRcbiIpKTsKKyAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICBpZiAoc29hcF9nZXRmYXVsdChzb2FwKSkKKyAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiRXJyb3I6IHNvYXBfZ2V0X3NvYXBmYXVsdCgpIGZhaWxlZC4gSXMgdGhpcyBhIFNPQVAgbWVzc2FnZSBhdCBhbGw/XG4iKSk7CisgICAgKnNvYXBfZmF1bHRjb2RlKHNvYXApID0gKHNvYXAtPnZlcnNpb24gPT0gMiA/ICJTT0FQLUVOVjpTZW5kZXIiIDogIlNPQVAtRU5WOkNsaWVudCIpOworICAgIHNvYXAtPmVycm9yID0gc3RhdHVzOworICAgIHNvYXBfc2V0X2ZhdWx0KHNvYXApOworICB9CisgIGVsc2UKKyAgeyByZWdpc3RlciBjb25zdCBjaGFyICpzID0gKnNvYXBfZmF1bHRjb2RlKHNvYXApOworICAgIGlmICghc29hcF9tYXRjaF90YWcoc29hcCwgcywgIlNPQVAtRU5WOlNlcnZlciIpIHx8ICFzb2FwX21hdGNoX3RhZyhzb2FwLCBzLCAiU09BUC1FTlY6UmVjZWl2ZXIiKSkKKyAgICAgIHN0YXR1cyA9IFNPQVBfU1ZSX0ZBVUxUOyAKKyAgICBlbHNlIGlmICghc29hcF9tYXRjaF90YWcoc29hcCwgcywgIlNPQVAtRU5WOkNsaWVudCIpIHx8ICFzb2FwX21hdGNoX3RhZyhzb2FwLCBzLCAiU09BUC1FTlY6U2VuZGVyIikpCisgICAgICBzdGF0dXMgPSBTT0FQX0NMSV9GQVVMVDsKKyAgICBlbHNlIGlmICghc29hcF9tYXRjaF90YWcoc29hcCwgcywgIlNPQVAtRU5WOk11c3RVbmRlcnN0YW5kIikpCisgICAgICBzdGF0dXMgPSBTT0FQX01VU1RVTkRFUlNUQU5EOworICAgIGVsc2UgaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCBzLCAiU09BUC1FTlY6VmVyc2lvbk1pc21hdGNoIikpCisgICAgICBzdGF0dXMgPSBTT0FQX1ZFUlNJT05NSVNNQVRDSDsKKyAgICBlbHNlCisgICAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiRmF1bHQgY29kZSAlc1xuIiwgcykpOworICAgICAgc3RhdHVzID0gU09BUF9GQVVMVDsKKyAgICB9CisgICAgaWYgKHNvYXBfYm9keV9lbmRfaW4oc29hcCkKKyAgICAgfHwgc29hcF9lbnZlbG9wZV9lbmRfaW4oc29hcCkKKyAgICAgfHwgc29hcF9lbmRfcmVjdihzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICBzb2FwLT5lcnJvciA9IHN0YXR1czsKKyAgfQorICByZXR1cm4gc29hcF9jbG9zZXNvY2soc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2VuZF9lbXB0eV9yZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+Y291bnQgPSAwOworICBpZiAoc29hcF9yZXNwb25zZShzb2FwLCBTT0FQX09LKSB8fCBzb2FwX2VuZF9zZW5kKHNvYXApKQorICAgIHJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWN2X2VtcHR5X3Jlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcF9iZWdpbl9yZWN2KHNvYXApIHx8IHNvYXBfZW5kX3JlY3Yoc29hcCkpCisgICAgcmV0dXJuIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBjb25zdCBjaGFyKgorc29hcF9zdHJlcnJvcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IGVyciA9IHNvYXAtPmVycm51bTsKKyAgaWYgKGVycikKKyAgeworI2lmbmRlZiBXSU4zMgorICAgIHJldHVybiBzdHJlcnJvcihlcnIpOworI2Vsc2UKKyAgICBGb3JtYXRNZXNzYWdlKEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNfEZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTLCBOVUxMLCBlcnIsIDAsIChMUFRTVFIpJnNvYXAtPmVycm9yc3RyLCBzaXplb2Yoc29hcC0+ZXJyb3JzdHIpLCBOVUxMKTsKKyAgICByZXR1cm4gc29hcC0+ZXJyb3JzdHI7CisjZW5kaWYKKyAgfQorICByZXR1cm4gIk9wZXJhdGlvbiBpbnRlcnJ1cHRlZCBvciB0aW1lZCBvdXQiOworfQorI2VuZGlmCisjZW5kaWYgCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorc3RhdGljIGludAorc29hcF9zZXRfZXJyb3Ioc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZhdWx0Y29kZSwgY29uc3QgY2hhciAqZmF1bHRzdWJjb2RlLCBjb25zdCBjaGFyICpmYXVsdHN0cmluZywgY29uc3QgY2hhciAqZmF1bHRkZXRhaWwsIGludCBzb2FwZXJyb3IpCit7ICpzb2FwX2ZhdWx0Y29kZShzb2FwKSA9IGZhdWx0Y29kZTsKKyAgaWYgKGZhdWx0c3ViY29kZSkKKyAgICAqc29hcF9mYXVsdHN1YmNvZGUoc29hcCkgPSBmYXVsdHN1YmNvZGU7CisgICpzb2FwX2ZhdWx0c3RyaW5nKHNvYXApID0gZmF1bHRzdHJpbmc7CisgIGlmIChmYXVsdGRldGFpbCAmJiAqZmF1bHRkZXRhaWwpCisgIHsgcmVnaXN0ZXIgY29uc3QgY2hhciAqKnMgPSBzb2FwX2ZhdWx0ZGV0YWlsKHNvYXApOworICAgIGlmIChzKQorICAgICAgKnMgPSBmYXVsdGRldGFpbDsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3IgPSBzb2FwZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X3NlbmRlcl9lcnJvcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRzdHJpbmcsIGNvbnN0IGNoYXIgKmZhdWx0ZGV0YWlsLCBpbnQgc29hcGVycm9yKQoreyByZXR1cm4gc29hcF9zZXRfZXJyb3Ioc29hcCwgc29hcC0+dmVyc2lvbiA9PSAyID8gIlNPQVAtRU5WOlNlbmRlciIgOiAiU09BUC1FTlY6Q2xpZW50IiwgTlVMTCwgZmF1bHRzdHJpbmcsIGZhdWx0ZGV0YWlsLCBzb2FwZXJyb3IpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRzdHJpbmcsIGNvbnN0IGNoYXIgKmZhdWx0ZGV0YWlsLCBpbnQgc29hcGVycm9yKQoreyByZXR1cm4gc29hcF9zZXRfZXJyb3Ioc29hcCwgc29hcC0+dmVyc2lvbiA9PSAyID8gIlNPQVAtRU5WOlJlY2VpdmVyIiA6ICJTT0FQLUVOVjpTZXJ2ZXIiLCBOVUxMLCBmYXVsdHN0cmluZywgZmF1bHRkZXRhaWwsIHNvYXBlcnJvcik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitzdGF0aWMgaW50Citzb2FwX2NvcHlfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZhdWx0Y29kZSwgY29uc3QgY2hhciAqZmF1bHRzdWJjb2RlLCBjb25zdCBjaGFyICpmYXVsdHN0cmluZywgY29uc3QgY2hhciAqZmF1bHRkZXRhaWwpCit7IGNoYXIgKnIgPSBOVUxMLCAqcyA9IE5VTEwsICp0ID0gTlVMTDsKKyAgaWYgKGZhdWx0c3ViY29kZSkKKyAgICByID0gc29hcF9zdHJkdXAoc29hcCwgZmF1bHRzdWJjb2RlKTsKKyAgaWYgKGZhdWx0c3RyaW5nKQorICAgIHMgPSBzb2FwX3N0cmR1cChzb2FwLCBmYXVsdHN0cmluZyk7CisgIGlmIChmYXVsdGRldGFpbCkKKyAgICB0ID0gc29hcF9zdHJkdXAoc29hcCwgZmF1bHRkZXRhaWwpOworICByZXR1cm4gc29hcF9zZXRfZXJyb3Ioc29hcCwgZmF1bHRjb2RlLCByLCBzLCB0LCBTT0FQX0ZBVUxUKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZW5kZXJfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCkKK3sgcmV0dXJuIHNvYXBfc2VuZGVyX2ZhdWx0X3N1YmNvZGUoc29hcCwgTlVMTCwgZmF1bHRzdHJpbmcsIGZhdWx0ZGV0YWlsKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZW5kZXJfZmF1bHRfc3ViY29kZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRzdWJjb2RlLCBjb25zdCBjaGFyICpmYXVsdHN0cmluZywgY29uc3QgY2hhciAqZmF1bHRkZXRhaWwpCit7IHJldHVybiBzb2FwX2NvcHlfZmF1bHQoc29hcCwgc29hcC0+dmVyc2lvbiA9PSAyID8gIlNPQVAtRU5WOlNlbmRlciIgOiAiU09BUC1FTlY6Q2xpZW50IiwgZmF1bHRzdWJjb2RlLCBmYXVsdHN0cmluZywgZmF1bHRkZXRhaWwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlY2VpdmVyX2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdHN0cmluZywgY29uc3QgY2hhciAqZmF1bHRkZXRhaWwpCit7IHJldHVybiBzb2FwX3JlY2VpdmVyX2ZhdWx0X3N1YmNvZGUoc29hcCwgTlVMTCwgZmF1bHRzdHJpbmcsIGZhdWx0ZGV0YWlsKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWNlaXZlcl9mYXVsdF9zdWJjb2RlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdHN1YmNvZGUsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCkKK3sgcmV0dXJuIHNvYXBfY29weV9mYXVsdChzb2FwLCBzb2FwLT52ZXJzaW9uID09IDIgPyAiU09BUC1FTlY6UmVjZWl2ZXIiIDogIlNPQVAtRU5WOlNlcnZlciIsIGZhdWx0c3ViY29kZSwgZmF1bHRzdHJpbmcsIGZhdWx0ZGV0YWlsKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKKyNpZm5kZWYgV0lUSF9OT1NURExJQgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9wcmludF9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCwgRklMRSAqZmQpCit7IGlmIChzb2FwX2NoZWNrX3N0YXRlKHNvYXApKQorICAgIGZwcmludGYoZmQsICJFcnJvcjogc29hcCBzdHJ1Y3Qgbm90IGluaXRpYWxpemVkXG4iKTsKKyAgZWxzZSBpZiAoc29hcC0+ZXJyb3IpCisgIHsgY29uc3QgY2hhciAqYywgKnYgPSBOVUxMLCAqcywgKipkOworICAgIGQgPSBzb2FwX2ZhdWx0Y29kZShzb2FwKTsKKyAgICBpZiAoISpkKQorICAgICAgc29hcF9zZXRfZmF1bHQoc29hcCk7CisgICAgYyA9ICpkOworICAgIGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgICAgICB2ID0gKnNvYXBfZmF1bHRzdWJjb2RlKHNvYXApOworICAgIHMgPSAqc29hcF9mYXVsdHN0cmluZyhzb2FwKTsKKyAgICBkID0gc29hcF9mYXVsdGRldGFpbChzb2FwKTsKKyAgICBmcHJpbnRmKGZkLCAiJXMlZCBmYXVsdDogJXMgWyVzXVxuXCIlc1wiXG5EZXRhaWw6ICVzXG4iLCBzb2FwLT52ZXJzaW9uID8gIlNPQVAgMS4iIDogIkVycm9yICIsIHNvYXAtPnZlcnNpb24gPyAoaW50KXNvYXAtPnZlcnNpb24gOiBzb2FwLT5lcnJvciwgYywgdiA/IHYgOiAibm8gc3ViY29kZSIsIHMgPyBzIDogIltubyByZWFzb25dIiwgZCAmJiAqZCA/ICpkIDogIltubyBkZXRhaWxdIik7CisgIH0KK30KKyNlbmRpZgorI2VuZGlmCisgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKKyNpZm5kZWYgV0lUSF9OT1NURExJQgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9wcmludF9mYXVsdF9sb2NhdGlvbihzdHJ1Y3Qgc29hcCAqc29hcCwgRklMRSAqZmQpCit7IAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaW50IGksIGosIGMxLCBjMjsKKyAgaWYgKHNvYXAtPmVycm9yICYmIHNvYXAtPmJ1ZmxlbiA+IDApCisgIHsgaSA9IChpbnQpc29hcC0+YnVmaWR4IC0gMTsKKyAgICBpZiAoaSA8PSAwKQorICAgICAgaSA9IDA7CisgICAgYzEgPSBzb2FwLT5idWZbaV07CisgICAgc29hcC0+YnVmW2ldID0gJ1wwJzsKKyAgICBpZiAoKGludClzb2FwLT5idWZsZW4gPj0gaSArIDEwMjQpCisgICAgICBqID0gaSArIDEwMjM7CisgICAgZWxzZQorICAgICAgaiA9IChpbnQpc29hcC0+YnVmbGVuIC0gMTsKKyAgICBjMiA9IHNvYXAtPmJ1ZltqXTsKKyAgICBzb2FwLT5idWZbal0gPSAnXDAnOworICAgIGZwcmludGYoZmQsICIlcyVjXG4qKiBIRVJFICoqXG4iLCBzb2FwLT5idWYsIGMxKTsKKyAgICBpZiAoc29hcC0+YnVmaWR4IDwgc29hcC0+YnVmbGVuKQorICAgICAgZnByaW50ZihmZCwgIiVzXG4iLCBzb2FwLT5idWYgKyBzb2FwLT5idWZpZHgpOworICAgIHNvYXAtPmJ1ZltpXSA9IGMxOworICAgIHNvYXAtPmJ1ZltqXSA9IGMyOworICB9CisjZW5kaWYKK30KKyNlbmRpZgorI2VuZGlmCisgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWdpc3Rlcl9wbHVnaW5fYXJnKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgKCpmY3JlYXRlKShzdHJ1Y3Qgc29hcCosIHN0cnVjdCBzb2FwX3BsdWdpbiosIHZvaWQqKSwgdm9pZCAqYXJnKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnA7CisgIHJlZ2lzdGVyIGludCByOworICBpZiAoIShwID0gKHN0cnVjdCBzb2FwX3BsdWdpbiopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX3BsdWdpbikpKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgcC0+aWQgPSBOVUxMOworICBwLT5kYXRhID0gTlVMTDsKKyAgcC0+ZmNvcHkgPSBOVUxMOworICBwLT5mZGVsZXRlID0gTlVMTDsKKyAgciA9IGZjcmVhdGUoc29hcCwgcCwgYXJnKTsKKyAgaWYgKCFyICYmIHAtPmZkZWxldGUpCisgIHsgcC0+bmV4dCA9IHNvYXAtPnBsdWdpbnM7CisgICAgc29hcC0+cGx1Z2lucyA9IHA7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWdpc3RlcmVkICclcycgcGx1Z2luXG4iLCBwLT5pZCkpOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IHJlZ2lzdGVyIHBsdWdpbiAnJXMnOiBwbHVnaW4gcmV0dXJuZWQgZXJyb3IgJWQgKG9yIGZkZWxldGUgY2FsbGJhY2sgbm90IHNldClcbiIsIHAtPmlkP3AtPmlkOiI/IiwgcikpOworICBTT0FQX0ZSRUUoc29hcCwgcCk7CisgIHJldHVybiByOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQgKgorZnBsdWdpbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BsdWdpbiAqcDsKKyAgZm9yIChwID0gc29hcC0+cGx1Z2luczsgcDsgcCA9IHAtPm5leHQpCisgICAgaWYgKHAtPmlkID09IGlkIHx8ICFzdHJjbXAocC0+aWQsIGlkKSkKKyAgICAgIHJldHVybiBwLT5kYXRhOworICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQgKgorU09BUF9GTUFDMgorc29hcF9sb29rdXBfcGx1Z2luKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCkKK3sgcmV0dXJuIHNvYXAtPmZwbHVnaW4oc29hcCwgaWQpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpZm5kZWYgV0lUSF9MRUFOCitzb2FwOjpzb2FwKCkKK3sgc29hcF9pbml0KHRoaXMpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglDKysgc29hcCBzdHJ1Y3QgbWV0aG9kcworICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpZm5kZWYgV0lUSF9MRUFOCitzb2FwOjpzb2FwKHNvYXBfbW9kZSBtb2RlKQoreyBzb2FwX2luaXQxKHRoaXMsIG1vZGUpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworI2lmbmRlZiBXSVRIX0xFQU4KK3NvYXA6OnNvYXAoc29hcF9tb2RlIGltb2RlLCBzb2FwX21vZGUgb21vZGUpCit7IHNvYXBfaW5pdDIodGhpcywgaW1vZGUsIG9tb2RlKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpZm5kZWYgV0lUSF9MRUFOCitzb2FwOjpzb2FwKHN0cnVjdCBzb2FwJiBzb2FwKQoreyBzb2FwX2NvcHlfY29udGV4dCh0aGlzLCAmc29hcCk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIF9fY3BsdXNwbHVzCisjaWZuZGVmIFdJVEhfTEVBTgorc29hcDo6fnNvYXAoKQoreyBzb2FwX2Rlc3Ryb3kodGhpcyk7CisgIHNvYXBfZW5kKHRoaXMpOworICBzb2FwX2RvbmUodGhpcyk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9tYWdpY19WQy9zdGRzb2FwMi5oIGIvc2FtcGxlcy9tYWdpY19WQy9zdGRzb2FwMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNmM3NGQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL21hZ2ljX1ZDL3N0ZHNvYXAyLmgKQEAgLTAsMCArMSwyMDkzIEBACisvKgorCitzdGRzb2FwMi5oIDIuNy42ZQorCitnU09BUCBydW50aW1lCisKK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgcGFydCBvZiB0aGUgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXM6CitHUEwsIHRoZSBnU09BUCBwdWJsaWMgbGljZW5zZSwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NvbnRyaWJ1dG9yczoKKworV2luZCBSaXZlciBTeXN0ZW1zLCBJbmMuLCBmb3IgdGhlIGZvbGxvd2luZyBhZGRpdGlvbnMgKG1hcmtlZCBXUlsuLi5dKToKKyAgLSB2eFdvcmtzIGNvbXBhdGlibGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBwdWJsaWMgbGljZW5zZS4KKworVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZ1NPQVAgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjMKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcGxpY2Vuc2UuaHRtbAorU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKK1dJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQorZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFJvYmVydCBBLiB2YW4gRW5nZWxlbi4KK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZkZWYgV0lUSF9TT0FQREVGU19ICisjIGluY2x1ZGUgInNvYXBkZWZzLmgiCQkvKiBpbmNsdWRlIHVzZXItZGVmaW5lZCBzdHVmZiAqLworI2VuZGlmCisKKyNpZm5kZWYgX1RIUkVBRF9TQUZFCisjIGRlZmluZSBfVEhSRUFEX1NBRkUKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TRVJWRVIKKyMgaWZuZGVmIF9SRUVOVFJBTlQKKyMgIGRlZmluZSBfUkVFTlRSQU5UCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBTT0FQX0ZNQUMxCS8qIHN0ZHNvYXAyLmggZGVjbGFyYXRpb24gbWFjcm8gKi8KKyMgZGVmaW5lIFNPQVBfRk1BQzEKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfRk1BQzIJLyogc3Rkc29hcDIuaCBkZWNsYXJhdGlvbiBtYWNybyAqLworIyBkZWZpbmUgU09BUF9GTUFDMgorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9GTUFDMwkvKiAoZGUpc2VyaWFsaXplciBkZWNsYXJhdGlvbiBtYWNybyAqLworIyBkZWZpbmUgU09BUF9GTUFDMworI2VuZGlmCisKKyNpZm5kZWYgU09BUF9GTUFDM1MJLyogc3RyaW5nIGNvbnZlcnRlciBmb3IgKGRlKXNlcmlhbGl6ZXIgZGVjbGFyYXRpb24gbWFjcm8gKi8KKyMgZGVmaW5lIFNPQVBfRk1BQzNTIFNPQVBfRk1BQzMKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfRk1BQzQJLyogKGRlKXNlcmlhbGl6ZXIgZGVjbGFyYXRpb24gbWFjcm8gKi8KKyMgZGVmaW5lIFNPQVBfRk1BQzQKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfRk1BQzRTCS8qIHN0cmluZyBjb252ZXJ0ZXIgZm9yIChkZSlzZXJpYWxpemVyIGRlY2xhcmF0aW9uIG1hY3JvICovCisjIGRlZmluZSBTT0FQX0ZNQUM0UyBTT0FQX0ZNQUM0CisjZW5kaWYKKworI2lmbmRlZiBTT0FQX0ZNQUM1CS8qIHN0dWIvc2tlbGV0b24gZGVjbGFyYXRpb24gbWFjcm8gKi8KKyMgZGVmaW5lIFNPQVBfRk1BQzUKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfRk1BQzYJLyogc3R1Yi9za2VsZXRvbiBkZWNsYXJhdGlvbiBtYWNybyAqLworIyBkZWZpbmUgU09BUF9GTUFDNgorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9DTUFDCS8qIGNsYXNzIGRlY2xhcmF0aW9uIG1hY3JvICovCisjIGRlZmluZSBTT0FQX0NNQUMKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfTk1BQwkvKiBuYW1lc3BhY2UgdGFibGUgZGVjbGFyYXRpb24gbWFjcm8gKi8KKyMgZGVmaW5lIFNPQVBfTk1BQworI2VuZGlmCisKKyNpZm5kZWYgU09BUF9TT1VSQ0VfU1RBTVAKKyMgZGVmaW5lIFNPQVBfU09VUkNFX1NUQU1QKHN0cikKKyNlbmRpZgorCisvKiBnU09BUCAyLjcuNCBhbmQgaGlnaGVyOiBmYXN0IGxvb2stYXNpZGUgYnVmZmVyaW5nIGlzIHN0YWJsZSAqLworI2lmbmRlZiBXSVRIX0ZBU1QKKyMgZGVmaW5lIFdJVEhfRkFTVAorI2VuZGlmCisKKyNpZmRlZiBXSVRIX0xFQU5FUgorIyBpZm5kZWYgV0lUSF9MRUFOCisjICBkZWZpbmUgV0lUSF9MRUFOCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIFdJVEhfTEVBTgorIyBpZmRlZiBXSVRIX0NPT0tJRVMKKyMgIGVycm9yICJDYW5ub3QgYnVpbGQgV0lUSF9MRUFOIGNvZGUgV0lUSF9DT09LSUVTIGVuYWJsZWQiCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBTVERTT0FQX0gKKyNkZWZpbmUgU1REU09BUF9ICisKKyNpZiBkZWZpbmVkKF9fdnh3b3JrcykgfHwgZGVmaW5lZChfX1ZYV09SS1NfXykKKyMgZGVmaW5lIFZYV09SS1MKKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyCisjIGlmbmRlZiBXSU4zMgorIyAgZGVmaW5lIFdJTjMyCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIFVOREVSX0NFCisjIGlmbmRlZiBXSU4zMgorIyAgZGVmaW5lIFdJTjMyCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fQk9STEFORENfXworIyBpZmRlZiBfX1dJTjMyX18KKyMgIGlmbmRlZiBXSU4zMgorIyAgIGRlZmluZSBXSU4zMgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19DWUdXSU5fXworIyBpZm5kZWYgQ1lHV0lOCisjICBkZWZpbmUgQ1lHV0lOCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fU1lNQklBTjMyX18gCisjIGRlZmluZSBTWU1CSUFOCisjIHVuZGVmIFdJTjMyCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19wYWxtb3NfXykgfHwgZGVmaW5lZChQQUxNX0dDQykgfHwgZGVmaW5lZChfX1BBTE1PU19UUkFQU19fKQorIyBpZm5kZWYgUEFMTQorIyAgZGVmaW5lIFBBTE0KKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2hwdXgpCisjIGlmbmRlZiBIUF9VWAorIyAgZGVmaW5lIEhQX1VYCisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19hbHBoYSkgJiYgIWRlZmluZWQoX19WTVMpCisjIGlmbmRlZiBUUlU2NAorIyAgZGVmaW5lIFRSVTY0IAorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX01WU19fCisjIGlmbmRlZiBPUzM5MAorIyAgZGVmaW5lIE9TMzkwCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSAiY29uZmlnLmgiCisjIGlmZGVmIFdJVEhfT1BFTlNTTAorIyAgaWZuZGVmIEhBVkVfT1BFTlNTTF9TU0xfSAorIyAgIHVuZGVmIFdJVEhfT1BFTlNTTAorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbHNlCisjIGlmIGRlZmluZWQoVU5ERVJfQ0UpCisjICBkZWZpbmUgV0lUSF9MRUFOCisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgZWxpZiBkZWZpbmVkKFdJTjMyKQorIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfU1lTX1RJTUVCX0gKKyMgIGRlZmluZSBIQVZFX0ZUSU1FCisjICBkZWZpbmUgSEFWRV9XQ1RPTUIKKyMgIGRlZmluZSBIQVZFX01CVE9XQworIyAgZGVmaW5lIFNPQVBfTE9OR19GT1JNQVQgIiVJNjRkIgorIyAgZGVmaW5lIFNPQVBfVUxPTkdfRk9STUFUICIlSTY0dSIKKyMgZWxpZiBkZWZpbmVkKENZR1dJTikKKyMgIGRlZmluZSBIQVZFX1NUUlJDSFIKKyMgIGRlZmluZSBIQVZFX1NUUlRPRAorIyAgZGVmaW5lIEhBVkVfU1NDQU5GCisjICBkZWZpbmUgSEFWRV9TVFJUT0wKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUwKKyMgIGRlZmluZSBIQVZFX1NZU19USU1FQl9ICisjICBkZWZpbmUgSEFWRV9GVElNRQorIyAgZGVmaW5lIEhBVkVfUkFORF9SCisjICBkZWZpbmUgSEFWRV9HTVRJTUVfUgorIyAgZGVmaW5lIEhBVkVfTE9DQUxUSU1FX1IKKyMgIGRlZmluZSBIQVZFX1dDVE9NQgorIyAgZGVmaW5lIEhBVkVfTUJUT1dDCisjIGVsaWYgZGVmaW5lZChfX0FQUExFX18pCisjICBkZWZpbmUgSEFWRV9TVFJSQ0hSCisjICBkZWZpbmUgSEFWRV9TVFJUT0QKKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyAgZGVmaW5lIEhBVkVfU1RSVE9MCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMCisjICBkZWZpbmUgSEFWRV9SQU5EX1IKKyMgIGRlZmluZSBIQVZFX0dNVElNRV9SCisjICBkZWZpbmUgSEFWRV9MT0NBTFRJTUVfUgorIyAgZGVmaW5lIEhBVkVfVElNRUdNCisjICBkZWZpbmUgSEFWRV9XQ1RPTUIKKyMgIGRlZmluZSBIQVZFX01CVE9XQworIyBlbGlmIGRlZmluZWQoX0FJWFZFUlNJT05fNDMxKQorIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfU1lTX1RJTUVCX0gKKyMgIGRlZmluZSBIQVZFX0ZUSU1FCisjICBkZWZpbmUgSEFWRV9SQU5EX1IKKyMgIGRlZmluZSBIQVZFX0dNVElNRV9SCisjICBkZWZpbmUgSEFWRV9MT0NBTFRJTUVfUgorIyAgZGVmaW5lIEhBVkVfV0NUT01CCisjICBkZWZpbmUgSEFWRV9NQlRPV0MKKyMgZWxpZiBkZWZpbmVkKEhQX1VYKQorIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfU1lTX1RJTUVCX0gKKyMgIGRlZmluZSBIQVZFX0ZUSU1FCisjICBkZWZpbmUgSEFWRV9SQU5EX1IKKyMgIGRlZmluZSBIQVZFX0dNVElNRV9SCisjICBkZWZpbmUgSEFWRV9MT0NBTFRJTUVfUgorIyAgZGVmaW5lIEhBVkVfV0NUT01CCisjICBkZWZpbmUgSEFWRV9NQlRPV0MKKyMgZWxpZiBkZWZpbmVkKEZSRUVCU0QpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCisjICBkZWZpbmUgSEFWRV9TVFJSQ0hSCisjICBkZWZpbmUgSEFWRV9TVFJUT0QKKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyAgZGVmaW5lIEhBVkVfU1RSVE9MCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMCisjICBkZWZpbmUgSEFWRV9TVFJUT0xMCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMTAorIyAgZGVmaW5lIEhBVkVfR0VUVElNRU9GREFZCisjICBkZWZpbmUgSEFWRV9SQU5EX1IKKyMgIGRlZmluZSBIQVZFX0dNVElNRV9SCisjICBkZWZpbmUgSEFWRV9MT0NBTFRJTUVfUgorIyAgZGVmaW5lIEhBVkVfV0NUT01CCisjICBkZWZpbmUgSEFWRV9NQlRPV0MKKyMgIGRlZmluZSBTT0FQX0xPTkdfRk9STUFUICIlcWQiCisjICBkZWZpbmUgU09BUF9VTE9OR19GT1JNQVQgIiVxdSIKKyMgZWxpZiBkZWZpbmVkKF9fVk1TKQorIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfU1lTX1RJTUVCX0gKKyMgIGRlZmluZSBIQVZFX0ZUSU1FCisjICBkZWZpbmUgSEFWRV9SQU5EX1IKKyMgIGRlZmluZSBIQVZFX0dNVElNRV9SCisjICBkZWZpbmUgSEFWRV9MT0NBTFRJTUVfUgorIyAgZGVmaW5lIEhBVkVfV0NUT01CCisjICBkZWZpbmUgSEFWRV9NQlRPV0MKKyMgZWxpZiBkZWZpbmVkKF9fR0xJQkNfXykgfHwgZGVmaW5lZChfX0dOVV9fKQorIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9MTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTEwKKyMgIGRlZmluZSBIQVZFX1NZU19USU1FQl9ICisjICBkZWZpbmUgSEFWRV9GVElNRQorIyAgZGVmaW5lIEhBVkVfUkFORF9SCisjICBkZWZpbmUgSEFWRV9HTVRJTUVfUgorIyAgZGVmaW5lIEhBVkVfTE9DQUxUSU1FX1IKKyMgIGRlZmluZSBIQVZFX1RJTUVHTQorIyAgZGVmaW5lIEhBVkVfV0NUT01CCisjICBkZWZpbmUgSEFWRV9NQlRPV0MKKyMgIGRlZmluZSBIQVZFX0lTTkFOCisjIGVsaWYgZGVmaW5lZChUUlU2NCkKKyMgIGRlZmluZSBIQVZFX1NUUlJDSFIKKyMgIGRlZmluZSBIQVZFX1NUUlRPRAorIyAgZGVmaW5lIEhBVkVfU1NDQU5GCisjICBkZWZpbmUgSEFWRV9TVFJUT0wKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUwKKyMgIGRlZmluZSBIQVZFX1NUUlRPTEwKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUxMCisjICBkZWZpbmUgSEFWRV9HRVRUSU1FT0ZEQVkKKyMgIGRlZmluZSBIQVZFX1NZU19USU1FQl9ICisjICBkZWZpbmUgSEFWRV9SQU5EX1IKKyMgIGRlZmluZSBIQVZFX0dNVElNRV9SCisjICBkZWZpbmUgSEFWRV9MT0NBTFRJTUVfUgorIyAgZGVmaW5lIF9fVVNFX1NURF9JT1NUUkVBTQorIyAgZGVmaW5lIEhBVkVfV0NUT01CCisjICBkZWZpbmUgSEFWRV9NQlRPV0MKKyMgIGRlZmluZSBTT0FQX0xPTkdfRk9STUFUICIlbGQiCisjICBkZWZpbmUgU09BUF9VTE9OR19GT1JNQVQgIiVsdSIKKyMgZWxpZiBkZWZpbmVkKE1BQ19DQVJCT04pCisjICBkZWZpbmUgV0lUSF9OT0lPCisjICBkZWZpbmUgSEFWRV9TVFJSQ0hSCisjICBkZWZpbmUgSEFWRV9TVFJUT0QKKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyAgZGVmaW5lIEhBVkVfU1RSVE9MCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMCisjICBkZWZpbmUgSEFWRV9GVElNRQorIyAgZGVmaW5lIEhBVkVfUkFORF9SCisjICBkZWZpbmUgSEFWRV9HRVRIT1NUQllOQU1FX1IKKyMgIGRlZmluZSBIQVZFX0dNVElNRV9SCisjICBkZWZpbmUgSEFWRV9MT0NBTFRJTUVfUgorIyAgZGVmaW5lIEhBVkVfV0NUT01CCisjICBkZWZpbmUgSEFWRV9NQlRPV0MKKyMgZWxpZiBkZWZpbmVkKFBBTE0pCisjICBkZWZpbmUgV0lUSF9MRUFOCisjICBkZWZpbmUgSEFWRV9TVFJUT0QgICAvKiBzdHJ0b2QoKSBpcyBkZWZpbmVkIGluIHBhbG1GdW5jdGlvbnMuaCAqLworIyAgaW5jbHVkZSA8c3RkbGliLmg+CS8qIE5lZWRzIHRvIGJlIGluY2x1ZGVkIGJlZm9yZSB1bml4IGhlYWRlcnMgKi8KKyMgIGluY2x1ZGUgPHN5c190eXBlcy5oPgorIyAgZGVmaW5lIElHTk9SRV9TVERJT19TVFVCUworIyAgaW5jbHVkZSA8U3RkSU9QYWxtLmg+CisjICBkZWZpbmUgT19OT05CTE9DSyBGTk9OQklPCisjICBpbmNsdWRlIDxzeXNfc29ja2V0Lmg+CisjICBpbmNsdWRlICJwYWxtRnVuY3Rpb25zLmgiCisjIGVsaWYgZGVmaW5lZChTWU1CSUFOKQorIyAgZGVmaW5lIFdJVEhfTEVBTgorIyAgZGVmaW5lIFdJVEhfTk9OQU1FU1BBQ0VTCisjICBkZWZpbmUgSEFWRV9TVFJUT0QJLyogdXNlIFNUUlRPRCBzaW5jZSBzc2NhbmYgZG9lc24ndCBzZWVtIHRvIHdvcmsgKi8KKyMgIGluY2x1ZGUgPGUzMmRlZi5oPgorIyAgaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjIGVsaWYgZGVmaW5lZChWWFdPUktTKQorIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfUEdNVElNRV9SCisjICBkZWZpbmUgSEFWRV9QTE9DQUxUSU1FX1IKKyMgIGRlZmluZSBIQVZFX01LVElNRQorIyBlbGlmIGRlZmluZWQoT1MzOTApCisjICBkZWZpbmUgSEFWRV9TVFJSQ0hSCisjICBkZWZpbmUgSEFWRV9TVFJUT0QKKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyAgZGVmaW5lIEhBVkVfU1RSVE9MCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMCisjICBkZWZpbmUgSEFWRV9TWVNfVElNRUJfSAorIyAgZGVmaW5lIEhBVkVfRlRJTUUKKyMgIGRlZmluZSBIQVZFX1JBTkRfUgorIyAgZGVmaW5lIEhBVkVfR01USU1FX1IKKyMgIGRlZmluZSBIQVZFX0xPQ0FMVElNRV9SCisjICBkZWZpbmUgSEFWRV9XQ1RPTUIKKyMgIGRlZmluZSBIQVZFX01CVE9XQworIyBlbGlmIGRlZmluZWQoQVM0MDApCisjICBkZWZpbmUgSEFWRV9TVFJSQ0hSCisjICBkZWZpbmUgSEFWRV9TVFJUT0QKKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyAgZGVmaW5lIEhBVkVfU1RSVE9MCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMCisjICBkZWZpbmUgSEFWRV9TWVNfVElNRUJfSAorIyAgZGVmaW5lIEhBVkVfRlRJTUUKKyMgIGRlZmluZSBIQVZFX1JBTkRfUgorIyAgZGVmaW5lIEhBVkVfR01USU1FX1IKKyMgIGRlZmluZSBIQVZFX0xPQ0FMVElNRV9SCisjICBkZWZpbmUgSEFWRV9XQ1RPTUIKKyMgIGRlZmluZSBIQVZFX01CVE9XQworIyBlbHNlCisvKiBEZWZhdWx0IGFzdW1wdGlvbnMgb24gc3VwcG9ydGVkIGZ1bmN0aW9ucyAqLworIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfU1lTX1RJTUVCX0gKKyMgIGRlZmluZSBIQVZFX0ZUSU1FCisjICBkZWZpbmUgSEFWRV9SQU5EX1IKKyMgIGRlZmluZSBIQVZFX0dFVEhPU1RCWU5BTUVfUgorIyAgZGVmaW5lIEhBVkVfR01USU1FX1IKKyMgIGRlZmluZSBIQVZFX0xPQ0FMVElNRV9SCisjICBkZWZpbmUgSEFWRV9XQ1RPTUIKKyMgIGRlZmluZSBIQVZFX01CVE9XQworIyBlbmRpZgorI2VuZGlmCisKKy8qIFFOWCBkb2VzIG5vdCBoYXZlIGEgd29ya2luZyB2ZXJzaW9uIG9mIHN0cnRvZiAqLworI2lmIGRlZmluZWQoX19RTlhfXykgfHwgZGVmaW5lZChRTlgpCisjIHVuZGVmIEhBVkVfU1RSVE9GCisjZW5kaWYKKworI2lmbmRlZiBTT0FQX0xPTkdfRk9STUFUCisjIGRlZmluZSBTT0FQX0xPTkdfRk9STUFUICIlbGxkIgkvKiBwcmludGYgZm9ybWF0IGZvciA2NCBiaXQgaW50cyAqLworI2VuZGlmCisKKyNpZm5kZWYgU09BUF9VTE9OR19GT1JNQVQKKyMgZGVmaW5lIFNPQVBfVUxPTkdfRk9STUFUICIlbGx1IgkvKiBwcmludGYgZm9ybWF0IGZvciB1bnNpZ25lZCA2NCBiaXQgaW50cyAqLworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9OT1NURExJQgorIyBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgaWZuZGVmIFBBTE0KKyMgIGluY2x1ZGUgPHN0ZGlvLmg+CisjICBpbmNsdWRlIDxzdHJpbmcuaD4KKyMgZW5kaWYKKyMgaW5jbHVkZSA8Y3R5cGUuaD4KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpICYmICFkZWZpbmVkKFdJVEhfTEVBTikKKyMgaW5jbHVkZSA8c3RyaW5nPgorIyBpbmNsdWRlIDxpb3N0cmVhbT4KKyNlbmRpZgorCisjaWZkZWYgV0lUSF9OT0hUVFAKKyMgaWZuZGVmIFdJVEhfTk9JTworIyAgZGVmaW5lIFdJVEhfTk9JTworIyAgdW5kZWYgV0lUSF9DT09LSUVTCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBVTkRFUl9DRQorIyBpZm5kZWYgUEFMTQorIyAgaWZuZGVmIFdJVEhfTk9JTworIyAgIGluY2x1ZGUgPGVycm5vLmg+CisjICAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjICBlbmRpZgorIyAgaWZuZGVmIFdJVEhfTEVBTgorIyAgIGlmZGVmIEhBVkVfU1lTX1RJTUVCX0gKKyMgICAgaW5jbHVkZSA8c3lzL3RpbWViLmg+CQkvKiBmb3IgZnRpbWUoKSAqLworIyAgIGVuZGlmCisjICAgaW5jbHVkZSA8dGltZS5oPgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgT1BFTlNFUlZFUgorIyBpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjIGluY2x1ZGUgPHN5cy9zdHJlYW0uaD4KKyMgaW5jbHVkZSA8c3lzL3Byb3Rvc3cuaD4KKyAgZXh0ZXJuIGludCBoX2Vycm5vOworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9OT0lPCisjIGlmbmRlZiBXSU4zMgorIyAgaWZuZGVmIFBBTE0KKyMgICBpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjICAgaWZkZWYgVlhXT1JLUworIyAgICBpbmNsdWRlIDxzb2NrTGliLmg+CisjICAgIGluY2x1ZGUgPHNlbGVjdExpYi5oPgorIyAgIGVuZGlmCisjICAgaWZuZGVmIFZYV09SS1MKKyMgICAgaWZuZGVmIFNZTUJJQU4KKyMgICAgIGluY2x1ZGUgPHN0cmluZ3MuaD4KKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgIGlmZGVmIFNVTl9PUworIyAgICBpbmNsdWRlIDxzeXMvc3RyZWFtLmg+CQkvKiBTVU4gKi8KKyMgICAgaW5jbHVkZSA8c3lzL3NvY2tldHZhci5oPgkJLyogU1VOIDwgMi44ICg/KSAqLworIyAgIGVuZGlmCisjICAgaWZkZWYgVlhXT1JLUworIyAgICBpZmRlZiBfV1JTX0tFUk5FTAorIyAgICAgaW5jbHVkZSA8c3lzL3RpbWVzLmg+CisjICAgIGVuZGlmCisjICAgZWxzZQorIyAgICBpbmNsdWRlIDxzeXMvdGltZS5oPgorIyAgIGVuZGlmCisjICAgaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorIyAgIGlmZGVmIE9TMzkwCisjICAgIGluY2x1ZGUgPG5ldGluZXQvdGNwX3Zhci5oPgorIyAgIGVsc2UKKyMgICAgaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4gICAgICAgICAgLyogVENQX05PREVMQVkgKi8KKyMgICBlbmRpZgorIyAgIGluY2x1ZGUgPGFycGEvaW5ldC5oPgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgV0lUSF9GQVNUQ0dJCisjIGluY2x1ZGUgPGZjZ2lfc3RkaW8uaD4KKyNlbmRpZgorCisjaWZkZWYgV0lUSF9PUEVOU1NMCisjIGRlZmluZSBPUEVOU1NMX05PX0tSQjUKKyMgaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KKyMgaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyMgaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjIGlmbmRlZiBBTExPV19PTERfVkVSU0lPTlMKKyMgIGlmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgMHgwMDkwNTEwMEwpCisjICAgZXJyb3IgIk11c3QgdXNlIE9wZW5TU0wgMC45LjYgb3IgbGF0ZXIiCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBXSVRIX0daSVAKKyMgaWZuZGVmIFdJVEhfWkxJQgorIyAgZGVmaW5lIFdJVEhfWkxJQgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBXSVRIX0NBU0VJTlNFTlNJVElWRVRBR1MKKyMgZGVmaW5lIFNPQVBfU1RSQ01QIHNvYXBfdGFnX2NtcAkvKiBjYXNlIGluc2Vuc2l0dmUgWE1MIGVsZW1lbnQvYXR0cmlidXRlIG5hbWVzICovCisjZWxzZQorIyBkZWZpbmUgU09BUF9TVFJDTVAgc3RyY21wCQkvKiBjYXNlIHNlbnNpdGl2ZSBYTUwgZWxlbWVudC9hdHRyaWJ1dGUgbmFtZXMgKi8KKyNlbmRpZgorCisjaWZkZWYgV0lUSF9aTElCCisjIGluY2x1ZGUgPHpsaWIuaD4KKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9TVERMSUIKKyMgaWZuZGVmIFBBTE0KKyMgIGluY2x1ZGUgPG1hdGguaD4JLyogZm9yIGlzbmFuKCkgKi8KKyMgZW5kaWYKKyNlbmRpZgorCisvKiAjZGVmaW5lIERFQlVHICovIC8qIFVuY29tbWVudCB0byBkZWJ1ZyBzZW5kaW5nIChpbiBmaWxlIFNFTlQubG9nKSByZWNlaXZpbmcgKGluIGZpbGUgUkVDVi5sb2cpIGFuZCBtZXNzYWdlcyAoaW4gZmlsZSBURVNULmxvZykgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWZkZWYgV0lOMzIKKyMgaWZuZGVmIFVOREVSX0NFCisjICBpbmNsdWRlIDxpby5oPgorIyAgaW5jbHVkZSA8ZmNudGwuaD4KKyMgZW5kaWYKKyMgaW5jbHVkZSA8d2luc29jay5oPgorLyogIyBpbmNsdWRlIDx3aW5zb2NrMi5oPiAqLyAvKiBBbHRlcm5hdGl2ZTogdXNlIHdpbnNvY2syIChub3QgYXZhaWxhYmxlIHdpdGggZVZDKSAqLworIyBpZmRlZiBXSVRIX0lQVjYKKyMgIGluY2x1ZGUgPHdzMnRjcGlwLmg+CisjICBpbmNsdWRlIDx3c3BpYXBpLmg+CisjIGVuZGlmCisjZWxzZQorIyBpZmRlZiBWWFdPUktTCisjICBpbmNsdWRlIDxob3N0TGliLmg+CisjICBpbmNsdWRlIDxpb2N0bC5oPgorIyAgaW5jbHVkZSA8aW9MaWIuaD4KKyMgZW5kaWYKKyMgaWZuZGVmIFdJVEhfTk9JTworIyAgaWZuZGVmIFBBTE0KKyMgICBpbmNsdWRlIDxuZXRkYi5oPgorIyAgIGluY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyMgICBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgICBpbmNsdWRlIDxmY250bC5oPgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBQb3J0YWJpbGl0eTogZGVmaW5lIFNPQVBfU09DS0xFTl9UICovCisjaWYgZGVmaW5lZChfQUlYKQorIyBkZWZpbmUgU09BUF9TT0NLTEVOX1Qgc29ja2xlbl90CisjZWxpZiBkZWZpbmVkKFNPQ0tMRU5fVCkKKyMgZGVmaW5lIFNPQVBfU09DS0xFTl9UIFNPQ0tMRU5fVAorI2VsaWYgZGVmaW5lZChfX3NvY2tsZW5fdF9kZWZpbmVkKSB8fCBkZWZpbmVkKF9TT0NLTEVOX1QpIHx8IGRlZmluZWQoQ1lHV0lOKSB8fCBkZWZpbmVkKEZSRUVCU0QpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19RTlhfXykgfHwgZGVmaW5lZChRTlgpCisjIGRlZmluZSBTT0FQX1NPQ0tMRU5fVCBzb2NrbGVuX3QKKyNlbGlmIGRlZmluZWQoSVJJWCkgfHwgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfX0FQUExFX18pIHx8IGRlZmluZWQoSFBfVVgpIHx8IGRlZmluZWQoU1VOX09TKSB8fCBkZWZpbmVkKE9QRU5TRVJWRVIpIHx8IGRlZmluZWQoVFJVNjQpIHx8IGRlZmluZWQoVlhXT1JLUykKKyMgZGVmaW5lIFNPQVBfU09DS0xFTl9UIGludAorI2Vsc2UKKyMgZGVmaW5lIFNPQVBfU09DS0xFTl9UIHNpemVfdAorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9TT0NLRVQKKyMgaWZkZWYgV0lOMzIKKyMgIGRlZmluZSBTT0FQX1NPQ0tFVCBTT0NLRVQKKyMgZWxzZQorIyAgZGVmaW5lIFNPQVBfU09DS0VUIGludAorIyAgZGVmaW5lIGNsb3Nlc29ja2V0KG4pIGNsb3NlKG4pCisjIGVuZGlmCisjZW5kaWYKKworI2RlZmluZSBTT0FQX0lOVkFMSURfU09DS0VUICgtMSkKKyNkZWZpbmUgc29hcF92YWxpZF9zb2NrZXQobikgKChuKSAhPSBTT0FQX0lOVkFMSURfU09DS0VUKQorCisjaWYgZGVmaW5lZChTWU1CSUFOKQorIyBkZWZpbmUgTE9ORzY0IGxvbmcKKyMgZGVmaW5lIFVMT05HNjQgdW5zaWduZWQgTE9ORzY0CisjZWxpZiAhZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfX0dMSUJDX18pIHx8IGRlZmluZWQoX19HTlVfXykKKyMgaWZuZGVmIExPTkc2NAorIyAgZGVmaW5lIExPTkc2NCBsb25nIGxvbmcKKyMgIGRlZmluZSBVTE9ORzY0IHVuc2lnbmVkIExPTkc2NAorIyBlbmRpZgorI2VsaWYgZGVmaW5lZChVTkRFUl9DRSkKKyMgZGVmaW5lIExPTkc2NCBfX2ludDY0CisjIGRlZmluZSBVTE9ORzY0IHVuc2lnbmVkIExPTkc2NAorI2VsaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pCisjIGRlZmluZSBMT05HNjQgX19pbnQ2NAorIyBkZWZpbmUgVUxPTkc2NCB1bnNpZ25lZCBMT05HNjQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChXSU4zMikKKyMgZGVmaW5lIHNvYXBfaW50MzIgX19pbnQzMgorI2VsaWYgZGVmaW5lZChTWU1CSUFOKQorIyBkZWZpbmUgc29hcF9pbnQzMiBsb25nCisjZWxpZiBkZWZpbmVkKFBBTE0pCisjIGRlZmluZSBzb2FwX2ludDMyIEludDMyCisjZWxzZQorIyBkZWZpbmUgc29hcF9pbnQzMiBpbnQzMl90CisjZW5kaWYKKworI2lmZGVmIFdJTjMyCisjIGRlZmluZSBTT0FQX0VSQU5HRSBFUkFOR0UKKyMgZGVmaW5lIFNPQVBfRUlOVFIgV1NBRUlOVFIKKyMgZGVmaW5lIFNPQVBfRUFHQUlOIFdTQUVXT1VMREJMT0NLCisjIGRlZmluZSBTT0FQX0VXT1VMREJMT0NLIFdTQUVXT1VMREJMT0NLCisjIGRlZmluZSBTT0FQX0VJTlBST0dSRVNTIFdTQUVJTlBST0dSRVNTCisjZWxzZQorIyBkZWZpbmUgU09BUF9FUkFOR0UgRVJBTkdFCisjIGRlZmluZSBTT0FQX0VJTlRSIEVJTlRSCisjIGRlZmluZSBTT0FQX0VBR0FJTiBFQUdBSU4KKyMgaWZkZWYgU1lNQklBTgorIyAgZGVmaW5lIFNPQVBfRVdPVUxEQkxPQ0sgOTg5OAorIyAgZGVmaW5lIFNPQVBfRUlOUFJPR1JFU1MgOTg5OQorIyBlbHNlCisjICBkZWZpbmUgU09BUF9FV09VTERCTE9DSyBFV09VTERCTE9DSworIyAgZGVmaW5lIFNPQVBfRUlOUFJPR1JFU1MgRUlOUFJPR1JFU1MKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgV0lOMzIKKyMgaWZkZWYgVU5ERVJfQ0UKKyMgIGRlZmluZSBzb2FwX2Vycm5vIEdldExhc3RFcnJvcigpCisjICBkZWZpbmUgc29hcF9zb2NrZXRfZXJybm8gR2V0TGFzdEVycm9yKCkKKyMgIGRlZmluZSBzb2FwX3Jlc2V0X2Vycm5vIFNldExhc3RFcnJvcigwKQorIyBlbHNlCisjICBkZWZpbmUgc29hcF9lcnJubyBHZXRMYXN0RXJyb3IoKQorIyAgZGVmaW5lIHNvYXBfc29ja2V0X2Vycm5vIFdTQUdldExhc3RFcnJvcigpCisjICBkZWZpbmUgc29hcF9yZXNldF9lcnJubyBTZXRMYXN0RXJyb3IoMCkKKyMgZW5kaWYKKyNlbHNlCisjIGlmbmRlZiBXSVRIX05PSU8KKyMgIGRlZmluZSBzb2FwX2Vycm5vIGVycm5vCisjICBkZWZpbmUgc29hcF9zb2NrZXRfZXJybm8gZXJybm8KKyMgIGRlZmluZSBzb2FwX3Jlc2V0X2Vycm5vIChlcnJubyA9IDApCisjIGVsc2UKKyMgIGRlZmluZSBzb2FwX2Vycm5vIDAKKyMgIGRlZmluZSBzb2FwX3NvY2tldF9lcnJubyAwCisjICBkZWZpbmUgc29hcF9yZXNldF9lcnJubworIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9CVUZMRU4KKyMgaWZkZWYgV0lUSF9VRFAKKyMgIGRlZmluZSBTT0FQX0JVRkxFTiAoNjU1MzYpIC8qIG1heCBVRFAgcGFja2V0IHNpemUgKi8KKyMgZWxzZQorIyAgaWZuZGVmIFdJVEhfTEVBTgorIyAgIGRlZmluZSBTT0FQX0JVRkxFTiAoNjU1MzYpIC8qIGJ1ZmZlciBsZW5ndGggZm9yIHNvY2tldCBwYWNrZXRzLCBhbHNvIHVzZWQgYnkgZ2V0aG9zdGJ5bmFtZV9yIHNvIGRvbid0IG1ha2UgdGhpcyB0b28gc21hbGwgKi8KKyMgIGVsc2UKKyMgICBkZWZpbmUgU09BUF9CVUZMRU4gICgyMDQ4KQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBTT0FQX0xBQkxFTgorIyBkZWZpbmUgU09BUF9MQUJMRU4gICAgICg2NCkgLyogaW5pdGlhbCBsb29rLWFzaWRlIGJ1ZmZlciBsZW5ndGggKi8KKyNlbmRpZgorI2lmbmRlZiBTT0FQX1BUUkJMSworIyBkZWZpbmUgU09BUF9QVFJCTEsgICAgICgzMikgLyogYmxvY2sgYWxsb2NhdGlvbiBmb3IgcG9pbnRlciBoYXNoIHRhYmxlIGNoYWlucyAqLworI2VuZGlmCisjaWZuZGVmIFNPQVBfUFRSSEFTSAorIyBpZm5kZWYgV0lUSF9MRUFOCisjICBkZWZpbmUgU09BUF9QVFJIQVNIICgxMDI0KSAvKiBzaXplIG9mIHBvaW50ZXIgYW5hbHlzaXMgaGFzaCB0YWJsZSAobXVzdCBiZSBwb3dlciBvZiAyKSAqLworIyBlbHNlCisjICBkZWZpbmUgU09BUF9QVFJIQVNIICAgKDMyKQorIyBlbmRpZgorI2VuZGlmCisjaWZuZGVmIFNPQVBfSURIQVNICisjIGlmbmRlZiBXSVRIX0xFQU4KKyMgIGRlZmluZSBTT0FQX0lESEFTSCAgKDE5OTkpIC8qIHByaW1lIHNpemUgb2YgaGFzaCB0YWJsZSBmb3IgcGFyc2VkIGlkL3JlZiAqLworIyBlbHNlCisjICBkZWZpbmUgU09BUF9JREhBU0ggICAgKDE5KSAvKiAxOSwgMTk5ICovCisjIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgU09BUF9CTEtMRU4KKyMgaWZuZGVmIFdJVEhfTEVBTgorIyAgZGVmaW5lIFNPQVBfQkxLTEVOICAgKDI1NikgLyogc2l6ZSBvZiBibG9ja3MgdG8gY29sbGVjdCBsb25nIHN0cmluZ3MgYW5kIFhNTCBhdHRyaWJ1dGVzICovCisjIGVsc2UKKyMgIGRlZmluZSBTT0FQX0JMS0xFTiAgICAoMzIpCisjIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgU09BUF9UQUdMRU4KKyMgaWZuZGVmIFdJVEhfTEVBTgorIyAgZGVmaW5lIFNPQVBfVEFHTEVOICAoMTAyNCkgLyogbWF4aW11bSBsZW5ndGggb2YgWE1MIGVsZW1lbnQgdGFnL2F0dHJpYnV0ZSBuYW1lIG9yIGhvc3QvcGF0aCBuYW1lICsgMSAqLworIyBlbHNlCisjICBkZWZpbmUgU09BUF9UQUdMRU4gICAgKDY0KQorIyBlbmRpZgorI2VuZGlmCisjaWZuZGVmIFNPQVBfSERSTEVOCisjIGlmbmRlZiBXSVRIX0xFQU4KKyMgIGRlZmluZSBTT0FQX0hEUkxFTiAgKDgxOTIpIC8qIG1heGltdW0gbGVuZ3RoIG9mIEhUVFAgaGVhZGVyIGxpbmUgKG11c3QgYmUgPjQwOTYgdG8gcmVhZCBjb29raWVzKSAqLworIyBlbHNlCisjICBkZWZpbmUgU09BUF9IRFJMRU4gICgxMDI0KQorIyBlbmRpZgorI2VuZGlmCisjaWZuZGVmIFNPQVBfTUFYRElNUworIyBpZm5kZWYgV0lUSF9MRUFOCisjICBkZWZpbmUgU09BUF9NQVhESU1TCSAoMTYpIC8qIG1heGltdW0gYXJyYXkgZGltZW5zaW9ucyAoYXJyYXkgbmVzdGluZ3MpIG11c3QgYmUgbGVzcyB0aGFuIDY0IHRvIHByb3RlY3Qgc29hcC0+dG1wYnVmICovCisjIGVsc2UKKyMgIGRlZmluZSBTT0FQX01BWERJTVMJICAoNCkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfTUFYTE9HUworIyBkZWZpbmUgU09BUF9NQVhMT0dTCSAgKDMpIC8qIG1heCBudW1iZXIgb2YgZGVidWcgbG9ncyBwZXIgc3RydWN0IHNvYXAgZW52aXJvbm1lbnQgKi8KKyMgZGVmaW5lIFNPQVBfSU5ERVhfUkVDViAgKDApCisjIGRlZmluZSBTT0FQX0lOREVYX1NFTlQgICgxKQorIyBkZWZpbmUgU09BUF9JTkRFWF9URVNUICAoMikKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfTUFYS0VFUEFMSVZFCisjIGRlZmluZSBTT0FQX01BWEtFRVBBTElWRSAoMTAwKSAvKiBtYXggaXRlcmF0aW9ucyB0byBrZWVwIHNlcnZlciBjb25uZWN0aW9uIGFsaXZlICovCisjZW5kaWYKKworI2lmbmRlZiBTT0FQX01BWEFSUkFZU0laRQorIyBkZWZpbmUgU09BUF9NQVhBUlJBWVNJWkUgKDEwMDAwMCkgLyogInRydXN0ZWQiIG1heCBzaXplIG9mIGluYm91bmQgU09BUCBhcnJheSBmb3IgY29tcG91bmQgYXJyYXkgYWxsb2NhdGlvbiAqLworI2VuZGlmCisKKyNpZmRlZiBWWFdPUktTCisjIGlmZGVmIF9fSU5DbWF0aGggCisjICBpbmNsdWRlIDxwcml2YXRlL21hdGhQLmg+CisjICBpZm5kZWYgSEFWRV9JU05BTgorIyAgIGRlZmluZSBIQVZFX0lTTkFOCisjICBlbmRpZgorIyAgZGVmaW5lIHNvYXBfaXNuYW4obnVtKSBpc05hbihudW0pCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIFdJTjMyIAorIyBpbmNsdWRlIDxmbG9hdC5oPgorIyBpZm5kZWYgSEFWRV9JU05BTgorIyAgZGVmaW5lIEhBVkVfSVNOQU4KKyMgZW5kaWYKKyMgZGVmaW5lIHNvYXBfaXNuYW4obnVtKSBfaXNuYW4obnVtKQorI2VuZGlmCisKKyNpZmRlZiBTVU5fT1MKKyMgZGVmaW5lIHNvYXBfaXNuYW4obikgaXNuYW4obikKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoSEFWRV9JU05BTikgJiYgKGRlZmluZWQoX01BVEhfSCkgfHwgZGVmaW5lZChfTUFUSF9JTkNMVURFRCkpCisjIGRlZmluZSBIQVZFX0lTTkFOCisjZW5kaWYKKworI2lmbmRlZiBzb2FwX2lzbmFuCisjIGlmZGVmIEhBVkVfSVNOQU4KKyMgIGRlZmluZSBzb2FwX2lzbmFuKG4pIGlzbmFuKG4pCisjIGVsc2UKKyMgIGRlZmluZSBzb2FwX2lzbmFuKF8pICgwKQorIyBlbmRpZgorI2VuZGlmCisKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc29hcF9kb3VibGVfbmFuIHsgdW5zaWduZWQgaW50IG4xLCBuMjsgfSBzb2FwX2RvdWJsZV9uYW47CisKKyNpZmRlZiBWWFdPUktTCisjIGlmbmRlZiBGTFRfTUFYCisjICBkZWZpbmUgRkxUX01BWCBfQVJDSF9GTFRfTUFYCisjIGVuZGlmCisjIGlmbmRlZiBEQkxfTUFYCisjICBkZWZpbmUgREJMX01BWCBfQVJDSF9EQkxfTUFYCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBGTFRfTkFOCisjIGlmZGVmIEhBVkVfSVNOQU4KKyMgIGRlZmluZSBGTFRfTkFOICgqKGZsb2F0Kikodm9pZCopJnNvYXBfZG91YmxlX25hbikKKyMgZWxzZQorIyAgZGVmaW5lIEZMVF9OQU4gKDAuMCkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEZMVF9QSU5GVFkKKyMgaWYgZGVmaW5lZChGTFRfTUFYKQorIyAgZGVmaW5lIEZMVF9QSU5GVFkgRkxUX01BWAorIyBlbGlmIGRlZmluZWQoSFVHRV9WQUxGKQorIyAgZGVmaW5lIEZMVF9QSU5GVFkgKGZsb2F0KUhVR0VfVkFMRgorIyBlbGlmIGRlZmluZWQoSFVHRV9WQUwpCisjICBkZWZpbmUgRkxUX1BJTkZUWSAoZmxvYXQpSFVHRV9WQUwKKyMgZWxpZiBkZWZpbmVkKEZMT0FUX01BWCkKKyMgIGRlZmluZSBGTFRfUElORlRZIEZMT0FUX01BWAorIyBlbHNlCisjICBkZWZpbmUgRkxUX1BJTkZUWSAoMy40MDI4MjM0N2UrMzhGKQorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRkxUX05JTkZUWQorIyBkZWZpbmUgRkxUX05JTkZUWSAoLUZMVF9QSU5GVFkpCisjZW5kaWYKKworI2lmbmRlZiBEQkxfTkFOCisjIGlmZGVmIEhBVkVfSVNOQU4KKyMgIGRlZmluZSBEQkxfTkFOICgqKGRvdWJsZSopKHZvaWQqKSZzb2FwX2RvdWJsZV9uYW4pCisjIGVsc2UKKyMgIGRlZmluZSBEQkxfTkFOICgwLjApCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBEQkxfUElORlRZCisjIGlmIGRlZmluZWQoREJMX01BWCkKKyMgIGRlZmluZSBEQkxfUElORlRZIERCTF9NQVgKKyMgZWxpZiBkZWZpbmVkKEhVR0VfVkFMRikKKyMgIGRlZmluZSBEQkxfUElORlRZIChkb3VibGUpSFVHRV9WQUxGCisjIGVsaWYgZGVmaW5lZChIVUdFX1ZBTCkKKyMgIGRlZmluZSBEQkxfUElORlRZIChkb3VibGUpSFVHRV9WQUwKKyMgZWxpZiBkZWZpbmVkKERPVUJMRV9NQVgpCisjICBkZWZpbmUgREJMX1BJTkZUWSBET1VCTEVfTUFYCisjIGVsc2UKKyMgIGRlZmluZSBEQkxfUElORlRZICgxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOCkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIERCTF9OSU5GVFkKKyMgZGVmaW5lIERCTF9OSU5GVFkgKC1EQkxfUElORlRZKQorI2VuZGlmCisKKyNkZWZpbmUgc29hcF9pc3BpbmZkKG4pICgobikgPj0gREJMX1BJTkZUWSkKKyNkZWZpbmUgc29hcF9pc3BpbmZmKG4pICgobikgPj0gRkxUX1BJTkZUWSkKKyNkZWZpbmUgc29hcF9pc25pbmZkKG4pICgobikgPD0gREJMX05JTkZUWSkKKyNkZWZpbmUgc29hcF9pc25pbmZmKG4pICgobikgPD0gRkxUX05JTkZUWSkKKworLyogZ1NPQVAgZXJyb3IgY29kZXMgKi8KKworI2RlZmluZSBTT0FQX0VPRgkJCUVPRgorI2RlZmluZSBTT0FQX0VSUgkJCUVPRgorI2RlZmluZSBTT0FQX09LCQkJCTAKKyNkZWZpbmUgU09BUF9DTElfRkFVTFQJCQkxCisjZGVmaW5lIFNPQVBfU1ZSX0ZBVUxUCQkJMgorI2RlZmluZSBTT0FQX1RBR19NSVNNQVRDSAkJMworI2RlZmluZSBTT0FQX1RZUEUJCQk0CisjZGVmaW5lIFNPQVBfU1lOVEFYX0VSUk9SCQk1CisjZGVmaW5lIFNPQVBfTk9fVEFHCQkJNgorI2RlZmluZSBTT0FQX0lPQgkJCTcKKyNkZWZpbmUgU09BUF9NVVNUVU5ERVJTVEFORAkJOAorI2RlZmluZSBTT0FQX05BTUVTUEFDRQkJCTkKKyNkZWZpbmUgU09BUF9VU0VSX0VSUk9SCQkJMTAKKyNkZWZpbmUgU09BUF9GQVRBTF9FUlJPUgkJMTEKKyNkZWZpbmUgU09BUF9GQVVMVAkJCTEyCisjZGVmaW5lIFNPQVBfTk9fTUVUSE9ECQkJMTMKKyNkZWZpbmUgU09BUF9HRVRfTUVUSE9ECQkJMTQKKyNkZWZpbmUgU09BUF9FT00JCQkxNQorI2RlZmluZSBTT0FQX05VTEwJCQkxNgorI2RlZmluZSBTT0FQX0RVUExJQ0FURV9JRAkJMTcKKyNkZWZpbmUgU09BUF9NSVNTSU5HX0lECQkJMTgKKyNkZWZpbmUgU09BUF9IUkVGCQkJMTkKKyNkZWZpbmUgU09BUF9VRFBfRVJST1IJCQkyMAorI2RlZmluZSBTT0FQX1RDUF9FUlJPUgkJCTIxCisjZGVmaW5lIFNPQVBfSFRUUF9FUlJPUgkJCTIyCisjZGVmaW5lIFNPQVBfU1NMX0VSUk9SCQkJMjMKKyNkZWZpbmUgU09BUF9aTElCX0VSUk9SCQkJMjQKKyNkZWZpbmUgU09BUF9ESU1FX0VSUk9SCQkJMjUKKyNkZWZpbmUgU09BUF9ESU1FX0hSRUYJCQkyNgorI2RlZmluZSBTT0FQX0RJTUVfTUlTTUFUQ0gJCTI3CisjZGVmaW5lIFNPQVBfRElNRV9FTkQJCQkyOAorI2RlZmluZSBTT0FQX01JTUVfRVJST1IJCQkyOQorI2RlZmluZSBTT0FQX01JTUVfSFJFRgkJCTMwCisjZGVmaW5lIFNPQVBfTUlNRV9FTkQJCQkzMQorI2RlZmluZSBTT0FQX1ZFUlNJT05NSVNNQVRDSAkJMzIKKyNkZWZpbmUgU09BUF9QTFVHSU5fRVJST1IJCTMzCisjZGVmaW5lIFNPQVBfREFUQUVOQ09ESU5HVU5LTk9XTgkzNAorI2RlZmluZSBTT0FQX1JFUVVJUkVECQkJMzUKKyNkZWZpbmUgU09BUF9QUk9ISUJJVEVECQkJMzYKKyNkZWZpbmUgU09BUF9PQ0NVUlMJCQkzNworI2RlZmluZSBTT0FQX0xFTkdUSAkJCTM4CisKKyNkZWZpbmUgc29hcF94bWxfZXJyb3JfY2hlY2soZSkgKChlKSA9PSBTT0FQX1RBR19NSVNNQVRDSCB8fCAoZSkgPT0gU09BUF9UQUdfRU5EIHx8IChlKSA9PSBTT0FQX1NZTlRBWF9FUlJPUiB8fCAoZSkgPT0gU09BUF9OQU1FU1BBQ0UgfHwgKGUpID09IFNPQVBfRFVQTElDQVRFX0lEIHx8IChlKSA9PSBTT0FQX01JU1NJTkdfSUQgfHwgKGUpID09IFNPQVBfUkVRVUlSRUQgfHwgKGUpID09IFNPQVBfUFJPSElCSVRFRCB8fCAoZSkgPT0gU09BUF9PQ0NVUlMgfHwgKGUpID09IFNPQVBfTEVOR1RIIHx8IChlKSA9PSBTT0FQX05VTEwgfHwgKGUpID09IFNPQVBfSFJFRikKKyNkZWZpbmUgc29hcF9zb2FwX2Vycm9yX2NoZWNrKGUpICgoZSkgPT0gU09BUF9DTElfRkFVTFQgfHwgKGUpID09IFNPQVBfU1ZSX0ZBVUxUIHx8IChlKSA9PSBTT0FQX1ZFUlNJT05NSVNNQVRDSCB8fCAoZSkgPT0gU09BUF9NVVNUVU5ERVJTVEFORCB8fCAoZSkgPT0gU09BUF9GQVVMVCB8fCAoZSkgPT0gU09BUF9OT19NRVRIT0QpCisjZGVmaW5lIHNvYXBfdGNwX2Vycm9yX2NoZWNrKGUpICgoZSkgPT0gU09BUF9FT0YgfHwgKGUpID09IFNPQVBfVENQX0VSUk9SKQorI2RlZmluZSBzb2FwX3NzbF9lcnJvcl9jaGVjayhlKSAoKGUpID09IFNPQVBfU1NMX0VSUk9SKQorI2RlZmluZSBzb2FwX3psaWJfZXJyb3JfY2hlY2soZSkgKChlKSA9PSBTT0FQX1pMSUJfRVJST1IpCisjZGVmaW5lIHNvYXBfaHR0cF9lcnJvcl9jaGVjayhlKSAoKGUpID09IFNPQVBfSFRUUF9FUlJPUiB8fCAoZSkgPT0gU09BUF9HRVRfTUVUSE9EIHx8ICgoZSkgPj0gMTAwICYmIChlKSA8IDYwMCkpCisKKy8qIGdTT0FQIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGVzIDEwMCB0byA1OTkgYXJlIHJlc2VydmVkICovCisKKy8qIENvZGVzIDYwMCB0byA5OTkgYXJlIHVzZXIgZGVmaW5hYmxlICovCisKKy8qIEV4Y2VwdGlvbmFsIGdTT0FQIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGVzID49IDEwMDAgKi8KKworI2RlZmluZSBTT0FQX1NUT1AJCTEwMDAJLyogTm8gSFRUUCByZXNwb25zZSAqLworI2RlZmluZSBTT0FQX0ZPUk0JCTEwMDEJLyogRm9ybSByZXF1ZXN0L3Jlc3BvbnNlICovCisjZGVmaW5lIFNPQVBfSFRNTAkJMTAwMgkvKiBDdXN0b20gSFRNTCByZXNwb25zZSAqLworI2RlZmluZSBTT0FQX0ZJTEUJCTEwMDMJLyogQ3VzdG9tIGZpbGUtYmFzZWQgcmVzcG9uc2UgKi8KKworLyogZ1NPQVAgSFRUUCBtZXRob2QgY29kZXMgKi8KKworI2RlZmluZSBTT0FQX1BPU1QJCTIwMDAKKyNkZWZpbmUgU09BUF9HRVQJCTIwMDEKKworLyogZ1NPQVAgRElNRSAqLworCisjZGVmaW5lIFNPQVBfRElNRV9DRgkJMHgwMQorI2RlZmluZSBTT0FQX0RJTUVfTUUJCTB4MDIKKyNkZWZpbmUgU09BUF9ESU1FX01CCQkweDA0CisjZGVmaW5lIFNPQVBfRElNRV9WRVJTSU9OCTB4MDggLyogRElNRSB2ZXJzaW9uIDEgKi8KKyNkZWZpbmUgU09BUF9ESU1FX01FRElBCQkweDEwCisjZGVmaW5lIFNPQVBfRElNRV9BQlNVUkkJMHgyMAorCisvKiBnU09BUCBaTElCICovCisKKyNkZWZpbmUgU09BUF9aTElCX05PTkUJCTB4MDAKKyNkZWZpbmUgU09BUF9aTElCX0RFRkxBVEUJMHgwMQorI2RlZmluZSBTT0FQX1pMSUJfSU5GTEFURQkweDAyCisjZGVmaW5lIFNPQVBfWkxJQl9HWklQCQkweDAyCisKKy8qIGdTT0FQIHRyYW5zcG9ydCwgY29ubmVjdGlvbiwgYW5kIGNvbnRlbnQgZW5jb2RpbmcgbW9kZXMgKi8KKwordHlwZWRlZiBzb2FwX2ludDMyIHNvYXBfbW9kZTsKKworI2RlZmluZSBTT0FQX0lPCQkJMHgwMDAwMDAwMwkvKiBJTyBtYXNrICovCisjZGVmaW5lIFNPQVBfSU9fRkxVU0gJCTB4MDAwMDAwMDAJLyogZmx1c2ggb3V0cHV0IGltbWVkaWF0ZWx5LCBubyBidWZmZXJpbmcgKi8KKyNkZWZpbmUgU09BUF9JT19CVUZGRVIJCTB4MDAwMDAwMDEJLyogYnVmZmVyIG91dHB1dCBpbiBwYWNrZXRzIG9mIHNpemUgU09BUF9CVUZMRU4gKi8KKyNkZWZpbmUgU09BUF9JT19TVE9SRQkJMHgwMDAwMDAwMgkvKiBzdG9yZSBlbnRpcmUgb3V0cHV0IHRvIGRldGVybWluZSBsZW5ndGggZm9yIHRyYW5zcG9ydCAqLworI2RlZmluZSBTT0FQX0lPX0NIVU5LCQkweDAwMDAwMDAzCS8qIHVzZSBIVFRQIGNodW5rZWQgdHJhbnNmZXIgQU5EIGJ1ZmZlciBwYWNrZXRzICovCisKKyNkZWZpbmUgU09BUF9JT19VRFAJCTB4MDAwMDAwMDQKKyNkZWZpbmUgU09BUF9JT19MRU5HVEgJCTB4MDAwMDAwMDgKKyNkZWZpbmUgU09BUF9JT19LRUVQQUxJVkUJMHgwMDAwMDAxMAorCisjZGVmaW5lIFNPQVBfRU5DX0xBVElOCQkweDAwODAwMDIwCS8qIGlzby04ODU5LTEgZW5jb2RpbmcgKi8KKyNkZWZpbmUgU09BUF9FTkNfWE1MCQkweDAwMDAwMDQwCS8qIHBsYWluIFhNTCBlbmNvZGluZywgbm8gSFRUUCBoZWFkZXIgKi8KKyNkZWZpbmUgU09BUF9FTkNfRElNRQkJMHgwMDAwMDA4MAorI2RlZmluZSBTT0FQX0VOQ19NSU1FCQkweDAwMDAwMTAwCisjZGVmaW5lIFNPQVBfRU5DX01UT00JCTB4MDAwMDAyMDAKKyNkZWZpbmUgU09BUF9FTkNfWkxJQgkJMHgwMDAwMDQwMAorI2RlZmluZSBTT0FQX0VOQ19TU0wJCTB4MDAwMDA4MDAKKworI2RlZmluZSBTT0FQX0VOQwkJMHgwMDAwMEZGRgkvKiBJTyBhbmQgRU5DIG1hc2sgKi8KKworI2RlZmluZSBTT0FQX1hNTF9TVFJJQ1QJCTB4MDAwMDEwMDAJLyogc3RyaWN0IHZhbGlkYXRpb24gKi8KKyNkZWZpbmUgU09BUF9YTUxfSU5ERU5UCQkweDAwMDAyMDAwCisjZGVmaW5lIFNPQVBfWE1MX0NBTk9OSUNBTAkweDAwMDA0MDAwCS8qIEVYQyBDMTROIGNhbm9uaWNhbCBYTUwgKi8KKyNkZWZpbmUgU09BUF9YTUxfVFJFRQkJMHgwMDAwODAwMAorI2RlZmluZSBTT0FQX1hNTF9HUkFQSAkJMHgwMDAxMDAwMAorI2RlZmluZSBTT0FQX1hNTF9OSUwJCTB4MDAwMjAwMDAKKyNkZWZpbmUgU09BUF9YTUxfRE9NCQkweDAwMDQwMDAwCisjZGVmaW5lIFNPQVBfWE1MX1NFQwkJMHgwMDA4MDAwMAkvKiByZXNlcnZlZCBmb3IgV1Mgc2VjdXJpdHkgKi8KKworI2RlZmluZSBTT0FQX0NfTk9JT0IJCTB4MDAxMDAwMDAKKyNkZWZpbmUgU09BUF9DX1VURlNUUklORwkweDAwMjAwMDAwCisjZGVmaW5lIFNPQVBfQ19NQlNUUklORwkJMHgwMDQwMDAwMAorCisjZGVmaW5lIFNPQVBfRE9NX1RSRUUJCTB4MDEwMDAwMDAKKyNkZWZpbmUgU09BUF9ET01fTk9ERQkJMHgwMjAwMDAwMAorI2RlZmluZSBTT0FQX0RPTV9BU0lTCQkweDA0MDAwMDAwCisKKyNkZWZpbmUgU09BUF9JT19ERUZBVUxUCQlTT0FQX0lPX0ZMVVNICisKKy8qIFNTTCBjbGllbnQvc2VydmVyIGF1dGhlbnRpY2F0aW9uIHNldHRpbmdzICovCisKKyNkZWZpbmUgU09BUF9TU0xfTk9fQVVUSEVOVElDQVRJT04JCTB4MDAJLyogZm9yIHRlc3RpbmcgcHVycG9zZXMgKi8KKyNkZWZpbmUgU09BUF9TU0xfUkVRVUlSRV9TRVJWRVJfQVVUSEVOVElDQVRJT04JMHgwMQkvKiBjbGllbnQgcmVxdWlyZXMgc2VydmVyIHRvIGF1dGhlbnRpY2F0ZSAqLworI2RlZmluZSBTT0FQX1NTTF9SRVFVSVJFX0NMSUVOVF9BVVRIRU5USUNBVElPTgkweDAyCS8qIHNlcnZlciByZXF1aXJlcyBjbGllbnQgdG8gYXV0aGVudGljYXRlICovCisKKyNkZWZpbmUgU09BUF9TU0xfREVGQVVMVAkJCVNPQVBfU1NMX1JFUVVJUkVfU0VSVkVSX0FVVEhFTlRJQ0FUSU9OCisKKy8qIHN0YXRlICovCisKKyNkZWZpbmUgU09BUF9JTklUCTEKKyNkZWZpbmUgU09BUF9DT1BZCTIKKworI2RlZmluZSBzb2FwX2NoZWNrX3N0YXRlKHNvYXApICghKHNvYXApIHx8ICgoc29hcCktPnN0YXRlICE9IFNPQVBfSU5JVCAmJiAoc29hcCktPnN0YXRlICE9IFNPQVBfQ09QWSkpCisKKy8qIHBhcnQgKi8KKworI2RlZmluZSBTT0FQX0JFR0lOCQkwCisjZGVmaW5lIFNPQVBfSU5fRU5WRUxPUEUJMgorI2RlZmluZSBTT0FQX0lOX0hFQURFUgkJMworI2RlZmluZSBTT0FQX0VORF9IRUFERVIJCTQKKyNkZWZpbmUgU09BUF9OT19CT0RZCQk1CisjZGVmaW5lIFNPQVBfSU5fQk9EWQkJNgorI2RlZmluZSBTT0FQX0VORF9CT0RZCQk3CisjZGVmaW5lIFNPQVBfRU5EX0VOVkVMT1BFCTgKKyNkZWZpbmUgU09BUF9FTkQJCTkKKyNkZWZpbmUgU09BUF9CRUdJTl9TRUNVUklUWQkxMAorI2RlZmluZSBTT0FQX0lOX1NFQ1VSSVRZCTExCisjZGVmaW5lIFNPQVBfRU5EX1NFQ1VSSVRZCTEyCisKKy8qIERFQlVHIG1hY3JvcyAqLworCisjaWZuZGVmIFdJVEhfTEVBTgorIyBpZmRlZiBERUJVRworIyAgaWZuZGVmIFNPQVBfREVCVUcKKyMgICBkZWZpbmUgU09BUF9ERUJVRworIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgU09BUF9ERUJVRworIyBkZWZpbmUgU09BUF9NQUxMT0Moc29hcCwgc2l6ZSkgc29hcF90cmFja19tYWxsb2Moc29hcCwgX19GSUxFX18sIF9fTElORV9fLCBzaXplKQorIyBkZWZpbmUgU09BUF9GUkVFKHNvYXAsIHB0cikgc29hcF90cmFja19mcmVlKHNvYXAsIF9fRklMRV9fLCBfX0xJTkVfXywgcHRyKQorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9NQUxMT0MJCQkvKiB1c2UgbGliYyBtYWxsb2MgKi8KKyMgZGVmaW5lIFNPQVBfTUFMTE9DKHNvYXAsIHNpemUpIG1hbGxvYyhzaXplKQorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9GUkVFCQkJLyogdXNlIGxpYmMgZnJlZSAqLworIyBkZWZpbmUgU09BUF9GUkVFKHNvYXAsIHB0cikgZnJlZShwdHIpCisjZW5kaWYKKworI2lmZGVmIFNPQVBfREVCVUcKKyMgaWZuZGVmIFNPQVBfTUVTU0FHRQorIyAgZGVmaW5lIFNPQVBfTUVTU0FHRSBmcHJpbnRmCisjIGVuZGlmCisjIGlmbmRlZiBEQkdMT0cKKyMgIGRlZmluZSBEQkdMT0coREJHRklMRSwgQ01EKSBcCit7IGlmIChzb2FwKVwKKyAgeyBpZiAoIXNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYXyMjREJHRklMRV0pXAorICAgICAgc29hcF9vcGVuX2xvZ2ZpbGUoKHN0cnVjdCBzb2FwKilzb2FwLCBTT0FQX0lOREVYXyMjREJHRklMRSk7XAorICAgIGlmIChzb2FwLT5mZGVidWdbU09BUF9JTkRFWF8jI0RCR0ZJTEVdKVwKKyAgICB7IEZJTEUgKmZkZWJ1ZyA9IHNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYXyMjREJHRklMRV07XAorICAgICAgQ01EO1wKKyAgICAgIGZmbHVzaChmZGVidWcpO1wKKyAgICB9XAorICB9XAorfQorIyBlbmRpZgorIyBpZm5kZWYgREJHTVNHCisjICBkZWZpbmUgREJHTVNHKERCR0ZJTEUsIE1TRywgTEVOKSBcCit7IGlmIChzb2FwKVwKKyAgeyBpZiAoIXNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYXyMjREJHRklMRV0pXAorICAgICAgc29hcF9vcGVuX2xvZ2ZpbGUoKHN0cnVjdCBzb2FwKilzb2FwLCBTT0FQX0lOREVYXyMjREJHRklMRSk7XAorICAgIGlmIChzb2FwLT5mZGVidWdbU09BUF9JTkRFWF8jI0RCR0ZJTEVdKVwKKyAgICB7IGZ3cml0ZSgoTVNHKSwgMSwgKExFTiksIHNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYXyMjREJHRklMRV0pO1wKKyAgICAgIGZmbHVzaChzb2FwLT5mZGVidWdbU09BUF9JTkRFWF8jI0RCR0ZJTEVdKTtcCisgICAgfVwKKyAgfVwKK30KKyMgZW5kaWYKKyMgaWZuZGVmIERHQkZVTgorIyAgZGVmaW5lIERCR0ZVTihGTkFNRSkgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIlcyglZCk6ICVzKClcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgRk5BTUUpKQorIyAgZGVmaW5lIERCR0ZVTjEoRk5BTUUsIEZNVCwgQVJHKSBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIiVzKCVkKTogJXMoIkZNVCIpXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIEZOQU1FLCAoQVJHKSkpCisjICBkZWZpbmUgREJHRlVOMihGTkFNRSwgRk1UMSwgQVJHMSwgRk1UMiwgQVJHMikgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIlcyglZCk6ICVzKCJGTVQxIiwgIkZNVDIiKVxuIiwgX19GSUxFX18sIF9fTElORV9fLCBGTkFNRSwgKEFSRzEpLCAoQVJHMikpKQorIyAgZGVmaW5lIERCR0ZVTjMoRk5BTUUsIEZNVDEsIEFSRzEsIEZNVDIsIEFSRzIsIEZNVDMsIEFSRzMpIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiJXMoJWQpOiAlcygiRk1UMSIsICJGTVQyIiwgIkZNVDMiKVxuIiwgX19GSUxFX18sIF9fTElORV9fLCBGTkFNRSwgKEFSRzEpLCAoQVJHMiksIChBUkczKSkpCisjIGVuZGlmCisjIGlmbmRlZiBEQkdIRVgKKyMgIGRlZmluZSBEQkdIRVgoREJHRklMRSwgTVNHLCBMRU4pIFwKK3sgaWYgKHNvYXApXAorICB7IGlmICghc29hcC0+ZmRlYnVnW1NPQVBfSU5ERVhfIyNEQkdGSUxFXSlcCisgICAgICBzb2FwX29wZW5fbG9nZmlsZShzb2FwLCBTT0FQX0lOREVYXyMjREJHRklMRSk7XAorICAgIGlmIChzb2FwLT5mZGVidWdbU09BUF9JTkRFWF8jI0RCR0ZJTEVdKVwKKyAgICB7IGludCBpOyBjaGFyICpzO1wKKyAgICAgIGZvciAocyA9IChjaGFyKikoTVNHKSwgaSA9IChMRU4pOyBpOyBpLS0pXAorICAgICAgICBmcHJpbnRmKHNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYXyMjREJHRklMRV0sICIlMi4yaGhYICAiLCAqcysrKTtcCisgICAgICBmZmx1c2goc29hcC0+ZmRlYnVnW1NPQVBfSU5ERVhfIyNEQkdGSUxFXSk7XAorICAgIH1cCisgIH1cCit9CisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgREJHTE9HKERCR0ZJTEUsIENNRCkKKyMgZGVmaW5lIERCR01TRyhEQkdGSUxFLCBNU0csIExFTikKKyMgZGVmaW5lIERCR0ZVTihGTkFNRSkKKyMgZGVmaW5lIERCR0ZVTjEoRk5BTUUsIEZNVCwgQVJHKQorIyBkZWZpbmUgREJHRlVOMihGTkFNRSwgRk1UMSwgQVJHMSwgRk1UMiwgQVJHMikKKyMgZGVmaW5lIERCR0ZVTjMoRk5BTUUsIEZNVDEsIEFSRzEsIEZNVDIsIEFSRzIsIEZNVDMsIEFSRzMpCisjIGRlZmluZSBEQkdIRVgoREJHRklMRSwgTVNHLCBMRU4pCisjZW5kaWYKKworLyogVUNTLTQgcmVxdWlyZXMgMzIgYml0cyAoMC03RkZGRkZGRiwgdGhlIHNpZ24gYml0IGlzIHVzZWQgYnkgZ1NPQVAgdG8gZGlzdGluZ3Vpc2ggWE1MIGVudGl0aWVzKSAqLwordHlwZWRlZiBzb2FwX2ludDMyIHNvYXBfd2NoYXI7CisKKy8qIG5hbWVzcGFjZSB0YWJsZSByb3cgKi8KK3N0cnVjdCBOYW1lc3BhY2UKK3sgY29uc3QgY2hhciAqaWQ7CisgIGNvbnN0IGNoYXIgKm5zOworICBjb25zdCBjaGFyICppbjsKKyAgY2hhciAqb3V0OworfTsKKworLyogbmFtZXNwYWNlIHN0YWNrICovCitzdHJ1Y3Qgc29hcF9ubGlzdAoreyBzdHJ1Y3Qgc29hcF9ubGlzdCAqbmV4dDsKKyAgdW5zaWduZWQgaW50IGxldmVsOyAvKiBuZXN0aW5nIGRlcHRoIGxldmVsICovCisgIHNob3J0IGluZGV4OyAvKiBjb3JyZXNwb25kaW5nIGVudHJ5IGluIG5zIG1hcHBpbmcgdGFibGUgKi8KKyAgY2hhciAqbnM7IC8qIG9ubHkgc2V0IHdoZW4gcGFyc2VkIG5zIFVSSSBpcyBub3QgaW4gdGhlIG5zIG1hcHBpbmcgdGFibGUgKi8KKyAgY2hhciBpZFsxXTsgLyogdGhlIGFjdHVhbCBzdHJpbmcgdmFsdWUgZmxvd3MgaW50byB0aGUgYWxsb2NhdGVkIHJlZ2lvbiBiZWxvdyB0aGlzIHN0cnVjdCAqLworfTsKKworLyogYmxvY2sgc3RhY2sgZm9yIG5lc3RlZCBibG9jayBhbGxvY2F0aW9ucyAqLworc3RydWN0IHNvYXBfYmxpc3QKK3sgc3RydWN0IHNvYXBfYmxpc3QgKm5leHQ7CisgIGNoYXIgKnB0cjsKKyAgc2l6ZV90IHNpemU7Cit9OworCisvKiBhcnJheSBsYXlvdXQgKi8KK3N0cnVjdCBzb2FwX2FycmF5Cit7IHZvaWQgKl9fcHRyOworICBpbnQgX19zaXplOworfTsKKworLyogcG9pbnRlciBzZXJpYWxpemF0aW9uIG1hbmFnZW1lbnQgKi8KK3N0cnVjdCBzb2FwX3BsaXN0Cit7IHN0cnVjdCBzb2FwX3BsaXN0ICpuZXh0OworICBjb25zdCB2b2lkICpwdHI7CisgIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphcnJheTsKKyAgaW50IHR5cGU7CisgIGludCBpZDsKKyAgY2hhciBtYXJrMTsKKyAgY2hhciBtYXJrMjsKK307CisKKy8qIGJsb2NrIGFsbG9jYXRpb24gZm9yIHBvaW50ZXIgc2VyaWFsaXphdGlvbiBtYW5hZ2VtZW50ICovCitzdHJ1Y3Qgc29hcF9wYmxrCit7IHN0cnVjdCBzb2FwX3BibGsgKm5leHQ7CisgIHN0cnVjdCBzb2FwX3BsaXN0IHBsaXN0W1NPQVBfUFRSQkxLXTsKK307CisKKyNpZmRlZiBTT0FQX0RFQlVHCisvKiBtYWxsb2MvZnJlZSB0cmFja2luZyBmb3IgZGVidWdnaW5nICovCitzdHJ1Y3Qgc29hcF9tbGlzdAoreyBzdHJ1Y3Qgc29hcF9tbGlzdCAqbmV4dDsKKyAgY29uc3Qgdm9pZCAqcHRyOworICBjb25zdCBjaGFyICpmaWxlOworICBpbnQgbGluZTsKKyAgc2hvcnQgbGl2ZTsKK307CisjZW5kaWYKKworLyogY2xhc3MgYWxsb2NhdGlvbiBsaXN0ICovCitzdHJ1Y3Qgc29hcF9jbGlzdAoreyBzdHJ1Y3Qgc29hcF9jbGlzdCAqbmV4dDsKKyAgdm9pZCAqcHRyOworICBpbnQgdHlwZTsKKyAgaW50IHNpemU7CisgIHZvaWQgKCpmZGVsZXRlKShzdHJ1Y3Qgc29hcF9jbGlzdCopOworfTsKKworLyogYXR0cmlidXRlcyAqLworc3RydWN0IHNvYXBfYXR0cmlidXRlCit7IHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqbmV4dDsKKyAgY2hhciAqdmFsdWU7CisgIHNpemVfdCBzaXplOworICBjaGFyICpuczsKKyAgc2hvcnQgdmlzaWJsZTsKKyAgY2hhciBuYW1lWzFdOyAvKiB0aGUgYWN0dWFsIG5hbWUgc3RyaW5nIGZsb3dzIGludG8gdGhlIGFsbG9jYXRlZCByZWdpb24gYmVsb3cgdGhpcyBzdHJ1Y3QgKi8KK307CisKK3N0cnVjdCBzb2FwX2Nvb2tpZQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKm5leHQ7CisgIGNoYXIgKm5hbWU7CisgIGNoYXIgKnZhbHVlOworICBjaGFyICpkb21haW47CisgIGNoYXIgKnBhdGg7CisgIGxvbmcgZXhwaXJlOwkJLyogY2xpZW50LXNpZGU6IGxvY2FsIHRpbWUgdG8gZXhwaXJlOyBzZXJ2ZXItc2lkZTogc2Vjb25kcyB0byBleHBpcmUgKi8KKyAgdW5zaWduZWQgaW50IHZlcnNpb247CisgIHNob3J0IHNlY3VyZTsKKyAgc2hvcnQgc2Vzc2lvbjsJLyogc2VydmVyLXNpZGUgKi8KKyAgc2hvcnQgZW52OwkJLyogc2VydmVyLXNpZGU6IGdvdCBjb29raWUgZnJvbSBjbGllbnQgYW5kIHNob3VsZCBub3QgYmUgKHJlKXNlbmQgKi8KKyAgc2hvcnQgbW9kaWZpZWQ7CS8qIHNlcnZlci1zaWRlOiBjbGllbnQgY29va2llIHdhcyBtb2RpZmllZCBhbmQgc2hvdWxkIGJlIHNlbmQgKi8KK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqIFNPQVBfRk1BQzIgc29hcF9uZXh0X211bHRpcGFydChzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKTsKKworY2xhc3Mgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3IKK3sgcHVibGljOgorICBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBzb2FwX211bHRpcGFydF9pdGVyYXRvciYgaXRlcikgY29uc3QKKyAgICB7IHJldHVybiBjb250ZW50ID09IGl0ZXIuY29udGVudDsgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3Qgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3ImIGl0ZXIpIGNvbnN0CisgICAgeyByZXR1cm4gY29udGVudCAhPSBpdGVyLmNvbnRlbnQ7IH0KKyAgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICZvcGVyYXRvciooKSBjb25zdAorICAgIHsgcmV0dXJuICpjb250ZW50OyB9CisgIHNvYXBfbXVsdGlwYXJ0X2l0ZXJhdG9yICZvcGVyYXRvcisrKCkKKyAgICB7IGNvbnRlbnQgPSBzb2FwX25leHRfbXVsdGlwYXJ0KGNvbnRlbnQpOyByZXR1cm4gKnRoaXM7IH0KKyAgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3IoKSA6IGNvbnRlbnQoTlVMTCkKKyAgICB7IH0KKyAgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3Ioc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpwKSA6IGNvbnRlbnQocCkKKyAgICB7IH0KK307CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU5FUgorc3RydWN0IHNvYXBfZGltZQoreyBzaXplX3QgY291bnQ7CisgIHNpemVfdCBzaXplOworICBzaXplX3QgY2h1bmtzaXplOworICBzaXplX3QgYnVmbGVuOworICBjaGFyIGZsYWdzOworICBjaGFyICpwdHI7CisgIGNvbnN0IGNoYXIgKmlkOworICBjb25zdCBjaGFyICp0eXBlOworICBjb25zdCBjaGFyICpvcHRpb25zOworICBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmxpc3Q7CQkvKiBsaXN0IG9mIERJTUUgYXR0YWNobWVudHMgcmVjZWl2ZWQgKi8KKyAgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpmaXJzdCwgKmxhc3Q7CS8qIHRlbXBvcmFyeSBpbi9vdXQgcXVldWUgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworICBzb2FwX211bHRpcGFydF9pdGVyYXRvciBiZWdpbigpCisgICAgeyBzb2FwX211bHRpcGFydF9pdGVyYXRvciBpdGVyKGxpc3QpOyByZXR1cm4gaXRlcjsgfTsKKyAgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3IgZW5kKCkKKyAgICB7IHNvYXBfbXVsdGlwYXJ0X2l0ZXJhdG9yIGl0ZXIoTlVMTCk7IHJldHVybiBpdGVyOyB9OworI2VuZGlmCit9OworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK3N0cnVjdCBzb2FwX21pbWUKK3sgY2hhciAqYm91bmRhcnk7CQkJLyogTUlNRSBib3VuZGFyeSAqLworICBjb25zdCBjaGFyICpzdGFydDsJCQkvKiBNSU1FIHN0YXJ0IElEICovCisgIHN0cnVjdCBzb2FwX211bHRpcGFydCAqbGlzdDsJCS8qIGxpc3Qgb2YgTUlNRSBhdHRhY2htZW50cyByZWNlaXZlZCAqLworICBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmZpcnN0LCAqbGFzdDsJLyogdGVtcG9yYXJ5IGluL291dCBxdWV1ZSAqLworI2lmZGVmIF9fY3BsdXNwbHVzCisgIHNvYXBfbXVsdGlwYXJ0X2l0ZXJhdG9yIGJlZ2luKCkKKyAgICB7IHNvYXBfbXVsdGlwYXJ0X2l0ZXJhdG9yIGl0ZXIobGlzdCk7IHJldHVybiBpdGVyOyB9OworICBzb2FwX211bHRpcGFydF9pdGVyYXRvciBlbmQoKQorICAgIHsgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3IgaXRlcihOVUxMKTsgcmV0dXJuIGl0ZXI7IH07CisjZW5kaWYKK307CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU5FUgorLyogUkZDMjA0NSBNSU1FIGNvbnRlbnQgdHJhbnNmZXIgZW5jb2RpbmdzICovCitlbnVtIHNvYXBfbWltZV9lbmNvZGluZworeyBTT0FQX01JTUVfTk9ORSwKKyAgU09BUF9NSU1FXzdCSVQsCisgIFNPQVBfTUlNRV84QklULAorICBTT0FQX01JTUVfQklOQVJZLAorICBTT0FQX01JTUVfUVVPVEVEX1BSSU5UQUJMRSwKKyAgU09BUF9NSU1FX0JBU0U2NCwKKyAgU09BUF9NSU1FX0lFVEZfVE9LRU4sCisgIFNPQVBfTUlNRV9YX1RPS0VOCit9OworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKKy8qIERJTUUvTUlNRSBtdWx0aXBhcnQgbGlzdCAqLworc3RydWN0IHNvYXBfbXVsdGlwYXJ0Cit7IHN0cnVjdCBzb2FwX211bHRpcGFydCAqbmV4dDsKKyAgY2hhciAqcHRyOwkJCQkvKiBwb2ludHMgdG8gcmF3IGRhdGEgY29udGVudCAqLworICBzaXplX3Qgc2l6ZTsJCQkJLyogc2l6ZSBvZiBkYXRhIGNvbnRlbnQgKi8KKyAgY29uc3QgY2hhciAqaWQ7CQkJLyogRElNRS9NSU1FIGNvbnRlbnQgSUQgb3IgZm9ybSBkYXRhIG5hbWUgKi8KKyAgY29uc3QgY2hhciAqdHlwZTsJCQkvKiBESU1FL01JTUUgdHlwZSAoTUlNRSB0eXBlIGZvcm1hdCkgKi8KKyAgY29uc3QgY2hhciAqb3B0aW9uczsJCQkvKiBESU1FIG9wdGlvbnMgKi8KKyAgZW51bSBzb2FwX21pbWVfZW5jb2RpbmcgZW5jb2Rpbmc7CS8qIE1JTUUgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyAqLworICBjb25zdCBjaGFyICpsb2NhdGlvbjsJCQkvKiBNSU1FIENvbnRlbnQtTG9jYXRpb24gKG9wdGlvbmFsKSAqLworICBjb25zdCBjaGFyICpkZXNjcmlwdGlvbjsJCS8qIE1JTUUgQ29udGVudC1EZXNjcmlwdGlvbiAob3B0aW9uYWwpICovCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgdHlwZWRlZiBzb2FwX211bHRpcGFydF9pdGVyYXRvciBpdGVyYXRvcjsKKyNlbmRpZgorfTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTkVSCisvKiBhdHRhY2htZW50IERJTUUgYW5kIE1UT00gWE9QIGZvcndhcmRpbmcgKi8KK3N0cnVjdCBzb2FwX3hsaXN0Cit7IHN0cnVjdCBzb2FwX3hsaXN0ICpuZXh0OworICB1bnNpZ25lZCBjaGFyICoqcHRyOworICBpbnQgKnNpemU7CisgIGNoYXIgKmlkOworICBjaGFyICoqdHlwZTsKKyAgY2hhciAqKm9wdGlvbnM7Cit9OworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZmRlZiBfX2NwbHVzcGx1cworY2xhc3Mgc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yCit7IHB1YmxpYzoKKyAgc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAqYXR0OworICBjb25zdCBjaGFyICpuc3RyOworICBjb25zdCBjaGFyICpuYW1lOworICBib29sIG9wZXJhdG9yPT0oY29uc3Qgc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3ImKSBjb25zdDsKKyAgc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAmb3BlcmF0b3IqKCkgY29uc3Q7CisgIHNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvciAmb3BlcmF0b3IrKygpOworICBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IoKTsKKyAgc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUqKTsKKyAgfnNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcigpOworfTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK3N0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUKK3sgc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAqbmV4dDsKKyAgY29uc3QgY2hhciAqbnN0cjsKKyAgY2hhciAqbmFtZTsKKyAgY2hhciAqZGF0YTsKKyAgd2NoYXJfdCAqd2lkZTsKKyAgc3RydWN0IHNvYXAgKnNvYXA7CisjaWZkZWYgX19jcGx1c3BsdXMKKyAgdHlwZWRlZiBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IgaXRlcmF0b3I7CisgIHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgJnNldChjb25zdCBjaGFyICpuc3RyLCBjb25zdCBjaGFyICpuYW1lKTsJLyogc2V0IG5hbWVzcGFjZSBhbmQgbmFtZSAqLworICBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICZzZXQoY29uc3QgY2hhciAqZGF0YSk7CQkvKiBzZXQgZGF0YSAqLworICBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IgYmVnaW4oKTsKKyAgc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yIGVuZCgpOworICBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IgZmluZChjb25zdCBjaGFyICpuc3RyLCBjb25zdCBjaGFyICpuYW1lKTsKKyAgdm9pZCB1bmxpbmsoKTsKKyAgc29hcF9kb21fYXR0cmlidXRlKCk7CisgIHNvYXBfZG9tX2F0dHJpYnV0ZShzdHJ1Y3Qgc29hcCAqc29hcCk7CisgIHNvYXBfZG9tX2F0dHJpYnV0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbnN0ciwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZGF0YSk7CisgIH5zb2FwX2RvbV9hdHRyaWJ1dGUoKTsKKyNlbmRpZgorfTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZkZWYgX19jcGx1c3BsdXMKK2NsYXNzIHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IKK3sgcHVibGljOgorICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqZWx0OworICBjb25zdCBjaGFyICpuc3RyOworICBjb25zdCBjaGFyICpuYW1lOworICBpbnQgdHlwZTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3ImKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3ImKSBjb25zdDsKKyAgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgJm9wZXJhdG9yKigpIGNvbnN0OworICBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yICZvcGVyYXRvcisrKCk7CisgIHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IoKTsKKyAgc29hcF9kb21fZWxlbWVudF9pdGVyYXRvcihzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCopOworICB+c29hcF9kb21fZWxlbWVudF9pdGVyYXRvcigpOworfTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK3N0cnVjdCBzb2FwX2RvbV9lbGVtZW50Cit7IHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICpuZXh0OwkvKiBuZXh0IHNpYmxpbmcgKi8KKyAgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKnBybnQ7CS8qIHBhcmVudCAqLworICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqZWx0czsJLyogbGlzdCBvZiBjaGlsZCBlbGVtZW50cyAqLworICBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICphdHRzOwkvKiBsaXN0IG9mIGF0dHJpYnV0ZXMgKi8KKyAgY29uc3QgY2hhciAqbnN0cjsJCQkvKiBuYW1lc3BhY2Ugc3RyaW5nICovCisgIGNoYXIgKm5hbWU7CQkJCS8qIGVsZW1lbnQgdGFnIG5hbWUgKi8KKyAgY2hhciAqZGF0YTsJCQkJLyogZWxlbWVudCBjb250ZW50IGRhdGEgKHdpdGggU09BUF9DX1VURlNUUklORyBmbGFnIHNldCkgKi8KKyAgd2NoYXJfdCAqd2lkZTsJCQkvKiBlbGVtZW50IGNvbnRlbnQgZGF0YSAqLworICBpbnQgdHlwZTsJCQkJLyogb3B0aW9uYWw6IHNlcmlhbGl6ZWQgQy9DKysgZGF0YSB0eXBlICovCisgIHZvaWQgKm5vZGU7CQkJCS8qIG9wdGlvbmFsOiBwb2ludGVyIHRvIHNlcmlhbGl6ZWQgQy9DKysgZGF0YSAqLworICBjaGFyICpoZWFkOwkJCQkvKiBsZWFkaW5nIHdoaXRlc3BhY2UgdG8gc3RhcnQgdGFnICovCisgIGNoYXIgKnRhaWw7CQkJCS8qIGxlYWRpbmcgd2hpdGVzcGFjZSB0byBlbmQgdGFnICovCisgIHN0cnVjdCBzb2FwICpzb2FwOwkJCS8qIHNvYXAgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBub2RlICovCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgdHlwZWRlZiBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yIGl0ZXJhdG9yOworICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAmc2V0KGNvbnN0IGNoYXIgKm5zdHIsIGNvbnN0IGNoYXIgKm5hbWUpOworICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAmc2V0KGNvbnN0IGNoYXIgKmRhdGEpOworICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAmc2V0KHZvaWQgKm5vZGUsIGludCB0eXBlKTsKKyAgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgJmFkZChzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCopOworICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAmYWRkKHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50Jik7CisgIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICZhZGQoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSopOworICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAmYWRkKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUmKTsKKyAgc29hcF9kb21fZWxlbWVudF9pdGVyYXRvciBiZWdpbigpOworICBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yIGVuZCgpOworICBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yIGZpbmQoY29uc3QgY2hhciAqbnN0ciwgY29uc3QgY2hhciAqbmFtZSk7CisgIHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IgZmluZChpbnQgdHlwZSk7CisgIHZvaWQgdW5saW5rKCk7CisgIHNvYXBfZG9tX2VsZW1lbnQoKTsKKyAgc29hcF9kb21fZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCk7CisgIHNvYXBfZG9tX2VsZW1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5zdHIsIGNvbnN0IGNoYXIgKm5hbWUpOworICBzb2FwX2RvbV9lbGVtZW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuc3RyLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkYXRhKTsKKyAgc29hcF9kb21fZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbnN0ciwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqbm9kZSwgaW50IHR5cGUpOworICB+c29hcF9kb21fZWxlbWVudCgpOworI2VuZGlmCit9OworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqIFNPQVBfRk1BQzIgc29hcF9kb21fbmV4dF9lbGVtZW50KHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICplbHQpOworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICogU09BUF9GTUFDMiBzb2FwX2RvbV9uZXh0X2F0dHJpYnV0ZShzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICphdHQpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiAhZGVmaW5lZChXSVRIX0xFQU4pCit9CitleHRlcm4gc3RkOjpvc3RyZWFtICZvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYsIGNvbnN0IHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50Jik7CitleHRlcm4gc3RkOjppc3RyZWFtICZvcGVyYXRvcj4+KHN0ZDo6aXN0cmVhbSYsIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50Jik7CitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3Qgc29hcAoreyBzaG9ydCBzdGF0ZTsJCQkvKiAwID0gdW5pbml0aWFsaXplZCwgMSA9IGluaXRpYWxpemVkLCAyID0gY29weSBvZiBhbm90aGVyIHNvYXAgc3RydWN0ICovCisgIHNob3J0IHZlcnNpb247CQkvKiAxID0gU09BUDEuMSBhbmQgMiA9IFNPQVAxLjIgKHNldCBhdXRvbWF0aWNhbGx5IGZyb20gbmFtZXNwYWNlIFVSSSBpbiBuc21hcCB0YWJsZSkgKi8KKyAgc29hcF9tb2RlIG1vZGU7CisgIHNvYXBfbW9kZSBpbW9kZTsKKyAgc29hcF9tb2RlIG9tb2RlOworICBjb25zdCBjaGFyICpmbG9hdF9mb3JtYXQ7CS8qIHVzZXItZGVmaW5hYmxlIGZvcm1hdCBzdHJpbmcgZm9yIGZsb2F0cyAoPDEwMjQgY2hhcnMpICovCisgIGNvbnN0IGNoYXIgKmRvdWJsZV9mb3JtYXQ7CS8qIHVzZXItZGVmaW5hYmxlIGZvcm1hdCBzdHJpbmcgZm9yIGRvdWJsZXMgKDwxMDI0IGNoYXJzKSAqLworICBjb25zdCBjaGFyICpkaW1lX2lkX2Zvcm1hdDsJLyogdXNlci1kZWZpbmFibGUgZm9ybWF0IHN0cmluZyBmb3IgaW50ZWdlciBESU1FIGlkICg8U09BUF9UQUdMRU4gY2hhcnMpICovCisgIGNvbnN0IGNoYXIgKmh0dHBfdmVyc2lvbjsJLyogSFRUUCB2ZXJzaW9uIHVzZWQgIjEuMCIgb3IgIjEuMSIgKi8KKyAgY29uc3QgY2hhciAqaHR0cF9jb250ZW50OwkvKiBvcHRpb25hbCBjdXN0b20gcmVzcG9uc2UgY29udGVudCB0eXBlICh3aXRoIFNPQVBfRklMRSkgKi8KKyAgY29uc3QgY2hhciAqZW5jb2RpbmdTdHlsZTsJLyogZGVmYXVsdCA9IE5VTEwgd2hpY2ggbWVhbnMgdGhhdCBTT0FQIGVuY29kaW5nIGlzIHVzZWQgKi8KKyAgY29uc3QgY2hhciAqYWN0b3I7CQkvKiBTT0FQLUVOVjphY3RvciBvciByb2xlIGF0dHJpYnV0ZSB2YWx1ZSAqLworICBpbnQgcmVjdl90aW1lb3V0OwkJLyogd2hlbiA+IDAsIGdpdmVzIHNvY2tldCByZWN2IHRpbWVvdXQgaW4gc2Vjb25kcywgPCAwIGluIHVzZWMgKi8KKyAgaW50IHNlbmRfdGltZW91dDsJCS8qIHdoZW4gPiAwLCBnaXZlcyBzb2NrZXQgc2VuZCB0aW1lb3V0IGluIHNlY29uZHMsIDwgMCBpbiB1c2VjICovCisgIGludCBjb25uZWN0X3RpbWVvdXQ7CQkvKiB3aGVuID4gMCwgZ2l2ZXMgc29ja2V0IGNvbm5lY3QoKSB0aW1lb3V0IGluIHNlY29uZHMsIDwgMCBpbiB1c2VjICovCisgIGludCBhY2NlcHRfdGltZW91dDsJCS8qIHdoZW4gPiAwLCBnaXZlcyBzb2NrZXQgYWNjZXB0KCkgdGltZW91dCBpbiBzZWNvbmRzLCA8IDAgaW4gdXNlYyAqLworICBpbnQgc29ja2V0X2ZsYWdzOwkJLyogc29ja2V0IHJlY3YoKSBhbmQgc2VuZCgpIGZsYWdzLCBlLmcuIHNldCB0byBNU0dfTk9TSUdOQUwgdG8gZGlzYWJsZSBzaWdwaXBlICovCisgIGludCBjb25uZWN0X2ZsYWdzOwkJLyogY29ubmVjdCgpIFNPTF9TT0NLRVQgc29ja29wdCBmbGFncywgZS5nLiBzZXQgdG8gU09fREVCVUcgdG8gZGVidWcgc29ja2V0ICovCisgIGludCBiaW5kX2ZsYWdzOwkJLyogYmluZCgpIFNPTF9TT0NLRVQgc29ja29wdCBmbGFncywgZS5nLiBzZXQgdG8gU09fUkVVU0VBRERSIHRvIGVuYWJsZSByZXVzZSAqLworICBpbnQgYWNjZXB0X2ZsYWdzOwkJLyogYWNjZXB0KCkgU09MX1NPQ0tFVCBzb2Nrb3B0IGZsYWdzICovCisgIGNvbnN0IHN0cnVjdCBOYW1lc3BhY2UgKm5hbWVzcGFjZXM7CS8qIFBvaW50ZXIgdG8gZ2xvYmFsIG5hbWVzcGFjZSBtYXBwaW5nIHRhYmxlICovCisgIHN0cnVjdCBOYW1lc3BhY2UgKmxvY2FsX25hbWVzcGFjZXM7CS8qIExvY2FsIG5hbWVzcGFjZSBtYXBwaW5nIHRhYmxlICovCisgIHN0cnVjdCBzb2FwX25saXN0ICpubGlzdDsJLyogbmFtZXNwYWNlIHN0YWNrICovCisgIHN0cnVjdCBzb2FwX2JsaXN0ICpibGlzdDsJLyogYmxvY2sgYWxsb2NhdGlvbiBzdGFjayAqLworICBzdHJ1Y3Qgc29hcF9jbGlzdCAqY2xpc3Q7CS8qIGNsYXNzIGluc3RhbmNlIGFsbG9jYXRpb24gbGlzdCAqLworICB2b2lkICphbGlzdDsJCQkvKiBtZW1vcnkgYWxsb2NhdGlvbiAobWFsbG9jKSBsaXN0ICovCisgIHN0cnVjdCBzb2FwX2lsaXN0ICppaHRbU09BUF9JREhBU0hdOworICBzdHJ1Y3Qgc29hcF9wbGlzdCAqcGh0W1NPQVBfUFRSSEFTSF07CisgIHN0cnVjdCBzb2FwX3BibGsgKnBibGs7CS8qIHBsaXN0IGJsb2NrIGFsbG9jYXRpb24gKi8KKyAgc2hvcnQgcGlkeDsJCQkvKiBwbGlzdCBibG9jayBhbGxvY2F0aW9uICovCisgIHN0cnVjdCBTT0FQX0VOVl9fSGVhZGVyICpoZWFkZXI7CisgIHN0cnVjdCBTT0FQX0VOVl9fRmF1bHQgKmZhdWx0OworICBpbnQgaWRudW07CisgIHZvaWQgKnVzZXI7CQkJLyogdG8gcGFzcyB1c2VyLWRlZmluZWQgZGF0YSAqLworICBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnBsdWdpbnM7CS8qIGxpbmtlZCBsaXN0IG9mIHBsdWctaW4gZGF0YSAqLworICBjaGFyICp1c2VyaWQ7CQkJLyogSFRUUCBCYXNpYyBhdXRob3JpemF0aW9uIHVzZXJpZCAqLworICBjaGFyICpwYXNzd2Q7CQkJLyogSFRUUCBCYXNpYyBhdXRob3JpemF0aW9uIHBhc3N3ZCAqLworICBpbnQgKCpmcG9zdCkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworICBpbnQgKCpmZ2V0KShzdHJ1Y3Qgc29hcCopOworICBpbnQgKCpmZm9ybSkoc3RydWN0IHNvYXAqKTsKKyAgaW50ICgqZnBvc3RoZHIpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKyAgaW50ICgqZnJlc3BvbnNlKShzdHJ1Y3Qgc29hcCosIGludCwgc2l6ZV90KTsKKyAgaW50ICgqZnBhcnNlKShzdHJ1Y3Qgc29hcCopOworICBpbnQgKCpmcGFyc2VoZHIpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKyAgaW50ICgqZnJlc29sdmUpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHN0cnVjdCBpbl9hZGRyKiBpbmFkZHIpOworICBpbnQgKCpmY29ubmVjdCkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGludCk7CisgIGludCAoKmZkaXNjb25uZWN0KShzdHJ1Y3Qgc29hcCopOworICBpbnQgKCpmY2xvc2Vzb2NrZXQpKHN0cnVjdCBzb2FwKiwgU09BUF9TT0NLRVQpOworICBpbnQgKCpmc2h1dGRvd25zb2NrZXQpKHN0cnVjdCBzb2FwKiwgU09BUF9TT0NLRVQsIGludCk7CisgIGludCAoKmZvcGVuKShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgaW50KTsKKyAgaW50ICgqZmFjY2VwdCkoc3RydWN0IHNvYXAqLCBpbnQsIHN0cnVjdCBzb2NrYWRkciosIGludCAqbik7CisgIGludCAoKmZjbG9zZSkoc3RydWN0IHNvYXAqKTsKKyAgaW50ICgqZnNlbmQpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHNpemVfdCk7CisgIHNpemVfdCAoKmZyZWN2KShzdHJ1Y3Qgc29hcCosIGNoYXIqLCBzaXplX3QpOworICBpbnQgKCpmcG9sbCkoc3RydWN0IHNvYXAqKTsKKyAgdm9pZCAoKmZzZXRlcnJvcikoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICoqYywgY29uc3QgY2hhciAqKnMpOworICBpbnQgKCpmaWdub3JlKShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKKyAgaW50ICgqZnNlcnZlbG9vcCkoc3RydWN0IHNvYXAqKTsKKyAgdm9pZCAqKCpmcGx1Z2luKShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaW50ICgqZnByZXBhcmVpbml0KShzdHJ1Y3Qgc29hcCopOworICBpbnQgKCpmcHJlcGFyZXNlbmQpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHNpemVfdCk7CisgIGludCAoKmZwcmVwYXJlcmVjdikoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc2l6ZV90KTsKKyAgaW50ICgqZnByZXBhcmVmaW5hbCkoc3RydWN0IHNvYXAqKTsKKyAgdm9pZCAqKCpmZGltZXJlYWRvcGVuKShzdHJ1Y3Qgc29hcCosIHZvaWQqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKyAgdm9pZCAqKCpmZGltZXdyaXRlb3Blbikoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKyAgdm9pZCAoKmZkaW1lcmVhZGNsb3NlKShzdHJ1Y3Qgc29hcCosIHZvaWQqKTsKKyAgdm9pZCAoKmZkaW1ld3JpdGVjbG9zZSkoc3RydWN0IHNvYXAqLCB2b2lkKik7CisgIHNpemVfdCAoKmZkaW1lcmVhZCkoc3RydWN0IHNvYXAqLCB2b2lkKiwgY2hhciosIHNpemVfdCk7CisgIGludCAoKmZkaW1ld3JpdGUpKHN0cnVjdCBzb2FwKiwgdm9pZCosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworI2VuZGlmCisgIGludCBtYXN0ZXI7CisgIGludCBzb2NrZXQ7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgIWRlZmluZWQoV0lUSF9MRUFOKQorICBzdGQ6Om9zdHJlYW0gKm9zOworICBzdGQ6OmlzdHJlYW0gKmlzOworI2Vsc2UKKyAgdm9pZCAqb3M7CS8qIHByZXNlcnZlIGFsaWdubWVudCAqLworICB2b2lkICppczsJLyogcHJlc2VydmUgYWxpZ25tZW50ICovCisjZW5kaWYKKyNpZm5kZWYgVU5ERVJfQ0UKKyAgaW50IHNlbmRmZDsKKyAgaW50IHJlY3ZmZDsKKyNlbHNlCisgIEZJTEUgKnNlbmRmZDsKKyAgRklMRSAqcmVjdmZkOworI2VuZGlmCisjaWZkZWYgV0lOMzIKKyAgY2hhciBlcnJvcnN0clsyNTZdOwkvKiBidWYgZm9yIEZvcm1hdE1lc3NhZ2UoKSAqLworI2VuZGlmCisgIHNpemVfdCBidWZpZHg7CS8qIGluZGV4IGluIHNvYXAuYnVmW10gKi8KKyAgc2l6ZV90IGJ1ZmxlbjsJLyogbGVuZ3RoIG9mIHNvYXAuYnVmW10gY29udGVudCAqLworICBzb2FwX3djaGFyIGFoZWFkOwkvKiBwYXJzZXIgbG9va2FoZWFkICovCisgIHNob3J0IGNkYXRhOwkJLyogQ0RBVEEgcGFyc2VyIHN0YXRlICovCisgIHNob3J0IGJvZHk7CQkvKiBwYXJzZWQgWE1MIGVsZW1lbnQgaGFzIGEgYm9keSBvciBub3QgKi8KKyAgdW5zaWduZWQgaW50IGxldmVsOwkvKiBYTUwgbmVzdGluZyBsZXZlbCAqLworICBzaXplX3QgY291bnQ7CQkvKiBtZXNzYWdlIGxlbmd0aCBjb3VudGVyICovCisgIHNpemVfdCBsZW5ndGg7CS8qIG1lc3NhZ2UgbGVuZ3RoIGFzIHNldCBieSBIVFRQIGhlYWRlciAqLworI2lmZGVmIFdJVEhfRkFTVAorICBjaGFyICpsYWJidWY7CQkvKiBsb29rLWFzaWRlIGJ1ZmZlciAqLworICBzaXplX3QgbGFibGVuOwkvKiBsb29rLWFzaWRlIGJ1ZmZlciBhbGxvY2F0ZWQgbGVuZ3RoICovCisgIHNpemVfdCBsYWJpZHg7CS8qIGxvb2stYXNpZGUgYnVmZmVyIGluZGV4IHRvIGF2YWlsYWJsZSBwYXJ0ICovCisjZW5kaWYKKyAgY2hhciBidWZbU09BUF9CVUZMRU5dOy8qIHNlbmQgYW5kIHJlY2VpdmUgYnVmZmVyICovCisgIGNoYXIgdG1wYnVmWzEwMjRdOwkvKiBpbi9vdXRwdXQgYnVmZmVyIGZvciBIVFRQIGhlYWRlcnMsIHNpbXBsZVR5cGUgdmFsdWVzLCBhdHRyaWJ1dGUgbmFtZXMsIGFuZCBESU1FID49MTAyNCBieXRlcyAqLworICBjaGFyIG1zZ2J1ZlsxMDI0XTsJLyogb3V0cHV0IGJ1ZmZlciBmb3IgKGVycm9yKSBtZXNzYWdlcyA8PTEwMjQgYnl0ZXMgKi8KKyAgY2hhciB0YWdbU09BUF9UQUdMRU5dOworICBjaGFyIGlkW1NPQVBfVEFHTEVOXTsKKyAgY2hhciBocmVmW1NPQVBfVEFHTEVOXTsKKyAgY2hhciB0eXBlW1NPQVBfVEFHTEVOXTsKKyAgY2hhciBhcnJheVR5cGVbU09BUF9UQUdMRU5dOworICBjaGFyIGFycmF5U2l6ZVtTT0FQX1RBR0xFTl07CisgIGNoYXIgYXJyYXlPZmZzZXRbU09BUF9UQUdMRU5dOworICBzaG9ydCBvdGhlcjsKKyAgc2hvcnQgcG9zaXRpb247CisgIGludCBwb3NpdGlvbnNbU09BUF9NQVhESU1TXTsKKyAgc2hvcnQgcm9vdDsKKyAgc3RydWN0IHNvYXBfYXR0cmlidXRlICphdHRyaWJ1dGVzOwkvKiBhdHRyaWJ1dGUgbGlzdCAqLworICBzaG9ydCBlbmNvZGluZzsJLyogd2hlbiBzZXQsIG91dHB1dCBlbmNvZGluZ1N0eWxlICovCisgIHNob3J0IG11c3RVbmRlcnN0YW5kOwkvKiBhIG11c3RVbmRlcnN0YW5kIGVsZW1lbnQgd2FzIHBhcnNlZCBvciBpcyBvdXRwdXQgKi8KKyAgc2hvcnQga2VlcF9hbGl2ZTsJLyogY29ubmVjdGlvbiBzaG91bGQgYmUga2VwdCBvcGVuICovCisgIHNob3J0IG51bGw7CQkvKiBwYXJzZWQgWE1MIGlzIHhzaTpuaWwgKi8KKyAgc2hvcnQgbnM7CQkvKiB3aGVuIG5vdCBzZXQsIG91dHB1dCBmdWxsIHhtbG5zIGJpbmRpbmdzICovCisgIHNob3J0IHBhcnQ7CQkvKiBwYXJzaW5nIHN0YXRlICovCisgIHNob3J0IGFsbG9jZWQ7CisgIHNob3J0IHBlZWtlZDsKKyAgc2l6ZV90IGNodW5rc2l6ZTsKKyAgc2l6ZV90IGNodW5rYnVmbGVuOworICBjaGFyIGVuZHBvaW50W1NPQVBfVEFHTEVOXTsKKyAgY2hhciBwYXRoW1NPQVBfVEFHTEVOXTsKKyAgY2hhciBob3N0W1NPQVBfVEFHTEVOXTsKKyAgY2hhciAqYWN0aW9uOworICBjaGFyICphdXRocmVhbG07CQkvKiBIVFRQIGF1dGhlbnRpY2F0aW9uIHJlYWxtICovCisgIGNoYXIgKnByb2xvZzsJCQkvKiBYTUwgZGVjbGFyYXRpb24gcHJvbG9nICovCisgIHVuc2lnbmVkIGxvbmcgaXA7CQkvKiBJUCBudW1iZXIgKi8KKyAgaW50IHBvcnQ7CQkJLyogcG9ydCBudW1iZXIgKi8KKyAgdW5zaWduZWQgaW50IG1heF9rZWVwX2FsaXZlOworICBjb25zdCBjaGFyICpwcm94eV9ob3N0OwkvKiBQcm94eSBTZXJ2ZXIgaG9zdCBuYW1lICovCisgIGludCBwcm94eV9wb3J0OwkJLyogUHJveHkgU2VydmVyIHBvcnQgKGRlZmF1bHQgPSA4MDgwKSAqLworICBjb25zdCBjaGFyICpwcm94eV91c2VyaWQ7CS8qIFByb3h5IEF1dGhvcml6YXRpb24gdXNlciBuYW1lICovCisgIGNvbnN0IGNoYXIgKnByb3h5X3Bhc3N3ZDsJLyogUHJveHkgQXV0aG9yaXphdGlvbiBwYXNzd29yZCAqLworICBpbnQgc3RhdHVzOwkJCS8qIC0xIHdoZW4gcmVxdWVzdCwgZWxzZSBlcnJvciBjb2RlIHRvIGJlIHJldHVybmVkIGJ5IHNlcnZlciAqLworICBpbnQgZXJyb3I7CisgIGludCBlcnJtb2RlOworICBpbnQgZXJybnVtOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqZG9tOworICBzdHJ1Y3Qgc29hcF9kaW1lIGRpbWU7CisgIHN0cnVjdCBzb2FwX21pbWUgbWltZTsKKyAgc3RydWN0IHNvYXBfeGxpc3QgKnhsaXN0OworI2VuZGlmCisjaWYgIWRlZmluZWQoV0lUSF9MRUFOKSB8fCBkZWZpbmVkKFNPQVBfREVCVUcpCisgIGNvbnN0IGNoYXIgKmxvZ2ZpbGVbU09BUF9NQVhMT0dTXTsKKyAgRklMRSAqZmRlYnVnW1NPQVBfTUFYTE9HU107CisgIHN0cnVjdCBzb2FwX21saXN0ICptaHRbU09BUF9QVFJIQVNIXTsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgY29uc3QgY2hhciAqYzE0bmluY2x1ZGU7CisgIGNvbnN0IGNoYXIgKmMxNG5leGNsdWRlOworICBzdHJ1Y3Qgc29hcF9jb29raWUgKmNvb2tpZXM7CisgIGNvbnN0IGNoYXIgKmNvb2tpZV9kb21haW47CisgIGNvbnN0IGNoYXIgKmNvb2tpZV9wYXRoOworICBpbnQgY29va2llX21heDsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZmRlZiBXSVRIX0lQVjYKKyAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgcGVlcjsJLyogSVB2Njogc2V0IGJ5IHNvYXBfYWNjZXB0IGFuZCBieSBVRFAgcmVjdiAqLworI2Vsc2UKKyAgc3RydWN0IHNvY2thZGRyX2luIHBlZXI7CS8qIElQdjQ6IHNldCBieSBzb2FwX2Nvbm5lY3Qvc29hcF9hY2NlcHQgYW5kIGJ5IFVEUCByZWN2ICovCisjZW5kaWYKKyAgc2l6ZV90IHBlZXJsZW47CisjZW5kaWYKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgaW50ICgqZnNzbGF1dGgpKHN0cnVjdCBzb2FwKik7CisgIGludCAoKmZzc2x2ZXJpZnkpKGludCwgWDUwOV9TVE9SRV9DVFgqKTsKKyAgQklPICpiaW87CisgIFNTTCAqc3NsOworICBTU0xfQ1RYICpjdHg7CisgIHNob3J0IHJlcXVpcmVfc2VydmVyX2F1dGg7CisgIHNob3J0IHJlcXVpcmVfY2xpZW50X2F1dGg7CisgIHNob3J0IHJzYTsJCQkvKiB3aGVuIHNldCwgdXNlIFJTQSBpbnN0ZWFkIG9mIERIICovCisgIGNvbnN0IGNoYXIgKmtleWZpbGU7CisgIGNvbnN0IGNoYXIgKnBhc3N3b3JkOworICBjb25zdCBjaGFyICpkaGZpbGU7CisgIGNvbnN0IGNoYXIgKmNhZmlsZTsKKyAgY29uc3QgY2hhciAqY2FwYXRoOworICBjb25zdCBjaGFyICpjcmxmaWxlOworICBjb25zdCBjaGFyICpyYW5kZmlsZTsKKyAgU1NMX1NFU1NJT04gKnNlc3Npb247CisgIGNoYXIgc2Vzc2lvbl9ob3N0W1NPQVBfVEFHTEVOXTsKKyAgaW50IHNlc3Npb25fcG9ydDsKKyNlbmRpZgorI2lmZGVmIFdJVEhfWkxJQgorICBzaG9ydCB6bGliX3N0YXRlOwkJLyogU09BUF9aTElCX05PTkUsIFNPQVBfWkxJQl9ERUZMQVRFLCBvciBTT0FQX1pMSUJfSU5GTEFURSAqLworICBzaG9ydCB6bGliX2luOwkJLyogU09BUF9aTElCX05PTkUsIFNPQVBfWkxJQl9ERUZMQVRFLCBvciBTT0FQX1pMSUJfR1pJUCAqLworICBzaG9ydCB6bGliX291dDsJCS8qIFNPQVBfWkxJQl9OT05FLCBTT0FQX1pMSUJfREVGTEFURSwgb3IgU09BUF9aTElCX0daSVAgKi8KKyAgel9zdHJlYW0gZF9zdHJlYW07CQkvKiBkZWNvbXByZXNzaW9uIHN0cmVhbSAqLworICBjaGFyIHpfYnVmW1NPQVBfQlVGTEVOXTsJLyogYnVmZmVyICovCisgIHNpemVfdCB6X2J1ZmxlbjsKKyAgdW5zaWduZWQgc2hvcnQgel9sZXZlbDsJLyogY29tcHJlc3Npb24gbGV2ZWwgdG8gYmUgdXNlZCAoMD1ub25lLCAxPWZhc3QgdG8gOT1iZXN0KSAqLworICB1TG9uZyB6X2NyYzsJCQkvKiBpbnRlcm5hbCBnemlwIGNyYyAqLworICBmbG9hdCB6X3JhdGlvX2luOwkJLyogZGV0ZWN0ZWQgY29tcHJlc3Npb24gcmF0aW8gY29tcHJlc3NlZF9sZW5ndGgvbGVuZ3RoIG9mIGluYm91bmQgbWVzc2FnZSAqLworICBmbG9hdCB6X3JhdGlvX291dDsJCS8qIGRldGVjdGVkIGNvbXByZXNzaW9uIHJhdGlvIGNvbXByZXNzZWRfbGVuZ3RoL2xlbmd0aCBvZiBvdXRib3VuZCBtZXNzYWdlICovCisjZW5kaWYKKyNpZmRlZiBXTVdfUlBNX0lPCisgIHZvaWQgKnJwbXJlcWlkOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorI2lmZGVmIF9fY3BsdXNwbHVzCisgIHNvYXAoKTsKKyAgc29hcChzb2FwX21vZGUpOworICBzb2FwKHNvYXBfbW9kZSwgc29hcF9tb2RlKTsKKyAgc29hcChzdHJ1Y3Qgc29hcCYpOworICB+c29hcCgpOworI2VuZGlmCisjZW5kaWYKK307CisKK3N0cnVjdCBzb2FwX2NvZGVfbWFwCit7IGxvbmcgY29kZTsKKyAgY29uc3QgY2hhciAqc3RyaW5nOworfTsKKworLyogZm9yd2FyZGluZyBsaXN0ICovCitzdHJ1Y3Qgc29hcF9mbGlzdAoreyBzdHJ1Y3Qgc29hcF9mbGlzdCAqbmV4dDsKKyAgaW50IHR5cGU7CisgIHZvaWQgKnB0cjsKKyAgdW5zaWduZWQgaW50IGxldmVsOworICBzaXplX3QgbGVuOworICB2b2lkICgqZmNvcHkpKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBzaXplX3QsIGNvbnN0IHZvaWQqLCBzaXplX3QpOworfTsKKworLyogaWQtcmVmIGZvcndhcmRpbmcgbGlzdCAqLworc3RydWN0IHNvYXBfaWxpc3QKK3sgc3RydWN0IHNvYXBfaWxpc3QgKm5leHQ7CisgIGludCB0eXBlOworICBzaXplX3Qgc2l6ZTsKKyAgdm9pZCAqbGluazsKKyAgdm9pZCAqY29weTsKKyAgc3RydWN0IHNvYXBfZmxpc3QgKmZsaXN0OworICB2b2lkICpwdHI7CisgIHVuc2lnbmVkIGludCBsZXZlbDsKKyAgY2hhciBpZFsxXTsgLyogdGhlIGFjdHVhbCBpZCBzdHJpbmcgdmFsdWUgZmxvd3MgaW50byB0aGUgYWxsb2NhdGVkIHJlZ2lvbiBiZWxvdyB0aGlzIHN0cnVjdCAqLworfTsKKworc3RydWN0IHNvYXBfcGx1Z2luCit7IHN0cnVjdCBzb2FwX3BsdWdpbiAqbmV4dDsKKyAgY29uc3QgY2hhciAqaWQ7CisgIHZvaWQgKmRhdGE7CisgIGludCAoKmZjb3B5KShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGx1Z2luICpkc3QsIHN0cnVjdCBzb2FwX3BsdWdpbiAqc3JjKTsKKyAgdm9pZCAoKmZkZWxldGUpKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnApOyAvKiBzaG91bGQgZGVsZXRlIGZpZWxkcyBvZiBwbHVnaW4gb25seSBhbmQgbm90IGZyZWUocCkgKi8KK307CisKKyNpZm5kZWYgV0lUSF9OT05BTUVTUEFDRVMKK2V4dGVybiBTT0FQX05NQUMgc3RydWN0IE5hbWVzcGFjZSBuYW1lc3BhY2VzW107CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU4KKyMgZGVmaW5lIHNvYXBfZ2V0MChzb2FwKSAoKChzb2FwKS0+YnVmaWR4Pj0oc29hcCktPmJ1ZmxlbiAmJiBzb2FwX3JlY3Yoc29hcCkpID8gRU9GIDogKHVuc2lnbmVkIGNoYXIpKHNvYXApLT5idWZbKHNvYXApLT5idWZpZHhdKQorIyBkZWZpbmUgc29hcF9nZXQxKHNvYXApICgoKHNvYXApLT5idWZpZHg+PShzb2FwKS0+YnVmbGVuICYmIHNvYXBfcmVjdihzb2FwKSkgPyBFT0YgOiAodW5zaWduZWQgY2hhcikoc29hcCktPmJ1Zlsoc29hcCktPmJ1ZmlkeCsrXSkKKyNlbHNlCitzb2FwX3djaGFyIHNvYXBfZ2V0MChzdHJ1Y3Qgc29hcCopOworc29hcF93Y2hhciBzb2FwX2dldDEoc3RydWN0IHNvYXAqKTsKKyNlbmRpZgorCisjZGVmaW5lIHNvYXBfcmV2Z2V0MShzb2FwKSAoKHNvYXApLT5idWZpZHgtLSkKKyNkZWZpbmUgc29hcF91bmdldChzb2FwLCBjKSAoKHNvYXApLT5haGVhZCA9IGMpCisjZGVmaW5lIHNvYXBfcmVnaXN0ZXJfcGx1Z2luKHNvYXAsIHBsdWdpbikgc29hcF9yZWdpc3Rlcl9wbHVnaW5fYXJnKHNvYXAsIHBsdWdpbiwgTlVMTCkKKyNkZWZpbmUgc29hcF9pbW9kZShzb2FwLCBuKSAoKHNvYXApLT5tb2RlID0gKHNvYXApLT5pbW9kZSA9IChuKSkKKyNkZWZpbmUgc29hcF9zZXRfaW1vZGUoc29hcCwgbikgKChzb2FwKS0+aW1vZGUgfD0gKG4pKQorI2RlZmluZSBzb2FwX2Nscl9pbW9kZShzb2FwLCBuKSAoKHNvYXApLT5pbW9kZSAmPSB+KG4pKQorI2RlZmluZSBzb2FwX29tb2RlKHNvYXAsIG4pICgoc29hcCktPm1vZGUgPSAoc29hcCktPm9tb2RlID0gKG4pKQorI2RlZmluZSBzb2FwX3NldF9vbW9kZShzb2FwLCBuKSAoKHNvYXApLT5vbW9kZSB8PSAobikpCisjZGVmaW5lIHNvYXBfY2xyX29tb2RlKHNvYXAsIG4pICgoc29hcCktPm9tb2RlICY9IH4obikpCisjZGVmaW5lIHNvYXBfc2V0X21vZGUoc29hcCwgbikgKChzb2FwKS0+aW1vZGUgfD0gKG4pLCAoc29hcCktPm9tb2RlIHw9IChuKSkKKyNkZWZpbmUgc29hcF9jbHJfbW9kZShzb2FwLCBuKSAoKHNvYXApLT5pbW9kZSAmPSB+KG4pLCAoc29hcCktPm9tb2RlICY9IH4obikpCisjZGVmaW5lIHNvYXBfZGVzdHJveShzb2FwKSBzb2FwX2RlbGV0ZSgoc29hcCksIE5VTEwpCisKKyNpZmRlZiBIQVZFX1NUUlJDSFIKKyMgZGVmaW5lIHNvYXBfc3RycmNocihzLCB0KSBzdHJyY2hyKHMsIHQpCisjZWxzZQorIFNPQVBfRk1BQzEgY2hhciogU09BUF9GTUFDMiBzb2FwX3N0cnJjaHIoY29uc3QgY2hhciAqcywgaW50IHQpOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NUUlRPTAorIyBkZWZpbmUgc29hcF9zdHJ0b2wocywgdCwgYikgc3RydG9sKHMsIHQsIGIpCisjZWxzZQorIFNPQVBfRk1BQzEgbG9uZyBTT0FQX0ZNQUMyIHNvYXBfc3RydG9sKGNvbnN0IGNoYXIgKnMsIGNoYXIgKip0LCBpbnQgYik7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RSVE9VTAorIyBkZWZpbmUgc29hcF9zdHJ0b3VsKHMsIHQsIGIpIHN0cnRvdWwocywgdCwgYikKKyNlbHNlCisgU09BUF9GTUFDMSB1bnNpZ25lZCBsb25nIFNPQVBfRk1BQzIgc29hcF9zdHJ0b3VsKGNvbnN0IGNoYXIgKnMsIGNoYXIgKip0LCBpbnQgYik7CisjZW5kaWYKKworI2lmIGRlZmluZWQoV0lUSF9PUEVOU1NMKQorIyBkZWZpbmUgc29hcF9yYW5kb20gc29hcF9yYW5kKCkKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9yYW5kKCk7CisjZWxpZiBkZWZpbmVkKEhBVkVfUkFORE9NKQorIyBkZWZpbmUgc29hcF9yYW5kb20gKGludClyYW5kb20oKQorI2Vsc2UKKyMgZGVmaW5lIHNvYXBfcmFuZG9tIHJhbmQoKQorI2VuZGlmCisKKyNpZmRlZiBXSVRIX05PSURSRUYKKyMgZGVmaW5lIHNvYXBfZW1iZWRkZWQocywgcCwgdCkgKDApCisjIGRlZmluZSBzb2FwX2lkX2xvb2t1cChzLCBpLCBwLCB0LCBuLCBrKSAocCkKKyMgZGVmaW5lIHNvYXBfaWRfZm9yd2FyZChzLCBoLCBwLCBsZW4sIHN0LCB0dCwgbiwgaywgZmMpIChwKQorIyBkZWZpbmUgc29hcF9yZWZlcmVuY2UocywgYSwgdCkgKDEpCisjIGRlZmluZSBzb2FwX2FycmF5X3JlZmVyZW5jZShzLCBwLCBhLCBuLCB0KSAoMSkKKyMgZGVmaW5lIHNvYXBfZW1iZWQocywgcCwgYSwgbiwgdCwgcHApICgwKQorIyBkZWZpbmUgc29hcF9lbWJlZGRlZF9pZChzLCBpLCBwLCB0KSAoaSkKKyMgZGVmaW5lIHNvYXBfaXNfZW1iZWRkZWQocywgcCkgKDApCisjIGRlZmluZSBzb2FwX2lzX3NpbmdsZShzLCBwKSAoMSkKKyMgZGVmaW5lIHNvYXBfbG9va3VwX3R5cGUocywgaSkgKDApCisjIGRlZmluZSBzb2FwX2dldGluZGVwZW5kZW50KHMpICgwKQorIyBkZWZpbmUgc29hcF9wdXRpbmRlcGVuZGVudChzKSAoMCkKKyMgZGVmaW5lIHNvYXBfZ2V0ZWxlbWVudChzLCBuKSAobikKKyMgZGVmaW5lIHNvYXBfcHV0ZWxlbWVudChzLCBwLCB0LCBpLCBuKSAoMCkKKyMgZGVmaW5lIHNvYXBfbWFya2VsZW1lbnQocywgcCwgbikgKDApCisjZW5kaWYKKworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9mYXVsdChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiogU09BUF9GTUFDMiBzb2FwX2ZhdWx0Y29kZShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiogU09BUF9GTUFDMiBzb2FwX2ZhdWx0c3ViY29kZShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiogU09BUF9GTUFDMiBzb2FwX2ZhdWx0c3RyaW5nKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqKiBTT0FQX0ZNQUMyIHNvYXBfZmF1bHRkZXRhaWwoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfc2VyaWFsaXplaGVhZGVyKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0aGVhZGVyKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZ2V0aGVhZGVyKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NlcmlhbGl6ZWZhdWx0KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0ZmF1bHQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRmYXVsdChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NzbF9pbml0KCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcG9sbChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2Nvbm5lY3RfY29tbWFuZChzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9jb25uZWN0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9iaW5kKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9hY2NlcHQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zc2xfYWNjZXB0KHN0cnVjdCBzb2FwKik7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zc2xfc2VydmVyX2NvbnRleHQoc3RydWN0IHNvYXAqLCB1bnNpZ25lZCBzaG9ydCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NzbF9jbGllbnRfY29udGV4dChzdHJ1Y3Qgc29hcCosIHVuc2lnbmVkIHNob3J0LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0aHR0cGhkcihzdHJ1Y3Qgc29hcCosIGludCBzdGF0dXMsIHNpemVfdCBjb3VudCk7CisKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX2RlY29kZV9rZXkoY2hhciosIHNpemVfdCwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfZGVjb2RlX3ZhbChjaGFyKiwgc2l6ZV90LCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzEgc2l6ZV90IFNPQVBfRk1BQzIgc29hcF9oYXNoKGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfc2V0X2VuZHBvaW50KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2ZsdXNoX3JhdyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2ZsdXNoKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHNvYXBfd2NoYXIgU09BUF9GTUFDMiBzb2FwX2dldChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBzb2FwX3djaGFyIFNPQVBfRk1BQzIgc29hcF9nZXRjaGFyKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfdGFnX2NtcChjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXRfZmF1bHQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZW5kZXJfZmF1bHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NlbmRlcl9mYXVsdF9zdWJjb2RlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcmVjZWl2ZXJfZmF1bHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3JlY2VpdmVyX2ZhdWx0X3N1YmNvZGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgaW50KTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NlbmRfcmF3KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHNpemVfdCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcmVjdl9yYXcoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9yZWN2KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2VuZChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZW5kMihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2VuZDMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3B1dHV0Zjgoc3RydWN0IHNvYXAqLCB1bnNpZ25lZCBsb25nKTsKK1NPQVBfRk1BQzEgc29hcF93Y2hhciBTT0FQX0ZNQUMyIHNvYXBfZ2V0dXRmOChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0YmFzZTY0KHN0cnVjdCBzb2FwKiwgY29uc3QgdW5zaWduZWQgY2hhciosIGludCk7CitTT0FQX0ZNQUMxIHVuc2lnbmVkIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9nZXRiYXNlNjQoc3RydWN0IHNvYXAqLCBpbnQqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3B1dGhleChzdHJ1Y3Qgc29hcCosIGNvbnN0IHVuc2lnbmVkIGNoYXIqLCBpbnQpOworU09BUF9GTUFDMSB1bnNpZ25lZCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfZ2V0aGV4KHN0cnVjdCBzb2FwKiwgaW50Kik7CisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF94b3BfZm9yd2FyZChzdHJ1Y3Qgc29hcCosIHVuc2lnbmVkIGNoYXIqKiwgaW50KiwgY2hhcioqLCBjaGFyKiosIGNoYXIqKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZGltZV9mb3J3YXJkKHN0cnVjdCBzb2FwKiwgdW5zaWduZWQgY2hhcioqLCBpbnQqLCBjaGFyKiosIGNoYXIqKiwgY2hhcioqKTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3BvaW50ZXJfbG9va3VwX2lkKHN0cnVjdCBzb2FwKiwgdm9pZCAqcCwgaW50IHQsIHN0cnVjdCBzb2FwX3BsaXN0KiopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3BvaW50ZXJfbG9va3VwKHN0cnVjdCBzb2FwKiwgY29uc3Qgdm9pZCAqcCwgaW50IHQsIHN0cnVjdCBzb2FwX3BsaXN0KiopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3BvaW50ZXJfZW50ZXIoc3RydWN0IHNvYXAqLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGludCB0LCBzdHJ1Y3Qgc29hcF9wbGlzdCoqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9hcnJheV9wb2ludGVyX2xvb2t1cChzdHJ1Y3Qgc29hcCosIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgbiwgaW50IHQsIHN0cnVjdCBzb2FwX3BsaXN0KiopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VtYmVkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGNvbnN0IGNoYXIgKnRhZywgaW50IHR5cGUpOworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcF9pbGlzdCogU09BUF9GTUFDMiBzb2FwX2xvb2t1cChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgc3RydWN0IHNvYXBfaWxpc3QqIFNPQVBfRk1BQzIgc29hcF9lbnRlcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9yZXNvbHZlKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2VtYmVkZGVkKHN0cnVjdCBzb2FwKiwgY29uc3Qgdm9pZCAqcCwgaW50IHQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3JlZmVyZW5jZShzdHJ1Y3Qgc29hcCosIGNvbnN0IHZvaWQgKnAsIGludCB0KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9hcnJheV9yZWZlcmVuY2Uoc3RydWN0IHNvYXAqLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGludCB0KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbWJlZGRlZF9pZChzdHJ1Y3Qgc29hcCosIGludCBpZCwgY29uc3Qgdm9pZCAqcCwgaW50IHQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2lzX2VtYmVkZGVkKHN0cnVjdCBzb2FwKiwgc3RydWN0IHNvYXBfcGxpc3QqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9pc19zaW5nbGUoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9wbGlzdCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXRfZW1iZWRkZWQoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9wbGlzdCopOworI2VuZGlmCisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9iZWdpbl9jb3VudChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VuZF9jb3VudChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2JlZ2luX3NlbmQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbmRfc2VuZChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwKiBTT0FQX0ZNQUMyIHNvYXBfY29kZShjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCosIGNvbnN0IGNoYXIgKnN0cik7CitTT0FQX0ZNQUMxIGxvbmcgU09BUF9GTUFDMiBzb2FwX2ludF9jb2RlKGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwKiwgY29uc3QgY2hhciAqc3RyLCBsb25nIG90aGVyKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX3N0cl9jb2RlKGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwKiwgbG9uZyBjb2RlKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2dldGxpbmUoc3RydWN0IHNvYXAqLCBjaGFyKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9iZWdpbl9yZWN2KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZW5kX3JlY3Yoc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMSB2b2lkKiBTT0FQX0ZNQUMyIHNvYXBfbWFsbG9jKHN0cnVjdCBzb2FwKiwgc2l6ZV90KTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfZGVhbGxvYyhzdHJ1Y3Qgc29hcCosIHZvaWQqKTsKK1NPQVBfRk1BQzEgc3RydWN0IHNvYXBfY2xpc3QgKiBTT0FQX0ZNQUMyIHNvYXBfbGluayhzdHJ1Y3Qgc29hcCosIHZvaWQqLCBpbnQsIGludCwgdm9pZCAoKmZkZWxldGUpKHN0cnVjdCBzb2FwX2NsaXN0KikpOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF91bmxpbmsoc3RydWN0IHNvYXAqLCBjb25zdCB2b2lkKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2ZyZWUoc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMSB2b2lkKiBTT0FQX0ZNQUMyIHNvYXBfdHJhY2tfbWFsbG9jKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgc2l6ZV90KTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfdHJhY2tfZnJlZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIHZvaWQqKTsKKworI2lmbmRlZiBXSVRIX05PSURSRUYKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9sb29rdXBfdHlwZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKmlkKTsKK1NPQVBfRk1BQzEgdm9pZCogU09BUF9GTUFDMiBzb2FwX2lkX2xvb2t1cChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKmlkLCB2b2lkICoqcCwgaW50IHQsIHNpemVfdCBuLCB1bnNpZ25lZCBpbnQgayk7CitTT0FQX0ZNQUMxIHZvaWQqIFNPQVBfRk1BQzIgc29hcF9pZF9mb3J3YXJkKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqaWQsIHZvaWQgKnAsIHNpemVfdCBsZW4sIGludCBzdCwgaW50IHR0LCBzaXplX3QgbiwgdW5zaWduZWQgaW50IGssIHZvaWQoKmZjb3B5KShzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgc2l6ZV90LCBjb25zdCB2b2lkKiwgc2l6ZV90KSk7CisjZW5kaWYKK1NPQVBfRk1BQzEgdm9pZCogU09BUF9GTUFDMiBzb2FwX2lkX2VudGVyKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqaWQsIHZvaWQgKnAsIGludCB0LCBzaXplX3QgbiwgdW5zaWduZWQgaW50IGssIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmFycmF5VHlwZSwgdm9pZCAqKCpmaW5zdGFudGlhdGUpKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfZmNvcHkoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdCwgaW50IHR0LCB2b2lkICpwLCBzaXplX3QsIGNvbnN0IHZvaWQgKnEsIHNpemVfdCBuKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NpemUoY29uc3QgaW50ICosIGludCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZ2V0b2Zmc2V0cyhjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBpbnQgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRzaXplKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQgKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZ2V0c2l6ZXMoY29uc3QgY2hhciAqLCBpbnQgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRwb3NpdGlvbihjb25zdCBjaGFyICosIGludCAqKTsKKworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfcHV0c2l6ZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgY2hhciogU09BUF9GTUFDMiBzb2FwX3B1dHNpemVzb2Zmc2V0cyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBpbnQpOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfcHV0c2l6ZXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBpbnQpOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfcHV0b2Zmc2V0KHN0cnVjdCBzb2FwKiwgaW50KTsKK1NPQVBfRk1BQzEgY2hhciogU09BUF9GTUFDMiBzb2FwX3B1dG9mZnNldHMoc3RydWN0IHNvYXAqLCBjb25zdCBpbnQgKiwgaW50KTsKKyAKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9jbG9zZXNvY2soc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcCAqU09BUF9GTUFDMiBzb2FwX25ldyh2b2lkKTsKK1NPQVBfRk1BQzEgc3RydWN0IHNvYXAgKlNPQVBfRk1BQzIgc29hcF9uZXcxKHNvYXBfbW9kZSk7CitTT0FQX0ZNQUMxIHN0cnVjdCBzb2FwICpTT0FQX0ZNQUMyIHNvYXBfbmV3Mihzb2FwX21vZGUsIHNvYXBfbW9kZSk7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2RlbChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcCAqU09BUF9GTUFDMiBzb2FwX2NvcHkoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgc3RydWN0IHNvYXAgKlNPQVBfRk1BQzIgc29hcF9jb3B5X2NvbnRleHQoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9pbml0KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2luaXQxKHN0cnVjdCBzb2FwKiwgc29hcF9tb2RlKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfaW5pdDIoc3RydWN0IHNvYXAqLCBzb2FwX21vZGUsIHNvYXBfbW9kZSk7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2RvbmUoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfY2xlYW51cChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9iZWdpbihzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9lbmQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfZGVsZXRlKHN0cnVjdCBzb2FwKiwgdm9pZCopOworCisjaWZkZWYgU09BUF9ERUJVRworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXRfcmVjdl9sb2dmaWxlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXRfc2VudF9sb2dmaWxlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXRfdGVzdF9sb2dmaWxlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9jbG9zZV9sb2dmaWxlcyhzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9vcGVuX2xvZ2ZpbGUoc3RydWN0IHNvYXAqLCBpbnQpOworI2VuZGlmCisKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX3Rva2VuKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF92YWx1ZShzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfbWF0Y2hfdGFnKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfbWF0Y2hfYXJyYXkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbGVtZW50KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnR5cGUpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2FycmF5X2JlZ2luX291dChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICpvZmZzZXQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfcmVmKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGludCBocmVmKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbGVtZW50X2hyZWYoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgY2hhciAqcmVmLCBjb25zdCBjaGFyICp2YWwpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfbnVsbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICp0eXBlKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbGVtZW50X2lkKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgZCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfcmVzdWx0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbGVtZW50X2VuZF9vdXQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZyk7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9hdHRyaWJ1dGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZWxlbWVudF9iZWdpbl9pbihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IG5pbGxhYmxlKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfZW5kX2luKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3BlZWtfZWxlbWVudChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3JldHJ5KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3JldmVydChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9zdHJkdXAoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIgKiBTT0FQX0ZNQUMyIHNvYXBfc3Ryc2VhcmNoKGNvbnN0IGNoYXIgKmJpZywgY29uc3QgY2hhciAqbGl0dGxlKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3N0cmluZ19vdXQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICpzLCBpbnQgZmxhZyk7CitTT0FQX0ZNQUMxIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9zdHJpbmdfaW4oc3RydWN0IHNvYXAqLCBpbnQsIGxvbmcsIGxvbmcpOworCisjaWZuZGVmIFdJVEhfTEVBTkVSCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfd3N0cmluZ19vdXQoc3RydWN0IHNvYXAqLCBjb25zdCB3Y2hhcl90ICpzLCBpbnQgZmxhZyk7CitTT0FQX0ZNQUMxIHdjaGFyX3QqIFNPQVBfRk1BQzIgc29hcF93c3RyaW5nX2luKHN0cnVjdCBzb2FwKiwgaW50LCBsb25nLCBsb25nKTsKKyNlbmRpZgorCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfbWF0Y2hfbmFtZXNwYWNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyKiwgaW50IG4xLCBpbnQgbjIpOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2V0X25hbWVzcGFjZXMoc3RydWN0IHNvYXAqLCBzdHJ1Y3QgTmFtZXNwYWNlKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NldF9sb2NhbF9uYW1lc3BhY2VzKHN0cnVjdCBzb2FwKik7CisKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfcG9wX25hbWVzcGFjZShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3B1c2hfbmFtZXNwYWNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9jdXJyZW50X25hbWVzcGFjZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3N0b3JlX2xhYihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2FwcGVuZF9sYWIoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc2l6ZV90KTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX25ld19ibG9jayhzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSB2b2lkKiBTT0FQX0ZNQUMyIHNvYXBfcHVzaF9ibG9jayhzdHJ1Y3Qgc29hcCosIHNpemVfdCk7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3BvcF9ibG9jayhzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBzaXplX3QgU09BUF9GTUFDMiBzb2FwX3NpemVfYmxvY2soc3RydWN0IHNvYXAqLCBzaXplX3QpOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfZmlyc3RfYmxvY2soc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgY2hhciogU09BUF9GTUFDMiBzb2FwX25leHRfYmxvY2soc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgc2l6ZV90IFNPQVBfRk1BQzIgc29hcF9ibG9ja19zaXplKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9zYXZlX2Jsb2NrKHN0cnVjdCBzb2FwKiwgY2hhciosIGludCk7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2VuZF9ibG9jayhzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZW52ZWxvcGVfYmVnaW5fb3V0KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBzb2FwX2VudmVsb3BlX2VuZF9vdXQoc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VudmVsb3BlX2JlZ2luX2luKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZW52ZWxvcGVfZW5kX2luKHN0cnVjdCBzb2FwKik7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9ib2R5X2JlZ2luX291dChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2JvZHlfZW5kX291dChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfYm9keV9iZWdpbl9pbihzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2JvZHlfZW5kX2luKHN0cnVjdCBzb2FwKik7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9yZWN2X2hlYWRlcihzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcmVzcG9uc2Uoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2VuZF9lbXB0eV9yZXNwb25zZShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3JlY3ZfZW1wdHlfcmVzcG9uc2Uoc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NlbmRfZmF1bHQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9yZWN2X2ZhdWx0KHN0cnVjdCBzb2FwKik7CisKKyNpZm5kZWYgV0lUSF9OT1NURExJQgorU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9wcmludF9mYXVsdChzdHJ1Y3Qgc29hcCosIEZJTEUqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfcHJpbnRfZmF1bHRfbG9jYXRpb24oc3RydWN0IHNvYXAqLCBGSUxFKik7CisjZW5kaWYKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MyYnl0ZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjaGFyKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfczJzaG9ydChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaG9ydCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MyaW50KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MybG9uZyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBsb25nKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfczJMT05HNjQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgTE9ORzY0Kik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfczJmbG9hdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBmbG9hdCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MyZG91YmxlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGRvdWJsZSopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MydW5zaWduZWRCeXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVuc2lnbmVkIGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zMnVuc2lnbmVkU2hvcnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdW5zaWduZWQgc2hvcnQqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zMnVuc2lnbmVkSW50KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVuc2lnbmVkIGludCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MydW5zaWduZWRMb25nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVuc2lnbmVkIGxvbmcqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zMlVMT05HNjQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgVUxPTkc2NCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3Myc3RyaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNoYXIqKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfczJRTmFtZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjaGFyKiopOworCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3Myd2NoYXIoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgd2NoYXJfdCoqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zMmRhdGVUaW1lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHRpbWVfdCopOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfczJiYXNlNjQoc3RydWN0IHNvYXAqLCBjb25zdCB1bnNpZ25lZCBjaGFyKiwgY2hhciosIGludCk7CitTT0FQX0ZNQUMxIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9zMmhleChzdHJ1Y3Qgc29hcCosIGNvbnN0IHVuc2lnbmVkIGNoYXIqLCBjaGFyKiwgaW50KTsKKyNlbmRpZgorCitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9ieXRlMnMoc3RydWN0IHNvYXAqLCBjaGFyKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX3Nob3J0MnMoc3RydWN0IHNvYXAqLCBzaG9ydCk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9pbnQycyhzdHJ1Y3Qgc29hcCosIGludCk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9sb25nMnMoc3RydWN0IHNvYXAqLCBsb25nKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX0xPTkc2NDJzKHN0cnVjdCBzb2FwKiwgTE9ORzY0KTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX2Zsb2F0MnMoc3RydWN0IHNvYXAqLCBmbG9hdCk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9kb3VibGUycyhzdHJ1Y3Qgc29hcCosIGRvdWJsZSk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF91bnNpZ25lZEJ5dGUycyhzdHJ1Y3Qgc29hcCosIHVuc2lnbmVkIGNoYXIpOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfdW5zaWduZWRTaG9ydDJzKHN0cnVjdCBzb2FwKiwgdW5zaWduZWQgc2hvcnQpOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfdW5zaWduZWRJbnQycyhzdHJ1Y3Qgc29hcCosIHVuc2lnbmVkIGludCk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF91bnNpZ25lZExvbmcycyhzdHJ1Y3Qgc29hcCosIHVuc2lnbmVkIGxvbmcpOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfVUxPTkc2NDJzKHN0cnVjdCBzb2FwKiwgVUxPTkc2NCk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9RTmFtZTJzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfd2NoYXIycyhzdHJ1Y3Qgc29hcCosIGNvbnN0IHdjaGFyX3QqKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX2RhdGVUaW1lMnMoc3RydWN0IHNvYXAqLCB0aW1lX3QpOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfYmFzZTY0MnMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY2hhciosIHNpemVfdCwgaW50Kik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9oZXgycyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjaGFyKiwgc2l6ZV90LCBpbnQqKTsKKyNlbmRpZgorCisKK1NPQVBfRk1BQzEgaW50KiBTT0FQX0ZNQUMyIHNvYXBfaW5pbnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfaW5ieXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBjaGFyICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGxvbmcqIFNPQVBfRk1BQzIgc29hcF9pbmxvbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGxvbmcgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgTE9ORzY0KiBTT0FQX0ZNQUMyIHNvYXBfaW5MT05HNjQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIExPTkc2NCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBzaG9ydCogU09BUF9GTUFDMiBzb2FwX2luc2hvcnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHNob3J0ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGZsb2F0KiBTT0FQX0ZNQUMyIHNvYXBfaW5mbG9hdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgZmxvYXQgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgZG91YmxlKiBTT0FQX0ZNQUMyIHNvYXBfaW5kb3VibGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGRvdWJsZSAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSB1bnNpZ25lZCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfaW51bnNpZ25lZEJ5dGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIGNoYXIgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgdW5zaWduZWQgc2hvcnQqIFNPQVBfRk1BQzIgc29hcF9pbnVuc2lnbmVkU2hvcnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIHNob3J0ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIHVuc2lnbmVkIGludCogU09BUF9GTUFDMiBzb2FwX2ludW5zaWduZWRJbnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIGludCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSB1bnNpZ25lZCBsb25nKiBTT0FQX0ZNQUMyIHNvYXBfaW51bnNpZ25lZExvbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIGxvbmcgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgVUxPTkc2NCogU09BUF9GTUFDMiBzb2FwX2luVUxPTkc2NChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgVUxPTkc2NCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBjaGFyKiogU09BUF9GTUFDMiBzb2FwX2luc3RyaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBjaGFyICoqcCwgY29uc3QgY2hhciAqLCBpbnQsIGludCwgbG9uZywgbG9uZyk7CitTT0FQX0ZNQUMxIGNoYXIqKiBTT0FQX0ZNQUMyIHNvYXBfaW5saXRlcmFsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBjaGFyICoqcCk7CisKKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxIHRpbWVfdCogU09BUF9GTUFDMiBzb2FwX2luZGF0ZVRpbWUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHRpbWVfdCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK1NPQVBfRk1BQzEgd2NoYXJfdCoqIFNPQVBfRk1BQzIgc29hcF9pbndzdHJpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHdjaGFyX3QgKipwLCBjb25zdCBjaGFyICosIGludCwgbG9uZywgbG9uZyk7CitTT0FQX0ZNQUMxIHdjaGFyX3QqKiBTT0FQX0ZNQUMyIHNvYXBfaW53bGl0ZXJhbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgd2NoYXJfdCAqKnApOworI2VuZGlmCisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRieXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRzaG9ydChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzaG9ydCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dGludChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBpbnQgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRsb25nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGxvbmcgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRMT05HNjQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgTE9ORzY0ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0ZmxvYXQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgZmxvYXQgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRkb3VibGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgZG91YmxlICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0dW5zaWduZWRCeXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXR1bnNpZ25lZFNob3J0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIHNob3J0ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0dW5zaWduZWRJbnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgdW5zaWduZWQgaW50ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0dW5zaWduZWRMb25nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRVTE9ORzY0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IFVMT05HNjQgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRzdHJpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY2hhciAqY29uc3QqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dGxpdGVyYWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGNoYXIgKmNvbnN0KnApOworCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dGRhdGVUaW1lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHRpbWVfdCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXR3c3RyaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIHdjaGFyX3QgKmNvbnN0KnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXR3bGl0ZXJhbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgd2NoYXJfdCAqY29uc3QqcCk7CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU5FUgorU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2F0dGFjaG1lbnQoc3RydWN0IHNvYXAgKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgdm9pZCosIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBjaGFyKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9tb3ZlKHN0cnVjdCBzb2FwKiwgbG9uZyk7CitTT0FQX0ZNQUMxIHNpemVfdCBTT0FQX0ZNQUMyIHNvYXBfdGVsbChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfZGltZV9vcHRpb24oc3RydWN0IHNvYXAqLCB1bnNpZ25lZCBzaG9ydCwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2dldGRpbWVoZHIoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRkaW1lKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0ZGltZWhkcihzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3B1dGRpbWUoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRtaW1laGRyKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZ2V0bWltZShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3B1dG1pbWVoZHIoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9wdXRtaW1lKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NldF9kaW1lKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NldF9taW1lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqYm91bmRhcnksIGNvbnN0IGNoYXIgKnN0YXJ0KTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfY2xyX2RpbWUoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfY2xyX21pbWUoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZXRfZGltZV9hdHRhY2htZW50KHN0cnVjdCBzb2FwKiwgY2hhciAqcHRyLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqaWQsIHVuc2lnbmVkIHNob3J0IG9wdHlwZSwgY29uc3QgY2hhciAqb3B0aW9uKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZXRfbWltZV9hdHRhY2htZW50KHN0cnVjdCBzb2FwKiwgY2hhciAqcHRyLCBzaXplX3Qgc2l6ZSwgZW51bSBzb2FwX21pbWVfZW5jb2RpbmcgZW5jb2RpbmcsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICpsb2NhdGlvbiwgY29uc3QgY2hhciAqZGVzY3JpcHRpb24pOworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqIFNPQVBfRk1BQzIgc29hcF9uZXh0X211bHRpcGFydChzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKTsKKyNlbmRpZgorCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcmVnaXN0ZXJfcGx1Z2luX2FyZyhzdHJ1Y3Qgc29hcCosIGludCAoKmZjcmVhdGUpKHN0cnVjdCBzb2FwKiwgc3RydWN0IHNvYXBfcGx1Z2luKiwgdm9pZCopLCB2b2lkKik7CitTT0FQX0ZNQUMxIHZvaWQqIFNPQVBfRk1BQzIgc29hcF9sb29rdXBfcGx1Z2luKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9hdHRyX3ZhbHVlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgZmxhZyk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2V0X2F0dHIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfY2xyX2F0dHIoc3RydWN0IHNvYXAgKnNvYXApOworCisjaWZkZWYgV0lUSF9DT09LSUVTCitTT0FQX0ZNQUMxIHNpemVfdCBTT0FQX0ZNQUMyIHNvYXBfZW5jb2RlX2Nvb2tpZShjb25zdCBjaGFyKiwgY2hhciosIHNpemVfdCk7CitTT0FQX0ZNQUMxIGV4dGVybiBzdHJ1Y3Qgc29hcF9jb29raWUqIFNPQVBfRk1BQzIgc29hcF9zZXRfY29va2llKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBleHRlcm4gc3RydWN0IHNvYXBfY29va2llKiBTT0FQX0ZNQUMyIHNvYXBfY29va2llKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGV4dGVybiBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfY29va2llX3ZhbHVlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGV4dGVybiBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfZW52X2Nvb2tpZV92YWx1ZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBleHRlcm4gbG9uZyBTT0FQX0ZNQUMyIHNvYXBfY29va2llX2V4cGlyZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBleHRlcm4gaW50IFNPQVBfRk1BQzIgc29hcF9zZXRfY29va2llX2V4cGlyZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBsb25nLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBleHRlcm4gaW50IFNPQVBfRk1BQzIgc29hcF9zZXRfY29va2llX3Nlc3Npb24oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgZXh0ZXJuIGludCBTT0FQX0ZNQUMyIHNvYXBfY2xyX2Nvb2tpZV9zZXNzaW9uKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGV4dGVybiB2b2lkIFNPQVBfRk1BQzIgc29hcF9jbHJfY29va2llKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGV4dGVybiBpbnQgU09BUF9GTUFDMiBzb2FwX2dldGVudl9jb29raWVzKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGV4dGVybiBzdHJ1Y3Qgc29hcF9jb29raWUqIFNPQVBfRk1BQzIgc29hcF9jb3B5X2Nvb2tpZXMoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgZXh0ZXJuIHZvaWQgU09BUF9GTUFDMiBzb2FwX2ZyZWVfY29va2llcyhzdHJ1Y3Qgc29hcCopOworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBleHRlcm4gIkMiICovCisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvbXRvbS9NYWtlZmlsZSBiL3NhbXBsZXMvbXRvbS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjdlNGYyCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9tdG9tL01ha2VmaWxlCkBAIC0wLDAgKzEsMjAgQEAKK0dTT0FQPS4uLy4uL3NvYXBjcHAyCitTT0FQSD0uLi8uLi9zdGRzb2FwMi5oCitTT0FQQz0uLi8uLi9zdGRzb2FwMi5jCitTT0FQQ1BQPS4uLy4uL3N0ZHNvYXAyLmNwcAorQ0M9Z2NjCitDUFA9ZysrCitMSUJTPQorQ09GTEFHUz0tTzIKK0NXRkxBR1M9LVdhbGwKK0NJRkxBR1M9LUkuLi8uLgorQ01GTEFHUz0KK0NGTEFHUz0gJChDV0ZMQUdTKSAkKENPRkxBR1MpICQoQ0lGTEFHUykgJChDTUZMQUdTKQorYWxsOgkJbXRvbQorbXRvbToJCW10b20tdGVzdC5oIG10b20tdGVzdC5jICQoU09BUEgpICQoU09BUEMpCisJCSQoR1NPQVApIC1jIC1JLi4vLi4vaW1wb3J0IG10b20tdGVzdC5oCisJCSQoQ0MpICQoQ0ZMQUdTKSAtbyBtdG9tLXRlc3QgbXRvbS10ZXN0LmMgc29hcEMuYyBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jICQoU09BUEMpICQoTElCUykKK2NsZWFuOgorCQlybSAtZiAqLm8gc29hcEguaCBzb2FwU3R1Yi5oIHNvYXBDLmNwcCBzb2FwQy5jIHNvYXBDbGllbnQuY3BwIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmNwcCBzb2FwU2VydmVyLmMgc29hcCpQcm94eS5oCitkaXN0Y2xlYW46CisJCXJtIC1mICoubyAqLndzZGwgKi54c2QgKi54bWwgKi5uc21hcCAqLmxvZyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5LmggbXRvbQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9tdG9tL01ha2VmaWxlU29sYXJpcyBiL3NhbXBsZXMvbXRvbS9NYWtlZmlsZVNvbGFyaXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQzYjY1ZAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvbXRvbS9NYWtlZmlsZVNvbGFyaXMKQEAgLTAsMCArMSwyMCBAQAorR1NPQVA9Li4vLi4vc29hcGNwcDIKK1NPQVBIPS4uLy4uL3N0ZHNvYXAyLmgKK1NPQVBDPS4uLy4uL3N0ZHNvYXAyLmMKK1NPQVBDUFA9Li4vLi4vc3Rkc29hcDIuY3BwCitDQz1nY2MKK0NQUD1nKysKK0xJQlM9LWxuc2wgLWx4bmV0IC1sc29ja2V0CitDT0ZMQUdTPS1PMgorQ1dGTEFHUz0tV2FsbAorQ0lGTEFHUz0tSS4uLy4uCitDTUZMQUdTPQorQ0ZMQUdTPSAkKENXRkxBR1MpICQoQ09GTEFHUykgJChDSUZMQUdTKSAkKENNRkxBR1MpCithbGw6CQltdG9tCittdG9tOgkJbXRvbS10ZXN0LmggbXRvbS10ZXN0LmMgJChTT0FQSCkgJChTT0FQQykKKwkJJChHU09BUCkgLWMgbXRvbS10ZXN0LmgKKwkJJChDQykgJChDRkxBR1MpIC1vIG10b20tdGVzdCBtdG9tLXRlc3QuYyBzb2FwQy5jIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmMgJChTT0FQQykgJChMSUJTKQorY2xlYW46CisJCXJtIC1mICoubyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5LmgKK2Rpc3RjbGVhbjoKKwkJcm0gLWYgKi5vICoud3NkbCAqLnhzZCAqLnhtbCAqLm5zbWFwICoubG9nIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaCBtdG9tCmRpZmYgLS1naXQgYS9zYW1wbGVzL210b20vbXRvbS10ZXN0LmMgYi9zYW1wbGVzL210b20vbXRvbS10ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJiY2JlZgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvbXRvbS9tdG9tLXRlc3QuYwpAQCAtMCwwICsxLDI4MSBAQAorLyoKKworbXRvbS10ZXN0LmMKKworVGhpcyBhcHBsaWNhdGlvbiBpbmNsdWRlcyBhIE1UT00gdGVzdCBjbGllbnQgYW5kIHNlcnZlci4gQXMgYSBjbGllbnQKK2FwcGxpY2F0aW9uLCBpdCBmaXJlcyBmb3VyIGRpZmZlcmVudCBiYXNlNjQgb3IgTVRPTSBhdHRhY2htZW50cyB0byB0aGUgc2VydmVyLgorQXMgYSBzZXJ2ZXIsIGl0IHdpbGwgcmVzcG9uZCB0byB0aGUgbWVzc2FnZXMgYnkgY29udmVydGluZyBiYXNlNjQgaW50byBNVE9NCithdHRhY2htZW50cyBhbmQgdmljZSB2ZXJzYS4KKworVXNhZ2UgKHNlcnZlcik6CittdG9tLXRlc3QgPHBvcnQ+CisKK1VzYWdlIChjbGllbnQpOgorbXRvbS10ZXN0IGh0dHA6Ly9sb2NhbGhvc3Q6PHBvcnQ+ICI8bWVzc2FnZT4iICI8TUlNRS10eXBlPiIKKworVXNhZ2UgKGNsaWVudCk6CittdG9tLXRlc3QgaHR0cDovL2xvY2FsaG9zdDo8cG9ydD4gIjxtZXNzYWdlPiIgIjxNSU1FLXR5cGU+IiAiPG1lc3NhZ2UyPiIgIjxtZXNzYWdlMz4iIC4uLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyB0d28gbGljZW5zZXM6CitHUEwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbmNsdWRlICJzb2FwSC5oIgorI2luY2x1ZGUgIm10b21fdGVzdC5uc21hcCIKKworaW50IGNnaV9zZXJ2ZSgpOworaW50IHJ1bl9zZXJ2ZShpbnQgcG9ydCk7CitpbnQgcnVuX3Rlc3RzKGludCxjaGFyKiopOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7IGlmIChhcmdjIDwgMikKKyAgICByZXR1cm4gY2dpX3NlcnZlKCk7CisgIGlmIChhcmdjIDwgMykKKyAgICByZXR1cm4gcnVuX3NlcnZlKGF0b2koYXJndlsxXSkpOworICByZXR1cm4gcnVuX3Rlc3RzKGFyZ2MsIGFyZ3YpOworfQorCitpbnQgY2dpX3NlcnZlKCkKK3sgLyogQ0dJLXN0eWxlOiBzZXJ2ZSByZXF1ZXN0IGZyb20gc3RkaW4gKi8KKyAgcmV0dXJuIHNvYXBfc2VydmUoc29hcF9uZXcxKFNPQVBfRU5DX01UT00pKTsgLyogZW5hYmxlIE1UT00gWE9QIGF0dGFjaG1lbnRzICovCit9CisKK2ludCBydW5fc2VydmUoaW50IHBvcnQpCit7IHN0cnVjdCBzb2FwICpzb2FwID0gc29hcF9uZXcxKFNPQVBfRU5DX01UT00pOworICBpbnQgcmV0OworICBpZiAoIXNvYXBfdmFsaWRfc29ja2V0KHNvYXBfYmluZChzb2FwLCBOVUxMLCBwb3J0LCAxMDApKSkKKyAgICBzb2FwX3ByaW50X2ZhdWx0KHNvYXAsIHN0ZGVycik7CisgIGVsc2UKKyAgeyBmcHJpbnRmKHN0ZGVyciwgIkJpbmQgdG8gcG9ydCAlZCBzdWNjZXNzZnVsXG4iLCBwb3J0KTsKKyAgICBzb2FwLT5hY2NlcHRfdGltZW91dCA9IDM2MDA7IC8qIGxldCBzZXJ2ZXIgdGltZSBvdXQgYWZ0ZXIgb25lIGhvdXIgKi8KKyAgICBmb3IgKDs7KQorICAgIHsgaW50IHNvY2sgPSBzb2FwX2FjY2VwdChzb2FwKTsKKyAgICAgIGlmICghc29hcF92YWxpZF9zb2NrZXQoc29jaykpCisgICAgICB7IGlmIChzb2FwLT5lcnJudW0pCisgICAgICAgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOworICAgICAgICBlbHNlCisgICAgICAgIHsgZnByaW50ZihzdGRlcnIsICJTZXJ2ZXIgdGltZWQgb3V0XG4iKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZnByaW50ZihzdGRlcnIsICJBY2NlcHRpbmcgc29ja2V0ICVkIGNvbm5lY3Rpb24gZnJvbSBJUCAlZC4lZC4lZC4lZC4uLiAiLCBzb2NrLCAoaW50KShzb2FwLT5pcD4+MjQpJjB4RkYsIChpbnQpKHNvYXAtPmlwPj4xNikmMHhGRiwgKGludCkoc29hcC0+aXA+PjgpJjB4RkYsIChpbnQpc29hcC0+aXAmMHhGRik7CisgICAgICBpZiAoc29hcF9zZXJ2ZShzb2FwKSkKKyAgICAgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOworICAgICAgZnByaW50ZihzdGRlcnIsICJkb25lXG4iKTsKKyAgICAgIHNvYXBfZGVzdHJveShzb2FwKTsKKyAgICAgIHNvYXBfZW5kKHNvYXApOworICAgIH0gCisgIH0KKyAgcmV0ID0gc29hcC0+ZXJyb3I7CisgIHNvYXBfZG9uZShzb2FwKTsKKyAgZnJlZShzb2FwKTsKKyAgcmV0dXJuIHJldDsKK30KKworaW50IHJ1bl90ZXN0cyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7IHN0cnVjdCBzb2FwICpzb2FwID0gc29hcF9uZXcxKFNPQVBfRU5DX01UT00pOworICBpbnQgaSwgcmV0OworICBzdHJ1Y3QgeF9fRGF0YVR5cGUgZGF0YTsKKyAgc3RydWN0IHhfX1dyYXBwZXJUeXBlIHdyYXA7CisgIHN0cnVjdCBfX21fX0VjaG9UZXN0U2luZ2xlUmVzcG9uc2Ugc2luZ2xlOworICBzdHJ1Y3QgX19tX19FY2hvVGVzdE11bHRpcGxlUmVzcG9uc2UgbXVsdGlwbGU7CisgIHNvYXBfZGVmYXVsdF94X19EYXRhVHlwZShzb2FwLCAmZGF0YSk7CisgIHNvYXBfZGVmYXVsdF94X19XcmFwcGVyVHlwZShzb2FwLCAmd3JhcCk7CisKKyAgLyogRmlyc3QgdGVzdCBjYWxsICovCisgIGRhdGEuX191bmlvbiA9IFNPQVBfVU5JT05feF9fZGF0YV9iYXNlNjQ7CisgIGRhdGEuY2hvaWNlLmJhc2U2NC5fX3B0ciA9ICh1bnNpZ25lZCBjaGFyKilhcmd2WzJdOworICBkYXRhLmNob2ljZS5iYXNlNjQuX19zaXplID0gKGludClzdHJsZW4oYXJndlsyXSkgKyAxOworICBpZiAoYXJnYyA+IDMpCisgICAgZGF0YS54bWxtaW1lX19jb250ZW50VHlwZSA9IGFyZ3ZbM107CisgIGlmIChzb2FwX2NhbGxfX19tX19FY2hvVGVzdFNpbmdsZShzb2FwLCBhcmd2WzFdLCBOVUxMLCAmZGF0YSwgJnNpbmdsZSkpCisgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOworICBlbHNlCisgIHsgaWYgKCFzaW5nbGUueF9fRGF0YSB8fCBzaW5nbGUueF9fRGF0YS0+X191bmlvbiAhPSBTT0FQX1VOSU9OX3hfX2RhdGFfeG9wX19JbmNsdWRlIHx8ICFzaW5nbGUueF9fRGF0YS0+Y2hvaWNlLnhvcF9fSW5jbHVkZS5fX3B0ciB8fCBzaW5nbGUueF9fRGF0YS0+Y2hvaWNlLnhvcF9fSW5jbHVkZS5fX3NpemUgIT0gZGF0YS5jaG9pY2UuYmFzZTY0Ll9fc2l6ZSB8fCBzdHJjbXAoKGNoYXIqKXNpbmdsZS54X19EYXRhLT5jaG9pY2UueG9wX19JbmNsdWRlLl9fcHRyLCAoY2hhciopZGF0YS5jaG9pY2UuYmFzZTY0Ll9fcHRyKSkKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRWNob1Rlc3RTaW5nbGUgMTogZGF0YSB0cmFuc2NyaXB0aW9uIGVycm9yXG4iKTsKKyAgICBlbHNlCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVjaG9UZXN0U2luZ2xlIDE6IE9LXG4iKTsKKyAgICAvKiBTZWNvbmQgdGVzdCBjYWxsICovCisgICAgZGF0YS5fX3VuaW9uID0gU09BUF9VTklPTl94X19kYXRhX3hvcF9fSW5jbHVkZTsKKyAgICBkYXRhLmNob2ljZS54b3BfX0luY2x1ZGUuX19wdHIgPSAodW5zaWduZWQgY2hhciopYXJndlsyXTsKKyAgICBkYXRhLmNob2ljZS54b3BfX0luY2x1ZGUuX19zaXplID0gKGludClzdHJsZW4oYXJndlsyXSkgKyAxOworICAgIGRhdGEuY2hvaWNlLnhvcF9fSW5jbHVkZS5pZCA9IE5VTEw7CisgICAgZGF0YS5jaG9pY2UueG9wX19JbmNsdWRlLnR5cGUgPSAidGV4dC94bWw7IGNoYXJzZXQ9dXRmLTgiOworICAgIGRhdGEuY2hvaWNlLnhvcF9fSW5jbHVkZS5vcHRpb25zID0gTlVMTDsKKyAgICBpZiAoc29hcF9jYWxsX19fbV9fRWNob1Rlc3RTaW5nbGUoc29hcCwgYXJndlsxXSwgTlVMTCwgJmRhdGEsICZzaW5nbGUpKQorICAgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOworICAgIGVsc2UKKyAgICB7IGlmICghc2luZ2xlLnhfX0RhdGEKKyAgICAgICB8fCBzaW5nbGUueF9fRGF0YS0+X191bmlvbiAhPSBTT0FQX1VOSU9OX3hfX2RhdGFfYmFzZTY0CisgICAgICAgfHwgIXNpbmdsZS54X19EYXRhLT5jaG9pY2UuYmFzZTY0Ll9fcHRyCisgICAgICAgfHwgc2luZ2xlLnhfX0RhdGEtPmNob2ljZS5iYXNlNjQuX19zaXplICE9IGRhdGEuY2hvaWNlLnhvcF9fSW5jbHVkZS5fX3NpemUKKyAgICAgICB8fCBzdHJjbXAoKGNoYXIqKXNpbmdsZS54X19EYXRhLT5jaG9pY2UuYmFzZTY0Ll9fcHRyLCAoY2hhciopZGF0YS5jaG9pY2UueG9wX19JbmNsdWRlLl9fcHRyKSkKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFY2hvVGVzdFNpbmdsZSAyOiBkYXRhIHRyYW5zY3JpcHRpb24gZXJyb3JcbiIpOworICAgICAgZWxzZQorICAgICAgeyBmcHJpbnRmKHN0ZGVyciwgIkVjaG9UZXN0U2luZ2xlIDI6IE9LXG4iKTsKKyAgICAgICAgLyogVGhpcmQgdGVzdCBjYWxsICovCisgICAgICAgIHdyYXAuX19zaXplID0gYXJnYyAtIDI7CisgICAgICAgIHdyYXAuRGF0YSA9IChzdHJ1Y3QgeF9fRGF0YVR5cGUqKXNvYXBfbWFsbG9jKHNvYXAsIHdyYXAuX19zaXplICogc2l6ZW9mKHN0cnVjdCB4X19EYXRhVHlwZSkpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd3JhcC5fX3NpemU7ICsraSkKKyAgICAgICAgeyBzb2FwX2RlZmF1bHRfeF9fRGF0YVR5cGUoc29hcCwgJndyYXAuRGF0YVtpXSk7CisgICAgICAgICAgd3JhcC5EYXRhW2ldLl9fdW5pb24gPSBTT0FQX1VOSU9OX3hfX2RhdGFfYmFzZTY0OworICAgICAgICAgIHdyYXAuRGF0YVtpXS5jaG9pY2UuYmFzZTY0Ll9fcHRyID0gKHVuc2lnbmVkIGNoYXIqKWFyZ3ZbaSArIDJdOworICAgICAgICAgIHdyYXAuRGF0YVtpXS5jaG9pY2UuYmFzZTY0Ll9fc2l6ZSA9IChpbnQpc3RybGVuKGFyZ3ZbaSArIDJdKSArIDE7CisgICAgICAgICAgd3JhcC5EYXRhW2ldLnhtbG1pbWVfX2NvbnRlbnRUeXBlID0gInRleHQveG1sIjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc29hcF9jYWxsX19fbV9fRWNob1Rlc3RNdWx0aXBsZShzb2FwLCBhcmd2WzFdLCBOVUxMLCAmd3JhcCwgJm11bHRpcGxlKSkKKyAgICAgICAgICBzb2FwX3ByaW50X2ZhdWx0KHNvYXAsIHN0ZGVycik7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyBpbnQgb2theSA9IDE7CisgICAgICAgICAgaWYgKCFtdWx0aXBsZS54X19FY2hvVGVzdAorCSAgIHx8IG11bHRpcGxlLnhfX0VjaG9UZXN0LT5fX3NpemUgIT0gd3JhcC5fX3NpemUpCisgICAgICAgICAgICBva2F5ID0gMDsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeyBmb3IgKGkgPSAwOyBpIDwgbXVsdGlwbGUueF9fRWNob1Rlc3QtPl9fc2l6ZTsgKytpKQorICAgICAgICAgICAgICBpZiAobXVsdGlwbGUueF9fRWNob1Rlc3QtPkRhdGFbaV0uX191bmlvbiAhPSBTT0FQX1VOSU9OX3hfX2RhdGFfeG9wX19JbmNsdWRlCisJICAgICAgIHx8ICFtdWx0aXBsZS54X19FY2hvVGVzdC0+RGF0YVtpXS5jaG9pY2UueG9wX19JbmNsdWRlLl9fcHRyCisJICAgICAgIHx8IG11bHRpcGxlLnhfX0VjaG9UZXN0LT5EYXRhW2ldLmNob2ljZS54b3BfX0luY2x1ZGUuX19zaXplICE9IHdyYXAuRGF0YVtpXS5jaG9pY2UuYmFzZTY0Ll9fc2l6ZQorCSAgICAgICB8fCBzdHJjbXAoKGNoYXIqKW11bHRpcGxlLnhfX0VjaG9UZXN0LT5EYXRhW2ldLmNob2ljZS54b3BfX0luY2x1ZGUuX19wdHIsIChjaGFyKil3cmFwLkRhdGFbaV0uY2hvaWNlLmJhc2U2NC5fX3B0cikpCisgICAgICAgICAgICAgICAgb2theSA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICghb2theSkKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRWNob1Rlc3RNdWx0aXBsZSAxOiBkYXRhIHRyYW5zY3JpcHRpb24gZXJyb3JcbiIpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7IGZwcmludGYoc3RkZXJyLCAiRWNob1Rlc3RNdWx0aXBsZSAxOiBPS1xuIik7CisgICAgICAgICAgICAvKiBGb3VydGggdGVzdCBjYWxsICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd3JhcC5fX3NpemU7ICsraSkKKyAgICAgICAgICAgIHsgc29hcF9kZWZhdWx0X3hfX0RhdGFUeXBlKHNvYXAsICZ3cmFwLkRhdGFbaV0pOworICAgICAgICAgICAgICB3cmFwLkRhdGFbaV0uX191bmlvbiA9IFNPQVBfVU5JT05feF9fZGF0YV94b3BfX0luY2x1ZGU7CisgICAgICAgICAgICAgIHdyYXAuRGF0YVtpXS5jaG9pY2UueG9wX19JbmNsdWRlLl9fcHRyID0gKHVuc2lnbmVkIGNoYXIqKWFyZ3ZbaSArIDJdOworICAgICAgICAgICAgICB3cmFwLkRhdGFbaV0uY2hvaWNlLnhvcF9fSW5jbHVkZS5fX3NpemUgPSAoaW50KXN0cmxlbihhcmd2W2kgKyAyXSkgKyAxOworICAgICAgICAgICAgICB3cmFwLkRhdGFbaV0uY2hvaWNlLnhvcF9fSW5jbHVkZS5pZCA9IE5VTEw7CisgICAgICAgICAgICAgIHdyYXAuRGF0YVtpXS5jaG9pY2UueG9wX19JbmNsdWRlLnR5cGUgPSAidGV4dC94bWwiOworICAgICAgICAgICAgICB3cmFwLkRhdGFbaV0uY2hvaWNlLnhvcF9fSW5jbHVkZS5vcHRpb25zID0gTlVMTDsKKyAgICAgICAgICAgICAgd3JhcC5EYXRhW2ldLnhtbG1pbWVfX2NvbnRlbnRUeXBlID0gInRleHQveG1sIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzb2FwX2NhbGxfX19tX19FY2hvVGVzdE11bHRpcGxlKHNvYXAsIGFyZ3ZbMV0sIE5VTEwsICZ3cmFwLCAmbXVsdGlwbGUpKQorICAgICAgICAgICAgICBzb2FwX3ByaW50X2ZhdWx0KHNvYXAsIHN0ZGVycik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7IGludCBva2F5ID0gMTsKKyAgICAgICAgICAgICAgaWYgKCFtdWx0aXBsZS54X19FY2hvVGVzdAorCSAgICAgICB8fCBtdWx0aXBsZS54X19FY2hvVGVzdC0+X19zaXplICE9IHdyYXAuX19zaXplKQorICAgICAgICAgICAgICAgIG9rYXkgPSAwOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsgZm9yIChpID0gMDsgaSA8IG11bHRpcGxlLnhfX0VjaG9UZXN0LT5fX3NpemU7ICsraSkKKyAgICAgICAgICAgICAgICAgIGlmIChtdWx0aXBsZS54X19FY2hvVGVzdC0+RGF0YVtpXS5fX3VuaW9uICE9IFNPQVBfVU5JT05feF9fZGF0YV9iYXNlNjQKKwkJICAgfHwgIW11bHRpcGxlLnhfX0VjaG9UZXN0LT5EYXRhW2ldLmNob2ljZS5iYXNlNjQuX19wdHIKKwkJICAgfHwgbXVsdGlwbGUueF9fRWNob1Rlc3QtPkRhdGFbaV0uY2hvaWNlLmJhc2U2NC5fX3NpemUgIT0gd3JhcC5EYXRhW2ldLmNob2ljZS54b3BfX0luY2x1ZGUuX19zaXplIHx8IHN0cmNtcCgoY2hhciopbXVsdGlwbGUueF9fRWNob1Rlc3QtPkRhdGFbaV0uY2hvaWNlLmJhc2U2NC5fX3B0ciwgKGNoYXIqKXdyYXAuRGF0YVtpXS5jaG9pY2UueG9wX19JbmNsdWRlLl9fcHRyKSkKKyAgICAgICAgICAgICAgICAgICAgb2theSA9IDA7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKCFva2F5KQorICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRWNob1Rlc3RNdWx0aXBsZSAyOiBkYXRhIHRyYW5zY3JpcHRpb24gZXJyb3JcbiIpOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFY2hvVGVzdE11bHRpcGxlIDI6IE9LXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0ID0gc29hcC0+ZXJyb3I7CisgIHNvYXBfZGVzdHJveShzb2FwKTsKKyAgc29hcF9lbmQoc29hcCk7CisgIHNvYXBfZG9uZShzb2FwKTsKKyAgZnJlZShzb2FwKTsKKyAgcmV0dXJuIHJldDsKK30KKworaW50IF9fbV9fRWNob1Rlc3RTaW5nbGUoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCB4X19EYXRhVHlwZSAqZGF0YSwgc3RydWN0IF9fbV9fRWNob1Rlc3RTaW5nbGVSZXNwb25zZSAqcmVzcG9uc2UpCit7IGlmICghZGF0YSkKKyAgICByZXR1cm4gc29hcF9zZW5kZXJfZmF1bHQoc29hcCwgIk5vIGRhdGEiLCBOVUxMKTsKKyAgLyogYWxsb2NhdGUgcmVzcG9uc2UgKi8KKyAgcmVzcG9uc2UtPnhfX0RhdGEgPSAoc3RydWN0IHhfX0RhdGFUeXBlKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IHhfX0RhdGFUeXBlKSk7CisgIGlmICghcmVzcG9uc2UtPnhfX0RhdGEpCisgICAgcmV0dXJuIFNPQVBfRU9NOworICAvKiBjb3B5IGRhdGEgaW50byByZXNwb25zZSwgc3dpdGNoaW5nIGZyb20gYmFzZTY0IHRvIE1UT00gYW5kIHZpY2UgdmVyc2EgKi8KKyAgc3dpdGNoIChkYXRhLT5fX3VuaW9uKQorICB7IGNhc2UgU09BUF9VTklPTl94X19kYXRhX3hvcF9fSW5jbHVkZToKKyAgICAgIC8qIGNvbnZlcnQgTVRPTSBhdHRhY2htZW50IHRvIGJhc2U2NEJpbmFyeSAqLworICAgICAgcmVzcG9uc2UtPnhfX0RhdGEtPl9fdW5pb24gPSBTT0FQX1VOSU9OX3hfX2RhdGFfYmFzZTY0OworICAgICAgcmVzcG9uc2UtPnhfX0RhdGEtPmNob2ljZS5iYXNlNjQuX19wdHIgPSBkYXRhLT5jaG9pY2UueG9wX19JbmNsdWRlLl9fcHRyOworICAgICAgcmVzcG9uc2UtPnhfX0RhdGEtPmNob2ljZS5iYXNlNjQuX19zaXplID0gZGF0YS0+Y2hvaWNlLnhvcF9fSW5jbHVkZS5fX3NpemU7CisgICAgICByZXNwb25zZS0+eF9fRGF0YS0+eG1sbWltZV9fY29udGVudFR5cGUgPSBkYXRhLT5jaG9pY2UueG9wX19JbmNsdWRlLnR5cGU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfVU5JT05feF9fZGF0YV9iYXNlNjQ6CisgICAgICAvKiBjb252ZXJ0IGJhc2U2NEJpbmFyeSB0byBNVE9NIGF0dGFjaG1lbnQgKi8KKyAgICAgIHJlc3BvbnNlLT54X19EYXRhLT5fX3VuaW9uID0gU09BUF9VTklPTl94X19kYXRhX3hvcF9fSW5jbHVkZTsKKyAgICAgIHJlc3BvbnNlLT54X19EYXRhLT5jaG9pY2UueG9wX19JbmNsdWRlLl9fcHRyID0gZGF0YS0+Y2hvaWNlLmJhc2U2NC5fX3B0cjsKKyAgICAgIHJlc3BvbnNlLT54X19EYXRhLT5jaG9pY2UueG9wX19JbmNsdWRlLl9fc2l6ZSA9IGRhdGEtPmNob2ljZS5iYXNlNjQuX19zaXplOworICAgICAgcmVzcG9uc2UtPnhfX0RhdGEtPmNob2ljZS54b3BfX0luY2x1ZGUuaWQgPSBOVUxMOworICAgICAgcmVzcG9uc2UtPnhfX0RhdGEtPmNob2ljZS54b3BfX0luY2x1ZGUudHlwZSA9IGRhdGEtPnhtbG1pbWVfX2NvbnRlbnRUeXBlOworICAgICAgcmVzcG9uc2UtPnhfX0RhdGEtPmNob2ljZS54b3BfX0luY2x1ZGUub3B0aW9ucyA9IE5VTEw7CisgICAgICByZXNwb25zZS0+eF9fRGF0YS0+eG1sbWltZV9fY29udGVudFR5cGUgPSBkYXRhLT54bWxtaW1lX19jb250ZW50VHlwZTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gc29hcF9zZW5kZXJfZmF1bHQoc29hcCwgIldyb25nIGRhdGEgZm9ybWF0IiwgTlVMTCk7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK2ludCBfX21fX0VjaG9UZXN0TXVsdGlwbGUoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCB4X19XcmFwcGVyVHlwZSAqeF9fRWNob1Rlc3QsIHN0cnVjdCBfX21fX0VjaG9UZXN0TXVsdGlwbGVSZXNwb25zZSAqcmVzcG9uc2UpCit7IGludCBpOworICBpZiAoIXhfX0VjaG9UZXN0KQorICAgIHJldHVybiBzb2FwX3NlbmRlcl9mYXVsdChzb2FwLCAiTm8gZGF0YSIsIE5VTEwpOworICAvKiBhbGxvY2F0ZSByZXNwb25zZSAqLworICByZXNwb25zZS0+eF9fRWNob1Rlc3QgPSAoc3RydWN0IHhfX1dyYXBwZXJUeXBlKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IHhfX1dyYXBwZXJUeXBlKSk7CisgIGlmICghcmVzcG9uc2UtPnhfX0VjaG9UZXN0KQorICAgIHJldHVybiBTT0FQX0VPTTsKKyAgcmVzcG9uc2UtPnhfX0VjaG9UZXN0LT5fX3NpemUgPSB4X19FY2hvVGVzdC0+X19zaXplOworICByZXNwb25zZS0+eF9fRWNob1Rlc3QtPkRhdGEgPSAoc3RydWN0IHhfX0RhdGFUeXBlKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IHhfX0RhdGFUeXBlKSAqIHhfX0VjaG9UZXN0LT5fX3NpemUpOworICBpZiAoIXJlc3BvbnNlLT54X19FY2hvVGVzdC0+RGF0YSkKKyAgICByZXR1cm4gU09BUF9FT007CisgIC8qIGNvcHkgZGF0YSBpbnRvIHJlc3BvbnNlLCBzd2l0Y2hpbmcgZnJvbSBiYXNlNjQgdG8gTVRPTSBhbmQgdmljZSB2ZXJzYSAqLworICBmb3IgKGkgPSAwOyBpIDwgeF9fRWNob1Rlc3QtPl9fc2l6ZTsgKytpKQorICB7IHN3aXRjaCAoeF9fRWNob1Rlc3QtPkRhdGFbaV0uX191bmlvbikKKyAgICB7IGNhc2UgU09BUF9VTklPTl94X19kYXRhX3hvcF9fSW5jbHVkZToKKyAgICAgICAgLyogY29udmVydCBNVE9NIGF0dGFjaG1lbnQgdG8gYmFzZTY0QmluYXJ5ICovCisgICAgICAgIHJlc3BvbnNlLT54X19FY2hvVGVzdC0+RGF0YVtpXS5fX3VuaW9uID0gU09BUF9VTklPTl94X19kYXRhX2Jhc2U2NDsKKyAgICAgICAgcmVzcG9uc2UtPnhfX0VjaG9UZXN0LT5EYXRhW2ldLmNob2ljZS5iYXNlNjQuX19wdHIgPSB4X19FY2hvVGVzdC0+RGF0YVtpXS5jaG9pY2UueG9wX19JbmNsdWRlLl9fcHRyOworICAgICAgICByZXNwb25zZS0+eF9fRWNob1Rlc3QtPkRhdGFbaV0uY2hvaWNlLmJhc2U2NC5fX3NpemUgPSB4X19FY2hvVGVzdC0+RGF0YVtpXS5jaG9pY2UueG9wX19JbmNsdWRlLl9fc2l6ZTsKKyAgICAgICAgcmVzcG9uc2UtPnhfX0VjaG9UZXN0LT5EYXRhW2ldLnhtbG1pbWVfX2NvbnRlbnRUeXBlID0geF9fRWNob1Rlc3QtPkRhdGFbaV0uY2hvaWNlLnhvcF9fSW5jbHVkZS50eXBlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9VTklPTl94X19kYXRhX2Jhc2U2NDoKKyAgICAgICAgLyogY29udmVydCBiYXNlNjRCaW5hcnkgdG8gTVRPTSBhdHRhY2htZW50ICovCisgICAgICAgIHJlc3BvbnNlLT54X19FY2hvVGVzdC0+RGF0YVtpXS5fX3VuaW9uID0gU09BUF9VTklPTl94X19kYXRhX3hvcF9fSW5jbHVkZTsKKyAgICAgICAgcmVzcG9uc2UtPnhfX0VjaG9UZXN0LT5EYXRhW2ldLmNob2ljZS54b3BfX0luY2x1ZGUuX19wdHIgPSB4X19FY2hvVGVzdC0+RGF0YVtpXS5jaG9pY2UuYmFzZTY0Ll9fcHRyOworICAgICAgICByZXNwb25zZS0+eF9fRWNob1Rlc3QtPkRhdGFbaV0uY2hvaWNlLnhvcF9fSW5jbHVkZS5fX3NpemUgPSB4X19FY2hvVGVzdC0+RGF0YVtpXS5jaG9pY2UuYmFzZTY0Ll9fc2l6ZTsKKyAgICAgICAgcmVzcG9uc2UtPnhfX0VjaG9UZXN0LT5EYXRhW2ldLmNob2ljZS54b3BfX0luY2x1ZGUuaWQgPSBOVUxMOworICAgICAgICByZXNwb25zZS0+eF9fRWNob1Rlc3QtPkRhdGFbaV0uY2hvaWNlLnhvcF9fSW5jbHVkZS50eXBlID0geF9fRWNob1Rlc3QtPkRhdGFbaV0ueG1sbWltZV9fY29udGVudFR5cGU7CisgICAgICAgIHJlc3BvbnNlLT54X19FY2hvVGVzdC0+RGF0YVtpXS5jaG9pY2UueG9wX19JbmNsdWRlLm9wdGlvbnMgPSBOVUxMOworICAgICAgICByZXNwb25zZS0+eF9fRWNob1Rlc3QtPkRhdGFbaV0ueG1sbWltZV9fY29udGVudFR5cGUgPSB4X19FY2hvVGVzdC0+RGF0YVtpXS54bWxtaW1lX19jb250ZW50VHlwZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gc29hcF9zZW5kZXJfZmF1bHQoc29hcCwgIldyb25nIGRhdGEgZm9ybWF0IiwgTlVMTCk7CisgICAgfQorICB9CisgIHJldHVybiBTT0FQX09LOworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9tdG9tL210b20tdGVzdC5oIGIvc2FtcGxlcy9tdG9tL210b20tdGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZjNjMTUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL210b20vbXRvbS10ZXN0LmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKworbXRvbS10ZXN0LmgKKworVGhpcyBhcHBsaWNhdGlvbiBpbmNsdWRlcyBhIE1UT00gdGVzdCBjbGllbnQgYW5kIHNlcnZlci4gQXMgYSBjbGllbnQKK2FwcGxpY2F0aW9uLCBpdCBmaXJlcyBmb3VyIGRpZmZlcmVudCBiYXNlNjQgb3IgTVRPTSBhdHRhY2htZW50cyB0byB0aGUgc2VydmVyLgorQXMgYSBzZXJ2ZXIsIGl0IHdpbGwgcmVzcG9uZCB0byB0aGUgbWVzc2FnZXMgYnkgY29udmVydGluZyBiYXNlNjQgaW50byBNVE9NCithdHRhY2htZW50cyBhbmQgdmljZSB2ZXJzYS4KKworVXNhZ2UgKHNlcnZlcik6CittdG9tLXRlc3QgPHBvcnQ+CisKK1VzYWdlIChjbGllbnQpOgorbXRvbS10ZXN0IGh0dHA6Ly9sb2NhbGhvc3Q6PHBvcnQ+ICI8bWVzc2FnZT4iICI8TUlNRS10eXBlPiIKKworVXNhZ2UgKGNsaWVudCk6CittdG9tLXRlc3QgaHR0cDovL2xvY2FsaG9zdDo8cG9ydD4gIjxtZXNzYWdlPiIgIjxNSU1FLXR5cGU+IiAiPG1lc3NhZ2UyPiIgIjxtZXNzYWdlMz4iIC4uLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyB0d28gbGljZW5zZXM6CitHUEwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbXBvcnQgInNvYXAxMi5oIgorI2ltcG9ydCAieG9wLmgiCisjaW1wb3J0ICJ4bWxtaW1lLmgiCisKKy8vZ3NvYXAgbSBzZXJ2aWNlIG5hbWVzcGFjZToJaHR0cDovL3d3dy5nZW5pdmlhLmNvbS93c2RsL210b20tdGVzdC53c2RsCisvL2dzb2FwIG0gc2VydmljZSBuYW1lOgkJbXRvbS10ZXN0CisKKy8vZ3NvYXAgeCBzY2hlbWEgbmFtZXNwYWNlOglodHRwOi8vd3d3Lmdlbml2aWEuY29tL3NjaGVtYXMvbXRvbS10ZXN0LnhzZAorLy9nc29hcCB4IHNjaGVtYSBlbGVtZW50Rm9ybToJcXVhbGlmaWVkCisKK3N0cnVjdCB4c2RfX2Jhc2U2NEJpbmFyeQoreyB1bnNpZ25lZCBjaGFyICpfX3B0cjsKKyAgaW50IF9fc2l6ZTsKK307CisKK3N0cnVjdCB4X19EYXRhVHlwZQoreyBpbnQgX191bmlvbjsKKyAgdW5pb24geF9fZGF0YQorICB7IF94b3BfX0luY2x1ZGUgeG9wX19JbmNsdWRlOworICAgIHN0cnVjdCB4c2RfX2Jhc2U2NEJpbmFyeSBiYXNlNjQ7CisgIH0gY2hvaWNlOworICBAY2hhciAqeG1sbWltZV9fY29udGVudFR5cGU7Cit9OworCitzdHJ1Y3QgeF9fV3JhcHBlclR5cGUKK3sgaW50IF9fc2l6ZTsKKyAgc3RydWN0IHhfX0RhdGFUeXBlICpEYXRhOworfTsKKworaW50IF9fbV9fRWNob1Rlc3RTaW5nbGUoCisgIHN0cnVjdCB4X19EYXRhVHlwZSAqeF9fRGF0YSwKKyAgc3RydWN0IF9fbV9fRWNob1Rlc3RTaW5nbGVSZXNwb25zZQorICB7IHN0cnVjdCB4X19EYXRhVHlwZSAqeF9fRGF0YTsKKyAgfSoKKyk7CisKK2ludCBfX21fX0VjaG9UZXN0TXVsdGlwbGUoCisgIHN0cnVjdCB4X19XcmFwcGVyVHlwZSAqeF9fRWNob1Rlc3QsCisgIHN0cnVjdCBfX21fX0VjaG9UZXN0TXVsdGlwbGVSZXNwb25zZQorICB7IHN0cnVjdCB4X19XcmFwcGVyVHlwZSAqeF9fRWNob1Rlc3Q7CisgIH0qCispOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9vbmVsaW5lcnMvTWFrZWZpbGUgYi9zYW1wbGVzL29uZWxpbmVycy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGY3Y2I0Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9vbmVsaW5lcnMvTWFrZWZpbGUKQEAgLTAsMCArMSwzNSBAQAorR1NPQVA9Li4vLi4vc29hcGNwcDIKK1NPQVBIPS4uLy4uL3N0ZHNvYXAyLmgKK1NPQVBDPS4uLy4uL3N0ZHNvYXAyLmMKK1NPQVBDUFA9Li4vLi4vc3Rkc29hcDIuY3BwCitDQz1nY2MKK0NQUD1nKysKK0xJQlM9CitDT0ZMQUdTPS1PMgorQ1dGTEFHUz0tV2FsbAorQ0lGTEFHUz0tSS4uLy4uCitDTUZMQUdTPQorQ0ZMQUdTPSAkKENXRkxBR1MpICQoQ09GTEFHUykgJChDSUZMQUdTKSAkKENNRkxBR1MpCithbGw6CQlnbXRjbGllbnQgZ210c2VydmVyLmNnaSBoZWxsb2NsaWVudCBoZWxsb3NlcnZlci5jZ2kgcm9sbGNsaWVudCByb2xsc2VydmVyLmNnaQorZ210Y2xpZW50OglnbXQuaCBnbXRjbGllbnQuY3BwICQoU09BUEgpICQoU09BUENQUCkKKwkJJChHU09BUCkgZ210LmgKKwkJJChDUFApICQoQ0ZMQUdTKSAtbyBnbXRjbGllbnQgZ210Y2xpZW50LmNwcCBzb2FwQy5jcHAgc29hcENsaWVudC5jcHAgJChTT0FQQ1BQKSAkKExJQlMpCitnbXRzZXJ2ZXIuY2dpOglnbXQuaCBnbXRzZXJ2ZXIuY3BwICQoU09BUEgpICQoU09BUENQUCkKKwkJJChHU09BUCkgZ210LmgKKwkJJChDUFApICQoQ0ZMQUdTKSAtbyBnbXRzZXJ2ZXIuY2dpIGdtdHNlcnZlci5jcHAgc29hcEMuY3BwIHNvYXBTZXJ2ZXIuY3BwICQoU09BUENQUCkgJChMSUJTKQoraGVsbG9jbGllbnQ6CWhlbGxvLmggaGVsbG9jbGllbnQuY3BwICQoU09BUEgpICQoU09BUENQUCkKKwkJJChHU09BUCkgaGVsbG8uaAorCQkkKENQUCkgJChDRkxBR1MpIC1vIGhlbGxvY2xpZW50IGhlbGxvY2xpZW50LmNwcCBzb2FwQy5jcHAgc29hcENsaWVudC5jcHAgJChTT0FQQ1BQKSAkKExJQlMpCitoZWxsb3NlcnZlci5jZ2k6aGVsbG8uaCBoZWxsb3NlcnZlci5jcHAgJChTT0FQSCkgJChTT0FQQ1BQKQorCQkkKEdTT0FQKSBoZWxsby5oCisJCSQoQ1BQKSAkKENGTEFHUykgLW8gaGVsbG9zZXJ2ZXIuY2dpIGhlbGxvc2VydmVyLmNwcCBzb2FwQy5jcHAgc29hcFNlcnZlci5jcHAgJChTT0FQQ1BQKSAkKExJQlMpCityb2xsY2xpZW50Oglyb2xsLmggcm9sbGNsaWVudC5jcHAgJChTT0FQSCkgJChTT0FQQ1BQKQorCQkkKEdTT0FQKSByb2xsLmgKKwkJJChDUFApICQoQ0ZMQUdTKSAtbyByb2xsY2xpZW50IHJvbGxjbGllbnQuY3BwIHNvYXBDLmNwcCBzb2FwQ2xpZW50LmNwcCAkKFNPQVBDUFApICQoTElCUykKK3JvbGxzZXJ2ZXIuY2dpOglyb2xsLmggcm9sbHNlcnZlci5jcHAgJChTT0FQSCkgJChTT0FQQ1BQKQorCQkkKEdTT0FQKSByb2xsLmgKKwkJJChDUFApICQoQ0ZMQUdTKSAtbyByb2xsc2VydmVyLmNnaSByb2xsc2VydmVyLmNwcCBzb2FwQy5jcHAgc29hcFNlcnZlci5jcHAgJChTT0FQQ1BQKSAkKExJQlMpCitjbGVhbjoKKwkJcm0gLWYgKi5vIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaAorZGlzdGNsZWFuOgorCQlybSAtZiAqLm8gKi53c2RsICoueHNkICoueG1sICoubnNtYXAgKi5sb2cgc29hcEguaCBzb2FwU3R1Yi5oIHNvYXBDLmNwcCBzb2FwQy5jIHNvYXBDbGllbnQuY3BwIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmNwcCBzb2FwU2VydmVyLmMgc29hcCpQcm94eS5oIGdtdGNsaWVudCBnbXRzZXJ2ZXIuY2dpIGhlbGxvY2xpZW50IGhlbGxvc2VydmVyLmNnaSByb2xsY2xpZW50IHJvbGxzZXJ2ZXIuY2dpCmRpZmYgLS1naXQgYS9zYW1wbGVzL29uZWxpbmVycy9NYWtlZmlsZVNvbGFyaXMgYi9zYW1wbGVzL29uZWxpbmVycy9NYWtlZmlsZVNvbGFyaXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdiZDIxMgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvb25lbGluZXJzL01ha2VmaWxlU29sYXJpcwpAQCAtMCwwICsxLDM1IEBACitHU09BUD0uLi8uLi9zb2FwY3BwMgorU09BUEg9Li4vLi4vc3Rkc29hcDIuaAorU09BUEM9Li4vLi4vc3Rkc29hcDIuYworU09BUENQUD0uLi8uLi9zdGRzb2FwMi5jcHAKK0NDPWdjYworQ1BQPWcrKworTElCUz0tbHhuZXQgLWxuc2wgLWxzb2NrZXQKK0NPRkxBR1M9LU8yCitDV0ZMQUdTPS1XYWxsCitDSUZMQUdTPS1JLi4vLi4KK0NNRkxBR1M9CitDRkxBR1M9ICQoQ1dGTEFHUykgJChDT0ZMQUdTKSAkKENJRkxBR1MpICQoQ01GTEFHUykKK2FsbDoJCWdtdGNsaWVudCBnbXRzZXJ2ZXIuY2dpIGhlbGxvY2xpZW50IGhlbGxvc2VydmVyLmNnaSByb2xsY2xpZW50IHJvbGxzZXJ2ZXIuY2dpCitnbXRjbGllbnQ6CWdtdC5oIGdtdGNsaWVudC5jcHAgJChTT0FQSCkgJChTT0FQQ1BQKQorCQkkKEdTT0FQKSBnbXQuaAorCQkkKENQUCkgJChDRkxBR1MpIC1vIGdtdGNsaWVudCBnbXRjbGllbnQuY3BwIHNvYXBDLmNwcCBzb2FwQ2xpZW50LmNwcCAkKFNPQVBDUFApICQoTElCUykKK2dtdHNlcnZlci5jZ2k6CWdtdC5oIGdtdHNlcnZlci5jcHAgJChTT0FQSCkgJChTT0FQQ1BQKQorCQkkKEdTT0FQKSBnbXQuaAorCQkkKENQUCkgJChDRkxBR1MpIC1vIGdtdHNlcnZlci5jZ2kgZ210c2VydmVyLmNwcCBzb2FwQy5jcHAgc29hcFNlcnZlci5jcHAgJChTT0FQQ1BQKSAkKExJQlMpCitoZWxsb2NsaWVudDoJaGVsbG8uaCBoZWxsb2NsaWVudC5jcHAgJChTT0FQSCkgJChTT0FQQ1BQKQorCQkkKEdTT0FQKSBoZWxsby5oCisJCSQoQ1BQKSAkKENGTEFHUykgLW8gaGVsbG9jbGllbnQgaGVsbG9jbGllbnQuY3BwIHNvYXBDLmNwcCBzb2FwQ2xpZW50LmNwcCAkKFNPQVBDUFApICQoTElCUykKK2hlbGxvc2VydmVyLmNnaTpoZWxsby5oIGhlbGxvc2VydmVyLmNwcCAkKFNPQVBIKSAkKFNPQVBDUFApCisJCSQoR1NPQVApIGhlbGxvLmgKKwkJJChDUFApICQoQ0ZMQUdTKSAtbyBoZWxsb3NlcnZlci5jZ2kgaGVsbG9zZXJ2ZXIuY3BwIHNvYXBDLmNwcCBzb2FwU2VydmVyLmNwcCAkKFNPQVBDUFApICQoTElCUykKK3JvbGxjbGllbnQ6CXJvbGwuaCByb2xsY2xpZW50LmNwcCAkKFNPQVBIKSAkKFNPQVBDUFApCisJCSQoR1NPQVApIHJvbGwuaAorCQkkKENQUCkgJChDRkxBR1MpIC1vIHJvbGxjbGllbnQgcm9sbGNsaWVudC5jcHAgc29hcEMuY3BwIHNvYXBDbGllbnQuY3BwICQoU09BUENQUCkgJChMSUJTKQorcm9sbHNlcnZlci5jZ2k6CXJvbGwuaCByb2xsc2VydmVyLmNwcCAkKFNPQVBIKSAkKFNPQVBDUFApCisJCSQoR1NPQVApIHJvbGwuaAorCQkkKENQUCkgJChDRkxBR1MpIC1vIHJvbGxzZXJ2ZXIuY2dpIHJvbGxzZXJ2ZXIuY3BwIHNvYXBDLmNwcCBzb2FwU2VydmVyLmNwcCAkKFNPQVBDUFApICQoTElCUykKK2NsZWFuOgorCQlybSAtZiAqLm8gc29hcEguaCBzb2FwU3R1Yi5oIHNvYXBDLmNwcCBzb2FwQy5jIHNvYXBDbGllbnQuY3BwIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmNwcCBzb2FwU2VydmVyLmMgc29hcCpQcm94eS5oCitkaXN0Y2xlYW46CisJCXJtIC1mICoubyAqLndzZGwgKi54c2QgKi54bWwgKi5uc21hcCAqLmxvZyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5LmggZ210Y2xpZW50IGdtdHNlcnZlci5jZ2kgaGVsbG9jbGllbnQgaGVsbG9zZXJ2ZXIuY2dpIHJvbGxjbGllbnQgcm9sbHNlcnZlci5jZ2kKZGlmZiAtLWdpdCBhL3NhbXBsZXMvb25lbGluZXJzL1JFQURNRS50eHQgYi9zYW1wbGVzL29uZWxpbmVycy9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlOTliNTEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL29uZWxpbmVycy9SRUFETUUudHh0CkBAIC0wLDAgKzEsMTIgQEAKK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIGEgbnVtYmVyIG9mICJvbmUtbGluZXJzIjogZ1NPQVAgV2ViIFNlcnZpY2VzIGFuZCBjbGllbnQKK2FwcGxpY2F0aW9ucyB0aGF0IGFyZSBvbmx5IG9uZSBsaW5lIGxvbmcgKG5vdCBjb3VudGluZyB0aGUgdXN1YWwgI2luY2x1ZGVzKS4KKworVGhlIHByb2dyYW1zIGFyZSBzbWFsbCwgYnV0IHRoZXkgY2FuIGRvIGEgbnVtYmVyIG9mIHVzZWZ1bCB0aGluZ3M6CisKK2dtdC5oLCBnbXRjbGllbnQuY3BwLCBnbXRzZXJ2ZXIuY3BwOgkJcmV0dXJuIGN1cnJlbnQgdGltZSBpbiBHTVQKK2hlbGxvLmgsIGhlbGxvY2xpZW50LmNwcCwgaGVsbG9zZXJ2ZXIuY3BwOglIZWxsbyBXb3JsZCEKK3JvbGwuaCwgcm9sbGNsaWVudC5jcHAsIHJvbGxzZXJ2ZXIuY3BwOgkJcm9sbCBvZiBhIGRpZQorCitZb3UgY2FuIHVzZSB0aGUgY2xpZW50IHByb2dyYW1zIHJpZ2h0IGF3YXkgYWZ0ZXIgY29tcGlsYXRpb24sIGJlY2F1c2UgdGhleQorY29ubmVjdCB0byBvdXIgc2VydmVyLiBUbyBydW4gdGhlIHNlcnZlciBleGFtcGxlcyB5b3UgaGF2ZSB0byBpbnN0YWxsIHRoZW0KK2FzIENHSSBhcHBsaWNhdGlvbnMuCmRpZmYgLS1naXQgYS9zYW1wbGVzL29uZWxpbmVycy9nbXQuaCBiL3NhbXBsZXMvb25lbGluZXJzL2dtdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMjM1MjQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL29uZWxpbmVycy9nbXQuaApAQCAtMCwwICsxIEBACit0X19nbXQodGltZV90Jik7CmRpZmYgLS1naXQgYS9zYW1wbGVzL29uZWxpbmVycy9nbXRjbGllbnQuY3BwIGIvc2FtcGxlcy9vbmVsaW5lcnMvZ210Y2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDYxNzczCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9vbmVsaW5lcnMvZ210Y2xpZW50LmNwcApAQCAtMCwwICsxLDMgQEAKKyNpbmNsdWRlICJzb2FwSC5oIgorI2luY2x1ZGUgInQubnNtYXAiCitpbnQgbWFpbigpIHsgdGltZV90IHQ7IHNvYXBfY2FsbF90X19nbXQoc29hcF9uZXcoKSwgImh0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9nbXRsaXRzZXJ2ZXIuY2dpIiwgIiIsIHQpOyByZXR1cm4gcHJpbnRmKCJUaGUgY3VycmVudCB0aW1lIGlzICVzXG4iLCBjdGltZSgmdCkpOyB9CmRpZmYgLS1naXQgYS9zYW1wbGVzL29uZWxpbmVycy9nbXRzZXJ2ZXIuY3BwIGIvc2FtcGxlcy9vbmVsaW5lcnMvZ210c2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2MzNmJmCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9vbmVsaW5lcnMvZ210c2VydmVyLmNwcApAQCAtMCwwICsxLDMgQEAKKyNpbmNsdWRlICJzb2FwSC5oIgorI2luY2x1ZGUgInQubnNtYXAiCitpbnQgbWFpbigpIHsgcmV0dXJuIHNvYXBfc2VydmUoc29hcF9uZXcoKSk7IH0gaW50IHRfX2dtdChzdHJ1Y3Qgc29hcCAqc29hcCwgdGltZV90ICZ0KSB7IHQgPSB0aW1lKDApOyByZXR1cm4gU09BUF9PSzsgfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9vbmVsaW5lcnMvaGVsbG8uaCBiL3NhbXBsZXMvb25lbGluZXJzL2hlbGxvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEzYzcyMAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvb25lbGluZXJzL2hlbGxvLmgKQEAgLTAsMCArMSBAQAoraF9faGVsbG8oY2hhciomKTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvb25lbGluZXJzL2hlbGxvY2xpZW50LmNwcCBiL3NhbXBsZXMvb25lbGluZXJzL2hlbGxvY2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjk2MTg3Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9vbmVsaW5lcnMvaGVsbG9jbGllbnQuY3BwCkBAIC0wLDAgKzEsNCBAQAorI2luY2x1ZGUgInNvYXBILmgiCisjaW5jbHVkZSAiaC5uc21hcCIKK2ludCBtYWluKCkgeyBjaGFyICpzOyBzb2FwX2NhbGxfaF9faGVsbG8oc29hcF9uZXcoKSwgImh0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9oZWxsb2xpdHNlcnZlci5jZ2kiLCAiIiwgcyk7IHJldHVybiAhcHJpbnRmKCIlc1xuIiwgcyk7IH0KKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9vbmVsaW5lcnMvaGVsbG9zZXJ2ZXIuY3BwIGIvc2FtcGxlcy9vbmVsaW5lcnMvaGVsbG9zZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MDJjYTAKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL29uZWxpbmVycy9oZWxsb3NlcnZlci5jcHAKQEAgLTAsMCArMSw0IEBACisjaW5jbHVkZSAic29hcEguaCIKKyNpbmNsdWRlICJoLm5zbWFwIgoraW50IG1haW4oKSB7IHJldHVybiBzb2FwX3NlcnZlKHNvYXBfbmV3KCkpOyB9IGludCBoX19oZWxsbyhzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqJnMpIHsgcyA9ICJIZWxsbyBXb3JsZCEiOyByZXR1cm4gU09BUF9PSzsgfQorCmRpZmYgLS1naXQgYS9zYW1wbGVzL29uZWxpbmVycy9yb2xsLmggYi9zYW1wbGVzL29uZWxpbmVycy9yb2xsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgwZDUzNgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvb25lbGluZXJzL3JvbGwuaApAQCAtMCwwICsxIEBACityX19yb2xsKGludCYpOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9vbmVsaW5lcnMvcm9sbGNsaWVudC5jcHAgYi9zYW1wbGVzL29uZWxpbmVycy9yb2xsY2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDdhNzZmCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9vbmVsaW5lcnMvcm9sbGNsaWVudC5jcHAKQEAgLTAsMCArMSw0IEBACisjaW5jbHVkZSAic29hcEguaCIKKyNpbmNsdWRlICJyLm5zbWFwIgoraW50IG1haW4oKSB7IGludCBkOyBzb2FwX2NhbGxfcl9fcm9sbChzb2FwX25ldygpLCAiaHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL3JvbGxsaXRzZXJ2ZXIuY2dpIiwgIiIsIGQpOyByZXR1cm4gIXByaW50ZigiJWRcbiIsIGQpOyB9CisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvb25lbGluZXJzL3JvbGxzZXJ2ZXIuY3BwIGIvc2FtcGxlcy9vbmVsaW5lcnMvcm9sbHNlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEzYjI3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvb25lbGluZXJzL3JvbGxzZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsNCBAQAorI2luY2x1ZGUgInNvYXBILmgiCisjaW5jbHVkZSAici5uc21hcCIKK2ludCBtYWluKCkgeyByZXR1cm4gc29hcF9zZXJ2ZShzb2FwX25ldygpKTsgfSBpbnQgcl9fcm9sbChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50ICZyKSB7IHNyYW5kKHRpbWUoMCkpOyByID0gcmFuZCgpJTYrMTsgcmV0dXJuIFNPQVBfT0s7IH0KKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9wb2x5dGVzdC9NYWtlZmlsZSBiL3NhbXBsZXMvcG9seXRlc3QvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE2NjIxNAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvcG9seXRlc3QvTWFrZWZpbGUKQEAgLTAsMCArMSwyMCBAQAorR1NPQVA9Li4vLi4vc29hcGNwcDIKK1NPQVBIPS4uLy4uL3N0ZHNvYXAyLmgKK1NPQVBDPS4uLy4uL3N0ZHNvYXAyLmMKK1NPQVBDUFA9Li4vLi4vc3Rkc29hcDIuY3BwCitDQz1nY2MKK0NQUD1nKysKK0xJQlM9CitDT0ZMQUdTPS1PMgorQ1dGTEFHUz0tV2FsbAorQ0lGTEFHUz0tSS4uLy4uCitDTUZMQUdTPQorQ0ZMQUdTPSAkKENXRkxBR1MpICQoQ09GTEFHUykgJChDSUZMQUdTKSAkKENNRkxBR1MpCithbGw6CQlwb2x5dGVzdAorcG9seXRlc3Q6CXBvbHltb3JwaC5oIHBvbHltb3JwaC5jcHAgJChTT0FQSCkgJChTT0FQQ1BQKQorCQkkKEdTT0FQKSBwb2x5bW9ycGguaAorCQkkKENQUCkgJChDRkxBR1MpIC1vIHBvbHl0ZXN0IHBvbHltb3JwaC5jcHAgc29hcEMuY3BwIHNvYXBDbGllbnQuY3BwIHNvYXBTZXJ2ZXIuY3BwICQoU09BUENQUCkgJChMSUJTKQorY2xlYW46CisJCXJtIC1mICoubyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5LmgKK2Rpc3RjbGVhbjoKKwkJcm0gLWYgKi5vICoud3NkbCAqLnhzZCAqLnhtbCAqLm5zbWFwICoubG9nIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaCBwb2x5dGVzdApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9wb2x5dGVzdC9NYWtlZmlsZVNvbGFyaXMgYi9zYW1wbGVzL3BvbHl0ZXN0L01ha2VmaWxlU29sYXJpcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmMxY2FiCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9wb2x5dGVzdC9NYWtlZmlsZVNvbGFyaXMKQEAgLTAsMCArMSwyMCBAQAorR1NPQVA9Li4vLi4vc29hcGNwcDIKK1NPQVBIPS4uLy4uL3N0ZHNvYXAyLmgKK1NPQVBDPS4uLy4uL3N0ZHNvYXAyLmMKK1NPQVBDUFA9Li4vLi4vc3Rkc29hcDIuY3BwCitDQz1nY2MKK0NQUD1nKysKK0xJQlM9LWx4bmV0IC1sbnNsIC1sc29ja2V0CitDT0ZMQUdTPS1PMgorQ1dGTEFHUz0tV2FsbAorQ0lGTEFHUz0tSS4uLy4uCitDTUZMQUdTPQorQ0ZMQUdTPSAkKENXRkxBR1MpICQoQ09GTEFHUykgJChDSUZMQUdTKSAkKENNRkxBR1MpCithbGw6CQlwb2x5dGVzdAorcG9seXRlc3Q6CXBvbHltb3JwaC5oIHBvbHltb3JwaC5jcHAgJChTT0FQSCkgJChTT0FQQ1BQKQorCQkkKEdTT0FQKSBwb2x5bW9ycGguaAorCQkkKENQUCkgJChDRkxBR1MpIC1vIHBvbHl0ZXN0IHBvbHltb3JwaC5jcHAgc29hcEMuY3BwIHNvYXBDbGllbnQuY3BwIHNvYXBTZXJ2ZXIuY3BwICQoU09BUENQUCkgJChMSUJTKQorY2xlYW46CisJCXJtIC1mICoubyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5LmgKK2Rpc3RjbGVhbjoKKwkJcm0gLWYgKi5vICoud3NkbCAqLnhzZCAqLnhtbCAqLm5zbWFwICoubG9nIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaCBwb2x5dGVzdApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9wb2x5dGVzdC9wb2x5bW9ycGguY3BwIGIvc2FtcGxlcy9wb2x5dGVzdC9wb2x5bW9ycGguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2OWRjMmUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3BvbHl0ZXN0L3BvbHltb3JwaC5jcHAKQEAgLTAsMCArMSwxNjYgQEAKKy8qIFRoaXMgaXMgYm90aCBhIGNsaWVudCBhbmQgQ0dJLWJhc2VkIHNlcnZlciB0byBkZW1vbnN0cmF0ZQorICAgb2JqZWN0IGV4Y2hhbmdlIChkZXJpdmVkIHR5cGVzICsgb3ZlcnJpZGluZykKKyAgIEluc3RhbGwgYXMgQ0dJCisgICBGcm9tIHRoZSBjb21tYW5kIGxpbmU6CisgICBwb2x5dGVzdC5jZ2kgbworICAgcG9seXRlc3QuY2dpIHMKKyAgIHBvbHl0ZXN0LmNnaSBxCisgICBwb2x5dGVzdC5jZ2kgbAorKi8KKworI2luY2x1ZGUgInNvYXBILmgiCisjaW5jbHVkZSA8aW9zdHJlYW0uaD4KKworY29uc3QgY2hhciAqc2VydmVyID0gImh0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9wb2x5dGVzdDIuY2dpIjsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreyBzdHJ1Y3Qgc29hcCBzb2FwOworICBuc19fcG9seXRlc3RSZXNwb25zZSByOworICBzb2FwX2luaXQoJnNvYXApOworICBpZiAoYXJnYyA8PSAxKQorICAgIHNvYXBfc2VydmUoJnNvYXApOyAvLyBpZiBubyBhcmdzLCBhY3QgYXMgYSBDR0kgV2ViIHNlcnZpY2UKKyAgZWxzZQorICB7IHN3aXRjaCAoKmFyZ3ZbMV0pCisgICAgeyBjYXNlICdvJzoKKyAgICAgIHsgbnNfX09iamVjdCBvKCJTT0FQIik7CisgICAgICAgIGNvdXQgPDwgIlNlbmRpbmc6ICI7CisJby5wcmludCgpOworICAgICAgICBzb2FwX2NhbGxfbnNfX3BvbHl0ZXN0KCZzb2FwLCBzZXJ2ZXIsICIiLCAmbywgcik7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAncyc6CisgICAgICB7IG5zX19TaGFwZSBzKCJUcmlhbmdsZSIsIDMpOworICAgICAgICBjb3V0IDw8ICJTZW5kaW5nOiAiOworCXMucHJpbnQoKTsKKyAgICAgICAgc29hcF9jYWxsX25zX19wb2x5dGVzdCgmc29hcCwgc2VydmVyLCAiIiwgJnMsIHIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgJ3EnOgorICAgICAgeyBuc19fU2hhcGUgcSgiQ3ViaWNsZSIsIDIpOworICAgICAgICBjb3V0IDw8ICJTZW5kaW5nOiAiOworCXEucHJpbnQoKTsKKyAgICAgICAgc29hcF9jYWxsX25zX19wb2x5dGVzdCgmc29hcCwgc2VydmVyLCAiIiwgJnEsIHIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgJ2wnOgorICAgICAgeyBuc19fTGlzdCBsKDQpOworCWxbMF0gPSBuZXcgbnNfX09iamVjdCgiU09BUCIpOworCWxbMV0gPSBuZXcgbnNfX1NoYXBlKCJUcmlhbmdsZSIsIDMpOworCWxbMl0gPSBuZXcgbnNfX1NxdWFyZSgiQ3ViaWNsZSIsIDIpOworCW5zX19MaXN0IGwyKDEpOworICAgICAgICBsWzNdID0gJmwyOworCWwyWzBdID0gbmV3IG5zX19PYmplY3QoIkVuZCIpOworICAgICAgICBjb3V0IDw8ICJTZW5kaW5nOiAiOworCWwucHJpbnQoKTsKKyAgICAgICAgc29hcF9jYWxsX25zX19wb2x5dGVzdCgmc29hcCwgc2VydmVyLCAiIiwgJmwsIHIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biBjb21tYW5kXG5QbGVhc2UgdXNlICdvJywgJ3MnLCAncScsIG9yICdsJ1xuIik7CisJcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoc29hcC5lcnJvcikKKyAgICAgIHNvYXBfcHJpbnRfZmF1bHQoJnNvYXAsIHN0ZGVycik7CisgICAgZWxzZQorICAgIHsgY291dCA8PCAiUmVjZWl2ZWQ6ICI7CisgICAgICByLm91dC0+cHJpbnQoKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK25zX19PYmplY3Q6Om5zX19PYmplY3QoKQoreyBuYW1lID0gIk9iamVjdCI7Cit9CisKK25zX19PYmplY3Q6Om5zX19PYmplY3QoY29uc3QgY2hhciAqbmFtZSkKK3sgdGhpcy0+bmFtZSA9IChjaGFyKiluYW1lOworfQorCituc19fT2JqZWN0Ojp+bnNfX09iamVjdCgpCit7Cit9CisKK3ZvaWQgbnNfX09iamVjdDo6cHJpbnQoKQoreyBjb3V0IDw8ICJPYmplY3Q6ICIgPDwgKG5hbWU/bmFtZToiIikgPDwgZW5kbDsKK30KKworbnNfX1NoYXBlOjpuc19fU2hhcGUoKQoreyBuYW1lID0gIlNoYXBlIjsKKyAgc2lkZXMgPSAwOworfQorCituc19fU2hhcGU6Om5zX19TaGFwZShjb25zdCBjaGFyICpuYW1lLCBpbnQgc2lkZXMpCit7IHRoaXMtPm5hbWUgPSAoY2hhciopbmFtZTsKKyAgdGhpcy0+c2lkZXMgPSBzaWRlczsKK30KKworbnNfX1NoYXBlOjp+bnNfX1NoYXBlKCkKK3sKK30KKwordm9pZCBuc19fU2hhcGU6OnByaW50KCkKK3sgY291dCA8PCAiU2hhcGU6ICIgPDwgKG5hbWU/bmFtZToiIikgPDwgIiBzaWRlcz0iIDw8IHNpZGVzIDw8IGVuZGw7Cit9CisKK25zX19TcXVhcmU6Om5zX19TcXVhcmUoKQoreyBuYW1lID0gIlNxdWFyZSI7CisgIG5zX19TaGFwZTo6c2lkZXMgPSA0OworfQorCituc19fU3F1YXJlOjpuc19fU3F1YXJlKGNvbnN0IGNoYXIgKm5hbWUsIGludCBzaXplKQoreyB0aGlzLT5uYW1lID0gKGNoYXIqKW5hbWU7CisgIHRoaXMtPnNpemUgPSBzaXplOworICBuc19fU2hhcGU6OnNpZGVzID0gNDsKK30KKworbnNfX1NxdWFyZTo6fm5zX19TcXVhcmUoKQoreworfQorCit2b2lkIG5zX19TcXVhcmU6OnByaW50KCkKK3sgY291dCA8PCAiU3F1YXJlOiAiIDw8IChuYW1lP25hbWU6IiIpIDw8ICIgc2l6ZT0iIDw8IHNpemUgPDwgZW5kbDsKK30KKworbnNfX0xpc3Q6Om5zX19MaXN0KCkKK3sgX19wdHIgPSAwOworICBfX3NpemUgPSAwOworfQorCituc19fTGlzdDo6bnNfX0xpc3QoaW50IHNpemUpCit7IF9fcHRyID0gKG5zX19PYmplY3QqKiltYWxsb2Moc2l6ZSpzaXplb2YobnNfX09iamVjdCopKTsKKyAgX19zaXplID0gc2l6ZTsKK30KKworbnNfX0xpc3Q6On5uc19fTGlzdCgpCit7Cit9CisKK25zX19PYmplY3QqJiBuc19fTGlzdDo6b3BlcmF0b3JbXShpbnQgaSkKK3sgcmV0dXJuIF9fcHRyW2ldOworfQorCit2b2lkIG5zX19MaXN0OjpwcmludCgpCit7IGNvdXQgPDwgIkxpc3Q6IFsiIDw8IGVuZGw7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgX19zaXplOyBpKyspCisgICAgX19wdHJbaV0tPnByaW50KCk7CisgIGNvdXQgPDwgIl0iIDw8IGVuZGw7Cit9CisKKy8vIFdlYiBzZXJ2aWNlIHJlbW90ZSBtZXRob2QgaW1wbGVtZW50YXRpb246CisKK2ludCBuc19fcG9seXRlc3Qoc3RydWN0IHNvYXAgKnNvYXAsIG5zX19PYmplY3QgKmluLCBzdHJ1Y3QgbnNfX3BvbHl0ZXN0UmVzcG9uc2UgJnJlc3VsdCkKK3sgcmVzdWx0Lm91dCA9IGluOworICByZXR1cm4gU09BUF9PSzsKK30KKworc3RydWN0IE5hbWVzcGFjZSBuYW1lc3BhY2VzW10gPQoreworICB7IlNPQVAtRU5WIiwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIn0sCS8vIE1VU1QgYmUgZmlyc3QKKyAgeyJTT0FQLUVOQyIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyJ9LAkvLyBNVVNUIGJlIHNlY29uZAorICB7InhzaSIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL1hNTFNjaGVtYS1pbnN0YW5jZSJ9LAkJLy8gTVVTVCBiZSB0aGlyZAorICB7InhzZCIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL1hNTFNjaGVtYSJ9LAorICB7Im5zIiwgInVybjpjb3B5In0sCisgIHtOVUxMLCBOVUxMfQorfTsKKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9wb2x5dGVzdC9wb2x5bW9ycGguaCBiL3NhbXBsZXMvcG9seXRlc3QvcG9seW1vcnBoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNmZDdlNAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvcG9seXRlc3QvcG9seW1vcnBoLmgKQEAgLTAsMCArMSw0NSBAQAorLy9nc29hcCBucyBzZXJ2aWNlIG5hbWU6CXBvbHltb3JwaAorLy9nc29hcCBucyBzZXJ2aWNlIHN0eWxlOglycGMKKy8vZ3NvYXAgbnMgc2VydmljZSBlbmNvZGluZzoJZW5jb2RlZAorLy9nc29hcCBucyBzZXJ2aWNlIG5hbWVzcGFjZToJaHR0cDovL3dlYnNydi5jcy5mc3UuZWR1L35lbmdlbGVuL3BvbHltb3JwaC53c2RsCisvL2dzb2FwIG5zIHNlcnZpY2UgbG9jYXRpb246CWh0dHA6Ly93ZWJzcnYuY3MuZnN1LmVkdS9+ZW5nZWxlbi9wb2x5dGVzdC5jZ2kKKworLy9nc29hcCBucyBzY2hlbWEgbmFtZXNwYWNlOiB1cm46Y29weQorY2xhc3MgbnNfX09iamVjdAoreyBwdWJsaWM6CisgIGNoYXIgKm5hbWU7CisgIG5zX19PYmplY3QoKTsKKyAgbnNfX09iamVjdChjb25zdCBjaGFyICpuYW1lKTsKKyAgdmlydHVhbCB+bnNfX09iamVjdCgpOworICB2aXJ0dWFsIHZvaWQgcHJpbnQoKTsKK307CitjbGFzcyBuc19fU2hhcGU6IHB1YmxpYyBuc19fT2JqZWN0Cit7IHB1YmxpYzoKKyAgY2hhciAqbmFtZTsgLy8gdGVzdCBvdmVycmlkaW5nLCBib3RoIHRoZSBuc19fT2JqZWN0Om5hbWUgYW5kIG5zX19TaGFwZTpuYW1lIGFyZSBlbmNvZGVkCisgIGludCBzaWRlczsKKyAgbnNfX1NoYXBlKCk7CisgIG5zX19TaGFwZShjb25zdCBjaGFyICpuYW1lLCBpbnQgc2lkZXMpOworICB2aXJ0dWFsIH5uc19fU2hhcGUoKTsKKyAgdmlydHVhbCB2b2lkIHByaW50KCk7Cit9OworY2xhc3MgbnNfX1NxdWFyZTogcHVibGljIG5zX19TaGFwZQoreyBwdWJsaWM6CisgIGNoYXIgKm5hbWU7IC8vIHRlc3Qgb3ZlcnJpZGluZworICBzdGF0aWMgY29uc3QgaW50IHNpZGVzID0gNDsgLy8gd2lsbCBub3QgYmUgZW5kb2RlZCBhbmQgZGVjb2RlZAorICBpbnQgc2l6ZTsKKyAgbnNfX1NxdWFyZSgpOworICBuc19fU3F1YXJlKGNvbnN0IGNoYXIgKm5hbWUsIGludCBzaXplKTsKKyAgdmlydHVhbCB+bnNfX1NxdWFyZSgpOworICB2aXJ0dWFsIHZvaWQgcHJpbnQoKTsKK307CitjbGFzcyBuc19fTGlzdDogcHVibGljIG5zX19PYmplY3QgLy8gbnNfX0xpc3QgaXMgYSBkeW5hbWljIGFycmF5Cit7IHB1YmxpYzoKKyAgbnNfX09iamVjdCAqKl9fcHRyOyAvLyBhcnJheSBvZiBwb2ludGVycyB0byBvYmplY3RzCisgIGludCBfX3NpemU7CisgIG5zX19MaXN0KCk7CisgIG5zX19MaXN0KGludCBzaXplKTsKKyAgdmlydHVhbCB+bnNfX0xpc3QoKTsKKyAgdmlydHVhbCBuc19fT2JqZWN0KiYgb3BlcmF0b3JbXShpbnQgaSk7CisgIHZpcnR1YWwgdm9pZCBwcmludCgpOworfTsKK25zX19wb2x5dGVzdChuc19fT2JqZWN0ICppbiwgc3RydWN0IG5zX19wb2x5dGVzdFJlc3BvbnNlIHsgbnNfX09iamVjdCAqb3V0OyB9ICZyZXN1bHQpOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9xdW90ZS9NYWtlZmlsZSBiL3NhbXBsZXMvcXVvdGUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMwOTRhZgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvcXVvdGUvTWFrZWZpbGUKQEAgLTAsMCArMSwyMCBAQAorR1NPQVA9Li4vLi4vc29hcGNwcDIKK1NPQVBIPS4uLy4uL3N0ZHNvYXAyLmgKK1NPQVBDPS4uLy4uL3N0ZHNvYXAyLmMKK1NPQVBDUFA9Li4vLi4vc3Rkc29hcDIuY3BwCitDQz1nY2MKK0NQUD1nKysKK0xJQlM9CitDT0ZMQUdTPS1PMgorQ1dGTEFHUz0tV2FsbAorQ0lGTEFHUz0tSS4uLy4uCitDTUZMQUdTPQorQ0ZMQUdTPSAkKENXRkxBR1MpICQoQ09GTEFHUykgJChDSUZMQUdTKSAkKENNRkxBR1MpCithbGw6CQlxdW90ZQorcXVvdGU6CQlxdW90ZS5oIHF1b3RlLmMgJChTT0FQSCkgJChTT0FQQykKKwkJJChHU09BUCkgLWMgcXVvdGUuaAorCQkkKENDKSAkKENGTEFHUykgLW8gcXVvdGUgcXVvdGUuYyBzb2FwQy5jIHNvYXBDbGllbnQuYyAkKFNPQVBDKSAkKExJQlMpCitjbGVhbjoKKwkJcm0gLWYgKi5vIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaAorZGlzdGNsZWFuOgorCQlybSAtZiAqLm8gKi53c2RsICoueHNkICoueG1sICoubnNtYXAgKi5sb2cgc29hcEguaCBzb2FwU3R1Yi5oIHNvYXBDLmNwcCBzb2FwQy5jIHNvYXBDbGllbnQuY3BwIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmNwcCBzb2FwU2VydmVyLmMgc29hcCpQcm94eS5oIHF1b3RlCmRpZmYgLS1naXQgYS9zYW1wbGVzL3F1b3RlL01ha2VmaWxlU29sYXJpcyBiL3NhbXBsZXMvcXVvdGUvTWFrZWZpbGVTb2xhcmlzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMzc1MzYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3F1b3RlL01ha2VmaWxlU29sYXJpcwpAQCAtMCwwICsxLDIwIEBACitHU09BUD0uLi8uLi9zb2FwY3BwMgorU09BUEg9Li4vLi4vc3Rkc29hcDIuaAorU09BUEM9Li4vLi4vc3Rkc29hcDIuYworU09BUENQUD0uLi8uLi9zdGRzb2FwMi5jcHAKK0NDPWdjYworQ1BQPWcrKworTElCUz0tbHhuZXQgLWxuc2wgLWxzb2NrZXQKK0NPRkxBR1M9LU8yCitDV0ZMQUdTPS1XYWxsCitDSUZMQUdTPS1JLi4vLi4KK0NNRkxBR1M9CitDRkxBR1M9ICQoQ1dGTEFHUykgJChDT0ZMQUdTKSAkKENJRkxBR1MpICQoQ01GTEFHUykKK2FsbDoJCXF1b3RlCitxdW90ZToJCXF1b3RlLmggcXVvdGUuYyAkKFNPQVBIKSAkKFNPQVBDKQorCQkkKEdTT0FQKSAtYyBxdW90ZS5oCisJCSQoQ0MpICQoQ0ZMQUdTKSAtbyBxdW90ZSBxdW90ZS5jIHNvYXBDLmMgc29hcENsaWVudC5jICQoU09BUEMpICQoTElCUykKK2NsZWFuOgorCQlybSAtZiAqLm8gc29hcEguaCBzb2FwU3R1Yi5oIHNvYXBDLmNwcCBzb2FwQy5jIHNvYXBDbGllbnQuY3BwIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmNwcCBzb2FwU2VydmVyLmMgc29hcCpQcm94eS5oCitkaXN0Y2xlYW46CisJCXJtIC1mICoubyAqLndzZGwgKi54c2QgKi54bWwgKi5uc21hcCAqLmxvZyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5LmggcXVvdGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvcXVvdGUvcXVvdGUuYyBiL3NhbXBsZXMvcXVvdGUvcXVvdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTNjMmUwCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9xdW90ZS9xdW90ZS5jCkBAIC0wLDAgKzEsMzQgQEAKKyNpbmNsdWRlICJzb2FwSC5oIgkvKiBpbmNsdWRlIGdlbmVyYXRlZCBwcm94eSBhbmQgU09BUCBzdXBwb3J0ICovCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sgc3RydWN0IHNvYXAgc29hcDsKKyAgZmxvYXQgcTsKKyAgY2hhciAqc3ltOworICBpZiAoYXJnYyA+IDEpCisgICAgc3ltID0gYXJndlsxXTsKKyAgZWxzZQorICB7IGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IHF1b3RlIDx0aWNrZXI+XG4iKTsKKyAgICBleGl0KDEpOworICB9CisgIHNvYXBfaW5pdCgmc29hcCk7CisgIGlmIChzb2FwX2NhbGxfbnNfX2dldFF1b3RlKCZzb2FwLCAiaHR0cDovL3NlcnZpY2VzLnhtZXRob2RzLm5ldC9zb2FwIiwgIiIsIHN5bSwgJnEpID09IDApCisgICAgIHByaW50ZigiXG5Db21wYW55IC0gJXMgICAgUXVvdGUgLSAlZlxuIiwgc3ltLCBxKTsKKyAgZWxzZQorICAgIHNvYXBfcHJpbnRfZmF1bHQoJnNvYXAsIHN0ZGVycik7CisgIHNvYXBfZW5kKCZzb2FwKTsKKyAgc29hcF9kb25lKCZzb2FwKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBuYW1lc3BhY2UgbWFwcGluZyB0YWJsZSBpcyByZXF1aXJlZCBhbmQgYXNzb2NpYXRlcyBuYW1lc3BhY2UgcHJlZml4ZXMgd2l0aCBuYW1lc3BhY2UgbmFtZXM6ICovCitzdHJ1Y3QgTmFtZXNwYWNlIG5hbWVzcGFjZXNbXSA9Cit7CisgIHsiU09BUC1FTlYiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8ifSwJLyogTVVTVCBiZSBmaXJzdCAqLworICB7IlNPQVAtRU5DIiwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIn0sCS8qIE1VU1QgYmUgc2Vjb25kICovCisgIHsieHNpIiwgImh0dHA6Ly93d3cudzMub3JnLzE5OTkvWE1MU2NoZW1hLWluc3RhbmNlIiwgImh0dHA6Ly93d3cudzMub3JnLyovWE1MU2NoZW1hLWluc3RhbmNlIn0sCS8qIE1VU1QgYmUgdGhpcmQgKi8KKyAgeyJ4c2QiLCAiaHR0cDovL3d3dy53My5vcmcvMTk5OS9YTUxTY2hlbWEiLCAiaHR0cDovL3d3dy53My5vcmcvKi9YTUxTY2hlbWEifSwKKyAgeyJucyIsICJ1cm46eG1ldGhvZHMtZGVsYXllZC1xdW90ZXMifSwJLyogTWV0aG9kIG5hbWVzcGFjZSBVUkkgKi8KKyAge05VTEwsIE5VTEx9Cit9OworCisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvcXVvdGUvcXVvdGUuaCBiL3NhbXBsZXMvcXVvdGUvcXVvdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWZmMzdmCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9xdW90ZS9xdW90ZS5oCkBAIC0wLDAgKzEsOSBAQAorLy9nc29hcCBucyBzZXJ2aWNlIG5hbWU6CXF1b3RlCisvL2dzb2FwIG5zIHNlcnZpY2Ugc3R5bGU6CXJwYworLy9nc29hcCBucyBzZXJ2aWNlIGVuY29kaW5nOgllbmNvZGVkCisvL2dzb2FwIG5zIHNlcnZpY2UgbmFtZXNwYWNlOgl1cm46eG1ldGhvZHMtZGVsYXllZC1xdW90ZXMKKy8vZ3NvYXAgbnMgc2VydmljZSBsb2NhdGlvbjoJaHR0cDovL3NlcnZpY2VzLnhtZXRob2RzLm5ldC9zb2FwCisKKy8vZ3NvYXAgbnMgc2VydmljZSBtZXRob2QtYWN0aW9uOiBnZXRRdW90ZSAiIgorCitpbnQgbnNfX2dldFF1b3RlKGNoYXIgKnN5bWJvbCwgZmxvYXQgKlJlc3VsdCk7CmRpZmYgLS1naXQgYS9zYW1wbGVzL3F1b3RlMi9NYWtlZmlsZSBiL3NhbXBsZXMvcXVvdGUyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMTUwY2YKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3F1b3RlMi9NYWtlZmlsZQpAQCAtMCwwICsxLDIwIEBACitHU09BUD0uLi8uLi9zb2FwY3BwMgorU09BUEg9Li4vLi4vc3Rkc29hcDIuaAorU09BUEM9Li4vLi4vc3Rkc29hcDIuYworU09BUENQUD0uLi8uLi9zdGRzb2FwMi5jcHAKK0NDPWdjYworQ1BQPWcrKworTElCUz0KK0NPRkxBR1M9LU8yCitDV0ZMQUdTPS1XYWxsCitDSUZMQUdTPS1JLi4vLi4KK0NNRkxBR1M9CitDRkxBR1M9ICQoQ1dGTEFHUykgJChDT0ZMQUdTKSAkKENJRkxBR1MpICQoQ01GTEFHUykKK2FsbDoJCXF1b3RlMgorcXVvdGUyOgkJcXVvdGUyLmggcXVvdGUyLmMgJChTT0FQSCkgJChTT0FQQykKKwkJJChHU09BUCkgLWMgcXVvdGUyLmgKKwkJJChDQykgJChDRkxBR1MpIC1vIHF1b3RlMiBxdW90ZTIuYyBzb2FwQy5jIHNvYXBDbGllbnQuYyAkKFNPQVBDKSAkKExJQlMpCitjbGVhbjoKKwkJcm0gLWYgKi5vIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaAorZGlzdGNsZWFuOgorCQlybSAtZiAqLm8gKi53c2RsICoueHNkICoueG1sICoubnNtYXAgKi5sb2cgc29hcEguaCBzb2FwU3R1Yi5oIHNvYXBDLmNwcCBzb2FwQy5jIHNvYXBDbGllbnQuY3BwIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmNwcCBzb2FwU2VydmVyLmMgc29hcCpQcm94eS5oIHF1b3RlMgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9xdW90ZTIvTWFrZWZpbGVTb2xhcmlzIGIvc2FtcGxlcy9xdW90ZTIvTWFrZWZpbGVTb2xhcmlzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NjQyZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3F1b3RlMi9NYWtlZmlsZVNvbGFyaXMKQEAgLTAsMCArMSwyMCBAQAorR1NPQVA9Li4vLi4vc29hcGNwcDIKK1NPQVBIPS4uLy4uL3N0ZHNvYXAyLmgKK1NPQVBDPS4uLy4uL3N0ZHNvYXAyLmMKK1NPQVBDUFA9Li4vLi4vc3Rkc29hcDIuY3BwCitDQz1nY2MKK0NQUD1nKysKK0xJQlM9LWx4bmV0IC1sbnNsIC1sc29ja2V0CitDT0ZMQUdTPS1PMgorQ1dGTEFHUz0tV2FsbAorQ0lGTEFHUz0tSS4uLy4uCitDTUZMQUdTPQorQ0ZMQUdTPSAkKENXRkxBR1MpICQoQ09GTEFHUykgJChDSUZMQUdTKSAkKENNRkxBR1MpCithbGw6CQlxdW90ZTIKK3F1b3RlMjoJCXF1b3RlMi5oIHF1b3RlMi5jICQoU09BUEgpICQoU09BUEMpCisJCSQoR1NPQVApIC1jIHF1b3RlMi5oCisJCSQoQ0MpICQoQ0ZMQUdTKSAtbyBxdW90ZTIgcXVvdGUyLmMgc29hcEMuYyBzb2FwQ2xpZW50LmMgJChTT0FQQykgJChMSUJTKQorY2xlYW46CisJCXJtIC1mICoubyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5LmgKK2Rpc3RjbGVhbjoKKwkJcm0gLWYgKi5vICoud3NkbCAqLnhzZCAqLnhtbCAqLm5zbWFwICoubG9nIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaCBxdW90ZTIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvcXVvdGUyL3F1b3RlMi5jIGIvc2FtcGxlcy9xdW90ZTIvcXVvdGUyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg5NWEwZAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvcXVvdGUyL3F1b3RlMi5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qCWdldFF1b3RlIGV4YW1wbGUgd2l0aCBhc3luY2hyb25vdXMgU09BUCBtZXNzYWdpbmcKKyovCisjaW5jbHVkZSAic29hcEguaCIKKworaW50IG1haW4oKQoreyBzdHJ1Y3Qgc29hcCBzb2FwOworICBzdHJ1Y3QgbnNfX2dldFF1b3RlUmVzcG9uc2UgcjsKKyAgc29hcF9pbml0KCZzb2FwKTsKKyAgaWYgKHNvYXBfc2VuZF9uc19fZ2V0UXVvdGUoJnNvYXAsICJodHRwOi8vc2VydmljZXMueG1ldGhvZHMubmV0L3NvYXAiLCAiIiwgIklCTSIpKQorICAgIHNvYXBfcHJpbnRfZmF1bHQoJnNvYXAsIHN0ZGVycik7CisgIGVsc2UgaWYgKHNvYXBfcmVjdl9uc19fZ2V0UXVvdGVSZXNwb25zZSgmc29hcCwgJnIpKQorICAgIHNvYXBfcHJpbnRfZmF1bHQoJnNvYXAsIHN0ZGVycik7CisgIGVsc2UKKyAgICBwcmludGYoIklCTTogJWZcbiIsIHIuUmVzdWx0KTsKKyAgc29hcF9lbmQoJnNvYXApOworICBzb2FwX2RvbmUoJnNvYXApOworICByZXR1cm4gMDsKK30KKworc3RydWN0IE5hbWVzcGFjZSBuYW1lc3BhY2VzW10gPQoreworICB7IlNPQVAtRU5WIiwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIn0sCS8qIE1VU1QgYmUgZmlyc3QgKi8KKyAgeyJTT0FQLUVOQyIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyJ9LAkvKiBNVVNUIGJlIHNlY29uZCAqLworICB7InhzaSIsICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hNTFNjaGVtYS1pbnN0YW5jZSJ9LAkJLyogTVVTVCBiZSB0aGlyZCAqLworICB7InhzZCIsICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hNTFNjaGVtYSJ9LAorICB7Im5zIiwgInVybjp4bWV0aG9kcy1kZWxheWVkLXF1b3RlcyJ9LAkvKiBNZXRob2QgbmFtZXNwYWNlIFVSSSAqLworICB7TlVMTCwgTlVMTH0KK307CisKKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9xdW90ZTIvcXVvdGUyLmggYi9zYW1wbGVzL3F1b3RlMi9xdW90ZTIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjg1MjliCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9xdW90ZTIvcXVvdGUyLmgKQEAgLTAsMCArMSw5IEBACisvKglnZXRRdW90ZSBleGFtcGxlIHdpdGggYXN5bmNocm9ub3VzIFNPQVAgbWVzc2FnaW5nCisqLworLy9nc29hcCBucyBzZXJ2aWNlIG5hbWU6CXF1b3RlCisvL2dzb2FwIG5zIHNlcnZpY2Ugc3R5bGU6CXJwYworLy9nc29hcCBucyBzZXJ2aWNlIGVuY29kaW5nOgllbmNvZGVkCisvL2dzb2FwIG5zIHNlcnZpY2UgbmFtZXNwYWNlOgl1cm46eG1ldGhvZHMtZGVsYXllZC1xdW90ZXMKKy8vZ3NvYXAgbnMgc2VydmljZSBsb2NhdGlvbjoJaHR0cDovL3NlcnZpY2VzLnhtZXRob2RzLm5ldC9zb2FwCituc19fZ2V0UXVvdGUoY2hhciAqc3ltYm9sLCB2b2lkIGR1bW15KTsKK25zX19nZXRRdW90ZVJlc3BvbnNlKGZsb2F0IFJlc3VsdCwgdm9pZCBkdW1teSk7CmRpZmYgLS1naXQgYS9zYW1wbGVzL3F1b3RlMy9NYWtlZmlsZSBiL3NhbXBsZXMvcXVvdGUzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MWE3MWYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3F1b3RlMy9NYWtlZmlsZQpAQCAtMCwwICsxLDIwIEBACitHU09BUD0uLi8uLi9zb2FwY3BwMgorU09BUEg9Li4vLi4vc3Rkc29hcDIuaAorU09BUEM9Li4vLi4vc3Rkc29hcDIuYworU09BUENQUD0uLi8uLi9zdGRzb2FwMi5jcHAKK0NDPWdjYworQ1BQPWcrKworTElCUz0KK0NPRkxBR1M9LU8yCitDV0ZMQUdTPS1XYWxsCitDSUZMQUdTPS1JLi4vLi4KK0NNRkxBR1M9CitDRkxBR1M9ICQoQ1dGTEFHUykgJChDT0ZMQUdTKSAkKENJRkxBR1MpICQoQ01GTEFHUykKK2FsbDoJCXF1b3RlMworcXVvdGUzOgkJcXVvdGUzLmggcXVvdGUzLmNwcCAkKFNPQVBIKSAkKFNPQVBDUFApCisJCSQoR1NPQVApIHF1b3RlMy5oCisJCSQoQ1BQKSAkKENGTEFHUykgLW8gcXVvdGUzIHF1b3RlMy5jcHAgc29hcEMuY3BwIHNvYXBDbGllbnQuY3BwICQoU09BUENQUCkgJChMSUJTKQorY2xlYW46CisJCXJtIC1mICoubyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5LmgKK2Rpc3RjbGVhbjoKKwkJcm0gLWYgKi5vICoud3NkbCAqLnhzZCAqLnhtbCAqLm5zbWFwICoubG9nIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaCBxdW90ZTMKZGlmZiAtLWdpdCBhL3NhbXBsZXMvcXVvdGUzL01ha2VmaWxlU29sYXJpcyBiL3NhbXBsZXMvcXVvdGUzL01ha2VmaWxlU29sYXJpcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjI1ZjUyCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9xdW90ZTMvTWFrZWZpbGVTb2xhcmlzCkBAIC0wLDAgKzEsMjAgQEAKK0dTT0FQPS4uLy4uL3NvYXBjcHAyCitTT0FQSD0uLi8uLi9zdGRzb2FwMi5oCitTT0FQQz0uLi8uLi9zdGRzb2FwMi5jCitTT0FQQ1BQPS4uLy4uL3N0ZHNvYXAyLmNwcAorQ0M9Z2NjCitDUFA9ZysrCitMSUJTPS1seG5ldCAtbG5zbCAtbHNvY2tldAorQ09GTEFHUz0tTzIKK0NXRkxBR1M9LVdhbGwKK0NJRkxBR1M9LUkuLi8uLgorQ01GTEFHUz0KK0NGTEFHUz0gJChDV0ZMQUdTKSAkKENPRkxBR1MpICQoQ0lGTEFHUykgJChDTUZMQUdTKQorYWxsOgkJcXVvdGUzCitxdW90ZTM6CQlxdW90ZTMuaCBxdW90ZTMuY3BwICQoU09BUEgpICQoU09BUENQUCkKKwkJJChHU09BUCkgcXVvdGUzLmgKKwkJJChDUFApICQoQ0ZMQUdTKSAtbyBxdW90ZTMgcXVvdGUzLmNwcCBzb2FwQy5jcHAgc29hcENsaWVudC5jcHAgJChTT0FQQ1BQKSAkKExJQlMpCitjbGVhbjoKKwkJcm0gLWYgKi5vIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaAorZGlzdGNsZWFuOgorCQlybSAtZiAqLm8gKi53c2RsICoueHNkICoueG1sICoubnNtYXAgKi5sb2cgc29hcEguaCBzb2FwU3R1Yi5oIHNvYXBDLmNwcCBzb2FwQy5jIHNvYXBDbGllbnQuY3BwIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmNwcCBzb2FwU2VydmVyLmMgc29hcCpQcm94eS5oIHF1b3RlMwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9xdW90ZTMvcXVvdGUzLmNwcCBiL3NhbXBsZXMvcXVvdGUzL3F1b3RlMy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU2ZTQzNAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvcXVvdGUzL3F1b3RlMy5jcHAKQEAgLTAsMCArMSwyNyBAQAorI2luY2x1ZGUgInNvYXBRdW90ZVByb3h5LmgiCS8vIGdldCBwcm94eQorI2luY2x1ZGUgIlF1b3RlLm5zbWFwIgkJLy8gZ2V0IG5hbWVzcGFjZSBiaW5kaW5ncworCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitjbGFzcyBTdG9jayA6IHB1YmxpYyBRdW90ZQkvLyBRdW90ZSBpcyB0aGUgbmFtZSBvZiB0aGUgc2VydmljZSAoc2VlIHF1b3RlMy5oIGFuZCBRdW90ZS53c2RsKQoreyBwdWJsaWM6CisgIGNoYXIgKnN5bWJvbDsJCQkvLyBTdG9jayB0aWNrZXIKKyAgU3RvY2soKSA6IFF1b3RlKCkgeyBzeW1ib2wgPSBOVUxMOyB9OworICBTdG9jayhjaGFyICp0aWNrZXIpIHsgc3ltYm9sID0gdGlja2VyOyB9OworICB2b2lkIHRpY2tlcihjaGFyICp0aWNrZXIpIHsgc3ltYm9sID0gdGlja2VyOyB9OworICBmbG9hdCBxdW90ZSgpIHsgZmxvYXQgcTsgbnNfX2dldFF1b3RlKHN5bWJvbCwgcSk7IHJldHVybiBxOyB9OworfTsKKworaW50IG1haW4oKQoreyBRdW90ZSBxOworICBmbG9hdCByOworICAvLyBFeGFtcGxlIHVzaW5nIHRoZSBRdW90ZSBwcm94eSBjbGFzcyBkaXJlY3RseToKKyAgaWYgKHEubnNfX2dldFF1b3RlKCJJQk0iLCByKSA9PSBTT0FQX09LKQorICAgIGNvdXQgPDwgciA8PCBlbmRsOworICBlbHNlCisgICAgc29hcF9wcmludF9mYXVsdChxLnNvYXAsIHN0ZGVycik7CisgIC8vIEV4YW1wbGUgdXNpbmcgdGhlIGRlcml2ZWQgU3RvY2sgcHJveHkgY2xhc3M6CisgIFN0b2NrIElCTSgiSUJNIik7CisgIGNvdXQgPDwgSUJNLnF1b3RlKCkgPDwgZW5kbDsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL3F1b3RlMy9xdW90ZTMuaCBiL3NhbXBsZXMvcXVvdGUzL3F1b3RlMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZTRlNWUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3F1b3RlMy9xdW90ZTMuaApAQCAtMCwwICsxLDggQEAKKy8vZ3NvYXAgbnMgc2VydmljZSBuYW1lOglRdW90ZQorLy9nc29hcCBucyBzZXJ2aWNlIHN0eWxlOglycGMKKy8vZ3NvYXAgbnMgc2VydmljZSBlbmNvZGluZzoJZW5jb2RlZAorLy9nc29hcCBucyBzZXJ2aWNlIG5hbWVzcGFjZToJdXJuOnhtZXRob2RzLWRlbGF5ZWQtcXVvdGVzCisvL2dzb2FwIG5zIHNlcnZpY2UgbG9jYXRpb246CWh0dHA6Ly9zZXJ2aWNlcy54bWV0aG9kcy5uZXQvc29hcAorCisvL2dzb2FwIG5zIHNlcnZpY2UgbWV0aG9kLWFjdGlvbjogZ2V0UXVvdGUgIiIKK2ludCBuc19fZ2V0UXVvdGUoY2hhciAqc3ltYm9sLCBmbG9hdCAmUmVzdWx0KTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvcXVvdGU0L01ha2VmaWxlIGIvc2FtcGxlcy9xdW90ZTQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYyNjJmMwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvcXVvdGU0L01ha2VmaWxlCkBAIC0wLDAgKzEsMjAgQEAKK0dTT0FQPS4uLy4uL3NvYXBjcHAyCitTT0FQSD0uLi8uLi9zdGRzb2FwMi5oCitTT0FQQz0uLi8uLi9zdGRzb2FwMi5jCitTT0FQQ1BQPS4uLy4uL3N0ZHNvYXAyLmNwcAorQ0M9Z2NjCitDUFA9ZysrCitMSUJTPQorQ09GTEFHUz0tTzIKK0NXRkxBR1M9LVdhbGwKK0NJRkxBR1M9LUkuLi8uLgorQ01GTEFHUz0KK0NGTEFHUz0gJChDV0ZMQUdTKSAkKENPRkxBR1MpICQoQ0lGTEFHUykgJChDTUZMQUdTKQorYWxsOgkJcXVvdGU0CitxdW90ZTQ6CQlxdW90ZTQuaCBxdW90ZTQuY3BwICQoU09BUEgpICQoU09BUENQUCkKKwkJJChHU09BUCkgJChDSUZMQUdTKSBxdW90ZTQuaAorCQkkKENQUCkgJChDRkxBR1MpIC1vIHF1b3RlNCBxdW90ZTQuY3BwIGRvbSsrLmNwcCBzb2FwQy5jcHAgc29hcENsaWVudC5jcHAgJChTT0FQQ1BQKSAkKExJQlMpCitjbGVhbjoKKwkJcm0gLWYgKi5vIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaAorZGlzdGNsZWFuOgorCQlybSAtZiAqLm8gKi53c2RsICoueHNkICoueG1sICoubnNtYXAgKi5sb2cgc29hcEguaCBzb2FwU3R1Yi5oIHNvYXBDLmNwcCBzb2FwQy5jIHNvYXBDbGllbnQuY3BwIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmNwcCBzb2FwU2VydmVyLmMgc29hcCpQcm94eS5oIHF1b3RlNApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9xdW90ZTQvTWFrZWZpbGVTb2xhcmlzIGIvc2FtcGxlcy9xdW90ZTQvTWFrZWZpbGVTb2xhcmlzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMDZjM2EKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3F1b3RlNC9NYWtlZmlsZVNvbGFyaXMKQEAgLTAsMCArMSwyMCBAQAorR1NPQVA9Li4vLi4vc29hcGNwcDIKK1NPQVBIPS4uLy4uL3N0ZHNvYXAyLmgKK1NPQVBDPS4uLy4uL3N0ZHNvYXAyLmMKK1NPQVBDUFA9Li4vLi4vc3Rkc29hcDIuY3BwCitDQz1nY2MKK0NQUD1nKysKK0xJQlM9LWx4bmV0IC1sbnNsIC1sc29ja2V0CitDT0ZMQUdTPS1PMgorQ1dGTEFHUz0tV2FsbAorQ0lGTEFHUz0tSS4uLy4uCitDTUZMQUdTPQorQ0ZMQUdTPSAkKENXRkxBR1MpICQoQ09GTEFHUykgJChDSUZMQUdTKSAkKENNRkxBR1MpCithbGw6CQlxdW90ZTQKK3F1b3RlNDoJCXF1b3RlNC5oIHF1b3RlNC5jcHAgJChTT0FQSCkgJChTT0FQQ1BQKQorCQkkKEdTT0FQKSAkKENJRkxBR1MpIHF1b3RlNC5oCisJCSQoQ1BQKSAkKENGTEFHUykgLW8gcXVvdGU0IHF1b3RlNC5jcHAgc29hcEMuY3BwIHNvYXBDbGllbnQuY3BwICQoU09BUENQUCkgJChMSUJTKQorY2xlYW46CisJCXJtIC1mICoubyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5LmgKK2Rpc3RjbGVhbjoKKwkJcm0gLWYgKi5vICoud3NkbCAqLnhzZCAqLnhtbCAqLm5zbWFwICoubG9nIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaCBxdW90ZTQKZGlmZiAtLWdpdCBhL3NhbXBsZXMvcXVvdGU0L2RvbSsrLmNwcCBiL3NhbXBsZXMvcXVvdGU0L2RvbSsrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjE0OTk2Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9xdW90ZTQvZG9tKysuY3BwCkBAIC0wLDAgKzEsOTA5IEBACisvKgorCitkb20uY1twcF0KKworZ1NPQVAgRE9NIGltcGxlbWVudGF0aW9uCisKK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMS0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgcGFydCBvZiB0aGUgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXM6CitHUEwsIHRoZSBnU09BUCBwdWJsaWMgbGljZW5zZSwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIHB1YmxpYyBsaWNlbnNlLgorCitUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBnU09BUCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMworKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCitMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK2h0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9zb2FwbGljZW5zZS5odG1sCitTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAorV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCitmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLgorQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLCBHZW5pdmlhIGluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlEZXZlbG9wbWVudCBub3RlOgorCVJldXNlZCB0aGUgZ1NPQVAgc3RydWN0IHNvYXAgaWQgaGFzaCB0YWJsZSBmb3IgaGFuZGxpbmcgbmFtZXNwYWNlCisJYmluZGluZ3Mgd2hlbiB0cmFuc21pdHRpbmcgRE9NcworCitDaGFuZ2VzOgorCVJlbmFtZWQgX190eXBlIHRvIHR5cGUgKGNvcnJlY3Rpb24pCisJZG9tLmMsIGRvbSsrLmNwcCwgYW5kIGRvbS5jcHAgYXJlIGVxdWl2YWxlbnQKKwlSZW5hbWVkIFNPQVBfWE1MX1RSRUUgdG8gU09BUF9ET01fVFJFRQorCVJlbmFtZWQgU09BUF9YTUxfR1JBUEggdG8gU09BUF9ET01fTk9ERQorCUFkZGVkIFNPQVBfRE9NX0FTSVMKKworVE9ETzoJSW1wcm92ZSBtaXhlZCBjb250ZW50IGhhbmRsaW5nCisqLworCisjaW5jbHVkZSAic3Rkc29hcDIuaCIKKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfeHNkX19hbnlUeXBlKHN0cnVjdCBzb2FwKiwgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgY29uc3QqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfZGVmYXVsdF94c2RfX2FueVR5cGUoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfeHNkX19hbnlUeXBlKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRfeHNkX19hbnlUeXBlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfeHNkX19hbnlUeXBlKHN0cnVjdCBzb2FwKiwgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKiBTT0FQX0ZNQUMyIHNvYXBfaW5feHNkX19hbnlUeXBlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9tYXJrZWxlbWVudChzdHJ1Y3Qgc29hcCosIGNvbnN0IHZvaWQqLCBpbnQpOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dGVsZW1lbnQoc3RydWN0IHNvYXAqLCBjb25zdCB2b2lkKiwgY29uc3QgY2hhciosIGludCwgaW50KTsKK1NPQVBfRk1BQzMgdm9pZCAqU09BUF9GTUFDNCBzb2FwX2dldGVsZW1lbnQoc3RydWN0IHNvYXAqLCBpbnQqKTsKKworLyogZm9ybWF0IHN0cmluZyBmb3IgZ2VuZXJhdGluZyBET00gbmFtZXNwYWNlIHByZWZpeGVzICg8PSAxNiBjaGFycyB0b3RhbCkgKi8KKyNkZWZpbmUgU09BUF9ET01JRF9GT1JNQVQgImRvbSVkIgorCisvKiBuYW1lc3BhY2UgbmFtZSAoVVJJKSBsb29rdXAgYW5kIHN0b3JlIHJvdXRpbmVzICovCitzdGF0aWMgc3RydWN0IHNvYXBfaWxpc3QgKnNvYXBfbG9va3VwX25zKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworc3RhdGljIHN0cnVjdCBzb2FwX2lsaXN0ICpzb2FwX2VudGVyX25zKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglET00gY3VzdG9tIChkZSlzZXJpYWxpemVycworICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2VyaWFsaXplX3hzZF9fYW55VHlwZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKm5vZGUpCit7IGlmIChub2RlKQorICB7IGlmIChub2RlLT50eXBlICYmIG5vZGUtPm5vZGUpCisgICAgICBzb2FwX21hcmtlbGVtZW50KHNvYXAsIG5vZGUtPm5vZGUsIG5vZGUtPnR5cGUpOworICAgIGVsc2UKKyAgICB7IGNvbnN0IHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICplbHQ7CisgICAgICBmb3IgKGVsdCA9IG5vZGUtPmVsdHM7IGVsdDsgZWx0ID0gZWx0LT5uZXh0KQorICAgICAgICBzb2FwX3NlcmlhbGl6ZV94c2RfX2FueVR5cGUoc29hcCwgZWx0KTsKKyAgICB9CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZGVmYXVsdF94c2RfX2FueVR5cGUoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICpub2RlKQoreyBub2RlLT5uZXh0ID0gTlVMTDsKKyAgbm9kZS0+cHJudCA9IE5VTEw7CisgIG5vZGUtPmVsdHMgPSBOVUxMOworICBub2RlLT5hdHRzID0gTlVMTDsKKyAgbm9kZS0+bnN0ciA9IE5VTEw7CisgIG5vZGUtPm5hbWUgPSBOVUxMOworICBub2RlLT5kYXRhID0gTlVMTDsKKyAgbm9kZS0+d2lkZSA9IE5VTEw7CisgIG5vZGUtPm5vZGUgPSBOVUxMOworICBub2RlLT50eXBlID0gMDsKKyAgbm9kZS0+aGVhZCA9IE5VTEw7CisgIG5vZGUtPnRhaWwgPSBOVUxMOworICBub2RlLT5zb2FwID0gc29hcDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgCitvdXRfZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKm5vZGUsIGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqbnN0cikKK3sgaWYgKG5vZGUtPmhlYWQgJiYgc29hcF9zZW5kKHNvYXAsIG5vZGUtPmhlYWQpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKCFwcmVmaXgpCisgIHsgaWYgKG5vZGUtPnR5cGUgJiYgbm9kZS0+bm9kZSkKKyAgICAgIHJldHVybiBzb2FwX3B1dGVsZW1lbnQoc29hcCwgbm9kZS0+bm9kZSwgbmFtZSwgMCwgbm9kZS0+dHlwZSk7CisgICAgcmV0dXJuIHNvYXBfZWxlbWVudChzb2FwLCBuYW1lLCAwLCBOVUxMKTsgLyogZWxlbWVudCgpICovCisgIH0KKyAgaWYgKG5vZGUtPnR5cGUgJiYgbm9kZS0+bm9kZSkKKyAgeyBjaGFyICpzID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihwcmVmaXgpICsgc3RybGVuKG5hbWUpICsgMik7CisgICAgaWYgKCFzKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgc3ByaW50ZihzLCAiJXM6JXMiLCBwcmVmaXgsIG5hbWUpOworICAgIHNvYXBfcHV0ZWxlbWVudChzb2FwLCBub2RlLT5ub2RlLCBzLCAwLCBub2RlLT50eXBlKTsKKyAgICBTT0FQX0ZSRUUoc29hcCwgcyk7CisgIH0KKyAgZWxzZQorICB7IGNoYXIgKnM7CisgICAgaWYgKHN0cmxlbihwcmVmaXgpICsgc3RybGVuKG5hbWUpIDwgc2l6ZW9mKHNvYXAtPm1zZ2J1ZikpCisgICAgICBzID0gc29hcC0+bXNnYnVmOworICAgIGVsc2UKKyAgICB7IHMgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHByZWZpeCkgKyBzdHJsZW4obmFtZSkgKyAyKTsKKyAgICAgIGlmICghcykKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgfQorICAgIHNwcmludGYocywgIiVzOiVzIiwgcHJlZml4LCBuYW1lKTsKKyAgICBpZiAoc29hcF9lbGVtZW50KHNvYXAsIHMsIDAsIE5VTEwpKSAvKiBlbGVtZW50KCkgKi8KKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAobnN0cikKKyAgICB7IHNwcmludGYocywgInhtbG5zOiVzIiwgcHJlZml4KTsKKyAgICAgIHNvYXBfYXR0cmlidXRlKHNvYXAsIHMsIG5zdHIpOworICAgIH0KKyAgICBpZiAocyAhPSBzb2FwLT5tc2didWYpCisgICAgICBTT0FQX0ZSRUUoc29hcCwgcyk7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAorb3V0X2F0dHJpYnV0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkYXRhKQoreyBjaGFyICpzOworICBjb25zdCBjaGFyICp0OworICBpZiAoIXByZWZpeCkKKyAgICByZXR1cm4gc29hcF9hdHRyaWJ1dGUoc29hcCwgbmFtZSwgZGF0YSk7CisgIHQgPSBzdHJjaHIobmFtZSwgJzonKTsKKyAgaWYgKHQpCisgICAgdCsrOworICBlbHNlCisgICAgdCA9IG5hbWU7CisgIGlmIChzdHJsZW4ocHJlZml4KSArIHN0cmxlbih0KSA8IHNpemVvZihzb2FwLT5tc2didWYpKQorICAgIHMgPSBzb2FwLT5tc2didWY7CisgIGVsc2UKKyAgeyBzID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihwcmVmaXgpICsgc3RybGVuKHQpICsgMik7CisgICAgaWYgKCFzKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgIH0gCisgIHNwcmludGYocywgIiVzOiVzIiwgcHJlZml4LCB0KTsKKyAgc29hcF9hdHRyaWJ1dGUoc29hcCwgcywgZGF0YSk7CisgIGlmIChzICE9IHNvYXAtPm1zZ2J1ZikKKyAgICBTT0FQX0ZSRUUoc29hcCwgcyk7CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRfeHNkX19hbnlUeXBlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKm5vZGUsIGNvbnN0IGNoYXIgKnR5cGUpCit7IGlmIChub2RlKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICpwID0gTlVMTDsKKyAgICBjb25zdCBjaGFyICpwcmVmaXg7CQkvKiBuYW1lc3BhY2UgcHJlZml4LCBpZiBuYW1lc3BhY2UgaXMgcHJlc2VudCAqLworICAgIHNpemVfdCBjb2xvbjsKKyAgICBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9ET01fQVNJUykpCisgICAgeyBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICphdHQ7CisgICAgICBmb3IgKGF0dCA9IG5vZGUtPmF0dHM7IGF0dDsgYXR0ID0gYXR0LT5uZXh0KQorICAgICAgeyBpZiAoYXR0LT5uYW1lICYmIGF0dC0+bnN0cikKKyAgICAgICAgeyBpZiAoKHByZWZpeCA9IHN0cmNocihhdHQtPm5hbWUsICc6JykpKQorICAgICAgICAgIHsgY29sb24gPSBwcmVmaXggLSBhdHQtPm5hbWUgKyAxOworICAgICAgICAgICAgaWYgKGNvbG9uID4gc2l6ZW9mKHNvYXAtPnRhZykpCisgICAgICAgICAgICAgIGNvbG9uID0gc2l6ZW9mKHNvYXAtPnRhZyk7CisJICAgIHN0cm5jcHkoc29hcC0+dGFnLCBhdHQtPm5hbWUsIGNvbG9uIC0gMSk7CisgICAgICAgICAgICBzb2FwLT50YWdbY29sb24gLSAxXSA9ICdcMCc7CisgICAgICAgICAgICBpZiAoIShzb2FwX2VudGVyX25zKHNvYXAsIHNvYXAtPnRhZywgYXR0LT5uc3RyKSkpCisgICAgICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAobm9kZS0+bmFtZSkKKyAgICAgIHRhZyA9IG5vZGUtPm5hbWU7CisgICAgZWxzZSBpZiAoIXRhZykKKyAgICAgIHRhZyA9ICItIjsKKyAgICBpZiAoKHByZWZpeCA9IHN0cmNocih0YWcsICc6JykpKQorICAgIHsgY29sb24gPSBwcmVmaXggLSB0YWcgKyAxOworICAgICAgaWYgKGNvbG9uID4gc2l6ZW9mKHNvYXAtPnRhZykpCisgICAgICAgIGNvbG9uID0gc2l6ZW9mKHNvYXAtPnRhZyk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGNvbG9uID0gMDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRPTSBub2RlICclcydcbiIsIHRhZykpOworICAgIHByZWZpeCA9IE5VTEw7CisgICAgaWYgKG5vZGUtPm5zdHIgJiYgIShzb2FwLT5tb2RlICYgU09BUF9ET01fQVNJUykpCisgICAgeyBpZiAoY29sb24pCisgICAgICB7IHN0cm5jcHkoc29hcC0+dGFnLCB0YWcsIGNvbG9uIC0gMSk7CisgICAgICAgIHNvYXAtPnRhZ1tjb2xvbiAtIDFdID0gJ1wwJzsKKyAgICAgICAgaWYgKCEocCA9IHNvYXBfZW50ZXJfbnMoc29hcCwgc29hcC0+dGFnLCBub2RlLT5uc3RyKSkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICAgIHByZWZpeCA9IHAtPmlkOworICAgICAgICBpZiAob3V0X2VsZW1lbnQoc29hcCwgbm9kZSwgcHJlZml4LCB0YWcgKyBjb2xvbiwgbm9kZS0+bnN0cikpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBzdHJ1Y3QgTmFtZXNwYWNlICpuczsKKyAgICAgICAgZm9yIChucyA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXM7IG5zICYmIG5zLT5pZDsgbnMrKykKKyAgICAgICAgeyBpZiAobnMtPm5zID09IG5vZGUtPm5zdHIgfHwgIXN0cmNtcChucy0+bnMsIG5vZGUtPm5zdHIpKQorICAgICAgICAgIHsgLyogaWYgKHNvYXAtPmVuY29kaW5nU3R5bGUgfHwgbnMgPT0gc29hcC0+bG9jYWxfbmFtZXNwYWNlcykgKi8KKyAgICAgICAgICAgICAgcHJlZml4ID0gbnMtPmlkOworICAgICAgICAgICAgaWYgKG91dF9lbGVtZW50KHNvYXAsIG5vZGUsIG5zLT5pZCwgdGFnICsgY29sb24sIE5VTEwpKQorICAgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisJfQorICAgICAgICBpZiAoIW5zIHx8ICFucy0+aWQpCisgICAgICAgIHsgaWYgKChwID0gc29hcF9sb29rdXBfbnMoc29hcCwgbm9kZS0+bnN0cikpKQorICAgICAgICAgIHsgcHJlZml4ID0gcC0+aWQ7CisgICAgICAgICAgICBwID0gTlVMTDsKKyAgICAgICAgICAgIGlmIChvdXRfZWxlbWVudChzb2FwLCBub2RlLCBwcmVmaXgsIHRhZyArIGNvbG9uLCBOVUxMKSkKKyAgICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICAgIH0KKwkgIGVsc2UKKyAgICAgICAgICB7IHNwcmludGYoc29hcC0+dGFnLCBTT0FQX0RPTUlEX0ZPUk1BVCwgc29hcC0+aWRudW0rKyk7CisgICAgICAgICAgICBpZiAoIShwID0gc29hcF9lbnRlcl9ucyhzb2FwLCBzb2FwLT50YWcsIG5vZGUtPm5zdHIpKSkKKyAgICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICAgICAgICBwcmVmaXggPSBwLT5pZDsKKyAgICAgICAgICAgIGlmIChvdXRfZWxlbWVudChzb2FwLCBub2RlLCBwcmVmaXgsIHRhZyArIGNvbG9uLCBub2RlLT5uc3RyKSkKKyAgICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworCSAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7IGNvbG9uID0gMDsKKyAgICAgIGlmIChvdXRfZWxlbWVudChzb2FwLCBub2RlLCBOVUxMLCB0YWcsIE5VTEwpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIGlmICghbm9kZS0+dHlwZSB8fCAhbm9kZS0+bm9kZSkKKyAgICB7IHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgKmF0dDsKKyAgICAgIGZvciAoYXR0ID0gbm9kZS0+YXR0czsgYXR0OyBhdHQgPSBhdHQtPm5leHQpCisgICAgICB7IGlmIChhdHQtPm5hbWUpCisgICAgICAgIHsgaWYgKGF0dC0+bnN0cikKKyAgICAgICAgICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICpxOworICAgICAgICAgICAgaWYgKChhdHQtPm5zdHIgPT0gbm9kZS0+bnN0ciB8fCAobm9kZS0+bnN0ciAmJiAhc3RyY21wKGF0dC0+bnN0ciwgbm9kZS0+bnN0cikpKSAmJiBwcmVmaXgpCisJICAgIHsgaWYgKG91dF9hdHRyaWJ1dGUoc29hcCwgcHJlZml4LCBhdHQtPm5hbWUsIGF0dC0+ZGF0YSkpCisJICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoKHEgPSBzb2FwX2xvb2t1cF9ucyhzb2FwLCBhdHQtPm5zdHIpKSkKKwkgICAgeyBpZiAob3V0X2F0dHJpYnV0ZShzb2FwLCBxLT5pZCwgYXR0LT5uYW1lLCBhdHQtPmRhdGEpKQorCSAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworCSAgICB9CisJICAgIGVsc2UKKyAgICAgICAgICAgIHsgc3RydWN0IE5hbWVzcGFjZSAqbnM7CisJICAgICAgZm9yIChucyA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXM7IG5zICYmIG5zLT5pZDsgbnMrKykKKyAgICAgICAgICAgICAgeyBpZiAobnMtPm5zID09IGF0dC0+bnN0ciB8fCAhc3RyY21wKG5zLT5ucywgYXR0LT5uc3RyKSkKKwkgICAgICAgIHsgaWYgKG91dF9hdHRyaWJ1dGUoc29hcCwgbnMtPmlkLCBhdHQtPm5hbWUsIGF0dC0+ZGF0YSkpCisJICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworCSAgICAgICAgICBicmVhazsKKwkgICAgICAgIH0KKwkgICAgICB9CisJICAgICAgaWYgKCFucyB8fCAhbnMtPmlkKQorICAgICAgICAgICAgICB7IHNwcmludGYoc29hcC0+bXNnYnVmLCAieG1sbnM6IlNPQVBfRE9NSURfRk9STUFULCBzb2FwLT5pZG51bSsrKTsKKwkgICAgICAgIGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCBzb2FwLT5tc2didWYsIGF0dC0+bnN0cikpCisJICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKwkgICAgICAgIHN0cmNhdChzb2FwLT5tc2didWYsICI6Iik7CisJICAgICAgICBzdHJjYXQoc29hcC0+bXNnYnVmLCBhdHQtPm5hbWUpOworCSAgICAgICAgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsIHNvYXAtPm1zZ2J1ZiArIDYsIGF0dC0+ZGF0YSkpCisJICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKwkgIGVsc2UgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsIGF0dC0+bmFtZSwgYXR0LT5kYXRhKSkKKyAgICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHNvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHNvYXAsIE5VTEwpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqZWx0OworICAgICAgaWYgKG5vZGUtPmRhdGEpCisgICAgICB7IGlmIChzb2FwX3N0cmluZ19vdXQoc29hcCwgbm9kZS0+ZGF0YSwgMCkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgICAgZWxzZSBpZiAobm9kZS0+d2lkZSkKKyAgICAgIHsgaWYgKHNvYXBfd3N0cmluZ19vdXQoc29hcCwgbm9kZS0+d2lkZSwgMCkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgICAgZm9yIChlbHQgPSBub2RlLT5lbHRzOyBlbHQ7IGVsdCA9IGVsdC0+bmV4dCkKKyAgICAgIHsgaWYgKHNvYXBfb3V0X3hzZF9fYW55VHlwZShzb2FwLCB0YWcsIDAsIGVsdCwgTlVMTCkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgICAgaWYgKG5vZGUtPnRhaWwgJiYgc29hcF9zZW5kKHNvYXAsIG5vZGUtPnRhaWwpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBpZiAoIXByZWZpeCkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgb2YgRE9NIG5vZGUgJyVzJ1xuIiwgdGFnICsgY29sb24pKTsKKyAgICAgICAgaWYgKHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyArIGNvbG9uKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IGNoYXIgKnM7CisgICAgICAgIGlmIChzdHJsZW4ocHJlZml4KSArIHN0cmxlbih0YWcgKyBjb2xvbikgPCBzaXplb2Yoc29hcC0+bXNnYnVmKSkKKwkgIHMgPSBzb2FwLT5tc2didWY7CisJZWxzZQorCXsgcyA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4ocHJlZml4KSArIHN0cmxlbih0YWcgKyBjb2xvbikgKyAyKTsKKyAgICAgICAgICBpZiAoIXMpCisgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKwl9CisJc3ByaW50ZihzLCAiJXM6JXMiLCBwcmVmaXgsIHRhZyArIGNvbG9uKTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgb2YgRE9NIG5vZGUgJyVzJ1xuIiwgcykpOworICAgICAgICBpZiAoc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgcykpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBpZiAocyAhPSBzb2FwLT5tc2didWYpCisJICBTT0FQX0ZSRUUoc29hcCwgcyk7CisgICAgICB9CisgICAgICBpZiAocCkKKyAgICAgICAgcC0+bGV2ZWwgPSAwOyAvKiB4bWxucyBiaW5kaW5nIGlzIG91dCBvZiBzY29wZSAqLworICAgIH0KKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5feHNkX19hbnlUeXBlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICpub2RlLCBjb25zdCBjaGFyICp0eXBlKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKnRwOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICoqYXR0OworICBpZiAoc29hcF9wZWVrX2VsZW1lbnQoc29hcCkpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmICghbm9kZSkKKyAgeyBpZiAoIShub2RlID0gKHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50Kilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQpKSkpCisgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9CisgIHNvYXBfZGVmYXVsdF94c2RfX2FueVR5cGUoc29hcCwgbm9kZSk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRE9NIG5vZGUgJXNcbiIsIHNvYXAtPnRhZykpOworICBub2RlLT5uc3RyID0gc29hcF9jdXJyZW50X25hbWVzcGFjZShzb2FwLCBzb2FwLT50YWcpOworICBub2RlLT5uYW1lID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+dGFnKTsKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9ET01fTk9ERSkgfHwgKCEoc29hcC0+bW9kZSAmIFNPQVBfRE9NX1RSRUUpICYmICpzb2FwLT5pZCkpCisgIHsgaWYgKChub2RlLT5ub2RlID0gc29hcF9nZXRlbGVtZW50KHNvYXAsICZub2RlLT50eXBlKSkpCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRPTSBub2RlIGNvbnRhaW5zIHR5cGUgJWQgZnJvbSB4c2k6dHlwZVxuIiwgbm9kZS0+dHlwZSkpOworICAgICAgcmV0dXJuIG5vZGU7CisgICAgfQorICAgIGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgICBlbHNlCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBhdHQgPSAmbm9kZS0+YXR0czsKKyAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICB7IGlmICh0cC0+dmlzaWJsZSkKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRE9NIG5vZGUgYXR0cmlidXRlPSclcydcbiIsIHRwLT5uYW1lKSk7CisgICAgICAqYXR0ID0gKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlKSk7CisgICAgICBpZiAoISphdHQpCisgICAgICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgKCphdHQpLT5uZXh0ID0gTlVMTDsKKyAgICAgICgqYXR0KS0+bnN0ciA9IHNvYXBfY3VycmVudF9uYW1lc3BhY2Uoc29hcCwgdHAtPm5hbWUpOworICAgICAgKCphdHQpLT5uYW1lID0gc29hcF9zdHJkdXAoc29hcCwgdHAtPm5hbWUpOworICAgICAgaWYgKHRwLT52aXNpYmxlID09IDIpCisgICAgICAgICgqYXR0KS0+ZGF0YSA9IHNvYXBfc3RyZHVwKHNvYXAsIHRwLT52YWx1ZSk7CisgICAgICBlbHNlCisgICAgICAgICgqYXR0KS0+ZGF0YSA9IE5VTEw7CisgICAgICAoKmF0dCktPndpZGUgPSBOVUxMOworICAgICAgKCphdHQpLT5zb2FwID0gc29hcDsKKyAgICAgIGF0dCA9ICYoKmF0dCktPm5leHQ7CisgICAgICB0cC0+dmlzaWJsZSA9IDA7CisgICAgfQorICB9CisgIHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCBOVUxMLCAxKTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJET00gbm9kZSAnJXMnIGFjY2VwdGVkXG4iLCBub2RlLT5uYW1lKSk7CisgIGlmIChzb2FwLT5ib2R5KQorICB7IGlmICghc29hcF9wZWVrX2VsZW1lbnQoc29hcCkpCisgICAgeyBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqKmVsdDsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRE9NIG5vZGUgJyVzJyBoYXMgc3ViZWxlbWVudHNcbiIsIG5vZGUtPm5hbWUpKTsKKyAgICAgIGVsdCA9ICZub2RlLT5lbHRzOworICAgICAgZm9yICg7OykKKyAgICAgIHsgaWYgKCEoKmVsdCA9IHNvYXBfaW5feHNkX19hbnlUeXBlKHNvYXAsIE5VTEwsIE5VTEwsIE5VTEwpKSkKKyAgICAgICAgeyBpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcpCisgICAgICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwkoKmVsdCktPnBybnQgPSBub2RlOworICAgICAgICBlbHQgPSAmKCplbHQpLT5uZXh0OworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRE9NIG5vZGUgJyVzJyBoYXMgY2RhdGFcbiIsIG5vZGUtPm5hbWUpKTsKKyAgICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfQ19VVEZTVFJJTkcpIHx8IChzb2FwLT5tb2RlICYgU09BUF9DX01CU1RSSU5HKSkKKyAgICAgIHsgaWYgKCEobm9kZS0+ZGF0YSA9IHNvYXBfc3RyaW5nX2luKHNvYXAsIDEsIC0xLCAtMSkpKQorICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIShub2RlLT53aWRlID0gc29hcF93c3RyaW5nX2luKHNvYXAsIDEsIC0xLCAtMSkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgbm9kZS0+bmFtZSkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBvZiBET00gbm9kZSAnJXMnXG4iLCBub2RlLT5uYW1lKSk7CisgIH0KKyAgcmV0dXJuIG5vZGU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJRE9NIHRyYXZlcnNpbmcKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqCitTT0FQX0ZNQUMyCitzb2FwX2RvbV9uZXh0X2VsZW1lbnQoc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKmVsdCkKK3sgaWYgKGVsdC0+ZWx0cykKKyAgICByZXR1cm4gZWx0LT5lbHRzOworICBpZiAoZWx0LT5uZXh0KQorICAgIHJldHVybiBlbHQtPm5leHQ7CisgIGRvIGVsdCA9IGVsdC0+cHJudDsKKyAgd2hpbGUgKGVsdCAmJiAhZWx0LT5uZXh0KTsKKyAgaWYgKGVsdCkKKyAgICBlbHQgPSBlbHQtPm5leHQ7CisgIHJldHVybiBlbHQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICpzb2FwX2RvbV9uZXh0X2F0dHJpYnV0ZShzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICphdHQpCit7IHJldHVybiBhdHQtPm5leHQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJTmFtZXNwYWNlIHByZWZpeCBsb29rdXAvc3RvcmUKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IHNvYXBfaWxpc3QgKgorc29hcF9sb29rdXBfbnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5zdHIpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgZm9yIChpcCA9IHNvYXAtPmlodFtzb2FwX2hhc2gobnN0cildOyBpcDsgaXAgPSBpcC0+bmV4dCkKKyAgICBpZiAoIXN0cmNtcCgoY2hhciopaXAtPnB0ciwgbnN0cikgJiYgaXAtPmxldmVsKQorICAgICAgcmV0dXJuIGlwOworICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3Qgc29hcF9pbGlzdCAqCitzb2FwX2VudGVyX25zKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKm5zdHIpCit7IGludCBoOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIGZvciAoaXAgPSBzb2FwLT5paHRbc29hcF9oYXNoKG5zdHIpXTsgaXA7IGlwID0gaXAtPm5leHQpCisgIHsgaWYgKCFzdHJjbXAoKGNoYXIqKWlwLT5wdHIsIG5zdHIpICYmICFpcC0+bGV2ZWwpCisgICAgeyBzdHJjcHkoaXAtPmlkLCBwcmVmaXgpOworICAgICAgaXAtPmxldmVsID0gMTsKKyAgICAgIHJldHVybiBpcDsKKyAgICB9CisgIH0KKyAgaXAgPSAoc3RydWN0IHNvYXBfaWxpc3QqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9pbGlzdCkgKyBzdHJsZW4obnN0cikgKyBTT0FQX1RBR0xFTik7CisgIGlmIChpcCkKKyAgeyBoID0gc29hcF9oYXNoKG5zdHIpOworICAgIHN0cmNweShpcC0+aWQsIHByZWZpeCk7CisgICAgaXAtPnB0ciA9IGlwLT5pZCArIFNPQVBfVEFHTEVOOworICAgIHN0cmNweSgoY2hhciopaXAtPnB0ciwgbnN0cik7CisgICAgaXAtPm5leHQgPSBzb2FwLT5paHRbaF07CisgICAgc29hcC0+aWh0W2hdID0gaXA7CisgICAgaXAtPmZsaXN0ID0gTlVMTDsKKyAgICBpcC0+Y29weSA9IE5VTEw7CisgICAgaXAtPmxldmVsID0gMTsKKyAgICByZXR1cm4gaXA7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqCXNvYXBfZG9tX2VsZW1lbnQgY2xhc3MKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzb2FwX2RvbV9lbGVtZW50Ojpzb2FwX2RvbV9lbGVtZW50KCkKK3sgc29hcF9kZWZhdWx0X3hzZF9fYW55VHlwZShOVUxMLCB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2VsZW1lbnQ6OnNvYXBfZG9tX2VsZW1lbnQoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXBfZGVmYXVsdF94c2RfX2FueVR5cGUoc29hcCwgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzb2FwX2RvbV9lbGVtZW50Ojpzb2FwX2RvbV9lbGVtZW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuc3RyLCBjb25zdCBjaGFyICpuYW1lKQoreyBzb2FwX2RlZmF1bHRfeHNkX19hbnlUeXBlKHNvYXAsIHRoaXMpOworICB0aGlzLT5uc3RyID0gc29hcF9zdHJkdXAoc29hcCwgbnN0cik7CisgIHRoaXMtPm5hbWUgPSBzb2FwX3N0cmR1cChzb2FwLCBuYW1lKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2VsZW1lbnQ6OnNvYXBfZG9tX2VsZW1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5zdHIsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRhdGEpCit7IHNvYXBfZGVmYXVsdF94c2RfX2FueVR5cGUoc29hcCwgdGhpcyk7CisgIHRoaXMtPm5zdHIgPSBzb2FwX3N0cmR1cChzb2FwLCBuc3RyKTsKKyAgdGhpcy0+bmFtZSA9IHNvYXBfc3RyZHVwKHNvYXAsIG5hbWUpOworICB0aGlzLT5kYXRhID0gc29hcF9zdHJkdXAoc29hcCwgZGF0YSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzb2FwX2RvbV9lbGVtZW50Ojpzb2FwX2RvbV9lbGVtZW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuc3RyLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpub2RlLCBpbnQgdHlwZSkKK3sgc29hcF9kZWZhdWx0X3hzZF9fYW55VHlwZShzb2FwLCB0aGlzKTsKKyAgdGhpcy0+bnN0ciA9IHNvYXBfc3RyZHVwKHNvYXAsIG5zdHIpOworICB0aGlzLT5uYW1lID0gc29hcF9zdHJkdXAoc29hcCwgbmFtZSk7CisgIHRoaXMtPm5vZGUgPSBub2RlOworICB0aGlzLT50eXBlID0gdHlwZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2VsZW1lbnQ6On5zb2FwX2RvbV9lbGVtZW50KCkKK3sgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc29hcF9kb21fZWxlbWVudCAmc29hcF9kb21fZWxlbWVudDo6c2V0KGNvbnN0IGNoYXIgKm5zdHIsIGNvbnN0IGNoYXIgKm5hbWUpCit7IHRoaXMtPm5zdHIgPSBzb2FwX3N0cmR1cChzb2FwLCBuc3RyKTsKKyAgdGhpcy0+bmFtZSA9IHNvYXBfc3RyZHVwKHNvYXAsIG5hbWUpOworICByZXR1cm4gKnRoaXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzb2FwX2RvbV9lbGVtZW50ICZzb2FwX2RvbV9lbGVtZW50OjpzZXQoY29uc3QgY2hhciAqZGF0YSkKK3sgdGhpcy0+ZGF0YSA9IHNvYXBfc3RyZHVwKHNvYXAsIGRhdGEpOworICByZXR1cm4gKnRoaXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzb2FwX2RvbV9lbGVtZW50ICZzb2FwX2RvbV9lbGVtZW50OjpzZXQodm9pZCAqbm9kZSwgaW50IHR5cGUpCit7IHRoaXMtPm5vZGUgPSBub2RlOworICB0aGlzLT50eXBlID0gdHlwZTsKKyAgcmV0dXJuICp0aGlzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc29hcF9kb21fZWxlbWVudCAmc29hcF9kb21fZWxlbWVudDo6YWRkKHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICplbHQpCit7IGVsdC0+cHJudCA9IHRoaXM7CisgIGZvciAoc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKmUgPSBlbHRzOyBlOyBlID0gZS0+bmV4dCkKKyAgeyBpZiAoIWUtPm5leHQpCisgICAgeyBlLT5uZXh0ID0gZWx0OworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgfQorICBlbHRzID0gZWx0OworICByZXR1cm4gKnRoaXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzb2FwX2RvbV9lbGVtZW50ICZzb2FwX2RvbV9lbGVtZW50OjphZGQoc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgJmVsdCkKK3sgcmV0dXJuIGFkZCgmZWx0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2VsZW1lbnQgJnNvYXBfZG9tX2VsZW1lbnQ6OmFkZChzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICphdHQpCit7IGZvciAoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAqYSA9IGF0dHM7IGE7IGEgPSBhLT5uZXh0KQorICB7IGlmICghYS0+bmV4dCkKKyAgICB7IGEtPm5leHQgPSBhdHQ7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICB9CisgIGF0dHMgPSBhdHQ7CisgIHJldHVybiAqdGhpczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2VsZW1lbnQgJnNvYXBfZG9tX2VsZW1lbnQ6OmFkZChzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICZhdHQpCit7IHJldHVybiBhZGQoJmF0dCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yIHNvYXBfZG9tX2VsZW1lbnQ6OmJlZ2luKCkKK3sgc29hcF9kb21fZWxlbWVudF9pdGVyYXRvciBpdGVyKHRoaXMpOworICByZXR1cm4gaXRlcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3Igc29hcF9kb21fZWxlbWVudDo6ZW5kKCkKK3sgc29hcF9kb21fZWxlbWVudF9pdGVyYXRvciBpdGVyKE5VTEwpOworICByZXR1cm4gaXRlcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3Igc29hcF9kb21fZWxlbWVudDo6ZmluZChjb25zdCBjaGFyICpuc3RyLCBjb25zdCBjaGFyICpuYW1lKQoreyBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yIGl0ZXIodGhpcyk7CisgIGl0ZXIubnN0ciA9IG5zdHI7CisgIGl0ZXIubmFtZSA9IG5hbWU7CisgIGlmIChuYW1lICYmIHNvYXBfdGFnX2NtcCh0aGlzLT5uYW1lLCBuYW1lKSkKKyAgICByZXR1cm4gKytpdGVyOworICBpZiAobnN0ciAmJiB0aGlzLT5uc3RyICYmIHNvYXBfdGFnX2NtcCh0aGlzLT5uc3RyLCBuc3RyKSkKKyAgICByZXR1cm4gKytpdGVyOworICByZXR1cm4gaXRlcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3Igc29hcF9kb21fZWxlbWVudDo6ZmluZChpbnQgdHlwZSkKK3sgc29hcF9kb21fZWxlbWVudF9pdGVyYXRvciBpdGVyKHRoaXMpOworICBpdGVyLnR5cGUgPSB0eXBlOworICBpZiAodGhpcy0+dHlwZSAhPSB0eXBlKQorICAgIHJldHVybiArK2l0ZXI7CisgIHJldHVybiBpdGVyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBzb2FwX2RvbV9lbGVtZW50Ojp1bmxpbmsoKQoreyBzb2FwX3VubGluayhzb2FwLCB0aGlzKTsKKyAgc29hcF91bmxpbmsoc29hcCwgbnN0cik7CisgIHNvYXBfdW5saW5rKHNvYXAsIG5hbWUpOworICBzb2FwX3VubGluayhzb2FwLCBkYXRhKTsKKyAgc29hcF91bmxpbmsoc29hcCwgd2lkZSk7CisgIGlmIChlbHRzKQorICAgIGVsdHMtPnVubGluaygpOworICBpZiAoYXR0cykKKyAgICBlbHRzLT51bmxpbmsoKTsKKyAgaWYgKG5leHQpCisgICAgbmV4dC0+dW5saW5rKCk7CisgIG5vZGUgPSBOVUxMOworICB0eXBlID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglzb2FwX2RvbV9hdHRyaWJ1dGUgY2xhc3MKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzb2FwX2RvbV9hdHRyaWJ1dGU6OnNvYXBfZG9tX2F0dHJpYnV0ZSgpCit7IHRoaXMtPnNvYXAgPSBOVUxMOworICB0aGlzLT5uZXh0ID0gTlVMTDsKKyAgdGhpcy0+bnN0ciA9IE5VTEw7CisgIHRoaXMtPm5hbWUgPSBOVUxMOworICB0aGlzLT5kYXRhID0gTlVMTDsKKyAgdGhpcy0+d2lkZSA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzb2FwX2RvbV9hdHRyaWJ1dGU6OnNvYXBfZG9tX2F0dHJpYnV0ZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgdGhpcy0+c29hcCA9IHNvYXA7CisgIHRoaXMtPm5leHQgPSBOVUxMOworICB0aGlzLT5uc3RyID0gTlVMTDsKKyAgdGhpcy0+bmFtZSA9IE5VTEw7CisgIHRoaXMtPmRhdGEgPSBOVUxMOworICB0aGlzLT53aWRlID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2F0dHJpYnV0ZTo6c29hcF9kb21fYXR0cmlidXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuc3RyLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkYXRhKQoreyB0aGlzLT5zb2FwID0gc29hcDsKKyAgdGhpcy0+bmV4dCA9IE5VTEw7CisgIHRoaXMtPm5zdHIgPSBzb2FwX3N0cmR1cChzb2FwLCBuc3RyKTsKKyAgdGhpcy0+bmFtZSA9IHNvYXBfc3RyZHVwKHNvYXAsIG5hbWUpOworICB0aGlzLT5kYXRhID0gc29hcF9zdHJkdXAoc29hcCwgZGF0YSk7CisgIHRoaXMtPndpZGUgPSBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc29hcF9kb21fYXR0cmlidXRlOjp+c29hcF9kb21fYXR0cmlidXRlKCkKK3sgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yIHNvYXBfZG9tX2F0dHJpYnV0ZTo6YmVnaW4oKQoreyBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IgaXRlcih0aGlzKTsKKyAgcmV0dXJuIGl0ZXI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3Igc29hcF9kb21fYXR0cmlidXRlOjplbmQoKQoreyBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IgaXRlcihOVUxMKTsKKyAgcmV0dXJuIGl0ZXI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3Igc29hcF9kb21fYXR0cmlidXRlOjpmaW5kKGNvbnN0IGNoYXIgKm5zdHIsIGNvbnN0IGNoYXIgKm5hbWUpCit7IHNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvciBpdGVyKHRoaXMpOworICBpdGVyLm5zdHIgPSBuc3RyOworICBpdGVyLm5hbWUgPSBuYW1lOworICBpZiAobmFtZSAmJiBzb2FwX3RhZ19jbXAodGhpcy0+bmFtZSwgbmFtZSkpCisgICAgcmV0dXJuICsraXRlcjsKKyAgaWYgKG5zdHIgJiYgdGhpcy0+bnN0ciAmJiBzb2FwX3RhZ19jbXAodGhpcy0+bnN0ciwgbnN0cikpCisgICAgcmV0dXJuICsraXRlcjsKKyAgcmV0dXJuIGl0ZXI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHNvYXBfZG9tX2F0dHJpYnV0ZTo6dW5saW5rKCkKK3sgc29hcF91bmxpbmsoc29hcCwgdGhpcyk7CisgIHNvYXBfdW5saW5rKHNvYXAsIG5zdHIpOworICBzb2FwX3VubGluayhzb2FwLCBuYW1lKTsKKyAgc29hcF91bmxpbmsoc29hcCwgZGF0YSk7CisgIHNvYXBfdW5saW5rKHNvYXAsIHdpZGUpOworICBpZiAobmV4dCkKKyAgICBuZXh0LT51bmxpbmsoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yIGNsYXNzCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc29hcF9kb21fZWxlbWVudF9pdGVyYXRvcjo6c29hcF9kb21fZWxlbWVudF9pdGVyYXRvcigpCit7IGVsdCA9IE5VTEw7CisgIG5zdHIgPSBOVUxMOworICBuYW1lID0gTlVMTDsKKyAgdHlwZSA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yOjpzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yKHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICplbHQpCit7IHRoaXMtPmVsdCA9IGVsdDsKKyAgbnN0ciA9IE5VTEw7CisgIG5hbWUgPSBOVUxMOworICB0eXBlID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3I6On5zb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yKCkKK3sgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYm9vbCBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yOjpvcGVyYXRvcj09KGNvbnN0IHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IgJml0ZXIpIGNvbnN0Cit7IHJldHVybiB0aGlzLT5lbHQgPT0gaXRlci5lbHQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitib29sIHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3I6Om9wZXJhdG9yIT0oY29uc3Qgc29hcF9kb21fZWxlbWVudF9pdGVyYXRvciAmaXRlcikgY29uc3QKK3sgcmV0dXJuIHRoaXMtPmVsdCAhPSBpdGVyLmVsdDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICZzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yOjpvcGVyYXRvciooKSBjb25zdAoreyByZXR1cm4gKnRoaXMtPmVsdDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IgJnNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3I6Om9wZXJhdG9yKysoKQoreyB3aGlsZSAoZWx0KQorICB7IGVsdCA9IHNvYXBfZG9tX25leHRfZWxlbWVudChlbHQpOworICAgIGlmICghZWx0KQorICAgICAgYnJlYWs7CisgICAgaWYgKG5hbWUgJiYgZWx0LT5uYW1lKQorICAgIHsgaWYgKCFzb2FwX3RhZ19jbXAoZWx0LT5uYW1lLCBuYW1lKSkKKyAgICAgIHsgaWYgKG5zdHIgJiYgZWx0LT5uc3RyKQorICAgICAgICB7IGlmICghc29hcF90YWdfY21wKGVsdC0+bnN0ciwgbnN0cikpCisJICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAodHlwZSkKKyAgICB7IGlmIChlbHQtPnR5cGUgPT0gdHlwZSkKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiAqdGhpczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IgY2xhc3MKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I6OnNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcigpCit7IGF0dCA9IE5VTEw7CisgIG5zdHIgPSBOVUxMOworICBuYW1lID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjo6c29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgKmF0dCkKK3sgdGhpcy0+YXR0ID0gYXR0OworICBuc3RyID0gTlVMTDsKKyAgbmFtZSA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I6On5zb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IoKQoreyB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitib29sIHNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjo6b3BlcmF0b3I9PShjb25zdCBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IgJml0ZXIpIGNvbnN0Cit7IHJldHVybiB0aGlzLT5hdHQgPT0gaXRlci5hdHQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitib29sIHNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcjo6b3BlcmF0b3IhPShjb25zdCBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IgJml0ZXIpIGNvbnN0Cit7IHJldHVybiB0aGlzLT5hdHQgIT0gaXRlci5hdHQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICZzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I6Om9wZXJhdG9yKigpIGNvbnN0Cit7IHJldHVybiAqdGhpcy0+YXR0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yICZzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3I6Om9wZXJhdG9yKysoKQoreyB3aGlsZSAoYXR0KQorICB7IGF0dCA9IHNvYXBfZG9tX25leHRfYXR0cmlidXRlKGF0dCk7CisgICAgaWYgKCFhdHQpCisgICAgICBicmVhazsKKyAgICBpZiAobmFtZSAmJiBhdHQtPm5hbWUpCisgICAgeyBpZiAoIXNvYXBfdGFnX2NtcChhdHQtPm5hbWUsIG5hbWUpKQorICAgICAgeyBpZiAobnN0ciAmJiBhdHQtPm5zdHIpCisgICAgICAgIHsgaWYgKCFzb2FwX3RhZ19jbXAoYXR0LT5uc3RyLCBuc3RyKSkKKwkgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gKnRoaXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJSS9PCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBVTkRFUl9DRQorCitzdGQ6Om9zdHJlYW0gJm9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtICZvLCBjb25zdCBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAmZSkKK3sgaWYgKCFlLnNvYXApCisgIHsgc3RydWN0IHNvYXAgc29hcDsKKyAgICBzb2FwX2luaXQyKCZzb2FwLCBTT0FQX0lPX0RFRkFVTFQsIFNPQVBfWE1MX0dSQVBIKTsKKyAgICBzb2FwX3NlcmlhbGl6ZV94c2RfX2FueVR5cGUoJnNvYXAsICZlKTsKKyAgICBzb2FwX2JlZ2luX3NlbmQoJnNvYXApOworICAgIHNvYXBfb3V0X3hzZF9fYW55VHlwZSgmc29hcCwgTlVMTCwgMCwgJmUsIE5VTEwpOworICAgIHNvYXBfZW5kX3NlbmQoJnNvYXApOworICAgIHNvYXBfZW5kKCZzb2FwKTsKKyAgICBzb2FwX2RvbmUoJnNvYXApOworICB9CisgIGVsc2UKKyAgeyBzdGQ6Om9zdHJlYW0gKm9zID0gZS5zb2FwLT5vczsKKyAgICBlLnNvYXAtPm9zID0gJm87CisgICAgc2hvcnQgb21vZGUgPSBlLnNvYXAtPm9tb2RlOworICAgIHNvYXBfc2V0X29tb2RlKGUuc29hcCwgU09BUF9YTUxfR1JBUEgpOworICAgIHNvYXBfc2VyaWFsaXplX3hzZF9fYW55VHlwZShlLnNvYXAsICZlKTsKKyAgICBzb2FwX2JlZ2luX3NlbmQoZS5zb2FwKTsKKyAgICBzb2FwX291dF94c2RfX2FueVR5cGUoZS5zb2FwLCBOVUxMLCAwLCAmZSwgTlVMTCk7CisgICAgc29hcF9lbmRfc2VuZChlLnNvYXApOworICAgIGUuc29hcC0+b3MgPSBvczsKKyAgICBlLnNvYXAtPm9tb2RlID0gb21vZGU7CisgIH0KKyAgcmV0dXJuIG87Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGQ6OmlzdHJlYW0gJm9wZXJhdG9yPj4oc3RkOjppc3RyZWFtICZpLCBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAmZSkKK3sgaWYgKCFlLnNvYXApCisgICAgZS5zb2FwID0gc29hcF9uZXcoKTsKKyAgc3RkOjppc3RyZWFtICppcyA9IGUuc29hcC0+aXM7CisgIGUuc29hcC0+aXMgPSAmaTsKKyAgaWYgKHNvYXBfYmVnaW5fcmVjdihlLnNvYXApCisgICB8fCAhc29hcF9pbl94c2RfX2FueVR5cGUoZS5zb2FwLCBOVUxMLCAmZSwgTlVMTCkKKyAgIHx8IHNvYXBfZW5kX3JlY3YoZS5zb2FwKSkKKyAgICA7IC8qIGhhbmRsZSBlcnJvcj8gTm90ZTogZS5zb2FwLT5lcnJvciBpcyBzZXQgYW5kIGFwcCBzaG91bGQgY2hlY2sgKi8KKyAgZS5zb2FwLT5pcyA9IGlzOworICByZXR1cm4gaTsKK30KKworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9xdW90ZTQvZG9tLmggYi9zYW1wbGVzL3F1b3RlNC9kb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWI4Yjc4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9xdW90ZTQvZG9tLmgKQEAgLTAsMCArMSw2MzAgQEAKKy8qCisKK2RvbS5oCisKK2dTT0FQIERPTSBpbnRlcmZhY2UKKworZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlczoKK0dQTCwgdGhlIGdTT0FQIHB1YmxpYyBsaWNlbnNlLCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgcHVibGljIGxpY2Vuc2UuCisKK1RoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGdTT0FQIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4zCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKK0xpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoraHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL3NvYXBsaWNlbnNlLmh0bWwKK1NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCitXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKK2ZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK1RoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4uCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4sIEdlbml2aWEgaW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKy8qKgorCitAbWFpbnBhZ2UgVGhlIGdTT0FQIGxldmVsLTIgRE9NIHBhcnNlcgorCitUaGUgZ1NPQVAgbGV2ZWwtMiBET00gcGFyc2VyIGZlYXR1cmVzICJzbWFydCIgWE1MIG5hbWVzcGFjZSBoYW5kbGluZyBhbmQgY2FuIGJlCit1c2VkIHRvIG1peCBnU09BUCBYTUwgc2VyaWFsaXplcnMgd2l0aCBwbGFpbiBYTUwgcGFyc2luZy4gVGhlIERPTSBwYXJzZXIgaXMKK2Fsc28gYW4gZXNzZW50aWFsIGNvbXBvbmVudCBvZiB0aGUgd3NzZSBwbHVnaW4gdG8gdmVyaWZ5IGRpZ2l0YWwgc2lnbmF0dXJlcy4KKworVGhlIERPTSBwYXJzZXIgaXMgbm90IGEgc3RhbmQtYWxvbmUgYXBwbGljYXRpb24uIFRoZSBET00gcGFyc2VyIGlzIGludGVncmF0ZWQKK3dpdGggdGhlIFNPQVAgZW5naW5lIHRvIHBvcHVsYXRlIGEgbm9kZSBzZXQgYW5kIHRvIHJlbmRlciBhIG5vZGUgc2V0IGluIFhNTC4KKworVHdvIGZpbGVzIGFyZSBuZWVkZWQgdG8gd29yayB3aXRoIERPTSBub2RlIHNldHM6CisKKy0gZG9tLmggdG8gdXNlIGEgRE9NIG5vZGUgc2V0IGluIGEgZ1NPQVAgaGVhZGVyIGZpbGUgd2l0aCBzZXJ2aWNlIGRlZmluaXRpb25zLgorLSBkb20uY3BwIChvciBkb20uYykgdG8gYmUgbGlua2VkIHdpdGggeW91ciBhcHBsaWNhdGlvbiBjb2RlLgorCitAc2VjdGlvbiBkb21fMSBEZWNsYXJpbmcgRE9NIE5vZGUgU2V0cyBpbiBhIGdTT0FQIEhlYWRlciBGaWxlCisKK1RvIHVzZSB0aGUgRE9NIG5vZGUgc2V0IHdpdGggdGhlIGRhdGEgc3RydWN0dXJlcyBkZWZpbmVkIGluIGEgZ1NPQVAgaGVhZGVyCitmaWxlLCBpbXBvcnQgdGhlIGRvbS5oIGZpbGUgaW50byB5b3VyIGhlYWRlciBmaWxlOgorCitAY29kZQorICAgICNpbXBvcnQgImRvbS5oIgorQGVuZGNvZGUKKworQnkgaW1wb3J0aW5nIGRvbS5oIGEgc3BlY2lhbCBkYXRhIHR5cGUgQHJlZiB4c2RfX2FueVR5cGUgaXMgYXZhaWxhYmxlIHRoYXQKK3JlcHJlc2VudHMgYSBoaWVyYXJjaGljYWwgRE9NIG5vZGUgc2V0LiBUaGUgRE9NIG5vZGUgc2V0IGRhdGEgc3RydWN0dXJlIGNhbiBiZQordXNlZCB3aXRoaW4gc3RydWN0cywgY2xhc3NlcywgU1RMIGNvbnRhaW5lcnMsIGFuZCBhcyBhcmd1bWVudHMgb2Ygc2VydmljZQorb3BlcmF0aW9ucy4gRm9yIGV4YW1wbGU6CisKK0Bjb2RlCisgICAgI2ltcG9ydCAiZG9tLmgiCisgICAgI2ltcG9ydCAid3N1LmgiCisgICAgY2xhc3MgbnNfX215UHJvZHVjdAorICAgIHsgcHVibGljOgorCUBjaGFyKiAgICAgICAgICAgIHdzdV9fSWQ7CisJX3dzdV9fVGltZXN0YW1wKiAgd3N1X19UaW1lc3RhbXA7CisgICAgICAgIGNoYXIqICAgICAgICAgICAgIG5hbWU7CisJaW50ICAgICAgICAgICAgICAgU0tVOworCWRvdWJsZSAgICAgICAgICAgIHByaWNlOworCXhzZF9fYW55VHlwZSoJICBhbnk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIG5zX19teVByb2R1Y3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfm5zX19teVByb2R1Y3QoKTsKKyAgICB9OworQGVuZGNvZGUKKworSXQgaXMgaW1wb3J0YW50IHRvIGRlY2xhcmUgdGhlIEByZWYgeHNkX19hbnlUeXBlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdCBvcgorY2xhc3MsIHNpbmNlIHRoZSBET00gcGFyc2VyIGNvbnN1bWVzIGFueSBYTUwgZWxlbWVudCAodGhlIGZpZWxkIG5hbWUsICdhbnknIGluCit0aGlzIGNhc2UsIGlzIGlycmVsYXZhbnQpLiAgVGh1cywgdGhlIG90aGVyIGZpZWxkcyBtdXN0IGJlIGRlZmluZWQgZmlyc3QgdG8KK2Vuc3VyZSB0aGV5IGFyZSBwb3B1bGF0ZWQgZmlyc3QgYmVmb3JlIHRoZSBET00gbm9kZSBzZXQgaXMgcG9wdWxhdGVkIHdpdGggYW55Citub24tcHJldmlvdXNseSBtYXRjaGVkIFhNTCBlbGVtZW50LgorCitOb3RlIHRoYXQgd2UgYWxzbyBpbXBvcnRlZCB3c3UuaCBhcyBhbiBleGFtcGxlIHRvIHNob3cgaG93IHRvIGFkZCBhIHdzdTpJZAorYXR0cmlidXRlIHRvIGEgc3RydWN0IG9yIGNsYXNzIGlmIHdlIHdhbnQgdG8gZGlnaXRhbGx5IHNpZ24gaW5zdGFuY2VzLCBhbmQgaG93Cit0byBhZGQgYSBzdGFuZGFyZGl6ZWQgd3N1OlRpbWVzdGFtcCBlbGVtZW50IHRvIHJlY29yZCBjcmVhdGlvbiBhbmQgZXhwaXJhdGlvbgordGltZXMuCisKK1RvIGNvbXBpbGUsIHJ1biBzb2FwY3BwMiAod2l0aCAtSWltcG9ydCkgYW5kIGNvbXBpbGUgeW91ciBjb2RlIGJ5IGxpbmtpbmcKK2RvbS5jcHAgKG9yIGRvbS5jIGZvciBDKS4gTm90ZSB0aGF0IHRoZSBET00gZGF0YSBzdHJ1Y3R1cmVzIGFyZSBkZWNsYXJlZCBpbgorc3Rkc29hcDIuaCwgd2hpbGUgdGhlIERPTSBvcGVyYXRpb25zIGFyZSBkZWZpbmVkIGluIGRvbS5jcHAgKG9yIGRvbS5jIGZvciBDKS4KKworTWV0aG9kcyB0byBwb3B1bGF0ZSBhbmQgdHJhdmVyc2UgRE9NIG5vZGUgc2V0cyB3aWxsIGJlIGV4cGxhaW5lZCBsYXRlci4gRmlyc3QsCitsZXQncyB0YWtlIGEgbG9vayBhdCBwYXJzaW5nIGFuZCBnZW5lcmF0aW5nIFhNTCBkb2N1bWVudHMuCisKK0BzZWN0aW9uIGRvbV8yIFBhcnNpbmcgYW5kIEdlbmVyYXRpbmcgWE1MCisKK1RoZSBmb2xsb3dpbmcgZXhhbXBsZXMgYXNzdW1lIHRoYXQgdGhlIHNvYXBjcHAyIGNvbXBpbGVyIHdhcyB1c2VkIG9uIGEgaGVhZGVyCitmaWxlIChqdXN0IHRoZSBkb20uaCBmaWxlIHdpbGwgZG8pIGFuZCB0aGUgZ2VuZXJhdGVkIHNvYXBDLmNwcCBvciAoc29hcEMuYyBmb3IKK0MpIGNvZGUgd2FzIGNvbXBpbGVkIGFuZCBsaW5rZWQgd2l0aCBkb20uY3BwIChvciBkb20uYyBmb3IgQyksIHN0ZHNvYXAyLmNwcCAob3IKK3N0ZHNvYXAyLmMpIGFuZCB0aGUgZXhhbXBsZSBhcHBsaWNhdGlvbiBjb2RlLiBUaGUgZ2VuZXJhdGVkIG5hbWVzcGFjZSB0YWJsZQorc2hvdWxkIGFsc28gYmUgdXNlZCwgc2luY2UgdGhlIG5hbWVzcGFjZSBiaW5kaW5ncyBhcmUgcmVsZXZhbnQgZm9yIGNvbnN1bWluZworYW5kIHByb2R1Y2luZyBYTUwgZm9yIERPTSBub2RlIHNldHMuIFRoZXJlZm9yZSwgZWFjaCBvZiB0aGUgZXhhbXBsZSBjb2RlcworaW4gdGhpcyBkb2N1bWVudGF0aW9uIGlzIGFzc3VtZWQgdG8gc3RhcnQgd2l0aCB0aGUgZm9sbG93aW5nIHR3byBpbmNsdWRlczoKKworQGNvZGUKKyAgICAjaW5jbHVkZSAic29hcEguaCIgIC8vIGdlbmVyYXRlZCBieSBzb2FwY3BwMgorICAgICNpbmNsdWRlICJucy5uc21hcCIgLy8gYSBuYW1lc3BhY2UgdGFibGUgd2l0aCB0aGUgWE1MIG5hbWVzcGFjZSB1c2VkCitAZW5kY29kZQorCitUaGUgQysrIHN0ZDo6aW9zdHJlYW0gb3BlcmF0b3JzIGFyZSBvdmVybG9hZGVkIHRvIHBhcnNlIFhNTCBvY3RldCBzdHJlYW1zIGludG8KK25vZGUgc2V0cyBhbmQgdG8gZW1pdCBYTUwgZnJvbSBub2RlIHNldHM6CisKK0Bjb2RlCisgICAgc29hcF9kb21fZWxlbWVudCBkb207CisgICAgZG9tLnNvYXAgPSBzb2FwX25ldzEoU09BUF9ET01fVFJFRSB8IFNPQVBfQ19VVEZTVFJJTkcpOworICAgIGNpbiA+PiBkb207IC8vIHBhcnNlIFhNTAorICAgIGlmIChkb20uc29hcC0+ZXJyb3IpCisgICAgICAuLi4gLy8gcGFyc2UgZXJyb3IKKyAgICBjb3V0IDw8IGRvbTsgLy8gZGlzcGxheSBYTUwKKyAgICBpZiAoZG9tLnNvYXAtPmVycm9yKQorICAgICAgLi4uIC8vIG91dHB1dCBlcnJvcgorICAgIHNvYXBfZGVzdHJveShkb20uc29hcCk7CisgICAgc29hcF9lbmQoZG9tLnNvYXApOworICAgIHNvYXBfZG9uZShkb20uc29hcCk7CisgICAgZnJlZShkb20uc29hcCk7CitAZW5kY29kZQorCitJbiB0aGUgZXhhbXBsZSBhYm92ZSB3ZSBjb3BpZWQgYW4gWE1MIGRvY3VtZW50IGZyb20gc3RkaW4gdG8gc3Rkb3V0LgorCitJbiBDIHdlIHVzZSB0aGUgRE9NICJzZXJpYWxpemVycyIgdG8gYWNjb21wbGlzaCB0aGlzIGFzIGZvbGxvd3M6CisKK0Bjb2RlCisgICAgc29hcF9kb21fZWxlbWVudCBkb207CisgICAgZG9tLnNvYXAgPSBzb2FwX25ldzEoU09BUF9ET01fVFJFRSB8IFNPQVBfQ19VVEZTVFJJTkcpOworICAgIGRvbS5zb2FwLT5yZWN2ZmQgPSBzdGRpbjsKKyAgICBpZiAoc29hcF9iZWdpbl9yZWN2KGRvbS5zb2FwKQorICAgICB8fCBOVUxMICE9IHNvYXBfaW5feHNkX19hbnlUeXBlKGRvbS5zb2FwLCBOVUxMLCAmZG9tLCBOVUxMKQorICAgICB8fCBzb2FwX2VuZF9yZWN2KGRvbS5zb2FwKSkKKyAgICAgIC4uLiAvLyBwYXJzZSBlcnJvcgorICAgIGRvbS5zb2FwLT5zZW5kZmQgPSBzdGRvdXQ7CisgICAgaWYgKHNvYXBfYmVnaW5fc2VuZChkb20uc29hcCkKKyAgICAgfHwgc29hcF9vdXRfeHNkX19hbnlUeXBlKGRvbS5zb2FwLCBOVUxMLCAwLCAmZG9tLCBOVUxMKQorICAgICB8fCBzb2FwX2VuZF9zZW5kKGRvbS5zb2FwKSkKKyAgICAgIC4uLiAvLyBvdXRwdXQgZXJyb3IKKyAgICBzb2FwX2VuZChkb20uc29hcCk7CisgICAgc29hcF9kb25lKGRvbS5zb2FwKTsKKyAgICBmcmVlKGRvbS5zb2FwKTsKK0BlbmRjb2RlCisKK1RoZSBTT0FQX0RPTV9OT0RFIGZsYWcgaXMgdXNlZCB0byBpbnN0cnVjdCB0aGUgcGFyc2VyIHRvIHBvcHVsYXRlIGEgRE9NIG5vZGUKK3NldCB3aXRoIGRlc2VyaWFsaXplZCBDIGFuZCBDKysgZGF0YSBzdHJ1Y3R1cmVzIHVzaW5nIHRoZSBkYXRhIHR5cGUncworZGVzZXJpYWxpemVycyB0aGF0IHdlcmUgZ2VuZXJhdGVkIHdpdGggc29hcGNwcDIgZnJvbSBhIGhlYWRlciBmaWxlIHdpdGggdGhlCitkYXRhIHR5cGUgZGVjbGFyYXRpb25zLiBTdXBwb3NlIGZvciBleGFtcGxlIHRoYXQgdGhlIGZvbGxvd2luZyBoZWFkZXIgZmlsZSB3YXMKK3VzZWQgKGluIGZhY3QsIHRoaXMgZGVjbGFyYXRpb24gYXBwZWFycyBpbiB3c3UuaCk6CisKK0Bjb2RlCisgICAgdHlwZWRlZiBzdHJ1Y3QgX3dzdV9fVGltZXN0YW1wCisgICAgewlAY2hhcioJd3N1X19JZDsKKyAgICAJY2hhcioJQ3JlYXRlZDsKKwljaGFyKglFeHBpcmVzOworICAgIH0gX3dzdV9fVGltZXN0YW1wOworQGVuZGNvZGUKKworTm90ZSB0aGF0IHRoZSBsZWFkaW5nIHVuZGVyc2NvcmUgb2YgdGhlIHR5cGUgbmFtZSBpbmRpY2F0ZXMgYW4gWE1MIGVsZW1lbnQKK2RlZmluaXRpb24gKHJhdGhlciB0aGFuIGEgY29tcGxleFR5cGUgZGVmaW5pdGlvbiksIHNvIHRoZSBuYW1lIG9mIHRoZSBkYXRhIHR5cGUKK2lzIHJlbGV2YW50IHdoZW4gY29tcGFyaW5nIFhNTCBlbGVtZW50IHRhZ3MgdG8gQy9DKysgZGF0YSB0eXBlcyBieSB0aGUKK2Rlc2VyaWFsaXplcnMuCisKK1doZW4gYW4gWE1MIGRvY3VtZW50IGlzIHBhcnNlZCB3aXRoIG9uZSBvciBtb3JlIDx3c3U6VGltZXN0YW1wPiBlbGVtZW50cywgdGhlCitET00gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlZCB3aXRoIHRoZSBfd3N1X19UaW1lc3RhbXAgb2JqZWN0cy4gU3VwcG9zZQordGhlIFhNTCBkb2N1bWVudCByb290IGlzIGEgPHdzdTpUaW1lc3RhbXA+LCB0aGVuIHRoZSByb290IG5vZGUgb2YgdGhlIERPTSBpcyBhCitfd3N1X19UaW1lc3RhbXAgb2JqZWN0OgorCitAY29kZQorICAgIHNvYXBfZG9tX2VsZW1lbnQgZG9tOworICAgIGRvbS5zb2FwID0gc29hcF9uZXcxKFNPQVBfRE9NX05PREUpOworICAgIGNpbiA+PiBkb207IC8vIHBhcnNlIFhNTAorICAgIGlmIChkb20uc29hcC0+ZXJyb3IpCisgICAgICAuLi4gLy8gcGFyc2UgZXJyb3IKKyAgICBpZiAoZG9tLnR5cGUgPT0gU09BUF9UWVBFX193c3VfX1RpbWVzdGFtcCkKKyAgICB7IF93c3VfX1RpbWVzdGFtcCAqdCA9IChfd3N1X19UaW1lc3RhbXAqKWRvbS5ub2RlOworICAgICAgY291dCA8PCAiU3RhcnQgIiA8PCAodC0+Q3JlYXRlZCA/IHQtPkNyZWF0ZWQgOiAiIikKKyAgICAgICAgICAgPDwgIiB0aWxsICIgPDwgKHQtPkV4cGlyZXMgPyB0LT5FeHBpcmVzIDogIiIpIDw8IGVuZGw7CisgICAgfQorQGVuZGNvZGUKKworTm90ZSB0aGF0IHRoZSBzb2FwY3BwMiBjb21waWxlciBnZW5lcmF0ZXMgYSB1bmlxdWUgdHlwZSBpZGVudGlmaWNhdGlvbiBjb25zdGFudAorU09BUF9UWVBFX1ggZm9yIGVhY2ggZGF0YSB0eXBlIFgsIHdoaWNoIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBub2RlJ3MgdHlwZSBpbgordGhlIGV4YW1wbGUgYWJvdmUuCisKK1doZW4gb2JqZWN0cyBvY2N1ciBkZWVwZXIgd2l0aGluIHRoZSBET00gbm9kZSBzZXQgdGhlbiB0aGUgRE9NIHRyZWUgc2hvdWxkIGJlCit0cmF2ZXJzZWQuIFRoaXMgc3ViamVjdCB3aWxsIGJlIGRpc2N1c3NlZCBuZXh0LgorCitAc2VjdGlvbiBkb21fMyBUcmF2ZXJzaW5nIGEgRE9NIE5vZGUgU2V0CisKK1RoZSBET00gbm9kZSBzZXQgaXMgdHJhdmVyc2VkIHdpdGggYSBDKysgaXRlcmF0b3Igb3Igd2l0aCB0aGUgQyBmdW5jdGlvbnMgQHJlZgorc29hcF9kb21fbmV4dF9lbGVtZW50IGFuZCBAcmVmIHNvYXBfZG9tX25leHRfYXR0cmlidXRlLiBGb3IgZXhhbXBsZSwgdG8gd2FsawordGhlIG5vZGUgc2V0IHZpc2l0aW5nIG5vZGVzIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZXkgYXBwZWFyZWQgaW4gdGhlIGRvY3VtZW50LAordXNlOgorCitAY29kZQorICAgIHNvYXBfZG9tX2VsZW1lbnQgZG9tOworICAgIGRvbS5zb2FwID0gc29hcF9uZXcxKFNPQVBfRE9NX1RSRUUgfCBTT0FQX0NfVVRGU1RSSU5HKTsKKyAgICAuLi4KKyAgICBmb3IgKHNvYXBfZG9tX2VsZW1lbnQ6Oml0ZXJhdG9yIGl0ZXIgPSBkb20uYmVnaW4oKTsgaXRlciAhPSBkb20uZW5kKCk7ICsraXRlcikKKyAgICAgIGZvciAoc29hcF9kb21fYXR0cmlidXRlOjppdGVyYXRvciBhdHRyID0gKCppdGVyKS5hdHRzLmJlZ2luKCk7IGF0dHIgIT0gKCppdGVyKS5hdHRzLmVuZCgpOyArK2F0dHIpCisgICAgICAgIC4uLgorQGVuZGNvZGUKKworSW4gQyBjb2RlLCB1c2U6CisKK0Bjb2RlCisgICAgc29hcF9kb21fZWxlbWVudCBkb20sICppdGVyOworICAgIHNvYXBfZG9tX2F0dHJpYnV0ZSAqYXR0cjsKKyAgICBkb20uc29hcCA9IHNvYXBfbmV3MShTT0FQX0RPTV9UUkVFIHwgU09BUF9DX1VURlNUUklORyk7CisgICAgLi4uCisgICAgZm9yIChpdGVyID0gJmRvbTsgaXRlcjsgaXRlciA9IHNvYXBfZG9tX25leHRfZWxlbWVudChpdGVyKSkKKyAgICAgIGZvciAoYXR0ciA9IGl0ZXItPmF0dHM7IGF0dHI7IGF0dHIgPSBzb2FwX2RvbV9uZXh0X2F0dHJpYnV0ZShhdHRyKSkKKyAgICAgICAgIC4uLgorQGVuZGNvZGUKKworVGhlIEByZWYgc29hcF9kb21fZWxlbWVudCBhbmQgQHJlZiBzb2FwX2RvbV9hdHRyaWJ1dGUgc3RydWN0cyBmb3JtIGVzc2VudGlhbGx5CitsaW5rZWQgbGlzdHMsIHNvIGl0IHdvdWxkIG5vdCBiZSB0b28gZGlmZmljdWx0IHRvIHdyaXRlIHlvdXIgb3duIHRyZWUgd2Fsa2VyczoKKworLSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQ6OnBybnQgcG9pbnRzIHRvIHRoZSBwYXJlbnQgc29hcF9kb21fZWxlbWVudCBub2RlLgorLSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQ6OmVsdHMgcG9pbnRzIHRvIHRoZSBsaW5rZWQgbGlzdCBvZiBjaGlsZCBlbGVtZW50IG5vZGVzLgorLSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQ6OmF0dHMgcG9pbnRzIHRvIHRoZSBsaW5rZWQgbGlzdCBvZiBhdHRyaWJ1dGUgbm9kZXMuCisKK1RoZSBsaW5rZWQgbGlzdHMgb2Ygc2libGluZyBlbGVtZW50cyBub2RlcyBhbmQgYXR0cmlidXRlIG5vZGVzIGFyZSByZXNwZWN0aXZlbHk6CisKKy0gQHJlZiBzb2FwX2RvbV9lbGVtZW50OjpuZXh0IHBvaW50cyB0byB0aGUgbmV4dCBzaWJsaW5nIGVsZW1lbnQgbm9kZS4KKy0gQHJlZiBzb2FwX2RvbV9hdHRyaWJ1dGU6Om5leHQgcG9pbnRzIHRvIHRoZSBuZXh0IGF0dHJpYnV0ZSBpbiB0aGUgYXR0cmlidXRlCisgIGxpc3Qgb2YgYW4gZWxlbWVudCBub2RlLgorCitOb3RlIHRoYXQgZm9yIGEgcm9vdCBub2RlLCB0aGUgQHJlZiBzb2FwX2RvbV9lbGVtZW50Ojpwcm50IGFuZCBAcmVmCitzb2FwX2RvbV9lbGVtZW50OjpuZXh0IGFyZSBib3RoIE5VTEwuCisKK1RhZyBuYW1lcyBvZiBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBhcmUgc3RvcmVkIGluIEByZWYgc29hcF9kb21fZWxlbWVudDo6bmFtZQorYW5kIEByZWYgc29hcF9kb21fYXR0cmlidXRlOjpuYW1lIHN0cmluZ3MsIHJlc3BlY3RpdmVseS4gVGhlIG5hbWVzIGFyZSBVVEYtOAorZW5jb2RlZC4KKworWE1MIG5hbWVzcGFjZSBiaW5kaW5ncyBhcmUgZXhwbGljaXRseSBwcm9wYWdhdGVkIHRocm91Z2hvdXQgdGhlIERPTSBub2RlIHNldAorZm9yIHRob3NlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIHRoYXQgYXJlIG5hbWVzcGFjZSBxdWFsaWZpZWQgKGVpdGhlciB3aXRoIGEKK25hbWVzcGFjZSBwcmVmaXggb3Igd2hlbiB0aGV5IG9jY3VyIGluIGEgeG1sbnMgZGVmYXVsdCBuYW1lc3BhY2Ugc2NvcGUpLiBUaGUKK25hbWVzcGFjZXMgYXJlIHN0b3JlZCBpbiB0aGUgQHJlZiBzb2FwX2RvbV9lbGVtZW50Ojpuc3RyIGFuZCBAcmVmCitzb2FwX2RvbV9hdHRyaWJ1dGU6Om5zdHIgc3RyaW5ncy4gVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byB0cmF2ZXJzZSBhCitET00gbm9kZSBzZXQgYW5kIHByaW50IHRoZSBlbGVtZW50cyB3aXRoIHRoZWlyIG5hbWVzcGFjZSBVUklzIHdoZW4gcHJlc2VudDoKKworQGNvZGUKKyAgICBzb2FwX2RvbV9lbGVtZW50IGRvbTsKKyAgICBkb20uc29hcCA9IHNvYXBfbmV3MShTT0FQX0RPTV9UUkVFIHwgU09BUF9DX1VURlNUUklORyk7CisgICAgY2luID4+IGRvbTsKKyAgICBmb3IgKHNvYXBfZG9tX2VsZW1lbnQ6Oml0ZXJhdG9yIGl0ZXIgPSBkb20uYmVnaW4oKTsgaXRlciAhPSBkb20uZW5kKCk7ICsraXRlcikKKyAgICB7IGNvdXQgPDwgIkVsZW1lbnQgIiA8PCAoKml0ZXIpLm5hbWU7CisgICAgICBpZiAoKCppdGVyKS5uc3RyKQorICAgICAgICBjb3V0IDw8ICIgaGFzIG5hbWVzcGFjZSAiIDw8ICgqaXRlcikubnN0cjsKKyAgICAgIGNvdXQgPDwgZW5kbDsKKyAgICB9CisgICAgc29hcF9kZXN0cm95KGRvbS5zb2FwKTsKKyAgICBzb2FwX2VuZChkb20uc29hcCk7CisgICAgc29hcF9kb25lKGRvbS5zb2FwKTsKKyAgICBmcmVlKGRvbS5zb2FwKTsKK0BlbmRjb2RlCisKK1RleHQgY29udGVudCBvZiBhIG5vZGUgaXMgc3RvcmVkIGluIHRoZSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQ6OmRhdGEgc3RyaW5nIGluCitVVEYtOCBmb3JtYXQuIFRoaXMgc3RyaW5nIGlzIHBvcHVsYXRlZCBpZiB0aGUgU09BUF9DX1VURlNUUklORyBmbGFnIHdhcyBzZXQuCitPdGhlcndpc2UgdGhlIGRhdGEgY29udGVudCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgQHJlZiBzb2FwX2RvbV9lbGVtZW50Ojp3aWRlCit3aWRlLWNoYXJhY3RlciBzdHJpbmcuCisKK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBwcmludHMgdGhvc2UgZWxlbWVudCBub2RlcyB0aGF0IGhhdmUgdGV4dCBjb250ZW50CisoaW4gVVRGLTggZm9ybWF0KToKKworQGNvZGUKKyAgICBzb2FwX2RvbV9lbGVtZW50IGRvbTsKKyAgICAuLi4KKyAgICBmb3IgKHNvYXBfZG9tX2VsZW1lbnQ6Oml0ZXJhdG9yIGl0ZXIgPSBkb20uYmVnaW4oKTsgaXRlciAhPSBkb20uZW5kKCk7ICsraXRlcikKKyAgICB7IGNvdXQgPDwgIkVsZW1lbnQgIiA8PCAoKml0ZXIpLm5hbWU7CisgICAgICBpZiAoKCppdGVyKS5kYXRhKQorICAgICAgICBjb3V0IDw8ICIgPSAiIDw8ICgqaXRlcikuZGF0YTsKKyAgICAgIGNvdXQgPDwgZW5kbDsKKyAgICB9CisgICAgLi4uCitAZW5kY29kZQorCitXaGVuIGEgRE9NIG5vZGUgc2V0IGNvbnRhaW5zIGRlc2VyaWFsaXplZCBvYmplY3RzIChlbmFibGVkIHdpdGggdGhlCitTT0FQX0RPTV9OT0RFIGZsYWcpLCB0aGUgQHJlZiBzb2FwX2RvbV9lbGVtZW50Ojp0eXBlIGFuZCBAcmVmCitzb2FwX2RvbV9lbGVtZW50Ojpub2RlIHZhbHVlcyBhcmUgc2V0OgorCitAY29kZQorICAgIHNvYXBfZG9tX2VsZW1lbnQgZG9tOworICAgIC4uLgorICAgIGZvciAoc29hcF9kb21fZWxlbWVudDo6aXRlcmF0b3IgaXRlciA9IGRvbS5iZWdpbigpOyBpdGVyICE9IGRvbS5lbmQoKTsgKytpdGVyKQorICAgIHsgY291dCA8PCAiRWxlbWVudCAiIDw8ICgqaXRlcikubmFtZTsKKyAgICAgIGlmICgoKml0ZXIpLnR5cGUpCisgICAgICAgIGNvdXQgPDwgIkVsZW1lbnQgIiA8PCAoKml0ZXIpLm5hbWUgPDwgIiBjb250YWlucyBhIGRlc2VyaWFsaXplZCBvYmplY3QiIDw8IGVuZGw7CisgICAgICBjb3V0IDw8IGVuZGw7CisgICAgfQorICAgIC4uLgorQGVuZGNvZGUKKworVGhlIEByZWYgc29hcF9kb21fZWxlbWVudDo6dHlwZSBpcyAwIG9yIGEgU09BUF9UWVBFX1ggY29uc3RhbnQsIHdoZXJlIFggaXMgdGhlCituYW1lIG9mIHRoZSBkZXNlcmlhbGl6ZWQgdHlwZS4gVGhlIEByZWYgc29hcF9kb21fZWxlbWVudDo6bm9kZSBwb2ludHMgdG8gdGhlCitkZXNlcmlhbGl6ZWQgb2JqZWN0LiBJZiB0aGlzIGlzIGEgY2hhciogc3RyaW5nLCBpdCBwb2ludHMgZGlyZWN0bHkgdG8gdGhlCitjaGFyYWN0ZXIgc2VxdWVuY2UuCisKK05vdGU6IHRoZSBTT0FQX0RPTV9UUkVFIGZsYWcgcmVzdHJpY3RzIHRoZSBwYXJzZXIgdG8gRE9NIGNvbnRlbnQgb25seSwgc28KK2Rlc2VyaWFsaXplcnMgaXMgbm90IHVzZWQuIFdoZW4gdGhlIFNPQVBfRE9NX1RSRUUgZmxhZyBpcyBub3QgdXNlZCwgYW4KK2FwcHJvcHJpYXRlIGRlc2VyaWFsaXplciBNQVkgYmUgdXNlZCBieSBnU09BUCB3aGVuIGFuIGVsZW1lbnQgY29udGFpbnMgYW4gaWQKK2F0dHJpYnV0ZSBhbmQgZ1NPQVAgY2FuIGRldGVybWluZSB0aGUgdHlwZSBmcm9tIHRoZSBpZCBhdHRyaWJ1dGUgcmVmZXJlbmNlCithbmQvb3IgdGhlIHhzaTp0eXBlIGF0dHJpYnV0ZSBvZiBhbiBlbGVtZW50LiAKKworQHNlY3Rpb24gZG9tXzQgU2VhcmNoaW5nCisKK0NvbW1vbiBvcGVyYXRpb25zIG9uIERPTSBub2RlIHNldHMgaW4gbGV2ZWwtMiBET00gcGFyc2VycyBhcmUgc2VhcmNoaW5nIGFuZAorZmlsdGVyaW5nLgorCitGb3IgQysrIGNvZGUsIHRoZSBidWlsdC1pbiBAcmVmIHNvYXBfZG9tX2VsZW1lbnQ6Oml0ZXJhdG9yIGNhbiBiZSB1c2VkIHRvCitzZWFyY2ggZm9yIG1hdGNoaW5nIGVsZW1lbnQgbm9kZXMuIEMgcHJvZ3JhbW1lcnMgYXJlIG91dCBvZiBsdWNrIGFzIHRoZXkgc2hvdWxkCit3cml0ZSBsb29waW5nIGNvZGUgdG8gc2VhcmNoIGZvciBub2RlcyBleHBsaWNpdGx5LgorCitUaGUgQHJlZiBzb2FwX2RvbV9lbGVtZW50OjpmaW5kIG1ldGhvZCByZXR1cm5zIGEgc2VhcmNoIGl0ZXJhdG9yLiBUaGUgbWV0aG9kCit0YWtlcyBhbiBvcHRpb25hbCBuYW1lc3BhY2UgVVJJIGFuZCBlbGVtZW50IG5hbWUgdG8gbWF0Y2ggZWxlbWVudHMgaW4gdGhlIERPTQorbm9kZSBzZXQuICBGb3IgZXhhbXBsZSwgdG8gaXRlcmF0ZSBvdmVyIGFsbCAicHJvZHVjdCIgZWxlbWVudHM6CisKK0Bjb2RlCisgICAgc29hcF9kb21fZWxlbWVudCBkb207CisgICAgLi4uCisgICAgZm9yIChzb2FwX2RvbV9lbGVtZW50OjppdGVyYXRvciBpdGVyID0gZG9tLmZpbmQoTlVMTCwgInByb2R1Y3QiKTsgaXRlciAhPSBkb20uZW5kKCk7ICsraXRlcikKKyAgICAgIGNvdXQgPDwgIkVsZW1lbnQgIiA8PCAoKml0ZXIpLm5hbWUgPDwgZW5kbDsKKyAgICAuLi4KK0BlbmRjb2RlCisKK1RvIGl0ZXJhdGUgb3ZlciBhbGwgZWxlbWVudHMgaW4gYSBwYXJ0aWN1bGFyIG5hbWVzcGFjZToKKworQGNvZGUKKyAgICBzb2FwX2RvbV9lbGVtZW50IGRvbTsKKyAgICAuLi4KKyAgICBmb3IgKHNvYXBfZG9tX2VsZW1lbnQ6Oml0ZXJhdG9yIGl0ZXIgPSBkb20uZmluZCgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLCBOVUxMKTsgaXRlciAhPSBkb20uZW5kKCk7ICsraXRlcikKKyAgICAgIGNvdXQgPDwgIkVsZW1lbnQgIiA8PCAoKml0ZXIpLm5hbWUgPDwgZW5kbDsKKyAgICAuLi4KK0BlbmRjb2RlCisKK1NpbmNlIG5hbWVzcGFjZXMgbWF5IGhhdmUgZGlmZmVyZW50IHZlcnNpb24sIGEgJyonIHdpbGRjYXJkIGNhbiBiZSB1c2VkIHdpdGgKK3RoZSBuYW1lc3BhY2Ugc3RyaW5nLiBMaWtld2lzZSwgdGFnIG5hbWVzIG1heSBiZSBuYW1lc3BhY2UgcXVhbGlmaWVkIHdpdGgKK3ByZWZpeGVzIHRoYXQgYXJlIG5vdCByZWxldmFudCB0byB0aGUgc2VhcmNoOgorCitAY29kZQorICAgIHNvYXBfZG9tX2VsZW1lbnQgZG9tOworICAgIC4uLgorICAgIGZvciAoc29hcF9kb21fZWxlbWVudDo6aXRlcmF0b3IgaXRlciA9IGRvbS5maW5kKCJodHRwOi8vd3d3LnczLm9yZy8qWE1MU2NoZW1hIiwgIio6c2NoZW1hIik7IGl0ZXIgIT0gZG9tLmVuZCgpOyArK2l0ZXIpCisgICAgICBjb3V0IDw8ICJFbGVtZW50ICIgPDwgKCppdGVyKS5uYW1lIDw8IGVuZGw7CisgICAgLi4uCitAZW5kY29kZQorCitUaGlzIHNlYXJjaGVzIGZvciBxdWFsaWZpZWQgZWxlbWVudHMgaW4gb25lIG9mIHRoZSBYU0QgbmFtZXNwYWNlcy4KKworQHNlY3Rpb24gZG9tXzUgQ29uc3RydWN0aW5nIERPTSBOb2RlIFNldHMKKworVGhlIEByZWYgc29hcF9kb21fZWxlbWVudDo6c2V0IGFuZCBAcmVmIHNvYXBfZG9tX2VsZW1lbnQ6OmFkZCBtZXRob2RzIGFyZSB1c2VkCit0byBkZWNvcmF0ZSBhIERPTSBub2RlIHNldCB3aXRoIGNoaWxkIGVsZW1lbnQgbm9kZXMgYW5kIGF0dHJpYnV0ZSBub2Rlcy4KK0FwcGxpY2F0aW9uIGRhdGEgd2l0aCBzZXJpYWxpemVycyBjYW4gYmUgaW5jb3Jwb3JhdGVkIGluIHRoZSBub2RlIHNldCBhcyB3ZWxsLgorCitUaGUgZm9sbG93aW5nIGV4YW1wbGVzIGFyZSBzaG93biBpbiBDKysuICBDIHByb2dyYW1tZXJzIGNhbiB1c2UgdGhlIEByZWYKK3NvYXBfZG9tX2VsZW1lbnQ6ZWx0cyBsaXN0IGFuZCBAcmVmIHNvYXBfZG9tX2VsZW1lbnRzOjphdHRzIGxpc3QgdG8gYWRkIGNoaWxkCitub2RlcyBhbmQgYXR0cmlidXRlIG5vZGVzLCByZXNwZWN0aXZlbHkuCisKK0Bjb2RlCisgICAgc29hcF9kb21fZWxlbWVudCBkb207CisgICAgZG9tLnNvYXAgPSBzb2FwX25ldzEoU09BUF9DX1VURlNUUklORyB8IFNPQVBfWE1MX0lOREVOVCk7CisgICAgY29uc3QgY2hhciAqbXlVUkkgPSAiaHR0cDovL3d3dy5teWRvbWFpbi5jb20vbXlwcm9kdWN0cyI7CisgICAgbnNfX215UHJvZHVjdCBwcm9kdWN0KCk7CisgICAgcHJvZHVjdC5zb2FwX2RlZmF1bHQoZG9tLnNvYXApOyAvLyBtZXRob2QgZ2VuZXJhdGVkIGJ5IHNvYXBjcHAyCisgICAgcHJvZHVjdC5uYW1lID0gIkVybmllIjsKKyAgICBwcm9kdWN0LlNLVSA9IDEyMzsKKyAgICBwcm9kdWN0LnByaWNlID0gOS45NTsKKyAgICBkb20uc2V0KG15VVJJLCAibGlzdCIpOworICAgIGRvbS5hZGQoc29hcF9kb21fYXR0cmlidXRlKGRvbS5zb2FwLCBteVVSSSwgInZlcnNpb24iLCAiMC45IikpOworICAgIGRvbS5hZGQoc29hcF9kb21fZWxlbWVudChkb20uc29hcCwgbXlVUkksICJkb2N1bWVudGF0aW9uIiwgIkxpc3Qgb2YgcHJvZHVjdHMiKSk7CisgICAgZG9tLmFkZChzb2FwX2RvbV9lbGVtZW50KGRvbS5zb2FwLCBteVVSSSwgInByb2R1Y3QiLCBTT0FQX1RZUEVfbnNfX215UHJvZHVjdCwgJnByb2R1Y3QpOworICAgIGNvdXQgPDwgZG9tOworICAgIC4uLgorQGVuZGNvZGUKKworQXNzdW1pbmcgdGhhdCBteVVSSSBpcyBhc3NvY2lhdGVkIHdpdGggbmFtZXNwYWNlIHByZWZpeCAibnMiIGluIHRoZSBuYW1lc3BhY2UKK3RhYmxlLCB0aGUgcmVuZGl0aW9uIGlzCisKK0Bjb2RlCis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPG5zOmxpc3QKKyAgeG1sbnM6U09BUC1FTlY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIgorICB4bWxuczpTT0FQLUVOQz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCisgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCisgIHhtbG5zOm5zPSJodHRwOi8vZG9tYWluL3NjaGVtYXMvcHJvZHVjdC54c2QiCisgIHZlcnNpb249IjAuOSIgPgorCTxuczpkb2N1bWVudGF0aW9uPkxpc3Qgb2YgcHJvZHVjdHM8L25zOmRvY3VtZW50YXRpb24+CisJPG5zOnByb2R1Y3Q+CisJCTxuYW1lPkVybmllPC9uYW1lPgorCQk8U0tVPjEyMzwvU0tVPgorCQk8cHJpY2U+OS45NTwvcHJpY2U+CisJPC9uczpwcm9kdWN0PgorPC9uczpsaXN0PgorQGVuZGNvZGUKKworTm90ZSB0aGF0IHRoZSBuYW1lc3BhY2UgdGFibGUgY29udGVudCBpcyAiZHVtcGVkIiBpbnRvIHRoZSBYTUwgcmVuZGl0aW9uLgorCitUaGUgZ2xvYmFsIG5hbWVzcGFjZSBtYXBwaW5nIHRhYmxlICJuYW1lc3BhY2VzW10iIGNvbnRhaW5zIHRoZSBuYW1lc3BhY2UKK2JpbmRpbmdzIHRoYXQgc2hvdWxkIGJlIG1lYW5pbmdmdWwgdG8gdGhlIGFwcGxpY2F0aW9uLiBUaGUgc29hcCBjb250ZXh0IGNhbiBiZQorc2V0IHRvIGEgbmV3IHRhYmxlIGFzIGZvbGxvd3M6CisKK0Bjb2RlCisgICAgTmFtZXNwYWNlIG15TmFtZXNwYWNlc1tdID0geyB7ICJucyIsICIuLi4iIH0sIC4uLiAsIHsgTlVMTCB9IH07CisgICAgc29hcF9kb21fZWxlbWVudCBkb207CisgICAgZG9tLnNvYXAgPSBzb2FwX25ldzEoU09BUF9DX1VURlNUUklORyB8IFNPQVBfWE1MX0lOREVOVCk7CisgICAgZG9tLnNvYXAtPm5hbWVzcGFjZXMgPSBteU5hbWVzcGFjZXM7CitAZW5kY29kZQorCitUbyBwcm9kdWNlIGNsZWFuZXIgWE1MLCB1c2UgdGhlIFNPQVBfWE1MX0NBTk9OSUNBTCBmbGFnIHRvIGluaXRpYXRlIHRoZSBzb2FwCitjb250ZXh0OgorCitAY29kZQorPG5zOmxpc3QgeG1sbnM6bnM9Imh0dHA6Ly9kb21haW4vc2NoZW1hcy9wcm9kdWN0LnhzZCIgdmVyc2lvbj0iMC45IiA+CisJPG5zOmRvY3VtZW50YXRpb24+TGlzdCBvZiBwcm9kdWN0czwvbnM6ZG9jdW1lbnRhdGlvbj4KKwk8bnM6cHJvZHVjdD4KKwkJPG5hbWU+RXJuaWU8L25hbWU+CisJCTxTS1U+MTIzPC9TS1U+CisJCTxwcmljZT45Ljk1PC9wcmljZT4KKwk8L25zOnByb2R1Y3Q+Cis8L25zOmxpc3Q+CitAZW5kY29kZQorCitOb3RlIHRoYXQgdGhlIHhtbG5zIGJpbmRpbmdzIGFyZSByZW5kZXJlZCBhdXRvbWF0aWNhbGx5LiBXaGVuIHBhcnNpbmcgYW4gWE1MCitkb2N1bWVudCwgeG1sbnMgYmluZGluZ3MgYXJlIG5vdCBhZGRlZCB0byB0aGUgYXR0cmlidXRlIG5vZGUgc2V0LiBUaGUgQHJlZgorc29hcF9kb21fZWxlbWVudDo6bnN0ciBhbmQgQHJlZiBzb2FwX2RvbV9hdHRyaWJ1dGU6Om5zdHIgbmFtZXNwYWNlIHN0cmluZ3MgYXJlCitzZXQgdG8gcmV0YWluIG5hbWVzcGFjZSBVUklzLiBUaGUgWE1MIHJlbmRlcmluZyBhbGdvcml0aG0gdXNlcyB0aGUgbmFtZXNwYWNlCitzdHJpbmdzIHRvIGFkZCB4bWxucyBiaW5kaW5ncyB0aGF0IGFyZSBub3QgYWxyZWFkeSBpbiB0aGUgbmFtZXNwYWNlIHRhYmxlLgorCitXaGVuIGl0IGlzIGRlc2lyYWJsZSB0byByZW5kZXIgWE1MIGV4YWN0bHkgYXMgcmVwcmVzZW50ZWQgaW4gdGhlIERPTSBub2RlIHNldCwKK2UuZy4gd2hlbiB4bWxucyBiaW5kaW5ncyBhcmUgZXhwbGljaXRseSBpbmNsdWRlZCBpbiB0aGUgYXR0cmlidXRlIG5vZGUgc2V0LCB1c2UKK3RoZSBTT0FQX0RPTV9BU0lTIGZsYWc6CisKK0Bjb2RlCisgICAgc29hcF9kb21fZWxlbWVudCBkb207CisgICAgZG9tLnNvYXAgPSBzb2FwX25ldzEoU09BUF9DX1VURlNUUklORyB8IFNPQVBfRE9NX0FTSVMpOworQGVuZGNvZGUKKworQHNlY3Rpb24gZG9tXzYgRXhhbXBsZQorCitUaGUgZ1NPQVAgaGVhZGVyIGZpbGUgYmVsb3cgaW1wb3J0cyBET00gYW5kIGRlY2xhcmVzIHhzZDpmbG9hdCB0byBlbmFibGUKK3NlcmlhbGl6aW5nIGZsb2F0cyBlbWJlZGRlZCB3aXRoaW4gRE9NIG5vZGUgc2V0cyBhbmQgZGVzZXJpYWxpemluZyBmbG9hdHMgdG8KK3BvcHVsYXRlIERPTSBub2RlIHNldHM6CisKK0Bjb2RlCisgICAgI2ltcG9ydCAiZG9tLmgiCisgICAgdHlwZWRlZiBmbG9hdCB4c2RfX2Zsb2F0OworQGVuZGNvZGUKKworQ29uc2lkZXIgaW52b2tpbmcgdGhlIFhNZXRob2RzIGRlbGF5ZWQgc3RvY2sgcXVvdGUgc2VydmljZSB0byBvYnRhaW4gYSBzdG9jaworcXVvdGUuIFRoZSBmbG9hdCBkZXNlcmlhbGl6ZXIgaXMgdXNlZCB0byBzdG9yZSB0aGUgZmxvYXRpbmctcG9pbnQgdmFsdWUgb2YgYQorc3RvY2sgZ2l2ZW4gdGhhdCB0aGUgPFJlc3VsdD4gZWxlbWVudCBoYXMgYW4geHNpOnR5cGU9InhzZDpmbG9hdCIgYXR0cmlidXRlLgorCitAY29kZQorICAgIHN0cnVjdCBzb2FwICpzb2FwID0gc29hcF9uZXcxKFNPQVBfQ19VVEZTVFJJTkcgfCBTT0FQX0RPTV9OT0RFKTsKKyAgICBzb2FwX2RvbV9lbGVtZW50IGVudmVsb3BlKHNvYXAsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIsICJFbnZlbG9wZSIpOworICAgIHNvYXBfZG9tX2VsZW1lbnQgYm9keShzb2FwLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iLCAiQm9keSIpOworICAgIHNvYXBfZG9tX2F0dHJpYnV0ZSBlbmNvZGluZ1N0eWxlKHNvYXAsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIsICJlbmNvZGluZ1N0eWxlIiwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7CisgICAgc29hcF9kb21fZWxlbWVudCByZXF1ZXN0KHNvYXAsICJ1cm46eG1ldGhvZHMtZGVsYXllZC1xdW90ZXMiLCAiZ2V0UXVvdGUiKTsKKyAgICBzb2FwX2RvbV9lbGVtZW50IHN5bWJvbChzb2FwLCBOVUxMLCAic3ltYm9sIiwgIklCTSIpOworICAgIHNvYXBfZG9tX2VsZW1lbnQgcmVzcG9uc2Uoc29hcCk7CisgICAgZW52ZWxvcGUuYWRkKGJvZHkpOworICAgIGJvZHkuYWRkKGVuY29kaW5nU3R5bGUpOworICAgIGJvZHkuYWRkKHJlcXVlc3QpOworICAgIHJlcXVlc3QuYWRkKHN5bWJvbCk7CisgICAgY291dCA8PCAiUmVxdWVzdCBtZXNzYWdlOiIgPDwgZW5kbCA8PCBlbnZlbG9wZSA8PCBlbmRsOworICAgIGlmIChzb2FwX2Nvbm5lY3Qoc29hcCwgImh0dHA6Ly9zZXJ2aWNlcy54bWV0aG9kcy5uZXQvc29hcCIsICIiKQorICAgICB8fCBzb2FwX291dF94c2RfX2FueVR5cGUoc29hcCwgTlVMTCwgMCwgJmVudmVsb3BlLCBOVUxMKQorICAgICB8fCBzb2FwX2VuZF9zZW5kKHNvYXApCisgICAgIHx8IHNvYXBfYmVnaW5fcmVjdihzb2FwKQorICAgICB8fCBOVUxMICE9IHNvYXBfaW5feHNkX19hbnlUeXBlKHNvYXAsIE5VTEwsICZyZXNwb25zZSwgTlVMTCkKKyAgICAgfHwgc29hcF9lbmRfcmVjdihzb2FwKQorICAgICB8fCBzb2FwX2Nsb3Nlc29jayhzb2FwKSkKKyAgICB7IHNvYXBfcHJpbnRfZmF1bHQoc29hcCwgc3RkZXJyKTsKKyAgICAgIHNvYXBfcHJpbnRfZmF1bHRfbG9jYXRpb24oc29hcCwgc3RkZXJyKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgY291dCA8PCAiUmVzcG9uc2UgbWVzc2FnZToiIDw8IGVuZGwgPDwgcmVzcG9uc2UgPDwgZW5kbDsKKyAgICAgIGZvciAoc29hcF9kb21fZWxlbWVudDo6aXRlcmF0b3Igd2Fsa2VyID0gcmVzcG9uc2UuZmluZChTT0FQX1RZUEVfeHNkX19mbG9hdCk7IHdhbGtlciAhPSByZXNwb25zZS5lbmQoKTsgKyt3YWxrZXIpCisgICAgICAgIGNvdXQgPDwgIlF1b3RlID0gIiA8PCAqKHhzZF9fZmxvYXQqKSgqd2Fsa2VyKS5ub2RlIDw8IGVuZGw7CisgICAgfQorICAgIHNvYXBfZGVzdHJveShzb2FwKTsKKyAgICBzb2FwX2VuZChzb2FwKTsKKyAgICBzb2FwX2RvbmUoc29hcCk7CisgICAgZnJlZShzb2FwKTsKK0BlbmRjb2RlCisKK0BzZWN0aW9uIGRvbV83IFN1bW1hcnkKKworVGhlIERPTSBwYXJzZXIgbmVlZHMgYSBzb2FwIGNvbnRleHQgdG8gYWxsb2NhdGUgbm9kZXM6CisKK0Bjb2RlCisgICAgc29hcF9kb21fZWxlbWVudCBkb207CisgICAgZG9tLnNvYXAgPSBzb2FwX25ldzEoLi4uIGZsYWdzIC4uLik7CisgICAgLi4uCisgICAgc29hcF9kZXN0cm95KGRvbS5zb2FwKTsKKyAgICBzb2FwX2VuZChkb20uc29hcCk7CisgICAgc29hcF9kb25lKGRvbS5zb2FwKTsKKyAgICBzb2FwX2ZyZWUoZG9tLnNvYXApOworQGVuZGNvZGUKKworVGhlIG5vZGVzIGFyZSByZW1vdmVkIHdpdGggc29hcF9kZXN0cm95IChmb3IgQysrKSBhbmQgc29hcF9lbmQuIFRoZSBzb2FwX2RvbmUKK2Z1bmN0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQgYmVmb3JlIHRoZSBzb2FwIGNvbnRleHQgaXMgZGVhbGxvY2F0ZWQuCisKK1RoZSBzb2FwIGNvbnRleHQgZmxhZ3MgdGhhdCBjb250cm9sIHRoZSBwYXJzaW5nIGFuZCByZW5kaXRpb24gb2YgWE1MIGFyZToKKworLSAobm8gZmxhZyk6IG9ubHkgZWxlbWVudHMgd2l0aCBhbiBpZCBhdHRyaWJ1dGUgYXJlIGRlc2VyaWFsaXplZCBhcyBDL0MrKyBkYXRhCisgIHR5cGVzICh3aGVuIGEgZGVzZXJpYWxpemVyIGlzIGF2YWlsYWJsZSkuIFhNTCBlbGVtZW50cyB3aXRoIGNoYXJhY3RlciBkYXRhCisgIGFyZSBkZXNlcmlhbGl6ZWQgaW50byB0aGUgQHJlZiBzb2FwX2RvbV9lbGVtZW50Ojp3aWRlIGZpZWxkLgorLSBTT0FQX0NfVVRGU1RSSU5HOiBzdG9yZSBjaGFyYWN0ZXIgZGF0YSBpbiBVVEYtOCBmb3JtYXQgaW4gQHJlZgorICBzb2FwX2RvbV9lbGVtZW50OjpkYXRhLgorLSBTT0FQX0NfTUJTVFJJTkc6IHN0b3JlIGNoYXJhY3RlciBkYXRhIGluIG11bHRpLWJ5dGUgZm9ybWF0IGluIEByZWYKKyAgc29hcF9kb21fZWxlbWVudDo6ZGF0YSwgd2hlcmUgdGhlIGRlY29kaW5nIGRlcGVuZHMgb24gdGhlIGN1cnJlbnQKKyAgbG9jYWxpY2F0aW9uLiBUaGUgcGxhdGZvcm0gbXVzdCBzdXBwb3J0IE1CIHN0cmluZ3MgKEhBVkVfTUJUT1dDKS4KKy0gU09BUF9ET01fVFJFRTogcHJldmVudHMgZGVzZXJpYWxpemF0aW9uIG9mIEMvQysrIGRhdGEgc3RydWN0dXJlcyBpbnRvIHRoZQorICBET00uCistIFNPQVBfRE9NX05PREU6IGF0dGVtcHQgdG8gZGVzZXJpYWxpemUgQy9DKysgZGF0YSBzdHJ1Y3R1cmVzIHdoZW4gYQorICBkZXNlcmlhbGl6ZXIgaXMgYXZhaWxhYmxlLiBBIGRlc2VyaWFsaXplciBpcyBzZWxlY3RlZCBiYXNlZCBvbiB0aGUgZWxlbWVudAorICBuYW1lIG9yIHRoZSB4c2k6dHlwZSBhdHRyaWJ1dGUuCistIFNPQVBfRE9NX0FTSVM6IHJlbmRlciBYTUwgImFzIGlzIiwgaS5lLiBkbyBub3QgaW5zZXJ0IHhtbG5zIGJpbmRpbmdzIGZvciBVUklzCisgIHN0b3JlZCBpbiBuc3RyLiBBc3N1bWVzIHRoZSBET00gaXMgc2VsZi1jb250YWluZWQuCistIFNPQVBfWE1MX0lOREVOVDogcmVuZGVyIFhNTCB3aXRoIGluZGVudC4KKy0gU09BUF9YTUxfQ0FOT05JQ0FMOiByZW5kZXIgWE1MIGluIGV4Yy1jMTRuIGZvcm0uCisKK1RoZSBET00gdHJhdmVyc2FsIG9wZXJhdGlvbnM6CisKKy0gQHJlZiBzb2FwX2RvbV9uZXh0X2VsZW1lbnQgcmV0dXJucyB0aGUgbmV4dCBlbGVtZW50IGluIGFuIGluLW9yZGVyIHRyYXZlcnNhbC4KKy0gQHJlZiBzb2FwX2RvbV9uZXh0X2F0dHJpYnV0ZSByZXR1cm5zIHRoZSBuZXh0IGF0dHJpYnV0ZSBvZiBhIG5vZGUuCisKK1RoZSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQgZmllbGRzOgorCistIEByZWYgc29hcF9kb21fZWxlbWVudDo6bmV4dCBwb2ludGVyIHRvIG5leHQgc2libGluZyBpbiBsaXN0LgorLSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQ6OnBybnQgcG9pbnRlciB0byBwYXJlbnQgbm9kZS4KKy0gQHJlZiBzb2FwX2RvbV9lbGVtZW50OjplbHRzIHBvaW50ZXIgdG8gbGlzdCBvZiBjaGlsZCBlbGVtZW50IG5vZGVzLgorLSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQ6OmF0dHMgcG9pbnRlciB0byBsaXN0IG9mIGF0dHJpYnV0ZSBub2Rlcy4KKy0gQHJlZiBzb2FwX2RvbV9lbGVtZW50Ojpuc3RyIG9wdGlvbmFsIG5hbWVzcGFjZSBzdHJpbmcgb2YgdGhpcyBub2RlLgorLSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQ6Om5hbWUgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgbm9kZSAod2l0aCBvcHRpb25hbAorICBwcmVmaXgpLgorLSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQ6OmRhdGEgb3B0aW9uYWwgY2hhcmFjdGVyIGRhdGEgaW4gVVRGLTggZm9ybWF0LgorLSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQ6OndpZGUgb3B0aW9uYWwgY2hhcmFjdGVyIGRhdGEgaW4gd2lkZSBzdHJpbmcgZm9ybWF0LgorLSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQ6OnR5cGUgb3B0aW9uYWwgU09BUF9UWVBFX1ggdHlwZSBvZiBhIEMvQysrIGRhdGEKKyAgc3RydWN0dXJlIHN0b3JlZCB3aXRoIHRoaXMgbm9kZS4KKy0gQHJlZiBzb2FwX2RvbV9lbGVtZW50Ojpub2RlIG9wdGlvbmFsIHBvaW50ZXIgdG8gdGhlIEMvQysrIGRhdGEgc3RydWN0dXJlCisgIHN0b3JlZCB3aXRoIHRoaXMgbm9kZS4KKy0gQHJlZiBzb2FwX2RvbV9lbGVtZW50OjpoZWFkIG9wdGlvbmFsIGxlYWRpbmcgd2hpdGVzcGFjZSB0byB0aGUgc3RhcnQgdGFnLgorLSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQ6OnRhaWwgb3B0aW9uYWwgbGVhZGluZyB3aGl0ZXNwYWNlIHRvIHRoZSBlbmQgdGFnLgorLSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQ6OnNvYXAgdGhlIHNvYXAgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBub2RlLgorCitUaGUgQHJlZiBzb2FwX2RvbV9lbGVtZW50IHR5cGVzOgorCistIEByZWYgc29hcF9kb21fZWxlbWVudDo6aXRlcmF0b3IKKworVGhlIEByZWYgc29hcF9kb21fZWxlbWVudCBtZXRob2RzOgorCistIEByZWYgc29hcF9kb21fZWxlbWVudDo6c2V0KG5zdHIsIG5hbWUpOworLSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQ6OnNldChkYXRhKTsKKy0gQHJlZiBzb2FwX2RvbV9lbGVtZW50OjpzZXQobm9kZSwgdHlwZSk7CistIEByZWYgc29hcF9kb21fZWxlbWVudDo6YWRkKHNvYXBfZG9tX2VsZW1lbnQpOworLSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQ6OmFkZChzb2FwX2RvbV9hdHRyaWJ1dGUpOworLSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQ6OmJlZ2luKCk7CistIEByZWYgc29hcF9kb21fZWxlbWVudDo6ZW5kKCk7CistIEByZWYgc29hcF9kb21fZWxlbWVudDo6ZmluZChuc3RyLCBuYW1lKTsKKy0gQHJlZiBzb2FwX2RvbV9lbGVtZW50OjpmaW5kKHR5cGUpOworLSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQ6OnVubGluaygpOworCitUaGUgQHJlZiBzb2FwX2RvbV9lbGVtZW50IGNvbnN0cnVjdG9yczoKKworLSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQoKTsKKy0gQHJlZiBzb2FwX2RvbV9lbGVtZW50KHNvYXApOworLSBAcmVmIHNvYXBfZG9tX2VsZW1lbnQoc29hcCwgbnN0ciwgbmFtZSk7CistIEByZWYgc29hcF9kb21fZWxlbWVudChzb2FwLCBuc3RyLCBuYW1lLCBkYXRhKTsKKy0gQHJlZiBzb2FwX2RvbV9lbGVtZW50KHNvYXAsIG5zdHIsIG5hbWUsIG5vZGUsIHR5cGUpOworCitUaGUgQHJlZiBzb2FwX2RvbV9hdHRyaWJ1dGUgZmllbGRzOgorCistIEByZWYgc29hcF9kb21fYXR0cmlidXRlOjpuZXh0IHBvaW50ZXIgdG8gbmV4dCBhdHRyaWJ1dGUgbm9kZSBpbiBsaXN0LgorLSBAcmVmIHNvYXBfZG9tX2F0dHJpYnV0ZTo6bnN0ciBvcHRpb25hbCBuYW1lc3BhY2Ugc3RyaW5nIG9mIHRoaXMgbm9kZS4KKy0gQHJlZiBzb2FwX2RvbV9hdHRyaWJ1dGU6Om5hbWUgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSAod2l0aCBvcHRpb25hbAorICBwcmVmaXgpLgorLSBAcmVmIHNvYXBfZG9tX2F0dHJpYnV0ZTo6ZGF0YSBvcHRpb25hbCBjaGFyYWN0ZXIgZGF0YSBpbiBVVEYtOCBmb3JtYXQuCistIEByZWYgc29hcF9kb21fYXR0cmlidXRlOjpzb2FwIHRoZSBzb2FwIGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgbm9kZS4KKworVGhlIEByZWYgc29hcF9kb21fYXR0cmlidXRlIHR5cGVzOgorCistIEByZWYgc29hcF9kb21fYXR0cmlidXRlOjppdGVyYXRvcgorCitUaGUgQHJlZiBzb2FwX2RvbV9hdHRyaWJ1dGUgbWV0aG9kczoKKworLSBAcmVmIHNvYXBfZG9tX2F0dHJpYnV0ZTo6c2V0KG5zdHIsIG5hbWUpOworLSBAcmVmIHNvYXBfZG9tX2F0dHJpYnV0ZTo6c2V0KGRhdGEpOworLSBAcmVmIHNvYXBfZG9tX2F0dHJpYnV0ZTo6YmVnaW4oKTsKKy0gQHJlZiBzb2FwX2RvbV9hdHRyaWJ1dGU6OmVuZCgpOworLSBAcmVmIHNvYXBfZG9tX2F0dHJpYnV0ZTo6ZmluZChuc3RyLCBuYW1lKTsKKy0gQHJlZiBzb2FwX2RvbV9hdHRyaWJ1dGU6OnVubGluaygpOworCitUaGUgQHJlZiBzb2FwX2RvbV9hdHRyaWJ1dGUgY29uc3RydWN0b3JzOgorCistIEByZWYgc29hcF9kb21fYXR0cmlidXRlKCk7CistIEByZWYgc29hcF9kb21fYXR0cmlidXRlKHNvYXApOworLSBAcmVmIHNvYXBfZG9tX2F0dHJpYnV0ZShzb2FwLCBuc3RyLCBuYW1lLCBkYXRhKTsKKworKi8KKworLy8vIEBicmllZiBUaGUgY3VzdG9tIHNlcmlhbGl6ZXIgZm9yIERPTSBub2RlcyBpcyByZXByZXNlbnRlZCBieSB4c2RfX2FueVR5cGUuCitleHRlcm4gdHlwZWRlZiBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCB4c2RfX2FueVR5cGU7CisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvcXVvdGU0L3F1b3RlNC5jcHAgYi9zYW1wbGVzL3F1b3RlNC9xdW90ZTQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NzliYzcKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3F1b3RlNC9xdW90ZTQuY3BwCkBAIC0wLDAgKzEsNTAgQEAKKyNpbmNsdWRlICJzb2FwSC5oIgordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sgc29hcCAqc29hcCA9IHNvYXBfbmV3MShTT0FQX0RPTV9OT0RFKTsgLy8gZW5hYmxlIGRlc2VyaWFsaXphdGlvbiBvZiBhcHBsaWNhdGlvbiBkYXRhCisgIGlmIChhcmdjIDw9IDEpCisgIHsgZnByaW50ZihzdGRlcnIsICJVc2FnZTogcXVvdGU0IDx0aWNrZXI+XG4iKTsKKyAgICBleGl0KDEpOworICB9CisgIHNvYXBfZG9tX2VsZW1lbnQgZW52ZWxvcGUoc29hcCwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIiwgIkVudmVsb3BlIik7CisgIHNvYXBfZG9tX2VsZW1lbnQgYm9keShzb2FwLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iLCAiQm9keSIpOworICBzb2FwX2RvbV9hdHRyaWJ1dGUgZW5jb2RpbmdTdHlsZShzb2FwLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iLCAiZW5jb2RpbmdTdHlsZSIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOworICBzb2FwX2RvbV9lbGVtZW50IHJlcXVlc3Qoc29hcCwgInVybjp4bWV0aG9kcy1kZWxheWVkLXF1b3RlcyIsICJnZXRRdW90ZSIpOworICBzb2FwX2RvbV9lbGVtZW50IHN5bWJvbChzb2FwLCBOVUxMLCAic3ltYm9sIiwgYXJndlsxXSk7CisgIHNvYXBfZG9tX2VsZW1lbnQgcmVzcG9uc2Uoc29hcCk7CisgIGVudmVsb3BlLmFkZChib2R5KTsKKyAgYm9keS5hZGQoZW5jb2RpbmdTdHlsZSk7CisgIGJvZHkuYWRkKHJlcXVlc3QpOworICByZXF1ZXN0LmFkZChzeW1ib2wpOworICBjb3V0IDw8ICJSZXF1ZXN0IG1lc3NhZ2U6IiA8PCBlbmRsIDw8IGVudmVsb3BlIDw8IGVuZGw7CisgIHNvYXBfc2VyaWFsaXplX3hzZF9fYW55VHlwZShzb2FwLCAmZW52ZWxvcGUpOworICBpZiAoc29hcF9jb25uZWN0KHNvYXAsICJodHRwOi8vc2VydmljZXMueG1ldGhvZHMubmV0L3NvYXAiLCAiIikKKyAgIHx8IHNvYXBfcHV0X3hzZF9fYW55VHlwZShzb2FwLCAmZW52ZWxvcGUsIE5VTEwsIE5VTEwpCisgICB8fCBzb2FwX2VuZF9zZW5kKHNvYXApCisgICB8fCBzb2FwX2JlZ2luX3JlY3Yoc29hcCkKKyAgIHx8ICFzb2FwX2dldF94c2RfX2FueVR5cGUoc29hcCwgJnJlc3BvbnNlLCBOVUxMLCBOVUxMKSAvLyByZXR1cm5zIHBvaW50ZXIgd2hlbiBzdWNjZXNzZnVsCisgICB8fCBzb2FwX2VuZF9yZWN2KHNvYXApCisgICB8fCBzb2FwX2Nsb3Nlc29jayhzb2FwKSkKKyAgeyBzb2FwX3ByaW50X2ZhdWx0KHNvYXAsIHN0ZGVycik7CisgICAgc29hcF9wcmludF9mYXVsdF9sb2NhdGlvbihzb2FwLCBzdGRlcnIpOworICB9CisgIGVsc2UKKyAgeyBjb3V0IDw8ICJSZXNwb25zZSBtZXNzYWdlOiIgPDwgZW5kbCA8PCByZXNwb25zZSA8PCBlbmRsOworICAgIGZvciAoc29hcF9kb21fZWxlbWVudDo6aXRlcmF0b3Igd2Fsa2VyID0gcmVzcG9uc2UuZmluZChTT0FQX1RZUEVfeHNkX19mbG9hdCk7IHdhbGtlciAhPSByZXNwb25zZS5lbmQoKTsgKyt3YWxrZXIpCisgICAgICBjb3V0IDw8ICJRdW90ZSA9ICIgPDwgKih4c2RfX2Zsb2F0KikoKndhbGtlcikubm9kZSA8PCBlbmRsOworICB9CisgIHNvYXBfZGVzdHJveShzb2FwKTsKKyAgc29hcF9lbmQoc29hcCk7CisgIHNvYXBfZG9uZShzb2FwKTsKKyAgZnJlZShzb2FwKTsKKyAgcmV0dXJuIDA7Cit9CitTT0FQX05NQUMgc3RydWN0IE5hbWVzcGFjZSBuYW1lc3BhY2VzW10gPQoreworICB7IlNPQVAtRU5WIiwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIiwgImh0dHA6Ly93d3cudzMub3JnLyovc29hcC1lbnZlbG9wZSJ9LAorICB7IlNPQVAtRU5DIiwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiwgImh0dHA6Ly93d3cudzMub3JnLyovc29hcC1lbmNvZGluZyJ9LAorICB7InhzaSIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsICJodHRwOi8vd3d3LnczLm9yZy8qL1hNTFNjaGVtYS1pbnN0YW5jZSJ9LAorICB7InhzZCIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsICJodHRwOi8vd3d3LnczLm9yZy8qL1hNTFNjaGVtYSJ9LAorICB7TlVMTCwgTlVMTH0KK307CisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvcXVvdGU0L3F1b3RlNC5oIGIvc2FtcGxlcy9xdW90ZTQvcXVvdGU0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFhMDA5NQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvcXVvdGU0L3F1b3RlNC5oCkBAIC0wLDAgKzEsMiBAQAorI2ltcG9ydCAiZG9tLmgiCit0eXBlZGVmIGZsb2F0IHhzZF9fZmxvYXQ7CmRpZmYgLS1naXQgYS9zYW1wbGVzL3F1b3RlX01BQ19Qcm9qQnVpbGQvUXVvdGUuMSBiL3NhbXBsZXMvcXVvdGVfTUFDX1Byb2pCdWlsZC9RdW90ZS4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMGQ5MjYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3F1b3RlX01BQ19Qcm9qQnVpbGQvUXVvdGUuMQpAQCAtMCwwICsxLDc5IEBACisuXCJNb2RpZmllZCBmcm9tIG1hbigxKSBvZiBGcmVlQlNELCB0aGUgTmV0QlNEIG1kb2MudGVtcGxhdGUsIGFuZCBtZG9jLnNhbXBsZXMuCisuXCJTZWUgQWxzbzoKKy5cIm1hbiBtZG9jLnNhbXBsZXMgZm9yIGEgY29tcGxldGUgbGlzdGluZyBvZiBvcHRpb25zCisuXCJtYW4gbWRvYyBmb3IgdGhlIHNob3J0IGxpc3Qgb2YgZWRpdGluZyBvcHRpb25zCisuXCIvdXNyL3NoYXJlL21pc2MvbWRvYy50ZW1wbGF0ZQorLkRkIFR1ZSBKdW4gMjQgMjAwMyAgICAgICAgICAgICAgIFwiIERBVEUgCisuRHQgUXVvdGUgMSAgICAgIFwiIFByb2dyYW0gbmFtZSBhbmQgbWFudWFsIHNlY3Rpb24gbnVtYmVyIAorLk9zIERhcndpbgorLlNoIE5BTUUgICAgICAgICAgICAgICAgIFwiIFNlY3Rpb24gSGVhZGVyIC0gcmVxdWlyZWQgLSBkb24ndCBtb2RpZnkgCisuTm0gUXVvdGUsCisuXCIgVGhlIGZvbGxvd2luZyBsaW5lcyBhcmUgcmVhZCBpbiBnZW5lcmF0aW5nIHRoZSBhcHJvcG9zKG1hbiAtaykgZGF0YWJhc2UuIFVzZSBvbmx5IGtleQorLlwiIHdvcmRzIGhlcmUgYXMgdGhlIGRhdGFiYXNlIGlzIGJ1aWx0IGJhc2VkIG9uIHRoZSB3b3JkcyBoZXJlIGFuZCBpbiB0aGUgLk5EIGxpbmUuIAorLk5tIE90aGVyX25hbWVfZm9yX3NhbWVfcHJvZ3JhbSgpLAorLk5tIFlldCBhbm90aGVyIG5hbWUgZm9yIHRoZSBzYW1lIHByb2dyYW0uCisuXCIgVXNlIC5ObSBtYWNybyB0byBkZXNpZ25hdGUgb3RoZXIgbmFtZXMgZm9yIHRoZSBkb2N1bWVudGVkIHByb2dyYW0uCisuTmQgVGhpcyBsaW5lIHBhcnNlZCBmb3Igd2hhdGlzIGRhdGFiYXNlLgorLlNoIFNZTk9QU0lTICAgICAgICAgICAgIFwiIFNlY3Rpb24gSGVhZGVyIC0gcmVxdWlyZWQgLSBkb24ndCBtb2RpZnkKKy5ObQorLk9wIEZsIGFiY2QgICAgICAgICAgICAgIFwiIFstYWJjZF0KKy5PcCBGbCBhIEFyIHBhdGggICAgICAgICBcIiBbLWEgcGF0aF0gCisuT3AgQXIgZmlsZSAgICAgICAgICAgICAgXCIgW2ZpbGVdCisuT3AgQXIgICAgICAgICAgICAgICAgICAgXCIgW2ZpbGUgLi4uXQorLkFyIGFyZzAgICAgICAgICAgICAgICAgIFwiIFVuZGVybGluZWQgYXJndW1lbnQgLSB1c2UgLkFyIGFueXdoZXJlIHRvIHVuZGVybGluZQorYXJnMiAuLi4gICAgICAgICAgICAgICAgIFwiIEFyZ3VtZW50cworLlNoIERFU0NSSVBUSU9OICAgICAgICAgIFwiIFNlY3Rpb24gSGVhZGVyIC0gcmVxdWlyZWQgLSBkb24ndCBtb2RpZnkKK1VzZSB0aGUgLk5tIG1hY3JvIHRvIHJlZmVyIHRvIHlvdXIgcHJvZ3JhbSB0aHJvdWdob3V0IHRoZSBtYW4gcGFnZSBsaWtlIHN1Y2g6CisuTm0KK1VuZGVybGluaW5nIGlzIGFjY29tcGxpc2hlZCB3aXRoIHRoZSAuQXIgbWFjcm8gbGlrZSB0aGlzOgorLkFyIHVuZGVybGluZWQgdGV4dCAuCisuUHAgICAgICAgICAgICAgICAgICAgICAgXCIgSW5zZXJ0cyBhIHNwYWNlCitBIGxpc3Qgb2YgaXRlbXMgd2l0aCBkZXNjcmlwdGlvbnM6CisuQmwgLXRhZyAtd2lkdGggLWluZGVudCAgXCIgQmVnaW5zIGEgdGFnZ2VkIGxpc3QgCisuSXQgaXRlbSBhICAgICAgICAgICAgICAgXCIgRWFjaCBpdGVtIHByZWNlZGVkIGJ5IC5JdCBtYWNybworRGVzY3JpcHRpb24gb2YgaXRlbSBhCisuSXQgaXRlbSBiCitEZXNjcmlwdGlvbiBvZiBpdGVtIGIKKy5FbCAgICAgICAgICAgICAgICAgICAgICBcIiBFbmRzIHRoZSBsaXN0CisuUHAKK0EgbGlzdCBvZiBmbGFncyBhbmQgdGhlaXIgZGVzY3JpcHRpb25zOgorLkJsIC10YWcgLXdpZHRoIC1pbmRlbnQgIFwiIERpZmZlcnMgZnJvbSBhYm92ZSBpbiB0YWcgcmVtb3ZlZCAKKy5JdCBGbCBhICAgICAgICAgICAgICAgICBcIi1hIGZsYWcgYXMgYSBsaXN0IGl0ZW0KK0Rlc2NyaXB0aW9uIG9mIC1hIGZsYWcKKy5JdCBGbCBiCitEZXNjcmlwdGlvbiBvZiAtYiBmbGFnCisuRWwgICAgICAgICAgICAgICAgICAgICAgXCIgRW5kcyB0aGUgbGlzdAorLlBwCisuXCIgLlNoIEVOVklST05NRU5UICAgICAgXCIgTWF5IG5vdCBiZSBuZWVkZWQKKy5cIiAuQmwgLXRhZyAtd2lkdGggIkVOVl9WQVJfMSIgLWluZGVudCBcIiBFTlZfVkFSXzEgaXMgd2lkdGggb2YgdGhlIHN0cmluZyBFTlZfVkFSXzEKKy5cIiAuSXQgRXYgRU5WX1ZBUl8xCisuXCIgRGVzY3JpcHRpb24gb2YgRU5WX1ZBUl8xCisuXCIgLkl0IEV2IEVOVl9WQVJfMgorLlwiIERlc2NyaXB0aW9uIG9mIEVOVl9WQVJfMgorLlwiIC5FbCAgICAgICAgICAgICAgICAgICAgICAKKy5TaCBGSUxFUyAgICAgICAgICAgICAgICBcIiBGaWxlIHVzZWQgb3IgY3JlYXRlZCBieSB0aGUgdG9waWMgb2YgdGhlIG1hbiBwYWdlCisuQmwgLXRhZyAtd2lkdGggIi9Vc2Vycy9qb2V1c2VyL0xpYnJhcnkvcmVhbGx5X2xvbmdfZmlsZV9uYW1lIiAtY29tcGFjdAorLkl0IFBhIC91c3Ivc2hhcmUvZmlsZV9uYW1lCitGSUxFXzFkZXNjcmlwdGlvbgorLkl0IFBhIC9Vc2Vycy9qb2V1c2VyL0xpYnJhcnkvcmVhbGx5X2xvbmdfZmlsZV9uYW1lCitGSUxFXzIgZGVzY3JpcHRpb24KKy5cIiAuU2ggRElBR05PU1RJQ1MgICAgICAgXCIgTWF5IG5vdCBiZSBuZWVkZWQKKy5cIiAuQmwgLWRpYWcKKy5cIiAuSXQgRGlhZ25vc3RpYyBUYWcKKy5cIiBEaWFnbm9zdGljIGluZm9ybXRpb24gaGVyZS4KKy5cIiAuSXQgRGlhZ25vc3RpYyBUYWcKKy5cIiBEaWFnbm9zdGljIGluZm9ybXRpb24gaGVyZS4KKy5cIiAuRWwKKy5TaCBTRUUgQUxTTyAKKy5cIiBMaXN0IGxpbmtzIGluIGFzY2VuZGluZyBvcmRlciBieSBzZWN0aW9uLCBhbHBoYWJldGljYWxseSB3aXRoaW4gYSBzZWN0aW9uLgorLlwiIFBsZWFzZSBkbyBub3QgcmVmZXJlbmNlIGZpbGVzIHRoYXQgZG8gbm90IGV4aXN0IHdpdGhvdXQgZmlsaW5nIGEgYnVnIHJlcG9ydAorLlhyIGEgMSAsIAorLlhyIGIgMSAsCisuWHIgYyAxICwKKy5YciBhIDIgLAorLlhyIGIgMiAsCisuWHIgYSAzICwKKy5YciBiIDMgCisuXCIgLlNoIEJVR1MgICAgICAgICAgICAgIFwiIERvY3VtZW50IGtub3duLCB1bnJlbWVkaWVkIGJ1Z3MgCisuXCIgLlNoIEhJU1RPUlkgICAgICAgICAgIFwiIERvY3VtZW50IGhpc3RvcnkgaWYgY29tbWFuZCBiZWhhdmVzIGluIGEgdW5pcXVlIG1hbm5lciAKKw0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvcXVvdGVfTUFDX1Byb2pCdWlsZC9RdW90ZS5wYnByb2ovcHJvamVjdC5wYnhwcm9qIGIvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL1F1b3RlLnBicHJvai9wcm9qZWN0LnBieHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U5YzY0MwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvcXVvdGVfTUFDX1Byb2pCdWlsZC9RdW90ZS5wYnByb2ovcHJvamVjdC5wYnhwcm9qCkBAIC0wLDAgKzEsMzI2IEBACisvLyAhJCpVVEY4KiQhCit7CisJYXJjaGl2ZVZlcnNpb24gPSAxOworCWNsYXNzZXMgPSB7CisJfTsKKwlvYmplY3RWZXJzaW9uID0gMzg7CisJb2JqZWN0cyA9IHsKKwkJMDE0Q0VBNTIwMDE4Q0U1ODExQ0EyOTIzID0geworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBOTzsKKwkJCQlPUFRJTUlaQVRJT05fQ0ZMQUdTID0gIi1PMCI7CisJCQl9OworCQkJaXNhID0gUEJYQnVpbGRTdHlsZTsKKwkJCW5hbWUgPSBEZXZlbG9wbWVudDsKKwkJfTsKKwkJMDE0Q0VBNTMwMDE4Q0U1ODExQ0EyOTIzID0geworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBZRVM7CisJCQl9OworCQkJaXNhID0gUEJYQnVpbGRTdHlsZTsKKwkJCW5hbWUgPSBEZXBsb3ltZW50OworCQl9OworLy8wMTAKKy8vMDExCisvLzAxMgorLy8wMTMKKy8vMDE0CisvLzAzMAorLy8wMzEKKy8vMDMyCisvLzAzMworLy8wMzQKKwkJMDM0NzY4RThGRjM4QTc5ODExREI5QzhCID0geworCQkJaXNhID0gUEJYRXhlY3V0YWJsZUZpbGVSZWZlcmVuY2U7CisJCQlwYXRoID0gUXVvdGU7CisJCQlyZWZUeXBlID0gMzsKKwkJfTsKKy8vMDMwCisvLzAzMQorLy8wMzIKKy8vMDMzCisvLzAzNAorLy8wODAKKy8vMDgxCisvLzA4MgorLy8wODMKKy8vMDg0CisJCTA4RkI3NzkzRkU4NDE1NURDMDJBQUMwNyA9IHsKKwkJCWJ1aWxkU3R5bGVzID0gKAorCQkJCTAxNENFQTUyMDAxOENFNTgxMUNBMjkyMywKKwkJCQkwMTRDRUE1MzAwMThDRTU4MTFDQTI5MjMsCisJCQkpOworCQkJaXNhID0gUEJYUHJvamVjdDsKKwkJCW1haW5Hcm91cCA9IDA4RkI3Nzk0RkU4NDE1NURDMDJBQUMwNzsKKwkJCXByb2plY3REaXJQYXRoID0gIiI7CisJCQl0YXJnZXRzID0gKAorCQkJCTA4RkI3NzlGRkU4NDE1NURDMDJBQUMwNywKKwkJCSk7CisJCX07CisJCTA4RkI3Nzk0RkU4NDE1NURDMDJBQUMwNyA9IHsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTA4RkI3Nzk1RkU4NDE1NURDMDJBQUMwNywKKwkJCQlDNkEwRkYyQjAyOTA3OTdGMDRDOTE3ODIsCisJCQkJMUFCNjc0QURGRTlENTRCNTExQ0EyQ0JCLAorCQkJKTsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJbmFtZSA9IFF1b3RlOworCQkJcmVmVHlwZSA9IDQ7CisJCX07CisJCTA4RkI3Nzk1RkU4NDE1NURDMDJBQUMwNyA9IHsKKwkJCWNoaWxkcmVuID0gKAorCQkJCUY1OEY4REE4MDRBOTBDN0EwMTQ1RDM0QiwKKwkJCQlGNThGOERBOTA0QTkwQzdBMDE0NUQzNEIsCisJCQkJRjU4RjhEQkQwNEE5MEU1QjAxNDVEMzRCLAorCQkJCUY1OEY4REFEMDRBOTBDOTQwMTQ1RDM0QiwKKwkJCQlGNThGOERCQTA0QTkwRTNEMDE0NUQzNEIsCisJCQkJRjU4RjhEQjkwNEE5MEUzRDAxNDVEMzRCLAorCQkJCUY1OEY4REIzMDRBOTBEQkUwMTQ1RDM0QiwKKwkJCQlGNThGOERCNzA0QTkwREQyMDE0NUQzNEIsCisJCQkpOworCQkJaXNhID0gUEJYR3JvdXA7CisJCQluYW1lID0gU291cmNlOworCQkJcmVmVHlwZSA9IDQ7CisJCX07CisJCTA4RkI3NzlGRkU4NDE1NURDMDJBQUMwNyA9IHsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCUY1OEY4REIwMDRBOTBEMEUwMTQ1RDM0QiwKKwkJCQkwOEZCNzdBMEZFODQxNTVEQzAyQUFDMDcsCisJCQkJMDhGQjc3QTFGRTg0MTU1REMwMkFBQzA3LAorCQkJCTA4RkI3N0EzRkU4NDE1NURDMDJBQUMwNywKKwkJCQkwOEZCNzdBNUZFODQxNTVEQzAyQUFDMDcsCisJCQkJQzZBMEZGMkQwMjkwNzlBRDA0QzkxNzgyLAorCQkJKTsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJRlJBTUVXT1JLX1NFQVJDSF9QQVRIUyA9ICIiOworCQkJCUhFQURFUl9TRUFSQ0hfUEFUSFMgPSAiIjsKKwkJCQlJTlNUQUxMX1BBVEggPSAiJChIT01FKS9iaW4iOworCQkJCUxJQlJBUllfU0VBUkNIX1BBVEhTID0gIiI7CisJCQkJT1RIRVJfQ0ZMQUdTID0gIiI7CisJCQkJT1RIRVJfTERGTEFHUyA9ICIiOworCQkJCU9USEVSX1JFWkZMQUdTID0gIiI7CisJCQkJUFJPRFVDVF9OQU1FID0gUXVvdGU7CisJCQkJUkVaX0VYRUNVVEFCTEUgPSBZRVM7CisJCQkJU0VDVE9SREVSX0ZMQUdTID0gIiI7CisJCQkJV0FSTklOR19DRkxBR1MgPSAiLVdtb3N0IC1Xbm8tZm91ci1jaGFyLWNvbnN0YW50cyAtV25vLXVua25vd24tcHJhZ21hcyI7CisJCQl9OworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJKTsKKwkJCWlzYSA9IFBCWFRvb2xUYXJnZXQ7CisJCQluYW1lID0gUXVvdGU7CisJCQlwcm9kdWN0SW5zdGFsbFBhdGggPSAiJChIT01FKS9iaW4iOworCQkJcHJvZHVjdE5hbWUgPSBRdW90ZTsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSAwMzQ3NjhFOEZGMzhBNzk4MTFEQjlDOEI7CisJCQlzaG91bGRVc2VIZWFkZXJtYXAgPSAxOworCQl9OworCQkwOEZCNzdBMEZFODQxNTVEQzAyQUFDMDcgPSB7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJRjU4RjhEQUIwNEE5MEM3QTAxNDVEMzRCLAorCQkJCUY1OEY4REFGMDRBOTBDOTQwMTQ1RDM0QiwKKwkJCQlGNThGOERCNjA0QTkwREJFMDE0NUQzNEIsCisJCQkJRjU4RjhEQjgwNEE5MEREMjAxNDVEMzRCLAorCQkJKTsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTA4RkI3N0ExRkU4NDE1NURDMDJBQUMwNyA9IHsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlGNThGOERBQTA0QTkwQzdBMDE0NUQzNEIsCisJCQkJRjU4RjhEQkIwNEE5MEUzRDAxNDVEMzRCLAorCQkJCUY1OEY4REJDMDRBOTBFM0QwMTQ1RDM0QiwKKwkJCQlGNThGOERCRTA0QTkwRTVCMDE0NUQzNEIsCisJCQkpOworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJMDhGQjc3QTNGRTg0MTU1REMwMkFBQzA3ID0geworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTA4RkI3N0E1RkU4NDE1NURDMDJBQUMwNyA9IHsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCSk7CisJCQlpc2EgPSBQQlhSZXpCdWlsZFBoYXNlOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvLzA4MAorLy8wODEKKy8vMDgyCisvLzA4MworLy8wODQKKy8vMUEwCisvLzFBMQorLy8xQTIKKy8vMUEzCisvLzFBNAorCQkxQUI2NzRBREZFOUQ1NEI1MTFDQTJDQkIgPSB7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwMzQ3NjhFOEZGMzhBNzk4MTFEQjlDOEIsCisJCQkpOworCQkJaXNhID0gUEJYR3JvdXA7CisJCQluYW1lID0gUHJvZHVjdHM7CisJCQlyZWZUeXBlID0gNDsKKwkJfTsKKy8vMUEwCisvLzFBMQorLy8xQTIKKy8vMUEzCisvLzFBNAorLy9DNjAKKy8vQzYxCisvL0M2MgorLy9DNjMKKy8vQzY0CisJCUM2QTBGRjJCMDI5MDc5N0YwNEM5MTc4MiA9IHsKKwkJCWNoaWxkcmVuID0gKAorCQkJCUM2QTBGRjJDMDI5MDc5OUEwNEM5MTc4MiwKKwkJCSk7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCW5hbWUgPSBEb2N1bWVudGF0aW9uOworCQkJcmVmVHlwZSA9IDQ7CisJCX07CisJCUM2QTBGRjJDMDI5MDc5OUEwNEM5MTc4MiA9IHsKKwkJCWlzYSA9IFBCWEZpbGVSZWZlcmVuY2U7CisJCQlwYXRoID0gUXVvdGUuMTsKKwkJCXJlZlR5cGUgPSA0OworCQl9OworCQlDNkEwRkYyRDAyOTA3OUFEMDRDOTE3ODIgPSB7CisJCQlidWlsZEFjdGlvbk1hc2sgPSA4OworCQkJZHN0UGF0aCA9IC91c3Ivc2hhcmUvbWFuL21hbjEvOworCQkJZHN0U3ViZm9sZGVyU3BlYyA9IDA7CisJCQlmaWxlcyA9ICgKKwkJCQlDNkEwRkYyRTAyOTA3OUMwMDRDOTE3ODIsCisJCQkpOworCQkJaXNhID0gUEJYQ29weUZpbGVzQnVpbGRQaGFzZTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAxOworCQl9OworCQlDNkEwRkYyRTAyOTA3OUMwMDRDOTE3ODIgPSB7CisJCQlmaWxlUmVmID0gQzZBMEZGMkMwMjkwNzk5QTA0QzkxNzgyOworCQkJaXNhID0gUEJYQnVpbGRGaWxlOworCQkJc2V0dGluZ3MgPSB7CisJCQl9OworCQl9OworLy9DNjAKKy8vQzYxCisvL0M2MgorLy9DNjMKKy8vQzY0CisvL0Y1MAorLy9GNTEKKy8vRjUyCisvL0Y1MworLy9GNTQKKwkJRjU4RjhEQTgwNEE5MEM3QTAxNDVEMzRCID0geworCQkJaXNhID0gUEJYRmlsZVJlZmVyZW5jZTsKKwkJCXBhdGggPSBxdW90ZS5jOworCQkJcmVmVHlwZSA9IDQ7CisJCX07CisJCUY1OEY4REE5MDRBOTBDN0EwMTQ1RDM0QiA9IHsKKwkJCWlzYSA9IFBCWEZpbGVSZWZlcmVuY2U7CisJCQlwYXRoID0gcXVvdGUuaDsKKwkJCXJlZlR5cGUgPSA0OworCQl9OworCQlGNThGOERBQTA0QTkwQzdBMDE0NUQzNEIgPSB7CisJCQlmaWxlUmVmID0gRjU4RjhEQTgwNEE5MEM3QTAxNDVEMzRCOworCQkJaXNhID0gUEJYQnVpbGRGaWxlOworCQkJc2V0dGluZ3MgPSB7CisJCQl9OworCQl9OworCQlGNThGOERBQjA0QTkwQzdBMDE0NUQzNEIgPSB7CisJCQlmaWxlUmVmID0gRjU4RjhEQTkwNEE5MEM3QTAxNDVEMzRCOworCQkJaXNhID0gUEJYQnVpbGRGaWxlOworCQkJc2V0dGluZ3MgPSB7CisJCQl9OworCQl9OworCQlGNThGOERBRDA0QTkwQzk0MDE0NUQzNEIgPSB7CisJCQlpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOworCQkJcGF0aCA9IHN0ZHNvYXAyLmg7CisJCQlyZWZUeXBlID0gNDsKKwkJfTsKKwkJRjU4RjhEQUYwNEE5MEM5NDAxNDVEMzRCID0geworCQkJZmlsZVJlZiA9IEY1OEY4REFEMDRBOTBDOTQwMTQ1RDM0QjsKKwkJCWlzYSA9IFBCWEJ1aWxkRmlsZTsKKwkJCXNldHRpbmdzID0geworCQkJfTsKKwkJfTsKKwkJRjU4RjhEQjAwNEE5MEQwRTAxNDVEMzRCID0geworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCWdlbmVyYXRlZEZpbGVOYW1lcyA9ICgKKwkJCSk7CisJCQlpc2EgPSBQQlhTaGVsbFNjcmlwdEJ1aWxkUGhhc2U7CisJCQluZWVkZWRGaWxlTmFtZXMgPSAoCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCQlzaGVsbFBhdGggPSAvYmluL3NoOworCQkJc2hlbGxTY3JpcHQgPSAifi9iaW4vc29hcGNwcDIgLWMgcXVvdGUuaCI7CisJCX07CisJCUY1OEY4REIzMDRBOTBEQkUwMTQ1RDM0QiA9IHsKKwkJCWlzYSA9IFBCWEZpbGVSZWZlcmVuY2U7CisJCQlwYXRoID0gc29hcEguaDsKKwkJCXJlZlR5cGUgPSA0OworCQl9OworCQlGNThGOERCNjA0QTkwREJFMDE0NUQzNEIgPSB7CisJCQlmaWxlUmVmID0gRjU4RjhEQjMwNEE5MERCRTAxNDVEMzRCOworCQkJaXNhID0gUEJYQnVpbGRGaWxlOworCQkJc2V0dGluZ3MgPSB7CisJCQl9OworCQl9OworCQlGNThGOERCNzA0QTkwREQyMDE0NUQzNEIgPSB7CisJCQlpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOworCQkJcGF0aCA9IHNvYXBTdHViLmg7CisJCQlyZWZUeXBlID0gNDsKKwkJfTsKKwkJRjU4RjhEQjgwNEE5MEREMjAxNDVEMzRCID0geworCQkJZmlsZVJlZiA9IEY1OEY4REI3MDRBOTBERDIwMTQ1RDM0QjsKKwkJCWlzYSA9IFBCWEJ1aWxkRmlsZTsKKwkJCXNldHRpbmdzID0geworCQkJfTsKKwkJfTsKKwkJRjU4RjhEQjkwNEE5MEUzRDAxNDVEMzRCID0geworCQkJaXNhID0gUEJYRmlsZVJlZmVyZW5jZTsKKwkJCXBhdGggPSBzb2FwQy5jOworCQkJcmVmVHlwZSA9IDQ7CisJCX07CisJCUY1OEY4REJBMDRBOTBFM0QwMTQ1RDM0QiA9IHsKKwkJCWlzYSA9IFBCWEZpbGVSZWZlcmVuY2U7CisJCQlwYXRoID0gc29hcENsaWVudC5jOworCQkJcmVmVHlwZSA9IDQ7CisJCX07CisJCUY1OEY4REJCMDRBOTBFM0QwMTQ1RDM0QiA9IHsKKwkJCWZpbGVSZWYgPSBGNThGOERCOTA0QTkwRTNEMDE0NUQzNEI7CisJCQlpc2EgPSBQQlhCdWlsZEZpbGU7CisJCQlzZXR0aW5ncyA9IHsKKwkJCX07CisJCX07CisJCUY1OEY4REJDMDRBOTBFM0QwMTQ1RDM0QiA9IHsKKwkJCWZpbGVSZWYgPSBGNThGOERCQTA0QTkwRTNEMDE0NUQzNEI7CisJCQlpc2EgPSBQQlhCdWlsZEZpbGU7CisJCQlzZXR0aW5ncyA9IHsKKwkJCX07CisJCX07CisJCUY1OEY4REJEMDRBOTBFNUIwMTQ1RDM0QiA9IHsKKwkJCWlzYSA9IFBCWEZpbGVSZWZlcmVuY2U7CisJCQlwYXRoID0gc3Rkc29hcDIuYzsKKwkJCXJlZlR5cGUgPSA0OworCQl9OworCQlGNThGOERCRTA0QTkwRTVCMDE0NUQzNEIgPSB7CisJCQlmaWxlUmVmID0gRjU4RjhEQkQwNEE5MEU1QjAxNDVEMzRCOworCQkJaXNhID0gUEJYQnVpbGRGaWxlOworCQkJc2V0dGluZ3MgPSB7CisJCQl9OworCQl9OworCX07CisJcm9vdE9iamVjdCA9IDA4RkI3NzkzRkU4NDE1NURDMDJBQUMwNzsKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvcXVvdGVfTUFDX1Byb2pCdWlsZC9SRUFETUUudHh0IGIvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZmNDFlMgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvcXVvdGVfTUFDX1Byb2pCdWlsZC9SRUFETUUudHh0CkBAIC0wLDAgKzEsMzMgQEAKK1F1b3RlX1BCOiBEZWxheWVkIFN0b2NrIFF1b3RlcyBBcHBsZSBNYWMgT1MgWCBQcm9qZWN0IEJ1aWxkZXIgUHJvamVjdAorCitUaGlzIGZvbGRlciBjb250YWlucyBhbiBleGFtcGxlIEFwcGxlIFByb2plY3QgQnVpbGRlciBwcm9qZWN0IHRvIGJ1aWxkIGFuCitYTWV0aG9kcyBEZWxheWVkIFN0b2NrIFF1b3RlIGNsaWVudCBhcHBsaWNhdGlvbiBpbiBDLgorCitUaGUgY3VzdG9tIGJ1aWxkIHN0ZXAgcnVucyB0aGUgZ1NPQVAgY29tcGlsZXIgdG8gZ2VuZXJhdGUgc3R1YnMgYW5kIHNrZWxldG9ucy4KKworVG8gYWRkIChvciBtb2RpZnkpIHRoZSBjdXN0b20gYnVpbGQgc3RlcCwgb3BlbiB0aGUgUXVvdGUucGJwcm9qIGZpbGUgYW5kOgorMS4gc2VsZWN0IHRoZSAiVGFyZ2V0cyIgdGFiIGluIHRoZSAiQnVpbGQiIHdpbmRvdworMi4gaW4gdGhlICJUYXJnZXRzIiBmb2xkZXIgc2VsZWN0ICJRdW90ZSIKKzMuIHNlbGVjdCAiQnVpbGQgUGhhc2VzIiBpbiAiU3VtbWFyeSIKKzQuIGZyb20gdGhlIG1lbnUgc2VsZWN0ICJQcm9qZWN0IiB0aGVuICJOZXcgQnVpbGQgUGhhc2UiCisgICBhbmQgIk5ldyBTaGVsbCBTY3JpcHQgQnVpbGQgUGhhc2UiCis1LiBpbiB0aGUgIlNjcmlwdCIgZW50cnkgYWRkOiAiL3Vzci9sb2NhbC9iaW4vc29hcGNwcDIgLWMgcXVvdGUuaCIKKworSW4gc3RlcCA1IHlvdSBuZWVkIHRvIGVudGVyIHRoZSBwYXRoIHRvIHNvYXBjcHAyLCB3aGljaCBpbiB0aGlzIGV4YW1wbGUgaXMKKy91c3IvbG9jYWwvYmluCisKK1RvIGluc3RhbGwgc29hcGNwcDIgaW4gL3Vzci9sb2NhbC9iaW4sIGVudGVyIHRoZXNlIGNvbW1hbmRzOgorc3VkbyBlY2hvCis8ZW50ZXIgeW91ciBhZG1pbiBwYXNzd29yZD4KK3N1ZG8gY3Agc29hcGNwcDIgL3Vzci9sb2NhbC9iaW4KKworVG8gYnVpbGQgYW5kIGRlYnVnIHRoZSBhcHBsaWNhdGlvbiwgc2VsZWN0ICJCdWlsZCBhbmQgRGVidWciLiBXaGVuIHRoZSBsaW5rCitwaGFzZSBmYWlscywgY2hlY2sgaWYgc29hcEMuYywgc29hcENsaWVudC5jIChvciBzb2FwU2VydmVyLmMgdG8gYnVpbGQgYSBzZXJ2ZXIpCithcmUgcHJlc2VudCBpbiB0aGUgcHJvamVjdCBzb3VyY2VzLiBJZiBub3QsIGFkZCB0aGVtIGZyb20gdGhlIG1lbnUgIlByb2plY3QiCisiQWRkIEZpbGVzLi4uIgorCitUbyB2aWV3IHRoZSBvdXRwdXQgb2YgdGhlIHByb2dyYW0gd2hpbGUgcnVubmluZywgc2VsZWN0IHRoZSAiU3RhbmRhcmQgSS9PIiB0YWIKK2luIHRoZSBkZWJ1Z2dlci4KKworVG8gY2hhbmdlIHRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnQgYmVmb3JlIHJ1bm5pbmcsIHNlbGVjdCAiVGFyZ2V0cyIgYW5kCisiRXhlY3V0YWJsZXMiLCAiUXVvdGUiLgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL2J1aWxkL1F1b3RlLmJ1aWxkL1F1b3RlLmJ1aWxkL0JQVGFnMDAwLXNjcmlwdC5zaCBiL3NhbXBsZXMvcXVvdGVfTUFDX1Byb2pCdWlsZC9idWlsZC9RdW90ZS5idWlsZC9RdW90ZS5idWlsZC9CUFRhZzAwMC1zY3JpcHQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTk2YmFlYQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvcXVvdGVfTUFDX1Byb2pCdWlsZC9idWlsZC9RdW90ZS5idWlsZC9RdW90ZS5idWlsZC9CUFRhZzAwMC1zY3JpcHQuc2gKQEAgLTAsMCArMSwyIEBACisjIS9iaW4vc2gKK34vYmluL3NvYXBjcHAyIC1jIHF1b3RlLmgKZGlmZiAtLWdpdCBhL3NhbXBsZXMvcXVvdGVfTUFDX1Byb2pCdWlsZC9idWlsZC9RdW90ZS5idWlsZC9RdW90ZS5idWlsZC9PYmplY3RzLW5vcm1hbC9MaW5rRmlsZUxpc3QgYi9zYW1wbGVzL3F1b3RlX01BQ19Qcm9qQnVpbGQvYnVpbGQvUXVvdGUuYnVpbGQvUXVvdGUuYnVpbGQvT2JqZWN0cy1ub3JtYWwvTGlua0ZpbGVMaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMWM3NzEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3F1b3RlX01BQ19Qcm9qQnVpbGQvYnVpbGQvUXVvdGUuYnVpbGQvUXVvdGUuYnVpbGQvT2JqZWN0cy1ub3JtYWwvTGlua0ZpbGVMaXN0CkBAIC0wLDAgKzEgQEAKKy9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL1F1b3RlX1BCL2J1aWxkL1F1b3RlLmJ1aWxkL1F1b3RlLmJ1aWxkL09iamVjdHMtbm9ybWFsL1Byb2plY3RCdWlsZGVyTWFzdGVyT2JqZWN0RmlsZS5vCmRpZmYgLS1naXQgYS9zYW1wbGVzL3F1b3RlX01BQ19Qcm9qQnVpbGQvYnVpbGQvUXVvdGUuYnVpbGQvUXVvdGUuYnVpbGQvT2JqZWN0cy1ub3JtYWwvTGlua0ZpbGVMaXN0UHJlbGluayBiL3NhbXBsZXMvcXVvdGVfTUFDX1Byb2pCdWlsZC9idWlsZC9RdW90ZS5idWlsZC9RdW90ZS5idWlsZC9PYmplY3RzLW5vcm1hbC9MaW5rRmlsZUxpc3RQcmVsaW5rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NGZlNDUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3F1b3RlX01BQ19Qcm9qQnVpbGQvYnVpbGQvUXVvdGUuYnVpbGQvUXVvdGUuYnVpbGQvT2JqZWN0cy1ub3JtYWwvTGlua0ZpbGVMaXN0UHJlbGluawpAQCAtMCwwICsxLDQgQEAKKy9Vc2Vycy9lbmdlbGVuL1Byb2plY3RzL1F1b3RlX1BCL2J1aWxkL1F1b3RlLmJ1aWxkL1F1b3RlLmJ1aWxkL09iamVjdHMtbm9ybWFsL3BwYy9xdW90ZS5vCisvVXNlcnMvZW5nZWxlbi9Qcm9qZWN0cy9RdW90ZV9QQi9idWlsZC9RdW90ZS5idWlsZC9RdW90ZS5idWlsZC9PYmplY3RzLW5vcm1hbC9wcGMvc29hcEMubworL1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvUXVvdGVfUEIvYnVpbGQvUXVvdGUuYnVpbGQvUXVvdGUuYnVpbGQvT2JqZWN0cy1ub3JtYWwvcHBjL3NvYXBDbGllbnQubworL1VzZXJzL2VuZ2VsZW4vUHJvamVjdHMvUXVvdGVfUEIvYnVpbGQvUXVvdGUuYnVpbGQvUXVvdGUuYnVpbGQvT2JqZWN0cy1ub3JtYWwvcHBjL3N0ZHNvYXAyLm8KZGlmZiAtLWdpdCBhL3NhbXBsZXMvcXVvdGVfTUFDX1Byb2pCdWlsZC9idWlsZC9RdW90ZS5idWlsZC9RdW90ZS5idWlsZC9RdW90ZS5obWFwIGIvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL2J1aWxkL1F1b3RlLmJ1aWxkL1F1b3RlLmJ1aWxkL1F1b3RlLmhtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMyMzAwYQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvcXVvdGVfTUFDX1Byb2pCdWlsZC9idWlsZC9RdW90ZS5idWlsZC9RdW90ZS5idWlsZC9RdW90ZS5obWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvcXVvdGVfTUFDX1Byb2pCdWlsZC9idWlsZC9RdW90ZS5idWlsZC9RdW90ZS5idWlsZC9UcnVzdGVkUHJlY29tcHMudHh0IGIvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL2J1aWxkL1F1b3RlLmJ1aWxkL1F1b3RlLmJ1aWxkL1RydXN0ZWRQcmVjb21wcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU2ZDZmMQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvcXVvdGVfTUFDX1Byb2pCdWlsZC9idWlsZC9RdW90ZS5idWlsZC9RdW90ZS5idWlsZC9UcnVzdGVkUHJlY29tcHMudHh0CkBAIC0wLDAgKzEgQEAKKy91c3IvaW5jbHVkZS91bmlzdGQuaApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL2J1aWxkL1F1b3RlLmJ1aWxkL1F1b3RlLnBieGluZGV4L1F1b3RlLmluZGV4ZWQtcHJlY29tcHMgYi9zYW1wbGVzL3F1b3RlX01BQ19Qcm9qQnVpbGQvYnVpbGQvUXVvdGUuYnVpbGQvUXVvdGUucGJ4aW5kZXgvUXVvdGUuaW5kZXhlZC1wcmVjb21wcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2ZmZjhjCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL2J1aWxkL1F1b3RlLmJ1aWxkL1F1b3RlLnBieGluZGV4L1F1b3RlLmluZGV4ZWQtcHJlY29tcHMKQEAgLTAsMCArMSBAQAorL3Vzci9pbmNsdWRlL3VuaXN0ZC1nY2MzLnB8MTAzMTk3MzA4MQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL2J1aWxkL1F1b3RlLmJ1aWxkL1F1b3RlLnBieGluZGV4L2NhdGVnb3JpZXMucGJ4YnRyZWUgYi9zYW1wbGVzL3F1b3RlX01BQ19Qcm9qQnVpbGQvYnVpbGQvUXVvdGUuYnVpbGQvUXVvdGUucGJ4aW5kZXgvY2F0ZWdvcmllcy5wYnhidHJlZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmI2OTgxCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL2J1aWxkL1F1b3RlLmJ1aWxkL1F1b3RlLnBieGluZGV4L2NhdGVnb3JpZXMucGJ4YnRyZWUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL2J1aWxkL1F1b3RlLmJ1aWxkL1F1b3RlLnBieGluZGV4L2RlY2xzLnBieGJ0cmVlIGIvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL2J1aWxkL1F1b3RlLmJ1aWxkL1F1b3RlLnBieGluZGV4L2RlY2xzLnBieGJ0cmVlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NmQ4MWQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3F1b3RlX01BQ19Qcm9qQnVpbGQvYnVpbGQvUXVvdGUuYnVpbGQvUXVvdGUucGJ4aW5kZXgvZGVjbHMucGJ4YnRyZWUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL2J1aWxkL1F1b3RlLmJ1aWxkL1F1b3RlLnBieGluZGV4L2ZpbGVzLnBieGJ0cmVlIGIvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL2J1aWxkL1F1b3RlLmJ1aWxkL1F1b3RlLnBieGluZGV4L2ZpbGVzLnBieGJ0cmVlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNzBmYjEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3F1b3RlX01BQ19Qcm9qQnVpbGQvYnVpbGQvUXVvdGUuYnVpbGQvUXVvdGUucGJ4aW5kZXgvZmlsZXMucGJ4YnRyZWUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL2J1aWxkL1F1b3RlLmJ1aWxkL1F1b3RlLnBieGluZGV4L2ltcG9ydHMucGJ4YnRyZWUgYi9zYW1wbGVzL3F1b3RlX01BQ19Qcm9qQnVpbGQvYnVpbGQvUXVvdGUuYnVpbGQvUXVvdGUucGJ4aW5kZXgvaW1wb3J0cy5wYnhidHJlZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGNiZDg0Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL2J1aWxkL1F1b3RlLmJ1aWxkL1F1b3RlLnBieGluZGV4L2ltcG9ydHMucGJ4YnRyZWUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL2J1aWxkL1F1b3RlLmJ1aWxkL1F1b3RlLnBieGluZGV4L3BieGluZGV4LmhlYWRlciBiL3NhbXBsZXMvcXVvdGVfTUFDX1Byb2pCdWlsZC9idWlsZC9RdW90ZS5idWlsZC9RdW90ZS5wYnhpbmRleC9wYnhpbmRleC5oZWFkZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMzNGQwNwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvcXVvdGVfTUFDX1Byb2pCdWlsZC9idWlsZC9RdW90ZS5idWlsZC9RdW90ZS5wYnhpbmRleC9wYnhpbmRleC5oZWFkZXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL2J1aWxkL1F1b3RlLmJ1aWxkL1F1b3RlLnBieGluZGV4L3Byb3RvY29scy5wYnhidHJlZSBiL3NhbXBsZXMvcXVvdGVfTUFDX1Byb2pCdWlsZC9idWlsZC9RdW90ZS5idWlsZC9RdW90ZS5wYnhpbmRleC9wcm90b2NvbHMucGJ4YnRyZWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZiNjk4MQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvcXVvdGVfTUFDX1Byb2pCdWlsZC9idWlsZC9RdW90ZS5idWlsZC9RdW90ZS5wYnhpbmRleC9wcm90b2NvbHMucGJ4YnRyZWUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL2J1aWxkL1F1b3RlLmJ1aWxkL1F1b3RlLnBieGluZGV4L3JlZnMucGJ4YnRyZWUgYi9zYW1wbGVzL3F1b3RlX01BQ19Qcm9qQnVpbGQvYnVpbGQvUXVvdGUuYnVpbGQvUXVvdGUucGJ4aW5kZXgvcmVmcy5wYnhidHJlZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGUzNzA1Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL2J1aWxkL1F1b3RlLmJ1aWxkL1F1b3RlLnBieGluZGV4L3JlZnMucGJ4YnRyZWUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL2J1aWxkL1F1b3RlLmJ1aWxkL1F1b3RlLnBieGluZGV4L3N0cmluZ3MucGJ4c3RyaW5ncy9jb250cm9sIGIvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL2J1aWxkL1F1b3RlLmJ1aWxkL1F1b3RlLnBieGluZGV4L3N0cmluZ3MucGJ4c3RyaW5ncy9jb250cm9sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MjA1NDkKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3F1b3RlX01BQ19Qcm9qQnVpbGQvYnVpbGQvUXVvdGUuYnVpbGQvUXVvdGUucGJ4aW5kZXgvc3RyaW5ncy5wYnhzdHJpbmdzL2NvbnRyb2wKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL2J1aWxkL1F1b3RlLmJ1aWxkL1F1b3RlLnBieGluZGV4L3N0cmluZ3MucGJ4c3RyaW5ncy9zdHJpbmdzIGIvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL2J1aWxkL1F1b3RlLmJ1aWxkL1F1b3RlLnBieGluZGV4L3N0cmluZ3MucGJ4c3RyaW5ncy9zdHJpbmdzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5Y2JlOWYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3F1b3RlX01BQ19Qcm9qQnVpbGQvYnVpbGQvUXVvdGUuYnVpbGQvUXVvdGUucGJ4aW5kZXgvc3RyaW5ncy5wYnhzdHJpbmdzL3N0cmluZ3MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL2J1aWxkL1F1b3RlLmJ1aWxkL1F1b3RlLnBieGluZGV4L3N1YmNsYXNzZXMucGJ4YnRyZWUgYi9zYW1wbGVzL3F1b3RlX01BQ19Qcm9qQnVpbGQvYnVpbGQvUXVvdGUuYnVpbGQvUXVvdGUucGJ4aW5kZXgvc3ViY2xhc3Nlcy5wYnhidHJlZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzRmNmU3Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL2J1aWxkL1F1b3RlLmJ1aWxkL1F1b3RlLnBieGluZGV4L3N1YmNsYXNzZXMucGJ4YnRyZWUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL2J1aWxkL1F1b3RlLmJ1aWxkL1F1b3RlLnBieGluZGV4L3N5bWJvbHMwLnBieHN5bWJvbHMgYi9zYW1wbGVzL3F1b3RlX01BQ19Qcm9qQnVpbGQvYnVpbGQvUXVvdGUuYnVpbGQvUXVvdGUucGJ4aW5kZXgvc3ltYm9sczAucGJ4c3ltYm9scwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTIxM2I2Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL2J1aWxkL1F1b3RlLmJ1aWxkL1F1b3RlLnBieGluZGV4L3N5bWJvbHMwLnBieHN5bWJvbHMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL3F1b3RlLmMgYi9zYW1wbGVzL3F1b3RlX01BQ19Qcm9qQnVpbGQvcXVvdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjc4NDg2Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL3F1b3RlLmMKQEAgLTAsMCArMSwzNCBAQAorI2luY2x1ZGUgInNvYXBILmgiCS8qIGluY2x1ZGUgZ2VuZXJhdGVkIHByb3h5IGFuZCBTT0FQIHN1cHBvcnQgKi8KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreyBzdHJ1Y3Qgc29hcCBzb2FwOworICBmbG9hdCBxOworICBjaGFyICpzeW07CisgIGlmIChhcmdjID4gMSkKKyAgICBzeW0gPSBhcmd2WzFdOworICBlbHNlCisgIHsgZnByaW50ZihzdGRlcnIsICJVc2FnZTogcXVvdGUgPHRpY2tlcj5cbiIpOworICAgIGV4aXQoMSk7CisgIH0KKyAgc29hcF9pbml0KCZzb2FwKTsKKyAgaWYgKHNvYXBfY2FsbF9uc19fZ2V0UXVvdGUoJnNvYXAsICJodHRwOi8vc2VydmljZXMueG1ldGhvZHMubmV0L3NvYXAiLCAiIiwgc3ltLCAmcSkgPT0gMCkKKyAgICBwcmludGYoIlxuQ29tcGFueSAtICVzICAgIFF1b3RlIC0gJWZcbiIsIHN5bSwgcSk7CisgIGVsc2UKKyAgICBzb2FwX3ByaW50X2ZhdWx0KCZzb2FwLCBzdGRlcnIpOworICBzb2FwX2VuZCgmc29hcCk7CisgIHNvYXBfZG9uZSgmc29hcCk7CisgIHJldHVybiAwOworfQorCisvKiBUaGUgbmFtZXNwYWNlIG1hcHBpbmcgdGFibGUgaXMgcmVxdWlyZWQgYW5kIGFzc29jaWF0ZXMgbmFtZXNwYWNlIHByZWZpeGVzIHdpdGggbmFtZXNwYWNlIG5hbWVzOiAqLworc3RydWN0IE5hbWVzcGFjZSBuYW1lc3BhY2VzW10gPQoreworICB7IlNPQVAtRU5WIiwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIn0sCS8qIE1VU1QgYmUgZmlyc3QgKi8KKyAgeyJTT0FQLUVOQyIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyJ9LAkvKiBNVVNUIGJlIHNlY29uZCAqLworICB7InhzaSIsICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hNTFNjaGVtYS1pbnN0YW5jZSIsICJodHRwOi8vd3d3LnczLm9yZy8qL1hNTFNjaGVtYS1pbnN0YW5jZSJ9LAkvKiBNVVNUIGJlIHRoaXJkICovCisgIHsieHNkIiwgImh0dHA6Ly93d3cudzMub3JnLzE5OTkvWE1MU2NoZW1hIiwgImh0dHA6Ly93d3cudzMub3JnLyovWE1MU2NoZW1hIn0sCisgIHsibnMiLCAidXJuOnhtZXRob2RzLWRlbGF5ZWQtcXVvdGVzIn0sCS8qIE1ldGhvZCBuYW1lc3BhY2UgVVJJICovCisgIHtOVUxMLCBOVUxMfQorfTsKKworCmRpZmYgLS1naXQgYS9zYW1wbGVzL3F1b3RlX01BQ19Qcm9qQnVpbGQvcXVvdGUuaCBiL3NhbXBsZXMvcXVvdGVfTUFDX1Byb2pCdWlsZC9xdW90ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZmYzN2YKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3F1b3RlX01BQ19Qcm9qQnVpbGQvcXVvdGUuaApAQCAtMCwwICsxLDkgQEAKKy8vZ3NvYXAgbnMgc2VydmljZSBuYW1lOglxdW90ZQorLy9nc29hcCBucyBzZXJ2aWNlIHN0eWxlOglycGMKKy8vZ3NvYXAgbnMgc2VydmljZSBlbmNvZGluZzoJZW5jb2RlZAorLy9nc29hcCBucyBzZXJ2aWNlIG5hbWVzcGFjZToJdXJuOnhtZXRob2RzLWRlbGF5ZWQtcXVvdGVzCisvL2dzb2FwIG5zIHNlcnZpY2UgbG9jYXRpb246CWh0dHA6Ly9zZXJ2aWNlcy54bWV0aG9kcy5uZXQvc29hcAorCisvL2dzb2FwIG5zIHNlcnZpY2UgbWV0aG9kLWFjdGlvbjogZ2V0UXVvdGUgIiIKKworaW50IG5zX19nZXRRdW90ZShjaGFyICpzeW1ib2wsIGZsb2F0ICpSZXN1bHQpOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL3NvYXBDLmMgYi9zYW1wbGVzL3F1b3RlX01BQ19Qcm9qQnVpbGQvc29hcEMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmNiYzI5Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL3NvYXBDLmMKQEAgLTAsMCArMSwxMjI2IEBACisvKiBzb2FwQy5jCisgICBHZW5lcmF0ZWQgYnkgZ1NPQVAgMi4zIGZyb20gcXVvdGUuaAorICAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgR2VuaXZpYSBpbmMuCisgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKi8KKyNpbmNsdWRlICJzb2FwSC5oIgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitTT0FQX1NPVVJDRV9TVEFNUCgiQCgjKSBzb2FwQy5jIHZlciAyLjMgMjAwMy0wNi0yNCAyMzoyNDoxMiBHTVQiKQorCisKKyNpZm5kZWYgV0lUSF9OT0dMT0JBTAorCitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NlcmlhbGl6ZWhlYWRlcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKwlzb2FwX3NlcmlhbGl6ZV9TT0FQX0VOVl9fSGVhZGVyKHNvYXAsIHNvYXAtPmhlYWRlcik7Cit9CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9wdXRoZWFkZXIoc3RydWN0IHNvYXAgKnNvYXApCit7CisJaWYgKHNvYXAtPmhlYWRlcikKKwl7CXNvYXAtPnBhcnQgPSBTT0FQX0lOX0hFQURFUjsKKwkJc29hcF9vdXRfU09BUF9FTlZfX0hlYWRlcihzb2FwLCAiU09BUC1FTlY6SGVhZGVyIiwgMCwgc29hcC0+aGVhZGVyLCBOVUxMKTsKKwkJc29hcC0+cGFydCA9IFNPQVBfRU5EX0hFQURFUjsKKwl9CisJcmV0dXJuIFNPQVBfT0s7Cit9CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRoZWFkZXIoc3RydWN0IHNvYXAgKnNvYXApCit7CisJc29hcC0+cGFydCA9IFNPQVBfSU5fSEVBREVSOworCXNvYXAtPmhlYWRlciA9IHNvYXBfaW5fU09BUF9FTlZfX0hlYWRlcihzb2FwLCAiU09BUC1FTlY6SGVhZGVyIiwgTlVMTCwgTlVMTCk7CisJc29hcC0+cGFydCA9IFNPQVBfRU5EX0hFQURFUjsKKwlyZXR1cm4gc29hcC0+aGVhZGVyID09IE5VTEw7Cit9CisKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXApCit7CisJaWYgKCFzb2FwLT5mYXVsdCkKKwl7CXNvYXAtPmZhdWx0ID0gKHN0cnVjdCBTT0FQX0VOVl9fRmF1bHQqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3QgU09BUF9FTlZfX0ZhdWx0KSk7CisJCXNvYXBfZGVmYXVsdF9TT0FQX0VOVl9fRmF1bHQoc29hcCwgc29hcC0+ZmF1bHQpOworCX0KKwlpZiAoc29hcC0+dmVyc2lvbiA9PSAyICYmICFzb2FwLT5mYXVsdC0+U09BUF9FTlZfX0NvZGUpCisJewlzb2FwLT5mYXVsdC0+U09BUF9FTlZfX0NvZGUgPSAoc3RydWN0IFNPQVBfRU5WX19Db2RlKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IFNPQVBfRU5WX19Db2RlKSk7CisJCXNvYXBfZGVmYXVsdF9TT0FQX0VOVl9fQ29kZShzb2FwLCBzb2FwLT5mYXVsdC0+U09BUF9FTlZfX0NvZGUpOworCX0KK30KKworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXJpYWxpemVmYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKwlzb2FwX3NlcmlhbGl6ZV9TT0FQX0VOVl9fRmF1bHQoc29hcCwgc29hcC0+ZmF1bHQpOworfQorCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0ZmF1bHQoc3RydWN0IHNvYXAgKnNvYXApCit7CisJcmV0dXJuIHNvYXBfb3V0X1NPQVBfRU5WX19GYXVsdChzb2FwLCAiU09BUC1FTlY6RmF1bHQiLCAwLCBzb2FwLT5mYXVsdCwgTlVMTCk7Cit9CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRmYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKwlyZXR1cm4gKHNvYXAtPmZhdWx0ID0gc29hcF9pbl9TT0FQX0VOVl9fRmF1bHQoc29hcCwgIlNPQVAtRU5WOkZhdWx0IiwgTlVMTCwgTlVMTCkpID09IE5VTEw7Cit9CisKK1NPQVBfRk1BQzEgY29uc3QgY2hhciAqKiBTT0FQX0ZNQUMyIHNvYXBfZmF1bHRjb2RlKHN0cnVjdCBzb2FwICpzb2FwKQoreworCXNvYXBfZmF1bHQoc29hcCk7CisJaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKwkJcmV0dXJuIChjb25zdCBjaGFyKiopJnNvYXAtPmZhdWx0LT5TT0FQX0VOVl9fQ29kZS0+U09BUF9FTlZfX1ZhbHVlOworCXJldHVybiAoY29uc3QgY2hhcioqKSZzb2FwLT5mYXVsdC0+ZmF1bHRjb2RlOworfQorCitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIgKiogU09BUF9GTUFDMiBzb2FwX2ZhdWx0c3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwKQoreworCXNvYXBfZmF1bHQoc29hcCk7CisJaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKwkJcmV0dXJuIChjb25zdCBjaGFyKiopJnNvYXAtPmZhdWx0LT5TT0FQX0VOVl9fUmVhc29uOworCXJldHVybiAoY29uc3QgY2hhcioqKSZzb2FwLT5mYXVsdC0+ZmF1bHRzdHJpbmc7Cit9CisKK1NPQVBfRk1BQzEgY29uc3QgY2hhciAqKiBTT0FQX0ZNQUMyIHNvYXBfZmF1bHRkZXRhaWwoc3RydWN0IHNvYXAgKnNvYXApCit7CisJc29hcF9mYXVsdChzb2FwKTsKKwlpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorCQlyZXR1cm4gKGNvbnN0IGNoYXIqKikmc29hcC0+ZmF1bHQtPlNPQVBfRU5WX19EZXRhaWw7CisJcmV0dXJuIChjb25zdCBjaGFyKiopJnNvYXAtPmZhdWx0LT5kZXRhaWw7Cit9CisKKyNlbmRpZgorCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZ2V0aW5kZXBlbmRlbnQoc3RydWN0IHNvYXAgKnNvYXApCit7CisJaW50IHQ7CisJZm9yICg7OykKKwkJaWYgKCFzb2FwX2dldGVsZW1lbnQoc29hcCwgJnQpKQorCQkJaWYgKHNvYXAtPmVycm9yIHx8IHNvYXBfaWdub3JlX2VsZW1lbnQoc29hcCkpCisJCQkJYnJlYWs7CisJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfTk9fVEFHIHx8IHNvYXAtPmVycm9yID09IFNPQVBfRU9GKQorCQlzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisJcmV0dXJuIHNvYXAtPmVycm9yOworfQorCitTT0FQX0ZNQUMxIHZvaWQgKiBTT0FQX0ZNQUMyIHNvYXBfZ2V0ZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50ICp0eXBlKQoreworCWlmIChzb2FwX3BlZWtfZWxlbWVudChzb2FwKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCEqc29hcC0+aWQgfHwgISgqdHlwZSA9IHNvYXBfbG9va3VwX3R5cGUoc29hcCwgc29hcC0+aWQpKSkKKwkJKnR5cGUgPSBzb2FwX2xvb2t1cF90eXBlKHNvYXAsIHNvYXAtPmhyZWYpOworCXN3aXRjaCAoKnR5cGUpCisJeworCWNhc2UgU09BUF9UWVBFX2J5dGU6CisJCXJldHVybiBzb2FwX2luX2J5dGUoc29hcCwgTlVMTCwgTlVMTCwgInhzZDpieXRlIik7CisJY2FzZSBTT0FQX1RZUEVfaW50OgorCQlyZXR1cm4gc29hcF9pbl9pbnQoc29hcCwgTlVMTCwgTlVMTCwgInhzZDppbnQiKTsKKwljYXNlIFNPQVBfVFlQRV9mbG9hdDoKKwkJcmV0dXJuIHNvYXBfaW5fZmxvYXQoc29hcCwgTlVMTCwgTlVMTCwgInhzZDpmbG9hdCIpOworCWNhc2UgU09BUF9UWVBFX25zX19nZXRRdW90ZToKKwkJcmV0dXJuIHNvYXBfaW5fbnNfX2dldFF1b3RlKHNvYXAsIE5VTEwsIE5VTEwsICJuczpnZXRRdW90ZSIpOworCWNhc2UgU09BUF9UWVBFX25zX19nZXRRdW90ZVJlc3BvbnNlOgorCQlyZXR1cm4gc29hcF9pbl9uc19fZ2V0UXVvdGVSZXNwb25zZShzb2FwLCBOVUxMLCBOVUxMLCAibnM6Z2V0UXVvdGVSZXNwb25zZSIpOworCWNhc2UgU09BUF9UWVBFX1BvaW50ZXJUb2Zsb2F0OgorCQlyZXR1cm4gc29hcF9pbl9Qb2ludGVyVG9mbG9hdChzb2FwLCBOVUxMLCBOVUxMLCAieHNkOmZsb2F0Iik7CisJY2FzZSBTT0FQX1RZUEVfX1FOYW1lOgorCXsJY2hhciAqKnM7CisJCXMgPSBzb2FwX2luX19RTmFtZShzb2FwLCBOVUxMLCBOVUxMLCAiUU5hbWUiKTsKKwkJcmV0dXJuIHMgPyAqcyA6IE5VTEw7CisJfQorCWNhc2UgU09BUF9UWVBFX3N0cmluZzoKKwl7CWNoYXIgKipzOworCQlzID0gc29hcF9pbl9zdHJpbmcoc29hcCwgTlVMTCwgTlVMTCwgInhzZDpzdHJpbmciKTsKKwkJcmV0dXJuIHMgPyAqcyA6IE5VTEw7CisJfQorCWRlZmF1bHQ6CisJCWlmICghKnNvYXAtPnR5cGUpCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAieHNkOmJ5dGUiKSkKKwkJewkqdHlwZSA9IFNPQVBfVFlQRV9ieXRlOworCQkJcmV0dXJuIHNvYXBfaW5fYnl0ZShzb2FwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwkJfQorCQlpZiAoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICJ4c2Q6aW50IikpCisJCXsJKnR5cGUgPSBTT0FQX1RZUEVfaW50OworCQkJcmV0dXJuIHNvYXBfaW5faW50KHNvYXAsIE5VTEwsIE5VTEwsIE5VTEwpOworCQl9CisJCWlmICghc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgInhzZDpmbG9hdCIpKQorCQl7CSp0eXBlID0gU09BUF9UWVBFX2Zsb2F0OworCQkJcmV0dXJuIHNvYXBfaW5fZmxvYXQoc29hcCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJCX0KKwkJaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAibnM6Z2V0UXVvdGUiKSkKKwkJewkqdHlwZSA9IFNPQVBfVFlQRV9uc19fZ2V0UXVvdGU7CisJCQlyZXR1cm4gc29hcF9pbl9uc19fZ2V0UXVvdGUoc29hcCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJCX0KKwkJaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAibnM6Z2V0UXVvdGVSZXNwb25zZSIpKQorCQl7CSp0eXBlID0gU09BUF9UWVBFX25zX19nZXRRdW90ZVJlc3BvbnNlOworCQkJcmV0dXJuIHNvYXBfaW5fbnNfX2dldFF1b3RlUmVzcG9uc2Uoc29hcCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJCX0KKwkJaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiUU5hbWUiKSkKKwkJewljaGFyICoqczsKKwkJCSp0eXBlID0gU09BUF9UWVBFX19RTmFtZTsKKwkJCXMgPSBzb2FwX2luX19RTmFtZShzb2FwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwkJCXJldHVybiBzID8gKnMgOiBOVUxMOworCQl9CisJCWlmICghc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgInhzZDpzdHJpbmciKSkKKwkJewljaGFyICoqczsKKwkJCSp0eXBlID0gU09BUF9UWVBFX3N0cmluZzsKKwkJCXMgPSBzb2FwX2luX3N0cmluZyhzb2FwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwkJCXJldHVybiBzID8gKnMgOiBOVUxMOworCQl9CisJcmV0dXJuIE5VTEw7CisJfQorfQorCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfaWdub3JlX2VsZW1lbnQoc3RydWN0IHNvYXAgKnNvYXApCit7CWlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKQorCQlyZXR1cm4gU09BUF9UQUdfTUlTTUFUQ0g7CisJaWYgKCFzb2FwX3BlZWtfZWxlbWVudChzb2FwKSkKKwl7CWludCB0OworCQlpZiAoc29hcC0+bXVzdFVuZGVyc3RhbmQgJiYgIXNvYXAtPm90aGVyKQorCQkJcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9NVVNUVU5ERVJTVEFORDsKKwkJaWYgKCEqc29hcC0+aWQgfHwgIXNvYXBfZ2V0ZWxlbWVudChzb2FwLCAmdCkpCisJCXsJc29hcC0+cGVla2VkID0gMDsKKwkJCURCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVW5rbm93biBlbGVtZW50ICclcycgKGxldmVsPSV1LCAlZClcbiIsIHNvYXAtPnRhZywgc29hcC0+bGV2ZWwsIHNvYXAtPmJvZHkpKTsKKwkJCWlmIChzb2FwLT5maWdub3JlKQorCQkJCXNvYXAtPmVycm9yID0gc29hcC0+Zmlnbm9yZShzb2FwLCBzb2FwLT50YWcpOwkJCWVsc2UKKwkJCQlzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisJCQlEQkdMT0coVEVTVCwgaWYgKCFzb2FwLT5lcnJvcikgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIklHTk9SSU5HIGVsZW1lbnQgJyVzJ1xuIiwgc29hcC0+dGFnKSk7CisJCQlpZiAoIXNvYXAtPmVycm9yICYmIHNvYXAtPmJvZHkpCisJCQl7CXNvYXAtPmxldmVsKys7CisJCQkJd2hpbGUgKCFzb2FwX2lnbm9yZV9lbGVtZW50KHNvYXApKQorCQkJCQk7CisJCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfTk9fVEFHKQorCQkJCQlzb2FwLT5lcnJvciA9IHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgTlVMTCk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHNvYXAtPmVycm9yO30KKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3B1dGluZGVwZW5kZW50KHN0cnVjdCBzb2FwICpzb2FwKQoreworCWludCBpOworCXN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKwlpZiAoc29hcC0+dmVyc2lvbiA9PSAxICYmICEoc29hcC0+bW9kZSAmIChTT0FQX1hNTF9UUkVFIHwgU09BUF9YTUxfR1JBUEgpKSkKKwkJZm9yIChpID0gMDsgaSA8IFNPQVBfUFRSSEFTSDsgaSsrKQorCQkJZm9yIChwcCA9IHNvYXAtPnBodFtpXTsgcHA7IHBwID0gcHAtPm5leHQpCisJCQkJaWYgKChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpID8gcHAtPm1hcmsxID09IDIgOiBwcC0+bWFyazIgPT0gMikKKwkJCQkJaWYgKHNvYXBfcHV0ZWxlbWVudChzb2FwLCBwcC0+cHRyLCAiaWQiLCBwcC0+aWQsIHBwLT50eXBlKSkKKwkJCQkJCXJldHVybiBzb2FwLT5lcnJvcjsKKwlyZXR1cm4gU09BUF9PSzsKK30KKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3B1dGVsZW1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnB0ciwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGludCB0eXBlKQoreworCXN3aXRjaCAodHlwZSkKKwl7CisJY2FzZSBTT0FQX1RZUEVfYnl0ZToKKwkJcmV0dXJuIHNvYXBfb3V0X2J5dGUoc29hcCwgdGFnLCBpZCwgKGNvbnN0IGNoYXIgKilwdHIsICJ4c2Q6Ynl0ZSIpOworCWNhc2UgU09BUF9UWVBFX2ludDoKKwkJcmV0dXJuIHNvYXBfb3V0X2ludChzb2FwLCB0YWcsIGlkLCAoY29uc3QgaW50ICopcHRyLCAieHNkOmludCIpOworCWNhc2UgU09BUF9UWVBFX2Zsb2F0OgorCQlyZXR1cm4gc29hcF9vdXRfZmxvYXQoc29hcCwgdGFnLCBpZCwgKGNvbnN0IGZsb2F0ICopcHRyLCAieHNkOmZsb2F0Iik7CisJY2FzZSBTT0FQX1RZUEVfbnNfX2dldFF1b3RlOgorCQlyZXR1cm4gc29hcF9vdXRfbnNfX2dldFF1b3RlKHNvYXAsIHRhZywgaWQsIChjb25zdCBzdHJ1Y3QgbnNfX2dldFF1b3RlICopcHRyLCAibnM6Z2V0UXVvdGUiKTsKKwljYXNlIFNPQVBfVFlQRV9uc19fZ2V0UXVvdGVSZXNwb25zZToKKwkJcmV0dXJuIHNvYXBfb3V0X25zX19nZXRRdW90ZVJlc3BvbnNlKHNvYXAsIHRhZywgaWQsIChjb25zdCBzdHJ1Y3QgbnNfX2dldFF1b3RlUmVzcG9uc2UgKilwdHIsICJuczpnZXRRdW90ZVJlc3BvbnNlIik7CisJY2FzZSBTT0FQX1RZUEVfUG9pbnRlclRvZmxvYXQ6CisJCXJldHVybiBzb2FwX291dF9Qb2ludGVyVG9mbG9hdChzb2FwLCB0YWcsIGlkLCAoZmxvYXQgKmNvbnN0KilwdHIsICJ4c2Q6ZmxvYXQiKTsKKwljYXNlIFNPQVBfVFlQRV9fUU5hbWU6CisJCXJldHVybiBzb2FwX291dF9zdHJpbmcoc29hcCwgdGFnLCBpZCwgKGNoYXIqKikmcHRyLCAiUU5hbWUiKTsKKwljYXNlIFNPQVBfVFlQRV9zdHJpbmc6CisJCXJldHVybiBzb2FwX291dF9zdHJpbmcoc29hcCwgdGFnLCBpZCwgKGNoYXIqKikmcHRyLCAieHNkOnN0cmluZyIpOworCX0KKwlyZXR1cm4gU09BUF9PSzsKK30KKworI2lmbmRlZiBXSVRIX0xFQU5FUgorU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2dldGF0dGFjaG1lbnRzKHN0cnVjdCBzb2FwICpzb2FwKQoreworCWlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSkKKwkJcmV0dXJuIFNPQVBfT0s7CisJd2hpbGUgKHNvYXAtPmRpbWVfZmxhZ3MgJiBTT0FQX0RJTUVfQ0YpCisJewlpZiAoc29hcF9nZXRkaW1laGRyKHNvYXApKQorCQkJcmV0dXJuIHNvYXAtPmVycm9yOworCQlpZiAoc29hcF9tb3ZlKHNvYXAsIHNvYXAtPmRpbWVfc2l6ZSkpCisJCQlyZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKwl9CisJaWYgKHNvYXBfbW92ZShzb2FwLCAoKHNvYXAtPmRpbWVfc2l6ZSszKSYofjMpKS1zb2FwX3RlbGwoc29hcCkpKQorCQlyZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKwlmb3IgKDs7KQorCXsJaWYgKHNvYXBfZ2V0ZGltZShzb2FwKSB8fCAhc29hcC0+ZGltZV9pZCkKKwkJCWJyZWFrOworCQlzd2l0Y2ggKHNvYXBfbG9va3VwX3R5cGUoc29hcCwgc29hcC0+ZGltZV9pZCkpCisJCXsKKwkJY2FzZSBTT0FQX1RZUEVfX1FOYW1lOgorCQl7CWNoYXIgKiogYTsKKwkJCWEgPSAoY2hhciAqKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmRpbWVfaWQsIE5VTEwsIFNPQVBfVFlQRV9fUU5hbWUsIHNpemVvZihjaGFyICopLCAwKTsKKwkJCWlmIChhKQorCQkJCSphID0gc29hcC0+ZGltZV9wdHI7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNPQVBfVFlQRV9zdHJpbmc6CisJCXsJY2hhciAqKiBhOworCQkJYSA9IChjaGFyICoqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+ZGltZV9pZCwgTlVMTCwgU09BUF9UWVBFX3N0cmluZywgc2l6ZW9mKGNoYXIgKiksIDApOworCQkJaWYgKGEpCisJCQkJKmEgPSBzb2FwLT5kaW1lX3B0cjsKKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6CisJCQlzb2FwLT5lcnJvciA9IFNPQVBfRElNRV9FUlJPUjsKKwkJfQorCQlpZiAoc29hcC0+ZXJyb3IpCisJCQlicmVhazsKKwl9CisJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfRU9EKQorCQlzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisJcmV0dXJuIHNvYXAtPmVycm9yOworfQorCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0YXR0YWNobWVudHMoc3RydWN0IHNvYXAgKnNvYXApCit7CisJaW50IGk7CisJc3RydWN0IHNvYXBfcGxpc3QgKnBwOworCWlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSkKKwkJcmV0dXJuIFNPQVBfT0s7CisJZm9yIChpID0gMDsgaSA8IFNPQVBfUFRSSEFTSDsgaSsrKQorCQlmb3IgKHBwID0gc29hcC0+cGh0W2ldOyBwcDsgcHAgPSBwcC0+bmV4dCkKKwkJCWlmIChwcC0+bWFyazIgPT0gMykKKwkJCQlzd2l0Y2ggKHBwLT50eXBlKQorCQkJCXsKKwkJCQl9CisJCQorCXJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfZGVmYXVsdF9ieXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICphKQoreworI2lmZGVmIFNPQVBfREVGQVVMVF9ieXRlCisJKmEgPSBTT0FQX0RFRkFVTFRfYnl0ZTsKKyNlbHNlCisJKmEgPSAoY2hhcikwOworI2VuZGlmCit9CisKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfc2VyaWFsaXplX2J5dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgY29uc3QqYSkKK3sKKwlzb2FwX3JlZmVyZW5jZShzb2FwLCBhLCBTT0FQX1RZUEVfYnl0ZSk7Cit9CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9wdXRfYnl0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqYSwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWludCBpID0gc29hcF9lbWJlZF9lbGVtZW50KHNvYXAsICh2b2lkKilhLCB0YWcsIFNPQVBfVFlQRV9ieXRlKTsKKwlpZiAoaSA+PSAwKQorCQlzb2FwX291dF9ieXRlKHNvYXAsIHRhZywgaSwgYSwgdHlwZSk7CisJcmV0dXJuIHNvYXBfcHV0aW5kZXBlbmRlbnQoc29hcCk7Cit9CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRfYnl0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmV0dXJuIHNvYXBfb3V0Ynl0ZShzb2FwLCB0YWcsIGlkLCBhLCB0eXBlLCBTT0FQX1RZUEVfYnl0ZSk7Cit9CisKK1NPQVBfRk1BQzEgY2hhciAqIFNPQVBfRk1BQzIgc29hcF9nZXRfYnl0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqcCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmICgocCA9IHNvYXBfaW5fYnl0ZShzb2FwLCB0YWcsIHAsIHR5cGUpKSkKKwkJc29hcF9nZXRpbmRlcGVuZGVudChzb2FwKTsKKwlyZXR1cm4gcDsKK30KKworU09BUF9GTUFDMSBjaGFyICogU09BUF9GTUFDMiBzb2FwX2luX2J5dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgY2hhciAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZXR1cm4gc29hcF9pbmJ5dGUoc29hcCwgdGFnLCBhLCB0eXBlLCBTT0FQX1RZUEVfYnl0ZSk7Cit9CisKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfZGVmYXVsdF9pbnQoc3RydWN0IHNvYXAgKnNvYXAsIGludCAqYSkKK3sKKyNpZmRlZiBTT0FQX0RFRkFVTFRfaW50CisJKmEgPSBTT0FQX0RFRkFVTFRfaW50OworI2Vsc2UKKwkqYSA9IChpbnQpMDsKKyNlbmRpZgorfQorCitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NlcmlhbGl6ZV9pbnQoc3RydWN0IHNvYXAgKnNvYXAsIGludCBjb25zdCphKQoreworCXNvYXBfcmVmZXJlbmNlKHNvYXAsIGEsIFNPQVBfVFlQRV9pbnQpOworfQorCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0X2ludChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50ICphLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaW50IGkgPSBzb2FwX2VtYmVkX2VsZW1lbnQoc29hcCwgKHZvaWQqKWEsIHRhZywgU09BUF9UWVBFX2ludCk7CisJaWYgKGkgPj0gMCkKKwkJc29hcF9vdXRfaW50KHNvYXAsIHRhZywgaSwgYSwgdHlwZSk7CisJcmV0dXJuIHNvYXBfcHV0aW5kZXBlbmRlbnQoc29hcCk7Cit9CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRfaW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgaW50ICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXJldHVybiBzb2FwX291dGludChzb2FwLCB0YWcsIGlkLCBhLCB0eXBlLCBTT0FQX1RZUEVfaW50KTsKK30KKworU09BUF9GTUFDMSBpbnQgKiBTT0FQX0ZNQUMyIHNvYXBfZ2V0X2ludChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50ICpwLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKChwID0gc29hcF9pbl9pbnQoc29hcCwgdGFnLCBwLCB0eXBlKSkpCisJCXNvYXBfZ2V0aW5kZXBlbmRlbnQoc29hcCk7CisJcmV0dXJuIHA7Cit9CisKK1NPQVBfRk1BQzEgaW50ICogU09BUF9GTUFDMiBzb2FwX2luX2ludChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmV0dXJuIHNvYXBfaW5pbnQoc29hcCwgdGFnLCBhLCB0eXBlLCBTT0FQX1RZUEVfaW50KTsKK30KKworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9kZWZhdWx0X2Zsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBmbG9hdCAqYSkKK3sKKyNpZmRlZiBTT0FQX0RFRkFVTFRfZmxvYXQKKwkqYSA9IFNPQVBfREVGQVVMVF9mbG9hdDsKKyNlbHNlCisJKmEgPSAoZmxvYXQpMDsKKyNlbmRpZgorfQorCitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NlcmlhbGl6ZV9mbG9hdChzdHJ1Y3Qgc29hcCAqc29hcCwgZmxvYXQgY29uc3QqYSkKK3sKKwlzb2FwX3JlZmVyZW5jZShzb2FwLCBhLCBTT0FQX1RZUEVfZmxvYXQpOworfQorCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0X2Zsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBmbG9hdCAqYSwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWludCBpID0gc29hcF9lbWJlZF9lbGVtZW50KHNvYXAsICh2b2lkKilhLCB0YWcsIFNPQVBfVFlQRV9mbG9hdCk7CisJaWYgKGkgPj0gMCkKKwkJc29hcF9vdXRfZmxvYXQoc29hcCwgdGFnLCBpLCBhLCB0eXBlKTsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dF9mbG9hdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGZsb2F0ICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXJldHVybiBzb2FwX291dGZsb2F0KHNvYXAsIHRhZywgaWQsIGEsIHR5cGUsIFNPQVBfVFlQRV9mbG9hdCk7Cit9CisKK1NPQVBfRk1BQzEgZmxvYXQgKiBTT0FQX0ZNQUMyIHNvYXBfZ2V0X2Zsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBmbG9hdCAqcCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmICgocCA9IHNvYXBfaW5fZmxvYXQoc29hcCwgdGFnLCBwLCB0eXBlKSkpCisJCXNvYXBfZ2V0aW5kZXBlbmRlbnQoc29hcCk7CisJcmV0dXJuIHA7Cit9CisKK1NPQVBfRk1BQzEgZmxvYXQgKiBTT0FQX0ZNQUMyIHNvYXBfaW5fZmxvYXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgZmxvYXQgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmV0dXJuIHNvYXBfaW5mbG9hdChzb2FwLCB0YWcsIGEsIHR5cGUsIFNPQVBfVFlQRV9mbG9hdCk7Cit9CisKKyNpZm5kZWYgV0lUSF9OT0dMT0JBTAorCitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NlcmlhbGl6ZV9TT0FQX0VOVl9fRmF1bHQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBTT0FQX0VOVl9fRmF1bHQgY29uc3QqYSkKK3sKKwlpZiAoIXNvYXBfcmVmZXJlbmNlKHNvYXAsIGEsIFNPQVBfVFlQRV9TT0FQX0VOVl9fRmF1bHQpKQorCQlzb2FwX21hcmtfU09BUF9FTlZfX0ZhdWx0KHNvYXAsIGEpOworfQorCitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX21hcmtfU09BUF9FTlZfX0ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3QgU09BUF9FTlZfX0ZhdWx0ICphKQoreworCXNvYXBfZW1iZWRkZWQoc29hcCwgJmEtPmZhdWx0Y29kZSwgU09BUF9UWVBFX19RTmFtZSk7CisJc29hcF9tYXJrX19RTmFtZShzb2FwLCAmYS0+ZmF1bHRjb2RlKTsKKwlzb2FwX2VtYmVkZGVkKHNvYXAsICZhLT5mYXVsdHN0cmluZywgU09BUF9UWVBFX3N0cmluZyk7CisJc29hcF9tYXJrX3N0cmluZyhzb2FwLCAmYS0+ZmF1bHRzdHJpbmcpOworCXNvYXBfZW1iZWRkZWQoc29hcCwgJmEtPmZhdWx0YWN0b3IsIFNPQVBfVFlQRV9zdHJpbmcpOworCXNvYXBfbWFya19zdHJpbmcoc29hcCwgJmEtPmZhdWx0YWN0b3IpOworCXNvYXBfZW1iZWRkZWQoc29hcCwgJmEtPmRldGFpbCwgU09BUF9UWVBFX3N0cmluZyk7CisJc29hcF9tYXJrX3N0cmluZyhzb2FwLCAmYS0+ZGV0YWlsKTsKKwlzb2FwX2VtYmVkZGVkKHNvYXAsICZhLT5TT0FQX0VOVl9fQ29kZSwgU09BUF9UWVBFX1BvaW50ZXJUb1NPQVBfRU5WX19Db2RlKTsKKwlzb2FwX21hcmtfUG9pbnRlclRvU09BUF9FTlZfX0NvZGUoc29hcCwgJmEtPlNPQVBfRU5WX19Db2RlKTsKKwlzb2FwX2VtYmVkZGVkKHNvYXAsICZhLT5TT0FQX0VOVl9fUmVhc29uLCBTT0FQX1RZUEVfc3RyaW5nKTsKKwlzb2FwX21hcmtfc3RyaW5nKHNvYXAsICZhLT5TT0FQX0VOVl9fUmVhc29uKTsKKwlzb2FwX2VtYmVkZGVkKHNvYXAsICZhLT5TT0FQX0VOVl9fRGV0YWlsLCBTT0FQX1RZUEVfc3RyaW5nKTsKKwlzb2FwX21hcmtfc3RyaW5nKHNvYXAsICZhLT5TT0FQX0VOVl9fRGV0YWlsKTsKK30KKworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9kZWZhdWx0X1NPQVBfRU5WX19GYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IFNPQVBfRU5WX19GYXVsdCAqYSkKK3sKKwlzb2FwX2RlZmF1bHRfX1FOYW1lKHNvYXAsICZhLT5mYXVsdGNvZGUpOworCXNvYXBfZGVmYXVsdF9zdHJpbmcoc29hcCwgJmEtPmZhdWx0c3RyaW5nKTsKKwlzb2FwX2RlZmF1bHRfc3RyaW5nKHNvYXAsICZhLT5mYXVsdGFjdG9yKTsKKwlzb2FwX2RlZmF1bHRfc3RyaW5nKHNvYXAsICZhLT5kZXRhaWwpOworCXNvYXBfZGVmYXVsdF9Qb2ludGVyVG9TT0FQX0VOVl9fQ29kZShzb2FwLCAmYS0+U09BUF9FTlZfX0NvZGUpOworCXNvYXBfZGVmYXVsdF9zdHJpbmcoc29hcCwgJmEtPlNPQVBfRU5WX19SZWFzb24pOworCXNvYXBfZGVmYXVsdF9zdHJpbmcoc29hcCwgJmEtPlNPQVBfRU5WX19EZXRhaWwpOworfQorCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0X1NPQVBfRU5WX19GYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IFNPQVBfRU5WX19GYXVsdCAqYSwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWludCBpID0gc29hcF9lbWJlZF9lbGVtZW50KHNvYXAsICh2b2lkKilhLCB0YWcsIFNPQVBfVFlQRV9TT0FQX0VOVl9fRmF1bHQpOworCWlmIChpID49IDApCisJCXNvYXBfb3V0X1NPQVBfRU5WX19GYXVsdChzb2FwLCB0YWcsIGksIGEsIHR5cGUpOworCXJldHVybiBzb2FwX3B1dGluZGVwZW5kZW50KHNvYXApOworfQorCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0X1NPQVBfRU5WX19GYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHN0cnVjdCBTT0FQX0VOVl9fRmF1bHQgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIGEsIFNPQVBfVFlQRV9TT0FQX0VOVl9fRmF1bHQpLCB0eXBlKTsKKwlzb2FwX291dF9fUU5hbWUoc29hcCwgImZhdWx0Y29kZSIsIC0xLCAmYS0+ZmF1bHRjb2RlLCAiIik7CisJc29hcF9vdXRfc3RyaW5nKHNvYXAsICJmYXVsdHN0cmluZyIsIC0xLCAmYS0+ZmF1bHRzdHJpbmcsICIiKTsKKwlzb2FwX291dF9zdHJpbmcoc29hcCwgImZhdWx0YWN0b3IiLCAtMSwgJmEtPmZhdWx0YWN0b3IsICIiKTsKKwlzb2FwX291dF9zdHJpbmcoc29hcCwgImRldGFpbCIsIC0xLCAmYS0+ZGV0YWlsLCAiIik7CisJc29hcF9vdXRfUG9pbnRlclRvU09BUF9FTlZfX0NvZGUoc29hcCwgIlNPQVAtRU5WOkNvZGUiLCAtMSwgJmEtPlNPQVBfRU5WX19Db2RlLCAiIik7CisJc29hcF9vdXRfc3RyaW5nKHNvYXAsICJTT0FQLUVOVjpSZWFzb24iLCAtMSwgJmEtPlNPQVBfRU5WX19SZWFzb24sICIiKTsKKwlzb2FwX291dF9zdHJpbmcoc29hcCwgIlNPQVAtRU5WOkRldGFpbCIsIC0xLCAmYS0+U09BUF9FTlZfX0RldGFpbCwgIiIpOworCXNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7CisJcmV0dXJuIFNPQVBfT0s7Cit9CisKK1NPQVBfRk1BQzEgc3RydWN0IFNPQVBfRU5WX19GYXVsdCAqIFNPQVBfRk1BQzIgc29hcF9nZXRfU09BUF9FTlZfX0ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgU09BUF9FTlZfX0ZhdWx0ICpwLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKChwID0gc29hcF9pbl9TT0FQX0VOVl9fRmF1bHQoc29hcCwgdGFnLCBwLCB0eXBlKSkpCisJCXNvYXBfZ2V0aW5kZXBlbmRlbnQoc29hcCk7CisJcmV0dXJuIHA7Cit9CisKK1NPQVBfRk1BQzEgc3RydWN0IFNPQVBfRU5WX19GYXVsdCAqIFNPQVBfRk1BQzIgc29hcF9pbl9TT0FQX0VOVl9fRmF1bHQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc3RydWN0IFNPQVBfRU5WX19GYXVsdCAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlzaG9ydCBzb2FwX2ZsYWdfZmF1bHRjb2RlID0gMSwgc29hcF9mbGFnX2ZhdWx0c3RyaW5nID0gMSwgc29hcF9mbGFnX2ZhdWx0YWN0b3IgPSAxLCBzb2FwX2ZsYWdfZGV0YWlsID0gMSwgc29hcF9mbGFnX1NPQVBfRU5WX19Db2RlID0gMSwgc29hcF9mbGFnX1NPQVBfRU5WX19SZWFzb24gPSAxLCBzb2FwX2ZsYWdfU09BUF9FTlZfX0RldGFpbCA9IDE7CisJaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcpKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoKnNvYXAtPnR5cGUgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkpCisJewlzb2FwLT5lcnJvciA9IFNPQVBfVFlQRV9NSVNNQVRDSDsKKwkJc29hcF9yZXZlcnQoc29hcCk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoc29hcC0+bnVsbCkKKwl7CWlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfTklMKQorCQl7CXNvYXAtPmVycm9yID0gU09BUF9OVUxMOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJZWxzZQorCQkJcmV0dXJuIGE7CisJfQorCWlmICghKnNvYXAtPmhyZWYpCisJewlhID0gKHN0cnVjdCBTT0FQX0VOVl9fRmF1bHQgKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBhLCBTT0FQX1RZUEVfU09BUF9FTlZfX0ZhdWx0LCBzaXplb2Yoc3RydWN0IFNPQVBfRU5WX19GYXVsdCksIDApOworCQlpZiAoIWEpCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKHNvYXAtPmFsbG9jZWQpCisJCQlzb2FwX2RlZmF1bHRfU09BUF9FTlZfX0ZhdWx0KHNvYXAsIGEpOworCQlpZiAoc29hcC0+Ym9keSkKKwkJewlmb3IgKDs7KQorCQkJewlzb2FwLT5lcnJvciA9IFNPQVBfVEFHX01JU01BVENIOworCQkJaWYgKHNvYXBfZmxhZ19mYXVsdGNvZGUgJiYgc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJaWYgKHNvYXBfaW5fX1FOYW1lKHNvYXAsICJmYXVsdGNvZGUiLCAmYS0+ZmF1bHRjb2RlLCAiIikpCisJCQkJewlzb2FwX2ZsYWdfZmF1bHRjb2RlID0gMDsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXBfZmxhZ19mYXVsdHN0cmluZyAmJiBzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlpZiAoc29hcF9pbl9zdHJpbmcoc29hcCwgImZhdWx0c3RyaW5nIiwgJmEtPmZhdWx0c3RyaW5nLCAiIikpCisJCQkJewlzb2FwX2ZsYWdfZmF1bHRzdHJpbmcgPSAwOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQlpZiAoc29hcF9mbGFnX2ZhdWx0YWN0b3IgJiYgc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJaWYgKHNvYXBfaW5fc3RyaW5nKHNvYXAsICJmYXVsdGFjdG9yIiwgJmEtPmZhdWx0YWN0b3IsICIiKSkKKwkJCQl7CXNvYXBfZmxhZ19mYXVsdGFjdG9yID0gMDsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXBfZmxhZ19kZXRhaWwgJiYgc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJaWYgKHNvYXBfaW5fc3RyaW5nKHNvYXAsICJkZXRhaWwiLCAmYS0+ZGV0YWlsLCAiIikpCisJCQkJewlzb2FwX2ZsYWdfZGV0YWlsID0gMDsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXBfZmxhZ19TT0FQX0VOVl9fQ29kZSAmJiBzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlpZiAoc29hcF9pbl9Qb2ludGVyVG9TT0FQX0VOVl9fQ29kZShzb2FwLCAiU09BUC1FTlY6Q29kZSIsICZhLT5TT0FQX0VOVl9fQ29kZSwgIiIpKQorCQkJCXsJc29hcF9mbGFnX1NPQVBfRU5WX19Db2RlID0gMDsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXBfZmxhZ19TT0FQX0VOVl9fUmVhc29uICYmIHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCWlmIChzb2FwX2luX3N0cmluZyhzb2FwLCAiU09BUC1FTlY6UmVhc29uIiwgJmEtPlNPQVBfRU5WX19SZWFzb24sICIiKSkKKwkJCQl7CXNvYXBfZmxhZ19TT0FQX0VOVl9fUmVhc29uID0gMDsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXBfZmxhZ19TT0FQX0VOVl9fRGV0YWlsICYmIHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCWlmIChzb2FwX2luX3N0cmluZyhzb2FwLCAiU09BUC1FTlY6RGV0YWlsIiwgJmEtPlNPQVBfRU5WX19EZXRhaWwsICIiKSkKKwkJCQl7CXNvYXBfZmxhZ19TT0FQX0VOVl9fRGV0YWlsID0gMDsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCXNvYXAtPmVycm9yID0gc29hcF9pZ25vcmVfZWxlbWVudChzb2FwKTsKKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykKKwkJCQlicmVhazsKKwkJCWlmIChzb2FwLT5lcnJvcikKKwkJCXsJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKwkJaWYgKHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCWVsc2UKKwl7CWEgPSAoc3RydWN0IFNPQVBfRU5WX19GYXVsdCAqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCAodm9pZCoqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIGEsIFNPQVBfVFlQRV9TT0FQX0VOVl9fRmF1bHQsIHNpemVvZihzdHJ1Y3QgU09BUF9FTlZfX0ZhdWx0KSwgMCksIFNPQVBfVFlQRV9TT0FQX0VOVl9fRmF1bHQsIHNpemVvZihzdHJ1Y3QgU09BUF9FTlZfX0ZhdWx0KSk7CisJCWlmIChzb2FwLT5hbGxvY2VkKQorCQkJc29hcF9kZWZhdWx0X1NPQVBfRU5WX19GYXVsdChzb2FwLCBhKTsKKwkJaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBhOworfQorCisjZW5kaWYKKworI2lmbmRlZiBXSVRIX05PR0xPQkFMCisKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfc2VyaWFsaXplX1NPQVBfRU5WX19Db2RlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgU09BUF9FTlZfX0NvZGUgY29uc3QqYSkKK3sKKwlpZiAoIXNvYXBfcmVmZXJlbmNlKHNvYXAsIGEsIFNPQVBfVFlQRV9TT0FQX0VOVl9fQ29kZSkpCisJCXNvYXBfbWFya19TT0FQX0VOVl9fQ29kZShzb2FwLCBhKTsKK30KKworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9tYXJrX1NPQVBfRU5WX19Db2RlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3QgU09BUF9FTlZfX0NvZGUgKmEpCit7CisJc29hcF9lbWJlZGRlZChzb2FwLCAmYS0+U09BUF9FTlZfX1ZhbHVlLCBTT0FQX1RZUEVfX1FOYW1lKTsKKwlzb2FwX21hcmtfX1FOYW1lKHNvYXAsICZhLT5TT0FQX0VOVl9fVmFsdWUpOworCXNvYXBfZW1iZWRkZWQoc29hcCwgJmEtPlNPQVBfRU5WX19Ob2RlLCBTT0FQX1RZUEVfc3RyaW5nKTsKKwlzb2FwX21hcmtfc3RyaW5nKHNvYXAsICZhLT5TT0FQX0VOVl9fTm9kZSk7CisJc29hcF9lbWJlZGRlZChzb2FwLCAmYS0+U09BUF9FTlZfX1JvbGUsIFNPQVBfVFlQRV9zdHJpbmcpOworCXNvYXBfbWFya19zdHJpbmcoc29hcCwgJmEtPlNPQVBfRU5WX19Sb2xlKTsKK30KKworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9kZWZhdWx0X1NPQVBfRU5WX19Db2RlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgU09BUF9FTlZfX0NvZGUgKmEpCit7CisJc29hcF9kZWZhdWx0X19RTmFtZShzb2FwLCAmYS0+U09BUF9FTlZfX1ZhbHVlKTsKKwlzb2FwX2RlZmF1bHRfc3RyaW5nKHNvYXAsICZhLT5TT0FQX0VOVl9fTm9kZSk7CisJc29hcF9kZWZhdWx0X3N0cmluZyhzb2FwLCAmYS0+U09BUF9FTlZfX1JvbGUpOworfQorCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0X1NPQVBfRU5WX19Db2RlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgU09BUF9FTlZfX0NvZGUgKmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpbnQgaSA9IHNvYXBfZW1iZWRfZWxlbWVudChzb2FwLCAodm9pZCopYSwgdGFnLCBTT0FQX1RZUEVfU09BUF9FTlZfX0NvZGUpOworCWlmIChpID49IDApCisJCXNvYXBfb3V0X1NPQVBfRU5WX19Db2RlKHNvYXAsIHRhZywgaSwgYSwgdHlwZSk7CisJcmV0dXJuIHNvYXBfcHV0aW5kZXBlbmRlbnQoc29hcCk7Cit9CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRfU09BUF9FTlZfX0NvZGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzdHJ1Y3QgU09BUF9FTlZfX0NvZGUgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIGEsIFNPQVBfVFlQRV9TT0FQX0VOVl9fQ29kZSksIHR5cGUpOworCXNvYXBfb3V0X19RTmFtZShzb2FwLCAiU09BUC1FTlY6VmFsdWUiLCAtMSwgJmEtPlNPQVBfRU5WX19WYWx1ZSwgIiIpOworCXNvYXBfb3V0X3N0cmluZyhzb2FwLCAiU09BUC1FTlY6Tm9kZSIsIC0xLCAmYS0+U09BUF9FTlZfX05vZGUsICIiKTsKKwlzb2FwX291dF9zdHJpbmcoc29hcCwgIlNPQVAtRU5WOlJvbGUiLCAtMSwgJmEtPlNPQVBfRU5WX19Sb2xlLCAiIik7CisJc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKKwlyZXR1cm4gU09BUF9PSzsKK30KKworU09BUF9GTUFDMSBzdHJ1Y3QgU09BUF9FTlZfX0NvZGUgKiBTT0FQX0ZNQUMyIHNvYXBfZ2V0X1NPQVBfRU5WX19Db2RlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgU09BUF9FTlZfX0NvZGUgKnAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoKHAgPSBzb2FwX2luX1NPQVBfRU5WX19Db2RlKHNvYXAsIHRhZywgcCwgdHlwZSkpKQorCQlzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOworCXJldHVybiBwOworfQorCitTT0FQX0ZNQUMxIHN0cnVjdCBTT0FQX0VOVl9fQ29kZSAqIFNPQVBfRk1BQzIgc29hcF9pbl9TT0FQX0VOVl9fQ29kZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzdHJ1Y3QgU09BUF9FTlZfX0NvZGUgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc2hvcnQgc29hcF9mbGFnX1NPQVBfRU5WX19WYWx1ZSA9IDEsIHNvYXBfZmxhZ19TT0FQX0VOVl9fTm9kZSA9IDEsIHNvYXBfZmxhZ19TT0FQX0VOVl9fUm9sZSA9IDE7CisJaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcpKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoKnNvYXAtPnR5cGUgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkpCisJewlzb2FwLT5lcnJvciA9IFNPQVBfVFlQRV9NSVNNQVRDSDsKKwkJc29hcF9yZXZlcnQoc29hcCk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoc29hcC0+bnVsbCkKKwl7CWlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfTklMKQorCQl7CXNvYXAtPmVycm9yID0gU09BUF9OVUxMOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJZWxzZQorCQkJcmV0dXJuIGE7CisJfQorCWlmICghKnNvYXAtPmhyZWYpCisJewlhID0gKHN0cnVjdCBTT0FQX0VOVl9fQ29kZSAqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIGEsIFNPQVBfVFlQRV9TT0FQX0VOVl9fQ29kZSwgc2l6ZW9mKHN0cnVjdCBTT0FQX0VOVl9fQ29kZSksIDApOworCQlpZiAoIWEpCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKHNvYXAtPmFsbG9jZWQpCisJCQlzb2FwX2RlZmF1bHRfU09BUF9FTlZfX0NvZGUoc29hcCwgYSk7CisJCWlmIChzb2FwLT5ib2R5KQorCQl7CWZvciAoOzspCisJCQl7CXNvYXAtPmVycm9yID0gU09BUF9UQUdfTUlTTUFUQ0g7CisJCQlpZiAoc29hcF9mbGFnX1NPQVBfRU5WX19WYWx1ZSAmJiBzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlpZiAoc29hcF9pbl9fUU5hbWUoc29hcCwgIlNPQVAtRU5WOlZhbHVlIiwgJmEtPlNPQVBfRU5WX19WYWx1ZSwgIiIpKQorCQkJCXsJc29hcF9mbGFnX1NPQVBfRU5WX19WYWx1ZSA9IDA7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCWlmIChzb2FwX2ZsYWdfU09BUF9FTlZfX05vZGUgJiYgc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJaWYgKHNvYXBfaW5fc3RyaW5nKHNvYXAsICJTT0FQLUVOVjpOb2RlIiwgJmEtPlNPQVBfRU5WX19Ob2RlLCAiIikpCisJCQkJewlzb2FwX2ZsYWdfU09BUF9FTlZfX05vZGUgPSAwOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQlpZiAoc29hcF9mbGFnX1NPQVBfRU5WX19Sb2xlICYmIHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCWlmIChzb2FwX2luX3N0cmluZyhzb2FwLCAiU09BUC1FTlY6Um9sZSIsICZhLT5TT0FQX0VOVl9fUm9sZSwgIiIpKQorCQkJCXsJc29hcF9mbGFnX1NPQVBfRU5WX19Sb2xlID0gMDsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCXNvYXAtPmVycm9yID0gc29hcF9pZ25vcmVfZWxlbWVudChzb2FwKTsKKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykKKwkJCQlicmVhazsKKwkJCWlmIChzb2FwLT5lcnJvcikKKwkJCXsJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKwkJaWYgKHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCWVsc2UKKwl7CWEgPSAoc3RydWN0IFNPQVBfRU5WX19Db2RlICopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgYSwgU09BUF9UWVBFX1NPQVBfRU5WX19Db2RlLCBzaXplb2Yoc3RydWN0IFNPQVBfRU5WX19Db2RlKSwgMCksIFNPQVBfVFlQRV9TT0FQX0VOVl9fQ29kZSwgc2l6ZW9mKHN0cnVjdCBTT0FQX0VOVl9fQ29kZSkpOworCQlpZiAoc29hcC0+YWxsb2NlZCkKKwkJCXNvYXBfZGVmYXVsdF9TT0FQX0VOVl9fQ29kZShzb2FwLCBhKTsKKwkJaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBhOworfQorCisjZW5kaWYKKworI2lmbmRlZiBXSVRIX05PR0xPQkFMCisKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfc2VyaWFsaXplX1NPQVBfRU5WX19IZWFkZXIoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBTT0FQX0VOVl9fSGVhZGVyIGNvbnN0KmEpCit7CisJaWYgKCFzb2FwX3JlZmVyZW5jZShzb2FwLCBhLCBTT0FQX1RZUEVfU09BUF9FTlZfX0hlYWRlcikpCisJCXNvYXBfbWFya19TT0FQX0VOVl9fSGVhZGVyKHNvYXAsIGEpOworfQorCitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX21hcmtfU09BUF9FTlZfX0hlYWRlcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgc3RydWN0IFNPQVBfRU5WX19IZWFkZXIgKmEpCit7CisJLyogdHJhbnNpZW50IGR1bW15IHNraXBwZWQgKi8KK30KKworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9kZWZhdWx0X1NPQVBfRU5WX19IZWFkZXIoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBTT0FQX0VOVl9fSGVhZGVyICphKQoreworCS8qIHRyYW5zaWVudCBkdW1teSBza2lwcGVkICovCit9CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9wdXRfU09BUF9FTlZfX0hlYWRlcihzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IFNPQVBfRU5WX19IZWFkZXIgKmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpbnQgaSA9IHNvYXBfZW1iZWRfZWxlbWVudChzb2FwLCAodm9pZCopYSwgdGFnLCBTT0FQX1RZUEVfU09BUF9FTlZfX0hlYWRlcik7CisJaWYgKGkgPj0gMCkKKwkJc29hcF9vdXRfU09BUF9FTlZfX0hlYWRlcihzb2FwLCB0YWcsIGksIGEsIHR5cGUpOworCXJldHVybiBzb2FwX3B1dGluZGVwZW5kZW50KHNvYXApOworfQorCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0X1NPQVBfRU5WX19IZWFkZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzdHJ1Y3QgU09BUF9FTlZfX0hlYWRlciAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgYSwgU09BUF9UWVBFX1NPQVBfRU5WX19IZWFkZXIpLCB0eXBlKTsKKwkvKiB0cmFuc2llbnQgZHVtbXkgc2tpcHBlZCAqLworCXNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7CisJcmV0dXJuIFNPQVBfT0s7Cit9CisKK1NPQVBfRk1BQzEgc3RydWN0IFNPQVBfRU5WX19IZWFkZXIgKiBTT0FQX0ZNQUMyIHNvYXBfZ2V0X1NPQVBfRU5WX19IZWFkZXIoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBTT0FQX0VOVl9fSGVhZGVyICpwLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKChwID0gc29hcF9pbl9TT0FQX0VOVl9fSGVhZGVyKHNvYXAsIHRhZywgcCwgdHlwZSkpKQorCQlzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOworCXJldHVybiBwOworfQorCitTT0FQX0ZNQUMxIHN0cnVjdCBTT0FQX0VOVl9fSGVhZGVyICogU09BUF9GTUFDMiBzb2FwX2luX1NPQVBfRU5WX19IZWFkZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc3RydWN0IFNPQVBfRU5WX19IZWFkZXIgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7OworCWlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCpzb2FwLT50eXBlICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpKQorCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEVfTUlTTUFUQ0g7CisJCXNvYXBfcmV2ZXJ0KHNvYXApOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKHNvYXAtPm51bGwpCisJewlpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX05JTCkKKwkJewlzb2FwLT5lcnJvciA9IFNPQVBfTlVMTDsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWVsc2UKKwkJCXJldHVybiBhOworCX0KKwlpZiAoISpzb2FwLT5ocmVmKQorCXsJYSA9IChzdHJ1Y3QgU09BUF9FTlZfX0hlYWRlciAqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIGEsIFNPQVBfVFlQRV9TT0FQX0VOVl9fSGVhZGVyLCBzaXplb2Yoc3RydWN0IFNPQVBfRU5WX19IZWFkZXIpLCAwKTsKKwkJaWYgKCFhKQorCQkJcmV0dXJuIE5VTEw7CisJCWlmIChzb2FwLT5hbGxvY2VkKQorCQkJc29hcF9kZWZhdWx0X1NPQVBfRU5WX19IZWFkZXIoc29hcCwgYSk7CisJCWlmIChzb2FwLT5ib2R5KQorCQl7CWZvciAoOzspCisJCQl7CXNvYXAtPmVycm9yID0gU09BUF9UQUdfTUlTTUFUQ0g7CisJCS8qIHRyYW5zaWVudCBkdW1teSBza2lwcGVkICovCisJCQlpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisJCQkJc29hcC0+ZXJyb3IgPSBzb2FwX2lnbm9yZV9lbGVtZW50KHNvYXApOworCQkJaWYgKHNvYXAtPmVycm9yID09IFNPQVBfTk9fVEFHKQorCQkJCWJyZWFrOworCQkJaWYgKHNvYXAtPmVycm9yKQorCQkJewlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCQlpZiAoc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisJZWxzZQorCXsJYSA9IChzdHJ1Y3QgU09BUF9FTlZfX0hlYWRlciAqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCAodm9pZCoqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIGEsIFNPQVBfVFlQRV9TT0FQX0VOVl9fSGVhZGVyLCBzaXplb2Yoc3RydWN0IFNPQVBfRU5WX19IZWFkZXIpLCAwKSwgU09BUF9UWVBFX1NPQVBfRU5WX19IZWFkZXIsIHNpemVvZihzdHJ1Y3QgU09BUF9FTlZfX0hlYWRlcikpOworCQlpZiAoc29hcC0+YWxsb2NlZCkKKwkJCXNvYXBfZGVmYXVsdF9TT0FQX0VOVl9fSGVhZGVyKHNvYXAsIGEpOworCQlpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGE7Cit9CisKKyNlbmRpZgorCitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NlcmlhbGl6ZV9uc19fZ2V0UXVvdGUoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZ2V0UXVvdGUgY29uc3QqYSkKK3sKKwlpZiAoIXNvYXBfcmVmZXJlbmNlKHNvYXAsIGEsIFNPQVBfVFlQRV9uc19fZ2V0UXVvdGUpKQorCQlzb2FwX21hcmtfbnNfX2dldFF1b3RlKHNvYXAsIGEpOworfQorCitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX21hcmtfbnNfX2dldFF1b3RlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBzdHJ1Y3QgbnNfX2dldFF1b3RlICphKQoreworCXNvYXBfZW1iZWRkZWQoc29hcCwgJmEtPnN5bWJvbCwgU09BUF9UWVBFX3N0cmluZyk7CisJc29hcF9tYXJrX3N0cmluZyhzb2FwLCAmYS0+c3ltYm9sKTsKK30KKworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9kZWZhdWx0X25zX19nZXRRdW90ZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19nZXRRdW90ZSAqYSkKK3sKKwlzb2FwX2RlZmF1bHRfc3RyaW5nKHNvYXAsICZhLT5zeW1ib2wpOworfQorCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0X25zX19nZXRRdW90ZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG5zX19nZXRRdW90ZSAqYSwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWludCBpID0gc29hcF9lbWJlZF9lbGVtZW50KHNvYXAsICh2b2lkKilhLCB0YWcsIFNPQVBfVFlQRV9uc19fZ2V0UXVvdGUpOworCWlmIChpID49IDApCisJCXNvYXBfb3V0X25zX19nZXRRdW90ZShzb2FwLCB0YWcsIGksIGEsIHR5cGUpOworCXJldHVybiBzb2FwX3B1dGluZGVwZW5kZW50KHNvYXApOworfQorCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0X25zX19nZXRRdW90ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHN0cnVjdCBuc19fZ2V0UXVvdGUgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIGEsIFNPQVBfVFlQRV9uc19fZ2V0UXVvdGUpLCB0eXBlKTsKKwlzb2FwX291dF9zdHJpbmcoc29hcCwgInN5bWJvbCIsIC0xLCAmYS0+c3ltYm9sLCAiIik7CisJc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKKwlyZXR1cm4gU09BUF9PSzsKK30KKworU09BUF9GTUFDMSBzdHJ1Y3QgbnNfX2dldFF1b3RlICogU09BUF9GTUFDMiBzb2FwX2dldF9uc19fZ2V0UXVvdGUoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZ2V0UXVvdGUgKnAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoKHAgPSBzb2FwX2luX25zX19nZXRRdW90ZShzb2FwLCB0YWcsIHAsIHR5cGUpKSkKKwkJc29hcF9nZXRpbmRlcGVuZGVudChzb2FwKTsKKwlyZXR1cm4gcDsKK30KKworU09BUF9GTUFDMSBzdHJ1Y3QgbnNfX2dldFF1b3RlICogU09BUF9GTUFDMiBzb2FwX2luX25zX19nZXRRdW90ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzdHJ1Y3QgbnNfX2dldFF1b3RlICphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXNob3J0IHNvYXBfZmxhZ19zeW1ib2wgPSAxOworCWlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCpzb2FwLT50eXBlICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpKQorCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEVfTUlTTUFUQ0g7CisJCXNvYXBfcmV2ZXJ0KHNvYXApOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKHNvYXAtPm51bGwpCisJewlpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX05JTCkKKwkJewlzb2FwLT5lcnJvciA9IFNPQVBfTlVMTDsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWVsc2UKKwkJCXJldHVybiBhOworCX0KKwlpZiAoISpzb2FwLT5ocmVmKQorCXsJYSA9IChzdHJ1Y3QgbnNfX2dldFF1b3RlICopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgYSwgU09BUF9UWVBFX25zX19nZXRRdW90ZSwgc2l6ZW9mKHN0cnVjdCBuc19fZ2V0UXVvdGUpLCAwKTsKKwkJaWYgKCFhKQorCQkJcmV0dXJuIE5VTEw7CisJCWlmIChzb2FwLT5hbGxvY2VkKQorCQkJc29hcF9kZWZhdWx0X25zX19nZXRRdW90ZShzb2FwLCBhKTsKKwkJaWYgKHNvYXAtPmJvZHkpCisJCXsJZm9yICg7OykKKwkJCXsJc29hcC0+ZXJyb3IgPSBTT0FQX1RBR19NSVNNQVRDSDsKKwkJCWlmIChzb2FwX2ZsYWdfc3ltYm9sICYmIHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorCQkJCWlmIChzb2FwX2luX3N0cmluZyhzb2FwLCAic3ltYm9sIiwgJmEtPnN5bWJvbCwgIiIpKQorCQkJCXsJc29hcF9mbGFnX3N5bWJvbCA9IDA7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlzb2FwLT5lcnJvciA9IHNvYXBfaWdub3JlX2VsZW1lbnQoc29hcCk7CisJCQlpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcpCisJCQkJYnJlYWs7CisJCQlpZiAoc29hcC0+ZXJyb3IpCisJCQl7CXJldHVybiBOVUxMOworCQkJfQorCQl9CisJCWlmIChzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKwllbHNlCisJewlhID0gKHN0cnVjdCBuc19fZ2V0UXVvdGUgKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBhLCBTT0FQX1RZUEVfbnNfX2dldFF1b3RlLCBzaXplb2Yoc3RydWN0IG5zX19nZXRRdW90ZSksIDApLCBTT0FQX1RZUEVfbnNfX2dldFF1b3RlLCBzaXplb2Yoc3RydWN0IG5zX19nZXRRdW90ZSkpOworCQlpZiAoc29hcC0+YWxsb2NlZCkKKwkJCXNvYXBfZGVmYXVsdF9uc19fZ2V0UXVvdGUoc29hcCwgYSk7CisJCWlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gYTsKK30KKworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXJpYWxpemVfbnNfX2dldFF1b3RlUmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZ2V0UXVvdGVSZXNwb25zZSBjb25zdCphKQoreworCWlmICghc29hcF9yZWZlcmVuY2Uoc29hcCwgYSwgU09BUF9UWVBFX25zX19nZXRRdW90ZVJlc3BvbnNlKSkKKwkJc29hcF9tYXJrX25zX19nZXRRdW90ZVJlc3BvbnNlKHNvYXAsIGEpOworfQorCitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX21hcmtfbnNfX2dldFF1b3RlUmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHN0cnVjdCBuc19fZ2V0UXVvdGVSZXNwb25zZSAqYSkKK3sKKwlzb2FwX2VtYmVkZGVkKHNvYXAsICZhLT5SZXN1bHQsIFNPQVBfVFlQRV9Qb2ludGVyVG9mbG9hdCk7CisJc29hcF9tYXJrX1BvaW50ZXJUb2Zsb2F0KHNvYXAsICZhLT5SZXN1bHQpOworfQorCitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2RlZmF1bHRfbnNfX2dldFF1b3RlUmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZ2V0UXVvdGVSZXNwb25zZSAqYSkKK3sKKwlzb2FwX2RlZmF1bHRfUG9pbnRlclRvZmxvYXQoc29hcCwgJmEtPlJlc3VsdCk7Cit9CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9wdXRfbnNfX2dldFF1b3RlUmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBuc19fZ2V0UXVvdGVSZXNwb25zZSAqYSwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWludCBpID0gc29hcF9lbWJlZF9lbGVtZW50KHNvYXAsICh2b2lkKilhLCB0YWcsIFNPQVBfVFlQRV9uc19fZ2V0UXVvdGVSZXNwb25zZSk7CisJaWYgKGkgPj0gMCkKKwkJc29hcF9vdXRfbnNfX2dldFF1b3RlUmVzcG9uc2Uoc29hcCwgdGFnLCBpLCBhLCB0eXBlKTsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dF9uc19fZ2V0UXVvdGVSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHN0cnVjdCBuc19fZ2V0UXVvdGVSZXNwb25zZSAqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgYSwgU09BUF9UWVBFX25zX19nZXRRdW90ZVJlc3BvbnNlKSwgdHlwZSk7CisJaWYgKGEtPlJlc3VsdCkKKwkJc29hcF9lbGVtZW50X3Jlc3VsdChzb2FwLCAiUmVzdWx0Iik7CisJc29hcF9vdXRfUG9pbnRlclRvZmxvYXQoc29hcCwgIlJlc3VsdCIsIC0xLCAmYS0+UmVzdWx0LCAiIik7CisJc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKKwlyZXR1cm4gU09BUF9PSzsKK30KKworU09BUF9GTUFDMSBzdHJ1Y3QgbnNfX2dldFF1b3RlUmVzcG9uc2UgKiBTT0FQX0ZNQUMyIHNvYXBfZ2V0X25zX19nZXRRdW90ZVJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgbnNfX2dldFF1b3RlUmVzcG9uc2UgKnAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoKHAgPSBzb2FwX2luX25zX19nZXRRdW90ZVJlc3BvbnNlKHNvYXAsIHRhZywgcCwgdHlwZSkpKQorCQlzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOworCXJldHVybiBwOworfQorCitTT0FQX0ZNQUMxIHN0cnVjdCBuc19fZ2V0UXVvdGVSZXNwb25zZSAqIFNPQVBfRk1BQzIgc29hcF9pbl9uc19fZ2V0UXVvdGVSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzdHJ1Y3QgbnNfX2dldFF1b3RlUmVzcG9uc2UgKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc2hvcnQgc29hcF9mbGFnX1Jlc3VsdCA9IDE7CisJaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcpKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoKnNvYXAtPnR5cGUgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkpCisJewlzb2FwLT5lcnJvciA9IFNPQVBfVFlQRV9NSVNNQVRDSDsKKwkJc29hcF9yZXZlcnQoc29hcCk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoc29hcC0+bnVsbCkKKwl7CWlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfTklMKQorCQl7CXNvYXAtPmVycm9yID0gU09BUF9OVUxMOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJZWxzZQorCQkJcmV0dXJuIGE7CisJfQorCWlmICghKnNvYXAtPmhyZWYpCisJewlhID0gKHN0cnVjdCBuc19fZ2V0UXVvdGVSZXNwb25zZSAqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIGEsIFNPQVBfVFlQRV9uc19fZ2V0UXVvdGVSZXNwb25zZSwgc2l6ZW9mKHN0cnVjdCBuc19fZ2V0UXVvdGVSZXNwb25zZSksIDApOworCQlpZiAoIWEpCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKHNvYXAtPmFsbG9jZWQpCisJCQlzb2FwX2RlZmF1bHRfbnNfX2dldFF1b3RlUmVzcG9uc2Uoc29hcCwgYSk7CisJCWlmIChzb2FwLT5ib2R5KQorCQl7CWZvciAoOzspCisJCQl7CXNvYXAtPmVycm9yID0gU09BUF9UQUdfTUlTTUFUQ0g7CisJCQlpZiAoc29hcF9mbGFnX1Jlc3VsdCAmJiBzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlpZiAoc29hcF9pbl9Qb2ludGVyVG9mbG9hdChzb2FwLCAiUmVzdWx0IiwgJmEtPlJlc3VsdCwgIiIpKQorCQkJCXsJc29hcF9mbGFnX1Jlc3VsdCA9IDA7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCWlmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKwkJCQlzb2FwLT5lcnJvciA9IHNvYXBfaWdub3JlX2VsZW1lbnQoc29hcCk7CisJCQlpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcpCisJCQkJYnJlYWs7CisJCQlpZiAoc29hcC0+ZXJyb3IpCisJCQl7CXJldHVybiBOVUxMOworCQkJfQorCQl9CisJCWlmIChzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKwllbHNlCisJewlhID0gKHN0cnVjdCBuc19fZ2V0UXVvdGVSZXNwb25zZSAqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCAodm9pZCoqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIGEsIFNPQVBfVFlQRV9uc19fZ2V0UXVvdGVSZXNwb25zZSwgc2l6ZW9mKHN0cnVjdCBuc19fZ2V0UXVvdGVSZXNwb25zZSksIDApLCBTT0FQX1RZUEVfbnNfX2dldFF1b3RlUmVzcG9uc2UsIHNpemVvZihzdHJ1Y3QgbnNfX2dldFF1b3RlUmVzcG9uc2UpKTsKKwkJaWYgKHNvYXAtPmFsbG9jZWQpCisJCQlzb2FwX2RlZmF1bHRfbnNfX2dldFF1b3RlUmVzcG9uc2Uoc29hcCwgYSk7CisJCWlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gYTsKK30KKworI2lmbmRlZiBXSVRIX05PR0xPQkFMCisKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb1NPQVBfRU5WX19Db2RlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgU09BUF9FTlZfX0NvZGUgKmNvbnN0KmEpCit7CisJaWYgKCFzb2FwX3JlZmVyZW5jZShzb2FwLCBhLCBTT0FQX1RZUEVfUG9pbnRlclRvU09BUF9FTlZfX0NvZGUpKQorCQlzb2FwX21hcmtfUG9pbnRlclRvU09BUF9FTlZfX0NvZGUoc29hcCwgYSk7Cit9CisKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfbWFya19Qb2ludGVyVG9TT0FQX0VOVl9fQ29kZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IFNPQVBfRU5WX19Db2RlICpjb25zdCphKQoreworCWlmICghc29hcF9yZWZlcmVuY2Uoc29hcCwgKmEsIFNPQVBfVFlQRV9TT0FQX0VOVl9fQ29kZSkpCisJCXNvYXBfbWFya19TT0FQX0VOVl9fQ29kZShzb2FwLCAqYSk7Cit9CisKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfZGVmYXVsdF9Qb2ludGVyVG9TT0FQX0VOVl9fQ29kZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IFNPQVBfRU5WX19Db2RlICoqYSkKK3sKKwkqYSA9IE5VTEw7Cit9CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9wdXRfUG9pbnRlclRvU09BUF9FTlZfX0NvZGUoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBTT0FQX0VOVl9fQ29kZSAqKmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpbnQgaSA9IHNvYXBfZW1iZWRfZWxlbWVudChzb2FwLCAodm9pZCopYSwgdGFnLCBTT0FQX1RZUEVfUG9pbnRlclRvU09BUF9FTlZfX0NvZGUpOworCWlmIChpID49IDApCisJCXNvYXBfb3V0X1BvaW50ZXJUb1NPQVBfRU5WX19Db2RlKHNvYXAsIHRhZywgaSwgYSwgdHlwZSk7CisJcmV0dXJuIHNvYXBfcHV0aW5kZXBlbmRlbnQoc29hcCk7Cit9CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRfUG9pbnRlclRvU09BUF9FTlZfX0NvZGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBzdHJ1Y3QgU09BUF9FTlZfX0NvZGUgKmNvbnN0KmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJc3RydWN0IHNvYXBfcGxpc3QgKnBwOworCXJlZ2lzdGVyIGludCBpOworCWlkID0gc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgYSwgU09BUF9UWVBFX1BvaW50ZXJUb1NPQVBfRU5WX19Db2RlKTsKKwlpZiAoISphKQorCQlyZXR1cm4gc29hcF9lbGVtZW50X251bGwoc29hcCwgdGFnLCBpZCwgdHlwZSk7CisJaSA9IHNvYXBfcG9pbnRlcl9sb29rdXAoc29hcCwgKmEsIFNPQVBfVFlQRV9TT0FQX0VOVl9fQ29kZSwgJnBwKTsKKwlpZiAoaSkKKwl7CWlmIChzb2FwX2lzX2VtYmVkZGVkKHNvYXAsIHBwKSkKKwkJCXJldHVybiBzb2FwX2VsZW1lbnRfcmVmKHNvYXAsIHRhZywgaWQsIGkpOworCQlpZiAoc29hcF9pc19zaW5nbGUoc29hcCwgcHApKQorCQkJcmV0dXJuIHNvYXBfb3V0X1NPQVBfRU5WX19Db2RlKHNvYXAsIHRhZywgMCwgKmEsIHR5cGUpOworCQlzb2FwX3NldF9lbWJlZGRlZChzb2FwLCBwcCk7CisJCXJldHVybiBzb2FwX291dF9TT0FQX0VOVl9fQ29kZShzb2FwLCB0YWcsIGksICphLCB0eXBlKTsKKwl9CisJcmV0dXJuIHNvYXBfb3V0X1NPQVBfRU5WX19Db2RlKHNvYXAsIHRhZywgc29hcF9wb2ludGVyX2VudGVyKHNvYXAsICphLCBTT0FQX1RZUEVfU09BUF9FTlZfX0NvZGUsICZwcCksICphLCB0eXBlKTsKK30KKworU09BUF9GTUFDMSBzdHJ1Y3QgU09BUF9FTlZfX0NvZGUgKiogU09BUF9GTUFDMiBzb2FwX2dldF9Qb2ludGVyVG9TT0FQX0VOVl9fQ29kZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IFNPQVBfRU5WX19Db2RlICoqcCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmICgocCA9IHNvYXBfaW5fUG9pbnRlclRvU09BUF9FTlZfX0NvZGUoc29hcCwgdGFnLCBwLCB0eXBlKSkpCisJCXNvYXBfZ2V0aW5kZXBlbmRlbnQoc29hcCk7CisJcmV0dXJuIHA7Cit9CisKK1NPQVBfRk1BQzEgc3RydWN0IFNPQVBfRU5WX19Db2RlICoqIFNPQVBfRk1BQzIgc29hcF9pbl9Qb2ludGVyVG9TT0FQX0VOVl9fQ29kZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzdHJ1Y3QgU09BUF9FTlZfX0NvZGUgKiphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXN0cnVjdCBTT0FQX0VOVl9fQ29kZSAqcDsKKwlpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZykpCisJCXJldHVybiBOVUxMOworCWlmIChzb2FwLT5udWxsKQorCXsJYSA9IChzdHJ1Y3QgU09BUF9FTlZfX0NvZGUgKiopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgYSwgU09BUF9UWVBFX1BvaW50ZXJUb1NPQVBfRU5WX19Db2RlLCBzaXplb2Yoc3RydWN0IFNPQVBfRU5WX19Db2RlICopLCAxKTsKKwkJaWYgKGEpCisJCQkqYSA9IE5VTEw7CisJCWlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwllbHNlIGlmICghKnNvYXAtPmhyZWYpCisJewlzb2FwX3JldmVydChzb2FwKTsKKwkJaWYgKGEpCisJCXsJaWYgKChwID0gc29hcF9pbl9TT0FQX0VOVl9fQ29kZShzb2FwLCB0YWcsICphLCB0eXBlKSkpCisJCQkJKmEgPSBwOworCQkJZWxzZQorCQkJCWEgPSBOVUxMOworCQl9CisJCWVsc2UgaWYgKChwID0gc29hcF9pbl9TT0FQX0VOVl9fQ29kZShzb2FwLCB0YWcsIE5VTEwsIHR5cGUpKSkKKwkJewlhID0gKHN0cnVjdCBTT0FQX0VOVl9fQ29kZSAqKilzb2FwX2lkX2VudGVyKHNvYXAsICIiLCBOVUxMLCBTT0FQX1RZUEVfUG9pbnRlclRvU09BUF9FTlZfX0NvZGUsIHNpemVvZihzdHJ1Y3QgU09BUF9FTlZfX0NvZGUgKiksIDApOworCQkJaWYgKGEpCisJCQkJKmEgPSBwOworCQl9CisJfQorCWVsc2UKKwl7CWEgPSAoc3RydWN0IFNPQVBfRU5WX19Db2RlICoqKXNvYXBfaWRfbG9va3VwKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgYSwgU09BUF9UWVBFX1BvaW50ZXJUb1NPQVBfRU5WX19Db2RlLCBzaXplb2Yoc3RydWN0IFNPQVBfRU5WX19Db2RlICopLCAxKSwgU09BUF9UWVBFX1NPQVBfRU5WX19Db2RlLCBzaXplb2Yoc3RydWN0IFNPQVBfRU5WX19Db2RlKSwgMCk7CisJCWlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gYTsKK30KKworI2VuZGlmCisKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb2Zsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBmbG9hdCAqY29uc3QqYSkKK3sKKwlpZiAoIXNvYXBfcmVmZXJlbmNlKHNvYXAsIGEsIFNPQVBfVFlQRV9Qb2ludGVyVG9mbG9hdCkpCisJCXNvYXBfbWFya19Qb2ludGVyVG9mbG9hdChzb2FwLCBhKTsKK30KKworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9tYXJrX1BvaW50ZXJUb2Zsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBmbG9hdCAqY29uc3QqYSkKK3sKKwlzb2FwX3JlZmVyZW5jZShzb2FwLCAqYSwgU09BUF9UWVBFX2Zsb2F0KTsKK30KKworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9kZWZhdWx0X1BvaW50ZXJUb2Zsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBmbG9hdCAqKmEpCit7CisJKmEgPSBOVUxMOworfQorCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0X1BvaW50ZXJUb2Zsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBmbG9hdCAqKmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpbnQgaSA9IHNvYXBfZW1iZWRfZWxlbWVudChzb2FwLCAodm9pZCopYSwgdGFnLCBTT0FQX1RZUEVfUG9pbnRlclRvZmxvYXQpOworCWlmIChpID49IDApCisJCXNvYXBfb3V0X1BvaW50ZXJUb2Zsb2F0KHNvYXAsIHRhZywgaSwgYSwgdHlwZSk7CisJcmV0dXJuIHNvYXBfcHV0aW5kZXBlbmRlbnQoc29hcCk7Cit9CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRfUG9pbnRlclRvZmxvYXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBmbG9hdCAqY29uc3QqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisJcmVnaXN0ZXIgaW50IGk7CisJaWQgPSBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBhLCBTT0FQX1RZUEVfUG9pbnRlclRvZmxvYXQpOworCWlmICghKmEpCisJCXJldHVybiBzb2FwX2VsZW1lbnRfbnVsbChzb2FwLCB0YWcsIGlkLCB0eXBlKTsKKwlpID0gc29hcF9wb2ludGVyX2xvb2t1cChzb2FwLCAqYSwgU09BUF9UWVBFX2Zsb2F0LCAmcHApOworCWlmIChpKQorCXsJaWYgKHNvYXBfaXNfZW1iZWRkZWQoc29hcCwgcHApKQorCQkJcmV0dXJuIHNvYXBfZWxlbWVudF9yZWYoc29hcCwgdGFnLCBpZCwgaSk7CisJCWlmIChzb2FwX2lzX3NpbmdsZShzb2FwLCBwcCkpCisJCQlyZXR1cm4gc29hcF9vdXRfZmxvYXQoc29hcCwgdGFnLCAwLCAqYSwgdHlwZSk7CisJCXNvYXBfc2V0X2VtYmVkZGVkKHNvYXAsIHBwKTsKKwkJcmV0dXJuIHNvYXBfb3V0X2Zsb2F0KHNvYXAsIHRhZywgaSwgKmEsIHR5cGUpOworCX0KKwlyZXR1cm4gc29hcF9vdXRfZmxvYXQoc29hcCwgdGFnLCBzb2FwX3BvaW50ZXJfZW50ZXIoc29hcCwgKmEsIFNPQVBfVFlQRV9mbG9hdCwgJnBwKSwgKmEsIHR5cGUpOworfQorCitTT0FQX0ZNQUMxIGZsb2F0ICoqIFNPQVBfRk1BQzIgc29hcF9nZXRfUG9pbnRlclRvZmxvYXQoc3RydWN0IHNvYXAgKnNvYXAsIGZsb2F0ICoqcCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmICgocCA9IHNvYXBfaW5fUG9pbnRlclRvZmxvYXQoc29hcCwgdGFnLCBwLCB0eXBlKSkpCisJCXNvYXBfZ2V0aW5kZXBlbmRlbnQoc29hcCk7CisJcmV0dXJuIHA7Cit9CisKK1NPQVBfRk1BQzEgZmxvYXQgKiogU09BUF9GTUFDMiBzb2FwX2luX1BvaW50ZXJUb2Zsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGZsb2F0ICoqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlmbG9hdCAqcDsKKwlpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZykpCisJCXJldHVybiBOVUxMOworCWlmIChzb2FwLT5udWxsKQorCXsJYSA9IChmbG9hdCAqKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBhLCBTT0FQX1RZUEVfUG9pbnRlclRvZmxvYXQsIHNpemVvZihmbG9hdCAqKSwgMSk7CisJCWlmIChhKQorCQkJKmEgPSBOVUxMOworCQlpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJZWxzZSBpZiAoISpzb2FwLT5ocmVmKQorCXsJc29hcF9yZXZlcnQoc29hcCk7CisJCWlmIChhKQorCQl7CWlmICgocCA9IHNvYXBfaW5fZmxvYXQoc29hcCwgdGFnLCAqYSwgdHlwZSkpKQorCQkJCSphID0gcDsKKwkJCWVsc2UKKwkJCQlhID0gTlVMTDsKKwkJfQorCQllbHNlIGlmICgocCA9IHNvYXBfaW5fZmxvYXQoc29hcCwgdGFnLCBOVUxMLCB0eXBlKSkpCisJCXsJYSA9IChmbG9hdCAqKilzb2FwX2lkX2VudGVyKHNvYXAsICIiLCBOVUxMLCBTT0FQX1RZUEVfUG9pbnRlclRvZmxvYXQsIHNpemVvZihmbG9hdCAqKSwgMCk7CisJCQlpZiAoYSkKKwkJCQkqYSA9IHA7CisJCX0KKwl9CisJZWxzZQorCXsJYSA9IChmbG9hdCAqKilzb2FwX2lkX2xvb2t1cChzb2FwLCBzb2FwLT5ocmVmLCAodm9pZCoqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIGEsIFNPQVBfVFlQRV9Qb2ludGVyVG9mbG9hdCwgc2l6ZW9mKGZsb2F0ICopLCAxKSwgU09BUF9UWVBFX2Zsb2F0LCBzaXplb2YoZmxvYXQpLCAwKTsKKwkJaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBhOworfQorCitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2RlZmF1bHRfX1FOYW1lKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICoqYSkKK3sKKyNpZmRlZiBTT0FQX0RFRkFVTFRfX1FOYW1lCisJKmEgPSBTT0FQX0RFRkFVTFRfX1FOYW1lOworI2Vsc2UKKwkqYSA9IChjaGFyICopMDsKKyNlbmRpZgorfQorCitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NlcmlhbGl6ZV9fUU5hbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKmNvbnN0KmEpCit7CisJc29hcF9yZWZlcmVuY2Uoc29hcCwgKmEsIFNPQVBfVFlQRV9fUU5hbWUpOworfQorCitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX21hcmtfX1FOYW1lKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpjb25zdCphKQoreworCXNvYXBfcmVmZXJlbmNlKHNvYXAsICphLCBTT0FQX1RZUEVfX1FOYW1lKTsKK30KKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3B1dF9fUU5hbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKiphLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaW50IGkgPSBzb2FwX2VtYmVkX2VsZW1lbnQoc29hcCwgKHZvaWQqKWEsIHRhZywgU09BUF9UWVBFX19RTmFtZSk7CisJaWYgKGkgPj0gMCkKKwkJc29hcF9vdXRfX1FOYW1lKHNvYXAsIHRhZywgaSwgYSwgdHlwZSk7CisJcmV0dXJuIHNvYXBfcHV0aW5kZXBlbmRlbnQoc29hcCk7Cit9CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRfX1FOYW1lKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY2hhciAqY29uc3QqYSwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlyZXR1cm4gc29hcF9vdXRzdHJpbmcoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSwgU09BUF9UWVBFX19RTmFtZSk7Cit9CisKK1NPQVBfRk1BQzEgY2hhciAqKiBTT0FQX0ZNQUMyIHNvYXBfZ2V0X19RTmFtZShzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqKnAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpZiAoKHAgPSBzb2FwX2luX19RTmFtZShzb2FwLCB0YWcsIHAsIHR5cGUpKSkKKwkJc29hcF9nZXRpbmRlcGVuZGVudChzb2FwKTsKKwlyZXR1cm4gcDsKK30KKworU09BUF9GTUFDMSBjaGFyICogKiBTT0FQX0ZNQUMyIHNvYXBfaW5fX1FOYW1lKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGNoYXIgKiphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXJldHVybiBzb2FwX2luc3RyaW5nKHNvYXAsIHRhZywgYSwgdHlwZSwgU09BUF9UWVBFX19RTmFtZSwgMik7Cit9CisKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfZGVmYXVsdF9zdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKiphKQoreworI2lmZGVmIFNPQVBfREVGQVVMVF9zdHJpbmcKKwkqYSA9IFNPQVBfREVGQVVMVF9zdHJpbmc7CisjZWxzZQorCSphID0gKGNoYXIgKikwOworI2VuZGlmCit9CisKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfc2VyaWFsaXplX3N0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqY29uc3QqYSkKK3sKKwlzb2FwX3JlZmVyZW5jZShzb2FwLCAqYSwgU09BUF9UWVBFX3N0cmluZyk7Cit9CisKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfbWFya19zdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKmNvbnN0KmEpCit7CisJc29hcF9yZWZlcmVuY2Uoc29hcCwgKmEsIFNPQVBfVFlQRV9zdHJpbmcpOworfQorCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0X3N0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqKmEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlpbnQgaSA9IHNvYXBfZW1iZWRfZWxlbWVudChzb2FwLCAodm9pZCopYSwgdGFnLCBTT0FQX1RZUEVfc3RyaW5nKTsKKwlpZiAoaSA+PSAwKQorCQlzb2FwX291dF9zdHJpbmcoc29hcCwgdGFnLCBpLCBhLCB0eXBlKTsKKwlyZXR1cm4gc29hcF9wdXRpbmRlcGVuZGVudChzb2FwKTsKK30KKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dF9zdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjaGFyICpjb25zdCphLCBjb25zdCBjaGFyICp0eXBlKQoreworCXJldHVybiBzb2FwX291dHN0cmluZyhzb2FwLCB0YWcsIGlkLCBhLCB0eXBlLCBTT0FQX1RZUEVfc3RyaW5nKTsKK30KKworU09BUF9GTUFDMSBjaGFyICoqIFNPQVBfRk1BQzIgc29hcF9nZXRfc3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICoqcCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKQoreworCWlmICgocCA9IHNvYXBfaW5fc3RyaW5nKHNvYXAsIHRhZywgcCwgdHlwZSkpKQorCQlzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOworCXJldHVybiBwOworfQorCitTT0FQX0ZNQUMxIGNoYXIgKiAqIFNPQVBfRk1BQzIgc29hcF9pbl9zdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgY2hhciAqKmEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmV0dXJuIHNvYXBfaW5zdHJpbmcoc29hcCwgdGFnLCBhLCB0eXBlLCBTT0FQX1RZUEVfc3RyaW5nLCAxKTsKK30KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKy8qIGVuZCBvZiBzb2FwQy5jICovCmRpZmYgLS1naXQgYS9zYW1wbGVzL3F1b3RlX01BQ19Qcm9qQnVpbGQvc29hcENsaWVudC5jIGIvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL3NvYXBDbGllbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWU0ZjkyCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL3NvYXBDbGllbnQuYwpAQCAtMCwwICsxLDcwIEBACisvKiBzb2FwQ2xpZW50LmMKKyAgIEdlbmVyYXRlZCBieSBnU09BUCAyLjMgZnJvbSBxdW90ZS5oCisgICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBHZW5pdmlhIGluYy4KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqLworI2luY2x1ZGUgInNvYXBILmgiCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK1NPQVBfU09VUkNFX1NUQU1QKCJAKCMpIHNvYXBDbGllbnQuYyB2ZXIgMi4zIDIwMDMtMDYtMjQgMjM6MjQ6MTIgR01UIikKKworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfY2FsbF9uc19fZ2V0UXVvdGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKlVSTCwgY29uc3QgY2hhciAqYWN0aW9uLCBjaGFyICpzeW1ib2wsIGZsb2F0ICpSZXN1bHQpCit7CisJc3RydWN0IG5zX19nZXRRdW90ZSBzb2FwX3RtcF9uc19fZ2V0UXVvdGU7CisJc3RydWN0IG5zX19nZXRRdW90ZVJlc3BvbnNlICpzb2FwX3RtcF9uc19fZ2V0UXVvdGVSZXNwb25zZTsKKwlzb2FwX3RtcF9uc19fZ2V0UXVvdGUuc3ltYm9sPXN5bWJvbDsKKwlzb2FwX2JlZ2luKHNvYXApOworCXNvYXBfc2VyaWFsaXplaGVhZGVyKHNvYXApOworCXNvYXBfc2VyaWFsaXplX25zX19nZXRRdW90ZShzb2FwLCAmc29hcF90bXBfbnNfX2dldFF1b3RlKTsKKwlzb2FwX2JlZ2luX2NvdW50KHNvYXApOworCWlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisJewlzb2FwX2VudmVsb3BlX2JlZ2luX291dChzb2FwKTsKKwkJc29hcF9wdXRoZWFkZXIoc29hcCk7CisJCXNvYXBfYm9keV9iZWdpbl9vdXQoc29hcCk7CisJCXNvYXBfcHV0X25zX19nZXRRdW90ZShzb2FwLCAmc29hcF90bXBfbnNfX2dldFF1b3RlLCAibnM6Z2V0UXVvdGUiLCAiIik7CisJCXNvYXBfYm9keV9lbmRfb3V0KHNvYXApOworCQlzb2FwX2VudmVsb3BlX2VuZF9vdXQoc29hcCk7CisJfQorCWlmIChzb2FwX2Nvbm5lY3Qoc29hcCwgVVJMLCBhY3Rpb24pCisJIHx8IHNvYXBfZW52ZWxvcGVfYmVnaW5fb3V0KHNvYXApCisJIHx8IHNvYXBfcHV0aGVhZGVyKHNvYXApCisJIHx8IHNvYXBfYm9keV9iZWdpbl9vdXQoc29hcCkKKwkgfHwgc29hcF9wdXRfbnNfX2dldFF1b3RlKHNvYXAsICZzb2FwX3RtcF9uc19fZ2V0UXVvdGUsICJuczpnZXRRdW90ZSIsICIiKQorCSB8fCBzb2FwX2JvZHlfZW5kX291dChzb2FwKQorCSB8fCBzb2FwX2VudmVsb3BlX2VuZF9vdXQoc29hcCkKKyNpZm5kZWYgV0lUSF9MRUFORVIKKwkgfHwgc29hcF9wdXRhdHRhY2htZW50cyhzb2FwKQorI2VuZGlmCisJIHx8IHNvYXBfZW5kX3NlbmQoc29hcCkpCisJCXJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKwlzb2FwX2RlZmF1bHRfZmxvYXQoc29hcCwgUmVzdWx0KTsKKwlpZiAoc29hcF9iZWdpbl9yZWN2KHNvYXApCisJIHx8IHNvYXBfZW52ZWxvcGVfYmVnaW5faW4oc29hcCkKKwkgfHwgc29hcF9yZWN2X2hlYWRlcihzb2FwKQorCSB8fCBzb2FwX2JvZHlfYmVnaW5faW4oc29hcCkpCisJCXJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKwlzb2FwX3RtcF9uc19fZ2V0UXVvdGVSZXNwb25zZSA9IHNvYXBfZ2V0X25zX19nZXRRdW90ZVJlc3BvbnNlKHNvYXAsIE5VTEwsICJuczpnZXRRdW90ZVJlc3BvbnNlIiwgIm5zOmdldFF1b3RlUmVzcG9uc2UiKTsKKwlpZiAoc29hcC0+ZXJyb3IpCisJewlpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0ggJiYgc29hcC0+bGV2ZWwgPT0gMikKKwkJCXJldHVybiBzb2FwX3JlY3ZfZmF1bHQoc29hcCk7CisJCXJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKwl9CisJaWYgKHNvYXBfYm9keV9lbmRfaW4oc29hcCkKKwkgfHwgc29hcF9lbnZlbG9wZV9lbmRfaW4oc29hcCkKKyNpZm5kZWYgV0lUSF9MRUFORVIKKwkgfHwgc29hcF9nZXRhdHRhY2htZW50cyhzb2FwKQorI2VuZGlmCisJIHx8IHNvYXBfZW5kX3JlY3Yoc29hcCkpCisJCXJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKwlpZiAoc29hcF90bXBfbnNfX2dldFF1b3RlUmVzcG9uc2UtPlJlc3VsdCkKKwkJKlJlc3VsdCA9ICpzb2FwX3RtcF9uc19fZ2V0UXVvdGVSZXNwb25zZS0+UmVzdWx0OworCXJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKK30KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKy8qIGVuZCBvZiBzb2FwQ2xpZW50LmMgKi8KZGlmZiAtLWdpdCBhL3NhbXBsZXMvcXVvdGVfTUFDX1Byb2pCdWlsZC9zb2FwU2VydmVyLmMgYi9zYW1wbGVzL3F1b3RlX01BQ19Qcm9qQnVpbGQvc29hcFNlcnZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMTVjOTQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3F1b3RlX01BQ19Qcm9qQnVpbGQvc29hcFNlcnZlci5jCkBAIC0wLDAgKzEsOTAgQEAKKy8qIHNvYXBTZXJ2ZXIuYworICAgR2VuZXJhdGVkIGJ5IGdTT0FQIDIuMyBmcm9tIHF1b3RlLmgKKyAgIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIEdlbml2aWEgaW5jLgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyovCisjaW5jbHVkZSAic29hcEguaCIKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworU09BUF9TT1VSQ0VfU1RBTVAoIkAoIykgc29hcFNlcnZlci5jIHZlciAyLjMgMjAwMy0wNi0yNCAyMzoyNDoxMiBHTVQiKQorCisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZXJ2ZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKwl1bnNpZ25lZCBpbnQgbiA9IFNPQVBfTUFYS0VFUEFMSVZFOworCWRvCisJewlzb2FwX2JlZ2luKHNvYXApOworCQlpZiAoIS0tbikKKwkJCXNvYXAtPmtlZXBfYWxpdmUgPSAwOworCQlpZiAoc29hcF9iZWdpbl9yZWN2KHNvYXApKQorCQl7CWlmIChzb2FwLT5lcnJvciA8IFNPQVBfU1RPUCkKKwkJCQlyZXR1cm4gc29hcF9zZW5kX2ZhdWx0KHNvYXApOworCQkJZWxzZQorCQkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzb2FwX2VudmVsb3BlX2JlZ2luX2luKHNvYXApIHx8IHNvYXBfcmVjdl9oZWFkZXIoc29hcCkgfHwgc29hcF9ib2R5X2JlZ2luX2luKHNvYXApKQorCQkJcmV0dXJuIHNvYXBfc2VuZF9mYXVsdChzb2FwKTsKKwkJc29hcC0+ZXJyb3IgPSBzb2FwX3NlcnZlX25zX19nZXRRdW90ZShzb2FwKTsKKwkJaWYgKHNvYXAtPmVycm9yKQorCQkJcmV0dXJuIHNvYXBfc2VuZF9mYXVsdChzb2FwKTsKKwl9IHdoaWxlIChzb2FwLT5rZWVwX2FsaXZlKTsKKwlyZXR1cm4gU09BUF9PSzsKK30KKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NlcnZlX25zX19nZXRRdW90ZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sJc3RydWN0IG5zX19nZXRRdW90ZSBzb2FwX3RtcF9uc19fZ2V0UXVvdGU7CisJc3RydWN0IG5zX19nZXRRdW90ZVJlc3BvbnNlIHNvYXBfdG1wX25zX19nZXRRdW90ZVJlc3BvbnNlOworCWZsb2F0IHNvYXBfdG1wX2Zsb2F0OworCXNvYXBfZGVmYXVsdF9uc19fZ2V0UXVvdGVSZXNwb25zZShzb2FwLCAmc29hcF90bXBfbnNfX2dldFF1b3RlUmVzcG9uc2UpOworCXNvYXBfZGVmYXVsdF9mbG9hdChzb2FwLCAmc29hcF90bXBfZmxvYXQpOworCXNvYXBfdG1wX25zX19nZXRRdW90ZVJlc3BvbnNlLlJlc3VsdCA9ICZzb2FwX3RtcF9mbG9hdDsKKwlzb2FwX2RlZmF1bHRfbnNfX2dldFF1b3RlKHNvYXAsICZzb2FwX3RtcF9uc19fZ2V0UXVvdGUpOworCXNvYXBfZ2V0X25zX19nZXRRdW90ZShzb2FwLCAmc29hcF90bXBfbnNfX2dldFF1b3RlLCAibnM6Z2V0UXVvdGUiLCBOVUxMKTsKKwlpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0ggJiYgc29hcC0+bGV2ZWwgPT0gMikKKwkJc29hcC0+ZXJyb3IgPSBTT0FQX05PX01FVEhPRDsKKwlpZiAoc29hcC0+ZXJyb3IpCisJCXJldHVybiBzb2FwLT5lcnJvcjsKKwkKKwlpZiAoc29hcF9ib2R5X2VuZF9pbihzb2FwKQorCSB8fCBzb2FwX2VudmVsb3BlX2VuZF9pbihzb2FwKQorI2lmbmRlZiBXSVRIX0xFQU5FUgorCSB8fCBzb2FwX2dldGF0dGFjaG1lbnRzKHNvYXApCisjZW5kaWYKKwkgfHwgc29hcF9lbmRfcmVjdihzb2FwKSkKKwkJcmV0dXJuIHNvYXAtPmVycm9yOworCXNvYXAtPmVycm9yID0gbnNfX2dldFF1b3RlKHNvYXAsIHNvYXBfdG1wX25zX19nZXRRdW90ZS5zeW1ib2wsICZzb2FwX3RtcF9mbG9hdCk7CisJaWYgKHNvYXAtPmVycm9yKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJc29hcF9zZXJpYWxpemVoZWFkZXIoc29hcCk7CisJc29hcF9zZXJpYWxpemVfbnNfX2dldFF1b3RlUmVzcG9uc2Uoc29hcCwgJnNvYXBfdG1wX25zX19nZXRRdW90ZVJlc3BvbnNlKTsKKwlzb2FwX2JlZ2luX2NvdW50KHNvYXApOworCWlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisJewlzb2FwX2VudmVsb3BlX2JlZ2luX291dChzb2FwKTsKKwkJc29hcF9wdXRoZWFkZXIoc29hcCk7CisJCXNvYXBfYm9keV9iZWdpbl9vdXQoc29hcCk7CisJCXNvYXBfcHV0X25zX19nZXRRdW90ZVJlc3BvbnNlKHNvYXAsICZzb2FwX3RtcF9uc19fZ2V0UXVvdGVSZXNwb25zZSwgIm5zOmdldFF1b3RlUmVzcG9uc2UiLCAiIik7CisJCXNvYXBfYm9keV9lbmRfb3V0KHNvYXApOworCQlzb2FwX2VudmVsb3BlX2VuZF9vdXQoc29hcCk7CisJfTsKKwlpZiAoc29hcF9yZXNwb25zZShzb2FwLCBTT0FQX09LKQorCSB8fCBzb2FwX2VudmVsb3BlX2JlZ2luX291dChzb2FwKQorCSB8fCBzb2FwX3B1dGhlYWRlcihzb2FwKQorCSB8fCBzb2FwX2JvZHlfYmVnaW5fb3V0KHNvYXApCisJIHx8IHNvYXBfcHV0X25zX19nZXRRdW90ZVJlc3BvbnNlKHNvYXAsICZzb2FwX3RtcF9uc19fZ2V0UXVvdGVSZXNwb25zZSwgIm5zOmdldFF1b3RlUmVzcG9uc2UiLCAiIikKKwkgfHwgc29hcF9ib2R5X2VuZF9vdXQoc29hcCkKKwkgfHwgc29hcF9lbnZlbG9wZV9lbmRfb3V0KHNvYXApCisjaWZuZGVmIFdJVEhfTEVBTkVSCisJIHx8IHNvYXBfcHV0YXR0YWNobWVudHMoc29hcCkKKyNlbmRpZgorCSB8fCBzb2FwX2VuZF9zZW5kKHNvYXApKQorCQlyZXR1cm4gc29hcC0+ZXJyb3I7CisJc29hcF9jbG9zZXNvY2soc29hcCk7CisJcmV0dXJuIFNPQVBfT0s7Cit9CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisvKiBlbmQgb2Ygc29hcFNlcnZlci5jICovCmRpZmYgLS1naXQgYS9zYW1wbGVzL3F1b3RlX01BQ19Qcm9qQnVpbGQvc3Rkc29hcDIuYyBiL3NhbXBsZXMvcXVvdGVfTUFDX1Byb2pCdWlsZC9zdGRzb2FwMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZWQ0NjAKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3F1b3RlX01BQ19Qcm9qQnVpbGQvc3Rkc29hcDIuYwpAQCAtMCwwICsxLDEzNDQ4IEBACisvKgorCitzdGRzb2FwMi5jW3BwXSAyLjcuNmUKKworZ1NPQVAgcnVudGltZQorCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHBhcnQgb2YgdGhlIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2VzOgorR1BMLCB0aGUgZ1NPQVAgcHVibGljIGxpY2Vuc2UsIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDb250cmlidXRvcnM6CisKK1dpbmQgUml2ZXIgU3lzdGVtcyBJbmMuLCBmb3IgdGhlIGZvbGxvd2luZyBhZGRpdGlvbnMgdW5kZXIgZ1NPQVAgcHVibGljIGxpY2Vuc2U6CisgIC0gdnhXb3JrcyBjb21wYXRpYmxlCSgjZGVmaW5lIFZYV09SS1MpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgcHVibGljIGxpY2Vuc2UuCisKK1RoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGdTT0FQIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4zCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKK0xpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoraHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL3NvYXBsaWNlbnNlLmh0bWwKK1NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCitXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKK2ZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK1RoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4uCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJbnN0YWxsYXRpb24gbm90ZToKKworV2luMzIgYnVpbGQgbmVlZHMgd2luc29jay5kbGwgKFZpc3VhbCBDKysgIndzb2NrMzIubGliIikKK1RvIGRvIHRoaXMgaW4gVmlzdWFsIEMrKyA2LjAsIGdvIHRvICJQcm9qZWN0IiwgInNldHRpbmdzIiwgc2VsZWN0IHRoZSAiTGluayIKK3RhYiAodGhlIHByb2plY3QgZmlsZSBuZWVkcyB0byBiZSBzZWxlY3RlZCBpbiB0aGUgZmlsZSB2aWV3KSBhbmQgYWRkCisid3NvY2szMi5saWIiIHRvIHRoZSAiT2JqZWN0L2xpYnJhcnkgbW9kdWxlcyIgZW50cnkKKworT24gTWFjIE9TIFggd2l0aCBnY2MgKEdDQykgMy4xIDIwMDIwNDIwIChwcmVyZWxlYXNlKSB5b3UgTVVTVCBjb21waWxlIHdpdGgKKy1mc3RhY2tfY2hlY2sgd2hlbiB1c2luZyAtTzIgYmVjYXVzZSBnY2MgMy4xIGhhcyBhIGJ1ZyB0aGF0IHNtYXNoZXMgdGhlIHN0YWNrCit3aGVuIGxvY2FsbHkgYWxsb2NhdGVkIGRhdGEgZXhjZWVkcyA2NEsuCisKKyovCisKKyNpZmRlZiBBUzQwMAorIyBwcmFnbWEgY29udmVydCg4MTkpCS8qIEVCQ0RJQyB0byBBU0NJSSAqLworI2VuZGlmCisKKyNpbmNsdWRlICJzdGRzb2FwMi5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK1NPQVBfU09VUkNFX1NUQU1QKCJAKCMpIHN0ZHNvYXAyLmNwcCB2ZXIgMi43LjZlIDIwMDYtMDItMTggMTI6MDA6MDAgR01UIikKK2V4dGVybiAiQyIgeworI2Vsc2UKK1NPQVBfU09VUkNFX1NUQU1QKCJAKCMpIHN0ZHNvYXAyLmMgdmVyIDIuNy42ZSAyMDA2LTAyLTE4IDEyOjAwOjAwIEdNVCIpCisjZW5kaWYKKworLyogOGJpdCBjaGFyYWN0ZXIgcmVwcmVzZW50aW5nIHVua25vd24vbm9ucmVwcmVzZW50YWJsZSBjaGFyYWN0ZXIgZGF0YSAoZS5nLiBub3Qgc3VwcG9ydGVkIGJ5IGN1cnJlbnQgbG9jYWxlIHdpdGggbXVsdGlieXRlIHN1cHBvcnQgZW5hYmxlZCkgKi8KKyNpZm5kZWYgU09BUF9VTktOT1dOX0NIQVIKKyNkZWZpbmUgU09BUF9VTktOT1dOX0NIQVIgKDEyNykKKyNlbmRpZgorCisvKiAgICAgIEVPRj0tMSAqLworI2RlZmluZSBTT0FQX0xUIChzb2FwX3djaGFyKSgtMikgLyogWE1MIGNoYXJhY3RlciAnPCcgKi8KKyNkZWZpbmUgU09BUF9UVCAoc29hcF93Y2hhcikoLTMpIC8qIFhNTCBjaGFyYWN0ZXIgJzwvJyAqLworI2RlZmluZSBTT0FQX0dUIChzb2FwX3djaGFyKSgtNCkgLyogWE1MIGNoYXJhY3RlciAnPicgKi8KKyNkZWZpbmUgU09BUF9RVCAoc29hcF93Y2hhcikoLTUpIC8qIFhNTCBjaGFyYWN0ZXIgJyInICovCisjZGVmaW5lIFNPQVBfQVAgKHNvYXBfd2NoYXIpKC02KSAvKiBYTUwgY2hhcmFjdGVyICcnJyAqLworCisjZGVmaW5lIHNvYXBfYmxhbmsoYykJCSgoYykgPj0gMCAmJiAoYykgPD0gMzIpCisjZGVmaW5lIHNvYXBfbm90YmxhbmsoYykJKChjKSA+IDMyKQorI2RlZmluZSBzb2FwX2hhc2hfcHRyKHApCSgoKHVuc2lnbmVkIGxvbmcpKHApID4+IDMpICYgKFNPQVBfUFRSSEFTSCAtIDEpKQorCisjaWZkZWYgU09BUF9ERUJVRworc3RhdGljIHZvaWQgc29hcF9pbml0X2xvZ3Moc3RydWN0IHNvYXAqKTsKK3N0YXRpYyB2b2lkIHNvYXBfY2xvc2VfbG9nZmlsZShzdHJ1Y3Qgc29hcCosIGludCk7CitzdGF0aWMgdm9pZCBzb2FwX3NldF9sb2dmaWxlKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKik7CitzdGF0aWMgdm9pZCBzb2FwX2ZyZWVfbWh0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgdm9pZCBzb2FwX3RyYWNrX3VubGluayhzdHJ1Y3Qgc29hcCosIGNvbnN0IHZvaWQqKTsKKyNlbmRpZgorCisjaWZuZGVmIFBBTE1fMgorc3RhdGljIGludCBzb2FwX3NldF9lcnJvcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBpbnQpOworc3RhdGljIGludCBzb2FwX2NvcHlfZmF1bHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitzdGF0aWMgaW50IHNvYXBfZ2V0YXR0cnZhbChzdHJ1Y3Qgc29hcCosIGNoYXIqLCBzaXplX3QsIHNvYXBfd2NoYXIpOworI2VuZGlmCisKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc29hcF93Y2hhciBzb2FwX2NoYXIoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBzb2FwX3djaGFyIHNvYXBfZ2V0X3BpKHN0cnVjdCBzb2FwKik7CitzdGF0aWMgaW50IHNvYXBfaXN4ZGlnaXQoaW50KTsKK3N0YXRpYyB2b2lkICpmcGx1Z2luKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworI2lmbmRlZiBXSVRIX05PSURSRUYKK3N0YXRpYyB2b2lkIHNvYXBfdXBkYXRlX3B0cnMoc3RydWN0IHNvYXAqLCBjaGFyKiwgY2hhciosIGNoYXIqLCBjaGFyKik7CitzdGF0aWMgaW50IHNvYXBfaGFzX2NvcGllcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitzdGF0aWMgdm9pZCBzb2FwX2luaXRfaWh0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgdm9pZCBzb2FwX2ZyZWVfaWh0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgdm9pZCBzb2FwX2luaXRfcGh0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgdm9pZCBzb2FwX2ZyZWVfcGh0KHN0cnVjdCBzb2FwKik7CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIGNvbnN0IGNoYXIgKnNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworc3RhdGljIGludCBzb2FwX2lzbnVtZXJpYyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyB0aW1lX3Qgc29hcF90aW1lZ20oc3RydWN0IHRtKik7CitzdGF0aWMgc3RydWN0IHNvYXBfbmxpc3QgKnNvYXBfbG9va3VwX25zKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHNpemVfdCBuKTsKK3N0YXRpYyBzdHJ1Y3Qgc29hcF9ubGlzdCAqc29hcF9wdXNoX25zKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqbnMsIHNob3J0IHV0aWxpemVkKTsKK3N0YXRpYyB2b2lkIHNvYXBfcG9wX25zKHN0cnVjdCBzb2FwICpzb2FwKTsKK3N0YXRpYyB2b2lkIHNvYXBfdXRpbGl6ZV9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzaXplX3Qgbik7CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKnNvYXBfbmV3X211bHRpcGFydChzdHJ1Y3Qgc29hcCosIHN0cnVjdCBzb2FwX211bHRpcGFydCoqLCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKiwgY2hhciosIHNpemVfdCk7CitzdGF0aWMgaW50IHNvYXBfcHV0ZGltZWZpZWxkKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHNpemVfdCk7CitzdGF0aWMgY2hhciAqc29hcF9nZXRkaW1lZmllbGQoc3RydWN0IHNvYXAqLCBzaXplX3QpOworc3RhdGljIHZvaWQgc29hcF9zZWxlY3RfbWltZV9ib3VuZGFyeShzdHJ1Y3Qgc29hcCopOworc3RhdGljIGludCBzb2FwX3ZhbGlkX21pbWVfYm91bmRhcnkoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBpbnQgc29hcF9tYXRjaF9jaWQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworc3RhdGljIHZvaWQgc29hcF9yZXNvbHZlX2F0dGFjaG1lbnQoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBXSVRIX0daSVAKK3N0YXRpYyBpbnQgc29hcF9nZXRnemlwaGRyKHN0cnVjdCBzb2FwKik7CisjZW5kaWYKKworI2lmZGVmIFdJVEhfT1BFTlNTTAorc3RhdGljIGludCBzc2xfaW5pdF9kb25lID0gMDsKK3N0YXRpYyBpbnQgc3NsX2F1dGhfaW5pdChzdHJ1Y3Qgc29hcCopOworc3RhdGljIGludCBzc2xfdmVyaWZ5X2NhbGxiYWNrKGludCwgWDUwOV9TVE9SRV9DVFgqKTsKK3N0YXRpYyBpbnQgc3NsX3Bhc3N3b3JkKGNoYXIqLCBpbnQsIGludCwgdm9pZCAqKTsKK3N0YXRpYyBjb25zdCBjaGFyICpzc2xfZXJyb3Ioc3RydWN0IHNvYXAqLCBpbnQpOworLyogVGhpcyBjYWxsYmFjayBpcyBpbmNsdWRlZCBmb3IgZnV0dXJlIHJlZmVyZW5jZXMuIEl0IHNob3VsZCBub3QgYmUgZGVsZXRlZAorc3RhdGljIERIICpzc2xfdG1wX2RoKFNTTCosIGludCwgaW50KTsKKyovCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFdJVEhfTk9IVFRQKSB8fCAhZGVmaW5lZChXSVRIX0xFQU5FUikKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY29uc3QgY2hhciAqc29hcF9kZWNvZGUoY2hhciosIHNpemVfdCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc29hcF93Y2hhciBzb2FwX2dldGNodW5rY2hhcihzdHJ1Y3Qgc29hcCopOworc3RhdGljIGNvbnN0IGNoYXIgKmh0dHBfZXJyb3Ioc3RydWN0IHNvYXAqLCBpbnQpOworc3RhdGljIGludCBodHRwX3Bvc3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworc3RhdGljIGludCBodHRwX2dldChzdHJ1Y3Qgc29hcCopOworc3RhdGljIGludCBodHRwX3NlbmRfaGVhZGVyKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworc3RhdGljIGludCBodHRwX3Bvc3RfaGVhZGVyKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyBpbnQgaHR0cF9yZXNwb25zZShzdHJ1Y3Qgc29hcCosIGludCwgc2l6ZV90KTsKK3N0YXRpYyBpbnQgaHR0cF9wYXJzZShzdHJ1Y3Qgc29hcCopOworc3RhdGljIGludCBodHRwX3BhcnNlX2hlYWRlcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQgZnNlbmQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc2l6ZV90KTsKK3N0YXRpYyBzaXplX3QgZnJlY3Yoc3RydWN0IHNvYXAqLCBjaGFyKiwgc2l6ZV90KTsKK3N0YXRpYyBpbnQgdGNwX2luaXQoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBjb25zdCBjaGFyICp0Y3BfZXJyb3Ioc3RydWN0IHNvYXAqKTsKKyNpZm5kZWYgV0lUSF9JUFY2CitzdGF0aWMgaW50IHRjcF9nZXRob3N0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqYWRkciwgc3RydWN0IGluX2FkZHIgKmluYWRkcik7CisjZW5kaWYKK3N0YXRpYyBpbnQgdGNwX2Nvbm5lY3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICplbmRwb2ludCwgY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQpOworc3RhdGljIGludCB0Y3BfYWNjZXB0KHN0cnVjdCBzb2FwKiwgaW50LCBzdHJ1Y3Qgc29ja2FkZHIqLCBpbnQqKTsKK3N0YXRpYyBpbnQgdGNwX2Rpc2Nvbm5lY3Qoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBpbnQgdGNwX2Nsb3Nlc29ja2V0KHN0cnVjdCBzb2FwKiwgU09BUF9TT0NLRVQpOworc3RhdGljIGludCB0Y3Bfc2h1dGRvd25zb2NrZXQoc3RydWN0IHNvYXAqLCBTT0FQX1NPQ0tFVCwgaW50KTsKK3N0YXRpYyBjb25zdCBjaGFyICpzb2FwX3N0cmVycm9yKHN0cnVjdCBzb2FwKik7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQQUxNKSAmJiAhZGVmaW5lZChQQUxNXzIpCit1bnNpZ25lZCBzaG9ydCBlcnJubzsKKyNlbmRpZgorCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNvbnN0IGNoYXIgc29hcF9lbnYxWzQyXSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI7CitzdGF0aWMgY29uc3QgY2hhciBzb2FwX2VuYzFbNDJdID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIjsKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfZW52Mls0MF0gPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIjsKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfZW5jMls0MF0gPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVuY29kaW5nIjsKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfcnBjWzM1XSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtcnBjIjsKKyNlbmRpZgorCisjaWZuZGVmIFBBTE1fMQorY29uc3Qgc3RydWN0IHNvYXBfZG91YmxlX25hbiBzb2FwX2RvdWJsZV9uYW4gPSB7MHhGRkZGRkZGRiwgMHhGRkZGRkZGRn07CitzdGF0aWMgY29uc3QgY2hhciBzb2FwX2Jhc2U2NG9bNjVdID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOworc3RhdGljIGNvbnN0IGNoYXIgc29hcF9iYXNlNjRpWzgxXSA9ICJcNzZYWFhcNzdcNjRcNjVcNjZcNjdcNzBcNzFcNzJcNzNcNzRcNzVYWFhYWFhYXDAwXDAxXDAyXDAzXDA0XDA1XDA2XDA3XDEwXDExXDEyXDEzXDE0XDE1XDE2XDE3XDIwXDIxXDIyXDIzXDI0XDI1XDI2XDI3XDMwXDMxWFhYWFhYXDMyXDMzXDM0XDM1XDM2XDM3XDQwXDQxXDQyXDQzXDQ0XDQ1XDQ2XDQ3XDUwXDUxXDUyXDUzXDU0XDU1XDU2XDU3XDYwXDYxXDYyXDYzIjsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIGNvbnN0IGNoYXIgc29hcF9pbmRlbnRbMTFdID0gIlxuXHRcdFx0XHRcdFx0XHRcdFx0IjsKKy8qIEFsdGVybmF0aXZlIGluZGVudGF0aW9uIGZvcm0gZm9yIFNPQVBfWE1MX0lOREVOVDoKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfaW5kZW50WzIxXSA9ICJcbiAgICAgICAgICAgICAgICAgICAiOworKi8KKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciBzb2FwX3BhZGRpbmdbNF0gPSAiXDBcMFwwIjsKKyNkZWZpbmUgU09BUF9TVFJfUEFERElORyAoc29hcF9wYWRkaW5nKQorI2RlZmluZSBTT0FQX1NUUl9FT1MgKHNvYXBfcGFkZGluZykKKyNkZWZpbmUgU09BUF9OT05fTlVMTCAoc29hcF9wYWRkaW5nKQorCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwIGh0bWxfZW50aXR5X2NvZGVzW10gPSAvKiBlbnRpdGllcyBmb3IgWEhUTUwgcGFyc2luZyAqLworeyB7IDE2MCwgIm5ic3AiIH0sCisgIHsgMTYxLCAiaWV4Y2wiIH0sCisgIHsgMTYyLCAiY2VudCIgfSwKKyAgeyAxNjMsICJwb3VuZCIgfSwKKyAgeyAxNjQsICJjdXJyZW4iIH0sCisgIHsgMTY1LCAieWVuIiB9LAorICB7IDE2NiwgImJydmJhciIgfSwKKyAgeyAxNjcsICJzZWN0IiB9LAorICB7IDE2OCwgInVtbCIgfSwKKyAgeyAxNjksICJjb3B5IiB9LAorICB7IDE3MCwgIm9yZGYiIH0sCisgIHsgMTcxLCAibGFxdW8iIH0sCisgIHsgMTcyLCAibm90IiB9LAorICB7IDE3MywgInNoeSIgfSwKKyAgeyAxNzQsICJyZWciIH0sCisgIHsgMTc1LCAibWFjciIgfSwKKyAgeyAxNzYsICJkZWciIH0sCisgIHsgMTc3LCAicGx1c21uIiB9LAorICB7IDE3OCwgInN1cDIiIH0sCisgIHsgMTc5LCAic3VwMyIgfSwKKyAgeyAxODAsICJhY3V0ZSIgfSwKKyAgeyAxODEsICJtaWNybyIgfSwKKyAgeyAxODIsICJwYXJhIiB9LAorICB7IDE4MywgIm1pZGRvdCIgfSwKKyAgeyAxODQsICJjZWRpbCIgfSwKKyAgeyAxODUsICJzdXAxIiB9LAorICB7IDE4NiwgIm9yZG0iIH0sCisgIHsgMTg3LCAicmFxdW8iIH0sCisgIHsgMTg4LCAiZnJhYzE0IiB9LAorICB7IDE4OSwgImZyYWMxMiIgfSwKKyAgeyAxOTAsICJmcmFjMzQiIH0sCisgIHsgMTkxLCAiaXF1ZXN0IiB9LAorICB7IDE5MiwgIkFncmF2ZSIgfSwKKyAgeyAxOTMsICJBYWN1dGUiIH0sCisgIHsgMTk0LCAiQWNpcmMiIH0sCisgIHsgMTk1LCAiQXRpbGRlIiB9LAorICB7IDE5NiwgIkF1bWwiIH0sCisgIHsgMTk3LCAiQXJpbmciIH0sCisgIHsgMTk4LCAiQUVsaWciIH0sCisgIHsgMTk5LCAiQ2NlZGlsIiB9LAorICB7IDIwMCwgIkVncmF2ZSIgfSwKKyAgeyAyMDEsICJFYWN1dGUiIH0sCisgIHsgMjAyLCAiRWNpcmMiIH0sCisgIHsgMjAzLCAiRXVtbCIgfSwKKyAgeyAyMDQsICJJZ3JhdmUiIH0sCisgIHsgMjA1LCAiSWFjdXRlIiB9LAorICB7IDIwNiwgIkljaXJjIiB9LAorICB7IDIwNywgIkl1bWwiIH0sCisgIHsgMjA4LCAiRVRIIiB9LAorICB7IDIwOSwgIk50aWxkZSIgfSwKKyAgeyAyMTAsICJPZ3JhdmUiIH0sCisgIHsgMjExLCAiT2FjdXRlIiB9LAorICB7IDIxMiwgIk9jaXJjIiB9LAorICB7IDIxMywgIk90aWxkZSIgfSwKKyAgeyAyMTQsICJPdW1sIiB9LAorICB7IDIxNSwgInRpbWVzIiB9LAorICB7IDIxNiwgIk9zbGFzaCIgfSwKKyAgeyAyMTcsICJVZ3JhdmUiIH0sCisgIHsgMjE4LCAiVWFjdXRlIiB9LAorICB7IDIxOSwgIlVjaXJjIiB9LAorICB7IDIyMCwgIlV1bWwiIH0sCisgIHsgMjIxLCAiWWFjdXRlIiB9LAorICB7IDIyMiwgIlRIT1JOIiB9LAorICB7IDIyMywgInN6bGlnIiB9LAorICB7IDIyNCwgImFncmF2ZSIgfSwKKyAgeyAyMjUsICJhYWN1dGUiIH0sCisgIHsgMjI2LCAiYWNpcmMiIH0sCisgIHsgMjI3LCAiYXRpbGRlIiB9LAorICB7IDIyOCwgImF1bWwiIH0sCisgIHsgMjI5LCAiYXJpbmciIH0sCisgIHsgMjMwLCAiYWVsaWciIH0sCisgIHsgMjMxLCAiY2NlZGlsIiB9LAorICB7IDIzMiwgImVncmF2ZSIgfSwKKyAgeyAyMzMsICJlYWN1dGUiIH0sCisgIHsgMjM0LCAiZWNpcmMiIH0sCisgIHsgMjM1LCAiZXVtbCIgfSwKKyAgeyAyMzYsICJpZ3JhdmUiIH0sCisgIHsgMjM3LCAiaWFjdXRlIiB9LAorICB7IDIzOCwgImljaXJjIiB9LAorICB7IDIzOSwgIml1bWwiIH0sCisgIHsgMjQwLCAiZXRoIiB9LAorICB7IDI0MSwgIm50aWxkZSIgfSwKKyAgeyAyNDIsICJvZ3JhdmUiIH0sCisgIHsgMjQzLCAib2FjdXRlIiB9LAorICB7IDI0NCwgIm9jaXJjIiB9LAorICB7IDI0NSwgIm90aWxkZSIgfSwKKyAgeyAyNDYsICJvdW1sIiB9LAorICB7IDI0NywgImRpdmlkZSIgfSwKKyAgeyAyNDgsICJvc2xhc2giIH0sCisgIHsgMjQ5LCAidWdyYXZlIiB9LAorICB7IDI1MCwgInVhY3V0ZSIgfSwKKyAgeyAyNTEsICJ1Y2lyYyIgfSwKKyAgeyAyNTIsICJ1dW1sIiB9LAorICB7IDI1MywgInlhY3V0ZSIgfSwKKyAgeyAyNTQsICJ0aG9ybiIgfSwKKyAgeyAyNTUsICJ5dW1sIiB9LAorICB7ICAgMCwgTlVMTCB9Cit9OworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwIGhfZXJyb3JfY29kZXNbXSA9Cit7CisjaWZkZWYgSE9TVF9OT1RfRk9VTkQgICAKKyAgeyBIT1NUX05PVF9GT1VORCwgIkhvc3Qgbm90IGZvdW5kIiB9LAorI2VuZGlmCisjaWZkZWYgVFJZX0FHQUlOCisgIHsgVFJZX0FHQUlOLCAiVHJ5IEFnYWluIiB9LAorI2VuZGlmCisjaWZkZWYgTk9fUkVDT1ZFUlkgIAorICB7IE5PX1JFQ09WRVJZLCAiTm8gUmVjb3ZlcnkiIH0sCisjZW5kaWYKKyNpZmRlZiBOT19EQVRBCisgIHsgTk9fREFUQSwgIk5vIERhdGEiIH0sCisjZW5kaWYKKyNpZmRlZiBOT19BRERSRVNTCisgIHsgTk9fQUREUkVTUywgIk5vIEFkZHJlc3MiIH0sCisjZW5kaWYKKyAgeyAwLCBOVUxMIH0KK307CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwIGhfaHR0cF9lcnJvcl9jb2Rlc1tdID0KK3sgeyAyMDEsICJDcmVhdGVkIiB9LAorICB7IDIwMiwgIkFjY2VwdGVkIiB9LAorICB7IDIwMywgIk5vbi1BdXRob3JpdGF0aXZlIEluZm9ybWF0aW9uIiB9LAorICB7IDIwNCwgIk5vIENvbnRlbnQiIH0sCisgIHsgMjA1LCAiUmVzZXQgQ29udGVudCIgfSwKKyAgeyAyMDYsICJQYXJ0aWFsIENvbnRlbnQiIH0sCisgIHsgMzAwLCAiTXVsdGlwbGUgQ2hvaWNlcyIgfSwKKyAgeyAzMDEsICJNb3ZlZCBQZXJtYW5lbnRseSIgfSwKKyAgeyAzMDIsICJGb3VuZCIgfSwKKyAgeyAzMDMsICJTZWUgT3RoZXIiIH0sCisgIHsgMzA0LCAiTm90IE1vZGlmaWVkIiB9LAorICB7IDMwNSwgIlVzZSBQcm94eSIgfSwKKyAgeyAzMDcsICJUZW1wb3JhcnkgUmVkaXJlY3QiIH0sCisgIHsgNDAwLCAiQmFkIFJlcXVlc3QiIH0sCisgIHsgNDAxLCAiVW5hdXRob3JpemVkIiB9LAorICB7IDQwMiwgIlBheW1lbnQgUmVxdWlyZWQiIH0sCisgIHsgNDAzLCAiRm9yYmlkZGVuIiB9LAorICB7IDQwNCwgIk5vdCBGb3VuZCIgfSwKKyAgeyA0MDUsICJNZXRob2QgTm90IEFsbG93ZWQiIH0sCisgIHsgNDA2LCAiTm90IEFjY2VwdGFibGUiIH0sCisgIHsgNDA3LCAiUHJveHkgQXV0aGVudGljYXRpb24gUmVxdWlyZWQiIH0sCisgIHsgNDA4LCAiUmVxdWVzdCBUaW1lLW91dCIgfSwKKyAgeyA0MDksICJDb25mbGljdCIgfSwKKyAgeyA0MTAsICJHb25lIiB9LAorICB7IDQxMSwgIkxlbmd0aCBSZXF1aXJlZCIgfSwKKyAgeyA0MTIsICJQcmVjb25kaXRpb24gRmFpbGVkIiB9LAorICB7IDQxMywgIlJlcXVlc3QgRW50aXR5IFRvbyBMYXJnZSIgfSwKKyAgeyA0MTQsICJSZXF1ZXN0LVVSSSBUb28gTGFyZ2UiIH0sCisgIHsgNDE1LCAiVW5zdXBwb3J0ZWQgTWVkaWEgVHlwZSIgfSwKKyAgeyA0MTYsICJSZXF1ZXN0ZWQgcmFuZ2Ugbm90IHNhdGlzZmlhYmxlIiB9LAorICB7IDQxNywgIkV4cGVjdGF0aW9uIEZhaWxlZCIgfSwKKyAgeyA1MDAsICJJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IiIH0sCisgIHsgNTAxLCAiTm90IEltcGxlbWVudGVkIiB9LAorICB7IDUwMiwgIkJhZCBHYXRld2F5IiB9LAorICB7IDUwMywgIlNlcnZpY2UgVW5hdmFpbGFibGUiIH0sCisgIHsgNTA0LCAiR2F0ZXdheSBUaW1lLW91dCIgfSwKKyAgeyA1MDUsICJIVFRQIFZlcnNpb24gbm90IHN1cHBvcnRlZCIgfSwKKyAgeyAgIDAsIE5VTEwgfQorfTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBXSVRIX09QRU5TU0wKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCBoX3NzbF9lcnJvcl9jb2Rlc1tdID0KK3sKKyNkZWZpbmUgX1NTTF9FUlJPUihlKSB7IGUsICNlIH0KKyAgX1NTTF9FUlJPUihTU0xfRVJST1JfU1NMKSwKKyAgX1NTTF9FUlJPUihTU0xfRVJST1JfWkVST19SRVRVUk4pLAorICBfU1NMX0VSUk9SKFNTTF9FUlJPUl9XQU5UX1JFQUQpLAorICBfU1NMX0VSUk9SKFNTTF9FUlJPUl9XQU5UX1dSSVRFKSwKKyAgX1NTTF9FUlJPUihTU0xfRVJST1JfV0FOVF9DT05ORUNUKSwKKyAgX1NTTF9FUlJPUihTU0xfRVJST1JfV0FOVF9YNTA5X0xPT0tVUCksCisgIF9TU0xfRVJST1IoU1NMX0VSUk9SX1NZU0NBTEwpLAorICB7IDAsIE5VTEwgfQorfTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTkVSCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgbWltZV9jb2Rlc1tdID0KK3sgeyBTT0FQX01JTUVfN0JJVCwJCSI3Yml0IiB9LAorICB7IFNPQVBfTUlNRV84QklULAkJIjhiaXQiIH0sCisgIHsgU09BUF9NSU1FX0JJTkFSWSwJCSJiaW5hcnkiIH0sCisgIHsgU09BUF9NSU1FX1FVT1RFRF9QUklOVEFCTEUsICJxdW90ZWQtcHJpbnRhYmxlIiB9LAorICB7IFNPQVBfTUlNRV9CQVNFNjQsCQkiYmFzZTY0IiB9LAorICB7IFNPQVBfTUlNRV9JRVRGX1RPS0VOLAkiaWV0Zi10b2tlbiIgfSwKKyAgeyBTT0FQX01JTUVfWF9UT0tFTiwJCSJ4LXRva2VuIiB9LAorICB7IDAsCQkJCU5VTEwgfQorfTsKKyNlbmRpZgorCisjaWZkZWYgV0lOMzIKK3N0YXRpYyBpbnQgdGNwX2RvbmUgPSAwOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK2ZzZW5kKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBzaXplX3QgbikKK3sgcmVnaXN0ZXIgaW50IG53cml0dGVuOworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpICYmICFkZWZpbmVkKFdJVEhfTEVBTikKKyAgaWYgKHNvYXAtPm9zKQorICB7IHNvYXAtPm9zLT53cml0ZShzLCBuKTsKKyAgICBpZiAoc29hcC0+b3MtPmdvb2QoKSkKKyAgICAgIHJldHVybiBTT0FQX09LOworICAgIHJldHVybiBTT0FQX0VPRjsKKyAgfQorI2VuZGlmCisgIHdoaWxlIChuKQorICB7IGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICAgIHsgCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgaWYgKHNvYXAtPnNlbmRfdGltZW91dCkKKyAgICAgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgICAgZmRfc2V0IGZkOworICAgICAgICBpZiAoc29hcC0+c2VuZF90aW1lb3V0ID4gMCkKKyAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IHNvYXAtPnNlbmRfdGltZW91dDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IC1zb2FwLT5zZW5kX3RpbWVvdXQvMTAwMDAwMDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAtc29hcC0+c2VuZF90aW1lb3V0JTEwMDAwMDA7CisgICAgICAgIH0KKyAgICAgICAgRkRfWkVSTygmZmQpOworICAgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJmZkKTsKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeyByZWdpc3RlciBpbnQgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCBOVUxMLCAmZmQsICZmZCwgJnRpbWVvdXQpOworICAgICAgICAgIGlmIChyID4gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGlmICghcikKKyAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IDA7CisgICAgICAgICAgICByZXR1cm4gU09BUF9FT0Y7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUFHQUlOKQorICAgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgICByZXR1cm4gU09BUF9FT0Y7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICAgIGlmIChzb2FwLT5zc2wpCisgICAgICAgIG53cml0dGVuID0gU1NMX3dyaXRlKHNvYXAtPnNzbCwgcywgbik7CisgICAgICBlbHNlIGlmIChzb2FwLT5iaW8pCisgICAgICAgIG53cml0dGVuID0gQklPX3dyaXRlKHNvYXAtPmJpbywgcywgbik7CisgICAgICBlbHNlCisjZW5kaWYKKyNpZmRlZiBXSVRIX1VEUAorICAgICAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICAgIHsgaWYgKHNvYXAtPnBlZXJsZW4pCisJICBud3JpdHRlbiA9IHNlbmR0bygoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyLCBzb2FwLT5wZWVybGVuKTsKKyAgICAgICAgZWxzZQorCSAgbndyaXR0ZW4gPSBzZW5kKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHMsIG4sIHNvYXAtPnNvY2tldF9mbGFncyk7CisJLyogcmV0cnkgYW5kIGJhY2stb2ZmIGFsZ29yaXRobSAqLworCS8qIFRPRE86IHRoaXMgaXMgbm90IHZlcnkgY2xlYXIgZnJvbSBzcGVjcyBzbyB2ZXJpZnkgYW5kIGxpbWl0IGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggd2Ugc2hvdWxkIGxvb3AgKGUuZy4gRU5PQlVGUykgKi8KKwlpZiAobndyaXR0ZW4gPCAwKQorICAgICAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICAgICAgZmRfc2V0IGZkOworCSAgaW50IHVkcF9yZXBlYXQ7CisJICBpbnQgdWRwX2RlbGF5OworICAgICAgICAgIGlmICgoc29hcC0+Y29ubmVjdF9mbGFncyAmIFNPX0JST0FEQ0FTVCkpCisJICAgIHVkcF9yZXBlYXQgPSAzOyAvKiBTT0FQLW92ZXItVURQIE1VTFRJQ0FTVF9VRFBfUkVQRUFUIC0gMSAqLworICAgICAgICAgIGVsc2UKKwkgICAgdWRwX3JlcGVhdCA9IDE7IC8qIFNPQVAtb3Zlci1VRFAgVU5JQ0FTVF9VRFBfUkVQRUFUIC0gMSAqLworCSAgdWRwX2RlbGF5ID0gKHNvYXBfcmFuZG9tICUgMjAxKSArIDUwOyAvKiBVRFBfTUlOX0RFTEFZIC4uIFVEUF9NQVhfREVMQVkgKi8KKwkgIGRvCisgICAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IDA7CisgICAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAxMDAwICogdWRwX2RlbGF5OyAvKiBtcyAqLworICAgICAgICAgICAgRkRfWkVSTygmZmQpOworICAgICAgICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZmZCk7CisgICAgICAgICAgICBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgTlVMTCwgTlVMTCwgJmZkLCAmdGltZW91dCk7CisJICAgIGlmIChzb2FwLT5wZWVybGVuKQorCSAgICAgIG53cml0dGVuID0gc2VuZHRvKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHMsIG4sIHNvYXAtPnNvY2tldF9mbGFncywgKHN0cnVjdCBzb2NrYWRkciopJnNvYXAtPnBlZXIsIHNvYXAtPnBlZXJsZW4pOworICAgICAgICAgICAgZWxzZQorCSAgICAgIG53cml0dGVuID0gc2VuZCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MpOworCSAgICB1ZHBfZGVsYXkgPDw9IDE7CisJICAgIGlmICh1ZHBfZGVsYXkgPiA1MDApIC8qIFVEUF9VUFBFUl9ERUxBWSAqLworCSAgICAgIHVkcF9kZWxheSA9IDUwMDsKKwkgIH0KKwkgIHdoaWxlIChud3JpdHRlbiA8IDAgJiYgLS11ZHBfcmVwZWF0ID4gMCk7CisJfQorICAgICAgfQorICAgICAgZWxzZQorI2VuZGlmCisjaWYgIWRlZmluZWQoUEFMTSkgJiYgIWRlZmluZWQoQVM0MDApCisgICAgICAgIG53cml0dGVuID0gc2VuZCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MpOworI2Vsc2UKKyAgICAgICAgbndyaXR0ZW4gPSBzZW5kKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICh2b2lkKilzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MpOworI2VuZGlmCisgICAgICBpZiAobndyaXR0ZW4gPD0gMCkKKyAgICAgIHsKKyNpZmRlZiBXSVRIX09QRU5TU0wKKwlpbnQgZXJyOworICAgICAgICBpZiAoc29hcC0+c3NsICYmIChlcnIgPSBTU0xfZ2V0X2Vycm9yKHNvYXAtPnNzbCwgbndyaXR0ZW4pKSAhPSBTU0xfRVJST1JfTk9ORSAmJiBlcnIgIT0gU1NMX0VSUk9SX1dBTlRfUkVBRCAmJiBlcnIgIT0gU1NMX0VSUk9SX1dBTlRfV1JJVEUpCisgICAgICAgICAgcmV0dXJuIFNPQVBfRU9GOworI2VuZGlmCisgICAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRVdPVUxEQkxPQ0sgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FQUdBSU4pCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgcmV0dXJuIFNPQVBfRU9GOworICAgICAgICB9CisgICAgICAgIG53cml0dGVuID0gMDsgLyogYW5kIGNhbGwgd3JpdGUoKSBhZ2FpbiAqLworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworI2lmZGVmIFdJVEhfRkFTVENHSQorICAgICAgbndyaXR0ZW4gPSBmd3JpdGUoKHZvaWQqKXMsIDEsIG4sIHN0ZG91dCk7CisgICAgICBmZmx1c2goc3Rkb3V0KTsKKyNlbHNlCisjaWZkZWYgVU5ERVJfQ0UKKyAgICAgIG53cml0dGVuID0gZndyaXRlKHMsIDEsIG4sIHNvYXAtPnNlbmRmZCk7CisjZWxzZQorI2lmZGVmIFZYV09SS1MKKyNpZmRlZiBXTVdfUlBNX0lPCisgICAgICBpZiAoc29hcC0+cnBtcmVxaWQpCisgICAgICAgIG53cml0dGVuID0gKGh0dHBCbG9ja1B1dChzb2FwLT5ycG1yZXFpZCwgcywgbikgPT0gMCkgPyBuIDogLTE7IAorICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgIG53cml0dGVuID0gZndyaXRlKHMsIHNpemVvZihjaGFyKSwgbiwgZmRvcGVuKHNvYXAtPnNlbmRmZCwgInciKSk7CisjZWxzZQorICAgICAgbndyaXR0ZW4gPSB3cml0ZSgoU09BUF9TT0NLRVQpc29hcC0+c2VuZGZkLCBzLCBuKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyAgICAgIGlmIChud3JpdHRlbiA8PSAwKQorICAgICAgeyBpZiAoc29hcF9lcnJubyAhPSBTT0FQX0VJTlRSICYmIHNvYXBfZXJybm8gIT0gU09BUF9FV09VTERCTE9DSyAmJiBzb2FwX2Vycm5vICE9IFNPQVBfRUFHQUlOKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfZXJybm87CisgICAgICAgICAgcmV0dXJuIFNPQVBfRU9GOworICAgICAgICB9CisgICAgICAgIG53cml0dGVuID0gMDsgLyogYW5kIGNhbGwgd3JpdGUoKSBhZ2FpbiAqLworICAgICAgfQorICAgIH0KKyAgICBuIC09IG53cml0dGVuOworICAgIHMgKz0gbndyaXR0ZW47CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZW5kX3JhdyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgc2l6ZV90IG4pCit7IGlmICghbikKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgeyBzb2FwLT5jb3VudCArPSBuOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICAgIGlmIChzb2FwLT5mcHJlcGFyZXNlbmQgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSAhPSBTT0FQX0lPX1NUT1JFKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gc29hcC0+ZnByZXBhcmVzZW5kKHNvYXAsIHMsIG4pOworI2VuZGlmCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKQorICB7IHJlZ2lzdGVyIHNpemVfdCBpID0gU09BUF9CVUZMRU4gLSBzb2FwLT5idWZpZHg7CisgICAgd2hpbGUgKG4gPj0gaSkKKyAgICB7IG1lbWNweShzb2FwLT5idWYgKyBzb2FwLT5idWZpZHgsIHMsIGkpOworICAgICAgc29hcC0+YnVmaWR4ID0gU09BUF9CVUZMRU47CisgICAgICBpZiAoc29hcF9mbHVzaChzb2FwKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgcyArPSBpOworICAgICAgbiAtPSBpOworICAgICAgaSA9IFNPQVBfQlVGTEVOOworICAgIH0KKyAgICBtZW1jcHkoc29hcC0+YnVmICsgc29hcC0+YnVmaWR4LCBzLCBuKTsKKyAgICBzb2FwLT5idWZpZHggKz0gbjsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICByZXR1cm4gc29hcF9mbHVzaF9yYXcoc29hcCwgcywgbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZmx1c2goc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBuID0gc29hcC0+YnVmaWR4OworICBpZiAobikKKyAgeyBzb2FwLT5idWZpZHggPSAwOworI2lmZGVmIFdJVEhfWkxJQgorICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQikKKyAgICB7IHNvYXAtPmRfc3RyZWFtLm5leHRfaW4gPSAoQnl0ZSopc29hcC0+YnVmOworICAgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4gPSAodW5zaWduZWQgaW50KW47CisjaWZkZWYgV0lUSF9HWklQCisgICAgICBzb2FwLT56X2NyYyA9IGNyYzMyKHNvYXAtPnpfY3JjLCAoQnl0ZSopc29hcC0+YnVmLCAodW5zaWduZWQgaW50KW4pOworI2VuZGlmCisgICAgICBkbworICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlZmxhdGluZyAldSBieXRlc1xuIiwgc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4pKTsKKyAgICAgICAgaWYgKGRlZmxhdGUoJnNvYXAtPmRfc3RyZWFtLCBaX05PX0ZMVVNIKSAhPSBaX09LKQorICAgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVW5hYmxlIHRvIGRlZmxhdGU6ICVzXG4iLCBzb2FwLT5kX3N0cmVhbS5tc2c/c29hcC0+ZF9zdHJlYW0ubXNnOiIiKSk7CisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGlmICghc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0KQorICAgICAgICB7IGlmIChzb2FwX2ZsdXNoX3Jhdyhzb2FwLCBzb2FwLT56X2J1ZiwgU09BUF9CVUZMRU4pKQorICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gKEJ5dGUqKXNvYXAtPnpfYnVmOworICAgICAgICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCA9IFNPQVBfQlVGTEVOOworICAgICAgICB9CisgICAgICB9IHdoaWxlIChzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbik7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgICAgcmV0dXJuIHNvYXBfZmx1c2hfcmF3KHNvYXAsIHNvYXAtPmJ1Ziwgbik7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZmx1c2hfcmF3KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBzaXplX3QgbikKK3sgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19TVE9SRSkKKyAgeyByZWdpc3RlciBjaGFyICp0OworICAgIGlmICghKHQgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIG4pKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIG1lbWNweSh0LCBzLCBuKTsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgICBpZiAoc29hcC0+ZnByZXBhcmVzZW5kKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gc29hcC0+ZnByZXBhcmVzZW5kKHNvYXAsIHMsIG4pOworI2VuZGlmCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgeyBjaGFyIHRbMTZdOworICAgIHNwcmludGYodCwgIlxyXG4lbFhcclxuIiArIChzb2FwLT5jaHVua3NpemUgPyAwIDogMiksICh1bnNpZ25lZCBsb25nKW4pOworICAgIERCR01TRyhTRU5ULCB0LCBzdHJsZW4odCkpOworICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mc2VuZChzb2FwLCB0LCBzdHJsZW4odCkpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBzb2FwLT5jaHVua3NpemUgKz0gbjsKKyAgfQorICBEQkdNU0coU0VOVCwgcywgbik7CisjZW5kaWYKKyAgcmV0dXJuIHNvYXAtPmVycm9yID0gc29hcC0+ZnNlbmQoc29hcCwgcywgbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2VuZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcykKK3sgaWYgKHMpCisgICAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgcywgc3RybGVuKHMpKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2VuZDIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMikKK3sgaWYgKHNvYXBfc2VuZChzb2FwLCBzMSkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9zZW5kKHNvYXAsIHMyKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmQzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIGNvbnN0IGNoYXIgKnMzKQoreyBpZiAoc29hcF9zZW5kKHNvYXAsIHMxKQorICAgfHwgc29hcF9zZW5kKHNvYXAsIHMyKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX3NlbmQoc29hcCwgczMpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHNpemVfdAorZnJlY3Yoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnMsIHNpemVfdCBuKQoreyByZWdpc3RlciBpbnQgcjsKKyAgc29hcC0+ZXJybnVtID0gMDsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiAhZGVmaW5lZChXSVRIX0xFQU4pCisgIGlmIChzb2FwLT5pcykKKyAgeyBpZiAoc29hcC0+aXMtPmdvb2QoKSkKKyAgICAgIHJldHVybiBzb2FwLT5pcy0+cmVhZChzLCBuKS5nY291bnQoKTsKKyAgICByZXR1cm4gMDsKKyAgfQorI2VuZGlmCisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICB7IGZvciAoOzspCisgICAgeyAKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICBpZiAoc29hcC0+cmVjdl90aW1lb3V0KQorICAgICAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgICAgICBmZF9zZXQgZmQ7CisgICAgICAgIGlmIChzb2FwLT5yZWN2X3RpbWVvdXQgPiAwKQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gc29hcC0+cmVjdl90aW1lb3V0OworICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gLXNvYXAtPnJlY3ZfdGltZW91dC8xMDAwMDAwOworICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IC1zb2FwLT5yZWN2X3RpbWVvdXQlMTAwMDAwMDsKKyAgICAgICAgfQorICAgICAgICBGRF9aRVJPKCZmZCk7CisgICAgICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmZmQpOworICAgICAgICBmb3IgKDs7KQorICAgICAgICB7IHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgJmZkLCBOVUxMLCAmZmQsICZ0aW1lb3V0KTsKKyAgICAgICAgICBpZiAociA+IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBpZiAoIXIpCisJICB7IHNvYXAtPmVycm51bSA9IDA7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FQUdBSU4pCisJICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICAgIGlmIChzb2FwLT5zc2wpCisgICAgICB7IGludCBlcnI7CisJciA9IFNTTF9yZWFkKHNvYXAtPnNzbCwgcywgbik7CisgICAgICAgIGlmIChyID4gMCkKKyAgICAgICAgICByZXR1cm4gKHNpemVfdClyOworCWVyciA9IFNTTF9nZXRfZXJyb3Ioc29hcC0+c3NsLCByKTsKKwlpZiAoZXJyICE9IFNTTF9FUlJPUl9OT05FICYmIGVyciAhPSBTU0xfRVJST1JfV0FOVF9SRUFEICYmIGVyciAhPSBTU0xfRVJST1JfV0FOVF9XUklURSkKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHNvYXAtPmJpbykKKyAgICAgIHsgciA9IEJJT19yZWFkKHNvYXAtPmJpbywgcywgbik7CisgICAgICAgIGlmIChyID4gMCkKKyAgICAgICAgICByZXR1cm4gKHNpemVfdClyOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgeyAKKyNpZmRlZiBXSVRIX1VEUAorICAgICAgICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgICAgICB7IFNPQVBfU09DS0xFTl9UIGsgPSAoU09BUF9TT0NLTEVOX1Qpc2l6ZW9mKHNvYXAtPnBlZXIpOworCSAgbWVtc2V0KCh2b2lkKikmc29hcC0+cGVlciwgMCwgc2l6ZW9mKHNvYXAtPnBlZXIpKTsKKyAgICAgICAgICByID0gcmVjdmZyb20oKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgcywgbiwgc29hcC0+c29ja2V0X2ZsYWdzLCAoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlciwgJmspOwkvKiBwb3J0YWJpbGl0eSBub3RlOiBzZWUgU09BUF9TT0NLTEVOX1QgZGVmaW5pdGlvbiBpbiBzdGRzb2FwMi5oICovCisJICBzb2FwLT5wZWVybGVuID0gKHNpemVfdClrOworI2lmbmRlZiBXSVRIX0lQVjYKKyAgICAgICAgICBzb2FwLT5pcCA9IG50b2hsKHNvYXAtPnBlZXIuc2luX2FkZHIuc19hZGRyKTsKKyAgICAgICAgICBzb2FwLT5wb3J0ID0gKGludCludG9ocyhzb2FwLT5wZWVyLnNpbl9wb3J0KTsKKyNlbmRpZgorICAgICAgICB9CisJZWxzZQorI2VuZGlmCisgICAgICAgICAgciA9IHJlY3YoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgcywgbiwgc29hcC0+c29ja2V0X2ZsYWdzKTsKKyAgICAgICAgaWYgKHIgPj0gMCkKKyAgICAgICAgICByZXR1cm4gKHNpemVfdClyOworICAgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUiAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VBR0FJTiAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VXT1VMREJMT0NLKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICB9CisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgICAgICBmZF9zZXQgZmQ7CisgICAgICAgIHRpbWVvdXQudHZfc2VjID0gMDsKKyAgICAgICAgdGltZW91dC50dl91c2VjID0gMTAwMDA7CisgICAgICAgIEZEX1pFUk8oJmZkKTsKKyAgICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZmZCk7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgICAgICAgIGlmIChzb2FwLT5zc2wgJiYgU1NMX2dldF9lcnJvcihzb2FwLT5zc2wsIHIpID09IFNTTF9FUlJPUl9XQU5UX1dSSVRFKQorICAgICAgICAgIHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgTlVMTCwgJmZkLCAmZmQsICZ0aW1lb3V0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgJmZkLCBOVUxMLCAmZmQsICZ0aW1lb3V0KTsKKyNlbHNlCisgICAgICAgIHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgJmZkLCBOVUxMLCAmZmQsICZ0aW1lb3V0KTsKKyNlbmRpZgorICAgICAgICBpZiAociA8IDAgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUikKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisgICAgfQorICB9CisjaWZkZWYgV0lUSF9GQVNUQ0dJCisgIHJldHVybiBmcmVhZChzLCAxLCBuLCBzdGRpbik7CisjZWxzZQorI2lmZGVmIFVOREVSX0NFCisgIHJldHVybiBmcmVhZChzLCAxLCBuLCBzb2FwLT5yZWN2ZmQpOworI2Vsc2UKKyNpZmRlZiBXTVdfUlBNX0lPCisgIGlmIChzb2FwLT5ycG1yZXFpZCkKKyAgICByID0gaHR0cEJsb2NrUmVhZChzb2FwLT5ycG1yZXFpZCwgcywgbik7CisgIGVsc2UKKyNlbmRpZgorICByID0gcmVhZCgoU09BUF9TT0NLRVQpc29hcC0+cmVjdmZkLCBzLCBuKTsKKyAgaWYgKHIgPj0gMCkKKyAgICByZXR1cm4gKHNpemVfdClyOworICBzb2FwLT5lcnJudW0gPSBzb2FwX2Vycm5vOworICByZXR1cm4gMDsKKyNlbmRpZgorI2VuZGlmCit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzb2FwX3djaGFyCitzb2FwX2dldGNodW5rY2hhcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXAtPmJ1ZmlkeCA8IHNvYXAtPmJ1ZmxlbikKKyAgICByZXR1cm4gc29hcC0+YnVmW3NvYXAtPmJ1ZmlkeCsrXTsKKyAgc29hcC0+YnVmaWR4ID0gMDsKKyAgc29hcC0+YnVmbGVuID0gc29hcC0+Y2h1bmtidWZsZW4gPSBzb2FwLT5mcmVjdihzb2FwLCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOKTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWFkICV1IGJ5dGVzIGZyb20gc29ja2V0ICVkXG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmJ1Zmxlbiwgc29hcC0+c29ja2V0KSk7CisgIERCR01TRyhSRUNWLCBzb2FwLT5idWYsIHNvYXAtPmJ1Zmxlbik7CisgIGlmIChzb2FwLT5idWZsZW4pCisgICAgcmV0dXJuIHNvYXAtPmJ1Zltzb2FwLT5idWZpZHgrK107CisgIHJldHVybiBFT0Y7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NvYXBfaXN4ZGlnaXQoaW50IGMpCit7IHJldHVybiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHx8IChjID49ICdBJyAmJiBjIDw9ICdGJykgfHwgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWN2X3JhdyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc2l6ZV90IHJldDsKKyNpZmRlZiBXSVRIX1pMSUIKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKQorICB7IGlmIChzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9PSBaX05VTEwpCisgICAgICByZXR1cm4gRU9GOworICAgIGlmIChzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbiB8fCAhc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0KQorICAgIHsgcmVnaXN0ZXIgaW50IHI7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluZmxhdGluZ1xuIikpOworICAgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZSopc29hcC0+YnVmOworICAgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0ID0gU09BUF9CVUZMRU47CisgICAgICByID0gaW5mbGF0ZSgmc29hcC0+ZF9zdHJlYW0sIFpfTk9fRkxVU0gpOworICAgICAgaWYgKHIgPT0gWl9PSyB8fCByID09IFpfU1RSRUFNX0VORCkKKyAgICAgIHsgc29hcC0+YnVmaWR4ID0gMDsKKyAgICAgICAgc29hcC0+YnVmbGVuID0gU09BUF9CVUZMRU4gLSBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQ7CisgICAgICAgIGlmIChzb2FwLT56bGliX2luID09IFNPQVBfWkxJQl9HWklQKQorICAgICAgICAgIHNvYXAtPnpfY3JjID0gY3JjMzIoc29hcC0+el9jcmMsIChCeXRlKilzb2FwLT5idWYsICh1bnNpZ25lZCBpbnQpc29hcC0+YnVmbGVuKTsKKyAgICAgICAgaWYgKHIgPT0gWl9TVFJFQU1fRU5EKQorICAgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5mbGF0ZWQgJWx1LT4lbHUgYnl0ZXNcbiIsIHNvYXAtPmRfc3RyZWFtLnRvdGFsX2luLCBzb2FwLT5kX3N0cmVhbS50b3RhbF9vdXQpKTsKKyAgICAgICAgICBzb2FwLT56X3JhdGlvX2luID0gKGZsb2F0KXNvYXAtPmRfc3RyZWFtLnRvdGFsX2luIC8gKGZsb2F0KXNvYXAtPmRfc3RyZWFtLnRvdGFsX291dDsKKyAgICAgICAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IFpfTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc29hcC0+YnVmbGVuKQorICAgICAgICB7IHNvYXAtPmNvdW50ICs9IHNvYXAtPmJ1ZmxlbjsKKyAgICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSBpZiAociAhPSBaX0JVRl9FUlJPUikKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbmZsYXRlIGVycm9yOiAlc1xuIiwgc29hcC0+ZF9zdHJlYW0ubXNnP3NvYXAtPmRfc3RyZWFtLm1zZzoiIikpOworICAgICAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IFpfTlVMTDsKKwlzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEVPRjsKKyAgICAgIH0KKyAgICB9Cit6bGliX2FnYWluOgorICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTksgJiYgIXNvYXAtPmNodW5rc2l6ZSkKKyAgICB7IG1lbWNweShzb2FwLT5idWYsIHNvYXAtPnpfYnVmLCBTT0FQX0JVRkxFTik7CisgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT56X2J1ZmxlbjsKKyAgICB9CisgIH0KKyNlbmRpZgorI2lmbmRlZiBXSVRIX05PSFRUUAorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKSAvKiByZWFkIEhUVFAgY2h1bmtlZCB0cmFuc2ZlciAqLworICB7IAorY2h1bmtfYWdhaW46CisgICAgaWYgKHNvYXAtPmNodW5rc2l6ZSkKKyAgICB7IHNvYXAtPmJ1ZmxlbiA9IHJldCA9IHNvYXAtPmZyZWN2KHNvYXAsIHNvYXAtPmJ1Ziwgc29hcC0+Y2h1bmtzaXplID4gU09BUF9CVUZMRU4gPyBTT0FQX0JVRkxFTiA6IHNvYXAtPmNodW5rc2l6ZSk7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdldHRpbmcgY2h1bms6IHJlYWQgJXUgYnl0ZXNcbiIsICh1bnNpZ25lZCBpbnQpcmV0KSk7CisgICAgICBEQkdNU0coUkVDViwgc29hcC0+YnVmLCByZXQpOworICAgICAgc29hcC0+YnVmaWR4ID0gMDsKKyAgICAgIHNvYXAtPmNodW5rc2l6ZSAtPSByZXQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgICAgIGNoYXIgKnQsIHRtcFs4XTsKKyAgICAgIHQgPSB0bXA7CisgICAgICBpZiAoIXNvYXAtPmNodW5rYnVmbGVuKQorICAgICAgeyBzb2FwLT5jaHVua2J1ZmxlbiA9IHJldCA9IHNvYXAtPmZyZWN2KHNvYXAsIHNvYXAtPmJ1ZiwgU09BUF9CVUZMRU4pOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlYWQgJXUgYnl0ZXMgKGNodW5rZWQpIGZyb20gc29ja2V0ICVkXG4iLCAodW5zaWduZWQgaW50KXJldCwgc29hcC0+c29ja2V0KSk7CisgICAgICAgIERCR01TRyhSRUNWLCBzb2FwLT5idWYsIHJldCk7CisgICAgICAgIHNvYXAtPmJ1ZmlkeCA9IDA7CisgICAgICAgIGlmICghcmV0KQorICAgICAgICAgIHJldHVybiBzb2FwLT5haGVhZCA9IEVPRjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgc29hcC0+YnVmaWR4ID0gc29hcC0+YnVmbGVuOworICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+Y2h1bmtidWZsZW47CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdldHRpbmcgY2h1bmsgc2l6ZSAoaWR4PSV1IGxlbj0ldSlcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+YnVmaWR4LCAodW5zaWduZWQgaW50KXNvYXAtPmJ1ZmxlbikpOworICAgICAgd2hpbGUgKCFzb2FwX2lzeGRpZ2l0KChpbnQpKGMgPSBzb2FwX2dldGNodW5rY2hhcihzb2FwKSkpKQorICAgICAgICBpZiAoKGludCljID09IEVPRikKKwkgIHJldHVybiBzb2FwLT5haGVhZCA9IEVPRjsKKyAgICAgIGRvCisgICAgICAgICp0KysgPSAoY2hhciljOworICAgICAgd2hpbGUgKHNvYXBfaXN4ZGlnaXQoKGludCkoYyA9IHNvYXBfZ2V0Y2h1bmtjaGFyKHNvYXApKSkgJiYgdCAtIHRtcCA8IDcpOworICAgICAgd2hpbGUgKChpbnQpYyAhPSBFT0YgJiYgYyAhPSAnXG4nKQorICAgICAgICBjID0gc29hcF9nZXRjaHVua2NoYXIoc29hcCk7CisgICAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgcmV0dXJuIHNvYXAtPmFoZWFkID0gRU9GOworICAgICAgKnQgPSAnXDAnOworICAgICAgc29hcC0+Y2h1bmtzaXplID0gc29hcF9zdHJ0b3VsKHRtcCwgJnQsIDE2KTsKKyAgICAgIGlmICghc29hcC0+Y2h1bmtzaXplKQorICAgICAgeyBzb2FwLT5jaHVua2J1ZmxlbiA9IDA7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIG9mIGNodW5rZWQgbWVzc2FnZVxuIikpOworCXdoaWxlICgoaW50KWMgIT0gRU9GICYmIGMgIT0gJ1xuJykKKyAgICAgICAgICBjID0gc29hcF9nZXRjaHVua2NoYXIoc29hcCk7CisgICAgICAgIHJldHVybiBzb2FwLT5haGVhZCA9IEVPRjsKKyAgICAgIH0KKyAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmJ1ZmlkeCArIHNvYXAtPmNodW5rc2l6ZTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTW92aW5nIGJ1ZiBsZW4gdG8gaWR4PSV1IGxlbj0ldSAoJXMpXG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmJ1ZmlkeCwgKHVuc2lnbmVkIGludClzb2FwLT5idWZsZW4sIHRtcCkpOworICAgICAgaWYgKHNvYXAtPmJ1ZmxlbiA+IHNvYXAtPmNodW5rYnVmbGVuKQorICAgICAgeyBzb2FwLT5idWZsZW4gPSBzb2FwLT5jaHVua2J1ZmxlbjsKKyAgICAgICAgc29hcC0+Y2h1bmtzaXplIC09IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICAgICAgc29hcC0+Y2h1bmtidWZsZW4gPSAwOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlBhc3NlZCBlbmQgb2YgYnVmZmVyIGZvciBjaHVua2VkIEhUVFAgKCV1IGJ5dGVzIGxlZnQpXG4iLCAodW5zaWduZWQgaW50KShzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHgpKSk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChzb2FwLT5jaHVua2J1ZmxlbikKKyAgICAgICAgc29hcC0+Y2h1bmtzaXplID0gMDsKKyAgICAgIHJldCA9IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICAgIGlmICghcmV0KQorICAgICAgICBnb3RvIGNodW5rX2FnYWluOworICAgIH0KKyAgfQorICBlbHNlCisjZW5kaWYKKyAgeyBzb2FwLT5idWZpZHggPSAwOworICAgIHNvYXAtPmJ1ZmxlbiA9IHJldCA9IHNvYXAtPmZyZWN2KHNvYXAsIHNvYXAtPmJ1ZiwgU09BUF9CVUZMRU4pOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVhZCAldSBieXRlcyBmcm9tIHNvY2tldCAlZFxuIiwgKHVuc2lnbmVkIGludClyZXQsIHNvYXAtPnNvY2tldCkpOworICAgIERCR01TRyhSRUNWLCBzb2FwLT5idWYsIHJldCk7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPmZwcmVwYXJlcmVjdiAmJiAoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcHJlcGFyZXJlY3Yoc29hcCwgc29hcC0+YnVmLCByZXQpKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjZW5kaWYKKyNpZmRlZiBXSVRIX1pMSUIKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKQorICB7IHJlZ2lzdGVyIGludCByOworICAgIG1lbWNweShzb2FwLT56X2J1Ziwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTik7CisgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9pbiA9IChCeXRlKikoc29hcC0+el9idWYgKyBzb2FwLT5idWZpZHgpOworICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luID0gKHVuc2lnbmVkIGludClyZXQ7CisgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZSopc29hcC0+YnVmOworICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCA9IFNPQVBfQlVGTEVOOworICAgIHIgPSBpbmZsYXRlKCZzb2FwLT5kX3N0cmVhbSwgWl9OT19GTFVTSCk7CisgICAgaWYgKHIgPT0gWl9PSyB8fCByID09IFpfU1RSRUFNX0VORCkKKyAgICB7IHNvYXAtPmJ1ZmlkeCA9IDA7CisgICAgICBzb2FwLT56X2J1ZmxlbiA9IHNvYXAtPmJ1ZmxlbjsKKyAgICAgIHNvYXAtPmJ1ZmxlbiA9IHJldCA9IFNPQVBfQlVGTEVOIC0gc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0OworICAgICAgaWYgKHNvYXAtPnpsaWJfaW4gPT0gU09BUF9aTElCX0daSVApCisgICAgICAgIHNvYXAtPnpfY3JjID0gY3JjMzIoc29hcC0+el9jcmMsIChCeXRlKilzb2FwLT5idWYsICh1bnNpZ25lZCBpbnQpc29hcC0+YnVmbGVuKTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5mbGF0ZWQgJXUgYnl0ZXNcbiIsICh1bnNpZ25lZCBpbnQpcmV0KSk7CisgICAgICBpZiAoIXJldCkKKyAgICAgICAgZ290byB6bGliX2FnYWluOworICAgICAgaWYgKHIgPT0gWl9TVFJFQU1fRU5EKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluZmxhdGVkICVsdS0+JWx1IGJ5dGVzXG4iLCBzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiwgc29hcC0+ZF9zdHJlYW0udG90YWxfb3V0KSk7CisgICAgICAgIHNvYXAtPnpfcmF0aW9faW4gPSAoZmxvYXQpc29hcC0+ZF9zdHJlYW0udG90YWxfaW4gLyAoZmxvYXQpc29hcC0+ZF9zdHJlYW0udG90YWxfb3V0OworICAgICAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IFpfTlVMTDsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVbmFibGUgdG8gaW5mbGF0ZTogKCVkKSAlc1xuIiwgciwgc29hcC0+ZF9zdHJlYW0ubXNnP3NvYXAtPmRfc3RyZWFtLm1zZzoiIikpOworICAgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSBaX05VTEw7CisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICAgIHJldHVybiBFT0Y7CisgICAgfQorICB9CisjZW5kaWYKKyAgc29hcC0+Y291bnQgKz0gcmV0OworICByZXR1cm4gIXJldDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWN2KHN0cnVjdCBzb2FwICpzb2FwKQoreyAKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKQorICB7IGlmIChzb2FwLT5kaW1lLmJ1ZmxlbikKKyAgICB7IGNoYXIgKnM7CisgICAgICBpbnQgaTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgdG1wWzEyXTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRElNRSBoZHIgZm9yIGNodW5rZWQgRElNRSBpcyBpbiBidWZmZXJcbiIpKTsKKyAgICAgIHNvYXAtPmNvdW50ICs9IHNvYXAtPmRpbWUuYnVmbGVuIC0gc29hcC0+YnVmbGVuOworICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+ZGltZS5idWZsZW47CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNraXAgcGFkZGluZyAoJWxkIGJ5dGVzKVxuIiwgLShsb25nKXNvYXAtPmRpbWUuc2l6ZSYzKSk7CisgICAgICBmb3IgKGkgPSAtKGxvbmcpc29hcC0+ZGltZS5zaXplJjM7IGkgPiAwOyBpLS0pCisgICAgICB7IHNvYXAtPmJ1ZmlkeCsrOworICAgICAgICBpZiAoc29hcC0+YnVmaWR4ID49IHNvYXAtPmJ1ZmxlbikKKyAgICAgICAgICBpZiAoc29hcF9yZWN2X3Jhdyhzb2FwKSkKKyAgICAgICAgICAgIHJldHVybiBFT0Y7CisgICAgICB9CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdldCBESU1FIGhkciBmb3IgbmV4dCBjaHVua1xuIikpOworICAgICAgcyA9IChjaGFyKil0bXA7CisgICAgICBmb3IgKGkgPSAxMjsgaSA+IDA7IGktLSkKKyAgICAgIHsgKnMrKyA9IHNvYXAtPmJ1Zltzb2FwLT5idWZpZHgrK107CisgICAgICAgIGlmIChzb2FwLT5idWZpZHggPj0gc29hcC0+YnVmbGVuKQorICAgICAgICAgIGlmIChzb2FwX3JlY3ZfcmF3KHNvYXApKQorICAgICAgICAgICAgcmV0dXJuIEVPRjsKKyAgICAgIH0KKyAgICAgIHNvYXAtPmRpbWUuZmxhZ3MgPSB0bXBbMF0gJiAweDc7CisgICAgICBzb2FwLT5kaW1lLnNpemUgPSAoKHNpemVfdCl0bXBbOF0gPDwgMjQpIHwgKChzaXplX3QpdG1wWzldIDw8IDE2KSB8ICgoc2l6ZV90KXRtcFsxMF0gPDwgOCkgfCAoKHNpemVfdCl0bXBbMTFdKTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR2V0IERJTUUgY2h1bmsgKCV1IGJ5dGVzKVxuIiwgKHVuc2lnbmVkIGludClzb2FwLT5kaW1lLnNpemUpKTsKKyAgICAgIGlmIChzb2FwLT5kaW1lLmZsYWdzICYgU09BUF9ESU1FX0NGKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk1vcmUgY2h1bmtpbmdcbiIpKTsKKyAgICAgICAgc29hcC0+ZGltZS5jaHVua3NpemUgPSBzb2FwLT5kaW1lLnNpemU7CisgICAgICAgIGlmIChzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHggPj0gc29hcC0+ZGltZS5zaXplKQorICAgICAgICB7IHNvYXAtPmRpbWUuYnVmbGVuID0gc29hcC0+YnVmbGVuOworICAgICAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmJ1ZmlkeCArIHNvYXAtPmRpbWUuY2h1bmtzaXplOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzb2FwLT5kaW1lLmNodW5rc2l6ZSAtPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTGFzdCBjaHVua1xuIikpOworICAgICAgICBzb2FwLT5kaW1lLmJ1ZmxlbiA9IDA7CisgICAgICAgIHNvYXAtPmRpbWUuY2h1bmtzaXplID0gMDsKKyAgICAgIH0KKyAgICAgIHNvYXAtPmNvdW50ID0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIldSBieXRlcyByZW1haW5pbmdcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+Y291bnQpKTsKKyAgICAgIHJldHVybiBTT0FQX09LOworICAgIH0KKyAgICBpZiAoc29hcC0+ZGltZS5jaHVua3NpemUpCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdldCBuZXh0IERJTUUgaGRyIGZvciBjaHVua2VkIERJTUUgKCV1IGJ5dGVzIGNodW5rKVxuIiwgKHVuc2lnbmVkIGludClzb2FwLT5kaW1lLmNodW5rc2l6ZSkpOworICAgICAgaWYgKHNvYXBfcmVjdl9yYXcoc29hcCkpCisgICAgICAgIHJldHVybiBFT0Y7CisgICAgICBpZiAoc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4ID49IHNvYXAtPmRpbWUuY2h1bmtzaXplKQorICAgICAgeyBzb2FwLT5kaW1lLmJ1ZmxlbiA9IHNvYXAtPmJ1ZmxlbjsKKyAgICAgICAgc29hcC0+Y291bnQgLT0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4IC0gc29hcC0+ZGltZS5jaHVua3NpemU7CisgICAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmJ1ZmlkeCArIHNvYXAtPmRpbWUuY2h1bmtzaXplOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBzb2FwLT5kaW1lLmNodW5rc2l6ZSAtPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIiVsdSBieXRlcyByZW1haW5pbmcsIGNvdW50PSV1XG4iLCAodW5zaWduZWQgbG9uZykoc29hcC0+YnVmbGVuLXNvYXAtPmJ1ZmlkeCksICh1bnNpZ25lZCBpbnQpc29hcC0+Y291bnQpKTsKKyAgICAgIHJldHVybiBTT0FQX09LOworICAgIH0KKyAgfQorI2VuZGlmCisgIHJldHVybiBzb2FwX3JlY3ZfcmF3KHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc29hcF93Y2hhcgorU09BUF9GTUFDMgorc29hcF9nZXRjaGFyKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIGMgPSBzb2FwLT5haGVhZDsKKyAgaWYgKGMpCisgIHsgaWYgKGMgIT0gRU9GKQorICAgICAgc29hcC0+YWhlYWQgPSAwOworICAgIHJldHVybiBjOworICB9CisgIHJldHVybiBzb2FwX2dldDEoc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCoKK1NPQVBfRk1BQzIKK3NvYXBfY29kZShjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCAqbWFwLCBjb25zdCBjaGFyICpzdHIpCit7IGlmIChzdHIpCisgIHsgd2hpbGUgKG1hcC0+c3RyaW5nKQorICAgIHsgaWYgKCFzdHJjbXAoc3RyLCBtYXAtPnN0cmluZykpIC8qIGNhc2Ugc2Vuc2l0aXZlICovCisgICAgICAgIHJldHVybiBtYXA7CisgICAgICBtYXArKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitsb25nCitTT0FQX0ZNQUMyCitzb2FwX2ludF9jb2RlKGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwICptYXAsIGNvbnN0IGNoYXIgKnN0ciwgbG9uZyBvdGhlcikKK3sgd2hpbGUgKG1hcC0+c3RyaW5nKQorICB7IGlmICghc29hcF90YWdfY21wKHN0ciwgbWFwLT5zdHJpbmcpKSAvKiBjYXNlIGluc2Vuc2l0aXZlICovCisgICAgICByZXR1cm4gbWFwLT5jb2RlOworICAgIG1hcCsrOworICB9CisgIHJldHVybiBvdGhlcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3N0cl9jb2RlKGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwICptYXAsIGxvbmcgY29kZSkKK3sgd2hpbGUgKG1hcC0+Y29kZSAhPSBjb2RlICYmIG1hcC0+c3RyaW5nKQorICAgIG1hcCsrOworICByZXR1cm4gbWFwLT5zdHJpbmc7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc29hcF93Y2hhcgorc29hcF9jaGFyKHN0cnVjdCBzb2FwICpzb2FwKQoreyBjaGFyIHRtcFs4XTsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgcmVnaXN0ZXIgY2hhciAqcyA9IHRtcDsKKyAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykKKyAgeyBjID0gc29hcF9nZXQxKHNvYXApOworICAgIGlmIChjID09ICc7JyB8fCAoaW50KWMgPT0gRU9GKQorICAgICAgYnJlYWs7CisgICAgKnMrKyA9IChjaGFyKWM7CisgIH0KKyAgKnMgPSAnXDAnOworICBpZiAoKnRtcCA9PSAnIycpCisgIHsgaWYgKHRtcFsxXSA9PSAneCcgfHwgdG1wWzFdID09ICdYJykKKyAgICAgIHJldHVybiBzb2FwX3N0cnRvbCh0bXAgKyAyLCBOVUxMLCAxNik7CisgICAgcmV0dXJuIGF0b2wodG1wICsgMSk7CisgIH0KKyAgaWYgKCFzdHJjbXAodG1wLCAibHQiKSkKKyAgICByZXR1cm4gJzwnOworICBpZiAoIXN0cmNtcCh0bXAsICJndCIpKQorICAgIHJldHVybiAnPic7CisgIGlmICghc3RyY21wKHRtcCwgImFtcCIpKQorICAgIHJldHVybiAnJic7CisgIGlmICghc3RyY21wKHRtcCwgInF1b3QiKSkKKyAgICByZXR1cm4gJyInOworICBpZiAoIXN0cmNtcCh0bXAsICJhcG9zIikpCisgICAgcmV0dXJuICdcJyc7CisjaWZuZGVmIFdJVEhfTEVBTgorICByZXR1cm4gKHNvYXBfd2NoYXIpc29hcF9pbnRfY29kZShodG1sX2VudGl0eV9jb2RlcywgdG1wLCBTT0FQX1VOS05PV05fQ0hBUik7CisjZWxzZQorICByZXR1cm4gU09BUF9VTktOT1dOX0NIQVI7IC8qIHVzZSB0aGlzIHRvIHJlcHJlc2VudCB1bmtub3duIGNvZGUgKi8KKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgV0lUSF9MRUFOCitzb2FwX3djaGFyCitzb2FwX2dldDAoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwLT5idWZpZHggPj0gc29hcC0+YnVmbGVuICYmIHNvYXBfcmVjdihzb2FwKSkKKyAgICByZXR1cm4gRU9GOworICByZXR1cm4gKHVuc2lnbmVkIGNoYXIpc29hcC0+YnVmW3NvYXAtPmJ1ZmlkeF07Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBXSVRIX0xFQU4KK3NvYXBfd2NoYXIKK3NvYXBfZ2V0MShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXAtPmJ1ZmlkeCA+PSBzb2FwLT5idWZsZW4gJiYgc29hcF9yZWN2KHNvYXApKQorICAgIHJldHVybiBFT0Y7CisgIHJldHVybiAodW5zaWduZWQgY2hhcilzb2FwLT5idWZbc29hcC0+YnVmaWR4KytdOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc29hcF93Y2hhcgorU09BUF9GTUFDMgorc29hcF9nZXQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgYyA9IHNvYXAtPmFoZWFkOworICBpZiAoYykKKyAgeyBpZiAoYyAhPSBFT0YpCisgICAgICBzb2FwLT5haGVhZCA9IDA7CisgIH0KKyAgZWxzZQorICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgIGZvciAoOzspCisgIHsgaWYgKHNvYXAtPmNkYXRhKQorICAgIHsgaWYgKGMgPT0gJ10nKQorICAgICAgeyBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgICBpZiAoYyA9PSAnXScpCisgICAgICAgIHsgc29hcC0+Y2RhdGEgPSAwOworICAgICAgICAgIHNvYXBfZ2V0MShzb2FwKTsgLyogc2tpcCA+ICovCisgICAgICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgICAgfQorCWVsc2UKKyAgICAgICAgeyBzb2FwX3JldmdldDEoc29hcCk7CisgICAgICAgICAgcmV0dXJuICddJzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gYzsKKyAgICB9CisgICAgc3dpdGNoIChjKQorICAgIHsgY2FzZSAnPCc6CisgICAgICAgIGRvIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICAgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyAgICAgICAgaWYgKGMgPT0gJyEnIHx8IGMgPT0gJz8nIHx8IGMgPT0gJyUnKQorICAgICAgICB7IHJlZ2lzdGVyIGludCBrID0gMTsKKwkgIGlmIChjID09ICchJykKKyAgICAgICAgICB7IGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICAgICAgICBpZiAoYyA9PSAnWycpCisgICAgICAgICAgICB7IGRvIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICAgICAgICAgIHdoaWxlICgoaW50KWMgIT0gRU9GICYmIGMgIT0gJ1snKTsKKyAgICAgICAgICAgICAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIHNvYXAtPmNkYXRhID0gMTsKKyAgICAgICAgICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKwkgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjID09ICctJyAmJiAoYyA9IHNvYXBfZ2V0MShzb2FwKSkgPT0gJy0nKQorICAgICAgICAgICAgeyBkbworICAgICAgICAgICAgICB7IGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJy0nICYmIChjID0gc29hcF9nZXQxKHNvYXApKSA9PSAnLScpCisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfSB3aGlsZSAoKGludCljICE9IEVPRik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCSAgZWxzZSBpZiAoYyA9PSAnPycpCisgICAgICAgICAgICBjID0gc29hcF9nZXRfcGkoc29hcCk7CisgICAgICAgICAgd2hpbGUgKChpbnQpYyAhPSBFT0YpCisgICAgICAgICAgeyBpZiAoYyA9PSAnPCcpCisJICAgICAgaysrOworCSAgICBlbHNlIGlmIChjID09ICc+JykKKwkgICAgeyBpZiAoLS1rIDw9IDApCisJICAgICAgICBicmVhazsKKwkgICAgfQorCSAgICBjID0gc29hcF9nZXQxKHNvYXApOworCSAgfQorCSAgaWYgKChpbnQpYyA9PSBFT0YpCisJICAgIGJyZWFrOworICAgICAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMgPT0gJy8nKQorICAgICAgICAgIHJldHVybiBTT0FQX1RUOworICAgICAgICBzb2FwX3JldmdldDEoc29hcCk7CisgICAgICAgIHJldHVybiBTT0FQX0xUOworICAgICAgY2FzZSAnPic6CisgICAgICAgIHJldHVybiBTT0FQX0dUOworICAgICAgY2FzZSAnIic6CisgICAgICAgIHJldHVybiBTT0FQX1FUOworICAgICAgY2FzZSAnXCcnOgorICAgICAgICByZXR1cm4gU09BUF9BUDsKKyAgICAgIGNhc2UgJyYnOgorICAgICAgICByZXR1cm4gc29hcF9jaGFyKHNvYXApIHwgMHg4MDAwMDAwMDsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIGM7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc29hcF93Y2hhcgorc29hcF9nZXRfcGkoc3RydWN0IHNvYXAgKnNvYXApCit7IGNoYXIgYnVmWzY0XTsKKyAgcmVnaXN0ZXIgY2hhciAqcyA9IGJ1ZjsKKyAgcmVnaXN0ZXIgaW50IGkgPSBzaXplb2YoYnVmKTsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICAvKiBUaGlzIGlzIGEgcXVpY2sgd2F5IHRvIHBhcnNlIFhNTCBQSSBhbmQgd2UgY291bGQgdXNlIGEgY2FsbGJhY2sgaW5zdGVhZCB0bworICAgKiBlbmFibGUgYXBwbGljYXRpb25zIHRvIGludGVyY2VwdCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyAqLworICB3aGlsZSAoKGludCljICE9IEVPRiAmJiBjICE9ICc/JykKKyAgeyBpZiAoLS1pID4gMCkKKyAgICB7IGlmIChzb2FwX2JsYW5rKGMpKQorICAgICAgICBjID0gJyAnOworICAgICAgKnMrKyA9IChjaGFyKWM7CisgICAgfQorICAgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgIH0KKyAgKnMgPSAnXDAnOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlhNTCBQSSA8PyVzPz5cbiIsIGJ1ZikpOworICBpZiAoIXN0cm5jbXAoYnVmLCAieG1sICIsIDQpKQorICB7IHMgPSBzdHJzdHIoYnVmLCAiIGVuY29kaW5nPSIpOworICAgIGlmIChzICYmIHNbMTBdKQorICAgIHsgaWYgKCFzb2FwX3RhZ19jbXAocyArIDExLCAiaXNvLTg4NTktMSoiKQorICAgICAgIHx8ICFzb2FwX3RhZ19jbXAocyArIDExLCAibGF0aW4xKiIpKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlN3aXRjaGluZyB0byBsYXRpbjEgZW5jb2RpbmdcbiIpKTsKKyAgICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19MQVRJTjsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAocyArIDExLCAidXRmLTgqIikpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU3dpdGNoaW5nIHRvIHV0Zi04IGVuY29kaW5nXG4iKSk7CisgICAgICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX0xBVElOOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoKGludCljICE9IEVPRikKKyAgICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICByZXR1cm4gYzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9tb3ZlKHN0cnVjdCBzb2FwICpzb2FwLCBsb25nIG4pCit7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTW92aW5nICVsZCBieXRlcyBmb3J3YXJkXG4iLCAobG9uZyluKSk7CisgIGZvciAoOyBuID4gMDsgbi0tKQorICAgIGlmICgoaW50KXNvYXBfZ2V0Y2hhcihzb2FwKSA9PSBFT0YpCisgICAgICByZXR1cm4gU09BUF9FT0Y7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzaXplX3QKK1NPQVBfRk1BQzIKK3NvYXBfdGVsbChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmV0dXJuIHNvYXAtPmNvdW50IC0gc29hcC0+YnVmbGVuICsgc29hcC0+YnVmaWR4IC0gKHNvYXAtPmFoZWFkICE9IDApOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0dXRmOChzdHJ1Y3Qgc29hcCAqc29hcCwgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBjKQoreyBjaGFyIHRtcFsxNl07CisgIGlmIChjID4gMCAmJiBjIDwgMHg4MCkKKyAgeyAqdG1wID0gKGNoYXIpYzsKKyAgICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCB0bXAsIDEpOworICB9CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgeyByZWdpc3RlciBjaGFyICp0ID0gdG1wOworICAgIGlmIChjIDwgMHgwODAwKQorICAgICAgKnQrKyA9IChjaGFyKSgweEMwIHwgKChjID4+IDYpICYgMHgxRikpOworICAgIGVsc2UKKyAgICB7IGlmIChjIDwgMHgwMTAwMDApCisgICAgICAgICp0KysgPSAoY2hhcikoMHhFMCB8ICgoYyA+PiAxMikgJiAweDBGKSk7CisgICAgICBlbHNlCisgICAgICB7IGlmIChjIDwgMHgyMDAwMDApCisgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEYwIHwgKChjID4+IDE4KSAmIDB4MDcpKTsKKyAgICAgICAgZWxzZQorICAgICAgICB7IGlmIChjIDwgMHgwNDAwMDAwMCkKKyAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhGOCB8ICgoYyA+PiAyNCkgJiAweDAzKSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsgKnQrKyA9IChjaGFyKSgweEZDIHwgKChjID4+IDMwKSAmIDB4MDEpKTsKKyAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAyNCkgJiAweDNGKSk7CisgICAgICAgICAgfQorICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAxOCkgJiAweDNGKSk7CisgICAgICAgIH0gICAgIAorICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTIpICYgMHgzRikpOworICAgICAgfQorICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDYpICYgMHgzRikpOworICAgIH0KKyAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoYyAmIDB4M0YpKTsKKyAgICAqdCA9ICdcMCc7CisgIH0KKyAgZWxzZQorI2VuZGlmCisgICAgc3ByaW50Zih0bXAsICImIyVsdTsiLCBjKTsKKyAgcmV0dXJuIHNvYXBfc2VuZChzb2FwLCB0bXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc29hcF93Y2hhcgorU09BUF9GTUFDMgorc29hcF9nZXR1dGY4KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzb2FwX3djaGFyIGMsIGMxLCBjMiwgYzMsIGM0OworICBjID0gc29hcC0+YWhlYWQ7CisgIGlmIChjID4gMHhGRikKKyAgeyBzb2FwLT5haGVhZCA9IDA7CisgICAgcmV0dXJuIGM7CisgIH0KK2FnYWluOgorICBjID0gc29hcF9nZXQoc29hcCk7CisgIGlmIChjIDwgMHg4MCB8fCAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0xBVElOKSkKKyAgICByZXR1cm4gYzsKKyAgYzEgPSBzb2FwX2dldDEoc29hcCk7CisgIGlmIChjMSA8IDB4ODApCisgIHsgc29hcF9yZXZnZXQxKHNvYXApOyAvKiBkb2Vzbid0IGxvb2sgbGlrZSB0aGlzIGlzIFVURjggKi8KKyAgICByZXR1cm4gYzsKKyAgfQorICBjMSAmPSAweDNGOworICBpZiAoYyA8IDB4RTApCisgICAgcmV0dXJuICgoc29hcF93Y2hhcikoYyAmIDB4MUYpIDw8IDYpIHwgYzE7CisgIGMyID0gKHNvYXBfd2NoYXIpc29hcF9nZXQxKHNvYXApICYgMHgzRjsKKyAgaWYgKGMgPT0gMHhFRiAmJiBjMSA9PSAweDNCICYmIGMyID09IDB4M0YpCS8qIGlnbm9yZSBVVEYtOCBCT00gKi8KKyAgICBnb3RvIGFnYWluOworICBpZiAoYyA8IDB4RjApCisgICAgcmV0dXJuICgoc29hcF93Y2hhcikoYyAmIDB4MEYpIDw8IDEyKSB8IChjMSA8PCA2KSB8IGMyOworICBjMyA9IChzb2FwX3djaGFyKXNvYXBfZ2V0MShzb2FwKSAmIDB4M0Y7CisgIGlmIChjIDwgMHhGOCkKKyAgICByZXR1cm4gKChzb2FwX3djaGFyKShjICYgMHgwNykgPDwgMTgpIHwgKGMxIDw8IDEyKSB8IChjMiA8PCA2KSB8IGMzOworICBjNCA9IChzb2FwX3djaGFyKXNvYXBfZ2V0MShzb2FwKSAmIDB4M0Y7CisgIGlmIChjIDwgMHhGQykKKyAgICByZXR1cm4gKChzb2FwX3djaGFyKShjICYgMHgwMykgPDwgMjQpIHwgKGMxIDw8IDE4KSB8IChjMiA8PCAxMikgfCAoYzMgPDwgNikgfCBjNDsKKyAgcmV0dXJuICgoc29hcF93Y2hhcikoYyAmIDB4MDEpIDw8IDMwKSB8IChjMSA8PCAyNCkgfCAoYzIgPDwgMTgpIHwgKGMzIDw8IDEyKSB8IChjNCA8PCA2KSB8IChzb2FwX3djaGFyKShzb2FwX2dldDEoc29hcCkgJiAweDNGKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRoZXgoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMsIGludCBuKQoreyBjaGFyIGRbMl07CisgIHJlZ2lzdGVyIGludCBpOworI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IGlmICghKHNvYXAtPmRvbS0+ZGF0YSA9IHNvYXBfczJoZXgoc29hcCwgcywgTlVMTCwgbikpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIHJldHVybiBTT0FQX09LOworICB9CisjZW5kaWYKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgeyByZWdpc3RlciBpbnQgbSA9ICpzKys7CisgICAgZFswXSA9IChjaGFyKSgobSA+PiA0KSArIChtID4gMTU5ID8gJzcnIDogJzAnKSk7CisgICAgbSAmPSAweDBGOworICAgIGRbMV0gPSAoY2hhcikobSArIChtID4gOSA/ICc3JyA6ICcwJykpOworICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIGQsIDIpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordW5zaWduZWQgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0aGV4KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgKm4pCit7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgc29hcC0+ZG9tLT5kYXRhID0gc29hcF9zdHJpbmdfaW4oc29hcCwgMCwgLTEsIC0xKTsKKyAgICByZXR1cm4gKHVuc2lnbmVkIGNoYXIqKXNvYXBfaGV4MnMoc29hcCwgc29hcC0+ZG9tLT5kYXRhLCBOVUxMLCAwLCBuKTsKKyAgfQorI2VuZGlmCisjaWZkZWYgV0lUSF9GQVNUCisgIHNvYXAtPmxhYmlkeCA9IDA7CisgIGZvciAoOzspCisgIHsgcmVnaXN0ZXIgY2hhciAqczsKKyAgICByZWdpc3RlciBpbnQgaSwgazsKKyAgICBpZiAoc29hcF9hcHBlbmRfbGFiKHNvYXAsIE5VTEwsIDApKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgcyA9IHNvYXAtPmxhYmJ1ZiArIHNvYXAtPmxhYmlkeDsKKyAgICBrID0gc29hcC0+bGFibGVuIC0gc29hcC0+bGFiaWR4OworICAgIHNvYXAtPmxhYmlkeCA9IHNvYXAtPmxhYmxlbjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgazsgaSsrKQorICAgIHsgcmVnaXN0ZXIgY2hhciBkMSwgZDI7CisgICAgICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgICAgICBjID0gc29hcF9nZXQoc29hcCk7CisgICAgICBpZiAoc29hcF9pc3hkaWdpdChjKSkKKyAgICAgIHsgZDEgPSAoY2hhciljOworICAgICAgICBjID0gc29hcF9nZXQoc29hcCk7IAorCWlmIChzb2FwX2lzeGRpZ2l0KGMpKQorICAgICAgICAgIGQyID0gKGNoYXIpYzsKKyAgICAgICAgZWxzZSAKKyAgICAgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyB1bnNpZ25lZCBjaGFyICpwOworICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICBpZiAobikKKyAgICAgICAgICAqbiA9IChpbnQpKHNvYXAtPmxhYmxlbiAtIGsgKyBpKTsKKyAgICAgICAgcCA9ICh1bnNpZ25lZCBjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzb2FwLT5sYWJsZW4gLSBrICsgaSk7CisJaWYgKHApCisJICBtZW1jcHkocCwgc29hcC0+bGFiYnVmLCBzb2FwLT5sYWJsZW4gLSBrICsgaSk7CisgICAgICAgIHJldHVybiBwOworICAgICAgfQorICAgICAgKnMrKyA9ICgoZDEgPj0gJ0EnID8gKGQxICYgMHg3KSArIDkgOiBkMSAtICcwJykgPDwgNCkgKyAoZDIgPj0gJ0EnID8gKGQyICYgMHg3KSArIDkgOiBkMiAtICcwJyk7CisgICAgfQorICB9CisjZWxzZQorICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgcmV0dXJuIE5VTEw7CisgIGZvciAoOzspCisgIHsgcmVnaXN0ZXIgaW50IGk7CisgICAgcmVnaXN0ZXIgY2hhciAqcyA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgU09BUF9CTEtMRU4pOworICAgIGlmICghcykKKyAgICB7IHNvYXBfZW5kX2Jsb2NrKHNvYXApOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0JMS0xFTjsgaSsrKQorICAgIHsgcmVnaXN0ZXIgY2hhciBkMSwgZDI7CisgICAgICByZWdpc3RlciBzb2FwX3djaGFyIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgICAgIGlmIChzb2FwX2lzeGRpZ2l0KGMpKQorICAgICAgeyBkMSA9IChjaGFyKWM7CisgICAgICAgIGMgPSBzb2FwX2dldChzb2FwKTsgCisJaWYgKHNvYXBfaXN4ZGlnaXQoYykpCisgICAgICAgICAgZDIgPSAoY2hhciljOworICAgICAgICBlbHNlIAorICAgICAgICB7IHNvYXBfZW5kX2Jsb2NrKHNvYXApOworCSAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgdW5zaWduZWQgY2hhciAqcDsKKyAgICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgaWYgKG4pCisgICAgICAgICAgKm4gPSBzb2FwX3NpemVfYmxvY2soc29hcCwgaSk7CisgICAgICAgIHAgPSAodW5zaWduZWQgY2hhciopc29hcF9zYXZlX2Jsb2NrKHNvYXAsIE5VTEwsIDApOworICAgICAgICByZXR1cm4gcDsKKyAgICAgIH0KKyAgICAgICpzKysgPSAoKGQxID49ICdBJyA/IChkMSAmIDB4NykgKyA5IDogZDEgLSAnMCcpIDw8IDQpICsgKGQyID49ICdBJyA/IChkMiAmIDB4NykgKyA5IDogZDIgLSAnMCcpOworICAgIH0KKyAgfQorI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0YmFzZTY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzLCBpbnQgbikKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbTsKKyAgY2hhciBkWzRdOworICBpZiAoIXMpCisgICAgcmV0dXJuIFNPQVBfT0s7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgaWYgKCEoc29hcC0+ZG9tLT5kYXRhID0gc29hcF9zMmJhc2U2NChzb2FwLCBzLCBOVUxMLCBuKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNlbmRpZgorICBmb3IgKDsgbiA+IDI7IG4gLT0gMywgcyArPSAzKQorICB7IG0gPSBzWzBdOworICAgIG0gPSAobSA8PCA4KSB8IHNbMV07CisgICAgbSA9IChtIDw8IDgpIHwgc1syXTsKKyAgICBmb3IgKGkgPSA0OyBpID4gMDsgbSA+Pj0gNikKKyAgICAgIGRbLS1pXSA9IHNvYXBfYmFzZTY0b1ttICYgMHgzRl07CisgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgZCwgNCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKG4gPiAwKQorICB7IG0gPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICBtID0gKG0gPDwgOCkgfCAqcysrOworICAgIGZvciAoOyBpIDwgMzsgaSsrKQorICAgICAgbSA8PD0gODsKKyAgICBmb3IgKGkrKzsgaSA+IDA7IG0gPj49IDYpCisgICAgICBkWy0taV0gPSBzb2FwX2Jhc2U2NG9bbSAmIDB4M0ZdOworICAgIGZvciAoaSA9IDM7IGkgPiBuOyBpLS0pCisgICAgICBkW2ldID0gJz0nOworICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIGQsIDQpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordW5zaWduZWQgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0YmFzZTY0KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgKm4sIGludCBtYWxsb2NfZmxhZykKK3sgCisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgc29hcC0+ZG9tLT5kYXRhID0gc29hcF9zdHJpbmdfaW4oc29hcCwgMCwgLTEsIC0xKTsKKyAgICByZXR1cm4gKHVuc2lnbmVkIGNoYXIqKXNvYXBfYmFzZTY0MnMoc29hcCwgc29hcC0+ZG9tLT5kYXRhLCBOVUxMLCAwLCBuKTsKKyAgfQorI2VuZGlmCisjaWZkZWYgV0lUSF9GQVNUCisgIHNvYXAtPmxhYmlkeCA9IDA7CisgIGZvciAoOzspCisgIHsgcmVnaXN0ZXIgaW50IGksIGs7CisgICAgcmVnaXN0ZXIgY2hhciAqczsKKyAgICBpZiAoc29hcF9hcHBlbmRfbGFiKHNvYXAsIE5VTEwsIDIpKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgcyA9IHNvYXAtPmxhYmJ1ZiArIHNvYXAtPmxhYmlkeDsKKyAgICBrID0gc29hcC0+bGFibGVuIC0gc29hcC0+bGFiaWR4OworICAgIHNvYXAtPmxhYmlkeCA9IDMgKiAoc29hcC0+bGFibGVuIC8gMyk7CisgICAgaWYgKCFzKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IGsgLSAyOyBpICs9IDMpCisgICAgeyByZWdpc3RlciB1bnNpZ25lZCBsb25nIG0gPSAwOworICAgICAgcmVnaXN0ZXIgaW50IGogPSAwOworICAgICAgZG8KKyAgICAgIHsgcmVnaXN0ZXIgc29hcF93Y2hhciBjID0gc29hcF9nZXQoc29hcCk7CisgICAgICAgIGlmIChjID09ICc9JyB8fCBjIDwgMCkKKyAgICAgICAgeyB1bnNpZ25lZCBjaGFyICpwOworICAgICAgICAgIHN3aXRjaCAoaikKKyAgICAgICAgICB7IGNhc2UgMjoKKyAgICAgICAgICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiA0KSAmIDB4RkYpOworICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAqcysrID0gKGNoYXIpKChtID4+IDEwKSAmIDB4RkYpOworICAgICAgICAgICAgICAqcysrID0gKGNoYXIpKChtID4+IDIpICYgMHhGRik7CisgICAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG4pCisgICAgICAgICAgICAqbiA9IChpbnQpKHNvYXAtPmxhYmxlbiAtIGsgKyBpKTsKKyAgICAgICAgICBwID0gKHVuc2lnbmVkIGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHNvYXAtPmxhYmxlbiAtIGsgKyBpKTsKKwkgIGlmIChwKQorCSAgICBtZW1jcHkocCwgc29hcC0+bGFiYnVmLCBzb2FwLT5sYWJsZW4gLSBrICsgaSk7CisgICAgICAgICAgaWYgKGMgPj0gMCkKKyAgICAgICAgICB7IHdoaWxlICgoaW50KSgoYyA9IHNvYXBfZ2V0KHNvYXApKSAhPSBFT0YpICYmIGMgIT0gU09BUF9MVCAmJiBjICE9IFNPQVBfVFQpCisgICAgICAgICAgICAgIDsKKwkgIH0KKyAgICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICAgIHJldHVybiBwOworICAgICAgICB9CisgICAgICAgIGMgLT0gJysnOworICAgICAgICBpZiAoYyA+PSAwICYmIGMgPD0gNzkpCisgICAgICAgIHsgbSA9IChtIDw8IDYpICsgc29hcF9iYXNlNjRpW2NdOworICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAoaiA8IDQpOworICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiAxNikgJiAweEZGKTsKKyAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gOCkgJiAweEZGKTsKKyAgICAgICpzKysgPSAoY2hhcikobSAmIDB4RkYpOworICAgIH0KKyAgfQorI2Vsc2UKKyAgaWYgKHNvYXBfbmV3X2Jsb2NrKHNvYXApKQorICAgIHJldHVybiBOVUxMOworICBmb3IgKDs7KQorICB7IHJlZ2lzdGVyIGludCBpOworICAgIHJlZ2lzdGVyIGNoYXIgKnMgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIDMgKiBTT0FQX0JMS0xFTik7IC8qIG11c3QgYmUgbXVsdGlwbGUgb2YgMyAqLworICAgIGlmICghcykKKyAgICB7IHNvYXBfZW5kX2Jsb2NrKHNvYXApOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0JMS0xFTjsgaSsrKQorICAgIHsgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBtID0gMDsKKyAgICAgIHJlZ2lzdGVyIGludCBqID0gMDsKKyAgICAgIGRvCisgICAgICB7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IHNvYXBfZ2V0KHNvYXApOworICAgICAgICBpZiAoYyA9PSAnPScgfHwgYyA8IDApCisgICAgICAgIHsgdW5zaWduZWQgY2hhciAqcDsKKyAgICAgICAgICBpICo9IDM7CisgICAgICAgICAgc3dpdGNoIChqKQorICAgICAgICAgIHsgY2FzZSAyOgorICAgICAgICAgICAgICAqcysrID0gKGNoYXIpKChtID4+IDQpICYgMHhGRik7CisgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gMTApICYgMHhGRik7CisgICAgICAgICAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gMikgJiAweEZGKTsKKyAgICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobikKKwkgICAgKm4gPSAoaW50KXNvYXBfc2l6ZV9ibG9jayhzb2FwLCBpKTsKKyAgICAgICAgICBwID0gKHVuc2lnbmVkIGNoYXIqKXNvYXBfc2F2ZV9ibG9jayhzb2FwLCBOVUxMLCAwKTsKKyAgICAgICAgICBpZiAoYyA+PSAwKQorICAgICAgICAgIHsgd2hpbGUgKChpbnQpKChjID0gc29hcF9nZXQoc29hcCkpICE9IEVPRikgJiYgYyAhPSBTT0FQX0xUICYmIGMgIT0gU09BUF9UVCkKKyAgICAgICAgICAgICAgOworCSAgfQorICAgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgIH0KKyAgICAgICAgYyAtPSAnKyc7CisgICAgICAgIGlmIChjID49IDAgJiYgYyA8PSA3OSkKKyAgICAgICAgeyBtID0gKG0gPDwgNikgKyBzb2FwX2Jhc2U2NGlbY107CisgICAgICAgICAgaisrOworICAgICAgICB9CisgICAgICB9IHdoaWxlIChqIDwgNCk7CisgICAgICAqcysrID0gKGNoYXIpKChtID4+IDE2KSAmIDB4RkYpOworICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiA4KSAmIDB4RkYpOworICAgICAgKnMrKyA9IChjaGFyKShtICYgMHhGRik7CisgICAgfQorICB9CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF94b3BfZm9yd2FyZChzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgY2hhciAqKnB0ciwgaW50ICpzaXplLCBjaGFyICoqaWQsIGNoYXIgKip0eXBlLCBjaGFyICoqb3B0aW9ucykKK3sgLyogQ2hlY2sgTVRPTSB4b3A6SW5jbHVkZSBlbGVtZW50ICh3aXRoaW4gaGV4L2Jhc2U2NEJpbmFyeSkgKi8KKyAgLyogVE9ETzogdGhpcyBjb2RlIHRvIGJlIG9ic29sZXRlZCB3aXRoIG5ldyBpbXBvcnQveG9wLmggY29udmVudGlvbnMgKi8KKyAgaW50IGJvZHkgPSBzb2FwLT5ib2R5OyAvKiBzaG91bGQgc2F2ZSB0eXBlIHRvbz8gKi8KKyAgaWYgKCFzb2FwX3BlZWtfZWxlbWVudChzb2FwKSkKKyAgeyBpZiAoIXNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCAieG9wOkluY2x1ZGUiLCAwKSAmJiAqc29hcC0+aHJlZikKKyAgICB7IGlmIChzb2FwX2RpbWVfZm9yd2FyZChzb2FwLCBwdHIsIHNpemUsIGlkLCB0eXBlLCBvcHRpb25zKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIE5VTEwpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHNvYXAtPmJvZHkgPSBib2R5OworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2RpbWVfZm9yd2FyZChzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgY2hhciAqKnB0ciwgaW50ICpzaXplLCBjaGFyICoqaWQsIGNoYXIgKip0eXBlLCBjaGFyICoqb3B0aW9ucykKK3sgc3RydWN0IHNvYXBfeGxpc3QgKnhwID0gKHN0cnVjdCBzb2FwX3hsaXN0KilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfeGxpc3QpKTsKKyAgKnB0ciA9IE5VTEw7CisgICpzaXplID0gMDsKKyAgKmlkID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+aHJlZik7CisgICp0eXBlID0gTlVMTDsKKyAgKm9wdGlvbnMgPSBOVUxMOworICBpZiAoIXhwKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICB4cC0+bmV4dCA9IHNvYXAtPnhsaXN0OworICB4cC0+cHRyID0gcHRyOworICB4cC0+c2l6ZSA9IHNpemU7CisgIHhwLT5pZCA9ICppZDsKKyAgeHAtPnR5cGUgPSB0eXBlOworICB4cC0+b3B0aW9ucyA9IG9wdGlvbnM7CisgIHNvYXAtPnhsaXN0ID0geHA7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfc3RyZHVwKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzKQoreyBjaGFyICp0ID0gTlVMTDsKKyAgaWYgKHMgJiYgKHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc3RybGVuKHMpICsgMSkpKQorICAgIHN0cmNweSh0LCBzKTsKKyAgcmV0dXJuIHQ7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfbmV3X2Jsb2NrKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9ibGlzdCAqcDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJOZXcgYmxvY2sgc2VxdWVuY2UgKHByZXY9JXApXG4iLCBzb2FwLT5ibGlzdCkpOworICBpZiAoIShwID0gKHN0cnVjdCBzb2FwX2JsaXN0KilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfYmxpc3QpKSkpCisgICAgcmV0dXJuIFNPQVBfRU9NOyAgIAorICBwLT5uZXh0ID0gc29hcC0+Ymxpc3Q7IAorICBwLT5wdHIgPSBOVUxMOworICBwLT5zaXplID0gMDsKKyAgc29hcC0+Ymxpc3QgPSBwOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQqCitTT0FQX0ZNQUMyCitzb2FwX3B1c2hfYmxvY2soc3RydWN0IHNvYXAgKnNvYXAsIHNpemVfdCBuKQoreyBjaGFyICpwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlB1c2ggYmxvY2sgb2YgJXUgYnl0ZXMgKCV1IGJ5dGVzIHRvdGFsKVxuIiwgKHVuc2lnbmVkIGludCluLCAodW5zaWduZWQgaW50KXNvYXAtPmJsaXN0LT5zaXplICsgKHVuc2lnbmVkIGludCluKSk7CisgIGlmICghKHAgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgbiArIHNpemVvZihjaGFyKikgKyBzaXplb2Yoc2l6ZV90KSkpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgKihjaGFyKiopcCA9IHNvYXAtPmJsaXN0LT5wdHI7CisgICooc2l6ZV90KikocCArIHNpemVvZihjaGFyKikpID0gbjsKKyAgc29hcC0+Ymxpc3QtPnB0ciA9IHA7CisgIHNvYXAtPmJsaXN0LT5zaXplICs9IG47CisgIHJldHVybiBwICsgc2l6ZW9mKGNoYXIqKSArIHNpemVvZihzaXplX3QpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9wb3BfYmxvY2soc3RydWN0IHNvYXAgKnNvYXApCit7IGNoYXIgKnA7CisgIGlmICghc29hcC0+Ymxpc3QtPnB0cikKKyAgICByZXR1cm47CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUG9wIGJsb2NrXG4iKSk7CisgIHAgPSBzb2FwLT5ibGlzdC0+cHRyOworICBzb2FwLT5ibGlzdC0+c2l6ZSAtPSAqKHNpemVfdCopKHAgKyBzaXplb2YoY2hhciopKTsKKyAgc29hcC0+Ymxpc3QtPnB0ciA9ICooY2hhcioqKXA7CisgIFNPQVBfRlJFRShzb2FwLCBwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZAorc29hcF91cGRhdGVfcHRycyhzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqc3RhcnQsIGNoYXIgKmVuZCwgY2hhciAqcDEsIGNoYXIgKnAyKQoreyBpbnQgaTsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9mbGlzdCAqZnA7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3hsaXN0ICp4cDsKKyNlbmRpZgorICByZWdpc3RlciB2b2lkICpwLCAqKnE7CisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0lESEFTSDsgaSsrKQorICB7IGZvciAoaXAgPSBzb2FwLT5paHRbaV07IGlwOyBpcCA9IGlwLT5uZXh0KQorICAgIHsgaWYgKGlwLT5wdHIgJiYgKGNoYXIqKWlwLT5wdHIgPj0gc3RhcnQgJiYgKGNoYXIqKWlwLT5wdHIgPCBlbmQpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVXBkYXRlIGlkPSclcycgJXAgLT4gJXBcbiIsIGlwLT5pZCwgaXAtPnB0ciwgKGNoYXIqKWlwLT5wdHIgKyAocDEtcDIpKSk7CisgICAgICAgIGlwLT5wdHIgPSAoY2hhciopaXAtPnB0ciArIChwMS1wMik7CisgICAgICB9CisgICAgICBmb3IgKHEgPSAmaXAtPmxpbms7IHE7IHEgPSAodm9pZCoqKXApCisgICAgICB7IHAgPSAqcTsKKyAgICAgICAgaWYgKHAgJiYgKGNoYXIqKXAgPj0gc3RhcnQgJiYgKGNoYXIqKXAgPCBlbmQpCisgICAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJMaW5rIHVwZGF0ZSBpZD0nJXMnICVwXG4iLCBpcC0+aWQsIHApKTsKKyAgICAgICAgICAqcSA9IChjaGFyKilwICsgKHAxLXAyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZm9yIChxID0gJmlwLT5jb3B5OyBxOyBxID0gKHZvaWQqKilwKQorICAgICAgeyBwID0gKnE7CisgICAgICAgIGlmIChwICYmIChjaGFyKilwID49IHN0YXJ0ICYmIChjaGFyKilwIDwgZW5kKQorICAgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weSBjaGFpbiB1cGRhdGUgaWQ9JyVzJyAlcFxuIiwgaXAtPmlkLCBwKSk7CisgICAgICAgICAgKnEgPSAoY2hhciopcCArIChwMS1wMik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZvciAoZnAgPSBpcC0+Zmxpc3Q7IGZwOyBmcCA9IGZwLT5uZXh0KQorICAgICAgeyBpZiAoKGNoYXIqKWZwLT5wdHIgPj0gc3RhcnQgJiYgKGNoYXIqKWZwLT5wdHIgPCBlbmQpCisgICAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5IGxpc3QgdXBkYXRlIGlkPSclcycgJXBcbiIsIGlwLT5pZCwgZnApKTsKKyAgICAgICAgICBmcC0+cHRyID0gKGNoYXIqKWZwLT5wdHIgKyAocDEtcDIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGZvciAoeHAgPSBzb2FwLT54bGlzdDsgeHA7IHhwID0geHAtPm5leHQpCisgIHsgaWYgKHhwLT5wdHIgJiYgKGNoYXIqKXhwLT5wdHIgPj0gc3RhcnQgJiYgKGNoYXIqKXhwLT5wdHIgPCBlbmQpCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVwZGF0ZSBpZD0nJXMnICVwIC0+ICVwXG4iLCB4cC0+aWQ/eHAtPmlkOiIiLCB4cC0+cHRyLCAoY2hhciopeHAtPnB0ciArIChwMS1wMikpKTsKKyAgICAgIHhwLT5wdHIgPSAodW5zaWduZWQgY2hhcioqKSgoY2hhciopeHAtPnB0ciArIChwMS1wMikpOworICAgICAgeHAtPnNpemUgPSAoaW50KikoKGNoYXIqKXhwLT5zaXplICsgKHAxLXAyKSk7CisgICAgICB4cC0+dHlwZSA9IChjaGFyKiopKChjaGFyKil4cC0+dHlwZSArIChwMS1wMikpOworICAgICAgeHAtPm9wdGlvbnMgPSAoY2hhcioqKSgoY2hhciopeHAtPm9wdGlvbnMgKyAocDEtcDIpKTsKKyAgICB9CisgIH0KKyNlbmRpZgorfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc29hcF9oYXNfY29waWVzKHN0cnVjdCBzb2FwICpzb2FwLCByZWdpc3RlciBjb25zdCBjaGFyICpzdGFydCwgcmVnaXN0ZXIgY29uc3QgY2hhciAqZW5kKQoreyByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9mbGlzdCAqZnA7CisgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnA7CisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0lESEFTSDsgaSsrKQorICB7IGZvciAoaXAgPSBzb2FwLT5paHRbaV07IGlwOyBpcCA9IGlwLT5uZXh0KQorICAgIHsgZm9yIChwID0gKGNvbnN0IGNoYXIqKWlwLT5jb3B5OyBwOyBwID0gKihjb25zdCBjaGFyKiopcCkKKyAgICAgICAgaWYgKHAgPj0gc3RhcnQgJiYgcCA8IGVuZCkKKyAgICAgICAgICByZXR1cm4gU09BUF9FUlI7CisgICAgICBmb3IgKGZwID0gaXAtPmZsaXN0OyBmcDsgZnAgPSBmcC0+bmV4dCkKKyAgICAgICAgaWYgKChjb25zdCBjaGFyKilmcC0+cHRyID49IHN0YXJ0ICYmIChjb25zdCBjaGFyKilmcC0+cHRyIDwgZW5kKQorCSAgcmV0dXJuIFNPQVBfRVJSOworICAgIH0KKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZXNvbHZlKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9mbGlzdCAqZnA7CisgIHNob3J0IGZsYWc7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x2aW5nIGZvcndhcmRlZCBkYXRhXG4iKSk7CisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0lESEFTSDsgaSsrKQorICB7IGZvciAoaXAgPSBzb2FwLT5paHRbaV07IGlwOyBpcCA9IGlwLT5uZXh0KQorICAgIHsgaWYgKGlwLT5wdHIpCisgICAgICB7IHJlZ2lzdGVyIHZvaWQgKnAsICoqcSwgKnI7CisgICAgICAgIHEgPSAodm9pZCoqKWlwLT5saW5rOworICAgICAgICBpcC0+bGluayA9IE5VTEw7CisgICAgICAgIHIgPSBpcC0+cHRyOworICAgICAgICBEQkdMT0coVEVTVCwgaWYgKHEpIFNPQVBfTUVTU0FHRShmZGVidWcsICJUcmF2ZXJzaW5nIGxpbmsgY2hhaW4gdG8gcmVzb2x2ZSBpZD0nJXMnXG4iLCBpcC0+aWQpKTsKKyAgICAgICAgd2hpbGUgKHEpCisgICAgICAgIHsgcCA9ICpxOworICAgICAgICAgICpxID0gcjsKKyAgICAgICAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiLi4uIGxpbmsgJXAgLT4gJXBcbiIsIHEsIHIpKTsKKyAgICAgICAgICBxID0gKHZvaWQqKilwOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmICgqaXAtPmlkID09ICcjJykKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJNaXNzaW5nIGRhdGEgZm9yIGlkPSclcydcbiIsIGlwLT5pZCkpOworICAgICAgICBzdHJjcHkoc29hcC0+aWQsIGlwLT5pZCArIDEpOworICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX01JU1NJTkdfSUQ7CisgICAgICB9CisgICAgfQorICB9CisgIGRvCisgIHsgZmxhZyA9IDA7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHV0aW9uIHBoYXNlXG4iKSk7CisgICAgZm9yIChpID0gMDsgaSA8IFNPQVBfSURIQVNIOyBpKyspCisgICAgeyBmb3IgKGlwID0gc29hcC0+aWh0W2ldOyBpcDsgaXAgPSBpcC0+bmV4dCkKKyAgICAgIHsgaWYgKGlwLT5wdHIgJiYgIXNvYXBfaGFzX2NvcGllcyhzb2FwLCAoY29uc3QgY2hhciopaXAtPnB0ciwgKGNvbnN0IGNoYXIqKWlwLT5wdHIgKyBpcC0+c2l6ZSkpCisgICAgICAgIHsgaWYgKGlwLT5jb3B5KQorICAgICAgICAgIHsgcmVnaXN0ZXIgdm9pZCAqcCwgKipxID0gKHZvaWQqKilpcC0+Y29weTsKKyAgICAgICAgICAgIERCR0xPRyhURVNULCBpZiAocSkgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlRyYXZlcnNpbmcgY29weSBjaGFpbiB0byByZXNvbHZlIGlkPSclcydcbiIsIGlwLT5pZCkpOworICAgICAgICAgICAgaXAtPmNvcHkgPSBOVUxMOworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIuLi4gY29weSAlcCAtPiAlcCAoJXUgYnl0ZXMpXG4iLCBpcC0+cHRyLCBxLCAodW5zaWduZWQgaW50KWlwLT5zaXplKSk7CisJICAgICAgcCA9ICpxOworICAgICAgICAgICAgICBtZW1jcHkocSwgaXAtPnB0ciwgaXAtPnNpemUpOworICAgICAgICAgICAgICBxID0gKHZvaWQqKilwOworICAgICAgICAgICAgfSB3aGlsZSAocSk7CisJICAgIGZsYWcgPSAxOworCSAgfQorICAgICAgICAgIGZvciAoZnAgPSBpcC0+Zmxpc3Q7IGZwOyBmcCA9IGlwLT5mbGlzdCkKKyAgICAgICAgICB7IHJlZ2lzdGVyIHVuc2lnbmVkIGludCBrID0gZnAtPmxldmVsOworCSAgICByZWdpc3RlciB2b2lkICpwID0gaXAtPnB0cjsKKyAgICAgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x2aW5nIGZvcndhcmRlZCBkYXRhIHR5cGU9JWQgbG9jYXRpb249JXAgbGV2ZWw9JXUsJXUgaWQ9JyVzJ1xuIiwgaXAtPnR5cGUsIHAsIGlwLT5sZXZlbCwgZnAtPmxldmVsLCBpcC0+aWQpKTsKKwkgICAgd2hpbGUgKGlwLT5sZXZlbCA8IGspCisgICAgICAgICAgICB7IHJlZ2lzdGVyIHZvaWQgKipxID0gKHZvaWQqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yodm9pZCopKTsgIAorCSAgICAgIGlmICghcSkKKwkgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKwkgICAgICAqcSA9IHA7CisgICAgICAgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVzY2VuZGluZyBvbmUgbGV2ZWwsIG5ldyBsb2NhdGlvbj0lcCBob2xkcz0lcC4uLlxuIiwgcSwgKnEpKTsKKyAgICAgICAgICAgICAgcCA9ICh2b2lkKilxOworICAgICAgICAgICAgICBrLS07CisgICAgICAgICAgICB9CisJICAgIGlmIChmcC0+ZmNvcHkpCisJICAgICAgZnAtPmZjb3B5KHNvYXAsIGlwLT50eXBlLCBmcC0+dHlwZSwgZnAtPnB0ciwgZnAtPmxlbiwgcCwgaXAtPnNpemUpOworCSAgICBlbHNlCisJICAgICAgc29hcF9mY29weShzb2FwLCBpcC0+dHlwZSwgZnAtPnR5cGUsIGZwLT5wdHIsIGZwLT5sZW4sIHAsIGlwLT5zaXplKTsKKwkgICAgaXAtPmZsaXN0ID0gZnAtPm5leHQ7CisJICAgIFNPQVBfRlJFRShzb2FwLCBmcCk7CisJICAgIGZsYWcgPSAxOworCSAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9IHdoaWxlIChmbGFnKTsKKyNpZmRlZiBTT0FQX0RFQlVHCisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0lESEFTSDsgaSsrKQorICB7IGZvciAoaXAgPSBzb2FwLT5paHRbaV07IGlwOyBpcCA9IGlwLT5uZXh0KQorICAgIHsgaWYgKGlwLT5jb3B5IHx8IGlwLT5mbGlzdCkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHV0aW9uIGVycm9yOiBmb3J3YXJkZWQgZGF0YSBmb3IgaWQ9JyVzJyBjb3VsZCBub3QgYmUgcHJvcGFnYXRlZCwgcGxlYXNlIHJlcG9ydCB0aGlzIHByb2JsZW0gdG8gdGhlIGRldmVsb3BlcnNcbiIsIGlwLT5pZCkpOworICAgICAgfQorICAgIH0KKyAgfQorI2VuZGlmCisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x1dGlvbiBkb25lXG4iKSk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzaXplX3QKK1NPQVBfRk1BQzIKK3NvYXBfc2l6ZV9ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCwgc2l6ZV90IG4pCit7IGlmIChzb2FwLT5ibGlzdC0+cHRyKQorICB7IHNvYXAtPmJsaXN0LT5zaXplIC09ICooc2l6ZV90Kikoc29hcC0+Ymxpc3QtPnB0ciArIHNpemVvZihjaGFyKikpIC0gbjsKKyAgICAqKHNpemVfdCopKHNvYXAtPmJsaXN0LT5wdHIgKyBzaXplb2YoY2hhciopKSA9IG47CisgIH0KKyAgcmV0dXJuIHNvYXAtPmJsaXN0LT5zaXplOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZmlyc3RfYmxvY2soc3RydWN0IHNvYXAgKnNvYXApCit7IGNoYXIgKnAsICpxLCAqcjsKKyAgcCA9IHNvYXAtPmJsaXN0LT5wdHI7CisgIGlmICghcCkKKyAgICByZXR1cm4gTlVMTDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGaXJzdCBibG9ja1xuIikpOworICByID0gTlVMTDsKKyAgZG8KKyAgeyBxID0gKihjaGFyKiopcDsKKyAgICAqKGNoYXIqKilwID0gcjsKKyAgICByID0gcDsKKyAgICBwID0gcTsKKyAgfSB3aGlsZSAocCk7CisgIHNvYXAtPmJsaXN0LT5wdHIgPSByOworICByZXR1cm4gciArIHNpemVvZihjaGFyKikgKyBzaXplb2Yoc2l6ZV90KTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NoYXIqCitTT0FQX0ZNQUMyCitzb2FwX25leHRfYmxvY2soc3RydWN0IHNvYXAgKnNvYXApCit7IGNoYXIgKnA7CisgIHAgPSBzb2FwLT5ibGlzdC0+cHRyOworICBpZiAocCkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk5leHQgYmxvY2tcbiIpKTsKKyAgICBzb2FwLT5ibGlzdC0+cHRyID0gKihjaGFyKiopcDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgcCk7CisgICAgaWYgKHNvYXAtPmJsaXN0LT5wdHIpCisgICAgICByZXR1cm4gc29hcC0+Ymxpc3QtPnB0ciArIHNpemVvZihjaGFyKikgKyBzaXplb2Yoc2l6ZV90KTsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3NpemVfdAorU09BUF9GTUFDMgorc29hcF9ibG9ja19zaXplKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZXR1cm4gKihzaXplX3QqKShzb2FwLT5ibGlzdC0+cHRyICsgc2l6ZW9mKGNoYXIqKSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2VuZF9ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfYmxpc3QgKmJwOworICBjaGFyICpwLCAqcTsKKyAgYnAgPSBzb2FwLT5ibGlzdDsKKyAgaWYgKGJwKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIG9mIGJsb2NrIHNlcXVlbmNlLCBmcmVlIGFsbCByZW1haW5pbmcgYmxvY2tzXG4iKSk7CisgICAgZm9yIChwID0gYnAtPnB0cjsgcDsgcCA9IHEpCisgICAgeyBxID0gKihjaGFyKiopcDsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBwKTsKKyAgICB9CisgICAgc29hcC0+Ymxpc3QgPSBicC0+bmV4dDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgYnApOworICB9CisgIERCR0xPRyhURVNULCBpZiAoc29hcC0+Ymxpc3QpIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXN0b3JlIHByZXZpb3VzIGJsb2NrIHNlcXVlbmNlXG4iKSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjaGFyKgorU09BUF9GTUFDMgorc29hcF9zYXZlX2Jsb2NrKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpwLCBpbnQgZmxhZykKK3sgcmVnaXN0ZXIgc2l6ZV90IG47CisgIHJlZ2lzdGVyIGNoYXIgKnEsICpzOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNhdmUgYWxsIGJsb2NrcyBpbiBjb250aWd1b3VzIG1lbW9yeSBzcGFjZSBvZiAldSBieXRlcyAoJXAtPiVwKVxuIiwgKHVuc2lnbmVkIGludClzb2FwLT5ibGlzdC0+c2l6ZSwgc29hcC0+Ymxpc3QtPnB0ciwgcCkpOworICBpZiAoc29hcC0+Ymxpc3QtPnNpemUpCisgIHsgaWYgKCFwKQorICAgICAgcCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzb2FwLT5ibGlzdC0+c2l6ZSk7CisgICAgaWYgKHApCisgICAgeyBmb3IgKHMgPSBwLCBxID0gc29hcF9maXJzdF9ibG9jayhzb2FwKTsgcTsgcSA9IHNvYXBfbmV4dF9ibG9jayhzb2FwKSkKKyAgICAgIHsgbiA9IHNvYXBfYmxvY2tfc2l6ZShzb2FwKTsKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgICAgICAgIGlmIChmbGFnKQorCSAgc29hcF91cGRhdGVfcHRycyhzb2FwLCBxLCBxICsgbiwgcywgcSk7CisjZW5kaWYKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5ICV1IGJ5dGVzIGZyb20gJXAgdG8gJXBcbiIsICh1bnNpZ25lZCBpbnQpbiwgcSwgcykpOworICAgICAgICBtZW1jcHkocywgcSwgbik7CisgICAgICAgIHMgKz0gbjsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgfQorICBzb2FwX2VuZF9ibG9jayhzb2FwKTsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfcHV0c2l6ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHNpemUpCit7IHJldHVybiBzb2FwX3B1dHNpemVzKHNvYXAsIHR5cGUsICZzaXplLCAxKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9wdXRzaXplcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgaW50ICpzaXplLCBpbnQgZGltKQoreyByZXR1cm4gc29hcF9wdXRzaXplc29mZnNldHMoc29hcCwgdHlwZSwgc2l6ZSwgTlVMTCwgZGltKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9wdXRzaXplc29mZnNldHMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGludCAqc2l6ZSwgY29uc3QgaW50ICpvZmZzZXQsIGludCBkaW0pCit7IGludCBpOworICBpZiAoIXR5cGUpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgIHsgc3ByaW50Zihzb2FwLT50eXBlLCAiJXNbJWQiLCB0eXBlLCBzaXplWzBdKTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgZGltOyBpKyspCisgICAgICBzcHJpbnRmKHNvYXAtPnR5cGUgKyBzdHJsZW4oc29hcC0+dHlwZSksICIgJWQiLCBzaXplW2ldKTsKKyAgfQorICBlbHNlCisgIHsgaWYgKG9mZnNldCkKKyAgICB7IHNwcmludGYoc29hcC0+dHlwZSwgIiVzWyVkIiwgdHlwZSwgc2l6ZVswXSArIG9mZnNldFswXSk7CisgICAgICBmb3IgKGkgPSAxOyBpIDwgZGltOyBpKyspCisgICAgICAgIHNwcmludGYoc29hcC0+dHlwZSArIHN0cmxlbihzb2FwLT50eXBlKSwgIiwlZCIsIHNpemVbaV0gKyBvZmZzZXRbaV0pOworICAgIH0KKyAgICBlbHNlCisgICAgeyBzcHJpbnRmKHNvYXAtPnR5cGUsICIlc1slZCIsIHR5cGUsIHNpemVbMF0pOworICAgICAgZm9yIChpID0gMTsgaSA8IGRpbTsgaSsrKQorICAgICAgICBzcHJpbnRmKHNvYXAtPnR5cGUgKyBzdHJsZW4oc29hcC0+dHlwZSksICIsJWQiLCBzaXplW2ldKTsKKyAgICB9CisgICAgc3RyY2F0KHNvYXAtPnR5cGUsICJdIik7CisgIH0KKyAgcmV0dXJuIHNvYXAtPnR5cGU7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfcHV0b2Zmc2V0KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgb2Zmc2V0KQoreyByZXR1cm4gc29hcF9wdXRvZmZzZXRzKHNvYXAsICZvZmZzZXQsIDEpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3B1dG9mZnNldHMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGludCAqb2Zmc2V0LCBpbnQgZGltKQoreyByZWdpc3RlciBpbnQgaTsKKyAgc3ByaW50Zihzb2FwLT5hcnJheU9mZnNldCwgIlslZCIsIG9mZnNldFswXSk7CisgIGZvciAoaSA9IDE7IGkgPCBkaW07IGkrKykKKyAgICBzcHJpbnRmKHNvYXAtPmFycmF5T2Zmc2V0ICsgc3RybGVuKHNvYXAtPmFycmF5T2Zmc2V0KSwgIiwlZCIsIG9mZnNldFtpXSk7CisgIHN0cmNhdChzb2FwLT5hcnJheU9mZnNldCwgIl0iKTsKKyAgcmV0dXJuIHNvYXAtPmFycmF5T2Zmc2V0OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NpemUoY29uc3QgaW50ICpzaXplLCBpbnQgZGltKQoreyByZWdpc3RlciBpbnQgaSwgbiA9IHNpemVbMF07CisgIGZvciAoaSA9IDE7IGkgPCBkaW07IGkrKykKKyAgICBuICo9IHNpemVbaV07CisgIHJldHVybiBuOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldG9mZnNldHMoY29uc3QgY2hhciAqYXR0ciwgY29uc3QgaW50ICpzaXplLCBpbnQgKm9mZnNldCwgaW50IGRpbSkKK3sgcmVnaXN0ZXIgaW50IGksIGogPSAwOworICBpZiAob2Zmc2V0KQorICAgIGZvciAoaSA9IDA7IGkgPCBkaW0gJiYgYXR0ciAmJiAqYXR0cjsgaSsrKQorICAgIHsgYXR0cisrOworICAgICAgaiAqPSBzaXplW2ldOworICAgICAgaiArPSBvZmZzZXRbaV0gPSAoaW50KWF0b2woYXR0cik7CisgICAgICBhdHRyID0gc3RyY2hyKGF0dHIsICcsJyk7CisgICAgfQorICBlbHNlCisgICAgZm9yIChpID0gMDsgaSA8IGRpbSAmJiBhdHRyICYmICphdHRyOyBpKyspCisgICAgeyBhdHRyKys7CisgICAgICBqICo9IHNpemVbaV07CisgICAgICBqICs9IChpbnQpYXRvbChhdHRyKTsKKyAgICAgIGF0dHIgPSBzdHJjaHIoYXR0ciwgJywnKTsKKyAgICB9CisgIHJldHVybiBqOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldHNpemUoY29uc3QgY2hhciAqYXR0cjEsIGNvbnN0IGNoYXIgKmF0dHIyLCBpbnQgKmopCit7IHJlZ2lzdGVyIGludCBuLCBrOworICBjaGFyICpzOworICAqaiA9IDA7CisgIGlmICghKmF0dHIxKQorICAgIHJldHVybiAtMTsKKyAgaWYgKCphdHRyMSA9PSAnWycpCisgICAgYXR0cjErKzsKKyAgbiA9IDE7CisgIGZvciAoOzspCisgIHsgayA9IChpbnQpc29hcF9zdHJ0b2woYXR0cjEsICZzLCAxMCk7CisgICAgbiAqPSBrOworICAgIGlmIChrIDwgMCB8fCBuID4gU09BUF9NQVhBUlJBWVNJWkUgfHwgcyA9PSBhdHRyMSkKKyAgICAgIHJldHVybiAtMTsKKyAgICBhdHRyMSA9IHN0cmNocihzLCAnLCcpOworICAgIGlmICghYXR0cjEpCisgICAgICBhdHRyMSA9IHN0cmNocihzLCAnICcpOworICAgIGlmIChhdHRyMiAmJiAqYXR0cjIpCisgICAgeyBhdHRyMisrOworICAgICAgKmogKj0gazsKKyAgICAgIGsgPSAoaW50KXNvYXBfc3RydG9sKGF0dHIyLCAmcywgMTApOworICAgICAgKmogKz0gazsKKyAgICAgIGlmIChrIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgYXR0cjIgPSBzOworICAgIH0KKyAgICBpZiAoIWF0dHIxKQorICAgICAgYnJlYWs7CisgICAgYXR0cjErKzsKKyAgfQorICByZXR1cm4gbiAtICpqOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldHNpemVzKGNvbnN0IGNoYXIgKmF0dHIsIGludCAqc2l6ZSwgaW50IGRpbSkKK3sgcmVnaXN0ZXIgaW50IGksIGssIG47CisgIGlmICghKmF0dHIpCisgICAgcmV0dXJuIC0xOworICBpID0gc3RybGVuKGF0dHIpOworICBuID0gMTsKKyAgZG8KKyAgeyBmb3IgKGkgPSBpLTE7IGkgPj0gMDsgaS0tKQorICAgICAgaWYgKGF0dHJbaV0gPT0gJ1snIHx8IGF0dHJbaV0gPT0gJywnIHx8IGF0dHJbaV0gPT0gJyAnKQorICAgICAgICBicmVhazsKKyAgICBrID0gKGludClhdG9sKGF0dHIgKyBpICsgMSk7CisgICAgbiAqPSBzaXplWy0tZGltXSA9IGs7CisgICAgaWYgKGsgPCAwIHx8IG4gPiBTT0FQX01BWEFSUkFZU0laRSkKKyAgICAgIHJldHVybiAtMTsKKyAgfSB3aGlsZSAoaSA+PSAwICYmIGF0dHJbaV0gIT0gJ1snKTsKKyAgcmV0dXJuIG47Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0cG9zaXRpb24oY29uc3QgY2hhciAqYXR0ciwgaW50ICpwb3MpCit7IHJlZ2lzdGVyIGludCBpLCBuOworICBpZiAoISphdHRyKQorICAgIHJldHVybiAtMTsKKyAgbiA9IDA7CisgIGkgPSAxOworICBkbworICB7IHBvc1tuKytdID0gKGludClhdG9sKGF0dHIgKyBpKTsKKyAgICB3aGlsZSAoYXR0cltpXSAmJiBhdHRyW2ldICE9ICcsJyAmJiBhdHRyW2ldICE9ICddJykKKyAgICAgIGkrKzsKKyAgICBpZiAoYXR0cltpXSA9PSAnLCcpCisgICAgICBpKys7CisgIH0gd2hpbGUgKG4gPCBTT0FQX01BWERJTVMgJiYgYXR0cltpXSAmJiBhdHRyW2ldICE9ICddJyk7CisgIHJldHVybiBuOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1c2hfbmFtZXNwYWNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqbnMpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucDsKKyAgcmVnaXN0ZXIgc3RydWN0IE5hbWVzcGFjZSAqcDsKKyAgcmVnaXN0ZXIgc2hvcnQgaSA9IC0xOworICByZWdpc3RlciBzaXplX3QgbiwgazsKKyAgbiA9IHN0cmxlbihpZCk7CisgIGsgPSBzdHJsZW4obnMpICsgMTsKKyAgcCA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXM7CisgIGlmIChwKQorICB7IGZvciAoaSA9IDA7IHAtPmlkOyBwKyssIGkrKykKKyAgICB7IGlmIChwLT5ucyAmJiAhc3RyY21wKG5zLCBwLT5ucykpCisgICAgICB7IGlmIChwLT5vdXQpCisgICAgICAgIHsgU09BUF9GUkVFKHNvYXAsIHAtPm91dCk7CisgICAgICAgICAgcC0+b3V0ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChwLT5vdXQpCisgICAgICB7IGlmICghc3RyY21wKG5zLCBwLT5vdXQpKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZWxzZSBpZiAocC0+aW4pCisgICAgICB7IGlmICghc29hcF90YWdfY21wKG5zLCBwLT5pbikpCisgICAgICAgIHsgaWYgKChwLT5vdXQgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgaykpKQorICAgICAgICAgICAgc3RyY3B5KHAtPm91dCwgbnMpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmICghcCB8fCAhcC0+aWQpCisgICAgICBpID0gLTE7CisgIH0KKyAgaWYgKGkgPj0gMCkKKyAgICBrID0gMDsKKyAgbnAgPSAoc3RydWN0IHNvYXBfbmxpc3QqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9ubGlzdCkgKyBuICsgayk7CisgIGlmICghbnApCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgIG5wLT5uZXh0ID0gc29hcC0+bmxpc3Q7CisgIHNvYXAtPm5saXN0ID0gbnA7CisgIG5wLT5sZXZlbCA9IHNvYXAtPmxldmVsOworICBucC0+aW5kZXggPSBpOworICBzdHJjcHkobnAtPmlkLCBpZCk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUHVzaCBuYW1lc3BhY2UgYmluZGluZyAobGV2ZWw9JXUpICclcycgJyVzJ1xuIiwgc29hcC0+bGV2ZWwsIGlkLCBucykpOworICBpZiAoaSA8IDApCisgIHsgbnAtPm5zID0gbnAtPmlkICsgbiArIDE7CisgICAgc3RyY3B5KG5wLT5ucywgbnMpOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUHVzaCBOT1QgT0s6IG5vIG1hdGNoIGZvdW5kIGZvciAnJXMnIGluIG5hbWVzcGFjZSBtYXBwaW5nIHRhYmxlIChhZGRlZCB0byBzdGFjayBhbnl3YXkpXG4iLCBucykpOworICB9CisgIGVsc2UKKyAgeyBucC0+bnMgPSBOVUxMOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUHVzaCBPSyAoJyVzJyBtYXRjaGVzICclcycgaW4gbmFtZXNwYWNlIHRhYmxlKVxuIiwgaWQsIHAtPmlkKSk7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3BvcF9uYW1lc3BhY2Uoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucDsKKyAgd2hpbGUgKHNvYXAtPm5saXN0ICYmIHNvYXAtPm5saXN0LT5sZXZlbCA+PSBzb2FwLT5sZXZlbCkKKyAgeyBucCA9IHNvYXAtPm5saXN0LT5uZXh0OworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUG9wcGVkIG5hbWVzcGFjZSBiaW5kaW5nIChsZXZlbD0ldSkgJyVzJ1xuIiwgc29hcC0+bGV2ZWwsIHNvYXAtPm5saXN0LT5pZCkpOworICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5ubGlzdCk7CisgICAgc29hcC0+bmxpc3QgPSBucDsKKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX21hdGNoX25hbWVzcGFjZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQxLCBjb25zdCBjaGFyICppZDIsIGludCBuMSwgaW50IG4yKSAKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wID0gc29hcC0+bmxpc3Q7CisgIHdoaWxlIChucCAmJiAoc3RybmNtcChucC0+aWQsIGlkMSwgbjEpIHx8IG5wLT5pZFtuMV0pKQorICAgIG5wID0gbnAtPm5leHQ7CisgIGlmIChucCkKKyAgeyBpZiAobnAtPmluZGV4IDwgMAorICAgICB8fCAoc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tucC0+aW5kZXhdLmlkCisgICAgICAmJiAoc3RybmNtcChzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW25wLT5pbmRleF0uaWQsIGlkMiwgbjIpCisgICAgICAgfHwgc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tucC0+aW5kZXhdLmlkW24yXSkpKQorICAgICAgcmV0dXJuIFNPQVBfTkFNRVNQQUNFOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIGlmIChuMSA9PSAzICYmIG4xID09IG4yICYmICFzdHJjbXAoaWQxLCAieG1sIikgJiYgIXN0cmNtcChpZDEsIGlkMikpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIHJldHVybiBTT0FQX1NZTlRBWF9FUlJPUjsgCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9jdXJyZW50X25hbWVzcGFjZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnA7CisgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnM7CisgIG5wID0gc29hcC0+bmxpc3Q7CisgIGlmICghKHMgPSBzdHJjaHIodGFnLCAnOicpKSkKKyAgeyB3aGlsZSAobnAgJiYgKm5wLT5pZCkgLyogZmluZCBkZWZhdWx0IG5hbWVzcGFjZSwgaWYgcHJlc2VudCAqLworICAgICAgbnAgPSBucC0+bmV4dDsKKyAgfQorICBlbHNlCisgIHsgd2hpbGUgKG5wICYmIChzdHJuY21wKG5wLT5pZCwgdGFnLCBzIC0gdGFnKSB8fCBucC0+aWRbcyAtIHRhZ10pKQorICAgICAgbnAgPSBucC0+bmV4dDsKKyAgICBpZiAoIW5wKQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX05BTUVTUEFDRTsKKyAgfQorICBpZiAobnApCisgIHsgaWYgKG5wLT5pbmRleCA+PSAwKQorICAgICAgcmV0dXJuIHNvYXAtPm5hbWVzcGFjZXNbbnAtPmluZGV4XS5uczsKKyAgICBpZiAobnAtPm5zKQorICAgICAgcmV0dXJuIHNvYXBfc3RyZHVwKHNvYXAsIG5wLT5ucyk7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfdGFnX2NtcChjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICp0KQoreyBmb3IgKDs7KQorICB7IHJlZ2lzdGVyIGludCBjMSA9ICpzOworICAgIHJlZ2lzdGVyIGludCBjMiA9ICp0OworICAgIGlmICghYzEgfHwgYzEgPT0gJyInKQorICAgICAgYnJlYWs7CisgICAgaWYgKGMyICE9ICctJykKKyAgICB7IGlmIChjMSAhPSBjMikKKyAgICAgIHsgaWYgKGMxID49ICdBJyAmJiBjMSA8PSAnWicpCisgICAgICAgICAgYzEgKz0gJ2EnIC0gJ0EnOworICAgICAgICBpZiAoYzIgPj0gJ0EnICYmIGMyIDw9ICdaJykKKyAgICAgICAgICBjMiArPSAnYScgLSAnQSc7CisgICAgICB9CisgICAgICBpZiAoYzEgIT0gYzIpCisgICAgICB7IGlmIChjMiAhPSAnKicpCisgICAgICAgICAgcmV0dXJuIDE7CisJYzIgPSAqKyt0OworICAgICAgICBpZiAoIWMyKQorCSAgcmV0dXJuIDA7CisgICAgICAgIGlmIChjMiA+PSAnQScgJiYgYzIgPD0gJ1onKQorICAgICAgICAgIGMyICs9ICdhJyAtICdBJzsKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeyBjMSA9ICpzOworCSAgaWYgKCFjMSB8fCBjMSA9PSAnIicpCisJICAgIGJyZWFrOworCSAgaWYgKGMxID49ICdBJyAmJiBjMSA8PSAnWicpCisgICAgICAgICAgICBjMSArPSAnYScgLSAnQSc7CisgICAgICAgICAgaWYgKGMxID09IGMyICYmICFzb2FwX3RhZ19jbXAocyArIDEsIHQgKyAxKSkKKyAgICAgICAgICAgIHJldHVybiAwOworCSAgcysrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBzKys7CisgICAgdCsrOworICB9CisgIGlmICgqdCA9PSAnKicgJiYgIXRbMV0pCisgICAgcmV0dXJuIDA7CisgIHJldHVybiAqdDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9tYXRjaF90YWcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZzEsIGNvbnN0IGNoYXIgKnRhZzIpCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnMsICp0OworICBpZiAoIXRhZzEgfHwgIXRhZzIgfHwgISp0YWcyKQorICAgIHJldHVybiBTT0FQX09LOworICBzID0gc3RyY2hyKHRhZzEsICc6Jyk7CisgIHQgPSBzdHJjaHIodGFnMiwgJzonKTsKKyAgaWYgKHQpCisgIHsgaWYgKHMpCisgICAgeyBpZiAodFsxXSAmJiBTT0FQX1NUUkNNUChzICsgMSwgdCArIDEpKQorICAgICAgICByZXR1cm4gU09BUF9UQUdfTUlTTUFUQ0g7CisgICAgICBpZiAodCAhPSB0YWcyICYmIHNvYXBfbWF0Y2hfbmFtZXNwYWNlKHNvYXAsIHRhZzEsIHRhZzIsIHMgLSB0YWcxLCB0IC0gdGFnMikpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVGFncyAnJXMnIGFuZCAnJXMnIG1hdGNoIGJ1dCBuYW1lc3BhY2VzIGRpZmZlclxuIiwgdGFnMSwgdGFnMikpOworICAgICAgICByZXR1cm4gU09BUF9UQUdfTUlTTUFUQ0g7CisgICAgICB9CisgICAgfSAKKyAgICBlbHNlIGlmIChTT0FQX1NUUkNNUCh0YWcxLCB0ICsgMSkpCisgICAgICByZXR1cm4gU09BUF9UQUdfTUlTTUFUQ0g7CisgICAgZWxzZSBpZiAodCAhPSB0YWcyICYmIHNvYXBfbWF0Y2hfbmFtZXNwYWNlKHNvYXAsIHRhZzEsIHRhZzIsIDAsIHQgLSB0YWcyKSkKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVGFncyAnJXMnIGFuZCAnJXMnIG1hdGNoIGJ1dCBuYW1lc3BhY2VzIGRpZmZlclxuIiwgdGFnMSwgdGFnMikpOworICAgICAgcmV0dXJuIFNPQVBfVEFHX01JU01BVENIOworICAgIH0KKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlRhZ3MgYW5kIChkZWZhdWx0KSBuYW1lc3BhY2VzIG1hdGNoOiAnJXMnICclcydcbiIsIHRhZzEsIHRhZzIpKTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICBpZiAocykKKyAgeyBpZiAoU09BUF9TVFJDTVAocyArIDEsIHRhZzIpKQorICAgICAgcmV0dXJuIFNPQVBfVEFHX01JU01BVENIOworICB9CisgIGVsc2UgaWYgKFNPQVBfU1RSQ01QKHRhZzEsIHRhZzIpKQorICAgIHJldHVybiBTT0FQX1RBR19NSVNNQVRDSDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJUYWdzIG1hdGNoOiAnJXMnICclcydcbiIsIHRhZzEsIHRhZzIpKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfbWF0Y2hfYXJyYXkoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnR5cGUpCit7IGlmICgqc29hcC0+YXJyYXlUeXBlKQorICAgIGlmIChzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT5hcnJheVR5cGUsIHR5cGUpCisgICAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPmFycmF5VHlwZSwgInhzZDphbnlUeXBlIikKKyAgICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+YXJyYXlUeXBlLCAieHNkOnVyLXR5cGUiKQorICAgICkKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQXJyYXkgdHlwZSBtaXNtYXRjaDogJyVzJyAnJXMnXG4iLCBzb2FwLT5hcnJheVR5cGUsIHR5cGUpKTsKKyAgICAgIHJldHVybiBTT0FQX1RBR19NSVNNQVRDSDsKKyAgICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJU1NMCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIFdJVEhfT1BFTlNTTAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmFuZCgpCit7IHVuc2lnbmVkIGNoYXIgYnVmWzRdOworICBpZiAoIXNzbF9pbml0X2RvbmUpCisgICAgc29hcF9zc2xfaW5pdCgpOworICBSQU5EX3BzZXVkb19ieXRlcyhidWYsIDQpOworICByZXR1cm4gKihpbnQqKWJ1ZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zc2xfc2VydmVyX2NvbnRleHQoc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIHNob3J0IGZsYWdzLCBjb25zdCBjaGFyICprZXlmaWxlLCBjb25zdCBjaGFyICpwYXNzd29yZCwgY29uc3QgY2hhciAqY2FmaWxlLCBjb25zdCBjaGFyICpjYXBhdGgsIGNvbnN0IGNoYXIgKmRoZmlsZSwgY29uc3QgY2hhciAqcmFuZGZpbGUsIGNvbnN0IGNoYXIgKnNpZCkKK3sgaW50IGVycjsKKyAgc29hcC0+a2V5ZmlsZSA9IGtleWZpbGU7CisgIHNvYXAtPnBhc3N3b3JkID0gcGFzc3dvcmQ7CisgIHNvYXAtPmNhZmlsZSA9IGNhZmlsZTsKKyAgc29hcC0+Y2FwYXRoID0gY2FwYXRoOworICBpZiAoZGhmaWxlKQorICB7IHNvYXAtPmRoZmlsZSA9IGRoZmlsZTsKKyAgICBzb2FwLT5yc2EgPSAwOworICB9CisgIGVsc2UKKyAgeyBzb2FwLT5kaGZpbGUgPSBOVUxMOworICAgIHNvYXAtPnJzYSA9IDE7CisgIH0KKyAgc29hcC0+cmFuZGZpbGUgPSByYW5kZmlsZTsKKyAgc29hcC0+cmVxdWlyZV9jbGllbnRfYXV0aCA9IChmbGFncyAmIFNPQVBfU1NMX1JFUVVJUkVfQ0xJRU5UX0FVVEhFTlRJQ0FUSU9OKTsKKyAgaWYgKCEoZXJyID0gc29hcC0+ZnNzbGF1dGgoc29hcCkpKQorICB7IGlmIChzaWQpCisgICAgICBTU0xfQ1RYX3NldF9zZXNzaW9uX2lkX2NvbnRleHQoc29hcC0+Y3R4LCAodW5zaWduZWQgY2hhciopc2lkLCBzdHJsZW4oc2lkKSk7CisgIH0KKyAgcmV0dXJuIGVycjsgCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc3NsX2NsaWVudF9jb250ZXh0KHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBzaG9ydCBmbGFncywgY29uc3QgY2hhciAqa2V5ZmlsZSwgY29uc3QgY2hhciAqcGFzc3dvcmQsIGNvbnN0IGNoYXIgKmNhZmlsZSwgY29uc3QgY2hhciAqY2FwYXRoLCBjb25zdCBjaGFyICpyYW5kZmlsZSkKK3sgc29hcC0+a2V5ZmlsZSA9IGtleWZpbGU7CisgIHNvYXAtPnBhc3N3b3JkID0gcGFzc3dvcmQ7CisgIHNvYXAtPmNhZmlsZSA9IGNhZmlsZTsKKyAgc29hcC0+Y2FwYXRoID0gY2FwYXRoOworICBzb2FwLT5kaGZpbGUgPSBOVUxMOworICBzb2FwLT5yc2EgPSAwOworICBzb2FwLT5yYW5kZmlsZSA9IHJhbmRmaWxlOworICBzb2FwLT5yZXF1aXJlX3NlcnZlcl9hdXRoID0gKGZsYWdzICYgU09BUF9TU0xfUkVRVUlSRV9TRVJWRVJfQVVUSEVOVElDQVRJT04pOworICByZXR1cm4gc29hcC0+ZnNzbGF1dGgoc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NzbF9pbml0KCkKK3sgLyogTm90ZTogZm9yIE1UIHN5c3RlbXMsIHRoZSBtYWluIHByb2dyYW0gTVVTVCBjYWxsIHNvYXBfc3NsX2luaXQoKSBiZWZvcmUgYW55IHRocmVhZHMgYXJlIHN0YXJ0ZWQgKi8KKyAgaWYgKCFzc2xfaW5pdF9kb25lKQorICB7IHNzbF9pbml0X2RvbmUgPSAxOworICAgIFNTTF9saWJyYXJ5X2luaXQoKTsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgU1NMX2xvYWRfZXJyb3Jfc3RyaW5ncygpOworI2VuZGlmCisgICAgaWYgKCFSQU5EX2xvYWRfZmlsZSgiL2Rldi91cmFuZG9tIiwgMTAyNCkpCisgICAgeyBjaGFyIGJ1ZlsxMDI0XTsKKyAgICAgIFJBTkRfc2VlZChidWYsIHNpemVvZihidWYpKTsKKyAgICAgIHdoaWxlICghUkFORF9zdGF0dXMoKSkKKyAgICAgIHsgaW50IHIgPSByYW5kKCk7CisgICAgICAgIFJBTkRfc2VlZCgmciwgc2l6ZW9mKGludCkpOworICAgICAgfQorICAgIH0KKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNvbnN0IGNoYXIgKgorc3NsX2Vycm9yKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgcmV0KQoreyBpbnQgZXJyID0gU1NMX2dldF9lcnJvcihzb2FwLT5zc2wsIHJldCk7CisgIGNvbnN0IGNoYXIgKm1zZyA9IHNvYXBfc3RyX2NvZGUoaF9zc2xfZXJyb3JfY29kZXMsIGVycik7CisgIGlmIChtc2cpCisgICAgc3RyY3B5KHNvYXAtPm1zZ2J1ZiwgbXNnKTsKKyAgZWxzZQorICAgIHJldHVybiBFUlJfZXJyb3Jfc3RyaW5nKGVyciwgc29hcC0+bXNnYnVmKTsKKyAgaWYgKEVSUl9wZWVrX2Vycm9yKCkpCisgIHsgdW5zaWduZWQgbG9uZyByOworICAgIHN0cmNhdChzb2FwLT5tc2didWYsICJcbiIpOworICAgIHdoaWxlICgociA9IEVSUl9nZXRfZXJyb3IoKSkpCisgICAgICBFUlJfZXJyb3Jfc3RyaW5nX24ociwgc29hcC0+bXNnYnVmICsgc3RybGVuKHNvYXAtPm1zZ2J1ZiksIHNpemVvZihzb2FwLT5tc2didWYpIC0gc3RybGVuKHNvYXAtPm1zZ2J1ZikpOworICB9IAorICBlbHNlCisgIHsgc3dpdGNoIChyZXQpCisgICAgeyBjYXNlIDA6CisgICAgICAgIHN0cmNweShzb2FwLT5tc2didWYsICJFT0Ygd2FzIG9ic2VydmVkIHRoYXQgdmlvbGF0ZXMgdGhlIHByb3RvY29sLiBUaGUgY2xpZW50IHByb2JhYmx5IHByb3ZpZGVkIGludmFsaWQgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24uIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAtMToKKyAgICAgICAgc3ByaW50Zihzb2FwLT5tc2didWYsICJFcnJvciBvYnNlcnZlZCBieSB1bmRlcmx5aW5nIEJJTzogJXMiLCBzdHJlcnJvcihlcnJubykpOyAgCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gc29hcC0+bXNnYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc3NsX3Bhc3N3b3JkKGNoYXIgKmJ1ZiwgaW50IG51bSwgaW50IHJ3ZmxhZywgdm9pZCAqdXNlcmRhdGEpCit7IGlmIChudW0gPCAoaW50KXN0cmxlbigoY2hhciopdXNlcmRhdGEpICsgMSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIHN0cmxlbihzdHJjcHkoYnVmLCAoY2hhciopdXNlcmRhdGEpKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVGhpcyBjYWxsYmFjayBpcyBpbmNsdWRlZCBmb3IgZnV0dXJlIHJlZmVyZW5jZXMuIEl0IHNob3VsZCBub3QgYmUgZGVsZXRlZAorI2lmbmRlZiBQQUxNXzIKK3N0YXRpYyBESCAqCitzc2xfdG1wX2RoKFNTTCAqc3NsLCBpbnQgaXNfZXhwb3J0LCBpbnQga2V5bGVuZ3RoKQoreyBzdGF0aWMgREggKmRoNTEyID0gTlVMTDsKKyAgc3RhdGljIERIICpkaDEwMjQgPSBOVUxMOworICBESCAqZGg7CisgIHN3aXRjaCAoa2V5bGVuZ3RoKQorICB7IGNhc2UgNTEyOgorICAgICAgaWYgKCFkaDUxMikKKyAgICAgIHsgQklPICpiaW8gPSBCSU9fbmV3X2ZpbGUoImRoNTEyLnBlbSIsICJyIik7CisgICAgICAgIGlmIChiaW8pCisgICAgICAgIHsgZGg1MTIgPSBQRU1fcmVhZF9iaW9fREhwYXJhbXMoYmlvLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICBCSU9fZnJlZShiaW8pOworICAgICAgICAgIHJldHVybiBkaDUxMjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gZGg1MTI7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmICghZGgxMDI0KQorICAgICAgeyBCSU8gKmJpbyA9IEJJT19uZXdfZmlsZSgiZGgxMDI0LnBlbSIsICJyIik7CisgICAgICAgIGlmIChiaW8pCisgICAgICAgIHsgZGgxMDI0ID0gUEVNX3JlYWRfYmlvX0RIcGFyYW1zKGJpbywgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgQklPX2ZyZWUoYmlvKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZGggPSBkaDEwMjQ7CisgIH0KKyAgcmV0dXJuIGRoOworfQorI2VuZGlmCisqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NzbF9hdXRoX2luaXQoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmICghc3NsX2luaXRfZG9uZSkKKyAgICBzb2FwX3NzbF9pbml0KCk7CisgIGlmICghc29hcC0+Y3R4KQorICB7IGlmICghKHNvYXAtPmN0eCA9IFNTTF9DVFhfbmV3KFNTTHYyM19tZXRob2QoKSkpKQorICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3Qgc2V0dXAgY29udGV4dCIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgfQorICBpZiAoc29hcC0+cmFuZGZpbGUpCisgIHsgaWYgKCFSQU5EX2xvYWRfZmlsZShzb2FwLT5yYW5kZmlsZSwgLTEpKQorICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3QgbG9hZCByYW5kb21uZXNzIiwgU09BUF9TU0xfRVJST1IpOworICB9CisgIGlmIChzb2FwLT5jYWZpbGUgfHwgc29hcC0+Y2FwYXRoKQorICB7IGlmICghU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoc29hcC0+Y3R4LCBzb2FwLT5jYWZpbGUsIHNvYXAtPmNhcGF0aCkpCisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCByZWFkIENBIGZpbGUgYW5kIGRpcmVjdG9yeSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICBpZiAoc29hcC0+Y2FmaWxlICYmIHNvYXAtPnJlcXVpcmVfY2xpZW50X2F1dGgpCisgICAgICBTU0xfQ1RYX3NldF9jbGllbnRfQ0FfbGlzdChzb2FwLT5jdHgsIFNTTF9sb2FkX2NsaWVudF9DQV9maWxlKHNvYXAtPmNhZmlsZSkpOworICB9CisgIGlmICghU1NMX0NUWF9zZXRfZGVmYXVsdF92ZXJpZnlfcGF0aHMoc29hcC0+Y3R4KSkKKyAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCByZWFkIGRlZmF1bHQgQ0EgZmlsZSBhbmQvb3IgZGlyZWN0b3J5IiwgU09BUF9TU0xfRVJST1IpOworLyogU2VlIGJlbG93ICovCisgIGlmIChzb2FwLT5rZXlmaWxlKQorICB7IGlmICghU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZShzb2FwLT5jdHgsIHNvYXAtPmtleWZpbGUpKQorICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3QgcmVhZCBjZXJ0aWZpY2F0ZSBrZXkgZmlsZSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICBpZiAoc29hcC0+cGFzc3dvcmQpCisgICAgeyBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYl91c2VyZGF0YShzb2FwLT5jdHgsICh2b2lkKilzb2FwLT5wYXNzd29yZCk7CisgICAgICBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYihzb2FwLT5jdHgsIHNzbF9wYXNzd29yZCk7CisgICAgfQorICAgIGlmICghU1NMX0NUWF91c2VfUHJpdmF0ZUtleV9maWxlKHNvYXAtPmN0eCwgc29hcC0+a2V5ZmlsZSwgU1NMX0ZJTEVUWVBFX1BFTSkpCisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCByZWFkIGtleSBmaWxlIiwgU09BUF9TU0xfRVJST1IpOworICB9CisvKiBTdWdnZXN0ZWQgYWx0ZXJuYXRpdmUgYXBwcm9hY2ggdG8gY2hlY2sgY2FmaWxlIGZpcnN0IGJlZm9yZSB0aGUga2V5IGZpbGU6CisgIGlmIChzb2FwLT5wYXNzd29yZCkKKyAgeyBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYl91c2VyZGF0YShzb2FwLT5jdHgsICh2b2lkKilzb2FwLT5wYXNzd29yZCk7CisgICAgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2Ioc29hcC0+Y3R4LCBzc2xfcGFzc3dvcmQpOworICB9CisgIGlmICghc29hcC0+Y2FmaWxlIHx8ICFTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKHNvYXAtPmN0eCwgc29hcC0+Y2FmaWxlKSkKKyAgeyBpZiAoc29hcC0+a2V5ZmlsZSkKKyAgICB7IGlmICghU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZShzb2FwLT5jdHgsIHNvYXAtPmtleWZpbGUpKQorICAgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCByZWFkIGNlcnRpZmljYXRlIG9yIGtleSBmaWxlIiwgU09BUF9TU0xfRVJST1IpOworICAgICAgaWYgKCFTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X2ZpbGUoc29hcC0+Y3R4LCBzb2FwLT5rZXlmaWxlLCBTU0xfRklMRVRZUEVfUEVNKSkKKyAgICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3QgcmVhZCBrZXkgZmlsZSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICB9CisgIH0KKyovCisgIGlmIChzb2FwLT5yc2EpCisgIHsgUlNBICpyc2EgPSBSU0FfZ2VuZXJhdGVfa2V5KDEwMjQsIFJTQV9GNCwgTlVMTCwgTlVMTCk7CisgICAgaWYgKCFTU0xfQ1RYX3NldF90bXBfcnNhKHNvYXAtPmN0eCwgcnNhKSkKKyAgICB7IGlmIChyc2EpCisgICAgICAgIFJTQV9mcmVlKHJzYSk7CisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCBzZXQgUlNBIGtleSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICB9CisgICAgUlNBX2ZyZWUocnNhKTsKKyAgfQorICBlbHNlIGlmIChzb2FwLT5kaGZpbGUpCisgIHsgREggKmRoID0gMDsKKyAgICBCSU8gKmJpbzsKKyAgICBiaW8gPSBCSU9fbmV3X2ZpbGUoc29hcC0+ZGhmaWxlLCAiciIpOworICAgIGlmICghYmlvKQorICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3QgcmVhZCBESCBmaWxlIiwgU09BUF9TU0xfRVJST1IpOworICAgIGRoID0gUEVNX3JlYWRfYmlvX0RIcGFyYW1zKGJpbywgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgQklPX2ZyZWUoYmlvKTsKKyAgICBpZiAoU1NMX0NUWF9zZXRfdG1wX2RoKHNvYXAtPmN0eCwgZGgpIDwgMCkKKyAgICB7IGlmIChkaCkKKyAgICAgICAgREhfZnJlZShkaCk7CisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCBzZXQgREggcGFyYW1ldGVycyIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICB9CisgICAgREhfZnJlZShkaCk7CisgIH0KKyAgU1NMX0NUWF9zZXRfb3B0aW9ucyhzb2FwLT5jdHgsIFNTTF9PUF9BTEwgfCBTU0xfT1BfTk9fU1NMdjIpOworICBTU0xfQ1RYX3NldF92ZXJpZnkoc29hcC0+Y3R4LCBzb2FwLT5yZXF1aXJlX2NsaWVudF9hdXRoID8gKFNTTF9WRVJJRllfUEVFUiB8IFNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQpIDogc29hcC0+cmVxdWlyZV9zZXJ2ZXJfYXV0aCA/IFNTTF9WRVJJRllfUEVFUiA6IFNTTF9WRVJJRllfTk9ORSwgc29hcC0+ZnNzbHZlcmlmeSk7CisjaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCAweDAwOTA1MTAwTCkKKyAgU1NMX0NUWF9zZXRfdmVyaWZ5X2RlcHRoKHNvYXAtPmN0eCwgMSk7IAorI2Vsc2UKKyAgU1NMX0NUWF9zZXRfdmVyaWZ5X2RlcHRoKHNvYXAtPmN0eCwgOSk7IAorI2VuZGlmICAKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzc2xfdmVyaWZ5X2NhbGxiYWNrKGludCBvaywgWDUwOV9TVE9SRV9DVFggKnN0b3JlKQoreworI2lmZGVmIFNPQVBfREVCVUcKKyAgaWYgKCFvaykgCisgIHsgY2hhciBkYXRhWzI1Nl07CisgICAgWDUwOSAqY2VydCA9IFg1MDlfU1RPUkVfQ1RYX2dldF9jdXJyZW50X2NlcnQoc3RvcmUpOworICAgIGZwcmludGYoc3RkZXJyLCAiU1NMIHZlcmlmeSBlcnJvciBvciB3YXJuaW5nIHdpdGggY2VydGlmaWNhdGUgYXQgZGVwdGggJWQ6ICVzXG4iLCBYNTA5X1NUT1JFX0NUWF9nZXRfZXJyb3JfZGVwdGgoc3RvcmUpLCBYNTA5X3ZlcmlmeV9jZXJ0X2Vycm9yX3N0cmluZyhYNTA5X1NUT1JFX0NUWF9nZXRfZXJyb3Ioc3RvcmUpKSk7CisgICAgWDUwOV9OQU1FX29uZWxpbmUoWDUwOV9nZXRfaXNzdWVyX25hbWUoY2VydCksIGRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgZnByaW50ZihzdGRlcnIsICJjZXJ0aWZpY2F0ZSBpc3N1ZXIgJXNcbiIsIGRhdGEpOworICAgIFg1MDlfTkFNRV9vbmVsaW5lKFg1MDlfZ2V0X3N1YmplY3RfbmFtZShjZXJ0KSwgZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImNlcnRpZmljYXRlIHN1YmplY3QgJXNcbiIsIGRhdGEpOworICB9CisjZW5kaWYKKyAgLyogTm90ZTogcmV0dXJuIDEgdG8gY29udGludWUsIGJ1dCB1bnNhZmUgcHJvZ3Jlc3Mgd2lsbCBiZSB0ZXJtaW5hdGVkIGJ5IFNTTCAqLworICByZXR1cm4gb2s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc3NsX2FjY2VwdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgQklPICpiaW87CisgIGludCBpLCByOworICBpZiAoIXNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiTm8gc29ja2V0IGluIHNvYXBfc3NsX2FjY2VwdCgpIiwgU09BUF9TU0xfRVJST1IpOworICBpZiAoIXNvYXAtPmN0eCAmJiAoc29hcC0+ZXJyb3IgPSBzb2FwLT5mc3NsYXV0aChzb2FwKSkpCisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIGlmICghc29hcC0+c3NsKQorICB7IHNvYXAtPnNzbCA9IFNTTF9uZXcoc29hcC0+Y3R4KTsKKyAgICBpZiAoIXNvYXAtPnNzbCkKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIlNTTF9uZXcoKSBmYWlsZWQgaW4gc29hcF9zc2xfYWNjZXB0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgIH0KKyAgZWxzZQorICAgIFNTTF9jbGVhcihzb2FwLT5zc2wpOworICBzb2FwLT5pbW9kZSB8PSBTT0FQX0VOQ19TU0w7CisgIHNvYXAtPm9tb2RlIHw9IFNPQVBfRU5DX1NTTDsKKyNpZiBkZWZpbmVkKFdJTjMyKQorICB7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRklPTkJJTywgJm5vbmJsb2NraW5nKTsKKyAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICB7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgaW9jdGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRklPTkJJTywgKGludCkmbm9uYmxvY2tpbmcpOworICB9CisjZWxzZQorICBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGX0dFVEZMKXxPX05PTkJMT0NLKTsKKyNlbmRpZgorICBiaW8gPSBCSU9fbmV3X3NvY2tldCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBCSU9fTk9DTE9TRSk7CisgIFNTTF9zZXRfYmlvKHNvYXAtPnNzbCwgYmlvLCBiaW8pOworICBpID0gMTAwOyAvKiAxMDAgKiAwLjEgbXMgcmV0cmllcyAqLworICB3aGlsZSAoKHIgPSBTU0xfYWNjZXB0KHNvYXAtPnNzbCkpIDw9IDApCisgIHsgaW50IGVyciA9IFNTTF9nZXRfZXJyb3Ioc29hcC0+c3NsLCByKTsKKyAgICBpZiAoZXJyID09IFNTTF9FUlJPUl9XQU5UX1JFQUQgfHwgZXJyID09IFNTTF9FUlJPUl9XQU5UX1dSSVRFKQorICAgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgIGZkX3NldCBmZDsKKyAgICAgIGlmIChpLS0gPD0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICB0aW1lb3V0LnR2X3NlYyA9IDA7CisgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAxMDAwMDA7CisgICAgICBGRF9aRVJPKCZmZCk7CisgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJmZkKTsKKyAgICAgIHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgJmZkLCBOVUxMLCAmZmQsICZ0aW1lb3V0KTsKKyAgICAgIGlmIChyIDwgMCAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSKQorICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgcmV0dXJuIFNPQVBfRU9GOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeyBzb2FwLT5lcnJudW0gPSBlcnI7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyNpZiBkZWZpbmVkKFdJTjMyKQorICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRklPTkJJTywgJmJsb2NraW5nKTsKKyAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgaW9jdGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRklPTkJJTywgKGludCkmYmxvY2tpbmcpOworICB9CisjZWxzZQorICBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGX0dFVEZMKSZ+T19OT05CTE9DSyk7CisjZW5kaWYKKyAgaWYgKHIgPD0gMCkKKyAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCBzc2xfZXJyb3Ioc29hcCwgciksICJTU0xfYWNjZXB0KCkgZmFpbGVkIGluIHNvYXBfc3NsX2FjY2VwdCgpIiwgU09BUF9TU0xfRVJST1IpOworICAgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgIHJldHVybiBTT0FQX1NTTF9FUlJPUjsKKyAgfQorICBpZiAoc29hcC0+cmVxdWlyZV9jbGllbnRfYXV0aCkKKyAgeyBYNTA5ICpwZWVyOworICAgIGludCBlcnI7CisgICAgaWYgKChlcnIgPSBTU0xfZ2V0X3ZlcmlmeV9yZXN1bHQoc29hcC0+c3NsKSkgIT0gWDUwOV9WX09LKQorICAgIHsgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICByZXR1cm4gc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIFg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKGVyciksICJTU0wgY2VydGlmaWNhdGUgcHJlc2VudGVkIGJ5IHBlZXIgY2Fubm90IGJlIHZlcmlmaWVkIGluIHNvYXBfc3NsX2FjY2VwdCgpIiwgU09BUF9TU0xfRVJST1IpOworICAgIH0KKyAgICBwZWVyID0gU1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKHNvYXAtPnNzbCk7CisgICAgaWYgKCFwZWVyKQorICAgIHsgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICByZXR1cm4gc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiTm8gU1NMIGNlcnRpZmljYXRlIHdhcyBwcmVzZW50ZWQgYnkgdGhlIHBlZXIgaW4gc29hcF9zc2xfYWNjZXB0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgfQorICAgIFg1MDlfZnJlZShwZWVyKTsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2VuZGlmIC8qIFdJVEhfT1BFTlNTTCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Cit0Y3BfaW5pdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+ZXJybW9kZSA9IDE7CisjaWZkZWYgV0lOMzIKKyAgaWYgKHRjcF9kb25lKQorICAgIHJldHVybiAwOworICBlbHNlCisgIHsgV1NBREFUQSB3OworICAgIGlmIChXU0FTdGFydHVwKE1BS0VXT1JEKDEsIDEpLCAmdykpCisgICAgICByZXR1cm4gLTE7CisgICAgdGNwX2RvbmUgPSAxOworICB9CisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZG9uZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgCisjaWZkZWYgU09BUF9ERUJVRworICBpbnQgaTsKKyNlbmRpZgorICBpZiAoc29hcF9jaGVja19zdGF0ZShzb2FwKSkKKyAgICByZXR1cm47CisgIHNvYXBfZnJlZShzb2FwKTsKKyAgd2hpbGUgKHNvYXAtPmNsaXN0KQorICB7IHN0cnVjdCBzb2FwX2NsaXN0ICpwID0gc29hcC0+Y2xpc3QtPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPmNsaXN0KTsKKyAgICBzb2FwLT5jbGlzdCA9IHA7CisgIH0KKyAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7IC8qIHRvIGZvcmNlIGNsb3NlIHRoZSBzb2NrZXQgKi8KKyAgc29hcF9jbG9zZXNvY2soc29hcCk7CisjaWZkZWYgV0lUSF9DT09LSUVTCisgIHNvYXBfZnJlZV9jb29raWVzKHNvYXApOworI2VuZGlmCisgIHdoaWxlIChzb2FwLT5wbHVnaW5zKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BsdWdpbiAqcCA9IHNvYXAtPnBsdWdpbnMtPm5leHQ7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZW1vdmluZyBwbHVnaW4gJyVzJ1xuIiwgc29hcC0+cGx1Z2lucy0+aWQpKTsKKyAgICBpZiAoc29hcC0+cGx1Z2lucy0+ZmNvcHkgfHwgc29hcC0+c3RhdGUgPT0gU09BUF9JTklUKQorICAgICAgc29hcC0+cGx1Z2lucy0+ZmRlbGV0ZShzb2FwLCBzb2FwLT5wbHVnaW5zKTsKKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+cGx1Z2lucyk7CisgICAgc29hcC0+cGx1Z2lucyA9IHA7CisgIH0KKyAgc29hcC0+ZnBsdWdpbiA9IGZwbHVnaW47CisjaWZuZGVmIFdJVEhfTk9IVFRQCisgIHNvYXAtPmZwb3N0ID0gaHR0cF9wb3N0OworICBzb2FwLT5mZ2V0ID0gaHR0cF9nZXQ7CisgIHNvYXAtPmZmb3JtID0gTlVMTDsKKyAgc29hcC0+ZnBvc3RoZHIgPSBodHRwX3Bvc3RfaGVhZGVyOworICBzb2FwLT5mcmVzcG9uc2UgPSBodHRwX3Jlc3BvbnNlOworICBzb2FwLT5mcGFyc2UgPSBodHRwX3BhcnNlOworICBzb2FwLT5mcGFyc2VoZHIgPSBodHRwX3BhcnNlX2hlYWRlcjsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9JUFY2CisgIHNvYXAtPmZyZXNvbHZlID0gdGNwX2dldGhvc3Q7CisjZWxzZQorICBzb2FwLT5mcmVzb2x2ZSA9IE5VTEw7CisjZW5kaWYKKyAgc29hcC0+ZmFjY2VwdCA9IHRjcF9hY2NlcHQ7CisgIHNvYXAtPmZvcGVuID0gdGNwX2Nvbm5lY3Q7CisgIHNvYXAtPmZjbG9zZSA9IHRjcF9kaXNjb25uZWN0OworICBzb2FwLT5mY2xvc2Vzb2NrZXQgPSB0Y3BfY2xvc2Vzb2NrZXQ7CisgIHNvYXAtPmZzaHV0ZG93bnNvY2tldCA9IHRjcF9zaHV0ZG93bnNvY2tldDsKKyAgc29hcC0+ZnNlbmQgPSBmc2VuZDsKKyAgc29hcC0+ZnJlY3YgPSBmcmVjdjsKKyAgc29hcC0+ZnBvbGwgPSBzb2FwX3BvbGw7CisjZWxzZQorICBzb2FwLT5mb3BlbiA9IE5VTEw7CisgIHNvYXAtPmZjbG9zZSA9IE5VTEw7CisgIHNvYXAtPmZwb2xsID0gTlVMTDsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzb2FwLT5mcHJlcGFyZWluaXQgPSBOVUxMOworICBzb2FwLT5mcHJlcGFyZXNlbmQgPSBOVUxMOworICBzb2FwLT5mcHJlcGFyZXJlY3YgPSBOVUxMOworICBzb2FwLT5mcHJlcGFyZWZpbmFsID0gTlVMTDsKKyNlbmRpZgorICBzb2FwLT5mc2V0ZXJyb3IgPSBOVUxMOworICBzb2FwLT5maWdub3JlID0gTlVMTDsKKyAgc29hcC0+ZnNlcnZlbG9vcCA9IE5VTEw7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgIGlmIChzb2FwLT5zZXNzaW9uKQorICB7IFNTTF9TRVNTSU9OX2ZyZWUoc29hcC0+c2Vzc2lvbik7CisgICAgc29hcC0+c2Vzc2lvbiA9IE5VTEw7CisgIH0KKyNlbmRpZgorICBpZiAoc29hcC0+c3RhdGUgPT0gU09BUF9JTklUKQorICB7IGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpKQorICAgIHsgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIpOworICAgICAgc29hcC0+bWFzdGVyID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgICAgaWYgKHNvYXAtPmN0eCkKKyAgICB7IFNTTF9DVFhfZnJlZShzb2FwLT5jdHgpOworICAgICAgc29hcC0+Y3R4ID0gTlVMTDsKKyAgICB9CisjZW5kaWYKKyAgfQorI2lmZGVmIFNPQVBfREVCVUcKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIGxvZ2ZpbGVzXG4iKSk7CisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX01BWExPR1M7IGkrKykKKyAgeyBpZiAoc29hcC0+bG9nZmlsZVtpXSkKKyAgICB7IFNPQVBfRlJFRShzb2FwLCAodm9pZCopc29hcC0+bG9nZmlsZVtpXSk7CisgICAgICBzb2FwLT5sb2dmaWxlW2ldID0gTlVMTDsKKyAgICB9CisgICAgc29hcF9jbG9zZV9sb2dmaWxlKHNvYXAsIGkpOworICB9CisgIHNvYXBfZnJlZV9taHQoc29hcCk7CisgIHNvYXAtPnN0YXRlID0gMDsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfY2xlYW51cChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcF9kb25lKHNvYXApOworI2lmZGVmIFdJTjMyCisgIGlmICghdGNwX2RvbmUpCisgICAgcmV0dXJuOworICB0Y3BfZG9uZSA9IDA7CisgIFdTQUNsZWFudXAoKTsKKyNlbmRpZgorfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNvbnN0IGNoYXIqCit0Y3BfZXJyb3Ioc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKm1zZyA9IE5VTEw7CisgIHN3aXRjaCAoc29hcC0+ZXJybW9kZSkKKyAgeyBjYXNlIDA6CisgICAgICBtc2cgPSBzb2FwX3N0cmVycm9yKHNvYXApOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgbXNnID0gIldTQVN0YXJ0dXAgZmFpbGVkIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICB7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgbXNnID0gc29hcF9zdHJfY29kZShoX2Vycm9yX2NvZGVzLCBzb2FwLT5lcnJudW0pOworICAgICAgaWYgKCFtc2cpCisjZW5kaWYKKyAgICAgIHsgc3ByaW50Zihzb2FwLT5tc2didWYsICJUQ1AvVURQIElQIGVycm9yICVkIiwgc29hcC0+ZXJybnVtKTsKKyAgICAgICAgbXNnID0gc29hcC0+bXNnYnVmOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gbXNnOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY29uc3QgY2hhcioKK2h0dHBfZXJyb3Ioc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdGF0dXMpCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKm1zZyA9IFNPQVBfU1RSX0VPUzsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIG1zZyA9IHNvYXBfc3RyX2NvZGUoaF9odHRwX2Vycm9yX2NvZGVzLCBzdGF0dXMpOworICBpZiAoIW1zZykKKyAgICBtc2cgPSBTT0FQX1NUUl9FT1M7CisjZW5kaWYKKyAgcmV0dXJuIG1zZzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfSVBWNgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Cit0Y3BfZ2V0aG9zdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqYWRkciwgc3RydWN0IGluX2FkZHIgKmluYWRkcikKK3sgc29hcF9pbnQzMiBpYWRkID0gLTE7CisgIHN0cnVjdCBob3N0ZW50IGhvc3RlbnQsICpob3N0ID0gJmhvc3RlbnQ7CisjaWZkZWYgVlhXT1JLUworICBpbnQgaG9zdGludDsKKyAgLyogaW5ldF9hZGRyKCksIGFuZCBob3N0R2V0QnlOYW1lKCkgZXhwZWN0ICJjaGFyICoiOyBhZGRyIGlzIGEgImNvbnN0IGNoYXIgKiIuICovCisgIGlhZGQgPSBpbmV0X2FkZHIoKGNoYXIqKWFkZHIpOworI2Vsc2UKKyNpZiBkZWZpbmVkKF9BSVhWRVJTSU9OXzQzMSkgfHwgZGVmaW5lZChUUlU2NCkKKyAgc3RydWN0IGhvc3RlbnRfZGF0YSBodF9kYXRhOworI2VuZGlmCisjaWZkZWYgQVM0MDAKKyAgaWFkZCA9IGluZXRfYWRkcigodm9pZCopYWRkcik7CisjZWxzZQorICBpYWRkID0gaW5ldF9hZGRyKGFkZHIpOworI2VuZGlmCisjZW5kaWYKKyAgaWYgKGlhZGQgIT0gLTEpCisgIHsgbWVtY3B5KGluYWRkciwgJmlhZGQsIHNpemVvZihpYWRkKSk7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNpZiBkZWZpbmVkKF9fR0xJQkNfXykKKyAgaWYgKGdldGhvc3RieW5hbWVfcihhZGRyLCAmaG9zdGVudCwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTiwgJmhvc3QsICZzb2FwLT5lcnJudW0pIDwgMCkKKyAgICBob3N0ID0gTlVMTDsKKyNlbGlmIGRlZmluZWQoX0FJWFZFUlNJT05fNDMxKSB8fCBkZWZpbmVkKFRSVTY0KQorICBtZW1zZXQoKHZvaWQqKSZodF9kYXRhLCAwLCBzaXplb2YoaHRfZGF0YSkpOworICBpZiAoZ2V0aG9zdGJ5bmFtZV9yKGFkZHIsICZob3N0ZW50LCAmaHRfZGF0YSkgPCAwKQorICB7IGhvc3QgPSBOVUxMOworICAgIHNvYXAtPmVycm51bSA9IGhfZXJybm87CisgIH0KKyNlbGlmIGRlZmluZWQoSEFWRV9HRVRIT1NUQllOQU1FX1IpCisgIGhvc3QgPSBnZXRob3N0YnluYW1lX3IoYWRkciwgJmhvc3RlbnQsIHNvYXAtPmJ1ZiwgU09BUF9CVUZMRU4sICZzb2FwLT5lcnJudW0pOworI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICAvKiBJZiB0aGUgRE5TIHJlc29sdmVyIGxpYnJhcnkgcmVzb2x2TGliIGhhcyBiZWVuIGNvbmZpZ3VyZWQgaW4gdGhlIHZ4V29ya3MKKyAgICogaW1hZ2UsIGEgcXVlcnkgZm9yIHRoZSBob3N0IElQIGFkZHJlc3MgaXMgc2VudCB0byB0aGUgRE5TIHNlcnZlciwgaWYgdGhlCisgICAqIG5hbWUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgbG9jYWwgaG9zdCB0YWJsZS4gKi8KKyAgaG9zdGludCA9IGhvc3RHZXRCeU5hbWUoKGNoYXIqKWFkZHIpOworICBpZiAoaG9zdGludCA9PSBFUlJPUikKKyAgeyBob3N0ID0gTlVMTDsKKyAgICBzb2FwLT5lcnJudW0gPSBzb2FwX2Vycm5vOyAKKyAgfQorI2Vsc2UKKyNpZmRlZiBBUzQwMAorICBpZiAoIShob3N0ID0gZ2V0aG9zdGJ5bmFtZSgodm9pZCopYWRkcikpKQorICAgIHNvYXAtPmVycm51bSA9IGhfZXJybm87CisjZWxzZQorICBpZiAoIShob3N0ID0gZ2V0aG9zdGJ5bmFtZShhZGRyKSkpCisgICAgc29hcC0+ZXJybnVtID0gaF9lcnJubzsKKyNlbmRpZgorI2VuZGlmCisgIGlmICghaG9zdCkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkhvc3QgbmFtZSBub3QgZm91bmRcbiIpKTsKKyAgICByZXR1cm4gU09BUF9FUlI7CisgIH0KKyNpZmRlZiBWWFdPUktTCisgIGluYWRkci0+c19hZGRyID0gaG9zdGludDsKKyNlbHNlCisgIG1lbWNweShpbmFkZHIsIGhvc3QtPmhfYWRkciwgaG9zdC0+aF9sZW5ndGgpOworI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Cit0Y3BfY29ubmVjdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZW5kcG9pbnQsIGNvbnN0IGNoYXIgKmhvc3QsIGludCBwb3J0KQoreworI2lmZGVmIFdJVEhfSVBWNgorICBzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpyZXMsICpyZXNzYXZlOworICBpbnQgZXJyOworI2VuZGlmCisgIHJlZ2lzdGVyIGludCBmZDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGludCBsZW4gPSBTT0FQX0JVRkxFTjsKKyAgaW50IHNldCA9IDE7CisjZW5kaWYKKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQpOworICBzb2FwLT5zb2NrZXQgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICBpZiAodGNwX2luaXQoc29hcCkpCisgIHsgc29hcC0+ZXJybnVtID0gMDsKKyAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiVENQIGluaXQgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgc29hcC0+ZXJybW9kZSA9IDA7CisjaWZkZWYgV0lUSF9JUFY2CisgIG1lbXNldCgodm9pZCopJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKyAgaGludHMuYWlfZmFtaWx5ID0gUEZfVU5TUEVDOworI2lmZGVmIFdJVEhfVURQCisgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX0RHUkFNOworICBlbHNlCisjZW5kaWYKKyAgICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworICBzb2FwLT5lcnJtb2RlID0gMjsKKyAgaWYgKHNvYXAtPnByb3h5X2hvc3QpCisgICAgZXJyID0gZ2V0YWRkcmluZm8oc29hcC0+cHJveHlfaG9zdCwgc29hcF9pbnQycyhzb2FwLCBzb2FwLT5wcm94eV9wb3J0KSwgJmhpbnRzLCAmcmVzKTsKKyAgZWxzZQorICAgIGVyciA9IGdldGFkZHJpbmZvKGhvc3QsIHNvYXBfaW50MnMoc29hcCwgcG9ydCksICZoaW50cywgJnJlcyk7CisgIGlmIChlcnIpCisgIHsgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIGdhaV9zdHJlcnJvcihlcnIpLCAiZ2V0YWRkcmluZm8gZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgcmVzc2F2ZSA9IHJlczsKK2FnYWluOgorICBmZCA9IChpbnQpc29ja2V0KHJlcy0+YWlfZmFtaWx5LCByZXMtPmFpX3NvY2t0eXBlLCByZXMtPmFpX3Byb3RvY29sKTsKKyAgc29hcC0+ZXJybW9kZSA9IDA7CisjZWxzZQorI2lmZGVmIFdJVEhfVURQCisgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgZmQgPSAoaW50KXNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKyAgZWxzZQorI2VuZGlmCisgICAgZmQgPSAoaW50KXNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisjZW5kaWYKKyAgaWYgKGZkIDwgMCkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic29ja2V0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisjaWZkZWYgU09DS0VUX0NMT1NFX09OX0VYRUMKKyNpZmRlZiBXSU4zMgorI2lmbmRlZiBVTkRFUl9DRQorICBTZXRIYW5kbGVJbmZvcm1hdGlvbigoSEFORExFKWZkLCBIQU5ETEVfRkxBR19JTkhFUklULCAwKTsKKyNlbmRpZgorI2Vsc2UKKyAgZmNudGwoZmQsIEZfU0VURkQsIDEpOworI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5jb25uZWN0X2ZsYWdzICYgU09fTElOR0VSKQorICB7IHN0cnVjdCBsaW5nZXIgbGluZ2VyOworICAgIG1lbXNldCgodm9pZCopJmxpbmdlciwgMCwgc2l6ZW9mKGxpbmdlcikpOworICAgIGxpbmdlci5sX29ub2ZmID0gMTsKKyAgICBsaW5nZXIubF9saW5nZXIgPSAwOworICAgIGlmIChzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClmZCwgU09MX1NPQ0tFVCwgU09fTElOR0VSLCAoY2hhciopJmxpbmdlciwgc2l6ZW9mKHN0cnVjdCBsaW5nZXIpKSkKKyAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fTElOR0VSIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisgIH0KKyAgaWYgKChzb2FwLT5jb25uZWN0X2ZsYWdzICYgflNPX0xJTkdFUikgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpZmQsIFNPTF9TT0NLRVQsIHNvYXAtPmNvbm5lY3RfZmxhZ3MgJiB+U09fTElOR0VSLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIGlmIChzb2FwLT5rZWVwX2FsaXZlICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKWZkLCBTT0xfU09DS0VULCBTT19LRUVQQUxJVkUsIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fS0VFUEFMSVZFIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIGlmIChzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClmZCwgU09MX1NPQ0tFVCwgU09fU05EQlVGLCAoY2hhciopJmxlbiwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX1NOREJVRiBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpZmQsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgKGNoYXIqKSZsZW4sIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19SQ1ZCVUYgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNpZmRlZiBUQ1BfTk9ERUxBWQorICBpZiAoIShzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClmZCwgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFRDUF9OT0RFTEFZIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisjZW5kaWYKKyNlbmRpZgorICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiT3BlbmluZyBzb2NrZXQgJWQgdG8gaG9zdD0nJXMnIHBvcnQ9JWRcbiIsIGZkLCBob3N0LCBwb3J0KSk7CisjaWZuZGVmIFdJVEhfSVBWNgorICBzb2FwLT5wZWVybGVuID0gc2l6ZW9mKHNvYXAtPnBlZXIpOworICBtZW1zZXQoKHZvaWQqKSZzb2FwLT5wZWVyLCAwLCBzaXplb2Yoc29hcC0+cGVlcikpOworICBzb2FwLT5wZWVyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICBzb2FwLT5lcnJtb2RlID0gMjsKKyAgaWYgKHNvYXAtPnByb3h5X2hvc3QpCisgIHsgaWYgKHNvYXAtPmZyZXNvbHZlKHNvYXAsIHNvYXAtPnByb3h5X2hvc3QsICZzb2FwLT5wZWVyLnNpbl9hZGRyKSkKKyAgICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJnZXQgcHJveHkgaG9zdCBieSBuYW1lIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisgICAgc29hcC0+cGVlci5zaW5fcG9ydCA9IGh0b25zKChzaG9ydClzb2FwLT5wcm94eV9wb3J0KTsKKyAgfQorICBlbHNlCisgIHsgaWYgKHNvYXAtPmZyZXNvbHZlKHNvYXAsIGhvc3QsICZzb2FwLT5wZWVyLnNpbl9hZGRyKSkKKyAgICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJnZXQgaG9zdCBieSBuYW1lIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisgICAgc29hcC0+cGVlci5zaW5fcG9ydCA9IGh0b25zKChzaG9ydClwb3J0KTsKKyAgfQorICBzb2FwLT5lcnJtb2RlID0gMDsKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICByZXR1cm4gZmQ7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQpCisjaWYgZGVmaW5lZChXSU4zMikKKyAgeyB1X2xvbmcgbm9uYmxvY2tpbmcgPSAxOworICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgJm5vbmJsb2NraW5nKTsKKyAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICB7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgaW9jdGwoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAoaW50KSgmbm9uYmxvY2tpbmcpKTsgLyogbW9kaWZpZWQgdG8gdXNlIGZkICovCisgIH0KKyNlbHNlCisgICAgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfR0VURkwpfE9fTk9OQkxPQ0spOworI2VuZGlmCisgIGVsc2UKKyNpZiBkZWZpbmVkKFdJTjMyKQorICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAmYmxvY2tpbmcpOworICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICBpb2N0bCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sIChpbnQpKCZibG9ja2luZykpOworICB9CisjZWxzZQorICAgIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX0dFVEZMKSZ+T19OT05CTE9DSyk7CisjZW5kaWYKKyNlbmRpZgorICBmb3IgKDs7KQorICB7IAorI2lmZGVmIFdJVEhfSVBWNgorICAgIGlmIChjb25uZWN0KChTT0FQX1NPQ0tFVClmZCwgcmVzLT5haV9hZGRyLCByZXMtPmFpX2FkZHJsZW4pKQorI2Vsc2UKKyAgICBpZiAoY29ubmVjdCgoU09BUF9TT0NLRVQpZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyLCBzaXplb2Yoc29hcC0+cGVlcikpKQorI2VuZGlmCisgICAgeyAKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0ICYmIChzb2FwX3NvY2tldF9lcnJubyA9PSBTT0FQX0VJTlBST0dSRVNTIHx8IHNvYXBfc29ja2V0X2Vycm5vID09IFNPQVBfRVdPVUxEQkxPQ0spKQorICAgICAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgICAgICBTT0FQX1NPQ0tMRU5fVCBrOworICAgICAgICBmZF9zZXQgZmRzOworICAgICAgICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0ID4gMCkKKyAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IHNvYXAtPmNvbm5lY3RfdGltZW91dDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IC1zb2FwLT5jb25uZWN0X3RpbWVvdXQvMTAwMDAwMDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAtc29hcC0+Y29ubmVjdF90aW1lb3V0JTEwMDAwMDA7CisgICAgICAgIH0KKyAgICAgICAgRkRfWkVSTygmZmRzKTsKKyAgICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClmZCwgJmZkcyk7CisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsgaW50IHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShmZCArIDEpLCBOVUxMLCAmZmRzLCBOVUxMLCAmdGltZW91dCk7CisgICAgICAgICAgaWYgKHIgPiAwKQorCSAgICBicmVhazsKKyAgICAgICAgICBpZiAoIXIpCisgICAgICAgICAgeyBzb2FwLT5lcnJudW0gPSAwOworICAgICAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb25uZWN0IHRpbWVvdXRcbiIpKTsKKyAgICAgICAgICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCAiVGltZW91dCIsICJjb25uZWN0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIpCisgICAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IGNvbm5lY3QgdG8gaG9zdFxuIikpOworICAgICAgICAgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImNvbm5lY3QgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICAgIH0KKyAgICAgICAgfQorCWsgPSAoU09BUF9TT0NLTEVOX1Qpc2l6ZW9mKHNvYXAtPmVycm51bSk7CisgICAgICAgIGlmICghZ2V0c29ja29wdCgoU09BUF9TT0NLRVQpZmQsIFNPTF9TT0NLRVQsIFNPX0VSUk9SLCAoY2hhciopJnNvYXAtPmVycm51bSwgJmspICYmICFzb2FwLT5lcnJudW0pCS8qIHBvcnRhYmlsaXR5IG5vdGU6IHNlZSBTT0FQX1NPQ0tMRU5fVCBkZWZpbml0aW9uIGluIHN0ZHNvYXAyLmggKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgY29ubmVjdCB0byBob3N0XG4iKSk7CisgICAgICAgIHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiY29ubmVjdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgICAgZWxzZQorI2VuZGlmCisjaWZkZWYgV0lUSF9JUFY2CisgICAgICBpZiAocmVzLT5haV9uZXh0KQorICAgICAgeyByZXMgPSByZXMtPmFpX25leHQ7CisgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICBnb3RvIGFnYWluOworICAgICAgfQorICAgICAgZWxzZQorI2VuZGlmCisgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUikKKyAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IGNvbm5lY3QgdG8gaG9zdFxuIikpOworICAgICAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiY29ubmVjdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgIH0gIAorICAgIGVsc2UKKyAgICAgIGJyZWFrOworICB9CisjaWZkZWYgV0lUSF9JUFY2CisgIHNvYXAtPnBlZXJsZW4gPSAwOyAvKiBJUHY2OiBhbHJlYWR5IGNvbm5lY3RlZCBzbyB1c2Ugc2VuZCgpICovCisgIGZyZWVhZGRyaW5mbyhyZXNzYXZlKTsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPmNvbm5lY3RfdGltZW91dCkKKyNpZiBkZWZpbmVkKFdJTjMyKQorICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAmYmxvY2tpbmcpOworICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICBpb2N0bCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sIChpbnQpKCZibG9ja2luZykpOworICB9CisjZWxzZQorICAgIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX0dFVEZMKSZ+T19OT05CTE9DSyk7CisjZW5kaWYKKyNlbmRpZgorICBzb2FwLT5zb2NrZXQgPSBmZDsKKyAgc29hcC0+aW1vZGUgJj0gflNPQVBfRU5DX1NTTDsKKyAgc29hcC0+b21vZGUgJj0gflNPQVBfRU5DX1NTTDsKKyAgaWYgKCFzdHJuY21wKGVuZHBvaW50LCAiaHR0cHM6IiwgNikpCisgIHsKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICBCSU8gKmJpbzsKKyAgICBpbnQgcjsKKyAgICBpZiAoc29hcC0+cHJveHlfaG9zdCkKKyAgICB7IHNob3J0IHY7CisgICAgICB1bnNpZ25lZCBpbnQgayA9IHNvYXAtPm9tb2RlOyAvKiBtYWtlIHN1cmUgd2Ugb25seSBwYXJzZSBIVFRQICovCisgICAgICBzaXplX3QgbiA9IHNvYXAtPmNvdW50OyAvKiBzYXZlIHRoZSBjb250ZW50IGxlbmd0aCAqLworICAgICAgY2hhciAqdXNlcmlkLCAqcGFzc3dkOworICAgICAgc29hcC0+b21vZGUgJj0gflNPQVBfRU5DOyAvKiBtYXNrIElPIGFuZCBFTkMgKi8KKyAgICAgIHNvYXAtPm9tb2RlIHw9IFNPQVBfSU9fQlVGRkVSOworICAgICAgc29hcF9iZWdpbl9zZW5kKHNvYXApOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb25uZWN0aW5nIHRvIHByb3h5IHNlcnZlclxuIikpOworICAgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICJDT05ORUNUICVzOiVkIEhUVFAvJXMiLCBob3N0LCBwb3J0LCBzb2FwLT5odHRwX3ZlcnNpb24pOworICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgTlVMTCkpKQorICAgICAgeyBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgaWYgKHNvYXAtPnByb3h5X3VzZXJpZCAmJiBzb2FwLT5wcm94eV9wYXNzd2QgJiYgc3RybGVuKHNvYXAtPnByb3h5X3VzZXJpZCkgKyBzdHJsZW4oc29hcC0+cHJveHlfcGFzc3dkKSA8IDc2MSkKKyAgICAgIHsgc3ByaW50Zihzb2FwLT50bXBidWYgKyAyNjIsICIlczolcyIsIHNvYXAtPnByb3h5X3VzZXJpZCwgc29hcC0+cHJveHlfcGFzc3dkKTsKKyAgICAgICAgc3RyY3B5KHNvYXAtPnRtcGJ1ZiwgIkJhc2ljICIpOworICAgICAgICBzb2FwX3MyYmFzZTY0KHNvYXAsIChjb25zdCB1bnNpZ25lZCBjaGFyKikoc29hcC0+dG1wYnVmICsgMjYyKSwgc29hcC0+dG1wYnVmICsgNiwgc3RybGVuKHNvYXAtPnRtcGJ1ZiArIDI2MikpOworICAgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlByb3h5LUF1dGhvcml6YXRpb24iLCBzb2FwLT50bXBidWYpKSkKKyAgICAgICAgeyBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKyNlbmRpZgorICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsIE5VTEwsIE5VTEwpKQorICAgICAgIHx8IHNvYXBfZmx1c2goc29hcCkpCisgICAgICB7IHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyAgICAgIHNvYXAtPm9tb2RlID0gazsKKyAgICAgIGsgPSBzb2FwLT5pbW9kZTsKKyAgICAgIHNvYXAtPmltb2RlICY9IH5TT0FQX0VOQzsgLyogbWFzayBJTyBhbmQgRU5DICovCisgICAgICB2ID0gc29hcC0+dmVyc2lvbjsgLyogcHJlc2VydmUgKi8KKyAgICAgIHVzZXJpZCA9IHNvYXAtPnVzZXJpZDsgLyogcHJlc2VydmUgKi8KKyAgICAgIHBhc3N3ZCA9IHNvYXAtPnBhc3N3ZDsgLyogcHJlc2VydmUgKi8KKyAgICAgIGlmIChzb2FwX2JlZ2luX3JlY3Yoc29hcCkpCisgICAgICB7IHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyAgICAgIHNvYXAtPnVzZXJpZCA9IHVzZXJpZDsgLyogcmVzdG9yZSAqLworICAgICAgc29hcC0+cGFzc3dkID0gcGFzc3dkOyAvKiByZXN0b3JlICovCisgICAgICBzb2FwLT52ZXJzaW9uID0gdjsgLyogcmVzdG9yZSAqLworICAgICAgc29hcC0+aW1vZGUgPSBrOyAvKiByZXN0b3JlICovCisgICAgICBzb2FwLT5jb3VudCA9IG47IC8qIHJlc3RvcmUgKi8KKyAgICAgIHNvYXBfYmVnaW5fc2VuZChzb2FwKTsKKyAgICB9CisgICAgaWYgKCFzb2FwLT5jdHggJiYgKHNvYXAtPmVycm9yID0gc29hcC0+ZnNzbGF1dGgoc29hcCkpKQorICAgIHsgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiU1NMIGF1dGhlbnRpY2F0aW9uIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpOiBjaGVjayBwYXNzd29yZCwga2V5IGZpbGUsIGFuZCBjYSBmaWxlLiIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorICAgIHNvYXAtPnNzbCA9IFNTTF9uZXcoc29hcC0+Y3R4KTsKKyAgICBpZiAoIXNvYXAtPnNzbCkKKyAgICB7IHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1NTTF9FUlJPUjsKKyAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgIH0KKyAgICBpZiAoc29hcC0+c2Vzc2lvbikKKyAgICB7IGlmICghc3RyY21wKHNvYXAtPnNlc3Npb25faG9zdCwgaG9zdCkgJiYgc29hcC0+c2Vzc2lvbl9wb3J0ID09IHBvcnQpCisgICAgICAgIFNTTF9zZXRfc2Vzc2lvbihzb2FwLT5zc2wsIHNvYXAtPnNlc3Npb24pOworICAgICAgU1NMX1NFU1NJT05fZnJlZShzb2FwLT5zZXNzaW9uKTsKKyAgICAgIHNvYXAtPnNlc3Npb24gPSBOVUxMOworICAgIH0KKyAgICBzb2FwLT5pbW9kZSB8PSBTT0FQX0VOQ19TU0w7CisgICAgc29hcC0+b21vZGUgfD0gU09BUF9FTkNfU1NMOworICAgIGJpbyA9IEJJT19uZXdfc29ja2V0KChTT0FQX1NPQ0tFVClmZCwgQklPX05PQ0xPU0UpOworICAgIFNTTF9zZXRfYmlvKHNvYXAtPnNzbCwgYmlvLCBiaW8pOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0KQorI2lmIGRlZmluZWQoV0lOMzIpCisgICAgeyB1X2xvbmcgbm9uYmxvY2tpbmcgPSAxOworICAgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAmbm9uYmxvY2tpbmcpOworICAgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgICB7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgICBpb2N0bCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sIChpbnQpKCZub25ibG9ja2luZykpOworICAgIH0KKyNlbHNlCisgICAgICBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9HRVRGTCl8T19OT05CTE9DSyk7CisjZW5kaWYKKyNlbmRpZgorICAgIGZvciAoOzspCisgICAgeyBpZiAoKHIgPSBTU0xfY29ubmVjdChzb2FwLT5zc2wpKSA8PSAwKQorICAgICAgeyBpbnQgZXJyID0gU1NMX2dldF9lcnJvcihzb2FwLT5zc2wsIHIpOworICAgICAgICBpZiAoZXJyICE9IFNTTF9FUlJPUl9OT05FICYmIGVyciAhPSBTU0xfRVJST1JfV0FOVF9SRUFEICYmIGVyciAhPSBTU0xfRVJST1JfV0FOVF9XUklURSkKKyAgICAgICAgeyBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgc3NsX2Vycm9yKHNvYXAsIHIpLCAiU1NMIGNvbm5lY3QgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvYXAtPmNvbm5lY3RfdGltZW91dCkKKyAgICAgICAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgICAgICAgIGZkX3NldCBmZHM7CisgICAgICAgICAgaWYgKHNvYXAtPmNvbm5lY3RfdGltZW91dCA+IDApCisgICAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IHNvYXAtPmNvbm5lY3RfdGltZW91dDsKKyAgICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gLXNvYXAtPmNvbm5lY3RfdGltZW91dC8xMDAwMDAwOworICAgICAgICAgICAgdGltZW91dC50dl91c2VjID0gLXNvYXAtPmNvbm5lY3RfdGltZW91dCUxMDAwMDAwOworICAgICAgICAgIH0KKyAgICAgICAgICBGRF9aRVJPKCZmZHMpOworICAgICAgICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpZmQsICZmZHMpOworICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgeyBpbnQgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKGZkICsgMSksICZmZHMsIE5VTEwsICZmZHMsICZ0aW1lb3V0KTsKKyAgICAgICAgICAgIGlmIChyID4gMCkKKwkgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmICghcikKKyAgICAgICAgICAgIHsgc29hcC0+ZXJybnVtID0gMDsKKyAgICAgICAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb25uZWN0IHRpbWVvdXRcbiIpKTsKKyAgICAgICAgICAgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsICJUaW1lb3V0IiwgImNvbm5lY3QgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICAgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisJICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0KQorI2lmZGVmIFdJTjMyCisgICAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAmYmxvY2tpbmcpOworICAgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgICBpb2N0bCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sIChpbnQpKCZibG9ja2luZykpOworICAgIH0KKyNlbHNlCisgICAgICBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9HRVRGTCkmfk9fTk9OQkxPQ0spOworI2VuZGlmCisjZW5kaWYKKyAgICBpZiAoc29hcC0+cmVxdWlyZV9zZXJ2ZXJfYXV0aCkKKyAgICB7IFg1MDkgKnBlZXI7CisgICAgICBpbnQgZXJyOworICAgICAgaWYgKChlcnIgPSBTU0xfZ2V0X3ZlcmlmeV9yZXN1bHQoc29hcC0+c3NsKSkgIT0gWDUwOV9WX09LKQorICAgICAgeyBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgWDUwOV92ZXJpZnlfY2VydF9lcnJvcl9zdHJpbmcoZXJyKSwgIlNTTCBjZXJ0aWZpY2F0ZSBwcmVzZW50ZWQgYnkgcGVlciBjYW5ub3QgYmUgdmVyaWZpZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgICAgcGVlciA9IFNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZShzb2FwLT5zc2wpOworICAgICAgaWYgKCFwZWVyKQorICAgICAgeyBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJObyBTU0wgY2VydGlmaWNhdGUgd2FzIHByZXNlbnRlZCBieSB0aGUgcGVlciBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9TU0xfRVJST1IpOworICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgICBYNTA5X05BTUVfZ2V0X3RleHRfYnlfTklEKFg1MDlfZ2V0X3N1YmplY3RfbmFtZShwZWVyKSwgTklEX2NvbW1vbk5hbWUsIHNvYXAtPm1zZ2J1Ziwgc2l6ZW9mKHNvYXAtPm1zZ2J1ZikpOworICAgICAgWDUwOV9mcmVlKHBlZXIpOworICAgICAgaWYgKHNvYXBfdGFnX2NtcChzb2FwLT5tc2didWYsIGhvc3QpKQorICAgICAgeyBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJTU0wgY2VydGlmaWNhdGUgaG9zdCBuYW1lIG1pc21hdGNoIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgIHNvYXAtPmVycm9yID0gU09BUF9TU0xfRVJST1I7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisjZW5kaWYKKyAgfQorICByZXR1cm4gZmQ7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYmluZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQsIGludCBiYWNrbG9nKQoreworI2lmZGVmIFdJVEhfSVBWNgorICBzdHJ1Y3QgYWRkcmluZm8gKmFkZHJpbmZvID0gTlVMTDsKKyAgc3RydWN0IGFkZHJpbmZvIGhpbnRzOworICBzdHJ1Y3QgYWRkcmluZm8gcmVzOworICBpbnQgZXJyOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpbnQgbGVuID0gU09BUF9CVUZMRU47CisgIGludCBzZXQgPSAxOworI2VuZGlmCisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpKQorICB7IHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyKTsKKyAgICBzb2FwLT5tYXN0ZXIgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIHNvYXAtPnNvY2tldCA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIHNvYXAtPmVycm1vZGUgPSAxOworICBpZiAodGNwX2luaXQoc29hcCkpCisgIHsgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiVENQIGluaXQgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisjaWZkZWYgV0lUSF9JUFY2CisgIG1lbXNldCgodm9pZCopJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKyAgaGludHMuYWlfZmFtaWx5ID0gUEZfVU5TUEVDOworI2lmZGVmIFdJVEhfVURQCisgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX0RHUkFNOworICBlbHNlCisjZW5kaWYKKyAgICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworICBoaW50cy5haV9mbGFncyA9IEFJX1BBU1NJVkU7CisgIHNvYXAtPmVycm1vZGUgPSAyOworICBlcnIgPSBnZXRhZGRyaW5mbyhob3N0LCBzb2FwX2ludDJzKHNvYXAsIHBvcnQpLCAmaGludHMsICZhZGRyaW5mbyk7CisgIGlmIChhZGRyaW5mbykKKyAgeyByZXMgPSAqYWRkcmluZm87CisgICAgc29hcC0+cGVlciA9ICooKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKilhZGRyaW5mby0+YWlfYWRkcik7CisgICAgc29hcC0+cGVlcmxlbiA9IGFkZHJpbmZvLT5haV9hZGRybGVuOworICAgIHJlcy5haV9hZGRyID0gKHN0cnVjdCBzb2NrYWRkciopJnNvYXAtPnBlZXI7CisgICAgcmVzLmFpX2FkZHJsZW4gPSBzb2FwLT5wZWVybGVuOworICAgIGZyZWVhZGRyaW5mbyhhZGRyaW5mbyk7CisgIH0KKyAgaWYgKGVycikKKyAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCBnYWlfc3RyZXJyb3IoZXJyKSwgImdldGFkZHJpbmZvIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBzb2FwLT5tYXN0ZXIgPSBzb2NrZXQocmVzLmFpX2ZhbWlseSwgcmVzLmFpX3NvY2t0eXBlLCByZXMuYWlfcHJvdG9jb2wpOworI2Vsc2UKKyNpZmRlZiBXSVRIX1VEUAorICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIHNvYXAtPm1hc3RlciA9IChpbnQpc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworICBlbHNlCisjZW5kaWYKKyAgICBzb2FwLT5tYXN0ZXIgPSAoaW50KXNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisjZW5kaWYKKyAgc29hcC0+ZXJybW9kZSA9IDA7CisgIGlmICghc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzb2NrZXQgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisjaWZkZWYgV0lUSF9VRFAKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICBzb2FwLT5zb2NrZXQgPSBzb2FwLT5tYXN0ZXI7CisjZW5kaWYKKyNpZmRlZiBTT0NLRVRfQ0xPU0VfT05fRVhFQworI2lmZGVmIFdJTjMyCisjaWZuZGVmIFVOREVSX0NFCisgIFNldEhhbmRsZUluZm9ybWF0aW9uKChIQU5ETEUpc29hcC0+bWFzdGVyLCBIQU5ETEVfRkxBR19JTkhFUklULCAwKTsKKyNlbmRpZgorI2Vsc2UKKyAgZmNudGwoc29hcC0+bWFzdGVyLCBGX1NFVEZELCAxKTsKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+YmluZF9mbGFncyAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIFNPTF9TT0NLRVQsIHNvYXAtPmJpbmRfZmxhZ3MsIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgaWYgKCgoc29hcC0+aW1vZGUgfCBzb2FwLT5vbW9kZSkgJiBTT0FQX0lPX0tFRVBBTElWRSkgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBTT0xfU09DS0VULCBTT19LRUVQQUxJVkUsIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19LRUVQQUxJVkUgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIGlmIChzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwgKGNoYXIqKSZsZW4sIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX1NOREJVRiBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgU09MX1NPQ0tFVCwgU09fUkNWQlVGLCAoY2hhciopJmxlbiwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fUkNWQlVGIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorI2lmZGVmIFRDUF9OT0RFTEFZCisgIGlmICghKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgVENQX05PREVMQVkgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIFdJVEhfSVBWNgorICBzb2FwLT5lcnJtb2RlID0gMDsKKyAgaWYgKGJpbmQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgcmVzLmFpX2FkZHIsIHJlcy5haV9hZGRybGVuKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBiaW5kIHRvIGhvc3RcbiIpKTsKKyAgICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJiaW5kIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfSAgCisjZWxzZQorICBzb2FwLT5wZWVybGVuID0gc2l6ZW9mKHNvYXAtPnBlZXIpOworICBtZW1zZXQoKHZvaWQqKSZzb2FwLT5wZWVyLCAwLCBzaXplb2Yoc29hcC0+cGVlcikpOworICBzb2FwLT5wZWVyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICBzb2FwLT5lcnJtb2RlID0gMjsKKyAgaWYgKGhvc3QpCisgIHsgaWYgKHNvYXAtPmZyZXNvbHZlKHNvYXAsIGhvc3QsICZzb2FwLT5wZWVyLnNpbl9hZGRyKSkKKyAgICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImdldCBob3N0IGJ5IG5hbWUgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorICB9CisgIGVsc2UKKyAgICBzb2FwLT5wZWVyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9BTlkpOworICBzb2FwLT5wZWVyLnNpbl9wb3J0ID0gaHRvbnMoKHNob3J0KXBvcnQpOworICBzb2FwLT5lcnJtb2RlID0gMDsKKyAgaWYgKGJpbmQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgKHN0cnVjdCBzb2NrYWRkciopJnNvYXAtPnBlZXIsIHNvYXAtPnBlZXJsZW4pKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IGJpbmQgdG8gaG9zdFxuIikpOworICAgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImJpbmQgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisjZW5kaWYKKyAgaWYgKCEoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkgJiYgbGlzdGVuKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIGJhY2tsb2cpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IGJpbmQgdG8gaG9zdFxuIikpOworICAgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImxpc3RlbiBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0gIAorICByZXR1cm4gc29hcC0+bWFzdGVyOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3BvbGwoc3RydWN0IHNvYXAgKnNvYXApCit7IAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgZmRfc2V0IHJmZCwgc2ZkLCB4ZmQ7CisgIGludCByOworICB0aW1lb3V0LnR2X3NlYyA9IDA7CisgIHRpbWVvdXQudHZfdXNlYyA9IDA7CisgIEZEX1pFUk8oJnJmZCk7CisgIEZEX1pFUk8oJnNmZCk7CisgIEZEX1pFUk8oJnhmZCk7CisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICB7IEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmcmZkKTsKKyAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnNmZCk7CisgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZ4ZmQpOworICAgIHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgJnJmZCwgJnNmZCwgJnhmZCwgJnRpbWVvdXQpOworICAgIGlmIChyID4gMCAmJiBGRF9JU1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmeGZkKSkKKyAgICAgIHIgPSAtMTsKKyAgfQorICBlbHNlIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpKQorICB7IEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCAmc2ZkKTsKKyAgICByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+bWFzdGVyICsgMSksIE5VTEwsICZzZmQsIE5VTEwsICZ0aW1lb3V0KTsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIGlmIChyID4gMCkKKyAgeworI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgIGlmIChzb2FwLT5pbW9kZSAmIFNPQVBfRU5DX1NTTCkKKyAgICB7CisgICAgICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KQorICAgICAgICYmIEZEX0lTU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZzZmQpCisgICAgICAgJiYgKCFGRF9JU1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmcmZkKQorICAgICAgICB8fCBTU0xfcGVlayhzb2FwLT5zc2wsIHNvYXAtPnRtcGJ1ZiwgMSkgPiAwKSkKKyAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgICAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkKKyAgICAgICAmJiBGRF9JU1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmc2ZkKQorICAgICAgICYmICghRkRfSVNTRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnJmZCkKKyAgICAgICAgfHwgcmVjdigoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzb2FwLT50bXBidWYsIDEsIE1TR19QRUVLKSA+IDApKQorICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICBlbHNlIGlmIChyIDwgMCkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBpZiAoKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikgfHwgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUikKKyAgICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNlbGVjdCBmYWlsZWQgaW4gc29hcF9wb2xsKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1RDUF9FUlJPUjsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIHNvYXAtPmVycm51bSA9IDA7CisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJQb2xsaW5nOiBvdGhlciBlbmQgZG93biBvbiBzb2NrZXQ9JWQgc2VsZWN0PSVkXG4iLCBzb2FwLT5zb2NrZXQsIHIpKTsKKyAgcmV0dXJuIFNPQVBfRU9GOworI2Vsc2UKKyAgcmV0dXJuIFNPQVBfT0s7CisjZW5kaWYKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3RjcF9hY2NlcHQoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzLCBzdHJ1Y3Qgc29ja2FkZHIgKmEsIGludCAqbikKK3sgaW50IGZkOworICBmZCA9IChpbnQpYWNjZXB0KChTT0FQX1NPQ0tFVClzLCBhLCAoU09BUF9TT0NLTEVOX1QqKW4pOwkvKiBwb3J0YWJpbGl0eSBub3RlOiBzZWUgU09BUF9TT0NLTEVOX1QgZGVmaW5pdGlvbiBpbiBzdGRzb2FwMi5oICovCisjaWZkZWYgU09DS0VUX0NMT1NFX09OX0VYRUMKKyNpZmRlZiBXSU4zMgorI2lmbmRlZiBVTkRFUl9DRQorICBTZXRIYW5kbGVJbmZvcm1hdGlvbigoSEFORExFKWZkLCBIQU5ETEVfRkxBR19JTkhFUklULCAwKTsKKyNlbmRpZgorI2Vsc2UKKyAgZmNudGwoZmQsIEZfU0VURkQsIEZEX0NMT0VYRUMpOworI2VuZGlmCisjZW5kaWYKKyAgcmV0dXJuIGZkOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2FjY2VwdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaW50IG4gPSAoaW50KXNpemVvZihzb2FwLT5wZWVyKTsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGludCBsZW4gPSBTT0FQX0JVRkxFTjsKKyAgaW50IHNldCA9IDE7CisjZW5kaWYKKyAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworI2lmZGVmIFdJVEhfVURQCisgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgcmV0dXJuIHNvYXAtPnNvY2tldCA9IHNvYXAtPm1hc3RlcjsKKyNlbmRpZgorICBtZW1zZXQoKHZvaWQqKSZzb2FwLT5wZWVyLCAwLCBzaXplb2Yoc29hcC0+cGVlcikpOworICBzb2FwLT5zb2NrZXQgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICBzb2FwLT5lcnJtb2RlID0gMDsKKyAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7CisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpKQorICB7IGZvciAoOzspCisgICAgeyAKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICBpZiAoc29hcC0+YWNjZXB0X3RpbWVvdXQpCisgICAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICAgIGZkX3NldCBmZDsKKyAgICAgICAgaWYgKHNvYXAtPmFjY2VwdF90aW1lb3V0ID4gMCkKKyAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IHNvYXAtPmFjY2VwdF90aW1lb3V0OworICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gLXNvYXAtPmFjY2VwdF90aW1lb3V0LzEwMDAwMDA7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gLXNvYXAtPmFjY2VwdF90aW1lb3V0JTEwMDAwMDA7CisgICAgICAgIH0KKyAgICAgICAgRkRfWkVSTygmZmQpOworICAgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgJmZkKTsKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeyBpbnQgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPm1hc3RlciArIDEpLCAmZmQsICZmZCwgTlVMTCwgJnRpbWVvdXQpOworICAgICAgICAgIGlmIChyID4gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGlmICghcikKKyAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IDA7CisgICAgICAgICAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiVGltZW91dCIsICJhY2NlcHQgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIpCisgICAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICAgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgICAgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImFjY2VwdCBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICAgIH0KKyAgICAgICAgfQorI2lmIGRlZmluZWQoV0lOMzIpCisJeyB1X2xvbmcgbm9uYmxvY2tpbmcgPSAxOworICAgICAgICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZJT05CSU8sICZub25ibG9ja2luZyk7CisgICAgICAgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgICAgICAgeyB1X2xvbmcgbm9uYmxvY2tpbmcgPSAxOworICAgICAgICAgIGlvY3RsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZJT05CSU8sIChpbnQpKCZub25ibG9ja2luZykpOworICAgICAgICB9CisjZWxzZQorICAgICAgICBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGX0dFVEZMKXxPX05PTkJMT0NLKTsKKyNlbmRpZgorICAgICAgfQorICAgICAgZWxzZQorI2lmIGRlZmluZWQoV0lOMzIpCisgICAgICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZJT05CSU8sICZibG9ja2luZyk7CisgICAgICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgICAgICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgICAgIGlvY3RsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZJT05CSU8sIChpbnQpKCZibG9ja2luZykpOworICAgICAgfQorI2Vsc2UKKyAgICAgICAgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRl9HRVRGTCkmfk9fTk9OQkxPQ0spOworI2VuZGlmCisjZW5kaWYKKyAgICAgIHNvYXAtPnNvY2tldCA9IHNvYXAtPmZhY2NlcHQoc29hcCwgc29hcC0+bWFzdGVyLCAoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlciwgJm4pOworICAgICAgc29hcC0+cGVlcmxlbiA9IChzaXplX3QpbjsKKyAgICAgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICAgICAgeworI2lmZGVmIFdJVEhfSVBWNgorLyogVXNlIHNvYXAtPmhvc3QgdG8gc3RvcmUgdGhlIG51bWVyaWMgZm9ybSBvZiB0aGUgcmVtb3RlIGhvc3QgKi8KKyAgICAgICAgZ2V0bmFtZWluZm8oKHN0cnVjdCBzb2NrYWRkciopJnNvYXAtPnBlZXIsIG4sIHNvYXAtPmhvc3QsIHNpemVvZihzb2FwLT5ob3N0KSwgTlVMTCwgMCwgTklfTlVNRVJJQ0hPU1QgfCBOSV9OVU1FUklDU0VSVik7IAorICAgICAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiQWNjZXB0IHNvY2tldCAlZCBmcm9tICVzXG4iLCBzb2FwLT5zb2NrZXQsIHNvYXAtPmhvc3QpKTsKKyAgICAgICAgc29hcC0+aXAgPSAwOyAvKiBpbmZvIHN0b3JlZCBpbiBzb2FwLT5wZWVyIGFuZCBzb2FwLT5ob3N0ICovCisgICAgICAgIHNvYXAtPnBvcnQgPSAwOyAvKiBpbmZvIHN0b3JlZCBpbiBzb2FwLT5wZWVyIGFuZCBzb2FwLT5ob3N0ICovCisjZWxzZQorICAgICAgICBzb2FwLT5pcCA9IG50b2hsKHNvYXAtPnBlZXIuc2luX2FkZHIuc19hZGRyKTsKKyAgICAgICAgc29hcC0+cG9ydCA9IChpbnQpbnRvaHMoc29hcC0+cGVlci5zaW5fcG9ydCk7IC8qIGRvZXMgbm90IHJldHVybiBwb3J0IG51bWJlciBvbiBzb21lIHN5c3RlbXMgKi8KKyAgICAgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFjY2VwdCBzb2NrZXQgJWQgYXQgcG9ydCAlZCBmcm9tIElQICVkLiVkLiVkLiVkXG4iLCBzb2FwLT5zb2NrZXQsIHNvYXAtPnBvcnQsIChpbnQpKHNvYXAtPmlwPj4yNCkmMHhGRiwgKGludCkoc29hcC0+aXA+PjE2KSYweEZGLCAoaW50KShzb2FwLT5pcD4+OCkmMHhGRiwgKGludClzb2FwLT5pcCYweEZGKSk7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisJaWYgKHNvYXAtPmFjY2VwdF9mbGFncyAmIFNPX0xJTkdFUikKKyAgICAgICAgeyBzdHJ1Y3QgbGluZ2VyIGxpbmdlcjsKKyAgICAgICAgICBtZW1zZXQoKHZvaWQqKSZsaW5nZXIsIDAsIHNpemVvZihsaW5nZXIpKTsKKyAgICAgICAgICBsaW5nZXIubF9vbm9mZiA9IDE7CisgICAgICAgICAgbGluZ2VyLmxfbGluZ2VyID0gMDsKKwkgIGlmIChzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIFNPTF9TT0NLRVQsIFNPX0xJTkdFUiwgKGNoYXIqKSZsaW5nZXIsIHNpemVvZihzdHJ1Y3QgbGluZ2VyKSkpCisgICAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKwkgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19MSU5HRVIgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisJICAgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisJICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChzb2FwLT5hY2NlcHRfZmxhZ3MgJiB+U09fTElOR0VSKSAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIFNPTF9TT0NLRVQsIHNvYXAtPmFjY2VwdF9mbGFncyAmIH5TT19MSU5HRVIsIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKwkgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICB9CisgICAgICAgIGlmICgoKHNvYXAtPmltb2RlIHwgc29hcC0+b21vZGUpICYgU09BUF9JT19LRUVQQUxJVkUpICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fS0VFUEFMSVZFIGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworCSAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgU09MX1NPQ0tFVCwgU09fU05EQlVGLCAoY2hhciopJmxlbiwgc2l6ZW9mKGludCkpKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fU05EQlVGIGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworCSAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgU09MX1NPQ0tFVCwgU09fUkNWQlVGLCAoY2hhciopJmxlbiwgc2l6ZW9mKGludCkpKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fUkNWQlVGIGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworCSAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgIH0KKyNpZmRlZiBUQ1BfTk9ERUxBWQorICAgICAgICBpZiAoIShzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFRDUF9OT0RFTEFZIGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworCSAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgIH0KKyNlbmRpZgorI2VuZGlmCisgICAgICAgIGlmIChzb2FwLT5hY2NlcHRfdGltZW91dCkKKyAgICAgICAgeworI2lmIGRlZmluZWQoV0lOMzIpCisgICAgICAgICAgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICAgICAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGSU9OQklPLCAmYmxvY2tpbmcpOworICAgICAgICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZJT05CSU8sICZibG9ja2luZyk7CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgICAgICAgICAgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICAgICAgICBpb2N0bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGSU9OQklPLCAoaW50KSgmYmxvY2tpbmcpKTsKKyAgICAgICAgICBpb2N0bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGSU9OQklPLCAoaW50KSgmYmxvY2tpbmcpKTsKKyNlbGlmIGRlZmluZWQoUEFMTSkKKyAgICAgICAgICBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGX0dFVEZMLDApJn5PX05PTkJMT0NLKTsKKyAgICAgICAgICBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGX0dFVEZMLDApJn5PX05PTkJMT0NLKTsKKyNlbGlmIGRlZmluZWQoU1lNQklBTikKKyAgICAgICAgICBsb25nIGJsb2NraW5nID0gMDsKKyAgICAgICAgICBpb2N0bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCAwLypGSU9OQklPKi8sICZibG9ja2luZyk7CisjZWxzZQorICAgICAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfR0VURkwpJn5PX05PTkJMT0NLKTsKKyAgICAgICAgICBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGX0dFVEZMKSZ+T19OT05CTE9DSyk7CisjZW5kaWYKKwl9CisgICAgICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAoKChzb2FwLT5pbW9kZSB8IHNvYXAtPm9tb2RlKSAmIFNPQVBfSU9fS0VFUEFMSVZFKSAhPSAwKTsKKyAgICAgICAgcmV0dXJuIHNvYXAtPnNvY2tldDsKKyAgICAgIH0KKyAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUFHQUlOKQorICAgICAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiQWNjZXB0IGZhaWxlZCBmcm9tICVzXG4iLCBzb2FwLT5ob3N0KSk7CisgICAgICAgIHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJhY2NlcHQgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisJc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsgc29hcC0+ZXJybnVtID0gMDsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJubyBtYXN0ZXIgc29ja2V0IGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3RjcF9kaXNjb25uZWN0KHN0cnVjdCBzb2FwICpzb2FwKQoreworI2lmZGVmIFdJVEhfT1BFTlNTTAorICBpZiAoc29hcC0+c3NsKQorICB7IGludCByLCBzID0gMDsKKyAgICBpZiAoc29hcC0+c2Vzc2lvbikKKyAgICAgIFNTTF9TRVNTSU9OX2ZyZWUoc29hcC0+c2Vzc2lvbik7CisgICAgaWYgKCpzb2FwLT5ob3N0KQorICAgIHsgc29hcC0+c2Vzc2lvbiA9IFNTTF9nZXQxX3Nlc3Npb24oc29hcC0+c3NsKTsKKyAgICAgIGlmIChzb2FwLT5zZXNzaW9uKQorICAgICAgeyBzdHJjcHkoc29hcC0+c2Vzc2lvbl9ob3N0LCBzb2FwLT5ob3N0KTsKKyAgICAgICAgc29hcC0+c2Vzc2lvbl9wb3J0ID0gc29hcC0+cG9ydDsKKyAgICAgIH0KKyAgICB9CisgICAgciA9IFNTTF9zaHV0ZG93bihzb2FwLT5zc2wpOworICAgIGlmIChyICE9IDEpCisgICAgeyBzID0gRVJSX2dldF9lcnJvcigpOworICAgICAgaWYgKHMpCisgICAgICB7IGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICAgICAgICB7IHNvYXAtPmZzaHV0ZG93bnNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAxKTsKKyAgICAgICAgICBzb2FwLT5zb2NrZXQgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICB9CisgICAgICAgIHIgPSBTU0xfc2h1dGRvd24oc29hcC0+c3NsKTsKKyAgICAgIH0KKyAgICB9CisgICAgREJHTE9HKFRFU1QsIGlmIChzKSBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2h1dGRvd24gZmFpbGVkOiAlZFxuIiwgU1NMX2dldF9lcnJvcihzb2FwLT5zc2wsIHIpKSk7CisgICAgU1NMX2ZyZWUoc29hcC0+c3NsKTsKKyAgICBzb2FwLT5zc2wgPSBOVUxMOworICAgIGlmIChzKQorICAgICAgcmV0dXJuIFNPQVBfU1NMX0VSUk9SOworICAgIEVSUl9yZW1vdmVfc3RhdGUoMCk7CisgIH0KKyNlbmRpZgorICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSAmJiAhKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICB7IHNvYXAtPmZzaHV0ZG93bnNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAyKTsKKyAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCk7CisgICAgc29hcC0+c29ja2V0ID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3RjcF9jbG9zZXNvY2tldChzdHJ1Y3Qgc29hcCAqc29hcCwgU09BUF9TT0NLRVQgZmQpCit7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ2xvc2Ugc29ja2V0ICVkXG4iLCAoaW50KWZkKSk7CisgIHJldHVybiBjbG9zZXNvY2tldChmZCk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Cit0Y3Bfc2h1dGRvd25zb2NrZXQoc3RydWN0IHNvYXAgKnNvYXAsIFNPQVBfU09DS0VUIGZkLCBpbnQgaG93KQoreyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNodXRkb3duIHNvY2tldCAlZCBob3c9JWRcbiIsIChpbnQpZmQsIGhvdykpOworICByZXR1cm4gc2h1dGRvd24oZmQsIGhvdyk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9jbG9zZXNvY2soc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBzdGF0dXMgPSBzb2FwLT5lcnJvcjsKKyAgaWYgKHN0YXR1cyA9PSBTT0FQX0VPRiB8fCBzdGF0dXMgPT0gU09BUF9UQ1BfRVJST1IgfHwgc3RhdHVzID09IFNPQVBfU1NMX0VSUk9SIHx8ICFzb2FwLT5rZWVwX2FsaXZlKQorICB7IGlmIChzb2FwLT5mY2xvc2UgJiYgKHNvYXAtPmVycm9yID0gc29hcC0+ZmNsb3NlKHNvYXApKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBzb2FwLT5rZWVwX2FsaXZlID0gMDsKKyAgfQorI2lmZGVmIFdJVEhfWkxJQgorICBpZiAoc29hcC0+emxpYl9zdGF0ZSA9PSBTT0FQX1pMSUJfREVGTEFURSkKKyAgICBkZWZsYXRlRW5kKCZzb2FwLT5kX3N0cmVhbSk7CisgIGVsc2UgaWYgKHNvYXAtPnpsaWJfc3RhdGUgPT0gU09BUF9aTElCX0lORkxBVEUpCisgICAgaW5mbGF0ZUVuZCgmc29hcC0+ZF9zdHJlYW0pOworICBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX05PTkU7CisjZW5kaWYKKyAgcmV0dXJuIHNvYXAtPmVycm9yID0gc3RhdHVzOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3NpemVfdAorU09BUF9GTUFDMgorc29hcF9oYXNoKHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnMpCit7IHJlZ2lzdGVyIHNpemVfdCBoID0gMDsKKyAgd2hpbGUgKCpzKQorICAgIGggPSA2NTU5OSpoICsgKnMrKzsKKyAgcmV0dXJuIGggJSBTT0FQX0lESEFTSDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyB2b2lkCitzb2FwX2luaXRfcGh0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgaTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbml0aWFsaXppbmcgcG9pbnRlciBoYXNodGFibGVcbiIpKTsKKyAgc29hcC0+cGJsayA9IE5VTEw7CisgIHNvYXAtPnBpZHggPSAwOworICBmb3IgKGkgPSAwOyBpIDwgKGludClTT0FQX1BUUkhBU0g7IGkrKykKKyAgICBzb2FwLT5waHRbaV0gPSBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcCoKK1NPQVBfRk1BQzIKK3NvYXBfbmV3MShzb2FwX21vZGUgbW9kZSkKK3sgcmV0dXJuIHNvYXBfbmV3Mihtb2RlLCBtb2RlKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwKgorU09BUF9GTUFDMgorc29hcF9uZXcoKQoreyByZXR1cm4gc29hcF9uZXcyKFNPQVBfSU9fREVGQVVMVCwgU09BUF9JT19ERUZBVUxUKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwKgorU09BUF9GTUFDMgorc29hcF9uZXcyKHNvYXBfbW9kZSBpbW9kZSwgc29hcF9tb2RlIG9tb2RlKQoreyBzdHJ1Y3Qgc29hcCAqc29hcCA9IChzdHJ1Y3Qgc29hcCopbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc29hcCkpOworICBpZiAoc29hcCkKKyAgICBzb2FwX2luaXQyKHNvYXAsIGltb2RlLCBvbW9kZSk7CisgIHJldHVybiBzb2FwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9kZWwoc3RydWN0IHNvYXAgKnNvYXApCit7IGZyZWUoc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQKK3NvYXBfZnJlZV9waHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BibGsgKnBiLCAqbmV4dDsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZSBwb2ludGVyIGhhc2h0YWJsZVxuIikpOworICBmb3IgKHBiID0gc29hcC0+cGJsazsgcGI7IHBiID0gbmV4dCkKKyAgeyBuZXh0ID0gcGItPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIHBiKTsKKyAgfQorICBzb2FwLT5wYmxrID0gTlVMTDsKKyAgc29hcC0+cGlkeCA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCAoaW50KVNPQVBfUFRSSEFTSDsgaSsrKQorICAgIHNvYXAtPnBodFtpXSA9IE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW1iZWQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgbiwgY29uc3QgY2hhciAqdGFnLCBpbnQgdHlwZSkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgaWYgKHNvYXAtPnZlcnNpb24gIT0gMSkKKyAgICBzb2FwLT5lbmNvZGluZyA9IDE7CisgIGlmIChhKQorICAgIGkgPSBzb2FwX2FycmF5X3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIGEsIG4sIHR5cGUsICZwcCk7CisgIGVsc2UKKyAgICBpID0gc29hcF9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCB0eXBlLCAmcHApOworICBpZiAoaSkKKyAgeyBpZiAoc29hcF9pc19lbWJlZGRlZChzb2FwLCBwcCkKKyAgICAgfHwgc29hcF9pc19zaW5nbGUoc29hcCwgcHApKQorICAgICAgcmV0dXJuIDA7CisgICAgc29hcF9zZXRfZW1iZWRkZWQoc29hcCwgcHApOworICB9CisgIHJldHVybiBpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3BvaW50ZXJfbG9va3VwKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBpbnQgdHlwZSwgc3RydWN0IHNvYXBfcGxpc3QgKipwcHApCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgKnBwcCA9IE5VTEw7CisgIGlmIChwKQorICB7IGZvciAocHAgPSBzb2FwLT5waHRbc29hcF9oYXNoX3B0cihwKV07IHBwOyBwcCA9IHBwLT5uZXh0KQorICAgIHsgaWYgKHBwLT5wdHIgPT0gcCAmJiBwcC0+dHlwZSA9PSB0eXBlKQorICAgICAgeyAqcHBwID0gcHA7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTG9va3VwIGxvY2F0aW9uPSVwIHR5cGU9JWQgaWQ9JWRcbiIsIHAsIHR5cGUsIHBwLT5pZCkpOworICAgICAgICByZXR1cm4gcHAtPmlkOworICAgICAgfQorICAgIH0KKyAgfQorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkxvb2t1cCBsb2NhdGlvbj0lcCB0eXBlPSVkOiBub3QgZm91bmRcbiIsIHAsIHR5cGUpKTsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcG9pbnRlcl9lbnRlcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCwgY29uc3Qgc3RydWN0IHNvYXBfYXJyYXkgKmEsIGludCBuLCBpbnQgdHlwZSwgc3RydWN0IHNvYXBfcGxpc3QgKipwcHApCit7IHJlZ2lzdGVyIGludCBoOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgIGlmICghc29hcC0+cGJsayB8fCBzb2FwLT5waWR4ID49IFNPQVBfUFRSQkxLKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BibGsgKnBiID0gKHN0cnVjdCBzb2FwX3BibGsqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9wYmxrKSk7CisgICAgaWYgKCFwYikKKyAgICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcGItPm5leHQgPSBzb2FwLT5wYmxrOworICAgIHNvYXAtPnBibGsgPSBwYjsKKyAgICBzb2FwLT5waWR4ID0gMDsKKyAgfQorICAqcHBwID0gcHAgPSAmc29hcC0+cGJsay0+cGxpc3Rbc29hcC0+cGlkeCsrXTsKKyAgaWYgKGEpCisgICAgaCA9IHNvYXBfaGFzaF9wdHIoYS0+X19wdHIpOworICBlbHNlCisgICAgaCA9IHNvYXBfaGFzaF9wdHIocCk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUG9pbnRlciBlbnRlciBsb2NhdGlvbj0lcCBhcnJheT0lcCBzaXplPSVkIGRpbT0lZCB0eXBlPSVkIGlkPSVkXG4iLCBwLCBhP2EtPl9fcHRyOk5VTEwsIGE/YS0+X19zaXplOjAsIG4sIHR5cGUsIHNvYXAtPmlkbnVtKzEpKTsKKyAgcHAtPm5leHQgPSBzb2FwLT5waHRbaF07CisgIHBwLT50eXBlID0gdHlwZTsKKyAgcHAtPm1hcmsxID0gMDsKKyAgcHAtPm1hcmsyID0gMDsKKyAgcHAtPnB0ciA9IHA7CisgIHBwLT5hcnJheSA9IGE7CisgIHNvYXAtPnBodFtoXSA9IHBwOworICBwcC0+aWQgPSArK3NvYXAtPmlkbnVtOworICByZXR1cm4gcHAtPmlkOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2FycmF5X3BvaW50ZXJfbG9va3VwKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGludCB0eXBlLCBzdHJ1Y3Qgc29hcF9wbGlzdCAqKnBwcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICAqcHBwID0gTlVMTDsKKyAgaWYgKCFwIHx8ICFhLT5fX3B0cikKKyAgICByZXR1cm4gMDsKKyAgZm9yIChwcCA9IHNvYXAtPnBodFtzb2FwX2hhc2hfcHRyKGEtPl9fcHRyKV07IHBwOyBwcCA9IHBwLT5uZXh0KQorICB7IGlmIChwcC0+dHlwZSA9PSB0eXBlICYmIHBwLT5hcnJheSAmJiBwcC0+YXJyYXktPl9fcHRyID09IGEtPl9fcHRyKQorICAgIHsgcmVnaXN0ZXIgaW50IGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICBpZiAoKChjb25zdCBpbnQqKSZwcC0+YXJyYXktPl9fc2l6ZSlbaV0gIT0gKChjb25zdCBpbnQqKSZhLT5fX3NpemUpW2ldKQorCSAgYnJlYWs7CisgICAgICBpZiAoaSA9PSBuKQorICAgICAgeyAqcHBwID0gcHA7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQXJyYXkgbG9va3VwIGxvY2F0aW9uPSVwIHR5cGU9JWQgaWQ9JWRcbiIsIGEtPl9fcHRyLCB0eXBlLCBwcC0+aWQpKTsKKyAgICAgICAgcmV0dXJuIHBwLT5pZDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJBcnJheSBsb29rdXAgbG9jYXRpb249JXAgdHlwZT0lZDogbm90IGZvdW5kXG4iLCBhLT5fX3B0ciwgdHlwZSkpOworICByZXR1cm4gMDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JlZ2luX2NvdW50KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwX2Nscl9hdHRyKHNvYXApOworICBzb2FwX3NldF9sb2NhbF9uYW1lc3BhY2VzKHNvYXApOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSB8fCAoc29hcC0+b21vZGUgJiBTT0FQX0VOQ19ESU1FKSkKKyAgICBzb2FwLT5tb2RlID0gc29hcC0+b21vZGUgfCBTT0FQX0lPX0xFTkdUSCB8IFNPQVBfRU5DX0RJTUU7CisgIGVsc2UKKyNlbmRpZgorICB7IHNvYXAtPm1vZGUgPSBzb2FwLT5vbW9kZTsKKyAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX1NUT1JFCisgICAgIHx8ICgoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LIHx8IChzb2FwLT5tb2RlICYgU09BUF9FTkNfWE1MKSkKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgICAgICYmICFzb2FwLT5mcHJlcGFyZXNlbmQKKyNlbmRpZgorICAgICAgKSkKKyAgICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfSU9fTEVOR1RIOworICAgIGVsc2UKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19MRU5HVEg7CisgIH0KKyNpZmRlZiBXSVRIX1pMSUIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQikgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0ZMVVNIKQorICB7IGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSkKKyAgICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfSU9fTEVOR1RIOworICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWE1MKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX0JVRkZFUjsKKyAgICBlbHNlCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fU1RPUkU7CisgIH0KKyNlbmRpZgorICBpZiAoIXNvYXAtPmVuY29kaW5nU3R5bGUgJiYgIShzb2FwLT5tb2RlICYgU09BUF9YTUxfR1JBUEgpKQorICAgIHNvYXAtPm1vZGUgfD0gU09BUF9YTUxfVFJFRTsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSkKKyAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX01JTUU7CisgIGVsc2UKKyAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0VOQ19NVE9NOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01JTUUpCisgICAgc29hcF9zZWxlY3RfbWltZV9ib3VuZGFyeShzb2FwKTsKKyAgc29hcC0+ZGltZS5saXN0ID0gc29hcC0+ZGltZS5sYXN0OwkvKiBrZWVwIHRyYWNrIG9mIGxhc3QgRElNRSBhdHRhY2htZW50ICovCisjZW5kaWYKKyAgc29hcC0+Y291bnQgPSAwOworICBzb2FwLT5ucyA9IDA7CisgIHNvYXAtPm51bGwgPSAwOworICBzb2FwLT5wb3NpdGlvbiA9IDA7CisgIHNvYXAtPm11c3RVbmRlcnN0YW5kID0gMDsKKyAgc29hcC0+ZW5jb2RpbmcgPSAwOworICBzb2FwLT5wYXJ0ID0gU09BUF9CRUdJTjsKKyAgc29hcC0+aWRudW0gPSAwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkJlZ2luIGNvdW50IHBoYXNlIChzb2NrZXQ9JWQgbW9kZT0weCV4IGNvdW50PSVsdSlcbiIsIHNvYXAtPnNvY2tldCwgc29hcC0+bW9kZSwgKHVuc2lnbmVkIGxvbmcpc29hcC0+Y291bnQpKTsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcC0+ZGltZS5jb3VudCA9IDA7IC8qIGNvdW50ICMgb2YgYXR0YWNobWVudHMgKi8KKyAgc29hcC0+ZGltZS5zaXplID0gMDsgLyogYWNjdW11bGF0ZSB0b3RhbCBzaXplIG9mIGF0dGFjaG1lbnRzICovCisgIGlmIChzb2FwLT5mcHJlcGFyZWluaXQgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSAhPSBTT0FQX0lPX1NUT1JFKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IHNvYXAtPmZwcmVwYXJlaW5pdChzb2FwKTsgICAKKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbmRfY291bnQoc3RydWN0IHNvYXAgKnNvYXApCit7IAorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+ZnByZXBhcmVmaW5hbCkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBzb2FwLT5mcHJlcGFyZWZpbmFsKHNvYXApOworI2VuZGlmCisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIG9mIGNvdW50IHBoYXNlXG4iKSk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JlZ2luX3NlbmQoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgc29hcF9jbHJfYXR0cihzb2FwKTsKKyAgc29hcF9zZXRfbG9jYWxfbmFtZXNwYWNlcyhzb2FwKTsKKyAgc29hcC0+bW9kZSA9IHNvYXAtPm9tb2RlIHwgKHNvYXAtPm1vZGUgJiAoU09BUF9JT19MRU5HVEggfCBTT0FQX0VOQ19ESU1FKSk7CisjaWZkZWYgV0lUSF9aTElCCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIpICYmIChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19GTFVTSCkKKyAgeyBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1hNTCkKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19CVUZGRVI7CisgICAgZWxzZQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX1NUT1JFOworICB9CisjZW5kaWYKKyNpZmRlZiBXSVRIX1VEUAorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPX1VEUCkpCisgIHsgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19YTUw7CisgICAgaWYgKHNvYXAtPmNvdW50ID4gU09BUF9CVUZMRU4pCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1VEUF9FUlJPUjsKKyAgfQorI2VuZGlmCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fRkxVU0ggJiYgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgeyBpZiAoc29hcC0+Y291bnQgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX0JVRkZFUjsKKyAgICBlbHNlCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fU1RPUkU7CisgIH0KKyAgc29hcC0+bW9kZSAmPSB+U09BUF9JT19MRU5HVEg7CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fU1RPUkUpCisgICAgc29hcF9uZXdfYmxvY2soc29hcCk7CisgIGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0tFRVBBTElWRSkpCisgICAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7CisgIGlmICghc29hcC0+ZW5jb2RpbmdTdHlsZSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9HUkFQSCkpCisgICAgc29hcC0+bW9kZSB8PSBTT0FQX1hNTF9UUkVFOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpKQorICB7IHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfTUlNRTsKKyAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0VOQ19ESU1FOworICB9CisgIGVsc2UKKyAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0VOQ19NVE9NOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01JTUUpCisgICAgc29hcF9zZWxlY3RfbWltZV9ib3VuZGFyeShzb2FwKTsKKyNpZmRlZiBXSU4zMgorI2lmbmRlZiBVTkRFUl9DRQorI2lmbmRlZiBXSVRIX0ZBU1RDR0kKKyAgaWYgKCFzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKSAvKiBTZXQgd2luMzIgc3Rkb3V0IG9yIHNvYXAtPnNlbmRmZCB0byBCSU5BUlksIGUuZy4gdG8gc3VwcG9ydCBESU1FICovCisjaWZkZWYgX19CT1JMQU5EQ19fCisgICAgc2V0bW9kZSgoU09BUF9TT0NLRVQpc29hcC0+c2VuZGZkLCBPX0JJTkFSWSk7CisjZWxzZQorICAgIF9zZXRtb2RlKChTT0FQX1NPQ0tFVClzb2FwLT5zZW5kZmQsIF9PX0JJTkFSWSk7CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pCisgIHsgc29hcC0+YnVmaWR4ID0gMDsKKyAgICBzb2FwLT5idWZsZW4gPSAwOworICB9CisgIHNvYXAtPmNodW5rc2l6ZSA9IDA7CisgIHNvYXAtPm5zID0gMDsKKyAgc29hcC0+bnVsbCA9IDA7CisgIHNvYXAtPnBvc2l0aW9uID0gMDsKKyAgc29hcC0+bXVzdFVuZGVyc3RhbmQgPSAwOworICBzb2FwLT5lbmNvZGluZyA9IDA7CisgIHNvYXAtPmlkbnVtID0gMDsKKyAgc29hcC0+bGV2ZWwgPSAwOworI2lmZGVmIFdJVEhfWkxJQgorICBzb2FwLT56X3JhdGlvX291dCA9IDEuMDsKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQikgJiYgc29hcC0+emxpYl9zdGF0ZSAhPSBTT0FQX1pMSUJfREVGTEFURSkKKyAgeworI2lmZGVmIFdJVEhfR1pJUAorICAgIG1lbWNweShzb2FwLT56X2J1ZiwgIlwzN1wyMTNcMTBcMFwwXDBcMFwwXDBcMzc3IiwgMTApOworICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gKEJ5dGUqKXNvYXAtPnpfYnVmICsgMTA7CisgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0ID0gU09BUF9CVUZMRU4gLSAxMDsKKyAgICBzb2FwLT56X2NyYyA9IGNyYzMyKDBMLCBOVUxMLCAwKTsKKyAgICBpZiAoZGVmbGF0ZUluaXQyKCZzb2FwLT5kX3N0cmVhbSwgc29hcC0+el9sZXZlbCwgWl9ERUZMQVRFRCwgLU1BWF9XQklUUywgOCwgWl9ERUZBVUxUX1NUUkFURUdZKSAhPSBaX09LKQorI2Vsc2UKKyAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IChCeXRlKilzb2FwLT56X2J1ZjsKKyAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgPSBTT0FQX0JVRkxFTjsKKyAgICBpZiAoZGVmbGF0ZUluaXQoJnNvYXAtPmRfc3RyZWFtLCBzb2FwLT56X2xldmVsKSAhPSBaX09LKQorI2VuZGlmCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJEZWZsYXRlIGluaXRpYWxpemVkXG4iKSk7CisgICAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9ERUZMQVRFOworICB9CisjZW5kaWYKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJCZWdpbiBzZW5kIHBoYXNlIChzb2NrZXQ9JWQgbW9kZT0weCV4IGNvdW50PSVsdSlcbiIsIHNvYXAtPnNvY2tldCwgc29hcC0+bW9kZSwgKHVuc2lnbmVkIGxvbmcpc29hcC0+Y291bnQpKTsKKyAgc29hcC0+cGFydCA9IFNPQVBfQkVHSU47CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5mcHJlcGFyZWluaXQgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX1NUT1JFKQorICAgIHNvYXAtPmZwcmVwYXJlaW5pdChzb2FwKTsgICAKKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2VtYmVkZGVkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBpbnQgdCkKK3sgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICBpZiAoc29hcF9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCB0LCAmcHApKQorICB7IHBwLT5tYXJrMSA9IDE7CisgICAgcHAtPm1hcmsyID0gMTsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVtYmVkZGVkICVwIHR5cGU9JWQgbWFyayBzZXQgdG8gMVxuIiwgcCwgdCkpOworICB9Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVmZXJlbmNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBpbnQgdCkKK3sgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICBpZiAoIXAgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9UUkVFKSkKKyAgICByZXR1cm4gMTsKKyAgaWYgKHNvYXBfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgdCwgJnBwKSkKKyAgeyBpZiAocHAtPm1hcmsxID09IDApCisgICAgeyBwcC0+bWFyazEgPSAyOworICAgICAgcHAtPm1hcmsyID0gMjsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoc29hcF9wb2ludGVyX2VudGVyKHNvYXAsIHAsIE5VTEwsIDAsIHQsICZwcCkpCisgIHsgcHAtPm1hcmsxID0gMDsKKyAgICBwcC0+bWFyazIgPSAwOworICB9CisgIGVsc2UKKyAgICByZXR1cm4gMTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWZlcmVuY2UgJXAgdHlwZT0lZCAoJWQgJWQpXG4iLCBwLCB0LCAoaW50KXBwLT5tYXJrMSwgKGludClwcC0+bWFyazIpKTsKKyAgcmV0dXJuIHBwLT5tYXJrMTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9hcnJheV9yZWZlcmVuY2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgbiwgaW50IHQpCit7IHJlZ2lzdGVyIGludCBpOworICBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgIGlmICghcCB8fCAhYS0+X19wdHIpCisgICAgcmV0dXJuIDE7CisgIGkgPSBzb2FwX2FycmF5X3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIGEsIG4sIHQsICZwcCk7CisgIGlmIChpKQorICB7IGlmIChwcC0+bWFyazEgPT0gMCkKKyAgICB7IHBwLT5tYXJrMSA9IDI7CisgICAgICBwcC0+bWFyazIgPSAyOworICAgIH0KKyAgfQorICBlbHNlIGlmICghc29hcF9wb2ludGVyX2VudGVyKHNvYXAsIHAsIGEsIG4sIHQsICZwcCkpCisgICAgcmV0dXJuIDE7CisgIGVsc2UKKyAgeyBwcC0+bWFyazEgPSAwOworICAgIHBwLT5tYXJrMiA9IDA7CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJBcnJheSByZWZlcmVuY2UgJXAgcHRyPSVwIGRpbT0lZCB0eXBlPSVkICglZCAlZClcbiIsIHAsIGEtPl9fcHRyLCBuLCB0LCAoaW50KXBwLT5tYXJrMSwgKGludClwcC0+bWFyazIpKTsKKyAgcmV0dXJuIHBwLT5tYXJrMTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbWJlZGRlZF9pZChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGlkLCBjb25zdCB2b2lkICpwLCBpbnQgdCkKK3sgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1RSRUUpCisgICAgcmV0dXJuIGlkOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVtYmVkZGVkX2lkICVwIHR5cGU9JWQgaWQ9JWRcbiIsIHAsIHQsIGlkKSk7CisgIGlmIChzb2FwLT52ZXJzaW9uID09IDEgJiYgc29hcC0+ZW5jb2RpbmdTdHlsZSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9HUkFQSCkgJiYgc29hcC0+cGFydCAhPSBTT0FQX0lOX0hFQURFUikKKyAgeyBpZiAoaWQgPCAwKQorICAgIHsgaWQgPSBzb2FwX3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIHQsICZwcCk7CisgICAgICBpZiAoaWQpCisgICAgICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgICAgICAgcHAtPm1hcmsxID0gMjsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHBwLT5tYXJrMiA9IDI7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW1iZWRkZWRfaWQgbXVsdGlyZWYgaWQ9JWQgJXAgdHlwZT0lZCA9ICglZCAlZClcbiIsIGlkLCBwLCB0LCAoaW50KXBwLT5tYXJrMSwgKGludClwcC0+bWFyazIpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIGlkOworICB9CisgIGlmIChpZCA8IDApCisgICAgaWQgPSBzb2FwX3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIHQsICZwcCk7CisgIGVsc2UgaWYgKGlkICYmICFzb2FwX3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIHQsICZwcCkpCisgICAgcmV0dXJuIDA7CisgIGlmIChpZCAmJiBwcCkKKyAgeyBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICAgICAgcHAtPm1hcmsxID0gMTsKKyAgICBlbHNlCisgICAgICBwcC0+bWFyazIgPSAxOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW1iZWRkZWRfaWQgZW1iZWRkZWQgcmVmIGlkPSVkICVwIHR5cGU9JWQgPSAoJWQgJWQpXG4iLCBpZCwgcCwgdCwgKGludClwcC0+bWFyazEsIChpbnQpcHAtPm1hcmsyKSk7CisgIH0KKyAgcmV0dXJuIGlkOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2lzX2VtYmVkZGVkKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHApCit7IGlmICghcHApCisgICAgcmV0dXJuIDA7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSXMgZW1iZWRkZWQ/ICVkICVkXG4iLCAoaW50KXBwLT5tYXJrMSwgKGludClwcC0+bWFyazIpKTsKKyAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMSAmJiBzb2FwLT5lbmNvZGluZ1N0eWxlICYmICEoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0dSQVBIKSAmJiBzb2FwLT5wYXJ0ICE9IFNPQVBfSU5fSEVBREVSKQorICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgICByZXR1cm4gcHAtPm1hcmsxICE9IDA7CisgICAgcmV0dXJuIHBwLT5tYXJrMiAhPSAwOworICB9CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgcmV0dXJuIHBwLT5tYXJrMSA9PSAxOworICByZXR1cm4gcHAtPm1hcmsyID09IDE7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfaXNfc2luZ2xlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHApCit7IGlmIChzb2FwLT5wYXJ0ID09IFNPQVBfSU5fSEVBREVSKQorICAgIHJldHVybiAxOworICBpZiAoIXBwKQorICAgIHJldHVybiAwOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICAgIHJldHVybiBwcC0+bWFyazEgPT0gMDsKKyAgcmV0dXJuIHBwLT5tYXJrMiA9PSAwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfZW1iZWRkZWQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3BsaXN0ICpwcCkKK3sgaWYgKCFwcCkKKyAgICByZXR1cm47CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgcHAtPm1hcmsxID0gMTsKKyAgZWxzZQorICAgIHBwLT5tYXJrMiA9IDE7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYXR0YWNobWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBjb25zdCBjaGFyICphaWQsIGNvbnN0IGNoYXIgKmF0eXBlLCBjb25zdCBjaGFyICphb3B0aW9ucywgaW50IG4sIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KSAKK3sgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICBpbnQgaTsKKyAgaWYgKCFwIHx8ICFhLT5fX3B0ciB8fCAoIWFpZCAmJiAhYXR5cGUpKQorICAgIHJldHVybiBzb2FwX2VsZW1lbnRfaWQoc29hcCwgdGFnLCBpZCwgcCwgYSwgbiwgdHlwZSwgdCk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQXR0YWNobWVudCB0YWc9JyVzJyBpZD0nJXMnICglZCkgdHlwZT0nJXMnXG4iLCB0YWcsIGFpZD9haWQ6IiIsIGlkLCBhdHlwZT9hdHlwZToiIikpOworICBpID0gc29hcF9hcnJheV9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCBhLCBuLCB0LCAmcHApOworICBpZiAoIWkpCisgIHsgaSA9IHNvYXBfcG9pbnRlcl9lbnRlcihzb2FwLCBwLCBhLCBuLCB0LCAmcHApOworICAgIGlmICghaSkKKyAgICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CisgIGlmIChpZCA8PSAwKQorICAgIGlkID0gaTsKKyAgaWYgKCFhaWQpCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsIHNvYXAtPmRpbWVfaWRfZm9ybWF0LCBpZCk7CisgICAgYWlkID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+dG1wYnVmKTsKKyAgfQorICAvKiBBZGQgTVRPTSB4b3A6SW5jbHVkZSBlbGVtZW50IHdoZW4gbmVjZXNzYXJ5ICovCisgIC8qIFRPRE86IHRoaXMgY29kZSB0byBiZSBvYnNvbGV0ZWQgd2l0aCBuZXcgaW1wb3J0L3hvcC5oIGNvbnZlbnRpb25zICovCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pICYmIHN0cmNtcCh0YWcsICJ4b3A6SW5jbHVkZSIpKQorICB7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgMCwgdHlwZSkKKyAgICAgfHwgc29hcF9lbGVtZW50X2hyZWYoc29hcCwgInhvcDpJbmNsdWRlIiwgMCwgImhyZWYiLCBhaWQpCisgICAgIHx8IHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZykpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgZWxzZSBpZiAoc29hcF9lbGVtZW50X2hyZWYoc29hcCwgdGFnLCAwLCAiaHJlZiIsIGFpZCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICB7IGlmIChwcC0+bWFyazEgIT0gMykKKyAgICB7IHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkKKyAgICAgICAgY29udGVudCA9IHNvYXBfbmV3X211bHRpcGFydChzb2FwLCAmc29hcC0+bWltZS5maXJzdCwgJnNvYXAtPm1pbWUubGFzdCwgKGNoYXIqKWEtPl9fcHRyLCBhLT5fX3NpemUpOworICAgICAgZWxzZQorICAgICAgICBjb250ZW50ID0gc29hcF9uZXdfbXVsdGlwYXJ0KHNvYXAsICZzb2FwLT5kaW1lLmZpcnN0LCAmc29hcC0+ZGltZS5sYXN0LCAoY2hhciopYS0+X19wdHIsIGEtPl9fc2l6ZSk7CisgICAgICBpZiAoIWNvbnRlbnQpCisgICAgICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGlmICghc3RybmNtcChhaWQsICJjaWQ6IiwgNCkpIC8qIFJGQyAyMTExICovCisgICAgICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkKKyAgICAgICAgeyBjaGFyICpzID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihhaWQpIC0gMSk7CisJICBpZiAocykKKwkgIHsgKnMgPSAnPCc7CisJICAgIHN0cmNweShzICsgMSwgYWlkICsgNCk7CisJICAgIHN0cmNhdChzLCAiPiIpOworCSAgICBjb250ZW50LT5pZCA9IHM7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBjb250ZW50LT5pZCA9IGFpZCArIDQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIGNvbnRlbnQtPmlkID0gYWlkOworICAgICAgY29udGVudC0+dHlwZSA9IGF0eXBlOworICAgICAgY29udGVudC0+b3B0aW9ucyA9IGFvcHRpb25zOworICAgICAgY29udGVudC0+ZW5jb2RpbmcgPSBTT0FQX01JTUVfQklOQVJZOworICAgICAgcHAtPm1hcmsxID0gMzsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIHBwLT5tYXJrMiA9IDM7CisgIHJldHVybiAtMTsKK30KKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQKK3NvYXBfaW5pdF9paHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBpOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluaXRpYWxpemluZyBJRCBoYXNodGFibGVcbiIpKTsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfSURIQVNIOyBpKyspCisgICAgc29hcC0+aWh0W2ldID0gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyB2b2lkCitzb2FwX2ZyZWVfaWh0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfaWxpc3QgKmlwLCAqcDsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZmxpc3QgKmZwLCAqZnE7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZSBJRCBoYXNodGFibGVcbiIpKTsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfSURIQVNIOyBpKyspCisgIHsgZm9yIChpcCA9IHNvYXAtPmlodFtpXTsgaXA7IGlwID0gcCkKKyAgICB7IGZvciAoZnAgPSBpcC0+Zmxpc3Q7IGZwOyBmcCA9IGZxKQorICAgICAgeyBmcSA9IGZwLT5uZXh0OworICAgICAgICBTT0FQX0ZSRUUoc29hcCwgZnApOworICAgICAgfQorICAgICAgcCA9IGlwLT5uZXh0OworICAgICAgU09BUF9GUkVFKHNvYXAsIGlwKTsKKyAgICB9CisgICAgc29hcC0+aWh0W2ldID0gTlVMTDsKKyAgfQorfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorc3RydWN0IHNvYXBfaWxpc3QgKgorU09BUF9GTUFDMgorc29hcF9sb29rdXAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIGZvciAoaXAgPSBzb2FwLT5paHRbc29hcF9oYXNoKGlkKV07IGlwOyBpcCA9IGlwLT5uZXh0KQorICAgIGlmICghc3RyY21wKGlwLT5pZCwgaWQpKQorICAgICAgcmV0dXJuIGlwOworICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwX2lsaXN0ICoKK1NPQVBfRk1BQzIKK3NvYXBfZW50ZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkKQoreyByZWdpc3RlciBzaXplX3QgaDsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworICBpcCA9IChzdHJ1Y3Qgc29hcF9pbGlzdCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2lsaXN0KSArIHN0cmxlbihpZCkpOworICBpZiAoaXApCisgIHsgaCA9IHNvYXBfaGFzaChpZCk7CisgICAgc3RyY3B5KGlwLT5pZCwgaWQpOworICAgIGlwLT5uZXh0ID0gc29hcC0+aWh0W2hdOworICAgIHNvYXAtPmlodFtoXSA9IGlwOworICAgIHJldHVybiBpcDsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZCoKK1NPQVBfRk1BQzIKK3NvYXBfbWFsbG9jKHN0cnVjdCBzb2FwICpzb2FwLCBzaXplX3QgbikKK3sgcmVnaXN0ZXIgY2hhciAqcDsKKyAgaWYgKCFuKQorICAgIHJldHVybiAodm9pZCopU09BUF9OT05fTlVMTDsKKyAgaWYgKCFzb2FwKQorICAgIHJldHVybiBTT0FQX01BTExPQyhzb2FwLCBuKTsKKyAgbiArPSAoLShsb25nKW4pICYgKHNpemVvZih2b2lkKiktMSk7IC8qIGFsaWduIGF0IDQtLCA4LSBvciAxNi1ieXRlIGJvdW5kYXJ5ICovCisgIGlmICghKHAgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgbiArIHNpemVvZih2b2lkKikgKyBzaXplb2Yoc2l6ZV90KSkpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgLyoga2VlcCBjaGFpbiBvZiBhbGxvY2VkIGNlbGxzIGZvciBsYXRlciBkZXN0cnVjdGlvbiAqLworICBzb2FwLT5hbGxvY2VkID0gMTsKKyAgKih2b2lkKiopKHAgKyBuKSA9IHNvYXAtPmFsaXN0OworICAqKHNpemVfdCopKHAgKyBuICsgc2l6ZW9mKHZvaWQqKSkgPSBuOworICBzb2FwLT5hbGlzdCA9IHAgKyBuOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK3N0YXRpYyB2b2lkCitzb2FwX2luaXRfbWh0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IChpbnQpU09BUF9QVFJIQVNIOyBpKyspCisgICAgc29hcC0+bWh0W2ldID0gTlVMTDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK3N0YXRpYyB2b2lkCitzb2FwX2ZyZWVfbWh0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbWxpc3QgKm1wLCAqbXE7CisgIGZvciAoaSA9IDA7IGkgPCAoaW50KVNPQVBfUFRSSEFTSDsgaSsrKQorICB7IGZvciAobXAgPSBzb2FwLT5taHRbaV07IG1wOyBtcCA9IG1xKQorICAgIHsgbXEgPSBtcC0+bmV4dDsKKyAgICAgIGlmIChtcC0+bGl2ZSkKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyglZCk6IG1hbGxvYygpID0gJXAgbm90IGZyZWVkIChtZW1vcnkgbGVhayBvciBmb3Jnb3QgdG8gY2FsbCBzb2FwX2VuZCgpPylcbiIsIG1wLT5maWxlLCBtcC0+bGluZSwgbXAtPnB0cik7CisgICAgICBmcmVlKG1wKTsKKyAgICB9CisgICAgc29hcC0+bWh0W2ldID0gTlVMTDsKKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworU09BUF9GTUFDMQordm9pZCoKK1NPQVBfRk1BQzIKK3NvYXBfdHJhY2tfbWFsbG9jKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgc2l6ZV90IHNpemUpCit7IHJlZ2lzdGVyIHZvaWQgKnAgPSBtYWxsb2Moc2l6ZSk7CisgIGlmIChzb2FwKQorICB7IHJlZ2lzdGVyIGludCBoID0gc29hcF9oYXNoX3B0cihwKTsKKyAgICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9tbGlzdCAqbXAgPSAoc3RydWN0IHNvYXBfbWxpc3QqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHNvYXBfbWxpc3QpKTsKKyAgICBpZiAoc29hcC0+ZmRlYnVnW1NPQVBfSU5ERVhfVEVTVF0pCisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIiVzKCVkKTogbWFsbG9jKCVsdSkgPSAlcFxuIiwgZmlsZSwgbGluZSwgKHVuc2lnbmVkIGxvbmcpc2l6ZSwgcCkpOworICAgIG1wLT5uZXh0ID0gc29hcC0+bWh0W2hdOworICAgIG1wLT5wdHIgPSBwOworICAgIG1wLT5maWxlID0gZmlsZTsKKyAgICBtcC0+bGluZSA9IGxpbmU7CisgICAgbXAtPmxpdmUgPSAxOworICAgIHNvYXAtPm1odFtoXSA9IG1wOworICB9CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF90cmFja19mcmVlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgdm9pZCAqcCkKK3sgcmVnaXN0ZXIgaW50IGggPSBzb2FwX2hhc2hfcHRyKHApOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9tbGlzdCAqbXA7CisgIGZvciAobXAgPSBzb2FwLT5taHRbaF07IG1wOyBtcCA9IG1wLT5uZXh0KQorICAgIGlmIChtcC0+cHRyID09IHApCisgICAgICBicmVhazsKKyAgaWYgKG1wKQorICB7IGlmIChtcC0+bGl2ZSkKKyAgICB7IGZyZWUocCk7CisgICAgICBpZiAoc29hcC0+ZmRlYnVnW1NPQVBfSU5ERVhfVEVTVF0pCisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiJXMoJWQpOiBmcmVlKCVwKVxuIiwgZmlsZSwgbGluZSwgcCkpOworICAgICAgbXAtPmxpdmUgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzKCVkKTogZnJlZSglcCkgZG91YmxlIGZyZWUgb2YgcG9pbnRlciBtYWxsb2NlZCBhdCAlcyglZClcbiIsIGZpbGUsIGxpbmUsIHAsIG1wLT5maWxlLCBtcC0+bGluZSk7CisgIH0KKyAgZWxzZQorICAgIGZwcmludGYoc3RkZXJyLCAiJXMoJWQpOiBmcmVlKCVwKSBwb2ludGVyIG5vdCBtYWxsb2NlZFxuIiwgZmlsZSwgbGluZSwgcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitzdGF0aWMgdm9pZAorc29hcF90cmFja191bmxpbmsoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnApCit7IHJlZ2lzdGVyIGludCBoID0gc29hcF9oYXNoX3B0cihwKTsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbWxpc3QgKm1wOworICBmb3IgKG1wID0gc29hcC0+bWh0W2hdOyBtcDsgbXAgPSBtcC0+bmV4dCkKKyAgICBpZiAobXAtPnB0ciA9PSBwKQorICAgICAgYnJlYWs7CisgIGlmIChtcCkKKyAgICBtcC0+bGl2ZSA9IDA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2RlYWxsb2Moc3RydWN0IHNvYXAgKnNvYXAsIHZvaWQgKnApCit7IGlmICghc29hcCkKKyAgICByZXR1cm47CisgIGlmIChwKQorICB7IHJlZ2lzdGVyIGNoYXIgKipxOworICAgIGZvciAocSA9IChjaGFyKiopJnNvYXAtPmFsaXN0OyAqcTsgcSA9ICooY2hhcioqKilxKQorICAgIHsgaWYgKHAgPT0gKHZvaWQqKSgqcSAtICooc2l6ZV90KikoKnEgKyBzaXplb2Yodm9pZCopKSkpCisgICAgICB7ICpxID0gKiooY2hhcioqKilxOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWVkIGRhdGEgYXQgJXBcbiIsIHApKTsKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHApOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICAgIHNvYXBfZGVsZXRlKHNvYXAsIHApOworICB9CisgIGVsc2UKKyAgeyByZWdpc3RlciBjaGFyICpxOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZSBhbGwgc29hcF9tYWxsb2MoKSBkYXRhXG4iKSk7CisgICAgd2hpbGUgKHNvYXAtPmFsaXN0KQorICAgIHsgcSA9IChjaGFyKilzb2FwLT5hbGlzdDsKKyAgICAgIHNvYXAtPmFsaXN0ID0gKih2b2lkKiopcTsKKyAgICAgIHEgLT0gKihzaXplX3QqKShxICsgc2l6ZW9mKHZvaWQqKSk7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgcSk7CisgICAgfQorICB9CisgIC8qIHdlIG11c3QgYXNzdW1lIHRoZXNlIHdlcmUgZGVhbGxvY2F0ZWQ6ICovCisgIHNvYXAtPmFjdGlvbiA9IE5VTEw7CisgIHNvYXAtPmZhdWx0ID0gTlVMTDsKKyAgc29hcC0+aGVhZGVyID0gTlVMTDsKKyAgc29hcC0+dXNlcmlkID0gTlVMTDsKKyAgc29hcC0+cGFzc3dkID0gTlVMTDsKKyAgc29hcC0+YXV0aHJlYWxtID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcF9jbHJfbWltZShzb2FwKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9kZWxldGUoc3RydWN0IHNvYXAgKnNvYXAsIHZvaWQgKnApCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2NsaXN0ICoqY3A7CisgIGlmIChzb2FwX2NoZWNrX3N0YXRlKHNvYXApKQorICAgIHJldHVybjsKKyAgY3AgPSAmc29hcC0+Y2xpc3Q7CisgIGlmIChwKQorICB7IHdoaWxlICgqY3ApCisgICAgeyBpZiAocCA9PSAoKmNwKS0+cHRyKQorICAgICAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9jbGlzdCAqcSA9ICpjcDsKKyAgICAgICAgKmNwID0gcS0+bmV4dDsKKyAgICAgICAgcS0+ZmRlbGV0ZShxKTsKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHEpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBjcCA9ICYoKmNwKS0+bmV4dDsKKyAgICB9CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgZGVhbGxvYyBkYXRhICVwOiBhZGRyZXNzIG5vdCBpbiBsaXN0XG4iLCBwKSk7CisgIH0KKyAgZWxzZQorICB7IHdoaWxlICgqY3ApCisgICAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9jbGlzdCAqcSA9ICpjcDsKKyAgICAgICpjcCA9IHEtPm5leHQ7CisgICAgICBpZiAocS0+cHRyID09ICh2b2lkKilzb2FwLT5mYXVsdCkKKyAgICAgICAgc29hcC0+ZmF1bHQgPSBOVUxMOyAvKiB0aGlzIHdhcyBkZWFsbG9jYXRlZCAqLworICAgICAgZWxzZSBpZiAocS0+cHRyID09ICh2b2lkKilzb2FwLT5oZWFkZXIpCisgICAgICAgIHNvYXAtPmhlYWRlciA9IE5VTEw7IC8qIHRoaXMgd2FzIGRlYWxsb2NhdGVkICovCisgICAgICBxLT5mZGVsZXRlKHEpOworICAgICAgU09BUF9GUkVFKHNvYXAsIHEpOworICAgIH0KKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorc3RydWN0IHNvYXBfY2xpc3QgKgorU09BUF9GTUFDMgorc29hcF9saW5rKHN0cnVjdCBzb2FwICpzb2FwLCB2b2lkICpwLCBpbnQgdCwgaW50IG4sIHZvaWQgKCpmZGVsZXRlKShzdHJ1Y3Qgc29hcF9jbGlzdCopKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9jbGlzdCAqY3A7CisgIGlmICgoY3AgPSAoc3RydWN0IHNvYXBfY2xpc3QqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9jbGlzdCkpKSkKKyAgeyBjcC0+bmV4dCA9IHNvYXAtPmNsaXN0OworICAgIGNwLT50eXBlID0gdDsKKyAgICBjcC0+c2l6ZSA9IG47IAorICAgIGNwLT5wdHIgPSBwOworICAgIGNwLT5mZGVsZXRlID0gZmRlbGV0ZTsKKyAgICBzb2FwLT5jbGlzdCA9IGNwOworICB9CisgIHJldHVybiBjcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfdW5saW5rKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwKQoreyByZWdpc3RlciBjaGFyICoqcTsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfY2xpc3QgKipjcDsKKyAgaWYgKCFzb2FwIHx8ICFwKQorICAgIHJldHVybjsKKyAgZm9yIChxID0gKGNoYXIqKikmc29hcC0+YWxpc3Q7ICpxOyBxID0gKihjaGFyKioqKXEpCisgIHsgaWYgKHAgPT0gKHZvaWQqKSgqcSAtICooc2l6ZV90KikoKnEgKyBzaXplb2Yodm9pZCopKSkpCisgICAgeyAqcSA9ICoqKGNoYXIqKiopcTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVW5saW5rZWQgZGF0YSAlcFxuIiwgcCkpOworI2lmZGVmIFNPQVBfREVCVUcKKyAgICAgIHNvYXBfdHJhY2tfdW5saW5rKHNvYXAsIHApOworI2VuZGlmCisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIGZvciAoY3AgPSAmc29hcC0+Y2xpc3Q7ICpjcDsgY3AgPSAmKCpjcCktPm5leHQpCisgIHsgaWYgKHAgPT0gKCpjcCktPnB0cikKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVW5saW5rZWQgY2xhc3MgaW5zdGFuY2UgJXBcbiIsIHApKTsKKyAgICAgIHEgPSAoY2hhcioqKSpjcDsKKyAgICAgICpjcCA9ICgqY3ApLT5uZXh0OworICAgICAgU09BUF9GUkVFKHNvYXAsIHEpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9sb29rdXBfdHlwZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgaWYgKGlkICYmICppZCkKKyAgeyBpcCA9IHNvYXBfbG9va3VwKHNvYXAsIGlkKTsKKyAgICBpZiAoaXApCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkxvb2t1cCBpZD0nJXMnIHR5cGU9JWRcbiIsIGlkLCBpcC0+dHlwZSkpOworICAgICAgcmV0dXJuIGlwLT50eXBlOworICAgIH0KKyAgfQorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImxvb2t1cCB0eXBlIGlkPSclcycgTk9UIEZPVU5EISBOZWVkIHRvIGdldCBpdCBmcm9tIHhzaTp0eXBlXG4iLCBpZCkpOworICByZXR1cm4gMDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQqCitTT0FQX0ZNQUMyCitzb2FwX2lkX2xvb2t1cChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIHZvaWQgKipwLCBpbnQgdCwgc2l6ZV90IG4sIHVuc2lnbmVkIGludCBrKQoreyBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIHZvaWQgKipxOworICBpZiAoIXAgfHwgIWlkIHx8ICEqaWQpCisgICAgcmV0dXJuIHA7CisgIGlwID0gc29hcF9sb29rdXAoc29hcCwgaWQpOyAvKiBsb29rdXAgcG9pbnRlciB0byBoYXNoIHRhYmxlIGVudHJ5IGZvciBzdHJpbmcgaWQgKi8KKyAgaWYgKCFpcCkKKyAgeyBpcCA9IHNvYXBfZW50ZXIoc29hcCwgaWQpOyAvKiBuZXcgaGFzaCB0YWJsZSBlbnRyeSBmb3Igc3RyaW5nIGlkICovCisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGb3J3YXJkaW5nIGZpcnN0IGhyZWY9JyVzJyB0eXBlPSVkICVwICgldSBieXRlcylcbiIsIGlkLCB0LCBwLCAodW5zaWduZWQgaW50KW4pKTsKKyAgICBpcC0+dHlwZSA9IHQ7CisgICAgaXAtPnNpemUgPSBuOyAKKyAgICBpcC0+bGluayA9IHA7CisgICAgaXAtPmNvcHkgPSBOVUxMOworICAgIGlwLT5mbGlzdCA9IE5VTEw7CisgICAgaXAtPnB0ciA9IE5VTEw7CisgICAgaXAtPmxldmVsID0gazsKKyAgICAqcCA9IE5VTEw7CisgIH0KKyAgZWxzZSBpZiAoaXAtPnB0cikKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc29sdmVkIGhyZWY9JyVzJyB0eXBlPSVkIGxvY2F0aW9uPSVwICgldSBieXRlcylcbiIsIGlkLCB0LCBpcC0+cHRyLCAodW5zaWduZWQgaW50KW4pKTsKKyAgICBpZiAoaXAtPnR5cGUgIT0gdCkKKyAgICB7IHN0cmNweShzb2FwLT5pZCwgaWQpOworICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0hSRUY7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlR5cGUgaW5jb21wYXRpYmlsaXR5OiBpZCB0eXBlPSVkIGhyZWYgdHlwZT0lZFxuIiwgaXAtPnR5cGUsIHQpKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB3aGlsZSAoaXAtPmxldmVsIDwgaykKKyAgICB7IHEgPSAodm9pZCoqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZih2b2lkKikpOyAgCisgICAgICBpZiAoIXEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgKnAgPSAodm9pZCopcTsKKyAgICAgIHAgPSBxOworICAgICAgay0tOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJEZXNjZW5kaW5nIG9uZSBsZXZlbC4uLlxuIikpOworICAgIH0KKyAgICAqcCA9IGlwLT5wdHI7CisgIH0KKyAgZWxzZSBpZiAoaXAtPmxldmVsID4gaykKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc29sdmluZyBsZXZlbCAldSBwb2ludGVycyB0byBocmVmPSclcydcbiIsIGlwLT5sZXZlbCwgaWQpKTsKKyAgICB3aGlsZSAoaXAtPmxldmVsID4gaykKKyAgICB7IHZvaWQgKnMsICoqciA9ICZpcC0+bGluazsKKyAgICAgIHEgPSAodm9pZCoqKWlwLT5saW5rOworICAgICAgd2hpbGUgKHEpCisgICAgICB7ICpyID0gKHZvaWQqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZih2b2lkKikpOworICAgICAgICBzID0gKnE7CisgICAgICAgICpxID0gKnI7CisgICAgICAgIHIgPSAodm9pZCoqKSpyOworICAgICAgICBxID0gKHZvaWQqKilzOworICAgICAgfQorICAgICAgKnIgPSBOVUxMOworICAgICAgaXAtPnNpemUgPSBuOyAKKyAgICAgIGlwLT5jb3B5ID0gTlVMTDsKKyAgICAgIGlwLT5sZXZlbCA9IGlwLT5sZXZlbCAtIDE7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlc2NlbmRpbmcgb25lIGxldmVsLi4uXG4iKSk7CisgICAgfQorICAgIHEgPSAodm9pZCoqKWlwLT5saW5rOworICAgIGlwLT5saW5rID0gcDsKKyAgICAqcCA9ICh2b2lkKilxOworICB9CisgIGVsc2UKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZvcndhcmRlZCBocmVmPSclcycgdHlwZT0lZCBsb2NhdGlvbj0lcCAoJXUgYnl0ZXMpXG4iLCBpZCwgdCwgcCwgKHVuc2lnbmVkIGludCluKSk7CisgICAgd2hpbGUgKGlwLT5sZXZlbCA8IGspCisgICAgeyBxID0gKHZvaWQqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yodm9pZCopKTsgIAorICAgICAgKnAgPSBxOworICAgICAgcCA9IHE7CisgICAgICBrLS07CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlc2NlbmRpbmcgb25lIGxldmVsLi4uXG4iKSk7CisgICAgfQorICAgIHEgPSAodm9pZCoqKWlwLT5saW5rOworICAgIGlwLT5saW5rID0gcDsKKyAgICAqcCA9ICh2b2lkKilxOworICB9CisgIHJldHVybiBwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZCoKK1NPQVBfRk1BQzIKK3NvYXBfaWRfZm9yd2FyZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaHJlZiwgdm9pZCAqcCwgc2l6ZV90IGxlbiwgaW50IHN0LCBpbnQgdHQsIHNpemVfdCBuLCB1bnNpZ25lZCBpbnQgaywgdm9pZCAoKmZjb3B5KShzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgc2l6ZV90LCBjb25zdCB2b2lkKiwgc2l6ZV90KSkKK3sgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworICBpZiAoIXAgfHwgIWhyZWYgfHwgISpocmVmKQorICAgIHJldHVybiBwOworICBpcCA9IHNvYXBfbG9va3VwKHNvYXAsIGhyZWYpOyAvKiBsb29rdXAgcG9pbnRlciB0byBoYXNoIHRhYmxlIGVudHJ5IGZvciBzdHJpbmcgaWQgKi8KKyAgaWYgKCFpcCkKKyAgeyBpcCA9IHNvYXBfZW50ZXIoc29hcCwgaHJlZik7IC8qIG5ldyBoYXNoIHRhYmxlIGVudHJ5IGZvciBzdHJpbmcgaWQgKi8KKyAgICBpcC0+dHlwZSA9IHN0OworICAgIGlwLT5zaXplID0gbjsKKyAgICBpcC0+bGluayA9IE5VTEw7CisgICAgaXAtPmNvcHkgPSBOVUxMOworICAgIGlwLT5wdHIgPSBOVUxMOworICAgIGlwLT5sZXZlbCA9IDA7CisgICAgaXAtPmZsaXN0ID0gTlVMTDsKKyAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiTmV3IGVudHJ5IGhyZWY9JyVzJyB0eXBlPSVkIHNpemU9JWx1IGxldmVsPSVkIGxvY2F0aW9uPSVwXG4iLCBocmVmLCBzdCwgKHVuc2lnbmVkIGxvbmcpbiwgaywgcCkpOworICB9CisgIGVsc2UgaWYgKGlwLT50eXBlICE9IHN0IHx8IChpcC0+bGV2ZWwgPT0gayAmJiBpcC0+c2l6ZSAhPSBuKSkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlR5cGUgaW5jb21wYXRpYmlsaXR5IGlkPSclcycgZXhwZWN0IHR5cGU9JWQgc2l6ZT0lbHUgbGV2ZWw9JXUgZ290IHR5cGU9JWQgc2l6ZT0lbHVcbiIsIGhyZWYsIGlwLT50eXBlLCAodW5zaWduZWQgbG9uZylpcC0+c2l6ZSwgaywgc3QsICh1bnNpZ25lZCBsb25nKW4pKTsKKyAgICBzdHJjcHkoc29hcC0+aWQsIGhyZWYpOworICAgIHNvYXAtPmVycm9yID0gU09BUF9IUkVGOworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChmY29weSB8fCBuIDwgc2l6ZW9mKHZvaWQqKSB8fCAqaHJlZiAhPSAnIycpCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZmxpc3QgKmZwID0gKHN0cnVjdCBzb2FwX2ZsaXN0KilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfZmxpc3QpKTsKKyAgICBpZiAoIWZwKQorICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmcC0+bmV4dCA9IGlwLT5mbGlzdDsKKyAgICBmcC0+dHlwZSA9IHR0OworICAgIGZwLT5wdHIgPSBwOworICAgIGZwLT5sZXZlbCA9IGs7CisgICAgZnAtPmxlbiA9IGxlbjsKKyAgICBpZiAoZmNvcHkpCisgICAgICBmcC0+ZmNvcHkgPSBmY29weTsKKyAgICBlbHNlCisgICAgICBmcC0+ZmNvcHkgPSBzb2FwX2Zjb3B5OworICAgIGlwLT5mbGlzdCA9IGZwOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRm9yd2FyZGluZyB0eXBlPSVkICh0YXJnZXQgdHlwZT0lZCkgc2l6ZT0lbHUgbG9jYXRpb249JXAgbGV2ZWw9JXUgbGVuPSVsdSBocmVmPSclcydcbiIsIHN0LCB0dCwgKHVuc2lnbmVkIGxvbmcpbiwgcCwgaywgKHVuc2lnbmVkIGxvbmcpbGVuLCBocmVmKSk7CisgIH0KKyAgZWxzZQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRm9yd2FyZGluZyBjb3B5aW5nIGFkZHJlc3MgJXAgZm9yIHR5cGU9JWQgaHJlZj0nJXMnXG4iLCBwLCBzdCwgaHJlZikpOworICAgICoodm9pZCoqKXAgPSBpcC0+Y29weTsKKyAgICBpcC0+Y29weSA9IHA7CisgIH0KKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQqCitTT0FQX0ZNQUMyCitzb2FwX2lkX2VudGVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgdm9pZCAqcCwgaW50IHQsIHNpemVfdCBuLCB1bnNpZ25lZCBpbnQgaywgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqYXJyYXlUeXBlLCB2b2lkICooKmZpbnN0YW50aWF0ZSkoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90KikpCit7CisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisjZW5kaWYKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVudGVyIGlkPSclcycgdHlwZT0lZCBsb2M9JXAgc2l6ZT0lbHUgbGV2ZWw9JXVcbiIsIGlkLCB0LCBwLCAodW5zaWduZWQgbG9uZyluLCBrKSk7CisgIHNvYXAtPmFsbG9jZWQgPSAwOworICBpZiAoIXApCisgIHsgaWYgKGZpbnN0YW50aWF0ZSkKKyAgICAgIHAgPSBmaW5zdGFudGlhdGUoc29hcCwgdCwgdHlwZSwgYXJyYXlUeXBlLCAmbik7CisgICAgZWxzZQorICAgICAgcCA9IHNvYXBfbWFsbG9jKHNvYXAsIG4pOworICAgIGlmIChwKQorICAgICAgc29hcC0+YWxsb2NlZCA9IDE7CisgIH0KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgIGlmICghaWQgfHwgISppZCkKKyNlbmRpZgorICAgIHJldHVybiBwOworI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgaXAgPSBzb2FwX2xvb2t1cChzb2FwLCBpZCk7IC8qIGxvb2t1cCBwb2ludGVyIHRvIGhhc2ggdGFibGUgZW50cnkgZm9yIHN0cmluZyBpZCAqLworICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiTG9va3VwIGVudHJ5IGlkPSclcyBmb3IgbG9jYXRpb249JXAnXG4iLCBpZCwgcCkpOworICBpZiAoIWlwKQorICB7IGlwID0gc29hcF9lbnRlcihzb2FwLCBpZCk7IC8qIG5ldyBoYXNoIHRhYmxlIGVudHJ5IGZvciBzdHJpbmcgaWQgKi8KKyAgICBpcC0+dHlwZSA9IHQ7CisgICAgaXAtPmxpbmsgPSBOVUxMOworICAgIGlwLT5jb3B5ID0gTlVMTDsKKyAgICBpcC0+Zmxpc3QgPSBOVUxMOworICAgIGlwLT5zaXplID0gbjsKKyAgICBpcC0+cHRyID0gcDsKKyAgICBpcC0+bGV2ZWwgPSBrOworICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJOZXcgZW50cnkgaWQ9JyVzJyB0eXBlPSVkIHNpemU9JWx1IGxldmVsPSV1IGxvY2F0aW9uPSVwXG4iLCBpZCwgdCwgKHVuc2lnbmVkIGxvbmcpbiwgaywgcCkpOworICB9CisgIGVsc2UgaWYgKChpcC0+dHlwZSAhPSB0IHx8IChpcC0+bGV2ZWwgPT0gayAmJiBpcC0+c2l6ZSAhPSBuKSkgJiYgKGlwLT5jb3B5IHx8IGlwLT5mbGlzdCkpCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJUeXBlIGluY29tcGF0aWJpbGl0eSBpZD0nJXMnIGV4cGVjdCB0eXBlPSVkIHNpemU9JWx1IGxldmVsPSV1IGdvdCB0eXBlPSVkIHNpemU9JWx1XG4iLCBpZCwgaXAtPnR5cGUsICh1bnNpZ25lZCBsb25nKWlwLT5zaXplLCBrLCB0LCAodW5zaWduZWQgbG9uZyluKSk7CisgICAgc3RyY3B5KHNvYXAtPmlkLCBpZCk7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0hSRUY7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZWxzZSBpZiAoaXAtPnB0cikKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk11bHRpcGx5IGRlZmluZWQgaWQ9JyVzJ1xuIiwgaWQpKTsKKyAgICBzdHJjcHkoc29hcC0+aWQsIGlkKTsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfRFVQTElDQVRFX0lEOworICAgIHJldHVybiBOVUxMOworICB9CisgIGVsc2UgCisgIHsgaXAtPnNpemUgPSBuOworICAgIGlwLT5wdHIgPSBwOworICAgIGlwLT5sZXZlbCA9IGs7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVcGRhdGUgZW50cnkgaWQ9JyVzJyB0eXBlPSVkIGxvY2F0aW9uPSVwIHNpemU9JWx1IGxldmVsPSV1XG4iLCBpZCwgdCwgcCwgKHVuc2lnbmVkIGxvbmcpbiwgaykpOworICB9CisgIHJldHVybiBpcC0+cHRyOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2Zjb3B5KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3QsIGludCB0dCwgdm9pZCAqcCwgc2l6ZV90IGxlbiwgY29uc3Qgdm9pZCAqcSwgc2l6ZV90IG4pCit7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5aW5nIGRhdGEgdHlwZT0lZCAodGFyZ2V0IHR5cGU9JWQpICVwIC0+ICVwICglbHUgYnl0ZXMpXG4iLCBzdCwgdHQsIHEsIHAsICh1bnNpZ25lZCBsb25nKW4pKTsKKyAgbWVtY3B5KHAsIHEsIG4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VuZF9zZW5kKHN0cnVjdCBzb2FwICpzb2FwKQoreyAKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPmRpbWUubGlzdCkKKyAgeyAvKiBTT0FQIGJvZHkgcmVmZXJlbmNlZCBhdHRhY2htZW50cyBtdXN0IGFwcGVhciBmaXJzdCAqLworICAgIHNvYXAtPmRpbWUubGFzdC0+bmV4dCA9IHNvYXAtPmRpbWUuZmlyc3Q7CisgICAgc29hcC0+ZGltZS5maXJzdCA9IHNvYXAtPmRpbWUubGlzdC0+bmV4dDsKKyAgICBzb2FwLT5kaW1lLmxpc3QtPm5leHQgPSBOVUxMOworICAgIHNvYXAtPmRpbWUubGFzdCA9IHNvYXAtPmRpbWUubGlzdDsKKyAgfQorICBpZiAoc29hcF9wdXRkaW1lKHNvYXApIHx8IHNvYXBfcHV0bWltZShzb2FwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHNvYXAtPm1pbWUubGlzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmxhc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmxpc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5sYXN0ID0gTlVMTDsKKyNlbmRpZgorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBzZW5kXG4iKSk7CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JTykgLyogbmVlZCB0byBmbHVzaCB0aGUgcmVtYWluaW5nIGRhdGEgaW4gYnVmZmVyICovCisgIHsgaWYgKHNvYXBfZmx1c2goc29hcCkpCisjaWZkZWYgV0lUSF9aTElCCisgICAgeyBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIgJiYgc29hcC0+emxpYl9zdGF0ZSA9PSBTT0FQX1pMSUJfREVGTEFURSkKKyAgICAgIHsgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9OT05FOworICAgICAgICBkZWZsYXRlRW5kKCZzb2FwLT5kX3N0cmVhbSk7CisgICAgICB9CisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorI2Vsc2UKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNlbmRpZgorI2lmZGVmIFdJVEhfWkxJQgorICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQikKKyAgICB7IGludCByOworICAgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4gPSAwOworICAgICAgZG8KKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJEZWZsYXRpbmcgcmVtYWluZGVyXG4iKSk7CisgICAgICAgIHIgPSBkZWZsYXRlKCZzb2FwLT5kX3N0cmVhbSwgWl9GSU5JU0gpOworICAgICAgICBpZiAoc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0ICE9IFNPQVBfQlVGTEVOKQorICAgICAgICB7IGlmIChzb2FwX2ZsdXNoX3Jhdyhzb2FwLCBzb2FwLT56X2J1ZiwgU09BUF9CVUZMRU4gLSBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQpKQorICAgICAgICAgIHsgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9OT05FOworICAgICAgICAgICAgZGVmbGF0ZUVuZCgmc29hcC0+ZF9zdHJlYW0pOworICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworCSAgfQorICAgICAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gKEJ5dGUqKXNvYXAtPnpfYnVmOworICAgICAgICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCA9IFNPQVBfQlVGTEVOOworICAgICAgICB9CisgICAgICB9IHdoaWxlIChyID09IFpfT0spOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJEZWZsYXRlZCAlbHUtPiVsdSBieXRlc1xuIiwgc29hcC0+ZF9zdHJlYW0udG90YWxfaW4sIHNvYXAtPmRfc3RyZWFtLnRvdGFsX291dCkpOworICAgICAgc29hcC0+el9yYXRpb19vdXQgPSAoZmxvYXQpc29hcC0+ZF9zdHJlYW0udG90YWxfb3V0IC8gKGZsb2F0KXNvYXAtPmRfc3RyZWFtLnRvdGFsX2luOworICAgICAgc29hcC0+bW9kZSAmPSB+U09BUF9FTkNfWkxJQjsKKyAgICAgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfTk9ORTsKKyAgICAgIGlmIChkZWZsYXRlRW5kKCZzb2FwLT5kX3N0cmVhbSkgIT0gWl9PSyB8fCByICE9IFpfU1RSRUFNX0VORCkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVbmFibGUgdG8gZW5kIGRlZmxhdGU6ICVzXG4iLCBzb2FwLT5kX3N0cmVhbS5tc2c/c29hcC0+ZF9zdHJlYW0ubXNnOiIiKSk7CisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICAgIH0KKyNpZmRlZiBXSVRIX0daSVAKKyAgICAgIHNvYXAtPnpfYnVmWzBdID0gc29hcC0+el9jcmMgJiAweEZGOworICAgICAgc29hcC0+el9idWZbMV0gPSAoc29hcC0+el9jcmMgPj4gOCkgJiAweEZGOworICAgICAgc29hcC0+el9idWZbMl0gPSAoc29hcC0+el9jcmMgPj4gMTYpICYgMHhGRjsKKyAgICAgIHNvYXAtPnpfYnVmWzNdID0gKHNvYXAtPnpfY3JjID4+IDI0KSAmIDB4RkY7CisgICAgICBzb2FwLT56X2J1Zls0XSA9IHNvYXAtPmRfc3RyZWFtLnRvdGFsX2luICYgMHhGRjsKKyAgICAgIHNvYXAtPnpfYnVmWzVdID0gKHNvYXAtPmRfc3RyZWFtLnRvdGFsX2luID4+IDgpICYgMHhGRjsKKyAgICAgIHNvYXAtPnpfYnVmWzZdID0gKHNvYXAtPmRfc3RyZWFtLnRvdGFsX2luID4+IDE2KSAmIDB4RkY7CisgICAgICBzb2FwLT56X2J1Zls3XSA9IChzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiA+PiAyNCkgJiAweEZGOworICAgICAgaWYgKHNvYXBfZmx1c2hfcmF3KHNvYXAsIHNvYXAtPnpfYnVmLCA4KSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJnemlwIGNyYzMyPSVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpc29hcC0+el9jcmMpKTsKKyNlbmRpZgorICAgIH0KKyNlbmRpZgorICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fU1RPUkUpCisgICAgeyBjaGFyICpwOworI2lmbmRlZiBXSVRIX05PSFRUUAorICAgICAgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1hNTCkpCisgICAgICB7IHNvYXAtPm1vZGUtLTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTZW5kaW5nIGJ1ZmZlcmVkIG1lc3NhZ2Ugb2YgbGVuZ3RoICV1XG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmJsaXN0LT5zaXplKSk7CisgICAgICAgIGlmIChzb2FwLT5zdGF0dXMgPj0gU09BUF9QT1NUKQorICAgICAgICAgIHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3Qoc29hcCwgc29hcC0+ZW5kcG9pbnQsIHNvYXAtPmhvc3QsIHNvYXAtPnBvcnQsIHNvYXAtPnBhdGgsIHNvYXAtPmFjdGlvbiwgc29hcC0+Ymxpc3QtPnNpemUpOworICAgICAgICBlbHNlIGlmIChzb2FwLT5zdGF0dXMgIT0gU09BUF9TVE9QKQorICAgICAgICAgIHNvYXAtPmVycm9yID0gc29hcC0+ZnJlc3BvbnNlKHNvYXAsIHNvYXAtPnN0YXR1cywgc29hcC0+Ymxpc3QtPnNpemUpOworICAgICAgICBpZiAoc29hcC0+ZXJyb3IgfHwgc29hcF9mbHVzaChzb2FwKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHNvYXAtPm1vZGUrKzsKKyAgICAgIH0KKyNlbmRpZgorICAgICAgZm9yIChwID0gc29hcF9maXJzdF9ibG9jayhzb2FwKTsgcDsgcCA9IHNvYXBfbmV4dF9ibG9jayhzb2FwKSkKKyAgICAgIHsgREJHTVNHKFNFTlQsIHAsIHNvYXBfYmxvY2tfc2l6ZShzb2FwKSk7CisgICAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mc2VuZChzb2FwLCBwLCBzb2FwX2Jsb2NrX3NpemUoc29hcCkpKSkKKyAgICAgICAgeyBzb2FwX2VuZF9ibG9jayhzb2FwKTsKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHNvYXBfZW5kX2Jsb2NrKHNvYXApOworICAgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgICBlbHNlIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgICAgeyBEQkdNU0coU0VOVCwgIlxyXG4wXHJcblxyXG4iLCA3KTsKKyAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mc2VuZChzb2FwLCAiXHJcbjBcclxuXHJcbiIsIDcpKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyNlbmRpZgorICB9CisjaWZkZWYgV0lUSF9UQ1BGSU4KKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgaWYgKCFzb2FwLT5zc2wgJiYgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSAmJiAhc29hcC0+a2VlcF9hbGl2ZSAmJiAhKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIHNvYXAtPmZzaHV0ZG93bnNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAxKTsgLyogU2VuZCBUQ1AgRklOICovCisjZWxzZQorICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSAmJiAhc29hcC0+a2VlcF9hbGl2ZSAmJiAhKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIHNvYXAtPmZzaHV0ZG93bnNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAxKTsgLyogU2VuZCBUQ1AgRklOICovCisjZW5kaWYKKyNlbmRpZgorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBvZiBzZW5kIHBoYXNlXG4iKSk7CisgIHNvYXAtPm9tb2RlICY9IH5TT0FQX1hNTF9TRUM7CisgIHNvYXAtPmNvdW50ID0gMDsKKyAgc29hcC0+cGFydCA9IFNPQVBfRU5EOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbmRfcmVjdihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+cGFydCA9IFNPQVBfRU5EOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSAmJiBzb2FwX2dldGRpbWUoc29hcCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBzb2FwLT5kaW1lLmxpc3QgPSBzb2FwLT5kaW1lLmZpcnN0OworICBzb2FwLT5kaW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5sYXN0ID0gTlVMTDsKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkgJiYgc29hcF9nZXRtaW1lKHNvYXApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgc29hcC0+bWltZS5saXN0ID0gc29hcC0+bWltZS5maXJzdDsKKyAgc29hcC0+bWltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuYm91bmRhcnkgPSBOVUxMOworI2VuZGlmCisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgb2YgcmVjZWl2ZSBtZXNzYWdlIG9rXG4iKSk7CisjaWZkZWYgV0lUSF9aTElCCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQikKKyAgeyBzb2FwLT5tb2RlICY9IH5TT0FQX0VOQ19aTElCOworICAgIG1lbWNweShzb2FwLT5idWYsIHNvYXAtPnpfYnVmLCBTT0FQX0JVRkxFTik7CisgICAgc29hcC0+YnVmaWR4ID0gKGNoYXIqKXNvYXAtPmRfc3RyZWFtLm5leHRfaW4gLSBzb2FwLT56X2J1ZjsKKyAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT56X2J1ZmxlbjsKKyAgICBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX05PTkU7CisgICAgaWYgKGluZmxhdGVFbmQoJnNvYXAtPmRfc3RyZWFtKSAhPSBaX09LKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworI2lmZGVmIFdJVEhfR1pJUAorICAgIGlmIChzb2FwLT56bGliX2luID09IFNPQVBfWkxJQl9HWklQKQorICAgIHsgc29hcF93Y2hhciBjOworICAgICAgc2hvcnQgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICB7IGlmICgoaW50KShjID0gc29hcF9nZXRjaGFyKHNvYXApKSA9PSBFT0YpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgICAgIHNvYXAtPnpfYnVmW2ldID0gKGNoYXIpYzsKKyAgICAgIH0KKyAgICAgIGlmIChzb2FwLT56X2NyYyAhPSAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzBdIHwgKCh1TG9uZykodW5zaWduZWQgY2hhcilzb2FwLT56X2J1ZlsxXSA8PCA4KSB8ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbMl0gPDwgMTYpIHwgKCh1TG9uZykodW5zaWduZWQgY2hhcilzb2FwLT56X2J1ZlszXSA8PCAyNCkpKQorICAgICAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiR3ppcCBlcnJvcjogY3JjIGNoZWNrIGZhaWxlZCwgbWVzc2FnZSBjb3JydXB0ZWQ/IChjcmMzMj0lbHUpXG4iLCAodW5zaWduZWQgbG9uZylzb2FwLT56X2NyYykpOworICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgICB9CisgICAgICBpZiAoc29hcC0+ZF9zdHJlYW0udG90YWxfb3V0ICE9ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbNF0gfCAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzVdIDw8IDgpIHwgKCh1TG9uZykodW5zaWduZWQgY2hhcilzb2FwLT56X2J1Zls2XSA8PCAxNikgfCAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzddIDw8IDI0KSkpCisgICAgICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJHemlwIGVycm9yOiBpbmNvcnJlY3QgbWVzc2FnZSBsZW5ndGhcbiIpKTsKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgfQorICAgIH0KKyNlbmRpZgorICB9CisjZW5kaWYKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgICB3aGlsZSAoKGludClzb2FwX2dldGNoYXIoc29hcCkgIT0gRU9GKSAvKiBhZHZhbmNlIHRvIGxhc3QgY2h1bmsgKi8KKyAgICAgIDsKKyAgaWYgKHNvYXAtPmZkaXNjb25uZWN0ICYmIChzb2FwLT5lcnJvciA9IHNvYXAtPmZkaXNjb25uZWN0KHNvYXApKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICByZXR1cm4gc29hcF9yZXNvbHZlKHNvYXApOworI2Vsc2UKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPnhsaXN0KQorICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTUlNRV9IUkVGOworICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRElNRV9IUkVGOworICB9CisjZW5kaWYKKyAgcmV0dXJuIFNPQVBfT0s7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZnJlZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc3RydWN0IE5hbWVzcGFjZSAqbnM7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZSBuYW1lc3BhY2Ugc3RhY2tcbiIpKTsKKyAgd2hpbGUgKHNvYXAtPm5saXN0KQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucCA9IHNvYXAtPm5saXN0LT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5ubGlzdCk7CisgICAgc29hcC0+bmxpc3QgPSBucDsKKyAgfQorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWUgYW55IHJlbWFpbmluZyB0ZW1wIGJsb2Nrc1xuIikpOworICB3aGlsZSAoc29hcC0+Ymxpc3QpCisgICAgc29hcF9lbmRfYmxvY2soc29hcCk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZSBhdHRyaWJ1dGUgc3RvcmFnZVxuIikpOworICB3aGlsZSAoc29hcC0+YXR0cmlidXRlcykKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKnRwID0gc29hcC0+YXR0cmlidXRlcy0+bmV4dDsKKyAgICBpZiAoc29hcC0+YXR0cmlidXRlcy0+dmFsdWUpCisgICAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+YXR0cmlidXRlcy0+dmFsdWUpOworICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5hdHRyaWJ1dGVzKTsKKyAgICBzb2FwLT5hdHRyaWJ1dGVzID0gdHA7CisgIH0KKyNpZmRlZiBXSVRIX0ZBU1QKKyAgaWYgKHNvYXAtPmxhYmJ1ZikKKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+bGFiYnVmKTsKKyAgc29hcC0+bGFiYnVmID0gTlVMTDsKKyAgc29hcC0+bGFibGVuID0gMDsKKyAgc29hcC0+bGFiaWR4ID0gMDsKKyNlbmRpZgorICBucyA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXM7CisgIGlmIChucykKKyAgeyBmb3IgKDsgbnMtPmlkOyBucysrKQorICAgIHsgaWYgKG5zLT5vdXQpCisgICAgICB7IGlmIChzb2FwLT5lbmNvZGluZ1N0eWxlID09IG5zLT5vdXQpCisgICAgICAgICAgc29hcC0+ZW5jb2RpbmdTdHlsZSA9IFNPQVBfU1RSX0VPUzsKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIG5zLT5vdXQpOworICAgICAgICBucy0+b3V0ID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGlmIChzb2FwLT5lbmNvZGluZ1N0eWxlID09IG5zLT5ucykKKyAgICAgICAgc29hcC0+ZW5jb2RpbmdTdHlsZSA9IFNPQVBfU1RSX0VPUzsKKyAgICB9CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPmxvY2FsX25hbWVzcGFjZXMpOworICAgIHNvYXAtPmxvY2FsX25hbWVzcGFjZXMgPSBOVUxMOworICB9CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHdoaWxlIChzb2FwLT54bGlzdCkKKyAgeyBzdHJ1Y3Qgc29hcF94bGlzdCAqeHAgPSBzb2FwLT54bGlzdC0+bmV4dDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+eGxpc3QpOworICAgIHNvYXAtPnhsaXN0ID0geHA7CisgIH0KKyNlbmRpZgorI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgc29hcF9mcmVlX3BodChzb2FwKTsKKyAgc29hcF9mcmVlX2lodChzb2FwKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworc3RhdGljIHZvaWQKK3NvYXBfaW5pdF9sb2dzKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfTUFYTE9HUzsgaSsrKQorICB7IHNvYXAtPmxvZ2ZpbGVbaV0gPSBOVUxMOworICAgIHNvYXAtPmZkZWJ1Z1tpXSA9IE5VTEw7CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmICFkZWZpbmVkKFdJVEhfTEVBTikgfHwgZGVmaW5lZChTT0FQX0RFQlVHKQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9vcGVuX2xvZ2ZpbGUoc3RydWN0IHNvYXAgKnNvYXAsIGludCBpKQoreyBpZiAoc29hcC0+bG9nZmlsZVtpXSkKKyAgICBzb2FwLT5mZGVidWdbaV0gPSBmb3Blbihzb2FwLT5sb2dmaWxlW2ldLCBpIDwgMiA/ICJhYiIgOiAiYSIpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworc3RhdGljIHZvaWQKK3NvYXBfY2xvc2VfbG9nZmlsZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGkpCit7IGlmIChzb2FwLT5mZGVidWdbaV0pCisgIHsgZmNsb3NlKHNvYXAtPmZkZWJ1Z1tpXSk7CisgICAgc29hcC0+ZmRlYnVnW2ldID0gTlVMTDsKKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9jbG9zZV9sb2dmaWxlcyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX01BWExPR1M7IGkrKykKKyAgICBzb2FwX2Nsb3NlX2xvZ2ZpbGUoc29hcCwgaSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitzdGF0aWMgdm9pZAorc29hcF9zZXRfbG9nZmlsZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGksIGNvbnN0IGNoYXIgKmxvZ2ZpbGUpCit7IGNoYXIgKnMgPSBOVUxMOworICBzb2FwX2Nsb3NlX2xvZ2ZpbGUoc29hcCwgaSk7CisgIGlmIChzb2FwLT5sb2dmaWxlW2ldKQorICAgIFNPQVBfRlJFRShzb2FwLCAodm9pZCopc29hcC0+bG9nZmlsZVtpXSk7CisgIGlmIChsb2dmaWxlKQorICAgIGlmICgocyA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4obG9nZmlsZSkgKyAxKSkpCisgICAgICBzdHJjcHkocywgbG9nZmlsZSk7CisgIHNvYXAtPmxvZ2ZpbGVbaV0gPSBzOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfcmVjdl9sb2dmaWxlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpsb2dmaWxlKQoreyBzb2FwX3NldF9sb2dmaWxlKHNvYXAsIFNPQVBfSU5ERVhfUkVDViwgbG9nZmlsZSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9zZW50X2xvZ2ZpbGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmxvZ2ZpbGUpCit7IHNvYXBfc2V0X2xvZ2ZpbGUoc29hcCwgU09BUF9JTkRFWF9TRU5ULCBsb2dmaWxlKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X3Rlc3RfbG9nZmlsZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbG9nZmlsZSkKK3sgc29hcF9zZXRfbG9nZmlsZShzb2FwLCBTT0FQX0lOREVYX1RFU1QsIGxvZ2ZpbGUpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc3RydWN0IHNvYXAqCitTT0FQX0ZNQUMyCitzb2FwX2NvcHkoc3RydWN0IHNvYXAgKnNvYXApCit7IHJldHVybiBzb2FwX2NvcHlfY29udGV4dCgoc3RydWN0IHNvYXAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHNvYXApKSwgc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcCoKK1NPQVBfRk1BQzIKK3NvYXBfY29weV9jb250ZXh0KHN0cnVjdCBzb2FwICpjb3B5LCBzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXBfY2hlY2tfc3RhdGUoc29hcCkpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmIChjb3B5KQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BsdWdpbiAqcDsKKyAgICBtZW1jcHkoY29weSwgc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwKSk7CisgICAgY29weS0+c3RhdGUgPSBTT0FQX0NPUFk7CisgICAgY29weS0+dXNlciA9IE5VTEw7CisgICAgY29weS0+ZXJyb3IgPSBTT0FQX09LOworICAgIGNvcHktPnVzZXJpZCA9IE5VTEw7CisgICAgY29weS0+cGFzc3dkID0gTlVMTDsKKyAgICBjb3B5LT5ubGlzdCA9IE5VTEw7CisgICAgY29weS0+Ymxpc3QgPSBOVUxMOworICAgIGNvcHktPmNsaXN0ID0gTlVMTDsKKyAgICBjb3B5LT5hbGlzdCA9IE5VTEw7CisgICAgY29weS0+YXR0cmlidXRlcyA9IE5VTEw7CisjaWZkZWYgV0lUSF9GQVNUCisgICAgY29weS0+bGFiYnVmID0gTlVMTDsKKyAgICBjb3B5LT5sYWJsZW4gPSAwOworICAgIGNvcHktPmxhYmlkeCA9IDA7CisjZW5kaWYKKyNpZmRlZiBTT0FQX0RFQlVHCisgICAgc29hcF9pbml0X21odChjb3B5KTsKKyNlbmRpZgorICAgIGNvcHktPmxvY2FsX25hbWVzcGFjZXMgPSBOVUxMOworI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgICBzb2FwX2luaXRfaWh0KGNvcHkpOworICAgIHNvYXBfaW5pdF9waHQoY29weSk7CisjZW5kaWYKKyAgICBjb3B5LT5oZWFkZXIgPSBOVUxMOworICAgIGNvcHktPmZhdWx0ID0gTlVMTDsKKyAgICBjb3B5LT5hY3Rpb24gPSBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyNpZmRlZiBXSVRIX0NPT0tJRVMKKyAgICBjb3B5LT5jb29raWVzID0gc29hcF9jb3B5X2Nvb2tpZXMoY29weSk7CisjZWxzZQorICAgIGNvcHktPmNvb2tpZXMgPSBOVUxMOworI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBTT0FQX0RFQlVHCisgICAgc29hcF9pbml0X2xvZ3MoY29weSk7CisgICAgc29hcF9zZXRfcmVjdl9sb2dmaWxlKGNvcHksIHNvYXAtPmxvZ2ZpbGVbU09BUF9JTkRFWF9SRUNWXSk7CisgICAgc29hcF9zZXRfc2VudF9sb2dmaWxlKGNvcHksIHNvYXAtPmxvZ2ZpbGVbU09BUF9JTkRFWF9TRU5UXSk7CisgICAgc29hcF9zZXRfdGVzdF9sb2dmaWxlKGNvcHksIHNvYXAtPmxvZ2ZpbGVbU09BUF9JTkRFWF9URVNUXSk7CisjZW5kaWYKKyAgICBjb3B5LT5wbHVnaW5zID0gTlVMTDsKKyAgICBmb3IgKHAgPSBzb2FwLT5wbHVnaW5zOyBwOyBwID0gcC0+bmV4dCkKKyAgICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BsdWdpbiAqcSA9IChzdHJ1Y3Qgc29hcF9wbHVnaW4qKVNPQVBfTUFMTE9DKGNvcHksIHNpemVvZihzdHJ1Y3Qgc29hcF9wbHVnaW4pKTsKKyAgICAgIGlmICghcSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHlpbmcgcGx1Z2luICclcydcbiIsIHAtPmlkKSk7CisgICAgICAqcSA9ICpwOworICAgICAgaWYgKHAtPmZjb3B5ICYmIChzb2FwLT5lcnJvciA9IHAtPmZjb3B5KGNvcHksIHEsIHApKSkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgY29weSBwbHVnaW4gJyVzJ1xuIiwgcC0+aWQpKTsKKyAgICAgICAgU09BUF9GUkVFKGNvcHksIHEpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIHEtPm5leHQgPSBjb3B5LT5wbHVnaW5zOworICAgICAgY29weS0+cGx1Z2lucyA9IHE7CisgICAgfQorICB9CisgIGVsc2UKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICByZXR1cm4gY29weTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfaW5pdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+c3RhdGUgPSBTT0FQX0lOSVQ7CisgIHNvYXAtPnZlcnNpb24gPSAwOworICBzb2FwX2ltb2RlKHNvYXAsIFNPQVBfSU9fREVGQVVMVCk7CisgIHNvYXBfb21vZGUoc29hcCwgU09BUF9JT19ERUZBVUxUKTsKKyAgc29hcC0+cGx1Z2lucyA9IE5VTEw7CisgIHNvYXAtPnVzZXIgPSBOVUxMOworICBzb2FwLT51c2VyaWQgPSBOVUxMOworICBzb2FwLT5wYXNzd2QgPSBOVUxMOworI2lmbmRlZiBXSVRIX05PSFRUUAorICBzb2FwLT5mcG9zdCA9IGh0dHBfcG9zdDsKKyAgc29hcC0+ZmdldCA9IGh0dHBfZ2V0OworICBzb2FwLT5mZm9ybSA9IE5VTEw7CisgIHNvYXAtPmZwb3N0aGRyID0gaHR0cF9wb3N0X2hlYWRlcjsKKyAgc29hcC0+ZnJlc3BvbnNlID0gaHR0cF9yZXNwb25zZTsKKyAgc29hcC0+ZnBhcnNlID0gaHR0cF9wYXJzZTsKKyAgc29hcC0+ZnBhcnNlaGRyID0gaHR0cF9wYXJzZV9oZWFkZXI7CisjZW5kaWYKKyAgc29hcC0+ZmNvbm5lY3QgPSBOVUxMOworICBzb2FwLT5mZGlzY29ubmVjdCA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0lQVjYKKyAgc29hcC0+ZnJlc29sdmUgPSB0Y3BfZ2V0aG9zdDsKKyNlbHNlCisgIHNvYXAtPmZyZXNvbHZlID0gTlVMTDsKKyNlbmRpZgorICBzb2FwLT5mYWNjZXB0ID0gdGNwX2FjY2VwdDsKKyAgc29hcC0+Zm9wZW4gPSB0Y3BfY29ubmVjdDsKKyAgc29hcC0+ZmNsb3NlID0gdGNwX2Rpc2Nvbm5lY3Q7CisgIHNvYXAtPmZjbG9zZXNvY2tldCA9IHRjcF9jbG9zZXNvY2tldDsKKyAgc29hcC0+ZnNodXRkb3duc29ja2V0ID0gdGNwX3NodXRkb3duc29ja2V0OworICBzb2FwLT5mc2VuZCA9IGZzZW5kOworICBzb2FwLT5mcmVjdiA9IGZyZWN2OworICBzb2FwLT5mcG9sbCA9IHNvYXBfcG9sbDsKKyNlbHNlCisgIHNvYXAtPmZvcGVuID0gTlVMTDsKKyAgc29hcC0+ZmNsb3NlID0gTlVMTDsKKyAgc29hcC0+ZnBvbGwgPSBOVUxMOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXAtPmZwcmVwYXJlaW5pdCA9IE5VTEw7CisgIHNvYXAtPmZwcmVwYXJlc2VuZCA9IE5VTEw7CisgIHNvYXAtPmZwcmVwYXJlcmVjdiA9IE5VTEw7CisgIHNvYXAtPmZwcmVwYXJlZmluYWwgPSBOVUxMOworI2VuZGlmCisgIHNvYXAtPmZzZXRlcnJvciA9IE5VTEw7CisgIHNvYXAtPmZpZ25vcmUgPSBOVUxMOworICBzb2FwLT5mc2VydmVsb29wID0gTlVMTDsKKyAgc29hcC0+ZnBsdWdpbiA9IGZwbHVnaW47CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXAtPmZkaW1lcmVhZG9wZW4gPSBOVUxMOworICBzb2FwLT5mZGltZXdyaXRlb3BlbiA9IE5VTEw7CisgIHNvYXAtPmZkaW1lcmVhZGNsb3NlID0gTlVMTDsKKyAgc29hcC0+ZmRpbWV3cml0ZWNsb3NlID0gTlVMTDsKKyAgc29hcC0+ZmRpbWVyZWFkID0gTlVMTDsKKyAgc29hcC0+ZmRpbWV3cml0ZSA9IE5VTEw7CisjZW5kaWYKKyAgc29hcC0+ZmxvYXRfZm9ybWF0ID0gIiUuOGciOyAvKiAuOCBwcmVzZXJ2ZXMgc2luZ2xlIEZQIHByZWNpc2lvbiBhcyBtdWNoIGFzIHBvc3NpYmxlLCBidXQgbWlnaHQgbm90IGJlIHZlcnkgZWZmaWNpZW50ICovCisgIHNvYXAtPmRvdWJsZV9mb3JtYXQgPSAiJS4xN2xnIjsgLyogLjE3IHByZXNlcnZlcyBkb3VibGUgRlAgcHJlY2lzaW9uIGFzIG11Y2ggYXMgcG9zc2libGUsIGJ1dCBtaWdodCBub3QgYmUgdmVyeSBlZmZpY2llbnQgKi8KKyAgc29hcC0+ZGltZV9pZF9mb3JtYXQgPSAiY2lkOmlkJWQiOyAvKiBkZWZhdWx0IERJTUUgaWQgZm9ybWF0ICovCisgIHNvYXAtPmh0dHBfdmVyc2lvbiA9ICIxLjEiOworICBzb2FwLT5hY3RvciA9IE5VTEw7CisgIHNvYXAtPm1heF9rZWVwX2FsaXZlID0gU09BUF9NQVhLRUVQQUxJVkU7CisgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOworICBzb2FwLT5yZWN2X3RpbWVvdXQgPSAwOworICBzb2FwLT5zZW5kX3RpbWVvdXQgPSAwOworICBzb2FwLT5jb25uZWN0X3RpbWVvdXQgPSAwOworICBzb2FwLT5hY2NlcHRfdGltZW91dCA9IDA7CisgIHNvYXAtPnNvY2tldF9mbGFncyA9IDA7CisgIHNvYXAtPmNvbm5lY3RfZmxhZ3MgPSAwOworICBzb2FwLT5iaW5kX2ZsYWdzID0gMDsKKyAgc29hcC0+YWNjZXB0X2ZsYWdzID0gMDsKKyAgc29hcC0+aXAgPSAwOworI2lmZGVmIFdJVEhfRkFTVAorICBzb2FwLT5sYWJidWYgPSBOVUxMOworICBzb2FwLT5sYWJsZW4gPSAwOworICBzb2FwLT5sYWJpZHggPSAwOworI2VuZGlmCisgIHNvYXAtPmVuY29kaW5nU3R5bGUgPSBTT0FQX1NUUl9FT1M7CisjaWZuZGVmIFdJVEhfTk9OQU1FU1BBQ0VTCisgIHNvYXAtPm5hbWVzcGFjZXMgPSBuYW1lc3BhY2VzOworI2Vsc2UKKyAgc29hcC0+bmFtZXNwYWNlcyA9IE5VTEw7CisjZW5kaWYKKyAgc29hcC0+bG9jYWxfbmFtZXNwYWNlcyA9IE5VTEw7CisgIHNvYXAtPm5saXN0ID0gTlVMTDsKKyAgc29hcC0+Ymxpc3QgPSBOVUxMOworICBzb2FwLT5jbGlzdCA9IE5VTEw7CisgIHNvYXAtPmFsaXN0ID0gTlVMTDsKKyAgc29hcC0+YXR0cmlidXRlcyA9IE5VTEw7CisgIHNvYXAtPmhlYWRlciA9IE5VTEw7CisgIHNvYXAtPmZhdWx0ID0gTlVMTDsKKyAgc29hcC0+bWFzdGVyID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgc29hcC0+c29ja2V0ID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgc29hcC0+b3MgPSBOVUxMOworICBzb2FwLT5pcyA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXAtPmRvbSA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGlzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmxhc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmxpc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5sYXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5ib3VuZGFyeSA9IE5VTEw7CisgIHNvYXAtPm1pbWUuc3RhcnQgPSBOVUxMOworICBzb2FwLT54bGlzdCA9IE5VTEw7CisjZW5kaWYKKyNpZm5kZWYgVU5ERVJfQ0UKKyAgc29hcC0+cmVjdmZkID0gMDsKKyAgc29hcC0+c2VuZGZkID0gMTsKKyNlbHNlCisgIHNvYXAtPnJlY3ZmZCA9IHN0ZGluOworICBzb2FwLT5zZW5kZmQgPSBzdGRvdXQ7CisjZW5kaWYgCisgIHNvYXAtPmhvc3RbMF0gPSAnXDAnOworICBzb2FwLT5wb3J0ID0gMDsKKyAgc29hcC0+YWN0aW9uID0gTlVMTDsKKyAgc29hcC0+cHJveHlfaG9zdCA9IE5VTEw7CisgIHNvYXAtPnByb3h5X3BvcnQgPSA4MDgwOworICBzb2FwLT5wcm94eV91c2VyaWQgPSBOVUxMOworICBzb2FwLT5wcm94eV9wYXNzd2QgPSBOVUxMOworICBzb2FwLT5hdXRocmVhbG0gPSBOVUxMOworICBzb2FwLT5wcm9sb2cgPSBOVUxMOworI2lmZGVmIFdJVEhfT1BFTlNTTAorICBpZiAoIXNzbF9pbml0X2RvbmUpCisgICAgc29hcF9zc2xfaW5pdCgpOworICBzb2FwLT5mc3NsYXV0aCA9IHNzbF9hdXRoX2luaXQ7CisgIHNvYXAtPmZzc2x2ZXJpZnkgPSBzc2xfdmVyaWZ5X2NhbGxiYWNrOworICBzb2FwLT5iaW8gPSBOVUxMOworICBzb2FwLT5zc2wgPSBOVUxMOworICBzb2FwLT5jdHggPSBOVUxMOworICBzb2FwLT5yZXF1aXJlX3NlcnZlcl9hdXRoID0gMDsKKyAgc29hcC0+cmVxdWlyZV9jbGllbnRfYXV0aCA9IDA7CisgIHNvYXAtPnJzYSA9IDA7CisgIHNvYXAtPmtleWZpbGUgPSBOVUxMOworICBzb2FwLT5wYXNzd29yZCA9IE5VTEw7CisgIHNvYXAtPmRoZmlsZSA9IE5VTEw7CisgIHNvYXAtPmNhZmlsZSA9IE5VTEw7CisgIHNvYXAtPmNhcGF0aCA9IE5VTEw7CisgIHNvYXAtPmNybGZpbGUgPSBOVUxMOworICBzb2FwLT5yYW5kZmlsZSA9IE5VTEw7CisgIHNvYXAtPnNlc3Npb24gPSBOVUxMOworI2VuZGlmCisjaWZkZWYgV0lUSF9aTElCCisgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfTk9ORTsKKyAgc29hcC0+emxpYl9pbiA9IFNPQVBfWkxJQl9OT05FOworICBzb2FwLT56bGliX291dCA9IFNPQVBfWkxJQl9OT05FOworICBzb2FwLT5kX3N0cmVhbS56YWxsb2MgPSBOVUxMOworICBzb2FwLT5kX3N0cmVhbS56ZnJlZSA9IE5VTEw7CisgIHNvYXAtPmRfc3RyZWFtLm9wYXF1ZSA9IE5VTEw7CisgIHNvYXAtPnpfbGV2ZWwgPSA2OworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBzb2FwLT5jMTRuaW5jbHVkZSA9IE5VTEw7CisgIHNvYXAtPmMxNG5leGNsdWRlID0gTlVMTDsKKyAgc29hcC0+Y29va2llcyA9IE5VTEw7CisgIHNvYXAtPmNvb2tpZV9kb21haW4gPSBOVUxMOworICBzb2FwLT5jb29raWVfcGF0aCA9IE5VTEw7CisgIHNvYXAtPmNvb2tpZV9tYXggPSAzMjsKKyNlbmRpZgorI2lmZGVmIFNPQVBfREVCVUcKKyAgc29hcF9pbml0X21odChzb2FwKTsKKyAgc29hcF9pbml0X2xvZ3Moc29hcCk7CisgIHNvYXBfc2V0X3JlY3ZfbG9nZmlsZShzb2FwLCAiUkVDVi5sb2ciKTsKKyAgc29hcF9zZXRfc2VudF9sb2dmaWxlKHNvYXAsICJTRU5ULmxvZyIpOworICBzb2FwX3NldF90ZXN0X2xvZ2ZpbGUoc29hcCwgTlVMTCk7CisjZW5kaWYKKyNpZmRlZiBXTVdfUlBNX0lPCisgIHNvYXAtPnJwbXJlcWlkID0gTlVMTDsKKyNlbmRpZgorI2lmZGVmIFBBTE0KKyAgcGFsbU5ldExpYk9wZW4oKTsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgc29hcF9pbml0X2lodChzb2FwKTsKKyAgc29hcF9pbml0X3BodChzb2FwKTsKKyNlbmRpZgorICBzb2FwX2JlZ2luKHNvYXApOworI2lmZGVmIFNPQVBfREVCVUcKKyAgc29hcF9zZXRfdGVzdF9sb2dmaWxlKHNvYXAsICJURVNULmxvZyIpOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2luaXQxKHN0cnVjdCBzb2FwICpzb2FwLCBzb2FwX21vZGUgbW9kZSkKK3sgc29hcF9pbml0Mihzb2FwLCBtb2RlLCBtb2RlKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfaW5pdDIoc3RydWN0IHNvYXAgKnNvYXAsIHNvYXBfbW9kZSBpbW9kZSwgc29hcF9tb2RlIG9tb2RlKQoreyBzb2FwX2luaXQoc29hcCk7CisgIHNvYXBfaW1vZGUoc29hcCwgaW1vZGUpOworICBzb2FwX29tb2RlKHNvYXAsIG9tb2RlKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfYmVnaW4oc3RydWN0IHNvYXAgKnNvYXApCit7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5pdGlhbGl6aW5nXG4iKSk7CisgIGlmICghc29hcC0+a2VlcF9hbGl2ZSkKKyAgeyBzb2FwLT5idWZsZW4gPSAwOworICAgIHNvYXAtPmJ1ZmlkeCA9IDA7CisgIH0KKyAgc29hcC0+a2VlcF9hbGl2ZSA9ICgoKHNvYXAtPmltb2RlIHwgc29hcC0+b21vZGUpICYgU09BUF9JT19LRUVQQUxJVkUpICE9IDApOworICBzb2FwLT5udWxsID0gMDsKKyAgc29hcC0+cG9zaXRpb24gPSAwOworICBzb2FwLT5lbmNvZGluZyA9IDA7CisgIHNvYXAtPm11c3RVbmRlcnN0YW5kID0gMDsKKyAgc29hcC0+bW9kZSA9IDA7CisgIHNvYXAtPm5zID0gMDsKKyAgc29hcC0+cGFydCA9IFNPQVBfRU5EOworICBzb2FwLT5hbGxvY2VkID0gMDsKKyAgc29hcC0+Y291bnQgPSAwOworICBzb2FwLT5sZW5ndGggPSAwOworICBzb2FwLT5jZGF0YSA9IDA7CisgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgc29hcC0+cGVla2VkID0gMDsKKyAgc29hcC0+YWhlYWQgPSAwOworICBzb2FwLT5pZG51bSA9IDA7CisgIHNvYXAtPmxldmVsID0gMDsKKyAgc29hcC0+ZW5kcG9pbnRbMF0gPSAnXDAnOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzb2FwLT5kaW1lLmNodW5rc2l6ZSA9IDA7CisgIHNvYXAtPmRpbWUuYnVmbGVuID0gMDsKKyNlbmRpZgorICBzb2FwX2ZyZWUoc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2VuZChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfY2xpc3QgKmNwOworICBpZiAoc29hcF9jaGVja19zdGF0ZShzb2FwKSkKKyAgICByZXR1cm47CisgIHNvYXBfZnJlZShzb2FwKTsKKyAgc29hcF9kZWFsbG9jKHNvYXAsIE5VTEwpOworICB3aGlsZSAoc29hcC0+Y2xpc3QpCisgIHsgY3AgPSBzb2FwLT5jbGlzdC0+bmV4dDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+Y2xpc3QpOworICAgIHNvYXAtPmNsaXN0ID0gY3A7CisgIH0KKyAgc29hcF9jbG9zZXNvY2soc29hcCk7CisjaWZkZWYgU09BUF9ERUJVRworICBzb2FwX2Nsb3NlX2xvZ2ZpbGVzKHNvYXApOworI2VuZGlmCisjaWZkZWYgUEFMTQorICBwYWxtTmV0TGliQ2xvc2UoKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NldF9uYW1lc3BhY2VzKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgTmFtZXNwYWNlICpwKQoreyByZWdpc3RlciBzdHJ1Y3QgTmFtZXNwYWNlICpucyA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXM7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucCwgKm5xLCAqbnI7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBsZXZlbCA9IHNvYXAtPmxldmVsOworICBzb2FwLT5uYW1lc3BhY2VzID0gcDsKKyAgc29hcC0+bG9jYWxfbmFtZXNwYWNlcyA9IE5VTEw7CisgIHNvYXBfc2V0X2xvY2FsX25hbWVzcGFjZXMoc29hcCk7CisgIC8qIHJldmVyc2UgdGhlIG5hbWVzcGFjZSBsaXN0ICovCisgIG5wID0gc29hcC0+bmxpc3Q7CisgIHNvYXAtPm5saXN0ID0gTlVMTDsKKyAgaWYgKG5wKQorICB7IG5xID0gbnAtPm5leHQ7CisgICAgbnAtPm5leHQgPSBOVUxMOworICAgIHdoaWxlIChucSkKKyAgICB7IG5yID0gbnEtPm5leHQ7CisgICAgICBucS0+bmV4dCA9IG5wOworICAgICAgbnAgPSBucTsKKyAgICAgIG5xID0gbnI7CisgICAgfQorICB9CisgIC8qIHRoZW4gcHVzaCBvbiBuZXcgc3RhY2sgKi8KKyAgd2hpbGUgKG5wKQorICB7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnM7CisgICAgc29hcC0+bGV2ZWwgPSBucC0+bGV2ZWw7IC8qIHByZXNlcnZlIGVsZW1lbnQgbmVzdGluZyBsZXZlbCAqLworICAgIHMgPSBucC0+bnM7CisgICAgaWYgKCFzICYmIG5wLT5pbmRleCA+PSAwICYmIG5zKQorICAgIHsgcyA9IG5zW25wLT5pbmRleF0ub3V0OworICAgICAgaWYgKCFzKQorICAgICAgICBzID0gbnNbbnAtPmluZGV4XS5uczsKKyAgICB9CisgICAgaWYgKHMgJiYgc29hcF9wdXNoX25hbWVzcGFjZShzb2FwLCBucC0+aWQsIHMpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIG5xID0gbnA7CisgICAgbnAgPSBucC0+bmV4dDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgbnEpOworICB9CisgIGlmIChucykKKyAgeyByZWdpc3RlciBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBuc1tpXS5pZDsgaSsrKQorICAgIHsgaWYgKG5zW2ldLm91dCkKKyAgICAgIHsgU09BUF9GUkVFKHNvYXAsIG5zW2ldLm91dCk7CisgICAgICAgIG5zW2ldLm91dCA9IE5VTEw7CisgICAgICB9CisgICAgfQorICAgIFNPQVBfRlJFRShzb2FwLCBucyk7CisgIH0KKyAgc29hcC0+bGV2ZWwgPSBsZXZlbDsgLyogcmVzdG9yZSBsZXZlbCAqLworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2xvY2FsX25hbWVzcGFjZXMoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwLT5uYW1lc3BhY2VzICYmICFzb2FwLT5sb2NhbF9uYW1lc3BhY2VzKQorICB7IHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBOYW1lc3BhY2UgKm5zMTsKKyAgICByZWdpc3RlciBzdHJ1Y3QgTmFtZXNwYWNlICpuczI7CisgICAgcmVnaXN0ZXIgc2l6ZV90IG4gPSAxOworICAgIGZvciAobnMxID0gc29hcC0+bmFtZXNwYWNlczsgbnMxLT5pZDsgbnMxKyspCisgICAgICBuKys7CisgICAgbiAqPSBzaXplb2Yoc3RydWN0IE5hbWVzcGFjZSk7CisgICAgbnMyID0gKHN0cnVjdCBOYW1lc3BhY2UqKVNPQVBfTUFMTE9DKHNvYXAsIG4pOworICAgIGlmIChuczIpCisgICAgeyBtZW1jcHkobnMyLCBzb2FwLT5uYW1lc3BhY2VzLCBuKTsKKyAgICAgIGlmIChuczJbMF0ubnMpCisgICAgICB7IGlmICghc3RyY21wKG5zMlswXS5ucywgc29hcF9lbnYxKSkKKyAgICAgICAgICBzb2FwLT52ZXJzaW9uID0gMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHNvYXAtPnZlcnNpb24gPSAyOworICAgICAgfQorICAgICAgc29hcC0+bG9jYWxfbmFtZXNwYWNlcyA9IG5zMjsKKyAgICB9CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfc3Ryc2VhcmNoKGNvbnN0IGNoYXIgKmJpZywgY29uc3QgY2hhciAqbGl0dGxlKQoreyBzaXplX3QgbiA9IHN0cmxlbihsaXR0bGUpOworICBjb25zdCBjaGFyICpzID0gYmlnOworICB3aGlsZSAocykgCisgIHsgaWYgKCFzdHJuY21wKHMsIGxpdHRsZSwgbikgJiYgKHNbbl0gPT0gJ1wwJyB8fCBzW25dID09ICcgJykpCisgICAgICByZXR1cm4gczsKKyAgICBzID0gc3RyY2hyKHMsICcgJyk7CisgICAgaWYgKHMpCisgICAgICBzKys7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBzdHJ1Y3Qgc29hcF9ubGlzdCAqCitzb2FwX2xvb2t1cF9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzaXplX3QgbikKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wOworICBmb3IgKG5wID0gc29hcC0+bmxpc3Q7IG5wOyBucCA9IG5wLT5uZXh0KQorICB7IGlmICghc3RybmNtcChucC0+aWQsIHRhZywgbikgJiYgIW5wLT5pZFtuXSkKKyAgICAgIHJldHVybiBucDsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBzdHJ1Y3Qgc29hcF9ubGlzdCAqCitzb2FwX3B1c2hfbnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICpucywgc2hvcnQgdXRpbGl6ZWQpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucDsKKyAgc2l6ZV90IG4sIGs7CisgIGlmIChzb2FwX3N0cnNlYXJjaChzb2FwLT5jMTRuZXhjbHVkZSwgaWQpKQorICAgIHJldHVybiBOVUxMOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlB1c2ggbmFtZXNwYWNlIGJpbmRpbmcgKGxldmVsPSV1KSAnJXMnICclcydcbiIsIHNvYXAtPmxldmVsLCBpZCwgbnM/bnM6IiIpKTsKKyAgaWYgKCF1dGlsaXplZCkKKyAgeyBmb3IgKG5wID0gc29hcC0+bmxpc3Q7IG5wOyBucCA9IG5wLT5uZXh0KQorICAgIHsgaWYgKCFzdHJjbXAobnAtPmlkLCBpZCkgJiYgKCFucC0+bnMgfHwgIXN0cmNtcChucC0+bnMsIG5zKSkpCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAobnApCisgICAgeyBpZiAobnAtPmluZGV4ID09IDEpCisgICAgICAgIHV0aWxpemVkID0gbnAtPmluZGV4OworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIH0KKyAgbiA9IHN0cmxlbihpZCk7CisgIGlmIChucykKKyAgICBrID0gc3RybGVuKG5zKTsKKyAgZWxzZQorICAgIGsgPSAwOworICBucCA9IChzdHJ1Y3Qgc29hcF9ubGlzdCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX25saXN0KSArIG4gKyBrICsgMSk7CisgIGlmICghbnApCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBucC0+bmV4dCA9IHNvYXAtPm5saXN0OworICBzb2FwLT5ubGlzdCA9IG5wOworICBzdHJjcHkobnAtPmlkLCBpZCk7CisgIGlmIChucykKKyAgeyBucC0+bnMgPSBucC0+aWQgKyBuICsgMTsKKyAgICBzdHJjcHkobnAtPm5zLCBucyk7CisgIH0KKyAgZWxzZQorICAgIG5wLT5ucyA9IE5VTEw7CisgIG5wLT5sZXZlbCA9IHNvYXAtPmxldmVsOworICBucC0+aW5kZXggPSB1dGlsaXplZDsKKyAgcmV0dXJuIG5wOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIHZvaWQKK3NvYXBfdXRpbGl6ZV9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzaXplX3QgbikKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wID0gc29hcF9sb29rdXBfbnMoc29hcCwgdGFnLCBuKTsKKyAgaWYgKG5wKQorICB7IGlmIChucC0+aW5kZXggPT0gMCkKKyAgICAgIHNvYXBfcHVzaF9ucyhzb2FwLCBucC0+aWQsIG5wLT5ucywgMSk7CisgIH0KKyAgZWxzZQorICB7IHN0cm5jcHkoc29hcC0+dG1wYnVmLCB0YWcsIG4pOworICAgIHNvYXAtPnRtcGJ1ZltuXSA9ICdcMCc7CisgICAgc29hcF9wdXNoX25zKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgTlVMTCwgMSk7CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyB2b2lkCitzb2FwX3BvcF9ucyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcF9wb3BfbmFtZXNwYWNlKHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICp0eXBlKQoreyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVsZW1lbnQgYmVnaW4gdGFnPSclcycgaWQ9JyVkJyB0eXBlPSclcydcbiIsIHRhZywgaWQsIHR5cGU/dHlwZToiIikpOworI2lmZGVmIFdJVEhfRE9NCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICplbHQgPSAoc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCkpOworICAgIGlmICghZWx0KQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgZWx0LT5zb2FwID0gc29hcDsKKyAgICBlbHQtPm5leHQgPSBOVUxMOworICAgIGVsdC0+cHJudCA9IHNvYXAtPmRvbTsKKyAgICBlbHQtPm5hbWUgPSBzb2FwX3N0cmR1cChzb2FwLCB0YWcpOworICAgIGVsdC0+ZWx0cyA9IE5VTEw7CisgICAgZWx0LT5hdHRzID0gTlVMTDsKKyAgICBlbHQtPm5zdHIgPSBOVUxMOworICAgIGVsdC0+ZGF0YSA9IE5VTEw7CisgICAgZWx0LT53aWRlID0gTlVMTDsKKyAgICBlbHQtPm5vZGUgPSBOVUxMOworICAgIGVsdC0+dHlwZSA9IDA7CisgICAgZWx0LT5oZWFkID0gTlVMTDsKKyAgICBlbHQtPnRhaWwgPSBOVUxMOworICAgIGlmIChzb2FwLT5kb20pCisgICAgeyBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqcCA9IHNvYXAtPmRvbS0+ZWx0czsKKyAgICAgIGlmIChwKQorICAgICAgeyB3aGlsZSAocC0+bmV4dCkKKyAgICAgICAgICBwID0gcC0+bmV4dDsKKyAgICAgICAgcC0+bmV4dCA9IGVsdDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgc29hcC0+ZG9tLT5lbHRzID0gZWx0OworICAgIH0KKyAgICBzb2FwLT5kb20gPSBlbHQ7CisgIH0KKyAgZWxzZQorICB7CisjZW5kaWYKKyAgICBzb2FwLT5sZXZlbCsrOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBpZiAoIXNvYXAtPm5zKQorICAgIHsgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgICAgICAmJiBzb2FwX3NlbmQoc29hcCwgc29hcC0+cHJvbG9nID8gc29hcC0+cHJvbG9nIDogIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIikpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgZWxzZSBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0lOREVOVCkKKyAgICB7IGlmIChzb2FwLT5ucyA9PSAxICYmIHNvYXBfc2VuZF9yYXcoc29hcCwgc29hcF9pbmRlbnQsIHNvYXAtPmxldmVsIDwgc2l6ZW9mKHNvYXBfaW5kZW50KSA/IHNvYXAtPmxldmVsIDogc2l6ZW9mKHNvYXBfaW5kZW50KSAtIDEpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBzb2FwLT5ib2R5ID0gMTsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAiPCIsIDEpCisgICAgIHx8IHNvYXBfc2VuZChzb2FwLCB0YWcpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmZGVmIFdJVEhfRE9NCisgIH0KKyNlbmRpZgorICBpZiAoIXNvYXAtPm5zKQorICB7IHN0cnVjdCBOYW1lc3BhY2UgKm5zOworICAgIGZvciAobnMgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzOyBucyAmJiBucy0+aWQ7IG5zKyspCisgICAgeyBpZiAoKm5zLT5pZCAmJiAobnMtPm91dCB8fCBucy0+bnMpKQorICAgICAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgInhtbG5zOiVzIiwgbnMtPmlkKTsKKyAgICAgICAgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgbnMtPm91dCA/IG5zLT5vdXQgOiBucy0+bnMpKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIH0KKyAgICB9ICAgCisgIH0KKyAgc29hcC0+bnMgPSAxOyAvKiBzdGFydCB3aXRoIDAgb3IgMiwgYnV0IHNob3VsZCBiZSBvbmUgdG8gY29udGludWUgKi8KKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICB7IGNvbnN0IGNoYXIgKnMgPSBzdHJjaHIodGFnLCAnOicpOworICAgIGlmIChzKQorICAgICAgc29hcF91dGlsaXplX25zKHNvYXAsIHRhZywgcyAtIHRhZyk7CisgIH0KKyNlbmRpZgorICBpZiAoaWQgPiAwKQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiXyVkIiwgaWQpOworICAgIGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAiaWQiLCBzb2FwLT50bXBidWYpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmICh0eXBlICYmICp0eXBlKQorICB7IGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAieHNpOnR5cGUiLCB0eXBlKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgICAgeyBjb25zdCBjaGFyICpzID0gc3RyY2hyKHR5cGUsICc6Jyk7CisgICAgICBpZiAocykKKyAgICAgICAgc29hcF91dGlsaXplX25zKHNvYXAsIHR5cGUsIHMgLSB0eXBlKTsKKyAgICB9CisjZW5kaWYKKyAgfQorICBpZiAoc29hcC0+bnVsbCAmJiBzb2FwLT5wb3NpdGlvbiA+IDApCisgIHsgaW50IGk7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICJbJWQiLCBzb2FwLT5wb3NpdGlvbnNbMF0pOworICAgIGZvciAoaSA9IDE7IGkgPCBzb2FwLT5wb3NpdGlvbjsgaSsrKQorICAgICAgc3ByaW50Zihzb2FwLT50bXBidWYgKyBzdHJsZW4oc29hcC0+dG1wYnVmKSwgIiwlZCIsIHNvYXAtPnBvc2l0aW9uc1tpXSk7CisgICAgc3RyY2F0KHNvYXAtPnRtcGJ1ZiwgIl0iKTsKKyAgICBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgIlNPQVAtRU5DOnBvc2l0aW9uIiwgc29hcC0+dG1wYnVmKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAoc29hcC0+bXVzdFVuZGVyc3RhbmQpCisgIHsgaWYgKHNvYXAtPmFjdG9yICYmICpzb2FwLT5hY3RvcikKKyAgICB7IGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCBzb2FwLT52ZXJzaW9uID09IDIgPyAiU09BUC1FTlY6cm9sZSIgOiAiU09BUC1FTlY6YWN0b3IiLCBzb2FwLT5hY3RvcikpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJTT0FQLUVOVjptdXN0VW5kZXJzdGFuZCIsIHNvYXAtPnZlcnNpb24gPT0gMiA/ICJ0cnVlIiA6ICIxIikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgc29hcC0+bXVzdFVuZGVyc3RhbmQgPSAwOworICB9CisgIGlmIChzb2FwLT5lbmNvZGluZykKKyAgeyBpZiAoc29hcC0+ZW5jb2RpbmdTdHlsZSAmJiBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzKQorICAgIHsgaWYgKCEqc29hcC0+ZW5jb2RpbmdTdHlsZSkKKyAgICAgIHsgaWYgKHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbMV0ub3V0KQorICAgICAgICAgIHNvYXAtPmVuY29kaW5nU3R5bGUgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzWzFdLm91dDsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHNvYXAtPmVuY29kaW5nU3R5bGUgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzWzFdLm5zOworICAgICAgfQorICAgICAgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJTT0FQLUVOVjplbmNvZGluZ1N0eWxlIiwgc29hcC0+ZW5jb2RpbmdTdHlsZSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgc29hcC0+ZW5jb2RpbmcgPSAwOworICB9CisgIHNvYXAtPm51bGwgPSAwOworICBzb2FwLT5wb3NpdGlvbiA9IDA7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgY2hhciAqdHlwZSkKK3sgaWYgKCp0YWcgPT0gJy0nKQorICAgIHJldHVybiBTT0FQX09LOworICBpZiAoc29hcF9lbGVtZW50KHNvYXAsIHRhZywgaWQsIHR5cGUpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHNvYXAsIE5VTEwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorI2lmbmRlZiBIQVZFX1NUUlJDSFIKK1NPQVBfRk1BQzEKK2NoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3N0cnJjaHIoY29uc3QgY2hhciAqcywgaW50IHQpCit7IHJlZ2lzdGVyIGNoYXIgKnIgPSBOVUxMOworICB3aGlsZSAoKnMpCisgICAgaWYgKCpzKysgPT0gdCkKKyAgICAgIHIgPSAoY2hhciopcyAtIDE7CisgIHJldHVybiByOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCisjaWZuZGVmIEhBVkVfU1RSVE9MCitTT0FQX0ZNQUMxCitsb25nCitTT0FQX0ZNQUMyCitzb2FwX3N0cnRvbChjb25zdCBjaGFyICpzLCBjaGFyICoqdCwgaW50IGIpCit7IHJlZ2lzdGVyIGxvbmcgbiA9IDA7CisgIHJlZ2lzdGVyIGludCBjOworICB3aGlsZSAoKnMgPiAwICYmICpzIDw9IDMyKQorICAgIHMrKzsKKyAgaWYgKGIgPT0gMTApCisgIHsgc2hvcnQgbmVnID0gMDsKKyAgICBpZiAoKnMgPT0gJy0nKQorICAgIHsgcysrOworICAgICAgbmVnID0gMTsKKyAgICB9CisgICAgZWxzZSBpZiAoKnMgPT0gJysnKQorICAgICAgcysrOworICAgIHdoaWxlICgoYyA9ICpzKSAmJiBjID49ICcwJyAmJiBjIDw9ICc5JykKKyAgICB7IGlmIChuID49IDIxNDc0ODM2NCAmJiAobiA+IDIxNDc0ODM2NCB8fCBjID49ICc4JykpCisgICAgICAgIGJyZWFrOworICAgICAgbiAqPSAxMDsKKyAgICAgIG4gKz0gYyAtICcwJzsKKyAgICAgIHMrKzsKKyAgICB9CisgICAgaWYgKG5lZykKKyAgICAgIG4gPSAtbjsKKyAgfQorICBlbHNlIC8qIGIgPT0gMTYgYW5kIHZhbHVlIGlzIGFsd2F5cyBwb3NpdGl2ZSAqLworICB7IHdoaWxlICgoYyA9ICpzKSkKKyAgICB7IGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKKyAgICAgICAgYyAtPSAnMCc7CisgICAgICBlbHNlIGlmIChjID49ICdBJyAmJiBjIDw9ICdGJykKKyAgICAgICAgYyAtPSAnQScgLSAxMDsKKyAgICAgIGVsc2UgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQorICAgICAgICBjIC09ICdhJyAtIDEwOworICAgICAgaWYgKG4gPiAweDA3RkZGRkZGKQorICAgICAgICBicmVhazsKKyAgICAgIG4gPDw9IDQ7CisgICAgICBuICs9IGM7CisgICAgICBzKys7CisgICAgfQorICB9CisgIGlmICh0KQorICAgICp0ID0gKGNoYXIqKXM7CisgIHJldHVybiBuOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCisjaWZuZGVmIEhBVkVfU1RSVE9VTAorU09BUF9GTUFDMQordW5zaWduZWQgbG9uZworU09BUF9GTUFDMgorc29hcF9zdHJ0b3VsKGNvbnN0IGNoYXIgKnMsIGNoYXIgKip0LCBpbnQgYikKK3sgdW5zaWduZWQgbG9uZyBuID0gMDsKKyAgcmVnaXN0ZXIgaW50IGM7CisgIHdoaWxlICgqcyA+IDAgJiYgKnMgPD0gMzIpCisgICAgcysrOworICBpZiAoYiA9PSAxMCkKKyAgeyBpZiAoKnMgPT0gJysnKQorICAgICAgcysrOworICAgIHdoaWxlICgoYyA9ICpzKSAmJiBjID49ICcwJyAmJiBjIDw9ICc5JykKKyAgICB7IGlmIChuID49IDQyOTQ5NjcyOSAmJiAobiA+IDQyOTQ5NjcyOSB8fCBjID49ICc2JykpCisgICAgICAgIGJyZWFrOworICAgICAgbiAqPSAxMDsKKyAgICAgIG4gKz0gYyAtICcwJzsKKyAgICAgIHMrKzsKKyAgICB9CisgIH0KKyAgZWxzZSAvKiBiID09IDE2ICovCisgIHsgd2hpbGUgKChjID0gKnMpKQorICAgIHsgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQorICAgICAgICBjIC09ICcwJzsKKyAgICAgIGVsc2UgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKQorICAgICAgICBjIC09ICdBJyAtIDEwOworICAgICAgZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCisgICAgICAgIGMgLT0gJ2EnIC0gMTA7CisgICAgICBpZiAobiA+IDB4MEZGRkZGRkYpCisgICAgICAgIGJyZWFrOworICAgICAgbiA8PD0gNDsKKyAgICAgIG4gKz0gYzsKKyAgICAgIHMrKzsKKyAgICB9CisgIH0KKyAgaWYgKHQpCisgICAgKnQgPSAoY2hhciopczsKKyAgcmV0dXJuIG47Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9hcnJheV9iZWdpbl9vdXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICpvZmZzZXQpCit7IGlmIChzb2FwX2VsZW1lbnQoc29hcCwgdGFnLCBpZCwgIlNPQVAtRU5DOkFycmF5IikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICB7IGNvbnN0IGNoYXIgKnM7CisgICAgcyA9IHNvYXBfc3RycmNocih0eXBlLCAnWycpOworICAgIGlmICgoc2l6ZV90KShzIC0gdHlwZSkgPCBzaXplb2Yoc29hcC0+dG1wYnVmKSkKKyAgICB7IHN0cm5jcHkoc29hcC0+dG1wYnVmLCB0eXBlLCBzIC0gdHlwZSk7CisgICAgICBzb2FwLT50bXBidWZbcyAtIHR5cGVdID0gJ1wwJzsKKyAgICAgIGlmICh0eXBlICYmICp0eXBlICYmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAiU09BUC1FTkM6aXRlbVR5cGUiLCBzb2FwLT50bXBidWYpKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgaWYgKHMgJiYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJTT0FQLUVOQzphcnJheVNpemUiLCBzICsgMSkpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICB9CisgIGVsc2UKKyAgeyBpZiAob2Zmc2V0ICYmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAiU09BUC1FTkM6b2Zmc2V0Iiwgb2Zmc2V0KSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHR5cGUgJiYgKnR5cGUgJiYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJTT0FQLUVOQzphcnJheVR5cGUiLCB0eXBlKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICh0eXBlICYmICp0eXBlICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKSkKKyAgeyBjb25zdCBjaGFyICpzID0gc3RyY2hyKHR5cGUsICc6Jyk7CisgICAgaWYgKHMpCisgICAgICBzb2FwX3V0aWxpemVfbnMoc29hcCwgdHlwZSwgcyAtIHR5cGUpOworICB9CisjZW5kaWYKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHNvYXAsIE5VTEwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKnRwOworI2lmZGVmIFdJVEhfRE9NCisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgKiphdHQ7CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IGF0dCA9ICZzb2FwLT5kb20tPmF0dHM7CisgICAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICAgIHsgaWYgKHRwLT52aXNpYmxlKQorICAgICAgeyAqYXR0ID0gKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlKSk7CisJaWYgKCEqYXR0KQorCSAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisJKCphdHQpLT5uZXh0ID0gTlVMTDsKKyAgICAgICAgKCphdHQpLT5uc3RyID0gTlVMTDsKKyAgICAgICAgKCphdHQpLT5uYW1lID0gc29hcF9zdHJkdXAoc29hcCwgdHAtPm5hbWUpOworICAgICAgICAoKmF0dCktPmRhdGEgPSBzb2FwX3N0cmR1cChzb2FwLCB0cC0+dmFsdWUpOworICAgICAgICAoKmF0dCktPndpZGUgPSBOVUxMOworICAgICAgICAoKmF0dCktPnNvYXAgPSBzb2FwOworICAgICAgICB0cC0+dmlzaWJsZSA9IDA7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBTT0FQX09LOworICB9CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICB7IHN0cnVjdCBzb2FwX25saXN0ICpucDsKKyAgICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgICAgeyBpZiAodHAtPnZpc2libGUgJiYgdHAtPm5hbWUpCisgICAgICB7IGNvbnN0IGNoYXIgKnMgPSBzdHJjaHIodHAtPm5hbWUsICc6Jyk7CisgICAgICAgIGlmIChzKQorICAgICAgICAgIHNvYXBfdXRpbGl6ZV9ucyhzb2FwLCB0cC0+bmFtZSwgcyAtIHRwLT5uYW1lKTsKKyAgICAgIH0KKyAgICB9CisgICAgZm9yIChucCA9IHNvYXAtPm5saXN0OyBucDsgbnAgPSBucC0+bmV4dCkKKyAgICB7IGlmIChucC0+aW5kZXggPT0gMSAmJiBucC0+bnMpCisgICAgICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAieG1sbnM6JXMiLCBucC0+aWQpOworICAgICAgICBzb2FwX3NldF9hdHRyKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgbnAtPm5zKTsKKyAgICAgICAgbnAtPmluZGV4ID0gMjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyNlbmRpZgorICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgIHsgaWYgKHRwLT52aXNpYmxlKQorICAgIHsgaWYgKHNvYXBfc2VuZChzb2FwLCAiICIpIHx8IHNvYXBfc2VuZChzb2FwLCB0cC0+bmFtZSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIGlmICh0cC0+dmlzaWJsZSA9PSAyICYmIHRwLT52YWx1ZSkKKyAgICAgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgIj1cIiIsIDIpCisJIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCB0cC0+dmFsdWUsIDEpCisJIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIlwiIiwgMSkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgdHAtPnZpc2libGUgPSAwOworICAgIH0KKyAgfQorICBpZiAodGFnKQorICB7IAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsICI+IiwgMSkKKyAgICAgICB8fCBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHNvYXAtPmxldmVsLS07CS8qIGRlY3JlbWVudCBsZXZlbCBqdXN0IGJlZm9yZSAvPiAqLworICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsICIvPiIsIDIpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsICI+IiwgMSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9lbmRfb3V0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcpCit7IGlmICgqdGFnID09ICctJykKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbGVtZW50IGVuZGluZyB0YWc9JyVzJ1xuIiwgdGFnKSk7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgaWYgKHNvYXAtPmRvbS0+cHJudCkKKyAgICAgIHNvYXAtPmRvbSA9IHNvYXAtPmRvbS0+cHJudDsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgICBzb2FwX3BvcF9ucyhzb2FwKTsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9JTkRFTlQpCisgIHsgaWYgKCFzb2FwLT5ib2R5KQorICAgIHsgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgc29hcF9pbmRlbnQsIHNvYXAtPmxldmVsIDwgc2l6ZW9mKHNvYXBfaW5kZW50KSA/IHNvYXAtPmxldmVsIDogc2l6ZW9mKHNvYXBfaW5kZW50KSAtIDEpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIHNvYXAtPmJvZHkgPSAwOworICB9CisjZW5kaWYKKyAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgIjwvIiwgMikKKyAgIHx8IHNvYXBfc2VuZChzb2FwLCB0YWcpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgc29hcC0+bGV2ZWwtLTsJLyogZGVjcmVtZW50IGxldmVsIGp1c3QgYmVmb3JlID4gKi8KKyAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgIj4iLCAxKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X3JlZihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGludCBocmVmKQoreyByZWdpc3RlciBpbnQgbiA9IDA7CisgIGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgICAgbiA9IDE7CisgIHNwcmludGYoc29hcC0+aHJlZiwgIiNfJWQiLCBocmVmKTsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9ocmVmKHNvYXAsIHRhZywgaWQsICJocmVmIiArIG4sIHNvYXAtPmhyZWYgKyBuKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X2hyZWYoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICpyZWYsIGNvbnN0IGNoYXIgKnZhbCkKK3sgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbGVtZW50ICclcycgcmVmZXJlbmNlICVzPSclcydcbiIsIHRhZywgcmVmLCB2YWwpKTsKKyAgaWYgKHNvYXBfZWxlbWVudChzb2FwLCB0YWcsIGlkLCBOVUxMKQorICAgfHwgc29hcF9hdHRyaWJ1dGUoc29hcCwgcmVmLCB2YWwpCisgICB8fCBzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzb2FwLCB0YWcpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9udWxsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgY2hhciAqdHlwZSkKK3sgc3RydWN0IHNvYXBfYXR0cmlidXRlICp0cDsKKyAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICAgIGlmICh0cC0+dmlzaWJsZSkKKyAgICAgIGJyZWFrOworICBpZiAodHAgfHwgKHNvYXAtPnZlcnNpb24gPT0gMiAmJiBzb2FwLT5wb3NpdGlvbiA+IDApIHx8IGlkID4gMCB8fCAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX05JTCkpCisgIHsgaWYgKHNvYXBfZWxlbWVudChzb2FwLCB0YWcsIGlkLCB0eXBlKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAoc29hcC0+cGFydCAhPSBTT0FQX0lOX0hFQURFUiAmJiBzb2FwLT5lbmNvZGluZ1N0eWxlKQorICAgICAgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJ4c2k6bmlsIiwgInRydWUiKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIHJldHVybiBzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzb2FwLCB0YWcpOworICB9CisgIHNvYXAtPm51bGwgPSAxOworICBzb2FwLT5wb3NpdGlvbiA9IDA7CisgIHNvYXAtPm11c3RVbmRlcnN0YW5kID0gMDsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9pZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgbiwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpIAoreyBpZiAoIXAgfHwgKGEgJiYgIWEtPl9fcHRyKSkKKyAgeyBzb2FwX2VsZW1lbnRfbnVsbChzb2FwLCB0YWcsIGlkLCB0eXBlKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfVFJFRSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKGlkIDwgMCkKKyAgeyBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgICAgaWYgKGEpCisgICAgICBpZCA9IHNvYXBfYXJyYXlfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgYSwgbiwgdCwgJnBwKTsKKyAgICBlbHNlCisgICAgICBpZCA9IHNvYXBfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgdCwgJnBwKTsKKyAgICBpZiAoaWQpCisgICAgeyBpZiAoc29hcF9pc19lbWJlZGRlZChzb2FwLCBwcCkpCisgICAgICB7IHNvYXBfZWxlbWVudF9yZWYoc29hcCwgdGFnLCAwLCBpZCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGlmIChzb2FwX2lzX3NpbmdsZShzb2FwLCBwcCkpCisgICAgICAgIHJldHVybiAwOworICAgICAgc29hcF9zZXRfZW1iZWRkZWQoc29hcCwgcHApOworICAgIH0KKyAgfQorICByZXR1cm4gaWQ7CisjZWxzZQorICByZXR1cm4gMDsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfcmVzdWx0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcpCit7IGlmIChzb2FwLT52ZXJzaW9uID09IDIgJiYgc29hcC0+ZW5jb2RpbmdTdHlsZSkKKyAgICBpZiAoc29hcF9lbGVtZW50KHNvYXAsICJTT0FQLVJQQzpyZXN1bHQiLCAwLCBOVUxMKQorICAgICB8fCBzb2FwX2F0dHJpYnV0ZShzb2FwLCAieG1sbnM6U09BUC1SUEMiLCBzb2FwX3JwYykKKyAgICAgfHwgc29hcF9lbGVtZW50X3N0YXJ0X2VuZF9vdXQoc29hcCwgTlVMTCkKKyAgICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHRhZywgMCkKKyAgICAgfHwgc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgIlNPQVAtUlBDOnJlc3VsdCIpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9hdHRyaWJ1dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKQoreyAKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICphID0gKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlKSk7CisgICAgYS0+bmV4dCA9IHNvYXAtPmRvbS0+YXR0czsKKyAgICBhLT5uc3RyID0gTlVMTDsKKyAgICBhLT5uYW1lID0gc29hcF9zdHJkdXAoc29hcCwgbmFtZSk7CisgICAgYS0+ZGF0YSA9IHNvYXBfc3RyZHVwKHNvYXAsIHZhbHVlKTsKKyAgICBhLT53aWRlID0gTlVMTDsKKyAgICBhLT5zb2FwID0gc29hcDsKKyAgICBzb2FwLT5kb20tPmF0dHMgPSBhOworICAgIHJldHVybiBTT0FQX09LOworICB9CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICB7IC8qIFRPRE86IGNvbnNpZGVyIHVzaW5nIHRoaXMgY29kZSB0byBoYW5kbGUgZGVmYXVsdCBuYW1lc3BhY2UKKyAgICBpZiAoIXN0cm5jbXAobmFtZSwgInhtbG5zIiwgNSkgJiYgKG5hbWVbNV0gPT0gJzonIHx8IG5hbWVbNV0gPT0gJ1wwJykpCisgICAgeyBpZiAobmFtZVs1XSA9PSAnOicpCisgICAgICAgIHNvYXBfcHVzaF9ucyhzb2FwLCBuYW1lICsgNiwgdmFsdWUsIDApOworICAgICAgZWxzZQorICAgICAgICBzb2FwX3B1c2hfbnMoc29hcCwgIiIsIHZhbHVlLCAwKTsKKyAgICB9CisgICAgKi8KKyAgICBpZiAoIXN0cm5jbXAobmFtZSwgInhtbG5zOiIsIDYpKQorICAgICAgc29hcF9wdXNoX25zKHNvYXAsIG5hbWUgKyA2LCB2YWx1ZSwgMCk7CisgICAgZWxzZSBpZiAoc29hcF9zZXRfYXR0cihzb2FwLCBuYW1lLCB2YWx1ZSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgZWxzZQorI2VuZGlmCisgIHsgaWYgKHNvYXBfc2VuZChzb2FwLCAiICIpIHx8IHNvYXBfc2VuZChzb2FwLCBuYW1lKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAodmFsdWUpCisgICAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAiPVwiIiwgMikKKyAgICAgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgdmFsdWUsIDEpCisgICAgICAgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiXCIiLCAxKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfYmVnaW5faW4oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IG5pbGxhYmxlKQoreyBpZiAoIXNvYXBfcGVla19lbGVtZW50KHNvYXApKQorICB7IGlmIChzb2FwLT5vdGhlcikKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfVEFHX01JU01BVENIOworICAgIGlmICh0YWcgJiYgKnRhZyA9PSAnLScpCisgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICBpZiAoIShzb2FwLT5lcnJvciA9IHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnRhZywgdGFnKSkpCisgICAgeyBzb2FwLT5wZWVrZWQgPSAwOworICAgICAgaWYgKHNvYXAtPmJvZHkpCisgICAgICAgIHNvYXAtPmxldmVsKys7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkJlZ2luIGVsZW1lbnQgZm91bmQgKGxldmVsPSV1KSAnJXMnPSclcydcbiIsIHNvYXAtPmxldmVsLCBzb2FwLT50YWcsIHRhZz90YWc6IiIgKSk7CisgICAgICBpZiAoIW5pbGxhYmxlICYmIHNvYXAtPm51bGwgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX05VTEw7CisgICAgfQorICB9CisgIGVsc2UgaWYgKHNvYXAtPmVycm9yID09IFNPQVBfTk9fVEFHICYmIHRhZyAmJiAqdGFnID09ICctJykKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X2VuZF9pbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnKSAgCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgcmVnaXN0ZXIgY2hhciAqczsKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqdDsKKyAgcmVnaXN0ZXIgaW50IG4gPSAwOworICBpZiAodGFnICYmICp0YWcgPT0gJy0nKQorICAgIHJldHVybiBTT0FQX09LOworICBzb2FwLT5sZXZlbC0tOworICBzb2FwX3BvcF9uYW1lc3BhY2Uoc29hcCk7CisjaWZkZWYgV0lUSF9ET00KKyAgLyogdGhpcyB3aGl0ZXNwYWNlIG9yIG1peGVkIGNvbnRlbnQgaXMgbm90IGluc2lnbmlmaWNhbnQgZm9yIERPTSAqLworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBpZiAoIXNvYXAtPnBlZWtlZCAmJiAhc29hcF9zdHJpbmdfaW4oc29hcCwgMywgLTEsIC0xKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAoc29hcC0+ZG9tLT5wcm50KQorICAgICAgc29hcC0+ZG9tID0gc29hcC0+ZG9tLT5wcm50OworICB9CisjZW5kaWYKKyAgaWYgKHNvYXAtPnBlZWtlZCkKKyAgeyBpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcpCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgICAgaWYgKCpzb2FwLT50YWcpCisgICAgICBuKys7CisgICAgc29hcC0+cGVla2VkID0gMDsKKyAgfQorICBkbworICB7IHdoaWxlICgoKGMgPSBzb2FwX2dldChzb2FwKSkgIT0gU09BUF9UVCkpCisgICAgeyBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgICBpZiAoYyA9PSBTT0FQX0xUKQorICAgICAgICBuKys7CisgICAgICBlbHNlIGlmIChjID09ICcvJykKKyAgICAgIHsgYyA9IHNvYXBfZ2V0KHNvYXApOworICAgICAgICBpZiAoYyA9PSBTT0FQX0dUKQorCSAgbi0tOworICAgICAgICBlbHNlCisJICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgfQorICAgIH0KKyAgfSB3aGlsZSAobi0tKTsKKyAgcyA9IHNvYXAtPnRhZzsKKyAgd2hpbGUgKHNvYXBfbm90YmxhbmsoYyA9IHNvYXBfZ2V0KHNvYXApKSkKKyAgICAqcysrID0gKGNoYXIpYzsKKyAgKnMgPSAnXDAnOworICBpZiAoKGludCljID09IEVPRikKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgd2hpbGUgKHNvYXBfYmxhbmsoYykpCisgICAgYyA9IHNvYXBfZ2V0KHNvYXApOworICBpZiAoYyAhPSBTT0FQX0dUKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfU1lOVEFYX0VSUk9SOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBlbGVtZW50IGZvdW5kIChsZXZlbD0ldSkgJyVzJz0nJXMnXG4iLCBzb2FwLT5sZXZlbCwgc29hcC0+dGFnLCB0YWc/dGFnOiIiKSk7CisgIGlmICghdGFnIHx8ICEqdGFnKQorICAgIHJldHVybiBTT0FQX09LOworICBpZiAoKHMgPSBzdHJjaHIoc29hcC0+dGFnLCAnOicpKSkKKyAgICBzKys7CisgIGVsc2UKKyAgICBzID0gc29hcC0+dGFnOworICBpZiAoKHQgPSBzdHJjaHIodGFnLCAnOicpKSkKKyAgICB0Kys7CisgIGVsc2UKKyAgICB0ID0gdGFnOworICBpZiAoIVNPQVBfU1RSQ01QKHMsIHQpKQorICAgIHJldHVybiBTT0FQX09LOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBlbGVtZW50IHRhZyBuYW1lIGRvZXMgbm90IG1hdGNoXG4iKSk7CisgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfU1lOVEFYX0VSUk9SOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX2F0dHJfdmFsdWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBmbGFnKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKnRwOworICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgICAgaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgbmFtZSkpCisgICAgICBicmVhazsKKyAgaWYgKHRwICYmIHRwLT52aXNpYmxlID09IDIpCisgIHsgaWYgKGZsYWcgPT0gMiAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfUFJPSElCSVRFRDsKKyAgICBlbHNlCisgICAgICByZXR1cm4gdHAtPnZhbHVlOworICB9CisgIGVsc2UgaWYgKGZsYWcgPT0gMSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpCisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1JFUVVJUkVEOworICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZXRfYXR0cihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqdHA7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2V0IGF0dHJpYnV0ZSAlcz0nJXMnXG4iLCBuYW1lLCB2YWx1ZT92YWx1ZToiIikpOworICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgIHsgaWYgKCFzdHJjbXAodHAtPm5hbWUsIG5hbWUpKQorICAgICAgYnJlYWs7CisgIH0KKyAgaWYgKCF0cCkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFsbG9jYXRlIGF0dHJpYnV0ZSAlc1xuIiwgbmFtZSkpOworICAgIGlmICghKHRwID0gKHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSkgKyBzdHJsZW4obmFtZSkpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHRwLT5ucyA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICAgIHsgc3RydWN0IHNvYXBfYXR0cmlidXRlICoqdHBwID0gJnNvYXAtPmF0dHJpYnV0ZXM7CisgICAgICBjb25zdCBjaGFyICpzID0gc3RyY2hyKG5hbWUsICc6Jyk7CisgICAgICBpZiAoIXN0cm5jbXAobmFtZSwgInhtbG5zIiwgNSkpCisgICAgICB7IGZvciAoOyAqdHBwOyB0cHAgPSAmKCp0cHApLT5uZXh0KQorICAgICAgICAgIGlmIChzdHJuY21wKCgqdHBwKS0+bmFtZSwgInhtbG5zIiwgNSkgfHwgc3RyY21wKCgqdHBwKS0+bmFtZSArIDUsIG5hbWUgKyA1KSA+IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzKQorICAgICAgeyBmb3IgKDsgKnRwcDsgdHBwID0gJigqdHBwKS0+bmV4dCkKKyAgICAgICAgICBpZiAoc3RybmNtcCgoKnRwcCktPm5hbWUsICJ4bWxucyIsIDUpICYmICgoKnRwcCktPm5zIHx8IHN0cmNtcCgoKnRwcCktPm5hbWUsIG5hbWUpID4gMCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgaW50IGs7CisgICAgICAgIGZvciAoOyAqdHBwOyB0cHAgPSAmKCp0cHApLT5uZXh0KQorCXsgaWYgKCFzdHJuY21wKCgqdHBwKS0+bmFtZSwgInhtbG5zOiIsIDYpICYmICFzdHJuY21wKCgqdHBwKS0+bmFtZSArIDYsIG5hbWUsIHMgLSBuYW1lKSAmJiAhKCp0cHApLT5uYW1lWzYgKyBzIC0gbmFtZV0pCisJICB7IGlmICghdHAtPm5zKQorICAgICAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNhbm9uaWNhbGl6YXRpb246IHByZWZpeCAlcz0lcCglcylcbiIsIG5hbWUsICgqdHBwKS0+bnMsICgqdHBwKS0+bnMpKTsKKwkgICAgICB0cC0+bnMgPSAoKnRwcCktPm5zOworCSAgICB9CisJICB9CisgICAgICAgICAgZWxzZSBpZiAoc3RybmNtcCgoKnRwcCktPm5hbWUsICJ4bWxucyIsIDUpICYmICgqdHBwKS0+bnMgJiYgdHAtPm5zICYmICgoayA9IHN0cmNtcCgoKnRwcCktPm5zLCB0cC0+bnMpKSA+IDAgfHwgKCFrICYmIHN0cmNtcCgoKnRwcCktPm5hbWUsIG5hbWUpID4gMCkpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHRwLT5uZXh0ID0gKnRwcDsKKyAgICAgICp0cHAgPSB0cDsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeyB0cC0+bmV4dCA9IHNvYXAtPmF0dHJpYnV0ZXM7CisgICAgICBzb2FwLT5hdHRyaWJ1dGVzID0gdHA7CisgICAgfQorICAgIHN0cmNweSh0cC0+bmFtZSwgbmFtZSk7CisgICAgdHAtPnZhbHVlID0gTlVMTDsKKyAgfQorICBlbHNlIGlmICh0cC0+dmlzaWJsZSkKKyAgeyByZXR1cm4gU09BUF9PSzsKKyAgfQorICBlbHNlIGlmICh2YWx1ZSAmJiB0cC0+dmFsdWUgJiYgdHAtPnNpemUgPD0gc3RybGVuKHZhbHVlKSkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWUgYXR0cmlidXRlIHZhbHVlIG9mICVzIChmcmVlICVwKVxuIiwgbmFtZSwgdHAtPnZhbHVlKSk7CisgICAgU09BUF9GUkVFKHNvYXAsIHRwLT52YWx1ZSk7CisgICAgdHAtPnZhbHVlID0gTlVMTDsKKyAgICB0cC0+bnMgPSBOVUxMOworICB9CisgIGlmICh2YWx1ZSkKKyAgeyBpZiAoIXRwLT52YWx1ZSkKKyAgICB7IHRwLT5zaXplID0gc3RybGVuKHZhbHVlKSArIDE7CisgICAgICBpZiAoISh0cC0+dmFsdWUgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgdHAtPnNpemUpKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFsbG9jYXRlIGF0dHJpYnV0ZSB2YWx1ZSBvZiAlcyAoJXApXG4iLCB0cC0+bmFtZSwgdHAtPnZhbHVlKSk7CisgICAgfQorICAgIHN0cmNweSh0cC0+dmFsdWUsIHZhbHVlKTsKKyAgICBpZiAoIXN0cm5jbXAodHAtPm5hbWUsICJ4bWxuczoiLCA2KSkKKyAgICAgIHRwLT5ucyA9IHRwLT52YWx1ZTsKKyAgICB0cC0+dmlzaWJsZSA9IDI7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmICghc3RyY21wKG5hbWUsICJ3c3U6SWQiKSkKKyAgICB7IHNvYXAtPnBhcnQgPSBTT0FQX0JFR0lOX1NFQ1VSSVRZOworICAgICAgc3RybmNweShzb2FwLT5pZCwgdmFsdWUsIHNpemVvZihzb2FwLT5pZCkpOworICAgICAgc29hcC0+aWRbc2l6ZW9mKHNvYXAtPmlkKS0xXSA9ICdcMCc7CisgICAgfQorI2VuZGlmCisgIH0KKyAgZWxzZQorICAgIHRwLT52aXNpYmxlID0gMTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2Nscl9hdHRyKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKnRwOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKSkKKyAgeyB3aGlsZSAoc29hcC0+YXR0cmlidXRlcykKKyAgICB7IHRwID0gc29hcC0+YXR0cmlidXRlcy0+bmV4dDsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5hdHRyaWJ1dGVzLT52YWx1ZSk7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+YXR0cmlidXRlcyk7CisgICAgICBzb2FwLT5hdHRyaWJ1dGVzID0gdHA7CisgICAgfQorICB9CisgIGVsc2UKKyNlbmRpZgorICB7IGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgICAgIHRwLT52aXNpYmxlID0gMDsKKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorc3RhdGljIGludAorc29hcF9nZXRhdHRydmFsKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpzLCBzaXplX3Qgbiwgc29hcF93Y2hhciBkKQoreyByZWdpc3RlciBzaXplX3QgaTsKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgeyByZWdpc3RlciBzb2FwX3djaGFyIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgICBzd2l0Y2ggKGMpCisgICAgeworICAgIGNhc2UgU09BUF9UVDoKKyAgICAgICpzKysgPSAnPCc7CisgICAgICBzb2FwX3VuZ2V0KHNvYXAsICcvJyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTFQ6CisgICAgICAqcysrID0gJzwnOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0dUOgorICAgICAgaWYgKGQgPT0gJyAnKQorICAgICAgeyBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICAqcyA9ICdcMCc7CisgICAgICAgIHJldHVybiBTT0FQX09LOworICAgICAgfQorICAgICAgKnMrKyA9ICc+JzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9RVDoKKyAgICAgIGlmIChjID09IGQpCisgICAgICB7ICpzID0gJ1wwJzsKKyAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgICB9CisgICAgICAqcysrID0gJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0FQOgorICAgICAgaWYgKGMgPT0gZCkKKyAgICAgIHsgKnMgPSAnXDAnOworICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICAgIH0KKyAgICAgICpzKysgPSAnXCcnOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnXHQnOgorICAgIGNhc2UgJ1xuJzoKKyAgICBjYXNlICdccic6CisgICAgY2FzZSAnICc6CisgICAgY2FzZSAnLyc6CisgICAgICBpZiAoZCA9PSAnICcpCisgICAgICB7IHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgICpzID0gJ1wwJzsKKyAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAgICpzKysgPSAoY2hhciljOworICAgIH0KKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFdJVEhfRkFTVAorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zdG9yZV9sYWIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBuKQoreyBzb2FwLT5sYWJpZHggPSAwOworICByZXR1cm4gc29hcF9hcHBlbmRfbGFiKHNvYXAsIHMsIG4pOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBXSVRIX0ZBU1QKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYXBwZW5kX2xhYihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgc2l6ZV90IG4pCit7IGlmIChzb2FwLT5sYWJpZHggKyBuID49IHNvYXAtPmxhYmxlbikKKyAgeyByZWdpc3RlciBjaGFyICp0ID0gc29hcC0+bGFiYnVmOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5sYXJnaW5nIGxvb2stYXNpZGUgYnVmZmVyIHRvIGFwcGVuZCBkYXRhLCBvbGQgc2l6ZT0lbHUiLCAodW5zaWduZWQgbG9uZylzb2FwLT5sYWJsZW4pKTsKKyAgICBpZiAoc29hcC0+bGFibGVuID09IDApCisgICAgICBzb2FwLT5sYWJsZW4gPSBTT0FQX0xBQkxFTjsKKyAgICB3aGlsZSAoc29hcC0+bGFiaWR4ICsgbiA+PSBzb2FwLT5sYWJsZW4pCisgICAgICBzb2FwLT5sYWJsZW4gPDw9IDE7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIsIG5ldyBzaXplPSVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpc29hcC0+bGFibGVuKSk7CisgICAgc29hcC0+bGFiYnVmID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHNvYXAtPmxhYmxlbik7CisgICAgaWYgKCFzb2FwLT5sYWJidWYpCisgICAgeyBpZiAodCkKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHQpOworICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgfQorICAgIGlmICh0KQorICAgIHsgbWVtY3B5KHNvYXAtPmxhYmJ1ZiwgdCwgc29hcC0+bGFiaWR4KTsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCB0KTsKKyAgICB9CisgIH0KKyAgaWYgKHMpCisgIHsgbWVtY3B5KHNvYXAtPmxhYmJ1ZiArIHNvYXAtPmxhYmlkeCwgcywgbik7CisgICAgc29hcC0+bGFiaWR4ICs9IG47CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wZWVrX2VsZW1lbnQoc3RydWN0IHNvYXAgKnNvYXApCit7CisjaWZkZWYgV0lUSF9ET00KKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAqKmF0dCA9IE5VTEw7CisgIHJlZ2lzdGVyIGNoYXIgKmxlYWQgPSBOVUxMOworI2VuZGlmCisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqdHA7CisgIGNvbnN0IGNoYXIgKnQ7CisgIHJlZ2lzdGVyIGNoYXIgKnM7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIGlmIChzb2FwLT5wZWVrZWQpCisgIHsgaWYgKCEqc29hcC0+dGFnKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9OT19UQUc7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgc29hcC0+cGVla2VkID0gMTsKKyAgYyA9IHNvYXBfZ2V0dXRmOChzb2FwKTsKKyNpZmRlZiBXSVRIX0RPTQorICAvKiB3aGl0ZXNwYWNlIGxlYWRpbmcgdG8gc3RhcnQgdGFnIGlzIG5vdCBpbnNpZ25pZmljYW50IGZvciBET00gKi8KKyAgaWYgKHNvYXBfYmxhbmsoYykpCisgIHsgc29hcC0+bGFiaWR4ID0gMDsKKyAgICBkbworICAgIHsgaWYgKHNvYXBfYXBwZW5kX2xhYihzb2FwLCBOVUxMLCAwKSkKKyAgICAgICAgcmV0dXJuIFNPQVBfRU9NOworICAgICAgcyA9IHNvYXAtPmxhYmJ1ZiArIHNvYXAtPmxhYmlkeDsKKyAgICAgIGkgPSBzb2FwLT5sYWJsZW4gLSBzb2FwLT5sYWJpZHg7CisgICAgICBzb2FwLT5sYWJpZHggPSBzb2FwLT5sYWJsZW47CisgICAgICB3aGlsZSAoc29hcF9ibGFuayhjKSAmJiBpLS0pCisgICAgICB7ICpzKysgPSBjOworICAgICAgICBjID0gc29hcF9nZXR1dGY4KHNvYXApOworICAgICAgfQorICAgIH0KKyAgICB3aGlsZSAoc29hcF9ibGFuayhjKSk7CisgICAgKnMgPSAnXDAnOworICAgIGxlYWQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT5sYWJidWYpOworICB9CisjZWxzZQorICB3aGlsZSAoc29hcF9ibGFuayhjKSkKKyAgICBjID0gc29hcF9nZXR1dGY4KHNvYXApOworI2VuZGlmCisgIGlmIChjICE9IFNPQVBfTFQpCisgIHsgKnNvYXAtPnRhZyA9ICdcMCc7CisgICAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworI2lmZGVmIFdJVEhfRE9NCisgICAgLyogd2hpdGVzcGFjZSBsZWFkaW5nIHRvIGVuZCB0YWcgaXMgbm90IGluc2lnbmlmaWNhbnQgZm9yIERPTSAqLworICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICAgICAgc29hcC0+ZG9tLT50YWlsID0gc29hcF9zdHJkdXAoc29hcCwgbGVhZCk7CisjZW5kaWYKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX05PX1RBRzsKKyAgfQorICBzID0gc29hcC0+dGFnOworICBkbyBjID0gc29hcF9nZXQxKHNvYXApOworICB3aGlsZSAoc29hcF9ibGFuayhjKSk7CisgIGkgPSBzaXplb2Yoc29hcC0+dGFnKTsKKyAgd2hpbGUgKGMgIT0gJz4nICYmIGMgIT0gJy8nICYmIHNvYXBfbm90YmxhbmsoYykpCisgIHsgaWYgKC0taSA+IDApCisgICAgICAqcysrID0gKGNoYXIpYzsKKyAgICBjID0gc29hcF9nZXQxKHNvYXApOworICB9CisgIHdoaWxlIChzb2FwX2JsYW5rKGMpKQorICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICpzID0gJ1wwJzsKKyAgc29hcC0+aWRbMF0gPSAnXDAnOworICBzb2FwLT5ocmVmWzBdID0gJ1wwJzsKKyAgc29hcC0+dHlwZVswXSA9ICdcMCc7CisgIHNvYXAtPmFycmF5VHlwZVswXSA9ICdcMCc7CisgIHNvYXAtPmFycmF5U2l6ZVswXSA9ICdcMCc7CisgIHNvYXAtPmFycmF5T2Zmc2V0WzBdID0gJ1wwJzsKKyAgc29hcC0+b3RoZXIgPSAwOworICBzb2FwLT5yb290ID0gLTE7CisgIHNvYXAtPnBvc2l0aW9uID0gMDsKKyAgc29hcC0+bnVsbCA9IDA7CisgIHNvYXAtPm11c3RVbmRlcnN0YW5kID0gMDsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqZWx0OworICAgIGVsdCA9IChzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50KSk7CisgICAgaWYgKCFlbHQpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICBlbHQtPm5leHQgPSBOVUxMOworICAgIGVsdC0+bnN0ciA9IE5VTEw7CisgICAgZWx0LT5uYW1lID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+dGFnKTsKKyAgICBlbHQtPnBybnQgPSBzb2FwLT5kb207CisgICAgZWx0LT5lbHRzID0gTlVMTDsKKyAgICBlbHQtPmF0dHMgPSBOVUxMOworICAgIGVsdC0+ZGF0YSA9IE5VTEw7CisgICAgZWx0LT53aWRlID0gTlVMTDsKKyAgICBlbHQtPnR5cGUgPSAwOworICAgIGVsdC0+bm9kZSA9IE5VTEw7CisgICAgZWx0LT5oZWFkID0gbGVhZDsKKyAgICBlbHQtPnRhaWwgPSBOVUxMOworICAgIGVsdC0+c29hcCA9IHNvYXA7CisgICAgaWYgKHNvYXAtPmRvbSkKKyAgICB7IHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICpwID0gc29hcC0+ZG9tLT5lbHRzOworICAgICAgaWYgKHApCisgICAgICB7IHdoaWxlIChwLT5uZXh0KQorICAgICAgICAgIHAgPSBwLT5uZXh0OworICAgICAgICBwLT5uZXh0ID0gZWx0OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBzb2FwLT5kb20tPmVsdHMgPSBlbHQ7CisgICAgfQorICAgIHNvYXAtPmRvbSA9IGVsdDsKKyAgICBhdHQgPSAmZWx0LT5hdHRzOworICB9CisjZW5kaWYKKyAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICAgIHRwLT52aXNpYmxlID0gMDsKKyAgd2hpbGUgKChpbnQpYyAhPSBFT0YgJiYgYyAhPSAnPicgJiYgYyAhPSAnLycpCisgIHsgcyA9IHNvYXAtPnRtcGJ1ZjsKKyAgICBpID0gc2l6ZW9mKHNvYXAtPnRtcGJ1Zik7CisgICAgd2hpbGUgKGMgIT0gJz0nICYmIGMgIT0gJz4nICYmIGMgIT0gJy8nICYmIHNvYXBfbm90YmxhbmsoYykpCisgICAgeyBpZiAoLS1pID4gMCkKKyAgICAgICAgKnMrKyA9IChjaGFyKWM7CisgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworICAgIH0KKyAgICAqcyA9ICdcMCc7CisgICAgaWYgKGkgPT0gc2l6ZW9mKHNvYXAtPnRtcGJ1ZikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1NZTlRBWF9FUlJPUjsKKyNpZmRlZiBXSVRIX0RPTQorICAgIC8qIGFkZCBhdHRyaWJ1dGUgbmFtZSB0byBkb20gKi8KKyAgICBpZiAoYXR0KQorICAgIHsgKmF0dCA9IChzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSkpOworICAgICAgIGlmICghKmF0dCkKKyAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgICgqYXR0KS0+bmV4dCA9IE5VTEw7CisgICAgICAgKCphdHQpLT5uc3RyID0gTlVMTDsKKyAgICAgICAoKmF0dCktPm5hbWUgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT50bXBidWYpOworICAgICAgICgqYXR0KS0+ZGF0YSA9IE5VTEw7CisgICAgICAgKCphdHQpLT53aWRlID0gTlVMTDsKKyAgICAgICAoKmF0dCktPnNvYXAgPSBzb2FwOworICAgIH0KKyNlbmRpZgorICAgIGlmICghc3RybmNtcChzb2FwLT50bXBidWYsICJ4bWxucyIsIDUpKQorICAgIHsgaWYgKHNvYXAtPnRtcGJ1Zls1XSA9PSAnOicpCisgICAgICB7IHNvYXAtPnRtcGJ1Zls1XSA9ICdcMCc7CisgICAgICAgIHQgPSBzb2FwLT50bXBidWYgKyA2OworICAgICAgfQorICAgICAgZWxzZSBpZiAoc29hcC0+dG1wYnVmWzVdKQorICAgICAgICB0ID0gTlVMTDsKKyAgICAgIGVsc2UKKyAgICAgICAgdCA9IFNPQVBfU1RSX0VPUzsKKyAgICB9CisgICAgZWxzZQorICAgICAgdCA9IE5VTEw7CisgICAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICAgIHsgaWYgKCFTT0FQX1NUUkNNUCh0cC0+bmFtZSwgc29hcC0+dG1wYnVmKSkKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghdHApCisgICAgeyB0cCA9IChzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUpICsgc3RybGVuKHNvYXAtPnRtcGJ1ZikpOworICAgICAgaWYgKCF0cCkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICBzdHJjcHkodHAtPm5hbWUsIHNvYXAtPnRtcGJ1Zik7CisgICAgICB0cC0+dmFsdWUgPSBOVUxMOworICAgICAgdHAtPnNpemUgPSAwOworICAgICAgdHAtPm5leHQgPSBzb2FwLT5hdHRyaWJ1dGVzOworICAgICAgc29hcC0+YXR0cmlidXRlcyA9IHRwOworICAgIH0KKyAgICB3aGlsZSAoc29hcF9ibGFuayhjKSkKKyAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgaWYgKGMgPT0gJz0nKQorICAgIHsgZG8gYyA9IHNvYXBfZ2V0dXRmOChzb2FwKTsKKyAgICAgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyAgICAgIGlmIChjICE9IFNPQVBfUVQgJiYgYyAhPSBTT0FQX0FQKQorICAgICAgeyBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICBjID0gJyAnOyAvKiBibGFuayBkZWxpbWl0ZXIgKi8KKyAgICAgIH0KKyAgICAgIGlmIChzb2FwX2dldGF0dHJ2YWwoc29hcCwgdHAtPnZhbHVlLCB0cC0+c2l6ZSwgYykpCisgICAgICB7CisjaWZkZWYgV0lUSF9GQVNUCisgICAgICAgIGlmIChzb2FwLT5lcnJvciAhPSBTT0FQX0VPTSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKwlpZiAoc29hcF9zdG9yZV9sYWIoc29hcCwgdHAtPnZhbHVlLCB0cC0+c2l6ZSkpCisJICByZXR1cm4gc29hcC0+ZXJyb3I7CisJaWYgKHRwLT52YWx1ZSkKKwkgIFNPQVBfRlJFRShzb2FwLCB0cC0+dmFsdWUpOworCWZvciAoOzspCisJeyBpZiAoc29hcF9nZXRhdHRydmFsKHNvYXAsIHNvYXAtPmxhYmJ1ZiArIHNvYXAtPmxhYmlkeCwgc29hcC0+bGFibGVuIC0gc29hcC0+bGFiaWR4LCBjKSkKKwkgIHsgaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfRU9NKQorCSAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKwkgICAgc29hcC0+bGFiaWR4ID0gc29hcC0+bGFibGVuOworCSAgICBpZiAoc29hcF9hcHBlbmRfbGFiKHNvYXAsIE5VTEwsIDApKQorCSAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKwkgIH0KKwkgIGVsc2UKKwkgICAgYnJlYWs7CisJfQorCWlmIChzb2FwLT5sYWJpZHgpCisgICAgICAgICAgdHAtPnNpemUgPSBzb2FwLT5sYWJsZW47CisJZWxzZQorCXsgdHAtPnNpemUgPSBzdHJsZW4oc29hcC0+bGFiYnVmKSArIDE7CisgICAgICAgICAgaWYgKHRwLT5zaXplIDwgU09BUF9MQUJMRU4pCisJICAgIHRwLT5zaXplID0gU09BUF9MQUJMRU47CisgICAgICAgIH0KKwlpZiAoISh0cC0+dmFsdWUgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgdHAtPnNpemUpKSkKKwkgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgICBzdHJjcHkodHAtPnZhbHVlLCBzb2FwLT5sYWJidWYpOworI2Vsc2UKKwlzaXplX3QgbjsKKyAgICAgICAgaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfRU9NKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICAgICAgICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBmb3IgKDs7KQorICAgICAgICB7IGlmICghKHMgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIFNPQVBfQkxLTEVOKSkpCisgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgICAgaWYgKHNvYXBfZ2V0YXR0cnZhbChzb2FwLCBzLCBTT0FQX0JMS0xFTiwgYykpCisgICAgICAgICAgeyBpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9FT00pCisgICAgICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwluID0gdHAtPnNpemUgKyBzb2FwLT5ibGlzdC0+c2l6ZTsKKyAgICAgICAgaWYgKCEocyA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBuKSkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICAgIGlmICh0cC0+dmFsdWUpCisgICAgICAgIHsgbWVtY3B5KHMsIHRwLT52YWx1ZSwgdHAtPnNpemUpOworICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCB0cC0+dmFsdWUpOworICAgICAgICB9CisgICAgICAgIHNvYXBfc2F2ZV9ibG9jayhzb2FwLCBzICsgdHAtPnNpemUsIDApOworICAgICAgICB0cC0+dmFsdWUgPSBzOworICAgICAgICB0cC0+c2l6ZSA9IG47CisjZW5kaWYKKyAgICAgIH0KKyAgICAgIGRvIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICB3aGlsZSAoc29hcF9ibGFuayhjKSk7CisgICAgICB0cC0+dmlzaWJsZSA9IDI7IC8qIHNlZW4gdGhpcyBhdHRyaWJ1dGUgdy8gdmFsdWUgKi8KKyNpZmRlZiBXSVRIX0RPTQorICAgICAgaWYgKGF0dCkKKyAgICAgICAgKCphdHQpLT5kYXRhID0gc29hcF9zdHJkdXAoc29hcCwgdHAtPnZhbHVlKTsKKyNlbmRpZgorICAgIH0KKyAgICBlbHNlCisgICAgICB0cC0+dmlzaWJsZSA9IDE7IC8qIHNlZW4gdGhpcyBhdHRyaWJ1dGUgdy9vIHZhbHVlICovCisjaWZkZWYgV0lUSF9ET00KKyAgICBpZiAoYXR0KQorICAgICAgYXR0ID0gJigqYXR0KS0+bmV4dDsKKyNlbmRpZgorICAgIGlmICh0ICYmIHRwLT52YWx1ZSkKKyAgICB7IGlmIChzb2FwX3B1c2hfbmFtZXNwYWNlKHNvYXAsIHQsIHRwLT52YWx1ZSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHRwLT52aXNpYmxlID0gMDsKKyAgICB9CisgIH0KKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoYXR0KQorICB7IHNvYXAtPmRvbS0+bnN0ciA9IHNvYXBfY3VycmVudF9uYW1lc3BhY2Uoc29hcCwgc29hcC0+dGFnKTsKKyAgICBmb3IgKGF0dCA9ICZzb2FwLT5kb20tPmF0dHM7ICphdHQ7IGF0dCA9ICYoKmF0dCktPm5leHQpCisgICAgICAoKmF0dCktPm5zdHIgPSBzb2FwX2N1cnJlbnRfbmFtZXNwYWNlKHNvYXAsICgqYXR0KS0+bmFtZSk7CisgIH0KKyNlbmRpZgorICBpZiAoKGludCljID09IEVPRikKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgaWYgKCEoc29hcC0+Ym9keSA9IChjICE9ICcvJykpKQorICAgIGRvIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworI2lmZGVmIFdJVEhfRE9NCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKQorICB7IGlmICghc29hcC0+Ym9keSAmJiBzb2FwLT5kb20tPnBybnQpCisgICAgICBzb2FwLT5kb20gPSBzb2FwLT5kb20tPnBybnQ7CisgIH0KKyNlbmRpZgorICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgIHsgaWYgKHRwLT52aXNpYmxlICYmIHRwLT52YWx1ZSkKKyAgICB7IGlmICghc3RyY21wKHRwLT5uYW1lLCAiaWQiKSkKKyAgICAgIHsgKnNvYXAtPmlkID0gJyMnOworICAgICAgICBzdHJuY3B5KHNvYXAtPmlkICsgMSwgdHAtPnZhbHVlLCBzaXplb2Yoc29hcC0+aWQpIC0gMik7CisgICAgICAgIHNvYXAtPmlkW3NpemVvZihzb2FwLT5pZCktMV0gPSAnXDAnOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIXN0cmNtcCh0cC0+bmFtZSwgImhyZWYiKSkKKyAgICAgIHsgc3RybmNweShzb2FwLT5ocmVmLCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT5ocmVmKSAtIDEpOworICAgICAgICBzb2FwLT5ocmVmW3NpemVvZihzb2FwLT5ocmVmKS0xXSA9ICdcMCc7CisgICAgICB9CisgICAgICBlbHNlIGlmICgoc29hcC0+dmVyc2lvbiA9PSAyIHx8IChzb2FwLT5tb2RlICYgU09BUF9YTUxfR1JBUEgpKSAmJiAhc3RyY21wKHRwLT5uYW1lLCAicmVmIikpCisgICAgICB7ICpzb2FwLT5ocmVmID0gJyMnOworICAgICAgICBzdHJuY3B5KHNvYXAtPmhyZWYgKyAxLCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT5ocmVmKSAtIDIpOworICAgICAgICBzb2FwLT5ocmVmW3NpemVvZihzb2FwLT5ocmVmKS0xXSA9ICdcMCc7CisgICAgICB9CisgICAgICBlbHNlIGlmICghc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJ4c2k6dHlwZSIpKQorICAgICAgeyBzdHJuY3B5KHNvYXAtPnR5cGUsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPnR5cGUpIC0gMSk7CisgICAgICAgIHNvYXAtPnR5cGVbc2l6ZW9mKHNvYXAtPnR5cGUpLTFdID0gJ1wwJzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHNvYXAtPnZlcnNpb24gPT0gMSAmJiAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOQzphcnJheVR5cGUiKSkKKyAgICAgIHsgcyA9IHNvYXBfc3RycmNocih0cC0+dmFsdWUsICdbJyk7CisgICAgICAgIGlmIChzICYmIChzaXplX3QpKHMgLSB0cC0+dmFsdWUpIDwgc2l6ZW9mKHNvYXAtPmFycmF5VHlwZSkpCisgICAgICAgIHsgc3RybmNweShzb2FwLT5hcnJheVR5cGUsIHRwLT52YWx1ZSwgcyAtIHRwLT52YWx1ZSk7CisgICAgICAgICAgc29hcC0+YXJyYXlUeXBlW3MgLSB0cC0+dmFsdWVdID0gJ1wwJzsKKyAgICAgICAgICBzdHJuY3B5KHNvYXAtPmFycmF5U2l6ZSwgcywgc2l6ZW9mKHNvYXAtPmFycmF5U2l6ZSkgLSAxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgc3RybmNweShzb2FwLT5hcnJheVR5cGUsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPmFycmF5VHlwZSkgLSAxKTsKKyAgICAgICAgc29hcC0+YXJyYXlTaXplW3NpemVvZihzb2FwLT5hcnJheVR5cGUpLTFdID0gJ1wwJzsKKyAgICAgICAgc29hcC0+YXJyYXlUeXBlW3NpemVvZihzb2FwLT5hcnJheVR5cGUpLTFdID0gJ1wwJzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHNvYXAtPnZlcnNpb24gPT0gMiAmJiAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOQzppdGVtVHlwZSIpKQorICAgICAgICBzdHJuY3B5KHNvYXAtPmFycmF5VHlwZSwgdHAtPnZhbHVlLCBzaXplb2Yoc29hcC0+YXJyYXlUeXBlKSAtIDEpOworICAgICAgZWxzZSBpZiAoc29hcC0+dmVyc2lvbiA9PSAyICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5DOmFycmF5U2l6ZSIpKQorICAgICAgICBzdHJuY3B5KHNvYXAtPmFycmF5U2l6ZSwgdHAtPnZhbHVlLCBzaXplb2Yoc29hcC0+YXJyYXlTaXplKSAtIDEpOworICAgICAgZWxzZSBpZiAoc29hcC0+dmVyc2lvbiA9PSAxICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5DOm9mZnNldCIpKQorICAgICAgICBzdHJuY3B5KHNvYXAtPmFycmF5T2Zmc2V0LCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT5hcnJheU9mZnNldCkpOworICAgICAgZWxzZSBpZiAoc29hcC0+dmVyc2lvbiA9PSAxICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5DOnBvc2l0aW9uIikpCisgICAgICAgIHNvYXAtPnBvc2l0aW9uID0gc29hcF9nZXRwb3NpdGlvbih0cC0+dmFsdWUsIHNvYXAtPnBvc2l0aW9ucyk7CisgICAgICBlbHNlIGlmIChzb2FwLT52ZXJzaW9uID09IDEgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTkM6cm9vdCIpKQorICAgICAgICBzb2FwLT5yb290ID0gKCghc3RyY21wKHRwLT52YWx1ZSwgIjEiKSB8fCAhc3RyY21wKHRwLT52YWx1ZSwgInRydWUiKSkpOworICAgICAgZWxzZSBpZiAoKHNvYXAtPnZlcnNpb24gPT0gMSAmJiAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOVjphY3RvciIpKQorICAgICAgICAgICAgfHwgKHNvYXAtPnZlcnNpb24gPT0gMiAmJiAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOVjpyb2xlIikpKQorICAgICAgeyBpZiAoKCFzb2FwLT5hY3RvciB8fCBzdHJjbXAoc29hcC0+YWN0b3IsIHRwLT52YWx1ZSkpCisgICAgICAgICAmJiBzdHJjbXAodHAtPnZhbHVlLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9hY3Rvci9uZXh0IikKKyAgICAgICAgICYmIHN0cmNtcCh0cC0+dmFsdWUsICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUvcm9sZS9uZXh0IikpCisgICAgICAgICAgc29hcC0+b3RoZXIgPSAxOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTlY6bXVzdFVuZGVyc3RhbmQiKQorICAgICAgICAgICAgJiYgKCFzdHJjbXAodHAtPnZhbHVlLCAiMSIpIHx8ICFzdHJjbXAodHAtPnZhbHVlLCAidHJ1ZSIpKSkKKyAgICAgICAgc29hcC0+bXVzdFVuZGVyc3RhbmQgPSAxOworICAgICAgZWxzZSBpZiAoKCFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgInhzaTpudWxsIikKKyAgICAgICAgICAgICB8fCAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJ4c2k6bmlsIikpCisgICAgICAgICAgICAmJiAoIXN0cmNtcCh0cC0+dmFsdWUsICIxIikKKyAgICAgICAgICAgICB8fCAhc3RyY21wKHRwLT52YWx1ZSwgInRydWUiKSkpCisgICAgICAgIHNvYXAtPm51bGwgPSAxOworICAgIH0KKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9yZXRyeShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICBzb2FwX3JldmVydChzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfcmV2ZXJ0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoIXNvYXAtPnBlZWtlZCkKKyAgeyBzb2FwLT5wZWVrZWQgPSAxOworICAgIGlmIChzb2FwLT5ib2R5KQorICAgICAgc29hcC0+bGV2ZWwtLTsKKyAgfQorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJldmVydGluZyBsYXN0IGVsZW1lbnQgKGxldmVsPSV1KVxuIiwgc29hcC0+bGV2ZWwpKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zdHJpbmdfb3V0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBpbnQgZmxhZykKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqdDsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICByZWdpc3RlciBzb2FwX3djaGFyIG1hc2sgPSAweEZGRkZGRjgwVUw7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgc29hcC0+ZG9tLT5kYXRhID0gc29hcF9zdHJkdXAoc29hcCwgcyk7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNlbmRpZgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfQ19VVEZTVFJJTkcpCisgICAgbWFzayA9IDA7CisgIHQgPSBzOworICB3aGlsZSAoKGMgPSAqdCsrKSkKKyAgeyBzd2l0Y2ggKGMpCisgICAgeyAKKyAgICBjYXNlIDk6CisgICAgICBpZiAoZmxhZykKKyAgICAgIHsgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICImI3g5OyIsIDUpKQorCSAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBzID0gdDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTA6CisgICAgICBpZiAoZmxhZyB8fCAhKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpKQorICAgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIiYjeEE7IiwgNSkpCisJICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHMgPSB0OworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAxMzoKKyAgICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiJiN4RDsiLCA1KSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgcyA9IHQ7CisgICAgICBicmVhazsKKyAgICBjYXNlICcmJzoKKyAgICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiJmFtcDsiLCA1KSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgcyA9IHQ7CisgICAgICBicmVhazsKKyAgICBjYXNlICc8JzoKKyAgICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiJmx0OyIsIDQpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBzID0gdDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJz4nOgorICAgICAgaWYgKCFmbGFnKQorICAgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIiZndDsiLCA0KSkKKwkgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgcyA9IHQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICciJzoKKyAgICAgIGlmIChmbGFnKQorICAgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIiZxdW90OyIsIDYpKQorCSAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBzID0gdDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZkZWYgSEFWRV9NQlRPV0MKKyAgICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9DX01CU1RSSU5HKQorICAgICAgeyB3Y2hhcl90IHdjOworICAgICAgICByZWdpc3RlciBpbnQgbSA9IG1idG93Yygmd2MsIHQgLSAxLCBNQl9DVVJfTUFYKTsKKyAgICAgICAgaWYgKG0gPiAwICYmIHdjICE9IGMpCisgICAgICAgIHsgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3B1dHV0Zjgoc29hcCwgd2MpKQorICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworCSAgcyA9IHQgKz0gbSAtIDE7CisJICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisjZW5kaWYKKyAgICAgIGlmIChjICYgbWFzaykKKyAgICAgIHsgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3B1dHV0Zjgoc29hcCwgKHVuc2lnbmVkIGNoYXIpYykpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBzID0gdDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9zdHJpbmdfaW4oc3RydWN0IHNvYXAgKnNvYXAsIGludCBmbGFnLCBsb25nIG1pbmxlbiwgbG9uZyBtYXhsZW4pCit7IHJlZ2lzdGVyIGNoYXIgKnM7CisgIGNoYXIgKnQgPSBOVUxMOworICByZWdpc3RlciBzaXplX3QgaTsKKyAgcmVnaXN0ZXIgbG9uZyBsID0gMDsKKyAgcmVnaXN0ZXIgaW50IG4gPSAwOworICByZWdpc3RlciBpbnQgbSA9IDA7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyNpZiAhZGVmaW5lZChXSVRIX0xFQU5FUikgJiYgZGVmaW5lZChIQVZFX1dDVE9NQikKKyAgY2hhciBidWZbTUJfTEVOX01BWCA+IDggPyBNQl9MRU5fTUFYIDogOF07CisjZWxzZQorICBjaGFyIGJ1Zls4XTsKKyNlbmRpZgorICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVhZGluZyBzdHJpbmcgY29udGVudFxuIikpOworICBpZiAoc29hcC0+cGVla2VkKQorICB7IGlmICghc29hcC0+Ym9keSkKKyAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgqc29hcC0+dGFnKQorICAgIHsgbiA9IDE7CisgICAgICBzb2FwLT5wZWVrZWQgPSAwOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIHQgPSBzb2FwLT50bXBidWY7CisgICAgICB0WzBdID0gJzwnOworICAgICAgc3RybmNweSh0ICsgMSwgc29hcC0+dGFnLCBzaXplb2Yoc29hcC0+dG1wYnVmKSAtIDEpOworICAgICAgc3RybmNhdCh0LCAiPiIsIHNpemVvZihzb2FwLT50bXBidWYpKTsKKyAgICAgIG0gPSBzdHJsZW4oc29hcC0+dGFnKSArIDI7CisjZW5kaWYKKyAgICB9CisgIH0KKyNpZmRlZiBXSVRIX0NEQVRBCisgIGlmICghZmxhZykKKyAgeyByZWdpc3RlciBpbnQgc3RhdGUgPSAwOworI2lmZGVmIFdJVEhfRkFTVAorICAgIHNvYXAtPmxhYmlkeCA9IDA7CQkJLyogdXNlIGxvb2stYXNpZGUgYnVmZmVyICovCisjZWxzZQorICAgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgICAgZm9yICg7OykKKyAgICB7IAorI2lmZGVmIFdJVEhfRkFTVAorICAgICAgcmVnaXN0ZXIgc2l6ZV90IGs7CisgICAgICBpZiAoc29hcF9hcHBlbmRfbGFiKHNvYXAsIE5VTEwsIDApKQkvKiBhbGxvY2F0ZSBtb3JlIHNwYWNlIGluIGxvb2stYXNpZGUgYnVmZmVyIGlmIG5lY2Vzc2FyeSAqLworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIHMgPSBzb2FwLT5sYWJidWYgKyBzb2FwLT5sYWJpZHg7CS8qIHNwYWNlIHRvIHBvcHVsYXRlICovCisgICAgICBrID0gc29hcC0+bGFibGVuIC0gc29hcC0+bGFiaWR4OwkvKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlICovCisgICAgICBzb2FwLT5sYWJpZHggPSBzb2FwLT5sYWJsZW47CS8qIGNsYWltIHRoaXMgc3BhY2UgKi8KKyNlbHNlCisgICAgICByZWdpc3RlciBzaXplX3QgayA9IFNPQVBfQkxLTEVOOworICAgICAgaWYgKCEocyA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgaykpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICAgICAgZm9yIChpID0gMDsgaSA8IGs7IGkrKykKKyAgICAgIHsgaWYgKG0gPiAwKQorICAgICAgICB7ICpzKysgPSAqdCsrOwkvKiBjb3B5IG11bHRpYnl0ZSBjaGFyYWN0ZXJzICovCisJICBtLS07CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKwlpZiAoKGludCljID09IEVPRikKKyAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgaWYgKGMgPj0gMHg4MCAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19MQVRJTikpCisgICAgICAgIHsgc29hcF91bmdldChzb2FwLCBjKTsKKwkgIGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisJICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfQ19VVEZTVFJJTkcpCisgICAgICAgICAgeyBpZiAoKGMgJiAweDgwMDAwMDAwKSAmJiBjID49IC0weDdGRkZGRjgwICYmIGMgPCBTT0FQX0FQKQorICAgICAgICAgICAgeyBjICY9IDB4N0ZGRkZGRkY7CisgICAgICAgICAgICAgIHQgPSBidWY7CisgICAgICAgICAgICAgIGlmIChjIDwgMHgwODAwKQorICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhDMCB8ICgoYyA+PiA2KSAmIDB4MUYpKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7IGlmIChjIDwgMHgwMTAwMDApCisgICAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RTAgfCAoKGMgPj4gMTIpICYgMHgwRikpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7IGlmIChjIDwgMHgyMDAwMDApCisgICAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhGMCB8ICgoYyA+PiAxOCkgJiAweDA3KSk7CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICB7IGlmIChjIDwgMHgwNDAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjggfCAoKGMgPj4gMjQpICYgMHgwMykpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsgKnQrKyA9IChjaGFyKSgweEZDIHwgKChjID4+IDMwKSAmIDB4MDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMjQpICYgMHgzRikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAxOCkgJiAweDNGKSk7CisgICAgICAgICAgICAgICAgICB9ICAgICAKKyAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAxMikgJiAweDNGKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoYyAmIDB4M0YpKTsKKwkgICAgICBtID0gKGludCkodCAtIGJ1ZikgLSAxOworICAgICAgICAgICAgICB0ID0gYnVmOworICAgICAgICAgICAgICAqcysrID0gKnQrKzsKKyAgICAgICAgICAgICAgY29udGludWU7CisJICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKwlzd2l0Y2ggKHN0YXRlKQorICAgICAgICB7IGNhc2UgMToKKyAgICAgICAgICAgIGlmIChjID09ICddJykKKwkgICAgICBzdGF0ZSA9IDQ7CisJICAgICpzKysgPSBjOworCSAgICBjb250aW51ZTsKKwkgIGNhc2UgMjoKKwkgICAgaWYgKGMgPT0gJy0nKQorICAgICAgICAgICAgICBzdGF0ZSA9IDY7CisJICAgICpzKysgPSBjOworCSAgICBjb250aW51ZTsKKwkgIGNhc2UgMzoKKwkgICAgaWYgKGMgPT0gJz8nKQorCSAgICAgIHN0YXRlID0gODsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworICAgICAgICAgIC8qIENEQVRBICovCisJICBjYXNlIDQ6CisJICAgIGlmIChjID09ICddJykKKyAgICAgICAgICAgICAgc3RhdGUgPSA1OworCSAgICBlbHNlCisJICAgICAgc3RhdGUgPSAxOworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisJICBjYXNlIDU6CisJICAgIGlmIChjID09ICc+JykKKwkgICAgICBzdGF0ZSA9IDA7CisJICAgIGVsc2UKKwkgICAgICBzdGF0ZSA9IDE7CisJICAgICpzKysgPSBjOworCSAgICBjb250aW51ZTsKKyAgICAgICAgICAvKiBjb21tZW50ICovCisgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgaWYgKGMgPT0gJy0nKQorCSAgICAgIHN0YXRlID0gNzsKKwkgICAgZWxzZQorCSAgICAgIHN0YXRlID0gMjsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIGlmIChjID09ICc+JykKKwkgICAgICBzdGF0ZSA9IDA7CisJICAgIGVsc2UKKwkgICAgICBzdGF0ZSA9IDI7CisJICAgICpzKysgPSBjOworCSAgICBjb250aW51ZTsKKyAgICAgICAgICAvKiBQSSAqLworCSAgY2FzZSA4OgorICAgICAgICAgICAgaWYgKGMgPT0gJz4nKQorCSAgICAgIHN0YXRlID0gMDsKKwkgICAgZWxzZQorCSAgICAgIHN0YXRlID0gMzsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoYykKKyAgICAgICAgeworICAgICAgICBjYXNlICcvJzoKKyAgICAgICAgICBpZiAobiA+IDApCisgICAgICAgICAgeyBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICAgICAgICAgICAgaWYgKGMgPT0gJz4nKQorICAgICAgICAgICAgICBuLS07CisgICAgICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICAgIH0KKyAgICAgICAgICAqcysrID0gJy8nOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICc8JzoKKwkgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisJICBpZiAoYyA9PSAnLycpCisJICB7IGlmIChuID09IDApCisJICAgIHsgYyA9IFNPQVBfVFQ7CisJICAgICAgZ290byBlbmQ7CisJICAgIH0KKwkgICAgbi0tOworCSAgfQorCSAgZWxzZSBpZiAoYyA9PSAnIScpCisJICB7IGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisJICAgIGlmIChjID09ICdbJykKKyAgICAgICAgICAgIHsgZG8gYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgICAgICAgICAgICAgd2hpbGUgKChpbnQpYyAhPSBFT0YgJiYgYyAhPSAnWycpOworICAgICAgICAgICAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgICAgICAgICAgZ290byBlbmQ7CisJICAgICAgdCA9IChjaGFyKikiIVtDREFUQVsiOworCSAgICAgIG0gPSA4OworCSAgICAgIHN0YXRlID0gMTsKKwkgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnLScpCisJICAgIHsgaWYgKChjID0gc29hcF9nZXRjaGFyKHNvYXApKSA9PSAnLScpCisJICAgICAgICBzdGF0ZSA9IDI7CisJICAgICAgdCA9IChjaGFyKikiIS0iOworCSAgICAgIG0gPSAyOworCSAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7IHQgPSAoY2hhciopIiEiOworCSAgICAgIG0gPSAxOworCSAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisJICAgIH0KKwkgICAgKnMrKyA9ICc8JzsKKwkgICAgYnJlYWs7CisJICB9CisJICBlbHNlIGlmIChjID09ICc/JykKKwkgICAgc3RhdGUgPSAzOworCSAgZWxzZQorCSAgICBuKys7CisgICAgICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgICAqcysrID0gJzwnOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICc+JzoKKyAgICAgICAgICAqcysrID0gJz4nOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICAqcysrID0gJyInOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmZGVmIEhBVkVfV0NUT01CCisgICAgICAgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0NfTUJTVFJJTkcpCisgICAgICAgICAgeyBtID0gd2N0b21iKGJ1ZiwgYyAmIDB4N0ZGRkZGRkYpOworICAgICAgICAgICAgaWYgKG0gPj0gMSAmJiBtIDw9IChpbnQpTUJfQ1VSX01BWCkKKyAgICAgICAgICAgIHsgdCA9IGJ1ZjsKKyAgICAgICAgICAgICAgKnMrKyA9ICp0Kys7CisgICAgICAgICAgICAgIG0tLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgKnMrKyA9IFNPQVBfVU5LTk9XTl9DSEFSOworCSAgICAgIG0gPSAwOworCSAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyNlbmRpZgorI2VuZGlmCisgICAgICAgICAgICAqcysrID0gKGNoYXIpKGMgJiAweEZGKTsKKyAgICAgICAgfQorCWwrKzsKKyAgICAgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiBtYXhsZW4gPj0gMCAmJiBsID4gbWF4bGVuKQorICAgICAgICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJTdHJpbmcgdG9vIGxvbmc6IG1heGxlbj0lbGRcbiIsIG1heGxlbikpOworICAgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9MRU5HVEg7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyNlbmRpZgorI2lmZGVmIFdJVEhfRkFTVAorICBzb2FwLT5sYWJpZHggPSAwOwkJCS8qIHVzZSBsb29rLWFzaWRlIGJ1ZmZlciAqLworI2Vsc2UKKyAgaWYgKHNvYXBfbmV3X2Jsb2NrKHNvYXApKQorICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgIGZvciAoOzspCisgIHsgCisjaWZkZWYgV0lUSF9GQVNUCisgICAgcmVnaXN0ZXIgc2l6ZV90IGs7CisgICAgaWYgKHNvYXBfYXBwZW5kX2xhYihzb2FwLCBOVUxMLCAwKSkJLyogYWxsb2NhdGUgbW9yZSBzcGFjZSBpbiBsb29rLWFzaWRlIGJ1ZmZlciBpZiBuZWNlc3NhcnkgKi8KKyAgICAgIHJldHVybiBOVUxMOworICAgIHMgPSBzb2FwLT5sYWJidWYgKyBzb2FwLT5sYWJpZHg7CS8qIHNwYWNlIHRvIHBvcHVsYXRlICovCisgICAgayA9IHNvYXAtPmxhYmxlbiAtIHNvYXAtPmxhYmlkeDsJLyogbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSAqLworICAgIHNvYXAtPmxhYmlkeCA9IHNvYXAtPmxhYmxlbjsJLyogY2xhaW0gdGhpcyBzcGFjZSAqLworI2Vsc2UKKyAgICByZWdpc3RlciBzaXplX3QgayA9IFNPQVBfQkxLTEVOOworICAgIGlmICghKHMgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIGspKSkKKyAgICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgICAgZm9yIChpID0gMDsgaSA8IGs7IGkrKykKKyAgICB7IGlmIChtID4gMCkKKyAgICAgIHsgKnMrKyA9ICp0Kys7CS8qIGNvcHkgbXVsdGlieXRlIGNoYXJhY3RlcnMgKi8KKyAgICAgICAgbS0tOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9DX1VURlNUUklORykKKyAgICAgIHsgaWYgKCgoYyA9IHNvYXBfZ2V0KHNvYXApKSAmIDB4ODAwMDAwMDApICYmIGMgPj0gLTB4N0ZGRkZGODAgJiYgYyA8IFNPQVBfQVApCisgICAgICAgIHsgYyAmPSAweDdGRkZGRkZGOworICAgICAgICAgIHQgPSBidWY7CisgICAgICAgICAgaWYgKGMgPCAweDA4MDApCisgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4QzAgfCAoKGMgPj4gNikgJiAweDFGKSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsgaWYgKGMgPCAweDAxMDAwMCkKKyAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEUwIHwgKChjID4+IDEyKSAmIDB4MEYpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgaWYgKGMgPCAweDIwMDAwMCkKKyAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjAgfCAoKGMgPj4gMTgpICYgMHgwNykpOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsgaWYgKGMgPCAweDA0MDAwMDAwKQorICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEY4IHwgKChjID4+IDI0KSAmIDB4MDMpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeyAqdCsrID0gKGNoYXIpKDB4RkMgfCAoKGMgPj4gMzApICYgMHgwMSkpOworICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDI0KSAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDE4KSAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgfSAgICAgCisgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAxMikgJiAweDNGKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gNikgJiAweDNGKSk7CisgICAgICAgICAgfQorICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8IChjICYgMHgzRikpOworCSAgbSA9IChpbnQpKHQgLSBidWYpIC0gMTsKKyAgICAgICAgICB0ID0gYnVmOworICAgICAgICAgICpzKysgPSAqdCsrOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisgICAgICBzd2l0Y2ggKGMpCisgICAgICB7CisgICAgICBjYXNlIFNPQVBfVFQ6CisgICAgICAgIGlmIChuID09IDApCisgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIG4tLTsKKyAgICAgICAgKnMrKyA9ICc8JzsKKyAgICAgICAgdCA9IChjaGFyKikiLyI7CisJbSA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTT0FQX0xUOgorICAgICAgICBuKys7CisgICAgICAgICpzKysgPSAnPCc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTT0FQX0dUOgorICAgICAgICAqcysrID0gJz4nOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9RVDoKKyAgICAgICAgKnMrKyA9ICciJzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfQVA6CisgICAgICAgICpzKysgPSAnXCcnOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJy8nOgorICAgICAgICBpZiAobiA+IDApCisgICAgICAgIHsgYyA9IHNvYXBfZ2V0KHNvYXApOworICAgICAgICAgIGlmIChjID09IFNPQVBfR1QpCisgICAgICAgICAgICBuLS07CisgICAgICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgfQorICAgICAgICAqcysrID0gJy8nOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJzwnIHwgMHg4MDAwMDAwMDoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9ICc8JzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAnJic7CisgICAgICAgICAgdCA9IChjaGFyKikibHQ7IjsKKwkgIG0gPSAzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnPicgfCAweDgwMDAwMDAwOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gJz4nOworICAgICAgICBlbHNlCisgICAgICAgIHsgKnMrKyA9ICcmJzsKKyAgICAgICAgICB0ID0gKGNoYXIqKSJndDsiOworCSAgbSA9IDM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICcmJyB8IDB4ODAwMDAwMDA6CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICpzKysgPSAnJic7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAqcysrID0gJyYnOworICAgICAgICAgIHQgPSAoY2hhciopImFtcDsiOworCSAgbSA9IDQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICciJyB8IDB4ODAwMDAwMDA6CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICpzKysgPSAnIic7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAqcysrID0gJyYnOworICAgICAgICAgIHQgPSAoY2hhciopInF1b3Q7IjsKKwkgIG0gPSA1OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnXCcnIHwgMHg4MDAwMDAwMDoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9ICdcJyc7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAqcysrID0gJyYnOworICAgICAgICAgIHQgPSAoY2hhciopImFwb3M7IjsKKwkgIG0gPSA1OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgICAgZ290byBlbmQ7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZkZWYgSEFWRV9XQ1RPTUIKKyAgICAgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0NfTUJTVFJJTkcpCisgICAgICAgIHsgbSA9IHdjdG9tYihidWYsIGMgJiAweDdGRkZGRkZGKTsKKyAgICAgICAgICBpZiAobSA+PSAxICYmIG0gPD0gKGludClNQl9DVVJfTUFYKQorICAgICAgICAgIHsgdCA9IGJ1ZjsKKyAgICAgICAgICAgICpzKysgPSAqdCsrOworICAgICAgICAgICAgbS0tOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeyAqcysrID0gU09BUF9VTktOT1dOX0NIQVI7CisJICAgIG0gPSAwOworCSAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZgorI2VuZGlmCisgICAgICAgICAgKnMrKyA9IChjaGFyKShjICYgMHhGRik7CisgICAgICB9CisgICAgICBsKys7CisgICAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIG1heGxlbiA+PSAwICYmIGwgPiBtYXhsZW4pCisgICAgICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJTdHJpbmcgdG9vIGxvbmc6IG1heGxlbj0lbGRcbiIsIG1heGxlbikpOworICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfTEVOR1RIOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICB9CisgIH0KK2VuZDoKKyAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgKnMgPSAnXDAnOworI2lmZGVmIFdJVEhfRkFTVAorICB0ID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+bGFiYnVmKTsKKyNlbHNlCisgIHNvYXBfc2l6ZV9ibG9jayhzb2FwLCBpKzEpOworICB0ID0gc29hcF9zYXZlX2Jsb2NrKHNvYXAsIE5VTEwsIDApOworI2VuZGlmCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgbCA8IG1pbmxlbikKKyAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiU3RyaW5nIHRvbyBzaG9ydDogJWxkIGNoYXJzLCBtaW5sZW49JWxkXG4iLCBsLCBtaW5sZW4pKTsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfTEVOR1RIOworICAgIHJldHVybiBOVUxMOworICB9CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgaWYgKGZsYWcgPT0gMykKKyAgICAgIHNvYXAtPmRvbS0+dGFpbCA9IHQ7CisgICAgZWxzZQorICAgICAgc29hcC0+ZG9tLT5kYXRhID0gdDsKKyAgfQorI2VuZGlmCisgIGlmIChmbGFnID09IDIpCisgICAgaWYgKHNvYXBfczJRTmFtZShzb2FwLCB0LCAmdCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHQ7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfd3N0cmluZ19vdXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHdjaGFyX3QgKnMsIGludCBmbGFnKQoreyBjb25zdCBjaGFyICp0OworICBjaGFyIHRtcDsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IHdjaGFyX3QgKnIgPSAod2NoYXJfdCopczsKKyAgICBpbnQgbiA9IDE7CisgICAgd2hpbGUgKCpyKyspCisgICAgICBuKys7CisgICAgc29hcC0+ZG9tLT53aWRlID0gciA9ICh3Y2hhcl90Kilzb2FwX21hbGxvYyhzb2FwLCBuICogc2l6ZW9mKHdjaGFyX3QpKTsKKyAgICB3aGlsZSAobi0tKQorICAgICAgKnIrKyA9ICpzKys7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNlbmRpZgorICB3aGlsZSAoKGMgPSAqcysrKSkKKyAgeyBzd2l0Y2ggKGMpCisgICAgeyAKKyAgICBjYXNlIDk6CisgICAgICBpZiAoZmxhZykKKyAgICAgICAgdCA9ICImI3g5OyI7CisgICAgICBlbHNlCisgICAgICAgIHQgPSAiXHQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMDoKKyAgICAgIGlmIChmbGFnIHx8ICEoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkpCisgICAgICAgIHQgPSAiJiN4QTsiOworICAgICAgZWxzZQorICAgICAgICB0ID0gIlxuIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTM6CisgICAgICB0ID0gIiYjeEQ7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJyYnOgorICAgICAgdCA9ICImYW1wOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICc8JzoKKyAgICAgIHQgPSAiJmx0OyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICc+JzoKKyAgICAgIGlmIChmbGFnKQorICAgICAgICB0ID0gIj4iOworICAgICAgZWxzZQorCXQgPSAiJmd0OyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICciJzoKKyAgICAgIGlmIChmbGFnKQorICAgICAgICB0ID0gIiZxdW90OyI7CisgICAgICBlbHNlCisgICAgICAgIHQgPSAiXCIiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChjID4gMCAmJiBjIDwgMHg4MCkKKyAgICAgIHsgdG1wID0gKGNoYXIpYzsKKyAgICAgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgJnRtcCwgMSkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgICAgZWxzZSBpZiAoc29hcF9wdXR1dGY4KHNvYXAsICh1bnNpZ25lZCBsb25nKWMpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKHNvYXBfc2VuZChzb2FwLCB0KSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQord2NoYXJfdCAqCitTT0FQX0ZNQUMyCitzb2FwX3dzdHJpbmdfaW4oc3RydWN0IHNvYXAgKnNvYXAsIGludCBmbGFnLCBsb25nIG1pbmxlbiwgbG9uZyBtYXhsZW4pCit7IHdjaGFyX3QgKnM7CisgIHJlZ2lzdGVyIGludCBpLCBuID0gMDsKKyAgcmVnaXN0ZXIgbG9uZyBsID0gMDsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICBjb25zdCBjaGFyICp0ID0gTlVMTDsKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlYWRpbmcgd2lkZSBzdHJpbmcgY29udGVudFxuIikpOworICBpZiAoc29hcC0+cGVla2VkKQorICB7IGlmICghc29hcC0+Ym9keSkKKyAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgqc29hcC0+dGFnKQorICAgIHsgbiA9IDE7CisgICAgICBzb2FwLT5wZWVrZWQgPSAwOworICAgIH0KKyAgfQorICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgcmV0dXJuIE5VTEw7CisgIGZvciAoOzspCisgIHsgaWYgKCEocyA9ICh3Y2hhcl90Kilzb2FwX3B1c2hfYmxvY2soc29hcCwgc2l6ZW9mKHdjaGFyX3QpKlNPQVBfQkxLTEVOKSkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgU09BUF9CTEtMRU47IGkrKykKKyAgICB7IGlmICh0KQorICAgICAgeyAqcysrID0gKHdjaGFyX3QpKnQrKzsKKyAgICAgICAgaWYgKCEqdCkKKyAgICAgICAgICB0ID0gTlVMTDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBjID0gc29hcF9nZXR1dGY4KHNvYXApOworICAgICAgc3dpdGNoIChjKQorICAgICAgeworICAgICAgY2FzZSBTT0FQX1RUOgorICAgICAgICBpZiAobiA9PSAwKQorICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICBuLS07CisgICAgICAgICpzKysgPSAnPCc7CisgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgJy8nKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfTFQ6CisgICAgICAgIG4rKzsKKyAgICAgICAgKnMrKyA9ICc8JzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfR1Q6CisgICAgICAgICpzKysgPSAnPic7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTT0FQX1FUOgorICAgICAgICAqcysrID0gJyInOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9BUDoKKyAgICAgICAgKnMrKyA9ICdcJyc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnLyc6CisgICAgICAgIGlmIChuID4gMCkKKyAgICAgICAgeyBjID0gc29hcF9nZXR1dGY4KHNvYXApOworICAgICAgICAgIGlmIChjID09IFNPQVBfR1QpCisgICAgICAgICAgICBuLS07CisgICAgICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgfQorICAgICAgICAqcysrID0gJy8nOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJzwnOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gKHNvYXBfd2NoYXIpJzwnOworICAgICAgICBlbHNlCisgICAgICAgIHsgKnMrKyA9IChzb2FwX3djaGFyKScmJzsKKyAgICAgICAgICB0ID0gImx0OyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICc+JzoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9IChzb2FwX3djaGFyKSc+JzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAoc29hcF93Y2hhciknJic7CisgICAgICAgICAgdCA9ICJndDsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnIic6CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICpzKysgPSAoc29hcF93Y2hhciknIic7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAqcysrID0gKHNvYXBfd2NoYXIpJyYnOworICAgICAgICAgIHQgPSAicXVvdDsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICpzKysgPSAod2NoYXJfdCljICYgMHg3RkZGRkZGRjsKKyAgICAgIH0KKyAgICAgIGwrKzsKKyAgICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgbWF4bGVuID49IDAgJiYgbCA+IG1heGxlbikKKyAgICAgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlN0cmluZyB0b28gbG9uZzogbWF4bGVuPSVsZFxuIiwgbWF4bGVuKSk7CisgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9MRU5HVEg7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgIH0KKyAgfQorZW5kOgorICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAqcyA9ICdcMCc7CisgIHNvYXBfc2l6ZV9ibG9jayhzb2FwLCBzaXplb2Yod2NoYXJfdCkgKiAoaSArIDEpKTsKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiBsIDwgbWlubGVuKQorICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJTdHJpbmcgdG9vIHNob3J0OiAlbGQgY2hhcnMsIG1pbmxlbj0lbGRcbiIsIGwsIG1pbmxlbikpOworICAgIHNvYXAtPmVycm9yID0gU09BUF9MRU5HVEg7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcyA9ICh3Y2hhcl90Kilzb2FwX3NhdmVfYmxvY2soc29hcCwgTlVMTCwgMCk7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgICAgc29hcC0+ZG9tLT53aWRlID0gczsKKyNlbmRpZgorICByZXR1cm4gczsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfaW50MnMoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuKQoreyByZXR1cm4gc29hcF9sb25nMnMoc29hcCwgKGxvbmcpbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0aW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgaW50ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX2xvbmcycyhzb2FwLCAobG9uZykqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJpbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGludCAqcCkKK3sgaWYgKHMpCisgIHsgY2hhciAqcjsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgIHNvYXBfcmVzZXRfZXJybm87CisjZW5kaWYKKyNlbmRpZgorICAgICpwID0gKGludClzb2FwX3N0cnRvbChzLCAmciwgMTApOworICAgIGlmICgocyA9PSByICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkgfHwgKnIKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICB8fCBzb2FwX2Vycm5vID09IFNPQVBfRVJBTkdFCisjZW5kaWYKKyNlbmRpZgorICAgICkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludCAqCitTT0FQX0ZNQUMyCitzb2FwX2luaW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6aW50IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6c2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpieXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKGludCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKGludCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChpbnQqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YoaW50KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJpbnQoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfbG9uZzJzKHN0cnVjdCBzb2FwICpzb2FwLCBsb25nIG4pCit7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiJWxkIiwgbik7CisgIHJldHVybiBzb2FwLT50bXBidWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0bG9uZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGxvbmcgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfbG9uZzJzKHNvYXAsICpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMmxvbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGxvbmcgKnApCit7IGlmIChzKQorICB7IGNoYXIgKnI7CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBzb2FwX3Jlc2V0X2Vycm5vOworI2VuZGlmCisjZW5kaWYKKyAgICAqcCA9IHNvYXBfc3RydG9sKHMsICZyLCAxMCk7CisgICAgaWYgKChzID09IHIgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKSB8fCAqcgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgIHx8IHNvYXBfZXJybm8gPT0gU09BUF9FUkFOR0UKKyNlbmRpZgorI2VuZGlmCisgICAgKQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorbG9uZyAqCitTT0FQX0ZNQUMyCitzb2FwX2lubG9uZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBsb25nICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjppbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpzaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAobG9uZyopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKGxvbmcpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAobG9uZyopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihsb25nKSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJsb25nKHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX0xPTkc2NDJzKHN0cnVjdCBzb2FwICpzb2FwLCBMT05HNjQgbikKK3sgc3ByaW50Zihzb2FwLT50bXBidWYsIFNPQVBfTE9OR19GT1JNQVQsIG4pOworICByZXR1cm4gc29hcC0+dG1wYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dExPTkc2NChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IExPTkc2NCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9MT05HNjQycyhzb2FwLCAqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJMT05HNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIExPTkc2NCAqcCkKK3sgaWYgKHMpCisgIHsKKyNpZmRlZiBIQVZFX1NUUlRPTEwKKyAgICBjaGFyICpyOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgc29hcF9yZXNldF9lcnJubzsKKyNlbmRpZgorI2VuZGlmCisgICAgKnAgPSBzdHJ0b2xsKHMsICZyLCAxMCk7CisgICAgaWYgKChzID09IHIgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKSB8fCAqcgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICAgfHwgc29hcF9lcnJubyA9PSBTT0FQX0VSQU5HRQorI2VuZGlmCisjZW5kaWYKKyAgICAgICkKKyNlbHNlCisjIGlmZGVmIEhBVkVfU1NDQU5GCisgICAgaWYgKHNzY2FuZihzLCBTT0FQX0xPTkdfRk9STUFULCBwKSAhPSAxKQorIyBlbmRpZgorI2VuZGlmCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitMT05HNjQgKgorU09BUF9GTUFDMgorc29hcF9pbkxPTkc2NChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBMT05HNjQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpwb3NpdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpuZWdhdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpub25Qb3NpdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpub25OZWdhdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpsb25nIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6aW50IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6c2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpieXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKExPTkc2NCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKExPTkc2NCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChMT05HNjQqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YoTE9ORzY0KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJMT05HNjQoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfYnl0ZTJzKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyIG4pCit7IHJldHVybiBzb2FwX2xvbmcycyhzb2FwLCAobG9uZyluKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRieXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgY2hhciAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9sb25nMnMoc29hcCwgKGxvbmcpKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MyYnl0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgY2hhciAqcCkKK3sgaWYgKHMpCisgIHsgbG9uZyBuOworICAgIGNoYXIgKnI7CisgICAgbiA9IHNvYXBfc3RydG9sKHMsICZyLCAxMCk7CisgICAgaWYgKHMgPT0gciB8fCAqciB8fCBuIDwgLTEyOCB8fCBuID4gMTI3KQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgKnAgPSAoY2hhciluOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9pbmJ5dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgY2hhciAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6Ynl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9IChjaGFyKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YoY2hhciksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChjaGFyKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKGNoYXIpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMmJ5dGUoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfc2hvcnQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgc2hvcnQgbikKK3sgcmV0dXJuIHNvYXBfbG9uZzJzKHNvYXAsIChsb25nKW4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHNob3J0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgc2hvcnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfbG9uZzJzKHNvYXAsIChsb25nKSpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMnNob3J0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBzaG9ydCAqcCkKK3sgaWYgKHMpCisgIHsgbG9uZyBuOworICAgIGNoYXIgKnI7CisgICAgbiA9IHNvYXBfc3RydG9sKHMsICZyLCAxMCk7CisgICAgaWYgKHMgPT0gciB8fCAqciB8fCBuIDwgLTMyNzY4IHx8IG4gPiAzMjc2NykKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgICpwID0gKHNob3J0KW47CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorc2hvcnQgKgorU09BUF9GTUFDMgorc29hcF9pbnNob3J0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHNob3J0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpzaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAoc2hvcnQqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihzaG9ydCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChzaG9ydCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihzaG9ydCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3Myc2hvcnQoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZmxvYXQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgZmxvYXQgbikKK3sgY29uc3QgY2hhciAqczsKKyAgaWYgKHNvYXBfaXNuYW4oKGRvdWJsZSluKSkKKyAgICBzID0gIk5hTiI7CisgIGVsc2UgaWYgKHNvYXBfaXNwaW5mZihuKSkKKyAgICBzID0gIklORiI7CisgIGVsc2UgaWYgKHNvYXBfaXNuaW5mZihuKSkKKyAgICBzID0gIi1JTkYiOworICBlbHNlCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsIHNvYXAtPmZsb2F0X2Zvcm1hdCwgbik7CisgICAgcyA9IHNvYXAtPnRtcGJ1ZjsKKyAgfQorICByZXR1cm4gczsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRmbG9hdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGZsb2F0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX2Zsb2F0MnMoc29hcCwgKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MyZmxvYXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGZsb2F0ICpwKQoreyBpZiAocykKKyAgeyBpZiAoISpzKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIGlmICghc29hcF90YWdfY21wKHMsICJJTkYiKSkKKyAgICAgICpwID0gRkxUX1BJTkZUWTsKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHMsICIrSU5GIikpCisgICAgICAqcCA9IEZMVF9QSU5GVFk7CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChzLCAiLUlORiIpKQorICAgICAgKnAgPSBGTFRfTklORlRZOworICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAocywgIk5hTiIpKQorICAgICAgKnAgPSBGTFRfTkFOOworICAgIGVsc2UKKyAgICB7CisvKiBPbiBzb21lIHN5c3RlbXMsIHN0cnRvZiBhcHBlYXJzIHRvIGJlIGJyb2tlbiBvciBkb2Vzbid0IGxpbms6IHVzZSB3aXRoIGNhdXRpb24gKi8KKyNpZiBkZWZpbmVkKEhBVkVfU1RSVE9GKQorICAgICAgY2hhciAqcjsKKyAgICAgICpwID0gc3RydG9mKChjaGFyKilzLCAmcik7CisgICAgICBpZiAoKnIpCisjZWxpZiBkZWZpbmVkKEhBVkVfU1RSVE9EKQorICAgICAgY2hhciAqcjsKKyAgICAgICpwID0gKGZsb2F0KXN0cnRvZChzLCAmcik7CisgICAgICBpZiAoKnIpCisjZW5kaWYKKyNpZmRlZiBIQVZFX1NTQ0FORgorICAgICAgICBpZiAoc3NjYW5mKHMsICIlZyIsIHApICE9IDEpCisgICAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisjZWxzZQorICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyNlbmRpZgorICAgIH0KKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgaW50IHNvYXBfaXNudW1lcmljKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0eXBlKQoreyBpZiAoc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6ZmxvYXQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpkb3VibGUiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpkZWNpbWFsIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6aW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnBvc2l0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOm5lZ2F0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOm5vblBvc2l0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOm5vbk5lZ2F0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmxvbmciKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjppbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpzaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmJ5dGUiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZExvbmciKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkU2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gU09BUF9FUlI7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitmbG9hdCAqCitTT0FQX0ZNQUMyCitzb2FwX2luZmxvYXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgZmxvYXQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUgIT0gJ1wwJyAmJiBzb2FwX2lzbnVtZXJpYyhzb2FwLCB0eXBlKSkKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICBwID0gKGZsb2F0Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YoZmxvYXQpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAoZmxvYXQqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YoZmxvYXQpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMmZsb2F0KHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2RvdWJsZTJzKHN0cnVjdCBzb2FwICpzb2FwLCBkb3VibGUgbikKK3sgY29uc3QgY2hhciAqczsKKyAgaWYgKHNvYXBfaXNuYW4obikpCisgICAgcyA9ICJOYU4iOworICBlbHNlIGlmIChzb2FwX2lzcGluZmQobikpCisgICAgcyA9ICJJTkYiOworICBlbHNlIGlmIChzb2FwX2lzbmluZmQobikpCisgICAgcyA9ICItSU5GIjsKKyAgZWxzZQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCBzb2FwLT5kb3VibGVfZm9ybWF0LCBuKTsKKyAgICBzID0gc29hcC0+dG1wYnVmOworICB9CisgIHJldHVybiBzOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dGRvdWJsZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGRvdWJsZSAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9kb3VibGUycyhzb2FwLCAqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJkb3VibGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGRvdWJsZSAqcCkKK3sgaWYgKHMpCisgIHsgaWYgKCEqcykKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBpZiAoIXNvYXBfdGFnX2NtcChzLCAiSU5GIikpCisgICAgICAqcCA9IERCTF9QSU5GVFk7CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChzLCAiK0lORiIpKQorICAgICAgKnAgPSBEQkxfUElORlRZOworICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAocywgIi1JTkYiKSkKKyAgICAgICpwID0gREJMX05JTkZUWTsKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHMsICJOYU4iKSkKKyAgICAgICpwID0gREJMX05BTjsKKyAgICBlbHNlCisgICAgeworI2lmZGVmIEhBVkVfU1RSVE9ECisgICAgICBjaGFyICpyOworICAgICAgKnAgPSBzdHJ0b2QocywgJnIpOworICAgICAgaWYgKCpyKQorI2VuZGlmCisjaWZkZWYgSEFWRV9TU0NBTkYKKyAgICAgICAgaWYgKHNzY2FuZihzLCAiJWxnIiwgcCkgIT0gMSkKKyAgICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyNlbHNlCisgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworI2VuZGlmCisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2RvdWJsZSAqCitTT0FQX0ZNQUMyCitzb2FwX2luZG91YmxlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGRvdWJsZSAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZSAhPSAnXDAnICYmIHNvYXBfaXNudW1lcmljKHNvYXAsIHR5cGUpKQorICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgIHAgPSAoZG91YmxlKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YoZG91YmxlKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKGRvdWJsZSopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihkb3VibGUpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMmRvdWJsZShzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF91bnNpZ25lZEJ5dGUycyhzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgY2hhciBuKQoreyByZXR1cm4gc29hcF91bnNpZ25lZExvbmcycyhzb2FwLCAodW5zaWduZWQgbG9uZyluKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXR1bnNpZ25lZEJ5dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX3Vuc2lnbmVkTG9uZzJzKHNvYXAsICh1bnNpZ25lZCBsb25nKSpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMnVuc2lnbmVkQnl0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgdW5zaWduZWQgY2hhciAqcCkKK3sgaWYgKHMpCisgIHsgdW5zaWduZWQgbG9uZyBuOworICAgIGNoYXIgKnI7CisgICAgbiA9IHNvYXBfc3RydG91bChzLCAmciwgMTApOworICAgIGlmIChzID09IHIgfHwgKnIgfHwgbiA+IDI1NSkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgICpwID0gKHVuc2lnbmVkIGNoYXIpbjsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit1bnNpZ25lZCBjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfaW51bnNpZ25lZEJ5dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgdW5zaWduZWQgY2hhciAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRCeXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKHVuc2lnbmVkIGNoYXIqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZih1bnNpZ25lZCBjaGFyKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKHVuc2lnbmVkIGNoYXIqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YodW5zaWduZWQgY2hhciksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MydW5zaWduZWRCeXRlKHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3Vuc2lnbmVkU2hvcnQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgc2hvcnQgbikKK3sgcmV0dXJuIHNvYXBfdW5zaWduZWRMb25nMnMoc29hcCwgKHVuc2lnbmVkIGxvbmcpbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0dW5zaWduZWRTaG9ydChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIHNob3J0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX3Vuc2lnbmVkTG9uZzJzKHNvYXAsICh1bnNpZ25lZCBsb25nKSpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMnVuc2lnbmVkU2hvcnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIHNob3J0ICpwKQoreyBpZiAocykKKyAgeyB1bnNpZ25lZCBsb25nIG47CisgICAgY2hhciAqcjsKKyAgICBuID0gc29hcF9zdHJ0b3VsKHMsICZyLCAxMCk7CisgICAgaWYgKHMgPT0gciB8fCAqciB8fCBuID4gNjU1MzUpCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICAqcCA9ICh1bnNpZ25lZCBzaG9ydCluOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3Vuc2lnbmVkIHNob3J0ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW51bnNpZ25lZFNob3J0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIHNob3J0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZFNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRCeXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKHVuc2lnbmVkIHNob3J0Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YodW5zaWduZWQgc2hvcnQpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAodW5zaWduZWQgc2hvcnQqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YodW5zaWduZWQgc2hvcnQpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMnVuc2lnbmVkU2hvcnQoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfdW5zaWduZWRJbnQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgaW50IG4pCit7IHJldHVybiBzb2FwX3Vuc2lnbmVkTG9uZzJzKHNvYXAsICh1bnNpZ25lZCBsb25nKW4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHVuc2lnbmVkSW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgdW5zaWduZWQgaW50ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX3Vuc2lnbmVkTG9uZzJzKHNvYXAsICh1bnNpZ25lZCBsb25nKSpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMnVuc2lnbmVkSW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBpbnQgKnApCit7IGlmIChzKQorICB7IGNoYXIgKnI7CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBzb2FwX3Jlc2V0X2Vycm5vOworI2VuZGlmCisjZW5kaWYKKyAgICAqcCA9ICh1bnNpZ25lZCBpbnQpc29hcF9zdHJ0b3VsKHMsICZyLCAxMCk7CisgICAgaWYgKChzID09IHIgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKSB8fCAqcgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgIHx8IHNvYXBfZXJybm8gPT0gU09BUF9FUkFOR0UKKyNlbmRpZgorI2VuZGlmCisgICAgKQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordW5zaWduZWQgaW50ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW51bnNpZ25lZEludChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB1bnNpZ25lZCBpbnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkSW50IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRTaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkQnl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9ICh1bnNpZ25lZCBpbnQqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZih1bnNpZ25lZCBpbnQpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAodW5zaWduZWQgaW50Kilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKHVuc2lnbmVkIGludCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MydW5zaWduZWRJbnQoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfdW5zaWduZWRMb25nMnMoc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIGxvbmcgbikKK3sgc3ByaW50Zihzb2FwLT50bXBidWYsICIlbHUiLCBuKTsKKyAgcmV0dXJuIHNvYXAtPnRtcGJ1ZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXR1bnNpZ25lZExvbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCB1bnNpZ25lZCBsb25nICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX3Vuc2lnbmVkTG9uZzJzKHNvYXAsICpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMnVuc2lnbmVkTG9uZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgdW5zaWduZWQgbG9uZyAqcCkKK3sgaWYgKHMpCisgIHsgY2hhciAqcjsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgIHNvYXBfcmVzZXRfZXJybm87CisjZW5kaWYKKyNlbmRpZgorICAgICpwID0gc29hcF9zdHJ0b3VsKHMsICZyLCAxMCk7CisgICAgaWYgKChzID09IHIgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKSB8fCAqcgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgIHx8IHNvYXBfZXJybm8gPT0gU09BUF9FUkFOR0UKKyNlbmRpZgorI2VuZGlmCisgICAgKQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordW5zaWduZWQgbG9uZyAqCitTT0FQX0ZNQUMyCitzb2FwX2ludW5zaWduZWRMb25nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIGxvbmcgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkSW50IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRTaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkQnl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9ICh1bnNpZ25lZCBsb25nKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YodW5zaWduZWQgbG9uZyksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9ICh1bnNpZ25lZCBsb25nKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMnVuc2lnbmVkTG9uZyhzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9VTE9ORzY0MnMoc3RydWN0IHNvYXAgKnNvYXAsIFVMT05HNjQgbikKK3sgc3ByaW50Zihzb2FwLT50bXBidWYsIFNPQVBfVUxPTkdfRk9STUFULCBuKTsKKyAgcmV0dXJuIHNvYXAtPnRtcGJ1ZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRVTE9ORzY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgVUxPTkc2NCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9VTE9ORzY0MnMoc29hcCwgKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MyVUxPTkc2NChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgVUxPTkc2NCAqcCkKK3sgaWYgKHMpCisgIHsKKyNpZmRlZiBIQVZFX1NUUlRPVUxMCisgICAgY2hhciAqcjsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgIHNvYXBfcmVzZXRfZXJybm87CisjZW5kaWYKKyNlbmRpZgorICAgICpwID0gc3RydG91bGwocywgJnIsIDEwKTsKKyAgICBpZiAoKHMgPT0gciAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpIHx8ICpyCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgICB8fCBzb2FwX2Vycm5vID09IFNPQVBfRVJBTkdFCisjZW5kaWYKKyNlbmRpZgorICAgICAgKQorI2Vsc2UKKyMgaWZkZWYgSEFWRV9TU0NBTkYKKyAgICBpZiAoc3NjYW5mKHMsIFNPQVBfVUxPTkdfRk9STUFULCBwKSAhPSAxKQorIyBlbmRpZgorI2VuZGlmCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitVTE9ORzY0ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5VTE9ORzY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIFVMT05HNjQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6cG9zaXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bm9uTmVnYXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRMb25nIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRJbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZFNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRCeXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcCA9IChVTE9ORzY0Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YoVUxPTkc2NCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChVTE9ORzY0Kilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKFVMT05HNjQpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMlVMT05HNjQoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3Myc3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBjaGFyICoqdCkKK3sgKnQgPSBOVUxMOworICBpZiAocykKKyAgeyBpZiAoISgqdCA9IHNvYXBfc3RyZHVwKHNvYXAsIHMpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIGlmICghKHNvYXAtPm1vZGUgJiAoU09BUF9FTkNfTEFUSU4gfCBTT0FQX0NfVVRGU1RSSU5HKSkpCisgICAgeyAvKiBUT0RPOiBjb25zaWRlciB0cnVuY2F0aW5nIFVURjggdG8gQVNDSUkgZm9yIHJlZ3VsYXIgWE1MIGF0dHJpYnV0ZSBzdHJpbmdzPyAqLworICAgIH0KKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJRTmFtZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgY2hhciAqKnQpCit7IGlmIChzKQorICB7IHN0cnVjdCBzb2FwX25saXN0ICpucDsKKyAgICBjb25zdCBjaGFyICpwOworICAgIGlmICghc3RybmNtcChzLCAieG1sOiIsIDQpKQorICAgIHsgKnQgPSBzb2FwX3N0cmR1cChzb2FwLCBzKTsKKyAgICAgIHJldHVybiBTT0FQX09LOworICAgIH0KKyAgICBucCA9IHNvYXAtPm5saXN0OworICAgIHAgPSBzdHJjaHIocywgJzonKTsKKyAgICBpZiAocCkKKyAgICB7IHJlZ2lzdGVyIGludCBuID0gcCAtIHM7CisgICAgICB3aGlsZSAobnAgJiYgKHN0cm5jbXAobnAtPmlkLCBzLCBuKSB8fCBucC0+aWRbbl0pKQorICAgICAgICBucCA9IG5wLT5uZXh0OworICAgICAgcCsrOworICAgIH0KKyAgICBlbHNlCisgICAgeyB3aGlsZSAobnAgJiYgKm5wLT5pZCkKKyAgICAgICAgbnAgPSBucC0+bmV4dDsKKyAgICAgIHAgPSBzOworICAgIH0KKyAgICBpZiAobnApCisgICAgeyBpZiAobnAtPmluZGV4ID49IDAgJiYgc29hcC0+bG9jYWxfbmFtZXNwYWNlcykKKyAgICAgIHsgcmVnaXN0ZXIgY29uc3QgY2hhciAqcSA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbbnAtPmluZGV4XS5pZDsKKyAgICAgICAgaWYgKHEpCisgICAgICAgIHsgaWYgKCgqdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzdHJsZW4ocCkgKyBzdHJsZW4ocSkgKyAyKSkpCisgICAgICAgICAgICBzcHJpbnRmKCp0LCAiJXM6JXMiLCBxLCBwKTsKKyAgICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKG5wLT5ucykKKyAgICAgIHsgaWYgKCgqdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzdHJsZW4ocCkgKyBzdHJsZW4obnAtPm5zKSArIDQpKSkKKyAgICAgICAgICBzcHJpbnRmKCp0LCAiXCIlc1wiOiVzIiwgbnAtPm5zLCBwKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgICB9CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk5hbWVzcGFjZSBwcmVmaXggb2YgJyVzJyBub3QgZGVmaW5lZCAoaW5kZXg9JWQsIFVSST0lcylcbiIsIHMsIG5wLT5pbmRleCwgbnAtPm5zP25wLT5uczoiIikpOworICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9OQU1FU1BBQ0U7IAorICAgIH0KKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk5hbWVzcGFjZSBwcmVmaXggb2YgJyVzJyBub3QgZGVmaW5lZCwgYXNzdW1pbmcgZW1wdHkgbmFtZXNwYWNlXG4iLCBzKSk7CisgICAgaWYgKCgqdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzdHJsZW4ocCkgKyA0KSkpCisgICAgICBzcHJpbnRmKCp0LCAiXCJcIjolcyIsIHApOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX1FOYW1lMnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMpCit7IHN0cnVjdCBOYW1lc3BhY2UgKnA7CisgIGNoYXIgKnQ7CisgIGludCBuOworICBpZiAoIXMgfHwgKnMgIT0gJyInKQorICB7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmIChzICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKSkKKyAgICB7IHQgPSAoY2hhciopc3RyY2hyKHMsICc6Jyk7CisgICAgICBpZiAodCkKKyAgICAgICAgc29hcF91dGlsaXplX25zKHNvYXAsIHMsIHQgLSBzKTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gczsKKyAgfQorICBzKys7CisgIGlmICgocCA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXMpKQorICB7IGZvciAoOyBwLT5pZDsgcCsrKQorICAgIHsgaWYgKHAtPm5zKQorICAgICAgICBpZiAoIXNvYXBfdGFnX2NtcChzLCBwLT5ucykpCisgICAgICAgICAgYnJlYWs7CisgICAgICBpZiAocC0+aW4pCisgICAgICAgIGlmICghc29hcF90YWdfY21wKHMsIHAtPmluKSkKKyAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHAgJiYgcC0+aWQpCisgICAgeyBzID0gc3RyY2hyKHMsICciJyk7CisgICAgICBpZiAocykKKyAgICAgIHsgdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzdHJsZW4ocC0+aWQpICsgc3RybGVuKHMpKTsKKyAgICAgICAgc3RyY3B5KHQsIHAtPmlkKTsKKwlzdHJjYXQodCwgcyArIDEpOworICAgICAgICByZXR1cm4gdDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgdCA9IChjaGFyKilzdHJjaHIocywgJyInKTsKKyAgaWYgKHQpCisgICAgbiA9IHQgLSBzOworICBlbHNlCisgICAgbiA9IDA7CisgIHQgPSBzb2FwX3N0cmR1cChzb2FwLCBzKTsKKyAgdFtuXSA9ICdcMCc7CisgIHNwcmludGYoc29hcC0+dG1wYnVmLCAieG1sbnM6XyVkIiwgc29hcC0+aWRudW0rKyk7CisgIHNvYXBfc2V0X2F0dHIoc29hcCwgc29hcC0+dG1wYnVmLCB0KTsKKyAgcyA9IHN0cmNocihzLCAnIicpOworICBpZiAocykKKyAgeyB0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihzb2FwLT50bXBidWYpICsgc3RybGVuKHMpIC0gNik7CisgICAgc3RyY3B5KHQsIHNvYXAtPnRtcGJ1ZiArIDYpOworICAgIHN0cmNhdCh0LCBzICsgMSk7CisgIH0KKyAgcmV0dXJuIHQ7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJ3Y2hhcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgd2NoYXJfdCAqKnQpCit7IHdjaGFyX3QgKnI7CisgIGlmICghcykKKyAgICAqdCA9IE5VTEw7CisgIGVsc2UKKyAgeyAqdCA9IHIgPSAod2NoYXJfdCopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHdjaGFyX3QpICogKHN0cmxlbihzKSArIDEpKTsKKyAgICBpZiAoIXIpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19MQVRJTikKKyAgICB7IHdoaWxlICgqcykKKyAgICAgICAgKnIrKyA9ICh3Y2hhcl90KSpzKys7CisgICAgfQorICAgIGVsc2UKKyAgICB7IC8qIENvbnZlcnQgVVRGOCB0byB3Y2hhciAqLworICAgICAgd2hpbGUgKCpzKQorICAgICAgeyByZWdpc3RlciBzb2FwX3djaGFyIGMsIGMxLCBjMiwgYzMsIGM0OworICAgICAgICBjID0gKnMrKzsKKyAgICAgICAgaWYgKGMgPCAweDgwKQorCSAgKnIrKyA9ICh3Y2hhcl90KWM7CisJZWxzZQorICAgICAgICB7IGMxID0gKHNvYXBfd2NoYXIpKnMrKyAmIDB4M0Y7CisgICAgICAgICAgaWYgKGMgPCAweEUwKQorICAgICAgICAgICAgKnIrKyA9ICh3Y2hhcl90KSgoKHNvYXBfd2NoYXIpKGMgJiAweDFGKSA8PCA2KSB8IGMxKTsKKyAgICAgICAgICBlbHNlCisJICB7IGMyID0gKHNvYXBfd2NoYXIpKnMrKyAmIDB4M0Y7CisgICAgICAgICAgICBpZiAoYyA8IDB4RjApCisgICAgICAgICAgICAgICpyKysgPSAod2NoYXJfdCkoKChzb2FwX3djaGFyKShjICYgMHgwRikgPDwgMTIpIHwgKGMxIDw8IDYpIHwgYzIpOworICAgICAgICAgICAgZWxzZQorCSAgICB7IGMzID0gKHNvYXBfd2NoYXIpKnMrKyAmIDB4M0Y7CisgICAgICAgICAgICAgIGlmIChjIDwgMHhGOCkKKyAgICAgICAgICAgICAgICAqcisrID0gKHdjaGFyX3QpKCgoc29hcF93Y2hhcikoYyAmIDB4MDcpIDw8IDE4KSB8IChjMSA8PCAxMikgfCAoYzIgPDwgNikgfCBjMyk7CisgICAgICAgICAgICAgIGVsc2UKKwkgICAgICB7IGM0ID0gKHNvYXBfd2NoYXIpKnMrKyAmIDB4M0Y7CisgICAgICAgICAgICAgICAgaWYgKGMgPCAweEZDKQorICAgICAgICAgICAgICAgICAgKnIrKyA9ICh3Y2hhcl90KSgoKHNvYXBfd2NoYXIpKGMgJiAweDAzKSA8PCAyNCkgfCAoYzEgPDwgMTgpIHwgKGMyIDw8IDEyKSB8IChjMyA8PCA2KSB8IGM0KTsKKyAgICAgICAgICAgICAgICBlbHNlCisJCSAgKnIrKyA9ICh3Y2hhcl90KSgoKHNvYXBfd2NoYXIpKGMgJiAweDAxKSA8PCAzMCkgfCAoYzEgPDwgMjQpIHwgKGMyIDw8IDE4KSB8IChjMyA8PCAxMikgfCAoYzQgPDwgNikgfCAoc29hcF93Y2hhcikoKnMrKyAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAqciA9IEwnXDAnOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfd2NoYXIycyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgd2NoYXJfdCAqcykKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICByZWdpc3RlciBjaGFyICpyLCAqdDsKKyAgY29uc3Qgd2NoYXJfdCAqcSA9IHM7CisgIHNpemVfdCBuID0gMDsKKyAgd2hpbGUgKChjID0gKnErKykpCisgIHsgaWYgKGMgPiAwICYmIGMgPCAweDgwKQorICAgICAgbisrOworICAgIGVsc2UKKyAgICAgIG4gKz0gNjsKKyAgfQorICByID0gdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBuICsgMSk7CisgIGlmIChyKQorICB7IC8qIENvbnZlcnQgd2NoYXIgdG8gVVRGOCAqLworICAgIHdoaWxlICgoYyA9ICpzKyspKQorICAgIHsgaWYgKGMgPiAwICYmIGMgPCAweDgwKQorICAgICAgICAqdCsrID0gKGNoYXIpYzsKKyAgICAgIGVsc2UKKyAgICAgIHsgaWYgKGMgPCAweDA4MDApCisgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEMwIHwgKChjID4+IDYpICYgMHgxRikpOworICAgICAgICBlbHNlCisgICAgICAgIHsgaWYgKGMgPCAweDAxMDAwMCkKKyAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhFMCB8ICgoYyA+PiAxMikgJiAweDBGKSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsgaWYgKGMgPCAweDIwMDAwMCkKKyAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEYwIHwgKChjID4+IDE4KSAmIDB4MDcpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgaWYgKGMgPCAweDA0MDAwMDAwKQorICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhGOCB8ICgoYyA+PiAyNCkgJiAweDAzKSk7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeyAqdCsrID0gKGNoYXIpKDB4RkMgfCAoKGMgPj4gMzApICYgMHgwMSkpOworICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAyNCkgJiAweDNGKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDE4KSAmIDB4M0YpKTsKKyAgICAgICAgICAgIH0gICAgIAorICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDEyKSAmIDB4M0YpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDYpICYgMHgzRikpOworICAgICAgICB9CisgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8IChjICYgMHgzRikpOworICAgICAgfQorICAgIH0KKyAgICAqdCA9ICdcMCc7CisgIH0KKyAgcmV0dXJuIHI7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0c3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY2hhciAqY29uc3QqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pIAoreyBpZCA9IHNvYXBfZWxlbWVudF9pZChzb2FwLCB0YWcsIGlkLCAqcCwgTlVMTCwgMCwgdHlwZSwgbik7CisgIGlmIChpZCA8IDAKKyAgIHx8IHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBpZCwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCAqcCwgMCkKKyAgIHx8IHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZykpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKioKK1NPQVBfRk1BQzIKK3NvYXBfaW5zdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgY2hhciAqKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0LCBpbnQgZmxhZywgbG9uZyBtaW5sZW4sIGxvbmcgbWF4bGVuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMSkpCisgIHsgaWYgKCF0YWcgfHwgKnRhZyAhPSAnLScgfHwgc29hcC0+ZXJyb3IgIT0gU09BUF9OT19UQUcpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIH0KKyAgaWYgKCFwKQorICAgIGlmICghKHAgPSAoY2hhcioqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihjaGFyKikpKSkKKyAgICAgIHJldHVybiBOVUxMOworICBpZiAoc29hcC0+Ym9keSkKKyAgeyAqcCA9IHNvYXBfc3RyaW5nX2luKHNvYXAsIGZsYWcsIG1pbmxlbiwgbWF4bGVuKTsKKyAgICBpZiAoISpwIHx8ICEoY2hhciopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgKnAsIHQsIHNpemVvZihjaGFyKiksIDAsIE5VTEwsIE5VTEwsIE5VTEwpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZWxzZSBpZiAoc29hcC0+bnVsbCkKKyAgICAqcCA9IE5VTEw7CisgIGVsc2UKKyAgICAqcCA9IChjaGFyKilTT0FQX1NUUl9FT1M7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKGNoYXIqKilzb2FwX2lkX2xvb2t1cChzb2FwLCBzb2FwLT5ocmVmLCAodm9pZCoqKXAsIHQsIHNpemVvZihjaGFyKiopLCAwKTsKKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXR3c3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgd2NoYXJfdCAqY29uc3QqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pIAoreyBpZCA9IHNvYXBfZWxlbWVudF9pZChzb2FwLCB0YWcsIGlkLCAqcCwgTlVMTCwgMCwgdHlwZSwgbik7CisgIGlmIChpZCA8IDAKKyAgIHx8IHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBpZCwgdHlwZSkKKyAgIHx8IHNvYXBfd3N0cmluZ19vdXQoc29hcCwgKnAsIDApCisgICB8fCBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3djaGFyX3QgKioKK1NPQVBfRk1BQzIKK3NvYXBfaW53c3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHdjaGFyX3QgKipwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCwgbG9uZyBtaW5sZW4sIGxvbmcgbWF4bGVuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMSkpCisgIHsgaWYgKCF0YWcgfHwgKnRhZyAhPSAnLScgfHwgc29hcC0+ZXJyb3IgIT0gU09BUF9OT19UQUcpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIH0KKyAgaWYgKCFwKQorICAgIGlmICghKHAgPSAod2NoYXJfdCoqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZih3Y2hhcl90KikpKSkKKyAgICAgIHJldHVybiBOVUxMOworICBpZiAoc29hcC0+Ym9keSkKKyAgeyAqcCA9IHNvYXBfd3N0cmluZ19pbihzb2FwLCAxLCBtaW5sZW4sIG1heGxlbik7CisgICAgaWYgKCEqcCB8fCAhKHdjaGFyX3QqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsICpwLCB0LCBzaXplb2Yod2NoYXJfdCopLCAwLCBOVUxMLCBOVUxMLCBOVUxMKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGVsc2UgaWYgKHNvYXAtPm51bGwpCisgICAgKnAgPSBOVUxMOworICBlbHNlCisgICAgKnAgPSAod2NoYXJfdCopU09BUF9TVFJfRU9TOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9ICh3Y2hhcl90Kiopc29hcF9pZF9sb29rdXAoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilwLCB0LCBzaXplb2Yod2NoYXJfdCoqKSwgMCk7CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyB0aW1lX3QKK3NvYXBfdGltZWdtKHN0cnVjdCB0bSAqVCkKK3sKKyNpZiBkZWZpbmVkKEhBVkVfVElNRUdNKQorICByZXR1cm4gdGltZWdtKFQpOworI2Vsc2UKKyAgdGltZV90IHQsIGcsIHo7CisjaWZkZWYgSEFWRV9HTVRJTUVfUgorICBzdHJ1Y3QgdG0gdG0sICp0bXAgPSAmdG07CisjZWxzZQorICBzdHJ1Y3QgdG0gKnRtcDsKKyNlbmRpZgorICB0ID0gbWt0aW1lKFQpOworICBpZiAodCA9PSAtMSkKKyAgICByZXR1cm4gLTE7CisjaWZkZWYgSEFWRV9HTVRJTUVfUgorICBnbXRpbWVfcigmdCwgdG1wKTsKKyNlbHNlCisgIHRtcCA9IGdtdGltZSgmdCk7CisjZW5kaWYKKyAgdG1wLT50bV9pc2RzdCA9IDA7CisgIGcgPSBta3RpbWUodG1wKTsKKyAgaWYgKGcgPT0gLTEpCisgICAgcmV0dXJuIC0xOworICB6ID0gZyAtIHQ7CisgIHJldHVybiB0IC0gejsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZGF0ZVRpbWUycyhzdHJ1Y3Qgc29hcCAqc29hcCwgdGltZV90IG4pCit7IHN0cnVjdCB0bSBULCAqcFQgPSAmVDsKKyNpZiBkZWZpbmVkKEhBVkVfR01USU1FX1IpCisgIGlmIChnbXRpbWVfcigmbiwgcFQpKQorICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolU1oiLCBwVCk7CisgIC8qIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyB3ZXJlIGFkZGVkIGZvciBWeFdvcmtzKi8KKyNlbGlmIGRlZmluZWQoSEFWRV9QR01USU1FX1IpCisgIGlmIChnbXRpbWVfcigmbiwgcFQpKQorICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolU1oiLCBwVCk7CisjZWxpZiBkZWZpbmVkKEhBVkVfUEdNVElNRSkKKyAgaWYgKGdtdGltZSgmbiwgcFQpKQorICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolU1oiLCBwVCk7CisjZWxpZiBkZWZpbmVkKEhBVkVfR01USU1FKQorICBpZiAoKHBUID0gZ210aW1lKCZuKSkpCisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTWiIsIHBUKTsKKyNlbGlmIGRlZmluZWQoSEFWRV9HRVRUSU1FT0ZEQVkpCisgIHN0cnVjdCB0aW1lem9uZSB0ejsKKyAgbWVtc2V0KCh2b2lkKikmdHosIDAsIHNpemVvZih0eikpOworIyBpZiBkZWZpbmVkKEhBVkVfTE9DQUxUSU1FX1IpCisgIGlmIChsb2NhbHRpbWVfcigmbiwgcFQpKQorICB7IHN0cnVjdCB0aW1ldmFsIHR2OworICAgIGdldHRpbWVvZmRheSgmdHYsICZ0eik7CisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmICsgc3RybGVuKHNvYXAtPnRtcGJ1ZiksICIlKzAzZDolMDJkIiwgLXR6LnR6X21pbnV0ZXN3ZXN0LzYwKyhwVC0+dG1faXNkc3QhPTApLCBhYnModHoudHpfbWludXRlc3dlc3QpJTYwKTsKKyAgfQorIyBlbHNlCisgIGlmICgocFQgPSBsb2NhbHRpbWUoJm4pKSkKKyAgeyBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICBnZXR0aW1lb2ZkYXkoJnR2LCAmdHopOworICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIHN0cmxlbihzb2FwLT50bXBidWYpLCAiJSswM2Q6JTAyZCIsIC10ei50el9taW51dGVzd2VzdC82MCsocFQtPnRtX2lzZHN0IT0wKSwgYWJzKHR6LnR6X21pbnV0ZXN3ZXN0KSU2MCk7CisgIH0KKyNlbmRpZgorI2VsaWYgZGVmaW5lZChIQVZFX0ZUSU1FKQorICBzdHJ1Y3QgdGltZWIgdDsKKyAgbWVtc2V0KCh2b2lkKikmdCwgMCwgc2l6ZW9mKHQpKTsKKyMgaWYgZGVmaW5lZChIQVZFX0xPQ0FMVElNRV9SKQorICBpZiAobG9jYWx0aW1lX3IoJm4sIHBUKSkKKyAgeyBmdGltZSgmdCk7CisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmICsgc3RybGVuKHNvYXAtPnRtcGJ1ZiksICIlKzAzZDolMDJkIiwgLXQudGltZXpvbmUvNjArKHBULT50bV9pc2RzdCE9MCksIGFicyh0LnRpbWV6b25lKSU2MCk7CisgIH0KKyAgLyogVGhlIGZvbGxvd2luZyBkZWZpbmVzIHdlcmUgYWRkZWQgZm9yIFZ4V29ya3MqLworIyBlbGlmIGRlZmluZWQoSEFWRV9QTE9DQUxUSU1FX1IpCisgIGlmIChsb2NhbHRpbWVfcigmbiwgcFQpKQorICB7IHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZitzdHJsZW4oc29hcC0+dG1wYnVmKSwgIiUrMDNkOiUwMmQiLCB0LnRpbWV6b25lLzYwLCBhYnModC50aW1lem9uZSklNjApOworICB9CisjIGVsc2UKKyAgaWYgKChwVCA9IGxvY2FsdGltZSgmbikpKQorICB7IGZ0aW1lKCZ0KTsKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwVCk7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYgKyBzdHJsZW4oc29hcC0+dG1wYnVmKSwgIiUrMDNkOiUwMmQiLCAtdC50aW1lem9uZS82MCsocFQtPnRtX2lzZHN0IT0wKSwgYWJzKHQudGltZXpvbmUpJTYwKTsKKyAgfQorIyBlbmRpZgorI2VsaWYgZGVmaW5lZChIQVZFX0xPQ0FMVElNRV9SKQorICBpZiAobG9jYWx0aW1lX3IoJm4sIHBUKSkKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwVCk7CisgIC8qIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyB3ZXJlIGFkZGVkIGZvciBWeFdvcmtzKi8KKyNlbGlmIGRlZmluZWQoSEFWRV9QTE9DQUxUSU1FX1IpCisgIGlmIChsb2NhbHRpbWVfcigmbiwgcFQpKQorICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyNlbHNlCisgIGlmICgocFQgPSBsb2NhbHRpbWUoJm4pKSkKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwVCk7CisjZW5kaWYKKyAgZWxzZQorICAgIHN0cmNweShzb2FwLT50bXBidWYsICIxOTY5LTEyLTMxVDIzOjU5OjU5WiIpOworICByZXR1cm4gc29hcC0+dG1wYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dGRhdGVUaW1lKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgdGltZV90ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX2RhdGVUaW1lMnMoc29hcCwgKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MyZGF0ZVRpbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHRpbWVfdCAqcCkKK3sgaWYgKHMpCisgIHsgc3RydWN0IHRtIFQ7CisgICAgY2hhciB6b25lWzE2XTsKKyAgICBjb25zdCBjaGFyICp0OworICAgIG1lbXNldCgodm9pZCopJlQsIDAsIHNpemVvZihUKSk7CisgICAgem9uZVtzaXplb2Yoem9uZSktMV0gPSAnXDAnOworICAgIGlmIChzdHJjaHIocywgJy0nKSkKKyAgICAgIHQgPSAiJWQtJWQtJWRUJWQ6JWQ6JWQlMTVzIjsKKyAgICBlbHNlIGlmIChzdHJjaHIocywgJzonKSkKKyAgICAgIHQgPSAiJTRkJTJkJTJkVCVkOiVkOiVkJTE1cyI7CisgICAgZWxzZSAvKiBwYXJzZSBub24tWFNELXN0YW5kYXJkIGFsdGVybmF0aXZlIElTTyA4NjAxIGZvcm1hdCAqLworICAgICAgdCA9ICIlNGQlMmQlMmRUJTJkJTJkJTJkJTE1cyI7CisgICAgc3NjYW5mKHMsIHQsICZULnRtX3llYXIsICZULnRtX21vbiwgJlQudG1fbWRheSwgJlQudG1faG91ciwgJlQudG1fbWluLCAmVC50bV9zZWMsIHpvbmUpOworICAgIGlmIChULnRtX3llYXIgPT0gMSkKKyAgICAgIFQudG1feWVhciA9IDcwOworICAgIGVsc2UKKyAgICAgIFQudG1feWVhciAtPSAxOTAwOworICAgIFQudG1fbW9uLS07CisgICAgaWYgKCp6b25lKQorICAgIHsgaWYgKCp6b25lID09ICcuJykKKyAgICAgIHsgZm9yIChzID0gem9uZSArIDE7ICpzOyBzKyspCisgICAgICAgICAgaWYgKCpzIDwgJzAnIHx8ICpzID4gJzknKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHMgPSB6b25lOworICAgICAgaWYgKCpzID09ICcrJyB8fCAqcyA9PSAnLScpCisgICAgICB7IGludCBoID0gMCwgbSA9IDA7CisgICAgICAgIGlmIChzWzNdID09ICc6JykKKwl7IHNzY2FuZihzLCAiJWQ6JWQiLCAmaCwgJm0pOworCSAgaWYgKGggPCAwKQorCSAgICBtID0gLW07CisJfQorCWVsc2UKKwl7IG0gPSAoaW50KWF0b2wocyk7CisJICBoID0gbSAvIDEwMDsKKwkgIG0gPSBtICUgMTAwOworCX0KKyAgICAgICAgVC50bV9ob3VyIC09IGg7CisgICAgICAgIFQudG1fbWluIC09IG07CisgICAgICB9CisgICAgICBULnRtX2lzZHN0ID0gMDsKKyAgICAgICpwID0gc29hcF90aW1lZ20oJlQpOworICAgIH0KKyAgICBlbHNlCisgICAgeyBULnRtX2lzZHN0ID0gLTE7CisgICAgICAqcCA9IG1rdGltZSgmVCk7IC8qIG5vIHRpbWUgem9uZTogc3VwcG9zZSBpdCBpcyBsb2NhbHRpbWU/ICovCisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK3RpbWVfdCAqCitTT0FQX0ZNQUMyCitzb2FwX2luZGF0ZVRpbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgdGltZV90ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmRhdGVUaW1lIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcCA9ICh0aW1lX3QqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZih0aW1lX3QpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAodGltZV90Kilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKHRpbWVfdCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MyZGF0ZVRpbWUoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dGxpdGVyYWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgY2hhciAqY29uc3QqcCkKK3sgaW50IGk7CisgIGNvbnN0IGNoYXIgKnQgPSBOVUxMOworICBpZiAodGFnICYmICp0YWcgIT0gJy0nKQorICB7IGlmIChzb2FwLT5sb2NhbF9uYW1lc3BhY2VzICYmICh0ID0gc3RyY2hyKHRhZywgJzonKSkpCisgICAgeyBzdHJuY3B5KHNvYXAtPnRtcGJ1ZiwgdGFnLCB0LXRhZyk7CisgICAgICBzb2FwLT50bXBidWZbdC10YWddID0gJ1wwJzsKKyAgICAgIGZvciAoaSA9IDA7IHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0uaWQ7IGkrKykKKyAgICAgICAgaWYgKCFzdHJjbXAoc29hcC0+dG1wYnVmLCBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW2ldLmlkKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIHQrKzsKKyAgICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiPCVzIHhtbG5zPVwiJXNcIj4iLCB0LCBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW2ldLm5zID8gc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tpXS5ucyA6IFNPQVBfU1RSX0VPUyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IHQgPSB0YWc7CisgICAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIjwlcz4iLCB0YWcpOworICAgIH0KKyAgICBpZiAoc29hcF9zZW5kKHNvYXAsIHNvYXAtPnRtcGJ1ZikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHAgJiYgKnApCisgIHsgaWYgKHNvYXBfc2VuZChzb2FwLCAqcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHQpCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICI8LyVzPiIsIHQpOworICAgIHJldHVybiBzb2FwX3NlbmQoc29hcCwgc29hcC0+dG1wYnVmKTsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKioKK1NPQVBfRk1BQzIKK3NvYXBfaW5saXRlcmFsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGNoYXIgKipwKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMSkpCisgIHsgaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfTk9fVEFHIHx8IHNvYXBfdW5nZXQoc29hcCwgc29hcF9nZXQoc29hcCkpID09IFNPQVBfVFQpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIH0KKyAgaWYgKCFwKQorICAgIGlmICghKHAgPSAoY2hhcioqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihjaGFyKikpKSkKKyAgICAgIHJldHVybiBOVUxMOworICBpZiAoc29hcC0+Ym9keSkKKyAgICAqcCA9IHNvYXBfc3RyaW5nX2luKHNvYXAsIDAsIC0xLCAtMSk7CisgIGVsc2UgaWYgKHNvYXAtPm51bGwpCisgICAgKnAgPSBOVUxMOworICBlbHNlCisgICAgKnAgPSAoY2hhciopU09BUF9TVFJfRU9TOworICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHdsaXRlcmFsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHdjaGFyX3QgKmNvbnN0KnApCit7IGludCBpOworICBjb25zdCBjaGFyICp0ID0gTlVMTDsKKyAgd2NoYXJfdCBjOworICBjb25zdCB3Y2hhcl90ICpzOworICBpZiAodGFnICYmICp0YWcgIT0gJy0nKQorICB7IGlmIChzb2FwLT5sb2NhbF9uYW1lc3BhY2VzICYmICh0ID0gc3RyY2hyKHRhZywgJzonKSkpCisgICAgeyBzdHJuY3B5KHNvYXAtPnRtcGJ1ZiwgdGFnLCB0LXRhZyk7CisgICAgICBzb2FwLT50bXBidWZbdC10YWddID0gJ1wwJzsKKyAgICAgIGZvciAoaSA9IDA7IHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0uaWQ7IGkrKykKKyAgICAgICAgaWYgKCFzdHJjbXAoc29hcC0+dG1wYnVmLCBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW2ldLmlkKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIHQrKzsKKyAgICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiPCVzIHhtbG5zPVwiJXNcIj4iLCB0LCBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW2ldLm5zID8gc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tpXS5ucyA6IFNPQVBfU1RSX0VPUyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IHQgPSB0YWc7CisgICAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIjwlcz4iLCB0YWcpOworICAgIH0KKyAgICBpZiAoc29hcF9zZW5kKHNvYXAsIHNvYXAtPnRtcGJ1ZikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHApCisgIHsgcyA9ICpwOworICAgIHdoaWxlICgoYyA9ICpzKyspKQorICAgICAgaWYgKHNvYXBfcHV0dXRmOChzb2FwLCAodW5zaWduZWQgY2hhciljKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmICh0KQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiPC8lcz4iLCB0KTsKKyAgICByZXR1cm4gc29hcF9zZW5kKHNvYXAsIHNvYXAtPnRtcGJ1Zik7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3djaGFyX3QgKioKK1NPQVBfRk1BQzIKK3NvYXBfaW53bGl0ZXJhbChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB3Y2hhcl90ICoqcCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDEpKQorICB7IGlmIChzb2FwLT5lcnJvciAhPSBTT0FQX05PX1RBRyB8fCBzb2FwX3VuZ2V0KHNvYXAsIHNvYXBfZ2V0KHNvYXApKSA9PSBTT0FQX1RUKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICB9CisgIGlmICghcCkKKyAgICBpZiAoIShwID0gKHdjaGFyX3QqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yod2NoYXJfdCopKSkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgaWYgKHNvYXAtPmJvZHkpCisgICAgKnAgPSBzb2FwX3dzdHJpbmdfaW4oc29hcCwgMCwgLTEsIC0xKTsKKyAgZWxzZSBpZiAoc29hcC0+bnVsbCkKKyAgICAqcCA9IE5VTEw7CisgIGVsc2UKKyAgICAqcCA9ICh3Y2hhcl90KilTT0FQX1NUUl9FT1M7CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIgKgorU09BUF9GTUFDMgorc29hcF90b2tlbihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc2l6ZV90IGk7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IDA7CisgIHJlZ2lzdGVyIGNoYXIgKnMgPSBzb2FwLT50bXBidWY7CisgIGlmICghc29hcC0+Ym9keSkKKyAgICByZXR1cm4gU09BUF9TVFJfRU9TOworICBkbyBjID0gc29hcF9nZXQoc29hcCk7CisgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZihzb2FwLT50bXBidWYpIC0gMTsgaSsrKQorICB7IGlmIChjID09IFNPQVBfVFQgfHwgKGludCljID09IEVPRiB8fCBzb2FwX2JsYW5rKGMpKQorICAgICAgYnJlYWs7CisgICAgKnMrKyA9IChjaGFyKWM7CisgICAgYyA9IHNvYXBfZ2V0KHNvYXApOworICB9CisgIGlmICgoaW50KWMgPT0gRU9GIHx8IGMgPT0gU09BUF9UVCkKKyAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAqcyA9ICdcMCc7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRWxlbWVudCBjb250ZW50IHZhbHVlPSclcydcbiIsIHNvYXAtPnRtcGJ1ZikpOworICByZXR1cm4gc29hcC0+dG1wYnVmOyAvKiByZXR1cm4gbm9uLW51bGwgcG9pbnRlciAqLworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3ZhbHVlKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzaXplX3QgaTsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjID0gMDsKKyAgcmVnaXN0ZXIgY2hhciAqcyA9IHNvYXAtPnRtcGJ1ZjsKKyAgaWYgKCFzb2FwLT5ib2R5KQorICAgIHJldHVybiBTT0FQX1NUUl9FT1M7CisgIGRvIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZikgLSAxOyBpKyspCisgIHsgaWYgKGMgPT0gU09BUF9UVCB8fCAoaW50KWMgPT0gRU9GKQorICAgICAgYnJlYWs7CisgICAgKnMrKyA9IChjaGFyKWM7CisgICAgYyA9IHNvYXBfZ2V0KHNvYXApOworICB9CisgIGZvciAocy0tOyBpID4gMDsgaS0tLCBzLS0pCisgICAgaWYgKCFzb2FwX2JsYW5rKCpzKSkKKyAgICAgIGJyZWFrOworICBzWzFdID0gJ1wwJzsKKyAgaWYgKChpbnQpYyA9PSBFT0YgfHwgYyA9PSBTT0FQX1RUKQorICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRWxlbWVudCBjb250ZW50IHZhbHVlPSclcydcbiIsIHNvYXAtPnRtcGJ1ZikpOworI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICAgIHNvYXAtPmRvbS0+ZGF0YSA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPnRtcGJ1Zik7CisjZW5kaWYKKyAgcmV0dXJuIHNvYXAtPnRtcGJ1ZjsgLyogcmV0dXJuIG5vbi1udWxsIHBvaW50ZXIgKi8KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmICFkZWZpbmVkKFdJVEhfTEVBTkVSKSB8fCAhZGVmaW5lZChXSVRIX05PSFRUUCkKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0bGluZShzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqcywgaW50IGxlbikKK3sgaW50IGkgPSBsZW47CisgIHNvYXBfd2NoYXIgYyA9IDA7CisgIGZvciAoOzspCisgIHsgd2hpbGUgKC0taSA+IDApCisgICAgeyBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICAgICAgaWYgKGMgPT0gJ1xyJyB8fCBjID09ICdcbicpCisgICAgICAgIGJyZWFrOworICAgICAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgICAgKnMrKyA9IChjaGFyKWM7CisgICAgfQorICAgIGlmIChjICE9ICdcbicpCisgICAgICBjID0gc29hcF9nZXRjaGFyKHNvYXApOyAvKiBnb3QgXHIsIG5vdyBnZXQgXG4gKi8KKyAgICBpZiAoYyA9PSAnXG4nKQorICAgIHsgKnMgPSAnXDAnOworICAgICAgaWYgKGkrMSA9PSBsZW4pIC8qIGVtcHR5IGxpbmU6IGVuZCBvZiBIVFRQL01JTUUgaGVhZGVyICovCisgICAgICAgIGJyZWFrOworICAgICAgYyA9IHNvYXBfdW5nZXQoc29hcCwgc29hcF9nZXRjaGFyKHNvYXApKTsKKyAgICAgIGlmIChjICE9ICcgJyAmJiBjICE9ICdcdCcpIC8qIEhUVFAgbGluZSBjb250aW51YXRpb24/ICovCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBlbHNlIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzaXplX3QKK3NvYXBfY291bnRfYXR0YWNobWVudHMoc3RydWN0IHNvYXAgKnNvYXApCit7IAorI2lmbmRlZiBXSVRIX0xFQU5FUgorICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgIHJlZ2lzdGVyIHNpemVfdCBjb3VudCA9IHNvYXAtPmNvdW50OworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNhbGN1bGF0aW5nIHRoZSBtZXNzYWdlIHNpemUgd2l0aCBhdHRhY2htZW50cywgY3VycmVudCBjb3VudD0lbHVcbiIsICh1bnNpZ25lZCBsb25nKWNvdW50KSk7CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpICYmICEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ2FsY3VsYXRpbmcgdGhlIHNpemUgb2YgRElNRSBhdHRhY2htZW50c1xuIikpOworICAgIGZvciAoY29udGVudCA9IHNvYXAtPmRpbWUuZmlyc3Q7IGNvbnRlbnQ7IGNvbnRlbnQgPSBjb250ZW50LT5uZXh0KQorICAgIHsgY291bnQgKz0gMTIgKyAoKGNvbnRlbnQtPnNpemUrMykmKH4zKSk7CisgICAgICBpZiAoY29udGVudC0+aWQpCisgICAgICAgIGNvdW50ICs9ICgoc3RybGVuKGNvbnRlbnQtPmlkKSszKSYofjMpKTsKKyAgICAgIGlmIChjb250ZW50LT50eXBlKQorICAgICAgICBjb3VudCArPSAoKHN0cmxlbihjb250ZW50LT50eXBlKSszKSYofjMpKTsKKyAgICAgIGlmIChjb250ZW50LT5vcHRpb25zKQorICAgICAgICBjb3VudCArPSAoKCgodW5zaWduZWQgY2hhciljb250ZW50LT5vcHRpb25zWzJdIDw8IDgpIHwgKCh1bnNpZ25lZCBjaGFyKWNvbnRlbnQtPm9wdGlvbnNbM10pKSs3KSYofjMpOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTaXplIG9mIERJTUUgYXR0YWNobWVudCBjb250ZW50IGlzICVsdSBieXRlc1xuIiwgKHVuc2lnbmVkIGxvbmcpY29udGVudC0+c2l6ZSkpOworICAgIH0KKyAgfQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKSAmJiBzb2FwLT5taW1lLmJvdW5kYXJ5KQorICB7IHJlZ2lzdGVyIHNpemVfdCBuID0gc3RybGVuKHNvYXAtPm1pbWUuYm91bmRhcnkpOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ2FsY3VsYXRpbmcgdGhlIHNpemUgb2YgTUlNRSBhdHRhY2htZW50c1xuIikpOworICAgIGZvciAoY29udGVudCA9IHNvYXAtPm1pbWUuZmlyc3Q7IGNvbnRlbnQ7IGNvbnRlbnQgPSBjb250ZW50LT5uZXh0KQorICAgIHsgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKKyAgICAgIC8qIGNvdW50IFxyXG4tLWJvdW5kYXJ5XHJcbiAqLworICAgICAgY291bnQgKz0gNiArIG47CisgICAgICAvKiBjb3VudCBDb250ZW50LVR5cGU6IC4uLlxyXG4gKi8KKyAgICAgIGlmIChjb250ZW50LT50eXBlKQorICAgICAgICBjb3VudCArPSAxNiArIHN0cmxlbihjb250ZW50LT50eXBlKTsKKyAgICAgIC8qIGNvdW50IENvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IC4uLlxyXG4gKi8KKyAgICAgIHMgPSBzb2FwX3N0cl9jb2RlKG1pbWVfY29kZXMsIGNvbnRlbnQtPmVuY29kaW5nKTsKKyAgICAgIGlmIChzKQorICAgICAgICBjb3VudCArPSAyOSArIHN0cmxlbihzKTsKKyAgICAgIC8qIGNvdW50IENvbnRlbnQtSUQ6IC4uLlxyXG4gKi8KKyAgICAgIGlmIChjb250ZW50LT5pZCkKKyAgICAgICAgY291bnQgKz0gMTQgKyBzdHJsZW4oY29udGVudC0+aWQpOworICAgICAgLyogY291bnQgQ29udGVudC1Mb2NhdGlvbjogLi4uXHJcbiAqLworICAgICAgaWYgKGNvbnRlbnQtPmxvY2F0aW9uKQorICAgICAgICBjb3VudCArPSAyMCArIHN0cmxlbihjb250ZW50LT5sb2NhdGlvbik7CisgICAgICAvKiBjb3VudCBDb250ZW50LURlc2NyaXB0aW9uOiAuLi5cclxuICovCisgICAgICBpZiAoY29udGVudC0+ZGVzY3JpcHRpb24pCisgICAgICAgIGNvdW50ICs9IDIzICsgc3RybGVuKGNvbnRlbnQtPmxvY2F0aW9uKTsKKyAgICAgIC8qIGNvdW50IFxyXG4uLi5jb250ZW50ICovCisgICAgICBjb3VudCArPSAyICsgY29udGVudC0+c2l6ZTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2l6ZSBvZiBNSU1FIGF0dGFjaG1lbnQgY29udGVudCBpcyAlbHUgYnl0ZXNcbiIsICh1bnNpZ25lZCBsb25nKWNvbnRlbnQtPnNpemUpKTsKKyAgICB9CisgICAgLyogY291bnQgXHJcbi0tYm91bmRhcnktLSAqLworICAgIGNvdW50ICs9IDYgKyBuOworICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTmV3IGNvdW50IGlzICVsdSBieXRlc1xuIiwgKHVuc2lnbmVkIGxvbmcpY291bnQpKTsKKyAgcmV0dXJuIGNvdW50OworI2Vsc2UKKyAgcmV0dXJuIHNvYXAtPmNvdW50OworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzb2FwX3B1dGRpbWVmaWVsZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgc2l6ZV90IG4pCit7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIG4pKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgU09BUF9TVFJfUEFERElORywgLShsb25nKW4mMyk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9kaW1lX29wdGlvbihzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgc2hvcnQgb3B0eXBlLCBjb25zdCBjaGFyICpvcHRpb24pCit7IHNpemVfdCBuOworICBjaGFyICpzID0gTlVMTDsKKyAgaWYgKG9wdGlvbikKKyAgeyBuID0gc3RybGVuKG9wdGlvbik7CisgICAgcyA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBuICsgNSk7CisgICAgaWYgKHMpCisgICAgeyBzWzBdID0gb3B0eXBlID4+IDg7CisgICAgICBzWzFdID0gb3B0eXBlICYgMHhGRjsKKyAgICAgIHNbMl0gPSBuID4+IDg7CisgICAgICBzWzNdID0gbiAmIDB4RkY7CisgICAgICBzdHJjcHkocyArIDQsIG9wdGlvbik7CisgICAgfQorICB9CisgIHJldHVybiBzOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0ZGltZWhkcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgdW5zaWduZWQgY2hhciB0bXBbMTJdOworICBzaXplX3Qgb3B0bGVuID0gMCwgaWRsZW4gPSAwLCB0eXBlbGVuID0gMDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQdXQgRElNRSBoZWFkZXIgaWQ9JyVzJ1xuIiwgc29hcC0+ZGltZS5pZD9zb2FwLT5kaW1lLmlkOiIiKSk7CisgIGlmIChzb2FwLT5kaW1lLm9wdGlvbnMpCisgICAgb3B0bGVuID0gKCgodW5zaWduZWQgY2hhcilzb2FwLT5kaW1lLm9wdGlvbnNbMl0gPDwgOCkgfCAoKHVuc2lnbmVkIGNoYXIpc29hcC0+ZGltZS5vcHRpb25zWzNdKSkgKyA0OworICBpZiAoc29hcC0+ZGltZS5pZCkKKyAgICBpZGxlbiA9IHN0cmxlbihzb2FwLT5kaW1lLmlkKTsKKyAgaWYgKHNvYXAtPmRpbWUudHlwZSkKKyAgICB0eXBlbGVuID0gc3RybGVuKHNvYXAtPmRpbWUudHlwZSk7CisgIHRtcFswXSA9IFNPQVBfRElNRV9WRVJTSU9OIHwgKHNvYXAtPmRpbWUuZmxhZ3MgJiAweDcpOworICB0bXBbMV0gPSBzb2FwLT5kaW1lLmZsYWdzICYgMHhGMDsKKyAgdG1wWzJdID0gb3B0bGVuID4+IDg7CisgIHRtcFszXSA9IG9wdGxlbiAmIDB4RkY7CisgIHRtcFs0XSA9IGlkbGVuID4+IDg7CisgIHRtcFs1XSA9IGlkbGVuICYgMHhGRjsKKyAgdG1wWzZdID0gdHlwZWxlbiA+PiA4OworICB0bXBbN10gPSB0eXBlbGVuICYgMHhGRjsKKyAgdG1wWzhdID0gc29hcC0+ZGltZS5zaXplID4+IDI0OworICB0bXBbOV0gPSAoc29hcC0+ZGltZS5zaXplID4+IDE2KSAmIDB4RkY7CisgIHRtcFsxMF0gPSAoc29hcC0+ZGltZS5zaXplID4+IDgpICYgMHhGRjsKKyAgdG1wWzExXSA9IHNvYXAtPmRpbWUuc2l6ZSAmIDB4RkY7CisgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIChjaGFyKil0bXAsIDEyKQorICAgfHwgc29hcF9wdXRkaW1lZmllbGQoc29hcCwgc29hcC0+ZGltZS5vcHRpb25zLCBvcHRsZW4pCisgICB8fCBzb2FwX3B1dGRpbWVmaWVsZChzb2FwLCBzb2FwLT5kaW1lLmlkLCBpZGxlbikKKyAgIHx8IHNvYXBfcHV0ZGltZWZpZWxkKHNvYXAsIHNvYXAtPmRpbWUudHlwZSwgdHlwZWxlbikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dGRpbWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpKQorICAgIHJldHVybiBTT0FQX09LOworICBmb3IgKGNvbnRlbnQgPSBzb2FwLT5kaW1lLmZpcnN0OyBjb250ZW50OyBjb250ZW50ID0gY29udGVudC0+bmV4dCkKKyAgeyB2b2lkICpoYW5kbGU7CisgICAgc29hcC0+ZGltZS5zaXplID0gY29udGVudC0+c2l6ZTsKKyAgICBzb2FwLT5kaW1lLmlkID0gY29udGVudC0+aWQ7CisgICAgc29hcC0+ZGltZS50eXBlID0gY29udGVudC0+dHlwZTsKKyAgICBzb2FwLT5kaW1lLm9wdGlvbnMgPSBjb250ZW50LT5vcHRpb25zOworICAgIHNvYXAtPmRpbWUuZmxhZ3MgPSBTT0FQX0RJTUVfVkVSU0lPTiB8IFNPQVBfRElNRV9NRURJQTsKKyAgICBpZiAoc29hcC0+ZmRpbWVyZWFkb3BlbiAmJiAoKGhhbmRsZSA9IHNvYXAtPmZkaW1lcmVhZG9wZW4oc29hcCwgKHZvaWQqKWNvbnRlbnQtPnB0ciwgY29udGVudC0+aWQsIGNvbnRlbnQtPnR5cGUsIGNvbnRlbnQtPm9wdGlvbnMpKSB8fCBzb2FwLT5lcnJvcikpCisgICAgeyBzaXplX3Qgc2l6ZSA9IGNvbnRlbnQtPnNpemU7CisgICAgICBpZiAoIWhhbmRsZSkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJmZGltZXJlYWRvcGVuIGZhaWxlZFxuIikpOworICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB9CisgICAgICBpZiAoIWNvbnRlbnQtPnNpemUgJiYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfWE1MKSB8fCAoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTksgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX1NUT1JFKSkKKyAgICAgIHsgc2l6ZV90IGNodW5rc2l6ZSA9IHNpemVvZihzb2FwLT50bXBidWYpOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNodW5rZWQgc3RyZWFtaW5nIERJTUVcbiIpKTsKKyAgICAgICAgZG8gCisgICAgICAgIHsgc2l6ZSA9IHNvYXAtPmZkaW1lcmVhZChzb2FwLCBoYW5kbGUsIHNvYXAtPnRtcGJ1ZiwgY2h1bmtzaXplKTsKKyAgICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImZkaW1lcmVhZCByZXR1cm5lZCAlbHUgYnl0ZXNcbiIsICh1bnNpZ25lZCBsb25nKXNpemUpKTsKKyAgICAgICAgICBpZiAoc2l6ZSA8IGNodW5rc2l6ZSkKKyAJICB7IHNvYXAtPmRpbWUuZmxhZ3MgJj0gflNPQVBfRElNRV9DRjsKKyAgICAgICAgICAgIGlmICghY29udGVudC0+bmV4dCkKKyAgICAgICAgICAgICAgc29hcC0+ZGltZS5mbGFncyB8PSBTT0FQX0RJTUVfTUU7CisJICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgc29hcC0+ZGltZS5mbGFncyB8PSBTT0FQX0RJTUVfQ0Y7CisJICBzb2FwLT5kaW1lLnNpemUgPSBzaXplOworICAgICAgICAgIGlmIChzb2FwX3B1dGRpbWVoZHIoc29hcCkKKwkgICB8fCBzb2FwX3B1dGRpbWVmaWVsZChzb2FwLCBzb2FwLT50bXBidWYsIHNpemUpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgaWYgKHNvYXAtPmRpbWUuaWQpCisgCSAgeyBzb2FwLT5kaW1lLmZsYWdzICY9IH4oU09BUF9ESU1FX01CIHwgU09BUF9ESU1FX01FRElBKTsKKyAgICAgICAgICAgIHNvYXAtPmRpbWUuaWQgPSBOVUxMOworICAgICAgICAgICAgc29hcC0+ZGltZS50eXBlID0gTlVMTDsKKyAgICAgICAgICAgIHNvYXAtPmRpbWUub3B0aW9ucyA9IE5VTEw7CisgICAgICAgICAgfSAgCisgICAgICAgIH0gd2hpbGUgKHNpemUgPj0gY2h1bmtzaXplKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgaWYgKCFjb250ZW50LT5uZXh0KQorICAgICAgICAgIHNvYXAtPmRpbWUuZmxhZ3MgfD0gU09BUF9ESU1FX01FOworICAgICAgICBpZiAoc29hcF9wdXRkaW1laGRyKHNvYXApKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgZG8KKyAgICAgICAgeyBzaXplX3QgYnVmc2l6ZTsKKwkgIGlmIChzaXplIDwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZikpCisgICAgICAgICAgICBidWZzaXplID0gc2l6ZTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBidWZzaXplID0gc2l6ZW9mKHNvYXAtPnRtcGJ1Zik7CisgICAgICAgICAgaWYgKCEoYnVmc2l6ZSA9IHNvYXAtPmZkaW1lcmVhZChzb2FwLCBoYW5kbGUsIHNvYXAtPnRtcGJ1ZiwgYnVmc2l6ZSkpKQorICAgICAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJmZGltZXJlYWQgZmFpbGVkOiBpbnN1ZmZpY2llbnQgZGF0YSAoJWx1IGJ5dGVzIHJlbWFpbmluZyBmcm9tICVsdSBieXRlcylcbiIsICh1bnNpZ25lZCBsb25nKXNpemUsICh1bnNpZ25lZCBsb25nKXNvYXAtPmRpbWUuc2l6ZSkpOworICAgICAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKwkgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHNvYXAtPnRtcGJ1ZiwgYnVmc2l6ZSkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBzaXplIC09IGJ1ZnNpemU7CisgICAgICAgIH0gd2hpbGUgKHNpemUpOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImZkaW1lcmVhZGNsb3NlXG4iKSk7CisgICAgICAgIHNvYXBfc2VuZF9yYXcoc29hcCwgU09BUF9TVFJfUEFERElORywgLShsb25nKXNvYXAtPmRpbWUuc2l6ZSYzKTsKKyAgICAgIH0KKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZmRpbWVyZWFkY2xvc2VcbiIpKTsKKyAgICAgIGlmIChzb2FwLT5mZGltZXJlYWRjbG9zZSkKKyAgICAgICAgc29hcC0+ZmRpbWVyZWFkY2xvc2Uoc29hcCwgaGFuZGxlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgaWYgKCFjb250ZW50LT5uZXh0KQorICAgICAgICBzb2FwLT5kaW1lLmZsYWdzIHw9IFNPQVBfRElNRV9NRTsKKyAgICAgIGlmIChzb2FwX3B1dGRpbWVoZHIoc29hcCkKKyAgICAgICB8fCBzb2FwX3B1dGRpbWVmaWVsZChzb2FwLCAoY2hhciopY29udGVudC0+cHRyLCBjb250ZW50LT5zaXplKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNoYXIgKgorc29hcF9nZXRkaW1lZmllbGQoc3RydWN0IHNvYXAgKnNvYXAsIHNpemVfdCBuKQoreyByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBjaGFyICpzOworICBjaGFyICpwID0gTlVMTDsKKyAgaWYgKG4pCisgIHsgcCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBuICsgMSk7CisgICAgaWYgKHApCisgICAgeyBzID0gcDsKKyAgICAgIGZvciAoaSA9IG47IGkgPiAwOyBpLS0pCisgICAgICB7IGlmICgoaW50KShjID0gc29hcF9nZXQxKHNvYXApKSA9PSBFT0YpCisgICAgICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICAqcysrID0gKGNoYXIpYzsKKyAgICAgIH0KKyAgICAgICpzID0gJ1wwJzsKKyAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwX21vdmUoc29hcCwgLShsb25nKW4mMykpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgfQorICByZXR1cm4gcDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldGRpbWVoZHIoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgcmVnaXN0ZXIgY2hhciAqczsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIHVuc2lnbmVkIGNoYXIgdG1wWzEyXTsKKyAgc2l6ZV90IG9wdGxlbiwgaWRsZW4sIHR5cGVsZW47CisgIGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0RJTUVfRU5EOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdldCBESU1FIGhlYWRlclxuIikpOworICBpZiAoc29hcC0+ZGltZS5idWZsZW4gfHwgc29hcC0+ZGltZS5jaHVua3NpemUpCisgIHsgaWYgKHNvYXBfbW92ZShzb2FwLCAobG9uZykoc29hcC0+ZGltZS5zaXplIC0gc29hcF90ZWxsKHNvYXApKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICBzb2FwX3VuZ2V0KHNvYXAsIHNvYXBfZ2V0Y2hhcihzb2FwKSk7IC8qIHNraXAgcGFkZGluZyBhbmQgZ2V0IGhkciAqLworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiLi4uIEZyb20gY2h1bmtlZFxuIikpOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIHMgPSAoY2hhciopdG1wOworICBmb3IgKGkgPSAxMjsgaSA+IDA7IGktLSkKKyAgeyBpZiAoKGludCkoYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKSkgPT0gRU9GKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgKnMrKyA9IChjaGFyKWM7CisgIH0KKyAgaWYgKCh0bXBbMF0gJiAweEY4KSAhPSBTT0FQX0RJTUVfVkVSU0lPTikKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0RJTUVfTUlTTUFUQ0g7CisgIHNvYXAtPmRpbWUuZmxhZ3MgPSAodG1wWzBdICYgMHg3KSB8ICh0bXBbMV0gJiAweEYwKTsKKyAgb3B0bGVuID0gKHRtcFsyXSA8PCA4KSB8IHRtcFszXTsKKyAgaWRsZW4gPSAodG1wWzRdIDw8IDgpIHwgdG1wWzVdOworICB0eXBlbGVuID0gKHRtcFs2XSA8PCA4KSB8IHRtcFs3XTsKKyAgc29hcC0+ZGltZS5zaXplID0gKHRtcFs4XSA8PCAyNCkgfCAodG1wWzldIDw8IDE2KSB8ICh0bXBbMTBdIDw8IDgpIHwgdG1wWzExXTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJESU1FIHNpemU9JWx1IGZsYWdzPTB4JVhcbiIsICh1bnNpZ25lZCBsb25nKXNvYXAtPmRpbWUuc2l6ZSwgc29hcC0+ZGltZS5mbGFncykpOworICBpZiAoIShzb2FwLT5kaW1lLm9wdGlvbnMgPSBzb2FwX2dldGRpbWVmaWVsZChzb2FwLCBvcHRsZW4pKSAmJiBzb2FwLT5lcnJvcikKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmICghKHNvYXAtPmRpbWUuaWQgPSBzb2FwX2dldGRpbWVmaWVsZChzb2FwLCBpZGxlbikpICYmIHNvYXAtPmVycm9yKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKCEoc29hcC0+ZGltZS50eXBlID0gc29hcF9nZXRkaW1lZmllbGQoc29hcCwgdHlwZWxlbikpICYmIHNvYXAtPmVycm9yKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJESU1FIGlkPSVzLCB0eXBlPSVzLCBvcHRpb25zPSVzXG4iLCBzb2FwLT5kaW1lLmlkP3NvYXAtPmRpbWUuaWQ6IiIsIHNvYXAtPmRpbWUudHlwZT9zb2FwLT5kaW1lLnR5cGU6IiIsIHNvYXAtPmRpbWUub3B0aW9ucz9zb2FwLT5kaW1lLm9wdGlvbnMrNDoiIikpOworICBpZiAoc29hcC0+ZGltZS5mbGFncyAmIFNPQVBfRElNRV9NRSkKKyAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0VOQ19ESU1FOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldGRpbWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHdoaWxlIChzb2FwLT5kaW1lLmZsYWdzICYgU09BUF9ESU1FX0NGKQorICB7IGlmIChzb2FwX2dldGRpbWVoZHIoc29hcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHNvYXBfbW92ZShzb2FwLCBzb2FwLT5kaW1lLnNpemUpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIH0KKyAgaWYgKHNvYXBfbW92ZShzb2FwLCAoKHNvYXAtPmRpbWUuc2l6ZSszKSYofjMpKS1zb2FwX3RlbGwoc29hcCkpKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICBmb3IgKDs7KQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgICBpZiAoc29hcF9nZXRkaW1laGRyKHNvYXApKQorICAgICAgYnJlYWs7CisgICAgaWYgKHNvYXAtPmZkaW1ld3JpdGVvcGVuICYmICgoc29hcC0+ZGltZS5wdHIgPSAoY2hhciopc29hcC0+ZmRpbWV3cml0ZW9wZW4oc29hcCwgc29hcC0+ZGltZS5pZCwgc29hcC0+ZGltZS50eXBlLCBzb2FwLT5kaW1lLm9wdGlvbnMpKSB8fCBzb2FwLT5lcnJvcikpCisgICAgeyBjb25zdCBjaGFyICppZCwgKnR5cGUsICpvcHRpb25zOworICAgICAgc2l6ZV90IHNpemUsIG47CisgICAgICBpZiAoIXNvYXAtPmRpbWUucHRyKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBpZCA9IHNvYXAtPmRpbWUuaWQ7CisgICAgICB0eXBlID0gc29hcC0+ZGltZS50eXBlOworICAgICAgb3B0aW9ucyA9IHNvYXAtPmRpbWUub3B0aW9uczsKKyAgICAgIGZvciAoOzspCisgICAgICB7IHNpemUgPSBzb2FwLT5kaW1lLnNpemU7CisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsgbiA9IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICAgICAgICBpZiAoc2l6ZSA8IG4pCisgICAgICAgICAgICBuID0gc2l6ZTsKKyAgICAgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZmRpbWV3cml0ZShzb2FwLCAodm9pZCopc29hcC0+ZGltZS5wdHIsIHNvYXAtPmJ1ZiArIHNvYXAtPmJ1ZmlkeCwgbikpKQorICAgICAgICAgICAgYnJlYWs7CisJICBzaXplIC09IG47CisJICBpZiAoIXNpemUpCisJICB7IHNvYXAtPmJ1ZmlkeCArPSBuOworCSAgICBicmVhazsKKwkgIH0KKwkgIGlmIChzb2FwX3JlY3Yoc29hcCkpCisgICAgICAgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworCSAgICBnb3RvIGVuZDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvYXBfbW92ZShzb2FwLCAtKGxvbmcpc29hcC0+ZGltZS5zaXplJjMpKQorICAgICAgICB7IHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisJICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShzb2FwLT5kaW1lLmZsYWdzICYgU09BUF9ESU1FX0NGKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKHNvYXBfZ2V0ZGltZWhkcihzb2FwKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KK2VuZDoKKyAgICAgIGlmIChzb2FwLT5mZGltZXdyaXRlY2xvc2UpCisgICAgICAgIHNvYXAtPmZkaW1ld3JpdGVjbG9zZShzb2FwLCAodm9pZCopc29hcC0+ZGltZS5wdHIpOworICAgICAgc29hcC0+ZGltZS5zaXplID0gMDsKKyAgICAgIHNvYXAtPmRpbWUuaWQgPSBpZDsKKyAgICAgIHNvYXAtPmRpbWUudHlwZSA9IHR5cGU7CisgICAgICBzb2FwLT5kaW1lLm9wdGlvbnMgPSBvcHRpb25zOworICAgIH0KKyAgICBlbHNlIGlmIChzb2FwLT5kaW1lLmZsYWdzICYgU09BUF9ESU1FX0NGKQorICAgIHsgY29uc3QgY2hhciAqaWQsICp0eXBlLCAqb3B0aW9uczsKKyAgICAgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgICAgIHJlZ2lzdGVyIGNoYXIgKnM7CisgICAgICByZWdpc3RlciBpbnQgaTsKKyAgICAgIGlkID0gc29hcC0+ZGltZS5pZDsKKyAgICAgIHR5cGUgPSBzb2FwLT5kaW1lLnR5cGU7CisgICAgICBvcHRpb25zID0gc29hcC0+ZGltZS5vcHRpb25zOworICAgICAgaWYgKHNvYXBfbmV3X2Jsb2NrKHNvYXApKQorICAgICAgICByZXR1cm4gU09BUF9FT007CisgICAgICBmb3IgKDs7KQorICAgICAgeyBzID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBzb2FwLT5kaW1lLnNpemUpOworICAgICAgICBpZiAoIXMpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICAgIGZvciAoaSA9IHNvYXAtPmRpbWUuc2l6ZTsgaSA+IDA7IGktLSkKKyAgICAgICAgeyBpZiAoKGludCkoYyA9IHNvYXBfZ2V0MShzb2FwKSkgPT0gRU9GKQorICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgICAgICAgKnMrKyA9IChjaGFyKWM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvYXBfbW92ZShzb2FwLCAtKGxvbmcpc29hcC0+ZGltZS5zaXplJjMpKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgICAgICBpZiAoIShzb2FwLT5kaW1lLmZsYWdzICYgU09BUF9ESU1FX0NGKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKHNvYXBfZ2V0ZGltZWhkcihzb2FwKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB9CisgICAgICBzb2FwLT5kaW1lLnNpemUgPSBzb2FwLT5ibGlzdC0+c2l6ZSsrOyAvKiBhbGxvY2F0ZSBvbmUgbW9yZSBmb3IgJ1wwJyAqLworICAgICAgaWYgKCEoc29hcC0+ZGltZS5wdHIgPSBzb2FwX3NhdmVfYmxvY2soc29hcCwgTlVMTCwgMCkpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBzb2FwLT5kaW1lLnB0cltzb2FwLT5kaW1lLnNpemVdID0gJ1wwJzsgLyogZm9yY2UgMC10ZXJtaW5hdGVkICovCisgICAgICBzb2FwLT5kaW1lLmlkID0gaWQ7CisgICAgICBzb2FwLT5kaW1lLnR5cGUgPSB0eXBlOworICAgICAgc29hcC0+ZGltZS5vcHRpb25zID0gb3B0aW9uczsKKyAgICB9CisgICAgZWxzZQorICAgICAgc29hcC0+ZGltZS5wdHIgPSBzb2FwX2dldGRpbWVmaWVsZChzb2FwLCBzb2FwLT5kaW1lLnNpemUpOworICAgIGNvbnRlbnQgPSBzb2FwX25ld19tdWx0aXBhcnQoc29hcCwgJnNvYXAtPmRpbWUuZmlyc3QsICZzb2FwLT5kaW1lLmxhc3QsIHNvYXAtPmRpbWUucHRyLCBzb2FwLT5kaW1lLnNpemUpOworICAgIGlmICghY29udGVudCkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIGNvbnRlbnQtPmlkID0gc29hcC0+ZGltZS5pZDsKKyAgICBjb250ZW50LT50eXBlID0gc29hcC0+ZGltZS50eXBlOworICAgIGNvbnRlbnQtPm9wdGlvbnMgPSBzb2FwLT5kaW1lLm9wdGlvbnM7CisgICAgc29hcF9yZXNvbHZlX2F0dGFjaG1lbnQoc29hcCwgY29udGVudCk7CisgICAgaWYgKHNvYXAtPmVycm9yKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmIChzb2FwLT5lcnJvciAhPSBTT0FQX0RJTUVfRU5EKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldG1pbWVoZHIoc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgZG8KKyAgeyBpZiAoc29hcF9nZXRsaW5lKHNvYXAsIHNvYXAtPm1zZ2J1Ziwgc2l6ZW9mKHNvYXAtPm1zZ2J1ZikpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHdoaWxlICghKnNvYXAtPm1zZ2J1Zik7CisgIGlmIChzb2FwLT5tc2didWZbMF0gPT0gJy0nICYmIHNvYXAtPm1zZ2J1ZlsxXSA9PSAnLScpCisgIHsgY2hhciAqcyA9IHNvYXAtPm1zZ2J1ZiArIHN0cmxlbihzb2FwLT5tc2didWYpIC0gMTsKKyAgICAvKiByZW1vdmUgd2hpdGUgc3BhY2UgKi8KKyAgICB3aGlsZSAoc29hcF9ibGFuaygqcykpCisgICAgICBzLS07CisgICAgc1sxXSA9ICdcMCc7CisgICAgaWYgKHNvYXAtPm1pbWUuYm91bmRhcnkpCisgICAgeyBpZiAoc3RyY21wKHNvYXAtPm1zZ2J1ZiArIDIsIHNvYXAtPm1pbWUuYm91bmRhcnkpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX01JTUVfRVJST1I7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHNvYXAtPm1pbWUuYm91bmRhcnkgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT5tc2didWYgKyAyKTsKKyAgICBpZiAoc29hcF9nZXRsaW5lKHNvYXAsIHNvYXAtPm1zZ2J1Ziwgc2l6ZW9mKHNvYXAtPm1zZ2J1ZikpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmIChzb2FwX3NldF9taW1lX2F0dGFjaG1lbnQoc29hcCwgTlVMTCwgMCwgU09BUF9NSU1FX05PTkUsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICBjb250ZW50ID0gc29hcC0+bWltZS5sYXN0OworICBmb3IgKDs7KQorICB7IHJlZ2lzdGVyIGNoYXIgKmtleSA9IHNvYXAtPm1zZ2J1ZjsKKyAgICByZWdpc3RlciBjaGFyICp2YWw7CisgICAgaWYgKCEqa2V5KQorICAgICAgYnJlYWs7CisgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk1JTUUgaGVhZGVyOiAlc1xuIiwga2V5KSk7CisgICAgdmFsID0gc3RyY2hyKHNvYXAtPm1zZ2J1ZiwgJzonKTsKKyAgICBpZiAodmFsKQorICAgIHsgKnZhbCA9ICdcMCc7CisgICAgICBkbyB2YWwrKzsKKyAgICAgIHdoaWxlICgqdmFsICYmICp2YWwgPD0gMzIpOworICAgICAgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1JRCIpKQorICAgICAgICBjb250ZW50LT5pZCA9IHNvYXBfc3RyZHVwKHNvYXAsIHZhbCk7CisgICAgICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtTG9jYXRpb24iKSkKKyAgICAgICAgY29udGVudC0+bG9jYXRpb24gPSBzb2FwX3N0cmR1cChzb2FwLCB2YWwpOworICAgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LURpc3Bvc2l0aW9uIikpCisgICAgICAgIGNvbnRlbnQtPmlkID0gc29hcF9zdHJkdXAoc29hcCwgc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwsICJuYW1lIikpOworICAgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LVR5cGUiKSkKKyAgICAgICAgY29udGVudC0+dHlwZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHZhbCk7CisgICAgICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtRGVzY3JpcHRpb24iKSkKKyAgICAgICAgY29udGVudC0+ZGVzY3JpcHRpb24gPSBzb2FwX3N0cmR1cChzb2FwLCB2YWwpOworICAgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIikpCisgICAgICAgIGNvbnRlbnQtPmVuY29kaW5nID0gKGVudW0gc29hcF9taW1lX2VuY29kaW5nKXNvYXBfaW50X2NvZGUobWltZV9jb2RlcywgdmFsLCAobG9uZylTT0FQX01JTUVfTk9ORSk7CisgICAgfQorICAgIGlmIChzb2FwX2dldGxpbmUoc29hcCwga2V5LCBzaXplb2Yoc29hcC0+bXNnYnVmKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRtaW1lKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzb2FwX3djaGFyIGMgPSAwOworICBpZiAoIXNvYXAtPm1pbWUubGFzdCkKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgZm9yICg7OykKKyAgeyByZWdpc3RlciBzaXplX3QgaSwgbSA9IDA7CisgICAgcmVnaXN0ZXIgY2hhciAqcywgKnQgPSBOVUxMOworICAgIHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudCA9IHNvYXAtPm1pbWUubGFzdDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlBhcnNpbmcgTUlNRSBjb250ZW50IGlkPSVzIHR5cGU9JXNcbiIsIGNvbnRlbnQtPmlkP2NvbnRlbnQtPmlkOiIiLCBjb250ZW50LT50eXBlP2NvbnRlbnQtPnR5cGU6IiIpKTsKKyAgICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICBmb3IgKDs7KQorICAgIHsgcmVnaXN0ZXIgc2hvcnQgZmxhZyA9IDA7CisgICAgICBpZiAoIShzID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBTT0FQX0JMS0xFTikpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0JMS0xFTjsgaSsrKQorICAgICAgeyBpZiAobSA+IDApCisgICAgICAgIHsgKnMrKyA9ICp0Kys7CisJICBtLS07CisJfQorCWVsc2UKKyAgICAgICAgeyBpZiAoIWZsYWcpCisJICB7IGMgPSBzb2FwX2dldDEoc29hcCk7CisJICAgIGlmICgoaW50KWMgPT0gRU9GKQorCSAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworCSAgfQorCSAgaWYgKGZsYWcgfHwgYyA9PSAnXHInKQorCSAgeyB0ID0gc29hcC0+dG1wYnVmOworCSAgICBtZW1zZXQodCwgMCwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZikpOworICAgICAgICAgICAgc3RyY3B5KHQsICJcbi0tIik7CisgICAgICAgICAgICBpZiAoc29hcC0+bWltZS5ib3VuZGFyeSkKKwkgICAgICBzdHJuY2F0KHQsIHNvYXAtPm1pbWUuYm91bmRhcnksIHNpemVvZihzb2FwLT50bXBidWYpLTQpOworCSAgICBkbyBjID0gc29hcF9nZXRjaGFyKHNvYXApOworCSAgICB3aGlsZSAoYyA9PSAqdCsrKTsKKwkgICAgaWYgKChpbnQpYyA9PSBFT0YpCisJICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisJICAgIGlmICghKi0tdCkKKwkgICAgICBnb3RvIGVuZDsKKwkgICAgKnQgPSAoY2hhciljOworCSAgICBmbGFnID0gKGMgPT0gJ1xyJyk7CisJICAgIG0gPSB0IC0gc29hcC0+dG1wYnVmICsgMSAtIGZsYWc7CisJICAgIHQgPSBzb2FwLT50bXBidWY7CisJICAgIGMgPSAnXHInOworCSAgfQorCSAgKnMrKyA9IChjaGFyKWM7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CitlbmQ6CisgICAgKnMgPSAnXDAnOyAvKiBmb3JjZSAwLXRlcm1pbmF0ZWQgKi8KKyAgICBjb250ZW50LT5zaXplID0gc29hcF9zaXplX2Jsb2NrKHNvYXAsIGkrMSktMTsKKyAgICBjb250ZW50LT5wdHIgPSBzb2FwX3NhdmVfYmxvY2soc29hcCwgTlVMTCwgMCk7CisgICAgc29hcF9yZXNvbHZlX2F0dGFjaG1lbnQoc29hcCwgY29udGVudCk7CisgICAgaWYgKGMgPT0gJy0nICYmIHNvYXBfZ2V0Y2hhcihzb2FwKSA9PSAnLScpCisgICAgICBicmVhazsKKyAgICB3aGlsZSAoYyAhPSAnXHInICYmIChpbnQpYyAhPSBFT0YgJiYgc29hcF9ibGFuayhjKSkKKyAgICAgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgICAgaWYgKGMgIT0gJ1xyJyB8fCBzb2FwX2dldGNoYXIoc29hcCkgIT0gJ1xuJykKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTUlNRV9FUlJPUjsKKyAgICBpZiAoc29hcF9nZXRtaW1laGRyKHNvYXApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzb2FwX21hdGNoX2NpZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqdCkKK3sgcmVnaXN0ZXIgc2l6ZV90IG47CisgIGlmICghcykKKyAgICByZXR1cm4gMTsKKyAgaWYgKCFzdHJjbXAocywgdCkpCisgICAgcmV0dXJuIDA7CisgIGlmICghc3RybmNtcChzLCAiY2lkOiIsIDQpKQorICAgIHMgKz0gNDsKKyAgbiA9IHN0cmxlbih0KTsKKyAgaWYgKCp0ID09ICc8JykKKyAgeyB0Kys7CisgICAgbiAtPSAyOworICB9CisgIGlmICghc3RybmNtcChzLCB0LCBuKSAmJiAhc1tuXSkKKyAgICByZXR1cm4gMDsKKyAgc29hcF9kZWNvZGUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgcywgU09BUF9TVFJfRU9TKTsKKyAgaWYgKCFzdHJuY21wKHNvYXAtPnRtcGJ1ZiwgdCwgbikgJiYgIXNvYXAtPnRtcGJ1ZltuXSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIDE7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyB2b2lkCitzb2FwX3Jlc29sdmVfYXR0YWNobWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50KQoreyBpZiAoY29udGVudC0+aWQpCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfeGxpc3QgKip4cCA9ICZzb2FwLT54bGlzdDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc29sdmluZyBhdHRhY2htZW50IGRhdGEgZm9yIGlkPSVzXG4iLCBjb250ZW50LT5pZCkpOworICAgIHdoaWxlICgqeHApCisgICAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF94bGlzdCAqeHEgPSAqeHA7CisgICAgICBpZiAoIXNvYXBfbWF0Y2hfY2lkKHNvYXAsIHhxLT5pZCwgY29udGVudC0+aWQpKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZvdW5kIG1hdGNoaW5nIGF0dGFjaG1lbnQgJXMgZm9yIGNvbnRlbnQgaWQ9JXNcbiIsIHhxLT5pZCwgY29udGVudC0+aWQpKTsKKwkqeHAgPSB4cS0+bmV4dDsKKyAgICAgICAgKnhxLT5wdHIgPSAodW5zaWduZWQgY2hhciopY29udGVudC0+cHRyOworICAgICAgICAqeHEtPnNpemUgPSAoaW50KWNvbnRlbnQtPnNpemU7CisgICAgICAgICp4cS0+dHlwZSA9IChjaGFyKiljb250ZW50LT50eXBlOworCWlmIChjb250ZW50LT5vcHRpb25zKQorICAgICAgICAgICp4cS0+b3B0aW9ucyA9IChjaGFyKiljb250ZW50LT5vcHRpb25zOworICAgICAgICBlbHNlCisgICAgICAgICAgKnhxLT5vcHRpb25zID0gKGNoYXIqKWNvbnRlbnQtPmRlc2NyaXB0aW9uOworCVNPQVBfRlJFRShzb2FwLCB4cSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHhwID0gJigqeHApLT5uZXh0OworICAgIH0KKyAgfQorfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0bWltZWhkcihzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50KQoreyBjb25zdCBjaGFyICpzOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk1JTUUgYXR0YWNobWVudCB0eXBlPSVzXG4iLCBjb250ZW50LT50eXBlP2NvbnRlbnQtPnR5cGU6IiIpKTsKKyAgaWYgKHNvYXBfc2VuZDMoc29hcCwgIlxyXG4tLSIsIHNvYXAtPm1pbWUuYm91bmRhcnksICJcclxuIikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoY29udGVudC0+dHlwZSAmJiBzb2FwX3NlbmQzKHNvYXAsICJDb250ZW50LVR5cGU6ICIsIGNvbnRlbnQtPnR5cGUsICJcclxuIikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBzID0gc29hcF9zdHJfY29kZShtaW1lX2NvZGVzLCBjb250ZW50LT5lbmNvZGluZyk7CisgIGlmIChzICYmIHNvYXBfc2VuZDMoc29hcCwgIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6ICIsIHMsICJcclxuIikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoY29udGVudC0+aWQgJiYgc29hcF9zZW5kMyhzb2FwLCAiQ29udGVudC1JRDogIiwgY29udGVudC0+aWQsICJcclxuIikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoY29udGVudC0+bG9jYXRpb24gJiYgc29hcF9zZW5kMyhzb2FwLCAiQ29udGVudC1Mb2NhdGlvbjogIiwgY29udGVudC0+bG9jYXRpb24sICJcclxuIikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoY29udGVudC0+ZGVzY3JpcHRpb24gJiYgc29hcF9zZW5kMyhzb2FwLCAiQ29udGVudC1EZXNjcmlwdGlvbjogIiwgY29udGVudC0+ZGVzY3JpcHRpb24sICJcclxuIikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCAiXHJcbiIsIDIpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0bWltZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkgfHwgIXNvYXAtPm1pbWUuYm91bmRhcnkpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2VuZGluZyBNSU1FIGF0dGFjaG1lbnRzXG4iKSk7CisgIGZvciAoY29udGVudCA9IHNvYXAtPm1pbWUuZmlyc3Q7IGNvbnRlbnQ7IGNvbnRlbnQgPSBjb250ZW50LT5uZXh0KQorICAgIGlmIChzb2FwX3B1dG1pbWVoZHIoc29hcCwgY29udGVudCkKKyAgICAgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCBjb250ZW50LT5wdHIsIGNvbnRlbnQtPnNpemUpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9zZW5kMyhzb2FwLCAiXHJcbi0tIiwgc29hcC0+bWltZS5ib3VuZGFyeSwgIi0tIik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2RpbWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPm9tb2RlIHw9IFNPQVBfRU5DX0RJTUU7CisgIHNvYXAtPmRpbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmxhc3QgPSBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9taW1lKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpib3VuZGFyeSwgY29uc3QgY2hhciAqc3RhcnQpCit7IHNvYXAtPm9tb2RlIHw9IFNPQVBfRU5DX01JTUU7CisgIHNvYXAtPm1pbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmxhc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gc29hcF9zdHJkdXAoc29hcCwgYm91bmRhcnkpOworICBzb2FwLT5taW1lLnN0YXJ0ID0gc29hcF9zdHJkdXAoc29hcCwgc3RhcnQpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2Nscl9kaW1lKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5vbW9kZSAmPSB+U09BUF9FTkNfRElNRTsKKyAgc29hcC0+ZGltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGFzdCA9IE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfY2xyX21pbWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPm9tb2RlICY9IH5TT0FQX0VOQ19NSU1FOworICBzb2FwLT5taW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5sYXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5ib3VuZGFyeSA9IE5VTEw7CisgIHNvYXAtPm1pbWUuc3RhcnQgPSBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc3RydWN0IHNvYXBfbXVsdGlwYXJ0Kgorc29hcF9uZXdfbXVsdGlwYXJ0KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKipmaXJzdCwgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICoqbGFzdCwgY2hhciAqcHRyLCBzaXplX3Qgc2l6ZSkKK3sgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICBjb250ZW50ID0gKHN0cnVjdCBzb2FwX211bHRpcGFydCopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX211bHRpcGFydCkpOworICBpZiAoY29udGVudCkKKyAgeyBjb250ZW50LT5uZXh0ID0gTlVMTDsKKyAgICBjb250ZW50LT5wdHIgPSBwdHI7CisgICAgY29udGVudC0+c2l6ZSA9IHNpemU7CisgICAgY29udGVudC0+aWQgPSBOVUxMOworICAgIGNvbnRlbnQtPnR5cGUgPSBOVUxMOworICAgIGNvbnRlbnQtPm9wdGlvbnMgPSBOVUxMOworICAgIGNvbnRlbnQtPmVuY29kaW5nID0gU09BUF9NSU1FX05PTkU7CisgICAgY29udGVudC0+bG9jYXRpb24gPSBOVUxMOworICAgIGNvbnRlbnQtPmRlc2NyaXB0aW9uID0gTlVMTDsKKyAgICBpZiAoISpmaXJzdCkKKyAgICAgICpmaXJzdCA9IGNvbnRlbnQ7CisgICAgaWYgKCpsYXN0KQorICAgICAgKCpsYXN0KS0+bmV4dCA9IGNvbnRlbnQ7CisgICAgKmxhc3QgPSBjb250ZW50OworICB9CisgIHJldHVybiBjb250ZW50OworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2RpbWVfYXR0YWNobWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqcHRyLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqaWQsIHVuc2lnbmVkIHNob3J0IG9wdHlwZSwgY29uc3QgY2hhciAqb3B0aW9uKQoreyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQgPSBzb2FwX25ld19tdWx0aXBhcnQoc29hcCwgJnNvYXAtPmRpbWUuZmlyc3QsICZzb2FwLT5kaW1lLmxhc3QsIHB0ciwgc2l6ZSk7CisgIGlmICghY29udGVudCkKKyAgICByZXR1cm4gU09BUF9FT007CisgIGNvbnRlbnQtPmlkID0gc29hcF9zdHJkdXAoc29hcCwgaWQpOworICBjb250ZW50LT50eXBlID0gc29hcF9zdHJkdXAoc29hcCwgdHlwZSk7CisgIGNvbnRlbnQtPm9wdGlvbnMgPSBzb2FwX2RpbWVfb3B0aW9uKHNvYXAsIG9wdHlwZSwgb3B0aW9uKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZXRfbWltZV9hdHRhY2htZW50KHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpwdHIsIHNpemVfdCBzaXplLCBlbnVtIHNvYXBfbWltZV9lbmNvZGluZyBlbmNvZGluZywgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKmxvY2F0aW9uLCBjb25zdCBjaGFyICpkZXNjcmlwdGlvbikKK3sgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50ID0gc29hcF9uZXdfbXVsdGlwYXJ0KHNvYXAsICZzb2FwLT5taW1lLmZpcnN0LCAmc29hcC0+bWltZS5sYXN0LCBwdHIsIHNpemUpOworICBpZiAoIWNvbnRlbnQpCisgICAgcmV0dXJuIFNPQVBfRU9NOworICBjb250ZW50LT5pZCA9IHNvYXBfc3RyZHVwKHNvYXAsIGlkKTsKKyAgY29udGVudC0+dHlwZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHR5cGUpOworICBjb250ZW50LT5lbmNvZGluZyA9IGVuY29kaW5nOworICBjb250ZW50LT5sb2NhdGlvbiA9IHNvYXBfc3RyZHVwKHNvYXAsIGxvY2F0aW9uKTsKKyAgY29udGVudC0+ZGVzY3JpcHRpb24gPSBzb2FwX3N0cmR1cChzb2FwLCBkZXNjcmlwdGlvbik7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqCitTT0FQX0ZNQUMyCitzb2FwX25leHRfbXVsdGlwYXJ0KHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudCkKK3sgaWYgKGNvbnRlbnQpCisgICAgcmV0dXJuIGNvbnRlbnQtPm5leHQ7CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZAorc29hcF9zZWxlY3RfbWltZV9ib3VuZGFyeShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgd2hpbGUgKCFzb2FwLT5taW1lLmJvdW5kYXJ5IHx8IHNvYXBfdmFsaWRfbWltZV9ib3VuZGFyeShzb2FwKSkKKyAgeyByZWdpc3RlciBjaGFyICpzID0gc29hcC0+bWltZS5ib3VuZGFyeTsKKyAgICByZWdpc3RlciBzaXplX3QgbiA9IDA7CisgICAgaWYgKHMpCisgICAgICBuID0gc3RybGVuKHMpOworICAgIGlmIChuIDwgMTYpCisgICAgeyBuID0gNjQ7CisgICAgICBzID0gc29hcC0+bWltZS5ib3VuZGFyeSA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBuICsgMSk7CisgICAgICBpZiAoIXMpCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RyY3B5KHMsICI9PSIpOworICAgIHMgKz0gMjsKKyAgICBuIC09IDQ7CisgICAgd2hpbGUgKG4pCisgICAgeyAqcysrID0gc29hcF9iYXNlNjRvW3NvYXBfcmFuZG9tICYgMHgzRl07CisgICAgICBuLS07CisgICAgfQorICAgIHN0cmNweShzLCAiPT0iKTsKKyAgfQorICBpZiAoIXNvYXAtPm1pbWUuc3RhcnQpCisgICAgc29hcC0+bWltZS5zdGFydCA9ICI8U09BUC1FTlY6RW52ZWxvcGU+IjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc29hcF92YWxpZF9taW1lX2JvdW5kYXJ5KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgIHJlZ2lzdGVyIHNpemVfdCBrID0gc3RybGVuKHNvYXAtPm1pbWUuYm91bmRhcnkpOworICBmb3IgKGNvbnRlbnQgPSBzb2FwLT5taW1lLmZpcnN0OyBjb250ZW50OyBjb250ZW50ID0gY29udGVudC0+bmV4dCkKKyAgeyBpZiAoY29udGVudC0+cHRyICYmIGNvbnRlbnQtPnNpemUgPj0gaykKKyAgICB7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnAgPSAoY29uc3QgY2hhciopY29udGVudC0+cHRyOyAKKyAgICAgIHJlZ2lzdGVyIHNpemVfdCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IGNvbnRlbnQtPnNpemUgLSBrOyBpKyssIHArKykKKyAgICAgICAgaWYgKCFzdHJuY21wKHAsIHNvYXAtPm1pbWUuYm91bmRhcnksIGspKQorICAgICAgICAgIHJldHVybiBTT0FQX0VSUjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqCUhUVFAgY29va2llIGhhbmRsaW5nCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIFdJVEhfQ09PS0lFUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3NpemVfdAorU09BUF9GTUFDMgorc29hcF9lbmNvZGVfY29va2llKGNvbnN0IGNoYXIgKnMsIGNoYXIgKnQsIHNpemVfdCBsZW4pCit7IHJlZ2lzdGVyIGludCBjOworICByZWdpc3RlciBzaXplX3QgbiA9IGxlbjsKKyAgd2hpbGUgKChjID0gKnMrKykgJiYgLS1uID4gMCkKKyAgeyBpZiAoYyA+ICcgJyAmJiBjIDwgMTI4ICYmICFzdHJjaHIoIigpPD5ALDs6XFxcIi9bXT89e30iLCBjKSkKKyAgICAgICp0KysgPSBjOworICAgIGVsc2UgaWYgKG4gPiAyKQorICAgIHsgKnQrKyA9ICclJzsKKyAgICAgICp0KysgPSAoYyA+PiA0KSArIChjID4gMTU5ID8gJzcnIDogJzAnKTsKKyAgICAgIGMgJj0gMHhGOworICAgICAgKnQrKyA9IGMgKyAoYyA+IDkgPyAnNycgOiAnMCcpOworICAgICAgbiAtPSAyOworICAgIH0KKyAgICBlbHNlCisgICAgICBicmVhazsKKyAgfQorICAqdCA9ICdcMCc7CisgIHJldHVybiBsZW4gLSBuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQorc3RydWN0IHNvYXBfY29va2llKgorU09BUF9GTUFDMgorc29hcF9jb29raWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBzaXplX3QgbjsKKyAgaWYgKCFkb21haW4pCisgICAgZG9tYWluID0gc29hcC0+Y29va2llX2RvbWFpbjsKKyAgaWYgKCFwYXRoKQorICAgIHBhdGggPSBzb2FwLT5jb29raWVfcGF0aDsKKyAgaWYgKCpwYXRoID09ICcvJykKKyAgICBwYXRoKys7CisgIG4gPSBzdHJsZW4ocGF0aCk7CisgIGZvciAocCA9IHNvYXAtPmNvb2tpZXM7IHA7IHAgPSBwLT5uZXh0KQorICAgIGlmICghc3RyY21wKHAtPm5hbWUsIG5hbWUpCisgICAgICYmIGRvbWFpbgorICAgICAmJiBwLT5kb21haW4KKyAgICAgJiYgIXN0cmNtcChwLT5kb21haW4sIGRvbWFpbikKKyAgICAgJiYgIXN0cm5jbXAocC0+cGF0aCwgcGF0aCwgbikpCisgICAgICBicmVhazsKKyAgcmV0dXJuIHA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcF9jb29raWUqCitTT0FQX0ZNQUMyCitzb2FwX3NldF9jb29raWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqKnAsICpxOworICBpbnQgbjsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTZXQgY29va2llOiAlcz0lcyBkb21haW49JXMgcGF0aD0lc1xuIiwgbmFtZSwgdmFsdWU/dmFsdWU6IiIsIGRvbWFpbj9kb21haW46IiIsIHBhdGg/cGF0aDoiIikpOworICBpZiAoIWRvbWFpbikKKyAgICBkb21haW4gPSBzb2FwLT5jb29raWVfZG9tYWluOworICBpZiAoIXBhdGgpCisgICAgcGF0aCA9IHNvYXAtPmNvb2tpZV9wYXRoOworICBpZiAoIXBhdGgpCisgIHsgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIkNvb2tpZSBwYXRoIG5vdCBzZXQiLCBOVUxMLCBTT0FQX0hUVFBfRVJST1IpOworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmICgqcGF0aCA9PSAnLycpCisgICAgcGF0aCsrOworICBxID0gc29hcF9jb29raWUoc29hcCwgbmFtZSwgZG9tYWluLCBwYXRoKTsKKyAgaWYgKCFxKQorICB7IGlmICgocSA9IChzdHJ1Y3Qgc29hcF9jb29raWUqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9jb29raWUpKSkpCisgICAgeyBpZiAoKHEtPm5hbWUgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKG5hbWUpKzEpKSkKKyAgICAgICAgc3RyY3B5KHEtPm5hbWUsIG5hbWUpOworICAgICAgcS0+dmFsdWUgPSBOVUxMOworICAgICAgcS0+ZG9tYWluID0gTlVMTDsKKyAgICAgIHEtPnBhdGggPSBOVUxMOworICAgICAgcS0+ZXhwaXJlID0gLTE7CisgICAgICBxLT52ZXJzaW9uID0gMDsKKyAgICAgIHEtPnNlY3VyZSA9IDA7CisgICAgICBxLT5tb2RpZmllZCA9IDA7CisgICAgICBmb3IgKHAgPSAmc29hcC0+Y29va2llcywgbiA9IHNvYXAtPmNvb2tpZV9tYXg7ICpwICYmIG47IHAgPSAmKCpwKS0+bmV4dCwgbi0tKQorICAgICAgICBpZiAoIXN0cmNtcCgoKnApLT5uYW1lLCBuYW1lKSAmJiAoKnApLT5wYXRoICYmIHN0cmNtcCgoKnApLT5wYXRoLCBwYXRoKSA8IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICBpZiAobikKKyAgICAgIHsgcS0+bmV4dCA9ICpwOworICAgICAgICAqcCA9IHE7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IFNPQVBfRlJFRShzb2FwLCBxLT5uYW1lKTsKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHEpOworICAgICAgICBxID0gTlVMTDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZQorICAgIHEtPm1vZGlmaWVkID0gMTsKKyAgaWYgKHEpCisgIHsgaWYgKHEtPnZhbHVlKQorICAgIHsgU09BUF9GUkVFKHNvYXAsIHEtPnZhbHVlKTsKKyAgICAgIHEtPnZhbHVlID0gTlVMTDsKKyAgICB9CisgICAgaWYgKHEtPmRvbWFpbikKKyAgICB7IFNPQVBfRlJFRShzb2FwLCBxLT5kb21haW4pOworICAgICAgcS0+ZG9tYWluID0gTlVMTDsKKyAgICB9CisgICAgaWYgKHEtPnBhdGgpCisgICAgeyBTT0FQX0ZSRUUoc29hcCwgcS0+cGF0aCk7CisgICAgICBxLT5wYXRoID0gTlVMTDsKKyAgICB9CisgICAgaWYgKHZhbHVlICYmICp2YWx1ZSAmJiAocS0+dmFsdWUgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHZhbHVlKSsxKSkpCisgICAgICBzdHJjcHkocS0+dmFsdWUsIHZhbHVlKTsKKyAgICBpZiAoZG9tYWluICYmICpkb21haW4gJiYgKHEtPmRvbWFpbiA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4oZG9tYWluKSsxKSkpCisgICAgICBzdHJjcHkocS0+ZG9tYWluLCBkb21haW4pOworICAgIGlmIChwYXRoICYmICpwYXRoICYmIChxLT5wYXRoID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihwYXRoKSsxKSkpCisgICAgICBzdHJjcHkocS0+cGF0aCwgcGF0aCk7CisgICAgcS0+c2Vzc2lvbiA9IDE7CisgICAgcS0+ZW52ID0gMDsKKyAgfQorICByZXR1cm4gcTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfY2xyX2Nvb2tpZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKipwLCAqcTsKKyAgaWYgKCFkb21haW4pCisgICAgZG9tYWluID0gc29hcC0+Y29va2llX2RvbWFpbjsKKyAgaWYgKCFkb21haW4pCisgIHsgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIkNvb2tpZSBkb21haW4gbm90IHNldCIsIE5VTEwsIFNPQVBfSFRUUF9FUlJPUik7CisgICAgcmV0dXJuOworICB9CisgIGlmICghcGF0aCkKKyAgICBwYXRoID0gc29hcC0+Y29va2llX3BhdGg7CisgIGlmICghcGF0aCkKKyAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiQ29va2llIHBhdGggbm90IHNldCIsIE5VTEwsIFNPQVBfSFRUUF9FUlJPUik7CisgICAgcmV0dXJuOworICB9CisgIGlmICgqcGF0aCA9PSAnLycpCisgICAgcGF0aCsrOworICBmb3IgKHAgPSAmc29hcC0+Y29va2llcywgcSA9ICpwOyBxOyBxID0gKnApCisgICAgaWYgKCFzdHJjbXAocS0+bmFtZSwgbmFtZSkgJiYgIXN0cmNtcChxLT5kb21haW4sIGRvbWFpbikgJiYgIXN0cm5jbXAocS0+cGF0aCwgcGF0aCwgc3RybGVuKHEtPnBhdGgpKSkKKyAgICB7IGlmIChxLT52YWx1ZSkKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHEtPnZhbHVlKTsKKyAgICAgIGlmIChxLT5kb21haW4pCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBxLT5kb21haW4pOworICAgICAgaWYgKHEtPnBhdGgpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBxLT5wYXRoKTsKKyAgICAgICpwID0gcS0+bmV4dDsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBxKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgcCA9ICZxLT5uZXh0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX2Nvb2tpZV92YWx1ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGlmICgocCA9IHNvYXBfY29va2llKHNvYXAsIG5hbWUsIGRvbWFpbiwgcGF0aCkpKQorICAgIHJldHVybiBwLT52YWx1ZTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfZW52X2Nvb2tpZV92YWx1ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGlmICgocCA9IHNvYXBfY29va2llKHNvYXAsIG5hbWUsIGRvbWFpbiwgcGF0aCkpICYmIHAtPmVudikKKyAgICByZXR1cm4gcC0+dmFsdWU7CisgIHJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQorbG9uZworU09BUF9GTUFDMgorc29hcF9jb29raWVfZXhwaXJlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgaWYgKChwID0gc29hcF9jb29raWUoc29hcCwgbmFtZSwgZG9tYWluLCBwYXRoKSkpCisgICAgcmV0dXJuIHAtPmV4cGlyZTsKKyAgcmV0dXJuIC0xOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NldF9jb29raWVfZXhwaXJlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBsb25nIGV4cGlyZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGlmICgocCA9IHNvYXBfY29va2llKHNvYXAsIG5hbWUsIGRvbWFpbiwgcGF0aCkpKQorICB7IHAtPmV4cGlyZSA9IGV4cGlyZTsKKyAgICBwLT5tb2RpZmllZCA9IDE7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgcmV0dXJuIFNPQVBfRVJSOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NldF9jb29raWVfc2Vzc2lvbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGlmICgocCA9IHNvYXBfY29va2llKHNvYXAsIG5hbWUsIGRvbWFpbiwgcGF0aCkpKQorICB7IHAtPnNlc3Npb24gPSAxOworICAgIHAtPm1vZGlmaWVkID0gMTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICByZXR1cm4gU09BUF9FUlI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfY2xyX2Nvb2tpZV9zZXNzaW9uKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgaWYgKChwID0gc29hcF9jb29raWUoc29hcCwgbmFtZSwgZG9tYWluLCBwYXRoKSkpCisgIHsgcC0+c2Vzc2lvbiA9IDA7CisgICAgcC0+bW9kaWZpZWQgPSAxOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIHJldHVybiBTT0FQX0VSUjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRzZXRjb29raWVzKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGNoYXIgKnMsIHRtcFs0MDk2XTsKKyAgY29uc3QgY2hhciAqdDsKKyAgZm9yIChwID0gc29hcC0+Y29va2llczsgcDsgcCA9IHAtPm5leHQpCisgIHsgaWYgKHAtPm1vZGlmaWVkIHx8ICFwLT5lbnYpCisgICAgeyBzID0gdG1wOworICAgICAgaWYgKHAtPm5hbWUpCisgICAgICAgIHMgKz0gc29hcF9lbmNvZGVfY29va2llKHAtPm5hbWUsIHMsIHRtcC1zKzQwNjQpOworICAgICAgaWYgKHAtPnZhbHVlICYmICpwLT52YWx1ZSkKKyAgICAgIHsgKnMrKyA9ICc9JzsKKyAgICAgICAgcyArPSBzb2FwX2VuY29kZV9jb29raWUocC0+dmFsdWUsIHMsIHRtcC1zKzQwNjQpOworICAgICAgfQorICAgICAgaWYgKHAtPmRvbWFpbiAmJiAoaW50KXN0cmxlbihwLT5kb21haW4pIDwgdG1wLXMrNDA2NCkKKyAgICAgICAgc3ByaW50ZihzLCAiO0RvbWFpbj1cIiVzXCIiLCBwLT5kb21haW4pOworICAgICAgZWxzZSBpZiAoc29hcC0+Y29va2llX2RvbWFpbiAmJiAoaW50KXN0cmxlbihzb2FwLT5jb29raWVfZG9tYWluKSA8IHRtcC1zKzQwNjQpCisgICAgICAgIHNwcmludGYocywgIjtEb21haW49XCIlc1wiIiwgc29hcC0+Y29va2llX2RvbWFpbik7CisgICAgICBzdHJjYXQocywgIjtQYXRoPVwiLyIpOworICAgICAgaWYgKHAtPnBhdGgpCisgICAgICAgIHQgPSBwLT5wYXRoOworICAgICAgZWxzZQorICAgICAgICB0ID0gc29hcC0+Y29va2llX3BhdGg7CisgICAgICBpZiAodCkKKyAgICAgIHsgaWYgKCp0ID09ICcvJykKKyAgICAgICAgICB0Kys7CisgICAgICAgIGlmICgoaW50KXN0cmxlbih0KSA8IHRtcC1zKzQwNjQpCisgICAgICAgICAgc3RyY2F0KHMsIHQpOworICAgICAgfQorICAgICAgcyArPSBzdHJsZW4ocyk7CisgICAgICAqcysrID0gJyInOworICAgICAgaWYgKHAtPnZlcnNpb24gPiAwKQorICAgICAgICBzcHJpbnRmKHMsICI7VmVyc2lvbj0ldSIsIHAtPnZlcnNpb24pOworICAgICAgaWYgKHAtPmV4cGlyZSA+PSAwKQorICAgICAgICBzcHJpbnRmKHMsICI7TWF4LUFnZT0lbGQiLCBwLT5leHBpcmUpOworICAgICAgaWYgKHAtPnNlY3VyZSkKKyAgICAgICAgc3RyY2F0KHMsICI7U2VjdXJlIik7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNldC1Db29raWU6ICVzXG4iLCB0bXApKTsKKyAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiU2V0LUNvb2tpZSIsIHRtcCkpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICB9CisgIHJldHVybiBTT0FQX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dGNvb2tpZXMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCwgaW50IHNlY3VyZSkKK3sgc3RydWN0IHNvYXBfY29va2llICoqcCwgKnE7CisgIHVuc2lnbmVkIGludCB2ZXJzaW9uID0gMDsKKyAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CisgIGNoYXIgKnMsIHRtcFs0MDk2XTsKKyAgcCA9ICZzb2FwLT5jb29raWVzOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNlbmRpbmcgY29va2llcyBmb3IgZG9tYWluPSVzIHBhdGg9JXNcbiIsIGRvbWFpbiwgcGF0aCkpOworICBpZiAoKnBhdGggPT0gJy8nKQorICAgIHBhdGgrKzsKKyAgd2hpbGUgKChxID0gKnApKQorICB7IGlmIChxLT5leHBpcmUgJiYgbm93ID4gcS0+ZXhwaXJlKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb29raWUgJXMgZXhwaXJlZFxuIiwgcS0+bmFtZSkpOworICAgICAgU09BUF9GUkVFKHNvYXAsIHEtPm5hbWUpOworICAgICAgaWYgKHEtPnZhbHVlKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcS0+dmFsdWUpOworICAgICAgaWYgKHEtPmRvbWFpbikKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHEtPmRvbWFpbik7CisgICAgICBpZiAocS0+cGF0aCkKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHEtPnBhdGgpOworICAgICAgKnAgPSBxLT5uZXh0OworICAgICAgU09BUF9GUkVFKHNvYXAsIHEpOworICAgIH0KKyAgICBlbHNlCisgICAgeyBzaXplX3QgZG9tbGVuID0gMDsKKyAgICAgIGlmIChxLT5kb21haW4pCisgICAgICB7IGNvbnN0IGNoYXIgKnMgPSBzdHJjaHIocS0+ZG9tYWluLCAnOicpOworICAgICAgICBpZiAocykKKwkgIGRvbWxlbiA9IHMgLSBxLT5kb21haW47CisJZWxzZQorICAgICAgICAgIGRvbWxlbiA9IHN0cmxlbihxLT5kb21haW4pOworICAgICAgfQorICAgICAgaWYgKCghcS0+ZG9tYWluIHx8ICFzdHJuY21wKHEtPmRvbWFpbiwgZG9tYWluLCBkb21sZW4pKQorICAgICAgICAgICYmICghcS0+cGF0aCB8fCAhc3RybmNtcChxLT5wYXRoLCBwYXRoLCBzdHJsZW4ocS0+cGF0aCkpKQorICAgICAgICAgICYmICghcS0+c2VjdXJlIHx8IHNlY3VyZSkpCisgICAgICB7IHMgPSB0bXA7CisgICAgICAgIGlmIChxLT52ZXJzaW9uICE9IHZlcnNpb24pCisgICAgICAgIHsgc3ByaW50ZihzLCAiJFZlcnNpb249JXU7IiwgcS0+dmVyc2lvbik7CisgICAgICAgICAgdmVyc2lvbiA9IHEtPnZlcnNpb247CisgICAgICAgIH0KKyAgICAgICAgaWYgKHEtPm5hbWUpCisgICAgICAgICAgcyArPSBzb2FwX2VuY29kZV9jb29raWUocS0+bmFtZSwgcywgdG1wLXMrNDA4MCk7CisgICAgICAgIGlmIChxLT52YWx1ZSAmJiAqcS0+dmFsdWUpCisgICAgICAgIHsgKnMrKyA9ICc9JzsKKyAgICAgICAgICBzICs9IHNvYXBfZW5jb2RlX2Nvb2tpZShxLT52YWx1ZSwgcywgdG1wLXMrNDA4MCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHEtPnBhdGggJiYgKGludClzdHJsZW4ocS0+cGF0aCkgPCB0bXAtcys0MDgwKQorICAgICAgICB7IHNwcmludGYocywgIjskUGF0aD1cIi8lc1wiIiwgKCpxLT5wYXRoID09ICcvJyA/IHEtPnBhdGggKyAxIDogcS0+cGF0aCkpOworICAgICAgICAgIHMgKz0gc3RybGVuKHMpOworICAgICAgICB9CisgICAgICAgIGlmIChxLT5kb21haW4gJiYgKGludClzdHJsZW4ocS0+ZG9tYWluKSA8IHRtcC1zKzQwODApCisgICAgICAgICAgc3ByaW50ZihzLCAiOyREb21haW49XCIlc1wiIiwgcS0+ZG9tYWluKTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb29raWU6ICVzXG4iLCB0bXApKTsKKyAgICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJDb29raWUiLCB0bXApKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB9CisgICAgICBwID0gJnEtPm5leHQ7CisgICAgfQorICB9CisgIHJldHVybiBTT0FQX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9nZXRjb29raWVzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp2YWwpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcCA9IE5VTEwsICpxOworICBjb25zdCBjaGFyICpzOworICBjaGFyICp0LCB0bXBbNDA5Nl07IC8qIGNvb2tpZSBzaXplIGlzIHVwIHRvIDQwOTYgYnl0ZXMgW1JGQzIxMDldICovCisgIGNoYXIgKmRvbWFpbiA9IE5VTEw7CisgIGNoYXIgKnBhdGggPSBOVUxMOworICB1bnNpZ25lZCBpbnQgdmVyc2lvbiA9IDA7CisgIHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOworICBpZiAoIXZhbCkKKyAgICByZXR1cm47CisgIHMgPSB2YWw7CisgIHdoaWxlICgqcykKKyAgeyBzID0gc29hcF9kZWNvZGVfa2V5KHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgIGlmICghc29hcF90YWdfY21wKHRtcCwgIiRWZXJzaW9uIikpCisgICAgeyBpZiAoKHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcykpKQorICAgICAgeyBpZiAocCkKKyAgICAgICAgICBwLT52ZXJzaW9uID0gKGludClhdG9sKHRtcCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICB2ZXJzaW9uID0gKGludClhdG9sKHRtcCk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAodG1wLCAiJFBhdGgiKSkKKyAgICB7IHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICBpZiAoKnRtcCkKKyAgICAgIHsgaWYgKCh0ID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbih0bXApKzEpKSkKKyAgICAgICAgICBzdHJjcHkodCwgdG1wKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgdCA9IE5VTEw7CisgICAgICBpZiAocCkKKyAgICAgIHsgaWYgKHAtPnBhdGgpCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnBhdGgpOworICAgICAgICBwLT5wYXRoID0gdDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgaWYgKHBhdGgpCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHBhdGgpOworICAgICAgICBwYXRoID0gdDsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcCh0bXAsICIkRG9tYWluIikpCisgICAgeyBzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgICAgaWYgKCp0bXApCisgICAgICB7IGlmICgodCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4odG1wKSsxKSkpCisgICAgICAgICAgc3RyY3B5KHQsIHRtcCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHQgPSBOVUxMOworICAgICAgaWYgKHApCisgICAgICB7IGlmIChwLT5kb21haW4pCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPmRvbWFpbik7CisJcC0+ZG9tYWluID0gdDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgaWYgKGRvbWFpbikKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgZG9tYWluKTsKKyAgICAgICAgZG9tYWluID0gdDsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAocCAmJiAhc29hcF90YWdfY21wKHRtcCwgIlBhdGgiKSkKKyAgICB7IGlmIChwLT5wYXRoKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+cGF0aCk7CisgICAgICBzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgICAgaWYgKCp0bXApCisgICAgICB7IGlmICgocC0+cGF0aCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4odG1wKSsxKSkpCisgICAgICAgICAgc3RyY3B5KHAtPnBhdGgsIHRtcCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHAtPnBhdGggPSBOVUxMOworICAgIH0KKyAgICBlbHNlIGlmIChwICYmICFzb2FwX3RhZ19jbXAodG1wLCAiRG9tYWluIikpCisgICAgeyBpZiAocC0+ZG9tYWluKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+ZG9tYWluKTsKKyAgICAgIHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICBpZiAoKnRtcCkKKyAgICAgIHsgaWYgKChwLT5kb21haW4gPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHRtcCkrMSkpKQorICAgICAgICAgIHN0cmNweShwLT5kb21haW4sIHRtcCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHAtPmRvbWFpbiA9IE5VTEw7CisgICAgfQorICAgIGVsc2UgaWYgKHAgJiYgIXNvYXBfdGFnX2NtcCh0bXAsICJWZXJzaW9uIikpCisgICAgeyBzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgICAgcC0+dmVyc2lvbiA9ICh1bnNpZ25lZCBpbnQpYXRvbCh0bXApOworICAgIH0KKyAgICBlbHNlIGlmIChwICYmICFzb2FwX3RhZ19jbXAodG1wLCAiTWF4LUFnZSIpKQorICAgIHsgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgIHAtPmV4cGlyZSA9IG5vdyArIGF0b2wodG1wKTsKKyAgICB9CisgICAgZWxzZSBpZiAocCAmJiAhc29hcF90YWdfY21wKHRtcCwgIkV4cGlyZXMiKSkKKyAgICB7IHN0cnVjdCB0bSBUOworICAgICAgY2hhciBhWzNdOyAKKyAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG1uc1tdID0gImFuZWJhcnByYXl1bnVsdWdlcGN0b3ZlYyI7CisgICAgICBzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgICAgaWYgKHN0cmxlbih0bXApID4gMjApCisgICAgICB7IG1lbXNldCgodm9pZCopJlQsIDAsIHNpemVvZihUKSk7CisgICAgICAgIGFbMF0gPSB0bXBbNF07CisgICAgICAgIGFbMV0gPSB0bXBbNV07CisgICAgICAgIGFbMl0gPSAnXDAnOworICAgICAgICBULnRtX21kYXkgPSAoaW50KWF0b2woYSk7CisgICAgICAgIGFbMF0gPSB0bXBbOF07CisgICAgICAgIGFbMV0gPSB0bXBbOV07CisgICAgICAgIFQudG1fbW9uID0gKHN0cnN0cihtbnMsIGEpIC0gbW5zKSAvIDI7CisgICAgICAgIGFbMF0gPSB0bXBbMTFdOworICAgICAgICBhWzFdID0gdG1wWzEyXTsKKyAgICAgICAgVC50bV95ZWFyID0gMTAwICsgKGludClhdG9sKGEpOworICAgICAgICBhWzBdID0gdG1wWzEzXTsKKyAgICAgICAgYVsxXSA9IHRtcFsxNF07CisgICAgICAgIFQudG1faG91ciA9IChpbnQpYXRvbChhKTsKKyAgICAgICAgYVswXSA9IHRtcFsxNl07CisgICAgICAgIGFbMV0gPSB0bXBbMTddOworICAgICAgICBULnRtX21pbiA9IChpbnQpYXRvbChhKTsKKyAgICAgICAgYVswXSA9IHRtcFsxOV07CisgICAgICAgIGFbMV0gPSB0bXBbMjBdOworICAgICAgICBULnRtX3NlYyA9IChpbnQpYXRvbChhKTsKKyAgICAgICAgcC0+ZXhwaXJlID0gc29hcF90aW1lZ20oJlQpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChwICYmICFzb2FwX3RhZ19jbXAodG1wLCAiU2VjdXJlIikpCisgICAgICBwLT5zZWN1cmUgPSAxOworICAgIGVsc2UKKyAgICB7IGlmIChwKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdvdCBlbnZpcm9ubWVudCBjb29raWUgJXM9JXMgZG9tYWluPSVzIHBhdGg9JXMgZXhwaXJlPSVsZCBzZWN1cmU9JWRcbiIsIHAtPm5hbWUsIHAtPnZhbHVlP3AtPnZhbHVlOiIiLCBwLT5kb21haW4/cC0+ZG9tYWluOiIiLCBwLT5wYXRoP3AtPnBhdGg6IiIsIHAtPmV4cGlyZSwgcC0+c2VjdXJlKSk7CisgICAgICAgIGlmICgocSA9IHNvYXBfc2V0X2Nvb2tpZShzb2FwLCBwLT5uYW1lLCBwLT52YWx1ZSwgcC0+ZG9tYWluLCBwLT5wYXRoKSkpCisgICAgICAgIHsgcS0+dmVyc2lvbiA9IHAtPnZlcnNpb247CisgICAgICAgICAgcS0+ZXhwaXJlID0gcC0+ZXhwaXJlOworICAgICAgICAgIHEtPnNlY3VyZSA9IHAtPnNlY3VyZTsKKyAgICAgICAgICBxLT5lbnYgPSAxOworICAgICAgICB9CisgICAgICAgIGlmIChwLT5uYW1lKQorICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5uYW1lKTsKKyAgICAgICAgaWYgKHAtPnZhbHVlKQorICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT52YWx1ZSk7CisgICAgICAgIGlmIChwLT5kb21haW4pCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPmRvbWFpbik7CisgICAgICAgIGlmIChwLT5wYXRoKQorICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5wYXRoKTsKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHApOworICAgICAgfQorICAgICAgaWYgKChwID0gKHN0cnVjdCBzb2FwX2Nvb2tpZSopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2Nvb2tpZSkpKSkKKyAgICAgIHsgcC0+bmFtZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4odG1wKSsxKTsKKyAgICAgICAgc3RyY3B5KHAtPm5hbWUsIHRtcCk7CisgICAgICAgIHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICAgIGlmICgqdG1wKQorICAgICAgICB7IHAtPnZhbHVlID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbih0bXApKzEpOworICAgICAgICAgIHN0cmNweShwLT52YWx1ZSwgdG1wKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgcC0+dmFsdWUgPSBOVUxMOworICAgICAgICBwLT5kb21haW4gPSBkb21haW47CisgICAgICAgIHAtPnBhdGggPSBwYXRoOworICAgICAgICBwLT5leHBpcmUgPSAwOworICAgICAgICBwLT5zZWN1cmUgPSAwOworICAgICAgICBwLT52ZXJzaW9uID0gdmVyc2lvbjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKHApCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHb3QgZW52aXJvbm1lbnQgY29va2llICVzPSVzIGRvbWFpbj0lcyBwYXRoPSVzIGV4cGlyZT0lbGQgc2VjdXJlPSVkXG4iLCBwLT5uYW1lLCBwLT52YWx1ZT9wLT52YWx1ZToiIiwgcC0+ZG9tYWluP3AtPmRvbWFpbjoiIiwgcC0+cGF0aD9wLT5wYXRoOiIiLCBwLT5leHBpcmUsIHAtPnNlY3VyZSkpOworICAgIGlmICgocSA9IHNvYXBfc2V0X2Nvb2tpZShzb2FwLCBwLT5uYW1lLCBwLT52YWx1ZSwgcC0+ZG9tYWluLCBwLT5wYXRoKSkpCisgICAgeyBxLT52ZXJzaW9uID0gcC0+dmVyc2lvbjsKKyAgICAgIHEtPmV4cGlyZSA9IHAtPmV4cGlyZTsKKyAgICAgIHEtPnNlY3VyZSA9IHAtPnNlY3VyZTsKKyAgICAgIHEtPmVudiA9IDE7CisgICAgfQorICAgIGlmIChwLT5uYW1lKQorICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPm5hbWUpOworICAgIGlmIChwLT52YWx1ZSkKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT52YWx1ZSk7CisgICAgaWYgKHAtPmRvbWFpbikKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5kb21haW4pOworICAgIGlmIChwLT5wYXRoKQorICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnBhdGgpOworICAgIFNPQVBfRlJFRShzb2FwLCBwKTsKKyAgfQorICBpZiAoZG9tYWluKQorICAgIFNPQVBfRlJFRShzb2FwLCBkb21haW4pOworICBpZiAocGF0aCkKKyAgICBTT0FQX0ZSRUUoc29hcCwgcGF0aCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0ZW52X2Nvb2tpZXMoc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgY29uc3QgY2hhciAqczsKKyAgY2hhciBrZXlbNDA5Nl0sIHZhbFs0MDk2XTsgLyogY29va2llIHNpemUgaXMgdXAgdG8gNDA5NiBieXRlcyBbUkZDMjEwOV0gKi8KKyAgaWYgKCEocyA9IGdldGVudigiSFRUUF9DT09LSUUiKSkpCisgICAgcmV0dXJuIFNPQVBfRVJSOworICBkbworICB7IHMgPSBzb2FwX2RlY29kZV9rZXkoa2V5LCBzaXplb2Yoa2V5KSwgcyk7CisgICAgcyA9IHNvYXBfZGVjb2RlX3ZhbCh2YWwsIHNpemVvZih2YWwpLCBzKTsKKyAgICBwID0gc29hcF9zZXRfY29va2llKHNvYXAsIGtleSwgdmFsLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAocCkKKyAgICAgIHAtPmVudiA9IDE7CisgIH0gd2hpbGUgKCpzKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcF9jb29raWUqCitTT0FQX0ZNQUMyCitzb2FwX2NvcHlfY29va2llcyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwLCAqKnEsICpyOworICBxID0gJnI7CisgIGZvciAocCA9IHNvYXAtPmNvb2tpZXM7IHA7IHAgPSBwLT5uZXh0KQorICB7IGlmICghKCpxID0gKHN0cnVjdCBzb2FwX2Nvb2tpZSopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2Nvb2tpZSkpKSkKKyAgICAgIHJldHVybiByOworICAgICoqcSA9ICpwOworICAgIGlmIChwLT5uYW1lKQorICAgIHsgaWYgKCgoKnEpLT5uYW1lID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihwLT5uYW1lKSsxKSkpCisgICAgICAgIHN0cmNweSgoKnEpLT5uYW1lLCBwLT5uYW1lKTsKKyAgICB9CisgICAgaWYgKHAtPnZhbHVlKQorICAgIHsgaWYgKCgoKnEpLT52YWx1ZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4ocC0+dmFsdWUpKzEpKSkKKyAgICAgICAgc3RyY3B5KCgqcSktPnZhbHVlLCBwLT52YWx1ZSk7CisgICAgfQorICAgIGlmIChwLT5kb21haW4pCisgICAgeyBpZiAoKCgqcSktPmRvbWFpbiA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4ocC0+ZG9tYWluKSsxKSkpCisgICAgICAgIHN0cmNweSgoKnEpLT5kb21haW4sIHAtPmRvbWFpbik7CisgICAgfQorICAgIGlmIChwLT5wYXRoKQorICAgIHsgaWYgKCgoKnEpLT5wYXRoID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihwLT5wYXRoKSsxKSkpCisgICAgICAgIHN0cmNweSgoKnEpLT5wYXRoLCBwLT5wYXRoKTsKKyAgICB9CisgICAgcSA9ICYoKnEpLT5uZXh0OworICB9CisgICpxID0gTlVMTDsKKyAgcmV0dXJuIHI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2ZyZWVfY29va2llcyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBmb3IgKHAgPSBzb2FwLT5jb29raWVzOyBwOyBwID0gc29hcC0+Y29va2llcykKKyAgeyBzb2FwLT5jb29raWVzID0gcC0+bmV4dDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgcC0+bmFtZSk7CisgICAgaWYgKHAtPnZhbHVlKQorICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnZhbHVlKTsKKyAgICBpZiAocC0+ZG9tYWluKQorICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPmRvbWFpbik7CisgICAgaWYgKHAtPnBhdGgpCisgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+cGF0aCk7CisgICAgU09BUF9GUkVFKHNvYXAsIHApOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZW5kaWYgLyogV0lUSF9DT09LSUVTICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgV0lUSF9HWklQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc29hcF9nZXRnemlwaGRyKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpbnQgaTsKKyAgc29hcF93Y2hhciBjLCBmID0gMDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHZXQgZ3ppcCBoZWFkZXJcbiIpKTsKKyAgZm9yIChpID0gMDsgaSA8IDk7IGkrKykKKyAgeyBpZiAoKGludCkoYyA9IHNvYXBfZ2V0MShzb2FwKSA9PSBFT0YpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgaWYgKGkgPT0gMikKKyAgICAgIGYgPSBjOworICB9CisgIGlmIChmICYgMHgwNCkgLyogRkVYVFJBICovCisgIHsgZm9yIChpID0gc29hcF9nZXQxKHNvYXApIHwgKHNvYXBfZ2V0MShzb2FwKSA8PCA4KTsgaTsgaS0tKQorICAgICAgaWYgKChpbnQpc29hcF9nZXQxKHNvYXApID09IEVPRikKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIH0KKyAgaWYgKGYgJiAweDA4KSAvKiBGTkFNRSAqLworICAgIGRvCisgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworICAgIHdoaWxlIChjICYmIChpbnQpYyAhPSBFT0YpOworICBpZiAoKGludCljICE9IEVPRiAmJiAoZiAmIDB4MTApKSAvKiBGQ09NTUVOVCAqLworICAgIGRvCisgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworICAgIHdoaWxlIChjICYmIChpbnQpZiAhPSBFT0YpOworICBpZiAoKGludCljICE9IEVPRiAmJiAoZiAmIDB4MDEpKSAvKiBGSENSQyAqLworICB7IGlmICgoaW50KShjID0gc29hcF9nZXQxKHNvYXApKSAhPSBFT0YpCisgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworICB9CisgIGlmICgoaW50KWMgPT0gRU9GKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JlZ2luX3JlY3Yoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXBfd2NoYXIgYzsKKyAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICBzb2FwX2ZyZWUoc29hcCk7CisgIHNvYXBfc2V0X2xvY2FsX25hbWVzcGFjZXMoc29hcCk7CisgIHNvYXAtPnZlcnNpb24gPSAwOwkvKiBkb24ndCBhc3N1bWUgd2UncmUgcGFyc2luZyBTT0FQIGNvbnRlbnQgYnkgZGVmYXVsdCAqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgc29hcF9mcmVlX2lodChzb2FwKTsKKyNlbmRpZgorICBpZiAoKHNvYXAtPmltb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgICBzb2FwLT5vbW9kZSB8PSBTT0FQX0lPX0NIVU5LOworICBzb2FwLT5pbW9kZSAmPSB+U09BUF9JTzsKKyAgc29hcC0+bW9kZSA9IHNvYXAtPmltb2RlOworICBpZiAoIXNvYXAtPmtlZXBfYWxpdmUpCisgIHsgc29hcC0+YnVmbGVuID0gMDsKKyAgICBzb2FwLT5idWZpZHggPSAwOworICB9CisgIGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0tFRVBBTElWRSkpCisgICAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7CisgIHNvYXAtPmFoZWFkID0gMDsKKyAgc29hcC0+cGVla2VkID0gMDsKKyAgc29hcC0+bGV2ZWwgPSAwOworICBzb2FwLT5wYXJ0ID0gU09BUF9CRUdJTjsKKyAgc29hcC0+YWxsb2NlZCA9IDA7CisgIHNvYXAtPmNvdW50ID0gMDsKKyAgc29hcC0+bGVuZ3RoID0gMDsKKyAgc29hcC0+Y2RhdGEgPSAwOworICAqc29hcC0+ZW5kcG9pbnQgPSAnXDAnOworICBzb2FwLT5hY3Rpb24gPSBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzb2FwLT5kb20gPSBOVUxMOworICBzb2FwLT5kaW1lLmNodW5rc2l6ZSA9IDA7CisgIHNvYXAtPmRpbWUuYnVmbGVuID0gMDsKKyAgc29hcC0+ZGltZS5saXN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGlzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmxhc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gTlVMTDsKKyAgc29hcC0+bWltZS5zdGFydCA9IE5VTEw7CisgIHNvYXAtPnhsaXN0ID0gTlVMTDsKKyNlbmRpZgorI2lmZGVmIFdJTjMyCisjaWZuZGVmIFVOREVSX0NFCisjaWZuZGVmIFdJVEhfRkFTVENHSQorICBpZiAoIXNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisjaWZkZWYgX19CT1JMQU5EQ19fCisgICAgc2V0bW9kZSgoU09BUF9TT0NLRVQpc29hcC0+cmVjdmZkLCBPX0JJTkFSWSk7CisjZWxzZQorICAgIF9zZXRtb2RlKChTT0FQX1NPQ0tFVClzb2FwLT5yZWN2ZmQsIF9PX0JJTkFSWSk7CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBXSVRIX1pMSUIKKyAgc29hcC0+bW9kZSAmPSB+U09BUF9FTkNfWkxJQjsKKyAgc29hcC0+emxpYl9pbiA9IFNPQVBfWkxJQl9OT05FOworICBzb2FwLT56bGliX291dCA9IFNPQVBfWkxJQl9OT05FOworICBzb2FwLT5kX3N0cmVhbS5uZXh0X2luID0gWl9OVUxMOworICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbiA9IDA7CisgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gKEJ5dGUqKXNvYXAtPmJ1ZjsKKyAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0ID0gU09BUF9CVUZMRU47CisgIHNvYXAtPnpfcmF0aW9faW4gPSAxLjA7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPmZwcmVwYXJlaW5pdCkKKyAgICBzb2FwLT5mcHJlcGFyZWluaXQoc29hcCk7CisjZW5kaWYKKyAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyNpZmRlZiBXSVRIX0daSVAKKyAgaWYgKGMgPT0gMHgxRikKKyAgeyBpZiAoc29hcF9nZXRnemlwaGRyKHNvYXApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmIChpbmZsYXRlSW5pdDIoJnNvYXAtPmRfc3RyZWFtLCAtTUFYX1dCSVRTKSAhPSBaX09LKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfSU5GTEFURTsKKyAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX1pMSUI7CisgICAgc29hcC0+emxpYl9pbiA9IFNPQVBfWkxJQl9HWklQOworICAgIHNvYXAtPnpfY3JjID0gY3JjMzIoMEwsIE5VTEwsIDApOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZ3ppcCBpbml0aWFsaXplZFxuIikpOworICAgIG1lbWNweShzb2FwLT56X2J1Ziwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTik7CisgICAgLyogc2hvdWxkIG5vdCBjaHVuayBvdmVyIHBsYWluIHRyYW5zcG9ydCwgc28gd2h5IGJvdGhlciB0byBjaGVjaz8gKi8KKyAgICAvKiBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKSAqLworICAgIC8qICAgc29hcC0+el9idWZsZW4gPSBzb2FwLT5idWZpZHg7ICovCisgICAgLyogZWxzZSAqLworICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfaW4gPSAoQnl0ZSopKHNvYXAtPnpfYnVmICsgc29hcC0+YnVmaWR4KTsKKyAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbiA9IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICBzb2FwLT56X2J1ZmxlbiA9IHNvYXAtPmJ1ZmxlbjsKKyAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5idWZpZHg7CisgICAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgfSAgCisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKGMgPT0gJy0nICYmIHNvYXBfZ2V0MChzb2FwKSA9PSAnLScpCisgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19NSU1FOworICBlbHNlIGlmICgoYyAmIDB4RkZGQykgPT0gKFNPQVBfRElNRV9WRVJTSU9OIHwgU09BUF9ESU1FX01CKSAmJiAoc29hcF9nZXQwKHNvYXApICYgMHhGRkYwKSA9PSAweDIwKQorICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfRElNRTsKKyAgZWxzZQorI2VuZGlmCisgIHsgd2hpbGUgKHNvYXBfYmxhbmsoYykpCisgICAgICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICB9CisgIGlmICgoaW50KWMgPT0gRU9GKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworI2lmbmRlZiBXSVRIX05PSFRUUAorICAvKiBpZiBub3QgWE1MIG9yIChzdGFydCBvZilCT00gb3IgTUlNRS9ESU1FL1pMSUIsIGFzc3VtZSBIVFRQIGhlYWRlciAqLworICBpZiAoYyAhPSAnPCcgJiYgYyAhPSAweEVGICYmICEoc29hcC0+bW9kZSAmIChTT0FQX0VOQ19NSU1FIHwgU09BUF9FTkNfRElNRSB8IFNPQVBfRU5DX1pMSUIpKSkKKyAgeyBzb2FwLT5tb2RlICY9IH5TT0FQX0lPOworICAgIHNvYXAtPmVycm9yID0gc29hcC0+ZnBhcnNlKHNvYXApOworICAgIGlmIChzb2FwLT5lcnJvciAmJiBzb2FwLT5lcnJvciA8IFNPQVBfU1RPUCkKKyAgICB7IHNvYXAtPmtlZXBfYWxpdmUgPSAwOyAvKiBmb3JjZSBjbG9zZSBsYXRlciAqLworICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKQorICAgIHsgc29hcC0+Y2h1bmtidWZsZW4gPSBzb2FwLT5idWZsZW47CisgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5idWZpZHg7CisgICAgICBzb2FwLT5jaHVua3NpemUgPSAwOworICAgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgICBlbHNlIGlmIChzb2FwLT5mcHJlcGFyZXJlY3YgJiYgc29hcC0+YnVmbGVuICE9IHNvYXAtPmJ1ZmlkeCkKKyAgICAgIHNvYXAtPmZwcmVwYXJlcmVjdihzb2FwLCBzb2FwLT5idWYgKyBzb2FwLT5idWZpZHgsIHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeCk7CisjZW5kaWYKKyNpZmRlZiBXSVRIX1pMSUIKKyAgICBpZiAoc29hcC0+emxpYl9pbiAhPSBTT0FQX1pMSUJfTk9ORSkKKyAgICB7IC8qIGZwYXJzZSBzaG91bGQgbm90IHVzZSBzb2FwX3VuZ2V0IHRvIHB1c2ggYmFjayBsYXN0IGNoYXIgKi8KKyNpZmRlZiBXSVRIX0daSVAKKyAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICBpZiAoYyA9PSAweDFGKQorICAgICAgeyBpZiAoc29hcF9nZXRnemlwaGRyKHNvYXApKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgaWYgKGluZmxhdGVJbml0Migmc29hcC0+ZF9zdHJlYW0sIC1NQVhfV0JJVFMpICE9IFpfT0spCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgICBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX0lORkxBVEU7CisgICAgICAgIHNvYXAtPnpfY3JjID0gY3JjMzIoMEwsIE5VTEwsIDApOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImd6aXAgaW5pdGlhbGl6ZWRcbiIpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgc29hcF9yZXZnZXQxKHNvYXApOworI2Vsc2UKKyAgICAgIHsKKyNlbmRpZgorICAgICAgICBpZiAoaW5mbGF0ZUluaXQoJnNvYXAtPmRfc3RyZWFtKSAhPSBaX09LKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICAgICAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9JTkZMQVRFOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluZmxhdGUgaW5pdGlhbGl6ZWRcbiIpKTsKKyAgICAgIH0KKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfWkxJQjsKKyAgICAgIG1lbWNweShzb2FwLT56X2J1Ziwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTik7CisgICAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X2luID0gKEJ5dGUqKShzb2FwLT56X2J1ZiArIHNvYXAtPmJ1ZmlkeCk7CisgICAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbiA9IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICAgIHNvYXAtPnpfYnVmbGVuID0gc29hcC0+YnVmbGVuOworICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+YnVmaWR4OworICAgIH0KKyNlbmRpZgorICAgIGlmIChzb2FwLT5lcnJvcikKKyAgICB7IGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX0ZPUk0gJiYgc29hcC0+ZmZvcm0pCisgICAgICB7IHNvYXAtPmVycm9yID0gc29hcC0+ZmZvcm0oc29hcCk7CisgICAgICAgIGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX09LKQorICAgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9TVE9QOyAvKiBwcmV2ZW50cyBmdXJ0aGVyIHByb2Nlc3NpbmcgKi8KKyAgICAgIH0KKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgIH0KKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01JTUUpCisgIHsgaWYgKHNvYXBfZ2V0bWltZWhkcihzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAoc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCBzb2FwLT5taW1lLmZpcnN0LT50eXBlLCAiYXBwbGljYXRpb24vZGltZSIpKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19ESU1FOworICB9CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkKKyAgeyBpZiAoc29hcF9nZXRkaW1laGRyKHNvYXApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmIChzb2FwLT5kaW1lLmZsYWdzICYgU09BUF9ESU1FX0NGKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDaHVua2VkIERJTUUgU09BUCBtZXNzYWdlXG4iKSk7CisgICAgICBzb2FwLT5kaW1lLmNodW5rc2l6ZSA9IHNvYXAtPmRpbWUuc2l6ZTsKKyAgICAgIGlmIChzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHggPj0gc29hcC0+ZGltZS5jaHVua3NpemUpCisgICAgICB7IHNvYXAtPmRpbWUuYnVmbGVuID0gc29hcC0+YnVmbGVuOworICAgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5idWZpZHggKyBzb2FwLT5kaW1lLmNodW5rc2l6ZTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgc29hcC0+ZGltZS5jaHVua3NpemUgLT0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgIH0KKyAgICBzb2FwLT5jb3VudCA9IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgfQorI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAoraHR0cF9wYXJzZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgY2hhciBoZWFkZXJbU09BUF9IRFJMRU5dLCAqczsKKyAgdW5zaWduZWQgc2hvcnQgZ2V0ID0gMCwgc3RhdHVzID0gMCwgayA9IDA7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiV2FpdGluZyBmb3IgSFRUUCByZXF1ZXN0L3Jlc3BvbnNlLi4uXG4iKSk7CisgICpzb2FwLT5lbmRwb2ludCA9ICdcMCc7CisgIHNvYXAtPmxlbmd0aCA9IDA7CisgIHNvYXAtPnVzZXJpZCA9IE5VTEw7CisgIHNvYXAtPnBhc3N3ZCA9IE5VTEw7CisgIHNvYXAtPmFjdGlvbiA9IE5VTEw7CisgIHNvYXAtPmF1dGhyZWFsbSA9IE5VTEw7CisgIGRvCisgIHsgaWYgKHNvYXBfZ2V0bGluZShzb2FwLCBzb2FwLT5tc2didWYsIHNpemVvZihzb2FwLT5tc2didWYpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiSFRUUCBzdGF0dXM6ICVzXG4iLCBzb2FwLT5tc2didWYpKTsKKyAgICBmb3IgKDs7KQorICAgIHsgaWYgKHNvYXBfZ2V0bGluZShzb2FwLCBoZWFkZXIsIFNPQVBfSERSTEVOKSkKKyAgICAgIHsgaWYgKHNvYXAtPmVycm9yID09IFNPQVBfRU9GKQorCXsgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICAgICAgICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJFT0YgaW4gSFRUUCBoZWFkZXIsIGNvbnRpbnVlIGFueXdheVxuIikpOworCSAgYnJlYWs7CisJfQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB9CisgICAgICBpZiAoISpoZWFkZXIpCisgICAgICAgIGJyZWFrOworICAgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkhUVFAgaGVhZGVyOiAlc1xuIiwgaGVhZGVyKSk7CisgICAgICBzID0gc3RyY2hyKGhlYWRlciwgJzonKTsKKyAgICAgIGlmIChzKQorICAgICAgeyAqcyA9ICdcMCc7CisgICAgICAgIGRvIHMrKzsKKyAgICAgICAgd2hpbGUgKCpzICYmICpzIDw9IDMyKTsKKyAgICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZwYXJzZWhkcihzb2FwLCBoZWFkZXIsIHMpKSkKKyAgICAgICAgeyBpZiAoc29hcC0+ZXJyb3IgPCBTT0FQX1NUT1ApCisJICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKwkgIHN0YXR1cyA9IHNvYXAtPmVycm9yOworCSAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmICgocyA9IHN0cmNocihzb2FwLT5tc2didWYsICcgJykpKQorICAgIHsgayA9ICh1bnNpZ25lZCBzaG9ydClzb2FwX3N0cnRvdWwocywgJnMsIDEwKTsKKyAgICAgIGlmICghc29hcF9ibGFuaygqcykpCisgICAgICAgIGsgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgICBrID0gMDsKKyAgfSB3aGlsZSAoayA9PSAxMDApOworICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiRmluaXNoZWQgSFRUUCBoZWFkZXIgcGFyc2luZ1xuIikpOworICBzID0gc3Ryc3RyKHNvYXAtPm1zZ2J1ZiwgIkhUVFAvIik7CisgIGlmIChzICYmIHNbN10gIT0gJzEnKQorICB7IGlmIChzb2FwLT5rZWVwX2FsaXZlID09IDEpCisgICAgICBzb2FwLT5rZWVwX2FsaXZlID0gMDsKKyAgICBpZiAoayA9PSAwICYmIChzb2FwLT5vbW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspIC8qIGsgPT0gMCBmb3IgSFRUUCByZXF1ZXN0ICovCisgICAgeyBzb2FwLT5pbW9kZSB8PSBTT0FQX0lPX0NIVU5LOworICAgICAgc29hcC0+b21vZGUgPSAoc29hcC0+b21vZGUgJiB+U09BUF9JTykgfCBTT0FQX0lPX1NUT1JFOworICAgIH0KKyAgfQorICBpZiAoc29hcC0+a2VlcF9hbGl2ZSA8IDApCisgICAgc29hcC0+a2VlcF9hbGl2ZSA9IDE7CisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJLZWVwIGFsaXZlIGNvbm5lY3Rpb24gPSAlZFxuIiwgc29hcC0+a2VlcF9hbGl2ZSkpOworICBpZiAocyAmJiAoKChnZXQgPSAhc3RybmNtcChzb2FwLT5tc2didWYsICJHRVQgIiwgNCkpKSB8fCAhc3RybmNtcChzb2FwLT5tc2didWYsICJQT1NUICIsIDUpKSkKKyAgeyBzaXplX3QgbSA9IHN0cmxlbihzb2FwLT5lbmRwb2ludCk7CisgICAgc2l6ZV90IG4gPSBtICsgKHMgLSBzb2FwLT5tc2didWYpIC0gNSAtICghZ2V0KTsKKyAgICBpZiAobiA+PSBzaXplb2Yoc29hcC0+ZW5kcG9pbnQpKQorICAgICAgbiA9IHNpemVvZihzb2FwLT5lbmRwb2ludCkgLSAxOworICAgIHN0cm5jcHkoc29hcC0+cGF0aCwgc29hcC0+bXNnYnVmICsgNCArICghZ2V0KSwgbiAtIG0pOworICAgIHNvYXAtPnBhdGhbbiAtIG1dID0gJ1wwJzsKKyAgICBzdHJjYXQoc29hcC0+ZW5kcG9pbnQsIHNvYXAtPnBhdGgpOworICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJUYXJnZXQgZW5kcG9pbnQ9JyVzJ1xuIiwgc29hcC0+ZW5kcG9pbnQpKTsKKyAgICBpZiAoZ2V0KQorICAgIHsgc29hcC0+ZXJyb3IgPSBzb2FwLT5mZ2V0KHNvYXApOworICAgICAgaWYgKHNvYXAtPmVycm9yID09IFNPQVBfT0spCisgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9TVE9QOyAvKiBwcmV2ZW50cyBmdXJ0aGVyIHByb2Nlc3NpbmcgKi8KKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgaWYgKHN0YXR1cykKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IHN0YXR1czsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICBpZiAoayA9PSAwIHx8IChrID49IDIwMCAmJiBrIDw9IDI5OSkgfHwgayA9PSA0MDAgfHwgayA9PSA1MDApCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJIVFRQIGVycm9yICVkXG4iLCBrKSk7CisgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiSFRUUCBlcnJvciIsIHNvYXAtPm1zZ2J1Ziwgayk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK2h0dHBfcGFyc2VfaGVhZGVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbCkKK3sgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiSG9zdCIpKQorICB7IAorI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgIGlmIChzb2FwLT5pbW9kZSAmIFNPQVBfRU5DX1NTTCkKKyAgICAgIHN0cmNweShzb2FwLT5lbmRwb2ludCwgImh0dHBzOi8vIik7CisgICAgZWxzZQorI2VuZGlmCisgICAgICBzdHJjcHkoc29hcC0+ZW5kcG9pbnQsICJodHRwOi8vIik7CisgICAgc3RybmNhdChzb2FwLT5lbmRwb2ludCwgdmFsLCBzaXplb2Yoc29hcC0+ZW5kcG9pbnQpIC0gOCk7CisgICAgc29hcC0+ZW5kcG9pbnRbc2l6ZW9mKHNvYXAtPmVuZHBvaW50KSAtIDFdID0gJ1wwJzsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtVHlwZSIpKQorICB7IGlmIChzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCwgImFwcGxpY2F0aW9uL2RpbWUiKSkKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfRElNRTsKKyAgICBlbHNlIGlmIChzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCwgIm11bHRpcGFydC9yZWxhdGVkIikKKyAgICAgICAgICB8fCBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCwgIm11bHRpcGFydC9mb3JtLWRhdGEiKSkKKyAgICB7IHNvYXAtPm1pbWUuYm91bmRhcnkgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCwgImJvdW5kYXJ5IikpOworICAgICAgc29hcC0+bWltZS5zdGFydCA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAic3RhcnQiKSk7CisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX01JTUU7CisgICAgfQorICB9CisjZW5kaWYKKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LUxlbmd0aCIpKQorICAgIHNvYXAtPmxlbmd0aCA9IHNvYXBfc3RydG91bCh2YWwsIE5VTEwsIDEwKTsKKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LUVuY29kaW5nIikpCisgIHsgaWYgKCFzb2FwX3RhZ19jbXAodmFsLCAiZGVmbGF0ZSIpKQorI2lmZGVmIFdJVEhfWkxJQgorICAgICAgc29hcC0+emxpYl9pbiA9IFNPQVBfWkxJQl9ERUZMQVRFOworI2Vsc2UKKyAgICAgIHJldHVybiBTT0FQX1pMSUJfRVJST1I7CisjZW5kaWYKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHZhbCwgImd6aXAiKSkKKyNpZmRlZiBXSVRIX0daSVAKKyAgICAgIHNvYXAtPnpsaWJfaW4gPSBTT0FQX1pMSUJfR1pJUDsKKyNlbHNlCisgICAgICByZXR1cm4gU09BUF9aTElCX0VSUk9SOworI2VuZGlmCisgIH0KKyNpZmRlZiBXSVRIX1pMSUIKKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJBY2NlcHQtRW5jb2RpbmciKSkKKyAgeworI2lmZGVmIFdJVEhfR1pJUAorICAgIGlmIChzdHJjaHIodmFsLCAnKicpIHx8IHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAiZ3ppcCIpKQorICAgICAgc29hcC0+emxpYl9vdXQgPSBTT0FQX1pMSUJfR1pJUDsKKyAgICBlbHNlCisjZW5kaWYKKyAgICBpZiAoc3RyY2hyKHZhbCwgJyonKSB8fCBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCwgImRlZmxhdGUiKSkKKyAgICAgIHNvYXAtPnpsaWJfb3V0ID0gU09BUF9aTElCX0RFRkxBVEU7CisgICAgZWxzZQorICAgICAgc29hcC0+emxpYl9vdXQgPSBTT0FQX1pMSUJfTk9ORTsKKyAgfQorI2VuZGlmCisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiVHJhbnNmZXItRW5jb2RpbmciKSkKKyAgeyBzb2FwLT5tb2RlICY9IH5TT0FQX0lPOworICAgIGlmICghc29hcF90YWdfY21wKHZhbCwgImNodW5rZWQiKSkKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19DSFVOSzsKKyAgfQorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbm5lY3Rpb24iKSkKKyAgeyBpZiAoIXNvYXBfdGFnX2NtcCh2YWwsICJrZWVwLWFsaXZlIikpCisgICAgICBzb2FwLT5rZWVwX2FsaXZlID0gLXNvYXAtPmtlZXBfYWxpdmU7CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcCh2YWwsICJjbG9zZSIpKQorICAgICAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFOCisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQXV0aG9yaXphdGlvbiIpKQorICB7IGlmICghc29hcF90YWdfY21wKHZhbCwgIkJhc2ljICoiKSkKKyAgICB7IGludCBuOworICAgICAgY2hhciAqczsKKyAgICAgIHNvYXBfYmFzZTY0MnMoc29hcCwgdmFsICsgNiwgc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSAtIDEsICZuKTsKKyAgICAgIHNvYXAtPnRtcGJ1ZltuXSA9ICdcMCc7CisgICAgICBpZiAoKHMgPSBzdHJjaHIoc29hcC0+dG1wYnVmLCAnOicpKSkKKyAgICAgIHsgKnMgPSAnXDAnOworCXNvYXAtPnVzZXJpZCA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPnRtcGJ1Zik7CisJc29hcC0+cGFzc3dkID0gc29hcF9zdHJkdXAoc29hcCwgcyArIDEpOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIldXVy1BdXRoZW50aWNhdGUiKSkKKyAgICBzb2FwLT5hdXRocmVhbG0gPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCArIDYsICJyZWFsbSIpKTsKKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJFeHBlY3QiKSkKKyAgeyBpZiAoIXNvYXBfdGFnX2NtcCh2YWwsICIxMDAtY29udGludWUiKSkKKyAgICB7IGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiSFRUUC8xLjEgMTAwIENvbnRpbnVlIiwgTlVMTCkpCisgICAgICAgfHwgKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgTlVMTCwgTlVMTCkpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICB9CisjZW5kaWYKKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJTT0FQQWN0aW9uIikpCisgIHsgaWYgKCp2YWwgPT0gJyInKQorICAgIHsgc29hcC0+YWN0aW9uID0gc29hcF9zdHJkdXAoc29hcCwgdmFsICsgMSk7CisgICAgICBzb2FwLT5hY3Rpb25bc3RybGVuKHNvYXAtPmFjdGlvbikgLSAxXSA9ICdcMCc7CisgICAgfQorICB9CisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiTG9jYXRpb24iKSkKKyAgeyBzdHJuY3B5KHNvYXAtPmVuZHBvaW50LCB2YWwsIHNpemVvZihzb2FwLT5lbmRwb2ludCkpOworICAgIHNvYXAtPmVuZHBvaW50W3NpemVvZihzb2FwLT5lbmRwb2ludCkgLSAxXSA9ICdcMCc7CisgIH0KKyNpZmRlZiBXSVRIX0NPT0tJRVMKKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb29raWUiKSB8fCAhc29hcF90YWdfY21wKGtleSwgIlNldC1Db29raWUiKSkKKyAgICBzb2FwX2dldGNvb2tpZXMoc29hcCwgdmFsKTsKKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgIWRlZmluZWQoV0lUSF9OT0hUVFApIHx8ICFkZWZpbmVkKFdJVEhfTEVBTkVSKQorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpsaW5lLCBjb25zdCBjaGFyICprZXkpCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnMgPSBsaW5lOworICBpZiAocykKKyAgeyB3aGlsZSAoKnMpCisgICAgeyByZWdpc3RlciBzaG9ydCBmbGFnOworICAgICAgcyA9IHNvYXBfZGVjb2RlX2tleShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCBzKTsKKyAgICAgIGZsYWcgPSBzb2FwX3RhZ19jbXAoc29hcC0+dG1wYnVmLCBrZXkpOworICAgICAgcyA9IHNvYXBfZGVjb2RlX3ZhbChzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCBzKTsKKyAgICAgIGlmICghZmxhZykKKyAgICAgICAgcmV0dXJuIHNvYXAtPnRtcGJ1ZjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmICFkZWZpbmVkKFdJVEhfTk9IVFRQKSB8fCAhZGVmaW5lZChXSVRIX0xFQU5FUikKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9kZWNvZGVfa2V5KGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwgY29uc3QgY2hhciAqdmFsKQoreyByZXR1cm4gc29hcF9kZWNvZGUoYnVmLCBsZW4sIHZhbCwgIj0sOyIpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAhZGVmaW5lZChXSVRIX05PSFRUUCkgfHwgIWRlZmluZWQoV0lUSF9MRUFORVIpCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZGVjb2RlX3ZhbChjaGFyICpidWYsIHNpemVfdCBsZW4sIGNvbnN0IGNoYXIgKnZhbCkKK3sgaWYgKCp2YWwgIT0gJz0nKQorICB7ICpidWYgPSAnXDAnOworICAgIHJldHVybiB2YWw7CisgIH0KKyAgcmV0dXJuIHNvYXBfZGVjb2RlKGJ1ZiwgbGVuLCB2YWwgKyAxLCAiLDsiKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgIWRlZmluZWQoV0lUSF9OT0hUVFApIHx8ICFkZWZpbmVkKFdJVEhfTEVBTkVSKQorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBjb25zdCBjaGFyKgorc29hcF9kZWNvZGUoY2hhciAqYnVmLCBzaXplX3QgbGVuLCBjb25zdCBjaGFyICp2YWwsIGNvbnN0IGNoYXIgKnNlcCkKK3sgY29uc3QgY2hhciAqczsKKyAgY2hhciAqdCA9IGJ1ZjsKKyAgZm9yIChzID0gdmFsOyAqczsgcysrKQorICAgIGlmICgqcyAhPSAnICcgJiYgKnMgIT0gJ1x0JyAmJiAhc3RyY2hyKHNlcCwgKnMpKQorICAgICAgYnJlYWs7CisgIGlmICgqcyA9PSAnIicpCisgIHsgcysrOworICAgIHdoaWxlICgqcyAmJiAqcyAhPSAnIicgJiYgLS1sZW4pCisgICAgICAqdCsrID0gKnMrKzsKKyAgfQorICBlbHNlCisgIHsgd2hpbGUgKHNvYXBfbm90YmxhbmsoKnMpICYmICFzdHJjaHIoc2VwLCAqcykgJiYgLS1sZW4pCisgICAgeyBpZiAoKnMgPT0gJyUnKQorICAgICAgeyAqdCsrID0gKChzWzFdID49ICdBJyA/IChzWzFdICYgMHg3KSArIDkgOiBzWzFdIC0gJzAnKSA8PCA0KQorICAgICAgICAgICAgICArIChzWzJdID49ICdBJyA/IChzWzJdICYgMHg3KSArIDkgOiBzWzJdIC0gJzAnKTsKKyAgICAgICAgcyArPSAzOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICAqdCsrID0gKnMrKzsKKyAgICB9CisgIH0KKyAgKnQgPSAnXDAnOworICB3aGlsZSAoKnMgJiYgIXN0cmNocihzZXAsICpzKSkKKyAgICBzKys7CisgIHJldHVybiBzOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW52ZWxvcGVfYmVnaW5fb3V0KHN0cnVjdCBzb2FwICpzb2FwKQoreworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzaXplX3QgbiA9IDA7CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01JTUUpICYmIHNvYXAtPm1pbWUuYm91bmRhcnkgJiYgc29hcC0+bWltZS5zdGFydCkKKyAgeyBjb25zdCBjaGFyICpzOworICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpICYmICEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pKQorICAgICAgcyA9ICJhcHBsaWNhdGlvbi9kaW1lIjsKKyAgICBlbHNlIGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgICAgICBzID0gImFwcGxpY2F0aW9uL3NvYXAreG1sOyBjaGFyc2V0PXV0Zi04IjsKKyAgICBlbHNlCisgICAgICBzID0gInRleHQveG1sOyBjaGFyc2V0PXV0Zi04IjsKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIi0tJXNcclxuQ29udGVudC1UeXBlOiAlc1xyXG5Db250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiaW5hcnlcclxuQ29udGVudC1JRDogJXNcclxuXHJcbiIsIHNvYXAtPm1pbWUuYm91bmRhcnksIHMsIHNvYXAtPm1pbWUuc3RhcnQpOworICAgIG4gPSBzdHJsZW4oc29hcC0+dG1wYnVmKTsKKyAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzb2FwLT50bXBidWYsIG4pKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgc29hcC0+ZGltZS5zaXplID0gc29hcC0+Y291bnQ7CS8qIERJTUUgaW4gTUlNRSBjb3JyZWN0aW9uICovCisgIGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSkKKyAgeyBpZiAoc29hcF9wdXRkaW1laGRyKHNvYXApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisjZW5kaWYKKyAgc29hcC0+cGFydCA9IFNPQVBfSU5fRU5WRUxPUEU7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsICJTT0FQLUVOVjpFbnZlbG9wZSIsIDAsIE5VTEwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VudmVsb3BlX2VuZF9vdXQoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCAiU09BUC1FTlY6RW52ZWxvcGUiKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpICYmICEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pKQorICB7IHNvYXAtPmRpbWUuc2l6ZSA9IHNvYXAtPmNvdW50IC0gc29hcC0+ZGltZS5zaXplOwkvKiBESU1FIGluIE1JTUUgY29ycmVjdGlvbiAqLworICAgIHNwcmludGYoc29hcC0+aWQsIHNvYXAtPmRpbWVfaWRfZm9ybWF0LCAwKTsKKyAgICBzb2FwLT5kaW1lLmlkID0gc29hcC0+aWQ7CisgICAgaWYgKHNvYXAtPmxvY2FsX25hbWVzcGFjZXMpCisgICAgeyBpZiAoc29hcC0+bG9jYWxfbmFtZXNwYWNlc1swXS5vdXQpCisgICAgICAgIHNvYXAtPmRpbWUudHlwZSA9IChjaGFyKilzb2FwLT5sb2NhbF9uYW1lc3BhY2VzWzBdLm91dDsKKyAgICAgIGVsc2UKKyAgICAgICAgc29hcC0+ZGltZS50eXBlID0gKGNoYXIqKXNvYXAtPmxvY2FsX25hbWVzcGFjZXNbMF0ubnM7CisgICAgfQorICAgIHNvYXAtPmRpbWUub3B0aW9ucyA9IE5VTEw7CisgICAgc29hcC0+ZGltZS5mbGFncyA9IFNPQVBfRElNRV9NQiB8IFNPQVBfRElNRV9BQlNVUkk7CisgICAgaWYgKCFzb2FwLT5kaW1lLmZpcnN0KQorICAgICAgc29hcC0+ZGltZS5mbGFncyB8PSBTT0FQX0RJTUVfTUU7CisgICAgc29hcC0+Y291bnQgKz0gMTIgKyAoKHN0cmxlbihzb2FwLT5kaW1lLmlkKSszKSYofjMpKSArICgoc3RybGVuKHNvYXAtPmRpbWUudHlwZSkrMykmKH4zKSk7CisgIH0KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkgJiYgIShzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkpCisgICAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgU09BUF9TVFJfUEFERElORywgLShsb25nKXNvYXAtPmRpbWUuc2l6ZSYzKTsKKyNlbmRpZgorICBzb2FwLT5wYXJ0ID0gU09BUF9FTkRfRU5WRUxPUEU7CisgIHJldHVybiBTT0FQX09LOworfSAKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbnZlbG9wZV9iZWdpbl9pbihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc3RydWN0IE5hbWVzcGFjZSAqcDsKKyAgc29hcC0+cGFydCA9IFNPQVBfSU5fRU5WRUxPUEU7CisgIGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgIlNPQVAtRU5WOkVudmVsb3BlIiwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9WRVJTSU9OTUlTTUFUQ0g7CisgIHAgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzOworICBpZiAocCkKKyAgeyBjb25zdCBjaGFyICpucyA9IHBbMF0ub3V0OworICAgIGlmICghbnMpCisgICAgICBucyA9IHBbMF0ubnM7CisgICAgaWYgKCFzdHJjbXAobnMsIHNvYXBfZW52MSkpCisgICAgeyBzb2FwLT52ZXJzaW9uID0gMTsgLyogbWFrZSBzdXJlIHdlIHVzZSBTT0FQIDEuMSAqLworICAgICAgaWYgKHBbMV0ub3V0KQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcFsxXS5vdXQpOworICAgICAgaWYgKChwWzFdLm91dCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc29hcF9lbmMxKSkpKQorICAgICAgICBzdHJjcHkocFsxXS5vdXQsIHNvYXBfZW5jMSk7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAobnMsIHNvYXBfZW52MikpCisgICAgeyBzb2FwLT52ZXJzaW9uID0gMjsgLyogbWFrZSBzdXJlIHdlIHVzZSBTT0FQIDEuMiAqLworICAgICAgaWYgKHBbMV0ub3V0KQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcFsxXS5vdXQpOworICAgICAgaWYgKChwWzFdLm91dCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc29hcF9lbmMyKSkpKQorICAgICAgICBzdHJjcHkocFsxXS5vdXQsIHNvYXBfZW5jMik7CisgICAgfQorICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VudmVsb3BlX2VuZF9pbihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+cGFydCA9IFNPQVBfRU5EX0VOVkVMT1BFOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCAiU09BUC1FTlY6RW52ZWxvcGUiKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9ib2R5X2JlZ2luX291dChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+cGFydCA9IFNPQVBfSU5fQk9EWTsKKyAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMSkKKyAgICBzb2FwLT5lbmNvZGluZyA9IDE7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TRUMpICYmIHNvYXBfc2V0X2F0dHIoc29hcCwgIndzdTpJZCIsICJCb2R5IikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2VuZGlmCisgIGlmIChzb2FwX2VsZW1lbnQoc29hcCwgIlNPQVAtRU5WOkJvZHkiLCAwLCBOVUxMKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzb2FwLCBOVUxMKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9ib2R5X2VuZF9vdXQoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCAiU09BUC1FTlY6Qm9keSIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgc29hcC0+cGFydCA9IFNPQVBfRU5EX0JPRFk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JvZHlfYmVnaW5faW4oc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPnBhcnQgPSBTT0FQX0lOX0JPRFk7CisgIGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgIlNPQVAtRU5WOkJvZHkiLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmICghc29hcC0+Ym9keSkKKyAgICBzb2FwLT5wYXJ0ID0gU09BUF9OT19CT0RZOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9ib2R5X2VuZF9pbihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXAtPnBhcnQgPT0gU09BUF9OT19CT0RZKQorICAgIHJldHVybiBTT0FQX09LOworICBzb2FwLT5wYXJ0ID0gU09BUF9FTkRfQk9EWTsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgIlNPQVAtRU5WOkJvZHkiKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWN2X2hlYWRlcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXBfZ2V0aGVhZGVyKHNvYXApICYmIHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKQorICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfZW5kcG9pbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmVuZHBvaW50KQoreyByZWdpc3RlciBjb25zdCBjaGFyICpzOworICByZWdpc3RlciBzaXplX3QgaSwgbjsKKyAgc29hcC0+ZW5kcG9pbnRbMF0gPSAnXDAnOworICBzb2FwLT5ob3N0WzBdID0gJ1wwJzsKKyAgc29hcC0+cGF0aFswXSA9ICcvJzsKKyAgc29hcC0+cGF0aFsxXSA9ICdcMCc7CisgIHNvYXAtPnBvcnQgPSA4MDsKKyAgaWYgKCFlbmRwb2ludCB8fCAhKmVuZHBvaW50KQorICAgIHJldHVybjsKKyAgaWYgKCFzdHJuY21wKGVuZHBvaW50LCAiaHR0cHM6IiwgNikpCisgICAgc29hcC0+cG9ydCA9IDQ0MzsKKyAgc3RybmNweShzb2FwLT5lbmRwb2ludCwgZW5kcG9pbnQsIHNpemVvZihzb2FwLT5lbmRwb2ludCkgLSAxKTsKKyAgcyA9IHN0cmNocihlbmRwb2ludCwgJzonKTsKKyAgaWYgKHMgJiYgc1sxXSA9PSAnLycgJiYgc1syXSA9PSAnLycpCisgICAgcyArPSAzOworICBlbHNlCisgICAgcyA9IGVuZHBvaW50OworICBuID0gc3RybGVuKHMpOworICBpZiAobiA+PSBzaXplb2Yoc29hcC0+aG9zdCkpCisgICAgbiA9IHNpemVvZihzb2FwLT5ob3N0KSAtIDE7CisjaWZkZWYgV0lUSF9JUFY2CisgIGlmIChzWzBdID09ICdbJykKKyAgeyBzKys7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICB7IHNvYXAtPmhvc3RbaV0gPSBzW2ldOworICAgICAgaWYgKHNbaV0gPT0gJ10nKQorICAgICAgeyBzKys7CisgICAgICAgIGJyZWFrOyAKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZQorICB7IGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgeyBzb2FwLT5ob3N0W2ldID0gc1tpXTsKKyAgICAgIGlmIChzW2ldID09ICcvJyB8fCBzW2ldID09ICc6JykKKyAgICAgICAgYnJlYWs7IAorICAgIH0KKyAgfQorI2Vsc2UKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgeyBzb2FwLT5ob3N0W2ldID0gc1tpXTsKKyAgICBpZiAoc1tpXSA9PSAnLycgfHwgc1tpXSA9PSAnOicpCisgICAgICBicmVhazsgCisgIH0KKyNlbmRpZgorICBzb2FwLT5ob3N0W2ldID0gJ1wwJzsKKyAgaWYgKHNbaV0gPT0gJzonKQorICB7IHNvYXAtPnBvcnQgPSAoaW50KWF0b2wocyArIGkgKyAxKTsKKyAgICBmb3IgKGkrKzsgaSA8IG47IGkrKykKKyAgICAgIGlmIChzW2ldID09ICcvJykKKyAgICAgICAgYnJlYWs7CisgIH0KKyAgaWYgKHNbaV0pCisgIHsgc3RybmNweShzb2FwLT5wYXRoLCBzICsgaSwgc2l6ZW9mKHNvYXAtPnBhdGgpKTsKKyAgICBzb2FwLT5wYXRoW3NpemVvZihzb2FwLT5wYXRoKSAtIDFdID0gJ1wwJzsKKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2Nvbm5lY3Qoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjb25zdCBjaGFyICphY3Rpb24pCit7IHJldHVybiBzb2FwX2Nvbm5lY3RfY29tbWFuZChzb2FwLCBTT0FQX1BPU1QsIGVuZHBvaW50LCBhY3Rpb24pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2Nvbm5lY3RfY29tbWFuZChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGh0dHBfY29tbWFuZCwgY29uc3QgY2hhciAqZW5kcG9pbnQsIGNvbnN0IGNoYXIgKmFjdGlvbikKK3sgY2hhciBob3N0W3NpemVvZihzb2FwLT5ob3N0KV07CisgIGludCBwb3J0OworICBzaXplX3QgY291bnQ7CisgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgc3RyY3B5KGhvc3QsIHNvYXAtPmhvc3QpOyAvKiBzYXZlIHRvIGNvbXBhcmUgKi8KKyAgcG9ydCA9IHNvYXAtPnBvcnQ7IC8qIHNhdmUgdG8gY29tcGFyZSAqLworICBzb2FwX3NldF9lbmRwb2ludChzb2FwLCBlbmRwb2ludCk7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5mY29ubmVjdCkKKyAgeyBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZmNvbm5lY3Qoc29hcCwgZW5kcG9pbnQsIHNvYXAtPmhvc3QsIHNvYXAtPnBvcnQpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBlbHNlCisjZW5kaWYKKyAgaWYgKHNvYXAtPmZvcGVuICYmICpzb2FwLT5ob3N0KQorICB7IHNvYXAtPnN0YXR1cyA9IGh0dHBfY29tbWFuZDsKKyAgICBpZiAoIXNvYXAtPmtlZXBfYWxpdmUgfHwgIXNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkgfHwgc3RyY21wKHNvYXAtPmhvc3QsIGhvc3QpIHx8IHNvYXAtPnBvcnQgIT0gcG9ydCB8fCAhc29hcC0+ZnBvbGwgfHwgc29hcC0+ZnBvbGwoc29hcCkpCisgICAgeyBzb2FwLT5rZWVwX2FsaXZlID0gMDsgLyogdG8gZm9yY2UgY2xvc2UgKi8KKyAgICAgIHNvYXAtPm9tb2RlICY9IH5TT0FQX0lPX1VEUDsgLyogdG8gZm9yY2UgY2xvc2UgKi8KKyAgICAgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvbm5lY3QvcmVjb25uZWN0IHRvIGhvc3Q9JyVzJyBwYXRoPSclcycgcG9ydD0lZFxuIiwgc29hcC0+aG9zdCwgc29hcC0+cGF0aCwgc29hcC0+cG9ydCkpOworI2lmZGVmIFdJVEhfVURQCisgICAgICBpZiAoIXN0cm5jbXAoZW5kcG9pbnQsICJzb2FwLnVkcDoiLCA5KSkKKyAgICAgICAgc29hcC0+b21vZGUgfD0gU09BUF9JT19VRFA7CisjZW5kaWYKKyAgICAgIHNvYXAtPnNvY2tldCA9IHNvYXAtPmZvcGVuKHNvYXAsIGVuZHBvaW50LCBzb2FwLT5ob3N0LCBzb2FwLT5wb3J0KTsKKyAgICAgIGlmIChzb2FwLT5lcnJvcikKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgc29hcC0+a2VlcF9hbGl2ZSA9ICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX0tFRVBBTElWRSkgIT0gMCk7CisgICAgfQorICB9CisgIGNvdW50ID0gc29hcF9jb3VudF9hdHRhY2htZW50cyhzb2FwKTsKKyAgaWYgKHNvYXBfYmVnaW5fc2VuZChzb2FwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjaWZuZGVmIFdJVEhfTk9IVFRQCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pICE9IFNPQVBfSU9fU1RPUkUgJiYgIShzb2FwLT5tb2RlICYgU09BUF9FTkNfWE1MKSAmJiBlbmRwb2ludCkKKyAgeyB1bnNpZ25lZCBpbnQgayA9IHNvYXAtPm1vZGU7CisgICAgc29hcC0+bW9kZSAmPSB+KFNPQVBfSU8gfCBTT0FQX0VOQ19aTElCKTsKKyAgICBpZiAoKGsgJiBTT0FQX0lPKSAhPSBTT0FQX0lPX0ZMVVNIKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX0JVRkZFUjsKKyAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3Qoc29hcCwgZW5kcG9pbnQsIHNvYXAtPmhvc3QsIHNvYXAtPnBvcnQsIHNvYXAtPnBhdGgsIGFjdGlvbiwgY291bnQpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgICBpZiAoKGsgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKQorICAgIHsgaWYgKHNvYXBfZmx1c2goc29hcCkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisjZW5kaWYKKyAgICBzb2FwLT5tb2RlID0gazsKKyAgfQorICBlbHNlIGlmIChhY3Rpb24pCisgICAgc29hcC0+YWN0aW9uID0gc29hcF9zdHJkdXAoc29hcCwgYWN0aW9uKTsKKyAgaWYgKGh0dHBfY29tbWFuZCAhPSBTT0FQX1BPU1QpCisgICAgcmV0dXJuIHNvYXBfZW5kX3NlbmQoc29hcCk7CisjZW5kaWYKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjaGFyKgorU09BUF9GTUFDMgorc29hcF9zMmJhc2U2NChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgdW5zaWduZWQgY2hhciAqcywgY2hhciAqdCwgaW50IG4pCit7IHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIG07CisgIHJlZ2lzdGVyIGNoYXIgKnA7CisgIGlmICghdCkKKyAgICB0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIChuICsgMikgLyAzICogNCArIDEpOworICBpZiAoIXQpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwID0gdDsKKyAgdFswXSA9ICdcMCc7CisgIGlmICghcykKKyAgICByZXR1cm4gcDsKKyAgZm9yICg7IG4gPiAyOyBuIC09IDMsIHMgKz0gMykKKyAgeyBtID0gc1swXTsKKyAgICBtID0gKG0gPDwgOCkgfCBzWzFdOworICAgIG0gPSAobSA8PCA4KSB8IHNbMl07CisgICAgZm9yIChpID0gNDsgaSA+IDA7IG0gPj49IDYpCisgICAgICB0Wy0taV0gPSBzb2FwX2Jhc2U2NG9bbSAmIDB4M0ZdOworICAgIHQgKz0gNDsKKyAgfQorICB0WzBdID0gJ1wwJzsKKyAgaWYgKG4gPiAwKQorICB7IG0gPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICBtID0gKG0gPDwgOCkgfCAqcysrOworICAgIGZvciAoOyBpIDwgMzsgaSsrKQorICAgICAgbSA8PD0gODsKKyAgICBmb3IgKGkrKzsgaSA+IDA7IG0gPj49IDYpCisgICAgICB0Wy0taV0gPSBzb2FwX2Jhc2U2NG9bbSAmIDB4M0ZdOworICAgIGZvciAoaSA9IDM7IGkgPiBuOyBpLS0pCisgICAgICB0W2ldID0gJz0nOworICAgIHRbNF0gPSAnXDAnOworICB9CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfYmFzZTY0MnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGNoYXIgKnQsIHNpemVfdCBsLCBpbnQgKm4pCit7IHJlZ2lzdGVyIGludCBpLCBqLCBjOworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIG07CisgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnA7CisgIGlmICghcyB8fCAhKnMpCisgIHsgaWYgKG4pCisgICAgICAqbiA9IDA7CisgICAgaWYgKHNvYXAtPmVycm9yKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFNPQVBfTk9OX05VTEw7CisgIH0KKyAgaWYgKCF0KQorICB7IGwgPSAoc3RybGVuKHMpICsgMykgLyA0ICogMzsKKyAgICB0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIGwpOworICB9CisgIGlmICghdCkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHJldHVybiBOVUxMOworICB9CisgIHAgPSB0OworICBpZiAobikKKyAgICAqbiA9IDA7CisgIGZvciAoOzspCisgIHsgZm9yIChpID0gMDsgaSA8IFNPQVBfQkxLTEVOOyBpKyspCisgICAgeyBtID0gMDsKKyAgICAgIGogPSAwOworICAgICAgd2hpbGUgKGogPCA0KQorICAgICAgeyBjID0gKnMrKzsKKyAgICAgICAgaWYgKGMgPT0gJz0nIHx8ICFjKQorICAgICAgICB7IGkgKj0gMzsKKyAgICAgICAgICBzd2l0Y2ggKGopCisgICAgICAgICAgeyBjYXNlIDI6CisgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoKG0gPj4gNCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgobSA+PiAxMCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgobSA+PiAyKSAmIDB4RkYpOworICAgICAgICAgICAgICBpICs9IDI7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChuKQorCSAgICAqbiArPSBpOworICAgICAgICAgIHJldHVybiBwOworICAgICAgICB9CisgICAgICAgIGMgLT0gJysnOworICAgICAgICBpZiAoYyA+PSAwICYmIGMgPD0gNzkpCisgICAgICAgIHsgbSA9IChtIDw8IDYpICsgc29hcF9iYXNlNjRpW2NdOworICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgKnQrKyA9IChjaGFyKSgobSA+PiAxNikgJiAweEZGKTsKKyAgICAgICp0KysgPSAoY2hhcikoKG0gPj4gOCkgJiAweEZGKTsKKyAgICAgICp0KysgPSAoY2hhcikobSAmIDB4RkYpOworICAgICAgaWYgKGwgPCAzKQorICAgICAgeyBpZiAobikKKwkgICpuICs9IGk7CisgICAgICAgIHJldHVybiBwOworICAgICAgfQorICAgICAgbCAtPSAzOworICAgIH0KKyAgICBpZiAobikKKyAgICAgICpuICs9IDMgKiBTT0FQX0JMS0xFTjsKKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfczJoZXgoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMsIGNoYXIgKnQsIGludCBuKQoreyByZWdpc3RlciBjaGFyICpwOworICBpZiAoIXQpCisgICAgdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCAyICogbiArIDEpOworICBpZiAoIXQpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwID0gdDsKKyAgdFswXSA9ICdcMCc7CisgIGlmIChzKQorICB7IGZvciAoOyBuID4gMDsgbi0tKQorICAgIHsgcmVnaXN0ZXIgaW50IG0gPSAqcysrOworICAgICAgKnQrKyA9IChjaGFyKSgobSA+PiA0KSArIChtID4gMTU5ID8gJ2EnIC0gMTAgOiAnMCcpKTsKKyAgICAgIG0gJj0gMHgwRjsKKyAgICAgICp0KysgPSAoY2hhcikobSArIChtID4gOSA/ICdhJyAtIDEwIDogJzAnKSk7CisgICAgfQorICB9CisgICp0KysgPSAnXDAnOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2hleDJzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBjaGFyICp0LCBzaXplX3QgbCwgaW50ICpuKQoreyByZWdpc3RlciBjb25zdCBjaGFyICpwOworICBpZiAoIXMgfHwgISpzKQorICB7IGlmIChuKQorICAgICAgKm4gPSAwOworICAgIGlmIChzb2FwLT5lcnJvcikKKyAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBTT0FQX05PTl9OVUxMOworICB9CisgIGlmICghdCkKKyAgeyBsID0gc3RybGVuKHMpIC8gMjsKKyAgICB0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIGwpOworICB9CisgIGlmICghdCkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHJldHVybiBOVUxMOworICB9CisgIHAgPSB0OworICB3aGlsZSAobCkKKyAgeyByZWdpc3RlciBpbnQgZDEsIGQyOworICAgIGQxID0gKnMrKzsKKyAgICBpZiAoIWQxKQorICAgICAgYnJlYWs7CisgICAgZDIgPSAqcysrOworICAgIGlmICghZDIpCisgICAgICBicmVhazsKKyAgICAqdCsrID0gKChkMSA+PSAnQScgPyAoZDEgJiAweDcpICsgOSA6IGQxIC0gJzAnKSA8PCA0KSArIChkMiA+PSAnQScgPyAoZDIgJiAweDcpICsgOSA6IGQyIC0gJzAnKTsKKyAgICBsLS07CisgIH0KKyAgaWYgKG4pCisgICAgKm4gPSB0IC0gcDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0aHR0cGhkcihzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0YXR1cywgc2l6ZV90IGNvdW50KQoreyByZWdpc3RlciBjb25zdCBjaGFyICpzID0gTlVMTDsKKyAgcmVnaXN0ZXIgaW50IGVyciA9IFNPQVBfT0s7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnIgPSBOVUxMOworI2VuZGlmCisgIGlmIChzdGF0dXMgPT0gU09BUF9GSUxFICYmIHNvYXAtPmh0dHBfY29udGVudCkKKyAgICBzID0gc29hcC0+aHR0cF9jb250ZW50OworICBlbHNlIGlmIChzdGF0dXMgPT0gU09BUF9IVE1MKQorICAgIHMgPSAidGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IjsKKyAgZWxzZSBpZiAoY291bnQgfHwgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykpCisgIHsgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgICAgIHMgPSAiYXBwbGljYXRpb24vc29hcCt4bWw7IGNoYXJzZXQ9dXRmLTgiOworICAgIGVsc2UKKyAgICAgIHMgPSAidGV4dC94bWw7IGNoYXJzZXQ9dXRmLTgiOworICB9CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5tb2RlICYgKFNPQVBfRU5DX0RJTUUgfCBTT0FQX0VOQ19NVE9NKSkKKyAgeyBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pCisgICAgeyByID0gczsKKyAgICAgIHMgPSAiYXBwbGljYXRpb24veG9wK3htbDsgY2hhcnNldD11dGYtOCI7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHMgPSAiYXBwbGljYXRpb24vZGltZSI7CisgIH0KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkgJiYgc29hcC0+bWltZS5ib3VuZGFyeSAmJiBzb2FwLT5zdGF0dXMgIT0gU09BUF9HRVQpCisgIHsgcmVnaXN0ZXIgY29uc3QgY2hhciAqdCA9IHN0cmNocihzLCAnOycpOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAibXVsdGlwYXJ0L3JlbGF0ZWQ7IGJvdW5kYXJ5PVwiJXNcIjsgdHlwZT1cIiIsIHNvYXAtPm1pbWUuYm91bmRhcnkpOworICAgIGlmICh0KQorICAgICAgc3RybmNhdChzb2FwLT50bXBidWYsIHMsIHQgLSBzKTsKKyAgICBlbHNlCisgICAgICBzdHJjYXQoc29hcC0+dG1wYnVmLCBzKTsKKyAgICBpZiAoc29hcC0+bWltZS5zdGFydCkKKyAgICB7IHN0cmNhdChzb2FwLT50bXBidWYsICJcIjsgc3RhcnQ9XCIiKTsKKyAgICAgIHN0cmNhdChzb2FwLT50bXBidWYsIHNvYXAtPm1pbWUuc3RhcnQpOworICAgIH0KKyAgICBzdHJjYXQoc29hcC0+dG1wYnVmLCAiXCIiKTsKKyAgICBpZiAocikKKyAgICB7IHN0cmNhdChzb2FwLT50bXBidWYsICI7IHN0YXJ0LWluZm89XCIiKTsKKyAgICAgIHN0cmNhdChzb2FwLT50bXBidWYsIHIpOworICAgICAgc3RyY2F0KHNvYXAtPnRtcGJ1ZiwgIlwiIik7CisgICAgfQorICAgIHMgPSBzb2FwLT50bXBidWY7CisgIH0KKyNlbmRpZgorICBpZiAocyAmJiAoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkNvbnRlbnQtVHlwZSIsIHMpKSkKKyAgICByZXR1cm4gZXJyOworI2lmZGVmIFdJVEhfWkxJQgorICBpZiAoc29hcC0+b21vZGUgJiBTT0FQX0VOQ19aTElCKQorICB7CisjaWZkZWYgV0lUSF9HWklQCisgICAgZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkNvbnRlbnQtRW5jb2RpbmciLCAiZ3ppcCIpOworI2Vsc2UKKyAgICBlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQ29udGVudC1FbmNvZGluZyIsICJkZWZsYXRlIik7CisjZW5kaWYKKyAgICBpZiAoZXJyKQorICAgICAgcmV0dXJuIGVycjsKKyAgfQorI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKQorICAgIGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJUcmFuc2Zlci1FbmNvZGluZyIsICJjaHVua2VkIik7CisgIGVsc2UKKyNlbmRpZgorICBpZiAoc29hcC0+c3RhdHVzICE9IFNPQVBfR0VUKQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiJWx1IiwgKHVuc2lnbmVkIGxvbmcpY291bnQpOworICAgIGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJDb250ZW50LUxlbmd0aCIsIHNvYXAtPnRtcGJ1Zik7CisgIH0KKyAgaWYgKGVycikKKyAgICByZXR1cm4gZXJyOworICByZXR1cm4gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkNvbm5lY3Rpb24iLCBzb2FwLT5rZWVwX2FsaXZlID8gImtlZXAtYWxpdmUiIDogImNsb3NlIik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK2h0dHBfZ2V0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZXR1cm4gU09BUF9HRVRfTUVUSE9EOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50CitodHRwX3Bvc3Qoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjb25zdCBjaGFyICpob3N0LCBpbnQgcG9ydCwgY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqYWN0aW9uLCBzaXplX3QgY291bnQpCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnM7CisgIHJlZ2lzdGVyIGludCBlcnI7CisgIGlmIChzb2FwLT5zdGF0dXMgPT0gU09BUF9HRVQpCisgICAgcyA9ICJHRVQiOworICBlbHNlCisgICAgcyA9ICJQT1NUIjsKKyNpZmRlZiBQQUxNCisgIGlmICghZW5kcG9pbnQgfHwgKHN0cm5jbXAoZW5kcG9pbnQsICJodHRwOiIsIDUpICYmIHN0cm5jbXAoZW5kcG9pbnQsICJodHRwczoiLCA2KSAmJiBzdHJuY21wKGVuZHBvaW50LCAiaHR0cGc6IiwgNikpICYmIHN0cm5jbXAoZW5kcG9pbnQsICJfYmVhbToiLCA2KSAmJiBzdHJuY21wKGVuZHBvaW50LCAiX2xvY2FsOiIsIDcpICYmIHN0cm5jbXAoZW5kcG9pbnQsICJfYnRvYmV4OiIsIDgpKQorI2Vsc2UKKyAgaWYgKCFlbmRwb2ludCB8fCAoc3RybmNtcChlbmRwb2ludCwgImh0dHA6IiwgNSkgJiYgc3RybmNtcChlbmRwb2ludCwgImh0dHBzOiIsIDYpICYmIHN0cm5jbXAoZW5kcG9pbnQsICJodHRwZzoiLCA2KSkpCisjZW5kaWYKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgaWYgKHNvYXAtPnByb3h5X2hvc3QgJiYgc3RybmNtcChlbmRwb2ludCwgImh0dHBzOiIsIDYpKQorICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiJXMgJXMgSFRUUC8lcyIsIHMsIGVuZHBvaW50LCBzb2FwLT5odHRwX3ZlcnNpb24pOworICBlbHNlCisgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICIlcyAvJXMgSFRUUC8lcyIsIHMsICgqcGF0aCA9PSAnLycgPyBwYXRoICsgMSA6IHBhdGgpLCBzb2FwLT5odHRwX3ZlcnNpb24pOworICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgTlVMTCkpKQorICAgIHJldHVybiBlcnI7CisgIGlmIChwb3J0ICE9IDgwKQorICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiJXM6JWQiLCBob3N0LCBwb3J0KTsKKyAgZWxzZQorICAgIHN0cmNweShzb2FwLT50bXBidWYsIGhvc3QpOyAKKyAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiSG9zdCIsIHNvYXAtPnRtcGJ1ZikpCisgICB8fCAoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlVzZXItQWdlbnQiLCAiZ1NPQVAvMi43IikpCisgICB8fCAoZXJyID0gc29hcF9wdXRodHRwaGRyKHNvYXAsIFNPQVBfT0ssIGNvdW50KSkpCisgICAgcmV0dXJuIGVycjsKKyNpZmRlZiBXSVRIX1pMSUIKKyNpZmRlZiBXSVRIX0daSVAKKyAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQWNjZXB0LUVuY29kaW5nIiwgImd6aXAsIGRlZmxhdGUiKSkpCisjZWxzZQorICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJBY2NlcHQtRW5jb2RpbmciLCAiZGVmbGF0ZSIpKSkKKyNlbmRpZgorICAgIHJldHVybiBlcnI7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT51c2VyaWQgJiYgc29hcC0+cGFzc3dkICYmIHN0cmxlbihzb2FwLT51c2VyaWQpICsgc3RybGVuKHNvYXAtPnBhc3N3ZCkgPCA3NjEpCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYgKyAyNjIsICIlczolcyIsIHNvYXAtPnVzZXJpZCwgc29hcC0+cGFzc3dkKTsKKyAgICBzdHJjcHkoc29hcC0+dG1wYnVmLCAiQmFzaWMgIik7CisgICAgc29hcF9zMmJhc2U2NChzb2FwLCAoY29uc3QgdW5zaWduZWQgY2hhciopKHNvYXAtPnRtcGJ1ZiArIDI2MiksIHNvYXAtPnRtcGJ1ZiArIDYsIHN0cmxlbihzb2FwLT50bXBidWYgKyAyNjIpKTsKKyAgICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJBdXRob3JpemF0aW9uIiwgc29hcC0+dG1wYnVmKSkpCisgICAgICByZXR1cm4gZXJyOworICB9CisgIGlmIChzb2FwLT5wcm94eV91c2VyaWQgJiYgc29hcC0+cHJveHlfcGFzc3dkICYmIHN0cmxlbihzb2FwLT5wcm94eV91c2VyaWQpICsgc3RybGVuKHNvYXAtPnByb3h5X3Bhc3N3ZCkgPCA3NjEpCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYgKyAyNjIsICIlczolcyIsIHNvYXAtPnByb3h5X3VzZXJpZCwgc29hcC0+cHJveHlfcGFzc3dkKTsKKyAgICBzdHJjcHkoc29hcC0+dG1wYnVmLCAiQmFzaWMgIik7CisgICAgc29hcF9zMmJhc2U2NChzb2FwLCAoY29uc3QgdW5zaWduZWQgY2hhciopKHNvYXAtPnRtcGJ1ZiArIDI2MiksIHNvYXAtPnRtcGJ1ZiArIDYsIHN0cmxlbihzb2FwLT50bXBidWYgKyAyNjIpKTsKKyAgICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJQcm94eS1BdXRob3JpemF0aW9uIiwgc29hcC0+dG1wYnVmKSkpCisgICAgICByZXR1cm4gZXJyOworICB9CisjZW5kaWYKKyNpZmRlZiBXSVRIX0NPT0tJRVMKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgaWYgKHNvYXBfcHV0Y29va2llcyhzb2FwLCBob3N0LCBwYXRoLCBzb2FwLT5zc2wgIT0gTlVMTCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2Vsc2UKKyAgaWYgKHNvYXBfcHV0Y29va2llcyhzb2FwLCBob3N0LCBwYXRoLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjZW5kaWYKKyNlbmRpZgorICBpZiAoYWN0aW9uICYmIHNvYXAtPnZlcnNpb24gPT0gMSkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIlwiJXNcIiIsIGFjdGlvbik7CisgICAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiU09BUEFjdGlvbiIsIHNvYXAtPnRtcGJ1ZikpKQorICAgICAgcmV0dXJuIGVycjsKKyAgfQorICByZXR1cm4gc29hcC0+ZnBvc3RoZHIoc29hcCwgTlVMTCwgTlVMTCk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK2h0dHBfc2VuZF9oZWFkZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMpCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnQ7CisgIGRvCisgIHsgdCA9IHN0cmNocihzLCAnXG4nKTsgLyogZGlzYWxsb3cgXG4gaW4gSFRUUCBoZWFkZXJzICovCisgICAgaWYgKCF0KQorICAgICAgdCA9IHMgKyBzdHJsZW4ocyk7CisgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIHMgPSB0ICsgMTsKKyAgfSB3aGlsZSAoKnQpOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAoraHR0cF9wb3N0X2hlYWRlcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWwpCit7IGlmIChrZXkpCisgIHsgaWYgKGh0dHBfc2VuZF9oZWFkZXIoc29hcCwga2V5KSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAodmFsICYmIChzb2FwX3NlbmRfcmF3KHNvYXAsICI6ICIsIDIpIHx8IGh0dHBfc2VuZF9oZWFkZXIoc29hcCwgdmFsKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgIlxyXG4iLCAyKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAoraHR0cF9yZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0YXR1cywgc2l6ZV90IGNvdW50KQoreyByZWdpc3RlciBpbnQgZXJyOworI2lmZGVmIFdNV19SUE1fSU8KKyAgaWYgKHNvYXAtPnJwbXJlcWlkKQorICAgIGh0dHBPdXRwdXRFbmFibGUoc29hcC0+cnBtcmVxaWQpOworI2VuZGlmCisgIGlmICghc3RhdHVzIHx8IHN0YXR1cyA9PSBTT0FQX0hUTUwgfHwgc3RhdHVzID09IFNPQVBfRklMRSkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk9LIDIwMFxuIikpOworI2lmZGVmIFdNV19SUE1fSU8KKyAgICBpZiAoc29hcC0+cnBtcmVxaWQgfHwgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSB8fCBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKSAvKiBSUE0gYmVoYXZlcyBhcyBpZiBzdGFuZGFsb25lICovCisjZWxzZQorICAgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpIHx8IHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpIC8qIHN0YW5kYWxvbmUgYXBwbGljYXRpb24gKi8KKyNlbmRpZgorICAgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJIVFRQLyVzIDIwMCBPSyIsIHNvYXAtPmh0dHBfdmVyc2lvbik7CisgICAgICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgTlVMTCkpKQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBlbHNlIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlN0YXR1cyIsICIyMDAgT0siKSkpCisgICAgICByZXR1cm4gZXJyOworICB9CisgIGVsc2UgaWYgKHN0YXR1cyA+IDIwMCAmJiBzdGF0dXMgPCA2MDApCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJIVFRQLyVzICVkICVzIiwgc29hcC0+aHR0cF92ZXJzaW9uLCBzdGF0dXMsIGh0dHBfZXJyb3Ioc29hcCwgc3RhdHVzKSk7CisgICAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCBzb2FwLT50bXBidWYsIE5VTEwpKSkKKyAgICAgIHJldHVybiBlcnI7CisjaWZuZGVmIFdJVEhfTEVBTiAKKyAgICBpZiAoc3RhdHVzID09IDQwMSkKKyAgICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiQmFzaWMgcmVhbG09XCIlc1wiIiwgc29hcC0+YXV0aHJlYWxtID8gc29hcC0+YXV0aHJlYWxtIDogImdTT0FQIFdlYiBTZXJ2aWNlIik7CisgICAgICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJXV1ctQXV0aGVudGljYXRlIiwgc29hcC0+dG1wYnVmKSkpCisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGVsc2UgaWYgKChzdGF0dXMgPj0gMzAxICYmIHN0YXR1cyA8PSAzMDMpIHx8IHN0YXR1cyA9PSAzMDcpCisgICAgeyBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJMb2NhdGlvbiIsIHNvYXAtPmVuZHBvaW50KSkpCisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorI2VuZGlmCisgIH0KKyAgZWxzZQorICB7IGNvbnN0IGNoYXIgKnMgPSAqc29hcF9mYXVsdGNvZGUoc29hcCk7CisgICAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMiAmJiAhc3RyY21wKHMsICJTT0FQLUVOVjpTZW5kZXIiKSkKKyAgICAgIHMgPSAiNDAwIEJhZCBSZXF1ZXN0IjsKKyAgICBlbHNlCisgICAgICBzID0gIjUwMCBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IiOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRXJyb3IgJXMgKHN0YXR1cz0lZClcbiIsIHMsIHN0YXR1cykpOworI2lmZGVmIFdNV19SUE1fSU8KKyAgICBpZiAoc29hcC0+cnBtcmVxaWQgfHwgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSB8fCBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKSAvKiBSUE0gYmVoYXZlcyBhcyBpZiBzdGFuZGFsb25lICovCisjZWxzZQorICAgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpIHx8IHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpIC8qIHN0YW5kYWxvbmUgYXBwbGljYXRpb24gKi8KKyNlbmRpZgorICAgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJIVFRQLyVzICVzIiwgc29hcC0+aHR0cF92ZXJzaW9uLCBzKTsKKyAgICAgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgc29hcC0+dG1wYnVmLCBOVUxMKSkpCisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGVsc2UgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiU3RhdHVzIiwgcykpKQorICAgICAgcmV0dXJuIGVycjsKKyAgfQorICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJTZXJ2ZXIiLCAiZ1NPQVAvMi43IikpCisgICB8fCAoZXJyID0gc29hcF9wdXRodHRwaGRyKHNvYXAsIHN0YXR1cywgY291bnQpKSkKKyAgICByZXR1cm4gZXJyOworI2lmZGVmIFdJVEhfQ09PS0lFUworICBpZiAoc29hcF9wdXRzZXRjb29raWVzKHNvYXApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNlbmRpZgorICByZXR1cm4gc29hcC0+ZnBvc3RoZHIoc29hcCwgTlVMTCwgTlVMTCk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0YXR1cykKK3sgcmVnaXN0ZXIgc2l6ZV90IGNvdW50OworICBpZiAoIShzb2FwLT5vbW9kZSAmIChTT0FQX0VOQ19YTUwgfCBTT0FQX0lPX1NUT1JFIC8qIHRoaXMgdGVzdHMgZm9yIGNodW5raW5nIHRvbyAqLykpCisgICAmJiAoc3RhdHVzID09IFNPQVBfSFRNTCB8fCBzdGF0dXMgPT0gU09BUF9GSUxFKSkKKyAgeyBzb2FwLT5vbW9kZSAmPSB+U09BUF9JTzsKKyAgICBzb2FwLT5vbW9kZSB8PSBTT0FQX0lPX1NUT1JFOworICB9CisgIHNvYXAtPnN0YXR1cyA9IHN0YXR1czsKKyAgY291bnQgPSBzb2FwX2NvdW50X2F0dGFjaG1lbnRzKHNvYXApOworICBpZiAoc29hcF9iZWdpbl9zZW5kKHNvYXApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgIT0gU09BUF9JT19TVE9SRSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpKQorICB7IHJlZ2lzdGVyIGludCBuID0gc29hcC0+bW9kZTsKKyAgICBzb2FwLT5tb2RlICY9IH4oU09BUF9JTyB8IFNPQVBfRU5DX1pMSUIpOworICAgIGlmICgobiAmIFNPQVBfSU8pICE9IFNPQVBfSU9fRkxVU0gpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fQlVGRkVSOworICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcmVzcG9uc2Uoc29hcCwgc3RhdHVzLCBjb3VudCkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICAgIGlmICgobiAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgICAgeyBpZiAoc29hcF9mbHVzaChzb2FwKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyNlbmRpZgorICAgIHNvYXAtPm1vZGUgPSBuOworICB9CisjZW5kaWYKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgY29uc3QgY2hhcioKK3NvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKnQpCit7IGlmICgqc29hcC0+dGFnKQorICAgIHNwcmludGYoc29hcC0+bXNnYnVmLCAiVmFsaWRhdGlvbiBjb25zdHJhaW50IHZpb2xhdGlvbjogJXMlcyBpbiBlbGVtZW50IDwlcz4iLCBzLCB0P3Q6U09BUF9TVFJfRU9TLCBzb2FwLT50YWcpOworICBlbHNlCisgICAgc3ByaW50Zihzb2FwLT5tc2didWYsICJWYWxpZGF0aW9uIGNvbnN0cmFpbnQgdmlvbGF0aW9uOiAlcyVzIiwgcywgdD90OlNPQVBfU1RSX0VPUyk7CisgIHJldHVybiBzb2FwLT5tc2didWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgY29uc3QgY2hhciAqKmMgPSBzb2FwX2ZhdWx0Y29kZShzb2FwKTsKKyAgY29uc3QgY2hhciAqKnMgPSBzb2FwX2ZhdWx0c3RyaW5nKHNvYXApOworICBpZiAoISpjICYmICEqcyAmJiBzb2FwLT5mc2V0ZXJyb3IpCisgICAgc29hcC0+ZnNldGVycm9yKHNvYXAsIGMsIHMpOworICBpZiAoISpjKQorICB7IGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgICAgICAqYyA9ICJTT0FQLUVOVjpTZW5kZXIiOworICAgIGVsc2UKKyAgICAgICpjID0gIlNPQVAtRU5WOkNsaWVudCI7CisgIH0KKyAgaWYgKCpzKQorICAgIHJldHVybjsKKyAgc3dpdGNoIChzb2FwLT5lcnJvcikKKyAgeworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBjYXNlIFNPQVBfQ0xJX0ZBVUxUOgorICAgICAgKnMgPSAiQ2xpZW50IGZhdWx0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9TVlJfRkFVTFQ6CisgICAgICAqcyA9ICJTZXJ2ZXIgZmF1bHQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1RBR19NSVNNQVRDSDoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAidGFnIG5hbWUgb3IgbmFtZXNwYWNlIG1pc21hdGNoIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfVFlQRToKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAiZGF0YSB0eXBlIG1pc21hdGNoICIsIHNvYXAtPnR5cGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1NZTlRBWF9FUlJPUjoKKyAgICAgICpzID0gIldlbGwtZm9ybWVkbmVzcyB2aW9sYXRpb24iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX05PX1RBRzoKKyAgICAgICpzID0gIk5vIFhNTCBlbGVtZW50IHRhZyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTVVTVFVOREVSU1RBTkQ6CisgICAgICAqYyA9ICJTT0FQLUVOVjpNdXN0VW5kZXJzdGFuZCI7CisgICAgICBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIlRoZSBkYXRhIGluIGVsZW1lbnQgJyVzJyBtdXN0IGJlIHVuZGVyc3Rvb2QgYnV0IGNhbm5vdCBiZSBoYW5kbGVkIiwgc29hcC0+dGFnKTsKKyAgICAgICpzID0gc29hcC0+bXNnYnVmOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1ZFUlNJT05NSVNNQVRDSDoKKyAgICAgICpjID0gIlNPQVAtRU5WOlZlcnNpb25NaXNtYXRjaCI7CisgICAgICAqcyA9ICJTT0FQIHZlcnNpb24gbWlzbWF0Y2ggb3IgaW52YWxpZCBTT0FQIG1lc3NhZ2UiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0RBVEFFTkNPRElOR1VOS05PV046CisgICAgICAqYyA9ICJTT0FQLUVOVjpEYXRhRW5jb2RpbmdVbmtub3duIjsKKyAgICAgICpzID0gIlVuc3VwcG9ydGVkIFNPQVAgZGF0YSBlbmNvZGluZyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTkFNRVNQQUNFOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJuYW1lc3BhY2UgbWlzbWF0Y2giLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9VU0VSX0VSUk9SOgorICAgICAgKnMgPSAiVXNlciBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfRkFUQUxfRVJST1I6CisgICAgICAqcyA9ICJGYXRhbCBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTk9fTUVUSE9EOgorICAgICAgc3ByaW50Zihzb2FwLT5tc2didWYsICJNZXRob2QgJyVzJyBub3QgaW1wbGVtZW50ZWQ6IG1ldGhvZCBuYW1lIG9yIG5hbWVzcGFjZSBub3QgcmVjb2duaXplZCIsIHNvYXAtPnRhZyk7CisgICAgICAqcyA9IHNvYXAtPm1zZ2J1ZjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9HRVRfTUVUSE9EOgorICAgICAgKnMgPSAiSFRUUCBHRVQgbWV0aG9kIG5vdCBpbXBsZW1lbnRlZCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfRU9NOgorICAgICAgKnMgPSAiT3V0IG9mIG1lbW9yeSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfSU9COgorICAgICAgKnMgPSAiQXJyYXkgaW5kZXggb3V0IG9mIGJvdW5kcyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTlVMTDoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAibmlsIG5vdCBhbGxvd2VkIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfRFVQTElDQVRFX0lEOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJtdWx0aXBsZSBkZWZpbml0aW9ucyBvZiBpZCAiLCBzb2FwLT5pZCk7CisgICAgICBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICAgICAgICAqc29hcF9mYXVsdHN1YmNvZGUoc29hcCkgPSAiU09BUC1FTkM6RHVwbGljYXRlSUQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX01JU1NJTkdfSUQ6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgIm1pc3NpbmcgaWQgZm9yIHJlZiAiLCBzb2FwLT5pZCk7CisgICAgICBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICAgICAgICAqc29hcF9mYXVsdHN1YmNvZGUoc29hcCkgPSAiU09BUC1FTkM6TWlzc2luZ0lEIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9IUkVGOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJpbmNvbXBhdGlibGUgb2JqZWN0IHJlZiAiLCBzb2FwLT5pZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfRkFVTFQ6CisgICAgICBicmVhazsKKyNpZm5kZWYgV0lUSF9OT0lPCisgICAgY2FzZSBTT0FQX1VEUF9FUlJPUjoKKyAgICAgICpzID0gIk1lc3NhZ2UgdG9vIGxhcmdlIGZvciBVRFAgcGFja2V0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9UQ1BfRVJST1I6CisgICAgICAqcyA9IHRjcF9lcnJvcihzb2FwKTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSBTT0FQX0hUVFBfRVJST1I6CisgICAgICAqcyA9ICJIVFRQIGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9TU0xfRVJST1I6CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgICAgICAqcyA9ICJTU0wgZXJyb3IiOworI2Vsc2UKKyAgICAgICpzID0gIk9wZW5TU0wgbm90IGluc3RhbGxlZDogcmVjb21waWxlIHdpdGggLURXSVRIX09QRU5TU0wiOworI2VuZGlmCisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfUExVR0lOX0VSUk9SOgorICAgICAgKnMgPSAiUGx1Z2luIHJlZ2lzdHJ5IGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9ESU1FX0VSUk9SOgorICAgICAgKnMgPSAiRElNRSBmb3JtYXQgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0RJTUVfSFJFRjoKKyAgICAgICpzID0gIkRJTUUgaHJlZiB0byBtaXNzaW5nIGF0dGFjaG1lbnQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0RJTUVfTUlTTUFUQ0g6CisgICAgICAqcyA9ICJESU1FIHZlcnNpb24vdHJhbnNtaXNzaW9uIGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9ESU1FX0VORDoKKyAgICAgICpzID0gIkVuZCBvZiBESU1FIGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9NSU1FX0VSUk9SOgorICAgICAgKnMgPSAiTUlNRSBmb3JtYXQgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX01JTUVfSFJFRjoKKyAgICAgICpzID0gIk1JTUUgaHJlZiB0byBtaXNzaW5nIGF0dGFjaG1lbnQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX01JTUVfRU5EOgorICAgICAgKnMgPSAiRW5kIG9mIE1JTUUgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1pMSUJfRVJST1I6CisjaWZkZWYgV0lUSF9aTElCCisgICAgICBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIlpsaWIvZ3ppcCBlcnJvcjogJyVzJyIsIHNvYXAtPmRfc3RyZWFtLm1zZz9zb2FwLT5kX3N0cmVhbS5tc2c6IiIpOworICAgICAgKnMgPSBzb2FwLT5tc2didWY7CisjZWxzZQorICAgICAgKnMgPSAiWmxpYi9nemlwIG5vdCBpbnN0YWxsZWQgZm9yIChkZSljb21wcmVzc2lvbjogcmVjb21waWxlIHdpdGggLURXSVRIX0daSVAiOworI2VuZGlmCisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfUkVRVUlSRUQ6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgIm1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfUFJPSElCSVRFRDoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAicHJvaGliaXRlZCBhdHRyaWJ1dGUgcHJlc2VudCIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX09DQ1VSUzoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAibWluL21heE9jY3VycyB2aW9sYXRpb24iLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9MRU5HVEg6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgImNvbnRlbnQgbGVuZ3RoIHZpb2xhdGlvbiIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1NUT1A6CisgICAgICAqcyA9ICJTdG9wcGVkOiBubyByZXNwb25zZSBzZW50IjsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSBTT0FQX0VPRjoKKyNpZm5kZWYgV0lUSF9OT0lPCisgICAgICBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIkVuZCBvZiBmaWxlIG9yIG5vIGlucHV0OiAnJXMnIiwgc29hcF9zdHJlcnJvcihzb2FwKSk7CisgICAgICAqcyA9IHNvYXAtPm1zZ2J1ZjsKKyAgICAgIGJyZWFrOworI2Vsc2UKKyAgICAgICpzID0gIkVuZCBvZiBmaWxlIG9yIG5vIGlucHV0IjsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdDoKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICBpZiAoc29hcC0+ZXJyb3IgPiAyMDAgJiYgc29hcC0+ZXJyb3IgPCA2MDApCisgICAgICB7IHNwcmludGYoc29hcC0+bXNnYnVmLCAiSFRUUCBFcnJvcjogJWQgJXMiLCBzb2FwLT5lcnJvciwgaHR0cF9lcnJvcihzb2FwLCBzb2FwLT5lcnJvcikpOworICAgICAgICAqcyA9IHNvYXAtPm1zZ2J1ZjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyNlbmRpZgorI2VuZGlmCisgICAgICB7IHNwcmludGYoc29hcC0+bXNnYnVmLCAiRXJyb3IgJWQiLCBzb2FwLT5lcnJvcik7CisgICAgICAgICpzID0gc29hcC0+bXNnYnVmOworICAgICAgfQorICAgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZW5kX2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgc3RhdHVzID0gc29hcC0+ZXJyb3I7CisgIGludCByID0gMTsKKyAgaWYgKHN0YXR1cyA9PSBTT0FQX1NUT1ApCisgICAgcmV0dXJuIHN0YXR1czsKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNlbmRpbmcgYmFjayBmYXVsdCBzdHJ1Y3QgZm9yIGVycm9yIGNvZGUgJWRcbiIsIHNvYXAtPmVycm9yKSk7CisgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOyAvKiB0byB0ZXJtaW5hdGUgY29ubmVjdGlvbiAqLworICBzb2FwX3NldF9mYXVsdChzb2FwKTsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgIGZkX3NldCByZmQsIHNmZDsKKyAgICB0aW1lb3V0LnR2X3NlYyA9IDA7CisgICAgdGltZW91dC50dl91c2VjID0gMDsKKyAgICBGRF9aRVJPKCZyZmQpOworICAgIEZEX1pFUk8oJnNmZCk7CisgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZyZmQpOworICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmc2ZkKTsKKyAgICByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksICZyZmQsICZzZmQsIE5VTEwsICZ0aW1lb3V0KTsKKyAgICBpZiAociA+IDApCisgICAgeyBpZiAoIUZEX0lTU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZzZmQpCisgICAgICAgfHwgKEZEX0lTU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZyZmQpCisgICAgICAgICYmIHJlY3YoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgc29hcC0+dG1wYnVmLCAxLCBNU0dfUEVFSykgPCAwKSkKKyAgICAgICAgciA9IDA7CisgICAgfQorICB9CisjZW5kaWYKKyNlbmRpZgorICBpZiAoKHN0YXR1cyAhPSBTT0FQX0VPRiB8fCAoIXNvYXAtPnJlY3ZfdGltZW91dCAmJiAhc29hcC0+c2VuZF90aW1lb3V0KSkgJiYgciA+IDApCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICAgIHNvYXBfc2VyaWFsaXplaGVhZGVyKHNvYXApOworICAgIHNvYXBfc2VyaWFsaXplZmF1bHQoc29hcCk7CisgICAgc29hcF9iZWdpbl9jb3VudChzb2FwKTsKKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICAgIHsgc29hcF9lbnZlbG9wZV9iZWdpbl9vdXQoc29hcCk7CisgICAgICBzb2FwX3B1dGhlYWRlcihzb2FwKTsKKyAgICAgIHNvYXBfYm9keV9iZWdpbl9vdXQoc29hcCk7CisgICAgICBzb2FwX3B1dGZhdWx0KHNvYXApOworICAgICAgc29hcF9ib2R5X2VuZF9vdXQoc29hcCk7CisgICAgICBzb2FwX2VudmVsb3BlX2VuZF9vdXQoc29hcCk7CisgICAgfQorICAgIHNvYXBfZW5kX2NvdW50KHNvYXApOworICAgIGlmIChzb2FwX3Jlc3BvbnNlKHNvYXAsIHN0YXR1cykKKyAgICAgfHwgc29hcF9lbnZlbG9wZV9iZWdpbl9vdXQoc29hcCkKKyAgICAgfHwgc29hcF9wdXRoZWFkZXIoc29hcCkKKyAgICAgfHwgc29hcF9ib2R5X2JlZ2luX291dChzb2FwKQorICAgICB8fCBzb2FwX3B1dGZhdWx0KHNvYXApCisgICAgIHx8IHNvYXBfYm9keV9lbmRfb3V0KHNvYXApCisgICAgIHx8IHNvYXBfZW52ZWxvcGVfZW5kX291dChzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICBzb2FwX2VuZF9zZW5kKHNvYXApOworICB9CisgIHNvYXAtPmVycm9yID0gc3RhdHVzOworICByZXR1cm4gc29hcF9jbG9zZXNvY2soc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVjdl9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IHN0YXR1cyA9IHNvYXAtPmVycm9yOworICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVjZWl2aW5nIFNPQVAgRmF1bHRcbiIpKTsKKyAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICBpZiAoc29hcF9nZXRmYXVsdChzb2FwKSkKKyAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiRXJyb3I6IHNvYXBfZ2V0X3NvYXBmYXVsdCgpIGZhaWxlZC4gSXMgdGhpcyBhIFNPQVAgbWVzc2FnZSBhdCBhbGw/XG4iKSk7CisgICAgKnNvYXBfZmF1bHRjb2RlKHNvYXApID0gKHNvYXAtPnZlcnNpb24gPT0gMiA/ICJTT0FQLUVOVjpTZW5kZXIiIDogIlNPQVAtRU5WOkNsaWVudCIpOworICAgIHNvYXAtPmVycm9yID0gc3RhdHVzOworICAgIHNvYXBfc2V0X2ZhdWx0KHNvYXApOworICB9CisgIGVsc2UKKyAgeyByZWdpc3RlciBjb25zdCBjaGFyICpzID0gKnNvYXBfZmF1bHRjb2RlKHNvYXApOworICAgIGlmICghc29hcF9tYXRjaF90YWcoc29hcCwgcywgIlNPQVAtRU5WOlNlcnZlciIpIHx8ICFzb2FwX21hdGNoX3RhZyhzb2FwLCBzLCAiU09BUC1FTlY6UmVjZWl2ZXIiKSkKKyAgICAgIHN0YXR1cyA9IFNPQVBfU1ZSX0ZBVUxUOyAKKyAgICBlbHNlIGlmICghc29hcF9tYXRjaF90YWcoc29hcCwgcywgIlNPQVAtRU5WOkNsaWVudCIpIHx8ICFzb2FwX21hdGNoX3RhZyhzb2FwLCBzLCAiU09BUC1FTlY6U2VuZGVyIikpCisgICAgICBzdGF0dXMgPSBTT0FQX0NMSV9GQVVMVDsKKyAgICBlbHNlIGlmICghc29hcF9tYXRjaF90YWcoc29hcCwgcywgIlNPQVAtRU5WOk11c3RVbmRlcnN0YW5kIikpCisgICAgICBzdGF0dXMgPSBTT0FQX01VU1RVTkRFUlNUQU5EOworICAgIGVsc2UgaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCBzLCAiU09BUC1FTlY6VmVyc2lvbk1pc21hdGNoIikpCisgICAgICBzdGF0dXMgPSBTT0FQX1ZFUlNJT05NSVNNQVRDSDsKKyAgICBlbHNlCisgICAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiRmF1bHQgY29kZSAlc1xuIiwgcykpOworICAgICAgc3RhdHVzID0gU09BUF9GQVVMVDsKKyAgICB9CisgICAgaWYgKHNvYXBfYm9keV9lbmRfaW4oc29hcCkKKyAgICAgfHwgc29hcF9lbnZlbG9wZV9lbmRfaW4oc29hcCkKKyAgICAgfHwgc29hcF9lbmRfcmVjdihzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICBzb2FwLT5lcnJvciA9IHN0YXR1czsKKyAgfQorICByZXR1cm4gc29hcF9jbG9zZXNvY2soc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2VuZF9lbXB0eV9yZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+Y291bnQgPSAwOworICBpZiAoc29hcF9yZXNwb25zZShzb2FwLCBTT0FQX09LKSB8fCBzb2FwX2VuZF9zZW5kKHNvYXApKQorICAgIHJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWN2X2VtcHR5X3Jlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcF9iZWdpbl9yZWN2KHNvYXApIHx8IHNvYXBfZW5kX3JlY3Yoc29hcCkpCisgICAgcmV0dXJuIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBjb25zdCBjaGFyKgorc29hcF9zdHJlcnJvcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IGVyciA9IHNvYXAtPmVycm51bTsKKyAgaWYgKGVycikKKyAgeworI2lmbmRlZiBXSU4zMgorICAgIHJldHVybiBzdHJlcnJvcihlcnIpOworI2Vsc2UKKyAgICBGb3JtYXRNZXNzYWdlKEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNfEZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTLCBOVUxMLCBlcnIsIDAsIChMUFRTVFIpJnNvYXAtPmVycm9yc3RyLCBzaXplb2Yoc29hcC0+ZXJyb3JzdHIpLCBOVUxMKTsKKyAgICByZXR1cm4gc29hcC0+ZXJyb3JzdHI7CisjZW5kaWYKKyAgfQorICByZXR1cm4gIk9wZXJhdGlvbiBpbnRlcnJ1cHRlZCBvciB0aW1lZCBvdXQiOworfQorI2VuZGlmCisjZW5kaWYgCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorc3RhdGljIGludAorc29hcF9zZXRfZXJyb3Ioc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZhdWx0Y29kZSwgY29uc3QgY2hhciAqZmF1bHRzdWJjb2RlLCBjb25zdCBjaGFyICpmYXVsdHN0cmluZywgY29uc3QgY2hhciAqZmF1bHRkZXRhaWwsIGludCBzb2FwZXJyb3IpCit7ICpzb2FwX2ZhdWx0Y29kZShzb2FwKSA9IGZhdWx0Y29kZTsKKyAgaWYgKGZhdWx0c3ViY29kZSkKKyAgICAqc29hcF9mYXVsdHN1YmNvZGUoc29hcCkgPSBmYXVsdHN1YmNvZGU7CisgICpzb2FwX2ZhdWx0c3RyaW5nKHNvYXApID0gZmF1bHRzdHJpbmc7CisgIGlmIChmYXVsdGRldGFpbCAmJiAqZmF1bHRkZXRhaWwpCisgIHsgcmVnaXN0ZXIgY29uc3QgY2hhciAqKnMgPSBzb2FwX2ZhdWx0ZGV0YWlsKHNvYXApOworICAgIGlmIChzKQorICAgICAgKnMgPSBmYXVsdGRldGFpbDsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3IgPSBzb2FwZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X3NlbmRlcl9lcnJvcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRzdHJpbmcsIGNvbnN0IGNoYXIgKmZhdWx0ZGV0YWlsLCBpbnQgc29hcGVycm9yKQoreyByZXR1cm4gc29hcF9zZXRfZXJyb3Ioc29hcCwgc29hcC0+dmVyc2lvbiA9PSAyID8gIlNPQVAtRU5WOlNlbmRlciIgOiAiU09BUC1FTlY6Q2xpZW50IiwgTlVMTCwgZmF1bHRzdHJpbmcsIGZhdWx0ZGV0YWlsLCBzb2FwZXJyb3IpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRzdHJpbmcsIGNvbnN0IGNoYXIgKmZhdWx0ZGV0YWlsLCBpbnQgc29hcGVycm9yKQoreyByZXR1cm4gc29hcF9zZXRfZXJyb3Ioc29hcCwgc29hcC0+dmVyc2lvbiA9PSAyID8gIlNPQVAtRU5WOlJlY2VpdmVyIiA6ICJTT0FQLUVOVjpTZXJ2ZXIiLCBOVUxMLCBmYXVsdHN0cmluZywgZmF1bHRkZXRhaWwsIHNvYXBlcnJvcik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitzdGF0aWMgaW50Citzb2FwX2NvcHlfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZhdWx0Y29kZSwgY29uc3QgY2hhciAqZmF1bHRzdWJjb2RlLCBjb25zdCBjaGFyICpmYXVsdHN0cmluZywgY29uc3QgY2hhciAqZmF1bHRkZXRhaWwpCit7IGNoYXIgKnIgPSBOVUxMLCAqcyA9IE5VTEwsICp0ID0gTlVMTDsKKyAgaWYgKGZhdWx0c3ViY29kZSkKKyAgICByID0gc29hcF9zdHJkdXAoc29hcCwgZmF1bHRzdWJjb2RlKTsKKyAgaWYgKGZhdWx0c3RyaW5nKQorICAgIHMgPSBzb2FwX3N0cmR1cChzb2FwLCBmYXVsdHN0cmluZyk7CisgIGlmIChmYXVsdGRldGFpbCkKKyAgICB0ID0gc29hcF9zdHJkdXAoc29hcCwgZmF1bHRkZXRhaWwpOworICByZXR1cm4gc29hcF9zZXRfZXJyb3Ioc29hcCwgZmF1bHRjb2RlLCByLCBzLCB0LCBTT0FQX0ZBVUxUKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZW5kZXJfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCkKK3sgcmV0dXJuIHNvYXBfc2VuZGVyX2ZhdWx0X3N1YmNvZGUoc29hcCwgTlVMTCwgZmF1bHRzdHJpbmcsIGZhdWx0ZGV0YWlsKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZW5kZXJfZmF1bHRfc3ViY29kZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRzdWJjb2RlLCBjb25zdCBjaGFyICpmYXVsdHN0cmluZywgY29uc3QgY2hhciAqZmF1bHRkZXRhaWwpCit7IHJldHVybiBzb2FwX2NvcHlfZmF1bHQoc29hcCwgc29hcC0+dmVyc2lvbiA9PSAyID8gIlNPQVAtRU5WOlNlbmRlciIgOiAiU09BUC1FTlY6Q2xpZW50IiwgZmF1bHRzdWJjb2RlLCBmYXVsdHN0cmluZywgZmF1bHRkZXRhaWwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlY2VpdmVyX2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdHN0cmluZywgY29uc3QgY2hhciAqZmF1bHRkZXRhaWwpCit7IHJldHVybiBzb2FwX3JlY2VpdmVyX2ZhdWx0X3N1YmNvZGUoc29hcCwgTlVMTCwgZmF1bHRzdHJpbmcsIGZhdWx0ZGV0YWlsKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWNlaXZlcl9mYXVsdF9zdWJjb2RlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdHN1YmNvZGUsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCkKK3sgcmV0dXJuIHNvYXBfY29weV9mYXVsdChzb2FwLCBzb2FwLT52ZXJzaW9uID09IDIgPyAiU09BUC1FTlY6UmVjZWl2ZXIiIDogIlNPQVAtRU5WOlNlcnZlciIsIGZhdWx0c3ViY29kZSwgZmF1bHRzdHJpbmcsIGZhdWx0ZGV0YWlsKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKKyNpZm5kZWYgV0lUSF9OT1NURExJQgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9wcmludF9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCwgRklMRSAqZmQpCit7IGlmIChzb2FwX2NoZWNrX3N0YXRlKHNvYXApKQorICAgIGZwcmludGYoZmQsICJFcnJvcjogc29hcCBzdHJ1Y3Qgbm90IGluaXRpYWxpemVkXG4iKTsKKyAgZWxzZSBpZiAoc29hcC0+ZXJyb3IpCisgIHsgY29uc3QgY2hhciAqYywgKnYgPSBOVUxMLCAqcywgKipkOworICAgIGQgPSBzb2FwX2ZhdWx0Y29kZShzb2FwKTsKKyAgICBpZiAoISpkKQorICAgICAgc29hcF9zZXRfZmF1bHQoc29hcCk7CisgICAgYyA9ICpkOworICAgIGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgICAgICB2ID0gKnNvYXBfZmF1bHRzdWJjb2RlKHNvYXApOworICAgIHMgPSAqc29hcF9mYXVsdHN0cmluZyhzb2FwKTsKKyAgICBkID0gc29hcF9mYXVsdGRldGFpbChzb2FwKTsKKyAgICBmcHJpbnRmKGZkLCAiJXMlZCBmYXVsdDogJXMgWyVzXVxuXCIlc1wiXG5EZXRhaWw6ICVzXG4iLCBzb2FwLT52ZXJzaW9uID8gIlNPQVAgMS4iIDogIkVycm9yICIsIHNvYXAtPnZlcnNpb24gPyAoaW50KXNvYXAtPnZlcnNpb24gOiBzb2FwLT5lcnJvciwgYywgdiA/IHYgOiAibm8gc3ViY29kZSIsIHMgPyBzIDogIltubyByZWFzb25dIiwgZCAmJiAqZCA/ICpkIDogIltubyBkZXRhaWxdIik7CisgIH0KK30KKyNlbmRpZgorI2VuZGlmCisgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKKyNpZm5kZWYgV0lUSF9OT1NURExJQgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9wcmludF9mYXVsdF9sb2NhdGlvbihzdHJ1Y3Qgc29hcCAqc29hcCwgRklMRSAqZmQpCit7IAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaW50IGksIGosIGMxLCBjMjsKKyAgaWYgKHNvYXAtPmVycm9yICYmIHNvYXAtPmJ1ZmxlbiA+IDApCisgIHsgaSA9IChpbnQpc29hcC0+YnVmaWR4IC0gMTsKKyAgICBpZiAoaSA8PSAwKQorICAgICAgaSA9IDA7CisgICAgYzEgPSBzb2FwLT5idWZbaV07CisgICAgc29hcC0+YnVmW2ldID0gJ1wwJzsKKyAgICBpZiAoKGludClzb2FwLT5idWZsZW4gPj0gaSArIDEwMjQpCisgICAgICBqID0gaSArIDEwMjM7CisgICAgZWxzZQorICAgICAgaiA9IChpbnQpc29hcC0+YnVmbGVuIC0gMTsKKyAgICBjMiA9IHNvYXAtPmJ1ZltqXTsKKyAgICBzb2FwLT5idWZbal0gPSAnXDAnOworICAgIGZwcmludGYoZmQsICIlcyVjXG4qKiBIRVJFICoqXG4iLCBzb2FwLT5idWYsIGMxKTsKKyAgICBpZiAoc29hcC0+YnVmaWR4IDwgc29hcC0+YnVmbGVuKQorICAgICAgZnByaW50ZihmZCwgIiVzXG4iLCBzb2FwLT5idWYgKyBzb2FwLT5idWZpZHgpOworICAgIHNvYXAtPmJ1ZltpXSA9IGMxOworICAgIHNvYXAtPmJ1ZltqXSA9IGMyOworICB9CisjZW5kaWYKK30KKyNlbmRpZgorI2VuZGlmCisgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWdpc3Rlcl9wbHVnaW5fYXJnKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgKCpmY3JlYXRlKShzdHJ1Y3Qgc29hcCosIHN0cnVjdCBzb2FwX3BsdWdpbiosIHZvaWQqKSwgdm9pZCAqYXJnKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnA7CisgIHJlZ2lzdGVyIGludCByOworICBpZiAoIShwID0gKHN0cnVjdCBzb2FwX3BsdWdpbiopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX3BsdWdpbikpKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgcC0+aWQgPSBOVUxMOworICBwLT5kYXRhID0gTlVMTDsKKyAgcC0+ZmNvcHkgPSBOVUxMOworICBwLT5mZGVsZXRlID0gTlVMTDsKKyAgciA9IGZjcmVhdGUoc29hcCwgcCwgYXJnKTsKKyAgaWYgKCFyICYmIHAtPmZkZWxldGUpCisgIHsgcC0+bmV4dCA9IHNvYXAtPnBsdWdpbnM7CisgICAgc29hcC0+cGx1Z2lucyA9IHA7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWdpc3RlcmVkICclcycgcGx1Z2luXG4iLCBwLT5pZCkpOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IHJlZ2lzdGVyIHBsdWdpbiAnJXMnOiBwbHVnaW4gcmV0dXJuZWQgZXJyb3IgJWQgKG9yIGZkZWxldGUgY2FsbGJhY2sgbm90IHNldClcbiIsIHAtPmlkP3AtPmlkOiI/IiwgcikpOworICBTT0FQX0ZSRUUoc29hcCwgcCk7CisgIHJldHVybiByOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQgKgorZnBsdWdpbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BsdWdpbiAqcDsKKyAgZm9yIChwID0gc29hcC0+cGx1Z2luczsgcDsgcCA9IHAtPm5leHQpCisgICAgaWYgKHAtPmlkID09IGlkIHx8ICFzdHJjbXAocC0+aWQsIGlkKSkKKyAgICAgIHJldHVybiBwLT5kYXRhOworICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQgKgorU09BUF9GTUFDMgorc29hcF9sb29rdXBfcGx1Z2luKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCkKK3sgcmV0dXJuIHNvYXAtPmZwbHVnaW4oc29hcCwgaWQpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpZm5kZWYgV0lUSF9MRUFOCitzb2FwOjpzb2FwKCkKK3sgc29hcF9pbml0KHRoaXMpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglDKysgc29hcCBzdHJ1Y3QgbWV0aG9kcworICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpZm5kZWYgV0lUSF9MRUFOCitzb2FwOjpzb2FwKHNvYXBfbW9kZSBtb2RlKQoreyBzb2FwX2luaXQxKHRoaXMsIG1vZGUpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworI2lmbmRlZiBXSVRIX0xFQU4KK3NvYXA6OnNvYXAoc29hcF9tb2RlIGltb2RlLCBzb2FwX21vZGUgb21vZGUpCit7IHNvYXBfaW5pdDIodGhpcywgaW1vZGUsIG9tb2RlKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpZm5kZWYgV0lUSF9MRUFOCitzb2FwOjpzb2FwKHN0cnVjdCBzb2FwJiBzb2FwKQoreyBzb2FwX2NvcHlfY29udGV4dCh0aGlzLCAmc29hcCk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIF9fY3BsdXNwbHVzCisjaWZuZGVmIFdJVEhfTEVBTgorc29hcDo6fnNvYXAoKQoreyBzb2FwX2Rlc3Ryb3kodGhpcyk7CisgIHNvYXBfZW5kKHRoaXMpOworICBzb2FwX2RvbmUodGhpcyk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL3N0ZHNvYXAyLmggYi9zYW1wbGVzL3F1b3RlX01BQ19Qcm9qQnVpbGQvc3Rkc29hcDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjZjNzRkCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9xdW90ZV9NQUNfUHJvakJ1aWxkL3N0ZHNvYXAyLmgKQEAgLTAsMCArMSwyMDkzIEBACisvKgorCitzdGRzb2FwMi5oIDIuNy42ZQorCitnU09BUCBydW50aW1lCisKK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgcGFydCBvZiB0aGUgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXM6CitHUEwsIHRoZSBnU09BUCBwdWJsaWMgbGljZW5zZSwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NvbnRyaWJ1dG9yczoKKworV2luZCBSaXZlciBTeXN0ZW1zLCBJbmMuLCBmb3IgdGhlIGZvbGxvd2luZyBhZGRpdGlvbnMgKG1hcmtlZCBXUlsuLi5dKToKKyAgLSB2eFdvcmtzIGNvbXBhdGlibGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBwdWJsaWMgbGljZW5zZS4KKworVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZ1NPQVAgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjMKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcGxpY2Vuc2UuaHRtbAorU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKK1dJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQorZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFJvYmVydCBBLiB2YW4gRW5nZWxlbi4KK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZkZWYgV0lUSF9TT0FQREVGU19ICisjIGluY2x1ZGUgInNvYXBkZWZzLmgiCQkvKiBpbmNsdWRlIHVzZXItZGVmaW5lZCBzdHVmZiAqLworI2VuZGlmCisKKyNpZm5kZWYgX1RIUkVBRF9TQUZFCisjIGRlZmluZSBfVEhSRUFEX1NBRkUKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TRVJWRVIKKyMgaWZuZGVmIF9SRUVOVFJBTlQKKyMgIGRlZmluZSBfUkVFTlRSQU5UCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBTT0FQX0ZNQUMxCS8qIHN0ZHNvYXAyLmggZGVjbGFyYXRpb24gbWFjcm8gKi8KKyMgZGVmaW5lIFNPQVBfRk1BQzEKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfRk1BQzIJLyogc3Rkc29hcDIuaCBkZWNsYXJhdGlvbiBtYWNybyAqLworIyBkZWZpbmUgU09BUF9GTUFDMgorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9GTUFDMwkvKiAoZGUpc2VyaWFsaXplciBkZWNsYXJhdGlvbiBtYWNybyAqLworIyBkZWZpbmUgU09BUF9GTUFDMworI2VuZGlmCisKKyNpZm5kZWYgU09BUF9GTUFDM1MJLyogc3RyaW5nIGNvbnZlcnRlciBmb3IgKGRlKXNlcmlhbGl6ZXIgZGVjbGFyYXRpb24gbWFjcm8gKi8KKyMgZGVmaW5lIFNPQVBfRk1BQzNTIFNPQVBfRk1BQzMKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfRk1BQzQJLyogKGRlKXNlcmlhbGl6ZXIgZGVjbGFyYXRpb24gbWFjcm8gKi8KKyMgZGVmaW5lIFNPQVBfRk1BQzQKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfRk1BQzRTCS8qIHN0cmluZyBjb252ZXJ0ZXIgZm9yIChkZSlzZXJpYWxpemVyIGRlY2xhcmF0aW9uIG1hY3JvICovCisjIGRlZmluZSBTT0FQX0ZNQUM0UyBTT0FQX0ZNQUM0CisjZW5kaWYKKworI2lmbmRlZiBTT0FQX0ZNQUM1CS8qIHN0dWIvc2tlbGV0b24gZGVjbGFyYXRpb24gbWFjcm8gKi8KKyMgZGVmaW5lIFNPQVBfRk1BQzUKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfRk1BQzYJLyogc3R1Yi9za2VsZXRvbiBkZWNsYXJhdGlvbiBtYWNybyAqLworIyBkZWZpbmUgU09BUF9GTUFDNgorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9DTUFDCS8qIGNsYXNzIGRlY2xhcmF0aW9uIG1hY3JvICovCisjIGRlZmluZSBTT0FQX0NNQUMKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfTk1BQwkvKiBuYW1lc3BhY2UgdGFibGUgZGVjbGFyYXRpb24gbWFjcm8gKi8KKyMgZGVmaW5lIFNPQVBfTk1BQworI2VuZGlmCisKKyNpZm5kZWYgU09BUF9TT1VSQ0VfU1RBTVAKKyMgZGVmaW5lIFNPQVBfU09VUkNFX1NUQU1QKHN0cikKKyNlbmRpZgorCisvKiBnU09BUCAyLjcuNCBhbmQgaGlnaGVyOiBmYXN0IGxvb2stYXNpZGUgYnVmZmVyaW5nIGlzIHN0YWJsZSAqLworI2lmbmRlZiBXSVRIX0ZBU1QKKyMgZGVmaW5lIFdJVEhfRkFTVAorI2VuZGlmCisKKyNpZmRlZiBXSVRIX0xFQU5FUgorIyBpZm5kZWYgV0lUSF9MRUFOCisjICBkZWZpbmUgV0lUSF9MRUFOCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIFdJVEhfTEVBTgorIyBpZmRlZiBXSVRIX0NPT0tJRVMKKyMgIGVycm9yICJDYW5ub3QgYnVpbGQgV0lUSF9MRUFOIGNvZGUgV0lUSF9DT09LSUVTIGVuYWJsZWQiCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBTVERTT0FQX0gKKyNkZWZpbmUgU1REU09BUF9ICisKKyNpZiBkZWZpbmVkKF9fdnh3b3JrcykgfHwgZGVmaW5lZChfX1ZYV09SS1NfXykKKyMgZGVmaW5lIFZYV09SS1MKKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyCisjIGlmbmRlZiBXSU4zMgorIyAgZGVmaW5lIFdJTjMyCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIFVOREVSX0NFCisjIGlmbmRlZiBXSU4zMgorIyAgZGVmaW5lIFdJTjMyCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fQk9STEFORENfXworIyBpZmRlZiBfX1dJTjMyX18KKyMgIGlmbmRlZiBXSU4zMgorIyAgIGRlZmluZSBXSU4zMgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19DWUdXSU5fXworIyBpZm5kZWYgQ1lHV0lOCisjICBkZWZpbmUgQ1lHV0lOCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fU1lNQklBTjMyX18gCisjIGRlZmluZSBTWU1CSUFOCisjIHVuZGVmIFdJTjMyCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19wYWxtb3NfXykgfHwgZGVmaW5lZChQQUxNX0dDQykgfHwgZGVmaW5lZChfX1BBTE1PU19UUkFQU19fKQorIyBpZm5kZWYgUEFMTQorIyAgZGVmaW5lIFBBTE0KKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2hwdXgpCisjIGlmbmRlZiBIUF9VWAorIyAgZGVmaW5lIEhQX1VYCisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19hbHBoYSkgJiYgIWRlZmluZWQoX19WTVMpCisjIGlmbmRlZiBUUlU2NAorIyAgZGVmaW5lIFRSVTY0IAorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX01WU19fCisjIGlmbmRlZiBPUzM5MAorIyAgZGVmaW5lIE9TMzkwCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSAiY29uZmlnLmgiCisjIGlmZGVmIFdJVEhfT1BFTlNTTAorIyAgaWZuZGVmIEhBVkVfT1BFTlNTTF9TU0xfSAorIyAgIHVuZGVmIFdJVEhfT1BFTlNTTAorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbHNlCisjIGlmIGRlZmluZWQoVU5ERVJfQ0UpCisjICBkZWZpbmUgV0lUSF9MRUFOCisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgZWxpZiBkZWZpbmVkKFdJTjMyKQorIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfU1lTX1RJTUVCX0gKKyMgIGRlZmluZSBIQVZFX0ZUSU1FCisjICBkZWZpbmUgSEFWRV9XQ1RPTUIKKyMgIGRlZmluZSBIQVZFX01CVE9XQworIyAgZGVmaW5lIFNPQVBfTE9OR19GT1JNQVQgIiVJNjRkIgorIyAgZGVmaW5lIFNPQVBfVUxPTkdfRk9STUFUICIlSTY0dSIKKyMgZWxpZiBkZWZpbmVkKENZR1dJTikKKyMgIGRlZmluZSBIQVZFX1NUUlJDSFIKKyMgIGRlZmluZSBIQVZFX1NUUlRPRAorIyAgZGVmaW5lIEhBVkVfU1NDQU5GCisjICBkZWZpbmUgSEFWRV9TVFJUT0wKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUwKKyMgIGRlZmluZSBIQVZFX1NZU19USU1FQl9ICisjICBkZWZpbmUgSEFWRV9GVElNRQorIyAgZGVmaW5lIEhBVkVfUkFORF9SCisjICBkZWZpbmUgSEFWRV9HTVRJTUVfUgorIyAgZGVmaW5lIEhBVkVfTE9DQUxUSU1FX1IKKyMgIGRlZmluZSBIQVZFX1dDVE9NQgorIyAgZGVmaW5lIEhBVkVfTUJUT1dDCisjIGVsaWYgZGVmaW5lZChfX0FQUExFX18pCisjICBkZWZpbmUgSEFWRV9TVFJSQ0hSCisjICBkZWZpbmUgSEFWRV9TVFJUT0QKKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyAgZGVmaW5lIEhBVkVfU1RSVE9MCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMCisjICBkZWZpbmUgSEFWRV9SQU5EX1IKKyMgIGRlZmluZSBIQVZFX0dNVElNRV9SCisjICBkZWZpbmUgSEFWRV9MT0NBTFRJTUVfUgorIyAgZGVmaW5lIEhBVkVfVElNRUdNCisjICBkZWZpbmUgSEFWRV9XQ1RPTUIKKyMgIGRlZmluZSBIQVZFX01CVE9XQworIyBlbGlmIGRlZmluZWQoX0FJWFZFUlNJT05fNDMxKQorIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfU1lTX1RJTUVCX0gKKyMgIGRlZmluZSBIQVZFX0ZUSU1FCisjICBkZWZpbmUgSEFWRV9SQU5EX1IKKyMgIGRlZmluZSBIQVZFX0dNVElNRV9SCisjICBkZWZpbmUgSEFWRV9MT0NBTFRJTUVfUgorIyAgZGVmaW5lIEhBVkVfV0NUT01CCisjICBkZWZpbmUgSEFWRV9NQlRPV0MKKyMgZWxpZiBkZWZpbmVkKEhQX1VYKQorIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfU1lTX1RJTUVCX0gKKyMgIGRlZmluZSBIQVZFX0ZUSU1FCisjICBkZWZpbmUgSEFWRV9SQU5EX1IKKyMgIGRlZmluZSBIQVZFX0dNVElNRV9SCisjICBkZWZpbmUgSEFWRV9MT0NBTFRJTUVfUgorIyAgZGVmaW5lIEhBVkVfV0NUT01CCisjICBkZWZpbmUgSEFWRV9NQlRPV0MKKyMgZWxpZiBkZWZpbmVkKEZSRUVCU0QpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCisjICBkZWZpbmUgSEFWRV9TVFJSQ0hSCisjICBkZWZpbmUgSEFWRV9TVFJUT0QKKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyAgZGVmaW5lIEhBVkVfU1RSVE9MCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMCisjICBkZWZpbmUgSEFWRV9TVFJUT0xMCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMTAorIyAgZGVmaW5lIEhBVkVfR0VUVElNRU9GREFZCisjICBkZWZpbmUgSEFWRV9SQU5EX1IKKyMgIGRlZmluZSBIQVZFX0dNVElNRV9SCisjICBkZWZpbmUgSEFWRV9MT0NBTFRJTUVfUgorIyAgZGVmaW5lIEhBVkVfV0NUT01CCisjICBkZWZpbmUgSEFWRV9NQlRPV0MKKyMgIGRlZmluZSBTT0FQX0xPTkdfRk9STUFUICIlcWQiCisjICBkZWZpbmUgU09BUF9VTE9OR19GT1JNQVQgIiVxdSIKKyMgZWxpZiBkZWZpbmVkKF9fVk1TKQorIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfU1lTX1RJTUVCX0gKKyMgIGRlZmluZSBIQVZFX0ZUSU1FCisjICBkZWZpbmUgSEFWRV9SQU5EX1IKKyMgIGRlZmluZSBIQVZFX0dNVElNRV9SCisjICBkZWZpbmUgSEFWRV9MT0NBTFRJTUVfUgorIyAgZGVmaW5lIEhBVkVfV0NUT01CCisjICBkZWZpbmUgSEFWRV9NQlRPV0MKKyMgZWxpZiBkZWZpbmVkKF9fR0xJQkNfXykgfHwgZGVmaW5lZChfX0dOVV9fKQorIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9MTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTEwKKyMgIGRlZmluZSBIQVZFX1NZU19USU1FQl9ICisjICBkZWZpbmUgSEFWRV9GVElNRQorIyAgZGVmaW5lIEhBVkVfUkFORF9SCisjICBkZWZpbmUgSEFWRV9HTVRJTUVfUgorIyAgZGVmaW5lIEhBVkVfTE9DQUxUSU1FX1IKKyMgIGRlZmluZSBIQVZFX1RJTUVHTQorIyAgZGVmaW5lIEhBVkVfV0NUT01CCisjICBkZWZpbmUgSEFWRV9NQlRPV0MKKyMgIGRlZmluZSBIQVZFX0lTTkFOCisjIGVsaWYgZGVmaW5lZChUUlU2NCkKKyMgIGRlZmluZSBIQVZFX1NUUlJDSFIKKyMgIGRlZmluZSBIQVZFX1NUUlRPRAorIyAgZGVmaW5lIEhBVkVfU1NDQU5GCisjICBkZWZpbmUgSEFWRV9TVFJUT0wKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUwKKyMgIGRlZmluZSBIQVZFX1NUUlRPTEwKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUxMCisjICBkZWZpbmUgSEFWRV9HRVRUSU1FT0ZEQVkKKyMgIGRlZmluZSBIQVZFX1NZU19USU1FQl9ICisjICBkZWZpbmUgSEFWRV9SQU5EX1IKKyMgIGRlZmluZSBIQVZFX0dNVElNRV9SCisjICBkZWZpbmUgSEFWRV9MT0NBTFRJTUVfUgorIyAgZGVmaW5lIF9fVVNFX1NURF9JT1NUUkVBTQorIyAgZGVmaW5lIEhBVkVfV0NUT01CCisjICBkZWZpbmUgSEFWRV9NQlRPV0MKKyMgIGRlZmluZSBTT0FQX0xPTkdfRk9STUFUICIlbGQiCisjICBkZWZpbmUgU09BUF9VTE9OR19GT1JNQVQgIiVsdSIKKyMgZWxpZiBkZWZpbmVkKE1BQ19DQVJCT04pCisjICBkZWZpbmUgV0lUSF9OT0lPCisjICBkZWZpbmUgSEFWRV9TVFJSQ0hSCisjICBkZWZpbmUgSEFWRV9TVFJUT0QKKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyAgZGVmaW5lIEhBVkVfU1RSVE9MCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMCisjICBkZWZpbmUgSEFWRV9GVElNRQorIyAgZGVmaW5lIEhBVkVfUkFORF9SCisjICBkZWZpbmUgSEFWRV9HRVRIT1NUQllOQU1FX1IKKyMgIGRlZmluZSBIQVZFX0dNVElNRV9SCisjICBkZWZpbmUgSEFWRV9MT0NBTFRJTUVfUgorIyAgZGVmaW5lIEhBVkVfV0NUT01CCisjICBkZWZpbmUgSEFWRV9NQlRPV0MKKyMgZWxpZiBkZWZpbmVkKFBBTE0pCisjICBkZWZpbmUgV0lUSF9MRUFOCisjICBkZWZpbmUgSEFWRV9TVFJUT0QgICAvKiBzdHJ0b2QoKSBpcyBkZWZpbmVkIGluIHBhbG1GdW5jdGlvbnMuaCAqLworIyAgaW5jbHVkZSA8c3RkbGliLmg+CS8qIE5lZWRzIHRvIGJlIGluY2x1ZGVkIGJlZm9yZSB1bml4IGhlYWRlcnMgKi8KKyMgIGluY2x1ZGUgPHN5c190eXBlcy5oPgorIyAgZGVmaW5lIElHTk9SRV9TVERJT19TVFVCUworIyAgaW5jbHVkZSA8U3RkSU9QYWxtLmg+CisjICBkZWZpbmUgT19OT05CTE9DSyBGTk9OQklPCisjICBpbmNsdWRlIDxzeXNfc29ja2V0Lmg+CisjICBpbmNsdWRlICJwYWxtRnVuY3Rpb25zLmgiCisjIGVsaWYgZGVmaW5lZChTWU1CSUFOKQorIyAgZGVmaW5lIFdJVEhfTEVBTgorIyAgZGVmaW5lIFdJVEhfTk9OQU1FU1BBQ0VTCisjICBkZWZpbmUgSEFWRV9TVFJUT0QJLyogdXNlIFNUUlRPRCBzaW5jZSBzc2NhbmYgZG9lc24ndCBzZWVtIHRvIHdvcmsgKi8KKyMgIGluY2x1ZGUgPGUzMmRlZi5oPgorIyAgaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjIGVsaWYgZGVmaW5lZChWWFdPUktTKQorIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfUEdNVElNRV9SCisjICBkZWZpbmUgSEFWRV9QTE9DQUxUSU1FX1IKKyMgIGRlZmluZSBIQVZFX01LVElNRQorIyBlbGlmIGRlZmluZWQoT1MzOTApCisjICBkZWZpbmUgSEFWRV9TVFJSQ0hSCisjICBkZWZpbmUgSEFWRV9TVFJUT0QKKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyAgZGVmaW5lIEhBVkVfU1RSVE9MCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMCisjICBkZWZpbmUgSEFWRV9TWVNfVElNRUJfSAorIyAgZGVmaW5lIEhBVkVfRlRJTUUKKyMgIGRlZmluZSBIQVZFX1JBTkRfUgorIyAgZGVmaW5lIEhBVkVfR01USU1FX1IKKyMgIGRlZmluZSBIQVZFX0xPQ0FMVElNRV9SCisjICBkZWZpbmUgSEFWRV9XQ1RPTUIKKyMgIGRlZmluZSBIQVZFX01CVE9XQworIyBlbGlmIGRlZmluZWQoQVM0MDApCisjICBkZWZpbmUgSEFWRV9TVFJSQ0hSCisjICBkZWZpbmUgSEFWRV9TVFJUT0QKKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyAgZGVmaW5lIEhBVkVfU1RSVE9MCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMCisjICBkZWZpbmUgSEFWRV9TWVNfVElNRUJfSAorIyAgZGVmaW5lIEhBVkVfRlRJTUUKKyMgIGRlZmluZSBIQVZFX1JBTkRfUgorIyAgZGVmaW5lIEhBVkVfR01USU1FX1IKKyMgIGRlZmluZSBIQVZFX0xPQ0FMVElNRV9SCisjICBkZWZpbmUgSEFWRV9XQ1RPTUIKKyMgIGRlZmluZSBIQVZFX01CVE9XQworIyBlbHNlCisvKiBEZWZhdWx0IGFzdW1wdGlvbnMgb24gc3VwcG9ydGVkIGZ1bmN0aW9ucyAqLworIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfU1lTX1RJTUVCX0gKKyMgIGRlZmluZSBIQVZFX0ZUSU1FCisjICBkZWZpbmUgSEFWRV9SQU5EX1IKKyMgIGRlZmluZSBIQVZFX0dFVEhPU1RCWU5BTUVfUgorIyAgZGVmaW5lIEhBVkVfR01USU1FX1IKKyMgIGRlZmluZSBIQVZFX0xPQ0FMVElNRV9SCisjICBkZWZpbmUgSEFWRV9XQ1RPTUIKKyMgIGRlZmluZSBIQVZFX01CVE9XQworIyBlbmRpZgorI2VuZGlmCisKKy8qIFFOWCBkb2VzIG5vdCBoYXZlIGEgd29ya2luZyB2ZXJzaW9uIG9mIHN0cnRvZiAqLworI2lmIGRlZmluZWQoX19RTlhfXykgfHwgZGVmaW5lZChRTlgpCisjIHVuZGVmIEhBVkVfU1RSVE9GCisjZW5kaWYKKworI2lmbmRlZiBTT0FQX0xPTkdfRk9STUFUCisjIGRlZmluZSBTT0FQX0xPTkdfRk9STUFUICIlbGxkIgkvKiBwcmludGYgZm9ybWF0IGZvciA2NCBiaXQgaW50cyAqLworI2VuZGlmCisKKyNpZm5kZWYgU09BUF9VTE9OR19GT1JNQVQKKyMgZGVmaW5lIFNPQVBfVUxPTkdfRk9STUFUICIlbGx1IgkvKiBwcmludGYgZm9ybWF0IGZvciB1bnNpZ25lZCA2NCBiaXQgaW50cyAqLworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9OT1NURExJQgorIyBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgaWZuZGVmIFBBTE0KKyMgIGluY2x1ZGUgPHN0ZGlvLmg+CisjICBpbmNsdWRlIDxzdHJpbmcuaD4KKyMgZW5kaWYKKyMgaW5jbHVkZSA8Y3R5cGUuaD4KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpICYmICFkZWZpbmVkKFdJVEhfTEVBTikKKyMgaW5jbHVkZSA8c3RyaW5nPgorIyBpbmNsdWRlIDxpb3N0cmVhbT4KKyNlbmRpZgorCisjaWZkZWYgV0lUSF9OT0hUVFAKKyMgaWZuZGVmIFdJVEhfTk9JTworIyAgZGVmaW5lIFdJVEhfTk9JTworIyAgdW5kZWYgV0lUSF9DT09LSUVTCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBVTkRFUl9DRQorIyBpZm5kZWYgUEFMTQorIyAgaWZuZGVmIFdJVEhfTk9JTworIyAgIGluY2x1ZGUgPGVycm5vLmg+CisjICAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjICBlbmRpZgorIyAgaWZuZGVmIFdJVEhfTEVBTgorIyAgIGlmZGVmIEhBVkVfU1lTX1RJTUVCX0gKKyMgICAgaW5jbHVkZSA8c3lzL3RpbWViLmg+CQkvKiBmb3IgZnRpbWUoKSAqLworIyAgIGVuZGlmCisjICAgaW5jbHVkZSA8dGltZS5oPgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgT1BFTlNFUlZFUgorIyBpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjIGluY2x1ZGUgPHN5cy9zdHJlYW0uaD4KKyMgaW5jbHVkZSA8c3lzL3Byb3Rvc3cuaD4KKyAgZXh0ZXJuIGludCBoX2Vycm5vOworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9OT0lPCisjIGlmbmRlZiBXSU4zMgorIyAgaWZuZGVmIFBBTE0KKyMgICBpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjICAgaWZkZWYgVlhXT1JLUworIyAgICBpbmNsdWRlIDxzb2NrTGliLmg+CisjICAgIGluY2x1ZGUgPHNlbGVjdExpYi5oPgorIyAgIGVuZGlmCisjICAgaWZuZGVmIFZYV09SS1MKKyMgICAgaWZuZGVmIFNZTUJJQU4KKyMgICAgIGluY2x1ZGUgPHN0cmluZ3MuaD4KKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgIGlmZGVmIFNVTl9PUworIyAgICBpbmNsdWRlIDxzeXMvc3RyZWFtLmg+CQkvKiBTVU4gKi8KKyMgICAgaW5jbHVkZSA8c3lzL3NvY2tldHZhci5oPgkJLyogU1VOIDwgMi44ICg/KSAqLworIyAgIGVuZGlmCisjICAgaWZkZWYgVlhXT1JLUworIyAgICBpZmRlZiBfV1JTX0tFUk5FTAorIyAgICAgaW5jbHVkZSA8c3lzL3RpbWVzLmg+CisjICAgIGVuZGlmCisjICAgZWxzZQorIyAgICBpbmNsdWRlIDxzeXMvdGltZS5oPgorIyAgIGVuZGlmCisjICAgaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorIyAgIGlmZGVmIE9TMzkwCisjICAgIGluY2x1ZGUgPG5ldGluZXQvdGNwX3Zhci5oPgorIyAgIGVsc2UKKyMgICAgaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4gICAgICAgICAgLyogVENQX05PREVMQVkgKi8KKyMgICBlbmRpZgorIyAgIGluY2x1ZGUgPGFycGEvaW5ldC5oPgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgV0lUSF9GQVNUQ0dJCisjIGluY2x1ZGUgPGZjZ2lfc3RkaW8uaD4KKyNlbmRpZgorCisjaWZkZWYgV0lUSF9PUEVOU1NMCisjIGRlZmluZSBPUEVOU1NMX05PX0tSQjUKKyMgaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KKyMgaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyMgaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjIGlmbmRlZiBBTExPV19PTERfVkVSU0lPTlMKKyMgIGlmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgMHgwMDkwNTEwMEwpCisjICAgZXJyb3IgIk11c3QgdXNlIE9wZW5TU0wgMC45LjYgb3IgbGF0ZXIiCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBXSVRIX0daSVAKKyMgaWZuZGVmIFdJVEhfWkxJQgorIyAgZGVmaW5lIFdJVEhfWkxJQgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBXSVRIX0NBU0VJTlNFTlNJVElWRVRBR1MKKyMgZGVmaW5lIFNPQVBfU1RSQ01QIHNvYXBfdGFnX2NtcAkvKiBjYXNlIGluc2Vuc2l0dmUgWE1MIGVsZW1lbnQvYXR0cmlidXRlIG5hbWVzICovCisjZWxzZQorIyBkZWZpbmUgU09BUF9TVFJDTVAgc3RyY21wCQkvKiBjYXNlIHNlbnNpdGl2ZSBYTUwgZWxlbWVudC9hdHRyaWJ1dGUgbmFtZXMgKi8KKyNlbmRpZgorCisjaWZkZWYgV0lUSF9aTElCCisjIGluY2x1ZGUgPHpsaWIuaD4KKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9TVERMSUIKKyMgaWZuZGVmIFBBTE0KKyMgIGluY2x1ZGUgPG1hdGguaD4JLyogZm9yIGlzbmFuKCkgKi8KKyMgZW5kaWYKKyNlbmRpZgorCisvKiAjZGVmaW5lIERFQlVHICovIC8qIFVuY29tbWVudCB0byBkZWJ1ZyBzZW5kaW5nIChpbiBmaWxlIFNFTlQubG9nKSByZWNlaXZpbmcgKGluIGZpbGUgUkVDVi5sb2cpIGFuZCBtZXNzYWdlcyAoaW4gZmlsZSBURVNULmxvZykgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWZkZWYgV0lOMzIKKyMgaWZuZGVmIFVOREVSX0NFCisjICBpbmNsdWRlIDxpby5oPgorIyAgaW5jbHVkZSA8ZmNudGwuaD4KKyMgZW5kaWYKKyMgaW5jbHVkZSA8d2luc29jay5oPgorLyogIyBpbmNsdWRlIDx3aW5zb2NrMi5oPiAqLyAvKiBBbHRlcm5hdGl2ZTogdXNlIHdpbnNvY2syIChub3QgYXZhaWxhYmxlIHdpdGggZVZDKSAqLworIyBpZmRlZiBXSVRIX0lQVjYKKyMgIGluY2x1ZGUgPHdzMnRjcGlwLmg+CisjICBpbmNsdWRlIDx3c3BpYXBpLmg+CisjIGVuZGlmCisjZWxzZQorIyBpZmRlZiBWWFdPUktTCisjICBpbmNsdWRlIDxob3N0TGliLmg+CisjICBpbmNsdWRlIDxpb2N0bC5oPgorIyAgaW5jbHVkZSA8aW9MaWIuaD4KKyMgZW5kaWYKKyMgaWZuZGVmIFdJVEhfTk9JTworIyAgaWZuZGVmIFBBTE0KKyMgICBpbmNsdWRlIDxuZXRkYi5oPgorIyAgIGluY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyMgICBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgICBpbmNsdWRlIDxmY250bC5oPgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBQb3J0YWJpbGl0eTogZGVmaW5lIFNPQVBfU09DS0xFTl9UICovCisjaWYgZGVmaW5lZChfQUlYKQorIyBkZWZpbmUgU09BUF9TT0NLTEVOX1Qgc29ja2xlbl90CisjZWxpZiBkZWZpbmVkKFNPQ0tMRU5fVCkKKyMgZGVmaW5lIFNPQVBfU09DS0xFTl9UIFNPQ0tMRU5fVAorI2VsaWYgZGVmaW5lZChfX3NvY2tsZW5fdF9kZWZpbmVkKSB8fCBkZWZpbmVkKF9TT0NLTEVOX1QpIHx8IGRlZmluZWQoQ1lHV0lOKSB8fCBkZWZpbmVkKEZSRUVCU0QpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19RTlhfXykgfHwgZGVmaW5lZChRTlgpCisjIGRlZmluZSBTT0FQX1NPQ0tMRU5fVCBzb2NrbGVuX3QKKyNlbGlmIGRlZmluZWQoSVJJWCkgfHwgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfX0FQUExFX18pIHx8IGRlZmluZWQoSFBfVVgpIHx8IGRlZmluZWQoU1VOX09TKSB8fCBkZWZpbmVkKE9QRU5TRVJWRVIpIHx8IGRlZmluZWQoVFJVNjQpIHx8IGRlZmluZWQoVlhXT1JLUykKKyMgZGVmaW5lIFNPQVBfU09DS0xFTl9UIGludAorI2Vsc2UKKyMgZGVmaW5lIFNPQVBfU09DS0xFTl9UIHNpemVfdAorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9TT0NLRVQKKyMgaWZkZWYgV0lOMzIKKyMgIGRlZmluZSBTT0FQX1NPQ0tFVCBTT0NLRVQKKyMgZWxzZQorIyAgZGVmaW5lIFNPQVBfU09DS0VUIGludAorIyAgZGVmaW5lIGNsb3Nlc29ja2V0KG4pIGNsb3NlKG4pCisjIGVuZGlmCisjZW5kaWYKKworI2RlZmluZSBTT0FQX0lOVkFMSURfU09DS0VUICgtMSkKKyNkZWZpbmUgc29hcF92YWxpZF9zb2NrZXQobikgKChuKSAhPSBTT0FQX0lOVkFMSURfU09DS0VUKQorCisjaWYgZGVmaW5lZChTWU1CSUFOKQorIyBkZWZpbmUgTE9ORzY0IGxvbmcKKyMgZGVmaW5lIFVMT05HNjQgdW5zaWduZWQgTE9ORzY0CisjZWxpZiAhZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfX0dMSUJDX18pIHx8IGRlZmluZWQoX19HTlVfXykKKyMgaWZuZGVmIExPTkc2NAorIyAgZGVmaW5lIExPTkc2NCBsb25nIGxvbmcKKyMgIGRlZmluZSBVTE9ORzY0IHVuc2lnbmVkIExPTkc2NAorIyBlbmRpZgorI2VsaWYgZGVmaW5lZChVTkRFUl9DRSkKKyMgZGVmaW5lIExPTkc2NCBfX2ludDY0CisjIGRlZmluZSBVTE9ORzY0IHVuc2lnbmVkIExPTkc2NAorI2VsaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pCisjIGRlZmluZSBMT05HNjQgX19pbnQ2NAorIyBkZWZpbmUgVUxPTkc2NCB1bnNpZ25lZCBMT05HNjQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChXSU4zMikKKyMgZGVmaW5lIHNvYXBfaW50MzIgX19pbnQzMgorI2VsaWYgZGVmaW5lZChTWU1CSUFOKQorIyBkZWZpbmUgc29hcF9pbnQzMiBsb25nCisjZWxpZiBkZWZpbmVkKFBBTE0pCisjIGRlZmluZSBzb2FwX2ludDMyIEludDMyCisjZWxzZQorIyBkZWZpbmUgc29hcF9pbnQzMiBpbnQzMl90CisjZW5kaWYKKworI2lmZGVmIFdJTjMyCisjIGRlZmluZSBTT0FQX0VSQU5HRSBFUkFOR0UKKyMgZGVmaW5lIFNPQVBfRUlOVFIgV1NBRUlOVFIKKyMgZGVmaW5lIFNPQVBfRUFHQUlOIFdTQUVXT1VMREJMT0NLCisjIGRlZmluZSBTT0FQX0VXT1VMREJMT0NLIFdTQUVXT1VMREJMT0NLCisjIGRlZmluZSBTT0FQX0VJTlBST0dSRVNTIFdTQUVJTlBST0dSRVNTCisjZWxzZQorIyBkZWZpbmUgU09BUF9FUkFOR0UgRVJBTkdFCisjIGRlZmluZSBTT0FQX0VJTlRSIEVJTlRSCisjIGRlZmluZSBTT0FQX0VBR0FJTiBFQUdBSU4KKyMgaWZkZWYgU1lNQklBTgorIyAgZGVmaW5lIFNPQVBfRVdPVUxEQkxPQ0sgOTg5OAorIyAgZGVmaW5lIFNPQVBfRUlOUFJPR1JFU1MgOTg5OQorIyBlbHNlCisjICBkZWZpbmUgU09BUF9FV09VTERCTE9DSyBFV09VTERCTE9DSworIyAgZGVmaW5lIFNPQVBfRUlOUFJPR1JFU1MgRUlOUFJPR1JFU1MKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgV0lOMzIKKyMgaWZkZWYgVU5ERVJfQ0UKKyMgIGRlZmluZSBzb2FwX2Vycm5vIEdldExhc3RFcnJvcigpCisjICBkZWZpbmUgc29hcF9zb2NrZXRfZXJybm8gR2V0TGFzdEVycm9yKCkKKyMgIGRlZmluZSBzb2FwX3Jlc2V0X2Vycm5vIFNldExhc3RFcnJvcigwKQorIyBlbHNlCisjICBkZWZpbmUgc29hcF9lcnJubyBHZXRMYXN0RXJyb3IoKQorIyAgZGVmaW5lIHNvYXBfc29ja2V0X2Vycm5vIFdTQUdldExhc3RFcnJvcigpCisjICBkZWZpbmUgc29hcF9yZXNldF9lcnJubyBTZXRMYXN0RXJyb3IoMCkKKyMgZW5kaWYKKyNlbHNlCisjIGlmbmRlZiBXSVRIX05PSU8KKyMgIGRlZmluZSBzb2FwX2Vycm5vIGVycm5vCisjICBkZWZpbmUgc29hcF9zb2NrZXRfZXJybm8gZXJybm8KKyMgIGRlZmluZSBzb2FwX3Jlc2V0X2Vycm5vIChlcnJubyA9IDApCisjIGVsc2UKKyMgIGRlZmluZSBzb2FwX2Vycm5vIDAKKyMgIGRlZmluZSBzb2FwX3NvY2tldF9lcnJubyAwCisjICBkZWZpbmUgc29hcF9yZXNldF9lcnJubworIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9CVUZMRU4KKyMgaWZkZWYgV0lUSF9VRFAKKyMgIGRlZmluZSBTT0FQX0JVRkxFTiAoNjU1MzYpIC8qIG1heCBVRFAgcGFja2V0IHNpemUgKi8KKyMgZWxzZQorIyAgaWZuZGVmIFdJVEhfTEVBTgorIyAgIGRlZmluZSBTT0FQX0JVRkxFTiAoNjU1MzYpIC8qIGJ1ZmZlciBsZW5ndGggZm9yIHNvY2tldCBwYWNrZXRzLCBhbHNvIHVzZWQgYnkgZ2V0aG9zdGJ5bmFtZV9yIHNvIGRvbid0IG1ha2UgdGhpcyB0b28gc21hbGwgKi8KKyMgIGVsc2UKKyMgICBkZWZpbmUgU09BUF9CVUZMRU4gICgyMDQ4KQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBTT0FQX0xBQkxFTgorIyBkZWZpbmUgU09BUF9MQUJMRU4gICAgICg2NCkgLyogaW5pdGlhbCBsb29rLWFzaWRlIGJ1ZmZlciBsZW5ndGggKi8KKyNlbmRpZgorI2lmbmRlZiBTT0FQX1BUUkJMSworIyBkZWZpbmUgU09BUF9QVFJCTEsgICAgICgzMikgLyogYmxvY2sgYWxsb2NhdGlvbiBmb3IgcG9pbnRlciBoYXNoIHRhYmxlIGNoYWlucyAqLworI2VuZGlmCisjaWZuZGVmIFNPQVBfUFRSSEFTSAorIyBpZm5kZWYgV0lUSF9MRUFOCisjICBkZWZpbmUgU09BUF9QVFJIQVNIICgxMDI0KSAvKiBzaXplIG9mIHBvaW50ZXIgYW5hbHlzaXMgaGFzaCB0YWJsZSAobXVzdCBiZSBwb3dlciBvZiAyKSAqLworIyBlbHNlCisjICBkZWZpbmUgU09BUF9QVFJIQVNIICAgKDMyKQorIyBlbmRpZgorI2VuZGlmCisjaWZuZGVmIFNPQVBfSURIQVNICisjIGlmbmRlZiBXSVRIX0xFQU4KKyMgIGRlZmluZSBTT0FQX0lESEFTSCAgKDE5OTkpIC8qIHByaW1lIHNpemUgb2YgaGFzaCB0YWJsZSBmb3IgcGFyc2VkIGlkL3JlZiAqLworIyBlbHNlCisjICBkZWZpbmUgU09BUF9JREhBU0ggICAgKDE5KSAvKiAxOSwgMTk5ICovCisjIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgU09BUF9CTEtMRU4KKyMgaWZuZGVmIFdJVEhfTEVBTgorIyAgZGVmaW5lIFNPQVBfQkxLTEVOICAgKDI1NikgLyogc2l6ZSBvZiBibG9ja3MgdG8gY29sbGVjdCBsb25nIHN0cmluZ3MgYW5kIFhNTCBhdHRyaWJ1dGVzICovCisjIGVsc2UKKyMgIGRlZmluZSBTT0FQX0JMS0xFTiAgICAoMzIpCisjIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgU09BUF9UQUdMRU4KKyMgaWZuZGVmIFdJVEhfTEVBTgorIyAgZGVmaW5lIFNPQVBfVEFHTEVOICAoMTAyNCkgLyogbWF4aW11bSBsZW5ndGggb2YgWE1MIGVsZW1lbnQgdGFnL2F0dHJpYnV0ZSBuYW1lIG9yIGhvc3QvcGF0aCBuYW1lICsgMSAqLworIyBlbHNlCisjICBkZWZpbmUgU09BUF9UQUdMRU4gICAgKDY0KQorIyBlbmRpZgorI2VuZGlmCisjaWZuZGVmIFNPQVBfSERSTEVOCisjIGlmbmRlZiBXSVRIX0xFQU4KKyMgIGRlZmluZSBTT0FQX0hEUkxFTiAgKDgxOTIpIC8qIG1heGltdW0gbGVuZ3RoIG9mIEhUVFAgaGVhZGVyIGxpbmUgKG11c3QgYmUgPjQwOTYgdG8gcmVhZCBjb29raWVzKSAqLworIyBlbHNlCisjICBkZWZpbmUgU09BUF9IRFJMRU4gICgxMDI0KQorIyBlbmRpZgorI2VuZGlmCisjaWZuZGVmIFNPQVBfTUFYRElNUworIyBpZm5kZWYgV0lUSF9MRUFOCisjICBkZWZpbmUgU09BUF9NQVhESU1TCSAoMTYpIC8qIG1heGltdW0gYXJyYXkgZGltZW5zaW9ucyAoYXJyYXkgbmVzdGluZ3MpIG11c3QgYmUgbGVzcyB0aGFuIDY0IHRvIHByb3RlY3Qgc29hcC0+dG1wYnVmICovCisjIGVsc2UKKyMgIGRlZmluZSBTT0FQX01BWERJTVMJICAoNCkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfTUFYTE9HUworIyBkZWZpbmUgU09BUF9NQVhMT0dTCSAgKDMpIC8qIG1heCBudW1iZXIgb2YgZGVidWcgbG9ncyBwZXIgc3RydWN0IHNvYXAgZW52aXJvbm1lbnQgKi8KKyMgZGVmaW5lIFNPQVBfSU5ERVhfUkVDViAgKDApCisjIGRlZmluZSBTT0FQX0lOREVYX1NFTlQgICgxKQorIyBkZWZpbmUgU09BUF9JTkRFWF9URVNUICAoMikKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfTUFYS0VFUEFMSVZFCisjIGRlZmluZSBTT0FQX01BWEtFRVBBTElWRSAoMTAwKSAvKiBtYXggaXRlcmF0aW9ucyB0byBrZWVwIHNlcnZlciBjb25uZWN0aW9uIGFsaXZlICovCisjZW5kaWYKKworI2lmbmRlZiBTT0FQX01BWEFSUkFZU0laRQorIyBkZWZpbmUgU09BUF9NQVhBUlJBWVNJWkUgKDEwMDAwMCkgLyogInRydXN0ZWQiIG1heCBzaXplIG9mIGluYm91bmQgU09BUCBhcnJheSBmb3IgY29tcG91bmQgYXJyYXkgYWxsb2NhdGlvbiAqLworI2VuZGlmCisKKyNpZmRlZiBWWFdPUktTCisjIGlmZGVmIF9fSU5DbWF0aGggCisjICBpbmNsdWRlIDxwcml2YXRlL21hdGhQLmg+CisjICBpZm5kZWYgSEFWRV9JU05BTgorIyAgIGRlZmluZSBIQVZFX0lTTkFOCisjICBlbmRpZgorIyAgZGVmaW5lIHNvYXBfaXNuYW4obnVtKSBpc05hbihudW0pCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIFdJTjMyIAorIyBpbmNsdWRlIDxmbG9hdC5oPgorIyBpZm5kZWYgSEFWRV9JU05BTgorIyAgZGVmaW5lIEhBVkVfSVNOQU4KKyMgZW5kaWYKKyMgZGVmaW5lIHNvYXBfaXNuYW4obnVtKSBfaXNuYW4obnVtKQorI2VuZGlmCisKKyNpZmRlZiBTVU5fT1MKKyMgZGVmaW5lIHNvYXBfaXNuYW4obikgaXNuYW4obikKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoSEFWRV9JU05BTikgJiYgKGRlZmluZWQoX01BVEhfSCkgfHwgZGVmaW5lZChfTUFUSF9JTkNMVURFRCkpCisjIGRlZmluZSBIQVZFX0lTTkFOCisjZW5kaWYKKworI2lmbmRlZiBzb2FwX2lzbmFuCisjIGlmZGVmIEhBVkVfSVNOQU4KKyMgIGRlZmluZSBzb2FwX2lzbmFuKG4pIGlzbmFuKG4pCisjIGVsc2UKKyMgIGRlZmluZSBzb2FwX2lzbmFuKF8pICgwKQorIyBlbmRpZgorI2VuZGlmCisKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc29hcF9kb3VibGVfbmFuIHsgdW5zaWduZWQgaW50IG4xLCBuMjsgfSBzb2FwX2RvdWJsZV9uYW47CisKKyNpZmRlZiBWWFdPUktTCisjIGlmbmRlZiBGTFRfTUFYCisjICBkZWZpbmUgRkxUX01BWCBfQVJDSF9GTFRfTUFYCisjIGVuZGlmCisjIGlmbmRlZiBEQkxfTUFYCisjICBkZWZpbmUgREJMX01BWCBfQVJDSF9EQkxfTUFYCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBGTFRfTkFOCisjIGlmZGVmIEhBVkVfSVNOQU4KKyMgIGRlZmluZSBGTFRfTkFOICgqKGZsb2F0Kikodm9pZCopJnNvYXBfZG91YmxlX25hbikKKyMgZWxzZQorIyAgZGVmaW5lIEZMVF9OQU4gKDAuMCkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEZMVF9QSU5GVFkKKyMgaWYgZGVmaW5lZChGTFRfTUFYKQorIyAgZGVmaW5lIEZMVF9QSU5GVFkgRkxUX01BWAorIyBlbGlmIGRlZmluZWQoSFVHRV9WQUxGKQorIyAgZGVmaW5lIEZMVF9QSU5GVFkgKGZsb2F0KUhVR0VfVkFMRgorIyBlbGlmIGRlZmluZWQoSFVHRV9WQUwpCisjICBkZWZpbmUgRkxUX1BJTkZUWSAoZmxvYXQpSFVHRV9WQUwKKyMgZWxpZiBkZWZpbmVkKEZMT0FUX01BWCkKKyMgIGRlZmluZSBGTFRfUElORlRZIEZMT0FUX01BWAorIyBlbHNlCisjICBkZWZpbmUgRkxUX1BJTkZUWSAoMy40MDI4MjM0N2UrMzhGKQorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRkxUX05JTkZUWQorIyBkZWZpbmUgRkxUX05JTkZUWSAoLUZMVF9QSU5GVFkpCisjZW5kaWYKKworI2lmbmRlZiBEQkxfTkFOCisjIGlmZGVmIEhBVkVfSVNOQU4KKyMgIGRlZmluZSBEQkxfTkFOICgqKGRvdWJsZSopKHZvaWQqKSZzb2FwX2RvdWJsZV9uYW4pCisjIGVsc2UKKyMgIGRlZmluZSBEQkxfTkFOICgwLjApCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBEQkxfUElORlRZCisjIGlmIGRlZmluZWQoREJMX01BWCkKKyMgIGRlZmluZSBEQkxfUElORlRZIERCTF9NQVgKKyMgZWxpZiBkZWZpbmVkKEhVR0VfVkFMRikKKyMgIGRlZmluZSBEQkxfUElORlRZIChkb3VibGUpSFVHRV9WQUxGCisjIGVsaWYgZGVmaW5lZChIVUdFX1ZBTCkKKyMgIGRlZmluZSBEQkxfUElORlRZIChkb3VibGUpSFVHRV9WQUwKKyMgZWxpZiBkZWZpbmVkKERPVUJMRV9NQVgpCisjICBkZWZpbmUgREJMX1BJTkZUWSBET1VCTEVfTUFYCisjIGVsc2UKKyMgIGRlZmluZSBEQkxfUElORlRZICgxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOCkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIERCTF9OSU5GVFkKKyMgZGVmaW5lIERCTF9OSU5GVFkgKC1EQkxfUElORlRZKQorI2VuZGlmCisKKyNkZWZpbmUgc29hcF9pc3BpbmZkKG4pICgobikgPj0gREJMX1BJTkZUWSkKKyNkZWZpbmUgc29hcF9pc3BpbmZmKG4pICgobikgPj0gRkxUX1BJTkZUWSkKKyNkZWZpbmUgc29hcF9pc25pbmZkKG4pICgobikgPD0gREJMX05JTkZUWSkKKyNkZWZpbmUgc29hcF9pc25pbmZmKG4pICgobikgPD0gRkxUX05JTkZUWSkKKworLyogZ1NPQVAgZXJyb3IgY29kZXMgKi8KKworI2RlZmluZSBTT0FQX0VPRgkJCUVPRgorI2RlZmluZSBTT0FQX0VSUgkJCUVPRgorI2RlZmluZSBTT0FQX09LCQkJCTAKKyNkZWZpbmUgU09BUF9DTElfRkFVTFQJCQkxCisjZGVmaW5lIFNPQVBfU1ZSX0ZBVUxUCQkJMgorI2RlZmluZSBTT0FQX1RBR19NSVNNQVRDSAkJMworI2RlZmluZSBTT0FQX1RZUEUJCQk0CisjZGVmaW5lIFNPQVBfU1lOVEFYX0VSUk9SCQk1CisjZGVmaW5lIFNPQVBfTk9fVEFHCQkJNgorI2RlZmluZSBTT0FQX0lPQgkJCTcKKyNkZWZpbmUgU09BUF9NVVNUVU5ERVJTVEFORAkJOAorI2RlZmluZSBTT0FQX05BTUVTUEFDRQkJCTkKKyNkZWZpbmUgU09BUF9VU0VSX0VSUk9SCQkJMTAKKyNkZWZpbmUgU09BUF9GQVRBTF9FUlJPUgkJMTEKKyNkZWZpbmUgU09BUF9GQVVMVAkJCTEyCisjZGVmaW5lIFNPQVBfTk9fTUVUSE9ECQkJMTMKKyNkZWZpbmUgU09BUF9HRVRfTUVUSE9ECQkJMTQKKyNkZWZpbmUgU09BUF9FT00JCQkxNQorI2RlZmluZSBTT0FQX05VTEwJCQkxNgorI2RlZmluZSBTT0FQX0RVUExJQ0FURV9JRAkJMTcKKyNkZWZpbmUgU09BUF9NSVNTSU5HX0lECQkJMTgKKyNkZWZpbmUgU09BUF9IUkVGCQkJMTkKKyNkZWZpbmUgU09BUF9VRFBfRVJST1IJCQkyMAorI2RlZmluZSBTT0FQX1RDUF9FUlJPUgkJCTIxCisjZGVmaW5lIFNPQVBfSFRUUF9FUlJPUgkJCTIyCisjZGVmaW5lIFNPQVBfU1NMX0VSUk9SCQkJMjMKKyNkZWZpbmUgU09BUF9aTElCX0VSUk9SCQkJMjQKKyNkZWZpbmUgU09BUF9ESU1FX0VSUk9SCQkJMjUKKyNkZWZpbmUgU09BUF9ESU1FX0hSRUYJCQkyNgorI2RlZmluZSBTT0FQX0RJTUVfTUlTTUFUQ0gJCTI3CisjZGVmaW5lIFNPQVBfRElNRV9FTkQJCQkyOAorI2RlZmluZSBTT0FQX01JTUVfRVJST1IJCQkyOQorI2RlZmluZSBTT0FQX01JTUVfSFJFRgkJCTMwCisjZGVmaW5lIFNPQVBfTUlNRV9FTkQJCQkzMQorI2RlZmluZSBTT0FQX1ZFUlNJT05NSVNNQVRDSAkJMzIKKyNkZWZpbmUgU09BUF9QTFVHSU5fRVJST1IJCTMzCisjZGVmaW5lIFNPQVBfREFUQUVOQ09ESU5HVU5LTk9XTgkzNAorI2RlZmluZSBTT0FQX1JFUVVJUkVECQkJMzUKKyNkZWZpbmUgU09BUF9QUk9ISUJJVEVECQkJMzYKKyNkZWZpbmUgU09BUF9PQ0NVUlMJCQkzNworI2RlZmluZSBTT0FQX0xFTkdUSAkJCTM4CisKKyNkZWZpbmUgc29hcF94bWxfZXJyb3JfY2hlY2soZSkgKChlKSA9PSBTT0FQX1RBR19NSVNNQVRDSCB8fCAoZSkgPT0gU09BUF9UQUdfRU5EIHx8IChlKSA9PSBTT0FQX1NZTlRBWF9FUlJPUiB8fCAoZSkgPT0gU09BUF9OQU1FU1BBQ0UgfHwgKGUpID09IFNPQVBfRFVQTElDQVRFX0lEIHx8IChlKSA9PSBTT0FQX01JU1NJTkdfSUQgfHwgKGUpID09IFNPQVBfUkVRVUlSRUQgfHwgKGUpID09IFNPQVBfUFJPSElCSVRFRCB8fCAoZSkgPT0gU09BUF9PQ0NVUlMgfHwgKGUpID09IFNPQVBfTEVOR1RIIHx8IChlKSA9PSBTT0FQX05VTEwgfHwgKGUpID09IFNPQVBfSFJFRikKKyNkZWZpbmUgc29hcF9zb2FwX2Vycm9yX2NoZWNrKGUpICgoZSkgPT0gU09BUF9DTElfRkFVTFQgfHwgKGUpID09IFNPQVBfU1ZSX0ZBVUxUIHx8IChlKSA9PSBTT0FQX1ZFUlNJT05NSVNNQVRDSCB8fCAoZSkgPT0gU09BUF9NVVNUVU5ERVJTVEFORCB8fCAoZSkgPT0gU09BUF9GQVVMVCB8fCAoZSkgPT0gU09BUF9OT19NRVRIT0QpCisjZGVmaW5lIHNvYXBfdGNwX2Vycm9yX2NoZWNrKGUpICgoZSkgPT0gU09BUF9FT0YgfHwgKGUpID09IFNPQVBfVENQX0VSUk9SKQorI2RlZmluZSBzb2FwX3NzbF9lcnJvcl9jaGVjayhlKSAoKGUpID09IFNPQVBfU1NMX0VSUk9SKQorI2RlZmluZSBzb2FwX3psaWJfZXJyb3JfY2hlY2soZSkgKChlKSA9PSBTT0FQX1pMSUJfRVJST1IpCisjZGVmaW5lIHNvYXBfaHR0cF9lcnJvcl9jaGVjayhlKSAoKGUpID09IFNPQVBfSFRUUF9FUlJPUiB8fCAoZSkgPT0gU09BUF9HRVRfTUVUSE9EIHx8ICgoZSkgPj0gMTAwICYmIChlKSA8IDYwMCkpCisKKy8qIGdTT0FQIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGVzIDEwMCB0byA1OTkgYXJlIHJlc2VydmVkICovCisKKy8qIENvZGVzIDYwMCB0byA5OTkgYXJlIHVzZXIgZGVmaW5hYmxlICovCisKKy8qIEV4Y2VwdGlvbmFsIGdTT0FQIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGVzID49IDEwMDAgKi8KKworI2RlZmluZSBTT0FQX1NUT1AJCTEwMDAJLyogTm8gSFRUUCByZXNwb25zZSAqLworI2RlZmluZSBTT0FQX0ZPUk0JCTEwMDEJLyogRm9ybSByZXF1ZXN0L3Jlc3BvbnNlICovCisjZGVmaW5lIFNPQVBfSFRNTAkJMTAwMgkvKiBDdXN0b20gSFRNTCByZXNwb25zZSAqLworI2RlZmluZSBTT0FQX0ZJTEUJCTEwMDMJLyogQ3VzdG9tIGZpbGUtYmFzZWQgcmVzcG9uc2UgKi8KKworLyogZ1NPQVAgSFRUUCBtZXRob2QgY29kZXMgKi8KKworI2RlZmluZSBTT0FQX1BPU1QJCTIwMDAKKyNkZWZpbmUgU09BUF9HRVQJCTIwMDEKKworLyogZ1NPQVAgRElNRSAqLworCisjZGVmaW5lIFNPQVBfRElNRV9DRgkJMHgwMQorI2RlZmluZSBTT0FQX0RJTUVfTUUJCTB4MDIKKyNkZWZpbmUgU09BUF9ESU1FX01CCQkweDA0CisjZGVmaW5lIFNPQVBfRElNRV9WRVJTSU9OCTB4MDggLyogRElNRSB2ZXJzaW9uIDEgKi8KKyNkZWZpbmUgU09BUF9ESU1FX01FRElBCQkweDEwCisjZGVmaW5lIFNPQVBfRElNRV9BQlNVUkkJMHgyMAorCisvKiBnU09BUCBaTElCICovCisKKyNkZWZpbmUgU09BUF9aTElCX05PTkUJCTB4MDAKKyNkZWZpbmUgU09BUF9aTElCX0RFRkxBVEUJMHgwMQorI2RlZmluZSBTT0FQX1pMSUJfSU5GTEFURQkweDAyCisjZGVmaW5lIFNPQVBfWkxJQl9HWklQCQkweDAyCisKKy8qIGdTT0FQIHRyYW5zcG9ydCwgY29ubmVjdGlvbiwgYW5kIGNvbnRlbnQgZW5jb2RpbmcgbW9kZXMgKi8KKwordHlwZWRlZiBzb2FwX2ludDMyIHNvYXBfbW9kZTsKKworI2RlZmluZSBTT0FQX0lPCQkJMHgwMDAwMDAwMwkvKiBJTyBtYXNrICovCisjZGVmaW5lIFNPQVBfSU9fRkxVU0gJCTB4MDAwMDAwMDAJLyogZmx1c2ggb3V0cHV0IGltbWVkaWF0ZWx5LCBubyBidWZmZXJpbmcgKi8KKyNkZWZpbmUgU09BUF9JT19CVUZGRVIJCTB4MDAwMDAwMDEJLyogYnVmZmVyIG91dHB1dCBpbiBwYWNrZXRzIG9mIHNpemUgU09BUF9CVUZMRU4gKi8KKyNkZWZpbmUgU09BUF9JT19TVE9SRQkJMHgwMDAwMDAwMgkvKiBzdG9yZSBlbnRpcmUgb3V0cHV0IHRvIGRldGVybWluZSBsZW5ndGggZm9yIHRyYW5zcG9ydCAqLworI2RlZmluZSBTT0FQX0lPX0NIVU5LCQkweDAwMDAwMDAzCS8qIHVzZSBIVFRQIGNodW5rZWQgdHJhbnNmZXIgQU5EIGJ1ZmZlciBwYWNrZXRzICovCisKKyNkZWZpbmUgU09BUF9JT19VRFAJCTB4MDAwMDAwMDQKKyNkZWZpbmUgU09BUF9JT19MRU5HVEgJCTB4MDAwMDAwMDgKKyNkZWZpbmUgU09BUF9JT19LRUVQQUxJVkUJMHgwMDAwMDAxMAorCisjZGVmaW5lIFNPQVBfRU5DX0xBVElOCQkweDAwODAwMDIwCS8qIGlzby04ODU5LTEgZW5jb2RpbmcgKi8KKyNkZWZpbmUgU09BUF9FTkNfWE1MCQkweDAwMDAwMDQwCS8qIHBsYWluIFhNTCBlbmNvZGluZywgbm8gSFRUUCBoZWFkZXIgKi8KKyNkZWZpbmUgU09BUF9FTkNfRElNRQkJMHgwMDAwMDA4MAorI2RlZmluZSBTT0FQX0VOQ19NSU1FCQkweDAwMDAwMTAwCisjZGVmaW5lIFNPQVBfRU5DX01UT00JCTB4MDAwMDAyMDAKKyNkZWZpbmUgU09BUF9FTkNfWkxJQgkJMHgwMDAwMDQwMAorI2RlZmluZSBTT0FQX0VOQ19TU0wJCTB4MDAwMDA4MDAKKworI2RlZmluZSBTT0FQX0VOQwkJMHgwMDAwMEZGRgkvKiBJTyBhbmQgRU5DIG1hc2sgKi8KKworI2RlZmluZSBTT0FQX1hNTF9TVFJJQ1QJCTB4MDAwMDEwMDAJLyogc3RyaWN0IHZhbGlkYXRpb24gKi8KKyNkZWZpbmUgU09BUF9YTUxfSU5ERU5UCQkweDAwMDAyMDAwCisjZGVmaW5lIFNPQVBfWE1MX0NBTk9OSUNBTAkweDAwMDA0MDAwCS8qIEVYQyBDMTROIGNhbm9uaWNhbCBYTUwgKi8KKyNkZWZpbmUgU09BUF9YTUxfVFJFRQkJMHgwMDAwODAwMAorI2RlZmluZSBTT0FQX1hNTF9HUkFQSAkJMHgwMDAxMDAwMAorI2RlZmluZSBTT0FQX1hNTF9OSUwJCTB4MDAwMjAwMDAKKyNkZWZpbmUgU09BUF9YTUxfRE9NCQkweDAwMDQwMDAwCisjZGVmaW5lIFNPQVBfWE1MX1NFQwkJMHgwMDA4MDAwMAkvKiByZXNlcnZlZCBmb3IgV1Mgc2VjdXJpdHkgKi8KKworI2RlZmluZSBTT0FQX0NfTk9JT0IJCTB4MDAxMDAwMDAKKyNkZWZpbmUgU09BUF9DX1VURlNUUklORwkweDAwMjAwMDAwCisjZGVmaW5lIFNPQVBfQ19NQlNUUklORwkJMHgwMDQwMDAwMAorCisjZGVmaW5lIFNPQVBfRE9NX1RSRUUJCTB4MDEwMDAwMDAKKyNkZWZpbmUgU09BUF9ET01fTk9ERQkJMHgwMjAwMDAwMAorI2RlZmluZSBTT0FQX0RPTV9BU0lTCQkweDA0MDAwMDAwCisKKyNkZWZpbmUgU09BUF9JT19ERUZBVUxUCQlTT0FQX0lPX0ZMVVNICisKKy8qIFNTTCBjbGllbnQvc2VydmVyIGF1dGhlbnRpY2F0aW9uIHNldHRpbmdzICovCisKKyNkZWZpbmUgU09BUF9TU0xfTk9fQVVUSEVOVElDQVRJT04JCTB4MDAJLyogZm9yIHRlc3RpbmcgcHVycG9zZXMgKi8KKyNkZWZpbmUgU09BUF9TU0xfUkVRVUlSRV9TRVJWRVJfQVVUSEVOVElDQVRJT04JMHgwMQkvKiBjbGllbnQgcmVxdWlyZXMgc2VydmVyIHRvIGF1dGhlbnRpY2F0ZSAqLworI2RlZmluZSBTT0FQX1NTTF9SRVFVSVJFX0NMSUVOVF9BVVRIRU5USUNBVElPTgkweDAyCS8qIHNlcnZlciByZXF1aXJlcyBjbGllbnQgdG8gYXV0aGVudGljYXRlICovCisKKyNkZWZpbmUgU09BUF9TU0xfREVGQVVMVAkJCVNPQVBfU1NMX1JFUVVJUkVfU0VSVkVSX0FVVEhFTlRJQ0FUSU9OCisKKy8qIHN0YXRlICovCisKKyNkZWZpbmUgU09BUF9JTklUCTEKKyNkZWZpbmUgU09BUF9DT1BZCTIKKworI2RlZmluZSBzb2FwX2NoZWNrX3N0YXRlKHNvYXApICghKHNvYXApIHx8ICgoc29hcCktPnN0YXRlICE9IFNPQVBfSU5JVCAmJiAoc29hcCktPnN0YXRlICE9IFNPQVBfQ09QWSkpCisKKy8qIHBhcnQgKi8KKworI2RlZmluZSBTT0FQX0JFR0lOCQkwCisjZGVmaW5lIFNPQVBfSU5fRU5WRUxPUEUJMgorI2RlZmluZSBTT0FQX0lOX0hFQURFUgkJMworI2RlZmluZSBTT0FQX0VORF9IRUFERVIJCTQKKyNkZWZpbmUgU09BUF9OT19CT0RZCQk1CisjZGVmaW5lIFNPQVBfSU5fQk9EWQkJNgorI2RlZmluZSBTT0FQX0VORF9CT0RZCQk3CisjZGVmaW5lIFNPQVBfRU5EX0VOVkVMT1BFCTgKKyNkZWZpbmUgU09BUF9FTkQJCTkKKyNkZWZpbmUgU09BUF9CRUdJTl9TRUNVUklUWQkxMAorI2RlZmluZSBTT0FQX0lOX1NFQ1VSSVRZCTExCisjZGVmaW5lIFNPQVBfRU5EX1NFQ1VSSVRZCTEyCisKKy8qIERFQlVHIG1hY3JvcyAqLworCisjaWZuZGVmIFdJVEhfTEVBTgorIyBpZmRlZiBERUJVRworIyAgaWZuZGVmIFNPQVBfREVCVUcKKyMgICBkZWZpbmUgU09BUF9ERUJVRworIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgU09BUF9ERUJVRworIyBkZWZpbmUgU09BUF9NQUxMT0Moc29hcCwgc2l6ZSkgc29hcF90cmFja19tYWxsb2Moc29hcCwgX19GSUxFX18sIF9fTElORV9fLCBzaXplKQorIyBkZWZpbmUgU09BUF9GUkVFKHNvYXAsIHB0cikgc29hcF90cmFja19mcmVlKHNvYXAsIF9fRklMRV9fLCBfX0xJTkVfXywgcHRyKQorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9NQUxMT0MJCQkvKiB1c2UgbGliYyBtYWxsb2MgKi8KKyMgZGVmaW5lIFNPQVBfTUFMTE9DKHNvYXAsIHNpemUpIG1hbGxvYyhzaXplKQorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9GUkVFCQkJLyogdXNlIGxpYmMgZnJlZSAqLworIyBkZWZpbmUgU09BUF9GUkVFKHNvYXAsIHB0cikgZnJlZShwdHIpCisjZW5kaWYKKworI2lmZGVmIFNPQVBfREVCVUcKKyMgaWZuZGVmIFNPQVBfTUVTU0FHRQorIyAgZGVmaW5lIFNPQVBfTUVTU0FHRSBmcHJpbnRmCisjIGVuZGlmCisjIGlmbmRlZiBEQkdMT0cKKyMgIGRlZmluZSBEQkdMT0coREJHRklMRSwgQ01EKSBcCit7IGlmIChzb2FwKVwKKyAgeyBpZiAoIXNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYXyMjREJHRklMRV0pXAorICAgICAgc29hcF9vcGVuX2xvZ2ZpbGUoKHN0cnVjdCBzb2FwKilzb2FwLCBTT0FQX0lOREVYXyMjREJHRklMRSk7XAorICAgIGlmIChzb2FwLT5mZGVidWdbU09BUF9JTkRFWF8jI0RCR0ZJTEVdKVwKKyAgICB7IEZJTEUgKmZkZWJ1ZyA9IHNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYXyMjREJHRklMRV07XAorICAgICAgQ01EO1wKKyAgICAgIGZmbHVzaChmZGVidWcpO1wKKyAgICB9XAorICB9XAorfQorIyBlbmRpZgorIyBpZm5kZWYgREJHTVNHCisjICBkZWZpbmUgREJHTVNHKERCR0ZJTEUsIE1TRywgTEVOKSBcCit7IGlmIChzb2FwKVwKKyAgeyBpZiAoIXNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYXyMjREJHRklMRV0pXAorICAgICAgc29hcF9vcGVuX2xvZ2ZpbGUoKHN0cnVjdCBzb2FwKilzb2FwLCBTT0FQX0lOREVYXyMjREJHRklMRSk7XAorICAgIGlmIChzb2FwLT5mZGVidWdbU09BUF9JTkRFWF8jI0RCR0ZJTEVdKVwKKyAgICB7IGZ3cml0ZSgoTVNHKSwgMSwgKExFTiksIHNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYXyMjREJHRklMRV0pO1wKKyAgICAgIGZmbHVzaChzb2FwLT5mZGVidWdbU09BUF9JTkRFWF8jI0RCR0ZJTEVdKTtcCisgICAgfVwKKyAgfVwKK30KKyMgZW5kaWYKKyMgaWZuZGVmIERHQkZVTgorIyAgZGVmaW5lIERCR0ZVTihGTkFNRSkgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIlcyglZCk6ICVzKClcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgRk5BTUUpKQorIyAgZGVmaW5lIERCR0ZVTjEoRk5BTUUsIEZNVCwgQVJHKSBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIiVzKCVkKTogJXMoIkZNVCIpXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIEZOQU1FLCAoQVJHKSkpCisjICBkZWZpbmUgREJHRlVOMihGTkFNRSwgRk1UMSwgQVJHMSwgRk1UMiwgQVJHMikgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIlcyglZCk6ICVzKCJGTVQxIiwgIkZNVDIiKVxuIiwgX19GSUxFX18sIF9fTElORV9fLCBGTkFNRSwgKEFSRzEpLCAoQVJHMikpKQorIyAgZGVmaW5lIERCR0ZVTjMoRk5BTUUsIEZNVDEsIEFSRzEsIEZNVDIsIEFSRzIsIEZNVDMsIEFSRzMpIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiJXMoJWQpOiAlcygiRk1UMSIsICJGTVQyIiwgIkZNVDMiKVxuIiwgX19GSUxFX18sIF9fTElORV9fLCBGTkFNRSwgKEFSRzEpLCAoQVJHMiksIChBUkczKSkpCisjIGVuZGlmCisjIGlmbmRlZiBEQkdIRVgKKyMgIGRlZmluZSBEQkdIRVgoREJHRklMRSwgTVNHLCBMRU4pIFwKK3sgaWYgKHNvYXApXAorICB7IGlmICghc29hcC0+ZmRlYnVnW1NPQVBfSU5ERVhfIyNEQkdGSUxFXSlcCisgICAgICBzb2FwX29wZW5fbG9nZmlsZShzb2FwLCBTT0FQX0lOREVYXyMjREJHRklMRSk7XAorICAgIGlmIChzb2FwLT5mZGVidWdbU09BUF9JTkRFWF8jI0RCR0ZJTEVdKVwKKyAgICB7IGludCBpOyBjaGFyICpzO1wKKyAgICAgIGZvciAocyA9IChjaGFyKikoTVNHKSwgaSA9IChMRU4pOyBpOyBpLS0pXAorICAgICAgICBmcHJpbnRmKHNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYXyMjREJHRklMRV0sICIlMi4yaGhYICAiLCAqcysrKTtcCisgICAgICBmZmx1c2goc29hcC0+ZmRlYnVnW1NPQVBfSU5ERVhfIyNEQkdGSUxFXSk7XAorICAgIH1cCisgIH1cCit9CisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgREJHTE9HKERCR0ZJTEUsIENNRCkKKyMgZGVmaW5lIERCR01TRyhEQkdGSUxFLCBNU0csIExFTikKKyMgZGVmaW5lIERCR0ZVTihGTkFNRSkKKyMgZGVmaW5lIERCR0ZVTjEoRk5BTUUsIEZNVCwgQVJHKQorIyBkZWZpbmUgREJHRlVOMihGTkFNRSwgRk1UMSwgQVJHMSwgRk1UMiwgQVJHMikKKyMgZGVmaW5lIERCR0ZVTjMoRk5BTUUsIEZNVDEsIEFSRzEsIEZNVDIsIEFSRzIsIEZNVDMsIEFSRzMpCisjIGRlZmluZSBEQkdIRVgoREJHRklMRSwgTVNHLCBMRU4pCisjZW5kaWYKKworLyogVUNTLTQgcmVxdWlyZXMgMzIgYml0cyAoMC03RkZGRkZGRiwgdGhlIHNpZ24gYml0IGlzIHVzZWQgYnkgZ1NPQVAgdG8gZGlzdGluZ3Vpc2ggWE1MIGVudGl0aWVzKSAqLwordHlwZWRlZiBzb2FwX2ludDMyIHNvYXBfd2NoYXI7CisKKy8qIG5hbWVzcGFjZSB0YWJsZSByb3cgKi8KK3N0cnVjdCBOYW1lc3BhY2UKK3sgY29uc3QgY2hhciAqaWQ7CisgIGNvbnN0IGNoYXIgKm5zOworICBjb25zdCBjaGFyICppbjsKKyAgY2hhciAqb3V0OworfTsKKworLyogbmFtZXNwYWNlIHN0YWNrICovCitzdHJ1Y3Qgc29hcF9ubGlzdAoreyBzdHJ1Y3Qgc29hcF9ubGlzdCAqbmV4dDsKKyAgdW5zaWduZWQgaW50IGxldmVsOyAvKiBuZXN0aW5nIGRlcHRoIGxldmVsICovCisgIHNob3J0IGluZGV4OyAvKiBjb3JyZXNwb25kaW5nIGVudHJ5IGluIG5zIG1hcHBpbmcgdGFibGUgKi8KKyAgY2hhciAqbnM7IC8qIG9ubHkgc2V0IHdoZW4gcGFyc2VkIG5zIFVSSSBpcyBub3QgaW4gdGhlIG5zIG1hcHBpbmcgdGFibGUgKi8KKyAgY2hhciBpZFsxXTsgLyogdGhlIGFjdHVhbCBzdHJpbmcgdmFsdWUgZmxvd3MgaW50byB0aGUgYWxsb2NhdGVkIHJlZ2lvbiBiZWxvdyB0aGlzIHN0cnVjdCAqLworfTsKKworLyogYmxvY2sgc3RhY2sgZm9yIG5lc3RlZCBibG9jayBhbGxvY2F0aW9ucyAqLworc3RydWN0IHNvYXBfYmxpc3QKK3sgc3RydWN0IHNvYXBfYmxpc3QgKm5leHQ7CisgIGNoYXIgKnB0cjsKKyAgc2l6ZV90IHNpemU7Cit9OworCisvKiBhcnJheSBsYXlvdXQgKi8KK3N0cnVjdCBzb2FwX2FycmF5Cit7IHZvaWQgKl9fcHRyOworICBpbnQgX19zaXplOworfTsKKworLyogcG9pbnRlciBzZXJpYWxpemF0aW9uIG1hbmFnZW1lbnQgKi8KK3N0cnVjdCBzb2FwX3BsaXN0Cit7IHN0cnVjdCBzb2FwX3BsaXN0ICpuZXh0OworICBjb25zdCB2b2lkICpwdHI7CisgIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphcnJheTsKKyAgaW50IHR5cGU7CisgIGludCBpZDsKKyAgY2hhciBtYXJrMTsKKyAgY2hhciBtYXJrMjsKK307CisKKy8qIGJsb2NrIGFsbG9jYXRpb24gZm9yIHBvaW50ZXIgc2VyaWFsaXphdGlvbiBtYW5hZ2VtZW50ICovCitzdHJ1Y3Qgc29hcF9wYmxrCit7IHN0cnVjdCBzb2FwX3BibGsgKm5leHQ7CisgIHN0cnVjdCBzb2FwX3BsaXN0IHBsaXN0W1NPQVBfUFRSQkxLXTsKK307CisKKyNpZmRlZiBTT0FQX0RFQlVHCisvKiBtYWxsb2MvZnJlZSB0cmFja2luZyBmb3IgZGVidWdnaW5nICovCitzdHJ1Y3Qgc29hcF9tbGlzdAoreyBzdHJ1Y3Qgc29hcF9tbGlzdCAqbmV4dDsKKyAgY29uc3Qgdm9pZCAqcHRyOworICBjb25zdCBjaGFyICpmaWxlOworICBpbnQgbGluZTsKKyAgc2hvcnQgbGl2ZTsKK307CisjZW5kaWYKKworLyogY2xhc3MgYWxsb2NhdGlvbiBsaXN0ICovCitzdHJ1Y3Qgc29hcF9jbGlzdAoreyBzdHJ1Y3Qgc29hcF9jbGlzdCAqbmV4dDsKKyAgdm9pZCAqcHRyOworICBpbnQgdHlwZTsKKyAgaW50IHNpemU7CisgIHZvaWQgKCpmZGVsZXRlKShzdHJ1Y3Qgc29hcF9jbGlzdCopOworfTsKKworLyogYXR0cmlidXRlcyAqLworc3RydWN0IHNvYXBfYXR0cmlidXRlCit7IHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqbmV4dDsKKyAgY2hhciAqdmFsdWU7CisgIHNpemVfdCBzaXplOworICBjaGFyICpuczsKKyAgc2hvcnQgdmlzaWJsZTsKKyAgY2hhciBuYW1lWzFdOyAvKiB0aGUgYWN0dWFsIG5hbWUgc3RyaW5nIGZsb3dzIGludG8gdGhlIGFsbG9jYXRlZCByZWdpb24gYmVsb3cgdGhpcyBzdHJ1Y3QgKi8KK307CisKK3N0cnVjdCBzb2FwX2Nvb2tpZQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKm5leHQ7CisgIGNoYXIgKm5hbWU7CisgIGNoYXIgKnZhbHVlOworICBjaGFyICpkb21haW47CisgIGNoYXIgKnBhdGg7CisgIGxvbmcgZXhwaXJlOwkJLyogY2xpZW50LXNpZGU6IGxvY2FsIHRpbWUgdG8gZXhwaXJlOyBzZXJ2ZXItc2lkZTogc2Vjb25kcyB0byBleHBpcmUgKi8KKyAgdW5zaWduZWQgaW50IHZlcnNpb247CisgIHNob3J0IHNlY3VyZTsKKyAgc2hvcnQgc2Vzc2lvbjsJLyogc2VydmVyLXNpZGUgKi8KKyAgc2hvcnQgZW52OwkJLyogc2VydmVyLXNpZGU6IGdvdCBjb29raWUgZnJvbSBjbGllbnQgYW5kIHNob3VsZCBub3QgYmUgKHJlKXNlbmQgKi8KKyAgc2hvcnQgbW9kaWZpZWQ7CS8qIHNlcnZlci1zaWRlOiBjbGllbnQgY29va2llIHdhcyBtb2RpZmllZCBhbmQgc2hvdWxkIGJlIHNlbmQgKi8KK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqIFNPQVBfRk1BQzIgc29hcF9uZXh0X211bHRpcGFydChzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKTsKKworY2xhc3Mgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3IKK3sgcHVibGljOgorICBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBzb2FwX211bHRpcGFydF9pdGVyYXRvciYgaXRlcikgY29uc3QKKyAgICB7IHJldHVybiBjb250ZW50ID09IGl0ZXIuY29udGVudDsgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3Qgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3ImIGl0ZXIpIGNvbnN0CisgICAgeyByZXR1cm4gY29udGVudCAhPSBpdGVyLmNvbnRlbnQ7IH0KKyAgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICZvcGVyYXRvciooKSBjb25zdAorICAgIHsgcmV0dXJuICpjb250ZW50OyB9CisgIHNvYXBfbXVsdGlwYXJ0X2l0ZXJhdG9yICZvcGVyYXRvcisrKCkKKyAgICB7IGNvbnRlbnQgPSBzb2FwX25leHRfbXVsdGlwYXJ0KGNvbnRlbnQpOyByZXR1cm4gKnRoaXM7IH0KKyAgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3IoKSA6IGNvbnRlbnQoTlVMTCkKKyAgICB7IH0KKyAgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3Ioc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpwKSA6IGNvbnRlbnQocCkKKyAgICB7IH0KK307CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU5FUgorc3RydWN0IHNvYXBfZGltZQoreyBzaXplX3QgY291bnQ7CisgIHNpemVfdCBzaXplOworICBzaXplX3QgY2h1bmtzaXplOworICBzaXplX3QgYnVmbGVuOworICBjaGFyIGZsYWdzOworICBjaGFyICpwdHI7CisgIGNvbnN0IGNoYXIgKmlkOworICBjb25zdCBjaGFyICp0eXBlOworICBjb25zdCBjaGFyICpvcHRpb25zOworICBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmxpc3Q7CQkvKiBsaXN0IG9mIERJTUUgYXR0YWNobWVudHMgcmVjZWl2ZWQgKi8KKyAgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpmaXJzdCwgKmxhc3Q7CS8qIHRlbXBvcmFyeSBpbi9vdXQgcXVldWUgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworICBzb2FwX211bHRpcGFydF9pdGVyYXRvciBiZWdpbigpCisgICAgeyBzb2FwX211bHRpcGFydF9pdGVyYXRvciBpdGVyKGxpc3QpOyByZXR1cm4gaXRlcjsgfTsKKyAgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3IgZW5kKCkKKyAgICB7IHNvYXBfbXVsdGlwYXJ0X2l0ZXJhdG9yIGl0ZXIoTlVMTCk7IHJldHVybiBpdGVyOyB9OworI2VuZGlmCit9OworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK3N0cnVjdCBzb2FwX21pbWUKK3sgY2hhciAqYm91bmRhcnk7CQkJLyogTUlNRSBib3VuZGFyeSAqLworICBjb25zdCBjaGFyICpzdGFydDsJCQkvKiBNSU1FIHN0YXJ0IElEICovCisgIHN0cnVjdCBzb2FwX211bHRpcGFydCAqbGlzdDsJCS8qIGxpc3Qgb2YgTUlNRSBhdHRhY2htZW50cyByZWNlaXZlZCAqLworICBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmZpcnN0LCAqbGFzdDsJLyogdGVtcG9yYXJ5IGluL291dCBxdWV1ZSAqLworI2lmZGVmIF9fY3BsdXNwbHVzCisgIHNvYXBfbXVsdGlwYXJ0X2l0ZXJhdG9yIGJlZ2luKCkKKyAgICB7IHNvYXBfbXVsdGlwYXJ0X2l0ZXJhdG9yIGl0ZXIobGlzdCk7IHJldHVybiBpdGVyOyB9OworICBzb2FwX211bHRpcGFydF9pdGVyYXRvciBlbmQoKQorICAgIHsgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3IgaXRlcihOVUxMKTsgcmV0dXJuIGl0ZXI7IH07CisjZW5kaWYKK307CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU5FUgorLyogUkZDMjA0NSBNSU1FIGNvbnRlbnQgdHJhbnNmZXIgZW5jb2RpbmdzICovCitlbnVtIHNvYXBfbWltZV9lbmNvZGluZworeyBTT0FQX01JTUVfTk9ORSwKKyAgU09BUF9NSU1FXzdCSVQsCisgIFNPQVBfTUlNRV84QklULAorICBTT0FQX01JTUVfQklOQVJZLAorICBTT0FQX01JTUVfUVVPVEVEX1BSSU5UQUJMRSwKKyAgU09BUF9NSU1FX0JBU0U2NCwKKyAgU09BUF9NSU1FX0lFVEZfVE9LRU4sCisgIFNPQVBfTUlNRV9YX1RPS0VOCit9OworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKKy8qIERJTUUvTUlNRSBtdWx0aXBhcnQgbGlzdCAqLworc3RydWN0IHNvYXBfbXVsdGlwYXJ0Cit7IHN0cnVjdCBzb2FwX211bHRpcGFydCAqbmV4dDsKKyAgY2hhciAqcHRyOwkJCQkvKiBwb2ludHMgdG8gcmF3IGRhdGEgY29udGVudCAqLworICBzaXplX3Qgc2l6ZTsJCQkJLyogc2l6ZSBvZiBkYXRhIGNvbnRlbnQgKi8KKyAgY29uc3QgY2hhciAqaWQ7CQkJLyogRElNRS9NSU1FIGNvbnRlbnQgSUQgb3IgZm9ybSBkYXRhIG5hbWUgKi8KKyAgY29uc3QgY2hhciAqdHlwZTsJCQkvKiBESU1FL01JTUUgdHlwZSAoTUlNRSB0eXBlIGZvcm1hdCkgKi8KKyAgY29uc3QgY2hhciAqb3B0aW9uczsJCQkvKiBESU1FIG9wdGlvbnMgKi8KKyAgZW51bSBzb2FwX21pbWVfZW5jb2RpbmcgZW5jb2Rpbmc7CS8qIE1JTUUgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyAqLworICBjb25zdCBjaGFyICpsb2NhdGlvbjsJCQkvKiBNSU1FIENvbnRlbnQtTG9jYXRpb24gKG9wdGlvbmFsKSAqLworICBjb25zdCBjaGFyICpkZXNjcmlwdGlvbjsJCS8qIE1JTUUgQ29udGVudC1EZXNjcmlwdGlvbiAob3B0aW9uYWwpICovCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgdHlwZWRlZiBzb2FwX211bHRpcGFydF9pdGVyYXRvciBpdGVyYXRvcjsKKyNlbmRpZgorfTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTkVSCisvKiBhdHRhY2htZW50IERJTUUgYW5kIE1UT00gWE9QIGZvcndhcmRpbmcgKi8KK3N0cnVjdCBzb2FwX3hsaXN0Cit7IHN0cnVjdCBzb2FwX3hsaXN0ICpuZXh0OworICB1bnNpZ25lZCBjaGFyICoqcHRyOworICBpbnQgKnNpemU7CisgIGNoYXIgKmlkOworICBjaGFyICoqdHlwZTsKKyAgY2hhciAqKm9wdGlvbnM7Cit9OworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZmRlZiBfX2NwbHVzcGx1cworY2xhc3Mgc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yCit7IHB1YmxpYzoKKyAgc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAqYXR0OworICBjb25zdCBjaGFyICpuc3RyOworICBjb25zdCBjaGFyICpuYW1lOworICBib29sIG9wZXJhdG9yPT0oY29uc3Qgc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3ImKSBjb25zdDsKKyAgc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAmb3BlcmF0b3IqKCkgY29uc3Q7CisgIHNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvciAmb3BlcmF0b3IrKygpOworICBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IoKTsKKyAgc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUqKTsKKyAgfnNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcigpOworfTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK3N0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUKK3sgc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAqbmV4dDsKKyAgY29uc3QgY2hhciAqbnN0cjsKKyAgY2hhciAqbmFtZTsKKyAgY2hhciAqZGF0YTsKKyAgd2NoYXJfdCAqd2lkZTsKKyAgc3RydWN0IHNvYXAgKnNvYXA7CisjaWZkZWYgX19jcGx1c3BsdXMKKyAgdHlwZWRlZiBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IgaXRlcmF0b3I7CisgIHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgJnNldChjb25zdCBjaGFyICpuc3RyLCBjb25zdCBjaGFyICpuYW1lKTsJLyogc2V0IG5hbWVzcGFjZSBhbmQgbmFtZSAqLworICBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICZzZXQoY29uc3QgY2hhciAqZGF0YSk7CQkvKiBzZXQgZGF0YSAqLworICBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IgYmVnaW4oKTsKKyAgc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yIGVuZCgpOworICBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IgZmluZChjb25zdCBjaGFyICpuc3RyLCBjb25zdCBjaGFyICpuYW1lKTsKKyAgdm9pZCB1bmxpbmsoKTsKKyAgc29hcF9kb21fYXR0cmlidXRlKCk7CisgIHNvYXBfZG9tX2F0dHJpYnV0ZShzdHJ1Y3Qgc29hcCAqc29hcCk7CisgIHNvYXBfZG9tX2F0dHJpYnV0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbnN0ciwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZGF0YSk7CisgIH5zb2FwX2RvbV9hdHRyaWJ1dGUoKTsKKyNlbmRpZgorfTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZkZWYgX19jcGx1c3BsdXMKK2NsYXNzIHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IKK3sgcHVibGljOgorICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqZWx0OworICBjb25zdCBjaGFyICpuc3RyOworICBjb25zdCBjaGFyICpuYW1lOworICBpbnQgdHlwZTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3ImKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3ImKSBjb25zdDsKKyAgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgJm9wZXJhdG9yKigpIGNvbnN0OworICBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yICZvcGVyYXRvcisrKCk7CisgIHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IoKTsKKyAgc29hcF9kb21fZWxlbWVudF9pdGVyYXRvcihzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCopOworICB+c29hcF9kb21fZWxlbWVudF9pdGVyYXRvcigpOworfTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK3N0cnVjdCBzb2FwX2RvbV9lbGVtZW50Cit7IHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICpuZXh0OwkvKiBuZXh0IHNpYmxpbmcgKi8KKyAgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKnBybnQ7CS8qIHBhcmVudCAqLworICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqZWx0czsJLyogbGlzdCBvZiBjaGlsZCBlbGVtZW50cyAqLworICBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICphdHRzOwkvKiBsaXN0IG9mIGF0dHJpYnV0ZXMgKi8KKyAgY29uc3QgY2hhciAqbnN0cjsJCQkvKiBuYW1lc3BhY2Ugc3RyaW5nICovCisgIGNoYXIgKm5hbWU7CQkJCS8qIGVsZW1lbnQgdGFnIG5hbWUgKi8KKyAgY2hhciAqZGF0YTsJCQkJLyogZWxlbWVudCBjb250ZW50IGRhdGEgKHdpdGggU09BUF9DX1VURlNUUklORyBmbGFnIHNldCkgKi8KKyAgd2NoYXJfdCAqd2lkZTsJCQkvKiBlbGVtZW50IGNvbnRlbnQgZGF0YSAqLworICBpbnQgdHlwZTsJCQkJLyogb3B0aW9uYWw6IHNlcmlhbGl6ZWQgQy9DKysgZGF0YSB0eXBlICovCisgIHZvaWQgKm5vZGU7CQkJCS8qIG9wdGlvbmFsOiBwb2ludGVyIHRvIHNlcmlhbGl6ZWQgQy9DKysgZGF0YSAqLworICBjaGFyICpoZWFkOwkJCQkvKiBsZWFkaW5nIHdoaXRlc3BhY2UgdG8gc3RhcnQgdGFnICovCisgIGNoYXIgKnRhaWw7CQkJCS8qIGxlYWRpbmcgd2hpdGVzcGFjZSB0byBlbmQgdGFnICovCisgIHN0cnVjdCBzb2FwICpzb2FwOwkJCS8qIHNvYXAgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBub2RlICovCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgdHlwZWRlZiBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yIGl0ZXJhdG9yOworICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAmc2V0KGNvbnN0IGNoYXIgKm5zdHIsIGNvbnN0IGNoYXIgKm5hbWUpOworICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAmc2V0KGNvbnN0IGNoYXIgKmRhdGEpOworICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAmc2V0KHZvaWQgKm5vZGUsIGludCB0eXBlKTsKKyAgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgJmFkZChzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCopOworICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAmYWRkKHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50Jik7CisgIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICZhZGQoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSopOworICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAmYWRkKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUmKTsKKyAgc29hcF9kb21fZWxlbWVudF9pdGVyYXRvciBiZWdpbigpOworICBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yIGVuZCgpOworICBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yIGZpbmQoY29uc3QgY2hhciAqbnN0ciwgY29uc3QgY2hhciAqbmFtZSk7CisgIHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IgZmluZChpbnQgdHlwZSk7CisgIHZvaWQgdW5saW5rKCk7CisgIHNvYXBfZG9tX2VsZW1lbnQoKTsKKyAgc29hcF9kb21fZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCk7CisgIHNvYXBfZG9tX2VsZW1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5zdHIsIGNvbnN0IGNoYXIgKm5hbWUpOworICBzb2FwX2RvbV9lbGVtZW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuc3RyLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkYXRhKTsKKyAgc29hcF9kb21fZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbnN0ciwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqbm9kZSwgaW50IHR5cGUpOworICB+c29hcF9kb21fZWxlbWVudCgpOworI2VuZGlmCit9OworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqIFNPQVBfRk1BQzIgc29hcF9kb21fbmV4dF9lbGVtZW50KHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICplbHQpOworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICogU09BUF9GTUFDMiBzb2FwX2RvbV9uZXh0X2F0dHJpYnV0ZShzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICphdHQpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiAhZGVmaW5lZChXSVRIX0xFQU4pCit9CitleHRlcm4gc3RkOjpvc3RyZWFtICZvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYsIGNvbnN0IHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50Jik7CitleHRlcm4gc3RkOjppc3RyZWFtICZvcGVyYXRvcj4+KHN0ZDo6aXN0cmVhbSYsIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50Jik7CitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3Qgc29hcAoreyBzaG9ydCBzdGF0ZTsJCQkvKiAwID0gdW5pbml0aWFsaXplZCwgMSA9IGluaXRpYWxpemVkLCAyID0gY29weSBvZiBhbm90aGVyIHNvYXAgc3RydWN0ICovCisgIHNob3J0IHZlcnNpb247CQkvKiAxID0gU09BUDEuMSBhbmQgMiA9IFNPQVAxLjIgKHNldCBhdXRvbWF0aWNhbGx5IGZyb20gbmFtZXNwYWNlIFVSSSBpbiBuc21hcCB0YWJsZSkgKi8KKyAgc29hcF9tb2RlIG1vZGU7CisgIHNvYXBfbW9kZSBpbW9kZTsKKyAgc29hcF9tb2RlIG9tb2RlOworICBjb25zdCBjaGFyICpmbG9hdF9mb3JtYXQ7CS8qIHVzZXItZGVmaW5hYmxlIGZvcm1hdCBzdHJpbmcgZm9yIGZsb2F0cyAoPDEwMjQgY2hhcnMpICovCisgIGNvbnN0IGNoYXIgKmRvdWJsZV9mb3JtYXQ7CS8qIHVzZXItZGVmaW5hYmxlIGZvcm1hdCBzdHJpbmcgZm9yIGRvdWJsZXMgKDwxMDI0IGNoYXJzKSAqLworICBjb25zdCBjaGFyICpkaW1lX2lkX2Zvcm1hdDsJLyogdXNlci1kZWZpbmFibGUgZm9ybWF0IHN0cmluZyBmb3IgaW50ZWdlciBESU1FIGlkICg8U09BUF9UQUdMRU4gY2hhcnMpICovCisgIGNvbnN0IGNoYXIgKmh0dHBfdmVyc2lvbjsJLyogSFRUUCB2ZXJzaW9uIHVzZWQgIjEuMCIgb3IgIjEuMSIgKi8KKyAgY29uc3QgY2hhciAqaHR0cF9jb250ZW50OwkvKiBvcHRpb25hbCBjdXN0b20gcmVzcG9uc2UgY29udGVudCB0eXBlICh3aXRoIFNPQVBfRklMRSkgKi8KKyAgY29uc3QgY2hhciAqZW5jb2RpbmdTdHlsZTsJLyogZGVmYXVsdCA9IE5VTEwgd2hpY2ggbWVhbnMgdGhhdCBTT0FQIGVuY29kaW5nIGlzIHVzZWQgKi8KKyAgY29uc3QgY2hhciAqYWN0b3I7CQkvKiBTT0FQLUVOVjphY3RvciBvciByb2xlIGF0dHJpYnV0ZSB2YWx1ZSAqLworICBpbnQgcmVjdl90aW1lb3V0OwkJLyogd2hlbiA+IDAsIGdpdmVzIHNvY2tldCByZWN2IHRpbWVvdXQgaW4gc2Vjb25kcywgPCAwIGluIHVzZWMgKi8KKyAgaW50IHNlbmRfdGltZW91dDsJCS8qIHdoZW4gPiAwLCBnaXZlcyBzb2NrZXQgc2VuZCB0aW1lb3V0IGluIHNlY29uZHMsIDwgMCBpbiB1c2VjICovCisgIGludCBjb25uZWN0X3RpbWVvdXQ7CQkvKiB3aGVuID4gMCwgZ2l2ZXMgc29ja2V0IGNvbm5lY3QoKSB0aW1lb3V0IGluIHNlY29uZHMsIDwgMCBpbiB1c2VjICovCisgIGludCBhY2NlcHRfdGltZW91dDsJCS8qIHdoZW4gPiAwLCBnaXZlcyBzb2NrZXQgYWNjZXB0KCkgdGltZW91dCBpbiBzZWNvbmRzLCA8IDAgaW4gdXNlYyAqLworICBpbnQgc29ja2V0X2ZsYWdzOwkJLyogc29ja2V0IHJlY3YoKSBhbmQgc2VuZCgpIGZsYWdzLCBlLmcuIHNldCB0byBNU0dfTk9TSUdOQUwgdG8gZGlzYWJsZSBzaWdwaXBlICovCisgIGludCBjb25uZWN0X2ZsYWdzOwkJLyogY29ubmVjdCgpIFNPTF9TT0NLRVQgc29ja29wdCBmbGFncywgZS5nLiBzZXQgdG8gU09fREVCVUcgdG8gZGVidWcgc29ja2V0ICovCisgIGludCBiaW5kX2ZsYWdzOwkJLyogYmluZCgpIFNPTF9TT0NLRVQgc29ja29wdCBmbGFncywgZS5nLiBzZXQgdG8gU09fUkVVU0VBRERSIHRvIGVuYWJsZSByZXVzZSAqLworICBpbnQgYWNjZXB0X2ZsYWdzOwkJLyogYWNjZXB0KCkgU09MX1NPQ0tFVCBzb2Nrb3B0IGZsYWdzICovCisgIGNvbnN0IHN0cnVjdCBOYW1lc3BhY2UgKm5hbWVzcGFjZXM7CS8qIFBvaW50ZXIgdG8gZ2xvYmFsIG5hbWVzcGFjZSBtYXBwaW5nIHRhYmxlICovCisgIHN0cnVjdCBOYW1lc3BhY2UgKmxvY2FsX25hbWVzcGFjZXM7CS8qIExvY2FsIG5hbWVzcGFjZSBtYXBwaW5nIHRhYmxlICovCisgIHN0cnVjdCBzb2FwX25saXN0ICpubGlzdDsJLyogbmFtZXNwYWNlIHN0YWNrICovCisgIHN0cnVjdCBzb2FwX2JsaXN0ICpibGlzdDsJLyogYmxvY2sgYWxsb2NhdGlvbiBzdGFjayAqLworICBzdHJ1Y3Qgc29hcF9jbGlzdCAqY2xpc3Q7CS8qIGNsYXNzIGluc3RhbmNlIGFsbG9jYXRpb24gbGlzdCAqLworICB2b2lkICphbGlzdDsJCQkvKiBtZW1vcnkgYWxsb2NhdGlvbiAobWFsbG9jKSBsaXN0ICovCisgIHN0cnVjdCBzb2FwX2lsaXN0ICppaHRbU09BUF9JREhBU0hdOworICBzdHJ1Y3Qgc29hcF9wbGlzdCAqcGh0W1NPQVBfUFRSSEFTSF07CisgIHN0cnVjdCBzb2FwX3BibGsgKnBibGs7CS8qIHBsaXN0IGJsb2NrIGFsbG9jYXRpb24gKi8KKyAgc2hvcnQgcGlkeDsJCQkvKiBwbGlzdCBibG9jayBhbGxvY2F0aW9uICovCisgIHN0cnVjdCBTT0FQX0VOVl9fSGVhZGVyICpoZWFkZXI7CisgIHN0cnVjdCBTT0FQX0VOVl9fRmF1bHQgKmZhdWx0OworICBpbnQgaWRudW07CisgIHZvaWQgKnVzZXI7CQkJLyogdG8gcGFzcyB1c2VyLWRlZmluZWQgZGF0YSAqLworICBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnBsdWdpbnM7CS8qIGxpbmtlZCBsaXN0IG9mIHBsdWctaW4gZGF0YSAqLworICBjaGFyICp1c2VyaWQ7CQkJLyogSFRUUCBCYXNpYyBhdXRob3JpemF0aW9uIHVzZXJpZCAqLworICBjaGFyICpwYXNzd2Q7CQkJLyogSFRUUCBCYXNpYyBhdXRob3JpemF0aW9uIHBhc3N3ZCAqLworICBpbnQgKCpmcG9zdCkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworICBpbnQgKCpmZ2V0KShzdHJ1Y3Qgc29hcCopOworICBpbnQgKCpmZm9ybSkoc3RydWN0IHNvYXAqKTsKKyAgaW50ICgqZnBvc3RoZHIpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKyAgaW50ICgqZnJlc3BvbnNlKShzdHJ1Y3Qgc29hcCosIGludCwgc2l6ZV90KTsKKyAgaW50ICgqZnBhcnNlKShzdHJ1Y3Qgc29hcCopOworICBpbnQgKCpmcGFyc2VoZHIpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKyAgaW50ICgqZnJlc29sdmUpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHN0cnVjdCBpbl9hZGRyKiBpbmFkZHIpOworICBpbnQgKCpmY29ubmVjdCkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGludCk7CisgIGludCAoKmZkaXNjb25uZWN0KShzdHJ1Y3Qgc29hcCopOworICBpbnQgKCpmY2xvc2Vzb2NrZXQpKHN0cnVjdCBzb2FwKiwgU09BUF9TT0NLRVQpOworICBpbnQgKCpmc2h1dGRvd25zb2NrZXQpKHN0cnVjdCBzb2FwKiwgU09BUF9TT0NLRVQsIGludCk7CisgIGludCAoKmZvcGVuKShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgaW50KTsKKyAgaW50ICgqZmFjY2VwdCkoc3RydWN0IHNvYXAqLCBpbnQsIHN0cnVjdCBzb2NrYWRkciosIGludCAqbik7CisgIGludCAoKmZjbG9zZSkoc3RydWN0IHNvYXAqKTsKKyAgaW50ICgqZnNlbmQpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHNpemVfdCk7CisgIHNpemVfdCAoKmZyZWN2KShzdHJ1Y3Qgc29hcCosIGNoYXIqLCBzaXplX3QpOworICBpbnQgKCpmcG9sbCkoc3RydWN0IHNvYXAqKTsKKyAgdm9pZCAoKmZzZXRlcnJvcikoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICoqYywgY29uc3QgY2hhciAqKnMpOworICBpbnQgKCpmaWdub3JlKShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKKyAgaW50ICgqZnNlcnZlbG9vcCkoc3RydWN0IHNvYXAqKTsKKyAgdm9pZCAqKCpmcGx1Z2luKShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaW50ICgqZnByZXBhcmVpbml0KShzdHJ1Y3Qgc29hcCopOworICBpbnQgKCpmcHJlcGFyZXNlbmQpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHNpemVfdCk7CisgIGludCAoKmZwcmVwYXJlcmVjdikoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc2l6ZV90KTsKKyAgaW50ICgqZnByZXBhcmVmaW5hbCkoc3RydWN0IHNvYXAqKTsKKyAgdm9pZCAqKCpmZGltZXJlYWRvcGVuKShzdHJ1Y3Qgc29hcCosIHZvaWQqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKyAgdm9pZCAqKCpmZGltZXdyaXRlb3Blbikoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKyAgdm9pZCAoKmZkaW1lcmVhZGNsb3NlKShzdHJ1Y3Qgc29hcCosIHZvaWQqKTsKKyAgdm9pZCAoKmZkaW1ld3JpdGVjbG9zZSkoc3RydWN0IHNvYXAqLCB2b2lkKik7CisgIHNpemVfdCAoKmZkaW1lcmVhZCkoc3RydWN0IHNvYXAqLCB2b2lkKiwgY2hhciosIHNpemVfdCk7CisgIGludCAoKmZkaW1ld3JpdGUpKHN0cnVjdCBzb2FwKiwgdm9pZCosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworI2VuZGlmCisgIGludCBtYXN0ZXI7CisgIGludCBzb2NrZXQ7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgIWRlZmluZWQoV0lUSF9MRUFOKQorICBzdGQ6Om9zdHJlYW0gKm9zOworICBzdGQ6OmlzdHJlYW0gKmlzOworI2Vsc2UKKyAgdm9pZCAqb3M7CS8qIHByZXNlcnZlIGFsaWdubWVudCAqLworICB2b2lkICppczsJLyogcHJlc2VydmUgYWxpZ25tZW50ICovCisjZW5kaWYKKyNpZm5kZWYgVU5ERVJfQ0UKKyAgaW50IHNlbmRmZDsKKyAgaW50IHJlY3ZmZDsKKyNlbHNlCisgIEZJTEUgKnNlbmRmZDsKKyAgRklMRSAqcmVjdmZkOworI2VuZGlmCisjaWZkZWYgV0lOMzIKKyAgY2hhciBlcnJvcnN0clsyNTZdOwkvKiBidWYgZm9yIEZvcm1hdE1lc3NhZ2UoKSAqLworI2VuZGlmCisgIHNpemVfdCBidWZpZHg7CS8qIGluZGV4IGluIHNvYXAuYnVmW10gKi8KKyAgc2l6ZV90IGJ1ZmxlbjsJLyogbGVuZ3RoIG9mIHNvYXAuYnVmW10gY29udGVudCAqLworICBzb2FwX3djaGFyIGFoZWFkOwkvKiBwYXJzZXIgbG9va2FoZWFkICovCisgIHNob3J0IGNkYXRhOwkJLyogQ0RBVEEgcGFyc2VyIHN0YXRlICovCisgIHNob3J0IGJvZHk7CQkvKiBwYXJzZWQgWE1MIGVsZW1lbnQgaGFzIGEgYm9keSBvciBub3QgKi8KKyAgdW5zaWduZWQgaW50IGxldmVsOwkvKiBYTUwgbmVzdGluZyBsZXZlbCAqLworICBzaXplX3QgY291bnQ7CQkvKiBtZXNzYWdlIGxlbmd0aCBjb3VudGVyICovCisgIHNpemVfdCBsZW5ndGg7CS8qIG1lc3NhZ2UgbGVuZ3RoIGFzIHNldCBieSBIVFRQIGhlYWRlciAqLworI2lmZGVmIFdJVEhfRkFTVAorICBjaGFyICpsYWJidWY7CQkvKiBsb29rLWFzaWRlIGJ1ZmZlciAqLworICBzaXplX3QgbGFibGVuOwkvKiBsb29rLWFzaWRlIGJ1ZmZlciBhbGxvY2F0ZWQgbGVuZ3RoICovCisgIHNpemVfdCBsYWJpZHg7CS8qIGxvb2stYXNpZGUgYnVmZmVyIGluZGV4IHRvIGF2YWlsYWJsZSBwYXJ0ICovCisjZW5kaWYKKyAgY2hhciBidWZbU09BUF9CVUZMRU5dOy8qIHNlbmQgYW5kIHJlY2VpdmUgYnVmZmVyICovCisgIGNoYXIgdG1wYnVmWzEwMjRdOwkvKiBpbi9vdXRwdXQgYnVmZmVyIGZvciBIVFRQIGhlYWRlcnMsIHNpbXBsZVR5cGUgdmFsdWVzLCBhdHRyaWJ1dGUgbmFtZXMsIGFuZCBESU1FID49MTAyNCBieXRlcyAqLworICBjaGFyIG1zZ2J1ZlsxMDI0XTsJLyogb3V0cHV0IGJ1ZmZlciBmb3IgKGVycm9yKSBtZXNzYWdlcyA8PTEwMjQgYnl0ZXMgKi8KKyAgY2hhciB0YWdbU09BUF9UQUdMRU5dOworICBjaGFyIGlkW1NPQVBfVEFHTEVOXTsKKyAgY2hhciBocmVmW1NPQVBfVEFHTEVOXTsKKyAgY2hhciB0eXBlW1NPQVBfVEFHTEVOXTsKKyAgY2hhciBhcnJheVR5cGVbU09BUF9UQUdMRU5dOworICBjaGFyIGFycmF5U2l6ZVtTT0FQX1RBR0xFTl07CisgIGNoYXIgYXJyYXlPZmZzZXRbU09BUF9UQUdMRU5dOworICBzaG9ydCBvdGhlcjsKKyAgc2hvcnQgcG9zaXRpb247CisgIGludCBwb3NpdGlvbnNbU09BUF9NQVhESU1TXTsKKyAgc2hvcnQgcm9vdDsKKyAgc3RydWN0IHNvYXBfYXR0cmlidXRlICphdHRyaWJ1dGVzOwkvKiBhdHRyaWJ1dGUgbGlzdCAqLworICBzaG9ydCBlbmNvZGluZzsJLyogd2hlbiBzZXQsIG91dHB1dCBlbmNvZGluZ1N0eWxlICovCisgIHNob3J0IG11c3RVbmRlcnN0YW5kOwkvKiBhIG11c3RVbmRlcnN0YW5kIGVsZW1lbnQgd2FzIHBhcnNlZCBvciBpcyBvdXRwdXQgKi8KKyAgc2hvcnQga2VlcF9hbGl2ZTsJLyogY29ubmVjdGlvbiBzaG91bGQgYmUga2VwdCBvcGVuICovCisgIHNob3J0IG51bGw7CQkvKiBwYXJzZWQgWE1MIGlzIHhzaTpuaWwgKi8KKyAgc2hvcnQgbnM7CQkvKiB3aGVuIG5vdCBzZXQsIG91dHB1dCBmdWxsIHhtbG5zIGJpbmRpbmdzICovCisgIHNob3J0IHBhcnQ7CQkvKiBwYXJzaW5nIHN0YXRlICovCisgIHNob3J0IGFsbG9jZWQ7CisgIHNob3J0IHBlZWtlZDsKKyAgc2l6ZV90IGNodW5rc2l6ZTsKKyAgc2l6ZV90IGNodW5rYnVmbGVuOworICBjaGFyIGVuZHBvaW50W1NPQVBfVEFHTEVOXTsKKyAgY2hhciBwYXRoW1NPQVBfVEFHTEVOXTsKKyAgY2hhciBob3N0W1NPQVBfVEFHTEVOXTsKKyAgY2hhciAqYWN0aW9uOworICBjaGFyICphdXRocmVhbG07CQkvKiBIVFRQIGF1dGhlbnRpY2F0aW9uIHJlYWxtICovCisgIGNoYXIgKnByb2xvZzsJCQkvKiBYTUwgZGVjbGFyYXRpb24gcHJvbG9nICovCisgIHVuc2lnbmVkIGxvbmcgaXA7CQkvKiBJUCBudW1iZXIgKi8KKyAgaW50IHBvcnQ7CQkJLyogcG9ydCBudW1iZXIgKi8KKyAgdW5zaWduZWQgaW50IG1heF9rZWVwX2FsaXZlOworICBjb25zdCBjaGFyICpwcm94eV9ob3N0OwkvKiBQcm94eSBTZXJ2ZXIgaG9zdCBuYW1lICovCisgIGludCBwcm94eV9wb3J0OwkJLyogUHJveHkgU2VydmVyIHBvcnQgKGRlZmF1bHQgPSA4MDgwKSAqLworICBjb25zdCBjaGFyICpwcm94eV91c2VyaWQ7CS8qIFByb3h5IEF1dGhvcml6YXRpb24gdXNlciBuYW1lICovCisgIGNvbnN0IGNoYXIgKnByb3h5X3Bhc3N3ZDsJLyogUHJveHkgQXV0aG9yaXphdGlvbiBwYXNzd29yZCAqLworICBpbnQgc3RhdHVzOwkJCS8qIC0xIHdoZW4gcmVxdWVzdCwgZWxzZSBlcnJvciBjb2RlIHRvIGJlIHJldHVybmVkIGJ5IHNlcnZlciAqLworICBpbnQgZXJyb3I7CisgIGludCBlcnJtb2RlOworICBpbnQgZXJybnVtOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqZG9tOworICBzdHJ1Y3Qgc29hcF9kaW1lIGRpbWU7CisgIHN0cnVjdCBzb2FwX21pbWUgbWltZTsKKyAgc3RydWN0IHNvYXBfeGxpc3QgKnhsaXN0OworI2VuZGlmCisjaWYgIWRlZmluZWQoV0lUSF9MRUFOKSB8fCBkZWZpbmVkKFNPQVBfREVCVUcpCisgIGNvbnN0IGNoYXIgKmxvZ2ZpbGVbU09BUF9NQVhMT0dTXTsKKyAgRklMRSAqZmRlYnVnW1NPQVBfTUFYTE9HU107CisgIHN0cnVjdCBzb2FwX21saXN0ICptaHRbU09BUF9QVFJIQVNIXTsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgY29uc3QgY2hhciAqYzE0bmluY2x1ZGU7CisgIGNvbnN0IGNoYXIgKmMxNG5leGNsdWRlOworICBzdHJ1Y3Qgc29hcF9jb29raWUgKmNvb2tpZXM7CisgIGNvbnN0IGNoYXIgKmNvb2tpZV9kb21haW47CisgIGNvbnN0IGNoYXIgKmNvb2tpZV9wYXRoOworICBpbnQgY29va2llX21heDsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZmRlZiBXSVRIX0lQVjYKKyAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgcGVlcjsJLyogSVB2Njogc2V0IGJ5IHNvYXBfYWNjZXB0IGFuZCBieSBVRFAgcmVjdiAqLworI2Vsc2UKKyAgc3RydWN0IHNvY2thZGRyX2luIHBlZXI7CS8qIElQdjQ6IHNldCBieSBzb2FwX2Nvbm5lY3Qvc29hcF9hY2NlcHQgYW5kIGJ5IFVEUCByZWN2ICovCisjZW5kaWYKKyAgc2l6ZV90IHBlZXJsZW47CisjZW5kaWYKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgaW50ICgqZnNzbGF1dGgpKHN0cnVjdCBzb2FwKik7CisgIGludCAoKmZzc2x2ZXJpZnkpKGludCwgWDUwOV9TVE9SRV9DVFgqKTsKKyAgQklPICpiaW87CisgIFNTTCAqc3NsOworICBTU0xfQ1RYICpjdHg7CisgIHNob3J0IHJlcXVpcmVfc2VydmVyX2F1dGg7CisgIHNob3J0IHJlcXVpcmVfY2xpZW50X2F1dGg7CisgIHNob3J0IHJzYTsJCQkvKiB3aGVuIHNldCwgdXNlIFJTQSBpbnN0ZWFkIG9mIERIICovCisgIGNvbnN0IGNoYXIgKmtleWZpbGU7CisgIGNvbnN0IGNoYXIgKnBhc3N3b3JkOworICBjb25zdCBjaGFyICpkaGZpbGU7CisgIGNvbnN0IGNoYXIgKmNhZmlsZTsKKyAgY29uc3QgY2hhciAqY2FwYXRoOworICBjb25zdCBjaGFyICpjcmxmaWxlOworICBjb25zdCBjaGFyICpyYW5kZmlsZTsKKyAgU1NMX1NFU1NJT04gKnNlc3Npb247CisgIGNoYXIgc2Vzc2lvbl9ob3N0W1NPQVBfVEFHTEVOXTsKKyAgaW50IHNlc3Npb25fcG9ydDsKKyNlbmRpZgorI2lmZGVmIFdJVEhfWkxJQgorICBzaG9ydCB6bGliX3N0YXRlOwkJLyogU09BUF9aTElCX05PTkUsIFNPQVBfWkxJQl9ERUZMQVRFLCBvciBTT0FQX1pMSUJfSU5GTEFURSAqLworICBzaG9ydCB6bGliX2luOwkJLyogU09BUF9aTElCX05PTkUsIFNPQVBfWkxJQl9ERUZMQVRFLCBvciBTT0FQX1pMSUJfR1pJUCAqLworICBzaG9ydCB6bGliX291dDsJCS8qIFNPQVBfWkxJQl9OT05FLCBTT0FQX1pMSUJfREVGTEFURSwgb3IgU09BUF9aTElCX0daSVAgKi8KKyAgel9zdHJlYW0gZF9zdHJlYW07CQkvKiBkZWNvbXByZXNzaW9uIHN0cmVhbSAqLworICBjaGFyIHpfYnVmW1NPQVBfQlVGTEVOXTsJLyogYnVmZmVyICovCisgIHNpemVfdCB6X2J1ZmxlbjsKKyAgdW5zaWduZWQgc2hvcnQgel9sZXZlbDsJLyogY29tcHJlc3Npb24gbGV2ZWwgdG8gYmUgdXNlZCAoMD1ub25lLCAxPWZhc3QgdG8gOT1iZXN0KSAqLworICB1TG9uZyB6X2NyYzsJCQkvKiBpbnRlcm5hbCBnemlwIGNyYyAqLworICBmbG9hdCB6X3JhdGlvX2luOwkJLyogZGV0ZWN0ZWQgY29tcHJlc3Npb24gcmF0aW8gY29tcHJlc3NlZF9sZW5ndGgvbGVuZ3RoIG9mIGluYm91bmQgbWVzc2FnZSAqLworICBmbG9hdCB6X3JhdGlvX291dDsJCS8qIGRldGVjdGVkIGNvbXByZXNzaW9uIHJhdGlvIGNvbXByZXNzZWRfbGVuZ3RoL2xlbmd0aCBvZiBvdXRib3VuZCBtZXNzYWdlICovCisjZW5kaWYKKyNpZmRlZiBXTVdfUlBNX0lPCisgIHZvaWQgKnJwbXJlcWlkOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorI2lmZGVmIF9fY3BsdXNwbHVzCisgIHNvYXAoKTsKKyAgc29hcChzb2FwX21vZGUpOworICBzb2FwKHNvYXBfbW9kZSwgc29hcF9tb2RlKTsKKyAgc29hcChzdHJ1Y3Qgc29hcCYpOworICB+c29hcCgpOworI2VuZGlmCisjZW5kaWYKK307CisKK3N0cnVjdCBzb2FwX2NvZGVfbWFwCit7IGxvbmcgY29kZTsKKyAgY29uc3QgY2hhciAqc3RyaW5nOworfTsKKworLyogZm9yd2FyZGluZyBsaXN0ICovCitzdHJ1Y3Qgc29hcF9mbGlzdAoreyBzdHJ1Y3Qgc29hcF9mbGlzdCAqbmV4dDsKKyAgaW50IHR5cGU7CisgIHZvaWQgKnB0cjsKKyAgdW5zaWduZWQgaW50IGxldmVsOworICBzaXplX3QgbGVuOworICB2b2lkICgqZmNvcHkpKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBzaXplX3QsIGNvbnN0IHZvaWQqLCBzaXplX3QpOworfTsKKworLyogaWQtcmVmIGZvcndhcmRpbmcgbGlzdCAqLworc3RydWN0IHNvYXBfaWxpc3QKK3sgc3RydWN0IHNvYXBfaWxpc3QgKm5leHQ7CisgIGludCB0eXBlOworICBzaXplX3Qgc2l6ZTsKKyAgdm9pZCAqbGluazsKKyAgdm9pZCAqY29weTsKKyAgc3RydWN0IHNvYXBfZmxpc3QgKmZsaXN0OworICB2b2lkICpwdHI7CisgIHVuc2lnbmVkIGludCBsZXZlbDsKKyAgY2hhciBpZFsxXTsgLyogdGhlIGFjdHVhbCBpZCBzdHJpbmcgdmFsdWUgZmxvd3MgaW50byB0aGUgYWxsb2NhdGVkIHJlZ2lvbiBiZWxvdyB0aGlzIHN0cnVjdCAqLworfTsKKworc3RydWN0IHNvYXBfcGx1Z2luCit7IHN0cnVjdCBzb2FwX3BsdWdpbiAqbmV4dDsKKyAgY29uc3QgY2hhciAqaWQ7CisgIHZvaWQgKmRhdGE7CisgIGludCAoKmZjb3B5KShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGx1Z2luICpkc3QsIHN0cnVjdCBzb2FwX3BsdWdpbiAqc3JjKTsKKyAgdm9pZCAoKmZkZWxldGUpKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnApOyAvKiBzaG91bGQgZGVsZXRlIGZpZWxkcyBvZiBwbHVnaW4gb25seSBhbmQgbm90IGZyZWUocCkgKi8KK307CisKKyNpZm5kZWYgV0lUSF9OT05BTUVTUEFDRVMKK2V4dGVybiBTT0FQX05NQUMgc3RydWN0IE5hbWVzcGFjZSBuYW1lc3BhY2VzW107CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU4KKyMgZGVmaW5lIHNvYXBfZ2V0MChzb2FwKSAoKChzb2FwKS0+YnVmaWR4Pj0oc29hcCktPmJ1ZmxlbiAmJiBzb2FwX3JlY3Yoc29hcCkpID8gRU9GIDogKHVuc2lnbmVkIGNoYXIpKHNvYXApLT5idWZbKHNvYXApLT5idWZpZHhdKQorIyBkZWZpbmUgc29hcF9nZXQxKHNvYXApICgoKHNvYXApLT5idWZpZHg+PShzb2FwKS0+YnVmbGVuICYmIHNvYXBfcmVjdihzb2FwKSkgPyBFT0YgOiAodW5zaWduZWQgY2hhcikoc29hcCktPmJ1Zlsoc29hcCktPmJ1ZmlkeCsrXSkKKyNlbHNlCitzb2FwX3djaGFyIHNvYXBfZ2V0MChzdHJ1Y3Qgc29hcCopOworc29hcF93Y2hhciBzb2FwX2dldDEoc3RydWN0IHNvYXAqKTsKKyNlbmRpZgorCisjZGVmaW5lIHNvYXBfcmV2Z2V0MShzb2FwKSAoKHNvYXApLT5idWZpZHgtLSkKKyNkZWZpbmUgc29hcF91bmdldChzb2FwLCBjKSAoKHNvYXApLT5haGVhZCA9IGMpCisjZGVmaW5lIHNvYXBfcmVnaXN0ZXJfcGx1Z2luKHNvYXAsIHBsdWdpbikgc29hcF9yZWdpc3Rlcl9wbHVnaW5fYXJnKHNvYXAsIHBsdWdpbiwgTlVMTCkKKyNkZWZpbmUgc29hcF9pbW9kZShzb2FwLCBuKSAoKHNvYXApLT5tb2RlID0gKHNvYXApLT5pbW9kZSA9IChuKSkKKyNkZWZpbmUgc29hcF9zZXRfaW1vZGUoc29hcCwgbikgKChzb2FwKS0+aW1vZGUgfD0gKG4pKQorI2RlZmluZSBzb2FwX2Nscl9pbW9kZShzb2FwLCBuKSAoKHNvYXApLT5pbW9kZSAmPSB+KG4pKQorI2RlZmluZSBzb2FwX29tb2RlKHNvYXAsIG4pICgoc29hcCktPm1vZGUgPSAoc29hcCktPm9tb2RlID0gKG4pKQorI2RlZmluZSBzb2FwX3NldF9vbW9kZShzb2FwLCBuKSAoKHNvYXApLT5vbW9kZSB8PSAobikpCisjZGVmaW5lIHNvYXBfY2xyX29tb2RlKHNvYXAsIG4pICgoc29hcCktPm9tb2RlICY9IH4obikpCisjZGVmaW5lIHNvYXBfc2V0X21vZGUoc29hcCwgbikgKChzb2FwKS0+aW1vZGUgfD0gKG4pLCAoc29hcCktPm9tb2RlIHw9IChuKSkKKyNkZWZpbmUgc29hcF9jbHJfbW9kZShzb2FwLCBuKSAoKHNvYXApLT5pbW9kZSAmPSB+KG4pLCAoc29hcCktPm9tb2RlICY9IH4obikpCisjZGVmaW5lIHNvYXBfZGVzdHJveShzb2FwKSBzb2FwX2RlbGV0ZSgoc29hcCksIE5VTEwpCisKKyNpZmRlZiBIQVZFX1NUUlJDSFIKKyMgZGVmaW5lIHNvYXBfc3RycmNocihzLCB0KSBzdHJyY2hyKHMsIHQpCisjZWxzZQorIFNPQVBfRk1BQzEgY2hhciogU09BUF9GTUFDMiBzb2FwX3N0cnJjaHIoY29uc3QgY2hhciAqcywgaW50IHQpOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NUUlRPTAorIyBkZWZpbmUgc29hcF9zdHJ0b2wocywgdCwgYikgc3RydG9sKHMsIHQsIGIpCisjZWxzZQorIFNPQVBfRk1BQzEgbG9uZyBTT0FQX0ZNQUMyIHNvYXBfc3RydG9sKGNvbnN0IGNoYXIgKnMsIGNoYXIgKip0LCBpbnQgYik7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RSVE9VTAorIyBkZWZpbmUgc29hcF9zdHJ0b3VsKHMsIHQsIGIpIHN0cnRvdWwocywgdCwgYikKKyNlbHNlCisgU09BUF9GTUFDMSB1bnNpZ25lZCBsb25nIFNPQVBfRk1BQzIgc29hcF9zdHJ0b3VsKGNvbnN0IGNoYXIgKnMsIGNoYXIgKip0LCBpbnQgYik7CisjZW5kaWYKKworI2lmIGRlZmluZWQoV0lUSF9PUEVOU1NMKQorIyBkZWZpbmUgc29hcF9yYW5kb20gc29hcF9yYW5kKCkKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9yYW5kKCk7CisjZWxpZiBkZWZpbmVkKEhBVkVfUkFORE9NKQorIyBkZWZpbmUgc29hcF9yYW5kb20gKGludClyYW5kb20oKQorI2Vsc2UKKyMgZGVmaW5lIHNvYXBfcmFuZG9tIHJhbmQoKQorI2VuZGlmCisKKyNpZmRlZiBXSVRIX05PSURSRUYKKyMgZGVmaW5lIHNvYXBfZW1iZWRkZWQocywgcCwgdCkgKDApCisjIGRlZmluZSBzb2FwX2lkX2xvb2t1cChzLCBpLCBwLCB0LCBuLCBrKSAocCkKKyMgZGVmaW5lIHNvYXBfaWRfZm9yd2FyZChzLCBoLCBwLCBsZW4sIHN0LCB0dCwgbiwgaywgZmMpIChwKQorIyBkZWZpbmUgc29hcF9yZWZlcmVuY2UocywgYSwgdCkgKDEpCisjIGRlZmluZSBzb2FwX2FycmF5X3JlZmVyZW5jZShzLCBwLCBhLCBuLCB0KSAoMSkKKyMgZGVmaW5lIHNvYXBfZW1iZWQocywgcCwgYSwgbiwgdCwgcHApICgwKQorIyBkZWZpbmUgc29hcF9lbWJlZGRlZF9pZChzLCBpLCBwLCB0KSAoaSkKKyMgZGVmaW5lIHNvYXBfaXNfZW1iZWRkZWQocywgcCkgKDApCisjIGRlZmluZSBzb2FwX2lzX3NpbmdsZShzLCBwKSAoMSkKKyMgZGVmaW5lIHNvYXBfbG9va3VwX3R5cGUocywgaSkgKDApCisjIGRlZmluZSBzb2FwX2dldGluZGVwZW5kZW50KHMpICgwKQorIyBkZWZpbmUgc29hcF9wdXRpbmRlcGVuZGVudChzKSAoMCkKKyMgZGVmaW5lIHNvYXBfZ2V0ZWxlbWVudChzLCBuKSAobikKKyMgZGVmaW5lIHNvYXBfcHV0ZWxlbWVudChzLCBwLCB0LCBpLCBuKSAoMCkKKyMgZGVmaW5lIHNvYXBfbWFya2VsZW1lbnQocywgcCwgbikgKDApCisjZW5kaWYKKworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9mYXVsdChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiogU09BUF9GTUFDMiBzb2FwX2ZhdWx0Y29kZShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiogU09BUF9GTUFDMiBzb2FwX2ZhdWx0c3ViY29kZShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiogU09BUF9GTUFDMiBzb2FwX2ZhdWx0c3RyaW5nKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqKiBTT0FQX0ZNQUMyIHNvYXBfZmF1bHRkZXRhaWwoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfc2VyaWFsaXplaGVhZGVyKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0aGVhZGVyKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZ2V0aGVhZGVyKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NlcmlhbGl6ZWZhdWx0KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0ZmF1bHQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRmYXVsdChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NzbF9pbml0KCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcG9sbChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2Nvbm5lY3RfY29tbWFuZChzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9jb25uZWN0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9iaW5kKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9hY2NlcHQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zc2xfYWNjZXB0KHN0cnVjdCBzb2FwKik7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zc2xfc2VydmVyX2NvbnRleHQoc3RydWN0IHNvYXAqLCB1bnNpZ25lZCBzaG9ydCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NzbF9jbGllbnRfY29udGV4dChzdHJ1Y3Qgc29hcCosIHVuc2lnbmVkIHNob3J0LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0aHR0cGhkcihzdHJ1Y3Qgc29hcCosIGludCBzdGF0dXMsIHNpemVfdCBjb3VudCk7CisKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX2RlY29kZV9rZXkoY2hhciosIHNpemVfdCwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfZGVjb2RlX3ZhbChjaGFyKiwgc2l6ZV90LCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzEgc2l6ZV90IFNPQVBfRk1BQzIgc29hcF9oYXNoKGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfc2V0X2VuZHBvaW50KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2ZsdXNoX3JhdyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2ZsdXNoKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHNvYXBfd2NoYXIgU09BUF9GTUFDMiBzb2FwX2dldChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBzb2FwX3djaGFyIFNPQVBfRk1BQzIgc29hcF9nZXRjaGFyKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfdGFnX2NtcChjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXRfZmF1bHQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZW5kZXJfZmF1bHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NlbmRlcl9mYXVsdF9zdWJjb2RlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcmVjZWl2ZXJfZmF1bHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3JlY2VpdmVyX2ZhdWx0X3N1YmNvZGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgaW50KTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NlbmRfcmF3KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHNpemVfdCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcmVjdl9yYXcoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9yZWN2KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2VuZChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZW5kMihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2VuZDMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3B1dHV0Zjgoc3RydWN0IHNvYXAqLCB1bnNpZ25lZCBsb25nKTsKK1NPQVBfRk1BQzEgc29hcF93Y2hhciBTT0FQX0ZNQUMyIHNvYXBfZ2V0dXRmOChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0YmFzZTY0KHN0cnVjdCBzb2FwKiwgY29uc3QgdW5zaWduZWQgY2hhciosIGludCk7CitTT0FQX0ZNQUMxIHVuc2lnbmVkIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9nZXRiYXNlNjQoc3RydWN0IHNvYXAqLCBpbnQqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3B1dGhleChzdHJ1Y3Qgc29hcCosIGNvbnN0IHVuc2lnbmVkIGNoYXIqLCBpbnQpOworU09BUF9GTUFDMSB1bnNpZ25lZCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfZ2V0aGV4KHN0cnVjdCBzb2FwKiwgaW50Kik7CisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF94b3BfZm9yd2FyZChzdHJ1Y3Qgc29hcCosIHVuc2lnbmVkIGNoYXIqKiwgaW50KiwgY2hhcioqLCBjaGFyKiosIGNoYXIqKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZGltZV9mb3J3YXJkKHN0cnVjdCBzb2FwKiwgdW5zaWduZWQgY2hhcioqLCBpbnQqLCBjaGFyKiosIGNoYXIqKiwgY2hhcioqKTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3BvaW50ZXJfbG9va3VwX2lkKHN0cnVjdCBzb2FwKiwgdm9pZCAqcCwgaW50IHQsIHN0cnVjdCBzb2FwX3BsaXN0KiopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3BvaW50ZXJfbG9va3VwKHN0cnVjdCBzb2FwKiwgY29uc3Qgdm9pZCAqcCwgaW50IHQsIHN0cnVjdCBzb2FwX3BsaXN0KiopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3BvaW50ZXJfZW50ZXIoc3RydWN0IHNvYXAqLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGludCB0LCBzdHJ1Y3Qgc29hcF9wbGlzdCoqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9hcnJheV9wb2ludGVyX2xvb2t1cChzdHJ1Y3Qgc29hcCosIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgbiwgaW50IHQsIHN0cnVjdCBzb2FwX3BsaXN0KiopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VtYmVkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGNvbnN0IGNoYXIgKnRhZywgaW50IHR5cGUpOworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcF9pbGlzdCogU09BUF9GTUFDMiBzb2FwX2xvb2t1cChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgc3RydWN0IHNvYXBfaWxpc3QqIFNPQVBfRk1BQzIgc29hcF9lbnRlcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9yZXNvbHZlKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2VtYmVkZGVkKHN0cnVjdCBzb2FwKiwgY29uc3Qgdm9pZCAqcCwgaW50IHQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3JlZmVyZW5jZShzdHJ1Y3Qgc29hcCosIGNvbnN0IHZvaWQgKnAsIGludCB0KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9hcnJheV9yZWZlcmVuY2Uoc3RydWN0IHNvYXAqLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGludCB0KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbWJlZGRlZF9pZChzdHJ1Y3Qgc29hcCosIGludCBpZCwgY29uc3Qgdm9pZCAqcCwgaW50IHQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2lzX2VtYmVkZGVkKHN0cnVjdCBzb2FwKiwgc3RydWN0IHNvYXBfcGxpc3QqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9pc19zaW5nbGUoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9wbGlzdCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXRfZW1iZWRkZWQoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9wbGlzdCopOworI2VuZGlmCisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9iZWdpbl9jb3VudChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VuZF9jb3VudChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2JlZ2luX3NlbmQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbmRfc2VuZChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwKiBTT0FQX0ZNQUMyIHNvYXBfY29kZShjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCosIGNvbnN0IGNoYXIgKnN0cik7CitTT0FQX0ZNQUMxIGxvbmcgU09BUF9GTUFDMiBzb2FwX2ludF9jb2RlKGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwKiwgY29uc3QgY2hhciAqc3RyLCBsb25nIG90aGVyKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX3N0cl9jb2RlKGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwKiwgbG9uZyBjb2RlKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2dldGxpbmUoc3RydWN0IHNvYXAqLCBjaGFyKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9iZWdpbl9yZWN2KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZW5kX3JlY3Yoc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMSB2b2lkKiBTT0FQX0ZNQUMyIHNvYXBfbWFsbG9jKHN0cnVjdCBzb2FwKiwgc2l6ZV90KTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfZGVhbGxvYyhzdHJ1Y3Qgc29hcCosIHZvaWQqKTsKK1NPQVBfRk1BQzEgc3RydWN0IHNvYXBfY2xpc3QgKiBTT0FQX0ZNQUMyIHNvYXBfbGluayhzdHJ1Y3Qgc29hcCosIHZvaWQqLCBpbnQsIGludCwgdm9pZCAoKmZkZWxldGUpKHN0cnVjdCBzb2FwX2NsaXN0KikpOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF91bmxpbmsoc3RydWN0IHNvYXAqLCBjb25zdCB2b2lkKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2ZyZWUoc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMSB2b2lkKiBTT0FQX0ZNQUMyIHNvYXBfdHJhY2tfbWFsbG9jKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgc2l6ZV90KTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfdHJhY2tfZnJlZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIHZvaWQqKTsKKworI2lmbmRlZiBXSVRIX05PSURSRUYKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9sb29rdXBfdHlwZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKmlkKTsKK1NPQVBfRk1BQzEgdm9pZCogU09BUF9GTUFDMiBzb2FwX2lkX2xvb2t1cChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKmlkLCB2b2lkICoqcCwgaW50IHQsIHNpemVfdCBuLCB1bnNpZ25lZCBpbnQgayk7CitTT0FQX0ZNQUMxIHZvaWQqIFNPQVBfRk1BQzIgc29hcF9pZF9mb3J3YXJkKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqaWQsIHZvaWQgKnAsIHNpemVfdCBsZW4sIGludCBzdCwgaW50IHR0LCBzaXplX3QgbiwgdW5zaWduZWQgaW50IGssIHZvaWQoKmZjb3B5KShzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgc2l6ZV90LCBjb25zdCB2b2lkKiwgc2l6ZV90KSk7CisjZW5kaWYKK1NPQVBfRk1BQzEgdm9pZCogU09BUF9GTUFDMiBzb2FwX2lkX2VudGVyKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqaWQsIHZvaWQgKnAsIGludCB0LCBzaXplX3QgbiwgdW5zaWduZWQgaW50IGssIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmFycmF5VHlwZSwgdm9pZCAqKCpmaW5zdGFudGlhdGUpKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfZmNvcHkoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdCwgaW50IHR0LCB2b2lkICpwLCBzaXplX3QsIGNvbnN0IHZvaWQgKnEsIHNpemVfdCBuKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NpemUoY29uc3QgaW50ICosIGludCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZ2V0b2Zmc2V0cyhjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBpbnQgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRzaXplKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQgKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZ2V0c2l6ZXMoY29uc3QgY2hhciAqLCBpbnQgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRwb3NpdGlvbihjb25zdCBjaGFyICosIGludCAqKTsKKworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfcHV0c2l6ZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgY2hhciogU09BUF9GTUFDMiBzb2FwX3B1dHNpemVzb2Zmc2V0cyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBpbnQpOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfcHV0c2l6ZXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBpbnQpOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfcHV0b2Zmc2V0KHN0cnVjdCBzb2FwKiwgaW50KTsKK1NPQVBfRk1BQzEgY2hhciogU09BUF9GTUFDMiBzb2FwX3B1dG9mZnNldHMoc3RydWN0IHNvYXAqLCBjb25zdCBpbnQgKiwgaW50KTsKKyAKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9jbG9zZXNvY2soc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcCAqU09BUF9GTUFDMiBzb2FwX25ldyh2b2lkKTsKK1NPQVBfRk1BQzEgc3RydWN0IHNvYXAgKlNPQVBfRk1BQzIgc29hcF9uZXcxKHNvYXBfbW9kZSk7CitTT0FQX0ZNQUMxIHN0cnVjdCBzb2FwICpTT0FQX0ZNQUMyIHNvYXBfbmV3Mihzb2FwX21vZGUsIHNvYXBfbW9kZSk7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2RlbChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcCAqU09BUF9GTUFDMiBzb2FwX2NvcHkoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgc3RydWN0IHNvYXAgKlNPQVBfRk1BQzIgc29hcF9jb3B5X2NvbnRleHQoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9pbml0KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2luaXQxKHN0cnVjdCBzb2FwKiwgc29hcF9tb2RlKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfaW5pdDIoc3RydWN0IHNvYXAqLCBzb2FwX21vZGUsIHNvYXBfbW9kZSk7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2RvbmUoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfY2xlYW51cChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9iZWdpbihzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9lbmQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfZGVsZXRlKHN0cnVjdCBzb2FwKiwgdm9pZCopOworCisjaWZkZWYgU09BUF9ERUJVRworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXRfcmVjdl9sb2dmaWxlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXRfc2VudF9sb2dmaWxlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXRfdGVzdF9sb2dmaWxlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9jbG9zZV9sb2dmaWxlcyhzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9vcGVuX2xvZ2ZpbGUoc3RydWN0IHNvYXAqLCBpbnQpOworI2VuZGlmCisKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX3Rva2VuKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF92YWx1ZShzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfbWF0Y2hfdGFnKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfbWF0Y2hfYXJyYXkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbGVtZW50KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnR5cGUpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2FycmF5X2JlZ2luX291dChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICpvZmZzZXQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfcmVmKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGludCBocmVmKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbGVtZW50X2hyZWYoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgY2hhciAqcmVmLCBjb25zdCBjaGFyICp2YWwpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfbnVsbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICp0eXBlKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbGVtZW50X2lkKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgZCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfcmVzdWx0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbGVtZW50X2VuZF9vdXQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZyk7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9hdHRyaWJ1dGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZWxlbWVudF9iZWdpbl9pbihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IG5pbGxhYmxlKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfZW5kX2luKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3BlZWtfZWxlbWVudChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3JldHJ5KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3JldmVydChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9zdHJkdXAoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIgKiBTT0FQX0ZNQUMyIHNvYXBfc3Ryc2VhcmNoKGNvbnN0IGNoYXIgKmJpZywgY29uc3QgY2hhciAqbGl0dGxlKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3N0cmluZ19vdXQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICpzLCBpbnQgZmxhZyk7CitTT0FQX0ZNQUMxIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9zdHJpbmdfaW4oc3RydWN0IHNvYXAqLCBpbnQsIGxvbmcsIGxvbmcpOworCisjaWZuZGVmIFdJVEhfTEVBTkVSCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfd3N0cmluZ19vdXQoc3RydWN0IHNvYXAqLCBjb25zdCB3Y2hhcl90ICpzLCBpbnQgZmxhZyk7CitTT0FQX0ZNQUMxIHdjaGFyX3QqIFNPQVBfRk1BQzIgc29hcF93c3RyaW5nX2luKHN0cnVjdCBzb2FwKiwgaW50LCBsb25nLCBsb25nKTsKKyNlbmRpZgorCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfbWF0Y2hfbmFtZXNwYWNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyKiwgaW50IG4xLCBpbnQgbjIpOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2V0X25hbWVzcGFjZXMoc3RydWN0IHNvYXAqLCBzdHJ1Y3QgTmFtZXNwYWNlKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NldF9sb2NhbF9uYW1lc3BhY2VzKHN0cnVjdCBzb2FwKik7CisKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfcG9wX25hbWVzcGFjZShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3B1c2hfbmFtZXNwYWNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9jdXJyZW50X25hbWVzcGFjZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3N0b3JlX2xhYihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2FwcGVuZF9sYWIoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc2l6ZV90KTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX25ld19ibG9jayhzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSB2b2lkKiBTT0FQX0ZNQUMyIHNvYXBfcHVzaF9ibG9jayhzdHJ1Y3Qgc29hcCosIHNpemVfdCk7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3BvcF9ibG9jayhzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBzaXplX3QgU09BUF9GTUFDMiBzb2FwX3NpemVfYmxvY2soc3RydWN0IHNvYXAqLCBzaXplX3QpOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfZmlyc3RfYmxvY2soc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgY2hhciogU09BUF9GTUFDMiBzb2FwX25leHRfYmxvY2soc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgc2l6ZV90IFNPQVBfRk1BQzIgc29hcF9ibG9ja19zaXplKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9zYXZlX2Jsb2NrKHN0cnVjdCBzb2FwKiwgY2hhciosIGludCk7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2VuZF9ibG9jayhzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZW52ZWxvcGVfYmVnaW5fb3V0KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBzb2FwX2VudmVsb3BlX2VuZF9vdXQoc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VudmVsb3BlX2JlZ2luX2luKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZW52ZWxvcGVfZW5kX2luKHN0cnVjdCBzb2FwKik7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9ib2R5X2JlZ2luX291dChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2JvZHlfZW5kX291dChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfYm9keV9iZWdpbl9pbihzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2JvZHlfZW5kX2luKHN0cnVjdCBzb2FwKik7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9yZWN2X2hlYWRlcihzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcmVzcG9uc2Uoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2VuZF9lbXB0eV9yZXNwb25zZShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3JlY3ZfZW1wdHlfcmVzcG9uc2Uoc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NlbmRfZmF1bHQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9yZWN2X2ZhdWx0KHN0cnVjdCBzb2FwKik7CisKKyNpZm5kZWYgV0lUSF9OT1NURExJQgorU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9wcmludF9mYXVsdChzdHJ1Y3Qgc29hcCosIEZJTEUqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfcHJpbnRfZmF1bHRfbG9jYXRpb24oc3RydWN0IHNvYXAqLCBGSUxFKik7CisjZW5kaWYKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MyYnl0ZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjaGFyKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfczJzaG9ydChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaG9ydCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MyaW50KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MybG9uZyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBsb25nKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfczJMT05HNjQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgTE9ORzY0Kik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfczJmbG9hdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBmbG9hdCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MyZG91YmxlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGRvdWJsZSopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MydW5zaWduZWRCeXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVuc2lnbmVkIGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zMnVuc2lnbmVkU2hvcnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdW5zaWduZWQgc2hvcnQqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zMnVuc2lnbmVkSW50KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVuc2lnbmVkIGludCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MydW5zaWduZWRMb25nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVuc2lnbmVkIGxvbmcqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zMlVMT05HNjQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgVUxPTkc2NCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3Myc3RyaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNoYXIqKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfczJRTmFtZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjaGFyKiopOworCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3Myd2NoYXIoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgd2NoYXJfdCoqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zMmRhdGVUaW1lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHRpbWVfdCopOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfczJiYXNlNjQoc3RydWN0IHNvYXAqLCBjb25zdCB1bnNpZ25lZCBjaGFyKiwgY2hhciosIGludCk7CitTT0FQX0ZNQUMxIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9zMmhleChzdHJ1Y3Qgc29hcCosIGNvbnN0IHVuc2lnbmVkIGNoYXIqLCBjaGFyKiwgaW50KTsKKyNlbmRpZgorCitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9ieXRlMnMoc3RydWN0IHNvYXAqLCBjaGFyKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX3Nob3J0MnMoc3RydWN0IHNvYXAqLCBzaG9ydCk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9pbnQycyhzdHJ1Y3Qgc29hcCosIGludCk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9sb25nMnMoc3RydWN0IHNvYXAqLCBsb25nKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX0xPTkc2NDJzKHN0cnVjdCBzb2FwKiwgTE9ORzY0KTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX2Zsb2F0MnMoc3RydWN0IHNvYXAqLCBmbG9hdCk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9kb3VibGUycyhzdHJ1Y3Qgc29hcCosIGRvdWJsZSk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF91bnNpZ25lZEJ5dGUycyhzdHJ1Y3Qgc29hcCosIHVuc2lnbmVkIGNoYXIpOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfdW5zaWduZWRTaG9ydDJzKHN0cnVjdCBzb2FwKiwgdW5zaWduZWQgc2hvcnQpOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfdW5zaWduZWRJbnQycyhzdHJ1Y3Qgc29hcCosIHVuc2lnbmVkIGludCk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF91bnNpZ25lZExvbmcycyhzdHJ1Y3Qgc29hcCosIHVuc2lnbmVkIGxvbmcpOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfVUxPTkc2NDJzKHN0cnVjdCBzb2FwKiwgVUxPTkc2NCk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9RTmFtZTJzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfd2NoYXIycyhzdHJ1Y3Qgc29hcCosIGNvbnN0IHdjaGFyX3QqKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX2RhdGVUaW1lMnMoc3RydWN0IHNvYXAqLCB0aW1lX3QpOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfYmFzZTY0MnMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY2hhciosIHNpemVfdCwgaW50Kik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9oZXgycyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjaGFyKiwgc2l6ZV90LCBpbnQqKTsKKyNlbmRpZgorCisKK1NPQVBfRk1BQzEgaW50KiBTT0FQX0ZNQUMyIHNvYXBfaW5pbnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfaW5ieXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBjaGFyICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGxvbmcqIFNPQVBfRk1BQzIgc29hcF9pbmxvbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGxvbmcgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgTE9ORzY0KiBTT0FQX0ZNQUMyIHNvYXBfaW5MT05HNjQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIExPTkc2NCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBzaG9ydCogU09BUF9GTUFDMiBzb2FwX2luc2hvcnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHNob3J0ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGZsb2F0KiBTT0FQX0ZNQUMyIHNvYXBfaW5mbG9hdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgZmxvYXQgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgZG91YmxlKiBTT0FQX0ZNQUMyIHNvYXBfaW5kb3VibGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGRvdWJsZSAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSB1bnNpZ25lZCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfaW51bnNpZ25lZEJ5dGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIGNoYXIgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgdW5zaWduZWQgc2hvcnQqIFNPQVBfRk1BQzIgc29hcF9pbnVuc2lnbmVkU2hvcnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIHNob3J0ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIHVuc2lnbmVkIGludCogU09BUF9GTUFDMiBzb2FwX2ludW5zaWduZWRJbnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIGludCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSB1bnNpZ25lZCBsb25nKiBTT0FQX0ZNQUMyIHNvYXBfaW51bnNpZ25lZExvbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIGxvbmcgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgVUxPTkc2NCogU09BUF9GTUFDMiBzb2FwX2luVUxPTkc2NChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgVUxPTkc2NCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBjaGFyKiogU09BUF9GTUFDMiBzb2FwX2luc3RyaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBjaGFyICoqcCwgY29uc3QgY2hhciAqLCBpbnQsIGludCwgbG9uZywgbG9uZyk7CitTT0FQX0ZNQUMxIGNoYXIqKiBTT0FQX0ZNQUMyIHNvYXBfaW5saXRlcmFsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBjaGFyICoqcCk7CisKKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxIHRpbWVfdCogU09BUF9GTUFDMiBzb2FwX2luZGF0ZVRpbWUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHRpbWVfdCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK1NPQVBfRk1BQzEgd2NoYXJfdCoqIFNPQVBfRk1BQzIgc29hcF9pbndzdHJpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHdjaGFyX3QgKipwLCBjb25zdCBjaGFyICosIGludCwgbG9uZywgbG9uZyk7CitTT0FQX0ZNQUMxIHdjaGFyX3QqKiBTT0FQX0ZNQUMyIHNvYXBfaW53bGl0ZXJhbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgd2NoYXJfdCAqKnApOworI2VuZGlmCisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRieXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRzaG9ydChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzaG9ydCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dGludChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBpbnQgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRsb25nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGxvbmcgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRMT05HNjQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgTE9ORzY0ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0ZmxvYXQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgZmxvYXQgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRkb3VibGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgZG91YmxlICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0dW5zaWduZWRCeXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXR1bnNpZ25lZFNob3J0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIHNob3J0ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0dW5zaWduZWRJbnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgdW5zaWduZWQgaW50ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0dW5zaWduZWRMb25nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRVTE9ORzY0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IFVMT05HNjQgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRzdHJpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY2hhciAqY29uc3QqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dGxpdGVyYWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGNoYXIgKmNvbnN0KnApOworCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dGRhdGVUaW1lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHRpbWVfdCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXR3c3RyaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIHdjaGFyX3QgKmNvbnN0KnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXR3bGl0ZXJhbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgd2NoYXJfdCAqY29uc3QqcCk7CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU5FUgorU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2F0dGFjaG1lbnQoc3RydWN0IHNvYXAgKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgdm9pZCosIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBjaGFyKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9tb3ZlKHN0cnVjdCBzb2FwKiwgbG9uZyk7CitTT0FQX0ZNQUMxIHNpemVfdCBTT0FQX0ZNQUMyIHNvYXBfdGVsbChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfZGltZV9vcHRpb24oc3RydWN0IHNvYXAqLCB1bnNpZ25lZCBzaG9ydCwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2dldGRpbWVoZHIoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRkaW1lKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0ZGltZWhkcihzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3B1dGRpbWUoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRtaW1laGRyKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZ2V0bWltZShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3B1dG1pbWVoZHIoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9wdXRtaW1lKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NldF9kaW1lKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NldF9taW1lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqYm91bmRhcnksIGNvbnN0IGNoYXIgKnN0YXJ0KTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfY2xyX2RpbWUoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfY2xyX21pbWUoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZXRfZGltZV9hdHRhY2htZW50KHN0cnVjdCBzb2FwKiwgY2hhciAqcHRyLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqaWQsIHVuc2lnbmVkIHNob3J0IG9wdHlwZSwgY29uc3QgY2hhciAqb3B0aW9uKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZXRfbWltZV9hdHRhY2htZW50KHN0cnVjdCBzb2FwKiwgY2hhciAqcHRyLCBzaXplX3Qgc2l6ZSwgZW51bSBzb2FwX21pbWVfZW5jb2RpbmcgZW5jb2RpbmcsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICpsb2NhdGlvbiwgY29uc3QgY2hhciAqZGVzY3JpcHRpb24pOworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqIFNPQVBfRk1BQzIgc29hcF9uZXh0X211bHRpcGFydChzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKTsKKyNlbmRpZgorCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcmVnaXN0ZXJfcGx1Z2luX2FyZyhzdHJ1Y3Qgc29hcCosIGludCAoKmZjcmVhdGUpKHN0cnVjdCBzb2FwKiwgc3RydWN0IHNvYXBfcGx1Z2luKiwgdm9pZCopLCB2b2lkKik7CitTT0FQX0ZNQUMxIHZvaWQqIFNPQVBfRk1BQzIgc29hcF9sb29rdXBfcGx1Z2luKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9hdHRyX3ZhbHVlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgZmxhZyk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2V0X2F0dHIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfY2xyX2F0dHIoc3RydWN0IHNvYXAgKnNvYXApOworCisjaWZkZWYgV0lUSF9DT09LSUVTCitTT0FQX0ZNQUMxIHNpemVfdCBTT0FQX0ZNQUMyIHNvYXBfZW5jb2RlX2Nvb2tpZShjb25zdCBjaGFyKiwgY2hhciosIHNpemVfdCk7CitTT0FQX0ZNQUMxIGV4dGVybiBzdHJ1Y3Qgc29hcF9jb29raWUqIFNPQVBfRk1BQzIgc29hcF9zZXRfY29va2llKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBleHRlcm4gc3RydWN0IHNvYXBfY29va2llKiBTT0FQX0ZNQUMyIHNvYXBfY29va2llKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGV4dGVybiBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfY29va2llX3ZhbHVlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGV4dGVybiBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfZW52X2Nvb2tpZV92YWx1ZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBleHRlcm4gbG9uZyBTT0FQX0ZNQUMyIHNvYXBfY29va2llX2V4cGlyZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBleHRlcm4gaW50IFNPQVBfRk1BQzIgc29hcF9zZXRfY29va2llX2V4cGlyZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBsb25nLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBleHRlcm4gaW50IFNPQVBfRk1BQzIgc29hcF9zZXRfY29va2llX3Nlc3Npb24oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgZXh0ZXJuIGludCBTT0FQX0ZNQUMyIHNvYXBfY2xyX2Nvb2tpZV9zZXNzaW9uKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGV4dGVybiB2b2lkIFNPQVBfRk1BQzIgc29hcF9jbHJfY29va2llKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGV4dGVybiBpbnQgU09BUF9GTUFDMiBzb2FwX2dldGVudl9jb29raWVzKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGV4dGVybiBzdHJ1Y3Qgc29hcF9jb29raWUqIFNPQVBfRk1BQzIgc29hcF9jb3B5X2Nvb2tpZXMoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgZXh0ZXJuIHZvaWQgU09BUF9GTUFDMiBzb2FwX2ZyZWVfY29va2llcyhzdHJ1Y3Qgc29hcCopOworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBleHRlcm4gIkMiICovCisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvcXVvdGVfVkMvUXVvdGUyLmRzcCBiL3NhbXBsZXMvcXVvdGVfVkMvUXVvdGUyLmRzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzlmYjk1Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9xdW90ZV9WQy9RdW90ZTIuZHNwCkBAIC0wLDAgKzEsMTQ0IEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9IlF1b3RlMiIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDANCisjICoqIERPIE5PVCBFRElUICoqDQorDQorIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIgMHgwMTAzDQorDQorQ0ZHPVF1b3RlMiAtIFdpbjMyIERlYnVnDQorIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLA0KKyFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJRdW90ZTIubWFrIi4NCishTUVTU0FHRSANCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQ0KKyFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgIlF1b3RlMi5tYWsiIENGRz0iUXVvdGUyIC0gV2luMzIgRGVidWciDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgIlF1b3RlMiAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpDQorIU1FU1NBR0UgIlF1b3RlMiAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQ0KKyFNRVNTQUdFIA0KKw0KKyMgQmVnaW4gUHJvamVjdA0KKyMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwDQorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIg0KKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiDQorQ1BQPWNsLmV4ZQ0KK1JTQz1yYy5leGUNCisNCishSUYgICIkKENGRykiID09ICJRdW90ZTIgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSINCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MNCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4Ng0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJRdW90ZTIgLSBXaW4zMiBEZWJ1ZyINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgT3V0cHV0X0RpciAiRGVidWciDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIg0KKyMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvR1ogL2MNCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL0daIC9jDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyINCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0DQorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIHdzb2NrMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQNCisNCishRU5ESUYgDQorDQorIyBCZWdpbiBUYXJnZXQNCisNCisjIE5hbWUgIlF1b3RlMiAtIFdpbjMyIFJlbGVhc2UiDQorIyBOYW1lICJRdW90ZTIgLSBXaW4zMiBEZWJ1ZyINCisjIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0Ig0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxxdW90ZS5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llxzb2FwQy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llxzb2FwQ2xpZW50LmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHN0ZHNvYXAyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxxdW90ZS5oDQorDQorIUlGICAiJChDRkcpIiA9PSAiUXVvdGUyIC0gV2luMzIgUmVsZWFzZSINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiUXVvdGUyIC0gV2luMzIgRGVidWciDQorDQorIyBCZWdpbiBDdXN0b20gQnVpbGQgLSBnU09BUCBXZWIgc2VydmljZSBwcm94eS9za2VsZXRvbiBidWlsZCBvbiAkKElucHV0UGF0aCkNCitJbnB1dFBhdGg9LlxxdW90ZS5oDQorDQorInNvYXBTdHViLmggc29hcEguaCBzb2FwQy5jcHAgc29hcENsaWVudC5jcHAiIDogJChTT1VSQ0UpICIkKElOVERJUikiICIkKE9VVERJUikiDQorCS5cc29hcGNwcDIuZXhlICIkKElucHV0UGF0aCkiDQorDQorIyBFbmQgQ3VzdG9tIEJ1aWxkDQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHNvYXBILmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llxzb2FwU3R1Yi5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cc3Rkc29hcDIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJSZXNvdXJjZSBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZSINCisjIEVuZCBHcm91cA0KKyMgRW5kIFRhcmdldA0KKyMgRW5kIFByb2plY3QNCmRpZmYgLS1naXQgYS9zYW1wbGVzL3F1b3RlX1ZDL1F1b3RlMi5kc3cgYi9zYW1wbGVzL3F1b3RlX1ZDL1F1b3RlMi5kc3cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliMDA0NgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvcXVvdGVfVkMvUXVvdGUyLmRzdwpAQCAtMCwwICsxLDI5IEBACitNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBXb3Jrc3BhY2UgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMA0KKyMgV0FSTklORzogRE8gTk9UIEVESVQgT1IgREVMRVRFIFRISVMgV09SS1NQQUNFIEZJTEUhDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK1Byb2plY3Q6ICJRdW90ZTIiPSIuXFF1b3RlMi5kc3AiIC0gUGFja2FnZSBPd25lcj08ND4NCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDQ+DQore3t7DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK0dsb2JhbDoNCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDM+DQore3t7DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvcXVvdGVfVkMvUXVvdGUyLnNsbiBiL3NhbXBsZXMvcXVvdGVfVkMvUXVvdGUyLnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTQzZDlhCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9xdW90ZV9WQy9RdW90ZTIuc2xuCkBAIC0wLDAgKzEsMjAgQEAKK++7vworTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gOS4wMAorIyBWaXN1YWwgU3R1ZGlvIDIwMDUKK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiUXVvdGUyIiwgIlF1b3RlMi52Y3Byb2oiLCAie0FERUZGNDA5LTlGRTMtNDEzRi04OUI1LTgyMDRENkE5MTk1NH0iCitFbmRQcm9qZWN0CitHbG9iYWwKKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgorCQlEZWJ1Z3xXaW4zMiA9IERlYnVnfFdpbjMyCisJCVJlbGVhc2V8V2luMzIgPSBSZWxlYXNlfFdpbjMyCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uCisJCXtBREVGRjQwOS05RkUzLTQxM0YtODlCNS04MjA0RDZBOTE5NTR9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyCisJCXtBREVGRjQwOS05RkUzLTQxM0YtODlCNS04MjA0RDZBOTE5NTR9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMgorCQl7QURFRkY0MDktOUZFMy00MTNGLTg5QjUtODIwNEQ2QTkxOTU0fS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzIKKwkJe0FERUZGNDA5LTlGRTMtNDEzRi04OUI1LTgyMDRENkE5MTk1NH0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UKKwlFbmRHbG9iYWxTZWN0aW9uCitFbmRHbG9iYWwKZGlmZiAtLWdpdCBhL3NhbXBsZXMvcXVvdGVfVkMvUXVvdGUyLnZjcHJvaiBiL3NhbXBsZXMvcXVvdGVfVkMvUXVvdGUyLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTM2Njc0Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9xdW90ZV9WQy9RdW90ZTIudmNwcm9qCkBAIC0wLDAgKzEsMzI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCis8VmlzdWFsU3R1ZGlvUHJvamVjdA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iOC4wMCINCisJTmFtZT0iUXVvdGUyIg0KKwlQcm9qZWN0R1VJRD0ie0FERUZGNDA5LTlGRTMtNDEzRi04OUI1LTgyMDRENkE5MTk1NH0iDQorCT4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIg0KKwkJLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxUb29sRmlsZXM+DQorCTwvVG9vbEZpbGVzPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxEZWJ1ZyINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cRGVidWciDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM2MC52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5cRGVidWcvUXVvdGUyLnRsYiINCisJCQkJSGVhZGVyRmlsZU5hbWU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCSANCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XSU5OVD0weDA1MDE7V0lOVkVSPTB4MDUwMTtfV0lOMzJfSUU9MHgwNjAzO1dJTjMyO19ERUJVRztfQ09OU09MRSINCisJCQkJIA0KKwkJCQkgDQorCQkJCSANCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXERlYnVnL1F1b3RlMi5wY2giDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlxEZWJ1Zy8iDQorCQkJCU9iamVjdEZpbGU9Ii5cRGVidWcvIg0KKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlxEZWJ1Zy8iDQorCQkJCSANCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQkgDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0lOTlQ9MHgwNTAxO1dJTlZFUj0weDA1MDE7X1dJTjMyX0lFPTB4MDYwMztfREVCVUciDQorCQkJCUN1bHR1cmU9IjEwMzMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Im9kYmMzMi5saWIgb2RiY2NwMzIubGliIHdzb2NrMzIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuXERlYnVnL1F1b3RlMi5leGUiDQorCQkJCSANCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQkNCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlxEZWJ1Zy9RdW90ZTIucGRiIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJT3V0cHV0RmlsZT0iLlxEZWJ1Zy9RdW90ZTIuYnNjIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxSZWxlYXNlIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxSZWxlYXNlIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNjAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIuXFJlbGVhc2UvUXVvdGUyLnRsYiINCisJCQkJSGVhZGVyRmlsZU5hbWU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCSANCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0lOTlQ9MHgwNTAxO1dJTlZFUj0weDA1MDE7X1dJTjMyX0lFPTB4MDYwMztXSU4zMjtOREVCVUc7X0NPTlNPTEUiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCSANCisJCQkJIA0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cUmVsZWFzZS9RdW90ZTIucGNoIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cUmVsZWFzZS8iDQorCQkJCU9iamVjdEZpbGU9Ii5cUmVsZWFzZS8iDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXFJlbGVhc2UvIg0KKwkJCQkgDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XSU5OVD0weDA1MDE7V0lOVkVSPTB4MDUwMTtfV0lOMzJfSUU9MHgwNjAzO05ERUJVRyINCisJCQkJQ3VsdHVyZT0iMTAzMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iLlxSZWxlYXNlL1F1b3RlMi5leGUiDQorCQkJCSANCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXFJlbGVhc2UvUXVvdGUyLnBkYiINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCU91dHB1dEZpbGU9Ii5cUmVsZWFzZS9RdW90ZTIuYnNjIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwk8L0NvbmZpZ3VyYXRpb25zPg0KKwk8UmVmZXJlbmNlcz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCINCisJCQk+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSJxdW90ZS5jcHAiDQorCQkJCT4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dJTk5UPTB4MDUwMTtXSU5WRVI9MHgwNTAxO19XSU4zMl9JRT0weDA2MDM7Ig0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0lOTlQ9MHgwNTAxO1dJTlZFUj0weDA1MDE7X1dJTjMyX0lFPTB4MDYwMzsiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9InNvYXBDLmNwcCINCisJCQkJPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0lOTlQ9MHgwNTAxO1dJTlZFUj0weDA1MDE7X1dJTjMyX0lFPTB4MDYwMzsiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XSU5OVD0weDA1MDE7V0lOVkVSPTB4MDUwMTtfV0lOMzJfSUU9MHgwNjAzOyINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0ic29hcENsaWVudC5jcHAiDQorCQkJCT4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dJTk5UPTB4MDUwMTtXSU5WRVI9MHgwNTAxO19XSU4zMl9JRT0weDA2MDM7Ig0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0lOTlQ9MHgwNTAxO1dJTlZFUj0weDA1MDE7X1dJTjMyX0lFPTB4MDYwMzsiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9InN0ZHNvYXAyLmNwcCINCisJCQkJPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0lOTlQ9MHgwNTAxO1dJTlZFUj0weDA1MDE7X1dJTjMyX0lFPTB4MDYwMzsiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XSU5OVD0weDA1MDE7V0lOVkVSPTB4MDUwMTtfV0lOMzJfSUU9MHgwNjAzOyINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iSGVhZGVyIEZpbGVzIg0KKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubCINCisJCQk+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSJxdW90ZS5oIg0KKwkJCQk+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCQkJCURlc2NyaXB0aW9uPSJnU09BUCBXZWIgc2VydmljZSBwcm94eS9za2VsZXRvbiBidWlsZCBvbiAkKElucHV0UGF0aCkiDQorCQkJCQkJQ29tbWFuZExpbmU9Ii5cc29hcGNwcDIuZXhlICZxdW90OyQoSW5wdXRQYXRoKSZxdW90OyYjeDBEOyYjeDBBOyINCisJCQkJCQlPdXRwdXRzPSJzb2FwU3R1Yi5oIHNvYXBILmggc29hcEMuY3BwIHNvYXBDbGllbnQuY3BwIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSJzb2FwSC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0ic29hcFN0dWIuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9InN0ZHNvYXAyLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJSZXNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9ImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZSINCisJCQk+DQorCQk8L0ZpbHRlcj4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9xdW90ZV9WQy9xdW90ZS5jcHAgYi9zYW1wbGVzL3F1b3RlX1ZDL3F1b3RlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDdlNzJiCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9xdW90ZV9WQy9xdW90ZS5jcHAKQEAgLTAsMCArMSwzMiBAQAorI2luY2x1ZGUgInNvYXBILmgiCS8vIGluY2x1ZGUgZ2VuZXJhdGVkIHByb3h5IGFuZCBTT0FQIHN1cHBvcnQKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreyBzdHJ1Y3Qgc29hcCBzb2FwOwkvLyBhbGxvY2F0ZSBnU09BUCBydW50aW1lIGVudmlyb25tZW50CisgIGNoYXIgKnN5bTsKKyAgZmxvYXQgcTsKKyAgaWYgKGFyZ2MgPD0gMSkKKyAgICBzeW0gPSAiSUJNIjsKKyAgZWxzZQorICAgIHN5bSA9IGFyZ3ZbMV07CisgIHNvYXBfaW5pdCgmc29hcCk7CS8vIG11c3QgaW5pdGlhbGl6ZQorICBpZiAoc29hcF9jYWxsX25zX19nZXRRdW90ZSgmc29hcCwgImh0dHA6Ly9zZXJ2aWNlcy54bWV0aG9kcy5uZXQvc29hcCIsICIiLCBzeW0sICZxKSA9PSAwKQorICAgIHByaW50ZigiXG5Db21wYW55IC0gJXMgICAgUXVvdGUgLSAlZlxuIiwgc3ltLCBxKTsKKyAgZWxzZQorICB7IHNvYXBfcHJpbnRfZmF1bHQoJnNvYXAsIHN0ZGVycik7CisgICAgc29hcF9wcmludF9mYXVsdF9sb2NhdGlvbigmc29hcCwgc3RkZXJyKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8gVGhlIG5hbWVzcGFjZSBtYXBwaW5nIHRhYmxlIGlzIHJlcXVpcmVkIGFuZCBhc3NvY2lhdGVzIG5hbWVzcGFjZSBwcmVmaXhlcyB3aXRoIG5hbWVzcGFjZSBuYW1lczoKK3N0cnVjdCBOYW1lc3BhY2UgbmFtZXNwYWNlc1tdID0KK3svL3sibnMtcHJlZml4IiwgIm5zLW5hbWUiIFssICJucy1uYW1lLWlucHV0LXBhdHRlcm4iXX0KKyAgIHsiU09BUC1FTlYiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8ifSwgLy8gTVVTVCBiZSBmaXJzdAorICAgeyJTT0FQLUVOQyIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyJ9LCAvLyBNVVNUIGJlIHNlY29uZAorICAgeyJ4c2kiLCAiaHR0cDovL3d3dy53My5vcmcvMTk5OS9YTUxTY2hlbWEtaW5zdGFuY2UiLCAiaHR0cDovL3d3dy53My5vcmcvKi9YTUxTY2hlbWEtaW5zdGFuY2UifSwgLy8gTVVTVCBiZSB0aGlyZAorICAgeyJ4c2QiLCAiaHR0cDovL3d3dy53My5vcmcvMTk5OS9YTUxTY2hlbWEiLCAiaHR0cDovL3d3dy53My5vcmcvKi9YTUxTY2hlbWEifSwKKyAgIHsibnMiLCAidXJuOnhtZXRob2RzLWRlbGF5ZWQtcXVvdGVzIn0sCS8vIE1ldGhvZCBuYW1lc3BhY2UgVVJJCisgICB7TlVMTCwgTlVMTH0KK307CisKKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9xdW90ZV9WQy9xdW90ZS5oIGIvc2FtcGxlcy9xdW90ZV9WQy9xdW90ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZmYzN2YKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3F1b3RlX1ZDL3F1b3RlLmgKQEAgLTAsMCArMSw5IEBACisvL2dzb2FwIG5zIHNlcnZpY2UgbmFtZToJcXVvdGUKKy8vZ3NvYXAgbnMgc2VydmljZSBzdHlsZToJcnBjCisvL2dzb2FwIG5zIHNlcnZpY2UgZW5jb2Rpbmc6CWVuY29kZWQKKy8vZ3NvYXAgbnMgc2VydmljZSBuYW1lc3BhY2U6CXVybjp4bWV0aG9kcy1kZWxheWVkLXF1b3RlcworLy9nc29hcCBucyBzZXJ2aWNlIGxvY2F0aW9uOglodHRwOi8vc2VydmljZXMueG1ldGhvZHMubmV0L3NvYXAKKworLy9nc29hcCBucyBzZXJ2aWNlIG1ldGhvZC1hY3Rpb246IGdldFF1b3RlICIiCisKK2ludCBuc19fZ2V0UXVvdGUoY2hhciAqc3ltYm9sLCBmbG9hdCAqUmVzdWx0KTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvcXVvdGVfVkMvc29hcGNwcDIuZXhlIGIvc2FtcGxlcy9xdW90ZV9WQy9zb2FwY3BwMi5leGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmVhOTViYQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvcXVvdGVfVkMvc29hcGNwcDIuZXhlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvcXVvdGVfVkMvc3Rkc29hcDIuY3BwIGIvc2FtcGxlcy9xdW90ZV9WQy9zdGRzb2FwMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJlZDQ2MAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvcXVvdGVfVkMvc3Rkc29hcDIuY3BwCkBAIC0wLDAgKzEsMTM0NDggQEAKKy8qCisKK3N0ZHNvYXAyLmNbcHBdIDIuNy42ZQorCitnU09BUCBydW50aW1lCisKK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgcGFydCBvZiB0aGUgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXM6CitHUEwsIHRoZSBnU09BUCBwdWJsaWMgbGljZW5zZSwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NvbnRyaWJ1dG9yczoKKworV2luZCBSaXZlciBTeXN0ZW1zIEluYy4sIGZvciB0aGUgZm9sbG93aW5nIGFkZGl0aW9ucyB1bmRlciBnU09BUCBwdWJsaWMgbGljZW5zZToKKyAgLSB2eFdvcmtzIGNvbXBhdGlibGUJKCNkZWZpbmUgVlhXT1JLUykKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBwdWJsaWMgbGljZW5zZS4KKworVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZ1NPQVAgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjMKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcGxpY2Vuc2UuaHRtbAorU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKK1dJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQorZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFJvYmVydCBBLiB2YW4gRW5nZWxlbi4KK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0luc3RhbGxhdGlvbiBub3RlOgorCitXaW4zMiBidWlsZCBuZWVkcyB3aW5zb2NrLmRsbCAoVmlzdWFsIEMrKyAid3NvY2szMi5saWIiKQorVG8gZG8gdGhpcyBpbiBWaXN1YWwgQysrIDYuMCwgZ28gdG8gIlByb2plY3QiLCAic2V0dGluZ3MiLCBzZWxlY3QgdGhlICJMaW5rIgordGFiICh0aGUgcHJvamVjdCBmaWxlIG5lZWRzIHRvIGJlIHNlbGVjdGVkIGluIHRoZSBmaWxlIHZpZXcpIGFuZCBhZGQKKyJ3c29jazMyLmxpYiIgdG8gdGhlICJPYmplY3QvbGlicmFyeSBtb2R1bGVzIiBlbnRyeQorCitPbiBNYWMgT1MgWCB3aXRoIGdjYyAoR0NDKSAzLjEgMjAwMjA0MjAgKHByZXJlbGVhc2UpIHlvdSBNVVNUIGNvbXBpbGUgd2l0aAorLWZzdGFja19jaGVjayB3aGVuIHVzaW5nIC1PMiBiZWNhdXNlIGdjYyAzLjEgaGFzIGEgYnVnIHRoYXQgc21hc2hlcyB0aGUgc3RhY2sKK3doZW4gbG9jYWxseSBhbGxvY2F0ZWQgZGF0YSBleGNlZWRzIDY0Sy4KKworKi8KKworI2lmZGVmIEFTNDAwCisjIHByYWdtYSBjb252ZXJ0KDgxOSkJLyogRUJDRElDIHRvIEFTQ0lJICovCisjZW5kaWYKKworI2luY2x1ZGUgInN0ZHNvYXAyLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworU09BUF9TT1VSQ0VfU1RBTVAoIkAoIykgc3Rkc29hcDIuY3BwIHZlciAyLjcuNmUgMjAwNi0wMi0xOCAxMjowMDowMCBHTVQiKQorZXh0ZXJuICJDIiB7CisjZWxzZQorU09BUF9TT1VSQ0VfU1RBTVAoIkAoIykgc3Rkc29hcDIuYyB2ZXIgMi43LjZlIDIwMDYtMDItMTggMTI6MDA6MDAgR01UIikKKyNlbmRpZgorCisvKiA4Yml0IGNoYXJhY3RlciByZXByZXNlbnRpbmcgdW5rbm93bi9ub25yZXByZXNlbnRhYmxlIGNoYXJhY3RlciBkYXRhIChlLmcuIG5vdCBzdXBwb3J0ZWQgYnkgY3VycmVudCBsb2NhbGUgd2l0aCBtdWx0aWJ5dGUgc3VwcG9ydCBlbmFibGVkKSAqLworI2lmbmRlZiBTT0FQX1VOS05PV05fQ0hBUgorI2RlZmluZSBTT0FQX1VOS05PV05fQ0hBUiAoMTI3KQorI2VuZGlmCisKKy8qICAgICAgRU9GPS0xICovCisjZGVmaW5lIFNPQVBfTFQgKHNvYXBfd2NoYXIpKC0yKSAvKiBYTUwgY2hhcmFjdGVyICc8JyAqLworI2RlZmluZSBTT0FQX1RUIChzb2FwX3djaGFyKSgtMykgLyogWE1MIGNoYXJhY3RlciAnPC8nICovCisjZGVmaW5lIFNPQVBfR1QgKHNvYXBfd2NoYXIpKC00KSAvKiBYTUwgY2hhcmFjdGVyICc+JyAqLworI2RlZmluZSBTT0FQX1FUIChzb2FwX3djaGFyKSgtNSkgLyogWE1MIGNoYXJhY3RlciAnIicgKi8KKyNkZWZpbmUgU09BUF9BUCAoc29hcF93Y2hhcikoLTYpIC8qIFhNTCBjaGFyYWN0ZXIgJycnICovCisKKyNkZWZpbmUgc29hcF9ibGFuayhjKQkJKChjKSA+PSAwICYmIChjKSA8PSAzMikKKyNkZWZpbmUgc29hcF9ub3RibGFuayhjKQkoKGMpID4gMzIpCisjZGVmaW5lIHNvYXBfaGFzaF9wdHIocCkJKCgodW5zaWduZWQgbG9uZykocCkgPj4gMykgJiAoU09BUF9QVFJIQVNIIC0gMSkpCisKKyNpZmRlZiBTT0FQX0RFQlVHCitzdGF0aWMgdm9pZCBzb2FwX2luaXRfbG9ncyhzdHJ1Y3Qgc29hcCopOworc3RhdGljIHZvaWQgc29hcF9jbG9zZV9sb2dmaWxlKHN0cnVjdCBzb2FwKiwgaW50KTsKK3N0YXRpYyB2b2lkIHNvYXBfc2V0X2xvZ2ZpbGUoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyB2b2lkIHNvYXBfZnJlZV9taHQoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyB2b2lkIHNvYXBfdHJhY2tfdW5saW5rKHN0cnVjdCBzb2FwKiwgY29uc3Qgdm9pZCopOworI2VuZGlmCisKKyNpZm5kZWYgUEFMTV8yCitzdGF0aWMgaW50IHNvYXBfc2V0X2Vycm9yKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGludCk7CitzdGF0aWMgaW50IHNvYXBfY29weV9mYXVsdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyBpbnQgc29hcF9nZXRhdHRydmFsKHN0cnVjdCBzb2FwKiwgY2hhciosIHNpemVfdCwgc29hcF93Y2hhcik7CisjZW5kaWYKKworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzb2FwX3djaGFyIHNvYXBfY2hhcihzdHJ1Y3Qgc29hcCopOworc3RhdGljIHNvYXBfd2NoYXIgc29hcF9nZXRfcGkoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBpbnQgc29hcF9pc3hkaWdpdChpbnQpOworc3RhdGljIHZvaWQgKmZwbHVnaW4oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKik7CisjaWZuZGVmIFdJVEhfTk9JRFJFRgorc3RhdGljIHZvaWQgc29hcF91cGRhdGVfcHRycyhzdHJ1Y3Qgc29hcCosIGNoYXIqLCBjaGFyKiwgY2hhciosIGNoYXIqKTsKK3N0YXRpYyBpbnQgc29hcF9oYXNfY29waWVzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyB2b2lkIHNvYXBfaW5pdF9paHQoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyB2b2lkIHNvYXBfZnJlZV9paHQoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyB2b2lkIHNvYXBfaW5pdF9waHQoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyB2b2lkIHNvYXBfZnJlZV9waHQoc3RydWN0IHNvYXAqKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgY29uc3QgY2hhciAqc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitzdGF0aWMgaW50IHNvYXBfaXNudW1lcmljKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworc3RhdGljIHRpbWVfdCBzb2FwX3RpbWVnbShzdHJ1Y3QgdG0qKTsKK3N0YXRpYyBzdHJ1Y3Qgc29hcF9ubGlzdCAqc29hcF9sb29rdXBfbnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc2l6ZV90IG4pOworc3RhdGljIHN0cnVjdCBzb2FwX25saXN0ICpzb2FwX3B1c2hfbnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICpucywgc2hvcnQgdXRpbGl6ZWQpOworc3RhdGljIHZvaWQgc29hcF9wb3BfbnMoc3RydWN0IHNvYXAgKnNvYXApOworc3RhdGljIHZvaWQgc29hcF91dGlsaXplX25zKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHNpemVfdCBuKTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHN0cnVjdCBzb2FwX211bHRpcGFydCAqc29hcF9uZXdfbXVsdGlwYXJ0KHN0cnVjdCBzb2FwKiwgc3RydWN0IHNvYXBfbXVsdGlwYXJ0KiosIHN0cnVjdCBzb2FwX211bHRpcGFydCoqLCBjaGFyKiwgc2l6ZV90KTsKK3N0YXRpYyBpbnQgc29hcF9wdXRkaW1lZmllbGQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc2l6ZV90KTsKK3N0YXRpYyBjaGFyICpzb2FwX2dldGRpbWVmaWVsZChzdHJ1Y3Qgc29hcCosIHNpemVfdCk7CitzdGF0aWMgdm9pZCBzb2FwX3NlbGVjdF9taW1lX2JvdW5kYXJ5KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgaW50IHNvYXBfdmFsaWRfbWltZV9ib3VuZGFyeShzdHJ1Y3Qgc29hcCopOworc3RhdGljIGludCBzb2FwX21hdGNoX2NpZChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitzdGF0aWMgdm9pZCBzb2FwX3Jlc29sdmVfYXR0YWNobWVudChzdHJ1Y3Qgc29hcCosIHN0cnVjdCBzb2FwX211bHRpcGFydCopOworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFdJVEhfR1pJUAorc3RhdGljIGludCBzb2FwX2dldGd6aXBoZHIoc3RydWN0IHNvYXAqKTsKKyNlbmRpZgorCisjaWZkZWYgV0lUSF9PUEVOU1NMCitzdGF0aWMgaW50IHNzbF9pbml0X2RvbmUgPSAwOworc3RhdGljIGludCBzc2xfYXV0aF9pbml0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgaW50IHNzbF92ZXJpZnlfY2FsbGJhY2soaW50LCBYNTA5X1NUT1JFX0NUWCopOworc3RhdGljIGludCBzc2xfcGFzc3dvcmQoY2hhciosIGludCwgaW50LCB2b2lkICopOworc3RhdGljIGNvbnN0IGNoYXIgKnNzbF9lcnJvcihzdHJ1Y3Qgc29hcCosIGludCk7CisvKiBUaGlzIGNhbGxiYWNrIGlzIGluY2x1ZGVkIGZvciBmdXR1cmUgcmVmZXJlbmNlcy4gSXQgc2hvdWxkIG5vdCBiZSBkZWxldGVkCitzdGF0aWMgREggKnNzbF90bXBfZGgoU1NMKiwgaW50LCBpbnQpOworKi8KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoV0lUSF9OT0hUVFApIHx8ICFkZWZpbmVkKFdJVEhfTEVBTkVSKQorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBjb25zdCBjaGFyICpzb2FwX2RlY29kZShjaGFyKiwgc2l6ZV90LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzb2FwX3djaGFyIHNvYXBfZ2V0Y2h1bmtjaGFyKHN0cnVjdCBzb2FwKik7CitzdGF0aWMgY29uc3QgY2hhciAqaHR0cF9lcnJvcihzdHJ1Y3Qgc29hcCosIGludCk7CitzdGF0aWMgaW50IGh0dHBfcG9zdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCk7CitzdGF0aWMgaW50IGh0dHBfZ2V0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgaW50IGh0dHBfc2VuZF9oZWFkZXIoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKik7CitzdGF0aWMgaW50IGh0dHBfcG9zdF9oZWFkZXIoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworc3RhdGljIGludCBodHRwX3Jlc3BvbnNlKHN0cnVjdCBzb2FwKiwgaW50LCBzaXplX3QpOworc3RhdGljIGludCBodHRwX3BhcnNlKHN0cnVjdCBzb2FwKik7CitzdGF0aWMgaW50IGh0dHBfcGFyc2VfaGVhZGVyKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludCBmc2VuZChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworc3RhdGljIHNpemVfdCBmcmVjdihzdHJ1Y3Qgc29hcCosIGNoYXIqLCBzaXplX3QpOworc3RhdGljIGludCB0Y3BfaW5pdChzdHJ1Y3Qgc29hcCopOworc3RhdGljIGNvbnN0IGNoYXIgKnRjcF9lcnJvcihzdHJ1Y3Qgc29hcCopOworI2lmbmRlZiBXSVRIX0lQVjYKK3N0YXRpYyBpbnQgdGNwX2dldGhvc3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICphZGRyLCBzdHJ1Y3QgaW5fYWRkciAqaW5hZGRyKTsKKyNlbmRpZgorc3RhdGljIGludCB0Y3BfY29ubmVjdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjb25zdCBjaGFyICpob3N0LCBpbnQgcG9ydCk7CitzdGF0aWMgaW50IHRjcF9hY2NlcHQoc3RydWN0IHNvYXAqLCBpbnQsIHN0cnVjdCBzb2NrYWRkciosIGludCopOworc3RhdGljIGludCB0Y3BfZGlzY29ubmVjdChzdHJ1Y3Qgc29hcCopOworc3RhdGljIGludCB0Y3BfY2xvc2Vzb2NrZXQoc3RydWN0IHNvYXAqLCBTT0FQX1NPQ0tFVCk7CitzdGF0aWMgaW50IHRjcF9zaHV0ZG93bnNvY2tldChzdHJ1Y3Qgc29hcCosIFNPQVBfU09DS0VULCBpbnQpOworc3RhdGljIGNvbnN0IGNoYXIgKnNvYXBfc3RyZXJyb3Ioc3RydWN0IHNvYXAqKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBBTE0pICYmICFkZWZpbmVkKFBBTE1fMikKK3Vuc2lnbmVkIHNob3J0IGVycm5vOworI2VuZGlmCisKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY29uc3QgY2hhciBzb2FwX2VudjFbNDJdID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIjsKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfZW5jMVs0Ml0gPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iOworc3RhdGljIGNvbnN0IGNoYXIgc29hcF9lbnYyWzQwXSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiOworc3RhdGljIGNvbnN0IGNoYXIgc29hcF9lbmMyWzQwXSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW5jb2RpbmciOworc3RhdGljIGNvbnN0IGNoYXIgc29hcF9ycGNbMzVdID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1ycGMiOworI2VuZGlmCisKKyNpZm5kZWYgUEFMTV8xCitjb25zdCBzdHJ1Y3Qgc29hcF9kb3VibGVfbmFuIHNvYXBfZG91YmxlX25hbiA9IHsweEZGRkZGRkZGLCAweEZGRkZGRkZGfTsKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfYmFzZTY0b1s2NV0gPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CitzdGF0aWMgY29uc3QgY2hhciBzb2FwX2Jhc2U2NGlbODFdID0gIlw3NlhYWFw3N1w2NFw2NVw2Nlw2N1w3MFw3MVw3Mlw3M1w3NFw3NVhYWFhYWFhcMDBcMDFcMDJcMDNcMDRcMDVcMDZcMDdcMTBcMTFcMTJcMTNcMTRcMTVcMTZcMTdcMjBcMjFcMjJcMjNcMjRcMjVcMjZcMjdcMzBcMzFYWFhYWFhcMzJcMzNcMzRcMzVcMzZcMzdcNDBcNDFcNDJcNDNcNDRcNDVcNDZcNDdcNTBcNTFcNTJcNTNcNTRcNTVcNTZcNTdcNjBcNjFcNjJcNjMiOworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgY29uc3QgY2hhciBzb2FwX2luZGVudFsxMV0gPSAiXG5cdFx0XHRcdFx0XHRcdFx0XHQiOworLyogQWx0ZXJuYXRpdmUgaW5kZW50YXRpb24gZm9ybSBmb3IgU09BUF9YTUxfSU5ERU5UOgorc3RhdGljIGNvbnN0IGNoYXIgc29hcF9pbmRlbnRbMjFdID0gIlxuICAgICAgICAgICAgICAgICAgICI7CisqLworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfcGFkZGluZ1s0XSA9ICJcMFwwXDAiOworI2RlZmluZSBTT0FQX1NUUl9QQURESU5HIChzb2FwX3BhZGRpbmcpCisjZGVmaW5lIFNPQVBfU1RSX0VPUyAoc29hcF9wYWRkaW5nKQorI2RlZmluZSBTT0FQX05PTl9OVUxMIChzb2FwX3BhZGRpbmcpCisKKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgaHRtbF9lbnRpdHlfY29kZXNbXSA9IC8qIGVudGl0aWVzIGZvciBYSFRNTCBwYXJzaW5nICovCit7IHsgMTYwLCAibmJzcCIgfSwKKyAgeyAxNjEsICJpZXhjbCIgfSwKKyAgeyAxNjIsICJjZW50IiB9LAorICB7IDE2MywgInBvdW5kIiB9LAorICB7IDE2NCwgImN1cnJlbiIgfSwKKyAgeyAxNjUsICJ5ZW4iIH0sCisgIHsgMTY2LCAiYnJ2YmFyIiB9LAorICB7IDE2NywgInNlY3QiIH0sCisgIHsgMTY4LCAidW1sIiB9LAorICB7IDE2OSwgImNvcHkiIH0sCisgIHsgMTcwLCAib3JkZiIgfSwKKyAgeyAxNzEsICJsYXF1byIgfSwKKyAgeyAxNzIsICJub3QiIH0sCisgIHsgMTczLCAic2h5IiB9LAorICB7IDE3NCwgInJlZyIgfSwKKyAgeyAxNzUsICJtYWNyIiB9LAorICB7IDE3NiwgImRlZyIgfSwKKyAgeyAxNzcsICJwbHVzbW4iIH0sCisgIHsgMTc4LCAic3VwMiIgfSwKKyAgeyAxNzksICJzdXAzIiB9LAorICB7IDE4MCwgImFjdXRlIiB9LAorICB7IDE4MSwgIm1pY3JvIiB9LAorICB7IDE4MiwgInBhcmEiIH0sCisgIHsgMTgzLCAibWlkZG90IiB9LAorICB7IDE4NCwgImNlZGlsIiB9LAorICB7IDE4NSwgInN1cDEiIH0sCisgIHsgMTg2LCAib3JkbSIgfSwKKyAgeyAxODcsICJyYXF1byIgfSwKKyAgeyAxODgsICJmcmFjMTQiIH0sCisgIHsgMTg5LCAiZnJhYzEyIiB9LAorICB7IDE5MCwgImZyYWMzNCIgfSwKKyAgeyAxOTEsICJpcXVlc3QiIH0sCisgIHsgMTkyLCAiQWdyYXZlIiB9LAorICB7IDE5MywgIkFhY3V0ZSIgfSwKKyAgeyAxOTQsICJBY2lyYyIgfSwKKyAgeyAxOTUsICJBdGlsZGUiIH0sCisgIHsgMTk2LCAiQXVtbCIgfSwKKyAgeyAxOTcsICJBcmluZyIgfSwKKyAgeyAxOTgsICJBRWxpZyIgfSwKKyAgeyAxOTksICJDY2VkaWwiIH0sCisgIHsgMjAwLCAiRWdyYXZlIiB9LAorICB7IDIwMSwgIkVhY3V0ZSIgfSwKKyAgeyAyMDIsICJFY2lyYyIgfSwKKyAgeyAyMDMsICJFdW1sIiB9LAorICB7IDIwNCwgIklncmF2ZSIgfSwKKyAgeyAyMDUsICJJYWN1dGUiIH0sCisgIHsgMjA2LCAiSWNpcmMiIH0sCisgIHsgMjA3LCAiSXVtbCIgfSwKKyAgeyAyMDgsICJFVEgiIH0sCisgIHsgMjA5LCAiTnRpbGRlIiB9LAorICB7IDIxMCwgIk9ncmF2ZSIgfSwKKyAgeyAyMTEsICJPYWN1dGUiIH0sCisgIHsgMjEyLCAiT2NpcmMiIH0sCisgIHsgMjEzLCAiT3RpbGRlIiB9LAorICB7IDIxNCwgIk91bWwiIH0sCisgIHsgMjE1LCAidGltZXMiIH0sCisgIHsgMjE2LCAiT3NsYXNoIiB9LAorICB7IDIxNywgIlVncmF2ZSIgfSwKKyAgeyAyMTgsICJVYWN1dGUiIH0sCisgIHsgMjE5LCAiVWNpcmMiIH0sCisgIHsgMjIwLCAiVXVtbCIgfSwKKyAgeyAyMjEsICJZYWN1dGUiIH0sCisgIHsgMjIyLCAiVEhPUk4iIH0sCisgIHsgMjIzLCAic3psaWciIH0sCisgIHsgMjI0LCAiYWdyYXZlIiB9LAorICB7IDIyNSwgImFhY3V0ZSIgfSwKKyAgeyAyMjYsICJhY2lyYyIgfSwKKyAgeyAyMjcsICJhdGlsZGUiIH0sCisgIHsgMjI4LCAiYXVtbCIgfSwKKyAgeyAyMjksICJhcmluZyIgfSwKKyAgeyAyMzAsICJhZWxpZyIgfSwKKyAgeyAyMzEsICJjY2VkaWwiIH0sCisgIHsgMjMyLCAiZWdyYXZlIiB9LAorICB7IDIzMywgImVhY3V0ZSIgfSwKKyAgeyAyMzQsICJlY2lyYyIgfSwKKyAgeyAyMzUsICJldW1sIiB9LAorICB7IDIzNiwgImlncmF2ZSIgfSwKKyAgeyAyMzcsICJpYWN1dGUiIH0sCisgIHsgMjM4LCAiaWNpcmMiIH0sCisgIHsgMjM5LCAiaXVtbCIgfSwKKyAgeyAyNDAsICJldGgiIH0sCisgIHsgMjQxLCAibnRpbGRlIiB9LAorICB7IDI0MiwgIm9ncmF2ZSIgfSwKKyAgeyAyNDMsICJvYWN1dGUiIH0sCisgIHsgMjQ0LCAib2NpcmMiIH0sCisgIHsgMjQ1LCAib3RpbGRlIiB9LAorICB7IDI0NiwgIm91bWwiIH0sCisgIHsgMjQ3LCAiZGl2aWRlIiB9LAorICB7IDI0OCwgIm9zbGFzaCIgfSwKKyAgeyAyNDksICJ1Z3JhdmUiIH0sCisgIHsgMjUwLCAidWFjdXRlIiB9LAorICB7IDI1MSwgInVjaXJjIiB9LAorICB7IDI1MiwgInV1bWwiIH0sCisgIHsgMjUzLCAieWFjdXRlIiB9LAorICB7IDI1NCwgInRob3JuIiB9LAorICB7IDI1NSwgInl1bWwiIH0sCisgIHsgICAwLCBOVUxMIH0KK307CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgaF9lcnJvcl9jb2Rlc1tdID0KK3sKKyNpZmRlZiBIT1NUX05PVF9GT1VORCAgIAorICB7IEhPU1RfTk9UX0ZPVU5ELCAiSG9zdCBub3QgZm91bmQiIH0sCisjZW5kaWYKKyNpZmRlZiBUUllfQUdBSU4KKyAgeyBUUllfQUdBSU4sICJUcnkgQWdhaW4iIH0sCisjZW5kaWYKKyNpZmRlZiBOT19SRUNPVkVSWSAgCisgIHsgTk9fUkVDT1ZFUlksICJObyBSZWNvdmVyeSIgfSwKKyNlbmRpZgorI2lmZGVmIE5PX0RBVEEKKyAgeyBOT19EQVRBLCAiTm8gRGF0YSIgfSwKKyNlbmRpZgorI2lmZGVmIE5PX0FERFJFU1MKKyAgeyBOT19BRERSRVNTLCAiTm8gQWRkcmVzcyIgfSwKKyNlbmRpZgorICB7IDAsIE5VTEwgfQorfTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgaF9odHRwX2Vycm9yX2NvZGVzW10gPQoreyB7IDIwMSwgIkNyZWF0ZWQiIH0sCisgIHsgMjAyLCAiQWNjZXB0ZWQiIH0sCisgIHsgMjAzLCAiTm9uLUF1dGhvcml0YXRpdmUgSW5mb3JtYXRpb24iIH0sCisgIHsgMjA0LCAiTm8gQ29udGVudCIgfSwKKyAgeyAyMDUsICJSZXNldCBDb250ZW50IiB9LAorICB7IDIwNiwgIlBhcnRpYWwgQ29udGVudCIgfSwKKyAgeyAzMDAsICJNdWx0aXBsZSBDaG9pY2VzIiB9LAorICB7IDMwMSwgIk1vdmVkIFBlcm1hbmVudGx5IiB9LAorICB7IDMwMiwgIkZvdW5kIiB9LAorICB7IDMwMywgIlNlZSBPdGhlciIgfSwKKyAgeyAzMDQsICJOb3QgTW9kaWZpZWQiIH0sCisgIHsgMzA1LCAiVXNlIFByb3h5IiB9LAorICB7IDMwNywgIlRlbXBvcmFyeSBSZWRpcmVjdCIgfSwKKyAgeyA0MDAsICJCYWQgUmVxdWVzdCIgfSwKKyAgeyA0MDEsICJVbmF1dGhvcml6ZWQiIH0sCisgIHsgNDAyLCAiUGF5bWVudCBSZXF1aXJlZCIgfSwKKyAgeyA0MDMsICJGb3JiaWRkZW4iIH0sCisgIHsgNDA0LCAiTm90IEZvdW5kIiB9LAorICB7IDQwNSwgIk1ldGhvZCBOb3QgQWxsb3dlZCIgfSwKKyAgeyA0MDYsICJOb3QgQWNjZXB0YWJsZSIgfSwKKyAgeyA0MDcsICJQcm94eSBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZCIgfSwKKyAgeyA0MDgsICJSZXF1ZXN0IFRpbWUtb3V0IiB9LAorICB7IDQwOSwgIkNvbmZsaWN0IiB9LAorICB7IDQxMCwgIkdvbmUiIH0sCisgIHsgNDExLCAiTGVuZ3RoIFJlcXVpcmVkIiB9LAorICB7IDQxMiwgIlByZWNvbmRpdGlvbiBGYWlsZWQiIH0sCisgIHsgNDEzLCAiUmVxdWVzdCBFbnRpdHkgVG9vIExhcmdlIiB9LAorICB7IDQxNCwgIlJlcXVlc3QtVVJJIFRvbyBMYXJnZSIgfSwKKyAgeyA0MTUsICJVbnN1cHBvcnRlZCBNZWRpYSBUeXBlIiB9LAorICB7IDQxNiwgIlJlcXVlc3RlZCByYW5nZSBub3Qgc2F0aXNmaWFibGUiIH0sCisgIHsgNDE3LCAiRXhwZWN0YXRpb24gRmFpbGVkIiB9LAorICB7IDUwMCwgIkludGVybmFsIFNlcnZlciBFcnJvciIgfSwKKyAgeyA1MDEsICJOb3QgSW1wbGVtZW50ZWQiIH0sCisgIHsgNTAyLCAiQmFkIEdhdGV3YXkiIH0sCisgIHsgNTAzLCAiU2VydmljZSBVbmF2YWlsYWJsZSIgfSwKKyAgeyA1MDQsICJHYXRld2F5IFRpbWUtb3V0IiB9LAorICB7IDUwNSwgIkhUVFAgVmVyc2lvbiBub3Qgc3VwcG9ydGVkIiB9LAorICB7ICAgMCwgTlVMTCB9Cit9OworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFdJVEhfT1BFTlNTTAorc3RhdGljIGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwIGhfc3NsX2Vycm9yX2NvZGVzW10gPQoreworI2RlZmluZSBfU1NMX0VSUk9SKGUpIHsgZSwgI2UgfQorICBfU1NMX0VSUk9SKFNTTF9FUlJPUl9TU0wpLAorICBfU1NMX0VSUk9SKFNTTF9FUlJPUl9aRVJPX1JFVFVSTiksCisgIF9TU0xfRVJST1IoU1NMX0VSUk9SX1dBTlRfUkVBRCksCisgIF9TU0xfRVJST1IoU1NMX0VSUk9SX1dBTlRfV1JJVEUpLAorICBfU1NMX0VSUk9SKFNTTF9FUlJPUl9XQU5UX0NPTk5FQ1QpLAorICBfU1NMX0VSUk9SKFNTTF9FUlJPUl9XQU5UX1g1MDlfTE9PS1VQKSwKKyAgX1NTTF9FUlJPUihTU0xfRVJST1JfU1lTQ0FMTCksCisgIHsgMCwgTlVMTCB9Cit9OworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCBtaW1lX2NvZGVzW10gPQoreyB7IFNPQVBfTUlNRV83QklULAkJIjdiaXQiIH0sCisgIHsgU09BUF9NSU1FXzhCSVQsCQkiOGJpdCIgfSwKKyAgeyBTT0FQX01JTUVfQklOQVJZLAkJImJpbmFyeSIgfSwKKyAgeyBTT0FQX01JTUVfUVVPVEVEX1BSSU5UQUJMRSwgInF1b3RlZC1wcmludGFibGUiIH0sCisgIHsgU09BUF9NSU1FX0JBU0U2NCwJCSJiYXNlNjQiIH0sCisgIHsgU09BUF9NSU1FX0lFVEZfVE9LRU4sCSJpZXRmLXRva2VuIiB9LAorICB7IFNPQVBfTUlNRV9YX1RPS0VOLAkJIngtdG9rZW4iIH0sCisgIHsgMCwJCQkJTlVMTCB9Cit9OworI2VuZGlmCisKKyNpZmRlZiBXSU4zMgorc3RhdGljIGludCB0Y3BfZG9uZSA9IDA7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorZnNlbmQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBuKQoreyByZWdpc3RlciBpbnQgbndyaXR0ZW47CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgIWRlZmluZWQoV0lUSF9MRUFOKQorICBpZiAoc29hcC0+b3MpCisgIHsgc29hcC0+b3MtPndyaXRlKHMsIG4pOworICAgIGlmIChzb2FwLT5vcy0+Z29vZCgpKQorICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgcmV0dXJuIFNPQVBfRU9GOworICB9CisjZW5kaWYKKyAgd2hpbGUgKG4pCisgIHsgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgICAgeyAKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICBpZiAoc29hcC0+c2VuZF90aW1lb3V0KQorICAgICAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgICAgICBmZF9zZXQgZmQ7CisgICAgICAgIGlmIChzb2FwLT5zZW5kX3RpbWVvdXQgPiAwKQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gc29hcC0+c2VuZF90aW1lb3V0OworICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gLXNvYXAtPnNlbmRfdGltZW91dC8xMDAwMDAwOworICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IC1zb2FwLT5zZW5kX3RpbWVvdXQlMTAwMDAwMDsKKyAgICAgICAgfQorICAgICAgICBGRF9aRVJPKCZmZCk7CisgICAgICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmZmQpOworICAgICAgICBmb3IgKDs7KQorICAgICAgICB7IHJlZ2lzdGVyIGludCByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksIE5VTEwsICZmZCwgJmZkLCAmdGltZW91dCk7CisgICAgICAgICAgaWYgKHIgPiAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgaWYgKCFyKQorICAgICAgICAgIHsgc29hcC0+ZXJybnVtID0gMDsKKyAgICAgICAgICAgIHJldHVybiBTT0FQX0VPRjsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FQUdBSU4pCisgICAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICAgIHJldHVybiBTT0FQX0VPRjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyNlbmRpZgorI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgICAgaWYgKHNvYXAtPnNzbCkKKyAgICAgICAgbndyaXR0ZW4gPSBTU0xfd3JpdGUoc29hcC0+c3NsLCBzLCBuKTsKKyAgICAgIGVsc2UgaWYgKHNvYXAtPmJpbykKKyAgICAgICAgbndyaXR0ZW4gPSBCSU9fd3JpdGUoc29hcC0+YmlvLCBzLCBuKTsKKyAgICAgIGVsc2UKKyNlbmRpZgorI2lmZGVmIFdJVEhfVURQCisgICAgICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgICAgeyBpZiAoc29hcC0+cGVlcmxlbikKKwkgIG53cml0dGVuID0gc2VuZHRvKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHMsIG4sIHNvYXAtPnNvY2tldF9mbGFncywgKHN0cnVjdCBzb2NrYWRkciopJnNvYXAtPnBlZXIsIHNvYXAtPnBlZXJsZW4pOworICAgICAgICBlbHNlCisJICBud3JpdHRlbiA9IHNlbmQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgcywgbiwgc29hcC0+c29ja2V0X2ZsYWdzKTsKKwkvKiByZXRyeSBhbmQgYmFjay1vZmYgYWxnb3JpdGhtICovCisJLyogVE9ETzogdGhpcyBpcyBub3QgdmVyeSBjbGVhciBmcm9tIHNwZWNzIHNvIHZlcmlmeSBhbmQgbGltaXQgY29uZGl0aW9ucyB1bmRlciB3aGljaCB3ZSBzaG91bGQgbG9vcCAoZS5nLiBFTk9CVUZTKSAqLworCWlmIChud3JpdHRlbiA8IDApCisgICAgICAgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgICAgICBmZF9zZXQgZmQ7CisJICBpbnQgdWRwX3JlcGVhdDsKKwkgIGludCB1ZHBfZGVsYXk7CisgICAgICAgICAgaWYgKChzb2FwLT5jb25uZWN0X2ZsYWdzICYgU09fQlJPQURDQVNUKSkKKwkgICAgdWRwX3JlcGVhdCA9IDM7IC8qIFNPQVAtb3Zlci1VRFAgTVVMVElDQVNUX1VEUF9SRVBFQVQgLSAxICovCisgICAgICAgICAgZWxzZQorCSAgICB1ZHBfcmVwZWF0ID0gMTsgLyogU09BUC1vdmVyLVVEUCBVTklDQVNUX1VEUF9SRVBFQVQgLSAxICovCisJICB1ZHBfZGVsYXkgPSAoc29hcF9yYW5kb20gJSAyMDEpICsgNTA7IC8qIFVEUF9NSU5fREVMQVkgLi4gVURQX01BWF9ERUxBWSAqLworCSAgZG8KKyAgICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gMDsKKyAgICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDEwMDAgKiB1ZHBfZGVsYXk7IC8qIG1zICovCisgICAgICAgICAgICBGRF9aRVJPKCZmZCk7CisgICAgICAgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJmZkKTsKKyAgICAgICAgICAgIHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCBOVUxMLCBOVUxMLCAmZmQsICZ0aW1lb3V0KTsKKwkgICAgaWYgKHNvYXAtPnBlZXJsZW4pCisJICAgICAgbndyaXR0ZW4gPSBzZW5kdG8oKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgcywgbiwgc29hcC0+c29ja2V0X2ZsYWdzLCAoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlciwgc29hcC0+cGVlcmxlbik7CisgICAgICAgICAgICBlbHNlCisJICAgICAgbndyaXR0ZW4gPSBzZW5kKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHMsIG4sIHNvYXAtPnNvY2tldF9mbGFncyk7CisJICAgIHVkcF9kZWxheSA8PD0gMTsKKwkgICAgaWYgKHVkcF9kZWxheSA+IDUwMCkgLyogVURQX1VQUEVSX0RFTEFZICovCisJICAgICAgdWRwX2RlbGF5ID0gNTAwOworCSAgfQorCSAgd2hpbGUgKG53cml0dGVuIDwgMCAmJiAtLXVkcF9yZXBlYXQgPiAwKTsKKwl9CisgICAgICB9CisgICAgICBlbHNlCisjZW5kaWYKKyNpZiAhZGVmaW5lZChQQUxNKSAmJiAhZGVmaW5lZChBUzQwMCkKKyAgICAgICAgbndyaXR0ZW4gPSBzZW5kKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHMsIG4sIHNvYXAtPnNvY2tldF9mbGFncyk7CisjZWxzZQorICAgICAgICBud3JpdHRlbiA9IHNlbmQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgKHZvaWQqKXMsIG4sIHNvYXAtPnNvY2tldF9mbGFncyk7CisjZW5kaWYKKyAgICAgIGlmIChud3JpdHRlbiA8PSAwKQorICAgICAgeworI2lmZGVmIFdJVEhfT1BFTlNTTAorCWludCBlcnI7CisgICAgICAgIGlmIChzb2FwLT5zc2wgJiYgKGVyciA9IFNTTF9nZXRfZXJyb3Ioc29hcC0+c3NsLCBud3JpdHRlbikpICE9IFNTTF9FUlJPUl9OT05FICYmIGVyciAhPSBTU0xfRVJST1JfV0FOVF9SRUFEICYmIGVyciAhPSBTU0xfRVJST1JfV0FOVF9XUklURSkKKyAgICAgICAgICByZXR1cm4gU09BUF9FT0Y7CisjZW5kaWYKKyAgICAgICAgaWYgKHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FV09VTERCTE9DSyAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VBR0FJTikKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICByZXR1cm4gU09BUF9FT0Y7CisgICAgICAgIH0KKyAgICAgICAgbndyaXR0ZW4gPSAwOyAvKiBhbmQgY2FsbCB3cml0ZSgpIGFnYWluICovCisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisjaWZkZWYgV0lUSF9GQVNUQ0dJCisgICAgICBud3JpdHRlbiA9IGZ3cml0ZSgodm9pZCopcywgMSwgbiwgc3Rkb3V0KTsKKyAgICAgIGZmbHVzaChzdGRvdXQpOworI2Vsc2UKKyNpZmRlZiBVTkRFUl9DRQorICAgICAgbndyaXR0ZW4gPSBmd3JpdGUocywgMSwgbiwgc29hcC0+c2VuZGZkKTsKKyNlbHNlCisjaWZkZWYgVlhXT1JLUworI2lmZGVmIFdNV19SUE1fSU8KKyAgICAgIGlmIChzb2FwLT5ycG1yZXFpZCkKKyAgICAgICAgbndyaXR0ZW4gPSAoaHR0cEJsb2NrUHV0KHNvYXAtPnJwbXJlcWlkLCBzLCBuKSA9PSAwKSA/IG4gOiAtMTsgCisgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgbndyaXR0ZW4gPSBmd3JpdGUocywgc2l6ZW9mKGNoYXIpLCBuLCBmZG9wZW4oc29hcC0+c2VuZGZkLCAidyIpKTsKKyNlbHNlCisgICAgICBud3JpdHRlbiA9IHdyaXRlKChTT0FQX1NPQ0tFVClzb2FwLT5zZW5kZmQsIHMsIG4pOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorICAgICAgaWYgKG53cml0dGVuIDw9IDApCisgICAgICB7IGlmIChzb2FwX2Vycm5vICE9IFNPQVBfRUlOVFIgJiYgc29hcF9lcnJubyAhPSBTT0FQX0VXT1VMREJMT0NLICYmIHNvYXBfZXJybm8gIT0gU09BUF9FQUdBSU4pCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9lcnJubzsKKyAgICAgICAgICByZXR1cm4gU09BUF9FT0Y7CisgICAgICAgIH0KKyAgICAgICAgbndyaXR0ZW4gPSAwOyAvKiBhbmQgY2FsbCB3cml0ZSgpIGFnYWluICovCisgICAgICB9CisgICAgfQorICAgIG4gLT0gbndyaXR0ZW47CisgICAgcyArPSBud3JpdHRlbjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmRfcmF3KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBzaXplX3QgbikKK3sgaWYgKCFuKQorICAgIHJldHVybiBTT0FQX09LOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICB7IHNvYXAtPmNvdW50ICs9IG47CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgICAgaWYgKHNvYXAtPmZwcmVwYXJlc2VuZCAmJiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pICE9IFNPQVBfSU9fU1RPUkUpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBzb2FwLT5mcHJlcGFyZXNlbmQoc29hcCwgcywgbik7CisjZW5kaWYKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pCisgIHsgcmVnaXN0ZXIgc2l6ZV90IGkgPSBTT0FQX0JVRkxFTiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICB3aGlsZSAobiA+PSBpKQorICAgIHsgbWVtY3B5KHNvYXAtPmJ1ZiArIHNvYXAtPmJ1ZmlkeCwgcywgaSk7CisgICAgICBzb2FwLT5idWZpZHggPSBTT0FQX0JVRkxFTjsKKyAgICAgIGlmIChzb2FwX2ZsdXNoKHNvYXApKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBzICs9IGk7CisgICAgICBuIC09IGk7CisgICAgICBpID0gU09BUF9CVUZMRU47CisgICAgfQorICAgIG1lbWNweShzb2FwLT5idWYgKyBzb2FwLT5idWZpZHgsIHMsIG4pOworICAgIHNvYXAtPmJ1ZmlkeCArPSBuOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIHJldHVybiBzb2FwX2ZsdXNoX3Jhdyhzb2FwLCBzLCBuKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9mbHVzaChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IG4gPSBzb2FwLT5idWZpZHg7CisgIGlmIChuKQorICB7IHNvYXAtPmJ1ZmlkeCA9IDA7CisjaWZkZWYgV0lUSF9aTElCCisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKQorICAgIHsgc29hcC0+ZF9zdHJlYW0ubmV4dF9pbiA9IChCeXRlKilzb2FwLT5idWY7CisgICAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbiA9ICh1bnNpZ25lZCBpbnQpbjsKKyNpZmRlZiBXSVRIX0daSVAKKyAgICAgIHNvYXAtPnpfY3JjID0gY3JjMzIoc29hcC0+el9jcmMsIChCeXRlKilzb2FwLT5idWYsICh1bnNpZ25lZCBpbnQpbik7CisjZW5kaWYKKyAgICAgIGRvCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVmbGF0aW5nICV1IGJ5dGVzXG4iLCBzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbikpOworICAgICAgICBpZiAoZGVmbGF0ZSgmc29hcC0+ZF9zdHJlYW0sIFpfTk9fRkxVU0gpICE9IFpfT0spCisgICAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVbmFibGUgdG8gZGVmbGF0ZTogJXNcbiIsIHNvYXAtPmRfc3RyZWFtLm1zZz9zb2FwLT5kX3N0cmVhbS5tc2c6IiIpKTsKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQpCisgICAgICAgIHsgaWYgKHNvYXBfZmx1c2hfcmF3KHNvYXAsIHNvYXAtPnpfYnVmLCBTT0FQX0JVRkxFTikpCisgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZSopc29hcC0+el9idWY7CisgICAgICAgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0ID0gU09BUF9CVUZMRU47CisgICAgICAgIH0KKyAgICAgIH0gd2hpbGUgKHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgICByZXR1cm4gc29hcF9mbHVzaF9yYXcoc29hcCwgc29hcC0+YnVmLCBuKTsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9mbHVzaF9yYXcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBuKQoreyBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX1NUT1JFKQorICB7IHJlZ2lzdGVyIGNoYXIgKnQ7CisgICAgaWYgKCEodCA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgbikpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgbWVtY3B5KHQsIHMsIG4pOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICAgIGlmIChzb2FwLT5mcHJlcGFyZXNlbmQpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBzb2FwLT5mcHJlcGFyZXNlbmQoc29hcCwgcywgbik7CisjZW5kaWYKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKQorICB7IGNoYXIgdFsxNl07CisgICAgc3ByaW50Zih0LCAiXHJcbiVsWFxyXG4iICsgKHNvYXAtPmNodW5rc2l6ZSA/IDAgOiAyKSwgKHVuc2lnbmVkIGxvbmcpbik7CisgICAgREJHTVNHKFNFTlQsIHQsIHN0cmxlbih0KSk7CisgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZzZW5kKHNvYXAsIHQsIHN0cmxlbih0KSkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIHNvYXAtPmNodW5rc2l6ZSArPSBuOworICB9CisgIERCR01TRyhTRU5ULCBzLCBuKTsKKyNlbmRpZgorICByZXR1cm4gc29hcC0+ZXJyb3IgPSBzb2FwLT5mc2VuZChzb2FwLCBzLCBuKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZW5kKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzKQoreyBpZiAocykKKyAgICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCBzdHJsZW4ocykpOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZW5kMihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKQoreyBpZiAoc29hcF9zZW5kKHNvYXAsIHMxKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX3NlbmQoc29hcCwgczIpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2VuZDMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgY29uc3QgY2hhciAqczMpCit7IGlmIChzb2FwX3NlbmQoc29hcCwgczEpCisgICB8fCBzb2FwX3NlbmQoc29hcCwgczIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfc2VuZChzb2FwLCBzMyk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc2l6ZV90CitmcmVjdihzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqcywgc2l6ZV90IG4pCit7IHJlZ2lzdGVyIGludCByOworICBzb2FwLT5lcnJudW0gPSAwOworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpICYmICFkZWZpbmVkKFdJVEhfTEVBTikKKyAgaWYgKHNvYXAtPmlzKQorICB7IGlmIChzb2FwLT5pcy0+Z29vZCgpKQorICAgICAgcmV0dXJuIHNvYXAtPmlzLT5yZWFkKHMsIG4pLmdjb3VudCgpOworICAgIHJldHVybiAwOworICB9CisjZW5kaWYKKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgIHsgZm9yICg7OykKKyAgICB7IAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIGlmIChzb2FwLT5yZWN2X3RpbWVvdXQpCisgICAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICAgIGZkX3NldCBmZDsKKyAgICAgICAgaWYgKHNvYXAtPnJlY3ZfdGltZW91dCA+IDApCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSBzb2FwLT5yZWN2X3RpbWVvdXQ7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSAtc29hcC0+cmVjdl90aW1lb3V0LzEwMDAwMDA7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gLXNvYXAtPnJlY3ZfdGltZW91dCUxMDAwMDAwOworICAgICAgICB9CisgICAgICAgIEZEX1pFUk8oJmZkKTsKKyAgICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZmZCk7CisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCAmZmQsIE5VTEwsICZmZCwgJnRpbWVvdXQpOworICAgICAgICAgIGlmIChyID4gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGlmICghcikKKwkgIHsgc29hcC0+ZXJybnVtID0gMDsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUiAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VBR0FJTikKKwkgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyNlbmRpZgorI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgICAgaWYgKHNvYXAtPnNzbCkKKyAgICAgIHsgaW50IGVycjsKKwlyID0gU1NMX3JlYWQoc29hcC0+c3NsLCBzLCBuKTsKKyAgICAgICAgaWYgKHIgPiAwKQorICAgICAgICAgIHJldHVybiAoc2l6ZV90KXI7CisJZXJyID0gU1NMX2dldF9lcnJvcihzb2FwLT5zc2wsIHIpOworCWlmIChlcnIgIT0gU1NMX0VSUk9SX05PTkUgJiYgZXJyICE9IFNTTF9FUlJPUl9XQU5UX1JFQUQgJiYgZXJyICE9IFNTTF9FUlJPUl9XQU5UX1dSSVRFKQorICAgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgZWxzZSBpZiAoc29hcC0+YmlvKQorICAgICAgeyByID0gQklPX3JlYWQoc29hcC0+YmlvLCBzLCBuKTsKKyAgICAgICAgaWYgKHIgPiAwKQorICAgICAgICAgIHJldHVybiAoc2l6ZV90KXI7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgZWxzZQorI2VuZGlmCisgICAgICB7IAorI2lmZGVmIFdJVEhfVURQCisgICAgICAgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgICAgIHsgU09BUF9TT0NLTEVOX1QgayA9IChTT0FQX1NPQ0tMRU5fVClzaXplb2Yoc29hcC0+cGVlcik7CisJICBtZW1zZXQoKHZvaWQqKSZzb2FwLT5wZWVyLCAwLCBzaXplb2Yoc29hcC0+cGVlcikpOworICAgICAgICAgIHIgPSByZWN2ZnJvbSgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyLCAmayk7CS8qIHBvcnRhYmlsaXR5IG5vdGU6IHNlZSBTT0FQX1NPQ0tMRU5fVCBkZWZpbml0aW9uIGluIHN0ZHNvYXAyLmggKi8KKwkgIHNvYXAtPnBlZXJsZW4gPSAoc2l6ZV90KWs7CisjaWZuZGVmIFdJVEhfSVBWNgorICAgICAgICAgIHNvYXAtPmlwID0gbnRvaGwoc29hcC0+cGVlci5zaW5fYWRkci5zX2FkZHIpOworICAgICAgICAgIHNvYXAtPnBvcnQgPSAoaW50KW50b2hzKHNvYXAtPnBlZXIuc2luX3BvcnQpOworI2VuZGlmCisgICAgICAgIH0KKwllbHNlCisjZW5kaWYKKyAgICAgICAgICByID0gcmVjdigoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MpOworICAgICAgICBpZiAociA+PSAwKQorICAgICAgICAgIHJldHVybiAoc2l6ZV90KXI7CisgICAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUFHQUlOICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRVdPVUxEQkxPQ0spCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgIH0KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICAgIGZkX3NldCBmZDsKKyAgICAgICAgdGltZW91dC50dl9zZWMgPSAwOworICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAxMDAwMDsKKyAgICAgICAgRkRfWkVSTygmZmQpOworICAgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJmZkKTsKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICAgICAgaWYgKHNvYXAtPnNzbCAmJiBTU0xfZ2V0X2Vycm9yKHNvYXAtPnNzbCwgcikgPT0gU1NMX0VSUk9SX1dBTlRfV1JJVEUpCisgICAgICAgICAgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCBOVUxMLCAmZmQsICZmZCwgJnRpbWVvdXQpOworICAgICAgICBlbHNlCisgICAgICAgICAgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCAmZmQsIE5VTEwsICZmZCwgJnRpbWVvdXQpOworI2Vsc2UKKyAgICAgICAgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCAmZmQsIE5VTEwsICZmZCwgJnRpbWVvdXQpOworI2VuZGlmCisgICAgICAgIGlmIChyIDwgMCAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKyAgICB9CisgIH0KKyNpZmRlZiBXSVRIX0ZBU1RDR0kKKyAgcmV0dXJuIGZyZWFkKHMsIDEsIG4sIHN0ZGluKTsKKyNlbHNlCisjaWZkZWYgVU5ERVJfQ0UKKyAgcmV0dXJuIGZyZWFkKHMsIDEsIG4sIHNvYXAtPnJlY3ZmZCk7CisjZWxzZQorI2lmZGVmIFdNV19SUE1fSU8KKyAgaWYgKHNvYXAtPnJwbXJlcWlkKQorICAgIHIgPSBodHRwQmxvY2tSZWFkKHNvYXAtPnJwbXJlcWlkLCBzLCBuKTsKKyAgZWxzZQorI2VuZGlmCisgIHIgPSByZWFkKChTT0FQX1NPQ0tFVClzb2FwLT5yZWN2ZmQsIHMsIG4pOworICBpZiAociA+PSAwKQorICAgIHJldHVybiAoc2l6ZV90KXI7CisgIHNvYXAtPmVycm51bSA9IHNvYXBfZXJybm87CisgIHJldHVybiAwOworI2VuZGlmCisjZW5kaWYKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHNvYXBfd2NoYXIKK3NvYXBfZ2V0Y2h1bmtjaGFyKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcC0+YnVmaWR4IDwgc29hcC0+YnVmbGVuKQorICAgIHJldHVybiBzb2FwLT5idWZbc29hcC0+YnVmaWR4KytdOworICBzb2FwLT5idWZpZHggPSAwOworICBzb2FwLT5idWZsZW4gPSBzb2FwLT5jaHVua2J1ZmxlbiA9IHNvYXAtPmZyZWN2KHNvYXAsIHNvYXAtPmJ1ZiwgU09BUF9CVUZMRU4pOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlYWQgJXUgYnl0ZXMgZnJvbSBzb2NrZXQgJWRcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+YnVmbGVuLCBzb2FwLT5zb2NrZXQpKTsKKyAgREJHTVNHKFJFQ1YsIHNvYXAtPmJ1Ziwgc29hcC0+YnVmbGVuKTsKKyAgaWYgKHNvYXAtPmJ1ZmxlbikKKyAgICByZXR1cm4gc29hcC0+YnVmW3NvYXAtPmJ1ZmlkeCsrXTsKKyAgcmV0dXJuIEVPRjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc29hcF9pc3hkaWdpdChpbnQgYykKK3sgcmV0dXJuIChjID49ICcwJyAmJiBjIDw9ICc5JykgfHwgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKSB8fCAoYyA+PSAnYScgJiYgYyA8PSAnZicpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlY3ZfcmF3KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzaXplX3QgcmV0OworI2lmZGVmIFdJVEhfWkxJQgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIpCisgIHsgaWYgKHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID09IFpfTlVMTCkKKyAgICAgIHJldHVybiBFT0Y7CisgICAgaWYgKHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luIHx8ICFzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQpCisgICAgeyByZWdpc3RlciBpbnQgcjsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5mbGF0aW5nXG4iKSk7CisgICAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IChCeXRlKilzb2FwLT5idWY7CisgICAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgPSBTT0FQX0JVRkxFTjsKKyAgICAgIHIgPSBpbmZsYXRlKCZzb2FwLT5kX3N0cmVhbSwgWl9OT19GTFVTSCk7CisgICAgICBpZiAociA9PSBaX09LIHx8IHIgPT0gWl9TVFJFQU1fRU5EKQorICAgICAgeyBzb2FwLT5idWZpZHggPSAwOworICAgICAgICBzb2FwLT5idWZsZW4gPSBTT0FQX0JVRkxFTiAtIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dDsKKyAgICAgICAgaWYgKHNvYXAtPnpsaWJfaW4gPT0gU09BUF9aTElCX0daSVApCisgICAgICAgICAgc29hcC0+el9jcmMgPSBjcmMzMihzb2FwLT56X2NyYywgKEJ5dGUqKXNvYXAtPmJ1ZiwgKHVuc2lnbmVkIGludClzb2FwLT5idWZsZW4pOworICAgICAgICBpZiAociA9PSBaX1NUUkVBTV9FTkQpCisgICAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbmZsYXRlZCAlbHUtPiVsdSBieXRlc1xuIiwgc29hcC0+ZF9zdHJlYW0udG90YWxfaW4sIHNvYXAtPmRfc3RyZWFtLnRvdGFsX291dCkpOworICAgICAgICAgIHNvYXAtPnpfcmF0aW9faW4gPSAoZmxvYXQpc29hcC0+ZF9zdHJlYW0udG90YWxfaW4gLyAoZmxvYXQpc29hcC0+ZF9zdHJlYW0udG90YWxfb3V0OworICAgICAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gWl9OVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChzb2FwLT5idWZsZW4pCisgICAgICAgIHsgc29hcC0+Y291bnQgKz0gc29hcC0+YnVmbGVuOworICAgICAgICAgIHJldHVybiBTT0FQX09LOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmIChyICE9IFpfQlVGX0VSUk9SKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluZmxhdGUgZXJyb3I6ICVzXG4iLCBzb2FwLT5kX3N0cmVhbS5tc2c/c29hcC0+ZF9zdHJlYW0ubXNnOiIiKSk7CisgICAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gWl9OVUxMOworCXNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgICByZXR1cm4gRU9GOworICAgICAgfQorICAgIH0KK3psaWJfYWdhaW46CisgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSyAmJiAhc29hcC0+Y2h1bmtzaXplKQorICAgIHsgbWVtY3B5KHNvYXAtPmJ1Ziwgc29hcC0+el9idWYsIFNPQVBfQlVGTEVOKTsKKyAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPnpfYnVmbGVuOworICAgIH0KKyAgfQorI2VuZGlmCisjaWZuZGVmIFdJVEhfTk9IVFRQCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspIC8qIHJlYWQgSFRUUCBjaHVua2VkIHRyYW5zZmVyICovCisgIHsgCitjaHVua19hZ2FpbjoKKyAgICBpZiAoc29hcC0+Y2h1bmtzaXplKQorICAgIHsgc29hcC0+YnVmbGVuID0gcmV0ID0gc29hcC0+ZnJlY3Yoc29hcCwgc29hcC0+YnVmLCBzb2FwLT5jaHVua3NpemUgPiBTT0FQX0JVRkxFTiA/IFNPQVBfQlVGTEVOIDogc29hcC0+Y2h1bmtzaXplKTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR2V0dGluZyBjaHVuazogcmVhZCAldSBieXRlc1xuIiwgKHVuc2lnbmVkIGludClyZXQpKTsKKyAgICAgIERCR01TRyhSRUNWLCBzb2FwLT5idWYsIHJldCk7CisgICAgICBzb2FwLT5idWZpZHggPSAwOworICAgICAgc29hcC0+Y2h1bmtzaXplIC09IHJldDsKKyAgICB9CisgICAgZWxzZQorICAgIHsgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICAgICAgY2hhciAqdCwgdG1wWzhdOworICAgICAgdCA9IHRtcDsKKyAgICAgIGlmICghc29hcC0+Y2h1bmtidWZsZW4pCisgICAgICB7IHNvYXAtPmNodW5rYnVmbGVuID0gcmV0ID0gc29hcC0+ZnJlY3Yoc29hcCwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTik7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVhZCAldSBieXRlcyAoY2h1bmtlZCkgZnJvbSBzb2NrZXQgJWRcbiIsICh1bnNpZ25lZCBpbnQpcmV0LCBzb2FwLT5zb2NrZXQpKTsKKyAgICAgICAgREJHTVNHKFJFQ1YsIHNvYXAtPmJ1ZiwgcmV0KTsKKyAgICAgICAgc29hcC0+YnVmaWR4ID0gMDsKKyAgICAgICAgaWYgKCFyZXQpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmFoZWFkID0gRU9GOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBzb2FwLT5idWZpZHggPSBzb2FwLT5idWZsZW47CisgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5jaHVua2J1ZmxlbjsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR2V0dGluZyBjaHVuayBzaXplIChpZHg9JXUgbGVuPSV1KVxuIiwgKHVuc2lnbmVkIGludClzb2FwLT5idWZpZHgsICh1bnNpZ25lZCBpbnQpc29hcC0+YnVmbGVuKSk7CisgICAgICB3aGlsZSAoIXNvYXBfaXN4ZGlnaXQoKGludCkoYyA9IHNvYXBfZ2V0Y2h1bmtjaGFyKHNvYXApKSkpCisgICAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorCSAgcmV0dXJuIHNvYXAtPmFoZWFkID0gRU9GOworICAgICAgZG8KKyAgICAgICAgKnQrKyA9IChjaGFyKWM7CisgICAgICB3aGlsZSAoc29hcF9pc3hkaWdpdCgoaW50KShjID0gc29hcF9nZXRjaHVua2NoYXIoc29hcCkpKSAmJiB0IC0gdG1wIDwgNyk7CisgICAgICB3aGlsZSAoKGludCljICE9IEVPRiAmJiBjICE9ICdcbicpCisgICAgICAgIGMgPSBzb2FwX2dldGNodW5rY2hhcihzb2FwKTsKKyAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICByZXR1cm4gc29hcC0+YWhlYWQgPSBFT0Y7CisgICAgICAqdCA9ICdcMCc7CisgICAgICBzb2FwLT5jaHVua3NpemUgPSBzb2FwX3N0cnRvdWwodG1wLCAmdCwgMTYpOworICAgICAgaWYgKCFzb2FwLT5jaHVua3NpemUpCisgICAgICB7IHNvYXAtPmNodW5rYnVmbGVuID0gMDsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgb2YgY2h1bmtlZCBtZXNzYWdlXG4iKSk7CisJd2hpbGUgKChpbnQpYyAhPSBFT0YgJiYgYyAhPSAnXG4nKQorICAgICAgICAgIGMgPSBzb2FwX2dldGNodW5rY2hhcihzb2FwKTsKKyAgICAgICAgcmV0dXJuIHNvYXAtPmFoZWFkID0gRU9GOworICAgICAgfQorICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+YnVmaWR4ICsgc29hcC0+Y2h1bmtzaXplOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJNb3ZpbmcgYnVmIGxlbiB0byBpZHg9JXUgbGVuPSV1ICglcylcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+YnVmaWR4LCAodW5zaWduZWQgaW50KXNvYXAtPmJ1ZmxlbiwgdG1wKSk7CisgICAgICBpZiAoc29hcC0+YnVmbGVuID4gc29hcC0+Y2h1bmtidWZsZW4pCisgICAgICB7IHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmNodW5rYnVmbGVuOworICAgICAgICBzb2FwLT5jaHVua3NpemUgLT0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgICAgICBzb2FwLT5jaHVua2J1ZmxlbiA9IDA7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUGFzc2VkIGVuZCBvZiBidWZmZXIgZm9yIGNodW5rZWQgSFRUUCAoJXUgYnl0ZXMgbGVmdClcbiIsICh1bnNpZ25lZCBpbnQpKHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeCkpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHNvYXAtPmNodW5rYnVmbGVuKQorICAgICAgICBzb2FwLT5jaHVua3NpemUgPSAwOworICAgICAgcmV0ID0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgICAgaWYgKCFyZXQpCisgICAgICAgIGdvdG8gY2h1bmtfYWdhaW47CisgICAgfQorICB9CisgIGVsc2UKKyNlbmRpZgorICB7IHNvYXAtPmJ1ZmlkeCA9IDA7CisgICAgc29hcC0+YnVmbGVuID0gcmV0ID0gc29hcC0+ZnJlY3Yoc29hcCwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTik7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWFkICV1IGJ5dGVzIGZyb20gc29ja2V0ICVkXG4iLCAodW5zaWduZWQgaW50KXJldCwgc29hcC0+c29ja2V0KSk7CisgICAgREJHTVNHKFJFQ1YsIHNvYXAtPmJ1ZiwgcmV0KTsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+ZnByZXBhcmVyZWN2ICYmIChzb2FwLT5lcnJvciA9IHNvYXAtPmZwcmVwYXJlcmVjdihzb2FwLCBzb2FwLT5idWYsIHJldCkpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNlbmRpZgorI2lmZGVmIFdJVEhfWkxJQgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIpCisgIHsgcmVnaXN0ZXIgaW50IHI7CisgICAgbWVtY3B5KHNvYXAtPnpfYnVmLCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOKTsKKyAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X2luID0gKEJ5dGUqKShzb2FwLT56X2J1ZiArIHNvYXAtPmJ1ZmlkeCk7CisgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4gPSAodW5zaWduZWQgaW50KXJldDsKKyAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IChCeXRlKilzb2FwLT5idWY7CisgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0ID0gU09BUF9CVUZMRU47CisgICAgciA9IGluZmxhdGUoJnNvYXAtPmRfc3RyZWFtLCBaX05PX0ZMVVNIKTsKKyAgICBpZiAociA9PSBaX09LIHx8IHIgPT0gWl9TVFJFQU1fRU5EKQorICAgIHsgc29hcC0+YnVmaWR4ID0gMDsKKyAgICAgIHNvYXAtPnpfYnVmbGVuID0gc29hcC0+YnVmbGVuOworICAgICAgc29hcC0+YnVmbGVuID0gcmV0ID0gU09BUF9CVUZMRU4gLSBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQ7CisgICAgICBpZiAoc29hcC0+emxpYl9pbiA9PSBTT0FQX1pMSUJfR1pJUCkKKyAgICAgICAgc29hcC0+el9jcmMgPSBjcmMzMihzb2FwLT56X2NyYywgKEJ5dGUqKXNvYXAtPmJ1ZiwgKHVuc2lnbmVkIGludClzb2FwLT5idWZsZW4pOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbmZsYXRlZCAldSBieXRlc1xuIiwgKHVuc2lnbmVkIGludClyZXQpKTsKKyAgICAgIGlmICghcmV0KQorICAgICAgICBnb3RvIHpsaWJfYWdhaW47CisgICAgICBpZiAociA9PSBaX1NUUkVBTV9FTkQpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5mbGF0ZWQgJWx1LT4lbHUgYnl0ZXNcbiIsIHNvYXAtPmRfc3RyZWFtLnRvdGFsX2luLCBzb2FwLT5kX3N0cmVhbS50b3RhbF9vdXQpKTsKKyAgICAgICAgc29hcC0+el9yYXRpb19pbiA9IChmbG9hdClzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiAvIChmbG9hdClzb2FwLT5kX3N0cmVhbS50b3RhbF9vdXQ7CisgICAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gWl9OVUxMOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVuYWJsZSB0byBpbmZsYXRlOiAoJWQpICVzXG4iLCByLCBzb2FwLT5kX3N0cmVhbS5tc2c/c29hcC0+ZF9zdHJlYW0ubXNnOiIiKSk7CisgICAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IFpfTlVMTDsKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgcmV0dXJuIEVPRjsKKyAgICB9CisgIH0KKyNlbmRpZgorICBzb2FwLT5jb3VudCArPSByZXQ7CisgIHJldHVybiAhcmV0OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlY3Yoc3RydWN0IHNvYXAgKnNvYXApCit7IAorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpCisgIHsgaWYgKHNvYXAtPmRpbWUuYnVmbGVuKQorICAgIHsgY2hhciAqczsKKyAgICAgIGludCBpOworICAgICAgdW5zaWduZWQgY2hhciB0bXBbMTJdOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJESU1FIGhkciBmb3IgY2h1bmtlZCBESU1FIGlzIGluIGJ1ZmZlclxuIikpOworICAgICAgc29hcC0+Y291bnQgKz0gc29hcC0+ZGltZS5idWZsZW4gLSBzb2FwLT5idWZsZW47CisgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5kaW1lLmJ1ZmxlbjsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2tpcCBwYWRkaW5nICglbGQgYnl0ZXMpXG4iLCAtKGxvbmcpc29hcC0+ZGltZS5zaXplJjMpKTsKKyAgICAgIGZvciAoaSA9IC0obG9uZylzb2FwLT5kaW1lLnNpemUmMzsgaSA+IDA7IGktLSkKKyAgICAgIHsgc29hcC0+YnVmaWR4Kys7CisgICAgICAgIGlmIChzb2FwLT5idWZpZHggPj0gc29hcC0+YnVmbGVuKQorICAgICAgICAgIGlmIChzb2FwX3JlY3ZfcmF3KHNvYXApKQorICAgICAgICAgICAgcmV0dXJuIEVPRjsKKyAgICAgIH0KKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR2V0IERJTUUgaGRyIGZvciBuZXh0IGNodW5rXG4iKSk7CisgICAgICBzID0gKGNoYXIqKXRtcDsKKyAgICAgIGZvciAoaSA9IDEyOyBpID4gMDsgaS0tKQorICAgICAgeyAqcysrID0gc29hcC0+YnVmW3NvYXAtPmJ1ZmlkeCsrXTsKKyAgICAgICAgaWYgKHNvYXAtPmJ1ZmlkeCA+PSBzb2FwLT5idWZsZW4pCisgICAgICAgICAgaWYgKHNvYXBfcmVjdl9yYXcoc29hcCkpCisgICAgICAgICAgICByZXR1cm4gRU9GOworICAgICAgfQorICAgICAgc29hcC0+ZGltZS5mbGFncyA9IHRtcFswXSAmIDB4NzsKKyAgICAgIHNvYXAtPmRpbWUuc2l6ZSA9ICgoc2l6ZV90KXRtcFs4XSA8PCAyNCkgfCAoKHNpemVfdCl0bXBbOV0gPDwgMTYpIHwgKChzaXplX3QpdG1wWzEwXSA8PCA4KSB8ICgoc2l6ZV90KXRtcFsxMV0pOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHZXQgRElNRSBjaHVuayAoJXUgYnl0ZXMpXG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmRpbWUuc2l6ZSkpOworICAgICAgaWYgKHNvYXAtPmRpbWUuZmxhZ3MgJiBTT0FQX0RJTUVfQ0YpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTW9yZSBjaHVua2luZ1xuIikpOworICAgICAgICBzb2FwLT5kaW1lLmNodW5rc2l6ZSA9IHNvYXAtPmRpbWUuc2l6ZTsKKyAgICAgICAgaWYgKHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeCA+PSBzb2FwLT5kaW1lLnNpemUpCisgICAgICAgIHsgc29hcC0+ZGltZS5idWZsZW4gPSBzb2FwLT5idWZsZW47CisgICAgICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+YnVmaWR4ICsgc29hcC0+ZGltZS5jaHVua3NpemU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHNvYXAtPmRpbWUuY2h1bmtzaXplIC09IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJMYXN0IGNodW5rXG4iKSk7CisgICAgICAgIHNvYXAtPmRpbWUuYnVmbGVuID0gMDsKKyAgICAgICAgc29hcC0+ZGltZS5jaHVua3NpemUgPSAwOworICAgICAgfQorICAgICAgc29hcC0+Y291bnQgPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIiV1IGJ5dGVzIHJlbWFpbmluZ1xuIiwgKHVuc2lnbmVkIGludClzb2FwLT5jb3VudCkpOworICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgfQorICAgIGlmIChzb2FwLT5kaW1lLmNodW5rc2l6ZSkKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR2V0IG5leHQgRElNRSBoZHIgZm9yIGNodW5rZWQgRElNRSAoJXUgYnl0ZXMgY2h1bmspXG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmRpbWUuY2h1bmtzaXplKSk7CisgICAgICBpZiAoc29hcF9yZWN2X3Jhdyhzb2FwKSkKKyAgICAgICAgcmV0dXJuIEVPRjsKKyAgICAgIGlmIChzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHggPj0gc29hcC0+ZGltZS5jaHVua3NpemUpCisgICAgICB7IHNvYXAtPmRpbWUuYnVmbGVuID0gc29hcC0+YnVmbGVuOworICAgICAgICBzb2FwLT5jb3VudCAtPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHggLSBzb2FwLT5kaW1lLmNodW5rc2l6ZTsKKyAgICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+YnVmaWR4ICsgc29hcC0+ZGltZS5jaHVua3NpemU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHNvYXAtPmRpbWUuY2h1bmtzaXplIC09IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiJWx1IGJ5dGVzIHJlbWFpbmluZywgY291bnQ9JXVcbiIsICh1bnNpZ25lZCBsb25nKShzb2FwLT5idWZsZW4tc29hcC0+YnVmaWR4KSwgKHVuc2lnbmVkIGludClzb2FwLT5jb3VudCkpOworICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgfQorICB9CisjZW5kaWYKKyAgcmV0dXJuIHNvYXBfcmVjdl9yYXcoc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzb2FwX3djaGFyCitTT0FQX0ZNQUMyCitzb2FwX2dldGNoYXIoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgYyA9IHNvYXAtPmFoZWFkOworICBpZiAoYykKKyAgeyBpZiAoYyAhPSBFT0YpCisgICAgICBzb2FwLT5haGVhZCA9IDA7CisgICAgcmV0dXJuIGM7CisgIH0KKyAgcmV0dXJuIHNvYXBfZ2V0MShzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwKgorU09BUF9GTUFDMgorc29hcF9jb2RlKGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwICptYXAsIGNvbnN0IGNoYXIgKnN0cikKK3sgaWYgKHN0cikKKyAgeyB3aGlsZSAobWFwLT5zdHJpbmcpCisgICAgeyBpZiAoIXN0cmNtcChzdHIsIG1hcC0+c3RyaW5nKSkgLyogY2FzZSBzZW5zaXRpdmUgKi8KKyAgICAgICAgcmV0dXJuIG1hcDsKKyAgICAgIG1hcCsrOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2xvbmcKK1NPQVBfRk1BQzIKK3NvYXBfaW50X2NvZGUoY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgKm1hcCwgY29uc3QgY2hhciAqc3RyLCBsb25nIG90aGVyKQoreyB3aGlsZSAobWFwLT5zdHJpbmcpCisgIHsgaWYgKCFzb2FwX3RhZ19jbXAoc3RyLCBtYXAtPnN0cmluZykpIC8qIGNhc2UgaW5zZW5zaXRpdmUgKi8KKyAgICAgIHJldHVybiBtYXAtPmNvZGU7CisgICAgbWFwKys7CisgIH0KKyAgcmV0dXJuIG90aGVyOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfc3RyX2NvZGUoY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgKm1hcCwgbG9uZyBjb2RlKQoreyB3aGlsZSAobWFwLT5jb2RlICE9IGNvZGUgJiYgbWFwLT5zdHJpbmcpCisgICAgbWFwKys7CisgIHJldHVybiBtYXAtPnN0cmluZzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzb2FwX3djaGFyCitzb2FwX2NoYXIoc3RydWN0IHNvYXAgKnNvYXApCit7IGNoYXIgdG1wWzhdOworICByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICByZWdpc3RlciBjaGFyICpzID0gdG1wOworICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQorICB7IGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgaWYgKGMgPT0gJzsnIHx8IChpbnQpYyA9PSBFT0YpCisgICAgICBicmVhazsKKyAgICAqcysrID0gKGNoYXIpYzsKKyAgfQorICAqcyA9ICdcMCc7CisgIGlmICgqdG1wID09ICcjJykKKyAgeyBpZiAodG1wWzFdID09ICd4JyB8fCB0bXBbMV0gPT0gJ1gnKQorICAgICAgcmV0dXJuIHNvYXBfc3RydG9sKHRtcCArIDIsIE5VTEwsIDE2KTsKKyAgICByZXR1cm4gYXRvbCh0bXAgKyAxKTsKKyAgfQorICBpZiAoIXN0cmNtcCh0bXAsICJsdCIpKQorICAgIHJldHVybiAnPCc7CisgIGlmICghc3RyY21wKHRtcCwgImd0IikpCisgICAgcmV0dXJuICc+JzsKKyAgaWYgKCFzdHJjbXAodG1wLCAiYW1wIikpCisgICAgcmV0dXJuICcmJzsKKyAgaWYgKCFzdHJjbXAodG1wLCAicXVvdCIpKQorICAgIHJldHVybiAnIic7CisgIGlmICghc3RyY21wKHRtcCwgImFwb3MiKSkKKyAgICByZXR1cm4gJ1wnJzsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIHJldHVybiAoc29hcF93Y2hhcilzb2FwX2ludF9jb2RlKGh0bWxfZW50aXR5X2NvZGVzLCB0bXAsIFNPQVBfVU5LTk9XTl9DSEFSKTsKKyNlbHNlCisgIHJldHVybiBTT0FQX1VOS05PV05fQ0hBUjsgLyogdXNlIHRoaXMgdG8gcmVwcmVzZW50IHVua25vd24gY29kZSAqLworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBXSVRIX0xFQU4KK3NvYXBfd2NoYXIKK3NvYXBfZ2V0MChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXAtPmJ1ZmlkeCA+PSBzb2FwLT5idWZsZW4gJiYgc29hcF9yZWN2KHNvYXApKQorICAgIHJldHVybiBFT0Y7CisgIHJldHVybiAodW5zaWduZWQgY2hhcilzb2FwLT5idWZbc29hcC0+YnVmaWR4XTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFdJVEhfTEVBTgorc29hcF93Y2hhcgorc29hcF9nZXQxKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcC0+YnVmaWR4ID49IHNvYXAtPmJ1ZmxlbiAmJiBzb2FwX3JlY3Yoc29hcCkpCisgICAgcmV0dXJuIEVPRjsKKyAgcmV0dXJuICh1bnNpZ25lZCBjaGFyKXNvYXAtPmJ1Zltzb2FwLT5idWZpZHgrK107Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzb2FwX3djaGFyCitTT0FQX0ZNQUMyCitzb2FwX2dldChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICBjID0gc29hcC0+YWhlYWQ7CisgIGlmIChjKQorICB7IGlmIChjICE9IEVPRikKKyAgICAgIHNvYXAtPmFoZWFkID0gMDsKKyAgfQorICBlbHNlCisgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgZm9yICg7OykKKyAgeyBpZiAoc29hcC0+Y2RhdGEpCisgICAgeyBpZiAoYyA9PSAnXScpCisgICAgICB7IGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICAgIGlmIChjID09ICddJykKKyAgICAgICAgeyBzb2FwLT5jZGF0YSA9IDA7CisgICAgICAgICAgc29hcF9nZXQxKHNvYXApOyAvKiBza2lwID4gKi8KKyAgICAgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgICB9CisJZWxzZQorICAgICAgICB7IHNvYXBfcmV2Z2V0MShzb2FwKTsKKyAgICAgICAgICByZXR1cm4gJ10nOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBjOworICAgIH0KKyAgICBzd2l0Y2ggKGMpCisgICAgeyBjYXNlICc8JzoKKyAgICAgICAgZG8gYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgICAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworICAgICAgICBpZiAoYyA9PSAnIScgfHwgYyA9PSAnPycgfHwgYyA9PSAnJScpCisgICAgICAgIHsgcmVnaXN0ZXIgaW50IGsgPSAxOworCSAgaWYgKGMgPT0gJyEnKQorICAgICAgICAgIHsgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgICAgICAgIGlmIChjID09ICdbJykKKyAgICAgICAgICAgIHsgZG8gYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgICAgICAgICAgd2hpbGUgKChpbnQpYyAhPSBFT0YgJiYgYyAhPSAnWycpOworICAgICAgICAgICAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgc29hcC0+Y2RhdGEgPSAxOworICAgICAgICAgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworCSAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGMgPT0gJy0nICYmIChjID0gc29hcF9nZXQxKHNvYXApKSA9PSAnLScpCisgICAgICAgICAgICB7IGRvCisgICAgICAgICAgICAgIHsgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAnLScgJiYgKGMgPSBzb2FwX2dldDEoc29hcCkpID09ICctJykKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9IHdoaWxlICgoaW50KWMgIT0gRU9GKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisJICBlbHNlIGlmIChjID09ICc/JykKKyAgICAgICAgICAgIGMgPSBzb2FwX2dldF9waShzb2FwKTsKKyAgICAgICAgICB3aGlsZSAoKGludCljICE9IEVPRikKKyAgICAgICAgICB7IGlmIChjID09ICc8JykKKwkgICAgICBrKys7CisJICAgIGVsc2UgaWYgKGMgPT0gJz4nKQorCSAgICB7IGlmICgtLWsgPD0gMCkKKwkgICAgICAgIGJyZWFrOworCSAgICB9CisJICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisJICB9CisJICBpZiAoKGludCljID09IEVPRikKKwkgICAgYnJlYWs7CisgICAgICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYyA9PSAnLycpCisgICAgICAgICAgcmV0dXJuIFNPQVBfVFQ7CisgICAgICAgIHNvYXBfcmV2Z2V0MShzb2FwKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfTFQ7CisgICAgICBjYXNlICc+JzoKKyAgICAgICAgcmV0dXJuIFNPQVBfR1Q7CisgICAgICBjYXNlICciJzoKKyAgICAgICAgcmV0dXJuIFNPQVBfUVQ7CisgICAgICBjYXNlICdcJyc6CisgICAgICAgIHJldHVybiBTT0FQX0FQOworICAgICAgY2FzZSAnJic6CisgICAgICAgIHJldHVybiBzb2FwX2NoYXIoc29hcCkgfCAweDgwMDAwMDAwOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gYzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzb2FwX3djaGFyCitzb2FwX2dldF9waShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgY2hhciBidWZbNjRdOworICByZWdpc3RlciBjaGFyICpzID0gYnVmOworICByZWdpc3RlciBpbnQgaSA9IHNpemVvZihidWYpOworICByZWdpc3RlciBzb2FwX3djaGFyIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgIC8qIFRoaXMgaXMgYSBxdWljayB3YXkgdG8gcGFyc2UgWE1MIFBJIGFuZCB3ZSBjb3VsZCB1c2UgYSBjYWxsYmFjayBpbnN0ZWFkIHRvCisgICAqIGVuYWJsZSBhcHBsaWNhdGlvbnMgdG8gaW50ZXJjZXB0IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zICovCisgIHdoaWxlICgoaW50KWMgIT0gRU9GICYmIGMgIT0gJz8nKQorICB7IGlmICgtLWkgPiAwKQorICAgIHsgaWYgKHNvYXBfYmxhbmsoYykpCisgICAgICAgIGMgPSAnICc7CisgICAgICAqcysrID0gKGNoYXIpYzsKKyAgICB9CisgICAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgfQorICAqcyA9ICdcMCc7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiWE1MIFBJIDw/JXM/PlxuIiwgYnVmKSk7CisgIGlmICghc3RybmNtcChidWYsICJ4bWwgIiwgNCkpCisgIHsgcyA9IHN0cnN0cihidWYsICIgZW5jb2Rpbmc9Iik7CisgICAgaWYgKHMgJiYgc1sxMF0pCisgICAgeyBpZiAoIXNvYXBfdGFnX2NtcChzICsgMTEsICJpc28tODg1OS0xKiIpCisgICAgICAgfHwgIXNvYXBfdGFnX2NtcChzICsgMTEsICJsYXRpbjEqIikpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU3dpdGNoaW5nIHRvIGxhdGluMSBlbmNvZGluZ1xuIikpOworICAgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX0xBVElOOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChzICsgMTEsICJ1dGYtOCoiKSkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTd2l0Y2hpbmcgdG8gdXRmLTggZW5jb2RpbmdcbiIpKTsKKyAgICAgICAgc29hcC0+bW9kZSAmPSB+U09BUF9FTkNfTEFUSU47CisgICAgICB9CisgICAgfQorICB9CisgIGlmICgoaW50KWMgIT0gRU9GKQorICAgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgIHJldHVybiBjOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX21vdmUoc3RydWN0IHNvYXAgKnNvYXAsIGxvbmcgbikKK3sgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJNb3ZpbmcgJWxkIGJ5dGVzIGZvcndhcmRcbiIsIChsb25nKW4pKTsKKyAgZm9yICg7IG4gPiAwOyBuLS0pCisgICAgaWYgKChpbnQpc29hcF9nZXRjaGFyKHNvYXApID09IEVPRikKKyAgICAgIHJldHVybiBTT0FQX0VPRjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3NpemVfdAorU09BUF9GTUFDMgorc29hcF90ZWxsKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZXR1cm4gc29hcC0+Y291bnQgLSBzb2FwLT5idWZsZW4gKyBzb2FwLT5idWZpZHggLSAoc29hcC0+YWhlYWQgIT0gMCk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXR1dGY4KHN0cnVjdCBzb2FwICpzb2FwLCByZWdpc3RlciB1bnNpZ25lZCBsb25nIGMpCit7IGNoYXIgdG1wWzE2XTsKKyAgaWYgKGMgPiAwICYmIGMgPCAweDgwKQorICB7ICp0bXAgPSAoY2hhciljOworICAgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsIHRtcCwgMSk7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICB7IHJlZ2lzdGVyIGNoYXIgKnQgPSB0bXA7CisgICAgaWYgKGMgPCAweDA4MDApCisgICAgICAqdCsrID0gKGNoYXIpKDB4QzAgfCAoKGMgPj4gNikgJiAweDFGKSk7CisgICAgZWxzZQorICAgIHsgaWYgKGMgPCAweDAxMDAwMCkKKyAgICAgICAgKnQrKyA9IChjaGFyKSgweEUwIHwgKChjID4+IDEyKSAmIDB4MEYpKTsKKyAgICAgIGVsc2UKKyAgICAgIHsgaWYgKGMgPCAweDIwMDAwMCkKKyAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjAgfCAoKGMgPj4gMTgpICYgMHgwNykpOworICAgICAgICBlbHNlCisgICAgICAgIHsgaWYgKGMgPCAweDA0MDAwMDAwKQorICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEY4IHwgKChjID4+IDI0KSAmIDB4MDMpKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeyAqdCsrID0gKGNoYXIpKDB4RkMgfCAoKGMgPj4gMzApICYgMHgwMSkpOworICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDI0KSAmIDB4M0YpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDE4KSAmIDB4M0YpKTsKKyAgICAgICAgfSAgICAgCisgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAxMikgJiAweDNGKSk7CisgICAgICB9CisgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gNikgJiAweDNGKSk7CisgICAgfQorICAgICp0KysgPSAoY2hhcikoMHg4MCB8IChjICYgMHgzRikpOworICAgICp0ID0gJ1wwJzsKKyAgfQorICBlbHNlCisjZW5kaWYKKyAgICBzcHJpbnRmKHRtcCwgIiYjJWx1OyIsIGMpOworICByZXR1cm4gc29hcF9zZW5kKHNvYXAsIHRtcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzb2FwX3djaGFyCitTT0FQX0ZNQUMyCitzb2FwX2dldHV0Zjgoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYywgYzEsIGMyLCBjMywgYzQ7CisgIGMgPSBzb2FwLT5haGVhZDsKKyAgaWYgKGMgPiAweEZGKQorICB7IHNvYXAtPmFoZWFkID0gMDsKKyAgICByZXR1cm4gYzsKKyAgfQorYWdhaW46CisgIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgaWYgKGMgPCAweDgwIHx8IChzb2FwLT5tb2RlICYgU09BUF9FTkNfTEFUSU4pKQorICAgIHJldHVybiBjOworICBjMSA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgaWYgKGMxIDwgMHg4MCkKKyAgeyBzb2FwX3JldmdldDEoc29hcCk7IC8qIGRvZXNuJ3QgbG9vayBsaWtlIHRoaXMgaXMgVVRGOCAqLworICAgIHJldHVybiBjOworICB9CisgIGMxICY9IDB4M0Y7CisgIGlmIChjIDwgMHhFMCkKKyAgICByZXR1cm4gKChzb2FwX3djaGFyKShjICYgMHgxRikgPDwgNikgfCBjMTsKKyAgYzIgPSAoc29hcF93Y2hhcilzb2FwX2dldDEoc29hcCkgJiAweDNGOworICBpZiAoYyA9PSAweEVGICYmIGMxID09IDB4M0IgJiYgYzIgPT0gMHgzRikJLyogaWdub3JlIFVURi04IEJPTSAqLworICAgIGdvdG8gYWdhaW47CisgIGlmIChjIDwgMHhGMCkKKyAgICByZXR1cm4gKChzb2FwX3djaGFyKShjICYgMHgwRikgPDwgMTIpIHwgKGMxIDw8IDYpIHwgYzI7CisgIGMzID0gKHNvYXBfd2NoYXIpc29hcF9nZXQxKHNvYXApICYgMHgzRjsKKyAgaWYgKGMgPCAweEY4KQorICAgIHJldHVybiAoKHNvYXBfd2NoYXIpKGMgJiAweDA3KSA8PCAxOCkgfCAoYzEgPDwgMTIpIHwgKGMyIDw8IDYpIHwgYzM7CisgIGM0ID0gKHNvYXBfd2NoYXIpc29hcF9nZXQxKHNvYXApICYgMHgzRjsKKyAgaWYgKGMgPCAweEZDKQorICAgIHJldHVybiAoKHNvYXBfd2NoYXIpKGMgJiAweDAzKSA8PCAyNCkgfCAoYzEgPDwgMTgpIHwgKGMyIDw8IDEyKSB8IChjMyA8PCA2KSB8IGM0OworICByZXR1cm4gKChzb2FwX3djaGFyKShjICYgMHgwMSkgPDwgMzApIHwgKGMxIDw8IDI0KSB8IChjMiA8PCAxOCkgfCAoYzMgPDwgMTIpIHwgKGM0IDw8IDYpIHwgKHNvYXBfd2NoYXIpKHNvYXBfZ2V0MShzb2FwKSAmIDB4M0YpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dGhleChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgdW5zaWduZWQgY2hhciAqcywgaW50IG4pCit7IGNoYXIgZFsyXTsKKyAgcmVnaXN0ZXIgaW50IGk7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgaWYgKCEoc29hcC0+ZG9tLT5kYXRhID0gc29hcF9zMmhleChzb2FwLCBzLCBOVUxMLCBuKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNlbmRpZgorICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICB7IHJlZ2lzdGVyIGludCBtID0gKnMrKzsKKyAgICBkWzBdID0gKGNoYXIpKChtID4+IDQpICsgKG0gPiAxNTkgPyAnNycgOiAnMCcpKTsKKyAgICBtICY9IDB4MEY7CisgICAgZFsxXSA9IChjaGFyKShtICsgKG0gPiA5ID8gJzcnIDogJzAnKSk7CisgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgZCwgMikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit1bnNpZ25lZCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9nZXRoZXgoc3RydWN0IHNvYXAgKnNvYXAsIGludCAqbikKK3sKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBzb2FwLT5kb20tPmRhdGEgPSBzb2FwX3N0cmluZ19pbihzb2FwLCAwLCAtMSwgLTEpOworICAgIHJldHVybiAodW5zaWduZWQgY2hhciopc29hcF9oZXgycyhzb2FwLCBzb2FwLT5kb20tPmRhdGEsIE5VTEwsIDAsIG4pOworICB9CisjZW5kaWYKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgc29hcC0+bGFiaWR4ID0gMDsKKyAgZm9yICg7OykKKyAgeyByZWdpc3RlciBjaGFyICpzOworICAgIHJlZ2lzdGVyIGludCBpLCBrOworICAgIGlmIChzb2FwX2FwcGVuZF9sYWIoc29hcCwgTlVMTCwgMCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBzID0gc29hcC0+bGFiYnVmICsgc29hcC0+bGFiaWR4OworICAgIGsgPSBzb2FwLT5sYWJsZW4gLSBzb2FwLT5sYWJpZHg7CisgICAgc29hcC0+bGFiaWR4ID0gc29hcC0+bGFibGVuOworICAgIGZvciAoaSA9IDA7IGkgPCBrOyBpKyspCisgICAgeyByZWdpc3RlciBjaGFyIGQxLCBkMjsKKyAgICAgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgICAgIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgICAgIGlmIChzb2FwX2lzeGRpZ2l0KGMpKQorICAgICAgeyBkMSA9IChjaGFyKWM7CisgICAgICAgIGMgPSBzb2FwX2dldChzb2FwKTsgCisJaWYgKHNvYXBfaXN4ZGlnaXQoYykpCisgICAgICAgICAgZDIgPSAoY2hhciljOworICAgICAgICBlbHNlIAorICAgICAgICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IHVuc2lnbmVkIGNoYXIgKnA7CisgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgIGlmIChuKQorICAgICAgICAgICpuID0gKGludCkoc29hcC0+bGFibGVuIC0gayArIGkpOworICAgICAgICBwID0gKHVuc2lnbmVkIGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHNvYXAtPmxhYmxlbiAtIGsgKyBpKTsKKwlpZiAocCkKKwkgIG1lbWNweShwLCBzb2FwLT5sYWJidWYsIHNvYXAtPmxhYmxlbiAtIGsgKyBpKTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgICB9CisgICAgICAqcysrID0gKChkMSA+PSAnQScgPyAoZDEgJiAweDcpICsgOSA6IGQxIC0gJzAnKSA8PCA0KSArIChkMiA+PSAnQScgPyAoZDIgJiAweDcpICsgOSA6IGQyIC0gJzAnKTsKKyAgICB9CisgIH0KKyNlbHNlCisgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgZm9yICg7OykKKyAgeyByZWdpc3RlciBpbnQgaTsKKyAgICByZWdpc3RlciBjaGFyICpzID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBTT0FQX0JMS0xFTik7CisgICAgaWYgKCFzKQorICAgIHsgc29hcF9lbmRfYmxvY2soc29hcCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IFNPQVBfQkxLTEVOOyBpKyspCisgICAgeyByZWdpc3RlciBjaGFyIGQxLCBkMjsKKyAgICAgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IHNvYXBfZ2V0KHNvYXApOworICAgICAgaWYgKHNvYXBfaXN4ZGlnaXQoYykpCisgICAgICB7IGQxID0gKGNoYXIpYzsKKyAgICAgICAgYyA9IHNvYXBfZ2V0KHNvYXApOyAKKwlpZiAoc29hcF9pc3hkaWdpdChjKSkKKyAgICAgICAgICBkMiA9IChjaGFyKWM7CisgICAgICAgIGVsc2UgCisgICAgICAgIHsgc29hcF9lbmRfYmxvY2soc29hcCk7CisJICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyB1bnNpZ25lZCBjaGFyICpwOworICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICBpZiAobikKKyAgICAgICAgICAqbiA9IHNvYXBfc2l6ZV9ibG9jayhzb2FwLCBpKTsKKyAgICAgICAgcCA9ICh1bnNpZ25lZCBjaGFyKilzb2FwX3NhdmVfYmxvY2soc29hcCwgTlVMTCwgMCk7CisgICAgICAgIHJldHVybiBwOworICAgICAgfQorICAgICAgKnMrKyA9ICgoZDEgPj0gJ0EnID8gKGQxICYgMHg3KSArIDkgOiBkMSAtICcwJykgPDwgNCkgKyAoZDIgPj0gJ0EnID8gKGQyICYgMHg3KSArIDkgOiBkMiAtICcwJyk7CisgICAgfQorICB9CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRiYXNlNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMsIGludCBuKQoreyByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBtOworICBjaGFyIGRbNF07CisgIGlmICghcykKKyAgICByZXR1cm4gU09BUF9PSzsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBpZiAoIShzb2FwLT5kb20tPmRhdGEgPSBzb2FwX3MyYmFzZTY0KHNvYXAsIHMsIE5VTEwsIG4pKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2VuZGlmCisgIGZvciAoOyBuID4gMjsgbiAtPSAzLCBzICs9IDMpCisgIHsgbSA9IHNbMF07CisgICAgbSA9IChtIDw8IDgpIHwgc1sxXTsKKyAgICBtID0gKG0gPDwgOCkgfCBzWzJdOworICAgIGZvciAoaSA9IDQ7IGkgPiAwOyBtID4+PSA2KQorICAgICAgZFstLWldID0gc29hcF9iYXNlNjRvW20gJiAweDNGXTsKKyAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBkLCA0KSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAobiA+IDApCisgIHsgbSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgIG0gPSAobSA8PCA4KSB8ICpzKys7CisgICAgZm9yICg7IGkgPCAzOyBpKyspCisgICAgICBtIDw8PSA4OworICAgIGZvciAoaSsrOyBpID4gMDsgbSA+Pj0gNikKKyAgICAgIGRbLS1pXSA9IHNvYXBfYmFzZTY0b1ttICYgMHgzRl07CisgICAgZm9yIChpID0gMzsgaSA+IG47IGktLSkKKyAgICAgIGRbaV0gPSAnPSc7CisgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgZCwgNCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit1bnNpZ25lZCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9nZXRiYXNlNjQoc3RydWN0IHNvYXAgKnNvYXAsIGludCAqbiwgaW50IG1hbGxvY19mbGFnKQoreyAKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBzb2FwLT5kb20tPmRhdGEgPSBzb2FwX3N0cmluZ19pbihzb2FwLCAwLCAtMSwgLTEpOworICAgIHJldHVybiAodW5zaWduZWQgY2hhciopc29hcF9iYXNlNjQycyhzb2FwLCBzb2FwLT5kb20tPmRhdGEsIE5VTEwsIDAsIG4pOworICB9CisjZW5kaWYKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgc29hcC0+bGFiaWR4ID0gMDsKKyAgZm9yICg7OykKKyAgeyByZWdpc3RlciBpbnQgaSwgazsKKyAgICByZWdpc3RlciBjaGFyICpzOworICAgIGlmIChzb2FwX2FwcGVuZF9sYWIoc29hcCwgTlVMTCwgMikpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBzID0gc29hcC0+bGFiYnVmICsgc29hcC0+bGFiaWR4OworICAgIGsgPSBzb2FwLT5sYWJsZW4gLSBzb2FwLT5sYWJpZHg7CisgICAgc29hcC0+bGFiaWR4ID0gMyAqIChzb2FwLT5sYWJsZW4gLyAzKTsKKyAgICBpZiAoIXMpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgayAtIDI7IGkgKz0gMykKKyAgICB7IHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbSA9IDA7CisgICAgICByZWdpc3RlciBpbnQgaiA9IDA7CisgICAgICBkbworICAgICAgeyByZWdpc3RlciBzb2FwX3djaGFyIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgICAgICAgaWYgKGMgPT0gJz0nIHx8IGMgPCAwKQorICAgICAgICB7IHVuc2lnbmVkIGNoYXIgKnA7CisgICAgICAgICAgc3dpdGNoIChqKQorICAgICAgICAgIHsgY2FzZSAyOgorICAgICAgICAgICAgICAqcysrID0gKGNoYXIpKChtID4+IDQpICYgMHhGRik7CisgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gMTApICYgMHhGRik7CisgICAgICAgICAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gMikgJiAweEZGKTsKKyAgICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobikKKyAgICAgICAgICAgICpuID0gKGludCkoc29hcC0+bGFibGVuIC0gayArIGkpOworICAgICAgICAgIHAgPSAodW5zaWduZWQgY2hhciopc29hcF9tYWxsb2Moc29hcCwgc29hcC0+bGFibGVuIC0gayArIGkpOworCSAgaWYgKHApCisJICAgIG1lbWNweShwLCBzb2FwLT5sYWJidWYsIHNvYXAtPmxhYmxlbiAtIGsgKyBpKTsKKyAgICAgICAgICBpZiAoYyA+PSAwKQorICAgICAgICAgIHsgd2hpbGUgKChpbnQpKChjID0gc29hcF9nZXQoc29hcCkpICE9IEVPRikgJiYgYyAhPSBTT0FQX0xUICYmIGMgIT0gU09BUF9UVCkKKyAgICAgICAgICAgICAgOworCSAgfQorICAgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgIH0KKyAgICAgICAgYyAtPSAnKyc7CisgICAgICAgIGlmIChjID49IDAgJiYgYyA8PSA3OSkKKyAgICAgICAgeyBtID0gKG0gPDwgNikgKyBzb2FwX2Jhc2U2NGlbY107CisgICAgICAgICAgaisrOworICAgICAgICB9CisgICAgICB9IHdoaWxlIChqIDwgNCk7CisgICAgICAqcysrID0gKGNoYXIpKChtID4+IDE2KSAmIDB4RkYpOworICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiA4KSAmIDB4RkYpOworICAgICAgKnMrKyA9IChjaGFyKShtICYgMHhGRik7CisgICAgfQorICB9CisjZWxzZQorICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgcmV0dXJuIE5VTEw7CisgIGZvciAoOzspCisgIHsgcmVnaXN0ZXIgaW50IGk7CisgICAgcmVnaXN0ZXIgY2hhciAqcyA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgMyAqIFNPQVBfQkxLTEVOKTsgLyogbXVzdCBiZSBtdWx0aXBsZSBvZiAzICovCisgICAgaWYgKCFzKQorICAgIHsgc29hcF9lbmRfYmxvY2soc29hcCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IFNPQVBfQkxLTEVOOyBpKyspCisgICAgeyByZWdpc3RlciB1bnNpZ25lZCBsb25nIG0gPSAwOworICAgICAgcmVnaXN0ZXIgaW50IGogPSAwOworICAgICAgZG8KKyAgICAgIHsgcmVnaXN0ZXIgc29hcF93Y2hhciBjID0gc29hcF9nZXQoc29hcCk7CisgICAgICAgIGlmIChjID09ICc9JyB8fCBjIDwgMCkKKyAgICAgICAgeyB1bnNpZ25lZCBjaGFyICpwOworICAgICAgICAgIGkgKj0gMzsKKyAgICAgICAgICBzd2l0Y2ggKGopCisgICAgICAgICAgeyBjYXNlIDI6CisgICAgICAgICAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gNCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiAxMCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiAyKSAmIDB4RkYpOworICAgICAgICAgICAgICBpICs9IDI7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChuKQorCSAgICAqbiA9IChpbnQpc29hcF9zaXplX2Jsb2NrKHNvYXAsIGkpOworICAgICAgICAgIHAgPSAodW5zaWduZWQgY2hhciopc29hcF9zYXZlX2Jsb2NrKHNvYXAsIE5VTEwsIDApOworICAgICAgICAgIGlmIChjID49IDApCisgICAgICAgICAgeyB3aGlsZSAoKGludCkoKGMgPSBzb2FwX2dldChzb2FwKSkgIT0gRU9GKSAmJiBjICE9IFNPQVBfTFQgJiYgYyAhPSBTT0FQX1RUKQorICAgICAgICAgICAgICA7CisJICB9CisgICAgICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgfQorICAgICAgICBjIC09ICcrJzsKKyAgICAgICAgaWYgKGMgPj0gMCAmJiBjIDw9IDc5KQorICAgICAgICB7IG0gPSAobSA8PCA2KSArIHNvYXBfYmFzZTY0aVtjXTsKKyAgICAgICAgICBqKys7CisgICAgICAgIH0KKyAgICAgIH0gd2hpbGUgKGogPCA0KTsKKyAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gMTYpICYgMHhGRik7CisgICAgICAqcysrID0gKGNoYXIpKChtID4+IDgpICYgMHhGRik7CisgICAgICAqcysrID0gKGNoYXIpKG0gJiAweEZGKTsKKyAgICB9CisgIH0KKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3hvcF9mb3J3YXJkKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBjaGFyICoqcHRyLCBpbnQgKnNpemUsIGNoYXIgKippZCwgY2hhciAqKnR5cGUsIGNoYXIgKipvcHRpb25zKQoreyAvKiBDaGVjayBNVE9NIHhvcDpJbmNsdWRlIGVsZW1lbnQgKHdpdGhpbiBoZXgvYmFzZTY0QmluYXJ5KSAqLworICAvKiBUT0RPOiB0aGlzIGNvZGUgdG8gYmUgb2Jzb2xldGVkIHdpdGggbmV3IGltcG9ydC94b3AuaCBjb252ZW50aW9ucyAqLworICBpbnQgYm9keSA9IHNvYXAtPmJvZHk7IC8qIHNob3VsZCBzYXZlIHR5cGUgdG9vPyAqLworICBpZiAoIXNvYXBfcGVla19lbGVtZW50KHNvYXApKQorICB7IGlmICghc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsICJ4b3A6SW5jbHVkZSIsIDApICYmICpzb2FwLT5ocmVmKQorICAgIHsgaWYgKHNvYXBfZGltZV9mb3J3YXJkKHNvYXAsIHB0ciwgc2l6ZSwgaWQsIHR5cGUsIG9wdGlvbnMpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgTlVMTCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgc29hcC0+Ym9keSA9IGJvZHk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZGltZV9mb3J3YXJkKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBjaGFyICoqcHRyLCBpbnQgKnNpemUsIGNoYXIgKippZCwgY2hhciAqKnR5cGUsIGNoYXIgKipvcHRpb25zKQoreyBzdHJ1Y3Qgc29hcF94bGlzdCAqeHAgPSAoc3RydWN0IHNvYXBfeGxpc3QqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF94bGlzdCkpOworICAqcHRyID0gTlVMTDsKKyAgKnNpemUgPSAwOworICAqaWQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT5ocmVmKTsKKyAgKnR5cGUgPSBOVUxMOworICAqb3B0aW9ucyA9IE5VTEw7CisgIGlmICgheHApCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgIHhwLT5uZXh0ID0gc29hcC0+eGxpc3Q7CisgIHhwLT5wdHIgPSBwdHI7CisgIHhwLT5zaXplID0gc2l6ZTsKKyAgeHAtPmlkID0gKmlkOworICB4cC0+dHlwZSA9IHR5cGU7CisgIHhwLT5vcHRpb25zID0gb3B0aW9uczsKKyAgc29hcC0+eGxpc3QgPSB4cDsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9zdHJkdXAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMpCit7IGNoYXIgKnQgPSBOVUxMOworICBpZiAocyAmJiAodCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzdHJsZW4ocykgKyAxKSkpCisgICAgc3RyY3B5KHQsIHMpOworICByZXR1cm4gdDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9uZXdfYmxvY2soc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX2JsaXN0ICpwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk5ldyBibG9jayBzZXF1ZW5jZSAocHJldj0lcClcbiIsIHNvYXAtPmJsaXN0KSk7CisgIGlmICghKHAgPSAoc3RydWN0IHNvYXBfYmxpc3QqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9ibGlzdCkpKSkKKyAgICByZXR1cm4gU09BUF9FT007ICAgCisgIHAtPm5leHQgPSBzb2FwLT5ibGlzdDsgCisgIHAtPnB0ciA9IE5VTEw7CisgIHAtPnNpemUgPSAwOworICBzb2FwLT5ibGlzdCA9IHA7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZCoKK1NPQVBfRk1BQzIKK3NvYXBfcHVzaF9ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCwgc2l6ZV90IG4pCit7IGNoYXIgKnA7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUHVzaCBibG9jayBvZiAldSBieXRlcyAoJXUgYnl0ZXMgdG90YWwpXG4iLCAodW5zaWduZWQgaW50KW4sICh1bnNpZ25lZCBpbnQpc29hcC0+Ymxpc3QtPnNpemUgKyAodW5zaWduZWQgaW50KW4pKTsKKyAgaWYgKCEocCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBuICsgc2l6ZW9mKGNoYXIqKSArIHNpemVvZihzaXplX3QpKSkpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICAqKGNoYXIqKilwID0gc29hcC0+Ymxpc3QtPnB0cjsKKyAgKihzaXplX3QqKShwICsgc2l6ZW9mKGNoYXIqKSkgPSBuOworICBzb2FwLT5ibGlzdC0+cHRyID0gcDsKKyAgc29hcC0+Ymxpc3QtPnNpemUgKz0gbjsKKyAgcmV0dXJuIHAgKyBzaXplb2YoY2hhciopICsgc2l6ZW9mKHNpemVfdCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3BvcF9ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgY2hhciAqcDsKKyAgaWYgKCFzb2FwLT5ibGlzdC0+cHRyKQorICAgIHJldHVybjsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQb3AgYmxvY2tcbiIpKTsKKyAgcCA9IHNvYXAtPmJsaXN0LT5wdHI7CisgIHNvYXAtPmJsaXN0LT5zaXplIC09ICooc2l6ZV90KikocCArIHNpemVvZihjaGFyKikpOworICBzb2FwLT5ibGlzdC0+cHRyID0gKihjaGFyKiopcDsKKyAgU09BUF9GUkVFKHNvYXAsIHApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyB2b2lkCitzb2FwX3VwZGF0ZV9wdHJzKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpzdGFydCwgY2hhciAqZW5kLCBjaGFyICpwMSwgY2hhciAqcDIpCit7IGludCBpOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2ZsaXN0ICpmcDsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfeGxpc3QgKnhwOworI2VuZGlmCisgIHJlZ2lzdGVyIHZvaWQgKnAsICoqcTsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfSURIQVNIOyBpKyspCisgIHsgZm9yIChpcCA9IHNvYXAtPmlodFtpXTsgaXA7IGlwID0gaXAtPm5leHQpCisgICAgeyBpZiAoaXAtPnB0ciAmJiAoY2hhciopaXAtPnB0ciA+PSBzdGFydCAmJiAoY2hhciopaXAtPnB0ciA8IGVuZCkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVcGRhdGUgaWQ9JyVzJyAlcCAtPiAlcFxuIiwgaXAtPmlkLCBpcC0+cHRyLCAoY2hhciopaXAtPnB0ciArIChwMS1wMikpKTsKKyAgICAgICAgaXAtPnB0ciA9IChjaGFyKilpcC0+cHRyICsgKHAxLXAyKTsKKyAgICAgIH0KKyAgICAgIGZvciAocSA9ICZpcC0+bGluazsgcTsgcSA9ICh2b2lkKiopcCkKKyAgICAgIHsgcCA9ICpxOworICAgICAgICBpZiAocCAmJiAoY2hhciopcCA+PSBzdGFydCAmJiAoY2hhciopcCA8IGVuZCkKKyAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkxpbmsgdXBkYXRlIGlkPSclcycgJXBcbiIsIGlwLT5pZCwgcCkpOworICAgICAgICAgICpxID0gKGNoYXIqKXAgKyAocDEtcDIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBmb3IgKHEgPSAmaXAtPmNvcHk7IHE7IHEgPSAodm9pZCoqKXApCisgICAgICB7IHAgPSAqcTsKKyAgICAgICAgaWYgKHAgJiYgKGNoYXIqKXAgPj0gc3RhcnQgJiYgKGNoYXIqKXAgPCBlbmQpCisgICAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5IGNoYWluIHVwZGF0ZSBpZD0nJXMnICVwXG4iLCBpcC0+aWQsIHApKTsKKyAgICAgICAgICAqcSA9IChjaGFyKilwICsgKHAxLXAyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZm9yIChmcCA9IGlwLT5mbGlzdDsgZnA7IGZwID0gZnAtPm5leHQpCisgICAgICB7IGlmICgoY2hhciopZnAtPnB0ciA+PSBzdGFydCAmJiAoY2hhciopZnAtPnB0ciA8IGVuZCkKKyAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHkgbGlzdCB1cGRhdGUgaWQ9JyVzJyAlcFxuIiwgaXAtPmlkLCBmcCkpOworICAgICAgICAgIGZwLT5wdHIgPSAoY2hhciopZnAtPnB0ciArIChwMS1wMik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgZm9yICh4cCA9IHNvYXAtPnhsaXN0OyB4cDsgeHAgPSB4cC0+bmV4dCkKKyAgeyBpZiAoeHAtPnB0ciAmJiAoY2hhciopeHAtPnB0ciA+PSBzdGFydCAmJiAoY2hhciopeHAtPnB0ciA8IGVuZCkKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVXBkYXRlIGlkPSclcycgJXAgLT4gJXBcbiIsIHhwLT5pZD94cC0+aWQ6IiIsIHhwLT5wdHIsIChjaGFyKil4cC0+cHRyICsgKHAxLXAyKSkpOworICAgICAgeHAtPnB0ciA9ICh1bnNpZ25lZCBjaGFyKiopKChjaGFyKil4cC0+cHRyICsgKHAxLXAyKSk7CisgICAgICB4cC0+c2l6ZSA9IChpbnQqKSgoY2hhciopeHAtPnNpemUgKyAocDEtcDIpKTsKKyAgICAgIHhwLT50eXBlID0gKGNoYXIqKikoKGNoYXIqKXhwLT50eXBlICsgKHAxLXAyKSk7CisgICAgICB4cC0+b3B0aW9ucyA9IChjaGFyKiopKChjaGFyKil4cC0+b3B0aW9ucyArIChwMS1wMikpOworICAgIH0KKyAgfQorI2VuZGlmCit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzb2FwX2hhc19jb3BpZXMoc3RydWN0IHNvYXAgKnNvYXAsIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnN0YXJ0LCByZWdpc3RlciBjb25zdCBjaGFyICplbmQpCit7IHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2ZsaXN0ICpmcDsKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqcDsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfSURIQVNIOyBpKyspCisgIHsgZm9yIChpcCA9IHNvYXAtPmlodFtpXTsgaXA7IGlwID0gaXAtPm5leHQpCisgICAgeyBmb3IgKHAgPSAoY29uc3QgY2hhciopaXAtPmNvcHk7IHA7IHAgPSAqKGNvbnN0IGNoYXIqKilwKQorICAgICAgICBpZiAocCA+PSBzdGFydCAmJiBwIDwgZW5kKQorICAgICAgICAgIHJldHVybiBTT0FQX0VSUjsKKyAgICAgIGZvciAoZnAgPSBpcC0+Zmxpc3Q7IGZwOyBmcCA9IGZwLT5uZXh0KQorICAgICAgICBpZiAoKGNvbnN0IGNoYXIqKWZwLT5wdHIgPj0gc3RhcnQgJiYgKGNvbnN0IGNoYXIqKWZwLT5wdHIgPCBlbmQpCisJICByZXR1cm4gU09BUF9FUlI7CisgICAgfQorICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3Jlc29sdmUoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2ZsaXN0ICpmcDsKKyAgc2hvcnQgZmxhZzsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHZpbmcgZm9yd2FyZGVkIGRhdGFcbiIpKTsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfSURIQVNIOyBpKyspCisgIHsgZm9yIChpcCA9IHNvYXAtPmlodFtpXTsgaXA7IGlwID0gaXAtPm5leHQpCisgICAgeyBpZiAoaXAtPnB0cikKKyAgICAgIHsgcmVnaXN0ZXIgdm9pZCAqcCwgKipxLCAqcjsKKyAgICAgICAgcSA9ICh2b2lkKiopaXAtPmxpbms7CisgICAgICAgIGlwLT5saW5rID0gTlVMTDsKKyAgICAgICAgciA9IGlwLT5wdHI7CisgICAgICAgIERCR0xPRyhURVNULCBpZiAocSkgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlRyYXZlcnNpbmcgbGluayBjaGFpbiB0byByZXNvbHZlIGlkPSclcydcbiIsIGlwLT5pZCkpOworICAgICAgICB3aGlsZSAocSkKKyAgICAgICAgeyBwID0gKnE7CisgICAgICAgICAgKnEgPSByOworICAgICAgICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICIuLi4gbGluayAlcCAtPiAlcFxuIiwgcSwgcikpOworICAgICAgICAgIHEgPSAodm9pZCoqKXA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCppcC0+aWQgPT0gJyMnKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk1pc3NpbmcgZGF0YSBmb3IgaWQ9JyVzJ1xuIiwgaXAtPmlkKSk7CisgICAgICAgIHN0cmNweShzb2FwLT5pZCwgaXAtPmlkICsgMSk7CisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTUlTU0lOR19JRDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZG8KKyAgeyBmbGFnID0gMDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc29sdXRpb24gcGhhc2VcbiIpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgU09BUF9JREhBU0g7IGkrKykKKyAgICB7IGZvciAoaXAgPSBzb2FwLT5paHRbaV07IGlwOyBpcCA9IGlwLT5uZXh0KQorICAgICAgeyBpZiAoaXAtPnB0ciAmJiAhc29hcF9oYXNfY29waWVzKHNvYXAsIChjb25zdCBjaGFyKilpcC0+cHRyLCAoY29uc3QgY2hhciopaXAtPnB0ciArIGlwLT5zaXplKSkKKyAgICAgICAgeyBpZiAoaXAtPmNvcHkpCisgICAgICAgICAgeyByZWdpc3RlciB2b2lkICpwLCAqKnEgPSAodm9pZCoqKWlwLT5jb3B5OworICAgICAgICAgICAgREJHTE9HKFRFU1QsIGlmIChxKSBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVHJhdmVyc2luZyBjb3B5IGNoYWluIHRvIHJlc29sdmUgaWQ9JyVzJ1xuIiwgaXAtPmlkKSk7CisgICAgICAgICAgICBpcC0+Y29weSA9IE5VTEw7CisgICAgICAgICAgICBkbworICAgICAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIi4uLiBjb3B5ICVwIC0+ICVwICgldSBieXRlcylcbiIsIGlwLT5wdHIsIHEsICh1bnNpZ25lZCBpbnQpaXAtPnNpemUpKTsKKwkgICAgICBwID0gKnE7CisgICAgICAgICAgICAgIG1lbWNweShxLCBpcC0+cHRyLCBpcC0+c2l6ZSk7CisgICAgICAgICAgICAgIHEgPSAodm9pZCoqKXA7CisgICAgICAgICAgICB9IHdoaWxlIChxKTsKKwkgICAgZmxhZyA9IDE7CisJICB9CisgICAgICAgICAgZm9yIChmcCA9IGlwLT5mbGlzdDsgZnA7IGZwID0gaXAtPmZsaXN0KQorICAgICAgICAgIHsgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGsgPSBmcC0+bGV2ZWw7CisJICAgIHJlZ2lzdGVyIHZvaWQgKnAgPSBpcC0+cHRyOworICAgICAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHZpbmcgZm9yd2FyZGVkIGRhdGEgdHlwZT0lZCBsb2NhdGlvbj0lcCBsZXZlbD0ldSwldSBpZD0nJXMnXG4iLCBpcC0+dHlwZSwgcCwgaXAtPmxldmVsLCBmcC0+bGV2ZWwsIGlwLT5pZCkpOworCSAgICB3aGlsZSAoaXAtPmxldmVsIDwgaykKKyAgICAgICAgICAgIHsgcmVnaXN0ZXIgdm9pZCAqKnEgPSAodm9pZCoqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZih2b2lkKikpOyAgCisJICAgICAgaWYgKCFxKQorCSAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworCSAgICAgICpxID0gcDsKKyAgICAgICAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJEZXNjZW5kaW5nIG9uZSBsZXZlbCwgbmV3IGxvY2F0aW9uPSVwIGhvbGRzPSVwLi4uXG4iLCBxLCAqcSkpOworICAgICAgICAgICAgICBwID0gKHZvaWQqKXE7CisgICAgICAgICAgICAgIGstLTsKKyAgICAgICAgICAgIH0KKwkgICAgaWYgKGZwLT5mY29weSkKKwkgICAgICBmcC0+ZmNvcHkoc29hcCwgaXAtPnR5cGUsIGZwLT50eXBlLCBmcC0+cHRyLCBmcC0+bGVuLCBwLCBpcC0+c2l6ZSk7CisJICAgIGVsc2UKKwkgICAgICBzb2FwX2Zjb3B5KHNvYXAsIGlwLT50eXBlLCBmcC0+dHlwZSwgZnAtPnB0ciwgZnAtPmxlbiwgcCwgaXAtPnNpemUpOworCSAgICBpcC0+Zmxpc3QgPSBmcC0+bmV4dDsKKwkgICAgU09BUF9GUkVFKHNvYXAsIGZwKTsKKwkgICAgZmxhZyA9IDE7CisJICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0gd2hpbGUgKGZsYWcpOworI2lmZGVmIFNPQVBfREVCVUcKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfSURIQVNIOyBpKyspCisgIHsgZm9yIChpcCA9IHNvYXAtPmlodFtpXTsgaXA7IGlwID0gaXAtPm5leHQpCisgICAgeyBpZiAoaXAtPmNvcHkgfHwgaXAtPmZsaXN0KQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc29sdXRpb24gZXJyb3I6IGZvcndhcmRlZCBkYXRhIGZvciBpZD0nJXMnIGNvdWxkIG5vdCBiZSBwcm9wYWdhdGVkLCBwbGVhc2UgcmVwb3J0IHRoaXMgcHJvYmxlbSB0byB0aGUgZGV2ZWxvcGVyc1xuIiwgaXAtPmlkKSk7CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHV0aW9uIGRvbmVcbiIpKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3NpemVfdAorU09BUF9GTUFDMgorc29hcF9zaXplX2Jsb2NrKHN0cnVjdCBzb2FwICpzb2FwLCBzaXplX3QgbikKK3sgaWYgKHNvYXAtPmJsaXN0LT5wdHIpCisgIHsgc29hcC0+Ymxpc3QtPnNpemUgLT0gKihzaXplX3QqKShzb2FwLT5ibGlzdC0+cHRyICsgc2l6ZW9mKGNoYXIqKSkgLSBuOworICAgICooc2l6ZV90Kikoc29hcC0+Ymxpc3QtPnB0ciArIHNpemVvZihjaGFyKikpID0gbjsKKyAgfQorICByZXR1cm4gc29hcC0+Ymxpc3QtPnNpemU7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjaGFyKgorU09BUF9GTUFDMgorc29hcF9maXJzdF9ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgY2hhciAqcCwgKnEsICpyOworICBwID0gc29hcC0+Ymxpc3QtPnB0cjsKKyAgaWYgKCFwKQorICAgIHJldHVybiBOVUxMOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZpcnN0IGJsb2NrXG4iKSk7CisgIHIgPSBOVUxMOworICBkbworICB7IHEgPSAqKGNoYXIqKilwOworICAgICooY2hhcioqKXAgPSByOworICAgIHIgPSBwOworICAgIHAgPSBxOworICB9IHdoaWxlIChwKTsKKyAgc29hcC0+Ymxpc3QtPnB0ciA9IHI7CisgIHJldHVybiByICsgc2l6ZW9mKGNoYXIqKSArIHNpemVvZihzaXplX3QpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfbmV4dF9ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgY2hhciAqcDsKKyAgcCA9IHNvYXAtPmJsaXN0LT5wdHI7CisgIGlmIChwKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTmV4dCBibG9ja1xuIikpOworICAgIHNvYXAtPmJsaXN0LT5wdHIgPSAqKGNoYXIqKilwOworICAgIFNPQVBfRlJFRShzb2FwLCBwKTsKKyAgICBpZiAoc29hcC0+Ymxpc3QtPnB0cikKKyAgICAgIHJldHVybiBzb2FwLT5ibGlzdC0+cHRyICsgc2l6ZW9mKGNoYXIqKSArIHNpemVvZihzaXplX3QpOworICB9CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc2l6ZV90CitTT0FQX0ZNQUMyCitzb2FwX2Jsb2NrX3NpemUoc3RydWN0IHNvYXAgKnNvYXApCit7IHJldHVybiAqKHNpemVfdCopKHNvYXAtPmJsaXN0LT5wdHIgKyBzaXplb2YoY2hhciopKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZW5kX2Jsb2NrKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9ibGlzdCAqYnA7CisgIGNoYXIgKnAsICpxOworICBicCA9IHNvYXAtPmJsaXN0OworICBpZiAoYnApCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgb2YgYmxvY2sgc2VxdWVuY2UsIGZyZWUgYWxsIHJlbWFpbmluZyBibG9ja3NcbiIpKTsKKyAgICBmb3IgKHAgPSBicC0+cHRyOyBwOyBwID0gcSkKKyAgICB7IHEgPSAqKGNoYXIqKilwOworICAgICAgU09BUF9GUkVFKHNvYXAsIHApOworICAgIH0KKyAgICBzb2FwLT5ibGlzdCA9IGJwLT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBicCk7CisgIH0KKyAgREJHTE9HKFRFU1QsIGlmIChzb2FwLT5ibGlzdCkgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc3RvcmUgcHJldmlvdXMgYmxvY2sgc2VxdWVuY2VcbiIpKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3NhdmVfYmxvY2soc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnAsIGludCBmbGFnKQoreyByZWdpc3RlciBzaXplX3QgbjsKKyAgcmVnaXN0ZXIgY2hhciAqcSwgKnM7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2F2ZSBhbGwgYmxvY2tzIGluIGNvbnRpZ3VvdXMgbWVtb3J5IHNwYWNlIG9mICV1IGJ5dGVzICglcC0+JXApXG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmJsaXN0LT5zaXplLCBzb2FwLT5ibGlzdC0+cHRyLCBwKSk7CisgIGlmIChzb2FwLT5ibGlzdC0+c2l6ZSkKKyAgeyBpZiAoIXApCisgICAgICBwID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHNvYXAtPmJsaXN0LT5zaXplKTsKKyAgICBpZiAocCkKKyAgICB7IGZvciAocyA9IHAsIHEgPSBzb2FwX2ZpcnN0X2Jsb2NrKHNvYXApOyBxOyBxID0gc29hcF9uZXh0X2Jsb2NrKHNvYXApKQorICAgICAgeyBuID0gc29hcF9ibG9ja19zaXplKHNvYXApOworI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgICAgICAgaWYgKGZsYWcpCisJICBzb2FwX3VwZGF0ZV9wdHJzKHNvYXAsIHEsIHEgKyBuLCBzLCBxKTsKKyNlbmRpZgorICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHkgJXUgYnl0ZXMgZnJvbSAlcCB0byAlcFxuIiwgKHVuc2lnbmVkIGludCluLCBxLCBzKSk7CisgICAgICAgIG1lbWNweShzLCBxLCBuKTsKKyAgICAgICAgcyArPSBuOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICB9CisgIHNvYXBfZW5kX2Jsb2NrKHNvYXApOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9wdXRzaXplKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgc2l6ZSkKK3sgcmV0dXJuIHNvYXBfcHV0c2l6ZXMoc29hcCwgdHlwZSwgJnNpemUsIDEpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3B1dHNpemVzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBpbnQgKnNpemUsIGludCBkaW0pCit7IHJldHVybiBzb2FwX3B1dHNpemVzb2Zmc2V0cyhzb2FwLCB0eXBlLCBzaXplLCBOVUxMLCBkaW0pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3B1dHNpemVzb2Zmc2V0cyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgaW50ICpzaXplLCBjb25zdCBpbnQgKm9mZnNldCwgaW50IGRpbSkKK3sgaW50IGk7CisgIGlmICghdHlwZSkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgeyBzcHJpbnRmKHNvYXAtPnR5cGUsICIlc1slZCIsIHR5cGUsIHNpemVbMF0pOworICAgIGZvciAoaSA9IDE7IGkgPCBkaW07IGkrKykKKyAgICAgIHNwcmludGYoc29hcC0+dHlwZSArIHN0cmxlbihzb2FwLT50eXBlKSwgIiAlZCIsIHNpemVbaV0pOworICB9CisgIGVsc2UKKyAgeyBpZiAob2Zmc2V0KQorICAgIHsgc3ByaW50Zihzb2FwLT50eXBlLCAiJXNbJWQiLCB0eXBlLCBzaXplWzBdICsgb2Zmc2V0WzBdKTsKKyAgICAgIGZvciAoaSA9IDE7IGkgPCBkaW07IGkrKykKKyAgICAgICAgc3ByaW50Zihzb2FwLT50eXBlICsgc3RybGVuKHNvYXAtPnR5cGUpLCAiLCVkIiwgc2l6ZVtpXSArIG9mZnNldFtpXSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IHNwcmludGYoc29hcC0+dHlwZSwgIiVzWyVkIiwgdHlwZSwgc2l6ZVswXSk7CisgICAgICBmb3IgKGkgPSAxOyBpIDwgZGltOyBpKyspCisgICAgICAgIHNwcmludGYoc29hcC0+dHlwZSArIHN0cmxlbihzb2FwLT50eXBlKSwgIiwlZCIsIHNpemVbaV0pOworICAgIH0KKyAgICBzdHJjYXQoc29hcC0+dHlwZSwgIl0iKTsKKyAgfQorICByZXR1cm4gc29hcC0+dHlwZTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9wdXRvZmZzZXQoc3RydWN0IHNvYXAgKnNvYXAsIGludCBvZmZzZXQpCit7IHJldHVybiBzb2FwX3B1dG9mZnNldHMoc29hcCwgJm9mZnNldCwgMSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfcHV0b2Zmc2V0cyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgaW50ICpvZmZzZXQsIGludCBkaW0pCit7IHJlZ2lzdGVyIGludCBpOworICBzcHJpbnRmKHNvYXAtPmFycmF5T2Zmc2V0LCAiWyVkIiwgb2Zmc2V0WzBdKTsKKyAgZm9yIChpID0gMTsgaSA8IGRpbTsgaSsrKQorICAgIHNwcmludGYoc29hcC0+YXJyYXlPZmZzZXQgKyBzdHJsZW4oc29hcC0+YXJyYXlPZmZzZXQpLCAiLCVkIiwgb2Zmc2V0W2ldKTsKKyAgc3RyY2F0KHNvYXAtPmFycmF5T2Zmc2V0LCAiXSIpOworICByZXR1cm4gc29hcC0+YXJyYXlPZmZzZXQ7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2l6ZShjb25zdCBpbnQgKnNpemUsIGludCBkaW0pCit7IHJlZ2lzdGVyIGludCBpLCBuID0gc2l6ZVswXTsKKyAgZm9yIChpID0gMTsgaSA8IGRpbTsgaSsrKQorICAgIG4gKj0gc2l6ZVtpXTsKKyAgcmV0dXJuIG47Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0b2Zmc2V0cyhjb25zdCBjaGFyICphdHRyLCBjb25zdCBpbnQgKnNpemUsIGludCAqb2Zmc2V0LCBpbnQgZGltKQoreyByZWdpc3RlciBpbnQgaSwgaiA9IDA7CisgIGlmIChvZmZzZXQpCisgICAgZm9yIChpID0gMDsgaSA8IGRpbSAmJiBhdHRyICYmICphdHRyOyBpKyspCisgICAgeyBhdHRyKys7CisgICAgICBqICo9IHNpemVbaV07CisgICAgICBqICs9IG9mZnNldFtpXSA9IChpbnQpYXRvbChhdHRyKTsKKyAgICAgIGF0dHIgPSBzdHJjaHIoYXR0ciwgJywnKTsKKyAgICB9CisgIGVsc2UKKyAgICBmb3IgKGkgPSAwOyBpIDwgZGltICYmIGF0dHIgJiYgKmF0dHI7IGkrKykKKyAgICB7IGF0dHIrKzsKKyAgICAgIGogKj0gc2l6ZVtpXTsKKyAgICAgIGogKz0gKGludClhdG9sKGF0dHIpOworICAgICAgYXR0ciA9IHN0cmNocihhdHRyLCAnLCcpOworICAgIH0KKyAgcmV0dXJuIGo7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0c2l6ZShjb25zdCBjaGFyICphdHRyMSwgY29uc3QgY2hhciAqYXR0cjIsIGludCAqaikKK3sgcmVnaXN0ZXIgaW50IG4sIGs7CisgIGNoYXIgKnM7CisgICpqID0gMDsKKyAgaWYgKCEqYXR0cjEpCisgICAgcmV0dXJuIC0xOworICBpZiAoKmF0dHIxID09ICdbJykKKyAgICBhdHRyMSsrOworICBuID0gMTsKKyAgZm9yICg7OykKKyAgeyBrID0gKGludClzb2FwX3N0cnRvbChhdHRyMSwgJnMsIDEwKTsKKyAgICBuICo9IGs7CisgICAgaWYgKGsgPCAwIHx8IG4gPiBTT0FQX01BWEFSUkFZU0laRSB8fCBzID09IGF0dHIxKQorICAgICAgcmV0dXJuIC0xOworICAgIGF0dHIxID0gc3RyY2hyKHMsICcsJyk7CisgICAgaWYgKCFhdHRyMSkKKyAgICAgIGF0dHIxID0gc3RyY2hyKHMsICcgJyk7CisgICAgaWYgKGF0dHIyICYmICphdHRyMikKKyAgICB7IGF0dHIyKys7CisgICAgICAqaiAqPSBrOworICAgICAgayA9IChpbnQpc29hcF9zdHJ0b2woYXR0cjIsICZzLCAxMCk7CisgICAgICAqaiArPSBrOworICAgICAgaWYgKGsgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgICBhdHRyMiA9IHM7CisgICAgfQorICAgIGlmICghYXR0cjEpCisgICAgICBicmVhazsKKyAgICBhdHRyMSsrOworICB9CisgIHJldHVybiBuIC0gKmo7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0c2l6ZXMoY29uc3QgY2hhciAqYXR0ciwgaW50ICpzaXplLCBpbnQgZGltKQoreyByZWdpc3RlciBpbnQgaSwgaywgbjsKKyAgaWYgKCEqYXR0cikKKyAgICByZXR1cm4gLTE7CisgIGkgPSBzdHJsZW4oYXR0cik7CisgIG4gPSAxOworICBkbworICB7IGZvciAoaSA9IGktMTsgaSA+PSAwOyBpLS0pCisgICAgICBpZiAoYXR0cltpXSA9PSAnWycgfHwgYXR0cltpXSA9PSAnLCcgfHwgYXR0cltpXSA9PSAnICcpCisgICAgICAgIGJyZWFrOworICAgIGsgPSAoaW50KWF0b2woYXR0ciArIGkgKyAxKTsKKyAgICBuICo9IHNpemVbLS1kaW1dID0gazsKKyAgICBpZiAoayA8IDAgfHwgbiA+IFNPQVBfTUFYQVJSQVlTSVpFKQorICAgICAgcmV0dXJuIC0xOworICB9IHdoaWxlIChpID49IDAgJiYgYXR0cltpXSAhPSAnWycpOworICByZXR1cm4gbjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRwb3NpdGlvbihjb25zdCBjaGFyICphdHRyLCBpbnQgKnBvcykKK3sgcmVnaXN0ZXIgaW50IGksIG47CisgIGlmICghKmF0dHIpCisgICAgcmV0dXJuIC0xOworICBuID0gMDsKKyAgaSA9IDE7CisgIGRvCisgIHsgcG9zW24rK10gPSAoaW50KWF0b2woYXR0ciArIGkpOworICAgIHdoaWxlIChhdHRyW2ldICYmIGF0dHJbaV0gIT0gJywnICYmIGF0dHJbaV0gIT0gJ10nKQorICAgICAgaSsrOworICAgIGlmIChhdHRyW2ldID09ICcsJykKKyAgICAgIGkrKzsKKyAgfSB3aGlsZSAobiA8IFNPQVBfTUFYRElNUyAmJiBhdHRyW2ldICYmIGF0dHJbaV0gIT0gJ10nKTsKKyAgcmV0dXJuIG47Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHVzaF9uYW1lc3BhY2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICpucykKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wOworICByZWdpc3RlciBzdHJ1Y3QgTmFtZXNwYWNlICpwOworICByZWdpc3RlciBzaG9ydCBpID0gLTE7CisgIHJlZ2lzdGVyIHNpemVfdCBuLCBrOworICBuID0gc3RybGVuKGlkKTsKKyAgayA9IHN0cmxlbihucykgKyAxOworICBwID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlczsKKyAgaWYgKHApCisgIHsgZm9yIChpID0gMDsgcC0+aWQ7IHArKywgaSsrKQorICAgIHsgaWYgKHAtPm5zICYmICFzdHJjbXAobnMsIHAtPm5zKSkKKyAgICAgIHsgaWYgKHAtPm91dCkKKyAgICAgICAgeyBTT0FQX0ZSRUUoc29hcCwgcC0+b3V0KTsKKyAgICAgICAgICBwLT5vdXQgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKHAtPm91dCkKKyAgICAgIHsgaWYgKCFzdHJjbXAobnMsIHAtPm91dCkpCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlbHNlIGlmIChwLT5pbikKKyAgICAgIHsgaWYgKCFzb2FwX3RhZ19jbXAobnMsIHAtPmluKSkKKyAgICAgICAgeyBpZiAoKHAtPm91dCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBrKSkpCisgICAgICAgICAgICBzdHJjcHkocC0+b3V0LCBucyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFwIHx8ICFwLT5pZCkKKyAgICAgIGkgPSAtMTsKKyAgfQorICBpZiAoaSA+PSAwKQorICAgIGsgPSAwOworICBucCA9IChzdHJ1Y3Qgc29hcF9ubGlzdCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX25saXN0KSArIG4gKyBrKTsKKyAgaWYgKCFucCkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgbnAtPm5leHQgPSBzb2FwLT5ubGlzdDsKKyAgc29hcC0+bmxpc3QgPSBucDsKKyAgbnAtPmxldmVsID0gc29hcC0+bGV2ZWw7CisgIG5wLT5pbmRleCA9IGk7CisgIHN0cmNweShucC0+aWQsIGlkKTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQdXNoIG5hbWVzcGFjZSBiaW5kaW5nIChsZXZlbD0ldSkgJyVzJyAnJXMnXG4iLCBzb2FwLT5sZXZlbCwgaWQsIG5zKSk7CisgIGlmIChpIDwgMCkKKyAgeyBucC0+bnMgPSBucC0+aWQgKyBuICsgMTsKKyAgICBzdHJjcHkobnAtPm5zLCBucyk7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQdXNoIE5PVCBPSzogbm8gbWF0Y2ggZm91bmQgZm9yICclcycgaW4gbmFtZXNwYWNlIG1hcHBpbmcgdGFibGUgKGFkZGVkIHRvIHN0YWNrIGFueXdheSlcbiIsIG5zKSk7CisgIH0KKyAgZWxzZQorICB7IG5wLT5ucyA9IE5VTEw7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQdXNoIE9LICgnJXMnIG1hdGNoZXMgJyVzJyBpbiBuYW1lc3BhY2UgdGFibGUpXG4iLCBpZCwgcC0+aWQpKTsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfcG9wX25hbWVzcGFjZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wOworICB3aGlsZSAoc29hcC0+bmxpc3QgJiYgc29hcC0+bmxpc3QtPmxldmVsID49IHNvYXAtPmxldmVsKQorICB7IG5wID0gc29hcC0+bmxpc3QtPm5leHQ7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQb3BwZWQgbmFtZXNwYWNlIGJpbmRpbmcgKGxldmVsPSV1KSAnJXMnXG4iLCBzb2FwLT5sZXZlbCwgc29hcC0+bmxpc3QtPmlkKSk7CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPm5saXN0KTsKKyAgICBzb2FwLT5ubGlzdCA9IG5wOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfbWF0Y2hfbmFtZXNwYWNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZDEsIGNvbnN0IGNoYXIgKmlkMiwgaW50IG4xLCBpbnQgbjIpIAoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnAgPSBzb2FwLT5ubGlzdDsKKyAgd2hpbGUgKG5wICYmIChzdHJuY21wKG5wLT5pZCwgaWQxLCBuMSkgfHwgbnAtPmlkW24xXSkpCisgICAgbnAgPSBucC0+bmV4dDsKKyAgaWYgKG5wKQorICB7IGlmIChucC0+aW5kZXggPCAwCisgICAgIHx8IChzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW25wLT5pbmRleF0uaWQKKyAgICAgICYmIChzdHJuY21wKHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbbnAtPmluZGV4XS5pZCwgaWQyLCBuMikKKyAgICAgICB8fCBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW25wLT5pbmRleF0uaWRbbjJdKSkpCisgICAgICByZXR1cm4gU09BUF9OQU1FU1BBQ0U7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgaWYgKG4xID09IDMgJiYgbjEgPT0gbjIgJiYgIXN0cmNtcChpZDEsICJ4bWwiKSAmJiAhc3RyY21wKGlkMSwgaWQyKSkKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgcmV0dXJuIFNPQVBfU1lOVEFYX0VSUk9SOyAKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2N1cnJlbnRfbmFtZXNwYWNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucDsKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKKyAgbnAgPSBzb2FwLT5ubGlzdDsKKyAgaWYgKCEocyA9IHN0cmNocih0YWcsICc6JykpKQorICB7IHdoaWxlIChucCAmJiAqbnAtPmlkKSAvKiBmaW5kIGRlZmF1bHQgbmFtZXNwYWNlLCBpZiBwcmVzZW50ICovCisgICAgICBucCA9IG5wLT5uZXh0OworICB9CisgIGVsc2UKKyAgeyB3aGlsZSAobnAgJiYgKHN0cm5jbXAobnAtPmlkLCB0YWcsIHMgLSB0YWcpIHx8IG5wLT5pZFtzIC0gdGFnXSkpCisgICAgICBucCA9IG5wLT5uZXh0OworICAgIGlmICghbnApCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfTkFNRVNQQUNFOworICB9CisgIGlmIChucCkKKyAgeyBpZiAobnAtPmluZGV4ID49IDApCisgICAgICByZXR1cm4gc29hcC0+bmFtZXNwYWNlc1tucC0+aW5kZXhdLm5zOworICAgIGlmIChucC0+bnMpCisgICAgICByZXR1cm4gc29hcF9zdHJkdXAoc29hcCwgbnAtPm5zKTsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF90YWdfY21wKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKnQpCit7IGZvciAoOzspCisgIHsgcmVnaXN0ZXIgaW50IGMxID0gKnM7CisgICAgcmVnaXN0ZXIgaW50IGMyID0gKnQ7CisgICAgaWYgKCFjMSB8fCBjMSA9PSAnIicpCisgICAgICBicmVhazsKKyAgICBpZiAoYzIgIT0gJy0nKQorICAgIHsgaWYgKGMxICE9IGMyKQorICAgICAgeyBpZiAoYzEgPj0gJ0EnICYmIGMxIDw9ICdaJykKKyAgICAgICAgICBjMSArPSAnYScgLSAnQSc7CisgICAgICAgIGlmIChjMiA+PSAnQScgJiYgYzIgPD0gJ1onKQorICAgICAgICAgIGMyICs9ICdhJyAtICdBJzsKKyAgICAgIH0KKyAgICAgIGlmIChjMSAhPSBjMikKKyAgICAgIHsgaWYgKGMyICE9ICcqJykKKyAgICAgICAgICByZXR1cm4gMTsKKwljMiA9ICorK3Q7CisgICAgICAgIGlmICghYzIpCisJICByZXR1cm4gMDsKKyAgICAgICAgaWYgKGMyID49ICdBJyAmJiBjMiA8PSAnWicpCisgICAgICAgICAgYzIgKz0gJ2EnIC0gJ0EnOworICAgICAgICBmb3IgKDs7KQorICAgICAgICB7IGMxID0gKnM7CisJICBpZiAoIWMxIHx8IGMxID09ICciJykKKwkgICAgYnJlYWs7CisJICBpZiAoYzEgPj0gJ0EnICYmIGMxIDw9ICdaJykKKyAgICAgICAgICAgIGMxICs9ICdhJyAtICdBJzsKKyAgICAgICAgICBpZiAoYzEgPT0gYzIgJiYgIXNvYXBfdGFnX2NtcChzICsgMSwgdCArIDEpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisJICBzKys7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHMrKzsKKyAgICB0Kys7CisgIH0KKyAgaWYgKCp0ID09ICcqJyAmJiAhdFsxXSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuICp0OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX21hdGNoX3RhZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnMSwgY29uc3QgY2hhciAqdGFnMikKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqcywgKnQ7CisgIGlmICghdGFnMSB8fCAhdGFnMiB8fCAhKnRhZzIpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIHMgPSBzdHJjaHIodGFnMSwgJzonKTsKKyAgdCA9IHN0cmNocih0YWcyLCAnOicpOworICBpZiAodCkKKyAgeyBpZiAocykKKyAgICB7IGlmICh0WzFdICYmIFNPQVBfU1RSQ01QKHMgKyAxLCB0ICsgMSkpCisgICAgICAgIHJldHVybiBTT0FQX1RBR19NSVNNQVRDSDsKKyAgICAgIGlmICh0ICE9IHRhZzIgJiYgc29hcF9tYXRjaF9uYW1lc3BhY2Uoc29hcCwgdGFnMSwgdGFnMiwgcyAtIHRhZzEsIHQgLSB0YWcyKSkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJUYWdzICclcycgYW5kICclcycgbWF0Y2ggYnV0IG5hbWVzcGFjZXMgZGlmZmVyXG4iLCB0YWcxLCB0YWcyKSk7CisgICAgICAgIHJldHVybiBTT0FQX1RBR19NSVNNQVRDSDsKKyAgICAgIH0KKyAgICB9IAorICAgIGVsc2UgaWYgKFNPQVBfU1RSQ01QKHRhZzEsIHQgKyAxKSkKKyAgICAgIHJldHVybiBTT0FQX1RBR19NSVNNQVRDSDsKKyAgICBlbHNlIGlmICh0ICE9IHRhZzIgJiYgc29hcF9tYXRjaF9uYW1lc3BhY2Uoc29hcCwgdGFnMSwgdGFnMiwgMCwgdCAtIHRhZzIpKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJUYWdzICclcycgYW5kICclcycgbWF0Y2ggYnV0IG5hbWVzcGFjZXMgZGlmZmVyXG4iLCB0YWcxLCB0YWcyKSk7CisgICAgICByZXR1cm4gU09BUF9UQUdfTUlTTUFUQ0g7CisgICAgfQorICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVGFncyBhbmQgKGRlZmF1bHQpIG5hbWVzcGFjZXMgbWF0Y2g6ICclcycgJyVzJ1xuIiwgdGFnMSwgdGFnMikpOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIGlmIChzKQorICB7IGlmIChTT0FQX1NUUkNNUChzICsgMSwgdGFnMikpCisgICAgICByZXR1cm4gU09BUF9UQUdfTUlTTUFUQ0g7CisgIH0KKyAgZWxzZSBpZiAoU09BUF9TVFJDTVAodGFnMSwgdGFnMikpCisgICAgcmV0dXJuIFNPQVBfVEFHX01JU01BVENIOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlRhZ3MgbWF0Y2g6ICclcycgJyVzJ1xuIiwgdGFnMSwgdGFnMikpOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9tYXRjaF9hcnJheShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdHlwZSkKK3sgaWYgKCpzb2FwLT5hcnJheVR5cGUpCisgICAgaWYgKHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPmFycmF5VHlwZSwgdHlwZSkKKyAgICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+YXJyYXlUeXBlLCAieHNkOmFueVR5cGUiKQorICAgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT5hcnJheVR5cGUsICJ4c2Q6dXItdHlwZSIpCisgICAgKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJBcnJheSB0eXBlIG1pc21hdGNoOiAnJXMnICclcydcbiIsIHNvYXAtPmFycmF5VHlwZSwgdHlwZSkpOworICAgICAgcmV0dXJuIFNPQVBfVEFHX01JU01BVENIOworICAgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglTU0wKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgV0lUSF9PUEVOU1NMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yYW5kKCkKK3sgdW5zaWduZWQgY2hhciBidWZbNF07CisgIGlmICghc3NsX2luaXRfZG9uZSkKKyAgICBzb2FwX3NzbF9pbml0KCk7CisgIFJBTkRfcHNldWRvX2J5dGVzKGJ1ZiwgNCk7CisgIHJldHVybiAqKGludCopYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NzbF9zZXJ2ZXJfY29udGV4dChzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgc2hvcnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmtleWZpbGUsIGNvbnN0IGNoYXIgKnBhc3N3b3JkLCBjb25zdCBjaGFyICpjYWZpbGUsIGNvbnN0IGNoYXIgKmNhcGF0aCwgY29uc3QgY2hhciAqZGhmaWxlLCBjb25zdCBjaGFyICpyYW5kZmlsZSwgY29uc3QgY2hhciAqc2lkKQoreyBpbnQgZXJyOworICBzb2FwLT5rZXlmaWxlID0ga2V5ZmlsZTsKKyAgc29hcC0+cGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgc29hcC0+Y2FmaWxlID0gY2FmaWxlOworICBzb2FwLT5jYXBhdGggPSBjYXBhdGg7CisgIGlmIChkaGZpbGUpCisgIHsgc29hcC0+ZGhmaWxlID0gZGhmaWxlOworICAgIHNvYXAtPnJzYSA9IDA7CisgIH0KKyAgZWxzZQorICB7IHNvYXAtPmRoZmlsZSA9IE5VTEw7CisgICAgc29hcC0+cnNhID0gMTsKKyAgfQorICBzb2FwLT5yYW5kZmlsZSA9IHJhbmRmaWxlOworICBzb2FwLT5yZXF1aXJlX2NsaWVudF9hdXRoID0gKGZsYWdzICYgU09BUF9TU0xfUkVRVUlSRV9DTElFTlRfQVVUSEVOVElDQVRJT04pOworICBpZiAoIShlcnIgPSBzb2FwLT5mc3NsYXV0aChzb2FwKSkpCisgIHsgaWYgKHNpZCkKKyAgICAgIFNTTF9DVFhfc2V0X3Nlc3Npb25faWRfY29udGV4dChzb2FwLT5jdHgsICh1bnNpZ25lZCBjaGFyKilzaWQsIHN0cmxlbihzaWQpKTsKKyAgfQorICByZXR1cm4gZXJyOyAKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zc2xfY2xpZW50X2NvbnRleHQoc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIHNob3J0IGZsYWdzLCBjb25zdCBjaGFyICprZXlmaWxlLCBjb25zdCBjaGFyICpwYXNzd29yZCwgY29uc3QgY2hhciAqY2FmaWxlLCBjb25zdCBjaGFyICpjYXBhdGgsIGNvbnN0IGNoYXIgKnJhbmRmaWxlKQoreyBzb2FwLT5rZXlmaWxlID0ga2V5ZmlsZTsKKyAgc29hcC0+cGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgc29hcC0+Y2FmaWxlID0gY2FmaWxlOworICBzb2FwLT5jYXBhdGggPSBjYXBhdGg7CisgIHNvYXAtPmRoZmlsZSA9IE5VTEw7CisgIHNvYXAtPnJzYSA9IDA7CisgIHNvYXAtPnJhbmRmaWxlID0gcmFuZGZpbGU7CisgIHNvYXAtPnJlcXVpcmVfc2VydmVyX2F1dGggPSAoZmxhZ3MgJiBTT0FQX1NTTF9SRVFVSVJFX1NFUlZFUl9BVVRIRU5USUNBVElPTik7CisgIHJldHVybiBzb2FwLT5mc3NsYXV0aChzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc3NsX2luaXQoKQoreyAvKiBOb3RlOiBmb3IgTVQgc3lzdGVtcywgdGhlIG1haW4gcHJvZ3JhbSBNVVNUIGNhbGwgc29hcF9zc2xfaW5pdCgpIGJlZm9yZSBhbnkgdGhyZWFkcyBhcmUgc3RhcnRlZCAqLworICBpZiAoIXNzbF9pbml0X2RvbmUpCisgIHsgc3NsX2luaXRfZG9uZSA9IDE7CisgICAgU1NMX2xpYnJhcnlfaW5pdCgpOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBTU0xfbG9hZF9lcnJvcl9zdHJpbmdzKCk7CisjZW5kaWYKKyAgICBpZiAoIVJBTkRfbG9hZF9maWxlKCIvZGV2L3VyYW5kb20iLCAxMDI0KSkKKyAgICB7IGNoYXIgYnVmWzEwMjRdOworICAgICAgUkFORF9zZWVkKGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgICAgd2hpbGUgKCFSQU5EX3N0YXR1cygpKQorICAgICAgeyBpbnQgciA9IHJhbmQoKTsKKyAgICAgICAgUkFORF9zZWVkKCZyLCBzaXplb2YoaW50KSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY29uc3QgY2hhciAqCitzc2xfZXJyb3Ioc3RydWN0IHNvYXAgKnNvYXAsIGludCByZXQpCit7IGludCBlcnIgPSBTU0xfZ2V0X2Vycm9yKHNvYXAtPnNzbCwgcmV0KTsKKyAgY29uc3QgY2hhciAqbXNnID0gc29hcF9zdHJfY29kZShoX3NzbF9lcnJvcl9jb2RlcywgZXJyKTsKKyAgaWYgKG1zZykKKyAgICBzdHJjcHkoc29hcC0+bXNnYnVmLCBtc2cpOworICBlbHNlCisgICAgcmV0dXJuIEVSUl9lcnJvcl9zdHJpbmcoZXJyLCBzb2FwLT5tc2didWYpOworICBpZiAoRVJSX3BlZWtfZXJyb3IoKSkKKyAgeyB1bnNpZ25lZCBsb25nIHI7CisgICAgc3RyY2F0KHNvYXAtPm1zZ2J1ZiwgIlxuIik7CisgICAgd2hpbGUgKChyID0gRVJSX2dldF9lcnJvcigpKSkKKyAgICAgIEVSUl9lcnJvcl9zdHJpbmdfbihyLCBzb2FwLT5tc2didWYgKyBzdHJsZW4oc29hcC0+bXNnYnVmKSwgc2l6ZW9mKHNvYXAtPm1zZ2J1ZikgLSBzdHJsZW4oc29hcC0+bXNnYnVmKSk7CisgIH0gCisgIGVsc2UKKyAgeyBzd2l0Y2ggKHJldCkKKyAgICB7IGNhc2UgMDoKKyAgICAgICAgc3RyY3B5KHNvYXAtPm1zZ2J1ZiwgIkVPRiB3YXMgb2JzZXJ2ZWQgdGhhdCB2aW9sYXRlcyB0aGUgcHJvdG9jb2wuIFRoZSBjbGllbnQgcHJvYmFibHkgcHJvdmlkZWQgaW52YWxpZCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbi4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIC0xOgorICAgICAgICBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIkVycm9yIG9ic2VydmVkIGJ5IHVuZGVybHlpbmcgQklPOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7ICAKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5tc2didWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzc2xfcGFzc3dvcmQoY2hhciAqYnVmLCBpbnQgbnVtLCBpbnQgcndmbGFnLCB2b2lkICp1c2VyZGF0YSkKK3sgaWYgKG51bSA8IChpbnQpc3RybGVuKChjaGFyKil1c2VyZGF0YSkgKyAxKQorICAgIHJldHVybiAwOworICByZXR1cm4gc3RybGVuKHN0cmNweShidWYsIChjaGFyKil1c2VyZGF0YSkpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUaGlzIGNhbGxiYWNrIGlzIGluY2x1ZGVkIGZvciBmdXR1cmUgcmVmZXJlbmNlcy4gSXQgc2hvdWxkIG5vdCBiZSBkZWxldGVkCisjaWZuZGVmIFBBTE1fMgorc3RhdGljIERIICoKK3NzbF90bXBfZGgoU1NMICpzc2wsIGludCBpc19leHBvcnQsIGludCBrZXlsZW5ndGgpCit7IHN0YXRpYyBESCAqZGg1MTIgPSBOVUxMOworICBzdGF0aWMgREggKmRoMTAyNCA9IE5VTEw7CisgIERIICpkaDsKKyAgc3dpdGNoIChrZXlsZW5ndGgpCisgIHsgY2FzZSA1MTI6CisgICAgICBpZiAoIWRoNTEyKQorICAgICAgeyBCSU8gKmJpbyA9IEJJT19uZXdfZmlsZSgiZGg1MTIucGVtIiwgInIiKTsKKyAgICAgICAgaWYgKGJpbykKKyAgICAgICAgeyBkaDUxMiA9IFBFTV9yZWFkX2Jpb19ESHBhcmFtcyhiaW8sIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgICAgIEJJT19mcmVlKGJpbyk7CisgICAgICAgICAgcmV0dXJuIGRoNTEyOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBkaDUxMjsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKCFkaDEwMjQpCisgICAgICB7IEJJTyAqYmlvID0gQklPX25ld19maWxlKCJkaDEwMjQucGVtIiwgInIiKTsKKyAgICAgICAgaWYgKGJpbykKKyAgICAgICAgeyBkaDEwMjQgPSBQRU1fcmVhZF9iaW9fREhwYXJhbXMoYmlvLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICBCSU9fZnJlZShiaW8pOworICAgICAgICB9CisgICAgICB9CisgICAgICBkaCA9IGRoMTAyNDsKKyAgfQorICByZXR1cm4gZGg7Cit9CisjZW5kaWYKKyovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc3NsX2F1dGhfaW5pdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKCFzc2xfaW5pdF9kb25lKQorICAgIHNvYXBfc3NsX2luaXQoKTsKKyAgaWYgKCFzb2FwLT5jdHgpCisgIHsgaWYgKCEoc29hcC0+Y3R4ID0gU1NMX0NUWF9uZXcoU1NMdjIzX21ldGhvZCgpKSkpCisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCBzZXR1cCBjb250ZXh0IiwgU09BUF9TU0xfRVJST1IpOworICB9CisgIGlmIChzb2FwLT5yYW5kZmlsZSkKKyAgeyBpZiAoIVJBTkRfbG9hZF9maWxlKHNvYXAtPnJhbmRmaWxlLCAtMSkpCisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCBsb2FkIHJhbmRvbW5lc3MiLCBTT0FQX1NTTF9FUlJPUik7CisgIH0KKyAgaWYgKHNvYXAtPmNhZmlsZSB8fCBzb2FwLT5jYXBhdGgpCisgIHsgaWYgKCFTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhzb2FwLT5jdHgsIHNvYXAtPmNhZmlsZSwgc29hcC0+Y2FwYXRoKSkKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHJlYWQgQ0EgZmlsZSBhbmQgZGlyZWN0b3J5IiwgU09BUF9TU0xfRVJST1IpOworICAgIGlmIChzb2FwLT5jYWZpbGUgJiYgc29hcC0+cmVxdWlyZV9jbGllbnRfYXV0aCkKKyAgICAgIFNTTF9DVFhfc2V0X2NsaWVudF9DQV9saXN0KHNvYXAtPmN0eCwgU1NMX2xvYWRfY2xpZW50X0NBX2ZpbGUoc29hcC0+Y2FmaWxlKSk7CisgIH0KKyAgaWYgKCFTU0xfQ1RYX3NldF9kZWZhdWx0X3ZlcmlmeV9wYXRocyhzb2FwLT5jdHgpKQorICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHJlYWQgZGVmYXVsdCBDQSBmaWxlIGFuZC9vciBkaXJlY3RvcnkiLCBTT0FQX1NTTF9FUlJPUik7CisvKiBTZWUgYmVsb3cgKi8KKyAgaWYgKHNvYXAtPmtleWZpbGUpCisgIHsgaWYgKCFTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKHNvYXAtPmN0eCwgc29hcC0+a2V5ZmlsZSkpCisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCByZWFkIGNlcnRpZmljYXRlIGtleSBmaWxlIiwgU09BUF9TU0xfRVJST1IpOworICAgIGlmIChzb2FwLT5wYXNzd29yZCkKKyAgICB7IFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiX3VzZXJkYXRhKHNvYXAtPmN0eCwgKHZvaWQqKXNvYXAtPnBhc3N3b3JkKTsKKyAgICAgIFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiKHNvYXAtPmN0eCwgc3NsX3Bhc3N3b3JkKTsKKyAgICB9CisgICAgaWYgKCFTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X2ZpbGUoc29hcC0+Y3R4LCBzb2FwLT5rZXlmaWxlLCBTU0xfRklMRVRZUEVfUEVNKSkKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHJlYWQga2V5IGZpbGUiLCBTT0FQX1NTTF9FUlJPUik7CisgIH0KKy8qIFN1Z2dlc3RlZCBhbHRlcm5hdGl2ZSBhcHByb2FjaCB0byBjaGVjayBjYWZpbGUgZmlyc3QgYmVmb3JlIHRoZSBrZXkgZmlsZToKKyAgaWYgKHNvYXAtPnBhc3N3b3JkKQorICB7IFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiX3VzZXJkYXRhKHNvYXAtPmN0eCwgKHZvaWQqKXNvYXAtPnBhc3N3b3JkKTsKKyAgICBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYihzb2FwLT5jdHgsIHNzbF9wYXNzd29yZCk7CisgIH0KKyAgaWYgKCFzb2FwLT5jYWZpbGUgfHwgIVNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoc29hcC0+Y3R4LCBzb2FwLT5jYWZpbGUpKQorICB7IGlmIChzb2FwLT5rZXlmaWxlKQorICAgIHsgaWYgKCFTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKHNvYXAtPmN0eCwgc29hcC0+a2V5ZmlsZSkpCisgICAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHJlYWQgY2VydGlmaWNhdGUgb3Iga2V5IGZpbGUiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgICBpZiAoIVNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfZmlsZShzb2FwLT5jdHgsIHNvYXAtPmtleWZpbGUsIFNTTF9GSUxFVFlQRV9QRU0pKQorICAgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCByZWFkIGtleSBmaWxlIiwgU09BUF9TU0xfRVJST1IpOworICAgIH0KKyAgfQorKi8KKyAgaWYgKHNvYXAtPnJzYSkKKyAgeyBSU0EgKnJzYSA9IFJTQV9nZW5lcmF0ZV9rZXkoMTAyNCwgUlNBX0Y0LCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoIVNTTF9DVFhfc2V0X3RtcF9yc2Eoc29hcC0+Y3R4LCByc2EpKQorICAgIHsgaWYgKHJzYSkKKyAgICAgICAgUlNBX2ZyZWUocnNhKTsKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHNldCBSU0Ega2V5IiwgU09BUF9TU0xfRVJST1IpOworICAgIH0KKyAgICBSU0FfZnJlZShyc2EpOworICB9CisgIGVsc2UgaWYgKHNvYXAtPmRoZmlsZSkKKyAgeyBESCAqZGggPSAwOworICAgIEJJTyAqYmlvOworICAgIGJpbyA9IEJJT19uZXdfZmlsZShzb2FwLT5kaGZpbGUsICJyIik7CisgICAgaWYgKCFiaW8pCisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCByZWFkIERIIGZpbGUiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgZGggPSBQRU1fcmVhZF9iaW9fREhwYXJhbXMoYmlvLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBCSU9fZnJlZShiaW8pOworICAgIGlmIChTU0xfQ1RYX3NldF90bXBfZGgoc29hcC0+Y3R4LCBkaCkgPCAwKQorICAgIHsgaWYgKGRoKQorICAgICAgICBESF9mcmVlKGRoKTsKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHNldCBESCBwYXJhbWV0ZXJzIiwgU09BUF9TU0xfRVJST1IpOworICAgIH0KKyAgICBESF9mcmVlKGRoKTsKKyAgfQorICBTU0xfQ1RYX3NldF9vcHRpb25zKHNvYXAtPmN0eCwgU1NMX09QX0FMTCB8IFNTTF9PUF9OT19TU0x2Mik7CisgIFNTTF9DVFhfc2V0X3ZlcmlmeShzb2FwLT5jdHgsIHNvYXAtPnJlcXVpcmVfY2xpZW50X2F1dGggPyAoU1NMX1ZFUklGWV9QRUVSIHwgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCkgOiBzb2FwLT5yZXF1aXJlX3NlcnZlcl9hdXRoID8gU1NMX1ZFUklGWV9QRUVSIDogU1NMX1ZFUklGWV9OT05FLCBzb2FwLT5mc3NsdmVyaWZ5KTsKKyNpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA8IDB4MDA5MDUxMDBMKQorICBTU0xfQ1RYX3NldF92ZXJpZnlfZGVwdGgoc29hcC0+Y3R4LCAxKTsgCisjZWxzZQorICBTU0xfQ1RYX3NldF92ZXJpZnlfZGVwdGgoc29hcC0+Y3R4LCA5KTsgCisjZW5kaWYgIAorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NzbF92ZXJpZnlfY2FsbGJhY2soaW50IG9rLCBYNTA5X1NUT1JFX0NUWCAqc3RvcmUpCit7CisjaWZkZWYgU09BUF9ERUJVRworICBpZiAoIW9rKSAKKyAgeyBjaGFyIGRhdGFbMjU2XTsKKyAgICBYNTA5ICpjZXJ0ID0gWDUwOV9TVE9SRV9DVFhfZ2V0X2N1cnJlbnRfY2VydChzdG9yZSk7CisgICAgZnByaW50ZihzdGRlcnIsICJTU0wgdmVyaWZ5IGVycm9yIG9yIHdhcm5pbmcgd2l0aCBjZXJ0aWZpY2F0ZSBhdCBkZXB0aCAlZDogJXNcbiIsIFg1MDlfU1RPUkVfQ1RYX2dldF9lcnJvcl9kZXB0aChzdG9yZSksIFg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKFg1MDlfU1RPUkVfQ1RYX2dldF9lcnJvcihzdG9yZSkpKTsKKyAgICBYNTA5X05BTUVfb25lbGluZShYNTA5X2dldF9pc3N1ZXJfbmFtZShjZXJ0KSwgZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImNlcnRpZmljYXRlIGlzc3VlciAlc1xuIiwgZGF0YSk7CisgICAgWDUwOV9OQU1FX29uZWxpbmUoWDUwOV9nZXRfc3ViamVjdF9uYW1lKGNlcnQpLCBkYXRhLCBzaXplb2YoZGF0YSkpOworICAgIGZwcmludGYoc3RkZXJyLCAiY2VydGlmaWNhdGUgc3ViamVjdCAlc1xuIiwgZGF0YSk7CisgIH0KKyNlbmRpZgorICAvKiBOb3RlOiByZXR1cm4gMSB0byBjb250aW51ZSwgYnV0IHVuc2FmZSBwcm9ncmVzcyB3aWxsIGJlIHRlcm1pbmF0ZWQgYnkgU1NMICovCisgIHJldHVybiBvazsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zc2xfYWNjZXB0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBCSU8gKmJpbzsKKyAgaW50IGksIHI7CisgIGlmICghc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJObyBzb2NrZXQgaW4gc29hcF9zc2xfYWNjZXB0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgIGlmICghc29hcC0+Y3R4ICYmIChzb2FwLT5lcnJvciA9IHNvYXAtPmZzc2xhdXRoKHNvYXApKSkKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgaWYgKCFzb2FwLT5zc2wpCisgIHsgc29hcC0+c3NsID0gU1NMX25ldyhzb2FwLT5jdHgpOworICAgIGlmICghc29hcC0+c3NsKQorICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiU1NMX25ldygpIGZhaWxlZCBpbiBzb2FwX3NzbF9hY2NlcHQoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgfQorICBlbHNlCisgICAgU1NMX2NsZWFyKHNvYXAtPnNzbCk7CisgIHNvYXAtPmltb2RlIHw9IFNPQVBfRU5DX1NTTDsKKyAgc29hcC0+b21vZGUgfD0gU09BUF9FTkNfU1NMOworI2lmIGRlZmluZWQoV0lOMzIpCisgIHsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGSU9OQklPLCAmbm9uYmxvY2tpbmcpOworICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgIHsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICBpb2N0bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGSU9OQklPLCAoaW50KSZub25ibG9ja2luZyk7CisgIH0KKyNlbHNlCisgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfR0VURkwpfE9fTk9OQkxPQ0spOworI2VuZGlmCisgIGJpbyA9IEJJT19uZXdfc29ja2V0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEJJT19OT0NMT1NFKTsKKyAgU1NMX3NldF9iaW8oc29hcC0+c3NsLCBiaW8sIGJpbyk7CisgIGkgPSAxMDA7IC8qIDEwMCAqIDAuMSBtcyByZXRyaWVzICovCisgIHdoaWxlICgociA9IFNTTF9hY2NlcHQoc29hcC0+c3NsKSkgPD0gMCkKKyAgeyBpbnQgZXJyID0gU1NMX2dldF9lcnJvcihzb2FwLT5zc2wsIHIpOworICAgIGlmIChlcnIgPT0gU1NMX0VSUk9SX1dBTlRfUkVBRCB8fCBlcnIgPT0gU1NMX0VSUk9SX1dBTlRfV1JJVEUpCisgICAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgICAgZmRfc2V0IGZkOworICAgICAgaWYgKGktLSA8PSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHRpbWVvdXQudHZfc2VjID0gMDsKKyAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDEwMDAwMDsKKyAgICAgIEZEX1pFUk8oJmZkKTsKKyAgICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmZmQpOworICAgICAgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCAmZmQsIE5VTEwsICZmZCwgJnRpbWVvdXQpOworICAgICAgaWYgKHIgPCAwICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIpCisgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICByZXR1cm4gU09BUF9FT0Y7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7IHNvYXAtPmVycm51bSA9IGVycjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorI2lmIGRlZmluZWQoV0lOMzIpCisgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGSU9OQklPLCAmYmxvY2tpbmcpOworICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICBpb2N0bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGSU9OQklPLCAoaW50KSZibG9ja2luZyk7CisgIH0KKyNlbHNlCisgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfR0VURkwpJn5PX05PTkJMT0NLKTsKKyNlbmRpZgorICBpZiAociA8PSAwKQorICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHNzbF9lcnJvcihzb2FwLCByKSwgIlNTTF9hY2NlcHQoKSBmYWlsZWQgaW4gc29hcF9zc2xfYWNjZXB0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgcmV0dXJuIFNPQVBfU1NMX0VSUk9SOworICB9CisgIGlmIChzb2FwLT5yZXF1aXJlX2NsaWVudF9hdXRoKQorICB7IFg1MDkgKnBlZXI7CisgICAgaW50IGVycjsKKyAgICBpZiAoKGVyciA9IFNTTF9nZXRfdmVyaWZ5X3Jlc3VsdChzb2FwLT5zc2wpKSAhPSBYNTA5X1ZfT0spCisgICAgeyBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgIHJldHVybiBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgWDUwOV92ZXJpZnlfY2VydF9lcnJvcl9zdHJpbmcoZXJyKSwgIlNTTCBjZXJ0aWZpY2F0ZSBwcmVzZW50ZWQgYnkgcGVlciBjYW5ub3QgYmUgdmVyaWZpZWQgaW4gc29hcF9zc2xfYWNjZXB0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgfQorICAgIHBlZXIgPSBTU0xfZ2V0X3BlZXJfY2VydGlmaWNhdGUoc29hcC0+c3NsKTsKKyAgICBpZiAoIXBlZXIpCisgICAgeyBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgIHJldHVybiBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJObyBTU0wgY2VydGlmaWNhdGUgd2FzIHByZXNlbnRlZCBieSB0aGUgcGVlciBpbiBzb2FwX3NzbF9hY2NlcHQoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICB9CisgICAgWDUwOV9mcmVlKHBlZXIpOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZW5kaWYgLyogV0lUSF9PUEVOU1NMICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3RjcF9pbml0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5lcnJtb2RlID0gMTsKKyNpZmRlZiBXSU4zMgorICBpZiAodGNwX2RvbmUpCisgICAgcmV0dXJuIDA7CisgIGVsc2UKKyAgeyBXU0FEQVRBIHc7CisgICAgaWYgKFdTQVN0YXJ0dXAoTUFLRVdPUkQoMSwgMSksICZ3KSkKKyAgICAgIHJldHVybiAtMTsKKyAgICB0Y3BfZG9uZSA9IDE7CisgIH0KKyNlbmRpZgorICByZXR1cm4gMDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9kb25lKHN0cnVjdCBzb2FwICpzb2FwKQoreyAKKyNpZmRlZiBTT0FQX0RFQlVHCisgIGludCBpOworI2VuZGlmCisgIGlmIChzb2FwX2NoZWNrX3N0YXRlKHNvYXApKQorICAgIHJldHVybjsKKyAgc29hcF9mcmVlKHNvYXApOworICB3aGlsZSAoc29hcC0+Y2xpc3QpCisgIHsgc3RydWN0IHNvYXBfY2xpc3QgKnAgPSBzb2FwLT5jbGlzdC0+bmV4dDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+Y2xpc3QpOworICAgIHNvYXAtPmNsaXN0ID0gcDsKKyAgfQorICBzb2FwLT5rZWVwX2FsaXZlID0gMDsgLyogdG8gZm9yY2UgY2xvc2UgdGhlIHNvY2tldCAqLworICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyNpZmRlZiBXSVRIX0NPT0tJRVMKKyAgc29hcF9mcmVlX2Nvb2tpZXMoc29hcCk7CisjZW5kaWYKKyAgd2hpbGUgKHNvYXAtPnBsdWdpbnMpCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGx1Z2luICpwID0gc29hcC0+cGx1Z2lucy0+bmV4dDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlbW92aW5nIHBsdWdpbiAnJXMnXG4iLCBzb2FwLT5wbHVnaW5zLT5pZCkpOworICAgIGlmIChzb2FwLT5wbHVnaW5zLT5mY29weSB8fCBzb2FwLT5zdGF0ZSA9PSBTT0FQX0lOSVQpCisgICAgICBzb2FwLT5wbHVnaW5zLT5mZGVsZXRlKHNvYXAsIHNvYXAtPnBsdWdpbnMpOworICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5wbHVnaW5zKTsKKyAgICBzb2FwLT5wbHVnaW5zID0gcDsKKyAgfQorICBzb2FwLT5mcGx1Z2luID0gZnBsdWdpbjsKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyAgc29hcC0+ZnBvc3QgPSBodHRwX3Bvc3Q7CisgIHNvYXAtPmZnZXQgPSBodHRwX2dldDsKKyAgc29hcC0+ZmZvcm0gPSBOVUxMOworICBzb2FwLT5mcG9zdGhkciA9IGh0dHBfcG9zdF9oZWFkZXI7CisgIHNvYXAtPmZyZXNwb25zZSA9IGh0dHBfcmVzcG9uc2U7CisgIHNvYXAtPmZwYXJzZSA9IGh0dHBfcGFyc2U7CisgIHNvYXAtPmZwYXJzZWhkciA9IGh0dHBfcGFyc2VfaGVhZGVyOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0lQVjYKKyAgc29hcC0+ZnJlc29sdmUgPSB0Y3BfZ2V0aG9zdDsKKyNlbHNlCisgIHNvYXAtPmZyZXNvbHZlID0gTlVMTDsKKyNlbmRpZgorICBzb2FwLT5mYWNjZXB0ID0gdGNwX2FjY2VwdDsKKyAgc29hcC0+Zm9wZW4gPSB0Y3BfY29ubmVjdDsKKyAgc29hcC0+ZmNsb3NlID0gdGNwX2Rpc2Nvbm5lY3Q7CisgIHNvYXAtPmZjbG9zZXNvY2tldCA9IHRjcF9jbG9zZXNvY2tldDsKKyAgc29hcC0+ZnNodXRkb3duc29ja2V0ID0gdGNwX3NodXRkb3duc29ja2V0OworICBzb2FwLT5mc2VuZCA9IGZzZW5kOworICBzb2FwLT5mcmVjdiA9IGZyZWN2OworICBzb2FwLT5mcG9sbCA9IHNvYXBfcG9sbDsKKyNlbHNlCisgIHNvYXAtPmZvcGVuID0gTlVMTDsKKyAgc29hcC0+ZmNsb3NlID0gTlVMTDsKKyAgc29hcC0+ZnBvbGwgPSBOVUxMOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXAtPmZwcmVwYXJlaW5pdCA9IE5VTEw7CisgIHNvYXAtPmZwcmVwYXJlc2VuZCA9IE5VTEw7CisgIHNvYXAtPmZwcmVwYXJlcmVjdiA9IE5VTEw7CisgIHNvYXAtPmZwcmVwYXJlZmluYWwgPSBOVUxMOworI2VuZGlmCisgIHNvYXAtPmZzZXRlcnJvciA9IE5VTEw7CisgIHNvYXAtPmZpZ25vcmUgPSBOVUxMOworICBzb2FwLT5mc2VydmVsb29wID0gTlVMTDsKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgaWYgKHNvYXAtPnNlc3Npb24pCisgIHsgU1NMX1NFU1NJT05fZnJlZShzb2FwLT5zZXNzaW9uKTsKKyAgICBzb2FwLT5zZXNzaW9uID0gTlVMTDsKKyAgfQorI2VuZGlmCisgIGlmIChzb2FwLT5zdGF0ZSA9PSBTT0FQX0lOSVQpCisgIHsgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikpCisgICAgeyBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKXNvYXAtPm1hc3Rlcik7CisgICAgICBzb2FwLT5tYXN0ZXIgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICAgIH0KKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICBpZiAoc29hcC0+Y3R4KQorICAgIHsgU1NMX0NUWF9mcmVlKHNvYXAtPmN0eCk7CisgICAgICBzb2FwLT5jdHggPSBOVUxMOworICAgIH0KKyNlbmRpZgorICB9CisjaWZkZWYgU09BUF9ERUJVRworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWUgbG9nZmlsZXNcbiIpKTsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfTUFYTE9HUzsgaSsrKQorICB7IGlmIChzb2FwLT5sb2dmaWxlW2ldKQorICAgIHsgU09BUF9GUkVFKHNvYXAsICh2b2lkKilzb2FwLT5sb2dmaWxlW2ldKTsKKyAgICAgIHNvYXAtPmxvZ2ZpbGVbaV0gPSBOVUxMOworICAgIH0KKyAgICBzb2FwX2Nsb3NlX2xvZ2ZpbGUoc29hcCwgaSk7CisgIH0KKyAgc29hcF9mcmVlX21odChzb2FwKTsKKyAgc29hcC0+c3RhdGUgPSAwOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9jbGVhbnVwKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwX2RvbmUoc29hcCk7CisjaWZkZWYgV0lOMzIKKyAgaWYgKCF0Y3BfZG9uZSkKKyAgICByZXR1cm47CisgIHRjcF9kb25lID0gMDsKKyAgV1NBQ2xlYW51cCgpOworI2VuZGlmCit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY29uc3QgY2hhcioKK3RjcF9lcnJvcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqbXNnID0gTlVMTDsKKyAgc3dpdGNoIChzb2FwLT5lcnJtb2RlKQorICB7IGNhc2UgMDoKKyAgICAgIG1zZyA9IHNvYXBfc3RyZXJyb3Ioc29hcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICBtc2cgPSAiV1NBU3RhcnR1cCBmYWlsZWQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgIHsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICBtc2cgPSBzb2FwX3N0cl9jb2RlKGhfZXJyb3JfY29kZXMsIHNvYXAtPmVycm51bSk7CisgICAgICBpZiAoIW1zZykKKyNlbmRpZgorICAgICAgeyBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIlRDUC9VRFAgSVAgZXJyb3IgJWQiLCBzb2FwLT5lcnJudW0pOworICAgICAgICBtc2cgPSBzb2FwLT5tc2didWY7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBtc2c7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBjb25zdCBjaGFyKgoraHR0cF9lcnJvcihzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0YXR1cykKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqbXNnID0gU09BUF9TVFJfRU9TOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgbXNnID0gc29hcF9zdHJfY29kZShoX2h0dHBfZXJyb3JfY29kZXMsIHN0YXR1cyk7CisgIGlmICghbXNnKQorICAgIG1zZyA9IFNPQVBfU1RSX0VPUzsKKyNlbmRpZgorICByZXR1cm4gbXNnOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9JUFY2CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3RjcF9nZXRob3N0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICphZGRyLCBzdHJ1Y3QgaW5fYWRkciAqaW5hZGRyKQoreyBzb2FwX2ludDMyIGlhZGQgPSAtMTsKKyAgc3RydWN0IGhvc3RlbnQgaG9zdGVudCwgKmhvc3QgPSAmaG9zdGVudDsKKyNpZmRlZiBWWFdPUktTCisgIGludCBob3N0aW50OworICAvKiBpbmV0X2FkZHIoKSwgYW5kIGhvc3RHZXRCeU5hbWUoKSBleHBlY3QgImNoYXIgKiI7IGFkZHIgaXMgYSAiY29uc3QgY2hhciAqIi4gKi8KKyAgaWFkZCA9IGluZXRfYWRkcigoY2hhciopYWRkcik7CisjZWxzZQorI2lmIGRlZmluZWQoX0FJWFZFUlNJT05fNDMxKSB8fCBkZWZpbmVkKFRSVTY0KQorICBzdHJ1Y3QgaG9zdGVudF9kYXRhIGh0X2RhdGE7CisjZW5kaWYKKyNpZmRlZiBBUzQwMAorICBpYWRkID0gaW5ldF9hZGRyKCh2b2lkKilhZGRyKTsKKyNlbHNlCisgIGlhZGQgPSBpbmV0X2FkZHIoYWRkcik7CisjZW5kaWYKKyNlbmRpZgorICBpZiAoaWFkZCAhPSAtMSkKKyAgeyBtZW1jcHkoaW5hZGRyLCAmaWFkZCwgc2l6ZW9mKGlhZGQpKTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2lmIGRlZmluZWQoX19HTElCQ19fKQorICBpZiAoZ2V0aG9zdGJ5bmFtZV9yKGFkZHIsICZob3N0ZW50LCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOLCAmaG9zdCwgJnNvYXAtPmVycm51bSkgPCAwKQorICAgIGhvc3QgPSBOVUxMOworI2VsaWYgZGVmaW5lZChfQUlYVkVSU0lPTl80MzEpIHx8IGRlZmluZWQoVFJVNjQpCisgIG1lbXNldCgodm9pZCopJmh0X2RhdGEsIDAsIHNpemVvZihodF9kYXRhKSk7CisgIGlmIChnZXRob3N0YnluYW1lX3IoYWRkciwgJmhvc3RlbnQsICZodF9kYXRhKSA8IDApCisgIHsgaG9zdCA9IE5VTEw7CisgICAgc29hcC0+ZXJybnVtID0gaF9lcnJubzsKKyAgfQorI2VsaWYgZGVmaW5lZChIQVZFX0dFVEhPU1RCWU5BTUVfUikKKyAgaG9zdCA9IGdldGhvc3RieW5hbWVfcihhZGRyLCAmaG9zdGVudCwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTiwgJnNvYXAtPmVycm51bSk7CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgIC8qIElmIHRoZSBETlMgcmVzb2x2ZXIgbGlicmFyeSByZXNvbHZMaWIgaGFzIGJlZW4gY29uZmlndXJlZCBpbiB0aGUgdnhXb3JrcworICAgKiBpbWFnZSwgYSBxdWVyeSBmb3IgdGhlIGhvc3QgSVAgYWRkcmVzcyBpcyBzZW50IHRvIHRoZSBETlMgc2VydmVyLCBpZiB0aGUKKyAgICogbmFtZSB3YXMgbm90IGZvdW5kIGluIHRoZSBsb2NhbCBob3N0IHRhYmxlLiAqLworICBob3N0aW50ID0gaG9zdEdldEJ5TmFtZSgoY2hhciopYWRkcik7CisgIGlmIChob3N0aW50ID09IEVSUk9SKQorICB7IGhvc3QgPSBOVUxMOworICAgIHNvYXAtPmVycm51bSA9IHNvYXBfZXJybm87IAorICB9CisjZWxzZQorI2lmZGVmIEFTNDAwCisgIGlmICghKGhvc3QgPSBnZXRob3N0YnluYW1lKCh2b2lkKilhZGRyKSkpCisgICAgc29hcC0+ZXJybnVtID0gaF9lcnJubzsKKyNlbHNlCisgIGlmICghKGhvc3QgPSBnZXRob3N0YnluYW1lKGFkZHIpKSkKKyAgICBzb2FwLT5lcnJudW0gPSBoX2Vycm5vOworI2VuZGlmCisjZW5kaWYKKyAgaWYgKCFob3N0KQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSG9zdCBuYW1lIG5vdCBmb3VuZFxuIikpOworICAgIHJldHVybiBTT0FQX0VSUjsKKyAgfQorI2lmZGVmIFZYV09SS1MKKyAgaW5hZGRyLT5zX2FkZHIgPSBob3N0aW50OworI2Vsc2UKKyAgbWVtY3B5KGluYWRkciwgaG9zdC0+aF9hZGRyLCBob3N0LT5oX2xlbmd0aCk7CisjZW5kaWYKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3RjcF9jb25uZWN0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICplbmRwb2ludCwgY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQpCit7CisjaWZkZWYgV0lUSF9JUFY2CisgIHN0cnVjdCBhZGRyaW5mbyBoaW50cywgKnJlcywgKnJlc3NhdmU7CisgIGludCBlcnI7CisjZW5kaWYKKyAgcmVnaXN0ZXIgaW50IGZkOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaW50IGxlbiA9IFNPQVBfQlVGTEVOOworICBpbnQgc2V0ID0gMTsKKyNlbmRpZgorICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCk7CisgIHNvYXAtPnNvY2tldCA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIGlmICh0Y3BfaW5pdChzb2FwKSkKKyAgeyBzb2FwLT5lcnJudW0gPSAwOworICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJUQ1AgaW5pdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBzb2FwLT5lcnJtb2RlID0gMDsKKyNpZmRlZiBXSVRIX0lQVjYKKyAgbWVtc2V0KCh2b2lkKikmaGludHMsIDAsIHNpemVvZihoaW50cykpOworICBoaW50cy5haV9mYW1pbHkgPSBQRl9VTlNQRUM7CisjaWZkZWYgV0lUSF9VRFAKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfREdSQU07CisgIGVsc2UKKyNlbmRpZgorICAgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisgIHNvYXAtPmVycm1vZGUgPSAyOworICBpZiAoc29hcC0+cHJveHlfaG9zdCkKKyAgICBlcnIgPSBnZXRhZGRyaW5mbyhzb2FwLT5wcm94eV9ob3N0LCBzb2FwX2ludDJzKHNvYXAsIHNvYXAtPnByb3h5X3BvcnQpLCAmaGludHMsICZyZXMpOworICBlbHNlCisgICAgZXJyID0gZ2V0YWRkcmluZm8oaG9zdCwgc29hcF9pbnQycyhzb2FwLCBwb3J0KSwgJmhpbnRzLCAmcmVzKTsKKyAgaWYgKGVycikKKyAgeyBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgZ2FpX3N0cmVycm9yKGVyciksICJnZXRhZGRyaW5mbyBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICByZXNzYXZlID0gcmVzOworYWdhaW46CisgIGZkID0gKGludClzb2NrZXQocmVzLT5haV9mYW1pbHksIHJlcy0+YWlfc29ja3R5cGUsIHJlcy0+YWlfcHJvdG9jb2wpOworICBzb2FwLT5lcnJtb2RlID0gMDsKKyNlbHNlCisjaWZkZWYgV0lUSF9VRFAKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICBmZCA9IChpbnQpc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworICBlbHNlCisjZW5kaWYKKyAgICBmZCA9IChpbnQpc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKyNlbmRpZgorICBpZiAoZmQgPCAwKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzb2NrZXQgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNpZmRlZiBTT0NLRVRfQ0xPU0VfT05fRVhFQworI2lmZGVmIFdJTjMyCisjaWZuZGVmIFVOREVSX0NFCisgIFNldEhhbmRsZUluZm9ybWF0aW9uKChIQU5ETEUpZmQsIEhBTkRMRV9GTEFHX0lOSEVSSVQsIDApOworI2VuZGlmCisjZWxzZQorICBmY250bChmZCwgRl9TRVRGRCwgMSk7CisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPmNvbm5lY3RfZmxhZ3MgJiBTT19MSU5HRVIpCisgIHsgc3RydWN0IGxpbmdlciBsaW5nZXI7CisgICAgbWVtc2V0KCh2b2lkKikmbGluZ2VyLCAwLCBzaXplb2YobGluZ2VyKSk7CisgICAgbGluZ2VyLmxfb25vZmYgPSAxOworICAgIGxpbmdlci5sX2xpbmdlciA9IDA7CisgICAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKWZkLCBTT0xfU09DS0VULCBTT19MSU5HRVIsIChjaGFyKikmbGluZ2VyLCBzaXplb2Yoc3RydWN0IGxpbmdlcikpKQorICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19MSU5HRVIgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgIH0KKyAgfQorICBpZiAoKHNvYXAtPmNvbm5lY3RfZmxhZ3MgJiB+U09fTElOR0VSKSAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClmZCwgU09MX1NPQ0tFVCwgc29hcC0+Y29ubmVjdF9mbGFncyAmIH5TT19MSU5HRVIsIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgaWYgKHNvYXAtPmtlZXBfYWxpdmUgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpZmQsIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19LRUVQQUxJVkUgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKWZkLCBTT0xfU09DS0VULCBTT19TTkRCVUYsIChjaGFyKikmbGVuLCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fU05EQlVGIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIGlmIChzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClmZCwgU09MX1NPQ0tFVCwgU09fUkNWQlVGLCAoY2hhciopJmxlbiwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX1JDVkJVRiBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorI2lmZGVmIFRDUF9OT0RFTEFZCisgIGlmICghKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKWZkLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgVENQX05PREVMQVkgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNlbmRpZgorI2VuZGlmCisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJPcGVuaW5nIHNvY2tldCAlZCB0byBob3N0PSclcycgcG9ydD0lZFxuIiwgZmQsIGhvc3QsIHBvcnQpKTsKKyNpZm5kZWYgV0lUSF9JUFY2CisgIHNvYXAtPnBlZXJsZW4gPSBzaXplb2Yoc29hcC0+cGVlcik7CisgIG1lbXNldCgodm9pZCopJnNvYXAtPnBlZXIsIDAsIHNpemVvZihzb2FwLT5wZWVyKSk7CisgIHNvYXAtPnBlZXIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgIHNvYXAtPmVycm1vZGUgPSAyOworICBpZiAoc29hcC0+cHJveHlfaG9zdCkKKyAgeyBpZiAoc29hcC0+ZnJlc29sdmUoc29hcCwgc29hcC0+cHJveHlfaG9zdCwgJnNvYXAtPnBlZXIuc2luX2FkZHIpKQorICAgIHsgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImdldCBwcm94eSBob3N0IGJ5IG5hbWUgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgIH0KKyAgICBzb2FwLT5wZWVyLnNpbl9wb3J0ID0gaHRvbnMoKHNob3J0KXNvYXAtPnByb3h5X3BvcnQpOworICB9CisgIGVsc2UKKyAgeyBpZiAoc29hcC0+ZnJlc29sdmUoc29hcCwgaG9zdCwgJnNvYXAtPnBlZXIuc2luX2FkZHIpKQorICAgIHsgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImdldCBob3N0IGJ5IG5hbWUgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgIH0KKyAgICBzb2FwLT5wZWVyLnNpbl9wb3J0ID0gaHRvbnMoKHNob3J0KXBvcnQpOworICB9CisgIHNvYXAtPmVycm1vZGUgPSAwOworICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIHJldHVybiBmZDsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPmNvbm5lY3RfdGltZW91dCkKKyNpZiBkZWZpbmVkKFdJTjMyKQorICB7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAmbm9uYmxvY2tpbmcpOworICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgIHsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICBpb2N0bCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sIChpbnQpKCZub25ibG9ja2luZykpOyAvKiBtb2RpZmllZCB0byB1c2UgZmQgKi8KKyAgfQorI2Vsc2UKKyAgICBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9HRVRGTCl8T19OT05CTE9DSyk7CisjZW5kaWYKKyAgZWxzZQorI2lmIGRlZmluZWQoV0lOMzIpCisgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sICZibG9ja2luZyk7CisgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgIGlvY3RsKChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgKGludCkoJmJsb2NraW5nKSk7CisgIH0KKyNlbHNlCisgICAgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfR0VURkwpJn5PX05PTkJMT0NLKTsKKyNlbmRpZgorI2VuZGlmCisgIGZvciAoOzspCisgIHsgCisjaWZkZWYgV0lUSF9JUFY2CisgICAgaWYgKGNvbm5lY3QoKFNPQVBfU09DS0VUKWZkLCByZXMtPmFpX2FkZHIsIHJlcy0+YWlfYWRkcmxlbikpCisjZWxzZQorICAgIGlmIChjb25uZWN0KChTT0FQX1NPQ0tFVClmZCwgKHN0cnVjdCBzb2NrYWRkciopJnNvYXAtPnBlZXIsIHNpemVvZihzb2FwLT5wZWVyKSkpCisjZW5kaWYKKyAgICB7IAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQgJiYgKHNvYXBfc29ja2V0X2Vycm5vID09IFNPQVBfRUlOUFJPR1JFU1MgfHwgc29hcF9zb2NrZXRfZXJybm8gPT0gU09BUF9FV09VTERCTE9DSykpCisgICAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICAgIFNPQVBfU09DS0xFTl9UIGs7CisgICAgICAgIGZkX3NldCBmZHM7CisgICAgICAgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQgPiAwKQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gc29hcC0+Y29ubmVjdF90aW1lb3V0OworICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gLXNvYXAtPmNvbm5lY3RfdGltZW91dC8xMDAwMDAwOworICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IC1zb2FwLT5jb25uZWN0X3RpbWVvdXQlMTAwMDAwMDsKKyAgICAgICAgfQorICAgICAgICBGRF9aRVJPKCZmZHMpOworICAgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKWZkLCAmZmRzKTsKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeyBpbnQgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKGZkICsgMSksIE5VTEwsICZmZHMsIE5VTEwsICZ0aW1lb3V0KTsKKyAgICAgICAgICBpZiAociA+IDApCisJICAgIGJyZWFrOworICAgICAgICAgIGlmICghcikKKyAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IDA7CisgICAgICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvbm5lY3QgdGltZW91dFxuIikpOworICAgICAgICAgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsICJUaW1lb3V0IiwgImNvbm5lY3QgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUikKKyAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgY29ubmVjdCB0byBob3N0XG4iKSk7CisgICAgICAgICAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiY29ubmVjdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgICAgfQorICAgICAgICB9CisJayA9IChTT0FQX1NPQ0tMRU5fVClzaXplb2Yoc29hcC0+ZXJybnVtKTsKKyAgICAgICAgaWYgKCFnZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClmZCwgU09MX1NPQ0tFVCwgU09fRVJST1IsIChjaGFyKikmc29hcC0+ZXJybnVtLCAmaykgJiYgIXNvYXAtPmVycm51bSkJLyogcG9ydGFiaWxpdHkgbm90ZTogc2VlIFNPQVBfU09DS0xFTl9UIGRlZmluaXRpb24gaW4gc3Rkc29hcDIuaCAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBjb25uZWN0IHRvIGhvc3RcbiIpKTsKKyAgICAgICAgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJjb25uZWN0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgICBlbHNlCisjZW5kaWYKKyNpZmRlZiBXSVRIX0lQVjYKKyAgICAgIGlmIChyZXMtPmFpX25leHQpCisgICAgICB7IHJlcyA9IHJlcy0+YWlfbmV4dDsKKyAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIGdvdG8gYWdhaW47CisgICAgICB9CisgICAgICBlbHNlCisjZW5kaWYKKyAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSKQorICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgY29ubmVjdCB0byBob3N0XG4iKSk7CisgICAgICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJjb25uZWN0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgfSAgCisgICAgZWxzZQorICAgICAgYnJlYWs7CisgIH0KKyNpZmRlZiBXSVRIX0lQVjYKKyAgc29hcC0+cGVlcmxlbiA9IDA7IC8qIElQdjY6IGFscmVhZHkgY29ubmVjdGVkIHNvIHVzZSBzZW5kKCkgKi8KKyAgZnJlZWFkZHJpbmZvKHJlc3NhdmUpOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0KQorI2lmIGRlZmluZWQoV0lOMzIpCisgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sICZibG9ja2luZyk7CisgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgIGlvY3RsKChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgKGludCkoJmJsb2NraW5nKSk7CisgIH0KKyNlbHNlCisgICAgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfR0VURkwpJn5PX05PTkJMT0NLKTsKKyNlbmRpZgorI2VuZGlmCisgIHNvYXAtPnNvY2tldCA9IGZkOworICBzb2FwLT5pbW9kZSAmPSB+U09BUF9FTkNfU1NMOworICBzb2FwLT5vbW9kZSAmPSB+U09BUF9FTkNfU1NMOworICBpZiAoIXN0cm5jbXAoZW5kcG9pbnQsICJodHRwczoiLCA2KSkKKyAgeworI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgIEJJTyAqYmlvOworICAgIGludCByOworICAgIGlmIChzb2FwLT5wcm94eV9ob3N0KQorICAgIHsgc2hvcnQgdjsKKyAgICAgIHVuc2lnbmVkIGludCBrID0gc29hcC0+b21vZGU7IC8qIG1ha2Ugc3VyZSB3ZSBvbmx5IHBhcnNlIEhUVFAgKi8KKyAgICAgIHNpemVfdCBuID0gc29hcC0+Y291bnQ7IC8qIHNhdmUgdGhlIGNvbnRlbnQgbGVuZ3RoICovCisgICAgICBjaGFyICp1c2VyaWQsICpwYXNzd2Q7CisgICAgICBzb2FwLT5vbW9kZSAmPSB+U09BUF9FTkM7IC8qIG1hc2sgSU8gYW5kIEVOQyAqLworICAgICAgc29hcC0+b21vZGUgfD0gU09BUF9JT19CVUZGRVI7CisgICAgICBzb2FwX2JlZ2luX3NlbmQoc29hcCk7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvbm5lY3RpbmcgdG8gcHJveHkgc2VydmVyXG4iKSk7CisgICAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIkNPTk5FQ1QgJXM6JWQgSFRUUC8lcyIsIGhvc3QsIHBvcnQsIHNvYXAtPmh0dHBfdmVyc2lvbik7CisgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgc29hcC0+dG1wYnVmLCBOVUxMKSkpCisgICAgICB7IHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICBpZiAoc29hcC0+cHJveHlfdXNlcmlkICYmIHNvYXAtPnByb3h5X3Bhc3N3ZCAmJiBzdHJsZW4oc29hcC0+cHJveHlfdXNlcmlkKSArIHN0cmxlbihzb2FwLT5wcm94eV9wYXNzd2QpIDwgNzYxKQorICAgICAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIDI2MiwgIiVzOiVzIiwgc29hcC0+cHJveHlfdXNlcmlkLCBzb2FwLT5wcm94eV9wYXNzd2QpOworICAgICAgICBzdHJjcHkoc29hcC0+dG1wYnVmLCAiQmFzaWMgIik7CisgICAgICAgIHNvYXBfczJiYXNlNjQoc29hcCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKShzb2FwLT50bXBidWYgKyAyNjIpLCBzb2FwLT50bXBidWYgKyA2LCBzdHJsZW4oc29hcC0+dG1wYnVmICsgMjYyKSk7CisgICAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiUHJveHktQXV0aG9yaXphdGlvbiIsIHNvYXAtPnRtcGJ1ZikpKQorICAgICAgICB7IHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgTlVMTCwgTlVMTCkpCisgICAgICAgfHwgc29hcF9mbHVzaChzb2FwKSkKKyAgICAgIHsgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgICAgc29hcC0+b21vZGUgPSBrOworICAgICAgayA9IHNvYXAtPmltb2RlOworICAgICAgc29hcC0+aW1vZGUgJj0gflNPQVBfRU5DOyAvKiBtYXNrIElPIGFuZCBFTkMgKi8KKyAgICAgIHYgPSBzb2FwLT52ZXJzaW9uOyAvKiBwcmVzZXJ2ZSAqLworICAgICAgdXNlcmlkID0gc29hcC0+dXNlcmlkOyAvKiBwcmVzZXJ2ZSAqLworICAgICAgcGFzc3dkID0gc29hcC0+cGFzc3dkOyAvKiBwcmVzZXJ2ZSAqLworICAgICAgaWYgKHNvYXBfYmVnaW5fcmVjdihzb2FwKSkKKyAgICAgIHsgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgICAgc29hcC0+dXNlcmlkID0gdXNlcmlkOyAvKiByZXN0b3JlICovCisgICAgICBzb2FwLT5wYXNzd2QgPSBwYXNzd2Q7IC8qIHJlc3RvcmUgKi8KKyAgICAgIHNvYXAtPnZlcnNpb24gPSB2OyAvKiByZXN0b3JlICovCisgICAgICBzb2FwLT5pbW9kZSA9IGs7IC8qIHJlc3RvcmUgKi8KKyAgICAgIHNvYXAtPmNvdW50ID0gbjsgLyogcmVzdG9yZSAqLworICAgICAgc29hcF9iZWdpbl9zZW5kKHNvYXApOworICAgIH0KKyAgICBpZiAoIXNvYXAtPmN0eCAmJiAoc29hcC0+ZXJyb3IgPSBzb2FwLT5mc3NsYXV0aChzb2FwKSkpCisgICAgeyBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJTU0wgYXV0aGVudGljYXRpb24gZmFpbGVkIGluIHRjcF9jb25uZWN0KCk6IGNoZWNrIHBhc3N3b3JkLCBrZXkgZmlsZSwgYW5kIGNhIGZpbGUuIiwgU09BUF9TU0xfRVJST1IpOworICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisgICAgc29hcC0+c3NsID0gU1NMX25ldyhzb2FwLT5jdHgpOworICAgIGlmICghc29hcC0+c3NsKQorICAgIHsgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfU1NMX0VSUk9SOworICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorICAgIGlmIChzb2FwLT5zZXNzaW9uKQorICAgIHsgaWYgKCFzdHJjbXAoc29hcC0+c2Vzc2lvbl9ob3N0LCBob3N0KSAmJiBzb2FwLT5zZXNzaW9uX3BvcnQgPT0gcG9ydCkKKyAgICAgICAgU1NMX3NldF9zZXNzaW9uKHNvYXAtPnNzbCwgc29hcC0+c2Vzc2lvbik7CisgICAgICBTU0xfU0VTU0lPTl9mcmVlKHNvYXAtPnNlc3Npb24pOworICAgICAgc29hcC0+c2Vzc2lvbiA9IE5VTEw7CisgICAgfQorICAgIHNvYXAtPmltb2RlIHw9IFNPQVBfRU5DX1NTTDsKKyAgICBzb2FwLT5vbW9kZSB8PSBTT0FQX0VOQ19TU0w7CisgICAgYmlvID0gQklPX25ld19zb2NrZXQoKFNPQVBfU09DS0VUKWZkLCBCSU9fTk9DTE9TRSk7CisgICAgU1NMX3NldF9iaW8oc29hcC0+c3NsLCBiaW8sIGJpbyk7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQpCisjaWYgZGVmaW5lZChXSU4zMikKKyAgICB7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sICZub25ibG9ja2luZyk7CisgICAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICAgIHsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICAgIGlvY3RsKChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgKGludCkoJm5vbmJsb2NraW5nKSk7CisgICAgfQorI2Vsc2UKKyAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX0dFVEZMKXxPX05PTkJMT0NLKTsKKyNlbmRpZgorI2VuZGlmCisgICAgZm9yICg7OykKKyAgICB7IGlmICgociA9IFNTTF9jb25uZWN0KHNvYXAtPnNzbCkpIDw9IDApCisgICAgICB7IGludCBlcnIgPSBTU0xfZ2V0X2Vycm9yKHNvYXAtPnNzbCwgcik7CisgICAgICAgIGlmIChlcnIgIT0gU1NMX0VSUk9SX05PTkUgJiYgZXJyICE9IFNTTF9FUlJPUl9XQU5UX1JFQUQgJiYgZXJyICE9IFNTTF9FUlJPUl9XQU5UX1dSSVRFKQorICAgICAgICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCBzc2xfZXJyb3Ioc29hcCwgciksICJTU0wgY29ubmVjdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0KQorICAgICAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICAgICAgZmRfc2V0IGZkczsKKyAgICAgICAgICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0ID4gMCkKKyAgICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gc29hcC0+Y29ubmVjdF90aW1lb3V0OworICAgICAgICAgICAgdGltZW91dC50dl91c2VjID0gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSAtc29hcC0+Y29ubmVjdF90aW1lb3V0LzEwMDAwMDA7CisgICAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAtc29hcC0+Y29ubmVjdF90aW1lb3V0JTEwMDAwMDA7CisgICAgICAgICAgfQorICAgICAgICAgIEZEX1pFUk8oJmZkcyk7CisgICAgICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClmZCwgJmZkcyk7CisgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICB7IGludCByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoZmQgKyAxKSwgJmZkcywgTlVMTCwgJmZkcywgJnRpbWVvdXQpOworICAgICAgICAgICAgaWYgKHIgPiAwKQorCSAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKCFyKQorICAgICAgICAgICAgeyBzb2FwLT5lcnJudW0gPSAwOworICAgICAgICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvbm5lY3QgdGltZW91dFxuIikpOworICAgICAgICAgICAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgIlRpbWVvdXQiLCAiY29ubmVjdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgICAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKwkgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQpCisjaWZkZWYgV0lOMzIKKyAgICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sICZibG9ja2luZyk7CisgICAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICAgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICAgIGlvY3RsKChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgKGludCkoJmJsb2NraW5nKSk7CisgICAgfQorI2Vsc2UKKyAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX0dFVEZMKSZ+T19OT05CTE9DSyk7CisjZW5kaWYKKyNlbmRpZgorICAgIGlmIChzb2FwLT5yZXF1aXJlX3NlcnZlcl9hdXRoKQorICAgIHsgWDUwOSAqcGVlcjsKKyAgICAgIGludCBlcnI7CisgICAgICBpZiAoKGVyciA9IFNTTF9nZXRfdmVyaWZ5X3Jlc3VsdChzb2FwLT5zc2wpKSAhPSBYNTA5X1ZfT0spCisgICAgICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCBYNTA5X3ZlcmlmeV9jZXJ0X2Vycm9yX3N0cmluZyhlcnIpLCAiU1NMIGNlcnRpZmljYXRlIHByZXNlbnRlZCBieSBwZWVyIGNhbm5vdCBiZSB2ZXJpZmllZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9TU0xfRVJST1IpOworICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgICBwZWVyID0gU1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKHNvYXAtPnNzbCk7CisgICAgICBpZiAoIXBlZXIpCisgICAgICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIk5vIFNTTCBjZXJ0aWZpY2F0ZSB3YXMgcHJlc2VudGVkIGJ5IHRoZSBwZWVyIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyAgICAgIFg1MDlfTkFNRV9nZXRfdGV4dF9ieV9OSUQoWDUwOV9nZXRfc3ViamVjdF9uYW1lKHBlZXIpLCBOSURfY29tbW9uTmFtZSwgc29hcC0+bXNnYnVmLCBzaXplb2Yoc29hcC0+bXNnYnVmKSk7CisgICAgICBYNTA5X2ZyZWUocGVlcik7CisgICAgICBpZiAoc29hcF90YWdfY21wKHNvYXAtPm1zZ2J1ZiwgaG9zdCkpCisgICAgICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIlNTTCBjZXJ0aWZpY2F0ZSBob3N0IG5hbWUgbWlzbWF0Y2ggaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1NTTF9FUlJPUjsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyNlbmRpZgorICB9CisgIHJldHVybiBmZDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9iaW5kKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpob3N0LCBpbnQgcG9ydCwgaW50IGJhY2tsb2cpCit7CisjaWZkZWYgV0lUSF9JUFY2CisgIHN0cnVjdCBhZGRyaW5mbyAqYWRkcmluZm8gPSBOVUxMOworICBzdHJ1Y3QgYWRkcmluZm8gaGludHM7CisgIHN0cnVjdCBhZGRyaW5mbyByZXM7CisgIGludCBlcnI7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGludCBsZW4gPSBTT0FQX0JVRkxFTjsKKyAgaW50IHNldCA9IDE7CisjZW5kaWYKKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikpCisgIHsgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIpOworICAgIHNvYXAtPm1hc3RlciA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgc29hcC0+c29ja2V0ID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgc29hcC0+ZXJybW9kZSA9IDE7CisgIGlmICh0Y3BfaW5pdChzb2FwKSkKKyAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJUQ1AgaW5pdCBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNpZmRlZiBXSVRIX0lQVjYKKyAgbWVtc2V0KCh2b2lkKikmaGludHMsIDAsIHNpemVvZihoaW50cykpOworICBoaW50cy5haV9mYW1pbHkgPSBQRl9VTlNQRUM7CisjaWZkZWYgV0lUSF9VRFAKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfREdSQU07CisgIGVsc2UKKyNlbmRpZgorICAgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisgIGhpbnRzLmFpX2ZsYWdzID0gQUlfUEFTU0lWRTsKKyAgc29hcC0+ZXJybW9kZSA9IDI7CisgIGVyciA9IGdldGFkZHJpbmZvKGhvc3QsIHNvYXBfaW50MnMoc29hcCwgcG9ydCksICZoaW50cywgJmFkZHJpbmZvKTsKKyAgaWYgKGFkZHJpbmZvKQorICB7IHJlcyA9ICphZGRyaW5mbzsKKyAgICBzb2FwLT5wZWVyID0gKigoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UqKWFkZHJpbmZvLT5haV9hZGRyKTsKKyAgICBzb2FwLT5wZWVybGVuID0gYWRkcmluZm8tPmFpX2FkZHJsZW47CisgICAgcmVzLmFpX2FkZHIgPSAoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlcjsKKyAgICByZXMuYWlfYWRkcmxlbiA9IHNvYXAtPnBlZXJsZW47CisgICAgZnJlZWFkZHJpbmZvKGFkZHJpbmZvKTsKKyAgfQorICBpZiAoZXJyKQorICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIGdhaV9zdHJlcnJvcihlcnIpLCAiZ2V0YWRkcmluZm8gZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIHNvYXAtPm1hc3RlciA9IHNvY2tldChyZXMuYWlfZmFtaWx5LCByZXMuYWlfc29ja3R5cGUsIHJlcy5haV9wcm90b2NvbCk7CisjZWxzZQorI2lmZGVmIFdJVEhfVURQCisgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgc29hcC0+bWFzdGVyID0gKGludClzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisgIGVsc2UKKyNlbmRpZgorICAgIHNvYXAtPm1hc3RlciA9IChpbnQpc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKyNlbmRpZgorICBzb2FwLT5lcnJtb2RlID0gMDsKKyAgaWYgKCFzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNvY2tldCBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNpZmRlZiBXSVRIX1VEUAorICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIHNvYXAtPnNvY2tldCA9IHNvYXAtPm1hc3RlcjsKKyNlbmRpZgorI2lmZGVmIFNPQ0tFVF9DTE9TRV9PTl9FWEVDCisjaWZkZWYgV0lOMzIKKyNpZm5kZWYgVU5ERVJfQ0UKKyAgU2V0SGFuZGxlSW5mb3JtYXRpb24oKEhBTkRMRSlzb2FwLT5tYXN0ZXIsIEhBTkRMRV9GTEFHX0lOSEVSSVQsIDApOworI2VuZGlmCisjZWxzZQorICBmY250bChzb2FwLT5tYXN0ZXIsIEZfU0VURkQsIDEpOworI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5iaW5kX2ZsYWdzICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgU09MX1NPQ0tFVCwgc29hcC0+YmluZF9mbGFncywgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBpZiAoKChzb2FwLT5pbW9kZSB8IHNvYXAtPm9tb2RlKSAmIFNPQVBfSU9fS0VFUEFMSVZFKSAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX0tFRVBBTElWRSBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgU09MX1NPQ0tFVCwgU09fU05EQlVGLCAoY2hhciopJmxlbiwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fU05EQlVGIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsIChjaGFyKikmbGVuLCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19SQ1ZCVUYgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisjaWZkZWYgVENQX05PREVMQVkKKyAgaWYgKCEoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBUQ1BfTk9ERUxBWSBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgV0lUSF9JUFY2CisgIHNvYXAtPmVycm1vZGUgPSAwOworICBpZiAoYmluZCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCByZXMuYWlfYWRkciwgcmVzLmFpX2FkZHJsZW4pKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IGJpbmQgdG8gaG9zdFxuIikpOworICAgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImJpbmQgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9ICAKKyNlbHNlCisgIHNvYXAtPnBlZXJsZW4gPSBzaXplb2Yoc29hcC0+cGVlcik7CisgIG1lbXNldCgodm9pZCopJnNvYXAtPnBlZXIsIDAsIHNpemVvZihzb2FwLT5wZWVyKSk7CisgIHNvYXAtPnBlZXIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgIHNvYXAtPmVycm1vZGUgPSAyOworICBpZiAoaG9zdCkKKyAgeyBpZiAoc29hcC0+ZnJlc29sdmUoc29hcCwgaG9zdCwgJnNvYXAtPnBlZXIuc2luX2FkZHIpKQorICAgIHsgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiZ2V0IGhvc3QgYnkgbmFtZSBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIHNvYXAtPnBlZXIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7CisgIHNvYXAtPnBlZXIuc2luX3BvcnQgPSBodG9ucygoc2hvcnQpcG9ydCk7CisgIHNvYXAtPmVycm1vZGUgPSAwOworICBpZiAoYmluZCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCAoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlciwgc29hcC0+cGVlcmxlbikpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgYmluZCB0byBob3N0XG4iKSk7CisgICAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiYmluZCBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNlbmRpZgorICBpZiAoIShzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSAmJiBsaXN0ZW4oKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgYmFja2xvZykpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgYmluZCB0byBob3N0XG4iKSk7CisgICAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAibGlzdGVuIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfSAgCisgIHJldHVybiBzb2FwLT5tYXN0ZXI7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcG9sbChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgCisjaWZuZGVmIFdJVEhfTEVBTgorICBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICBmZF9zZXQgcmZkLCBzZmQsIHhmZDsKKyAgaW50IHI7CisgIHRpbWVvdXQudHZfc2VjID0gMDsKKyAgdGltZW91dC50dl91c2VjID0gMDsKKyAgRkRfWkVSTygmcmZkKTsKKyAgRkRfWkVSTygmc2ZkKTsKKyAgRkRfWkVSTygmeGZkKTsKKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgIHsgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZyZmQpOworICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmc2ZkKTsKKyAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnhmZCk7CisgICAgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCAmcmZkLCAmc2ZkLCAmeGZkLCAmdGltZW91dCk7CisgICAgaWYgKHIgPiAwICYmIEZEX0lTU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZ4ZmQpKQorICAgICAgciA9IC0xOworICB9CisgIGVsc2UgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikpCisgIHsgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsICZzZmQpOworICAgIHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5tYXN0ZXIgKyAxKSwgTlVMTCwgJnNmZCwgTlVMTCwgJnRpbWVvdXQpOworICB9CisgIGVsc2UKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgaWYgKHIgPiAwKQorICB7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgICAgaWYgKHNvYXAtPmltb2RlICYgU09BUF9FTkNfU1NMKQorICAgIHsKKyAgICAgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpCisgICAgICAgJiYgRkRfSVNTRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnNmZCkKKyAgICAgICAmJiAoIUZEX0lTU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZyZmQpCisgICAgICAgIHx8IFNTTF9wZWVrKHNvYXAtPnNzbCwgc29hcC0+dG1wYnVmLCAxKSA+IDApKQorICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KQorICAgICAgICYmIEZEX0lTU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZzZmQpCisgICAgICAgJiYgKCFGRF9JU1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmcmZkKQorICAgICAgICB8fCByZWN2KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHNvYXAtPnRtcGJ1ZiwgMSwgTVNHX1BFRUspID4gMCkpCisgICAgICAgIHJldHVybiBTT0FQX09LOworICB9CisgIGVsc2UgaWYgKHIgPCAwKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIGlmICgoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSB8fCBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKSAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSKQorICAgIHsgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2VsZWN0IGZhaWxlZCBpbiBzb2FwX3BvbGwoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfVENQX0VSUk9SOworICAgIH0KKyAgfQorICBlbHNlCisgICAgc29hcC0+ZXJybnVtID0gMDsKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlBvbGxpbmc6IG90aGVyIGVuZCBkb3duIG9uIHNvY2tldD0lZCBzZWxlY3Q9JWRcbiIsIHNvYXAtPnNvY2tldCwgcikpOworICByZXR1cm4gU09BUF9FT0Y7CisjZWxzZQorICByZXR1cm4gU09BUF9PSzsKKyNlbmRpZgorfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAordGNwX2FjY2VwdChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHMsIHN0cnVjdCBzb2NrYWRkciAqYSwgaW50ICpuKQoreyBpbnQgZmQ7CisgIGZkID0gKGludClhY2NlcHQoKFNPQVBfU09DS0VUKXMsIGEsIChTT0FQX1NPQ0tMRU5fVCopbik7CS8qIHBvcnRhYmlsaXR5IG5vdGU6IHNlZSBTT0FQX1NPQ0tMRU5fVCBkZWZpbml0aW9uIGluIHN0ZHNvYXAyLmggKi8KKyNpZmRlZiBTT0NLRVRfQ0xPU0VfT05fRVhFQworI2lmZGVmIFdJTjMyCisjaWZuZGVmIFVOREVSX0NFCisgIFNldEhhbmRsZUluZm9ybWF0aW9uKChIQU5ETEUpZmQsIEhBTkRMRV9GTEFHX0lOSEVSSVQsIDApOworI2VuZGlmCisjZWxzZQorICBmY250bChmZCwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7CisjZW5kaWYKKyNlbmRpZgorICByZXR1cm4gZmQ7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYWNjZXB0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBpbnQgbiA9IChpbnQpc2l6ZW9mKHNvYXAtPnBlZXIpOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaW50IGxlbiA9IFNPQVBfQlVGTEVOOworICBpbnQgc2V0ID0gMTsKKyNlbmRpZgorICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisjaWZkZWYgV0lUSF9VRFAKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICByZXR1cm4gc29hcC0+c29ja2V0ID0gc29hcC0+bWFzdGVyOworI2VuZGlmCisgIG1lbXNldCgodm9pZCopJnNvYXAtPnBlZXIsIDAsIHNpemVvZihzb2FwLT5wZWVyKSk7CisgIHNvYXAtPnNvY2tldCA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIHNvYXAtPmVycm1vZGUgPSAwOworICBzb2FwLT5rZWVwX2FsaXZlID0gMDsKKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikpCisgIHsgZm9yICg7OykKKyAgICB7IAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIGlmIChzb2FwLT5hY2NlcHRfdGltZW91dCkKKyAgICAgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgICAgZmRfc2V0IGZkOworICAgICAgICBpZiAoc29hcC0+YWNjZXB0X3RpbWVvdXQgPiAwKQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gc29hcC0+YWNjZXB0X3RpbWVvdXQ7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSAtc29hcC0+YWNjZXB0X3RpbWVvdXQvMTAwMDAwMDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAtc29hcC0+YWNjZXB0X3RpbWVvdXQlMTAwMDAwMDsKKyAgICAgICAgfQorICAgICAgICBGRF9aRVJPKCZmZCk7CisgICAgICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCAmZmQpOworICAgICAgICBmb3IgKDs7KQorICAgICAgICB7IGludCByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+bWFzdGVyICsgMSksICZmZCwgJmZkLCBOVUxMLCAmdGltZW91dCk7CisgICAgICAgICAgaWYgKHIgPiAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgaWYgKCFyKQorICAgICAgICAgIHsgc29hcC0+ZXJybnVtID0gMDsKKyAgICAgICAgICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJUaW1lb3V0IiwgImFjY2VwdCBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUikKKyAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgICAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgICAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiYWNjZXB0IGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgICAgfQorICAgICAgICB9CisjaWYgZGVmaW5lZChXSU4zMikKKwl7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgICAgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRklPTkJJTywgJm5vbmJsb2NraW5nKTsKKyAgICAgICAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICAgICAgICB7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgICAgICAgaW9jdGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRklPTkJJTywgKGludCkoJm5vbmJsb2NraW5nKSk7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfR0VURkwpfE9fTk9OQkxPQ0spOworI2VuZGlmCisgICAgICB9CisgICAgICBlbHNlCisjaWYgZGVmaW5lZChXSU4zMikKKyAgICAgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICAgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRklPTkJJTywgJmJsb2NraW5nKTsKKyAgICAgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgICAgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICAgICAgaW9jdGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRklPTkJJTywgKGludCkoJmJsb2NraW5nKSk7CisgICAgICB9CisjZWxzZQorICAgICAgICBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGX0dFVEZMKSZ+T19OT05CTE9DSyk7CisjZW5kaWYKKyNlbmRpZgorICAgICAgc29hcC0+c29ja2V0ID0gc29hcC0+ZmFjY2VwdChzb2FwLCBzb2FwLT5tYXN0ZXIsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyLCAmbik7CisgICAgICBzb2FwLT5wZWVybGVuID0gKHNpemVfdCluOworICAgICAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgICAgICB7CisjaWZkZWYgV0lUSF9JUFY2CisvKiBVc2Ugc29hcC0+aG9zdCB0byBzdG9yZSB0aGUgbnVtZXJpYyBmb3JtIG9mIHRoZSByZW1vdGUgaG9zdCAqLworICAgICAgICBnZXRuYW1laW5mbygoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlciwgbiwgc29hcC0+aG9zdCwgc2l6ZW9mKHNvYXAtPmhvc3QpLCBOVUxMLCAwLCBOSV9OVU1FUklDSE9TVCB8IE5JX05VTUVSSUNTRVJWKTsgCisgICAgICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJBY2NlcHQgc29ja2V0ICVkIGZyb20gJXNcbiIsIHNvYXAtPnNvY2tldCwgc29hcC0+aG9zdCkpOworICAgICAgICBzb2FwLT5pcCA9IDA7IC8qIGluZm8gc3RvcmVkIGluIHNvYXAtPnBlZXIgYW5kIHNvYXAtPmhvc3QgKi8KKyAgICAgICAgc29hcC0+cG9ydCA9IDA7IC8qIGluZm8gc3RvcmVkIGluIHNvYXAtPnBlZXIgYW5kIHNvYXAtPmhvc3QgKi8KKyNlbHNlCisgICAgICAgIHNvYXAtPmlwID0gbnRvaGwoc29hcC0+cGVlci5zaW5fYWRkci5zX2FkZHIpOworICAgICAgICBzb2FwLT5wb3J0ID0gKGludCludG9ocyhzb2FwLT5wZWVyLnNpbl9wb3J0KTsgLyogZG9lcyBub3QgcmV0dXJuIHBvcnQgbnVtYmVyIG9uIHNvbWUgc3lzdGVtcyAqLworICAgICAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiQWNjZXB0IHNvY2tldCAlZCBhdCBwb3J0ICVkIGZyb20gSVAgJWQuJWQuJWQuJWRcbiIsIHNvYXAtPnNvY2tldCwgc29hcC0+cG9ydCwgKGludCkoc29hcC0+aXA+PjI0KSYweEZGLCAoaW50KShzb2FwLT5pcD4+MTYpJjB4RkYsIChpbnQpKHNvYXAtPmlwPj44KSYweEZGLCAoaW50KXNvYXAtPmlwJjB4RkYpKTsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKwlpZiAoc29hcC0+YWNjZXB0X2ZsYWdzICYgU09fTElOR0VSKQorICAgICAgICB7IHN0cnVjdCBsaW5nZXIgbGluZ2VyOworICAgICAgICAgIG1lbXNldCgodm9pZCopJmxpbmdlciwgMCwgc2l6ZW9mKGxpbmdlcikpOworICAgICAgICAgIGxpbmdlci5sX29ub2ZmID0gMTsKKyAgICAgICAgICBsaW5nZXIubF9saW5nZXIgPSAwOworCSAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgU09MX1NPQ0tFVCwgU09fTElOR0VSLCAoY2hhciopJmxpbmdlciwgc2l6ZW9mKHN0cnVjdCBsaW5nZXIpKSkKKyAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworCSAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX0xJTkdFUiBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKwkgICAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKwkgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKHNvYXAtPmFjY2VwdF9mbGFncyAmIH5TT19MSU5HRVIpICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgU09MX1NPQ0tFVCwgc29hcC0+YWNjZXB0X2ZsYWdzICYgflNPX0xJTkdFUiwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworCSAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCgoc29hcC0+aW1vZGUgfCBzb2FwLT5vbW9kZSkgJiBTT0FQX0lPX0tFRVBBTElWRSkgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBTT0xfU09DS0VULCBTT19LRUVQQUxJVkUsIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19LRUVQQUxJVkUgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisJICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBTT0xfU09DS0VULCBTT19TTkRCVUYsIChjaGFyKikmbGVuLCBzaXplb2YoaW50KSkpCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19TTkRCVUYgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisJICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsIChjaGFyKikmbGVuLCBzaXplb2YoaW50KSkpCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19SQ1ZCVUYgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisJICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgfQorI2lmZGVmIFRDUF9OT0RFTEFZCisgICAgICAgIGlmICghKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgVENQX05PREVMQVkgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisJICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgfQorI2VuZGlmCisjZW5kaWYKKyAgICAgICAgaWYgKHNvYXAtPmFjY2VwdF90aW1lb3V0KQorICAgICAgICB7CisjaWYgZGVmaW5lZChXSU4zMikKKyAgICAgICAgICB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgICAgICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZJT05CSU8sICZibG9ja2luZyk7CisgICAgICAgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRklPTkJJTywgJmJsb2NraW5nKTsKKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgICAgICAgICB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgICAgICAgIGlvY3RsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZJT05CSU8sIChpbnQpKCZibG9ja2luZykpOworICAgICAgICAgIGlvY3RsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZJT05CSU8sIChpbnQpKCZibG9ja2luZykpOworI2VsaWYgZGVmaW5lZChQQUxNKQorICAgICAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfR0VURkwsMCkmfk9fTk9OQkxPQ0spOworICAgICAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfR0VURkwsMCkmfk9fTk9OQkxPQ0spOworI2VsaWYgZGVmaW5lZChTWU1CSUFOKQorICAgICAgICAgIGxvbmcgYmxvY2tpbmcgPSAwOworICAgICAgICAgIGlvY3RsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIDAvKkZJT05CSU8qLywgJmJsb2NraW5nKTsKKyNlbHNlCisgICAgICAgICAgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRl9HRVRGTCkmfk9fTk9OQkxPQ0spOworICAgICAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfR0VURkwpJn5PX05PTkJMT0NLKTsKKyNlbmRpZgorCX0KKyAgICAgICAgc29hcC0+a2VlcF9hbGl2ZSA9ICgoKHNvYXAtPmltb2RlIHwgc29hcC0+b21vZGUpICYgU09BUF9JT19LRUVQQUxJVkUpICE9IDApOworICAgICAgICByZXR1cm4gc29hcC0+c29ja2V0OworICAgICAgfQorICAgICAgaWYgKHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FQUdBSU4pCisgICAgICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJBY2NlcHQgZmFpbGVkIGZyb20gJXNcbiIsIHNvYXAtPmhvc3QpKTsKKyAgICAgICAgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImFjY2VwdCBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKwlzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyAgeyBzb2FwLT5lcnJudW0gPSAwOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgIm5vIG1hc3RlciBzb2NrZXQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAordGNwX2Rpc2Nvbm5lY3Qoc3RydWN0IHNvYXAgKnNvYXApCit7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgIGlmIChzb2FwLT5zc2wpCisgIHsgaW50IHIsIHMgPSAwOworICAgIGlmIChzb2FwLT5zZXNzaW9uKQorICAgICAgU1NMX1NFU1NJT05fZnJlZShzb2FwLT5zZXNzaW9uKTsKKyAgICBpZiAoKnNvYXAtPmhvc3QpCisgICAgeyBzb2FwLT5zZXNzaW9uID0gU1NMX2dldDFfc2Vzc2lvbihzb2FwLT5zc2wpOworICAgICAgaWYgKHNvYXAtPnNlc3Npb24pCisgICAgICB7IHN0cmNweShzb2FwLT5zZXNzaW9uX2hvc3QsIHNvYXAtPmhvc3QpOworICAgICAgICBzb2FwLT5zZXNzaW9uX3BvcnQgPSBzb2FwLT5wb3J0OworICAgICAgfQorICAgIH0KKyAgICByID0gU1NMX3NodXRkb3duKHNvYXAtPnNzbCk7CisgICAgaWYgKHIgIT0gMSkKKyAgICB7IHMgPSBFUlJfZ2V0X2Vycm9yKCk7CisgICAgICBpZiAocykKKyAgICAgIHsgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgICAgICAgIHsgc29hcC0+ZnNodXRkb3duc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIDEpOworICAgICAgICAgIHNvYXAtPnNvY2tldCA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgIH0KKyAgICAgICAgciA9IFNTTF9zaHV0ZG93bihzb2FwLT5zc2wpOworICAgICAgfQorICAgIH0KKyAgICBEQkdMT0coVEVTVCwgaWYgKHMpIFNPQVBfTUVTU0FHRShmZGVidWcsICJTaHV0ZG93biBmYWlsZWQ6ICVkXG4iLCBTU0xfZ2V0X2Vycm9yKHNvYXAtPnNzbCwgcikpKTsKKyAgICBTU0xfZnJlZShzb2FwLT5zc2wpOworICAgIHNvYXAtPnNzbCA9IE5VTEw7CisgICAgaWYgKHMpCisgICAgICByZXR1cm4gU09BUF9TU0xfRVJST1I7CisgICAgRVJSX3JlbW92ZV9zdGF0ZSgwKTsKKyAgfQorI2VuZGlmCisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpICYmICEoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgIHsgc29hcC0+ZnNodXRkb3duc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIDIpOworICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0KTsKKyAgICBzb2FwLT5zb2NrZXQgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAordGNwX2Nsb3Nlc29ja2V0KHN0cnVjdCBzb2FwICpzb2FwLCBTT0FQX1NPQ0tFVCBmZCkKK3sgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDbG9zZSBzb2NrZXQgJWRcbiIsIChpbnQpZmQpKTsKKyAgcmV0dXJuIGNsb3Nlc29ja2V0KGZkKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3RjcF9zaHV0ZG93bnNvY2tldChzdHJ1Y3Qgc29hcCAqc29hcCwgU09BUF9TT0NLRVQgZmQsIGludCBob3cpCit7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2h1dGRvd24gc29ja2V0ICVkIGhvdz0lZFxuIiwgKGludClmZCwgaG93KSk7CisgIHJldHVybiBzaHV0ZG93bihmZCwgaG93KTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2Nsb3Nlc29jayhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IHN0YXR1cyA9IHNvYXAtPmVycm9yOworICBpZiAoc3RhdHVzID09IFNPQVBfRU9GIHx8IHN0YXR1cyA9PSBTT0FQX1RDUF9FUlJPUiB8fCBzdGF0dXMgPT0gU09BUF9TU0xfRVJST1IgfHwgIXNvYXAtPmtlZXBfYWxpdmUpCisgIHsgaWYgKHNvYXAtPmZjbG9zZSAmJiAoc29hcC0+ZXJyb3IgPSBzb2FwLT5mY2xvc2Uoc29hcCkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOworICB9CisjaWZkZWYgV0lUSF9aTElCCisgIGlmIChzb2FwLT56bGliX3N0YXRlID09IFNPQVBfWkxJQl9ERUZMQVRFKQorICAgIGRlZmxhdGVFbmQoJnNvYXAtPmRfc3RyZWFtKTsKKyAgZWxzZSBpZiAoc29hcC0+emxpYl9zdGF0ZSA9PSBTT0FQX1pMSUJfSU5GTEFURSkKKyAgICBpbmZsYXRlRW5kKCZzb2FwLT5kX3N0cmVhbSk7CisgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfTk9ORTsKKyNlbmRpZgorICByZXR1cm4gc29hcC0+ZXJyb3IgPSBzdGF0dXM7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorc2l6ZV90CitTT0FQX0ZNQUMyCitzb2FwX2hhc2gocmVnaXN0ZXIgY29uc3QgY2hhciAqcykKK3sgcmVnaXN0ZXIgc2l6ZV90IGggPSAwOworICB3aGlsZSAoKnMpCisgICAgaCA9IDY1NTk5KmggKyAqcysrOworICByZXR1cm4gaCAlIFNPQVBfSURIQVNIOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQKK3NvYXBfaW5pdF9waHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBpOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluaXRpYWxpemluZyBwb2ludGVyIGhhc2h0YWJsZVxuIikpOworICBzb2FwLT5wYmxrID0gTlVMTDsKKyAgc29hcC0+cGlkeCA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCAoaW50KVNPQVBfUFRSSEFTSDsgaSsrKQorICAgIHNvYXAtPnBodFtpXSA9IE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwKgorU09BUF9GTUFDMgorc29hcF9uZXcxKHNvYXBfbW9kZSBtb2RlKQoreyByZXR1cm4gc29hcF9uZXcyKG1vZGUsIG1vZGUpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc3RydWN0IHNvYXAqCitTT0FQX0ZNQUMyCitzb2FwX25ldygpCit7IHJldHVybiBzb2FwX25ldzIoU09BUF9JT19ERUZBVUxULCBTT0FQX0lPX0RFRkFVTFQpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc3RydWN0IHNvYXAqCitTT0FQX0ZNQUMyCitzb2FwX25ldzIoc29hcF9tb2RlIGltb2RlLCBzb2FwX21vZGUgb21vZGUpCit7IHN0cnVjdCBzb2FwICpzb2FwID0gKHN0cnVjdCBzb2FwKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2FwKSk7CisgIGlmIChzb2FwKQorICAgIHNvYXBfaW5pdDIoc29hcCwgaW1vZGUsIG9tb2RlKTsKKyAgcmV0dXJuIHNvYXA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2RlbChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgZnJlZShzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZAorc29hcF9mcmVlX3BodChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGJsayAqcGIsICpuZXh0OworICByZWdpc3RlciBpbnQgaTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIHBvaW50ZXIgaGFzaHRhYmxlXG4iKSk7CisgIGZvciAocGIgPSBzb2FwLT5wYmxrOyBwYjsgcGIgPSBuZXh0KQorICB7IG5leHQgPSBwYi0+bmV4dDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgcGIpOworICB9CisgIHNvYXAtPnBibGsgPSBOVUxMOworICBzb2FwLT5waWR4ID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IChpbnQpU09BUF9QVFJIQVNIOyBpKyspCisgICAgc29hcC0+cGh0W2ldID0gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbWJlZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCwgY29uc3Qgc3RydWN0IHNvYXBfYXJyYXkgKmEsIGludCBuLCBjb25zdCBjaGFyICp0YWcsIGludCB0eXBlKQoreyByZWdpc3RlciBpbnQgaTsKKyAgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICBpZiAoc29hcC0+dmVyc2lvbiAhPSAxKQorICAgIHNvYXAtPmVuY29kaW5nID0gMTsKKyAgaWYgKGEpCisgICAgaSA9IHNvYXBfYXJyYXlfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgYSwgbiwgdHlwZSwgJnBwKTsKKyAgZWxzZQorICAgIGkgPSBzb2FwX3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIHR5cGUsICZwcCk7CisgIGlmIChpKQorICB7IGlmIChzb2FwX2lzX2VtYmVkZGVkKHNvYXAsIHBwKQorICAgICB8fCBzb2FwX2lzX3NpbmdsZShzb2FwLCBwcCkpCisgICAgICByZXR1cm4gMDsKKyAgICBzb2FwX3NldF9lbWJlZGRlZChzb2FwLCBwcCk7CisgIH0KKyAgcmV0dXJuIGk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcG9pbnRlcl9sb29rdXAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnAsIGludCB0eXBlLCBzdHJ1Y3Qgc29hcF9wbGlzdCAqKnBwcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICAqcHBwID0gTlVMTDsKKyAgaWYgKHApCisgIHsgZm9yIChwcCA9IHNvYXAtPnBodFtzb2FwX2hhc2hfcHRyKHApXTsgcHA7IHBwID0gcHAtPm5leHQpCisgICAgeyBpZiAocHAtPnB0ciA9PSBwICYmIHBwLT50eXBlID09IHR5cGUpCisgICAgICB7ICpwcHAgPSBwcDsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJMb29rdXAgbG9jYXRpb249JXAgdHlwZT0lZCBpZD0lZFxuIiwgcCwgdHlwZSwgcHAtPmlkKSk7CisgICAgICAgIHJldHVybiBwcC0+aWQ7CisgICAgICB9CisgICAgfQorICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTG9va3VwIGxvY2F0aW9uPSVwIHR5cGU9JWQ6IG5vdCBmb3VuZFxuIiwgcCwgdHlwZSkpOworICByZXR1cm4gMDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wb2ludGVyX2VudGVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGludCB0eXBlLCBzdHJ1Y3Qgc29hcF9wbGlzdCAqKnBwcCkKK3sgcmVnaXN0ZXIgaW50IGg7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgaWYgKCFzb2FwLT5wYmxrIHx8IHNvYXAtPnBpZHggPj0gU09BUF9QVFJCTEspCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGJsayAqcGIgPSAoc3RydWN0IHNvYXBfcGJsayopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX3BibGspKTsKKyAgICBpZiAoIXBiKQorICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBwYi0+bmV4dCA9IHNvYXAtPnBibGs7CisgICAgc29hcC0+cGJsayA9IHBiOworICAgIHNvYXAtPnBpZHggPSAwOworICB9CisgICpwcHAgPSBwcCA9ICZzb2FwLT5wYmxrLT5wbGlzdFtzb2FwLT5waWR4KytdOworICBpZiAoYSkKKyAgICBoID0gc29hcF9oYXNoX3B0cihhLT5fX3B0cik7CisgIGVsc2UKKyAgICBoID0gc29hcF9oYXNoX3B0cihwKTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQb2ludGVyIGVudGVyIGxvY2F0aW9uPSVwIGFycmF5PSVwIHNpemU9JWQgZGltPSVkIHR5cGU9JWQgaWQ9JWRcbiIsIHAsIGE/YS0+X19wdHI6TlVMTCwgYT9hLT5fX3NpemU6MCwgbiwgdHlwZSwgc29hcC0+aWRudW0rMSkpOworICBwcC0+bmV4dCA9IHNvYXAtPnBodFtoXTsKKyAgcHAtPnR5cGUgPSB0eXBlOworICBwcC0+bWFyazEgPSAwOworICBwcC0+bWFyazIgPSAwOworICBwcC0+cHRyID0gcDsKKyAgcHAtPmFycmF5ID0gYTsKKyAgc29hcC0+cGh0W2hdID0gcHA7CisgIHBwLT5pZCA9ICsrc29hcC0+aWRudW07CisgIHJldHVybiBwcC0+aWQ7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYXJyYXlfcG9pbnRlcl9sb29rdXAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgbiwgaW50IHR5cGUsIHN0cnVjdCBzb2FwX3BsaXN0ICoqcHBwKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgICpwcHAgPSBOVUxMOworICBpZiAoIXAgfHwgIWEtPl9fcHRyKQorICAgIHJldHVybiAwOworICBmb3IgKHBwID0gc29hcC0+cGh0W3NvYXBfaGFzaF9wdHIoYS0+X19wdHIpXTsgcHA7IHBwID0gcHAtPm5leHQpCisgIHsgaWYgKHBwLT50eXBlID09IHR5cGUgJiYgcHAtPmFycmF5ICYmIHBwLT5hcnJheS0+X19wdHIgPT0gYS0+X19wdHIpCisgICAgeyByZWdpc3RlciBpbnQgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgIGlmICgoKGNvbnN0IGludCopJnBwLT5hcnJheS0+X19zaXplKVtpXSAhPSAoKGNvbnN0IGludCopJmEtPl9fc2l6ZSlbaV0pCisJICBicmVhazsKKyAgICAgIGlmIChpID09IG4pCisgICAgICB7ICpwcHAgPSBwcDsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJBcnJheSBsb29rdXAgbG9jYXRpb249JXAgdHlwZT0lZCBpZD0lZFxuIiwgYS0+X19wdHIsIHR5cGUsIHBwLT5pZCkpOworICAgICAgICByZXR1cm4gcHAtPmlkOworICAgICAgfQorICAgIH0KKyAgfQorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFycmF5IGxvb2t1cCBsb2NhdGlvbj0lcCB0eXBlPSVkOiBub3QgZm91bmRcbiIsIGEtPl9fcHRyLCB0eXBlKSk7CisgIHJldHVybiAwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYmVnaW5fY291bnQoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXBfY2xyX2F0dHIoc29hcCk7CisgIHNvYXBfc2V0X2xvY2FsX25hbWVzcGFjZXMoc29hcCk7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpIHx8IChzb2FwLT5vbW9kZSAmIFNPQVBfRU5DX0RJTUUpKQorICAgIHNvYXAtPm1vZGUgPSBzb2FwLT5vbW9kZSB8IFNPQVBfSU9fTEVOR1RIIHwgU09BUF9FTkNfRElNRTsKKyAgZWxzZQorI2VuZGlmCisgIHsgc29hcC0+bW9kZSA9IHNvYXAtPm9tb2RlOworICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fU1RPUkUKKyAgICAgfHwgKCgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTksgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpKQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICAgICAgJiYgIXNvYXAtPmZwcmVwYXJlc2VuZAorI2VuZGlmCisgICAgICApKQorICAgICAgc29hcC0+bW9kZSAmPSB+U09BUF9JT19MRU5HVEg7CisgICAgZWxzZQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX0xFTkdUSDsKKyAgfQorI2lmZGVmIFdJVEhfWkxJQgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fRkxVU0gpCisgIHsgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpKQorICAgICAgc29hcC0+bW9kZSAmPSB+U09BUF9JT19MRU5HVEg7CisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fQlVGRkVSOworICAgIGVsc2UKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19TVE9SRTsKKyAgfQorI2VuZGlmCisgIGlmICghc29hcC0+ZW5jb2RpbmdTdHlsZSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9HUkFQSCkpCisgICAgc29hcC0+bW9kZSB8PSBTT0FQX1hNTF9UUkVFOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpKQorICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfTUlNRTsKKyAgZWxzZQorICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX01UT007CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkKKyAgICBzb2FwX3NlbGVjdF9taW1lX2JvdW5kYXJ5KHNvYXApOworICBzb2FwLT5kaW1lLmxpc3QgPSBzb2FwLT5kaW1lLmxhc3Q7CS8qIGtlZXAgdHJhY2sgb2YgbGFzdCBESU1FIGF0dGFjaG1lbnQgKi8KKyNlbmRpZgorICBzb2FwLT5jb3VudCA9IDA7CisgIHNvYXAtPm5zID0gMDsKKyAgc29hcC0+bnVsbCA9IDA7CisgIHNvYXAtPnBvc2l0aW9uID0gMDsKKyAgc29hcC0+bXVzdFVuZGVyc3RhbmQgPSAwOworICBzb2FwLT5lbmNvZGluZyA9IDA7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0JFR0lOOworICBzb2FwLT5pZG51bSA9IDA7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQmVnaW4gY291bnQgcGhhc2UgKHNvY2tldD0lZCBtb2RlPTB4JXggY291bnQ9JWx1KVxuIiwgc29hcC0+c29ja2V0LCBzb2FwLT5tb2RlLCAodW5zaWduZWQgbG9uZylzb2FwLT5jb3VudCkpOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzb2FwLT5kaW1lLmNvdW50ID0gMDsgLyogY291bnQgIyBvZiBhdHRhY2htZW50cyAqLworICBzb2FwLT5kaW1lLnNpemUgPSAwOyAvKiBhY2N1bXVsYXRlIHRvdGFsIHNpemUgb2YgYXR0YWNobWVudHMgKi8KKyAgaWYgKHNvYXAtPmZwcmVwYXJlaW5pdCAmJiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pICE9IFNPQVBfSU9fU1RPUkUpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gc29hcC0+ZnByZXBhcmVpbml0KHNvYXApOyAgIAorI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VuZF9jb3VudChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5mcHJlcGFyZWZpbmFsKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IHNvYXAtPmZwcmVwYXJlZmluYWwoc29hcCk7CisjZW5kaWYKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgb2YgY291bnQgcGhhc2VcbiIpKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYmVnaW5fc2VuZChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICBzb2FwX2Nscl9hdHRyKHNvYXApOworICBzb2FwX3NldF9sb2NhbF9uYW1lc3BhY2VzKHNvYXApOworICBzb2FwLT5tb2RlID0gc29hcC0+b21vZGUgfCAoc29hcC0+bW9kZSAmIChTT0FQX0lPX0xFTkdUSCB8IFNPQVBfRU5DX0RJTUUpKTsKKyNpZmRlZiBXSVRIX1pMSUIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQikgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0ZMVVNIKQorICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWE1MKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX0JVRkZFUjsKKyAgICBlbHNlCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fU1RPUkU7CisgIH0KKyNlbmRpZgorI2lmZGVmIFdJVEhfVURQCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgeyBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX1hNTDsKKyAgICBpZiAoc29hcC0+Y291bnQgPiBTT0FQX0JVRkxFTikKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfVURQX0VSUk9SOworICB9CisjZW5kaWYKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19GTFVTSCAmJiBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICB7IGlmIChzb2FwLT5jb3VudCB8fCAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKSB8fCAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1hNTCkpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fQlVGRkVSOworICAgIGVsc2UKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19TVE9SRTsKKyAgfQorICBzb2FwLT5tb2RlICY9IH5TT0FQX0lPX0xFTkdUSDsKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19TVE9SRSkKKyAgICBzb2FwX25ld19ibG9jayhzb2FwKTsKKyAgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfSU9fS0VFUEFMSVZFKSkKKyAgICBzb2FwLT5rZWVwX2FsaXZlID0gMDsKKyAgaWYgKCFzb2FwLT5lbmNvZGluZ1N0eWxlICYmICEoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0dSQVBIKSkKKyAgICBzb2FwLT5tb2RlIHw9IFNPQVBfWE1MX1RSRUU7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pICYmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkpCisgIHsgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19NSU1FOworICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX0RJTUU7CisgIH0KKyAgZWxzZQorICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX01UT007CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkKKyAgICBzb2FwX3NlbGVjdF9taW1lX2JvdW5kYXJ5KHNvYXApOworI2lmZGVmIFdJTjMyCisjaWZuZGVmIFVOREVSX0NFCisjaWZuZGVmIFdJVEhfRkFTVENHSQorICBpZiAoIXNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpIC8qIFNldCB3aW4zMiBzdGRvdXQgb3Igc29hcC0+c2VuZGZkIHRvIEJJTkFSWSwgZS5nLiB0byBzdXBwb3J0IERJTUUgKi8KKyNpZmRlZiBfX0JPUkxBTkRDX18KKyAgICBzZXRtb2RlKChTT0FQX1NPQ0tFVClzb2FwLT5zZW5kZmQsIE9fQklOQVJZKTsKKyNlbHNlCisgICAgX3NldG1vZGUoKFNPQVBfU09DS0VUKXNvYXAtPnNlbmRmZCwgX09fQklOQVJZKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JTykKKyAgeyBzb2FwLT5idWZpZHggPSAwOworICAgIHNvYXAtPmJ1ZmxlbiA9IDA7CisgIH0KKyAgc29hcC0+Y2h1bmtzaXplID0gMDsKKyAgc29hcC0+bnMgPSAwOworICBzb2FwLT5udWxsID0gMDsKKyAgc29hcC0+cG9zaXRpb24gPSAwOworICBzb2FwLT5tdXN0VW5kZXJzdGFuZCA9IDA7CisgIHNvYXAtPmVuY29kaW5nID0gMDsKKyAgc29hcC0+aWRudW0gPSAwOworICBzb2FwLT5sZXZlbCA9IDA7CisjaWZkZWYgV0lUSF9aTElCCisgIHNvYXAtPnpfcmF0aW9fb3V0ID0gMS4wOworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKSAmJiBzb2FwLT56bGliX3N0YXRlICE9IFNPQVBfWkxJQl9ERUZMQVRFKQorICB7CisjaWZkZWYgV0lUSF9HWklQCisgICAgbWVtY3B5KHNvYXAtPnpfYnVmLCAiXDM3XDIxM1wxMFwwXDBcMFwwXDBcMFwzNzciLCAxMCk7CisgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZSopc29hcC0+el9idWYgKyAxMDsKKyAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgPSBTT0FQX0JVRkxFTiAtIDEwOworICAgIHNvYXAtPnpfY3JjID0gY3JjMzIoMEwsIE5VTEwsIDApOworICAgIGlmIChkZWZsYXRlSW5pdDIoJnNvYXAtPmRfc3RyZWFtLCBzb2FwLT56X2xldmVsLCBaX0RFRkxBVEVELCAtTUFYX1dCSVRTLCA4LCBaX0RFRkFVTFRfU1RSQVRFR1kpICE9IFpfT0spCisjZWxzZQorICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gKEJ5dGUqKXNvYXAtPnpfYnVmOworICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCA9IFNPQVBfQlVGTEVOOworICAgIGlmIChkZWZsYXRlSW5pdCgmc29hcC0+ZF9zdHJlYW0sIHNvYXAtPnpfbGV2ZWwpICE9IFpfT0spCisjZW5kaWYKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlZmxhdGUgaW5pdGlhbGl6ZWRcbiIpKTsKKyAgICBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX0RFRkxBVEU7CisgIH0KKyNlbmRpZgorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkJlZ2luIHNlbmQgcGhhc2UgKHNvY2tldD0lZCBtb2RlPTB4JXggY291bnQ9JWx1KVxuIiwgc29hcC0+c29ja2V0LCBzb2FwLT5tb2RlLCAodW5zaWduZWQgbG9uZylzb2FwLT5jb3VudCkpOworICBzb2FwLT5wYXJ0ID0gU09BUF9CRUdJTjsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPmZwcmVwYXJlaW5pdCAmJiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fU1RPUkUpCisgICAgc29hcC0+ZnByZXBhcmVpbml0KHNvYXApOyAgIAorI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZW1iZWRkZWQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnAsIGludCB0KQoreyBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgIGlmIChzb2FwX3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIHQsICZwcCkpCisgIHsgcHAtPm1hcmsxID0gMTsKKyAgICBwcC0+bWFyazIgPSAxOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW1iZWRkZWQgJXAgdHlwZT0lZCBtYXJrIHNldCB0byAxXG4iLCBwLCB0KSk7CisgIH0KK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWZlcmVuY2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnAsIGludCB0KQoreyBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgIGlmICghcCB8fCAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1RSRUUpKQorICAgIHJldHVybiAxOworICBpZiAoc29hcF9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCB0LCAmcHApKQorICB7IGlmIChwcC0+bWFyazEgPT0gMCkKKyAgICB7IHBwLT5tYXJrMSA9IDI7CisgICAgICBwcC0+bWFyazIgPSAyOworICAgIH0KKyAgfQorICBlbHNlIGlmIChzb2FwX3BvaW50ZXJfZW50ZXIoc29hcCwgcCwgTlVMTCwgMCwgdCwgJnBwKSkKKyAgeyBwcC0+bWFyazEgPSAwOworICAgIHBwLT5tYXJrMiA9IDA7CisgIH0KKyAgZWxzZQorICAgIHJldHVybiAxOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlZmVyZW5jZSAlcCB0eXBlPSVkICglZCAlZClcbiIsIHAsIHQsIChpbnQpcHAtPm1hcmsxLCAoaW50KXBwLT5tYXJrMikpOworICByZXR1cm4gcHAtPm1hcmsxOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2FycmF5X3JlZmVyZW5jZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCwgY29uc3Qgc3RydWN0IHNvYXBfYXJyYXkgKmEsIGludCBuLCBpbnQgdCkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgaWYgKCFwIHx8ICFhLT5fX3B0cikKKyAgICByZXR1cm4gMTsKKyAgaSA9IHNvYXBfYXJyYXlfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgYSwgbiwgdCwgJnBwKTsKKyAgaWYgKGkpCisgIHsgaWYgKHBwLT5tYXJrMSA9PSAwKQorICAgIHsgcHAtPm1hcmsxID0gMjsKKyAgICAgIHBwLT5tYXJrMiA9IDI7CisgICAgfQorICB9CisgIGVsc2UgaWYgKCFzb2FwX3BvaW50ZXJfZW50ZXIoc29hcCwgcCwgYSwgbiwgdCwgJnBwKSkKKyAgICByZXR1cm4gMTsKKyAgZWxzZQorICB7IHBwLT5tYXJrMSA9IDA7CisgICAgcHAtPm1hcmsyID0gMDsKKyAgfQorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFycmF5IHJlZmVyZW5jZSAlcCBwdHI9JXAgZGltPSVkIHR5cGU9JWQgKCVkICVkKVxuIiwgcCwgYS0+X19wdHIsIG4sIHQsIChpbnQpcHAtPm1hcmsxLCAoaW50KXBwLT5tYXJrMikpOworICByZXR1cm4gcHAtPm1hcmsxOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VtYmVkZGVkX2lkKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgaWQsIGNvbnN0IHZvaWQgKnAsIGludCB0KQoreyBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfVFJFRSkKKyAgICByZXR1cm4gaWQ7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW1iZWRkZWRfaWQgJXAgdHlwZT0lZCBpZD0lZFxuIiwgcCwgdCwgaWQpKTsKKyAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMSAmJiBzb2FwLT5lbmNvZGluZ1N0eWxlICYmICEoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0dSQVBIKSAmJiBzb2FwLT5wYXJ0ICE9IFNPQVBfSU5fSEVBREVSKQorICB7IGlmIChpZCA8IDApCisgICAgeyBpZCA9IHNvYXBfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgdCwgJnBwKTsKKyAgICAgIGlmIChpZCkKKyAgICAgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICAgICAgICBwcC0+bWFyazEgPSAyOworICAgICAgICBlbHNlCisgICAgICAgICAgcHAtPm1hcmsyID0gMjsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbWJlZGRlZF9pZCBtdWx0aXJlZiBpZD0lZCAlcCB0eXBlPSVkID0gKCVkICVkKVxuIiwgaWQsIHAsIHQsIChpbnQpcHAtPm1hcmsxLCAoaW50KXBwLT5tYXJrMikpOworICAgICAgfQorICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gaWQ7CisgIH0KKyAgaWYgKGlkIDwgMCkKKyAgICBpZCA9IHNvYXBfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgdCwgJnBwKTsKKyAgZWxzZSBpZiAoaWQgJiYgIXNvYXBfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgdCwgJnBwKSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKGlkICYmIHBwKQorICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgICBwcC0+bWFyazEgPSAxOworICAgIGVsc2UKKyAgICAgIHBwLT5tYXJrMiA9IDE7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbWJlZGRlZF9pZCBlbWJlZGRlZCByZWYgaWQ9JWQgJXAgdHlwZT0lZCA9ICglZCAlZClcbiIsIGlkLCBwLCB0LCAoaW50KXBwLT5tYXJrMSwgKGludClwcC0+bWFyazIpKTsKKyAgfQorICByZXR1cm4gaWQ7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfaXNfZW1iZWRkZWQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3BsaXN0ICpwcCkKK3sgaWYgKCFwcCkKKyAgICByZXR1cm4gMDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJcyBlbWJlZGRlZD8gJWQgJWRcbiIsIChpbnQpcHAtPm1hcmsxLCAoaW50KXBwLT5tYXJrMikpOworICBpZiAoc29hcC0+dmVyc2lvbiA9PSAxICYmIHNvYXAtPmVuY29kaW5nU3R5bGUgJiYgIShzb2FwLT5tb2RlICYgU09BUF9YTUxfR1JBUEgpICYmIHNvYXAtPnBhcnQgIT0gU09BUF9JTl9IRUFERVIpCisgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICAgIHJldHVybiBwcC0+bWFyazEgIT0gMDsKKyAgICByZXR1cm4gcHAtPm1hcmsyICE9IDA7CisgIH0KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICByZXR1cm4gcHAtPm1hcmsxID09IDE7CisgIHJldHVybiBwcC0+bWFyazIgPT0gMTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9pc19zaW5nbGUoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3BsaXN0ICpwcCkKK3sgaWYgKHNvYXAtPnBhcnQgPT0gU09BUF9JTl9IRUFERVIpCisgICAgcmV0dXJuIDE7CisgIGlmICghcHApCisgICAgcmV0dXJuIDA7CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgcmV0dXJuIHBwLT5tYXJrMSA9PSAwOworICByZXR1cm4gcHAtPm1hcmsyID09IDA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9lbWJlZGRlZChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGxpc3QgKnBwKQoreyBpZiAoIXBwKQorICAgIHJldHVybjsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICBwcC0+bWFyazEgPSAxOworICBlbHNlCisgICAgcHAtPm1hcmsyID0gMTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9hdHRhY2htZW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgdm9pZCAqcCwgY29uc3Qgc3RydWN0IHNvYXBfYXJyYXkgKmEsIGNvbnN0IGNoYXIgKmFpZCwgY29uc3QgY2hhciAqYXR5cGUsIGNvbnN0IGNoYXIgKmFvcHRpb25zLCBpbnQgbiwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpIAoreyBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgIGludCBpOworICBpZiAoIXAgfHwgIWEtPl9fcHRyIHx8ICghYWlkICYmICFhdHlwZSkpCisgICAgcmV0dXJuIHNvYXBfZWxlbWVudF9pZChzb2FwLCB0YWcsIGlkLCBwLCBhLCBuLCB0eXBlLCB0KTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJBdHRhY2htZW50IHRhZz0nJXMnIGlkPSclcycgKCVkKSB0eXBlPSclcydcbiIsIHRhZywgYWlkP2FpZDoiIiwgaWQsIGF0eXBlP2F0eXBlOiIiKSk7CisgIGkgPSBzb2FwX2FycmF5X3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIGEsIG4sIHQsICZwcCk7CisgIGlmICghaSkKKyAgeyBpID0gc29hcF9wb2ludGVyX2VudGVyKHNvYXAsIHAsIGEsIG4sIHQsICZwcCk7CisgICAgaWYgKCFpKQorICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKyAgaWYgKGlkIDw9IDApCisgICAgaWQgPSBpOworICBpZiAoIWFpZCkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1Ziwgc29hcC0+ZGltZV9pZF9mb3JtYXQsIGlkKTsKKyAgICBhaWQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT50bXBidWYpOworICB9CisgIC8qIEFkZCBNVE9NIHhvcDpJbmNsdWRlIGVsZW1lbnQgd2hlbiBuZWNlc3NhcnkgKi8KKyAgLyogVE9ETzogdGhpcyBjb2RlIHRvIGJlIG9ic29sZXRlZCB3aXRoIG5ldyBpbXBvcnQveG9wLmggY29udmVudGlvbnMgKi8KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkgJiYgc3RyY21wKHRhZywgInhvcDpJbmNsdWRlIikpCisgIHsgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCAwLCB0eXBlKQorICAgICB8fCBzb2FwX2VsZW1lbnRfaHJlZihzb2FwLCAieG9wOkluY2x1ZGUiLCAwLCAiaHJlZiIsIGFpZCkKKyAgICAgfHwgc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBlbHNlIGlmIChzb2FwX2VsZW1lbnRfaHJlZihzb2FwLCB0YWcsIDAsICJocmVmIiwgYWlkKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgIHsgaWYgKHBwLT5tYXJrMSAhPSAzKQorICAgIHsgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICAgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKQorICAgICAgICBjb250ZW50ID0gc29hcF9uZXdfbXVsdGlwYXJ0KHNvYXAsICZzb2FwLT5taW1lLmZpcnN0LCAmc29hcC0+bWltZS5sYXN0LCAoY2hhciopYS0+X19wdHIsIGEtPl9fc2l6ZSk7CisgICAgICBlbHNlCisgICAgICAgIGNvbnRlbnQgPSBzb2FwX25ld19tdWx0aXBhcnQoc29hcCwgJnNvYXAtPmRpbWUuZmlyc3QsICZzb2FwLT5kaW1lLmxhc3QsIChjaGFyKilhLT5fX3B0ciwgYS0+X19zaXplKTsKKyAgICAgIGlmICghY29udGVudCkKKyAgICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgaWYgKCFzdHJuY21wKGFpZCwgImNpZDoiLCA0KSkgLyogUkZDIDIxMTEgKi8KKyAgICAgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKQorICAgICAgICB7IGNoYXIgKnMgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc3RybGVuKGFpZCkgLSAxKTsKKwkgIGlmIChzKQorCSAgeyAqcyA9ICc8JzsKKwkgICAgc3RyY3B5KHMgKyAxLCBhaWQgKyA0KTsKKwkgICAgc3RyY2F0KHMsICI+Iik7CisJICAgIGNvbnRlbnQtPmlkID0gczsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIGNvbnRlbnQtPmlkID0gYWlkICsgNDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgY29udGVudC0+aWQgPSBhaWQ7CisgICAgICBjb250ZW50LT50eXBlID0gYXR5cGU7CisgICAgICBjb250ZW50LT5vcHRpb25zID0gYW9wdGlvbnM7CisgICAgICBjb250ZW50LT5lbmNvZGluZyA9IFNPQVBfTUlNRV9CSU5BUlk7CisgICAgICBwcC0+bWFyazEgPSAzOworICAgIH0KKyAgfQorICBlbHNlCisgICAgcHAtPm1hcmsyID0gMzsKKyAgcmV0dXJuIC0xOworfQorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZAorc29hcF9pbml0X2lodChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5pdGlhbGl6aW5nIElEIGhhc2h0YWJsZVxuIikpOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9JREhBU0g7IGkrKykKKyAgICBzb2FwLT5paHRbaV0gPSBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQKK3NvYXBfZnJlZV9paHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXAsICpwOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9mbGlzdCAqZnAsICpmcTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIElEIGhhc2h0YWJsZVxuIikpOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9JREhBU0g7IGkrKykKKyAgeyBmb3IgKGlwID0gc29hcC0+aWh0W2ldOyBpcDsgaXAgPSBwKQorICAgIHsgZm9yIChmcCA9IGlwLT5mbGlzdDsgZnA7IGZwID0gZnEpCisgICAgICB7IGZxID0gZnAtPm5leHQ7CisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBmcCk7CisgICAgICB9CisgICAgICBwID0gaXAtPm5leHQ7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgaXApOworICAgIH0KKyAgICBzb2FwLT5paHRbaV0gPSBOVUxMOworICB9Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcF9pbGlzdCAqCitTT0FQX0ZNQUMyCitzb2FwX2xvb2t1cChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgZm9yIChpcCA9IHNvYXAtPmlodFtzb2FwX2hhc2goaWQpXTsgaXA7IGlwID0gaXAtPm5leHQpCisgICAgaWYgKCFzdHJjbXAoaXAtPmlkLCBpZCkpCisgICAgICByZXR1cm4gaXA7CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorc3RydWN0IHNvYXBfaWxpc3QgKgorU09BUF9GTUFDMgorc29hcF9lbnRlcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQpCit7IHJlZ2lzdGVyIHNpemVfdCBoOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIGlwID0gKHN0cnVjdCBzb2FwX2lsaXN0KilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfaWxpc3QpICsgc3RybGVuKGlkKSk7CisgIGlmIChpcCkKKyAgeyBoID0gc29hcF9oYXNoKGlkKTsKKyAgICBzdHJjcHkoaXAtPmlkLCBpZCk7CisgICAgaXAtPm5leHQgPSBzb2FwLT5paHRbaF07CisgICAgc29hcC0+aWh0W2hdID0gaXA7CisgICAgcmV0dXJuIGlwOworICB9CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkKgorU09BUF9GTUFDMgorc29hcF9tYWxsb2Moc3RydWN0IHNvYXAgKnNvYXAsIHNpemVfdCBuKQoreyByZWdpc3RlciBjaGFyICpwOworICBpZiAoIW4pCisgICAgcmV0dXJuICh2b2lkKilTT0FQX05PTl9OVUxMOworICBpZiAoIXNvYXApCisgICAgcmV0dXJuIFNPQVBfTUFMTE9DKHNvYXAsIG4pOworICBuICs9ICgtKGxvbmcpbikgJiAoc2l6ZW9mKHZvaWQqKS0xKTsgLyogYWxpZ24gYXQgNC0sIDgtIG9yIDE2LWJ5dGUgYm91bmRhcnkgKi8KKyAgaWYgKCEocCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBuICsgc2l6ZW9mKHZvaWQqKSArIHNpemVvZihzaXplX3QpKSkpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICAvKiBrZWVwIGNoYWluIG9mIGFsbG9jZWQgY2VsbHMgZm9yIGxhdGVyIGRlc3RydWN0aW9uICovCisgIHNvYXAtPmFsbG9jZWQgPSAxOworICAqKHZvaWQqKikocCArIG4pID0gc29hcC0+YWxpc3Q7CisgICooc2l6ZV90KikocCArIG4gKyBzaXplb2Yodm9pZCopKSA9IG47CisgIHNvYXAtPmFsaXN0ID0gcCArIG47CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworc3RhdGljIHZvaWQKK3NvYXBfaW5pdF9taHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgKGludClTT0FQX1BUUkhBU0g7IGkrKykKKyAgICBzb2FwLT5taHRbaV0gPSBOVUxMOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworc3RhdGljIHZvaWQKK3NvYXBfZnJlZV9taHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9tbGlzdCAqbXAsICptcTsKKyAgZm9yIChpID0gMDsgaSA8IChpbnQpU09BUF9QVFJIQVNIOyBpKyspCisgIHsgZm9yIChtcCA9IHNvYXAtPm1odFtpXTsgbXA7IG1wID0gbXEpCisgICAgeyBtcSA9IG1wLT5uZXh0OworICAgICAgaWYgKG1wLT5saXZlKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzKCVkKTogbWFsbG9jKCkgPSAlcCBub3QgZnJlZWQgKG1lbW9yeSBsZWFrIG9yIGZvcmdvdCB0byBjYWxsIHNvYXBfZW5kKCk/KVxuIiwgbXAtPmZpbGUsIG1wLT5saW5lLCBtcC0+cHRyKTsKKyAgICAgIGZyZWUobXApOworICAgIH0KKyAgICBzb2FwLT5taHRbaV0gPSBOVUxMOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitTT0FQX0ZNQUMxCit2b2lkKgorU09BUF9GTUFDMgorc29hcF90cmFja19tYWxsb2Moc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBzaXplX3Qgc2l6ZSkKK3sgcmVnaXN0ZXIgdm9pZCAqcCA9IG1hbGxvYyhzaXplKTsKKyAgaWYgKHNvYXApCisgIHsgcmVnaXN0ZXIgaW50IGggPSBzb2FwX2hhc2hfcHRyKHApOworICAgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX21saXN0ICptcCA9IChzdHJ1Y3Qgc29hcF9tbGlzdCopbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc29hcF9tbGlzdCkpOworICAgIGlmIChzb2FwLT5mZGVidWdbU09BUF9JTkRFWF9URVNUXSkKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiJXMoJWQpOiBtYWxsb2MoJWx1KSA9ICVwXG4iLCBmaWxlLCBsaW5lLCAodW5zaWduZWQgbG9uZylzaXplLCBwKSk7CisgICAgbXAtPm5leHQgPSBzb2FwLT5taHRbaF07CisgICAgbXAtPnB0ciA9IHA7CisgICAgbXAtPmZpbGUgPSBmaWxlOworICAgIG1wLT5saW5lID0gbGluZTsKKyAgICBtcC0+bGl2ZSA9IDE7CisgICAgc29hcC0+bWh0W2hdID0gbXA7CisgIH0KKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3RyYWNrX2ZyZWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCB2b2lkICpwKQoreyByZWdpc3RlciBpbnQgaCA9IHNvYXBfaGFzaF9wdHIocCk7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX21saXN0ICptcDsKKyAgZm9yIChtcCA9IHNvYXAtPm1odFtoXTsgbXA7IG1wID0gbXAtPm5leHQpCisgICAgaWYgKG1wLT5wdHIgPT0gcCkKKyAgICAgIGJyZWFrOworICBpZiAobXApCisgIHsgaWYgKG1wLT5saXZlKQorICAgIHsgZnJlZShwKTsKKyAgICAgIGlmIChzb2FwLT5mZGVidWdbU09BUF9JTkRFWF9URVNUXSkKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIlcyglZCk6IGZyZWUoJXApXG4iLCBmaWxlLCBsaW5lLCBwKSk7CisgICAgICBtcC0+bGl2ZSA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMoJWQpOiBmcmVlKCVwKSBkb3VibGUgZnJlZSBvZiBwb2ludGVyIG1hbGxvY2VkIGF0ICVzKCVkKVxuIiwgZmlsZSwgbGluZSwgcCwgbXAtPmZpbGUsIG1wLT5saW5lKTsKKyAgfQorICBlbHNlCisgICAgZnByaW50ZihzdGRlcnIsICIlcyglZCk6IGZyZWUoJXApIHBvaW50ZXIgbm90IG1hbGxvY2VkXG4iLCBmaWxlLCBsaW5lLCBwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK3N0YXRpYyB2b2lkCitzb2FwX3RyYWNrX3VubGluayhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCkKK3sgcmVnaXN0ZXIgaW50IGggPSBzb2FwX2hhc2hfcHRyKHApOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9tbGlzdCAqbXA7CisgIGZvciAobXAgPSBzb2FwLT5taHRbaF07IG1wOyBtcCA9IG1wLT5uZXh0KQorICAgIGlmIChtcC0+cHRyID09IHApCisgICAgICBicmVhazsKKyAgaWYgKG1wKQorICAgIG1wLT5saXZlID0gMDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZGVhbGxvYyhzdHJ1Y3Qgc29hcCAqc29hcCwgdm9pZCAqcCkKK3sgaWYgKCFzb2FwKQorICAgIHJldHVybjsKKyAgaWYgKHApCisgIHsgcmVnaXN0ZXIgY2hhciAqKnE7CisgICAgZm9yIChxID0gKGNoYXIqKikmc29hcC0+YWxpc3Q7ICpxOyBxID0gKihjaGFyKioqKXEpCisgICAgeyBpZiAocCA9PSAodm9pZCopKCpxIC0gKihzaXplX3QqKSgqcSArIHNpemVvZih2b2lkKikpKSkKKyAgICAgIHsgKnEgPSAqKihjaGFyKioqKXE7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZWQgZGF0YSBhdCAlcFxuIiwgcCkpOworICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisgICAgc29hcF9kZWxldGUoc29hcCwgcCk7CisgIH0KKyAgZWxzZQorICB7IHJlZ2lzdGVyIGNoYXIgKnE7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIGFsbCBzb2FwX21hbGxvYygpIGRhdGFcbiIpKTsKKyAgICB3aGlsZSAoc29hcC0+YWxpc3QpCisgICAgeyBxID0gKGNoYXIqKXNvYXAtPmFsaXN0OworICAgICAgc29hcC0+YWxpc3QgPSAqKHZvaWQqKilxOworICAgICAgcSAtPSAqKHNpemVfdCopKHEgKyBzaXplb2Yodm9pZCopKTsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBxKTsKKyAgICB9CisgIH0KKyAgLyogd2UgbXVzdCBhc3N1bWUgdGhlc2Ugd2VyZSBkZWFsbG9jYXRlZDogKi8KKyAgc29hcC0+YWN0aW9uID0gTlVMTDsKKyAgc29hcC0+ZmF1bHQgPSBOVUxMOworICBzb2FwLT5oZWFkZXIgPSBOVUxMOworICBzb2FwLT51c2VyaWQgPSBOVUxMOworICBzb2FwLT5wYXNzd2QgPSBOVUxMOworICBzb2FwLT5hdXRocmVhbG0gPSBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzb2FwX2Nscl9taW1lKHNvYXApOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2RlbGV0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgdm9pZCAqcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfY2xpc3QgKipjcDsKKyAgaWYgKHNvYXBfY2hlY2tfc3RhdGUoc29hcCkpCisgICAgcmV0dXJuOworICBjcCA9ICZzb2FwLT5jbGlzdDsKKyAgaWYgKHApCisgIHsgd2hpbGUgKCpjcCkKKyAgICB7IGlmIChwID09ICgqY3ApLT5wdHIpCisgICAgICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2NsaXN0ICpxID0gKmNwOworICAgICAgICAqY3AgPSBxLT5uZXh0OworICAgICAgICBxLT5mZGVsZXRlKHEpOworICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGNwID0gJigqY3ApLT5uZXh0OworICAgIH0KKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBkZWFsbG9jIGRhdGEgJXA6IGFkZHJlc3Mgbm90IGluIGxpc3RcbiIsIHApKTsKKyAgfQorICBlbHNlCisgIHsgd2hpbGUgKCpjcCkKKyAgICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2NsaXN0ICpxID0gKmNwOworICAgICAgKmNwID0gcS0+bmV4dDsKKyAgICAgIGlmIChxLT5wdHIgPT0gKHZvaWQqKXNvYXAtPmZhdWx0KQorICAgICAgICBzb2FwLT5mYXVsdCA9IE5VTEw7IC8qIHRoaXMgd2FzIGRlYWxsb2NhdGVkICovCisgICAgICBlbHNlIGlmIChxLT5wdHIgPT0gKHZvaWQqKXNvYXAtPmhlYWRlcikKKyAgICAgICAgc29hcC0+aGVhZGVyID0gTlVMTDsgLyogdGhpcyB3YXMgZGVhbGxvY2F0ZWQgKi8KKyAgICAgIHEtPmZkZWxldGUocSk7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgcSk7CisgICAgfQorICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcF9jbGlzdCAqCitTT0FQX0ZNQUMyCitzb2FwX2xpbmsoc3RydWN0IHNvYXAgKnNvYXAsIHZvaWQgKnAsIGludCB0LCBpbnQgbiwgdm9pZCAoKmZkZWxldGUpKHN0cnVjdCBzb2FwX2NsaXN0KikpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2NsaXN0ICpjcDsKKyAgaWYgKChjcCA9IChzdHJ1Y3Qgc29hcF9jbGlzdCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2NsaXN0KSkpKQorICB7IGNwLT5uZXh0ID0gc29hcC0+Y2xpc3Q7CisgICAgY3AtPnR5cGUgPSB0OworICAgIGNwLT5zaXplID0gbjsgCisgICAgY3AtPnB0ciA9IHA7CisgICAgY3AtPmZkZWxldGUgPSBmZGVsZXRlOworICAgIHNvYXAtPmNsaXN0ID0gY3A7CisgIH0KKyAgcmV0dXJuIGNwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF91bmxpbmsoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnApCit7IHJlZ2lzdGVyIGNoYXIgKipxOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9jbGlzdCAqKmNwOworICBpZiAoIXNvYXAgfHwgIXApCisgICAgcmV0dXJuOworICBmb3IgKHEgPSAoY2hhcioqKSZzb2FwLT5hbGlzdDsgKnE7IHEgPSAqKGNoYXIqKiopcSkKKyAgeyBpZiAocCA9PSAodm9pZCopKCpxIC0gKihzaXplX3QqKSgqcSArIHNpemVvZih2b2lkKikpKSkKKyAgICB7ICpxID0gKiooY2hhcioqKilxOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVbmxpbmtlZCBkYXRhICVwXG4iLCBwKSk7CisjaWZkZWYgU09BUF9ERUJVRworICAgICAgc29hcF90cmFja191bmxpbmsoc29hcCwgcCk7CisjZW5kaWYKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgZm9yIChjcCA9ICZzb2FwLT5jbGlzdDsgKmNwOyBjcCA9ICYoKmNwKS0+bmV4dCkKKyAgeyBpZiAocCA9PSAoKmNwKS0+cHRyKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVbmxpbmtlZCBjbGFzcyBpbnN0YW5jZSAlcFxuIiwgcCkpOworICAgICAgcSA9IChjaGFyKiopKmNwOworICAgICAgKmNwID0gKCpjcCktPm5leHQ7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgcSk7CisgICAgICByZXR1cm47CisgICAgfQorICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2xvb2t1cF90eXBlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworICBpZiAoaWQgJiYgKmlkKQorICB7IGlwID0gc29hcF9sb29rdXAoc29hcCwgaWQpOworICAgIGlmIChpcCkKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTG9va3VwIGlkPSclcycgdHlwZT0lZFxuIiwgaWQsIGlwLT50eXBlKSk7CisgICAgICByZXR1cm4gaXAtPnR5cGU7CisgICAgfQorICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAibG9va3VwIHR5cGUgaWQ9JyVzJyBOT1QgRk9VTkQhIE5lZWQgdG8gZ2V0IGl0IGZyb20geHNpOnR5cGVcbiIsIGlkKSk7CisgIHJldHVybiAwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZCoKK1NPQVBfRk1BQzIKK3NvYXBfaWRfbG9va3VwKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgdm9pZCAqKnAsIGludCB0LCBzaXplX3QgbiwgdW5zaWduZWQgaW50IGspCit7IHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgdm9pZCAqKnE7CisgIGlmICghcCB8fCAhaWQgfHwgISppZCkKKyAgICByZXR1cm4gcDsKKyAgaXAgPSBzb2FwX2xvb2t1cChzb2FwLCBpZCk7IC8qIGxvb2t1cCBwb2ludGVyIHRvIGhhc2ggdGFibGUgZW50cnkgZm9yIHN0cmluZyBpZCAqLworICBpZiAoIWlwKQorICB7IGlwID0gc29hcF9lbnRlcihzb2FwLCBpZCk7IC8qIG5ldyBoYXNoIHRhYmxlIGVudHJ5IGZvciBzdHJpbmcgaWQgKi8KKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZvcndhcmRpbmcgZmlyc3QgaHJlZj0nJXMnIHR5cGU9JWQgJXAgKCV1IGJ5dGVzKVxuIiwgaWQsIHQsIHAsICh1bnNpZ25lZCBpbnQpbikpOworICAgIGlwLT50eXBlID0gdDsKKyAgICBpcC0+c2l6ZSA9IG47IAorICAgIGlwLT5saW5rID0gcDsKKyAgICBpcC0+Y29weSA9IE5VTEw7CisgICAgaXAtPmZsaXN0ID0gTlVMTDsKKyAgICBpcC0+cHRyID0gTlVMTDsKKyAgICBpcC0+bGV2ZWwgPSBrOworICAgICpwID0gTlVMTDsKKyAgfQorICBlbHNlIGlmIChpcC0+cHRyKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x2ZWQgaHJlZj0nJXMnIHR5cGU9JWQgbG9jYXRpb249JXAgKCV1IGJ5dGVzKVxuIiwgaWQsIHQsIGlwLT5wdHIsICh1bnNpZ25lZCBpbnQpbikpOworICAgIGlmIChpcC0+dHlwZSAhPSB0KQorICAgIHsgc3RyY3B5KHNvYXAtPmlkLCBpZCk7CisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfSFJFRjsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVHlwZSBpbmNvbXBhdGliaWxpdHk6IGlkIHR5cGU9JWQgaHJlZiB0eXBlPSVkXG4iLCBpcC0+dHlwZSwgdCkpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHdoaWxlIChpcC0+bGV2ZWwgPCBrKQorICAgIHsgcSA9ICh2b2lkKiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHZvaWQqKSk7ICAKKyAgICAgIGlmICghcSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAqcCA9ICh2b2lkKilxOworICAgICAgcCA9IHE7CisgICAgICBrLS07CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlc2NlbmRpbmcgb25lIGxldmVsLi4uXG4iKSk7CisgICAgfQorICAgICpwID0gaXAtPnB0cjsKKyAgfQorICBlbHNlIGlmIChpcC0+bGV2ZWwgPiBrKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x2aW5nIGxldmVsICV1IHBvaW50ZXJzIHRvIGhyZWY9JyVzJ1xuIiwgaXAtPmxldmVsLCBpZCkpOworICAgIHdoaWxlIChpcC0+bGV2ZWwgPiBrKQorICAgIHsgdm9pZCAqcywgKipyID0gJmlwLT5saW5rOworICAgICAgcSA9ICh2b2lkKiopaXAtPmxpbms7CisgICAgICB3aGlsZSAocSkKKyAgICAgIHsgKnIgPSAodm9pZCopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHZvaWQqKSk7CisgICAgICAgIHMgPSAqcTsKKyAgICAgICAgKnEgPSAqcjsKKyAgICAgICAgciA9ICh2b2lkKiopKnI7CisgICAgICAgIHEgPSAodm9pZCoqKXM7CisgICAgICB9CisgICAgICAqciA9IE5VTEw7CisgICAgICBpcC0+c2l6ZSA9IG47IAorICAgICAgaXAtPmNvcHkgPSBOVUxMOworICAgICAgaXAtPmxldmVsID0gaXAtPmxldmVsIC0gMTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVzY2VuZGluZyBvbmUgbGV2ZWwuLi5cbiIpKTsKKyAgICB9CisgICAgcSA9ICh2b2lkKiopaXAtPmxpbms7CisgICAgaXAtPmxpbmsgPSBwOworICAgICpwID0gKHZvaWQqKXE7CisgIH0KKyAgZWxzZQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRm9yd2FyZGVkIGhyZWY9JyVzJyB0eXBlPSVkIGxvY2F0aW9uPSVwICgldSBieXRlcylcbiIsIGlkLCB0LCBwLCAodW5zaWduZWQgaW50KW4pKTsKKyAgICB3aGlsZSAoaXAtPmxldmVsIDwgaykKKyAgICB7IHEgPSAodm9pZCoqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZih2b2lkKikpOyAgCisgICAgICAqcCA9IHE7CisgICAgICBwID0gcTsKKyAgICAgIGstLTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVzY2VuZGluZyBvbmUgbGV2ZWwuLi5cbiIpKTsKKyAgICB9CisgICAgcSA9ICh2b2lkKiopaXAtPmxpbms7CisgICAgaXAtPmxpbmsgPSBwOworICAgICpwID0gKHZvaWQqKXE7CisgIH0KKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkKgorU09BUF9GTUFDMgorc29hcF9pZF9mb3J3YXJkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpocmVmLCB2b2lkICpwLCBzaXplX3QgbGVuLCBpbnQgc3QsIGludCB0dCwgc2l6ZV90IG4sIHVuc2lnbmVkIGludCBrLCB2b2lkICgqZmNvcHkpKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBzaXplX3QsIGNvbnN0IHZvaWQqLCBzaXplX3QpKQoreyBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIGlmICghcCB8fCAhaHJlZiB8fCAhKmhyZWYpCisgICAgcmV0dXJuIHA7CisgIGlwID0gc29hcF9sb29rdXAoc29hcCwgaHJlZik7IC8qIGxvb2t1cCBwb2ludGVyIHRvIGhhc2ggdGFibGUgZW50cnkgZm9yIHN0cmluZyBpZCAqLworICBpZiAoIWlwKQorICB7IGlwID0gc29hcF9lbnRlcihzb2FwLCBocmVmKTsgLyogbmV3IGhhc2ggdGFibGUgZW50cnkgZm9yIHN0cmluZyBpZCAqLworICAgIGlwLT50eXBlID0gc3Q7CisgICAgaXAtPnNpemUgPSBuOworICAgIGlwLT5saW5rID0gTlVMTDsKKyAgICBpcC0+Y29weSA9IE5VTEw7CisgICAgaXAtPnB0ciA9IE5VTEw7CisgICAgaXAtPmxldmVsID0gMDsKKyAgICBpcC0+Zmxpc3QgPSBOVUxMOworICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJOZXcgZW50cnkgaHJlZj0nJXMnIHR5cGU9JWQgc2l6ZT0lbHUgbGV2ZWw9JWQgbG9jYXRpb249JXBcbiIsIGhyZWYsIHN0LCAodW5zaWduZWQgbG9uZyluLCBrLCBwKSk7CisgIH0KKyAgZWxzZSBpZiAoaXAtPnR5cGUgIT0gc3QgfHwgKGlwLT5sZXZlbCA9PSBrICYmIGlwLT5zaXplICE9IG4pKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVHlwZSBpbmNvbXBhdGliaWxpdHkgaWQ9JyVzJyBleHBlY3QgdHlwZT0lZCBzaXplPSVsdSBsZXZlbD0ldSBnb3QgdHlwZT0lZCBzaXplPSVsdVxuIiwgaHJlZiwgaXAtPnR5cGUsICh1bnNpZ25lZCBsb25nKWlwLT5zaXplLCBrLCBzdCwgKHVuc2lnbmVkIGxvbmcpbikpOworICAgIHN0cmNweShzb2FwLT5pZCwgaHJlZik7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0hSRUY7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKGZjb3B5IHx8IG4gPCBzaXplb2Yodm9pZCopIHx8ICpocmVmICE9ICcjJykKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9mbGlzdCAqZnAgPSAoc3RydWN0IHNvYXBfZmxpc3QqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9mbGlzdCkpOworICAgIGlmICghZnApCisgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZwLT5uZXh0ID0gaXAtPmZsaXN0OworICAgIGZwLT50eXBlID0gdHQ7CisgICAgZnAtPnB0ciA9IHA7CisgICAgZnAtPmxldmVsID0gazsKKyAgICBmcC0+bGVuID0gbGVuOworICAgIGlmIChmY29weSkKKyAgICAgIGZwLT5mY29weSA9IGZjb3B5OworICAgIGVsc2UKKyAgICAgIGZwLT5mY29weSA9IHNvYXBfZmNvcHk7CisgICAgaXAtPmZsaXN0ID0gZnA7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGb3J3YXJkaW5nIHR5cGU9JWQgKHRhcmdldCB0eXBlPSVkKSBzaXplPSVsdSBsb2NhdGlvbj0lcCBsZXZlbD0ldSBsZW49JWx1IGhyZWY9JyVzJ1xuIiwgc3QsIHR0LCAodW5zaWduZWQgbG9uZyluLCBwLCBrLCAodW5zaWduZWQgbG9uZylsZW4sIGhyZWYpKTsKKyAgfQorICBlbHNlCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGb3J3YXJkaW5nIGNvcHlpbmcgYWRkcmVzcyAlcCBmb3IgdHlwZT0lZCBocmVmPSclcydcbiIsIHAsIHN0LCBocmVmKSk7CisgICAgKih2b2lkKiopcCA9IGlwLT5jb3B5OworICAgIGlwLT5jb3B5ID0gcDsKKyAgfQorICByZXR1cm4gcDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZCoKK1NPQVBfRk1BQzIKK3NvYXBfaWRfZW50ZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCB2b2lkICpwLCBpbnQgdCwgc2l6ZV90IG4sIHVuc2lnbmVkIGludCBrLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICphcnJheVR5cGUsIHZvaWQgKigqZmluc3RhbnRpYXRlKShzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKSkKK3sKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgIHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyNlbmRpZgorICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW50ZXIgaWQ9JyVzJyB0eXBlPSVkIGxvYz0lcCBzaXplPSVsdSBsZXZlbD0ldVxuIiwgaWQsIHQsIHAsICh1bnNpZ25lZCBsb25nKW4sIGspKTsKKyAgc29hcC0+YWxsb2NlZCA9IDA7CisgIGlmICghcCkKKyAgeyBpZiAoZmluc3RhbnRpYXRlKQorICAgICAgcCA9IGZpbnN0YW50aWF0ZShzb2FwLCB0LCB0eXBlLCBhcnJheVR5cGUsICZuKTsKKyAgICBlbHNlCisgICAgICBwID0gc29hcF9tYWxsb2Moc29hcCwgbik7CisgICAgaWYgKHApCisgICAgICBzb2FwLT5hbGxvY2VkID0gMTsKKyAgfQorI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgaWYgKCFpZCB8fCAhKmlkKQorI2VuZGlmCisgICAgcmV0dXJuIHA7CisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICBpcCA9IHNvYXBfbG9va3VwKHNvYXAsIGlkKTsgLyogbG9va3VwIHBvaW50ZXIgdG8gaGFzaCB0YWJsZSBlbnRyeSBmb3Igc3RyaW5nIGlkICovCisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJMb29rdXAgZW50cnkgaWQ9JyVzIGZvciBsb2NhdGlvbj0lcCdcbiIsIGlkLCBwKSk7CisgIGlmICghaXApCisgIHsgaXAgPSBzb2FwX2VudGVyKHNvYXAsIGlkKTsgLyogbmV3IGhhc2ggdGFibGUgZW50cnkgZm9yIHN0cmluZyBpZCAqLworICAgIGlwLT50eXBlID0gdDsKKyAgICBpcC0+bGluayA9IE5VTEw7CisgICAgaXAtPmNvcHkgPSBOVUxMOworICAgIGlwLT5mbGlzdCA9IE5VTEw7CisgICAgaXAtPnNpemUgPSBuOworICAgIGlwLT5wdHIgPSBwOworICAgIGlwLT5sZXZlbCA9IGs7CisgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk5ldyBlbnRyeSBpZD0nJXMnIHR5cGU9JWQgc2l6ZT0lbHUgbGV2ZWw9JXUgbG9jYXRpb249JXBcbiIsIGlkLCB0LCAodW5zaWduZWQgbG9uZyluLCBrLCBwKSk7CisgIH0KKyAgZWxzZSBpZiAoKGlwLT50eXBlICE9IHQgfHwgKGlwLT5sZXZlbCA9PSBrICYmIGlwLT5zaXplICE9IG4pKSAmJiAoaXAtPmNvcHkgfHwgaXAtPmZsaXN0KSkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlR5cGUgaW5jb21wYXRpYmlsaXR5IGlkPSclcycgZXhwZWN0IHR5cGU9JWQgc2l6ZT0lbHUgbGV2ZWw9JXUgZ290IHR5cGU9JWQgc2l6ZT0lbHVcbiIsIGlkLCBpcC0+dHlwZSwgKHVuc2lnbmVkIGxvbmcpaXAtPnNpemUsIGssIHQsICh1bnNpZ25lZCBsb25nKW4pKTsKKyAgICBzdHJjcHkoc29hcC0+aWQsIGlkKTsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfSFJFRjsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBlbHNlIGlmIChpcC0+cHRyKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTXVsdGlwbHkgZGVmaW5lZCBpZD0nJXMnXG4iLCBpZCkpOworICAgIHN0cmNweShzb2FwLT5pZCwgaWQpOworICAgIHNvYXAtPmVycm9yID0gU09BUF9EVVBMSUNBVEVfSUQ7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZWxzZSAKKyAgeyBpcC0+c2l6ZSA9IG47CisgICAgaXAtPnB0ciA9IHA7CisgICAgaXAtPmxldmVsID0gazsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVwZGF0ZSBlbnRyeSBpZD0nJXMnIHR5cGU9JWQgbG9jYXRpb249JXAgc2l6ZT0lbHUgbGV2ZWw9JXVcbiIsIGlkLCB0LCBwLCAodW5zaWduZWQgbG9uZyluLCBrKSk7CisgIH0KKyAgcmV0dXJuIGlwLT5wdHI7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZmNvcHkoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdCwgaW50IHR0LCB2b2lkICpwLCBzaXplX3QgbGVuLCBjb25zdCB2b2lkICpxLCBzaXplX3QgbikKK3sgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHlpbmcgZGF0YSB0eXBlPSVkICh0YXJnZXQgdHlwZT0lZCkgJXAgLT4gJXAgKCVsdSBieXRlcylcbiIsIHN0LCB0dCwgcSwgcCwgKHVuc2lnbmVkIGxvbmcpbikpOworICBtZW1jcHkocCwgcSwgbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW5kX3NlbmQoc3RydWN0IHNvYXAgKnNvYXApCit7IAorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+ZGltZS5saXN0KQorICB7IC8qIFNPQVAgYm9keSByZWZlcmVuY2VkIGF0dGFjaG1lbnRzIG11c3QgYXBwZWFyIGZpcnN0ICovCisgICAgc29hcC0+ZGltZS5sYXN0LT5uZXh0ID0gc29hcC0+ZGltZS5maXJzdDsKKyAgICBzb2FwLT5kaW1lLmZpcnN0ID0gc29hcC0+ZGltZS5saXN0LT5uZXh0OworICAgIHNvYXAtPmRpbWUubGlzdC0+bmV4dCA9IE5VTEw7CisgICAgc29hcC0+ZGltZS5sYXN0ID0gc29hcC0+ZGltZS5saXN0OworICB9CisgIGlmIChzb2FwX3B1dGRpbWUoc29hcCkgfHwgc29hcF9wdXRtaW1lKHNvYXApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgc29hcC0+bWltZS5saXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGlzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmxhc3QgPSBOVUxMOworI2VuZGlmCisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIHNlbmRcbiIpKTsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSAvKiBuZWVkIHRvIGZsdXNoIHRoZSByZW1haW5pbmcgZGF0YSBpbiBidWZmZXIgKi8KKyAgeyBpZiAoc29hcF9mbHVzaChzb2FwKSkKKyNpZmRlZiBXSVRIX1pMSUIKKyAgICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQiAmJiBzb2FwLT56bGliX3N0YXRlID09IFNPQVBfWkxJQl9ERUZMQVRFKQorICAgICAgeyBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX05PTkU7CisgICAgICAgIGRlZmxhdGVFbmQoJnNvYXAtPmRfc3RyZWFtKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisjZWxzZQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2VuZGlmCisjaWZkZWYgV0lUSF9aTElCCisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKQorICAgIHsgaW50IHI7CisgICAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbiA9IDA7CisgICAgICBkbworICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlZmxhdGluZyByZW1haW5kZXJcbiIpKTsKKyAgICAgICAgciA9IGRlZmxhdGUoJnNvYXAtPmRfc3RyZWFtLCBaX0ZJTklTSCk7CisgICAgICAgIGlmIChzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgIT0gU09BUF9CVUZMRU4pCisgICAgICAgIHsgaWYgKHNvYXBfZmx1c2hfcmF3KHNvYXAsIHNvYXAtPnpfYnVmLCBTT0FQX0JVRkxFTiAtIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCkpCisgICAgICAgICAgeyBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX05PTkU7CisgICAgICAgICAgICBkZWZsYXRlRW5kKCZzb2FwLT5kX3N0cmVhbSk7CisgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisJICB9CisgICAgICAgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZSopc29hcC0+el9idWY7CisgICAgICAgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0ID0gU09BUF9CVUZMRU47CisgICAgICAgIH0KKyAgICAgIH0gd2hpbGUgKHIgPT0gWl9PSyk7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlZmxhdGVkICVsdS0+JWx1IGJ5dGVzXG4iLCBzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiwgc29hcC0+ZF9zdHJlYW0udG90YWxfb3V0KSk7CisgICAgICBzb2FwLT56X3JhdGlvX291dCA9IChmbG9hdClzb2FwLT5kX3N0cmVhbS50b3RhbF9vdXQgLyAoZmxvYXQpc29hcC0+ZF9zdHJlYW0udG90YWxfaW47CisgICAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0VOQ19aTElCOworICAgICAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9OT05FOworICAgICAgaWYgKGRlZmxhdGVFbmQoJnNvYXAtPmRfc3RyZWFtKSAhPSBaX09LIHx8IHIgIT0gWl9TVFJFQU1fRU5EKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVuYWJsZSB0byBlbmQgZGVmbGF0ZTogJXNcbiIsIHNvYXAtPmRfc3RyZWFtLm1zZz9zb2FwLT5kX3N0cmVhbS5tc2c6IiIpKTsKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgfQorI2lmZGVmIFdJVEhfR1pJUAorICAgICAgc29hcC0+el9idWZbMF0gPSBzb2FwLT56X2NyYyAmIDB4RkY7CisgICAgICBzb2FwLT56X2J1ZlsxXSA9IChzb2FwLT56X2NyYyA+PiA4KSAmIDB4RkY7CisgICAgICBzb2FwLT56X2J1ZlsyXSA9IChzb2FwLT56X2NyYyA+PiAxNikgJiAweEZGOworICAgICAgc29hcC0+el9idWZbM10gPSAoc29hcC0+el9jcmMgPj4gMjQpICYgMHhGRjsKKyAgICAgIHNvYXAtPnpfYnVmWzRdID0gc29hcC0+ZF9zdHJlYW0udG90YWxfaW4gJiAweEZGOworICAgICAgc29hcC0+el9idWZbNV0gPSAoc29hcC0+ZF9zdHJlYW0udG90YWxfaW4gPj4gOCkgJiAweEZGOworICAgICAgc29hcC0+el9idWZbNl0gPSAoc29hcC0+ZF9zdHJlYW0udG90YWxfaW4gPj4gMTYpICYgMHhGRjsKKyAgICAgIHNvYXAtPnpfYnVmWzddID0gKHNvYXAtPmRfc3RyZWFtLnRvdGFsX2luID4+IDI0KSAmIDB4RkY7CisgICAgICBpZiAoc29hcF9mbHVzaF9yYXcoc29hcCwgc29hcC0+el9idWYsIDgpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImd6aXAgY3JjMzI9JWx1XG4iLCAodW5zaWduZWQgbG9uZylzb2FwLT56X2NyYykpOworI2VuZGlmCisgICAgfQorI2VuZGlmCisgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19TVE9SRSkKKyAgICB7IGNoYXIgKnA7CisjaWZuZGVmIFdJVEhfTk9IVFRQCisgICAgICBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9FTkNfWE1MKSkKKyAgICAgIHsgc29hcC0+bW9kZS0tOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNlbmRpbmcgYnVmZmVyZWQgbWVzc2FnZSBvZiBsZW5ndGggJXVcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+Ymxpc3QtPnNpemUpKTsKKyAgICAgICAgaWYgKHNvYXAtPnN0YXR1cyA+PSBTT0FQX1BPU1QpCisgICAgICAgICAgc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdChzb2FwLCBzb2FwLT5lbmRwb2ludCwgc29hcC0+aG9zdCwgc29hcC0+cG9ydCwgc29hcC0+cGF0aCwgc29hcC0+YWN0aW9uLCBzb2FwLT5ibGlzdC0+c2l6ZSk7CisgICAgICAgIGVsc2UgaWYgKHNvYXAtPnN0YXR1cyAhPSBTT0FQX1NUT1ApCisgICAgICAgICAgc29hcC0+ZXJyb3IgPSBzb2FwLT5mcmVzcG9uc2Uoc29hcCwgc29hcC0+c3RhdHVzLCBzb2FwLT5ibGlzdC0+c2l6ZSk7CisgICAgICAgIGlmIChzb2FwLT5lcnJvciB8fCBzb2FwX2ZsdXNoKHNvYXApKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgc29hcC0+bW9kZSsrOworICAgICAgfQorI2VuZGlmCisgICAgICBmb3IgKHAgPSBzb2FwX2ZpcnN0X2Jsb2NrKHNvYXApOyBwOyBwID0gc29hcF9uZXh0X2Jsb2NrKHNvYXApKQorICAgICAgeyBEQkdNU0coU0VOVCwgcCwgc29hcF9ibG9ja19zaXplKHNvYXApKTsKKyAgICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZzZW5kKHNvYXAsIHAsIHNvYXBfYmxvY2tfc2l6ZShzb2FwKSkpKQorICAgICAgICB7IHNvYXBfZW5kX2Jsb2NrKHNvYXApOworICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc29hcF9lbmRfYmxvY2soc29hcCk7CisgICAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICAgIGVsc2UgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgICB7IERCR01TRyhTRU5ULCAiXHJcbjBcclxuXHJcbiIsIDcpOworICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZzZW5kKHNvYXAsICJcclxuMFxyXG5cclxuIiwgNykpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorI2VuZGlmCisgIH0KKyNpZmRlZiBXSVRIX1RDUEZJTgorI2lmZGVmIFdJVEhfT1BFTlNTTAorICBpZiAoIXNvYXAtPnNzbCAmJiBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpICYmICFzb2FwLT5rZWVwX2FsaXZlICYmICEoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgc29hcC0+ZnNodXRkb3duc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIDEpOyAvKiBTZW5kIFRDUCBGSU4gKi8KKyNlbHNlCisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpICYmICFzb2FwLT5rZWVwX2FsaXZlICYmICEoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgc29hcC0+ZnNodXRkb3duc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIDEpOyAvKiBTZW5kIFRDUCBGSU4gKi8KKyNlbmRpZgorI2VuZGlmCisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIG9mIHNlbmQgcGhhc2VcbiIpKTsKKyAgc29hcC0+b21vZGUgJj0gflNPQVBfWE1MX1NFQzsKKyAgc29hcC0+Y291bnQgPSAwOworICBzb2FwLT5wYXJ0ID0gU09BUF9FTkQ7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VuZF9yZWN2KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5wYXJ0ID0gU09BUF9FTkQ7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpICYmIHNvYXBfZ2V0ZGltZShzb2FwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHNvYXAtPmRpbWUubGlzdCA9IHNvYXAtPmRpbWUuZmlyc3Q7CisgIHNvYXAtPmRpbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmxhc3QgPSBOVUxMOworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKSAmJiBzb2FwX2dldG1pbWUoc29hcCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBzb2FwLT5taW1lLmxpc3QgPSBzb2FwLT5taW1lLmZpcnN0OworICBzb2FwLT5taW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5sYXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5ib3VuZGFyeSA9IE5VTEw7CisjZW5kaWYKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBvZiByZWNlaXZlIG1lc3NhZ2Ugb2tcbiIpKTsKKyNpZmRlZiBXSVRIX1pMSUIKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKQorICB7IHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX1pMSUI7CisgICAgbWVtY3B5KHNvYXAtPmJ1Ziwgc29hcC0+el9idWYsIFNPQVBfQlVGTEVOKTsKKyAgICBzb2FwLT5idWZpZHggPSAoY2hhciopc29hcC0+ZF9zdHJlYW0ubmV4dF9pbiAtIHNvYXAtPnpfYnVmOworICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPnpfYnVmbGVuOworICAgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfTk9ORTsKKyAgICBpZiAoaW5mbGF0ZUVuZCgmc29hcC0+ZF9zdHJlYW0pICE9IFpfT0spCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisjaWZkZWYgV0lUSF9HWklQCisgICAgaWYgKHNvYXAtPnpsaWJfaW4gPT0gU09BUF9aTElCX0daSVApCisgICAgeyBzb2FwX3djaGFyIGM7CisgICAgICBzaG9ydCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgIHsgaWYgKChpbnQpKGMgPSBzb2FwX2dldGNoYXIoc29hcCkpID09IEVPRikKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAgICAgc29hcC0+el9idWZbaV0gPSAoY2hhciljOworICAgICAgfQorICAgICAgaWYgKHNvYXAtPnpfY3JjICE9ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbMF0gfCAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzFdIDw8IDgpIHwgKCh1TG9uZykodW5zaWduZWQgY2hhcilzb2FwLT56X2J1ZlsyXSA8PCAxNikgfCAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzNdIDw8IDI0KSkpCisgICAgICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJHemlwIGVycm9yOiBjcmMgY2hlY2sgZmFpbGVkLCBtZXNzYWdlIGNvcnJ1cHRlZD8gKGNyYzMyPSVsdSlcbiIsICh1bnNpZ25lZCBsb25nKXNvYXAtPnpfY3JjKSk7CisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICAgIH0KKyAgICAgIGlmIChzb2FwLT5kX3N0cmVhbS50b3RhbF9vdXQgIT0gKCh1TG9uZykodW5zaWduZWQgY2hhcilzb2FwLT56X2J1Zls0XSB8ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbNV0gPDwgOCkgfCAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzZdIDw8IDE2KSB8ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbN10gPDwgMjQpKSkKKyAgICAgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkd6aXAgZXJyb3I6IGluY29ycmVjdCBtZXNzYWdlIGxlbmd0aFxuIikpOworICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgICB9CisgICAgfQorI2VuZGlmCisgIH0KKyNlbmRpZgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKQorICAgIHdoaWxlICgoaW50KXNvYXBfZ2V0Y2hhcihzb2FwKSAhPSBFT0YpIC8qIGFkdmFuY2UgdG8gbGFzdCBjaHVuayAqLworICAgICAgOworICBpZiAoc29hcC0+ZmRpc2Nvbm5lY3QgJiYgKHNvYXAtPmVycm9yID0gc29hcC0+ZmRpc2Nvbm5lY3Qoc29hcCkpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgIHJldHVybiBzb2FwX3Jlc29sdmUoc29hcCk7CisjZWxzZQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+eGxpc3QpCisgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9NSU1FX0hSRUY7CisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9ESU1FX0hSRUY7CisgIH0KKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9mcmVlKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzdHJ1Y3QgTmFtZXNwYWNlICpuczsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIG5hbWVzcGFjZSBzdGFja1xuIikpOworICB3aGlsZSAoc29hcC0+bmxpc3QpCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wID0gc29hcC0+bmxpc3QtPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPm5saXN0KTsKKyAgICBzb2FwLT5ubGlzdCA9IG5wOworICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZSBhbnkgcmVtYWluaW5nIHRlbXAgYmxvY2tzXG4iKSk7CisgIHdoaWxlIChzb2FwLT5ibGlzdCkKKyAgICBzb2FwX2VuZF9ibG9jayhzb2FwKTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIGF0dHJpYnV0ZSBzdG9yYWdlXG4iKSk7CisgIHdoaWxlIChzb2FwLT5hdHRyaWJ1dGVzKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqdHAgPSBzb2FwLT5hdHRyaWJ1dGVzLT5uZXh0OworICAgIGlmIChzb2FwLT5hdHRyaWJ1dGVzLT52YWx1ZSkKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5hdHRyaWJ1dGVzLT52YWx1ZSk7CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPmF0dHJpYnV0ZXMpOworICAgIHNvYXAtPmF0dHJpYnV0ZXMgPSB0cDsKKyAgfQorI2lmZGVmIFdJVEhfRkFTVAorICBpZiAoc29hcC0+bGFiYnVmKQorICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5sYWJidWYpOworICBzb2FwLT5sYWJidWYgPSBOVUxMOworICBzb2FwLT5sYWJsZW4gPSAwOworICBzb2FwLT5sYWJpZHggPSAwOworI2VuZGlmCisgIG5zID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlczsKKyAgaWYgKG5zKQorICB7IGZvciAoOyBucy0+aWQ7IG5zKyspCisgICAgeyBpZiAobnMtPm91dCkKKyAgICAgIHsgaWYgKHNvYXAtPmVuY29kaW5nU3R5bGUgPT0gbnMtPm91dCkKKyAgICAgICAgICBzb2FwLT5lbmNvZGluZ1N0eWxlID0gU09BUF9TVFJfRU9TOworICAgICAgICBTT0FQX0ZSRUUoc29hcCwgbnMtPm91dCk7CisgICAgICAgIG5zLT5vdXQgPSBOVUxMOworICAgICAgfQorICAgICAgaWYgKHNvYXAtPmVuY29kaW5nU3R5bGUgPT0gbnMtPm5zKQorICAgICAgICBzb2FwLT5lbmNvZGluZ1N0eWxlID0gU09BUF9TVFJfRU9TOworICAgIH0KKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+bG9jYWxfbmFtZXNwYWNlcyk7CisgICAgc29hcC0+bG9jYWxfbmFtZXNwYWNlcyA9IE5VTEw7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgd2hpbGUgKHNvYXAtPnhsaXN0KQorICB7IHN0cnVjdCBzb2FwX3hsaXN0ICp4cCA9IHNvYXAtPnhsaXN0LT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT54bGlzdCk7CisgICAgc29hcC0+eGxpc3QgPSB4cDsKKyAgfQorI2VuZGlmCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICBzb2FwX2ZyZWVfcGh0KHNvYXApOworICBzb2FwX2ZyZWVfaWh0KHNvYXApOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitzdGF0aWMgdm9pZAorc29hcF9pbml0X2xvZ3Moc3RydWN0IHNvYXAgKnNvYXApCit7IGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9NQVhMT0dTOyBpKyspCisgIHsgc29hcC0+bG9nZmlsZVtpXSA9IE5VTEw7CisgICAgc29hcC0+ZmRlYnVnW2ldID0gTlVMTDsKKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgIWRlZmluZWQoV0lUSF9MRUFOKSB8fCBkZWZpbmVkKFNPQVBfREVCVUcpCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX29wZW5fbG9nZmlsZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGkpCit7IGlmIChzb2FwLT5sb2dmaWxlW2ldKQorICAgIHNvYXAtPmZkZWJ1Z1tpXSA9IGZvcGVuKHNvYXAtPmxvZ2ZpbGVbaV0sIGkgPCAyID8gImFiIiA6ICJhIik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitzdGF0aWMgdm9pZAorc29hcF9jbG9zZV9sb2dmaWxlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgaSkKK3sgaWYgKHNvYXAtPmZkZWJ1Z1tpXSkKKyAgeyBmY2xvc2Uoc29hcC0+ZmRlYnVnW2ldKTsKKyAgICBzb2FwLT5mZGVidWdbaV0gPSBOVUxMOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2Nsb3NlX2xvZ2ZpbGVzKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfTUFYTE9HUzsgaSsrKQorICAgIHNvYXBfY2xvc2VfbG9nZmlsZShzb2FwLCBpKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK3N0YXRpYyB2b2lkCitzb2FwX3NldF9sb2dmaWxlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgaSwgY29uc3QgY2hhciAqbG9nZmlsZSkKK3sgY2hhciAqcyA9IE5VTEw7CisgIHNvYXBfY2xvc2VfbG9nZmlsZShzb2FwLCBpKTsKKyAgaWYgKHNvYXAtPmxvZ2ZpbGVbaV0pCisgICAgU09BUF9GUkVFKHNvYXAsICh2b2lkKilzb2FwLT5sb2dmaWxlW2ldKTsKKyAgaWYgKGxvZ2ZpbGUpCisgICAgaWYgKChzID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihsb2dmaWxlKSArIDEpKSkKKyAgICAgIHN0cmNweShzLCBsb2dmaWxlKTsKKyAgc29hcC0+bG9nZmlsZVtpXSA9IHM7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9yZWN2X2xvZ2ZpbGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmxvZ2ZpbGUpCit7IHNvYXBfc2V0X2xvZ2ZpbGUoc29hcCwgU09BUF9JTkRFWF9SRUNWLCBsb2dmaWxlKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X3NlbnRfbG9nZmlsZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbG9nZmlsZSkKK3sgc29hcF9zZXRfbG9nZmlsZShzb2FwLCBTT0FQX0lOREVYX1NFTlQsIGxvZ2ZpbGUpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfdGVzdF9sb2dmaWxlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpsb2dmaWxlKQoreyBzb2FwX3NldF9sb2dmaWxlKHNvYXAsIFNPQVBfSU5ERVhfVEVTVCwgbG9nZmlsZSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcCoKK1NPQVBfRk1BQzIKK3NvYXBfY29weShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmV0dXJuIHNvYXBfY29weV9jb250ZXh0KChzdHJ1Y3Qgc29hcCopbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc29hcCkpLCBzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwKgorU09BUF9GTUFDMgorc29hcF9jb3B5X2NvbnRleHQoc3RydWN0IHNvYXAgKmNvcHksIHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcF9jaGVja19zdGF0ZShzb2FwKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKGNvcHkpCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGx1Z2luICpwOworICAgIG1lbWNweShjb3B5LCBzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXApKTsKKyAgICBjb3B5LT5zdGF0ZSA9IFNPQVBfQ09QWTsKKyAgICBjb3B5LT51c2VyID0gTlVMTDsKKyAgICBjb3B5LT5lcnJvciA9IFNPQVBfT0s7CisgICAgY29weS0+dXNlcmlkID0gTlVMTDsKKyAgICBjb3B5LT5wYXNzd2QgPSBOVUxMOworICAgIGNvcHktPm5saXN0ID0gTlVMTDsKKyAgICBjb3B5LT5ibGlzdCA9IE5VTEw7CisgICAgY29weS0+Y2xpc3QgPSBOVUxMOworICAgIGNvcHktPmFsaXN0ID0gTlVMTDsKKyAgICBjb3B5LT5hdHRyaWJ1dGVzID0gTlVMTDsKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgICBjb3B5LT5sYWJidWYgPSBOVUxMOworICAgIGNvcHktPmxhYmxlbiA9IDA7CisgICAgY29weS0+bGFiaWR4ID0gMDsKKyNlbmRpZgorI2lmZGVmIFNPQVBfREVCVUcKKyAgICBzb2FwX2luaXRfbWh0KGNvcHkpOworI2VuZGlmCisgICAgY29weS0+bG9jYWxfbmFtZXNwYWNlcyA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICAgIHNvYXBfaW5pdF9paHQoY29weSk7CisgICAgc29hcF9pbml0X3BodChjb3B5KTsKKyNlbmRpZgorICAgIGNvcHktPmhlYWRlciA9IE5VTEw7CisgICAgY29weS0+ZmF1bHQgPSBOVUxMOworICAgIGNvcHktPmFjdGlvbiA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorI2lmZGVmIFdJVEhfQ09PS0lFUworICAgIGNvcHktPmNvb2tpZXMgPSBzb2FwX2NvcHlfY29va2llcyhjb3B5KTsKKyNlbHNlCisgICAgY29weS0+Y29va2llcyA9IE5VTEw7CisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIFNPQVBfREVCVUcKKyAgICBzb2FwX2luaXRfbG9ncyhjb3B5KTsKKyAgICBzb2FwX3NldF9yZWN2X2xvZ2ZpbGUoY29weSwgc29hcC0+bG9nZmlsZVtTT0FQX0lOREVYX1JFQ1ZdKTsKKyAgICBzb2FwX3NldF9zZW50X2xvZ2ZpbGUoY29weSwgc29hcC0+bG9nZmlsZVtTT0FQX0lOREVYX1NFTlRdKTsKKyAgICBzb2FwX3NldF90ZXN0X2xvZ2ZpbGUoY29weSwgc29hcC0+bG9nZmlsZVtTT0FQX0lOREVYX1RFU1RdKTsKKyNlbmRpZgorICAgIGNvcHktPnBsdWdpbnMgPSBOVUxMOworICAgIGZvciAocCA9IHNvYXAtPnBsdWdpbnM7IHA7IHAgPSBwLT5uZXh0KQorICAgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGx1Z2luICpxID0gKHN0cnVjdCBzb2FwX3BsdWdpbiopU09BUF9NQUxMT0MoY29weSwgc2l6ZW9mKHN0cnVjdCBzb2FwX3BsdWdpbikpOworICAgICAgaWYgKCFxKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weWluZyBwbHVnaW4gJyVzJ1xuIiwgcC0+aWQpKTsKKyAgICAgICpxID0gKnA7CisgICAgICBpZiAocC0+ZmNvcHkgJiYgKHNvYXAtPmVycm9yID0gcC0+ZmNvcHkoY29weSwgcSwgcCkpKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBjb3B5IHBsdWdpbiAnJXMnXG4iLCBwLT5pZCkpOworICAgICAgICBTT0FQX0ZSRUUoY29weSwgcSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgcS0+bmV4dCA9IGNvcHktPnBsdWdpbnM7CisgICAgICBjb3B5LT5wbHVnaW5zID0gcTsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgIHJldHVybiBjb3B5OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9pbml0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5zdGF0ZSA9IFNPQVBfSU5JVDsKKyAgc29hcC0+dmVyc2lvbiA9IDA7CisgIHNvYXBfaW1vZGUoc29hcCwgU09BUF9JT19ERUZBVUxUKTsKKyAgc29hcF9vbW9kZShzb2FwLCBTT0FQX0lPX0RFRkFVTFQpOworICBzb2FwLT5wbHVnaW5zID0gTlVMTDsKKyAgc29hcC0+dXNlciA9IE5VTEw7CisgIHNvYXAtPnVzZXJpZCA9IE5VTEw7CisgIHNvYXAtPnBhc3N3ZCA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTk9IVFRQCisgIHNvYXAtPmZwb3N0ID0gaHR0cF9wb3N0OworICBzb2FwLT5mZ2V0ID0gaHR0cF9nZXQ7CisgIHNvYXAtPmZmb3JtID0gTlVMTDsKKyAgc29hcC0+ZnBvc3RoZHIgPSBodHRwX3Bvc3RfaGVhZGVyOworICBzb2FwLT5mcmVzcG9uc2UgPSBodHRwX3Jlc3BvbnNlOworICBzb2FwLT5mcGFyc2UgPSBodHRwX3BhcnNlOworICBzb2FwLT5mcGFyc2VoZHIgPSBodHRwX3BhcnNlX2hlYWRlcjsKKyNlbmRpZgorICBzb2FwLT5mY29ubmVjdCA9IE5VTEw7CisgIHNvYXAtPmZkaXNjb25uZWN0ID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfSVBWNgorICBzb2FwLT5mcmVzb2x2ZSA9IHRjcF9nZXRob3N0OworI2Vsc2UKKyAgc29hcC0+ZnJlc29sdmUgPSBOVUxMOworI2VuZGlmCisgIHNvYXAtPmZhY2NlcHQgPSB0Y3BfYWNjZXB0OworICBzb2FwLT5mb3BlbiA9IHRjcF9jb25uZWN0OworICBzb2FwLT5mY2xvc2UgPSB0Y3BfZGlzY29ubmVjdDsKKyAgc29hcC0+ZmNsb3Nlc29ja2V0ID0gdGNwX2Nsb3Nlc29ja2V0OworICBzb2FwLT5mc2h1dGRvd25zb2NrZXQgPSB0Y3Bfc2h1dGRvd25zb2NrZXQ7CisgIHNvYXAtPmZzZW5kID0gZnNlbmQ7CisgIHNvYXAtPmZyZWN2ID0gZnJlY3Y7CisgIHNvYXAtPmZwb2xsID0gc29hcF9wb2xsOworI2Vsc2UKKyAgc29hcC0+Zm9wZW4gPSBOVUxMOworICBzb2FwLT5mY2xvc2UgPSBOVUxMOworICBzb2FwLT5mcG9sbCA9IE5VTEw7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcC0+ZnByZXBhcmVpbml0ID0gTlVMTDsKKyAgc29hcC0+ZnByZXBhcmVzZW5kID0gTlVMTDsKKyAgc29hcC0+ZnByZXBhcmVyZWN2ID0gTlVMTDsKKyAgc29hcC0+ZnByZXBhcmVmaW5hbCA9IE5VTEw7CisjZW5kaWYKKyAgc29hcC0+ZnNldGVycm9yID0gTlVMTDsKKyAgc29hcC0+Zmlnbm9yZSA9IE5VTEw7CisgIHNvYXAtPmZzZXJ2ZWxvb3AgPSBOVUxMOworICBzb2FwLT5mcGx1Z2luID0gZnBsdWdpbjsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcC0+ZmRpbWVyZWFkb3BlbiA9IE5VTEw7CisgIHNvYXAtPmZkaW1ld3JpdGVvcGVuID0gTlVMTDsKKyAgc29hcC0+ZmRpbWVyZWFkY2xvc2UgPSBOVUxMOworICBzb2FwLT5mZGltZXdyaXRlY2xvc2UgPSBOVUxMOworICBzb2FwLT5mZGltZXJlYWQgPSBOVUxMOworICBzb2FwLT5mZGltZXdyaXRlID0gTlVMTDsKKyNlbmRpZgorICBzb2FwLT5mbG9hdF9mb3JtYXQgPSAiJS44ZyI7IC8qIC44IHByZXNlcnZlcyBzaW5nbGUgRlAgcHJlY2lzaW9uIGFzIG11Y2ggYXMgcG9zc2libGUsIGJ1dCBtaWdodCBub3QgYmUgdmVyeSBlZmZpY2llbnQgKi8KKyAgc29hcC0+ZG91YmxlX2Zvcm1hdCA9ICIlLjE3bGciOyAvKiAuMTcgcHJlc2VydmVzIGRvdWJsZSBGUCBwcmVjaXNpb24gYXMgbXVjaCBhcyBwb3NzaWJsZSwgYnV0IG1pZ2h0IG5vdCBiZSB2ZXJ5IGVmZmljaWVudCAqLworICBzb2FwLT5kaW1lX2lkX2Zvcm1hdCA9ICJjaWQ6aWQlZCI7IC8qIGRlZmF1bHQgRElNRSBpZCBmb3JtYXQgKi8KKyAgc29hcC0+aHR0cF92ZXJzaW9uID0gIjEuMSI7CisgIHNvYXAtPmFjdG9yID0gTlVMTDsKKyAgc29hcC0+bWF4X2tlZXBfYWxpdmUgPSBTT0FQX01BWEtFRVBBTElWRTsKKyAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7CisgIHNvYXAtPnJlY3ZfdGltZW91dCA9IDA7CisgIHNvYXAtPnNlbmRfdGltZW91dCA9IDA7CisgIHNvYXAtPmNvbm5lY3RfdGltZW91dCA9IDA7CisgIHNvYXAtPmFjY2VwdF90aW1lb3V0ID0gMDsKKyAgc29hcC0+c29ja2V0X2ZsYWdzID0gMDsKKyAgc29hcC0+Y29ubmVjdF9mbGFncyA9IDA7CisgIHNvYXAtPmJpbmRfZmxhZ3MgPSAwOworICBzb2FwLT5hY2NlcHRfZmxhZ3MgPSAwOworICBzb2FwLT5pcCA9IDA7CisjaWZkZWYgV0lUSF9GQVNUCisgIHNvYXAtPmxhYmJ1ZiA9IE5VTEw7CisgIHNvYXAtPmxhYmxlbiA9IDA7CisgIHNvYXAtPmxhYmlkeCA9IDA7CisjZW5kaWYKKyAgc29hcC0+ZW5jb2RpbmdTdHlsZSA9IFNPQVBfU1RSX0VPUzsKKyNpZm5kZWYgV0lUSF9OT05BTUVTUEFDRVMKKyAgc29hcC0+bmFtZXNwYWNlcyA9IG5hbWVzcGFjZXM7CisjZWxzZQorICBzb2FwLT5uYW1lc3BhY2VzID0gTlVMTDsKKyNlbmRpZgorICBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzID0gTlVMTDsKKyAgc29hcC0+bmxpc3QgPSBOVUxMOworICBzb2FwLT5ibGlzdCA9IE5VTEw7CisgIHNvYXAtPmNsaXN0ID0gTlVMTDsKKyAgc29hcC0+YWxpc3QgPSBOVUxMOworICBzb2FwLT5hdHRyaWJ1dGVzID0gTlVMTDsKKyAgc29hcC0+aGVhZGVyID0gTlVMTDsKKyAgc29hcC0+ZmF1bHQgPSBOVUxMOworICBzb2FwLT5tYXN0ZXIgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICBzb2FwLT5zb2NrZXQgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICBzb2FwLT5vcyA9IE5VTEw7CisgIHNvYXAtPmlzID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcC0+ZG9tID0gTlVMTDsKKyAgc29hcC0+ZGltZS5saXN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGlzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmxhc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gTlVMTDsKKyAgc29hcC0+bWltZS5zdGFydCA9IE5VTEw7CisgIHNvYXAtPnhsaXN0ID0gTlVMTDsKKyNlbmRpZgorI2lmbmRlZiBVTkRFUl9DRQorICBzb2FwLT5yZWN2ZmQgPSAwOworICBzb2FwLT5zZW5kZmQgPSAxOworI2Vsc2UKKyAgc29hcC0+cmVjdmZkID0gc3RkaW47CisgIHNvYXAtPnNlbmRmZCA9IHN0ZG91dDsKKyNlbmRpZiAKKyAgc29hcC0+aG9zdFswXSA9ICdcMCc7CisgIHNvYXAtPnBvcnQgPSAwOworICBzb2FwLT5hY3Rpb24gPSBOVUxMOworICBzb2FwLT5wcm94eV9ob3N0ID0gTlVMTDsKKyAgc29hcC0+cHJveHlfcG9ydCA9IDgwODA7CisgIHNvYXAtPnByb3h5X3VzZXJpZCA9IE5VTEw7CisgIHNvYXAtPnByb3h5X3Bhc3N3ZCA9IE5VTEw7CisgIHNvYXAtPmF1dGhyZWFsbSA9IE5VTEw7CisgIHNvYXAtPnByb2xvZyA9IE5VTEw7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgIGlmICghc3NsX2luaXRfZG9uZSkKKyAgICBzb2FwX3NzbF9pbml0KCk7CisgIHNvYXAtPmZzc2xhdXRoID0gc3NsX2F1dGhfaW5pdDsKKyAgc29hcC0+ZnNzbHZlcmlmeSA9IHNzbF92ZXJpZnlfY2FsbGJhY2s7CisgIHNvYXAtPmJpbyA9IE5VTEw7CisgIHNvYXAtPnNzbCA9IE5VTEw7CisgIHNvYXAtPmN0eCA9IE5VTEw7CisgIHNvYXAtPnJlcXVpcmVfc2VydmVyX2F1dGggPSAwOworICBzb2FwLT5yZXF1aXJlX2NsaWVudF9hdXRoID0gMDsKKyAgc29hcC0+cnNhID0gMDsKKyAgc29hcC0+a2V5ZmlsZSA9IE5VTEw7CisgIHNvYXAtPnBhc3N3b3JkID0gTlVMTDsKKyAgc29hcC0+ZGhmaWxlID0gTlVMTDsKKyAgc29hcC0+Y2FmaWxlID0gTlVMTDsKKyAgc29hcC0+Y2FwYXRoID0gTlVMTDsKKyAgc29hcC0+Y3JsZmlsZSA9IE5VTEw7CisgIHNvYXAtPnJhbmRmaWxlID0gTlVMTDsKKyAgc29hcC0+c2Vzc2lvbiA9IE5VTEw7CisjZW5kaWYKKyNpZmRlZiBXSVRIX1pMSUIKKyAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9OT05FOworICBzb2FwLT56bGliX2luID0gU09BUF9aTElCX05PTkU7CisgIHNvYXAtPnpsaWJfb3V0ID0gU09BUF9aTElCX05PTkU7CisgIHNvYXAtPmRfc3RyZWFtLnphbGxvYyA9IE5VTEw7CisgIHNvYXAtPmRfc3RyZWFtLnpmcmVlID0gTlVMTDsKKyAgc29hcC0+ZF9zdHJlYW0ub3BhcXVlID0gTlVMTDsKKyAgc29hcC0+el9sZXZlbCA9IDY7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIHNvYXAtPmMxNG5pbmNsdWRlID0gTlVMTDsKKyAgc29hcC0+YzE0bmV4Y2x1ZGUgPSBOVUxMOworICBzb2FwLT5jb29raWVzID0gTlVMTDsKKyAgc29hcC0+Y29va2llX2RvbWFpbiA9IE5VTEw7CisgIHNvYXAtPmNvb2tpZV9wYXRoID0gTlVMTDsKKyAgc29hcC0+Y29va2llX21heCA9IDMyOworI2VuZGlmCisjaWZkZWYgU09BUF9ERUJVRworICBzb2FwX2luaXRfbWh0KHNvYXApOworICBzb2FwX2luaXRfbG9ncyhzb2FwKTsKKyAgc29hcF9zZXRfcmVjdl9sb2dmaWxlKHNvYXAsICJSRUNWLmxvZyIpOworICBzb2FwX3NldF9zZW50X2xvZ2ZpbGUoc29hcCwgIlNFTlQubG9nIik7CisgIHNvYXBfc2V0X3Rlc3RfbG9nZmlsZShzb2FwLCBOVUxMKTsKKyNlbmRpZgorI2lmZGVmIFdNV19SUE1fSU8KKyAgc29hcC0+cnBtcmVxaWQgPSBOVUxMOworI2VuZGlmCisjaWZkZWYgUEFMTQorICBwYWxtTmV0TGliT3BlbigpOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICBzb2FwX2luaXRfaWh0KHNvYXApOworICBzb2FwX2luaXRfcGh0KHNvYXApOworI2VuZGlmCisgIHNvYXBfYmVnaW4oc29hcCk7CisjaWZkZWYgU09BUF9ERUJVRworICBzb2FwX3NldF90ZXN0X2xvZ2ZpbGUoc29hcCwgIlRFU1QubG9nIik7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfaW5pdDEoc3RydWN0IHNvYXAgKnNvYXAsIHNvYXBfbW9kZSBtb2RlKQoreyBzb2FwX2luaXQyKHNvYXAsIG1vZGUsIG1vZGUpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9pbml0MihzdHJ1Y3Qgc29hcCAqc29hcCwgc29hcF9tb2RlIGltb2RlLCBzb2FwX21vZGUgb21vZGUpCit7IHNvYXBfaW5pdChzb2FwKTsKKyAgc29hcF9pbW9kZShzb2FwLCBpbW9kZSk7CisgIHNvYXBfb21vZGUoc29hcCwgb21vZGUpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9iZWdpbihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbml0aWFsaXppbmdcbiIpKTsKKyAgaWYgKCFzb2FwLT5rZWVwX2FsaXZlKQorICB7IHNvYXAtPmJ1ZmxlbiA9IDA7CisgICAgc29hcC0+YnVmaWR4ID0gMDsKKyAgfQorICBzb2FwLT5rZWVwX2FsaXZlID0gKCgoc29hcC0+aW1vZGUgfCBzb2FwLT5vbW9kZSkgJiBTT0FQX0lPX0tFRVBBTElWRSkgIT0gMCk7CisgIHNvYXAtPm51bGwgPSAwOworICBzb2FwLT5wb3NpdGlvbiA9IDA7CisgIHNvYXAtPmVuY29kaW5nID0gMDsKKyAgc29hcC0+bXVzdFVuZGVyc3RhbmQgPSAwOworICBzb2FwLT5tb2RlID0gMDsKKyAgc29hcC0+bnMgPSAwOworICBzb2FwLT5wYXJ0ID0gU09BUF9FTkQ7CisgIHNvYXAtPmFsbG9jZWQgPSAwOworICBzb2FwLT5jb3VudCA9IDA7CisgIHNvYXAtPmxlbmd0aCA9IDA7CisgIHNvYXAtPmNkYXRhID0gMDsKKyAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICBzb2FwLT5wZWVrZWQgPSAwOworICBzb2FwLT5haGVhZCA9IDA7CisgIHNvYXAtPmlkbnVtID0gMDsKKyAgc29hcC0+bGV2ZWwgPSAwOworICBzb2FwLT5lbmRwb2ludFswXSA9ICdcMCc7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXAtPmRpbWUuY2h1bmtzaXplID0gMDsKKyAgc29hcC0+ZGltZS5idWZsZW4gPSAwOworI2VuZGlmCisgIHNvYXBfZnJlZShzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZW5kKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9jbGlzdCAqY3A7CisgIGlmIChzb2FwX2NoZWNrX3N0YXRlKHNvYXApKQorICAgIHJldHVybjsKKyAgc29hcF9mcmVlKHNvYXApOworICBzb2FwX2RlYWxsb2Moc29hcCwgTlVMTCk7CisgIHdoaWxlIChzb2FwLT5jbGlzdCkKKyAgeyBjcCA9IHNvYXAtPmNsaXN0LT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5jbGlzdCk7CisgICAgc29hcC0+Y2xpc3QgPSBjcDsKKyAgfQorICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyNpZmRlZiBTT0FQX0RFQlVHCisgIHNvYXBfY2xvc2VfbG9nZmlsZXMoc29hcCk7CisjZW5kaWYKKyNpZmRlZiBQQUxNCisgIHBhbG1OZXRMaWJDbG9zZSgpOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X25hbWVzcGFjZXMoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBOYW1lc3BhY2UgKnApCit7IHJlZ2lzdGVyIHN0cnVjdCBOYW1lc3BhY2UgKm5zID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlczsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wLCAqbnEsICpucjsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGxldmVsID0gc29hcC0+bGV2ZWw7CisgIHNvYXAtPm5hbWVzcGFjZXMgPSBwOworICBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzID0gTlVMTDsKKyAgc29hcF9zZXRfbG9jYWxfbmFtZXNwYWNlcyhzb2FwKTsKKyAgLyogcmV2ZXJzZSB0aGUgbmFtZXNwYWNlIGxpc3QgKi8KKyAgbnAgPSBzb2FwLT5ubGlzdDsKKyAgc29hcC0+bmxpc3QgPSBOVUxMOworICBpZiAobnApCisgIHsgbnEgPSBucC0+bmV4dDsKKyAgICBucC0+bmV4dCA9IE5VTEw7CisgICAgd2hpbGUgKG5xKQorICAgIHsgbnIgPSBucS0+bmV4dDsKKyAgICAgIG5xLT5uZXh0ID0gbnA7CisgICAgICBucCA9IG5xOworICAgICAgbnEgPSBucjsKKyAgICB9CisgIH0KKyAgLyogdGhlbiBwdXNoIG9uIG5ldyBzdGFjayAqLworICB3aGlsZSAobnApCisgIHsgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKKyAgICBzb2FwLT5sZXZlbCA9IG5wLT5sZXZlbDsgLyogcHJlc2VydmUgZWxlbWVudCBuZXN0aW5nIGxldmVsICovCisgICAgcyA9IG5wLT5uczsKKyAgICBpZiAoIXMgJiYgbnAtPmluZGV4ID49IDAgJiYgbnMpCisgICAgeyBzID0gbnNbbnAtPmluZGV4XS5vdXQ7CisgICAgICBpZiAoIXMpCisgICAgICAgIHMgPSBuc1tucC0+aW5kZXhdLm5zOworICAgIH0KKyAgICBpZiAocyAmJiBzb2FwX3B1c2hfbmFtZXNwYWNlKHNvYXAsIG5wLT5pZCwgcykpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgbnEgPSBucDsKKyAgICBucCA9IG5wLT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBucSk7CisgIH0KKyAgaWYgKG5zKQorICB7IHJlZ2lzdGVyIGludCBpOworICAgIGZvciAoaSA9IDA7IG5zW2ldLmlkOyBpKyspCisgICAgeyBpZiAobnNbaV0ub3V0KQorICAgICAgeyBTT0FQX0ZSRUUoc29hcCwgbnNbaV0ub3V0KTsKKyAgICAgICAgbnNbaV0ub3V0ID0gTlVMTDsKKyAgICAgIH0KKyAgICB9CisgICAgU09BUF9GUkVFKHNvYXAsIG5zKTsKKyAgfQorICBzb2FwLT5sZXZlbCA9IGxldmVsOyAvKiByZXN0b3JlIGxldmVsICovCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfbG9jYWxfbmFtZXNwYWNlcyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXAtPm5hbWVzcGFjZXMgJiYgIXNvYXAtPmxvY2FsX25hbWVzcGFjZXMpCisgIHsgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IE5hbWVzcGFjZSAqbnMxOworICAgIHJlZ2lzdGVyIHN0cnVjdCBOYW1lc3BhY2UgKm5zMjsKKyAgICByZWdpc3RlciBzaXplX3QgbiA9IDE7CisgICAgZm9yIChuczEgPSBzb2FwLT5uYW1lc3BhY2VzOyBuczEtPmlkOyBuczErKykKKyAgICAgIG4rKzsKKyAgICBuICo9IHNpemVvZihzdHJ1Y3QgTmFtZXNwYWNlKTsKKyAgICBuczIgPSAoc3RydWN0IE5hbWVzcGFjZSopU09BUF9NQUxMT0Moc29hcCwgbik7CisgICAgaWYgKG5zMikKKyAgICB7IG1lbWNweShuczIsIHNvYXAtPm5hbWVzcGFjZXMsIG4pOworICAgICAgaWYgKG5zMlswXS5ucykKKyAgICAgIHsgaWYgKCFzdHJjbXAobnMyWzBdLm5zLCBzb2FwX2VudjEpKQorICAgICAgICAgIHNvYXAtPnZlcnNpb24gPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgc29hcC0+dmVyc2lvbiA9IDI7CisgICAgICB9CisgICAgICBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzID0gbnMyOworICAgIH0KKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIgKgorU09BUF9GTUFDMgorc29hcF9zdHJzZWFyY2goY29uc3QgY2hhciAqYmlnLCBjb25zdCBjaGFyICpsaXR0bGUpCit7IHNpemVfdCBuID0gc3RybGVuKGxpdHRsZSk7CisgIGNvbnN0IGNoYXIgKnMgPSBiaWc7CisgIHdoaWxlIChzKSAKKyAgeyBpZiAoIXN0cm5jbXAocywgbGl0dGxlLCBuKSAmJiAoc1tuXSA9PSAnXDAnIHx8IHNbbl0gPT0gJyAnKSkKKyAgICAgIHJldHVybiBzOworICAgIHMgPSBzdHJjaHIocywgJyAnKTsKKyAgICBpZiAocykKKyAgICAgIHMrKzsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIHN0cnVjdCBzb2FwX25saXN0ICoKK3NvYXBfbG9va3VwX25zKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHNpemVfdCBuKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnA7CisgIGZvciAobnAgPSBzb2FwLT5ubGlzdDsgbnA7IG5wID0gbnAtPm5leHQpCisgIHsgaWYgKCFzdHJuY21wKG5wLT5pZCwgdGFnLCBuKSAmJiAhbnAtPmlkW25dKQorICAgICAgcmV0dXJuIG5wOworICB9CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIHN0cnVjdCBzb2FwX25saXN0ICoKK3NvYXBfcHVzaF9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKm5zLCBzaG9ydCB1dGlsaXplZCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wOworICBzaXplX3QgbiwgazsKKyAgaWYgKHNvYXBfc3Ryc2VhcmNoKHNvYXAtPmMxNG5leGNsdWRlLCBpZCkpCisgICAgcmV0dXJuIE5VTEw7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUHVzaCBuYW1lc3BhY2UgYmluZGluZyAobGV2ZWw9JXUpICclcycgJyVzJ1xuIiwgc29hcC0+bGV2ZWwsIGlkLCBucz9uczoiIikpOworICBpZiAoIXV0aWxpemVkKQorICB7IGZvciAobnAgPSBzb2FwLT5ubGlzdDsgbnA7IG5wID0gbnAtPm5leHQpCisgICAgeyBpZiAoIXN0cmNtcChucC0+aWQsIGlkKSAmJiAoIW5wLT5ucyB8fCAhc3RyY21wKG5wLT5ucywgbnMpKSkKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChucCkKKyAgICB7IGlmIChucC0+aW5kZXggPT0gMSkKKyAgICAgICAgdXRpbGl6ZWQgPSBucC0+aW5kZXg7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgfQorICBuID0gc3RybGVuKGlkKTsKKyAgaWYgKG5zKQorICAgIGsgPSBzdHJsZW4obnMpOworICBlbHNlCisgICAgayA9IDA7CisgIG5wID0gKHN0cnVjdCBzb2FwX25saXN0KilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfbmxpc3QpICsgbiArIGsgKyAxKTsKKyAgaWYgKCFucCkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHJldHVybiBOVUxMOworICB9CisgIG5wLT5uZXh0ID0gc29hcC0+bmxpc3Q7CisgIHNvYXAtPm5saXN0ID0gbnA7CisgIHN0cmNweShucC0+aWQsIGlkKTsKKyAgaWYgKG5zKQorICB7IG5wLT5ucyA9IG5wLT5pZCArIG4gKyAxOworICAgIHN0cmNweShucC0+bnMsIG5zKTsKKyAgfQorICBlbHNlCisgICAgbnAtPm5zID0gTlVMTDsKKyAgbnAtPmxldmVsID0gc29hcC0+bGV2ZWw7CisgIG5wLT5pbmRleCA9IHV0aWxpemVkOworICByZXR1cm4gbnA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgdm9pZAorc29hcF91dGlsaXplX25zKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHNpemVfdCBuKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnAgPSBzb2FwX2xvb2t1cF9ucyhzb2FwLCB0YWcsIG4pOworICBpZiAobnApCisgIHsgaWYgKG5wLT5pbmRleCA9PSAwKQorICAgICAgc29hcF9wdXNoX25zKHNvYXAsIG5wLT5pZCwgbnAtPm5zLCAxKTsKKyAgfQorICBlbHNlCisgIHsgc3RybmNweShzb2FwLT50bXBidWYsIHRhZywgbik7CisgICAgc29hcC0+dG1wYnVmW25dID0gJ1wwJzsKKyAgICBzb2FwX3B1c2hfbnMoc29hcCwgc29hcC0+dG1wYnVmLCBOVUxMLCAxKTsKKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIHZvaWQKK3NvYXBfcG9wX25zKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwX3BvcF9uYW1lc3BhY2Uoc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnR5cGUpCit7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRWxlbWVudCBiZWdpbiB0YWc9JyVzJyBpZD0nJWQnIHR5cGU9JyVzJ1xuIiwgdGFnLCBpZCwgdHlwZT90eXBlOiIiKSk7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKmVsdCA9IChzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50KSk7CisgICAgaWYgKCFlbHQpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICBlbHQtPnNvYXAgPSBzb2FwOworICAgIGVsdC0+bmV4dCA9IE5VTEw7CisgICAgZWx0LT5wcm50ID0gc29hcC0+ZG9tOworICAgIGVsdC0+bmFtZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHRhZyk7CisgICAgZWx0LT5lbHRzID0gTlVMTDsKKyAgICBlbHQtPmF0dHMgPSBOVUxMOworICAgIGVsdC0+bnN0ciA9IE5VTEw7CisgICAgZWx0LT5kYXRhID0gTlVMTDsKKyAgICBlbHQtPndpZGUgPSBOVUxMOworICAgIGVsdC0+bm9kZSA9IE5VTEw7CisgICAgZWx0LT50eXBlID0gMDsKKyAgICBlbHQtPmhlYWQgPSBOVUxMOworICAgIGVsdC0+dGFpbCA9IE5VTEw7CisgICAgaWYgKHNvYXAtPmRvbSkKKyAgICB7IHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICpwID0gc29hcC0+ZG9tLT5lbHRzOworICAgICAgaWYgKHApCisgICAgICB7IHdoaWxlIChwLT5uZXh0KQorICAgICAgICAgIHAgPSBwLT5uZXh0OworICAgICAgICBwLT5uZXh0ID0gZWx0OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBzb2FwLT5kb20tPmVsdHMgPSBlbHQ7CisgICAgfQorICAgIHNvYXAtPmRvbSA9IGVsdDsKKyAgfQorICBlbHNlCisgIHsKKyNlbmRpZgorICAgIHNvYXAtPmxldmVsKys7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmICghc29hcC0+bnMpCisgICAgeyBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICAgICAgICYmIHNvYXBfc2VuZChzb2FwLCBzb2FwLT5wcm9sb2cgPyBzb2FwLT5wcm9sb2cgOiAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBlbHNlIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfSU5ERU5UKQorICAgIHsgaWYgKHNvYXAtPm5zID09IDEgJiYgc29hcF9zZW5kX3Jhdyhzb2FwLCBzb2FwX2luZGVudCwgc29hcC0+bGV2ZWwgPCBzaXplb2Yoc29hcF9pbmRlbnQpID8gc29hcC0+bGV2ZWwgOiBzaXplb2Yoc29hcF9pbmRlbnQpIC0gMSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHNvYXAtPmJvZHkgPSAxOworICAgIH0KKyNlbmRpZgorICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsICI8IiwgMSkKKyAgICAgfHwgc29hcF9zZW5kKHNvYXAsIHRhZykpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjaWZkZWYgV0lUSF9ET00KKyAgfQorI2VuZGlmCisgIGlmICghc29hcC0+bnMpCisgIHsgc3RydWN0IE5hbWVzcGFjZSAqbnM7CisgICAgZm9yIChucyA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXM7IG5zICYmIG5zLT5pZDsgbnMrKykKKyAgICB7IGlmICgqbnMtPmlkICYmIChucy0+b3V0IHx8IG5zLT5ucykpCisgICAgICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAieG1sbnM6JXMiLCBucy0+aWQpOworICAgICAgICBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgc29hcC0+dG1wYnVmLCBucy0+b3V0ID8gbnMtPm91dCA6IG5zLT5ucykpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgIH0gICAKKyAgfQorICBzb2FwLT5ucyA9IDE7IC8qIHN0YXJ0IHdpdGggMCBvciAyLCBidXQgc2hvdWxkIGJlIG9uZSB0byBjb250aW51ZSAqLworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgIHsgY29uc3QgY2hhciAqcyA9IHN0cmNocih0YWcsICc6Jyk7CisgICAgaWYgKHMpCisgICAgICBzb2FwX3V0aWxpemVfbnMoc29hcCwgdGFnLCBzIC0gdGFnKTsKKyAgfQorI2VuZGlmCisgIGlmIChpZCA+IDApCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJfJWQiLCBpZCk7CisgICAgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJpZCIsIHNvYXAtPnRtcGJ1ZikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHR5cGUgJiYgKnR5cGUpCisgIHsgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJ4c2k6dHlwZSIsIHR5cGUpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgICB7IGNvbnN0IGNoYXIgKnMgPSBzdHJjaHIodHlwZSwgJzonKTsKKyAgICAgIGlmIChzKQorICAgICAgICBzb2FwX3V0aWxpemVfbnMoc29hcCwgdHlwZSwgcyAtIHR5cGUpOworICAgIH0KKyNlbmRpZgorICB9CisgIGlmIChzb2FwLT5udWxsICYmIHNvYXAtPnBvc2l0aW9uID4gMCkKKyAgeyBpbnQgaTsKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIlslZCIsIHNvYXAtPnBvc2l0aW9uc1swXSk7CisgICAgZm9yIChpID0gMTsgaSA8IHNvYXAtPnBvc2l0aW9uOyBpKyspCisgICAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIHN0cmxlbihzb2FwLT50bXBidWYpLCAiLCVkIiwgc29hcC0+cG9zaXRpb25zW2ldKTsKKyAgICBzdHJjYXQoc29hcC0+dG1wYnVmLCAiXSIpOworICAgIGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAiU09BUC1FTkM6cG9zaXRpb24iLCBzb2FwLT50bXBidWYpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmIChzb2FwLT5tdXN0VW5kZXJzdGFuZCkKKyAgeyBpZiAoc29hcC0+YWN0b3IgJiYgKnNvYXAtPmFjdG9yKQorICAgIHsgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsIHNvYXAtPnZlcnNpb24gPT0gMiA/ICJTT0FQLUVOVjpyb2xlIiA6ICJTT0FQLUVOVjphY3RvciIsIHNvYXAtPmFjdG9yKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgIlNPQVAtRU5WOm11c3RVbmRlcnN0YW5kIiwgc29hcC0+dmVyc2lvbiA9PSAyID8gInRydWUiIDogIjEiKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBzb2FwLT5tdXN0VW5kZXJzdGFuZCA9IDA7CisgIH0KKyAgaWYgKHNvYXAtPmVuY29kaW5nKQorICB7IGlmIChzb2FwLT5lbmNvZGluZ1N0eWxlICYmIHNvYXAtPmxvY2FsX25hbWVzcGFjZXMpCisgICAgeyBpZiAoISpzb2FwLT5lbmNvZGluZ1N0eWxlKQorICAgICAgeyBpZiAoc29hcC0+bG9jYWxfbmFtZXNwYWNlc1sxXS5vdXQpCisgICAgICAgICAgc29hcC0+ZW5jb2RpbmdTdHlsZSA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbMV0ub3V0OworICAgICAgICBlbHNlCisgICAgICAgICAgc29hcC0+ZW5jb2RpbmdTdHlsZSA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbMV0ubnM7CisgICAgICB9CisgICAgICBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgIlNPQVAtRU5WOmVuY29kaW5nU3R5bGUiLCBzb2FwLT5lbmNvZGluZ1N0eWxlKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBzb2FwLT5lbmNvZGluZyA9IDA7CisgIH0KKyAgc29hcC0+bnVsbCA9IDA7CisgIHNvYXAtPnBvc2l0aW9uID0gMDsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9iZWdpbl9vdXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICp0eXBlKQoreyBpZiAoKnRhZyA9PSAnLScpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIGlmIChzb2FwX2VsZW1lbnQoc29hcCwgdGFnLCBpZCwgdHlwZSkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X3N0YXJ0X2VuZF9vdXQoc29hcCwgTlVMTCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCisjaWZuZGVmIEhBVkVfU1RSUkNIUgorU09BUF9GTUFDMQorY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfc3RycmNocihjb25zdCBjaGFyICpzLCBpbnQgdCkKK3sgcmVnaXN0ZXIgY2hhciAqciA9IE5VTEw7CisgIHdoaWxlICgqcykKKyAgICBpZiAoKnMrKyA9PSB0KQorICAgICAgciA9IChjaGFyKilzIC0gMTsKKyAgcmV0dXJuIHI7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKKyNpZm5kZWYgSEFWRV9TVFJUT0wKK1NPQVBfRk1BQzEKK2xvbmcKK1NPQVBfRk1BQzIKK3NvYXBfc3RydG9sKGNvbnN0IGNoYXIgKnMsIGNoYXIgKip0LCBpbnQgYikKK3sgcmVnaXN0ZXIgbG9uZyBuID0gMDsKKyAgcmVnaXN0ZXIgaW50IGM7CisgIHdoaWxlICgqcyA+IDAgJiYgKnMgPD0gMzIpCisgICAgcysrOworICBpZiAoYiA9PSAxMCkKKyAgeyBzaG9ydCBuZWcgPSAwOworICAgIGlmICgqcyA9PSAnLScpCisgICAgeyBzKys7CisgICAgICBuZWcgPSAxOworICAgIH0KKyAgICBlbHNlIGlmICgqcyA9PSAnKycpCisgICAgICBzKys7CisgICAgd2hpbGUgKChjID0gKnMpICYmIGMgPj0gJzAnICYmIGMgPD0gJzknKQorICAgIHsgaWYgKG4gPj0gMjE0NzQ4MzY0ICYmIChuID4gMjE0NzQ4MzY0IHx8IGMgPj0gJzgnKSkKKyAgICAgICAgYnJlYWs7CisgICAgICBuICo9IDEwOworICAgICAgbiArPSBjIC0gJzAnOworICAgICAgcysrOworICAgIH0KKyAgICBpZiAobmVnKQorICAgICAgbiA9IC1uOworICB9CisgIGVsc2UgLyogYiA9PSAxNiBhbmQgdmFsdWUgaXMgYWx3YXlzIHBvc2l0aXZlICovCisgIHsgd2hpbGUgKChjID0gKnMpKQorICAgIHsgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQorICAgICAgICBjIC09ICcwJzsKKyAgICAgIGVsc2UgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKQorICAgICAgICBjIC09ICdBJyAtIDEwOworICAgICAgZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCisgICAgICAgIGMgLT0gJ2EnIC0gMTA7CisgICAgICBpZiAobiA+IDB4MDdGRkZGRkYpCisgICAgICAgIGJyZWFrOworICAgICAgbiA8PD0gNDsKKyAgICAgIG4gKz0gYzsKKyAgICAgIHMrKzsKKyAgICB9CisgIH0KKyAgaWYgKHQpCisgICAgKnQgPSAoY2hhciopczsKKyAgcmV0dXJuIG47Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKKyNpZm5kZWYgSEFWRV9TVFJUT1VMCitTT0FQX0ZNQUMxCit1bnNpZ25lZCBsb25nCitTT0FQX0ZNQUMyCitzb2FwX3N0cnRvdWwoY29uc3QgY2hhciAqcywgY2hhciAqKnQsIGludCBiKQoreyB1bnNpZ25lZCBsb25nIG4gPSAwOworICByZWdpc3RlciBpbnQgYzsKKyAgd2hpbGUgKCpzID4gMCAmJiAqcyA8PSAzMikKKyAgICBzKys7CisgIGlmIChiID09IDEwKQorICB7IGlmICgqcyA9PSAnKycpCisgICAgICBzKys7CisgICAgd2hpbGUgKChjID0gKnMpICYmIGMgPj0gJzAnICYmIGMgPD0gJzknKQorICAgIHsgaWYgKG4gPj0gNDI5NDk2NzI5ICYmIChuID4gNDI5NDk2NzI5IHx8IGMgPj0gJzYnKSkKKyAgICAgICAgYnJlYWs7CisgICAgICBuICo9IDEwOworICAgICAgbiArPSBjIC0gJzAnOworICAgICAgcysrOworICAgIH0KKyAgfQorICBlbHNlIC8qIGIgPT0gMTYgKi8KKyAgeyB3aGlsZSAoKGMgPSAqcykpCisgICAgeyBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCisgICAgICAgIGMgLT0gJzAnOworICAgICAgZWxzZSBpZiAoYyA+PSAnQScgJiYgYyA8PSAnRicpCisgICAgICAgIGMgLT0gJ0EnIC0gMTA7CisgICAgICBlbHNlIGlmIChjID49ICdhJyAmJiBjIDw9ICdmJykKKyAgICAgICAgYyAtPSAnYScgLSAxMDsKKyAgICAgIGlmIChuID4gMHgwRkZGRkZGRikKKyAgICAgICAgYnJlYWs7CisgICAgICBuIDw8PSA0OworICAgICAgbiArPSBjOworICAgICAgcysrOworICAgIH0KKyAgfQorICBpZiAodCkKKyAgICAqdCA9IChjaGFyKilzOworICByZXR1cm4gbjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2FycmF5X2JlZ2luX291dChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKm9mZnNldCkKK3sgaWYgKHNvYXBfZWxlbWVudChzb2FwLCB0YWcsIGlkLCAiU09BUC1FTkM6QXJyYXkiKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgIHsgY29uc3QgY2hhciAqczsKKyAgICBzID0gc29hcF9zdHJyY2hyKHR5cGUsICdbJyk7CisgICAgaWYgKChzaXplX3QpKHMgLSB0eXBlKSA8IHNpemVvZihzb2FwLT50bXBidWYpKQorICAgIHsgc3RybmNweShzb2FwLT50bXBidWYsIHR5cGUsIHMgLSB0eXBlKTsKKyAgICAgIHNvYXAtPnRtcGJ1ZltzIC0gdHlwZV0gPSAnXDAnOworICAgICAgaWYgKHR5cGUgJiYgKnR5cGUgJiYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJTT0FQLUVOQzppdGVtVHlwZSIsIHNvYXAtPnRtcGJ1ZikpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBpZiAocyAmJiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgIlNPQVAtRU5DOmFycmF5U2l6ZSIsIHMgKyAxKSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7IGlmIChvZmZzZXQgJiYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJTT0FQLUVOQzpvZmZzZXQiLCBvZmZzZXQpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAodHlwZSAmJiAqdHlwZSAmJiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgIlNPQVAtRU5DOmFycmF5VHlwZSIsIHR5cGUpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHR5cGUgJiYgKnR5cGUgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpKQorICB7IGNvbnN0IGNoYXIgKnMgPSBzdHJjaHIodHlwZSwgJzonKTsKKyAgICBpZiAocykKKyAgICAgIHNvYXBfdXRpbGl6ZV9ucyhzb2FwLCB0eXBlLCBzIC0gdHlwZSk7CisgIH0KKyNlbmRpZgorICByZXR1cm4gc29hcF9lbGVtZW50X3N0YXJ0X2VuZF9vdXQoc29hcCwgTlVMTCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqdHA7CisjaWZkZWYgV0lUSF9ET00KKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAqKmF0dDsKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgYXR0ID0gJnNvYXAtPmRvbS0+YXR0czsKKyAgICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgICAgeyBpZiAodHAtPnZpc2libGUpCisgICAgICB7ICphdHQgPSAoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUpKTsKKwlpZiAoISphdHQpCisJICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKwkoKmF0dCktPm5leHQgPSBOVUxMOworICAgICAgICAoKmF0dCktPm5zdHIgPSBOVUxMOworICAgICAgICAoKmF0dCktPm5hbWUgPSBzb2FwX3N0cmR1cChzb2FwLCB0cC0+bmFtZSk7CisgICAgICAgICgqYXR0KS0+ZGF0YSA9IHNvYXBfc3RyZHVwKHNvYXAsIHRwLT52YWx1ZSk7CisgICAgICAgICgqYXR0KS0+d2lkZSA9IE5VTEw7CisgICAgICAgICgqYXR0KS0+c29hcCA9IHNvYXA7CisgICAgICAgIHRwLT52aXNpYmxlID0gMDsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgIHsgc3RydWN0IHNvYXBfbmxpc3QgKm5wOworICAgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgICB7IGlmICh0cC0+dmlzaWJsZSAmJiB0cC0+bmFtZSkKKyAgICAgIHsgY29uc3QgY2hhciAqcyA9IHN0cmNocih0cC0+bmFtZSwgJzonKTsKKyAgICAgICAgaWYgKHMpCisgICAgICAgICAgc29hcF91dGlsaXplX25zKHNvYXAsIHRwLT5uYW1lLCBzIC0gdHAtPm5hbWUpOworICAgICAgfQorICAgIH0KKyAgICBmb3IgKG5wID0gc29hcC0+bmxpc3Q7IG5wOyBucCA9IG5wLT5uZXh0KQorICAgIHsgaWYgKG5wLT5pbmRleCA9PSAxICYmIG5wLT5ucykKKyAgICAgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJ4bWxuczolcyIsIG5wLT5pZCk7CisgICAgICAgIHNvYXBfc2V0X2F0dHIoc29hcCwgc29hcC0+dG1wYnVmLCBucC0+bnMpOworICAgICAgICBucC0+aW5kZXggPSAyOworICAgICAgfQorICAgIH0KKyAgfQorI2VuZGlmCisgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgeyBpZiAodHAtPnZpc2libGUpCisgICAgeyBpZiAoc29hcF9zZW5kKHNvYXAsICIgIikgfHwgc29hcF9zZW5kKHNvYXAsIHRwLT5uYW1lKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgaWYgKHRwLT52aXNpYmxlID09IDIgJiYgdHAtPnZhbHVlKQorICAgICAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAiPVwiIiwgMikKKwkgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHRwLT52YWx1ZSwgMSkKKwkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiXCIiLCAxKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB0cC0+dmlzaWJsZSA9IDA7CisgICAgfQorICB9CisgIGlmICh0YWcpCisgIHsgCisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICAgIHsgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgIj4iLCAxKQorICAgICAgIHx8IHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZykpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgc29hcC0+bGV2ZWwtLTsJLyogZGVjcmVtZW50IGxldmVsIGp1c3QgYmVmb3JlIC8+ICovCisgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgIi8+IiwgMikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgIj4iLCAxKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X2VuZF9vdXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZykKK3sgaWYgKCp0YWcgPT0gJy0nKQorICAgIHJldHVybiBTT0FQX09LOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVsZW1lbnQgZW5kaW5nIHRhZz0nJXMnXG4iLCB0YWcpKTsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBpZiAoc29hcC0+ZG9tLT5wcm50KQorICAgICAgc29hcC0+ZG9tID0gc29hcC0+ZG9tLT5wcm50OworICAgIHJldHVybiBTT0FQX09LOworICB9CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICAgIHNvYXBfcG9wX25zKHNvYXApOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0lOREVOVCkKKyAgeyBpZiAoIXNvYXAtPmJvZHkpCisgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzb2FwX2luZGVudCwgc29hcC0+bGV2ZWwgPCBzaXplb2Yoc29hcF9pbmRlbnQpID8gc29hcC0+bGV2ZWwgOiBzaXplb2Yoc29hcF9pbmRlbnQpIC0gMSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgc29hcC0+Ym9keSA9IDA7CisgIH0KKyNlbmRpZgorICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAiPC8iLCAyKQorICAgfHwgc29hcF9zZW5kKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBzb2FwLT5sZXZlbC0tOwkvKiBkZWNyZW1lbnQgbGV2ZWwganVzdCBiZWZvcmUgPiAqLworICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCAiPiIsIDEpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfcmVmKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgaW50IGhyZWYpCit7IHJlZ2lzdGVyIGludCBuID0gMDsKKyAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgICBuID0gMTsKKyAgc3ByaW50Zihzb2FwLT5ocmVmLCAiI18lZCIsIGhyZWYpOworICByZXR1cm4gc29hcF9lbGVtZW50X2hyZWYoc29hcCwgdGFnLCBpZCwgImhyZWYiICsgbiwgc29hcC0+aHJlZiArIG4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfaHJlZihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnJlZiwgY29uc3QgY2hhciAqdmFsKQoreyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVsZW1lbnQgJyVzJyByZWZlcmVuY2UgJXM9JyVzJ1xuIiwgdGFnLCByZWYsIHZhbCkpOworICBpZiAoc29hcF9lbGVtZW50KHNvYXAsIHRhZywgaWQsIE5VTEwpCisgICB8fCBzb2FwX2F0dHJpYnV0ZShzb2FwLCByZWYsIHZhbCkKKyAgIHx8IHNvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHNvYXAsIHRhZykpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X251bGwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICp0eXBlKQoreyBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKnRwOworICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgICAgaWYgKHRwLT52aXNpYmxlKQorICAgICAgYnJlYWs7CisgIGlmICh0cCB8fCAoc29hcC0+dmVyc2lvbiA9PSAyICYmIHNvYXAtPnBvc2l0aW9uID4gMCkgfHwgaWQgPiAwIHx8IChzb2FwLT5tb2RlICYgU09BUF9YTUxfTklMKSkKKyAgeyBpZiAoc29hcF9lbGVtZW50KHNvYXAsIHRhZywgaWQsIHR5cGUpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmIChzb2FwLT5wYXJ0ICE9IFNPQVBfSU5fSEVBREVSICYmIHNvYXAtPmVuY29kaW5nU3R5bGUpCisgICAgICBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgInhzaTpuaWwiLCAidHJ1ZSIpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgcmV0dXJuIHNvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHNvYXAsIHRhZyk7CisgIH0KKyAgc29hcC0+bnVsbCA9IDE7CisgIHNvYXAtPnBvc2l0aW9uID0gMDsKKyAgc29hcC0+bXVzdFVuZGVyc3RhbmQgPSAwOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X2lkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgdm9pZCAqcCwgY29uc3Qgc3RydWN0IHNvYXBfYXJyYXkgKmEsIGludCBuLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkgCit7IGlmICghcCB8fCAoYSAmJiAhYS0+X19wdHIpKQorICB7IHNvYXBfZWxlbWVudF9udWxsKHNvYXAsIHRhZywgaWQsIHR5cGUpOworICAgIHJldHVybiAtMTsKKyAgfQorI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9UUkVFKQorICAgIHJldHVybiAwOworICBpZiAoaWQgPCAwKQorICB7IHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgICBpZiAoYSkKKyAgICAgIGlkID0gc29hcF9hcnJheV9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCBhLCBuLCB0LCAmcHApOworICAgIGVsc2UKKyAgICAgIGlkID0gc29hcF9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCB0LCAmcHApOworICAgIGlmIChpZCkKKyAgICB7IGlmIChzb2FwX2lzX2VtYmVkZGVkKHNvYXAsIHBwKSkKKyAgICAgIHsgc29hcF9lbGVtZW50X3JlZihzb2FwLCB0YWcsIDAsIGlkKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgaWYgKHNvYXBfaXNfc2luZ2xlKHNvYXAsIHBwKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICBzb2FwX3NldF9lbWJlZGRlZChzb2FwLCBwcCk7CisgICAgfQorICB9CisgIHJldHVybiBpZDsKKyNlbHNlCisgIHJldHVybiAwOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9yZXN1bHQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZykKK3sgaWYgKHNvYXAtPnZlcnNpb24gPT0gMiAmJiBzb2FwLT5lbmNvZGluZ1N0eWxlKQorICAgIGlmIChzb2FwX2VsZW1lbnQoc29hcCwgIlNPQVAtUlBDOnJlc3VsdCIsIDAsIE5VTEwpCisgICAgIHx8IHNvYXBfYXR0cmlidXRlKHNvYXAsICJ4bWxuczpTT0FQLVJQQyIsIHNvYXBfcnBjKQorICAgICB8fCBzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzb2FwLCBOVUxMKQorICAgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgdGFnLCAwKQorICAgICB8fCBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCAiU09BUC1SUEM6cmVzdWx0IikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2F0dHJpYnV0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7IAorI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgKmEgPSAoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUpKTsKKyAgICBhLT5uZXh0ID0gc29hcC0+ZG9tLT5hdHRzOworICAgIGEtPm5zdHIgPSBOVUxMOworICAgIGEtPm5hbWUgPSBzb2FwX3N0cmR1cChzb2FwLCBuYW1lKTsKKyAgICBhLT5kYXRhID0gc29hcF9zdHJkdXAoc29hcCwgdmFsdWUpOworICAgIGEtPndpZGUgPSBOVUxMOworICAgIGEtPnNvYXAgPSBzb2FwOworICAgIHNvYXAtPmRvbS0+YXR0cyA9IGE7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgIHsgLyogVE9ETzogY29uc2lkZXIgdXNpbmcgdGhpcyBjb2RlIHRvIGhhbmRsZSBkZWZhdWx0IG5hbWVzcGFjZQorICAgIGlmICghc3RybmNtcChuYW1lLCAieG1sbnMiLCA1KSAmJiAobmFtZVs1XSA9PSAnOicgfHwgbmFtZVs1XSA9PSAnXDAnKSkKKyAgICB7IGlmIChuYW1lWzVdID09ICc6JykKKyAgICAgICAgc29hcF9wdXNoX25zKHNvYXAsIG5hbWUgKyA2LCB2YWx1ZSwgMCk7CisgICAgICBlbHNlCisgICAgICAgIHNvYXBfcHVzaF9ucyhzb2FwLCAiIiwgdmFsdWUsIDApOworICAgIH0KKyAgICAqLworICAgIGlmICghc3RybmNtcChuYW1lLCAieG1sbnM6IiwgNikpCisgICAgICBzb2FwX3B1c2hfbnMoc29hcCwgbmFtZSArIDYsIHZhbHVlLCAwKTsKKyAgICBlbHNlIGlmIChzb2FwX3NldF9hdHRyKHNvYXAsIG5hbWUsIHZhbHVlKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBlbHNlCisjZW5kaWYKKyAgeyBpZiAoc29hcF9zZW5kKHNvYXAsICIgIikgfHwgc29hcF9zZW5kKHNvYXAsIG5hbWUpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmICh2YWx1ZSkKKyAgICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsICI9XCIiLCAyKQorICAgICAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCB2YWx1ZSwgMSkKKyAgICAgICB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICJcIiIsIDEpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9iZWdpbl9pbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgbmlsbGFibGUpCit7IGlmICghc29hcF9wZWVrX2VsZW1lbnQoc29hcCkpCisgIHsgaWYgKHNvYXAtPm90aGVyKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9UQUdfTUlTTUFUQ0g7CisgICAgaWYgKHRhZyAmJiAqdGFnID09ICctJykKKyAgICAgIHJldHVybiBTT0FQX09LOworICAgIGlmICghKHNvYXAtPmVycm9yID0gc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dGFnLCB0YWcpKSkKKyAgICB7IHNvYXAtPnBlZWtlZCA9IDA7CisgICAgICBpZiAoc29hcC0+Ym9keSkKKyAgICAgICAgc29hcC0+bGV2ZWwrKzsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQmVnaW4gZWxlbWVudCBmb3VuZCAobGV2ZWw9JXUpICclcyc9JyVzJ1xuIiwgc29hcC0+bGV2ZWwsIHNvYXAtPnRhZywgdGFnP3RhZzoiIiApKTsKKyAgICAgIGlmICghbmlsbGFibGUgJiYgc29hcC0+bnVsbCAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTlVMTDsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcgJiYgdGFnICYmICp0YWcgPT0gJy0nKQorICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfZW5kX2luKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcpICAKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICByZWdpc3RlciBjaGFyICpzOworICByZWdpc3RlciBjb25zdCBjaGFyICp0OworICByZWdpc3RlciBpbnQgbiA9IDA7CisgIGlmICh0YWcgJiYgKnRhZyA9PSAnLScpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIHNvYXAtPmxldmVsLS07CisgIHNvYXBfcG9wX25hbWVzcGFjZShzb2FwKTsKKyNpZmRlZiBXSVRIX0RPTQorICAvKiB0aGlzIHdoaXRlc3BhY2Ugb3IgbWl4ZWQgY29udGVudCBpcyBub3QgaW5zaWduaWZpY2FudCBmb3IgRE9NICovCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IGlmICghc29hcC0+cGVla2VkICYmICFzb2FwX3N0cmluZ19pbihzb2FwLCAzLCAtMSwgLTEpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmIChzb2FwLT5kb20tPnBybnQpCisgICAgICBzb2FwLT5kb20gPSBzb2FwLT5kb20tPnBybnQ7CisgIH0KKyNlbmRpZgorICBpZiAoc29hcC0+cGVla2VkKQorICB7IGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgICBpZiAoKnNvYXAtPnRhZykKKyAgICAgIG4rKzsKKyAgICBzb2FwLT5wZWVrZWQgPSAwOworICB9CisgIGRvCisgIHsgd2hpbGUgKCgoYyA9IHNvYXBfZ2V0KHNvYXApKSAhPSBTT0FQX1RUKSkKKyAgICB7IGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAgIGlmIChjID09IFNPQVBfTFQpCisgICAgICAgIG4rKzsKKyAgICAgIGVsc2UgaWYgKGMgPT0gJy8nKQorICAgICAgeyBjID0gc29hcF9nZXQoc29hcCk7CisgICAgICAgIGlmIChjID09IFNPQVBfR1QpCisJICBuLS07CisgICAgICAgIGVsc2UKKwkgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICB9CisgICAgfQorICB9IHdoaWxlIChuLS0pOworICBzID0gc29hcC0+dGFnOworICB3aGlsZSAoc29hcF9ub3RibGFuayhjID0gc29hcF9nZXQoc29hcCkpKQorICAgICpzKysgPSAoY2hhciljOworICAqcyA9ICdcMCc7CisgIGlmICgoaW50KWMgPT0gRU9GKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICB3aGlsZSAoc29hcF9ibGFuayhjKSkKKyAgICBjID0gc29hcF9nZXQoc29hcCk7CisgIGlmIChjICE9IFNPQVBfR1QpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9TWU5UQVhfRVJST1I7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIGVsZW1lbnQgZm91bmQgKGxldmVsPSV1KSAnJXMnPSclcydcbiIsIHNvYXAtPmxldmVsLCBzb2FwLT50YWcsIHRhZz90YWc6IiIpKTsKKyAgaWYgKCF0YWcgfHwgISp0YWcpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIGlmICgocyA9IHN0cmNocihzb2FwLT50YWcsICc6JykpKQorICAgIHMrKzsKKyAgZWxzZQorICAgIHMgPSBzb2FwLT50YWc7CisgIGlmICgodCA9IHN0cmNocih0YWcsICc6JykpKQorICAgIHQrKzsKKyAgZWxzZQorICAgIHQgPSB0YWc7CisgIGlmICghU09BUF9TVFJDTVAocywgdCkpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIGVsZW1lbnQgdGFnIG5hbWUgZG9lcyBub3QgbWF0Y2hcbiIpKTsKKyAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9TWU5UQVhfRVJST1I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfYXR0cl92YWx1ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWcpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqdHA7CisgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgICBpZiAoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCBuYW1lKSkKKyAgICAgIGJyZWFrOworICBpZiAodHAgJiYgdHAtPnZpc2libGUgPT0gMikKKyAgeyBpZiAoZmxhZyA9PSAyICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9QUk9ISUJJVEVEOworICAgIGVsc2UKKyAgICAgIHJldHVybiB0cC0+dmFsdWU7CisgIH0KKyAgZWxzZSBpZiAoZmxhZyA9PSAxICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfUkVRVUlSRUQ7CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NldF9hdHRyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfYXR0cmlidXRlICp0cDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTZXQgYXR0cmlidXRlICVzPSclcydcbiIsIG5hbWUsIHZhbHVlP3ZhbHVlOiIiKSk7CisgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgeyBpZiAoIXN0cmNtcCh0cC0+bmFtZSwgbmFtZSkpCisgICAgICBicmVhazsKKyAgfQorICBpZiAoIXRwKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQWxsb2NhdGUgYXR0cmlidXRlICVzXG4iLCBuYW1lKSk7CisgICAgaWYgKCEodHAgPSAoc3RydWN0IHNvYXBfYXR0cmlidXRlKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfYXR0cmlidXRlKSArIHN0cmxlbihuYW1lKSkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgdHAtPm5zID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgICAgeyBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKip0cHAgPSAmc29hcC0+YXR0cmlidXRlczsKKyAgICAgIGNvbnN0IGNoYXIgKnMgPSBzdHJjaHIobmFtZSwgJzonKTsKKyAgICAgIGlmICghc3RybmNtcChuYW1lLCAieG1sbnMiLCA1KSkKKyAgICAgIHsgZm9yICg7ICp0cHA7IHRwcCA9ICYoKnRwcCktPm5leHQpCisgICAgICAgICAgaWYgKHN0cm5jbXAoKCp0cHApLT5uYW1lLCAieG1sbnMiLCA1KSB8fCBzdHJjbXAoKCp0cHApLT5uYW1lICsgNSwgbmFtZSArIDUpID4gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIXMpCisgICAgICB7IGZvciAoOyAqdHBwOyB0cHAgPSAmKCp0cHApLT5uZXh0KQorICAgICAgICAgIGlmIChzdHJuY21wKCgqdHBwKS0+bmFtZSwgInhtbG5zIiwgNSkgJiYgKCgqdHBwKS0+bnMgfHwgc3RyY21wKCgqdHBwKS0+bmFtZSwgbmFtZSkgPiAwKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBpbnQgazsKKyAgICAgICAgZm9yICg7ICp0cHA7IHRwcCA9ICYoKnRwcCktPm5leHQpCisJeyBpZiAoIXN0cm5jbXAoKCp0cHApLT5uYW1lLCAieG1sbnM6IiwgNikgJiYgIXN0cm5jbXAoKCp0cHApLT5uYW1lICsgNiwgbmFtZSwgcyAtIG5hbWUpICYmICEoKnRwcCktPm5hbWVbNiArIHMgLSBuYW1lXSkKKwkgIHsgaWYgKCF0cC0+bnMpCisgICAgICAgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ2Fub25pY2FsaXphdGlvbjogcHJlZml4ICVzPSVwKCVzKVxuIiwgbmFtZSwgKCp0cHApLT5ucywgKCp0cHApLT5ucykpOworCSAgICAgIHRwLT5ucyA9ICgqdHBwKS0+bnM7CisJICAgIH0KKwkgIH0KKyAgICAgICAgICBlbHNlIGlmIChzdHJuY21wKCgqdHBwKS0+bmFtZSwgInhtbG5zIiwgNSkgJiYgKCp0cHApLT5ucyAmJiB0cC0+bnMgJiYgKChrID0gc3RyY21wKCgqdHBwKS0+bnMsIHRwLT5ucykpID4gMCB8fCAoIWsgJiYgc3RyY21wKCgqdHBwKS0+bmFtZSwgbmFtZSkgPiAwKSkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgdHAtPm5leHQgPSAqdHBwOworICAgICAgKnRwcCA9IHRwOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7IHRwLT5uZXh0ID0gc29hcC0+YXR0cmlidXRlczsKKyAgICAgIHNvYXAtPmF0dHJpYnV0ZXMgPSB0cDsKKyAgICB9CisgICAgc3RyY3B5KHRwLT5uYW1lLCBuYW1lKTsKKyAgICB0cC0+dmFsdWUgPSBOVUxMOworICB9CisgIGVsc2UgaWYgKHRwLT52aXNpYmxlKQorICB7IHJldHVybiBTT0FQX09LOworICB9CisgIGVsc2UgaWYgKHZhbHVlICYmIHRwLT52YWx1ZSAmJiB0cC0+c2l6ZSA8PSBzdHJsZW4odmFsdWUpKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZSBhdHRyaWJ1dGUgdmFsdWUgb2YgJXMgKGZyZWUgJXApXG4iLCBuYW1lLCB0cC0+dmFsdWUpKTsKKyAgICBTT0FQX0ZSRUUoc29hcCwgdHAtPnZhbHVlKTsKKyAgICB0cC0+dmFsdWUgPSBOVUxMOworICAgIHRwLT5ucyA9IE5VTEw7CisgIH0KKyAgaWYgKHZhbHVlKQorICB7IGlmICghdHAtPnZhbHVlKQorICAgIHsgdHAtPnNpemUgPSBzdHJsZW4odmFsdWUpICsgMTsKKyAgICAgIGlmICghKHRwLT52YWx1ZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCB0cC0+c2l6ZSkpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQWxsb2NhdGUgYXR0cmlidXRlIHZhbHVlIG9mICVzICglcClcbiIsIHRwLT5uYW1lLCB0cC0+dmFsdWUpKTsKKyAgICB9CisgICAgc3RyY3B5KHRwLT52YWx1ZSwgdmFsdWUpOworICAgIGlmICghc3RybmNtcCh0cC0+bmFtZSwgInhtbG5zOiIsIDYpKQorICAgICAgdHAtPm5zID0gdHAtPnZhbHVlOworICAgIHRwLT52aXNpYmxlID0gMjsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIndzdTpJZCIpKQorICAgIHsgc29hcC0+cGFydCA9IFNPQVBfQkVHSU5fU0VDVVJJVFk7CisgICAgICBzdHJuY3B5KHNvYXAtPmlkLCB2YWx1ZSwgc2l6ZW9mKHNvYXAtPmlkKSk7CisgICAgICBzb2FwLT5pZFtzaXplb2Yoc29hcC0+aWQpLTFdID0gJ1wwJzsKKyAgICB9CisjZW5kaWYKKyAgfQorICBlbHNlCisgICAgdHAtPnZpc2libGUgPSAxOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfY2xyX2F0dHIoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqdHA7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpKQorICB7IHdoaWxlIChzb2FwLT5hdHRyaWJ1dGVzKQorICAgIHsgdHAgPSBzb2FwLT5hdHRyaWJ1dGVzLT5uZXh0OworICAgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPmF0dHJpYnV0ZXMtPnZhbHVlKTsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5hdHRyaWJ1dGVzKTsKKyAgICAgIHNvYXAtPmF0dHJpYnV0ZXMgPSB0cDsKKyAgICB9CisgIH0KKyAgZWxzZQorI2VuZGlmCisgIHsgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICAgICAgdHAtPnZpc2libGUgPSAwOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitzdGF0aWMgaW50Citzb2FwX2dldGF0dHJ2YWwoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnMsIHNpemVfdCBuLCBzb2FwX3djaGFyIGQpCit7IHJlZ2lzdGVyIHNpemVfdCBpOworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICB7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IHNvYXBfZ2V0KHNvYXApOworICAgIHN3aXRjaCAoYykKKyAgICB7CisgICAgY2FzZSBTT0FQX1RUOgorICAgICAgKnMrKyA9ICc8JzsKKyAgICAgIHNvYXBfdW5nZXQoc29hcCwgJy8nKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9MVDoKKyAgICAgICpzKysgPSAnPCc7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfR1Q6CisgICAgICBpZiAoZCA9PSAnICcpCisgICAgICB7IHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgICpzID0gJ1wwJzsKKyAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgICB9CisgICAgICAqcysrID0gJz4nOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1FUOgorICAgICAgaWYgKGMgPT0gZCkKKyAgICAgIHsgKnMgPSAnXDAnOworICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICAgIH0KKyAgICAgICpzKysgPSAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfQVA6CisgICAgICBpZiAoYyA9PSBkKQorICAgICAgeyAqcyA9ICdcMCc7CisgICAgICAgIHJldHVybiBTT0FQX09LOworICAgICAgfQorICAgICAgKnMrKyA9ICdcJyc7CisgICAgICBicmVhazsKKyAgICBjYXNlICdcdCc6CisgICAgY2FzZSAnXG4nOgorICAgIGNhc2UgJ1xyJzoKKyAgICBjYXNlICcgJzoKKyAgICBjYXNlICcvJzoKKyAgICAgIGlmIChkID09ICcgJykKKyAgICAgIHsgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgKnMgPSAnXDAnOworICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgICAgKnMrKyA9IChjaGFyKWM7CisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgV0lUSF9GQVNUCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3N0b3JlX2xhYihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgc2l6ZV90IG4pCit7IHNvYXAtPmxhYmlkeCA9IDA7CisgIHJldHVybiBzb2FwX2FwcGVuZF9sYWIoc29hcCwgcywgbik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFdJVEhfRkFTVAorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9hcHBlbmRfbGFiKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBzaXplX3QgbikKK3sgaWYgKHNvYXAtPmxhYmlkeCArIG4gPj0gc29hcC0+bGFibGVuKQorICB7IHJlZ2lzdGVyIGNoYXIgKnQgPSBzb2FwLT5sYWJidWY7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmxhcmdpbmcgbG9vay1hc2lkZSBidWZmZXIgdG8gYXBwZW5kIGRhdGEsIG9sZCBzaXplPSVsdSIsICh1bnNpZ25lZCBsb25nKXNvYXAtPmxhYmxlbikpOworICAgIGlmIChzb2FwLT5sYWJsZW4gPT0gMCkKKyAgICAgIHNvYXAtPmxhYmxlbiA9IFNPQVBfTEFCTEVOOworICAgIHdoaWxlIChzb2FwLT5sYWJpZHggKyBuID49IHNvYXAtPmxhYmxlbikKKyAgICAgIHNvYXAtPmxhYmxlbiA8PD0gMTsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIiwgbmV3IHNpemU9JWx1XG4iLCAodW5zaWduZWQgbG9uZylzb2FwLT5sYWJsZW4pKTsKKyAgICBzb2FwLT5sYWJidWYgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc29hcC0+bGFibGVuKTsKKyAgICBpZiAoIXNvYXAtPmxhYmJ1ZikKKyAgICB7IGlmICh0KQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgdCk7CisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICB9CisgICAgaWYgKHQpCisgICAgeyBtZW1jcHkoc29hcC0+bGFiYnVmLCB0LCBzb2FwLT5sYWJpZHgpOworICAgICAgU09BUF9GUkVFKHNvYXAsIHQpOworICAgIH0KKyAgfQorICBpZiAocykKKyAgeyBtZW1jcHkoc29hcC0+bGFiYnVmICsgc29hcC0+bGFiaWR4LCBzLCBuKTsKKyAgICBzb2FwLT5sYWJpZHggKz0gbjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3BlZWtfZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyNpZmRlZiBXSVRIX0RPTQorICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICoqYXR0ID0gTlVMTDsKKyAgcmVnaXN0ZXIgY2hhciAqbGVhZCA9IE5VTEw7CisjZW5kaWYKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfYXR0cmlidXRlICp0cDsKKyAgY29uc3QgY2hhciAqdDsKKyAgcmVnaXN0ZXIgY2hhciAqczsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICByZWdpc3RlciBpbnQgaTsKKyAgaWYgKHNvYXAtPnBlZWtlZCkKKyAgeyBpZiAoISpzb2FwLT50YWcpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX05PX1RBRzsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICBzb2FwLT5wZWVrZWQgPSAxOworICBjID0gc29hcF9nZXR1dGY4KHNvYXApOworI2lmZGVmIFdJVEhfRE9NCisgIC8qIHdoaXRlc3BhY2UgbGVhZGluZyB0byBzdGFydCB0YWcgaXMgbm90IGluc2lnbmlmaWNhbnQgZm9yIERPTSAqLworICBpZiAoc29hcF9ibGFuayhjKSkKKyAgeyBzb2FwLT5sYWJpZHggPSAwOworICAgIGRvCisgICAgeyBpZiAoc29hcF9hcHBlbmRfbGFiKHNvYXAsIE5VTEwsIDApKQorICAgICAgICByZXR1cm4gU09BUF9FT007CisgICAgICBzID0gc29hcC0+bGFiYnVmICsgc29hcC0+bGFiaWR4OworICAgICAgaSA9IHNvYXAtPmxhYmxlbiAtIHNvYXAtPmxhYmlkeDsKKyAgICAgIHNvYXAtPmxhYmlkeCA9IHNvYXAtPmxhYmxlbjsKKyAgICAgIHdoaWxlIChzb2FwX2JsYW5rKGMpICYmIGktLSkKKyAgICAgIHsgKnMrKyA9IGM7CisgICAgICAgIGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisgICAgICB9CisgICAgfQorICAgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyAgICAqcyA9ICdcMCc7CisgICAgbGVhZCA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPmxhYmJ1Zik7CisgIH0KKyNlbHNlCisgIHdoaWxlIChzb2FwX2JsYW5rKGMpKQorICAgIGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisjZW5kaWYKKyAgaWYgKGMgIT0gU09BUF9MVCkKKyAgeyAqc29hcC0+dGFnID0gJ1wwJzsKKyAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisjaWZkZWYgV0lUSF9ET00KKyAgICAvKiB3aGl0ZXNwYWNlIGxlYWRpbmcgdG8gZW5kIHRhZyBpcyBub3QgaW5zaWduaWZpY2FudCBmb3IgRE9NICovCisgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgICAgICBzb2FwLT5kb20tPnRhaWwgPSBzb2FwX3N0cmR1cChzb2FwLCBsZWFkKTsKKyNlbmRpZgorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTk9fVEFHOworICB9CisgIHMgPSBzb2FwLT50YWc7CisgIGRvIGMgPSBzb2FwX2dldDEoc29hcCk7CisgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyAgaSA9IHNpemVvZihzb2FwLT50YWcpOworICB3aGlsZSAoYyAhPSAnPicgJiYgYyAhPSAnLycgJiYgc29hcF9ub3RibGFuayhjKSkKKyAgeyBpZiAoLS1pID4gMCkKKyAgICAgICpzKysgPSAoY2hhciljOworICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgIH0KKyAgd2hpbGUgKHNvYXBfYmxhbmsoYykpCisgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgKnMgPSAnXDAnOworICBzb2FwLT5pZFswXSA9ICdcMCc7CisgIHNvYXAtPmhyZWZbMF0gPSAnXDAnOworICBzb2FwLT50eXBlWzBdID0gJ1wwJzsKKyAgc29hcC0+YXJyYXlUeXBlWzBdID0gJ1wwJzsKKyAgc29hcC0+YXJyYXlTaXplWzBdID0gJ1wwJzsKKyAgc29hcC0+YXJyYXlPZmZzZXRbMF0gPSAnXDAnOworICBzb2FwLT5vdGhlciA9IDA7CisgIHNvYXAtPnJvb3QgPSAtMTsKKyAgc29hcC0+cG9zaXRpb24gPSAwOworICBzb2FwLT5udWxsID0gMDsKKyAgc29hcC0+bXVzdFVuZGVyc3RhbmQgPSAwOworI2lmZGVmIFdJVEhfRE9NCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICplbHQ7CisgICAgZWx0ID0gKHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50Kilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQpKTsKKyAgICBpZiAoIWVsdCkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIGVsdC0+bmV4dCA9IE5VTEw7CisgICAgZWx0LT5uc3RyID0gTlVMTDsKKyAgICBlbHQtPm5hbWUgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT50YWcpOworICAgIGVsdC0+cHJudCA9IHNvYXAtPmRvbTsKKyAgICBlbHQtPmVsdHMgPSBOVUxMOworICAgIGVsdC0+YXR0cyA9IE5VTEw7CisgICAgZWx0LT5kYXRhID0gTlVMTDsKKyAgICBlbHQtPndpZGUgPSBOVUxMOworICAgIGVsdC0+dHlwZSA9IDA7CisgICAgZWx0LT5ub2RlID0gTlVMTDsKKyAgICBlbHQtPmhlYWQgPSBsZWFkOworICAgIGVsdC0+dGFpbCA9IE5VTEw7CisgICAgZWx0LT5zb2FwID0gc29hcDsKKyAgICBpZiAoc29hcC0+ZG9tKQorICAgIHsgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKnAgPSBzb2FwLT5kb20tPmVsdHM7CisgICAgICBpZiAocCkKKyAgICAgIHsgd2hpbGUgKHAtPm5leHQpCisgICAgICAgICAgcCA9IHAtPm5leHQ7CisgICAgICAgIHAtPm5leHQgPSBlbHQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHNvYXAtPmRvbS0+ZWx0cyA9IGVsdDsKKyAgICB9CisgICAgc29hcC0+ZG9tID0gZWx0OworICAgIGF0dCA9ICZlbHQtPmF0dHM7CisgIH0KKyNlbmRpZgorICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgICAgdHAtPnZpc2libGUgPSAwOworICB3aGlsZSAoKGludCljICE9IEVPRiAmJiBjICE9ICc+JyAmJiBjICE9ICcvJykKKyAgeyBzID0gc29hcC0+dG1wYnVmOworICAgIGkgPSBzaXplb2Yoc29hcC0+dG1wYnVmKTsKKyAgICB3aGlsZSAoYyAhPSAnPScgJiYgYyAhPSAnPicgJiYgYyAhPSAnLycgJiYgc29hcF9ub3RibGFuayhjKSkKKyAgICB7IGlmICgtLWkgPiAwKQorICAgICAgICAqcysrID0gKGNoYXIpYzsKKyAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgfQorICAgICpzID0gJ1wwJzsKKyAgICBpZiAoaSA9PSBzaXplb2Yoc29hcC0+dG1wYnVmKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfU1lOVEFYX0VSUk9SOworI2lmZGVmIFdJVEhfRE9NCisgICAgLyogYWRkIGF0dHJpYnV0ZSBuYW1lIHRvIGRvbSAqLworICAgIGlmIChhdHQpCisgICAgeyAqYXR0ID0gKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlKSk7CisgICAgICAgaWYgKCEqYXR0KQorICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICAgKCphdHQpLT5uZXh0ID0gTlVMTDsKKyAgICAgICAoKmF0dCktPm5zdHIgPSBOVUxMOworICAgICAgICgqYXR0KS0+bmFtZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPnRtcGJ1Zik7CisgICAgICAgKCphdHQpLT5kYXRhID0gTlVMTDsKKyAgICAgICAoKmF0dCktPndpZGUgPSBOVUxMOworICAgICAgICgqYXR0KS0+c29hcCA9IHNvYXA7CisgICAgfQorI2VuZGlmCisgICAgaWYgKCFzdHJuY21wKHNvYXAtPnRtcGJ1ZiwgInhtbG5zIiwgNSkpCisgICAgeyBpZiAoc29hcC0+dG1wYnVmWzVdID09ICc6JykKKyAgICAgIHsgc29hcC0+dG1wYnVmWzVdID0gJ1wwJzsKKyAgICAgICAgdCA9IHNvYXAtPnRtcGJ1ZiArIDY7CisgICAgICB9CisgICAgICBlbHNlIGlmIChzb2FwLT50bXBidWZbNV0pCisgICAgICAgIHQgPSBOVUxMOworICAgICAgZWxzZQorICAgICAgICB0ID0gU09BUF9TVFJfRU9TOworICAgIH0KKyAgICBlbHNlCisgICAgICB0ID0gTlVMTDsKKyAgICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgICAgeyBpZiAoIVNPQVBfU1RSQ01QKHRwLT5uYW1lLCBzb2FwLT50bXBidWYpKQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCF0cCkKKyAgICB7IHRwID0gKHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSkgKyBzdHJsZW4oc29hcC0+dG1wYnVmKSk7CisgICAgICBpZiAoIXRwKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgIHN0cmNweSh0cC0+bmFtZSwgc29hcC0+dG1wYnVmKTsKKyAgICAgIHRwLT52YWx1ZSA9IE5VTEw7CisgICAgICB0cC0+c2l6ZSA9IDA7CisgICAgICB0cC0+bmV4dCA9IHNvYXAtPmF0dHJpYnV0ZXM7CisgICAgICBzb2FwLT5hdHRyaWJ1dGVzID0gdHA7CisgICAgfQorICAgIHdoaWxlIChzb2FwX2JsYW5rKGMpKQorICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICBpZiAoYyA9PSAnPScpCisgICAgeyBkbyBjID0gc29hcF9nZXR1dGY4KHNvYXApOworICAgICAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworICAgICAgaWYgKGMgIT0gU09BUF9RVCAmJiBjICE9IFNPQVBfQVApCisgICAgICB7IHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgIGMgPSAnICc7IC8qIGJsYW5rIGRlbGltaXRlciAqLworICAgICAgfQorICAgICAgaWYgKHNvYXBfZ2V0YXR0cnZhbChzb2FwLCB0cC0+dmFsdWUsIHRwLT5zaXplLCBjKSkKKyAgICAgIHsKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgICAgICAgaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfRU9NKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworCWlmIChzb2FwX3N0b3JlX2xhYihzb2FwLCB0cC0+dmFsdWUsIHRwLT5zaXplKSkKKwkgIHJldHVybiBzb2FwLT5lcnJvcjsKKwlpZiAodHAtPnZhbHVlKQorCSAgU09BUF9GUkVFKHNvYXAsIHRwLT52YWx1ZSk7CisJZm9yICg7OykKKwl7IGlmIChzb2FwX2dldGF0dHJ2YWwoc29hcCwgc29hcC0+bGFiYnVmICsgc29hcC0+bGFiaWR4LCBzb2FwLT5sYWJsZW4gLSBzb2FwLT5sYWJpZHgsIGMpKQorCSAgeyBpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9FT00pCisJICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworCSAgICBzb2FwLT5sYWJpZHggPSBzb2FwLT5sYWJsZW47CisJICAgIGlmIChzb2FwX2FwcGVuZF9sYWIoc29hcCwgTlVMTCwgMCkpCisJICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworCSAgfQorCSAgZWxzZQorCSAgICBicmVhazsKKwl9CisJaWYgKHNvYXAtPmxhYmlkeCkKKyAgICAgICAgICB0cC0+c2l6ZSA9IHNvYXAtPmxhYmxlbjsKKwllbHNlCisJeyB0cC0+c2l6ZSA9IHN0cmxlbihzb2FwLT5sYWJidWYpICsgMTsKKyAgICAgICAgICBpZiAodHAtPnNpemUgPCBTT0FQX0xBQkxFTikKKwkgICAgdHAtPnNpemUgPSBTT0FQX0xBQkxFTjsKKyAgICAgICAgfQorCWlmICghKHRwLT52YWx1ZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCB0cC0+c2l6ZSkpKQorCSAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICAgIHN0cmNweSh0cC0+dmFsdWUsIHNvYXAtPmxhYmJ1Zik7CisjZWxzZQorCXNpemVfdCBuOworICAgICAgICBpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9FT00pCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgICAgICAgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsgaWYgKCEocyA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgU09BUF9CTEtMRU4pKSkKKyAgICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgICBpZiAoc29hcF9nZXRhdHRydmFsKHNvYXAsIHMsIFNPQVBfQkxLTEVOLCBjKSkKKyAgICAgICAgICB7IGlmIChzb2FwLT5lcnJvciAhPSBTT0FQX0VPTSkKKyAgICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCW4gPSB0cC0+c2l6ZSArIHNvYXAtPmJsaXN0LT5zaXplOworICAgICAgICBpZiAoIShzID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIG4pKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgICAgaWYgKHRwLT52YWx1ZSkKKyAgICAgICAgeyBtZW1jcHkocywgdHAtPnZhbHVlLCB0cC0+c2l6ZSk7CisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHRwLT52YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgc29hcF9zYXZlX2Jsb2NrKHNvYXAsIHMgKyB0cC0+c2l6ZSwgMCk7CisgICAgICAgIHRwLT52YWx1ZSA9IHM7CisgICAgICAgIHRwLT5zaXplID0gbjsKKyNlbmRpZgorICAgICAgfQorICAgICAgZG8gYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyAgICAgIHRwLT52aXNpYmxlID0gMjsgLyogc2VlbiB0aGlzIGF0dHJpYnV0ZSB3LyB2YWx1ZSAqLworI2lmZGVmIFdJVEhfRE9NCisgICAgICBpZiAoYXR0KQorICAgICAgICAoKmF0dCktPmRhdGEgPSBzb2FwX3N0cmR1cChzb2FwLCB0cC0+dmFsdWUpOworI2VuZGlmCisgICAgfQorICAgIGVsc2UKKyAgICAgIHRwLT52aXNpYmxlID0gMTsgLyogc2VlbiB0aGlzIGF0dHJpYnV0ZSB3L28gdmFsdWUgKi8KKyNpZmRlZiBXSVRIX0RPTQorICAgIGlmIChhdHQpCisgICAgICBhdHQgPSAmKCphdHQpLT5uZXh0OworI2VuZGlmCisgICAgaWYgKHQgJiYgdHAtPnZhbHVlKQorICAgIHsgaWYgKHNvYXBfcHVzaF9uYW1lc3BhY2Uoc29hcCwgdCwgdHAtPnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgdHAtPnZpc2libGUgPSAwOworICAgIH0KKyAgfQorI2lmZGVmIFdJVEhfRE9NCisgIGlmIChhdHQpCisgIHsgc29hcC0+ZG9tLT5uc3RyID0gc29hcF9jdXJyZW50X25hbWVzcGFjZShzb2FwLCBzb2FwLT50YWcpOworICAgIGZvciAoYXR0ID0gJnNvYXAtPmRvbS0+YXR0czsgKmF0dDsgYXR0ID0gJigqYXR0KS0+bmV4dCkKKyAgICAgICgqYXR0KS0+bnN0ciA9IHNvYXBfY3VycmVudF9uYW1lc3BhY2Uoc29hcCwgKCphdHQpLT5uYW1lKTsKKyAgfQorI2VuZGlmCisgIGlmICgoaW50KWMgPT0gRU9GKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICBpZiAoIShzb2FwLT5ib2R5ID0gKGMgIT0gJy8nKSkpCisgICAgZG8gYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICB3aGlsZSAoc29hcF9ibGFuayhjKSk7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pCisgIHsgaWYgKCFzb2FwLT5ib2R5ICYmIHNvYXAtPmRvbS0+cHJudCkKKyAgICAgIHNvYXAtPmRvbSA9IHNvYXAtPmRvbS0+cHJudDsKKyAgfQorI2VuZGlmCisgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgeyBpZiAodHAtPnZpc2libGUgJiYgdHAtPnZhbHVlKQorICAgIHsgaWYgKCFzdHJjbXAodHAtPm5hbWUsICJpZCIpKQorICAgICAgeyAqc29hcC0+aWQgPSAnIyc7CisgICAgICAgIHN0cm5jcHkoc29hcC0+aWQgKyAxLCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT5pZCkgLSAyKTsKKyAgICAgICAgc29hcC0+aWRbc2l6ZW9mKHNvYXAtPmlkKS0xXSA9ICdcMCc7CisgICAgICB9CisgICAgICBlbHNlIGlmICghc3RyY21wKHRwLT5uYW1lLCAiaHJlZiIpKQorICAgICAgeyBzdHJuY3B5KHNvYXAtPmhyZWYsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPmhyZWYpIC0gMSk7CisgICAgICAgIHNvYXAtPmhyZWZbc2l6ZW9mKHNvYXAtPmhyZWYpLTFdID0gJ1wwJzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKChzb2FwLT52ZXJzaW9uID09IDIgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9HUkFQSCkpICYmICFzdHJjbXAodHAtPm5hbWUsICJyZWYiKSkKKyAgICAgIHsgKnNvYXAtPmhyZWYgPSAnIyc7CisgICAgICAgIHN0cm5jcHkoc29hcC0+aHJlZiArIDEsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPmhyZWYpIC0gMik7CisgICAgICAgIHNvYXAtPmhyZWZbc2l6ZW9mKHNvYXAtPmhyZWYpLTFdID0gJ1wwJzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgInhzaTp0eXBlIikpCisgICAgICB7IHN0cm5jcHkoc29hcC0+dHlwZSwgdHAtPnZhbHVlLCBzaXplb2Yoc29hcC0+dHlwZSkgLSAxKTsKKyAgICAgICAgc29hcC0+dHlwZVtzaXplb2Yoc29hcC0+dHlwZSktMV0gPSAnXDAnOworICAgICAgfQorICAgICAgZWxzZSBpZiAoc29hcC0+dmVyc2lvbiA9PSAxICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5DOmFycmF5VHlwZSIpKQorICAgICAgeyBzID0gc29hcF9zdHJyY2hyKHRwLT52YWx1ZSwgJ1snKTsKKyAgICAgICAgaWYgKHMgJiYgKHNpemVfdCkocyAtIHRwLT52YWx1ZSkgPCBzaXplb2Yoc29hcC0+YXJyYXlUeXBlKSkKKyAgICAgICAgeyBzdHJuY3B5KHNvYXAtPmFycmF5VHlwZSwgdHAtPnZhbHVlLCBzIC0gdHAtPnZhbHVlKTsKKyAgICAgICAgICBzb2FwLT5hcnJheVR5cGVbcyAtIHRwLT52YWx1ZV0gPSAnXDAnOworICAgICAgICAgIHN0cm5jcHkoc29hcC0+YXJyYXlTaXplLCBzLCBzaXplb2Yoc29hcC0+YXJyYXlTaXplKSAtIDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzdHJuY3B5KHNvYXAtPmFycmF5VHlwZSwgdHAtPnZhbHVlLCBzaXplb2Yoc29hcC0+YXJyYXlUeXBlKSAtIDEpOworICAgICAgICBzb2FwLT5hcnJheVNpemVbc2l6ZW9mKHNvYXAtPmFycmF5VHlwZSktMV0gPSAnXDAnOworICAgICAgICBzb2FwLT5hcnJheVR5cGVbc2l6ZW9mKHNvYXAtPmFycmF5VHlwZSktMV0gPSAnXDAnOworICAgICAgfQorICAgICAgZWxzZSBpZiAoc29hcC0+dmVyc2lvbiA9PSAyICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5DOml0ZW1UeXBlIikpCisgICAgICAgIHN0cm5jcHkoc29hcC0+YXJyYXlUeXBlLCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT5hcnJheVR5cGUpIC0gMSk7CisgICAgICBlbHNlIGlmIChzb2FwLT52ZXJzaW9uID09IDIgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTkM6YXJyYXlTaXplIikpCisgICAgICAgIHN0cm5jcHkoc29hcC0+YXJyYXlTaXplLCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT5hcnJheVNpemUpIC0gMSk7CisgICAgICBlbHNlIGlmIChzb2FwLT52ZXJzaW9uID09IDEgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTkM6b2Zmc2V0IikpCisgICAgICAgIHN0cm5jcHkoc29hcC0+YXJyYXlPZmZzZXQsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPmFycmF5T2Zmc2V0KSk7CisgICAgICBlbHNlIGlmIChzb2FwLT52ZXJzaW9uID09IDEgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTkM6cG9zaXRpb24iKSkKKyAgICAgICAgc29hcC0+cG9zaXRpb24gPSBzb2FwX2dldHBvc2l0aW9uKHRwLT52YWx1ZSwgc29hcC0+cG9zaXRpb25zKTsKKyAgICAgIGVsc2UgaWYgKHNvYXAtPnZlcnNpb24gPT0gMSAmJiAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOQzpyb290IikpCisgICAgICAgIHNvYXAtPnJvb3QgPSAoKCFzdHJjbXAodHAtPnZhbHVlLCAiMSIpIHx8ICFzdHJjbXAodHAtPnZhbHVlLCAidHJ1ZSIpKSk7CisgICAgICBlbHNlIGlmICgoc29hcC0+dmVyc2lvbiA9PSAxICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5WOmFjdG9yIikpCisgICAgICAgICAgICB8fCAoc29hcC0+dmVyc2lvbiA9PSAyICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5WOnJvbGUiKSkpCisgICAgICB7IGlmICgoIXNvYXAtPmFjdG9yIHx8IHN0cmNtcChzb2FwLT5hY3RvciwgdHAtPnZhbHVlKSkKKyAgICAgICAgICYmIHN0cmNtcCh0cC0+dmFsdWUsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2FjdG9yL25leHQiKQorICAgICAgICAgJiYgc3RyY21wKHRwLT52YWx1ZSwgImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZS9yb2xlL25leHQiKSkKKyAgICAgICAgICBzb2FwLT5vdGhlciA9IDE7CisgICAgICB9CisgICAgICBlbHNlIGlmICghc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOVjptdXN0VW5kZXJzdGFuZCIpCisgICAgICAgICAgICAmJiAoIXN0cmNtcCh0cC0+dmFsdWUsICIxIikgfHwgIXN0cmNtcCh0cC0+dmFsdWUsICJ0cnVlIikpKQorICAgICAgICBzb2FwLT5tdXN0VW5kZXJzdGFuZCA9IDE7CisgICAgICBlbHNlIGlmICgoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAieHNpOm51bGwiKQorICAgICAgICAgICAgIHx8ICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgInhzaTpuaWwiKSkKKyAgICAgICAgICAgICYmICghc3RyY21wKHRwLT52YWx1ZSwgIjEiKQorICAgICAgICAgICAgIHx8ICFzdHJjbXAodHAtPnZhbHVlLCAidHJ1ZSIpKSkKKyAgICAgICAgc29hcC0+bnVsbCA9IDE7CisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3JldHJ5KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIHNvYXBfcmV2ZXJ0KHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9yZXZlcnQoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmICghc29hcC0+cGVla2VkKQorICB7IHNvYXAtPnBlZWtlZCA9IDE7CisgICAgaWYgKHNvYXAtPmJvZHkpCisgICAgICBzb2FwLT5sZXZlbC0tOworICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmV2ZXJ0aW5nIGxhc3QgZWxlbWVudCAobGV2ZWw9JXUpXG4iLCBzb2FwLT5sZXZlbCkpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3N0cmluZ19vdXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGludCBmbGFnKQoreyByZWdpc3RlciBjb25zdCBjaGFyICp0OworICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgbWFzayA9IDB4RkZGRkZGODBVTDsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBzb2FwLT5kb20tPmRhdGEgPSBzb2FwX3N0cmR1cChzb2FwLCBzKTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2VuZGlmCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9DX1VURlNUUklORykKKyAgICBtYXNrID0gMDsKKyAgdCA9IHM7CisgIHdoaWxlICgoYyA9ICp0KyspKQorICB7IHN3aXRjaCAoYykKKyAgICB7IAorICAgIGNhc2UgOToKKyAgICAgIGlmIChmbGFnKQorICAgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIiYjeDk7IiwgNSkpCisJICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHMgPSB0OworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAxMDoKKyAgICAgIGlmIChmbGFnIHx8ICEoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkpCisgICAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiJiN4QTsiLCA1KSkKKwkgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgcyA9IHQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDEzOgorICAgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICImI3hEOyIsIDUpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBzID0gdDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJyYnOgorICAgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICImYW1wOyIsIDUpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBzID0gdDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJzwnOgorICAgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICImbHQ7IiwgNCkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHMgPSB0OworICAgICAgYnJlYWs7CisgICAgY2FzZSAnPic6CisgICAgICBpZiAoIWZsYWcpCisgICAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiJmd0OyIsIDQpKQorCSAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBzID0gdDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJyInOgorICAgICAgaWYgKGZsYWcpCisgICAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiJnF1b3Q7IiwgNikpCisJICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHMgPSB0OworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZmRlZiBIQVZFX01CVE9XQworICAgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0NfTUJTVFJJTkcpCisgICAgICB7IHdjaGFyX3Qgd2M7CisgICAgICAgIHJlZ2lzdGVyIGludCBtID0gbWJ0b3djKCZ3YywgdCAtIDEsIE1CX0NVUl9NQVgpOworICAgICAgICBpZiAobSA+IDAgJiYgd2MgIT0gYykKKyAgICAgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfcHV0dXRmOChzb2FwLCB3YykpCisgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisJICBzID0gdCArPSBtIC0gMTsKKwkgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKyNlbmRpZgorICAgICAgaWYgKGMgJiBtYXNrKQorICAgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfcHV0dXRmOChzb2FwLCAodW5zaWduZWQgY2hhciljKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHMgPSB0OworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3N0cmluZ19pbihzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGZsYWcsIGxvbmcgbWlubGVuLCBsb25nIG1heGxlbikKK3sgcmVnaXN0ZXIgY2hhciAqczsKKyAgY2hhciAqdCA9IE5VTEw7CisgIHJlZ2lzdGVyIHNpemVfdCBpOworICByZWdpc3RlciBsb25nIGwgPSAwOworICByZWdpc3RlciBpbnQgbiA9IDA7CisgIHJlZ2lzdGVyIGludCBtID0gMDsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworI2lmICFkZWZpbmVkKFdJVEhfTEVBTkVSKSAmJiBkZWZpbmVkKEhBVkVfV0NUT01CKQorICBjaGFyIGJ1ZltNQl9MRU5fTUFYID4gOCA/IE1CX0xFTl9NQVggOiA4XTsKKyNlbHNlCisgIGNoYXIgYnVmWzhdOworI2VuZGlmCisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWFkaW5nIHN0cmluZyBjb250ZW50XG4iKSk7CisgIGlmIChzb2FwLT5wZWVrZWQpCisgIHsgaWYgKCFzb2FwLT5ib2R5KQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCpzb2FwLT50YWcpCisgICAgeyBuID0gMTsKKyAgICAgIHNvYXAtPnBlZWtlZCA9IDA7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgdCA9IHNvYXAtPnRtcGJ1ZjsKKyAgICAgIHRbMF0gPSAnPCc7CisgICAgICBzdHJuY3B5KHQgKyAxLCBzb2FwLT50YWcsIHNpemVvZihzb2FwLT50bXBidWYpIC0gMSk7CisgICAgICBzdHJuY2F0KHQsICI+Iiwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZikpOworICAgICAgbSA9IHN0cmxlbihzb2FwLT50YWcpICsgMjsKKyNlbmRpZgorICAgIH0KKyAgfQorI2lmZGVmIFdJVEhfQ0RBVEEKKyAgaWYgKCFmbGFnKQorICB7IHJlZ2lzdGVyIGludCBzdGF0ZSA9IDA7CisjaWZkZWYgV0lUSF9GQVNUCisgICAgc29hcC0+bGFiaWR4ID0gMDsJCQkvKiB1c2UgbG9vay1hc2lkZSBidWZmZXIgKi8KKyNlbHNlCisgICAgaWYgKHNvYXBfbmV3X2Jsb2NrKHNvYXApKQorICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgICBmb3IgKDs7KQorICAgIHsgCisjaWZkZWYgV0lUSF9GQVNUCisgICAgICByZWdpc3RlciBzaXplX3QgazsKKyAgICAgIGlmIChzb2FwX2FwcGVuZF9sYWIoc29hcCwgTlVMTCwgMCkpCS8qIGFsbG9jYXRlIG1vcmUgc3BhY2UgaW4gbG9vay1hc2lkZSBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgcyA9IHNvYXAtPmxhYmJ1ZiArIHNvYXAtPmxhYmlkeDsJLyogc3BhY2UgdG8gcG9wdWxhdGUgKi8KKyAgICAgIGsgPSBzb2FwLT5sYWJsZW4gLSBzb2FwLT5sYWJpZHg7CS8qIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgKi8KKyAgICAgIHNvYXAtPmxhYmlkeCA9IHNvYXAtPmxhYmxlbjsJLyogY2xhaW0gdGhpcyBzcGFjZSAqLworI2Vsc2UKKyAgICAgIHJlZ2lzdGVyIHNpemVfdCBrID0gU09BUF9CTEtMRU47CisgICAgICBpZiAoIShzID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBrKSkpCisgICAgICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgICAgICBmb3IgKGkgPSAwOyBpIDwgazsgaSsrKQorICAgICAgeyBpZiAobSA+IDApCisgICAgICAgIHsgKnMrKyA9ICp0Kys7CS8qIGNvcHkgbXVsdGlieXRlIGNoYXJhY3RlcnMgKi8KKwkgIG0tLTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworCWlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICBpZiAoYyA+PSAweDgwICYmICEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0xBVElOKSkKKyAgICAgICAgeyBzb2FwX3VuZ2V0KHNvYXAsIGMpOworCSAgYyA9IHNvYXBfZ2V0dXRmOChzb2FwKTsKKwkgIGlmIChzb2FwLT5tb2RlICYgU09BUF9DX1VURlNUUklORykKKyAgICAgICAgICB7IGlmICgoYyAmIDB4ODAwMDAwMDApICYmIGMgPj0gLTB4N0ZGRkZGODAgJiYgYyA8IFNPQVBfQVApCisgICAgICAgICAgICB7IGMgJj0gMHg3RkZGRkZGRjsKKyAgICAgICAgICAgICAgdCA9IGJ1ZjsKKyAgICAgICAgICAgICAgaWYgKGMgPCAweDA4MDApCisgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEMwIHwgKChjID4+IDYpICYgMHgxRikpOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsgaWYgKGMgPCAweDAxMDAwMCkKKyAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhFMCB8ICgoYyA+PiAxMikgJiAweDBGKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsgaWYgKGMgPCAweDIwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEYwIHwgKChjID4+IDE4KSAmIDB4MDcpKTsKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHsgaWYgKGMgPCAweDA0MDAwMDAwKQorICAgICAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhGOCB8ICgoYyA+PiAyNCkgJiAweDAzKSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeyAqdCsrID0gKGNoYXIpKDB4RkMgfCAoKGMgPj4gMzApICYgMHgwMSkpOworICAgICAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAyNCkgJiAweDNGKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDE4KSAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgICAgIH0gICAgIAorICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDEyKSAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDYpICYgMHgzRikpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8IChjICYgMHgzRikpOworCSAgICAgIG0gPSAoaW50KSh0IC0gYnVmKSAtIDE7CisgICAgICAgICAgICAgIHQgPSBidWY7CisgICAgICAgICAgICAgICpzKysgPSAqdCsrOworICAgICAgICAgICAgICBjb250aW51ZTsKKwkgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCXN3aXRjaCAoc3RhdGUpCisgICAgICAgIHsgY2FzZSAxOgorICAgICAgICAgICAgaWYgKGMgPT0gJ10nKQorCSAgICAgIHN0YXRlID0gNDsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworCSAgY2FzZSAyOgorCSAgICBpZiAoYyA9PSAnLScpCisgICAgICAgICAgICAgIHN0YXRlID0gNjsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworCSAgY2FzZSAzOgorCSAgICBpZiAoYyA9PSAnPycpCisJICAgICAgc3RhdGUgPSA4OworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisgICAgICAgICAgLyogQ0RBVEEgKi8KKwkgIGNhc2UgNDoKKwkgICAgaWYgKGMgPT0gJ10nKQorICAgICAgICAgICAgICBzdGF0ZSA9IDU7CisJICAgIGVsc2UKKwkgICAgICBzdGF0ZSA9IDE7CisJICAgICpzKysgPSBjOworCSAgICBjb250aW51ZTsKKwkgIGNhc2UgNToKKwkgICAgaWYgKGMgPT0gJz4nKQorCSAgICAgIHN0YXRlID0gMDsKKwkgICAgZWxzZQorCSAgICAgIHN0YXRlID0gMTsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworICAgICAgICAgIC8qIGNvbW1lbnQgKi8KKyAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICBpZiAoYyA9PSAnLScpCisJICAgICAgc3RhdGUgPSA3OworCSAgICBlbHNlCisJICAgICAgc3RhdGUgPSAyOworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgaWYgKGMgPT0gJz4nKQorCSAgICAgIHN0YXRlID0gMDsKKwkgICAgZWxzZQorCSAgICAgIHN0YXRlID0gMjsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworICAgICAgICAgIC8qIFBJICovCisJICBjYXNlIDg6CisgICAgICAgICAgICBpZiAoYyA9PSAnPicpCisJICAgICAgc3RhdGUgPSAwOworCSAgICBlbHNlCisJICAgICAgc3RhdGUgPSAzOworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChjKQorICAgICAgICB7CisgICAgICAgIGNhc2UgJy8nOgorICAgICAgICAgIGlmIChuID4gMCkKKyAgICAgICAgICB7IGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgICAgICAgICAgICBpZiAoYyA9PSAnPicpCisgICAgICAgICAgICAgIG4tLTsKKyAgICAgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgICAgfQorICAgICAgICAgICpzKysgPSAnLyc7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzwnOgorCSAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKwkgIGlmIChjID09ICcvJykKKwkgIHsgaWYgKG4gPT0gMCkKKwkgICAgeyBjID0gU09BUF9UVDsKKwkgICAgICBnb3RvIGVuZDsKKwkgICAgfQorCSAgICBuLS07CisJICB9CisJICBlbHNlIGlmIChjID09ICchJykKKwkgIHsgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKwkgICAgaWYgKGMgPT0gJ1snKQorICAgICAgICAgICAgeyBkbyBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICAgICAgICAgICAgICB3aGlsZSAoKGludCljICE9IEVPRiAmJiBjICE9ICdbJyk7CisgICAgICAgICAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKwkgICAgICB0ID0gKGNoYXIqKSIhW0NEQVRBWyI7CisJICAgICAgbSA9IDg7CisJICAgICAgc3RhdGUgPSAxOworCSAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjID09ICctJykKKwkgICAgeyBpZiAoKGMgPSBzb2FwX2dldGNoYXIoc29hcCkpID09ICctJykKKwkgICAgICAgIHN0YXRlID0gMjsKKwkgICAgICB0ID0gKGNoYXIqKSIhLSI7CisJICAgICAgbSA9IDI7CisJICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsgdCA9IChjaGFyKikiISI7CisJICAgICAgbSA9IDE7CisJICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKwkgICAgfQorCSAgICAqcysrID0gJzwnOworCSAgICBicmVhazsKKwkgIH0KKwkgIGVsc2UgaWYgKGMgPT0gJz8nKQorCSAgICBzdGF0ZSA9IDM7CisJICBlbHNlCisJICAgIG4rKzsKKyAgICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICAgICpzKysgPSAnPCc7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJz4nOgorICAgICAgICAgICpzKysgPSAnPic7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJyInOgorICAgICAgICAgICpzKysgPSAnIic7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZkZWYgSEFWRV9XQ1RPTUIKKyAgICAgICAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfQ19NQlNUUklORykKKyAgICAgICAgICB7IG0gPSB3Y3RvbWIoYnVmLCBjICYgMHg3RkZGRkZGRik7CisgICAgICAgICAgICBpZiAobSA+PSAxICYmIG0gPD0gKGludClNQl9DVVJfTUFYKQorICAgICAgICAgICAgeyB0ID0gYnVmOworICAgICAgICAgICAgICAqcysrID0gKnQrKzsKKyAgICAgICAgICAgICAgbS0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAqcysrID0gU09BUF9VTktOT1dOX0NIQVI7CisJICAgICAgbSA9IDA7CisJICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorI2VuZGlmCisjZW5kaWYKKyAgICAgICAgICAgICpzKysgPSAoY2hhcikoYyAmIDB4RkYpOworICAgICAgICB9CisJbCsrOworICAgICAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIG1heGxlbiA+PSAwICYmIGwgPiBtYXhsZW4pCisgICAgICAgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlN0cmluZyB0b28gbG9uZzogbWF4bGVuPSVsZFxuIiwgbWF4bGVuKSk7CisgICAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0xFTkdUSDsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorI2VuZGlmCisjaWZkZWYgV0lUSF9GQVNUCisgIHNvYXAtPmxhYmlkeCA9IDA7CQkJLyogdXNlIGxvb2stYXNpZGUgYnVmZmVyICovCisjZWxzZQorICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgZm9yICg7OykKKyAgeyAKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgICByZWdpc3RlciBzaXplX3QgazsKKyAgICBpZiAoc29hcF9hcHBlbmRfbGFiKHNvYXAsIE5VTEwsIDApKQkvKiBhbGxvY2F0ZSBtb3JlIHNwYWNlIGluIGxvb2stYXNpZGUgYnVmZmVyIGlmIG5lY2Vzc2FyeSAqLworICAgICAgcmV0dXJuIE5VTEw7CisgICAgcyA9IHNvYXAtPmxhYmJ1ZiArIHNvYXAtPmxhYmlkeDsJLyogc3BhY2UgdG8gcG9wdWxhdGUgKi8KKyAgICBrID0gc29hcC0+bGFibGVuIC0gc29hcC0+bGFiaWR4OwkvKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlICovCisgICAgc29hcC0+bGFiaWR4ID0gc29hcC0+bGFibGVuOwkvKiBjbGFpbSB0aGlzIHNwYWNlICovCisjZWxzZQorICAgIHJlZ2lzdGVyIHNpemVfdCBrID0gU09BUF9CTEtMRU47CisgICAgaWYgKCEocyA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgaykpKQorICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgICBmb3IgKGkgPSAwOyBpIDwgazsgaSsrKQorICAgIHsgaWYgKG0gPiAwKQorICAgICAgeyAqcysrID0gKnQrKzsJLyogY29weSBtdWx0aWJ5dGUgY2hhcmFjdGVycyAqLworICAgICAgICBtLS07CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0NfVVRGU1RSSU5HKQorICAgICAgeyBpZiAoKChjID0gc29hcF9nZXQoc29hcCkpICYgMHg4MDAwMDAwMCkgJiYgYyA+PSAtMHg3RkZGRkY4MCAmJiBjIDwgU09BUF9BUCkKKyAgICAgICAgeyBjICY9IDB4N0ZGRkZGRkY7CisgICAgICAgICAgdCA9IGJ1ZjsKKyAgICAgICAgICBpZiAoYyA8IDB4MDgwMCkKKyAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhDMCB8ICgoYyA+PiA2KSAmIDB4MUYpKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeyBpZiAoYyA8IDB4MDEwMDAwKQorICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RTAgfCAoKGMgPj4gMTIpICYgMHgwRikpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyBpZiAoYyA8IDB4MjAwMDAwKQorICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhGMCB8ICgoYyA+PiAxOCkgJiAweDA3KSk7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeyBpZiAoYyA8IDB4MDQwMDAwMDApCisgICAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjggfCAoKGMgPj4gMjQpICYgMHgwMykpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7ICp0KysgPSAoY2hhcikoMHhGQyB8ICgoYyA+PiAzMCkgJiAweDAxKSk7CisgICAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMjQpICYgMHgzRikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTgpICYgMHgzRikpOworICAgICAgICAgICAgICB9ICAgICAKKyAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDEyKSAmIDB4M0YpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKGMgJiAweDNGKSk7CisJICBtID0gKGludCkodCAtIGJ1ZikgLSAxOworICAgICAgICAgIHQgPSBidWY7CisgICAgICAgICAgKnMrKyA9ICp0Kys7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgYyA9IHNvYXBfZ2V0dXRmOChzb2FwKTsKKyAgICAgIHN3aXRjaCAoYykKKyAgICAgIHsKKyAgICAgIGNhc2UgU09BUF9UVDoKKyAgICAgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgbi0tOworICAgICAgICAqcysrID0gJzwnOworICAgICAgICB0ID0gKGNoYXIqKSIvIjsKKwltID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfTFQ6CisgICAgICAgIG4rKzsKKyAgICAgICAgKnMrKyA9ICc8JzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfR1Q6CisgICAgICAgICpzKysgPSAnPic7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTT0FQX1FUOgorICAgICAgICAqcysrID0gJyInOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9BUDoKKyAgICAgICAgKnMrKyA9ICdcJyc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnLyc6CisgICAgICAgIGlmIChuID4gMCkKKyAgICAgICAgeyBjID0gc29hcF9nZXQoc29hcCk7CisgICAgICAgICAgaWYgKGMgPT0gU09BUF9HVCkKKyAgICAgICAgICAgIG4tLTsKKyAgICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICB9CisgICAgICAgICpzKysgPSAnLyc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnPCcgfCAweDgwMDAwMDAwOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gJzwnOworICAgICAgICBlbHNlCisgICAgICAgIHsgKnMrKyA9ICcmJzsKKyAgICAgICAgICB0ID0gKGNoYXIqKSJsdDsiOworCSAgbSA9IDM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICc+JyB8IDB4ODAwMDAwMDA6CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICpzKysgPSAnPic7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAqcysrID0gJyYnOworICAgICAgICAgIHQgPSAoY2hhciopImd0OyI7CisJICBtID0gMzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJyYnIHwgMHg4MDAwMDAwMDoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9ICcmJzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAnJic7CisgICAgICAgICAgdCA9IChjaGFyKikiYW1wOyI7CisJICBtID0gNDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJyInIHwgMHg4MDAwMDAwMDoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9ICciJzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAnJic7CisgICAgICAgICAgdCA9IChjaGFyKikicXVvdDsiOworCSAgbSA9IDU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdcJycgfCAweDgwMDAwMDAwOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gJ1wnJzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAnJic7CisgICAgICAgICAgdCA9IChjaGFyKikiYXBvczsiOworCSAgbSA9IDU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgICBnb3RvIGVuZDsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZmRlZiBIQVZFX1dDVE9NQgorICAgICAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfQ19NQlNUUklORykKKyAgICAgICAgeyBtID0gd2N0b21iKGJ1ZiwgYyAmIDB4N0ZGRkZGRkYpOworICAgICAgICAgIGlmIChtID49IDEgJiYgbSA8PSAoaW50KU1CX0NVUl9NQVgpCisgICAgICAgICAgeyB0ID0gYnVmOworICAgICAgICAgICAgKnMrKyA9ICp0Kys7CisgICAgICAgICAgICBtLS07CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7ICpzKysgPSBTT0FQX1VOS05PV05fQ0hBUjsKKwkgICAgbSA9IDA7CisJICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmCisjZW5kaWYKKyAgICAgICAgICAqcysrID0gKGNoYXIpKGMgJiAweEZGKTsKKyAgICAgIH0KKyAgICAgIGwrKzsKKyAgICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgbWF4bGVuID49IDAgJiYgbCA+IG1heGxlbikKKyAgICAgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlN0cmluZyB0b28gbG9uZzogbWF4bGVuPSVsZFxuIiwgbWF4bGVuKSk7CisgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9MRU5HVEg7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgIH0KKyAgfQorZW5kOgorICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAqcyA9ICdcMCc7CisjaWZkZWYgV0lUSF9GQVNUCisgIHQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT5sYWJidWYpOworI2Vsc2UKKyAgc29hcF9zaXplX2Jsb2NrKHNvYXAsIGkrMSk7CisgIHQgPSBzb2FwX3NhdmVfYmxvY2soc29hcCwgTlVMTCwgMCk7CisjZW5kaWYKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiBsIDwgbWlubGVuKQorICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJTdHJpbmcgdG9vIHNob3J0OiAlbGQgY2hhcnMsIG1pbmxlbj0lbGRcbiIsIGwsIG1pbmxlbikpOworICAgIHNvYXAtPmVycm9yID0gU09BUF9MRU5HVEg7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBpZiAoZmxhZyA9PSAzKQorICAgICAgc29hcC0+ZG9tLT50YWlsID0gdDsKKyAgICBlbHNlCisgICAgICBzb2FwLT5kb20tPmRhdGEgPSB0OworICB9CisjZW5kaWYKKyAgaWYgKGZsYWcgPT0gMikKKyAgICBpZiAoc29hcF9zMlFOYW1lKHNvYXAsIHQsICZ0KSkKKyAgICAgIHJldHVybiBOVUxMOworICByZXR1cm4gdDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF93c3RyaW5nX291dChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgd2NoYXJfdCAqcywgaW50IGZsYWcpCit7IGNvbnN0IGNoYXIgKnQ7CisgIGNoYXIgdG1wOworICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgd2NoYXJfdCAqciA9ICh3Y2hhcl90KilzOworICAgIGludCBuID0gMTsKKyAgICB3aGlsZSAoKnIrKykKKyAgICAgIG4rKzsKKyAgICBzb2FwLT5kb20tPndpZGUgPSByID0gKHdjaGFyX3QqKXNvYXBfbWFsbG9jKHNvYXAsIG4gKiBzaXplb2Yod2NoYXJfdCkpOworICAgIHdoaWxlIChuLS0pCisgICAgICAqcisrID0gKnMrKzsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2VuZGlmCisgIHdoaWxlICgoYyA9ICpzKyspKQorICB7IHN3aXRjaCAoYykKKyAgICB7IAorICAgIGNhc2UgOToKKyAgICAgIGlmIChmbGFnKQorICAgICAgICB0ID0gIiYjeDk7IjsKKyAgICAgIGVsc2UKKyAgICAgICAgdCA9ICJcdCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEwOgorICAgICAgaWYgKGZsYWcgfHwgIShzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKSkKKyAgICAgICAgdCA9ICImI3hBOyI7CisgICAgICBlbHNlCisgICAgICAgIHQgPSAiXG4iOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMzoKKyAgICAgIHQgPSAiJiN4RDsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnJic6CisgICAgICB0ID0gIiZhbXA7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJzwnOgorICAgICAgdCA9ICImbHQ7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJz4nOgorICAgICAgaWYgKGZsYWcpCisgICAgICAgIHQgPSAiPiI7CisgICAgICBlbHNlCisJdCA9ICImZ3Q7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJyInOgorICAgICAgaWYgKGZsYWcpCisgICAgICAgIHQgPSAiJnF1b3Q7IjsKKyAgICAgIGVsc2UKKyAgICAgICAgdCA9ICJcIiI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKGMgPiAwICYmIGMgPCAweDgwKQorICAgICAgeyB0bXAgPSAoY2hhciljOworICAgICAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAmdG1wLCAxKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB9CisgICAgICBlbHNlIGlmIChzb2FwX3B1dHV0Zjgoc29hcCwgKHVuc2lnbmVkIGxvbmcpYykpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoc29hcF9zZW5kKHNvYXAsIHQpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit3Y2hhcl90ICoKK1NPQVBfRk1BQzIKK3NvYXBfd3N0cmluZ19pbihzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGZsYWcsIGxvbmcgbWlubGVuLCBsb25nIG1heGxlbikKK3sgd2NoYXJfdCAqczsKKyAgcmVnaXN0ZXIgaW50IGksIG4gPSAwOworICByZWdpc3RlciBsb25nIGwgPSAwOworICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIGNvbnN0IGNoYXIgKnQgPSBOVUxMOworICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVhZGluZyB3aWRlIHN0cmluZyBjb250ZW50XG4iKSk7CisgIGlmIChzb2FwLT5wZWVrZWQpCisgIHsgaWYgKCFzb2FwLT5ib2R5KQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCpzb2FwLT50YWcpCisgICAgeyBuID0gMTsKKyAgICAgIHNvYXAtPnBlZWtlZCA9IDA7CisgICAgfQorICB9CisgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgZm9yICg7OykKKyAgeyBpZiAoIShzID0gKHdjaGFyX3QqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBzaXplb2Yod2NoYXJfdCkqU09BUF9CTEtMRU4pKSkKKyAgICAgIHJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0JMS0xFTjsgaSsrKQorICAgIHsgaWYgKHQpCisgICAgICB7ICpzKysgPSAod2NoYXJfdCkqdCsrOworICAgICAgICBpZiAoISp0KQorICAgICAgICAgIHQgPSBOVUxMOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisgICAgICBzd2l0Y2ggKGMpCisgICAgICB7CisgICAgICBjYXNlIFNPQVBfVFQ6CisgICAgICAgIGlmIChuID09IDApCisgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIG4tLTsKKyAgICAgICAgKnMrKyA9ICc8JzsKKyAgICAgICAgc29hcF91bmdldChzb2FwLCAnLycpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9MVDoKKyAgICAgICAgbisrOworICAgICAgICAqcysrID0gJzwnOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9HVDoKKyAgICAgICAgKnMrKyA9ICc+JzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfUVQ6CisgICAgICAgICpzKysgPSAnIic7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTT0FQX0FQOgorICAgICAgICAqcysrID0gJ1wnJzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICcvJzoKKyAgICAgICAgaWYgKG4gPiAwKQorICAgICAgICB7IGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisgICAgICAgICAgaWYgKGMgPT0gU09BUF9HVCkKKyAgICAgICAgICAgIG4tLTsKKyAgICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICB9CisgICAgICAgICpzKysgPSAnLyc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnPCc6CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICpzKysgPSAoc29hcF93Y2hhciknPCc7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAqcysrID0gKHNvYXBfd2NoYXIpJyYnOworICAgICAgICAgIHQgPSAibHQ7IjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJz4nOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gKHNvYXBfd2NoYXIpJz4nOworICAgICAgICBlbHNlCisgICAgICAgIHsgKnMrKyA9IChzb2FwX3djaGFyKScmJzsKKyAgICAgICAgICB0ID0gImd0OyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICciJzoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9IChzb2FwX3djaGFyKSciJzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAoc29hcF93Y2hhciknJic7CisgICAgICAgICAgdCA9ICJxdW90OyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgKnMrKyA9ICh3Y2hhcl90KWMgJiAweDdGRkZGRkZGOworICAgICAgfQorICAgICAgbCsrOworICAgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiBtYXhsZW4gPj0gMCAmJiBsID4gbWF4bGVuKQorICAgICAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiU3RyaW5nIHRvbyBsb25nOiBtYXhsZW49JWxkXG4iLCBtYXhsZW4pKTsKKyAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0xFTkdUSDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgfQorICB9CitlbmQ6CisgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICpzID0gJ1wwJzsKKyAgc29hcF9zaXplX2Jsb2NrKHNvYXAsIHNpemVvZih3Y2hhcl90KSAqIChpICsgMSkpOworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIGwgPCBtaW5sZW4pCisgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlN0cmluZyB0b28gc2hvcnQ6ICVsZCBjaGFycywgbWlubGVuPSVsZFxuIiwgbCwgbWlubGVuKSk7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0xFTkdUSDsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBzID0gKHdjaGFyX3QqKXNvYXBfc2F2ZV9ibG9jayhzb2FwLCBOVUxMLCAwKTsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgICBzb2FwLT5kb20tPndpZGUgPSBzOworI2VuZGlmCisgIHJldHVybiBzOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9pbnQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4pCit7IHJldHVybiBzb2FwX2xvbmcycyhzb2FwLCAobG9uZyluKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRpbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBpbnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfbG9uZzJzKHNvYXAsIChsb25nKSpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMmludChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgaW50ICpwKQoreyBpZiAocykKKyAgeyBjaGFyICpyOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgc29hcF9yZXNldF9lcnJubzsKKyNlbmRpZgorI2VuZGlmCisgICAgKnAgPSAoaW50KXNvYXBfc3RydG9sKHMsICZyLCAxMCk7CisgICAgaWYgKChzID09IHIgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKSB8fCAqcgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgIHx8IHNvYXBfZXJybm8gPT0gU09BUF9FUkFOR0UKKyNlbmRpZgorI2VuZGlmCisgICAgKQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5pbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjppbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpzaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAoaW50Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YoaW50KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKGludCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihpbnQpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMmludChzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9sb25nMnMoc3RydWN0IHNvYXAgKnNvYXAsIGxvbmcgbikKK3sgc3ByaW50Zihzb2FwLT50bXBidWYsICIlbGQiLCBuKTsKKyAgcmV0dXJuIHNvYXAtPnRtcGJ1ZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRsb25nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgbG9uZyAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9sb25nMnMoc29hcCwgKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MybG9uZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgbG9uZyAqcCkKK3sgaWYgKHMpCisgIHsgY2hhciAqcjsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgIHNvYXBfcmVzZXRfZXJybm87CisjZW5kaWYKKyNlbmRpZgorICAgICpwID0gc29hcF9zdHJ0b2wocywgJnIsIDEwKTsKKyAgICBpZiAoKHMgPT0gciAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpIHx8ICpyCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgfHwgc29hcF9lcnJubyA9PSBTT0FQX0VSQU5HRQorI2VuZGlmCisjZW5kaWYKKyAgICApCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitsb25nICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5sb25nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGxvbmcgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6Ynl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9IChsb25nKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YobG9uZyksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChsb25nKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKGxvbmcpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMmxvbmcoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfTE9ORzY0MnMoc3RydWN0IHNvYXAgKnNvYXAsIExPTkc2NCBuKQoreyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgU09BUF9MT05HX0ZPUk1BVCwgbik7CisgIHJldHVybiBzb2FwLT50bXBidWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0TE9ORzY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgTE9ORzY0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX0xPTkc2NDJzKHNvYXAsICpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMkxPTkc2NChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgTE9ORzY0ICpwKQoreyBpZiAocykKKyAgeworI2lmZGVmIEhBVkVfU1RSVE9MTAorICAgIGNoYXIgKnI7CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBzb2FwX3Jlc2V0X2Vycm5vOworI2VuZGlmCisjZW5kaWYKKyAgICAqcCA9IHN0cnRvbGwocywgJnIsIDEwKTsKKyAgICBpZiAoKHMgPT0gciAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpIHx8ICpyCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgICB8fCBzb2FwX2Vycm5vID09IFNPQVBfRVJBTkdFCisjZW5kaWYKKyNlbmRpZgorICAgICAgKQorI2Vsc2UKKyMgaWZkZWYgSEFWRV9TU0NBTkYKKyAgICBpZiAoc3NjYW5mKHMsIFNPQVBfTE9OR19GT1JNQVQsIHApICE9IDEpCisjIGVuZGlmCisjZW5kaWYKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK0xPTkc2NCAqCitTT0FQX0ZNQUMyCitzb2FwX2luTE9ORzY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIExPTkc2NCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6aW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnBvc2l0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOm5lZ2F0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOm5vblBvc2l0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOm5vbk5lZ2F0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmxvbmciKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjppbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpzaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAoTE9ORzY0Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YoTE9ORzY0KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKExPTkc2NCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihMT05HNjQpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMkxPTkc2NChzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9ieXRlMnMoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgbikKK3sgcmV0dXJuIHNvYXBfbG9uZzJzKHNvYXAsIChsb25nKW4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dGJ5dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX2xvbmcycyhzb2FwLCAobG9uZykqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJieXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBjaGFyICpwKQoreyBpZiAocykKKyAgeyBsb25nIG47CisgICAgY2hhciAqcjsKKyAgICBuID0gc29hcF9zdHJ0b2wocywgJnIsIDEwKTsKKyAgICBpZiAocyA9PSByIHx8ICpyIHx8IG4gPCAtMTI4IHx8IG4gPiAxMjcpCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICAqcCA9IChjaGFyKW47CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX2luYnl0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBjaGFyICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpieXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKGNoYXIqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihjaGFyKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKGNoYXIqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YoY2hhciksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MyYnl0ZShzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9zaG9ydDJzKHN0cnVjdCBzb2FwICpzb2FwLCBzaG9ydCBuKQoreyByZXR1cm4gc29hcF9sb25nMnMoc29hcCwgKGxvbmcpbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0c2hvcnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzaG9ydCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9sb25nMnMoc29hcCwgKGxvbmcpKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3Myc2hvcnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHNob3J0ICpwKQoreyBpZiAocykKKyAgeyBsb25nIG47CisgICAgY2hhciAqcjsKKyAgICBuID0gc29hcF9zdHJ0b2wocywgJnIsIDEwKTsKKyAgICBpZiAocyA9PSByIHx8ICpyIHx8IG4gPCAtMzI3NjggfHwgbiA+IDMyNzY3KQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgKnAgPSAoc2hvcnQpbjsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitzaG9ydCAqCitTT0FQX0ZNQUMyCitzb2FwX2luc2hvcnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc2hvcnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6Ynl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9IChzaG9ydCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKHNob3J0KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKHNob3J0Kilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKHNob3J0KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJzaG9ydChzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9mbG9hdDJzKHN0cnVjdCBzb2FwICpzb2FwLCBmbG9hdCBuKQoreyBjb25zdCBjaGFyICpzOworICBpZiAoc29hcF9pc25hbigoZG91YmxlKW4pKQorICAgIHMgPSAiTmFOIjsKKyAgZWxzZSBpZiAoc29hcF9pc3BpbmZmKG4pKQorICAgIHMgPSAiSU5GIjsKKyAgZWxzZSBpZiAoc29hcF9pc25pbmZmKG4pKQorICAgIHMgPSAiLUlORiI7CisgIGVsc2UKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1Ziwgc29hcC0+ZmxvYXRfZm9ybWF0LCBuKTsKKyAgICBzID0gc29hcC0+dG1wYnVmOworICB9CisgIHJldHVybiBzOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dGZsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgZmxvYXQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfZmxvYXQycyhzb2FwLCAqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJmbG9hdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgZmxvYXQgKnApCit7IGlmIChzKQorICB7IGlmICghKnMpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgaWYgKCFzb2FwX3RhZ19jbXAocywgIklORiIpKQorICAgICAgKnAgPSBGTFRfUElORlRZOworICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAocywgIitJTkYiKSkKKyAgICAgICpwID0gRkxUX1BJTkZUWTsKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHMsICItSU5GIikpCisgICAgICAqcCA9IEZMVF9OSU5GVFk7CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChzLCAiTmFOIikpCisgICAgICAqcCA9IEZMVF9OQU47CisgICAgZWxzZQorICAgIHsKKy8qIE9uIHNvbWUgc3lzdGVtcywgc3RydG9mIGFwcGVhcnMgdG8gYmUgYnJva2VuIG9yIGRvZXNuJ3QgbGluazogdXNlIHdpdGggY2F1dGlvbiAqLworI2lmIGRlZmluZWQoSEFWRV9TVFJUT0YpCisgICAgICBjaGFyICpyOworICAgICAgKnAgPSBzdHJ0b2YoKGNoYXIqKXMsICZyKTsKKyAgICAgIGlmICgqcikKKyNlbGlmIGRlZmluZWQoSEFWRV9TVFJUT0QpCisgICAgICBjaGFyICpyOworICAgICAgKnAgPSAoZmxvYXQpc3RydG9kKHMsICZyKTsKKyAgICAgIGlmICgqcikKKyNlbmRpZgorI2lmZGVmIEhBVkVfU1NDQU5GCisgICAgICAgIGlmIChzc2NhbmYocywgIiVnIiwgcCkgIT0gMSkKKyAgICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyNlbHNlCisgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworI2VuZGlmCisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBpbnQgc29hcF9pc251bWVyaWMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnR5cGUpCit7IGlmIChzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpmbG9hdCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmRvdWJsZSIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmRlY2ltYWwiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjppbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6cG9zaXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bmVnYXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bm9uUG9zaXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bm9uTmVnYXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bG9uZyIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6Ynl0ZSIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkTG9uZyIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkSW50IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRTaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkQnl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBTT0FQX0VSUjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2Zsb2F0ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5mbG9hdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBmbG9hdCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZSAhPSAnXDAnICYmIHNvYXBfaXNudW1lcmljKHNvYXAsIHR5cGUpKQorICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgIHAgPSAoZmxvYXQqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihmbG9hdCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChmbG9hdCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihmbG9hdCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MyZmxvYXQoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZG91YmxlMnMoc3RydWN0IHNvYXAgKnNvYXAsIGRvdWJsZSBuKQoreyBjb25zdCBjaGFyICpzOworICBpZiAoc29hcF9pc25hbihuKSkKKyAgICBzID0gIk5hTiI7CisgIGVsc2UgaWYgKHNvYXBfaXNwaW5mZChuKSkKKyAgICBzID0gIklORiI7CisgIGVsc2UgaWYgKHNvYXBfaXNuaW5mZChuKSkKKyAgICBzID0gIi1JTkYiOworICBlbHNlCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsIHNvYXAtPmRvdWJsZV9mb3JtYXQsIG4pOworICAgIHMgPSBzb2FwLT50bXBidWY7CisgIH0KKyAgcmV0dXJuIHM7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0ZG91YmxlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgZG91YmxlICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX2RvdWJsZTJzKHNvYXAsICpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMmRvdWJsZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgZG91YmxlICpwKQoreyBpZiAocykKKyAgeyBpZiAoISpzKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIGlmICghc29hcF90YWdfY21wKHMsICJJTkYiKSkKKyAgICAgICpwID0gREJMX1BJTkZUWTsKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHMsICIrSU5GIikpCisgICAgICAqcCA9IERCTF9QSU5GVFk7CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChzLCAiLUlORiIpKQorICAgICAgKnAgPSBEQkxfTklORlRZOworICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAocywgIk5hTiIpKQorICAgICAgKnAgPSBEQkxfTkFOOworICAgIGVsc2UKKyAgICB7CisjaWZkZWYgSEFWRV9TVFJUT0QKKyAgICAgIGNoYXIgKnI7CisgICAgICAqcCA9IHN0cnRvZChzLCAmcik7CisgICAgICBpZiAoKnIpCisjZW5kaWYKKyNpZmRlZiBIQVZFX1NTQ0FORgorICAgICAgICBpZiAoc3NjYW5mKHMsICIlbGciLCBwKSAhPSAxKQorICAgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworI2Vsc2UKKyAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisjZW5kaWYKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorZG91YmxlICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5kb3VibGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgZG91YmxlICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlICE9ICdcMCcgJiYgc29hcF9pc251bWVyaWMoc29hcCwgdHlwZSkpCisgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgcCA9IChkb3VibGUqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihkb3VibGUpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAoZG91YmxlKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKGRvdWJsZSksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MyZG91YmxlKHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3Vuc2lnbmVkQnl0ZTJzKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBjaGFyIG4pCit7IHJldHVybiBzb2FwX3Vuc2lnbmVkTG9uZzJzKHNvYXAsICh1bnNpZ25lZCBsb25nKW4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHVuc2lnbmVkQnl0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfdW5zaWduZWRMb25nMnMoc29hcCwgKHVuc2lnbmVkIGxvbmcpKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MydW5zaWduZWRCeXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBjaGFyICpwKQoreyBpZiAocykKKyAgeyB1bnNpZ25lZCBsb25nIG47CisgICAgY2hhciAqcjsKKyAgICBuID0gc29hcF9zdHJ0b3VsKHMsICZyLCAxMCk7CisgICAgaWYgKHMgPT0gciB8fCAqciB8fCBuID4gMjU1KQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgKnAgPSAodW5zaWduZWQgY2hhciluOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3Vuc2lnbmVkIGNoYXIgKgorU09BUF9GTUFDMgorc29hcF9pbnVuc2lnbmVkQnl0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB1bnNpZ25lZCBjaGFyICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAodW5zaWduZWQgY2hhciopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAodW5zaWduZWQgY2hhciopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZih1bnNpZ25lZCBjaGFyKSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJ1bnNpZ25lZEJ5dGUoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfdW5zaWduZWRTaG9ydDJzKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBzaG9ydCBuKQoreyByZXR1cm4gc29hcF91bnNpZ25lZExvbmcycyhzb2FwLCAodW5zaWduZWQgbG9uZyluKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXR1bnNpZ25lZFNob3J0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgdW5zaWduZWQgc2hvcnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfdW5zaWduZWRMb25nMnMoc29hcCwgKHVuc2lnbmVkIGxvbmcpKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MydW5zaWduZWRTaG9ydChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgdW5zaWduZWQgc2hvcnQgKnApCit7IGlmIChzKQorICB7IHVuc2lnbmVkIGxvbmcgbjsKKyAgICBjaGFyICpyOworICAgIG4gPSBzb2FwX3N0cnRvdWwocywgJnIsIDEwKTsKKyAgICBpZiAocyA9PSByIHx8ICpyIHx8IG4gPiA2NTUzNSkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgICpwID0gKHVuc2lnbmVkIHNob3J0KW47CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordW5zaWduZWQgc2hvcnQgKgorU09BUF9GTUFDMgorc29hcF9pbnVuc2lnbmVkU2hvcnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgdW5zaWduZWQgc2hvcnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkU2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAodW5zaWduZWQgc2hvcnQqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZih1bnNpZ25lZCBzaG9ydCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9ICh1bnNpZ25lZCBzaG9ydCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZih1bnNpZ25lZCBzaG9ydCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MydW5zaWduZWRTaG9ydChzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF91bnNpZ25lZEludDJzKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBpbnQgbikKK3sgcmV0dXJuIHNvYXBfdW5zaWduZWRMb25nMnMoc29hcCwgKHVuc2lnbmVkIGxvbmcpbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0dW5zaWduZWRJbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCB1bnNpZ25lZCBpbnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfdW5zaWduZWRMb25nMnMoc29hcCwgKHVuc2lnbmVkIGxvbmcpKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MydW5zaWduZWRJbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCAqcCkKK3sgaWYgKHMpCisgIHsgY2hhciAqcjsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgIHNvYXBfcmVzZXRfZXJybm87CisjZW5kaWYKKyNlbmRpZgorICAgICpwID0gKHVuc2lnbmVkIGludClzb2FwX3N0cnRvdWwocywgJnIsIDEwKTsKKyAgICBpZiAoKHMgPT0gciAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpIHx8ICpyCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgfHwgc29hcF9lcnJubyA9PSBTT0FQX0VSQU5HRQorI2VuZGlmCisjZW5kaWYKKyAgICApCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit1bnNpZ25lZCBpbnQgKgorU09BUF9GTUFDMgorc29hcF9pbnVuc2lnbmVkSW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIGludCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRJbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZFNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRCeXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKHVuc2lnbmVkIGludCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKHVuc2lnbmVkIGludCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9ICh1bnNpZ25lZCBpbnQqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YodW5zaWduZWQgaW50KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJ1bnNpZ25lZEludChzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF91bnNpZ25lZExvbmcycyhzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgbG9uZyBuKQoreyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIiVsdSIsIG4pOworICByZXR1cm4gc29hcC0+dG1wYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHVuc2lnbmVkTG9uZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfdW5zaWduZWRMb25nMnMoc29hcCwgKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MydW5zaWduZWRMb25nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBsb25nICpwKQoreyBpZiAocykKKyAgeyBjaGFyICpyOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgc29hcF9yZXNldF9lcnJubzsKKyNlbmRpZgorI2VuZGlmCisgICAgKnAgPSBzb2FwX3N0cnRvdWwocywgJnIsIDEwKTsKKyAgICBpZiAoKHMgPT0gciAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpIHx8ICpyCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgfHwgc29hcF9lcnJubyA9PSBTT0FQX0VSQU5HRQorI2VuZGlmCisjZW5kaWYKKyAgICApCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit1bnNpZ25lZCBsb25nICoKK1NPQVBfRk1BQzIKK3NvYXBfaW51bnNpZ25lZExvbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgdW5zaWduZWQgbG9uZyAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRJbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZFNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRCeXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKHVuc2lnbmVkIGxvbmcqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZih1bnNpZ25lZCBsb25nKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKHVuc2lnbmVkIGxvbmcqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YodW5zaWduZWQgbG9uZyksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MydW5zaWduZWRMb25nKHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX1VMT05HNjQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgVUxPTkc2NCBuKQoreyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgU09BUF9VTE9OR19GT1JNQVQsIG4pOworICByZXR1cm4gc29hcC0+dG1wYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dFVMT05HNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBVTE9ORzY0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX1VMT05HNjQycyhzb2FwLCAqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJVTE9ORzY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBVTE9ORzY0ICpwKQoreyBpZiAocykKKyAgeworI2lmZGVmIEhBVkVfU1RSVE9VTEwKKyAgICBjaGFyICpyOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgc29hcF9yZXNldF9lcnJubzsKKyNlbmRpZgorI2VuZGlmCisgICAgKnAgPSBzdHJ0b3VsbChzLCAmciwgMTApOworICAgIGlmICgocyA9PSByICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkgfHwgKnIKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgIHx8IHNvYXBfZXJybm8gPT0gU09BUF9FUkFOR0UKKyNlbmRpZgorI2VuZGlmCisgICAgICApCisjZWxzZQorIyBpZmRlZiBIQVZFX1NTQ0FORgorICAgIGlmIChzc2NhbmYocywgU09BUF9VTE9OR19GT1JNQVQsIHApICE9IDEpCisjIGVuZGlmCisjZW5kaWYKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK1VMT05HNjQgKgorU09BUF9GTUFDMgorc29hcF9pblVMT05HNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgVUxPTkc2NCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpwb3NpdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpub25OZWdhdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZExvbmciKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkU2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwID0gKFVMT05HNjQqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihVTE9ORzY0KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKFVMT05HNjQqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YoVUxPTkc2NCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MyVUxPTkc2NChzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJzdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGNoYXIgKip0KQoreyAqdCA9IE5VTEw7CisgIGlmIChzKQorICB7IGlmICghKCp0ID0gc29hcF9zdHJkdXAoc29hcCwgcykpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgaWYgKCEoc29hcC0+bW9kZSAmIChTT0FQX0VOQ19MQVRJTiB8IFNPQVBfQ19VVEZTVFJJTkcpKSkKKyAgICB7IC8qIFRPRE86IGNvbnNpZGVyIHRydW5jYXRpbmcgVVRGOCB0byBBU0NJSSBmb3IgcmVndWxhciBYTUwgYXR0cmlidXRlIHN0cmluZ3M/ICovCisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMlFOYW1lKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBjaGFyICoqdCkKK3sgaWYgKHMpCisgIHsgc3RydWN0IHNvYXBfbmxpc3QgKm5wOworICAgIGNvbnN0IGNoYXIgKnA7CisgICAgaWYgKCFzdHJuY21wKHMsICJ4bWw6IiwgNCkpCisgICAgeyAqdCA9IHNvYXBfc3RyZHVwKHNvYXAsIHMpOworICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgfQorICAgIG5wID0gc29hcC0+bmxpc3Q7CisgICAgcCA9IHN0cmNocihzLCAnOicpOworICAgIGlmIChwKQorICAgIHsgcmVnaXN0ZXIgaW50IG4gPSBwIC0gczsKKyAgICAgIHdoaWxlIChucCAmJiAoc3RybmNtcChucC0+aWQsIHMsIG4pIHx8IG5wLT5pZFtuXSkpCisgICAgICAgIG5wID0gbnAtPm5leHQ7CisgICAgICBwKys7CisgICAgfQorICAgIGVsc2UKKyAgICB7IHdoaWxlIChucCAmJiAqbnAtPmlkKQorICAgICAgICBucCA9IG5wLT5uZXh0OworICAgICAgcCA9IHM7CisgICAgfQorICAgIGlmIChucCkKKyAgICB7IGlmIChucC0+aW5kZXggPj0gMCAmJiBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzKQorICAgICAgeyByZWdpc3RlciBjb25zdCBjaGFyICpxID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tucC0+aW5kZXhdLmlkOworICAgICAgICBpZiAocSkKKyAgICAgICAgeyBpZiAoKCp0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihwKSArIHN0cmxlbihxKSArIDIpKSkKKyAgICAgICAgICAgIHNwcmludGYoKnQsICIlczolcyIsIHEsIHApOworICAgICAgICAgIHJldHVybiBTT0FQX09LOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAobnAtPm5zKQorICAgICAgeyBpZiAoKCp0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihwKSArIHN0cmxlbihucC0+bnMpICsgNCkpKQorICAgICAgICAgIHNwcmludGYoKnQsICJcIiVzXCI6JXMiLCBucC0+bnMsIHApOworICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICAgIH0KKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTmFtZXNwYWNlIHByZWZpeCBvZiAnJXMnIG5vdCBkZWZpbmVkIChpbmRleD0lZCwgVVJJPSVzKVxuIiwgcywgbnAtPmluZGV4LCBucC0+bnM/bnAtPm5zOiIiKSk7CisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX05BTUVTUEFDRTsgCisgICAgfQorICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTmFtZXNwYWNlIHByZWZpeCBvZiAnJXMnIG5vdCBkZWZpbmVkLCBhc3N1bWluZyBlbXB0eSBuYW1lc3BhY2VcbiIsIHMpKTsKKyAgICBpZiAoKCp0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihwKSArIDQpKSkKKyAgICAgIHNwcmludGYoKnQsICJcIlwiOiVzIiwgcCk7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfUU5hbWUycyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcykKK3sgc3RydWN0IE5hbWVzcGFjZSAqcDsKKyAgY2hhciAqdDsKKyAgaW50IG47CisgIGlmICghcyB8fCAqcyAhPSAnIicpCisgIHsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKHMgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpKQorICAgIHsgdCA9IChjaGFyKilzdHJjaHIocywgJzonKTsKKyAgICAgIGlmICh0KQorICAgICAgICBzb2FwX3V0aWxpemVfbnMoc29hcCwgcywgdCAtIHMpOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBzOworICB9CisgIHMrKzsKKyAgaWYgKChwID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlcykpCisgIHsgZm9yICg7IHAtPmlkOyBwKyspCisgICAgeyBpZiAocC0+bnMpCisgICAgICAgIGlmICghc29hcF90YWdfY21wKHMsIHAtPm5zKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIGlmIChwLT5pbikKKyAgICAgICAgaWYgKCFzb2FwX3RhZ19jbXAocywgcC0+aW4pKQorICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAocCAmJiBwLT5pZCkKKyAgICB7IHMgPSBzdHJjaHIocywgJyInKTsKKyAgICAgIGlmIChzKQorICAgICAgeyB0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihwLT5pZCkgKyBzdHJsZW4ocykpOworICAgICAgICBzdHJjcHkodCwgcC0+aWQpOworCXN0cmNhdCh0LCBzICsgMSk7CisgICAgICAgIHJldHVybiB0OworICAgICAgfQorICAgIH0KKyAgfQorICB0ID0gKGNoYXIqKXN0cmNocihzLCAnIicpOworICBpZiAodCkKKyAgICBuID0gdCAtIHM7CisgIGVsc2UKKyAgICBuID0gMDsKKyAgdCA9IHNvYXBfc3RyZHVwKHNvYXAsIHMpOworICB0W25dID0gJ1wwJzsKKyAgc3ByaW50Zihzb2FwLT50bXBidWYsICJ4bWxuczpfJWQiLCBzb2FwLT5pZG51bSsrKTsKKyAgc29hcF9zZXRfYXR0cihzb2FwLCBzb2FwLT50bXBidWYsIHQpOworICBzID0gc3RyY2hyKHMsICciJyk7CisgIGlmIChzKQorICB7IHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc3RybGVuKHNvYXAtPnRtcGJ1ZikgKyBzdHJsZW4ocykgLSA2KTsKKyAgICBzdHJjcHkodCwgc29hcC0+dG1wYnVmICsgNik7CisgICAgc3RyY2F0KHQsIHMgKyAxKTsKKyAgfQorICByZXR1cm4gdDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMndjaGFyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCB3Y2hhcl90ICoqdCkKK3sgd2NoYXJfdCAqcjsKKyAgaWYgKCFzKQorICAgICp0ID0gTlVMTDsKKyAgZWxzZQorICB7ICp0ID0gciA9ICh3Y2hhcl90Kilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yod2NoYXJfdCkgKiAoc3RybGVuKHMpICsgMSkpOworICAgIGlmICghcikKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0xBVElOKQorICAgIHsgd2hpbGUgKCpzKQorICAgICAgICAqcisrID0gKHdjaGFyX3QpKnMrKzsKKyAgICB9CisgICAgZWxzZQorICAgIHsgLyogQ29udmVydCBVVEY4IHRvIHdjaGFyICovCisgICAgICB3aGlsZSAoKnMpCisgICAgICB7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYywgYzEsIGMyLCBjMywgYzQ7CisgICAgICAgIGMgPSAqcysrOworICAgICAgICBpZiAoYyA8IDB4ODApCisJICAqcisrID0gKHdjaGFyX3QpYzsKKwllbHNlCisgICAgICAgIHsgYzEgPSAoc29hcF93Y2hhcikqcysrICYgMHgzRjsKKyAgICAgICAgICBpZiAoYyA8IDB4RTApCisgICAgICAgICAgICAqcisrID0gKHdjaGFyX3QpKCgoc29hcF93Y2hhcikoYyAmIDB4MUYpIDw8IDYpIHwgYzEpOworICAgICAgICAgIGVsc2UKKwkgIHsgYzIgPSAoc29hcF93Y2hhcikqcysrICYgMHgzRjsKKyAgICAgICAgICAgIGlmIChjIDwgMHhGMCkKKyAgICAgICAgICAgICAgKnIrKyA9ICh3Y2hhcl90KSgoKHNvYXBfd2NoYXIpKGMgJiAweDBGKSA8PCAxMikgfCAoYzEgPDwgNikgfCBjMik7CisgICAgICAgICAgICBlbHNlCisJICAgIHsgYzMgPSAoc29hcF93Y2hhcikqcysrICYgMHgzRjsKKyAgICAgICAgICAgICAgaWYgKGMgPCAweEY4KQorICAgICAgICAgICAgICAgICpyKysgPSAod2NoYXJfdCkoKChzb2FwX3djaGFyKShjICYgMHgwNykgPDwgMTgpIHwgKGMxIDw8IDEyKSB8IChjMiA8PCA2KSB8IGMzKTsKKyAgICAgICAgICAgICAgZWxzZQorCSAgICAgIHsgYzQgPSAoc29hcF93Y2hhcikqcysrICYgMHgzRjsKKyAgICAgICAgICAgICAgICBpZiAoYyA8IDB4RkMpCisgICAgICAgICAgICAgICAgICAqcisrID0gKHdjaGFyX3QpKCgoc29hcF93Y2hhcikoYyAmIDB4MDMpIDw8IDI0KSB8IChjMSA8PCAxOCkgfCAoYzIgPDwgMTIpIHwgKGMzIDw8IDYpIHwgYzQpOworICAgICAgICAgICAgICAgIGVsc2UKKwkJICAqcisrID0gKHdjaGFyX3QpKCgoc29hcF93Y2hhcikoYyAmIDB4MDEpIDw8IDMwKSB8IChjMSA8PCAyNCkgfCAoYzIgPDwgMTgpIHwgKGMzIDw8IDEyKSB8IChjNCA8PCA2KSB8IChzb2FwX3djaGFyKSgqcysrICYgMHgzRikpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgICpyID0gTCdcMCc7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF93Y2hhcjJzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB3Y2hhcl90ICpzKQoreyByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIHJlZ2lzdGVyIGNoYXIgKnIsICp0OworICBjb25zdCB3Y2hhcl90ICpxID0gczsKKyAgc2l6ZV90IG4gPSAwOworICB3aGlsZSAoKGMgPSAqcSsrKSkKKyAgeyBpZiAoYyA+IDAgJiYgYyA8IDB4ODApCisgICAgICBuKys7CisgICAgZWxzZQorICAgICAgbiArPSA2OworICB9CisgIHIgPSB0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIG4gKyAxKTsKKyAgaWYgKHIpCisgIHsgLyogQ29udmVydCB3Y2hhciB0byBVVEY4ICovCisgICAgd2hpbGUgKChjID0gKnMrKykpCisgICAgeyBpZiAoYyA+IDAgJiYgYyA8IDB4ODApCisgICAgICAgICp0KysgPSAoY2hhciljOworICAgICAgZWxzZQorICAgICAgeyBpZiAoYyA8IDB4MDgwMCkKKyAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4QzAgfCAoKGMgPj4gNikgJiAweDFGKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyBpZiAoYyA8IDB4MDEwMDAwKQorICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEUwIHwgKChjID4+IDEyKSAmIDB4MEYpKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeyBpZiAoYyA8IDB4MjAwMDAwKQorICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjAgfCAoKGMgPj4gMTgpICYgMHgwNykpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyBpZiAoYyA8IDB4MDQwMDAwMDApCisgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEY4IHwgKChjID4+IDI0KSAmIDB4MDMpKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7ICp0KysgPSAoY2hhcikoMHhGQyB8ICgoYyA+PiAzMCkgJiAweDAxKSk7CisgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDI0KSAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTgpICYgMHgzRikpOworICAgICAgICAgICAgfSAgICAgCisgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTIpICYgMHgzRikpOworICAgICAgICAgIH0KKyAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gNikgJiAweDNGKSk7CisgICAgICAgIH0KKyAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKGMgJiAweDNGKSk7CisgICAgICB9CisgICAgfQorICAgICp0ID0gJ1wwJzsKKyAgfQorICByZXR1cm4gcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRzdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjaGFyICpjb25zdCpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikgCit7IGlkID0gc29hcF9lbGVtZW50X2lkKHNvYXAsIHRhZywgaWQsICpwLCBOVUxMLCAwLCB0eXBlLCBuKTsKKyAgaWYgKGlkIDwgMAorICAgfHwgc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIGlkLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsICpwLCAwKQorICAgfHwgc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqKgorU09BUF9GTUFDMgorc29hcF9pbnN0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBjaGFyICoqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQsIGludCBmbGFnLCBsb25nIG1pbmxlbiwgbG9uZyBtYXhsZW4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAxKSkKKyAgeyBpZiAoIXRhZyB8fCAqdGFnICE9ICctJyB8fCBzb2FwLT5lcnJvciAhPSBTT0FQX05PX1RBRykKKyAgICAgIHJldHVybiBOVUxMOworICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgfQorICBpZiAoIXApCisgICAgaWYgKCEocCA9IChjaGFyKiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKGNoYXIqKSkpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIGlmIChzb2FwLT5ib2R5KQorICB7ICpwID0gc29hcF9zdHJpbmdfaW4oc29hcCwgZmxhZywgbWlubGVuLCBtYXhsZW4pOworICAgIGlmICghKnAgfHwgIShjaGFyKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCAqcCwgdCwgc2l6ZW9mKGNoYXIqKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBlbHNlIGlmIChzb2FwLT5udWxsKQorICAgICpwID0gTlVMTDsKKyAgZWxzZQorICAgICpwID0gKGNoYXIqKVNPQVBfU1RSX0VPUzsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAoY2hhcioqKXNvYXBfaWRfbG9va3VwKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopcCwgdCwgc2l6ZW9mKGNoYXIqKiksIDApOworICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHdzdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCB3Y2hhcl90ICpjb25zdCpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikgCit7IGlkID0gc29hcF9lbGVtZW50X2lkKHNvYXAsIHRhZywgaWQsICpwLCBOVUxMLCAwLCB0eXBlLCBuKTsKKyAgaWYgKGlkIDwgMAorICAgfHwgc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIGlkLCB0eXBlKQorICAgfHwgc29hcF93c3RyaW5nX291dChzb2FwLCAqcCwgMCkKKyAgIHx8IHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZykpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQord2NoYXJfdCAqKgorU09BUF9GTUFDMgorc29hcF9pbndzdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgd2NoYXJfdCAqKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0LCBsb25nIG1pbmxlbiwgbG9uZyBtYXhsZW4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAxKSkKKyAgeyBpZiAoIXRhZyB8fCAqdGFnICE9ICctJyB8fCBzb2FwLT5lcnJvciAhPSBTT0FQX05PX1RBRykKKyAgICAgIHJldHVybiBOVUxMOworICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgfQorICBpZiAoIXApCisgICAgaWYgKCEocCA9ICh3Y2hhcl90Kiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHdjaGFyX3QqKSkpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIGlmIChzb2FwLT5ib2R5KQorICB7ICpwID0gc29hcF93c3RyaW5nX2luKHNvYXAsIDEsIG1pbmxlbiwgbWF4bGVuKTsKKyAgICBpZiAoISpwIHx8ICEod2NoYXJfdCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgKnAsIHQsIHNpemVvZih3Y2hhcl90KiksIDAsIE5VTEwsIE5VTEwsIE5VTEwpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZWxzZSBpZiAoc29hcC0+bnVsbCkKKyAgICAqcCA9IE5VTEw7CisgIGVsc2UKKyAgICAqcCA9ICh3Y2hhcl90KilTT0FQX1NUUl9FT1M7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKHdjaGFyX3QqKilzb2FwX2lkX2xvb2t1cChzb2FwLCBzb2FwLT5ocmVmLCAodm9pZCoqKXAsIHQsIHNpemVvZih3Y2hhcl90KiopLCAwKTsKKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIHRpbWVfdAorc29hcF90aW1lZ20oc3RydWN0IHRtICpUKQoreworI2lmIGRlZmluZWQoSEFWRV9USU1FR00pCisgIHJldHVybiB0aW1lZ20oVCk7CisjZWxzZQorICB0aW1lX3QgdCwgZywgejsKKyNpZmRlZiBIQVZFX0dNVElNRV9SCisgIHN0cnVjdCB0bSB0bSwgKnRtcCA9ICZ0bTsKKyNlbHNlCisgIHN0cnVjdCB0bSAqdG1wOworI2VuZGlmCisgIHQgPSBta3RpbWUoVCk7CisgIGlmICh0ID09IC0xKQorICAgIHJldHVybiAtMTsKKyNpZmRlZiBIQVZFX0dNVElNRV9SCisgIGdtdGltZV9yKCZ0LCB0bXApOworI2Vsc2UKKyAgdG1wID0gZ210aW1lKCZ0KTsKKyNlbmRpZgorICB0bXAtPnRtX2lzZHN0ID0gMDsKKyAgZyA9IG1rdGltZSh0bXApOworICBpZiAoZyA9PSAtMSkKKyAgICByZXR1cm4gLTE7CisgIHogPSBnIC0gdDsKKyAgcmV0dXJuIHQgLSB6OworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9kYXRlVGltZTJzKHN0cnVjdCBzb2FwICpzb2FwLCB0aW1lX3QgbikKK3sgc3RydWN0IHRtIFQsICpwVCA9ICZUOworI2lmIGRlZmluZWQoSEFWRV9HTVRJTUVfUikKKyAgaWYgKGdtdGltZV9yKCZuLCBwVCkpCisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTWiIsIHBUKTsKKyAgLyogVGhlIGZvbGxvd2luZyBkZWZpbmVzIHdlcmUgYWRkZWQgZm9yIFZ4V29ya3MqLworI2VsaWYgZGVmaW5lZChIQVZFX1BHTVRJTUVfUikKKyAgaWYgKGdtdGltZV9yKCZuLCBwVCkpCisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTWiIsIHBUKTsKKyNlbGlmIGRlZmluZWQoSEFWRV9QR01USU1FKQorICBpZiAoZ210aW1lKCZuLCBwVCkpCisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTWiIsIHBUKTsKKyNlbGlmIGRlZmluZWQoSEFWRV9HTVRJTUUpCisgIGlmICgocFQgPSBnbXRpbWUoJm4pKSkKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVNaIiwgcFQpOworI2VsaWYgZGVmaW5lZChIQVZFX0dFVFRJTUVPRkRBWSkKKyAgc3RydWN0IHRpbWV6b25lIHR6OworICBtZW1zZXQoKHZvaWQqKSZ0eiwgMCwgc2l6ZW9mKHR6KSk7CisjIGlmIGRlZmluZWQoSEFWRV9MT0NBTFRJTUVfUikKKyAgaWYgKGxvY2FsdGltZV9yKCZuLCBwVCkpCisgIHsgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgZ2V0dGltZW9mZGF5KCZ0diwgJnR6KTsKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwVCk7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYgKyBzdHJsZW4oc29hcC0+dG1wYnVmKSwgIiUrMDNkOiUwMmQiLCAtdHoudHpfbWludXRlc3dlc3QvNjArKHBULT50bV9pc2RzdCE9MCksIGFicyh0ei50el9taW51dGVzd2VzdCklNjApOworICB9CisjIGVsc2UKKyAgaWYgKChwVCA9IGxvY2FsdGltZSgmbikpKQorICB7IHN0cnVjdCB0aW1ldmFsIHR2OworICAgIGdldHRpbWVvZmRheSgmdHYsICZ0eik7CisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmICsgc3RybGVuKHNvYXAtPnRtcGJ1ZiksICIlKzAzZDolMDJkIiwgLXR6LnR6X21pbnV0ZXN3ZXN0LzYwKyhwVC0+dG1faXNkc3QhPTApLCBhYnModHoudHpfbWludXRlc3dlc3QpJTYwKTsKKyAgfQorI2VuZGlmCisjZWxpZiBkZWZpbmVkKEhBVkVfRlRJTUUpCisgIHN0cnVjdCB0aW1lYiB0OworICBtZW1zZXQoKHZvaWQqKSZ0LCAwLCBzaXplb2YodCkpOworIyBpZiBkZWZpbmVkKEhBVkVfTE9DQUxUSU1FX1IpCisgIGlmIChsb2NhbHRpbWVfcigmbiwgcFQpKQorICB7IGZ0aW1lKCZ0KTsKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwVCk7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYgKyBzdHJsZW4oc29hcC0+dG1wYnVmKSwgIiUrMDNkOiUwMmQiLCAtdC50aW1lem9uZS82MCsocFQtPnRtX2lzZHN0IT0wKSwgYWJzKHQudGltZXpvbmUpJTYwKTsKKyAgfQorICAvKiBUaGUgZm9sbG93aW5nIGRlZmluZXMgd2VyZSBhZGRlZCBmb3IgVnhXb3JrcyovCisjIGVsaWYgZGVmaW5lZChIQVZFX1BMT0NBTFRJTUVfUikKKyAgaWYgKGxvY2FsdGltZV9yKCZuLCBwVCkpCisgIHsgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmK3N0cmxlbihzb2FwLT50bXBidWYpLCAiJSswM2Q6JTAyZCIsIHQudGltZXpvbmUvNjAsIGFicyh0LnRpbWV6b25lKSU2MCk7CisgIH0KKyMgZWxzZQorICBpZiAoKHBUID0gbG9jYWx0aW1lKCZuKSkpCisgIHsgZnRpbWUoJnQpOworICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIHN0cmxlbihzb2FwLT50bXBidWYpLCAiJSswM2Q6JTAyZCIsIC10LnRpbWV6b25lLzYwKyhwVC0+dG1faXNkc3QhPTApLCBhYnModC50aW1lem9uZSklNjApOworICB9CisjIGVuZGlmCisjZWxpZiBkZWZpbmVkKEhBVkVfTE9DQUxUSU1FX1IpCisgIGlmIChsb2NhbHRpbWVfcigmbiwgcFQpKQorICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyAgLyogVGhlIGZvbGxvd2luZyBkZWZpbmVzIHdlcmUgYWRkZWQgZm9yIFZ4V29ya3MqLworI2VsaWYgZGVmaW5lZChIQVZFX1BMT0NBTFRJTUVfUikKKyAgaWYgKGxvY2FsdGltZV9yKCZuLCBwVCkpCisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworI2Vsc2UKKyAgaWYgKChwVCA9IGxvY2FsdGltZSgmbikpKQorICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyNlbmRpZgorICBlbHNlCisgICAgc3RyY3B5KHNvYXAtPnRtcGJ1ZiwgIjE5NjktMTItMzFUMjM6NTk6NTlaIik7CisgIHJldHVybiBzb2FwLT50bXBidWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0ZGF0ZVRpbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCB0aW1lX3QgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfZGF0ZVRpbWUycyhzb2FwLCAqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJkYXRlVGltZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgdGltZV90ICpwKQoreyBpZiAocykKKyAgeyBzdHJ1Y3QgdG0gVDsKKyAgICBjaGFyIHpvbmVbMTZdOworICAgIGNvbnN0IGNoYXIgKnQ7CisgICAgbWVtc2V0KCh2b2lkKikmVCwgMCwgc2l6ZW9mKFQpKTsKKyAgICB6b25lW3NpemVvZih6b25lKS0xXSA9ICdcMCc7CisgICAgaWYgKHN0cmNocihzLCAnLScpKQorICAgICAgdCA9ICIlZC0lZC0lZFQlZDolZDolZCUxNXMiOworICAgIGVsc2UgaWYgKHN0cmNocihzLCAnOicpKQorICAgICAgdCA9ICIlNGQlMmQlMmRUJWQ6JWQ6JWQlMTVzIjsKKyAgICBlbHNlIC8qIHBhcnNlIG5vbi1YU0Qtc3RhbmRhcmQgYWx0ZXJuYXRpdmUgSVNPIDg2MDEgZm9ybWF0ICovCisgICAgICB0ID0gIiU0ZCUyZCUyZFQlMmQlMmQlMmQlMTVzIjsKKyAgICBzc2NhbmYocywgdCwgJlQudG1feWVhciwgJlQudG1fbW9uLCAmVC50bV9tZGF5LCAmVC50bV9ob3VyLCAmVC50bV9taW4sICZULnRtX3NlYywgem9uZSk7CisgICAgaWYgKFQudG1feWVhciA9PSAxKQorICAgICAgVC50bV95ZWFyID0gNzA7CisgICAgZWxzZQorICAgICAgVC50bV95ZWFyIC09IDE5MDA7CisgICAgVC50bV9tb24tLTsKKyAgICBpZiAoKnpvbmUpCisgICAgeyBpZiAoKnpvbmUgPT0gJy4nKQorICAgICAgeyBmb3IgKHMgPSB6b25lICsgMTsgKnM7IHMrKykKKyAgICAgICAgICBpZiAoKnMgPCAnMCcgfHwgKnMgPiAnOScpCisgICAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcyA9IHpvbmU7CisgICAgICBpZiAoKnMgPT0gJysnIHx8ICpzID09ICctJykKKyAgICAgIHsgaW50IGggPSAwLCBtID0gMDsKKyAgICAgICAgaWYgKHNbM10gPT0gJzonKQorCXsgc3NjYW5mKHMsICIlZDolZCIsICZoLCAmbSk7CisJICBpZiAoaCA8IDApCisJICAgIG0gPSAtbTsKKwl9CisJZWxzZQorCXsgbSA9IChpbnQpYXRvbChzKTsKKwkgIGggPSBtIC8gMTAwOworCSAgbSA9IG0gJSAxMDA7CisJfQorICAgICAgICBULnRtX2hvdXIgLT0gaDsKKyAgICAgICAgVC50bV9taW4gLT0gbTsKKyAgICAgIH0KKyAgICAgIFQudG1faXNkc3QgPSAwOworICAgICAgKnAgPSBzb2FwX3RpbWVnbSgmVCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IFQudG1faXNkc3QgPSAtMTsKKyAgICAgICpwID0gbWt0aW1lKCZUKTsgLyogbm8gdGltZSB6b25lOiBzdXBwb3NlIGl0IGlzIGxvY2FsdGltZT8gKi8KKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQordGltZV90ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5kYXRlVGltZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB0aW1lX3QgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6ZGF0ZVRpbWUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwID0gKHRpbWVfdCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKHRpbWVfdCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9ICh0aW1lX3QqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YodGltZV90KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJkYXRlVGltZShzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0bGl0ZXJhbChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBjaGFyICpjb25zdCpwKQoreyBpbnQgaTsKKyAgY29uc3QgY2hhciAqdCA9IE5VTEw7CisgIGlmICh0YWcgJiYgKnRhZyAhPSAnLScpCisgIHsgaWYgKHNvYXAtPmxvY2FsX25hbWVzcGFjZXMgJiYgKHQgPSBzdHJjaHIodGFnLCAnOicpKSkKKyAgICB7IHN0cm5jcHkoc29hcC0+dG1wYnVmLCB0YWcsIHQtdGFnKTsKKyAgICAgIHNvYXAtPnRtcGJ1Zlt0LXRhZ10gPSAnXDAnOworICAgICAgZm9yIChpID0gMDsgc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tpXS5pZDsgaSsrKQorICAgICAgICBpZiAoIXN0cmNtcChzb2FwLT50bXBidWYsIHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0uaWQpKQorICAgICAgICAgIGJyZWFrOworICAgICAgdCsrOworICAgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICI8JXMgeG1sbnM9XCIlc1wiPiIsIHQsIHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0ubnMgPyBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW2ldLm5zIDogU09BUF9TVFJfRU9TKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgdCA9IHRhZzsKKyAgICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiPCVzPiIsIHRhZyk7CisgICAgfQorICAgIGlmIChzb2FwX3NlbmQoc29hcCwgc29hcC0+dG1wYnVmKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAocCAmJiAqcCkKKyAgeyBpZiAoc29hcF9zZW5kKHNvYXAsICpwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAodCkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIjwvJXM+IiwgdCk7CisgICAgcmV0dXJuIHNvYXBfc2VuZChzb2FwLCBzb2FwLT50bXBidWYpOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqKgorU09BUF9GTUFDMgorc29hcF9pbmxpdGVyYWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgY2hhciAqKnApCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAxKSkKKyAgeyBpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9OT19UQUcgfHwgc29hcF91bmdldChzb2FwLCBzb2FwX2dldChzb2FwKSkgPT0gU09BUF9UVCkKKyAgICAgIHJldHVybiBOVUxMOworICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgfQorICBpZiAoIXApCisgICAgaWYgKCEocCA9IChjaGFyKiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKGNoYXIqKSkpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIGlmIChzb2FwLT5ib2R5KQorICAgICpwID0gc29hcF9zdHJpbmdfaW4oc29hcCwgMCwgLTEsIC0xKTsKKyAgZWxzZSBpZiAoc29hcC0+bnVsbCkKKyAgICAqcCA9IE5VTEw7CisgIGVsc2UKKyAgICAqcCA9IChjaGFyKilTT0FQX1NUUl9FT1M7CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0d2xpdGVyYWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgd2NoYXJfdCAqY29uc3QqcCkKK3sgaW50IGk7CisgIGNvbnN0IGNoYXIgKnQgPSBOVUxMOworICB3Y2hhcl90IGM7CisgIGNvbnN0IHdjaGFyX3QgKnM7CisgIGlmICh0YWcgJiYgKnRhZyAhPSAnLScpCisgIHsgaWYgKHNvYXAtPmxvY2FsX25hbWVzcGFjZXMgJiYgKHQgPSBzdHJjaHIodGFnLCAnOicpKSkKKyAgICB7IHN0cm5jcHkoc29hcC0+dG1wYnVmLCB0YWcsIHQtdGFnKTsKKyAgICAgIHNvYXAtPnRtcGJ1Zlt0LXRhZ10gPSAnXDAnOworICAgICAgZm9yIChpID0gMDsgc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tpXS5pZDsgaSsrKQorICAgICAgICBpZiAoIXN0cmNtcChzb2FwLT50bXBidWYsIHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0uaWQpKQorICAgICAgICAgIGJyZWFrOworICAgICAgdCsrOworICAgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICI8JXMgeG1sbnM9XCIlc1wiPiIsIHQsIHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0ubnMgPyBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW2ldLm5zIDogU09BUF9TVFJfRU9TKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgdCA9IHRhZzsKKyAgICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiPCVzPiIsIHRhZyk7CisgICAgfQorICAgIGlmIChzb2FwX3NlbmQoc29hcCwgc29hcC0+dG1wYnVmKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAocCkKKyAgeyBzID0gKnA7CisgICAgd2hpbGUgKChjID0gKnMrKykpCisgICAgICBpZiAoc29hcF9wdXR1dGY4KHNvYXAsICh1bnNpZ25lZCBjaGFyKWMpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHQpCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICI8LyVzPiIsIHQpOworICAgIHJldHVybiBzb2FwX3NlbmQoc29hcCwgc29hcC0+dG1wYnVmKTsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQord2NoYXJfdCAqKgorU09BUF9GTUFDMgorc29hcF9pbndsaXRlcmFsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHdjaGFyX3QgKipwKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMSkpCisgIHsgaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfTk9fVEFHIHx8IHNvYXBfdW5nZXQoc29hcCwgc29hcF9nZXQoc29hcCkpID09IFNPQVBfVFQpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIH0KKyAgaWYgKCFwKQorICAgIGlmICghKHAgPSAod2NoYXJfdCoqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZih3Y2hhcl90KikpKSkKKyAgICAgIHJldHVybiBOVUxMOworICBpZiAoc29hcC0+Ym9keSkKKyAgICAqcCA9IHNvYXBfd3N0cmluZ19pbihzb2FwLCAwLCAtMSwgLTEpOworICBlbHNlIGlmIChzb2FwLT5udWxsKQorICAgICpwID0gTlVMTDsKKyAgZWxzZQorICAgICpwID0gKHdjaGFyX3QqKVNPQVBfU1RSX0VPUzsKKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3Rva2VuKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzaXplX3QgaTsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjID0gMDsKKyAgcmVnaXN0ZXIgY2hhciAqcyA9IHNvYXAtPnRtcGJ1ZjsKKyAgaWYgKCFzb2FwLT5ib2R5KQorICAgIHJldHVybiBTT0FQX1NUUl9FT1M7CisgIGRvIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZikgLSAxOyBpKyspCisgIHsgaWYgKGMgPT0gU09BUF9UVCB8fCAoaW50KWMgPT0gRU9GIHx8IHNvYXBfYmxhbmsoYykpCisgICAgICBicmVhazsKKyAgICAqcysrID0gKGNoYXIpYzsKKyAgICBjID0gc29hcF9nZXQoc29hcCk7CisgIH0KKyAgaWYgKChpbnQpYyA9PSBFT0YgfHwgYyA9PSBTT0FQX1RUKQorICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICpzID0gJ1wwJzsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbGVtZW50IGNvbnRlbnQgdmFsdWU9JyVzJ1xuIiwgc29hcC0+dG1wYnVmKSk7CisgIHJldHVybiBzb2FwLT50bXBidWY7IC8qIHJldHVybiBub24tbnVsbCBwb2ludGVyICovCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfdmFsdWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNpemVfdCBpOworICByZWdpc3RlciBzb2FwX3djaGFyIGMgPSAwOworICByZWdpc3RlciBjaGFyICpzID0gc29hcC0+dG1wYnVmOworICBpZiAoIXNvYXAtPmJvZHkpCisgICAgcmV0dXJuIFNPQVBfU1RSX0VPUzsKKyAgZG8gYyA9IHNvYXBfZ2V0KHNvYXApOworICB3aGlsZSAoc29hcF9ibGFuayhjKSk7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc29hcC0+dG1wYnVmKSAtIDE7IGkrKykKKyAgeyBpZiAoYyA9PSBTT0FQX1RUIHx8IChpbnQpYyA9PSBFT0YpCisgICAgICBicmVhazsKKyAgICAqcysrID0gKGNoYXIpYzsKKyAgICBjID0gc29hcF9nZXQoc29hcCk7CisgIH0KKyAgZm9yIChzLS07IGkgPiAwOyBpLS0sIHMtLSkKKyAgICBpZiAoIXNvYXBfYmxhbmsoKnMpKQorICAgICAgYnJlYWs7CisgIHNbMV0gPSAnXDAnOworICBpZiAoKGludCljID09IEVPRiB8fCBjID09IFNPQVBfVFQpCisgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbGVtZW50IGNvbnRlbnQgdmFsdWU9JyVzJ1xuIiwgc29hcC0+dG1wYnVmKSk7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgICAgc29hcC0+ZG9tLT5kYXRhID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+dG1wYnVmKTsKKyNlbmRpZgorICByZXR1cm4gc29hcC0+dG1wYnVmOyAvKiByZXR1cm4gbm9uLW51bGwgcG9pbnRlciAqLworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgIWRlZmluZWQoV0lUSF9MRUFORVIpIHx8ICFkZWZpbmVkKFdJVEhfTk9IVFRQKQorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRsaW5lKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpzLCBpbnQgbGVuKQoreyBpbnQgaSA9IGxlbjsKKyAgc29hcF93Y2hhciBjID0gMDsKKyAgZm9yICg7OykKKyAgeyB3aGlsZSAoLS1pID4gMCkKKyAgICB7IGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgICAgICBpZiAoYyA9PSAnXHInIHx8IGMgPT0gJ1xuJykKKyAgICAgICAgYnJlYWs7CisgICAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgICAqcysrID0gKGNoYXIpYzsKKyAgICB9CisgICAgaWYgKGMgIT0gJ1xuJykKKyAgICAgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7IC8qIGdvdCBcciwgbm93IGdldCBcbiAqLworICAgIGlmIChjID09ICdcbicpCisgICAgeyAqcyA9ICdcMCc7CisgICAgICBpZiAoaSsxID09IGxlbikgLyogZW1wdHkgbGluZTogZW5kIG9mIEhUVFAvTUlNRSBoZWFkZXIgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICBjID0gc29hcF91bmdldChzb2FwLCBzb2FwX2dldGNoYXIoc29hcCkpOworICAgICAgaWYgKGMgIT0gJyAnICYmIGMgIT0gJ1x0JykgLyogSFRUUCBsaW5lIGNvbnRpbnVhdGlvbj8gKi8KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGVsc2UgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHNpemVfdAorc29hcF9jb3VudF9hdHRhY2htZW50cyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgcmVnaXN0ZXIgc2l6ZV90IGNvdW50ID0gc29hcC0+Y291bnQ7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ2FsY3VsYXRpbmcgdGhlIG1lc3NhZ2Ugc2l6ZSB3aXRoIGF0dGFjaG1lbnRzLCBjdXJyZW50IGNvdW50PSVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpY291bnQpKTsKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkgJiYgIShzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkpCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDYWxjdWxhdGluZyB0aGUgc2l6ZSBvZiBESU1FIGF0dGFjaG1lbnRzXG4iKSk7CisgICAgZm9yIChjb250ZW50ID0gc29hcC0+ZGltZS5maXJzdDsgY29udGVudDsgY29udGVudCA9IGNvbnRlbnQtPm5leHQpCisgICAgeyBjb3VudCArPSAxMiArICgoY29udGVudC0+c2l6ZSszKSYofjMpKTsKKyAgICAgIGlmIChjb250ZW50LT5pZCkKKyAgICAgICAgY291bnQgKz0gKChzdHJsZW4oY29udGVudC0+aWQpKzMpJih+MykpOworICAgICAgaWYgKGNvbnRlbnQtPnR5cGUpCisgICAgICAgIGNvdW50ICs9ICgoc3RybGVuKGNvbnRlbnQtPnR5cGUpKzMpJih+MykpOworICAgICAgaWYgKGNvbnRlbnQtPm9wdGlvbnMpCisgICAgICAgIGNvdW50ICs9ICgoKCh1bnNpZ25lZCBjaGFyKWNvbnRlbnQtPm9wdGlvbnNbMl0gPDwgOCkgfCAoKHVuc2lnbmVkIGNoYXIpY29udGVudC0+b3B0aW9uc1szXSkpKzcpJih+Myk7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNpemUgb2YgRElNRSBhdHRhY2htZW50IGNvbnRlbnQgaXMgJWx1IGJ5dGVzXG4iLCAodW5zaWduZWQgbG9uZyljb250ZW50LT5zaXplKSk7CisgICAgfQorICB9CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01JTUUpICYmIHNvYXAtPm1pbWUuYm91bmRhcnkpCisgIHsgcmVnaXN0ZXIgc2l6ZV90IG4gPSBzdHJsZW4oc29hcC0+bWltZS5ib3VuZGFyeSk7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDYWxjdWxhdGluZyB0aGUgc2l6ZSBvZiBNSU1FIGF0dGFjaG1lbnRzXG4iKSk7CisgICAgZm9yIChjb250ZW50ID0gc29hcC0+bWltZS5maXJzdDsgY29udGVudDsgY29udGVudCA9IGNvbnRlbnQtPm5leHQpCisgICAgeyByZWdpc3RlciBjb25zdCBjaGFyICpzOworICAgICAgLyogY291bnQgXHJcbi0tYm91bmRhcnlcclxuICovCisgICAgICBjb3VudCArPSA2ICsgbjsKKyAgICAgIC8qIGNvdW50IENvbnRlbnQtVHlwZTogLi4uXHJcbiAqLworICAgICAgaWYgKGNvbnRlbnQtPnR5cGUpCisgICAgICAgIGNvdW50ICs9IDE2ICsgc3RybGVuKGNvbnRlbnQtPnR5cGUpOworICAgICAgLyogY291bnQgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogLi4uXHJcbiAqLworICAgICAgcyA9IHNvYXBfc3RyX2NvZGUobWltZV9jb2RlcywgY29udGVudC0+ZW5jb2RpbmcpOworICAgICAgaWYgKHMpCisgICAgICAgIGNvdW50ICs9IDI5ICsgc3RybGVuKHMpOworICAgICAgLyogY291bnQgQ29udGVudC1JRDogLi4uXHJcbiAqLworICAgICAgaWYgKGNvbnRlbnQtPmlkKQorICAgICAgICBjb3VudCArPSAxNCArIHN0cmxlbihjb250ZW50LT5pZCk7CisgICAgICAvKiBjb3VudCBDb250ZW50LUxvY2F0aW9uOiAuLi5cclxuICovCisgICAgICBpZiAoY29udGVudC0+bG9jYXRpb24pCisgICAgICAgIGNvdW50ICs9IDIwICsgc3RybGVuKGNvbnRlbnQtPmxvY2F0aW9uKTsKKyAgICAgIC8qIGNvdW50IENvbnRlbnQtRGVzY3JpcHRpb246IC4uLlxyXG4gKi8KKyAgICAgIGlmIChjb250ZW50LT5kZXNjcmlwdGlvbikKKyAgICAgICAgY291bnQgKz0gMjMgKyBzdHJsZW4oY29udGVudC0+bG9jYXRpb24pOworICAgICAgLyogY291bnQgXHJcbi4uLmNvbnRlbnQgKi8KKyAgICAgIGNvdW50ICs9IDIgKyBjb250ZW50LT5zaXplOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTaXplIG9mIE1JTUUgYXR0YWNobWVudCBjb250ZW50IGlzICVsdSBieXRlc1xuIiwgKHVuc2lnbmVkIGxvbmcpY29udGVudC0+c2l6ZSkpOworICAgIH0KKyAgICAvKiBjb3VudCBcclxuLS1ib3VuZGFyeS0tICovCisgICAgY291bnQgKz0gNiArIG47CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJOZXcgY291bnQgaXMgJWx1IGJ5dGVzXG4iLCAodW5zaWduZWQgbG9uZyljb3VudCkpOworICByZXR1cm4gY291bnQ7CisjZWxzZQorICByZXR1cm4gc29hcC0+Y291bnQ7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NvYXBfcHV0ZGltZWZpZWxkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBzaXplX3QgbikKK3sgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgbikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCBTT0FQX1NUUl9QQURESU5HLCAtKGxvbmcpbiYzKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX2RpbWVfb3B0aW9uKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBzaG9ydCBvcHR5cGUsIGNvbnN0IGNoYXIgKm9wdGlvbikKK3sgc2l6ZV90IG47CisgIGNoYXIgKnMgPSBOVUxMOworICBpZiAob3B0aW9uKQorICB7IG4gPSBzdHJsZW4ob3B0aW9uKTsKKyAgICBzID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIG4gKyA1KTsKKyAgICBpZiAocykKKyAgICB7IHNbMF0gPSBvcHR5cGUgPj4gODsKKyAgICAgIHNbMV0gPSBvcHR5cGUgJiAweEZGOworICAgICAgc1syXSA9IG4gPj4gODsKKyAgICAgIHNbM10gPSBuICYgMHhGRjsKKyAgICAgIHN0cmNweShzICsgNCwgb3B0aW9uKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHM7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRkaW1laGRyKHN0cnVjdCBzb2FwICpzb2FwKQoreyB1bnNpZ25lZCBjaGFyIHRtcFsxMl07CisgIHNpemVfdCBvcHRsZW4gPSAwLCBpZGxlbiA9IDAsIHR5cGVsZW4gPSAwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlB1dCBESU1FIGhlYWRlciBpZD0nJXMnXG4iLCBzb2FwLT5kaW1lLmlkP3NvYXAtPmRpbWUuaWQ6IiIpKTsKKyAgaWYgKHNvYXAtPmRpbWUub3B0aW9ucykKKyAgICBvcHRsZW4gPSAoKCh1bnNpZ25lZCBjaGFyKXNvYXAtPmRpbWUub3B0aW9uc1syXSA8PCA4KSB8ICgodW5zaWduZWQgY2hhcilzb2FwLT5kaW1lLm9wdGlvbnNbM10pKSArIDQ7CisgIGlmIChzb2FwLT5kaW1lLmlkKQorICAgIGlkbGVuID0gc3RybGVuKHNvYXAtPmRpbWUuaWQpOworICBpZiAoc29hcC0+ZGltZS50eXBlKQorICAgIHR5cGVsZW4gPSBzdHJsZW4oc29hcC0+ZGltZS50eXBlKTsKKyAgdG1wWzBdID0gU09BUF9ESU1FX1ZFUlNJT04gfCAoc29hcC0+ZGltZS5mbGFncyAmIDB4Nyk7CisgIHRtcFsxXSA9IHNvYXAtPmRpbWUuZmxhZ3MgJiAweEYwOworICB0bXBbMl0gPSBvcHRsZW4gPj4gODsKKyAgdG1wWzNdID0gb3B0bGVuICYgMHhGRjsKKyAgdG1wWzRdID0gaWRsZW4gPj4gODsKKyAgdG1wWzVdID0gaWRsZW4gJiAweEZGOworICB0bXBbNl0gPSB0eXBlbGVuID4+IDg7CisgIHRtcFs3XSA9IHR5cGVsZW4gJiAweEZGOworICB0bXBbOF0gPSBzb2FwLT5kaW1lLnNpemUgPj4gMjQ7CisgIHRtcFs5XSA9IChzb2FwLT5kaW1lLnNpemUgPj4gMTYpICYgMHhGRjsKKyAgdG1wWzEwXSA9IChzb2FwLT5kaW1lLnNpemUgPj4gOCkgJiAweEZGOworICB0bXBbMTFdID0gc29hcC0+ZGltZS5zaXplICYgMHhGRjsKKyAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgKGNoYXIqKXRtcCwgMTIpCisgICB8fCBzb2FwX3B1dGRpbWVmaWVsZChzb2FwLCBzb2FwLT5kaW1lLm9wdGlvbnMsIG9wdGxlbikKKyAgIHx8IHNvYXBfcHV0ZGltZWZpZWxkKHNvYXAsIHNvYXAtPmRpbWUuaWQsIGlkbGVuKQorICAgfHwgc29hcF9wdXRkaW1lZmllbGQoc29hcCwgc29hcC0+ZGltZS50eXBlLCB0eXBlbGVuKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0ZGltZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIGZvciAoY29udGVudCA9IHNvYXAtPmRpbWUuZmlyc3Q7IGNvbnRlbnQ7IGNvbnRlbnQgPSBjb250ZW50LT5uZXh0KQorICB7IHZvaWQgKmhhbmRsZTsKKyAgICBzb2FwLT5kaW1lLnNpemUgPSBjb250ZW50LT5zaXplOworICAgIHNvYXAtPmRpbWUuaWQgPSBjb250ZW50LT5pZDsKKyAgICBzb2FwLT5kaW1lLnR5cGUgPSBjb250ZW50LT50eXBlOworICAgIHNvYXAtPmRpbWUub3B0aW9ucyA9IGNvbnRlbnQtPm9wdGlvbnM7CisgICAgc29hcC0+ZGltZS5mbGFncyA9IFNPQVBfRElNRV9WRVJTSU9OIHwgU09BUF9ESU1FX01FRElBOworICAgIGlmIChzb2FwLT5mZGltZXJlYWRvcGVuICYmICgoaGFuZGxlID0gc29hcC0+ZmRpbWVyZWFkb3Blbihzb2FwLCAodm9pZCopY29udGVudC0+cHRyLCBjb250ZW50LT5pZCwgY29udGVudC0+dHlwZSwgY29udGVudC0+b3B0aW9ucykpIHx8IHNvYXAtPmVycm9yKSkKKyAgICB7IHNpemVfdCBzaXplID0gY29udGVudC0+c2l6ZTsKKyAgICAgIGlmICghaGFuZGxlKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImZkaW1lcmVhZG9wZW4gZmFpbGVkXG4iKSk7CisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIH0KKyAgICAgIGlmICghY29udGVudC0+c2l6ZSAmJiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpIHx8IChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSyB8fCAoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fU1RPUkUpKQorICAgICAgeyBzaXplX3QgY2h1bmtzaXplID0gc2l6ZW9mKHNvYXAtPnRtcGJ1Zik7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ2h1bmtlZCBzdHJlYW1pbmcgRElNRVxuIikpOworICAgICAgICBkbyAKKyAgICAgICAgeyBzaXplID0gc29hcC0+ZmRpbWVyZWFkKHNvYXAsIGhhbmRsZSwgc29hcC0+dG1wYnVmLCBjaHVua3NpemUpOworICAgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZmRpbWVyZWFkIHJldHVybmVkICVsdSBieXRlc1xuIiwgKHVuc2lnbmVkIGxvbmcpc2l6ZSkpOworICAgICAgICAgIGlmIChzaXplIDwgY2h1bmtzaXplKQorIAkgIHsgc29hcC0+ZGltZS5mbGFncyAmPSB+U09BUF9ESU1FX0NGOworICAgICAgICAgICAgaWYgKCFjb250ZW50LT5uZXh0KQorICAgICAgICAgICAgICBzb2FwLT5kaW1lLmZsYWdzIHw9IFNPQVBfRElNRV9NRTsKKwkgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBzb2FwLT5kaW1lLmZsYWdzIHw9IFNPQVBfRElNRV9DRjsKKwkgIHNvYXAtPmRpbWUuc2l6ZSA9IHNpemU7CisgICAgICAgICAgaWYgKHNvYXBfcHV0ZGltZWhkcihzb2FwKQorCSAgIHx8IHNvYXBfcHV0ZGltZWZpZWxkKHNvYXAsIHNvYXAtPnRtcGJ1Ziwgc2l6ZSkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBpZiAoc29hcC0+ZGltZS5pZCkKKyAJICB7IHNvYXAtPmRpbWUuZmxhZ3MgJj0gfihTT0FQX0RJTUVfTUIgfCBTT0FQX0RJTUVfTUVESUEpOworICAgICAgICAgICAgc29hcC0+ZGltZS5pZCA9IE5VTEw7CisgICAgICAgICAgICBzb2FwLT5kaW1lLnR5cGUgPSBOVUxMOworICAgICAgICAgICAgc29hcC0+ZGltZS5vcHRpb25zID0gTlVMTDsKKyAgICAgICAgICB9ICAKKyAgICAgICAgfSB3aGlsZSAoc2l6ZSA+PSBjaHVua3NpemUpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBpZiAoIWNvbnRlbnQtPm5leHQpCisgICAgICAgICAgc29hcC0+ZGltZS5mbGFncyB8PSBTT0FQX0RJTUVfTUU7CisgICAgICAgIGlmIChzb2FwX3B1dGRpbWVoZHIoc29hcCkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBkbworICAgICAgICB7IHNpemVfdCBidWZzaXplOworCSAgaWYgKHNpemUgPCBzaXplb2Yoc29hcC0+dG1wYnVmKSkKKyAgICAgICAgICAgIGJ1ZnNpemUgPSBzaXplOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJ1ZnNpemUgPSBzaXplb2Yoc29hcC0+dG1wYnVmKTsKKyAgICAgICAgICBpZiAoIShidWZzaXplID0gc29hcC0+ZmRpbWVyZWFkKHNvYXAsIGhhbmRsZSwgc29hcC0+dG1wYnVmLCBidWZzaXplKSkpCisgICAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImZkaW1lcmVhZCBmYWlsZWQ6IGluc3VmZmljaWVudCBkYXRhICglbHUgYnl0ZXMgcmVtYWluaW5nIGZyb20gJWx1IGJ5dGVzKVxuIiwgKHVuc2lnbmVkIGxvbmcpc2l6ZSwgKHVuc2lnbmVkIGxvbmcpc29hcC0+ZGltZS5zaXplKSk7CisgICAgICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworCSAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgc29hcC0+dG1wYnVmLCBidWZzaXplKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHNpemUgLT0gYnVmc2l6ZTsKKyAgICAgICAgfSB3aGlsZSAoc2l6ZSk7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZmRpbWVyZWFkY2xvc2VcbiIpKTsKKyAgICAgICAgc29hcF9zZW5kX3Jhdyhzb2FwLCBTT0FQX1NUUl9QQURESU5HLCAtKGxvbmcpc29hcC0+ZGltZS5zaXplJjMpOworICAgICAgfQorICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJmZGltZXJlYWRjbG9zZVxuIikpOworICAgICAgaWYgKHNvYXAtPmZkaW1lcmVhZGNsb3NlKQorICAgICAgICBzb2FwLT5mZGltZXJlYWRjbG9zZShzb2FwLCBoYW5kbGUpOworICAgIH0KKyAgICBlbHNlCisgICAgeyBpZiAoIWNvbnRlbnQtPm5leHQpCisgICAgICAgIHNvYXAtPmRpbWUuZmxhZ3MgfD0gU09BUF9ESU1FX01FOworICAgICAgaWYgKHNvYXBfcHV0ZGltZWhkcihzb2FwKQorICAgICAgIHx8IHNvYXBfcHV0ZGltZWZpZWxkKHNvYXAsIChjaGFyKiljb250ZW50LT5wdHIsIGNvbnRlbnQtPnNpemUpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY2hhciAqCitzb2FwX2dldGRpbWVmaWVsZChzdHJ1Y3Qgc29hcCAqc29hcCwgc2l6ZV90IG4pCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIGNoYXIgKnM7CisgIGNoYXIgKnAgPSBOVUxMOworICBpZiAobikKKyAgeyBwID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIG4gKyAxKTsKKyAgICBpZiAocCkKKyAgICB7IHMgPSBwOworICAgICAgZm9yIChpID0gbjsgaSA+IDA7IGktLSkKKyAgICAgIHsgaWYgKChpbnQpKGMgPSBzb2FwX2dldDEoc29hcCkpID09IEVPRikKKyAgICAgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgICpzKysgPSAoY2hhciljOworICAgICAgfQorICAgICAgKnMgPSAnXDAnOworICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXBfbW92ZShzb2FwLCAtKGxvbmcpbiYzKSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICB9CisgIHJldHVybiBwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0ZGltZWhkcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICByZWdpc3RlciBjaGFyICpzOworICByZWdpc3RlciBpbnQgaTsKKyAgdW5zaWduZWQgY2hhciB0bXBbMTJdOworICBzaXplX3Qgb3B0bGVuLCBpZGxlbiwgdHlwZWxlbjsKKyAgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRElNRV9FTkQ7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR2V0IERJTUUgaGVhZGVyXG4iKSk7CisgIGlmIChzb2FwLT5kaW1lLmJ1ZmxlbiB8fCBzb2FwLT5kaW1lLmNodW5rc2l6ZSkKKyAgeyBpZiAoc29hcF9tb3ZlKHNvYXAsIChsb25nKShzb2FwLT5kaW1lLnNpemUgLSBzb2FwX3RlbGwoc29hcCkpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgIHNvYXBfdW5nZXQoc29hcCwgc29hcF9nZXRjaGFyKHNvYXApKTsgLyogc2tpcCBwYWRkaW5nIGFuZCBnZXQgaGRyICovCisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIuLi4gRnJvbSBjaHVua2VkXG4iKSk7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgcyA9IChjaGFyKil0bXA7CisgIGZvciAoaSA9IDEyOyBpID4gMDsgaS0tKQorICB7IGlmICgoaW50KShjID0gc29hcF9nZXRjaGFyKHNvYXApKSA9PSBFT0YpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAqcysrID0gKGNoYXIpYzsKKyAgfQorICBpZiAoKHRtcFswXSAmIDB4RjgpICE9IFNPQVBfRElNRV9WRVJTSU9OKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRElNRV9NSVNNQVRDSDsKKyAgc29hcC0+ZGltZS5mbGFncyA9ICh0bXBbMF0gJiAweDcpIHwgKHRtcFsxXSAmIDB4RjApOworICBvcHRsZW4gPSAodG1wWzJdIDw8IDgpIHwgdG1wWzNdOworICBpZGxlbiA9ICh0bXBbNF0gPDwgOCkgfCB0bXBbNV07CisgIHR5cGVsZW4gPSAodG1wWzZdIDw8IDgpIHwgdG1wWzddOworICBzb2FwLT5kaW1lLnNpemUgPSAodG1wWzhdIDw8IDI0KSB8ICh0bXBbOV0gPDwgMTYpIHwgKHRtcFsxMF0gPDwgOCkgfCB0bXBbMTFdOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRJTUUgc2l6ZT0lbHUgZmxhZ3M9MHglWFxuIiwgKHVuc2lnbmVkIGxvbmcpc29hcC0+ZGltZS5zaXplLCBzb2FwLT5kaW1lLmZsYWdzKSk7CisgIGlmICghKHNvYXAtPmRpbWUub3B0aW9ucyA9IHNvYXBfZ2V0ZGltZWZpZWxkKHNvYXAsIG9wdGxlbikpICYmIHNvYXAtPmVycm9yKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKCEoc29hcC0+ZGltZS5pZCA9IHNvYXBfZ2V0ZGltZWZpZWxkKHNvYXAsIGlkbGVuKSkgJiYgc29hcC0+ZXJyb3IpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoIShzb2FwLT5kaW1lLnR5cGUgPSBzb2FwX2dldGRpbWVmaWVsZChzb2FwLCB0eXBlbGVuKSkgJiYgc29hcC0+ZXJyb3IpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRJTUUgaWQ9JXMsIHR5cGU9JXMsIG9wdGlvbnM9JXNcbiIsIHNvYXAtPmRpbWUuaWQ/c29hcC0+ZGltZS5pZDoiIiwgc29hcC0+ZGltZS50eXBlP3NvYXAtPmRpbWUudHlwZToiIiwgc29hcC0+ZGltZS5vcHRpb25zP3NvYXAtPmRpbWUub3B0aW9ucys0OiIiKSk7CisgIGlmIChzb2FwLT5kaW1lLmZsYWdzICYgU09BUF9ESU1FX01FKQorICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX0RJTUU7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0ZGltZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgd2hpbGUgKHNvYXAtPmRpbWUuZmxhZ3MgJiBTT0FQX0RJTUVfQ0YpCisgIHsgaWYgKHNvYXBfZ2V0ZGltZWhkcihzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAoc29hcF9tb3ZlKHNvYXAsIHNvYXAtPmRpbWUuc2l6ZSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgfQorICBpZiAoc29hcF9tb3ZlKHNvYXAsICgoc29hcC0+ZGltZS5zaXplKzMpJih+MykpLXNvYXBfdGVsbChzb2FwKSkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIGZvciAoOzspCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICAgIGlmIChzb2FwX2dldGRpbWVoZHIoc29hcCkpCisgICAgICBicmVhazsKKyAgICBpZiAoc29hcC0+ZmRpbWV3cml0ZW9wZW4gJiYgKChzb2FwLT5kaW1lLnB0ciA9IChjaGFyKilzb2FwLT5mZGltZXdyaXRlb3Blbihzb2FwLCBzb2FwLT5kaW1lLmlkLCBzb2FwLT5kaW1lLnR5cGUsIHNvYXAtPmRpbWUub3B0aW9ucykpIHx8IHNvYXAtPmVycm9yKSkKKyAgICB7IGNvbnN0IGNoYXIgKmlkLCAqdHlwZSwgKm9wdGlvbnM7CisgICAgICBzaXplX3Qgc2l6ZSwgbjsKKyAgICAgIGlmICghc29hcC0+ZGltZS5wdHIpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIGlkID0gc29hcC0+ZGltZS5pZDsKKyAgICAgIHR5cGUgPSBzb2FwLT5kaW1lLnR5cGU7CisgICAgICBvcHRpb25zID0gc29hcC0+ZGltZS5vcHRpb25zOworICAgICAgZm9yICg7OykKKyAgICAgIHsgc2l6ZSA9IHNvYXAtPmRpbWUuc2l6ZTsKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeyBuID0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgICAgICAgIGlmIChzaXplIDwgbikKKyAgICAgICAgICAgIG4gPSBzaXplOworICAgICAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mZGltZXdyaXRlKHNvYXAsICh2b2lkKilzb2FwLT5kaW1lLnB0ciwgc29hcC0+YnVmICsgc29hcC0+YnVmaWR4LCBuKSkpCisgICAgICAgICAgICBicmVhazsKKwkgIHNpemUgLT0gbjsKKwkgIGlmICghc2l6ZSkKKwkgIHsgc29hcC0+YnVmaWR4ICs9IG47CisJICAgIGJyZWFrOworCSAgfQorCSAgaWYgKHNvYXBfcmVjdihzb2FwKSkKKyAgICAgICAgICB7IHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisJICAgIGdvdG8gZW5kOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc29hcF9tb3ZlKHNvYXAsIC0obG9uZylzb2FwLT5kaW1lLnNpemUmMykpCisgICAgICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKwkgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICghKHNvYXAtPmRpbWUuZmxhZ3MgJiBTT0FQX0RJTUVfQ0YpKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoc29hcF9nZXRkaW1laGRyKHNvYXApKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorZW5kOgorICAgICAgaWYgKHNvYXAtPmZkaW1ld3JpdGVjbG9zZSkKKyAgICAgICAgc29hcC0+ZmRpbWV3cml0ZWNsb3NlKHNvYXAsICh2b2lkKilzb2FwLT5kaW1lLnB0cik7CisgICAgICBzb2FwLT5kaW1lLnNpemUgPSAwOworICAgICAgc29hcC0+ZGltZS5pZCA9IGlkOworICAgICAgc29hcC0+ZGltZS50eXBlID0gdHlwZTsKKyAgICAgIHNvYXAtPmRpbWUub3B0aW9ucyA9IG9wdGlvbnM7CisgICAgfQorICAgIGVsc2UgaWYgKHNvYXAtPmRpbWUuZmxhZ3MgJiBTT0FQX0RJTUVfQ0YpCisgICAgeyBjb25zdCBjaGFyICppZCwgKnR5cGUsICpvcHRpb25zOworICAgICAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICAgICAgcmVnaXN0ZXIgY2hhciAqczsKKyAgICAgIHJlZ2lzdGVyIGludCBpOworICAgICAgaWQgPSBzb2FwLT5kaW1lLmlkOworICAgICAgdHlwZSA9IHNvYXAtPmRpbWUudHlwZTsKKyAgICAgIG9wdGlvbnMgPSBzb2FwLT5kaW1lLm9wdGlvbnM7CisgICAgICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgICAgIHJldHVybiBTT0FQX0VPTTsKKyAgICAgIGZvciAoOzspCisgICAgICB7IHMgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIHNvYXAtPmRpbWUuc2l6ZSk7CisgICAgICAgIGlmICghcykKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgICAgZm9yIChpID0gc29hcC0+ZGltZS5zaXplOyBpID4gMDsgaS0tKQorICAgICAgICB7IGlmICgoaW50KShjID0gc29hcF9nZXQxKHNvYXApKSA9PSBFT0YpCisgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAgICAgICAqcysrID0gKGNoYXIpYzsKKyAgICAgICAgfQorICAgICAgICBpZiAoc29hcF9tb3ZlKHNvYXAsIC0obG9uZylzb2FwLT5kaW1lLnNpemUmMykpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgICAgIGlmICghKHNvYXAtPmRpbWUuZmxhZ3MgJiBTT0FQX0RJTUVfQ0YpKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoc29hcF9nZXRkaW1laGRyKHNvYXApKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIH0KKyAgICAgIHNvYXAtPmRpbWUuc2l6ZSA9IHNvYXAtPmJsaXN0LT5zaXplKys7IC8qIGFsbG9jYXRlIG9uZSBtb3JlIGZvciAnXDAnICovCisgICAgICBpZiAoIShzb2FwLT5kaW1lLnB0ciA9IHNvYXBfc2F2ZV9ibG9jayhzb2FwLCBOVUxMLCAwKSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHNvYXAtPmRpbWUucHRyW3NvYXAtPmRpbWUuc2l6ZV0gPSAnXDAnOyAvKiBmb3JjZSAwLXRlcm1pbmF0ZWQgKi8KKyAgICAgIHNvYXAtPmRpbWUuaWQgPSBpZDsKKyAgICAgIHNvYXAtPmRpbWUudHlwZSA9IHR5cGU7CisgICAgICBzb2FwLT5kaW1lLm9wdGlvbnMgPSBvcHRpb25zOworICAgIH0KKyAgICBlbHNlCisgICAgICBzb2FwLT5kaW1lLnB0ciA9IHNvYXBfZ2V0ZGltZWZpZWxkKHNvYXAsIHNvYXAtPmRpbWUuc2l6ZSk7CisgICAgY29udGVudCA9IHNvYXBfbmV3X211bHRpcGFydChzb2FwLCAmc29hcC0+ZGltZS5maXJzdCwgJnNvYXAtPmRpbWUubGFzdCwgc29hcC0+ZGltZS5wdHIsIHNvYXAtPmRpbWUuc2l6ZSk7CisgICAgaWYgKCFjb250ZW50KQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgY29udGVudC0+aWQgPSBzb2FwLT5kaW1lLmlkOworICAgIGNvbnRlbnQtPnR5cGUgPSBzb2FwLT5kaW1lLnR5cGU7CisgICAgY29udGVudC0+b3B0aW9ucyA9IHNvYXAtPmRpbWUub3B0aW9uczsKKyAgICBzb2FwX3Jlc29sdmVfYXR0YWNobWVudChzb2FwLCBjb250ZW50KTsKKyAgICBpZiAoc29hcC0+ZXJyb3IpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfRElNRV9FTkQpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0bWltZWhkcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICBkbworICB7IGlmIChzb2FwX2dldGxpbmUoc29hcCwgc29hcC0+bXNnYnVmLCBzaXplb2Yoc29hcC0+bXNnYnVmKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgd2hpbGUgKCEqc29hcC0+bXNnYnVmKTsKKyAgaWYgKHNvYXAtPm1zZ2J1ZlswXSA9PSAnLScgJiYgc29hcC0+bXNnYnVmWzFdID09ICctJykKKyAgeyBjaGFyICpzID0gc29hcC0+bXNnYnVmICsgc3RybGVuKHNvYXAtPm1zZ2J1ZikgLSAxOworICAgIC8qIHJlbW92ZSB3aGl0ZSBzcGFjZSAqLworICAgIHdoaWxlIChzb2FwX2JsYW5rKCpzKSkKKyAgICAgIHMtLTsKKyAgICBzWzFdID0gJ1wwJzsKKyAgICBpZiAoc29hcC0+bWltZS5ib3VuZGFyeSkKKyAgICB7IGlmIChzdHJjbXAoc29hcC0+bXNnYnVmICsgMiwgc29hcC0+bWltZS5ib3VuZGFyeSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTUlNRV9FUlJPUjsKKyAgICB9CisgICAgZWxzZQorICAgICAgc29hcC0+bWltZS5ib3VuZGFyeSA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPm1zZ2J1ZiArIDIpOworICAgIGlmIChzb2FwX2dldGxpbmUoc29hcCwgc29hcC0+bXNnYnVmLCBzaXplb2Yoc29hcC0+bXNnYnVmKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHNvYXBfc2V0X21pbWVfYXR0YWNobWVudChzb2FwLCBOVUxMLCAwLCBTT0FQX01JTUVfTk9ORSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgIGNvbnRlbnQgPSBzb2FwLT5taW1lLmxhc3Q7CisgIGZvciAoOzspCisgIHsgcmVnaXN0ZXIgY2hhciAqa2V5ID0gc29hcC0+bXNnYnVmOworICAgIHJlZ2lzdGVyIGNoYXIgKnZhbDsKKyAgICBpZiAoISprZXkpCisgICAgICBicmVhazsKKyAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiTUlNRSBoZWFkZXI6ICVzXG4iLCBrZXkpKTsKKyAgICB2YWwgPSBzdHJjaHIoc29hcC0+bXNnYnVmLCAnOicpOworICAgIGlmICh2YWwpCisgICAgeyAqdmFsID0gJ1wwJzsKKyAgICAgIGRvIHZhbCsrOworICAgICAgd2hpbGUgKCp2YWwgJiYgKnZhbCA8PSAzMik7CisgICAgICBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LUlEIikpCisgICAgICAgIGNvbnRlbnQtPmlkID0gc29hcF9zdHJkdXAoc29hcCwgdmFsKTsKKyAgICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1Mb2NhdGlvbiIpKQorICAgICAgICBjb250ZW50LT5sb2NhdGlvbiA9IHNvYXBfc3RyZHVwKHNvYXAsIHZhbCk7CisgICAgICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtRGlzcG9zaXRpb24iKSkKKyAgICAgICAgY29udGVudC0+aWQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCwgIm5hbWUiKSk7CisgICAgICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtVHlwZSIpKQorICAgICAgICBjb250ZW50LT50eXBlID0gc29hcF9zdHJkdXAoc29hcCwgdmFsKTsKKyAgICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1EZXNjcmlwdGlvbiIpKQorICAgICAgICBjb250ZW50LT5kZXNjcmlwdGlvbiA9IHNvYXBfc3RyZHVwKHNvYXAsIHZhbCk7CisgICAgICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmciKSkKKyAgICAgICAgY29udGVudC0+ZW5jb2RpbmcgPSAoZW51bSBzb2FwX21pbWVfZW5jb2Rpbmcpc29hcF9pbnRfY29kZShtaW1lX2NvZGVzLCB2YWwsIChsb25nKVNPQVBfTUlNRV9OT05FKTsKKyAgICB9CisgICAgaWYgKHNvYXBfZ2V0bGluZShzb2FwLCBrZXksIHNpemVvZihzb2FwLT5tc2didWYpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldG1pbWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IDA7CisgIGlmICghc29hcC0+bWltZS5sYXN0KQorICAgIHJldHVybiBTT0FQX09LOworICBmb3IgKDs7KQorICB7IHJlZ2lzdGVyIHNpemVfdCBpLCBtID0gMDsKKyAgICByZWdpc3RlciBjaGFyICpzLCAqdCA9IE5VTEw7CisgICAgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50ID0gc29hcC0+bWltZS5sYXN0OworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUGFyc2luZyBNSU1FIGNvbnRlbnQgaWQ9JXMgdHlwZT0lc1xuIiwgY29udGVudC0+aWQ/Y29udGVudC0+aWQ6IiIsIGNvbnRlbnQtPnR5cGU/Y29udGVudC0+dHlwZToiIikpOworICAgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIGZvciAoOzspCisgICAgeyByZWdpc3RlciBzaG9ydCBmbGFnID0gMDsKKyAgICAgIGlmICghKHMgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIFNPQVBfQkxLTEVOKSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgZm9yIChpID0gMDsgaSA8IFNPQVBfQkxLTEVOOyBpKyspCisgICAgICB7IGlmIChtID4gMCkKKyAgICAgICAgeyAqcysrID0gKnQrKzsKKwkgIG0tLTsKKwl9CisJZWxzZQorICAgICAgICB7IGlmICghZmxhZykKKwkgIHsgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKwkgICAgaWYgKChpbnQpYyA9PSBFT0YpCisJICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisJICB9CisJICBpZiAoZmxhZyB8fCBjID09ICdccicpCisJICB7IHQgPSBzb2FwLT50bXBidWY7CisJICAgIG1lbXNldCh0LCAwLCBzaXplb2Yoc29hcC0+dG1wYnVmKSk7CisgICAgICAgICAgICBzdHJjcHkodCwgIlxuLS0iKTsKKyAgICAgICAgICAgIGlmIChzb2FwLT5taW1lLmJvdW5kYXJ5KQorCSAgICAgIHN0cm5jYXQodCwgc29hcC0+bWltZS5ib3VuZGFyeSwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiktNCk7CisJICAgIGRvIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisJICAgIHdoaWxlIChjID09ICp0KyspOworCSAgICBpZiAoKGludCljID09IEVPRikKKwkgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKwkgICAgaWYgKCEqLS10KQorCSAgICAgIGdvdG8gZW5kOworCSAgICAqdCA9IChjaGFyKWM7CisJICAgIGZsYWcgPSAoYyA9PSAnXHInKTsKKwkgICAgbSA9IHQgLSBzb2FwLT50bXBidWYgKyAxIC0gZmxhZzsKKwkgICAgdCA9IHNvYXAtPnRtcGJ1ZjsKKwkgICAgYyA9ICdccic7CisJICB9CisJICAqcysrID0gKGNoYXIpYzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KK2VuZDoKKyAgICAqcyA9ICdcMCc7IC8qIGZvcmNlIDAtdGVybWluYXRlZCAqLworICAgIGNvbnRlbnQtPnNpemUgPSBzb2FwX3NpemVfYmxvY2soc29hcCwgaSsxKS0xOworICAgIGNvbnRlbnQtPnB0ciA9IHNvYXBfc2F2ZV9ibG9jayhzb2FwLCBOVUxMLCAwKTsKKyAgICBzb2FwX3Jlc29sdmVfYXR0YWNobWVudChzb2FwLCBjb250ZW50KTsKKyAgICBpZiAoYyA9PSAnLScgJiYgc29hcF9nZXRjaGFyKHNvYXApID09ICctJykKKyAgICAgIGJyZWFrOworICAgIHdoaWxlIChjICE9ICdccicgJiYgKGludCljICE9IEVPRiAmJiBzb2FwX2JsYW5rKGMpKQorICAgICAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgICBpZiAoYyAhPSAnXHInIHx8IHNvYXBfZ2V0Y2hhcihzb2FwKSAhPSAnXG4nKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9NSU1FX0VSUk9SOworICAgIGlmIChzb2FwX2dldG1pbWVoZHIoc29hcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NvYXBfbWF0Y2hfY2lkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICp0KQoreyByZWdpc3RlciBzaXplX3QgbjsKKyAgaWYgKCFzKQorICAgIHJldHVybiAxOworICBpZiAoIXN0cmNtcChzLCB0KSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKCFzdHJuY21wKHMsICJjaWQ6IiwgNCkpCisgICAgcyArPSA0OworICBuID0gc3RybGVuKHQpOworICBpZiAoKnQgPT0gJzwnKQorICB7IHQrKzsKKyAgICBuIC09IDI7CisgIH0KKyAgaWYgKCFzdHJuY21wKHMsIHQsIG4pICYmICFzW25dKQorICAgIHJldHVybiAwOworICBzb2FwX2RlY29kZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCBzLCBTT0FQX1NUUl9FT1MpOworICBpZiAoIXN0cm5jbXAoc29hcC0+dG1wYnVmLCB0LCBuKSAmJiAhc29hcC0+dG1wYnVmW25dKQorICAgIHJldHVybiAwOworICByZXR1cm4gMTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQKK3NvYXBfcmVzb2x2ZV9hdHRhY2htZW50KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQpCit7IGlmIChjb250ZW50LT5pZCkKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF94bGlzdCAqKnhwID0gJnNvYXAtPnhsaXN0OworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x2aW5nIGF0dGFjaG1lbnQgZGF0YSBmb3IgaWQ9JXNcbiIsIGNvbnRlbnQtPmlkKSk7CisgICAgd2hpbGUgKCp4cCkKKyAgICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3hsaXN0ICp4cSA9ICp4cDsKKyAgICAgIGlmICghc29hcF9tYXRjaF9jaWQoc29hcCwgeHEtPmlkLCBjb250ZW50LT5pZCkpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRm91bmQgbWF0Y2hpbmcgYXR0YWNobWVudCAlcyBmb3IgY29udGVudCBpZD0lc1xuIiwgeHEtPmlkLCBjb250ZW50LT5pZCkpOworCSp4cCA9IHhxLT5uZXh0OworICAgICAgICAqeHEtPnB0ciA9ICh1bnNpZ25lZCBjaGFyKiljb250ZW50LT5wdHI7CisgICAgICAgICp4cS0+c2l6ZSA9IChpbnQpY29udGVudC0+c2l6ZTsKKyAgICAgICAgKnhxLT50eXBlID0gKGNoYXIqKWNvbnRlbnQtPnR5cGU7CisJaWYgKGNvbnRlbnQtPm9wdGlvbnMpCisgICAgICAgICAgKnhxLT5vcHRpb25zID0gKGNoYXIqKWNvbnRlbnQtPm9wdGlvbnM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAqeHEtPm9wdGlvbnMgPSAoY2hhciopY29udGVudC0+ZGVzY3JpcHRpb247CisJU09BUF9GUkVFKHNvYXAsIHhxKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeHAgPSAmKCp4cCktPm5leHQ7CisgICAgfQorICB9Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRtaW1laGRyKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQpCit7IGNvbnN0IGNoYXIgKnM7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTUlNRSBhdHRhY2htZW50IHR5cGU9JXNcbiIsIGNvbnRlbnQtPnR5cGU/Y29udGVudC0+dHlwZToiIikpOworICBpZiAoc29hcF9zZW5kMyhzb2FwLCAiXHJcbi0tIiwgc29hcC0+bWltZS5ib3VuZGFyeSwgIlxyXG4iKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmIChjb250ZW50LT50eXBlICYmIHNvYXBfc2VuZDMoc29hcCwgIkNvbnRlbnQtVHlwZTogIiwgY29udGVudC0+dHlwZSwgIlxyXG4iKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHMgPSBzb2FwX3N0cl9jb2RlKG1pbWVfY29kZXMsIGNvbnRlbnQtPmVuY29kaW5nKTsKKyAgaWYgKHMgJiYgc29hcF9zZW5kMyhzb2FwLCAiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogIiwgcywgIlxyXG4iKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmIChjb250ZW50LT5pZCAmJiBzb2FwX3NlbmQzKHNvYXAsICJDb250ZW50LUlEOiAiLCBjb250ZW50LT5pZCwgIlxyXG4iKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmIChjb250ZW50LT5sb2NhdGlvbiAmJiBzb2FwX3NlbmQzKHNvYXAsICJDb250ZW50LUxvY2F0aW9uOiAiLCBjb250ZW50LT5sb2NhdGlvbiwgIlxyXG4iKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmIChjb250ZW50LT5kZXNjcmlwdGlvbiAmJiBzb2FwX3NlbmQzKHNvYXAsICJDb250ZW50LURlc2NyaXB0aW9uOiAiLCBjb250ZW50LT5kZXNjcmlwdGlvbiwgIlxyXG4iKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsICJcclxuIiwgMik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRtaW1lKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgIGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKSB8fCAhc29hcC0+bWltZS5ib3VuZGFyeSkKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTZW5kaW5nIE1JTUUgYXR0YWNobWVudHNcbiIpKTsKKyAgZm9yIChjb250ZW50ID0gc29hcC0+bWltZS5maXJzdDsgY29udGVudDsgY29udGVudCA9IGNvbnRlbnQtPm5leHQpCisgICAgaWYgKHNvYXBfcHV0bWltZWhkcihzb2FwLCBjb250ZW50KQorICAgICB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsIGNvbnRlbnQtPnB0ciwgY29udGVudC0+c2l6ZSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX3NlbmQzKHNvYXAsICJcclxuLS0iLCBzb2FwLT5taW1lLmJvdW5kYXJ5LCAiLS0iKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfZGltZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+b21vZGUgfD0gU09BUF9FTkNfRElNRTsKKyAgc29hcC0+ZGltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGFzdCA9IE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X21pbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmJvdW5kYXJ5LCBjb25zdCBjaGFyICpzdGFydCkKK3sgc29hcC0+b21vZGUgfD0gU09BUF9FTkNfTUlNRTsKKyAgc29hcC0+bWltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuYm91bmRhcnkgPSBzb2FwX3N0cmR1cChzb2FwLCBib3VuZGFyeSk7CisgIHNvYXAtPm1pbWUuc3RhcnQgPSBzb2FwX3N0cmR1cChzb2FwLCBzdGFydCk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfY2xyX2RpbWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPm9tb2RlICY9IH5TT0FQX0VOQ19ESU1FOworICBzb2FwLT5kaW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5sYXN0ID0gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9jbHJfbWltZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+b21vZGUgJj0gflNPQVBfRU5DX01JTUU7CisgIHNvYXAtPm1pbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmxhc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gTlVMTDsKKyAgc29hcC0+bWltZS5zdGFydCA9IE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqCitzb2FwX25ld19tdWx0aXBhcnQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX211bHRpcGFydCAqKmZpcnN0LCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKipsYXN0LCBjaGFyICpwdHIsIHNpemVfdCBzaXplKQoreyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgIGNvbnRlbnQgPSAoc3RydWN0IHNvYXBfbXVsdGlwYXJ0Kilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfbXVsdGlwYXJ0KSk7CisgIGlmIChjb250ZW50KQorICB7IGNvbnRlbnQtPm5leHQgPSBOVUxMOworICAgIGNvbnRlbnQtPnB0ciA9IHB0cjsKKyAgICBjb250ZW50LT5zaXplID0gc2l6ZTsKKyAgICBjb250ZW50LT5pZCA9IE5VTEw7CisgICAgY29udGVudC0+dHlwZSA9IE5VTEw7CisgICAgY29udGVudC0+b3B0aW9ucyA9IE5VTEw7CisgICAgY29udGVudC0+ZW5jb2RpbmcgPSBTT0FQX01JTUVfTk9ORTsKKyAgICBjb250ZW50LT5sb2NhdGlvbiA9IE5VTEw7CisgICAgY29udGVudC0+ZGVzY3JpcHRpb24gPSBOVUxMOworICAgIGlmICghKmZpcnN0KQorICAgICAgKmZpcnN0ID0gY29udGVudDsKKyAgICBpZiAoKmxhc3QpCisgICAgICAoKmxhc3QpLT5uZXh0ID0gY29udGVudDsKKyAgICAqbGFzdCA9IGNvbnRlbnQ7CisgIH0KKyAgcmV0dXJuIGNvbnRlbnQ7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZXRfZGltZV9hdHRhY2htZW50KHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpwdHIsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICppZCwgdW5zaWduZWQgc2hvcnQgb3B0eXBlLCBjb25zdCBjaGFyICpvcHRpb24pCit7IHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudCA9IHNvYXBfbmV3X211bHRpcGFydChzb2FwLCAmc29hcC0+ZGltZS5maXJzdCwgJnNvYXAtPmRpbWUubGFzdCwgcHRyLCBzaXplKTsKKyAgaWYgKCFjb250ZW50KQorICAgIHJldHVybiBTT0FQX0VPTTsKKyAgY29udGVudC0+aWQgPSBzb2FwX3N0cmR1cChzb2FwLCBpZCk7CisgIGNvbnRlbnQtPnR5cGUgPSBzb2FwX3N0cmR1cChzb2FwLCB0eXBlKTsKKyAgY29udGVudC0+b3B0aW9ucyA9IHNvYXBfZGltZV9vcHRpb24oc29hcCwgb3B0eXBlLCBvcHRpb24pOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NldF9taW1lX2F0dGFjaG1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnB0ciwgc2l6ZV90IHNpemUsIGVudW0gc29hcF9taW1lX2VuY29kaW5nIGVuY29kaW5nLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqbG9jYXRpb24sIGNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uKQoreyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQgPSBzb2FwX25ld19tdWx0aXBhcnQoc29hcCwgJnNvYXAtPm1pbWUuZmlyc3QsICZzb2FwLT5taW1lLmxhc3QsIHB0ciwgc2l6ZSk7CisgIGlmICghY29udGVudCkKKyAgICByZXR1cm4gU09BUF9FT007CisgIGNvbnRlbnQtPmlkID0gc29hcF9zdHJkdXAoc29hcCwgaWQpOworICBjb250ZW50LT50eXBlID0gc29hcF9zdHJkdXAoc29hcCwgdHlwZSk7CisgIGNvbnRlbnQtPmVuY29kaW5nID0gZW5jb2Rpbmc7CisgIGNvbnRlbnQtPmxvY2F0aW9uID0gc29hcF9zdHJkdXAoc29hcCwgbG9jYXRpb24pOworICBjb250ZW50LT5kZXNjcmlwdGlvbiA9IHNvYXBfc3RyZHVwKHNvYXAsIGRlc2NyaXB0aW9uKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwX211bHRpcGFydCoKK1NPQVBfRk1BQzIKK3NvYXBfbmV4dF9tdWx0aXBhcnQoc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50KQoreyBpZiAoY29udGVudCkKKyAgICByZXR1cm4gY29udGVudC0+bmV4dDsKKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyB2b2lkCitzb2FwX3NlbGVjdF9taW1lX2JvdW5kYXJ5KHN0cnVjdCBzb2FwICpzb2FwKQoreyB3aGlsZSAoIXNvYXAtPm1pbWUuYm91bmRhcnkgfHwgc29hcF92YWxpZF9taW1lX2JvdW5kYXJ5KHNvYXApKQorICB7IHJlZ2lzdGVyIGNoYXIgKnMgPSBzb2FwLT5taW1lLmJvdW5kYXJ5OworICAgIHJlZ2lzdGVyIHNpemVfdCBuID0gMDsKKyAgICBpZiAocykKKyAgICAgIG4gPSBzdHJsZW4ocyk7CisgICAgaWYgKG4gPCAxNikKKyAgICB7IG4gPSA2NDsKKyAgICAgIHMgPSBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIG4gKyAxKTsKKyAgICAgIGlmICghcykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdHJjcHkocywgIj09Iik7CisgICAgcyArPSAyOworICAgIG4gLT0gNDsKKyAgICB3aGlsZSAobikKKyAgICB7ICpzKysgPSBzb2FwX2Jhc2U2NG9bc29hcF9yYW5kb20gJiAweDNGXTsKKyAgICAgIG4tLTsKKyAgICB9CisgICAgc3RyY3B5KHMsICI9PSIpOworICB9CisgIGlmICghc29hcC0+bWltZS5zdGFydCkKKyAgICBzb2FwLT5taW1lLnN0YXJ0ID0gIjxTT0FQLUVOVjpFbnZlbG9wZT4iOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzb2FwX3ZhbGlkX21pbWVfYm91bmRhcnkoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgcmVnaXN0ZXIgc2l6ZV90IGsgPSBzdHJsZW4oc29hcC0+bWltZS5ib3VuZGFyeSk7CisgIGZvciAoY29udGVudCA9IHNvYXAtPm1pbWUuZmlyc3Q7IGNvbnRlbnQ7IGNvbnRlbnQgPSBjb250ZW50LT5uZXh0KQorICB7IGlmIChjb250ZW50LT5wdHIgJiYgY29udGVudC0+c2l6ZSA+PSBrKQorICAgIHsgcmVnaXN0ZXIgY29uc3QgY2hhciAqcCA9IChjb25zdCBjaGFyKiljb250ZW50LT5wdHI7IAorICAgICAgcmVnaXN0ZXIgc2l6ZV90IGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgY29udGVudC0+c2l6ZSAtIGs7IGkrKywgcCsrKQorICAgICAgICBpZiAoIXN0cm5jbXAocCwgc29hcC0+bWltZS5ib3VuZGFyeSwgaykpCisgICAgICAgICAgcmV0dXJuIFNPQVBfRVJSOworICAgIH0KKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJSFRUUCBjb29raWUgaGFuZGxpbmcKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgV0lUSF9DT09LSUVTCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQorc2l6ZV90CitTT0FQX0ZNQUMyCitzb2FwX2VuY29kZV9jb29raWUoY29uc3QgY2hhciAqcywgY2hhciAqdCwgc2l6ZV90IGxlbikKK3sgcmVnaXN0ZXIgaW50IGM7CisgIHJlZ2lzdGVyIHNpemVfdCBuID0gbGVuOworICB3aGlsZSAoKGMgPSAqcysrKSAmJiAtLW4gPiAwKQorICB7IGlmIChjID4gJyAnICYmIGMgPCAxMjggJiYgIXN0cmNocigiKCk8PkAsOzpcXFwiL1tdPz17fSIsIGMpKQorICAgICAgKnQrKyA9IGM7CisgICAgZWxzZSBpZiAobiA+IDIpCisgICAgeyAqdCsrID0gJyUnOworICAgICAgKnQrKyA9IChjID4+IDQpICsgKGMgPiAxNTkgPyAnNycgOiAnMCcpOworICAgICAgYyAmPSAweEY7CisgICAgICAqdCsrID0gYyArIChjID4gOSA/ICc3JyA6ICcwJyk7CisgICAgICBuIC09IDI7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGJyZWFrOworICB9CisgICp0ID0gJ1wwJzsKKyAgcmV0dXJuIGxlbiAtIG47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcF9jb29raWUqCitTT0FQX0ZNQUMyCitzb2FwX2Nvb2tpZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIHNpemVfdCBuOworICBpZiAoIWRvbWFpbikKKyAgICBkb21haW4gPSBzb2FwLT5jb29raWVfZG9tYWluOworICBpZiAoIXBhdGgpCisgICAgcGF0aCA9IHNvYXAtPmNvb2tpZV9wYXRoOworICBpZiAoKnBhdGggPT0gJy8nKQorICAgIHBhdGgrKzsKKyAgbiA9IHN0cmxlbihwYXRoKTsKKyAgZm9yIChwID0gc29hcC0+Y29va2llczsgcDsgcCA9IHAtPm5leHQpCisgICAgaWYgKCFzdHJjbXAocC0+bmFtZSwgbmFtZSkKKyAgICAgJiYgZG9tYWluCisgICAgICYmIHAtPmRvbWFpbgorICAgICAmJiAhc3RyY21wKHAtPmRvbWFpbiwgZG9tYWluKQorICAgICAmJiAhc3RybmNtcChwLT5wYXRoLCBwYXRoLCBuKSkKKyAgICAgIGJyZWFrOworICByZXR1cm4gcDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwX2Nvb2tpZSoKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2Nvb2tpZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICoqcCwgKnE7CisgIGludCBuOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNldCBjb29raWU6ICVzPSVzIGRvbWFpbj0lcyBwYXRoPSVzXG4iLCBuYW1lLCB2YWx1ZT92YWx1ZToiIiwgZG9tYWluP2RvbWFpbjoiIiwgcGF0aD9wYXRoOiIiKSk7CisgIGlmICghZG9tYWluKQorICAgIGRvbWFpbiA9IHNvYXAtPmNvb2tpZV9kb21haW47CisgIGlmICghcGF0aCkKKyAgICBwYXRoID0gc29hcC0+Y29va2llX3BhdGg7CisgIGlmICghcGF0aCkKKyAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiQ29va2llIHBhdGggbm90IHNldCIsIE5VTEwsIFNPQVBfSFRUUF9FUlJPUik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKCpwYXRoID09ICcvJykKKyAgICBwYXRoKys7CisgIHEgPSBzb2FwX2Nvb2tpZShzb2FwLCBuYW1lLCBkb21haW4sIHBhdGgpOworICBpZiAoIXEpCisgIHsgaWYgKChxID0gKHN0cnVjdCBzb2FwX2Nvb2tpZSopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2Nvb2tpZSkpKSkKKyAgICB7IGlmICgocS0+bmFtZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4obmFtZSkrMSkpKQorICAgICAgICBzdHJjcHkocS0+bmFtZSwgbmFtZSk7CisgICAgICBxLT52YWx1ZSA9IE5VTEw7CisgICAgICBxLT5kb21haW4gPSBOVUxMOworICAgICAgcS0+cGF0aCA9IE5VTEw7CisgICAgICBxLT5leHBpcmUgPSAtMTsKKyAgICAgIHEtPnZlcnNpb24gPSAwOworICAgICAgcS0+c2VjdXJlID0gMDsKKyAgICAgIHEtPm1vZGlmaWVkID0gMDsKKyAgICAgIGZvciAocCA9ICZzb2FwLT5jb29raWVzLCBuID0gc29hcC0+Y29va2llX21heDsgKnAgJiYgbjsgcCA9ICYoKnApLT5uZXh0LCBuLS0pCisgICAgICAgIGlmICghc3RyY21wKCgqcCktPm5hbWUsIG5hbWUpICYmICgqcCktPnBhdGggJiYgc3RyY21wKCgqcCktPnBhdGgsIHBhdGgpIDwgMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgIGlmIChuKQorICAgICAgeyBxLT5uZXh0ID0gKnA7CisgICAgICAgICpwID0gcTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgU09BUF9GUkVFKHNvYXAsIHEtPm5hbWUpOworICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcSk7CisgICAgICAgIHEgPSBOVUxMOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgICAgcS0+bW9kaWZpZWQgPSAxOworICBpZiAocSkKKyAgeyBpZiAocS0+dmFsdWUpCisgICAgeyBTT0FQX0ZSRUUoc29hcCwgcS0+dmFsdWUpOworICAgICAgcS0+dmFsdWUgPSBOVUxMOworICAgIH0KKyAgICBpZiAocS0+ZG9tYWluKQorICAgIHsgU09BUF9GUkVFKHNvYXAsIHEtPmRvbWFpbik7CisgICAgICBxLT5kb21haW4gPSBOVUxMOworICAgIH0KKyAgICBpZiAocS0+cGF0aCkKKyAgICB7IFNPQVBfRlJFRShzb2FwLCBxLT5wYXRoKTsKKyAgICAgIHEtPnBhdGggPSBOVUxMOworICAgIH0KKyAgICBpZiAodmFsdWUgJiYgKnZhbHVlICYmIChxLT52YWx1ZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4odmFsdWUpKzEpKSkKKyAgICAgIHN0cmNweShxLT52YWx1ZSwgdmFsdWUpOworICAgIGlmIChkb21haW4gJiYgKmRvbWFpbiAmJiAocS0+ZG9tYWluID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihkb21haW4pKzEpKSkKKyAgICAgIHN0cmNweShxLT5kb21haW4sIGRvbWFpbik7CisgICAgaWYgKHBhdGggJiYgKnBhdGggJiYgKHEtPnBhdGggPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHBhdGgpKzEpKSkKKyAgICAgIHN0cmNweShxLT5wYXRoLCBwYXRoKTsKKyAgICBxLT5zZXNzaW9uID0gMTsKKyAgICBxLT5lbnYgPSAwOworICB9CisgIHJldHVybiBxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9jbHJfY29va2llKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqKnAsICpxOworICBpZiAoIWRvbWFpbikKKyAgICBkb21haW4gPSBzb2FwLT5jb29raWVfZG9tYWluOworICBpZiAoIWRvbWFpbikKKyAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiQ29va2llIGRvbWFpbiBub3Qgc2V0IiwgTlVMTCwgU09BUF9IVFRQX0VSUk9SKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFwYXRoKQorICAgIHBhdGggPSBzb2FwLT5jb29raWVfcGF0aDsKKyAgaWYgKCFwYXRoKQorICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJDb29raWUgcGF0aCBub3Qgc2V0IiwgTlVMTCwgU09BUF9IVFRQX0VSUk9SKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCpwYXRoID09ICcvJykKKyAgICBwYXRoKys7CisgIGZvciAocCA9ICZzb2FwLT5jb29raWVzLCBxID0gKnA7IHE7IHEgPSAqcCkKKyAgICBpZiAoIXN0cmNtcChxLT5uYW1lLCBuYW1lKSAmJiAhc3RyY21wKHEtPmRvbWFpbiwgZG9tYWluKSAmJiAhc3RybmNtcChxLT5wYXRoLCBwYXRoLCBzdHJsZW4ocS0+cGF0aCkpKQorICAgIHsgaWYgKHEtPnZhbHVlKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcS0+dmFsdWUpOworICAgICAgaWYgKHEtPmRvbWFpbikKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHEtPmRvbWFpbik7CisgICAgICBpZiAocS0+cGF0aCkKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHEtPnBhdGgpOworICAgICAgKnAgPSBxLT5uZXh0OworICAgICAgU09BUF9GUkVFKHNvYXAsIHEpOworICAgIH0KKyAgICBlbHNlCisgICAgICBwID0gJnEtPm5leHQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfY29va2llX3ZhbHVlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgaWYgKChwID0gc29hcF9jb29raWUoc29hcCwgbmFtZSwgZG9tYWluLCBwYXRoKSkpCisgICAgcmV0dXJuIHAtPnZhbHVlOworICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9lbnZfY29va2llX3ZhbHVlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgaWYgKChwID0gc29hcF9jb29raWUoc29hcCwgbmFtZSwgZG9tYWluLCBwYXRoKSkgJiYgcC0+ZW52KQorICAgIHJldHVybiBwLT52YWx1ZTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitsb25nCitTT0FQX0ZNQUMyCitzb2FwX2Nvb2tpZV9leHBpcmUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBpZiAoKHAgPSBzb2FwX2Nvb2tpZShzb2FwLCBuYW1lLCBkb21haW4sIHBhdGgpKSkKKyAgICByZXR1cm4gcC0+ZXhwaXJlOworICByZXR1cm4gLTE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2Nvb2tpZV9leHBpcmUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGxvbmcgZXhwaXJlLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgaWYgKChwID0gc29hcF9jb29raWUoc29hcCwgbmFtZSwgZG9tYWluLCBwYXRoKSkpCisgIHsgcC0+ZXhwaXJlID0gZXhwaXJlOworICAgIHAtPm1vZGlmaWVkID0gMTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICByZXR1cm4gU09BUF9FUlI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2Nvb2tpZV9zZXNzaW9uKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgaWYgKChwID0gc29hcF9jb29raWUoc29hcCwgbmFtZSwgZG9tYWluLCBwYXRoKSkpCisgIHsgcC0+c2Vzc2lvbiA9IDE7CisgICAgcC0+bW9kaWZpZWQgPSAxOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIHJldHVybiBTT0FQX0VSUjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9jbHJfY29va2llX3Nlc3Npb24oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBpZiAoKHAgPSBzb2FwX2Nvb2tpZShzb2FwLCBuYW1lLCBkb21haW4sIHBhdGgpKSkKKyAgeyBwLT5zZXNzaW9uID0gMDsKKyAgICBwLT5tb2RpZmllZCA9IDE7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgcmV0dXJuIFNPQVBfRVJSOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dHNldGNvb2tpZXMoc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgY2hhciAqcywgdG1wWzQwOTZdOworICBjb25zdCBjaGFyICp0OworICBmb3IgKHAgPSBzb2FwLT5jb29raWVzOyBwOyBwID0gcC0+bmV4dCkKKyAgeyBpZiAocC0+bW9kaWZpZWQgfHwgIXAtPmVudikKKyAgICB7IHMgPSB0bXA7CisgICAgICBpZiAocC0+bmFtZSkKKyAgICAgICAgcyArPSBzb2FwX2VuY29kZV9jb29raWUocC0+bmFtZSwgcywgdG1wLXMrNDA2NCk7CisgICAgICBpZiAocC0+dmFsdWUgJiYgKnAtPnZhbHVlKQorICAgICAgeyAqcysrID0gJz0nOworICAgICAgICBzICs9IHNvYXBfZW5jb2RlX2Nvb2tpZShwLT52YWx1ZSwgcywgdG1wLXMrNDA2NCk7CisgICAgICB9CisgICAgICBpZiAocC0+ZG9tYWluICYmIChpbnQpc3RybGVuKHAtPmRvbWFpbikgPCB0bXAtcys0MDY0KQorICAgICAgICBzcHJpbnRmKHMsICI7RG9tYWluPVwiJXNcIiIsIHAtPmRvbWFpbik7CisgICAgICBlbHNlIGlmIChzb2FwLT5jb29raWVfZG9tYWluICYmIChpbnQpc3RybGVuKHNvYXAtPmNvb2tpZV9kb21haW4pIDwgdG1wLXMrNDA2NCkKKyAgICAgICAgc3ByaW50ZihzLCAiO0RvbWFpbj1cIiVzXCIiLCBzb2FwLT5jb29raWVfZG9tYWluKTsKKyAgICAgIHN0cmNhdChzLCAiO1BhdGg9XCIvIik7CisgICAgICBpZiAocC0+cGF0aCkKKyAgICAgICAgdCA9IHAtPnBhdGg7CisgICAgICBlbHNlCisgICAgICAgIHQgPSBzb2FwLT5jb29raWVfcGF0aDsKKyAgICAgIGlmICh0KQorICAgICAgeyBpZiAoKnQgPT0gJy8nKQorICAgICAgICAgIHQrKzsKKyAgICAgICAgaWYgKChpbnQpc3RybGVuKHQpIDwgdG1wLXMrNDA2NCkKKyAgICAgICAgICBzdHJjYXQocywgdCk7CisgICAgICB9CisgICAgICBzICs9IHN0cmxlbihzKTsKKyAgICAgICpzKysgPSAnIic7CisgICAgICBpZiAocC0+dmVyc2lvbiA+IDApCisgICAgICAgIHNwcmludGYocywgIjtWZXJzaW9uPSV1IiwgcC0+dmVyc2lvbik7CisgICAgICBpZiAocC0+ZXhwaXJlID49IDApCisgICAgICAgIHNwcmludGYocywgIjtNYXgtQWdlPSVsZCIsIHAtPmV4cGlyZSk7CisgICAgICBpZiAocC0+c2VjdXJlKQorICAgICAgICBzdHJjYXQocywgIjtTZWN1cmUiKTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2V0LUNvb2tpZTogJXNcbiIsIHRtcCkpOworICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJTZXQtQ29va2llIiwgdG1wKSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0Y29va2llcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoLCBpbnQgc2VjdXJlKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKipwLCAqcTsKKyAgdW5zaWduZWQgaW50IHZlcnNpb24gPSAwOworICB0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKKyAgY2hhciAqcywgdG1wWzQwOTZdOworICBwID0gJnNvYXAtPmNvb2tpZXM7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2VuZGluZyBjb29raWVzIGZvciBkb21haW49JXMgcGF0aD0lc1xuIiwgZG9tYWluLCBwYXRoKSk7CisgIGlmICgqcGF0aCA9PSAnLycpCisgICAgcGF0aCsrOworICB3aGlsZSAoKHEgPSAqcCkpCisgIHsgaWYgKHEtPmV4cGlyZSAmJiBub3cgPiBxLT5leHBpcmUpCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvb2tpZSAlcyBleHBpcmVkXG4iLCBxLT5uYW1lKSk7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgcS0+bmFtZSk7CisgICAgICBpZiAocS0+dmFsdWUpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBxLT52YWx1ZSk7CisgICAgICBpZiAocS0+ZG9tYWluKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcS0+ZG9tYWluKTsKKyAgICAgIGlmIChxLT5wYXRoKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcS0+cGF0aCk7CisgICAgICAqcCA9IHEtPm5leHQ7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgcSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IHNpemVfdCBkb21sZW4gPSAwOworICAgICAgaWYgKHEtPmRvbWFpbikKKyAgICAgIHsgY29uc3QgY2hhciAqcyA9IHN0cmNocihxLT5kb21haW4sICc6Jyk7CisgICAgICAgIGlmIChzKQorCSAgZG9tbGVuID0gcyAtIHEtPmRvbWFpbjsKKwllbHNlCisgICAgICAgICAgZG9tbGVuID0gc3RybGVuKHEtPmRvbWFpbik7CisgICAgICB9CisgICAgICBpZiAoKCFxLT5kb21haW4gfHwgIXN0cm5jbXAocS0+ZG9tYWluLCBkb21haW4sIGRvbWxlbikpCisgICAgICAgICAgJiYgKCFxLT5wYXRoIHx8ICFzdHJuY21wKHEtPnBhdGgsIHBhdGgsIHN0cmxlbihxLT5wYXRoKSkpCisgICAgICAgICAgJiYgKCFxLT5zZWN1cmUgfHwgc2VjdXJlKSkKKyAgICAgIHsgcyA9IHRtcDsKKyAgICAgICAgaWYgKHEtPnZlcnNpb24gIT0gdmVyc2lvbikKKyAgICAgICAgeyBzcHJpbnRmKHMsICIkVmVyc2lvbj0ldTsiLCBxLT52ZXJzaW9uKTsKKyAgICAgICAgICB2ZXJzaW9uID0gcS0+dmVyc2lvbjsKKyAgICAgICAgfQorICAgICAgICBpZiAocS0+bmFtZSkKKyAgICAgICAgICBzICs9IHNvYXBfZW5jb2RlX2Nvb2tpZShxLT5uYW1lLCBzLCB0bXAtcys0MDgwKTsKKyAgICAgICAgaWYgKHEtPnZhbHVlICYmICpxLT52YWx1ZSkKKyAgICAgICAgeyAqcysrID0gJz0nOworICAgICAgICAgIHMgKz0gc29hcF9lbmNvZGVfY29va2llKHEtPnZhbHVlLCBzLCB0bXAtcys0MDgwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocS0+cGF0aCAmJiAoaW50KXN0cmxlbihxLT5wYXRoKSA8IHRtcC1zKzQwODApCisgICAgICAgIHsgc3ByaW50ZihzLCAiOyRQYXRoPVwiLyVzXCIiLCAoKnEtPnBhdGggPT0gJy8nID8gcS0+cGF0aCArIDEgOiBxLT5wYXRoKSk7CisgICAgICAgICAgcyArPSBzdHJsZW4ocyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHEtPmRvbWFpbiAmJiAoaW50KXN0cmxlbihxLT5kb21haW4pIDwgdG1wLXMrNDA4MCkKKyAgICAgICAgICBzcHJpbnRmKHMsICI7JERvbWFpbj1cIiVzXCIiLCBxLT5kb21haW4pOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvb2tpZTogJXNcbiIsIHRtcCkpOworICAgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkNvb2tpZSIsIHRtcCkpKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIH0KKyAgICAgIHAgPSAmcS0+bmV4dDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2dldGNvb2tpZXMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnZhbCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwID0gTlVMTCwgKnE7CisgIGNvbnN0IGNoYXIgKnM7CisgIGNoYXIgKnQsIHRtcFs0MDk2XTsgLyogY29va2llIHNpemUgaXMgdXAgdG8gNDA5NiBieXRlcyBbUkZDMjEwOV0gKi8KKyAgY2hhciAqZG9tYWluID0gTlVMTDsKKyAgY2hhciAqcGF0aCA9IE5VTEw7CisgIHVuc2lnbmVkIGludCB2ZXJzaW9uID0gMDsKKyAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CisgIGlmICghdmFsKQorICAgIHJldHVybjsKKyAgcyA9IHZhbDsKKyAgd2hpbGUgKCpzKQorICB7IHMgPSBzb2FwX2RlY29kZV9rZXkodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgaWYgKCFzb2FwX3RhZ19jbXAodG1wLCAiJFZlcnNpb24iKSkKKyAgICB7IGlmICgocyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKSkpCisgICAgICB7IGlmIChwKQorICAgICAgICAgIHAtPnZlcnNpb24gPSAoaW50KWF0b2wodG1wKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHZlcnNpb24gPSAoaW50KWF0b2wodG1wKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcCh0bXAsICIkUGF0aCIpKQorICAgIHsgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgIGlmICgqdG1wKQorICAgICAgeyBpZiAoKHQgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHRtcCkrMSkpKQorICAgICAgICAgIHN0cmNweSh0LCB0bXApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB0ID0gTlVMTDsKKyAgICAgIGlmIChwKQorICAgICAgeyBpZiAocC0+cGF0aCkKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+cGF0aCk7CisgICAgICAgIHAtPnBhdGggPSB0OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBpZiAocGF0aCkKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcGF0aCk7CisgICAgICAgIHBhdGggPSB0OworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHRtcCwgIiREb21haW4iKSkKKyAgICB7IHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICBpZiAoKnRtcCkKKyAgICAgIHsgaWYgKCh0ID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbih0bXApKzEpKSkKKyAgICAgICAgICBzdHJjcHkodCwgdG1wKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgdCA9IE5VTEw7CisgICAgICBpZiAocCkKKyAgICAgIHsgaWYgKHAtPmRvbWFpbikKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+ZG9tYWluKTsKKwlwLT5kb21haW4gPSB0OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBpZiAoZG9tYWluKQorICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCBkb21haW4pOworICAgICAgICBkb21haW4gPSB0OworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChwICYmICFzb2FwX3RhZ19jbXAodG1wLCAiUGF0aCIpKQorICAgIHsgaWYgKHAtPnBhdGgpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5wYXRoKTsKKyAgICAgIHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICBpZiAoKnRtcCkKKyAgICAgIHsgaWYgKChwLT5wYXRoID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbih0bXApKzEpKSkKKyAgICAgICAgICBzdHJjcHkocC0+cGF0aCwgdG1wKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcC0+cGF0aCA9IE5VTEw7CisgICAgfQorICAgIGVsc2UgaWYgKHAgJiYgIXNvYXBfdGFnX2NtcCh0bXAsICJEb21haW4iKSkKKyAgICB7IGlmIChwLT5kb21haW4pCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5kb21haW4pOworICAgICAgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgIGlmICgqdG1wKQorICAgICAgeyBpZiAoKHAtPmRvbWFpbiA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4odG1wKSsxKSkpCisgICAgICAgICAgc3RyY3B5KHAtPmRvbWFpbiwgdG1wKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcC0+ZG9tYWluID0gTlVMTDsKKyAgICB9CisgICAgZWxzZSBpZiAocCAmJiAhc29hcF90YWdfY21wKHRtcCwgIlZlcnNpb24iKSkKKyAgICB7IHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICBwLT52ZXJzaW9uID0gKHVuc2lnbmVkIGludClhdG9sKHRtcCk7CisgICAgfQorICAgIGVsc2UgaWYgKHAgJiYgIXNvYXBfdGFnX2NtcCh0bXAsICJNYXgtQWdlIikpCisgICAgeyBzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgICAgcC0+ZXhwaXJlID0gbm93ICsgYXRvbCh0bXApOworICAgIH0KKyAgICBlbHNlIGlmIChwICYmICFzb2FwX3RhZ19jbXAodG1wLCAiRXhwaXJlcyIpKQorICAgIHsgc3RydWN0IHRtIFQ7CisgICAgICBjaGFyIGFbM107IAorICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbW5zW10gPSAiYW5lYmFycHJheXVudWx1Z2VwY3RvdmVjIjsKKyAgICAgIHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICBpZiAoc3RybGVuKHRtcCkgPiAyMCkKKyAgICAgIHsgbWVtc2V0KCh2b2lkKikmVCwgMCwgc2l6ZW9mKFQpKTsKKyAgICAgICAgYVswXSA9IHRtcFs0XTsKKyAgICAgICAgYVsxXSA9IHRtcFs1XTsKKyAgICAgICAgYVsyXSA9ICdcMCc7CisgICAgICAgIFQudG1fbWRheSA9IChpbnQpYXRvbChhKTsKKyAgICAgICAgYVswXSA9IHRtcFs4XTsKKyAgICAgICAgYVsxXSA9IHRtcFs5XTsKKyAgICAgICAgVC50bV9tb24gPSAoc3Ryc3RyKG1ucywgYSkgLSBtbnMpIC8gMjsKKyAgICAgICAgYVswXSA9IHRtcFsxMV07CisgICAgICAgIGFbMV0gPSB0bXBbMTJdOworICAgICAgICBULnRtX3llYXIgPSAxMDAgKyAoaW50KWF0b2woYSk7CisgICAgICAgIGFbMF0gPSB0bXBbMTNdOworICAgICAgICBhWzFdID0gdG1wWzE0XTsKKyAgICAgICAgVC50bV9ob3VyID0gKGludClhdG9sKGEpOworICAgICAgICBhWzBdID0gdG1wWzE2XTsKKyAgICAgICAgYVsxXSA9IHRtcFsxN107CisgICAgICAgIFQudG1fbWluID0gKGludClhdG9sKGEpOworICAgICAgICBhWzBdID0gdG1wWzE5XTsKKyAgICAgICAgYVsxXSA9IHRtcFsyMF07CisgICAgICAgIFQudG1fc2VjID0gKGludClhdG9sKGEpOworICAgICAgICBwLT5leHBpcmUgPSBzb2FwX3RpbWVnbSgmVCk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHAgJiYgIXNvYXBfdGFnX2NtcCh0bXAsICJTZWN1cmUiKSkKKyAgICAgIHAtPnNlY3VyZSA9IDE7CisgICAgZWxzZQorICAgIHsgaWYgKHApCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR290IGVudmlyb25tZW50IGNvb2tpZSAlcz0lcyBkb21haW49JXMgcGF0aD0lcyBleHBpcmU9JWxkIHNlY3VyZT0lZFxuIiwgcC0+bmFtZSwgcC0+dmFsdWU/cC0+dmFsdWU6IiIsIHAtPmRvbWFpbj9wLT5kb21haW46IiIsIHAtPnBhdGg/cC0+cGF0aDoiIiwgcC0+ZXhwaXJlLCBwLT5zZWN1cmUpKTsKKyAgICAgICAgaWYgKChxID0gc29hcF9zZXRfY29va2llKHNvYXAsIHAtPm5hbWUsIHAtPnZhbHVlLCBwLT5kb21haW4sIHAtPnBhdGgpKSkKKyAgICAgICAgeyBxLT52ZXJzaW9uID0gcC0+dmVyc2lvbjsKKyAgICAgICAgICBxLT5leHBpcmUgPSBwLT5leHBpcmU7CisgICAgICAgICAgcS0+c2VjdXJlID0gcC0+c2VjdXJlOworICAgICAgICAgIHEtPmVudiA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHAtPm5hbWUpCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPm5hbWUpOworICAgICAgICBpZiAocC0+dmFsdWUpCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnZhbHVlKTsKKyAgICAgICAgaWYgKHAtPmRvbWFpbikKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+ZG9tYWluKTsKKyAgICAgICAgaWYgKHAtPnBhdGgpCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnBhdGgpOworICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcCk7CisgICAgICB9CisgICAgICBpZiAoKHAgPSAoc3RydWN0IHNvYXBfY29va2llKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfY29va2llKSkpKQorICAgICAgeyBwLT5uYW1lID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbih0bXApKzEpOworICAgICAgICBzdHJjcHkocC0+bmFtZSwgdG1wKTsKKyAgICAgICAgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgICAgaWYgKCp0bXApCisgICAgICAgIHsgcC0+dmFsdWUgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHRtcCkrMSk7CisgICAgICAgICAgc3RyY3B5KHAtPnZhbHVlLCB0bXApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwLT52YWx1ZSA9IE5VTEw7CisgICAgICAgIHAtPmRvbWFpbiA9IGRvbWFpbjsKKyAgICAgICAgcC0+cGF0aCA9IHBhdGg7CisgICAgICAgIHAtPmV4cGlyZSA9IDA7CisgICAgICAgIHAtPnNlY3VyZSA9IDA7CisgICAgICAgIHAtPnZlcnNpb24gPSB2ZXJzaW9uOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAocCkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdvdCBlbnZpcm9ubWVudCBjb29raWUgJXM9JXMgZG9tYWluPSVzIHBhdGg9JXMgZXhwaXJlPSVsZCBzZWN1cmU9JWRcbiIsIHAtPm5hbWUsIHAtPnZhbHVlP3AtPnZhbHVlOiIiLCBwLT5kb21haW4/cC0+ZG9tYWluOiIiLCBwLT5wYXRoP3AtPnBhdGg6IiIsIHAtPmV4cGlyZSwgcC0+c2VjdXJlKSk7CisgICAgaWYgKChxID0gc29hcF9zZXRfY29va2llKHNvYXAsIHAtPm5hbWUsIHAtPnZhbHVlLCBwLT5kb21haW4sIHAtPnBhdGgpKSkKKyAgICB7IHEtPnZlcnNpb24gPSBwLT52ZXJzaW9uOworICAgICAgcS0+ZXhwaXJlID0gcC0+ZXhwaXJlOworICAgICAgcS0+c2VjdXJlID0gcC0+c2VjdXJlOworICAgICAgcS0+ZW52ID0gMTsKKyAgICB9CisgICAgaWYgKHAtPm5hbWUpCisgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+bmFtZSk7CisgICAgaWYgKHAtPnZhbHVlKQorICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnZhbHVlKTsKKyAgICBpZiAocC0+ZG9tYWluKQorICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPmRvbWFpbik7CisgICAgaWYgKHAtPnBhdGgpCisgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+cGF0aCk7CisgICAgU09BUF9GUkVFKHNvYXAsIHApOworICB9CisgIGlmIChkb21haW4pCisgICAgU09BUF9GUkVFKHNvYXAsIGRvbWFpbik7CisgIGlmIChwYXRoKQorICAgIFNPQVBfRlJFRShzb2FwLCBwYXRoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRlbnZfY29va2llcyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBjb25zdCBjaGFyICpzOworICBjaGFyIGtleVs0MDk2XSwgdmFsWzQwOTZdOyAvKiBjb29raWUgc2l6ZSBpcyB1cCB0byA0MDk2IGJ5dGVzIFtSRkMyMTA5XSAqLworICBpZiAoIShzID0gZ2V0ZW52KCJIVFRQX0NPT0tJRSIpKSkKKyAgICByZXR1cm4gU09BUF9FUlI7CisgIGRvCisgIHsgcyA9IHNvYXBfZGVjb2RlX2tleShrZXksIHNpemVvZihrZXkpLCBzKTsKKyAgICBzID0gc29hcF9kZWNvZGVfdmFsKHZhbCwgc2l6ZW9mKHZhbCksIHMpOworICAgIHAgPSBzb2FwX3NldF9jb29raWUoc29hcCwga2V5LCB2YWwsIE5VTEwsIE5VTEwpOworICAgIGlmIChwKQorICAgICAgcC0+ZW52ID0gMTsKKyAgfSB3aGlsZSAoKnMpOworICByZXR1cm4gU09BUF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwX2Nvb2tpZSoKK1NPQVBfRk1BQzIKK3NvYXBfY29weV9jb29raWVzKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnAsICoqcSwgKnI7CisgIHEgPSAmcjsKKyAgZm9yIChwID0gc29hcC0+Y29va2llczsgcDsgcCA9IHAtPm5leHQpCisgIHsgaWYgKCEoKnEgPSAoc3RydWN0IHNvYXBfY29va2llKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfY29va2llKSkpKQorICAgICAgcmV0dXJuIHI7CisgICAgKipxID0gKnA7CisgICAgaWYgKHAtPm5hbWUpCisgICAgeyBpZiAoKCgqcSktPm5hbWUgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHAtPm5hbWUpKzEpKSkKKyAgICAgICAgc3RyY3B5KCgqcSktPm5hbWUsIHAtPm5hbWUpOworICAgIH0KKyAgICBpZiAocC0+dmFsdWUpCisgICAgeyBpZiAoKCgqcSktPnZhbHVlID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihwLT52YWx1ZSkrMSkpKQorICAgICAgICBzdHJjcHkoKCpxKS0+dmFsdWUsIHAtPnZhbHVlKTsKKyAgICB9CisgICAgaWYgKHAtPmRvbWFpbikKKyAgICB7IGlmICgoKCpxKS0+ZG9tYWluID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihwLT5kb21haW4pKzEpKSkKKyAgICAgICAgc3RyY3B5KCgqcSktPmRvbWFpbiwgcC0+ZG9tYWluKTsKKyAgICB9CisgICAgaWYgKHAtPnBhdGgpCisgICAgeyBpZiAoKCgqcSktPnBhdGggPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHAtPnBhdGgpKzEpKSkKKyAgICAgICAgc3RyY3B5KCgqcSktPnBhdGgsIHAtPnBhdGgpOworICAgIH0KKyAgICBxID0gJigqcSktPm5leHQ7CisgIH0KKyAgKnEgPSBOVUxMOworICByZXR1cm4gcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZnJlZV9jb29raWVzKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGZvciAocCA9IHNvYXAtPmNvb2tpZXM7IHA7IHAgPSBzb2FwLT5jb29raWVzKQorICB7IHNvYXAtPmNvb2tpZXMgPSBwLT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBwLT5uYW1lKTsKKyAgICBpZiAocC0+dmFsdWUpCisgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+dmFsdWUpOworICAgIGlmIChwLT5kb21haW4pCisgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+ZG9tYWluKTsKKyAgICBpZiAocC0+cGF0aCkKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5wYXRoKTsKKyAgICBTT0FQX0ZSRUUoc29hcCwgcCk7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNlbmRpZiAvKiBXSVRIX0NPT0tJRVMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBXSVRIX0daSVAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzb2FwX2dldGd6aXBoZHIoc3RydWN0IHNvYXAgKnNvYXApCit7IGludCBpOworICBzb2FwX3djaGFyIGMsIGYgPSAwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdldCBnemlwIGhlYWRlclxuIikpOworICBmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKQorICB7IGlmICgoaW50KShjID0gc29hcF9nZXQxKHNvYXApID09IEVPRikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICBpZiAoaSA9PSAyKQorICAgICAgZiA9IGM7CisgIH0KKyAgaWYgKGYgJiAweDA0KSAvKiBGRVhUUkEgKi8KKyAgeyBmb3IgKGkgPSBzb2FwX2dldDEoc29hcCkgfCAoc29hcF9nZXQxKHNvYXApIDw8IDgpOyBpOyBpLS0pCisgICAgICBpZiAoKGludClzb2FwX2dldDEoc29hcCkgPT0gRU9GKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgfQorICBpZiAoZiAmIDB4MDgpIC8qIEZOQU1FICovCisgICAgZG8KKyAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgd2hpbGUgKGMgJiYgKGludCljICE9IEVPRik7CisgIGlmICgoaW50KWMgIT0gRU9GICYmIChmICYgMHgxMCkpIC8qIEZDT01NRU5UICovCisgICAgZG8KKyAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgd2hpbGUgKGMgJiYgKGludClmICE9IEVPRik7CisgIGlmICgoaW50KWMgIT0gRU9GICYmIChmICYgMHgwMSkpIC8qIEZIQ1JDICovCisgIHsgaWYgKChpbnQpKGMgPSBzb2FwX2dldDEoc29hcCkpICE9IEVPRikKKyAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgIH0KKyAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYmVnaW5fcmVjdihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcF93Y2hhciBjOworICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIHNvYXBfZnJlZShzb2FwKTsKKyAgc29hcF9zZXRfbG9jYWxfbmFtZXNwYWNlcyhzb2FwKTsKKyAgc29hcC0+dmVyc2lvbiA9IDA7CS8qIGRvbid0IGFzc3VtZSB3ZSdyZSBwYXJzaW5nIFNPQVAgY29udGVudCBieSBkZWZhdWx0ICovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICBzb2FwX2ZyZWVfaWh0KHNvYXApOworI2VuZGlmCisgIGlmICgoc29hcC0+aW1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKQorICAgIHNvYXAtPm9tb2RlIHw9IFNPQVBfSU9fQ0hVTks7CisgIHNvYXAtPmltb2RlICY9IH5TT0FQX0lPOworICBzb2FwLT5tb2RlID0gc29hcC0+aW1vZGU7CisgIGlmICghc29hcC0+a2VlcF9hbGl2ZSkKKyAgeyBzb2FwLT5idWZsZW4gPSAwOworICAgIHNvYXAtPmJ1ZmlkeCA9IDA7CisgIH0KKyAgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfSU9fS0VFUEFMSVZFKSkKKyAgICBzb2FwLT5rZWVwX2FsaXZlID0gMDsKKyAgc29hcC0+YWhlYWQgPSAwOworICBzb2FwLT5wZWVrZWQgPSAwOworICBzb2FwLT5sZXZlbCA9IDA7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0JFR0lOOworICBzb2FwLT5hbGxvY2VkID0gMDsKKyAgc29hcC0+Y291bnQgPSAwOworICBzb2FwLT5sZW5ndGggPSAwOworICBzb2FwLT5jZGF0YSA9IDA7CisgICpzb2FwLT5lbmRwb2ludCA9ICdcMCc7CisgIHNvYXAtPmFjdGlvbiA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXAtPmRvbSA9IE5VTEw7CisgIHNvYXAtPmRpbWUuY2h1bmtzaXplID0gMDsKKyAgc29hcC0+ZGltZS5idWZsZW4gPSAwOworICBzb2FwLT5kaW1lLmxpc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5sYXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5saXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuYm91bmRhcnkgPSBOVUxMOworICBzb2FwLT5taW1lLnN0YXJ0ID0gTlVMTDsKKyAgc29hcC0+eGxpc3QgPSBOVUxMOworI2VuZGlmCisjaWZkZWYgV0lOMzIKKyNpZm5kZWYgVU5ERVJfQ0UKKyNpZm5kZWYgV0lUSF9GQVNUQ0dJCisgIGlmICghc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyNpZmRlZiBfX0JPUkxBTkRDX18KKyAgICBzZXRtb2RlKChTT0FQX1NPQ0tFVClzb2FwLT5yZWN2ZmQsIE9fQklOQVJZKTsKKyNlbHNlCisgICAgX3NldG1vZGUoKFNPQVBfU09DS0VUKXNvYXAtPnJlY3ZmZCwgX09fQklOQVJZKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIFdJVEhfWkxJQgorICBzb2FwLT5tb2RlICY9IH5TT0FQX0VOQ19aTElCOworICBzb2FwLT56bGliX2luID0gU09BUF9aTElCX05PTkU7CisgIHNvYXAtPnpsaWJfb3V0ID0gU09BUF9aTElCX05PTkU7CisgIHNvYXAtPmRfc3RyZWFtLm5leHRfaW4gPSBaX05VTEw7CisgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luID0gMDsKKyAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZSopc29hcC0+YnVmOworICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgPSBTT0FQX0JVRkxFTjsKKyAgc29hcC0+el9yYXRpb19pbiA9IDEuMDsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+ZnByZXBhcmVpbml0KQorICAgIHNvYXAtPmZwcmVwYXJlaW5pdChzb2FwKTsKKyNlbmRpZgorICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworI2lmZGVmIFdJVEhfR1pJUAorICBpZiAoYyA9PSAweDFGKQorICB7IGlmIChzb2FwX2dldGd6aXBoZHIoc29hcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKGluZmxhdGVJbml0Migmc29hcC0+ZF9zdHJlYW0sIC1NQVhfV0JJVFMpICE9IFpfT0spCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9JTkZMQVRFOworICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfWkxJQjsKKyAgICBzb2FwLT56bGliX2luID0gU09BUF9aTElCX0daSVA7CisgICAgc29hcC0+el9jcmMgPSBjcmMzMigwTCwgTlVMTCwgMCk7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJnemlwIGluaXRpYWxpemVkXG4iKSk7CisgICAgbWVtY3B5KHNvYXAtPnpfYnVmLCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOKTsKKyAgICAvKiBzaG91bGQgbm90IGNodW5rIG92ZXIgcGxhaW4gdHJhbnNwb3J0LCBzbyB3aHkgYm90aGVyIHRvIGNoZWNrPyAqLworICAgIC8qIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspICovCisgICAgLyogICBzb2FwLT56X2J1ZmxlbiA9IHNvYXAtPmJ1ZmlkeDsgKi8KKyAgICAvKiBlbHNlICovCisgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9pbiA9IChCeXRlKikoc29hcC0+el9idWYgKyBzb2FwLT5idWZpZHgpOworICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luID0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgIHNvYXAtPnpfYnVmbGVuID0gc29hcC0+YnVmbGVuOworICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmJ1ZmlkeDsKKyAgICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICB9ICAKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoYyA9PSAnLScgJiYgc29hcF9nZXQwKHNvYXApID09ICctJykKKyAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX01JTUU7CisgIGVsc2UgaWYgKChjICYgMHhGRkZDKSA9PSAoU09BUF9ESU1FX1ZFUlNJT04gfCBTT0FQX0RJTUVfTUIpICYmIChzb2FwX2dldDAoc29hcCkgJiAweEZGRjApID09IDB4MjApCisgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19ESU1FOworICBlbHNlCisjZW5kaWYKKyAgeyB3aGlsZSAoc29hcF9ibGFuayhjKSkKKyAgICAgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgIH0KKyAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisjaWZuZGVmIFdJVEhfTk9IVFRQCisgIC8qIGlmIG5vdCBYTUwgb3IgKHN0YXJ0IG9mKUJPTSBvciBNSU1FL0RJTUUvWkxJQiwgYXNzdW1lIEhUVFAgaGVhZGVyICovCisgIGlmIChjICE9ICc8JyAmJiBjICE9IDB4RUYgJiYgIShzb2FwLT5tb2RlICYgKFNPQVBfRU5DX01JTUUgfCBTT0FQX0VOQ19ESU1FIHwgU09BUF9FTkNfWkxJQikpKQorICB7IHNvYXAtPm1vZGUgJj0gflNPQVBfSU87CisgICAgc29hcC0+ZXJyb3IgPSBzb2FwLT5mcGFyc2Uoc29hcCk7CisgICAgaWYgKHNvYXAtPmVycm9yICYmIHNvYXAtPmVycm9yIDwgU09BUF9TVE9QKQorICAgIHsgc29hcC0+a2VlcF9hbGl2ZSA9IDA7IC8qIGZvcmNlIGNsb3NlIGxhdGVyICovCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgICAgeyBzb2FwLT5jaHVua2J1ZmxlbiA9IHNvYXAtPmJ1ZmxlbjsKKyAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmJ1ZmlkeDsKKyAgICAgIHNvYXAtPmNodW5rc2l6ZSA9IDA7CisgICAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICAgIGVsc2UgaWYgKHNvYXAtPmZwcmVwYXJlcmVjdiAmJiBzb2FwLT5idWZsZW4gIT0gc29hcC0+YnVmaWR4KQorICAgICAgc29hcC0+ZnByZXBhcmVyZWN2KHNvYXAsIHNvYXAtPmJ1ZiArIHNvYXAtPmJ1ZmlkeCwgc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4KTsKKyNlbmRpZgorI2lmZGVmIFdJVEhfWkxJQgorICAgIGlmIChzb2FwLT56bGliX2luICE9IFNPQVBfWkxJQl9OT05FKQorICAgIHsgLyogZnBhcnNlIHNob3VsZCBub3QgdXNlIHNvYXBfdW5nZXQgdG8gcHVzaCBiYWNrIGxhc3QgY2hhciAqLworI2lmZGVmIFdJVEhfR1pJUAorICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgIGlmIChjID09IDB4MUYpCisgICAgICB7IGlmIChzb2FwX2dldGd6aXBoZHIoc29hcCkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBpZiAoaW5mbGF0ZUluaXQyKCZzb2FwLT5kX3N0cmVhbSwgLU1BWF9XQklUUykgIT0gWl9PSykKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgICAgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfSU5GTEFURTsKKyAgICAgICAgc29hcC0+el9jcmMgPSBjcmMzMigwTCwgTlVMTCwgMCk7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZ3ppcCBpbml0aWFsaXplZFxuIikpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBzb2FwX3JldmdldDEoc29hcCk7CisjZWxzZQorICAgICAgeworI2VuZGlmCisgICAgICAgIGlmIChpbmZsYXRlSW5pdCgmc29hcC0+ZF9zdHJlYW0pICE9IFpfT0spCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgICBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX0lORkxBVEU7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5mbGF0ZSBpbml0aWFsaXplZFxuIikpOworICAgICAgfQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19aTElCOworICAgICAgbWVtY3B5KHNvYXAtPnpfYnVmLCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOKTsKKyAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfaW4gPSAoQnl0ZSopKHNvYXAtPnpfYnVmICsgc29hcC0+YnVmaWR4KTsKKyAgICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luID0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgICAgc29hcC0+el9idWZsZW4gPSBzb2FwLT5idWZsZW47CisgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5idWZpZHg7CisgICAgfQorI2VuZGlmCisgICAgaWYgKHNvYXAtPmVycm9yKQorICAgIHsgaWYgKHNvYXAtPmVycm9yID09IFNPQVBfRk9STSAmJiBzb2FwLT5mZm9ybSkKKyAgICAgIHsgc29hcC0+ZXJyb3IgPSBzb2FwLT5mZm9ybShzb2FwKTsKKyAgICAgICAgaWYgKHNvYXAtPmVycm9yID09IFNPQVBfT0spCisgICAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1NUT1A7IC8qIHByZXZlbnRzIGZ1cnRoZXIgcHJvY2Vzc2luZyAqLworICAgICAgfQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgfQorI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkKKyAgeyBpZiAoc29hcF9nZXRtaW1laGRyKHNvYXApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmIChzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHNvYXAtPm1pbWUuZmlyc3QtPnR5cGUsICJhcHBsaWNhdGlvbi9kaW1lIikpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX0RJTUU7CisgIH0KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKQorICB7IGlmIChzb2FwX2dldGRpbWVoZHIoc29hcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHNvYXAtPmRpbWUuZmxhZ3MgJiBTT0FQX0RJTUVfQ0YpCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNodW5rZWQgRElNRSBTT0FQIG1lc3NhZ2VcbiIpKTsKKyAgICAgIHNvYXAtPmRpbWUuY2h1bmtzaXplID0gc29hcC0+ZGltZS5zaXplOworICAgICAgaWYgKHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeCA+PSBzb2FwLT5kaW1lLmNodW5rc2l6ZSkKKyAgICAgIHsgc29hcC0+ZGltZS5idWZsZW4gPSBzb2FwLT5idWZsZW47CisgICAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmJ1ZmlkeCArIHNvYXAtPmRpbWUuY2h1bmtzaXplOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBzb2FwLT5kaW1lLmNodW5rc2l6ZSAtPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgfQorICAgIHNvYXAtPmNvdW50ID0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICB9CisjZW5kaWYKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50CitodHRwX3BhcnNlKHN0cnVjdCBzb2FwICpzb2FwKQoreyBjaGFyIGhlYWRlcltTT0FQX0hEUkxFTl0sICpzOworICB1bnNpZ25lZCBzaG9ydCBnZXQgPSAwLCBzdGF0dXMgPSAwLCBrID0gMDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJXYWl0aW5nIGZvciBIVFRQIHJlcXVlc3QvcmVzcG9uc2UuLi5cbiIpKTsKKyAgKnNvYXAtPmVuZHBvaW50ID0gJ1wwJzsKKyAgc29hcC0+bGVuZ3RoID0gMDsKKyAgc29hcC0+dXNlcmlkID0gTlVMTDsKKyAgc29hcC0+cGFzc3dkID0gTlVMTDsKKyAgc29hcC0+YWN0aW9uID0gTlVMTDsKKyAgc29hcC0+YXV0aHJlYWxtID0gTlVMTDsKKyAgZG8KKyAgeyBpZiAoc29hcF9nZXRsaW5lKHNvYXAsIHNvYXAtPm1zZ2J1Ziwgc2l6ZW9mKHNvYXAtPm1zZ2J1ZikpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJIVFRQIHN0YXR1czogJXNcbiIsIHNvYXAtPm1zZ2J1ZikpOworICAgIGZvciAoOzspCisgICAgeyBpZiAoc29hcF9nZXRsaW5lKHNvYXAsIGhlYWRlciwgU09BUF9IRFJMRU4pKQorICAgICAgeyBpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9FT0YpCisJeyBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgICAgICAgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVPRiBpbiBIVFRQIGhlYWRlciwgY29udGludWUgYW55d2F5XG4iKSk7CisJICBicmVhazsKKwl9CisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIH0KKyAgICAgIGlmICghKmhlYWRlcikKKyAgICAgICAgYnJlYWs7CisgICAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiSFRUUCBoZWFkZXI6ICVzXG4iLCBoZWFkZXIpKTsKKyAgICAgIHMgPSBzdHJjaHIoaGVhZGVyLCAnOicpOworICAgICAgaWYgKHMpCisgICAgICB7ICpzID0gJ1wwJzsKKyAgICAgICAgZG8gcysrOworICAgICAgICB3aGlsZSAoKnMgJiYgKnMgPD0gMzIpOworICAgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBhcnNlaGRyKHNvYXAsIGhlYWRlciwgcykpKQorICAgICAgICB7IGlmIChzb2FwLT5lcnJvciA8IFNPQVBfU1RPUCkKKwkgICAgcmV0dXJuIHNvYXAtPmVycm9yOworCSAgc3RhdHVzID0gc29hcC0+ZXJyb3I7CisJICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKChzID0gc3RyY2hyKHNvYXAtPm1zZ2J1ZiwgJyAnKSkpCisgICAgeyBrID0gKHVuc2lnbmVkIHNob3J0KXNvYXBfc3RydG91bChzLCAmcywgMTApOworICAgICAgaWYgKCFzb2FwX2JsYW5rKCpzKSkKKyAgICAgICAgayA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGsgPSAwOworICB9IHdoaWxlIChrID09IDEwMCk7CisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJGaW5pc2hlZCBIVFRQIGhlYWRlciBwYXJzaW5nXG4iKSk7CisgIHMgPSBzdHJzdHIoc29hcC0+bXNnYnVmLCAiSFRUUC8iKTsKKyAgaWYgKHMgJiYgc1s3XSAhPSAnMScpCisgIHsgaWYgKHNvYXAtPmtlZXBfYWxpdmUgPT0gMSkKKyAgICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOworICAgIGlmIChrID09IDAgJiYgKHNvYXAtPm9tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykgLyogayA9PSAwIGZvciBIVFRQIHJlcXVlc3QgKi8KKyAgICB7IHNvYXAtPmltb2RlIHw9IFNPQVBfSU9fQ0hVTks7CisgICAgICBzb2FwLT5vbW9kZSA9IChzb2FwLT5vbW9kZSAmIH5TT0FQX0lPKSB8IFNPQVBfSU9fU1RPUkU7CisgICAgfQorICB9CisgIGlmIChzb2FwLT5rZWVwX2FsaXZlIDwgMCkKKyAgICBzb2FwLT5rZWVwX2FsaXZlID0gMTsKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIktlZXAgYWxpdmUgY29ubmVjdGlvbiA9ICVkXG4iLCBzb2FwLT5rZWVwX2FsaXZlKSk7CisgIGlmIChzICYmICgoKGdldCA9ICFzdHJuY21wKHNvYXAtPm1zZ2J1ZiwgIkdFVCAiLCA0KSkpIHx8ICFzdHJuY21wKHNvYXAtPm1zZ2J1ZiwgIlBPU1QgIiwgNSkpKQorICB7IHNpemVfdCBtID0gc3RybGVuKHNvYXAtPmVuZHBvaW50KTsKKyAgICBzaXplX3QgbiA9IG0gKyAocyAtIHNvYXAtPm1zZ2J1ZikgLSA1IC0gKCFnZXQpOworICAgIGlmIChuID49IHNpemVvZihzb2FwLT5lbmRwb2ludCkpCisgICAgICBuID0gc2l6ZW9mKHNvYXAtPmVuZHBvaW50KSAtIDE7CisgICAgc3RybmNweShzb2FwLT5wYXRoLCBzb2FwLT5tc2didWYgKyA0ICsgKCFnZXQpLCBuIC0gbSk7CisgICAgc29hcC0+cGF0aFtuIC0gbV0gPSAnXDAnOworICAgIHN0cmNhdChzb2FwLT5lbmRwb2ludCwgc29hcC0+cGF0aCk7CisgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlRhcmdldCBlbmRwb2ludD0nJXMnXG4iLCBzb2FwLT5lbmRwb2ludCkpOworICAgIGlmIChnZXQpCisgICAgeyBzb2FwLT5lcnJvciA9IHNvYXAtPmZnZXQoc29hcCk7CisgICAgICBpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9PSykKKyAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1NUT1A7IC8qIHByZXZlbnRzIGZ1cnRoZXIgcHJvY2Vzc2luZyAqLworICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBpZiAoc3RhdHVzKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gc3RhdHVzOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIGlmIChrID09IDAgfHwgKGsgPj0gMjAwICYmIGsgPD0gMjk5KSB8fCBrID09IDQwMCB8fCBrID09IDUwMCkKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkhUVFAgZXJyb3IgJWRcbiIsIGspKTsKKyAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJIVFRQIGVycm9yIiwgc29hcC0+bXNnYnVmLCBrKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAoraHR0cF9wYXJzZV9oZWFkZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsKQoreyBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJIb3N0IikpCisgIHsgCisjaWZkZWYgV0lUSF9PUEVOU1NMCisgICAgaWYgKHNvYXAtPmltb2RlICYgU09BUF9FTkNfU1NMKQorICAgICAgc3RyY3B5KHNvYXAtPmVuZHBvaW50LCAiaHR0cHM6Ly8iKTsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgIHN0cmNweShzb2FwLT5lbmRwb2ludCwgImh0dHA6Ly8iKTsKKyAgICBzdHJuY2F0KHNvYXAtPmVuZHBvaW50LCB2YWwsIHNpemVvZihzb2FwLT5lbmRwb2ludCkgLSA4KTsKKyAgICBzb2FwLT5lbmRwb2ludFtzaXplb2Yoc29hcC0+ZW5kcG9pbnQpIC0gMV0gPSAnXDAnOworICB9CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1UeXBlIikpCisgIHsgaWYgKHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAiYXBwbGljYXRpb24vZGltZSIpKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19ESU1FOworICAgIGVsc2UgaWYgKHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAibXVsdGlwYXJ0L3JlbGF0ZWQiKQorICAgICAgICAgIHx8IHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAibXVsdGlwYXJ0L2Zvcm0tZGF0YSIpKQorICAgIHsgc29hcC0+bWltZS5ib3VuZGFyeSA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAiYm91bmRhcnkiKSk7CisgICAgICBzb2FwLT5taW1lLnN0YXJ0ID0gc29hcF9zdHJkdXAoc29hcCwgc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwsICJzdGFydCIpKTsKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfTUlNRTsKKyAgICB9CisgIH0KKyNlbmRpZgorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtTGVuZ3RoIikpCisgICAgc29hcC0+bGVuZ3RoID0gc29hcF9zdHJ0b3VsKHZhbCwgTlVMTCwgMTApOworICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtRW5jb2RpbmciKSkKKyAgeyBpZiAoIXNvYXBfdGFnX2NtcCh2YWwsICJkZWZsYXRlIikpCisjaWZkZWYgV0lUSF9aTElCCisgICAgICBzb2FwLT56bGliX2luID0gU09BUF9aTElCX0RFRkxBVEU7CisjZWxzZQorICAgICAgcmV0dXJuIFNPQVBfWkxJQl9FUlJPUjsKKyNlbmRpZgorICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAodmFsLCAiZ3ppcCIpKQorI2lmZGVmIFdJVEhfR1pJUAorICAgICAgc29hcC0+emxpYl9pbiA9IFNPQVBfWkxJQl9HWklQOworI2Vsc2UKKyAgICAgIHJldHVybiBTT0FQX1pMSUJfRVJST1I7CisjZW5kaWYKKyAgfQorI2lmZGVmIFdJVEhfWkxJQgorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkFjY2VwdC1FbmNvZGluZyIpKQorICB7CisjaWZkZWYgV0lUSF9HWklQCisgICAgaWYgKHN0cmNocih2YWwsICcqJykgfHwgc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwsICJnemlwIikpCisgICAgICBzb2FwLT56bGliX291dCA9IFNPQVBfWkxJQl9HWklQOworICAgIGVsc2UKKyNlbmRpZgorICAgIGlmIChzdHJjaHIodmFsLCAnKicpIHx8IHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAiZGVmbGF0ZSIpKQorICAgICAgc29hcC0+emxpYl9vdXQgPSBTT0FQX1pMSUJfREVGTEFURTsKKyAgICBlbHNlCisgICAgICBzb2FwLT56bGliX291dCA9IFNPQVBfWkxJQl9OT05FOworICB9CisjZW5kaWYKKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJUcmFuc2Zlci1FbmNvZGluZyIpKQorICB7IHNvYXAtPm1vZGUgJj0gflNPQVBfSU87CisgICAgaWYgKCFzb2FwX3RhZ19jbXAodmFsLCAiY2h1bmtlZCIpKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX0NIVU5LOworICB9CisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29ubmVjdGlvbiIpKQorICB7IGlmICghc29hcF90YWdfY21wKHZhbCwgImtlZXAtYWxpdmUiKSkKKyAgICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAtc29hcC0+a2VlcF9hbGl2ZTsKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHZhbCwgImNsb3NlIikpCisgICAgICBzb2FwLT5rZWVwX2FsaXZlID0gMDsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU4KKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJBdXRob3JpemF0aW9uIikpCisgIHsgaWYgKCFzb2FwX3RhZ19jbXAodmFsLCAiQmFzaWMgKiIpKQorICAgIHsgaW50IG47CisgICAgICBjaGFyICpzOworICAgICAgc29hcF9iYXNlNjQycyhzb2FwLCB2YWwgKyA2LCBzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpIC0gMSwgJm4pOworICAgICAgc29hcC0+dG1wYnVmW25dID0gJ1wwJzsKKyAgICAgIGlmICgocyA9IHN0cmNocihzb2FwLT50bXBidWYsICc6JykpKQorICAgICAgeyAqcyA9ICdcMCc7CisJc29hcC0+dXNlcmlkID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+dG1wYnVmKTsKKwlzb2FwLT5wYXNzd2QgPSBzb2FwX3N0cmR1cChzb2FwLCBzICsgMSk7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiV1dXLUF1dGhlbnRpY2F0ZSIpKQorICAgIHNvYXAtPmF1dGhyZWFsbSA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsICsgNiwgInJlYWxtIikpOworICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkV4cGVjdCIpKQorICB7IGlmICghc29hcF90YWdfY21wKHZhbCwgIjEwMC1jb250aW51ZSIpKQorICAgIHsgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJIVFRQLzEuMSAxMDAgQ29udGludWUiLCBOVUxMKSkKKyAgICAgICB8fCAoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCBOVUxMLCBOVUxMKSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgIH0KKyNlbmRpZgorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIlNPQVBBY3Rpb24iKSkKKyAgeyBpZiAoKnZhbCA9PSAnIicpCisgICAgeyBzb2FwLT5hY3Rpb24gPSBzb2FwX3N0cmR1cChzb2FwLCB2YWwgKyAxKTsKKyAgICAgIHNvYXAtPmFjdGlvbltzdHJsZW4oc29hcC0+YWN0aW9uKSAtIDFdID0gJ1wwJzsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJMb2NhdGlvbiIpKQorICB7IHN0cm5jcHkoc29hcC0+ZW5kcG9pbnQsIHZhbCwgc2l6ZW9mKHNvYXAtPmVuZHBvaW50KSk7CisgICAgc29hcC0+ZW5kcG9pbnRbc2l6ZW9mKHNvYXAtPmVuZHBvaW50KSAtIDFdID0gJ1wwJzsKKyAgfQorI2lmZGVmIFdJVEhfQ09PS0lFUworICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvb2tpZSIpIHx8ICFzb2FwX3RhZ19jbXAoa2V5LCAiU2V0LUNvb2tpZSIpKQorICAgIHNvYXBfZ2V0Y29va2llcyhzb2FwLCB2YWwpOworI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAhZGVmaW5lZChXSVRIX05PSFRUUCkgfHwgIWRlZmluZWQoV0lUSF9MRUFORVIpCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmxpbmUsIGNvbnN0IGNoYXIgKmtleSkKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqcyA9IGxpbmU7CisgIGlmIChzKQorICB7IHdoaWxlICgqcykKKyAgICB7IHJlZ2lzdGVyIHNob3J0IGZsYWc7CisgICAgICBzID0gc29hcF9kZWNvZGVfa2V5KHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksIHMpOworICAgICAgZmxhZyA9IHNvYXBfdGFnX2NtcChzb2FwLT50bXBidWYsIGtleSk7CisgICAgICBzID0gc29hcF9kZWNvZGVfdmFsKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksIHMpOworICAgICAgaWYgKCFmbGFnKQorICAgICAgICByZXR1cm4gc29hcC0+dG1wYnVmOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgIWRlZmluZWQoV0lUSF9OT0hUVFApIHx8ICFkZWZpbmVkKFdJVEhfTEVBTkVSKQorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2RlY29kZV9rZXkoY2hhciAqYnVmLCBzaXplX3QgbGVuLCBjb25zdCBjaGFyICp2YWwpCit7IHJldHVybiBzb2FwX2RlY29kZShidWYsIGxlbiwgdmFsLCAiPSw7Iik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmICFkZWZpbmVkKFdJVEhfTk9IVFRQKSB8fCAhZGVmaW5lZChXSVRIX0xFQU5FUikKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9kZWNvZGVfdmFsKGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwgY29uc3QgY2hhciAqdmFsKQoreyBpZiAoKnZhbCAhPSAnPScpCisgIHsgKmJ1ZiA9ICdcMCc7CisgICAgcmV0dXJuIHZhbDsKKyAgfQorICByZXR1cm4gc29hcF9kZWNvZGUoYnVmLCBsZW4sIHZhbCArIDEsICIsOyIpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAhZGVmaW5lZChXSVRIX05PSFRUUCkgfHwgIWRlZmluZWQoV0lUSF9MRUFORVIpCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNvbnN0IGNoYXIqCitzb2FwX2RlY29kZShjaGFyICpidWYsIHNpemVfdCBsZW4sIGNvbnN0IGNoYXIgKnZhbCwgY29uc3QgY2hhciAqc2VwKQoreyBjb25zdCBjaGFyICpzOworICBjaGFyICp0ID0gYnVmOworICBmb3IgKHMgPSB2YWw7ICpzOyBzKyspCisgICAgaWYgKCpzICE9ICcgJyAmJiAqcyAhPSAnXHQnICYmICFzdHJjaHIoc2VwLCAqcykpCisgICAgICBicmVhazsKKyAgaWYgKCpzID09ICciJykKKyAgeyBzKys7CisgICAgd2hpbGUgKCpzICYmICpzICE9ICciJyAmJiAtLWxlbikKKyAgICAgICp0KysgPSAqcysrOworICB9CisgIGVsc2UKKyAgeyB3aGlsZSAoc29hcF9ub3RibGFuaygqcykgJiYgIXN0cmNocihzZXAsICpzKSAmJiAtLWxlbikKKyAgICB7IGlmICgqcyA9PSAnJScpCisgICAgICB7ICp0KysgPSAoKHNbMV0gPj0gJ0EnID8gKHNbMV0gJiAweDcpICsgOSA6IHNbMV0gLSAnMCcpIDw8IDQpCisgICAgICAgICAgICAgICsgKHNbMl0gPj0gJ0EnID8gKHNbMl0gJiAweDcpICsgOSA6IHNbMl0gLSAnMCcpOworICAgICAgICBzICs9IDM7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgICp0KysgPSAqcysrOworICAgIH0KKyAgfQorICAqdCA9ICdcMCc7CisgIHdoaWxlICgqcyAmJiAhc3RyY2hyKHNlcCwgKnMpKQorICAgIHMrKzsKKyAgcmV0dXJuIHM7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbnZlbG9wZV9iZWdpbl9vdXQoc3RydWN0IHNvYXAgKnNvYXApCit7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNpemVfdCBuID0gMDsKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkgJiYgc29hcC0+bWltZS5ib3VuZGFyeSAmJiBzb2FwLT5taW1lLnN0YXJ0KQorICB7IGNvbnN0IGNoYXIgKnM7CisgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkgJiYgIShzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkpCisgICAgICBzID0gImFwcGxpY2F0aW9uL2RpbWUiOworICAgIGVsc2UgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgICAgIHMgPSAiYXBwbGljYXRpb24vc29hcCt4bWw7IGNoYXJzZXQ9dXRmLTgiOworICAgIGVsc2UKKyAgICAgIHMgPSAidGV4dC94bWw7IGNoYXJzZXQ9dXRmLTgiOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiLS0lc1xyXG5Db250ZW50LVR5cGU6ICVzXHJcbkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJpbmFyeVxyXG5Db250ZW50LUlEOiAlc1xyXG5cclxuIiwgc29hcC0+bWltZS5ib3VuZGFyeSwgcywgc29hcC0+bWltZS5zdGFydCk7CisgICAgbiA9IHN0cmxlbihzb2FwLT50bXBidWYpOworICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHNvYXAtPnRtcGJ1ZiwgbikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICBzb2FwLT5kaW1lLnNpemUgPSBzb2FwLT5jb3VudDsJLyogRElNRSBpbiBNSU1FIGNvcnJlY3Rpb24gKi8KKyAgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpKQorICB7IGlmIChzb2FwX3B1dGRpbWVoZHIoc29hcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyNlbmRpZgorICBzb2FwLT5wYXJ0ID0gU09BUF9JTl9FTlZFTE9QRTsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgIlNPQVAtRU5WOkVudmVsb3BlIiwgMCwgTlVMTCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW52ZWxvcGVfZW5kX291dChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsICJTT0FQLUVOVjpFbnZlbG9wZSIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpICYmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkgJiYgIShzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkpCisgIHsgc29hcC0+ZGltZS5zaXplID0gc29hcC0+Y291bnQgLSBzb2FwLT5kaW1lLnNpemU7CS8qIERJTUUgaW4gTUlNRSBjb3JyZWN0aW9uICovCisgICAgc3ByaW50Zihzb2FwLT5pZCwgc29hcC0+ZGltZV9pZF9mb3JtYXQsIDApOworICAgIHNvYXAtPmRpbWUuaWQgPSBzb2FwLT5pZDsKKyAgICBpZiAoc29hcC0+bG9jYWxfbmFtZXNwYWNlcykKKyAgICB7IGlmIChzb2FwLT5sb2NhbF9uYW1lc3BhY2VzWzBdLm91dCkKKyAgICAgICAgc29hcC0+ZGltZS50eXBlID0gKGNoYXIqKXNvYXAtPmxvY2FsX25hbWVzcGFjZXNbMF0ub3V0OworICAgICAgZWxzZQorICAgICAgICBzb2FwLT5kaW1lLnR5cGUgPSAoY2hhciopc29hcC0+bG9jYWxfbmFtZXNwYWNlc1swXS5uczsKKyAgICB9CisgICAgc29hcC0+ZGltZS5vcHRpb25zID0gTlVMTDsKKyAgICBzb2FwLT5kaW1lLmZsYWdzID0gU09BUF9ESU1FX01CIHwgU09BUF9ESU1FX0FCU1VSSTsKKyAgICBpZiAoIXNvYXAtPmRpbWUuZmlyc3QpCisgICAgICBzb2FwLT5kaW1lLmZsYWdzIHw9IFNPQVBfRElNRV9NRTsKKyAgICBzb2FwLT5jb3VudCArPSAxMiArICgoc3RybGVuKHNvYXAtPmRpbWUuaWQpKzMpJih+MykpICsgKChzdHJsZW4oc29hcC0+ZGltZS50eXBlKSszKSYofjMpKTsKKyAgfQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKSkKKyAgICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCBTT0FQX1NUUl9QQURESU5HLCAtKGxvbmcpc29hcC0+ZGltZS5zaXplJjMpOworI2VuZGlmCisgIHNvYXAtPnBhcnQgPSBTT0FQX0VORF9FTlZFTE9QRTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9IAorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VudmVsb3BlX2JlZ2luX2luKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzdHJ1Y3QgTmFtZXNwYWNlICpwOworICBzb2FwLT5wYXJ0ID0gU09BUF9JTl9FTlZFTE9QRTsKKyAgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCAiU09BUC1FTlY6RW52ZWxvcGUiLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1ZFUlNJT05NSVNNQVRDSDsKKyAgcCA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXM7CisgIGlmIChwKQorICB7IGNvbnN0IGNoYXIgKm5zID0gcFswXS5vdXQ7CisgICAgaWYgKCFucykKKyAgICAgIG5zID0gcFswXS5uczsKKyAgICBpZiAoIXN0cmNtcChucywgc29hcF9lbnYxKSkKKyAgICB7IHNvYXAtPnZlcnNpb24gPSAxOyAvKiBtYWtlIHN1cmUgd2UgdXNlIFNPQVAgMS4xICovCisgICAgICBpZiAocFsxXS5vdXQpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwWzFdLm91dCk7CisgICAgICBpZiAoKHBbMV0ub3V0ID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzb2FwX2VuYzEpKSkpCisgICAgICAgIHN0cmNweShwWzFdLm91dCwgc29hcF9lbmMxKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChucywgc29hcF9lbnYyKSkKKyAgICB7IHNvYXAtPnZlcnNpb24gPSAyOyAvKiBtYWtlIHN1cmUgd2UgdXNlIFNPQVAgMS4yICovCisgICAgICBpZiAocFsxXS5vdXQpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwWzFdLm91dCk7CisgICAgICBpZiAoKHBbMV0ub3V0ID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzb2FwX2VuYzIpKSkpCisgICAgICAgIHN0cmNweShwWzFdLm91dCwgc29hcF9lbmMyKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW52ZWxvcGVfZW5kX2luKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5wYXJ0ID0gU09BUF9FTkRfRU5WRUxPUEU7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsICJTT0FQLUVOVjpFbnZlbG9wZSIpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JvZHlfYmVnaW5fb3V0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5wYXJ0ID0gU09BUF9JTl9CT0RZOworICBpZiAoc29hcC0+dmVyc2lvbiA9PSAxKQorICAgIHNvYXAtPmVuY29kaW5nID0gMTsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NFQykgJiYgc29hcF9zZXRfYXR0cihzb2FwLCAid3N1OklkIiwgIkJvZHkiKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjZW5kaWYKKyAgaWYgKHNvYXBfZWxlbWVudChzb2FwLCAiU09BUC1FTlY6Qm9keSIsIDAsIE5VTEwpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHNvYXAsIE5VTEwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JvZHlfZW5kX291dChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsICJTT0FQLUVOVjpCb2R5IikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBzb2FwLT5wYXJ0ID0gU09BUF9FTkRfQk9EWTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYm9keV9iZWdpbl9pbihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+cGFydCA9IFNPQVBfSU5fQk9EWTsKKyAgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCAiU09BUC1FTlY6Qm9keSIsIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKCFzb2FwLT5ib2R5KQorICAgIHNvYXAtPnBhcnQgPSBTT0FQX05PX0JPRFk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JvZHlfZW5kX2luKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcC0+cGFydCA9PSBTT0FQX05PX0JPRFkpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0VORF9CT0RZOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCAiU09BUC1FTlY6Qm9keSIpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlY3ZfaGVhZGVyKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcF9nZXRoZWFkZXIoc29hcCkgJiYgc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9lbmRwb2ludChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZW5kcG9pbnQpCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnM7CisgIHJlZ2lzdGVyIHNpemVfdCBpLCBuOworICBzb2FwLT5lbmRwb2ludFswXSA9ICdcMCc7CisgIHNvYXAtPmhvc3RbMF0gPSAnXDAnOworICBzb2FwLT5wYXRoWzBdID0gJy8nOworICBzb2FwLT5wYXRoWzFdID0gJ1wwJzsKKyAgc29hcC0+cG9ydCA9IDgwOworICBpZiAoIWVuZHBvaW50IHx8ICEqZW5kcG9pbnQpCisgICAgcmV0dXJuOworICBpZiAoIXN0cm5jbXAoZW5kcG9pbnQsICJodHRwczoiLCA2KSkKKyAgICBzb2FwLT5wb3J0ID0gNDQzOworICBzdHJuY3B5KHNvYXAtPmVuZHBvaW50LCBlbmRwb2ludCwgc2l6ZW9mKHNvYXAtPmVuZHBvaW50KSAtIDEpOworICBzID0gc3RyY2hyKGVuZHBvaW50LCAnOicpOworICBpZiAocyAmJiBzWzFdID09ICcvJyAmJiBzWzJdID09ICcvJykKKyAgICBzICs9IDM7CisgIGVsc2UKKyAgICBzID0gZW5kcG9pbnQ7CisgIG4gPSBzdHJsZW4ocyk7CisgIGlmIChuID49IHNpemVvZihzb2FwLT5ob3N0KSkKKyAgICBuID0gc2l6ZW9mKHNvYXAtPmhvc3QpIC0gMTsKKyNpZmRlZiBXSVRIX0lQVjYKKyAgaWYgKHNbMF0gPT0gJ1snKQorICB7IHMrKzsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIHsgc29hcC0+aG9zdFtpXSA9IHNbaV07CisgICAgICBpZiAoc1tpXSA9PSAnXScpCisgICAgICB7IHMrKzsKKyAgICAgICAgYnJlYWs7IAorICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICB7IHNvYXAtPmhvc3RbaV0gPSBzW2ldOworICAgICAgaWYgKHNbaV0gPT0gJy8nIHx8IHNbaV0gPT0gJzonKQorICAgICAgICBicmVhazsgCisgICAgfQorICB9CisjZWxzZQorICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICB7IHNvYXAtPmhvc3RbaV0gPSBzW2ldOworICAgIGlmIChzW2ldID09ICcvJyB8fCBzW2ldID09ICc6JykKKyAgICAgIGJyZWFrOyAKKyAgfQorI2VuZGlmCisgIHNvYXAtPmhvc3RbaV0gPSAnXDAnOworICBpZiAoc1tpXSA9PSAnOicpCisgIHsgc29hcC0+cG9ydCA9IChpbnQpYXRvbChzICsgaSArIDEpOworICAgIGZvciAoaSsrOyBpIDwgbjsgaSsrKQorICAgICAgaWYgKHNbaV0gPT0gJy8nKQorICAgICAgICBicmVhazsKKyAgfQorICBpZiAoc1tpXSkKKyAgeyBzdHJuY3B5KHNvYXAtPnBhdGgsIHMgKyBpLCBzaXplb2Yoc29hcC0+cGF0aCkpOworICAgIHNvYXAtPnBhdGhbc2l6ZW9mKHNvYXAtPnBhdGgpIC0gMV0gPSAnXDAnOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfY29ubmVjdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZW5kcG9pbnQsIGNvbnN0IGNoYXIgKmFjdGlvbikKK3sgcmV0dXJuIHNvYXBfY29ubmVjdF9jb21tYW5kKHNvYXAsIFNPQVBfUE9TVCwgZW5kcG9pbnQsIGFjdGlvbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfY29ubmVjdF9jb21tYW5kKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgaHR0cF9jb21tYW5kLCBjb25zdCBjaGFyICplbmRwb2ludCwgY29uc3QgY2hhciAqYWN0aW9uKQoreyBjaGFyIGhvc3Rbc2l6ZW9mKHNvYXAtPmhvc3QpXTsKKyAgaW50IHBvcnQ7CisgIHNpemVfdCBjb3VudDsKKyAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICBzdHJjcHkoaG9zdCwgc29hcC0+aG9zdCk7IC8qIHNhdmUgdG8gY29tcGFyZSAqLworICBwb3J0ID0gc29hcC0+cG9ydDsgLyogc2F2ZSB0byBjb21wYXJlICovCisgIHNvYXBfc2V0X2VuZHBvaW50KHNvYXAsIGVuZHBvaW50KTsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPmZjb25uZWN0KQorICB7IGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mY29ubmVjdChzb2FwLCBlbmRwb2ludCwgc29hcC0+aG9zdCwgc29hcC0+cG9ydCkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGVsc2UKKyNlbmRpZgorICBpZiAoc29hcC0+Zm9wZW4gJiYgKnNvYXAtPmhvc3QpCisgIHsgc29hcC0+c3RhdHVzID0gaHR0cF9jb21tYW5kOworICAgIGlmICghc29hcC0+a2VlcF9hbGl2ZSB8fCAhc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSB8fCBzdHJjbXAoc29hcC0+aG9zdCwgaG9zdCkgfHwgc29hcC0+cG9ydCAhPSBwb3J0IHx8ICFzb2FwLT5mcG9sbCB8fCBzb2FwLT5mcG9sbChzb2FwKSkKKyAgICB7IHNvYXAtPmtlZXBfYWxpdmUgPSAwOyAvKiB0byBmb3JjZSBjbG9zZSAqLworICAgICAgc29hcC0+b21vZGUgJj0gflNPQVBfSU9fVURQOyAvKiB0byBmb3JjZSBjbG9zZSAqLworICAgICAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29ubmVjdC9yZWNvbm5lY3QgdG8gaG9zdD0nJXMnIHBhdGg9JyVzJyBwb3J0PSVkXG4iLCBzb2FwLT5ob3N0LCBzb2FwLT5wYXRoLCBzb2FwLT5wb3J0KSk7CisjaWZkZWYgV0lUSF9VRFAKKyAgICAgIGlmICghc3RybmNtcChlbmRwb2ludCwgInNvYXAudWRwOiIsIDkpKQorICAgICAgICBzb2FwLT5vbW9kZSB8PSBTT0FQX0lPX1VEUDsKKyNlbmRpZgorICAgICAgc29hcC0+c29ja2V0ID0gc29hcC0+Zm9wZW4oc29hcCwgZW5kcG9pbnQsIHNvYXAtPmhvc3QsIHNvYXAtPnBvcnQpOworICAgICAgaWYgKHNvYXAtPmVycm9yKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBzb2FwLT5rZWVwX2FsaXZlID0gKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fS0VFUEFMSVZFKSAhPSAwKTsKKyAgICB9CisgIH0KKyAgY291bnQgPSBzb2FwX2NvdW50X2F0dGFjaG1lbnRzKHNvYXApOworICBpZiAoc29hcF9iZWdpbl9zZW5kKHNvYXApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgIT0gU09BUF9JT19TVE9SRSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpICYmIGVuZHBvaW50KQorICB7IHVuc2lnbmVkIGludCBrID0gc29hcC0+bW9kZTsKKyAgICBzb2FwLT5tb2RlICY9IH4oU09BUF9JTyB8IFNPQVBfRU5DX1pMSUIpOworICAgIGlmICgoayAmIFNPQVBfSU8pICE9IFNPQVBfSU9fRkxVU0gpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fQlVGRkVSOworICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdChzb2FwLCBlbmRwb2ludCwgc29hcC0+aG9zdCwgc29hcC0+cG9ydCwgc29hcC0+cGF0aCwgYWN0aW9uLCBjb3VudCkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICAgIGlmICgoayAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgICAgeyBpZiAoc29hcF9mbHVzaChzb2FwKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyNlbmRpZgorICAgIHNvYXAtPm1vZGUgPSBrOworICB9CisgIGVsc2UgaWYgKGFjdGlvbikKKyAgICBzb2FwLT5hY3Rpb24gPSBzb2FwX3N0cmR1cChzb2FwLCBhY3Rpb24pOworICBpZiAoaHR0cF9jb21tYW5kICE9IFNPQVBfUE9TVCkKKyAgICByZXR1cm4gc29hcF9lbmRfc2VuZChzb2FwKTsKKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2NoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3MyYmFzZTY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzLCBjaGFyICp0LCBpbnQgbikKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbTsKKyAgcmVnaXN0ZXIgY2hhciAqcDsKKyAgaWYgKCF0KQorICAgIHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgKG4gKyAyKSAvIDMgKiA0ICsgMSk7CisgIGlmICghdCkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHJldHVybiBOVUxMOworICB9CisgIHAgPSB0OworICB0WzBdID0gJ1wwJzsKKyAgaWYgKCFzKQorICAgIHJldHVybiBwOworICBmb3IgKDsgbiA+IDI7IG4gLT0gMywgcyArPSAzKQorICB7IG0gPSBzWzBdOworICAgIG0gPSAobSA8PCA4KSB8IHNbMV07CisgICAgbSA9IChtIDw8IDgpIHwgc1syXTsKKyAgICBmb3IgKGkgPSA0OyBpID4gMDsgbSA+Pj0gNikKKyAgICAgIHRbLS1pXSA9IHNvYXBfYmFzZTY0b1ttICYgMHgzRl07CisgICAgdCArPSA0OworICB9CisgIHRbMF0gPSAnXDAnOworICBpZiAobiA+IDApCisgIHsgbSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgIG0gPSAobSA8PCA4KSB8ICpzKys7CisgICAgZm9yICg7IGkgPCAzOyBpKyspCisgICAgICBtIDw8PSA4OworICAgIGZvciAoaSsrOyBpID4gMDsgbSA+Pj0gNikKKyAgICAgIHRbLS1pXSA9IHNvYXBfYmFzZTY0b1ttICYgMHgzRl07CisgICAgZm9yIChpID0gMzsgaSA+IG47IGktLSkKKyAgICAgIHRbaV0gPSAnPSc7CisgICAgdFs0XSA9ICdcMCc7CisgIH0KKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9iYXNlNjQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgY2hhciAqdCwgc2l6ZV90IGwsIGludCAqbikKK3sgcmVnaXN0ZXIgaW50IGksIGosIGM7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbTsKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqcDsKKyAgaWYgKCFzIHx8ICEqcykKKyAgeyBpZiAobikKKyAgICAgICpuID0gMDsKKyAgICBpZiAoc29hcC0+ZXJyb3IpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gU09BUF9OT05fTlVMTDsKKyAgfQorICBpZiAoIXQpCisgIHsgbCA9IChzdHJsZW4ocykgKyAzKSAvIDQgKiAzOworICAgIHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgbCk7CisgIH0KKyAgaWYgKCF0KQorICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcCA9IHQ7CisgIGlmIChuKQorICAgICpuID0gMDsKKyAgZm9yICg7OykKKyAgeyBmb3IgKGkgPSAwOyBpIDwgU09BUF9CTEtMRU47IGkrKykKKyAgICB7IG0gPSAwOworICAgICAgaiA9IDA7CisgICAgICB3aGlsZSAoaiA8IDQpCisgICAgICB7IGMgPSAqcysrOworICAgICAgICBpZiAoYyA9PSAnPScgfHwgIWMpCisgICAgICAgIHsgaSAqPSAzOworICAgICAgICAgIHN3aXRjaCAoaikKKyAgICAgICAgICB7IGNhc2UgMjoKKyAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgobSA+PiA0KSAmIDB4RkYpOworICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKChtID4+IDEwKSAmIDB4RkYpOworICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKChtID4+IDIpICYgMHhGRik7CisgICAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG4pCisJICAgICpuICs9IGk7CisgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgIH0KKyAgICAgICAgYyAtPSAnKyc7CisgICAgICAgIGlmIChjID49IDAgJiYgYyA8PSA3OSkKKyAgICAgICAgeyBtID0gKG0gPDwgNikgKyBzb2FwX2Jhc2U2NGlbY107CisgICAgICAgICAgaisrOworICAgICAgICB9CisgICAgICB9CisgICAgICAqdCsrID0gKGNoYXIpKChtID4+IDE2KSAmIDB4RkYpOworICAgICAgKnQrKyA9IChjaGFyKSgobSA+PiA4KSAmIDB4RkYpOworICAgICAgKnQrKyA9IChjaGFyKShtICYgMHhGRik7CisgICAgICBpZiAobCA8IDMpCisgICAgICB7IGlmIChuKQorCSAgKm4gKz0gaTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgICB9CisgICAgICBsIC09IDM7CisgICAgfQorICAgIGlmIChuKQorICAgICAgKm4gKz0gMyAqIFNPQVBfQkxLTEVOOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjaGFyKgorU09BUF9GTUFDMgorc29hcF9zMmhleChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgdW5zaWduZWQgY2hhciAqcywgY2hhciAqdCwgaW50IG4pCit7IHJlZ2lzdGVyIGNoYXIgKnA7CisgIGlmICghdCkKKyAgICB0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIDIgKiBuICsgMSk7CisgIGlmICghdCkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHJldHVybiBOVUxMOworICB9CisgIHAgPSB0OworICB0WzBdID0gJ1wwJzsKKyAgaWYgKHMpCisgIHsgZm9yICg7IG4gPiAwOyBuLS0pCisgICAgeyByZWdpc3RlciBpbnQgbSA9ICpzKys7CisgICAgICAqdCsrID0gKGNoYXIpKChtID4+IDQpICsgKG0gPiAxNTkgPyAnYScgLSAxMCA6ICcwJykpOworICAgICAgbSAmPSAweDBGOworICAgICAgKnQrKyA9IChjaGFyKShtICsgKG0gPiA5ID8gJ2EnIC0gMTAgOiAnMCcpKTsKKyAgICB9CisgIH0KKyAgKnQrKyA9ICdcMCc7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfaGV4MnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGNoYXIgKnQsIHNpemVfdCBsLCBpbnQgKm4pCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnA7CisgIGlmICghcyB8fCAhKnMpCisgIHsgaWYgKG4pCisgICAgICAqbiA9IDA7CisgICAgaWYgKHNvYXAtPmVycm9yKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFNPQVBfTk9OX05VTEw7CisgIH0KKyAgaWYgKCF0KQorICB7IGwgPSBzdHJsZW4ocykgLyAyOworICAgIHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgbCk7CisgIH0KKyAgaWYgKCF0KQorICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcCA9IHQ7CisgIHdoaWxlIChsKQorICB7IHJlZ2lzdGVyIGludCBkMSwgZDI7CisgICAgZDEgPSAqcysrOworICAgIGlmICghZDEpCisgICAgICBicmVhazsKKyAgICBkMiA9ICpzKys7CisgICAgaWYgKCFkMikKKyAgICAgIGJyZWFrOworICAgICp0KysgPSAoKGQxID49ICdBJyA/IChkMSAmIDB4NykgKyA5IDogZDEgLSAnMCcpIDw8IDQpICsgKGQyID49ICdBJyA/IChkMiAmIDB4NykgKyA5IDogZDIgLSAnMCcpOworICAgIGwtLTsKKyAgfQorICBpZiAobikKKyAgICAqbiA9IHQgLSBwOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRodHRwaGRyKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3RhdHVzLCBzaXplX3QgY291bnQpCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnMgPSBOVUxMOworICByZWdpc3RlciBpbnQgZXJyID0gU09BUF9PSzsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqciA9IE5VTEw7CisjZW5kaWYKKyAgaWYgKHN0YXR1cyA9PSBTT0FQX0ZJTEUgJiYgc29hcC0+aHR0cF9jb250ZW50KQorICAgIHMgPSBzb2FwLT5odHRwX2NvbnRlbnQ7CisgIGVsc2UgaWYgKHN0YXR1cyA9PSBTT0FQX0hUTUwpCisgICAgcyA9ICJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiOworICBlbHNlIGlmIChjb3VudCB8fCAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKSkKKyAgeyBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICAgICAgcyA9ICJhcHBsaWNhdGlvbi9zb2FwK3htbDsgY2hhcnNldD11dGYtOCI7CisgICAgZWxzZQorICAgICAgcyA9ICJ0ZXh0L3htbDsgY2hhcnNldD11dGYtOCI7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPm1vZGUgJiAoU09BUF9FTkNfRElNRSB8IFNPQVBfRU5DX01UT00pKQorICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkKKyAgICB7IHIgPSBzOworICAgICAgcyA9ICJhcHBsaWNhdGlvbi94b3AreG1sOyBjaGFyc2V0PXV0Zi04IjsKKyAgICB9CisgICAgZWxzZQorICAgICAgcyA9ICJhcHBsaWNhdGlvbi9kaW1lIjsKKyAgfQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKSAmJiBzb2FwLT5taW1lLmJvdW5kYXJ5ICYmIHNvYXAtPnN0YXR1cyAhPSBTT0FQX0dFVCkKKyAgeyByZWdpc3RlciBjb25zdCBjaGFyICp0ID0gc3RyY2hyKHMsICc7Jyk7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICJtdWx0aXBhcnQvcmVsYXRlZDsgYm91bmRhcnk9XCIlc1wiOyB0eXBlPVwiIiwgc29hcC0+bWltZS5ib3VuZGFyeSk7CisgICAgaWYgKHQpCisgICAgICBzdHJuY2F0KHNvYXAtPnRtcGJ1ZiwgcywgdCAtIHMpOworICAgIGVsc2UKKyAgICAgIHN0cmNhdChzb2FwLT50bXBidWYsIHMpOworICAgIGlmIChzb2FwLT5taW1lLnN0YXJ0KQorICAgIHsgc3RyY2F0KHNvYXAtPnRtcGJ1ZiwgIlwiOyBzdGFydD1cIiIpOworICAgICAgc3RyY2F0KHNvYXAtPnRtcGJ1Ziwgc29hcC0+bWltZS5zdGFydCk7CisgICAgfQorICAgIHN0cmNhdChzb2FwLT50bXBidWYsICJcIiIpOworICAgIGlmIChyKQorICAgIHsgc3RyY2F0KHNvYXAtPnRtcGJ1ZiwgIjsgc3RhcnQtaW5mbz1cIiIpOworICAgICAgc3RyY2F0KHNvYXAtPnRtcGJ1Ziwgcik7CisgICAgICBzdHJjYXQoc29hcC0+dG1wYnVmLCAiXCIiKTsKKyAgICB9CisgICAgcyA9IHNvYXAtPnRtcGJ1ZjsKKyAgfQorI2VuZGlmCisgIGlmIChzICYmIChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQ29udGVudC1UeXBlIiwgcykpKQorICAgIHJldHVybiBlcnI7CisjaWZkZWYgV0lUSF9aTElCCisgIGlmIChzb2FwLT5vbW9kZSAmIFNPQVBfRU5DX1pMSUIpCisgIHsKKyNpZmRlZiBXSVRIX0daSVAKKyAgICBlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQ29udGVudC1FbmNvZGluZyIsICJnemlwIik7CisjZWxzZQorICAgIGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJDb250ZW50LUVuY29kaW5nIiwgImRlZmxhdGUiKTsKKyNlbmRpZgorICAgIGlmIChlcnIpCisgICAgICByZXR1cm4gZXJyOworICB9CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgICAgZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlRyYW5zZmVyLUVuY29kaW5nIiwgImNodW5rZWQiKTsKKyAgZWxzZQorI2VuZGlmCisgIGlmIChzb2FwLT5zdGF0dXMgIT0gU09BUF9HRVQpCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICIlbHUiLCAodW5zaWduZWQgbG9uZyljb3VudCk7CisgICAgZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkNvbnRlbnQtTGVuZ3RoIiwgc29hcC0+dG1wYnVmKTsKKyAgfQorICBpZiAoZXJyKQorICAgIHJldHVybiBlcnI7CisgIHJldHVybiBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQ29ubmVjdGlvbiIsIHNvYXAtPmtlZXBfYWxpdmUgPyAia2VlcC1hbGl2ZSIgOiAiY2xvc2UiKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAoraHR0cF9nZXQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJldHVybiBTT0FQX0dFVF9NRVRIT0Q7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK2h0dHBfcG9zdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZW5kcG9pbnQsIGNvbnN0IGNoYXIgKmhvc3QsIGludCBwb3J0LCBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICphY3Rpb24sIHNpemVfdCBjb3VudCkKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKKyAgcmVnaXN0ZXIgaW50IGVycjsKKyAgaWYgKHNvYXAtPnN0YXR1cyA9PSBTT0FQX0dFVCkKKyAgICBzID0gIkdFVCI7CisgIGVsc2UKKyAgICBzID0gIlBPU1QiOworI2lmZGVmIFBBTE0KKyAgaWYgKCFlbmRwb2ludCB8fCAoc3RybmNtcChlbmRwb2ludCwgImh0dHA6IiwgNSkgJiYgc3RybmNtcChlbmRwb2ludCwgImh0dHBzOiIsIDYpICYmIHN0cm5jbXAoZW5kcG9pbnQsICJodHRwZzoiLCA2KSkgJiYgc3RybmNtcChlbmRwb2ludCwgIl9iZWFtOiIsIDYpICYmIHN0cm5jbXAoZW5kcG9pbnQsICJfbG9jYWw6IiwgNykgJiYgc3RybmNtcChlbmRwb2ludCwgIl9idG9iZXg6IiwgOCkpCisjZWxzZQorICBpZiAoIWVuZHBvaW50IHx8IChzdHJuY21wKGVuZHBvaW50LCAiaHR0cDoiLCA1KSAmJiBzdHJuY21wKGVuZHBvaW50LCAiaHR0cHM6IiwgNikgJiYgc3RybmNtcChlbmRwb2ludCwgImh0dHBnOiIsIDYpKSkKKyNlbmRpZgorICAgIHJldHVybiBTT0FQX09LOworICBpZiAoc29hcC0+cHJveHlfaG9zdCAmJiBzdHJuY21wKGVuZHBvaW50LCAiaHR0cHM6IiwgNikpCisgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICIlcyAlcyBIVFRQLyVzIiwgcywgZW5kcG9pbnQsIHNvYXAtPmh0dHBfdmVyc2lvbik7CisgIGVsc2UKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIiVzIC8lcyBIVFRQLyVzIiwgcywgKCpwYXRoID09ICcvJyA/IHBhdGggKyAxIDogcGF0aCksIHNvYXAtPmh0dHBfdmVyc2lvbik7CisgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgc29hcC0+dG1wYnVmLCBOVUxMKSkpCisgICAgcmV0dXJuIGVycjsKKyAgaWYgKHBvcnQgIT0gODApCisgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICIlczolZCIsIGhvc3QsIHBvcnQpOworICBlbHNlCisgICAgc3RyY3B5KHNvYXAtPnRtcGJ1ZiwgaG9zdCk7IAorICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJIb3N0Iiwgc29hcC0+dG1wYnVmKSkKKyAgIHx8IChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiVXNlci1BZ2VudCIsICJnU09BUC8yLjciKSkKKyAgIHx8IChlcnIgPSBzb2FwX3B1dGh0dHBoZHIoc29hcCwgU09BUF9PSywgY291bnQpKSkKKyAgICByZXR1cm4gZXJyOworI2lmZGVmIFdJVEhfWkxJQgorI2lmZGVmIFdJVEhfR1pJUAorICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJBY2NlcHQtRW5jb2RpbmciLCAiZ3ppcCwgZGVmbGF0ZSIpKSkKKyNlbHNlCisgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkFjY2VwdC1FbmNvZGluZyIsICJkZWZsYXRlIikpKQorI2VuZGlmCisgICAgcmV0dXJuIGVycjsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPnVzZXJpZCAmJiBzb2FwLT5wYXNzd2QgJiYgc3RybGVuKHNvYXAtPnVzZXJpZCkgKyBzdHJsZW4oc29hcC0+cGFzc3dkKSA8IDc2MSkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIDI2MiwgIiVzOiVzIiwgc29hcC0+dXNlcmlkLCBzb2FwLT5wYXNzd2QpOworICAgIHN0cmNweShzb2FwLT50bXBidWYsICJCYXNpYyAiKTsKKyAgICBzb2FwX3MyYmFzZTY0KHNvYXAsIChjb25zdCB1bnNpZ25lZCBjaGFyKikoc29hcC0+dG1wYnVmICsgMjYyKSwgc29hcC0+dG1wYnVmICsgNiwgc3RybGVuKHNvYXAtPnRtcGJ1ZiArIDI2MikpOworICAgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkF1dGhvcml6YXRpb24iLCBzb2FwLT50bXBidWYpKSkKKyAgICAgIHJldHVybiBlcnI7CisgIH0KKyAgaWYgKHNvYXAtPnByb3h5X3VzZXJpZCAmJiBzb2FwLT5wcm94eV9wYXNzd2QgJiYgc3RybGVuKHNvYXAtPnByb3h5X3VzZXJpZCkgKyBzdHJsZW4oc29hcC0+cHJveHlfcGFzc3dkKSA8IDc2MSkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIDI2MiwgIiVzOiVzIiwgc29hcC0+cHJveHlfdXNlcmlkLCBzb2FwLT5wcm94eV9wYXNzd2QpOworICAgIHN0cmNweShzb2FwLT50bXBidWYsICJCYXNpYyAiKTsKKyAgICBzb2FwX3MyYmFzZTY0KHNvYXAsIChjb25zdCB1bnNpZ25lZCBjaGFyKikoc29hcC0+dG1wYnVmICsgMjYyKSwgc29hcC0+dG1wYnVmICsgNiwgc3RybGVuKHNvYXAtPnRtcGJ1ZiArIDI2MikpOworICAgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlByb3h5LUF1dGhvcml6YXRpb24iLCBzb2FwLT50bXBidWYpKSkKKyAgICAgIHJldHVybiBlcnI7CisgIH0KKyNlbmRpZgorI2lmZGVmIFdJVEhfQ09PS0lFUworI2lmZGVmIFdJVEhfT1BFTlNTTAorICBpZiAoc29hcF9wdXRjb29raWVzKHNvYXAsIGhvc3QsIHBhdGgsIHNvYXAtPnNzbCAhPSBOVUxMKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjZWxzZQorICBpZiAoc29hcF9wdXRjb29raWVzKHNvYXAsIGhvc3QsIHBhdGgsIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNlbmRpZgorI2VuZGlmCisgIGlmIChhY3Rpb24gJiYgc29hcC0+dmVyc2lvbiA9PSAxKQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiXCIlc1wiIiwgYWN0aW9uKTsKKyAgICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJTT0FQQWN0aW9uIiwgc29hcC0+dG1wYnVmKSkpCisgICAgICByZXR1cm4gZXJyOworICB9CisgIHJldHVybiBzb2FwLT5mcG9zdGhkcihzb2FwLCBOVUxMLCBOVUxMKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAoraHR0cF9zZW5kX2hlYWRlcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcykKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqdDsKKyAgZG8KKyAgeyB0ID0gc3RyY2hyKHMsICdcbicpOyAvKiBkaXNhbGxvdyBcbiBpbiBIVFRQIGhlYWRlcnMgKi8KKyAgICBpZiAoIXQpCisgICAgICB0ID0gcyArIHN0cmxlbihzKTsKKyAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcykpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgcyA9IHQgKyAxOworICB9IHdoaWxlICgqdCk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50CitodHRwX3Bvc3RfaGVhZGVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbCkKK3sgaWYgKGtleSkKKyAgeyBpZiAoaHR0cF9zZW5kX2hlYWRlcihzb2FwLCBrZXkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmICh2YWwgJiYgKHNvYXBfc2VuZF9yYXcoc29hcCwgIjogIiwgMikgfHwgaHR0cF9zZW5kX2hlYWRlcihzb2FwLCB2YWwpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCAiXHJcbiIsIDIpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50CitodHRwX3Jlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3RhdHVzLCBzaXplX3QgY291bnQpCit7IHJlZ2lzdGVyIGludCBlcnI7CisjaWZkZWYgV01XX1JQTV9JTworICBpZiAoc29hcC0+cnBtcmVxaWQpCisgICAgaHR0cE91dHB1dEVuYWJsZShzb2FwLT5ycG1yZXFpZCk7CisjZW5kaWYKKyAgaWYgKCFzdGF0dXMgfHwgc3RhdHVzID09IFNPQVBfSFRNTCB8fCBzdGF0dXMgPT0gU09BUF9GSUxFKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiT0sgMjAwXG4iKSk7CisjaWZkZWYgV01XX1JQTV9JTworICAgIGlmIChzb2FwLT5ycG1yZXFpZCB8fCBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpIHx8IHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpIC8qIFJQTSBiZWhhdmVzIGFzIGlmIHN0YW5kYWxvbmUgKi8KKyNlbHNlCisgICAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikgfHwgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkgLyogc3RhbmRhbG9uZSBhcHBsaWNhdGlvbiAqLworI2VuZGlmCisgICAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIkhUVFAvJXMgMjAwIE9LIiwgc29hcC0+aHR0cF92ZXJzaW9uKTsKKyAgICAgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgc29hcC0+dG1wYnVmLCBOVUxMKSkpCisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGVsc2UgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiU3RhdHVzIiwgIjIwMCBPSyIpKSkKKyAgICAgIHJldHVybiBlcnI7CisgIH0KKyAgZWxzZSBpZiAoc3RhdHVzID4gMjAwICYmIHN0YXR1cyA8IDYwMCkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIkhUVFAvJXMgJWQgJXMiLCBzb2FwLT5odHRwX3ZlcnNpb24sIHN0YXR1cywgaHR0cF9lcnJvcihzb2FwLCBzdGF0dXMpKTsKKyAgICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgTlVMTCkpKQorICAgICAgcmV0dXJuIGVycjsKKyNpZm5kZWYgV0lUSF9MRUFOIAorICAgIGlmIChzdGF0dXMgPT0gNDAxKQorICAgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJCYXNpYyByZWFsbT1cIiVzXCIiLCBzb2FwLT5hdXRocmVhbG0gPyBzb2FwLT5hdXRocmVhbG0gOiAiZ1NPQVAgV2ViIFNlcnZpY2UiKTsKKyAgICAgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIldXVy1BdXRoZW50aWNhdGUiLCBzb2FwLT50bXBidWYpKSkKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgZWxzZSBpZiAoKHN0YXR1cyA+PSAzMDEgJiYgc3RhdHVzIDw9IDMwMykgfHwgc3RhdHVzID09IDMwNykKKyAgICB7IGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkxvY2F0aW9uIiwgc29hcC0+ZW5kcG9pbnQpKSkKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisjZW5kaWYKKyAgfQorICBlbHNlCisgIHsgY29uc3QgY2hhciAqcyA9ICpzb2FwX2ZhdWx0Y29kZShzb2FwKTsKKyAgICBpZiAoc29hcC0+dmVyc2lvbiA9PSAyICYmICFzdHJjbXAocywgIlNPQVAtRU5WOlNlbmRlciIpKQorICAgICAgcyA9ICI0MDAgQmFkIFJlcXVlc3QiOworICAgIGVsc2UKKyAgICAgIHMgPSAiNTAwIEludGVybmFsIFNlcnZlciBFcnJvciI7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFcnJvciAlcyAoc3RhdHVzPSVkKVxuIiwgcywgc3RhdHVzKSk7CisjaWZkZWYgV01XX1JQTV9JTworICAgIGlmIChzb2FwLT5ycG1yZXFpZCB8fCBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpIHx8IHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpIC8qIFJQTSBiZWhhdmVzIGFzIGlmIHN0YW5kYWxvbmUgKi8KKyNlbHNlCisgICAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikgfHwgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkgLyogc3RhbmRhbG9uZSBhcHBsaWNhdGlvbiAqLworI2VuZGlmCisgICAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIkhUVFAvJXMgJXMiLCBzb2FwLT5odHRwX3ZlcnNpb24sIHMpOworICAgICAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCBzb2FwLT50bXBidWYsIE5VTEwpKSkKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgZWxzZSBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJTdGF0dXMiLCBzKSkpCisgICAgICByZXR1cm4gZXJyOworICB9CisgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlNlcnZlciIsICJnU09BUC8yLjciKSkKKyAgIHx8IChlcnIgPSBzb2FwX3B1dGh0dHBoZHIoc29hcCwgc3RhdHVzLCBjb3VudCkpKQorICAgIHJldHVybiBlcnI7CisjaWZkZWYgV0lUSF9DT09LSUVTCisgIGlmIChzb2FwX3B1dHNldGNvb2tpZXMoc29hcCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2VuZGlmCisgIHJldHVybiBzb2FwLT5mcG9zdGhkcihzb2FwLCBOVUxMLCBOVUxMKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3Jlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3RhdHVzKQoreyByZWdpc3RlciBzaXplX3QgY291bnQ7CisgIGlmICghKHNvYXAtPm9tb2RlICYgKFNPQVBfRU5DX1hNTCB8IFNPQVBfSU9fU1RPUkUgLyogdGhpcyB0ZXN0cyBmb3IgY2h1bmtpbmcgdG9vICovKSkKKyAgICYmIChzdGF0dXMgPT0gU09BUF9IVE1MIHx8IHN0YXR1cyA9PSBTT0FQX0ZJTEUpKQorICB7IHNvYXAtPm9tb2RlICY9IH5TT0FQX0lPOworICAgIHNvYXAtPm9tb2RlIHw9IFNPQVBfSU9fU1RPUkU7CisgIH0KKyAgc29hcC0+c3RhdHVzID0gc3RhdHVzOworICBjb3VudCA9IHNvYXBfY291bnRfYXR0YWNobWVudHMoc29hcCk7CisgIGlmIChzb2FwX2JlZ2luX3NlbmQoc29hcCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmbmRlZiBXSVRIX05PSFRUUAorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSAhPSBTT0FQX0lPX1NUT1JFICYmICEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1hNTCkpCisgIHsgcmVnaXN0ZXIgaW50IG4gPSBzb2FwLT5tb2RlOworICAgIHNvYXAtPm1vZGUgJj0gfihTT0FQX0lPIHwgU09BUF9FTkNfWkxJQik7CisgICAgaWYgKChuICYgU09BUF9JTykgIT0gU09BUF9JT19GTFVTSCkKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19CVUZGRVI7CisgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZyZXNwb25zZShzb2FwLCBzdGF0dXMsIGNvdW50KSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgICAgaWYgKChuICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgICB7IGlmIChzb2FwX2ZsdXNoKHNvYXApKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorI2VuZGlmCisgICAgc29hcC0+bW9kZSA9IG47CisgIH0KKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBjb25zdCBjaGFyKgorc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqdCkKK3sgaWYgKCpzb2FwLT50YWcpCisgICAgc3ByaW50Zihzb2FwLT5tc2didWYsICJWYWxpZGF0aW9uIGNvbnN0cmFpbnQgdmlvbGF0aW9uOiAlcyVzIGluIGVsZW1lbnQgPCVzPiIsIHMsIHQ/dDpTT0FQX1NUUl9FT1MsIHNvYXAtPnRhZyk7CisgIGVsc2UKKyAgICBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIlZhbGlkYXRpb24gY29uc3RyYWludCB2aW9sYXRpb246ICVzJXMiLCBzLCB0P3Q6U09BUF9TVFJfRU9TKTsKKyAgcmV0dXJuIHNvYXAtPm1zZ2J1ZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBjb25zdCBjaGFyICoqYyA9IHNvYXBfZmF1bHRjb2RlKHNvYXApOworICBjb25zdCBjaGFyICoqcyA9IHNvYXBfZmF1bHRzdHJpbmcoc29hcCk7CisgIGlmICghKmMgJiYgISpzICYmIHNvYXAtPmZzZXRlcnJvcikKKyAgICBzb2FwLT5mc2V0ZXJyb3Ioc29hcCwgYywgcyk7CisgIGlmICghKmMpCisgIHsgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgICAgICpjID0gIlNPQVAtRU5WOlNlbmRlciI7CisgICAgZWxzZQorICAgICAgKmMgPSAiU09BUC1FTlY6Q2xpZW50IjsKKyAgfQorICBpZiAoKnMpCisgICAgcmV0dXJuOworICBzd2l0Y2ggKHNvYXAtPmVycm9yKQorICB7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGNhc2UgU09BUF9DTElfRkFVTFQ6CisgICAgICAqcyA9ICJDbGllbnQgZmF1bHQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1NWUl9GQVVMVDoKKyAgICAgICpzID0gIlNlcnZlciBmYXVsdCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfVEFHX01JU01BVENIOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJ0YWcgbmFtZSBvciBuYW1lc3BhY2UgbWlzbWF0Y2giLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9UWVBFOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJkYXRhIHR5cGUgbWlzbWF0Y2ggIiwgc29hcC0+dHlwZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfU1lOVEFYX0VSUk9SOgorICAgICAgKnMgPSAiV2VsbC1mb3JtZWRuZXNzIHZpb2xhdGlvbiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTk9fVEFHOgorICAgICAgKnMgPSAiTm8gWE1MIGVsZW1lbnQgdGFnIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9NVVNUVU5ERVJTVEFORDoKKyAgICAgICpjID0gIlNPQVAtRU5WOk11c3RVbmRlcnN0YW5kIjsKKyAgICAgIHNwcmludGYoc29hcC0+bXNnYnVmLCAiVGhlIGRhdGEgaW4gZWxlbWVudCAnJXMnIG11c3QgYmUgdW5kZXJzdG9vZCBidXQgY2Fubm90IGJlIGhhbmRsZWQiLCBzb2FwLT50YWcpOworICAgICAgKnMgPSBzb2FwLT5tc2didWY7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfVkVSU0lPTk1JU01BVENIOgorICAgICAgKmMgPSAiU09BUC1FTlY6VmVyc2lvbk1pc21hdGNoIjsKKyAgICAgICpzID0gIlNPQVAgdmVyc2lvbiBtaXNtYXRjaCBvciBpbnZhbGlkIFNPQVAgbWVzc2FnZSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfREFUQUVOQ09ESU5HVU5LTk9XTjoKKyAgICAgICpjID0gIlNPQVAtRU5WOkRhdGFFbmNvZGluZ1Vua25vd24iOworICAgICAgKnMgPSAiVW5zdXBwb3J0ZWQgU09BUCBkYXRhIGVuY29kaW5nIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9OQU1FU1BBQ0U6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgIm5hbWVzcGFjZSBtaXNtYXRjaCIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1VTRVJfRVJST1I6CisgICAgICAqcyA9ICJVc2VyIGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9GQVRBTF9FUlJPUjoKKyAgICAgICpzID0gIkZhdGFsIGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9OT19NRVRIT0Q6CisgICAgICBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIk1ldGhvZCAnJXMnIG5vdCBpbXBsZW1lbnRlZDogbWV0aG9kIG5hbWUgb3IgbmFtZXNwYWNlIG5vdCByZWNvZ25pemVkIiwgc29hcC0+dGFnKTsKKyAgICAgICpzID0gc29hcC0+bXNnYnVmOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0dFVF9NRVRIT0Q6CisgICAgICAqcyA9ICJIVFRQIEdFVCBtZXRob2Qgbm90IGltcGxlbWVudGVkIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9FT006CisgICAgICAqcyA9ICJPdXQgb2YgbWVtb3J5IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9JT0I6CisgICAgICAqcyA9ICJBcnJheSBpbmRleCBvdXQgb2YgYm91bmRzIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9OVUxMOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJuaWwgbm90IGFsbG93ZWQiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9EVVBMSUNBVEVfSUQ6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgIm11bHRpcGxlIGRlZmluaXRpb25zIG9mIGlkICIsIHNvYXAtPmlkKTsKKyAgICAgIGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgICAgICAgICpzb2FwX2ZhdWx0c3ViY29kZShzb2FwKSA9ICJTT0FQLUVOQzpEdXBsaWNhdGVJRCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTUlTU0lOR19JRDoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAibWlzc2luZyBpZCBmb3IgcmVmICIsIHNvYXAtPmlkKTsKKyAgICAgIGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgICAgICAgICpzb2FwX2ZhdWx0c3ViY29kZShzb2FwKSA9ICJTT0FQLUVOQzpNaXNzaW5nSUQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0hSRUY6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgImluY29tcGF0aWJsZSBvYmplY3QgcmVmICIsIHNvYXAtPmlkKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9GQVVMVDoKKyAgICAgIGJyZWFrOworI2lmbmRlZiBXSVRIX05PSU8KKyAgICBjYXNlIFNPQVBfVURQX0VSUk9SOgorICAgICAgKnMgPSAiTWVzc2FnZSB0b28gbGFyZ2UgZm9yIFVEUCBwYWNrZXQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1RDUF9FUlJPUjoKKyAgICAgICpzID0gdGNwX2Vycm9yKHNvYXApOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIFNPQVBfSFRUUF9FUlJPUjoKKyAgICAgICpzID0gIkhUVFAgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1NTTF9FUlJPUjoKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICAgICpzID0gIlNTTCBlcnJvciI7CisjZWxzZQorICAgICAgKnMgPSAiT3BlblNTTCBub3QgaW5zdGFsbGVkOiByZWNvbXBpbGUgd2l0aCAtRFdJVEhfT1BFTlNTTCI7CisjZW5kaWYKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9QTFVHSU5fRVJST1I6CisgICAgICAqcyA9ICJQbHVnaW4gcmVnaXN0cnkgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0RJTUVfRVJST1I6CisgICAgICAqcyA9ICJESU1FIGZvcm1hdCBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfRElNRV9IUkVGOgorICAgICAgKnMgPSAiRElNRSBocmVmIHRvIG1pc3NpbmcgYXR0YWNobWVudCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfRElNRV9NSVNNQVRDSDoKKyAgICAgICpzID0gIkRJTUUgdmVyc2lvbi90cmFuc21pc3Npb24gZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0RJTUVfRU5EOgorICAgICAgKnMgPSAiRW5kIG9mIERJTUUgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX01JTUVfRVJST1I6CisgICAgICAqcyA9ICJNSU1FIGZvcm1hdCBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTUlNRV9IUkVGOgorICAgICAgKnMgPSAiTUlNRSBocmVmIHRvIG1pc3NpbmcgYXR0YWNobWVudCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTUlNRV9FTkQ6CisgICAgICAqcyA9ICJFbmQgb2YgTUlNRSBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfWkxJQl9FUlJPUjoKKyNpZmRlZiBXSVRIX1pMSUIKKyAgICAgIHNwcmludGYoc29hcC0+bXNnYnVmLCAiWmxpYi9nemlwIGVycm9yOiAnJXMnIiwgc29hcC0+ZF9zdHJlYW0ubXNnP3NvYXAtPmRfc3RyZWFtLm1zZzoiIik7CisgICAgICAqcyA9IHNvYXAtPm1zZ2J1ZjsKKyNlbHNlCisgICAgICAqcyA9ICJabGliL2d6aXAgbm90IGluc3RhbGxlZCBmb3IgKGRlKWNvbXByZXNzaW9uOiByZWNvbXBpbGUgd2l0aCAtRFdJVEhfR1pJUCI7CisjZW5kaWYKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9SRVFVSVJFRDoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAibWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGUiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9QUk9ISUJJVEVEOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJwcm9oaWJpdGVkIGF0dHJpYnV0ZSBwcmVzZW50IiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfT0NDVVJTOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJtaW4vbWF4T2NjdXJzIHZpb2xhdGlvbiIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0xFTkdUSDoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAiY29udGVudCBsZW5ndGggdmlvbGF0aW9uIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfU1RPUDoKKyAgICAgICpzID0gIlN0b3BwZWQ6IG5vIHJlc3BvbnNlIHNlbnQiOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIFNPQVBfRU9GOgorI2lmbmRlZiBXSVRIX05PSU8KKyAgICAgIHNwcmludGYoc29hcC0+bXNnYnVmLCAiRW5kIG9mIGZpbGUgb3Igbm8gaW5wdXQ6ICclcyciLCBzb2FwX3N0cmVycm9yKHNvYXApKTsKKyAgICAgICpzID0gc29hcC0+bXNnYnVmOworICAgICAgYnJlYWs7CisjZWxzZQorICAgICAgKnMgPSAiRW5kIG9mIGZpbGUgb3Igbm8gaW5wdXQiOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIGlmIChzb2FwLT5lcnJvciA+IDIwMCAmJiBzb2FwLT5lcnJvciA8IDYwMCkKKyAgICAgIHsgc3ByaW50Zihzb2FwLT5tc2didWYsICJIVFRQIEVycm9yOiAlZCAlcyIsIHNvYXAtPmVycm9yLCBodHRwX2Vycm9yKHNvYXAsIHNvYXAtPmVycm9yKSk7CisgICAgICAgICpzID0gc29hcC0+bXNnYnVmOworICAgICAgfQorICAgICAgZWxzZQorI2VuZGlmCisjZW5kaWYKKyAgICAgIHsgc3ByaW50Zihzb2FwLT5tc2didWYsICJFcnJvciAlZCIsIHNvYXAtPmVycm9yKTsKKyAgICAgICAgKnMgPSBzb2FwLT5tc2didWY7CisgICAgICB9CisgICAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmRfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBzdGF0dXMgPSBzb2FwLT5lcnJvcjsKKyAgaW50IHIgPSAxOworICBpZiAoc3RhdHVzID09IFNPQVBfU1RPUCkKKyAgICByZXR1cm4gc3RhdHVzOworICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2VuZGluZyBiYWNrIGZhdWx0IHN0cnVjdCBmb3IgZXJyb3IgY29kZSAlZFxuIiwgc29hcC0+ZXJyb3IpKTsKKyAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7IC8qIHRvIHRlcm1pbmF0ZSBjb25uZWN0aW9uICovCisgIHNvYXBfc2V0X2ZhdWx0KHNvYXApOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgZmRfc2V0IHJmZCwgc2ZkOworICAgIHRpbWVvdXQudHZfc2VjID0gMDsKKyAgICB0aW1lb3V0LnR2X3VzZWMgPSAwOworICAgIEZEX1pFUk8oJnJmZCk7CisgICAgRkRfWkVSTygmc2ZkKTsKKyAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnJmZCk7CisgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZzZmQpOworICAgIHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgJnJmZCwgJnNmZCwgTlVMTCwgJnRpbWVvdXQpOworICAgIGlmIChyID4gMCkKKyAgICB7IGlmICghRkRfSVNTRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnNmZCkKKyAgICAgICB8fCAoRkRfSVNTRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnJmZCkKKyAgICAgICAgJiYgcmVjdigoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzb2FwLT50bXBidWYsIDEsIE1TR19QRUVLKSA8IDApKQorICAgICAgICByID0gMDsKKyAgICB9CisgIH0KKyNlbmRpZgorI2VuZGlmCisgIGlmICgoc3RhdHVzICE9IFNPQVBfRU9GIHx8ICghc29hcC0+cmVjdl90aW1lb3V0ICYmICFzb2FwLT5zZW5kX3RpbWVvdXQpKSAmJiByID4gMCkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgICAgc29hcF9zZXJpYWxpemVoZWFkZXIoc29hcCk7CisgICAgc29hcF9zZXJpYWxpemVmYXVsdChzb2FwKTsKKyAgICBzb2FwX2JlZ2luX2NvdW50KHNvYXApOworICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgeyBzb2FwX2VudmVsb3BlX2JlZ2luX291dChzb2FwKTsKKyAgICAgIHNvYXBfcHV0aGVhZGVyKHNvYXApOworICAgICAgc29hcF9ib2R5X2JlZ2luX291dChzb2FwKTsKKyAgICAgIHNvYXBfcHV0ZmF1bHQoc29hcCk7CisgICAgICBzb2FwX2JvZHlfZW5kX291dChzb2FwKTsKKyAgICAgIHNvYXBfZW52ZWxvcGVfZW5kX291dChzb2FwKTsKKyAgICB9CisgICAgc29hcF9lbmRfY291bnQoc29hcCk7CisgICAgaWYgKHNvYXBfcmVzcG9uc2Uoc29hcCwgc3RhdHVzKQorICAgICB8fCBzb2FwX2VudmVsb3BlX2JlZ2luX291dChzb2FwKQorICAgICB8fCBzb2FwX3B1dGhlYWRlcihzb2FwKQorICAgICB8fCBzb2FwX2JvZHlfYmVnaW5fb3V0KHNvYXApCisgICAgIHx8IHNvYXBfcHV0ZmF1bHQoc29hcCkKKyAgICAgfHwgc29hcF9ib2R5X2VuZF9vdXQoc29hcCkKKyAgICAgfHwgc29hcF9lbnZlbG9wZV9lbmRfb3V0KHNvYXApKQorICAgICAgcmV0dXJuIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgIHNvYXBfZW5kX3NlbmQoc29hcCk7CisgIH0KKyAgc29hcC0+ZXJyb3IgPSBzdGF0dXM7CisgIHJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWN2X2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgc3RhdHVzID0gc29hcC0+ZXJyb3I7CisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWNlaXZpbmcgU09BUCBGYXVsdFxuIikpOworICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIGlmIChzb2FwX2dldGZhdWx0KHNvYXApKQorICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJFcnJvcjogc29hcF9nZXRfc29hcGZhdWx0KCkgZmFpbGVkLiBJcyB0aGlzIGEgU09BUCBtZXNzYWdlIGF0IGFsbD9cbiIpKTsKKyAgICAqc29hcF9mYXVsdGNvZGUoc29hcCkgPSAoc29hcC0+dmVyc2lvbiA9PSAyID8gIlNPQVAtRU5WOlNlbmRlciIgOiAiU09BUC1FTlY6Q2xpZW50Iik7CisgICAgc29hcC0+ZXJyb3IgPSBzdGF0dXM7CisgICAgc29hcF9zZXRfZmF1bHQoc29hcCk7CisgIH0KKyAgZWxzZQorICB7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnMgPSAqc29hcF9mYXVsdGNvZGUoc29hcCk7CisgICAgaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCBzLCAiU09BUC1FTlY6U2VydmVyIikgfHwgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHMsICJTT0FQLUVOVjpSZWNlaXZlciIpKQorICAgICAgc3RhdHVzID0gU09BUF9TVlJfRkFVTFQ7IAorICAgIGVsc2UgaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCBzLCAiU09BUC1FTlY6Q2xpZW50IikgfHwgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHMsICJTT0FQLUVOVjpTZW5kZXIiKSkKKyAgICAgIHN0YXR1cyA9IFNPQVBfQ0xJX0ZBVUxUOworICAgIGVsc2UgaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCBzLCAiU09BUC1FTlY6TXVzdFVuZGVyc3RhbmQiKSkKKyAgICAgIHN0YXR1cyA9IFNPQVBfTVVTVFVOREVSU1RBTkQ7CisgICAgZWxzZSBpZiAoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHMsICJTT0FQLUVOVjpWZXJzaW9uTWlzbWF0Y2giKSkKKyAgICAgIHN0YXR1cyA9IFNPQVBfVkVSU0lPTk1JU01BVENIOworICAgIGVsc2UKKyAgICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJGYXVsdCBjb2RlICVzXG4iLCBzKSk7CisgICAgICBzdGF0dXMgPSBTT0FQX0ZBVUxUOworICAgIH0KKyAgICBpZiAoc29hcF9ib2R5X2VuZF9pbihzb2FwKQorICAgICB8fCBzb2FwX2VudmVsb3BlX2VuZF9pbihzb2FwKQorICAgICB8fCBzb2FwX2VuZF9yZWN2KHNvYXApKQorICAgICAgcmV0dXJuIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgIHNvYXAtPmVycm9yID0gc3RhdHVzOworICB9CisgIHJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZW5kX2VtcHR5X3Jlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5jb3VudCA9IDA7CisgIGlmIChzb2FwX3Jlc3BvbnNlKHNvYXAsIFNPQVBfT0spIHx8IHNvYXBfZW5kX3NlbmQoc29hcCkpCisgICAgcmV0dXJuIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlY3ZfZW1wdHlfcmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwX2JlZ2luX3JlY3Yoc29hcCkgfHwgc29hcF9lbmRfcmVjdihzb2FwKSkKKyAgICByZXR1cm4gc29hcF9jbG9zZXNvY2soc29hcCk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNvbnN0IGNoYXIqCitzb2FwX3N0cmVycm9yKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgZXJyID0gc29hcC0+ZXJybnVtOworICBpZiAoZXJyKQorICB7CisjaWZuZGVmIFdJTjMyCisgICAgcmV0dXJuIHN0cmVycm9yKGVycik7CisjZWxzZQorICAgIEZvcm1hdE1lc3NhZ2UoRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU18Rk9STUFUX01FU1NBR0VfSUdOT1JFX0lOU0VSVFMsIE5VTEwsIGVyciwgMCwgKExQVFNUUikmc29hcC0+ZXJyb3JzdHIsIHNpemVvZihzb2FwLT5lcnJvcnN0ciksIE5VTEwpOworICAgIHJldHVybiBzb2FwLT5lcnJvcnN0cjsKKyNlbmRpZgorICB9CisgIHJldHVybiAiT3BlcmF0aW9uIGludGVycnVwdGVkIG9yIHRpbWVkIG91dCI7Cit9CisjZW5kaWYKKyNlbmRpZiAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitzdGF0aWMgaW50Citzb2FwX3NldF9lcnJvcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRjb2RlLCBjb25zdCBjaGFyICpmYXVsdHN1YmNvZGUsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCwgaW50IHNvYXBlcnJvcikKK3sgKnNvYXBfZmF1bHRjb2RlKHNvYXApID0gZmF1bHRjb2RlOworICBpZiAoZmF1bHRzdWJjb2RlKQorICAgICpzb2FwX2ZhdWx0c3ViY29kZShzb2FwKSA9IGZhdWx0c3ViY29kZTsKKyAgKnNvYXBfZmF1bHRzdHJpbmcoc29hcCkgPSBmYXVsdHN0cmluZzsKKyAgaWYgKGZhdWx0ZGV0YWlsICYmICpmYXVsdGRldGFpbCkKKyAgeyByZWdpc3RlciBjb25zdCBjaGFyICoqcyA9IHNvYXBfZmF1bHRkZXRhaWwoc29hcCk7CisgICAgaWYgKHMpCisgICAgICAqcyA9IGZhdWx0ZGV0YWlsOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvciA9IHNvYXBlcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZXRfc2VuZGVyX2Vycm9yKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdHN0cmluZywgY29uc3QgY2hhciAqZmF1bHRkZXRhaWwsIGludCBzb2FwZXJyb3IpCit7IHJldHVybiBzb2FwX3NldF9lcnJvcihzb2FwLCBzb2FwLT52ZXJzaW9uID09IDIgPyAiU09BUC1FTlY6U2VuZGVyIiA6ICJTT0FQLUVOVjpDbGllbnQiLCBOVUxMLCBmYXVsdHN0cmluZywgZmF1bHRkZXRhaWwsIHNvYXBlcnJvcik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdHN0cmluZywgY29uc3QgY2hhciAqZmF1bHRkZXRhaWwsIGludCBzb2FwZXJyb3IpCit7IHJldHVybiBzb2FwX3NldF9lcnJvcihzb2FwLCBzb2FwLT52ZXJzaW9uID09IDIgPyAiU09BUC1FTlY6UmVjZWl2ZXIiIDogIlNPQVAtRU5WOlNlcnZlciIsIE5VTEwsIGZhdWx0c3RyaW5nLCBmYXVsdGRldGFpbCwgc29hcGVycm9yKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK3N0YXRpYyBpbnQKK3NvYXBfY29weV9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRjb2RlLCBjb25zdCBjaGFyICpmYXVsdHN1YmNvZGUsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCkKK3sgY2hhciAqciA9IE5VTEwsICpzID0gTlVMTCwgKnQgPSBOVUxMOworICBpZiAoZmF1bHRzdWJjb2RlKQorICAgIHIgPSBzb2FwX3N0cmR1cChzb2FwLCBmYXVsdHN1YmNvZGUpOworICBpZiAoZmF1bHRzdHJpbmcpCisgICAgcyA9IHNvYXBfc3RyZHVwKHNvYXAsIGZhdWx0c3RyaW5nKTsKKyAgaWYgKGZhdWx0ZGV0YWlsKQorICAgIHQgPSBzb2FwX3N0cmR1cChzb2FwLCBmYXVsdGRldGFpbCk7CisgIHJldHVybiBzb2FwX3NldF9lcnJvcihzb2FwLCBmYXVsdGNvZGUsIHIsIHMsIHQsIFNPQVBfRkFVTFQpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmRlcl9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRzdHJpbmcsIGNvbnN0IGNoYXIgKmZhdWx0ZGV0YWlsKQoreyByZXR1cm4gc29hcF9zZW5kZXJfZmF1bHRfc3ViY29kZShzb2FwLCBOVUxMLCBmYXVsdHN0cmluZywgZmF1bHRkZXRhaWwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmRlcl9mYXVsdF9zdWJjb2RlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdHN1YmNvZGUsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCkKK3sgcmV0dXJuIHNvYXBfY29weV9mYXVsdChzb2FwLCBzb2FwLT52ZXJzaW9uID09IDIgPyAiU09BUC1FTlY6U2VuZGVyIiA6ICJTT0FQLUVOVjpDbGllbnQiLCBmYXVsdHN1YmNvZGUsIGZhdWx0c3RyaW5nLCBmYXVsdGRldGFpbCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVjZWl2ZXJfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCkKK3sgcmV0dXJuIHNvYXBfcmVjZWl2ZXJfZmF1bHRfc3ViY29kZShzb2FwLCBOVUxMLCBmYXVsdHN0cmluZywgZmF1bHRkZXRhaWwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlY2VpdmVyX2ZhdWx0X3N1YmNvZGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZhdWx0c3ViY29kZSwgY29uc3QgY2hhciAqZmF1bHRzdHJpbmcsIGNvbnN0IGNoYXIgKmZhdWx0ZGV0YWlsKQoreyByZXR1cm4gc29hcF9jb3B5X2ZhdWx0KHNvYXAsIHNvYXAtPnZlcnNpb24gPT0gMiA/ICJTT0FQLUVOVjpSZWNlaXZlciIgOiAiU09BUC1FTlY6U2VydmVyIiwgZmF1bHRzdWJjb2RlLCBmYXVsdHN0cmluZywgZmF1bHRkZXRhaWwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorI2lmbmRlZiBXSVRIX05PU1RETElCCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3ByaW50X2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwLCBGSUxFICpmZCkKK3sgaWYgKHNvYXBfY2hlY2tfc3RhdGUoc29hcCkpCisgICAgZnByaW50ZihmZCwgIkVycm9yOiBzb2FwIHN0cnVjdCBub3QgaW5pdGlhbGl6ZWRcbiIpOworICBlbHNlIGlmIChzb2FwLT5lcnJvcikKKyAgeyBjb25zdCBjaGFyICpjLCAqdiA9IE5VTEwsICpzLCAqKmQ7CisgICAgZCA9IHNvYXBfZmF1bHRjb2RlKHNvYXApOworICAgIGlmICghKmQpCisgICAgICBzb2FwX3NldF9mYXVsdChzb2FwKTsKKyAgICBjID0gKmQ7CisgICAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgICAgIHYgPSAqc29hcF9mYXVsdHN1YmNvZGUoc29hcCk7CisgICAgcyA9ICpzb2FwX2ZhdWx0c3RyaW5nKHNvYXApOworICAgIGQgPSBzb2FwX2ZhdWx0ZGV0YWlsKHNvYXApOworICAgIGZwcmludGYoZmQsICIlcyVkIGZhdWx0OiAlcyBbJXNdXG5cIiVzXCJcbkRldGFpbDogJXNcbiIsIHNvYXAtPnZlcnNpb24gPyAiU09BUCAxLiIgOiAiRXJyb3IgIiwgc29hcC0+dmVyc2lvbiA/IChpbnQpc29hcC0+dmVyc2lvbiA6IHNvYXAtPmVycm9yLCBjLCB2ID8gdiA6ICJubyBzdWJjb2RlIiwgcyA/IHMgOiAiW25vIHJlYXNvbl0iLCBkICYmICpkID8gKmQgOiAiW25vIGRldGFpbF0iKTsKKyAgfQorfQorI2VuZGlmCisjZW5kaWYKKyAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorI2lmbmRlZiBXSVRIX05PU1RETElCCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3ByaW50X2ZhdWx0X2xvY2F0aW9uKHN0cnVjdCBzb2FwICpzb2FwLCBGSUxFICpmZCkKK3sgCisjaWZuZGVmIFdJVEhfTEVBTgorICBpbnQgaSwgaiwgYzEsIGMyOworICBpZiAoc29hcC0+ZXJyb3IgJiYgc29hcC0+YnVmbGVuID4gMCkKKyAgeyBpID0gKGludClzb2FwLT5idWZpZHggLSAxOworICAgIGlmIChpIDw9IDApCisgICAgICBpID0gMDsKKyAgICBjMSA9IHNvYXAtPmJ1ZltpXTsKKyAgICBzb2FwLT5idWZbaV0gPSAnXDAnOworICAgIGlmICgoaW50KXNvYXAtPmJ1ZmxlbiA+PSBpICsgMTAyNCkKKyAgICAgIGogPSBpICsgMTAyMzsKKyAgICBlbHNlCisgICAgICBqID0gKGludClzb2FwLT5idWZsZW4gLSAxOworICAgIGMyID0gc29hcC0+YnVmW2pdOworICAgIHNvYXAtPmJ1ZltqXSA9ICdcMCc7CisgICAgZnByaW50ZihmZCwgIiVzJWNcbioqIEhFUkUgKipcbiIsIHNvYXAtPmJ1ZiwgYzEpOworICAgIGlmIChzb2FwLT5idWZpZHggPCBzb2FwLT5idWZsZW4pCisgICAgICBmcHJpbnRmKGZkLCAiJXNcbiIsIHNvYXAtPmJ1ZiArIHNvYXAtPmJ1ZmlkeCk7CisgICAgc29hcC0+YnVmW2ldID0gYzE7CisgICAgc29hcC0+YnVmW2pdID0gYzI7CisgIH0KKyNlbmRpZgorfQorI2VuZGlmCisjZW5kaWYKKyAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlZ2lzdGVyX3BsdWdpbl9hcmcoc3RydWN0IHNvYXAgKnNvYXAsIGludCAoKmZjcmVhdGUpKHN0cnVjdCBzb2FwKiwgc3RydWN0IHNvYXBfcGx1Z2luKiwgdm9pZCopLCB2b2lkICphcmcpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BsdWdpbiAqcDsKKyAgcmVnaXN0ZXIgaW50IHI7CisgIGlmICghKHAgPSAoc3RydWN0IHNvYXBfcGx1Z2luKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfcGx1Z2luKSkpKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICBwLT5pZCA9IE5VTEw7CisgIHAtPmRhdGEgPSBOVUxMOworICBwLT5mY29weSA9IE5VTEw7CisgIHAtPmZkZWxldGUgPSBOVUxMOworICByID0gZmNyZWF0ZShzb2FwLCBwLCBhcmcpOworICBpZiAoIXIgJiYgcC0+ZmRlbGV0ZSkKKyAgeyBwLT5uZXh0ID0gc29hcC0+cGx1Z2luczsKKyAgICBzb2FwLT5wbHVnaW5zID0gcDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlZ2lzdGVyZWQgJyVzJyBwbHVnaW5cbiIsIHAtPmlkKSk7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgcmVnaXN0ZXIgcGx1Z2luICclcyc6IHBsdWdpbiByZXR1cm5lZCBlcnJvciAlZCAob3IgZmRlbGV0ZSBjYWxsYmFjayBub3Qgc2V0KVxuIiwgcC0+aWQ/cC0+aWQ6Ij8iLCByKSk7CisgIFNPQVBfRlJFRShzb2FwLCBwKTsKKyAgcmV0dXJuIHI7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZCAqCitmcGx1Z2luKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGx1Z2luICpwOworICBmb3IgKHAgPSBzb2FwLT5wbHVnaW5zOyBwOyBwID0gcC0+bmV4dCkKKyAgICBpZiAocC0+aWQgPT0gaWQgfHwgIXN0cmNtcChwLT5pZCwgaWQpKQorICAgICAgcmV0dXJuIHAtPmRhdGE7CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZCAqCitTT0FQX0ZNQUMyCitzb2FwX2xvb2t1cF9wbHVnaW4oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkKQoreyByZXR1cm4gc29hcC0+ZnBsdWdpbihzb2FwLCBpZCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworI2lmbmRlZiBXSVRIX0xFQU4KK3NvYXA6OnNvYXAoKQoreyBzb2FwX2luaXQodGhpcyk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqCUMrKyBzb2FwIHN0cnVjdCBtZXRob2RzCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworI2lmbmRlZiBXSVRIX0xFQU4KK3NvYXA6OnNvYXAoc29hcF9tb2RlIG1vZGUpCit7IHNvYXBfaW5pdDEodGhpcywgbW9kZSk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIF9fY3BsdXNwbHVzCisjaWZuZGVmIFdJVEhfTEVBTgorc29hcDo6c29hcChzb2FwX21vZGUgaW1vZGUsIHNvYXBfbW9kZSBvbW9kZSkKK3sgc29hcF9pbml0Mih0aGlzLCBpbW9kZSwgb21vZGUpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworI2lmbmRlZiBXSVRIX0xFQU4KK3NvYXA6OnNvYXAoc3RydWN0IHNvYXAmIHNvYXApCit7IHNvYXBfY29weV9jb250ZXh0KHRoaXMsICZzb2FwKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpZm5kZWYgV0lUSF9MRUFOCitzb2FwOjp+c29hcCgpCit7IHNvYXBfZGVzdHJveSh0aGlzKTsKKyAgc29hcF9lbmQodGhpcyk7CisgIHNvYXBfZG9uZSh0aGlzKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9zYW1wbGVzL3F1b3RlX1ZDL3N0ZHNvYXAyLmggYi9zYW1wbGVzL3F1b3RlX1ZDL3N0ZHNvYXAyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI2Yzc0ZAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvcXVvdGVfVkMvc3Rkc29hcDIuaApAQCAtMCwwICsxLDIwOTMgQEAKKy8qCisKK3N0ZHNvYXAyLmggMi43LjZlCisKK2dTT0FQIHJ1bnRpbWUKKworZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlczoKK0dQTCwgdGhlIGdTT0FQIHB1YmxpYyBsaWNlbnNlLCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ29udHJpYnV0b3JzOgorCitXaW5kIFJpdmVyIFN5c3RlbXMsIEluYy4sIGZvciB0aGUgZm9sbG93aW5nIGFkZGl0aW9ucyAobWFya2VkIFdSWy4uLl0pOgorICAtIHZ4V29ya3MgY29tcGF0aWJsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIHB1YmxpYyBsaWNlbnNlLgorCitUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBnU09BUCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMworKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCitMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK2h0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9zb2FwbGljZW5zZS5odG1sCitTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAorV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCitmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLgorQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZmRlZiBXSVRIX1NPQVBERUZTX0gKKyMgaW5jbHVkZSAic29hcGRlZnMuaCIJCS8qIGluY2x1ZGUgdXNlci1kZWZpbmVkIHN0dWZmICovCisjZW5kaWYKKworI2lmbmRlZiBfVEhSRUFEX1NBRkUKKyMgZGVmaW5lIF9USFJFQURfU0FGRQorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNFUlZFUgorIyBpZm5kZWYgX1JFRU5UUkFOVAorIyAgZGVmaW5lIF9SRUVOVFJBTlQKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfRk1BQzEJLyogc3Rkc29hcDIuaCBkZWNsYXJhdGlvbiBtYWNybyAqLworIyBkZWZpbmUgU09BUF9GTUFDMQorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9GTUFDMgkvKiBzdGRzb2FwMi5oIGRlY2xhcmF0aW9uIG1hY3JvICovCisjIGRlZmluZSBTT0FQX0ZNQUMyCisjZW5kaWYKKworI2lmbmRlZiBTT0FQX0ZNQUMzCS8qIChkZSlzZXJpYWxpemVyIGRlY2xhcmF0aW9uIG1hY3JvICovCisjIGRlZmluZSBTT0FQX0ZNQUMzCisjZW5kaWYKKworI2lmbmRlZiBTT0FQX0ZNQUMzUwkvKiBzdHJpbmcgY29udmVydGVyIGZvciAoZGUpc2VyaWFsaXplciBkZWNsYXJhdGlvbiBtYWNybyAqLworIyBkZWZpbmUgU09BUF9GTUFDM1MgU09BUF9GTUFDMworI2VuZGlmCisKKyNpZm5kZWYgU09BUF9GTUFDNAkvKiAoZGUpc2VyaWFsaXplciBkZWNsYXJhdGlvbiBtYWNybyAqLworIyBkZWZpbmUgU09BUF9GTUFDNAorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9GTUFDNFMJLyogc3RyaW5nIGNvbnZlcnRlciBmb3IgKGRlKXNlcmlhbGl6ZXIgZGVjbGFyYXRpb24gbWFjcm8gKi8KKyMgZGVmaW5lIFNPQVBfRk1BQzRTIFNPQVBfRk1BQzQKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfRk1BQzUJLyogc3R1Yi9za2VsZXRvbiBkZWNsYXJhdGlvbiBtYWNybyAqLworIyBkZWZpbmUgU09BUF9GTUFDNQorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9GTUFDNgkvKiBzdHViL3NrZWxldG9uIGRlY2xhcmF0aW9uIG1hY3JvICovCisjIGRlZmluZSBTT0FQX0ZNQUM2CisjZW5kaWYKKworI2lmbmRlZiBTT0FQX0NNQUMJLyogY2xhc3MgZGVjbGFyYXRpb24gbWFjcm8gKi8KKyMgZGVmaW5lIFNPQVBfQ01BQworI2VuZGlmCisKKyNpZm5kZWYgU09BUF9OTUFDCS8qIG5hbWVzcGFjZSB0YWJsZSBkZWNsYXJhdGlvbiBtYWNybyAqLworIyBkZWZpbmUgU09BUF9OTUFDCisjZW5kaWYKKworI2lmbmRlZiBTT0FQX1NPVVJDRV9TVEFNUAorIyBkZWZpbmUgU09BUF9TT1VSQ0VfU1RBTVAoc3RyKQorI2VuZGlmCisKKy8qIGdTT0FQIDIuNy40IGFuZCBoaWdoZXI6IGZhc3QgbG9vay1hc2lkZSBidWZmZXJpbmcgaXMgc3RhYmxlICovCisjaWZuZGVmIFdJVEhfRkFTVAorIyBkZWZpbmUgV0lUSF9GQVNUCisjZW5kaWYKKworI2lmZGVmIFdJVEhfTEVBTkVSCisjIGlmbmRlZiBXSVRIX0xFQU4KKyMgIGRlZmluZSBXSVRIX0xFQU4KKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgV0lUSF9MRUFOCisjIGlmZGVmIFdJVEhfQ09PS0lFUworIyAgZXJyb3IgIkNhbm5vdCBidWlsZCBXSVRIX0xFQU4gY29kZSBXSVRIX0NPT0tJRVMgZW5hYmxlZCIKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFNURFNPQVBfSAorI2RlZmluZSBTVERTT0FQX0gKKworI2lmIGRlZmluZWQoX192eHdvcmtzKSB8fCBkZWZpbmVkKF9fVlhXT1JLU19fKQorIyBkZWZpbmUgVlhXT1JLUworI2VuZGlmCisKKyNpZmRlZiBfV0lOMzIKKyMgaWZuZGVmIFdJTjMyCisjICBkZWZpbmUgV0lOMzIKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgVU5ERVJfQ0UKKyMgaWZuZGVmIFdJTjMyCisjICBkZWZpbmUgV0lOMzIKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19CT1JMQU5EQ19fCisjIGlmZGVmIF9fV0lOMzJfXworIyAgaWZuZGVmIFdJTjMyCisjICAgZGVmaW5lIFdJTjMyCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX0NZR1dJTl9fCisjIGlmbmRlZiBDWUdXSU4KKyMgIGRlZmluZSBDWUdXSU4KKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19TWU1CSUFOMzJfXyAKKyMgZGVmaW5lIFNZTUJJQU4KKyMgdW5kZWYgV0lOMzIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX3BhbG1vc19fKSB8fCBkZWZpbmVkKFBBTE1fR0NDKSB8fCBkZWZpbmVkKF9fUEFMTU9TX1RSQVBTX18pCisjIGlmbmRlZiBQQUxNCisjICBkZWZpbmUgUEFMTQorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9faHB1eCkKKyMgaWZuZGVmIEhQX1VYCisjICBkZWZpbmUgSFBfVVgKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2FscGhhKSAmJiAhZGVmaW5lZChfX1ZNUykKKyMgaWZuZGVmIFRSVTY0CisjICBkZWZpbmUgVFJVNjQgCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fTVZTX18KKyMgaWZuZGVmIE9TMzkwCisjICBkZWZpbmUgT1MzOTAKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlICJjb25maWcuaCIKKyMgaWZkZWYgV0lUSF9PUEVOU1NMCisjICBpZm5kZWYgSEFWRV9PUEVOU1NMX1NTTF9ICisjICAgdW5kZWYgV0lUSF9PUEVOU1NMCisjICBlbmRpZgorIyBlbmRpZgorI2Vsc2UKKyMgaWYgZGVmaW5lZChVTkRFUl9DRSkKKyMgIGRlZmluZSBXSVRIX0xFQU4KKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyBlbGlmIGRlZmluZWQoV0lOMzIpCisjICBkZWZpbmUgSEFWRV9TVFJSQ0hSCisjICBkZWZpbmUgSEFWRV9TVFJUT0QKKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyAgZGVmaW5lIEhBVkVfU1RSVE9MCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMCisjICBkZWZpbmUgSEFWRV9TWVNfVElNRUJfSAorIyAgZGVmaW5lIEhBVkVfRlRJTUUKKyMgIGRlZmluZSBIQVZFX1dDVE9NQgorIyAgZGVmaW5lIEhBVkVfTUJUT1dDCisjICBkZWZpbmUgU09BUF9MT05HX0ZPUk1BVCAiJUk2NGQiCisjICBkZWZpbmUgU09BUF9VTE9OR19GT1JNQVQgIiVJNjR1IgorIyBlbGlmIGRlZmluZWQoQ1lHV0lOKQorIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfU1lTX1RJTUVCX0gKKyMgIGRlZmluZSBIQVZFX0ZUSU1FCisjICBkZWZpbmUgSEFWRV9SQU5EX1IKKyMgIGRlZmluZSBIQVZFX0dNVElNRV9SCisjICBkZWZpbmUgSEFWRV9MT0NBTFRJTUVfUgorIyAgZGVmaW5lIEhBVkVfV0NUT01CCisjICBkZWZpbmUgSEFWRV9NQlRPV0MKKyMgZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykKKyMgIGRlZmluZSBIQVZFX1NUUlJDSFIKKyMgIGRlZmluZSBIQVZFX1NUUlRPRAorIyAgZGVmaW5lIEhBVkVfU1NDQU5GCisjICBkZWZpbmUgSEFWRV9TVFJUT0wKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUwKKyMgIGRlZmluZSBIQVZFX1JBTkRfUgorIyAgZGVmaW5lIEhBVkVfR01USU1FX1IKKyMgIGRlZmluZSBIQVZFX0xPQ0FMVElNRV9SCisjICBkZWZpbmUgSEFWRV9USU1FR00KKyMgIGRlZmluZSBIQVZFX1dDVE9NQgorIyAgZGVmaW5lIEhBVkVfTUJUT1dDCisjIGVsaWYgZGVmaW5lZChfQUlYVkVSU0lPTl80MzEpCisjICBkZWZpbmUgSEFWRV9TVFJSQ0hSCisjICBkZWZpbmUgSEFWRV9TVFJUT0QKKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyAgZGVmaW5lIEhBVkVfU1RSVE9MCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMCisjICBkZWZpbmUgSEFWRV9TWVNfVElNRUJfSAorIyAgZGVmaW5lIEhBVkVfRlRJTUUKKyMgIGRlZmluZSBIQVZFX1JBTkRfUgorIyAgZGVmaW5lIEhBVkVfR01USU1FX1IKKyMgIGRlZmluZSBIQVZFX0xPQ0FMVElNRV9SCisjICBkZWZpbmUgSEFWRV9XQ1RPTUIKKyMgIGRlZmluZSBIQVZFX01CVE9XQworIyBlbGlmIGRlZmluZWQoSFBfVVgpCisjICBkZWZpbmUgSEFWRV9TVFJSQ0hSCisjICBkZWZpbmUgSEFWRV9TVFJUT0QKKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyAgZGVmaW5lIEhBVkVfU1RSVE9MCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMCisjICBkZWZpbmUgSEFWRV9TWVNfVElNRUJfSAorIyAgZGVmaW5lIEhBVkVfRlRJTUUKKyMgIGRlZmluZSBIQVZFX1JBTkRfUgorIyAgZGVmaW5lIEhBVkVfR01USU1FX1IKKyMgIGRlZmluZSBIQVZFX0xPQ0FMVElNRV9SCisjICBkZWZpbmUgSEFWRV9XQ1RPTUIKKyMgIGRlZmluZSBIQVZFX01CVE9XQworIyBlbGlmIGRlZmluZWQoRlJFRUJTRCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKKyMgIGRlZmluZSBIQVZFX1NUUlJDSFIKKyMgIGRlZmluZSBIQVZFX1NUUlRPRAorIyAgZGVmaW5lIEhBVkVfU1NDQU5GCisjICBkZWZpbmUgSEFWRV9TVFJUT0wKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUwKKyMgIGRlZmluZSBIQVZFX1NUUlRPTEwKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUxMCisjICBkZWZpbmUgSEFWRV9HRVRUSU1FT0ZEQVkKKyMgIGRlZmluZSBIQVZFX1JBTkRfUgorIyAgZGVmaW5lIEhBVkVfR01USU1FX1IKKyMgIGRlZmluZSBIQVZFX0xPQ0FMVElNRV9SCisjICBkZWZpbmUgSEFWRV9XQ1RPTUIKKyMgIGRlZmluZSBIQVZFX01CVE9XQworIyAgZGVmaW5lIFNPQVBfTE9OR19GT1JNQVQgIiVxZCIKKyMgIGRlZmluZSBTT0FQX1VMT05HX0ZPUk1BVCAiJXF1IgorIyBlbGlmIGRlZmluZWQoX19WTVMpCisjICBkZWZpbmUgSEFWRV9TVFJSQ0hSCisjICBkZWZpbmUgSEFWRV9TVFJUT0QKKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyAgZGVmaW5lIEhBVkVfU1RSVE9MCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMCisjICBkZWZpbmUgSEFWRV9TWVNfVElNRUJfSAorIyAgZGVmaW5lIEhBVkVfRlRJTUUKKyMgIGRlZmluZSBIQVZFX1JBTkRfUgorIyAgZGVmaW5lIEhBVkVfR01USU1FX1IKKyMgIGRlZmluZSBIQVZFX0xPQ0FMVElNRV9SCisjICBkZWZpbmUgSEFWRV9XQ1RPTUIKKyMgIGRlZmluZSBIQVZFX01CVE9XQworIyBlbGlmIGRlZmluZWQoX19HTElCQ19fKSB8fCBkZWZpbmVkKF9fR05VX18pCisjICBkZWZpbmUgSEFWRV9TVFJSQ0hSCisjICBkZWZpbmUgSEFWRV9TVFJUT0QKKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyAgZGVmaW5lIEhBVkVfU1RSVE9MCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMCisjICBkZWZpbmUgSEFWRV9TVFJUT0xMCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMTAorIyAgZGVmaW5lIEhBVkVfU1lTX1RJTUVCX0gKKyMgIGRlZmluZSBIQVZFX0ZUSU1FCisjICBkZWZpbmUgSEFWRV9SQU5EX1IKKyMgIGRlZmluZSBIQVZFX0dNVElNRV9SCisjICBkZWZpbmUgSEFWRV9MT0NBTFRJTUVfUgorIyAgZGVmaW5lIEhBVkVfVElNRUdNCisjICBkZWZpbmUgSEFWRV9XQ1RPTUIKKyMgIGRlZmluZSBIQVZFX01CVE9XQworIyAgZGVmaW5lIEhBVkVfSVNOQU4KKyMgZWxpZiBkZWZpbmVkKFRSVTY0KQorIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9MTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTEwKKyMgIGRlZmluZSBIQVZFX0dFVFRJTUVPRkRBWQorIyAgZGVmaW5lIEhBVkVfU1lTX1RJTUVCX0gKKyMgIGRlZmluZSBIQVZFX1JBTkRfUgorIyAgZGVmaW5lIEhBVkVfR01USU1FX1IKKyMgIGRlZmluZSBIQVZFX0xPQ0FMVElNRV9SCisjICBkZWZpbmUgX19VU0VfU1REX0lPU1RSRUFNCisjICBkZWZpbmUgSEFWRV9XQ1RPTUIKKyMgIGRlZmluZSBIQVZFX01CVE9XQworIyAgZGVmaW5lIFNPQVBfTE9OR19GT1JNQVQgIiVsZCIKKyMgIGRlZmluZSBTT0FQX1VMT05HX0ZPUk1BVCAiJWx1IgorIyBlbGlmIGRlZmluZWQoTUFDX0NBUkJPTikKKyMgIGRlZmluZSBXSVRIX05PSU8KKyMgIGRlZmluZSBIQVZFX1NUUlJDSFIKKyMgIGRlZmluZSBIQVZFX1NUUlRPRAorIyAgZGVmaW5lIEhBVkVfU1NDQU5GCisjICBkZWZpbmUgSEFWRV9TVFJUT0wKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUwKKyMgIGRlZmluZSBIQVZFX0ZUSU1FCisjICBkZWZpbmUgSEFWRV9SQU5EX1IKKyMgIGRlZmluZSBIQVZFX0dFVEhPU1RCWU5BTUVfUgorIyAgZGVmaW5lIEhBVkVfR01USU1FX1IKKyMgIGRlZmluZSBIQVZFX0xPQ0FMVElNRV9SCisjICBkZWZpbmUgSEFWRV9XQ1RPTUIKKyMgIGRlZmluZSBIQVZFX01CVE9XQworIyBlbGlmIGRlZmluZWQoUEFMTSkKKyMgIGRlZmluZSBXSVRIX0xFQU4KKyMgIGRlZmluZSBIQVZFX1NUUlRPRCAgIC8qIHN0cnRvZCgpIGlzIGRlZmluZWQgaW4gcGFsbUZ1bmN0aW9ucy5oICovCisjICBpbmNsdWRlIDxzdGRsaWIuaD4JLyogTmVlZHMgdG8gYmUgaW5jbHVkZWQgYmVmb3JlIHVuaXggaGVhZGVycyAqLworIyAgaW5jbHVkZSA8c3lzX3R5cGVzLmg+CisjICBkZWZpbmUgSUdOT1JFX1NURElPX1NUVUJTCisjICBpbmNsdWRlIDxTdGRJT1BhbG0uaD4KKyMgIGRlZmluZSBPX05PTkJMT0NLIEZOT05CSU8KKyMgIGluY2x1ZGUgPHN5c19zb2NrZXQuaD4KKyMgIGluY2x1ZGUgInBhbG1GdW5jdGlvbnMuaCIKKyMgZWxpZiBkZWZpbmVkKFNZTUJJQU4pCisjICBkZWZpbmUgV0lUSF9MRUFOCisjICBkZWZpbmUgV0lUSF9OT05BTUVTUEFDRVMKKyMgIGRlZmluZSBIQVZFX1NUUlRPRAkvKiB1c2UgU1RSVE9EIHNpbmNlIHNzY2FuZiBkb2Vzbid0IHNlZW0gdG8gd29yayAqLworIyAgaW5jbHVkZSA8ZTMyZGVmLmg+CisjICBpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyMgZWxpZiBkZWZpbmVkKFZYV09SS1MpCisjICBkZWZpbmUgSEFWRV9TVFJSQ0hSCisjICBkZWZpbmUgSEFWRV9TVFJUT0QKKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyAgZGVmaW5lIEhBVkVfU1RSVE9MCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMCisjICBkZWZpbmUgSEFWRV9QR01USU1FX1IKKyMgIGRlZmluZSBIQVZFX1BMT0NBTFRJTUVfUgorIyAgZGVmaW5lIEhBVkVfTUtUSU1FCisjIGVsaWYgZGVmaW5lZChPUzM5MCkKKyMgIGRlZmluZSBIQVZFX1NUUlJDSFIKKyMgIGRlZmluZSBIQVZFX1NUUlRPRAorIyAgZGVmaW5lIEhBVkVfU1NDQU5GCisjICBkZWZpbmUgSEFWRV9TVFJUT0wKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUwKKyMgIGRlZmluZSBIQVZFX1NZU19USU1FQl9ICisjICBkZWZpbmUgSEFWRV9GVElNRQorIyAgZGVmaW5lIEhBVkVfUkFORF9SCisjICBkZWZpbmUgSEFWRV9HTVRJTUVfUgorIyAgZGVmaW5lIEhBVkVfTE9DQUxUSU1FX1IKKyMgIGRlZmluZSBIQVZFX1dDVE9NQgorIyAgZGVmaW5lIEhBVkVfTUJUT1dDCisjIGVsaWYgZGVmaW5lZChBUzQwMCkKKyMgIGRlZmluZSBIQVZFX1NUUlJDSFIKKyMgIGRlZmluZSBIQVZFX1NUUlRPRAorIyAgZGVmaW5lIEhBVkVfU1NDQU5GCisjICBkZWZpbmUgSEFWRV9TVFJUT0wKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUwKKyMgIGRlZmluZSBIQVZFX1NZU19USU1FQl9ICisjICBkZWZpbmUgSEFWRV9GVElNRQorIyAgZGVmaW5lIEhBVkVfUkFORF9SCisjICBkZWZpbmUgSEFWRV9HTVRJTUVfUgorIyAgZGVmaW5lIEhBVkVfTE9DQUxUSU1FX1IKKyMgIGRlZmluZSBIQVZFX1dDVE9NQgorIyAgZGVmaW5lIEhBVkVfTUJUT1dDCisjIGVsc2UKKy8qIERlZmF1bHQgYXN1bXB0aW9ucyBvbiBzdXBwb3J0ZWQgZnVuY3Rpb25zICovCisjICBkZWZpbmUgSEFWRV9TVFJSQ0hSCisjICBkZWZpbmUgSEFWRV9TVFJUT0QKKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyAgZGVmaW5lIEhBVkVfU1RSVE9MCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMCisjICBkZWZpbmUgSEFWRV9TWVNfVElNRUJfSAorIyAgZGVmaW5lIEhBVkVfRlRJTUUKKyMgIGRlZmluZSBIQVZFX1JBTkRfUgorIyAgZGVmaW5lIEhBVkVfR0VUSE9TVEJZTkFNRV9SCisjICBkZWZpbmUgSEFWRV9HTVRJTUVfUgorIyAgZGVmaW5lIEhBVkVfTE9DQUxUSU1FX1IKKyMgIGRlZmluZSBIQVZFX1dDVE9NQgorIyAgZGVmaW5lIEhBVkVfTUJUT1dDCisjIGVuZGlmCisjZW5kaWYKKworLyogUU5YIGRvZXMgbm90IGhhdmUgYSB3b3JraW5nIHZlcnNpb24gb2Ygc3RydG9mICovCisjaWYgZGVmaW5lZChfX1FOWF9fKSB8fCBkZWZpbmVkKFFOWCkKKyMgdW5kZWYgSEFWRV9TVFJUT0YKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfTE9OR19GT1JNQVQKKyMgZGVmaW5lIFNPQVBfTE9OR19GT1JNQVQgIiVsbGQiCS8qIHByaW50ZiBmb3JtYXQgZm9yIDY0IGJpdCBpbnRzICovCisjZW5kaWYKKworI2lmbmRlZiBTT0FQX1VMT05HX0ZPUk1BVAorIyBkZWZpbmUgU09BUF9VTE9OR19GT1JNQVQgIiVsbHUiCS8qIHByaW50ZiBmb3JtYXQgZm9yIHVuc2lnbmVkIDY0IGJpdCBpbnRzICovCisjZW5kaWYKKworI2lmbmRlZiBXSVRIX05PU1RETElCCisjIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBpZm5kZWYgUEFMTQorIyAgaW5jbHVkZSA8c3RkaW8uaD4KKyMgIGluY2x1ZGUgPHN0cmluZy5oPgorIyBlbmRpZgorIyBpbmNsdWRlIDxjdHlwZS5oPgorIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgIWRlZmluZWQoV0lUSF9MRUFOKQorIyBpbmNsdWRlIDxzdHJpbmc+CisjIGluY2x1ZGUgPGlvc3RyZWFtPgorI2VuZGlmCisKKyNpZmRlZiBXSVRIX05PSFRUUAorIyBpZm5kZWYgV0lUSF9OT0lPCisjICBkZWZpbmUgV0lUSF9OT0lPCisjICB1bmRlZiBXSVRIX0NPT0tJRVMKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFVOREVSX0NFCisjIGlmbmRlZiBQQUxNCisjICBpZm5kZWYgV0lUSF9OT0lPCisjICAgaW5jbHVkZSA8ZXJybm8uaD4KKyMgICBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMgIGVuZGlmCisjICBpZm5kZWYgV0lUSF9MRUFOCisjICAgaWZkZWYgSEFWRV9TWVNfVElNRUJfSAorIyAgICBpbmNsdWRlIDxzeXMvdGltZWIuaD4JCS8qIGZvciBmdGltZSgpICovCisjICAgZW5kaWYKKyMgICBpbmNsdWRlIDx0aW1lLmg+CisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBPUEVOU0VSVkVSCisjIGluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyMgaW5jbHVkZSA8c3lzL3N0cmVhbS5oPgorIyBpbmNsdWRlIDxzeXMvcHJvdG9zdy5oPgorICBleHRlcm4gaW50IGhfZXJybm87CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX05PSU8KKyMgaWZuZGVmIFdJTjMyCisjICBpZm5kZWYgUEFMTQorIyAgIGluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyMgICBpZmRlZiBWWFdPUktTCisjICAgIGluY2x1ZGUgPHNvY2tMaWIuaD4KKyMgICAgaW5jbHVkZSA8c2VsZWN0TGliLmg+CisjICAgZW5kaWYKKyMgICBpZm5kZWYgVlhXT1JLUworIyAgICBpZm5kZWYgU1lNQklBTgorIyAgICAgaW5jbHVkZSA8c3RyaW5ncy5oPgorIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICAgaWZkZWYgU1VOX09TCisjICAgIGluY2x1ZGUgPHN5cy9zdHJlYW0uaD4JCS8qIFNVTiAqLworIyAgICBpbmNsdWRlIDxzeXMvc29ja2V0dmFyLmg+CQkvKiBTVU4gPCAyLjggKD8pICovCisjICAgZW5kaWYKKyMgICBpZmRlZiBWWFdPUktTCisjICAgIGlmZGVmIF9XUlNfS0VSTkVMCisjICAgICBpbmNsdWRlIDxzeXMvdGltZXMuaD4KKyMgICAgZW5kaWYKKyMgICBlbHNlCisjICAgIGluY2x1ZGUgPHN5cy90aW1lLmg+CisjICAgZW5kaWYKKyMgICBpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjICAgaWZkZWYgT1MzOTAKKyMgICAgaW5jbHVkZSA8bmV0aW5ldC90Y3BfdmFyLmg+CisjICAgZWxzZQorIyAgICBpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPiAgICAgICAgICAvKiBUQ1BfTk9ERUxBWSAqLworIyAgIGVuZGlmCisjICAgaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBXSVRIX0ZBU1RDR0kKKyMgaW5jbHVkZSA8ZmNnaV9zdGRpby5oPgorI2VuZGlmCisKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyMgZGVmaW5lIE9QRU5TU0xfTk9fS1JCNQorIyBpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgorIyBpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorIyBpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyMgaWZuZGVmIEFMTE9XX09MRF9WRVJTSU9OUworIyAgaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCAweDAwOTA1MTAwTCkKKyMgICBlcnJvciAiTXVzdCB1c2UgT3BlblNTTCAwLjkuNiBvciBsYXRlciIKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIFdJVEhfR1pJUAorIyBpZm5kZWYgV0lUSF9aTElCCisjICBkZWZpbmUgV0lUSF9aTElCCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIFdJVEhfQ0FTRUlOU0VOU0lUSVZFVEFHUworIyBkZWZpbmUgU09BUF9TVFJDTVAgc29hcF90YWdfY21wCS8qIGNhc2UgaW5zZW5zaXR2ZSBYTUwgZWxlbWVudC9hdHRyaWJ1dGUgbmFtZXMgKi8KKyNlbHNlCisjIGRlZmluZSBTT0FQX1NUUkNNUCBzdHJjbXAJCS8qIGNhc2Ugc2Vuc2l0aXZlIFhNTCBlbGVtZW50L2F0dHJpYnV0ZSBuYW1lcyAqLworI2VuZGlmCisKKyNpZmRlZiBXSVRIX1pMSUIKKyMgaW5jbHVkZSA8emxpYi5oPgorI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9OT1NURExJQgorIyBpZm5kZWYgUEFMTQorIyAgaW5jbHVkZSA8bWF0aC5oPgkvKiBmb3IgaXNuYW4oKSAqLworIyBlbmRpZgorI2VuZGlmCisKKy8qICNkZWZpbmUgREVCVUcgKi8gLyogVW5jb21tZW50IHRvIGRlYnVnIHNlbmRpbmcgKGluIGZpbGUgU0VOVC5sb2cpIHJlY2VpdmluZyAoaW4gZmlsZSBSRUNWLmxvZykgYW5kIG1lc3NhZ2VzIChpbiBmaWxlIFRFU1QubG9nKSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZmRlZiBXSU4zMgorIyBpZm5kZWYgVU5ERVJfQ0UKKyMgIGluY2x1ZGUgPGlvLmg+CisjICBpbmNsdWRlIDxmY250bC5oPgorIyBlbmRpZgorIyBpbmNsdWRlIDx3aW5zb2NrLmg+CisvKiAjIGluY2x1ZGUgPHdpbnNvY2syLmg+ICovIC8qIEFsdGVybmF0aXZlOiB1c2Ugd2luc29jazIgKG5vdCBhdmFpbGFibGUgd2l0aCBlVkMpICovCisjIGlmZGVmIFdJVEhfSVBWNgorIyAgaW5jbHVkZSA8d3MydGNwaXAuaD4KKyMgIGluY2x1ZGUgPHdzcGlhcGkuaD4KKyMgZW5kaWYKKyNlbHNlCisjIGlmZGVmIFZYV09SS1MKKyMgIGluY2x1ZGUgPGhvc3RMaWIuaD4KKyMgIGluY2x1ZGUgPGlvY3RsLmg+CisjICBpbmNsdWRlIDxpb0xpYi5oPgorIyBlbmRpZgorIyBpZm5kZWYgV0lUSF9OT0lPCisjICBpZm5kZWYgUEFMTQorIyAgIGluY2x1ZGUgPG5ldGRiLmg+CisjICAgaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorIyAgIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyAgIGluY2x1ZGUgPGZjbnRsLmg+CisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKy8qIFBvcnRhYmlsaXR5OiBkZWZpbmUgU09BUF9TT0NLTEVOX1QgKi8KKyNpZiBkZWZpbmVkKF9BSVgpCisjIGRlZmluZSBTT0FQX1NPQ0tMRU5fVCBzb2NrbGVuX3QKKyNlbGlmIGRlZmluZWQoU09DS0xFTl9UKQorIyBkZWZpbmUgU09BUF9TT0NLTEVOX1QgU09DS0xFTl9UCisjZWxpZiBkZWZpbmVkKF9fc29ja2xlbl90X2RlZmluZWQpIHx8IGRlZmluZWQoX1NPQ0tMRU5fVCkgfHwgZGVmaW5lZChDWUdXSU4pIHx8IGRlZmluZWQoRlJFRUJTRCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX1FOWF9fKSB8fCBkZWZpbmVkKFFOWCkKKyMgZGVmaW5lIFNPQVBfU09DS0xFTl9UIHNvY2tsZW5fdAorI2VsaWYgZGVmaW5lZChJUklYKSB8fCBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9fQVBQTEVfXykgfHwgZGVmaW5lZChIUF9VWCkgfHwgZGVmaW5lZChTVU5fT1MpIHx8IGRlZmluZWQoT1BFTlNFUlZFUikgfHwgZGVmaW5lZChUUlU2NCkgfHwgZGVmaW5lZChWWFdPUktTKQorIyBkZWZpbmUgU09BUF9TT0NLTEVOX1QgaW50CisjZWxzZQorIyBkZWZpbmUgU09BUF9TT0NLTEVOX1Qgc2l6ZV90CisjZW5kaWYKKworI2lmbmRlZiBTT0FQX1NPQ0tFVAorIyBpZmRlZiBXSU4zMgorIyAgZGVmaW5lIFNPQVBfU09DS0VUIFNPQ0tFVAorIyBlbHNlCisjICBkZWZpbmUgU09BUF9TT0NLRVQgaW50CisjICBkZWZpbmUgY2xvc2Vzb2NrZXQobikgY2xvc2UobikKKyMgZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIFNPQVBfSU5WQUxJRF9TT0NLRVQgKC0xKQorI2RlZmluZSBzb2FwX3ZhbGlkX3NvY2tldChuKSAoKG4pICE9IFNPQVBfSU5WQUxJRF9TT0NLRVQpCisKKyNpZiBkZWZpbmVkKFNZTUJJQU4pCisjIGRlZmluZSBMT05HNjQgbG9uZworIyBkZWZpbmUgVUxPTkc2NCB1bnNpZ25lZCBMT05HNjQKKyNlbGlmICFkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9fR0xJQkNfXykgfHwgZGVmaW5lZChfX0dOVV9fKQorIyBpZm5kZWYgTE9ORzY0CisjICBkZWZpbmUgTE9ORzY0IGxvbmcgbG9uZworIyAgZGVmaW5lIFVMT05HNjQgdW5zaWduZWQgTE9ORzY0CisjIGVuZGlmCisjZWxpZiBkZWZpbmVkKFVOREVSX0NFKQorIyBkZWZpbmUgTE9ORzY0IF9faW50NjQKKyMgZGVmaW5lIFVMT05HNjQgdW5zaWduZWQgTE9ORzY0CisjZWxpZiBkZWZpbmVkKF9fQk9STEFORENfXykKKyMgZGVmaW5lIExPTkc2NCBfX2ludDY0CisjIGRlZmluZSBVTE9ORzY0IHVuc2lnbmVkIExPTkc2NAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFdJTjMyKQorIyBkZWZpbmUgc29hcF9pbnQzMiBfX2ludDMyCisjZWxpZiBkZWZpbmVkKFNZTUJJQU4pCisjIGRlZmluZSBzb2FwX2ludDMyIGxvbmcKKyNlbGlmIGRlZmluZWQoUEFMTSkKKyMgZGVmaW5lIHNvYXBfaW50MzIgSW50MzIKKyNlbHNlCisjIGRlZmluZSBzb2FwX2ludDMyIGludDMyX3QKKyNlbmRpZgorCisjaWZkZWYgV0lOMzIKKyMgZGVmaW5lIFNPQVBfRVJBTkdFIEVSQU5HRQorIyBkZWZpbmUgU09BUF9FSU5UUiBXU0FFSU5UUgorIyBkZWZpbmUgU09BUF9FQUdBSU4gV1NBRVdPVUxEQkxPQ0sKKyMgZGVmaW5lIFNPQVBfRVdPVUxEQkxPQ0sgV1NBRVdPVUxEQkxPQ0sKKyMgZGVmaW5lIFNPQVBfRUlOUFJPR1JFU1MgV1NBRUlOUFJPR1JFU1MKKyNlbHNlCisjIGRlZmluZSBTT0FQX0VSQU5HRSBFUkFOR0UKKyMgZGVmaW5lIFNPQVBfRUlOVFIgRUlOVFIKKyMgZGVmaW5lIFNPQVBfRUFHQUlOIEVBR0FJTgorIyBpZmRlZiBTWU1CSUFOCisjICBkZWZpbmUgU09BUF9FV09VTERCTE9DSyA5ODk4CisjICBkZWZpbmUgU09BUF9FSU5QUk9HUkVTUyA5ODk5CisjIGVsc2UKKyMgIGRlZmluZSBTT0FQX0VXT1VMREJMT0NLIEVXT1VMREJMT0NLCisjICBkZWZpbmUgU09BUF9FSU5QUk9HUkVTUyBFSU5QUk9HUkVTUworIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBXSU4zMgorIyBpZmRlZiBVTkRFUl9DRQorIyAgZGVmaW5lIHNvYXBfZXJybm8gR2V0TGFzdEVycm9yKCkKKyMgIGRlZmluZSBzb2FwX3NvY2tldF9lcnJubyBHZXRMYXN0RXJyb3IoKQorIyAgZGVmaW5lIHNvYXBfcmVzZXRfZXJybm8gU2V0TGFzdEVycm9yKDApCisjIGVsc2UKKyMgIGRlZmluZSBzb2FwX2Vycm5vIEdldExhc3RFcnJvcigpCisjICBkZWZpbmUgc29hcF9zb2NrZXRfZXJybm8gV1NBR2V0TGFzdEVycm9yKCkKKyMgIGRlZmluZSBzb2FwX3Jlc2V0X2Vycm5vIFNldExhc3RFcnJvcigwKQorIyBlbmRpZgorI2Vsc2UKKyMgaWZuZGVmIFdJVEhfTk9JTworIyAgZGVmaW5lIHNvYXBfZXJybm8gZXJybm8KKyMgIGRlZmluZSBzb2FwX3NvY2tldF9lcnJubyBlcnJubworIyAgZGVmaW5lIHNvYXBfcmVzZXRfZXJybm8gKGVycm5vID0gMCkKKyMgZWxzZQorIyAgZGVmaW5lIHNvYXBfZXJybm8gMAorIyAgZGVmaW5lIHNvYXBfc29ja2V0X2Vycm5vIDAKKyMgIGRlZmluZSBzb2FwX3Jlc2V0X2Vycm5vCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBTT0FQX0JVRkxFTgorIyBpZmRlZiBXSVRIX1VEUAorIyAgZGVmaW5lIFNPQVBfQlVGTEVOICg2NTUzNikgLyogbWF4IFVEUCBwYWNrZXQgc2l6ZSAqLworIyBlbHNlCisjICBpZm5kZWYgV0lUSF9MRUFOCisjICAgZGVmaW5lIFNPQVBfQlVGTEVOICg2NTUzNikgLyogYnVmZmVyIGxlbmd0aCBmb3Igc29ja2V0IHBhY2tldHMsIGFsc28gdXNlZCBieSBnZXRob3N0YnluYW1lX3Igc28gZG9uJ3QgbWFrZSB0aGlzIHRvbyBzbWFsbCAqLworIyAgZWxzZQorIyAgIGRlZmluZSBTT0FQX0JVRkxFTiAgKDIwNDgpCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisjaWZuZGVmIFNPQVBfTEFCTEVOCisjIGRlZmluZSBTT0FQX0xBQkxFTiAgICAgKDY0KSAvKiBpbml0aWFsIGxvb2stYXNpZGUgYnVmZmVyIGxlbmd0aCAqLworI2VuZGlmCisjaWZuZGVmIFNPQVBfUFRSQkxLCisjIGRlZmluZSBTT0FQX1BUUkJMSyAgICAgKDMyKSAvKiBibG9jayBhbGxvY2F0aW9uIGZvciBwb2ludGVyIGhhc2ggdGFibGUgY2hhaW5zICovCisjZW5kaWYKKyNpZm5kZWYgU09BUF9QVFJIQVNICisjIGlmbmRlZiBXSVRIX0xFQU4KKyMgIGRlZmluZSBTT0FQX1BUUkhBU0ggKDEwMjQpIC8qIHNpemUgb2YgcG9pbnRlciBhbmFseXNpcyBoYXNoIHRhYmxlIChtdXN0IGJlIHBvd2VyIG9mIDIpICovCisjIGVsc2UKKyMgIGRlZmluZSBTT0FQX1BUUkhBU0ggICAoMzIpCisjIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgU09BUF9JREhBU0gKKyMgaWZuZGVmIFdJVEhfTEVBTgorIyAgZGVmaW5lIFNPQVBfSURIQVNIICAoMTk5OSkgLyogcHJpbWUgc2l6ZSBvZiBoYXNoIHRhYmxlIGZvciBwYXJzZWQgaWQvcmVmICovCisjIGVsc2UKKyMgIGRlZmluZSBTT0FQX0lESEFTSCAgICAoMTkpIC8qIDE5LCAxOTkgKi8KKyMgZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBTT0FQX0JMS0xFTgorIyBpZm5kZWYgV0lUSF9MRUFOCisjICBkZWZpbmUgU09BUF9CTEtMRU4gICAoMjU2KSAvKiBzaXplIG9mIGJsb2NrcyB0byBjb2xsZWN0IGxvbmcgc3RyaW5ncyBhbmQgWE1MIGF0dHJpYnV0ZXMgKi8KKyMgZWxzZQorIyAgZGVmaW5lIFNPQVBfQkxLTEVOICAgICgzMikKKyMgZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBTT0FQX1RBR0xFTgorIyBpZm5kZWYgV0lUSF9MRUFOCisjICBkZWZpbmUgU09BUF9UQUdMRU4gICgxMDI0KSAvKiBtYXhpbXVtIGxlbmd0aCBvZiBYTUwgZWxlbWVudCB0YWcvYXR0cmlidXRlIG5hbWUgb3IgaG9zdC9wYXRoIG5hbWUgKyAxICovCisjIGVsc2UKKyMgIGRlZmluZSBTT0FQX1RBR0xFTiAgICAoNjQpCisjIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgU09BUF9IRFJMRU4KKyMgaWZuZGVmIFdJVEhfTEVBTgorIyAgZGVmaW5lIFNPQVBfSERSTEVOICAoODE5MikgLyogbWF4aW11bSBsZW5ndGggb2YgSFRUUCBoZWFkZXIgbGluZSAobXVzdCBiZSA+NDA5NiB0byByZWFkIGNvb2tpZXMpICovCisjIGVsc2UKKyMgIGRlZmluZSBTT0FQX0hEUkxFTiAgKDEwMjQpCisjIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgU09BUF9NQVhESU1TCisjIGlmbmRlZiBXSVRIX0xFQU4KKyMgIGRlZmluZSBTT0FQX01BWERJTVMJICgxNikgLyogbWF4aW11bSBhcnJheSBkaW1lbnNpb25zIChhcnJheSBuZXN0aW5ncykgbXVzdCBiZSBsZXNzIHRoYW4gNjQgdG8gcHJvdGVjdCBzb2FwLT50bXBidWYgKi8KKyMgZWxzZQorIyAgZGVmaW5lIFNPQVBfTUFYRElNUwkgICg0KQorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9NQVhMT0dTCisjIGRlZmluZSBTT0FQX01BWExPR1MJICAoMykgLyogbWF4IG51bWJlciBvZiBkZWJ1ZyBsb2dzIHBlciBzdHJ1Y3Qgc29hcCBlbnZpcm9ubWVudCAqLworIyBkZWZpbmUgU09BUF9JTkRFWF9SRUNWICAoMCkKKyMgZGVmaW5lIFNPQVBfSU5ERVhfU0VOVCAgKDEpCisjIGRlZmluZSBTT0FQX0lOREVYX1RFU1QgICgyKQorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9NQVhLRUVQQUxJVkUKKyMgZGVmaW5lIFNPQVBfTUFYS0VFUEFMSVZFICgxMDApIC8qIG1heCBpdGVyYXRpb25zIHRvIGtlZXAgc2VydmVyIGNvbm5lY3Rpb24gYWxpdmUgKi8KKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfTUFYQVJSQVlTSVpFCisjIGRlZmluZSBTT0FQX01BWEFSUkFZU0laRSAoMTAwMDAwKSAvKiAidHJ1c3RlZCIgbWF4IHNpemUgb2YgaW5ib3VuZCBTT0FQIGFycmF5IGZvciBjb21wb3VuZCBhcnJheSBhbGxvY2F0aW9uICovCisjZW5kaWYKKworI2lmZGVmIFZYV09SS1MKKyMgaWZkZWYgX19JTkNtYXRoaCAKKyMgIGluY2x1ZGUgPHByaXZhdGUvbWF0aFAuaD4KKyMgIGlmbmRlZiBIQVZFX0lTTkFOCisjICAgZGVmaW5lIEhBVkVfSVNOQU4KKyMgIGVuZGlmCisjICBkZWZpbmUgc29hcF9pc25hbihudW0pIGlzTmFuKG51bSkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgV0lOMzIgCisjIGluY2x1ZGUgPGZsb2F0Lmg+CisjIGlmbmRlZiBIQVZFX0lTTkFOCisjICBkZWZpbmUgSEFWRV9JU05BTgorIyBlbmRpZgorIyBkZWZpbmUgc29hcF9pc25hbihudW0pIF9pc25hbihudW0pCisjZW5kaWYKKworI2lmZGVmIFNVTl9PUworIyBkZWZpbmUgc29hcF9pc25hbihuKSBpc25hbihuKQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChIQVZFX0lTTkFOKSAmJiAoZGVmaW5lZChfTUFUSF9IKSB8fCBkZWZpbmVkKF9NQVRIX0lOQ0xVREVEKSkKKyMgZGVmaW5lIEhBVkVfSVNOQU4KKyNlbmRpZgorCisjaWZuZGVmIHNvYXBfaXNuYW4KKyMgaWZkZWYgSEFWRV9JU05BTgorIyAgZGVmaW5lIHNvYXBfaXNuYW4obikgaXNuYW4obikKKyMgZWxzZQorIyAgZGVmaW5lIHNvYXBfaXNuYW4oXykgKDApCisjIGVuZGlmCisjZW5kaWYKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzb2FwX2RvdWJsZV9uYW4geyB1bnNpZ25lZCBpbnQgbjEsIG4yOyB9IHNvYXBfZG91YmxlX25hbjsKKworI2lmZGVmIFZYV09SS1MKKyMgaWZuZGVmIEZMVF9NQVgKKyMgIGRlZmluZSBGTFRfTUFYIF9BUkNIX0ZMVF9NQVgKKyMgZW5kaWYKKyMgaWZuZGVmIERCTF9NQVgKKyMgIGRlZmluZSBEQkxfTUFYIF9BUkNIX0RCTF9NQVgKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEZMVF9OQU4KKyMgaWZkZWYgSEFWRV9JU05BTgorIyAgZGVmaW5lIEZMVF9OQU4gKCooZmxvYXQqKSh2b2lkKikmc29hcF9kb3VibGVfbmFuKQorIyBlbHNlCisjICBkZWZpbmUgRkxUX05BTiAoMC4wKQorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRkxUX1BJTkZUWQorIyBpZiBkZWZpbmVkKEZMVF9NQVgpCisjICBkZWZpbmUgRkxUX1BJTkZUWSBGTFRfTUFYCisjIGVsaWYgZGVmaW5lZChIVUdFX1ZBTEYpCisjICBkZWZpbmUgRkxUX1BJTkZUWSAoZmxvYXQpSFVHRV9WQUxGCisjIGVsaWYgZGVmaW5lZChIVUdFX1ZBTCkKKyMgIGRlZmluZSBGTFRfUElORlRZIChmbG9hdClIVUdFX1ZBTAorIyBlbGlmIGRlZmluZWQoRkxPQVRfTUFYKQorIyAgZGVmaW5lIEZMVF9QSU5GVFkgRkxPQVRfTUFYCisjIGVsc2UKKyMgIGRlZmluZSBGTFRfUElORlRZICgzLjQwMjgyMzQ3ZSszOEYpCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBGTFRfTklORlRZCisjIGRlZmluZSBGTFRfTklORlRZICgtRkxUX1BJTkZUWSkKKyNlbmRpZgorCisjaWZuZGVmIERCTF9OQU4KKyMgaWZkZWYgSEFWRV9JU05BTgorIyAgZGVmaW5lIERCTF9OQU4gKCooZG91YmxlKikodm9pZCopJnNvYXBfZG91YmxlX25hbikKKyMgZWxzZQorIyAgZGVmaW5lIERCTF9OQU4gKDAuMCkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIERCTF9QSU5GVFkKKyMgaWYgZGVmaW5lZChEQkxfTUFYKQorIyAgZGVmaW5lIERCTF9QSU5GVFkgREJMX01BWAorIyBlbGlmIGRlZmluZWQoSFVHRV9WQUxGKQorIyAgZGVmaW5lIERCTF9QSU5GVFkgKGRvdWJsZSlIVUdFX1ZBTEYKKyMgZWxpZiBkZWZpbmVkKEhVR0VfVkFMKQorIyAgZGVmaW5lIERCTF9QSU5GVFkgKGRvdWJsZSlIVUdFX1ZBTAorIyBlbGlmIGRlZmluZWQoRE9VQkxFX01BWCkKKyMgIGRlZmluZSBEQkxfUElORlRZIERPVUJMRV9NQVgKKyMgZWxzZQorIyAgZGVmaW5lIERCTF9QSU5GVFkgKDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4KQorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgREJMX05JTkZUWQorIyBkZWZpbmUgREJMX05JTkZUWSAoLURCTF9QSU5GVFkpCisjZW5kaWYKKworI2RlZmluZSBzb2FwX2lzcGluZmQobikgKChuKSA+PSBEQkxfUElORlRZKQorI2RlZmluZSBzb2FwX2lzcGluZmYobikgKChuKSA+PSBGTFRfUElORlRZKQorI2RlZmluZSBzb2FwX2lzbmluZmQobikgKChuKSA8PSBEQkxfTklORlRZKQorI2RlZmluZSBzb2FwX2lzbmluZmYobikgKChuKSA8PSBGTFRfTklORlRZKQorCisvKiBnU09BUCBlcnJvciBjb2RlcyAqLworCisjZGVmaW5lIFNPQVBfRU9GCQkJRU9GCisjZGVmaW5lIFNPQVBfRVJSCQkJRU9GCisjZGVmaW5lIFNPQVBfT0sJCQkJMAorI2RlZmluZSBTT0FQX0NMSV9GQVVMVAkJCTEKKyNkZWZpbmUgU09BUF9TVlJfRkFVTFQJCQkyCisjZGVmaW5lIFNPQVBfVEFHX01JU01BVENICQkzCisjZGVmaW5lIFNPQVBfVFlQRQkJCTQKKyNkZWZpbmUgU09BUF9TWU5UQVhfRVJST1IJCTUKKyNkZWZpbmUgU09BUF9OT19UQUcJCQk2CisjZGVmaW5lIFNPQVBfSU9CCQkJNworI2RlZmluZSBTT0FQX01VU1RVTkRFUlNUQU5ECQk4CisjZGVmaW5lIFNPQVBfTkFNRVNQQUNFCQkJOQorI2RlZmluZSBTT0FQX1VTRVJfRVJST1IJCQkxMAorI2RlZmluZSBTT0FQX0ZBVEFMX0VSUk9SCQkxMQorI2RlZmluZSBTT0FQX0ZBVUxUCQkJMTIKKyNkZWZpbmUgU09BUF9OT19NRVRIT0QJCQkxMworI2RlZmluZSBTT0FQX0dFVF9NRVRIT0QJCQkxNAorI2RlZmluZSBTT0FQX0VPTQkJCTE1CisjZGVmaW5lIFNPQVBfTlVMTAkJCTE2CisjZGVmaW5lIFNPQVBfRFVQTElDQVRFX0lECQkxNworI2RlZmluZSBTT0FQX01JU1NJTkdfSUQJCQkxOAorI2RlZmluZSBTT0FQX0hSRUYJCQkxOQorI2RlZmluZSBTT0FQX1VEUF9FUlJPUgkJCTIwCisjZGVmaW5lIFNPQVBfVENQX0VSUk9SCQkJMjEKKyNkZWZpbmUgU09BUF9IVFRQX0VSUk9SCQkJMjIKKyNkZWZpbmUgU09BUF9TU0xfRVJST1IJCQkyMworI2RlZmluZSBTT0FQX1pMSUJfRVJST1IJCQkyNAorI2RlZmluZSBTT0FQX0RJTUVfRVJST1IJCQkyNQorI2RlZmluZSBTT0FQX0RJTUVfSFJFRgkJCTI2CisjZGVmaW5lIFNPQVBfRElNRV9NSVNNQVRDSAkJMjcKKyNkZWZpbmUgU09BUF9ESU1FX0VORAkJCTI4CisjZGVmaW5lIFNPQVBfTUlNRV9FUlJPUgkJCTI5CisjZGVmaW5lIFNPQVBfTUlNRV9IUkVGCQkJMzAKKyNkZWZpbmUgU09BUF9NSU1FX0VORAkJCTMxCisjZGVmaW5lIFNPQVBfVkVSU0lPTk1JU01BVENICQkzMgorI2RlZmluZSBTT0FQX1BMVUdJTl9FUlJPUgkJMzMKKyNkZWZpbmUgU09BUF9EQVRBRU5DT0RJTkdVTktOT1dOCTM0CisjZGVmaW5lIFNPQVBfUkVRVUlSRUQJCQkzNQorI2RlZmluZSBTT0FQX1BST0hJQklURUQJCQkzNgorI2RlZmluZSBTT0FQX09DQ1VSUwkJCTM3CisjZGVmaW5lIFNPQVBfTEVOR1RICQkJMzgKKworI2RlZmluZSBzb2FwX3htbF9lcnJvcl9jaGVjayhlKSAoKGUpID09IFNPQVBfVEFHX01JU01BVENIIHx8IChlKSA9PSBTT0FQX1RBR19FTkQgfHwgKGUpID09IFNPQVBfU1lOVEFYX0VSUk9SIHx8IChlKSA9PSBTT0FQX05BTUVTUEFDRSB8fCAoZSkgPT0gU09BUF9EVVBMSUNBVEVfSUQgfHwgKGUpID09IFNPQVBfTUlTU0lOR19JRCB8fCAoZSkgPT0gU09BUF9SRVFVSVJFRCB8fCAoZSkgPT0gU09BUF9QUk9ISUJJVEVEIHx8IChlKSA9PSBTT0FQX09DQ1VSUyB8fCAoZSkgPT0gU09BUF9MRU5HVEggfHwgKGUpID09IFNPQVBfTlVMTCB8fCAoZSkgPT0gU09BUF9IUkVGKQorI2RlZmluZSBzb2FwX3NvYXBfZXJyb3JfY2hlY2soZSkgKChlKSA9PSBTT0FQX0NMSV9GQVVMVCB8fCAoZSkgPT0gU09BUF9TVlJfRkFVTFQgfHwgKGUpID09IFNPQVBfVkVSU0lPTk1JU01BVENIIHx8IChlKSA9PSBTT0FQX01VU1RVTkRFUlNUQU5EIHx8IChlKSA9PSBTT0FQX0ZBVUxUIHx8IChlKSA9PSBTT0FQX05PX01FVEhPRCkKKyNkZWZpbmUgc29hcF90Y3BfZXJyb3JfY2hlY2soZSkgKChlKSA9PSBTT0FQX0VPRiB8fCAoZSkgPT0gU09BUF9UQ1BfRVJST1IpCisjZGVmaW5lIHNvYXBfc3NsX2Vycm9yX2NoZWNrKGUpICgoZSkgPT0gU09BUF9TU0xfRVJST1IpCisjZGVmaW5lIHNvYXBfemxpYl9lcnJvcl9jaGVjayhlKSAoKGUpID09IFNPQVBfWkxJQl9FUlJPUikKKyNkZWZpbmUgc29hcF9odHRwX2Vycm9yX2NoZWNrKGUpICgoZSkgPT0gU09BUF9IVFRQX0VSUk9SIHx8IChlKSA9PSBTT0FQX0dFVF9NRVRIT0QgfHwgKChlKSA+PSAxMDAgJiYgKGUpIDwgNjAwKSkKKworLyogZ1NPQVAgSFRUUCByZXNwb25zZSBzdGF0dXMgY29kZXMgMTAwIHRvIDU5OSBhcmUgcmVzZXJ2ZWQgKi8KKworLyogQ29kZXMgNjAwIHRvIDk5OSBhcmUgdXNlciBkZWZpbmFibGUgKi8KKworLyogRXhjZXB0aW9uYWwgZ1NPQVAgSFRUUCByZXNwb25zZSBzdGF0dXMgY29kZXMgPj0gMTAwMCAqLworCisjZGVmaW5lIFNPQVBfU1RPUAkJMTAwMAkvKiBObyBIVFRQIHJlc3BvbnNlICovCisjZGVmaW5lIFNPQVBfRk9STQkJMTAwMQkvKiBGb3JtIHJlcXVlc3QvcmVzcG9uc2UgKi8KKyNkZWZpbmUgU09BUF9IVE1MCQkxMDAyCS8qIEN1c3RvbSBIVE1MIHJlc3BvbnNlICovCisjZGVmaW5lIFNPQVBfRklMRQkJMTAwMwkvKiBDdXN0b20gZmlsZS1iYXNlZCByZXNwb25zZSAqLworCisvKiBnU09BUCBIVFRQIG1ldGhvZCBjb2RlcyAqLworCisjZGVmaW5lIFNPQVBfUE9TVAkJMjAwMAorI2RlZmluZSBTT0FQX0dFVAkJMjAwMQorCisvKiBnU09BUCBESU1FICovCisKKyNkZWZpbmUgU09BUF9ESU1FX0NGCQkweDAxCisjZGVmaW5lIFNPQVBfRElNRV9NRQkJMHgwMgorI2RlZmluZSBTT0FQX0RJTUVfTUIJCTB4MDQKKyNkZWZpbmUgU09BUF9ESU1FX1ZFUlNJT04JMHgwOCAvKiBESU1FIHZlcnNpb24gMSAqLworI2RlZmluZSBTT0FQX0RJTUVfTUVESUEJCTB4MTAKKyNkZWZpbmUgU09BUF9ESU1FX0FCU1VSSQkweDIwCisKKy8qIGdTT0FQIFpMSUIgKi8KKworI2RlZmluZSBTT0FQX1pMSUJfTk9ORQkJMHgwMAorI2RlZmluZSBTT0FQX1pMSUJfREVGTEFURQkweDAxCisjZGVmaW5lIFNPQVBfWkxJQl9JTkZMQVRFCTB4MDIKKyNkZWZpbmUgU09BUF9aTElCX0daSVAJCTB4MDIKKworLyogZ1NPQVAgdHJhbnNwb3J0LCBjb25uZWN0aW9uLCBhbmQgY29udGVudCBlbmNvZGluZyBtb2RlcyAqLworCit0eXBlZGVmIHNvYXBfaW50MzIgc29hcF9tb2RlOworCisjZGVmaW5lIFNPQVBfSU8JCQkweDAwMDAwMDAzCS8qIElPIG1hc2sgKi8KKyNkZWZpbmUgU09BUF9JT19GTFVTSAkJMHgwMDAwMDAwMAkvKiBmbHVzaCBvdXRwdXQgaW1tZWRpYXRlbHksIG5vIGJ1ZmZlcmluZyAqLworI2RlZmluZSBTT0FQX0lPX0JVRkZFUgkJMHgwMDAwMDAwMQkvKiBidWZmZXIgb3V0cHV0IGluIHBhY2tldHMgb2Ygc2l6ZSBTT0FQX0JVRkxFTiAqLworI2RlZmluZSBTT0FQX0lPX1NUT1JFCQkweDAwMDAwMDAyCS8qIHN0b3JlIGVudGlyZSBvdXRwdXQgdG8gZGV0ZXJtaW5lIGxlbmd0aCBmb3IgdHJhbnNwb3J0ICovCisjZGVmaW5lIFNPQVBfSU9fQ0hVTksJCTB4MDAwMDAwMDMJLyogdXNlIEhUVFAgY2h1bmtlZCB0cmFuc2ZlciBBTkQgYnVmZmVyIHBhY2tldHMgKi8KKworI2RlZmluZSBTT0FQX0lPX1VEUAkJMHgwMDAwMDAwNAorI2RlZmluZSBTT0FQX0lPX0xFTkdUSAkJMHgwMDAwMDAwOAorI2RlZmluZSBTT0FQX0lPX0tFRVBBTElWRQkweDAwMDAwMDEwCisKKyNkZWZpbmUgU09BUF9FTkNfTEFUSU4JCTB4MDA4MDAwMjAJLyogaXNvLTg4NTktMSBlbmNvZGluZyAqLworI2RlZmluZSBTT0FQX0VOQ19YTUwJCTB4MDAwMDAwNDAJLyogcGxhaW4gWE1MIGVuY29kaW5nLCBubyBIVFRQIGhlYWRlciAqLworI2RlZmluZSBTT0FQX0VOQ19ESU1FCQkweDAwMDAwMDgwCisjZGVmaW5lIFNPQVBfRU5DX01JTUUJCTB4MDAwMDAxMDAKKyNkZWZpbmUgU09BUF9FTkNfTVRPTQkJMHgwMDAwMDIwMAorI2RlZmluZSBTT0FQX0VOQ19aTElCCQkweDAwMDAwNDAwCisjZGVmaW5lIFNPQVBfRU5DX1NTTAkJMHgwMDAwMDgwMAorCisjZGVmaW5lIFNPQVBfRU5DCQkweDAwMDAwRkZGCS8qIElPIGFuZCBFTkMgbWFzayAqLworCisjZGVmaW5lIFNPQVBfWE1MX1NUUklDVAkJMHgwMDAwMTAwMAkvKiBzdHJpY3QgdmFsaWRhdGlvbiAqLworI2RlZmluZSBTT0FQX1hNTF9JTkRFTlQJCTB4MDAwMDIwMDAKKyNkZWZpbmUgU09BUF9YTUxfQ0FOT05JQ0FMCTB4MDAwMDQwMDAJLyogRVhDIEMxNE4gY2Fub25pY2FsIFhNTCAqLworI2RlZmluZSBTT0FQX1hNTF9UUkVFCQkweDAwMDA4MDAwCisjZGVmaW5lIFNPQVBfWE1MX0dSQVBICQkweDAwMDEwMDAwCisjZGVmaW5lIFNPQVBfWE1MX05JTAkJMHgwMDAyMDAwMAorI2RlZmluZSBTT0FQX1hNTF9ET00JCTB4MDAwNDAwMDAKKyNkZWZpbmUgU09BUF9YTUxfU0VDCQkweDAwMDgwMDAwCS8qIHJlc2VydmVkIGZvciBXUyBzZWN1cml0eSAqLworCisjZGVmaW5lIFNPQVBfQ19OT0lPQgkJMHgwMDEwMDAwMAorI2RlZmluZSBTT0FQX0NfVVRGU1RSSU5HCTB4MDAyMDAwMDAKKyNkZWZpbmUgU09BUF9DX01CU1RSSU5HCQkweDAwNDAwMDAwCisKKyNkZWZpbmUgU09BUF9ET01fVFJFRQkJMHgwMTAwMDAwMAorI2RlZmluZSBTT0FQX0RPTV9OT0RFCQkweDAyMDAwMDAwCisjZGVmaW5lIFNPQVBfRE9NX0FTSVMJCTB4MDQwMDAwMDAKKworI2RlZmluZSBTT0FQX0lPX0RFRkFVTFQJCVNPQVBfSU9fRkxVU0gKKworLyogU1NMIGNsaWVudC9zZXJ2ZXIgYXV0aGVudGljYXRpb24gc2V0dGluZ3MgKi8KKworI2RlZmluZSBTT0FQX1NTTF9OT19BVVRIRU5USUNBVElPTgkJMHgwMAkvKiBmb3IgdGVzdGluZyBwdXJwb3NlcyAqLworI2RlZmluZSBTT0FQX1NTTF9SRVFVSVJFX1NFUlZFUl9BVVRIRU5USUNBVElPTgkweDAxCS8qIGNsaWVudCByZXF1aXJlcyBzZXJ2ZXIgdG8gYXV0aGVudGljYXRlICovCisjZGVmaW5lIFNPQVBfU1NMX1JFUVVJUkVfQ0xJRU5UX0FVVEhFTlRJQ0FUSU9OCTB4MDIJLyogc2VydmVyIHJlcXVpcmVzIGNsaWVudCB0byBhdXRoZW50aWNhdGUgKi8KKworI2RlZmluZSBTT0FQX1NTTF9ERUZBVUxUCQkJU09BUF9TU0xfUkVRVUlSRV9TRVJWRVJfQVVUSEVOVElDQVRJT04KKworLyogc3RhdGUgKi8KKworI2RlZmluZSBTT0FQX0lOSVQJMQorI2RlZmluZSBTT0FQX0NPUFkJMgorCisjZGVmaW5lIHNvYXBfY2hlY2tfc3RhdGUoc29hcCkgKCEoc29hcCkgfHwgKChzb2FwKS0+c3RhdGUgIT0gU09BUF9JTklUICYmIChzb2FwKS0+c3RhdGUgIT0gU09BUF9DT1BZKSkKKworLyogcGFydCAqLworCisjZGVmaW5lIFNPQVBfQkVHSU4JCTAKKyNkZWZpbmUgU09BUF9JTl9FTlZFTE9QRQkyCisjZGVmaW5lIFNPQVBfSU5fSEVBREVSCQkzCisjZGVmaW5lIFNPQVBfRU5EX0hFQURFUgkJNAorI2RlZmluZSBTT0FQX05PX0JPRFkJCTUKKyNkZWZpbmUgU09BUF9JTl9CT0RZCQk2CisjZGVmaW5lIFNPQVBfRU5EX0JPRFkJCTcKKyNkZWZpbmUgU09BUF9FTkRfRU5WRUxPUEUJOAorI2RlZmluZSBTT0FQX0VORAkJOQorI2RlZmluZSBTT0FQX0JFR0lOX1NFQ1VSSVRZCTEwCisjZGVmaW5lIFNPQVBfSU5fU0VDVVJJVFkJMTEKKyNkZWZpbmUgU09BUF9FTkRfU0VDVVJJVFkJMTIKKworLyogREVCVUcgbWFjcm9zICovCisKKyNpZm5kZWYgV0lUSF9MRUFOCisjIGlmZGVmIERFQlVHCisjICBpZm5kZWYgU09BUF9ERUJVRworIyAgIGRlZmluZSBTT0FQX0RFQlVHCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBTT0FQX0RFQlVHCisjIGRlZmluZSBTT0FQX01BTExPQyhzb2FwLCBzaXplKSBzb2FwX3RyYWNrX21hbGxvYyhzb2FwLCBfX0ZJTEVfXywgX19MSU5FX18sIHNpemUpCisjIGRlZmluZSBTT0FQX0ZSRUUoc29hcCwgcHRyKSBzb2FwX3RyYWNrX2ZyZWUoc29hcCwgX19GSUxFX18sIF9fTElORV9fLCBwdHIpCisjZW5kaWYKKworI2lmbmRlZiBTT0FQX01BTExPQwkJCS8qIHVzZSBsaWJjIG1hbGxvYyAqLworIyBkZWZpbmUgU09BUF9NQUxMT0Moc29hcCwgc2l6ZSkgbWFsbG9jKHNpemUpCisjZW5kaWYKKworI2lmbmRlZiBTT0FQX0ZSRUUJCQkvKiB1c2UgbGliYyBmcmVlICovCisjIGRlZmluZSBTT0FQX0ZSRUUoc29hcCwgcHRyKSBmcmVlKHB0cikKKyNlbmRpZgorCisjaWZkZWYgU09BUF9ERUJVRworIyBpZm5kZWYgU09BUF9NRVNTQUdFCisjICBkZWZpbmUgU09BUF9NRVNTQUdFIGZwcmludGYKKyMgZW5kaWYKKyMgaWZuZGVmIERCR0xPRworIyAgZGVmaW5lIERCR0xPRyhEQkdGSUxFLCBDTUQpIFwKK3sgaWYgKHNvYXApXAorICB7IGlmICghc29hcC0+ZmRlYnVnW1NPQVBfSU5ERVhfIyNEQkdGSUxFXSlcCisgICAgICBzb2FwX29wZW5fbG9nZmlsZSgoc3RydWN0IHNvYXAqKXNvYXAsIFNPQVBfSU5ERVhfIyNEQkdGSUxFKTtcCisgICAgaWYgKHNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYXyMjREJHRklMRV0pXAorICAgIHsgRklMRSAqZmRlYnVnID0gc29hcC0+ZmRlYnVnW1NPQVBfSU5ERVhfIyNEQkdGSUxFXTtcCisgICAgICBDTUQ7XAorICAgICAgZmZsdXNoKGZkZWJ1Zyk7XAorICAgIH1cCisgIH1cCit9CisjIGVuZGlmCisjIGlmbmRlZiBEQkdNU0cKKyMgIGRlZmluZSBEQkdNU0coREJHRklMRSwgTVNHLCBMRU4pIFwKK3sgaWYgKHNvYXApXAorICB7IGlmICghc29hcC0+ZmRlYnVnW1NPQVBfSU5ERVhfIyNEQkdGSUxFXSlcCisgICAgICBzb2FwX29wZW5fbG9nZmlsZSgoc3RydWN0IHNvYXAqKXNvYXAsIFNPQVBfSU5ERVhfIyNEQkdGSUxFKTtcCisgICAgaWYgKHNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYXyMjREJHRklMRV0pXAorICAgIHsgZndyaXRlKChNU0cpLCAxLCAoTEVOKSwgc29hcC0+ZmRlYnVnW1NPQVBfSU5ERVhfIyNEQkdGSUxFXSk7XAorICAgICAgZmZsdXNoKHNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYXyMjREJHRklMRV0pO1wKKyAgICB9XAorICB9XAorfQorIyBlbmRpZgorIyBpZm5kZWYgREdCRlVOCisjICBkZWZpbmUgREJHRlVOKEZOQU1FKSBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIiVzKCVkKTogJXMoKVxuIiwgX19GSUxFX18sIF9fTElORV9fLCBGTkFNRSkpCisjICBkZWZpbmUgREJHRlVOMShGTkFNRSwgRk1ULCBBUkcpIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiJXMoJWQpOiAlcygiRk1UIilcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgRk5BTUUsIChBUkcpKSkKKyMgIGRlZmluZSBEQkdGVU4yKEZOQU1FLCBGTVQxLCBBUkcxLCBGTVQyLCBBUkcyKSBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIiVzKCVkKTogJXMoIkZNVDEiLCAiRk1UMiIpXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIEZOQU1FLCAoQVJHMSksIChBUkcyKSkpCisjICBkZWZpbmUgREJHRlVOMyhGTkFNRSwgRk1UMSwgQVJHMSwgRk1UMiwgQVJHMiwgRk1UMywgQVJHMykgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIlcyglZCk6ICVzKCJGTVQxIiwgIkZNVDIiLCAiRk1UMyIpXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIEZOQU1FLCAoQVJHMSksIChBUkcyKSwgKEFSRzMpKSkKKyMgZW5kaWYKKyMgaWZuZGVmIERCR0hFWAorIyAgZGVmaW5lIERCR0hFWChEQkdGSUxFLCBNU0csIExFTikgXAoreyBpZiAoc29hcClcCisgIHsgaWYgKCFzb2FwLT5mZGVidWdbU09BUF9JTkRFWF8jI0RCR0ZJTEVdKVwKKyAgICAgIHNvYXBfb3Blbl9sb2dmaWxlKHNvYXAsIFNPQVBfSU5ERVhfIyNEQkdGSUxFKTtcCisgICAgaWYgKHNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYXyMjREJHRklMRV0pXAorICAgIHsgaW50IGk7IGNoYXIgKnM7XAorICAgICAgZm9yIChzID0gKGNoYXIqKShNU0cpLCBpID0gKExFTik7IGk7IGktLSlcCisgICAgICAgIGZwcmludGYoc29hcC0+ZmRlYnVnW1NPQVBfSU5ERVhfIyNEQkdGSUxFXSwgIiUyLjJoaFggICIsICpzKyspO1wKKyAgICAgIGZmbHVzaChzb2FwLT5mZGVidWdbU09BUF9JTkRFWF8jI0RCR0ZJTEVdKTtcCisgICAgfVwKKyAgfVwKK30KKyMgZW5kaWYKKyNlbHNlCisjIGRlZmluZSBEQkdMT0coREJHRklMRSwgQ01EKQorIyBkZWZpbmUgREJHTVNHKERCR0ZJTEUsIE1TRywgTEVOKQorIyBkZWZpbmUgREJHRlVOKEZOQU1FKQorIyBkZWZpbmUgREJHRlVOMShGTkFNRSwgRk1ULCBBUkcpCisjIGRlZmluZSBEQkdGVU4yKEZOQU1FLCBGTVQxLCBBUkcxLCBGTVQyLCBBUkcyKQorIyBkZWZpbmUgREJHRlVOMyhGTkFNRSwgRk1UMSwgQVJHMSwgRk1UMiwgQVJHMiwgRk1UMywgQVJHMykKKyMgZGVmaW5lIERCR0hFWChEQkdGSUxFLCBNU0csIExFTikKKyNlbmRpZgorCisvKiBVQ1MtNCByZXF1aXJlcyAzMiBiaXRzICgwLTdGRkZGRkZGLCB0aGUgc2lnbiBiaXQgaXMgdXNlZCBieSBnU09BUCB0byBkaXN0aW5ndWlzaCBYTUwgZW50aXRpZXMpICovCit0eXBlZGVmIHNvYXBfaW50MzIgc29hcF93Y2hhcjsKKworLyogbmFtZXNwYWNlIHRhYmxlIHJvdyAqLworc3RydWN0IE5hbWVzcGFjZQoreyBjb25zdCBjaGFyICppZDsKKyAgY29uc3QgY2hhciAqbnM7CisgIGNvbnN0IGNoYXIgKmluOworICBjaGFyICpvdXQ7Cit9OworCisvKiBuYW1lc3BhY2Ugc3RhY2sgKi8KK3N0cnVjdCBzb2FwX25saXN0Cit7IHN0cnVjdCBzb2FwX25saXN0ICpuZXh0OworICB1bnNpZ25lZCBpbnQgbGV2ZWw7IC8qIG5lc3RpbmcgZGVwdGggbGV2ZWwgKi8KKyAgc2hvcnQgaW5kZXg7IC8qIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gbnMgbWFwcGluZyB0YWJsZSAqLworICBjaGFyICpuczsgLyogb25seSBzZXQgd2hlbiBwYXJzZWQgbnMgVVJJIGlzIG5vdCBpbiB0aGUgbnMgbWFwcGluZyB0YWJsZSAqLworICBjaGFyIGlkWzFdOyAvKiB0aGUgYWN0dWFsIHN0cmluZyB2YWx1ZSBmbG93cyBpbnRvIHRoZSBhbGxvY2F0ZWQgcmVnaW9uIGJlbG93IHRoaXMgc3RydWN0ICovCit9OworCisvKiBibG9jayBzdGFjayBmb3IgbmVzdGVkIGJsb2NrIGFsbG9jYXRpb25zICovCitzdHJ1Y3Qgc29hcF9ibGlzdAoreyBzdHJ1Y3Qgc29hcF9ibGlzdCAqbmV4dDsKKyAgY2hhciAqcHRyOworICBzaXplX3Qgc2l6ZTsKK307CisKKy8qIGFycmF5IGxheW91dCAqLworc3RydWN0IHNvYXBfYXJyYXkKK3sgdm9pZCAqX19wdHI7CisgIGludCBfX3NpemU7Cit9OworCisvKiBwb2ludGVyIHNlcmlhbGl6YXRpb24gbWFuYWdlbWVudCAqLworc3RydWN0IHNvYXBfcGxpc3QKK3sgc3RydWN0IHNvYXBfcGxpc3QgKm5leHQ7CisgIGNvbnN0IHZvaWQgKnB0cjsKKyAgY29uc3Qgc3RydWN0IHNvYXBfYXJyYXkgKmFycmF5OworICBpbnQgdHlwZTsKKyAgaW50IGlkOworICBjaGFyIG1hcmsxOworICBjaGFyIG1hcmsyOworfTsKKworLyogYmxvY2sgYWxsb2NhdGlvbiBmb3IgcG9pbnRlciBzZXJpYWxpemF0aW9uIG1hbmFnZW1lbnQgKi8KK3N0cnVjdCBzb2FwX3BibGsKK3sgc3RydWN0IHNvYXBfcGJsayAqbmV4dDsKKyAgc3RydWN0IHNvYXBfcGxpc3QgcGxpc3RbU09BUF9QVFJCTEtdOworfTsKKworI2lmZGVmIFNPQVBfREVCVUcKKy8qIG1hbGxvYy9mcmVlIHRyYWNraW5nIGZvciBkZWJ1Z2dpbmcgKi8KK3N0cnVjdCBzb2FwX21saXN0Cit7IHN0cnVjdCBzb2FwX21saXN0ICpuZXh0OworICBjb25zdCB2b2lkICpwdHI7CisgIGNvbnN0IGNoYXIgKmZpbGU7CisgIGludCBsaW5lOworICBzaG9ydCBsaXZlOworfTsKKyNlbmRpZgorCisvKiBjbGFzcyBhbGxvY2F0aW9uIGxpc3QgKi8KK3N0cnVjdCBzb2FwX2NsaXN0Cit7IHN0cnVjdCBzb2FwX2NsaXN0ICpuZXh0OworICB2b2lkICpwdHI7CisgIGludCB0eXBlOworICBpbnQgc2l6ZTsKKyAgdm9pZCAoKmZkZWxldGUpKHN0cnVjdCBzb2FwX2NsaXN0Kik7Cit9OworCisvKiBhdHRyaWJ1dGVzICovCitzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUKK3sgc3RydWN0IHNvYXBfYXR0cmlidXRlICpuZXh0OworICBjaGFyICp2YWx1ZTsKKyAgc2l6ZV90IHNpemU7CisgIGNoYXIgKm5zOworICBzaG9ydCB2aXNpYmxlOworICBjaGFyIG5hbWVbMV07IC8qIHRoZSBhY3R1YWwgbmFtZSBzdHJpbmcgZmxvd3MgaW50byB0aGUgYWxsb2NhdGVkIHJlZ2lvbiBiZWxvdyB0aGlzIHN0cnVjdCAqLworfTsKKworc3RydWN0IHNvYXBfY29va2llCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqbmV4dDsKKyAgY2hhciAqbmFtZTsKKyAgY2hhciAqdmFsdWU7CisgIGNoYXIgKmRvbWFpbjsKKyAgY2hhciAqcGF0aDsKKyAgbG9uZyBleHBpcmU7CQkvKiBjbGllbnQtc2lkZTogbG9jYWwgdGltZSB0byBleHBpcmU7IHNlcnZlci1zaWRlOiBzZWNvbmRzIHRvIGV4cGlyZSAqLworICB1bnNpZ25lZCBpbnQgdmVyc2lvbjsKKyAgc2hvcnQgc2VjdXJlOworICBzaG9ydCBzZXNzaW9uOwkvKiBzZXJ2ZXItc2lkZSAqLworICBzaG9ydCBlbnY7CQkvKiBzZXJ2ZXItc2lkZTogZ290IGNvb2tpZSBmcm9tIGNsaWVudCBhbmQgc2hvdWxkIG5vdCBiZSAocmUpc2VuZCAqLworICBzaG9ydCBtb2RpZmllZDsJLyogc2VydmVyLXNpZGU6IGNsaWVudCBjb29raWUgd2FzIG1vZGlmaWVkIGFuZCBzaG91bGQgYmUgc2VuZCAqLworfTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitTT0FQX0ZNQUMxIHN0cnVjdCBzb2FwX211bHRpcGFydCogU09BUF9GTUFDMiBzb2FwX25leHRfbXVsdGlwYXJ0KHN0cnVjdCBzb2FwX211bHRpcGFydCopOworCitjbGFzcyBzb2FwX211bHRpcGFydF9pdGVyYXRvcgoreyBwdWJsaWM6CisgIHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHNvYXBfbXVsdGlwYXJ0X2l0ZXJhdG9yJiBpdGVyKSBjb25zdAorICAgIHsgcmV0dXJuIGNvbnRlbnQgPT0gaXRlci5jb250ZW50OyB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBzb2FwX211bHRpcGFydF9pdGVyYXRvciYgaXRlcikgY29uc3QKKyAgICB7IHJldHVybiBjb250ZW50ICE9IGl0ZXIuY29udGVudDsgfQorICBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgJm9wZXJhdG9yKigpIGNvbnN0CisgICAgeyByZXR1cm4gKmNvbnRlbnQ7IH0KKyAgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3IgJm9wZXJhdG9yKysoKQorICAgIHsgY29udGVudCA9IHNvYXBfbmV4dF9tdWx0aXBhcnQoY29udGVudCk7IHJldHVybiAqdGhpczsgfQorICBzb2FwX211bHRpcGFydF9pdGVyYXRvcigpIDogY29udGVudChOVUxMKQorICAgIHsgfQorICBzb2FwX211bHRpcGFydF9pdGVyYXRvcihzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKnApIDogY29udGVudChwKQorICAgIHsgfQorfTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTkVSCitzdHJ1Y3Qgc29hcF9kaW1lCit7IHNpemVfdCBjb3VudDsKKyAgc2l6ZV90IHNpemU7CisgIHNpemVfdCBjaHVua3NpemU7CisgIHNpemVfdCBidWZsZW47CisgIGNoYXIgZmxhZ3M7CisgIGNoYXIgKnB0cjsKKyAgY29uc3QgY2hhciAqaWQ7CisgIGNvbnN0IGNoYXIgKnR5cGU7CisgIGNvbnN0IGNoYXIgKm9wdGlvbnM7CisgIHN0cnVjdCBzb2FwX211bHRpcGFydCAqbGlzdDsJCS8qIGxpc3Qgb2YgRElNRSBhdHRhY2htZW50cyByZWNlaXZlZCAqLworICBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmZpcnN0LCAqbGFzdDsJLyogdGVtcG9yYXJ5IGluL291dCBxdWV1ZSAqLworI2lmZGVmIF9fY3BsdXNwbHVzCisgIHNvYXBfbXVsdGlwYXJ0X2l0ZXJhdG9yIGJlZ2luKCkKKyAgICB7IHNvYXBfbXVsdGlwYXJ0X2l0ZXJhdG9yIGl0ZXIobGlzdCk7IHJldHVybiBpdGVyOyB9OworICBzb2FwX211bHRpcGFydF9pdGVyYXRvciBlbmQoKQorICAgIHsgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3IgaXRlcihOVUxMKTsgcmV0dXJuIGl0ZXI7IH07CisjZW5kaWYKK307CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU5FUgorc3RydWN0IHNvYXBfbWltZQoreyBjaGFyICpib3VuZGFyeTsJCQkvKiBNSU1FIGJvdW5kYXJ5ICovCisgIGNvbnN0IGNoYXIgKnN0YXJ0OwkJCS8qIE1JTUUgc3RhcnQgSUQgKi8KKyAgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpsaXN0OwkJLyogbGlzdCBvZiBNSU1FIGF0dGFjaG1lbnRzIHJlY2VpdmVkICovCisgIHN0cnVjdCBzb2FwX211bHRpcGFydCAqZmlyc3QsICpsYXN0OwkvKiB0ZW1wb3JhcnkgaW4vb3V0IHF1ZXVlICovCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3IgYmVnaW4oKQorICAgIHsgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3IgaXRlcihsaXN0KTsgcmV0dXJuIGl0ZXI7IH07CisgIHNvYXBfbXVsdGlwYXJ0X2l0ZXJhdG9yIGVuZCgpCisgICAgeyBzb2FwX211bHRpcGFydF9pdGVyYXRvciBpdGVyKE5VTEwpOyByZXR1cm4gaXRlcjsgfTsKKyNlbmRpZgorfTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTkVSCisvKiBSRkMyMDQ1IE1JTUUgY29udGVudCB0cmFuc2ZlciBlbmNvZGluZ3MgKi8KK2VudW0gc29hcF9taW1lX2VuY29kaW5nCit7IFNPQVBfTUlNRV9OT05FLAorICBTT0FQX01JTUVfN0JJVCwKKyAgU09BUF9NSU1FXzhCSVQsCisgIFNPQVBfTUlNRV9CSU5BUlksCisgIFNPQVBfTUlNRV9RVU9URURfUFJJTlRBQkxFLAorICBTT0FQX01JTUVfQkFTRTY0LAorICBTT0FQX01JTUVfSUVURl9UT0tFTiwKKyAgU09BUF9NSU1FX1hfVE9LRU4KK307CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU5FUgorLyogRElNRS9NSU1FIG11bHRpcGFydCBsaXN0ICovCitzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQKK3sgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpuZXh0OworICBjaGFyICpwdHI7CQkJCS8qIHBvaW50cyB0byByYXcgZGF0YSBjb250ZW50ICovCisgIHNpemVfdCBzaXplOwkJCQkvKiBzaXplIG9mIGRhdGEgY29udGVudCAqLworICBjb25zdCBjaGFyICppZDsJCQkvKiBESU1FL01JTUUgY29udGVudCBJRCBvciBmb3JtIGRhdGEgbmFtZSAqLworICBjb25zdCBjaGFyICp0eXBlOwkJCS8qIERJTUUvTUlNRSB0eXBlIChNSU1FIHR5cGUgZm9ybWF0KSAqLworICBjb25zdCBjaGFyICpvcHRpb25zOwkJCS8qIERJTUUgb3B0aW9ucyAqLworICBlbnVtIHNvYXBfbWltZV9lbmNvZGluZyBlbmNvZGluZzsJLyogTUlNRSBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nICovCisgIGNvbnN0IGNoYXIgKmxvY2F0aW9uOwkJCS8qIE1JTUUgQ29udGVudC1Mb2NhdGlvbiAob3B0aW9uYWwpICovCisgIGNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uOwkJLyogTUlNRSBDb250ZW50LURlc2NyaXB0aW9uIChvcHRpb25hbCkgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworICB0eXBlZGVmIHNvYXBfbXVsdGlwYXJ0X2l0ZXJhdG9yIGl0ZXJhdG9yOworI2VuZGlmCit9OworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKKy8qIGF0dGFjaG1lbnQgRElNRSBhbmQgTVRPTSBYT1AgZm9yd2FyZGluZyAqLworc3RydWN0IHNvYXBfeGxpc3QKK3sgc3RydWN0IHNvYXBfeGxpc3QgKm5leHQ7CisgIHVuc2lnbmVkIGNoYXIgKipwdHI7CisgIGludCAqc2l6ZTsKKyAgY2hhciAqaWQ7CisgIGNoYXIgKip0eXBlOworICBjaGFyICoqb3B0aW9uczsKK307CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmZGVmIF9fY3BsdXNwbHVzCitjbGFzcyBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IKK3sgcHVibGljOgorICBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICphdHQ7CisgIGNvbnN0IGNoYXIgKm5zdHI7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3ImKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvciYpIGNvbnN0OworICBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICZvcGVyYXRvciooKSBjb25zdDsKKyAgc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yICZvcGVyYXRvcisrKCk7CisgIHNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcigpOworICBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3Ioc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSopOworICB+c29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yKCk7Cit9OworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU5FUgorc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZQoreyBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICpuZXh0OworICBjb25zdCBjaGFyICpuc3RyOworICBjaGFyICpuYW1lOworICBjaGFyICpkYXRhOworICB3Y2hhcl90ICp3aWRlOworICBzdHJ1Y3Qgc29hcCAqc29hcDsKKyNpZmRlZiBfX2NwbHVzcGx1cworICB0eXBlZGVmIHNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvciBpdGVyYXRvcjsKKyAgc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAmc2V0KGNvbnN0IGNoYXIgKm5zdHIsIGNvbnN0IGNoYXIgKm5hbWUpOwkvKiBzZXQgbmFtZXNwYWNlIGFuZCBuYW1lICovCisgIHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgJnNldChjb25zdCBjaGFyICpkYXRhKTsJCS8qIHNldCBkYXRhICovCisgIHNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvciBiZWdpbigpOworICBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IgZW5kKCk7CisgIHNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvciBmaW5kKGNvbnN0IGNoYXIgKm5zdHIsIGNvbnN0IGNoYXIgKm5hbWUpOworICB2b2lkIHVubGluaygpOworICBzb2FwX2RvbV9hdHRyaWJ1dGUoKTsKKyAgc29hcF9kb21fYXR0cmlidXRlKHN0cnVjdCBzb2FwICpzb2FwKTsKKyAgc29hcF9kb21fYXR0cmlidXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuc3RyLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkYXRhKTsKKyAgfnNvYXBfZG9tX2F0dHJpYnV0ZSgpOworI2VuZGlmCit9OworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZmRlZiBfX2NwbHVzcGx1cworY2xhc3Mgc29hcF9kb21fZWxlbWVudF9pdGVyYXRvcgoreyBwdWJsaWM6CisgIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICplbHQ7CisgIGNvbnN0IGNoYXIgKm5zdHI7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGludCB0eXBlOworICBib29sIG9wZXJhdG9yPT0oY29uc3Qgc29hcF9kb21fZWxlbWVudF9pdGVyYXRvciYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3Qgc29hcF9kb21fZWxlbWVudF9pdGVyYXRvciYpIGNvbnN0OworICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAmb3BlcmF0b3IqKCkgY29uc3Q7CisgIHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IgJm9wZXJhdG9yKysoKTsKKyAgc29hcF9kb21fZWxlbWVudF9pdGVyYXRvcigpOworICBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yKHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50Kik7CisgIH5zb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yKCk7Cit9OworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU5FUgorc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQKK3sgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKm5leHQ7CS8qIG5leHQgc2libGluZyAqLworICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqcHJudDsJLyogcGFyZW50ICovCisgIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICplbHRzOwkvKiBsaXN0IG9mIGNoaWxkIGVsZW1lbnRzICovCisgIHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgKmF0dHM7CS8qIGxpc3Qgb2YgYXR0cmlidXRlcyAqLworICBjb25zdCBjaGFyICpuc3RyOwkJCS8qIG5hbWVzcGFjZSBzdHJpbmcgKi8KKyAgY2hhciAqbmFtZTsJCQkJLyogZWxlbWVudCB0YWcgbmFtZSAqLworICBjaGFyICpkYXRhOwkJCQkvKiBlbGVtZW50IGNvbnRlbnQgZGF0YSAod2l0aCBTT0FQX0NfVVRGU1RSSU5HIGZsYWcgc2V0KSAqLworICB3Y2hhcl90ICp3aWRlOwkJCS8qIGVsZW1lbnQgY29udGVudCBkYXRhICovCisgIGludCB0eXBlOwkJCQkvKiBvcHRpb25hbDogc2VyaWFsaXplZCBDL0MrKyBkYXRhIHR5cGUgKi8KKyAgdm9pZCAqbm9kZTsJCQkJLyogb3B0aW9uYWw6IHBvaW50ZXIgdG8gc2VyaWFsaXplZCBDL0MrKyBkYXRhICovCisgIGNoYXIgKmhlYWQ7CQkJCS8qIGxlYWRpbmcgd2hpdGVzcGFjZSB0byBzdGFydCB0YWcgKi8KKyAgY2hhciAqdGFpbDsJCQkJLyogbGVhZGluZyB3aGl0ZXNwYWNlIHRvIGVuZCB0YWcgKi8KKyAgc3RydWN0IHNvYXAgKnNvYXA7CQkJLyogc29hcCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIG5vZGUgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworICB0eXBlZGVmIHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IgaXRlcmF0b3I7CisgIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICZzZXQoY29uc3QgY2hhciAqbnN0ciwgY29uc3QgY2hhciAqbmFtZSk7CisgIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICZzZXQoY29uc3QgY2hhciAqZGF0YSk7CisgIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICZzZXQodm9pZCAqbm9kZSwgaW50IHR5cGUpOworICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAmYWRkKHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50Kik7CisgIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICZhZGQoc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQmKTsKKyAgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgJmFkZChzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlKik7CisgIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICZhZGQoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSYpOworICBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yIGJlZ2luKCk7CisgIHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IgZW5kKCk7CisgIHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IgZmluZChjb25zdCBjaGFyICpuc3RyLCBjb25zdCBjaGFyICpuYW1lKTsKKyAgc29hcF9kb21fZWxlbWVudF9pdGVyYXRvciBmaW5kKGludCB0eXBlKTsKKyAgdm9pZCB1bmxpbmsoKTsKKyAgc29hcF9kb21fZWxlbWVudCgpOworICBzb2FwX2RvbV9lbGVtZW50KHN0cnVjdCBzb2FwICpzb2FwKTsKKyAgc29hcF9kb21fZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbnN0ciwgY29uc3QgY2hhciAqbmFtZSk7CisgIHNvYXBfZG9tX2VsZW1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5zdHIsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRhdGEpOworICBzb2FwX2RvbV9lbGVtZW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuc3RyLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpub2RlLCBpbnQgdHlwZSk7CisgIH5zb2FwX2RvbV9lbGVtZW50KCk7CisjZW5kaWYKK307CitTT0FQX0ZNQUMxIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICogU09BUF9GTUFDMiBzb2FwX2RvbV9uZXh0X2VsZW1lbnQoc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKmVsdCk7CitTT0FQX0ZNQUMxIHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgKiBTT0FQX0ZNQUMyIHNvYXBfZG9tX25leHRfYXR0cmlidXRlKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgKmF0dCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpICYmICFkZWZpbmVkKFdJVEhfTEVBTikKK30KK2V4dGVybiBzdGQ6Om9zdHJlYW0gJm9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiwgY29uc3Qgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQmKTsKK2V4dGVybiBzdGQ6OmlzdHJlYW0gJm9wZXJhdG9yPj4oc3RkOjppc3RyZWFtJiwgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQmKTsKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBzb2FwCit7IHNob3J0IHN0YXRlOwkJCS8qIDAgPSB1bmluaXRpYWxpemVkLCAxID0gaW5pdGlhbGl6ZWQsIDIgPSBjb3B5IG9mIGFub3RoZXIgc29hcCBzdHJ1Y3QgKi8KKyAgc2hvcnQgdmVyc2lvbjsJCS8qIDEgPSBTT0FQMS4xIGFuZCAyID0gU09BUDEuMiAoc2V0IGF1dG9tYXRpY2FsbHkgZnJvbSBuYW1lc3BhY2UgVVJJIGluIG5zbWFwIHRhYmxlKSAqLworICBzb2FwX21vZGUgbW9kZTsKKyAgc29hcF9tb2RlIGltb2RlOworICBzb2FwX21vZGUgb21vZGU7CisgIGNvbnN0IGNoYXIgKmZsb2F0X2Zvcm1hdDsJLyogdXNlci1kZWZpbmFibGUgZm9ybWF0IHN0cmluZyBmb3IgZmxvYXRzICg8MTAyNCBjaGFycykgKi8KKyAgY29uc3QgY2hhciAqZG91YmxlX2Zvcm1hdDsJLyogdXNlci1kZWZpbmFibGUgZm9ybWF0IHN0cmluZyBmb3IgZG91YmxlcyAoPDEwMjQgY2hhcnMpICovCisgIGNvbnN0IGNoYXIgKmRpbWVfaWRfZm9ybWF0OwkvKiB1c2VyLWRlZmluYWJsZSBmb3JtYXQgc3RyaW5nIGZvciBpbnRlZ2VyIERJTUUgaWQgKDxTT0FQX1RBR0xFTiBjaGFycykgKi8KKyAgY29uc3QgY2hhciAqaHR0cF92ZXJzaW9uOwkvKiBIVFRQIHZlcnNpb24gdXNlZCAiMS4wIiBvciAiMS4xIiAqLworICBjb25zdCBjaGFyICpodHRwX2NvbnRlbnQ7CS8qIG9wdGlvbmFsIGN1c3RvbSByZXNwb25zZSBjb250ZW50IHR5cGUgKHdpdGggU09BUF9GSUxFKSAqLworICBjb25zdCBjaGFyICplbmNvZGluZ1N0eWxlOwkvKiBkZWZhdWx0ID0gTlVMTCB3aGljaCBtZWFucyB0aGF0IFNPQVAgZW5jb2RpbmcgaXMgdXNlZCAqLworICBjb25zdCBjaGFyICphY3RvcjsJCS8qIFNPQVAtRU5WOmFjdG9yIG9yIHJvbGUgYXR0cmlidXRlIHZhbHVlICovCisgIGludCByZWN2X3RpbWVvdXQ7CQkvKiB3aGVuID4gMCwgZ2l2ZXMgc29ja2V0IHJlY3YgdGltZW91dCBpbiBzZWNvbmRzLCA8IDAgaW4gdXNlYyAqLworICBpbnQgc2VuZF90aW1lb3V0OwkJLyogd2hlbiA+IDAsIGdpdmVzIHNvY2tldCBzZW5kIHRpbWVvdXQgaW4gc2Vjb25kcywgPCAwIGluIHVzZWMgKi8KKyAgaW50IGNvbm5lY3RfdGltZW91dDsJCS8qIHdoZW4gPiAwLCBnaXZlcyBzb2NrZXQgY29ubmVjdCgpIHRpbWVvdXQgaW4gc2Vjb25kcywgPCAwIGluIHVzZWMgKi8KKyAgaW50IGFjY2VwdF90aW1lb3V0OwkJLyogd2hlbiA+IDAsIGdpdmVzIHNvY2tldCBhY2NlcHQoKSB0aW1lb3V0IGluIHNlY29uZHMsIDwgMCBpbiB1c2VjICovCisgIGludCBzb2NrZXRfZmxhZ3M7CQkvKiBzb2NrZXQgcmVjdigpIGFuZCBzZW5kKCkgZmxhZ3MsIGUuZy4gc2V0IHRvIE1TR19OT1NJR05BTCB0byBkaXNhYmxlIHNpZ3BpcGUgKi8KKyAgaW50IGNvbm5lY3RfZmxhZ3M7CQkvKiBjb25uZWN0KCkgU09MX1NPQ0tFVCBzb2Nrb3B0IGZsYWdzLCBlLmcuIHNldCB0byBTT19ERUJVRyB0byBkZWJ1ZyBzb2NrZXQgKi8KKyAgaW50IGJpbmRfZmxhZ3M7CQkvKiBiaW5kKCkgU09MX1NPQ0tFVCBzb2Nrb3B0IGZsYWdzLCBlLmcuIHNldCB0byBTT19SRVVTRUFERFIgdG8gZW5hYmxlIHJldXNlICovCisgIGludCBhY2NlcHRfZmxhZ3M7CQkvKiBhY2NlcHQoKSBTT0xfU09DS0VUIHNvY2tvcHQgZmxhZ3MgKi8KKyAgY29uc3Qgc3RydWN0IE5hbWVzcGFjZSAqbmFtZXNwYWNlczsJLyogUG9pbnRlciB0byBnbG9iYWwgbmFtZXNwYWNlIG1hcHBpbmcgdGFibGUgKi8KKyAgc3RydWN0IE5hbWVzcGFjZSAqbG9jYWxfbmFtZXNwYWNlczsJLyogTG9jYWwgbmFtZXNwYWNlIG1hcHBpbmcgdGFibGUgKi8KKyAgc3RydWN0IHNvYXBfbmxpc3QgKm5saXN0OwkvKiBuYW1lc3BhY2Ugc3RhY2sgKi8KKyAgc3RydWN0IHNvYXBfYmxpc3QgKmJsaXN0OwkvKiBibG9jayBhbGxvY2F0aW9uIHN0YWNrICovCisgIHN0cnVjdCBzb2FwX2NsaXN0ICpjbGlzdDsJLyogY2xhc3MgaW5zdGFuY2UgYWxsb2NhdGlvbiBsaXN0ICovCisgIHZvaWQgKmFsaXN0OwkJCS8qIG1lbW9yeSBhbGxvY2F0aW9uIChtYWxsb2MpIGxpc3QgKi8KKyAgc3RydWN0IHNvYXBfaWxpc3QgKmlodFtTT0FQX0lESEFTSF07CisgIHN0cnVjdCBzb2FwX3BsaXN0ICpwaHRbU09BUF9QVFJIQVNIXTsKKyAgc3RydWN0IHNvYXBfcGJsayAqcGJsazsJLyogcGxpc3QgYmxvY2sgYWxsb2NhdGlvbiAqLworICBzaG9ydCBwaWR4OwkJCS8qIHBsaXN0IGJsb2NrIGFsbG9jYXRpb24gKi8KKyAgc3RydWN0IFNPQVBfRU5WX19IZWFkZXIgKmhlYWRlcjsKKyAgc3RydWN0IFNPQVBfRU5WX19GYXVsdCAqZmF1bHQ7CisgIGludCBpZG51bTsKKyAgdm9pZCAqdXNlcjsJCQkvKiB0byBwYXNzIHVzZXItZGVmaW5lZCBkYXRhICovCisgIHN0cnVjdCBzb2FwX3BsdWdpbiAqcGx1Z2luczsJLyogbGlua2VkIGxpc3Qgb2YgcGx1Zy1pbiBkYXRhICovCisgIGNoYXIgKnVzZXJpZDsJCQkvKiBIVFRQIEJhc2ljIGF1dGhvcml6YXRpb24gdXNlcmlkICovCisgIGNoYXIgKnBhc3N3ZDsJCQkvKiBIVFRQIEJhc2ljIGF1dGhvcml6YXRpb24gcGFzc3dkICovCisgIGludCAoKmZwb3N0KShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCk7CisgIGludCAoKmZnZXQpKHN0cnVjdCBzb2FwKik7CisgIGludCAoKmZmb3JtKShzdHJ1Y3Qgc29hcCopOworICBpbnQgKCpmcG9zdGhkcikoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworICBpbnQgKCpmcmVzcG9uc2UpKHN0cnVjdCBzb2FwKiwgaW50LCBzaXplX3QpOworICBpbnQgKCpmcGFyc2UpKHN0cnVjdCBzb2FwKik7CisgIGludCAoKmZwYXJzZWhkcikoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworICBpbnQgKCpmcmVzb2x2ZSkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RydWN0IGluX2FkZHIqIGluYWRkcik7CisgIGludCAoKmZjb25uZWN0KShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgaW50KTsKKyAgaW50ICgqZmRpc2Nvbm5lY3QpKHN0cnVjdCBzb2FwKik7CisgIGludCAoKmZjbG9zZXNvY2tldCkoc3RydWN0IHNvYXAqLCBTT0FQX1NPQ0tFVCk7CisgIGludCAoKmZzaHV0ZG93bnNvY2tldCkoc3RydWN0IHNvYXAqLCBTT0FQX1NPQ0tFVCwgaW50KTsKKyAgaW50ICgqZm9wZW4pKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBpbnQpOworICBpbnQgKCpmYWNjZXB0KShzdHJ1Y3Qgc29hcCosIGludCwgc3RydWN0IHNvY2thZGRyKiwgaW50ICpuKTsKKyAgaW50ICgqZmNsb3NlKShzdHJ1Y3Qgc29hcCopOworICBpbnQgKCpmc2VuZCkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc2l6ZV90KTsKKyAgc2l6ZV90ICgqZnJlY3YpKHN0cnVjdCBzb2FwKiwgY2hhciosIHNpemVfdCk7CisgIGludCAoKmZwb2xsKShzdHJ1Y3Qgc29hcCopOworICB2b2lkICgqZnNldGVycm9yKShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKipjLCBjb25zdCBjaGFyICoqcyk7CisgIGludCAoKmZpZ25vcmUpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworICBpbnQgKCpmc2VydmVsb29wKShzdHJ1Y3Qgc29hcCopOworICB2b2lkICooKmZwbHVnaW4pKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpbnQgKCpmcHJlcGFyZWluaXQpKHN0cnVjdCBzb2FwKik7CisgIGludCAoKmZwcmVwYXJlc2VuZCkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc2l6ZV90KTsKKyAgaW50ICgqZnByZXBhcmVyZWN2KShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworICBpbnQgKCpmcHJlcGFyZWZpbmFsKShzdHJ1Y3Qgc29hcCopOworICB2b2lkICooKmZkaW1lcmVhZG9wZW4pKHN0cnVjdCBzb2FwKiwgdm9pZCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworICB2b2lkICooKmZkaW1ld3JpdGVvcGVuKShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworICB2b2lkICgqZmRpbWVyZWFkY2xvc2UpKHN0cnVjdCBzb2FwKiwgdm9pZCopOworICB2b2lkICgqZmRpbWV3cml0ZWNsb3NlKShzdHJ1Y3Qgc29hcCosIHZvaWQqKTsKKyAgc2l6ZV90ICgqZmRpbWVyZWFkKShzdHJ1Y3Qgc29hcCosIHZvaWQqLCBjaGFyKiwgc2l6ZV90KTsKKyAgaW50ICgqZmRpbWV3cml0ZSkoc3RydWN0IHNvYXAqLCB2b2lkKiwgY29uc3QgY2hhciosIHNpemVfdCk7CisjZW5kaWYKKyAgaW50IG1hc3RlcjsKKyAgaW50IHNvY2tldDsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiAhZGVmaW5lZChXSVRIX0xFQU4pCisgIHN0ZDo6b3N0cmVhbSAqb3M7CisgIHN0ZDo6aXN0cmVhbSAqaXM7CisjZWxzZQorICB2b2lkICpvczsJLyogcHJlc2VydmUgYWxpZ25tZW50ICovCisgIHZvaWQgKmlzOwkvKiBwcmVzZXJ2ZSBhbGlnbm1lbnQgKi8KKyNlbmRpZgorI2lmbmRlZiBVTkRFUl9DRQorICBpbnQgc2VuZGZkOworICBpbnQgcmVjdmZkOworI2Vsc2UKKyAgRklMRSAqc2VuZGZkOworICBGSUxFICpyZWN2ZmQ7CisjZW5kaWYKKyNpZmRlZiBXSU4zMgorICBjaGFyIGVycm9yc3RyWzI1Nl07CS8qIGJ1ZiBmb3IgRm9ybWF0TWVzc2FnZSgpICovCisjZW5kaWYKKyAgc2l6ZV90IGJ1ZmlkeDsJLyogaW5kZXggaW4gc29hcC5idWZbXSAqLworICBzaXplX3QgYnVmbGVuOwkvKiBsZW5ndGggb2Ygc29hcC5idWZbXSBjb250ZW50ICovCisgIHNvYXBfd2NoYXIgYWhlYWQ7CS8qIHBhcnNlciBsb29rYWhlYWQgKi8KKyAgc2hvcnQgY2RhdGE7CQkvKiBDREFUQSBwYXJzZXIgc3RhdGUgKi8KKyAgc2hvcnQgYm9keTsJCS8qIHBhcnNlZCBYTUwgZWxlbWVudCBoYXMgYSBib2R5IG9yIG5vdCAqLworICB1bnNpZ25lZCBpbnQgbGV2ZWw7CS8qIFhNTCBuZXN0aW5nIGxldmVsICovCisgIHNpemVfdCBjb3VudDsJCS8qIG1lc3NhZ2UgbGVuZ3RoIGNvdW50ZXIgKi8KKyAgc2l6ZV90IGxlbmd0aDsJLyogbWVzc2FnZSBsZW5ndGggYXMgc2V0IGJ5IEhUVFAgaGVhZGVyICovCisjaWZkZWYgV0lUSF9GQVNUCisgIGNoYXIgKmxhYmJ1ZjsJCS8qIGxvb2stYXNpZGUgYnVmZmVyICovCisgIHNpemVfdCBsYWJsZW47CS8qIGxvb2stYXNpZGUgYnVmZmVyIGFsbG9jYXRlZCBsZW5ndGggKi8KKyAgc2l6ZV90IGxhYmlkeDsJLyogbG9vay1hc2lkZSBidWZmZXIgaW5kZXggdG8gYXZhaWxhYmxlIHBhcnQgKi8KKyNlbmRpZgorICBjaGFyIGJ1ZltTT0FQX0JVRkxFTl07Lyogc2VuZCBhbmQgcmVjZWl2ZSBidWZmZXIgKi8KKyAgY2hhciB0bXBidWZbMTAyNF07CS8qIGluL291dHB1dCBidWZmZXIgZm9yIEhUVFAgaGVhZGVycywgc2ltcGxlVHlwZSB2YWx1ZXMsIGF0dHJpYnV0ZSBuYW1lcywgYW5kIERJTUUgPj0xMDI0IGJ5dGVzICovCisgIGNoYXIgbXNnYnVmWzEwMjRdOwkvKiBvdXRwdXQgYnVmZmVyIGZvciAoZXJyb3IpIG1lc3NhZ2VzIDw9MTAyNCBieXRlcyAqLworICBjaGFyIHRhZ1tTT0FQX1RBR0xFTl07CisgIGNoYXIgaWRbU09BUF9UQUdMRU5dOworICBjaGFyIGhyZWZbU09BUF9UQUdMRU5dOworICBjaGFyIHR5cGVbU09BUF9UQUdMRU5dOworICBjaGFyIGFycmF5VHlwZVtTT0FQX1RBR0xFTl07CisgIGNoYXIgYXJyYXlTaXplW1NPQVBfVEFHTEVOXTsKKyAgY2hhciBhcnJheU9mZnNldFtTT0FQX1RBR0xFTl07CisgIHNob3J0IG90aGVyOworICBzaG9ydCBwb3NpdGlvbjsKKyAgaW50IHBvc2l0aW9uc1tTT0FQX01BWERJTVNdOworICBzaG9ydCByb290OworICBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKmF0dHJpYnV0ZXM7CS8qIGF0dHJpYnV0ZSBsaXN0ICovCisgIHNob3J0IGVuY29kaW5nOwkvKiB3aGVuIHNldCwgb3V0cHV0IGVuY29kaW5nU3R5bGUgKi8KKyAgc2hvcnQgbXVzdFVuZGVyc3RhbmQ7CS8qIGEgbXVzdFVuZGVyc3RhbmQgZWxlbWVudCB3YXMgcGFyc2VkIG9yIGlzIG91dHB1dCAqLworICBzaG9ydCBrZWVwX2FsaXZlOwkvKiBjb25uZWN0aW9uIHNob3VsZCBiZSBrZXB0IG9wZW4gKi8KKyAgc2hvcnQgbnVsbDsJCS8qIHBhcnNlZCBYTUwgaXMgeHNpOm5pbCAqLworICBzaG9ydCBuczsJCS8qIHdoZW4gbm90IHNldCwgb3V0cHV0IGZ1bGwgeG1sbnMgYmluZGluZ3MgKi8KKyAgc2hvcnQgcGFydDsJCS8qIHBhcnNpbmcgc3RhdGUgKi8KKyAgc2hvcnQgYWxsb2NlZDsKKyAgc2hvcnQgcGVla2VkOworICBzaXplX3QgY2h1bmtzaXplOworICBzaXplX3QgY2h1bmtidWZsZW47CisgIGNoYXIgZW5kcG9pbnRbU09BUF9UQUdMRU5dOworICBjaGFyIHBhdGhbU09BUF9UQUdMRU5dOworICBjaGFyIGhvc3RbU09BUF9UQUdMRU5dOworICBjaGFyICphY3Rpb247CisgIGNoYXIgKmF1dGhyZWFsbTsJCS8qIEhUVFAgYXV0aGVudGljYXRpb24gcmVhbG0gKi8KKyAgY2hhciAqcHJvbG9nOwkJCS8qIFhNTCBkZWNsYXJhdGlvbiBwcm9sb2cgKi8KKyAgdW5zaWduZWQgbG9uZyBpcDsJCS8qIElQIG51bWJlciAqLworICBpbnQgcG9ydDsJCQkvKiBwb3J0IG51bWJlciAqLworICB1bnNpZ25lZCBpbnQgbWF4X2tlZXBfYWxpdmU7CisgIGNvbnN0IGNoYXIgKnByb3h5X2hvc3Q7CS8qIFByb3h5IFNlcnZlciBob3N0IG5hbWUgKi8KKyAgaW50IHByb3h5X3BvcnQ7CQkvKiBQcm94eSBTZXJ2ZXIgcG9ydCAoZGVmYXVsdCA9IDgwODApICovCisgIGNvbnN0IGNoYXIgKnByb3h5X3VzZXJpZDsJLyogUHJveHkgQXV0aG9yaXphdGlvbiB1c2VyIG5hbWUgKi8KKyAgY29uc3QgY2hhciAqcHJveHlfcGFzc3dkOwkvKiBQcm94eSBBdXRob3JpemF0aW9uIHBhc3N3b3JkICovCisgIGludCBzdGF0dXM7CQkJLyogLTEgd2hlbiByZXF1ZXN0LCBlbHNlIGVycm9yIGNvZGUgdG8gYmUgcmV0dXJuZWQgYnkgc2VydmVyICovCisgIGludCBlcnJvcjsKKyAgaW50IGVycm1vZGU7CisgIGludCBlcnJudW07CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICpkb207CisgIHN0cnVjdCBzb2FwX2RpbWUgZGltZTsKKyAgc3RydWN0IHNvYXBfbWltZSBtaW1lOworICBzdHJ1Y3Qgc29hcF94bGlzdCAqeGxpc3Q7CisjZW5kaWYKKyNpZiAhZGVmaW5lZChXSVRIX0xFQU4pIHx8IGRlZmluZWQoU09BUF9ERUJVRykKKyAgY29uc3QgY2hhciAqbG9nZmlsZVtTT0FQX01BWExPR1NdOworICBGSUxFICpmZGVidWdbU09BUF9NQVhMT0dTXTsKKyAgc3RydWN0IHNvYXBfbWxpc3QgKm1odFtTT0FQX1BUUkhBU0hdOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBjb25zdCBjaGFyICpjMTRuaW5jbHVkZTsKKyAgY29uc3QgY2hhciAqYzE0bmV4Y2x1ZGU7CisgIHN0cnVjdCBzb2FwX2Nvb2tpZSAqY29va2llczsKKyAgY29uc3QgY2hhciAqY29va2llX2RvbWFpbjsKKyAgY29uc3QgY2hhciAqY29va2llX3BhdGg7CisgIGludCBjb29raWVfbWF4OworI2VuZGlmCisjaWZuZGVmIFdJVEhfTk9JTworI2lmZGVmIFdJVEhfSVBWNgorICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBwZWVyOwkvKiBJUHY2OiBzZXQgYnkgc29hcF9hY2NlcHQgYW5kIGJ5IFVEUCByZWN2ICovCisjZWxzZQorICBzdHJ1Y3Qgc29ja2FkZHJfaW4gcGVlcjsJLyogSVB2NDogc2V0IGJ5IHNvYXBfY29ubmVjdC9zb2FwX2FjY2VwdCBhbmQgYnkgVURQIHJlY3YgKi8KKyNlbmRpZgorICBzaXplX3QgcGVlcmxlbjsKKyNlbmRpZgorI2lmZGVmIFdJVEhfT1BFTlNTTAorICBpbnQgKCpmc3NsYXV0aCkoc3RydWN0IHNvYXAqKTsKKyAgaW50ICgqZnNzbHZlcmlmeSkoaW50LCBYNTA5X1NUT1JFX0NUWCopOworICBCSU8gKmJpbzsKKyAgU1NMICpzc2w7CisgIFNTTF9DVFggKmN0eDsKKyAgc2hvcnQgcmVxdWlyZV9zZXJ2ZXJfYXV0aDsKKyAgc2hvcnQgcmVxdWlyZV9jbGllbnRfYXV0aDsKKyAgc2hvcnQgcnNhOwkJCS8qIHdoZW4gc2V0LCB1c2UgUlNBIGluc3RlYWQgb2YgREggKi8KKyAgY29uc3QgY2hhciAqa2V5ZmlsZTsKKyAgY29uc3QgY2hhciAqcGFzc3dvcmQ7CisgIGNvbnN0IGNoYXIgKmRoZmlsZTsKKyAgY29uc3QgY2hhciAqY2FmaWxlOworICBjb25zdCBjaGFyICpjYXBhdGg7CisgIGNvbnN0IGNoYXIgKmNybGZpbGU7CisgIGNvbnN0IGNoYXIgKnJhbmRmaWxlOworICBTU0xfU0VTU0lPTiAqc2Vzc2lvbjsKKyAgY2hhciBzZXNzaW9uX2hvc3RbU09BUF9UQUdMRU5dOworICBpbnQgc2Vzc2lvbl9wb3J0OworI2VuZGlmCisjaWZkZWYgV0lUSF9aTElCCisgIHNob3J0IHpsaWJfc3RhdGU7CQkvKiBTT0FQX1pMSUJfTk9ORSwgU09BUF9aTElCX0RFRkxBVEUsIG9yIFNPQVBfWkxJQl9JTkZMQVRFICovCisgIHNob3J0IHpsaWJfaW47CQkvKiBTT0FQX1pMSUJfTk9ORSwgU09BUF9aTElCX0RFRkxBVEUsIG9yIFNPQVBfWkxJQl9HWklQICovCisgIHNob3J0IHpsaWJfb3V0OwkJLyogU09BUF9aTElCX05PTkUsIFNPQVBfWkxJQl9ERUZMQVRFLCBvciBTT0FQX1pMSUJfR1pJUCAqLworICB6X3N0cmVhbSBkX3N0cmVhbTsJCS8qIGRlY29tcHJlc3Npb24gc3RyZWFtICovCisgIGNoYXIgel9idWZbU09BUF9CVUZMRU5dOwkvKiBidWZmZXIgKi8KKyAgc2l6ZV90IHpfYnVmbGVuOworICB1bnNpZ25lZCBzaG9ydCB6X2xldmVsOwkvKiBjb21wcmVzc2lvbiBsZXZlbCB0byBiZSB1c2VkICgwPW5vbmUsIDE9ZmFzdCB0byA5PWJlc3QpICovCisgIHVMb25nIHpfY3JjOwkJCS8qIGludGVybmFsIGd6aXAgY3JjICovCisgIGZsb2F0IHpfcmF0aW9faW47CQkvKiBkZXRlY3RlZCBjb21wcmVzc2lvbiByYXRpbyBjb21wcmVzc2VkX2xlbmd0aC9sZW5ndGggb2YgaW5ib3VuZCBtZXNzYWdlICovCisgIGZsb2F0IHpfcmF0aW9fb3V0OwkJLyogZGV0ZWN0ZWQgY29tcHJlc3Npb24gcmF0aW8gY29tcHJlc3NlZF9sZW5ndGgvbGVuZ3RoIG9mIG91dGJvdW5kIG1lc3NhZ2UgKi8KKyNlbmRpZgorI2lmZGVmIFdNV19SUE1fSU8KKyAgdm9pZCAqcnBtcmVxaWQ7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgc29hcCgpOworICBzb2FwKHNvYXBfbW9kZSk7CisgIHNvYXAoc29hcF9tb2RlLCBzb2FwX21vZGUpOworICBzb2FwKHN0cnVjdCBzb2FwJik7CisgIH5zb2FwKCk7CisjZW5kaWYKKyNlbmRpZgorfTsKKworc3RydWN0IHNvYXBfY29kZV9tYXAKK3sgbG9uZyBjb2RlOworICBjb25zdCBjaGFyICpzdHJpbmc7Cit9OworCisvKiBmb3J3YXJkaW5nIGxpc3QgKi8KK3N0cnVjdCBzb2FwX2ZsaXN0Cit7IHN0cnVjdCBzb2FwX2ZsaXN0ICpuZXh0OworICBpbnQgdHlwZTsKKyAgdm9pZCAqcHRyOworICB1bnNpZ25lZCBpbnQgbGV2ZWw7CisgIHNpemVfdCBsZW47CisgIHZvaWQgKCpmY29weSkoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIHNpemVfdCwgY29uc3Qgdm9pZCosIHNpemVfdCk7Cit9OworCisvKiBpZC1yZWYgZm9yd2FyZGluZyBsaXN0ICovCitzdHJ1Y3Qgc29hcF9pbGlzdAoreyBzdHJ1Y3Qgc29hcF9pbGlzdCAqbmV4dDsKKyAgaW50IHR5cGU7CisgIHNpemVfdCBzaXplOworICB2b2lkICpsaW5rOworICB2b2lkICpjb3B5OworICBzdHJ1Y3Qgc29hcF9mbGlzdCAqZmxpc3Q7CisgIHZvaWQgKnB0cjsKKyAgdW5zaWduZWQgaW50IGxldmVsOworICBjaGFyIGlkWzFdOyAvKiB0aGUgYWN0dWFsIGlkIHN0cmluZyB2YWx1ZSBmbG93cyBpbnRvIHRoZSBhbGxvY2F0ZWQgcmVnaW9uIGJlbG93IHRoaXMgc3RydWN0ICovCit9OworCitzdHJ1Y3Qgc29hcF9wbHVnaW4KK3sgc3RydWN0IHNvYXBfcGx1Z2luICpuZXh0OworICBjb25zdCBjaGFyICppZDsKKyAgdm9pZCAqZGF0YTsKKyAgaW50ICgqZmNvcHkpKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbHVnaW4gKmRzdCwgc3RydWN0IHNvYXBfcGx1Z2luICpzcmMpOworICB2b2lkICgqZmRlbGV0ZSkoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3BsdWdpbiAqcCk7IC8qIHNob3VsZCBkZWxldGUgZmllbGRzIG9mIHBsdWdpbiBvbmx5IGFuZCBub3QgZnJlZShwKSAqLworfTsKKworI2lmbmRlZiBXSVRIX05PTkFNRVNQQUNFUworZXh0ZXJuIFNPQVBfTk1BQyBzdHJ1Y3QgTmFtZXNwYWNlIG5hbWVzcGFjZXNbXTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTgorIyBkZWZpbmUgc29hcF9nZXQwKHNvYXApICgoKHNvYXApLT5idWZpZHg+PShzb2FwKS0+YnVmbGVuICYmIHNvYXBfcmVjdihzb2FwKSkgPyBFT0YgOiAodW5zaWduZWQgY2hhcikoc29hcCktPmJ1Zlsoc29hcCktPmJ1ZmlkeF0pCisjIGRlZmluZSBzb2FwX2dldDEoc29hcCkgKCgoc29hcCktPmJ1ZmlkeD49KHNvYXApLT5idWZsZW4gJiYgc29hcF9yZWN2KHNvYXApKSA/IEVPRiA6ICh1bnNpZ25lZCBjaGFyKShzb2FwKS0+YnVmWyhzb2FwKS0+YnVmaWR4KytdKQorI2Vsc2UKK3NvYXBfd2NoYXIgc29hcF9nZXQwKHN0cnVjdCBzb2FwKik7Citzb2FwX3djaGFyIHNvYXBfZ2V0MShzdHJ1Y3Qgc29hcCopOworI2VuZGlmCisKKyNkZWZpbmUgc29hcF9yZXZnZXQxKHNvYXApICgoc29hcCktPmJ1ZmlkeC0tKQorI2RlZmluZSBzb2FwX3VuZ2V0KHNvYXAsIGMpICgoc29hcCktPmFoZWFkID0gYykKKyNkZWZpbmUgc29hcF9yZWdpc3Rlcl9wbHVnaW4oc29hcCwgcGx1Z2luKSBzb2FwX3JlZ2lzdGVyX3BsdWdpbl9hcmcoc29hcCwgcGx1Z2luLCBOVUxMKQorI2RlZmluZSBzb2FwX2ltb2RlKHNvYXAsIG4pICgoc29hcCktPm1vZGUgPSAoc29hcCktPmltb2RlID0gKG4pKQorI2RlZmluZSBzb2FwX3NldF9pbW9kZShzb2FwLCBuKSAoKHNvYXApLT5pbW9kZSB8PSAobikpCisjZGVmaW5lIHNvYXBfY2xyX2ltb2RlKHNvYXAsIG4pICgoc29hcCktPmltb2RlICY9IH4obikpCisjZGVmaW5lIHNvYXBfb21vZGUoc29hcCwgbikgKChzb2FwKS0+bW9kZSA9IChzb2FwKS0+b21vZGUgPSAobikpCisjZGVmaW5lIHNvYXBfc2V0X29tb2RlKHNvYXAsIG4pICgoc29hcCktPm9tb2RlIHw9IChuKSkKKyNkZWZpbmUgc29hcF9jbHJfb21vZGUoc29hcCwgbikgKChzb2FwKS0+b21vZGUgJj0gfihuKSkKKyNkZWZpbmUgc29hcF9zZXRfbW9kZShzb2FwLCBuKSAoKHNvYXApLT5pbW9kZSB8PSAobiksIChzb2FwKS0+b21vZGUgfD0gKG4pKQorI2RlZmluZSBzb2FwX2Nscl9tb2RlKHNvYXAsIG4pICgoc29hcCktPmltb2RlICY9IH4obiksIChzb2FwKS0+b21vZGUgJj0gfihuKSkKKyNkZWZpbmUgc29hcF9kZXN0cm95KHNvYXApIHNvYXBfZGVsZXRlKChzb2FwKSwgTlVMTCkKKworI2lmZGVmIEhBVkVfU1RSUkNIUgorIyBkZWZpbmUgc29hcF9zdHJyY2hyKHMsIHQpIHN0cnJjaHIocywgdCkKKyNlbHNlCisgU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfc3RycmNocihjb25zdCBjaGFyICpzLCBpbnQgdCk7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RSVE9MCisjIGRlZmluZSBzb2FwX3N0cnRvbChzLCB0LCBiKSBzdHJ0b2wocywgdCwgYikKKyNlbHNlCisgU09BUF9GTUFDMSBsb25nIFNPQVBfRk1BQzIgc29hcF9zdHJ0b2woY29uc3QgY2hhciAqcywgY2hhciAqKnQsIGludCBiKTsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVFJUT1VMCisjIGRlZmluZSBzb2FwX3N0cnRvdWwocywgdCwgYikgc3RydG91bChzLCB0LCBiKQorI2Vsc2UKKyBTT0FQX0ZNQUMxIHVuc2lnbmVkIGxvbmcgU09BUF9GTUFDMiBzb2FwX3N0cnRvdWwoY29uc3QgY2hhciAqcywgY2hhciAqKnQsIGludCBiKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChXSVRIX09QRU5TU0wpCisjIGRlZmluZSBzb2FwX3JhbmRvbSBzb2FwX3JhbmQoKQorU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3JhbmQoKTsKKyNlbGlmIGRlZmluZWQoSEFWRV9SQU5ET00pCisjIGRlZmluZSBzb2FwX3JhbmRvbSAoaW50KXJhbmRvbSgpCisjZWxzZQorIyBkZWZpbmUgc29hcF9yYW5kb20gcmFuZCgpCisjZW5kaWYKKworI2lmZGVmIFdJVEhfTk9JRFJFRgorIyBkZWZpbmUgc29hcF9lbWJlZGRlZChzLCBwLCB0KSAoMCkKKyMgZGVmaW5lIHNvYXBfaWRfbG9va3VwKHMsIGksIHAsIHQsIG4sIGspIChwKQorIyBkZWZpbmUgc29hcF9pZF9mb3J3YXJkKHMsIGgsIHAsIGxlbiwgc3QsIHR0LCBuLCBrLCBmYykgKHApCisjIGRlZmluZSBzb2FwX3JlZmVyZW5jZShzLCBhLCB0KSAoMSkKKyMgZGVmaW5lIHNvYXBfYXJyYXlfcmVmZXJlbmNlKHMsIHAsIGEsIG4sIHQpICgxKQorIyBkZWZpbmUgc29hcF9lbWJlZChzLCBwLCBhLCBuLCB0LCBwcCkgKDApCisjIGRlZmluZSBzb2FwX2VtYmVkZGVkX2lkKHMsIGksIHAsIHQpIChpKQorIyBkZWZpbmUgc29hcF9pc19lbWJlZGRlZChzLCBwKSAoMCkKKyMgZGVmaW5lIHNvYXBfaXNfc2luZ2xlKHMsIHApICgxKQorIyBkZWZpbmUgc29hcF9sb29rdXBfdHlwZShzLCBpKSAoMCkKKyMgZGVmaW5lIHNvYXBfZ2V0aW5kZXBlbmRlbnQocykgKDApCisjIGRlZmluZSBzb2FwX3B1dGluZGVwZW5kZW50KHMpICgwKQorIyBkZWZpbmUgc29hcF9nZXRlbGVtZW50KHMsIG4pIChuKQorIyBkZWZpbmUgc29hcF9wdXRlbGVtZW50KHMsIHAsIHQsIGksIG4pICgwKQorIyBkZWZpbmUgc29hcF9tYXJrZWxlbWVudChzLCBwLCBuKSAoMCkKKyNlbmRpZgorCitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2ZhdWx0KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqKiBTT0FQX0ZNQUMyIHNvYXBfZmF1bHRjb2RlKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqKiBTT0FQX0ZNQUMyIHNvYXBfZmF1bHRzdWJjb2RlKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqKiBTT0FQX0ZNQUMyIHNvYXBfZmF1bHRzdHJpbmcoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhcioqIFNPQVBfRk1BQzIgc29hcF9mYXVsdGRldGFpbChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXJpYWxpemVoZWFkZXIoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9wdXRoZWFkZXIoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRoZWFkZXIoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfc2VyaWFsaXplZmF1bHQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9wdXRmYXVsdChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2dldGZhdWx0KHN0cnVjdCBzb2FwKik7CisKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfc3NsX2luaXQoKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9wb2xsKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfY29ubmVjdF9jb21tYW5kKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2Nvbm5lY3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2JpbmQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2FjY2VwdChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NzbF9hY2NlcHQoc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NzbF9zZXJ2ZXJfY29udGV4dChzdHJ1Y3Qgc29hcCosIHVuc2lnbmVkIHNob3J0LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc3NsX2NsaWVudF9jb250ZXh0KHN0cnVjdCBzb2FwKiwgdW5zaWduZWQgc2hvcnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9wdXRodHRwaGRyKHN0cnVjdCBzb2FwKiwgaW50IHN0YXR1cywgc2l6ZV90IGNvdW50KTsKKworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfZGVjb2RlX2tleShjaGFyKiwgc2l6ZV90LCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9kZWNvZGVfdmFsKGNoYXIqLCBzaXplX3QsIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDMSBzaXplX3QgU09BUF9GTUFDMiBzb2FwX2hhc2goY29uc3QgY2hhciopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXRfZW5kcG9pbnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZmx1c2hfcmF3KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHNpemVfdCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZmx1c2goc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgc29hcF93Y2hhciBTT0FQX0ZNQUMyIHNvYXBfZ2V0KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHNvYXBfd2NoYXIgU09BUF9GTUFDMiBzb2FwX2dldGNoYXIoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF90YWdfY21wKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NldF9mYXVsdChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NlbmRlcl9mYXVsdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2VuZGVyX2ZhdWx0X3N1YmNvZGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9yZWNlaXZlcl9mYXVsdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcmVjZWl2ZXJfZmF1bHRfc3ViY29kZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGludCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBpbnQpOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2VuZF9yYXcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc2l6ZV90KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9yZWN2X3JhdyhzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3JlY3Yoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZW5kKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NlbmQyKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZW5kMyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0dXRmOChzdHJ1Y3Qgc29hcCosIHVuc2lnbmVkIGxvbmcpOworU09BUF9GTUFDMSBzb2FwX3djaGFyIFNPQVBfRk1BQzIgc29hcF9nZXR1dGY4KHN0cnVjdCBzb2FwKik7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9wdXRiYXNlNjQoc3RydWN0IHNvYXAqLCBjb25zdCB1bnNpZ25lZCBjaGFyKiwgaW50KTsKK1NPQVBfRk1BQzEgdW5zaWduZWQgY2hhciogU09BUF9GTUFDMiBzb2FwX2dldGJhc2U2NChzdHJ1Y3Qgc29hcCosIGludCosIGludCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0aGV4KHN0cnVjdCBzb2FwKiwgY29uc3QgdW5zaWduZWQgY2hhciosIGludCk7CitTT0FQX0ZNQUMxIHVuc2lnbmVkIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9nZXRoZXgoc3RydWN0IHNvYXAqLCBpbnQqKTsKKworI2lmbmRlZiBXSVRIX0xFQU5FUgorU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3hvcF9mb3J3YXJkKHN0cnVjdCBzb2FwKiwgdW5zaWduZWQgY2hhcioqLCBpbnQqLCBjaGFyKiosIGNoYXIqKiwgY2hhcioqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9kaW1lX2ZvcndhcmQoc3RydWN0IHNvYXAqLCB1bnNpZ25lZCBjaGFyKiosIGludCosIGNoYXIqKiwgY2hhcioqLCBjaGFyKiopOworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcG9pbnRlcl9sb29rdXBfaWQoc3RydWN0IHNvYXAqLCB2b2lkICpwLCBpbnQgdCwgc3RydWN0IHNvYXBfcGxpc3QqKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcG9pbnRlcl9sb29rdXAoc3RydWN0IHNvYXAqLCBjb25zdCB2b2lkICpwLCBpbnQgdCwgc3RydWN0IHNvYXBfcGxpc3QqKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcG9pbnRlcl9lbnRlcihzdHJ1Y3Qgc29hcCosIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgbiwgaW50IHQsIHN0cnVjdCBzb2FwX3BsaXN0KiopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2FycmF5X3BvaW50ZXJfbG9va3VwKHN0cnVjdCBzb2FwKiwgY29uc3Qgdm9pZCAqcCwgY29uc3Qgc3RydWN0IHNvYXBfYXJyYXkgKmEsIGludCBuLCBpbnQgdCwgc3RydWN0IHNvYXBfcGxpc3QqKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZW1iZWQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgbiwgY29uc3QgY2hhciAqdGFnLCBpbnQgdHlwZSk7CitTT0FQX0ZNQUMxIHN0cnVjdCBzb2FwX2lsaXN0KiBTT0FQX0ZNQUMyIHNvYXBfbG9va3VwKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcF9pbGlzdCogU09BUF9GTUFDMiBzb2FwX2VudGVyKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3Jlc29sdmUoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfZW1iZWRkZWQoc3RydWN0IHNvYXAqLCBjb25zdCB2b2lkICpwLCBpbnQgdCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcmVmZXJlbmNlKHN0cnVjdCBzb2FwKiwgY29uc3Qgdm9pZCAqcCwgaW50IHQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2FycmF5X3JlZmVyZW5jZShzdHJ1Y3Qgc29hcCosIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgbiwgaW50IHQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VtYmVkZGVkX2lkKHN0cnVjdCBzb2FwKiwgaW50IGlkLCBjb25zdCB2b2lkICpwLCBpbnQgdCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfaXNfZW1iZWRkZWQoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9wbGlzdCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2lzX3NpbmdsZShzdHJ1Y3Qgc29hcCosIHN0cnVjdCBzb2FwX3BsaXN0Kik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NldF9lbWJlZGRlZChzdHJ1Y3Qgc29hcCosIHN0cnVjdCBzb2FwX3BsaXN0Kik7CisjZW5kaWYKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2JlZ2luX2NvdW50KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZW5kX2NvdW50KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfYmVnaW5fc2VuZChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VuZF9zZW5kKHN0cnVjdCBzb2FwKik7CisKK1NPQVBfRk1BQzEgY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAqIFNPQVBfRk1BQzIgc29hcF9jb2RlKGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwKiwgY29uc3QgY2hhciAqc3RyKTsKK1NPQVBfRk1BQzEgbG9uZyBTT0FQX0ZNQUMyIHNvYXBfaW50X2NvZGUoY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAqLCBjb25zdCBjaGFyICpzdHIsIGxvbmcgb3RoZXIpOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfc3RyX2NvZGUoY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAqLCBsb25nIGNvZGUpOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZ2V0bGluZShzdHJ1Y3Qgc29hcCosIGNoYXIqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2JlZ2luX3JlY3Yoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbmRfcmVjdihzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIHZvaWQqIFNPQVBfRk1BQzIgc29hcF9tYWxsb2Moc3RydWN0IHNvYXAqLCBzaXplX3QpOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9kZWFsbG9jKHN0cnVjdCBzb2FwKiwgdm9pZCopOworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcF9jbGlzdCAqIFNPQVBfRk1BQzIgc29hcF9saW5rKHN0cnVjdCBzb2FwKiwgdm9pZCosIGludCwgaW50LCB2b2lkICgqZmRlbGV0ZSkoc3RydWN0IHNvYXBfY2xpc3QqKSk7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3VubGluayhzdHJ1Y3Qgc29hcCosIGNvbnN0IHZvaWQqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfZnJlZShzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIHZvaWQqIFNPQVBfRk1BQzIgc29hcF90cmFja19tYWxsb2Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBzaXplX3QpOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF90cmFja19mcmVlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgdm9pZCopOworCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2xvb2t1cF90eXBlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqaWQpOworU09BUF9GTUFDMSB2b2lkKiBTT0FQX0ZNQUMyIHNvYXBfaWRfbG9va3VwKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqaWQsIHZvaWQgKipwLCBpbnQgdCwgc2l6ZV90IG4sIHVuc2lnbmVkIGludCBrKTsKK1NPQVBfRk1BQzEgdm9pZCogU09BUF9GTUFDMiBzb2FwX2lkX2ZvcndhcmQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICppZCwgdm9pZCAqcCwgc2l6ZV90IGxlbiwgaW50IHN0LCBpbnQgdHQsIHNpemVfdCBuLCB1bnNpZ25lZCBpbnQgaywgdm9pZCgqZmNvcHkpKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBzaXplX3QsIGNvbnN0IHZvaWQqLCBzaXplX3QpKTsKKyNlbmRpZgorU09BUF9GTUFDMSB2b2lkKiBTT0FQX0ZNQUMyIHNvYXBfaWRfZW50ZXIoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICppZCwgdm9pZCAqcCwgaW50IHQsIHNpemVfdCBuLCB1bnNpZ25lZCBpbnQgaywgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqYXJyYXlUeXBlLCB2b2lkICooKmZpbnN0YW50aWF0ZSkoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90KikpOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9mY29weShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0LCBpbnQgdHQsIHZvaWQgKnAsIHNpemVfdCwgY29uc3Qgdm9pZCAqcSwgc2l6ZV90IG4pOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2l6ZShjb25zdCBpbnQgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRvZmZzZXRzKGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGludCAqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2dldHNpemUoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRzaXplcyhjb25zdCBjaGFyICosIGludCAqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2dldHBvc2l0aW9uKGNvbnN0IGNoYXIgKiwgaW50ICopOworCitTT0FQX0ZNQUMxIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9wdXRzaXplKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfcHV0c2l6ZXNvZmZzZXRzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGludCk7CitTT0FQX0ZNQUMxIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9wdXRzaXplcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGludCk7CitTT0FQX0ZNQUMxIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9wdXRvZmZzZXQoc3RydWN0IHNvYXAqLCBpbnQpOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfcHV0b2Zmc2V0cyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGludCAqLCBpbnQpOworIAorU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2Nsb3Nlc29jayhzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIHN0cnVjdCBzb2FwICpTT0FQX0ZNQUMyIHNvYXBfbmV3KHZvaWQpOworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcCAqU09BUF9GTUFDMiBzb2FwX25ldzEoc29hcF9tb2RlKTsKK1NPQVBfRk1BQzEgc3RydWN0IHNvYXAgKlNPQVBfRk1BQzIgc29hcF9uZXcyKHNvYXBfbW9kZSwgc29hcF9tb2RlKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfZGVsKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHN0cnVjdCBzb2FwICpTT0FQX0ZNQUMyIHNvYXBfY29weShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcCAqU09BUF9GTUFDMiBzb2FwX2NvcHlfY29udGV4dChzdHJ1Y3Qgc29hcCosIHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2luaXQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfaW5pdDEoc3RydWN0IHNvYXAqLCBzb2FwX21vZGUpOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9pbml0MihzdHJ1Y3Qgc29hcCosIHNvYXBfbW9kZSwgc29hcF9tb2RlKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfZG9uZShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9jbGVhbnVwKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2JlZ2luKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2VuZChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9kZWxldGUoc3RydWN0IHNvYXAqLCB2b2lkKik7CisKKyNpZmRlZiBTT0FQX0RFQlVHCitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NldF9yZWN2X2xvZ2ZpbGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NldF9zZW50X2xvZ2ZpbGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NldF90ZXN0X2xvZ2ZpbGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2Nsb3NlX2xvZ2ZpbGVzKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX29wZW5fbG9nZmlsZShzdHJ1Y3Qgc29hcCosIGludCk7CisjZW5kaWYKKworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfdG9rZW4oc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX3ZhbHVlKHN0cnVjdCBzb2FwKik7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9tYXRjaF90YWcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9tYXRjaF9hcnJheShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgY2hhciAqdHlwZSk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfYXJyYXlfYmVnaW5fb3V0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKm9mZnNldCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZWxlbWVudF9yZWYoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgaW50IGhyZWYpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfaHJlZihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICpyZWYsIGNvbnN0IGNoYXIgKnZhbCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZWxlbWVudF9udWxsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnR5cGUpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfaWQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgdm9pZCAqcCwgY29uc3Qgc3RydWN0IHNvYXBfYXJyYXkgKmEsIGludCBkLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZWxlbWVudF9yZXN1bHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfZW5kX291dChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZyk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2F0dHJpYnV0ZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbGVtZW50X2JlZ2luX2luKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgbmlsbGFibGUpOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZWxlbWVudF9lbmRfaW4oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcpOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcGVla19lbGVtZW50KHN0cnVjdCBzb2FwKik7CisKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfcmV0cnkoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfcmV2ZXJ0KHN0cnVjdCBzb2FwKik7CisKK1NPQVBfRk1BQzEgY2hhciogU09BUF9GTUFDMiBzb2FwX3N0cmR1cChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciAqIFNPQVBfRk1BQzIgc29hcF9zdHJzZWFyY2goY29uc3QgY2hhciAqYmlnLCBjb25zdCBjaGFyICpsaXR0bGUpOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc3RyaW5nX291dChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnMsIGludCBmbGFnKTsKK1NPQVBfRk1BQzEgY2hhciogU09BUF9GTUFDMiBzb2FwX3N0cmluZ19pbihzdHJ1Y3Qgc29hcCosIGludCwgbG9uZywgbG9uZyk7CisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF93c3RyaW5nX291dChzdHJ1Y3Qgc29hcCosIGNvbnN0IHdjaGFyX3QgKnMsIGludCBmbGFnKTsKK1NPQVBfRk1BQzEgd2NoYXJfdCogU09BUF9GTUFDMiBzb2FwX3dzdHJpbmdfaW4oc3RydWN0IHNvYXAqLCBpbnQsIGxvbmcsIGxvbmcpOworI2VuZGlmCisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9tYXRjaF9uYW1lc3BhY2Uoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIqLCBpbnQgbjEsIGludCBuMik7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZXRfbmFtZXNwYWNlcyhzdHJ1Y3Qgc29hcCosIHN0cnVjdCBOYW1lc3BhY2UqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfc2V0X2xvY2FsX25hbWVzcGFjZXMoc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9wb3BfbmFtZXNwYWNlKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHVzaF9uYW1lc3BhY2Uoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX2N1cnJlbnRfbmFtZXNwYWNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcpOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc3RvcmVfbGFiKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHNpemVfdCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfYXBwZW5kX2xhYihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfbmV3X2Jsb2NrKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQqIFNPQVBfRk1BQzIgc29hcF9wdXNoX2Jsb2NrKHN0cnVjdCBzb2FwKiwgc2l6ZV90KTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfcG9wX2Jsb2NrKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHNpemVfdCBTT0FQX0ZNQUMyIHNvYXBfc2l6ZV9ibG9jayhzdHJ1Y3Qgc29hcCosIHNpemVfdCk7CitTT0FQX0ZNQUMxIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9maXJzdF9ibG9jayhzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfbmV4dF9ibG9jayhzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBzaXplX3QgU09BUF9GTUFDMiBzb2FwX2Jsb2NrX3NpemUoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgY2hhciogU09BUF9GTUFDMiBzb2FwX3NhdmVfYmxvY2soc3RydWN0IHNvYXAqLCBjaGFyKiwgaW50KTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfZW5kX2Jsb2NrKHN0cnVjdCBzb2FwKik7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbnZlbG9wZV9iZWdpbl9vdXQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IHNvYXBfZW52ZWxvcGVfZW5kX291dChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZW52ZWxvcGVfYmVnaW5faW4oc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbnZlbG9wZV9lbmRfaW4oc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2JvZHlfYmVnaW5fb3V0KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfYm9keV9lbmRfb3V0KHN0cnVjdCBzb2FwKik7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9ib2R5X2JlZ2luX2luKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfYm9keV9lbmRfaW4oc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3JlY3ZfaGVhZGVyKHN0cnVjdCBzb2FwKik7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9yZXNwb25zZShzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZW5kX2VtcHR5X3Jlc3BvbnNlKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcmVjdl9lbXB0eV9yZXNwb25zZShzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2VuZF9mYXVsdChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3JlY3ZfZmF1bHQoc3RydWN0IHNvYXAqKTsKKworI2lmbmRlZiBXSVRIX05PU1RETElCCitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3ByaW50X2ZhdWx0KHN0cnVjdCBzb2FwKiwgRklMRSopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9wcmludF9mYXVsdF9sb2NhdGlvbihzdHJ1Y3Qgc29hcCosIEZJTEUqKTsKKyNlbmRpZgorCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfczJieXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zMnNob3J0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHNob3J0Kik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfczJpbnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50Kik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfczJsb25nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGxvbmcqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zMkxPTkc2NChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBMT05HNjQqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zMmZsb2F0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGZsb2F0Kik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfczJkb3VibGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgZG91YmxlKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfczJ1bnNpZ25lZEJ5dGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdW5zaWduZWQgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MydW5zaWduZWRTaG9ydChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1bnNpZ25lZCBzaG9ydCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MydW5zaWduZWRJbnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdW5zaWduZWQgaW50Kik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfczJ1bnNpZ25lZExvbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdW5zaWduZWQgbG9uZyopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MyVUxPTkc2NChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBVTE9ORzY0Kik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfczJzdHJpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY2hhcioqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zMlFOYW1lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNoYXIqKik7CisKKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfczJ3Y2hhcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB3Y2hhcl90KiopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MyZGF0ZVRpbWUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdGltZV90Kik7CitTT0FQX0ZNQUMxIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9zMmJhc2U2NChzdHJ1Y3Qgc29hcCosIGNvbnN0IHVuc2lnbmVkIGNoYXIqLCBjaGFyKiwgaW50KTsKK1NPQVBfRk1BQzEgY2hhciogU09BUF9GTUFDMiBzb2FwX3MyaGV4KHN0cnVjdCBzb2FwKiwgY29uc3QgdW5zaWduZWQgY2hhciosIGNoYXIqLCBpbnQpOworI2VuZGlmCisKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX2J5dGUycyhzdHJ1Y3Qgc29hcCosIGNoYXIpOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfc2hvcnQycyhzdHJ1Y3Qgc29hcCosIHNob3J0KTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX2ludDJzKHN0cnVjdCBzb2FwKiwgaW50KTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX2xvbmcycyhzdHJ1Y3Qgc29hcCosIGxvbmcpOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfTE9ORzY0MnMoc3RydWN0IHNvYXAqLCBMT05HNjQpOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfZmxvYXQycyhzdHJ1Y3Qgc29hcCosIGZsb2F0KTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX2RvdWJsZTJzKHN0cnVjdCBzb2FwKiwgZG91YmxlKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX3Vuc2lnbmVkQnl0ZTJzKHN0cnVjdCBzb2FwKiwgdW5zaWduZWQgY2hhcik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF91bnNpZ25lZFNob3J0MnMoc3RydWN0IHNvYXAqLCB1bnNpZ25lZCBzaG9ydCk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF91bnNpZ25lZEludDJzKHN0cnVjdCBzb2FwKiwgdW5zaWduZWQgaW50KTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX3Vuc2lnbmVkTG9uZzJzKHN0cnVjdCBzb2FwKiwgdW5zaWduZWQgbG9uZyk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9VTE9ORzY0MnMoc3RydWN0IHNvYXAqLCBVTE9ORzY0KTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX1FOYW1lMnMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF93Y2hhcjJzKHN0cnVjdCBzb2FwKiwgY29uc3Qgd2NoYXJfdCopOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfZGF0ZVRpbWUycyhzdHJ1Y3Qgc29hcCosIHRpbWVfdCk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9iYXNlNjQycyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjaGFyKiwgc2l6ZV90LCBpbnQqKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX2hleDJzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNoYXIqLCBzaXplX3QsIGludCopOworI2VuZGlmCisKKworU09BUF9GTUFDMSBpbnQqIFNPQVBfRk1BQzIgc29hcF9pbmludChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9pbmJ5dGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGNoYXIgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgbG9uZyogU09BUF9GTUFDMiBzb2FwX2lubG9uZyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgbG9uZyAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBMT05HNjQqIFNPQVBfRk1BQzIgc29hcF9pbkxPTkc2NChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgTE9ORzY0ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIHNob3J0KiBTT0FQX0ZNQUMyIHNvYXBfaW5zaG9ydChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgc2hvcnQgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgZmxvYXQqIFNPQVBfRk1BQzIgc29hcF9pbmZsb2F0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBmbG9hdCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBkb3VibGUqIFNPQVBfRk1BQzIgc29hcF9pbmRvdWJsZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgZG91YmxlICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIHVuc2lnbmVkIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9pbnVuc2lnbmVkQnl0ZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgdW5zaWduZWQgY2hhciAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSB1bnNpZ25lZCBzaG9ydCogU09BUF9GTUFDMiBzb2FwX2ludW5zaWduZWRTaG9ydChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgdW5zaWduZWQgc2hvcnQgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgdW5zaWduZWQgaW50KiBTT0FQX0ZNQUMyIHNvYXBfaW51bnNpZ25lZEludChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgdW5zaWduZWQgaW50ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIHVuc2lnbmVkIGxvbmcqIFNPQVBfRk1BQzIgc29hcF9pbnVuc2lnbmVkTG9uZyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgdW5zaWduZWQgbG9uZyAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBVTE9ORzY0KiBTT0FQX0ZNQUMyIHNvYXBfaW5VTE9ORzY0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBVTE9ORzY0ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGNoYXIqKiBTT0FQX0ZNQUMyIHNvYXBfaW5zdHJpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGNoYXIgKipwLCBjb25zdCBjaGFyICosIGludCwgaW50LCBsb25nLCBsb25nKTsKK1NPQVBfRk1BQzEgY2hhcioqIFNPQVBfRk1BQzIgc29hcF9pbmxpdGVyYWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGNoYXIgKipwKTsKKworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEgdGltZV90KiBTT0FQX0ZNQUMyIHNvYXBfaW5kYXRlVGltZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgdGltZV90ICpwLCBjb25zdCBjaGFyICosIGludCk7CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU5FUgorU09BUF9GTUFDMSB3Y2hhcl90KiogU09BUF9GTUFDMiBzb2FwX2lud3N0cmluZyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgd2NoYXJfdCAqKnAsIGNvbnN0IGNoYXIgKiwgaW50LCBsb25nLCBsb25nKTsKK1NPQVBfRk1BQzEgd2NoYXJfdCoqIFNPQVBfRk1BQzIgc29hcF9pbndsaXRlcmFsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCB3Y2hhcl90ICoqcCk7CisjZW5kaWYKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dGJ5dGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgY2hhciAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dHNob3J0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHNob3J0ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0aW50KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGludCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dGxvbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgbG9uZyAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dExPTkc2NChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBMT05HNjQgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRmbG9hdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBmbG9hdCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dGRvdWJsZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBkb3VibGUgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXR1bnNpZ25lZEJ5dGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgdW5zaWduZWQgY2hhciAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dHVuc2lnbmVkU2hvcnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgdW5zaWduZWQgc2hvcnQgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXR1bnNpZ25lZEludChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCB1bnNpZ25lZCBpbnQgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXR1bnNpZ25lZExvbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgdW5zaWduZWQgbG9uZyAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dFVMT05HNjQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgVUxPTkc2NCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dHN0cmluZyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjaGFyICpjb25zdCpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0bGl0ZXJhbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgY2hhciAqY29uc3QqcCk7CisKKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0ZGF0ZVRpbWUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgdGltZV90ICpwLCBjb25zdCBjaGFyICosIGludCk7CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU5FUgorU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dHdzdHJpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgd2NoYXJfdCAqY29uc3QqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dHdsaXRlcmFsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCB3Y2hhcl90ICpjb25zdCpwKTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTkVSCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfYXR0YWNobWVudChzdHJ1Y3Qgc29hcCAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB2b2lkKiwgY29uc3Qgc3RydWN0IHNvYXBfYXJyYXkqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IGNoYXIqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX21vdmUoc3RydWN0IHNvYXAqLCBsb25nKTsKK1NPQVBfRk1BQzEgc2l6ZV90IFNPQVBfRk1BQzIgc29hcF90ZWxsKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9kaW1lX29wdGlvbihzdHJ1Y3Qgc29hcCosIHVuc2lnbmVkIHNob3J0LCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZ2V0ZGltZWhkcihzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2dldGRpbWUoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9wdXRkaW1laGRyKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0ZGltZShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2dldG1pbWVoZHIoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRtaW1lKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0bWltZWhkcihzdHJ1Y3Qgc29hcCosIHN0cnVjdCBzb2FwX211bHRpcGFydCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3B1dG1pbWUoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfc2V0X2RpbWUoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfc2V0X21pbWUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICpib3VuZGFyeSwgY29uc3QgY2hhciAqc3RhcnQpOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9jbHJfZGltZShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9jbHJfbWltZShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NldF9kaW1lX2F0dGFjaG1lbnQoc3RydWN0IHNvYXAqLCBjaGFyICpwdHIsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICppZCwgdW5zaWduZWQgc2hvcnQgb3B0eXBlLCBjb25zdCBjaGFyICpvcHRpb24pOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NldF9taW1lX2F0dGFjaG1lbnQoc3RydWN0IHNvYXAqLCBjaGFyICpwdHIsIHNpemVfdCBzaXplLCBlbnVtIHNvYXBfbWltZV9lbmNvZGluZyBlbmNvZGluZywgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKmxvY2F0aW9uLCBjb25zdCBjaGFyICpkZXNjcmlwdGlvbik7CitTT0FQX0ZNQUMxIHN0cnVjdCBzb2FwX211bHRpcGFydCogU09BUF9GTUFDMiBzb2FwX25leHRfbXVsdGlwYXJ0KHN0cnVjdCBzb2FwX211bHRpcGFydCopOworI2VuZGlmCisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9yZWdpc3Rlcl9wbHVnaW5fYXJnKHN0cnVjdCBzb2FwKiwgaW50ICgqZmNyZWF0ZSkoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9wbHVnaW4qLCB2b2lkKiksIHZvaWQqKTsKK1NPQVBfRk1BQzEgdm9pZCogU09BUF9GTUFDMiBzb2FwX2xvb2t1cF9wbHVnaW4oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX2F0dHJfdmFsdWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBmbGFnKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZXRfYXR0cihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9jbHJfYXR0cihzdHJ1Y3Qgc29hcCAqc29hcCk7CisKKyNpZmRlZiBXSVRIX0NPT0tJRVMKK1NPQVBfRk1BQzEgc2l6ZV90IFNPQVBfRk1BQzIgc29hcF9lbmNvZGVfY29va2llKGNvbnN0IGNoYXIqLCBjaGFyKiwgc2l6ZV90KTsKK1NPQVBfRk1BQzEgZXh0ZXJuIHN0cnVjdCBzb2FwX2Nvb2tpZSogU09BUF9GTUFDMiBzb2FwX3NldF9jb29raWUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGV4dGVybiBzdHJ1Y3Qgc29hcF9jb29raWUqIFNPQVBfRk1BQzIgc29hcF9jb29raWUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgZXh0ZXJuIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9jb29raWVfdmFsdWUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgZXh0ZXJuIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9lbnZfY29va2llX3ZhbHVlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGV4dGVybiBsb25nIFNPQVBfRk1BQzIgc29hcF9jb29raWVfZXhwaXJlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGV4dGVybiBpbnQgU09BUF9GTUFDMiBzb2FwX3NldF9jb29raWVfZXhwaXJlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGxvbmcsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGV4dGVybiBpbnQgU09BUF9GTUFDMiBzb2FwX3NldF9jb29raWVfc2Vzc2lvbihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBleHRlcm4gaW50IFNPQVBfRk1BQzIgc29hcF9jbHJfY29va2llX3Nlc3Npb24oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgZXh0ZXJuIHZvaWQgU09BUF9GTUFDMiBzb2FwX2Nscl9jb29raWUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgZXh0ZXJuIGludCBTT0FQX0ZNQUMyIHNvYXBfZ2V0ZW52X2Nvb2tpZXMoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgZXh0ZXJuIHN0cnVjdCBzb2FwX2Nvb2tpZSogU09BUF9GTUFDMiBzb2FwX2NvcHlfY29va2llcyhzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBleHRlcm4gdm9pZCBTT0FQX0ZNQUMyIHNvYXBfZnJlZV9jb29raWVzKHN0cnVjdCBzb2FwKik7CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIGV4dGVybiAiQyIgKi8KKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9xdW90ZXgvTWFrZWZpbGUgYi9zYW1wbGVzL3F1b3RleC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTQ4YzlmCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9xdW90ZXgvTWFrZWZpbGUKQEAgLTAsMCArMSwyMCBAQAorR1NPQVA9Li4vLi4vc29hcGNwcDIKK1NPQVBIPS4uLy4uL3N0ZHNvYXAyLmgKK1NPQVBDPS4uLy4uL3N0ZHNvYXAyLmMKK1NPQVBDUFA9Li4vLi4vc3Rkc29hcDIuY3BwCitDQz1nY2MKK0NQUD1nKysKK0xJQlM9CitDT0ZMQUdTPS1PMgorQ1dGTEFHUz0tV2FsbAorQ0lGTEFHUz0tSS4uLy4uCitDTUZMQUdTPQorQ0ZMQUdTPSAkKENXRkxBR1MpICQoQ09GTEFHUykgJChDSUZMQUdTKSAkKENNRkxBR1MpCithbGw6CQlxdW90ZXgKK3F1b3RleDoJCXF1b3RleC5oIHF1b3RleC5jcHAgJChTT0FQSCkgJChTT0FQQ1BQKQorCQkkKEdTT0FQKSBxdW90ZXguaAorCQkkKENQUCkgJChDRkxBR1MpIC1vIHF1b3RleCBxdW90ZXguY3BwIHNvYXBDLmNwcCBzb2FwQ2xpZW50LmNwcCBzb2FwU2VydmVyLmNwcCAkKFNPQVBDUFApICQoTElCUykKK2NsZWFuOgorCQlybSAtZiAqLm8gc29hcEguaCBzb2FwU3R1Yi5oIHNvYXBDLmNwcCBzb2FwQy5jIHNvYXBDbGllbnQuY3BwIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmNwcCBzb2FwU2VydmVyLmMgc29hcCpQcm94eS5oCitkaXN0Y2xlYW46CisJCXJtIC1mICoubyAqLndzZGwgKi54c2QgKi54bWwgKi5uc21hcCAqLmxvZyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5LmggcXVvdGV4CmRpZmYgLS1naXQgYS9zYW1wbGVzL3F1b3RleC9NYWtlZmlsZVNvbGFyaXMgYi9zYW1wbGVzL3F1b3RleC9NYWtlZmlsZVNvbGFyaXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZkYzIzMAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvcXVvdGV4L01ha2VmaWxlU29sYXJpcwpAQCAtMCwwICsxLDIwIEBACitHU09BUD0uLi8uLi9zb2FwY3BwMgorU09BUEg9Li4vLi4vc3Rkc29hcDIuaAorU09BUEM9Li4vLi4vc3Rkc29hcDIuYworU09BUENQUD0uLi8uLi9zdGRzb2FwMi5jcHAKK0NDPWdjYworQ1BQPWcrKworTElCUz0tbHhuZXQgLWxuc2wgLWxzb2NrZXQKK0NPRkxBR1M9LU8yCitDV0ZMQUdTPS1XYWxsCitDSUZMQUdTPS1JLi4vLi4KK0NNRkxBR1M9CitDRkxBR1M9ICQoQ1dGTEFHUykgJChDT0ZMQUdTKSAkKENJRkxBR1MpICQoQ01GTEFHUykKK2FsbDoJCXF1b3RleAorcXVvdGV4OgkJcXVvdGV4LmggcXVvdGV4LmNwcCAkKFNPQVBIKSAkKFNPQVBDUFApCisJCSQoR1NPQVApIHF1b3RleC5oCisJCSQoQ1BQKSAkKENGTEFHUykgLW8gcXVvdGV4IHF1b3RleC5jcHAgc29hcEMuY3BwIHNvYXBDbGllbnQuY3BwIHNvYXBTZXJ2ZXIuY3BwICQoU09BUENQUCkgJChMSUJTKQorY2xlYW46CisJCXJtIC1mICoubyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5LmgKK2Rpc3RjbGVhbjoKKwkJcm0gLWYgKi5vICoud3NkbCAqLnhzZCAqLnhtbCAqLm5zbWFwICoubG9nIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaCBxdW90ZXgKZGlmZiAtLWdpdCBhL3NhbXBsZXMvcXVvdGV4L3F1b3RleC5jcHAgYi9zYW1wbGVzL3F1b3RleC9xdW90ZXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlODVmYWMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3F1b3RleC9xdW90ZXguY3BwCkBAIC0wLDAgKzEsNjEgQEAKKy8qCXF1b3RleC5jcHAKKwlUaGlzIGV4YW1wbGUgaXMgYm90aCBhIFNPQVAgc2VydmljZSBhbmQgYSBjbGllbnQgYXBwbGljYXRpb24uCisJQXMgYSBDR0kgcHJvZ3JhbSwgaXQgd2lsbCBzZXJ2ZSBjdXJyZW5jeS1jb252ZXJ0ZWQgc3RvY2sgcXVvdGUgcmVxdWVzdHMuCisJQXMgYSBjbGllbnQsIGl0IHdpbGwgcmV0dXJuIHRoZSBjdXJyZW5jeS1jb252ZXJ0ZWQgc3RvY2sgcXVvdGUgZ2l2ZW4gYXMKKwlhcmd1bWVudHMgdG8gdGhlIHByb2dyYW0gb24gdGhlIGNvbW1hbmQtbGluZS4gRm9yIGV4YW1wbGUKKwk+IHF1b3RleCBBT0wgdWsKKyovCisKKyNpbmNsdWRlICJzb2FwSC5oIgkvLyBpbmNsdWRlIGdlbmVyYXRlZCBwcm94eSBhbmQgU09BUCBzdXBwb3J0CisjaW5jbHVkZSAicXVvdGV4Lm5zbWFwIgkvLyBpbmNsdWRlIGdlbmVyYXRlZCBuYW1lc3BhY2UgbWFwIGZpbGUKKworY29uc3QgY2hhciBlbmRwb2ludFtdID0gImh0dHA6Ly93ZWJzcnYuY3MuZnN1LmVkdS9+ZW5nZWxlbi9xdW90ZXguY2dpIjsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreyBzdHJ1Y3Qgc29hcCAqc29hcCA9IHNvYXBfbmV3KCk7CisgIGZsb2F0IHE7CisgIGlmIChhcmdjIDw9IDIpCisgIHsgc29hcC0+dXNlciA9IHNvYXBfbmV3KCk7IC8vIHBhc3MgYSBuZXcgZ1NPQVAgZW52aXJvbm1lbnQgd2hpY2ggd2UgbmVlZCB0byBtYWtlIHNlcnZlci1zaWRlIGNsaWVudCBjYWxscworICAgIHNvYXBfc2VydmUoc29hcCk7CS8vIHNlcnZlIHJlcXVlc3QKKyAgICBzb2FwX2Rlc3Ryb3koKHN0cnVjdCBzb2FwKilzb2FwLT51c2VyKTsKKyAgICBzb2FwX2VuZCgoc3RydWN0IHNvYXAqKXNvYXAtPnVzZXIpOworICAgIHNvYXBfZG9uZSgoc3RydWN0IHNvYXAqKXNvYXAtPnVzZXIpOworICAgIGZyZWUoc29hcC0+dXNlcik7CisgICAgc29hcC0+dXNlciA9IE5VTEw7CisgIH0KKyAgZWxzZSBpZiAoc29hcF9jYWxsX25zM19fZ2V0UXVvdGUoc29hcCwgZW5kcG9pbnQsIE5VTEwsIGFyZ3ZbMV0sIGFyZ3ZbMl0sIHEpID09IDApCisgICAgcHJpbnRmKCJcbkNvbXBhbnkgJXM6ICVmICglcylcbiIsIGFyZ3ZbMV0sIHEsIGFyZ3ZbMl0pOworICBlbHNlCisgIHsgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOworICAgIHNvYXBfcHJpbnRfZmF1bHRfbG9jYXRpb24oc29hcCwgc3RkZXJyKTsKKyAgfQorICBzb2FwX2Rlc3Ryb3koc29hcCk7CisgIHNvYXBfZW5kKHNvYXApOworICBzb2FwX2RvbmUoc29hcCk7CisgIGZyZWUoc29hcCk7CisgIHJldHVybiAwOworfQorCitpbnQgbnMzX19nZXRRdW90ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqc3ltYm9sLCBjaGFyICpjb3VudHJ5LCBmbG9hdCAmcmVzdWx0KQoreyBmbG9hdCBxLCByOworICAvLyBzb2FwLT51c2VyIGNvbnRhaW5zIGFuIGVudmlyb25tZW50IHRoYXQgd2UgY2FuIHVzZSB0byBtYWtlIGNhbGxzIHRoYXQgZG8gbm90IGludGVyZmVyZSB3aXRoIHRoZSBjdXJyZW50IHNlcnZpY2UgZW52aXJvbm1lbnQKKyAgaWYgKHNvYXBfY2FsbF9uczFfX2dldFF1b3RlKChzdHJ1Y3Qgc29hcCopc29hcC0+dXNlciwgImh0dHA6Ly9zZXJ2aWNlcy54bWV0aG9kcy5uZXQvc29hcCIsIE5VTEwsIHN5bWJvbCwgcSkgPT0gMCAmJgorICAgICAgc29hcF9jYWxsX25zMl9fZ2V0UmF0ZSgoc3RydWN0IHNvYXAqKXNvYXAtPnVzZXIsICJodHRwOi8vc2VydmljZXMueG1ldGhvZHMubmV0L3NvYXAiLCBOVUxMLCAidXMiLCBjb3VudHJ5LCByKSA9PSAwKQorICB7IHJlc3VsdCA9IHEqcjsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICBzb2FwX3JlY2VpdmVyX2ZhdWx0KHNvYXAsICpzb2FwX2ZhdWx0c3RyaW5nKChzdHJ1Y3Qgc29hcCopc29hcC0+dXNlciksIE5VTEwpOworICByZXR1cm4gU09BUF9GQVVMVDsJLy8gcGFzcyBzb2FwIGZhdWx0IG1lc3NhZ2VzIG9uIHRvIHRoZSBjbGllbnQgb2YgdGhpcyBhcHAKK30KKworLyoJU2luY2UgdGhpcyBhcHAgaXMgYSBjb21iaW5lZCBjbGllbnQtc2VydmVyLCBpdCBpcyBlYXN5IHRvIHB1dCBpdCB0b2dldGhlciB3aXRoCisgKiAJb25lIGhlYWRlciBmaWxlIHRoYXQgZGVzY3JpYmVzIGFsbCByZW1vdGUgbWV0aG9kcy4gSG93ZXZlciwgYXMgYSBjb25zZXF1ZW5jZSB3ZQorICoJaGF2ZSB0byBpbXBsZW1lbnQgdGhlIG1ldGhvZHMgdGhhdCBhcmUgbm90IG91cnMuIFNpbmNlIHRoZXNlIGltcGxlbWVudGF0aW9ucyBhcmUKKyAqIAluZXZlciBjYWxsZWQsIHdlIGNhbiBtYWtlIHRoZW0gZHVtbWllcy4KKyAqLworCitpbnQgbnMxX19nZXRRdW90ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqc3ltYm9sLCBmbG9hdCAmUmVzdWx0KQoreyByZXR1cm4gU09BUF9OT19NRVRIT0Q7IH0gLy8gZHVtbXk6IHdpbGwgbmV2ZXIgYmUgY2FsbGVkCitpbnQgbnMyX19nZXRSYXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpjb3VudHJ5MSwgY2hhciAqY291bnRyeTIsIGZsb2F0ICZSZXN1bHQpCit7IHJldHVybiBTT0FQX05PX01FVEhPRDsgfSAvLyBkdW1teTogd2lsbCBuZXZlciBiZSBjYWxsZWQKKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9xdW90ZXgvcXVvdGV4LmggYi9zYW1wbGVzL3F1b3RleC9xdW90ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmVlNWRhCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9xdW90ZXgvcXVvdGV4LmgKQEAgLTAsMCArMSwxNyBAQAorLy9nc29hcCBuczEgc2VydmljZSBuYW1lc3BhY2U6CXVybjp4bWV0aG9kcy1kZWxheWVkLXF1b3RlcworLy9nc29hcCBuczEgc2VydmljZSBzdHlsZToJcnBjCisvL2dzb2FwIG5zMSBzZXJ2aWNlIGVuY29kaW5nOgllbmNvZGVkCitpbnQgbnMxX19nZXRRdW90ZShjaGFyICpzeW1ib2wsIGZsb2F0ICZSZXN1bHQpOworCisvL2dzb2FwIG5zMiBzZXJ2aWNlIG5hbWVzcGFjZToJdXJuOnhtZXRob2RzLUN1cnJlbmN5RXhjaGFuZ2UKKy8vZ3NvYXAgbnMyIHNlcnZpY2Ugc3R5bGU6CXJwYworLy9nc29hcCBuczIgc2VydmljZSBlbmNvZGluZzoJZW5jb2RlZAoraW50IG5zMl9fZ2V0UmF0ZShjaGFyICpjb3VudHJ5MSwgY2hhciAqY291bnRyeTIsIGZsb2F0ICZSZXN1bHQpOworCisvL2dzb2FwIG5zMyBzZXJ2aWNlIG5hbWU6CXF1b3RleAorLy9nc29hcCBuczMgc2VydmljZSBzdHlsZToJcnBjCisvL2dzb2FwIG5zMyBzZXJ2aWNlIGVuY29kaW5nOgllbmNvZGVkCisvL2dzb2FwIG5zMyBzZXJ2aWNlIGxvY2F0aW9uOglodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vcXVvdGV4LmNnaQorLy9nc29hcCBuczMgc2VydmljZSBuYW1lc3BhY2U6CWh0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9xdW90ZXgud3NkbAorLy9nc29hcCBuczMgc2NoZW1hICBuYW1lc3BhY2U6CXVybjpxdW90ZXgKK2ludCBuczNfX2dldFF1b3RlKGNoYXIgKnN5bWJvbCwgY2hhciAqY291bnRyeSwgZmxvYXQgJnJlc3VsdCk7CmRpZmYgLS1naXQgYS9zYW1wbGVzL3JvdXRlci9NYWtlZmlsZSBiL3NhbXBsZXMvcm91dGVyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMzA5ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3JvdXRlci9NYWtlZmlsZQpAQCAtMCwwICsxLDIwIEBACitHU09BUD0uLi8uLi9zb2FwY3BwMgorU09BUEg9Li4vLi4vc3Rkc29hcDIuaAorU09BUEM9Li4vLi4vc3Rkc29hcDIuYworU09BUENQUD0uLi8uLi9zdGRzb2FwMi5jcHAKK0NDPWdjYworQ1BQPWcrKworTElCUz0tbHB0aHJlYWQKK0NPRkxBR1M9LU8yCitDV0ZMQUdTPS1XYWxsCitDSUZMQUdTPS1JLi4vLi4KK0NNRkxBR1M9CitDRkxBR1M9ICQoQ1dGTEFHUykgJChDT0ZMQUdTKSAkKENJRkxBR1MpICQoQ01GTEFHUykKK2FsbDoJCXJvdXRlcgorcm91dGVyOgkJcm91dGVyLmggcm91dGVyLmMgJChTT0FQSCkgJChTT0FQQykKKwkJJChHU09BUCkgLWMgcm91dGVyLmgKKwkJJChDQykgJChDRkxBR1MpIC1vIHJvdXRlciByb3V0ZXIuYyBzb2FwQy5jICQoU09BUEMpICQoTElCUykKK2NsZWFuOgorCQlybSAtZiAqLm8gc29hcEguaCBzb2FwU3R1Yi5oIHNvYXBDLmNwcCBzb2FwQy5jIHNvYXBDbGllbnQuY3BwIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmNwcCBzb2FwU2VydmVyLmMgc29hcCpQcm94eS5oCitkaXN0Y2xlYW46CisJCXJtIC1mICoubyAqLndzZGwgKi54c2QgKi54bWwgKi5uc21hcCAqLmxvZyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5Lmggcm91dGVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL3JvdXRlci9NYWtlZmlsZVNvbGFyaXMgYi9zYW1wbGVzL3JvdXRlci9NYWtlZmlsZVNvbGFyaXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ5NzA0MwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvcm91dGVyL01ha2VmaWxlU29sYXJpcwpAQCAtMCwwICsxLDIwIEBACitHU09BUD0uLi8uLi9zb2FwY3BwMgorU09BUEg9Li4vLi4vc3Rkc29hcDIuaAorU09BUEM9Li4vLi4vc3Rkc29hcDIuYworU09BUENQUD0uLi8uLi9zdGRzb2FwMi5jcHAKK0NDPWdjYworQ1BQPWcrKworTElCUz0tbHhuZXQgLWxzb2NrZXQgLWxuc2wgLWxwdGhyZWFkCitDT0ZMQUdTPS1PMgorQ1dGTEFHUz0tV2FsbAorQ0lGTEFHUz0tSS4uLy4uCitDTUZMQUdTPQorQ0ZMQUdTPSAkKENXRkxBR1MpICQoQ09GTEFHUykgJChDSUZMQUdTKSAkKENNRkxBR1MpCithbGw6CQlyb3V0ZXIKK3JvdXRlcjoJCXJvdXRlci5oIHJvdXRlci5jICQoU09BUEgpICQoU09BUEMpCisJCSQoR1NPQVApIC1jIHJvdXRlci5oCisJCSQoQ0MpICQoQ0ZMQUdTKSAtbyByb3V0ZXIgcm91dGVyLmMgc29hcEMuYyAkKFNPQVBDKSAkKExJQlMpCitjbGVhbjoKKwkJcm0gLWYgKi5vIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaAorZGlzdGNsZWFuOgorCQlybSAtZiAqLm8gKi53c2RsICoueHNkICoueG1sICoubnNtYXAgKi5sb2cgc29hcEguaCBzb2FwU3R1Yi5oIHNvYXBDLmNwcCBzb2FwQy5jIHNvYXBDbGllbnQuY3BwIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmNwcCBzb2FwU2VydmVyLmMgc29hcCpQcm94eS5oIHJvdXRlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9yb3V0ZXIvcm91dGVyLmMgYi9zYW1wbGVzL3JvdXRlci9yb3V0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjI4MTNjCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9yb3V0ZXIvcm91dGVyLmMKQEAgLTAsMCArMSw3MjQgQEAKKy8qCXJvdXRlci5jCisKKwlXZWIgU2VydmljZSBtZXNzYWdlIHJvdXRlciAocmVsYXkgc2VydmVyIGFuZCBtZXNzYWdlIGZvcndhcmRpbmcpCisJTm90ZTogSFRUUCBjb29raWVzIGFyZSBub3Qgc3VwcG9ydGVkCisKKwlDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMiBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKwlDb25maWd1cmU6CisJVGhlIHJvdXRlciB1c2VzIHR3byByb3V0aW5nIHRhYmxlczogYW4gaW50ZXJuYWwgdGFibGUgKGZvciBzcGVlZCkgYW5kCisJYW4gZXh0ZXJuYWwgcm91dGluZyBmaWxlIChmb3IgZmxleGliaWxpdHkpLiBUaGUgaW50ZXJuYWwgaXMgYWx3YXlzCisJY2hlY2tlZCBmaXJzdC4gQ2hhbmdlIHRoZSBjb250ZW50cyBvZiB0aGUgdGFibGVzIHRvIHlvdXIgbmVlZHMuCisJSW50ZXJuYWwgdGFibGU6IHN0cnVjdCB0X19Sb3V0aW5nIHJvdXRpbmdbXSAoc2VlIGJlbG93KQorCUV4dGVybmFsIHRhYmxlOiBwcm92aWRlIHRoZSBuYW1lIG9mIGEgZGVmYXVsdCByb3V0aW5nIGZpbGUgKHNlZSBiZWxvdykKKwkJCW9yIHVzZSByb3V0ZXIgb3B0aW9uIC1yCisKKwlDb21waWxlOgorCXNvYXBjcHAyIC1jIHJvdXRlci5oCisJZ2NjIC1vIHJvdXRlciByb3V0ZXIuYyBzdGRzb2FwMi5jIHNvYXBDLmMKKworCU5PVEU6IFVuaXgvTGludXggU0lHUElQRSBoYW5kbGVyIG11c3QgYmUgYWRkZWQgdG8gYXZvaWQgYnJva2VuIHBpcGUuCisKKwlVc2FnZSBzY2VuYXJpb3MKKwk9PT09PT09PT09PT09PT0KKworCUZvcndhcmRpbmcgb2YgbWVzc2FnZXMgdG8gYSBzZXJ2aWNlCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCXJvdXRlciBbLWU8ZW5kcG9pbnQ+IHwgLWc8ZW5kcG9pbnQ+XSBbLWE8U09BUEFjdGlvbj5dIFstcjxyb3V0aW5nZmlsZT5dIFstdDx0aW1lb3V0Pl0gWy1jXSBbPG1zZ2ZpbGU+XQorCisJRXhhbXBsZXM6CisKKwkxLgorCXJvdXRlciAtYyByZXF1ZXN0LnNvYXAKKwlTZW5kcyB0aGUgcmVxdWVzdCBtZXNzYWdlIHN0b3JlZCBpbiBmaWxlIHJlcXVlc3Quc29hcCBhbmQgcmV0dXJucworCXJlc3BvbnNlIHRvIHN0ZG91dCB3aGVyZSBmaWxlIHJlcXVlc3Quc29hcCBjb250YWlucyBhIFNPQVAgcmVxdWVzdCB3aXRoCisJSFRUUCBoZWFkZXIgYW5kIFNPQVAvWE1ML0RJTUUgYm9keS4gSWYgdGhlIFNPQVBBY3Rpb24gaW4gdGhlIG1lc3NhZ2UgaXMKKwlwcmVzZW50IGFuZCBtYXRjaGVzIG9uZSBvciBtb3JlIGtleXMgaW4gdGhlIHJvdXRpbmcgdGFibGUsIHRoZQorCWFsdGVybmF0aXZlIHNlcnZpY2UgZW5kcG9pbnRzIGluIHRoZSB0YWJsZSB3aWxsIGJlIHRyaWVkIGZpcnN0IHVudGlsCisJb25lIHNlcnZpY2UgZW5kcG9pbnQgaXMgZm91bmQgdG8gYWNjZXB0IHRoZSBjb25uZWN0aW9uLiBJZiBubworCVNPQVBBY3Rpb24gaXMgZ2l2ZW4gb3IgdGhlIFNPQVBBY3Rpb24gZG9lcyBub3QgbWF0Y2ggYW55IGtleSwgdGhlbiB0aGUKKwllbmRwb2ludCBpbiB0aGUgSFRUUCBoZWFkZXIgaW4gcmVxdWVzdC5zb2FwIGlzIHNlYXJjaGVkIGluIHRoZSByb3V0aW5nCisJdGFibGUuIElmIHRoZSBlbmRvaW50IG1hdGNoZXMgb25lIG9yIG1vcmUga2V5cyBpbiB0aGUgcm91dGluZyB0YWJsZSwKKwl0aGUgYWx0ZXJuYXRpdmUgZW5kcG9pbnRzIHdpbGwgYmUgdHJpZWQgZmlyc3QgdW50aWwgb25lIGVuZHBvaW50IGlzCisJZm91bmQgdG8gYWNjZXB0IHRoZSBjb25uZWN0aW9uLiBGaW5hbGx5LCB0aGUgZW5kcG9pbnQgaW4gdGhlIEhUVFAKKwloZWFkZXIgb2YgcmVxdWVzdC5zb2FwIGlzIHVzZWQgdG8gZXN0YWJsaXNoIGEgY29ubmVjdGlvbiBpZiBhbGwgb3RoZXIKKwlzZXJ2aWNlIGVuZHBvaW50cyBpbiB0aGUgdGFibGUgZmFpbGVkIGFuZCBpZiBvcHRpb24gLWMgaXMgZW5hYmxlZC4KKworCTIuCisJcm91dGVyIC1laHR0cDovL2RvbWFpbi9wYXRoIHJlcXVlc3Quc29hcAorCVNlbmRzIHJlcXVlc3QgbWVzc2FnZSB0byBodHRwOi8vZG9tYWluL3BhdGggYW5kIHJldHVybnMgdGhlIHNlcnZpY2UKKwlyZXNwb25zZSB0byBzdGRvdXQuIElmIGh0dHA6Ly9kb21haW4vcGF0aCBtYXRjaGVzIG9uZSBvciBtb3JlIGtleXMgaW4KKwl0aGUgcm91dGluZyB0YWJsZSwgdGhlbiB0aGUgYWx0ZXJuYXRpdmUgc2VydmljZSBlbmRwb2ludHMgaW4gdGhlIHRhYmxlCisJd2lsbCBiZSB0cmllZCBmaXJzdCB1bnRpbCBvbmUgc2VydmljZSBlbmRwb2ludCBpcyBmb3VuZCB0byBhY2NlcHQgdGhlCisJY29ubmVjdGlvbi4gVGhlIGh0dHA6Ly9kb21haW4vcGF0aCBlbmRwb2ludCBpcyB0cmllZCBsYXN0IHdoZW4gYWxsCisJb3RoZXIgc2VydmljZSBlbmRwb2ludHMgaW4gdGhlIHRhYmxlIGZhaWxlZC4gRmlsZSByZXF1ZXN0LnNvYXAgTUFZCisJY29udGFpbiBhbiBIVFRQIGhlYWRlciBidXQgTVVTVCBvZiBjb3Vyc2UgY29udGFpbiBhIGJvZHkuCisKKwlUbyB0cnkgdGhpcywgY29tcGlsZSB0aGUgJ3F1b3RlJyBjbGllbnQgKHNhbXBsZXMvcXVvdGUpLiBFZGl0IHRoZQorCSdxdW90ZS5nZXRRdW90ZS5yZXEueG1sJyBTT0FQL1hNTCByZXF1ZXN0IGZpbGUgYW5kIHJlcGxhY2UKKwk8c3ltYm9sPjwvc3ltYm9sPiB3aXRoIDxzeW1ib2w+SUJNPC9zeW1ib2w+LiBUaGVuIHJ1bgorCXJvdXRlciAtZWh0dHA6Ly9zZXJ2aWNlcy54bWV0aG9kcy5uZXQvc29hcCAtYSIiIHF1b3RlLmdldFF1b3RlLnJlcS54bWwKKwlUaGUgU09BUC9YTUwgcmVzcG9uc2UgaXMgcmV0dXJuZWQuCisKKwkzLgorCXJvdXRlciAtYVNPQVBBY3Rpb24gcmVxdWVzdC5zb2FwCisJV2hlbiBTT0FQQWN0aW9uIG1hdGNoZXMgb25lIG9yIG1vcmUga2V5cyBpbiB0aGUgcm91dGluZyB0YWJsZSwgdGhlbiB0aGUKKwlhbHRlcm5hdGl2ZSBlbmRwb2ludHMgaW4gdGhlIHRhYmxlIHdpbGwgYmUgdHJpZWQgZmlyc3QgdW50aWwgb25lCisJZW5kcG9pbnQgaXMgZm91bmQgdG8gYWNjZXB0IHRoZSBjb25uZWN0aW9uLiBXaGVuIGFsbCBlbmRwb2ludHMgZmFpbCwKKwlvciB3aGVuIFNPQVBBY3Rpb24gZG9lcyBub3QgbWF0Y2ggYSBrZXksIHRoZSByb3V0ZXIgZmFpbHMuIEZpbGUKKwlyZXF1ZXN0LnNvYXAgTUFZIGNvbnRhaW4gYW4gSFRUUCBoZWFkZXIgYnV0IE1VU1Qgb2YgY291cnNlIGNvbnRhaW4gYQorCWJvZHkuCisKKwk0LgorCXJvdXRlciAtYyAtcnJvdXRpbmd0YWJsZS54bWwgcmVxdWVzdC5zb2FwCisJU2FtZSBhcyAxLiBidXQgdXNlcyByb3V0aW5ndGFibGUueG1sIGFzIHRoZSByb3V0aW5nIHRhYmxlIGFmdGVyCisJY2hlY2tpbmcga2V5cyBpbiB0aGUgaW50ZXJuYWwgcm91dGluZyB0YWJsZS4gVGhlIFhTRCBzY2hlbWEgb2YKKwlyb3V0aW5ndGFibGUueG1sIGlzIGdlbmVyYXRlZCBhcyB0LnhzZC4gVGhlIGRlZmF1bHQgcm91dGluZyB0YWJsZSBmaWxlCisJaXMgcm91dGVyLnhtbC4KKworCTUuCisJcm91dGVyIC1jIC10NSByZXF1ZXN0LnNvYXAKKwlTYW1lIGFzIDEuIGJ1dCBzZWFyY2hlcyB0aGUgcm91dGluZyB0YWJsZSBmb3IgYW4gZW5kcG9pbnQgdGhhdCB0YWtlcworCWxlc3MgdGhhbiA1IHNlY29uZHMgdG8gY29ubmVjdCB0by4gVXNlIG5lZ2F0aXZlIHRpbWVvdXRzIHRvIHNwZWNpZnkgYQorCXRpbWVvdXQgdmFsdWUgaW4gbWljcm9zZWNvbmRzLiBUaGUgdGltZW91dCBhbHNvIHNwZWNpZmllcyB0aGUgbWVzc2FnZQorCXJlY2VpdmUgdGltZW91dCBBRlRFUiB0aGUgY29ubmVjdGlvbiB3YXMgZXN0YWJsaXNoZWQuCisKKwk2LgorCWNhdCByZXF1ZXN0LnNvYXAgfCByb3V0ZXIgLWVodHRwOi8vZG9tYWluL3BhdGggfCBtb3JlCisJV2hlbiByZXF1ZXN0LnNvYXAgZG9lcyBub3QgY29udGFpbiBhbiBIVFRQIGhlYWRlciwgdGhlIHJvdXRlciBjb21wdXRlcworCXRoZSBIVFRQIGNvbnRlbnQgbGVuZ3RoIGJ5IGJ1ZmZlcmluZyB0aGUgZW50aXJlIHJlcXVlc3QgbWVzc2FnZSB3aGljaAorCWFsbG93cyB5b3UgdG8gdXNlIGl0IGFzIGEgZmlsdGVyIGFzIGluIHRoaXMgZXhhbXBsZS4gKGZzdGF0KCkgaXMKKwlnZW5lcmFsbHkgdHJpZWQgZmlyc3QgdG8gZGV0ZXJtaW5lIGZpbGUgbGVuZ3RoLikKKworCTcuCisJcm91dGVyIC1naHR0cDovL2RvbWFpbi9wYXRoL2ZpbGUuaHRtbAorCVNlbmRzIGFuIEhUVFAgR0VUIHJlcXVlc3QgdG8gdGhlIGhvc3QgYW5kIGNvcGllcyB0aGUgcmVzcG9uc2UgdG8gc3Rkb3V0LgorCisJQ0dJLWJhc2VkIHJlbGF5IHNlcnZlcgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCUluc3RhbGwgdGhlIHJvdXRlciBhcyBDR0kgYXBwbGljYXRpb24uIFRoZSBDR0ktYmFzZWQgcmVsYXkgc2VydmljZSB1c2VzCisJU09BUEFjdGlvbnMgaW4gdGhlIG1lc3NhZ2VzIGFuZCBIVFRQIHF1ZXJ5IHN0cmluZ3MgdG8gaW5kZXggdGhlIHJvdXRpbmcKKwl0YWJsZS4KKworCUV4YW1wbGVzOgorCisJTWVzc2FnZXMgYWRkcmVzc2VkIHRvICJodHRwOi8vZG9tYWluL2NnaS1iaW4vcm91dGVyP2tleSIgd2lsbCBiZSByb3V0ZWQKKwlieSB0aGUgcm91dGVyIHRvIHRoZSBzZXJ2aWNlIGVuZHBvaW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGluIHRoZQorCXJvdXRpbmcgdGFibGUuIFdoZW4gbWVzc2FnZXMgdXNlIFNPQVBBY3Rpb25zLCB0aGUgU09BUEFjdGlvbnMgd2lsbCBiZQorCXVzZWQgdG8gZmluZCBzZXJ2aWNlIGVuZHBvaW50cyBpbnN0ZWFkIG9mIGEgcXVlcnkgc3RyaW5nLgorCisJVG8gdHVubmVsIFNPQVAgdGhyb3VnaCBmaXJld2FscyB0byBzdGF0ZWZ1bCBzdGFuZC1hbG9uZSBXZWIgc2VydmljZXM6CisJcnVuIGEgc3RhbmQtYWxvbmUgZ1NPQVAgV2ViIHNlcnZpY2Ugb24gYSBwb3J0LCBlLmcuIDE4MDAwLiBBZGQgdGhlCisJa2V5LWVuZHBvaW50IHBhaXIgIm15c2VydmljZSIsICJodHRwOi8vbG9jYWxob3N0OjE4MDAwIiB0byB0aGUgcm91dGVyCisJdGFibGUuIEFmdGVyIGluc3RhbGxpbmcgdGhlIHJvdXRlciwgYWxsIHJlcXVlc3RzIGZvciBlbmRwb2ludAorCWh0dHA6Ly9kb21haW4vY2dpLWJpbi9yb3V0ZXI/bXlzZXJ2aWNlIHdpbGwgYmUgdHVubmVsZWQgdG8gdGhlCisJc3RhbmQtYWxvbmUgV2ViIHNlcnZpY2UuCisKKwlUbyBhZGQgYmFja3VwIHNlcnZpY2VzOiBhZGQgbXVsdGlwbGUga2V5LWVuZHBvaW50IHBhaXJzIHRvIHRoZSByb3V0aW5nCisJdGFibGUgd2l0aCB0aGUgc2FtZSBrZXkuIEdpdmVuIGEga2V5IChlLmcuIFNPQVBBY3Rpb24gb3IgUXVlcnkgc3RyaW5nKQorCXRoZSByb3V0ZXIgd2lsbCBjaGVjayB0aGUgZW5kcG9pbnRzIGluIHNlcXVlbmNlIHVudGlsIGl0IGNhbiBjb25uZWN0LgorCUlmIG9uZSBvciBtb3JlIG9mIHRoZSBiYWNrdXAgc2VydmljZXMgYXJlIGRvd24sIGFuIGFjdGl2ZSBzZXJ2aWNlCisJZW5kcG9pbnQgd2lsbCBiZSBzZWxlY3RlZC4KKworCU11bHRpLXRocmVhZGVkIHN0YW5kLWFsb25lIHJlbGF5IHNlcnZlcgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJcm91dGVyIC1wPHBvcnQ+IFstcjxyb3V0aW5nZmlsZT5dIFstdDx0aW1lb3V0Pl0gJgorCQorCUV4YW1wbGVzOgorCQorCXJvdXRlciAtcDE4MDAwIC1ydGFibGUueG1sIC10NSAmCisJUnVucyBhIHN0YW5kLWFsb25lIHJvdXRlciBvbiBwb3J0IDE4MDAwIHVzaW5nIHRhYmxlLnhtbCBhcyB0aGUgZXh0ZXJuYWwKKwlyb3V0aW5nIHRhYmxlIGZvciBsb29rdXAuIFNlcnZpY2UgZW5kcG9pbnRzIGFyZSBzZWxlY3RlZCBmcm9tCisJYWx0ZXJuYXRpdmUgZW5kcG9pbnRzIHRoYXQgdGFrZSBsZXNzIHRoYW4gNSBzZWNvbmRzIHRvIGNvbm5lY3QgdG8uCisKKwlDbGllbnRzIGNvbm5lY3QgdG8gdGhlIHJvdXRlciB3aXRoIGEgc2VydmljZSBlbmRwb2ludCBzdWNoIGFzCisJImh0dHA6Ly9tYWNoaW5lOjxwb3J0Pi9wYXRoIiB3aGVyZSB0aGUgZW5kcG9pbnQgImh0dHA6Ly9tYWNoaW5lL3BhdGgiCisJKG5vdGUgdGhlIGFic2VuY2Ugb2YgdGhlIHBvcnQpIHdpbGwgYmUgdXNlZCBhcyBhIGtleSBpbiB0aGUgcm91dGluZworCXRhYmxlIHRvIGZpbmQgYW4gZW5kcG9pbnQgd2hlbiBubyBTT0FQQWN0aW9uIGlzIHByZXNlbnQuIEZvciBleGFtcGxlLCBhCisJc3RhbmQtYWxvbmUgV2ViIHNlcnZpY2UgY2FsbGVkICJxdW90ZSIgcnVucyBvbiBhIG1hY2hpbmUgbmFtZWQgInp1bHUiCisJcG9ydCAxODA4MC4gVG8gYWRkcmVzcyB0aGlzIHNlcnZpY2UgdGhyb3VnaCB0aGUgcm91dGVyLCBhZGQga2V5CisJImh0dHA6Ly96dWx1L3F1b3RlIiBhbmQgZW5kcG9pbnQgImh0dHA6Ly96dWx1OjE4MDgwIiB0byB0aGUgcm91dGluZworCXRhYmxlLiBSdW4gdGhlIHJvdXRlciBvbiBwb3J0IDE4MDAwLiAgUm91dGVyIHJlcXVlc3RzIHdpdGggZW5kcG9pbnQKKwkiaHR0cDovL3p1bHU6MTgwMDAvcXVvdGUiIHdpbGwgYmUgcmVsYXllZCB0byB6dWx1OjE4MDgwCisKKwlHYXRld2F5IGtlZXBlcgorCS0tLS0tLS0tLS0tLS0tCisKKwlXaGVuIHRoZSByb3V0aW5nIHRhYmxlIGNvbnRhaW5zIHVzZXJpZCBhbmQgcGFzc3dkIGluZm9ybWF0aW9uLCB0aGUKKwljbGllbnQgcmVxdWVzdHMgYXJlIG9ubHkgdHVubmVsbGVkIHdoZW4gdGhlIHByb3BlciBIVFRQIEF1dGhvcml6YXRpb24KKwl1c2VyaWQgYW5kIHBhc3N3ZCBhcmUgcHJvdmlkZWQgaW4gdGhlIGNsaWVudCByZXF1ZXN0IG1lc3NhZ2UuIEl0IGlzCisJcG9zc2libGUgdG8gcHJvdmlkZSBkaWZmZXJlbnQgc2VydmljZSBlbmRwb2ludCBpbiB0aGUgdGFibGUgZGVwZW5kaW5nCisJb24gdGhlIGNsaWVudCdzIEhUVFAgQXV0aG9yaXphdGlvbiBpbmZvcm1hdGlvbi4KKworCU5vdGVzCisJLS0tLS0KKworCSogVGFibGUgbG9va3VwIGFsZ29yaXRobToKKwkgIFNPQVBBY3Rpb25zIChpZiBwcm92aWRlZCkgYXJlIHVzZWQgZmlyc3QgdG8gbWF0Y2ggcm91dGluZyB0YWJsZSBrZXlzLgorCSAgTmV4dCwgSFRUUCBxdWVyeSBzdHJpbmcgaW4gdGhlIGVuZHBvaW50IFVSTCAoQ0dJIG9ubHkpIGlzIHVzZWQgdG8KKwkgIG1hdGNoIHJvdXRpbmcgdGFibGUga2V5cy4KKwkgIE5leHQsIHRoZSBzZXJ2aWNlIGVuZHBvaW50IGlzIGNoZWNrZWQgdG8gbWF0Y2ggcm91dGluZyB0YWJsZSBrZXlzLgorCSAgRmluYWxseSwgaWYgdGhlIC1jIG9wdGlvbiBpcyBzZXQgdGhlIHNlcnZpY2UgZW5kcG9pbnQgVVJMIGl0c2VsZiBpcworCSAgdXNlZCB0byBjb25uZWN0LgorCSogS2V5cyBpbiByb3V0aW5nIHRhYmxlIG1heSBjb250YWluICogKG11bHRpLWNoYXIpIGFuZCAtIChzaW5nbGUtY2hhcikKKwkgIHdpbGRjYXJkcyB0byBtYXRjaCBtdWx0aXBsZSBTT0FQQWN0aW9ucyBhbmQgZW5kcG9pbnRzLgorCSogV2hlbiBhIG1hdGNoIGlzIGZvdW5kIGJ1dCB0aGUgZW5kcG9pbnQgaXMgTlVMTCBpbiB0aGUgdGFibGUsIHRoZQorCSAgc2VhcmNoIGlzIHRlcm1pbmF0ZWQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gcHJldmVudCBzZWFyY2hlcyBpbiB0aGUKKwkgIHJvdXRpbmcgZmlsZSBmb3Igc3BlY2lmaWMgcGF0dGVybnMuCisJKiBPcHRpb25hbCBIVFRQIEF1dGhvcml6YXRpb24gdXNlcmlkIGFuZCBwYXNzd2QgYXJlIGNoZWNrZWQgaWYgcHJlc2VudAorCSAgaW4gdGhlIHJvdXRpbmcgdGFibGUuIFRoZSB1c2VyaWQgYW5kIHBhc3N3ZCBtYXkgYmUgcGF0dGVybnMgd2l0aCAnKicKKwkgIGFuZCAnLScgd2lsZGNhcmRzLiBBbiBlbmRwb2ludCBpbiB0aGUgdGFibGUgaXMgc2VsZWN0ZWQgZm9yIHdoaWNoCisJICB0aGUgdXNlcmlkIGFuZCBwYXNzd2QgbWF0Y2guCisJKiA8dGltZW91dD4gaXMgVENQIGNvbm5lY3QgYW5kIEkvTyB0aW1lb3V0IGZvciByb3V0ZXItc2VydmVyIGNvbm5lY3Rpb24KKwkgIGluIHNlY29uZHMgKHVzZSBuZWdhdGl2ZSB2YWx1ZSBmb3IgdGltZW91dCBpbiBtaWNyb3NlY29uZHMpLgorCSogV2hlbiBhbiBleHRlcm5hbCByb3V0aW5nIHRhYmxlIGlzIG9uY2UgcmVhZCBieSBhIHN0YW5kLWFsb25lIHJvdXRlciwKKwkgIGl0IHdpbGwgYmUgY2FjaGVkIHRvIG9wdGltaXplIHNwZWVkLiBCdXQgdGhpcyBhbHNvIG1lYW5zIHRoYXQKKwkgIGNoYW5naW5nIHRoZSBjb250ZW50cyBvZiB0aGUgcm91dGluZyB0YWJsZSBmaWxlIGRvZXMgbm90IGFmZmVjdCB0aGUKKwkgIGFjdHVhbCByb3V0aW5nIHdoaWxlIHRoZSBzdGFuZC1hbG9uZSByb3V0ZXIgaXMgcnVubmluZy4KKwkqIEhUVFAgUE9TVCBhbmQgSFRUUCBHRVQgc3R5bGVzIG9mIFNPQVAgbWVzc2FnaW5nIGlzIHN1cHBvcnRlZAorCSAgKGJ1dCBDR0ktYmFzZWQgcm91dGVyIGRvZXMgbm90IHN1cHBvcnQgSFRUUCBHRVQpCisJKiBTdXBwb3J0cyBhbnkgdHlwZSBvZiBtZXNzYWdlcyAoZS5nLiBESU1FKQorCSogSFRUUCBjb29raWVzIGFyZSBub3QgaGFuZGxlZCBhbmQgd2lsbCBiZSBkZWxldGVkIGZyb20gdGhlIEhUVFAgaGVhZGVyCisJKiBLZWVwLWFsaXZlIHN1cHBvcnQgaGFzIG5vdCBiZWVuIHRlc3RlZCBhbmQgbWlnaHQgbm90IHdvcmsKKyovCisKKyNpbmNsdWRlICJzb2FwSC5oIgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CS8qIG5lZWQgZnN0YXQgKi8KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CS8qIHVzZSBQb3NpeCB0aHJlYWRzICovCisKKy8qIE1heGltdW0gcmVxdWVzdCBiYWNrbG9nICovCisjZGVmaW5lIEJBQ0tMT0cgKDEwMCkKKworLyogRGVmYXVsdCBmaWxlIG5hbWUgb2YgZXh0ZXJuYWwgcm91dGluZyB0YWJsZSAob3IgTlVMTCBpZiBub25lIHVzZWQpICovCisjZGVmaW5lIERFRkFVTFRfUk9VVElOR0ZJTEUgInJvdXRlci54bWwiCisKKy8qIEludGVybmFsIHJvdXRpbmUgdGFibGUgKGZhc3QpICovCitzdGF0aWMgc3RydWN0IHRfX1JvdXRpbmcgcm91dGluZ1tdID0KKy8qIFNPQVBBY3Rpb24vZW5kcG9pbnQJLT4gdGFyZ2V0IGVuZHBvaW50IFt1c2VyaWQsIHBhc3N3ZF0gKi8KK3sgeyJkaW1lIiwJCSJodHRwOi8vd2Vic3J2LmNzLmZzdS5lZHUvfmVuZ2VsZW4vZGltZXNydi5jZ2kifSwKKyAgeyJodHRwOi8vKi9kaW1lIiwJImh0dHA6Ly93ZWJzcnYuY3MuZnN1LmVkdS9+ZW5nZWxlbi9kaW1lc3J2LmNnaSJ9LAorICB7ImZhY3RvcnkiLAkJImh0dHA6Ly9sb2NhbGhvc3Q6MTgwODUifSwKKyAge05VTEwsIE5VTEx9Cit9OworCisjaWZkZWYgV0lOMzIKKyNkZWZpbmUgT1BUSU9OX0NIQVIgJy8nCisjZWxzZQorI2RlZmluZSBPUFRJT05fQ0hBUiAnLScKKyNlbmRpZgorCitzdHJ1Y3QgaGVhZGVyCit7IHN0cnVjdCBoZWFkZXIgKm5leHQ7CisgIGNoYXIgbGluZVtTT0FQX0hEUkxFTl07Cit9OworCitzdGF0aWMgaW50IHBvcnRfbnVtYmVyID0gMDsKK3N0YXRpYyBjb25zdCBjaGFyICppbnB1dF9maWxlID0gTlVMTDsKK3N0YXRpYyBjb25zdCBjaGFyICpzZXJ2aWNlX2VuZHBvaW50ID0gTlVMTDsKK3N0YXRpYyBjb25zdCBjaGFyICpzZXJ2aWNlX2FjdGlvbiA9IE5VTEw7CitzdGF0aWMgY29uc3QgY2hhciAqcm91dGluZ19maWxlID0gREVGQVVMVF9ST1VUSU5HRklMRTsKK3N0YXRpYyBpbnQgc2VydmVyX3RpbWVvdXQgPSAwOworc3RhdGljIGludCBtZXRob2QgPSBTT0FQX1BPU1Q7CitzdGF0aWMgaW50IGNvbm5lY3RfZmxhZyA9IDA7CisKK3ZvaWQgb3B0aW9ucyhpbnQsIGNoYXIqKik7Cit2b2lkICpwcm9jZXNzX3JlcXVlc3Qodm9pZCopOworY29uc3QgY2hhciAqbG9va3VwKHN0cnVjdCB0X19Sb3V0aW5nVGFibGUqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK2ludCBjb3B5X2hlYWRlcihzdHJ1Y3Qgc29hcCosIHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK2ludCBjcmVhdGVfaGVhZGVyKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCk7CitpbnQgYnVmZmVyX2JvZHkoc3RydWN0IHNvYXAqKTsKK2ludCBjb3B5X2JvZHkoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcCopOworaW50IHNlcnZlcl9jb25uZWN0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworaW50IG1ha2VfY29ubmVjdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sgb3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgaWYgKHBvcnRfbnVtYmVyKQorICB7IHN0cnVjdCBzb2FwIHNvYXAsICp0c29hcDsKKyAgICBwdGhyZWFkX3QgdGlkOworICAgIGludCBtLCBzLCBpOworICAgIHNvYXBfaW5pdCgmc29hcCk7CisgICAgc29hcC5iaW5kX2ZsYWdzID0gU09fUkVVU0VBRERSOyAvKiBkb24ndCB1c2UgdGhpcyBpbiBhIHNlY3VyZSBlbnZpcm9ubWVudC4gV2Uga2VlcCBpdCBoZXJlIHNvIHlvdSBjYW4gcXVpY2tseSByZXN0YXJ0IHRoZSByb3V0ZXIgKi8KKyAgICBtID0gc29hcF9iaW5kKCZzb2FwLCBOVUxMLCBwb3J0X251bWJlciwgQkFDS0xPRyk7CisgICAgaWYgKG0gPCAwKQorICAgIHsgc29hcF9wcmludF9mYXVsdCgmc29hcCwgc3RkZXJyKTsKKyAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIGZwcmludGYoc3RkZXJyLCAiU29ja2V0IGNvbm5lY3Rpb24gc3VjY2Vzc2Z1bCAlZFxuIiwgbSk7CisgICAgZm9yIChpID0gMTsgOyBpKyspCisgICAgeyBzID0gc29hcF9hY2NlcHQoJnNvYXApOworICAgICAgaWYgKHMgPCAwKQorICAgICAgeyBpZiAoc29hcC5lcnJudW0pCisgICAgICAgICAgc29hcF9wcmludF9mYXVsdCgmc29hcCwgc3RkZXJyKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicm91dGVyIHRpbWVkIG91dFxuIik7IC8qIGlmIGFjY2VwdF90aW1lb3V0IGlzIHNldCAqLworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGZwcmludGYoc3RkZXJyLCAiVGhyZWFkICVkIGFjY2VwdHMgc29ja2V0ICVkIGNvbm5lY3Rpb24gZnJvbSBJUCAlZC4lZC4lZC4lZFxuIiwgaSwgcywgKGludCkoc29hcC5pcD4+MjQpJjB4RkYsIChpbnQpKHNvYXAuaXA+PjE2KSYweEZGLCAoaW50KShzb2FwLmlwPj44KSYweEZGLCAoaW50KXNvYXAuaXAmMHhGRik7CisgICAgICB0c29hcCA9IHNvYXBfY29weSgmc29hcCk7CisgICAgICBwdGhyZWFkX2NyZWF0ZSgmdGlkLCBOVUxMLCAodm9pZCooKikodm9pZCopKXByb2Nlc3NfcmVxdWVzdCwgKHZvaWQqKXRzb2FwKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7IHN0cnVjdCBzb2FwIGNsaWVudDsKKyAgICBzdHJ1Y3Qgc29hcCBzZXJ2ZXI7CisgICAgc29hcF9pbml0KCZjbGllbnQpOworICAgIHNvYXBfaW5pdCgmc2VydmVyKTsKKyAgICBzb2FwX2JlZ2luKCZjbGllbnQpOworICAgIGlmIChhcmdjIDw9IDEpIC8qIHRyeSBDR0kgZW52IHZhcnMgKi8KKyAgICB7IGNoYXIgKnMgPSBnZXRlbnYoIlJFUVVFU1RfTUVUSE9EIik7CisgICAgICBpZiAocyAmJiAhc3RyY21wKHMsICJHRVQiKSkKKyAgICAgICAgbWV0aG9kID0gU09BUF9HRVQ7CisgICAgICBlbHNlCisgICAgICB7IHMgPSBnZXRlbnYoIkNvbnRlbnQtTGVuZ3RoIik7CisgICAgICAgIGlmIChzKQorICAgICAgICAgIGNsaWVudC5sZW5ndGggPSBzdHJ0b3VsKHMsIE5VTEwsIDEwKTsKKyAgICAgIH0KKyAgICAgIHNlcnZpY2VfYWN0aW9uID0gZ2V0ZW52KCJIVFRQX1NPQVBBY3Rpb24iKTsKKyAgICAgIGlmICghc2VydmljZV9hY3Rpb24pCisgICAgICAgIHNlcnZpY2VfYWN0aW9uID0gZ2V0ZW52KCJRVUVSWV9TVFJJTkciKTsKKyAgICB9CisgICAgaWYgKG1ldGhvZCA9PSBTT0FQX1BPU1QpCisgICAgeyBzb2FwX3djaGFyIGM7CisgICAgICBpZiAoaW5wdXRfZmlsZSkKKyAgICAgIHsgY2xpZW50LnJlY3ZmZCA9IG9wZW4oaW5wdXRfZmlsZSwgT19SRE9OTFkpOworICAgICAgICBpZiAoY2xpZW50LnJlY3ZmZCA8IDApCisgICAgICAgIHsgZnByaW50ZihzdGRlcnIsICJyb3V0ZXI6IGNhbm5vdCBvcGVuIGZpbGUgJyVzJyBmb3IgcmVhZGluZ1xuIiwgaW5wdXRfZmlsZSk7CisgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYyA9IHNvYXBfZ2V0MCgmY2xpZW50KTsKKyAgICAgIGlmIChjID09ICdHJyB8fCBjID09ICdQJykgLyogc2ltcGxlIGNoZWNrIHRvIHNlZSBpZiBIVFRQIEdFVC9QT1NUIGhlYWRlciBpcyBwcmVzZW50ICovCisgICAgICB7IGlmIChjb3B5X2hlYWRlcigmY2xpZW50LCAmc2VydmVyLCBzZXJ2aWNlX2VuZHBvaW50LCBzZXJ2aWNlX2FjdGlvbikpCisgICAgICAgIHsgY2xpZW50LmVycm9yID0gc2VydmVyLmVycm9yOworICAgICAgICAgIHNvYXBfc2VuZF9mYXVsdCgmY2xpZW50KTsKKyAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IHN0cnVjdCBzdGF0IHNiOworICAgICAgICBpZiAoIWZzdGF0KGNsaWVudC5yZWN2ZmQsICZzYikgJiYgc2Iuc3Rfc2l6ZSA+IDApCisgICAgICAgICAgY2xpZW50Lmxlbmd0aCA9IHNiLnN0X3NpemU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBidWZmZXJfYm9keSgmY2xpZW50KTsKKyAgICAgICAgaWYgKGNyZWF0ZV9oZWFkZXIoJnNlcnZlciwgU09BUF9QT1NULCBzZXJ2aWNlX2VuZHBvaW50LCBzZXJ2aWNlX2FjdGlvbiwgY2xpZW50Lmxlbmd0aCkpCisgICAgICAgIHsgY2xpZW50LmVycm9yID0gc2VydmVyLmVycm9yOworICAgICAgICAgIHNvYXBfc2VuZF9mYXVsdCgmY2xpZW50KTsKKyAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICB9CisgICAgICBjb3B5X2JvZHkoJmNsaWVudCwgJnNlcnZlcik7CisgICAgfQorICAgIGVsc2UKKyAgICB7IGlmIChjcmVhdGVfaGVhZGVyKCZzZXJ2ZXIsIFNPQVBfR0VULCBzZXJ2aWNlX2VuZHBvaW50LCBzZXJ2aWNlX2FjdGlvbiwgMCkpCisgICAgICB7IGNsaWVudC5lcnJvciA9IHNlcnZlci5lcnJvcjsKKyAgICAgICAgc29hcF9zZW5kX2ZhdWx0KCZjbGllbnQpOworICAgICAgICBleGl0KDEpOworICAgICAgfQorICAgICAgc29hcF9lbmRfc2VuZCgmc2VydmVyKTsKKyAgICB9CisgICAgc29hcF9iZWdpbigmc2VydmVyKTsKKyAgICAvKiBzaG91bGQgY2hlY2sgdGhlc2UgZm9yIGVycm9yczogKi8KKyAgICBjb3B5X2hlYWRlcigmc2VydmVyLCAmY2xpZW50LCBOVUxMLCBOVUxMKTsKKyAgICBjb3B5X2JvZHkoJnNlcnZlciwgJmNsaWVudCk7CisgICAgc29hcF9jbG9zZXNvY2soJmNsaWVudCk7CisgICAgc29hcF9jbG9zZXNvY2soJnNlcnZlcik7CisgICAgc29hcF9lbmQoJmNsaWVudCk7CisgICAgc29hcF9lbmQoJnNlcnZlcik7CisgICAgc29hcF9kb25lKCZjbGllbnQpOworICAgIHNvYXBfZG9uZSgmc2VydmVyKTsKKyAgfQorICByZXR1cm4gMDsKK30KKwordm9pZAorb3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7IGludCBpLCBmbGFnOworICBjaGFyICphcmc7CisgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCisgIHsgYXJnID0gYXJndltpXTsKKyAgICBpZiAoKmFyZyA9PSBPUFRJT05fQ0hBUikKKyAgICB7IGZsYWcgPSAxOworICAgICAgd2hpbGUgKGZsYWcgJiYgKisrYXJnKQorICAgICAgICBzd2l0Y2ggKCphcmcpCisgICAgICAgIHsgY2FzZSAnaCc6CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiByb3V0ZXIgWy1wPHBvcnQ+XSBbLWU8ZW5kcG9pbnQ+IHwgLWc8ZW5kcG9pbnQ+XSBbLWE8YWN0aW9uPl0gWy1yPHJvdXRpbmdmaWxlPl0gWy1jXSBbPG1zZ2ZpbGU+XVxuIik7CisgICAgICAgICAgICBleGl0KDApOworICAgICAgICAgIGNhc2UgJ3AnOgorICAgICAgICAgICAgZmxhZyA9IDA7CisgICAgICAgICAgICBpZiAoKisrYXJnKQorICAgICAgICAgICAgICBwb3J0X251bWJlciA9IGF0b2woYXJnKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGkgPCBhcmdjICYmIGFyZ3ZbKytpXSkKKyAgICAgICAgICAgICAgcG9ydF9udW1iZXIgPSBhdG9sKGFyZ3ZbaV0pOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyBmcHJpbnRmKHN0ZGVyciwgInJvdXRlcjogLXAgcmVxdWlyZXMgPHBvcnQ+XG4iKTsKKyAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ2cnOgorCSAgICBtZXRob2QgPSBTT0FQX0dFVDsKKyAgICAgICAgICBjYXNlICdlJzoKKyAgICAgICAgICAgIGZsYWcgPSAwOworICAgICAgICAgICAgaWYgKCorK2FyZykKKyAgICAgICAgICAgICAgc2VydmljZV9lbmRwb2ludCA9IGFyZzsKKyAgICAgICAgICAgIGVsc2UgaWYgKGkgPCBhcmdjICYmIGFyZ3ZbKytpXSkKKyAgICAgICAgICAgICAgc2VydmljZV9lbmRwb2ludCA9IGFyZ3ZbaV07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7IGZwcmludGYoc3RkZXJyLCAicm91dGVyOiAtZSBhbmQgLWcgcmVxdWlyZSA8ZW5kcG9pbnQ+XG4iKTsKKyAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ2EnOgorICAgICAgICAgICAgZmxhZyA9IDA7CisgICAgICAgICAgICBpZiAoKisrYXJnKQorICAgICAgICAgICAgICBzZXJ2aWNlX2FjdGlvbiA9IGFyZzsKKyAgICAgICAgICAgIGVsc2UgaWYgKGkgPCBhcmdjICYmIGFyZ3ZbKytpXSkKKyAgICAgICAgICAgICAgc2VydmljZV9hY3Rpb24gPSBhcmd2W2ldOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyBmcHJpbnRmKHN0ZGVyciwgInJvdXRlcjogLWEgcmVxdWlyZXMgPGFjdGlvbj5cbiIpOworICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAncic6CisgICAgICAgICAgICBmbGFnID0gMDsKKyAgICAgICAgICAgIGlmICgqKythcmcpCisgICAgICAgICAgICAgIHJvdXRpbmdfZmlsZSA9IGFyZzsKKyAgICAgICAgICAgIGVsc2UgaWYgKGkgPCBhcmdjICYmIGFyZ3ZbKytpXSkKKyAgICAgICAgICAgICAgcm91dGluZ19maWxlID0gYXJndltpXTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgZnByaW50ZihzdGRlcnIsICJyb3V0ZXI6IC1yIHJlcXVpcmVzIDxyb3V0aW5nZmlsZT5cbiIpOworICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAndCc6CisgICAgICAgICAgICBmbGFnID0gMDsKKyAgICAgICAgICAgIGlmICgqKythcmcpCisgICAgICAgICAgICAgIHNlcnZlcl90aW1lb3V0ID0gYXRvbChhcmcpOworICAgICAgICAgICAgZWxzZSBpZiAoaSA8IGFyZ2MgJiYgYXJndlsrK2ldKQorICAgICAgICAgICAgICBzZXJ2ZXJfdGltZW91dCA9IGF0b2woYXJndltpXSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7IGZwcmludGYoc3RkZXJyLCAicm91dGVyOiAtdCByZXF1aXJlcyA8dGltZW91dD5cbiIpOworICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisJICBjYXNlICdjJzoKKwkgICAgY29ubmVjdF9mbGFnID0gMTsKKwkgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicm91dGVyOiB1bmtub3duIG9wdGlvbiAtJWNcbiIsICphcmcpOworCX0KKyAgICB9CisgICAgZWxzZQorICAgICAgaW5wdXRfZmlsZSA9IGFyZzsKKyAgfQorfQorCit2b2lkKgorcHJvY2Vzc19yZXF1ZXN0KHZvaWQgKnNvYXApCit7IHN0cnVjdCBzb2FwICpjbGllbnQsIHNlcnZlcjsKKyAgc29hcF93Y2hhciBjOworICBwdGhyZWFkX2RldGFjaChwdGhyZWFkX3NlbGYoKSk7CisgIGNsaWVudCA9IChzdHJ1Y3Qgc29hcCopc29hcDsKKyAgc29hcF9pbml0KCZzZXJ2ZXIpOworICBzb2FwX2JlZ2luKGNsaWVudCk7CisgIGMgPSBzb2FwX2dldDAoY2xpZW50KTsKKyAgaWYgKGMgPT0gJ0cnIHx8IGMgPT0gJ1AnKSAvKiBzaW1wbGUgY2hlY2sgdG8gc2VlIGlmIEhUVFAgR0VUL1BPU1QgaGVhZGVyIGlzIHByZXNlbnQgKi8KKyAgeyBpZiAoY29weV9oZWFkZXIoY2xpZW50LCAmc2VydmVyLCBOVUxMLCBOVUxMKSkKKyAgICAgIGNsaWVudC0+ZXJyb3IgPSBzZXJ2ZXIuZXJyb3I7CisgIH0KKyAgZWxzZQorICB7IGJ1ZmZlcl9ib2R5KGNsaWVudCk7CisgICAgaWYgKGNyZWF0ZV9oZWFkZXIoJnNlcnZlciwgbWV0aG9kLCBzZXJ2aWNlX2VuZHBvaW50LCBzZXJ2aWNlX2FjdGlvbiwgY2xpZW50LT5sZW5ndGgpKQorICAgICAgY2xpZW50LT5lcnJvciA9IHNlcnZlci5lcnJvcjsKKyAgfQorICBpZiAoIWNsaWVudC0+ZXJyb3IpCisgIHsgY29weV9ib2R5KGNsaWVudCwgJnNlcnZlcik7CisgICAgc29hcF9iZWdpbigmc2VydmVyKTsKKyAgICBjb3B5X2hlYWRlcigmc2VydmVyLCBjbGllbnQsIE5VTEwsIE5VTEwpOworICAgIGNvcHlfYm9keSgmc2VydmVyLCBjbGllbnQpOworICB9CisgIGVsc2UKKyAgICBzb2FwX3NlbmRfZmF1bHQoY2xpZW50KTsKKyAgc29hcF9jbG9zZXNvY2soY2xpZW50KTsKKyAgc29hcF9jbG9zZXNvY2soJnNlcnZlcik7CisgIHNvYXBfZW5kKGNsaWVudCk7CisgIHNvYXBfZW5kKCZzZXJ2ZXIpOworICBzb2FwX2RvbmUoY2xpZW50KTsKKyAgc29hcF9kb25lKCZzZXJ2ZXIpOworICBmcmVlKHNvYXApOworICByZXR1cm4gTlVMTDsKK30KKworY29uc3QgY2hhcioKK2xvb2t1cChzdHJ1Y3QgdF9fUm91dGluZ1RhYmxlICpyb3V0ZSwgY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp1c2VyaWQsIGNvbnN0IGNoYXIgKnBhc3N3ZCkKK3sgc3RhdGljIHN0cnVjdCB0X19Sb3V0aW5nVGFibGUgcm91dGluZ190YWJsZSA9IHswLCBOVUxMfTsgLyogZmlsZS1iYXNlZCByb3V0aW5nIHRhYmxlIGNhY2hlICovCisgIGlmICgha2V5KQorICAgIHJldHVybiBOVUxMOyAvKiBjYW4ndCBkbyBsb29rdXAgb24gbmlsIGtleSAqLworICBpZiAoIXJvdXRlLT5fX3B0cikKKyAgeyByb3V0ZS0+X19wdHIgPSByb3V0aW5nOyAvKiBmaXJzdCBzdGFnZTogdXNlIGludGVybmFsIHJvdXRpbmcgdGFibGUgKi8KKyAgICByb3V0ZS0+X19zaXplID0gOTk5OTk5OTk5OworICB9CisgIGVsc2UgaWYgKHJvdXRlLT5fX3NpemUpCisgIHsgcm91dGUtPl9fcHRyKys7CisgICAgcm91dGUtPl9fc2l6ZS0tOworICB9CisgIGZvciAoOzspCisgIHsgaWYgKHJvdXRlLT5fX3B0cikKKyAgICB7IHdoaWxlIChyb3V0ZS0+X19zaXplICYmIHJvdXRlLT5fX3B0ci0+a2V5KQorICAgICAgeyBpZiAoIXNvYXBfdGFnX2NtcChrZXksIHJvdXRlLT5fX3B0ci0+a2V5KSkKKwkgIGlmICghcm91dGUtPl9fcHRyLT51c2VyaWQKKwkgICB8fCAhcm91dGUtPl9fcHRyLT5wYXNzd2QKKwkgICB8fCAhc29hcF90YWdfY21wKHVzZXJpZCwgcm91dGUtPl9fcHRyLT51c2VyaWQpCisJICAgfHwgIXNvYXBfdGFnX2NtcChwYXNzd2QsIHJvdXRlLT5fX3B0ci0+cGFzc3dkKSkKKyAgICAgICAgICByZXR1cm4gcm91dGUtPl9fcHRyLT5lbmRwb2ludDsKKyAgICAgICAgcm91dGUtPl9fcHRyKys7CisgICAgICAgIHJvdXRlLT5fX3NpemUtLTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHJvdXRlLT5fX3NpemUpIC8qIHNlY29uZCBzdGFnZTogdXNlIGZpbGUtYmFzZWQgcm91dGluZyB0YWJsZSAqLworICAgIHsgaWYgKHJvdXRpbmdfdGFibGUuX19wdHIpCisgICAgICAgICpyb3V0ZSA9IHJvdXRpbmdfdGFibGU7IC8qIHRhYmxlIGlzIGFscmVhZHkgY2FjaGVkIGluIG1lbW9yeSAqLworICAgICAgZWxzZSBpZiAocm91dGluZ19maWxlKSAvKiBlbHNlIHJlYWQgdGFibGUgZnJvbSBmaWxlICovCisgICAgICB7IHN0cnVjdCBzb2FwIHNvYXA7CisgICAgICAgIHNvYXBfaW5pdCgmc29hcCk7CisgICAgICAgIHNvYXAucmVjdmZkID0gb3Blbihyb3V0aW5nX2ZpbGUsIE9fUkRPTkxZKTsKKyAgICAgICAgaWYgKHNvYXAucmVjdmZkIDwgMCkgLyogbm8gcm91dGluZyBmaWxlOiBzaWxlbnRseSBzdG9wICovCisJeyBzb2FwX2RvbmUoJnNvYXApOworCSAgYnJlYWs7CisJfQorICAgICAgICBpZiAoIXNvYXBfYmVnaW5fcmVjdigmc29hcCkpCisJICBpZiAoIXNvYXBfZ2V0X3RfX1JvdXRpbmdUYWJsZSgmc29hcCwgJnJvdXRpbmdfdGFibGUsICJyb3V0ZXIiLCBOVUxMKSkKKwkgIHsgY2xvc2Uoc29hcC5yZWN2ZmQpOworCSAgICBzb2FwX2RvbmUoJnNvYXApOworCSAgICBicmVhazsKKwkgIH0KKwlzb2FwX2VuZF9yZWN2KCZzb2FwKTsKKwljbG9zZShzb2FwLnJlY3ZmZCk7CisJc29hcF9kb25lKCZzb2FwKTsKKwkqcm91dGUgPSByb3V0aW5nX3RhYmxlOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworaW50CittYWtlX2Nvbm5lY3Qoc3RydWN0IHNvYXAgKnNlcnZlciwgY29uc3QgY2hhciAqZW5kcG9pbnQpCit7IGNoYXIgaG9zdFtTT0FQX1RBR0xFTl07CisgIGludCBwb3J0OworICBzdHJjcHkoaG9zdCwgc2VydmVyLT5ob3N0KTsKKyAgcG9ydCA9IHNlcnZlci0+cG9ydDsKKyAgc29hcF9zZXRfZW5kcG9pbnQoc2VydmVyLCBlbmRwb2ludCk7CS8qIGdldCBob3N0LCBwYXRoLCBhbmQgcG9ydCAqLworICBzZXJ2ZXItPmNvbm5lY3RfdGltZW91dCA9IHNlcnZlcl90aW1lb3V0OworICBzZXJ2ZXItPnJlY3ZfdGltZW91dCA9IHNlcnZlcl90aW1lb3V0OworICBzZXJ2ZXItPnNlbmRfdGltZW91dCA9IHNlcnZlcl90aW1lb3V0OworICAvKiBzZXJ2ZXItPmNvbm5lY3RfZmxhZ3MgPSBTT19OT1NJR1BJUEU7ICovCS8qIHByZXZlbnRzIFVOSVggU0lHUElQRSAqLworICAvKiBzZXJ2ZXItPnNvY2tldF9mbGFncyA9IE1TR19OT1NJR05BTDsgKi8JLyogcHJldmVudHMgVU5JWCBTSUdQSVBFICovCisgIGlmICgqc2VydmVyLT5ob3N0KQorICB7IGlmIChzZXJ2ZXItPnNvY2tldCA8IDAgfHwgc3RyY21wKHNlcnZlci0+aG9zdCwgaG9zdCkgfHwgc2VydmVyLT5wb3J0ICE9IHBvcnQpCisgICAgeyBzb2FwX2Nsb3Nlc29jayhzZXJ2ZXIpOworICAgICAgc2VydmVyLT5zb2NrZXQgPSBzZXJ2ZXItPmZvcGVuKHNlcnZlciwgZW5kcG9pbnQsIHNlcnZlci0+aG9zdCwgc2VydmVyLT5wb3J0KTsKKyAgICAgIGlmIChzZXJ2ZXItPnNvY2tldCA8IDApCisgICAgICAgIHJldHVybiBzZXJ2ZXItPmVycm9yOworICAgIH0KKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKworaW50CitzZXJ2ZXJfY29ubmVjdChzdHJ1Y3Qgc29hcCAqc2VydmVyLCBjb25zdCBjaGFyICplbmRwb2ludCwgY29uc3QgY2hhciAqYWN0aW9uLCBjb25zdCBjaGFyICp1c2VyaWQsIGNvbnN0IGNoYXIgKnBhc3N3ZCkKK3sgaWYgKGFjdGlvbiAmJiAqYWN0aW9uKQorICB7IHN0cnVjdCB0X19Sb3V0aW5nVGFibGUgcm91dGU7CisgICAgcm91dGUuX19wdHIgPSBOVUxMOworICAgIHJvdXRlLl9fc2l6ZSA9IDA7CisgICAgZnByaW50ZihzdGRlcnIsICJTZWFyY2hpbmcgc2VydmljZXMgb24gYWN0aW9uICVzLi4uXG4iLCBhY3Rpb24pOworICAgIHdoaWxlIChsb29rdXAoJnJvdXRlLCBhY3Rpb24sIHVzZXJpZCwgcGFzc3dkKSkKKyAgICB7IGZwcmludGYoc3RkZXJyLCAiQXR0ZW1wdGluZyB0byBjb25uZWN0IHRvICclcydcbiIsIHJvdXRlLl9fcHRyLT5lbmRwb2ludCk7CisgICAgICBpZiAoIW1ha2VfY29ubmVjdChzZXJ2ZXIsIHJvdXRlLl9fcHRyLT5lbmRwb2ludCkpCisgICAgICAgIHJldHVybiBTT0FQX09LOworICAgIH0KKyAgfQorICBpZiAoZW5kcG9pbnQgJiYgKmVuZHBvaW50KQorICB7IHN0cnVjdCB0X19Sb3V0aW5nVGFibGUgcm91dGU7CisgICAgcm91dGUuX19wdHIgPSBOVUxMOworICAgIHJvdXRlLl9fc2l6ZSA9IDA7CisgICAgZnByaW50ZihzdGRlcnIsICJTZWFyY2hpbmcgc2VydmljZXMgb24gZW5kcG9pbnQgJXMuLi5cbiIsIGVuZHBvaW50KTsKKyAgICB3aGlsZSAobG9va3VwKCZyb3V0ZSwgZW5kcG9pbnQsIHVzZXJpZCwgcGFzc3dkKSkKKyAgICB7IGZwcmludGYoc3RkZXJyLCAiQXR0ZW1wdGluZyB0byBjb25uZWN0IHRvICclcydcbiIsIHJvdXRlLl9fcHRyLT5lbmRwb2ludCk7CisgICAgICBpZiAoIW1ha2VfY29ubmVjdChzZXJ2ZXIsIHJvdXRlLl9fcHRyLT5lbmRwb2ludCkpCisgICAgICAgIHJldHVybiBTT0FQX09LOworICAgIH0KKyAgfQorICBpZiAoY29ubmVjdF9mbGFnICYmIGVuZHBvaW50ICYmICplbmRwb2ludCkKKyAgeyBmcHJpbnRmKHN0ZGVyciwgIkNvbm5lY3QgdG8gZW5kcG9pbnQgJXMuLi5cbiIsIGVuZHBvaW50KTsKKyAgICBpZiAoIW1ha2VfY29ubmVjdChzZXJ2ZXIsIGVuZHBvaW50KSkKKyAgICAgIHJldHVybiBTT0FQX09LOworICB9CisgIHJldHVybiBzZXJ2ZXItPmVycm9yID0gU09BUF9UQ1BfRVJST1I7Cit9CisKK2ludAorY29weV9oZWFkZXIoc3RydWN0IHNvYXAgKnNlbmRlciwgc3RydWN0IHNvYXAgKnJlY2VpdmVyLCBjb25zdCBjaGFyICplbmRwb2ludCwgY29uc3QgY2hhciAqYWN0aW9uKQoreyBzdHJ1Y3QgaGVhZGVyICpoLCAqcDsKKyAgY2hhciAqcywgKnQ7CisgIGggPSAoc3RydWN0IGhlYWRlciopbWFsbG9jKHNpemVvZihzdHJ1Y3QgaGVhZGVyKSk7CisgIGZvciAoOzspCisgIHsgaWYgKHNvYXBfZ2V0bGluZShzZW5kZXIsIGgtPmxpbmUsIFNPQVBfSERSTEVOKSkKKyAgICB7IGZyZWUoaCk7CisgICAgICByZXR1cm4gc2VuZGVyLT5lcnJvciA9IFNPQVBfRU9GOworICAgIH0KKyAgICB0ID0gc3RyY2hyKGgtPmxpbmUsICcgJyk7CisgICAgaWYgKCF0IHx8IHN0cm5jbXAodCwgIiAxMDAgIiwgNSkpCisgICAgICBicmVhazsKKyAgICBkbworICAgIHsgaWYgKHNvYXBfZ2V0bGluZShzZW5kZXIsIGgtPmxpbmUsIFNPQVBfSERSTEVOKSkKKyAgICAgIHsgZnJlZShoKTsKKyAgICAgICAgcmV0dXJuIHNlbmRlci0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAgIH0KKyAgICB9IHdoaWxlICgqaC0+bGluZSk7IAorICB9CisgIHAgPSBoOworICBmb3IgKDs7KQorICB7IHAgPSBwLT5uZXh0ID0gKHN0cnVjdCBoZWFkZXIqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGhlYWRlcikpOworICAgIHAtPm5leHQgPSBOVUxMOworICAgIGlmIChzb2FwX2dldGxpbmUoc2VuZGVyLCBwLT5saW5lLCBTT0FQX0hEUkxFTikpCisgICAgeyB3aGlsZSAoaCkKKyAgICAgIHsgcCA9IGgtPm5leHQ7CisgICAgICAgIGZyZWUoaCk7CisgICAgICAgIGggPSBwOworICAgICAgfQorICAgICAgcmV0dXJuIHNlbmRlci0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICB9CisgICAgaWYgKCEqcC0+bGluZSkKKyAgICAgIGJyZWFrOworICAgIHMgPSB0ID0gc3RyY2hyKHAtPmxpbmUsICc6Jyk7CisgICAgaWYgKHQpCisgICAgeyAqdCA9ICdcMCc7CisgICAgICBkbyB0Kys7CisgICAgICB3aGlsZSAoKnQgJiYgKnQgPD0gMzIpOworICAgIH0KKyAgICBzZW5kZXItPmZwYXJzZWhkcihzZW5kZXIsIHAtPmxpbmUsIHQpOworICAgIGlmIChzKQorICAgICAgKnMgPSAnOic7CisgIH0KKyAgcyA9IHN0cnN0cihoLT5saW5lLCAiSFRUUC8iKTsKKyAgaWYgKHMgJiYgKCFzdHJuY21wKGgtPmxpbmUsICJHRVQgIiwgNCkgfHwgIXN0cm5jbXAoaC0+bGluZSwgIlBPU1QgIiwgNSkpKQorICB7IHNpemVfdCBtID0gc3RybGVuKHNlbmRlci0+ZW5kcG9pbnQpOworICAgIHNpemVfdCBuID0gbSArIChzIC0gaC0+bGluZSkgLSA1IC0gKCpoLT5saW5lID09ICdQJyk7CisgICAgaWYgKG4gPj0gc2l6ZW9mKHNlbmRlci0+ZW5kcG9pbnQpKQorICAgICAgbiA9IHNpemVvZihzZW5kZXItPmVuZHBvaW50KSAtIDE7CisgICAgc3RybmNweShzZW5kZXItPnBhdGgsIGgtPmxpbmUgKyA0ICsgKCpoLT5saW5lID09ICdQJyksIG4gLSBtKTsKKyAgICBzZW5kZXItPnBhdGhbbiAtIG1dID0gJ1wwJzsKKyAgICBzdHJjYXQoc2VuZGVyLT5lbmRwb2ludCwgc2VuZGVyLT5wYXRoKTsKKyAgfQorICBpZiAoIWVuZHBvaW50IHx8ICEqZW5kcG9pbnQpCisgICAgZW5kcG9pbnQgPSBzZW5kZXItPmVuZHBvaW50OworICBpZiAoIWFjdGlvbiB8fCAhKmFjdGlvbikKKyAgICBhY3Rpb24gPSBzZW5kZXItPmFjdGlvbjsKKyAgaWYgKHNlcnZlcl9jb25uZWN0KHJlY2VpdmVyLCBlbmRwb2ludCwgYWN0aW9uLCByZWNlaXZlci0+dXNlcmlkLCByZWNlaXZlci0+cGFzc3dkKSkKKyAgeyB3aGlsZSAoaCkKKyAgICB7IHAgPSBoLT5uZXh0OworICAgICAgZnJlZShoKTsKKyAgICAgIGggPSBwOworICAgIH0KKyAgICByZXR1cm4gcmVjZWl2ZXItPmVycm9yOworICB9CisgIHJlY2VpdmVyLT5jb3VudCA9IHNlbmRlci0+bGVuZ3RoOworICBzb2FwX2JlZ2luX3NlbmQocmVjZWl2ZXIpOworICByZWNlaXZlci0+bW9kZSAmPSB+U09BUF9JTzsKKyAgcmVjZWl2ZXItPm1vZGUgfD0gU09BUF9JT19CVUZGRVI7CisgIHdoaWxlIChoKQorICB7IHJlY2VpdmVyLT5mcG9zdGhkcihyZWNlaXZlciwgaC0+bGluZSwgTlVMTCk7CisgICAgcCA9IGgtPm5leHQ7CisgICAgZnJlZShoKTsKKyAgICBoID0gcDsKKyAgfQorICBpZiAoKHNlbmRlci0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgIHsgaWYgKHNvYXBfZmx1c2gocmVjZWl2ZXIpKQorICAgICAgcmV0dXJuIHJlY2VpdmVyLT5lcnJvcjsKKyAgICByZWNlaXZlci0+bW9kZSAmPSB+U09BUF9JTzsKKyAgICByZWNlaXZlci0+bW9kZSB8PSBTT0FQX0lPX0NIVU5LOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorCitpbnQKK2NyZWF0ZV9oZWFkZXIoc3RydWN0IHNvYXAgKnNlcnZlciwgaW50IG1ldGhvZCwgY29uc3QgY2hhciAqZW5kcG9pbnQsIGNvbnN0IGNoYXIgKmFjdGlvbiwgc2l6ZV90IGNvdW50KQoreyBpZiAoc2VydmVyX2Nvbm5lY3Qoc2VydmVyLCBlbmRwb2ludCwgYWN0aW9uLCBOVUxMLCBOVUxMKSkKKyAgICByZXR1cm4gc2VydmVyLT5lcnJvcjsKKyAgc29hcF9iZWdpbl9zZW5kKHNlcnZlcik7CisgIHNlcnZlci0+c3RhdHVzID0gbWV0aG9kOworICByZXR1cm4gc2VydmVyLT5lcnJvciA9IHNlcnZlci0+ZnBvc3Qoc2VydmVyLCBzZXJ2ZXItPmVuZHBvaW50LCBzZXJ2ZXItPmhvc3QsIHNlcnZlci0+cG9ydCwgc2VydmVyLT5wYXRoLCBhY3Rpb24sIGNvdW50KTsKK30KKworaW50CitidWZmZXJfYm9keShzdHJ1Y3Qgc29hcCAqc2VuZGVyKQoreyBjaGFyICpzOworICBpZiAoc29hcF9uZXdfYmxvY2soc2VuZGVyKSkKKyAgICByZXR1cm4gc2VuZGVyLT5lcnJvcjsKKyAgZm9yICg7OykKKyAgeyBpZiAoIShzID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzZW5kZXIsIHNlbmRlci0+YnVmbGVuIC0gc2VuZGVyLT5idWZpZHgpKSkKKyAgICAgIHJldHVybiBTT0FQX0VPTTsKKyAgICBtZW1jcHkocywgc2VuZGVyLT5idWYgKyBzZW5kZXItPmJ1ZmlkeCwgc2VuZGVyLT5idWZsZW4gLSBzZW5kZXItPmJ1ZmlkeCk7CisgICAgaWYgKHNvYXBfcmVjdl9yYXcoc2VuZGVyKSkKKyAgICAgIGJyZWFrOworICB9CisgIGlmIChzb2FwX2VuZF9yZWN2KHNlbmRlcikpCisgICAgcmV0dXJuIHNlbmRlci0+ZXJyb3I7CisgIHNlbmRlci0+bGVuZ3RoID0gc2VuZGVyLT5ibGlzdC0+c2l6ZTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK2ludAorY29weV9ib2R5KHN0cnVjdCBzb2FwICpzZW5kZXIsIHN0cnVjdCBzb2FwICpyZWNlaXZlcikKK3sgaWYgKHNlbmRlci0+Ymxpc3QpCisgIHsgY2hhciAqcDsKKyAgICBmb3IgKHAgPSBzb2FwX2ZpcnN0X2Jsb2NrKHNlbmRlcik7IHA7IHAgPSBzb2FwX25leHRfYmxvY2soc2VuZGVyKSkKKyAgICAgIHNvYXBfc2VuZF9yYXcocmVjZWl2ZXIsIHAsIHNvYXBfYmxvY2tfc2l6ZShzZW5kZXIpKTsKKyAgICBzb2FwX2VuZF9ibG9jayhzZW5kZXIpOworICB9CisgIGVsc2UKKyAgeyBpZiAoKHNlbmRlci0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgICAgeyBzZW5kZXItPmNodW5rYnVmbGVuID0gc2VuZGVyLT5idWZsZW47CisgICAgICBzZW5kZXItPmJ1ZmxlbiA9IHNlbmRlci0+YnVmaWR4OworICAgICAgc2VuZGVyLT5jaHVua3NpemUgPSAwOworICAgICAgd2hpbGUgKCFzb2FwX3JlY3ZfcmF3KHNlbmRlcikpCisgICAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHJlY2VpdmVyLCBzZW5kZXItPmJ1ZiArIHNlbmRlci0+YnVmaWR4LCBzZW5kZXItPmJ1ZmxlbiAtIHNlbmRlci0+YnVmaWR4KSkKKyAgICAgICAgICByZXR1cm4gcmVjZWl2ZXItPmVycm9yOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeyBzb2FwX3NlbmRfcmF3KHJlY2VpdmVyLCBzZW5kZXItPmJ1ZiArIHNlbmRlci0+YnVmaWR4LCBzZW5kZXItPmJ1ZmxlbiAtIHNlbmRlci0+YnVmaWR4KTsgLyogc2VuZCBwYXJ0IGFmdGVyIEhUVFAgaGVhZGVyICovCisgICAgICBpZiAoc2VuZGVyLT5idWZsZW4gLSBzZW5kZXItPmJ1ZmlkeCA8IHNlbmRlci0+bGVuZ3RoKQorICAgICAgeyBzZW5kZXItPmxlbmd0aCAtPSBzZW5kZXItPmJ1ZmxlbiAtIHNlbmRlci0+YnVmaWR4OworICAgICAgICB3aGlsZSAoIXNvYXBfcmVjdl9yYXcoc2VuZGVyKSkKKyAgICAgICAgeyBpZiAoc29hcF9zZW5kX3JhdyhyZWNlaXZlciwgc2VuZGVyLT5idWYsIHNlbmRlci0+YnVmbGVuKSkKKyAgICAgICAgICAgIHJldHVybiByZWNlaXZlci0+ZXJyb3I7CisJICBpZiAoc2VuZGVyLT5idWZsZW4gPj0gc2VuZGVyLT5sZW5ndGgpCisJICAgIGJyZWFrOworICAgICAgICAgIHNlbmRlci0+bGVuZ3RoIC09IHNlbmRlci0+YnVmbGVuOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmIChzb2FwX2VuZF9yZWN2KHNlbmRlcikpCisgICAgICByZXR1cm4gc2VuZGVyLT5lcnJvcjsKKyAgfQorICBpZiAoc29hcF9lbmRfc2VuZChyZWNlaXZlcikpCisgICAgcmV0dXJuIHJlY2VpdmVyLT5lcnJvcjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK3N0cnVjdCBOYW1lc3BhY2UgbmFtZXNwYWNlc1tdID0KK3sgeyJTT0FQLUVOViIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyJ9LAorICB7IlNPQVAtRU5DIiwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIn0sCisgIHsieHNpIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgImh0dHA6Ly93d3cudzMub3JnLyovWE1MU2NoZW1hLWluc3RhbmNlIn0sCisgIHsieHNkIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiwgImh0dHA6Ly93d3cudzMub3JnLyovWE1MU2NoZW1hIn0sCisgIHsidCIsICJodHRwOi8vdGVtcHVyaS5vcmcifSwKKyAge05VTEwsIE5VTEx9Cit9OwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9yb3V0ZXIvcm91dGVyLmggYi9zYW1wbGVzL3JvdXRlci9yb3V0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWQ4MzE2Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9yb3V0ZXIvcm91dGVyLmgKQEAgLTAsMCArMSwxOSBAQAorLyoJcm91dGVyLmgKKworCVNpbXBsZSBXZWIgU2VydmljZSBtZXNzYWdlIHJvdXRlciAocmVsYXkgc2VydmVyKQorCisJQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisqLworCitzdHJ1Y3QgdF9fUm91dGluZworeyBjaGFyICprZXk7CQkvLyBrZXkgbWF0Y2hlcyBTT0FQQWN0aW9uIG9yIHF1ZXJ5IHN0cmluZyBvciBlbmRwb2ludCBVUkwKKyAgY2hhciAqZW5kcG9pbnQ7CisgIGNoYXIgKnVzZXJpZDsJCS8vIG9wdGlvbmFsIEhUVFAgQXV0aG9yaXphdGlvbiB1c2VyaWQKKyAgY2hhciAqcGFzc3dkOwkJLy8gb3B0aW9uYWwgSFRUUCBBdXRob3JpemF0aW9uIHBhc3N3ZAorfTsKKworc3RydWN0IHRfX1JvdXRpbmdUYWJsZQoreyBpbnQgX19zaXplOworICBzdHJ1Y3QgdF9fUm91dGluZyAqX19wdHI7Cit9OwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9yb3V0ZXIvcm91dGVyLnhtbCBiL3NhbXBsZXMvcm91dGVyL3JvdXRlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgwNzg5NgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvcm91dGVyL3JvdXRlci54bWwKQEAgLTAsMCArMSw4IEBACis8cm91dGVyPgorIDxpdGVtPgorICA8a2V5PmRpbWU8L2tleT4KKyAgPGVuZHBvaW50Pmh0dHA6Ly9sb2NhbGhvc3Q6MTgwMDA8L2VuZHBvaW50PgorICA8dXNlcmlkPmd1ZXN0PC91c2VyaWQ+CisgIDxwYXNzd2Q+Z3Vlc3Q8L3Bhc3N3ZD4KKyA8L2l0ZW0+Cis8L3JvdXRlcj4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvcnNzL01ha2VmaWxlIGIvc2FtcGxlcy9yc3MvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI4MGQxNAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvcnNzL01ha2VmaWxlCkBAIC0wLDAgKzEsMjAgQEAKK0dTT0FQPS4uLy4uL3NvYXBjcHAyCitTT0FQSD0uLi8uLi9zdGRzb2FwMi5oCitTT0FQQz0uLi8uLi9zdGRzb2FwMi5jCitTT0FQQ1BQPS4uLy4uL3N0ZHNvYXAyLmNwcAorQ0M9Z2NjCitDUFA9ZysrCitMSUJTPQorQ09GTEFHUz0tTzIKK0NXRkxBR1M9LVdhbGwKK0NJRkxBR1M9LUkuLi8uLgorQ01GTEFHUz0KK0NGTEFHUz0gJChDV0ZMQUdTKSAkKENPRkxBR1MpICQoQ0lGTEFHUykgJChDTUZMQUdTKQorYWxsOgkJcnNzCityc3M6CQlyc3MuaCByc3MuYyAkKFNPQVBIKSAkKFNPQVBDKQorCQkkKEdTT0FQKSAtYyByc3MuaAorCQkkKENDKSAkKENGTEFHUykgLW8gcnNzIHJzcy5jIHNvYXBDLmMgJChTT0FQQykgJChMSUJTKQorY2xlYW46CisJCXJtIC1mICoubyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5LmgKK2Rpc3RjbGVhbjoKKwkJcm0gLWYgKi5vICoud3NkbCAqLnhzZCAqLnhtbCAqLm5zbWFwICoubG9nIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaCByc3MKZGlmZiAtLWdpdCBhL3NhbXBsZXMvcnNzL01ha2VmaWxlU29sYXJpcyBiL3NhbXBsZXMvcnNzL01ha2VmaWxlU29sYXJpcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWRjZjM5Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9yc3MvTWFrZWZpbGVTb2xhcmlzCkBAIC0wLDAgKzEsMjAgQEAKK0dTT0FQPS4uLy4uL3NvYXBjcHAyCitTT0FQSD0uLi8uLi9zdGRzb2FwMi5oCitTT0FQQz0uLi8uLi9zdGRzb2FwMi5jCitTT0FQQ1BQPS4uLy4uL3N0ZHNvYXAyLmNwcAorQ0M9Z2NjCitDUFA9ZysrCitMSUJTPS1sbnNsIC1sc29ja2V0IC1seG5ldAorQ09GTEFHUz0tTzIKK0NXRkxBR1M9LVdhbGwKK0NJRkxBR1M9LUkuLi8uLgorQ01GTEFHUz0KK0NGTEFHUz0gJChDV0ZMQUdTKSAkKENPRkxBR1MpICQoQ0lGTEFHUykgJChDTUZMQUdTKQorYWxsOgkJcnNzCityc3M6CQlyc3MuaCByc3MuYyAkKFNPQVBIKSAkKFNPQVBDKQorCQkkKEdTT0FQKSAtYyByc3MuaAorCQkkKENDKSAkKENGTEFHUykgLW8gcnNzIHJzcy5jIHNvYXBDLmMgJChTT0FQQykgJChMSUJTKQorY2xlYW46CisJCXJtIC1mICoubyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5LmgKK2Rpc3RjbGVhbjoKKwkJcm0gLWYgKi5vICoud3NkbCAqLnhzZCAqLnhtbCAqLm5zbWFwICoubG9nIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaCByc3MKZGlmZiAtLWdpdCBhL3NhbXBsZXMvcnNzL3Jzcy5jIGIvc2FtcGxlcy9yc3MvcnNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBkMjhlMQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvcnNzL3Jzcy5jCkBAIC0wLDAgKzEsMzUxIEBACisvKgorCitSU1MgMC45MSBhbmQgMi4wCisKK1JldHJpZXZlIFJTUyBmZWVkcy4KKworQ29tcGlsZToKK3NvYXBjcHAyIC1jIHJzcy5oCitjYyByc3MuYyBzdGRzb2FwMi5jIHNvYXBDLmMKKworVXNhZ2U6IHJzcyBbbWF4aXRlbXNdIFVSTAorUHJpbnRzIFJTUyBjb250ZW50IGluIHRleHQgZm9ybWF0LgorCitVc2FnZTogcnNzLmNnaQorSW5zdGFsbGVkIGFzIENHSSBhcHBsaWNhdGlvbiBwcmludHMgSmF2YXNjcmlwdCBjb2RlIHRvIHZpZXcgUlNTIGZlZWRzIGluIFdlYgorcGFnZXMuIFRoZSBKYXZhc2NyaXB0IGNvZGUgcHJvZHVjZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiBpcyBleGVjdXRlZCB3aXRoIHRoZQorZm9sbG93aW5nIGV4YW1wbGUgc2NyaXB0IGVtYmVkZGVkIGluIHRoZSBXZWIgcGFnZSwgZS5nLiB0byBkaXNwbGF5IEJCQyBuZXdzOgorCis8c2NyaXB0IHNyYz0iaHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL3Jzcy5jZ2kvP3Jzcz1odHRwJTNBJTJGJTJGd3d3LmJiYy5jby51ayUyRnN5bmRpY2F0aW9uJTJGZmVlZHMlMkZuZXdzJTJGdWtmc19uZXdzJTJGZnJvbnRfcGFnZSUyRnJzczA5MS54bWwmbWF4PTEwIj48L3NjcmlwdD4KKzxub3NjcmlwdD48YSBocmVmPSJodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vcnNzLmNnaS8/cnNzPWh0dHAlM0ElMkYlMkZ3d3cuYmJjLmNvLnVrJTJGc3luZGljYXRpb24lMkZmZWVkcyUyRm5ld3MlMkZ1a2ZzX25ld3MlMkZmcm9udF9wYWdlJTJGcnNzMDkxLnhtbCZtYXg9MTAiPlZpZXcgQkJDIE5ld3MgfCBGcm9udCBQYWdlIHwgVUsgRWRpdGlvbjwvYT48L25vc2NyaXB0PiAKKworVG8gY29udHJvbCB0aGUgYXBwZWFyYW5jZSB3aXRoIGNhc2NhZGluZyBzdHlsZSBzaGVldHM6Cityc3NfYm94CQl0aGUgYm91bmRpbmcgZGl2IGZvciB0aGUgZW50aXJlIGRpc3BsYXkgCityc3NfdGFibGUJdGhlIHRhYmxlIHdpdGggdGl0bGUsIGltYWdlLCBhbmQgaXRlbXMKK3Jzc190aXRsZQl0aGUgdGl0bGUgb2YgdGhlIGZlZWQgYW5kIGxpbmsgc3R5bGUgaWYgZGlzcGxheWVkCityc3NfaW1hZ2UJdGhlIGltYWdlCityc3NfYmFyCQl0aGUgZGl2aWRpbmcgYmFyCityc3NfaXRlbQl0aGUgdGl0bGUgb2YgdGhlIGl0ZW0KK3Jzc19kZXNjCXRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgaXRlbQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyB0d28gbGljZW5zZXM6CitHUEwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbmNsdWRlICJzb2FwSC5oIgorCisjZGVmaW5lIFNUUihzKSAocz9zOiIiKQorCisvKiBNYXhpbXVtIG51bWJlciBvZiBIVFRQIHJlZGlyZWN0cyAqLworI2RlZmluZSBNQVhfUkVESVJFQ1RTIDEwCisKK3N0YXRpYyB2b2lkIGRvY3dyaXRlMChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcyk7CitzdGF0aWMgdm9pZCBkb2N3cml0ZTEoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgY29uc3QgY2hhciAqczMpOworc3RhdGljIHZvaWQgZG9jd3JpdGUyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIGNvbnN0IGNoYXIgKnMzLCBjb25zdCBjaGFyICpzNCwgY29uc3QgY2hhciAqczUpOworc3RhdGljIHZvaWQgZG9jZXJyb3Ioc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMpOworc3RhdGljIHZvaWQgc3Ryd3JpdGUoc3RydWN0IHNvYXAgKnNvb3AsIGNvbnN0IGNoYXIgKnMpOworc3RhdGljIGNoYXIgKnF1ZXJ5X2tleShjaGFyICpidWYsIHNpemVfdCBsZW4sIGNoYXIgKipzKTsKK3N0YXRpYyBjaGFyICpxdWVyeV92YWwoY2hhciAqYnVmLCBzaXplX3QgbGVuLCBjaGFyICoqcyk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sgc3RydWN0IHNvYXAgKnNvYXAgPSBzb2FwX25ldzEoU09BUF9DX1VURlNUUklORyk7IC8qIHByZXNlcnZlIFVURjggc3RyaW5nIGNvbnRlbnQgKi8KKyAgY29uc3QgY2hhciAqZW5kcG9pbnQgPSBOVUxMOworICBzdHJ1Y3QgcnNzICpyc3M7CisgIGludCBtYXhpdGVtcyA9IDEwOyAvKiBtYXggaXRlbXMgdG8gc2hvdyAqLworICBpbnQgc2hvd19kYXRlID0gMTsgLyogc2hvdyBkYXRlIHllcy9ubyAqLworICBpbnQgaTsKKyAgLyogUlNTIGhhcyBubyBlbmNvZGluZyBzdHlsZSAqLworICBzb2FwLT5lbmNvZGluZ1N0eWxlID0gTlVMTDsKKyAgLyogZ2V0IFVSTCBvZiBSU1MgZmVlZCBvciBydW4gYXMgQ0dJIGFwcCAqLworICBpZiAoYXJnYyA+PSAzKQorICB7IG1heGl0ZW1zID0gYXRvaShhcmd2WzFdKTsKKyAgICBlbmRwb2ludCA9IGFyZ3ZbMl07CisgIH0KKyAgZWxzZSBpZiAoYXJnYyA+PSAyKQorICAgIGVuZHBvaW50ID0gYXJndlsxXTsKKyAgZWxzZQorICB7IGNoYXIgKnF1ZXJ5ID0gZ2V0ZW52KCJRVUVSWV9TVFJJTkciKTsgLyogQ0dJIGFwcDogZ2V0IHF1ZXJ5IHN0cmluZyAqLworICAgIGNoYXIgKmtleWJ1ZjsKKyAgICBjaGFyICp2YWxidWY7CisgICAgaW50IGxlbjsKKyAgICBpZiAocXVlcnkpCisgICAgeyBsZW4gPSBzdHJsZW4ocXVlcnkpOworICAgICAga2V5YnVmID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIGxlbiArIDEpOworICAgICAgdmFsYnVmID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIGxlbiArIDEpOworICAgICAgd2hpbGUgKHF1ZXJ5KQorICAgICAgeyBjaGFyICprZXkgPSBxdWVyeV9rZXkoa2V5YnVmLCBsZW4sICZxdWVyeSk7IC8qIGRlY29kZSBuZXh0IHF1ZXJ5IHN0cmluZyBrZXkgKi8KKyAgICAgICAgY2hhciAqdmFsID0gcXVlcnlfdmFsKHZhbGJ1ZiwgbGVuLCAmcXVlcnkpOyAvKiBkZWNvZGUgbmV4dCBxdWVyeSBzdHJpbmcgdmFsdWUgKGlmIGFueSkgKi8KKyAgICAgICAgLyogZ2V0IGVuZHBvaW50IGFuZCBtYXggbnVtYmVyIG9mIGl0ZW1zIHRvIGRpc3BsYXkgKi8KKyAgICAgICAgaWYgKGtleSAmJiB2YWwpCisgICAgICAgIHsgaWYgKCFzdHJjbXAoa2V5LCAicnNzIikpCisgICAgICAgICAgICBlbmRwb2ludCA9IHNvYXBfc3RyZHVwKHNvYXAsIHZhbCk7CisgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChrZXksICJtYXgiKSkKKyAgICAgICAgICAgIG1heGl0ZW1zID0gYXRvaSh2YWwpOworICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoa2V5LCAiZGF0ZSIpKQorICAgICAgICAgICAgc2hvd19kYXRlID0gKCp2YWwgPT0gJ3knKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAoIWVuZHBvaW50KQorICAgIHsgZG9jZXJyb3Ioc29hcCwgIk5vIFJTUyBVUkwiKTsKKyAgICAgIGV4aXQoMCk7CisgICAgfQorICB9CisgIC8qIGNvbm5lY3QgYW5kIHBhcnNlIEhUVFAgaGVhZGVyIChtYXggSFRUUCByZWRpcmVjdHMpICovCisgIGZvciAoaSA9IDA7IGkgPCBNQVhfUkVESVJFQ1RTOyBpKyspCisgIHsgLyogSFRUUCBHRVQgYW5kIHBhcnNlIEhUVFAgaGVhZGVyICovCisgICAgaWYgKHNvYXBfY29ubmVjdF9jb21tYW5kKHNvYXAsIFNPQVBfR0VULCBlbmRwb2ludCwgTlVMTCkKKyAgICAgfHwgc29hcF9iZWdpbl9yZWN2KHNvYXApKQorICAgIHsgaWYgKChzb2FwLT5lcnJvciA+PSAzMDEgJiYgc29hcC0+ZXJyb3IgPD0gMzAzKSB8fCBzb2FwLT5lcnJvciA9PSAzMDcpCisgICAgICAgIGVuZHBvaW50ID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+ZW5kcG9pbnQpOyAvKiBIVFRQIHJlZGlyZWN0cyAqLworICAgICAgZWxzZQorICAgICAgeyBzb2FwX3ByaW50X2ZhdWx0KHNvYXAsIHN0ZGVycik7CisgICAgICAgIGV4aXQoc29hcC0+ZXJyb3IpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICBicmVhazsKKyAgfQorICAvKiBwYXJzZSBSU1MgKi8KKyAgcnNzID0gc29hcF9nZXRfcnNzKHNvYXAsIE5VTEwsICJyc3MiLCBOVUxMKTsKKyAgLyogY2xvc2UgY29ubmVjdGlvbiAqLworICBzb2FwX2VuZF9yZWN2KHNvYXApOworICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgaWYgKGFyZ2MgPCAyKQorICB7IC8qIENHSSBhcHBsaWNhdGlvbjogcHJvZHVjZSBKYXZhc2NyaXB0ICovCisgICAgaWYgKHJzcyAmJiAoIXN0cmNtcChyc3MtPnZlcnNpb24sICIwLjkxIikgfHwgIXN0cmNtcChyc3MtPnZlcnNpb24sICIwLjkyIikgfHwgIXN0cmNtcChyc3MtPnZlcnNpb24sICIyLjAiKSkpCisgICAgeyBzb2FwX2JlZ2luX3NlbmQoc29hcCk7CisgICAgICBzb2FwLT5odHRwX2NvbnRlbnQgPSAiYXBwbGljYXRpb24vamF2YXNjcmlwdCI7CisgICAgICBzb2FwX3Jlc3BvbnNlKHNvYXAsIFNPQVBfRklMRSk7IC8qIFNPQVBfRklMRSBzcGVjaWZpZXMgaHR0cF9jb250ZW50IHNob3VsZCBiZSB1c2VkICovCisgICAgICBkb2N3cml0ZTAoc29hcCwgIjxkaXYgY2xhc3M9J3Jzc19ib3gnIGFsaWduPSdjZW50ZXInPiIpOworICAgICAgZG9jd3JpdGUwKHNvYXAsICI8dGFibGUgY2VsbHBhZGRpbmc9JzInIHdpZHRoPScxMDAlJyBjbGFzcz0ncnNzX3RhYmxlJz4iKTsKKyAgICAgIGlmIChyc3MtPmNoYW5uZWwudGl0bGUpCisgICAgICB7IGlmIChyc3MtPmNoYW5uZWwubGluaykKKwkgIGRvY3dyaXRlMihzb2FwLCAiPHRyPjx0aCBjbGFzcz0ncnNzX3RpdGxlJz48YSBocmVmPSciLCByc3MtPmNoYW5uZWwubGluaywgIic+IiwgcnNzLT5jaGFubmVsLnRpdGxlLCAiPC9hPjwvdGg+PC90cj4iKTsKKyAgICAgICAgZWxzZQorCSAgZG9jd3JpdGUxKHNvYXAsICI8dHI+PHRoIGNsYXNzPSdyc3NfdGl0bGUnPiIsIHJzcy0+Y2hhbm5lbC50aXRsZSwgIjwvdGg+PC90cj4iKTsKKyAgICAgIH0KKyAgICAgIGlmIChyc3MtPmNoYW5uZWwuaW1hZ2UgJiYgcnNzLT5jaGFubmVsLmltYWdlLT51cmwpCisgICAgICB7IHN0cnVjdCBpbWFnZSAqaW1hZ2UgPSByc3MtPmNoYW5uZWwuaW1hZ2U7CisgICAgICAgIGlmIChpbWFnZS0+bGluaykKKyAgICAgICAgICBkb2N3cml0ZTIoc29hcCwgIjx0cj48dGggY2xhc3M9J3Jzc19pbWFnZSc+PGEgaHJlZj0nIiwgaW1hZ2UtPmxpbmssICInPjxpbWcgc3JjPSciLCBpbWFnZS0+dXJsLCAiJyBhbHQ9J0NoYW5uZWwgSW1hZ2UnIGJvcmRlcj0nMCc8L2E+PC90aD48L3RyPiIpOworCWVsc2UgaWYgKHJzcy0+Y2hhbm5lbC5saW5rKQorICAgICAgICAgIGRvY3dyaXRlMihzb2FwLCAiPHRyPjx0aCBjbGFzcz0ncnNzX2ltYWdlJz48YSBocmVmPSciLCByc3MtPmNoYW5uZWwubGluaywgIic+PGltZyBzcmM9JyIsIGltYWdlLT51cmwsICInIGFsdD0nQ2hhbm5lbCBJbWFnZScgYm9yZGVyPScwJzwvYT48L3RoPjwvdHI+Iik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBkb2N3cml0ZTEoc29hcCwgIjx0cj48dGggY2xhc3M9J3Jzc19pbWFnZSc+PGltZyBzcmM9JyIsIGltYWdlLT51cmwsICInIGFsdD0nQ2hhbm5lbCBJbWFnZScgYm9yZGVyPScwJzwvdGg+PC90cj4iKTsKKwlpZiAoIXJzcy0+Y2hhbm5lbC50aXRsZSAmJiBpbWFnZS0+dGl0bGUpCisgICAgICAgICAgZG9jd3JpdGUxKHNvYXAsICI8dHI+PHRkIGNsYXNzPSdyc3NfdGl0bGUnPiIsIGltYWdlLT50aXRsZSwgIjwvdGQ+PC90cj4iKTsKKwlpZiAoIXJzcy0+Y2hhbm5lbC5kZXNjcmlwdGlvbiAmJiBpbWFnZS0+ZGVzY3JpcHRpb24pCisgICAgICAgICAgZG9jd3JpdGUxKHNvYXAsICI8dHI+PHRkIGNsYXNzPSdyc3NfZGVzYyc+IiwgaW1hZ2UtPmRlc2NyaXB0aW9uLCAiPC90ZD48L3RyPiIpOworICAgICAgfQorICAgICAgaWYgKHJzcy0+Y2hhbm5lbC5kZXNjcmlwdGlvbikKKyAgICAgICAgZG9jd3JpdGUxKHNvYXAsICI8dHI+PHRoIGNsYXNzPSdyc3NfZGVzYyc+IiwgcnNzLT5jaGFubmVsLmRlc2NyaXB0aW9uLCAiPC90aD48L3RyPiIpOworICAgICAgaWYgKHJzcy0+Y2hhbm5lbC5jb3B5cmlnaHQpCisgICAgICAgIGRvY3dyaXRlMShzb2FwLCAiPHRyPjx0ZCBjbGFzcz0ncnNzX2Rlc2MnPiIsIHJzcy0+Y2hhbm5lbC5jb3B5cmlnaHQsICI8L3RkPjwvdHI+Iik7CisgICAgICBpZiAocnNzLT5jaGFubmVsLl9fc2l6ZSA8IG1heGl0ZW1zKQorICAgICAgICBtYXhpdGVtcyA9IHJzcy0+Y2hhbm5lbC5fX3NpemU7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbWF4aXRlbXM7IGkrKykKKyAgICAgIHsgc3RydWN0IGl0ZW0gKml0ZW0gPSAmcnNzLT5jaGFubmVsLml0ZW1baV07CisgICAgICAgIGRvY3dyaXRlMChzb2FwLCAiPHRyPjx0ZCBjbGFzcz0ncnNzX2JhcicgYmdjb2xvcj0nI2JiYmJiYic+PC90ZD48L3RyPiIpOworCWlmIChpdGVtLT50aXRsZSkKKyAgICAgICAgeyBpZiAoaXRlbS0+bGluaykKKwkgICAgZG9jd3JpdGUyKHNvYXAsICI8dHI+PHRkIGNsYXNzPSdyc3NfaXRlbScgYmdjb2xvcj0nI2RkZGRkZCc+PGEgaHJlZj0nIiwgaXRlbS0+bGluaywgIic+IiwgaXRlbS0+dGl0bGUsICI8L2E+PC90ZD48L3RyPiIpOworCSAgZWxzZQorCSAgICBkb2N3cml0ZTEoc29hcCwgIjx0cj48dGQgY2xhc3M9J3Jzc19pdGVtJyBiZ2NvbG9yPScjZGRkZGRkJz4iLCBpdGVtLT50aXRsZSwgIjwvdGQ+PC90cj4iKTsKKwkgIGlmIChzaG93X2RhdGUgJiYgaXRlbS0+cHViRGF0ZSkKKwkgICAgZG9jd3JpdGUxKHNvYXAsICI8dHI+PHRkIGNsYXNzPSdyc3NfZGF0ZScgYmdjb2xvcj0nI2RkZGRkZCc+UG9zdGVkIG9uICIsIGl0ZW0tPnB1YkRhdGUsICI8L3RkPjwvdHI+Iik7CisJICBlbHNlIGlmIChzaG93X2RhdGUgJiYgaXRlbS0+ZGNfX2RhdGUpCisJICAgIGRvY3dyaXRlMShzb2FwLCAiPHRyPjx0ZCBjbGFzcz0ncnNzX2RhdGUnIGJnY29sb3I9JyNkZGRkZGQnPlBvc3RlZCBvbiAiLCBjdGltZShpdGVtLT5kY19fZGF0ZSksICI8L3RkPjwvdHI+Iik7CisJICBpZiAoaXRlbS0+ZGVzY3JpcHRpb24pCisJICAgIGRvY3dyaXRlMShzb2FwLCAiPHRyPjx0ZCBjbGFzcz0ncnNzX2Rlc2MnIGJnY29sb3I9JyNlZWVlZWUnPiIsIGl0ZW0tPmRlc2NyaXB0aW9uLCAiPC90ZD48L3RyPiIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBkb2N3cml0ZTAoc29hcCwgIjwvdGFibGU+Iik7CisgICAgICBkb2N3cml0ZTAoc29hcCwgIjwvZGl2PiIpOworICAgICAgc29hcF9lbmRfc2VuZChzb2FwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgZG9jZXJyb3Ioc29hcCwgIk5vIFJTUyAwLjkxLCAwLjkyLCBvciAyLjAgZGF0YSIpOworICAgICAgZXhpdCgwKTsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAocnNzKQorICB7IC8qIEludGVyYWN0aXZlOiBwcm9kdWNlIHRleHQgb3V0cHV0ICovCisgICAgaWYgKCFzdHJjbXAocnNzLT52ZXJzaW9uLCAiMC45MSIpIHx8ICFzdHJjbXAocnNzLT52ZXJzaW9uLCAiMC45MiIpIHx8ICFzdHJjbXAocnNzLT52ZXJzaW9uLCAiMi4wIikpCisgICAgeyBwcmludGYoIlRpdGxlOiAlc1xuIiwgU1RSKHJzcy0+Y2hhbm5lbC50aXRsZSkpOworICAgICAgcHJpbnRmKCJMaW5rOiAlc1xuIiwgU1RSKHJzcy0+Y2hhbm5lbC5saW5rKSk7CisgICAgICBwcmludGYoIkxhbmd1YWdlOiAlc1xuIiwgU1RSKHJzcy0+Y2hhbm5lbC5sYW5ndWFnZSkpOworICAgICAgcHJpbnRmKCJEZXNjcmlwdGlvbjogJXNcbiIsIFNUUihyc3MtPmNoYW5uZWwuZGVzY3JpcHRpb24pKTsKKyAgICAgIGlmIChyc3MtPmNoYW5uZWwuaW1hZ2UpCisgICAgICB7IHByaW50ZigiSW1hZ2UgdGl0bGU6ICVzXG4iLCBTVFIocnNzLT5jaGFubmVsLmltYWdlLT50aXRsZSkpOworICAgICAgICBwcmludGYoIkltYWdlIHVybDogJXNcbiIsIFNUUihyc3MtPmNoYW5uZWwuaW1hZ2UtPnVybCkpOworICAgICAgICBwcmludGYoIkltYWdlIGxpbms6ICVzXG4iLCBTVFIocnNzLT5jaGFubmVsLmltYWdlLT5saW5rKSk7CisgICAgICAgIHByaW50ZigiSW1hZ2UgZGltZW5zaW9uczogJWQgeCAlZFxuIiwgcnNzLT5jaGFubmVsLmltYWdlLT53aWR0aCwgcnNzLT5jaGFubmVsLmltYWdlLT5oZWlnaHQpOworICAgICAgICBwcmludGYoIkltYWdlIGRlc2NyaXB0aW9uOiAlc1xuIiwgU1RSKHJzcy0+Y2hhbm5lbC5pbWFnZS0+ZGVzY3JpcHRpb24pKTsKKyAgICAgIH0KKyAgICAgIGlmIChyc3MtPmNoYW5uZWwuX19zaXplIDwgbWF4aXRlbXMpCisgICAgICAgIG1heGl0ZW1zID0gcnNzLT5jaGFubmVsLl9fc2l6ZTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBtYXhpdGVtczsgaSsrKQorICAgICAgeyBwcmludGYoIlxuJTNkIFRpdGxlOiAlc1xuIiwgaSsxLCBTVFIocnNzLT5jaGFubmVsLml0ZW1baV0udGl0bGUpKTsKKyAgICAgICAgcHJpbnRmKCIgICAgTGluazogJXNcbiIsIFNUUihyc3MtPmNoYW5uZWwuaXRlbVtpXS5saW5rKSk7CisgICAgICAgIHByaW50ZigiICAgIERlc2NyaXB0aW9uOiAlc1xuIiwgU1RSKHJzcy0+Y2hhbm5lbC5pdGVtW2ldLmRlc2NyaXB0aW9uKSk7CisgICAgICAgIGlmIChyc3MtPmNoYW5uZWwuaXRlbVtpXS5wdWJEYXRlKQorICAgICAgICAgIHByaW50ZigiICAgIFBvc3RlZDogJXNcbiIsIHJzcy0+Y2hhbm5lbC5pdGVtW2ldLnB1YkRhdGUpOworICAgICAgICBlbHNlIGlmIChyc3MtPmNoYW5uZWwuaXRlbVtpXS5kY19fZGF0ZSkKKyAgICAgICAgICBwcmludGYoIiAgICBQb3N0ZWQ6ICVzXG4iLCBjdGltZShyc3MtPmNoYW5uZWwuaXRlbVtpXS5kY19fZGF0ZSkpOworICAgICAgfQorICAgICAgcHJpbnRmKCJcbkNvcHlyaWdodDogJXNcbiIsIFNUUihyc3MtPmNoYW5uZWwuY29weXJpZ2h0KSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiUlNTIDAuOTEsIDAuOTIsIG9yIDIuMCBjb250ZW50IGV4cGVjdGVkXG4iKTsKKyAgfQorICBlbHNlCisgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOworICBzb2FwX2VuZChzb2FwKTsKKyAgc29hcF9kb25lKHNvYXApOworICBzb2FwX2ZyZWUoc29hcCk7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkb2N3cml0ZTAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMpCit7IHNvYXBfc2VuZDMoc29hcCwgImRvY3VtZW50LndyaXRlKFwiIiwgcywgIlwiKTtcbiIpOworfQorCitzdGF0aWMgdm9pZCBkb2N3cml0ZTEoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgY29uc3QgY2hhciAqczMpCit7IHNvYXBfc2VuZDIoc29hcCwgImRvY3VtZW50LndyaXRlKFwiIiwgczEpOworICBzdHJ3cml0ZShzb2FwLCBzMik7CisgIHNvYXBfc2VuZDIoc29hcCwgczMsICJcIik7XG4iKTsKK30KKworc3RhdGljIHZvaWQgZG9jd3JpdGUyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIGNvbnN0IGNoYXIgKnMzLCBjb25zdCBjaGFyICpzNCwgY29uc3QgY2hhciAqczUpCit7IHNvYXBfc2VuZDIoc29hcCwgImRvY3VtZW50LndyaXRlKFwiIiwgczEpOworICBzdHJ3cml0ZShzb2FwLCBzMik7CisgIHNvYXBfc2VuZChzb2FwLCBzMyk7CisgIHN0cndyaXRlKHNvYXAsIHM0KTsKKyAgc29hcF9zZW5kMihzb2FwLCBzNSwgIlwiKTtcbiIpOworfQorCitzdGF0aWMgdm9pZCBkb2NlcnJvcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcykKK3sgc29hcF9iZWdpbl9zZW5kKHNvYXApOworICBzb2FwLT5odHRwX2NvbnRlbnQgPSAiYXBwbGljYXRpb24vamF2YXNjcmlwdCI7CisgIHNvYXBfcmVzcG9uc2Uoc29hcCwgU09BUF9GSUxFKTsKKyAgc29hcF9zZW5kKHNvYXAsIHMpOworICBzb2FwX2VuZF9zZW5kKHNvYXApOworfQorCitzdGF0aWMgdm9pZCBzdHJ3cml0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcykKK3sgd2hpbGUgKCpzKQorICB7IGNvbnN0IGNoYXIgKnQ7CisgICAgZm9yICh0ID0gczsgKnQ7IHQrKykKKyAgICAgICBpZiAoKnQgPT0gJ1xcJyB8fCAqdCA9PSAnIicgfHwgKnQgPT0gJ1xuJykKKyAgICAgICAgIGJyZWFrOworICAgIHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMpOworICAgIGlmICgqdCA9PSAnXFwnKQorICAgIHsgc29hcF9zZW5kKHNvYXAsICJcXFxcIik7CisgICAgICB0Kys7CisgICAgfQorICAgIGVsc2UgaWYgKCp0ID09ICciJykKKyAgICB7IHNvYXBfc2VuZChzb2FwLCAiXFxcIiIpOworICAgICAgdCsrOworICAgIH0KKyAgICBlbHNlIGlmICgqdCA9PSAnXG4nKQorICAgIHsgdCsrOworICAgICAgaWYgKCp0ID09ICdcbicpCisgICAgICB7IHNvYXBfc2VuZChzb2FwLCAiPHAvPiIpOyAvKiB0d28gbGluZSBicmVha3M/IFByb2JhYmx5IGEgbmV3IHBhcmFncmFwaCB3YXMgaW50ZW5kZWQgKi8KKyAgICAgICAgdCsrOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBzb2FwX3NlbmQoc29hcCwgIiAiKTsKKyAgICB9CisgICAgcyA9IHQ7CisgIH0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmRlY29kZV91cmwoY2hhciAqYnVmLCBzaXplX3QgbGVuLCBjb25zdCBjaGFyICp2YWwpCit7IGNvbnN0IGNoYXIgKnM7CisgIGNoYXIgKnQ7CisgIGlmICghYnVmKQorICAgIHJldHVybiBOVUxMOworICBmb3IgKHMgPSB2YWw7ICpzOyBzKyspCisgICAgaWYgKCpzICE9ICcgJyAmJiAqcyAhPSAnPScpCisgICAgICBicmVhazsKKyAgaWYgKCpzID09ICciJykKKyAgeyB0ID0gYnVmOworICAgIHMrKzsKKyAgICB3aGlsZSAoKnMgJiYgKnMgIT0gJyInICYmIC0tbGVuKQorICAgICAgKnQrKyA9ICpzKys7CisgICAgKnQgPSAnXDAnOworICAgIGRvIHMrKzsKKyAgICB3aGlsZSAoKnMgJiYgKnMgIT0gJyYnICYmICpzICE9ICc9Jyk7CisgIH0KKyAgZWxzZQorICB7IHQgPSBidWY7CisgICAgd2hpbGUgKCpzICYmICpzICE9ICcmJyAmJiAqcyAhPSAnPScgJiYgLS1sZW4pCisgICAgeyBzd2l0Y2ggKCpzKQorICAgICAgeyBjYXNlICcrJzoKKyAgICAgICAgICAqdCsrID0gJyAnOworICAgICAgICBjYXNlICcgJzoKKyAgICAgICAgICBzKys7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJyUnOgorICAgICAgICAgICp0KysgPSAoKHNbMV0gPj0gJ0EnID8gKHNbMV0mMHg3KSArIDkgOiBzWzFdIC0gJzAnKSA8PCA0KSArIChzWzJdID49ICdBJyA/IChzWzJdJjB4NykgKyA5IDogc1syXSAtICcwJyk7CisgICAgICAgICAgcyArPSAzOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICp0KysgPSAqcysrOworICAgICAgfQorICAgIH0KKyAgICAqdCA9ICdcMCc7CisgIH0KKyAgaWYgKCpzID09ICcmJykKKyAgICBzKys7CisgIHJldHVybiBzOworfQorCitzdGF0aWMgY2hhciAqcXVlcnlfa2V5KGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwgY2hhciAqKnMpCit7IGNoYXIgKnQgPSAqczsKKyAgaWYgKHQgJiYgKnQpCisgIHsgKnMgPSAoY2hhciopZGVjb2RlX3VybChidWYsIGxlbiwgdCk7CisgICAgcmV0dXJuIGJ1ZjsKKyAgfQorICByZXR1cm4gKnMgPSBOVUxMOworfQorCitzdGF0aWMgY2hhciAqcXVlcnlfdmFsKGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwgY2hhciAqKnMpCit7IGNoYXIgKnQgPSAqczsKKyAgaWYgKHQgJiYgKnQgPT0gJz0nKQorICB7ICpzID0gKGNoYXIqKWRlY29kZV91cmwoYnVmLCBsZW4sIHQpOworICAgIHJldHVybiBidWY7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIFJTUyAwLjkxIGRvZXNuJ3QgdXNlIG5hbWVzcGFjZXMsIGJ1dCBSU1MgMi4wIGRvZXMsIHdoaWNoIG1lYW5zIHRoYXQgc29hcC0+bmFtZXNwYWNlPU5VTEwgd2hlbiBzZXJpYWxpemluZyBSU1MgMC45MSBmZWVkcyAqLworc3RydWN0IE5hbWVzcGFjZSBuYW1lc3BhY2VzW10gPSB7Cit7ICJkYyIsICJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgfSwKK3sgTlVMTCwgTlVMTCB9IAorfTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvcnNzL3Jzcy5oIGIvc2FtcGxlcy9yc3MvcnNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM0YzY5NwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvcnNzL3Jzcy5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisKK1JTUyAwLjkxLCAwLjkyIGFuZCAyLjAKKworUmV0cmlldmUgUlNTIGZlZWRzLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyB0d28gbGljZW5zZXM6CitHUEwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKy8vZ3NvYXAgZGMgc2NoZW1hIG5hbWVzcGFjZTogaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8KKwordHlwZWRlZiBjaGFyICpYTUw7CS8vIG1peGVkIGNvbnRlbnQKKworc3RydWN0IGNoYW5uZWwKK3sgY2hhciAqdGl0bGU7CisgIGNoYXIgKmxpbms7CisgIGNoYXIgKmxhbmd1YWdlOworICBjaGFyICpjb3B5cmlnaHQ7CisgIFhNTCBkZXNjcmlwdGlvbjsJLy8gZGVzY3JpcHRpb24gbWF5IGNvbnRhaW4gWEhUTUwgdGhhdCB3ZSB3YW50IHRvIHByZXNlcnZlCisgIHN0cnVjdCBpbWFnZSAqaW1hZ2U7CisgIGludCBfX3NpemU7CisgIHN0cnVjdCBpdGVtICppdGVtOworICB0aW1lX3QgKmRjX19kYXRlOwkvLyBSU1MgMi4wIGRjIHNjaGVtYSBlbGVtZW50Cit9OworCitzdHJ1Y3QgaXRlbQoreyBjaGFyICp0aXRsZTsKKyAgY2hhciAqbGluazsKKyAgWE1MIGRlc2NyaXB0aW9uOwkvLyBkZXNjcmlwdGlvbiBtYXkgY29udGFpbiBYSFRNTCB0aGF0IHdlIHdhbnQgdG8gcHJlc2VydmUKKyAgY2hhciAqcHViRGF0ZTsKKyAgdGltZV90ICpkY19fZGF0ZTsJLy8gUlNTIDIuMCBkYyBzY2hlbWEgZWxlbWVudAorfTsKKworc3RydWN0IGltYWdlCit7IGNoYXIgKnRpdGxlOworICBjaGFyICp1cmw7CisgIGNoYXIgKmxpbms7CisgIGludCB3aWR0aCAgMDoxID0gMDsJLy8gb3B0aW9uYWwsIGRlZmF1bHQgdmFsdWUgPSAwCisgIGludCBoZWlnaHQgMDoxID0gMDsJLy8gb3B0aW9uYWwsIGRlZmF1bHQgdmFsdWUgPSAwCisgIFhNTCBkZXNjcmlwdGlvbjsJLy8gZGVzY3JpcHRpb24gbWF5IGNvbnRhaW4gWEhUTUwgdGhhdCB3ZSB3YW50IHRvIHByZXNlcnZlCit9OworCitzdHJ1Y3QgcnNzCit7IEBjaGFyICp2ZXJzaW9uID0gIjIuMCI7CisgIHN0cnVjdCBjaGFubmVsIGNoYW5uZWw7Cit9OwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9yc3MvcnNzdGVzdC5odG1sIGIvc2FtcGxlcy9yc3MvcnNzdGVzdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNzFhZDYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3Jzcy9yc3N0ZXN0Lmh0bWwKQEAgLTAsMCArMSw4IEBACis8aHRtbD4NCis8Ym9keT4NCisNCis8c2NyaXB0IHNyYz0iaHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL3Jzcy5jZ2kvP3Jzcz1odHRwJTNBJTJGJTJGd3d3LmJiYy5jby51ayUyRnN5bmRpY2F0aW9uJTJGZmVlZHMlMkZuZXdzJTJGdWtmc19uZXdzJTJGZnJvbnRfcGFnZSUyRnJzczA5MS54bWwmbWF4PTEwIj48L3NjcmlwdD4NCis8bm9zY3JpcHQ+PGEgaHJlZj0iaHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL3Jzcy5jZ2kvP3Jzcz1odHRwJTNBJTJGJTJGd3d3LmJiYy5jby51ayUyRnN5bmRpY2F0aW9uJTJGZmVlZHMlMkZuZXdzJTJGdWtmc19uZXdzJTJGZnJvbnRfcGFnZSUyRnJzczA5MS54bWwmbWF4PTEwIj5WaWV3IEJCQyBOZXdzIHwgRnJvbnQgUGFnZSB8IFVLIEVkaXRpb248L2E+PC9ub3NjcmlwdD4gDQorDQorPC9ib2R5Pg0KKzwvaHRtbD4NCmRpZmYgLS1naXQgYS9zYW1wbGVzL3NzbC9NYWtlZmlsZSBiL3NhbXBsZXMvc3NsL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkM2EyOGEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3NzbC9NYWtlZmlsZQpAQCAtMCwwICsxLDIzIEBACitHU09BUD0uLi8uLi9zb2FwY3BwMgorU09BUEg9Li4vLi4vc3Rkc29hcDIuaAorU09BUEM9Li4vLi4vc3Rkc29hcDIuYworU09BUENQUD0uLi8uLi9zdGRzb2FwMi5jcHAKK0NDPWdjYworQ1BQPWcrKworTElCUz0KK0NPRkxBR1M9LU8yCitDV0ZMQUdTPS1XYWxsCitDSUZMQUdTPS1JLi4vLi4KK0NNRkxBR1M9CitDRkxBR1M9ICQoQ1dGTEFHUykgJChDT0ZMQUdTKSAkKENJRkxBR1MpICQoQ01GTEFHUykKK2FsbDoJCXNzbGNsaWVudCBzc2xzZXJ2ZXIKK3NzbGNsaWVudDoJc3NsLmggc3NsY2xpZW50LmMgJChTT0FQSCkgJChTT0FQQykKKwkJJChHU09BUCkgLWMgc3NsLmgKKwkJJChDQykgLURXSVRIX09QRU5TU0wgJChDRkxBR1MpIC1vIHNzbGNsaWVudCBzc2xjbGllbnQuYyBzb2FwQy5jIHNvYXBDbGllbnQuYyAkKFNPQVBDKSAtbHNzbCAtbGNyeXB0byAkKExJQlMpCitzc2xzZXJ2ZXI6CXNzbC5oIHNzbHNlcnZlci5jICQoU09BUEgpICQoU09BUEMpCisJCSQoR1NPQVApIC1jIHNzbC5oCisJCSQoQ0MpIC1EV0lUSF9PUEVOU1NMICQoQ0ZMQUdTKSAtbyBzc2xzZXJ2ZXIgc3Nsc2VydmVyLmMgc29hcEMuYyBzb2FwU2VydmVyLmMgJChTT0FQQykgLWxzc2wgLWxjcnlwdG8gLWxwdGhyZWFkICQoTElCUykKK2NsZWFuOgorCQlybSAtZiAqLm8gc29hcEguaCBzb2FwU3R1Yi5oIHNvYXBDLmNwcCBzb2FwQy5jIHNvYXBDbGllbnQuY3BwIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmNwcCBzb2FwU2VydmVyLmMgc29hcCpQcm94eS5oCitkaXN0Y2xlYW46CisJCXJtIC1mICoubyAqLndzZGwgKi54c2QgKi54bWwgKi5uc21hcCAqLmxvZyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5Lmggc3NsY2xpZW50IHNzbHNlcnZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9zc2wvTWFrZWZpbGVTb2xhcmlzIGIvc2FtcGxlcy9zc2wvTWFrZWZpbGVTb2xhcmlzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YmRiM2MKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3NzbC9NYWtlZmlsZVNvbGFyaXMKQEAgLTAsMCArMSwyMyBAQAorR1NPQVA9Li4vLi4vc29hcGNwcDIKK1NPQVBIPS4uLy4uL3N0ZHNvYXAyLmgKK1NPQVBDPS4uLy4uL3N0ZHNvYXAyLmMKK1NPQVBDUFA9Li4vLi4vc3Rkc29hcDIuY3BwCitDQz1nY2MKK0NQUD1nKysKK0xJQlM9LWx4bmV0IC1sbnNsIC1sc29ja2V0CitDT0ZMQUdTPS1PMgorQ1dGTEFHUz0tV2FsbAorQ0lGTEFHUz0tSS4uLy4uCitDTUZMQUdTPQorQ0ZMQUdTPSAkKENXRkxBR1MpICQoQ09GTEFHUykgJChDSUZMQUdTKSAkKENNRkxBR1MpCithbGw6CQlzc2xjbGllbnQgc3Nsc2VydmVyCitzc2xjbGllbnQ6CXNzbC5oIHNzbGNsaWVudC5jICQoU09BUEgpICQoU09BUEMpCisJCSQoR1NPQVApIC1jIHNzbC5oCisJCSQoQ0MpIC1EV0lUSF9PUEVOU1NMICQoQ0ZMQUdTKSAtbyBzc2xjbGllbnQgc3NsY2xpZW50LmMgc29hcEMuYyBzb2FwQ2xpZW50LmMgJChTT0FQQykgLWxzc2wgLWxjcnlwdG8gJChMSUJTKQorc3Nsc2VydmVyOglzc2wuaCBzc2xzZXJ2ZXIuYyAkKFNPQVBIKSAkKFNPQVBDKQorCQkkKEdTT0FQKSAtYyBzc2wuaAorCQkkKENDKSAtRFdJVEhfT1BFTlNTTCAkKENGTEFHUykgLW8gc3Nsc2VydmVyIHNzbHNlcnZlci5jIHNvYXBDLmMgc29hcFNlcnZlci5jICQoU09BUEMpIC1sc3NsIC1sY3J5cHRvIC1scHRocmVhZCAkKExJQlMpCitjbGVhbjoKKwkJcm0gLWYgKi5vIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaAorZGlzdGNsZWFuOgorCQlybSAtZiAqLm8gKi53c2RsICoueHNkICoueG1sICoubnNtYXAgKi5sb2cgc29hcEguaCBzb2FwU3R1Yi5oIHNvYXBDLmNwcCBzb2FwQy5jIHNvYXBDbGllbnQuY3BwIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmNwcCBzb2FwU2VydmVyLmMgc29hcCpQcm94eS5oIHNzbGNsaWVudCBzc2xzZXJ2ZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvc3NsL1JFQURNRS50eHQgYi9zYW1wbGVzL3NzbC9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZjA0YzYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3NzbC9SRUFETUUudHh0CkBAIC0wLDAgKzEsNTAgQEAKK0hvdyB0byBnZW5lcmF0ZSBzZWxmLXNpZ25lZCByb290IGNlcnRpZmljYXRlIGFuZCBjbGllbnQucGVtL3NlcnZlci5wZW0KKworQ3JlYXRlIEhPTUUvQ0EgZGlyZWN0b3J5IGFuZCBjb3B5IG9wZW5zc2wuY25mLCByb290LnNoLCBhbmQgY2VydC5zaCB0byB0aGlzIGRpci4KKworQ2hhbmdlIGRpciB0byBIT01FL0NBCisKK1RvIGdlbmVyYXRlIHRoZSByb290IENBIChyb290LnBlbSBhbmQgY2FjZXJ0LnBlbSk6CisKKy4vcm9vdC5zaAorCitTYXZlIHRoZSByb290LnBlbSBhbmQgdGhlIHBhc3NwaHJhc2UgaW4gYSBzYWZlIHBsYWNlIChkb24ndCBkaXN0cmlidXRlIHRoZW0hKS4KK1lvdSBuZWVkIHRoZXNlIHRvIGNyZWF0ZSBjZXJ0aWZpY2F0ZXMuCisKK1RoZSByb290LnBlbSBhbmQgY2FjZXJ0LnBlbSBhcmUgdmFsaWQgZm9yIHRocmVlIHllYXJzLiBEb24ndCByZXBlYXQgdGhpcyBzdGVwCit1bnRpbCB0aGUgY2VydGlmaWNhdGUgZXhwaXJlcy4KKworVG8gZ2VuZXJhdGUgdGhlIGNsaWVudC5wZW0ga2V5IGZpbGUgKGVudGVyICJwYXNzd29yZCIgYW5kICJsb2NhbGhvc3QiIGFuZCB1c2UKK3RoZSByb290IENBIHBhc3NwaHJhc2Ugd2hlbiBwcm9tcHRlZCB0byBzaWduIHRoZSBjbGllbnQgY2VydGlmaWNhdGUpOgorCisuL2NlcnQuc2ggY2xpZW50CisKK1RvIGdlbmVyYXRlIHRoZSBzZXJ2ZXIucGVtIGtleSBmaWxlIChlbnRlciAicGFzc3dvcmQiIGFuZCAibG9jYWxob3N0IiBhbmQgdXNlCit0aGUgcm9vdCBDQSBwYXNzcGhyYXNlIHdoZW4gcHJvbXB0ZWQgdG8gc2lnbiB0aGUgc2VydmVyIGNlcnRpZmljYXRlKToKKworLi9jZXJ0LnNoIHNlcnZlcgorCitUaGUgY2xpZW50LnBlbSBhbmQgc2VydmVyLnBlbSBjZXJ0aWZpY2F0ZXMgYXJlIHZhbGlkIGZvciBvbmUgeWVhci4KKworUmVxdWlyZWQgZmlsZXMgaW4gSE9NRS9DQSBkaXJlY3Rvcnk6CisKK29wZW5zc2wuY25mCityb290LnNoCitjZXJ0LnNoCisKK0ZpbGVzIGdlbmVyYXRlZDoKKworY2FjZXJ0LnBlbQlyb290J3MgY2VydGlmaWNhdGUgZm9yIGRpc3RyaWJ1dGlvbgorcm9vdC5wZW0Jcm9vdCBDQSAodG8gc2lnbiBjbGllbnQvc2VydmVyIGtleSBmaWxlcywgZG8gbm90IGRpc3RyaWJ1dGUpCityb290a2V5LnBlbQlwcml2YXRlIGtleQorcm9vdHJlcS5wZW0Jc2lnbiByZXF1ZXN0Cityb290LnNybAlzZXJpYWwgbnVtYmVyCisKK2NsaWVudC5wZW0JY2xpZW50IGtleSBmaWxlCitjbGllbnRrZXkucGVtCXByaXZhdGUga2V5CitjbGllbnRyZXEucGVtCXNpZ24gcmVxdWVzdAorCitzZXJ2ZXIucGVtCXNlcnZlciBrZXkgZmlsZQorc2VydmVya2V5LnBlbQlwcml2YXRlIGtleQorc2VydmVycmVxLnBlbQlzaWduIHJlcXVlc3QKKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9zc2wvY2FjZXJ0LnBlbSBiL3NhbXBsZXMvc3NsL2NhY2VydC5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA0YjA1ZgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvc3NsL2NhY2VydC5wZW0KQEAgLTAsMCArMSwyMSBAQAorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEaGpDQ0F1K2dBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVVGQURDQmp6RUxNQWtHQTFVRUJoTUNWVk14CitDekFKQmdOVkJBZ1RBa1pNTVJRd0VnWURWUVFIRXd0VVlXeHNZV2hoYzNObFpURVdNQlFHQTFVRUNoTU5SMlZ1CithWFpwWVN3Z1NXNWpMakVMTUFrR0ExVUVDeE1DU1ZReEZEQVNCZ05WQkFNVEMyZGxibWwyYVdFdVkyOXRNU0l3CitJQVlKS29aSWh2Y05BUWtCRmhOamIyNTBZV04wUUdkbGJtbDJhV0V1WTI5dE1CNFhEVEEwTVRBd01qRTNNRGd3CitObG9YRFRBM01UQXdNakUzTURnd05sb3dnWTh4Q3pBSkJnTlZCQVlUQWxWVE1Rc3dDUVlEVlFRSUV3SkdUREVVCitNQklHQTFVRUJ4TUxWR0ZzYkdGb1lYTnpaV1V4RmpBVUJnTlZCQW9URFVkbGJtbDJhV0VzSUVsdVl5NHhDekFKCitCZ05WQkFzVEFrbFVNUlF3RWdZRFZRUURFd3RuWlc1cGRtbGhMbU52YlRFaU1DQUdDU3FHU0liM0RRRUpBUllUCitZMjl1ZEdGamRFQm5aVzVwZG1saExtTnZiVENCbnpBTkJna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBCitsNks5YkxNY3JKNkJ6KzhoeHlvbFNKeTVUZFpLbzhPbW1za1ArTkFKY3Q3YUdXYTMzdTJsa1orR2tvVW1MS1ovCityRE5wZ21ZVk5RbE9RQzRydDVvRHQ0QVVvajU4NEc4UEpLU1B3eW1KY1gwc2JmQjdrOHhSbUxPK3ZWZ1NVdkR1Cithc0xNV0o2UHNZSXVHaHA0QndPQWduWUFDVHpzZDZrU2VJc2VkOFhTeDdjQ0F3RUFBYU9CN3pDQjdEQWRCZ05WCitIUTRFRmdRVTRNeUlpMEdnSVVxa1lSaG5KMkdneVVtVmQ4b3dnYndHQTFVZEl3U0J0RENCc1lBVTRNeUlpMEdnCitJVXFrWVJobkoyR2d5VW1WZDhxaGdaV2tnWkl3Z1k4eEN6QUpCZ05WQkFZVEFsVlRNUXN3Q1FZRFZRUUlFd0pHCitUREVVTUJJR0ExVUVCeE1MVkdGc2JHRm9ZWE56WldVeEZqQVVCZ05WQkFvVERVZGxibWwyYVdFc0lFbHVZeTR4CitDekFKQmdOVkJBc1RBa2xVTVJRd0VnWURWUVFERXd0blpXNXBkbWxoTG1OdmJURWlNQ0FHQ1NxR1NJYjNEUUVKCitBUllUWTI5dWRHRmpkRUJuWlc1cGRtbGhMbU52YllJQkFEQU1CZ05WSFJNRUJUQURBUUgvTUEwR0NTcUdTSWIzCitEUUVCQlFVQUE0R0JBRm1iOWtWK0VEeDVPNGo3ZExNdTkwOW5GZ25CTDA2c2VwanF0QklJYlpZM0duQ2dlZnhLCitwMVM2SWYwMS9tZFY3OW5aR0psZGVnTTc3dHo0VklsenVJYXorMk5PK0dxYnI2RXJPUiszVUdPclJ1SDM5YU1UCisxRHZ3SFlwVTVHVStsRzFhV0hkUXA4dVo1eTRva01nM1o5SVo1bmlqa1VucENIUU8rcS84RnJNTAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9zc2wvY2FjZXJ0cy5wZW0gYi9zYW1wbGVzL3NzbC9jYWNlcnRzLnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTgzZDg4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9zc2wvY2FjZXJ0cy5wZW0KQEAgLTAsMCArMSw0MzU0IEBACitBQkFlY29tIChzdWIuLCBBbS4gQmFua2VycyBBc3NuLikgUm9vdCBDQQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogODI6MTI6Rjc6ODk6RTE6MEI6OTE6NjA6QTQ6QjY6MjI6OUY6OTQ6Njg6MTE6OTIKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEK0RDQ0F1Q2dBd0lCQWdJUkFOQWVRSkFBQUNkTEFBQUFBUUFBQUFRd0RRWUpLb1pJaHZjTkFRRUZCUUF3CitnWXd4Q3pBSkJnTlZCQVlUQWxWVE1RMHdDd1lEVlFRSUV3UlZkR0ZvTVJjd0ZRWURWUVFIRXc1VFlXeDBJRXhoCithMlVnUTJsMGVURVlNQllHQTFVRUNoTVBXR05sY25RZ1JWb2dZbmtnUkZOVU1SZ3dGZ1lEVlFRREV3OVlZMlZ5CitkQ0JGV2lCaWVTQkVVMVF4SVRBZkJna3Foa2lHOXcwQkNRRVdFbU5oUUdScFozTnBaM1J5ZFhOMExtTnZiVEFlCitGdzA1T1RBM01UUXhOakUwTVRoYUZ3MHdPVEEzTVRFeE5qRTBNVGhhTUlHTU1Rc3dDUVlEVlFRR0V3SlZVekVOCitNQXNHQTFVRUNCTUVWWFJoYURFWE1CVUdBMVVFQnhNT1UyRnNkQ0JNWVd0bElFTnBkSGt4R0RBV0JnTlZCQW9UCitEMWhqWlhKMElFVmFJR0o1SUVSVFZERVlNQllHQTFVRUF4TVBXR05sY25RZ1JWb2dZbmtnUkZOVU1TRXdId1lKCitLb1pJaHZjTkFRa0JGaEpqWVVCa2FXZHphV2QwY25WemRDNWpiMjB3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBCitBNElCRHdBd2dnRUtBb0lCQVFDdFZCamV0TC8zcmVoMHF1MkxmSS9DMUhVYTFZUzV0bUw4aWUva2wyR1MreDI0Cis0VnBITko2ZUJpTDcwK280eTdpTEIvY2FvQmQzQjFvd0hOUXBPQ0RYSjBEWVVKTkR2OUlZb2lsMkJYS3FhN1pwCittS3Q1SGh4bDlXcUwvTVVXcXFKeTJtRHRUbTRaSlhvS0hURGpVSnRDUEVUcm9iQWdIdHNDZnY0OUg3L1FBSXJiCitRSGFtR0tVVnAxZTJVc0lCRjVoM2o0cUJ4aHEwYWlybXI2bldBS3pQMkJWSmZOc2JvZjZCK29mNTA1REJBc0Q1CiswRUxwa1dnbFg4YS9oem5wbFFCZ0tMK0RMTURuWHJiWE5oYm5ZSWQyNk9jbnNpVU5pM3JscWgzbFdjM09DdzV2Cit4c2ljNHhEWmhUblR0NXY2eHJwOGROSmRkVmFyZEtTaVViOVNmTzV4QWdNQkFBR2pVekJSTUE4R0ExVWRFd0VCCisvd1FGTUFNQkFmOHdId1lEVlIwakJCZ3dGb0FVQ0NCc1p1dUJDbXhjMWJXbVBFSGRISmFSSjNjd0hRWURWUjBPCitCQllFRkFnZ2JHYnJnUXBzWE5XMXBqeEIzUnlXa1NkM01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQmFoMWlQCitMYXQySVd0VURObnhRZlpPelN1ZTR4K2JveTEvMlN0OVdNaG5wQ24xNmV6VnZaWS9vM1A0eEZzMmZOQmpMRFE1CittMGk0UFcvMkZNV2VZK2FuTkc3VDZET3p4endZYmlPdVE1S1pQNWpGYVREeE5qdXR1VENDMXJaWkZwWUNDeWtTCitZYlFSaWZjTUw1U1FoWmdvbkZOc2ZtUGRjL1FaLzBxQjBiSlNJLzA4U2pUT1dodmdVSXJ0VDRHVjJHRG41TVFOCit1MWcrV1BkT2FHOCtaOG5MZXBjV0oreENZUlIydXdERjZ3ZzlGWDlMdGlKZGh6dVE5UFBBL2plejZkbGlETURECitXYTlndlI4TjI2RTBIekRFUFl1dHNCMEVrKzFmMWVTL0lEQUU5RWpwTXdIUkxwQW5Vck9iM2pvY3E2bVhmNXZyCit3bzNDYmV6Y0U5Tkd4WGw4CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAzICgweDIpCisgICAgICAgIFNlcmlhbCBOdW1iZXI6CisgICAgICAgICAgICBkMDoxZTo0MDo5MDowMDowMDoyNzo0YjowMDowMDowMDowMTowMDowMDowMDowNAorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBTVD1VdGFoLCBMPVNhbHQgTGFrZSBDaXR5LCBPPVhjZXJ0IEVaIGJ5IERTVCwgQ049WGNlcnQgRVogYnkgRFNUL0VtYWlsPWNhQGRpZ3NpZ3RydXN0LmNvbQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogSnVsIDE0IDE2OjE0OjE4IDE5OTkgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBKdWwgMTEgMTY6MTQ6MTggMjAwOSBHTVQKKyAgICAgICAgU3ViamVjdDogQz1VUywgU1Q9VXRhaCwgTD1TYWx0IExha2UgQ2l0eSwgTz1YY2VydCBFWiBieSBEU1QsIENOPVhjZXJ0IEVaIGJ5IERTVC9FbWFpbD1jYUBkaWdzaWd0cnVzdC5jb20KKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgyMDQ4IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgyMDQ4IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmFkOjU0OjE4OmRlOmI0OmJmOmY3OmFkOmU4Ojc0OmFhOmVkOjhiOjdjOgorICAgICAgICAgICAgICAgICAgICA4ZjpjMjpkNDo3NToxYTpkNTo4NDpiOTpiNjo2MjpmYzo4OTplZjplNDo5NzoKKyAgICAgICAgICAgICAgICAgICAgNjE6OTI6ZmI6MWQ6Yjg6ZTE6NWE6NDc6MzQ6OWU6OWU6MDY6MjI6ZmI6ZDM6CisgICAgICAgICAgICAgICAgICAgIGVhOjM4OmNiOmI4OjhiOjA3OmY3OjFhOmEwOjE3Ojc3OjA3OjVhOjMwOjFjOgorICAgICAgICAgICAgICAgICAgICBkNDoyOTozODoyMDpkNzoyNzo0MDpkODo1MDo5Mzo0MzpiZjpkMjoxODphMjoKKyAgICAgICAgICAgICAgICAgICAgMjk6NzY6MDU6NzI6YWE6NmI6YjY6Njk6OTg6YWI6Nzk6MWU6MWM6NjU6ZjU6CisgICAgICAgICAgICAgICAgICAgIDZhOjhiOmZjOmM1OjE2OmFhOmEyOjcyOmRhOjYwOmVkOjRlOjZlOjE5OjI1OgorICAgICAgICAgICAgICAgICAgICA3YTowYToxZDozMDplMzo1MDo5Yjo0MjozYzo0NDplYjphMTpiMDoyMDoxZToKKyAgICAgICAgICAgICAgICAgICAgZGI6MDI6N2U6ZmU6M2Q6MWY6YmY6ZDA6MDA6OGE6ZGI6NDA6NzY6YTY6MTg6CisgICAgICAgICAgICAgICAgICAgIGE1OjE1OmE3OjU3OmI2OjUyOmMyOjAxOjE3Ojk4Ojc3OjhmOjhhOjgxOmM2OgorICAgICAgICAgICAgICAgICAgICAxYTpiNDo2YToyYTplNjphZjphOTpkNjowMDphYzpjZjpkODoxNTo0OTo3YzoKKyAgICAgICAgICAgICAgICAgICAgZGI6MWI6YTE6ZmU6ODE6ZmE6ODc6Zjk6ZDM6OTA6YzE6MDI6YzA6Zjk6ZDA6CisgICAgICAgICAgICAgICAgICAgIDQyOmU5OjkxOjY4OjI1OjVmOmM2OmJmOjg3OjM5OmU5Ojk1OjAwOjYwOjI4OgorICAgICAgICAgICAgICAgICAgICBiZjo4MzoyYzpjMDplNzo1ZTpiNjpkNzozNjoxNjplNzo2MDo4Nzo3NjplODoKKyAgICAgICAgICAgICAgICAgICAgZTc6Mjc6YjI6MjU6MGQ6OGI6N2E6ZTU6YWE6MWQ6ZTU6NTk6Y2Q6Y2U6MGI6CisgICAgICAgICAgICAgICAgICAgIDBlOjZmOmM2OmM4OjljOmUzOjEwOmQ5Ojg1OjM5OmQzOmI3OjliOmZhOmM2OgorICAgICAgICAgICAgICAgICAgICBiYTo3Yzo3NDpkMjo1ZDo3NTo1NjphYjo3NDphNDphMjo1MTpiZjo1Mjo3YzoKKyAgICAgICAgICAgICAgICAgICAgZWU6NzEKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgICAgIFg1MDl2MyBleHRlbnNpb25zOgorICAgICAgICAgICAgWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzOiBjcml0aWNhbAorICAgICAgICAgICAgICAgIENBOlRSVUUKKyAgICAgICAgICAgIFg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIGtleWlkOjA4OjIwOjZDOjY2OkVCOjgxOjBBOjZDOjVDOkQ1OkI1OkE2OjNDOjQxOkREOjFDOjk2OjkxOjI3Ojc3CisKKyAgICAgICAgICAgIFg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICAwODoyMDo2Qzo2NjpFQjo4MTowQTo2Qzo1QzpENTpCNTpBNjozQzo0MTpERDoxQzo5Njo5MToyNzo3NworICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA1YTo4Nzo1ODo4ZjoyZDphYjo3NjoyMTo2Yjo1NDowYzpkOTpmMTo0MTpmNjo0ZTpjZDoyYjoKKyAgICAgICAgOWU6ZTM6MWY6OWI6YTM6MmQ6N2Y6ZDk6MmI6N2Q6NTg6Yzg6Njc6YTQ6Mjk6ZjU6ZTk6ZWM6CisgICAgICAgIGQ1OmJkOjk2OjNmOmEzOjczOmY4OmM0OjViOjM2OjdjOmQwOjYzOjJjOjM0OjM5OjliOjQ4OgorICAgICAgICBiODozZDo2ZjpmNjoxNDpjNTo5ZTo2MzplNjphNzozNDo2ZTpkMzplODozMzpiMzpjNzozYzoKKyAgICAgICAgMTg6NmU6MjM6YWU6NDM6OTI6OTk6M2Y6OTg6YzU6Njk6MzA6ZjE6MzY6M2I6YWQ6Yjk6MzA6CisgICAgICAgIDgyOmQ2OmI2OjU5OjE2Ojk2OjAyOjBiOjI5OjEyOjYxOmI0OjExOjg5OmY3OjBjOjJmOjk0OgorICAgICAgICA5MDo4NTo5ODoyODo5Yzo1Mzo2Yzo3ZTo2MzpkZDo3MzpmNDoxOTpmZjo0YTo4MTpkMTpiMjoKKyAgICAgICAgNTI6MjM6ZmQ6M2M6NGE6MzQ6Y2U6NWE6MWI6ZTA6NTA6OGE6ZWQ6NGY6ODE6OTU6ZDg6NjA6CisgICAgICAgIGU3OmU0OmM0OjBkOmJiOjU4OjNlOjU4OmY3OjRlOjY4OjZmOjNlOjY3OmM5OmNiOjdhOjk3OgorICAgICAgICAxNjoyNzplYzo0Mjo2MToxNDo3NjpiYjowMDpjNTplYjowODozZDoxNTo3Zjo0YjpiNjoyMjoKKyAgICAgICAgNWQ6ODc6M2I6OTA6ZjQ6ZjM6YzA6ZmU6Mzc6YjM6ZTk6ZDk6NjI6MGM6YzA6YzM6NTk6YWY6CisgICAgICAgIDYwOmJkOjFmOjBkOmRiOmExOjM0OjFmOjMwOmM0OjNkOjhiOmFkOmIwOjFkOjA0OjkzOmVkOgorICAgICAgICA1ZjpkNTplNDpiZjoyMDozMDowNDpmNDo0ODplOTozMzowMTpkMToyZTo5MDoyNzo1MjpiMzoKKyAgICAgICAgOWI6ZGU6M2E6MWM6YWI6YTk6OTc6N2Y6OWI6ZWI6YzI6OGQ6YzI6NmQ6ZWM6ZGM6MTM6ZDM6CisgICAgICAgIDQ2OmM1Ojc5OjdjCisKK0FOWCBOZXR3b3JrIENBIGJ5IERTVAorPT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IEE4OkVEOkRFOkVCOjkzOjg4OjY2OkQ4OjJGOkMzOkJEOjFEOkJFOjQ1OkJFOjRECitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRFRUQ0NBcmFnQXdJQkFnSUVObTZpYnpBTkJna3Foa2lHOXcwQkFRVUZBREJTTVFzd0NRWURWUVFHRXdKVgorVXpFa01DSUdBMVVFQ2hNYlJHbG5hWFJoYkNCVGFXZHVZWFIxY21VZ1ZISjFjM1FnUTI4dU1SMHdHd1lEVlFRTAorRXhSRVUxUWdLRUZPV0NCT1pYUjNiM0pyS1NCRFFUQWVGdzA1T0RFeU1Ea3hOVFEyTkRoYUZ3MHhPREV5TURreAorTmpFMk5EaGFNRkl4Q3pBSkJnTlZCQVlUQWxWVE1TUXdJZ1lEVlFRS0V4dEVhV2RwZEdGc0lGTnBaMjVoZEhWeQorWlNCVWNuVnpkQ0JEYnk0eEhUQWJCZ05WQkFzVEZFUlRWQ0FvUVU1WUlFNWxkSGR2Y21zcElFTkJNSUdkTUEwRworQ1NxR1NJYjNEUUVCQVFVQUE0R0xBRENCaHdLQmdRQzBTQkdBV0tEVnBaa1A5amNzUkxadTBYenpLbXVlRWJhSQorSXdSY2NTV2VhaEozRVc2L2FEbGxxUGF5OXFJWXNva1ZvR2UzZW93aVNHdjJoRFFmdHNyM0czTEw4bHRJMDRjZQorSW5ZVEJMU3NiSlovNXc0SXlUSlJNQzNWZ09naFo3cnpYZ2drTEFkWm5aQWE3a2JKdGFRZWxyUkJrZFIvMG8wNAorSnJCdlEyNEpmUUlCQTZPQ0FUQXdnZ0VzTUJFR0NXQ0dTQUdHK0VJQkFRUUVBd0lBQnpCMEJnTlZIUjhFYlRCcgorTUdtZ1o2QmxwR013WVRFTE1Ba0dBMVVFQmhNQ1ZWTXhKREFpQmdOVkJBb1RHMFJwWjJsMFlXd2dVMmxuYm1GMAorZFhKbElGUnlkWE4wSUVOdkxqRWRNQnNHQTFVRUN4TVVSRk5VSUNoQlRsZ2dUbVYwZDI5eWF5a2dRMEV4RFRBTAorQmdOVkJBTVRCRU5TVERFd0t3WURWUjBRQkNRd0lvQVBNVGs1T0RFeU1Ea3hOVFEyTkRoYWdROHlNREU0TVRJdworT1RFMU5EWTBPRm93Q3dZRFZSMFBCQVFEQWdFR01COEdBMVVkSXdRWU1CYUFGSXdXVlhETUZncFRaTUtsaEtxegorWkJkRFA0STJNQjBHQTFVZERnUVdCQlNNRmxWd3pCWUtVMlRDcFlTcXMyUVhReitDTmpBTUJnTlZIUk1FQlRBRAorQVFIL01Ca0dDU3FHU0liMmZRZEJBQVFNTUFvYkJGWTBMakFEQWdTUU1BMEdDU3FHU0liM0RRRUJCUVVBQTRHQgorQUVrbHlXQ3hERitwT1JEVHhUUlZmYzk1d3lucjN2bkNRUG5vVnNYd0wrejAyZXhJVWJoak9GNlRiaGlXaGJuSworVUp5a3VPcG1KbWlUaFc5dlRISFF2bm9MUERHNTk3NXBuaERYMFVEb3JCWnhxNjZyT09Gd3NjcVNGdUJkaGFZWQorZ0FZQW5PR21HRUpScDJob1dlOG1sRit0TVF6K0tSNFhBWVEzVytnU01xTmQKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjogOTEzMjIwMjA3ICgweDM2NmVhMjZmKQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBPPURpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLiwgT1U9RFNUIChBTlggTmV0d29yaykgQ0EKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IERlYyAgOSAxNTo0Njo0OCAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogRGVjICA5IDE2OjE2OjQ4IDIwMTggR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89RGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uLCBPVT1EU1QgKEFOWCBOZXR3b3JrKSBDQQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6YjQ6NDg6MTE6ODA6NTg6YTA6ZDU6YTU6OTk6MGY6ZjY6Mzc6MmM6NDQ6CisgICAgICAgICAgICAgICAgICAgIGI2OjZlOmQxOjdjOmYzOjJhOjZiOjllOjExOmI2Ojg4OjIzOjA0OjVjOjcxOgorICAgICAgICAgICAgICAgICAgICAyNTo5ZTo2YToxMjo3NzoxMTo2ZTpiZjo2ODozOTo2NTphODpmNjpiMjpmNjoKKyAgICAgICAgICAgICAgICAgICAgYTI6MTg6YjI6ODk6MTU6YTA6Njc6Yjc6N2E6OGM6MjI6NDg6NmI6ZjY6ODQ6CisgICAgICAgICAgICAgICAgICAgIDM0OjFmOmI2OmNhOmY3OjFiOjcyOmNiOmYyOjViOjQ4OmQzOjg3OjFlOjIyOgorICAgICAgICAgICAgICAgICAgICA3NjoxMzowNDpiNDphYzo2Yzo5Njo3ZjplNzowZTowODpjOTozMjo1MTozMDoKKyAgICAgICAgICAgICAgICAgICAgMmQ6ZDU6ODA6ZTg6MjE6Njc6YmE6ZjM6NWU6MDg6MjQ6MmM6MDc6NTk6OWQ6CisgICAgICAgICAgICAgICAgICAgIDkwOjFhOmVlOjQ2OmM5OmI1OmE0OjFlOjk2OmI0OjQxOjkxOmQ0OjdmOmQyOgorICAgICAgICAgICAgICAgICAgICA4ZDozODoyNjpiMDo2Zjo0Mzo2ZTowOTo3ZAorICAgICAgICAgICAgICAgIEV4cG9uZW50OiAzICgweDMpCisgICAgICAgIFg1MDl2MyBleHRlbnNpb25zOgorICAgICAgICAgICAgTmV0c2NhcGUgQ2VydCBUeXBlOiAKKyAgICAgICAgICAgICAgICBTU0wgQ0EsIFMvTUlNRSBDQSwgT2JqZWN0IFNpZ25pbmcgQ0EKKyAgICAgICAgICAgIFg1MDl2MyBDUkwgRGlzdHJpYnV0aW9uIFBvaW50czogCisgICAgICAgICAgICAgICAgRGlyTmFtZTovQz1VUy9PPURpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLi9PVT1EU1QgKEFOWCBOZXR3b3JrKSBDQS9DTj1DUkwxCisKKyAgICAgICAgICAgIFg1MDl2MyBQcml2YXRlIEtleSBVc2FnZSBQZXJpb2Q6IAorICAgICAgICAgICAgICAgIE5vdCBCZWZvcmU6IERlYyAgOSAxNTo0Njo0OCAxOTk4IEdNVCwgTm90IEFmdGVyOiBEZWMgIDkgMTU6NDY6NDggMjAxOCBHTVQKKyAgICAgICAgICAgIFg1MDl2MyBLZXkgVXNhZ2U6IAorICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIFNpZ24sIENSTCBTaWduCisgICAgICAgICAgICBYNTA5djMgQXV0aG9yaXR5IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICBrZXlpZDo4QzoxNjo1NTo3MDpDQzoxNjowQTo1Mzo2NDpDMjpBNTo4NDpBQTpCMzo2NDoxNzo0MzozRjo4MjozNgorCisgICAgICAgICAgICBYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAgOEM6MTY6NTU6NzA6Q0M6MTY6MEE6NTM6NjQ6QzI6QTU6ODQ6QUE6QjM6NjQ6MTc6NDM6M0Y6ODI6MzYKKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogCisgICAgICAgICAgICAgICAgQ0E6VFJVRQorICAgICAgICAgICAgMS4yLjg0MC4xMTM1MzMuNy42NS4wOiAKKyAgICAgICAgICAgICAgICAwCisuLlY0LjAuLi4uCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDQ5OjI1OmM5OjYwOmIxOjBjOjVmOmE5OjM5OjEwOmQzOmM1OjM0OjU1OjdkOmNmOjc5OmMzOgorICAgICAgICAyOTplYjpkZTpmOTpjMjo0MDpmOTplODo1NjpjNTpmMDoyZjplYzpmNDpkOTplYzo0ODo1MToKKyAgICAgICAgYjg6NjM6Mzg6NWU6OTM6NmU6MTg6OTY6ODU6Yjk6Y2E6NTA6OWM6YTQ6Yjg6ZWE6NjY6MjY6CisgICAgICAgIDY4OjkzOjg1OjZmOjZmOjRjOjcxOmQwOmJlOjdhOjBiOjNjOjMxOmI5OmY3OmJlOjY5OjllOgorICAgICAgICAxMDpkNzpkMTo0MDplODphYzoxNjo3MTphYjphZTphYjozODplMTo3MDpiMTpjYTo5MjoxNjoKKyAgICAgICAgZTA6NWQ6ODU6YTY6MTg6ODA6MDY6MDA6OWM6ZTE6YTY6MTg6NDI6NTE6YTc6Njg6Njg6NTk6CisgICAgICAgIGVmOjI2Ojk0OjVmOmFkOjMxOjBjOmZlOjI5OjFlOjE3OjAxOjg0OjM3OjViOmU4OjEyOjMyOgorICAgICAgICBhMzo1ZAorCitBbWVyaWNhbiBFeHByZXNzIENBCis9PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IDFDOkQ1OjhFOjgyOkJFOjcwOjU1OjhFOjM5OjYxOkRGOkFEOjUxOkRCOjZCOkEwCitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQ2tEQ0NBZmtDQWdDTk1BMEdDU3FHU0liM0RRRUJCQVVBTUlHUE1Rc3dDUVlEVlFRR0V3SlZVekVuTUNVRworQTFVRUNoTWVRVzFsY21sallXNGdSWGh3Y21WemN5QkRiMjF3WVc1NUxDQkpibU11TVNZd0pBWURWUVFMRXgxQgorYldWeWFXTmhiaUJGZUhCeVpYTnpJRlJsWTJodWIyeHZaMmxsY3pFdk1DMEdBMVVFQXhNbVFXMWxjbWxqWVc0ZworUlhod2NtVnpjeUJEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhrd0hoY05PVGd3T0RFME1qSXdNVEF3V2hjTgorTURZd09ERTBNak0xT1RBd1dqQ0JqekVMTUFrR0ExVUVCaE1DVlZNeEp6QWxCZ05WQkFvVEhrRnRaWEpwWTJGdQorSUVWNGNISmxjM01nUTI5dGNHRnVlU3dnU1c1akxqRW1NQ1FHQTFVRUN4TWRRVzFsY21sallXNGdSWGh3Y21WegorY3lCVVpXTm9ibTlzYjJkcFpYTXhMekF0QmdOVkJBTVRKa0Z0WlhKcFkyRnVJRVY0Y0hKbGMzTWdRMlZ5ZEdsbQorYVdOaGRHVWdRWFYwYUc5eWFYUjVNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0JnUURKOGttUworaGNyOUZTbTFCclpFN1B5SW8vS0d6djhVVHlRY2t2bkNJOEhPUTk5ZE5NaTRGT3pWS25DUlNaWFhWczJVOGFtVAorMEdnaTNFMTlvQXB5S2tmcUpmQ0ZBRjgyVkdIUEMvazNXbWVkNlIvcFpEOXdsV0duMERBQzNpWW9wR1lEQk9rdworKzQ4ekIvbHZZWWVpY3R2emFIaGpabG1weWJkbTRSV3lTRFlzK1FJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQkFVQQorQTRHQkFHZ1hZcmh6aTB4czYwcWxQcXZsblM3U3pZb0hWL1BHV1pkMkZ4ZjRVbzRuazloWTJDaHM5S0lFZW9yQworZGlTeEFyVGZLUEwzODZpbmZpTklZWWowRVdpdUpsMzJvVXRUSldyWUtoUUNEdUNISUc2ZUdWeHprQXNqNGpHWAorSXovVklxTFRCbnZhTi9YWHRVRkVGM3BGQXRtRlJXYldqc2Z3ZWd5WllpSnBXKzNTCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAxICgweDApCisgICAgICAgIFNlcmlhbCBOdW1iZXI6IDE0MSAoMHg4ZCkKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBPPUFtZXJpY2FuIEV4cHJlc3MgQ29tcGFueSwgSW5jLiwgT1U9QW1lcmljYW4gRXhwcmVzcyBUZWNobm9sb2dpZXMsIENOPUFtZXJpY2FuIEV4cHJlc3MgQ2VydGlmaWNhdGUgQXV0aG9yaXR5CisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBBdWcgMTQgMjI6MDE6MDAgMTk5OCBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEF1ZyAxNCAyMzo1OTowMCAyMDA2IEdNVAorICAgICAgICBTdWJqZWN0OiBDPVVTLCBPPUFtZXJpY2FuIEV4cHJlc3MgQ29tcGFueSwgSW5jLiwgT1U9QW1lcmljYW4gRXhwcmVzcyBUZWNobm9sb2dpZXMsIENOPUFtZXJpY2FuIEV4cHJlc3MgQ2VydGlmaWNhdGUgQXV0aG9yaXR5CisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpjOTpmMjo0OTo5Mjo4NTpjYTpmZDoxNToyOTpiNTowNjpiNjo0NDplYzoKKyAgICAgICAgICAgICAgICAgICAgZmM6ODg6YTM6ZjI6ODY6Y2U6ZmY6MTQ6NGY6MjQ6MWM6OTI6Zjk6YzI6MjM6CisgICAgICAgICAgICAgICAgICAgIGMxOmNlOjQzOmRmOjVkOjM0OmM4OmI4OjE0OmVjOmQ1OjJhOjcwOjkxOjQ5OgorICAgICAgICAgICAgICAgICAgICA5NTpkNzo1NjpjZDo5NDpmMTphOTo5MzpkMDo2ODoyMjpkYzo0ZDo3ZDphMDoKKyAgICAgICAgICAgICAgICAgICAgMGE6NzI6MmE6NDc6ZWE6MjU6ZjA6ODU6MDA6NWY6MzY6NTQ6NjE6Y2Y6MGI6CisgICAgICAgICAgICAgICAgICAgIGY5OjM3OjVhOjY3OjlkOmU5OjFmOmU5OjY0OjNmOjcwOjk1OjYxOmE3OmQwOgorICAgICAgICAgICAgICAgICAgICAzMDowMjpkZToyNjoyODphNDo2NjowMzowNDplOTozMDpmYjo4ZjozMzowNzoKKyAgICAgICAgICAgICAgICAgICAgZjk6NmY6NjE6ODc6YTI6NzI6ZGI6ZjM6Njg6Nzg6NjM6NjY6NTk6YTk6Yzk6CisgICAgICAgICAgICAgICAgICAgIGI3OjY2OmUxOjE1OmIyOjQ4OjM2OjJjOmY5CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDY4OjE3OjYyOmI4OjczOjhiOjRjOjZjOmViOjRhOmE1OjNlOmFiOmU1OjlkOjJlOmQyOmNkOgorICAgICAgICA4YTowNzo1NzpmMzpjNjo1OTo5Nzo3NjoxNzoxNzpmODo1Mjo4ZToyNzo5MzpkODo1ODpkODoKKyAgICAgICAgMjg6NmM6ZjQ6YTI6MDQ6N2E6OGE6YzI6NzY6MjQ6YjE6MDI6YjQ6ZGY6Mjg6ZjI6Zjc6ZjM6CisgICAgICAgIGE4OmE3OjdlOjIzOjQ4OjYxOjg4OmY0OjExOjY4OmFlOjI2OjVkOmY2OmExOjRiOjUzOjI1OgorICAgICAgICA2YTpkODoyYToxNDowMjowZTplMDo4NzoyMDo2ZTo5ZToxOTo1Yzo3Mzo5MDowYjoyMzplMjoKKyAgICAgICAgMzE6OTc6MjM6M2Y6ZDU6MjI6YTI6ZDM6MDY6N2I6ZGE6Mzc6ZjU6ZDc6YjU6NDE6NDQ6MTc6CisgICAgICAgIDdhOjQ1OjAyOmQ5Ojg1OjQ1OjY2OmQ2OjhlOmM3OmYwOjdhOjBjOjk5OjYyOjIyOjY5OjViOgorICAgICAgICBlZDpkMgorCitBbWVyaWNhbiBFeHByZXNzIEdsb2JhbCBDQQorPT09PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogNjM6MUI6NjY6OTM6OEM6RjM6NjY6Q0I6M0M6Nzk6NTc6REM6MDU6NDk6RUE6REIKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFQkRDQ0F1eWdBd0lCQWdJQ0FJVXdEUVlKS29aSWh2Y05BUUVGQlFBd2daWXhDekFKQmdOVkJBWVRBbFZUCitNU2N3SlFZRFZRUUtFeDVCYldWeWFXTmhiaUJGZUhCeVpYTnpJRU52YlhCaGJua3NJRWx1WXk0eEpqQWtCZ05WCitCQXNUSFVGdFpYSnBZMkZ1SUVWNGNISmxjM01nVkdWamFHNXZiRzluYVdWek1UWXdOQVlEVlFRREV5MUJiV1Z5CithV05oYmlCRmVIQnlaWE56SUVkc2IySmhiQ0JEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhrd0hoY05PVGd3CitPREUwTVRrd05qQXdXaGNOTVRNd09ERTBNak0xT1RBd1dqQ0JsakVMTUFrR0ExVUVCaE1DVlZNeEp6QWxCZ05WCitCQW9USGtGdFpYSnBZMkZ1SUVWNGNISmxjM01nUTI5dGNHRnVlU3dnU1c1akxqRW1NQ1FHQTFVRUN4TWRRVzFsCitjbWxqWVc0Z1JYaHdjbVZ6Y3lCVVpXTm9ibTlzYjJkcFpYTXhOakEwQmdOVkJBTVRMVUZ0WlhKcFkyRnVJRVY0CitjSEpsYzNNZ1IyeHZZbUZzSUVObGNuUnBabWxqWVhSbElFRjFkR2h2Y21sMGVUQ0NBU0l3RFFZSktvWklodmNOCitBUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBUEFrSm1ZdSsrdEtjM0ZUaVVmTEpqeFRrcFJNeXNLRnRRMzR3MWU5CitMeW9mYWhpM1Y2OE1BQmI2b0xhUXB2Y2FvUzVtSnNkb280cVRhV2ExUmxZdEhZTHFrQXdLSXNLSlVJMEY4OVNyCitjMEh3enhLc0tMUnZGSlNXV1V1ZWtIV0czK0pINitIcFQwTitoOG9uR0dhZXRjRkFaWDM4WVcrdG0zTFBxVjdZCis4L25hYnBFUStreTE2bjRnM3FrNUwvV0k1SXB2TmNZZ25DdUdSak1LL0RGVnBXdXNGa0RwelRWWmJ6SUV3M3UxCitEM3QzY1BOSXV5cFNnczZ2S1czeEVXOXQ1Z2NBQWUrYTh5WU5wbmtUWjYvNHF4eDFySkcxYTc1QXNONmNETEZwCitoUmx4a1JORnl0L1IvZWF5eXBhRGVkdkZ1S3BiZXBBTGVGWSt4dGVmbEVnUjlhMENBd0VBQWFOYU1GZ3dFZ1lECitWUjBUQVFIL0JBZ3dCZ0VCL3dJQkJUQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0Z3WURWUjBnQkJBd0RqQU1CZ29xCitoa2lHK1E4S0FRVUJNQmtHQTFVZERnUVNCQkJYUnpWN05pY1JxQWo4TDBZbDZ5UnBNQTBHQ1NxR1NJYjNEUUVCCitCUVVBQTRJQkFRREhZVVdvaW5HNXZqVHBJWHNoelZZVG1OVXdZK2tZcWt1U0ZiOExIYnZza21uRkxzTmhpK2d3CitSY3NRUnNGek9GeUxHZElyODBEcmZIS3pMaDRuNDNXVmloeWJMc1NWQllaeTBGWDBvWkpTZVZ6YjlQamM1ZGNTCitzVURIUElia01XVkt5amZHM25aWEdXbE1SbW44S3EwV04zcVRyUGNoU3kzNzY2bFF5OEhSUUFqYUEybUhwemRlCitWY0hGN2NUampnd21sNXRjVjB0eTQvSURCZEFDT3lZRFFKQ2V2Z3RiU1F4NDhkVk1WU25nOXYxTUE2bFVBakxSCitWMXFGckVQdFd6c1dYNkMvTmR0TG5udm8vK2NOUER1b20wbEJSdlZ6VHYrU1pTR0RFMVZ4NjBrOGY0Z2F3aElvCitKYUZHUzBFM2wzL3NqdkhVb1piQ0lMWmVyYWtjSGhHZworLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiAxMzMgKDB4ODUpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9VVMsIE89QW1lcmljYW4gRXhwcmVzcyBDb21wYW55LCBJbmMuLCBPVT1BbWVyaWNhbiBFeHByZXNzIFRlY2hub2xvZ2llcywgQ049QW1lcmljYW4gRXhwcmVzcyBHbG9iYWwgQ2VydGlmaWNhdGUgQXV0aG9yaXR5CisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBBdWcgMTQgMTk6MDY6MDAgMTk5OCBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEF1ZyAxNCAyMzo1OTowMCAyMDEzIEdNVAorICAgICAgICBTdWJqZWN0OiBDPVVTLCBPPUFtZXJpY2FuIEV4cHJlc3MgQ29tcGFueSwgSW5jLiwgT1U9QW1lcmljYW4gRXhwcmVzcyBUZWNobm9sb2dpZXMsIENOPUFtZXJpY2FuIEV4cHJlc3MgR2xvYmFsIENlcnRpZmljYXRlIEF1dGhvcml0eQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDIwNDggYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDIwNDggYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6ZjA6MjQ6MjY6NjY6MmU6ZmI6ZWI6NGE6NzM6NzE6NTM6ODk6NDc6Y2I6CisgICAgICAgICAgICAgICAgICAgIDI2OjNjOjUzOjkyOjk0OjRjOmNhOmMyOjg1OmI1OjBkOmY4OmMzOjU3OmJkOgorICAgICAgICAgICAgICAgICAgICAyZjoyYToxZjo2YToxODpiNzo1NzphZjowYzowMDoxNjpmYTphMDpiNjo5MDoKKyAgICAgICAgICAgICAgICAgICAgYTY6Zjc6MWE6YTE6MmU6NjY6MjY6Yzc6Njg6YTM6OGE6OTM6Njk6NjY6YjU6CisgICAgICAgICAgICAgICAgICAgIDQ2OjU2OjJkOjFkOjgyOmVhOjkwOjBjOjBhOjIyOmMyOjg5OjUwOjhkOjA1OgorICAgICAgICAgICAgICAgICAgICBmMzpkNDphYjo3Mzo0MTpmMDpjZjoxMjphYzoyODpiNDo2ZjoxNDo5NDo5NjoKKyAgICAgICAgICAgICAgICAgICAgNTk6NGI6OWU6OTA6NzU6ODY6ZGY6ZTI6NDc6ZWI6ZTE6ZTk6NGY6NDM6N2U6CisgICAgICAgICAgICAgICAgICAgIDg3OmNhOjI3OjE4OjY2OjllOmI1OmMxOjQwOjY1OjdkOmZjOjYxOjZmOmFkOgorICAgICAgICAgICAgICAgICAgICA5Yjo3MjpjZjphOTo1ZTpkODpmMzpmOTpkYTo2ZTo5MToxMDpmYTo0YzpiNToKKyAgICAgICAgICAgICAgICAgICAgZWE6N2U6MjA6ZGU6YTk6Mzk6MmY6ZjU6ODg6ZTQ6OGE6NmY6MzU6YzY6MjA6CisgICAgICAgICAgICAgICAgICAgIDljOjJiOjg2OjQ2OjMzOjBhOmZjOjMxOjU1OmE1OjZiOmFjOjE2OjQwOmU5OgorICAgICAgICAgICAgICAgICAgICBjZDozNTo1OTo2ZjozMjowNDpjMzo3YjpiNTowZjo3Yjo3Nzo3MDpmMzo0ODoKKyAgICAgICAgICAgICAgICAgICAgYmI6MmE6NTI6ODI6Y2U6YWY6Mjk6NmQ6ZjE6MTE6NmY6NmQ6ZTY6MDc6MDA6CisgICAgICAgICAgICAgICAgICAgIDAxOmVmOjlhOmYzOjI2OjBkOmE2Ojc5OjEzOjY3OmFmOmY4OmFiOjFjOjc1OgorICAgICAgICAgICAgICAgICAgICBhYzo5MTpiNTo2YjpiZTo0MDpiMDpkZTo5YzowYzpiMTo2OTo4NToxOTo3MToKKyAgICAgICAgICAgICAgICAgICAgOTE6MTM6NDU6Y2E6ZGY6ZDE6ZmQ6ZTY6YjI6Y2E6OTY6ODM6Nzk6ZGI6YzU6CisgICAgICAgICAgICAgICAgICAgIGI4OmFhOjViOjdhOjkwOjBiOjc4OjU2OjNlOmM2OmQ3OjlmOjk0OjQ4OjExOgorICAgICAgICAgICAgICAgICAgICBmNTphZAorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBYNTA5djMgQmFzaWMgQ29uc3RyYWludHM6IGNyaXRpY2FsCisgICAgICAgICAgICAgICAgQ0E6VFJVRSwgcGF0aGxlbjo1CisgICAgICAgICAgICBYNTA5djMgS2V5IFVzYWdlOiBjcml0aWNhbAorICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIFNpZ24sIENSTCBTaWduCisgICAgICAgICAgICBYNTA5djMgQ2VydGlmaWNhdGUgUG9saWNpZXM6IAorICAgICAgICAgICAgICAgIFBvbGljeTogMS4yLjg0MC4xMTM4MDcuMTAuMS41LjEKKworICAgICAgICAgICAgWDUwOXYzIFN1YmplY3QgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIDU3OjQ3OjM1OjdCOjM2OjI3OjExOkE4OjA4OkZDOjJGOjQ2OjI1OkVCOjI0OjY5CisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIGM3OjYxOjQ1OmE4OjhhOjcxOmI5OmJlOjM0OmU5OjIxOjdiOjIxOmNkOjU2OjEzOjk4OmQ1OgorICAgICAgICAzMDo2MzplOToxODphYTo0Yjo5MjoxNTpiZjowYjoxZDpiYjplYzo5Mjo2OTpjNToyZTpjMzoKKyAgICAgICAgNjE6OGI6ZTg6MzA6NDU6Y2I6MTA6NDY6YzE6NzM6Mzg6NWM6OGI6MTk6ZDI6MmI6ZjM6NDA6CisgICAgICAgIGViOjdjOjcyOmIzOjJlOjFlOjI3OmUzOjc1Ojk1OjhhOjFjOjliOjJlOmM0Ojk1OjA1Ojg2OgorICAgICAgICA3MjpkMDo1NTpmNDphMTo5Mjo1Mjo3OTo1YzpkYjpmNDpmODpkYzplNTpkNzoxMjpiMTo0MDoKKyAgICAgICAgYzc6M2M6ODY6ZTQ6MzE6NjU6NGE6Y2E6Mzc6YzY6ZGU6NzY6NTc6MTk6Njk6NGM6NDY6Njk6CisgICAgICAgIGZjOjJhOmFkOjE2OjM3OjdhOjkzOmFjOmY3OjIxOjRiOjJkOmZiOmViOmE5OjUwOmNiOmMxOgorICAgICAgICBkMTo0MDowODpkYTowMzo2OTo4NzphNzozNzo1ZTo1NTpjMTpjNTplZDpjNDplMzo4ZTowYzoKKyAgICAgICAgMjY6OTc6OWI6NWM6NTc6NGI6NzI6ZTM6ZjI6MDM6MDU6ZDA6MDI6M2I6MjY6MDM6NDA6OTA6CisgICAgICAgIDllOmJlOjBiOjViOjQ5OjBjOjc4OmYxOmQ1OjRjOjU1OjI5OmUwOmY2OmZkOjRjOjAzOmE5OgorICAgICAgICA1NDowMjozMjpkMTo1Nzo1YTo4NTphYzo0MzplZDo1YjozYjoxNjo1ZjphMDpiZjozNTpkYjoKKyAgICAgICAgNGI6OWU6N2I6ZTg6ZmY6ZTc6MGQ6M2M6M2I6YTg6OWI6NDk6NDE6NDY6ZjU6NzM6NGU6ZmY6CisgICAgICAgIDkyOjY1OjIxOjgzOjEzOjU1OjcxOmViOjQ5OjNjOjdmOjg4OjFhOmMyOjEyOjI4OjI1OmExOgorICAgICAgICA0Njo0Yjo0MTozNzo5Nzo3ZjplYzo4ZTpmMTpkNDphMTo5NjpjMjoyMDpiNjo1ZTphZDphOToKKyAgICAgICAgMWM6MWU6MTE6YTAKKworQmVsU2lnbiBPYmplY3QgUHVibGlzaGluZyBDQQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiA4QTowMjpGODpERjpCODpFMTo4NDo5Rjo1QTpDMjo2MDoyNDo2NTpEMTo3MzpGQgorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURBekNDQW15Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRUUZBRENCdXpFTE1Ba0dBMVVFQmhNQ1FrVXgKK0VUQVBCZ05WQkFjVENFSnlkWE56Wld4ek1STXdFUVlEVlFRS0V3cENaV3hUYVdkdUlFNVdNVGd3TmdZRFZRUUwKK0V5OUNaV3hUYVdkdUlFOWlhbVZqZENCUWRXSnNhWE5vYVc1bklFTmxjblJwWm1sallYUmxJRUYxZEdodmNtbDAKK2VURWxNQ01HQTFVRUF4TWNRbVZzVTJsbmJpQlBZbXBsWTNRZ1VIVmliR2x6YUdsdVp5QkRRVEVqTUNFR0NTcUcKK1NJYjNEUUVKQVJZVWQyVmliV0Z6ZEdWeVFHSmxiSE5wWjI0dVltVXdIaGNOT1Rjd09URTVNakl3TXpBd1doY04KK01EY3dPVEU1TWpJd016QXdXakNCdXpFTE1Ba0dBMVVFQmhNQ1FrVXhFVEFQQmdOVkJBY1RDRUp5ZFhOelpXeHoKK01STXdFUVlEVlFRS0V3cENaV3hUYVdkdUlFNVdNVGd3TmdZRFZRUUxFeTlDWld4VGFXZHVJRTlpYW1WamRDQlEKK2RXSnNhWE5vYVc1bklFTmxjblJwWm1sallYUmxJRUYxZEdodmNtbDBlVEVsTUNNR0ExVUVBeE1jUW1Wc1UybG4KK2JpQlBZbXBsWTNRZ1VIVmliR2x6YUdsdVp5QkRRVEVqTUNFR0NTcUdTSWIzRFFFSkFSWVVkMlZpYldGemRHVnkKK1FHSmxiSE5wWjI0dVltVXdnWjh3RFFZSktvWklodmNOQVFFQkJRQURnWTBBTUlHSkFvR0JBTVF1SDdhLzdvSkEKKzNmbTNMa0hWbmdXeFd0QW1mR0pWQTV2OHkySGVTKy8rNkpuK2g3bUl6NURhRHdrOGR0OFhsN2JMUHlWRi9iUzgKK1dBQytzRnEyRkllUDdtZGtyUjJJZzd0bm4yVmhBRmdJZ0ZDZmdNa3g5aXFRSEMzM1Ntd1E5aU5EWFRnSllJaFgKK0FzMFdiQmo4emZ1U0tuZlFucE9qWFloazBNajRYVlJSQWdNQkFBR2pGVEFUTUJFR0NXQ0dTQUdHK0VJQkFRUUUKK0F3SUFCekFOQmdrcWhraUc5dzBCQVFRRkFBT0JnUUJqZGhkOGx2QlRwVjBCSEZQT0tjSitkYXhNRGFJSWM3UnEKK01mMENCaFNaM0ZRRXBML0lsb2FmTVVNeUpWZjJoZllsdXplK29Ya2p5VmNHSlhGclJVLzQ5QUpBRm9JaXIxVHEKK01pajJEZTZadWtzSVVROXVoaU1oVEMwbGlJSEVMZzd4RXl3NGlwVUNKTU02bFdQa2s0NUl1d2hIY2wrdTVqcGEKK1I5Wnh4cDZhVWc9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiAxICgweDEpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1CRSwgTD1CcnVzc2VscywgTz1CZWxTaWduIE5WLCBPVT1CZWxTaWduIE9iamVjdCBQdWJsaXNoaW5nIENlcnRpZmljYXRlIEF1dGhvcml0eSwgQ049QmVsU2lnbiBPYmplY3QgUHVibGlzaGluZyBDQS9FbWFpbD13ZWJtYXN0ZXJAYmVsc2lnbi5iZQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogU2VwIDE5IDIyOjAzOjAwIDE5OTcgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBTZXAgMTkgMjI6MDM6MDAgMjAwNyBHTVQKKyAgICAgICAgU3ViamVjdDogQz1CRSwgTD1CcnVzc2VscywgTz1CZWxTaWduIE5WLCBPVT1CZWxTaWduIE9iamVjdCBQdWJsaXNoaW5nIENlcnRpZmljYXRlIEF1dGhvcml0eSwgQ049QmVsU2lnbiBPYmplY3QgUHVibGlzaGluZyBDQS9FbWFpbD13ZWJtYXN0ZXJAYmVsc2lnbi5iZQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6YzQ6MmU6MWY6YjY6YmY6ZWU6ODI6NDA6ZGQ6Zjk6Yjc6MmU6NDE6ZDU6CisgICAgICAgICAgICAgICAgICAgIDllOjA1OmIxOjVhOmQwOjI2OjdjOjYyOjU1OjAzOjliOmZjOmNiOjYxOmRlOgorICAgICAgICAgICAgICAgICAgICA0YjplZjpmZTplODo5OTpmZTo4NzpiOTo4ODpjZjo5MDpkYTowZjowOTozYzoKKyAgICAgICAgICAgICAgICAgICAgNzY6ZGY6MTc6OTc6YjY6Y2I6M2Y6MjU6NDU6ZmQ6YjQ6YmM6NTg6MDA6YmU6CisgICAgICAgICAgICAgICAgICAgIGIwOjVhOmI2OjE0Ojg3OjhmOmVlOjY3OjY0OmFkOjFkOjg4OjgzOmJiOjY3OgorICAgICAgICAgICAgICAgICAgICA5Zjo2NTo2MTowMDo1ODowODo4MDo1MDo5Zjo4MDpjOTozMTpmNjoyYTo5MDoKKyAgICAgICAgICAgICAgICAgICAgMWM6MmQ6Zjc6NGE6NmM6MTA6ZjY6MjM6NDM6NWQ6Mzg6MDk6NjA6ODg6NTc6CisgICAgICAgICAgICAgICAgICAgIDAyOmNkOjE2OjZjOjE4OmZjOmNkOmZiOjkyOjJhOjc3OmQwOjllOjkzOmEzOgorICAgICAgICAgICAgICAgICAgICA1ZDo4ODo2NDpkMDpjODpmODo1ZDo1NDo1MQorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBOZXRzY2FwZSBDZXJ0IFR5cGU6IAorICAgICAgICAgICAgICAgIFNTTCBDQSwgUy9NSU1FIENBLCBPYmplY3QgU2lnbmluZyBDQQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDYzOjc2OjE3OjdjOjk2OmYwOjUzOmE1OjVkOjAxOjFjOjUzOmNlOjI5OmMyOjdlOjc1OmFjOgorICAgICAgICA0YzowZDphMjowODo3MzpiNDo2YTozMTpmZDowMjowNjoxNDo5OTpkYzo1NDowNDphNDpiZjoKKyAgICAgICAgYzg6OTY6ODY6OWY6MzE6NDM6MzI6MjU6NTc6ZjY6ODU6ZjY6MjU6YmI6Mzc6YmU6YTE6Nzk6CisgICAgICAgIDIzOmM5OjU3OjA2OjI1OjcxOjZiOjQ1OjRmOmY4OmY0OjAyOjQwOjE2OjgyOjIyOmFmOjU0OgorICAgICAgICBlYTozMjoyODpmNjowZDplZTo5OTpiYTo0YjowODo1MTowZjo2ZTo4NjoyMzoyMTo0YzoyZDoKKyAgICAgICAgMjU6ODg6ODE6YzQ6MmU6MGU6ZjE6MTM6MmM6Mzg6OGE6OTU6MDI6MjQ6YzM6M2E6OTU6NjM6CisgICAgICAgIGU0OjkzOjhlOjQ4OmJiOjA4OjQ3OjcyOjVmOmFlOmU2OjNhOjVhOjQ3OmQ2OjcxOmM2OjllOgorICAgICAgICA5YTo1MgorCitCZWxTaWduIFNlY3VyZSBTZXJ2ZXIgQ0EKKz09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiAzRDo1RTo4MjpDNjpEOTpBRDpEOTo4Qjo5Mzo2QjowQzoxMDpCOTo0OTowQTpCMQorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUM4ekNDQWx5Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRUUZBRENCc3pFTE1Ba0dBMVVFQmhNQ1FrVXgKK0VUQVBCZ05WQkFjVENFSnlkWE56Wld4ek1STXdFUVlEVlFRS0V3cENaV3hUYVdkdUlFNVdNVFF3TWdZRFZRUUwKK0V5dENaV3hUYVdkdUlGTmxZM1Z5WlNCVFpYSjJaWElnUTJWeWRHbG1hV05oZEdVZ1FYVjBhRzl5YVhSNU1TRXcKK0h3WURWUVFERXhoQ1pXeFRhV2R1SUZObFkzVnlaU0JUWlhKMlpYSWdRMEV4SXpBaEJna3Foa2lHOXcwQkNRRVcKK0ZIZGxZbTFoYzNSbGNrQmlaV3h6YVdkdUxtSmxNQjRYRFRrM01EY3hOakl5TURBMU5Gb1hEVEEzTURjeE5qSXkKK01EQTFORm93Z2JNeEN6QUpCZ05WQkFZVEFrSkZNUkV3RHdZRFZRUUhFd2hDY25WemMyVnNjekVUTUJFR0ExVUUKK0NoTUtRbVZzVTJsbmJpQk9WakUwTURJR0ExVUVDeE1yUW1Wc1UybG5iaUJUWldOMWNtVWdVMlZ5ZG1WeUlFTmwKK2NuUnBabWxqWVhSbElFRjFkR2h2Y21sMGVURWhNQjhHQTFVRUF4TVlRbVZzVTJsbmJpQlRaV04xY21VZ1UyVnkKK2RtVnlJRU5CTVNNd0lRWUpLb1pJaHZjTkFRa0JGaFIzWldKdFlYTjBaWEpBWW1Wc2MybG5iaTVpWlRDQm56QU4KK0Jna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBMWdFU2VKTDRCRUoveWNjaWcveDhSM0F3SzBrTFBqWkEKK2tDamFJWE9EVS9MRTBSWkF3RlAvcnFiR0pMTW5iYVd6UFRsM1hhZ0c5dWJwdkdNUlRnWmxjQXFkay9taVFJdC8KK1NvUU9qUmF4MXN3SVpCSU00Q2hMeUtXRWtCZjdFVVl1MXFlRkdNc1lybU9hc0ZnRzlBRFArTVFKR2pVTW9mbnUKK1N2MXQzdjRtcFRzQ0F3RUFBYU1WTUJNd0VRWUpZSVpJQVliNFFnRUJCQVFEQWdDZ01BMEdDU3FHU0liM0RRRUIKK0JBVUFBNEdCQUd3OW1jTUY0aDNLNVMycWFJV0xRREVnWmhObzVsZzZpZENOZGJMRll0aDlnby8zMlRLQmQvWTEKK1c0VXB6bWV5dWJ3ckdYalA4NGY5UnZHVmRiSUpWd013d1hyTmNrZHhnTXA5bmNsbFBFY1JJbjM2Qndzb2VLR1QKKzZBVkZTT0l5TWtvOTZGTWNFTGZIYzR3SFVPSDV5U3RUUWZXRGplVUpPVXFPQTJLcVFHT0wKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjogMSAoMHgxKQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9QkUsIEw9QnJ1c3NlbHMsIE89QmVsU2lnbiBOViwgT1U9QmVsU2lnbiBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRlIEF1dGhvcml0eSwgQ049QmVsU2lnbiBTZWN1cmUgU2VydmVyIENBL0VtYWlsPXdlYm1hc3RlckBiZWxzaWduLmJlCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBKdWwgMTYgMjI6MDA6NTQgMTk5NyBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEp1bCAxNiAyMjowMDo1NCAyMDA3IEdNVAorICAgICAgICBTdWJqZWN0OiBDPUJFLCBMPUJydXNzZWxzLCBPPUJlbFNpZ24gTlYsIE9VPUJlbFNpZ24gU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHksIENOPUJlbFNpZ24gU2VjdXJlIFNlcnZlciBDQS9FbWFpbD13ZWJtYXN0ZXJAYmVsc2lnbi5iZQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6ZDY6MDE6MTI6Nzg6OTI6Zjg6MDQ6NDI6N2Y6Yzk6Yzc6MjI6ODM6ZmM6CisgICAgICAgICAgICAgICAgICAgIDdjOjQ3OjcwOjMwOjJiOjQ5OjBiOjNlOjM2OjQwOjkwOjI4OmRhOjIxOjczOgorICAgICAgICAgICAgICAgICAgICA4Mzo1MzpmMjpjNDpkMToxNjo0MDpjMDo1MzpmZjphZTphNjpjNjoyNDpiMzoKKyAgICAgICAgICAgICAgICAgICAgMjc6NmQ6YTU6YjM6M2Q6Mzk6Nzc6NWQ6YTg6MDY6ZjY6ZTY6ZTk6YmM6NjM6CisgICAgICAgICAgICAgICAgICAgIDExOjRlOjA2OjY1OjcwOjBhOjlkOjkzOmY5OmEyOjQwOjhiOjdmOjRhOjg0OgorICAgICAgICAgICAgICAgICAgICAwZTo4ZDoxNjpiMTpkNjpjYzowODo2NDoxMjowYzplMDoyODo0YjpjODphNToKKyAgICAgICAgICAgICAgICAgICAgODQ6OTA6MTc6ZmI6MTE6NDY6MmU6ZDY6YTc6ODU6MTg6Y2I6MTg6YWU6NjM6CisgICAgICAgICAgICAgICAgICAgIDlhOmIwOjU4OjA2OmY0OjAwOmNmOmY4OmM0OjA5OjFhOjM1OjBjOmExOmY5OgorICAgICAgICAgICAgICAgICAgICBlZTo0YTpmZDo2ZDpkZTpmZToyNjphNTozYgorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBOZXRzY2FwZSBDZXJ0IFR5cGU6IAorICAgICAgICAgICAgICAgIFNTTCBDbGllbnQsIFMvTUlNRQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDZjOjNkOjk5OmMzOjA1OmUyOjFkOmNhOmU1OjJkOmFhOjY4Ojg1OjhiOjQwOjMxOjIwOjY2OgorICAgICAgICAxMzo2ODplNjo1ODozYTo4OTpkMDo4ZDo3NTpiMjpjNTo2MjpkODo3ZDo4Mjo4ZjpmNzpkOToKKyAgICAgICAgMzI6ODE6Nzc6ZjY6MzU6NWI6ODU6Mjk6Y2U6Njc6YjI6Yjk6YmM6MmI6MTk6Nzg6Y2Y6ZjM6CisgICAgICAgIDg3OmZkOjQ2OmYxOjk1Ojc1OmIyOjA5OjU3OjAzOjMwOmMxOjdhOmNkOjcyOjQ3OjcxOjgwOgorICAgICAgICBjYTo3ZDo5ZDpjOTo2NTozYzo0NzoxMToyMjo3ZDpmYTowNzowYjoyODo3ODphMTo5MzplODoKKyAgICAgICAgMDU6NDU6NDg6ZTI6MzI6MzI6NGE6M2Q6ZTg6NTM6MWM6MTA6Yjc6Yzc6NzM6OGM6MDc6NTA6CisgICAgICAgIGUxOmY5OmM5OjJiOjUzOjQxOmY1OjgzOjhkOmU1OjA5OjM5OjRhOjhlOjAzOjYyOmFhOjQwOgorICAgICAgICA2Mzo4YgorCitEZXV0c2NoZSBUZWxla29tIEFHIFJvb3QgQ0EKKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiA3NzpERTowNDo5NDo3NzpEMDowQzo1RjpBNzpCMTpGNDozMDoxODo4NzpGQjo1NQorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUNqakNDQWZlZ0F3SUJBZ0lCQmpBTkJna3Foa2lHOXcwQkFRUUZBREJ0TVFzd0NRWURWUVFHRXdKRVJURWMKK01Cb0dBMVVFQ2hNVFJHVjFkSE5qYUdVZ1ZHVnNaV3R2YlNCQlJ6RWRNQnNHQTFVRUN4TVVWR1ZzWlZObFl5QlUKK2NuVnpkQ0JEWlc1MFpYSXhJVEFmQmdOVkJBTVRHRVJsZFhSelkyaGxJRlJsYkdWcmIyMGdVbTl2ZENCRFFUQWUKK0Z3MDVPREV5TURrd09URXhNREJhRncwd05ERXlNRGt5TXpVNU1EQmFNRzB4Q3pBSkJnTlZCQVlUQWtSRk1Sd3cKK0dnWURWUVFLRXhORVpYVjBjMk5vWlNCVVpXeGxhMjl0SUVGSE1SMHdHd1lEVlFRTEV4UlVaV3hsVTJWaklGUnkKK2RYTjBJRU5sYm5SbGNqRWhNQjhHQTFVRUF4TVlSR1YxZEhOamFHVWdWR1ZzWld0dmJTQlNiMjkwSUVOQk1JR2YKK01BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FEZEJTejVCYk81RXRkcGNmZnFWakFJVnhSRGU3c2EKK25HMHZWMkhYNHZWRWErNDJRWmIyWk03aHdiSzVwQlFFbUZEb2NQaU9OWnA5U2NGaEhWbXUyZ1lZbFgydHp1eXAKK3Z0RVlEMENSZGlxajVmMytpUlgwVi9mZ1ZkcDFyUUQwTE1FMXpMUkRKbFZpUkM0QkpaeUtXL0RCMEFBMWVQNDEKKzNwUkFaSGlEb2N3NWlRSURBUUFCb3o0d1BEQVBCZ05WSFJNRUNEQUdBUUgvQWdFRk1BNEdBMVVkRHdFQi93UUUKK0F3SUJCakFaQmdOVkhRNEVFZ1FRTElkWkg0c1RnTEw1aHAwK0VuNVlsakFOQmdrcWhraUc5dzBCQVFRRkFBT0IKK2dRQVAvbk8xQjRodm9BdUo2c3BRSDVUZWxDc0xKMTVQOVJ5Vkp0cU1sbFN0R1pFM1ExMnJ5WXV6elcrWU9UM3QKKzNUWGpjYmZ0RTVPRDZJYmxLVE1URTd3MWUvMG9MM0JaMWRPMGpTZ1RXVHZJMVhUNVJjSUhZS3E0R0ZUNXBXai8KKzF3WFZqN1lGTVM1QlN2UVFIMkJIR2d1TEdVMlNWeURTNzFBWjZNM1FjTHk4Tmc9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiA2ICgweDYpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1ERSwgTz1EZXV0c2NoZSBUZWxla29tIEFHLCBPVT1UZWxlU2VjIFRydXN0IENlbnRlciwgQ049RGV1dHNjaGUgVGVsZWtvbSBSb290IENBCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBEZWMgIDkgMDk6MTE6MDAgMTk5OCBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IERlYyAgOSAyMzo1OTowMCAyMDA0IEdNVAorICAgICAgICBTdWJqZWN0OiBDPURFLCBPPURldXRzY2hlIFRlbGVrb20gQUcsIE9VPVRlbGVTZWMgVHJ1c3QgQ2VudGVyLCBDTj1EZXV0c2NoZSBUZWxla29tIFJvb3QgQ0EKKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgxMDI0IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgxMDI0IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmRkOjA1OjJjOmY5OjA1OmIzOmI5OjEyOmQ3OjY5OjcxOmY3OmVhOjU2OgorICAgICAgICAgICAgICAgICAgICAzMDowODo1NzoxNDo0Mzo3YjpiYjoxYTo5Yzo2ZDoyZjo1Nzo2MTpkNzplMjoKKyAgICAgICAgICAgICAgICAgICAgZjU6NDQ6NmI6ZWU6MzY6NDE6OTY6ZjY6NjQ6Y2U6ZTE6YzE6YjI6Yjk6YTQ6CisgICAgICAgICAgICAgICAgICAgIDE0OjA0Ojk4OjUwOmU4OjcwOmY4OjhlOjM1OjlhOjdkOjQ5OmMxOjYxOjFkOgorICAgICAgICAgICAgICAgICAgICA1OTphZTpkYTowNjoxODo5NTo3ZDphZDpjZTplYzphOTpiZTpkMToxODowZjoKKyAgICAgICAgICAgICAgICAgICAgNDA6OTE6NzY6MmE6YTM6ZTU6ZmQ6ZmU6ODk6MTU6ZjQ6NTc6Zjc6ZTA6NTU6CisgICAgICAgICAgICAgICAgICAgIGRhOjc1OmFkOjAwOmY0OjJjOmMxOjM1OmNjOmI0OjQzOjI2OjU1OjYyOjQ0OgorICAgICAgICAgICAgICAgICAgICAyZTowMToyNTo5Yzo4YTo1YjpmMDpjMTpkMDowMDozNTo3ODpmZTozNTpkZToKKyAgICAgICAgICAgICAgICAgICAgOTQ6NDA6NjQ6Nzg6ODM6YTE6Y2M6Mzk6ODkKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgICAgIFg1MDl2MyBleHRlbnNpb25zOgorICAgICAgICAgICAgWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzOiAKKyAgICAgICAgICAgICAgICBDQTpUUlVFLCBwYXRobGVuOjUKKyAgICAgICAgICAgIFg1MDl2MyBLZXkgVXNhZ2U6IGNyaXRpY2FsCisgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUgU2lnbiwgQ1JMIFNpZ24KKyAgICAgICAgICAgIFg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICAyQzo4Nzo1OToxRjo4QjoxMzo4MDpCMjpGOTo4Njo5RDozRToxMjo3RTo1ODo5NgorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDBmOmZlOjczOmI1OjA3Ojg4OjZmOmEwOjBiOjg5OmVhOmNhOjUwOjFmOjk0OmRlOjk0OjJiOgorICAgICAgICAwYjoyNzo1ZTo0ZjpmNToxYzo5NToyNjpkYTo4Yzo5Njo1NDphZDoxOTo5MTozNzo0Mzo1ZDoKKyAgICAgICAgYWI6Yzk6OGI6YjM6Y2Q6NmY6OTg6Mzk6M2Q6ZWQ6ZGQ6MzU6ZTM6NzE6Yjc6ZWQ6MTM6OTM6CisgICAgICAgIDgzOmU4Ojg2OmU1OjI5OjMzOjEzOjEzOmJjOjM1OjdiOmZkOjI4OjJmOjcwOjU5OmQ1OmQzOgorICAgICAgICBiNDo4ZDoyODoxMzo1OTozYjpjODpkNTo3NDpmOTo0NTpjMjowNzo2MDphYTpiODoxODo1NDoKKyAgICAgICAgZjk6YTU6Njg6ZmY6ZDc6MDU6ZDU6OGY6YjY6MDU6MzE6MmU6NDE6NGE6ZjQ6MTA6MWY6NjA6CisgICAgICAgIDQ3OjFhOjBiOjhiOjE5OjRkOjkyOjU3OjIwOmQyOmVmOjUwOjE5OmU4OmNkOmQwOjcwOmJjOgorICAgICAgICBiYzozNgorCitEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4gR2xvYmFsIENBIDEKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiAyNTo3QTpCQTo4MzoyRTpCNjpBMjowQjpEQTpGRTpGNTowMjowRjowODpENzpBRAorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURLVENDQXBLZ0F3SUJBZ0lFTm5BVmxqQU5CZ2txaGtpRzl3MEJBUVVGQURCR01Rc3dDUVlEVlFRR0V3SlYKK1V6RWtNQ0lHQTFVRUNoTWJSR2xuYVhSaGJDQlRhV2R1WVhSMWNtVWdWSEoxYzNRZ1EyOHVNUkV3RHdZRFZRUUwKK0V3aEVVMVJEUVNCRk1UQWVGdzA1T0RFeU1UQXhPREV3TWpOYUZ3MHhPREV5TVRBeE9EUXdNak5hTUVZeEN6QUoKK0JnTlZCQVlUQWxWVE1TUXdJZ1lEVlFRS0V4dEVhV2RwZEdGc0lGTnBaMjVoZEhWeVpTQlVjblZ6ZENCRGJ5NHgKK0VUQVBCZ05WQkFzVENFUlRWRU5CSUVVeE1JR2RNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R0xBRENCaHdLQmdRQ2cKK2JJR3B6elFlSk4zK2hpak0zb012K1Y3VVF0TG9kR0JtRTVnR0hLbFJFbWx2TVZXNVNYSUFDSDdUcFdKRU55U1oKK2o5bURTSStaYlpVVHUwTTdMa2xPaURmQnUxaC8vdUc5K0x0aHpmTkh3Sm1tOGZPUjZIaDhBTXRoeVVRbmNXbFYKK1NuNUpUZTJpbzc0Q1RBREtBcWp1QVFJeFpBOVNMUk4wZGphMWVyUXRjUUlCQTZPQ0FTUXdnZ0VnTUJFR0NXQ0cKK1NBR0crRUlCQVFRRUF3SUFCekJvQmdOVkhSOEVZVEJmTUYyZ1c2QlpwRmN3VlRFTE1Ba0dBMVVFQmhNQ1ZWTXgKK0pEQWlCZ05WQkFvVEcwUnBaMmwwWVd3Z1UybG5ibUYwZFhKbElGUnlkWE4wSUVOdkxqRVJNQThHQTFVRUN4TUkKK1JGTlVRMEVnUlRFeERUQUxCZ05WQkFNVEJFTlNUREV3S3dZRFZSMFFCQ1F3SW9BUE1UazVPREV5TVRBeE9ERXcKK01qTmFnUTh5TURFNE1USXhNREU0TVRBeU0xb3dDd1lEVlIwUEJBUURBZ0VHTUI4R0ExVWRJd1FZTUJhQUZHcDUKK2ZwRnBSaGdUQ2dKM3BWbGJZSmdsRHFMNE1CMEdBMVVkRGdRV0JCUnFlWDZSYVVZWUV3b0NkNlZaVzJDWUpRNmkKKytEQU1CZ05WSFJNRUJUQURBUUgvTUJrR0NTcUdTSWIyZlFkQkFBUU1NQW9iQkZZMExqQURBZ1NRTUEwR0NTcUcKK1NJYjNEUUVCQlFVQUE0R0JBQ0lTMkhvZDNJRUd0Z2xsc29mSUgxNjBMK25FSHZJOHdic0VrQkZLZzA1K2s3bE4KK1FzZVNKcUJjTkpvNGN2ajlheFkrSU82Q2l6RXFremFGSTRpS1BBTm8wOGtKRDAzOGJLVGFLSEtURG9tQXNIMysKK2dHOWxiUmd6bDR2Q2E0bnVZRDNJbSs5L0t6SmljNVBMUE9ONzRuWjRSYnloa3dTN2hwODZXME42dzRwbAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiA5MTMzMTUyMjIgKDB4MzY3MDE1OTYpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9VVMsIE89RGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uLCBPVT1EU1RDQSBFMQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogRGVjIDEwIDE4OjEwOjIzIDE5OTggR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBEZWMgMTAgMTg6NDA6MjMgMjAxOCBHTVQKKyAgICAgICAgU3ViamVjdDogQz1VUywgTz1EaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4sIE9VPURTVENBIEUxCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDphMDo2Yzo4MTphOTpjZjozNDoxZToyNDpkZDpmZTo4NjoyODpjYzpkZToKKyAgICAgICAgICAgICAgICAgICAgODM6MmY6Zjk6NWU6ZDQ6NDI6ZDI6ZTg6NzQ6NjA6NjY6MTM6OTg6MDY6MWM6CisgICAgICAgICAgICAgICAgICAgIGE5OjUxOjEyOjY5OjZmOjMxOjU1OmI5OjQ5OjcyOjAwOjA4OjdlOmQzOmE1OgorICAgICAgICAgICAgICAgICAgICA2Mjo0NDozNzoyNDo5OTo4ZjpkOTo4Mzo0ODo4Zjo5OTo2ZDo5NToxMzpiYjoKKyAgICAgICAgICAgICAgICAgICAgNDM6M2I6MmU6NDk6NGU6ODg6Mzc6YzE6YmI6NTg6N2Y6ZmU6ZTE6YmQ6Zjg6CisgICAgICAgICAgICAgICAgICAgIGJiOjYxOmNkOmYzOjQ3OmMwOjk5OmE2OmYxOmYzOjkxOmU4Ojc4OjdjOjAwOgorICAgICAgICAgICAgICAgICAgICBjYjo2MTpjOTo0NDoyNzo3MTo2OTo1NTo0YTo3ZTo0OTo0ZDplZDphMjphMzoKKyAgICAgICAgICAgICAgICAgICAgYmU6MDI6NGM6MDA6Y2E6MDI6YTg6ZWU6MDE6MDI6MzE6NjQ6MGY6NTI6MmQ6CisgICAgICAgICAgICAgICAgICAgIDEzOjc0Ojc2OjM2OmI1OjdhOmI0OjJkOjcxCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDMgKDB4MykKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBOZXRzY2FwZSBDZXJ0IFR5cGU6IAorICAgICAgICAgICAgICAgIFNTTCBDQSwgUy9NSU1FIENBLCBPYmplY3QgU2lnbmluZyBDQQorICAgICAgICAgICAgWDUwOXYzIENSTCBEaXN0cmlidXRpb24gUG9pbnRzOiAKKyAgICAgICAgICAgICAgICBEaXJOYW1lOi9DPVVTL089RGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uL09VPURTVENBIEUxL0NOPUNSTDEKKworICAgICAgICAgICAgWDUwOXYzIFByaXZhdGUgS2V5IFVzYWdlIFBlcmlvZDogCisgICAgICAgICAgICAgICAgTm90IEJlZm9yZTogRGVjIDEwIDE4OjEwOjIzIDE5OTggR01ULCBOb3QgQWZ0ZXI6IERlYyAxMCAxODoxMDoyMyAyMDE4IEdNVAorICAgICAgICAgICAgWDUwOXYzIEtleSBVc2FnZTogCisgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUgU2lnbiwgQ1JMIFNpZ24KKyAgICAgICAgICAgIFg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIGtleWlkOjZBOjc5OjdFOjkxOjY5OjQ2OjE4OjEzOjBBOjAyOjc3OkE1OjU5OjVCOjYwOjk4OjI1OjBFOkEyOkY4CisKKyAgICAgICAgICAgIFg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICA2QTo3OTo3RTo5MTo2OTo0NjoxODoxMzowQTowMjo3NzpBNTo1OTo1Qjo2MDo5ODoyNTowRTpBMjpGOAorICAgICAgICAgICAgWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzOiAKKyAgICAgICAgICAgICAgICBDQTpUUlVFCisgICAgICAgICAgICAxLjIuODQwLjExMzUzMy43LjY1LjA6IAorICAgICAgICAgICAgICAgIDAKKy4uVjQuMC4uLi4KKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgMjI6MTI6ZDg6N2E6MWQ6ZGM6ODE6MDY6YjY6MDk6NjU6YjI6ODc6Yzg6MWY6NWU6YjQ6MmY6CisgICAgICAgIGU5OmM0OjFlOmYyOjNjOmMxOmJiOjA0OjkwOjExOjRhOjgzOjRlOjdlOjkzOmI5OjRkOjQyOgorICAgICAgICBjNzo5MjoyNjphMDo1YzozNDo5YTozODo3MjpmODpmZDo2YjoxNjozZToyMDplZTo4Mjo4YjoKKyAgICAgICAgMzE6MmE6OTM6MzY6ODU6MjM6ODg6OGE6M2M6MDM6Njg6ZDM6Yzk6MDk6MGY6NGQ6ZmM6NmM6CisgICAgICAgIGE0OmRhOjI4OjcyOjkzOjBlOjg5OjgwOmIwOjdkOmZlOjgwOjZmOjY1OjZkOjE4OjMzOjk3OgorICAgICAgICA4YjpjMjo2Yjo4OTplZTo2MDozZDpjODo5YjplZjo3ZjoyYjozMjo2Mjo3Mzo5MzpjYjozYzoKKyAgICAgICAgZTM6N2I6ZTI6NzY6Nzg6NDU6YmM6YTE6OTM6MDQ6YmI6ODY6OWY6M2E6NWI6NDM6N2E6YzM6CisgICAgICAgIDhhOjY1CisKK0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLiBHbG9iYWwgQ0EgMgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IDZDOkM5OkE3OjZFOjQ3OkYxOjBDOkUzOjUzOjNCOjc4OjRDOjREOkMyOjZBOkM1CitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRDJEQ0NBc0FDRVFEUUhrQ0xBQUFDZkFBQUFBSUFBQUFCTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUdwTVFzdworQ1FZRFZRUUdFd0oxY3pFTk1Bc0dBMVVFQ0JNRVZYUmhhREVYTUJVR0ExVUVCeE1PVTJGc2RDQk1ZV3RsSUVOcAorZEhreEpEQWlCZ05WQkFvVEcwUnBaMmwwWVd3Z1UybG5ibUYwZFhKbElGUnlkWE4wSUVOdkxqRVJNQThHQTFVRQorQ3hNSVJGTlVRMEVnV0RFeEZqQVVCZ05WQkFNVERVUlRWQ0JTYjI5MFEwRWdXREV4SVRBZkJna3Foa2lHOXcwQgorQ1FFV0VtTmhRR1JwWjNOcFozUnlkWE4wTG1OdmJUQWVGdzA1T0RFeU1ERXhPREU0TlRWYUZ3MHdPREV4TWpneAorT0RFNE5UVmFNSUdwTVFzd0NRWURWUVFHRXdKMWN6RU5NQXNHQTFVRUNCTUVWWFJoYURFWE1CVUdBMVVFQnhNTworVTJGc2RDQk1ZV3RsSUVOcGRIa3hKREFpQmdOVkJBb1RHMFJwWjJsMFlXd2dVMmxuYm1GMGRYSmxJRlJ5ZFhOMAorSUVOdkxqRVJNQThHQTFVRUN4TUlSRk5VUTBFZ1dERXhGakFVQmdOVkJBTVREVVJUVkNCU2IyOTBRMEVnV0RFeAorSVRBZkJna3Foa2lHOXcwQkNRRVdFbU5oUUdScFozTnBaM1J5ZFhOMExtTnZiVENDQVNJd0RRWUpLb1pJaHZjTgorQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU5MR0pyYm5wVDNCeEdqVlVHOVR4VzlKRXdtNHJ5eElqUlJxb3hkZgorV3ZuVExuVXYyQ2hpMFpNdi9FM1VxNGZsQ01lWjU1SS9kYjNySmJRVndac1pQZEpFamRkMElHMDNBbzlwazF1SworeEJtZDlMSU8vQlpzdWJFRmtvUFJoU3hnbEQ1RlZhRFpxd2doNW1Eb08zVHltVkJSYU5BRExiR0F2cVBZVXJCRQorelVOS2NJNVloWlhoVGl6V0xVRnYxb1RueUpoRXlrZmJMQ1NsYVNiUGE3Z25Zc1AweVhxU0krMFRaNEt1UlM1RgorNVg1eVA0V2RsR0lRNWp5Um9hMTNBT0FWN1BPRWdISjZqbTVnbDhja1dSQTBnMXZocGFScHRsYzFISGhaeHRNdgorT25ObjdwVEtCQk1GWWdad0k3UDBmTzVGMldRTFcwbXFwRVBPSnNSRUVteTQzWGtDQXdFQUFUQU5CZ2txaGtpRworOXcwQkFRVUZBQU9DQVFFQW9qZXlQMm43MTRaNVZFa3hsVE1yODlFSkZFbGlZSWFsc0JIaVVNSWRCbGMrTGVnegorWkw2YnFxMWZHMDNVbVpXaWk1ckpZbksxYWVyWldLczE3UldpUTlhMnZBZDVaV1J6ZmRkNXludlZXbEhHNFZNRQorbG8wNHo2TVhyRGx4YXdIRGkxTThZK251ZWNEa3ZwSXlaSHF6SDVlVVlyM3FzaUFWbGZ1WDhuZ3ZZelpBT09ORworRHgzZHJKWEs1MHVRZTdGTHFkVEY2NXJhcXRXamxCUkdqUzBmOHpyV2t6cjJQbm44Nk9hd2RlM3VQY2x3eDEycQorZ1V0R0pSekhiQlhqbFU0UHFqSTNsQW9YSkpJVGhGalNZMjhyOStaYllnc1RGN0FOVWt6Ky9tOWM0cEZ1SGYyaworWXRkbytvNTZUOUlJMnBQYzhKSVJldERjY3BNTWM1TmloV2pROUE9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMSAoMHgwKQorICAgICAgICBTZXJpYWwgTnVtYmVyOgorICAgICAgICAgICAgZDA6MWU6NDA6OGI6MDA6MDA6MDI6N2M6MDA6MDA6MDA6MDI6MDA6MDA6MDA6MDEKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz11cywgU1Q9VXRhaCwgTD1TYWx0IExha2UgQ2l0eSwgTz1EaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4sIE9VPURTVENBIFgxLCBDTj1EU1QgUm9vdENBIFgxL0VtYWlsPWNhQGRpZ3NpZ3RydXN0LmNvbQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogRGVjICAxIDE4OjE4OjU1IDE5OTggR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBOb3YgMjggMTg6MTg6NTUgMjAwOCBHTVQKKyAgICAgICAgU3ViamVjdDogQz11cywgU1Q9VXRhaCwgTD1TYWx0IExha2UgQ2l0eSwgTz1EaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4sIE9VPURTVENBIFgxLCBDTj1EU1QgUm9vdENBIFgxL0VtYWlsPWNhQGRpZ3NpZ3RydXN0LmNvbQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDIwNDggYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDIwNDggYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6ZDI6YzY6MjY6YjY6ZTc6YTU6M2Q6YzE6YzQ6Njg6ZDU6NTA6NmY6NTM6CisgICAgICAgICAgICAgICAgICAgIGM1OjZmOjQ5OjEzOjA5OmI4OmFmOjJjOjQ4OjhkOjE0OjZhOmEzOjE3OjVmOgorICAgICAgICAgICAgICAgICAgICA1YTpmOTpkMzoyZTo3NToyZjpkODoyODo2MjpkMTo5MzoyZjpmYzo0ZDpkNDoKKyAgICAgICAgICAgICAgICAgICAgYWI6ODc6ZTU6MDg6Yzc6OTk6ZTc6OTI6M2Y6NzU6YmQ6ZWI6MjU6YjQ6MTU6CisgICAgICAgICAgICAgICAgICAgIGMxOjliOjE5OjNkOmQyOjQ0OjhkOmQ3Ojc0OjIwOjZkOjM3OjAyOjhmOjY5OgorICAgICAgICAgICAgICAgICAgICA5Mzo1Yjo4YTpjNDoxOTo5ZDpmNDpiMjowZTpmYzoxNjo2YzpiOTpiMTowNToKKyAgICAgICAgICAgICAgICAgICAgOTI6ODM6ZDE6ODU6MmM6NjA6OTQ6M2U6NDU6NTU6YTA6ZDk6YWI6MDg6MjE6CisgICAgICAgICAgICAgICAgICAgIGU2OjYwOmU4OjNiOjc0OmYyOjk5OjUwOjUxOjY4OmQwOjAzOjJkOmIxOjgwOgorICAgICAgICAgICAgICAgICAgICBiZTphMzpkODo1MjpiMDo0NDpjZDo0Mzo0YTo3MDo4ZTo1ODo4NTo5NTplMToKKyAgICAgICAgICAgICAgICAgICAgNGU6MmM6ZDY6MmQ6NDE6NmY6ZDY6ODQ6ZTc6Yzg6OTg6NDQ6Y2E6NDc6ZGI6CisgICAgICAgICAgICAgICAgICAgIDJjOjI0OmE1OjY5OjI2OmNmOjZiOmI4OjI3OjYyOmMzOmY0OmM5OjdhOjkyOgorICAgICAgICAgICAgICAgICAgICAyMzplZDoxMzo2Nzo4MjphZTo0NToyZTo0NTplNTo3ZTo3MjozZjo4NTo5ZDoKKyAgICAgICAgICAgICAgICAgICAgOTQ6NjI6MTA6ZTY6M2M6OTE6YTE6YWQ6Nzc6MDA6ZTA6MTU6ZWM6ZjM6ODQ6CisgICAgICAgICAgICAgICAgICAgIDgwOjcyOjdhOjhlOjZlOjYwOjk3OmM3OjI0OjU5OjEwOjM0OjgzOjViOmUxOgorICAgICAgICAgICAgICAgICAgICBhNTphNDo2OTpiNjo1NzozNToxYzo3ODo1OTpjNjpkMzoyZjozYTo3Mzo2NzoKKyAgICAgICAgICAgICAgICAgICAgZWU6OTQ6Y2E6MDQ6MTM6MDU6NjI6MDY6NzA6MjM6YjM6ZjQ6N2M6ZWU6NDU6CisgICAgICAgICAgICAgICAgICAgIGQ5OjY0OjBiOjViOjQ5OmFhOmE0OjQzOmNlOjI2OmM0OjQ0OjEyOjZjOmI4OgorICAgICAgICAgICAgICAgICAgICBkZDo3OQorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgYTI6Mzc6YjI6M2Y6Njk6ZmI6ZDc6ODY6Nzk6NTQ6NDk6MzE6OTU6MzM6MmI6ZjM6ZDE6MDk6CisgICAgICAgIDE0OjQ5OjYyOjYwOjg2OmE1OmIwOjExOmUyOjUwOmMyOjFkOjA2OjU3OjNlOjJkOmU4OjMzOgorICAgICAgICA2NDpiZTo5YjphYTphZDo1ZjoxYjo0ZDpkNDo5OTo5NTphMjo4Yjo5YTpjOTo2Mjo3MjpiNToKKyAgICAgICAgNjk6ZWE6ZDk6NTg6YWI6MzU6ZWQ6MTU6YTI6NDM6ZDY6YjY6YmM6MDc6Nzk6NjU6NjQ6NzM6CisgICAgICAgIDdkOmQ3Ojc5OmNhOjdiOmQ1OjVhOjUxOmM2OmUxOjUzOjA0Ojk2OjhkOjM4OmNmOmEzOjE3OgorICAgICAgICBhYzozOTo3MTo2YjowMTpjMzo4Yjo1MzozYzo2MzplOTplZTo3OTpjMDplNDpiZTo5MjozMjoKKyAgICAgICAgNjQ6N2E6YjM6MWY6OTc6OTQ6NjI6YmQ6ZWE6YjI6MjA6MTU6OTU6ZmI6OTc6ZjI6Nzg6MmY6CisgICAgICAgIDYzOjM2OjQwOjM4OmUzOjQ2OjBmOjFkOmRkOmFjOjk1OmNhOmU3OjRiOjkwOjdiOmIxOjRiOgorICAgICAgICBhOTpkNDpjNTplYjo5YTpkYTphYTpkNTphMzo5NDoxNDo0Njo4ZDoyZDoxZjpmMzozYTpkNjoKKyAgICAgICAgOTM6M2E6ZjY6M2U6Nzk6ZmM6ZTg6ZTY6YjA6NzU6ZWQ6ZWU6M2Q6Yzk6NzA6Yzc6NWQ6YWE6CisgICAgICAgIDgxOjRiOjQ2OjI1OjFjOmM3OjZjOjE1OmUzOjk1OjRlOjBmOmFhOjMyOjM3Ojk0OjBhOjE3OgorICAgICAgICAyNDo5MjoxMzo4NDo1ODpkMjo2Mzo2ZjoyYjpmNzplNjo1Yjo2MjowYjoxMzoxNzpiMDowZDoKKyAgICAgICAgNTI6NGM6ZmU6ZmU6NmY6NWM6ZTI6OTE6NmU6MWQ6ZmQ6YTQ6NjI6ZDc6Njg6ZmE6OGU6N2E6CisgICAgICAgIDRmOmQyOjA4OmRhOjkzOmRjOmYwOjkyOjExOjdhOmQwOmRjOjcyOjkzOjBjOjczOjkzOjYyOgorICAgICAgICA4NTo2ODpkMDpmNAorCitEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4gR2xvYmFsIENBIDMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiA5MzpDMjo4RToxMTo3QjpENDpGMzowMzoxOTpCRDoyODo3NToxMzo0QTo0NTo0QQorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURLVENDQXBLZ0F3SUJBZ0lFTm03VHpqQU5CZ2txaGtpRzl3MEJBUVVGQURCR01Rc3dDUVlEVlFRR0V3SlYKK1V6RWtNQ0lHQTFVRUNoTWJSR2xuYVhSaGJDQlRhV2R1WVhSMWNtVWdWSEoxYzNRZ1EyOHVNUkV3RHdZRFZRUUwKK0V3aEVVMVJEUVNCRk1qQWVGdzA1T0RFeU1Ea3hPVEUzTWpaYUZ3MHhPREV5TURreE9UUTNNalphTUVZeEN6QUoKK0JnTlZCQVlUQWxWVE1TUXdJZ1lEVlFRS0V4dEVhV2RwZEdGc0lGTnBaMjVoZEhWeVpTQlVjblZ6ZENCRGJ5NHgKK0VUQVBCZ05WQkFzVENFUlRWRU5CSUVVeU1JR2RNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R0xBRENCaHdLQmdRQy8KK2s0OFhrdTh6RXhqckVIOU9Gci8vQm84cWhieGUrU1NtSklpMkE3ZkJ3MThEVzlGdnJuNUM2bVlqdUdPRFZ2c28KK0xlRTRpN1R1cUFIaHpoeTJpQ29pUm9YN242ZHdxVWNVUDg3ZVpmQ29jZmRQSm15TXZNYTE3OTVKSi85SUtuM28KK1RRUE14N0pTeGhjeEV6dTFUZHZJeFBiRER5UXEyZ3lkNTVGYmdNMlVuUUlCQTZPQ0FTUXdnZ0VnTUJFR0NXQ0cKK1NBR0crRUlCQVFRRUF3SUFCekJvQmdOVkhSOEVZVEJmTUYyZ1c2QlpwRmN3VlRFTE1Ba0dBMVVFQmhNQ1ZWTXgKK0pEQWlCZ05WQkFvVEcwUnBaMmwwWVd3Z1UybG5ibUYwZFhKbElGUnlkWE4wSUVOdkxqRVJNQThHQTFVRUN4TUkKK1JGTlVRMEVnUlRJeERUQUxCZ05WQkFNVEJFTlNUREV3S3dZRFZSMFFCQ1F3SW9BUE1UazVPREV5TURreE9URTMKK01qWmFnUTh5TURFNE1USXdPVEU1TVRjeU5sb3dDd1lEVlIwUEJBUURBZ0VHTUI4R0ExVWRJd1FZTUJhQUZCNkMKK1RTaGxnRHpKUVc2c05TNWF5OTd1K0RsYk1CMEdBMVVkRGdRV0JCUWVnazBvWllBOHlVRnVyRFV1V3N2ZTd2ZzUKK1d6QU1CZ05WSFJNRUJUQURBUUgvTUJrR0NTcUdTSWIyZlFkQkFBUU1NQW9iQkZZMExqQURBZ1NRTUEwR0NTcUcKK1NJYjNEUUVCQlFVQUE0R0JBRWVOZzYxaTh0dXdua1VpQmJtaTFnTU9PSExubnZ4NzVwTzJtcVdpbE1nMEhaSFIKK3hkZjBDaVVQUFhpQm5nK3haOFNRVEdQZFhxZml1cC8xOTAybE1YdWNLUzFNL21RKzdMWlQvdXFiN1lMYmRIVkwKK0IzbHVIdGdaZzNQZTlUN1F0ZDduUzJoOVF5NHFJT0Yrb0hoRW5najFtUG5IZnhzYjFnWWdBbGlodzZJRAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiA5MTMyMzI4NDYgKDB4MzY2ZWQzY2UpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9VVMsIE89RGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uLCBPVT1EU1RDQSBFMgorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogRGVjICA5IDE5OjE3OjI2IDE5OTggR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBEZWMgIDkgMTk6NDc6MjYgMjAxOCBHTVQKKyAgICAgICAgU3ViamVjdDogQz1VUywgTz1EaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4sIE9VPURTVENBIEUyCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpiZjo5Mzo4ZjoxNzo5MjplZjozMzoxMzoxODplYjoxMDo3Zjo0ZToxNjoKKyAgICAgICAgICAgICAgICAgICAgYmY6ZmY6MDY6OGY6MmE6ODU6YmM6NWU6Zjk6MjQ6YTY6MjQ6ODg6YjY6MDM6CisgICAgICAgICAgICAgICAgICAgIGI3OmMxOmMzOjVmOjAzOjViOmQxOjZmOmFlOjdlOjQyOmVhOjY2OjIzOmI4OgorICAgICAgICAgICAgICAgICAgICA2Mzo4Mzo1NjpmYjoyODoyZDplMTozODo4YjpiNDplZTphODowMTplMTpjZToKKyAgICAgICAgICAgICAgICAgICAgMWM6YjY6ODg6MmE6MjI6NDY6ODU6ZmI6OWY6YTc6NzA6YTk6NDc6MTQ6M2Y6CisgICAgICAgICAgICAgICAgICAgIGNlOmRlOjY1OmYwOmE4OjcxOmY3OjRmOjI2OjZjOjhjOmJjOmM2OmI1OmVmOgorICAgICAgICAgICAgICAgICAgICBkZTo0OToyNzpmZjo0ODoyYTo3ZDplODo0ZDowMzpjYzpjNzpiMjo1MjpjNjoKKyAgICAgICAgICAgICAgICAgICAgMTc6MzE6MTM6M2I6YjU6NGQ6ZGI6Yzg6YzQ6ZjY6YzM6MGY6MjQ6MmE6ZGE6CisgICAgICAgICAgICAgICAgICAgIDBjOjlkOmU3OjkxOjViOjgwOmNkOjk0OjlkCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDMgKDB4MykKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBOZXRzY2FwZSBDZXJ0IFR5cGU6IAorICAgICAgICAgICAgICAgIFNTTCBDQSwgUy9NSU1FIENBLCBPYmplY3QgU2lnbmluZyBDQQorICAgICAgICAgICAgWDUwOXYzIENSTCBEaXN0cmlidXRpb24gUG9pbnRzOiAKKyAgICAgICAgICAgICAgICBEaXJOYW1lOi9DPVVTL089RGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uL09VPURTVENBIEUyL0NOPUNSTDEKKworICAgICAgICAgICAgWDUwOXYzIFByaXZhdGUgS2V5IFVzYWdlIFBlcmlvZDogCisgICAgICAgICAgICAgICAgTm90IEJlZm9yZTogRGVjICA5IDE5OjE3OjI2IDE5OTggR01ULCBOb3QgQWZ0ZXI6IERlYyAgOSAxOToxNzoyNiAyMDE4IEdNVAorICAgICAgICAgICAgWDUwOXYzIEtleSBVc2FnZTogCisgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUgU2lnbiwgQ1JMIFNpZ24KKyAgICAgICAgICAgIFg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIGtleWlkOjFFOjgyOjREOjI4OjY1OjgwOjNDOkM5OjQxOjZFOkFDOjM1OjJFOjVBOkNCOkRFOkVFOkY4OjM5OjVCCisKKyAgICAgICAgICAgIFg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICAxRTo4Mjo0RDoyODo2NTo4MDozQzpDOTo0MTo2RTpBQzozNToyRTo1QTpDQjpERTpFRTpGODozOTo1QgorICAgICAgICAgICAgWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzOiAKKyAgICAgICAgICAgICAgICBDQTpUUlVFCisgICAgICAgICAgICAxLjIuODQwLjExMzUzMy43LjY1LjA6IAorICAgICAgICAgICAgICAgIDAKKy4uVjQuMC4uLi4KKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgNDc6OGQ6ODM6YWQ6NjI6ZjI6ZGI6YjA6OWU6NDU6MjI6MDU6Yjk6YTI6ZDY6MDM6MGU6Mzg6CisgICAgICAgIDcyOmU3OjllOmZjOjdiOmU2OjkzOmI2OjlhOmE1OmEyOjk0OmM4OjM0OjFkOjkxOmQxOmM1OgorICAgICAgICBkNzpmNDowYToyNTowZjozZDo3ODo4MTo5ZTowZjpiMTo2NzpjNDo5MDo0Yzo2MzpkZDo1ZToKKyAgICAgICAgYTc6ZTI6YmE6OWY6ZjU6Zjc6NGQ6YTU6MzE6N2I6OWM6Mjk6MmQ6NGM6ZmU6NjQ6M2U6ZWM6CisgICAgICAgIGI2OjUzOmZlOmVhOjliOmVkOjgyOmRiOjc0Ojc1OjRiOjA3Ojc5OjZlOjFlOmQ4OjE5OjgzOgorICAgICAgICA3MzpkZTpmNTozZTpkMDpiNTpkZTplNzo0Yjo2ODo3ZDo0MzoyZToyYToyMDplMTo3ZTphMDoKKyAgICAgICAgNzg6NDQ6OWU6MDg6ZjU6OTg6Zjk6Yzc6N2Y6MWI6MWI6ZDY6MDY6MjA6MDI6NTg6YTE6YzM6CisgICAgICAgIGEyOjAzCisKK0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLiBHbG9iYWwgQ0EgNAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IENEOjNCOjNEOjYyOjVCOjA5OkI4OjA5OjM2Ojg3OjlFOjEyOjJGOjcxOjY0OkJBCitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRDJEQ0NBc0FDRVFEUUhrQ0xBQUIzYlFBQUFBRUFBQUFFTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUdwTVFzdworQ1FZRFZRUUdFd0oxY3pFTk1Bc0dBMVVFQ0JNRVZYUmhhREVYTUJVR0ExVUVCeE1PVTJGc2RDQk1ZV3RsSUVOcAorZEhreEpEQWlCZ05WQkFvVEcwUnBaMmwwWVd3Z1UybG5ibUYwZFhKbElGUnlkWE4wSUVOdkxqRVJNQThHQTFVRQorQ3hNSVJGTlVRMEVnV0RJeEZqQVVCZ05WQkFNVERVUlRWQ0JTYjI5MFEwRWdXREl4SVRBZkJna3Foa2lHOXcwQgorQ1FFV0VtTmhRR1JwWjNOcFozUnlkWE4wTG1OdmJUQWVGdzA1T0RFeE16QXlNalEyTVRaYUZ3MHdPREV4TWpjeQorTWpRMk1UWmFNSUdwTVFzd0NRWURWUVFHRXdKMWN6RU5NQXNHQTFVRUNCTUVWWFJoYURFWE1CVUdBMVVFQnhNTworVTJGc2RDQk1ZV3RsSUVOcGRIa3hKREFpQmdOVkJBb1RHMFJwWjJsMFlXd2dVMmxuYm1GMGRYSmxJRlJ5ZFhOMAorSUVOdkxqRVJNQThHQTFVRUN4TUlSRk5VUTBFZ1dESXhGakFVQmdOVkJBTVREVVJUVkNCU2IyOTBRMEVnV0RJeAorSVRBZkJna3Foa2lHOXcwQkNRRVdFbU5oUUdScFozTnBaM1J5ZFhOMExtTnZiVENDQVNJd0RRWUpLb1pJaHZjTgorQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU54MThJekFkWmFhd0dJZkp2ZkU0WnJxNEZaelc1bk5BVVNvQ0xiVgorcDlvYUJCZzVra3A0bzRIQzlYZDZVTFJ3LzVxcnhzZktib05QUXBqN0pndmEzRzNXcVpsVlVtZnBLQU9TM09XdworQlpvUEZmbHJXWEpXOHZvNS9LcG83ZzhmRUlNdi9KMzZGNWJkZ3VQbVJYM0FTNEJFSCswczRJVDlrVnlTVkdrbAorNVdKcDNPWHVBRks5TXd1dGRRS0ZwMlJRTGNVWkdUREFKdHZKMC8wdW1hMVp0UXROMUVHdWhVaERXZHkzcU9LaQorM3NPUDE3aWhZcVpvVUZMa3p6R25sSVhhbjBZeUYxYmw4dXRtUFJML1E5dVk3M2ZQeTRHTk5MSEdVRW9tMGVRKworUVZDdmJLNGlOQzdWYTI2RHVubTRkbVZJMmdrcFpHTWl1ZnRIZG9XTWhrVExDZHNDQXdFQUFUQU5CZ2txaGtpRworOXcwQkFRVUZBQU9DQVFFQXRUWU9YZUZoS0ZvUlpjQS9nd041VGI0b3Bnc0hBbEtGemZpUjBCQnN0V29nV3h5UQorMlRBOHhraWVpbDVrK2FGeGQrOEVKeDhINitRbTkzTjB5VVFZR21iVDRFT3ZrVHZSeXl6WWRGUTZIRTNLMUdqTgorSTN3ZEVKNUY2ZllBYnFiTkdmOVBMQ21QVjAzRWQ1Sys0RXdKKzExRWhtWWhxTGt5b2xiVjZZeURmRmsveFBFTAorNTUzc25yMmNHQTQrd2psNUtMY0REUWpMeHVmWkFUZFFFT3pNWVJaQTFLOHhkSHY4UHpHbjBFZHpNemtiekU1cQorMTBtREVRYis2NEpZTXpKTThGYXNIcHd2VnBwN3dVb2NwZjFWTnM3OGxrMzBzUERzdDJ5QzdTOHhtVUpNcWJJTgordUJWZDhkKzZ5YlZLMUdTWXN5YXBNTWo5cHV5cmxpR3RmOEo0dGc9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMSAoMHgwKQorICAgICAgICBTZXJpYWwgTnVtYmVyOgorICAgICAgICAgICAgZDA6MWU6NDA6OGI6MDA6MDA6Nzc6NmQ6MDA6MDA6MDA6MDE6MDA6MDA6MDA6MDQKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz11cywgU1Q9VXRhaCwgTD1TYWx0IExha2UgQ2l0eSwgTz1EaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4sIE9VPURTVENBIFgyLCBDTj1EU1QgUm9vdENBIFgyL0VtYWlsPWNhQGRpZ3NpZ3RydXN0LmNvbQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogTm92IDMwIDIyOjQ2OjE2IDE5OTggR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBOb3YgMjcgMjI6NDY6MTYgMjAwOCBHTVQKKyAgICAgICAgU3ViamVjdDogQz11cywgU1Q9VXRhaCwgTD1TYWx0IExha2UgQ2l0eSwgTz1EaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4sIE9VPURTVENBIFgyLCBDTj1EU1QgUm9vdENBIFgyL0VtYWlsPWNhQGRpZ3NpZ3RydXN0LmNvbQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDIwNDggYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDIwNDggYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6ZGM6NzU6ZjA6OGM6YzA6NzU6OTY6OWE6YzA6NjI6MWY6MjY6Zjc6YzQ6CisgICAgICAgICAgICAgICAgICAgIGUxOjlhOmVhOmUwOjU2OjczOjViOjk5OmNkOjAxOjQ0OmE4OjA4OmI2OmQ1OgorICAgICAgICAgICAgICAgICAgICBhNzpkYToxYTowNDoxODozOTo5Mjo0YTo3ODphMzo4MTpjMjpmNTo3Nzo3YToKKyAgICAgICAgICAgICAgICAgICAgNTA6YjQ6NzA6ZmY6OWE6YWI6YzY6Yzc6Y2E6NmU6ODM6NGY6NDI6OTg6ZmI6CisgICAgICAgICAgICAgICAgICAgIDI2OjBiOmRhOmRjOjZkOmQ2OmE5Ojk5OjU1OjUyOjY3OmU5OjI4OjAzOjkyOgorICAgICAgICAgICAgICAgICAgICBkYzplNTpiMDowNTo5YTowZjoxNTpmOTo2Yjo1OTo3Mjo1NjpmMjpmYTozOToKKyAgICAgICAgICAgICAgICAgICAgZmM6YWE6Njg6ZWU6MGY6MWY6MTA6ODM6MmY6ZmM6OWQ6ZmE6MTc6OTY6ZGQ6CisgICAgICAgICAgICAgICAgICAgIDgyOmUzOmU2OjQ1OjdkOmMwOjRiOjgwOjQ0OjFmOmVkOjJjOmUwOjg0OmZkOgorICAgICAgICAgICAgICAgICAgICA5MTo1Yzo5Mjo1NDo2OToyNTplNTo2Mjo2OTpkYzplNTplZTowMDo1MjpiZDoKKyAgICAgICAgICAgICAgICAgICAgMzM6MGI6YWQ6NzU6MDI6ODU6YTc6NjQ6NTA6MmQ6YzU6MTk6MTk6MzA6YzA6CisgICAgICAgICAgICAgICAgICAgIDI2OmRiOmM5OmQzOmZkOjJlOjk5OmFkOjU5OmI1OjBiOjRkOmQ0OjQxOmFlOgorICAgICAgICAgICAgICAgICAgICA4NTo0ODo0Mzo1OTpkYzpiNzphODplMjphMjpkZTpjMzo4ZjpkNzpiODphMToKKyAgICAgICAgICAgICAgICAgICAgNjI6YTY6Njg6NTA6NTI6ZTQ6Y2Y6MzE6YTc6OTQ6ODU6ZGE6OWY6NDY6MzI6CisgICAgICAgICAgICAgICAgICAgIDE3OjU2OmU1OmYyOmViOjY2OjNkOjEyOmZmOjQzOmRiOjk4OmVmOjc3OmNmOgorICAgICAgICAgICAgICAgICAgICBjYjo4MTo4ZDozNDpiMTpjNjo1MDo0YToyNjpkMTplNDozZTo0MTo1MDphZjoKKyAgICAgICAgICAgICAgICAgICAgNmM6YWU6MjI6MzQ6MmU6ZDU6NmI6NmU6ODM6YmE6Nzk6Yjg6NzY6NjU6NDg6CisgICAgICAgICAgICAgICAgICAgIGRhOjA5OjI5OjY0OjYzOjIyOmI5OmZiOjQ3Ojc2Ojg1OjhjOjg2OjQ0OmNiOgorICAgICAgICAgICAgICAgICAgICAwOTpkYgorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgYjU6MzY6MGU6NWQ6ZTE6NjE6Mjg6NWE6MTE6NjU6YzA6M2Y6ODM6MDM6Nzk6NGQ6YmU6Mjg6CisgICAgICAgIGE2OjBiOjA3OjAyOjUyOjg1OmNkOmY4OjkxOmQwOjEwOjZjOmI1OjZhOjIwOjViOjFjOjkwOgorICAgICAgICBkOTozMDozYzpjNjo0ODo5ZTo4YTo1ZTo2NDpmOTphMTo3MTo3NzplZjowNDoyNzoxZjowNzoKKyAgICAgICAgZWI6ZTQ6MjY6Zjc6NzM6NzQ6Yzk6NDQ6MTg6MWE6NjY6ZDM6ZTA6NDM6YWY6OTE6M2I6ZDE6CisgICAgICAgIGNiOjJjOmQ4Ojc0OjU0OjNhOjFjOjRkOmNhOmQ0OjY4OmNkOjIzOjdjOjFkOjEwOjllOjQ1OgorICAgICAgICBlOTpmNjowMDo2ZTphNjpjZDoxOTpmZjo0ZjoyYzoyOTo4Zjo1Nzo0ZDpjNDo3Nzo5MjpiZToKKyAgICAgICAgZTA6NGM6MDk6ZmI6NWQ6NDQ6ODY6NjY6MjE6YTg6Yjk6MzI6YTI6NTY6ZDU6ZTk6OGM6ODM6CisgICAgICAgIDdjOjU5OjNmOmM0OmYxOjBiOmU3OjlkOmVjOjllOmJkOjljOjE4OjBlOjNlOmMyOjM5Ojc5OgorICAgICAgICAyODpiNzowMzowZDowODpjYjpjNjplNzpkOTowMTozNzo1MDoxMDplYzpjYzo2MToxNjo0MDoKKyAgICAgICAgZDQ6YWY6MzE6NzQ6N2I6ZmM6M2Y6MzE6YTc6ZDA6NDc6NzM6MzM6Mzk6MWI6Y2M6NGU6NmE6CisgICAgICAgIGQ3OjQ5OjgzOjExOjA2OmZlOmViOjgyOjU4OjMzOjMyOjRjOmYwOjU2OmFjOjFlOjljOjJmOgorICAgICAgICA1Njo5YTo3YjpjMTo0YToxYzphNTpmZDo1NTozNjpjZTpmYzo5Njo0ZDpmNDpiMDpmMDplYzoKKyAgICAgICAgYjc6NmM6ODI6ZWQ6MmY6MzE6OTk6NDI6NGM6YTk6YjI6MGQ6Yjg6MTU6NWQ6ZjE6ZGY6YmE6CisgICAgICAgIGM5OmI1OjRhOmQ0OjY0Ojk4OmIzOjI2OmE5OjMwOmM4OmZkOmE2OmVjOmFiOjk2OjIxOmFkOgorICAgICAgICA3ZjpjMjo3ODpiNgorCitFbnRydXN0IFdvcmxkd2lkZSBieSBEU1QKKz09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiBCNDo2NToyMjowQTo3QzpBRDpERjo0MTpCNzpENTo0NDpENTpBRDpGQTo5QTo3NQorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURSekNDQXJDZ0F3SUJBZ0lFTm0zRkdEQU5CZ2txaGtpRzl3MEJBUVVGQURCUU1Rc3dDUVlEVlFRR0V3SlYKK1V6RWtNQ0lHQTFVRUNoTWJSR2xuYVhSaGJDQlRhV2R1WVhSMWNtVWdWSEoxYzNRZ1EyOHVNUnN3R1FZRFZRUUwKK0V4SkVVMVF0Ulc1MGNuVnpkQ0JIVkVrZ1EwRXdIaGNOT1RneE1qQTVNREF3TWpJMFdoY05NVGd4TWpBNU1EQXoKK01qSTBXakJRTVFzd0NRWURWUVFHRXdKVlV6RWtNQ0lHQTFVRUNoTWJSR2xuYVhSaGJDQlRhV2R1WVhSMWNtVWcKK1ZISjFjM1FnUTI4dU1Sc3dHUVlEVlFRTEV4SkVVMVF0Ulc1MGNuVnpkQ0JIVkVrZ1EwRXdnWjB3RFFZSktvWkkKK2h2Y05BUUVCQlFBRGdZc0FNSUdIQW9HQkFMWWQ5MHVORHhQakV2VUovZ1l5RHE5TVFmVjkxRWM5S2dyZmd3WGUKKzNuM21BeGIyVVRyTFJ4cEtyWDdFL1IyMHZuU0tlTjBMZzQ2MGhCUEUrL2h0S2E2aDRROFBRK08xWG1CcCtvT1UKKy9Ibm0zSGJ0MFVRcmp2MFN1LzRYZHhjTWllMm43MUY5eE8wNHd6dWpldnZpVGFCZ3RmTDlFMlhUeHV3L3ZqV2MKK1BTTHZBZ0VEbzRJQkxqQ0NBU293RVFZSllJWklBWWI0UWdFQkJBUURBZ0FITUhJR0ExVWRId1JyTUdrd1o2QmwKK29HT2tZVEJmTVFzd0NRWURWUVFHRXdKVlV6RWtNQ0lHQTFVRUNoTWJSR2xuYVhSaGJDQlRhV2R1WVhSMWNtVWcKK1ZISjFjM1FnUTI4dU1Sc3dHUVlEVlFRTEV4SkVVMVF0Ulc1MGNuVnpkQ0JIVkVrZ1EwRXhEVEFMQmdOVkJBTVQKK0JFTlNUREV3S3dZRFZSMFFCQ1F3SW9BUE1UazVPREV5TURrd01EQXlNalJhZ1E4eU1ERTRNVEl3T1RBd01ESXkKK05Gb3dDd1lEVlIwUEJBUURBZ0VHTUI4R0ExVWRJd1FZTUJhQUZKT2FSTXJRZUZPQUtVa0UzOGV2TXorWmRWK3UKK01CMEdBMVVkRGdRV0JCU1Rta1RLMEhoVGdDbEpCTi9IcnpNL21YVmZyakFNQmdOVkhSTUVCVEFEQVFIL01Ca0cKK0NTcUdTSWIyZlFkQkFBUU1NQW9iQkZZMExqQURBZ1NRTUEwR0NTcUdTSWIzRFFFQkJRVUFBNEdCQUdTSnpBT24KKzNBcnlXQ0RuL1JlZ0tITE5oN0RObUxVa1IyTXpNUkFRc3UrS1YzS3VUQVBnWjUrc1lFT0VJc0dwbytXeHA5NEoKKzFNOE5lRVlqVzQ5SmUvNFRJcGVVNm5KSTRTd2dlSmJwWmtVWnl3bGxZMkUvMFVtWXNYWVFWZFZqU21aTHBBZHIKKzNudC91ZWFUV3hvQ1c0QU8zWTBZMUlxandtanhvK0FZMFU1TQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiA5MTMxNjM1NDQgKDB4MzY2ZGM1MTgpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9VVMsIE89RGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uLCBPVT1EU1QtRW50cnVzdCBHVEkgQ0EKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IERlYyAgOSAwMDowMjoyNCAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogRGVjICA5IDAwOjMyOjI0IDIwMTggR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89RGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uLCBPVT1EU1QtRW50cnVzdCBHVEkgQ0EKKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgxMDI0IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgxMDI0IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmI2OjFkOmY3OjRiOjhkOjBmOjEzOmUzOjEyOmY1OjA5OmZlOjA2OjMyOgorICAgICAgICAgICAgICAgICAgICAwZTphZjo0Yzo0MTpmNTo3ZDpkNDo0NzozZDoyYTowYTpkZjo4MzowNTpkZToKKyAgICAgICAgICAgICAgICAgICAgZGU6N2Q6ZTY6MDM6MTY6ZjY6NTE6M2E6Y2I6NDc6MWE6NGE6YWQ6N2U6YzQ6CisgICAgICAgICAgICAgICAgICAgIGZkOjFkOmI0OmJlOjc0OjhhOjc4OmRkOjBiOjgzOjhlOmI0Ojg0OjEzOmM0OgorICAgICAgICAgICAgICAgICAgICBmYjpmODo2ZDoyOTphZTphMTplMTowZjowZjo0MzplMzpiNTo1ZTo2MDo2OToKKyAgICAgICAgICAgICAgICAgICAgZmE6ODM6OTQ6ZmM6Nzk6ZTY6ZGM6NzY6ZWQ6ZDE6NDQ6MmI6OGU6ZmQ6MTI6CisgICAgICAgICAgICAgICAgICAgIGJiOmZlOjE3Ojc3OjE3OjBjOjg5OmVkOmE3OmVmOjUxOjdkOmM0OmVkOjM4OgorICAgICAgICAgICAgICAgICAgICBjMzozYjphMzo3YTpmYjplMjo0ZDphMDo2MDpiNTpmMjpmZDoxMzo2NTpkMzoKKyAgICAgICAgICAgICAgICAgICAgYzY6ZWM6M2Y6YmU6MzU6OWM6M2Q6MjI6ZWYKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogMyAoMHgzKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIE5ldHNjYXBlIENlcnQgVHlwZTogCisgICAgICAgICAgICAgICAgU1NMIENBLCBTL01JTUUgQ0EsIE9iamVjdCBTaWduaW5nIENBCisgICAgICAgICAgICBYNTA5djMgQ1JMIERpc3RyaWJ1dGlvbiBQb2ludHM6IAorICAgICAgICAgICAgICAgIERpck5hbWU6L0M9VVMvTz1EaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4vT1U9RFNULUVudHJ1c3QgR1RJIENBL0NOPUNSTDEKKworICAgICAgICAgICAgWDUwOXYzIFByaXZhdGUgS2V5IFVzYWdlIFBlcmlvZDogCisgICAgICAgICAgICAgICAgTm90IEJlZm9yZTogRGVjICA5IDAwOjAyOjI0IDE5OTggR01ULCBOb3QgQWZ0ZXI6IERlYyAgOSAwMDowMjoyNCAyMDE4IEdNVAorICAgICAgICAgICAgWDUwOXYzIEtleSBVc2FnZTogCisgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUgU2lnbiwgQ1JMIFNpZ24KKyAgICAgICAgICAgIFg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIGtleWlkOjkzOjlBOjQ0OkNBOkQwOjc4OjUzOjgwOjI5OjQ5OjA0OkRGOkM3OkFGOjMzOjNGOjk5Ojc1OjVGOkFFCisKKyAgICAgICAgICAgIFg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICA5Mzo5QTo0NDpDQTpEMDo3ODo1Mzo4MDoyOTo0OTowNDpERjpDNzpBRjozMzozRjo5OTo3NTo1RjpBRQorICAgICAgICAgICAgWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzOiAKKyAgICAgICAgICAgICAgICBDQTpUUlVFCisgICAgICAgICAgICAxLjIuODQwLjExMzUzMy43LjY1LjA6IAorICAgICAgICAgICAgICAgIDAKKy4uVjQuMC4uLi4KKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgNjQ6ODk6Y2M6MDM6YTc6ZGM6MGE6ZjI6NTg6MjA6ZTc6ZmQ6MTc6YTA6Mjg6NzI6Y2Q6ODc6CisgICAgICAgIGIwOmNkOjk4OmI1OjI0OjQ3OjYzOjMzOjMxOjEwOjEwOmIyOmVmOjhhOjU3OjcyOmFlOjRjOgorICAgICAgICAwMzplMDo2Nzo5ZjphYzo2MDo0Mzo4NDoyMjpjMTphOTphMzplNTpiMTphNzpkZTowOTpkNDoKKyAgICAgICAgY2Y6MGQ6Nzg6NDY6MjM6NWI6OGY6NDk6N2I6ZmU6MTM6MjI6OTc6OTQ6ZWE6NzI6NDg6ZTE6CisgICAgICAgIDJjOjIwOjc4Ojk2OmU5OjY2OjQ1OjE5OmNiOjA5OjY1OjYzOjYxOjNmOmQxOjQ5Ojk4OmIxOgorICAgICAgICA3NjoxMDo1NTpkNTo2Mzo0YTo2Njo0YjphNDowNzo2YjpkZTo3Yjo3ZjpiOTplNjo5Mzo1YjoKKyAgICAgICAgMWE6MDI6NWI6ODA6MGU6ZGQ6OGQ6MTg6ZDQ6OGE6YTM6YzI6Njg6ZjE6YTM6ZTA6MTg6ZDE6CisgICAgICAgIDRlOjRjCisKK0VudHJ1c3QubmV0IFByZW1pdW0gMjA0OCBTZWN1cmUgU2VydmVyIENBCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiBCQToyMTpFQToyMDpENjpERDpEQjo4RjpDMTo1Nzo4Qjo0MDpBRDpBMTpGQzpGQworUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVYRENDQTBTZ0F3SUJBZ0lFT0dPNVpqQU5CZ2txaGtpRzl3MEJBUVVGQURDQnRERVVNQklHQTFVRUNoTUwKK1JXNTBjblZ6ZEM1dVpYUXhRREErQmdOVkJBc1VOM2QzZHk1bGJuUnlkWE4wTG01bGRDOURVRk5mTWpBME9DQnAKK2JtTnZjbkF1SUdKNUlISmxaaTRnS0d4cGJXbDBjeUJzYVdGaUxpa3hKVEFqQmdOVkJBc1RIQ2hqS1NBeE9UazUKK0lFVnVkSEoxYzNRdWJtVjBJRXhwYldsMFpXUXhNekF4QmdOVkJBTVRLa1Z1ZEhKMWMzUXVibVYwSUVObGNuUnAKK1ptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlDZ3lNRFE0S1RBZUZ3MDVPVEV5TWpReE56VXdOVEZhRncweE9URXkKK01qUXhPREl3TlRGYU1JRzBNUlF3RWdZRFZRUUtFd3RGYm5SeWRYTjBMbTVsZERGQU1ENEdBMVVFQ3hRM2QzZDMKK0xtVnVkSEoxYzNRdWJtVjBMME5RVTE4eU1EUTRJR2x1WTI5eWNDNGdZbmtnY21WbUxpQW9iR2x0YVhSeklHeHAKK1lXSXVLVEVsTUNNR0ExVUVDeE1jS0dNcElERTVPVGtnUlc1MGNuVnpkQzV1WlhRZ1RHbHRhWFJsWkRFek1ERUcKK0ExVUVBeE1xUlc1MGNuVnpkQzV1WlhRZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGtnS0RJd05EZ3AKK01JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBclUxTHFSS0dzdXFqSUFjVkZtUXEKK0swdlJ2d3RLVFk3dGdIYWxaN2Q0UU1CelFzaG93TnRUSzkxZXVIYVlOWk9MR3AxOEV6b09IMXUzSHMvbEpCUWUKK3NZR3BqWDI0ekd0TEEvRUNETnlycFVBa0FIOTBsS0dkQ0NtemlBdjFoM2VkVmMza3czN1hhbVNyaFJTR2xWdVgKK01sQnZQY2k2Wmd6ai9MMjRTY0YyaVVrWi9jQ292WW1qWnkvR243eHhHV0M0TGVrc3laQjJabnVVNHE5NDFtVlQKK1hUelduTExQS1FQNUw2UlFzdFJJemdVeVZZcjlzbVJNRHVTWUIzWGJmOSs1Q0ZWZ2hUQXArWHRJcEdtRzR6VS8KK0hvWmRlbm9WdmU4QWpoVWlWQmNBa0NhVHZBNUphSkcvK0VmVG5aVkN3UTVOMzI4bXo4TVlJV0ptUTNEVzFjQUgKKzRRSURBUUFCbzNRd2NqQVJCZ2xnaGtnQmh2aENBUUVFQkFNQ0FBY3dId1lEVlIwakJCZ3dGb0FVVmVTQjBSR0EKK3Z0aUp1UWlqTWZtaEpBa1d1WEF3SFFZRFZSME9CQllFRkZYa2dkRVJnTDdZaWJrSW96SDVvU1FKRnJsd01CMEcKK0NTcUdTSWIyZlFkQkFBUVFNQTRiQ0ZZMUxqQTZOQzR3QXdJRWtEQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUEKK1dVZXNJWVNLRjhtY2lWTWV1b0NGR3NZOFRqNnhuTFo4eHBKZEdHUUM0OU1HQ0JGaGZHUGpLNTB4QTNCMjBxTW8KK29QUzdtbU56N1czbEt0dnRGS2tyeGpZUjBDdnJCNHVsMnA1Y0daMVdFdlZVS2NnRjdiSVNLbzMwQXh2LzU1SVEKK2g3QTZ0Y09kQlRjU284ZjBGYm5WcERrV20xTTZJNUh4cUlLaWFvaG93WGtDSXJ5cXB0YXUzN0FVWDdpSDBOMTgKK2Yzdi9yeHpQNXRzSHJWN2JoWjNRS3cwejJ3VFI1a2xBRXl0Mit6N3BuSWtQRmM0WXNJVjRJVTlyVHc3Nk5tZk4KK0IvTC9DTkRpM3RtL0txKzRoNFloUEFUS3Q1Um9mODg4NlpqWE9QL3N3TmxROEM1TFdLNUdiOUF1dzJEYWNsVnkKK3ZVeEZubUc2djRTQmtnUFIwbWw4eFE9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiA5NDYwNTk2MjIgKDB4Mzg2M2I5NjYpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IE89RW50cnVzdC5uZXQsIE9VPXd3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLiksIE9VPShjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQsIENOPUVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogRGVjIDI0IDE3OjUwOjUxIDE5OTkgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBEZWMgMjQgMTg6MjA6NTEgMjAxOSBHTVQKKyAgICAgICAgU3ViamVjdDogTz1FbnRydXN0Lm5ldCwgT1U9d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKSwgT1U9KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZCwgQ049RW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMjA0OCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMjA0OCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDphZDo0ZDo0YjphOToxMjo4NjpiMjplYTphMzoyMDowNzoxNToxNjo2NDoKKyAgICAgICAgICAgICAgICAgICAgMmE6MmI6NGI6ZDE6YmY6MGI6NGE6NGQ6OGU6ZWQ6ODA6NzY6YTU6Njc6Yjc6CisgICAgICAgICAgICAgICAgICAgIDc4OjQwOmMwOjczOjQyOmM4OjY4OmMwOmRiOjUzOjJiOmRkOjVlOmI4Ojc2OgorICAgICAgICAgICAgICAgICAgICA5ODozNTo5Mzo4YjoxYTo5ZDo3YzoxMzozYTowZToxZjo1YjpiNzoxZTpjZjoKKyAgICAgICAgICAgICAgICAgICAgZTU6MjQ6MTQ6MWU6YjE6ODE6YTk6OGQ6N2Q6Yjg6Y2M6NmI6NGI6MDM6ZjE6CisgICAgICAgICAgICAgICAgICAgIDAyOjBjOmRjOmFiOmE1OjQwOjI0OjAwOjdmOjc0Ojk0OmExOjlkOjA4OjI5OgorICAgICAgICAgICAgICAgICAgICBiMzo4ODowYjpmNTo4Nzo3Nzo5ZDo1NTpjZDplNDpjMzo3ZTpkNzo2YTo2NDoKKyAgICAgICAgICAgICAgICAgICAgYWI6ODU6MTQ6ODY6OTU6NWI6OTc6MzI6NTA6NmY6M2Q6Yzg6YmE6NjY6MGM6CisgICAgICAgICAgICAgICAgICAgIGUzOmZjOmJkOmI4OjQ5OmMxOjc2Ojg5OjQ5OjE5OmZkOmMwOmE4OmJkOjg5OgorICAgICAgICAgICAgICAgICAgICBhMzo2NzoyZjpjNjo5ZjpiYzo3MToxOTo2MDpiODoyZDplOToyYzpjOTo5MDoKKyAgICAgICAgICAgICAgICAgICAgNzY6NjY6N2I6OTQ6ZTI6YWY6Nzg6ZDY6NjU6NTM6NWQ6M2M6ZDY6OWM6YjI6CisgICAgICAgICAgICAgICAgICAgIGNmOjI5OjAzOmY5OjJmOmE0OjUwOmIyOmQ0OjQ4OmNlOjA1OjMyOjU1OjhhOgorICAgICAgICAgICAgICAgICAgICBmZDpiMjo2NDo0YzowZTplNDo5ODowNzo3NTpkYjo3ZjpkZjpiOTowODo1NToKKyAgICAgICAgICAgICAgICAgICAgNjA6ODU6MzA6Mjk6Zjk6N2I6NDg6YTQ6Njk6ODY6ZTM6MzU6M2Y6MWU6ODY6CisgICAgICAgICAgICAgICAgICAgIDVkOjdhOjdhOjE1OmJkOmVmOjAwOjhlOjE1OjIyOjU0OjE3OjAwOjkwOjI2OgorICAgICAgICAgICAgICAgICAgICA5MzpiYzowZTo0OTo2ODo5MTpiZjpmODo0NzpkMzo5ZDo5NTo0MjpjMTowZToKKyAgICAgICAgICAgICAgICAgICAgNGQ6ZGY6NmY6MjY6Y2Y6YzM6MTg6MjE6NjI6NjY6NDM6NzA6ZDY6ZDU6YzA6CisgICAgICAgICAgICAgICAgICAgIDA3OmUxCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIE5ldHNjYXBlIENlcnQgVHlwZTogCisgICAgICAgICAgICAgICAgU1NMIENBLCBTL01JTUUgQ0EsIE9iamVjdCBTaWduaW5nIENBCisgICAgICAgICAgICBYNTA5djMgQXV0aG9yaXR5IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICBrZXlpZDo1NTpFNDo4MTpEMToxMTo4MDpCRTpEODo4OTpCOTowODpBMzozMTpGOTpBMToyNDowOToxNjpCOTo3MAorCisgICAgICAgICAgICBYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAgNTU6RTQ6ODE6RDE6MTE6ODA6QkU6RDg6ODk6Qjk6MDg6QTM6MzE6Rjk6QTE6MjQ6MDk6MTY6Qjk6NzAKKyAgICAgICAgICAgIDEuMi44NDAuMTEzNTMzLjcuNjUuMDogCisgICAgICAgICAgICAgICAgMC4uLlY1LjA6NC4wLi4uLgorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA1OTo0NzphYzoyMTo4NDo4YToxNzpjOTo5Yzo4OTo1MzoxZTpiYTo4MDo4NToxYTpjNjozYzoKKyAgICAgICAgNGU6M2U6YjE6OWM6YjY6N2M6YzY6OTI6NWQ6MTg6NjQ6MDI6ZTM6ZDM6MDY6MDg6MTE6NjE6CisgICAgICAgIDdjOjYzOmUzOjJiOjlkOjMxOjAzOjcwOjc2OmQyOmEzOjI4OmEwOmY0OmJiOjlhOjYzOjczOgorICAgICAgICBlZDo2ZDplNToyYTpkYjplZDoxNDphOToyYjpjNjozNjoxMTpkMDoyYjplYjowNzo4YjphNToKKyAgICAgICAgZGE6OWU6NWM6MTk6OWQ6NTY6MTI6ZjU6NTQ6Mjk6Yzg6MDU6ZWQ6YjI6MTI6MmE6OGQ6ZjQ6CisgICAgICAgIDAzOjFiOmZmOmU3OjkyOjEwOjg3OmIwOjNhOmI1OmMzOjlkOjA1OjM3OjEyOmEzOmM3OmY0OgorICAgICAgICAxNTpiOTpkNTphNDozOToxNjo5Yjo1MzozYToyMzo5MTpmMTphODo4MjphMjo2YTo4ODo2ODoKKyAgICAgICAgYzE6Nzk6MDI6MjI6YmM6YWE6YTY6ZDY6YWU6ZGY6YjA6MTQ6NWY6Yjg6ODc6ZDA6ZGQ6N2M6CisgICAgICAgIDdmOjdiOmZmOmFmOjFjOmNmOmU2OmRiOjA3OmFkOjVlOmRiOjg1OjlkOmQwOjJiOjBkOjMzOgorICAgICAgICBkYjowNDpkMTplNjo0OTo0MDoxMzoyYjo3NjpmYjozZTplOTo5Yzo4OTowZjoxNTpjZToxODoKKyAgICAgICAgYjA6ODU6Nzg6MjE6NGY6NmI6NGY6MGU6ZmE6MzY6Njc6Y2Q6MDc6ZjI6ZmY6MDg6ZDA6ZTI6CisgICAgICAgIGRlOmQ5OmJmOjJhOmFmOmI4Ojg3Ojg2OjIxOjNjOjA0OmNhOmI3Ojk0OjY4OjdmOmNmOjNjOgorICAgICAgICBlOTo5ODpkNzozODpmZjplYzpjMDpkOTo1MDpmMDoyZTo0Yjo1ODphZTo0Njo2ZjpkMDoyZToKKyAgICAgICAgYzM6NjA6ZGE6NzI6NTU6NzI6YmQ6NGM6NDU6OWU6NjE6YmE6YmY6ODQ6ODE6OTI6MDM6ZDE6CisgICAgICAgIGQyOjY5OjdjOmM1CisKK0VudHJ1c3QubmV0IFNlY3VyZSBQZXJzb25hbCBDQQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IDBDOjQxOjJGOjEzOjVCOkEwOjU0OkY1Ojk2OjY2OjJEOjdFOkNEOjBFOjAzOkY0CitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRTdUQ0NCRmFnQXdJQkFnSUVPQU9SN2pBTkJna3Foa2lHOXcwQkFRUUZBRENCeVRFTE1Ba0dBMVVFQmhNQworVlZNeEZEQVNCZ05WQkFvVEMwVnVkSEoxYzNRdWJtVjBNVWd3UmdZRFZRUUxGRDkzZDNjdVpXNTBjblZ6ZEM1dQorWlhRdlEyeHBaVzUwWDBOQlgwbHVabTh2UTFCVElHbHVZMjl5Y0M0Z1lua2djbVZtTGlCc2FXMXBkSE1nYkdsaAorWWk0eEpUQWpCZ05WQkFzVEhDaGpLU0F4T1RrNUlFVnVkSEoxYzNRdWJtVjBJRXhwYldsMFpXUXhNekF4QmdOVgorQkFNVEtrVnVkSEoxYzNRdWJtVjBJRU5zYVdWdWRDQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRBZQorRncwNU9URXdNVEl4T1RJME16QmFGdzB4T1RFd01USXhPVFUwTXpCYU1JSEpNUXN3Q1FZRFZRUUdFd0pWVXpFVQorTUJJR0ExVUVDaE1MUlc1MGNuVnpkQzV1WlhReFNEQkdCZ05WQkFzVVAzZDNkeTVsYm5SeWRYTjBMbTVsZEM5RAorYkdsbGJuUmZRMEZmU1c1bWJ5OURVRk1nYVc1amIzSndMaUJpZVNCeVpXWXVJR3hwYldsMGN5QnNhV0ZpTGpFbAorTUNNR0ExVUVDeE1jS0dNcElERTVPVGtnUlc1MGNuVnpkQzV1WlhRZ1RHbHRhWFJsWkRFek1ERUdBMVVFQXhNcQorUlc1MGNuVnpkQzV1WlhRZ1EyeHBaVzUwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNSUdkTUEwRworQ1NxR1NJYjNEUUVCQVFVQUE0R0xBRENCaHdLQmdRRElPcGxlTVJmZnJDZHZrSHZrR2Y5Rm96VEMyOEdvVC9CbworNm9UOW4zVjV6OEdLVVpTdngxY0RSMlNlcllJYld0cC9OM2hIdXplWUVwYk94aE45NzlJTU1GR3BPWjVWK1B1eAorNXpEZWc3SzZQdkhWaVRzN2hicXFkQ3orUHpGdXI1R1ZiZ2JVQjAxTExGWkhHQVJTMmc0UWs3OWprSnZoMzR6bQorQXFUbVQxNzNpd0lCQTZPQ0FlQXdnZ0hjTUJFR0NXQ0dTQUdHK0VJQkFRUUVBd0lBQnpDQ0FTSUdBMVVkSHdTQworQVJrd2dnRVZNSUhrb0lIaG9JSGVwSUhiTUlIWU1Rc3dDUVlEVlFRR0V3SlZVekVVTUJJR0ExVUVDaE1MUlc1MAorY25WemRDNXVaWFF4U0RCR0JnTlZCQXNVUDNkM2R5NWxiblJ5ZFhOMExtNWxkQzlEYkdsbGJuUmZRMEZmU1c1bQorYnk5RFVGTWdhVzVqYjNKd0xpQmllU0J5WldZdUlHeHBiV2wwY3lCc2FXRmlMakVsTUNNR0ExVUVDeE1jS0dNcAorSURFNU9Ua2dSVzUwY25WemRDNXVaWFFnVEdsdGFYUmxaREV6TURFR0ExVUVBeE1xUlc1MGNuVnpkQzV1WlhRZworUTJ4cFpXNTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1RMHdDd1lEVlFRREV3UkRVa3d4TUN5ZworS3FBb2hpWm9kSFJ3T2k4dmQzZDNMbVZ1ZEhKMWMzUXVibVYwTDBOU1RDOURiR2xsYm5ReExtTnliREFyQmdOVgorSFJBRUpEQWlnQTh4T1RrNU1UQXhNakU1TWpRek1GcUJEekl3TVRreE1ERXlNVGt5TkRNd1dqQUxCZ05WSFE4RQorQkFNQ0FRWXdId1lEVlIwakJCZ3dGb0FVeFB1Y0tYdVh6VXlXL081YnM4cVpkSXVWNmt3d0hRWURWUjBPQkJZRQorRk1UN25DbDdsODFNbHZ6dVc3UEttWFNMbGVwTU1Bd0dBMVVkRXdRRk1BTUJBZjh3R1FZSktvWklodlo5QjBFQQorQkF3d0Noc0VWalF1TUFNQ0JKQXdEUVlKS29aSWh2Y05BUUVFQlFBRGdZRUFQNjZLOGRkbUF3V2VQdnJxSEVhNworcEZ1UGVKb1NTSm41OURYZUREWUhBbXNRT29rVWdad3hwbnl5UWJKcTV3Y0JvVXY1bnlVN2xzcVp3ejZoVVJ6egord3k1RTk3Qm5ScXFTNVR2YUhCa1VPRERWNHFJeEpTN3g3RVU0N2ZnR1dBTnpZckFRTVk5QXYyVGdYRDdGVHgvYQorRWtQL1RPWUdKcWliR2FwRVBIYXlYT3c9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAzICgweDIpCisgICAgICAgIFNlcmlhbCBOdW1iZXI6IDkzOTc1ODA2MiAoMHgzODAzOTFlZSkKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBPPUVudHJ1c3QubmV0LCBPVT13d3cuZW50cnVzdC5uZXQvQ2xpZW50X0NBX0luZm8vQ1BTIGluY29ycC4gYnkgcmVmLiBsaW1pdHMgbGlhYi4sIE9VPShjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQsIENOPUVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogT2N0IDEyIDE5OjI0OjMwIDE5OTkgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBPY3QgMTIgMTk6NTQ6MzAgMjAxOSBHTVQKKyAgICAgICAgU3ViamVjdDogQz1VUywgTz1FbnRydXN0Lm5ldCwgT1U9d3d3LmVudHJ1c3QubmV0L0NsaWVudF9DQV9JbmZvL0NQUyBpbmNvcnAuIGJ5IHJlZi4gbGltaXRzIGxpYWIuLCBPVT0oYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVkLCBDTj1FbnRydXN0Lm5ldCBDbGllbnQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgxMDI0IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgxMDI0IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmM4OjNhOjk5OjVlOjMxOjE3OmRmOmFjOjI3OjZmOjkwOjdiOmU0OjE5OgorICAgICAgICAgICAgICAgICAgICBmZjo0NTphMzozNDpjMjpkYjpjMTphODo0ZjpmMDo2ODplYTo4NDpmZDo5ZjoKKyAgICAgICAgICAgICAgICAgICAgNzU6Nzk6Y2Y6YzE6OGE6NTE6OTQ6YWY6Yzc6NTc6MDM6NDc6NjQ6OWU6YWQ6CisgICAgICAgICAgICAgICAgICAgIDgyOjFiOjVhOmRhOjdmOjM3Ojc4OjQ3OmJiOjM3Ojk4OjEyOjk2OmNlOmM2OgorICAgICAgICAgICAgICAgICAgICAxMzo3ZDplZjpkMjowYzozMDo1MTphOTozOTo5ZTo1NTpmODpmYjpiMTplNzoKKyAgICAgICAgICAgICAgICAgICAgMzA6ZGU6ODM6YjI6YmE6M2U6ZjE6ZDU6ODk6M2I6M2I6ODU6YmE6YWE6NzQ6CisgICAgICAgICAgICAgICAgICAgIDJjOmZlOjNmOjMxOjZlOmFmOjkxOjk1OjZlOjA2OmQ0OjA3OjRkOjRiOjJjOgorICAgICAgICAgICAgICAgICAgICA1Njo0NzoxODowNDo1MjpkYTowZToxMDo5MzpiZjo2Mzo5MDo5YjplMTpkZjoKKyAgICAgICAgICAgICAgICAgICAgOGM6ZTY6MDI6YTQ6ZTY6NGY6NWU6Zjc6OGIKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogMyAoMHgzKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIE5ldHNjYXBlIENlcnQgVHlwZTogCisgICAgICAgICAgICAgICAgU1NMIENBLCBTL01JTUUgQ0EsIE9iamVjdCBTaWduaW5nIENBCisgICAgICAgICAgICBYNTA5djMgQ1JMIERpc3RyaWJ1dGlvbiBQb2ludHM6IAorICAgICAgICAgICAgICAgIERpck5hbWU6L0M9VVMvTz1FbnRydXN0Lm5ldC9PVT13d3cuZW50cnVzdC5uZXQvQ2xpZW50X0NBX0luZm8vQ1BTIGluY29ycC4gYnkgcmVmLiBsaW1pdHMgbGlhYi4vT1U9KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZC9DTj1FbnRydXN0Lm5ldCBDbGllbnQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkvQ049Q1JMMQorICAgICAgICAgICAgICAgIFVSSTpodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9DbGllbnQxLmNybAorCisgICAgICAgICAgICBYNTA5djMgUHJpdmF0ZSBLZXkgVXNhZ2UgUGVyaW9kOiAKKyAgICAgICAgICAgICAgICBOb3QgQmVmb3JlOiBPY3QgMTIgMTk6MjQ6MzAgMTk5OSBHTVQsIE5vdCBBZnRlcjogT2N0IDEyIDE5OjI0OjMwIDIwMTkgR01UCisgICAgICAgICAgICBYNTA5djMgS2V5IFVzYWdlOiAKKyAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZSBTaWduLCBDUkwgU2lnbgorICAgICAgICAgICAgWDUwOXYzIEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAga2V5aWQ6QzQ6RkI6OUM6Mjk6N0I6OTc6Q0Q6NEM6OTY6RkM6RUU6NUI6QjM6Q0E6OTk6NzQ6OEI6OTU6RUE6NEMKKworICAgICAgICAgICAgWDUwOXYzIFN1YmplY3QgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIEM0OkZCOjlDOjI5OjdCOjk3OkNEOjRDOjk2OkZDOkVFOjVCOkIzOkNBOjk5Ojc0OjhCOjk1OkVBOjRDCisgICAgICAgICAgICBYNTA5djMgQmFzaWMgQ29uc3RyYWludHM6IAorICAgICAgICAgICAgICAgIENBOlRSVUUKKyAgICAgICAgICAgIDEuMi44NDAuMTEzNTMzLjcuNjUuMDogCisgICAgICAgICAgICAgICAgMAorLi5WNC4wLi4uLgorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDNmOmFlOjhhOmYxOmQ3OjY2OjAzOjA1OjllOjNlOmZhOmVhOjFjOjQ2OmJiOmE0OjViOjhmOgorICAgICAgICA3ODo5YToxMjo0ODo5OTpmOTpmNDozNTpkZTowYzozNjowNzowMjo2YjoxMDozYTo4OToxNDoKKyAgICAgICAgODE6OWM6MzE6YTY6N2M6YjI6NDE6YjI6NmE6ZTc6MDc6MDE6YTE6NGI6Zjk6OWY6MjU6M2I6CisgICAgICAgIDk2OmNhOjk5OmMzOjNlOmExOjUxOjFjOmYzOmMzOjJlOjQ0OmY3OmIwOjY3OjQ2OmFhOjkyOgorICAgICAgICBlNTozYjpkYToxYzoxOToxNDozODozMDpkNTplMjphMjozMToyNToyZTpmMTplYzo0NTozODoKKyAgICAgICAgZWQ6Zjg6MDY6NTg6MDM6NzM6NjI6YjA6MTA6MzE6OGY6NDA6YmY6NjQ6ZTA6NWM6M2U6YzU6CisgICAgICAgIDRmOjFmOmRhOjEyOjQzOmZmOjRjOmU2OjA2OjI2OmE4OjliOjE5OmFhOjQ0OjNjOjc2OmIyOgorICAgICAgICA1YzplYworCitFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENBCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IERGOkYyOjgwOjczOkNDOkYxOkU2OjYxOjczOkZDOkY1OjQyOkU5OkM1OjdDOkVFCitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRTJEQ0NCRUdnQXdJQkFnSUVOMHJTUXpBTkJna3Foa2lHOXcwQkFRVUZBRENCd3pFTE1Ba0dBMVVFQmhNQworVlZNeEZEQVNCZ05WQkFvVEMwVnVkSEoxYzNRdWJtVjBNVHN3T1FZRFZRUUxFekozZDNjdVpXNTBjblZ6ZEM1dQorWlhRdlExQlRJR2x1WTI5eWNDNGdZbmtnY21WbUxpQW9iR2x0YVhSeklHeHBZV0l1S1RFbE1DTUdBMVVFQ3hNYworS0dNcElERTVPVGtnUlc1MGNuVnpkQzV1WlhRZ1RHbHRhWFJsWkRFNk1EZ0dBMVVFQXhNeFJXNTBjblZ6ZEM1dQorWlhRZ1UyVmpkWEpsSUZObGNuWmxjaUJEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzA1T1RBMQorTWpVeE5qQTVOREJhRncweE9UQTFNalV4TmpNNU5EQmFNSUhETVFzd0NRWURWUVFHRXdKVlV6RVVNQklHQTFVRQorQ2hNTFJXNTBjblZ6ZEM1dVpYUXhPekE1QmdOVkJBc1RNbmQzZHk1bGJuUnlkWE4wTG01bGRDOURVRk1nYVc1agorYjNKd0xpQmllU0J5WldZdUlDaHNhVzFwZEhNZ2JHbGhZaTRwTVNVd0l3WURWUVFMRXh3b1l5a2dNVGs1T1NCRgorYm5SeWRYTjBMbTVsZENCTWFXMXBkR1ZrTVRvd09BWURWUVFERXpGRmJuUnlkWE4wTG01bGRDQlRaV04xY21VZworVTJWeWRtVnlJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1JR2RNQTBHQ1NxR1NJYjNEUUVCQVFVQQorQTRHTEFEQ0Jod0tCZ1FETktJTTBWQnVKOHcrdk41RXgvNjh4WU1tbzZMSVFhTzJmNTVNMjhRcGt1MGYxQkJjLworSTBkTnhTY1pnU1lNVkhJTmlDM1pINW9Tbjd5emNkT0FHVDlIWm51TU5TalN1UXJmSk5xYzFsQjVnWHBhMHpmMword2tyWUtaSW1aTkhrbUd3NkFJcjFOSnRsK08zakVQLzl1RWxZM0tEZWdqbHJnYkVXR1dHNVZMYm1Rd0lCQTZPQworQWRjd2dnSFRNQkVHQ1dDR1NBR0crRUlCQVFRRUF3SUFCekNDQVJrR0ExVWRId1NDQVJBd2dnRU1NSUhlb0lIYgorb0lIWXBJSFZNSUhTTVFzd0NRWURWUVFHRXdKVlV6RVVNQklHQTFVRUNoTUxSVzUwY25WemRDNXVaWFF4T3pBNQorQmdOVkJBc1RNbmQzZHk1bGJuUnlkWE4wTG01bGRDOURVRk1nYVc1amIzSndMaUJpZVNCeVpXWXVJQ2hzYVcxcAorZEhNZ2JHbGhZaTRwTVNVd0l3WURWUVFMRXh3b1l5a2dNVGs1T1NCRmJuUnlkWE4wTG01bGRDQk1hVzFwZEdWaworTVRvd09BWURWUVFERXpGRmJuUnlkWE4wTG01bGRDQlRaV04xY21VZ1UyVnlkbVZ5SUVObGNuUnBabWxqWVhScAorYjI0Z1FYVjBhRzl5YVhSNU1RMHdDd1lEVlFRREV3UkRVa3d4TUNtZ0o2QWxoaU5vZEhSd09pOHZkM2QzTG1WdQorZEhKMWMzUXVibVYwTDBOU1RDOXVaWFF4TG1OeWJEQXJCZ05WSFJBRUpEQWlnQTh4T1RrNU1EVXlOVEUyTURrMAorTUZxQkR6SXdNVGt3TlRJMU1UWXdPVFF3V2pBTEJnTlZIUThFQkFNQ0FRWXdId1lEVlIwakJCZ3dGb0FVOEJkaQorRTFVOXMvOEtBR3Y3VUlTWDgrMWkwQm93SFFZRFZSME9CQllFRlBBWFloTlZQYlAvQ2dCcisxQ0VsL1B0WXRBYQorTUF3R0ExVWRFd1FGTUFNQkFmOHdHUVlKS29aSWh2WjlCMEVBQkF3d0Noc0VWalF1TUFNQ0JKQXdEUVlKS29aSQoraHZjTkFRRUZCUUFEZ1lFQWtOd3dBdnBrZE1LbkNxVjhJWTAwRjZqN1J3Ny9KWHlORXdyNzVKaTE3NHo0eFJBTgorOTVLKzhjUFYxWlZxQkxzc3ppWTJaY2d4eHVmdVArTlhkWVI2RWU5R1R4ajAwNWk3cUljeXVuTDJQT0k5bjljZAorMmNOZ1E0eFlEaUtXTDJLakxCKzZyUVh2cXpKNGg2QlVjeG0xWEFYNVVqNXRMVVVMOXdxVDZ1MEcrYkk9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAzICgweDIpCisgICAgICAgIFNlcmlhbCBOdW1iZXI6IDkyNzY1MDM3MSAoMHgzNzRhZDI0MykKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1VUywgTz1FbnRydXN0Lm5ldCwgT1U9d3d3LmVudHJ1c3QubmV0L0NQUyBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLiksIE9VPShjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQsIENOPUVudHJ1c3QubmV0IFNlY3VyZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IE1heSAyNSAxNjowOTo0MCAxOTk5IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogTWF5IDI1IDE2OjM5OjQwIDIwMTkgR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89RW50cnVzdC5uZXQsIE9VPXd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pLCBPVT0oYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVkLCBDTj1FbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpjZDoyODo4MzozNDo1NDoxYjo4OTpmMzowZjphZjozNzo5MTozMTpmZjoKKyAgICAgICAgICAgICAgICAgICAgYWY6MzE6NjA6Yzk6YTg6ZTg6YjI6MTA6Njg6ZWQ6OWY6ZTc6OTM6MzY6ZjE6CisgICAgICAgICAgICAgICAgICAgIDBhOjY0OmJiOjQ3OmY1OjA0OjE3OjNmOjIzOjQ3OjRkOmM1OjI3OjE5OjgxOgorICAgICAgICAgICAgICAgICAgICAyNjowYzo1NDo3MjowZDo4ODoyZDpkOToxZjo5YToxMjo5ZjpiYzpiMzo3MToKKyAgICAgICAgICAgICAgICAgICAgZDM6ODA6MTk6M2Y6NDc6NjY6N2I6OGM6MzU6Mjg6ZDI6Yjk6MGE6ZGY6MjQ6CisgICAgICAgICAgICAgICAgICAgIGRhOjljOmQ2OjUwOjc5OjgxOjdhOjVhOmQzOjM3OmY3OmMyOjRhOmQ4OjI5OgorICAgICAgICAgICAgICAgICAgICA5MjoyNjo2NDpkMTplNDo5ODo2YzozYTowMDo4YTpmNTozNDo5Yjo2NTpmODoKKyAgICAgICAgICAgICAgICAgICAgZWQ6ZTM6MTA6ZmY6ZmQ6Yjg6NDk6NTg6ZGM6YTA6ZGU6ODI6Mzk6NmI6ODE6CisgICAgICAgICAgICAgICAgICAgIGIxOjE2OjE5OjYxOmI5OjU0OmI2OmU2OjQzCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDMgKDB4MykKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBOZXRzY2FwZSBDZXJ0IFR5cGU6IAorICAgICAgICAgICAgICAgIFNTTCBDQSwgUy9NSU1FIENBLCBPYmplY3QgU2lnbmluZyBDQQorICAgICAgICAgICAgWDUwOXYzIENSTCBEaXN0cmlidXRpb24gUG9pbnRzOiAKKyAgICAgICAgICAgICAgICBEaXJOYW1lOi9DPVVTL089RW50cnVzdC5uZXQvT1U9d3d3LmVudHJ1c3QubmV0L0NQUyBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikvT1U9KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZC9DTj1FbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5L0NOPUNSTDEKKyAgICAgICAgICAgICAgICBVUkk6aHR0cDovL3d3dy5lbnRydXN0Lm5ldC9DUkwvbmV0MS5jcmwKKworICAgICAgICAgICAgWDUwOXYzIFByaXZhdGUgS2V5IFVzYWdlIFBlcmlvZDogCisgICAgICAgICAgICAgICAgTm90IEJlZm9yZTogTWF5IDI1IDE2OjA5OjQwIDE5OTkgR01ULCBOb3QgQWZ0ZXI6IE1heSAyNSAxNjowOTo0MCAyMDE5IEdNVAorICAgICAgICAgICAgWDUwOXYzIEtleSBVc2FnZTogCisgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUgU2lnbiwgQ1JMIFNpZ24KKyAgICAgICAgICAgIFg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIGtleWlkOkYwOjE3OjYyOjEzOjU1OjNEOkIzOkZGOjBBOjAwOjZCOkZCOjUwOjg0Ojk3OkYzOkVEOjYyOkQwOjFBCisKKyAgICAgICAgICAgIFg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICBGMDoxNzo2MjoxMzo1NTozRDpCMzpGRjowQTowMDo2QjpGQjo1MDo4NDo5NzpGMzpFRDo2MjpEMDoxQQorICAgICAgICAgICAgWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzOiAKKyAgICAgICAgICAgICAgICBDQTpUUlVFCisgICAgICAgICAgICAxLjIuODQwLjExMzUzMy43LjY1LjA6IAorICAgICAgICAgICAgICAgIDAKKy4uVjQuMC4uLi4KKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgOTA6ZGM6MzA6MDI6ZmE6NjQ6NzQ6YzI6YTc6MGE6YTU6N2M6MjE6OGQ6MzQ6MTc6YTg6ZmI6CisgICAgICAgIDQ3OjBlOmZmOjI1OjdjOjhkOjEzOjBhOmZiOmU0Ojk4OmI1OmVmOjhjOmY4OmM1OjEwOjBkOgorICAgICAgICBmNzo5MjpiZTpmMTpjMzpkNTpkNTo5NTo2YTowNDpiYjoyYzpjZToyNjozNjo2NTpjODozMToKKyAgICAgICAgYzY6ZTc6ZWU6M2Y6ZTM6NTc6NzU6ODQ6N2E6MTE6ZWY6NDY6NGY6MTg6ZjQ6ZDM6OTg6YmI6CisgICAgICAgIGE4Ojg3OjMyOmJhOjcyOmY2OjNjOmUyOjNkOjlmOmQ3OjFkOmQ5OmMzOjYwOjQzOjhjOjU4OgorICAgICAgICAwZToyMjo5NjoyZjo2MjphMzoyYzoxZjpiYTphZDowNTplZjphYjozMjo3ODo4NzphMDo1NDoKKyAgICAgICAgNzM6MTk6YjU6NWM6MDU6Zjk6NTI6M2U6NmQ6MmQ6NDU6MGI6Zjc6MGE6OTM6ZWE6ZWQ6MDY6CisgICAgICAgIGY5OmIyCisKK0VxdWlmYXggUHJlbWl1bSBDQQorPT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IEE5OkU5OkE4OjlEOjBFOjczOkUzOkIxOjJGOjM3OjBEOkU4OjQ4OjNGOjg2OkVECitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJREl6Q0NBb3lnQXdJQkFnSUVOZUh2SGpBTkJna3Foa2lHOXcwQkFRVUZBREJQTVFzd0NRWURWUVFHRXdKVgorVXpFUU1BNEdBMVVFQ2hNSFJYRjFhV1poZURFdU1Dd0dBMVVFQ3hNbFJYRjFhV1poZUNCUWNtVnRhWFZ0SUVObAorY25ScFptbGpZWFJsSUVGMWRHaHZjbWwwZVRBZUZ3MDVPREE0TWpReU1qVTBNak5hRncweE9EQTRNalF5TWpVMAorTWpOYU1FOHhDekFKQmdOVkJBWVRBbFZUTVJBd0RnWURWUVFLRXdkRmNYVnBabUY0TVM0d0xBWURWUVFMRXlWRgorY1hWcFptRjRJRkJ5WlcxcGRXMGdRMlZ5ZEdsbWFXTmhkR1VnUVhWMGFHOXlhWFI1TUlHZk1BMEdDU3FHU0liMworRFFFQkFRVUFBNEdOQURDQmlRS0JnUURPb1FhT0Jzd0lDOEdHcU40ZzFRME8wUTNFbitwcTJiUENNa2RBYjRxSQorcEFtOU9Dd2Q1c3ZtcFBNMjY5cnJ2UHhrc3dmMkxieXF6cDhaU0doSy9QV2lSWDRKRVBXUHMwbGNJd1k1NmhPTAordUF2TmtSMTJYOWszb1VUN1g1RHlaN1BOR0psREgzWVNhd0x5bFlNNFE4TDJZalRLeVhoZFg5TFl1cHIvdmhCZworV3dJREFRQUJvNElCQ2pDQ0FRWXdjUVlEVlIwZkJHb3dhREJtb0dTZ1lxUmdNRjR4Q3pBSkJnTlZCQVlUQWxWVAorTVJBd0RnWURWUVFLRXdkRmNYVnBabUY0TVM0d0xBWURWUVFMRXlWRmNYVnBabUY0SUZCeVpXMXBkVzBnUTJWeQorZEdsbWFXTmhkR1VnUVhWMGFHOXlhWFI1TVEwd0N3WURWUVFERXdSRFVrd3hNQm9HQTFVZEVBUVRNQkdCRHpJdworTVRnd09ESTBNakkxTkRJeldqQUxCZ05WSFE4RUJBTUNBUVl3SHdZRFZSMGpCQmd3Rm9BVUZlNnlLRm1yYnVYNAorejR1QjlDVGhyajkxRzVnd0hRWURWUjBPQkJZRUZCWHVzaWhacTI3bCtNK0xnZlFrNGE0L2RSdVlNQXdHQTFVZAorRXdRRk1BTUJBZjh3R2dZSktvWklodlo5QjBFQUJBMHdDeHNGVmpNdU1HTURBZ2JBTUEwR0NTcUdTSWIzRFFFQgorQlFVQUE0R0JBTDBMbkNlcEE5c28zSmlwUzlEUmpxZW9HbHFSNEp6eDl4aDhMaUtlTmgvSnFMWE5Sa3B1K2pVSAorRzRZSTY1L2lxUG1kUVMwNnJseGN0bDgwQk92OEttQ3crM1RraGVsbE9KYnVGY2ZHZDJNU3ZZcG9INnRzZmRySworWEJQTzZzbnJDVnpGYytjU0FkWFpVd2VlNEErVzhJdTB1MFZJbjRiRkdWV2d5NWJGQS94SQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiA5MDM5OTkyNjIgKDB4MzVlMWVmMWUpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9VVMsIE89RXF1aWZheCwgT1U9RXF1aWZheCBQcmVtaXVtIENlcnRpZmljYXRlIEF1dGhvcml0eQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogQXVnIDI0IDIyOjU0OjIzIDE5OTggR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBBdWcgMjQgMjI6NTQ6MjMgMjAxOCBHTVQKKyAgICAgICAgU3ViamVjdDogQz1VUywgTz1FcXVpZmF4LCBPVT1FcXVpZmF4IFByZW1pdW0gQ2VydGlmaWNhdGUgQXV0aG9yaXR5CisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpjZTphMTowNjo4ZTowNjpjYzowODowYjpjMTo4NjphODpkZToyMDpkNToKKyAgICAgICAgICAgICAgICAgICAgMGQ6MGU6ZDE6MGQ6YzQ6OWY6ZWE6NmE6ZDk6YjM6YzI6MzI6NDc6NDA6NmY6CisgICAgICAgICAgICAgICAgICAgIDhhOjg4OmE0OjA5OmJkOjM4OjJjOjFkOmU2OmNiOmU2OmE0OmYzOjM2OmViOgorICAgICAgICAgICAgICAgICAgICBkYTplYjpiYzpmYzo2NDpiMzowNzpmNjoyZDpiYzphYTpjZTo5ZjoxOTo0ODoKKyAgICAgICAgICAgICAgICAgICAgNjg6NGE6ZmM6ZjU6YTI6NDU6N2U6MDk6MTA6ZjU6OGY6YjM6NDk6NWM6MjM6CisgICAgICAgICAgICAgICAgICAgIDA2OjM5OmVhOjEzOjhiOmI4OjBiOmNkOjkxOjFkOjc2OjVmOmQ5OjM3OmExOgorICAgICAgICAgICAgICAgICAgICA0NDpmYjo1Zjo5MDpmMjo2NzpiMzpjZDoxODo5OTo0MzoxZjo3NjoxMjo2YjoKKyAgICAgICAgICAgICAgICAgICAgMDI6ZjI6OTU6ODM6Mzg6NDM6YzI6ZjY6NjI6MzQ6Y2E6Yzk6Nzg6NWQ6NWY6CisgICAgICAgICAgICAgICAgICAgIGQyOmQ4OmJhOjlhOmZmOmJlOjEwOjYwOjViCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIFg1MDl2MyBDUkwgRGlzdHJpYnV0aW9uIFBvaW50czogCisgICAgICAgICAgICAgICAgRGlyTmFtZTovQz1VUy9PPUVxdWlmYXgvT1U9RXF1aWZheCBQcmVtaXVtIENlcnRpZmljYXRlIEF1dGhvcml0eS9DTj1DUkwxCisKKyAgICAgICAgICAgIFg1MDl2MyBQcml2YXRlIEtleSBVc2FnZSBQZXJpb2Q6IAorICAgICAgICAgICAgICAgIE5vdCBBZnRlcjogQXVnIDI0IDIyOjU0OjIzIDIwMTggR01UCisgICAgICAgICAgICBYNTA5djMgS2V5IFVzYWdlOiAKKyAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZSBTaWduLCBDUkwgU2lnbgorICAgICAgICAgICAgWDUwOXYzIEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAga2V5aWQ6MTU6RUU6QjI6Mjg6NTk6QUI6NkU6RTU6Rjg6Q0Y6OEI6ODE6RjQ6MjQ6RTE6QUU6M0Y6NzU6MUI6OTgKKworICAgICAgICAgICAgWDUwOXYzIFN1YmplY3QgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIDE1OkVFOkIyOjI4OjU5OkFCOjZFOkU1OkY4OkNGOjhCOjgxOkY0OjI0OkUxOkFFOjNGOjc1OjFCOjk4CisgICAgICAgICAgICBYNTA5djMgQmFzaWMgQ29uc3RyYWludHM6IAorICAgICAgICAgICAgICAgIENBOlRSVUUKKyAgICAgICAgICAgIDEuMi44NDAuMTEzNTMzLjcuNjUuMDogCisgICAgICAgICAgICAgICAgMC4uLlYzLjBjLi4uLgorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBiZDowYjo5YzoyNzphOTowMzpkYjoyODpkYzo5ODphOTo0YjpkMDpkMTo4ZTphNzphODoxYToKKyAgICAgICAgNWE6OTE6ZTA6OWM6ZjE6Zjc6MTg6N2M6MmU6MjI6OWU6MzY6MWY6Yzk6YTg6YjU6Y2Q6NDY6CisgICAgICAgIDRhOjZlOmZhOjM1OjA3OjFiOjg2OjA4OmViOjlmOmUyOmE4OmY5OjlkOjQxOjJkOjNhOmFlOgorICAgICAgICA1Yzo1YzpiNjo1ZjozNDowNDplYjpmYzoyYTo2MDpiMDpmYjo3NDplNDo4NTplOTo2NTozODoKKyAgICAgICAgOTY6ZWU6MTU6Yzc6YzY6Nzc6NjM6MTI6YmQ6OGE6Njg6MWY6YWI6NmM6N2Q6ZGE6Y2E6NWM6CisgICAgICAgIDEzOmNlOmVhOmM5OmViOjA5OjVjOmM1OjczOmU3OjEyOjAxOmQ1OmQ5OjUzOjA3OjllOmUwOgorICAgICAgICAwZjo5NjpmMDo4YjpiNDpiYjo0NTo0ODo5Zjo4NjpjNToxOTo1NTphMDpjYjo5NjpjNTowMzoKKyAgICAgICAgZmM6NDgKKworRXF1aWZheCBTZWN1cmUgQ0EKKz09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IDY3OkNCOjlEOkMwOjEzOjI0OjhBOjgyOjlCOkIyOjE3OjFFOkQxOjFCOkVDOkQ0CitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRElEQ0NBb21nQXdJQkFnSUVOZDcwenpBTkJna3Foa2lHOXcwQkFRVUZBREJPTVFzd0NRWURWUVFHRXdKVgorVXpFUU1BNEdBMVVFQ2hNSFJYRjFhV1poZURFdE1Dc0dBMVVFQ3hNa1JYRjFhV1poZUNCVFpXTjFjbVVnUTJWeQorZEdsbWFXTmhkR1VnUVhWMGFHOXlhWFI1TUI0WERUazRNRGd5TWpFMk5ERTFNVm9YRFRFNE1EZ3lNakUyTkRFMQorTVZvd1RqRUxNQWtHQTFVRUJoTUNWVk14RURBT0JnTlZCQW9UQjBWeGRXbG1ZWGd4TFRBckJnTlZCQXNUSkVWeAorZFdsbVlYZ2dVMlZqZFhKbElFTmxjblJwWm1sallYUmxJRUYxZEdodmNtbDBlVENCbnpBTkJna3Foa2lHOXcwQgorQVFFRkFBT0JqUUF3Z1lrQ2dZRUF3VjJ4V0djSVl1NmdtaTBmQ0cyUkZHaVlDaDcrMmdSdkU0UmlJY1BSZk02ZgorQmVDNEFmQk9OT3ppaXBVRVpLenhhMU5mQmJQTFo0Qy9RZ0tPL3QwQkNlemhBQlJQL1B2d0ROMUR1bHNyNFIrQQorY0prVlY1TVc4UStYYXJmQ2FDTWN6RTFaTUt4UkhqdXZLOWJ1WTBWN3hkbGZVTkxqVUE4NmlPZS9GUDNneDdrQworQXdFQUFhT0NBUWt3Z2dFRk1IQUdBMVVkSHdScE1HY3daYUJqb0dHa1h6QmRNUXN3Q1FZRFZRUUdFd0pWVXpFUQorTUE0R0ExVUVDaE1IUlhGMWFXWmhlREV0TUNzR0ExVUVDeE1rUlhGMWFXWmhlQ0JUWldOMWNtVWdRMlZ5ZEdsbQorYVdOaGRHVWdRWFYwYUc5eWFYUjVNUTB3Q3dZRFZRUURFd1JEVWt3eE1Cb0dBMVVkRUFRVE1CR0JEekl3TVRndworT0RJeU1UWTBNVFV4V2pBTEJnTlZIUThFQkFNQ0FRWXdId1lEVlIwakJCZ3dGb0FVU09abytTdlNzcFhYUjlnagorSUJCUE01aVFuOVF3SFFZRFZSME9CQllFRkVqbWFQa3IwcktWMTBmWUl5QVFUek9Za0ovVU1Bd0dBMVVkRXdRRgorTUFNQkFmOHdHZ1lKS29aSWh2WjlCMEVBQkEwd0N4c0ZWak11TUdNREFnYkFNQTBHQ1NxR1NJYjNEUUVCQlFVQQorQTRHQkFGak9LZXI4OTk2MXpnSzVGN1dGMGJuajRKWE1KVEVOQUthU2JuKzJrbU9lVUpYUm1tL2tFZDVqaFc2WQorN3FqL1dzalRWYkptY1ZmZXdDSHJQU3FuSTBrQkJJWkNlL3p1ZjZJV1VyVm5aOU5BMnpzbVdMSW9kejJ1RkhkaAorMXZvcVppZWdEZnFuYzF6cWNQR1VJV1ZFWC9yODd5bG9xYUtIZWU5NTcwK3NCM2M0CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAzICgweDIpCisgICAgICAgIFNlcmlhbCBOdW1iZXI6IDkwMzgwNDExMSAoMHgzNWRlZjRjZikKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1VUywgTz1FcXVpZmF4LCBPVT1FcXVpZmF4IFNlY3VyZSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IEF1ZyAyMiAxNjo0MTo1MSAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogQXVnIDIyIDE2OjQxOjUxIDIwMTggR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89RXF1aWZheCwgT1U9RXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5CisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpjMTo1ZDpiMTo1ODo2NzowODo2MjplZTphMDo5YToyZDoxZjowODo2ZDoKKyAgICAgICAgICAgICAgICAgICAgOTE6MTQ6Njg6OTg6MGE6MWU6ZmU6ZGE6MDQ6NmY6MTM6ODQ6NjI6MjE6YzM6CisgICAgICAgICAgICAgICAgICAgIGQxOjdjOmNlOjlmOjA1OmUwOmI4OjAxOmYwOjRlOjM0OmVjOmUyOjhhOjk1OgorICAgICAgICAgICAgICAgICAgICAwNDo2NDphYzpmMTo2Yjo1Mzo1ZjowNTpiMzpjYjo2Nzo4MDpiZjo0MjowMjoKKyAgICAgICAgICAgICAgICAgICAgOGU6ZmU6ZGQ6MDE6MDk6ZWM6ZTE6MDA6MTQ6NGY6ZmM6ZmI6ZjA6MGM6ZGQ6CisgICAgICAgICAgICAgICAgICAgIDQzOmJhOjViOjJiOmUxOjFmOjgwOjcwOjk5OjE1OjU3OjkzOjE2OmYxOjBmOgorICAgICAgICAgICAgICAgICAgICA5Nzo2YTpiNzpjMjo2ODoyMzoxYzpjYzo0ZDo1OTozMDphYzo1MToxZTozYjoKKyAgICAgICAgICAgICAgICAgICAgYWY6MmI6ZDY6ZWU6NjM6NDU6N2I6YzU6ZDk6NWY6NTA6ZDI6ZTM6NTA6MGY6CisgICAgICAgICAgICAgICAgICAgIDNhOjg4OmU3OmJmOjE0OmZkOmUwOmM3OmI5CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIFg1MDl2MyBDUkwgRGlzdHJpYnV0aW9uIFBvaW50czogCisgICAgICAgICAgICAgICAgRGlyTmFtZTovQz1VUy9PPUVxdWlmYXgvT1U9RXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5L0NOPUNSTDEKKworICAgICAgICAgICAgWDUwOXYzIFByaXZhdGUgS2V5IFVzYWdlIFBlcmlvZDogCisgICAgICAgICAgICAgICAgTm90IEFmdGVyOiBBdWcgMjIgMTY6NDE6NTEgMjAxOCBHTVQKKyAgICAgICAgICAgIFg1MDl2MyBLZXkgVXNhZ2U6IAorICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIFNpZ24sIENSTCBTaWduCisgICAgICAgICAgICBYNTA5djMgQXV0aG9yaXR5IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICBrZXlpZDo0ODpFNjo2ODpGOToyQjpEMjpCMjo5NTpENzo0NzpEODoyMzoyMDoxMDo0RjozMzo5ODo5MDo5RjpENAorCisgICAgICAgICAgICBYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAgNDg6RTY6Njg6Rjk6MkI6RDI6QjI6OTU6RDc6NDc6RDg6MjM6MjA6MTA6NEY6MzM6OTg6OTA6OUY6RDQKKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogCisgICAgICAgICAgICAgICAgQ0E6VFJVRQorICAgICAgICAgICAgMS4yLjg0MC4xMTM1MzMuNy42NS4wOiAKKyAgICAgICAgICAgICAgICAwLi4uVjMuMGMuLi4uCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDU4OmNlOjI5OmVhOmZjOmY3OmRlOmI1OmNlOjAyOmI5OjE3OmI1Ojg1OmQxOmI5OmUzOmUwOgorICAgICAgICA5NTpjYzoyNTozMTowZDowMDphNjo5Mjo2ZTo3ZjpiNjo5Mjo2Mzo5ZTo1MDo5NTpkMTo5YToKKyAgICAgICAgNmY6ZTQ6MTE6ZGU6NjM6ODU6NmU6OTg6ZWU6YTg6ZmY6NWE6Yzg6ZDM6NTU6YjI6NjY6NzE6CisgICAgICAgIDU3OmRlOmMwOjIxOmViOjNkOjJhOmE3OjIzOjQ5OjAxOjA0Ojg2OjQyOjdiOmZjOmVlOjdmOgorICAgICAgICBhMjoxNjo1MjpiNTo2Nzo2NzpkMzo0MDpkYjozYjoyNjo1ODpiMjoyODo3NzozZDphZToxNDoKKyAgICAgICAgNzc6NjE6ZDY6ZmE6MmE6NjY6Mjc6YTA6MGQ6ZmE6YTc6NzM6NWM6ZWE6NzA6ZjE6OTQ6MjE6CisgICAgICAgIDY1OjQ0OjVmOmZhOmZjOmVmOjI5OjY4OmE5OmEyOjg3Ojc5OmVmOjc5OmVmOjRmOmFjOjA3OgorICAgICAgICA3NzozOAorCitHVEUgQ3liZXJUcnVzdCBHbG9iYWwgUm9vdAorPT09PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogQ0E6M0Q6RDM6Njg6RjE6MDM6NUM6RDA6MzI6RkE6Qjg6MkI6NTk6RTg6NUE6REIKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlDV2pDQ0FjTUNBZ0dsTUEwR0NTcUdTSWIzRFFFQkJBVUFNSFV4Q3pBSkJnTlZCQVlUQWxWVE1SZ3dGZ1lECitWUVFLRXc5SFZFVWdRMjl5Y0c5eVlYUnBiMjR4SnpBbEJnTlZCQXNUSGtkVVJTQkRlV0psY2xSeWRYTjBJRk52CitiSFYwYVc5dWN5d2dTVzVqTGpFak1DRUdBMVVFQXhNYVIxUkZJRU41WW1WeVZISjFjM1FnUjJ4dlltRnNJRkp2CitiM1F3SGhjTk9UZ3dPREV6TURBeU9UQXdXaGNOTVRnd09ERXpNak0xT1RBd1dqQjFNUXN3Q1FZRFZRUUdFd0pWCitVekVZTUJZR0ExVUVDaE1QUjFSRklFTnZjbkJ2Y21GMGFXOXVNU2N3SlFZRFZRUUxFeDVIVkVVZ1EzbGlaWEpVCitjblZ6ZENCVGIyeDFkR2x2Ym5Nc0lFbHVZeTR4SXpBaEJnTlZCQU1UR2tkVVJTQkRlV0psY2xSeWRYTjBJRWRzCitiMkpoYkNCU2IyOTBNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0JnUUNWRDZDMjhGQ2M2SHJICitpTTNkRnc0dXNKVFFHejBPOXBUQWlwVEhCc2lRbDhpNFpCcDZmbXc4VStFM0tITmdmN0tYVXdlZlUvbHRXSlRTCityNDF0aUdlQTV1MnlsYzl5TWNxbEhISzZYQUxuWkVMbitha3Mxam9OckkxQ3FpUUJPZWFjUHdHRlZ3MVloMFg0CiswNFdxazJrbWhYQklnRDhTRmNkNXRCOEZMenRpbVFJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQkFVQUE0R0JBRzNyCitHd25wWHRsUjIyY2lZYVFxUEVoMzQ2QjhwdDV6b2hRRGhUMzdxdzR3eFlNV000RVRDSjU3TkU3ZlFNaDAxN2w5CiszUFIyVlgyYlkxUVk2ZkRxODF5eDJZdENIcm5BbFU2Nit0WGlmUFZvWWIrTzdBV1hYMXV3MTZPRk5NUWtwdzBQCitsWlB2eTVUWW5oK2RYSVZ0eDZxdVR4OGl0YzJWcmJxbnpQbXJDM3AvCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAxICgweDApCisgICAgICAgIFNlcmlhbCBOdW1iZXI6IDQyMSAoMHgxYTUpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1VUywgTz1HVEUgQ29ycG9yYXRpb24sIE9VPUdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLiwgQ049R1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IEF1ZyAxMyAwMDoyOTowMCAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogQXVnIDEzIDIzOjU5OjAwIDIwMTggR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89R1RFIENvcnBvcmF0aW9uLCBPVT1HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4sIENOPUdURSBDeWJlclRydXN0IEdsb2JhbCBSb290CisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDo5NTowZjphMDpiNjpmMDo1MDo5YzplODo3YTpjNzo4ODpjZDpkZDoxNzoKKyAgICAgICAgICAgICAgICAgICAgMGU6MmU6YjA6OTQ6ZDA6MWI6M2Q6MGU6ZjY6OTQ6YzA6OGE6OTQ6Yzc6MDY6CisgICAgICAgICAgICAgICAgICAgIGM4OjkwOjk3OmM4OmI4OjY0OjFhOjdhOjdlOjZjOjNjOjUzOmUxOjM3OjI4OgorICAgICAgICAgICAgICAgICAgICA3Mzo2MDo3ZjpiMjo5Nzo1MzowNzo5Zjo1MzpmOTo2ZDo1ODo5NDpkMjphZjoKKyAgICAgICAgICAgICAgICAgICAgOGQ6NmQ6ODg6Njc6ODA6ZTY6ZWQ6YjI6OTU6Y2Y6NzI6MzE6Y2E6YTU6MWM6CisgICAgICAgICAgICAgICAgICAgIDcyOmJhOjVjOjAyOmU3OjY0OjQyOmU3OmY5OmE5OjJjOmQ2OjNhOjBkOmFjOgorICAgICAgICAgICAgICAgICAgICA4ZDo0MjphYToyNDowMTozOTplNjo5YzozZjowMTo4NTo1NzowZDo1ODo4NzoKKyAgICAgICAgICAgICAgICAgICAgNDU6Zjg6ZDM6ODU6YWE6OTM6Njk6MjY6ODU6NzA6NDg6ODA6M2Y6MTI6MTU6CisgICAgICAgICAgICAgICAgICAgIGM3Ojc5OmI0OjFmOjA1OjJmOjNiOjYyOjk5CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDZkOmViOjFiOjA5OmU5OjVlOmQ5OjUxOmRiOjY3OjIyOjYxOmE0OjJhOjNjOjQ4Ojc3OmUzOgorICAgICAgICBhMDo3YzphNjpkZTo3MzphMjoxNDowMzo4NTozZDpmYjphYjowZTozMDpjNTo4MzoxNjozMzoKKyAgICAgICAgODE6MTM6MDg6OWU6N2I6MzQ6NGU6ZGY6NDA6Yzg6NzQ6ZDc6Yjk6N2Q6ZGM6ZjQ6NzY6NTU6CisgICAgICAgIDdkOjliOjYzOjU0OjE4OmU5OmYwOmVhOmYzOjVjOmIxOmQ5OjhiOjQyOjFlOmI5OmMwOjk1OgorICAgICAgICA0ZTpiYTpmYTpkNTplMjo3YzpmNTo2ODo2MTpiZjo4ZTplYzowNTo5Nzo1Zjo1YjpiMDpkNzoKKyAgICAgICAgYTM6ODU6MzQ6YzQ6MjQ6YTc6MGQ6MGY6OTU6OTM6ZWY6Y2I6OTQ6ZDg6OWU6MWY6OWQ6NWM6CisgICAgICAgIDg1OjZkOmM3OmFhOmFlOjRmOjFmOjIyOmI1OmNkOjk1OmFkOmJhOmE3OmNjOmY5OmFiOjBiOgorICAgICAgICA3YTo3ZgorCitHVEUgQ3liZXJUcnVzdCBKYXBhbiBSb290IENBCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IERFOkFCOkZGOjQzOjJBOjY1OjM3OjA2OjlCOjI4OkI1OjdBOkU4Ojg0OkQzOjhFCitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQ0VUQ0NBWG9DQVU0d0RRWUpLb1pJaHZjTkFRRUVCUUF3VVRFTE1Ba0dBMVVFQmhNQ1NsQXhIekFkQmdOVgorQkFvVEZrTjVZbVZ5VkhKMWMzUWdTbUZ3WVc0c0lFbHVZeTR4SVRBZkJnTlZCQU1UR0VONVltVnlWSEoxYzNRZworU2tGUVFVNGdVbTl2ZENCRFFUQWVGdzA1T0RBNE1EUXdOelUzTURCYUZ3MHdNekE0TURReU16VTVNREJhTUZFeAorQ3pBSkJnTlZCQVlUQWtwUU1SOHdIUVlEVlFRS0V4WkRlV0psY2xSeWRYTjBJRXBoY0dGdUxDQkpibU11TVNFdworSHdZRFZRUURFeGhEZVdKbGNsUnlkWE4wSUVwQlVFRk9JRkp2YjNRZ1EwRXdnWjh3RFFZSktvWklodmNOQVFFQgorQlFBRGdZMEFNSUdKQW9HQkFMZXQvTXBIRUhhSi9XZXM1SE1HZklGTEhkYTFmQTVIcit5bVZIV294UDFscitmSQorc2JGc05EV045N2xrVnlnTElWcmVkUDdjZUM2R1JoSk1meEVmM0pPOVg3NW1tSWE0dCt4dFNkT1EyZUY1QUZabwordXExc0h5dzdIOGtzakVPd0JFTHFnWE9tempOMVJRMktSWEl2cWxkVjVBZkRRK0oxT2crOFBOQ0V6cnJ2QWdNQgorQUFFd0RRWUpLb1pJaHZjTkFRRUVCUUFEZ1lFQXQ2Wmtvd3lBUEJ6RTJPNUJPK1dHcEo1Z1hkWUJNcWhxWkMwZworY0VDNmNrNW0rZ2RsVGdPT0MvMVc0SzA3SUtjeStySVNIb0RmSHVONkdNeFgyK2JKTkdEdmRlc1FGdENrTG5EWQorSkNPNHBYZHpRdmtIT3QwQmJBaVRCelVtRUNWZ0tmOEo1V1NmYWJrV1NmTmMzU1JqUnBNTnNGTTJkYnhJSUxzWgordG8vUUl2MD0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDEgKDB4MCkKKyAgICAgICAgU2VyaWFsIE51bWJlcjogNzggKDB4NGUpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1KUCwgTz1DeWJlclRydXN0IEphcGFuLCBJbmMuLCBDTj1DeWJlclRydXN0IEpBUEFOIFJvb3QgQ0EKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IEF1ZyAgNCAwNzo1NzowMCAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogQXVnICA0IDIzOjU5OjAwIDIwMDMgR01UCisgICAgICAgIFN1YmplY3Q6IEM9SlAsIE89Q3liZXJUcnVzdCBKYXBhbiwgSW5jLiwgQ049Q3liZXJUcnVzdCBKQVBBTiBSb290IENBCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpiNzphZDpmYzpjYTo0NzoxMDo3Njo4OTpmZDo2NzphYzplNDo3MzowNjoKKyAgICAgICAgICAgICAgICAgICAgN2M6ODE6NGI6MWQ6ZDY6YjU6N2M6MGU6NDc6YWY6ZWM6YTY6NTQ6NzU6YTg6CisgICAgICAgICAgICAgICAgICAgIGM0OmZkOjY1OmFmOmU3OmM4OmIxOmIxOjZjOjM0OjM1OjhkOmY3OmI5OjY0OgorICAgICAgICAgICAgICAgICAgICA1NzoyODowYjoyMTo1YTpkZTo3NDpmZTpkYzo3ODoyZTo4Njo0NjoxMjo0YzoKKyAgICAgICAgICAgICAgICAgICAgN2Y6MTE6MWY6ZGM6OTM6YmQ6NWY6YmU6NjY6OTg6ODY6Yjg6Yjc6ZWM6NmQ6CisgICAgICAgICAgICAgICAgICAgIDQ5OmQzOjkwOmQ5OmUxOjc5OjAwOjU2OjY4OmJhOmFkOjZjOjFmOjJjOjNiOgorICAgICAgICAgICAgICAgICAgICAxZjpjOToyYzo4Yzo0MzpiMDowNDo0MjplYTo4MTo3MzphNjpjZTozMzo3NToKKyAgICAgICAgICAgICAgICAgICAgNDU6MGQ6OGE6NDU6NzI6MmY6YWE6NTc6NTU6ZTQ6MDc6YzM6NDM6ZTI6NzU6CisgICAgICAgICAgICAgICAgICAgIDNhOjBmOmJjOjNjOmQwOjg0OmNlOmJhOmVmCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIGI3OmE2OjY0OmEzOjBjOjgwOjNjOjFjOmM0OmQ4OmVlOjQxOjNiOmU1Ojg2OmE0OjllOjYwOgorICAgICAgICA1ZDpkNjowMTozMjphODo2YTo2NDoyZDoyMDo3MDo0MDpiYTo3Mjo0ZTo2NjpmYTowNzo2NToKKyAgICAgICAgNGU6MDM6OGU6MGI6ZmQ6NTY6ZTA6YWQ6M2I6MjA6YTc6MzI6ZmE6YjI6MTI6MWU6ODA6ZGY6CisgICAgICAgIDFlOmUzOjdhOjE4OmNjOjU3OmRiOmU2OmM5OjM0OjYwOmVmOjc1OmViOjEwOjE2OmQwOmE0OgorICAgICAgICAyZTo3MDpkODoyNDoyMzpiODphNTo3Nzo3Mzo0MjpmOTowNzozYTpkZDowMTo2YzowODo5MzoKKyAgICAgICAgMDc6MzU6MjY6MTA6MjU6NjA6Mjk6ZmY6MDk6ZTU6NjQ6OWY6Njk6Yjk6MTY6NDk6ZjM6NWM6CisgICAgICAgIGRkOjI0OjYzOjQ2OjkzOjBkOmIwOjUzOjM2Ojc1OmJjOjQ4OjIwOmJiOjE5OmI2OjhmOmQwOgorICAgICAgICAyMjpmZAorCitHVEUgQ3liZXJUcnVzdCBKYXBhbiBTZWN1cmUgU2VydmVyIENBCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IEREOjBEOjBEOkI0Ojc4OjRCOjdEOkNFOjMwOjBBOkE2OjM1OkM2OkFCOjRDOjg4CitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQ0l6Q0NBWXdDQVU4d0RRWUpLb1pJaHZjTkFRRUVCUUF3V2pFTE1Ba0dBMVVFQmhNQ1NsQXhIekFkQmdOVgorQkFvVEZrTjVZbVZ5VkhKMWMzUWdTbUZ3WVc0c0lFbHVZeTR4S2pBb0JnTlZCQU1USVVONVltVnlWSEoxYzNRZworU2tGUVFVNGdVMlZqZFhKbElGTmxjblpsY2lCRFFUQWVGdzA1T0RBNE1EUXdPREEyTXpKYUZ3MHdNekE0TURReQorTXpVNU1EQmFNRm94Q3pBSkJnTlZCQVlUQWtwUU1SOHdIUVlEVlFRS0V4WkRlV0psY2xSeWRYTjBJRXBoY0dGdQorTENCSmJtTXVNU293S0FZRFZRUURFeUZEZVdKbGNsUnlkWE4wSUVwQlVFRk9JRk5sWTNWeVpTQlRaWEoyWlhJZworUTBFd2daOHdEUVlKS29aSWh2Y05BUUVCQlFBRGdZMEFNSUdKQW9HQkFLd21vNkc0YjJyQUxCTDUyekVGa3VmOQorK3RTQnRMalZLdFdRK3ZCRFpmd1NGY3JzMjdsaDNqTmpOMCt2QUR4L2tqY2JHSFBsbnp5SThSb1RSUDU1OHNNbQorbFE4TDhKNFVCeUZzVjhKZHcrSlJzTTJMWDgxZmhqajRlWmM1N09pL1VpNnhYcXFwcm96dDd0Zkl0eTR4aTdRNQora2p0OGdTY0hHZ0ZFTDBseklMYkpBZ01CQUFFd0RRWUpLb1pJaHZjTkFRRUVCUUFEZ1lFQWFCMTdFdTVhZVNreAoreWdHc2kxQ3BKNWtzQVB3NEdoei93dFh3RS80YnB6bjFnQlRyVWZyQWpYdUVHMW11c1RWUmJxRSsxeHZzb0o3ZgorNEtXQ2x1T3hQOWlvOGN0NWdJNzM4RVNaZmhUMUk2TVI0MmhMQlRadWlPT3JocW80VXdOQ085TzUrZUMvQmVuVAorWDhOS3A3Yjl0MTJRU2ZpYXNxMW1wb0lBazY1Zy95QT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDEgKDB4MCkKKyAgICAgICAgU2VyaWFsIE51bWJlcjogNzkgKDB4NGYpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1KUCwgTz1DeWJlclRydXN0IEphcGFuLCBJbmMuLCBDTj1DeWJlclRydXN0IEpBUEFOIFNlY3VyZSBTZXJ2ZXIgQ0EKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IEF1ZyAgNCAwODowNjozMiAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogQXVnICA0IDIzOjU5OjAwIDIwMDMgR01UCisgICAgICAgIFN1YmplY3Q6IEM9SlAsIE89Q3liZXJUcnVzdCBKYXBhbiwgSW5jLiwgQ049Q3liZXJUcnVzdCBKQVBBTiBTZWN1cmUgU2VydmVyIENBCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDphYzoyNjphMzphMTpiODo2Zjo2YTpjMDoyYzoxMjpmOTpkYjozMTowNToKKyAgICAgICAgICAgICAgICAgICAgOTI6ZTc6ZmQ6ZmE6ZDQ6ODE6YjQ6Yjg6ZDU6MmE6ZDU6OTA6ZmE6ZjA6NDM6CisgICAgICAgICAgICAgICAgICAgIDY1OmZjOjEyOjE1OmNhOmVjOmRiOmI5OjYxOmRlOjMzOjYzOjM3OjRmOmFmOgorICAgICAgICAgICAgICAgICAgICAwMDozYzo3Zjo5MjozNzoxYjoxODo3MzplNTo5ZjozYzo4ODpmMToxYToxMzoKKyAgICAgICAgICAgICAgICAgICAgNDQ6ZmU6Nzk6ZjI6YzM6MjY6OTU6MGY6MGI6ZjA6OWU6MTQ6MDc6MjE6NmM6CisgICAgICAgICAgICAgICAgICAgIDU3OmMyOjVkOmMzOmUyOjUxOmIwOmNkOjhiOjVmOmNkOjVmOjg2OjM4OmY4OgorICAgICAgICAgICAgICAgICAgICA3OTo5NzozOTplYzplODpiZjo1MjoyZTpiMTo1ZTphYTphOTphZTo4YzplZDoKKyAgICAgICAgICAgICAgICAgICAgZWU6ZDc6Yzg6Yjc6MmU6MzE6OGI6YjQ6Mzk6OTI6M2I6N2M6ODE6Mjc6MDc6CisgICAgICAgICAgICAgICAgICAgIDFhOjAxOjQ0OjJmOjQ5OjczOjIwOmI2OmM5CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDY4OjFkOjdiOjEyOmVlOjVhOjc5OjI5OjMxOmNhOjAxOmFjOjhiOjUwOmE5OjI3Ojk5OjJjOgorICAgICAgICAwMDpmYzozODoxYToxYzpmZjpjMjpkNTpmMDoxMzpmZToxYjphNzozOTpmNTo4MDoxNDplYjoKKyAgICAgICAgNTE6ZmE6YzA6OGQ6N2I6ODQ6MWI6NTk6YWU6YjE6MzU6NTE6NmU6YTE6M2U6ZDc6MWI6ZWM6CisgICAgICAgIGEwOjllOmRmOmUwOmE1OjgyOjk2OmUzOmIxOjNmOmQ4OmE4OmYxOmNiOjc5OjgwOjhlOmY3OgorICAgICAgICBmMDo0NDo5OTo3ZToxNDpmNToyMzphMzoxMTplMzo2ODo0YjowNTozNjo2ZTo4ODplMzphYjoKKyAgICAgICAgODY6YWE6Mzg6NTM6MDM6NDI6M2I6ZDM6Yjk6Zjk6ZTA6YmY6MDU6ZTk6ZDM6NWY6YzM6NGE6CisgICAgICAgIGE3OmI2OmZkOmI3OjVkOjkwOjQ5OmY4OjlhOmIyOmFkOjY2OmE2OjgyOjAwOjkzOmFlOjYwOgorICAgICAgICBmZjoyMAorCitHVEUgQ3liZXJUcnVzdCBSb290IDIKKz09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiBCQTpFRDoxNzo1Nzo5QTo0QjpGRjo3QzpGOTpDOToxRjpBMjpDRDoxQTpENjo4NworUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUNVRENDQWJrQ0FnR2JNQTBHQ1NxR1NJYjNEUUVCQkFVQU1IQXhDekFKQmdOVkJBWVRBbFZUTVJnd0ZnWUQKK1ZRUUtFdzlIVkVVZ1EyOXljRzl5WVhScGIyNHhKekFsQmdOVkJBc1RIa2RVUlNCRGVXSmxjbFJ5ZFhOMElGTnYKK2JIVjBhVzl1Y3l3Z1NXNWpMakVlTUJ3R0ExVUVBeE1WUjFSRklFTjVZbVZ5VkhKMWMzUWdVbTl2ZENBeU1CNFgKK0RUazRNRGd4TVRFeE16VXdOMW9YRFRBNE1EZ3hNVEV4TWpJeE5sb3djREVMTUFrR0ExVUVCaE1DVlZNeEdEQVcKK0JnTlZCQW9URDBkVVJTQkRiM0p3YjNKaGRHbHZiakVuTUNVR0ExVUVDeE1lUjFSRklFTjVZbVZ5VkhKMWMzUWcKK1UyOXNkWFJwYjI1ekxDQkpibU11TVI0d0hBWURWUVFERXhWSFZFVWdRM2xpWlhKVWNuVnpkQ0JTYjI5MElESXcKK2daOHdEUVlKS29aSWh2Y05BUUVCQlFBRGdZMEFNSUdKQW9HQkFOa3NURTR2YVJvajQxYTY4ODZFd0FuQWVmRkUKK1h6TWZGWkYvaW9nb3VDUkZ6SThZelI5MDBiV1BjVXpXTWZaemxvU1VRTVdwZzJBa2ZhOXZOTGRMVE1JSmdEdEYKK0JKN0VQTVFuZFhzQURLRmtSN1VVWFlKTFVUcFl1MFJNUGRQbEJqam9ZVnlZZUx1QXM1emFjb0ppb04rY1grdjUKK1QzZkN6R0FZQUdzMGdpV3pBZ01CQUFFd0RRWUpLb1pJaHZjTkFRRUVCUUFEZ1lFQW8yU1JieER0NTI2aVFrQ1UKK2VNNzRGQWpSK2tPRjYwYk5raFRRN3k0dE5qa1kyYnJKSjRncDZVZ1hiL2pCcXNoaGJTMzlRQzExUXpDWE9mZ1UKK1pMMXY3Mk9vSzBMZnNsb05KZXg3TjlqT2tTbUNGdm5vWXFMaGRzUUNmZDBsaTVqaDlnMWdqUFpaa0VCUlJOSEMKKyt4a2tIaGM1YTNRaEZUUFdWZGVDSG5Bc0o2Zz0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDEgKDB4MCkKKyAgICAgICAgU2VyaWFsIE51bWJlcjogNDExICgweDE5YikKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBPPUdURSBDb3Jwb3JhdGlvbiwgT1U9R1RFIEN5YmVyVHJ1c3QgU29sdXRpb25zLCBJbmMuLCBDTj1HVEUgQ3liZXJUcnVzdCBSb290IDIKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IEF1ZyAxMSAxMTozNTowNyAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogQXVnIDExIDExOjIyOjE2IDIwMDggR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89R1RFIENvcnBvcmF0aW9uLCBPVT1HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4sIENOPUdURSBDeWJlclRydXN0IFJvb3QgMgorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6ZDk6MmM6NGM6NGU6MmY6Njk6MWE6MjM6ZTM6NTY6YmE6ZjM6Y2U6ODQ6CisgICAgICAgICAgICAgICAgICAgIGMwOjA5OmMwOjc5OmYxOjQ0OjVmOjMzOjFmOjE1OjkxOjdmOjhhOjg4OjI4OgorICAgICAgICAgICAgICAgICAgICBiODoyNDo0NTpjYzo4ZjoxODpjZDoxZjo3NDpkMTpiNTo4Zjo3MTo0YzpkNjoKKyAgICAgICAgICAgICAgICAgICAgMzE6ZjY6NzM6OTY6ODQ6OTQ6NDA6YzU6YTk6ODM6NjA6MjQ6N2Q6YWY6NmY6CisgICAgICAgICAgICAgICAgICAgIDM0OmI3OjRiOjRjOmMyOjA5OjgwOjNiOjQ1OjA0OjllOmM0OjNjOmM0OjI3OgorICAgICAgICAgICAgICAgICAgICA3NTo3YjowMDowYzphMTo2NDo0NzpiNToxNDo1ZDo4Mjo0Yjo1MTozYTo1ODoKKyAgICAgICAgICAgICAgICAgICAgYmI6NDQ6NGM6M2Q6ZDM6ZTU6MDY6Mzg6ZTg6NjE6NWM6OTg6Nzg6YmI6ODA6CisgICAgICAgICAgICAgICAgICAgIGIzOjljOmRhOjcyOjgyOjYyOmEwOmRmOjljOjVmOmViOmY5OjRmOjc3OmMyOgorICAgICAgICAgICAgICAgICAgICBjYzo2MDoxODowMDo2YjozNDo4MjoyNTpiMworICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBhMzo2NDo5MTo2ZjoxMDplZDplNzo2ZTphMjo0Mjo0MDo5NDo3ODpjZTpmODoxNDowODpkMToKKyAgICAgICAgZmE6NDM6ODU6ZWI6NDY6Y2Q6OTI6MTQ6ZDA6ZWY6MmU6MmQ6MzY6Mzk6MTg6ZDk6YmE6Yzk6CisgICAgICAgIDI3Ojg4OjI5OmU5OjQ4OjE3OjZmOmY4OmMxOmFhOmM4OjYxOjZkOjJkOmZkOjQwOjJkOjc1OgorICAgICAgICA0MzozMDo5NzozOTpmODoxNDo2NDpiZDo2ZjplZjo2MzphODoyYjo0MjpkZjpiMjo1YTowZDoKKyAgICAgICAgMjU6ZWM6N2I6Mzc6ZDg6Y2U6OTE6Mjk6ODI6MTY6Zjk6ZTg6NjI6YTI6ZTE6NzY6YzQ6MDI6CisgICAgICAgIDdkOmRkOjI1OjhiOjk4OmUxOmY2OjBkOjYwOjhjOmY2OjU5OjkwOjQwOjUxOjQ0OmQxOmMyOgorICAgICAgICBmYjoxOToyNDoxZToxNzozOTo2Yjo3NDoyMToxNTozMzpkNjo1NTpkNzo4MjoxZTo3MDoyYzoKKyAgICAgICAgMjc6YTgKKworR1RFIEN5YmVyVHJ1c3QgUm9vdCAzCis9PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogREI6ODE6OTY6NTc6QUU6NjQ6NjE6RUY6Nzc6QTc6ODM6QzQ6NTE6MjQ6M0M6ODcKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlDVURDQ0Fia0NBZ0dYTUEwR0NTcUdTSWIzRFFFQkJRVUFNSEF4Q3pBSkJnTlZCQVlUQWxWVE1SZ3dGZ1lECitWUVFLRXc5SFZFVWdRMjl5Y0c5eVlYUnBiMjR4SnpBbEJnTlZCQXNUSGtkVVJTQkRlV0psY2xSeWRYTjBJRk52CitiSFYwYVc5dWN5d2dTVzVqTGpFZU1Cd0dBMVVFQXhNVlIxUkZJRU41WW1WeVZISjFjM1FnVW05dmRDQXpNQjRYCitEVGs0TURneE1ERTVOVGt3T0ZvWERUQTRNRGd4TURFNU16WXpPVm93Y0RFTE1Ba0dBMVVFQmhNQ1ZWTXhHREFXCitCZ05WQkFvVEQwZFVSU0JEYjNKd2IzSmhkR2x2YmpFbk1DVUdBMVVFQ3hNZVIxUkZJRU41WW1WeVZISjFjM1FnCitVMjlzZFhScGIyNXpMQ0JKYm1NdU1SNHdIQVlEVlFRREV4VkhWRVVnUTNsaVpYSlVjblZ6ZENCU2IyOTBJRE13CitnWjh3RFFZSktvWklodmNOQVFFQkJRQURnWTBBTUlHSkFvR0JBT0h6c1NzTHp0d1UyVFNYWWxBU1ZtT0VURlA2Cit3SVhQK3NIZEQ5NTVFMzlUKzZvT1lOM2lZci9HN2s2Wk5LcG9ReldaK0tQOTgyTzlBVlJxbnJJNmxpeDdlQ2pHCitXcldOR2hVWS9lT01McUpRQ1Z0eDFnMjFHQjhaamdRcGs1TjRxMThVNTNOQzhnTU1WNkliVURzTHUxbmdvRG9ECis3aWNiV2t5NXNBakt1UnFKQWdNQkFBRXdEUVlKS29aSWh2Y05BUUVGQlFBRGdZRUFoZXV0bENBRzZiS2lhenZ5CitadXZqUzdnU0pnWGw5SkdvM0lmY21QU1V3ZlJodmRXY2JGRnpsVjdRdmRmbVJkdzh6MGFFMWVlNTdPUm5ZMjRBCitLSGR4WFVvRjZibDhoc3pDUkx2ZUtVamE2dDI5RjU4ZFVRR282QlJlc1ZmMy85cVB6cFgrTGUweUVuZi9mR3BoCitsYTR4Y2dZSThQbnpEWTdpNzZoVFhaRURnOTQ9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAxICgweDApCisgICAgICAgIFNlcmlhbCBOdW1iZXI6IDQwNyAoMHgxOTcpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9VVMsIE89R1RFIENvcnBvcmF0aW9uLCBPVT1HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4sIENOPUdURSBDeWJlclRydXN0IFJvb3QgMworICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogQXVnIDEwIDE5OjU5OjA4IDE5OTggR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBBdWcgMTAgMTk6MzY6MzkgMjAwOCBHTVQKKyAgICAgICAgU3ViamVjdDogQz1VUywgTz1HVEUgQ29ycG9yYXRpb24sIE9VPUdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLiwgQ049R1RFIEN5YmVyVHJ1c3QgUm9vdCAzCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDplMTpmMzpiMToyYjowYjpjZTpkYzoxNDpkOTozNDo5Nzo2Mjo1MDoxMjoKKyAgICAgICAgICAgICAgICAgICAgNTY6NjM6ODQ6NGM6NTM6ZmE6YzA6ODU6Y2Y6ZmE6YzE6ZGQ6MGY6ZGU6Nzk6CisgICAgICAgICAgICAgICAgICAgIDEzOjdmOjUzOmZiOmFhOjBlOjYwOmRkOmUyOjYyOmJmOmM2OmVlOjRlOjk5OgorICAgICAgICAgICAgICAgICAgICAzNDphYTo2ODo0MzozNTo5OTpmODphMzpmZDpmMzo2MzpiZDowMTo1NDo2YToKKyAgICAgICAgICAgICAgICAgICAgOWU6YjI6M2E6OTY6MmM6N2I6Nzg6Mjg6YzY6NWE6YjU6OGQ6MWE6MTU6MTg6CisgICAgICAgICAgICAgICAgICAgIGZkOmUzOjhjOjJlOmEyOjUwOjA5OjViOjcxOmQ2OjBkOmI1OjE4OjFmOjE5OgorICAgICAgICAgICAgICAgICAgICA4ZTowNDoyOTo5Mzo5Mzo3ODphYjo1ZjoxNDplNzo3Mzo0MjpmMjowMzowYzoKKyAgICAgICAgICAgICAgICAgICAgNTc6YTI6MWI6NTA6M2I6MGI6YmI6NTk6ZTA6YTA6M2E6MDM6ZWU6Mjc6MWI6CisgICAgICAgICAgICAgICAgICAgIDVhOjRjOmI5OmIwOjA4OmNhOmI5OjFhOjg5CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA4NTplYjphZDo5NDoyMDowNjplOTpiMjphMjo2YjozYjpmMjo2NjplYjplMzo0YjpiODoxMjoKKyAgICAgICAgMjY6MDU6ZTU6ZjQ6OTE6YTg6ZGM6ODc6ZGM6OTg6ZjQ6OTQ6YzE6ZjQ6NjE6YmQ6ZDU6OWM6CisgICAgICAgIDZjOjUxOjczOjk1OjVlOmQwOmJkOmQ3OmU2OjQ1OmRjOjNjOmNmOjQ2Ojg0OmQ1OmU3OmI5OgorICAgICAgICBlYzplNDo2Nzo2Mzo2ZTowMDoyODo3Nzo3MTo1ZDo0YTowNTplOTpiOTo3Yzo4NjpjYzpjMjoKKyAgICAgICAgNDQ6YmI6ZGU6Mjk6NDg6ZGE6ZWE6ZGQ6YmQ6MTc6OWY6MWQ6NTE6MDE6YTg6ZTg6MTQ6NWU6CisgICAgICAgIGIxOjU3OmY3OmZmOmRhOjhmOmNlOjk1OmZlOjJkOmVkOjMyOjEyOjc3OmZmOjdjOjZhOjYxOgorICAgICAgICA5NTphZTozMTo3MjowNjowODpmMDpmOTpmMzowZDo4ZTplMjplZjphODo1Mzo1ZDo5MTowMzoKKyAgICAgICAgODM6ZGUKKworR1RFIEN5YmVyVHJ1c3QgUm9vdCA0Cis9PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogMzM6NDM6MDI6QjE6Qjk6RTA6NzM6QjE6QjE6MjA6Q0E6Q0I6Qzc6ODQ6MDM6NTAKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEVlRDQ0FqMENBZ0dvTUEwR0NTcUdTSWIzRFFFQkJRVUFNSEF4Q3pBSkJnTlZCQVlUQWxWVE1SZ3dGZ1lECitWUVFLRXc5SFZFVWdRMjl5Y0c5eVlYUnBiMjR4SnpBbEJnTlZCQXNUSGtkVVJTQkRlV0psY2xSeWRYTjBJRk52CitiSFYwYVc5dWN5d2dTVzVqTGpFZU1Cd0dBMVVFQXhNVlIxUkZJRU41WW1WeVZISjFjM1FnVW05dmRDQTBNQjRYCitEVGs0TURneE16RXpOVEV3TUZvWERURXpNRGd4TXpJek5Ua3dNRm93Y0RFTE1Ba0dBMVVFQmhNQ1ZWTXhHREFXCitCZ05WQkFvVEQwZFVSU0JEYjNKd2IzSmhkR2x2YmpFbk1DVUdBMVVFQ3hNZVIxUkZJRU41WW1WeVZISjFjM1FnCitVMjlzZFhScGIyNXpMQ0JKYm1NdU1SNHdIQVlEVlFRREV4VkhWRVVnUTNsaVpYSlVjblZ6ZENCU2IyOTBJRFF3CitnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDNm5TSnVmOXBtUERsQ3NhTXFiOVAzCit2SzZzTVZyWEVaQkh1WjBaTHZuekd5S2d3K0dudXNUOFhncVVTNWhhU3lia0gvVGM4LzZPaU54c0xYeDNoeVpRCit3RjVPcUNpaDZoZHBUMDNHQVE3YW1nMEdWaVlWdHFSZGVqV3ZqZTE0VW9iNU9LdXpBZFBhQlpheHRsQ3J3S0d1CitGMVA2UXprZ2NXVWoyMjNFdHUyWVJZUFgwdmJpcVd2NytYWE03OFdyY1pZMTZOK09rWnVvRUhVZnQ4NFRqbXV6CitsbmVYR3BFdnh5eHBtZkFQS21nQW1IWkVHNHdvMHV1TzlJTzBmNlFsWG13NzJjWm8xV0c0MUY0eEI3VmJrRFZTCitWM3NYSU8wdHVCNk9pRGsrVXN2ZjhGeXhaYnVsRXJTUVk3OXhuVExCMnI5UVNwVytCanJFSyt2Tm1IWkVUUXZsCitBZ01CQUFFd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFFT3ZISWZKU2JwbGlUUkpQT29ITzBlaWVkU2dPNUJzCiszbitvVk1Qb1RFQXl2TWpzSE9YWnJFQzYvSXcvd25PYzlHVHEzNm50VGx2SUFXRHVPVzFESi9OL3FnalMvazV2CitGREpOZmVRMGdLVTF4TlpHVUxRN29DMWxIMDlsZmpRb0xjQ25kbjB4eVEwekZ2WWdHU0FSVUxzRHpIQnRscmZ2CitUS2ZhTmhYUHUwM1VsdHlJVFd5WTdibHovaWhYb08xaytBcUJLWFAyOXBjeWh6bTBnZS9aVFJvSE5QZTZRalhlCitWOXhjMXZmRjZ3b25ESUdtd3RCb1R2MlNXMGlEOWhhS2p6WmI3VEZzUDBGNmNmZVNQekdrQ2tCTTg0YmlZY0U4CitTWUV0cGJqdnVwY1B2Q3NkbTRueTBvNGVUWWJ5d3F2MkxabkFHeW9Ob2JaUCtTeFlUVDE5TndvPQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMSAoMHgwKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiA0MjQgKDB4MWE4KQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBPPUdURSBDb3Jwb3JhdGlvbiwgT1U9R1RFIEN5YmVyVHJ1c3QgU29sdXRpb25zLCBJbmMuLCBDTj1HVEUgQ3liZXJUcnVzdCBSb290IDQKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IEF1ZyAxMyAxMzo1MTowMCAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogQXVnIDEzIDIzOjU5OjAwIDIwMTMgR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89R1RFIENvcnBvcmF0aW9uLCBPVT1HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4sIENOPUdURSBDeWJlclRydXN0IFJvb3QgNAorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDIwNDggYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDIwNDggYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6YmE6OWQ6MjI6NmU6N2Y6ZGE6NjY6M2M6Mzk6NDI6YjE6YTM6MmE6NmY6CisgICAgICAgICAgICAgICAgICAgIGQzOmY3OmJjOmFlOmFjOjMxOjVhOmQ3OjExOjkwOjQ3OmI5OjlkOjE5OjJlOgorICAgICAgICAgICAgICAgICAgICBmOTpmMzoxYjoyMjphMDpjMzplMTphNzpiYTpjNDpmYzo1ZTowYTo5NDo0YjoKKyAgICAgICAgICAgICAgICAgICAgOTg6NWE6NGI6MjY6ZTQ6MWY6ZjQ6ZGM6ZjM6ZmU6OGU6ODg6ZGM6NmM6MmQ6CisgICAgICAgICAgICAgICAgICAgIDdjOjc3Ojg3OjI2OjUwOmMwOjVlOjRlOmE4OjI4OmExOmVhOjE3OjY5OjRmOgorICAgICAgICAgICAgICAgICAgICA0ZDpjNjowMTowZTpkYTo5YTowZDowNjo1NjoyNjoxNTpiNjphNDo1ZDo3YToKKyAgICAgICAgICAgICAgICAgICAgMzU6YWY6OGQ6ZWQ6Nzg6NTI6ODY6Zjk6Mzg6YWI6YjM6MDE6ZDM6ZGE6MDU6CisgICAgICAgICAgICAgICAgICAgIDk2OmIxOmI2OjUwOmFiOmMwOmExOmFlOjE3OjUzOmZhOjQzOjM5OjIwOjcxOgorICAgICAgICAgICAgICAgICAgICA2NToyMzpkYjo2ZDpjNDpiNjplZDo5ODo0NTo4MzpkNzpkMjpmNjplMjphOToKKyAgICAgICAgICAgICAgICAgICAgNmI6ZmI6Zjk6NzU6Y2M6ZWY6YzU6YWI6NzE6OTY6MzU6ZTg6ZGY6OGU6OTE6CisgICAgICAgICAgICAgICAgICAgIDliOmE4OjEwOjc1OjFmOmI3OmNlOjEzOjhlOjZiOmIzOjk2Ojc3Ojk3OjFhOgorICAgICAgICAgICAgICAgICAgICA5MToyZjpjNzoyYzo2OTo5OTpmMDowZjoyYTo2ODowMDo5ODo3Njo0NDoxYjoKKyAgICAgICAgICAgICAgICAgICAgOGM6Mjg6ZDI6ZWI6OGU6ZjQ6ODM6YjQ6N2Y6YTQ6MjU6NWU6NmM6M2I6ZDk6CisgICAgICAgICAgICAgICAgICAgIGM2OjY4OmQ1OjYxOmI4OmQ0OjVlOjMxOjA3OmI1OjViOjkwOjM1OjUyOjU3OgorICAgICAgICAgICAgICAgICAgICA3YjoxNzoyMDplZDoyZDpiODoxZTo4ZTo4ODozOTozZTo1MjpjYjpkZjpmMDoKKyAgICAgICAgICAgICAgICAgICAgNWM6YjE6NjU6YmI6YTU6MTI6YjQ6OTA6NjM6YmY6NzE6OWQ6MzI6YzE6ZGE6CisgICAgICAgICAgICAgICAgICAgIGJmOjUwOjRhOjk1OmJlOjA2OjNhOmM0OjJiOmViOmNkOjk4Ojc2OjQ0OjRkOgorICAgICAgICAgICAgICAgICAgICAwYjplNQorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgNDM6YWY6MWM6ODc6Yzk6NDk6YmE6NjU6ODk6MzQ6NDk6M2M6ZWE6MDc6M2I6NDc6YTI6Nzk6CisgICAgICAgIGQ0OmEwOjNiOjkwOjZjOmRlOjdmOmE4OjU0OmMzOmU4OjRjOjQwOjMyOmJjOmM4OmVjOjFjOgorICAgICAgICBlNTpkOTphYzo0MDpiYTpmYzo4YzozZjpjMjo3Mzo5YzpmNDo2NDplYTpkZjphOTplZDo0ZToKKyAgICAgICAgNWI6Yzg6MDE6NjA6ZWU6Mzk6NmQ6NDM6Mjc6ZjM6N2Y6YWE6MDg6ZDI6ZmU6NGU6NmY6MTQ6CisgICAgICAgIDMyOjRkOjdkOmU0OjM0OjgwOmE1OjM1OmM0OmQ2OjQ2OjUwOmI0OjNiOmEwOjJkOjY1OjFmOgorICAgICAgICA0Zjo2NTo3ZTozNDoyODoyZDpjMDphNzo3Njo3ZDozMTpjOTowZDozMzoxNjpmNjoyMDoxOToKKyAgICAgICAgMjA6MTE6NTA6YmI6MDM6Y2M6NzA6NmQ6OTY6Yjc6ZWY6NGM6YTc6ZGE6MzY6MTU6Y2Y6YmI6CisgICAgICAgIDRkOmQ0Ojk2OmRjOjg4OjRkOjZjOjk4OmVkOmI5OjczOmZlOjI4OjU3OmEwOmVkOjY0OmY4OgorICAgICAgICAwYTo4MToyOTo3MzpmNjpmNjo5NzozMjo4NzozOTpiNDo4MTplZjpkOTo0ZDoxYTowNzozNDoKKyAgICAgICAgZjc6YmE6NDI6MzU6ZGU6NTc6ZGM6NWM6ZDY6Zjc6YzU6ZWI6MGE6Mjc6MGM6ODE6YTY6YzI6CisgICAgICAgIGQwOjY4OjRlOmZkOjkyOjViOjQ4OjgzOmY2OjE2OjhhOjhmOjM2OjViOmVkOjMxOjZjOjNmOgorICAgICAgICA0MTo3YTo3MTpmNzo5MjozZjozMTphNDowYTo0MDo0YzpmMzo4NjplMjo2MTpjMTozYzo0OToKKyAgICAgICAgODE6MmQ6YTU6Yjg6ZWY6YmE6OTc6MGY6YmM6MmI6MWQ6OWI6ODk6ZjI6ZDI6OGU6MWU6NGQ6CisgICAgICAgIDg2OmYyOmMyOmFiOmY2OjJkOjk5OmMwOjFiOjJhOjBkOmExOmI2OjRmOmY5OjJjOjU4OjRkOgorICAgICAgICAzZDo3ZDozNzowYQorCitHVEUgQ3liZXJUcnVzdCBSb290IDUKKz09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiA3RDo2Qzo4NjpFNDpGQzo0RDpEMTowQjowMDpCQToyMjpCQjo0RTo3Qzo2QTo4RQorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUR0akNDQXA2Z0F3SUJBZ0lDQWJZd0RRWUpLb1pJaHZjTkFRRUZCUUF3Y0RFTE1Ba0dBMVVFQmhNQ1ZWTXgKK0dEQVdCZ05WQkFvVEQwZFVSU0JEYjNKd2IzSmhkR2x2YmpFbk1DVUdBMVVFQ3hNZVIxUkZJRU41WW1WeVZISjEKK2MzUWdVMjlzZFhScGIyNXpMQ0JKYm1NdU1SNHdIQVlEVlFRREV4VkhWRVVnUTNsaVpYSlVjblZ6ZENCU2IyOTAKK0lEVXdIaGNOT1Rnd09ERTBNVFExTURBd1doY05NVE13T0RFME1qTTFPVEF3V2pCd01Rc3dDUVlEVlFRR0V3SlYKK1V6RVlNQllHQTFVRUNoTVBSMVJGSUVOdmNuQnZjbUYwYVc5dU1TY3dKUVlEVlFRTEV4NUhWRVVnUTNsaVpYSlUKK2NuVnpkQ0JUYjJ4MWRHbHZibk1zSUVsdVl5NHhIakFjQmdOVkJBTVRGVWRVUlNCRGVXSmxjbFJ5ZFhOMElGSnYKK2IzUWdOVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMd1NiaitLZkhxWEFld2UKK3V6bGFBdlI0UktKSUc0NTdTVko2dUh0SHM2K1VtMis3bHZvcmFtVmN1QnlVYzc2L2lRb2lnTzVYL0l3RnUzQ2YKK2x6a0UycU9IWEtqbHlxL0FNNXJWTjF4THJPU0EwS1lqWVB2OWNpNlVuY2ZPd2dReTczaGdYZTJ0aHc5RlpSNDgKK21ncWF2bDBkbWV6bjh0SEdlaGZaclp0VWxuL0VmR0MvaGFvVk5SMUEyaEc4N0ZRaEtDMGpvYWp3enkzTjNmeCsKK0QxN2haUWRXeXdlMDBsYm9YakhNR0dQRWh0SXRoYytUa3F0dC9tZzUrOTV6dlliNDVFWjY2cDhNeS9RWi9tTzgKKzBTeDdpRE0yOXVUaG5BeFRnV0FjMmk2cmxxa1dpQk5RbWJLOVZkOFZNSDdvNVpqN2NINXN0UWY4L0VhMzBPMDMKK2xuNHkvaUVDQXdFQUFhTmFNRmd3RWdZRFZSMFRBUUgvQkFnd0JnRUIvd0lCQlRBT0JnTlZIUThCQWY4RUJBTUMKK0FRWXdGd1lEVlIwZ0JCQXdEakFNQmdvcWhraUcrR01CQWdFRE1Ca0dBMVVkRGdRU0JCQjJDa2toT0V5ZjN2akUKK1NjZHhjWkdkTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFCQk90UVlXOXE0M2lFYzRZNEo1ZkZvTlAvZWx2UUgKKzlhYzg4NnhLc1p2Nmt2cWI3ZVl5SWFwS2RzWGNUempsMzlXRzVOWElkbjJZMTdITmowMjFrU05zaTRycjZuenYKK0ZKVEV4dkFmU2kweWNXTXJZNUVtQWdtMmdCM3Q0c3k0Zjl1SFk4amgwR3dtc1RVZFFHWVFHODJWVkJnellld1QKK1Q5b1Q5NW12UHREUGpxWnlvclBEQlpySkozMlN6SDVTamJPcmNHMmVpWjlONnhwMXdwaXExUUlXMXd5S3Z5WGsKKzZ5MjhtT2xZT0JsOHVUZisyK0taQ0hNR3g1ZURhbjBRQVM4eXVSY0ZTbVhtTDg2K1hsT21ndW1hVXdxRWRDMkQKK3lzaVVGblpmbEdFbzhJV25PYnZYaTltb3NoTWRWQWswSkgwZ2dYMW1mcUtRZEZ3UXhyM3NxeHZDCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAzICgweDIpCisgICAgICAgIFNlcmlhbCBOdW1iZXI6IDQzOCAoMHgxYjYpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9VVMsIE89R1RFIENvcnBvcmF0aW9uLCBPVT1HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4sIENOPUdURSBDeWJlclRydXN0IFJvb3QgNQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogQXVnIDE0IDE0OjUwOjAwIDE5OTggR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBBdWcgMTQgMjM6NTk6MDAgMjAxMyBHTVQKKyAgICAgICAgU3ViamVjdDogQz1VUywgTz1HVEUgQ29ycG9yYXRpb24sIE9VPUdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLiwgQ049R1RFIEN5YmVyVHJ1c3QgUm9vdCA1CisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMjA0OCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMjA0OCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpiYzoxMjo2ZTozZjo4YTo3Yzo3YTo5NzowMTplYzoxZTpiYjozOTo1YToKKyAgICAgICAgICAgICAgICAgICAgMDI6ZjQ6Nzg6NDQ6YTI6NDg6MWI6OGU6N2I6NDk6NTI6N2E6Yjg6N2I6NDc6CisgICAgICAgICAgICAgICAgICAgIGIzOmFmOjk0OjliOjZmOmJiOjk2OmZhOjJiOjZhOjY1OjVjOmI4OjFjOjk0OgorICAgICAgICAgICAgICAgICAgICA3MzpiZTpiZjo4OTowYToyMjo4MDplZTo1NzpmYzo4YzowNTpiYjo3MDo5ZjoKKyAgICAgICAgICAgICAgICAgICAgOTc6Mzk6MDQ6ZGE6YTM6ODc6NWM6YTg6ZTU6Y2E6YWY6YzA6MzM6OWE6ZDU6CisgICAgICAgICAgICAgICAgICAgIDM3OjVjOjRiOmFjOmU0OjgwOmQwOmE2OjIzOjYwOmZiOmZkOjcyOjJlOjk0OgorICAgICAgICAgICAgICAgICAgICA5ZDpjNzpjZTpjMjowNDozMjplZjo3ODo2MDo1ZDplZDphZDo4NzowZjo0NToKKyAgICAgICAgICAgICAgICAgICAgNjU6MWU6M2M6OWE6MGE6OWE6YmU6NWQ6MWQ6OTk6ZWM6ZTc6ZjI6ZDE6YzY6CisgICAgICAgICAgICAgICAgICAgIDdhOjE3OmQ5OmFkOjliOjU0Ojk2OjdmOmM0OjdjOjYwOmJmOjg1OmFhOjE1OgorICAgICAgICAgICAgICAgICAgICAzNToxZDo0MDpkYToxMTpiYzplYzo1NDoyMToyODoyZDoyMzphMTphODpmMDoKKyAgICAgICAgICAgICAgICAgICAgY2Y6MmQ6Y2Q6ZGQ6ZmM6N2U6MGY6NWU6ZTE6NjU6MDc6NTY6Y2I6MDc6YjQ6CisgICAgICAgICAgICAgICAgICAgIGQyOjU2OmU4OjVlOjMxOmNjOjE4OjYzOmM0Ojg2OmQyOjJkOjg1OmNmOjkzOgorICAgICAgICAgICAgICAgICAgICA5MjphYjo2ZDpmZTo2ODozOTpmYjpkZTo3MzpiZDo4NjpmODplNDo0Njo3YToKKyAgICAgICAgICAgICAgICAgICAgZWE6OWY6MGM6Y2I6ZjQ6MTk6ZmU6NjM6YmM6ZDE6MmM6N2I6ODg6MzM6MzY6CisgICAgICAgICAgICAgICAgICAgIGY2OmU0OmUxOjljOjBjOjUzOjgxOjYwOjFjOmRhOjJlOmFiOjk2OmE5OjE2OgorICAgICAgICAgICAgICAgICAgICA4ODoxMzo1MDo5OTpiMjpiZDo1NTpkZjoxNTozMDo3ZTplODplNTo5ODpmYjoKKyAgICAgICAgICAgICAgICAgICAgNzA6N2U6NmM6YjU6MDc6ZmM6ZmM6NDY6Yjc6ZDA6ZWQ6Mzc6OTY6N2U6MzI6CisgICAgICAgICAgICAgICAgICAgIGZlOjIxCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogY3JpdGljYWwKKyAgICAgICAgICAgICAgICBDQTpUUlVFLCBwYXRobGVuOjUKKyAgICAgICAgICAgIFg1MDl2MyBLZXkgVXNhZ2U6IGNyaXRpY2FsCisgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUgU2lnbiwgQ1JMIFNpZ24KKyAgICAgICAgICAgIFg1MDl2MyBDZXJ0aWZpY2F0ZSBQb2xpY2llczogCisgICAgICAgICAgICAgICAgUG9saWN5OiAxLjIuODQwLjExMzc2My4xLjIuMS4zCisKKyAgICAgICAgICAgIFg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICA3NjowQTo0OToyMTozODo0Qzo5RjpERTpGODpDNDo0OTpDNzo3MTo3MTo5MTo5RAorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA0MTozYTpkNDoxODo1YjpkYTpiODpkZToyMToxYzplMTo4ZTowOTplNTpmMTo2ODozNDpmZjoKKyAgICAgICAgZGU6OTY6ZjQ6MDc6ZjU6YTc6M2M6ZjM6YWM6NGE6YjE6OWI6ZmE6OTI6ZmE6OWI6ZWQ6ZTY6CisgICAgICAgIDMyOjIxOmFhOjRhOjc2OmM1OmRjOjRmOjM4OmU1OmRmOmQ1Ojg2OmU0OmQ1OmM4Ojc2OjdkOgorICAgICAgICA5ODpkNzpiMTpjZDo4Zjo0ZDpiNTo5MToyMzo2Yzo4Yjo4YTplYjplYTo3YzplZjoxNDo5NDoKKyAgICAgICAgYzQ6YzY6ZjA6MWY6NGE6MmQ6MzI6NzE6NjM6MmI6NjM6OTE6MjY6MDI6MDk6YjY6ODA6MWQ6CisgICAgICAgIGVkOmUyOmNjOmI4OjdmOmRiOjg3OjYzOmM4OmUxOmQwOjZjOjI2OmIxOjM1OjFkOjQwOjY2OgorICAgICAgICAxMDoxYjpjZDo5NTo1NDoxODozMzo2MTplYzoxMzo0ZjpkYToxMzpmNzo5OTphZjozZTpkMDoKKyAgICAgICAgY2Y6OGU6YTY6NzI6YTI6YjM6YzM6MDU6OWE6Yzk6Mjc6N2Q6OTI6Y2M6N2U6NTI6OGQ6YjM6CisgICAgICAgIGFiOjcwOjZkOjllOjg5OjlmOjRkOmViOjFhOjc1OmMyOjk4OmFhOmQ1OjAyOjE2OmQ3OjBjOgorICAgICAgICA4YTpiZjoyNTplNDplYjoyZDpiYzo5ODplOTo1ODozODoxOTo3YzpiOTozNzpmZTpkYjplMjoKKyAgICAgICAgOTk6MDg6NzM6MDY6Yzc6OTc6ODM6NmE6N2Q6MTA6MDE6MmY6MzI6Yjk6MTc6MDU6NGE6NjU6CisgICAgICAgIGU2OjJmOmNlOmJlOjVlOjUzOmE2OjgyOmU5OjlhOjUzOjBhOjg0Ojc0OjJkOjgzOmNhOmM4OgorICAgICAgICA5NDoxNjo3Njo1Zjo5NDo2MToyODpmMDo4NTphNzozOTpiYjpkNzo4YjpkOTphODpiMjoxMzoKKyAgICAgICAgMWQ6NTQ6MDk6MzQ6MjQ6N2Q6MjA6ODE6N2Q6NjY6N2U6YTI6OTA6NzQ6NWM6MTA6YzY6YmQ6CisgICAgICAgIGVjOmFiOjFiOmMyCisKK0dURSBDeWJlclRydXN0IFJvb3QgQ0EKKz09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogQzQ6RDc6RjA6QjI6QTM6QzU6N0Q6NjE6Njc6RjA6MDQ6Q0Q6NDM6RDM6QkE6NTgKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlCK2pDQ0FXTUNBZ0dqTUEwR0NTcUdTSWIzRFFFQkJBVUFNRVV4Q3pBSkJnTlZCQVlUQWxWVE1SZ3dGZ1lECitWUVFLRXc5SFZFVWdRMjl5Y0c5eVlYUnBiMjR4SERBYUJnTlZCQU1URTBkVVJTQkRlV0psY2xSeWRYTjBJRkp2CitiM1F3SGhjTk9UWXdNakl6TWpNd01UQXdXaGNOTURZd01qSXpNak0xT1RBd1dqQkZNUXN3Q1FZRFZRUUdFd0pWCitVekVZTUJZR0ExVUVDaE1QUjFSRklFTnZjbkJ2Y21GMGFXOXVNUnd3R2dZRFZRUURFeE5IVkVVZ1EzbGlaWEpVCitjblZ6ZENCU2IyOTBNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0JnUUM0NWsrNjI1aDhjWHl2CitSTGZURDBiWlpPV1R3VUtPeDdwSmpUVXRldWVMdmVVRk1WbkdzUzhLRFB1ZnB6K2lDV2FFVmg0M0tSdUg2WDRNCit5cHFmcFgvMUZaU2oxYUpHZ3Rob1RORTNGUVpvcjczNHNMUHdLZldWV2drV1lYY0tJaVhVVDBXcXg3M2xsdC81CisxS2lPUXN3a3dCNlJKMHExYlFhQVl6bkVvbDQ0QXdJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQkFVQUE0R0JBQkt6CitkY1pmSGVGaFZZQUExSUZMZXpFUEkyUG5QZk1EK2ZRMnFMdlo0NldYVGVvcktlRFdhbk9CNXNDSm85UHg0S1dsCitJamVhWThKSUlMVGJjdVBJOXRsOHZyR3ZVOW9VdENHNDF0V1c0LzVPREZsaXRwcEsrVUxkakcrQnFYSC85QXB5CitiVzFFRHAzemRIU28xVFJKNlY2ZTZiUjY0ZVZhSDRRd25OT2ZwU1hZCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAxICgweDApCisgICAgICAgIFNlcmlhbCBOdW1iZXI6IDQxOSAoMHgxYTMpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1VUywgTz1HVEUgQ29ycG9yYXRpb24sIENOPUdURSBDeWJlclRydXN0IFJvb3QKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IEZlYiAyMyAyMzowMTowMCAxOTk2IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogRmViIDIzIDIzOjU5OjAwIDIwMDYgR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89R1RFIENvcnBvcmF0aW9uLCBDTj1HVEUgQ3liZXJUcnVzdCBSb290CisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpiODplNjo0ZjpiYTpkYjo5ODo3Yzo3MTo3YzphZjo0NDpiNzpkMzowZjoKKyAgICAgICAgICAgICAgICAgICAgNDY6ZDk6NjQ6ZTU6OTM6YzE6NDI6OGU6Yzc6YmE6NDk6OGQ6MzU6MmQ6N2E6CisgICAgICAgICAgICAgICAgICAgIGU3OjhiOmJkOmU1OjA1OjMxOjU5OmM2OmIxOjJmOjBhOjBjOmZiOjlmOmE3OgorICAgICAgICAgICAgICAgICAgICAzZjphMjowOTo2Njo4NDo1NjoxZTozNzoyOToxYjo4NzplOTo3ZTowYzpjYToKKyAgICAgICAgICAgICAgICAgICAgOWE6OWY6YTU6N2Y6ZjU6MTU6OTQ6YTM6ZDU6YTI6NDY6ODI6ZDg6Njg6NGM6CisgICAgICAgICAgICAgICAgICAgIGQxOjM3OjE1OjA2OjY4OmFmOmJkOmY4OmIwOmIzOmYwOjI5OmY1Ojk1OjVhOgorICAgICAgICAgICAgICAgICAgICAwOToxNjo2MTo3NzowYToyMjoyNTpkNDo0Zjo0NTphYTpjNzpiZDplNTo5NjoKKyAgICAgICAgICAgICAgICAgICAgZGY6Zjk6ZDQ6YTg6OGU6NDI6Y2M6MjQ6YzA6MWU6OTE6Mjc6NGE6YjU6NmQ6CisgICAgICAgICAgICAgICAgICAgIDA2OjgwOjYzOjM5OmM0OmEyOjVlOjM4OjAzCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDEyOmIzOjc1OmM2OjVmOjFkOmUxOjYxOjU1OjgwOjAwOmQ0OjgxOjRiOjdiOjMxOjBmOjIzOgorICAgICAgICA2MzplNzozZDpmMzowMzpmOTpmNDozNjphODpiYjpkOTplMzphNTo5Nzo0ZDplYToyYjoyOToKKyAgICAgICAgZTA6ZDY6NmE6NzM6ODE6ZTY6YzA6ODk6YTM6ZDM6ZjE6ZTA6YTU6YTU6MjI6Mzc6OWE6NjM6CisgICAgICAgIGMyOjQ4OjIwOmI0OmRiOjcyOmUzOmM4OmY2OmQ5OjdjOmJlOmIxOmFmOjUzOmRhOjE0OmI0OgorICAgICAgICAyMTpiODpkNjpkNTo5NjplMzpmZTo0ZTowYzo1OTo2MjpiNjo5YTo0YTpmOTo0MjpkZDo4YzoKKyAgICAgICAgNmY6ODE6YTk6NzE6ZmY6ZjQ6MGE6NzI6NmQ6NmQ6NDQ6MGU6OWQ6ZjM6NzQ6NzQ6YTg6ZDU6CisgICAgICAgIDM0OjQ5OmU5OjVlOjllOmU5OmI0OjdhOmUxOmU1OjVhOjFmOjg0OjMwOjljOmQzOjlmOmE1OgorICAgICAgICAyNTpkOAorCitHbG9iYWxTaWduIFBhcnRuZXJzIENBCis9PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IDNDOjc1OkNEOjRDOkJEOkE5OkQwOjhBOjc5OjRGOjUwOjE2OjM3Ojg0OkY0OjJCCitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRG5qQ0NBb2FnQXdJQkFnSUxBZ0FBQUFBQTFuaTUwYTh3RFFZSktvWklodmNOQVFFRUJRQXdWekVMTUFrRworQTFVRUJoTUNRa1V4R1RBWEJnTlZCQW9URUVkc2IySmhiRk5wWjI0Z2JuWXRjMkV4RURBT0JnTlZCQXNUQjFKdgorYjNRZ1EwRXhHekFaQmdOVkJBTVRFa2RzYjJKaGJGTnBaMjRnVW05dmRDQkRRVEFlRncwNU9UQXhNamd4TWpBdworTURCYUZ3MHdPVEF4TWpneE1qQXdNREJhTUY4eEN6QUpCZ05WQkFZVEFrSkZNUmt3RndZRFZRUUtFeEJIYkc5aQorWVd4VGFXZHVJRzUyTFhOaE1SUXdFZ1lEVlFRTEV3dFFZWEowYm1WeWN5QkRRVEVmTUIwR0ExVUVBeE1XUjJ4dgorWW1Gc1UybG5iaUJRWVhKMGJtVnljeUJEUVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQworZ2dFQkFOSXMrREtzU2hKNk44Z3BrYVd1akc0ZURzQTBNNGpsTTNFV0hIaUVhTU1ZTkZBdUZqNnhsSUpQc1pxZgorQVBqR0VUWEdhWHVZQXEwQUJvaHM1MHd6S0FDSUowWWZoN054ZFdPOE1ydUkzbVlZRGxBR2s3VDJ2QlEzTUQwaQorM3ozL2RYN1pDaHJGbjdQODBLeXpDSHFKMHdIb0FGem5TZ3M5VFhzbW9yZGlCb3ZhUnQyVEZ6OC9Xd0pMQzdhSQorSUJHU0FLMjd4eTdVNDBXdTlZbGFmSTJrcllWa01zQW5qTWJ5aW9DU2hpUldXWTEwYUtLRFFyT2VQVkJCaG04ZworYnZiOXp0TVo0ekxNaisyYVhtMGZLUFZTckc0WVh2ZzkwWkxsdW13QmlFc0s4aTNlWlRNRlFxQk1xakYydnYyLworZ1hqNWNSeEdYaTBWbFMwd1dZNU1RZEZpcXowQ0F3RUFBYU5qTUdFd0RnWURWUjBQQVFIL0JBUURBZ0FHTUIwRworQTFVZERnUVdCQlJESkkxd0ZRaGlWWnhQREVBWFhZWmVENkpNK3pBZkJnTlZIU01FR0RBV2dCUmdlMllhUlEyWAoreW9sUUwzMEV6VFNvLy96OVN6QVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BMEdDU3FHU0liM0RRRUJCQVVBQTRJQgorQVFCbTdiU0lhUkdaZ2lHRHJLRnRpNXVFclE4dHlCNk15bnQrcmFyVWp0NEgxcDVGeDZXNG5BYzVZQ1ZWR3NCUAorR2VYUEZ5bEppUmcxWnVYcktFQk9WOG12cytTNElBV2pPNVZRa1VtVUtYMHM1WWhCcFVXSVhwMkNKL2ZTNzF1MQorVDUrKy9qVmxMRlZrbitGUjJpSmhkN3BZVG8vR2VWbFpiakNBb2srUWJpRUxyZEJvT1pBUW0rMGlaVzhlRVRqbQorZjR6Uzh6bHRSOVVoNk9wMU9rSFJyZllXblYwTEliM3pIMk1HSlIzQkh6VnhMT3NnR2RYQnNPdzk1Vy90QWdjLworRTN0bWt0WkV3WmozWDFDTGVsdkNiMjJ3MGZqbGRLQkFONk1sRCtROXltUXhrNUJjTUh1NU9UR2FYa3pOdVVGUAorVU9ROU9LN0ladG5ITzExUlI2eWJxL0t0CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAzICgweDIpCisgICAgICAgIFNlcmlhbCBOdW1iZXI6CisgICAgICAgICAgICAwMjowMDowMDowMDowMDowMDpkNjo3ODpiOTpkMTphZgorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9QkUsIE89R2xvYmFsU2lnbiBudi1zYSwgT1U9Um9vdCBDQSwgQ049R2xvYmFsU2lnbiBSb290IENBCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBKYW4gMjggMTI6MDA6MDAgMTk5OSBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEphbiAyOCAxMjowMDowMCAyMDA5IEdNVAorICAgICAgICBTdWJqZWN0OiBDPUJFLCBPPUdsb2JhbFNpZ24gbnYtc2EsIE9VPVBhcnRuZXJzIENBLCBDTj1HbG9iYWxTaWduIFBhcnRuZXJzIENBCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMjA0OCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMjA0OCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpkMjoyYzpmODozMjphYzo0YToxMjo3YTozNzpjODoyOTo5MTphNTphZToKKyAgICAgICAgICAgICAgICAgICAgOGM6NmU6MWU6MGU6YzA6MzQ6MzM6ODg6ZTU6MzM6NzE6MTY6MWM6Nzg6ODQ6CisgICAgICAgICAgICAgICAgICAgIDY4OmMzOjE4OjM0OjUwOjJlOjE2OjNlOmIxOjk0OjgyOjRmOmIxOjlhOjlmOgorICAgICAgICAgICAgICAgICAgICAwMDpmODpjNjoxMTozNTpjNjo2OTo3Yjo5ODowMjphZDowMDowNjo4ODo2YzoKKyAgICAgICAgICAgICAgICAgICAgZTc6NGM6MzM6Mjg6MDA6ODg6Mjc6NDY6MWY6ODc6YjM6NzE6NzU6NjM6YmM6CisgICAgICAgICAgICAgICAgICAgIDMyOmJiOjg4OmRlOjY2OjE4OjBlOjUwOjA2OjkzOmI0OmY2OmJjOjE0OjM3OgorICAgICAgICAgICAgICAgICAgICAzMDozZDoyMjpkZjozZDpmZjo3NTo3ZTpkOTowYToxYTpjNTo5ZjpiMzpmYzoKKyAgICAgICAgICAgICAgICAgICAgZDA6YWM6YjM6MDg6N2E6ODk6ZDM6MDE6ZTg6MDA6NWM6ZTc6NGE6MGI6M2Q6CisgICAgICAgICAgICAgICAgICAgIDRkOjdiOjI2OmEyOmI3OjYyOjA2OjhiOmRhOjQ2OmRkOjkzOjE3OjNmOjNmOgorICAgICAgICAgICAgICAgICAgICA1YjowMjo0YjowYjpiNjo4ODoyMDoxMTo5MjowMDphZDpiYjpjNzoyZTpkNDoKKyAgICAgICAgICAgICAgICAgICAgZTM6NDU6YWU6ZjU6ODk6NWE6N2M6OGQ6YTQ6YWQ6ODU6NjQ6MzI6YzA6Mjc6CisgICAgICAgICAgICAgICAgICAgIDhjOmM2OmYyOjhhOjgwOjkyOjg2OjI0OjU2OjU5OjhkOjc0OjY4OmEyOjgzOgorICAgICAgICAgICAgICAgICAgICA0MjpiMzo5ZTozZDo1MDo0MTo4Njo2ZjoyMDo2ZTpmNjpmZDpjZTpkMzoxOToKKyAgICAgICAgICAgICAgICAgICAgZTM6MzI6Y2M6OGY6ZWQ6OWE6NWU6NmQ6MWY6Mjg6ZjU6NTI6YWM6NmU6MTg6CisgICAgICAgICAgICAgICAgICAgIDVlOmY4OjNkOmQxOjkyOmU1OmJhOjZjOjAxOjg4OjRiOjBhOmYyOjJkOmRlOgorICAgICAgICAgICAgICAgICAgICA2NTozMzowNTo0MjphMDo0YzphYTozMTo3NjpiZTpmZDpiZjo4MTo3ODpmOToKKyAgICAgICAgICAgICAgICAgICAgNzE6MWM6NDY6NWU6MmQ6MTU6OTU6MmQ6MzA6NTk6OGU6NGM6NDE6ZDE6NjI6CisgICAgICAgICAgICAgICAgICAgIGFiOjNkCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIFg1MDl2MyBLZXkgVXNhZ2U6IGNyaXRpY2FsCisgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUgU2lnbiwgQ1JMIFNpZ24KKyAgICAgICAgICAgIFg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICA0MzoyNDo4RDo3MDoxNTowODo2Mjo1NTo5Qzo0RjowQzo0MDoxNzo1RDo4Njo1RTowRjpBMjo0QzpGQgorICAgICAgICAgICAgWDUwOXYzIEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAga2V5aWQ6NjA6N0I6NjY6MUE6NDU6MEQ6OTc6Q0E6ODk6NTA6MkY6N0Q6MDQ6Q0Q6MzQ6QTg6RkY6RkM6RkQ6NEIKKworICAgICAgICAgICAgWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzOiBjcml0aWNhbAorICAgICAgICAgICAgICAgIENBOlRSVUUKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA2NjplZDpiNDo4ODo2OToxMTo5OTo4MjoyMTo4MzphYzphMTo2ZDo4Yjo5Yjo4NDphZDowZjoKKyAgICAgICAgMmQ6Yzg6MWU6OGM6Y2E6N2I6N2U6YWQ6YWE6ZDQ6OGU6ZGU6MDc6ZDY6OWU6NDU6Yzc6YTU6CisgICAgICAgIGI4OjljOjA3OjM5OjYwOjI1OjU1OjFhOmMwOjRmOjE5OmU1OmNmOjE3OjI5OjQ5Ojg5OjE4OgorICAgICAgICAzNTo2NjplNTplYjoyODo0MDo0ZTo1NzpjOTphZjpiMzplNDpiODoyMDowNTphMzozYjo5NToKKyAgICAgICAgNTA6OTE6NDk6OTQ6Mjk6N2Q6MmM6ZTU6ODg6NDE6YTU6NDU6ODg6NWU6OWQ6ODI6Mjc6Zjc6CisgICAgICAgIGQyOmVmOjViOmI1OjRmOjlmOmJlOmZlOjM1OjY1OjJjOjU1OjY0OjlmOmUxOjUxOmRhOjIyOgorICAgICAgICA2MTo3NzpiYTo1ODo0ZTo4ZjpjNjo3OTo1OTo1OTo2ZTozMDo4MDphMjo0Zjo5MDo2ZToyMToKKyAgICAgICAgMGI6YWQ6ZDA6Njg6Mzk6OTA6MTA6OWI6ZWQ6MjI6NjU6NmY6MWU6MTE6Mzg6ZTY6N2Y6OGM6CisgICAgICAgIGQyOmYzOjM5OjZkOjQ3OmQ1OjIxOmU4OmVhOjc1OjNhOjQxOmQxOmFkOmY2OjE2OjlkOjVkOgorICAgICAgICAwYjoyMTpiZDpmMzoxZjo2MzowNjoyNToxZDpjMToxZjozNTo3MToyYzplYjoyMDoxOTpkNToKKyAgICAgICAgYzE6YjA6ZWM6M2Q6ZTU6NmY6ZWQ6MDI6MDc6M2Y6MTM6N2I6NjY6OTI6ZDY6NDQ6YzE6OTg6CisgICAgICAgIGY3OjVmOjUwOjhiOjdhOjViOmMyOjZmOjZkOmIwOmQxOmY4OmU1Ojc0OmEwOjQwOjM3OmEzOgorICAgICAgICAyNTowZjplNDozZDpjYTo2NDozMTo5Mzo5MDo1YzozMDo3YjpiOTozOTozMTo5YTo1ZTo0YzoKKyAgICAgICAgY2Q6Yjk6NDE6NGY6NTA6ZTQ6M2Q6Mzg6YWU6Yzg6NjY6ZDk6Yzc6M2I6NWQ6NTE6NDc6YWM6CisgICAgICAgIDliOmFiOmYyOmFkCisKK0dsb2JhbFNpZ24gUHJpbWFyeSBDbGFzcyAxIENBCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiA1QzpBQzo1OTowMTpBNDo4Njo1MzpDQjoxMDo2NjpCNTpENjpENjo3MTpGRjowMQorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURyRENDQXBTZ0F3SUJBZ0lMQWdBQUFBQUExbmk0Tjg4d0RRWUpLb1pJaHZjTkFRRUVCUUF3VnpFTE1Ba0cKK0ExVUVCaE1DUWtVeEdUQVhCZ05WQkFvVEVFZHNiMkpoYkZOcFoyNGdibll0YzJFeEVEQU9CZ05WQkFzVEIxSnYKK2IzUWdRMEV4R3pBWkJnTlZCQU1URWtkc2IySmhiRk5wWjI0Z1VtOXZkQ0JEUVRBZUZ3MDVPREE1TVRVeE1qQXcKK01EQmFGdzB3T1RBeE1qZ3hNakF3TURCYU1HMHhDekFKQmdOVkJBWVRBa0pGTVJrd0Z3WURWUVFLRXhCSGJHOWkKK1lXeFRhV2R1SUc1MkxYTmhNUnN3R1FZRFZRUUxFeEpRY21sdFlYSjVJRU5zWVhOeklERWdRMEV4SmpBa0JnTlYKK0JBTVRIVWRzYjJKaGJGTnBaMjRnVUhKcGJXRnllU0JEYkdGemN5QXhJRU5CTUlJQklqQU5CZ2txaGtpRzl3MEIKK0FRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXZTQTFSOUVvMWdpakVqa2pSdzI5Y0NGU0RsY3hsYVkwVjJ2c2ZrTjUKK3d3WlNTTTI4dGFHWnZkZ2ZNcnpQMTI1eWJTNTNJcENDVGt1UG1nd0JRcHJaY0ZtMm5SL21ZOUVNclIxTytJV0IKKythN3ZuNlpTWVVSNUduVkY0R0ZXUlcxQ2pEMXl5NmFrRXJlYTlkWmcwR0JRczQ2bXB1eTA5QkxOZjZqTzc3UGgKK2hURCtjc1RtNTNlem5saEIxbEdEaUFmR3RtbFBOdDdSQzBnL3ZkYWZJWFJrYnljR1BrdjlEcWFidjZSSVY0eVEKKzdva1lDd0tCR0w1bi9sTmdpQ2U2bzNNMFMxcFd0TjV6QmUyWWxsM3NTdWRBL0VzSll1dlE0ekZQaGRGNnExbG4KK0svdUlEK3VxZzcwMS9XRW43R1lPUWxmM2FjSU03L3hxd201SjJvOUJPSzVJcVFJREFRQUJvMk13WVRBT0JnTlYKK0hROEJBZjhFQkFNQ0FBWXdIUVlEVlIwT0JCWUVGUHpnWnZaYU5abnJRQjdTdUI1RHZKaU9INHJETUI4R0ExVWQKK0l3UVlNQmFBRkdCN1pocEZEWmZLaVZBdmZRVE5OS2ovL1AxTE1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUoKK0tvWklodmNOQVFFRUJRQURnZ0VCQUp1akNFVE84cENkY2ZNeXN3VnF0ZXJQS1pqZVZUNmdGbjBHZWtUV3I5TDYKK0UxaU0rQnpIcXgyMEcrOXBhSmhjQ0RtUDRQZjdTTXdoNTdnejJ3V3FOQ1JzU3VYcGUyRGVnN01mQ3I1QmRmek0KK01FaTN3U1lkQkRPcXRuanRLc3U2VnBjeWJ2Y3hsUzVHOGhUdUo4ZjNZb201WEZyVE9JcGs5VGUwOGJNMGN0WFYKK0lUMUwxM2lUMXpGbU5SNmoyRWRKYnh5dDRZQi8rSmdrYkhPc0RzSWFkd0tqSmdlM3gydGR2SUxWS2tnZFk4OVEKK01xYjdIQmhIRlFwYkRGdzRKSm9FbUtnSVNGOThOSWRqcXkyTlRBQjNsQnQydXZVV0dLTVZyeStVOWlrQWRzRVYKK0Y5UHBOMDEyMU10TEtWa2tyTnBLb09wajNsOVVzZnJ6MFVYTHhXUzBjeUU9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAzICgweDIpCisgICAgICAgIFNlcmlhbCBOdW1iZXI6CisgICAgICAgICAgICAwMjowMDowMDowMDowMDowMDpkNjo3ODpiODozNzpjZgorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9QkUsIE89R2xvYmFsU2lnbiBudi1zYSwgT1U9Um9vdCBDQSwgQ049R2xvYmFsU2lnbiBSb290IENBCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBTZXAgMTUgMTI6MDA6MDAgMTk5OCBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEphbiAyOCAxMjowMDowMCAyMDA5IEdNVAorICAgICAgICBTdWJqZWN0OiBDPUJFLCBPPUdsb2JhbFNpZ24gbnYtc2EsIE9VPVByaW1hcnkgQ2xhc3MgMSBDQSwgQ049R2xvYmFsU2lnbiBQcmltYXJ5IENsYXNzIDEgQ0EKKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgyMDQ4IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgyMDQ4IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmJkOjIwOjM1OjQ3OmQxOjI4OmQ2OjA4OmEzOjEyOjM5OjIzOjQ3OjBkOgorICAgICAgICAgICAgICAgICAgICBiZDo3MDoyMTo1MjowZTo1NzozMTo5NTphNjozNDo1Nzo2YjplYzo3ZTo0MzoKKyAgICAgICAgICAgICAgICAgICAgNzk6YzM6MDY6NTI6NDg6Y2Q6YmM6YjU6YTE6OTk6YmQ6ZDg6MWY6MzI6YmM6CisgICAgICAgICAgICAgICAgICAgIGNmOmQ3OjZlOjcyOjZkOjJlOjc3OjIyOjkwOjgyOjRlOjRiOjhmOjlhOjBjOgorICAgICAgICAgICAgICAgICAgICAwMTo0Mjo5YTpkOTo3MDo1OTpiNjo5ZDoxZjplNjo2MzpkMTowYzphZDoxZDoKKyAgICAgICAgICAgICAgICAgICAgNGU6Zjg6ODU6ODE6Zjk6YWU6ZWY6OWY6YTY6NTI6NjE6NDQ6Nzk6MWE6NzU6CisgICAgICAgICAgICAgICAgICAgIDQ1OmUwOjYxOjU2OjQ1OjZkOjQyOjhjOjNkOjcyOmNiOmE2OmE0OjEyOmI3OgorICAgICAgICAgICAgICAgICAgICA5YTpmNTpkNjo2MDpkMDo2MDo1MDpiMzo4ZTphNjphNjplYzpiNDpmNDoxMjoKKyAgICAgICAgICAgICAgICAgICAgY2Q6N2Y6YTg6Y2U6ZWY6YjM6ZTE6ODU6MzA6ZmU6NzI6YzQ6ZTY6ZTc6Nzc6CisgICAgICAgICAgICAgICAgICAgIGIzOjllOjU4OjQxOmQ2OjUxOjgzOjg4OjA3OmM2OmI2OjY5OjRmOjM2OmRlOgorICAgICAgICAgICAgICAgICAgICBkMTowYjo0ODozZjpiZDpkNjo5ZjoyMTo3NDo2NDo2ZjoyNzowNjozZTo0YjoKKyAgICAgICAgICAgICAgICAgICAgZmQ6MGU6YTY6OWI6YmY6YTQ6NDg6NTc6OGM6OTA6ZWU6ODk6MTg6MGI6MDI6CisgICAgICAgICAgICAgICAgICAgIDgxOjE4OmJlOjY3OmZlOjUzOjYwOjg4OjI3OmJhOmEzOjczOjM0OjRiOjVhOgorICAgICAgICAgICAgICAgICAgICA1NjpiNDpkZTo3MzowNTplZDo5ODo5Njo1ZDplYzo0YTplNzo0MDpmYzo0YjoKKyAgICAgICAgICAgICAgICAgICAgMDk6NjI6ZWI6ZDA6ZTM6MzE6NGY6ODU6ZDE6N2E6YWI6NTk6Njc6MmI6ZmI6CisgICAgICAgICAgICAgICAgICAgIDg4OjBmOmViOmFhOjgzOmJkOjM1OmZkOjYxOjI3OmVjOjY2OjBlOjQyOjU3OgorICAgICAgICAgICAgICAgICAgICBmNzo2OTpjMjowYzplZjpmYzo2YTpjMjo2ZTo0OTpkYTo4Zjo0MTozODphZToKKyAgICAgICAgICAgICAgICAgICAgNDg6YTkKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgICAgIFg1MDl2MyBleHRlbnNpb25zOgorICAgICAgICAgICAgWDUwOXYzIEtleSBVc2FnZTogY3JpdGljYWwKKyAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZSBTaWduLCBDUkwgU2lnbgorICAgICAgICAgICAgWDUwOXYzIFN1YmplY3QgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIEZDOkUwOjY2OkY2OjVBOjM1Ojk5OkVCOjQwOjFFOkQyOkI4OjFFOjQzOkJDOjk4OjhFOjFGOjhBOkMzCisgICAgICAgICAgICBYNTA5djMgQXV0aG9yaXR5IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICBrZXlpZDo2MDo3Qjo2NjoxQTo0NTowRDo5NzpDQTo4OTo1MDoyRjo3RDowNDpDRDozNDpBODpGRjpGQzpGRDo0QgorCisgICAgICAgICAgICBYNTA5djMgQmFzaWMgQ29uc3RyYWludHM6IGNyaXRpY2FsCisgICAgICAgICAgICAgICAgQ0E6VFJVRQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDliOmEzOjA4OjQ0OmNlOmYyOjkwOjlkOjcxOmYzOjMyOmIzOjA1OjZhOmI1OmVhOmNmOjI5OgorICAgICAgICA5ODpkZTo1NTozZTphMDoxNjo3ZDowNjo3YTo0NDpkNjphZjpkMjpmYToxMzo1ODo4YzpmODoKKyAgICAgICAgMWM6Yzc6YWI6MWQ6YjQ6MWI6ZWY6Njk6Njg6OTg6NWM6MDg6Mzk6OGY6ZTA6Zjc6ZmI6NDg6CisgICAgICAgIGNjOjIxOmU3OmI4OjMzOmRiOjA1OmFhOjM0OjI0OjZjOjRhOmU1OmU5OjdiOjYwOmRlOjgzOgorICAgICAgICBiMzoxZjowYTpiZTo0MTo3NTpmYzpjYzozMDo0ODpiNzpjMToyNjoxZDowNDozMzphYTpiNjoKKyAgICAgICAgNzg6ZWQ6MmE6Y2I6YmE6NTY6OTc6MzI6NmU6Zjc6MzE6OTU6MmU6NDY6ZjI6MTQ6ZWU6Mjc6CisgICAgICAgIGM3OmY3OjYyOjg5OmI5OjVjOjVhOmQzOjM4OjhhOjY0OmY1OjM3OmI0OmYxOmIzOjM0OjcyOgorICAgICAgICBkNTpkNToyMTozZDo0YjpkNzo3ODo5MzpkNzozMTo2NjozNToxZTphMzpkODo0Nzo0OTo2ZjoKKyAgICAgICAgMWM6YWQ6ZTE6ODA6N2Y6Zjg6OTg6MjQ6NmM6NzM6YWM6MGU6YzI6MWE6Nzc6MDI6YTM6MjY6CisgICAgICAgIDA3OmI3OmM3OjZiOjVkOmJjOjgyOmQ1OjJhOjQ4OjFkOjYzOmNmOjUwOjMyOmE2OmZiOjFjOgorICAgICAgICAxODo0NzoxNTowYTo1YjowYzo1YzozODoyNDo5YTowNDo5ODphODowODo0ODo1Zjo3YzozNDoKKyAgICAgICAgODc6NjM6YWI6MmQ6OGQ6NGM6MDA6Nzc6OTQ6MWI6NzY6YmE6ZjU6MTY6MTg6YTM6MTU6YWY6CisgICAgICAgIDJmOjk0OmY2OjI5OjAwOjc2OmMxOjE1OjE3OmQzOmU5OjM3OjRkOjc2OmQ0OmNiOjRiOjI5OgorICAgICAgICA1OToyNDphYzpkYTo0YTphMDplYTo2MzpkZTo1Zjo1NDpiMTpmYTpmMzpkMTo0NTpjYjpjNToKKyAgICAgICAgNjQ6YjQ6NzM6MjEKKworR2xvYmFsU2lnbiBQcmltYXJ5IENsYXNzIDIgQ0EKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IEE5OkE5OjQyOjU5OjdFOkJFOjVBOjk0OkU0OjJDOkM2OjhCOjFDOjJBOjQ0OkI2CitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRHJEQ0NBcFNnQXdJQkFnSUxBZ0FBQUFBQTFuaTRqWTB3RFFZSktvWklodmNOQVFFRUJRQXdWekVMTUFrRworQTFVRUJoTUNRa1V4R1RBWEJnTlZCQW9URUVkc2IySmhiRk5wWjI0Z2JuWXRjMkV4RURBT0JnTlZCQXNUQjFKdgorYjNRZ1EwRXhHekFaQmdOVkJBTVRFa2RzYjJKaGJGTnBaMjRnVW05dmRDQkRRVEFlRncwNU9UQXhNamd4TWpBdworTURCYUZ3MHdPVEF4TWpneE1qQXdNREJhTUcweEN6QUpCZ05WQkFZVEFrSkZNUmt3RndZRFZRUUtFeEJIYkc5aQorWVd4VGFXZHVJRzUyTFhOaE1Sc3dHUVlEVlFRTEV4SlFjbWx0WVhKNUlFTnNZWE56SURJZ1EwRXhKakFrQmdOVgorQkFNVEhVZHNiMkpoYkZOcFoyNGdVSEpwYldGeWVTQkRiR0Z6Y3lBeUlFTkJNSUlCSWpBTkJna3Foa2lHOXcwQgorQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBa296KzcvUkZqaGRCYnZ6WXZ5RnZxd2FkVXNFc0FKMC9qb1c0ZjBxUAordmFCaktzcEpKNjVhZ3ZSMDRsV1MvOExScW5taXR2clZuWUlFVDhheXhsNWpwenE2Mk83cmltK2Z0cnNvUWNBaQorKzA1SUdnYVMxNy9YejduWnZUaFBPdzFFYmxWQi92d0oyOWkvODQ0aDhlZ1N0ZllUcGRQR1RKTWlzQUwvN2gwTQoreEtoclQzVm9WdWpjS0JKUTk2Z2tuUzRrT2ZzSkJkN2xvMlJKSWRCb2ZuRXdrYkZnNERuMFVQaDZUWmdBYTN4NQordWs3T1N1SzZOaDIzeFRZVmxaeGtRdXBmeExyMVFBVys0VHBadllTbkdiamVUVk5RemdmUjBsSFQ3dzJCYk9ibgorYmN0ZGZEOTh6T3hQZ3ljbC8zQlE5b05aZFlRR1psZ3Mzb21OQUtaSithVkRkd0lEQVFBQm8yTXdZVEFPQmdOVgorSFE4QkFmOEVCQU1DQUFZd0hRWURWUjBPQkJZRUZIem5zckVzM3JHbmErbDJET0dqL1U1c3g3bjJNQjhHQTFVZAorSXdRWU1CYUFGR0I3WmhwRkRaZktpVkF2ZlFUTk5Lai8vUDFMTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSgorS29aSWh2Y05BUUVFQlFBRGdnRUJBR1BkV2M2S2VhcVluVTdGaVdRM2ZvcVRaeThRNm04bnc0MTNiZkpjVnBRWgorR21sZ01FWmRqL0p0UlR5T05aZDhMN2hSNHVpSnZZalBKeHdJTkZ5SXdXZ2syNUdGNU0vNyswT042Q1VCRzhRTworOXdCQ1NJWWZKQWhZV295TjhtdEhMR2lSc1dsQy9RMk55U2Jta29hbVpHNlN4YzQrUEgxeDR5T2txOGZWcUtuZgorZ3FjNzZJYlZ3MDhZNDBUUTROenp4V2d1L3FVdkJZVElma2RDVTJ1SFN2NHkvMTQrY0l5M3FCWE1GOEwvUnV6UQorN0MyMGJoSW9xZmxBNmV2VVpwZFRxV2xWd0ttcXNpN04wV24wdnZpN2ZHbnVWS2JibnZ0YXBqNyttdStVVVV0MQorN3RqVTRacnhBbFlUaVE2blFvdVdpNFVNRzRXK0pxNnJwcG04SXZGejMwST0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjoKKyAgICAgICAgICAgIDAyOjAwOjAwOjAwOjAwOjAwOmQ2Ojc4OmI4OjhkOjhkCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1CRSwgTz1HbG9iYWxTaWduIG52LXNhLCBPVT1Sb290IENBLCBDTj1HbG9iYWxTaWduIFJvb3QgQ0EKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IEphbiAyOCAxMjowMDowMCAxOTk5IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogSmFuIDI4IDEyOjAwOjAwIDIwMDkgR01UCisgICAgICAgIFN1YmplY3Q6IEM9QkUsIE89R2xvYmFsU2lnbiBudi1zYSwgT1U9UHJpbWFyeSBDbGFzcyAyIENBLCBDTj1HbG9iYWxTaWduIFByaW1hcnkgQ2xhc3MgMiBDQQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDIwNDggYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDIwNDggYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6OTI6OGM6ZmU6ZWY6ZjQ6NDU6OGU6MTc6NDE6NmU6ZmM6ZDg6YmY6MjE6CisgICAgICAgICAgICAgICAgICAgIDZmOmFiOjA2OjlkOjUyOmMxOjJjOjAwOjlkOjNmOjhlOjg1OmI4OjdmOjRhOgorICAgICAgICAgICAgICAgICAgICA4ZjpiZDphMDo2MzoyYTpjYTo0OToyNzphZTo1YTo4MjpmNDo3NDplMjo1NToKKyAgICAgICAgICAgICAgICAgICAgOTI6ZmY6YzI6ZDE6YWE6Nzk6YTI6YjY6ZmE6ZDU6OWQ6ODI6MDQ6NGY6YzY6CisgICAgICAgICAgICAgICAgICAgIGIyOmM2OjVlOjYzOmE3OjNhOmJhOmQ4OmVlOmViOjhhOjZmOjlmOmI2OmJiOgorICAgICAgICAgICAgICAgICAgICAyODo0MTpjMDoyMjpmYjo0ZTo0ODoxYTowNjo5MjpkNzpiZjpkNzpjZjpiOToKKyAgICAgICAgICAgICAgICAgICAgZDk6YmQ6Mzg6NGY6M2I6MGQ6NDQ6NmU6NTU6NDE6ZmU6ZmM6MDk6ZGI6ZDg6CisgICAgICAgICAgICAgICAgICAgIGJmOmYzOjhlOjIxOmYxOmU4OjEyOmI1OmY2OjEzOmE1OmQzOmM2OjRjOjkzOgorICAgICAgICAgICAgICAgICAgICAyMjpiMDowMjpmZjplZToxZDowYzpjNDphODo2Yjo0Zjo3NTo2ODo1NjplODoKKyAgICAgICAgICAgICAgICAgICAgZGM6Mjg6MTI6NTA6Zjc6YTg6MjQ6OWQ6MmU6MjQ6Mzk6ZmI6MDk6MDU6ZGU6CisgICAgICAgICAgICAgICAgICAgIGU1OmEzOjY0OjQ5OjIxOmQwOjY4OjdlOjcxOjMwOjkxOmIxOjYwOmUwOjM5OgorICAgICAgICAgICAgICAgICAgICBmNDo1MDpmODo3YTo0ZDo5ODowMDo2Yjo3Yzo3OTpiYTo0ZTpjZTo0YTplMjoKKyAgICAgICAgICAgICAgICAgICAgYmE6MzY6MWQ6Yjc6YzU6MzY6MTU6OTU6OWM6NjQ6NDI6ZWE6NWY6YzQ6YmE6CisgICAgICAgICAgICAgICAgICAgIGY1OjQwOjA1OmJlOmUxOjNhOjU5OmJkOjg0OmE3OjE5OmI4OmRlOjRkOjUzOgorICAgICAgICAgICAgICAgICAgICA1MDpjZTowNzpkMTpkMjo1MTpkMzplZjowZDo4MTo2YzplNjplNzo2ZDpjYjoKKyAgICAgICAgICAgICAgICAgICAgNWQ6N2M6M2Y6N2M6Y2M6ZWM6NGY6ODM6Mjc6MjU6ZmY6NzA6NTA6ZjY6ODM6CisgICAgICAgICAgICAgICAgICAgIDU5Ojc1Ojg0OjA2OjY2OjU4OjJjOmRlOjg5OjhkOjAwOmE2OjQ5OmY5OmE1OgorICAgICAgICAgICAgICAgICAgICA0Mzo3NworICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBYNTA5djMgS2V5IFVzYWdlOiBjcml0aWNhbAorICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIFNpZ24sIENSTCBTaWduCisgICAgICAgICAgICBYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAgN0M6RTc6QjI6QjE6MkM6REU6QjE6QTc6NkI6RTk6NzY6MEM6RTE6QTM6RkQ6NEU6NkM6Qzc6Qjk6RjYKKyAgICAgICAgICAgIFg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIGtleWlkOjYwOjdCOjY2OjFBOjQ1OjBEOjk3OkNBOjg5OjUwOjJGOjdEOjA0OkNEOjM0OkE4OkZGOkZDOkZEOjRCCisKKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogY3JpdGljYWwKKyAgICAgICAgICAgICAgICBDQTpUUlVFCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgNjM6ZGQ6NTk6Y2U6OGE6Nzk6YWE6OTg6OWQ6NGU6YzU6ODk6NjQ6Mzc6N2U6OGE6OTM6Njc6CisgICAgICAgIDJmOjEwOmVhOjZmOjI3OmMzOjhkOjc3OjZkOmYyOjVjOjU2Ojk0OjE5OjFhOjY5OjYwOjMwOgorICAgICAgICA0Njo1ZDo4ZjpmMjo2ZDo0NTozYzo4ZTozNTo5Nzo3YzoyZjpiODo1MTplMjplODo4OTpiZDoKKyAgICAgICAgODg6Y2Y6Mjc6MWM6MDg6MzQ6NWM6ODg6YzE6Njg6MjQ6ZGI6OTE6ODU6ZTQ6Y2Y6ZmI6ZmI6CisgICAgICAgIDQzOjhkOmU4OjI1OjAxOjFiOmM0OjBlOmY3OjAwOjQyOjQ4Ojg2OjFmOjI0OjA4OjU4OjVhOgorICAgICAgICA4Yzo4ZDpmMjo2Yjo0NzoyYzo2ODo5MTpiMTo2OTo0MjpmZDowZDo4ZDpjOToyNjplNjo5MjoKKyAgICAgICAgODY6YTY6NjQ6NmU6OTI6YzU6Y2U6M2U6M2M6N2Q6NzE6ZTM6MjM6YTQ6YWI6Yzc6ZDU6YTg6CisgICAgICAgIGE5OmRmOjgyOmE3OjNiOmU4Ojg2OmQ1OmMzOjRmOjE4OmUzOjQ0OmQwOmUwOmRjOmYzOmM1OgorICAgICAgICA2ODoyZTpmZTphNToyZjowNTo4NDpjODo3ZTo0Nzo0Mjo1Mzo2Yjo4Nzo0YTpmZTozMjpmZjoKKyAgICAgICAgNWU6M2U6NzA6OGM6Yjc6YTg6MTU6Y2M6MTc6YzI6ZmY6NDY6ZWM6ZDA6ZWM6MmQ6YjQ6NmU6CisgICAgICAgIDEyOjI4OmE5OmY5OjQwOmU5OmViOmQ0OjY2Ojk3OjUzOmE5OjY5OjU1OmMwOmE5OmFhOmIyOgorICAgICAgICAyZTpjZDpkMTo2OTpmNDpiZTpmODpiYjo3Yzo2OTplZTo1NDphNjpkYjo5ZTpmYjo1YTphNjoKKyAgICAgICAgM2U6ZmU6OWE6ZWY6OTQ6NTE6NGI6NzU6ZWU6ZDg6ZDQ6ZTE6OWE6ZjE6MDI6NTY6MTM6ODk6CisgICAgICAgIDBlOmE3OjQyOjhiOjk2OjhiOjg1OjBjOjFiOjg1OmJlOjI2OmFlOmFiOmE2Ojk5OmJjOjIyOgorICAgICAgICBmMTo3MzpkZjo0MgorCitHbG9iYWxTaWduIFByaW1hcnkgQ2xhc3MgMyBDQQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogOTg6MTI6QTM6NEI6OTU6QTk6OTY6NjQ6OTQ6RTc6NTA6OEM6M0U6RTE6ODM6NUEKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEckRDQ0FwU2dBd0lCQWdJTEFnQUFBQUFBMW5pNDFzTXdEUVlKS29aSWh2Y05BUUVFQlFBd1Z6RUxNQWtHCitBMVVFQmhNQ1FrVXhHVEFYQmdOVkJBb1RFRWRzYjJKaGJGTnBaMjRnYm5ZdGMyRXhFREFPQmdOVkJBc1RCMUp2CitiM1FnUTBFeEd6QVpCZ05WQkFNVEVrZHNiMkpoYkZOcFoyNGdVbTl2ZENCRFFUQWVGdzA1T1RBeE1qZ3hNakF3CitNREJhRncwd09UQXhNamd4TWpBd01EQmFNRzB4Q3pBSkJnTlZCQVlUQWtKRk1Sa3dGd1lEVlFRS0V4QkhiRzlpCitZV3hUYVdkdUlHNTJMWE5oTVJzd0dRWURWUVFMRXhKUWNtbHRZWEo1SUVOc1lYTnpJRE1nUTBFeEpqQWtCZ05WCitCQU1USFVkc2IySmhiRk5wWjI0Z1VISnBiV0Z5ZVNCRGJHRnpjeUF6SUVOQk1JSUJJakFOQmdrcWhraUc5dzBCCitBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFrVjVXWmRiQXdBU2N2MGZFWEh0Nk1RSDVXSmFaNHh5RUw5eFdqNjMxCitXWUhWUTJaZFdwT01kY3FwNXhIQlVSQVVZTWtzMUh1dnhuZUdxM29ucm0rVnVRdkt0a2I3ZmhyMERSUnQwc2xPCitzcTd3VlBaY1FFdzJTSFRvVkl4bFpoQ252U3UzSUkwRlNhMTRmZElrSTFEajhMUjVtd0U1LzY4NzB5M3U0VW1OCitqUzg4YWtGRkw1dmpQZUVTNUpGMW5zK2dQanlTZ1crS0xoamM0UEtNalAySDJRZjBRSlRKVGs5RDMyZFdiNzBECitVSHlaWjZTNVBKRnNBbTZFMXZ4Rzk4eHZHRDRYOE84TFpCWlg1cXlHOFVpcVE4SEpKM2h6UkVYaWhYMjYvN1BoCisreHNGcEVzN21SSWxBVkFVYXE5ZDZzZ003dVRhN0V1TFhHZ1RsZHpEdFRBNjF3SURBUUFCbzJNd1lUQU9CZ05WCitIUThCQWY4RUJBTUNBQVl3SFFZRFZSME9CQllFRk13MnpCZTBSWkV2N2M4N01FaDMrN1VVbWI3ak1COEdBMVVkCitJd1FZTUJhQUZHQjdaaHBGRFpmS2lWQXZmUVROTktqLy9QMUxNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKCitLb1pJaHZjTkFRRUVCUUFEZ2dFQkFGZXlWTXk5bFJka1lJbTJVNUVNUlpMRFBhaHN3OHl5R1BWNFFYVFlmYU1uCityM2NOV1Q2VUhXbjZpZE1NdlJvQjlEL280SGNhZ2loYTVtTFh0K00yeVE2ZmV1UEMwOHhaaVF6dkZvdndObmNpCit5cVMydDhGQ1p3RkFZOHpuT0dTSFd4U1dabnN0Rk82OVNXMy9kOURpVGx2VGdNSk5EOHE0bllHWHB6UnV4K09jCitTT1cwcWtYMTltVk1TUElTd3RLVGpNSVZKUE1yVXYvakNLNjRidFlzRXM4NXl4SXE1Nmw3WDVnOW8rSE1wbU9KCitYSDB4ZGZuVjFsM3kwTlE5MzU1eHFBN2M1Q0NYZU9aL1U2UU5VVStPT3dPdW93MWFUY041NXpWWWNFTEpYcUZlCit0TmtpbzBSVE5hVFF6M09BeGMrZlZwaDIrUlJNZDRlQ3lkeCtYVFRWTm5VPQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOgorICAgICAgICAgICAgMDI6MDA6MDA6MDA6MDA6MDA6ZDY6Nzg6Yjg6ZDY6YzMKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPUJFLCBPPUdsb2JhbFNpZ24gbnYtc2EsIE9VPVJvb3QgQ0EsIENOPUdsb2JhbFNpZ24gUm9vdCBDQQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogSmFuIDI4IDEyOjAwOjAwIDE5OTkgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBKYW4gMjggMTI6MDA6MDAgMjAwOSBHTVQKKyAgICAgICAgU3ViamVjdDogQz1CRSwgTz1HbG9iYWxTaWduIG52LXNhLCBPVT1QcmltYXJ5IENsYXNzIDMgQ0EsIENOPUdsb2JhbFNpZ24gUHJpbWFyeSBDbGFzcyAzIENBCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMjA0OCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMjA0OCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDo5MTo1ZTo1Njo2NTpkNjpjMDpjMDowNDo5YzpiZjo0NzpjNDo1Yzo3YjoKKyAgICAgICAgICAgICAgICAgICAgN2E6MzE6MDE6Zjk6NTg6OTY6OTk6ZTM6MWM6ODQ6MmY6ZGM6NTY6OGY6YWQ6CisgICAgICAgICAgICAgICAgICAgIGY1OjU5OjgxOmQ1OjQzOjY2OjVkOjVhOjkzOjhjOjc1OmNhOmE5OmU3OjExOgorICAgICAgICAgICAgICAgICAgICBjMTo1MToxMDoxNDo2MDpjOToyYzpkNDo3YjphZjpjNjo3Nzo4NjphYjo3YToKKyAgICAgICAgICAgICAgICAgICAgMjc6YWU6NmY6OTU6Yjk6MGI6Y2E6YjY6NDY6ZmI6N2U6MWE6ZjQ6MGQ6MTQ6CisgICAgICAgICAgICAgICAgICAgIDZkOmQyOmM5OjRlOmIyOmFlOmYwOjU0OmY2OjVjOjQwOjRjOjM2OjQ4Ojc0OgorICAgICAgICAgICAgICAgICAgICBlODo1NDo4Yzo2NTo2NjoxMDphNzpiZDoyYjpiNzoyMDo4ZDowNTo0OTphZDoKKyAgICAgICAgICAgICAgICAgICAgNzg6N2Q6ZDI6MjQ6MjM6NTA6ZTM6ZjA6YjQ6Nzk6OWI6MDE6Mzk6ZmY6YWY6CisgICAgICAgICAgICAgICAgICAgIDNiOmQzOjJkOmVlOmUxOjQ5OjhkOjhkOjJmOjNjOjZhOjQxOjQ1OjJmOjliOgorICAgICAgICAgICAgICAgICAgICBlMzozZDplMToxMjplNDo5MTo3NTo5ZTpjZjphMDozZTozYzo5Mjo4MTo2ZjoKKyAgICAgICAgICAgICAgICAgICAgOGE6MmU6MTg6ZGM6ZTA6ZjI6OGM6OGM6ZmQ6ODc6ZDk6MDc6ZjQ6NDA6OTQ6CisgICAgICAgICAgICAgICAgICAgIGM5OjRlOjRmOjQzOmRmOjY3OjU2OjZmOmJkOjAzOjUwOjdjOjk5OjY3OmE0OgorICAgICAgICAgICAgICAgICAgICBiOTozYzo5MTo2YzowMjo2ZTo4NDpkNjpmYzo0NjpmNzpjYzo2ZjoxODozZToKKyAgICAgICAgICAgICAgICAgICAgMTc6ZjA6ZWY6MGI6NjQ6MTY6NTc6ZTY6YWM6ODY6ZjE6NDg6YWE6NDM6YzE6CisgICAgICAgICAgICAgICAgICAgIGM5OjI3Ojc4OjczOjQ0OjQ1OmUyOjg1OjdkOmJhOmZmOmIzOmUxOmZiOjFiOgorICAgICAgICAgICAgICAgICAgICAwNTphNDo0YjozYjo5OToxMjoyNTowMTo1MDoxNDo2YTphZjo1ZDplYTpjODoKKyAgICAgICAgICAgICAgICAgICAgMGM6ZWU6ZTQ6ZGE6ZWM6NGI6OGI6NWM6Njg6MTM6OTU6ZGM6YzM6YjU6MzA6CisgICAgICAgICAgICAgICAgICAgIDNhOmQ3CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIFg1MDl2MyBLZXkgVXNhZ2U6IGNyaXRpY2FsCisgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUgU2lnbiwgQ1JMIFNpZ24KKyAgICAgICAgICAgIFg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICBDQzozNjpDQzoxNzpCNDo0NTo5MToyRjpFRDpDRjozQjozMDo0ODo3NzpGQjpCNToxNDo5OTpCRTpFMworICAgICAgICAgICAgWDUwOXYzIEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAga2V5aWQ6NjA6N0I6NjY6MUE6NDU6MEQ6OTc6Q0E6ODk6NTA6MkY6N0Q6MDQ6Q0Q6MzQ6QTg6RkY6RkM6RkQ6NEIKKworICAgICAgICAgICAgWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzOiBjcml0aWNhbAorICAgICAgICAgICAgICAgIENBOlRSVUUKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA1NzpiMjo1NDpjYzpiZDo5NToxNzo2NDo2MDo4OTpiNjo1Mzo5MTowYzo0NTo5MjpjMzozZDoKKyAgICAgICAgYTg6NmM6YzM6Y2M6YjI6MTg6ZjU6Nzg6NDE6NzQ6ZDg6N2Q6YTM6Mjc6YWY6Nzc6MGQ6NTk6CisgICAgICAgIDNlOjk0OjFkOjY5OmZhOjg5OmQzOjBjOmJkOjFhOjAxOmY0OjNmOmU4OmUwOjc3OjFhOjgyOgorICAgICAgICAyODo1YTplNjo2MjpkNzpiNzplMzozNjpjOTowZTo5Zjo3YTplMzpjMjpkMzpjYzo1OTo4OToKKyAgICAgICAgMGM6ZWY6MTY6OGI6ZjA6MzY6Nzc6MjI6Y2E6YTQ6YjY6Yjc6YzE6NDI6Njc6MDE6NDA6NjM6CisgICAgICAgIGNjOmU3OjM4OjY0Ojg3OjViOjE0Ojk2OjY2OjdiOjJkOjE0OmVlOmJkOjQ5OjZkOmZmOjc3OgorICAgICAgICBkMDplMjo0ZTo1YjpkMzo4MDpjMjo0ZDowZjpjYTpiODo5ZDo4MTo5NzphNzozNDo2ZTpjNzoKKyAgICAgICAgZTM6OWM6NDg6ZTU6YjQ6YWE6NDU6ZjU6ZjY6NjU6NGM6NDg6ZjI6MTI6YzI6ZDI6OTM6OGM6CisgICAgICAgIGMyOjE1OjI0OmYzOjJiOjUyOmZmOmUzOjA4OmFlOmI4OjZlOmQ2OjJjOjEyOmNmOjM5OmNiOgorICAgICAgICAxMjoyYTplNzphOTo3Yjo1Zjo5ODozZDphMzplMTpjYzphNjo2Mzo4OTo1Yzo3ZDozMTo3NToKKyAgICAgICAgZjk6ZDU6ZDY6NWQ6ZjI6ZDA6ZDQ6M2Q6ZGY6OWU6NzE6YTg6MGU6ZGM6ZTQ6MjA6OTc6Nzg6CisgICAgICAgIGU2OjdmOjUzOmE0OjBkOjUxOjRmOjhlOjNiOjAzOmFlOmEzOjBkOjVhOjRkOmMzOjc5OmU3OgorICAgICAgICAzNTo1ODo3MDo0MjpjOTo1ZTphMTo1ZTpiNDpkOToyMjphMzo0NDo1MzozNTphNDpkMDpjZjoKKyAgICAgICAgNzM6ODA6YzU6Y2Y6OWY6NTY6OTg6NzY6Zjk6MTQ6NGM6Nzc6ODc6ODI6Yzk6ZGM6N2U6NWQ6CisgICAgICAgIDM0OmQ1OjM2Ojc1CisKK0dsb2JhbFNpZ24gUm9vdCBDQQorPT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IEFCOkJGOkVBOkUzOjZCOjI5OkE2OkNDOkE2Ojc4OjM1Ojk5OkVGOkFEOjJCOjgwCitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRGRUQ0NBbDJnQXdJQkFnSUxBZ0FBQUFBQTFuaTNsQVV3RFFZSktvWklodmNOQVFFRUJRQXdWekVMTUFrRworQTFVRUJoTUNRa1V4R1RBWEJnTlZCQW9URUVkc2IySmhiRk5wWjI0Z2JuWXRjMkV4RURBT0JnTlZCQXNUQjFKdgorYjNRZ1EwRXhHekFaQmdOVkJBTVRFa2RzYjJKaGJGTnBaMjRnVW05dmRDQkRRVEFlRncwNU9EQTVNREV4TWpBdworTURCYUZ3MHhOREF4TWpneE1qQXdNREJhTUZjeEN6QUpCZ05WQkFZVEFrSkZNUmt3RndZRFZRUUtFeEJIYkc5aQorWVd4VGFXZHVJRzUyTFhOaE1SQXdEZ1lEVlFRTEV3ZFNiMjkwSUVOQk1Sc3dHUVlEVlFRREV4SkhiRzlpWVd4VAorYVdkdUlGSnZiM1FnUTBFd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURhRHVhWgoramM2ajQwK0tmdnZ4aTRNbGErcElIL0Vxc0xtVkVRUzk4R1BSNG1kbXp4emR6eHRJSys2TmlZNmFyeW1BWmF2cAoreHkwU3k2c2NUSEFIb1QwS01NMFZqVS80M2RTTVVCVWM3MUR1eEM3My9PbFM4cEY5NEczVk5UQ09Ya056OGtIcAorMVdyanNvazZWams0YndZOGlHbGJLazNGcDFTNGJJbk1tL2s4eXVYOWlmVVNQSko0bHRiY2RHNlRSR0hSamNkRworc25VT2h1Z1ppdFZ0Yk5WNEZwV2k2Y2dLT092eUpCTlBjMVNURTRVNkc3d2VOTFdMQll5NWQ0dXgyeDhna2FzSgorVTI2UXpuczNkTGx3UjVFaVVXTVdlYTZ4cmtFbUNNZ1pLOUZHcWtqV1pDclhnelQvTENyQmJCbERTZ2VGNTlOOAorOWlGbzcrcnlVcDkvazVEUEFnTUJBQUdqUWpCQU1BNEdBMVVkRHdFQi93UUVBd0lBQmpBZEJnTlZIUTRFRmdRVQorWUh0bUdrVU5sOHFKVUM5OUJNMDBxUC84L1Vzd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBTkJna3Foa2lHOXcwQgorQVFRRkFBT0NBUUVBcnFxZi9MZlN5eDlmT1Nrb0dKNDB5V3hQYnhyd1pLSndTazhUaHB0Z0tKN29nVW1ZZlFxNworNWJDZFBUYmJqd1ZSL3dreEtoL2RpWGVlRHk1c2xRVHRoc3UwQUQrRUFrMkFhaW90ZUF1dWJ5dWlnMFNESDgxUQorZ2t3a3I3MzNwYlRJV2cvMDUwZGVTWTQzbHY2YWlBVTYyY0RiS1lmbUdaWkhwenFtaklzOGQvNUdZNmRUMmlIUgorckg1Sm9rdm13MmRaTDdPS0Ryc3N2YW1xUW53MXdkaC8xYWN4T2s1alF6bXZDTEJoTkl6VG1LbEROUFlQaHlrNworbmNKV1dKaDN3L2NiclBhZCtENnFwMVJGOFBYNTFURmwvbXRZbkhHekh0ZFM2aklYL0VCZ0hjbDVKTEwyYlAybworWmc2QzNaakwyc0pFVHk2Z2UvTDNheXgyRVlSR2luaWo0dz09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAzICgweDIpCisgICAgICAgIFNlcmlhbCBOdW1iZXI6CisgICAgICAgICAgICAwMjowMDowMDowMDowMDowMDpkNjo3ODpiNzo5NDowNQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9QkUsIE89R2xvYmFsU2lnbiBudi1zYSwgT1U9Um9vdCBDQSwgQ049R2xvYmFsU2lnbiBSb290IENBCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBTZXAgIDEgMTI6MDA6MDAgMTk5OCBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEphbiAyOCAxMjowMDowMCAyMDE0IEdNVAorICAgICAgICBTdWJqZWN0OiBDPUJFLCBPPUdsb2JhbFNpZ24gbnYtc2EsIE9VPVJvb3QgQ0EsIENOPUdsb2JhbFNpZ24gUm9vdCBDQQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDIwNDggYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDIwNDggYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6ZGE6MGU6ZTY6OTk6OGQ6Y2U6YTM6ZTM6NGY6OGE6N2U6ZmI6ZjE6OGI6CisgICAgICAgICAgICAgICAgICAgIDgzOjI1OjZiOmVhOjQ4OjFmOmYxOjJhOmIwOmI5Ojk1OjExOjA0OmJkOmYwOgorICAgICAgICAgICAgICAgICAgICA2MzpkMTplMjo2Nzo2NjpjZjoxYzpkZDpjZjoxYjo0ODoyYjplZTo4ZDo4OToKKyAgICAgICAgICAgICAgICAgICAgOGU6OWE6YWY6Mjk6ODA6NjU6YWI6ZTk6Yzc6MmQ6MTI6Y2I6YWI6MWM6NGM6CisgICAgICAgICAgICAgICAgICAgIDcwOjA3OmExOjNkOjBhOjMwOmNkOjE1OjhkOjRmOmY4OmRkOmQ0OjhjOjUwOgorICAgICAgICAgICAgICAgICAgICAxNToxYzplZjo1MDplZTpjNDoyZTpmNzpmYzplOTo1MjpmMjo5MTo3ZDplMDoKKyAgICAgICAgICAgICAgICAgICAgNmQ6ZDU6MzU6MzA6OGU6NWU6NDM6NzM6ZjI6NDE6ZTk6ZDU6NmE6ZTM6YjI6CisgICAgICAgICAgICAgICAgICAgIDg5OjNhOjU2OjM5OjM4OjZmOjA2OjNjOjg4OjY5OjViOjJhOjRkOmM1OmE3OgorICAgICAgICAgICAgICAgICAgICA1NDpiODo2Yzo4OTpjYzo5YjpmOTozYzpjYTplNTpmZDo4OTpmNToxMjozYzoKKyAgICAgICAgICAgICAgICAgICAgOTI6Nzg6OTY6ZDY6ZGM6NzQ6NmU6OTM6NDQ6NjE6ZDE6OGQ6Yzc6NDY6YjI6CisgICAgICAgICAgICAgICAgICAgIDc1OjBlOjg2OmU4OjE5OjhhOmQ1OjZkOjZjOmQ1Ojc4OjE2Ojk1OmEyOmU5OgorICAgICAgICAgICAgICAgICAgICBjODowYTozODplYjpmMjoyNDoxMzo0Zjo3Mzo1NDo5MzoxMzo4NTozYToxYjoKKyAgICAgICAgICAgICAgICAgICAgYmM6MWU6MzQ6YjU6OGI6MDU6OGM6Yjk6Nzc6OGI6YjE6ZGI6MWY6MjA6OTE6CisgICAgICAgICAgICAgICAgICAgIGFiOjA5OjUzOjZlOjkwOmNlOjdiOjM3Ojc0OmI5OjcwOjQ3OjkxOjIyOjUxOgorICAgICAgICAgICAgICAgICAgICA2MzoxNjo3OTphZTpiMTphZTo0MToyNjowODpjODoxOToyYjpkMTo0NjphYToKKyAgICAgICAgICAgICAgICAgICAgNDg6ZDY6NjQ6MmE6ZDc6ODM6MzQ6ZmY6MmM6MmE6YzE6NmM6MTk6NDM6NGE6CisgICAgICAgICAgICAgICAgICAgIDA3Ojg1OmU3OmQzOjdjOmY2OjIxOjY4OmVmOmVhOmYyOjUyOjlmOjdmOjkzOgorICAgICAgICAgICAgICAgICAgICA5MDpjZgorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBYNTA5djMgS2V5IFVzYWdlOiBjcml0aWNhbAorICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIFNpZ24sIENSTCBTaWduCisgICAgICAgICAgICBYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAgNjA6N0I6NjY6MUE6NDU6MEQ6OTc6Q0E6ODk6NTA6MkY6N0Q6MDQ6Q0Q6MzQ6QTg6RkY6RkM6RkQ6NEIKKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogY3JpdGljYWwKKyAgICAgICAgICAgICAgICBDQTpUUlVFCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgYWU6YWE6OWY6ZmM6Yjc6ZDI6Y2I6MWY6NWY6Mzk6Mjk6Mjg6MTg6OWU6MzQ6Yzk6NmM6NGY6CisgICAgICAgIDZmOjFhOmYwOjY0OmEyOjcwOjRhOjRmOjEzOjg2OjliOjYwOjI4OjllOmU4OjgxOjQ5Ojk4OgorICAgICAgICA3ZDowYTpiYjplNTpiMDo5ZDozZDozNjpkYjo4ZjowNTo1MTpmZjowOTozMToyYToxZjpkZDoKKyAgICAgICAgODk6Nzc6OWU6MGY6MmU6NmM6OTU6MDQ6ZWQ6ODY6Y2I6YjQ6MDA6M2Y6ODQ6MDI6NGQ6ODA6CisgICAgICAgIDZhOjJhOjJkOjc4OjBiOmFlOjZmOjJiOmEyOjgzOjQ0OjgzOjFmOmNkOjUwOjgyOjRjOjI0OgorICAgICAgICBhZjpiZDpmNzphNTpiNDpjODo1YTowZjpmNDplNzo0Nzo1ZTo0OTo4ZTozNzo5NjpmZTo5YToKKyAgICAgICAgODg6MDU6M2E6ZDk6YzA6ZGI6Mjk6ODc6ZTY6MTk6OTY6NDc6YTc6M2E6YTY6OGM6OGI6M2M6CisgICAgICAgIDc3OmZlOjQ2OjYzOmE3OjUzOmRhOjIxOmQxOmFjOjdlOjQ5OmEyOjRiOmU2OmMzOjY3OjU5OgorICAgICAgICAyZjpiMzo4YTowZTpiYjoyYzpiZDphOTphYTo0Mjo3YzozNTpjMTpkODo3ZjpkNTphNzozMToKKyAgICAgICAgM2E6NGU6NjM6NDM6Mzk6YWY6MDg6YjA6NjE6MzQ6OGM6ZDM6OTg6YTk6NDM6MzQ6ZjY6MGY6CisgICAgICAgIDg3OjI5OjNiOjlkOmMyOjU2OjU4Ojk4Ojc3OmMzOmY3OjFiOmFjOmY2OjlkOmY4OjNlOmFhOgorICAgICAgICBhNzo1NDo0NTpmMDpmNTpmOTpkNTozMTo2NTpmZTo2Yjo1ODo5Yzo3MTpiMzoxZTpkNzo1MjoKKyAgICAgICAgZWE6MzI6MTc6ZmM6NDA6NjA6MWQ6Yzk6Nzk6MjQ6YjI6ZjY6NmM6ZmQ6YTg6NjY6MGU6ODI6CisgICAgICAgIGRkOjk4OmNiOmRhOmMyOjQ0OjRmOjJlOmEwOjdiOmYyOmY3OjZiOjJjOjc2OjExOjg0OjQ2OgorICAgICAgICA4YTo3ODphMzplMworCitOYXRpb25hbCBSZXRhaWwgRmVkZXJhdGlvbiBieSBEU1QKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiBBRDo4RTowRjo5RTowMTo2QjpBMDpDNTo3NDpENTowQzpEMzo2ODo2NTo0RjoxRQorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVBakNDQXVvQ0VRRFFIa0NLQUFBQ2ZBQUFBQU1BQUFBQk1BMEdDU3FHU0liM0RRRUJCUVVBTUlHK01Rc3cKK0NRWURWUVFHRXdKMWN6RU5NQXNHQTFVRUNCTUVWWFJoYURFWE1CVUdBMVVFQnhNT1UyRnNkQ0JNWVd0bElFTnAKK2RIa3hKREFpQmdOVkJBb1RHMFJwWjJsMFlXd2dVMmxuYm1GMGRYSmxJRlJ5ZFhOMElFTnZMakVqTUNFR0ExVUUKK0N4TWFUbUYwYVc5dVlXd2dVbVYwWVdsc0lFWmxaR1Z5WVhScGIyNHhHVEFYQmdOVkJBTVRFRVJUVkNBb1RsSkcKK0tTQlNiMjkwUTBFeElUQWZCZ2txaGtpRzl3MEJDUUVXRW1OaFFHUnBaM05wWjNSeWRYTjBMbU52YlRBZUZ3MDUKK09ERXlNVEV4TmpFME1UWmFGdzB3T0RFeU1EZ3hOakUwTVRaYU1JRytNUXN3Q1FZRFZRUUdFd0oxY3pFTk1Bc0cKK0ExVUVDQk1FVlhSaGFERVhNQlVHQTFVRUJ4TU9VMkZzZENCTVlXdGxJRU5wZEhreEpEQWlCZ05WQkFvVEcwUnAKK1oybDBZV3dnVTJsbmJtRjBkWEpsSUZSeWRYTjBJRU52TGpFak1DRUdBMVVFQ3hNYVRtRjBhVzl1WVd3Z1VtVjAKK1lXbHNJRVpsWkdWeVlYUnBiMjR4R1RBWEJnTlZCQU1URUVSVFZDQW9UbEpHS1NCU2IyOTBRMEV4SVRBZkJna3EKK2hraUc5dzBCQ1FFV0VtTmhRR1JwWjNOcFozUnlkWE4wTG1OdmJUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQUQKK2dnRVBBRENDQVFvQ2dnRUJBTm1zbTNmNlVOUE0zTGxBckxseWFnQ0hJL3dQbGlIUUpxL2s0clZmK3RPbWZTRXcKK0xzd1hnbytZZFB4bnBLYmZpSmVpUWluMXA5c1JrL3RlSXpEQ3Fyd2k1MEViNWUwbDNzZy8yOTVYUlhoQVJvT3kKKzFSbzkzdzlGYmRWakFuWFlMOFp1cTVXUmREY055MDBKWE5IVVd6cmEzUTdJYTVuWTFUbk0zNFZWeEpKVEFxUGgKKzk0REpjS1BhM0RQRWY2SkhDQncxbGgraEF4d3dnL1RFelArWXc3QkdSS0xBdjYzYjBvSDJUSmdzcDE0azg0YksKK1k5VzZmZkNhd0VyUUcxanU3S2xuejJrQ2JDTEFZQ3dzMGNnZzZzZ3QrOTJjdTh0UlROem5Wd1E3VkpzUnBUSjAKKzdIUUI4NUFWV3k5OExKTmx1V1pudElHSU5lV2VrUmgvZ2FoQnlNc0NBd0VBQVRBTkJna3Foa2lHOXcwQkFRVUYKK0FBT0NBUUVBaEY0TE8reWdqUnliMER3ZGNXbmtHbjlrdm9GbFljV01hdGQ4QUhUZ2VtSlY3U1I4NEdIajh0MFUKKzVoRnVndzdoNnFtZWdLMmFJTC9nVjM3VjBMV0VZeTNaR09TOUd6VXNYcTVoZHFwbmhUczQ0VEdCSHpGLzV0ZjQKK1c5SzdZM21HeEl6RjNncXUxOUg4QVhUL3RyWU5Zb0ZuSExzbStDU0E0RnhlMktTS09vOTl5LytTby8xOHFUSnAKK0IxaFlZVUtaVWdPeE9EM0djVzlzOHVoOUJxckJmRlBMR2kySVQ4bXBwNnhwYi9la0g5aDBnZlZLdjdGVnQ5TjMKK09LZHZ3a3JJNG5PSjAxZHk0VU12Y2p6Mkg3ZjRCRXB1d2VtVUYrU1hGL1FPRTRadmphdm9YeTIwLzJ6V29yUWYKKzdMbVVhcW9TVHhyZDlYZTFKWXp5aWdyeC9GSmJXQT09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAxICgweDApCisgICAgICAgIFNlcmlhbCBOdW1iZXI6CisgICAgICAgICAgICBkMDoxZTo0MDo4YTowMDowMDowMjo3YzowMDowMDowMDowMzowMDowMDowMDowMQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPXVzLCBTVD1VdGFoLCBMPVNhbHQgTGFrZSBDaXR5LCBPPURpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLiwgT1U9TmF0aW9uYWwgUmV0YWlsIEZlZGVyYXRpb24sIENOPURTVCAoTlJGKSBSb290Q0EvRW1haWw9Y2FAZGlnc2lndHJ1c3QuY29tCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBEZWMgMTEgMTY6MTQ6MTYgMTk5OCBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IERlYyAgOCAxNjoxNDoxNiAyMDA4IEdNVAorICAgICAgICBTdWJqZWN0OiBDPXVzLCBTVD1VdGFoLCBMPVNhbHQgTGFrZSBDaXR5LCBPPURpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLiwgT1U9TmF0aW9uYWwgUmV0YWlsIEZlZGVyYXRpb24sIENOPURTVCAoTlJGKSBSb290Q0EvRW1haWw9Y2FAZGlnc2lndHJ1c3QuY29tCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMjA0OCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMjA0OCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpkOTphYzo5Yjo3NzpmYTo1MDpkMzpjYzpkYzpiOTo0MDphYzpiOTo3MjoKKyAgICAgICAgICAgICAgICAgICAgNmE6MDA6ODc6MjM6ZmM6MGY6OTY6MjE6ZDA6MjY6YWY6ZTQ6ZTI6YjU6NWY6CisgICAgICAgICAgICAgICAgICAgIGZhOmQzOmE2OjdkOjIxOjMwOjJlOmNjOjE3OjgyOjhmOjk4Ojc0OmZjOjY3OgorICAgICAgICAgICAgICAgICAgICBhNDphNjpkZjo4ODo5NzphMjo0MjoyOTpmNTphNzpkYjoxMTo5MzpmYjo1ZToKKyAgICAgICAgICAgICAgICAgICAgMjM6MzA6YzI6YWE6YmM6MjI6ZTc6NDE6MWI6ZTU6ZWQ6MjU6ZGU6Yzg6M2Y6CisgICAgICAgICAgICAgICAgICAgIGRiOmRlOjU3OjQ1Ojc4OjQwOjQ2OjgzOmIyOmQ1OjFhOjNkOmRmOjBmOjQ1OgorICAgICAgICAgICAgICAgICAgICA2ZDpkNTo2MzowMjo3NTpkODoyZjpjNjo2ZTphYjo5NTo5MTo3NDozNzowZDoKKyAgICAgICAgICAgICAgICAgICAgY2I6NGQ6MDk6NWM6ZDE6ZDQ6NWI6M2E6ZGE6ZGQ6MGU6Yzg6NmI6OTk6ZDg6CisgICAgICAgICAgICAgICAgICAgIGQ1OjM5OmNjOmRmOjg1OjU1OmM0OjkyOjUzOjAyOmEzOmUxOmY3OjgwOmM5OgorICAgICAgICAgICAgICAgICAgICA3MDphMzpkYTpkYzozMzpjNDo3ZjphMjo0NzowODoxYzozNTo5NjoxZjphMToKKyAgICAgICAgICAgICAgICAgICAgMDM6MWM6MzA6ODM6ZjQ6YzQ6Y2M6ZmY6OTg6YzM6YjA6NDY6NDQ6YTI6YzA6CisgICAgICAgICAgICAgICAgICAgIGJmOmFkOmRiOmQyOjgxOmY2OjRjOjk4OjJjOmE3OjVlOjI0OmYzOjg2OmNhOgorICAgICAgICAgICAgICAgICAgICA2MzpkNTpiYTo3ZDpmMDo5YTpjMDo0YTpkMDoxYjo1ODplZTplYzphOTo2NzoKKyAgICAgICAgICAgICAgICAgICAgY2Y6Njk6MDI6NmM6MjI6YzA6NjA6MmM6MmM6ZDE6Yzg6MjA6ZWE6Yzg6MmQ6CisgICAgICAgICAgICAgICAgICAgIGZiOmRkOjljOmJiOmNiOjUxOjRjOmRjOmU3OjU3OjA0OjNiOjU0OjliOjExOgorICAgICAgICAgICAgICAgICAgICBhNTozMjo3NDplYzo3NDowMTpmMzo5MDoxNTo1YjoyZjo3YzoyYzo5Mzo2NToKKyAgICAgICAgICAgICAgICAgICAgYjk6NjY6Njc6YjQ6ODE6ODg6MzU6ZTU6OWU6OTE6MTg6N2Y6ODE6YTg6NDE6CisgICAgICAgICAgICAgICAgICAgIGM4OmNiCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA4NDo1ZTowYjozYjplYzphMDo4ZDoxYzo5YjpkMDozYzoxZDo3MTo2OTplNDoxYTo3Zjo2NDoKKyAgICAgICAgYmU6ODE6NjU6NjE6YzU6OGM6NmE6ZDc6N2M6MDA6NzQ6ZTA6N2E6NjI6NTU6ZWQ6MjQ6N2M6CisgICAgICAgIGUwOjYxOmUzOmYyOmRkOjE0OmU2OjExOjZlOjgzOjBlOmUxOmVhOmE5OjllOjgwOmFkOjlhOgorICAgICAgICAyMDpiZjplMDo1Nzo3ZTpkNTpkMDpiNTo4NDo2MzoyZDpkOToxODplNDpiZDoxYjozNToyYzoKKyAgICAgICAgNWU6YWU6NjE6NzY6YWE6Njc6ODU6M2I6Mzg6ZTE6MzE6ODE6MWY6MzE6N2Y6ZTY6ZDc6Zjg6CisgICAgICAgIDViOmQyOmJiOjYzOjc5Ojg2OmM0OjhjOmM1OmRlOjBhOmFlOmQ3OmQxOmZjOjAxOjc0OmZmOgorICAgICAgICBiNjpiNjowZDo2Mjo4MTo2NzoxYzpiYjoyNjpmODoyNDo4MDplMDo1Yzo1ZTpkODphNDo4YToKKyAgICAgICAgM2E6OGY6N2Q6Y2I6ZmY6OTI6YTM6ZmQ6N2M6YTk6MzI6Njk6MDc6NTg6NTg6NjE6NDI6OTk6CisgICAgICAgIDUyOjAzOmIxOjM4OjNkOmM2OjcxOjZmOjZjOmYyOmU4OjdkOjA2OmFhOmMxOjdjOjUzOmNiOgorICAgICAgICAxYToyZDo4ODo0ZjpjOTphOTphNzphYzo2OTo2ZjpmNzphNDoxZjpkODo3NDo4MTpmNTo0YToKKyAgICAgICAgYmY6YjE6NTU6Yjc6ZDM6Nzc6Mzg6YTc6NmY6YzI6NGE6Yzg6ZTI6NzM6ODk6ZDM6NTc6NzI6CisgICAgICAgIGUxOjQzOjJmOjcyOjNjOmY2OjFmOmI3OmY4OjA0OjRhOjZlOmMxOmU5Ojk0OjE3OmU0Ojk3OgorICAgICAgICAxNzpmNDowZToxMzo4Njo2Zjo4ZDphYjplODo1ZjoyZDpiNDpmZjo2YzpkNjphMjpiNDoxZjoKKyAgICAgICAgZWM6Yjk6OTQ6NmE6YWE6MTI6NGY6MWE6ZGQ6ZjU6Nzc6YjU6MjU6OGM6ZjI6OGE6MGE6ZjE6CisgICAgICAgIGZjOjUyOjViOjU4CisKK1RDIFRydXN0Q2VudGVyLCBHZXJtYW55LCBDbGFzcyAxIENBCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiA2NDozRjpGODozRTo1MjoxNDo0QTo1OTpCQTo5Mzo1NjowNDowQjoyMzowMjpEMQorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVOVENDQTU2Z0F3SUJBZ0lCQWpBTkJna3Foa2lHOXcwQkFRUUZBRENCdkRFTE1Ba0dBMVVFQmhNQ1JFVXgKK0VEQU9CZ05WQkFnVEIwaGhiV0oxY21jeEVEQU9CZ05WQkFjVEIwaGhiV0oxY21jeE9qQTRCZ05WQkFvVE1WUkQKK0lGUnlkWE4wUTJWdWRHVnlJR1p2Y2lCVFpXTjFjbWwwZVNCcGJpQkVZWFJoSUU1bGRIZHZjbXR6SUVkdFlrZ3gKK0lqQWdCZ05WQkFzVEdWUkRJRlJ5ZFhOMFEyVnVkR1Z5SUVOc1lYTnpJREVnUTBFeEtUQW5CZ2txaGtpRzl3MEIKK0NRRVdHbU5sY25ScFptbGpZWFJsUUhSeWRYTjBZMlZ1ZEdWeUxtUmxNQjRYRFRrNE1ETXdPVEV6TlRZek0xb1gKK0RUQTFNVEl6TVRFek5UWXpNMW93Z2J3eEN6QUpCZ05WQkFZVEFrUkZNUkF3RGdZRFZRUUlFd2RJWVcxaWRYSm4KK01SQXdEZ1lEVlFRSEV3ZElZVzFpZFhKbk1Ub3dPQVlEVlFRS0V6RlVReUJVY25WemRFTmxiblJsY2lCbWIzSWcKK1UyVmpkWEpwZEhrZ2FXNGdSR0YwWVNCT1pYUjNiM0pyY3lCSGJXSklNU0l3SUFZRFZRUUxFeGxVUXlCVWNuVnoKK2RFTmxiblJsY2lCRGJHRnpjeUF4SUVOQk1Ta3dKd1lKS29aSWh2Y05BUWtCRmhwalpYSjBhV1pwWTJGMFpVQjAKK2NuVnpkR05sYm5SbGNpNWtaVENCbnpBTkJna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBc0NucnRIYXoKK3J0ZTJXN1JlNTczanNaeEpCRmRib2F2WmZ4TWIvYnBocTlqbmNkOHRBSlJkVVVoOUkrOTFZb1NRUEFvZldSRjAKK0w0NkFwZjB3QWowcFVzMXlHa2tobkx6TFVvNUlvV09XeUJDRk1HbFhkRVhBV29iRzFUM2dhRmQ5TVdva2pVV1gKK1BqRithR1l5YmlSdDdESTJ5VUhLOERGRXlLTmh5aHVnTmg4Q0F3RUFBYU9DQVVNd2dnRS9NRUFHQ1dDR1NBR0cKKytFSUJBd1F6RmpGb2RIUndjem92TDNkM2R5NTBjblZ6ZEdObGJuUmxjaTVrWlM5aloya3RZbWx1TDJOb1pXTnIKK0xYSmxkaTVqWjJrL01FQUdDV0NHU0FHRytFSUJCQVF6RmpGb2RIUndjem92TDNkM2R5NTBjblZ6ZEdObGJuUmwKK2NpNWtaUzlqWjJrdFltbHVMMk5vWldOckxYSmxkaTVqWjJrL01Ed0dDV0NHU0FHRytFSUJCd1F2Rmkxb2RIUncKK2N6b3ZMM2QzZHk1MGNuVnpkR05sYm5SbGNpNWtaUzlqWjJrdFltbHVMMUpsYm1WM0xtTm5hVDh3UGdZSllJWkkKK0FZYjRRZ0VJQkRFV0wyaDBkSEE2THk5M2QzY3VkSEoxYzNSalpXNTBaWEl1WkdVdlozVnBaR1ZzYVc1bGN5OXAKK2JtUmxlQzVvZEcxc01DZ0dDV0NHU0FHRytFSUJEUVFiRmhsVVF5QlVjblZ6ZEVObGJuUmxjaUJEYkdGemN5QXgKK0lFTkJNQkVHQ1dDR1NBR0crRUlCQVFRRUF3SUFCekFOQmdrcWhraUc5dzBCQVFRRkFBT0JnUUFGUWxJbXBBd24KK0FVU3NYQ1Vvd2tSQ1ZBaTVIY1UrYkZsbXhMTk9VS2Y0K0paMW9aWjE2Qlk0b00xZGJ2cDVweHQ3SFI3REFMbG0KK3ZscldZZy9uOG51NDcwemd3RDlacmptM2hBbWVxL0dwTG10cDRxM004dXA0Q1FVZ09FSnhHSDdIc3BmbTFRSUYKK0JsYWpYL0dxd3NSUC92ZnZGZytkN0txRnp6MHBKUEVFelE9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiAyICgweDIpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1ERSwgU1Q9SGFtYnVyZywgTD1IYW1idXJnLCBPPVRDIFRydXN0Q2VudGVyIGZvciBTZWN1cml0eSBpbiBEYXRhIE5ldHdvcmtzIEdtYkgsIE9VPVRDIFRydXN0Q2VudGVyIENsYXNzIDEgQ0EvRW1haWw9Y2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IE1hciAgOSAxMzo1NjozMyAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogRGVjIDMxIDEzOjU2OjMzIDIwMDUgR01UCisgICAgICAgIFN1YmplY3Q6IEM9REUsIFNUPUhhbWJ1cmcsIEw9SGFtYnVyZywgTz1UQyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJILCBPVT1UQyBUcnVzdENlbnRlciBDbGFzcyAxIENBL0VtYWlsPWNlcnRpZmljYXRlQHRydXN0Y2VudGVyLmRlCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpiMDoyOTplYjpiNDo3NjpiMzphZTpkNzpiNjo1YjpiNDo1ZTplNzpiZDoKKyAgICAgICAgICAgICAgICAgICAgZTM6YjE6OWM6NDk6MDQ6NTc6NWI6YTE6YWI6ZDk6N2Y6MTM6MWI6ZmQ6YmE6CisgICAgICAgICAgICAgICAgICAgIDYxOmFiOmQ4OmU3OjcxOmRmOjJkOjAwOjk0OjVkOjUxOjQ4OjdkOjIzOmVmOgorICAgICAgICAgICAgICAgICAgICA3NTo2Mjo4NDo5MDozYzowYToxZjo1OToxMTo3NDoyZjo4ZTo4MDphNTpmZDoKKyAgICAgICAgICAgICAgICAgICAgMzA6MDI6M2Q6Mjk6NTI6Y2Q6NzI6MWE6NDk6MjE6OWM6YmM6Y2I6NTI6OGU6CisgICAgICAgICAgICAgICAgICAgIDQ4OmExOjYzOjk2OmM4OjEwOjg1OjMwOjY5OjU3Ojc0OjQ1OmMwOjVhOjg2OgorICAgICAgICAgICAgICAgICAgICBjNjpkNTozZDplMDo2ODo1Nzo3ZDozMTo2YToyNDo4ZDo0NTo5NzozZTozMToKKyAgICAgICAgICAgICAgICAgICAgN2U6Njg6NjY6MzI6NmU6MjQ6NmQ6ZWM6MzI6MzY6Yzk6NDE6Y2E6ZjA6MzE6CisgICAgICAgICAgICAgICAgICAgIDQ0OmM4OmEzOjYxOmNhOjFiOmEwOjM2OjFmCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIE5ldHNjYXBlIFJldm9jYXRpb24gVXJsOiAKKyAgICAgICAgICAgICAgICBodHRwczovL3d3dy50cnVzdGNlbnRlci5kZS9jZ2ktYmluL2NoZWNrLXJldi5jZ2k/CisgICAgICAgICAgICBOZXRzY2FwZSBDQSBSZXZvY2F0aW9uIFVybDogCisgICAgICAgICAgICAgICAgaHR0cHM6Ly93d3cudHJ1c3RjZW50ZXIuZGUvY2dpLWJpbi9jaGVjay1yZXYuY2dpPworICAgICAgICAgICAgTmV0c2NhcGUgUmVuZXdhbCBVcmw6IAorICAgICAgICAgICAgICAgIGh0dHBzOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NnaS1iaW4vUmVuZXcuY2dpPworICAgICAgICAgICAgTmV0c2NhcGUgQ0EgUG9saWN5IFVybDogCisgICAgICAgICAgICAgICAgaHR0cDovL3d3dy50cnVzdGNlbnRlci5kZS9ndWlkZWxpbmVzL2luZGV4Lmh0bWwKKyAgICAgICAgICAgIE5ldHNjYXBlIENvbW1lbnQ6IAorICAgICAgICAgICAgICAgIFRDIFRydXN0Q2VudGVyIENsYXNzIDEgQ0EKKyAgICAgICAgICAgIE5ldHNjYXBlIENlcnQgVHlwZTogCisgICAgICAgICAgICAgICAgU1NMIENBLCBTL01JTUUgQ0EsIE9iamVjdCBTaWduaW5nIENBCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgMDU6NDI6NTI6MjY6YTQ6MGM6Mjc6MDE6NDQ6YWM6NWM6MjU6Mjg6YzI6NDQ6NDI6NTQ6MDg6CisgICAgICAgIGI5OjFkOmM1OjNlOjZjOjU5OjY2OmM0OmIzOjRlOjUwOmE3OmY4OmY4Ojk2Ojc1OmExOjk2OgorICAgICAgICA3NTplODoxNjozODphMDpjZDo1ZDo2ZTpmYTo3OTphNzoxYjo3YjoxZDoxZTpjMzowMDpiOToKKyAgICAgICAgNjY6YmU6NWE6ZDY6NjI6MGY6ZTc6ZjI6N2I6Yjg6ZWY6NGM6ZTA6YzA6M2Y6NTk6YWU6Mzk6CisgICAgICAgIGI3Ojg0OjA5OjllOmFiOmYxOmE5OjJlOjZiOjY5OmUyOmFkOmNjOmYyOmVhOjc4OjA5OjA1OgorICAgICAgICAyMDozODo0Mjo3MToxODo3ZTpjNzpiMjo5NzplNjpkNTowMjowNTowNjo1NjphMzo1ZjpmMToKKyAgICAgICAgYWE6YzI6YzQ6NGY6ZmU6Zjc6ZWY6MTY6MGY6OWQ6ZWM6YWE6ODU6Y2Y6M2Q6Mjk6MjQ6ZjE6CisgICAgICAgIDA0OmNkCisKK1RDIFRydXN0Q2VudGVyLCBHZXJtYW55LCBDbGFzcyAyIENBCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiBFMTpFOTo5Njo1Mzo3NzpFMTpGMDozODpBMDowMjpBQjo5NDpDNjo5NTo3QjpGQworUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVOVENDQTU2Z0F3SUJBZ0lCQXpBTkJna3Foa2lHOXcwQkFRUUZBRENCdkRFTE1Ba0dBMVVFQmhNQ1JFVXgKK0VEQU9CZ05WQkFnVEIwaGhiV0oxY21jeEVEQU9CZ05WQkFjVEIwaGhiV0oxY21jeE9qQTRCZ05WQkFvVE1WUkQKK0lGUnlkWE4wUTJWdWRHVnlJR1p2Y2lCVFpXTjFjbWwwZVNCcGJpQkVZWFJoSUU1bGRIZHZjbXR6SUVkdFlrZ3gKK0lqQWdCZ05WQkFzVEdWUkRJRlJ5ZFhOMFEyVnVkR1Z5SUVOc1lYTnpJRElnUTBFeEtUQW5CZ2txaGtpRzl3MEIKK0NRRVdHbU5sY25ScFptbGpZWFJsUUhSeWRYTjBZMlZ1ZEdWeUxtUmxNQjRYRFRrNE1ETXdPVEV6TlRjME5Gb1gKK0RUQTFNVEl6TVRFek5UYzBORm93Z2J3eEN6QUpCZ05WQkFZVEFrUkZNUkF3RGdZRFZRUUlFd2RJWVcxaWRYSm4KK01SQXdEZ1lEVlFRSEV3ZElZVzFpZFhKbk1Ub3dPQVlEVlFRS0V6RlVReUJVY25WemRFTmxiblJsY2lCbWIzSWcKK1UyVmpkWEpwZEhrZ2FXNGdSR0YwWVNCT1pYUjNiM0pyY3lCSGJXSklNU0l3SUFZRFZRUUxFeGxVUXlCVWNuVnoKK2RFTmxiblJsY2lCRGJHRnpjeUF5SUVOQk1Ta3dKd1lKS29aSWh2Y05BUWtCRmhwalpYSjBhV1pwWTJGMFpVQjAKK2NuVnpkR05sYm5SbGNpNWtaVENCbnpBTkJna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBMmpqbzdUSUEKK0tYR0RBUTIvakFIYzJzYXRPYVNwaWkvVmkxeG9YMURHWXZWbXZjcVJJdXlxSFZIWFBiTlJzb05PWGN0SnNQQk0KK1ZlVnJMY2VGQ3pBY2trNkMxTW9DN2ZkdnZ0emc0eFM0QlZQeW12UldpMXFlaFpQUnRJSldyazI3cUV0WEZyeisKKytGaWUrQ21Oc0h2TmVNbFBySXRuRFBHYysveFhtMWRjVHcwQ0F3RUFBYU9DQVVNd2dnRS9NRUFHQ1dDR1NBR0cKKytFSUJBd1F6RmpGb2RIUndjem92TDNkM2R5NTBjblZ6ZEdObGJuUmxjaTVrWlM5aloya3RZbWx1TDJOb1pXTnIKK0xYSmxkaTVqWjJrL01FQUdDV0NHU0FHRytFSUJCQVF6RmpGb2RIUndjem92TDNkM2R5NTBjblZ6ZEdObGJuUmwKK2NpNWtaUzlqWjJrdFltbHVMMk5vWldOckxYSmxkaTVqWjJrL01Ed0dDV0NHU0FHRytFSUJCd1F2Rmkxb2RIUncKK2N6b3ZMM2QzZHk1MGNuVnpkR05sYm5SbGNpNWtaUzlqWjJrdFltbHVMMUpsYm1WM0xtTm5hVDh3UGdZSllJWkkKK0FZYjRRZ0VJQkRFV0wyaDBkSEE2THk5M2QzY3VkSEoxYzNSalpXNTBaWEl1WkdVdlozVnBaR1ZzYVc1bGN5OXAKK2JtUmxlQzVvZEcxc01DZ0dDV0NHU0FHRytFSUJEUVFiRmhsVVF5QlVjblZ6ZEVObGJuUmxjaUJEYkdGemN5QXkKK0lFTkJNQkVHQ1dDR1NBR0crRUlCQVFRRUF3SUFCekFOQmdrcWhraUc5dzBCQVFRRkFBT0JnUUNKRy9UdjZUamkKK2JBejJ6VzlKemluTSs2WVArWTArbFViVy9FY3lpYkxJQm1GNjB1Y05Fd0tVQzltTFZrZjB1K2ZGWDN2MFkweXUKK2ZEVHFEYUtwc3l5RjgrUCtKMVFRa3JDUGtzR1lRaGh3U050T0xPc05KR2prMGZlK0Nha3BoN3ZvMnR3K280aEMKK01mWFI0Myt1Mkk0QVduU1lzRS9HL3lON1hITUFlTW5iVGc9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiAzICgweDMpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1ERSwgU1Q9SGFtYnVyZywgTD1IYW1idXJnLCBPPVRDIFRydXN0Q2VudGVyIGZvciBTZWN1cml0eSBpbiBEYXRhIE5ldHdvcmtzIEdtYkgsIE9VPVRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EvRW1haWw9Y2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IE1hciAgOSAxMzo1Nzo0NCAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogRGVjIDMxIDEzOjU3OjQ0IDIwMDUgR01UCisgICAgICAgIFN1YmplY3Q6IEM9REUsIFNUPUhhbWJ1cmcsIEw9SGFtYnVyZywgTz1UQyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJILCBPVT1UQyBUcnVzdENlbnRlciBDbGFzcyAyIENBL0VtYWlsPWNlcnRpZmljYXRlQHRydXN0Y2VudGVyLmRlCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpkYTozODplODplZDozMjowMDoyOTo3MTo4MzowMTowZDpiZjo4YzowMToKKyAgICAgICAgICAgICAgICAgICAgZGM6ZGE6YzY6YWQ6Mzk6YTQ6YTk6OGE6MmY6ZDU6OGI6NWM6Njg6NWY6NTA6CisgICAgICAgICAgICAgICAgICAgIGM2OjYyOmY1OjY2OmJkOmNhOjkxOjIyOmVjOmFhOjFkOjUxOmQ3OjNkOmIzOgorICAgICAgICAgICAgICAgICAgICA1MTpiMjo4Mzo0ZTo1ZDpjYjo0OTpiMDpmMDo0Yzo1NTplNTo2YjoyZDpjNzoKKyAgICAgICAgICAgICAgICAgICAgODU6MGI6MzA6MWM6OTI6NGU6ODI6ZDQ6Y2E6MDI6ZWQ6Zjc6NmY6YmU6ZGM6CisgICAgICAgICAgICAgICAgICAgIGUwOmUzOjE0OmI4OjA1OjUzOmYyOjlhOmY0OjU2OjhiOjVhOjllOjg1OjkzOgorICAgICAgICAgICAgICAgICAgICBkMTpiNDo4Mjo1NjphZTo0ZDpiYjphODo0Yjo1NzoxNjpiYzpmZTpmODo1ODoKKyAgICAgICAgICAgICAgICAgICAgOWU6Zjg6Mjk6OGQ6YjA6N2I6Y2Q6Nzg6Yzk6NGY6YWM6OGI6Njc6MGM6ZjE6CisgICAgICAgICAgICAgICAgICAgIDljOmZiOmZjOjU3OjliOjU3OjVjOjRmOjBkCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIE5ldHNjYXBlIFJldm9jYXRpb24gVXJsOiAKKyAgICAgICAgICAgICAgICBodHRwczovL3d3dy50cnVzdGNlbnRlci5kZS9jZ2ktYmluL2NoZWNrLXJldi5jZ2k/CisgICAgICAgICAgICBOZXRzY2FwZSBDQSBSZXZvY2F0aW9uIFVybDogCisgICAgICAgICAgICAgICAgaHR0cHM6Ly93d3cudHJ1c3RjZW50ZXIuZGUvY2dpLWJpbi9jaGVjay1yZXYuY2dpPworICAgICAgICAgICAgTmV0c2NhcGUgUmVuZXdhbCBVcmw6IAorICAgICAgICAgICAgICAgIGh0dHBzOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NnaS1iaW4vUmVuZXcuY2dpPworICAgICAgICAgICAgTmV0c2NhcGUgQ0EgUG9saWN5IFVybDogCisgICAgICAgICAgICAgICAgaHR0cDovL3d3dy50cnVzdGNlbnRlci5kZS9ndWlkZWxpbmVzL2luZGV4Lmh0bWwKKyAgICAgICAgICAgIE5ldHNjYXBlIENvbW1lbnQ6IAorICAgICAgICAgICAgICAgIFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EKKyAgICAgICAgICAgIE5ldHNjYXBlIENlcnQgVHlwZTogCisgICAgICAgICAgICAgICAgU1NMIENBLCBTL01JTUUgQ0EsIE9iamVjdCBTaWduaW5nIENBCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgODk6MWI6ZjQ6ZWY6ZTk6Mzg6ZTI6NmM6MGM6ZjY6Y2Q6NmY6NDk6Y2U6Mjk6Y2M6ZmI6YTY6CisgICAgICAgIDBmOmY5OjhkOjNlOjk1OjQ2OmQ2OmZjOjQ3OjMyOjg5OmIyOmM4OjA2OjYxOjdhOmQyOmU3OgorICAgICAgICAwZDoxMzowMjo5NDowYjpkOTo4Yjo1Njo0NzpmNDpiYjplNzpjNTo1Zjo3YjpmNDo2Mzo0YzoKKyAgICAgICAgYWU6N2M6MzQ6ZWE6MGQ6YTI6YTk6YjM6MmM6ODU6ZjM6ZTM6ZmU6Mjc6NTQ6MTA6OTI6YjA6CisgICAgICAgIDhmOjkyOmMxOjk4OjQyOjE4OjcwOjQ4OmRiOjRlOjJjOmViOjBkOjI0OjY4OmU0OmQxOmY3OgorICAgICAgICBiZTowOTphOToyOTo4NzpiYjplODpkYTpkYzozZTphMzo4ODo0MjozMTpmNTpkMTplMzo3ZjoKKyAgICAgICAgYWU6ZDg6OGU6MDA6NWE6NzQ6OTg6YjA6NGY6YzY6ZmY6MjM6N2I6NWM6NzM6MDA6Nzg6Yzk6CisgICAgICAgIGRiOjRlCisKK1RDIFRydXN0Q2VudGVyLCBHZXJtYW55LCBDbGFzcyAzIENBCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiA2MjpBQjpCNjoxNTo0QTpCNDpCMDoxNjo3NzpGRjpBRTpDRjoxNjoxNjoyQjo4QworUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVOVENDQTU2Z0F3SUJBZ0lCQkRBTkJna3Foa2lHOXcwQkFRUUZBRENCdkRFTE1Ba0dBMVVFQmhNQ1JFVXgKK0VEQU9CZ05WQkFnVEIwaGhiV0oxY21jeEVEQU9CZ05WQkFjVEIwaGhiV0oxY21jeE9qQTRCZ05WQkFvVE1WUkQKK0lGUnlkWE4wUTJWdWRHVnlJR1p2Y2lCVFpXTjFjbWwwZVNCcGJpQkVZWFJoSUU1bGRIZHZjbXR6SUVkdFlrZ3gKK0lqQWdCZ05WQkFzVEdWUkRJRlJ5ZFhOMFEyVnVkR1Z5SUVOc1lYTnpJRE1nUTBFeEtUQW5CZ2txaGtpRzl3MEIKK0NRRVdHbU5sY25ScFptbGpZWFJsUUhSeWRYTjBZMlZ1ZEdWeUxtUmxNQjRYRFRrNE1ETXdPVEV6TlRnME9Wb1gKK0RUQTFNVEl6TVRFek5UZzBPVm93Z2J3eEN6QUpCZ05WQkFZVEFrUkZNUkF3RGdZRFZRUUlFd2RJWVcxaWRYSm4KK01SQXdEZ1lEVlFRSEV3ZElZVzFpZFhKbk1Ub3dPQVlEVlFRS0V6RlVReUJVY25WemRFTmxiblJsY2lCbWIzSWcKK1UyVmpkWEpwZEhrZ2FXNGdSR0YwWVNCT1pYUjNiM0pyY3lCSGJXSklNU0l3SUFZRFZRUUxFeGxVUXlCVWNuVnoKK2RFTmxiblJsY2lCRGJHRnpjeUF6SUVOQk1Ta3dKd1lKS29aSWh2Y05BUWtCRmhwalpYSjBhV1pwWTJGMFpVQjAKK2NuVnpkR05sYm5SbGNpNWtaVENCbnpBTkJna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBdHJUQk5RVXUKK0RZM3NvRUJxSEE0bnBsQ1NhMUFiQjk0dTUzYk00TnI4aEtoZWpHTnFLMDNaVGdKMkVjRUw4bzE1eWdDMjhiQU8KKzEvdWtGejJ2cTJsNmxpZS9yek9obWlwWnFzUzFOd2p5RXFVeHRrUDFNcFp4S0NpcmpTaUczN3Z1NHd4OU1OYkQKK1VxdVBYU2VjYThDajV3VnJWMGxFczI3cVpNL1NqbnBRZDNjQ0F3RUFBYU9DQVVNd2dnRS9NRUFHQ1dDR1NBR0cKKytFSUJBd1F6RmpGb2RIUndjem92TDNkM2R5NTBjblZ6ZEdObGJuUmxjaTVrWlM5aloya3RZbWx1TDJOb1pXTnIKK0xYSmxkaTVqWjJrL01FQUdDV0NHU0FHRytFSUJCQVF6RmpGb2RIUndjem92TDNkM2R5NTBjblZ6ZEdObGJuUmwKK2NpNWtaUzlqWjJrdFltbHVMMk5vWldOckxYSmxkaTVqWjJrL01Ed0dDV0NHU0FHRytFSUJCd1F2Rmkxb2RIUncKK2N6b3ZMM2QzZHk1MGNuVnpkR05sYm5SbGNpNWtaUzlqWjJrdFltbHVMMUpsYm1WM0xtTm5hVDh3UGdZSllJWkkKK0FZYjRRZ0VJQkRFV0wyaDBkSEE2THk5M2QzY3VkSEoxYzNSalpXNTBaWEl1WkdVdlozVnBaR1ZzYVc1bGN5OXAKK2JtUmxlQzVvZEcxc01DZ0dDV0NHU0FHRytFSUJEUVFiRmhsVVF5QlVjblZ6ZEVObGJuUmxjaUJEYkdGemN5QXoKK0lFTkJNQkVHQ1dDR1NBR0crRUlCQVFRRUF3SUFCekFOQmdrcWhraUc5dzBCQVFRRkFBT0JnUUNFaGxCaWVhQW4KKzRTVzZDYkUwRHhNSjdTM0tvK2FWK1RDc3pSZWx6ajJYbmV4OGp5Wi93R0hLSXZlUjNUdzJXWnFiZGZlODVNanQKKzdBSzJJcWZ6TFBISWtuaHR0dTdGS095QUlFKzVhd2puTDZlR0huMnhDSjlVdVFBM1BLRFlHc2lXSFBReUZKdzUKK2xiZnU4RU5Kd2w3b3kzbHZVNy83U1lvczJFdlpWZklTY0E9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiA0ICgweDQpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1ERSwgU1Q9SGFtYnVyZywgTD1IYW1idXJnLCBPPVRDIFRydXN0Q2VudGVyIGZvciBTZWN1cml0eSBpbiBEYXRhIE5ldHdvcmtzIEdtYkgsIE9VPVRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EvRW1haWw9Y2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IE1hciAgOSAxMzo1ODo0OSAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogRGVjIDMxIDEzOjU4OjQ5IDIwMDUgR01UCisgICAgICAgIFN1YmplY3Q6IEM9REUsIFNUPUhhbWJ1cmcsIEw9SGFtYnVyZywgTz1UQyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJILCBPVT1UQyBUcnVzdENlbnRlciBDbGFzcyAzIENBL0VtYWlsPWNlcnRpZmljYXRlQHRydXN0Y2VudGVyLmRlCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpiNjpiNDpjMTozNTowNToyZTowZDo4ZDplYzphMDo0MDo2YToxYzowZToKKyAgICAgICAgICAgICAgICAgICAgMjc6YTY6NTA6OTI6NmI6NTA6MWI6MDc6ZGU6MmU6ZTc6NzY6Y2M6ZTA6ZGE6CisgICAgICAgICAgICAgICAgICAgIGZjOjg0OmE4OjVlOjhjOjYzOjZhOjJiOjRkOmQ5OjRlOjAyOjc2OjExOmMxOgorICAgICAgICAgICAgICAgICAgICAwYjpmMjo4ZDo3OTpjYTowMDpiNjpmMTpiMDowZTpkNzpmYjphNDoxNzozZDoKKyAgICAgICAgICAgICAgICAgICAgYWY6YWI6Njk6N2E6OTY6Mjc6YmY6YWY6MzM6YTE6OWE6MmE6NTk6YWE6YzQ6CisgICAgICAgICAgICAgICAgICAgIGI1OjM3OjA4OmYyOjEyOmE1OjMxOmI2OjQzOmY1OjMyOjk2OjcxOjI4OjI4OgorICAgICAgICAgICAgICAgICAgICBhYjo4ZDoyODo4NjpkZjpiYjplZTplMzowYzo3ZDozMDpkNjpjMzo1MjphYjoKKyAgICAgICAgICAgICAgICAgICAgOGY6NWQ6Mjc6OWM6NmI6YzA6YTM6ZTc6MDU6NmI6NTc6NDk6NDQ6YjM6NmU6CisgICAgICAgICAgICAgICAgICAgIGVhOjY0OmNmOmQyOjhlOjdhOjUwOjc3Ojc3CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIE5ldHNjYXBlIFJldm9jYXRpb24gVXJsOiAKKyAgICAgICAgICAgICAgICBodHRwczovL3d3dy50cnVzdGNlbnRlci5kZS9jZ2ktYmluL2NoZWNrLXJldi5jZ2k/CisgICAgICAgICAgICBOZXRzY2FwZSBDQSBSZXZvY2F0aW9uIFVybDogCisgICAgICAgICAgICAgICAgaHR0cHM6Ly93d3cudHJ1c3RjZW50ZXIuZGUvY2dpLWJpbi9jaGVjay1yZXYuY2dpPworICAgICAgICAgICAgTmV0c2NhcGUgUmVuZXdhbCBVcmw6IAorICAgICAgICAgICAgICAgIGh0dHBzOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NnaS1iaW4vUmVuZXcuY2dpPworICAgICAgICAgICAgTmV0c2NhcGUgQ0EgUG9saWN5IFVybDogCisgICAgICAgICAgICAgICAgaHR0cDovL3d3dy50cnVzdGNlbnRlci5kZS9ndWlkZWxpbmVzL2luZGV4Lmh0bWwKKyAgICAgICAgICAgIE5ldHNjYXBlIENvbW1lbnQ6IAorICAgICAgICAgICAgICAgIFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EKKyAgICAgICAgICAgIE5ldHNjYXBlIENlcnQgVHlwZTogCisgICAgICAgICAgICAgICAgU1NMIENBLCBTL01JTUUgQ0EsIE9iamVjdCBTaWduaW5nIENBCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgODQ6ODY6NTA6NjI6Nzk6YTA6Mjc6ZTE6MjU6YmE6MDk6YjE6MzQ6MGY6MTM6MDk6ZWQ6MmQ6CisgICAgICAgIGNhOmEzOmU2Ojk1OmY5OjMwOmFjOmNkOjE3OmE1OmNlOjNkOjk3OjlkOmVjOjdjOjhmOjI2OgorICAgICAgICA3ZjpjMDo2MTpjYToyMjpmNzo5MTpkZDozYzozNjo1OTo5YTo5Yjo3NTpmNzpiYzplNDpjODoKKyAgICAgICAgZWQ6ZWM6MDI6YjY6MjI6YTc6ZjM6MmM6ZjE6Yzg6OTI6Nzg6NmQ6YjY6ZWU6YzU6Mjg6ZWM6CisgICAgICAgIDgwOjIwOjRmOmI5OjZiOjA4OmU3OjJmOmE3Ojg2OjFlOjdkOmIxOjA4OjlmOjU0OmI5OjAwOgorICAgICAgICAzNzozYzphMDpkODoxYTpjODo5NjoxYzpmNDozMjoxNDo5YzozOTo5NTpiNzplZTpmMDo0MzoKKyAgICAgICAgNDk6YzI6NWU6ZTg6Y2I6Nzk6NmY6NTM6YmY6ZmI6NDk6OGE6MmM6ZDg6NGI6ZDk6NTU6ZjI6CisgICAgICAgIDEyOjcwCisKK1RDIFRydXN0Q2VudGVyLCBHZXJtYW55LCBDbGFzcyA0IENBCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiBCRjpBRjpFQzpDNDpEQTpGOTozMDpGOTpDQTozNTpDQToyNTpFNDozRjo4RDo4OQorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVOVENDQTU2Z0F3SUJBZ0lCQlRBTkJna3Foa2lHOXcwQkFRUUZBRENCdkRFTE1Ba0dBMVVFQmhNQ1JFVXgKK0VEQU9CZ05WQkFnVEIwaGhiV0oxY21jeEVEQU9CZ05WQkFjVEIwaGhiV0oxY21jeE9qQTRCZ05WQkFvVE1WUkQKK0lGUnlkWE4wUTJWdWRHVnlJR1p2Y2lCVFpXTjFjbWwwZVNCcGJpQkVZWFJoSUU1bGRIZHZjbXR6SUVkdFlrZ3gKK0lqQWdCZ05WQkFzVEdWUkRJRlJ5ZFhOMFEyVnVkR1Z5SUVOc1lYTnpJRFFnUTBFeEtUQW5CZ2txaGtpRzl3MEIKK0NRRVdHbU5sY25ScFptbGpZWFJsUUhSeWRYTjBZMlZ1ZEdWeUxtUmxNQjRYRFRrNE1ETXdPVEUwTURBeU1Gb1gKK0RUQTFNVEl6TVRFME1EQXlNRm93Z2J3eEN6QUpCZ05WQkFZVEFrUkZNUkF3RGdZRFZRUUlFd2RJWVcxaWRYSm4KK01SQXdEZ1lEVlFRSEV3ZElZVzFpZFhKbk1Ub3dPQVlEVlFRS0V6RlVReUJVY25WemRFTmxiblJsY2lCbWIzSWcKK1UyVmpkWEpwZEhrZ2FXNGdSR0YwWVNCT1pYUjNiM0pyY3lCSGJXSklNU0l3SUFZRFZRUUxFeGxVUXlCVWNuVnoKK2RFTmxiblJsY2lCRGJHRnpjeUEwSUVOQk1Ta3dKd1lKS29aSWh2Y05BUWtCRmhwalpYSjBhV1pwWTJGMFpVQjAKK2NuVnpkR05sYm5SbGNpNWtaVENCbnpBTkJna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBdnk5ajFqWjcKK3NnM1RWZlZrYk9ZbFhjYTB5QlM2SlRpRDYxWmlwVldwWmFQMEk1bkNTN25RelZSbnBxT2dvNmt6SzNia3ZhMTMKK3N1MWNFblREeGJZUFVwcHlrME9RWW1ZVkQwV2wzZURkdUc5QWJsZkJlWEtqWUtxNmRoMFNpVk5hL0FLKzRRa1QKK3hVb3YzRDJMR2EzWGl5UkYrMHowelZ3MUhTbE1VZlB5YkZVQ0F3RUFBYU9DQVVNd2dnRS9NRUFHQ1dDR1NBR0cKKytFSUJBd1F6RmpGb2RIUndjem92TDNkM2R5NTBjblZ6ZEdObGJuUmxjaTVrWlM5aloya3RZbWx1TDJOb1pXTnIKK0xYSmxkaTVqWjJrL01FQUdDV0NHU0FHRytFSUJCQVF6RmpGb2RIUndjem92TDNkM2R5NTBjblZ6ZEdObGJuUmwKK2NpNWtaUzlqWjJrdFltbHVMMk5vWldOckxYSmxkaTVqWjJrL01Ed0dDV0NHU0FHRytFSUJCd1F2Rmkxb2RIUncKK2N6b3ZMM2QzZHk1MGNuVnpkR05sYm5SbGNpNWtaUzlqWjJrdFltbHVMMUpsYm1WM0xtTm5hVDh3UGdZSllJWkkKK0FZYjRRZ0VJQkRFV0wyaDBkSEE2THk5M2QzY3VkSEoxYzNSalpXNTBaWEl1WkdVdlozVnBaR1ZzYVc1bGN5OXAKK2JtUmxlQzVvZEcxc01DZ0dDV0NHU0FHRytFSUJEUVFiRmhsVVF5QlVjblZ6ZEVObGJuUmxjaUJEYkdGemN5QTAKK0lFTkJNQkVHQ1dDR1NBR0crRUlCQVFRRUF3SUFCekFOQmdrcWhraUc5dzBCQVFRRkFBT0JnUUNVYUJRYkpaNHAKK21iR3lJOUpFczVXZjBaNVZCTjNqTDRJelZaWjNHWjBybm1VYytvcmp4NDhsL0xFZVZVWVBqLzlQTnkra2RsbW0KK1pPdlZGbkM5M1pVekRLUU5KT3RrVUxSREVmSkR2ZzF4bUNMc0FhL3M5OGRjY2NOMWtWZ1o2TjJnOUxUeHZCQksKKzg1TzBCa203SDJiU3ZYUkg0WnI1NjllcmJSKzY0UjBzMmc9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiA1ICgweDUpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1ERSwgU1Q9SGFtYnVyZywgTD1IYW1idXJnLCBPPVRDIFRydXN0Q2VudGVyIGZvciBTZWN1cml0eSBpbiBEYXRhIE5ldHdvcmtzIEdtYkgsIE9VPVRDIFRydXN0Q2VudGVyIENsYXNzIDQgQ0EvRW1haWw9Y2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IE1hciAgOSAxNDowMDoyMCAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogRGVjIDMxIDE0OjAwOjIwIDIwMDUgR01UCisgICAgICAgIFN1YmplY3Q6IEM9REUsIFNUPUhhbWJ1cmcsIEw9SGFtYnVyZywgTz1UQyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJILCBPVT1UQyBUcnVzdENlbnRlciBDbGFzcyA0IENBL0VtYWlsPWNlcnRpZmljYXRlQHRydXN0Y2VudGVyLmRlCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpiZjoyZjo2MzpkNjozNjo3YjpiMjowZDpkMzo1NTpmNTo2NDo2YzplNjoKKyAgICAgICAgICAgICAgICAgICAgMjU6NWQ6YzY6YjQ6Yzg6MTQ6YmE6MjU6Mzg6ODM6ZWI6NTY6NjI6YTU6NTU6CisgICAgICAgICAgICAgICAgICAgIGE5OjY1OmEzOmY0OjIzOjk5OmMyOjRiOmI5OmQwOmNkOjU0OjY3OmE2OmEzOgorICAgICAgICAgICAgICAgICAgICBhMDphMzphOTozMzoyYjo3NjplNDpiZDphZDo3NzpiMjplZDo1YzoxMjo3NDoKKyAgICAgICAgICAgICAgICAgICAgYzM6YzU6YjY6MGY6NTI6OWE6NzI6OTM6NDM6OTA6NjI6NjY6MTU6MGY6NDU6CisgICAgICAgICAgICAgICAgICAgIGE1OmRkOmUwOmRkOmI4OjZmOjQwOjZlOjU3OmMxOjc5OjcyOmEzOjYwOmFhOgorICAgICAgICAgICAgICAgICAgICBiYTo3NjoxZDoxMjo4OTo1Mzo1YTpmYzowMjpiZTplMTowOToxMzpjNTo0YToKKyAgICAgICAgICAgICAgICAgICAgMmY6ZGM6M2Q6OGI6MTk6YWQ6ZDc6OGI6MjQ6NDU6ZmI6NGM6ZjQ6Y2Q6NWM6CisgICAgICAgICAgICAgICAgICAgIDM1OjFkOjI5OjRjOjUxOmYzOmYyOjZjOjU1CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIE5ldHNjYXBlIFJldm9jYXRpb24gVXJsOiAKKyAgICAgICAgICAgICAgICBodHRwczovL3d3dy50cnVzdGNlbnRlci5kZS9jZ2ktYmluL2NoZWNrLXJldi5jZ2k/CisgICAgICAgICAgICBOZXRzY2FwZSBDQSBSZXZvY2F0aW9uIFVybDogCisgICAgICAgICAgICAgICAgaHR0cHM6Ly93d3cudHJ1c3RjZW50ZXIuZGUvY2dpLWJpbi9jaGVjay1yZXYuY2dpPworICAgICAgICAgICAgTmV0c2NhcGUgUmVuZXdhbCBVcmw6IAorICAgICAgICAgICAgICAgIGh0dHBzOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NnaS1iaW4vUmVuZXcuY2dpPworICAgICAgICAgICAgTmV0c2NhcGUgQ0EgUG9saWN5IFVybDogCisgICAgICAgICAgICAgICAgaHR0cDovL3d3dy50cnVzdGNlbnRlci5kZS9ndWlkZWxpbmVzL2luZGV4Lmh0bWwKKyAgICAgICAgICAgIE5ldHNjYXBlIENvbW1lbnQ6IAorICAgICAgICAgICAgICAgIFRDIFRydXN0Q2VudGVyIENsYXNzIDQgQ0EKKyAgICAgICAgICAgIE5ldHNjYXBlIENlcnQgVHlwZTogCisgICAgICAgICAgICAgICAgU1NMIENBLCBTL01JTUUgQ0EsIE9iamVjdCBTaWduaW5nIENBCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgOTQ6Njg6MTQ6MWI6MjU6OWU6Mjk6OTk6YjE6YjI6MjM6ZDI6NDQ6YjM6OTU6OWY6ZDE6OWU6CisgICAgICAgIDU1OjA0OmRkOmUzOjJmOjgyOjMzOjU1Ojk2Ojc3OjE5OjlkOjJiOjllOjY1OjFjOmZhOjhhOgorICAgICAgICBlMzpjNzo4ZjoyNTpmYzpiMToxZTo1NTo0NjowZjo4ZjpmZjo0ZjozNzoyZjphNDo3Njo1OToKKyAgICAgICAgYTY6NjQ6ZWI6ZDU6MTY6NzA6YmQ6ZGQ6OTU6MzM6MGM6YTQ6MGQ6MjQ6ZWI6NjQ6NTA6YjQ6CisgICAgICAgIDQzOjExOmYyOjQzOmJlOjBkOjcxOjk4OjIyOmVjOjAxOmFmOmVjOmY3OmM3OjVjOjcxOmMzOgorICAgICAgICA3NTo5MTo1ODoxOTplODpkZDphMDpmNDpiNDpmMTpiYzoxMDo0YTpmMzo5MzpiNDowNjo0OToKKyAgICAgICAgYmI6MWY6NjY6ZDI6YmQ6NzQ6NDc6ZTE6OWE6Zjk6ZWI6ZDc6YWI6NmQ6MWY6YmE6ZTE6MWQ6CisgICAgICAgIDJjOmRhCisKK1RoYXd0ZSBQZXJzb25hbCBCYXNpYyBDQQorPT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IEU2OjBCOkQyOkM5OkNBOjJEOjg4OkRCOjFBOjcxOjBFOjRCOjc4OkVCOjAyOjQxCitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRElUQ0NBb3FnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFRRkFEQ0J5ekVMTUFrR0ExVUVCaE1DV2tFeAorRlRBVEJnTlZCQWdUREZkbGMzUmxjbTRnUTJGd1pURVNNQkFHQTFVRUJ4TUpRMkZ3WlNCVWIzZHVNUm93R0FZRAorVlFRS0V4RlVhR0YzZEdVZ1EyOXVjM1ZzZEdsdVp6RW9NQ1lHQTFVRUN4TWZRMlZ5ZEdsbWFXTmhkR2x2YmlCVAorWlhKMmFXTmxjeUJFYVhacGMybHZiakVoTUI4R0ExVUVBeE1ZVkdoaGQzUmxJRkJsY25OdmJtRnNJRUpoYzJsagorSUVOQk1TZ3dKZ1lKS29aSWh2Y05BUWtCRmhsd1pYSnpiMjVoYkMxaVlYTnBZMEIwYUdGM2RHVXVZMjl0TUI0WAorRFRrMk1ERXdNVEF3TURBd01Gb1hEVEl3TVRJek1USXpOVGsxT1Zvd2djc3hDekFKQmdOVkJBWVRBbHBCTVJVdworRXdZRFZRUUlFd3hYWlhOMFpYSnVJRU5oY0dVeEVqQVFCZ05WQkFjVENVTmhjR1VnVkc5M2JqRWFNQmdHQTFVRQorQ2hNUlZHaGhkM1JsSUVOdmJuTjFiSFJwYm1jeEtEQW1CZ05WQkFzVEgwTmxjblJwWm1sallYUnBiMjRnVTJWeQorZG1salpYTWdSR2wyYVhOcGIyNHhJVEFmQmdOVkJBTVRHRlJvWVhkMFpTQlFaWEp6YjI1aGJDQkNZWE5wWXlCRAorUVRFb01DWUdDU3FHU0liM0RRRUpBUllaY0dWeWMyOXVZV3d0WW1GemFXTkFkR2hoZDNSbExtTnZiVENCbnpBTgorQmdrcWhraUc5dzBCQVFFRkFBT0JqUUF3Z1lrQ2dZRUF2THlUVTIzQVVFK0NGZVpJbERXbVdyNXZRdm9QUis1MworZFhMZGpVbWJsbGVnZU5US1AxR3phUXVSZGhjaUI1ZHF4RkdUUytDTjd6ZVZvUXhOMmpTUUhSZUpsK0ExT0ZkSword1BRSWNPazhSSHRRZm1HYWtPTWowNGdSUmlmMUN3Y091OTNSZnlBS2lMbFdDeTRjZ05yeDQ1NHA3eFM5Q2tUNworRzFzWTBiOGpreUVDQXdFQUFhTVRNQkV3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFOQmdrcWhraUc5dzBCQVFRRgorQUFPQmdRQXQ0cGxyc0QxNmlkZFpvcFFCSHl2ZEVrdFR3cTEvcXFjQVhKRkFWeVZLT0txRWNMblpnQStsZTF6NworYzhhOTE0cGhYQVBqTFNlb0YrQ0VoVUxjWHB2R3Q3SnR1M1N2NUQvTHA3ZXc0RjIrZUlNbGxOTGJnUTk1QjIxUAorOURrVldsSUJlOTR5MWswNDloSmNCbERmQlZ1OUZFdWgzeW02TzBHTjkyTldvZDhpc1E9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiAwICgweDApCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1aQSwgU1Q9V2VzdGVybiBDYXBlLCBMPUNhcGUgVG93biwgTz1UaGF3dGUgQ29uc3VsdGluZywgT1U9Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbiwgQ049VGhhd3RlIFBlcnNvbmFsIEJhc2ljIENBL0VtYWlsPXBlcnNvbmFsLWJhc2ljQHRoYXd0ZS5jb20KKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IEphbiAgMSAwMDowMDowMCAxOTk2IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogRGVjIDMxIDIzOjU5OjU5IDIwMjAgR01UCisgICAgICAgIFN1YmplY3Q6IEM9WkEsIFNUPVdlc3Rlcm4gQ2FwZSwgTD1DYXBlIFRvd24sIE89VGhhd3RlIENvbnN1bHRpbmcsIE9VPUNlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24sIENOPVRoYXd0ZSBQZXJzb25hbCBCYXNpYyBDQS9FbWFpbD1wZXJzb25hbC1iYXNpY0B0aGF3dGUuY29tCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpiYzpiYzo5Mzo1Mzo2ZDpjMDo1MDo0Zjo4MjoxNTplNjo0ODo5NDozNToKKyAgICAgICAgICAgICAgICAgICAgYTY6NWE6YmU6NmY6NDI6ZmE6MGY6NDc6ZWU6Nzc6NzU6NzI6ZGQ6OGQ6NDk6CisgICAgICAgICAgICAgICAgICAgIDliOjk2OjU3OmEwOjc4OmQ0OmNhOjNmOjUxOmIzOjY5OjBiOjkxOjc2OjE3OgorICAgICAgICAgICAgICAgICAgICAyMjowNzo5Nzo2YTpjNDo1MTo5Mzo0YjplMDo4ZDplZjozNzo5NTphMTowYzoKKyAgICAgICAgICAgICAgICAgICAgNGQ6ZGE6MzQ6OTA6MWQ6MTc6ODk6OTc6ZTA6MzU6Mzg6NTc6NGE6YzA6ZjQ6CisgICAgICAgICAgICAgICAgICAgIDA4OjcwOmU5OjNjOjQ0OjdiOjUwOjdlOjYxOjlhOjkwOmUzOjIzOmQzOjg4OgorICAgICAgICAgICAgICAgICAgICAxMTo0NjoyNzpmNTowYjowNzowZTpiYjpkZDpkMTo3ZjoyMDowYTo4ODpiOToKKyAgICAgICAgICAgICAgICAgICAgNTY6MGI6MmU6MWM6ODA6ZGE6ZjE6ZTM6OWU6Mjk6ZWY6MTQ6YmQ6MGE6NDQ6CisgICAgICAgICAgICAgICAgICAgIGZiOjFiOjViOjE4OmQxOmJmOjIzOjkzOjIxCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogY3JpdGljYWwKKyAgICAgICAgICAgICAgICBDQTpUUlVFCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgMmQ6ZTI6OTk6NmI6YjA6M2Q6N2E6ODk6ZDc6NTk6YTI6OTQ6MDE6MWY6MmI6ZGQ6MTI6NGI6CisgICAgICAgIDUzOmMyOmFkOjdmOmFhOmE3OjAwOjVjOjkxOjQwOjU3OjI1OjRhOjM4OmFhOjg0OjcwOmI5OgorICAgICAgICBkOTo4MDowZjphNTo3Yjo1YzpmYjo3MzpjNjpiZDpkNzo4YTo2MTo1YzowMzplMzoyZDoyNzoKKyAgICAgICAgYTg6MTc6ZTA6ODQ6ODU6NDI6ZGM6NWU6OWI6YzY6Yjc6YjI6NmQ6YmI6NzQ6YWY6ZTQ6M2Y6CisgICAgICAgIGNiOmE3OmI3OmIwOmUwOjVkOmJlOjc4OjgzOjI1Ojk0OmQyOmRiOjgxOjBmOjc5OjA3OjZkOgorICAgICAgICA0ZjpmNDozOToxNTo1YTo1MjowMTo3YjpkZTozMjpkNjo0ZDozODpmNjoxMjo1YzowNjo1MDoKKyAgICAgICAgZGY6MDU6NWI6YmQ6MTQ6NGI6YTE6ZGY6Mjk6YmE6M2I6NDE6OGQ6Zjc6NjM6NTY6YTE6ZGY6CisgICAgICAgIDIyOmIxCisKK1RoYXd0ZSBQZXJzb25hbCBGcmVlbWFpbCBDQQorPT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IDFFOjc0OkMzOjg2OjNDOjBDOjM1OkM1OjNFOkMyOjdGOkVGOjNDOkFBOjNDOkQ5CitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRExUQ0NBcGFnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFRRkFEQ0IwVEVMTUFrR0ExVUVCaE1DV2tFeAorRlRBVEJnTlZCQWdUREZkbGMzUmxjbTRnUTJGd1pURVNNQkFHQTFVRUJ4TUpRMkZ3WlNCVWIzZHVNUm93R0FZRAorVlFRS0V4RlVhR0YzZEdVZ1EyOXVjM1ZzZEdsdVp6RW9NQ1lHQTFVRUN4TWZRMlZ5ZEdsbWFXTmhkR2x2YmlCVAorWlhKMmFXTmxjeUJFYVhacGMybHZiakVrTUNJR0ExVUVBeE1iVkdoaGQzUmxJRkJsY25OdmJtRnNJRVp5WldWdAorWVdsc0lFTkJNU3N3S1FZSktvWklodmNOQVFrQkZoeHdaWEp6YjI1aGJDMW1jbVZsYldGcGJFQjBhR0YzZEdVdQorWTI5dE1CNFhEVGsyTURFd01UQXdNREF3TUZvWERUSXdNVEl6TVRJek5UazFPVm93Z2RFeEN6QUpCZ05WQkFZVAorQWxwQk1SVXdFd1lEVlFRSUV3eFhaWE4wWlhKdUlFTmhjR1V4RWpBUUJnTlZCQWNUQ1VOaGNHVWdWRzkzYmpFYQorTUJnR0ExVUVDaE1SVkdoaGQzUmxJRU52Ym5OMWJIUnBibWN4S0RBbUJnTlZCQXNUSDBObGNuUnBabWxqWVhScAorYjI0Z1UyVnlkbWxqWlhNZ1JHbDJhWE5wYjI0eEpEQWlCZ05WQkFNVEcxUm9ZWGQwWlNCUVpYSnpiMjVoYkNCRworY21WbGJXRnBiQ0JEUVRFck1Da0dDU3FHU0liM0RRRUpBUlljY0dWeWMyOXVZV3d0Wm5KbFpXMWhhV3hBZEdoaAorZDNSbExtTnZiVENCbnpBTkJna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBMUduWDFMQ1VaRnR4NlVmWQorREZHMjZuS1JzSVJlZlMwTmozc1MzNFVsZFNoME9rSXNZeWVmbFh0TDczNFpoeDJHNnFQZHVjNldaQnJDRkc1RQorckh6bWoraE5EM0VmUURpbUFLT0hlUGI1bElaZXJlckFYbmJyMlJTalhXNTZmQXlsUzFWL0Joa3BmNTZhSnRWcQordXpna0NHcVl4N0hhbzVpUi9YbmI1VnJFSExrQ0F3RUFBYU1UTUJFd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBTgorQmdrcWhraUc5dzBCQVFRRkFBT0JnUURIN0pKK1R2ajFscVZuWWlxazhFMFJZTkJ2aldCWVlhd211MUkxWEFqUAorTVB1b1NwYUtIMkpDSTR3WEQvUzZaSndYckVjcDM1MllYdEpzWUhGY29xemNlZVBuYmdCSEg3VU5LT2dDbmVTYQorL1JQMHB0bDhzZmpjWHlNbUNaR0FjOUFVRzk1RHFZTWw4dWFjTHhYSy9xYXJpZ2QxaXd6ZFVZUnI1UGpSem5laQorZ1E9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiAwICgweDApCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1aQSwgU1Q9V2VzdGVybiBDYXBlLCBMPUNhcGUgVG93biwgTz1UaGF3dGUgQ29uc3VsdGluZywgT1U9Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbiwgQ049VGhhd3RlIFBlcnNvbmFsIEZyZWVtYWlsIENBL0VtYWlsPXBlcnNvbmFsLWZyZWVtYWlsQHRoYXd0ZS5jb20KKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IEphbiAgMSAwMDowMDowMCAxOTk2IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogRGVjIDMxIDIzOjU5OjU5IDIwMjAgR01UCisgICAgICAgIFN1YmplY3Q6IEM9WkEsIFNUPVdlc3Rlcm4gQ2FwZSwgTD1DYXBlIFRvd24sIE89VGhhd3RlIENvbnN1bHRpbmcsIE9VPUNlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24sIENOPVRoYXd0ZSBQZXJzb25hbCBGcmVlbWFpbCBDQS9FbWFpbD1wZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUuY29tCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpkNDo2OTpkNzpkNDpiMDo5NDo2NDo1Yjo3MTplOTo0NzpkODowYzo1MToKKyAgICAgICAgICAgICAgICAgICAgYjY6ZWE6NzI6OTE6YjA6ODQ6NWU6N2Q6MmQ6MGQ6OGY6N2I6MTI6ZGY6ODU6CisgICAgICAgICAgICAgICAgICAgIDI1Ojc1OjI4Ojc0OjNhOjQyOjJjOjYzOjI3OjlmOjk1OjdiOjRiOmVmOjdlOgorICAgICAgICAgICAgICAgICAgICAxOTo4NzoxZDo4NjplYTphMzpkZDpiOTpjZTo5Njo2NDoxYTpjMjoxNDo2ZToKKyAgICAgICAgICAgICAgICAgICAgNDQ6YWM6N2M6ZTY6OGY6ZTg6NGQ6MGY6NzE6MWY6NDA6Mzg6YTY6MDA6YTM6CisgICAgICAgICAgICAgICAgICAgIDg3Ojc4OmY2OmY5Ojk0Ojg2OjVlOmFkOmVhOmMwOjVlOjc2OmViOmQ5OjE0OgorICAgICAgICAgICAgICAgICAgICBhMzo1ZDo2ZTo3YTo3YzowYzphNTo0Yjo1NTo3ZjowNjoxOToyOTo3Zjo5ZToKKyAgICAgICAgICAgICAgICAgICAgOWE6MjY6ZDU6NmE6YmI6Mzg6MjQ6MDg6NmE6OTg6Yzc6YjE6ZGE6YTM6OTg6CisgICAgICAgICAgICAgICAgICAgIDkxOmZkOjc5OmRiOmU1OjVhOmM0OjFjOmI5CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogY3JpdGljYWwKKyAgICAgICAgICAgICAgICBDQTpUUlVFCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgYzc6ZWM6OTI6N2U6NGU6Zjg6ZjU6OTY6YTU6Njc6NjI6MmE6YTQ6ZjA6NGQ6MTE6NjA6ZDA6CisgICAgICAgIDZmOjhkOjYwOjU4OjYxOmFjOjI2OmJiOjUyOjM1OjVjOjA4OmNmOjMwOmZiOmE4OjRhOjk2OgorICAgICAgICA4YToxZjo2Mjo0MjoyMzo4YzoxNzowZjpmNDpiYTo2NDo5YzoxNzphYzo0NzoyOTpkZjo5ZDoKKyAgICAgICAgOTg6NWU6ZDI6NmM6NjA6NzE6NWM6YTI6YWM6ZGM6Nzk6ZTM6ZTc6NmU6MDA6NDc6MWY6YjU6CisgICAgICAgIDBkOjI4OmU4OjAyOjlkOmU0OjlhOmZkOjEzOmY0OmE2OmQ5OjdjOmIxOmY4OmRjOjVmOjIzOgorICAgICAgICAyNjowOTo5MTo4MDo3MzpkMDoxNDoxYjpkZTo0MzphOTo4MzoyNTpmMjplNjo5YzoyZjoxNToKKyAgICAgICAgY2E6ZmU6YTY6YWI6OGE6MDc6NzU6OGI6MGM6ZGQ6NTE6ODQ6NmI6ZTQ6Zjg6ZDE6Y2U6Nzc6CisgICAgICAgIGEyOjgxCisKK1RoYXd0ZSBQZXJzb25hbCBQcmVtaXVtIENBCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiAzQTpCMjpERToyMjo5QToyMDo5Mzo0OTpGOTpFRDpDODpEMjo4QTpFNzo2ODowRAorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURLVENDQXBLZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRUUZBRENCenpFTE1Ba0dBMVVFQmhNQ1drRXgKK0ZUQVRCZ05WQkFnVERGZGxjM1JsY200Z1EyRndaVEVTTUJBR0ExVUVCeE1KUTJGd1pTQlViM2R1TVJvd0dBWUQKK1ZRUUtFeEZVYUdGM2RHVWdRMjl1YzNWc2RHbHVaekVvTUNZR0ExVUVDeE1mUTJWeWRHbG1hV05oZEdsdmJpQlQKK1pYSjJhV05sY3lCRWFYWnBjMmx2YmpFak1DRUdBMVVFQXhNYVZHaGhkM1JsSUZCbGNuTnZibUZzSUZCeVpXMXAKK2RXMGdRMEV4S2pBb0Jna3Foa2lHOXcwQkNRRVdHM0JsY25OdmJtRnNMWEJ5WlcxcGRXMUFkR2hoZDNSbExtTnYKK2JUQWVGdzA1TmpBeE1ERXdNREF3TURCYUZ3MHlNREV5TXpFeU16VTVOVGxhTUlIUE1Rc3dDUVlEVlFRR0V3SmEKK1FURVZNQk1HQTFVRUNCTU1WMlZ6ZEdWeWJpQkRZWEJsTVJJd0VBWURWUVFIRXdsRFlYQmxJRlJ2ZDI0eEdqQVkKK0JnTlZCQW9URVZSb1lYZDBaU0JEYjI1emRXeDBhVzVuTVNnd0pnWURWUVFMRXg5RFpYSjBhV1pwWTJGMGFXOXUKK0lGTmxjblpwWTJWeklFUnBkbWx6YVc5dU1TTXdJUVlEVlFRREV4cFVhR0YzZEdVZ1VHVnljMjl1WVd3Z1VISmwKK2JXbDFiU0JEUVRFcU1DZ0dDU3FHU0liM0RRRUpBUlliY0dWeWMyOXVZV3d0Y0hKbGJXbDFiVUIwYUdGM2RHVXUKK1kyOXRNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0JnUURKWnRuNEIwVFB1WXd1OEtIdkUwVnMKK0JkL2VKeFpSTmtFUmJHdzc3ZjRRZlJLZTVadENtdjVnTWNObXQzTTZTSzVPMERJM2xJaTFEYmJaOC9KRTJkV0kKK0V0MTJUZklhL0c4akhucngySmhGVGdjUTd4WkMwRU4xYlVyZTRxckpNZjhmQUhCOFpzOFFKUWk2K3U0QTZVWUQKK1ppY1JGVHVxVy9LWTNUWkNzdHFJZFFJREFRQUJveE13RVRBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUEwR0NTcUcKK1NJYjNEUUVCQkFVQUE0R0JBR2syaWZjMEtqTnlMMjA3MUNLeXVHK2F4VFptRGhzOG9iRjFXdWI5TmRQNHFQSUgKK2I0Vm5qdDRydWVJWHNEcWc4QTZpQUpyZjh4UVZicnZJaFZxWWdQbi92blFkUGZQK01DWFJOelJuK3FWeGVUQmgKK0tYTEE0Q3hNKzFia09xaHY1VEpaVXR0MUtGQlpEUGdMR2VTczJhK1dqUzlRMndmRDZoK3JNK0QxS3pHSgorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiAwICgweDApCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1aQSwgU1Q9V2VzdGVybiBDYXBlLCBMPUNhcGUgVG93biwgTz1UaGF3dGUgQ29uc3VsdGluZywgT1U9Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbiwgQ049VGhhd3RlIFBlcnNvbmFsIFByZW1pdW0gQ0EvRW1haWw9cGVyc29uYWwtcHJlbWl1bUB0aGF3dGUuY29tCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBKYW4gIDEgMDA6MDA6MDAgMTk5NiBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IERlYyAzMSAyMzo1OTo1OSAyMDIwIEdNVAorICAgICAgICBTdWJqZWN0OiBDPVpBLCBTVD1XZXN0ZXJuIENhcGUsIEw9Q2FwZSBUb3duLCBPPVRoYXd0ZSBDb25zdWx0aW5nLCBPVT1DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uLCBDTj1UaGF3dGUgUGVyc29uYWwgUHJlbWl1bSBDQS9FbWFpbD1wZXJzb25hbC1wcmVtaXVtQHRoYXd0ZS5jb20KKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgxMDI0IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgxMDI0IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmM5OjY2OmQ5OmY4OjA3OjQ0OmNmOmI5OjhjOjJlOmYwOmExOmVmOjEzOgorICAgICAgICAgICAgICAgICAgICA0NTo2YzowNTpkZjpkZToyNzoxNjo1MTozNjo0MToxMTo2Yzo2YzozYjplZDoKKyAgICAgICAgICAgICAgICAgICAgZmU6MTA6N2Q6MTI6OWU6ZTU6OWI6NDI6OWE6ZmU6NjA6MzE6YzM6NjY6Yjc6CisgICAgICAgICAgICAgICAgICAgIDczOjNhOjQ4OmFlOjRlOmQwOjMyOjM3Ojk0Ojg4OmI1OjBkOmI2OmQ5OmYzOgorICAgICAgICAgICAgICAgICAgICBmMjo0NDpkOTpkNTo4ODoxMjpkZDo3Njo0ZDpmMjoxYTpmYzo2ZjoyMzoxZToKKyAgICAgICAgICAgICAgICAgICAgN2E6ZjE6ZDg6OTg6NDU6NGU6MDc6MTA6ZWY6MTY6NDI6ZDA6NDM6NzU6NmQ6CisgICAgICAgICAgICAgICAgICAgIDRhOmRlOmUyOmFhOmM5OjMxOmZmOjFmOjAwOjcwOjdjOjY2OmNmOjEwOjI1OgorICAgICAgICAgICAgICAgICAgICAwODpiYTpmYTplZTowMDplOTo0NjowMzo2NjoyNzoxMToxNTozYjphYTo1YjoKKyAgICAgICAgICAgICAgICAgICAgZjI6OTg6ZGQ6MzY6NDI6YjI6ZGE6ODg6NzUKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgICAgIFg1MDl2MyBleHRlbnNpb25zOgorICAgICAgICAgICAgWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzOiBjcml0aWNhbAorICAgICAgICAgICAgICAgIENBOlRSVUUKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA2OTozNjo4OTpmNzozNDoyYTozMzo3MjoyZjo2ZDozYjpkNDoyMjpiMjpiODo2Zjo5YTpjNToKKyAgICAgICAgMzY6NjY6MGU6MWI6M2M6YTE6YjE6NzU6NWE6ZTY6ZmQ6MzU6ZDM6Zjg6YTg6ZjI6MDc6NmY6CisgICAgICAgIDg1OjY3OjhlOmRlOjJiOmI5OmUyOjE3OmIwOjNhOmEwOmYwOjBlOmEyOjAwOjlhOmRmOmYzOgorICAgICAgICAxNDoxNTo2ZTpiYjpjODo4NTo1YTo5ODo4MDpmOTpmZjpiZTo3NDoxZDozZDpmMzpmZTozMDoKKyAgICAgICAgMjU6ZDE6Mzc6MzQ6Njc6ZmE6YTU6NzE6Nzk6MzA6NjE6Mjk6NzI6YzA6ZTA6MmM6NGM6ZmI6CisgICAgICAgIDU2OmU0OjNhOmE4OjZmOmU1OjMyOjU5OjUyOmRiOjc1OjI4OjUwOjU5OjBjOmY4OjBiOjE5OgorICAgICAgICBlNDphYzpkOTphZjo5Njo4ZDoyZjo1MDpkYjowNzpjMzplYToxZjphYjozMzplMDpmNToyYjoKKyAgICAgICAgMzE6ODkKKworVGhhd3RlIFByZW1pdW0gU2VydmVyIENBCis9PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogMDY6OUY6Njk6Nzk6MTY6NjY6OTA6MDI6MUI6OEM6OEM6QTI6QzM6MDc6NkY6M0EKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlESnpDQ0FwQ2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVFGQURDQnpqRUxNQWtHQTFVRUJoTUNXa0V4CitGVEFUQmdOVkJBZ1RERmRsYzNSbGNtNGdRMkZ3WlRFU01CQUdBMVVFQnhNSlEyRndaU0JVYjNkdU1SMHdHd1lECitWUVFLRXhSVWFHRjNkR1VnUTI5dWMzVnNkR2x1WnlCall6RW9NQ1lHQTFVRUN4TWZRMlZ5ZEdsbWFXTmhkR2x2CitiaUJUWlhKMmFXTmxjeUJFYVhacGMybHZiakVoTUI4R0ExVUVBeE1ZVkdoaGQzUmxJRkJ5WlcxcGRXMGdVMlZ5CitkbVZ5SUVOQk1TZ3dKZ1lKS29aSWh2Y05BUWtCRmhsd2NtVnRhWFZ0TFhObGNuWmxja0IwYUdGM2RHVXVZMjl0CitNQjRYRFRrMk1EZ3dNVEF3TURBd01Gb1hEVEl3TVRJek1USXpOVGsxT1Zvd2djNHhDekFKQmdOVkJBWVRBbHBCCitNUlV3RXdZRFZRUUlFd3hYWlhOMFpYSnVJRU5oY0dVeEVqQVFCZ05WQkFjVENVTmhjR1VnVkc5M2JqRWRNQnNHCitBMVVFQ2hNVVZHaGhkM1JsSUVOdmJuTjFiSFJwYm1jZ1kyTXhLREFtQmdOVkJBc1RIME5sY25ScFptbGpZWFJwCitiMjRnVTJWeWRtbGpaWE1nUkdsMmFYTnBiMjR4SVRBZkJnTlZCQU1UR0ZSb1lYZDBaU0JRY21WdGFYVnRJRk5sCitjblpsY2lCRFFURW9NQ1lHQ1NxR1NJYjNEUUVKQVJZWmNISmxiV2wxYlMxelpYSjJaWEpBZEdoaGQzUmxMbU52CitiVENCbnpBTkJna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBMGpZMmFvdlh3bHVlMm9GQllvODQ3a2tFCitWZGJRN3h3YmxSWkg3eGhJTlRwUzlDdHFCbzg3TCtwVzQ2K0dqWjRYOTU2MFpYVUNUZS9MQ2FJaFVkaWIwR2ZRCit1ZzJTQmhSejFKUExseW9BbkZ4T0RMejZGVkw4OGtSdTJoRktiZ2lmTHkzaithbzZobk8yUmxOWXlJa0Z2WU1SCit1SE0vcWdlTjlFSk41MENkSERjQ0F3RUFBYU1UTUJFd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBTkJna3Foa2lHCis5dzBCQVFRRkFBT0JnUUFtU0N3V3dsajY2QlowREtxcVgxUS84dGZKZUdCZVhtNDNZeUozTm42eUY4UTB1ZlVJCitoZnpKQVRqL1RiN3lGa0pENTd0YVJ2dkJ4aEVmOFVxd0tFYkp3OFJDZmJ6NnExbHUxYmRSaUJIanBJVVphNEpNCitwQXdTcmVta3JqL3h3MGxsbW96RnlENGx0NVNadTVJeWNRZndobDd0VUNlbURhWWorYnZMcGdjVVFnPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjogMSAoMHgxKQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9WkEsIFNUPVdlc3Rlcm4gQ2FwZSwgTD1DYXBlIFRvd24sIE89VGhhd3RlIENvbnN1bHRpbmcgY2MsIE9VPUNlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24sIENOPVRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQS9FbWFpbD1wcmVtaXVtLXNlcnZlckB0aGF3dGUuY29tCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBBdWcgIDEgMDA6MDA6MDAgMTk5NiBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IERlYyAzMSAyMzo1OTo1OSAyMDIwIEdNVAorICAgICAgICBTdWJqZWN0OiBDPVpBLCBTVD1XZXN0ZXJuIENhcGUsIEw9Q2FwZSBUb3duLCBPPVRoYXd0ZSBDb25zdWx0aW5nIGNjLCBPVT1DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uLCBDTj1UaGF3dGUgUHJlbWl1bSBTZXJ2ZXIgQ0EvRW1haWw9cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6ZDI6MzY6MzY6NmE6OGI6ZDc6YzI6NWI6OWU6ZGE6ODE6NDE6NjI6OGY6CisgICAgICAgICAgICAgICAgICAgIDM4OmVlOjQ5OjA0OjU1OmQ2OmQwOmVmOjFjOjFiOjk1OjE2OjQ3OmVmOjE4OgorICAgICAgICAgICAgICAgICAgICA0ODozNTozYTo1MjpmNDoyYjo2YTowNjo4ZjozYjoyZjplYTo1NjplMzphZjoKKyAgICAgICAgICAgICAgICAgICAgODY6OGQ6OWU6MTc6Zjc6OWU6YjQ6NjU6NzU6MDI6NGQ6ZWY6Y2I6MDk6YTI6CisgICAgICAgICAgICAgICAgICAgIDIxOjUxOmQ4OjliOmQwOjY3OmQwOmJhOjBkOjkyOjA2OjE0OjczOmQ0OjkzOgorICAgICAgICAgICAgICAgICAgICBjYjo5NzoyYTowMDo5Yzo1Yzo0ZTowYzpiYzpmYToxNTo1MjpmYzpmMjo0NDoKKyAgICAgICAgICAgICAgICAgICAgNmU6ZGE6MTE6NGE6NmU6MDg6OWY6MmY6MmQ6ZTM6Zjk6YWE6M2E6ODY6NzM6CisgICAgICAgICAgICAgICAgICAgIGI2OjQ2OjUzOjU4OmM4Ojg5OjA1OmJkOjgzOjExOmI4OjczOjNmOmFhOjA3OgorICAgICAgICAgICAgICAgICAgICA4ZDpmNDo0Mjo0ZDplNzo0MDo5ZDoxYzozNworICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBYNTA5djMgQmFzaWMgQ29uc3RyYWludHM6IGNyaXRpY2FsCisgICAgICAgICAgICAgICAgQ0E6VFJVRQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDI2OjQ4OjJjOjE2OmMyOjU4OmZhOmU4OjE2Ojc0OjBjOmFhOmFhOjVmOjU0OjNmOmYyOmQ3OgorICAgICAgICBjOTo3ODo2MDo1ZTo1ZTo2ZTozNzo2MzoyMjo3NzozNjo3ZTpiMjoxNzpjNDozNDpiOTpmNToKKyAgICAgICAgMDg6ODU6ZmM6Yzk6MDE6Mzg6ZmY6NGQ6YmU6ZjI6MTY6NDI6NDM6ZTc6YmI6NWE6NDY6ZmI6CisgICAgICAgIGMxOmM2OjExOjFmOmYxOjRhOmIwOjI4OjQ2OmM5OmMzOmM0OjQyOjdkOmJjOmZhOmFiOjU5OgorICAgICAgICA2ZTpkNTpiNzo1MTo4ODoxMTplMzphNDo4NToxOTo2Yjo4Mjo0YzphNDowYzoxMjphZDplOToKKyAgICAgICAgYTQ6YWU6M2Y6ZjE6YzM6NDk6NjU6OWE6OGM6YzU6Yzg6M2U6MjU6Yjc6OTQ6OTk6YmI6OTI6CisgICAgICAgIDMyOjcxOjA3OmYwOjg2OjVlOmVkOjUwOjI3OmE2OjBkOmE2OjIzOmY5OmJiOmNiOmE2OjA3OgorICAgICAgICAxNDo0MgorCitUaGF3dGUgU2VydmVyIENBCis9PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IEM1OjcwOkM0OkEyOkVEOjUzOjc4OjBDOkM4OjEwOjUzOjgxOjY0OkNCOkQwOjFECitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJREV6Q0NBbnlnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFRRkFEQ0J4REVMTUFrR0ExVUVCaE1DV2tFeAorRlRBVEJnTlZCQWdUREZkbGMzUmxjbTRnUTJGd1pURVNNQkFHQTFVRUJ4TUpRMkZ3WlNCVWIzZHVNUjB3R3dZRAorVlFRS0V4UlVhR0YzZEdVZ1EyOXVjM1ZzZEdsdVp5QmpZekVvTUNZR0ExVUVDeE1mUTJWeWRHbG1hV05oZEdsdgorYmlCVFpYSjJhV05sY3lCRWFYWnBjMmx2YmpFWk1CY0dBMVVFQXhNUVZHaGhkM1JsSUZObGNuWmxjaUJEUVRFbQorTUNRR0NTcUdTSWIzRFFFSkFSWVhjMlZ5ZG1WeUxXTmxjblJ6UUhSb1lYZDBaUzVqYjIwd0hoY05PVFl3T0RBeAorTURBd01EQXdXaGNOTWpBeE1qTXhNak0xT1RVNVdqQ0J4REVMTUFrR0ExVUVCaE1DV2tFeEZUQVRCZ05WQkFnVAorREZkbGMzUmxjbTRnUTJGd1pURVNNQkFHQTFVRUJ4TUpRMkZ3WlNCVWIzZHVNUjB3R3dZRFZRUUtFeFJVYUdGMworZEdVZ1EyOXVjM1ZzZEdsdVp5QmpZekVvTUNZR0ExVUVDeE1mUTJWeWRHbG1hV05oZEdsdmJpQlRaWEoyYVdObAorY3lCRWFYWnBjMmx2YmpFWk1CY0dBMVVFQXhNUVZHaGhkM1JsSUZObGNuWmxjaUJEUVRFbU1DUUdDU3FHU0liMworRFFFSkFSWVhjMlZ5ZG1WeUxXTmxjblJ6UUhSb1lYZDBaUzVqYjIwd2daOHdEUVlKS29aSWh2Y05BUUVCQlFBRAorZ1kwQU1JR0pBb0dCQU5Pa1VHN0kvMVpyNXM5ZHR1b01hSFZIb3FyQzJvUWwvS2owUjFIYWhiVWdkSlNHSGc5MQoreWVrSVlmVUdiVEJ1RlJrQzZWTEFZdHRObVo3aWFneEVPTTMrdnVOa0NYREYvckZyS2JZdlNjZzcxQ2NFSlJDWAorTCtlUWJjQW9RcG5YVEVQZXcvVWhiVlNmWGNOWTRjRGsyVnV3dU55MGU5ODJPc0sxWmlJUzFvY05BZ01CQUFHagorRXpBUk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUVCUUFEZ1lFQUIvcE1hVno3bGN4RworN29XRFRTRXdqc3JacUc5Skd1YmFVZU5nY0d5RVlSR2hHc2hJUGxsRGZVK1ZQYUdMdHd0aW1IcDFpdDJJVGs2ZQorUU51b3pESjB1VzhOeHVPelJBdlppbSthS1p1WkdDZzcwZU5BS0pwYVBOVzE1eUFiaThxa3E0M3BVZG5pVEN4WgorcWRxNXNuVWI5a0x5NzhmeUdQbUp2S1AvaWlNdWNFYz0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjogMSAoMHgxKQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9WkEsIFNUPVdlc3Rlcm4gQ2FwZSwgTD1DYXBlIFRvd24sIE89VGhhd3RlIENvbnN1bHRpbmcgY2MsIE9VPUNlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24sIENOPVRoYXd0ZSBTZXJ2ZXIgQ0EvRW1haWw9c2VydmVyLWNlcnRzQHRoYXd0ZS5jb20KKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IEF1ZyAgMSAwMDowMDowMCAxOTk2IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogRGVjIDMxIDIzOjU5OjU5IDIwMjAgR01UCisgICAgICAgIFN1YmplY3Q6IEM9WkEsIFNUPVdlc3Rlcm4gQ2FwZSwgTD1DYXBlIFRvd24sIE89VGhhd3RlIENvbnN1bHRpbmcgY2MsIE9VPUNlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24sIENOPVRoYXd0ZSBTZXJ2ZXIgQ0EvRW1haWw9c2VydmVyLWNlcnRzQHRoYXd0ZS5jb20KKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgxMDI0IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgxMDI0IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmQzOmE0OjUwOjZlOmM4OmZmOjU2OjZiOmU2OmNmOjVkOmI2OmVhOjBjOgorICAgICAgICAgICAgICAgICAgICA2ODo3NTo0NzphMjphYTpjMjpkYTo4NDoyNTpmYzphODpmNDo0Nzo1MTpkYToKKyAgICAgICAgICAgICAgICAgICAgODU6YjU6MjA6NzQ6OTQ6ODY6MWU6MGY6NzU6Yzk6ZTk6MDg6NjE6ZjU6MDY6CisgICAgICAgICAgICAgICAgICAgIDZkOjMwOjZlOjE1OjE5OjAyOmU5OjUyOmMwOjYyOmRiOjRkOjk5OjllOmUyOgorICAgICAgICAgICAgICAgICAgICA2YTowYzo0NDozODpjZDpmZTpiZTplMzo2NDowOTo3MDpjNTpmZTpiMTo2YjoKKyAgICAgICAgICAgICAgICAgICAgMjk6YjY6MmY6NDk6Yzg6M2I6ZDQ6Mjc6MDQ6MjU6MTA6OTc6MmY6ZTc6OTA6CisgICAgICAgICAgICAgICAgICAgIDZkOmMwOjI4OjQyOjk5OmQ3OjRjOjQzOmRlOmMzOmY1OjIxOjZkOjU0OjlmOgorICAgICAgICAgICAgICAgICAgICA1ZDpjMzo1ODplMTpjMDplNDpkOTo1YjpiMDpiODpkYzpiNDo3YjpkZjozNjoKKyAgICAgICAgICAgICAgICAgICAgM2E6YzI6YjU6NjY6MjI6MTI6ZDY6ODc6MGQKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgICAgIFg1MDl2MyBleHRlbnNpb25zOgorICAgICAgICAgICAgWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzOiBjcml0aWNhbAorICAgICAgICAgICAgICAgIENBOlRSVUUKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICAwNzpmYTo0Yzo2OTo1YzpmYjo5NTpjYzo0NjplZTo4NTo4Mzo0ZDoyMTozMDo4ZTpjYTpkOToKKyAgICAgICAgYTg6NmY6NDk6MWE6ZTY6ZGE6NTE6ZTM6NjA6NzA6NmM6ODQ6NjE6MTE6YTE6MWE6Yzg6NDg6CisgICAgICAgIDNlOjU5OjQzOjdkOjRmOjk1OjNkOmExOjhiOmI3OjBiOjYyOjk4OjdhOjc1OjhhOmRkOjg4OgorICAgICAgICA0ZTo0ZTo5ZTo0MDpkYjphODpjYzozMjo3NDpiOTo2ZjowZDpjNjplMzpiMzo0NDowYjpkOToKKyAgICAgICAgOGE6NmY6OWE6Mjk6OWI6OTk6MTg6Mjg6M2I6ZDE6ZTM6NDA6Mjg6OWE6NWE6M2M6ZDU6YjU6CisgICAgICAgIGU3OjIwOjFiOjhiOmNhOmE0OmFiOjhkOmU5OjUxOmQ5OmUyOjRjOjJjOjU5OmE5OmRhOmI5OgorICAgICAgICBiMjo3NToxYjpmNjo0MjpmMjplZjpjNzpmMjoxODpmOTo4OTpiYzphMzpmZjo4YToyMzoyZToKKyAgICAgICAgNzA6NDcKKworVGhhd3RlIFVuaXZlcnNhbCBDQSBSb290Cis9PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogMTc6QUY6NzE6MTY6NTI6N0I6NzM6NjU6MjI6MDU6Mjk6Mjg6ODQ6NzE6OUQ6MTMKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlSSWpDQ0NRb0NBUUF3RFFZSktvWklodmNOQVFFRkJRQXdWekVQTUEwR0ExVUVDaE1HVkdoaGQzUmxNU0V3CitId1lEVlFRTEV4aFVhR0YzZEdVZ1ZXNXBkbVZ5YzJGc0lFTkJJRkp2YjNReElUQWZCZ05WQkFNVEdGUm9ZWGQwCitaU0JWYm1sMlpYSnpZV3dnUTBFZ1VtOXZkREFlRncwNU9URXlNRFV4TXpVMk1EVmFGdzB6TnpBME1ETXhNelUyCitNRFZhTUZjeER6QU5CZ05WQkFvVEJsUm9ZWGQwWlRFaE1COEdBMVVFQ3hNWVZHaGhkM1JsSUZWdWFYWmxjbk5oCitiQ0JEUVNCU2IyOTBNU0V3SHdZRFZRUURFeGhVYUdGM2RHVWdWVzVwZG1WeWMyRnNJRU5CSUZKdmIzUXdnZ2dpCitNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUlEd0F3Z2dnS0FvSUlBUURpaVFWdHczK3Rwb2s2Lzd2SHpaMDNzZUhTCitJUjZiWVNvVjUzdFhUMVU4MEx2NTJUMCtwcnpzdEsxVG1oWUM2d3R5L1lyeWowUUZ4ZXZUNWIyMlJEbm0rMGUvCithcDRLbFJqaWFPTFdsdFlocllqOTlSZjEwOXBDcFpEdEtaV1dkVHJhaDZIVTlkT0gzZ1ZpcHVObWRKTFBwYnk3CiszMmovY1hWV1FWazE2ek5hWmxIeTBxTUt3WXpPYzF3UmJ5Mk1sWXlSc2YzUDVhMVdsY3lGa29PUVZVSEp3bmZ0CisrYU4wUWdwb0NQUFEwV1g5Wnl3MC95Ui81M25JQnpzbFY5MmtESmc5dnVETUdXWGI4bFNpcjBMVW5lS3VoQ01sCitDVE1TdFdvZWRzU0wyVWtBYkY2NkgvSWIybWZLSjZxalJDTWJnNExPOHFzejdWU2szTW1yV1dYUk9BN0JQaHRuCitqOVoxQWVCVkl0MTJkK3lPM2ZUUGVTSnR1VmNEOVprSXB6dytOUHZFRjY0aldNMGs4eVBLYWdJb2xBR0JOTFJzCithNjZMR3NPajBnazhGbFQxTmw4azQ1OUtvZUpreGhiRHBvRjZKRFpIanNGZUR2djVGWGdFMWc1WjJaMVlabUxTCitsQ2t5TXNoNHVXYjJ0VmJoYk1ZVVM1WlNXWkVDSkdwVlI5Yy90aU1hWUhlWEx1SkFyNTRFVjU2dEVjWEpRM0R2CitTTFJlckJ4cExpNkMxVnVMdm9LK0dSUmU1dzBpeDFFYi94NmI4VENQY1RFR3N6UW5qMTk2Wm9KUGlpMFRxMExQCitJVmFlbDQ1bU5nK1dtK1VyOUFLcEttcU1MTVREdUhBc0xTa2VQMUIzSG0wcVZPUlZDcEU0b2NXMVpxSjJXdTRQCit2N1JuNFNodUQrRTJvWUxSdjlSMzRjUm5NcE40eU9kVVUvNGplZVpvekNhUTloQmpYU3B2a1Mya2N6SlJJZks3CitGZCtxSkFoSUJ0NmhuaWEvdW9PL2ZLVElvSXk5MHYrOGhHa25FeVFZeEVVWUl5WmVHQlRLTG9pSFlxTlQ1aUczCit1SVY3bW9XN0ZTWnkrTG4zYW5RUFNUK1N2cWtGdDVrbnY3OEpGMHVaVEswUkVIemZkREgyanlaZnFvaXVPRmZJCitWUzNUKzlnYlVabStKUnM2dXNCOUcrM08wa201ei9QRmZZbVFnZGhwU0NBUW8vanZrbEVZTW9zUkdNQS9HNFZXCit6bGZKOG9Ka3h0OENDUzVLRVMreEoyMDNVdkR3Rm1IeFo0M2ZoM0t2aDlyUCsxQ1VidFNVaGV1S0xPb2g5WlpLCitSTlhnem1wMFJFM1FCZE9IRmUwMjBLU0xabFZ3ays1SEJzRitMcVVZZVdmektJWHhjUGNPZzZSK1ZKNWFkakxMCitaUnU0emZ2SUtBUFNWSkhScDhXRlF3Z1hkcVhtTDJjSTJLR2lnaTBNK01Hdlk5UlFkMjFyUmtwQmhkV1FYM2t0Cit4T3pYRVlkQWl1Rm80bVQ0VlRMN2I1TXMybmZaSWNFWDVUWXNUbjZRZjZ5VUt6Sm52amhRZHJpdVFiblhJY1VKCitUR0RJbzFIRU5KdFhOOS9MeVROWGkrdjdkcDhaVGNWcUh5cEZyaXZ0TDQybnBRRExCUG9sWWk1MFNCdktLb3k2CisyN1orOXJzQ2ZLbkQyMWg0b2Ivdy9ob1FWUkhPNkdsT2xtWEdGd1BXQjJpTVZJS3VIQ0pWUC9IMENaY293RWIzCitUZ3NsSGZjSDF3a2RPaGhYT0R2b013Ym5qM2hHSGx2MUJyYnN1S1lOOGJvVFM5WVlJTjFwTTBvekZhNjR5SmlLCitKeXlUdkMzNzdqTy9adVpOdXJhYkJsVmdsMHU4Uk0xKzlLSFlxaS9BQWlnaEZtSjQyd2hVOHZ6ME5PUEdqeHhECitWODZRR2t2Y0xqc29rWWsvZXRvMUhZNHM3a25zOURPdHlWT29qSjhFVXo0a0hGTEpFdmxpVjZPODdpenJRSHdnCitJM0FybGZsekY0clJ3UnhwcHJjNG1tZjNjQjE2V2d4QXoySVBoVHpDQWs1K3RmYkZLaW1Fc3g4M0t1R3Fja0xFCis3V3NhajVJY1hiN1I4bHZ5cTZxcDB2VzRwRUVySzVGdUVrakttTmczamNqdEFEQzF0Z1JPZnB6YWhPekErbnZsCitIWWlrVTBhd2xPUmNHNkVsTEE5SVVuZVhDV3pzV3hnemd3TGxnbjdOaFNFd0VmMG5UOC9rSHV3L3BWZHM2U293CitHU3FJNWNOcE9LdHZPWEYvaE9GQncrSE1Lb2tnVWk2REQydzVQMHN0RnF3dDhDU3NBSFAwbTdNR1B3VzRGSVVmCitxNTVjUEo1aW5RNXRPNEFKL0FMcW9wZDB5c2Y1NDFiaHc4cWxwcHJBa09Ba0VsUFN3b3ZhdnUwQ1ExNW40WW1ZCitlZTdMcXNyREc5em5wVWFsZkdzV2g3WmFLTmZiSnp4ZXBiMjJVZDBmUTg4N0pzZzZqU1Zod1VuMFBCdkpST3F2CitITUlybEFFcURqRFJXNHNyUitYRDBRUURtdzQ1TE5ZbjFPWndXdGwxenlyWXlRQUY1Qk9JN01NNSs0ZGhNRFpECitBOGllbktJR3dpL0YvUENBWTdGVUJLQk1xUzdHOVhaNjJORGsxSlFSNVJXMWVBYmN1SUNQbWFrZ016MFFoVXhsCitDY28rV0Y1Z2s1cXFZbDNBVVFZY1hXQ2dEWnhMUS9hbkZpR2toNnJ5d1M3dWtqQzRudC9mRUFHTGhnbHcyR3lvCit0MUFlRnBhMDkyZjlOVG9oa0NveXh3QjdUUWNRQ2JrdmM5Z1lmbWVaQkU4Ry9GREhoWnVkUUoyemxqZjZwZHl5Citjazd2VGdrcy9aSDlUZmU3cHFFK3EzdWlBMENtcVZVbjR2cjVHYzZIZGFyeGRUYno4N2lSK0pIRGkzVVRqa3hsCittaFk1YXVVMDZIcVdXWDgxc0FEOVcybjhReWI2OVNodS9vZlpmaVQ3dEtDQ2JsU2kvNjYvWXJUMGNnSEN5NWhICittT0ZNdFJlQWdNNlBwaWp1SGtWcSs5L3hIZnhhTzlicTlHd2RZa2xYTzRxUGh1cndVd1RPbkJaby83cTUvSWdQCitSL2NDUkhKQXVNbzdMVk9kM0R4V2pGbDdhQm9zalhHN2JBREhHczV2UUpLeG95OFAyVVR5bzNBdW51NE9yakxRCitPejZMQitybWViTmNLZUo5YTZoZStWb3g2QWlXb293RG1FYnh1SDJRVkNidGRtTCtudW1hYmw3SlNjZGNORk1wCitWTm5zNUViaGdEdDEyZC83ZWRXSDhicWU2eG5PVEZKejVsdUhyaVZQT1huTXhyajVFSHZzOEp0eHBBV2cweW5UCitUbjhmOUMwb2VNeFZsWHNla1MvTVZoaHppN0xidkdrSDV0RFlUKzJpLzFpRm8yM2dTbE8zWjMyTkRGeGJlM2NvCitBalZFZWdUVEtFUElhekFYWFRLNEtUVzZkdG83RkVwMkdGaWsrSkk4bmswemIwWnJDTmt4U0dqZDlQc2tWalN5Cit6MmxtdmtqU2ltWWl6ZkpwemNKVEUwVXBRU0xXWFpnZnRxU3lvOEx1QWk5Ukc5eURwT3h3SmFqVUNHRXliK1NoCitnUzU4WTNMNktXVzhjRVRQWFFJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUlBUUJWbWpScUlnWnBDVVV6Cit4NjZwWE1jSlRwdUd2RUdRMUpSUzlzMGpLWlJMSXMzb3ZmNmR6Vkx5dmUycmg4bXJxMFlFdEwyaVB5SXdSMURBCitTNHgyRHdQMWt0S3hMY1I2Tlp6SmM0ZnJwcC9lRDNPTjAzK1oyTHFQYjhUenZocXVpNktVTnBEaTVldU5CZlQ4CitaZCtWOGNTVVRSZFcxNTg4ajFBODUzZS9sWVltWlB0cS84YmE2WXl1UXJ0cDVUUEcyT2tOeGxVaFNjRU10S1A1CittMHRjM29OUFFRUE9LbmxvT0gzd1ZFa2c5YllRL3dqY00yYVdtLzhHM2dDZTE4NVdRNXBSL0hETjl2QlJvN2ZOCit0RnlGWXMxeHQ4WXJJeXZkdzI1QVF2bzMvemNjOW5wWGxJZUZJOWZVeWNkZndVMHZ5UTNYWE95Y0plNmVNSUtSCitsbks0ZFIzNENXaFhsN0l0Uys0bDdIb2tLZTV5MUp3VDI2dmNBd3JZU2hUSkNGZEVYYUcxVTRBMDhoU1h6MUxlCitvZzZLRU9rVTc5Qmd2bUdoOFNWZDFSaHpQNU1ReXBidXMwRFMyNk5WejFkYXBRNVBkVWZmNnZlUW1tMzFjQzRkCitGQnczWkFSWlVMRGNjb1p2bkRjOVhTaXZjMVh2MHU0a2RIUVQ3OXpiTVVuN1AyUDEwd2crTTZYbm5RcmVVeXhSCitqbWZibTBGbFFWQzkxS1NXYkllOEV1Q1V4OVBBNU10eldBQ0Q0YXduaGRhZFU1MWN2UW8rQTBPY0RKSDFiWHY0CitRSEoxcXhGMmtTdmh4cW9mY0dsMmNCVUovcFBRMWkyM0ZXcWJaMXkwYVo4bHBuMksrMzBpcVhIeXprNk11Q0V0CiszdjVCY1EzL25leHpwcnNIVDRnT1dFY3VmcW5DeDNqZHVucWVUdUF3VG1OdmhkUWdRZW42L2tORjUvdXZlckxPCitwQVVkSXBwWWh0L2t6a3lwL3RnV3BXLzcyTTVXZS9YV0lPL2tSODFqSlArNXZ2RklvOEVCY3VhOXdLM3RKZzNLCitOSi84QWkwZ1R3VWdyaUU5RE1JZ1BEL3dCSVRjejRuOXVTV1JqdEJENXJNZ3Exd3QxVUNlb0V2WTlMTE1mZkZZCitDbzZIN1lpc05wYmtWcUFSaXZLYTBMTlhvelM3R2FzNDRYUnJJc1F4emdIVkd6YmpIamhNTTVQZlFPTlpWMDZzCitibnNlV2ozRkhWdXN5QkNDTlFJaXN2eDE2QkNSamNSOWVKTkhuaHlkckd0aUFsaU0xaHdqMXE5NHdvQ2NwS29rCitWQlMxRkpqRytDc2FKTXR4TWdyaW13NXBhOTErakdUUkxtUHZEbit4UG9oTW5WWGx5VzRYQkxkQi83MktRY3NsCitNVzlFZHo5SHNmeUJpQWVPQlVrZ3R4SFphUU1xQTUyNU00U2EzOTk2NDBaem85aWlqRk1aaUZWTWRMajJSSVFyCiswUlF0VGprdWttai9hZnlGWWh2clZVL3ZKWVJpUlpuVzJFNXZQMU1JZlIwR2xZR0FmMDlPZERhWXRlS0hjSmpjCisxL1hjVWhYbXh0WjVsamwvajVYUHE0QlRyUnNMUlVBTzFCaTlMTjZLZDNiOThrUkh4aUhRNUhUdzJCZ0Z5SHd3Citjc2ZmOGJ2OEFqQ3A5RUltV1EyVEJZS2hjKzAwNVRoZHpWQ1EvcFQ4RTd5OS9LaWlpS2R6eExLbzBWMkl4QUtpCitldkVFeWY2TWRNbnZIV1JCbjZ3ZWxtZGtyS3NvUWNlZDk4Q1lHMjRId21SOVdvTm1WaWcybk9mN0hIY09LS0RFCis5MnQ1T1FRZ2hNZFhrN3dib09xODYwTGxxQkgrL0t4bHpQMzRLSWowcFpybGMxSGdxSnNOQTNkTzVlQ1lzNGphCitmZWJHbm53VVpzRXVVMHFTQnplZ2Z1azlDZVFWZk0vOXVFR2w3NTVtbmNSZUJ4MkgrRUd0NnVjdjBrRmpHRGY1CitGT05OME9YM1EvMFY0L2syY3dZbTN3RlBxY05PM2lCR2Q1aTBlaVFyTzNVclRsaU5tMTJreHhhZ3ZES0lQNkdECis4d0RJK05oWTZXTmRUQ3UxOEhKQjJLdDNOOVp5ZEs2Mk5weklwb05KUytESlZnc3B2Z0F3eTkzV3lFS0tBTm5zCitGZEUwY2ZKYlpJZjJKOUszNjRhd2tMOHAyeUdlTm96aklDK1ZJMUZzRzhLazFlYllBa05ub1A2YlVBTkVmN3ZrCitjdFhSNU5xUGtoUmsrMTBVRUJKS2xRYkpaUWdweWlHakpqZ1J5U2ZmY0djRS9jcElNbjlqc2tWME1WQlBoOWtnCitjTkloY0xIV0VKMHpYWGlEa1cxVmd1emE1R0pqeDRGRzF4bGxjaXBER1pDNDF5Tk5UQnpnUktsbVo2enVjWGtuCitKbmh0Y2c3MVhVc2p0WHg4WmVrWHhqb0xEZDFlSGxIRGhyanNmOGNuU3FWRzZHb3RHY0dIbzh1Wms0ZGtvbFVVCitUTGREcFpQWDU5Sk9lVURLWlpsR1BUOTZnSHFJYXN3ZTVXc3pSdlJRd05VZkNiak5paTZoSit0ZGM2Zm9hd3JsCitWNElxc1B6aVZGSlc4S3VwRXNZamxnY2tuT0M4UnFXMElBVGFDWk5qNWRRdXduN0ZNZTIxRlhTR0Y3bXo4eWFLCitIUUpxMmhvLzZMcnhCRzJVVVZUaVdyUlpneDFnMEMxenpBZTFKb3o1MThhSWtlK0F6MTBQb1dETFJkUkNJdEd4CitjQjM5MExjd2tEckdTRzFuNVRMYWo5dmpxT01kSUNXaUhPRk11YVQyeGo5Y1dBMjd4ckozQVJhUm54Y0dEYmRBCitQc3lQanB4TDRKMStteDRGcTRnaSt0TW9HMWNVWkVvK0pDdzRUU0ZwQUhNdTBGVXRkUElWNkpSRFBrQXF4c2E1CithbHZlb3N3WVVGUmRUaXFGYlBhU2l5a1pmdWZxU3VBaUt5Vzg5MmJQZDVwQmRQSThGQTEwYWZWUWc4M05MeUhiCitJa2FLMFBkUkdwVlg4Z1dMR2hudE8wWG9Oc0p1ZnZ0WElnQWZCbE9wcnBQR2ozRXFNVVdTNTQ1dDVwa2l3SVA4Cis3OXhYWm5kUG9qWXgrNkVUamVYS281VjlBUXhrY0R0VFFtaUF4N3VkcUFBMWFaZ01xR2ZZUStXcXo1WGdVWldrCitGejlDbmJnRXp0TjVlY2pUaWhZeWt1RFhvdTdYTjB3dnJMaDd2a1gyOFJnem5IczNwaVRadkVDckFPbkRONHVyCisyTGJ6WG9GT3NCUnJCejRmN01MMlJDS1Z1N1BtYjliNWNHVzZDb05scWc0VEw0TVRJMU9MUUJiNnppLzhUUVQ0Cis2OWlzeFRiQ0ZWZElPT3hWczdRZXVxM1NRZ1lYRFhQSVY2YStsazJwOHNEN2VpRWM5Y2x3cVlLUXRmRU0xSGtRCit2b0dtNlZ4aG5IZDVtcVRETnlaWE44bFNMUG9JLzlCZnhtSEE5SGErL041T3o2dFJtWEhIMzM3MDFzOEdWaGtUCitVd3R0ZEZsSUdadFRCUzJkTWxUVDVTeFRpMlErMUdSNzQ0QUpGTXorRmtaamEzRnArUG5MSi9hSVZMeEZzODRDCit5SlR1UUZ2NVFnTEMvN0RZTE9zb2YxN0pKZ0dacHc9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMSAoMHgwKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiAwICgweDApCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IE89VGhhd3RlLCBPVT1UaGF3dGUgVW5pdmVyc2FsIENBIFJvb3QsIENOPVRoYXd0ZSBVbml2ZXJzYWwgQ0EgUm9vdAorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogRGVjICA1IDEzOjU2OjA1IDE5OTkgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBBcHIgIDMgMTM6NTY6MDUgMjAzNyBHTVQKKyAgICAgICAgU3ViamVjdDogTz1UaGF3dGUsIE9VPVRoYXd0ZSBVbml2ZXJzYWwgQ0EgUm9vdCwgQ049VGhhd3RlIFVuaXZlcnNhbCBDQSBSb290CisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTYzODQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDE2Mzg0IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmUyOjg5OjA1OjZkOmMzOjdmOmFkOmE2Ojg5OjNhOmZmOmJiOmM3OmNkOgorICAgICAgICAgICAgICAgICAgICA5ZDozNzpiMTplMTpkMjoyMToxZTo5Yjo2MToyYToxNTplNzo3Yjo1Nzo0ZjoKKyAgICAgICAgICAgICAgICAgICAgNTU6M2M6ZDA6YmI6Zjk6ZDk6M2Q6M2U6YTY6YmM6ZWM6YjQ6YWQ6NTM6OWE6CisgICAgICAgICAgICAgICAgICAgIDE2OjAyOmViOjBiOjcyOmZkOjhhOmYyOjhmOjQ0OjA1OmM1OmViOmQzOmU1OgorICAgICAgICAgICAgICAgICAgICBiZDpiNjo0NDozOTplNjpmYjo0NzpiZjo2YTo5ZTowYTo5NToxODplMjo2ODoKKyAgICAgICAgICAgICAgICAgICAgZTI6ZDY6OTY6ZDY6MjE6YWQ6ODg6ZmQ6ZjU6MTc6ZjU6ZDM6ZGE6NDI6YTU6CisgICAgICAgICAgICAgICAgICAgIDkwOmVkOjI5Ojk1Ojk2Ojc1OjNhOmRhOjg3OmExOmQ0OmY1OmQzOjg3OmRlOgorICAgICAgICAgICAgICAgICAgICAwNTo2MjphNjplMzo2Njo3NDo5MjpjZjphNTpiYzpiYjpkZjo2ODpmZjo3MToKKyAgICAgICAgICAgICAgICAgICAgNzU6NTY6NDE6NTk6MzU6ZWI6MzM6NWE6NjY6NTE6ZjI6ZDI6YTM6MGE6YzE6CisgICAgICAgICAgICAgICAgICAgIDhjOmNlOjczOjVjOjExOjZmOjJkOjhjOjk1OjhjOjkxOmIxOmZkOmNmOmU1OgorICAgICAgICAgICAgICAgICAgICBhZDo1Njo5NTpjYzo4NTo5Mjo4Mzo5MDo1NTo0MTpjOTpjMjo3NzplZDpmOToKKyAgICAgICAgICAgICAgICAgICAgYTM6NzQ6NDI6MGE6Njg6MDg6ZjM6ZDA6ZDE6NjU6ZmQ6Njc6MmM6MzQ6ZmY6CisgICAgICAgICAgICAgICAgICAgIDI0OjdmOmU3Ojc5OmM4OjA3OjNiOjI1OjU3OmRkOmE0OjBjOjk4OjNkOmJlOgorICAgICAgICAgICAgICAgICAgICBlMDpjYzoxOTo2NTpkYjpmMjo1NDphMjphZjo0MjpkNDo5ZDplMjphZTo4NDoKKyAgICAgICAgICAgICAgICAgICAgMjM6MjU6MDk6MzM6MTI6YjU6NmE6MWU6NzY6YzQ6OGI6ZDk6NDk6MDA6NmM6CisgICAgICAgICAgICAgICAgICAgIDVlOmJhOjFmOmYyOjFiOmRhOjY3OmNhOjI3OmFhOmEzOjQ0OjIzOjFiOjgzOgorICAgICAgICAgICAgICAgICAgICA4MjpjZTpmMjphYjozMzplZDo1NDphNDpkYzpjOTphYjo1OTo2NTpkMTozODoKKyAgICAgICAgICAgICAgICAgICAgMGU6YzE6M2U6MWI6Njc6OGY6ZDY6NzU6MDE6ZTA6NTU6MjI6ZGQ6NzY6Nzc6CisgICAgICAgICAgICAgICAgICAgIGVjOjhlOmRkOmY0OmNmOjc5OjIyOjZkOmI5OjU3OjAzOmY1Ojk5OjA4OmE3OgorICAgICAgICAgICAgICAgICAgICAzYzozZTozNDpmYjpjNDoxNzphZToyMzo1ODpjZDoyNDpmMzoyMzpjYTo2YToKKyAgICAgICAgICAgICAgICAgICAgMDI6Mjg6OTQ6MDE6ODE6MzQ6YjQ6NmM6NmI6YWU6OGI6MWE6YzM6YTM6ZDI6CisgICAgICAgICAgICAgICAgICAgIDA5OjNjOjE2OjU0OmY1OjM2OjVmOjI0OmUzOjlmOjRhOmExOmUyOjY0OmM2OgorICAgICAgICAgICAgICAgICAgICAxNjpjMzphNjo4MTo3YToyNDozNjo0Nzo4ZTpjMTo1ZTowZTpmYjpmOToxNToKKyAgICAgICAgICAgICAgICAgICAgNzg6MDQ6ZDY6MGU6NTk6ZDk6OWQ6NTg6NjY6NjI6ZDI6OTQ6Mjk6MzI6MzI6CisgICAgICAgICAgICAgICAgICAgIGM4Ojc4OmI5OjY2OmY2OmI1OjU2OmUxOjZjOmM2OjE0OjRiOjk2OjUyOjU5OgorICAgICAgICAgICAgICAgICAgICA5MTowMjoyNDo2YTo1NTo0NzpkNzozZjpiNjoyMzoxYTo2MDo3Nzo5NzoyZToKKyAgICAgICAgICAgICAgICAgICAgZTI6NDA6YWY6OWU6MDQ6NTc6OWU6YWQ6MTE6YzU6Yzk6NDM6NzA6ZWY6NDg6CisgICAgICAgICAgICAgICAgICAgIGI0OjVlOmFjOjFjOjY5OjJlOjJlOjgyOmQ1OjViOjhiOmJlOjgyOmJlOjE5OgorICAgICAgICAgICAgICAgICAgICAxNDo1ZTplNzowZDoyMjpjNzo1MToxYjpmZjoxZTo5YjpmMTozMDo4Zjo3MToKKyAgICAgICAgICAgICAgICAgICAgMzE6MDY6YjM6MzQ6Mjc6OGY6NWY6N2E6NjY6ODI6NGY6OGE6MmQ6MTM6YWI6CisgICAgICAgICAgICAgICAgICAgIDQyOmNmOjIxOjU2OjllOjk3OjhlOjY2OjM2OjBmOjk2OjliOmU1OjJiOmY0OgorICAgICAgICAgICAgICAgICAgICAwMjphOToyYTo2YTo4YzoyYzpjNDpjMzpiODo3MDoyYzoyZDoyOToxZTozZjoKKyAgICAgICAgICAgICAgICAgICAgNTA6Nzc6MWU6NmQ6MmE6NTQ6ZTQ6NTU6MGE6OTE6Mzg6YTE6YzU6YjU6NjY6CisgICAgICAgICAgICAgICAgICAgIGEyOjc2OjVhOmVlOjBmOmJmOmI0OjY3OmUxOjI4OjZlOjBmOmUxOjM2OmExOgorICAgICAgICAgICAgICAgICAgICA4MjpkMTpiZjpkNDo3NzplMTpjNDo2NzozMjo5Mzo3ODpjODplNzo1NDo1MzoKKyAgICAgICAgICAgICAgICAgICAgZmU6MjM6Nzk6ZTY6Njg6Y2M6MjY6OTA6ZjY6MTA6NjM6NWQ6MmE6NmY6OTE6CisgICAgICAgICAgICAgICAgICAgIDJkOmE0OjczOjMyOjUxOjIxOmYyOmJiOjE1OmRmOmFhOjI0OjA4OjQ4OjA2OgorICAgICAgICAgICAgICAgICAgICBkZTphMTo5ZToyNjpiZjpiYTo4MzpiZjo3YzphNDpjODphMDo4YzpiZDpkMjoKKyAgICAgICAgICAgICAgICAgICAgZmY6YmM6ODQ6Njk6Mjc6MTM6MjQ6MTg6YzQ6NDU6MTg6MjM6MjY6NWU6MTg6CisgICAgICAgICAgICAgICAgICAgIDE0OmNhOjJlOjg4Ojg3OjYyOmEzOjUzOmU2OjIxOmI3OmI4Ojg1OjdiOjlhOgorICAgICAgICAgICAgICAgICAgICA4NTpiYjoxNToyNjo3MjpmODpiOTpmNzo2YTo3NDowZjo0OTozZjo5MjpiZToKKyAgICAgICAgICAgICAgICAgICAgYTk6MDU6Yjc6OTk6Mjc6YmY6YmY6MDk6MTc6NGI6OTk6NGM6YWQ6MTE6MTA6CisgICAgICAgICAgICAgICAgICAgIDdjOmRmOjc0OjMxOmY2OjhmOjI2OjVmOmFhOjg4OmFlOjM4OjU3OmM4OjU1OgorICAgICAgICAgICAgICAgICAgICAyZDpkMzpmYjpkODoxYjo1MTo5OTpiZToyNToxYjozYTpiYTpjMDo3ZDoxYjoKKyAgICAgICAgICAgICAgICAgICAgZWQ6Y2U6ZDI6NDk6Yjk6Y2Y6ZjM6YzU6N2Q6ODk6OTA6ODE6ZDg6Njk6NDg6CisgICAgICAgICAgICAgICAgICAgIDIwOjEwOmEzOmY4OmVmOjkyOjUxOjE4OjMyOjhiOjExOjE4OmMwOjNmOjFiOgorICAgICAgICAgICAgICAgICAgICA4NTo1NjpjZTo1NzpjOTpmMjo4Mjo2NDpjNjpkZjowMjowOToyZTo0YToxMToKKyAgICAgICAgICAgICAgICAgICAgMmY6YjE6Mjc6NmQ6Mzc6NTI6ZjA6ZjA6MTY6NjE6ZjE6Njc6OGQ6ZGY6ODc6CisgICAgICAgICAgICAgICAgICAgIDcyOmFmOjg3OmRhOmNmOmZiOjUwOjk0OjZlOmQ0Ojk0Ojg1OmViOjhhOjJjOgorICAgICAgICAgICAgICAgICAgICBlYToyMTpmNTo5Njo0YTo0NDpkNTplMDpjZTo2YTo3NDo0NDo0ZDpkMDowNToKKyAgICAgICAgICAgICAgICAgICAgZDM6ODc6MTU6ZWQ6MzY6ZDA6YTQ6OGI6NjY6NTU6NzA6OTM6ZWU6NDc6MDY6CisgICAgICAgICAgICAgICAgICAgIGMxOjdlOjJlOmE1OjE4Ojc5OjY3OmYzOjI4Ojg1OmYxOjcwOmY3OjBlOjgzOgorICAgICAgICAgICAgICAgICAgICBhNDo3ZTo1NDo5ZTo1YTo3NjozMjpjYjo2NToxYjpiODpjZDpmYjpjODoyODoKKyAgICAgICAgICAgICAgICAgICAgMDM6ZDI6NTQ6OTE6ZDE6YTc6YzU6ODU6NDM6MDg6MTc6NzY6YTU6ZTY6MmY6CisgICAgICAgICAgICAgICAgICAgIDY3OjA4OmQ4OmExOmEyOjgyOjJkOjBjOmY4OmMxOmFmOjYzOmQ0OjUwOjc3OgorICAgICAgICAgICAgICAgICAgICA2ZDo2Yjo0Njo0YTo0MTo4NTpkNTo5MDo1Zjo3OToyZDpjNDplYzpkNzoxMToKKyAgICAgICAgICAgICAgICAgICAgODc6NDA6OGE6ZTE6Njg6ZTI6NjQ6Zjg6NTU6MzI6ZmI6NmY6OTM6MmM6ZGE6CisgICAgICAgICAgICAgICAgICAgIDc3OmQ5OjIxOmMxOjE3OmU1OjM2OjJjOjRlOjdlOjkwOjdmOmFjOjk0OjJiOgorICAgICAgICAgICAgICAgICAgICAzMjo2NzpiZTozODo1MDo3NjpiODphZTo0MTpiOTpkNzoyMTpjNTowOTo0YzoKKyAgICAgICAgICAgICAgICAgICAgNjA6Yzg6YTM6NTE6YzQ6MzQ6OWI6NTc6Mzc6ZGY6Y2I6Yzk6MzM6NTc6OGI6CisgICAgICAgICAgICAgICAgICAgIGViOmZiOjc2OjlmOjE5OjRkOmM1OjZhOjFmOjJhOjQ1OmFlOjJiOmVkOjJmOgorICAgICAgICAgICAgICAgICAgICA4ZDphNzphNTowMDpjYjowNDpmYToyNTo2MjoyZTo3NDo0ODoxYjpjYToyYToKKyAgICAgICAgICAgICAgICAgICAgOGM6YmE6ZGI6YjY6N2U6ZjY6YmI6MDI6N2M6YTk6YzM6ZGI6NTg6Nzg6YTE6CisgICAgICAgICAgICAgICAgICAgIGJmOmYwOmZlOjFhOjEwOjU1OjExOmNlOmU4OjY5OjRlOjk2OjY1OmM2OjE3OgorICAgICAgICAgICAgICAgICAgICAwMzpkNjowNzo2ODo4Yzo1NDo4MjphZToxYzoyMjo1NTozZjpmMTpmNDowOToKKyAgICAgICAgICAgICAgICAgICAgOTc6Mjg6YzA6NDY6Zjc6NGU6MGI6MjU6MWQ6Zjc6MDc6ZDc6MDk6MWQ6M2E6CisgICAgICAgICAgICAgICAgICAgIDE4OjU3OjM4OjNiOmU4OjMzOjA2OmU3OjhmOjc4OjQ2OjFlOjViOmY1OjA2OgorICAgICAgICAgICAgICAgICAgICBiNjplYzpiODphNjowZDpmMTpiYToxMzo0YjpkNjoxODoyMDpkZDo2OTozMzoKKyAgICAgICAgICAgICAgICAgICAgNGE6MzM6MTU6YWU6Yjg6Yzg6OTg6OGE6Mjc6MmM6OTM6YmM6MmQ6ZmI6ZWU6CisgICAgICAgICAgICAgICAgICAgIDMzOmJmOjY2OmU2OjRkOmJhOmI2OjliOjA2OjU1OjYwOjk3OjRiOmJjOjQ0OgorICAgICAgICAgICAgICAgICAgICBjZDo3ZTpmNDphMTpkODphYToyZjpjMDowMjoyODoyMToxNjo2Mjo3ODpkYjoKKyAgICAgICAgICAgICAgICAgICAgMDg6NTQ6ZjI6ZmM6ZjQ6MzQ6ZTM6YzY6OGY6MWM6NDM6NTc6Y2U6OTA6MWE6CisgICAgICAgICAgICAgICAgICAgIDRiOmRjOjJlOjNiOjI4OjkxOjg5OjNmOjdhOmRhOjM1OjFkOjhlOjJjOmVlOgorICAgICAgICAgICAgICAgICAgICA0OTplYzpmNDozMzphZDpjOTo1MzphODo4Yzo5ZjowNDo1MzozZToyNDoxYzoKKyAgICAgICAgICAgICAgICAgICAgNTI6Yzk6MTI6Zjk6NjI6NTc6YTM6YmM6ZWU6MmM6ZWI6NDA6N2M6MjA6MjM6CisgICAgICAgICAgICAgICAgICAgIDcwOjJiOjk1OmY5OjczOjE3OjhhOmQxOmMxOjFjOjY5OmE2OmI3OjM4OjlhOgorICAgICAgICAgICAgICAgICAgICA2NzpmNzo3MDoxZDo3YTo1YTowYzo0MDpjZjo2MjowZjo4NTozYzpjMjowMjoKKyAgICAgICAgICAgICAgICAgICAgNGU6N2U6YjU6ZjY6YzU6MmE6Mjk6ODQ6YjM6MWY6Mzc6MmE6ZTE6YWE6NzI6CisgICAgICAgICAgICAgICAgICAgIDQyOmM0OmVkOjZiOjFhOjhmOjkyOjFjOjVkOmJlOmQxOmYyOjViOmYyOmFiOgorICAgICAgICAgICAgICAgICAgICBhYTphOTpkMjpmNTpiODphNDo0MToyYjoyYjo5MTo2ZToxMjo0ODpjYTo5ODoKKyAgICAgICAgICAgICAgICAgICAgZDg6Mzc6OGQ6Yzg6ZWQ6MDA6MzA6YjU6YjY6MDQ6NGU6N2U6OWM6ZGE6ODQ6CisgICAgICAgICAgICAgICAgICAgIGVjOmMwOmZhOjdiOmU1OjFkOjg4OmE0OjUzOjQ2OmIwOjk0OmU0OjVjOjFiOgorICAgICAgICAgICAgICAgICAgICBhMToyNToyYzowZjo0ODo1Mjo3Nzo5NzowOTo2YzplYzo1YjoxODozMzo4MzoKKyAgICAgICAgICAgICAgICAgICAgMDI6ZTU6ODI6N2U6Y2Q6ODU6MjE6MzA6MTE6ZmQ6Mjc6NGY6Y2Y6ZTQ6MWU6CisgICAgICAgICAgICAgICAgICAgIGVjOjNmOmE1OjU3OjZjOmU5OjJhOjMwOjE5OjJhOjg4OmU1OmMzOjY5OjM4OgorICAgICAgICAgICAgICAgICAgICBhYjo2ZjozOTo3MTo3Zjo4NDplMTo0MTpjMzplMTpjYzoyYTo4OToyMDo1MjoKKyAgICAgICAgICAgICAgICAgICAgMmU6ODM6MGY6NmM6Mzk6M2Y6NGI6MmQ6MTY6YWM6MmQ6ZjA6MjQ6YWM6MDA6CisgICAgICAgICAgICAgICAgICAgIDczOmY0OjliOmIzOjA2OjNmOjA1OmI4OjE0Ojg1OjFmOmFiOjllOjVjOjNjOgorICAgICAgICAgICAgICAgICAgICA5ZTo2Mjo5ZDowZTo2ZDozYjo4MDowOTpmYzowMjplYTphMjo5Nzo3NDpjYToKKyAgICAgICAgICAgICAgICAgICAgYzc6Zjk6ZTM6NTY6ZTE6YzM6Y2E6YTU6YTY6OWE6YzA6OTA6ZTA6MjQ6MTI6CisgICAgICAgICAgICAgICAgICAgIDUzOmQyOmMyOjhiOmRhOmJlOmVkOjAyOjQzOjVlOjY3OmUxOjg5Ojk4Ojc5OgorICAgICAgICAgICAgICAgICAgICBlZTpjYjphYTpjYTpjMzoxYjpkYzplNzphNTo0NjphNTo3Yzo2YjoxNjo4NzoKKyAgICAgICAgICAgICAgICAgICAgYjY6NWE6Mjg6ZDc6ZGI6Mjc6M2M6NWU6YTU6YmQ6YjY6NTE6ZGQ6MWY6NDM6CisgICAgICAgICAgICAgICAgICAgIGNmOjNiOjI2OmM4OjNhOjhkOjI1OjYxOmMxOjQ5OmY0OjNjOjFiOmM5OjQ0OgorICAgICAgICAgICAgICAgICAgICBlYTphZjoxYzpjMjoyYjo5NDowMToyYTowZTozMDpkMTo1Yjo4YjoyYjo0NzoKKyAgICAgICAgICAgICAgICAgICAgZTU6YzM6ZDE6MDQ6MDM6OWI6MGU6Mzk6MmM6ZDY6Mjc6ZDQ6ZTY6NzA6NWE6CisgICAgICAgICAgICAgICAgICAgIGQ5Ojc1OmNmOjJhOmQ4OmM5OjAwOjA1OmU0OjEzOjg4OmVjOmMzOjM5OmZiOgorICAgICAgICAgICAgICAgICAgICA4Nzo2MTozMDozNjo0MzowMzpjODo5ZTo5YzphMjowNjpjMjoyZjpjNTpmYzoKKyAgICAgICAgICAgICAgICAgICAgZjA6ODA6NjM6YjE6NTQ6MDQ6YTA6NGM6YTk6MmU6YzY6ZjU6NzY6N2E6ZDg6CisgICAgICAgICAgICAgICAgICAgIGQwOmU0OmQ0Ojk0OjExOmU1OjE1OmI1Ojc4OjA2OmRjOmI4OjgwOjhmOjk5OgorICAgICAgICAgICAgICAgICAgICBhOToyMDozMzozZDoxMDo4NTo0Yzo2NTowOTpjYTozZTo1ODo1ZTo2MDo5MzoKKyAgICAgICAgICAgICAgICAgICAgOWE6YWE6NjI6NWQ6YzA6NTE6MDY6MWM6NWQ6NjA6YTA6MGQ6OWM6NGI6NDM6CisgICAgICAgICAgICAgICAgICAgIGY2OmE3OjE2OjIxOmE0Ojg3OmFhOmYyOmMxOjJlOmVlOjkyOjMwOmI4OjllOgorICAgICAgICAgICAgICAgICAgICBkZjpkZjoxMDowMTo4Yjo4NjowOTo3MDpkODo2YzphODpiNzo1MDoxZToxNjoKKyAgICAgICAgICAgICAgICAgICAgOTY6YjQ6Zjc6Njc6ZmQ6MzU6M2E6MjE6OTA6MmE6MzI6Yzc6MDA6N2I6NGQ6CisgICAgICAgICAgICAgICAgICAgIDA3OjEwOjA5OmI5OjJmOjczOmQ4OjE4OjdlOjY3Ojk5OjA0OjRmOjA2OmZjOgorICAgICAgICAgICAgICAgICAgICA1MDpjNzo4NTo5Yjo5ZDo0MDo5ZDpiMzo5NjozNzpmYTphNTpkYzpiMjo3MjoKKyAgICAgICAgICAgICAgICAgICAgNGU6ZWY6NGU6MDk6MmM6ZmQ6OTE6ZmQ6NGQ6Zjc6YmI6YTY6YTE6M2U6YWI6CisgICAgICAgICAgICAgICAgICAgIDdiOmEyOjAzOjQwOmE2OmE5OjU1OjI3OmUyOmZhOmY5OjE5OmNlOjg3Ojc1OgorICAgICAgICAgICAgICAgICAgICBhYTpmMTo3NTozNjpmMzpmMzpiODo5MTpmODo5MTpjMzo4Yjo3NToxMzo4ZToKKyAgICAgICAgICAgICAgICAgICAgNGM6NjU6OWE6MTY6Mzk6NmE6ZTU6MzQ6ZTg6N2E6OTY6NTk6N2Y6MzU6YjA6CisgICAgICAgICAgICAgICAgICAgIDAwOmZkOjViOjY5OmZjOjQzOjI2OmZhOmY1OjI4OjZlOmZlOjg3OmQ5OjdlOgorICAgICAgICAgICAgICAgICAgICAyNDpmYjpiNDphMDo4Mjo2ZTo1NDphMjpmZjphZTpiZjo2MjpiNDpmNDo3MjoKKyAgICAgICAgICAgICAgICAgICAgMDE6YzI6Y2I6OTg6NDc6OTg6ZTE6NGM6YjU6MTc6ODA6ODA6Y2U6OGY6YTY6CisgICAgICAgICAgICAgICAgICAgIDI4OmVlOjFlOjQ1OjZhOmZiOmRmOmYxOjFkOmZjOjVhOjNiOmQ2OmVhOmY0OgorICAgICAgICAgICAgICAgICAgICA2YzoxZDo2Mjo0OTo1NzozYjo4YTo4Zjo4NjplYTpmMDo1MzowNDpjZTo5YzoKKyAgICAgICAgICAgICAgICAgICAgMTY6Njg6ZmY6YmE6Yjk6ZmM6ODg6MGY6NDc6Zjc6MDI6NDQ6NzI6NDA6Yjg6CisgICAgICAgICAgICAgICAgICAgIGNhOjNiOjJkOjUzOjlkOmRjOjNjOjU2OjhjOjU5OjdiOjY4OjFhOjJjOjhkOgorICAgICAgICAgICAgICAgICAgICA3MTpiYjo2YzowMDpjNzoxYTpjZTo2Zjo0MDo5MjpiMTphMzoyZjowZjpkOToKKyAgICAgICAgICAgICAgICAgICAgNDQ6ZjI6YTM6NzA6MmU6OWU6ZWU6MGU6YWU6MzI6ZDA6M2I6M2U6OGI6MDc6CisgICAgICAgICAgICAgICAgICAgIGVhOmU2Ojc5OmIzOjVjOjI5OmUyOjdkOjZiOmE4OjVlOmY5OjVhOjMxOmU4OgorICAgICAgICAgICAgICAgICAgICAwODo5NjphMjo4YzowMzo5ODo0NjpmMTpiODo3ZDo5MDo1NDoyNjplZDo3NjoKKyAgICAgICAgICAgICAgICAgICAgNjI6ZmU6OWU6ZTk6OWE6NmU6NWU6Yzk6NDk6Yzc6NWM6MzQ6NTM6Mjk6NTQ6CisgICAgICAgICAgICAgICAgICAgIGQ5OmVjOmU0OjQ2OmUxOjgwOjNiOjc1OmQ5OmRmOmZiOjc5OmQ1Ojg3OmYxOgorICAgICAgICAgICAgICAgICAgICBiYTo5ZTplYjoxOTpjZTo0Yzo1Mjo3MzplNjo1Yjo4NzphZToyNTo0ZjozOToKKyAgICAgICAgICAgICAgICAgICAgNzk6Y2M6YzY6Yjg6Zjk6MTA6N2I6ZWM6ZjA6OWI6NzE6YTQ6MDU6YTA6ZDM6CisgICAgICAgICAgICAgICAgICAgIDI5OmQzOjRlOjdmOjFmOmY0OjJkOjI4Ojc4OmNjOjU1Ojk1OjdiOjFlOjkxOgorICAgICAgICAgICAgICAgICAgICAyZjpjYzo1NjoxODo3Mzo4YjpiMjpkYjpiYzo2OTowNzplNjpkMDpkODo0ZjoKKyAgICAgICAgICAgICAgICAgICAgZWQ6YTI6ZmY6NTg6ODU6YTM6NmQ6ZTA6NGE6NTM6Yjc6Njc6N2Q6OGQ6MGM6CisgICAgICAgICAgICAgICAgICAgIDVjOjViOjdiOjc3OjI4OjAyOjM1OjQ0OjdhOjA0OmQzOjI4OjQzOmM4OjZiOgorICAgICAgICAgICAgICAgICAgICAzMDoxNzo1ZDozMjpiODoyOTozNTpiYTo3NjpkYTozYjoxNDo0YTo3NjoxODoKKyAgICAgICAgICAgICAgICAgICAgNTg6YTQ6Zjg6OTI6M2M6OWU6NGQ6MzM6NmY6NDY6NmI6MDg6ZDk6MzE6NDg6CisgICAgICAgICAgICAgICAgICAgIDY4OmRkOmY0OmZiOjI0OjU2OjM0OmIyOmNmOjY5OjY2OmJlOjQ4OmQyOjhhOgorICAgICAgICAgICAgICAgICAgICA2NjoyMjpjZDpmMjo2OTpjZDpjMjo1MzoxMzo0NToyOTo0MToyMjpkNjo1ZDoKKyAgICAgICAgICAgICAgICAgICAgOTg6MWY6YjY6YTQ6YjI6YTM6YzI6ZWU6MDI6MmY6NTE6MWI6ZGM6ODM6YTQ6CisgICAgICAgICAgICAgICAgICAgIGVjOjcwOjI1OmE4OmQ0OjA4OjYxOjMyOjZmOmU0OmExOjgxOjJlOjdjOjYzOgorICAgICAgICAgICAgICAgICAgICA3MjpmYToyOTo2NTpiYzo3MDo0NDpjZjo1ZAorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgNTU6OWE6MzQ6NmE6MjI6MDY6Njk6MDk6NDU6MzM6Yzc6YWU6YTk6NWM6Yzc6MDk6NGU6OWI6CisgICAgICAgIDg2OmJjOjQxOjkwOmQ0Ojk0OjUyOmY2OmNkOjIzOjI5Ojk0OjRiOjIyOmNkOmU4OmJkOmZlOgorICAgICAgICA5ZDpjZDo1MjpmMjpiZDplZDphYjo4NzpjOTphYjphYjo0NjowNDpiNDpiZDphMjozZjoyMjoKKyAgICAgICAgMzA6NDc6NTA6YzA6NGI6OGM6NzY6MGY6MDM6ZjU6OTI6ZDI6YjE6MmQ6YzQ6N2E6MzU6OWM6CisgICAgICAgIGM5OjczOjg3OmViOmE2OjlmOmRlOjBmOjczOjhkOmQzOjdmOjk5OmQ4OmJhOjhmOjZmOmM0OgorICAgICAgICBmMzpiZToxYTphZTo4YjphMjo5NDozNjo5MDplMjplNTplYjo4ZDowNTpmNDpmYzo2NTpkZjoKKyAgICAgICAgOTU6ZjE6YzQ6OTQ6NGQ6MTc6NTY6ZDc6OWY6M2M6OGY6NTA6M2M6ZTc6Nzc6YmY6OTU6ODY6CisgICAgICAgIDI2OjY0OmZiOjZhOmZmOmM2OmRhOmU5OjhjOmFlOjQyOmJiOjY5OmU1OjMzOmM2OmQ4OmU5OgorICAgICAgICAwZDpjNjo1NToyMTo0OTpjMTowYzpiNDphMzpmOTo5Yjo0Yjo1YzpkZTo4Mzo0Zjo0MTowMzoKKyAgICAgICAgY2U6MmE6Nzk6Njg6Mzg6N2Q6ZjA6NTQ6NDk6MjA6ZjU6YjY6MTA6ZmY6MDg6ZGM6MzM6NjY6CisgICAgICAgIDk2OjliOmZmOjA2OmRlOjAwOjllOmQ3OmNlOjU2OjQzOjlhOjUxOmZjOjcwOmNkOmY2OmYwOgorICAgICAgICA1MTphMzpiNzpjZDpiNDo1Yzo4NTo2MjpjZDo3MTpiNzpjNjoyYjoyMzoyYjpkZDpjMzo2ZToKKyAgICAgICAgNDA6NDI6ZmE6Mzc6ZmY6Mzc6MWM6ZjY6N2E6NTc6OTQ6ODc6ODU6MjM6ZDc6ZDQ6Yzk6Yzc6CisgICAgICAgIDVmOmMxOjRkOjJmOmM5OjBkOmQ3OjVjOmVjOjljOjI1OmVlOjllOjMwOjgyOjkxOjk2OjcyOgorICAgICAgICBiODo3NToxZDpmODowOTo2ODo1Nzo5NzpiMjoyZDo0YjplZToyNTplYzo3YToyNDoyOTplZToKKyAgICAgICAgNzI6ZDQ6OWM6MTM6ZGI6YWI6ZGM6MDM6MGE6ZDg6NGE6MTQ6Yzk6MDg6NTc6NDQ6NWQ6YTE6CisgICAgICAgIGI1OjUzOjgwOjM0OmYyOjE0Ojk3OmNmOjUyOmRlOmEyOjBlOjhhOjEwOmU5OjE0OmVmOmQwOgorICAgICAgICA2MDpiZTo2MTphMTpmMToyNTo1ZDpkNToxODo3MzozZjo5MzoxMDpjYTo5NjplZTpiMzo0MDoKKyAgICAgICAgZDI6ZGI6YTM6NTU6Y2Y6NTc6NWE6YTU6MGU6NGY6NzU6NDc6ZGY6ZWE6Zjc6OTA6OWE6NmQ6CisgICAgICAgIGY1OjcwOjJlOjFkOjE0OjFjOjM3OjY0OjA0OjU5OjUwOmIwOmRjOjcyOjg2OjZmOjljOjM3OgorICAgICAgICAzZDo1ZDoyODphZjo3Mzo1NTplZjpkMjplZToyNDo3NDo3NDoxMzplZjpkYzpkYjozMTo0OToKKyAgICAgICAgZmI6M2Y6NjM6ZjU6ZDM6MDg6M2U6MzM6YTU6ZTc6OWQ6MGE6ZGU6NTM6MmM6NTE6OGU6Njc6CisgICAgICAgIGRiOjliOjQxOjY1OjQxOjUwOmJkOmQ0OmE0Ojk2OjZjOjg3OmJjOjEyOmUwOjk0OmM3OmQzOgorICAgICAgICBjMDplNDpjYjo3Mzo1ODowMDo4MzplMTphYzoyNzo4NTpkNjo5ZDo1Mzo5ZDo1YzpiZDowYToKKyAgICAgICAgM2U6MDM6NDM6OWM6MGM6OTE6ZjU6NmQ6N2I6Zjg6NDA6NzI6NzU6YWI6MTE6NzY6OTE6MmI6CisgICAgICAgIGUxOmM2OmFhOjFmOjcwOjY5Ojc2OjcwOjE1OjA5OmZlOjkzOmQwOmQ2OjJkOmI3OjE1OjZhOgorICAgICAgICA5Yjo2Nzo1YzpiNDo2OTo5ZjoyNTphNjo3ZDo4YTpmYjo3ZDoyMjphOTo3MTpmMjpjZTo0ZToKKyAgICAgICAgOGM6Yjg6MjE6MmQ6ZGU6ZmU6NDE6NzE6MGQ6ZmY6OWQ6ZWM6NzM6YTY6YmI6MDc6NGY6ODg6CisgICAgICAgIDBlOjU4OjQ3OjJlOjdlOmE5OmMyOmM3Ojc4OmRkOmJhOjdhOjllOjRlOmUwOjMwOjRlOjYzOgorICAgICAgICA2Zjo4NTpkNDoyMDo0MTplOTpmYTpmZTo0Mzo0NTplNzpmYjphZjo3YTpiMjpjZTphNDowNToKKyAgICAgICAgMWQ6MjI6OWE6NTg6ODY6ZGY6ZTQ6Y2U6NGM6YTk6ZmU6ZDg6MTY6YTU6NmY6ZmI6ZDg6Y2U6CisgICAgICAgIDU2OjdiOmY1OmQ2OjIwOmVmOmU0OjQ3OmNkOjYzOjI0OmZmOmI5OmJlOmYxOjQ4OmEzOmMxOgorICAgICAgICAwMTo3MjplNjpiZDpjMDphZDplZDoyNjowZDpjYTozNDo5ZjpmYzowMjoyZDoyMDo0ZjowNToKKyAgICAgICAgMjA6YWU6MjE6M2Q6MGM6YzI6MjA6M2M6M2Y6ZjA6MDQ6ODQ6ZGM6Y2Y6ODk6ZmQ6Yjk6MjU6CisgICAgICAgIDkxOjhlOmQwOjQzOmU2OmIzOjIwOmFiOjVjOjJkOmQ1OjQwOjllOmEwOjRiOmQ4OmY0OmIyOgorICAgICAgICBjYzo3ZDpmMTo1ODowYTo4ZTo4NzplZDo4ODphYzozNjo5NjplNDo1NjphMDoxMTo4YTpmMjoKKyAgICAgICAgOWE6ZDA6YjM6NTc6YTM6MzQ6YmI6MTk6YWI6Mzg6ZTE6NzQ6NmI6MjI6YzQ6MzE6Y2U6MDE6CisgICAgICAgIGQ1OjFiOjM2OmUzOjFlOjM4OjRjOjMzOjkzOmRmOjQwOmUzOjU5OjU3OjRlOmFjOjZlOjdiOgorICAgICAgICAxZTo1YTozZDpjNToxZDo1YjphYzpjODoxMDo4MjozNTowMjoyMjpiMjpmYzo3NTplODoxMDoKKyAgICAgICAgOTE6OGQ6YzQ6N2Q6Nzg6OTM6NDc6OWU6MWM6OWQ6YWM6NmI6NjI6MDI6NTg6OGM6ZDY6MWM6CisgICAgICAgIDIzOmQ2OmFmOjc4OmMyOjgwOjljOmE0OmFhOjI0OjU0OjE0OmI1OjE0Ojk4OmM2OmY4OjJiOgorICAgICAgICAxYToyNDpjYjo3MTozMjowYTplMjo5YjowZTo2OTo2YjpkZDo3ZTo4Yzo2NDpkMToyZTo2MzoKKyAgICAgICAgZWY6MGU6N2Y6YjE6M2U6ODg6NGM6OWQ6NTU6ZTU6Yzk6NmU6MTc6MDQ6Yjc6NDE6ZmY6YmQ6CisgICAgICAgIDhhOjQxOmNiOjI1OjMxOjZmOjQ0Ojc3OjNmOjQ3OmIxOmZjOjgxOjg4OjA3OjhlOjA1OjQ5OgorICAgICAgICAyMDpiNzoxMTpkOTo2OTowMzoyYTowMzo5ZDpiOTozMzo4NDo5YTpkZjpkZjo3YTplMzo0NjoKKyAgICAgICAgNzM6YTM6ZDg6YTI6OGM6NTM6MTk6ODg6NTU6NGM6NzQ6Yjg6ZjY6NDQ6ODQ6MmI6ZDE6MTQ6CisgICAgICAgIDJkOjRlOjM5OjJlOjkyOjY4OmZmOjY5OmZjOjg1OjYyOjFiOmViOjU1OjRmOmVmOjI1Ojg0OgorICAgICAgICA2Mjo0NTo5OTpkNjpkODo0ZTo2ZjozZjo1MzowODo3ZDoxZDowNjo5NTo4MTo4MDo3Zjo0ZjoKKyAgICAgICAgNGU6NzQ6MzY6OTg6YjU6ZTI6ODc6NzA6OTg6ZGM6ZDc6ZjU6ZGM6NTI6MTU6ZTY6YzY6ZDY6CisgICAgICAgIDc5Ojk2OjM5OjdmOjhmOjk1OmNmOmFiOjgwOjUzOmFkOjFiOjBiOjQ1OjQwOjBlOmQ0OjE4OgorICAgICAgICBiZDoyYzpkZTo4YTo3Nzo3NjpmZDpmMjo0NDo0NzpjNjoyMTpkMDplNDo3NDpmMDpkODoxODoKKyAgICAgICAgMDU6Yzg6N2M6MzA6NzI6Yzc6ZGY6ZjE6YmI6ZmM6MDI6MzA6YTk6ZjQ6NDI6MjY6NTk6MGQ6CisgICAgICAgIDkzOjA1OjgyOmExOjczOmVkOjM0OmU1OjM4OjVkOmNkOjUwOjkwOmZlOjk0OmZjOjEzOmJjOgorICAgICAgICBiZDpmYzphODphMjo4ODphNzo3MzpjNDpiMjphODpkMTo1ZDo4ODpjNDowMjphMjo3YTpmMToKKyAgICAgICAgMDQ6Yzk6ZmU6OGM6NzQ6Yzk6ZWY6MWQ6NjQ6NDE6OWY6YWM6MWU6OTY6Njc6NjQ6YWM6YWI6CisgICAgICAgIDI4OjQxOmM3OjlkOmY3OmMwOjk4OjFiOjZlOjA3OmMyOjY0OjdkOjVhOjgzOjY2OjU2OjI4OgorICAgICAgICAzNjo5YzplNzpmYjoxYzo3NzowZToyODphMDpjNDpmNzo2Yjo3OTozOTowNDoyMDo4NDpjNzoKKyAgICAgICAgNTc6OTM6YmM6MWI6YTA6ZWE6YmM6ZWI6NDI6ZTU6YTg6MTE6ZmU6ZmM6YWM6NjU6Y2M6ZmQ6CisgICAgICAgIGY4OjI4Ojg4OmY0OmE1OjlhOmU1OjczOjUxOmUwOmE4OjliOjBkOjAzOjc3OjRlOmU1OmUwOgorICAgICAgICA5ODpiMzo4ODpkYTo3ZDplNjpjNjo5ZTo3YzoxNDo2NjpjMToyZTo1Mzo0YTo5MjowNzozNzoKKyAgICAgICAgYTA6N2U6ZTk6M2Q6MDk6ZTQ6MTU6N2M6Y2Y6ZmQ6Yjg6NDE6YTU6ZWY6OWU6NjY6OWQ6YzQ6CisgICAgICAgIDVlOjA3OjFkOjg3OmY4OjQxOmFkOmVhOmU3OjJmOmQyOjQxOjYzOjE4OjM3OmY5OjE0OmUzOgorICAgICAgICA0ZDpkMDplNTpmNzo0MzpmZDoxNTplMzpmOTozNjo3MzowNjoyNjpkZjowMTo0ZjphOTpjMzoKKyAgICAgICAgNGU6ZGU6MjA6NDY6Nzc6OTg6YjQ6N2E6MjQ6MmI6M2I6NzU6MmI6NGU6NTg6OGQ6OWI6NWQ6CisgICAgICAgIGE0OmM3OjE2OmEwOmJjOjMyOjg4OjNmOmExOjgzOmYzOjAwOmM4OmY4OmQ4OjU4OmU5OjYzOgorICAgICAgICA1ZDo0YzoyYjpiNTpmMDo3Mjo0MTpkODphYjo3NzozNzpkNjo3Mjo3NDphZTpiNjozNjo5YzoKKyAgICAgICAgYzg6YTY6ODM6NDk6NGI6ZTA6Yzk6NTY6MGI6Mjk6YmU6MDA6MzA6Y2I6ZGQ6ZDY6Yzg6NDI6CisgICAgICAgIDhhOjAwOmQ5OmVjOjE1OmQxOjM0OjcxOmYyOjViOjY0Ojg3OmY2OjI3OmQyOmI3OmViOjg2OgorICAgICAgICBiMDo5MDpiZjoyOTpkYjoyMTo5ZTozNjo4YzplMzoyMDoyZjo5NToyMzo1MTo2YzoxYjpjMjoKKyAgICAgICAgYTQ6ZDU6ZTY6ZDg6MDI6NDM6Njc6YTA6ZmU6OWI6NTA6MDM6NDQ6N2Y6YmI6ZTQ6NzI6ZDU6CisgICAgICAgIGQxOmU0OmRhOjhmOjkyOjE0OjY0OmZiOjVkOjE0OjEwOjEyOjRhOjk1OjA2OmM5OjY1OjA4OgorICAgICAgICAyOTpjYToyMTphMzoyNjozODoxMTpjOToyNzpkZjo3MDo2NzowNDpmZDpjYTo0ODozMjo3ZjoKKyAgICAgICAgNjM6YjI6NDU6NzQ6MzE6NTA6NGY6ODc6ZDk6MjA6NzA6ZDI6MjE6NzA6YjE6ZDY6MTA6OWQ6CisgICAgICAgIDMzOjVkOjc4OjgzOjkxOjZkOjU1OjgyOmVjOmRhOmU0OjYyOjYzOmM3OjgxOjQ2OmQ3OjE5OgorICAgICAgICA2NTo3MjoyYTo0MzoxOTo5MDpiODpkNzoyMzo0ZDo0YzoxYzplMDo0NDphOTo2Njo2NzphYzoKKyAgICAgICAgZWU6NzE6Nzk6Mjc6MjY6Nzg6NmQ6NzI6MGU6ZjU6NWQ6NGI6MjM6YjU6N2M6N2M6NjU6ZTk6CisgICAgICAgIDE3OmM2OjNhOjBiOjBkOmRkOjVlOjFlOjUxOmMzOjg2OmI4OmVjOjdmOmM3OjI3OjRhOmE1OgorICAgICAgICA0NjplODo2YToyZDoxOTpjMTo4NzphMzpjYjo5OTo5Mzo4Nzo2NDphMjo1NToxNDo0YzpiNzoKKyAgICAgICAgNDM6YTU6OTM6ZDc6ZTc6ZDI6NGU6Nzk6NDA6Y2E6NjU6OTk6NDY6M2Q6M2Y6N2E6ODA6N2E6CisgICAgICAgIDg4OjZhOmNjOjFlOmU1OjZiOjMzOjQ2OmY0OjUwOmMwOmQ1OjFmOjA5OmI4OmNkOjhhOjJlOgorICAgICAgICBhMToyNzplYjo1ZDo3MzphNzplODo2YjowYTplNTo1Nzo4MjoyYTpiMDpmYzplMjo1NDo1MjoKKyAgICAgICAgNTY6ZjA6YWI6YTk6MTI6YzY6MjM6OTY6MDc6MjQ6OWM6ZTA6YmM6NDY6YTU6YjQ6MjA6MDQ6CisgICAgICAgIGRhOjA5OjkzOjYzOmU1OmQ0OjJlOmMyOjdlOmM1OjMxOmVkOmI1OjE1Ojc0Ojg2OjE3OmI5OgorICAgICAgICBiMzpmMzoyNjo4YToxZDowMjo2YTpkYToxYTozZjplODpiYTpmMTowNDo2ZDo5NDo1MTo1NDoKKyAgICAgICAgZTI6NWE6YjQ6NTk6ODM6MWQ6NjA6ZDA6MmQ6NzM6Y2M6MDc6YjU6MjY6OGM6Zjk6ZDc6YzY6CisgICAgICAgIDg4OjkxOmVmOjgwOmNmOjVkOjBmOmExOjYwOmNiOjQ1OmQ0OjQyOjIyOmQxOmIxOjcwOjFkOgorICAgICAgICBmZDpkMDpiNzozMDo5MDozYTpjNjo0ODo2ZDo2NzplNTozMjpkYTo4ZjpkYjplMzphODplMzoKKyAgICAgICAgMWQ6MjA6MjU6YTI6MWM6ZTE6NGM6Yjk6YTQ6ZjY6YzY6M2Y6NWM6NTg6MGQ6YmI6YzY6YjI6CisgICAgICAgIDc3OjAxOjE2OjkxOjlmOjE3OjA2OjBkOmI3OjQwOjNlOmNjOjhmOjhlOjljOjRiOmUwOjlkOgorICAgICAgICA3ZTo5YjoxZTowNTphYjo4ODoyMjpmYTpkMzoyODoxYjo1NzoxNDo2NDo0YTozZToyNDoyYzoKKyAgICAgICAgMzg6NGQ6MjE6Njk6MDA6NzM6MmU6ZDA6NTU6MmQ6NzQ6ZjI6MTU6ZTg6OTQ6NDM6M2U6NDA6CisgICAgICAgIDJhOmM2OmM2OmI5OjZhOjViOmRlOmEyOmNjOjE4OjUwOjU0OjVkOjRlOjJhOjg1OjZjOmY2OgorICAgICAgICA5Mjo4YjoyOToxOTo3ZTplNzplYTo0YTplMDoyMjoyYjoyNTpiYzpmNzo2NjpjZjo3Nzo5YToKKyAgICAgICAgNDE6NzQ6ZjI6M2M6MTQ6MGQ6NzQ6Njk6ZjU6NTA6ODM6Y2Q6Y2Q6MmY6MjE6ZGI6MjI6NDY6CisgICAgICAgIDhhOmQwOmY3OjUxOjFhOjk1OjU3OmYyOjA1OjhiOjFhOjE5OmVkOjNiOjQ1OmU4OjM2OmMyOgorICAgICAgICA2ZTo3ZTpmYjo1NzoyMjowMDoxZjowNjo1MzphOTphZTo5MzpjNjo4Zjo3MToyYTozMTo0NToKKyAgICAgICAgOTI6ZTc6OGU6NmQ6ZTY6OTk6MjI6YzA6ODM6ZmM6ZWY6ZGM6NTc6NjY6Nzc6NGY6YTI6MzY6CisgICAgICAgIDMxOmZiOmExOjEzOjhkOmU1OmNhOmEzOjk1OjdkOjAxOjBjOjY0OjcwOjNiOjUzOjQyOjY4OgorICAgICAgICA4MDpjNzpiYjo5ZDphODowMDozNTo2OTo5ODowYzphODo2NzpkODo0MzplNTphYTpjZjo5NToKKyAgICAgICAgZTA6NTE6OTU6YTQ6MTc6M2Y6NDI6OWQ6Yjg6MDQ6Y2U6ZDM6Nzk6Nzk6Yzg6ZDM6OGE6MTY6CisgICAgICAgIDMyOjkyOmUwOmQ3OmEyOmVlOmQ3OjM3OjRjOjJmOmFjOmI4OjdiOmJlOjQ1OmY2OmYxOjE4OgorICAgICAgICAzMzo5Yzo3YjozNzphNjoyNDpkOTpiYzo0MDphYjowMDplOTpjMzozNzo4YjphYjpkODpiNjoKKyAgICAgICAgZjM6NWU6ODE6NGU6YjA6MTQ6NmI6MDc6M2U6MWY6ZWM6YzI6ZjY6NDQ6MjI6OTU6YmI6YjM6CisgICAgICAgIGU2OjZmOmQ2OmY5OjcwOjY1OmJhOjBhOjgzOjY1OmFhOjBlOjEzOjJmOjgzOjEzOjIzOjUzOgorICAgICAgICA4Yjo0MDoxNjpmYTpjZToyZjpmYzo0ZDowNDpmODplYjpkODphYzpjNTozNjpjMjoxNTo1NzoKKyAgICAgICAgNDg6Mzg6ZWM6NTU6YjM6YjQ6MWU6YmE6YWQ6ZDI6NDI6MDY6MTc6MGQ6NzM6Yzg6NTc6YTY6CisgICAgICAgIGJlOjk2OjRkOmE5OmYyOmMwOmZiOjdhOjIxOjFjOmY1OmM5OjcwOmE5OjgyOjkwOmI1OmYxOgorICAgICAgICAwYzpkNDo3OToxMDpiZTo4MTphNjplOTo1Yzo2MTo5Yzo3Nzo3OTo5YTphNDpjMzozNzoyNjoKKyAgICAgICAgNTc6Mzc6Yzk6NTI6MmM6ZmE6MDg6ZmY6ZDA6NWY6YzY6NjE6YzA6ZjQ6NzY6YmU6ZmM6ZGU6CisgICAgICAgIDRlOmNmOmFiOjUxOjk5OjcxOmM3OmRmOjdlOmY0OmQ2OmNmOjA2OjU2OjE5OjEzOjUzOjBiOgorICAgICAgICA2ZDo3NDo1OTo0ODoxOTo5Yjo1MzowNToyZDo5ZDozMjo1NDpkMzplNToyYzo1Mzo4Yjo2NDoKKyAgICAgICAgM2U6ZDQ6NjQ6N2I6ZTM6ODA6MDk6MTQ6Y2M6ZmU6MTY6NDY6NjM6NmI6NzE6Njk6Zjg6Zjk6CisgICAgICAgIGNiOjI3OmY2Ojg4OjU0OmJjOjQ1OmIzOmNlOjAyOmM4Ojk0OmVlOjQwOjViOmY5OjQyOjAyOgorICAgICAgICBjMjpmZjpiMDpkODoyYzplYjoyODo3Zjo1ZTpjOToyNjowMTo5OTphNworCitVUFMgRG9jdW1lbnQgRXhjaGFuZ2UgYnkgRFNUCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IDc4OkE1OkZCOjEwOjRCOkU0OjYzOjJFOkQyOjZCOkZCOkYyOkI2OkMyOjRCOjhFCitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRCtEQ0NBdUFDRVFEUUhrQ0xBQUFDZkFBQUFBY0FBQUFCTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUc1TVFzdworQ1FZRFZRUUdFd0oxY3pFTk1Bc0dBMVVFQ0JNRVZYUmhhREVYTUJVR0ExVUVCeE1PVTJGc2RDQk1ZV3RsSUVOcAorZEhreEpEQWlCZ05WQkFvVEcwUnBaMmwwWVd3Z1UybG5ibUYwZFhKbElGUnlkWE4wSUVOdkxqRWVNQndHQTFVRQorQ3hNVlZXNXBkR1ZrSUZCaGNtTmxiQ0JUWlhKMmFXTmxNUmt3RndZRFZRUURFeEJFVTFRZ0tGVlFVeWtnVW05dgorZEVOQk1TRXdId1lKS29aSWh2Y05BUWtCRmhKallVQmthV2R6YVdkMGNuVnpkQzVqYjIwd0hoY05PVGd4TWpFdworTURBeU5UUTJXaGNOTURneE1qQTNNREF5TlRRMldqQ0J1VEVMTUFrR0ExVUVCaE1DZFhNeERUQUxCZ05WQkFnVAorQkZWMFlXZ3hGekFWQmdOVkJBY1REbE5oYkhRZ1RHRnJaU0JEYVhSNU1TUXdJZ1lEVlFRS0V4dEVhV2RwZEdGcworSUZOcFoyNWhkSFZ5WlNCVWNuVnpkQ0JEYnk0eEhqQWNCZ05WQkFzVEZWVnVhWFJsWkNCUVlYSmpaV3dnVTJWeQorZG1salpURVpNQmNHQTFVRUF4TVFSRk5VSUNoVlVGTXBJRkp2YjNSRFFURWhNQjhHQ1NxR1NJYjNEUUVKQVJZUworWTJGQVpHbG5jMmxuZEhKMWMzUXVZMjl0TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQworQVFFQTd4ZnNyeW5tMlNzbndOdDdKSjltOUFTandxMEt5ckROaEN1cU4vT0FvV0R2UW8vbFhYZGZWMEpVM1N2YgorWWJKeFhwTjdiMS9ySkN2bnBQTHI4WE96QzQzMVdkY3kzNnlRams0eHVpVk50Z3ltOGVXdkRPSGxiMUlERmNIZgordm41S3BxWVlSbkEvNzZkTnFOejFkTmxoZWtBOG9aUW82c0tVaU1zM0ZRVVpQSlZpdWh3dCt5aU0wY2lla2p4YgorRVZRN2VObEhPNXN0U3VZK2UydmY5UFlGenlqMnVwZzJBSjQ4TjRVS25ONjNwSVhGWS8yM1loUnRGeDdNaW9DRgorUWpJUnNDSGluWGZKZ0JaQm51dmxGSWwvdDhPOFQ4R2ZoNXVXN0dQMitaQldEcFdqSXdxTVpOcWJ1eHgzc0V4ZAorNXNqbzlYMTVMVmNrUDh6alBTeVl6eEtmRndJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUM3T0k0RQorSWlaWURpRkVWc3k5V1h3cGFNdGNEOGlHVkQrQmVLZXRqOHhHOXh4VXVIa3RXM0lGYXVnaDBPd2RIZjZrTkZHKworN3UzT3pKd1dhT0pkZFhNSVF6R1JhaEFyRU1KTGFmakpyWmlvL2JqdjlxdndYeUh2eTRWckNlMHZTR2ExWUhMQQorNktESG1Oc085eHR6alRRSUNudkZkMktxTUNPYnNCNkxnSmhVM0FXSHM2bGlXZnlMdHhXYXJFVHN6elVhOXc4dQorWFpKTEFjaDc3cUEzN2VRZGdnMlpRVU1YcmRUVnl1UDVmUmVpQWRBd0QwQzUzTGtFZ21tRHR2a1ArZ2FTOTZqMAorMWhjYzhGNS94Q25JNXVIaS96Wm9JVkd1LzZtNmhKS3RpbnN6MkpEU3dYbHRNek01ZEt3Yk9IR2ZMQWVRNmgzZworMDRsZnkrOFVqU2RVcGIxRworLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMSAoMHgwKQorICAgICAgICBTZXJpYWwgTnVtYmVyOgorICAgICAgICAgICAgZDA6MWU6NDA6OGI6MDA6MDA6MDI6N2M6MDA6MDA6MDA6MDc6MDA6MDA6MDA6MDEKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz11cywgU1Q9VXRhaCwgTD1TYWx0IExha2UgQ2l0eSwgTz1EaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4sIE9VPVVuaXRlZCBQYXJjZWwgU2VydmljZSwgQ049RFNUIChVUFMpIFJvb3RDQS9FbWFpbD1jYUBkaWdzaWd0cnVzdC5jb20KKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IERlYyAxMCAwMDoyNTo0NiAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogRGVjICA3IDAwOjI1OjQ2IDIwMDggR01UCisgICAgICAgIFN1YmplY3Q6IEM9dXMsIFNUPVV0YWgsIEw9U2FsdCBMYWtlIENpdHksIE89RGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uLCBPVT1Vbml0ZWQgUGFyY2VsIFNlcnZpY2UsIENOPURTVCAoVVBTKSBSb290Q0EvRW1haWw9Y2FAZGlnc2lndHJ1c3QuY29tCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMjA0OCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMjA0OCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDplZjoxNzplYzphZjoyOTplNjpkOToyYjoyNzpjMDpkYjo3YjoyNDo5ZjoKKyAgICAgICAgICAgICAgICAgICAgNjY6ZjQ6MDQ6YTM6YzI6YWQ6MGE6Y2E6YjA6Y2Q6ODQ6MmI6YWE6Mzc6ZjM6CisgICAgICAgICAgICAgICAgICAgIDgwOmExOjYwOmVmOjQyOjhmOmU1OjVkOjc3OjVmOjU3OjQyOjU0OmRkOjJiOgorICAgICAgICAgICAgICAgICAgICBkYjo2MTpiMjo3MTo1ZTo5Mzo3Yjo2Zjo1ZjplYjoyNDoyYjplNzphNDpmMjoKKyAgICAgICAgICAgICAgICAgICAgZWI6ZjE6NzM6YjM6MGI6OGQ6ZjU6NTk6ZDc6MzI6ZGY6YWM6OTA6OGU6NGU6CisgICAgICAgICAgICAgICAgICAgIDMxOmJhOjI1OjRkOmI2OjBjOmE2OmYxOmU1OmFmOjBjOmUxOmU1OjZmOjUyOgorICAgICAgICAgICAgICAgICAgICAwMzoxNTpjMTpkZjpiZTo3ZTo0YTphNjphNjoxODo0Njo3MDozZjplZjphNzoKKyAgICAgICAgICAgICAgICAgICAgNGQ6YTg6ZGM6ZjU6NzQ6ZDk6NjE6N2E6NDA6M2M6YTE6OTQ6Mjg6ZWE6YzI6CisgICAgICAgICAgICAgICAgICAgIDk0Ojg4OmNiOjM3OjE1OjA1OjE5OjNjOjk1OjYyOmJhOjFjOjJkOmZiOjI4OgorICAgICAgICAgICAgICAgICAgICA4YzpkMTpjODo5ZTo5MjozYzo1YjoxMTo1NDozYjo3ODpkOTo0NzozYjo5YjoKKyAgICAgICAgICAgICAgICAgICAgMmQ6NGE6ZTY6M2U6N2I6NmI6ZGY6ZjQ6ZjY6MDU6Y2Y6Mjg6ZjY6YmE6OTg6CisgICAgICAgICAgICAgICAgICAgIDM2OjAwOjllOjNjOjM3Ojg1OjBhOjljOmRlOmI3OmE0Ojg1OmM1OjYzOmZkOgorICAgICAgICAgICAgICAgICAgICBiNzo2MjoxNDo2ZDoxNzoxZTpjYzo4YTo4MDo4NTo0MjozMjoxMTpiMDoyMToKKyAgICAgICAgICAgICAgICAgICAgZTI6OWQ6Nzc6Yzk6ODA6MTY6NDE6OWU6ZWI6ZTU6MTQ6ODk6N2Y6Yjc6YzM6CisgICAgICAgICAgICAgICAgICAgIGJjOjRmOmMxOjlmOjg3OjliOjk2OmVjOjYzOmY2OmY5OjkwOjU2OjBlOjk1OgorICAgICAgICAgICAgICAgICAgICBhMzoyMzowYTo4Yzo2NDpkYTo5YjpiYjoxYzo3NzpiMDo0Yzo1ZDplNjpjODoKKyAgICAgICAgICAgICAgICAgICAgZTg6ZjU6N2Q6Nzk6MmQ6NTc6MjQ6M2Y6Y2M6ZTM6M2Q6MmM6OTg6Y2Y6MTI6CisgICAgICAgICAgICAgICAgICAgIDlmOjE3CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBiYjozODo4ZTowNDoyMjoyNjo1ODowZToyMTo0NDo1NjpjYzpiZDo1OTo3YzoyOTo2ODpjYjoKKyAgICAgICAgNWM6MGY6Yzg6ODY6NTQ6M2Y6ODE6Nzg6YTc6YWQ6OGY6Y2M6NDY6Zjc6MWM6NTQ6Yjg6Nzk6CisgICAgICAgIDJkOjViOjcyOjA1OjZhOmU4OjIxOmQwOmVjOjFkOjFkOmZlOmE0OjM0OjUxOmJlOmVlOmVkOgorICAgICAgICBjZTpjYzo5YzoxNjo2ODplMjo1ZDo3NTo3MzowODo0MzozMTo5MTo2YToxMDoyYjoxMDpjMjoKKyAgICAgICAgNGI6Njk6Zjg6Yzk6YWQ6OTg6YTg6ZmQ6Yjg6ZWY6ZjY6YWI6ZjA6NWY6MjE6ZWY6Y2I6ODU6CisgICAgICAgIDZiOjA5OmVkOjJmOjQ4OjY2OmI1OjYwOjcyOmMwOmU4OmEwOmM3Ojk4OmRiOjBlOmY3OjFiOgorICAgICAgICA3Mzo4ZDozNDowODowYTo3YjpjNTo3Nzo2MjphYTozMDoyMzo5YjpiMDoxZTo4Yjo4MDo5ODoKKyAgICAgICAgNTQ6ZGM6MDU6ODc6YjM6YTk6NjI6NTk6ZmM6OGI6Yjc6MTU6OWE6YWM6NDQ6ZWM6Y2Y6MzU6CisgICAgICAgIDFhOmY3OjBmOjJlOjVkOjkyOjRiOjAxOmM4OjdiOmVlOmEwOjM3OmVkOmU0OjFkOjgyOjBkOgorICAgICAgICA5OTo0MTo0MzoxNzphZDpkNDpkNTpjYTplMzpmOTo3ZDoxNzphMjowMTpkMDozMDowZjo0MDoKKyAgICAgICAgYjk6ZGM6Yjk6MDQ6ODI6Njk6ODM6YjY6Zjk6MGY6ZmE6MDY6OTI6Zjc6YTg6ZjQ6ZDY6MTc6CisgICAgICAgIDFjOmYwOjVlOjdmOmM0OjI5OmM4OmU2OmUxOmUyOmZmOjM2OjY4OjIxOjUxOmFlOmZmOmE5OgorICAgICAgICBiYTo4NDo5MjphZDo4YTo3YjozMzpkODo5MDpkMjpjMTo3OTo2ZDozMzozMzozOTo3NDphYzoKKyAgICAgICAgMWI6Mzg6NzE6OWY6MmM6MDc6OTA6ZWE6MWQ6ZTA6ZDM6ODk6NWY6Y2I6ZWY6MTQ6OGQ6Mjc6CisgICAgICAgIDU0OmE1OmJkOjQ2CisKK1ZhbGlDZXJ0IENsYXNzIDEgVkEKKz09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogNjU6NTg6QUI6MTU6QUQ6NTc6NkM6MUU6QTg6QTc6QjU6Njk6QUM6QkY6RkY6RUIKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlDNXpDQ0FsQUNBUUV3RFFZSktvWklodmNOQVFFRkJRQXdnYnN4SkRBaUJnTlZCQWNURzFaaGJHbERaWEowCitJRlpoYkdsa1lYUnBiMjRnVG1WMGQyOXlhekVYTUJVR0ExVUVDaE1PVm1Gc2FVTmxjblFzSUVsdVl5NHhOVEF6CitCZ05WQkFzVExGWmhiR2xEWlhKMElFTnNZWE56SURFZ1VHOXNhV041SUZaaGJHbGtZWFJwYjI0Z1FYVjBhRzl5CithWFI1TVNFd0h3WURWUVFERXhob2RIUndPaTh2ZDNkM0xuWmhiR2xqWlhKMExtTnZiUzh4SURBZUJna3Foa2lHCis5dzBCQ1FFV0VXbHVabTlBZG1Gc2FXTmxjblF1WTI5dE1CNFhEVGs1TURZeU5USXlNak0wT0ZvWERURTVNRFl5CitOVEl5TWpNME9Gb3dnYnN4SkRBaUJnTlZCQWNURzFaaGJHbERaWEowSUZaaGJHbGtZWFJwYjI0Z1RtVjBkMjl5CithekVYTUJVR0ExVUVDaE1PVm1Gc2FVTmxjblFzSUVsdVl5NHhOVEF6QmdOVkJBc1RMRlpoYkdsRFpYSjBJRU5zCitZWE56SURFZ1VHOXNhV041SUZaaGJHbGtZWFJwYjI0Z1FYVjBhRzl5YVhSNU1TRXdId1lEVlFRREV4aG9kSFJ3CitPaTh2ZDNkM0xuWmhiR2xqWlhKMExtTnZiUzh4SURBZUJna3Foa2lHOXcwQkNRRVdFV2x1Wm05QWRtRnNhV05sCitjblF1WTI5dE1JR2ZNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R05BRENCaVFLQmdRRFlXWUo2aWJpV3VxWXZhRzlZCitMcWRVSEFadTlPcU5TTHd4bEJmdzgwNjhzcmcxa25hdzBLV2xBZGNBQXhJaUdRajQveEVqbTg0SDliOXBHaWIrCitUdW5SZjUwc1FCMVphRzZtK0Zpd25ScVAwei94M0JrR2dhZ080RHJkeUZORkNRYm1EM0REK2tDbUR1SldCUThZCitUZndnZ3RGelZYU05kbktnSFowZHdOMC9jUUlEQVFBQk1BMEdDU3FHU0liM0RRRUJCUVVBQTRHQkFGQm9QVW4wCitMQndHbE4rVllIK1dleGYrVDNHdFpNamRkOUx2V1ZYb1AraU9CU29oOGdmU3RhZFMvcHl4dHVKYmR4ZEE2bkxXCitJOHNvZ1RMREFIa1k3RmtYaWNuR2FoNXh5ZjIzZEtVbFJXbkZTS3NaNFVXS0pXc1o3dVc3RXZWLzk2YU5VY1B3CituWFMzcVQ2Z3BmKzJTUU1UMmlMTTdYR0NLNW5QT3JmMUxYTEkKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDEgKDB4MCkKKyAgICAgICAgU2VyaWFsIE51bWJlcjogMSAoMHgxKQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBMPVZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29yaywgTz1WYWxpQ2VydCwgSW5jLiwgT1U9VmFsaUNlcnQgQ2xhc3MgMSBQb2xpY3kgVmFsaWRhdGlvbiBBdXRob3JpdHksIENOPWh0dHA6Ly93d3cudmFsaWNlcnQuY29tLy9FbWFpbD1pbmZvQHZhbGljZXJ0LmNvbQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogSnVuIDI1IDIyOjIzOjQ4IDE5OTkgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBKdW4gMjUgMjI6MjM6NDggMjAxOSBHTVQKKyAgICAgICAgU3ViamVjdDogTD1WYWxpQ2VydCBWYWxpZGF0aW9uIE5ldHdvcmssIE89VmFsaUNlcnQsIEluYy4sIE9VPVZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5LCBDTj1odHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8vRW1haWw9aW5mb0B2YWxpY2VydC5jb20KKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgxMDI0IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgxMDI0IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmQ4OjU5OjgyOjdhOjg5OmI4Ojk2OmJhOmE2OjJmOjY4OjZmOjU4OjJlOgorICAgICAgICAgICAgICAgICAgICBhNzo1NDoxYzowNjo2ZTpmNDplYTo4ZDo0ODpiYzozMTo5NDoxNzpmMDpmMzoKKyAgICAgICAgICAgICAgICAgICAgNGU6YmM6YjI6Yjg6MzU6OTI6NzY6YjA6ZDA6YTU6YTU6MDE6ZDc6MDA6MDM6CisgICAgICAgICAgICAgICAgICAgIDEyOjIyOjE5OjA4OmY4OmZmOjExOjIzOjliOmNlOjA3OmY1OmJmOjY5OjFhOgorICAgICAgICAgICAgICAgICAgICAyNjpmZTo0ZTplOTpkMTo3Zjo5ZDoyYzo0MDoxZDo1OTo2ODo2ZTphNjpmODoKKyAgICAgICAgICAgICAgICAgICAgNTg6YjA6OWQ6MWE6OGY6ZDM6M2Y6ZjE6ZGM6MTk6MDY6ODE6YTg6MGU6ZTA6CisgICAgICAgICAgICAgICAgICAgIDNhOmRkOmM4OjUzOjQ1OjA5OjA2OmU2OjBmOjcwOmMzOmZhOjQwOmE2OjBlOgorICAgICAgICAgICAgICAgICAgICBlMjo1NjowNTowZjoxODo0ZDpmYzoyMDo4MjpkMTo3Mzo1NTo3NDo4ZDo3NjoKKyAgICAgICAgICAgICAgICAgICAgNzI6YTA6MWQ6OWQ6MWQ6YzA6ZGQ6M2Y6NzEKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDUwOjY4OjNkOjQ5OmY0OjJjOjFjOjA2Ojk0OmRmOjk1OjYwOjdmOjk2OjdiOjE3OmZlOjRmOgorICAgICAgICA3MTphZDo2NDpjODpkZDo3NzpkMjplZjo1OTo1NTplODozZjplODo4ZTowNToyYToyMTpmMjoKKyAgICAgICAgMDc6ZDI6YjU6YTc6NTI6ZmU6OWM6YjE6YjY6ZTI6NWI6Nzc6MTc6NDA6ZWE6NzI6ZDY6MjM6CisgICAgICAgIGNiOjI4OjgxOjMyOmMzOjAwOjc5OjE4OmVjOjU5OjE3Ojg5OmM5OmM2OjZhOjFlOjcxOmM5OgorICAgICAgICBmZDpiNzo3NDphNToyNTo0NTo2OTpjNTo0ODphYjoxOTplMTo0NTo4YToyNTo2YjoxOTplZToKKyAgICAgICAgZTU6YmI6MTI6ZjU6N2Y6Zjc6YTY6OGQ6NTE6YzM6ZjA6OWQ6NzQ6Yjc6YTk6M2U6YTA6YTU6CisgICAgICAgIGZmOmI2OjQ5OjAzOjEzOmRhOjIyOmNjOmVkOjcxOjgyOjJiOjk5OmNmOjNhOmI3OmY1OjJkOgorICAgICAgICA3MjpjOAorCitWYWxpQ2VydCBDbGFzcyAyIFZBCis9PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IEE5OjIzOjc1OjlCOkJBOjQ5OjM2OjZFOjMxOkMyOkRCOkYyOkU3OjY2OkJBOjg3CitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQzV6Q0NBbEFDQVFFd0RRWUpLb1pJaHZjTkFRRUZCUUF3Z2JzeEpEQWlCZ05WQkFjVEcxWmhiR2xEWlhKMAorSUZaaGJHbGtZWFJwYjI0Z1RtVjBkMjl5YXpFWE1CVUdBMVVFQ2hNT1ZtRnNhVU5sY25Rc0lFbHVZeTR4TlRBegorQmdOVkJBc1RMRlpoYkdsRFpYSjBJRU5zWVhOeklESWdVRzlzYVdONUlGWmhiR2xrWVhScGIyNGdRWFYwYUc5eQorYVhSNU1TRXdId1lEVlFRREV4aG9kSFJ3T2k4dmQzZDNMblpoYkdsalpYSjBMbU52YlM4eElEQWVCZ2txaGtpRworOXcwQkNRRVdFV2x1Wm05QWRtRnNhV05sY25RdVkyOXRNQjRYRFRrNU1EWXlOakF3TVRrMU5Gb1hEVEU1TURZeQorTmpBd01UazFORm93Z2JzeEpEQWlCZ05WQkFjVEcxWmhiR2xEWlhKMElGWmhiR2xrWVhScGIyNGdUbVYwZDI5eQorYXpFWE1CVUdBMVVFQ2hNT1ZtRnNhVU5sY25Rc0lFbHVZeTR4TlRBekJnTlZCQXNUTEZaaGJHbERaWEowSUVOcworWVhOeklESWdVRzlzYVdONUlGWmhiR2xrWVhScGIyNGdRWFYwYUc5eWFYUjVNU0V3SHdZRFZRUURFeGhvZEhSdworT2k4dmQzZDNMblpoYkdsalpYSjBMbU52YlM4eElEQWVCZ2txaGtpRzl3MEJDUUVXRVdsdVptOUFkbUZzYVdObAorY25RdVkyOXRNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0JnUURPT25ISzVhdklXWkpWMTZ2WQorZEE3NTd0bjJWVWRaWlVjT0JWWGM2NWcyUEZ4VFhkTXd6empzdlVHSjdTVkNDU1JyQ2w2emZOMVNMVXptMU5aOQorV2xtcFpkUkpFeTBrVFJ4UWI3WEJoVlE3L25IazAxeEMrWURna1JvS1d6azJaL00vVlh3YlA3UmZaSE0wNDdRUwordjRkaytOb1MvemNud2JORHUrOTdiaTVwOXdJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0R0JBRHQvVUc5dgorVUpTWlNXSTRPQjlMK0tYSVBxZUNnZllyeCtqRnp1ZzZFSUxMR0FDT1RiMm9XSCtoZVFDMXUrbU5yMEhaRHpUdQorSVlFWm9ESkpLUFRFamxiVlVqUDlVTlYrbVd3RDVNbE0vTXRzcTJhelNpR001YlVNTWo0UXNzeHNvZHlhbUV3QworVy9QT3VaNmxjZzVLdHo4ODVoWm8rTDd0ZEV5OFc5VmlIMFBkCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAxICgweDApCisgICAgICAgIFNlcmlhbCBOdW1iZXI6IDEgKDB4MSkKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogTD1WYWxpQ2VydCBWYWxpZGF0aW9uIE5ldHdvcmssIE89VmFsaUNlcnQsIEluYy4sIE9VPVZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5LCBDTj1odHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8vRW1haWw9aW5mb0B2YWxpY2VydC5jb20KKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IEp1biAyNiAwMDoxOTo1NCAxOTk5IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogSnVuIDI2IDAwOjE5OjU0IDIwMTkgR01UCisgICAgICAgIFN1YmplY3Q6IEw9VmFsaUNlcnQgVmFsaWRhdGlvbiBOZXR3b3JrLCBPPVZhbGlDZXJ0LCBJbmMuLCBPVT1WYWxpQ2VydCBDbGFzcyAyIFBvbGljeSBWYWxpZGF0aW9uIEF1dGhvcml0eSwgQ049aHR0cDovL3d3dy52YWxpY2VydC5jb20vL0VtYWlsPWluZm9AdmFsaWNlcnQuY29tCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpjZTozYTo3MTpjYTplNTphYjpjODo1OTo5Mjo1NTpkNzphYjpkODo3NDoKKyAgICAgICAgICAgICAgICAgICAgMGU6Zjk6ZWU6ZDk6ZjY6NTU6NDc6NTk6NjU6NDc6MGU6MDU6NTU6ZGM6ZWI6CisgICAgICAgICAgICAgICAgICAgIDk4OjM2OjNjOjVjOjUzOjVkOmQzOjMwOmNmOjM4OmVjOmJkOjQxOjg5OmVkOgorICAgICAgICAgICAgICAgICAgICAyNTo0MjowOToyNDo2YjowYTo1ZTpiMzo3YzpkZDo1MjoyZDo0YzplNjpkNDoKKyAgICAgICAgICAgICAgICAgICAgZDY6N2Q6NWE6NTk6YTk6NjU6ZDQ6NDk6MTM6MmQ6MjQ6NGQ6MWM6NTA6NmY6CisgICAgICAgICAgICAgICAgICAgIGI1OmMxOjg1OjU0OjNiOmZlOjcxOmU0OmQzOjVjOjQyOmY5OjgwOmUwOjkxOgorICAgICAgICAgICAgICAgICAgICAxYTowYTo1YjozOTozNjo2NzpmMzozZjo1NTo3YzoxYjozZjpiNDo1Zjo2NDoKKyAgICAgICAgICAgICAgICAgICAgNzM6MzQ6ZTM6YjQ6MTI6YmY6ODc6NjQ6Zjg6ZGE6MTI6ZmY6Mzc6Mjc6YzE6CisgICAgICAgICAgICAgICAgICAgIGIzOjQzOmJiOmVmOjdiOjZlOjJlOjY5OmY3CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICAzYjo3Zjo1MDo2Zjo2Zjo1MDo5NDo5OTo0OTo2MjozODozODoxZjo0YjpmODphNTpjODozZToKKyAgICAgICAgYTc6ODI6ODE6ZjY6MmI6Yzc6ZTg6YzU6Y2U6ZTg6M2E6MTA6ODI6Y2I6MTg6MDA6OGU6NGQ6CisgICAgICAgIGJkOmE4OjU4OjdmOmExOjc5OjAwOmI1OmJiOmU5OjhkOmFmOjQxOmQ5OjBmOjM0OmVlOjIxOgorICAgICAgICA4MToxOTphMDozMjo0OToyODpmNDpjNDo4ZTo1NjpkNTo1MjozMzpmZDo1MDpkNTo3ZTo5OToKKyAgICAgICAgNmM6MDM6ZTQ6Yzk6NGM6ZmM6Y2I6NmM6YWI6NjY6YjM6NGE6MjE6OGM6ZTU6YjU6MGM6MzI6CisgICAgICAgIDNlOjEwOmIyOmNjOjZjOmExOmRjOjlhOjk4OjRjOjAyOjViOmYzOmNlOmI5OjllOmE1OjcyOgorICAgICAgICAwZTo0YTpiNzozZjozYzplNjoxNjo2ODpmODpiZTplZDo3NDo0YzpiYzo1YjpkNTo2MjoxZjoKKyAgICAgICAgNDM6ZGQKKworVmFsaUNlcnQgQ2xhc3MgMyBWQQorPT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiBBMjo2Rjo1MzpCNzpFRTo0MDpEQjo0QTo2ODpFNzpGQToxODpEOToxMDo0Qjo3MgorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUM1ekNDQWxBQ0FRRXdEUVlKS29aSWh2Y05BUUVGQlFBd2dic3hKREFpQmdOVkJBY1RHMVpoYkdsRFpYSjAKK0lGWmhiR2xrWVhScGIyNGdUbVYwZDI5eWF6RVhNQlVHQTFVRUNoTU9WbUZzYVVObGNuUXNJRWx1WXk0eE5UQXoKK0JnTlZCQXNUTEZaaGJHbERaWEowSUVOc1lYTnpJRE1nVUc5c2FXTjVJRlpoYkdsa1lYUnBiMjRnUVhWMGFHOXkKK2FYUjVNU0V3SHdZRFZRUURFeGhvZEhSd09pOHZkM2QzTG5aaGJHbGpaWEowTG1OdmJTOHhJREFlQmdrcWhraUcKKzl3MEJDUUVXRVdsdVptOUFkbUZzYVdObGNuUXVZMjl0TUI0WERUazVNRFl5TmpBd01qSXpNMW9YRFRFNU1EWXkKK05qQXdNakl6TTFvd2dic3hKREFpQmdOVkJBY1RHMVpoYkdsRFpYSjBJRlpoYkdsa1lYUnBiMjRnVG1WMGQyOXkKK2F6RVhNQlVHQTFVRUNoTU9WbUZzYVVObGNuUXNJRWx1WXk0eE5UQXpCZ05WQkFzVExGWmhiR2xEWlhKMElFTnMKK1lYTnpJRE1nVUc5c2FXTjVJRlpoYkdsa1lYUnBiMjRnUVhWMGFHOXlhWFI1TVNFd0h3WURWUVFERXhob2RIUncKK09pOHZkM2QzTG5aaGJHbGpaWEowTG1OdmJTOHhJREFlQmdrcWhraUc5dzBCQ1FFV0VXbHVabTlBZG1Gc2FXTmwKK2NuUXVZMjl0TUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FEam1GR1dIT2pWc1FhQmFsZkQKK2NuV1RxOCtlcHZ6ekZsTFdMVTJmTlVTb0xnUk5CMG1LT0NuMWR6Zm50NnRkM3paeEZKbVAzTUtTOGVkZ2twZnMKKzJFamN2OEVDSU1Za3BDaE1NRnAyYmJGYzg5M2VuaEJ4b1lqSFc1dEJiY3F3dUk0VjdxMHpLODlIQkZ4MWNRcVkKK0pKZ3BwMGxacGQzNHQwTmlZZlBUNHRCVlB3SURBUUFCTUEwR0NTcUdTSWIzRFFFQkJRVUFBNEdCQUZhN0FsaUUKK1p3Z3MzeC9iZTBrejlkTm5uZlMwQ2hDenljVXM0cEpxY1hnbjhuQ0RRdE0rejZsVTlQSFlraGFNMFFUTFM2dkoKK24wV3VQSXFwc0hFelhjakZWOSt2cURXemY0bUg2ZWdsa3JoL2hYcXUxcndlTjFncVo4bVJ6eXFCUHUzR09kL0EKK1BobWNHY3dUVFlKQnRZemU0RDFnQ0NBUFJYNXJvbitqakJYdQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMSAoMHgwKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiAxICgweDEpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEw9VmFsaUNlcnQgVmFsaWRhdGlvbiBOZXR3b3JrLCBPPVZhbGlDZXJ0LCBJbmMuLCBPVT1WYWxpQ2VydCBDbGFzcyAzIFBvbGljeSBWYWxpZGF0aW9uIEF1dGhvcml0eSwgQ049aHR0cDovL3d3dy52YWxpY2VydC5jb20vL0VtYWlsPWluZm9AdmFsaWNlcnQuY29tCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBKdW4gMjYgMDA6MjI6MzMgMTk5OSBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEp1biAyNiAwMDoyMjozMyAyMDE5IEdNVAorICAgICAgICBTdWJqZWN0OiBMPVZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29yaywgTz1WYWxpQ2VydCwgSW5jLiwgT1U9VmFsaUNlcnQgQ2xhc3MgMyBQb2xpY3kgVmFsaWRhdGlvbiBBdXRob3JpdHksIENOPWh0dHA6Ly93d3cudmFsaWNlcnQuY29tLy9FbWFpbD1pbmZvQHZhbGljZXJ0LmNvbQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6ZTM6OTg6NTE6OTY6MWM6ZTg6ZDU6YjE6MDY6ODE6NmE6NTc6YzM6NzI6CisgICAgICAgICAgICAgICAgICAgIDc1OjkzOmFiOmNmOjllOmE2OmZjOmYzOjE2OjUyOmQ2OjJkOjRkOjlmOjM1OgorICAgICAgICAgICAgICAgICAgICA0NDphODoyZTowNDo0ZDowNzo0OTo4YTozODoyOTpmNTo3NzozNzplNzpiNzoKKyAgICAgICAgICAgICAgICAgICAgYWI6NWQ6ZGY6MzY6NzE6MTQ6OTk6OGY6ZGM6YzI6OTI6ZjE6ZTc6NjA6OTI6CisgICAgICAgICAgICAgICAgICAgIDk3OmVjOmQ4OjQ4OmRjOmJmOmMxOjAyOjIwOmM2OjI0OmE0OjI4OjRjOjMwOgorICAgICAgICAgICAgICAgICAgICA1YTo3Njo2ZDpiMTo1YzpmMzpkZDpkZTo5ZToxMDo3MTphMTo4ODpjNzo1YjoKKyAgICAgICAgICAgICAgICAgICAgOWI6NDE6NmQ6Y2E6YjA6Yjg6OGU6MTU6ZWU6YWQ6MzM6MmI6Y2Y6NDc6MDQ6CisgICAgICAgICAgICAgICAgICAgIDVjOjc1OjcxOjBhOjk4OjI0Ojk4OjI5OmE3OjQ5OjU5OmE1OmRkOmY4OmI3OgorICAgICAgICAgICAgICAgICAgICA0Mzo2Mjo2MTpmMzpkMzplMjpkMDo1NTozZgorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgNTY6YmI6MDI6NTg6ODQ6Njc6MDg6MmM6ZGY6MWY6ZGI6N2I6NDk6MzM6ZjU6ZDM6Njc6OWQ6CisgICAgICAgIGY0OmI0OjBhOjEwOmIzOmM5OmM1OjJjOmUyOjkyOjZhOjcxOjc4OjI3OmYyOjcwOjgzOjQyOgorICAgICAgICBkMzozZTpjZjphOTo1NDpmNDpmMTpkODo5MjoxNjo4YzpkMTowNDpjYjo0YjphYjpjOTo5ZjoKKyAgICAgICAgNDU6YWU6M2M6OGE6YTk6YjA6NzE6MzM6NWQ6Yzg6YzU6NTc6ZGY6YWY6YTg6MzU6YjM6N2Y6CisgICAgICAgIDg5Ojg3OmU5OmU4OjI1OjkyOmI4OjdmOjg1OjdhOmFlOmQ2OmJjOjFlOjM3OjU4OjJhOjY3OgorICAgICAgICBjOTo5MTpjZjoyYTo4MTozZTplZDpjNjozOTpkZjpjMDozZToxOTo5YzoxOTpjYzoxMzo0ZDoKKyAgICAgICAgODI6NDE6YjU6OGM6ZGU6ZTA6M2Q6NjA6MDg6MjA6MGY6NDU6N2U6NmI6YTI6N2Y6YTM6OGM6CisgICAgICAgIDE1OmVlCisKK1ZlcmlTaWduIENsYXNzIDQgUHJpbWFyeSBDQQorPT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IDFCOkQxOkFEOjE3OjhCOjdGOjIyOjEzOjI0OkY1OjI2OkUyOjVEOjRFOkI5OjEwCitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQ01UQ0NBWm9DQlFLbUFBQUJNQTBHQ1NxR1NJYjNEUUVCQWdVQU1GOHhDekFKQmdOVkJBWVRBbFZUTVJjdworRlFZRFZRUUtFdzVXWlhKcFUybG5iaXdnU1c1akxqRTNNRFVHQTFVRUN4TXVRMnhoYzNNZ05DQlFkV0pzYVdNZworVUhKcGJXRnllU0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzA1TmpBeE1qa3dNREF3TURCYQorRncwNU9URXlNekV5TXpVNU5UbGFNRjh4Q3pBSkJnTlZCQVlUQWxWVE1SY3dGUVlEVlFRS0V3NVdaWEpwVTJsbgorYml3Z1NXNWpMakUzTURVR0ExVUVDeE11UTJ4aGMzTWdOQ0JRZFdKc2FXTWdVSEpwYldGeWVTQkRaWEowYVdacAorWTJGMGFXOXVJRUYxZEdodmNtbDBlVENCbnpBTkJna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBMExKMQorOW5qUXJscFE5T2xRcVorTTErK1JsSERvMGlTUWRvbUYxdCtzNWdFWE1vRHduWk5IdkpwbG5SK1hyci9waG5WagorSUltOWdGaWRCQXlkcU1FazZRdmxNWGk5L0MwTU4ycWVlSURwUm5YNTdhUDdFM3ZJd1V6U28rLzFQTEJpajBwZAorTzkyVlo0OFR1Y0U4MXFjbW0rekRPM3JaVGJ4dG0rZ1ZBZVB3UjZrQ0F3RUFBVEFOQmdrcWhraUc5dzBCQVFJRgorQUFPQmdRQlQzZFB3bkNSK1FLcmkvQUFhMTlvTS9ESmh1QlVObHZQNlZ4dC9NM3l2NlppYVljaDZzN2Yvc2R5WgorZzl5c0V2eHd5Ujg0UXUxRTlvQXVXMnN6YWF5YzAxem5YMW9ZeDdFdGVRU1dRWkdaUWJFOERicUVPY1k3bC9BbQoreVk3dXZjeENsZjhleHdJL1ZBeDQ5YnlxWUh3Q2FlamNyT0lDZG1IRVBnUHEwb29rMFE9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMSAoMHgwKQorICAgICAgICBTZXJpYWwgTnVtYmVyOgorICAgICAgICAgICAgMDI6YTY6MDA6MDA6MDEKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQyV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBPPVZlcmlTaWduLCBJbmMuLCBPVT1DbGFzcyA0IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBKYW4gMjkgMDA6MDA6MDAgMTk5NiBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IERlYyAzMSAyMzo1OTo1OSAxOTk5IEdNVAorICAgICAgICBTdWJqZWN0OiBDPVVTLCBPPVZlcmlTaWduLCBJbmMuLCBPVT1DbGFzcyA0IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpkMDpiMjo3NTpmNjo3ODpkMDphZTo1YTo1MDpmNDplOTo1MDphOTo5ZjoKKyAgICAgICAgICAgICAgICAgICAgOGM6ZDc6ZWY6OTE6OTQ6NzA6ZTg6ZDI6MjQ6OTA6NzY6ODk6ODU6ZDY6ZGY6CisgICAgICAgICAgICAgICAgICAgIGFjOmU2OjAxOjE3OjMyOjgwOmYwOjlkOjkzOjQ3OmJjOjlhOjY1OjlkOjFmOgorICAgICAgICAgICAgICAgICAgICA5NzphZTpiZjplOTo4Njo3NTo2MzoyMDo4OTpiZDo4MDo1ODo5ZDowNDowYzoKKyAgICAgICAgICAgICAgICAgICAgOWQ6YTg6YzE6MjQ6ZTk6MGI6ZTU6MzE6Nzg6YmQ6ZmM6MmQ6MGM6Mzc6NmE6CisgICAgICAgICAgICAgICAgICAgIDllOjc4OjgwOmU5OjQ2Ojc1OmY5OmVkOmEzOmZiOjEzOjdiOmM4OmMxOjRjOgorICAgICAgICAgICAgICAgICAgICBkMjphMzplZjpmNTozYzpiMDo2Mjo4Zjo0YTo1ZDozYjpkZDo5NTo2Nzo4ZjoKKyAgICAgICAgICAgICAgICAgICAgMTM6Yjk6YzE6M2M6ZDY6YTc6MjY6OWI6ZWM6YzM6M2I6N2E6ZDk6NGQ6YmM6CisgICAgICAgICAgICAgICAgICAgIDZkOjliOmU4OjE1OjAxOmUzOmYwOjQ3OmE5CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kMldpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDUzOmRkOmQzOmYwOjljOjI0OjdlOjQwOmFhOmUyOmZjOjAwOjFhOmQ3OmRhOjBjOmZjOjMyOgorICAgICAgICA2MTpiODoxNTowZDo5NjpmMzpmYTo1NzoxYjo3ZjozMzo3YzphZjplOTo5ODo5YTo2MTpjODoKKyAgICAgICAgN2E6YjM6Yjc6ZmY6YjE6ZGM6OTk6ODM6ZGM6YWM6MTI6ZmM6NzA6Yzk6MWY6Mzg6NDI6ZWQ6CisgICAgICAgIDQ0OmY2OjgwOjJlOjViOjZiOjMzOjY5OmFjOjljOmQzOjVjOmU3OjVmOjVhOjE4OmM3OmIxOgorICAgICAgICAyZDo3OTowNDo5Njo0MTo5MTo5OTo0MTpiMTozYzowZDpiYTo4NDozOTpjNjozYjo5NzpmMDoKKyAgICAgICAgMjY6Yzk6OGU6ZWU6YmQ6Y2M6NDI6OTU6ZmY6MWU6Yzc6MDI6M2Y6NTQ6MGM6Nzg6ZjU6YmM6CisgICAgICAgIGFhOjYwOjdjOjAyOjY5OmU4OmRjOmFjOmUyOjAyOjc2OjYxOmM0OjNlOjAzOmVhOmQyOjhhOgorICAgICAgICAyNDpkMQorCitWZXJpc2lnbiBDbGFzcyAxIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IDk3OjYwOkU4OjU3OjVGOkQzOjUwOjQ3OkU1OjQzOjBDOjk0OjM2OjhBOkIwOjYyCitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQ1BUQ0NBYVlDRVFETnVuOVc4Ti9rdkZUK0lxeXpjcXBWTUEwR0NTcUdTSWIzRFFFQkFnVUFNRjh4Q3pBSgorQmdOVkJBWVRBbFZUTVJjd0ZRWURWUVFLRXc1V1pYSnBVMmxuYml3Z1NXNWpMakUzTURVR0ExVUVDeE11UTJ4aAorYzNNZ01TQlFkV0pzYVdNZ1VISnBiV0Z5ZVNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFlRncwNQorTmpBeE1qa3dNREF3TURCYUZ3MHlPREE0TURFeU16VTVOVGxhTUY4eEN6QUpCZ05WQkFZVEFsVlRNUmN3RlFZRAorVlFRS0V3NVdaWEpwVTJsbmJpd2dTVzVqTGpFM01EVUdBMVVFQ3hNdVEyeGhjM01nTVNCUWRXSnNhV01nVUhKcAorYldGeWVTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRDQm56QU5CZ2txaGtpRzl3MEJBUUVGQUFPQgoralFBd2dZa0NnWUVBNVJtL2JhTldZUzJaU0hIMlo5NjVqZXUzbm9hQUNwRU8ramdscjBhSWd1VnpxS0NiSkYwTgorSDh4bGJneXcwRmFFR0llYUJwc1FvWFBmdEZnNWEyN0I5aFhWcUtnL3FoSUdqVEdzZjdBMDE0ODBaNGdKelJRUgorNGs1RlZta2ZlQUtBMnR4SGtTbTdOc2xqWE1YZzF5MkhlNkczTXJCN01Mb3FMekdxN3FObjJ0c0NBd0VBQVRBTgorQmdrcWhraUc5dzBCQVFJRkFBT0JnUUJNUDdpTHhtamY3a016RGwzcHBzc0hoRTE2TS8rU0cvUTJyZGlWSWpabworRVd4OFFzenpuQzdFQno4VXNBOVAvNUNTZHZuaXZFcnBqODJnZ0FyM3hTbnhnaUpkdUxIZGdTT2pleVVWUmpCNQorRnZqcUJVdVVmeDNDSE1qanQvUVFRRHdUdzE4ZlUraEk1SWEwZTZFMXNIc2x1cmpUanFzL09KMEFOQUNZODlGeAorbEE9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMSAoMHgwKQorICAgICAgICBTZXJpYWwgTnVtYmVyOgorICAgICAgICAgICAgY2Q6YmE6N2Y6NTY6ZjA6ZGY6ZTQ6YmM6NTQ6ZmU6MjI6YWM6YjM6NzI6YWE6NTUKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQyV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBPPVZlcmlTaWduLCBJbmMuLCBPVT1DbGFzcyAxIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBKYW4gMjkgMDA6MDA6MDAgMTk5NiBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEF1ZyAgMSAyMzo1OTo1OSAyMDI4IEdNVAorICAgICAgICBTdWJqZWN0OiBDPVVTLCBPPVZlcmlTaWduLCBJbmMuLCBPVT1DbGFzcyAxIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDplNToxOTpiZjo2ZDphMzo1Njo2MToyZDo5OTo0ODo3MTpmNjo2NzpkZToKKyAgICAgICAgICAgICAgICAgICAgYjk6OGQ6ZWI6Yjc6OWU6ODY6ODA6MGE6OTE6MGU6ZmE6Mzg6MjU6YWY6NDY6CisgICAgICAgICAgICAgICAgICAgIDg4OjgyOmU1OjczOmE4OmEwOjliOjI0OjVkOjBkOjFmOmNjOjY1OjZlOjBjOgorICAgICAgICAgICAgICAgICAgICBiMDpkMDo1Njo4NDoxODo4Nzo5YTowNjo5YjoxMDphMTo3MzpkZjpiNDo1ODoKKyAgICAgICAgICAgICAgICAgICAgMzk6NmI6NmU6YzE6ZjY6MTU6ZDU6YTg6YTg6M2Y6YWE6MTI6MDY6OGQ6MzE6CisgICAgICAgICAgICAgICAgICAgIGFjOjdmOmIwOjM0OmQ3OjhmOjM0OjY3Ojg4OjA5OmNkOjE0OjExOmUyOjRlOgorICAgICAgICAgICAgICAgICAgICA0NTo1Njo2OToxZjo3ODowMjo4MDpkYTpkYzo0Nzo5MToyOTpiYjozNjpjOToKKyAgICAgICAgICAgICAgICAgICAgNjM6NWM6YzU6ZTA6ZDc6MmQ6ODc6N2I6YTE6Yjc6MzI6YjA6N2I6MzA6YmE6CisgICAgICAgICAgICAgICAgICAgIDJhOjJmOjMxOmFhOmVlOmEzOjY3OmRhOmRiCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kMldpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDRjOjNmOmI4OjhiOmM2OjY4OmRmOmVlOjQzOjMzOjBlOjVkOmU5OmE2OmNiOjA3Ojg0OjRkOgorICAgICAgICA3YTozMzpmZjo5MjoxYjpmNDozNjphZDpkODo5NToyMjozNjo2ODoxMTo2Yzo3Yzo0MjpjYzoKKyAgICAgICAgZjM6OWM6MmU6YzQ6MDc6M2Y6MTQ6YjA6MGY6NGY6ZmY6OTA6OTI6NzY6Zjk6ZTI6YmM6NGE6CisgICAgICAgIGU5OjhmOmNkOmEwOjgwOjBhOmY3OmM1OjI5OmYxOjgyOjIyOjVkOmI4OmIxOmRkOjgxOjIzOgorICAgICAgICBhMzo3YjoyNToxNTo0NjozMDo3OToxNjpmODplYTowNTo0Yjo5NDo3ZjoxZDpjMjoxYzpjODoKKyAgICAgICAgZTM6Yjc6ZjQ6MTA6NDA6M2M6MTM6YzM6NWY6MWY6NTM6ZTg6NDg6ZTQ6ODY6YjQ6N2I6YTE6CisgICAgICAgIDM1OmIwOjdiOjI1OmJhOmI4OmQzOjhlOmFiOjNmOjM4OjlkOjAwOjM0OjAwOjk4OmYzOmQxOgorICAgICAgICA3MTo5NAorCitWZXJpc2lnbiBDbGFzcyAxIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiBGMjo3RDpFOTo1NDpFNDpBMzoyMjowRDo3Njo5RjpFNzowQjpCQjpCMzoyNDoyQgorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURBakNDQW1zQ0VEbktWSW4rVUNJeS9qTFoyL3NiaEJrd0RRWUpLb1pJaHZjTkFRRUZCUUF3Z2NFeEN6QUoKK0JnTlZCQVlUQWxWVE1SY3dGUVlEVlFRS0V3NVdaWEpwVTJsbmJpd2dTVzVqTGpFOE1Eb0dBMVVFQ3hNelEyeGgKK2MzTWdNU0JRZFdKc2FXTWdVSEpwYldGeWVTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVNBdElFY3kKK01Ub3dPQVlEVlFRTEV6RW9ZeWtnTVRrNU9DQldaWEpwVTJsbmJpd2dTVzVqTGlBdElFWnZjaUJoZFhSb2IzSnAKK2VtVmtJSFZ6WlNCdmJteDVNUjh3SFFZRFZRUUxFeFpXWlhKcFUybG5iaUJVY25WemRDQk9aWFIzYjNKck1CNFgKK0RUazRNRFV4T0RBd01EQXdNRm9YRFRFNE1EVXhPREl6TlRrMU9Wb3dnY0V4Q3pBSkJnTlZCQVlUQWxWVE1SY3cKK0ZRWURWUVFLRXc1V1pYSnBVMmxuYml3Z1NXNWpMakU4TURvR0ExVUVDeE16UTJ4aGMzTWdNU0JRZFdKc2FXTWcKK1VISnBiV0Z5ZVNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlU0F0SUVjeU1Ub3dPQVlEVlFRTEV6RW8KK1l5a2dNVGs1T0NCV1pYSnBVMmxuYml3Z1NXNWpMaUF0SUVadmNpQmhkWFJvYjNKcGVtVmtJSFZ6WlNCdmJteDUKK01SOHdIUVlEVlFRTEV4WldaWEpwVTJsbmJpQlVjblZ6ZENCT1pYUjNiM0pyTUlHZk1BMEdDU3FHU0liM0RRRUIKK0FRVUFBNEdOQURDQmlRS0JnUUNxMExxK0ZpMjRnOVRLMGcrOGRqSEtsTmdkazR4V0FyelpieHB2VWpadWRWWUsKK1ZkUGZRNGNoRVdXS2ZvKzlJZDVyTWo4YmhEU1ZCWjFCTmV1UzY1YmRxbGsvQVZOdG1VL3Q1ZUlxV3BEQnVjU20KK0ZjL0lSZXVtWFk2Y1B2QmtKSGFsemFzYWI3YlllMUZoYnFaL2g4aml0K1UwM0VHSTZnbEF2bk9TUFd2bmRRSUQKK0FRQUJNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0R0JBSXYzR2hET2Rsd0hxNE9aM0JlQWJ6UTVYWmcrYTNJczRjZWkKK2UwQXB1WGlJdWt6Rm8ycGVubTU3NC9JQ1FReG12cTM3cnFJVXpwTHpvalNMdExLMkpQTGwxZURJNVdKdGhIdkwKK3Zyc0RpM3hYeXZBM3FaQ3ZpdTREdmgwb25Oa21kcUROeEoxTzhLNEhGdFcrcjFjSWF0Q2dRa0pDSHZRZ3pLVjQKK2dwVW1PSXBICistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAxICgweDApCisgICAgICAgIFNlcmlhbCBOdW1iZXI6CisgICAgICAgICAgICAzOTpjYTo1NDo4OTpmZTo1MDoyMjozMjpmZTozMjpkOTpkYjpmYjoxYjo4NDoxOQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBPPVZlcmlTaWduLCBJbmMuLCBPVT1DbGFzcyAxIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIsIE9VPShjKSAxOTk4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHksIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IE1heSAxOCAwMDowMDowMCAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogTWF5IDE4IDIzOjU5OjU5IDIwMTggR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89VmVyaVNpZ24sIEluYy4sIE9VPUNsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMiwgT1U9KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seSwgT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yaworICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6YWE6ZDA6YmE6YmU6MTY6MmQ6Yjg6ODM6ZDQ6Y2E6ZDI6MGY6YmM6NzY6CisgICAgICAgICAgICAgICAgICAgIDMxOmNhOjk0OmQ4OjFkOjkzOjhjOjU2OjAyOmJjOmQ5OjZmOjFhOjZmOjUyOgorICAgICAgICAgICAgICAgICAgICAzNjo2ZTo3NTo1NjowYTo1NTpkMzpkZjo0Mzo4NzoyMToxMTo2NTo4YTo3ZToKKyAgICAgICAgICAgICAgICAgICAgOGY6YmQ6MjE6ZGU6NmI6MzI6M2Y6MWI6ODQ6MzQ6OTU6MDU6OWQ6NDE6MzU6CisgICAgICAgICAgICAgICAgICAgIGViOjkyOmViOjk2OmRkOmFhOjU5OjNmOjAxOjUzOjZkOjk5OjRmOmVkOmU1OgorICAgICAgICAgICAgICAgICAgICBlMjoyYTo1YTo5MDpjMTpiOTpjNDphNjoxNTpjZjpjODo0NTplYjphNjo1ZDoKKyAgICAgICAgICAgICAgICAgICAgOGU6OWM6M2U6ZjA6NjQ6MjQ6NzY6YTU6Y2Q6YWI6MWE6NmY6YjY6ZDg6N2I6CisgICAgICAgICAgICAgICAgICAgIDUxOjYxOjZlOmE2OjdmOjg3OmM4OmUyOmI3OmU1OjM0OmRjOjQxOjg4OmVhOgorICAgICAgICAgICAgICAgICAgICAwOTo0MDpiZTo3Mzo5MjozZDo2YjplNzo3NQorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgOGI6Zjc6MWE6MTA6Y2U6NzY6NWM6MDc6YWI6ODM6OTk6ZGM6MTc6ODA6NmY6MzQ6Mzk6NWQ6CisgICAgICAgIDk4OjNlOjZiOjcyOjJjOmUxOmM3OmEyOjdiOjQwOjI5OmI5Ojc4Ojg4OmJhOjRjOmM1OmEzOgorICAgICAgICA2YTo1ZTo5ZTo2ZTo3YjplMzpmMjowMjo0MTowYzo2NjpiZTphZDpmYjphZTphMjoxNDpjZToKKyAgICAgICAgOTI6ZjM6YTI6MzQ6OGI6YjQ6YjI6YjY6MjQ6ZjI6ZTU6ZDU6ZTA6Yzg6ZTU6NjI6NmQ6ODQ6CisgICAgICAgIDdiOmNiOmJlOmJiOjAzOjhiOjdjOjU3OmNhOmYwOjM3OmE5OjkwOmFmOjhhOmVlOjAzOmJlOgorICAgICAgICAxZDoyODo5YzpkOToyNjo3NjphMDpjZDpjNDo5ZDo0ZTpmMDphZTowNzoxNjpkNTpiZTphZjoKKyAgICAgICAgNTc6MDg6NmE6ZDA6YTA6NDI6NDI6NDI6MWU6ZjQ6MjA6Y2M6YTU6Nzg6ODI6OTU6MjY6Mzg6CisgICAgICAgIDhhOjQ3CisKK1ZlcmlzaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IEIxOjQ3OkJDOjE4OjU3OkQxOjE4OkEwOjc4OjJEOkVDOjcxOkU4OjJBOjk1OjczCitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRUdqQ0NBd0lDRVFDTFczVldoRlNGQ3dEUHJ6aEl6ckdrTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUhLTVFzdworQ1FZRFZRUUdFd0pWVXpFWE1CVUdBMVVFQ2hNT1ZtVnlhVk5wWjI0c0lFbHVZeTR4SHpBZEJnTlZCQXNURmxabAorY21sVGFXZHVJRlJ5ZFhOMElFNWxkSGR2Y21zeE9qQTRCZ05WQkFzVE1TaGpLU0F4T1RrNUlGWmxjbWxUYVdkdQorTENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hSVEJEQmdOVkJBTVRQRlpsY21sVAorYVdkdUlFTnNZWE56SURFZ1VIVmliR2xqSUZCeWFXMWhjbmtnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcAorZEhrZ0xTQkhNekFlRncwNU9URXdNREV3TURBd01EQmFGdzB6TmpBM01UWXlNelU1TlRsYU1JSEtNUXN3Q1FZRAorVlFRR0V3SlZVekVYTUJVR0ExVUVDaE1PVm1WeWFWTnBaMjRzSUVsdVl5NHhIekFkQmdOVkJBc1RGbFpsY21sVAorYVdkdUlGUnlkWE4wSUU1bGRIZHZjbXN4T2pBNEJnTlZCQXNUTVNoaktTQXhPVGs1SUZabGNtbFRhV2R1TENCSgorYm1NdUlDMGdSbTl5SUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreFJUQkRCZ05WQkFNVFBGWmxjbWxUYVdkdQorSUVOc1lYTnpJREVnVUhWaWJHbGpJRkJ5YVcxaGNua2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZworTFNCSE16Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU4yRTFMbTArYWZZOHdSNAorbk40OTNHd1RGdGw2M1NSUlpzREhKbGtOckFZSXdwVFJNeC93Z3pVZmJodkkzcXB1RlU1VUorL0ViUnJzQytNTworOEVTbFY4ZEFXQjZqUng5eDdHRDJiWlRJR0RudC9rSVlWdC9rVEVrUWVFNEJkalZqRWpiZFpyd0JCRGFqVldqVgorb2pZSnJLc2hKbFFHclQvS0ZPQ3N5cTBHSFpYaStKM3g0R0Qvd245MUswek0ydjZIbVNIcXV2NCtWTmZTV1hqYgorUEc3UG9CTUFHcmdub2VTK1o1YktvTVd6bk4zSmRaN3JNSnBmbzgzWnJuZ1pQeVBwWE5zcHZhMVZ5QnRVakdQMgorNkticXh6Y1NYS01wSGdMWjJ4ODd0TmNQVmtlQkZRUktyNE1uMGNWWWlNSGQ5cXFub3hqYWFLcHRFVkhodjJWcgorbjVaMjBUMENBd0VBQVRBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQXEyYU4xN082eDVxMjVsWFFCZkdmTVkxYQorcXRtcVJpWVBjZTJsclZOV1lnRkhLa1RwL2o5MEN4T2J1ZlJORzdMUlg3SzIwb2hjczUvTnk5U24yV0NWaERyNAord1RjZFljcm5zTVhsa2RwVXBxd3hnYTZYM3MwSXJMakFsNEIvYm5LazUya1RsV1VmeEpNOC9YbVBCTlErVCtyMworbnM3TlozeFBaUUwva1lWVWM4Zi9OdmVHTGV6UVhrLy9FWjl5QnRhNEd2Rk1EU1psNGtTQUhzZWY0OTNvQ3RycworcFNDQWFXaWhUMzdoYTg4SFFmcURqcnc0M2JBdUViRnJza0xNbXJ6NVNDSjVTaGtQc2h3K0lIVFphc08rOGloNAorRTFaNVQyMVE2aHV3dFZleE4yWllJL1BjRDk4S2g4VHZoZ1hWT0JSZ21hTkwzZ2FXY1N6eTI3WWZwTzgvN2c9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMSAoMHgwKQorICAgICAgICBTZXJpYWwgTnVtYmVyOgorICAgICAgICAgICAgOGI6NWI6NzU6NTY6ODQ6NTQ6ODU6MGI6MDA6Y2Y6YWY6Mzg6NDg6Y2U6YjE6YTQKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1VUywgTz1WZXJpU2lnbiwgSW5jLiwgT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yaywgT1U9KGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seSwgQ049VmVyaVNpZ24gQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBPY3QgIDEgMDA6MDA6MDAgMTk5OSBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEp1bCAxNiAyMzo1OTo1OSAyMDM2IEdNVAorICAgICAgICBTdWJqZWN0OiBDPVVTLCBPPVZlcmlTaWduLCBJbmMuLCBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrLCBPVT0oYykgMTk5OSBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5LCBDTj1WZXJpU2lnbiBDbGFzcyAxIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzMKKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgyMDQ4IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgyMDQ4IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmRkOjg0OmQ0OmI5OmI0OmY5OmE3OmQ4OmYzOjA0Ojc4OjljOmRlOjNkOgorICAgICAgICAgICAgICAgICAgICBkYzo2YzoxMzoxNjpkOTo3YTpkZDoyNDo1MTo2NjpjMDpjNzoyNjo1OTowZDoKKyAgICAgICAgICAgICAgICAgICAgYWM6MDY6MDg6YzI6OTQ6ZDE6MzM6MWY6ZjA6ODM6MzU6MWY6NmU6MWI6Yzg6CisgICAgICAgICAgICAgICAgICAgIGRlOmFhOjZlOjE1OjRlOjU0OjI3OmVmOmM0OjZkOjFhOmVjOjBiOmUzOjBlOgorICAgICAgICAgICAgICAgICAgICBmMDo0NDphNTo1NzpjNzo0MDo1ODoxZTphMzo0NzoxZjo3MTplYzo2MDpmNjoKKyAgICAgICAgICAgICAgICAgICAgNmQ6OTQ6Yzg6MTg6Mzk6ZWQ6ZmU6NDI6MTg6NTY6ZGY6ZTQ6NGM6NDk6MTA6CisgICAgICAgICAgICAgICAgICAgIDc4OjRlOjAxOjc2OjM1OjYzOjEyOjM2OmRkOjY2OmJjOjAxOjA0OjM2OmEzOgorICAgICAgICAgICAgICAgICAgICA1NTo2ODpkNTphMjozNjowOTphYzphYjoyMToyNjo1NDowNjphZDozZjpjYToKKyAgICAgICAgICAgICAgICAgICAgMTQ6ZTA6YWM6Y2E6YWQ6MDY6MWQ6OTU6ZTI6Zjg6OWQ6ZjE6ZTA6NjA6ZmY6CisgICAgICAgICAgICAgICAgICAgIGMyOjdmOjc1OjJiOjRjOmNjOmRhOmZlOjg3Ojk5OjIxOmVhOmJhOmZlOjNlOgorICAgICAgICAgICAgICAgICAgICA1NDpkNzpkMjo1OTo3ODpkYjozYzo2ZTpjZjphMDoxMzowMDoxYTpiODoyNzoKKyAgICAgICAgICAgICAgICAgICAgYTE6ZTQ6YmU6Njc6OTY6Y2E6YTA6YzU6YjM6OWM6ZGQ6Yzk6NzU6OWU6ZWI6CisgICAgICAgICAgICAgICAgICAgIDMwOjlhOjVmOmEzOmNkOmQ5OmFlOjc4OjE5OjNmOjIzOmU5OjVjOmRiOjI5OgorICAgICAgICAgICAgICAgICAgICBiZDphZDo1NTpjODoxYjo1NDo4Yzo2MzpmNjplODphNjplYTpjNzozNzoxMjoKKyAgICAgICAgICAgICAgICAgICAgNWM6YTM6Mjk6MWU6MDI6ZDk6ZGI6MWY6M2I6YjQ6ZDc6MGY6NTY6NDc6ODE6CisgICAgICAgICAgICAgICAgICAgIDE1OjA0OjRhOmFmOjgzOjI3OmQxOmM1OjU4Ojg4OmMxOmRkOmY2OmFhOmE3OgorICAgICAgICAgICAgICAgICAgICBhMzoxODpkYTo2ODphYTo2ZDoxMTo1MTplMTpiZjo2NTo2Yjo5Zjo5Njo3NjoKKyAgICAgICAgICAgICAgICAgICAgZDE6M2QKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIGFiOjY2OjhkOmQ3OmIzOmJhOmM3OjlhOmI2OmU2OjU1OmQwOjA1OmYxOjlmOjMxOjhkOjVhOgorICAgICAgICBhYTpkOTphYTo0NjoyNjowZjo3MTplZDphNTphZDo1Mzo1Njo2MjowMTo0NzoyYTo0NDplOToKKyAgICAgICAgZmU6M2Y6NzQ6MGI6MTM6OWI6Yjk6ZjQ6NGQ6MWI6YjI6ZDE6NWY6YjI6YjY6ZDI6ODg6NWM6CisgICAgICAgIGIzOjlmOmNkOmNiOmQ0OmE3OmQ5OjYwOjk1Ojg0OjNhOmY4OmMxOjM3OjFkOjYxOmNhOmU3OgorICAgICAgICBiMDpjNTplNTo5MTpkYTo1NDphNjphYzozMTo4MTphZTo5NzpkZTpjZDowODphYzpiODpjMDoKKyAgICAgICAgOTc6ODA6N2Y6NmU6NzI6YTQ6ZTc6Njk6MTM6OTU6NjU6MWY6YzQ6OTM6M2M6ZmQ6Nzk6OGY6CisgICAgICAgIDA0OmQ0OjNlOjRmOmVhOmY3OjllOmNlOmNkOjY3OjdjOjRmOjY1OjAyOmZmOjkxOjg1OjU0OgorICAgICAgICA3MzpjNzpmZjozNjpmNzo4NjoyZDplYzpkMDo1ZTo0ZjpmZjoxMTo5Zjo3MjowNjpkNjpiODoKKyAgICAgICAgMWE6ZjE6NGM6MGQ6MjY6NjU6ZTI6NDQ6ODA6MWU6Yzc6OWY6ZTM6ZGQ6ZTg6MGE6ZGE6ZWM6CisgICAgICAgIGE1OjIwOjgwOjY5OjY4OmExOjRmOjdlOmUxOjZiOmNmOjA3OjQxOmZhOjgzOjhlOmJjOjM4OgorICAgICAgICBkZDpiMDoyZToxMTpiMTo2YjpiMjo0MjpjYzo5YTpiYzpmOTo0ODoyMjo3OTo0YToxOTowZjoKKyAgICAgICAgYjI6MWM6M2U6MjA6NzQ6ZDk6NmE6YzM6YmU6ZjI6Mjg6Nzg6MTM6NTY6Nzk6NGY6NmQ6NTA6CisgICAgICAgIGVhOjFiOmIwOmI1OjU3OmIxOjM3OjY2OjU4OjIzOmYzOmRjOjBmOmRmOjBhOjg3OmM0OmVmOgorICAgICAgICA4NjowNTpkNTozODoxNDo2MDo5OTphMzo0YjpkZTowNjo5Njo3MToyYzpmMjpkYjpiNjoxZjoKKyAgICAgICAgYTQ6ZWY6M2Y6ZWUKKworVmVyaXNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiBCMzo5QzoyNTpCMTpDMzoyRTozMjo1Mzo4MDoxNTozMDo5RDo0RDowMjo3NzozRQorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUNQRENDQWFVQ0VDMGIvRW9YamFPUjYrZi85WXRGdmdzd0RRWUpLb1pJaHZjTkFRRUNCUUF3WHpFTE1Ba0cKK0ExVUVCaE1DVlZNeEZ6QVZCZ05WQkFvVERsWmxjbWxUYVdkdUxDQkpibU11TVRjd05RWURWUVFMRXk1RGJHRnoKK2N5QXlJRkIxWW14cFl5QlFjbWx0WVhKNUlFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUI0WERUazIKK01ERXlPVEF3TURBd01Gb1hEVEk0TURnd01USXpOVGsxT1Zvd1h6RUxNQWtHQTFVRUJoTUNWVk14RnpBVkJnTlYKK0JBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1UY3dOUVlEVlFRTEV5NURiR0Z6Y3lBeUlGQjFZbXhwWXlCUWNtbHQKK1lYSjVJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1JR2ZNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R04KK0FEQ0JpUUtCZ1FDMldvdWpEV29qZzRCcnp6bUg5Q0VUTXdaTUphTHRWUktYeGFlQXVmcUR3U0NnK2k4VkRYeWgKK1lHdCtlU3o2Qmc4NnJ2WWJiN0hTL3k4b1VsK0RmVXZFZXJmNFpoK0FWUHkzd281WlNoUlhSdEdhazc1QmtRTzcKK0ZZQ1RYT3ZuekFoc1B6NnpTdnovUzJ3ajFWQ0NKa1FaamlQRGNlb1pKRWNFbm5XL3lLWUFId0lEQVFBQk1BMEcKK0NTcUdTSWIzRFFFQkFnVUFBNEdCQUlvYksvbzV3WFRYWHRnWlpLSllTaTAzNEROSEQ2enQ5NnJiSHVTTEJseGcKK0o4cEZVczRXN3o4R1pPZVVhSHhnTXhVUmFhK2RZbzJqQTFScnByN2w3Z1VZWUFTL1FvRDkwS2lvSGdFNzk2TmMKK3I2UGM1aWFBSXp5NFJIVDNDcTVKaTJGNHpDUy9pSXFuRHVwekdVSDlUUVB3aU5IbGVJMmxLay8ybHcwWGQ4clkKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDEgKDB4MCkKKyAgICAgICAgU2VyaWFsIE51bWJlcjoKKyAgICAgICAgICAgIDJkOjFiOmZjOjRhOjE3OjhkOmEzOjkxOmViOmU3OmZmOmY1OjhiOjQ1OmJlOjBiCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kMldpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1VUywgTz1WZXJpU2lnbiwgSW5jLiwgT1U9Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogSmFuIDI5IDAwOjAwOjAwIDE5OTYgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBBdWcgIDEgMjM6NTk6NTkgMjAyOCBHTVQKKyAgICAgICAgU3ViamVjdDogQz1VUywgTz1WZXJpU2lnbiwgSW5jLiwgT1U9Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6YjY6NWE6OGI6YTM6MGQ6NmE6MjM6ODM6ODA6NmI6Y2Y6Mzk6ODc6ZjQ6CisgICAgICAgICAgICAgICAgICAgIDIxOjEzOjMzOjA2OjRjOjI1OmEyOmVkOjU1OjEyOjk3OmM1OmE3OjgwOmI5OgorICAgICAgICAgICAgICAgICAgICBmYTo4MzpjMToyMDphMDpmYToyZjoxNTowZDo3YzphMTo2MDo2Yjo3ZTo3OToKKyAgICAgICAgICAgICAgICAgICAgMmM6ZmE6MDY6MGY6M2E6YWU6ZjY6MWI6NmY6YjE6ZDI6ZmY6MmY6Mjg6NTI6CisgICAgICAgICAgICAgICAgICAgIDVmOjgzOjdkOjRiOmM0OjdhOmI3OmY4OjY2OjFmOjgwOjU0OmZjOmI3OmMyOgorICAgICAgICAgICAgICAgICAgICA4ZTo1OTo0YToxNDo1Nzo0NjpkMTo5YTo5MzpiZTo0MTo5MTowMzpiYjoxNToKKyAgICAgICAgICAgICAgICAgICAgODA6OTM6NWM6ZWI6ZTc6Y2M6MDg6NmM6M2Y6M2U6YjM6NGE6ZmM6ZmY6NGI6CisgICAgICAgICAgICAgICAgICAgIDZjOjIzOmQ1OjUwOjgyOjI2OjQ0OjE5OjhlOjIzOmMzOjcxOmVhOjE5OjI0OgorICAgICAgICAgICAgICAgICAgICA0NzowNDo5ZTo3NTpiZjpjODphNjowMDoxZgorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDJXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA4YToxYjoyYjpmYTozOTpjMTo3NDpkNzo1ZTpkODoxOTo2NDphMjo1ODo0YToyZDozNzplMDoKKyAgICAgICAgMzM6NDc6MGY6YWM6ZWQ6Zjc6YWE6ZGI6MWU6ZTQ6OGI6MDY6NWM6NjA6Mjc6Y2E6NDU6NTI6CisgICAgICAgIGNlOjE2OmVmOjNmOjA2OjY0OmU3Ojk0OjY4OjdjOjYwOjMzOjE1OjExOjY5OmFmOjlkOjYyOgorICAgICAgICA4ZDphMzowMzo1NDo2YjphNjpiZTplNTplZTowNToxODo2MDowNDpiZjo0Mjo4MDpmZDpkMDoKKyAgICAgICAgYTg6YTg6MWU6MDE6M2I6Zjc6YTM6NWM6YWY6YTM6ZGM6ZTY6MjY6ODA6MjM6M2M6Yjg6NDQ6CisgICAgICAgIDc0OmY3OjBhOmFlOjQ5OjhiOjYxOjc4OmNjOjI0OmJmOjg4OjhhOmE3OjBlOmVhOjczOjE5OgorICAgICAgICA0MTpmZDo0ZDowMzpmMDo4ODpkMTplNTo3ODo4ZDphNToyYTo0ZjpmNjo5NzowZDoxNzo3NzoKKyAgICAgICAgY2E6ZDgKKworVmVyaXNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogMkQ6QkI6RTU6MjU6RDM6RDE6NjU6ODI6M0E6Qjc6MEU6RkE6RTY6RUI6RTI6RTEKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEQXpDQ0Ftd0NFUUM1TDJETWlKK2hla1lKdUZ0d2JJcXZNQTBHQ1NxR1NJYjNEUUVCQlFVQU1JSEJNUXN3CitDUVlEVlFRR0V3SlZVekVYTUJVR0ExVUVDaE1PVm1WeWFWTnBaMjRzSUVsdVl5NHhQREE2QmdOVkJBc1RNME5zCitZWE56SURJZ1VIVmliR2xqSUZCeWFXMWhjbmtnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2dMU0JICitNakU2TURnR0ExVUVDeE14S0dNcElERTVPVGdnVm1WeWFWTnBaMjRzSUVsdVl5NGdMU0JHYjNJZ1lYVjBhRzl5CithWHBsWkNCMWMyVWdiMjVzZVRFZk1CMEdBMVVFQ3hNV1ZtVnlhVk5wWjI0Z1ZISjFjM1FnVG1WMGQyOXlhekFlCitGdzA1T0RBMU1UZ3dNREF3TURCYUZ3MHlPREE0TURFeU16VTVOVGxhTUlIQk1Rc3dDUVlEVlFRR0V3SlZVekVYCitNQlVHQTFVRUNoTU9WbVZ5YVZOcFoyNHNJRWx1WXk0eFBEQTZCZ05WQkFzVE0wTnNZWE56SURJZ1VIVmliR2xqCitJRkJ5YVcxaGNua2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZ0xTQkhNakU2TURnR0ExVUVDeE14CitLR01wSURFNU9UZ2dWbVZ5YVZOcFoyNHNJRWx1WXk0Z0xTQkdiM0lnWVhWMGFHOXlhWHBsWkNCMWMyVWdiMjVzCitlVEVmTUIwR0ExVUVDeE1XVm1WeWFWTnBaMjRnVkhKMWMzUWdUbVYwZDI5eWF6Q0JuekFOQmdrcWhraUc5dzBCCitBUUVGQUFPQmpRQXdnWWtDZ1lFQXA0Z0JJWFFzNXhvRDhKamhsendQSVFqeG5OdVg2WnI4d2dRR0U3NWZVc2pNCitIaXdTVml5NEFXa3N6SmtmcmJDV3Jua0U4aE01d1h1WXVnZ3M2TUtFRXl5cWFla0o5TWVwQXFSQ3dpTlBTdGp3CitEcUw3TVd6SjVtK1pKd2YxNXZSTWVKNXQ2MGFHK3JtR3lWVHlzc1N2MUVZY1dza1ZNUDhOYlBVdERtM09mM2NDCitBd0VBQVRBTkJna3Foa2lHOXcwQkFRVUZBQU9CZ1FCeUx2bC8wZkZ4KzhTZTlzVmVVWXBBbUxobytKc2NnOWppCituYjMvN2FIbVp1b3ZDZlRLMStxbEs1WDJKR0NHVFVRdWc2WEVMYURUcm5ocGIzTGFiSzRJOEdPU04rYTd4REFYCityWGZNU1RXcXo5aVAwYjYzR0paSGMycFVJalJrTGJZV20xbGJ0RkZaT3JNTEZQUVMzMmVnOUsweVpGNnhSbkluCitqQko3eFVTMHJnPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDEgKDB4MCkKKyAgICAgICAgU2VyaWFsIE51bWJlcjoKKyAgICAgICAgICAgIGI5OjJmOjYwOmNjOjg4OjlmOmExOjdhOjQ2OjA5OmI4OjViOjcwOjZjOjhhOmFmCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9VVMsIE89VmVyaVNpZ24sIEluYy4sIE9VPUNsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMiwgT1U9KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seSwgT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yaworICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogTWF5IDE4IDAwOjAwOjAwIDE5OTggR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBBdWcgIDEgMjM6NTk6NTkgMjAyOCBHTVQKKyAgICAgICAgU3ViamVjdDogQz1VUywgTz1WZXJpU2lnbiwgSW5jLiwgT1U9Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyLCBPVT0oYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5LCBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDphNzo4ODowMToyMTo3NDoyYzplNzoxYTowMzpmMDo5ODplMTo5NzozYzoKKyAgICAgICAgICAgICAgICAgICAgMGY6MjE6MDg6ZjE6OWM6ZGI6OTc6ZTk6OWE6ZmM6YzI6MDQ6MDY6MTM6YmU6CisgICAgICAgICAgICAgICAgICAgIDVmOjUyOmM4OmNjOjFlOjJjOjEyOjU2OjJjOmI4OjAxOjY5OjJjOmNjOjk5OgorICAgICAgICAgICAgICAgICAgICAxZjphZDpiMDo5NjphZTo3OTowNDpmMjoxMzozOTpjMTo3Yjo5ODpiYTowODoKKyAgICAgICAgICAgICAgICAgICAgMmM6ZTg6YzI6ODQ6MTM6MmM6YWE6Njk6ZTk6MDk6ZjQ6Yzc6YTk6MDI6YTQ6CisgICAgICAgICAgICAgICAgICAgIDQyOmMyOjIzOjRmOjRhOmQ4OmYwOjBlOmEyOmZiOjMxOjZjOmM5OmU2OjZmOgorICAgICAgICAgICAgICAgICAgICA5OToyNzowNzpmNTplNjpmNDo0Yzo3ODo5ZTo2ZDplYjo0Njo4NjpmYTpiOToKKyAgICAgICAgICAgICAgICAgICAgODY6Yzk6NTQ6ZjI6YjI6YzQ6YWY6ZDQ6NDY6MWM6NWE6Yzk6MTU6MzA6ZmY6CisgICAgICAgICAgICAgICAgICAgIDBkOjZjOmY1OjJkOjBlOjZkOmNlOjdmOjc3CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA3MjoyZTpmOTo3ZjpkMTpmMTo3MTpmYjpjNDo5ZTpmNjpjNTo1ZTo1MTo4YTo0MDo5ODpiODoKKyAgICAgICAgNjg6Zjg6OWI6MWM6ODM6ZDg6ZTI6OWQ6YmQ6ZmY6ZWQ6YTE6ZTY6NjY6ZWE6MmY6MDk6ZjQ6CisgICAgICAgIGNhOmQ3OmVhOmE1OjJiOjk1OmY2OjI0OjYwOjg2OjRkOjQ0OjJlOjgzOmE1OmM0OjJkOmEwOgorICAgICAgICBkMzphZTo3ODo2OTo2Zjo3MjpkYTo2YzphZTowODpmMDo2Mzo5MjozNzplNjpiYjpjNDozMDoKKyAgICAgICAgMTc6YWQ6Nzc6Y2M6NDk6MzU6YWE6Y2Y6ZDg6OGY6ZDE6YmU6Yjc6MTg6OTY6NDc6NzM6NmE6CisgICAgICAgIDU0OjIyOjM0OjY0OjJkOmI2OjE2OjliOjU5OjViOmI0OjUxOjU5OjNhOmIzOjBiOjE0OmY0OgorICAgICAgICAxMjpkZjo2NzphMDpmNDphZDozMjo2NDo1ZTpiMTo0Njo3MjoyNzo4YzoxMjo3YjpjNTo0NDoKKyAgICAgICAgYjQ6YWUKKworVmVyaXNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogRjg6QkU6QzQ6NjM6MjI6Qzk6QTg6NDY6NzQ6OEI6Qjg6MUQ6MUU6NEE6MkI6RjYKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFR1RDQ0F3RUNFR0Z3eTBtTVg1aEZLZWV3cHRsUVczb3dEUVlKS29aSWh2Y05BUUVGQlFBd2djb3hDekFKCitCZ05WQkFZVEFsVlRNUmN3RlFZRFZRUUtFdzVXWlhKcFUybG5iaXdnU1c1akxqRWZNQjBHQTFVRUN4TVdWbVZ5CithVk5wWjI0Z1ZISjFjM1FnVG1WMGQyOXlhekU2TURnR0ExVUVDeE14S0dNcElERTVPVGtnVm1WeWFWTnBaMjRzCitJRWx1WXk0Z0xTQkdiM0lnWVhWMGFHOXlhWHBsWkNCMWMyVWdiMjVzZVRGRk1FTUdBMVVFQXhNOFZtVnlhVk5wCitaMjRnUTJ4aGMzTWdNaUJRZFdKc2FXTWdVSEpwYldGeWVTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwCitlU0F0SUVjek1CNFhEVGs1TVRBd01UQXdNREF3TUZvWERUTTJNRGN4TmpJek5UazFPVm93Z2NveEN6QUpCZ05WCitCQVlUQWxWVE1SY3dGUVlEVlFRS0V3NVdaWEpwVTJsbmJpd2dTVzVqTGpFZk1CMEdBMVVFQ3hNV1ZtVnlhVk5wCitaMjRnVkhKMWMzUWdUbVYwZDI5eWF6RTZNRGdHQTFVRUN4TXhLR01wSURFNU9Ua2dWbVZ5YVZOcFoyNHNJRWx1CitZeTRnTFNCR2IzSWdZWFYwYUc5eWFYcGxaQ0IxYzJVZ2IyNXNlVEZGTUVNR0ExVUVBeE04Vm1WeWFWTnBaMjRnCitRMnhoYzNNZ01pQlFkV0pzYVdNZ1VISnBiV0Z5ZVNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlU0F0CitJRWN6TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFyd29Od3RVczIyZTVMZVdVCitKOTJsdnVDd1RZK3pZVlk4MW56RDlNMCtoc3VpaU9MaDJLUnB4YlhpdjhHbVIxQmVSam1MMVphNnRXOFV2eERPCitKeE9lQlVlYk1Yb1QyQi9aMHdJM2k2MHNSL0NPZ1FhbkRUQU02L2M4RHlBZDNISkc3cVVDeUZ2RHlWWnBUTVVZCit3WkY3QzlVVEFKdTg3OE5JUGtaZ0lJVXExWkMyell1Z3pETGR0LzFBVmJKUUhGYXV6STEzVGNjZ1RhY3hkdTlvCitrb3FRSGdpQlZyS3RhYU5TME1zY3hDTTlINW4rVE9nV1k0N0dDSTcyTWZiUyt1VjIzYlVja3FOSnpjMEJ6V2pOCitxV202bytzZERaeWtJS2JCb01YUlJrd1hiZEtzWmorV2pPQ0UxRGIvSWxuRitSRmdxRjhFZmZJYTlpVkNZUS9FCitTcmcraVFJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUEwSmhVOHdJMU5RMGtkdmVraGt0ZG1uTGZlCit4YmpRNUYxZmRpTEFKdm1FT2pyNWpMWDc3R0R4Nk00RXNNamRwd09QTVBPWTM2VG1wREhmMHh3TFJ0eHlJRCt1Cis3Z1U4cERNL0N6bXNjSGh6UzVrcjN6RENWTENvTzFXaC9oWW96VUs5ZEc2QTJ5ZEVwODVFWGRRYmtKZ05Ia0tVCitzUUFzQk5CMG93SUZJbU5qellPMSs4RnRZbXRwZGYxZGNFRzU5Yjk4Mzc3Qk1uTWlJWXRZZ1hzVmtYcTY0MlJJCitzSC83TmlYYWxkRHhKQlFYM1JpQWEwWWpPVlQxam1JSkJCMlVrS2FiNWlYaVFrV3F1SkN0dmdpUHFRdENHSlRQCitjam5oc1VQZ0tNKzM1MXBzRTJ0SnMvL2pHSHlKaXpOZHJEUFhwL25hT2xYSldCRDVxdTlhdHM5TFM5OHEKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDEgKDB4MCkKKyAgICAgICAgU2VyaWFsIE51bWJlcjoKKyAgICAgICAgICAgIDYxOjcwOmNiOjQ5OjhjOjVmOjk4OjQ1OjI5OmU3OmIwOmE2OmQ5OjUwOjViOjdhCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9VVMsIE89VmVyaVNpZ24sIEluYy4sIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmssIE9VPShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHksIENOPVZlcmlTaWduIENsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMworICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogT2N0ICAxIDAwOjAwOjAwIDE5OTkgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBKdWwgMTYgMjM6NTk6NTkgMjAzNiBHTVQKKyAgICAgICAgU3ViamVjdDogQz1VUywgTz1WZXJpU2lnbiwgSW5jLiwgT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yaywgT1U9KGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seSwgQ049VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMjA0OCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMjA0OCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDphZjowYTowZDpjMjpkNToyYzpkYjo2NzpiOToyZDplNTo5NDoyNzpkZDoKKyAgICAgICAgICAgICAgICAgICAgYTU6YmU6ZTA6YjA6NGQ6OGY6YjM6NjE6NTY6M2M6ZDY6N2M6YzM6ZjQ6Y2Q6CisgICAgICAgICAgICAgICAgICAgIDNlOjg2OmNiOmEyOjg4OmUyOmUxOmQ4OmE0OjY5OmM1OmI1OmUyOmJmOmMxOgorICAgICAgICAgICAgICAgICAgICBhNjo0Nzo1MDo1ZTo0NjozOTo4YjpkNTo5NjpiYTpiNTo2ZjoxNDpiZjoxMDoKKyAgICAgICAgICAgICAgICAgICAgY2U6Mjc6MTM6OWU6MDU6NDc6OWI6MzE6N2E6MTM6ZDg6MWY6ZDk6ZDM6MDI6CisgICAgICAgICAgICAgICAgICAgIDM3OjhiOmFkOjJjOjQ3OmYwOjhlOjgxOjA2OmE3OjBkOjMwOjBjOmViOmY3OgorICAgICAgICAgICAgICAgICAgICAzYzowZjoyMDoxZDpkYzo3Mjo0NjplZTphNTowMjpjODo1YjpjMzpjOTo1NjoKKyAgICAgICAgICAgICAgICAgICAgNjk6NGM6YzU6MTg6YzE6OTE6N2I6MGI6ZDU6MTM6MDA6OWI6YmM6ZWY6YzM6CisgICAgICAgICAgICAgICAgICAgIDQ4OjNlOjQ2OjYwOjIwOjg1OjJhOmQ1OjkwOmI2OmNkOjhiOmEwOmNjOjMyOgorICAgICAgICAgICAgICAgICAgICBkZDpiNzpmZDo0MDo1NTpiMjo1MDoxYzo1NjphZTpjYzo4ZDo3Nzo0ZDpjNzoKKyAgICAgICAgICAgICAgICAgICAgMjA6NGQ6YTc6MzE6NzY6ZWY6Njg6OTI6OGE6OTA6MWU6MDg6ODE6NTY6YjI6CisgICAgICAgICAgICAgICAgICAgIGFkOjY5OmEzOjUyOmQwOmNiOjFjOmM0OjIzOjNkOjFmOjk5OmZlOjRjOmU4OgorICAgICAgICAgICAgICAgICAgICAxNjo2Mzo4ZTpjNjowODo4ZTpmNjozMTpmNjpkMjpmYTplNTo3NjpkZDpiNToKKyAgICAgICAgICAgICAgICAgICAgMWM6OTI6YTM6NDk6Y2Q6Y2Q6MDE6Y2Q6Njg6Y2Q6YTk6Njk6YmE6YTM6ZWI6CisgICAgICAgICAgICAgICAgICAgIDFkOjBkOjljOmE0OjIwOmE2OmMxOmEwOmM1OmQxOjQ2OjRjOjE3OjZkOmQyOgorICAgICAgICAgICAgICAgICAgICBhYzo2NjozZjo5Njo4YzplMDo4NDpkNDozNjpmZjoyMjo1OTpjNTpmOToxMToKKyAgICAgICAgICAgICAgICAgICAgNjA6YTg6NWY6MDQ6N2Q6ZjI6MWE6ZjY6MjU6NDI6NjE6MGY6YzQ6NGE6Yjg6CisgICAgICAgICAgICAgICAgICAgIDNlOjg5CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICAzNDoyNjoxNTozYzpjMDo4ZDo0ZDo0Mzo0OToxZDpiZDplOToyMTo5MjpkNzo2Njo5YzpiNzoKKyAgICAgICAgZGU6YzU6Yjg6ZDA6ZTQ6NWQ6NWY6NzY6MjI6YzA6MjY6Zjk6ODQ6M2E6M2E6Zjk6OGM6YjU6CisgICAgICAgIGZiOmVjOjYwOmYxOmU4OmNlOjA0OmIwOmM4OmRkOmE3OjAzOjhmOjMwOmYzOjk4OmRmOmE0OgorICAgICAgICBlNjphNDozMTpkZjpkMzoxYzowYjo0NjpkYzo3MjoyMDozZjphZTplZTowNTozYzphNDozMzoKKyAgICAgICAgM2Y6MGI6Mzk6YWM6NzA6Nzg6NzM6NGI6OTk6MmI6ZGY6MzA6YzI6NTQ6YjA6YTg6M2I6NTU6CisgICAgICAgIGExOmZlOjE2OjI4OmNkOjQyOmJkOjc0OjZlOjgwOmRiOjI3OjQ0OmE3OmNlOjQ0OjVkOmQ0OgorICAgICAgICAxYjo5MDo5ODowZDoxZTo0Mjo5NDpiMTowMDoyYzowNDpkMDo3NDphMzowMjowNToyMjo2MzoKKyAgICAgICAgNjM6Y2Q6ODM6YjU6ZmI6YzE6NmQ6NjI6NmI6Njk6NzU6ZmQ6NWQ6NzA6NDE6Yjk6ZjU6YmY6CisgICAgICAgIDdjOmRmOmJlOmMxOjMyOjczOjIyOjIxOjhiOjU4OjgxOjdiOjE1OjkxOjdhOmJhOmUzOjY0OgorICAgICAgICA0ODpiMDo3ZjpmYjozNjoyNTpkYTo5NTpkMDpmMToyNDoxNDoxNzpkZDoxODo4MDo2Yjo0NjoKKyAgICAgICAgMjM6Mzk6NTQ6ZjU6OGU6NjI6MDk6MDQ6MWQ6OTQ6OTA6YTY6OWI6ZTY6MjU6ZTI6NDI6NDU6CisgICAgICAgIGFhOmI4OjkwOmFkOmJlOjA4OjhmOmE5OjBiOjQyOjE4Ojk0OmNmOjcyOjM5OmUxOmIxOjQzOgorICAgICAgICBlMDoyODpjZjpiNzplNzo1YTo2YzoxMzo2Yjo0OTpiMzpmZjplMzoxODo3Yzo4OTo4YjozMzoKKyAgICAgICAgNWQ6YWM6MzM6ZDc6YTc6Zjk6ZGE6M2E6NTU6Yzk6NTg6MTA6Zjk6YWE6ZWY6NWE6YjY6Y2Y6CisgICAgICAgIDRiOjRiOmRmOjJhCisKK1ZlcmlzaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogMTA6RkM6NjM6NUQ6RjY6MjY6M0U6MEQ6RjM6MjU6QkU6NUY6Nzk6Q0Q6Njc6NjcKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlDUERDQ0FhVUNFSEM2NUIwUTJTazB0ampLZXdQTXVyOHdEUVlKS29aSWh2Y05BUUVDQlFBd1h6RUxNQWtHCitBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1UY3dOUVlEVlFRTEV5NURiR0Z6CitjeUF6SUZCMVlteHBZeUJRY21sdFlYSjVJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1CNFhEVGsyCitNREV5T1RBd01EQXdNRm9YRFRJNE1EZ3dNVEl6TlRrMU9Wb3dYekVMTUFrR0ExVUVCaE1DVlZNeEZ6QVZCZ05WCitCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNVGN3TlFZRFZRUUxFeTVEYkdGemN5QXpJRkIxWW14cFl5QlFjbWx0CitZWEo1SUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOCitBRENCaVFLQmdRREpYRm1lOGh1S0FSUzBFTjhFUU52alY2OXFSVUNQaEF3TDBUUFoyUkhQN2dKWUh5WDNLcWhFCitCYXJzQXg5NGY1NlR1Wm9BcWlOOTFxeUZvbU5GeDNJbnpQUk14blZ4MGpudlQwTHdkZDhLa01hT0lHK1lEL2lzCitJMTl3S1Rha3lZYm5zWm9neTFPbGhlYzl2bjJhL2lSRk05eDJGZTBQb25Ga1RHVXVnV2hGcHdJREFRQUJNQTBHCitDU3FHU0liM0RRRUJBZ1VBQTRHQkFMdE1FaXZQTENZQVR4UVQzYWI3L0FvUmhJenpLQnhua2k5OHRzWDYzL0RvCitsYndkajJ3c3FGSE1jOWlrd0ZQd1R0WW13SFlCVjRHU1hpSHgwYkgvNTlBaFdNMXBGK05FSEp3WlJEbUpYTnljCitBQTlXalFLWjdhS1FSVXprdXhDa1BmQXlBdzd4enZqb3lWR001bUtmNXAvQWZiZHluTWsyT211ZlRxai9aQTFrCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAxICgweDApCisgICAgICAgIFNlcmlhbCBOdW1iZXI6CisgICAgICAgICAgICA3MDpiYTplNDoxZDoxMDpkOToyOTozNDpiNjozODpjYTo3YjowMzpjYzpiYTpiZgorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDJXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9VVMsIE89VmVyaVNpZ24sIEluYy4sIE9VPUNsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IEphbiAyOSAwMDowMDowMCAxOTk2IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogQXVnICAxIDIzOjU5OjU5IDIwMjggR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89VmVyaVNpZ24sIEluYy4sIE9VPUNsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgxMDI0IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgxMDI0IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmM5OjVjOjU5OjllOmYyOjFiOjhhOjAxOjE0OmI0OjEwOmRmOjA0OjQwOgorICAgICAgICAgICAgICAgICAgICBkYjplMzo1NzphZjo2YTo0NTo0MDo4Zjo4NDowYzowYjpkMTozMzpkOTpkOToKKyAgICAgICAgICAgICAgICAgICAgMTE6Y2Y6ZWU6MDI6NTg6MWY6MjU6Zjc6MmE6YTg6NDQ6MDU6YWE6ZWM6MDM6CisgICAgICAgICAgICAgICAgICAgIDFmOjc4OjdmOjllOjkzOmI5OjlhOjAwOmFhOjIzOjdkOmQ2OmFjOjg1OmEyOgorICAgICAgICAgICAgICAgICAgICA2Mzo0NTpjNzo3MjoyNzpjYzpmNDo0YzpjNjo3NTo3MTpkMjozOTplZjo0ZjoKKyAgICAgICAgICAgICAgICAgICAgNDI6ZjA6NzU6ZGY6MGE6OTA6YzY6OGU6MjA6NmY6OTg6MGY6Zjg6YWM6MjM6CisgICAgICAgICAgICAgICAgICAgIDVmOjcwOjI5OjM2OmE0OmM5Ojg2OmU3OmIxOjlhOjIwOmNiOjUzOmE1Ojg1OgorICAgICAgICAgICAgICAgICAgICBlNzozZDpiZTo3ZDo5YTpmZToyNDo0NTozMzpkYzo3NjoxNTplZDowZjphMjoKKyAgICAgICAgICAgICAgICAgICAgNzE6NjQ6NGM6NjU6MmU6ODE6Njg6NDU6YTcKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQyV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgYmI6NGM6MTI6MmI6Y2Y6MmM6MjY6MDA6NGY6MTQ6MTM6ZGQ6YTY6ZmI6ZmM6MGE6MTE6ODQ6CisgICAgICAgIDhjOmYzOjI4OjFjOjY3OjkyOjJmOjdjOmI2OmM1OmZhOmRmOmYwOmU4Ojk1OmJjOjFkOjhmOgorICAgICAgICA2YzoyYzphODo1MTpjYzo3MzpkODphNDpjMDo1MzpmMDo0ZTpkNjoyNjpjMDo3NjowMTo1NzoKKyAgICAgICAgODE6OTI6NWU6MjE6ZjE6ZDE6YjE6ZmY6ZTc6ZDA6MjE6NTg6Y2Q6Njk6MTc6ZTM6NDQ6MWM6CisgICAgICAgIDljOjE5OjQ0OjM5Ojg5OjVjOmRjOjljOjAwOjBmOjU2OjhkOjAyOjk5OmVkOmEyOjkwOjQ1OgorICAgICAgICA0YzplNDpiYjoxMDphNDozZDpmMDozMjowMzowZTpmMTpjZTpmODplODpjOTo1MTo4YzplNjoKKyAgICAgICAgNjI6OWY6ZTY6OWY6YzA6N2Q6Yjc6NzI6OWM6Yzk6MzY6M2E6NmI6OWY6NGU6YTg6ZmY6NjQ6CisgICAgICAgIDBkOjY0CisKK1ZlcmlzaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IEEyOjMzOjlCOjRDOjc0Ojc4OjczOkQ0OjZDOkU3OkMxOkYzOjhEOkNCOjVDOkU5CitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJREFqQ0NBbXNDRUgzWi9nZlBxQjYzRUhsbis2ZUpOTVl3RFFZSktvWklodmNOQVFFRkJRQXdnY0V4Q3pBSgorQmdOVkJBWVRBbFZUTVJjd0ZRWURWUVFLRXc1V1pYSnBVMmxuYml3Z1NXNWpMakU4TURvR0ExVUVDeE16UTJ4aAorYzNNZ015QlFkV0pzYVdNZ1VISnBiV0Z5ZVNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlU0F0SUVjeQorTVRvd09BWURWUVFMRXpFb1l5a2dNVGs1T0NCV1pYSnBVMmxuYml3Z1NXNWpMaUF0SUVadmNpQmhkWFJvYjNKcAorZW1Wa0lIVnpaU0J2Ym14NU1SOHdIUVlEVlFRTEV4WldaWEpwVTJsbmJpQlVjblZ6ZENCT1pYUjNiM0pyTUI0WAorRFRrNE1EVXhPREF3TURBd01Gb1hEVEk0TURnd01USXpOVGsxT1Zvd2djRXhDekFKQmdOVkJBWVRBbFZUTVJjdworRlFZRFZRUUtFdzVXWlhKcFUybG5iaXdnU1c1akxqRThNRG9HQTFVRUN4TXpRMnhoYzNNZ015QlFkV0pzYVdNZworVUhKcGJXRnllU0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVTQXRJRWN5TVRvd09BWURWUVFMRXpFbworWXlrZ01UazVPQ0JXWlhKcFUybG5iaXdnU1c1akxpQXRJRVp2Y2lCaGRYUm9iM0pwZW1Wa0lIVnpaU0J2Ym14NQorTVI4d0hRWURWUVFMRXhaV1pYSnBVMmxuYmlCVWNuVnpkQ0JPWlhSM2IzSnJNSUdmTUEwR0NTcUdTSWIzRFFFQgorQVFVQUE0R05BRENCaVFLQmdRRE1YdEVSWFZ4cDBLdlR1V3BNbVI5Wm1EQ09Gb1VnUm0xSFA5U0ZJSVRoYmJQNAorcE8wTThSY1BPL21uK1NYWHdjK0VZL0o4WTgraVIvTEdXek9PWkVBRWFNR0F1V1FjUlhmSDJHNzFsU2s4VU9nMAorMTNnZnFMcHRRNUdWajBWWFhuN0YrOHFrQk92cWx6ZFVNRys3QVVjeU04M2NWNXRrYVdING14MGNpVTljWndJRAorQVFBQk1BMEdDU3FHU0liM0RRRUJCUVVBQTRHQkFGRk56YjVjeTVnWm5CV3lBVGw0TGswUFozQndtY1lRV3BTaworVTAxVWJTdXZEVjFBaTJUVDErN2VWbUdTWDZiRUhSQmhOdE1zSnp6b0tRbTVFV1IwekxWem54eElxYnhoQWU3aQorRjZZTTQwQUlPdzduNjBSektwcnhhWkx2Y1JURE9heHhwNUVKYitSeEJyTzZXVmNtZVFEMitBMmlNekFvMUtwWQorb0oyZGFaSDkKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDEgKDB4MCkKKyAgICAgICAgU2VyaWFsIE51bWJlcjoKKyAgICAgICAgICAgIDdkOmQ5OmZlOjA3OmNmOmE4OjFlOmI3OjEwOjc5OjY3OmZiOmE3Ojg5OjM0OmM2CisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9VVMsIE89VmVyaVNpZ24sIEluYy4sIE9VPUNsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMiwgT1U9KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seSwgT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yaworICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogTWF5IDE4IDAwOjAwOjAwIDE5OTggR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBBdWcgIDEgMjM6NTk6NTkgMjAyOCBHTVQKKyAgICAgICAgU3ViamVjdDogQz1VUywgTz1WZXJpU2lnbiwgSW5jLiwgT1U9Q2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyLCBPVT0oYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5LCBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpjYzo1ZTpkMToxMTo1ZDo1Yzo2OTpkMDphYjpkMzpiOTo2YTo0Yzo5OToKKyAgICAgICAgICAgICAgICAgICAgMWY6NTk6OTg6MzA6OGU6MTY6ODU6MjA6NDY6NmQ6NDc6M2Y6ZDQ6ODU6MjA6CisgICAgICAgICAgICAgICAgICAgIDg0OmUxOjZkOmIzOmY4OmE0OmVkOjBjOmYxOjE3OjBmOjNiOmY5OmE3OmY5OgorICAgICAgICAgICAgICAgICAgICAyNTpkNzpjMTpjZjo4NDo2MzpmMjo3Yzo2MzpjZjphMjo0NzpmMjpjNjo1YjoKKyAgICAgICAgICAgICAgICAgICAgMzM6OGU6NjQ6NDA6MDQ6Njg6YzE6ODA6Yjk6NjQ6MWM6NDU6Nzc6Yzc6ZDg6CisgICAgICAgICAgICAgICAgICAgIDZlOmY1Ojk1OjI5OjNjOjUwOmU4OjM0OmQ3Ojc4OjFmOmE4OmJhOjZkOjQzOgorICAgICAgICAgICAgICAgICAgICA5MTo5NTo4Zjo0NTo1Nzo1ZTo3ZTpjNTpmYjpjYTphNDowNDplYjplYTo5NzoKKyAgICAgICAgICAgICAgICAgICAgMzc6NTQ6MzA6NmY6YmI6MDE6NDc6MzI6MzM6Y2Q6ZGM6NTc6OWI6NjQ6Njk6CisgICAgICAgICAgICAgICAgICAgIDYxOmY4OjliOjFkOjFjOjg5OjRmOjVjOjY3CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA1MTo0ZDpjZDpiZTo1YzpjYjo5ODoxOTo5YzoxNTpiMjowMTozOTo3ODoyZTo0ZDowZjo2NzoKKyAgICAgICAgNzA6NzA6OTk6YzY6MTA6NWE6OTQ6YTQ6NTM6NGQ6NTQ6NmQ6MmI6YWY6MGQ6NWQ6NDA6OGI6CisgICAgICAgIDY0OmQzOmQ3OmVlOmRlOjU2OjYxOjkyOjVmOmE2OmM0OjFkOjEwOjYxOjM2OmQzOjJjOjI3OgorICAgICAgICAzYzplODoyOTowOTpiOToxMTo2NDo3NDpjYzpiNTo3Mzo5ZjoxYzo0ODphOTpiYzo2MTowMToKKyAgICAgICAgZWU6ZTI6MTc6YTY6MGM6ZTM6NDA6MDg6M2I6MGU6ZTc6ZWI6NDQ6NzM6MmE6OWE6ZjE6Njk6CisgICAgICAgIDkyOmVmOjcxOjE0OmMzOjM5OmFjOjcxOmE3OjkxOjA5OjZmOmU0OjcxOjA2OmIzOmJhOjU5OgorICAgICAgICA1NzoyNjo3OTowMDpmNjpmODowZDphMjozMzozMDoyODpkNDphYTo1ODphMDo5ZDo5ZDo2OToKKyAgICAgICAgOTE6ZmQKKworVmVyaXNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogQ0Q6Njg6QjY6QTc6Qzc6QzQ6Q0U6NzU6RTA6MUQ6NEY6NTc6NDQ6NjE6OTI6MDkKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFR2pDQ0F3SUNFUUNiZmdaSm96NWl1ZFh1a0VoeEtlOVhNQTBHQ1NxR1NJYjNEUUVCQlFVQU1JSEtNUXN3CitDUVlEVlFRR0V3SlZVekVYTUJVR0ExVUVDaE1PVm1WeWFWTnBaMjRzSUVsdVl5NHhIekFkQmdOVkJBc1RGbFpsCitjbWxUYVdkdUlGUnlkWE4wSUU1bGRIZHZjbXN4T2pBNEJnTlZCQXNUTVNoaktTQXhPVGs1SUZabGNtbFRhV2R1CitMQ0JKYm1NdUlDMGdSbTl5SUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreFJUQkRCZ05WQkFNVFBGWmxjbWxUCithV2R1SUVOc1lYTnpJRE1nVUhWaWJHbGpJRkJ5YVcxaGNua2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwCitkSGtnTFNCSE16QWVGdzA1T1RFd01ERXdNREF3TURCYUZ3MHpOakEzTVRZeU16VTVOVGxhTUlIS01Rc3dDUVlECitWUVFHRXdKVlV6RVhNQlVHQTFVRUNoTU9WbVZ5YVZOcFoyNHNJRWx1WXk0eEh6QWRCZ05WQkFzVEZsWmxjbWxUCithV2R1SUZSeWRYTjBJRTVsZEhkdmNtc3hPakE0QmdOVkJBc1RNU2hqS1NBeE9UazVJRlpsY21sVGFXZHVMQ0JKCitibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4UlRCREJnTlZCQU1UUEZabGNtbFRhV2R1CitJRU5zWVhOeklETWdVSFZpYkdsaklGQnlhVzFoY25rZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGtnCitMU0JITXpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTXU2bkZMOGVCOGFIbThiCitOM085K01scmxCSXdUL0EyUi9YUWtRcjFGOGlsWWNFV1FFMzdpbUdRNVhZZ3dSRUdmYXNzYnFiMUVVR08raTJ0CitLbUZacEdjbVRORG92RkpiY0NBRVdORjZ5YVJwdklNWFpLMEZpN3pRV002TmpQWHI4RUpKQzUyWEoyY3lidUd1CitreFVjY0x3Z1RTOFkzcEtJNkd5RlZ4RWE2WDdqSmhGVW9rV1dWWVBLTUlubzNOaWo3U3FBUDM5NVpWYytGU0JtCitDQytWazcrcVJ5K29ScGZ3RXVMK3dnb3JVZVoyNXJkR3QrSU5wc3lvdzB4WlZZbm02Rk5jSE9xZDhHSVdDNmZKCitYd3p3M3NKMnpxLzNhdkw2UWFhaU14VEo1WHBqMDU1aU45V0ZaWjRPNWxNa2RCdGVIUkpUVzhjczU0TkpPeFd1CitpbWk1VjVjQ0F3RUFBVEFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBRVJTV3dhdVNDUGMvTDhteS91UmFuMlRlCisyeUZQaHBrMGRqWlgzZEFWTDhXdGZ4VWZOMkp6UHRUblg4NFhBOXMxK2l2YnJtQUpYeDVmajI2N0N6M3FXaE1lCitER0J2dGNDMUl5SXVCd3ZMcVhUTFI3c2R3ZGVsYTh3djBrTDlTZDJuaWM5VHV0b0FXaWkvZ3QvNHVoTWRVSWFDCisvWTR3anlsR3NCNDlOZG80WWhZWVNxM210bEZzM3E5aTZ3SFFIaVQrZW84U0doSm91UHRtbVJRVVJWeXU1NjVwCitGNEVyV2pmSlhpcjB4dUtoWEZTYnBsUUF6L0R4d2NlWU1CbzdOaGJibzI3cS9hMnl3dHJ2QWtjVGlzRHhzekd0CitUeHpoVDV5dkR3eWQ5M2dOMlBRMVZvRGF0MjBYajUwZWdXVGgvc1ZGdXExcnVRcDZUazlMaE81TDhYM2RFUT09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAxICgweDApCisgICAgICAgIFNlcmlhbCBOdW1iZXI6CisgICAgICAgICAgICA5Yjo3ZTowNjo0OTphMzozZTo2MjpiOTpkNTplZTo5MDo0ODo3MToyOTplZjo1NworICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBPPVZlcmlTaWduLCBJbmMuLCBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrLCBPVT0oYykgMTk5OSBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5LCBDTj1WZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzMKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IE9jdCAgMSAwMDowMDowMCAxOTk5IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogSnVsIDE2IDIzOjU5OjU5IDIwMzYgR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89VmVyaVNpZ24sIEluYy4sIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmssIE9VPShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHksIENOPVZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMworICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDIwNDggYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDIwNDggYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6Y2I6YmE6OWM6NTI6ZmM6Nzg6MWY6MWE6MWU6NmY6MWI6Mzc6NzM6YmQ6CisgICAgICAgICAgICAgICAgICAgIGY4OmM5OjZiOjk0OjEyOjMwOjRmOmYwOjM2OjQ3OmY1OmQwOjkxOjBhOmY1OgorICAgICAgICAgICAgICAgICAgICAxNzpjODphNTo2MTpjMToxNjo0MDo0ZDpmYjo4YTo2MTo5MDplNTo3NjoyMDoKKyAgICAgICAgICAgICAgICAgICAgYzE6MTE6MDY6N2Q6YWI6MmM6NmU6YTY6ZjU6MTE6NDE6OGU6ZmE6MmQ6YWQ6CisgICAgICAgICAgICAgICAgICAgIDJhOjYxOjU5OmE0OjY3OjI2OjRjOmQwOmU4OmJjOjUyOjViOjcwOjIwOjA0OgorICAgICAgICAgICAgICAgICAgICA1ODpkMTo3YTpjOTphNDo2OTpiYzo4MzoxNzo2NDphZDowNTo4YjpiYzpkMDoKKyAgICAgICAgICAgICAgICAgICAgNTg6Y2U6OGQ6OGM6ZjU6ZWI6ZjA6NDI6NDk6MGI6OWQ6OTc6Mjc6Njc6MzI6CisgICAgICAgICAgICAgICAgICAgIDZlOmUxOmFlOjkzOjE1OjFjOjcwOmJjOjIwOjRkOjJmOjE4OmRlOjkyOjg4OgorICAgICAgICAgICAgICAgICAgICBlODo2Yzo4NTo1NzoxMToxYTplOTo3ZTplMzoyNjoxMTo1NDphMjo0NTo5NjoKKyAgICAgICAgICAgICAgICAgICAgNTU6ODM6Y2E6MzA6ODk6ZTg6ZGM6ZDg6YTM6ZWQ6MmE6ODA6M2Y6N2Y6Nzk6CisgICAgICAgICAgICAgICAgICAgIDY1OjU3OjNlOjE1OjIwOjY2OjA4OjJmOjk1OjkzOmJmOmFhOjQ3OjJmOmE4OgorICAgICAgICAgICAgICAgICAgICA0Njo5NzpmMDoxMjplMjpmZTpjMjowYToyYjo1MTplNjo3NjplNjpiNzo0NjoKKyAgICAgICAgICAgICAgICAgICAgYjc6ZTI6MGQ6YTY6Y2M6YTg6YzM6NGM6NTk6NTU6ODk6ZTY6ZTg6NTM6NWM6CisgICAgICAgICAgICAgICAgICAgIDFjOmVhOjlkOmYwOjYyOjE2OjBiOmE3OmM5OjVmOjBjOmYwOmRlOmMyOjc2OgorICAgICAgICAgICAgICAgICAgICBjZTphZjpmNzo2YTpmMjpmYTo0MTphNjphMjozMzoxNDpjOTplNTo3YTo2MzoKKyAgICAgICAgICAgICAgICAgICAgZDM6OWU6NjI6Mzc6ZDU6ODU6NjU6OWU6MGU6ZTY6NTM6MjQ6NzQ6MWI6NWU6CisgICAgICAgICAgICAgICAgICAgIDFkOjEyOjUzOjViOmM3OjJjOmU3OjgzOjQ5OjNiOjE1OmFlOjhhOjY4OmI5OgorICAgICAgICAgICAgICAgICAgICA1Nzo5NworICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgMTE6MTQ6OTY6YzE6YWI6OTI6MDg6Zjc6M2Y6MmY6Yzk6YjI6ZmU6ZTQ6NWE6OWY6NjQ6ZGU6CisgICAgICAgIGRiOjIxOjRmOjg2Ojk5OjM0Ojc2OjM2OjU3OmRkOmQwOjE1OjJmOmM1OmFkOjdmOjE1OjFmOgorICAgICAgICAzNzo2Mjo3MzozZTpkNDplNzo1ZjpjZToxNzowMzpkYjozNTpmYToyYjpkYjphZTo2MDowOToKKyAgICAgICAgNWY6MWU6NWY6OGY6NmU6YmI6MGI6M2Q6ZWE6NWE6MTM6MWU6MGM6NjA6NmY6YjU6YzA6YjU6CisgICAgICAgIDIzOjIyOjJlOjA3OjBiOmNiOmE5Ojc0OmNiOjQ3OmJiOjFkOmMxOmQ3OmE1OjZiOmNjOjJmOgorICAgICAgICBkMjo0MjpmZDo0OTpkZDphNzo4OTpjZjo1MzpiYTpkYTowMDo1YToyODpiZjo4MjpkZjpmODoKKyAgICAgICAgYmE6MTM6MWQ6NTA6ODY6ODI6ZmQ6OGU6MzA6OGY6Mjk6NDY6YjA6MWU6M2Q6MzU6ZGE6Mzg6CisgICAgICAgIDYyOjE2OjE4OjRhOmFkOmU2OmI2OjUxOjZjOmRlOmFmOjYyOmViOjAxOmQwOjFlOjI0OmZlOgorICAgICAgICA3YTo4ZjoxMjoxYToxMjo2ODpiODpmYjo2Njo5OToxNDoxNDo0NTo1YzphZTplNzphZTo2OToKKyAgICAgICAgMTc6ODE6MmI6NWE6Mzc6Yzk6NWU6MmE6ZjQ6YzY6ZTI6YTE6NWM6NTQ6OWI6YTY6NTQ6MDA6CisgICAgICAgIGNmOmYwOmYxOmMxOmM3Ojk4OjMwOjFhOjNiOjM2OjE2OmRiOmEzOjZlOmVhOmZkOmFkOmIyOgorICAgICAgICBjMjpkYTplZjowMjo0NzoxMzo4YTpjMDpmMTpiMzozMTphZDo0ZjoxYzplMTo0Zjo5YzphZjoKKyAgICAgICAgMGY6MGM6OWQ6Zjc6Nzg6MGQ6ZDg6ZjQ6MzU6NTY6ODA6ZGE6Yjc6NmQ6MTc6OGY6OWQ6MWU6CisgICAgICAgIDgxOjY0OmUxOmZlOmM1OjQ1OmJhOmFkOjZiOmI5OjBhOjdhOjRlOjRmOjRiOjg0OmVlOjRiOgorICAgICAgICBmMTo3ZDpkZDoxMQorCitWZXJpc2lnbiBDbGFzcyA0IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiAyNjo2RDoyQzoxOTo5ODpCNjo3MDo2ODozODo1MDo1NDoxOTpFQzo5MDozNDo2MAorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURBakNDQW1zQ0VES0lqcHJTOWVzVFIvaC94Q0EzSmZnd0RRWUpLb1pJaHZjTkFRRUZCUUF3Z2NFeEN6QUoKK0JnTlZCQVlUQWxWVE1SY3dGUVlEVlFRS0V3NVdaWEpwVTJsbmJpd2dTVzVqTGpFOE1Eb0dBMVVFQ3hNelEyeGgKK2MzTWdOQ0JRZFdKc2FXTWdVSEpwYldGeWVTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVNBdElFY3kKK01Ub3dPQVlEVlFRTEV6RW9ZeWtnTVRrNU9DQldaWEpwVTJsbmJpd2dTVzVqTGlBdElFWnZjaUJoZFhSb2IzSnAKK2VtVmtJSFZ6WlNCdmJteDVNUjh3SFFZRFZRUUxFeFpXWlhKcFUybG5iaUJVY25WemRDQk9aWFIzYjNKck1CNFgKK0RUazRNRFV4T0RBd01EQXdNRm9YRFRJNE1EZ3dNVEl6TlRrMU9Wb3dnY0V4Q3pBSkJnTlZCQVlUQWxWVE1SY3cKK0ZRWURWUVFLRXc1V1pYSnBVMmxuYml3Z1NXNWpMakU4TURvR0ExVUVDeE16UTJ4aGMzTWdOQ0JRZFdKc2FXTWcKK1VISnBiV0Z5ZVNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlU0F0SUVjeU1Ub3dPQVlEVlFRTEV6RW8KK1l5a2dNVGs1T0NCV1pYSnBVMmxuYml3Z1NXNWpMaUF0SUVadmNpQmhkWFJvYjNKcGVtVmtJSFZ6WlNCdmJteDUKK01SOHdIUVlEVlFRTEV4WldaWEpwVTJsbmJpQlVjblZ6ZENCT1pYUjNiM0pyTUlHZk1BMEdDU3FHU0liM0RRRUIKK0FRVUFBNEdOQURDQmlRS0JnUUM2OE9UUCtjU3VoVlM1QjFmNWo4Vi9hQkg0eEJld1JOempNSFBWS21JcXVORE0KK0hPMG9XMzY5YXR5emtTVEtRV0k4L0FJQnZ4d1dNWlFGbDNadW9xMjlZUmRzVGpDRzhGRTNLbERIcUdLQjNGdEsKK3FzR2d0RzdyTCtWWHhiRXJRSERiV2syaGpoKzlBeC9ZQTlTUFRKbHh2T0tDekZqb21EcUcwNFk0OHdBcEh3SUQKK0FRQUJNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0R0JBSVdNRXNHbnVWQVZlc3MrckxoRGl0eXEzUlM2aVlGK0FUd2oKK2NTR0lMNExjWS9vQ1JheEZXZGNxV0VSYnQ1K0JPNUpvUGVJM0pQVjdiSTkyTlpZSnFGbWR1YzRqcTNUV2cvMHkKK2N5ZllhVDVEZFBhdXhZbWE1MU44Nlh2MlMvUEJaWVBlallxY1BJaU5PVm44cWo4aWphSEJabENCY2t6dEltUlAKK1Q4cUFrYllwCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAxICgweDApCisgICAgICAgIFNlcmlhbCBOdW1iZXI6CisgICAgICAgICAgICAzMjo4ODo4ZTo5YTpkMjpmNTplYjoxMzo0NzpmODo3ZjpjNDoyMDozNzoyNTpmOAorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBPPVZlcmlTaWduLCBJbmMuLCBPVT1DbGFzcyA0IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIsIE9VPShjKSAxOTk4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHksIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IE1heSAxOCAwMDowMDowMCAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogQXVnICAxIDIzOjU5OjU5IDIwMjggR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89VmVyaVNpZ24sIEluYy4sIE9VPUNsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMiwgT1U9KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seSwgT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yaworICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6YmE6ZjA6ZTQ6Y2Y6Zjk6YzQ6YWU6ODU6NTQ6Yjk6MDc6NTc6Zjk6OGY6CisgICAgICAgICAgICAgICAgICAgIGM1OjdmOjY4OjExOmY4OmM0OjE3OmIwOjQ0OmRjOmUzOjMwOjczOmQ1OjJhOgorICAgICAgICAgICAgICAgICAgICA2MjoyYTpiODpkMDpjYzoxYzplZDoyODo1Yjo3ZTpiZDo2YTpkYzpiMzo5MToKKyAgICAgICAgICAgICAgICAgICAgMjQ6Y2E6NDE6NjI6M2M6ZmM6MDI6MDE6YmY6MWM6MTY6MzE6OTQ6MDU6OTc6CisgICAgICAgICAgICAgICAgICAgIDc2OjZlOmEyOmFkOmJkOjYxOjE3OjZjOjRlOjMwOjg2OmYwOjUxOjM3OjJhOgorICAgICAgICAgICAgICAgICAgICA1MDpjNzphODo2Mjo4MTpkYzo1Yjo0YTphYTpjMTphMDpiNDo2ZTplYjoyZjoKKyAgICAgICAgICAgICAgICAgICAgZTU6NTc6YzU6YjE6MmI6NDA6NzA6ZGI6NWE6NGQ6YTE6OGU6MWY6YmQ6MDM6CisgICAgICAgICAgICAgICAgICAgIDFmOmQ4OjAzOmQ0OjhmOjRjOjk5OjcxOmJjOmUyOjgyOmNjOjU4OmU4Ojk4OgorICAgICAgICAgICAgICAgICAgICAzYTo4NjpkMzo4NjozODpmMzowMDoyOToxZgorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgODU6OGM6MTI6YzE6YTc6Yjk6NTA6MTU6N2E6Y2I6M2U6YWM6Yjg6NDM6OGE6ZGM6YWE6ZGQ6CisgICAgICAgIDE0OmJhOjg5OjgxOjdlOjAxOjNjOjIzOjcxOjIxOjg4OjJmOjgyOmRjOjYzOmZhOjAyOjQ1OgorICAgICAgICBhYzo0NTo1OTpkNzoyYTo1ODo0NDo1YjpiNzo5Zjo4MTozYjo5Mjo2ODozZDplMjozNzoyNDoKKyAgICAgICAgZjU6N2I6NmM6OGY6NzY6MzU6OTY6MDk6YTg6NTk6OWQ6Yjk6Y2U6MjM6YWI6NzQ6ZDY6ODM6CisgICAgICAgIGZkOjMyOjczOjI3OmQ4OjY5OjNlOjQzOjc0OmY2OmFlOmM1Ojg5OjlhOmU3OjUzOjdjOmU5OgorICAgICAgICA3YjpmNjo0YjpmMzpjMTo2NTo4MzpkZTo4ZDo4YTo5YzozYzo4ODo4ZDozOTo1OTpmYzphYToKKyAgICAgICAgM2Y6MjI6OGQ6YTE6YzE6NjY6NTA6ODE6NzI6NGM6ZWQ6MjI6NjQ6NGY6NGY6Y2E6ODA6OTE6CisgICAgICAgIGI2OjI5CisKK1ZlcmlzaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IERCOkM4OkYyOjI3OjJFOkIxOkVBOjZBOjI5OjIzOjVEOkZFOjU2OjNFOjMzOkRGCitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRUdqQ0NBd0lDRVFEc29LZUxiblZxQWMvRWZNd3ZsRjdYTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUhLTVFzdworQ1FZRFZRUUdFd0pWVXpFWE1CVUdBMVVFQ2hNT1ZtVnlhVk5wWjI0c0lFbHVZeTR4SHpBZEJnTlZCQXNURmxabAorY21sVGFXZHVJRlJ5ZFhOMElFNWxkSGR2Y21zeE9qQTRCZ05WQkFzVE1TaGpLU0F4T1RrNUlGWmxjbWxUYVdkdQorTENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hSVEJEQmdOVkJBTVRQRlpsY21sVAorYVdkdUlFTnNZWE56SURRZ1VIVmliR2xqSUZCeWFXMWhjbmtnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcAorZEhrZ0xTQkhNekFlRncwNU9URXdNREV3TURBd01EQmFGdzB6TmpBM01UWXlNelU1TlRsYU1JSEtNUXN3Q1FZRAorVlFRR0V3SlZVekVYTUJVR0ExVUVDaE1PVm1WeWFWTnBaMjRzSUVsdVl5NHhIekFkQmdOVkJBc1RGbFpsY21sVAorYVdkdUlGUnlkWE4wSUU1bGRIZHZjbXN4T2pBNEJnTlZCQXNUTVNoaktTQXhPVGs1SUZabGNtbFRhV2R1TENCSgorYm1NdUlDMGdSbTl5SUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreFJUQkRCZ05WQkFNVFBGWmxjbWxUYVdkdQorSUVOc1lYTnpJRFFnVUhWaWJHbGpJRkJ5YVcxaGNua2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZworTFNCSE16Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUszTHBSRnB4bG1yOFkrMQorR1E5V3pzeTFIeURrbmlZbFMrQnpaWWxaM3RDRDVQVVB0YnV0OFh6b0lmems2QXp1ZkVVaUdYYVN0Qk8zSUZzSgorK21HdXFQS2xqWVhDS3RiZVpqYlNtd0wwcUpKZ2ZKeHB0SThrSHRDR1V2WXluRUZZSGlLOXpVVmlsUWh1MEdiZAorVTZMTThCRGNWSE9MQktGR016TmNGMEM1bmszVDg3NVZnK2l4aVk1YWZKcVdJcEE3aUNYeTBsT0lBZ3dMZVBMbQorTnhkTE1FWUg1SUJ0cHRpV0x1Z3MrQkd6T0ExbXBwdnF5U05iMjQ3aTh4T09HbGt0cWdMdzdLU0hadHpCUC9YWQordWZUc2dzYlNQWlVkNWNCUGhNblpvMFFvQm1yWFJhendhMnJ2VGwvNEVZSWVPR00wWmxEVVBwTnorakREWnEzLwora3kyWDd3TUNBd0VBQVRBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQWovb2xhMDliNUtST0oxV3JJaFZaUE1xMQorQ3RSSzI2dmRvVjlUeGFCWE9jTE9SeXUrT3NoV3Y4TFpKeEE2c1FVOHdIY3h1enJUQlh0dG1od3dqSURMazVNcQorZzZzRlVZSUNBQkZuYS9PSVlVZGZBNVBWV3czZzhkU2hNaldGc2pyYnNJS3IwY3NLdkUrTVc4VkxBRHNmS29LbQorZmphRjNINDhad0MxNUR0UzRLanJYUlg1eG0zd3JSME9oYmVwbW5NVVdsdVBRU2pBMWVndFRhUmV6YXJaN2M3YworMk5VOFFoMFh3UkpkUlRqRE9QUDhoUzZEUmtpeTF5QmZramFQNTNrUG1GNlo2UERRcEx2MVU3MHF6bG13cjI1LworYkx2U0hnQ3dJZTM0UVdLQ3VkaXl4THRHVVBNeHhZOEJxSFRyOVhnbjJ1ZjNaa1B6bm9NK0lLckROV0NSemc9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMSAoMHgwKQorICAgICAgICBTZXJpYWwgTnVtYmVyOgorICAgICAgICAgICAgZWM6YTA6YTc6OGI6NmU6NzU6NmE6MDE6Y2Y6YzQ6N2M6Y2M6MmY6OTQ6NWU6ZDcKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1VUywgTz1WZXJpU2lnbiwgSW5jLiwgT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yaywgT1U9KGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seSwgQ049VmVyaVNpZ24gQ2xhc3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBPY3QgIDEgMDA6MDA6MDAgMTk5OSBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEp1bCAxNiAyMzo1OTo1OSAyMDM2IEdNVAorICAgICAgICBTdWJqZWN0OiBDPVVTLCBPPVZlcmlTaWduLCBJbmMuLCBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrLCBPVT0oYykgMTk5OSBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5LCBDTj1WZXJpU2lnbiBDbGFzcyA0IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzMKKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgyMDQ4IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgyMDQ4IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmFkOmNiOmE1OjExOjY5OmM2OjU5OmFiOmYxOjhmOmI1OjE5OjBmOjU2OgorICAgICAgICAgICAgICAgICAgICBjZTpjYzpiNToxZjoyMDplNDo5ZToyNjoyNTo0YjplMDo3Mzo2NTo4OTo1OToKKyAgICAgICAgICAgICAgICAgICAgZGU6ZDA6ODM6ZTQ6ZjU6MGY6YjU6YmI6YWQ6ZjE6N2M6ZTg6MjE6ZmM6ZTQ6CisgICAgICAgICAgICAgICAgICAgIGU4OjBjOmVlOjdjOjQ1OjIyOjE5Ojc2OjkyOmI0OjEzOmI3OjIwOjViOjA5OgorICAgICAgICAgICAgICAgICAgICBmYTo2MTphZTphODpmMjphNTo4ZDo4NTpjMjoyYTpkNjpkZTo2NjozNjpkMjoKKyAgICAgICAgICAgICAgICAgICAgOWI6MDI6ZjQ6YTg6OTI6NjA6N2M6OWM6Njk6YjQ6OGY6MjQ6MWU6ZDA6ODY6CisgICAgICAgICAgICAgICAgICAgIDUyOmY2OjMyOjljOjQxOjU4OjFlOjIyOmJkOmNkOjQ1OjYyOjk1OjA4OjZlOgorICAgICAgICAgICAgICAgICAgICBkMDo2NjpkZDo1MzphMjpjYzpmMDoxMDpkYzo1NDo3Mzo4YjowNDphMTo0NjoKKyAgICAgICAgICAgICAgICAgICAgMzM6MzM6NWM6MTc6NDA6Yjk6OWU6NGQ6ZDM6ZjM6YmU6NTU6ODM6ZTg6YjE6CisgICAgICAgICAgICAgICAgICAgIDg5OjhlOjVhOjdjOjlhOjk2OjIyOjkwOjNiOjg4OjI1OmYyOmQyOjUzOjg4OgorICAgICAgICAgICAgICAgICAgICAwMjowYzowYjo3ODpmMjplNjozNzoxNzo0YjozMDo0NjowNzplNDo4MDo2ZDoKKyAgICAgICAgICAgICAgICAgICAgYTY6ZDg6OTY6MmU6ZTg6MmM6Zjg6MTE6YjM6Mzg6MGQ6NjY6YTY6OWI6ZWE6CisgICAgICAgICAgICAgICAgICAgIGM5OjIzOjViOmRiOjhlOmUyOmYzOjEzOjhlOjFhOjU5OjJkOmFhOjAyOmYwOgorICAgICAgICAgICAgICAgICAgICBlYzphNDo4Nzo2NjpkYzpjMTozZjpmNTpkODpiOTpmNDplYzo4MjpjNjpkMjoKKyAgICAgICAgICAgICAgICAgICAgM2Q6OTU6MWQ6ZTU6YzA6NGY6ODQ6Yzk6ZDk6YTM6NDQ6Mjg6MDY6NmE6ZDc6CisgICAgICAgICAgICAgICAgICAgIDQ1OmFjOmYwOjZiOjZhOmVmOjRlOjVmOmY4OjExOjgyOjFlOjM4OjYzOjM0OgorICAgICAgICAgICAgICAgICAgICA2Njo1MDpkNDozZTo5Mzo3MzpmYTozMDpjMzo2NjphZDpmZjo5MzoyZDo5NzoKKyAgICAgICAgICAgICAgICAgICAgZWY6MDMKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDhmOmZhOjI1OjZiOjRmOjViOmU0OmE0OjRlOjI3OjU1OmFiOjIyOjE1OjU5OjNjOmNhOmI1OgorICAgICAgICAwYTpkNDo0YTpkYjphYjpkZDphMTo1Zjo1MzpjNTphMDo1NzozOTpjMjpjZTo0NzoyYjpiZToKKyAgICAgICAgM2E6Yzg6NTY6YmY6YzI6ZDk6Mjc6MTA6M2E6YjE6MDU6M2M6YzA6Nzc6MzE6YmI6M2E6ZDM6CisgICAgICAgIDA1OjdiOjZkOjlhOjFjOjMwOjhjOjgwOmNiOjkzOjkzOjJhOjgzOmFiOjA1OjUxOjgyOjAyOgorICAgICAgICAwMDoxMTo2Nzo2YjpmMzo4ODo2MTo0Nzo1ZjowMzo5MzpkNTo1YjowZDplMDpmMTpkNDphMToKKyAgICAgICAgMzI6MzU6ODU6YjI6M2E6ZGI6YjA6ODI6YWI6ZDE6Y2I6MGE6YmM6NGY6OGM6NWI6YzU6NGI6CisgICAgICAgIDAwOjNiOjFmOjJhOjgyOmE2OjdlOjM2Ojg1OmRjOjdlOjNjOjY3OjAwOmI1OmU0OjNiOjUyOgorICAgICAgICBlMDphODplYjo1ZDoxNTpmOTpjNjo2ZDpmMDphZDoxZDowZTo4NTpiNzphOTo5YTo3MzoxNDoKKyAgICAgICAgNWE6NWI6OGY6NDE6Mjg6YzA6ZDU6ZTg6MmQ6NGQ6YTQ6NWU6Y2Q6YWE6ZDk6ZWQ6Y2U6ZGM6CisgICAgICAgIGQ4OmQ1OjNjOjQyOjFkOjE3OmMxOjEyOjVkOjQ1OjM4OmMzOjM4OmYzOmZjOjg1OjJlOjgzOgorICAgICAgICA0Njo0ODpiMjpkNzoyMDo1Zjo5MjozNjo4ZjplNzo3OTowZjo5ODo1ZTo5OTplODpmMDpkMDoKKyAgICAgICAgYTQ6YmI6ZjU6NTM6YmQ6MmE6Y2U6NTk6YjA6YWY6NmU6N2Y6NmM6YmI6ZDI6MWU6MDA6YjA6CisgICAgICAgIDIxOmVkOmY4OjQxOjYyOjgyOmI5OmQ4OmIyOmM0OmJiOjQ2OjUwOmYzOjMxOmM1OjhmOjAxOgorICAgICAgICBhODo3NDplYjpmNTo3ODoyNzpkYTplNzpmNzo2Njo0MzpmMzo5ZTo4MzozZToyMDphYTpjMzoKKyAgICAgICAgMzU6NjA6OTE6Y2UKKworVmVyaXNpZ24vUlNBIENvbW1lcmNpYWwgQ0EKKz09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IDVBOjBCOkREOjQyOjlFOkIyOkI0OjYyOjk3OjMyOjdGOjdGOjBBOkFBOjlBOjM5CitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQ0l6Q0NBWkFDQlFKQkFBQVdNQTBHQ1NxR1NJYjNEUUVCQWdVQU1Gd3hDekFKQmdOVkJBWVRBbFZUTVNBdworSGdZRFZRUUtFeGRTVTBFZ1JHRjBZU0JUWldOMWNtbDBlU3dnU1c1akxqRXJNQ2tHQTFVRUN4TWlRMjl0YldWeQorWTJsaGJDQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRBZUZ3MDVOREV4TURReE9EVTRNelJhRncwNQorT1RFeE1ETXhPRFU0TXpSYU1Gd3hDekFKQmdOVkJBWVRBbFZUTVNBd0hnWURWUVFLRXhkU1UwRWdSR0YwWVNCVAorWldOMWNtbDBlU3dnU1c1akxqRXJNQ2tHQTFVRUN4TWlRMjl0YldWeVkybGhiQ0JEWlhKMGFXWnBZMkYwYVc5dQorSUVGMWRHaHZjbWwwZVRDQm16QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmlRQXdnWVVDZmdDays0RmllODRRSjkzbworOTc1c2JzWndtZHU0MVFVRGFTaUNuSEovbGorTzdLd3BraitLRlBoQ2RyNjlYUU81a05UUXZBYXlVVE5meE1LLwordG91UG1iWmlJbURkMjk4Z2dyVEtvaTh0VU8yVU10N2dWWTNVYU9MZ1ROTE5CUll1bFdaY1lWSTRIbEdvZ3FIRQorN3lYcEN1YUxLNDR4WnRuNDJmMjlPMm5aNndJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQWdVQUEzNEFkclcyRVA0agorOS9kWllrdXdYNXpCYUx4SnU3TkpieUZIWFN1ZFZNUUFLRCtZdWZLS2c1dGdmK3RReDZzRkVDMDk3VGdDd2FWSQorMHY1bG9NQzg2cVlqRm1ac0d5U3A4K3g1TlJoUEpzampyMUJLeDZjeGE5QjhHSjFRdjZrbStpWXJScHdVcWJ0YgorTUpoQ0tMVkxVN3REQ1pKQXVxaXFXcVRHdG90WFRjVT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDEgKDB4MCkKKyAgICAgICAgU2VyaWFsIE51bWJlcjoKKyAgICAgICAgICAgIDAyOjQxOjAwOjAwOjE2CisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kMldpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1VUywgTz1SU0EgRGF0YSBTZWN1cml0eSwgSW5jLiwgT1U9Q29tbWVyY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogTm92ICA0IDE4OjU4OjM0IDE5OTQgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBOb3YgIDMgMTg6NTg6MzQgMTk5OSBHTVQKKyAgICAgICAgU3ViamVjdDogQz1VUywgTz1SU0EgRGF0YSBTZWN1cml0eSwgSW5jLiwgT1U9Q29tbWVyY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMDAgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMDAgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6YTQ6ZmI6ODE6NjI6N2I6Y2U6MTA6Mjc6ZGQ6ZTg6Zjc6YmU6NmM6NmU6CisgICAgICAgICAgICAgICAgICAgIGM2OjcwOjk5OmRiOmI4OmQ1OjA1OjAzOjY5OjI4OjgyOjljOjcyOjdmOjk2OgorICAgICAgICAgICAgICAgICAgICAzZjo4ZTplYzphYzoyOTo5MjozZjo4YToxNDpmODo0Mjo3NjpiZTpiZDo1ZDoKKyAgICAgICAgICAgICAgICAgICAgMDM6Yjk6OTA6ZDQ6ZDA6YmM6MDY6YjI6NTE6MzM6NWY6YzQ6YzI6YmY6YjY6CisgICAgICAgICAgICAgICAgICAgIDhiOjhmOjk5OmI2OjYyOjIyOjYwOmRkOmRiOmRmOjIwOjgyOmI0OmNhOmEyOgorICAgICAgICAgICAgICAgICAgICAyZjoyZDo1MDplZDo5NDozMjpkZTplMDo1NTo4ZDpkNDo2ODplMjplMDo0YzoKKyAgICAgICAgICAgICAgICAgICAgZDI6Y2Q6MDU6MTY6MmU6OTU6NjY6NWM6NjE6NTI6Mzg6MWU6NTE6YTg6ODI6CisgICAgICAgICAgICAgICAgICAgIGExOmM0OmVmOjI1OmU5OjBhOmU2OjhiOjJiOjhlOjMxOjY2OmQ5OmY4OmQ5OgorICAgICAgICAgICAgICAgICAgICBmZDpiZDozYjo2OTpkOTplYgorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDJXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA3NjpiNTpiNjoxMDpmZToyMzpmNzpmNzo1OTo2Mjo0YjpiMDo1Zjo5YzpjMTo2ODpiYzo0OToKKyAgICAgICAgYmI6YjM6NDk6NmY6MjE6NDc6NWQ6MmI6OWQ6NTQ6YzQ6MDA6Mjg6M2Y6OTg6Yjk6ZjI6OGE6CisgICAgICAgIDgzOjliOjYwOjdmOmViOjUwOmM3OmFiOjA1OjEwOjJkOjNkOmVkOjM4OjAyOmMxOmE1OjQ4OgorICAgICAgICBkMjpmZTo2NTphMDpjMDpiYzplYTphNjoyMzoxNjo2Njo2YzoxYjoyNDphOTpmMzplYzo3OToKKyAgICAgICAgMzU6MTg6NGY6MjY6Yzg6ZTM6YWY6NTA6NGE6Yzc6YTc6MzE6NmI6ZDA6N2M6MTg6OWQ6NTA6CisgICAgICAgIGJmOmE5OjI2OmZhOjI2OjJiOjQ2OjljOjE0OmE5OmJiOjViOjMwOjk4OjQyOjI4OmI1OjRiOgorICAgICAgICA1MzpiYjo0MzowOTo5Mjo0MDpiYTphODphYTo1YTphNDpjNjpiNjo4Yjo1Nzo0ZDpjNQorCitWZXJpc2lnbi9SU0EgU2VjdXJlIFNlcnZlciBDQQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogNzQ6N0I6ODI6MDM6NDM6RjA6MDA6OUU6NkI6QjM6RUM6NDc6QkY6ODU6QTU6OTMKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlDTkRDQ0FhRUNFQUt0Wm41T1JmNWVWMjg4bUJsZTNjQXdEUVlKS29aSWh2Y05BUUVDQlFBd1h6RUxNQWtHCitBMVVFQmhNQ1ZWTXhJREFlQmdOVkJBb1RGMUpUUVNCRVlYUmhJRk5sWTNWeWFYUjVMQ0JKYm1NdU1TNHdMQVlECitWUVFMRXlWVFpXTjFjbVVnVTJWeWRtVnlJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1CNFhEVGswCitNVEV3T1RBd01EQXdNRm9YRFRFd01ERXdOekl6TlRrMU9Wb3dYekVMTUFrR0ExVUVCaE1DVlZNeElEQWVCZ05WCitCQW9URjFKVFFTQkVZWFJoSUZObFkzVnlhWFI1TENCSmJtTXVNUzR3TEFZRFZRUUxFeVZUWldOMWNtVWdVMlZ5CitkbVZ5SUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNSUdiTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdKCitBRENCaFFKK0FKTE9lc0d1Z3o1YXFvbURWNndsQVhZTXJhNk9MRGZPNnpWNFpGUUQ1WVJBVWNtL2p3amlpb0lJCiswaGFHTjFYcHNTRUNyWFpvZ1pvRm9rdkpTeVZtSWxac2lBZVA5NEZaYllRSFpYQVRjWFkrbTNkTTQxQ0pWcGhJCit1UjJuS1JvVExrb1JXWndlRmRWSlZDeHpPbW1Dc1pjNW5HMXdaMGpsM1MzV3lCNTdBZ01CQUFFd0RRWUpLb1pJCitodmNOQVFFQ0JRQURmZ0JsM1g3aHN1eXc0anJnN0hGR21oa1J1TlBIb0xRRFFDWUNQZ21jNFJLejBWcjJONlczCitZUU8yV3hacE84WkVDQXlJVXd4cmwwbkhQalhjYkxtN3F0OWN1em92azJDMnFVdE44aUQzelY5L1pIdU8zQUJjCisxL3AzeWprV1dXOE82dE8xZzM5TlRVSldkclRKWHdUNE9QanIwbDkxWDgxNy9PV09nSHo4VUE9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMSAoMHgwKQorICAgICAgICBTZXJpYWwgTnVtYmVyOgorICAgICAgICAgICAgMDI6YWQ6NjY6N2U6NGU6NDU6ZmU6NWU6NTc6NmY6M2M6OTg6MTk6NWU6ZGQ6YzAKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQyV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBPPVJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuLCBPVT1TZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBOb3YgIDkgMDA6MDA6MDAgMTk5NCBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEphbiAgNyAyMzo1OTo1OSAyMDEwIEdNVAorICAgICAgICBTdWJqZWN0OiBDPVVTLCBPPVJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuLCBPVT1TZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAwMCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAwMCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDo5MjpjZTo3YTpjMTphZTo4MzozZTo1YTphYTo4OTo4Mzo1NzphYzoyNToKKyAgICAgICAgICAgICAgICAgICAgMDE6NzY6MGM6YWQ6YWU6OGU6MmM6Mzc6Y2U6ZWI6MzU6Nzg6NjQ6NTQ6MDM6CisgICAgICAgICAgICAgICAgICAgIGU1Ojg0OjQwOjUxOmM5OmJmOjhmOjA4OmUyOjhhOjgyOjA4OmQyOjE2Ojg2OgorICAgICAgICAgICAgICAgICAgICAzNzo1NTplOTpiMToyMTowMjphZDo3Njo2ODo4MTo5YTowNTphMjo0YjpjOToKKyAgICAgICAgICAgICAgICAgICAgNGI6MjU6NjY6MjI6NTY6NmM6ODg6MDc6OGY6Zjc6ODE6NTk6NmQ6ODQ6MDc6CisgICAgICAgICAgICAgICAgICAgIDY1OjcwOjEzOjcxOjc2OjNlOjliOjc3OjRjOmUzOjUwOjg5OjU2Ojk4OjQ4OgorICAgICAgICAgICAgICAgICAgICBiOToxZDphNzoyOToxYToxMzoyZTo0YToxMTo1OTo5YzoxZToxNTpkNTo0OToKKyAgICAgICAgICAgICAgICAgICAgNTQ6MmM6NzM6M2E6Njk6ODI6YjE6OTc6Mzk6OWM6NmQ6NzA6Njc6NDg6ZTU6CisgICAgICAgICAgICAgICAgICAgIGRkOjJkOmQ2OmM4OjFlOjdiCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kMldpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDY1OmRkOjdlOmUxOmIyOmVjOmIwOmUyOjNhOmUwOmVjOjcxOjQ2OjlhOjE5OjExOmI4OmQzOgorICAgICAgICBjNzphMDpiNDowMzo0MDoyNjowMjozZTowOTo5YzplMToxMjpiMzpkMTo1YTpmNjozNzphNToKKyAgICAgICAgYjc6NjE6MDM6YjY6NWI6MTY6Njk6M2I6YzY6NDQ6MDg6MGM6ODg6NTM6MGM6NmI6OTc6NDk6CisgICAgICAgIGM3OjNlOjM1OmRjOjZjOmI5OmJiOmFhOmRmOjVjOmJiOjNhOjJmOjkzOjYwOmI2OmE5OjRiOgorICAgICAgICA0ZDpmMjoyMDpmNzpjZDo1Zjo3Zjo2NDo3Yjo4ZTpkYzowMDo1YzpkNzpmYTo3NzpjYTozOToKKyAgICAgICAgMTY6NTk6NmY6MGU6ZWE6ZDM6YjU6ODM6N2Y6NGQ6NGQ6NDI6NTY6NzY6YjQ6Yzk6NWY6MDQ6CisgICAgICAgIGY4OjM4OmY4OmViOmQyOjVmOjc1OjVmOmNkOjdiOmZjOmU1OjhlOjgwOjdjOmZjOjUwCmRpZmYgLS1naXQgYS9zYW1wbGVzL3NzbC9jZXJ0LnNoIGIvc2FtcGxlcy9zc2wvY2VydC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNjZlZmYwCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9zc2wvY2VydC5zaApAQCAtMCwwICsxLDMwIEBACisjIS9iaW4vY3NoCisKK2lmICgkIykgdGhlbgorCisgIGVjaG8gIiogQ3JlYXRlIGNlcnRpZmljYXRlICR7MX0ucGVtIHNpZ25lZCBieSB0aGUgcm9vdCBDQSIKKyAgZWNobyAiKiBTdG9yZSB0aGUgJHsxfS5wZW0ga2V5IGZpbGUgbG9jYWxseSB3aXRoIHlvdXIgY2xpZW50L3NlcnZlciBhcHBsaWNhdGlvbiIKKyAgZWNobyAiKiBFbnRlciBhIHNlY3JldCBwYXNzIHBocmFzZSB3aGVuIHJlcXVlc3RlZCIKKyAgZWNobyAiKiBUaGUgcGFzcyBwaHJhc2UgaXMgdXNlZCB0byBhY2Nlc3MgJHsxfS5wZW0gaW4geW91ciBhcHBsaWNhdGlvbiIKKyAgZWNobyAiKiBFbnRlciB0aGUgYXBwbGljYXRpb24ncyBob3N0IG5hbWUgYXMgdGhlIENvbW1vbiBOYW1lIHdoZW4gcmVxdWVzdGVkIgorICBlY2hvICIqIEVudGVyIHRoZSByb290IENBIHBhc3MgcGhyYXNlIChHZXR0aW5nIENBIFByaXZhdGUgS2V5KSB0byBzaWduIHRoZSBrZXkgZmlsZSIKKyAgZWNobyAiKiBUaGUga2V5IGZpbGUgd2lsbCBleHBpcmUgYWZ0ZXIgb25lIHllYXIgb3Igc29vbmVyIHdoZW4gdGhlIHJvb3QgQ0EgZXhwaXJlcyIKKworICAjIENyZWF0ZSBhIGNlcnRpZmljYXRlIGFuZCBzaWduaW5nIHJlcXVlc3QKKworICBvcGVuc3NsIHJlcSAtbmV3a2V5IHJzYToxMDI0IC1zaGExIC1rZXlvdXQgJHsxfWtleS5wZW0gLW91dCAkezF9cmVxLnBlbQorCisgICMgU2lnbiB0aGUgY2VydGlmaWNhdGUgd2l0aCB0aGUgcm9vdCBDQQorCisgIG9wZW5zc2wgeDUwOSAtcmVxIC1pbiAkezF9cmVxLnBlbSAtc2hhMSAtZXh0ZmlsZSBvcGVuc3NsLmNuZiAtZXh0ZW5zaW9ucyB1c3JfY2VydCAtQ0Egcm9vdC5wZW0gLUNBa2V5IHJvb3QucGVtIC1DQWNyZWF0ZXNlcmlhbCAtb3V0ICR7MX1jZXJ0LnBlbSAtZGF5cyAzNjUKKworICBjYXQgJHsxfWNlcnQucGVtICR7MX1rZXkucGVtIGNhY2VydC5wZW0gPiAkezF9LnBlbQorCisgIG9wZW5zc2wgeDUwOSAtc3ViamVjdCAtaXNzdWVyIC1kYXRlcyAtbm9vdXQgLWluICR7MX0ucGVtCisKK2Vsc2UKKworICBlY2hvICJVc2FnZTogY2VydC5zaCA8Y2VydG5hbWU+IgorICBleGl0ICgxKQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9zc2wvY2xpZW50LnBlbSBiL3NhbXBsZXMvc3NsL2NsaWVudC5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE4ODJhMQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvc3NsL2NsaWVudC5wZW0KQEAgLTAsMCArMSw2MSBAQAorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEc1RDQ0F4cWdBd0lCQWdJQkJ6QU5CZ2txaGtpRzl3MEJBUVVGQURDQmp6RUxNQWtHQTFVRUJoTUNWVk14CitDekFKQmdOVkJBZ1RBa1pNTVJRd0VnWURWUVFIRXd0VVlXeHNZV2hoYzNObFpURVdNQlFHQTFVRUNoTU5SMlZ1CithWFpwWVN3Z1NXNWpMakVMTUFrR0ExVUVDeE1DU1ZReEZEQVNCZ05WQkFNVEMyZGxibWwyYVdFdVkyOXRNU0l3CitJQVlKS29aSWh2Y05BUWtCRmhOamIyNTBZV04wUUdkbGJtbDJhV0V1WTI5dE1CNFhEVEExTVRJeU5ERTVNekUxCitNMW9YRFRBNE1USXlNekU1TXpFMU0xb3dnWTB4Q3pBSkJnTlZCQVlUQWxWVE1Rc3dDUVlEVlFRSUV3SkdUREVVCitNQklHQTFVRUJ4TUxWR0ZzYkdGb1lYTnpaV1V4RmpBVUJnTlZCQW9URFVkbGJtbDJhV0VzSUVsdVl5NHhDekFKCitCZ05WQkFzVEFrbFVNUkl3RUFZRFZRUURFd2xzYjJOaGJHaHZjM1F4SWpBZ0Jna3Foa2lHOXcwQkNRRVdFMk52CitiblJoWTNSQVoyVnVhWFpwWVM1amIyMHdnWjh3RFFZSktvWklodmNOQVFFQkJRQURnWTBBTUlHSkFvR0JBS0t4CitCT0lqSUQrK0s2Z25pbkZoYkJJS1pNQzZCdVFUa2dPclE5QndGVHBrbkduK3RqU3I0T0pka2R5dk9UTkNLb1VXCis1QnczdHJMdUVGSkRTQUZRYU5hbVZMTWl1b1Y0RlZvRVNnUHJDSThVb1pCUDNLVEZYbEhMYnZrSjhBTGs4b25qCitBT2RCdGVISmQ0RnZHK0RLL3p1dUh0bUVSSGppTDNrZllBd21KZThUQWdNQkFBR2pnZ0ViTUlJQkZ6QUpCZ05WCitIUk1FQWpBQU1Dd0dDV0NHU0FHRytFSUJEUVFmRmgxUGNHVnVVMU5NSUVkbGJtVnlZWFJsWkNCRFpYSjBhV1pwCitZMkYwWlRBZEJnTlZIUTRFRmdRVXFKN3BYMWFmeUZQNEpxUmkrMVgyVjhCOEtDb3dnYndHQTFVZEl3U0J0RENCCitzWUFVNE15SWkwR2dJVXFrWVJobkoyR2d5VW1WZDhxaGdaV2tnWkl3Z1k4eEN6QUpCZ05WQkFZVEFsVlRNUXN3CitDUVlEVlFRSUV3SkdUREVVTUJJR0ExVUVCeE1MVkdGc2JHRm9ZWE56WldVeEZqQVVCZ05WQkFvVERVZGxibWwyCithV0VzSUVsdVl5NHhDekFKQmdOVkJBc1RBa2xVTVJRd0VnWURWUVFERXd0blpXNXBkbWxoTG1OdmJURWlNQ0FHCitDU3FHU0liM0RRRUpBUllUWTI5dWRHRmpkRUJuWlc1cGRtbGhMbU52YllJQkFEQU5CZ2txaGtpRzl3MEJBUVVGCitBQU9CZ1FCZnNDYVFiK0FMZmpXR3JIMGhLRXNmbDZBdVhrdEh6U3YvTjVEMFVURTdQVHgzT0F2VGVYTE5UZlh4CitDZmtUMG5mVnRZT0syUlppeWxpUnFDTGtwSkYxNTluYm5nTURPMUd3WHB1S25FdjZmY05BZzBQRTlKYmZlNEdPCituMVJJWUpKK2gxdVV0NzFYS0Zzd3pnNG53bUI4bGt1Wjlpa2VEQTduRHphZ2JxRVhwZz09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCistLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tCitQcm9jLVR5cGU6IDQsRU5DUllQVEVECitERUstSW5mbzogREVTLUVERTMtQ0JDLEEyQUVFQkNBQjFCQUI4QTcKKworcWkyWDdWYVpFWlpWNVlkQklDVEV3VjBSdDZuNktPUU1aUmRBckxHTnh1dWZMVFBuMHJ6NkpjdVIrb2Y5cnhJegora1RLLzZTR3NVWm5NSDVvNGx1YWJlRU9lN0R0Y0F1dURUMDBsQlJYY1R4SVJ2QXlpd3RSRE1rVFV1R2JORU1EcworLzZGV3oxdFdFRGJzWXJZdHowZjdTbHk2aGs2a2hQVmppRXRVbUt6bkdpWDMxTEJaUUZKMDkwTVRPcm9EbUFZRgorWE1ORkF2ZVhpTEQ3OEhWNyt3TmhCaFllVndta1BGV0t1M2pwRVowOSttRGRtUTB5T0kyWjJlamlpT2JpbHFjbworbnZwN3R0OGd6UWF5QjQ4Qk9NeU1NZnAxNlUrTVB0V3NmSFQvWmdnQXZ0OTlzK3d1YXNhYXpQYkZVTXV1bWhRdQorT2xvNXlXQlRVRXFodVl6WXpsUlJZYmIzbUF1MUFWSjY0WDBrTy9YdDEvRTQ2RitmbElJNWFGTVFTcTJhaWh0SgordXMyUENYWjJSTWxXeWxNZ2RjemNyRXd6a2FTektsQlNYL01XNGNzTkVjb0ZwTlhvZWtZSG16RFVIUWh2UGloUAorM2FrbVMxZFovY1k1aFMxSWNJYitZWDZLUE12aEdQcjJVSG5vaFFGUzFYNms5aWJIbGk4cDB3QmdNQTUrYzRpNworZGl2MkhUSUZ2WENtMHNrYlpPNTM0VjExQ3RpeDc1ejBabUl3Y2JuKytZdG4yS1NXeXowTjdETmxHMnFhWEtzZAorVlZESG9rRFNQU2lyd2tBdWJwUUhMaGxPTWJ5MDRwUEJWRWQvRFpLdmVPdDBzdFdEcm94a1VjR3ZiNUFML2NEQgorMlAvaDYwSkFlREdRWXYwWjhlT2tBMVpWWHlybXBQUVBBY2RoRm5hMHdNYitKYm1Ncm5EcnRFRUt4WDFMZWZ6QgorbTZJTm1FajVGdnZZTThKRk12TUFzZHI4c2RrTHBmRGxmUVM0OFF1TFhYRFB5U0FiVzZJaVpsZWl1STNoa1g1ZgorUkhFZUVDODVXWlZvbGw5LytrbkJXNmxudWZob0ZVVjdTVDdYTm5TMVBlSGdaelJCaVBKR013PT0KKy0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURoakNDQXUrZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRVUZBRENCanpFTE1Ba0dBMVVFQmhNQ1ZWTXgKK0N6QUpCZ05WQkFnVEFrWk1NUlF3RWdZRFZRUUhFd3RVWVd4c1lXaGhjM05sWlRFV01CUUdBMVVFQ2hNTlIyVnUKK2FYWnBZU3dnU1c1akxqRUxNQWtHQTFVRUN4TUNTVlF4RkRBU0JnTlZCQU1UQzJkbGJtbDJhV0V1WTI5dE1TSXcKK0lBWUpLb1pJaHZjTkFRa0JGaE5qYjI1MFlXTjBRR2RsYm1sMmFXRXVZMjl0TUI0WERUQTBNVEF3TWpFM01EZ3cKK05sb1hEVEEzTVRBd01qRTNNRGd3Tmxvd2dZOHhDekFKQmdOVkJBWVRBbFZUTVFzd0NRWURWUVFJRXdKR1RERVUKK01CSUdBMVVFQnhNTFZHRnNiR0ZvWVhOelpXVXhGakFVQmdOVkJBb1REVWRsYm1sMmFXRXNJRWx1WXk0eEN6QUoKK0JnTlZCQXNUQWtsVU1SUXdFZ1lEVlFRREV3dG5aVzVwZG1saExtTnZiVEVpTUNBR0NTcUdTSWIzRFFFSkFSWVQKK1kyOXVkR0ZqZEVCblpXNXBkbWxoTG1OdmJUQ0JuekFOQmdrcWhraUc5dzBCQVFFRkFBT0JqUUF3Z1lrQ2dZRUEKK2w2SzliTE1jcko2QnorOGh4eW9sU0p5NVRkWktvOE9tbXNrUCtOQUpjdDdhR1dhMzN1MmxrWitHa29VbUxLWi8KK3JETnBnbVlWTlFsT1FDNHJ0NW9EdDRBVW9qNTg0RzhQSktTUHd5bUpjWDBzYmZCN2s4eFJtTE8rdlZnU1V2RHUKK2FzTE1XSjZQc1lJdUdocDRCd09BZ25ZQUNUenNkNmtTZUlzZWQ4WFN4N2NDQXdFQUFhT0I3ekNCN0RBZEJnTlYKK0hRNEVGZ1FVNE15SWkwR2dJVXFrWVJobkoyR2d5VW1WZDhvd2did0dBMVVkSXdTQnREQ0JzWUFVNE15SWkwR2cKK0lVcWtZUmhuSjJHZ3lVbVZkOHFoZ1pXa2daSXdnWTh4Q3pBSkJnTlZCQVlUQWxWVE1Rc3dDUVlEVlFRSUV3SkcKK1RERVVNQklHQTFVRUJ4TUxWR0ZzYkdGb1lYTnpaV1V4RmpBVUJnTlZCQW9URFVkbGJtbDJhV0VzSUVsdVl5NHgKK0N6QUpCZ05WQkFzVEFrbFVNUlF3RWdZRFZRUURFd3RuWlc1cGRtbGhMbU52YlRFaU1DQUdDU3FHU0liM0RRRUoKK0FSWVRZMjl1ZEdGamRFQm5aVzVwZG1saExtTnZiWUlCQURBTUJnTlZIUk1FQlRBREFRSC9NQTBHQ1NxR1NJYjMKK0RRRUJCUVVBQTRHQkFGbWI5a1YrRUR4NU80ajdkTE11OTA5bkZnbkJMMDZzZXBqcXRCSUliWlkzR25DZ2VmeEsKK3AxUzZJZjAxL21kVjc5blpHSmxkZWdNNzd0ejRWSWx6dUlheisyTk8rR3FicjZFck9SKzNVR09yUnVIMzlhTVQKKzFEdndIWXBVNUdVK2xHMWFXSGRRcDh1WjV5NG9rTWczWjlJWjVuaWprVW5wQ0hRTytxLzhGck1MCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS9zYW1wbGVzL3NzbC9kaDUxMi5wZW0gYi9zYW1wbGVzL3NzbC9kaDUxMi5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE3MDg4MAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvc3NsL2RoNTEyLnBlbQpAQCAtMCwwICsxLDQgQEAKKy0tLS0tQkVHSU4gREggUEFSQU1FVEVSUy0tLS0tCitNRVlDUVFEWWJoR05WVjZHb3hPUHNYK3JCTkdtZ2ZKcWg3K2UxUEZqOElrZXRMcVd0QTJna1hBQjlQS3hya0RRCitqdnVFb1hFNEE2UFZQZnN0bVAvRWY0dU5mQ3FMQWdFQworLS0tLS1FTkQgREggUEFSQU1FVEVSUy0tLS0tCmRpZmYgLS1naXQgYS9zYW1wbGVzL3NzbC9yb290LnNoIGIvc2FtcGxlcy9zc2wvcm9vdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNTFjODVlCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9zc2wvcm9vdC5zaApAQCAtMCwwICsxLDE3IEBACisjIENyZWF0ZSB0aGUgc2VsZi1zaWduZWQgcm9vdCBDQSBhbmQgcm9vdCdzIGNlcnRpZmljYXRlOiByb290LnBlbSBjYWNlcnQucGVtCisKK2VjaG8gIiogQ3JlYXRlIHRoZSBzZWxmLXNpZ25lZCByb290IENBIGFuZCByb290J3MgY2VydGlmaWNhdGU6IHJvb3QucGVtIGNhY2VydC5wZW0iCitlY2hvICIqIERpc3RyaWJ1dGUgdGhlIGNhY2VydC5wZW0gdG8gY2xpZW50cyB0byBhdXRoZW50aWNhdGUgeW91ciBzZXJ2ZXIiCitlY2hvICIqIEVudGVyIGEgKG5ldykgc2VjcmV0IHBhc3MgcGhyYXNlIHdoZW4gcmVxdWVzdGVkIgorZWNobyAiKiBFbnRlciBpdCBhZ2FpbiB3aGVuIHByb21wdGVkIgorZWNobyAiKiBZb3UgbmVlZCB0aGUgcGFzcyBwaHJhc2UgbGF0ZXIgdG8gc2lnbiB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIga2V5IGZpbGVzIgorZWNobyAiKiBFbnRlciB5b3VyIGNvbXBhbnkgbmFtZSBhcyB0aGUgQ29tbW9uIE5hbWUgKGUuZy4gZ2VuaXZpYS5jb20pIHdoZW4gcmVxdWVzdGVkIgorZWNobyAiKiBUaGUgcm9vdCBDQSB3aWxsIGV4cGlyZSBhZnRlciB0aHJlZSB5ZWFycyAoMTA5NSBkYXlzKSIKKworb3BlbnNzbCByZXEgLW5ld2tleSByc2E6MTAyNCAtc2hhMSAta2V5b3V0IHJvb3RrZXkucGVtIC1vdXQgcm9vdHJlcS5wZW0KKworb3BlbnNzbCB4NTA5IC1yZXEgLWluIHJvb3RyZXEucGVtIC1zaGExIC1leHRmaWxlIG9wZW5zc2wuY25mIC1leHRlbnNpb25zIHYzX2NhIC1zaWdua2V5IHJvb3RrZXkucGVtIC1vdXQgY2FjZXJ0LnBlbSAtZGF5cyAxMDk1CisKK2NhdCBjYWNlcnQucGVtIHJvb3RrZXkucGVtID4gcm9vdC5wZW0KKworb3BlbnNzbCB4NTA5IC1zdWJqZWN0IC1pc3N1ZXIgLWRhdGVzIC1ub291dCAtaW4gcm9vdC5wZW0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvc3NsL3NlcnZlci5wZW0gYi9zYW1wbGVzL3NzbC9zZXJ2ZXIucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZWYwMGYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3NzbC9zZXJ2ZXIucGVtCkBAIC0wLDAgKzEsNjEgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRHNUQ0NBeHFnQXdJQkFnSUJDREFOQmdrcWhraUc5dzBCQVFVRkFEQ0JqekVMTUFrR0ExVUVCaE1DVlZNeAorQ3pBSkJnTlZCQWdUQWtaTU1SUXdFZ1lEVlFRSEV3dFVZV3hzWVdoaGMzTmxaVEVXTUJRR0ExVUVDaE1OUjJWdQorYVhacFlTd2dTVzVqTGpFTE1Ba0dBMVVFQ3hNQ1NWUXhGREFTQmdOVkJBTVRDMmRsYm1sMmFXRXVZMjl0TVNJdworSUFZSktvWklodmNOQVFrQkZoTmpiMjUwWVdOMFFHZGxibWwyYVdFdVkyOXRNQjRYRFRBMU1USXlOREU1TXpNeAorTTFvWERUQTRNVEl5TXpFNU16TXhNMW93Z1kweEN6QUpCZ05WQkFZVEFsVlRNUXN3Q1FZRFZRUUlFd0pHVERFVQorTUJJR0ExVUVCeE1MVkdGc2JHRm9ZWE56WldVeEZqQVVCZ05WQkFvVERVZGxibWwyYVdFc0lFbHVZeTR4Q3pBSgorQmdOVkJBc1RBa2xVTVJJd0VBWURWUVFERXdsc2IyTmhiR2h2YzNReElqQWdCZ2txaGtpRzl3MEJDUUVXRTJOdgorYm5SaFkzUkFaMlZ1YVhacFlTNWpiMjB3Z1o4d0RRWUpLb1pJaHZjTkFRRUJCUUFEZ1kwQU1JR0pBb0dCQU01UgorU2hBdTBmM0YyNjdiK1hodTRIbDNQZTV6VGlVbGtLOTUrdjdGZzZERTVxWDFPNERDV0NyZ3ZhVlU3amd5SnA1NworVU0zbjRZdkVSSHkydndscE9saWVvOTFWTVZHbjROQ0QvaHYxKzJLR3RGVGlKMmJjTkxiTXhlUDZWOXpBRmJtbQorVUFuUk1lbVVyNFJQUkVLMDNJS0lGMWc1K1VBZ3dCbWozcC9Kd1piM0FnTUJBQUdqZ2dFYk1JSUJGekFKQmdOVgorSFJNRUFqQUFNQ3dHQ1dDR1NBR0crRUlCRFFRZkZoMVBjR1Z1VTFOTUlFZGxibVZ5WVhSbFpDQkRaWEowYVdacAorWTJGMFpUQWRCZ05WSFE0RUZnUVVQY0hJdFJrWHc0d1NaRHdGd3lMdWU3b250TUV3Z2J3R0ExVWRJd1NCdERDQgorc1lBVTRNeUlpMEdnSVVxa1lSaG5KMkdneVVtVmQ4cWhnWldrZ1pJd2dZOHhDekFKQmdOVkJBWVRBbFZUTVFzdworQ1FZRFZRUUlFd0pHVERFVU1CSUdBMVVFQnhNTFZHRnNiR0ZvWVhOelpXVXhGakFVQmdOVkJBb1REVWRsYm1sMgorYVdFc0lFbHVZeTR4Q3pBSkJnTlZCQXNUQWtsVU1SUXdFZ1lEVlFRREV3dG5aVzVwZG1saExtTnZiVEVpTUNBRworQ1NxR1NJYjNEUUVKQVJZVFkyOXVkR0ZqZEVCblpXNXBkbWxoTG1OdmJZSUJBREFOQmdrcWhraUc5dzBCQVFVRgorQUFPQmdRQnUwQTdzaGVxcGNXQmR5eE02RE1MR29aSVZGQ3E3aGlvZGFMRkxRY0FMK3pYSEQyNVJtYk1sbFU5WQorR0QxejhnWVlZMEFocDBRZHEwYmIzV3dnZlNNakNJU1N6Z1NURUxQTGhHZjlQMU9CVVNWZzd0RUNpUVpZNXVDMAord2lEWTZJU0tUbzFaWW1jelRKVzlvL2RvZGw2NjJZUS9nTWdlU1RwWjBMUjBuaTNOOWc9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorUHJvYy1UeXBlOiA0LEVOQ1JZUFRFRAorREVLLUluZm86IERFUy1FREUzLUNCQyxGMTIwQUYzQUU4QjJBMUY5CisKKzNOeFZNMit2cU1oODhTYkVqUlhXUjFhbndYRTYweDRWWEIwU0VrTm16djNiT1NZR3BlSVk3c0ViNG05M0xMamoKK21rdk1CT1NKWVd6dVV4V0hlUGNkSUtva0RSa0N3RGptNlVSOUhzZjgyRTBJTUJpd1BzcHluUDM5NkRaYVhFRFkKK29rcWxHQm1GWDV6NkZ1akc5Z05sNThabTA5RlJsOHptcmlKdG9TdTRlc2FzUmFlei9LYWtsdWdyTWlNSHdWVloKK1BXTDRmWnhtb3hmL2dSV2p3WUcvdVlmbk1yWDJZdElack96V241YkorRUZ6cy84SWZrTWhSNWVtUENENjdvTW4KK1ExRjZBWmdtQzlKMlFRMEIrZXZtVWJKSkxHa00wS0lUcDNyNmtmeHd1cEZZZ2lxM1B4eWo2VDRoYkdYaGwzVHMKK3kyazJCRmxSN081aWpKT1NCYzZWdktoODRLZ1BNZVJHQzA0cDM1ZHpDT3Y5anZCVkpYbWo4dmIzSS9VeDFHalkKK3RxbWlTZWtjc2pYbkZ6alEzVnozOWU5SXgwRXVIbWQ2SUJaS0VCRVZpeHk2bDlZSyt0azZYZC8yb2ZoNUdiOGgKK3FjQ2I4N2IrdWp2a1RmaXRWcDN6eG5sa09XMVNPM1BudjNISkU0UGNDSVpKZkhkZ0Z4Q2lvUE1vbVlrNS9aWVoKK2tYSExlRk1xWUhSVWdZeDBFUW4vWjZ0dWIzNkVPNHU3QjFyV2w0MkhoS2thcjdWZG1JV2wzdmU2Y0dLdmEvNmwKK2NYNVdTRms4LzZXdG1QY1d0OHp0RThtKzVZMEVqRUxjZjlOWnhDKzF3TE9EMFRuaGZoZGtJU0lCaGw0T2N3MXMKK0JKMVFvbkNiMVhJVWQwZTNENkVGNW96Y0VtaGxiY09paDYzTndBZUQzb0VGeUF2ZjZSaTkrcmFuWTV5OW1UNk0KK01scjJDK2hFNWZJa3ZDSmhoRWZFbWVKdXY0Q0NKbFVXSittVlBOZ3hDeWVYcDdQN0c1azFraVZxTFlRRm1RZUoKK3BrbExTSFhBVFo1M2lpWFZWaVVDcEd6MWlVZFZKdGRmK2lVdHVUME1JQVdVZVVqeXlic0hIQT09CistLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEaGpDQ0F1K2dBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVVGQURDQmp6RUxNQWtHQTFVRUJoTUNWVk14CitDekFKQmdOVkJBZ1RBa1pNTVJRd0VnWURWUVFIRXd0VVlXeHNZV2hoYzNObFpURVdNQlFHQTFVRUNoTU5SMlZ1CithWFpwWVN3Z1NXNWpMakVMTUFrR0ExVUVDeE1DU1ZReEZEQVNCZ05WQkFNVEMyZGxibWwyYVdFdVkyOXRNU0l3CitJQVlKS29aSWh2Y05BUWtCRmhOamIyNTBZV04wUUdkbGJtbDJhV0V1WTI5dE1CNFhEVEEwTVRBd01qRTNNRGd3CitObG9YRFRBM01UQXdNakUzTURnd05sb3dnWTh4Q3pBSkJnTlZCQVlUQWxWVE1Rc3dDUVlEVlFRSUV3SkdUREVVCitNQklHQTFVRUJ4TUxWR0ZzYkdGb1lYTnpaV1V4RmpBVUJnTlZCQW9URFVkbGJtbDJhV0VzSUVsdVl5NHhDekFKCitCZ05WQkFzVEFrbFVNUlF3RWdZRFZRUURFd3RuWlc1cGRtbGhMbU52YlRFaU1DQUdDU3FHU0liM0RRRUpBUllUCitZMjl1ZEdGamRFQm5aVzVwZG1saExtTnZiVENCbnpBTkJna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBCitsNks5YkxNY3JKNkJ6KzhoeHlvbFNKeTVUZFpLbzhPbW1za1ArTkFKY3Q3YUdXYTMzdTJsa1orR2tvVW1MS1ovCityRE5wZ21ZVk5RbE9RQzRydDVvRHQ0QVVvajU4NEc4UEpLU1B3eW1KY1gwc2JmQjdrOHhSbUxPK3ZWZ1NVdkR1Cithc0xNV0o2UHNZSXVHaHA0QndPQWduWUFDVHpzZDZrU2VJc2VkOFhTeDdjQ0F3RUFBYU9CN3pDQjdEQWRCZ05WCitIUTRFRmdRVTRNeUlpMEdnSVVxa1lSaG5KMkdneVVtVmQ4b3dnYndHQTFVZEl3U0J0RENCc1lBVTRNeUlpMEdnCitJVXFrWVJobkoyR2d5VW1WZDhxaGdaV2tnWkl3Z1k4eEN6QUpCZ05WQkFZVEFsVlRNUXN3Q1FZRFZRUUlFd0pHCitUREVVTUJJR0ExVUVCeE1MVkdGc2JHRm9ZWE56WldVeEZqQVVCZ05WQkFvVERVZGxibWwyYVdFc0lFbHVZeTR4CitDekFKQmdOVkJBc1RBa2xVTVJRd0VnWURWUVFERXd0blpXNXBkbWxoTG1OdmJURWlNQ0FHQ1NxR1NJYjNEUUVKCitBUllUWTI5dWRHRmpkRUJuWlc1cGRtbGhMbU52YllJQkFEQU1CZ05WSFJNRUJUQURBUUgvTUEwR0NTcUdTSWIzCitEUUVCQlFVQUE0R0JBRm1iOWtWK0VEeDVPNGo3ZExNdTkwOW5GZ25CTDA2c2VwanF0QklJYlpZM0duQ2dlZnhLCitwMVM2SWYwMS9tZFY3OW5aR0psZGVnTTc3dHo0VklsenVJYXorMk5PK0dxYnI2RXJPUiszVUdPclJ1SDM5YU1UCisxRHZ3SFlwVTVHVStsRzFhV0hkUXA4dVo1eTRva01nM1o5SVo1bmlqa1VucENIUU8rcS84RnJNTAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9zc2wvc3NsLmggYi9zYW1wbGVzL3NzbC9zc2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDJmMWMzCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9zc2wvc3NsLmgKQEAgLTAsMCArMSw3IEBACisvL2dzb2FwIG5zIHNlcnZpY2UgbmFtZToJc3NsCisvL2dzb2FwIG5zIHNlcnZpY2Ugc3R5bGU6CXJwYworLy9nc29hcCBucyBzZXJ2aWNlIGVuY29kaW5nOgllbmNvZGVkCisvL2dzb2FwIG5zIHNlcnZpY2UgbmFtZXNwYWNlOgl1cm46c3NsCisvL2dzb2FwIG5zIHNlcnZpY2UgbG9jYXRpb246CWh0dHBzOi8vbGlucHJvZzEuY3MuZnN1LmVkdToxODA4MQordHlwZWRlZiBkb3VibGUgeHNkX19kb3VibGU7CitpbnQgbnNfX2FkZCh4c2RfX2RvdWJsZSBhLCB4c2RfX2RvdWJsZSBiLCB4c2RfX2RvdWJsZSAqcmVzdWx0KTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvc3NsL3NzbGNsaWVudC5jIGIvc2FtcGxlcy9zc2wvc3NsY2xpZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmExYjk5OQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvc3NsL3NzbGNsaWVudC5jCkBAIC0wLDAgKzEsMTc4IEBACisvKglzc2xjbGllbnQuYworCisJRXhhbXBsZSBzZWN1cmUgY2xpZW50LgorCisJQ29weXJpZ2h0IChDKSAyMDAwLTIwMDMgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLCBHZW5pdmlhIGluYy4KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorKi8KKworI2luY2x1ZGUgInNvYXBILmgiCisjaW5jbHVkZSAic3NsLm5zbWFwIgorI2luY2x1ZGUgPHVuaXN0ZC5oPgkJLyogZGVmaW5lcyBfUE9TSVhfVEhSRUFEUyBpZiBwdGhyZWFkcyBhcmUgYXZhaWxhYmxlICovCisjaWZkZWYgX1BPU0lYX1RIUkVBRFMKKyMgaW5jbHVkZSA8cHRocmVhZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8c2lnbmFsLmg+CQkvKiBkZWZpbmVzIFNJR1BJUEUgKi8KKworY29uc3QgY2hhciBzZXJ2ZXJbXSA9ICJodHRwczovL2xvY2FsaG9zdDoxODA4MSI7CisKK2ludCBDUllQVE9fdGhyZWFkX3NldHVwKCk7Cit2b2lkIENSWVBUT190aHJlYWRfY2xlYW51cCgpOwordm9pZCBzaWdwaXBlX2hhbmRsZShpbnQpOworCitpbnQgbWFpbigpCit7IHN0cnVjdCBzb2FwIHNvYXA7CisgIGRvdWJsZSBhLCBiLCByZXN1bHQ7CisgIC8qIEluaXQgT3BlblNTTCAqLworICBzb2FwX3NzbF9pbml0KCk7CisgIGlmIChDUllQVE9fdGhyZWFkX3NldHVwKCkpCisgIHsgZnByaW50ZihzdGRlcnIsICJDYW5ub3Qgc2V0dXAgdGhyZWFkIG11dGV4XG4iKTsKKyAgICBleGl0KDEpOworICB9CisgIGEgPSAxMC4wOworICBiID0gMjAuMDsKKyAgLyogSW5pdCBnU09BUCBjb250ZXh0ICovCisgIHNvYXBfaW5pdCgmc29hcCk7CisgIC8qIFRoZSBzdXBwbGllZCBzZXJ2ZXIgY2VydGlmaWNhdGUgInNlcnZlci5wZW0iIGFzc3VtZXMgdGhhdCB0aGUgc2VydmVyIGlzCisgICAgcnVubmluZyBvbiAnbG9jYWxob3N0Jywgc28gY2xpZW50cyBjYW4gb25seSBjb25uZWN0IGZyb20gdGhlIHNhbWUgaG9zdCB3aGVuCisgICAgdmVyaWZ5aW5nIHRoZSBzZXJ2ZXIncyBjZXJ0aWZpY2F0ZS4gVXNlIFNPQVBfU1NMX05PX0FVVEhFTlRJQ0FUSU9OIHRvIG9taXQKKyAgICB0aGUgYXV0aGVudGljYXRpb24gb2YgdGhlIHNlcnZlciBhbmQgdXNlIGVuY3J5cHRpb24gZGlyZWN0bHkgZnJvbSBhbnkgc2l0ZS4KKyAgICBUbyB2ZXJpZnkgdGhlIGNlcnRpZmljYXRlcyBvZiB0aGlyZC1wYXJ0eSBzZXJ2aWNlcywgdGhleSBtdXN0IHByb3ZpZGUgYQorICAgIGNlcnRpZmljYXRlIGlzc3VlZCBieSBWZXJpc2lnbiBvciBhbm90aGVyIHRydXN0ZWQgQ0EuIEF0IHRoZSBjbGllbnQtc2lkZSwKKyAgICB0aGUgY2FwYXRoIHBhcmFtZXRlciBzaG91bGQgcG9pbnQgdG8gYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0aGVzZQorICAgIHRydXN0ZWQgKHJvb3QpIGNlcnRpZmljYXRlcyBvciB0aGUgY2FmaWxlIHBhcmFtZXRlciBzaG91bGQgcmVmZXIgdG8gb25lCisgICAgZmlsZSB3aWxsIGFsbCBjZXJ0aWZpY2F0ZXMuIFRvIGhlbHAgeW91IG91dCwgdGhlIHN1cHBsaWVkICJjYWNlcnRzLnBlbSIKKyAgICBmaWxlIGNvbnRhaW5zIHRoZSBjZXJ0aWZpY2F0ZXMgaXNzdWVkIGJ5IHZhcmlvdXMgQ0FzLiBZb3Ugc2hvdWxkIHVzZSB0aGlzCisgICAgZmlsZSBmb3IgdGhlIGNhZmlsZSBwYXJhbWV0ZXIgaW5zdGVhZCBvZiAiY2FjZXJ0LnBlbSIgdG8gY29ubmVjdCB0byB0cnVzdGVkCisgICAgc2VydmVycy4gIE5vdGUgdGhhdCB0aGUgY2xpZW50IG1heSBmYWlsIHRvIGNvbm5lY3QgaWYgdGhlIHNlcnZlcidzCisgICAgY3JlZGVudGlhbHMgaGF2ZSBwcm9ibGVtcyAoZS5nLiBleHBpcmVkKS4gVXNlIFNPQVBfU1NMX05PX0FVVEhFTlRJQ0FUSU9OCisgICAgYW5kIHNldCBjYWNlcnQgdG8gTlVMTCB0byBlbmNyeXB0IG1lc3NhZ2VzIGlmIHlvdSBkb24ndCBjYXJlIGFib3V0IHRoZQorICAgIHRydXN0d29ydGh5bmVzcyBvZiB0aGUgc2VydmVyLiAgTm90ZTogc2V0dGluZyBjYXBhdGggbWF5IG5vdCB3b3JrIG9uCisgICAgV2luZG93cy4KKyAgKi8KKyAgaWYgKHNvYXBfc3NsX2NsaWVudF9jb250ZXh0KCZzb2FwLAorICAgIFNPQVBfU1NMX0RFRkFVTFQsCS8qIHVzZSBTT0FQX1NTTF9ERUZBVUxUIGluIHByb2R1Y3Rpb24gY29kZSAqLworICAgIE5VTEwsIAkJLyoga2V5ZmlsZTogcmVxdWlyZWQgb25seSB3aGVuIGNsaWVudCBtdXN0IGF1dGhlbnRpY2F0ZSB0byBzZXJ2ZXIgKHNlZSBTU0wgZG9jcyBvbiBob3cgdG8gb2J0YWluIHRoaXMgZmlsZSkgKi8KKyAgICBOVUxMLCAJCS8qIHBhc3N3b3JkIHRvIHJlYWQgdGhlIGtleWZpbGUgKi8KKyAgICAiY2FjZXJ0LnBlbSIsCS8qIG9wdGlvbmFsIGNhY2VydCBmaWxlIHRvIHN0b3JlIHRydXN0ZWQgY2VydGlmaWNhdGVzICovCisgICAgTlVMTCwJCS8qIG9wdGlvbmFsIGNhcGF0aCB0byBkaXJlY3Rvcnkgd2l0aCB0cnVzdGVkIGNlcnRpZmljYXRlcyAqLworICAgIE5VTEwJCS8qIGlmIHJhbmRmaWxlIT1OVUxMOiB1c2UgYSBmaWxlIHdpdGggcmFuZG9tIGRhdGEgdG8gc2VlZCByYW5kb21uZXNzICovIAorICApKQorICB7IHNvYXBfcHJpbnRfZmF1bHQoJnNvYXAsIHN0ZGVycik7CisgICAgZXhpdCgxKTsKKyAgfQorICBpZiAoc29hcF9jYWxsX25zX19hZGQoJnNvYXAsIHNlcnZlciwgIiIsIGEsIGIsICZyZXN1bHQpID09IFNPQVBfT0spCisgICAgZnByaW50ZihzdGRvdXQsICJSZXN1bHQ6ICVmICsgJWYgPSAlZlxuIiwgYSwgYiwgcmVzdWx0KTsKKyAgZWxzZQorICAgIHNvYXBfcHJpbnRfZmF1bHQoJnNvYXAsIHN0ZGVycik7CisgIHNvYXBfZGVzdHJveSgmc29hcCk7IC8qIEMrKyAqLworICBzb2FwX2VuZCgmc29hcCk7CisgIHNvYXBfZG9uZSgmc29hcCk7CisgIENSWVBUT190aHJlYWRfY2xlYW51cCgpOworICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglPcGVuU1NMCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIFdJVEhfT1BFTlNTTAorCisjaWYgZGVmaW5lZChXSU4zMikKKyMgZGVmaW5lIE1VVEVYX1RZUEUJCUhBTkRMRQorIyBkZWZpbmUgTVVURVhfU0VUVVAoeCkJCSh4KSA9IENyZWF0ZU11dGV4KE5VTEwsIEZBTFNFLCBOVUxMKQorIyBkZWZpbmUgTVVURVhfQ0xFQU5VUCh4KQlDbG9zZUhhbmRsZSh4KQorIyBkZWZpbmUgTVVURVhfTE9DSyh4KQkJV2FpdEZvclNpbmdsZU9iamVjdCgoeCksIElORklOSVRFKQorIyBkZWZpbmUgTVVURVhfVU5MT0NLKHgpCVJlbGVhc2VNdXRleCh4KQorIyBkZWZpbmUgVEhSRUFEX0lECQlHZXRDdXJyZW50VGhyZWFkSWQoKQorI2VsaWYgZGVmaW5lZChfUE9TSVhfVEhSRUFEUykKKyMgZGVmaW5lIE1VVEVYX1RZUEUJCXB0aHJlYWRfbXV0ZXhfdAorIyBkZWZpbmUgTVVURVhfU0VUVVAoeCkJCXB0aHJlYWRfbXV0ZXhfaW5pdCgmKHgpLCBOVUxMKQorIyBkZWZpbmUgTVVURVhfQ0xFQU5VUCh4KQlwdGhyZWFkX211dGV4X2Rlc3Ryb3koJih4KSkKKyMgZGVmaW5lIE1VVEVYX0xPQ0soeCkJCXB0aHJlYWRfbXV0ZXhfbG9jaygmKHgpKQorIyBkZWZpbmUgTVVURVhfVU5MT0NLKHgpCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCYoeCkpCisjIGRlZmluZSBUSFJFQURfSUQJCXB0aHJlYWRfc2VsZigpCisjZWxzZQorIyBlcnJvciAiWW91IG11c3QgZGVmaW5lIG11dGV4IG9wZXJhdGlvbnMgYXBwcm9wcmlhdGUgZm9yIHlvdXIgcGxhdGZvcm0iCisjIGVycm9yCSJTZWUgT3BlblNTTCAvdGhyZWFkcy90aC1sb2NrLmMgb24gaG93IHRvIGltcGxlbWVudCBtdXRleCBvbiB5b3VyIHBsYXRmb3JtIgorI2VuZGlmCisKK3N0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZQoreyBNVVRFWF9UWVBFIG11dGV4OworfTsKKworc3RhdGljIE1VVEVYX1RZUEUgKm11dGV4X2J1ZjsKKworc3RhdGljIHN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSAqZHluX2NyZWF0ZV9mdW5jdGlvbihjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKK3sgc3RydWN0IENSWVBUT19keW5sb2NrX3ZhbHVlICp2YWx1ZTsKKyAgdmFsdWUgPSAoc3RydWN0IENSWVBUT19keW5sb2NrX3ZhbHVlKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSkpOworICBpZiAodmFsdWUpCisgICAgTVVURVhfU0VUVVAodmFsdWUtPm11dGV4KTsKKyAgcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgdm9pZCBkeW5fbG9ja19mdW5jdGlvbihpbnQgbW9kZSwgc3RydWN0IENSWVBUT19keW5sb2NrX3ZhbHVlICpsLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKK3sgaWYgKG1vZGUgJiBDUllQVE9fTE9DSykKKyAgICBNVVRFWF9MT0NLKGwtPm11dGV4KTsKKyAgZWxzZQorICAgIE1VVEVYX1VOTE9DSyhsLT5tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIGR5bl9kZXN0cm95X2Z1bmN0aW9uKHN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSAqbCwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpCit7IE1VVEVYX0NMRUFOVVAobC0+bXV0ZXgpOworICBmcmVlKGwpOworfQorCit2b2lkIGxvY2tpbmdfZnVuY3Rpb24oaW50IG1vZGUsIGludCBuLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKK3sgaWYgKG1vZGUgJiBDUllQVE9fTE9DSykKKyAgICBNVVRFWF9MT0NLKG11dGV4X2J1ZltuXSk7CisgIGVsc2UKKyAgICBNVVRFWF9VTkxPQ0sobXV0ZXhfYnVmW25dKTsKK30KKwordW5zaWduZWQgbG9uZyBpZF9mdW5jdGlvbigpCit7IHJldHVybiAodW5zaWduZWQgbG9uZylUSFJFQURfSUQ7Cit9CisKK2ludCBDUllQVE9fdGhyZWFkX3NldHVwKCkKK3sgaW50IGk7CisgIG11dGV4X2J1ZiA9IChNVVRFWF9UWVBFKiltYWxsb2MoQ1JZUFRPX251bV9sb2NrcygpICogc2l6ZW9mKHB0aHJlYWRfbXV0ZXhfdCkpOworICBpZiAoIW11dGV4X2J1ZikKKyAgICByZXR1cm4gU09BUF9FT007CisgIGZvciAoaSA9IDA7IGkgPCBDUllQVE9fbnVtX2xvY2tzKCk7IGkrKykKKyAgICBNVVRFWF9TRVRVUChtdXRleF9idWZbaV0pOworICBDUllQVE9fc2V0X2lkX2NhbGxiYWNrKGlkX2Z1bmN0aW9uKTsKKyAgQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKGxvY2tpbmdfZnVuY3Rpb24pOworICBDUllQVE9fc2V0X2R5bmxvY2tfY3JlYXRlX2NhbGxiYWNrKGR5bl9jcmVhdGVfZnVuY3Rpb24pOworICBDUllQVE9fc2V0X2R5bmxvY2tfbG9ja19jYWxsYmFjayhkeW5fbG9ja19mdW5jdGlvbik7CisgIENSWVBUT19zZXRfZHlubG9ja19kZXN0cm95X2NhbGxiYWNrKGR5bl9kZXN0cm95X2Z1bmN0aW9uKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK3ZvaWQgQ1JZUFRPX3RocmVhZF9jbGVhbnVwKCkKK3sgaW50IGk7CisgIGlmICghbXV0ZXhfYnVmKQorICAgIHJldHVybjsKKyAgQ1JZUFRPX3NldF9pZF9jYWxsYmFjayhOVUxMKTsKKyAgQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKE5VTEwpOworICBDUllQVE9fc2V0X2R5bmxvY2tfY3JlYXRlX2NhbGxiYWNrKE5VTEwpOworICBDUllQVE9fc2V0X2R5bmxvY2tfbG9ja19jYWxsYmFjayhOVUxMKTsKKyAgQ1JZUFRPX3NldF9keW5sb2NrX2Rlc3Ryb3lfY2FsbGJhY2soTlVMTCk7CisgIGZvciAoaSA9IDA7IGkgPCBDUllQVE9fbnVtX2xvY2tzKCk7IGkrKykKKyAgICBNVVRFWF9DTEVBTlVQKG11dGV4X2J1ZltpXSk7CisgIGZyZWUobXV0ZXhfYnVmKTsKKyAgbXV0ZXhfYnVmID0gTlVMTDsKK30KKworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJU0lHUElQRQorICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgc2lncGlwZV9oYW5kbGUoaW50IHgpIHsgfQorCmRpZmYgLS1naXQgYS9zYW1wbGVzL3NzbC9zc2xzZXJ2ZXIuYyBiL3NhbXBsZXMvc3NsL3NzbHNlcnZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OWUzZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3NzbC9zc2xzZXJ2ZXIuYwpAQCAtMCwwICsxLDIyMyBAQAorLyoJc3Nsc2VydmVyLmMKKworCUV4YW1wbGUgc3RhbmQtYWxvbmUgc2VjdXJlIGdTT0FQIFdlYiBzZXJ2aWNlLgorCisJQ29weXJpZ2h0IChDKSAyMDAwLTIwMDMgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLCBHZW5pdmlhIGluYy4KKwlBbGwgUmlnaHRzIFJlc2VydmVkLgorKi8KKworI2luY2x1ZGUgInNvYXBILmgiCisjaW5jbHVkZSAic3NsLm5zbWFwIgorI2luY2x1ZGUgPHVuaXN0ZC5oPgkJLyogZGVmaW5lcyBfUE9TSVhfVEhSRUFEUyBpZiBwdGhyZWFkcyBhcmUgYXZhaWxhYmxlICovCisjaWZkZWYgX1BPU0lYX1RIUkVBRFMKKyMgaW5jbHVkZSA8cHRocmVhZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8c2lnbmFsLmg+CQkvKiBkZWZpbmVzIFNJR1BJUEUgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglGb3J3YXJkIGRlY2xzCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCAqcHJvY2Vzc19yZXF1ZXN0KHZvaWQqKTsKK2ludCBDUllQVE9fdGhyZWFkX3NldHVwKCk7Cit2b2lkIENSWVBUT190aHJlYWRfY2xlYW51cCgpOwordm9pZCBzaWdwaXBlX2hhbmRsZShpbnQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqCU1haW4KKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgbWFpbigpCit7IGludCBtLCBzOyAvKiBtYXN0ZXIgYW5kIHNsYXZlIHNvY2tldHMgKi8KKyAgcHRocmVhZF90IHRpZDsKKyAgc3RydWN0IHNvYXAgc29hcCwgKnRzb2FwOworICAvKiBOZWVkIFNJR1BJUEUgaGFuZGxlciBvbiBVbml4L0xpbnV4IHN5c3RlbXMgdG8gY2F0Y2ggYnJva2VuIHBpcGVzOiAqLworICBzaWduYWwoU0lHUElQRSwgc2lncGlwZV9oYW5kbGUpOworICAvKiBJbml0IE9wZW5TU0wgKi8KKyAgc29hcF9zc2xfaW5pdCgpOworICBpZiAoQ1JZUFRPX3RocmVhZF9zZXR1cCgpKQorICB7IGZwcmludGYoc3RkZXJyLCAiQ2Fubm90IHNldHVwIHRocmVhZCBtdXRleFxuIik7CisgICAgZXhpdCgxKTsKKyAgfQorICBzb2FwX2luaXQoJnNvYXApOworICBpZiAoc29hcF9zc2xfc2VydmVyX2NvbnRleHQoJnNvYXAsCisgICAgU09BUF9TU0xfREVGQVVMVCwKKyAgICAic2VydmVyLnBlbSIsCS8qIGtleWZpbGU6IHNlZSBTU0wgZG9jcyBvbiBob3cgdG8gb2J0YWluIHRoaXMgZmlsZSAqLworICAgICJwYXNzd29yZCIsCQkvKiBwYXNzd29yZCB0byByZWFkIHRoZSBrZXkgZmlsZSAqLworICAgIE5VTEwsIAkJLyogY2FjZXJ0IGZpbGUgdG8gc3RvcmUgdHJ1c3RlZCBjZXJ0aWZpY2F0ZXMgKHRvIGF1dGhlbnRpY2F0ZSBjbGllbnRzKSAqLworICAgIE5VTEwsCQkvKiBjYXBhdGggKi8KKyAgICAiZGg1MTIucGVtIiwJLyogREggZmlsZSwgaWYgTlVMTCB1c2UgUlNBICovCisgICAgTlVMTCwJCS8qIGlmIHJhbmRmaWxlIT1OVUxMOiB1c2UgYSBmaWxlIHdpdGggcmFuZG9tIGRhdGEgdG8gc2VlZCByYW5kb21uZXNzICovIAorICAgICJzc2xzZXJ2ZXIiCQkvKiBzZXJ2ZXIgaWRlbnRpZmljYXRpb24gZm9yIFNTTCBzZXNzaW9uIGNhY2hlICh1bmlxdWUgc2VydmVyIG5hbWUsIGUuZy4gdXNlIGFyZ3ZbMF0pICovCisgICkpCisgIHsgc29hcF9wcmludF9mYXVsdCgmc29hcCwgc3RkZXJyKTsKKyAgICBleGl0KDEpOworICB9CisgIHNvYXAuYWNjZXB0X3RpbWVvdXQgPSA2MDsJLyogc2VydmVyIHRpbWVzIG91dCBhZnRlciAxMCBtaW51dGVzIG9mIGluYWN0aXZpdHkgKi8KKyAgc29hcC5yZWN2X3RpbWVvdXQgPSAzMDsJLyogaWYgcmVhZCBzdGFsbHMsIHRoZW4gdGltZW91dCBhZnRlciA2MCBzZWNvbmRzICovCisgIG0gPSBzb2FwX2JpbmQoJnNvYXAsIE5VTEwsIDE4MDgxLCAxMDApOworICBpZiAobSA8IDApCisgIHsgc29hcF9wcmludF9mYXVsdCgmc29hcCwgc3RkZXJyKTsKKyAgICBleGl0KDEpOworICB9CisgIGZwcmludGYoc3RkZXJyLCAiQmluZCBzdWNjZXNzZnVsOiBzb2NrZXQgPSAlZFxuIiwgbSk7CisgIGZvciAoOzspCisgIHsgcyA9IHNvYXBfYWNjZXB0KCZzb2FwKTsKKyAgICBpZiAocyA8IDApCisgICAgeyBpZiAoc29hcC5lcnJudW0pCisgICAgICAgIHNvYXBfcHJpbnRfZmF1bHQoJnNvYXAsIHN0ZGVycik7CisgICAgICBlbHNlCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiU2VydmVyIHRpbWVkIG91dFxuIik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZnByaW50ZihzdGRlcnIsICJTb2NrZXQgJWQgY29ubmVjdGlvbiBmcm9tIElQICVkLiVkLiVkLiVkXG4iLCBzLCAoaW50KShzb2FwLmlwPj4yNCkmMHhGRiwgKGludCkoc29hcC5pcD4+MTYpJjB4RkYsIChpbnQpKHNvYXAuaXA+PjgpJjB4RkYsIChpbnQpc29hcC5pcCYweEZGKTsKKyAgICB0c29hcCA9IHNvYXBfY29weSgmc29hcCk7CisgICAgaWYgKCF0c29hcCkKKyAgICB7IHNvYXBfY2xvc2Vzb2NrKCZzb2FwKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoc29hcF9zc2xfYWNjZXB0KHRzb2FwKSkKKyAgICB7IHNvYXBfcHJpbnRfZmF1bHQodHNvYXAsIHN0ZGVycik7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlNTTCByZXF1ZXN0IGZhaWxlZCwgY29udGludWUgd2l0aCBuZXh0IGNhbGwuLi5cbiIpOworICAgICAgc29hcF9lbmQodHNvYXApOworICAgICAgc29hcF9kb25lKHRzb2FwKTsKKyAgICAgIGZyZWUodHNvYXApOworICAgICAgY29udGludWU7CisgICAgfQorICAgIHB0aHJlYWRfY3JlYXRlKCZ0aWQsIE5VTEwsICZwcm9jZXNzX3JlcXVlc3QsICh2b2lkKil0c29hcCk7CisgIH0KKyAgc29hcF9lbmQoJnNvYXApOworICBzb2FwX2RvbmUoJnNvYXApOyAvKiBNVVNUIGNhbGwgYWZ0ZXIgQ1JZUFRPX3RocmVhZF9jbGVhbnVwICovCisgIENSWVBUT190aHJlYWRfY2xlYW51cCgpOworICByZXR1cm4gMDsKK30gCisKK3ZvaWQgKnByb2Nlc3NfcmVxdWVzdCh2b2lkICpzb2FwKQoreyBwdGhyZWFkX2RldGFjaChwdGhyZWFkX3NlbGYoKSk7CisgIHNvYXBfc2VydmUoKHN0cnVjdCBzb2FwKilzb2FwKTsKKyAgc29hcF9kZXN0cm95KChzdHJ1Y3Qgc29hcCopc29hcCk7IC8qIGZvciBDKysgKi8KKyAgc29hcF9lbmQoKHN0cnVjdCBzb2FwKilzb2FwKTsKKyAgc29hcF9kb25lKChzdHJ1Y3Qgc29hcCopc29hcCk7CisgIGZyZWUoc29hcCk7CisgIHJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqCVNlcnZpY2UgbWV0aG9kcworICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBuc19fYWRkKHN0cnVjdCBzb2FwICpzb2FwLCBkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSAqcmVzdWx0KQoreyAqcmVzdWx0ID0gYSArIGI7CisgIHJldHVybiBTT0FQX09LOworfSAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglPcGVuU1NMCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIFdJVEhfT1BFTlNTTAorCisjaWYgZGVmaW5lZChXSU4zMikKKyMgZGVmaW5lIE1VVEVYX1RZUEUJCUhBTkRMRQorIyBkZWZpbmUgTVVURVhfU0VUVVAoeCkJCSh4KSA9IENyZWF0ZU11dGV4KE5VTEwsIEZBTFNFLCBOVUxMKQorIyBkZWZpbmUgTVVURVhfQ0xFQU5VUCh4KQlDbG9zZUhhbmRsZSh4KQorIyBkZWZpbmUgTVVURVhfTE9DSyh4KQkJV2FpdEZvclNpbmdsZU9iamVjdCgoeCksIElORklOSVRFKQorIyBkZWZpbmUgTVVURVhfVU5MT0NLKHgpCVJlbGVhc2VNdXRleCh4KQorIyBkZWZpbmUgVEhSRUFEX0lECQlHZXRDdXJyZW50VGhyZWFkSWQoKQorI2VsaWYgZGVmaW5lZChfUE9TSVhfVEhSRUFEUykKKyMgZGVmaW5lIE1VVEVYX1RZUEUJCXB0aHJlYWRfbXV0ZXhfdAorIyBkZWZpbmUgTVVURVhfU0VUVVAoeCkJCXB0aHJlYWRfbXV0ZXhfaW5pdCgmKHgpLCBOVUxMKQorIyBkZWZpbmUgTVVURVhfQ0xFQU5VUCh4KQlwdGhyZWFkX211dGV4X2Rlc3Ryb3koJih4KSkKKyMgZGVmaW5lIE1VVEVYX0xPQ0soeCkJCXB0aHJlYWRfbXV0ZXhfbG9jaygmKHgpKQorIyBkZWZpbmUgTVVURVhfVU5MT0NLKHgpCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCYoeCkpCisjIGRlZmluZSBUSFJFQURfSUQJCXB0aHJlYWRfc2VsZigpCisjZWxzZQorIyBlcnJvciAiWW91IG11c3QgZGVmaW5lIG11dGV4IG9wZXJhdGlvbnMgYXBwcm9wcmlhdGUgZm9yIHlvdXIgcGxhdGZvcm0iCisjIGVycm9yCSJTZWUgT3BlblNTTCAvdGhyZWFkcy90aC1sb2NrLmMgb24gaG93IHRvIGltcGxlbWVudCBtdXRleCBvbiB5b3VyIHBsYXRmb3JtIgorI2VuZGlmCisKK3N0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZQoreyBNVVRFWF9UWVBFIG11dGV4OworfTsKKworc3RhdGljIE1VVEVYX1RZUEUgKm11dGV4X2J1ZjsKKworc3RhdGljIHN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSAqZHluX2NyZWF0ZV9mdW5jdGlvbihjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKK3sgc3RydWN0IENSWVBUT19keW5sb2NrX3ZhbHVlICp2YWx1ZTsKKyAgdmFsdWUgPSAoc3RydWN0IENSWVBUT19keW5sb2NrX3ZhbHVlKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSkpOworICBpZiAodmFsdWUpCisgICAgTVVURVhfU0VUVVAodmFsdWUtPm11dGV4KTsKKyAgcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgdm9pZCBkeW5fbG9ja19mdW5jdGlvbihpbnQgbW9kZSwgc3RydWN0IENSWVBUT19keW5sb2NrX3ZhbHVlICpsLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKK3sgaWYgKG1vZGUgJiBDUllQVE9fTE9DSykKKyAgICBNVVRFWF9MT0NLKGwtPm11dGV4KTsKKyAgZWxzZQorICAgIE1VVEVYX1VOTE9DSyhsLT5tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIGR5bl9kZXN0cm95X2Z1bmN0aW9uKHN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSAqbCwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpCit7IE1VVEVYX0NMRUFOVVAobC0+bXV0ZXgpOworICBmcmVlKGwpOworfQorCit2b2lkIGxvY2tpbmdfZnVuY3Rpb24oaW50IG1vZGUsIGludCBuLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKK3sgaWYgKG1vZGUgJiBDUllQVE9fTE9DSykKKyAgICBNVVRFWF9MT0NLKG11dGV4X2J1ZltuXSk7CisgIGVsc2UKKyAgICBNVVRFWF9VTkxPQ0sobXV0ZXhfYnVmW25dKTsKK30KKwordW5zaWduZWQgbG9uZyBpZF9mdW5jdGlvbigpCit7IHJldHVybiAodW5zaWduZWQgbG9uZylUSFJFQURfSUQ7Cit9CisKK2ludCBDUllQVE9fdGhyZWFkX3NldHVwKCkKK3sgaW50IGk7CisgIG11dGV4X2J1ZiA9IChNVVRFWF9UWVBFKiltYWxsb2MoQ1JZUFRPX251bV9sb2NrcygpICogc2l6ZW9mKHB0aHJlYWRfbXV0ZXhfdCkpOworICBpZiAoIW11dGV4X2J1ZikKKyAgICByZXR1cm4gU09BUF9FT007CisgIGZvciAoaSA9IDA7IGkgPCBDUllQVE9fbnVtX2xvY2tzKCk7IGkrKykKKyAgICBNVVRFWF9TRVRVUChtdXRleF9idWZbaV0pOworICBDUllQVE9fc2V0X2lkX2NhbGxiYWNrKGlkX2Z1bmN0aW9uKTsKKyAgQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKGxvY2tpbmdfZnVuY3Rpb24pOworICBDUllQVE9fc2V0X2R5bmxvY2tfY3JlYXRlX2NhbGxiYWNrKGR5bl9jcmVhdGVfZnVuY3Rpb24pOworICBDUllQVE9fc2V0X2R5bmxvY2tfbG9ja19jYWxsYmFjayhkeW5fbG9ja19mdW5jdGlvbik7CisgIENSWVBUT19zZXRfZHlubG9ja19kZXN0cm95X2NhbGxiYWNrKGR5bl9kZXN0cm95X2Z1bmN0aW9uKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK3ZvaWQgQ1JZUFRPX3RocmVhZF9jbGVhbnVwKCkKK3sgaW50IGk7CisgIGlmICghbXV0ZXhfYnVmKQorICAgIHJldHVybjsKKyAgQ1JZUFRPX3NldF9pZF9jYWxsYmFjayhOVUxMKTsKKyAgQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKE5VTEwpOworICBDUllQVE9fc2V0X2R5bmxvY2tfY3JlYXRlX2NhbGxiYWNrKE5VTEwpOworICBDUllQVE9fc2V0X2R5bmxvY2tfbG9ja19jYWxsYmFjayhOVUxMKTsKKyAgQ1JZUFRPX3NldF9keW5sb2NrX2Rlc3Ryb3lfY2FsbGJhY2soTlVMTCk7CisgIGZvciAoaSA9IDA7IGkgPCBDUllQVE9fbnVtX2xvY2tzKCk7IGkrKykKKyAgICBNVVRFWF9DTEVBTlVQKG11dGV4X2J1ZltpXSk7CisgIGZyZWUobXV0ZXhfYnVmKTsKKyAgbXV0ZXhfYnVmID0gTlVMTDsKK30KKworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJU0lHUElQRQorICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgc2lncGlwZV9oYW5kbGUoaW50IHgpIHsgfQorCmRpZmYgLS1naXQgYS9zYW1wbGVzL3VkcC9NYWtlZmlsZSBiL3NhbXBsZXMvdWRwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNjZlMmUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3VkcC9NYWtlZmlsZQpAQCAtMCwwICsxLDIzIEBACitHU09BUD0uLi8uLi9zb2FwY3BwMgorU09BUEg9Li4vLi4vc3Rkc29hcDIuaAorU09BUEM9Li4vLi4vc3Rkc29hcDIuYworU09BUENQUD0uLi8uLi9zdGRzb2FwMi5jcHAKK0NDPWdjYworQ1BQPWcrKworTElCUz0KK0NPRkxBR1M9LU8yCitDV0ZMQUdTPS1XYWxsCitDSUZMQUdTPS1JLi4vLi4KK0NNRkxBR1M9LURXSVRIX1VEUCAtRFdJVEhfR1pJUAorQ0ZMQUdTPSAkKENXRkxBR1MpICQoQ09GTEFHUykgJChDSUZMQUdTKSAkKENNRkxBR1MpCithbGw6CQl1ZHBjbGllbnQgdWRwc2VydmVyCit1ZHBjbGllbnQ6CXVkcC5oIHVkcGNsaWVudC5jICQoU09BUEgpICQoU09BUEMpCisJCSQoR1NPQVApIC1jIC1JLi4vLi4vaW1wb3J0IHVkcC5oCisJCSQoQ0MpICQoQ0ZMQUdTKSAtbyB1ZHBjbGllbnQgdWRwY2xpZW50LmMgc29hcEMuYyBzb2FwQ2xpZW50LmMgJChTT0FQQykgJChMSUJTKSAtbHoKK3VkcHNlcnZlcjoJdWRwLmggdWRwc2VydmVyLmMgJChTT0FQSCkgJChTT0FQQykKKwkJJChHU09BUCkgLWMgLUkuLi8uLi9pbXBvcnQgdWRwLmgKKwkJJChDQykgJChDRkxBR1MpIC1vIHVkcHNlcnZlciB1ZHBzZXJ2ZXIuYyBzb2FwQy5jIHNvYXBTZXJ2ZXIuYyAkKFNPQVBDKSAkKExJQlMpIC1segorY2xlYW46CisJCXJtIC1mICoubyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5Lmggc29hcCpPYmplY3QuaAorZGlzdGNsZWFuOgorCQlybSAtZiAqLm8gKi53c2RsICoueG1sICoubnNtYXAgKi5sb2cgc29hcEguaCBzb2FwU3R1Yi5oIHNvYXBDLmNwcCBzb2FwQy5jIHNvYXBDbGllbnQuY3BwIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmNwcCBzb2FwU2VydmVyLmMgc29hcCpQcm94eS5oIHNvYXAqT2JqZWN0LmggdWRwY2xpZW50IHVkcHNlcnZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy91ZHAvTWFrZWZpbGVTb2xhcmlzIGIvc2FtcGxlcy91ZHAvTWFrZWZpbGVTb2xhcmlzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YWYzNzMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3VkcC9NYWtlZmlsZVNvbGFyaXMKQEAgLTAsMCArMSwyMyBAQAorR1NPQVA9Li4vLi4vc29hcGNwcDIKK1NPQVBIPS4uLy4uL3N0ZHNvYXAyLmgKK1NPQVBDPS4uLy4uL3N0ZHNvYXAyLmMKK1NPQVBDUFA9Li4vLi4vc3Rkc29hcDIuY3BwCitDQz1nY2MKK0NQUD1nKysKK0xJQlM9LWx4bmV0IC1sbnNsIC1sc29ja2V0CitDT0ZMQUdTPS1PMgorQ1dGTEFHUz0tV2FsbAorQ0lGTEFHUz0tSS4uLy4uCitDTUZMQUdTPS1EV0lUSF9VRFAgLURXSVRIX0daSVAKK0NGTEFHUz0gJChDV0ZMQUdTKSAkKENPRkxBR1MpICQoQ0lGTEFHUykgJChDTUZMQUdTKQorYWxsOgkJdWRwY2xpZW50IHVkcHNlcnZlcgordWRwY2xpZW50Ogl1ZHAuaCB1ZHBjbGllbnQuYyAkKFNPQVBIKSAkKFNPQVBDKQorCQkkKEdTT0FQKSAtYyAtSS4uLy4uL2ltcG9ydCB1ZHAuaAorCQkkKENDKSAkKENGTEFHUykgLW8gdWRwY2xpZW50IHVkcGNsaWVudC5jIHNvYXBDLmMgc29hcENsaWVudC5jICQoU09BUEMpICQoTElCUykgLWx6Cit1ZHBzZXJ2ZXI6CXVkcC5oIHVkcHNlcnZlci5jICQoU09BUEgpICQoU09BUEMpCisJCSQoR1NPQVApIC1jIC1JLi4vLi4vaW1wb3J0IHVkcC5oCisJCSQoQ0MpICQoQ0ZMQUdTKSAtbyB1ZHBzZXJ2ZXIgdWRwc2VydmVyLmMgc29hcEMuYyBzb2FwU2VydmVyLmMgJChTT0FQQykgJChMSUJTKSAtbHoKK2NsZWFuOgorCQlybSAtZiAqLm8gc29hcEguaCBzb2FwU3R1Yi5oIHNvYXBDLmNwcCBzb2FwQy5jIHNvYXBDbGllbnQuY3BwIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmNwcCBzb2FwU2VydmVyLmMgc29hcCpQcm94eS5oIHNvYXAqT2JqZWN0LmgKK2Rpc3RjbGVhbjoKKwkJcm0gLWYgKi5vICoud3NkbCAqLnhtbCAqLm5zbWFwICoubG9nIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaCBzb2FwKk9iamVjdC5oIHVkcGNsaWVudCB1ZHBzZXJ2ZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvdWRwL1JFQURNRS50eHQgYi9zYW1wbGVzL3VkcC9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMTUxZjIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3VkcC9SRUFETUUudHh0CkBAIC0wLDAgKzEsMjY3IEBACisKK1NPQVAtb3Zlci1VRFAKKworQ29uZm9ybWFuY2UKKy0tLS0tLS0tLS0tCisKK1RoZSBTT0FQLW92ZXItVURQIHNwZWNpZmljYXRpb24gcmVsaWVzIG9uIFdTLUFkZHJlc3NpbmcuIFRoZSBXUy1BZGRyZXNzaW5nLmgKK2ZpbGUgZGVmaW5lcyB0aGUgV1MtQWRkcmVzc2luZyBlbGVtZW50cyBmb3IgY2xpZW50IGFuZCBzZXJ2ZXIgYXBwbGljYXRpb25zLgorCitUaGUgaW1wbGVtZW50YXRpb24gY29uZm9ybXMgdG8gdGhlIFNPQVAtb3Zlci1VRFAgcmVxdWlyZW1lbnRzOgorCisqIFNPQVAtb3Zlci1VRFAgc2VydmVyIGVuZHBvaW50IFVSTCBmb3JtYXQ6IHNvYXAudWRwOi8vaG9zdDpwb3J0L3BhdGgKKyogU3VwcG9ydCBvbmUtd2F5IG1lc3NhZ2UtZXhjaGFuZ2UgcGF0dGVybiAoTUVQKSB3aGVyZSBhIFNPQVAgZW52ZWxvcGUgaXMKKyAgY2FycmllZCBpbiBhIHVzZXIgZGF0YWdyYW0uCisqIFN1cHBvcnQgcmVxdWVzdC1yZXNwb25zZSBtZXNzYWdlLWV4Y2hhbmdlIHBhdHRlcm4gKE1FUCkgd2hlcmUgU09BUCBlbnZlbG9wZXMKKyAgYXJlIGNhcnJpZWQgaW4gdXNlciBkYXRhZ3JhbXMuCisqIFN1cHBvcnQgbXVsdGljYXN0IHRyYW5zbWlzc2lvbiBvZiBTT0FQIGVudmVsb3BlcyBjYXJyaWVkIGluIHVzZXIgZGF0YWdyYW1zLgorKiBTdXBwb3J0IGJvdGggU09BUCAxLjEgYW5kIFNPQVAgMS4yIGVudmVsb3Blcy4KKworVGhlIFNPQVAtb3Zlci1VRFAgc3BlY2lmaWNhdGlvbiBjYW4gYmUgZm91bmQgYXQ6CisKK2h0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9kZWZhdWx0LmFzcD91cmw9L2xpYnJhcnkvZW4tdXMvZG5nbG9ic3BlYy9odG1sL3NvYXAtb3Zlci11ZHAuYXNwCisKK0ZlYXR1cmVzCistLS0tLS0tLQorCitUaGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgZmVhdHVyZXMgYXJlIGFsc28gYXZhaWxhYmxlOgorCisqIFpsaWIvZ3ppcCBtZXNzYWdlIGNvbXByZXNzaW9uIChjb21waWxlIC1EV0lUSF9HWklQKS4KKyogU09BUCB3aXRoIERJTUUgYXR0YWNobWVudHMgb3ZlciBVRFAuCisqIFNPQVAgd2l0aCBNSU1FIGF0dGFjaG1lbnRzIChTd0EpIG92ZXIgVURQLgorKiBTdXBwb3J0IGZvciBJUHY2IChjb21waWxlIC1EV0lUSF9JUFY2KQorCitNZXNzYWdlIHJldHJhbnNtaXNzaW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JldHJhbnNtaXNzaW9uIGlzIGltcGxlbWVudGVkIHVzaW5nIGEgcmV0cnkgYW5kIGV4cG9uZW50aWFsIGJhY2stb2ZmIGFsZ29yaXRobQorYXMgcGVyIFNPQVAtb3Zlci1VRFAgcmV0cmFuc21pc3Npb24gcmVxdWlyZW1lbnRzLCBzZWUgU09BUC1vdmVyLVVEUCBBcHBlbmRpeCBJLgorCitEdXBsaWNhdGUgbWVzc2FnZSBkZXRlY3Rpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgdXNlciBpcyByZXNwb25zaWJsZSBmb3IgaW1wbGVtZW50aW5nIGEgZHVwbGljYXRlIG1lc3NhZ2UgZGV0ZWN0aW9uCithbGdvcml0aG0sIHNlZSBTT0FQLW92ZXItVURQIEFwcGVuZGl4IElJLiBBbiBleGFtcGxlIGFsZ29yaXRobSBpcyBnaXZlbiBpbgordWRwc2VydmVyLmMKKworVXNhZ2UKKy0tLS0tCisKK05vdGU6IFVEUCBzdXBwb3J0IHJlcXVpcmVzIGNvbXBpbGF0aW9uIHdpdGggLURXSVRIX1VEUAorCisqIEhlYWRlciBmaWxlOgorCisvL2dzb2FwIHdzYSBzY2hlbWEgaW1wb3J0OiBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmcKKyNpbXBvcnQgIndhcy5oIgorc3RydWN0IFNPQVBfRU5WX19IZWFkZXIKK3sgbXVzdFVuZGVyc3RhbmQgd3NhX19BdHRyaWJ1dGVkVVJJICAgICAgICAgICAgICAgICAgICAgd3NhX19NZXNzYWdlSUQgIDA7CisgIG11c3RVbmRlcnN0YW5kIHN0cnVjdCB3c2FfX1JlbGF0aW9uc2hpcCAgICAgICAgICAgICAgICp3c2FfX1JlbGF0ZXNUbyAwOworICBtdXN0VW5kZXJzdGFuZCBzdHJ1Y3Qgd3NhX19FbmRwb2ludFJlZmVyZW5jZVR5cGUgICAgICAqd3NhX19Gcm9tICAgICAgMDsKKyAgbXVzdFVuZGVyc3RhbmQgc3RydWN0IHdzYV9fRW5kcG9pbnRSZWZlcmVuY2VUeXBlICAgICAgKndzYV9fUmVwbHlUbyAgIDA7CisgIG11c3RVbmRlcnN0YW5kIHN0cnVjdCB3c2FfX0VuZHBvaW50UmVmZXJlbmNlVHlwZSAgICAgICp3c2FfX0ZhdWx0VG8gICAwOworICBtdXN0VW5kZXJzdGFuZCBzdHJ1Y3Qgd3NhX19FbmRwb2ludFJlZmVyZW5jZVR5cGUgICAgICAqd3NhX19SZWNpcGllbnQgMDsKKyAgbXVzdFVuZGVyc3RhbmQgd3NhX19BdHRyaWJ1dGVkVVJJICAgICAgICAgICAgICAgICAgICAgd3NhX19UbyAgICAgICAgIDA7CisgIG11c3RVbmRlcnN0YW5kIHdzYV9fQXR0cmlidXRlZFVSSSAgICAgICAgICAgICAgICAgICAgIHdzYV9fQWN0aW9uICAgICAwOworfTsKKy4uLiB5b3VyIGRlY2xhcmF0aW9ucyBnbyBoZXJlIChyZXF1ZXN0LXJlc3BvbnNlIGFuZCBvbmUtd2F5KSAuLi4KKy4uLiBmb3IgZXhhbXBsZToKKyAgICBpbnQgbnNfX2VjaG9TdHJpbmcoY2hhciAqc3RyLCBjaGFyICoqcmVzKTsKKyAgICBpbnQgbnNfX3NlbmRTdHJpbmcoY2hhciAqc3RyLCB2b2lkKTsKKyAgICBpbnQgbnNfX3NlbmRTdHJpbmdSZXNwb25zZShjaGFyICpyZXMsIHZvaWQpOworCisqIENsaWVudC1zaWRlIG9uZS13YXkgdW5pY2FzdC9tdWx0aWNhc3Q6CisgIHN0cnVjdCBzb2FwIHNvYXA7CisgIHN0cnVjdCBTT0FQX0VOVl9fSGVhZGVyIGhlYWRlcjsKKyAgc29hcF9pbml0KCZzb2FwKTsKKyAgaWYgKG11bHRpY2FzdCkKKyAgICBzb2FwLmNvbm5lY3RfZmxhZ3MgPSBTT19CUk9BRENBU1Q7CisgIHNvYXAuc2VuZF90aW1lb3V0ID0gMTsgLy8gMXMgdGltZW91dAorICBzb2FwX2RlZmF1bHRfU09BUF9FTlZfX0hlYWRlcigmc29hcCwgJmhlYWRlcik7CisgIHNvYXAuaGVhZGVyID0gJmhlYWRlcjsKKyAgaGVhZGVyLndzYV9fTWVzc2FnZUlEID0gIjxtZXNzYWdlIElEPiI7CisgIGhlYWRlci53c2FfX1RvID0gIjxzZXJ2ZXIgVVJMPiI7CisgIGhlYWRlci53c2FfX0FjdGlvbiA9ICI8c2VydmVyIGFjdGlvbj4iOworICBpZiAoc29hcF9zZW5kX25zX19lY2hvU3RyaW5nKCZzb2FwLCAic29hcC51ZHA6Ly8uLi4iLCBOVUxMLCAiaGVsbG8gd29ybGQhIikpCisgICAgc29hcF9wcmludF9mYXVsdCgmc29hcCwgc3RkZXJyKTsKKyAgc29hcF9lbmQoJnNvYXApOyAvLyBjbGVhbnVwCisgIHNvYXBfZGVzdHJveSgmc29hcCk7IC8vIGNsZWFudXAKKyAgc29hcF9kb25lKCZzb2FwKTsgLy8gY2xvc2UgY29ubmVjdGlvbiAoc2hvdWxkIG5vdCB1c2Ugc29hcCBzdHJ1Y3QgYWZ0ZXIgdGhpcykKKworKiBDbGllbnQtc2lkZSByZXF1ZXN0LXJlc3BvbnNlIHVuaWNhc3Q6CisgIHN0cnVjdCBzb2FwIHNvYXA7CisgIHN0cnVjdCBTT0FQX0VOVl9fSGVhZGVyIGhlYWRlcjsKKyAgc3RydWN0IHdzYV9fRW5kcG9pbnRSZWZlcmVuY2VUeXBlIHJlcGx5VG87CisgIGNoYXIgKnJlczsKKyAgc29hcF9pbml0KCZzb2FwKTsKKyAgc29hcC5zZW5kX3RpbWVvdXQgPSAxOyAvLyAxcyB0aW1lb3V0CisgIHNvYXAucmVjdl90aW1lb3V0ID0gMTsgLy8gMXMgdGltZW91dAorICBzb2FwX2RlZmF1bHRfU09BUF9FTlZfX0hlYWRlcigmc29hcCwgJmhlYWRlcik7CisgIHNvYXAuaGVhZGVyID0gJmhlYWRlcjsKKyAgc29hcF9kZWZhdWx0X3dzYV9fRW5kcG9pbnRSZWZlcmVuY2VUeXBlKCZzb2FwLCAmcmVwbHlUbyk7CisgIHJlcGx5VG8uQWRkcmVzcyA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3Npbmcvcm9sZS9hbm9ueW1vdXMiOworICBoZWFkZXIud3NhX19NZXNzYWdlSUQgPSAiPG1lc3NhZ2UgSUQ+IjsKKyAgaGVhZGVyLndzYV9fVG8gPSAiPHNlcnZlciBVUkw+IjsKKyAgaGVhZGVyLndzYV9fQWN0aW9uID0gIjxzZXJ2ZXIgYWN0aW9uPiI7CisgIGhlYWRlci53c2FfX1JlcGx5VG8gPSAmcmVwbHlUbzsKKyAgaWYgKHNvYXBfY2FsbF9uc19fZWNob1N0cmluZygmc29hcCwgInNvYXAudWRwOi8vLi4uIiwgTlVMTCwgImhlbGxvIHdvcmxkISIsICZyZXMpKQorICB7IGlmIChzb2FwLmVycm9yID09IFNPQVBfRU9GICYmIHNvYXAuZXJybnVtID09IDApCisgICAgICBwcmludGYoIlRpbWVvdXQ6IG1lc3NhZ2UgcHJvYmFibHkgYWxyZWFkeSBkZWxpdmVyZWRcbiIpOworICAgIGVsc2UKKyAgICAgIHNvYXBfcHJpbnRfZmF1bHQoJnNvYXAsIHN0ZGVycik7CisgIH0KKyAgZWxzZQorICAgIHByaW50ZigiVURQIHNlcnZlciByZXNwb25zZTogJXNcbiIsIHJlcyk7CisgIHNvYXBfZW5kKCZzb2FwKTsgLy8gY2xlYW51cAorICBzb2FwX2Rlc3Ryb3koJnNvYXApOyAvLyBjbGVhbnVwCisgIHNvYXBfZG9uZSgmc29hcCk7IC8vIGNsb3NlIGNvbm5lY3Rpb24gKHNob3VsZCBub3QgdXNlIHNvYXAgc3RydWN0IGFmdGVyIHRoaXMpCisKKyogQ2xpZW50LXNpZGUgcmVxdWVzdC1yZXNwb25zZSBtdWx0aWNhc3Q6CisgIHN0cnVjdCBzb2FwIHNvYXA7CisgIHN0cnVjdCBTT0FQX0VOVl9fSGVhZGVyIGhlYWRlcjsKKyAgc3RydWN0IHdzYV9fRW5kcG9pbnRSZWZlcmVuY2VUeXBlIHJlcGx5VG87CisgIGNoYXIgKnJlczsKKyAgc29hcF9pbml0KCZzb2FwKTsKKyAgc29hcC5jb25uZWN0X2ZsYWdzID0gU09fQlJPQURDQVNUOworICBzb2FwLnNlbmRfdGltZW91dCA9IDE7IC8vIDFzIHRpbWVvdXQKKyAgc29hcC5yZWN2X3RpbWVvdXQgPSAxOyAvLyAxcyB0aW1lb3V0CisgIHNvYXBfZGVmYXVsdF9TT0FQX0VOVl9fSGVhZGVyKCZzb2FwLCAmaGVhZGVyKTsKKyAgc29hcC5oZWFkZXIgPSAmaGVhZGVyOworICBzb2FwX2RlZmF1bHRfd3NhX19FbmRwb2ludFJlZmVyZW5jZVR5cGUoJnNvYXAsICZyZXBseVRvKTsKKyAgcmVwbHlUby5BZGRyZXNzID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZy9yb2xlL2Fub255bW91cyI7CisgIGhlYWRlci53c2FfX01lc3NhZ2VJRCA9ICI8bWVzc2FnZSBJRD4iOworICBoZWFkZXIud3NhX19UbyA9ICI8c2VydmVyIFVSTD4iOworICBoZWFkZXIud3NhX19BY3Rpb24gPSAiPHNlcnZlciBhY3Rpb24+IjsKKyAgaGVhZGVyLndzYV9fUmVwbHlUbyA9ICZyZXBseVRvOworICBpZiAoc29hcF9zZW5kX25zX19lY2hvU3RyaW5nKCZzb2FwLCAic29hcC51ZHA6Ly8uLi4iLCBOVUxMLCAiaGVsbG8gd29ybGQhIikpCisgICAgc29hcF9wcmludF9mYXVsdCgmc29hcCwgc3RkZXJyKTsKKyAgZWxzZQorICB7IGZvciAoOzspCisgICAgeyBpZiAoc29hcF9yZWN2X25zX19zZW5kU3RyaW5nUmVzcG9uc2UoJnNvYXAsICZyZXMpKQorICAgICAgICBicmVhazsKKyAgICAgIHByaW50ZigiTXVsdGljYXN0IHJlc3BvbnNlOiAlc1xuIiwgcmVzKTsKKyAgICB9CisgICAgaWYgKHNvYXAuZXJyb3IgPT0gU09BUF9FT0YgJiYgc29hcC5lcnJudW0gPT0gMCkKKyAgICAgIHByaW50ZigiVGltZW91dDogbm8gbW9yZSBtZXNzYWdlcyByZWNlaXZlZFxuIik7CisgICAgZWxzZQorICAgICAgc29hcF9wcmludF9mYXVsdCgmc29hcCwgc3RkZXJyKTsKKyAgfQorICBzb2FwX2VuZCgmc29hcCk7IC8vIGNsZWFudXAKKyAgc29hcF9kZXN0cm95KCZzb2FwKTsgLy8gY2xlYW51cAorICBzb2FwX2RvbmUoJnNvYXApOyAvLyBjbG9zZSBjb25uZWN0aW9uIChzaG91bGQgbm90IHVzZSBzb2FwIHN0cnVjdCBhZnRlciB0aGlzKQorCisKKyogU2VydmVyLXNpZGUKKyAgc3RydWN0IHNvYXAgc29hcDsKKyAgc29hcF9pbml0MSgmc29hcCwgU09BUF9JT19VRFApOyAvLyBtdXN0IHNldCBVRFAgZmxhZworICBpZiAoIXNvYXBfdmFsaWRfc29ja2V0KHNvYXBfYmluZCgmc29hcCwgaG9zdCwgcG9ydCwgMTAwKSkpCisgIHsgc29hcF9wcmludF9mYXVsdCgmc29hcCwgc3RkZXJyKTsKKyAgICBleGl0KDEpOworICB9CisgIGZvciAoOzspCisgIHsgaWYgKHNvYXBfc2VydmUoJnNvYXApKQorICAgICAgc29hcF9wcmludF9mYXVsdCgmc29hcCwgc3RkZXJyKTsgLy8ganVzdCByZXBvcnQgdGhlIHByb2JsZW0KKyAgICBzb2FwX2Rlc3Ryb3koJnNvYXApOworICAgIHNvYXBfZW5kKCZzb2FwKTsKKyAgfQorICBzb2FwX2RvbmUoJnNvYXApOyAvLyBjbG9zZSBjb25uZWN0aW9uCisgIC4uLgorICBpbnQgbnNfX2VjaG9TdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnN0ciwgY2hhciAqKnJlcykKKyAgeyBpZiAoIXNvYXAtPmhlYWRlcikKKyAgICAgIHJldHVybiBzb2FwX3NlbmRlcl9mYXVsdChzb2FwLCAiTm8gU09BUCBoZWFkZXIiLCBOVUxMKTsKKyAgICBpZiAoIXNvYXAtPmhlYWRlci0+d3NhX19NZXNzYWdlSUQpCisgICAgICByZXR1cm4gc29hcF9zZW5kZXJfZmF1bHQoc29hcCwgIk5vIFdTLUFkZHJlc3NpbmcgTWVzc2FnZUlEIiwgTlVMTCk7CisgICAgc29hcC0+aGVhZGVyLT53c2FfX1JlbGF0ZXNUbyA9IChzdHJ1Y3Qgd3NhX19SZWxhdGlvbnNoaXAqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3Qgd3NhX19SZWxhdGlvbnNoaXApKTsKKyAgICBzb2FwX2RlZmF1bHRfd3NhX19SZWxhdGlvbnNoaXAoc29hcCwgc29hcC0+aGVhZGVyLT53c2FfX1JlbGF0ZXNUbyk7CisgICAgc29hcC0+aGVhZGVyLT53c2FfX1JlbGF0ZXNUby0+X19pdGVtID0gc29hcC0+aGVhZGVyLT53c2FfX01lc3NhZ2VJRDsKKyAgICAvLyBtdXN0IGNoZWNrIGZvciBkdXBsaWNhdGUgbWVzc2FnZXMKKyAgICBpZiAoY2hlY2tfcmVjZWl2ZWQoc29hcC0+aGVhZGVyLT53c2FfX01lc3NhZ2VJRCkpCisgICAgeyBwcmludGYoIlJlcXVlc3QgbWVzc2FnZSAlcyBhbHJlYWR5IHJlY2VpdmVkXG4iLCBzb2FwLT5oZWFkZXItPndzYV9fTWVzc2FnZUlEKTsKKyAgICAgIHJldHVybiBTT0FQX1NUT1A7IC8vIGRvbid0IHJldHVybiByZXNwb25zZQorICAgIH0KKyAgICBpZiAoIXNvYXAtPmhlYWRlci0+d3NhX19SZXBseVRvIHx8ICFzb2FwLT5oZWFkZXItPndzYV9fUmVwbHlUby0+QWRkcmVzcykKKyAgICAgIHJldHVybiBzb2FwX3NlbmRlcl9mYXVsdChzb2FwLCAiTm8gV1MtQWRkcmVzc2luZyBSZXBseVRvIGFkZHJlc3MiLCBOVUxMKTsKKyAgICBzb2FwLT5oZWFkZXItPndzYV9fVG8gPSBzb2FwLT5oZWFkZXItPndzYV9fUmVwbHlUby0+QWRkcmVzczsKKyAgICBzb2FwLT5oZWFkZXItPndzYV9fTWVzc2FnZUlEID0gc29hcF9zdHJkdXAoc29hcCwgc29hcF9pbnQycyhzb2FwLAoraWRfY291bnQrKykpIDsKKyAgICBzb2FwLT5oZWFkZXItPndzYV9fQWN0aW9uID0gImh0dHA6Ly9nZW5pdmlhLmNvbS91ZHAvZWNob1N0cmluZ1Jlc3BvbnNlIjsKKyAgICAqcmVzID0gc3RyOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIC4uLgorICBpbnQgbnNfX3NlbmRTdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnN0cikKKyAgeyBpZiAoIXNvYXAtPmhlYWRlcikKKyAgICAgIHJldHVybiBTT0FQX1NUT1A7CisgICAgaWYgKCFzb2FwLT5oZWFkZXItPndzYV9fTWVzc2FnZUlEKQorICAgICAgcmV0dXJuIFNPQVBfU1RPUDsKKyAgICAvLyBtdXN0IGNoZWNrIGZvciBkdXBsaWNhdGUgbWVzc2FnZXMKKyAgICBpZiAoY2hlY2tfcmVjZWl2ZWQoc29hcC0+aGVhZGVyLT53c2FfX01lc3NhZ2VJRCkpCisgICAgICByZXR1cm4gU09BUF9TVE9QOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIC4uLgorICBpbnQgbnNfX3NlbmRTdHJpbmdSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqcmVzKQorICB7IHJldHVybiBTT0FQX05PX01FVEhPRDsgfSAvLyB3ZSBkb24ndCBleHBlY3QgdG8gc2VydmUgdGhpcyBtZXNzYWdlCisKK0J1aWx0IHN0ZXBzCistLS0tLS0tLS0tLQorCitJbXBvcnRhbnQ6IFRvIGJ1aWxkIFNPQVAtb3Zlci1VRFAgY2xpZW50IGFuZCBzZXJ2ZXIgYXBwbGljYXRpb25zLCB5b3UgTVVTVAorY29tcGlsZSBhbGwgc291cmNlcyB1c2luZyB0aGUgLURXSVRIX1VEUCBjb21waWxlciBvcHRpb24uCisKK0EgTWFrZWZpbGUgaXMgaW5jbHVkZWQgdG8gYnVpbGQgY2xpZW50IGFuZCBzZXJ2ZXIgYXBwbGljYXRpb25zLgorCitUbyBidWlsZCB0aGUgZXhhbXBsZSBjbGllbnQ6CittYWtlIHVkcGNsaWVudAorCitUbyBidWlsZCB0aGUgZXhhbXBsZSBzZXJ2ZXI6CittYWtlIHVkcHNlcnZlcgorCitUbyBnZW5lcmF0ZSB0aGUgd3NhLmggZmlsZToKKword3NkbDJoIC1jIC10IC4uLy4uL1dTL1dTLXR5cGVtYXAuZGF0IC1vIHdzYS5oIGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZworCitUaGVuIG1hbnVhbGx5IHJlcGxhY2UgaW4gV1MtQWRkcmVzc2luZy5oCisvL2dzb2Fwb3B0IGN3Cit3aXRoCisvL2dzb2Fwb3B0IGMKK3RvIGVuc3VyZSAud3NkbCBhbmQgLnhzZCBmaWxlcyBhcmUgZ2VuZXJhdGVkIGZvciB5b3VyIFdlYiBzZXJ2aWNlCithcHBsaWNhdGlvbnMuCisKK0V4YW1wbGUgcnVuCistLS0tLS0tLS0tLQorCitTdGFydCB1ZHBzZXJ2ZXIgaW4gYSBzaGVsbCB3aW5kb3cgKHdpbmRvdyAxKToKKyQgLi91ZHBzZXJ2ZXIKKworRXhlY3V0ZSB1ZHBjbGllbnQgaW4gYW5vdGhlciBzaGVsbCB3aW5kb3cgKHdpbmRvdyAyKToKKyQgLi91ZHBjbGllbnQKKworV2luZG93IDEgZGlzcGxheXMgKHNlcnZlcik6CisKK0FjY2VwdGluZyByZXF1ZXN0cy4uLgorUmVxdWVzdCBtZXNzYWdlIGlkMSBhY2NlcHRlZAorUmVzcG9uc2UgbWVzc2FnZSAxIHJldHVybmVkCitBY2NlcHRpbmcgcmVxdWVzdHMuLi4KK09uZS13YXkgbWVzc2FnZSBpZDIgYWNjZXB0ZWQgYW5kIHNlcnZpY2VkCitBY2NlcHRpbmcgcmVxdWVzdHMuLi4KKworV2luZG93IDIgZGlzcGxheXMgKGNsaWVudCk6CisKK1VEUCBzZXJ2ZXIgcmVzcG9uc2U6IGhlbGxvIHdvcmxkIQorCitSZS1leGVjdXRlIHRoZSB1ZHBjbGllbnQgKHdpbmRvdyAyKToKKyQgLi91ZHBjbGllbnQKKworV2luZG93IDEgZGlzcGxheXMgKHNlcnZlcik6CisKK1JlcXVlc3QgbWVzc2FnZSBpZDEgYWxyZWFkeSByZWNlaXZlZAorU09BUCBGQVVMVDogU09BUC1FTlY6Q2xpZW50CisiU3RvcHBlZDogbm8gcmVzcG9uc2Ugc2VudCIKK0FjY2VwdGluZyByZXF1ZXN0cy4uLgorT25lLXdheSBtZXNzYWdlIGlkMiBhbHJlYWR5IHJlY2VpdmVkCitBY2NlcHRpbmcgcmVxdWVzdHMuLi4KKworV2luZG93IDIgZGlzcGxheXMgKGNsaWVudCk6CisKK1RpbWVvdXQ6IG1lc3NhZ2UgcHJvYmFibHkgYWxyZWFkeSBkZWxpdmVyZWQKKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy91ZHAvdWRwLmggYi9zYW1wbGVzL3VkcC91ZHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzFjZWY4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy91ZHAvdWRwLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisKK3VkcC5oCisKK1NPQVAtb3Zlci1VRFAgZGVtbyBzcGVjaWZpY2F0aW9uIGZvciB1ZHBjbGllbnQgYW5kIHVkcHNlcnZlciBleGFtcGxlcworCitSZXF1aXJlcyBXUy1BZGRyZXNzaW5nIGZyb20gaW1wb3J0L3dzYS5oCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR3byBsaWNlbnNlczoKK0dQTCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwlJbXBvcnQgV1MtQWRkcmVzc2luZworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vZ3NvYXAgd3NhIHNjaGVtYSBpbXBvcnQ6IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZworCisjaW1wb3J0ICJ3c2EuaCIJCS8vIHdzYS5oIGlzIGluIHRoZSBpbXBvcnQgZGlyZWN0b3J5CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JRGVtbyBVRFAgc2VydmljZQorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vZ3NvYXAgbnMgc2VydmljZSBuYW1lOgl1ZHAKKy8vZ3NvYXAgbnMgc2VydmljZSBuYW1lc3BhY2U6CXVybjpnc29hcC11ZHAtZGVtbworLy9nc29hcCBucyBzZXJ2aWNlIGxvY2F0aW9uOglzb2FwLnVkcDovL2xvY2FsaG9zdDoxMDAwMAorCisvLwlJIHdvdWxkIGFzc3VtZSBVRFAgdHJhbnNwb3J0IHRvIGJlIGRlZmluZWQgaW4gdGhlIFdTREwgYmluZGluZ3MsIGJ1dAorLy8JdGhpcyBkb2Vzbid0IGFwcGVhciB0byBiZSBwb3NzaWJsZSwgc28gd2Ugd2lsbCB1c2UgdGhlIGRlZmF1bHQgSFRUUAorLy8JdHJhbnNwb3J0IGJpbmRpbmcgYW5kIG9taXQgdGhlIHRyYW5zcG9ydCBkaXJlY3RpdmUgYmVsb3cuCisvLwlnc29hcCBucyBzZXJ2aWNlIHRyYW5zcG9ydDoJLi4uID8/PworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCVNPQVAtb3Zlci1VRFAgU09BUCBIZWFkZXJzIHdpdGggV1MtQWRkcmVzc2luZworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0cnVjdCBTT0FQX0VOVl9fSGVhZGVyCit7CisgIG11c3RVbmRlcnN0YW5kIF93c2FfX01lc3NhZ2VJRCAgICAgIHdzYV9fTWVzc2FnZUlEIDA7IC8vLzwgV1MtQWRkcmVzc2luZworICBtdXN0VW5kZXJzdGFuZCBfd3NhX19SZWxhdGVzVG8gICAgICp3c2FfX1JlbGF0ZXNUbyAwOyAvLy88IFdTLUFkZHJlc3NpbmcKKyAgbXVzdFVuZGVyc3RhbmQgX3dzYV9fRnJvbSAgICAgICAgICAqd3NhX19Gcm9tICAgICAgMDsgLy8vPCBXUy1BZGRyZXNzaW5nCisgIG11c3RVbmRlcnN0YW5kIF93c2FfX1JlcGx5VG8gICAgICAgKndzYV9fUmVwbHlUbyAgIDA7IC8vLzwgV1MtQWRkcmVzc2luZworICBtdXN0VW5kZXJzdGFuZCBfd3NhX19GYXVsdFRvICAgICAgICp3c2FfX0ZhdWx0VG8gICAwOyAvLy88IFdTLUFkZHJlc3NpbmcKKyAgbXVzdFVuZGVyc3RhbmQgX3dzYV9fVG8gICAgICAgICAgICAgd3NhX19UbyAgICAgICAgMDsgLy8vPCBXUy1BZGRyZXNzaW5nCisgIG11c3RVbmRlcnN0YW5kIF93c2FfX0FjdGlvbiAgICAgICAgIHdzYV9fQWN0aW9uICAgIDA7IC8vLzwgV1MtQWRkcmVzc2luZworfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwllY2hvU3RyaW5nIChhbm9ueW1vdXMpIHJlcXVlc3QtcmVzcG9uc2UgTUVQIG92ZXIgVURQCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy9nc29hcCBucyBzZXJ2aWNlIG1ldGhvZC1kb2N1bWVudGF0aW9uOiBlY2hvU3RyaW5nIERlbW8gKGFub255bW91cykgcmVxdWVzdC1yZXNwb25zZSBNRVAgb3ZlciBVRFAKKworLy9nc29hcCBucyBzZXJ2aWNlIG1ldGhvZC1oZWFkZXItcGFydDoJCWVjaG9TdHJpbmcgd3NhX19NZXNzYWdlSUQKKy8vZ3NvYXAgbnMgc2VydmljZSBtZXRob2QtaGVhZGVyLXBhcnQ6CQllY2hvU3RyaW5nIHdzYV9fVG8KKy8vZ3NvYXAgbnMgc2VydmljZSBtZXRob2QtaGVhZGVyLXBhcnQ6CQllY2hvU3RyaW5nIHdzYV9fQWN0aW9uCisvL2dzb2FwIG5zIHNlcnZpY2UgbWV0aG9kLWlucHV0LWhlYWRlci1wYXJ0OglzZW5kU3RyaW5nIHdzYV9fUmVwbHlUbworLy9nc29hcCBucyBzZXJ2aWNlIG1ldGhvZC1vdXRwdXQtaGVhZGVyLXBhcnQ6CWVjaG9TdHJpbmcgd3NhX19SZWxhdGVzVG8KKworaW50IG5zX19lY2hvU3RyaW5nKGNoYXIgKnN0ciwgY2hhciAqKnJlcyk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8Jc2VuZFN0cmluZyBvbmUtd2F5IE1FUCBvdmVyIFVEUAorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vZ3NvYXAgbnMgc2VydmljZSBtZXRob2QtZG9jdW1lbnRhdGlvbjogc2VuZFN0cmluZyBEZW1vIG9uZS13YXkgTUVQIG92ZXIgVURQCisKKy8vZ3NvYXAgbnMgc2VydmljZSBtZXRob2QtaGVhZGVyLXBhcnQ6CQlzZW5kU3RyaW5nIHdzYV9fTWVzc2FnZUlECisvL2dzb2FwIG5zIHNlcnZpY2UgbWV0aG9kLWhlYWRlci1wYXJ0OgkJc2VuZFN0cmluZyB3c2FfX1RvCisvL2dzb2FwIG5zIHNlcnZpY2UgbWV0aG9kLWhlYWRlci1wYXJ0OgkJc2VuZFN0cmluZyB3c2FfX0FjdGlvbgorCitpbnQgbnNfX3NlbmRTdHJpbmcoY2hhciAqc3RyLCB2b2lkKTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvdWRwL3VkcGNsaWVudC5jIGIvc2FtcGxlcy91ZHAvdWRwY2xpZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ3NTI0NAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvdWRwL3VkcGNsaWVudC5jCkBAIC0wLDAgKzEsMTEwIEBACisvKgorCit1ZHBjbGllbnQuYworCitTT0FQLW92ZXItVURQIGRlbW8gY2xpZW50CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR3byBsaWNlbnNlczoKK0dQTCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2luY2x1ZGUgInNvYXBILmgiCisjaW5jbHVkZSAidWRwLm5zbWFwIgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7IHN0cnVjdCBzb2FwIHNvYXA7CisgIHN0cnVjdCBTT0FQX0VOVl9fSGVhZGVyIGhlYWRlcjsKKyAgc3RydWN0IHdzYV9fRW5kcG9pbnRSZWZlcmVuY2VUeXBlIHJlcGx5VG87CisgIGNoYXIgKnJlczsKKyAgY2hhciAqbWlkMSA9ICJpZDEiOworICBjaGFyICptaWQyID0gImlkMiI7CisKKyAgaWYgKGFyZ2MgPiAxKQorICAgIG1pZDEgPSBhcmd2WzFdOworICBpZiAoYXJnYyA+IDIpCisgICAgbWlkMiA9IGFyZ3ZbMl07CisKKyAgc29hcF9pbml0KCZzb2FwKTsKKworICBzb2FwLnNlbmRfdGltZW91dCA9IDE7CisgIHNvYXAucmVjdl90aW1lb3V0ID0gMTsKKworICAvKiBUbyBjb21wcmVzcyB0aGUgcmVxdWVzdCBtZXNzYWdlIChjb21waWxlIHdpdGggLURXSVRIX0daSVApOgorICBzb2FwX3NldF9vbW9kZSgmc29hcCwgU09BUF9FTkNfWkxJQik7CisgICovCisKKyAgLyogVG8gdHJhbnNtaXQgRElNRSBhdHRhY2htZW50czoKKyAgc29hcF9zZXRfZGltZSgmc29hcCk7CisgIHNvYXBfc2V0X2RpbWVfYXR0YWNobWVudCgmc29hcCwgImFiYyIsIDMsICJjaWQ6YWJjIiwgInRleHQveG1sIiwgMCwgTlVMTCk7CisgICovCisKKyAgLyogVG8gdHJhbnNtaXQgTUlNRSBhdHRhY2htZW50czoKKyAgc29hcF9zZXRfbWltZSgmc29hcCwgTlVMTCwgTlVMTCk7CisgIHNvYXBfc2V0X21pbWVfYXR0YWNobWVudCgmc29hcCwgImFiYyIsIDMsIFNPQVBfTUlNRV83QklULCAidGV4dC94bWwiLCAiY2lkOmFiYyIsIE5VTEwsIE5VTEwpOworICAqLworCisgIC8qIFByZXBhcmUgU09BUCBIZWFkZXIgKi8KKyAgc29hcF9kZWZhdWx0X1NPQVBfRU5WX19IZWFkZXIoJnNvYXAsICZoZWFkZXIpOworICBzb2FwLmhlYWRlciA9ICZoZWFkZXI7CisKKyAgc29hcF9kZWZhdWx0X3dzYV9fRW5kcG9pbnRSZWZlcmVuY2VUeXBlKCZzb2FwLCAmcmVwbHlUbyk7CisgIHJlcGx5VG8uQWRkcmVzcyA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3Npbmcvcm9sZS9hbm9ueW1vdXMiOworCisgIC8qIFNldCBXUy1BZGRyZXNzaW5nIGVsZW1lbnRzIGZvciByZXF1ZXN0LXJlc3BvbnNlIHVuaWNhc3QgKi8KKyAgaGVhZGVyLndzYV9fTWVzc2FnZUlEID0gbWlkMTsKKyAgaGVhZGVyLndzYV9fVG8gPSAiaHR0cDovL2dlbml2aWEuY29tL3VkcC9zZXJ2ZXIiOworICBoZWFkZXIud3NhX19BY3Rpb24gPSAiaHR0cDovL2dlbml2aWEuY29tL3VkcC9lY2hvU3RyaW5nIjsKKyAgaGVhZGVyLndzYV9fUmVwbHlUbyA9ICZyZXBseVRvOworCisgIC8qIE1ha2UgcmVxdWVzdC1yZXNwb25zZSBjYWxsICovCisgIGlmIChzb2FwX2NhbGxfbnNfX2VjaG9TdHJpbmcoJnNvYXAsIE5VTEwsIE5VTEwsICJoZWxsbyB3b3JsZCEiLCAmcmVzKSkKKyAgeyBpZiAoc29hcC5lcnJvciA9PSBTT0FQX0VPRiAmJiBzb2FwLmVycm51bSA9PSAwKQorICAgICAgcHJpbnRmKCJUaW1lb3V0OiBtZXNzYWdlIHByb2JhYmx5IGFscmVhZHkgZGVsaXZlcmVkXG4iKTsKKyAgICBlbHNlCisgICAgICBzb2FwX3ByaW50X2ZhdWx0KCZzb2FwLCBzdGRlcnIpOworICB9CisgIGVsc2UKKyAgICBwcmludGYoIlVEUCBzZXJ2ZXIgcmVzcG9uc2U6ICVzXG4iLCByZXMpOworCisgIC8qIFJlc2V0IHRoZSBTT0FQIEhlYWRlciAqLworICBzb2FwX2RlZmF1bHRfU09BUF9FTlZfX0hlYWRlcigmc29hcCwgJmhlYWRlcik7CisgIHNvYXAuaGVhZGVyID0gJmhlYWRlcjsKKworICAvKiBTZXQgV1MtQWRkcmVzc2luZyBlbGVtZW50cyBmb3Igb25lLXdheSB1bmljYXN0ICovCisgIGhlYWRlci53c2FfX01lc3NhZ2VJRCA9IG1pZDI7CisgIGhlYWRlci53c2FfX1RvID0gImh0dHA6Ly9nZW5pdmlhLmNvbS91ZHAvc2VydmVyIjsKKyAgaGVhZGVyLndzYV9fQWN0aW9uID0gImh0dHA6Ly9nZW5pdmlhLmNvbS91ZHAvc2VuZFN0cmluZyI7CisKKyAgLyogU2VuZCBvbmUtd2F5IG1lc3NhZ2UgKi8KKyAgaWYgKHNvYXBfc2VuZF9uc19fc2VuZFN0cmluZygmc29hcCwgTlVMTCwgTlVMTCwgImhlbGxvIHdvcmxkISIpKQorICAgIHNvYXBfcHJpbnRfZmF1bHQoJnNvYXAsIHN0ZGVycik7CisKKyAgc29hcF9lbmQoJnNvYXApOworICBzb2FwX2RvbmUoJnNvYXApOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy91ZHAvdWRwc2VydmVyLmMgYi9zYW1wbGVzL3VkcC91ZHBzZXJ2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTYwYmY4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy91ZHAvdWRwc2VydmVyLmMKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisKK3VkcHNlcnZlci5jCisKK1NPQVAtb3Zlci1VRFAgZGVtbyBzZXJ2ZXIKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMS0yMDA0LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzOgorR1BMIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaW5jbHVkZSAic29hcEguaCIKKyNpbmNsdWRlICJ1ZHAubnNtYXAiCisKKyNkZWZpbmUgTUFYX0hJU1RPUlkgKDEwMDApCisKK2NoYXIgKnJlY2VpdmVkX2lkW01BWF9ISVNUT1JZXTsKK2ludCBsYXN0X3JlY2VpdmVkOwordm9pZCBpbml0X3JlY2VpdmVkKCk7CitpbnQgY2hlY2tfcmVjZWl2ZWQoY29uc3QgY2hhciAqaWQpOworCitpbnQgaWRfY291bnQgPSAxOworCitpbnQgbWFpbigpCit7IHN0cnVjdCBzb2FwIHNvYXA7CisgIGluaXRfcmVjZWl2ZWQoKTsKKyAgc29hcF9pbml0MSgmc29hcCwgU09BUF9JT19VRFApOworICBpZiAoIXNvYXBfdmFsaWRfc29ja2V0KHNvYXBfYmluZCgmc29hcCwgTlVMTCwgMTAwMDAsIDEwMCkpKQorICB7IHNvYXBfcHJpbnRfZmF1bHQoJnNvYXAsIHN0ZGVycik7CisgICAgZXhpdCgxKTsKKyAgfQorICBmb3IgKDs7KQorICB7IHByaW50ZigiQWNjZXB0aW5nIHJlcXVlc3RzLi4uXG4iKTsKKyAgICBpZiAoc29hcF9zZXJ2ZSgmc29hcCkpCisgICAgICBzb2FwX3ByaW50X2ZhdWx0KCZzb2FwLCBzdGRlcnIpOworICAgIHNvYXBfZW5kKCZzb2FwKTsKKyAgfQorICBzb2FwX2RvbmUoJnNvYXApOworICByZXR1cm4gMDsKK30KKwordm9pZCBpbml0X3JlY2VpdmVkKCkKK3sgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBNQVhfSElTVE9SWTsgaSsrKQorICAgIHJlY2VpdmVkX2lkW2ldID0gTlVMTDsKKyAgbGFzdF9yZWNlaXZlZCA9IDA7Cit9CisKK2ludCBjaGVja19yZWNlaXZlZChjb25zdCBjaGFyICppZCkKK3sgaW50IGk7CisgIGlmICghaWQpCisgICAgcmV0dXJuIDE7CisgIC8qIENoZWNrIGlmIE1lc3NhZ2UgSUQgYWxyZWFkeSByZWNlaXZlZCAqLworICBmb3IgKGkgPSAwOyBpIDwgTUFYX0hJU1RPUlk7IGkrKykKKyAgeyBpZiAocmVjZWl2ZWRfaWRbaV0gJiYgIXN0cmNtcChpZCwgcmVjZWl2ZWRfaWRbaV0pKQorICAgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKHJlY2VpdmVkX2lkW2xhc3RfcmVjZWl2ZWRdKQorICAgIGZyZWUocmVjZWl2ZWRfaWRbbGFzdF9yZWNlaXZlZF0pOworICByZWNlaXZlZF9pZFtsYXN0X3JlY2VpdmVkKytdID0gc3RyZHVwKGlkKTsKKyAgLyogV3JhcCB0byBvdmVyd3JpdGUgb2xkIElEcyAqLworICBpZiAobGFzdF9yZWNlaXZlZCA+PSBNQVhfSElTVE9SWSkKKyAgICBsYXN0X3JlY2VpdmVkID0gMDsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBjaGVja19oZWFkZXIoc3RydWN0IHNvYXAgKnNvYXApCit7IC8qIE1VU1QgaGF2ZSByZWNlaXZlZCBhIFNPQVAgSGVhZGVyICovCisgIGlmICghc29hcC0+aGVhZGVyKQorICAgIHJldHVybiBzb2FwX3NlbmRlcl9mYXVsdChzb2FwLCAiTm8gU09BUCBoZWFkZXIiLCBOVUxMKTsKKyAgLyogLi4uIHdpdGggYSBNZXNzYWdlIElEICovCisgIGlmICghc29hcC0+aGVhZGVyLT53c2FfX01lc3NhZ2VJRCkKKyAgICByZXR1cm4gc29hcF9zZW5kZXJfZmF1bHQoc29hcCwgIk5vIFdTLUFkZHJlc3NpbmcgTWVzc2FnZUlEIiwgTlVMTCk7CisgIHNvYXAtPmhlYWRlci0+d3NhX19SZWxhdGVzVG8gPSAoc3RydWN0IHdzYV9fUmVsYXRpb25zaGlwKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IHdzYV9fUmVsYXRpb25zaGlwKSk7CisgIHNvYXBfZGVmYXVsdF93c2FfX1JlbGF0aW9uc2hpcChzb2FwLCBzb2FwLT5oZWFkZXItPndzYV9fUmVsYXRlc1RvKTsKKyAgc29hcC0+aGVhZGVyLT53c2FfX1JlbGF0ZXNUby0+X19pdGVtID0gc29hcC0+aGVhZGVyLT53c2FfX01lc3NhZ2VJRDsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK2ludCBuc19fZWNob1N0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqc3RyLCBjaGFyICoqcmVzKQoreyAvKiBHZXQgSGVhZGVyIGluZm8gYW5kIHNldHVwIHJlc3BvbnNlIEhlYWRlciAqLworICBpZiAoY2hlY2tfaGVhZGVyKHNvYXApKQorICB7IHByaW50ZigiTWFsZm9ybWVkIGhlYWRlclxuIik7CisgICAgcmV0dXJuIFNPQVBfRkFVTFQ7IC8qIHRoZXJlIHdhcyBhIHByb2JsZW0gKi8KKyAgfQorCisgIC8qIElmIG1lc3NhZ2Ugd2l0aCBNZXNzYWdlSUQgYWxyZWFkeSByZWNlaXZlZCwgaWdub3JlIGl0ICovCisgIGlmIChjaGVja19yZWNlaXZlZChzb2FwLT5oZWFkZXItPndzYV9fTWVzc2FnZUlEKSkKKyAgeyBwcmludGYoIlJlcXVlc3QgbWVzc2FnZSAlcyBhbHJlYWR5IHJlY2VpdmVkXG4iLCBzb2FwLT5oZWFkZXItPndzYV9fTWVzc2FnZUlEKTsKKyAgICByZXR1cm4gU09BUF9TVE9QOworICB9CisKKyAgcHJpbnRmKCJSZXF1ZXN0IG1lc3NhZ2UgJXMgYWNjZXB0ZWRcbiIsIHNvYXAtPmhlYWRlci0+d3NhX19NZXNzYWdlSUQpOworCisgIC8qIENoZWNrIFJlcGx5VG8gaGFzIEFkZHJlc3MgKi8KKyAgaWYgKCFzb2FwLT5oZWFkZXItPndzYV9fUmVwbHlUbyB8fCAhc29hcC0+aGVhZGVyLT53c2FfX1JlcGx5VG8tPkFkZHJlc3MpCisgICAgcmV0dXJuIHNvYXBfc2VuZGVyX2ZhdWx0KHNvYXAsICJObyBXUy1BZGRyZXNzaW5nIFJlcGx5VG8gYWRkcmVzcyIsIE5VTEwpOworICAvKiBDb3B5IEhlYWRlciBpbmZvIGludG8gcmVzcG9uc2UgSGVhZGVyICovCisgIHNvYXAtPmhlYWRlci0+d3NhX19UbyA9IHNvYXAtPmhlYWRlci0+d3NhX19SZXBseVRvLT5BZGRyZXNzOworCisgIC8qIEFkZCBpbmZvIHRvIHJlc3BvbnNlIEhlYWRlciAqLworICBzb2FwLT5oZWFkZXItPndzYV9fTWVzc2FnZUlEID0gc29hcF9zdHJkdXAoc29hcCwgc29hcF9pbnQycyhzb2FwLCBpZF9jb3VudCsrKSk7CisgIHNvYXAtPmhlYWRlci0+d3NhX19BY3Rpb24gPSAiaHR0cDovL2dlbml2aWEuY29tL3VkcC9lY2hvU3RyaW5nUmVzcG9uc2UiOworCisgIC8qIENvcHkgcmVxdWVzdCBzdHJpbmcgaW50byByZXNwb25zZSBzdHJpbmcgKi8KKyAgcHJpbnRmKCJSZXNwb25zZSBtZXNzYWdlICVzIHJldHVybmVkXG4iLCBzb2FwLT5oZWFkZXItPndzYV9fTWVzc2FnZUlEKTsKKyAgKnJlcyA9IHN0cjsKKworICByZXR1cm4gU09BUF9PSzsKK30KKworaW50IG5zX19zZW5kU3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpzdHIpCit7IGlmIChjaGVja19oZWFkZXIoc29hcCkpCisgICAgcHJpbnRmKCJNYWxmb3JtZWQgaGVhZGVyXG4iKTsKKyAgZWxzZSBpZiAoY2hlY2tfcmVjZWl2ZWQoc29hcC0+aGVhZGVyLT53c2FfX01lc3NhZ2VJRCkpCisgICAgcHJpbnRmKCJPbmUtd2F5IG1lc3NhZ2UgJXMgYWxyZWFkeSByZWNlaXZlZFxuIiwgc29hcC0+aGVhZGVyLT53c2FfX01lc3NhZ2VJRCk7CisgIGVsc2UKKyAgICBwcmludGYoIk9uZS13YXkgbWVzc2FnZSAlcyBhY2NlcHRlZCBhbmQgc2VydmljZWRcbiIsIHNvYXAtPmhlYWRlci0+d3NhX19NZXNzYWdlSUQpOworICByZXR1cm4gU09BUF9PSzsKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvdWRwX1ZDL1JFQURNRS50eHQgYi9zYW1wbGVzL3VkcF9WQy9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMTUxZjIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3VkcF9WQy9SRUFETUUudHh0CkBAIC0wLDAgKzEsMjY3IEBACisKK1NPQVAtb3Zlci1VRFAKKworQ29uZm9ybWFuY2UKKy0tLS0tLS0tLS0tCisKK1RoZSBTT0FQLW92ZXItVURQIHNwZWNpZmljYXRpb24gcmVsaWVzIG9uIFdTLUFkZHJlc3NpbmcuIFRoZSBXUy1BZGRyZXNzaW5nLmgKK2ZpbGUgZGVmaW5lcyB0aGUgV1MtQWRkcmVzc2luZyBlbGVtZW50cyBmb3IgY2xpZW50IGFuZCBzZXJ2ZXIgYXBwbGljYXRpb25zLgorCitUaGUgaW1wbGVtZW50YXRpb24gY29uZm9ybXMgdG8gdGhlIFNPQVAtb3Zlci1VRFAgcmVxdWlyZW1lbnRzOgorCisqIFNPQVAtb3Zlci1VRFAgc2VydmVyIGVuZHBvaW50IFVSTCBmb3JtYXQ6IHNvYXAudWRwOi8vaG9zdDpwb3J0L3BhdGgKKyogU3VwcG9ydCBvbmUtd2F5IG1lc3NhZ2UtZXhjaGFuZ2UgcGF0dGVybiAoTUVQKSB3aGVyZSBhIFNPQVAgZW52ZWxvcGUgaXMKKyAgY2FycmllZCBpbiBhIHVzZXIgZGF0YWdyYW0uCisqIFN1cHBvcnQgcmVxdWVzdC1yZXNwb25zZSBtZXNzYWdlLWV4Y2hhbmdlIHBhdHRlcm4gKE1FUCkgd2hlcmUgU09BUCBlbnZlbG9wZXMKKyAgYXJlIGNhcnJpZWQgaW4gdXNlciBkYXRhZ3JhbXMuCisqIFN1cHBvcnQgbXVsdGljYXN0IHRyYW5zbWlzc2lvbiBvZiBTT0FQIGVudmVsb3BlcyBjYXJyaWVkIGluIHVzZXIgZGF0YWdyYW1zLgorKiBTdXBwb3J0IGJvdGggU09BUCAxLjEgYW5kIFNPQVAgMS4yIGVudmVsb3Blcy4KKworVGhlIFNPQVAtb3Zlci1VRFAgc3BlY2lmaWNhdGlvbiBjYW4gYmUgZm91bmQgYXQ6CisKK2h0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9kZWZhdWx0LmFzcD91cmw9L2xpYnJhcnkvZW4tdXMvZG5nbG9ic3BlYy9odG1sL3NvYXAtb3Zlci11ZHAuYXNwCisKK0ZlYXR1cmVzCistLS0tLS0tLQorCitUaGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgZmVhdHVyZXMgYXJlIGFsc28gYXZhaWxhYmxlOgorCisqIFpsaWIvZ3ppcCBtZXNzYWdlIGNvbXByZXNzaW9uIChjb21waWxlIC1EV0lUSF9HWklQKS4KKyogU09BUCB3aXRoIERJTUUgYXR0YWNobWVudHMgb3ZlciBVRFAuCisqIFNPQVAgd2l0aCBNSU1FIGF0dGFjaG1lbnRzIChTd0EpIG92ZXIgVURQLgorKiBTdXBwb3J0IGZvciBJUHY2IChjb21waWxlIC1EV0lUSF9JUFY2KQorCitNZXNzYWdlIHJldHJhbnNtaXNzaW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JldHJhbnNtaXNzaW9uIGlzIGltcGxlbWVudGVkIHVzaW5nIGEgcmV0cnkgYW5kIGV4cG9uZW50aWFsIGJhY2stb2ZmIGFsZ29yaXRobQorYXMgcGVyIFNPQVAtb3Zlci1VRFAgcmV0cmFuc21pc3Npb24gcmVxdWlyZW1lbnRzLCBzZWUgU09BUC1vdmVyLVVEUCBBcHBlbmRpeCBJLgorCitEdXBsaWNhdGUgbWVzc2FnZSBkZXRlY3Rpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgdXNlciBpcyByZXNwb25zaWJsZSBmb3IgaW1wbGVtZW50aW5nIGEgZHVwbGljYXRlIG1lc3NhZ2UgZGV0ZWN0aW9uCithbGdvcml0aG0sIHNlZSBTT0FQLW92ZXItVURQIEFwcGVuZGl4IElJLiBBbiBleGFtcGxlIGFsZ29yaXRobSBpcyBnaXZlbiBpbgordWRwc2VydmVyLmMKKworVXNhZ2UKKy0tLS0tCisKK05vdGU6IFVEUCBzdXBwb3J0IHJlcXVpcmVzIGNvbXBpbGF0aW9uIHdpdGggLURXSVRIX1VEUAorCisqIEhlYWRlciBmaWxlOgorCisvL2dzb2FwIHdzYSBzY2hlbWEgaW1wb3J0OiBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmcKKyNpbXBvcnQgIndhcy5oIgorc3RydWN0IFNPQVBfRU5WX19IZWFkZXIKK3sgbXVzdFVuZGVyc3RhbmQgd3NhX19BdHRyaWJ1dGVkVVJJICAgICAgICAgICAgICAgICAgICAgd3NhX19NZXNzYWdlSUQgIDA7CisgIG11c3RVbmRlcnN0YW5kIHN0cnVjdCB3c2FfX1JlbGF0aW9uc2hpcCAgICAgICAgICAgICAgICp3c2FfX1JlbGF0ZXNUbyAwOworICBtdXN0VW5kZXJzdGFuZCBzdHJ1Y3Qgd3NhX19FbmRwb2ludFJlZmVyZW5jZVR5cGUgICAgICAqd3NhX19Gcm9tICAgICAgMDsKKyAgbXVzdFVuZGVyc3RhbmQgc3RydWN0IHdzYV9fRW5kcG9pbnRSZWZlcmVuY2VUeXBlICAgICAgKndzYV9fUmVwbHlUbyAgIDA7CisgIG11c3RVbmRlcnN0YW5kIHN0cnVjdCB3c2FfX0VuZHBvaW50UmVmZXJlbmNlVHlwZSAgICAgICp3c2FfX0ZhdWx0VG8gICAwOworICBtdXN0VW5kZXJzdGFuZCBzdHJ1Y3Qgd3NhX19FbmRwb2ludFJlZmVyZW5jZVR5cGUgICAgICAqd3NhX19SZWNpcGllbnQgMDsKKyAgbXVzdFVuZGVyc3RhbmQgd3NhX19BdHRyaWJ1dGVkVVJJICAgICAgICAgICAgICAgICAgICAgd3NhX19UbyAgICAgICAgIDA7CisgIG11c3RVbmRlcnN0YW5kIHdzYV9fQXR0cmlidXRlZFVSSSAgICAgICAgICAgICAgICAgICAgIHdzYV9fQWN0aW9uICAgICAwOworfTsKKy4uLiB5b3VyIGRlY2xhcmF0aW9ucyBnbyBoZXJlIChyZXF1ZXN0LXJlc3BvbnNlIGFuZCBvbmUtd2F5KSAuLi4KKy4uLiBmb3IgZXhhbXBsZToKKyAgICBpbnQgbnNfX2VjaG9TdHJpbmcoY2hhciAqc3RyLCBjaGFyICoqcmVzKTsKKyAgICBpbnQgbnNfX3NlbmRTdHJpbmcoY2hhciAqc3RyLCB2b2lkKTsKKyAgICBpbnQgbnNfX3NlbmRTdHJpbmdSZXNwb25zZShjaGFyICpyZXMsIHZvaWQpOworCisqIENsaWVudC1zaWRlIG9uZS13YXkgdW5pY2FzdC9tdWx0aWNhc3Q6CisgIHN0cnVjdCBzb2FwIHNvYXA7CisgIHN0cnVjdCBTT0FQX0VOVl9fSGVhZGVyIGhlYWRlcjsKKyAgc29hcF9pbml0KCZzb2FwKTsKKyAgaWYgKG11bHRpY2FzdCkKKyAgICBzb2FwLmNvbm5lY3RfZmxhZ3MgPSBTT19CUk9BRENBU1Q7CisgIHNvYXAuc2VuZF90aW1lb3V0ID0gMTsgLy8gMXMgdGltZW91dAorICBzb2FwX2RlZmF1bHRfU09BUF9FTlZfX0hlYWRlcigmc29hcCwgJmhlYWRlcik7CisgIHNvYXAuaGVhZGVyID0gJmhlYWRlcjsKKyAgaGVhZGVyLndzYV9fTWVzc2FnZUlEID0gIjxtZXNzYWdlIElEPiI7CisgIGhlYWRlci53c2FfX1RvID0gIjxzZXJ2ZXIgVVJMPiI7CisgIGhlYWRlci53c2FfX0FjdGlvbiA9ICI8c2VydmVyIGFjdGlvbj4iOworICBpZiAoc29hcF9zZW5kX25zX19lY2hvU3RyaW5nKCZzb2FwLCAic29hcC51ZHA6Ly8uLi4iLCBOVUxMLCAiaGVsbG8gd29ybGQhIikpCisgICAgc29hcF9wcmludF9mYXVsdCgmc29hcCwgc3RkZXJyKTsKKyAgc29hcF9lbmQoJnNvYXApOyAvLyBjbGVhbnVwCisgIHNvYXBfZGVzdHJveSgmc29hcCk7IC8vIGNsZWFudXAKKyAgc29hcF9kb25lKCZzb2FwKTsgLy8gY2xvc2UgY29ubmVjdGlvbiAoc2hvdWxkIG5vdCB1c2Ugc29hcCBzdHJ1Y3QgYWZ0ZXIgdGhpcykKKworKiBDbGllbnQtc2lkZSByZXF1ZXN0LXJlc3BvbnNlIHVuaWNhc3Q6CisgIHN0cnVjdCBzb2FwIHNvYXA7CisgIHN0cnVjdCBTT0FQX0VOVl9fSGVhZGVyIGhlYWRlcjsKKyAgc3RydWN0IHdzYV9fRW5kcG9pbnRSZWZlcmVuY2VUeXBlIHJlcGx5VG87CisgIGNoYXIgKnJlczsKKyAgc29hcF9pbml0KCZzb2FwKTsKKyAgc29hcC5zZW5kX3RpbWVvdXQgPSAxOyAvLyAxcyB0aW1lb3V0CisgIHNvYXAucmVjdl90aW1lb3V0ID0gMTsgLy8gMXMgdGltZW91dAorICBzb2FwX2RlZmF1bHRfU09BUF9FTlZfX0hlYWRlcigmc29hcCwgJmhlYWRlcik7CisgIHNvYXAuaGVhZGVyID0gJmhlYWRlcjsKKyAgc29hcF9kZWZhdWx0X3dzYV9fRW5kcG9pbnRSZWZlcmVuY2VUeXBlKCZzb2FwLCAmcmVwbHlUbyk7CisgIHJlcGx5VG8uQWRkcmVzcyA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3Npbmcvcm9sZS9hbm9ueW1vdXMiOworICBoZWFkZXIud3NhX19NZXNzYWdlSUQgPSAiPG1lc3NhZ2UgSUQ+IjsKKyAgaGVhZGVyLndzYV9fVG8gPSAiPHNlcnZlciBVUkw+IjsKKyAgaGVhZGVyLndzYV9fQWN0aW9uID0gIjxzZXJ2ZXIgYWN0aW9uPiI7CisgIGhlYWRlci53c2FfX1JlcGx5VG8gPSAmcmVwbHlUbzsKKyAgaWYgKHNvYXBfY2FsbF9uc19fZWNob1N0cmluZygmc29hcCwgInNvYXAudWRwOi8vLi4uIiwgTlVMTCwgImhlbGxvIHdvcmxkISIsICZyZXMpKQorICB7IGlmIChzb2FwLmVycm9yID09IFNPQVBfRU9GICYmIHNvYXAuZXJybnVtID09IDApCisgICAgICBwcmludGYoIlRpbWVvdXQ6IG1lc3NhZ2UgcHJvYmFibHkgYWxyZWFkeSBkZWxpdmVyZWRcbiIpOworICAgIGVsc2UKKyAgICAgIHNvYXBfcHJpbnRfZmF1bHQoJnNvYXAsIHN0ZGVycik7CisgIH0KKyAgZWxzZQorICAgIHByaW50ZigiVURQIHNlcnZlciByZXNwb25zZTogJXNcbiIsIHJlcyk7CisgIHNvYXBfZW5kKCZzb2FwKTsgLy8gY2xlYW51cAorICBzb2FwX2Rlc3Ryb3koJnNvYXApOyAvLyBjbGVhbnVwCisgIHNvYXBfZG9uZSgmc29hcCk7IC8vIGNsb3NlIGNvbm5lY3Rpb24gKHNob3VsZCBub3QgdXNlIHNvYXAgc3RydWN0IGFmdGVyIHRoaXMpCisKKyogQ2xpZW50LXNpZGUgcmVxdWVzdC1yZXNwb25zZSBtdWx0aWNhc3Q6CisgIHN0cnVjdCBzb2FwIHNvYXA7CisgIHN0cnVjdCBTT0FQX0VOVl9fSGVhZGVyIGhlYWRlcjsKKyAgc3RydWN0IHdzYV9fRW5kcG9pbnRSZWZlcmVuY2VUeXBlIHJlcGx5VG87CisgIGNoYXIgKnJlczsKKyAgc29hcF9pbml0KCZzb2FwKTsKKyAgc29hcC5jb25uZWN0X2ZsYWdzID0gU09fQlJPQURDQVNUOworICBzb2FwLnNlbmRfdGltZW91dCA9IDE7IC8vIDFzIHRpbWVvdXQKKyAgc29hcC5yZWN2X3RpbWVvdXQgPSAxOyAvLyAxcyB0aW1lb3V0CisgIHNvYXBfZGVmYXVsdF9TT0FQX0VOVl9fSGVhZGVyKCZzb2FwLCAmaGVhZGVyKTsKKyAgc29hcC5oZWFkZXIgPSAmaGVhZGVyOworICBzb2FwX2RlZmF1bHRfd3NhX19FbmRwb2ludFJlZmVyZW5jZVR5cGUoJnNvYXAsICZyZXBseVRvKTsKKyAgcmVwbHlUby5BZGRyZXNzID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZy9yb2xlL2Fub255bW91cyI7CisgIGhlYWRlci53c2FfX01lc3NhZ2VJRCA9ICI8bWVzc2FnZSBJRD4iOworICBoZWFkZXIud3NhX19UbyA9ICI8c2VydmVyIFVSTD4iOworICBoZWFkZXIud3NhX19BY3Rpb24gPSAiPHNlcnZlciBhY3Rpb24+IjsKKyAgaGVhZGVyLndzYV9fUmVwbHlUbyA9ICZyZXBseVRvOworICBpZiAoc29hcF9zZW5kX25zX19lY2hvU3RyaW5nKCZzb2FwLCAic29hcC51ZHA6Ly8uLi4iLCBOVUxMLCAiaGVsbG8gd29ybGQhIikpCisgICAgc29hcF9wcmludF9mYXVsdCgmc29hcCwgc3RkZXJyKTsKKyAgZWxzZQorICB7IGZvciAoOzspCisgICAgeyBpZiAoc29hcF9yZWN2X25zX19zZW5kU3RyaW5nUmVzcG9uc2UoJnNvYXAsICZyZXMpKQorICAgICAgICBicmVhazsKKyAgICAgIHByaW50ZigiTXVsdGljYXN0IHJlc3BvbnNlOiAlc1xuIiwgcmVzKTsKKyAgICB9CisgICAgaWYgKHNvYXAuZXJyb3IgPT0gU09BUF9FT0YgJiYgc29hcC5lcnJudW0gPT0gMCkKKyAgICAgIHByaW50ZigiVGltZW91dDogbm8gbW9yZSBtZXNzYWdlcyByZWNlaXZlZFxuIik7CisgICAgZWxzZQorICAgICAgc29hcF9wcmludF9mYXVsdCgmc29hcCwgc3RkZXJyKTsKKyAgfQorICBzb2FwX2VuZCgmc29hcCk7IC8vIGNsZWFudXAKKyAgc29hcF9kZXN0cm95KCZzb2FwKTsgLy8gY2xlYW51cAorICBzb2FwX2RvbmUoJnNvYXApOyAvLyBjbG9zZSBjb25uZWN0aW9uIChzaG91bGQgbm90IHVzZSBzb2FwIHN0cnVjdCBhZnRlciB0aGlzKQorCisKKyogU2VydmVyLXNpZGUKKyAgc3RydWN0IHNvYXAgc29hcDsKKyAgc29hcF9pbml0MSgmc29hcCwgU09BUF9JT19VRFApOyAvLyBtdXN0IHNldCBVRFAgZmxhZworICBpZiAoIXNvYXBfdmFsaWRfc29ja2V0KHNvYXBfYmluZCgmc29hcCwgaG9zdCwgcG9ydCwgMTAwKSkpCisgIHsgc29hcF9wcmludF9mYXVsdCgmc29hcCwgc3RkZXJyKTsKKyAgICBleGl0KDEpOworICB9CisgIGZvciAoOzspCisgIHsgaWYgKHNvYXBfc2VydmUoJnNvYXApKQorICAgICAgc29hcF9wcmludF9mYXVsdCgmc29hcCwgc3RkZXJyKTsgLy8ganVzdCByZXBvcnQgdGhlIHByb2JsZW0KKyAgICBzb2FwX2Rlc3Ryb3koJnNvYXApOworICAgIHNvYXBfZW5kKCZzb2FwKTsKKyAgfQorICBzb2FwX2RvbmUoJnNvYXApOyAvLyBjbG9zZSBjb25uZWN0aW9uCisgIC4uLgorICBpbnQgbnNfX2VjaG9TdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnN0ciwgY2hhciAqKnJlcykKKyAgeyBpZiAoIXNvYXAtPmhlYWRlcikKKyAgICAgIHJldHVybiBzb2FwX3NlbmRlcl9mYXVsdChzb2FwLCAiTm8gU09BUCBoZWFkZXIiLCBOVUxMKTsKKyAgICBpZiAoIXNvYXAtPmhlYWRlci0+d3NhX19NZXNzYWdlSUQpCisgICAgICByZXR1cm4gc29hcF9zZW5kZXJfZmF1bHQoc29hcCwgIk5vIFdTLUFkZHJlc3NpbmcgTWVzc2FnZUlEIiwgTlVMTCk7CisgICAgc29hcC0+aGVhZGVyLT53c2FfX1JlbGF0ZXNUbyA9IChzdHJ1Y3Qgd3NhX19SZWxhdGlvbnNoaXAqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3Qgd3NhX19SZWxhdGlvbnNoaXApKTsKKyAgICBzb2FwX2RlZmF1bHRfd3NhX19SZWxhdGlvbnNoaXAoc29hcCwgc29hcC0+aGVhZGVyLT53c2FfX1JlbGF0ZXNUbyk7CisgICAgc29hcC0+aGVhZGVyLT53c2FfX1JlbGF0ZXNUby0+X19pdGVtID0gc29hcC0+aGVhZGVyLT53c2FfX01lc3NhZ2VJRDsKKyAgICAvLyBtdXN0IGNoZWNrIGZvciBkdXBsaWNhdGUgbWVzc2FnZXMKKyAgICBpZiAoY2hlY2tfcmVjZWl2ZWQoc29hcC0+aGVhZGVyLT53c2FfX01lc3NhZ2VJRCkpCisgICAgeyBwcmludGYoIlJlcXVlc3QgbWVzc2FnZSAlcyBhbHJlYWR5IHJlY2VpdmVkXG4iLCBzb2FwLT5oZWFkZXItPndzYV9fTWVzc2FnZUlEKTsKKyAgICAgIHJldHVybiBTT0FQX1NUT1A7IC8vIGRvbid0IHJldHVybiByZXNwb25zZQorICAgIH0KKyAgICBpZiAoIXNvYXAtPmhlYWRlci0+d3NhX19SZXBseVRvIHx8ICFzb2FwLT5oZWFkZXItPndzYV9fUmVwbHlUby0+QWRkcmVzcykKKyAgICAgIHJldHVybiBzb2FwX3NlbmRlcl9mYXVsdChzb2FwLCAiTm8gV1MtQWRkcmVzc2luZyBSZXBseVRvIGFkZHJlc3MiLCBOVUxMKTsKKyAgICBzb2FwLT5oZWFkZXItPndzYV9fVG8gPSBzb2FwLT5oZWFkZXItPndzYV9fUmVwbHlUby0+QWRkcmVzczsKKyAgICBzb2FwLT5oZWFkZXItPndzYV9fTWVzc2FnZUlEID0gc29hcF9zdHJkdXAoc29hcCwgc29hcF9pbnQycyhzb2FwLAoraWRfY291bnQrKykpIDsKKyAgICBzb2FwLT5oZWFkZXItPndzYV9fQWN0aW9uID0gImh0dHA6Ly9nZW5pdmlhLmNvbS91ZHAvZWNob1N0cmluZ1Jlc3BvbnNlIjsKKyAgICAqcmVzID0gc3RyOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIC4uLgorICBpbnQgbnNfX3NlbmRTdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnN0cikKKyAgeyBpZiAoIXNvYXAtPmhlYWRlcikKKyAgICAgIHJldHVybiBTT0FQX1NUT1A7CisgICAgaWYgKCFzb2FwLT5oZWFkZXItPndzYV9fTWVzc2FnZUlEKQorICAgICAgcmV0dXJuIFNPQVBfU1RPUDsKKyAgICAvLyBtdXN0IGNoZWNrIGZvciBkdXBsaWNhdGUgbWVzc2FnZXMKKyAgICBpZiAoY2hlY2tfcmVjZWl2ZWQoc29hcC0+aGVhZGVyLT53c2FfX01lc3NhZ2VJRCkpCisgICAgICByZXR1cm4gU09BUF9TVE9QOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIC4uLgorICBpbnQgbnNfX3NlbmRTdHJpbmdSZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqcmVzKQorICB7IHJldHVybiBTT0FQX05PX01FVEhPRDsgfSAvLyB3ZSBkb24ndCBleHBlY3QgdG8gc2VydmUgdGhpcyBtZXNzYWdlCisKK0J1aWx0IHN0ZXBzCistLS0tLS0tLS0tLQorCitJbXBvcnRhbnQ6IFRvIGJ1aWxkIFNPQVAtb3Zlci1VRFAgY2xpZW50IGFuZCBzZXJ2ZXIgYXBwbGljYXRpb25zLCB5b3UgTVVTVAorY29tcGlsZSBhbGwgc291cmNlcyB1c2luZyB0aGUgLURXSVRIX1VEUCBjb21waWxlciBvcHRpb24uCisKK0EgTWFrZWZpbGUgaXMgaW5jbHVkZWQgdG8gYnVpbGQgY2xpZW50IGFuZCBzZXJ2ZXIgYXBwbGljYXRpb25zLgorCitUbyBidWlsZCB0aGUgZXhhbXBsZSBjbGllbnQ6CittYWtlIHVkcGNsaWVudAorCitUbyBidWlsZCB0aGUgZXhhbXBsZSBzZXJ2ZXI6CittYWtlIHVkcHNlcnZlcgorCitUbyBnZW5lcmF0ZSB0aGUgd3NhLmggZmlsZToKKword3NkbDJoIC1jIC10IC4uLy4uL1dTL1dTLXR5cGVtYXAuZGF0IC1vIHdzYS5oIGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZworCitUaGVuIG1hbnVhbGx5IHJlcGxhY2UgaW4gV1MtQWRkcmVzc2luZy5oCisvL2dzb2Fwb3B0IGN3Cit3aXRoCisvL2dzb2Fwb3B0IGMKK3RvIGVuc3VyZSAud3NkbCBhbmQgLnhzZCBmaWxlcyBhcmUgZ2VuZXJhdGVkIGZvciB5b3VyIFdlYiBzZXJ2aWNlCithcHBsaWNhdGlvbnMuCisKK0V4YW1wbGUgcnVuCistLS0tLS0tLS0tLQorCitTdGFydCB1ZHBzZXJ2ZXIgaW4gYSBzaGVsbCB3aW5kb3cgKHdpbmRvdyAxKToKKyQgLi91ZHBzZXJ2ZXIKKworRXhlY3V0ZSB1ZHBjbGllbnQgaW4gYW5vdGhlciBzaGVsbCB3aW5kb3cgKHdpbmRvdyAyKToKKyQgLi91ZHBjbGllbnQKKworV2luZG93IDEgZGlzcGxheXMgKHNlcnZlcik6CisKK0FjY2VwdGluZyByZXF1ZXN0cy4uLgorUmVxdWVzdCBtZXNzYWdlIGlkMSBhY2NlcHRlZAorUmVzcG9uc2UgbWVzc2FnZSAxIHJldHVybmVkCitBY2NlcHRpbmcgcmVxdWVzdHMuLi4KK09uZS13YXkgbWVzc2FnZSBpZDIgYWNjZXB0ZWQgYW5kIHNlcnZpY2VkCitBY2NlcHRpbmcgcmVxdWVzdHMuLi4KKworV2luZG93IDIgZGlzcGxheXMgKGNsaWVudCk6CisKK1VEUCBzZXJ2ZXIgcmVzcG9uc2U6IGhlbGxvIHdvcmxkIQorCitSZS1leGVjdXRlIHRoZSB1ZHBjbGllbnQgKHdpbmRvdyAyKToKKyQgLi91ZHBjbGllbnQKKworV2luZG93IDEgZGlzcGxheXMgKHNlcnZlcik6CisKK1JlcXVlc3QgbWVzc2FnZSBpZDEgYWxyZWFkeSByZWNlaXZlZAorU09BUCBGQVVMVDogU09BUC1FTlY6Q2xpZW50CisiU3RvcHBlZDogbm8gcmVzcG9uc2Ugc2VudCIKK0FjY2VwdGluZyByZXF1ZXN0cy4uLgorT25lLXdheSBtZXNzYWdlIGlkMiBhbHJlYWR5IHJlY2VpdmVkCitBY2NlcHRpbmcgcmVxdWVzdHMuLi4KKworV2luZG93IDIgZGlzcGxheXMgKGNsaWVudCk6CisKK1RpbWVvdXQ6IG1lc3NhZ2UgcHJvYmFibHkgYWxyZWFkeSBkZWxpdmVyZWQKKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy91ZHBfVkMvc29hcGNwcDIuZXhlIGIvc2FtcGxlcy91ZHBfVkMvc29hcGNwcDIuZXhlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZlYTk1YmEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3VkcF9WQy9zb2FwY3BwMi5leGUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy91ZHBfVkMvc3Rkc29hcDIuY3BwIGIvc2FtcGxlcy91ZHBfVkMvc3Rkc29hcDIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZWQ0NjAKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3VkcF9WQy9zdGRzb2FwMi5jcHAKQEAgLTAsMCArMSwxMzQ0OCBAQAorLyoKKworc3Rkc29hcDIuY1twcF0gMi43LjZlCisKK2dTT0FQIHJ1bnRpbWUKKworZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlczoKK0dQTCwgdGhlIGdTT0FQIHB1YmxpYyBsaWNlbnNlLCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ29udHJpYnV0b3JzOgorCitXaW5kIFJpdmVyIFN5c3RlbXMgSW5jLiwgZm9yIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25zIHVuZGVyIGdTT0FQIHB1YmxpYyBsaWNlbnNlOgorICAtIHZ4V29ya3MgY29tcGF0aWJsZQkoI2RlZmluZSBWWFdPUktTKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIHB1YmxpYyBsaWNlbnNlLgorCitUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBnU09BUCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMworKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCitMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK2h0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9zb2FwbGljZW5zZS5odG1sCitTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAorV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCitmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLgorQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSW5zdGFsbGF0aW9uIG5vdGU6CisKK1dpbjMyIGJ1aWxkIG5lZWRzIHdpbnNvY2suZGxsIChWaXN1YWwgQysrICJ3c29jazMyLmxpYiIpCitUbyBkbyB0aGlzIGluIFZpc3VhbCBDKysgNi4wLCBnbyB0byAiUHJvamVjdCIsICJzZXR0aW5ncyIsIHNlbGVjdCB0aGUgIkxpbmsiCit0YWIgKHRoZSBwcm9qZWN0IGZpbGUgbmVlZHMgdG8gYmUgc2VsZWN0ZWQgaW4gdGhlIGZpbGUgdmlldykgYW5kIGFkZAorIndzb2NrMzIubGliIiB0byB0aGUgIk9iamVjdC9saWJyYXJ5IG1vZHVsZXMiIGVudHJ5CisKK09uIE1hYyBPUyBYIHdpdGggZ2NjIChHQ0MpIDMuMSAyMDAyMDQyMCAocHJlcmVsZWFzZSkgeW91IE1VU1QgY29tcGlsZSB3aXRoCistZnN0YWNrX2NoZWNrIHdoZW4gdXNpbmcgLU8yIGJlY2F1c2UgZ2NjIDMuMSBoYXMgYSBidWcgdGhhdCBzbWFzaGVzIHRoZSBzdGFjaword2hlbiBsb2NhbGx5IGFsbG9jYXRlZCBkYXRhIGV4Y2VlZHMgNjRLLgorCisqLworCisjaWZkZWYgQVM0MDAKKyMgcHJhZ21hIGNvbnZlcnQoODE5KQkvKiBFQkNESUMgdG8gQVNDSUkgKi8KKyNlbmRpZgorCisjaW5jbHVkZSAic3Rkc29hcDIuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitTT0FQX1NPVVJDRV9TVEFNUCgiQCgjKSBzdGRzb2FwMi5jcHAgdmVyIDIuNy42ZSAyMDA2LTAyLTE4IDEyOjAwOjAwIEdNVCIpCitleHRlcm4gIkMiIHsKKyNlbHNlCitTT0FQX1NPVVJDRV9TVEFNUCgiQCgjKSBzdGRzb2FwMi5jIHZlciAyLjcuNmUgMjAwNi0wMi0xOCAxMjowMDowMCBHTVQiKQorI2VuZGlmCisKKy8qIDhiaXQgY2hhcmFjdGVyIHJlcHJlc2VudGluZyB1bmtub3duL25vbnJlcHJlc2VudGFibGUgY2hhcmFjdGVyIGRhdGEgKGUuZy4gbm90IHN1cHBvcnRlZCBieSBjdXJyZW50IGxvY2FsZSB3aXRoIG11bHRpYnl0ZSBzdXBwb3J0IGVuYWJsZWQpICovCisjaWZuZGVmIFNPQVBfVU5LTk9XTl9DSEFSCisjZGVmaW5lIFNPQVBfVU5LTk9XTl9DSEFSICgxMjcpCisjZW5kaWYKKworLyogICAgICBFT0Y9LTEgKi8KKyNkZWZpbmUgU09BUF9MVCAoc29hcF93Y2hhcikoLTIpIC8qIFhNTCBjaGFyYWN0ZXIgJzwnICovCisjZGVmaW5lIFNPQVBfVFQgKHNvYXBfd2NoYXIpKC0zKSAvKiBYTUwgY2hhcmFjdGVyICc8LycgKi8KKyNkZWZpbmUgU09BUF9HVCAoc29hcF93Y2hhcikoLTQpIC8qIFhNTCBjaGFyYWN0ZXIgJz4nICovCisjZGVmaW5lIFNPQVBfUVQgKHNvYXBfd2NoYXIpKC01KSAvKiBYTUwgY2hhcmFjdGVyICciJyAqLworI2RlZmluZSBTT0FQX0FQIChzb2FwX3djaGFyKSgtNikgLyogWE1MIGNoYXJhY3RlciAnJycgKi8KKworI2RlZmluZSBzb2FwX2JsYW5rKGMpCQkoKGMpID49IDAgJiYgKGMpIDw9IDMyKQorI2RlZmluZSBzb2FwX25vdGJsYW5rKGMpCSgoYykgPiAzMikKKyNkZWZpbmUgc29hcF9oYXNoX3B0cihwKQkoKCh1bnNpZ25lZCBsb25nKShwKSA+PiAzKSAmIChTT0FQX1BUUkhBU0ggLSAxKSkKKworI2lmZGVmIFNPQVBfREVCVUcKK3N0YXRpYyB2b2lkIHNvYXBfaW5pdF9sb2dzKHN0cnVjdCBzb2FwKik7CitzdGF0aWMgdm9pZCBzb2FwX2Nsb3NlX2xvZ2ZpbGUoc3RydWN0IHNvYXAqLCBpbnQpOworc3RhdGljIHZvaWQgc29hcF9zZXRfbG9nZmlsZShzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciopOworc3RhdGljIHZvaWQgc29hcF9mcmVlX21odChzdHJ1Y3Qgc29hcCopOworc3RhdGljIHZvaWQgc29hcF90cmFja191bmxpbmsoc3RydWN0IHNvYXAqLCBjb25zdCB2b2lkKik7CisjZW5kaWYKKworI2lmbmRlZiBQQUxNXzIKK3N0YXRpYyBpbnQgc29hcF9zZXRfZXJyb3Ioc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgaW50KTsKK3N0YXRpYyBpbnQgc29hcF9jb3B5X2ZhdWx0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworc3RhdGljIGludCBzb2FwX2dldGF0dHJ2YWwoc3RydWN0IHNvYXAqLCBjaGFyKiwgc2l6ZV90LCBzb2FwX3djaGFyKTsKKyNlbmRpZgorCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHNvYXBfd2NoYXIgc29hcF9jaGFyKHN0cnVjdCBzb2FwKik7CitzdGF0aWMgc29hcF93Y2hhciBzb2FwX2dldF9waShzdHJ1Y3Qgc29hcCopOworc3RhdGljIGludCBzb2FwX2lzeGRpZ2l0KGludCk7CitzdGF0aWMgdm9pZCAqZnBsdWdpbihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCitzdGF0aWMgdm9pZCBzb2FwX3VwZGF0ZV9wdHJzKHN0cnVjdCBzb2FwKiwgY2hhciosIGNoYXIqLCBjaGFyKiwgY2hhciopOworc3RhdGljIGludCBzb2FwX2hhc19jb3BpZXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworc3RhdGljIHZvaWQgc29hcF9pbml0X2lodChzdHJ1Y3Qgc29hcCopOworc3RhdGljIHZvaWQgc29hcF9mcmVlX2lodChzdHJ1Y3Qgc29hcCopOworc3RhdGljIHZvaWQgc29hcF9pbml0X3BodChzdHJ1Y3Qgc29hcCopOworc3RhdGljIHZvaWQgc29hcF9mcmVlX3BodChzdHJ1Y3Qgc29hcCopOworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBjb25zdCBjaGFyICpzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyBpbnQgc29hcF9pc251bWVyaWMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKik7CitzdGF0aWMgdGltZV90IHNvYXBfdGltZWdtKHN0cnVjdCB0bSopOworc3RhdGljIHN0cnVjdCBzb2FwX25saXN0ICpzb2FwX2xvb2t1cF9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzaXplX3Qgbik7CitzdGF0aWMgc3RydWN0IHNvYXBfbmxpc3QgKnNvYXBfcHVzaF9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKm5zLCBzaG9ydCB1dGlsaXplZCk7CitzdGF0aWMgdm9pZCBzb2FwX3BvcF9ucyhzdHJ1Y3Qgc29hcCAqc29hcCk7CitzdGF0aWMgdm9pZCBzb2FwX3V0aWxpemVfbnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc2l6ZV90IG4pOworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpzb2FwX25ld19tdWx0aXBhcnQoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKiwgc3RydWN0IHNvYXBfbXVsdGlwYXJ0KiosIGNoYXIqLCBzaXplX3QpOworc3RhdGljIGludCBzb2FwX3B1dGRpbWVmaWVsZChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworc3RhdGljIGNoYXIgKnNvYXBfZ2V0ZGltZWZpZWxkKHN0cnVjdCBzb2FwKiwgc2l6ZV90KTsKK3N0YXRpYyB2b2lkIHNvYXBfc2VsZWN0X21pbWVfYm91bmRhcnkoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBpbnQgc29hcF92YWxpZF9taW1lX2JvdW5kYXJ5KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgaW50IHNvYXBfbWF0Y2hfY2lkKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyB2b2lkIHNvYXBfcmVzb2x2ZV9hdHRhY2htZW50KHN0cnVjdCBzb2FwKiwgc3RydWN0IHNvYXBfbXVsdGlwYXJ0Kik7CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgV0lUSF9HWklQCitzdGF0aWMgaW50IHNvYXBfZ2V0Z3ppcGhkcihzdHJ1Y3Qgc29hcCopOworI2VuZGlmCisKKyNpZmRlZiBXSVRIX09QRU5TU0wKK3N0YXRpYyBpbnQgc3NsX2luaXRfZG9uZSA9IDA7CitzdGF0aWMgaW50IHNzbF9hdXRoX2luaXQoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBpbnQgc3NsX3ZlcmlmeV9jYWxsYmFjayhpbnQsIFg1MDlfU1RPUkVfQ1RYKik7CitzdGF0aWMgaW50IHNzbF9wYXNzd29yZChjaGFyKiwgaW50LCBpbnQsIHZvaWQgKik7CitzdGF0aWMgY29uc3QgY2hhciAqc3NsX2Vycm9yKHN0cnVjdCBzb2FwKiwgaW50KTsKKy8qIFRoaXMgY2FsbGJhY2sgaXMgaW5jbHVkZWQgZm9yIGZ1dHVyZSByZWZlcmVuY2VzLiBJdCBzaG91bGQgbm90IGJlIGRlbGV0ZWQKK3N0YXRpYyBESCAqc3NsX3RtcF9kaChTU0wqLCBpbnQsIGludCk7CisqLworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChXSVRIX05PSFRUUCkgfHwgIWRlZmluZWQoV0lUSF9MRUFORVIpCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNvbnN0IGNoYXIgKnNvYXBfZGVjb2RlKGNoYXIqLCBzaXplX3QsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHNvYXBfd2NoYXIgc29hcF9nZXRjaHVua2NoYXIoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBjb25zdCBjaGFyICpodHRwX2Vycm9yKHN0cnVjdCBzb2FwKiwgaW50KTsKK3N0YXRpYyBpbnQgaHR0cF9wb3N0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90KTsKK3N0YXRpYyBpbnQgaHR0cF9nZXQoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBpbnQgaHR0cF9zZW5kX2hlYWRlcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyBpbnQgaHR0cF9wb3N0X2hlYWRlcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitzdGF0aWMgaW50IGh0dHBfcmVzcG9uc2Uoc3RydWN0IHNvYXAqLCBpbnQsIHNpemVfdCk7CitzdGF0aWMgaW50IGh0dHBfcGFyc2Uoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBpbnQgaHR0cF9wYXJzZV9oZWFkZXIoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50IGZzZW5kKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHNpemVfdCk7CitzdGF0aWMgc2l6ZV90IGZyZWN2KHN0cnVjdCBzb2FwKiwgY2hhciosIHNpemVfdCk7CitzdGF0aWMgaW50IHRjcF9pbml0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgY29uc3QgY2hhciAqdGNwX2Vycm9yKHN0cnVjdCBzb2FwKik7CisjaWZuZGVmIFdJVEhfSVBWNgorc3RhdGljIGludCB0Y3BfZ2V0aG9zdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKmFkZHIsIHN0cnVjdCBpbl9hZGRyICppbmFkZHIpOworI2VuZGlmCitzdGF0aWMgaW50IHRjcF9jb25uZWN0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqZW5kcG9pbnQsIGNvbnN0IGNoYXIgKmhvc3QsIGludCBwb3J0KTsKK3N0YXRpYyBpbnQgdGNwX2FjY2VwdChzdHJ1Y3Qgc29hcCosIGludCwgc3RydWN0IHNvY2thZGRyKiwgaW50Kik7CitzdGF0aWMgaW50IHRjcF9kaXNjb25uZWN0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgaW50IHRjcF9jbG9zZXNvY2tldChzdHJ1Y3Qgc29hcCosIFNPQVBfU09DS0VUKTsKK3N0YXRpYyBpbnQgdGNwX3NodXRkb3duc29ja2V0KHN0cnVjdCBzb2FwKiwgU09BUF9TT0NLRVQsIGludCk7CitzdGF0aWMgY29uc3QgY2hhciAqc29hcF9zdHJlcnJvcihzdHJ1Y3Qgc29hcCopOworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoUEFMTSkgJiYgIWRlZmluZWQoUEFMTV8yKQordW5zaWduZWQgc2hvcnQgZXJybm87CisjZW5kaWYKKworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfZW52MVs0Ml0gPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iOworc3RhdGljIGNvbnN0IGNoYXIgc29hcF9lbmMxWzQyXSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI7CitzdGF0aWMgY29uc3QgY2hhciBzb2FwX2VudjJbNDBdID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI7CitzdGF0aWMgY29uc3QgY2hhciBzb2FwX2VuYzJbNDBdID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbmNvZGluZyI7CitzdGF0aWMgY29uc3QgY2hhciBzb2FwX3JwY1szNV0gPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLXJwYyI7CisjZW5kaWYKKworI2lmbmRlZiBQQUxNXzEKK2NvbnN0IHN0cnVjdCBzb2FwX2RvdWJsZV9uYW4gc29hcF9kb3VibGVfbmFuID0gezB4RkZGRkZGRkYsIDB4RkZGRkZGRkZ9Oworc3RhdGljIGNvbnN0IGNoYXIgc29hcF9iYXNlNjRvWzY1XSA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfYmFzZTY0aVs4MV0gPSAiXDc2WFhYXDc3XDY0XDY1XDY2XDY3XDcwXDcxXDcyXDczXDc0XDc1WFhYWFhYWFwwMFwwMVwwMlwwM1wwNFwwNVwwNlwwN1wxMFwxMVwxMlwxM1wxNFwxNVwxNlwxN1wyMFwyMVwyMlwyM1wyNFwyNVwyNlwyN1wzMFwzMVhYWFhYWFwzMlwzM1wzNFwzNVwzNlwzN1w0MFw0MVw0Mlw0M1w0NFw0NVw0Nlw0N1w1MFw1MVw1Mlw1M1w1NFw1NVw1Nlw1N1w2MFw2MVw2Mlw2MyI7CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfaW5kZW50WzExXSA9ICJcblx0XHRcdFx0XHRcdFx0XHRcdCI7CisvKiBBbHRlcm5hdGl2ZSBpbmRlbnRhdGlvbiBmb3JtIGZvciBTT0FQX1hNTF9JTkRFTlQ6CitzdGF0aWMgY29uc3QgY2hhciBzb2FwX2luZGVudFsyMV0gPSAiXG4gICAgICAgICAgICAgICAgICAgIjsKKyovCisjZW5kaWYKKworc3RhdGljIGNvbnN0IGNoYXIgc29hcF9wYWRkaW5nWzRdID0gIlwwXDBcMCI7CisjZGVmaW5lIFNPQVBfU1RSX1BBRERJTkcgKHNvYXBfcGFkZGluZykKKyNkZWZpbmUgU09BUF9TVFJfRU9TIChzb2FwX3BhZGRpbmcpCisjZGVmaW5lIFNPQVBfTk9OX05VTEwgKHNvYXBfcGFkZGluZykKKworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCBodG1sX2VudGl0eV9jb2Rlc1tdID0gLyogZW50aXRpZXMgZm9yIFhIVE1MIHBhcnNpbmcgKi8KK3sgeyAxNjAsICJuYnNwIiB9LAorICB7IDE2MSwgImlleGNsIiB9LAorICB7IDE2MiwgImNlbnQiIH0sCisgIHsgMTYzLCAicG91bmQiIH0sCisgIHsgMTY0LCAiY3VycmVuIiB9LAorICB7IDE2NSwgInllbiIgfSwKKyAgeyAxNjYsICJicnZiYXIiIH0sCisgIHsgMTY3LCAic2VjdCIgfSwKKyAgeyAxNjgsICJ1bWwiIH0sCisgIHsgMTY5LCAiY29weSIgfSwKKyAgeyAxNzAsICJvcmRmIiB9LAorICB7IDE3MSwgImxhcXVvIiB9LAorICB7IDE3MiwgIm5vdCIgfSwKKyAgeyAxNzMsICJzaHkiIH0sCisgIHsgMTc0LCAicmVnIiB9LAorICB7IDE3NSwgIm1hY3IiIH0sCisgIHsgMTc2LCAiZGVnIiB9LAorICB7IDE3NywgInBsdXNtbiIgfSwKKyAgeyAxNzgsICJzdXAyIiB9LAorICB7IDE3OSwgInN1cDMiIH0sCisgIHsgMTgwLCAiYWN1dGUiIH0sCisgIHsgMTgxLCAibWljcm8iIH0sCisgIHsgMTgyLCAicGFyYSIgfSwKKyAgeyAxODMsICJtaWRkb3QiIH0sCisgIHsgMTg0LCAiY2VkaWwiIH0sCisgIHsgMTg1LCAic3VwMSIgfSwKKyAgeyAxODYsICJvcmRtIiB9LAorICB7IDE4NywgInJhcXVvIiB9LAorICB7IDE4OCwgImZyYWMxNCIgfSwKKyAgeyAxODksICJmcmFjMTIiIH0sCisgIHsgMTkwLCAiZnJhYzM0IiB9LAorICB7IDE5MSwgImlxdWVzdCIgfSwKKyAgeyAxOTIsICJBZ3JhdmUiIH0sCisgIHsgMTkzLCAiQWFjdXRlIiB9LAorICB7IDE5NCwgIkFjaXJjIiB9LAorICB7IDE5NSwgIkF0aWxkZSIgfSwKKyAgeyAxOTYsICJBdW1sIiB9LAorICB7IDE5NywgIkFyaW5nIiB9LAorICB7IDE5OCwgIkFFbGlnIiB9LAorICB7IDE5OSwgIkNjZWRpbCIgfSwKKyAgeyAyMDAsICJFZ3JhdmUiIH0sCisgIHsgMjAxLCAiRWFjdXRlIiB9LAorICB7IDIwMiwgIkVjaXJjIiB9LAorICB7IDIwMywgIkV1bWwiIH0sCisgIHsgMjA0LCAiSWdyYXZlIiB9LAorICB7IDIwNSwgIklhY3V0ZSIgfSwKKyAgeyAyMDYsICJJY2lyYyIgfSwKKyAgeyAyMDcsICJJdW1sIiB9LAorICB7IDIwOCwgIkVUSCIgfSwKKyAgeyAyMDksICJOdGlsZGUiIH0sCisgIHsgMjEwLCAiT2dyYXZlIiB9LAorICB7IDIxMSwgIk9hY3V0ZSIgfSwKKyAgeyAyMTIsICJPY2lyYyIgfSwKKyAgeyAyMTMsICJPdGlsZGUiIH0sCisgIHsgMjE0LCAiT3VtbCIgfSwKKyAgeyAyMTUsICJ0aW1lcyIgfSwKKyAgeyAyMTYsICJPc2xhc2giIH0sCisgIHsgMjE3LCAiVWdyYXZlIiB9LAorICB7IDIxOCwgIlVhY3V0ZSIgfSwKKyAgeyAyMTksICJVY2lyYyIgfSwKKyAgeyAyMjAsICJVdW1sIiB9LAorICB7IDIyMSwgIllhY3V0ZSIgfSwKKyAgeyAyMjIsICJUSE9STiIgfSwKKyAgeyAyMjMsICJzemxpZyIgfSwKKyAgeyAyMjQsICJhZ3JhdmUiIH0sCisgIHsgMjI1LCAiYWFjdXRlIiB9LAorICB7IDIyNiwgImFjaXJjIiB9LAorICB7IDIyNywgImF0aWxkZSIgfSwKKyAgeyAyMjgsICJhdW1sIiB9LAorICB7IDIyOSwgImFyaW5nIiB9LAorICB7IDIzMCwgImFlbGlnIiB9LAorICB7IDIzMSwgImNjZWRpbCIgfSwKKyAgeyAyMzIsICJlZ3JhdmUiIH0sCisgIHsgMjMzLCAiZWFjdXRlIiB9LAorICB7IDIzNCwgImVjaXJjIiB9LAorICB7IDIzNSwgImV1bWwiIH0sCisgIHsgMjM2LCAiaWdyYXZlIiB9LAorICB7IDIzNywgImlhY3V0ZSIgfSwKKyAgeyAyMzgsICJpY2lyYyIgfSwKKyAgeyAyMzksICJpdW1sIiB9LAorICB7IDI0MCwgImV0aCIgfSwKKyAgeyAyNDEsICJudGlsZGUiIH0sCisgIHsgMjQyLCAib2dyYXZlIiB9LAorICB7IDI0MywgIm9hY3V0ZSIgfSwKKyAgeyAyNDQsICJvY2lyYyIgfSwKKyAgeyAyNDUsICJvdGlsZGUiIH0sCisgIHsgMjQ2LCAib3VtbCIgfSwKKyAgeyAyNDcsICJkaXZpZGUiIH0sCisgIHsgMjQ4LCAib3NsYXNoIiB9LAorICB7IDI0OSwgInVncmF2ZSIgfSwKKyAgeyAyNTAsICJ1YWN1dGUiIH0sCisgIHsgMjUxLCAidWNpcmMiIH0sCisgIHsgMjUyLCAidXVtbCIgfSwKKyAgeyAyNTMsICJ5YWN1dGUiIH0sCisgIHsgMjU0LCAidGhvcm4iIH0sCisgIHsgMjU1LCAieXVtbCIgfSwKKyAgeyAgIDAsIE5VTEwgfQorfTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCBoX2Vycm9yX2NvZGVzW10gPQoreworI2lmZGVmIEhPU1RfTk9UX0ZPVU5EICAgCisgIHsgSE9TVF9OT1RfRk9VTkQsICJIb3N0IG5vdCBmb3VuZCIgfSwKKyNlbmRpZgorI2lmZGVmIFRSWV9BR0FJTgorICB7IFRSWV9BR0FJTiwgIlRyeSBBZ2FpbiIgfSwKKyNlbmRpZgorI2lmZGVmIE5PX1JFQ09WRVJZICAKKyAgeyBOT19SRUNPVkVSWSwgIk5vIFJlY292ZXJ5IiB9LAorI2VuZGlmCisjaWZkZWYgTk9fREFUQQorICB7IE5PX0RBVEEsICJObyBEYXRhIiB9LAorI2VuZGlmCisjaWZkZWYgTk9fQUREUkVTUworICB7IE5PX0FERFJFU1MsICJObyBBZGRyZXNzIiB9LAorI2VuZGlmCisgIHsgMCwgTlVMTCB9Cit9OworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCBoX2h0dHBfZXJyb3JfY29kZXNbXSA9Cit7IHsgMjAxLCAiQ3JlYXRlZCIgfSwKKyAgeyAyMDIsICJBY2NlcHRlZCIgfSwKKyAgeyAyMDMsICJOb24tQXV0aG9yaXRhdGl2ZSBJbmZvcm1hdGlvbiIgfSwKKyAgeyAyMDQsICJObyBDb250ZW50IiB9LAorICB7IDIwNSwgIlJlc2V0IENvbnRlbnQiIH0sCisgIHsgMjA2LCAiUGFydGlhbCBDb250ZW50IiB9LAorICB7IDMwMCwgIk11bHRpcGxlIENob2ljZXMiIH0sCisgIHsgMzAxLCAiTW92ZWQgUGVybWFuZW50bHkiIH0sCisgIHsgMzAyLCAiRm91bmQiIH0sCisgIHsgMzAzLCAiU2VlIE90aGVyIiB9LAorICB7IDMwNCwgIk5vdCBNb2RpZmllZCIgfSwKKyAgeyAzMDUsICJVc2UgUHJveHkiIH0sCisgIHsgMzA3LCAiVGVtcG9yYXJ5IFJlZGlyZWN0IiB9LAorICB7IDQwMCwgIkJhZCBSZXF1ZXN0IiB9LAorICB7IDQwMSwgIlVuYXV0aG9yaXplZCIgfSwKKyAgeyA0MDIsICJQYXltZW50IFJlcXVpcmVkIiB9LAorICB7IDQwMywgIkZvcmJpZGRlbiIgfSwKKyAgeyA0MDQsICJOb3QgRm91bmQiIH0sCisgIHsgNDA1LCAiTWV0aG9kIE5vdCBBbGxvd2VkIiB9LAorICB7IDQwNiwgIk5vdCBBY2NlcHRhYmxlIiB9LAorICB7IDQwNywgIlByb3h5IEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkIiB9LAorICB7IDQwOCwgIlJlcXVlc3QgVGltZS1vdXQiIH0sCisgIHsgNDA5LCAiQ29uZmxpY3QiIH0sCisgIHsgNDEwLCAiR29uZSIgfSwKKyAgeyA0MTEsICJMZW5ndGggUmVxdWlyZWQiIH0sCisgIHsgNDEyLCAiUHJlY29uZGl0aW9uIEZhaWxlZCIgfSwKKyAgeyA0MTMsICJSZXF1ZXN0IEVudGl0eSBUb28gTGFyZ2UiIH0sCisgIHsgNDE0LCAiUmVxdWVzdC1VUkkgVG9vIExhcmdlIiB9LAorICB7IDQxNSwgIlVuc3VwcG9ydGVkIE1lZGlhIFR5cGUiIH0sCisgIHsgNDE2LCAiUmVxdWVzdGVkIHJhbmdlIG5vdCBzYXRpc2ZpYWJsZSIgfSwKKyAgeyA0MTcsICJFeHBlY3RhdGlvbiBGYWlsZWQiIH0sCisgIHsgNTAwLCAiSW50ZXJuYWwgU2VydmVyIEVycm9yIiB9LAorICB7IDUwMSwgIk5vdCBJbXBsZW1lbnRlZCIgfSwKKyAgeyA1MDIsICJCYWQgR2F0ZXdheSIgfSwKKyAgeyA1MDMsICJTZXJ2aWNlIFVuYXZhaWxhYmxlIiB9LAorICB7IDUwNCwgIkdhdGV3YXkgVGltZS1vdXQiIH0sCisgIHsgNTA1LCAiSFRUUCBWZXJzaW9uIG5vdCBzdXBwb3J0ZWQiIH0sCisgIHsgICAwLCBOVUxMIH0KK307CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgV0lUSF9PUEVOU1NMCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgaF9zc2xfZXJyb3JfY29kZXNbXSA9Cit7CisjZGVmaW5lIF9TU0xfRVJST1IoZSkgeyBlLCAjZSB9CisgIF9TU0xfRVJST1IoU1NMX0VSUk9SX1NTTCksCisgIF9TU0xfRVJST1IoU1NMX0VSUk9SX1pFUk9fUkVUVVJOKSwKKyAgX1NTTF9FUlJPUihTU0xfRVJST1JfV0FOVF9SRUFEKSwKKyAgX1NTTF9FUlJPUihTU0xfRVJST1JfV0FOVF9XUklURSksCisgIF9TU0xfRVJST1IoU1NMX0VSUk9SX1dBTlRfQ09OTkVDVCksCisgIF9TU0xfRVJST1IoU1NMX0VSUk9SX1dBTlRfWDUwOV9MT09LVVApLAorICBfU1NMX0VSUk9SKFNTTF9FUlJPUl9TWVNDQUxMKSwKKyAgeyAwLCBOVUxMIH0KK307CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU5FUgorc3RhdGljIGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwIG1pbWVfY29kZXNbXSA9Cit7IHsgU09BUF9NSU1FXzdCSVQsCQkiN2JpdCIgfSwKKyAgeyBTT0FQX01JTUVfOEJJVCwJCSI4Yml0IiB9LAorICB7IFNPQVBfTUlNRV9CSU5BUlksCQkiYmluYXJ5IiB9LAorICB7IFNPQVBfTUlNRV9RVU9URURfUFJJTlRBQkxFLCAicXVvdGVkLXByaW50YWJsZSIgfSwKKyAgeyBTT0FQX01JTUVfQkFTRTY0LAkJImJhc2U2NCIgfSwKKyAgeyBTT0FQX01JTUVfSUVURl9UT0tFTiwJImlldGYtdG9rZW4iIH0sCisgIHsgU09BUF9NSU1FX1hfVE9LRU4sCQkieC10b2tlbiIgfSwKKyAgeyAwLAkJCQlOVUxMIH0KK307CisjZW5kaWYKKworI2lmZGVmIFdJTjMyCitzdGF0aWMgaW50IHRjcF9kb25lID0gMDsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citmc2VuZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgc2l6ZV90IG4pCit7IHJlZ2lzdGVyIGludCBud3JpdHRlbjsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiAhZGVmaW5lZChXSVRIX0xFQU4pCisgIGlmIChzb2FwLT5vcykKKyAgeyBzb2FwLT5vcy0+d3JpdGUocywgbik7CisgICAgaWYgKHNvYXAtPm9zLT5nb29kKCkpCisgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICByZXR1cm4gU09BUF9FT0Y7CisgIH0KKyNlbmRpZgorICB3aGlsZSAobikKKyAgeyBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgICB7IAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIGlmIChzb2FwLT5zZW5kX3RpbWVvdXQpCisgICAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICAgIGZkX3NldCBmZDsKKyAgICAgICAgaWYgKHNvYXAtPnNlbmRfdGltZW91dCA+IDApCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSBzb2FwLT5zZW5kX3RpbWVvdXQ7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSAtc29hcC0+c2VuZF90aW1lb3V0LzEwMDAwMDA7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gLXNvYXAtPnNlbmRfdGltZW91dCUxMDAwMDAwOworICAgICAgICB9CisgICAgICAgIEZEX1pFUk8oJmZkKTsKKyAgICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZmZCk7CisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsgcmVnaXN0ZXIgaW50IHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgTlVMTCwgJmZkLCAmZmQsICZ0aW1lb3V0KTsKKyAgICAgICAgICBpZiAociA+IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBpZiAoIXIpCisgICAgICAgICAgeyBzb2FwLT5lcnJudW0gPSAwOworICAgICAgICAgICAgcmV0dXJuIFNPQVBfRU9GOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUiAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VBR0FJTikKKyAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgICAgcmV0dXJuIFNPQVBfRU9GOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisjaWZkZWYgV0lUSF9PUEVOU1NMCisgICAgICBpZiAoc29hcC0+c3NsKQorICAgICAgICBud3JpdHRlbiA9IFNTTF93cml0ZShzb2FwLT5zc2wsIHMsIG4pOworICAgICAgZWxzZSBpZiAoc29hcC0+YmlvKQorICAgICAgICBud3JpdHRlbiA9IEJJT193cml0ZShzb2FwLT5iaW8sIHMsIG4pOworICAgICAgZWxzZQorI2VuZGlmCisjaWZkZWYgV0lUSF9VRFAKKyAgICAgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgICB7IGlmIChzb2FwLT5wZWVybGVuKQorCSAgbndyaXR0ZW4gPSBzZW5kdG8oKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgcywgbiwgc29hcC0+c29ja2V0X2ZsYWdzLCAoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlciwgc29hcC0+cGVlcmxlbik7CisgICAgICAgIGVsc2UKKwkgIG53cml0dGVuID0gc2VuZCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MpOworCS8qIHJldHJ5IGFuZCBiYWNrLW9mZiBhbGdvcml0aG0gKi8KKwkvKiBUT0RPOiB0aGlzIGlzIG5vdCB2ZXJ5IGNsZWFyIGZyb20gc3BlY3Mgc28gdmVyaWZ5IGFuZCBsaW1pdCBjb25kaXRpb25zIHVuZGVyIHdoaWNoIHdlIHNob3VsZCBsb29wIChlLmcuIEVOT0JVRlMpICovCisJaWYgKG53cml0dGVuIDwgMCkKKyAgICAgICAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgICAgICAgIGZkX3NldCBmZDsKKwkgIGludCB1ZHBfcmVwZWF0OworCSAgaW50IHVkcF9kZWxheTsKKyAgICAgICAgICBpZiAoKHNvYXAtPmNvbm5lY3RfZmxhZ3MgJiBTT19CUk9BRENBU1QpKQorCSAgICB1ZHBfcmVwZWF0ID0gMzsgLyogU09BUC1vdmVyLVVEUCBNVUxUSUNBU1RfVURQX1JFUEVBVCAtIDEgKi8KKyAgICAgICAgICBlbHNlCisJICAgIHVkcF9yZXBlYXQgPSAxOyAvKiBTT0FQLW92ZXItVURQIFVOSUNBU1RfVURQX1JFUEVBVCAtIDEgKi8KKwkgIHVkcF9kZWxheSA9IChzb2FwX3JhbmRvbSAlIDIwMSkgKyA1MDsgLyogVURQX01JTl9ERUxBWSAuLiBVRFBfTUFYX0RFTEFZICovCisJICBkbworICAgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSAwOworICAgICAgICAgICAgdGltZW91dC50dl91c2VjID0gMTAwMCAqIHVkcF9kZWxheTsgLyogbXMgKi8KKyAgICAgICAgICAgIEZEX1pFUk8oJmZkKTsKKyAgICAgICAgICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmZmQpOworICAgICAgICAgICAgc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksIE5VTEwsIE5VTEwsICZmZCwgJnRpbWVvdXQpOworCSAgICBpZiAoc29hcC0+cGVlcmxlbikKKwkgICAgICBud3JpdHRlbiA9IHNlbmR0bygoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyLCBzb2FwLT5wZWVybGVuKTsKKyAgICAgICAgICAgIGVsc2UKKwkgICAgICBud3JpdHRlbiA9IHNlbmQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgcywgbiwgc29hcC0+c29ja2V0X2ZsYWdzKTsKKwkgICAgdWRwX2RlbGF5IDw8PSAxOworCSAgICBpZiAodWRwX2RlbGF5ID4gNTAwKSAvKiBVRFBfVVBQRVJfREVMQVkgKi8KKwkgICAgICB1ZHBfZGVsYXkgPSA1MDA7CisJICB9CisJICB3aGlsZSAobndyaXR0ZW4gPCAwICYmIC0tdWRwX3JlcGVhdCA+IDApOworCX0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyNlbmRpZgorI2lmICFkZWZpbmVkKFBBTE0pICYmICFkZWZpbmVkKEFTNDAwKQorICAgICAgICBud3JpdHRlbiA9IHNlbmQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgcywgbiwgc29hcC0+c29ja2V0X2ZsYWdzKTsKKyNlbHNlCisgICAgICAgIG53cml0dGVuID0gc2VuZCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAodm9pZCopcywgbiwgc29hcC0+c29ja2V0X2ZsYWdzKTsKKyNlbmRpZgorICAgICAgaWYgKG53cml0dGVuIDw9IDApCisgICAgICB7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisJaW50IGVycjsKKyAgICAgICAgaWYgKHNvYXAtPnNzbCAmJiAoZXJyID0gU1NMX2dldF9lcnJvcihzb2FwLT5zc2wsIG53cml0dGVuKSkgIT0gU1NMX0VSUk9SX05PTkUgJiYgZXJyICE9IFNTTF9FUlJPUl9XQU5UX1JFQUQgJiYgZXJyICE9IFNTTF9FUlJPUl9XQU5UX1dSSVRFKQorICAgICAgICAgIHJldHVybiBTT0FQX0VPRjsKKyNlbmRpZgorICAgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUiAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VXT1VMREJMT0NLICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUFHQUlOKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgIHJldHVybiBTT0FQX0VPRjsKKyAgICAgICAgfQorICAgICAgICBud3JpdHRlbiA9IDA7IC8qIGFuZCBjYWxsIHdyaXRlKCkgYWdhaW4gKi8KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyNpZmRlZiBXSVRIX0ZBU1RDR0kKKyAgICAgIG53cml0dGVuID0gZndyaXRlKCh2b2lkKilzLCAxLCBuLCBzdGRvdXQpOworICAgICAgZmZsdXNoKHN0ZG91dCk7CisjZWxzZQorI2lmZGVmIFVOREVSX0NFCisgICAgICBud3JpdHRlbiA9IGZ3cml0ZShzLCAxLCBuLCBzb2FwLT5zZW5kZmQpOworI2Vsc2UKKyNpZmRlZiBWWFdPUktTCisjaWZkZWYgV01XX1JQTV9JTworICAgICAgaWYgKHNvYXAtPnJwbXJlcWlkKQorICAgICAgICBud3JpdHRlbiA9IChodHRwQmxvY2tQdXQoc29hcC0+cnBtcmVxaWQsIHMsIG4pID09IDApID8gbiA6IC0xOyAKKyAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICBud3JpdHRlbiA9IGZ3cml0ZShzLCBzaXplb2YoY2hhciksIG4sIGZkb3Blbihzb2FwLT5zZW5kZmQsICJ3IikpOworI2Vsc2UKKyAgICAgIG53cml0dGVuID0gd3JpdGUoKFNPQVBfU09DS0VUKXNvYXAtPnNlbmRmZCwgcywgbik7CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisgICAgICBpZiAobndyaXR0ZW4gPD0gMCkKKyAgICAgIHsgaWYgKHNvYXBfZXJybm8gIT0gU09BUF9FSU5UUiAmJiBzb2FwX2Vycm5vICE9IFNPQVBfRVdPVUxEQkxPQ0sgJiYgc29hcF9lcnJubyAhPSBTT0FQX0VBR0FJTikKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX2Vycm5vOworICAgICAgICAgIHJldHVybiBTT0FQX0VPRjsKKyAgICAgICAgfQorICAgICAgICBud3JpdHRlbiA9IDA7IC8qIGFuZCBjYWxsIHdyaXRlKCkgYWdhaW4gKi8KKyAgICAgIH0KKyAgICB9CisgICAgbiAtPSBud3JpdHRlbjsKKyAgICBzICs9IG53cml0dGVuOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2VuZF9yYXcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBuKQoreyBpZiAoIW4pCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgIHsgc29hcC0+Y291bnQgKz0gbjsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgICBpZiAoc29hcC0+ZnByZXBhcmVzZW5kICYmIChzb2FwLT5tb2RlICYgU09BUF9JTykgIT0gU09BUF9JT19TVE9SRSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IHNvYXAtPmZwcmVwYXJlc2VuZChzb2FwLCBzLCBuKTsKKyNlbmRpZgorICAgIHJldHVybiBTT0FQX09LOworICB9CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JTykKKyAgeyByZWdpc3RlciBzaXplX3QgaSA9IFNPQVBfQlVGTEVOIC0gc29hcC0+YnVmaWR4OworICAgIHdoaWxlIChuID49IGkpCisgICAgeyBtZW1jcHkoc29hcC0+YnVmICsgc29hcC0+YnVmaWR4LCBzLCBpKTsKKyAgICAgIHNvYXAtPmJ1ZmlkeCA9IFNPQVBfQlVGTEVOOworICAgICAgaWYgKHNvYXBfZmx1c2goc29hcCkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHMgKz0gaTsKKyAgICAgIG4gLT0gaTsKKyAgICAgIGkgPSBTT0FQX0JVRkxFTjsKKyAgICB9CisgICAgbWVtY3B5KHNvYXAtPmJ1ZiArIHNvYXAtPmJ1ZmlkeCwgcywgbik7CisgICAgc29hcC0+YnVmaWR4ICs9IG47CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgcmV0dXJuIHNvYXBfZmx1c2hfcmF3KHNvYXAsIHMsIG4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2ZsdXNoKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgbiA9IHNvYXAtPmJ1ZmlkeDsKKyAgaWYgKG4pCisgIHsgc29hcC0+YnVmaWR4ID0gMDsKKyNpZmRlZiBXSVRIX1pMSUIKKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIpCisgICAgeyBzb2FwLT5kX3N0cmVhbS5uZXh0X2luID0gKEJ5dGUqKXNvYXAtPmJ1ZjsKKyAgICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luID0gKHVuc2lnbmVkIGludCluOworI2lmZGVmIFdJVEhfR1pJUAorICAgICAgc29hcC0+el9jcmMgPSBjcmMzMihzb2FwLT56X2NyYywgKEJ5dGUqKXNvYXAtPmJ1ZiwgKHVuc2lnbmVkIGludCluKTsKKyNlbmRpZgorICAgICAgZG8KKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJEZWZsYXRpbmcgJXUgYnl0ZXNcbiIsIHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luKSk7CisgICAgICAgIGlmIChkZWZsYXRlKCZzb2FwLT5kX3N0cmVhbSwgWl9OT19GTFVTSCkgIT0gWl9PSykKKyAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVuYWJsZSB0byBkZWZsYXRlOiAlc1xuIiwgc29hcC0+ZF9zdHJlYW0ubXNnP3NvYXAtPmRfc3RyZWFtLm1zZzoiIikpOworICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCkKKyAgICAgICAgeyBpZiAoc29hcF9mbHVzaF9yYXcoc29hcCwgc29hcC0+el9idWYsIFNPQVBfQlVGTEVOKSkKKyAgICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IChCeXRlKilzb2FwLT56X2J1ZjsKKyAgICAgICAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgPSBTT0FQX0JVRkxFTjsKKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAoc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4pOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICAgIHJldHVybiBzb2FwX2ZsdXNoX3Jhdyhzb2FwLCBzb2FwLT5idWYsIG4pOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2ZsdXNoX3JhdyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgc2l6ZV90IG4pCit7IGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fU1RPUkUpCisgIHsgcmVnaXN0ZXIgY2hhciAqdDsKKyAgICBpZiAoISh0ID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBuKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICBtZW1jcHkodCwgcywgbik7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgICAgaWYgKHNvYXAtPmZwcmVwYXJlc2VuZCkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IHNvYXAtPmZwcmVwYXJlc2VuZChzb2FwLCBzLCBuKTsKKyNlbmRpZgorICAgIHJldHVybiBTT0FQX09LOworICB9CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgIHsgY2hhciB0WzE2XTsKKyAgICBzcHJpbnRmKHQsICJcclxuJWxYXHJcbiIgKyAoc29hcC0+Y2h1bmtzaXplID8gMCA6IDIpLCAodW5zaWduZWQgbG9uZyluKTsKKyAgICBEQkdNU0coU0VOVCwgdCwgc3RybGVuKHQpKTsKKyAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnNlbmQoc29hcCwgdCwgc3RybGVuKHQpKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgc29hcC0+Y2h1bmtzaXplICs9IG47CisgIH0KKyAgREJHTVNHKFNFTlQsIHMsIG4pOworI2VuZGlmCisgIHJldHVybiBzb2FwLT5lcnJvciA9IHNvYXAtPmZzZW5kKHNvYXAsIHMsIG4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMpCit7IGlmIChzKQorICAgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHN0cmxlbihzKSk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmQyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpCit7IGlmIChzb2FwX3NlbmQoc29hcCwgczEpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfc2VuZChzb2FwLCBzMik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZW5kMyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBjb25zdCBjaGFyICpzMykKK3sgaWYgKHNvYXBfc2VuZChzb2FwLCBzMSkKKyAgIHx8IHNvYXBfc2VuZChzb2FwLCBzMikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9zZW5kKHNvYXAsIHMzKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzaXplX3QKK2ZyZWN2KHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpzLCBzaXplX3QgbikKK3sgcmVnaXN0ZXIgaW50IHI7CisgIHNvYXAtPmVycm51bSA9IDA7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgIWRlZmluZWQoV0lUSF9MRUFOKQorICBpZiAoc29hcC0+aXMpCisgIHsgaWYgKHNvYXAtPmlzLT5nb29kKCkpCisgICAgICByZXR1cm4gc29hcC0+aXMtPnJlYWQocywgbikuZ2NvdW50KCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyNlbmRpZgorICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgeyBmb3IgKDs7KQorICAgIHsgCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgaWYgKHNvYXAtPnJlY3ZfdGltZW91dCkKKyAgICAgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgICAgZmRfc2V0IGZkOworICAgICAgICBpZiAoc29hcC0+cmVjdl90aW1lb3V0ID4gMCkKKyAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IHNvYXAtPnJlY3ZfdGltZW91dDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IC1zb2FwLT5yZWN2X3RpbWVvdXQvMTAwMDAwMDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAtc29hcC0+cmVjdl90aW1lb3V0JTEwMDAwMDA7CisgICAgICAgIH0KKyAgICAgICAgRkRfWkVSTygmZmQpOworICAgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJmZkKTsKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeyByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksICZmZCwgTlVMTCwgJmZkLCAmdGltZW91dCk7CisgICAgICAgICAgaWYgKHIgPiAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgaWYgKCFyKQorCSAgeyBzb2FwLT5lcnJudW0gPSAwOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUFHQUlOKQorCSAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisjaWZkZWYgV0lUSF9PUEVOU1NMCisgICAgICBpZiAoc29hcC0+c3NsKQorICAgICAgeyBpbnQgZXJyOworCXIgPSBTU0xfcmVhZChzb2FwLT5zc2wsIHMsIG4pOworICAgICAgICBpZiAociA+IDApCisgICAgICAgICAgcmV0dXJuIChzaXplX3QpcjsKKwllcnIgPSBTU0xfZ2V0X2Vycm9yKHNvYXAtPnNzbCwgcik7CisJaWYgKGVyciAhPSBTU0xfRVJST1JfTk9ORSAmJiBlcnIgIT0gU1NMX0VSUk9SX1dBTlRfUkVBRCAmJiBlcnIgIT0gU1NMX0VSUk9SX1dBTlRfV1JJVEUpCisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBlbHNlIGlmIChzb2FwLT5iaW8pCisgICAgICB7IHIgPSBCSU9fcmVhZChzb2FwLT5iaW8sIHMsIG4pOworICAgICAgICBpZiAociA+IDApCisgICAgICAgICAgcmV0dXJuIChzaXplX3QpcjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBlbHNlCisjZW5kaWYKKyAgICAgIHsgCisjaWZkZWYgV0lUSF9VRFAKKyAgICAgICAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICAgICAgeyBTT0FQX1NPQ0tMRU5fVCBrID0gKFNPQVBfU09DS0xFTl9UKXNpemVvZihzb2FwLT5wZWVyKTsKKwkgIG1lbXNldCgodm9pZCopJnNvYXAtPnBlZXIsIDAsIHNpemVvZihzb2FwLT5wZWVyKSk7CisgICAgICAgICAgciA9IHJlY3Zmcm9tKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHMsIG4sIHNvYXAtPnNvY2tldF9mbGFncywgKHN0cnVjdCBzb2NrYWRkciopJnNvYXAtPnBlZXIsICZrKTsJLyogcG9ydGFiaWxpdHkgbm90ZTogc2VlIFNPQVBfU09DS0xFTl9UIGRlZmluaXRpb24gaW4gc3Rkc29hcDIuaCAqLworCSAgc29hcC0+cGVlcmxlbiA9IChzaXplX3QpazsKKyNpZm5kZWYgV0lUSF9JUFY2CisgICAgICAgICAgc29hcC0+aXAgPSBudG9obChzb2FwLT5wZWVyLnNpbl9hZGRyLnNfYWRkcik7CisgICAgICAgICAgc29hcC0+cG9ydCA9IChpbnQpbnRvaHMoc29hcC0+cGVlci5zaW5fcG9ydCk7CisjZW5kaWYKKyAgICAgICAgfQorCWVsc2UKKyNlbmRpZgorICAgICAgICAgIHIgPSByZWN2KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHMsIG4sIHNvYXAtPnNvY2tldF9mbGFncyk7CisgICAgICAgIGlmIChyID49IDApCisgICAgICAgICAgcmV0dXJuIChzaXplX3QpcjsKKyAgICAgICAgaWYgKHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FQUdBSU4gJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FV09VTERCTE9DSykKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgfQorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgICAgZmRfc2V0IGZkOworICAgICAgICB0aW1lb3V0LnR2X3NlYyA9IDA7CisgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDEwMDAwOworICAgICAgICBGRF9aRVJPKCZmZCk7CisgICAgICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmZmQpOworI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgICAgICBpZiAoc29hcC0+c3NsICYmIFNTTF9nZXRfZXJyb3Ioc29hcC0+c3NsLCByKSA9PSBTU0xfRVJST1JfV0FOVF9XUklURSkKKyAgICAgICAgICByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksIE5VTEwsICZmZCwgJmZkLCAmdGltZW91dCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksICZmZCwgTlVMTCwgJmZkLCAmdGltZW91dCk7CisjZWxzZQorICAgICAgICByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksICZmZCwgTlVMTCwgJmZkLCAmdGltZW91dCk7CisjZW5kaWYKKyAgICAgICAgaWYgKHIgPCAwICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIpCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgfQorI2lmZGVmIFdJVEhfRkFTVENHSQorICByZXR1cm4gZnJlYWQocywgMSwgbiwgc3RkaW4pOworI2Vsc2UKKyNpZmRlZiBVTkRFUl9DRQorICByZXR1cm4gZnJlYWQocywgMSwgbiwgc29hcC0+cmVjdmZkKTsKKyNlbHNlCisjaWZkZWYgV01XX1JQTV9JTworICBpZiAoc29hcC0+cnBtcmVxaWQpCisgICAgciA9IGh0dHBCbG9ja1JlYWQoc29hcC0+cnBtcmVxaWQsIHMsIG4pOworICBlbHNlCisjZW5kaWYKKyAgciA9IHJlYWQoKFNPQVBfU09DS0VUKXNvYXAtPnJlY3ZmZCwgcywgbik7CisgIGlmIChyID49IDApCisgICAgcmV0dXJuIChzaXplX3QpcjsKKyAgc29hcC0+ZXJybnVtID0gc29hcF9lcnJubzsKKyAgcmV0dXJuIDA7CisjZW5kaWYKKyNlbmRpZgorfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc29hcF93Y2hhcgorc29hcF9nZXRjaHVua2NoYXIoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwLT5idWZpZHggPCBzb2FwLT5idWZsZW4pCisgICAgcmV0dXJuIHNvYXAtPmJ1Zltzb2FwLT5idWZpZHgrK107CisgIHNvYXAtPmJ1ZmlkeCA9IDA7CisgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmNodW5rYnVmbGVuID0gc29hcC0+ZnJlY3Yoc29hcCwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTik7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVhZCAldSBieXRlcyBmcm9tIHNvY2tldCAlZFxuIiwgKHVuc2lnbmVkIGludClzb2FwLT5idWZsZW4sIHNvYXAtPnNvY2tldCkpOworICBEQkdNU0coUkVDViwgc29hcC0+YnVmLCBzb2FwLT5idWZsZW4pOworICBpZiAoc29hcC0+YnVmbGVuKQorICAgIHJldHVybiBzb2FwLT5idWZbc29hcC0+YnVmaWR4KytdOworICByZXR1cm4gRU9GOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzb2FwX2lzeGRpZ2l0KGludCBjKQoreyByZXR1cm4gKGMgPj0gJzAnICYmIGMgPD0gJzknKSB8fCAoYyA+PSAnQScgJiYgYyA8PSAnRicpIHx8IChjID49ICdhJyAmJiBjIDw9ICdmJyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVjdl9yYXcoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNpemVfdCByZXQ7CisjaWZkZWYgV0lUSF9aTElCCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQikKKyAgeyBpZiAoc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPT0gWl9OVUxMKQorICAgICAgcmV0dXJuIEVPRjsKKyAgICBpZiAoc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4gfHwgIXNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCkKKyAgICB7IHJlZ2lzdGVyIGludCByOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbmZsYXRpbmdcbiIpKTsKKyAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gKEJ5dGUqKXNvYXAtPmJ1ZjsKKyAgICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCA9IFNPQVBfQlVGTEVOOworICAgICAgciA9IGluZmxhdGUoJnNvYXAtPmRfc3RyZWFtLCBaX05PX0ZMVVNIKTsKKyAgICAgIGlmIChyID09IFpfT0sgfHwgciA9PSBaX1NUUkVBTV9FTkQpCisgICAgICB7IHNvYXAtPmJ1ZmlkeCA9IDA7CisgICAgICAgIHNvYXAtPmJ1ZmxlbiA9IFNPQVBfQlVGTEVOIC0gc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0OworICAgICAgICBpZiAoc29hcC0+emxpYl9pbiA9PSBTT0FQX1pMSUJfR1pJUCkKKyAgICAgICAgICBzb2FwLT56X2NyYyA9IGNyYzMyKHNvYXAtPnpfY3JjLCAoQnl0ZSopc29hcC0+YnVmLCAodW5zaWduZWQgaW50KXNvYXAtPmJ1Zmxlbik7CisgICAgICAgIGlmIChyID09IFpfU1RSRUFNX0VORCkKKyAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluZmxhdGVkICVsdS0+JWx1IGJ5dGVzXG4iLCBzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiwgc29hcC0+ZF9zdHJlYW0udG90YWxfb3V0KSk7CisgICAgICAgICAgc29hcC0+el9yYXRpb19pbiA9IChmbG9hdClzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiAvIChmbG9hdClzb2FwLT5kX3N0cmVhbS50b3RhbF9vdXQ7CisgICAgICAgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSBaX05VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvYXAtPmJ1ZmxlbikKKyAgICAgICAgeyBzb2FwLT5jb3VudCArPSBzb2FwLT5idWZsZW47CisgICAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHIgIT0gWl9CVUZfRVJST1IpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5mbGF0ZSBlcnJvcjogJXNcbiIsIHNvYXAtPmRfc3RyZWFtLm1zZz9zb2FwLT5kX3N0cmVhbS5tc2c6IiIpKTsKKyAgICAgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSBaX05VTEw7CisJc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgICAgIHJldHVybiBFT0Y7CisgICAgICB9CisgICAgfQoremxpYl9hZ2FpbjoKKyAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LICYmICFzb2FwLT5jaHVua3NpemUpCisgICAgeyBtZW1jcHkoc29hcC0+YnVmLCBzb2FwLT56X2J1ZiwgU09BUF9CVUZMRU4pOworICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+el9idWZsZW47CisgICAgfQorICB9CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykgLyogcmVhZCBIVFRQIGNodW5rZWQgdHJhbnNmZXIgKi8KKyAgeyAKK2NodW5rX2FnYWluOgorICAgIGlmIChzb2FwLT5jaHVua3NpemUpCisgICAgeyBzb2FwLT5idWZsZW4gPSByZXQgPSBzb2FwLT5mcmVjdihzb2FwLCBzb2FwLT5idWYsIHNvYXAtPmNodW5rc2l6ZSA+IFNPQVBfQlVGTEVOID8gU09BUF9CVUZMRU4gOiBzb2FwLT5jaHVua3NpemUpOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHZXR0aW5nIGNodW5rOiByZWFkICV1IGJ5dGVzXG4iLCAodW5zaWduZWQgaW50KXJldCkpOworICAgICAgREJHTVNHKFJFQ1YsIHNvYXAtPmJ1ZiwgcmV0KTsKKyAgICAgIHNvYXAtPmJ1ZmlkeCA9IDA7CisgICAgICBzb2FwLT5jaHVua3NpemUgLT0gcmV0OworICAgIH0KKyAgICBlbHNlCisgICAgeyByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgICAgICBjaGFyICp0LCB0bXBbOF07CisgICAgICB0ID0gdG1wOworICAgICAgaWYgKCFzb2FwLT5jaHVua2J1ZmxlbikKKyAgICAgIHsgc29hcC0+Y2h1bmtidWZsZW4gPSByZXQgPSBzb2FwLT5mcmVjdihzb2FwLCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOKTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWFkICV1IGJ5dGVzIChjaHVua2VkKSBmcm9tIHNvY2tldCAlZFxuIiwgKHVuc2lnbmVkIGludClyZXQsIHNvYXAtPnNvY2tldCkpOworICAgICAgICBEQkdNU0coUkVDViwgc29hcC0+YnVmLCByZXQpOworICAgICAgICBzb2FwLT5idWZpZHggPSAwOworICAgICAgICBpZiAoIXJldCkKKyAgICAgICAgICByZXR1cm4gc29hcC0+YWhlYWQgPSBFT0Y7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHNvYXAtPmJ1ZmlkeCA9IHNvYXAtPmJ1ZmxlbjsKKyAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmNodW5rYnVmbGVuOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHZXR0aW5nIGNodW5rIHNpemUgKGlkeD0ldSBsZW49JXUpXG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmJ1ZmlkeCwgKHVuc2lnbmVkIGludClzb2FwLT5idWZsZW4pKTsKKyAgICAgIHdoaWxlICghc29hcF9pc3hkaWdpdCgoaW50KShjID0gc29hcF9nZXRjaHVua2NoYXIoc29hcCkpKSkKKyAgICAgICAgaWYgKChpbnQpYyA9PSBFT0YpCisJICByZXR1cm4gc29hcC0+YWhlYWQgPSBFT0Y7CisgICAgICBkbworICAgICAgICAqdCsrID0gKGNoYXIpYzsKKyAgICAgIHdoaWxlIChzb2FwX2lzeGRpZ2l0KChpbnQpKGMgPSBzb2FwX2dldGNodW5rY2hhcihzb2FwKSkpICYmIHQgLSB0bXAgPCA3KTsKKyAgICAgIHdoaWxlICgoaW50KWMgIT0gRU9GICYmIGMgIT0gJ1xuJykKKyAgICAgICAgYyA9IHNvYXBfZ2V0Y2h1bmtjaGFyKHNvYXApOworICAgICAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgIHJldHVybiBzb2FwLT5haGVhZCA9IEVPRjsKKyAgICAgICp0ID0gJ1wwJzsKKyAgICAgIHNvYXAtPmNodW5rc2l6ZSA9IHNvYXBfc3RydG91bCh0bXAsICZ0LCAxNik7CisgICAgICBpZiAoIXNvYXAtPmNodW5rc2l6ZSkKKyAgICAgIHsgc29hcC0+Y2h1bmtidWZsZW4gPSAwOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBvZiBjaHVua2VkIG1lc3NhZ2VcbiIpKTsKKwl3aGlsZSAoKGludCljICE9IEVPRiAmJiBjICE9ICdcbicpCisgICAgICAgICAgYyA9IHNvYXBfZ2V0Y2h1bmtjaGFyKHNvYXApOworICAgICAgICByZXR1cm4gc29hcC0+YWhlYWQgPSBFT0Y7CisgICAgICB9CisgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5idWZpZHggKyBzb2FwLT5jaHVua3NpemU7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk1vdmluZyBidWYgbGVuIHRvIGlkeD0ldSBsZW49JXUgKCVzKVxuIiwgKHVuc2lnbmVkIGludClzb2FwLT5idWZpZHgsICh1bnNpZ25lZCBpbnQpc29hcC0+YnVmbGVuLCB0bXApKTsKKyAgICAgIGlmIChzb2FwLT5idWZsZW4gPiBzb2FwLT5jaHVua2J1ZmxlbikKKyAgICAgIHsgc29hcC0+YnVmbGVuID0gc29hcC0+Y2h1bmtidWZsZW47CisgICAgICAgIHNvYXAtPmNodW5rc2l6ZSAtPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgICAgIHNvYXAtPmNodW5rYnVmbGVuID0gMDsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQYXNzZWQgZW5kIG9mIGJ1ZmZlciBmb3IgY2h1bmtlZCBIVFRQICgldSBieXRlcyBsZWZ0KVxuIiwgKHVuc2lnbmVkIGludCkoc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4KSkpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoc29hcC0+Y2h1bmtidWZsZW4pCisgICAgICAgIHNvYXAtPmNodW5rc2l6ZSA9IDA7CisgICAgICByZXQgPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgICBpZiAoIXJldCkKKyAgICAgICAgZ290byBjaHVua19hZ2FpbjsKKyAgICB9CisgIH0KKyAgZWxzZQorI2VuZGlmCisgIHsgc29hcC0+YnVmaWR4ID0gMDsKKyAgICBzb2FwLT5idWZsZW4gPSByZXQgPSBzb2FwLT5mcmVjdihzb2FwLCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOKTsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlYWQgJXUgYnl0ZXMgZnJvbSBzb2NrZXQgJWRcbiIsICh1bnNpZ25lZCBpbnQpcmV0LCBzb2FwLT5zb2NrZXQpKTsKKyAgICBEQkdNU0coUkVDViwgc29hcC0+YnVmLCByZXQpOworICB9CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5mcHJlcGFyZXJlY3YgJiYgKHNvYXAtPmVycm9yID0gc29hcC0+ZnByZXBhcmVyZWN2KHNvYXAsIHNvYXAtPmJ1ZiwgcmV0KSkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2VuZGlmCisjaWZkZWYgV0lUSF9aTElCCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQikKKyAgeyByZWdpc3RlciBpbnQgcjsKKyAgICBtZW1jcHkoc29hcC0+el9idWYsIHNvYXAtPmJ1ZiwgU09BUF9CVUZMRU4pOworICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfaW4gPSAoQnl0ZSopKHNvYXAtPnpfYnVmICsgc29hcC0+YnVmaWR4KTsKKyAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbiA9ICh1bnNpZ25lZCBpbnQpcmV0OworICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gKEJ5dGUqKXNvYXAtPmJ1ZjsKKyAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgPSBTT0FQX0JVRkxFTjsKKyAgICByID0gaW5mbGF0ZSgmc29hcC0+ZF9zdHJlYW0sIFpfTk9fRkxVU0gpOworICAgIGlmIChyID09IFpfT0sgfHwgciA9PSBaX1NUUkVBTV9FTkQpCisgICAgeyBzb2FwLT5idWZpZHggPSAwOworICAgICAgc29hcC0+el9idWZsZW4gPSBzb2FwLT5idWZsZW47CisgICAgICBzb2FwLT5idWZsZW4gPSByZXQgPSBTT0FQX0JVRkxFTiAtIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dDsKKyAgICAgIGlmIChzb2FwLT56bGliX2luID09IFNPQVBfWkxJQl9HWklQKQorICAgICAgICBzb2FwLT56X2NyYyA9IGNyYzMyKHNvYXAtPnpfY3JjLCAoQnl0ZSopc29hcC0+YnVmLCAodW5zaWduZWQgaW50KXNvYXAtPmJ1Zmxlbik7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluZmxhdGVkICV1IGJ5dGVzXG4iLCAodW5zaWduZWQgaW50KXJldCkpOworICAgICAgaWYgKCFyZXQpCisgICAgICAgIGdvdG8gemxpYl9hZ2FpbjsKKyAgICAgIGlmIChyID09IFpfU1RSRUFNX0VORCkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbmZsYXRlZCAlbHUtPiVsdSBieXRlc1xuIiwgc29hcC0+ZF9zdHJlYW0udG90YWxfaW4sIHNvYXAtPmRfc3RyZWFtLnRvdGFsX291dCkpOworICAgICAgICBzb2FwLT56X3JhdGlvX2luID0gKGZsb2F0KXNvYXAtPmRfc3RyZWFtLnRvdGFsX2luIC8gKGZsb2F0KXNvYXAtPmRfc3RyZWFtLnRvdGFsX291dDsKKyAgICAgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSBaX05VTEw7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVW5hYmxlIHRvIGluZmxhdGU6ICglZCkgJXNcbiIsIHIsIHNvYXAtPmRfc3RyZWFtLm1zZz9zb2FwLT5kX3N0cmVhbS5tc2c6IiIpKTsKKyAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gWl9OVUxMOworICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgICByZXR1cm4gRU9GOworICAgIH0KKyAgfQorI2VuZGlmCisgIHNvYXAtPmNvdW50ICs9IHJldDsKKyAgcmV0dXJuICFyZXQ7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVjdihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkKKyAgeyBpZiAoc29hcC0+ZGltZS5idWZsZW4pCisgICAgeyBjaGFyICpzOworICAgICAgaW50IGk7CisgICAgICB1bnNpZ25lZCBjaGFyIHRtcFsxMl07CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRJTUUgaGRyIGZvciBjaHVua2VkIERJTUUgaXMgaW4gYnVmZmVyXG4iKSk7CisgICAgICBzb2FwLT5jb3VudCArPSBzb2FwLT5kaW1lLmJ1ZmxlbiAtIHNvYXAtPmJ1ZmxlbjsKKyAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmRpbWUuYnVmbGVuOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTa2lwIHBhZGRpbmcgKCVsZCBieXRlcylcbiIsIC0obG9uZylzb2FwLT5kaW1lLnNpemUmMykpOworICAgICAgZm9yIChpID0gLShsb25nKXNvYXAtPmRpbWUuc2l6ZSYzOyBpID4gMDsgaS0tKQorICAgICAgeyBzb2FwLT5idWZpZHgrKzsKKyAgICAgICAgaWYgKHNvYXAtPmJ1ZmlkeCA+PSBzb2FwLT5idWZsZW4pCisgICAgICAgICAgaWYgKHNvYXBfcmVjdl9yYXcoc29hcCkpCisgICAgICAgICAgICByZXR1cm4gRU9GOworICAgICAgfQorICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHZXQgRElNRSBoZHIgZm9yIG5leHQgY2h1bmtcbiIpKTsKKyAgICAgIHMgPSAoY2hhciopdG1wOworICAgICAgZm9yIChpID0gMTI7IGkgPiAwOyBpLS0pCisgICAgICB7ICpzKysgPSBzb2FwLT5idWZbc29hcC0+YnVmaWR4KytdOworICAgICAgICBpZiAoc29hcC0+YnVmaWR4ID49IHNvYXAtPmJ1ZmxlbikKKyAgICAgICAgICBpZiAoc29hcF9yZWN2X3Jhdyhzb2FwKSkKKyAgICAgICAgICAgIHJldHVybiBFT0Y7CisgICAgICB9CisgICAgICBzb2FwLT5kaW1lLmZsYWdzID0gdG1wWzBdICYgMHg3OworICAgICAgc29hcC0+ZGltZS5zaXplID0gKChzaXplX3QpdG1wWzhdIDw8IDI0KSB8ICgoc2l6ZV90KXRtcFs5XSA8PCAxNikgfCAoKHNpemVfdCl0bXBbMTBdIDw8IDgpIHwgKChzaXplX3QpdG1wWzExXSk7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdldCBESU1FIGNodW5rICgldSBieXRlcylcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+ZGltZS5zaXplKSk7CisgICAgICBpZiAoc29hcC0+ZGltZS5mbGFncyAmIFNPQVBfRElNRV9DRikKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJNb3JlIGNodW5raW5nXG4iKSk7CisgICAgICAgIHNvYXAtPmRpbWUuY2h1bmtzaXplID0gc29hcC0+ZGltZS5zaXplOworICAgICAgICBpZiAoc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4ID49IHNvYXAtPmRpbWUuc2l6ZSkKKyAgICAgICAgeyBzb2FwLT5kaW1lLmJ1ZmxlbiA9IHNvYXAtPmJ1ZmxlbjsKKyAgICAgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5idWZpZHggKyBzb2FwLT5kaW1lLmNodW5rc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgc29hcC0+ZGltZS5jaHVua3NpemUgLT0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkxhc3QgY2h1bmtcbiIpKTsKKyAgICAgICAgc29hcC0+ZGltZS5idWZsZW4gPSAwOworICAgICAgICBzb2FwLT5kaW1lLmNodW5rc2l6ZSA9IDA7CisgICAgICB9CisgICAgICBzb2FwLT5jb3VudCA9IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiJXUgYnl0ZXMgcmVtYWluaW5nXG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmNvdW50KSk7CisgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICB9CisgICAgaWYgKHNvYXAtPmRpbWUuY2h1bmtzaXplKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHZXQgbmV4dCBESU1FIGhkciBmb3IgY2h1bmtlZCBESU1FICgldSBieXRlcyBjaHVuaylcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+ZGltZS5jaHVua3NpemUpKTsKKyAgICAgIGlmIChzb2FwX3JlY3ZfcmF3KHNvYXApKQorICAgICAgICByZXR1cm4gRU9GOworICAgICAgaWYgKHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeCA+PSBzb2FwLT5kaW1lLmNodW5rc2l6ZSkKKyAgICAgIHsgc29hcC0+ZGltZS5idWZsZW4gPSBzb2FwLT5idWZsZW47CisgICAgICAgIHNvYXAtPmNvdW50IC09IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeCAtIHNvYXAtPmRpbWUuY2h1bmtzaXplOworICAgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5idWZpZHggKyBzb2FwLT5kaW1lLmNodW5rc2l6ZTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgc29hcC0+ZGltZS5jaHVua3NpemUgLT0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIlbHUgYnl0ZXMgcmVtYWluaW5nLCBjb3VudD0ldVxuIiwgKHVuc2lnbmVkIGxvbmcpKHNvYXAtPmJ1Zmxlbi1zb2FwLT5idWZpZHgpLCAodW5zaWduZWQgaW50KXNvYXAtPmNvdW50KSk7CisgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICB9CisgIH0KKyNlbmRpZgorICByZXR1cm4gc29hcF9yZWN2X3Jhdyhzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3NvYXBfd2NoYXIKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0Y2hhcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICBjID0gc29hcC0+YWhlYWQ7CisgIGlmIChjKQorICB7IGlmIChjICE9IEVPRikKKyAgICAgIHNvYXAtPmFoZWFkID0gMDsKKyAgICByZXR1cm4gYzsKKyAgfQorICByZXR1cm4gc29hcF9nZXQxKHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAqCitTT0FQX0ZNQUMyCitzb2FwX2NvZGUoY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgKm1hcCwgY29uc3QgY2hhciAqc3RyKQoreyBpZiAoc3RyKQorICB7IHdoaWxlIChtYXAtPnN0cmluZykKKyAgICB7IGlmICghc3RyY21wKHN0ciwgbWFwLT5zdHJpbmcpKSAvKiBjYXNlIHNlbnNpdGl2ZSAqLworICAgICAgICByZXR1cm4gbWFwOworICAgICAgbWFwKys7CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorbG9uZworU09BUF9GTUFDMgorc29hcF9pbnRfY29kZShjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCAqbWFwLCBjb25zdCBjaGFyICpzdHIsIGxvbmcgb3RoZXIpCit7IHdoaWxlIChtYXAtPnN0cmluZykKKyAgeyBpZiAoIXNvYXBfdGFnX2NtcChzdHIsIG1hcC0+c3RyaW5nKSkgLyogY2FzZSBpbnNlbnNpdGl2ZSAqLworICAgICAgcmV0dXJuIG1hcC0+Y29kZTsKKyAgICBtYXArKzsKKyAgfQorICByZXR1cm4gb3RoZXI7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9zdHJfY29kZShjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCAqbWFwLCBsb25nIGNvZGUpCit7IHdoaWxlIChtYXAtPmNvZGUgIT0gY29kZSAmJiBtYXAtPnN0cmluZykKKyAgICBtYXArKzsKKyAgcmV0dXJuIG1hcC0+c3RyaW5nOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHNvYXBfd2NoYXIKK3NvYXBfY2hhcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgY2hhciB0bXBbOF07CisgIHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIHJlZ2lzdGVyIGNoYXIgKnMgPSB0bXA7CisgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspCisgIHsgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICBpZiAoYyA9PSAnOycgfHwgKGludCljID09IEVPRikKKyAgICAgIGJyZWFrOworICAgICpzKysgPSAoY2hhciljOworICB9CisgICpzID0gJ1wwJzsKKyAgaWYgKCp0bXAgPT0gJyMnKQorICB7IGlmICh0bXBbMV0gPT0gJ3gnIHx8IHRtcFsxXSA9PSAnWCcpCisgICAgICByZXR1cm4gc29hcF9zdHJ0b2wodG1wICsgMiwgTlVMTCwgMTYpOworICAgIHJldHVybiBhdG9sKHRtcCArIDEpOworICB9CisgIGlmICghc3RyY21wKHRtcCwgImx0IikpCisgICAgcmV0dXJuICc8JzsKKyAgaWYgKCFzdHJjbXAodG1wLCAiZ3QiKSkKKyAgICByZXR1cm4gJz4nOworICBpZiAoIXN0cmNtcCh0bXAsICJhbXAiKSkKKyAgICByZXR1cm4gJyYnOworICBpZiAoIXN0cmNtcCh0bXAsICJxdW90IikpCisgICAgcmV0dXJuICciJzsKKyAgaWYgKCFzdHJjbXAodG1wLCAiYXBvcyIpKQorICAgIHJldHVybiAnXCcnOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgcmV0dXJuIChzb2FwX3djaGFyKXNvYXBfaW50X2NvZGUoaHRtbF9lbnRpdHlfY29kZXMsIHRtcCwgU09BUF9VTktOT1dOX0NIQVIpOworI2Vsc2UKKyAgcmV0dXJuIFNPQVBfVU5LTk9XTl9DSEFSOyAvKiB1c2UgdGhpcyB0byByZXByZXNlbnQgdW5rbm93biBjb2RlICovCisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFdJVEhfTEVBTgorc29hcF93Y2hhcgorc29hcF9nZXQwKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcC0+YnVmaWR4ID49IHNvYXAtPmJ1ZmxlbiAmJiBzb2FwX3JlY3Yoc29hcCkpCisgICAgcmV0dXJuIEVPRjsKKyAgcmV0dXJuICh1bnNpZ25lZCBjaGFyKXNvYXAtPmJ1Zltzb2FwLT5idWZpZHhdOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgV0lUSF9MRUFOCitzb2FwX3djaGFyCitzb2FwX2dldDEoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwLT5idWZpZHggPj0gc29hcC0+YnVmbGVuICYmIHNvYXBfcmVjdihzb2FwKSkKKyAgICByZXR1cm4gRU9GOworICByZXR1cm4gKHVuc2lnbmVkIGNoYXIpc29hcC0+YnVmW3NvYXAtPmJ1ZmlkeCsrXTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3NvYXBfd2NoYXIKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIGMgPSBzb2FwLT5haGVhZDsKKyAgaWYgKGMpCisgIHsgaWYgKGMgIT0gRU9GKQorICAgICAgc29hcC0+YWhlYWQgPSAwOworICB9CisgIGVsc2UKKyAgICBjID0gc29hcF9nZXQxKHNvYXApOworICBmb3IgKDs7KQorICB7IGlmIChzb2FwLT5jZGF0YSkKKyAgICB7IGlmIChjID09ICddJykKKyAgICAgIHsgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgICAgaWYgKGMgPT0gJ10nKQorICAgICAgICB7IHNvYXAtPmNkYXRhID0gMDsKKyAgICAgICAgICBzb2FwX2dldDEoc29hcCk7IC8qIHNraXAgPiAqLworICAgICAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICAgIH0KKwllbHNlCisgICAgICAgIHsgc29hcF9yZXZnZXQxKHNvYXApOworICAgICAgICAgIHJldHVybiAnXSc7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGM7CisgICAgfQorICAgIHN3aXRjaCAoYykKKyAgICB7IGNhc2UgJzwnOgorICAgICAgICBkbyBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgICB3aGlsZSAoc29hcF9ibGFuayhjKSk7CisgICAgICAgIGlmIChjID09ICchJyB8fCBjID09ICc/JyB8fCBjID09ICclJykKKyAgICAgICAgeyByZWdpc3RlciBpbnQgayA9IDE7CisJICBpZiAoYyA9PSAnIScpCisgICAgICAgICAgeyBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgICAgICAgaWYgKGMgPT0gJ1snKQorICAgICAgICAgICAgeyBkbyBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgICAgICAgICB3aGlsZSAoKGludCljICE9IEVPRiAmJiBjICE9ICdbJyk7CisgICAgICAgICAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBzb2FwLT5jZGF0YSA9IDE7CisgICAgICAgICAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisJICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYyA9PSAnLScgJiYgKGMgPSBzb2FwX2dldDEoc29hcCkpID09ICctJykKKyAgICAgICAgICAgIHsgZG8KKyAgICAgICAgICAgICAgeyBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgICAgICAgICAgIGlmIChjID09ICctJyAmJiAoYyA9IHNvYXBfZ2V0MShzb2FwKSkgPT0gJy0nKQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0gd2hpbGUgKChpbnQpYyAhPSBFT0YpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKwkgIGVsc2UgaWYgKGMgPT0gJz8nKQorICAgICAgICAgICAgYyA9IHNvYXBfZ2V0X3BpKHNvYXApOworICAgICAgICAgIHdoaWxlICgoaW50KWMgIT0gRU9GKQorICAgICAgICAgIHsgaWYgKGMgPT0gJzwnKQorCSAgICAgIGsrKzsKKwkgICAgZWxzZSBpZiAoYyA9PSAnPicpCisJICAgIHsgaWYgKC0tayA8PSAwKQorCSAgICAgICAgYnJlYWs7CisJICAgIH0KKwkgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKwkgIH0KKwkgIGlmICgoaW50KWMgPT0gRU9GKQorCSAgICBicmVhazsKKyAgICAgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChjID09ICcvJykKKyAgICAgICAgICByZXR1cm4gU09BUF9UVDsKKyAgICAgICAgc29hcF9yZXZnZXQxKHNvYXApOworICAgICAgICByZXR1cm4gU09BUF9MVDsKKyAgICAgIGNhc2UgJz4nOgorICAgICAgICByZXR1cm4gU09BUF9HVDsKKyAgICAgIGNhc2UgJyInOgorICAgICAgICByZXR1cm4gU09BUF9RVDsKKyAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgcmV0dXJuIFNPQVBfQVA7CisgICAgICBjYXNlICcmJzoKKyAgICAgICAgcmV0dXJuIHNvYXBfY2hhcihzb2FwKSB8IDB4ODAwMDAwMDA7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIHJldHVybiBjOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHNvYXBfd2NoYXIKK3NvYXBfZ2V0X3BpKHN0cnVjdCBzb2FwICpzb2FwKQoreyBjaGFyIGJ1Zls2NF07CisgIHJlZ2lzdGVyIGNoYXIgKnMgPSBidWY7CisgIHJlZ2lzdGVyIGludCBpID0gc2l6ZW9mKGJ1Zik7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgLyogVGhpcyBpcyBhIHF1aWNrIHdheSB0byBwYXJzZSBYTUwgUEkgYW5kIHdlIGNvdWxkIHVzZSBhIGNhbGxiYWNrIGluc3RlYWQgdG8KKyAgICogZW5hYmxlIGFwcGxpY2F0aW9ucyB0byBpbnRlcmNlcHQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgKi8KKyAgd2hpbGUgKChpbnQpYyAhPSBFT0YgJiYgYyAhPSAnPycpCisgIHsgaWYgKC0taSA+IDApCisgICAgeyBpZiAoc29hcF9ibGFuayhjKSkKKyAgICAgICAgYyA9ICcgJzsKKyAgICAgICpzKysgPSAoY2hhciljOworICAgIH0KKyAgICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICB9CisgICpzID0gJ1wwJzsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJYTUwgUEkgPD8lcz8+XG4iLCBidWYpKTsKKyAgaWYgKCFzdHJuY21wKGJ1ZiwgInhtbCAiLCA0KSkKKyAgeyBzID0gc3Ryc3RyKGJ1ZiwgIiBlbmNvZGluZz0iKTsKKyAgICBpZiAocyAmJiBzWzEwXSkKKyAgICB7IGlmICghc29hcF90YWdfY21wKHMgKyAxMSwgImlzby04ODU5LTEqIikKKyAgICAgICB8fCAhc29hcF90YWdfY21wKHMgKyAxMSwgImxhdGluMSoiKSkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTd2l0Y2hpbmcgdG8gbGF0aW4xIGVuY29kaW5nXG4iKSk7CisgICAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfTEFUSU47CisgICAgICB9CisgICAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHMgKyAxMSwgInV0Zi04KiIpKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlN3aXRjaGluZyB0byB1dGYtOCBlbmNvZGluZ1xuIikpOworICAgICAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0VOQ19MQVRJTjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKChpbnQpYyAhPSBFT0YpCisgICAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgcmV0dXJuIGM7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfbW92ZShzdHJ1Y3Qgc29hcCAqc29hcCwgbG9uZyBuKQoreyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk1vdmluZyAlbGQgYnl0ZXMgZm9yd2FyZFxuIiwgKGxvbmcpbikpOworICBmb3IgKDsgbiA+IDA7IG4tLSkKKyAgICBpZiAoKGludClzb2FwX2dldGNoYXIoc29hcCkgPT0gRU9GKQorICAgICAgcmV0dXJuIFNPQVBfRU9GOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc2l6ZV90CitTT0FQX0ZNQUMyCitzb2FwX3RlbGwoc3RydWN0IHNvYXAgKnNvYXApCit7IHJldHVybiBzb2FwLT5jb3VudCAtIHNvYXAtPmJ1ZmxlbiArIHNvYXAtPmJ1ZmlkeCAtIChzb2FwLT5haGVhZCAhPSAwKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dHV0Zjgoc3RydWN0IHNvYXAgKnNvYXAsIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgYykKK3sgY2hhciB0bXBbMTZdOworICBpZiAoYyA+IDAgJiYgYyA8IDB4ODApCisgIHsgKnRtcCA9IChjaGFyKWM7CisgICAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgdG1wLCAxKTsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgIHsgcmVnaXN0ZXIgY2hhciAqdCA9IHRtcDsKKyAgICBpZiAoYyA8IDB4MDgwMCkKKyAgICAgICp0KysgPSAoY2hhcikoMHhDMCB8ICgoYyA+PiA2KSAmIDB4MUYpKTsKKyAgICBlbHNlCisgICAgeyBpZiAoYyA8IDB4MDEwMDAwKQorICAgICAgICAqdCsrID0gKGNoYXIpKDB4RTAgfCAoKGMgPj4gMTIpICYgMHgwRikpOworICAgICAgZWxzZQorICAgICAgeyBpZiAoYyA8IDB4MjAwMDAwKQorICAgICAgICAgICp0KysgPSAoY2hhcikoMHhGMCB8ICgoYyA+PiAxOCkgJiAweDA3KSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyBpZiAoYyA8IDB4MDQwMDAwMDApCisgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjggfCAoKGMgPj4gMjQpICYgMHgwMykpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7ICp0KysgPSAoY2hhcikoMHhGQyB8ICgoYyA+PiAzMCkgJiAweDAxKSk7CisgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMjQpICYgMHgzRikpOworICAgICAgICAgIH0KKyAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTgpICYgMHgzRikpOworICAgICAgICB9ICAgICAKKyAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDEyKSAmIDB4M0YpKTsKKyAgICAgIH0KKyAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpKTsKKyAgICB9CisgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKGMgJiAweDNGKSk7CisgICAgKnQgPSAnXDAnOworICB9CisgIGVsc2UKKyNlbmRpZgorICAgIHNwcmludGYodG1wLCAiJiMlbHU7IiwgYyk7CisgIHJldHVybiBzb2FwX3NlbmQoc29hcCwgdG1wKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3NvYXBfd2NoYXIKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0dXRmOChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjLCBjMSwgYzIsIGMzLCBjNDsKKyAgYyA9IHNvYXAtPmFoZWFkOworICBpZiAoYyA+IDB4RkYpCisgIHsgc29hcC0+YWhlYWQgPSAwOworICAgIHJldHVybiBjOworICB9CithZ2FpbjoKKyAgYyA9IHNvYXBfZ2V0KHNvYXApOworICBpZiAoYyA8IDB4ODAgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19MQVRJTikpCisgICAgcmV0dXJuIGM7CisgIGMxID0gc29hcF9nZXQxKHNvYXApOworICBpZiAoYzEgPCAweDgwKQorICB7IHNvYXBfcmV2Z2V0MShzb2FwKTsgLyogZG9lc24ndCBsb29rIGxpa2UgdGhpcyBpcyBVVEY4ICovCisgICAgcmV0dXJuIGM7CisgIH0KKyAgYzEgJj0gMHgzRjsKKyAgaWYgKGMgPCAweEUwKQorICAgIHJldHVybiAoKHNvYXBfd2NoYXIpKGMgJiAweDFGKSA8PCA2KSB8IGMxOworICBjMiA9IChzb2FwX3djaGFyKXNvYXBfZ2V0MShzb2FwKSAmIDB4M0Y7CisgIGlmIChjID09IDB4RUYgJiYgYzEgPT0gMHgzQiAmJiBjMiA9PSAweDNGKQkvKiBpZ25vcmUgVVRGLTggQk9NICovCisgICAgZ290byBhZ2FpbjsKKyAgaWYgKGMgPCAweEYwKQorICAgIHJldHVybiAoKHNvYXBfd2NoYXIpKGMgJiAweDBGKSA8PCAxMikgfCAoYzEgPDwgNikgfCBjMjsKKyAgYzMgPSAoc29hcF93Y2hhcilzb2FwX2dldDEoc29hcCkgJiAweDNGOworICBpZiAoYyA8IDB4RjgpCisgICAgcmV0dXJuICgoc29hcF93Y2hhcikoYyAmIDB4MDcpIDw8IDE4KSB8IChjMSA8PCAxMikgfCAoYzIgPDwgNikgfCBjMzsKKyAgYzQgPSAoc29hcF93Y2hhcilzb2FwX2dldDEoc29hcCkgJiAweDNGOworICBpZiAoYyA8IDB4RkMpCisgICAgcmV0dXJuICgoc29hcF93Y2hhcikoYyAmIDB4MDMpIDw8IDI0KSB8IChjMSA8PCAxOCkgfCAoYzIgPDwgMTIpIHwgKGMzIDw8IDYpIHwgYzQ7CisgIHJldHVybiAoKHNvYXBfd2NoYXIpKGMgJiAweDAxKSA8PCAzMCkgfCAoYzEgPDwgMjQpIHwgKGMyIDw8IDE4KSB8IChjMyA8PCAxMikgfCAoYzQgPDwgNikgfCAoc29hcF93Y2hhcikoc29hcF9nZXQxKHNvYXApICYgMHgzRik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0aGV4KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzLCBpbnQgbikKK3sgY2hhciBkWzJdOworICByZWdpc3RlciBpbnQgaTsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBpZiAoIShzb2FwLT5kb20tPmRhdGEgPSBzb2FwX3MyaGV4KHNvYXAsIHMsIE5VTEwsIG4pKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2VuZGlmCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgIHsgcmVnaXN0ZXIgaW50IG0gPSAqcysrOworICAgIGRbMF0gPSAoY2hhcikoKG0gPj4gNCkgKyAobSA+IDE1OSA/ICc3JyA6ICcwJykpOworICAgIG0gJj0gMHgwRjsKKyAgICBkWzFdID0gKGNoYXIpKG0gKyAobSA+IDkgPyAnNycgOiAnMCcpKTsKKyAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBkLCAyKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3Vuc2lnbmVkIGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2dldGhleChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50ICpuKQoreworI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IHNvYXAtPmRvbS0+ZGF0YSA9IHNvYXBfc3RyaW5nX2luKHNvYXAsIDAsIC0xLCAtMSk7CisgICAgcmV0dXJuICh1bnNpZ25lZCBjaGFyKilzb2FwX2hleDJzKHNvYXAsIHNvYXAtPmRvbS0+ZGF0YSwgTlVMTCwgMCwgbik7CisgIH0KKyNlbmRpZgorI2lmZGVmIFdJVEhfRkFTVAorICBzb2FwLT5sYWJpZHggPSAwOworICBmb3IgKDs7KQorICB7IHJlZ2lzdGVyIGNoYXIgKnM7CisgICAgcmVnaXN0ZXIgaW50IGksIGs7CisgICAgaWYgKHNvYXBfYXBwZW5kX2xhYihzb2FwLCBOVUxMLCAwKSkKKyAgICAgIHJldHVybiBOVUxMOworICAgIHMgPSBzb2FwLT5sYWJidWYgKyBzb2FwLT5sYWJpZHg7CisgICAgayA9IHNvYXAtPmxhYmxlbiAtIHNvYXAtPmxhYmlkeDsKKyAgICBzb2FwLT5sYWJpZHggPSBzb2FwLT5sYWJsZW47CisgICAgZm9yIChpID0gMDsgaSA8IGs7IGkrKykKKyAgICB7IHJlZ2lzdGVyIGNoYXIgZDEsIGQyOworICAgICAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICAgICAgYyA9IHNvYXBfZ2V0KHNvYXApOworICAgICAgaWYgKHNvYXBfaXN4ZGlnaXQoYykpCisgICAgICB7IGQxID0gKGNoYXIpYzsKKyAgICAgICAgYyA9IHNvYXBfZ2V0KHNvYXApOyAKKwlpZiAoc29hcF9pc3hkaWdpdChjKSkKKyAgICAgICAgICBkMiA9IChjaGFyKWM7CisgICAgICAgIGVsc2UgCisgICAgICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgdW5zaWduZWQgY2hhciAqcDsKKyAgICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgaWYgKG4pCisgICAgICAgICAgKm4gPSAoaW50KShzb2FwLT5sYWJsZW4gLSBrICsgaSk7CisgICAgICAgIHAgPSAodW5zaWduZWQgY2hhciopc29hcF9tYWxsb2Moc29hcCwgc29hcC0+bGFibGVuIC0gayArIGkpOworCWlmIChwKQorCSAgbWVtY3B5KHAsIHNvYXAtPmxhYmJ1Ziwgc29hcC0+bGFibGVuIC0gayArIGkpOworICAgICAgICByZXR1cm4gcDsKKyAgICAgIH0KKyAgICAgICpzKysgPSAoKGQxID49ICdBJyA/IChkMSAmIDB4NykgKyA5IDogZDEgLSAnMCcpIDw8IDQpICsgKGQyID49ICdBJyA/IChkMiAmIDB4NykgKyA5IDogZDIgLSAnMCcpOworICAgIH0KKyAgfQorI2Vsc2UKKyAgaWYgKHNvYXBfbmV3X2Jsb2NrKHNvYXApKQorICAgIHJldHVybiBOVUxMOworICBmb3IgKDs7KQorICB7IHJlZ2lzdGVyIGludCBpOworICAgIHJlZ2lzdGVyIGNoYXIgKnMgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIFNPQVBfQkxLTEVOKTsKKyAgICBpZiAoIXMpCisgICAgeyBzb2FwX2VuZF9ibG9jayhzb2FwKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgU09BUF9CTEtMRU47IGkrKykKKyAgICB7IHJlZ2lzdGVyIGNoYXIgZDEsIGQyOworICAgICAgcmVnaXN0ZXIgc29hcF93Y2hhciBjID0gc29hcF9nZXQoc29hcCk7CisgICAgICBpZiAoc29hcF9pc3hkaWdpdChjKSkKKyAgICAgIHsgZDEgPSAoY2hhciljOworICAgICAgICBjID0gc29hcF9nZXQoc29hcCk7IAorCWlmIChzb2FwX2lzeGRpZ2l0KGMpKQorICAgICAgICAgIGQyID0gKGNoYXIpYzsKKyAgICAgICAgZWxzZSAKKyAgICAgICAgeyBzb2FwX2VuZF9ibG9jayhzb2FwKTsKKwkgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IHVuc2lnbmVkIGNoYXIgKnA7CisgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgIGlmIChuKQorICAgICAgICAgICpuID0gc29hcF9zaXplX2Jsb2NrKHNvYXAsIGkpOworICAgICAgICBwID0gKHVuc2lnbmVkIGNoYXIqKXNvYXBfc2F2ZV9ibG9jayhzb2FwLCBOVUxMLCAwKTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgICB9CisgICAgICAqcysrID0gKChkMSA+PSAnQScgPyAoZDEgJiAweDcpICsgOSA6IGQxIC0gJzAnKSA8PCA0KSArIChkMiA+PSAnQScgPyAoZDIgJiAweDcpICsgOSA6IGQyIC0gJzAnKTsKKyAgICB9CisgIH0KKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dGJhc2U2NChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgdW5zaWduZWQgY2hhciAqcywgaW50IG4pCit7IHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciB1bnNpZ25lZCBsb25nIG07CisgIGNoYXIgZFs0XTsKKyAgaWYgKCFzKQorICAgIHJldHVybiBTT0FQX09LOworI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IGlmICghKHNvYXAtPmRvbS0+ZGF0YSA9IHNvYXBfczJiYXNlNjQoc29hcCwgcywgTlVMTCwgbikpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIHJldHVybiBTT0FQX09LOworICB9CisjZW5kaWYKKyAgZm9yICg7IG4gPiAyOyBuIC09IDMsIHMgKz0gMykKKyAgeyBtID0gc1swXTsKKyAgICBtID0gKG0gPDwgOCkgfCBzWzFdOworICAgIG0gPSAobSA8PCA4KSB8IHNbMl07CisgICAgZm9yIChpID0gNDsgaSA+IDA7IG0gPj49IDYpCisgICAgICBkWy0taV0gPSBzb2FwX2Jhc2U2NG9bbSAmIDB4M0ZdOworICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIGQsIDQpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmIChuID4gMCkKKyAgeyBtID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgbSA9IChtIDw8IDgpIHwgKnMrKzsKKyAgICBmb3IgKDsgaSA8IDM7IGkrKykKKyAgICAgIG0gPDw9IDg7CisgICAgZm9yIChpKys7IGkgPiAwOyBtID4+PSA2KQorICAgICAgZFstLWldID0gc29hcF9iYXNlNjRvW20gJiAweDNGXTsKKyAgICBmb3IgKGkgPSAzOyBpID4gbjsgaS0tKQorICAgICAgZFtpXSA9ICc9JzsKKyAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBkLCA0KSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3Vuc2lnbmVkIGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2dldGJhc2U2NChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50ICpuLCBpbnQgbWFsbG9jX2ZsYWcpCit7IAorI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IHNvYXAtPmRvbS0+ZGF0YSA9IHNvYXBfc3RyaW5nX2luKHNvYXAsIDAsIC0xLCAtMSk7CisgICAgcmV0dXJuICh1bnNpZ25lZCBjaGFyKilzb2FwX2Jhc2U2NDJzKHNvYXAsIHNvYXAtPmRvbS0+ZGF0YSwgTlVMTCwgMCwgbik7CisgIH0KKyNlbmRpZgorI2lmZGVmIFdJVEhfRkFTVAorICBzb2FwLT5sYWJpZHggPSAwOworICBmb3IgKDs7KQorICB7IHJlZ2lzdGVyIGludCBpLCBrOworICAgIHJlZ2lzdGVyIGNoYXIgKnM7CisgICAgaWYgKHNvYXBfYXBwZW5kX2xhYihzb2FwLCBOVUxMLCAyKSkKKyAgICAgIHJldHVybiBOVUxMOworICAgIHMgPSBzb2FwLT5sYWJidWYgKyBzb2FwLT5sYWJpZHg7CisgICAgayA9IHNvYXAtPmxhYmxlbiAtIHNvYXAtPmxhYmlkeDsKKyAgICBzb2FwLT5sYWJpZHggPSAzICogKHNvYXAtPmxhYmxlbiAvIDMpOworICAgIGlmICghcykKKyAgICAgIHJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCBrIC0gMjsgaSArPSAzKQorICAgIHsgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBtID0gMDsKKyAgICAgIHJlZ2lzdGVyIGludCBqID0gMDsKKyAgICAgIGRvCisgICAgICB7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IHNvYXBfZ2V0KHNvYXApOworICAgICAgICBpZiAoYyA9PSAnPScgfHwgYyA8IDApCisgICAgICAgIHsgdW5zaWduZWQgY2hhciAqcDsKKyAgICAgICAgICBzd2l0Y2ggKGopCisgICAgICAgICAgeyBjYXNlIDI6CisgICAgICAgICAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gNCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiAxMCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiAyKSAmIDB4RkYpOworICAgICAgICAgICAgICBpICs9IDI7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChuKQorICAgICAgICAgICAgKm4gPSAoaW50KShzb2FwLT5sYWJsZW4gLSBrICsgaSk7CisgICAgICAgICAgcCA9ICh1bnNpZ25lZCBjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzb2FwLT5sYWJsZW4gLSBrICsgaSk7CisJICBpZiAocCkKKwkgICAgbWVtY3B5KHAsIHNvYXAtPmxhYmJ1Ziwgc29hcC0+bGFibGVuIC0gayArIGkpOworICAgICAgICAgIGlmIChjID49IDApCisgICAgICAgICAgeyB3aGlsZSAoKGludCkoKGMgPSBzb2FwX2dldChzb2FwKSkgIT0gRU9GKSAmJiBjICE9IFNPQVBfTFQgJiYgYyAhPSBTT0FQX1RUKQorICAgICAgICAgICAgICA7CisJICB9CisgICAgICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgfQorICAgICAgICBjIC09ICcrJzsKKyAgICAgICAgaWYgKGMgPj0gMCAmJiBjIDw9IDc5KQorICAgICAgICB7IG0gPSAobSA8PCA2KSArIHNvYXBfYmFzZTY0aVtjXTsKKyAgICAgICAgICBqKys7CisgICAgICAgIH0KKyAgICAgIH0gd2hpbGUgKGogPCA0KTsKKyAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gMTYpICYgMHhGRik7CisgICAgICAqcysrID0gKGNoYXIpKChtID4+IDgpICYgMHhGRik7CisgICAgICAqcysrID0gKGNoYXIpKG0gJiAweEZGKTsKKyAgICB9CisgIH0KKyNlbHNlCisgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgZm9yICg7OykKKyAgeyByZWdpc3RlciBpbnQgaTsKKyAgICByZWdpc3RlciBjaGFyICpzID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCAzICogU09BUF9CTEtMRU4pOyAvKiBtdXN0IGJlIG11bHRpcGxlIG9mIDMgKi8KKyAgICBpZiAoIXMpCisgICAgeyBzb2FwX2VuZF9ibG9jayhzb2FwKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgU09BUF9CTEtMRU47IGkrKykKKyAgICB7IHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbSA9IDA7CisgICAgICByZWdpc3RlciBpbnQgaiA9IDA7CisgICAgICBkbworICAgICAgeyByZWdpc3RlciBzb2FwX3djaGFyIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgICAgICAgaWYgKGMgPT0gJz0nIHx8IGMgPCAwKQorICAgICAgICB7IHVuc2lnbmVkIGNoYXIgKnA7CisgICAgICAgICAgaSAqPSAzOworICAgICAgICAgIHN3aXRjaCAoaikKKyAgICAgICAgICB7IGNhc2UgMjoKKyAgICAgICAgICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiA0KSAmIDB4RkYpOworICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAqcysrID0gKGNoYXIpKChtID4+IDEwKSAmIDB4RkYpOworICAgICAgICAgICAgICAqcysrID0gKGNoYXIpKChtID4+IDIpICYgMHhGRik7CisgICAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG4pCisJICAgICpuID0gKGludClzb2FwX3NpemVfYmxvY2soc29hcCwgaSk7CisgICAgICAgICAgcCA9ICh1bnNpZ25lZCBjaGFyKilzb2FwX3NhdmVfYmxvY2soc29hcCwgTlVMTCwgMCk7CisgICAgICAgICAgaWYgKGMgPj0gMCkKKyAgICAgICAgICB7IHdoaWxlICgoaW50KSgoYyA9IHNvYXBfZ2V0KHNvYXApKSAhPSBFT0YpICYmIGMgIT0gU09BUF9MVCAmJiBjICE9IFNPQVBfVFQpCisgICAgICAgICAgICAgIDsKKwkgIH0KKyAgICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICAgIHJldHVybiBwOworICAgICAgICB9CisgICAgICAgIGMgLT0gJysnOworICAgICAgICBpZiAoYyA+PSAwICYmIGMgPD0gNzkpCisgICAgICAgIHsgbSA9IChtIDw8IDYpICsgc29hcF9iYXNlNjRpW2NdOworICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAoaiA8IDQpOworICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiAxNikgJiAweEZGKTsKKyAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gOCkgJiAweEZGKTsKKyAgICAgICpzKysgPSAoY2hhcikobSAmIDB4RkYpOworICAgIH0KKyAgfQorI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfeG9wX2ZvcndhcmQoc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIGNoYXIgKipwdHIsIGludCAqc2l6ZSwgY2hhciAqKmlkLCBjaGFyICoqdHlwZSwgY2hhciAqKm9wdGlvbnMpCit7IC8qIENoZWNrIE1UT00geG9wOkluY2x1ZGUgZWxlbWVudCAod2l0aGluIGhleC9iYXNlNjRCaW5hcnkpICovCisgIC8qIFRPRE86IHRoaXMgY29kZSB0byBiZSBvYnNvbGV0ZWQgd2l0aCBuZXcgaW1wb3J0L3hvcC5oIGNvbnZlbnRpb25zICovCisgIGludCBib2R5ID0gc29hcC0+Ym9keTsgLyogc2hvdWxkIHNhdmUgdHlwZSB0b28/ICovCisgIGlmICghc29hcF9wZWVrX2VsZW1lbnQoc29hcCkpCisgIHsgaWYgKCFzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgInhvcDpJbmNsdWRlIiwgMCkgJiYgKnNvYXAtPmhyZWYpCisgICAgeyBpZiAoc29hcF9kaW1lX2ZvcndhcmQoc29hcCwgcHRyLCBzaXplLCBpZCwgdHlwZSwgb3B0aW9ucykpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCBOVUxMKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBzb2FwLT5ib2R5ID0gYm9keTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9kaW1lX2ZvcndhcmQoc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIGNoYXIgKipwdHIsIGludCAqc2l6ZSwgY2hhciAqKmlkLCBjaGFyICoqdHlwZSwgY2hhciAqKm9wdGlvbnMpCit7IHN0cnVjdCBzb2FwX3hsaXN0ICp4cCA9IChzdHJ1Y3Qgc29hcF94bGlzdCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX3hsaXN0KSk7CisgICpwdHIgPSBOVUxMOworICAqc2l6ZSA9IDA7CisgICppZCA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPmhyZWYpOworICAqdHlwZSA9IE5VTEw7CisgICpvcHRpb25zID0gTlVMTDsKKyAgaWYgKCF4cCkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgeHAtPm5leHQgPSBzb2FwLT54bGlzdDsKKyAgeHAtPnB0ciA9IHB0cjsKKyAgeHAtPnNpemUgPSBzaXplOworICB4cC0+aWQgPSAqaWQ7CisgIHhwLT50eXBlID0gdHlwZTsKKyAgeHAtPm9wdGlvbnMgPSBvcHRpb25zOworICBzb2FwLT54bGlzdCA9IHhwOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3N0cmR1cChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcykKK3sgY2hhciAqdCA9IE5VTEw7CisgIGlmIChzICYmICh0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihzKSArIDEpKSkKKyAgICBzdHJjcHkodCwgcyk7CisgIHJldHVybiB0OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX25ld19ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfYmxpc3QgKnA7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTmV3IGJsb2NrIHNlcXVlbmNlIChwcmV2PSVwKVxuIiwgc29hcC0+Ymxpc3QpKTsKKyAgaWYgKCEocCA9IChzdHJ1Y3Qgc29hcF9ibGlzdCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2JsaXN0KSkpKQorICAgIHJldHVybiBTT0FQX0VPTTsgICAKKyAgcC0+bmV4dCA9IHNvYXAtPmJsaXN0OyAKKyAgcC0+cHRyID0gTlVMTDsKKyAgcC0+c2l6ZSA9IDA7CisgIHNvYXAtPmJsaXN0ID0gcDsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkKgorU09BUF9GTUFDMgorc29hcF9wdXNoX2Jsb2NrKHN0cnVjdCBzb2FwICpzb2FwLCBzaXplX3QgbikKK3sgY2hhciAqcDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQdXNoIGJsb2NrIG9mICV1IGJ5dGVzICgldSBieXRlcyB0b3RhbClcbiIsICh1bnNpZ25lZCBpbnQpbiwgKHVuc2lnbmVkIGludClzb2FwLT5ibGlzdC0+c2l6ZSArICh1bnNpZ25lZCBpbnQpbikpOworICBpZiAoIShwID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIG4gKyBzaXplb2YoY2hhciopICsgc2l6ZW9mKHNpemVfdCkpKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHJldHVybiBOVUxMOworICB9CisgICooY2hhcioqKXAgPSBzb2FwLT5ibGlzdC0+cHRyOworICAqKHNpemVfdCopKHAgKyBzaXplb2YoY2hhciopKSA9IG47CisgIHNvYXAtPmJsaXN0LT5wdHIgPSBwOworICBzb2FwLT5ibGlzdC0+c2l6ZSArPSBuOworICByZXR1cm4gcCArIHNpemVvZihjaGFyKikgKyBzaXplb2Yoc2l6ZV90KTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfcG9wX2Jsb2NrKHN0cnVjdCBzb2FwICpzb2FwKQoreyBjaGFyICpwOworICBpZiAoIXNvYXAtPmJsaXN0LT5wdHIpCisgICAgcmV0dXJuOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlBvcCBibG9ja1xuIikpOworICBwID0gc29hcC0+Ymxpc3QtPnB0cjsKKyAgc29hcC0+Ymxpc3QtPnNpemUgLT0gKihzaXplX3QqKShwICsgc2l6ZW9mKGNoYXIqKSk7CisgIHNvYXAtPmJsaXN0LT5wdHIgPSAqKGNoYXIqKilwOworICBTT0FQX0ZSRUUoc29hcCwgcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQKK3NvYXBfdXBkYXRlX3B0cnMoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnN0YXJ0LCBjaGFyICplbmQsIGNoYXIgKnAxLCBjaGFyICpwMikKK3sgaW50IGk7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZmxpc3QgKmZwOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICByZWdpc3RlciBzdHJ1Y3Qgc29hcF94bGlzdCAqeHA7CisjZW5kaWYKKyAgcmVnaXN0ZXIgdm9pZCAqcCwgKipxOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9JREhBU0g7IGkrKykKKyAgeyBmb3IgKGlwID0gc29hcC0+aWh0W2ldOyBpcDsgaXAgPSBpcC0+bmV4dCkKKyAgICB7IGlmIChpcC0+cHRyICYmIChjaGFyKilpcC0+cHRyID49IHN0YXJ0ICYmIChjaGFyKilpcC0+cHRyIDwgZW5kKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVwZGF0ZSBpZD0nJXMnICVwIC0+ICVwXG4iLCBpcC0+aWQsIGlwLT5wdHIsIChjaGFyKilpcC0+cHRyICsgKHAxLXAyKSkpOworICAgICAgICBpcC0+cHRyID0gKGNoYXIqKWlwLT5wdHIgKyAocDEtcDIpOworICAgICAgfQorICAgICAgZm9yIChxID0gJmlwLT5saW5rOyBxOyBxID0gKHZvaWQqKilwKQorICAgICAgeyBwID0gKnE7CisgICAgICAgIGlmIChwICYmIChjaGFyKilwID49IHN0YXJ0ICYmIChjaGFyKilwIDwgZW5kKQorICAgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTGluayB1cGRhdGUgaWQ9JyVzJyAlcFxuIiwgaXAtPmlkLCBwKSk7CisgICAgICAgICAgKnEgPSAoY2hhciopcCArIChwMS1wMik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZvciAocSA9ICZpcC0+Y29weTsgcTsgcSA9ICh2b2lkKiopcCkKKyAgICAgIHsgcCA9ICpxOworICAgICAgICBpZiAocCAmJiAoY2hhciopcCA+PSBzdGFydCAmJiAoY2hhciopcCA8IGVuZCkKKyAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHkgY2hhaW4gdXBkYXRlIGlkPSclcycgJXBcbiIsIGlwLT5pZCwgcCkpOworICAgICAgICAgICpxID0gKGNoYXIqKXAgKyAocDEtcDIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBmb3IgKGZwID0gaXAtPmZsaXN0OyBmcDsgZnAgPSBmcC0+bmV4dCkKKyAgICAgIHsgaWYgKChjaGFyKilmcC0+cHRyID49IHN0YXJ0ICYmIChjaGFyKilmcC0+cHRyIDwgZW5kKQorICAgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weSBsaXN0IHVwZGF0ZSBpZD0nJXMnICVwXG4iLCBpcC0+aWQsIGZwKSk7CisgICAgICAgICAgZnAtPnB0ciA9IChjaGFyKilmcC0+cHRyICsgKHAxLXAyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBmb3IgKHhwID0gc29hcC0+eGxpc3Q7IHhwOyB4cCA9IHhwLT5uZXh0KQorICB7IGlmICh4cC0+cHRyICYmIChjaGFyKil4cC0+cHRyID49IHN0YXJ0ICYmIChjaGFyKil4cC0+cHRyIDwgZW5kKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVcGRhdGUgaWQ9JyVzJyAlcCAtPiAlcFxuIiwgeHAtPmlkP3hwLT5pZDoiIiwgeHAtPnB0ciwgKGNoYXIqKXhwLT5wdHIgKyAocDEtcDIpKSk7CisgICAgICB4cC0+cHRyID0gKHVuc2lnbmVkIGNoYXIqKikoKGNoYXIqKXhwLT5wdHIgKyAocDEtcDIpKTsKKyAgICAgIHhwLT5zaXplID0gKGludCopKChjaGFyKil4cC0+c2l6ZSArIChwMS1wMikpOworICAgICAgeHAtPnR5cGUgPSAoY2hhcioqKSgoY2hhciopeHAtPnR5cGUgKyAocDEtcDIpKTsKKyAgICAgIHhwLT5vcHRpb25zID0gKGNoYXIqKikoKGNoYXIqKXhwLT5vcHRpb25zICsgKHAxLXAyKSk7CisgICAgfQorICB9CisjZW5kaWYKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NvYXBfaGFzX2NvcGllcyhzdHJ1Y3Qgc29hcCAqc29hcCwgcmVnaXN0ZXIgY29uc3QgY2hhciAqc3RhcnQsIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKmVuZCkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZmxpc3QgKmZwOworICByZWdpc3RlciBjb25zdCBjaGFyICpwOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9JREhBU0g7IGkrKykKKyAgeyBmb3IgKGlwID0gc29hcC0+aWh0W2ldOyBpcDsgaXAgPSBpcC0+bmV4dCkKKyAgICB7IGZvciAocCA9IChjb25zdCBjaGFyKilpcC0+Y29weTsgcDsgcCA9ICooY29uc3QgY2hhcioqKXApCisgICAgICAgIGlmIChwID49IHN0YXJ0ICYmIHAgPCBlbmQpCisgICAgICAgICAgcmV0dXJuIFNPQVBfRVJSOworICAgICAgZm9yIChmcCA9IGlwLT5mbGlzdDsgZnA7IGZwID0gZnAtPm5leHQpCisgICAgICAgIGlmICgoY29uc3QgY2hhciopZnAtPnB0ciA+PSBzdGFydCAmJiAoY29uc3QgY2hhciopZnAtPnB0ciA8IGVuZCkKKwkgIHJldHVybiBTT0FQX0VSUjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVzb2x2ZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZmxpc3QgKmZwOworICBzaG9ydCBmbGFnOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc29sdmluZyBmb3J3YXJkZWQgZGF0YVxuIikpOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9JREhBU0g7IGkrKykKKyAgeyBmb3IgKGlwID0gc29hcC0+aWh0W2ldOyBpcDsgaXAgPSBpcC0+bmV4dCkKKyAgICB7IGlmIChpcC0+cHRyKQorICAgICAgeyByZWdpc3RlciB2b2lkICpwLCAqKnEsICpyOworICAgICAgICBxID0gKHZvaWQqKilpcC0+bGluazsKKyAgICAgICAgaXAtPmxpbmsgPSBOVUxMOworICAgICAgICByID0gaXAtPnB0cjsKKyAgICAgICAgREJHTE9HKFRFU1QsIGlmIChxKSBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVHJhdmVyc2luZyBsaW5rIGNoYWluIHRvIHJlc29sdmUgaWQ9JyVzJ1xuIiwgaXAtPmlkKSk7CisgICAgICAgIHdoaWxlIChxKQorICAgICAgICB7IHAgPSAqcTsKKyAgICAgICAgICAqcSA9IHI7CisgICAgICAgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIi4uLiBsaW5rICVwIC0+ICVwXG4iLCBxLCByKSk7CisgICAgICAgICAgcSA9ICh2b2lkKiopcDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSBpZiAoKmlwLT5pZCA9PSAnIycpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTWlzc2luZyBkYXRhIGZvciBpZD0nJXMnXG4iLCBpcC0+aWQpKTsKKyAgICAgICAgc3RyY3B5KHNvYXAtPmlkLCBpcC0+aWQgKyAxKTsKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9NSVNTSU5HX0lEOworICAgICAgfQorICAgIH0KKyAgfQorICBkbworICB7IGZsYWcgPSAwOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x1dGlvbiBwaGFzZVxuIikpOworICAgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0lESEFTSDsgaSsrKQorICAgIHsgZm9yIChpcCA9IHNvYXAtPmlodFtpXTsgaXA7IGlwID0gaXAtPm5leHQpCisgICAgICB7IGlmIChpcC0+cHRyICYmICFzb2FwX2hhc19jb3BpZXMoc29hcCwgKGNvbnN0IGNoYXIqKWlwLT5wdHIsIChjb25zdCBjaGFyKilpcC0+cHRyICsgaXAtPnNpemUpKQorICAgICAgICB7IGlmIChpcC0+Y29weSkKKyAgICAgICAgICB7IHJlZ2lzdGVyIHZvaWQgKnAsICoqcSA9ICh2b2lkKiopaXAtPmNvcHk7CisgICAgICAgICAgICBEQkdMT0coVEVTVCwgaWYgKHEpIFNPQVBfTUVTU0FHRShmZGVidWcsICJUcmF2ZXJzaW5nIGNvcHkgY2hhaW4gdG8gcmVzb2x2ZSBpZD0nJXMnXG4iLCBpcC0+aWQpKTsKKyAgICAgICAgICAgIGlwLT5jb3B5ID0gTlVMTDsKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiLi4uIGNvcHkgJXAgLT4gJXAgKCV1IGJ5dGVzKVxuIiwgaXAtPnB0ciwgcSwgKHVuc2lnbmVkIGludClpcC0+c2l6ZSkpOworCSAgICAgIHAgPSAqcTsKKyAgICAgICAgICAgICAgbWVtY3B5KHEsIGlwLT5wdHIsIGlwLT5zaXplKTsKKyAgICAgICAgICAgICAgcSA9ICh2b2lkKiopcDsKKyAgICAgICAgICAgIH0gd2hpbGUgKHEpOworCSAgICBmbGFnID0gMTsKKwkgIH0KKyAgICAgICAgICBmb3IgKGZwID0gaXAtPmZsaXN0OyBmcDsgZnAgPSBpcC0+Zmxpc3QpCisgICAgICAgICAgeyByZWdpc3RlciB1bnNpZ25lZCBpbnQgayA9IGZwLT5sZXZlbDsKKwkgICAgcmVnaXN0ZXIgdm9pZCAqcCA9IGlwLT5wdHI7CisgICAgICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc29sdmluZyBmb3J3YXJkZWQgZGF0YSB0eXBlPSVkIGxvY2F0aW9uPSVwIGxldmVsPSV1LCV1IGlkPSclcydcbiIsIGlwLT50eXBlLCBwLCBpcC0+bGV2ZWwsIGZwLT5sZXZlbCwgaXAtPmlkKSk7CisJICAgIHdoaWxlIChpcC0+bGV2ZWwgPCBrKQorICAgICAgICAgICAgeyByZWdpc3RlciB2b2lkICoqcSA9ICh2b2lkKiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHZvaWQqKSk7ICAKKwkgICAgICBpZiAoIXEpCisJICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisJICAgICAgKnEgPSBwOworICAgICAgICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlc2NlbmRpbmcgb25lIGxldmVsLCBuZXcgbG9jYXRpb249JXAgaG9sZHM9JXAuLi5cbiIsIHEsICpxKSk7CisgICAgICAgICAgICAgIHAgPSAodm9pZCopcTsKKyAgICAgICAgICAgICAgay0tOworICAgICAgICAgICAgfQorCSAgICBpZiAoZnAtPmZjb3B5KQorCSAgICAgIGZwLT5mY29weShzb2FwLCBpcC0+dHlwZSwgZnAtPnR5cGUsIGZwLT5wdHIsIGZwLT5sZW4sIHAsIGlwLT5zaXplKTsKKwkgICAgZWxzZQorCSAgICAgIHNvYXBfZmNvcHkoc29hcCwgaXAtPnR5cGUsIGZwLT50eXBlLCBmcC0+cHRyLCBmcC0+bGVuLCBwLCBpcC0+c2l6ZSk7CisJICAgIGlwLT5mbGlzdCA9IGZwLT5uZXh0OworCSAgICBTT0FQX0ZSRUUoc29hcCwgZnApOworCSAgICBmbGFnID0gMTsKKwkgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSB3aGlsZSAoZmxhZyk7CisjaWZkZWYgU09BUF9ERUJVRworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9JREhBU0g7IGkrKykKKyAgeyBmb3IgKGlwID0gc29hcC0+aWh0W2ldOyBpcDsgaXAgPSBpcC0+bmV4dCkKKyAgICB7IGlmIChpcC0+Y29weSB8fCBpcC0+Zmxpc3QpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x1dGlvbiBlcnJvcjogZm9yd2FyZGVkIGRhdGEgZm9yIGlkPSclcycgY291bGQgbm90IGJlIHByb3BhZ2F0ZWQsIHBsZWFzZSByZXBvcnQgdGhpcyBwcm9ibGVtIHRvIHRoZSBkZXZlbG9wZXJzXG4iLCBpcC0+aWQpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyNlbmRpZgorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc29sdXRpb24gZG9uZVxuIikpOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc2l6ZV90CitTT0FQX0ZNQUMyCitzb2FwX3NpemVfYmxvY2soc3RydWN0IHNvYXAgKnNvYXAsIHNpemVfdCBuKQoreyBpZiAoc29hcC0+Ymxpc3QtPnB0cikKKyAgeyBzb2FwLT5ibGlzdC0+c2l6ZSAtPSAqKHNpemVfdCopKHNvYXAtPmJsaXN0LT5wdHIgKyBzaXplb2YoY2hhciopKSAtIG47CisgICAgKihzaXplX3QqKShzb2FwLT5ibGlzdC0+cHRyICsgc2l6ZW9mKGNoYXIqKSkgPSBuOworICB9CisgIHJldHVybiBzb2FwLT5ibGlzdC0+c2l6ZTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2ZpcnN0X2Jsb2NrKHN0cnVjdCBzb2FwICpzb2FwKQoreyBjaGFyICpwLCAqcSwgKnI7CisgIHAgPSBzb2FwLT5ibGlzdC0+cHRyOworICBpZiAoIXApCisgICAgcmV0dXJuIE5VTEw7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRmlyc3QgYmxvY2tcbiIpKTsKKyAgciA9IE5VTEw7CisgIGRvCisgIHsgcSA9ICooY2hhcioqKXA7CisgICAgKihjaGFyKiopcCA9IHI7CisgICAgciA9IHA7CisgICAgcCA9IHE7CisgIH0gd2hpbGUgKHApOworICBzb2FwLT5ibGlzdC0+cHRyID0gcjsKKyAgcmV0dXJuIHIgKyBzaXplb2YoY2hhciopICsgc2l6ZW9mKHNpemVfdCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjaGFyKgorU09BUF9GTUFDMgorc29hcF9uZXh0X2Jsb2NrKHN0cnVjdCBzb2FwICpzb2FwKQoreyBjaGFyICpwOworICBwID0gc29hcC0+Ymxpc3QtPnB0cjsKKyAgaWYgKHApCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJOZXh0IGJsb2NrXG4iKSk7CisgICAgc29hcC0+Ymxpc3QtPnB0ciA9ICooY2hhcioqKXA7CisgICAgU09BUF9GUkVFKHNvYXAsIHApOworICAgIGlmIChzb2FwLT5ibGlzdC0+cHRyKQorICAgICAgcmV0dXJuIHNvYXAtPmJsaXN0LT5wdHIgKyBzaXplb2YoY2hhciopICsgc2l6ZW9mKHNpemVfdCk7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzaXplX3QKK1NPQVBfRk1BQzIKK3NvYXBfYmxvY2tfc2l6ZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmV0dXJuICooc2l6ZV90Kikoc29hcC0+Ymxpc3QtPnB0ciArIHNpemVvZihjaGFyKikpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9lbmRfYmxvY2soc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX2JsaXN0ICpicDsKKyAgY2hhciAqcCwgKnE7CisgIGJwID0gc29hcC0+Ymxpc3Q7CisgIGlmIChicCkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBvZiBibG9jayBzZXF1ZW5jZSwgZnJlZSBhbGwgcmVtYWluaW5nIGJsb2Nrc1xuIikpOworICAgIGZvciAocCA9IGJwLT5wdHI7IHA7IHAgPSBxKQorICAgIHsgcSA9ICooY2hhcioqKXA7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgcCk7CisgICAgfQorICAgIHNvYXAtPmJsaXN0ID0gYnAtPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIGJwKTsKKyAgfQorICBEQkdMT0coVEVTVCwgaWYgKHNvYXAtPmJsaXN0KSBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzdG9yZSBwcmV2aW91cyBibG9jayBzZXF1ZW5jZVxuIikpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfc2F2ZV9ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqcCwgaW50IGZsYWcpCit7IHJlZ2lzdGVyIHNpemVfdCBuOworICByZWdpc3RlciBjaGFyICpxLCAqczsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTYXZlIGFsbCBibG9ja3MgaW4gY29udGlndW91cyBtZW1vcnkgc3BhY2Ugb2YgJXUgYnl0ZXMgKCVwLT4lcClcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+Ymxpc3QtPnNpemUsIHNvYXAtPmJsaXN0LT5wdHIsIHApKTsKKyAgaWYgKHNvYXAtPmJsaXN0LT5zaXplKQorICB7IGlmICghcCkKKyAgICAgIHAgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc29hcC0+Ymxpc3QtPnNpemUpOworICAgIGlmIChwKQorICAgIHsgZm9yIChzID0gcCwgcSA9IHNvYXBfZmlyc3RfYmxvY2soc29hcCk7IHE7IHEgPSBzb2FwX25leHRfYmxvY2soc29hcCkpCisgICAgICB7IG4gPSBzb2FwX2Jsb2NrX3NpemUoc29hcCk7CisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICAgICAgICBpZiAoZmxhZykKKwkgIHNvYXBfdXBkYXRlX3B0cnMoc29hcCwgcSwgcSArIG4sIHMsIHEpOworI2VuZGlmCisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weSAldSBieXRlcyBmcm9tICVwIHRvICVwXG4iLCAodW5zaWduZWQgaW50KW4sIHEsIHMpKTsKKyAgICAgICAgbWVtY3B5KHMsIHEsIG4pOworICAgICAgICBzICs9IG47CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgIH0KKyAgc29hcF9lbmRfYmxvY2soc29hcCk7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3B1dHNpemUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBzaXplKQoreyByZXR1cm4gc29hcF9wdXRzaXplcyhzb2FwLCB0eXBlLCAmc2l6ZSwgMSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfcHV0c2l6ZXMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGludCAqc2l6ZSwgaW50IGRpbSkKK3sgcmV0dXJuIHNvYXBfcHV0c2l6ZXNvZmZzZXRzKHNvYXAsIHR5cGUsIHNpemUsIE5VTEwsIGRpbSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfcHV0c2l6ZXNvZmZzZXRzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBpbnQgKnNpemUsIGNvbnN0IGludCAqb2Zmc2V0LCBpbnQgZGltKQoreyBpbnQgaTsKKyAgaWYgKCF0eXBlKQorICAgIHJldHVybiBOVUxMOworICBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICB7IHNwcmludGYoc29hcC0+dHlwZSwgIiVzWyVkIiwgdHlwZSwgc2l6ZVswXSk7CisgICAgZm9yIChpID0gMTsgaSA8IGRpbTsgaSsrKQorICAgICAgc3ByaW50Zihzb2FwLT50eXBlICsgc3RybGVuKHNvYXAtPnR5cGUpLCAiICVkIiwgc2l6ZVtpXSk7CisgIH0KKyAgZWxzZQorICB7IGlmIChvZmZzZXQpCisgICAgeyBzcHJpbnRmKHNvYXAtPnR5cGUsICIlc1slZCIsIHR5cGUsIHNpemVbMF0gKyBvZmZzZXRbMF0pOworICAgICAgZm9yIChpID0gMTsgaSA8IGRpbTsgaSsrKQorICAgICAgICBzcHJpbnRmKHNvYXAtPnR5cGUgKyBzdHJsZW4oc29hcC0+dHlwZSksICIsJWQiLCBzaXplW2ldICsgb2Zmc2V0W2ldKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgc3ByaW50Zihzb2FwLT50eXBlLCAiJXNbJWQiLCB0eXBlLCBzaXplWzBdKTsKKyAgICAgIGZvciAoaSA9IDE7IGkgPCBkaW07IGkrKykKKyAgICAgICAgc3ByaW50Zihzb2FwLT50eXBlICsgc3RybGVuKHNvYXAtPnR5cGUpLCAiLCVkIiwgc2l6ZVtpXSk7CisgICAgfQorICAgIHN0cmNhdChzb2FwLT50eXBlLCAiXSIpOworICB9CisgIHJldHVybiBzb2FwLT50eXBlOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3B1dG9mZnNldChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG9mZnNldCkKK3sgcmV0dXJuIHNvYXBfcHV0b2Zmc2V0cyhzb2FwLCAmb2Zmc2V0LCAxKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9wdXRvZmZzZXRzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBpbnQgKm9mZnNldCwgaW50IGRpbSkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHNwcmludGYoc29hcC0+YXJyYXlPZmZzZXQsICJbJWQiLCBvZmZzZXRbMF0pOworICBmb3IgKGkgPSAxOyBpIDwgZGltOyBpKyspCisgICAgc3ByaW50Zihzb2FwLT5hcnJheU9mZnNldCArIHN0cmxlbihzb2FwLT5hcnJheU9mZnNldCksICIsJWQiLCBvZmZzZXRbaV0pOworICBzdHJjYXQoc29hcC0+YXJyYXlPZmZzZXQsICJdIik7CisgIHJldHVybiBzb2FwLT5hcnJheU9mZnNldDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zaXplKGNvbnN0IGludCAqc2l6ZSwgaW50IGRpbSkKK3sgcmVnaXN0ZXIgaW50IGksIG4gPSBzaXplWzBdOworICBmb3IgKGkgPSAxOyBpIDwgZGltOyBpKyspCisgICAgbiAqPSBzaXplW2ldOworICByZXR1cm4gbjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRvZmZzZXRzKGNvbnN0IGNoYXIgKmF0dHIsIGNvbnN0IGludCAqc2l6ZSwgaW50ICpvZmZzZXQsIGludCBkaW0pCit7IHJlZ2lzdGVyIGludCBpLCBqID0gMDsKKyAgaWYgKG9mZnNldCkKKyAgICBmb3IgKGkgPSAwOyBpIDwgZGltICYmIGF0dHIgJiYgKmF0dHI7IGkrKykKKyAgICB7IGF0dHIrKzsKKyAgICAgIGogKj0gc2l6ZVtpXTsKKyAgICAgIGogKz0gb2Zmc2V0W2ldID0gKGludClhdG9sKGF0dHIpOworICAgICAgYXR0ciA9IHN0cmNocihhdHRyLCAnLCcpOworICAgIH0KKyAgZWxzZQorICAgIGZvciAoaSA9IDA7IGkgPCBkaW0gJiYgYXR0ciAmJiAqYXR0cjsgaSsrKQorICAgIHsgYXR0cisrOworICAgICAgaiAqPSBzaXplW2ldOworICAgICAgaiArPSAoaW50KWF0b2woYXR0cik7CisgICAgICBhdHRyID0gc3RyY2hyKGF0dHIsICcsJyk7CisgICAgfQorICByZXR1cm4gajsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRzaXplKGNvbnN0IGNoYXIgKmF0dHIxLCBjb25zdCBjaGFyICphdHRyMiwgaW50ICpqKQoreyByZWdpc3RlciBpbnQgbiwgazsKKyAgY2hhciAqczsKKyAgKmogPSAwOworICBpZiAoISphdHRyMSkKKyAgICByZXR1cm4gLTE7CisgIGlmICgqYXR0cjEgPT0gJ1snKQorICAgIGF0dHIxKys7CisgIG4gPSAxOworICBmb3IgKDs7KQorICB7IGsgPSAoaW50KXNvYXBfc3RydG9sKGF0dHIxLCAmcywgMTApOworICAgIG4gKj0gazsKKyAgICBpZiAoayA8IDAgfHwgbiA+IFNPQVBfTUFYQVJSQVlTSVpFIHx8IHMgPT0gYXR0cjEpCisgICAgICByZXR1cm4gLTE7CisgICAgYXR0cjEgPSBzdHJjaHIocywgJywnKTsKKyAgICBpZiAoIWF0dHIxKQorICAgICAgYXR0cjEgPSBzdHJjaHIocywgJyAnKTsKKyAgICBpZiAoYXR0cjIgJiYgKmF0dHIyKQorICAgIHsgYXR0cjIrKzsKKyAgICAgICpqICo9IGs7CisgICAgICBrID0gKGludClzb2FwX3N0cnRvbChhdHRyMiwgJnMsIDEwKTsKKyAgICAgICpqICs9IGs7CisgICAgICBpZiAoayA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGF0dHIyID0gczsKKyAgICB9CisgICAgaWYgKCFhdHRyMSkKKyAgICAgIGJyZWFrOworICAgIGF0dHIxKys7CisgIH0KKyAgcmV0dXJuIG4gLSAqajsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRzaXplcyhjb25zdCBjaGFyICphdHRyLCBpbnQgKnNpemUsIGludCBkaW0pCit7IHJlZ2lzdGVyIGludCBpLCBrLCBuOworICBpZiAoISphdHRyKQorICAgIHJldHVybiAtMTsKKyAgaSA9IHN0cmxlbihhdHRyKTsKKyAgbiA9IDE7CisgIGRvCisgIHsgZm9yIChpID0gaS0xOyBpID49IDA7IGktLSkKKyAgICAgIGlmIChhdHRyW2ldID09ICdbJyB8fCBhdHRyW2ldID09ICcsJyB8fCBhdHRyW2ldID09ICcgJykKKyAgICAgICAgYnJlYWs7CisgICAgayA9IChpbnQpYXRvbChhdHRyICsgaSArIDEpOworICAgIG4gKj0gc2l6ZVstLWRpbV0gPSBrOworICAgIGlmIChrIDwgMCB8fCBuID4gU09BUF9NQVhBUlJBWVNJWkUpCisgICAgICByZXR1cm4gLTE7CisgIH0gd2hpbGUgKGkgPj0gMCAmJiBhdHRyW2ldICE9ICdbJyk7CisgIHJldHVybiBuOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldHBvc2l0aW9uKGNvbnN0IGNoYXIgKmF0dHIsIGludCAqcG9zKQoreyByZWdpc3RlciBpbnQgaSwgbjsKKyAgaWYgKCEqYXR0cikKKyAgICByZXR1cm4gLTE7CisgIG4gPSAwOworICBpID0gMTsKKyAgZG8KKyAgeyBwb3NbbisrXSA9IChpbnQpYXRvbChhdHRyICsgaSk7CisgICAgd2hpbGUgKGF0dHJbaV0gJiYgYXR0cltpXSAhPSAnLCcgJiYgYXR0cltpXSAhPSAnXScpCisgICAgICBpKys7CisgICAgaWYgKGF0dHJbaV0gPT0gJywnKQorICAgICAgaSsrOworICB9IHdoaWxlIChuIDwgU09BUF9NQVhESU1TICYmIGF0dHJbaV0gJiYgYXR0cltpXSAhPSAnXScpOworICByZXR1cm4gbjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXNoX25hbWVzcGFjZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKm5zKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnA7CisgIHJlZ2lzdGVyIHN0cnVjdCBOYW1lc3BhY2UgKnA7CisgIHJlZ2lzdGVyIHNob3J0IGkgPSAtMTsKKyAgcmVnaXN0ZXIgc2l6ZV90IG4sIGs7CisgIG4gPSBzdHJsZW4oaWQpOworICBrID0gc3RybGVuKG5zKSArIDE7CisgIHAgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzOworICBpZiAocCkKKyAgeyBmb3IgKGkgPSAwOyBwLT5pZDsgcCsrLCBpKyspCisgICAgeyBpZiAocC0+bnMgJiYgIXN0cmNtcChucywgcC0+bnMpKQorICAgICAgeyBpZiAocC0+b3V0KQorICAgICAgICB7IFNPQVBfRlJFRShzb2FwLCBwLT5vdXQpOworICAgICAgICAgIHAtPm91dCA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAocC0+b3V0KQorICAgICAgeyBpZiAoIXN0cmNtcChucywgcC0+b3V0KSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHAtPmluKQorICAgICAgeyBpZiAoIXNvYXBfdGFnX2NtcChucywgcC0+aW4pKQorICAgICAgICB7IGlmICgocC0+b3V0ID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIGspKSkKKyAgICAgICAgICAgIHN0cmNweShwLT5vdXQsIG5zKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAoIXAgfHwgIXAtPmlkKQorICAgICAgaSA9IC0xOworICB9CisgIGlmIChpID49IDApCisgICAgayA9IDA7CisgIG5wID0gKHN0cnVjdCBzb2FwX25saXN0KilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfbmxpc3QpICsgbiArIGspOworICBpZiAoIW5wKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICBucC0+bmV4dCA9IHNvYXAtPm5saXN0OworICBzb2FwLT5ubGlzdCA9IG5wOworICBucC0+bGV2ZWwgPSBzb2FwLT5sZXZlbDsKKyAgbnAtPmluZGV4ID0gaTsKKyAgc3RyY3B5KG5wLT5pZCwgaWQpOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlB1c2ggbmFtZXNwYWNlIGJpbmRpbmcgKGxldmVsPSV1KSAnJXMnICclcydcbiIsIHNvYXAtPmxldmVsLCBpZCwgbnMpKTsKKyAgaWYgKGkgPCAwKQorICB7IG5wLT5ucyA9IG5wLT5pZCArIG4gKyAxOworICAgIHN0cmNweShucC0+bnMsIG5zKTsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlB1c2ggTk9UIE9LOiBubyBtYXRjaCBmb3VuZCBmb3IgJyVzJyBpbiBuYW1lc3BhY2UgbWFwcGluZyB0YWJsZSAoYWRkZWQgdG8gc3RhY2sgYW55d2F5KVxuIiwgbnMpKTsKKyAgfQorICBlbHNlCisgIHsgbnAtPm5zID0gTlVMTDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlB1c2ggT0sgKCclcycgbWF0Y2hlcyAnJXMnIGluIG5hbWVzcGFjZSB0YWJsZSlcbiIsIGlkLCBwLT5pZCkpOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9wb3BfbmFtZXNwYWNlKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnA7CisgIHdoaWxlIChzb2FwLT5ubGlzdCAmJiBzb2FwLT5ubGlzdC0+bGV2ZWwgPj0gc29hcC0+bGV2ZWwpCisgIHsgbnAgPSBzb2FwLT5ubGlzdC0+bmV4dDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlBvcHBlZCBuYW1lc3BhY2UgYmluZGluZyAobGV2ZWw9JXUpICclcydcbiIsIHNvYXAtPmxldmVsLCBzb2FwLT5ubGlzdC0+aWQpKTsKKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+bmxpc3QpOworICAgIHNvYXAtPm5saXN0ID0gbnA7CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9tYXRjaF9uYW1lc3BhY2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkMSwgY29uc3QgY2hhciAqaWQyLCBpbnQgbjEsIGludCBuMikgCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucCA9IHNvYXAtPm5saXN0OworICB3aGlsZSAobnAgJiYgKHN0cm5jbXAobnAtPmlkLCBpZDEsIG4xKSB8fCBucC0+aWRbbjFdKSkKKyAgICBucCA9IG5wLT5uZXh0OworICBpZiAobnApCisgIHsgaWYgKG5wLT5pbmRleCA8IDAKKyAgICAgfHwgKHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbbnAtPmluZGV4XS5pZAorICAgICAgJiYgKHN0cm5jbXAoc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tucC0+aW5kZXhdLmlkLCBpZDIsIG4yKQorICAgICAgIHx8IHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbbnAtPmluZGV4XS5pZFtuMl0pKSkKKyAgICAgIHJldHVybiBTT0FQX05BTUVTUEFDRTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICBpZiAobjEgPT0gMyAmJiBuMSA9PSBuMiAmJiAhc3RyY21wKGlkMSwgInhtbCIpICYmICFzdHJjbXAoaWQxLCBpZDIpKQorICAgIHJldHVybiBTT0FQX09LOworICByZXR1cm4gU09BUF9TWU5UQVhfRVJST1I7IAorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfY3VycmVudF9uYW1lc3BhY2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZykKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wOworICByZWdpc3RlciBjb25zdCBjaGFyICpzOworICBucCA9IHNvYXAtPm5saXN0OworICBpZiAoIShzID0gc3RyY2hyKHRhZywgJzonKSkpCisgIHsgd2hpbGUgKG5wICYmICpucC0+aWQpIC8qIGZpbmQgZGVmYXVsdCBuYW1lc3BhY2UsIGlmIHByZXNlbnQgKi8KKyAgICAgIG5wID0gbnAtPm5leHQ7CisgIH0KKyAgZWxzZQorICB7IHdoaWxlIChucCAmJiAoc3RybmNtcChucC0+aWQsIHRhZywgcyAtIHRhZykgfHwgbnAtPmlkW3MgLSB0YWddKSkKKyAgICAgIG5wID0gbnAtPm5leHQ7CisgICAgaWYgKCFucCkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9OQU1FU1BBQ0U7CisgIH0KKyAgaWYgKG5wKQorICB7IGlmIChucC0+aW5kZXggPj0gMCkKKyAgICAgIHJldHVybiBzb2FwLT5uYW1lc3BhY2VzW25wLT5pbmRleF0ubnM7CisgICAgaWYgKG5wLT5ucykKKyAgICAgIHJldHVybiBzb2FwX3N0cmR1cChzb2FwLCBucC0+bnMpOworICB9CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3RhZ19jbXAoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqdCkKK3sgZm9yICg7OykKKyAgeyByZWdpc3RlciBpbnQgYzEgPSAqczsKKyAgICByZWdpc3RlciBpbnQgYzIgPSAqdDsKKyAgICBpZiAoIWMxIHx8IGMxID09ICciJykKKyAgICAgIGJyZWFrOworICAgIGlmIChjMiAhPSAnLScpCisgICAgeyBpZiAoYzEgIT0gYzIpCisgICAgICB7IGlmIChjMSA+PSAnQScgJiYgYzEgPD0gJ1onKQorICAgICAgICAgIGMxICs9ICdhJyAtICdBJzsKKyAgICAgICAgaWYgKGMyID49ICdBJyAmJiBjMiA8PSAnWicpCisgICAgICAgICAgYzIgKz0gJ2EnIC0gJ0EnOworICAgICAgfQorICAgICAgaWYgKGMxICE9IGMyKQorICAgICAgeyBpZiAoYzIgIT0gJyonKQorICAgICAgICAgIHJldHVybiAxOworCWMyID0gKisrdDsKKyAgICAgICAgaWYgKCFjMikKKwkgIHJldHVybiAwOworICAgICAgICBpZiAoYzIgPj0gJ0EnICYmIGMyIDw9ICdaJykKKyAgICAgICAgICBjMiArPSAnYScgLSAnQSc7CisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsgYzEgPSAqczsKKwkgIGlmICghYzEgfHwgYzEgPT0gJyInKQorCSAgICBicmVhazsKKwkgIGlmIChjMSA+PSAnQScgJiYgYzEgPD0gJ1onKQorICAgICAgICAgICAgYzEgKz0gJ2EnIC0gJ0EnOworICAgICAgICAgIGlmIChjMSA9PSBjMiAmJiAhc29hcF90YWdfY21wKHMgKyAxLCB0ICsgMSkpCisgICAgICAgICAgICByZXR1cm4gMDsKKwkgIHMrKzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgcysrOworICAgIHQrKzsKKyAgfQorICBpZiAoKnQgPT0gJyonICYmICF0WzFdKQorICAgIHJldHVybiAwOworICByZXR1cm4gKnQ7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfbWF0Y2hfdGFnKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcxLCBjb25zdCBjaGFyICp0YWcyKQoreyByZWdpc3RlciBjb25zdCBjaGFyICpzLCAqdDsKKyAgaWYgKCF0YWcxIHx8ICF0YWcyIHx8ICEqdGFnMikKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgcyA9IHN0cmNocih0YWcxLCAnOicpOworICB0ID0gc3RyY2hyKHRhZzIsICc6Jyk7CisgIGlmICh0KQorICB7IGlmIChzKQorICAgIHsgaWYgKHRbMV0gJiYgU09BUF9TVFJDTVAocyArIDEsIHQgKyAxKSkKKyAgICAgICAgcmV0dXJuIFNPQVBfVEFHX01JU01BVENIOworICAgICAgaWYgKHQgIT0gdGFnMiAmJiBzb2FwX21hdGNoX25hbWVzcGFjZShzb2FwLCB0YWcxLCB0YWcyLCBzIC0gdGFnMSwgdCAtIHRhZzIpKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlRhZ3MgJyVzJyBhbmQgJyVzJyBtYXRjaCBidXQgbmFtZXNwYWNlcyBkaWZmZXJcbiIsIHRhZzEsIHRhZzIpKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfVEFHX01JU01BVENIOworICAgICAgfQorICAgIH0gCisgICAgZWxzZSBpZiAoU09BUF9TVFJDTVAodGFnMSwgdCArIDEpKQorICAgICAgcmV0dXJuIFNPQVBfVEFHX01JU01BVENIOworICAgIGVsc2UgaWYgKHQgIT0gdGFnMiAmJiBzb2FwX21hdGNoX25hbWVzcGFjZShzb2FwLCB0YWcxLCB0YWcyLCAwLCB0IC0gdGFnMikpCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlRhZ3MgJyVzJyBhbmQgJyVzJyBtYXRjaCBidXQgbmFtZXNwYWNlcyBkaWZmZXJcbiIsIHRhZzEsIHRhZzIpKTsKKyAgICAgIHJldHVybiBTT0FQX1RBR19NSVNNQVRDSDsKKyAgICB9CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJUYWdzIGFuZCAoZGVmYXVsdCkgbmFtZXNwYWNlcyBtYXRjaDogJyVzJyAnJXMnXG4iLCB0YWcxLCB0YWcyKSk7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgaWYgKHMpCisgIHsgaWYgKFNPQVBfU1RSQ01QKHMgKyAxLCB0YWcyKSkKKyAgICAgIHJldHVybiBTT0FQX1RBR19NSVNNQVRDSDsKKyAgfQorICBlbHNlIGlmIChTT0FQX1NUUkNNUCh0YWcxLCB0YWcyKSkKKyAgICByZXR1cm4gU09BUF9UQUdfTUlTTUFUQ0g7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVGFncyBtYXRjaDogJyVzJyAnJXMnXG4iLCB0YWcxLCB0YWcyKSk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX21hdGNoX2FycmF5KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0eXBlKQoreyBpZiAoKnNvYXAtPmFycmF5VHlwZSkKKyAgICBpZiAoc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+YXJyYXlUeXBlLCB0eXBlKQorICAgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT5hcnJheVR5cGUsICJ4c2Q6YW55VHlwZSIpCisgICAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPmFycmF5VHlwZSwgInhzZDp1ci10eXBlIikKKyAgICApCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFycmF5IHR5cGUgbWlzbWF0Y2g6ICclcycgJyVzJ1xuIiwgc29hcC0+YXJyYXlUeXBlLCB0eXBlKSk7CisgICAgICByZXR1cm4gU09BUF9UQUdfTUlTTUFUQ0g7CisgICAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqCVNTTAorICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBXSVRIX09QRU5TU0wKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JhbmQoKQoreyB1bnNpZ25lZCBjaGFyIGJ1Zls0XTsKKyAgaWYgKCFzc2xfaW5pdF9kb25lKQorICAgIHNvYXBfc3NsX2luaXQoKTsKKyAgUkFORF9wc2V1ZG9fYnl0ZXMoYnVmLCA0KTsKKyAgcmV0dXJuICooaW50KilidWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc3NsX3NlcnZlcl9jb250ZXh0KHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBzaG9ydCBmbGFncywgY29uc3QgY2hhciAqa2V5ZmlsZSwgY29uc3QgY2hhciAqcGFzc3dvcmQsIGNvbnN0IGNoYXIgKmNhZmlsZSwgY29uc3QgY2hhciAqY2FwYXRoLCBjb25zdCBjaGFyICpkaGZpbGUsIGNvbnN0IGNoYXIgKnJhbmRmaWxlLCBjb25zdCBjaGFyICpzaWQpCit7IGludCBlcnI7CisgIHNvYXAtPmtleWZpbGUgPSBrZXlmaWxlOworICBzb2FwLT5wYXNzd29yZCA9IHBhc3N3b3JkOworICBzb2FwLT5jYWZpbGUgPSBjYWZpbGU7CisgIHNvYXAtPmNhcGF0aCA9IGNhcGF0aDsKKyAgaWYgKGRoZmlsZSkKKyAgeyBzb2FwLT5kaGZpbGUgPSBkaGZpbGU7CisgICAgc29hcC0+cnNhID0gMDsKKyAgfQorICBlbHNlCisgIHsgc29hcC0+ZGhmaWxlID0gTlVMTDsKKyAgICBzb2FwLT5yc2EgPSAxOworICB9CisgIHNvYXAtPnJhbmRmaWxlID0gcmFuZGZpbGU7CisgIHNvYXAtPnJlcXVpcmVfY2xpZW50X2F1dGggPSAoZmxhZ3MgJiBTT0FQX1NTTF9SRVFVSVJFX0NMSUVOVF9BVVRIRU5USUNBVElPTik7CisgIGlmICghKGVyciA9IHNvYXAtPmZzc2xhdXRoKHNvYXApKSkKKyAgeyBpZiAoc2lkKQorICAgICAgU1NMX0NUWF9zZXRfc2Vzc2lvbl9pZF9jb250ZXh0KHNvYXAtPmN0eCwgKHVuc2lnbmVkIGNoYXIqKXNpZCwgc3RybGVuKHNpZCkpOworICB9CisgIHJldHVybiBlcnI7IAorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NzbF9jbGllbnRfY29udGV4dChzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgc2hvcnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmtleWZpbGUsIGNvbnN0IGNoYXIgKnBhc3N3b3JkLCBjb25zdCBjaGFyICpjYWZpbGUsIGNvbnN0IGNoYXIgKmNhcGF0aCwgY29uc3QgY2hhciAqcmFuZGZpbGUpCit7IHNvYXAtPmtleWZpbGUgPSBrZXlmaWxlOworICBzb2FwLT5wYXNzd29yZCA9IHBhc3N3b3JkOworICBzb2FwLT5jYWZpbGUgPSBjYWZpbGU7CisgIHNvYXAtPmNhcGF0aCA9IGNhcGF0aDsKKyAgc29hcC0+ZGhmaWxlID0gTlVMTDsKKyAgc29hcC0+cnNhID0gMDsKKyAgc29hcC0+cmFuZGZpbGUgPSByYW5kZmlsZTsKKyAgc29hcC0+cmVxdWlyZV9zZXJ2ZXJfYXV0aCA9IChmbGFncyAmIFNPQVBfU1NMX1JFUVVJUkVfU0VSVkVSX0FVVEhFTlRJQ0FUSU9OKTsKKyAgcmV0dXJuIHNvYXAtPmZzc2xhdXRoKHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zc2xfaW5pdCgpCit7IC8qIE5vdGU6IGZvciBNVCBzeXN0ZW1zLCB0aGUgbWFpbiBwcm9ncmFtIE1VU1QgY2FsbCBzb2FwX3NzbF9pbml0KCkgYmVmb3JlIGFueSB0aHJlYWRzIGFyZSBzdGFydGVkICovCisgIGlmICghc3NsX2luaXRfZG9uZSkKKyAgeyBzc2xfaW5pdF9kb25lID0gMTsKKyAgICBTU0xfbGlicmFyeV9pbml0KCk7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIFNTTF9sb2FkX2Vycm9yX3N0cmluZ3MoKTsKKyNlbmRpZgorICAgIGlmICghUkFORF9sb2FkX2ZpbGUoIi9kZXYvdXJhbmRvbSIsIDEwMjQpKQorICAgIHsgY2hhciBidWZbMTAyNF07CisgICAgICBSQU5EX3NlZWQoYnVmLCBzaXplb2YoYnVmKSk7CisgICAgICB3aGlsZSAoIVJBTkRfc3RhdHVzKCkpCisgICAgICB7IGludCByID0gcmFuZCgpOworICAgICAgICBSQU5EX3NlZWQoJnIsIHNpemVvZihpbnQpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBjb25zdCBjaGFyICoKK3NzbF9lcnJvcihzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHJldCkKK3sgaW50IGVyciA9IFNTTF9nZXRfZXJyb3Ioc29hcC0+c3NsLCByZXQpOworICBjb25zdCBjaGFyICptc2cgPSBzb2FwX3N0cl9jb2RlKGhfc3NsX2Vycm9yX2NvZGVzLCBlcnIpOworICBpZiAobXNnKQorICAgIHN0cmNweShzb2FwLT5tc2didWYsIG1zZyk7CisgIGVsc2UKKyAgICByZXR1cm4gRVJSX2Vycm9yX3N0cmluZyhlcnIsIHNvYXAtPm1zZ2J1Zik7CisgIGlmIChFUlJfcGVla19lcnJvcigpKQorICB7IHVuc2lnbmVkIGxvbmcgcjsKKyAgICBzdHJjYXQoc29hcC0+bXNnYnVmLCAiXG4iKTsKKyAgICB3aGlsZSAoKHIgPSBFUlJfZ2V0X2Vycm9yKCkpKQorICAgICAgRVJSX2Vycm9yX3N0cmluZ19uKHIsIHNvYXAtPm1zZ2J1ZiArIHN0cmxlbihzb2FwLT5tc2didWYpLCBzaXplb2Yoc29hcC0+bXNnYnVmKSAtIHN0cmxlbihzb2FwLT5tc2didWYpKTsKKyAgfSAKKyAgZWxzZQorICB7IHN3aXRjaCAocmV0KQorICAgIHsgY2FzZSAwOgorICAgICAgICBzdHJjcHkoc29hcC0+bXNnYnVmLCAiRU9GIHdhcyBvYnNlcnZlZCB0aGF0IHZpb2xhdGVzIHRoZSBwcm90b2NvbC4gVGhlIGNsaWVudCBwcm9iYWJseSBwcm92aWRlZCBpbnZhbGlkIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uLiIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgLTE6CisgICAgICAgIHNwcmludGYoc29hcC0+bXNnYnVmLCAiRXJyb3Igb2JzZXJ2ZWQgYnkgdW5kZXJseWluZyBCSU86ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsgIAorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXAtPm1zZ2J1ZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NzbF9wYXNzd29yZChjaGFyICpidWYsIGludCBudW0sIGludCByd2ZsYWcsIHZvaWQgKnVzZXJkYXRhKQoreyBpZiAobnVtIDwgKGludClzdHJsZW4oKGNoYXIqKXVzZXJkYXRhKSArIDEpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiBzdHJsZW4oc3RyY3B5KGJ1ZiwgKGNoYXIqKXVzZXJkYXRhKSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRoaXMgY2FsbGJhY2sgaXMgaW5jbHVkZWQgZm9yIGZ1dHVyZSByZWZlcmVuY2VzLiBJdCBzaG91bGQgbm90IGJlIGRlbGV0ZWQKKyNpZm5kZWYgUEFMTV8yCitzdGF0aWMgREggKgorc3NsX3RtcF9kaChTU0wgKnNzbCwgaW50IGlzX2V4cG9ydCwgaW50IGtleWxlbmd0aCkKK3sgc3RhdGljIERIICpkaDUxMiA9IE5VTEw7CisgIHN0YXRpYyBESCAqZGgxMDI0ID0gTlVMTDsKKyAgREggKmRoOworICBzd2l0Y2ggKGtleWxlbmd0aCkKKyAgeyBjYXNlIDUxMjoKKyAgICAgIGlmICghZGg1MTIpCisgICAgICB7IEJJTyAqYmlvID0gQklPX25ld19maWxlKCJkaDUxMi5wZW0iLCAiciIpOworICAgICAgICBpZiAoYmlvKQorICAgICAgICB7IGRoNTEyID0gUEVNX3JlYWRfYmlvX0RIcGFyYW1zKGJpbywgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgQklPX2ZyZWUoYmlvKTsKKyAgICAgICAgICByZXR1cm4gZGg1MTI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGRoNTEyOworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoIWRoMTAyNCkKKyAgICAgIHsgQklPICpiaW8gPSBCSU9fbmV3X2ZpbGUoImRoMTAyNC5wZW0iLCAiciIpOworICAgICAgICBpZiAoYmlvKQorICAgICAgICB7IGRoMTAyNCA9IFBFTV9yZWFkX2Jpb19ESHBhcmFtcyhiaW8sIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgICAgIEJJT19mcmVlKGJpbyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGRoID0gZGgxMDI0OworICB9CisgIHJldHVybiBkaDsKK30KKyNlbmRpZgorKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzc2xfYXV0aF9pbml0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoIXNzbF9pbml0X2RvbmUpCisgICAgc29hcF9zc2xfaW5pdCgpOworICBpZiAoIXNvYXAtPmN0eCkKKyAgeyBpZiAoIShzb2FwLT5jdHggPSBTU0xfQ1RYX25ldyhTU0x2MjNfbWV0aG9kKCkpKSkKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHNldHVwIGNvbnRleHQiLCBTT0FQX1NTTF9FUlJPUik7CisgIH0KKyAgaWYgKHNvYXAtPnJhbmRmaWxlKQorICB7IGlmICghUkFORF9sb2FkX2ZpbGUoc29hcC0+cmFuZGZpbGUsIC0xKSkKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IGxvYWQgcmFuZG9tbmVzcyIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgfQorICBpZiAoc29hcC0+Y2FmaWxlIHx8IHNvYXAtPmNhcGF0aCkKKyAgeyBpZiAoIVNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKHNvYXAtPmN0eCwgc29hcC0+Y2FmaWxlLCBzb2FwLT5jYXBhdGgpKQorICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3QgcmVhZCBDQSBmaWxlIGFuZCBkaXJlY3RvcnkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgaWYgKHNvYXAtPmNhZmlsZSAmJiBzb2FwLT5yZXF1aXJlX2NsaWVudF9hdXRoKQorICAgICAgU1NMX0NUWF9zZXRfY2xpZW50X0NBX2xpc3Qoc29hcC0+Y3R4LCBTU0xfbG9hZF9jbGllbnRfQ0FfZmlsZShzb2FwLT5jYWZpbGUpKTsKKyAgfQorICBpZiAoIVNTTF9DVFhfc2V0X2RlZmF1bHRfdmVyaWZ5X3BhdGhzKHNvYXAtPmN0eCkpCisgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3QgcmVhZCBkZWZhdWx0IENBIGZpbGUgYW5kL29yIGRpcmVjdG9yeSIsIFNPQVBfU1NMX0VSUk9SKTsKKy8qIFNlZSBiZWxvdyAqLworICBpZiAoc29hcC0+a2V5ZmlsZSkKKyAgeyBpZiAoIVNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoc29hcC0+Y3R4LCBzb2FwLT5rZXlmaWxlKSkKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHJlYWQgY2VydGlmaWNhdGUga2V5IGZpbGUiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgaWYgKHNvYXAtPnBhc3N3b3JkKQorICAgIHsgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2JfdXNlcmRhdGEoc29hcC0+Y3R4LCAodm9pZCopc29hcC0+cGFzc3dvcmQpOworICAgICAgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2Ioc29hcC0+Y3R4LCBzc2xfcGFzc3dvcmQpOworICAgIH0KKyAgICBpZiAoIVNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfZmlsZShzb2FwLT5jdHgsIHNvYXAtPmtleWZpbGUsIFNTTF9GSUxFVFlQRV9QRU0pKQorICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3QgcmVhZCBrZXkgZmlsZSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgfQorLyogU3VnZ2VzdGVkIGFsdGVybmF0aXZlIGFwcHJvYWNoIHRvIGNoZWNrIGNhZmlsZSBmaXJzdCBiZWZvcmUgdGhlIGtleSBmaWxlOgorICBpZiAoc29hcC0+cGFzc3dvcmQpCisgIHsgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2JfdXNlcmRhdGEoc29hcC0+Y3R4LCAodm9pZCopc29hcC0+cGFzc3dvcmQpOworICAgIFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiKHNvYXAtPmN0eCwgc3NsX3Bhc3N3b3JkKTsKKyAgfQorICBpZiAoIXNvYXAtPmNhZmlsZSB8fCAhU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZShzb2FwLT5jdHgsIHNvYXAtPmNhZmlsZSkpCisgIHsgaWYgKHNvYXAtPmtleWZpbGUpCisgICAgeyBpZiAoIVNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoc29hcC0+Y3R4LCBzb2FwLT5rZXlmaWxlKSkKKyAgICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3QgcmVhZCBjZXJ0aWZpY2F0ZSBvciBrZXkgZmlsZSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICAgIGlmICghU1NMX0NUWF91c2VfUHJpdmF0ZUtleV9maWxlKHNvYXAtPmN0eCwgc29hcC0+a2V5ZmlsZSwgU1NMX0ZJTEVUWVBFX1BFTSkpCisgICAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHJlYWQga2V5IGZpbGUiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgfQorICB9CisqLworICBpZiAoc29hcC0+cnNhKQorICB7IFJTQSAqcnNhID0gUlNBX2dlbmVyYXRlX2tleSgxMDI0LCBSU0FfRjQsIE5VTEwsIE5VTEwpOworICAgIGlmICghU1NMX0NUWF9zZXRfdG1wX3JzYShzb2FwLT5jdHgsIHJzYSkpCisgICAgeyBpZiAocnNhKQorICAgICAgICBSU0FfZnJlZShyc2EpOworICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3Qgc2V0IFJTQSBrZXkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgfQorICAgIFJTQV9mcmVlKHJzYSk7CisgIH0KKyAgZWxzZSBpZiAoc29hcC0+ZGhmaWxlKQorICB7IERIICpkaCA9IDA7CisgICAgQklPICpiaW87CisgICAgYmlvID0gQklPX25ld19maWxlKHNvYXAtPmRoZmlsZSwgInIiKTsKKyAgICBpZiAoIWJpbykKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHJlYWQgREggZmlsZSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICBkaCA9IFBFTV9yZWFkX2Jpb19ESHBhcmFtcyhiaW8sIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIEJJT19mcmVlKGJpbyk7CisgICAgaWYgKFNTTF9DVFhfc2V0X3RtcF9kaChzb2FwLT5jdHgsIGRoKSA8IDApCisgICAgeyBpZiAoZGgpCisgICAgICAgIERIX2ZyZWUoZGgpOworICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiQ2FuJ3Qgc2V0IERIIHBhcmFtZXRlcnMiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgfQorICAgIERIX2ZyZWUoZGgpOworICB9CisgIFNTTF9DVFhfc2V0X29wdGlvbnMoc29hcC0+Y3R4LCBTU0xfT1BfQUxMIHwgU1NMX09QX05PX1NTTHYyKTsKKyAgU1NMX0NUWF9zZXRfdmVyaWZ5KHNvYXAtPmN0eCwgc29hcC0+cmVxdWlyZV9jbGllbnRfYXV0aCA/IChTU0xfVkVSSUZZX1BFRVIgfCBTU0xfVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJUKSA6IHNvYXAtPnJlcXVpcmVfc2VydmVyX2F1dGggPyBTU0xfVkVSSUZZX1BFRVIgOiBTU0xfVkVSSUZZX05PTkUsIHNvYXAtPmZzc2x2ZXJpZnkpOworI2lmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgMHgwMDkwNTEwMEwpCisgIFNTTF9DVFhfc2V0X3ZlcmlmeV9kZXB0aChzb2FwLT5jdHgsIDEpOyAKKyNlbHNlCisgIFNTTF9DVFhfc2V0X3ZlcmlmeV9kZXB0aChzb2FwLT5jdHgsIDkpOyAKKyNlbmRpZiAgCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc3NsX3ZlcmlmeV9jYWxsYmFjayhpbnQgb2ssIFg1MDlfU1RPUkVfQ1RYICpzdG9yZSkKK3sKKyNpZmRlZiBTT0FQX0RFQlVHCisgIGlmICghb2spIAorICB7IGNoYXIgZGF0YVsyNTZdOworICAgIFg1MDkgKmNlcnQgPSBYNTA5X1NUT1JFX0NUWF9nZXRfY3VycmVudF9jZXJ0KHN0b3JlKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlNTTCB2ZXJpZnkgZXJyb3Igb3Igd2FybmluZyB3aXRoIGNlcnRpZmljYXRlIGF0IGRlcHRoICVkOiAlc1xuIiwgWDUwOV9TVE9SRV9DVFhfZ2V0X2Vycm9yX2RlcHRoKHN0b3JlKSwgWDUwOV92ZXJpZnlfY2VydF9lcnJvcl9zdHJpbmcoWDUwOV9TVE9SRV9DVFhfZ2V0X2Vycm9yKHN0b3JlKSkpOworICAgIFg1MDlfTkFNRV9vbmVsaW5lKFg1MDlfZ2V0X2lzc3Vlcl9uYW1lKGNlcnQpLCBkYXRhLCBzaXplb2YoZGF0YSkpOworICAgIGZwcmludGYoc3RkZXJyLCAiY2VydGlmaWNhdGUgaXNzdWVyICVzXG4iLCBkYXRhKTsKKyAgICBYNTA5X05BTUVfb25lbGluZShYNTA5X2dldF9zdWJqZWN0X25hbWUoY2VydCksIGRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgZnByaW50ZihzdGRlcnIsICJjZXJ0aWZpY2F0ZSBzdWJqZWN0ICVzXG4iLCBkYXRhKTsKKyAgfQorI2VuZGlmCisgIC8qIE5vdGU6IHJldHVybiAxIHRvIGNvbnRpbnVlLCBidXQgdW5zYWZlIHByb2dyZXNzIHdpbGwgYmUgdGVybWluYXRlZCBieSBTU0wgKi8KKyAgcmV0dXJuIG9rOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NzbF9hY2NlcHQoc3RydWN0IHNvYXAgKnNvYXApCit7IEJJTyAqYmlvOworICBpbnQgaSwgcjsKKyAgaWYgKCFzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIk5vIHNvY2tldCBpbiBzb2FwX3NzbF9hY2NlcHQoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgaWYgKCFzb2FwLT5jdHggJiYgKHNvYXAtPmVycm9yID0gc29hcC0+ZnNzbGF1dGgoc29hcCkpKQorICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICBpZiAoIXNvYXAtPnNzbCkKKyAgeyBzb2FwLT5zc2wgPSBTU0xfbmV3KHNvYXAtPmN0eCk7CisgICAgaWYgKCFzb2FwLT5zc2wpCisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJTU0xfbmV3KCkgZmFpbGVkIGluIHNvYXBfc3NsX2FjY2VwdCgpIiwgU09BUF9TU0xfRVJST1IpOworICB9CisgIGVsc2UKKyAgICBTU0xfY2xlYXIoc29hcC0+c3NsKTsKKyAgc29hcC0+aW1vZGUgfD0gU09BUF9FTkNfU1NMOworICBzb2FwLT5vbW9kZSB8PSBTT0FQX0VOQ19TU0w7CisjaWYgZGVmaW5lZChXSU4zMikKKyAgeyB1X2xvbmcgbm9uYmxvY2tpbmcgPSAxOworICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZJT05CSU8sICZub25ibG9ja2luZyk7CisgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgeyB1X2xvbmcgbm9uYmxvY2tpbmcgPSAxOworICAgIGlvY3RsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZJT05CSU8sIChpbnQpJm5vbmJsb2NraW5nKTsKKyAgfQorI2Vsc2UKKyAgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRl9HRVRGTCl8T19OT05CTE9DSyk7CisjZW5kaWYKKyAgYmlvID0gQklPX25ld19zb2NrZXQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgQklPX05PQ0xPU0UpOworICBTU0xfc2V0X2Jpbyhzb2FwLT5zc2wsIGJpbywgYmlvKTsKKyAgaSA9IDEwMDsgLyogMTAwICogMC4xIG1zIHJldHJpZXMgKi8KKyAgd2hpbGUgKChyID0gU1NMX2FjY2VwdChzb2FwLT5zc2wpKSA8PSAwKQorICB7IGludCBlcnIgPSBTU0xfZ2V0X2Vycm9yKHNvYXAtPnNzbCwgcik7CisgICAgaWYgKGVyciA9PSBTU0xfRVJST1JfV0FOVF9SRUFEIHx8IGVyciA9PSBTU0xfRVJST1JfV0FOVF9XUklURSkKKyAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICBmZF9zZXQgZmQ7CisgICAgICBpZiAoaS0tIDw9IDApCisgICAgICAgIGJyZWFrOworICAgICAgdGltZW91dC50dl9zZWMgPSAwOworICAgICAgdGltZW91dC50dl91c2VjID0gMTAwMDAwOworICAgICAgRkRfWkVSTygmZmQpOworICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZmZCk7CisgICAgICByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksICZmZCwgTlVMTCwgJmZkLCAmdGltZW91dCk7CisgICAgICBpZiAociA8IDAgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUikKKyAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgIHJldHVybiBTT0FQX0VPRjsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgc29hcC0+ZXJybnVtID0gZXJyOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisjaWYgZGVmaW5lZChXSU4zMikKKyAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZJT05CSU8sICZibG9ja2luZyk7CisgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgIGlvY3RsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZJT05CSU8sIChpbnQpJmJsb2NraW5nKTsKKyAgfQorI2Vsc2UKKyAgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRl9HRVRGTCkmfk9fTk9OQkxPQ0spOworI2VuZGlmCisgIGlmIChyIDw9IDApCisgIHsgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgc3NsX2Vycm9yKHNvYXAsIHIpLCAiU1NMX2FjY2VwdCgpIGZhaWxlZCBpbiBzb2FwX3NzbF9hY2NlcHQoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICByZXR1cm4gU09BUF9TU0xfRVJST1I7CisgIH0KKyAgaWYgKHNvYXAtPnJlcXVpcmVfY2xpZW50X2F1dGgpCisgIHsgWDUwOSAqcGVlcjsKKyAgICBpbnQgZXJyOworICAgIGlmICgoZXJyID0gU1NMX2dldF92ZXJpZnlfcmVzdWx0KHNvYXAtPnNzbCkpICE9IFg1MDlfVl9PSykKKyAgICB7IHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgcmV0dXJuIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCBYNTA5X3ZlcmlmeV9jZXJ0X2Vycm9yX3N0cmluZyhlcnIpLCAiU1NMIGNlcnRpZmljYXRlIHByZXNlbnRlZCBieSBwZWVyIGNhbm5vdCBiZSB2ZXJpZmllZCBpbiBzb2FwX3NzbF9hY2NlcHQoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICB9CisgICAgcGVlciA9IFNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZShzb2FwLT5zc2wpOworICAgIGlmICghcGVlcikKKyAgICB7IHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgcmV0dXJuIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIk5vIFNTTCBjZXJ0aWZpY2F0ZSB3YXMgcHJlc2VudGVkIGJ5IHRoZSBwZWVyIGluIHNvYXBfc3NsX2FjY2VwdCgpIiwgU09BUF9TU0xfRVJST1IpOworICAgIH0KKyAgICBYNTA5X2ZyZWUocGVlcik7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNlbmRpZiAvKiBXSVRIX09QRU5TU0wgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAordGNwX2luaXQoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPmVycm1vZGUgPSAxOworI2lmZGVmIFdJTjMyCisgIGlmICh0Y3BfZG9uZSkKKyAgICByZXR1cm4gMDsKKyAgZWxzZQorICB7IFdTQURBVEEgdzsKKyAgICBpZiAoV1NBU3RhcnR1cChNQUtFV09SRCgxLCAxKSwgJncpKQorICAgICAgcmV0dXJuIC0xOworICAgIHRjcF9kb25lID0gMTsKKyAgfQorI2VuZGlmCisgIHJldHVybiAwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2RvbmUoc3RydWN0IHNvYXAgKnNvYXApCit7IAorI2lmZGVmIFNPQVBfREVCVUcKKyAgaW50IGk7CisjZW5kaWYKKyAgaWYgKHNvYXBfY2hlY2tfc3RhdGUoc29hcCkpCisgICAgcmV0dXJuOworICBzb2FwX2ZyZWUoc29hcCk7CisgIHdoaWxlIChzb2FwLT5jbGlzdCkKKyAgeyBzdHJ1Y3Qgc29hcF9jbGlzdCAqcCA9IHNvYXAtPmNsaXN0LT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5jbGlzdCk7CisgICAgc29hcC0+Y2xpc3QgPSBwOworICB9CisgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOyAvKiB0byBmb3JjZSBjbG9zZSB0aGUgc29ja2V0ICovCisgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworI2lmZGVmIFdJVEhfQ09PS0lFUworICBzb2FwX2ZyZWVfY29va2llcyhzb2FwKTsKKyNlbmRpZgorICB3aGlsZSAoc29hcC0+cGx1Z2lucykKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnAgPSBzb2FwLT5wbHVnaW5zLT5uZXh0OworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVtb3ZpbmcgcGx1Z2luICclcydcbiIsIHNvYXAtPnBsdWdpbnMtPmlkKSk7CisgICAgaWYgKHNvYXAtPnBsdWdpbnMtPmZjb3B5IHx8IHNvYXAtPnN0YXRlID09IFNPQVBfSU5JVCkKKyAgICAgIHNvYXAtPnBsdWdpbnMtPmZkZWxldGUoc29hcCwgc29hcC0+cGx1Z2lucyk7CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPnBsdWdpbnMpOworICAgIHNvYXAtPnBsdWdpbnMgPSBwOworICB9CisgIHNvYXAtPmZwbHVnaW4gPSBmcGx1Z2luOworI2lmbmRlZiBXSVRIX05PSFRUUAorICBzb2FwLT5mcG9zdCA9IGh0dHBfcG9zdDsKKyAgc29hcC0+ZmdldCA9IGh0dHBfZ2V0OworICBzb2FwLT5mZm9ybSA9IE5VTEw7CisgIHNvYXAtPmZwb3N0aGRyID0gaHR0cF9wb3N0X2hlYWRlcjsKKyAgc29hcC0+ZnJlc3BvbnNlID0gaHR0cF9yZXNwb25zZTsKKyAgc29hcC0+ZnBhcnNlID0gaHR0cF9wYXJzZTsKKyAgc29hcC0+ZnBhcnNlaGRyID0gaHR0cF9wYXJzZV9oZWFkZXI7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfSVBWNgorICBzb2FwLT5mcmVzb2x2ZSA9IHRjcF9nZXRob3N0OworI2Vsc2UKKyAgc29hcC0+ZnJlc29sdmUgPSBOVUxMOworI2VuZGlmCisgIHNvYXAtPmZhY2NlcHQgPSB0Y3BfYWNjZXB0OworICBzb2FwLT5mb3BlbiA9IHRjcF9jb25uZWN0OworICBzb2FwLT5mY2xvc2UgPSB0Y3BfZGlzY29ubmVjdDsKKyAgc29hcC0+ZmNsb3Nlc29ja2V0ID0gdGNwX2Nsb3Nlc29ja2V0OworICBzb2FwLT5mc2h1dGRvd25zb2NrZXQgPSB0Y3Bfc2h1dGRvd25zb2NrZXQ7CisgIHNvYXAtPmZzZW5kID0gZnNlbmQ7CisgIHNvYXAtPmZyZWN2ID0gZnJlY3Y7CisgIHNvYXAtPmZwb2xsID0gc29hcF9wb2xsOworI2Vsc2UKKyAgc29hcC0+Zm9wZW4gPSBOVUxMOworICBzb2FwLT5mY2xvc2UgPSBOVUxMOworICBzb2FwLT5mcG9sbCA9IE5VTEw7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcC0+ZnByZXBhcmVpbml0ID0gTlVMTDsKKyAgc29hcC0+ZnByZXBhcmVzZW5kID0gTlVMTDsKKyAgc29hcC0+ZnByZXBhcmVyZWN2ID0gTlVMTDsKKyAgc29hcC0+ZnByZXBhcmVmaW5hbCA9IE5VTEw7CisjZW5kaWYKKyAgc29hcC0+ZnNldGVycm9yID0gTlVMTDsKKyAgc29hcC0+Zmlnbm9yZSA9IE5VTEw7CisgIHNvYXAtPmZzZXJ2ZWxvb3AgPSBOVUxMOworI2lmZGVmIFdJVEhfT1BFTlNTTAorICBpZiAoc29hcC0+c2Vzc2lvbikKKyAgeyBTU0xfU0VTU0lPTl9mcmVlKHNvYXAtPnNlc3Npb24pOworICAgIHNvYXAtPnNlc3Npb24gPSBOVUxMOworICB9CisjZW5kaWYKKyAgaWYgKHNvYXAtPnN0YXRlID09IFNPQVBfSU5JVCkKKyAgeyBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSkKKyAgICB7IHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyKTsKKyAgICAgIHNvYXAtPm1hc3RlciA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgIGlmIChzb2FwLT5jdHgpCisgICAgeyBTU0xfQ1RYX2ZyZWUoc29hcC0+Y3R4KTsKKyAgICAgIHNvYXAtPmN0eCA9IE5VTEw7CisgICAgfQorI2VuZGlmCisgIH0KKyNpZmRlZiBTT0FQX0RFQlVHCisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZSBsb2dmaWxlc1xuIikpOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9NQVhMT0dTOyBpKyspCisgIHsgaWYgKHNvYXAtPmxvZ2ZpbGVbaV0pCisgICAgeyBTT0FQX0ZSRUUoc29hcCwgKHZvaWQqKXNvYXAtPmxvZ2ZpbGVbaV0pOworICAgICAgc29hcC0+bG9nZmlsZVtpXSA9IE5VTEw7CisgICAgfQorICAgIHNvYXBfY2xvc2VfbG9nZmlsZShzb2FwLCBpKTsKKyAgfQorICBzb2FwX2ZyZWVfbWh0KHNvYXApOworICBzb2FwLT5zdGF0ZSA9IDA7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2NsZWFudXAoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXBfZG9uZShzb2FwKTsKKyNpZmRlZiBXSU4zMgorICBpZiAoIXRjcF9kb25lKQorICAgIHJldHVybjsKKyAgdGNwX2RvbmUgPSAwOworICBXU0FDbGVhbnVwKCk7CisjZW5kaWYKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBjb25zdCBjaGFyKgordGNwX2Vycm9yKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBjb25zdCBjaGFyICptc2cgPSBOVUxMOworICBzd2l0Y2ggKHNvYXAtPmVycm1vZGUpCisgIHsgY2FzZSAwOgorICAgICAgbXNnID0gc29hcF9zdHJlcnJvcihzb2FwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIG1zZyA9ICJXU0FTdGFydHVwIGZhaWxlZCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgeworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIG1zZyA9IHNvYXBfc3RyX2NvZGUoaF9lcnJvcl9jb2Rlcywgc29hcC0+ZXJybnVtKTsKKyAgICAgIGlmICghbXNnKQorI2VuZGlmCisgICAgICB7IHNwcmludGYoc29hcC0+bXNnYnVmLCAiVENQL1VEUCBJUCBlcnJvciAlZCIsIHNvYXAtPmVycm51bSk7CisgICAgICAgIG1zZyA9IHNvYXAtPm1zZ2J1ZjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIG1zZzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNvbnN0IGNoYXIqCitodHRwX2Vycm9yKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3RhdHVzKQoreyByZWdpc3RlciBjb25zdCBjaGFyICptc2cgPSBTT0FQX1NUUl9FT1M7CisjaWZuZGVmIFdJVEhfTEVBTgorICBtc2cgPSBzb2FwX3N0cl9jb2RlKGhfaHR0cF9lcnJvcl9jb2Rlcywgc3RhdHVzKTsKKyAgaWYgKCFtc2cpCisgICAgbXNnID0gU09BUF9TVFJfRU9TOworI2VuZGlmCisgIHJldHVybiBtc2c7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0lQVjYKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAordGNwX2dldGhvc3Qoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmFkZHIsIHN0cnVjdCBpbl9hZGRyICppbmFkZHIpCit7IHNvYXBfaW50MzIgaWFkZCA9IC0xOworICBzdHJ1Y3QgaG9zdGVudCBob3N0ZW50LCAqaG9zdCA9ICZob3N0ZW50OworI2lmZGVmIFZYV09SS1MKKyAgaW50IGhvc3RpbnQ7CisgIC8qIGluZXRfYWRkcigpLCBhbmQgaG9zdEdldEJ5TmFtZSgpIGV4cGVjdCAiY2hhciAqIjsgYWRkciBpcyBhICJjb25zdCBjaGFyICoiLiAqLworICBpYWRkID0gaW5ldF9hZGRyKChjaGFyKilhZGRyKTsKKyNlbHNlCisjaWYgZGVmaW5lZChfQUlYVkVSU0lPTl80MzEpIHx8IGRlZmluZWQoVFJVNjQpCisgIHN0cnVjdCBob3N0ZW50X2RhdGEgaHRfZGF0YTsKKyNlbmRpZgorI2lmZGVmIEFTNDAwCisgIGlhZGQgPSBpbmV0X2FkZHIoKHZvaWQqKWFkZHIpOworI2Vsc2UKKyAgaWFkZCA9IGluZXRfYWRkcihhZGRyKTsKKyNlbmRpZgorI2VuZGlmCisgIGlmIChpYWRkICE9IC0xKQorICB7IG1lbWNweShpbmFkZHIsICZpYWRkLCBzaXplb2YoaWFkZCkpOworICAgIHJldHVybiBTT0FQX09LOworICB9CisjaWYgZGVmaW5lZChfX0dMSUJDX18pCisgIGlmIChnZXRob3N0YnluYW1lX3IoYWRkciwgJmhvc3RlbnQsIHNvYXAtPmJ1ZiwgU09BUF9CVUZMRU4sICZob3N0LCAmc29hcC0+ZXJybnVtKSA8IDApCisgICAgaG9zdCA9IE5VTEw7CisjZWxpZiBkZWZpbmVkKF9BSVhWRVJTSU9OXzQzMSkgfHwgZGVmaW5lZChUUlU2NCkKKyAgbWVtc2V0KCh2b2lkKikmaHRfZGF0YSwgMCwgc2l6ZW9mKGh0X2RhdGEpKTsKKyAgaWYgKGdldGhvc3RieW5hbWVfcihhZGRyLCAmaG9zdGVudCwgJmh0X2RhdGEpIDwgMCkKKyAgeyBob3N0ID0gTlVMTDsKKyAgICBzb2FwLT5lcnJudW0gPSBoX2Vycm5vOworICB9CisjZWxpZiBkZWZpbmVkKEhBVkVfR0VUSE9TVEJZTkFNRV9SKQorICBob3N0ID0gZ2V0aG9zdGJ5bmFtZV9yKGFkZHIsICZob3N0ZW50LCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOLCAmc29hcC0+ZXJybnVtKTsKKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgLyogSWYgdGhlIEROUyByZXNvbHZlciBsaWJyYXJ5IHJlc29sdkxpYiBoYXMgYmVlbiBjb25maWd1cmVkIGluIHRoZSB2eFdvcmtzCisgICAqIGltYWdlLCBhIHF1ZXJ5IGZvciB0aGUgaG9zdCBJUCBhZGRyZXNzIGlzIHNlbnQgdG8gdGhlIEROUyBzZXJ2ZXIsIGlmIHRoZQorICAgKiBuYW1lIHdhcyBub3QgZm91bmQgaW4gdGhlIGxvY2FsIGhvc3QgdGFibGUuICovCisgIGhvc3RpbnQgPSBob3N0R2V0QnlOYW1lKChjaGFyKilhZGRyKTsKKyAgaWYgKGhvc3RpbnQgPT0gRVJST1IpCisgIHsgaG9zdCA9IE5VTEw7CisgICAgc29hcC0+ZXJybnVtID0gc29hcF9lcnJubzsgCisgIH0KKyNlbHNlCisjaWZkZWYgQVM0MDAKKyAgaWYgKCEoaG9zdCA9IGdldGhvc3RieW5hbWUoKHZvaWQqKWFkZHIpKSkKKyAgICBzb2FwLT5lcnJudW0gPSBoX2Vycm5vOworI2Vsc2UKKyAgaWYgKCEoaG9zdCA9IGdldGhvc3RieW5hbWUoYWRkcikpKQorICAgIHNvYXAtPmVycm51bSA9IGhfZXJybm87CisjZW5kaWYKKyNlbmRpZgorICBpZiAoIWhvc3QpCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJIb3N0IG5hbWUgbm90IGZvdW5kXG4iKSk7CisgICAgcmV0dXJuIFNPQVBfRVJSOworICB9CisjaWZkZWYgVlhXT1JLUworICBpbmFkZHItPnNfYWRkciA9IGhvc3RpbnQ7CisjZWxzZQorICBtZW1jcHkoaW5hZGRyLCBob3N0LT5oX2FkZHIsIGhvc3QtPmhfbGVuZ3RoKTsKKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAordGNwX2Nvbm5lY3Qoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjb25zdCBjaGFyICpob3N0LCBpbnQgcG9ydCkKK3sKKyNpZmRlZiBXSVRIX0lQVjYKKyAgc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqcmVzLCAqcmVzc2F2ZTsKKyAgaW50IGVycjsKKyNlbmRpZgorICByZWdpc3RlciBpbnQgZmQ7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpbnQgbGVuID0gU09BUF9CVUZMRU47CisgIGludCBzZXQgPSAxOworI2VuZGlmCisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0KTsKKyAgc29hcC0+c29ja2V0ID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgaWYgKHRjcF9pbml0KHNvYXApKQorICB7IHNvYXAtPmVycm51bSA9IDA7CisgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgIlRDUCBpbml0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIHNvYXAtPmVycm1vZGUgPSAwOworI2lmZGVmIFdJVEhfSVBWNgorICBtZW1zZXQoKHZvaWQqKSZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisgIGhpbnRzLmFpX2ZhbWlseSA9IFBGX1VOU1BFQzsKKyNpZmRlZiBXSVRIX1VEUAorICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19ER1JBTTsKKyAgZWxzZQorI2VuZGlmCisgICAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKyAgc29hcC0+ZXJybW9kZSA9IDI7CisgIGlmIChzb2FwLT5wcm94eV9ob3N0KQorICAgIGVyciA9IGdldGFkZHJpbmZvKHNvYXAtPnByb3h5X2hvc3QsIHNvYXBfaW50MnMoc29hcCwgc29hcC0+cHJveHlfcG9ydCksICZoaW50cywgJnJlcyk7CisgIGVsc2UKKyAgICBlcnIgPSBnZXRhZGRyaW5mbyhob3N0LCBzb2FwX2ludDJzKHNvYXAsIHBvcnQpLCAmaGludHMsICZyZXMpOworICBpZiAoZXJyKQorICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCBnYWlfc3RyZXJyb3IoZXJyKSwgImdldGFkZHJpbmZvIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIHJlc3NhdmUgPSByZXM7CithZ2FpbjoKKyAgZmQgPSAoaW50KXNvY2tldChyZXMtPmFpX2ZhbWlseSwgcmVzLT5haV9zb2NrdHlwZSwgcmVzLT5haV9wcm90b2NvbCk7CisgIHNvYXAtPmVycm1vZGUgPSAwOworI2Vsc2UKKyNpZmRlZiBXSVRIX1VEUAorICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIGZkID0gKGludClzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisgIGVsc2UKKyNlbmRpZgorICAgIGZkID0gKGludClzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOworI2VuZGlmCisgIGlmIChmZCA8IDApCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNvY2tldCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorI2lmZGVmIFNPQ0tFVF9DTE9TRV9PTl9FWEVDCisjaWZkZWYgV0lOMzIKKyNpZm5kZWYgVU5ERVJfQ0UKKyAgU2V0SGFuZGxlSW5mb3JtYXRpb24oKEhBTkRMRSlmZCwgSEFORExFX0ZMQUdfSU5IRVJJVCwgMCk7CisjZW5kaWYKKyNlbHNlCisgIGZjbnRsKGZkLCBGX1NFVEZELCAxKTsKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+Y29ubmVjdF9mbGFncyAmIFNPX0xJTkdFUikKKyAgeyBzdHJ1Y3QgbGluZ2VyIGxpbmdlcjsKKyAgICBtZW1zZXQoKHZvaWQqKSZsaW5nZXIsIDAsIHNpemVvZihsaW5nZXIpKTsKKyAgICBsaW5nZXIubF9vbm9mZiA9IDE7CisgICAgbGluZ2VyLmxfbGluZ2VyID0gMDsKKyAgICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpZmQsIFNPTF9TT0NLRVQsIFNPX0xJTkdFUiwgKGNoYXIqKSZsaW5nZXIsIHNpemVvZihzdHJ1Y3QgbGluZ2VyKSkpCisgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX0xJTkdFUiBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorICB9CisgIGlmICgoc29hcC0+Y29ubmVjdF9mbGFncyAmIH5TT19MSU5HRVIpICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKWZkLCBTT0xfU09DS0VULCBzb2FwLT5jb25uZWN0X2ZsYWdzICYgflNPX0xJTkdFUiwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBpZiAoc29hcC0+a2VlcF9hbGl2ZSAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClmZCwgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX0tFRVBBTElWRSBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpZmQsIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwgKGNoYXIqKSZsZW4sIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19TTkRCVUYgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKWZkLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsIChjaGFyKikmbGVuLCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fUkNWQlVGIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisjaWZkZWYgVENQX05PREVMQVkKKyAgaWYgKCEoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpZmQsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBUQ1BfTk9ERUxBWSBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorI2VuZGlmCisjZW5kaWYKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk9wZW5pbmcgc29ja2V0ICVkIHRvIGhvc3Q9JyVzJyBwb3J0PSVkXG4iLCBmZCwgaG9zdCwgcG9ydCkpOworI2lmbmRlZiBXSVRIX0lQVjYKKyAgc29hcC0+cGVlcmxlbiA9IHNpemVvZihzb2FwLT5wZWVyKTsKKyAgbWVtc2V0KCh2b2lkKikmc29hcC0+cGVlciwgMCwgc2l6ZW9mKHNvYXAtPnBlZXIpKTsKKyAgc29hcC0+cGVlci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgc29hcC0+ZXJybW9kZSA9IDI7CisgIGlmIChzb2FwLT5wcm94eV9ob3N0KQorICB7IGlmIChzb2FwLT5mcmVzb2x2ZShzb2FwLCBzb2FwLT5wcm94eV9ob3N0LCAmc29hcC0+cGVlci5zaW5fYWRkcikpCisgICAgeyBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiZ2V0IHByb3h5IGhvc3QgYnkgbmFtZSBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorICAgIHNvYXAtPnBlZXIuc2luX3BvcnQgPSBodG9ucygoc2hvcnQpc29hcC0+cHJveHlfcG9ydCk7CisgIH0KKyAgZWxzZQorICB7IGlmIChzb2FwLT5mcmVzb2x2ZShzb2FwLCBob3N0LCAmc29hcC0+cGVlci5zaW5fYWRkcikpCisgICAgeyBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiZ2V0IGhvc3QgYnkgbmFtZSBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorICAgIHNvYXAtPnBlZXIuc2luX3BvcnQgPSBodG9ucygoc2hvcnQpcG9ydCk7CisgIH0KKyAgc29hcC0+ZXJybW9kZSA9IDA7CisgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgcmV0dXJuIGZkOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0KQorI2lmIGRlZmluZWQoV0lOMzIpCisgIHsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sICZub25ibG9ja2luZyk7CisgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgeyB1X2xvbmcgbm9uYmxvY2tpbmcgPSAxOworICAgIGlvY3RsKChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgKGludCkoJm5vbmJsb2NraW5nKSk7IC8qIG1vZGlmaWVkIHRvIHVzZSBmZCAqLworICB9CisjZWxzZQorICAgIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX0dFVEZMKXxPX05PTkJMT0NLKTsKKyNlbmRpZgorICBlbHNlCisjaWYgZGVmaW5lZChXSU4zMikKKyAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgJmJsb2NraW5nKTsKKyAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgaW9jdGwoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAoaW50KSgmYmxvY2tpbmcpKTsKKyAgfQorI2Vsc2UKKyAgICBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9HRVRGTCkmfk9fTk9OQkxPQ0spOworI2VuZGlmCisjZW5kaWYKKyAgZm9yICg7OykKKyAgeyAKKyNpZmRlZiBXSVRIX0lQVjYKKyAgICBpZiAoY29ubmVjdCgoU09BUF9TT0NLRVQpZmQsIHJlcy0+YWlfYWRkciwgcmVzLT5haV9hZGRybGVuKSkKKyNlbHNlCisgICAgaWYgKGNvbm5lY3QoKFNPQVBfU09DS0VUKWZkLCAoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlciwgc2l6ZW9mKHNvYXAtPnBlZXIpKSkKKyNlbmRpZgorICAgIHsgCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgaWYgKHNvYXAtPmNvbm5lY3RfdGltZW91dCAmJiAoc29hcF9zb2NrZXRfZXJybm8gPT0gU09BUF9FSU5QUk9HUkVTUyB8fCBzb2FwX3NvY2tldF9lcnJubyA9PSBTT0FQX0VXT1VMREJMT0NLKSkKKyAgICAgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgICAgU09BUF9TT0NLTEVOX1QgazsKKyAgICAgICAgZmRfc2V0IGZkczsKKyAgICAgICAgaWYgKHNvYXAtPmNvbm5lY3RfdGltZW91dCA+IDApCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSBzb2FwLT5jb25uZWN0X3RpbWVvdXQ7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSAtc29hcC0+Y29ubmVjdF90aW1lb3V0LzEwMDAwMDA7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gLXNvYXAtPmNvbm5lY3RfdGltZW91dCUxMDAwMDAwOworICAgICAgICB9CisgICAgICAgIEZEX1pFUk8oJmZkcyk7CisgICAgICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpZmQsICZmZHMpOworICAgICAgICBmb3IgKDs7KQorICAgICAgICB7IGludCByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoZmQgKyAxKSwgTlVMTCwgJmZkcywgTlVMTCwgJnRpbWVvdXQpOworICAgICAgICAgIGlmIChyID4gMCkKKwkgICAgYnJlYWs7CisgICAgICAgICAgaWYgKCFyKQorICAgICAgICAgIHsgc29hcC0+ZXJybnVtID0gMDsKKyAgICAgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29ubmVjdCB0aW1lb3V0XG4iKSk7CisgICAgICAgICAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgIlRpbWVvdXQiLCAiY29ubmVjdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSKQorICAgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBjb25uZWN0IHRvIGhvc3RcbiIpKTsKKyAgICAgICAgICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJjb25uZWN0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKwlrID0gKFNPQVBfU09DS0xFTl9UKXNpemVvZihzb2FwLT5lcnJudW0pOworICAgICAgICBpZiAoIWdldHNvY2tvcHQoKFNPQVBfU09DS0VUKWZkLCBTT0xfU09DS0VULCBTT19FUlJPUiwgKGNoYXIqKSZzb2FwLT5lcnJudW0sICZrKSAmJiAhc29hcC0+ZXJybnVtKQkvKiBwb3J0YWJpbGl0eSBub3RlOiBzZWUgU09BUF9TT0NLTEVOX1QgZGVmaW5pdGlvbiBpbiBzdGRzb2FwMi5oICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IGNvbm5lY3QgdG8gaG9zdFxuIikpOworICAgICAgICBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImNvbm5lY3QgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyNlbmRpZgorI2lmZGVmIFdJVEhfSVBWNgorICAgICAgaWYgKHJlcy0+YWlfbmV4dCkKKyAgICAgIHsgcmVzID0gcmVzLT5haV9uZXh0OworICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgaWYgKHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIpCisgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBjb25uZWN0IHRvIGhvc3RcbiIpKTsKKyAgICAgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImNvbm5lY3QgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyAgICB9ICAKKyAgICBlbHNlCisgICAgICBicmVhazsKKyAgfQorI2lmZGVmIFdJVEhfSVBWNgorICBzb2FwLT5wZWVybGVuID0gMDsgLyogSVB2NjogYWxyZWFkeSBjb25uZWN0ZWQgc28gdXNlIHNlbmQoKSAqLworICBmcmVlYWRkcmluZm8ocmVzc2F2ZSk7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQpCisjaWYgZGVmaW5lZChXSU4zMikKKyAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgJmJsb2NraW5nKTsKKyAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgaW9jdGwoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAoaW50KSgmYmxvY2tpbmcpKTsKKyAgfQorI2Vsc2UKKyAgICBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9HRVRGTCkmfk9fTk9OQkxPQ0spOworI2VuZGlmCisjZW5kaWYKKyAgc29hcC0+c29ja2V0ID0gZmQ7CisgIHNvYXAtPmltb2RlICY9IH5TT0FQX0VOQ19TU0w7CisgIHNvYXAtPm9tb2RlICY9IH5TT0FQX0VOQ19TU0w7CisgIGlmICghc3RybmNtcChlbmRwb2ludCwgImh0dHBzOiIsIDYpKQorICB7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgICAgQklPICpiaW87CisgICAgaW50IHI7CisgICAgaWYgKHNvYXAtPnByb3h5X2hvc3QpCisgICAgeyBzaG9ydCB2OworICAgICAgdW5zaWduZWQgaW50IGsgPSBzb2FwLT5vbW9kZTsgLyogbWFrZSBzdXJlIHdlIG9ubHkgcGFyc2UgSFRUUCAqLworICAgICAgc2l6ZV90IG4gPSBzb2FwLT5jb3VudDsgLyogc2F2ZSB0aGUgY29udGVudCBsZW5ndGggKi8KKyAgICAgIGNoYXIgKnVzZXJpZCwgKnBhc3N3ZDsKKyAgICAgIHNvYXAtPm9tb2RlICY9IH5TT0FQX0VOQzsgLyogbWFzayBJTyBhbmQgRU5DICovCisgICAgICBzb2FwLT5vbW9kZSB8PSBTT0FQX0lPX0JVRkZFUjsKKyAgICAgIHNvYXBfYmVnaW5fc2VuZChzb2FwKTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29ubmVjdGluZyB0byBwcm94eSBzZXJ2ZXJcbiIpKTsKKyAgICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiQ09OTkVDVCAlczolZCBIVFRQLyVzIiwgaG9zdCwgcG9ydCwgc29hcC0+aHR0cF92ZXJzaW9uKTsKKyAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCBzb2FwLT50bXBidWYsIE5VTEwpKSkKKyAgICAgIHsgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIGlmIChzb2FwLT5wcm94eV91c2VyaWQgJiYgc29hcC0+cHJveHlfcGFzc3dkICYmIHN0cmxlbihzb2FwLT5wcm94eV91c2VyaWQpICsgc3RybGVuKHNvYXAtPnByb3h5X3Bhc3N3ZCkgPCA3NjEpCisgICAgICB7IHNwcmludGYoc29hcC0+dG1wYnVmICsgMjYyLCAiJXM6JXMiLCBzb2FwLT5wcm94eV91c2VyaWQsIHNvYXAtPnByb3h5X3Bhc3N3ZCk7CisgICAgICAgIHN0cmNweShzb2FwLT50bXBidWYsICJCYXNpYyAiKTsKKyAgICAgICAgc29hcF9zMmJhc2U2NChzb2FwLCAoY29uc3QgdW5zaWduZWQgY2hhciopKHNvYXAtPnRtcGJ1ZiArIDI2MiksIHNvYXAtPnRtcGJ1ZiArIDYsIHN0cmxlbihzb2FwLT50bXBidWYgKyAyNjIpKTsKKyAgICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJQcm94eS1BdXRob3JpemF0aW9uIiwgc29hcC0+dG1wYnVmKSkpCisgICAgICAgIHsgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKyAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCBOVUxMLCBOVUxMKSkKKyAgICAgICB8fCBzb2FwX2ZsdXNoKHNvYXApKQorICAgICAgeyBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgICBzb2FwLT5vbW9kZSA9IGs7CisgICAgICBrID0gc29hcC0+aW1vZGU7CisgICAgICBzb2FwLT5pbW9kZSAmPSB+U09BUF9FTkM7IC8qIG1hc2sgSU8gYW5kIEVOQyAqLworICAgICAgdiA9IHNvYXAtPnZlcnNpb247IC8qIHByZXNlcnZlICovCisgICAgICB1c2VyaWQgPSBzb2FwLT51c2VyaWQ7IC8qIHByZXNlcnZlICovCisgICAgICBwYXNzd2QgPSBzb2FwLT5wYXNzd2Q7IC8qIHByZXNlcnZlICovCisgICAgICBpZiAoc29hcF9iZWdpbl9yZWN2KHNvYXApKQorICAgICAgeyBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgICBzb2FwLT51c2VyaWQgPSB1c2VyaWQ7IC8qIHJlc3RvcmUgKi8KKyAgICAgIHNvYXAtPnBhc3N3ZCA9IHBhc3N3ZDsgLyogcmVzdG9yZSAqLworICAgICAgc29hcC0+dmVyc2lvbiA9IHY7IC8qIHJlc3RvcmUgKi8KKyAgICAgIHNvYXAtPmltb2RlID0gazsgLyogcmVzdG9yZSAqLworICAgICAgc29hcC0+Y291bnQgPSBuOyAvKiByZXN0b3JlICovCisgICAgICBzb2FwX2JlZ2luX3NlbmQoc29hcCk7CisgICAgfQorICAgIGlmICghc29hcC0+Y3R4ICYmIChzb2FwLT5lcnJvciA9IHNvYXAtPmZzc2xhdXRoKHNvYXApKSkKKyAgICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIlNTTCBhdXRoZW50aWNhdGlvbiBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKTogY2hlY2sgcGFzc3dvcmQsIGtleSBmaWxlLCBhbmQgY2EgZmlsZS4iLCBTT0FQX1NTTF9FUlJPUik7CisgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgIH0KKyAgICBzb2FwLT5zc2wgPSBTU0xfbmV3KHNvYXAtPmN0eCk7CisgICAgaWYgKCFzb2FwLT5zc2wpCisgICAgeyBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9TU0xfRVJST1I7CisgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisgICAgaWYgKHNvYXAtPnNlc3Npb24pCisgICAgeyBpZiAoIXN0cmNtcChzb2FwLT5zZXNzaW9uX2hvc3QsIGhvc3QpICYmIHNvYXAtPnNlc3Npb25fcG9ydCA9PSBwb3J0KQorICAgICAgICBTU0xfc2V0X3Nlc3Npb24oc29hcC0+c3NsLCBzb2FwLT5zZXNzaW9uKTsKKyAgICAgIFNTTF9TRVNTSU9OX2ZyZWUoc29hcC0+c2Vzc2lvbik7CisgICAgICBzb2FwLT5zZXNzaW9uID0gTlVMTDsKKyAgICB9CisgICAgc29hcC0+aW1vZGUgfD0gU09BUF9FTkNfU1NMOworICAgIHNvYXAtPm9tb2RlIHw9IFNPQVBfRU5DX1NTTDsKKyAgICBiaW8gPSBCSU9fbmV3X3NvY2tldCgoU09BUF9TT0NLRVQpZmQsIEJJT19OT0NMT1NFKTsKKyAgICBTU0xfc2V0X2Jpbyhzb2FwLT5zc2wsIGJpbywgYmlvKTsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKHNvYXAtPmNvbm5lY3RfdGltZW91dCkKKyNpZiBkZWZpbmVkKFdJTjMyKQorICAgIHsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgJm5vbmJsb2NraW5nKTsKKyAgICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgICAgeyB1X2xvbmcgbm9uYmxvY2tpbmcgPSAxOworICAgICAgaW9jdGwoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAoaW50KSgmbm9uYmxvY2tpbmcpKTsKKyAgICB9CisjZWxzZQorICAgICAgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfR0VURkwpfE9fTk9OQkxPQ0spOworI2VuZGlmCisjZW5kaWYKKyAgICBmb3IgKDs7KQorICAgIHsgaWYgKChyID0gU1NMX2Nvbm5lY3Qoc29hcC0+c3NsKSkgPD0gMCkKKyAgICAgIHsgaW50IGVyciA9IFNTTF9nZXRfZXJyb3Ioc29hcC0+c3NsLCByKTsKKyAgICAgICAgaWYgKGVyciAhPSBTU0xfRVJST1JfTk9ORSAmJiBlcnIgIT0gU1NMX0VSUk9SX1dBTlRfUkVBRCAmJiBlcnIgIT0gU1NMX0VSUk9SX1dBTlRfV1JJVEUpCisgICAgICAgIHsgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHNzbF9lcnJvcihzb2FwLCByKSwgIlNTTCBjb25uZWN0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9TU0xfRVJST1IpOworICAgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICB9CisgICAgICAgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQpCisgICAgICAgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgICAgICBmZF9zZXQgZmRzOworICAgICAgICAgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQgPiAwKQorICAgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSBzb2FwLT5jb25uZWN0X3RpbWVvdXQ7CisgICAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IC1zb2FwLT5jb25uZWN0X3RpbWVvdXQvMTAwMDAwMDsKKyAgICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IC1zb2FwLT5jb25uZWN0X3RpbWVvdXQlMTAwMDAwMDsKKyAgICAgICAgICB9CisgICAgICAgICAgRkRfWkVSTygmZmRzKTsKKyAgICAgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKWZkLCAmZmRzKTsKKyAgICAgICAgICBmb3IgKDs7KQorICAgICAgICAgIHsgaW50IHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShmZCArIDEpLCAmZmRzLCBOVUxMLCAmZmRzLCAmdGltZW91dCk7CisgICAgICAgICAgICBpZiAociA+IDApCisJICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoIXIpCisgICAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IDA7CisgICAgICAgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29ubmVjdCB0aW1lb3V0XG4iKSk7CisgICAgICAgICAgICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCAiVGltZW91dCIsICJjb25uZWN0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCSAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKHNvYXAtPmNvbm5lY3RfdGltZW91dCkKKyNpZmRlZiBXSU4zMgorICAgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgJmJsb2NraW5nKTsKKyAgICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgICAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgICAgaW9jdGwoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAoaW50KSgmYmxvY2tpbmcpKTsKKyAgICB9CisjZWxzZQorICAgICAgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfR0VURkwpJn5PX05PTkJMT0NLKTsKKyNlbmRpZgorI2VuZGlmCisgICAgaWYgKHNvYXAtPnJlcXVpcmVfc2VydmVyX2F1dGgpCisgICAgeyBYNTA5ICpwZWVyOworICAgICAgaW50IGVycjsKKyAgICAgIGlmICgoZXJyID0gU1NMX2dldF92ZXJpZnlfcmVzdWx0KHNvYXAtPnNzbCkpICE9IFg1MDlfVl9PSykKKyAgICAgIHsgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIFg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKGVyciksICJTU0wgY2VydGlmaWNhdGUgcHJlc2VudGVkIGJ5IHBlZXIgY2Fubm90IGJlIHZlcmlmaWVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyAgICAgIHBlZXIgPSBTU0xfZ2V0X3BlZXJfY2VydGlmaWNhdGUoc29hcC0+c3NsKTsKKyAgICAgIGlmICghcGVlcikKKyAgICAgIHsgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiTm8gU1NMIGNlcnRpZmljYXRlIHdhcyBwcmVzZW50ZWQgYnkgdGhlIHBlZXIgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgICAgWDUwOV9OQU1FX2dldF90ZXh0X2J5X05JRChYNTA5X2dldF9zdWJqZWN0X25hbWUocGVlciksIE5JRF9jb21tb25OYW1lLCBzb2FwLT5tc2didWYsIHNpemVvZihzb2FwLT5tc2didWYpKTsKKyAgICAgIFg1MDlfZnJlZShwZWVyKTsKKyAgICAgIGlmIChzb2FwX3RhZ19jbXAoc29hcC0+bXNnYnVmLCBob3N0KSkKKyAgICAgIHsgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiU1NMIGNlcnRpZmljYXRlIGhvc3QgbmFtZSBtaXNtYXRjaCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9TU0xfRVJST1IpOworICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfU1NMX0VSUk9SOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworI2VuZGlmCisgIH0KKyAgcmV0dXJuIGZkOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JpbmQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmhvc3QsIGludCBwb3J0LCBpbnQgYmFja2xvZykKK3sKKyNpZmRlZiBXSVRIX0lQVjYKKyAgc3RydWN0IGFkZHJpbmZvICphZGRyaW5mbyA9IE5VTEw7CisgIHN0cnVjdCBhZGRyaW5mbyBoaW50czsKKyAgc3RydWN0IGFkZHJpbmZvIHJlczsKKyAgaW50IGVycjsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaW50IGxlbiA9IFNPQVBfQlVGTEVOOworICBpbnQgc2V0ID0gMTsKKyNlbmRpZgorICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSkKKyAgeyBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKXNvYXAtPm1hc3Rlcik7CisgICAgc29hcC0+bWFzdGVyID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBzb2FwLT5zb2NrZXQgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICBzb2FwLT5lcnJtb2RlID0gMTsKKyAgaWYgKHRjcF9pbml0KHNvYXApKQorICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgIlRDUCBpbml0IGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorI2lmZGVmIFdJVEhfSVBWNgorICBtZW1zZXQoKHZvaWQqKSZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisgIGhpbnRzLmFpX2ZhbWlseSA9IFBGX1VOU1BFQzsKKyNpZmRlZiBXSVRIX1VEUAorICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19ER1JBTTsKKyAgZWxzZQorI2VuZGlmCisgICAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKyAgaGludHMuYWlfZmxhZ3MgPSBBSV9QQVNTSVZFOworICBzb2FwLT5lcnJtb2RlID0gMjsKKyAgZXJyID0gZ2V0YWRkcmluZm8oaG9zdCwgc29hcF9pbnQycyhzb2FwLCBwb3J0KSwgJmhpbnRzLCAmYWRkcmluZm8pOworICBpZiAoYWRkcmluZm8pCisgIHsgcmVzID0gKmFkZHJpbmZvOworICAgIHNvYXAtPnBlZXIgPSAqKChzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSopYWRkcmluZm8tPmFpX2FkZHIpOworICAgIHNvYXAtPnBlZXJsZW4gPSBhZGRyaW5mby0+YWlfYWRkcmxlbjsKKyAgICByZXMuYWlfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyOworICAgIHJlcy5haV9hZGRybGVuID0gc29hcC0+cGVlcmxlbjsKKyAgICBmcmVlYWRkcmluZm8oYWRkcmluZm8pOworICB9CisgIGlmIChlcnIpCisgIHsgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgZ2FpX3N0cmVycm9yKGVyciksICJnZXRhZGRyaW5mbyBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgc29hcC0+bWFzdGVyID0gc29ja2V0KHJlcy5haV9mYW1pbHksIHJlcy5haV9zb2NrdHlwZSwgcmVzLmFpX3Byb3RvY29sKTsKKyNlbHNlCisjaWZkZWYgV0lUSF9VRFAKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICBzb2FwLT5tYXN0ZXIgPSAoaW50KXNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKyAgZWxzZQorI2VuZGlmCisgICAgc29hcC0+bWFzdGVyID0gKGludClzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOworI2VuZGlmCisgIHNvYXAtPmVycm1vZGUgPSAwOworICBpZiAoIXNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic29ja2V0IGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorI2lmZGVmIFdJVEhfVURQCisgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgc29hcC0+c29ja2V0ID0gc29hcC0+bWFzdGVyOworI2VuZGlmCisjaWZkZWYgU09DS0VUX0NMT1NFX09OX0VYRUMKKyNpZmRlZiBXSU4zMgorI2lmbmRlZiBVTkRFUl9DRQorICBTZXRIYW5kbGVJbmZvcm1hdGlvbigoSEFORExFKXNvYXAtPm1hc3RlciwgSEFORExFX0ZMQUdfSU5IRVJJVCwgMCk7CisjZW5kaWYKKyNlbHNlCisgIGZjbnRsKHNvYXAtPm1hc3RlciwgRl9TRVRGRCwgMSk7CisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPmJpbmRfZmxhZ3MgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBTT0xfU09DS0VULCBzb2FwLT5iaW5kX2ZsYWdzLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIGlmICgoKHNvYXAtPmltb2RlIHwgc29hcC0+b21vZGUpICYgU09BUF9JT19LRUVQQUxJVkUpICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fS0VFUEFMSVZFIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBTT0xfU09DS0VULCBTT19TTkRCVUYsIChjaGFyKikmbGVuLCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19TTkRCVUYgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIGlmIChzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgKGNoYXIqKSZsZW4sIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX1JDVkJVRiBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNpZmRlZiBUQ1BfTk9ERUxBWQorICBpZiAoIShzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFRDUF9OT0RFTEFZIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBXSVRIX0lQVjYKKyAgc29hcC0+ZXJybW9kZSA9IDA7CisgIGlmIChiaW5kKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIHJlcy5haV9hZGRyLCByZXMuYWlfYWRkcmxlbikpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgYmluZCB0byBob3N0XG4iKSk7CisgICAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiYmluZCBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0gIAorI2Vsc2UKKyAgc29hcC0+cGVlcmxlbiA9IHNpemVvZihzb2FwLT5wZWVyKTsKKyAgbWVtc2V0KCh2b2lkKikmc29hcC0+cGVlciwgMCwgc2l6ZW9mKHNvYXAtPnBlZXIpKTsKKyAgc29hcC0+cGVlci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgc29hcC0+ZXJybW9kZSA9IDI7CisgIGlmIChob3N0KQorICB7IGlmIChzb2FwLT5mcmVzb2x2ZShzb2FwLCBob3N0LCAmc29hcC0+cGVlci5zaW5fYWRkcikpCisgICAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJnZXQgaG9zdCBieSBuYW1lIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgIH0KKyAgfQorICBlbHNlCisgICAgc29hcC0+cGVlci5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfQU5ZKTsKKyAgc29hcC0+cGVlci5zaW5fcG9ydCA9IGh0b25zKChzaG9ydClwb3J0KTsKKyAgc29hcC0+ZXJybW9kZSA9IDA7CisgIGlmIChiaW5kKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyLCBzb2FwLT5wZWVybGVuKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBiaW5kIHRvIGhvc3RcbiIpKTsKKyAgICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJiaW5kIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorI2VuZGlmCisgIGlmICghKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApICYmIGxpc3RlbigoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBiYWNrbG9nKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBiaW5kIHRvIGhvc3RcbiIpKTsKKyAgICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJsaXN0ZW4gZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9ICAKKyAgcmV0dXJuIHNvYXAtPm1hc3RlcjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wb2xsKHN0cnVjdCBzb2FwICpzb2FwKQoreyAKKyNpZm5kZWYgV0lUSF9MRUFOCisgIHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgIGZkX3NldCByZmQsIHNmZCwgeGZkOworICBpbnQgcjsKKyAgdGltZW91dC50dl9zZWMgPSAwOworICB0aW1lb3V0LnR2X3VzZWMgPSAwOworICBGRF9aRVJPKCZyZmQpOworICBGRF9aRVJPKCZzZmQpOworICBGRF9aRVJPKCZ4ZmQpOworICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgeyBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnJmZCk7CisgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZzZmQpOworICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmeGZkKTsKKyAgICByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksICZyZmQsICZzZmQsICZ4ZmQsICZ0aW1lb3V0KTsKKyAgICBpZiAociA+IDAgJiYgRkRfSVNTRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnhmZCkpCisgICAgICByID0gLTE7CisgIH0KKyAgZWxzZSBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSkKKyAgeyBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgJnNmZCk7CisgICAgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPm1hc3RlciArIDEpLCBOVUxMLCAmc2ZkLCBOVUxMLCAmdGltZW91dCk7CisgIH0KKyAgZWxzZQorICAgIHJldHVybiBTT0FQX09LOworICBpZiAociA+IDApCisgIHsKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICBpZiAoc29hcC0+aW1vZGUgJiBTT0FQX0VOQ19TU0wpCisgICAgeworICAgICAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkKKyAgICAgICAmJiBGRF9JU1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmc2ZkKQorICAgICAgICYmICghRkRfSVNTRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnJmZCkKKyAgICAgICAgfHwgU1NMX3BlZWsoc29hcC0+c3NsLCBzb2FwLT50bXBidWYsIDEpID4gMCkpCisgICAgICAgIHJldHVybiBTT0FQX09LOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICAgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpCisgICAgICAgJiYgRkRfSVNTRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnNmZCkKKyAgICAgICAmJiAoIUZEX0lTU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZyZmQpCisgICAgICAgIHx8IHJlY3YoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgc29hcC0+dG1wYnVmLCAxLCBNU0dfUEVFSykgPiAwKSkKKyAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgZWxzZSBpZiAociA8IDApCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgaWYgKChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpIHx8IHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIpCisgICAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZWxlY3QgZmFpbGVkIGluIHNvYXBfcG9sbCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9UQ1BfRVJST1I7CisgICAgfQorICB9CisgIGVsc2UKKyAgICBzb2FwLT5lcnJudW0gPSAwOworICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiUG9sbGluZzogb3RoZXIgZW5kIGRvd24gb24gc29ja2V0PSVkIHNlbGVjdD0lZFxuIiwgc29hcC0+c29ja2V0LCByKSk7CisgIHJldHVybiBTT0FQX0VPRjsKKyNlbHNlCisgIHJldHVybiBTT0FQX09LOworI2VuZGlmCit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Cit0Y3BfYWNjZXB0KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgcywgc3RydWN0IHNvY2thZGRyICphLCBpbnQgKm4pCit7IGludCBmZDsKKyAgZmQgPSAoaW50KWFjY2VwdCgoU09BUF9TT0NLRVQpcywgYSwgKFNPQVBfU09DS0xFTl9UKiluKTsJLyogcG9ydGFiaWxpdHkgbm90ZTogc2VlIFNPQVBfU09DS0xFTl9UIGRlZmluaXRpb24gaW4gc3Rkc29hcDIuaCAqLworI2lmZGVmIFNPQ0tFVF9DTE9TRV9PTl9FWEVDCisjaWZkZWYgV0lOMzIKKyNpZm5kZWYgVU5ERVJfQ0UKKyAgU2V0SGFuZGxlSW5mb3JtYXRpb24oKEhBTkRMRSlmZCwgSEFORExFX0ZMQUdfSU5IRVJJVCwgMCk7CisjZW5kaWYKKyNlbHNlCisgIGZjbnRsKGZkLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKKyNlbmRpZgorI2VuZGlmCisgIHJldHVybiBmZDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9hY2NlcHQoc3RydWN0IHNvYXAgKnNvYXApCit7IGludCBuID0gKGludClzaXplb2Yoc29hcC0+cGVlcik7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpbnQgbGVuID0gU09BUF9CVUZMRU47CisgIGludCBzZXQgPSAxOworI2VuZGlmCisgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyNpZmRlZiBXSVRIX1VEUAorICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIHJldHVybiBzb2FwLT5zb2NrZXQgPSBzb2FwLT5tYXN0ZXI7CisjZW5kaWYKKyAgbWVtc2V0KCh2b2lkKikmc29hcC0+cGVlciwgMCwgc2l6ZW9mKHNvYXAtPnBlZXIpKTsKKyAgc29hcC0+c29ja2V0ID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgc29hcC0+ZXJybW9kZSA9IDA7CisgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOworICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSkKKyAgeyBmb3IgKDs7KQorICAgIHsgCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgaWYgKHNvYXAtPmFjY2VwdF90aW1lb3V0KQorICAgICAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgICAgICBmZF9zZXQgZmQ7CisgICAgICAgIGlmIChzb2FwLT5hY2NlcHRfdGltZW91dCA+IDApCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSBzb2FwLT5hY2NlcHRfdGltZW91dDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IC1zb2FwLT5hY2NlcHRfdGltZW91dC8xMDAwMDAwOworICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IC1zb2FwLT5hY2NlcHRfdGltZW91dCUxMDAwMDAwOworICAgICAgICB9CisgICAgICAgIEZEX1pFUk8oJmZkKTsKKyAgICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsICZmZCk7CisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsgaW50IHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5tYXN0ZXIgKyAxKSwgJmZkLCAmZmQsIE5VTEwsICZ0aW1lb3V0KTsKKyAgICAgICAgICBpZiAociA+IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBpZiAoIXIpCisgICAgICAgICAgeyBzb2FwLT5lcnJudW0gPSAwOworICAgICAgICAgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlRpbWVvdXQiLCAiYWNjZXB0IGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSKQorICAgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJhY2NlcHQgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyNpZiBkZWZpbmVkKFdJTjMyKQorCXsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICAgICAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGSU9OQklPLCAmbm9uYmxvY2tpbmcpOworICAgICAgICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgICAgICAgIHsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICAgICAgICBpb2N0bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGSU9OQklPLCAoaW50KSgmbm9uYmxvY2tpbmcpKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRl9HRVRGTCl8T19OT05CTE9DSyk7CisjZW5kaWYKKyAgICAgIH0KKyAgICAgIGVsc2UKKyNpZiBkZWZpbmVkKFdJTjMyKQorICAgICAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgICAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGSU9OQklPLCAmYmxvY2tpbmcpOworICAgICAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICAgICAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgICAgICBpb2N0bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGSU9OQklPLCAoaW50KSgmYmxvY2tpbmcpKTsKKyAgICAgIH0KKyNlbHNlCisgICAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfR0VURkwpJn5PX05PTkJMT0NLKTsKKyNlbmRpZgorI2VuZGlmCisgICAgICBzb2FwLT5zb2NrZXQgPSBzb2FwLT5mYWNjZXB0KHNvYXAsIHNvYXAtPm1hc3RlciwgKHN0cnVjdCBzb2NrYWRkciopJnNvYXAtPnBlZXIsICZuKTsKKyAgICAgIHNvYXAtPnBlZXJsZW4gPSAoc2l6ZV90KW47CisgICAgICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgICAgIHsKKyNpZmRlZiBXSVRIX0lQVjYKKy8qIFVzZSBzb2FwLT5ob3N0IHRvIHN0b3JlIHRoZSBudW1lcmljIGZvcm0gb2YgdGhlIHJlbW90ZSBob3N0ICovCisgICAgICAgIGdldG5hbWVpbmZvKChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyLCBuLCBzb2FwLT5ob3N0LCBzaXplb2Yoc29hcC0+aG9zdCksIE5VTEwsIDAsIE5JX05VTUVSSUNIT1NUIHwgTklfTlVNRVJJQ1NFUlYpOyAKKyAgICAgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFjY2VwdCBzb2NrZXQgJWQgZnJvbSAlc1xuIiwgc29hcC0+c29ja2V0LCBzb2FwLT5ob3N0KSk7CisgICAgICAgIHNvYXAtPmlwID0gMDsgLyogaW5mbyBzdG9yZWQgaW4gc29hcC0+cGVlciBhbmQgc29hcC0+aG9zdCAqLworICAgICAgICBzb2FwLT5wb3J0ID0gMDsgLyogaW5mbyBzdG9yZWQgaW4gc29hcC0+cGVlciBhbmQgc29hcC0+aG9zdCAqLworI2Vsc2UKKyAgICAgICAgc29hcC0+aXAgPSBudG9obChzb2FwLT5wZWVyLnNpbl9hZGRyLnNfYWRkcik7CisgICAgICAgIHNvYXAtPnBvcnQgPSAoaW50KW50b2hzKHNvYXAtPnBlZXIuc2luX3BvcnQpOyAvKiBkb2VzIG5vdCByZXR1cm4gcG9ydCBudW1iZXIgb24gc29tZSBzeXN0ZW1zICovCisgICAgICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJBY2NlcHQgc29ja2V0ICVkIGF0IHBvcnQgJWQgZnJvbSBJUCAlZC4lZC4lZC4lZFxuIiwgc29hcC0+c29ja2V0LCBzb2FwLT5wb3J0LCAoaW50KShzb2FwLT5pcD4+MjQpJjB4RkYsIChpbnQpKHNvYXAtPmlwPj4xNikmMHhGRiwgKGludCkoc29hcC0+aXA+PjgpJjB4RkYsIChpbnQpc29hcC0+aXAmMHhGRikpOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorCWlmIChzb2FwLT5hY2NlcHRfZmxhZ3MgJiBTT19MSU5HRVIpCisgICAgICAgIHsgc3RydWN0IGxpbmdlciBsaW5nZXI7CisgICAgICAgICAgbWVtc2V0KCh2b2lkKikmbGluZ2VyLCAwLCBzaXplb2YobGluZ2VyKSk7CisgICAgICAgICAgbGluZ2VyLmxfb25vZmYgPSAxOworICAgICAgICAgIGxpbmdlci5sX2xpbmdlciA9IDA7CisJICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBTT0xfU09DS0VULCBTT19MSU5HRVIsIChjaGFyKikmbGluZ2VyLCBzaXplb2Yoc3RydWN0IGxpbmdlcikpKQorICAgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisJICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fTElOR0VSIGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworCSAgICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworCSAgfQorICAgICAgICB9CisgICAgICAgIGlmICgoc29hcC0+YWNjZXB0X2ZsYWdzICYgflNPX0xJTkdFUikgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBTT0xfU09DS0VULCBzb2FwLT5hY2NlcHRfZmxhZ3MgJiB+U09fTElOR0VSLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisJICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKChzb2FwLT5pbW9kZSB8IHNvYXAtPm9tb2RlKSAmIFNPQVBfSU9fS0VFUEFMSVZFKSAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX0tFRVBBTElWRSBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKwkgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICB9CisgICAgICAgIGlmIChzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwgKGNoYXIqKSZsZW4sIHNpemVvZihpbnQpKSkKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX1NOREJVRiBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKwkgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICB9CisgICAgICAgIGlmIChzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgKGNoYXIqKSZsZW4sIHNpemVvZihpbnQpKSkKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX1JDVkJVRiBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKwkgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICB9CisjaWZkZWYgVENQX05PREVMQVkKKyAgICAgICAgaWYgKCEoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBUQ1BfTk9ERUxBWSBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKwkgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICB9CisjZW5kaWYKKyNlbmRpZgorICAgICAgICBpZiAoc29hcC0+YWNjZXB0X3RpbWVvdXQpCisgICAgICAgIHsKKyNpZiBkZWZpbmVkKFdJTjMyKQorICAgICAgICAgIHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgICAgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRklPTkJJTywgJmJsb2NraW5nKTsKKyAgICAgICAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGSU9OQklPLCAmYmxvY2tpbmcpOworI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICAgICAgICAgIHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgICAgICAgaW9jdGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRklPTkJJTywgKGludCkoJmJsb2NraW5nKSk7CisgICAgICAgICAgaW9jdGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRklPTkJJTywgKGludCkoJmJsb2NraW5nKSk7CisjZWxpZiBkZWZpbmVkKFBBTE0pCisgICAgICAgICAgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRl9HRVRGTCwwKSZ+T19OT05CTE9DSyk7CisgICAgICAgICAgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRl9HRVRGTCwwKSZ+T19OT05CTE9DSyk7CisjZWxpZiBkZWZpbmVkKFNZTUJJQU4pCisgICAgICAgICAgbG9uZyBibG9ja2luZyA9IDA7CisgICAgICAgICAgaW9jdGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgMC8qRklPTkJJTyovLCAmYmxvY2tpbmcpOworI2Vsc2UKKyAgICAgICAgICBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGX0dFVEZMKSZ+T19OT05CTE9DSyk7CisgICAgICAgICAgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRl9HRVRGTCkmfk9fTk9OQkxPQ0spOworI2VuZGlmCisJfQorICAgICAgICBzb2FwLT5rZWVwX2FsaXZlID0gKCgoc29hcC0+aW1vZGUgfCBzb2FwLT5vbW9kZSkgJiBTT0FQX0lPX0tFRVBBTElWRSkgIT0gMCk7CisgICAgICAgIHJldHVybiBzb2FwLT5zb2NrZXQ7CisgICAgICB9CisgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUiAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VBR0FJTikKKyAgICAgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFjY2VwdCBmYWlsZWQgZnJvbSAlc1xuIiwgc29hcC0+aG9zdCkpOworICAgICAgICBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiYWNjZXB0IGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworCXNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZQorICB7IHNvYXAtPmVycm51bSA9IDA7CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAibm8gbWFzdGVyIHNvY2tldCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Cit0Y3BfZGlzY29ubmVjdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgaWYgKHNvYXAtPnNzbCkKKyAgeyBpbnQgciwgcyA9IDA7CisgICAgaWYgKHNvYXAtPnNlc3Npb24pCisgICAgICBTU0xfU0VTU0lPTl9mcmVlKHNvYXAtPnNlc3Npb24pOworICAgIGlmICgqc29hcC0+aG9zdCkKKyAgICB7IHNvYXAtPnNlc3Npb24gPSBTU0xfZ2V0MV9zZXNzaW9uKHNvYXAtPnNzbCk7CisgICAgICBpZiAoc29hcC0+c2Vzc2lvbikKKyAgICAgIHsgc3RyY3B5KHNvYXAtPnNlc3Npb25faG9zdCwgc29hcC0+aG9zdCk7CisgICAgICAgIHNvYXAtPnNlc3Npb25fcG9ydCA9IHNvYXAtPnBvcnQ7CisgICAgICB9CisgICAgfQorICAgIHIgPSBTU0xfc2h1dGRvd24oc29hcC0+c3NsKTsKKyAgICBpZiAociAhPSAxKQorICAgIHsgcyA9IEVSUl9nZXRfZXJyb3IoKTsKKyAgICAgIGlmIChzKQorICAgICAgeyBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgICAgICAgeyBzb2FwLT5mc2h1dGRvd25zb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgMSk7CisgICAgICAgICAgc29hcC0+c29ja2V0ID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgfQorICAgICAgICByID0gU1NMX3NodXRkb3duKHNvYXAtPnNzbCk7CisgICAgICB9CisgICAgfQorICAgIERCR0xPRyhURVNULCBpZiAocykgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNodXRkb3duIGZhaWxlZDogJWRcbiIsIFNTTF9nZXRfZXJyb3Ioc29hcC0+c3NsLCByKSkpOworICAgIFNTTF9mcmVlKHNvYXAtPnNzbCk7CisgICAgc29hcC0+c3NsID0gTlVMTDsKKyAgICBpZiAocykKKyAgICAgIHJldHVybiBTT0FQX1NTTF9FUlJPUjsKKyAgICBFUlJfcmVtb3ZlX3N0YXRlKDApOworICB9CisjZW5kaWYKKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkgJiYgIShzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgeyBzb2FwLT5mc2h1dGRvd25zb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgMik7CisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQpOworICAgIHNvYXAtPnNvY2tldCA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Cit0Y3BfY2xvc2Vzb2NrZXQoc3RydWN0IHNvYXAgKnNvYXAsIFNPQVBfU09DS0VUIGZkKQoreyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNsb3NlIHNvY2tldCAlZFxuIiwgKGludClmZCkpOworICByZXR1cm4gY2xvc2Vzb2NrZXQoZmQpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAordGNwX3NodXRkb3duc29ja2V0KHN0cnVjdCBzb2FwICpzb2FwLCBTT0FQX1NPQ0tFVCBmZCwgaW50IGhvdykKK3sgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTaHV0ZG93biBzb2NrZXQgJWQgaG93PSVkXG4iLCAoaW50KWZkLCBob3cpKTsKKyAgcmV0dXJuIHNodXRkb3duKGZkLCBob3cpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfY2xvc2Vzb2NrKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgc3RhdHVzID0gc29hcC0+ZXJyb3I7CisgIGlmIChzdGF0dXMgPT0gU09BUF9FT0YgfHwgc3RhdHVzID09IFNPQVBfVENQX0VSUk9SIHx8IHN0YXR1cyA9PSBTT0FQX1NTTF9FUlJPUiB8fCAhc29hcC0+a2VlcF9hbGl2ZSkKKyAgeyBpZiAoc29hcC0+ZmNsb3NlICYmIChzb2FwLT5lcnJvciA9IHNvYXAtPmZjbG9zZShzb2FwKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7CisgIH0KKyNpZmRlZiBXSVRIX1pMSUIKKyAgaWYgKHNvYXAtPnpsaWJfc3RhdGUgPT0gU09BUF9aTElCX0RFRkxBVEUpCisgICAgZGVmbGF0ZUVuZCgmc29hcC0+ZF9zdHJlYW0pOworICBlbHNlIGlmIChzb2FwLT56bGliX3N0YXRlID09IFNPQVBfWkxJQl9JTkZMQVRFKQorICAgIGluZmxhdGVFbmQoJnNvYXAtPmRfc3RyZWFtKTsKKyAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9OT05FOworI2VuZGlmCisgIHJldHVybiBzb2FwLT5lcnJvciA9IHN0YXR1czsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitzaXplX3QKK1NPQVBfRk1BQzIKK3NvYXBfaGFzaChyZWdpc3RlciBjb25zdCBjaGFyICpzKQoreyByZWdpc3RlciBzaXplX3QgaCA9IDA7CisgIHdoaWxlICgqcykKKyAgICBoID0gNjU1OTkqaCArICpzKys7CisgIHJldHVybiBoICUgU09BUF9JREhBU0g7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZAorc29hcF9pbml0X3BodChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5pdGlhbGl6aW5nIHBvaW50ZXIgaGFzaHRhYmxlXG4iKSk7CisgIHNvYXAtPnBibGsgPSBOVUxMOworICBzb2FwLT5waWR4ID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IChpbnQpU09BUF9QVFJIQVNIOyBpKyspCisgICAgc29hcC0+cGh0W2ldID0gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc3RydWN0IHNvYXAqCitTT0FQX0ZNQUMyCitzb2FwX25ldzEoc29hcF9tb2RlIG1vZGUpCit7IHJldHVybiBzb2FwX25ldzIobW9kZSwgbW9kZSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcCoKK1NPQVBfRk1BQzIKK3NvYXBfbmV3KCkKK3sgcmV0dXJuIHNvYXBfbmV3MihTT0FQX0lPX0RFRkFVTFQsIFNPQVBfSU9fREVGQVVMVCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcCoKK1NPQVBfRk1BQzIKK3NvYXBfbmV3Mihzb2FwX21vZGUgaW1vZGUsIHNvYXBfbW9kZSBvbW9kZSkKK3sgc3RydWN0IHNvYXAgKnNvYXAgPSAoc3RydWN0IHNvYXAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHNvYXApKTsKKyAgaWYgKHNvYXApCisgICAgc29hcF9pbml0Mihzb2FwLCBpbW9kZSwgb21vZGUpOworICByZXR1cm4gc29hcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZGVsKHN0cnVjdCBzb2FwICpzb2FwKQoreyBmcmVlKHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyB2b2lkCitzb2FwX2ZyZWVfcGh0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wYmxrICpwYiwgKm5leHQ7CisgIHJlZ2lzdGVyIGludCBpOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWUgcG9pbnRlciBoYXNodGFibGVcbiIpKTsKKyAgZm9yIChwYiA9IHNvYXAtPnBibGs7IHBiOyBwYiA9IG5leHQpCisgIHsgbmV4dCA9IHBiLT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBwYik7CisgIH0KKyAgc29hcC0+cGJsayA9IE5VTEw7CisgIHNvYXAtPnBpZHggPSAwOworICBmb3IgKGkgPSAwOyBpIDwgKGludClTT0FQX1BUUkhBU0g7IGkrKykKKyAgICBzb2FwLT5waHRbaV0gPSBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VtYmVkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGNvbnN0IGNoYXIgKnRhZywgaW50IHR5cGUpCit7IHJlZ2lzdGVyIGludCBpOworICBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgIGlmIChzb2FwLT52ZXJzaW9uICE9IDEpCisgICAgc29hcC0+ZW5jb2RpbmcgPSAxOworICBpZiAoYSkKKyAgICBpID0gc29hcF9hcnJheV9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCBhLCBuLCB0eXBlLCAmcHApOworICBlbHNlCisgICAgaSA9IHNvYXBfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgdHlwZSwgJnBwKTsKKyAgaWYgKGkpCisgIHsgaWYgKHNvYXBfaXNfZW1iZWRkZWQoc29hcCwgcHApCisgICAgIHx8IHNvYXBfaXNfc2luZ2xlKHNvYXAsIHBwKSkKKyAgICAgIHJldHVybiAwOworICAgIHNvYXBfc2V0X2VtYmVkZGVkKHNvYXAsIHBwKTsKKyAgfQorICByZXR1cm4gaTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wb2ludGVyX2xvb2t1cChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCwgaW50IHR5cGUsIHN0cnVjdCBzb2FwX3BsaXN0ICoqcHBwKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgICpwcHAgPSBOVUxMOworICBpZiAocCkKKyAgeyBmb3IgKHBwID0gc29hcC0+cGh0W3NvYXBfaGFzaF9wdHIocCldOyBwcDsgcHAgPSBwcC0+bmV4dCkKKyAgICB7IGlmIChwcC0+cHRyID09IHAgJiYgcHAtPnR5cGUgPT0gdHlwZSkKKyAgICAgIHsgKnBwcCA9IHBwOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkxvb2t1cCBsb2NhdGlvbj0lcCB0eXBlPSVkIGlkPSVkXG4iLCBwLCB0eXBlLCBwcC0+aWQpKTsKKyAgICAgICAgcmV0dXJuIHBwLT5pZDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJMb29rdXAgbG9jYXRpb249JXAgdHlwZT0lZDogbm90IGZvdW5kXG4iLCBwLCB0eXBlKSk7CisgIHJldHVybiAwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3BvaW50ZXJfZW50ZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgbiwgaW50IHR5cGUsIHN0cnVjdCBzb2FwX3BsaXN0ICoqcHBwKQoreyByZWdpc3RlciBpbnQgaDsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICBpZiAoIXNvYXAtPnBibGsgfHwgc29hcC0+cGlkeCA+PSBTT0FQX1BUUkJMSykKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wYmxrICpwYiA9IChzdHJ1Y3Qgc29hcF9wYmxrKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfcGJsaykpOworICAgIGlmICghcGIpCisgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHBiLT5uZXh0ID0gc29hcC0+cGJsazsKKyAgICBzb2FwLT5wYmxrID0gcGI7CisgICAgc29hcC0+cGlkeCA9IDA7CisgIH0KKyAgKnBwcCA9IHBwID0gJnNvYXAtPnBibGstPnBsaXN0W3NvYXAtPnBpZHgrK107CisgIGlmIChhKQorICAgIGggPSBzb2FwX2hhc2hfcHRyKGEtPl9fcHRyKTsKKyAgZWxzZQorICAgIGggPSBzb2FwX2hhc2hfcHRyKHApOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlBvaW50ZXIgZW50ZXIgbG9jYXRpb249JXAgYXJyYXk9JXAgc2l6ZT0lZCBkaW09JWQgdHlwZT0lZCBpZD0lZFxuIiwgcCwgYT9hLT5fX3B0cjpOVUxMLCBhP2EtPl9fc2l6ZTowLCBuLCB0eXBlLCBzb2FwLT5pZG51bSsxKSk7CisgIHBwLT5uZXh0ID0gc29hcC0+cGh0W2hdOworICBwcC0+dHlwZSA9IHR5cGU7CisgIHBwLT5tYXJrMSA9IDA7CisgIHBwLT5tYXJrMiA9IDA7CisgIHBwLT5wdHIgPSBwOworICBwcC0+YXJyYXkgPSBhOworICBzb2FwLT5waHRbaF0gPSBwcDsKKyAgcHAtPmlkID0gKytzb2FwLT5pZG51bTsKKyAgcmV0dXJuIHBwLT5pZDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9hcnJheV9wb2ludGVyX2xvb2t1cChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCwgY29uc3Qgc3RydWN0IHNvYXBfYXJyYXkgKmEsIGludCBuLCBpbnQgdHlwZSwgc3RydWN0IHNvYXBfcGxpc3QgKipwcHApCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgKnBwcCA9IE5VTEw7CisgIGlmICghcCB8fCAhYS0+X19wdHIpCisgICAgcmV0dXJuIDA7CisgIGZvciAocHAgPSBzb2FwLT5waHRbc29hcF9oYXNoX3B0cihhLT5fX3B0cildOyBwcDsgcHAgPSBwcC0+bmV4dCkKKyAgeyBpZiAocHAtPnR5cGUgPT0gdHlwZSAmJiBwcC0+YXJyYXkgJiYgcHAtPmFycmF5LT5fX3B0ciA9PSBhLT5fX3B0cikKKyAgICB7IHJlZ2lzdGVyIGludCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgaWYgKCgoY29uc3QgaW50KikmcHAtPmFycmF5LT5fX3NpemUpW2ldICE9ICgoY29uc3QgaW50KikmYS0+X19zaXplKVtpXSkKKwkgIGJyZWFrOworICAgICAgaWYgKGkgPT0gbikKKyAgICAgIHsgKnBwcCA9IHBwOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFycmF5IGxvb2t1cCBsb2NhdGlvbj0lcCB0eXBlPSVkIGlkPSVkXG4iLCBhLT5fX3B0ciwgdHlwZSwgcHAtPmlkKSk7CisgICAgICAgIHJldHVybiBwcC0+aWQ7CisgICAgICB9CisgICAgfQorICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQXJyYXkgbG9va3VwIGxvY2F0aW9uPSVwIHR5cGU9JWQ6IG5vdCBmb3VuZFxuIiwgYS0+X19wdHIsIHR5cGUpKTsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9iZWdpbl9jb3VudChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcF9jbHJfYXR0cihzb2FwKTsKKyAgc29hcF9zZXRfbG9jYWxfbmFtZXNwYWNlcyhzb2FwKTsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkgfHwgKHNvYXAtPm9tb2RlICYgU09BUF9FTkNfRElNRSkpCisgICAgc29hcC0+bW9kZSA9IHNvYXAtPm9tb2RlIHwgU09BUF9JT19MRU5HVEggfCBTT0FQX0VOQ19ESU1FOworICBlbHNlCisjZW5kaWYKKyAgeyBzb2FwLT5tb2RlID0gc29hcC0+b21vZGU7CisgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19TVE9SRQorICAgICB8fCAoKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSyB8fCAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1hNTCkpCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgICAgICAmJiAhc29hcC0+ZnByZXBhcmVzZW5kCisjZW5kaWYKKyAgICAgICkpCisgICAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0lPX0xFTkdUSDsKKyAgICBlbHNlCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fTEVOR1RIOworICB9CisjaWZkZWYgV0lUSF9aTElCCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIpICYmIChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19GTFVTSCkKKyAgeyBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkpCisgICAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0lPX0xFTkdUSDsKKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1hNTCkKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19CVUZGRVI7CisgICAgZWxzZQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX1NUT1JFOworICB9CisjZW5kaWYKKyAgaWYgKCFzb2FwLT5lbmNvZGluZ1N0eWxlICYmICEoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0dSQVBIKSkKKyAgICBzb2FwLT5tb2RlIHw9IFNPQVBfWE1MX1RSRUU7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pICYmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkpCisgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19NSU1FOworICBlbHNlCisgICAgc29hcC0+bW9kZSAmPSB+U09BUF9FTkNfTVRPTTsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKQorICAgIHNvYXBfc2VsZWN0X21pbWVfYm91bmRhcnkoc29hcCk7CisgIHNvYXAtPmRpbWUubGlzdCA9IHNvYXAtPmRpbWUubGFzdDsJLyoga2VlcCB0cmFjayBvZiBsYXN0IERJTUUgYXR0YWNobWVudCAqLworI2VuZGlmCisgIHNvYXAtPmNvdW50ID0gMDsKKyAgc29hcC0+bnMgPSAwOworICBzb2FwLT5udWxsID0gMDsKKyAgc29hcC0+cG9zaXRpb24gPSAwOworICBzb2FwLT5tdXN0VW5kZXJzdGFuZCA9IDA7CisgIHNvYXAtPmVuY29kaW5nID0gMDsKKyAgc29hcC0+cGFydCA9IFNPQVBfQkVHSU47CisgIHNvYXAtPmlkbnVtID0gMDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJCZWdpbiBjb3VudCBwaGFzZSAoc29ja2V0PSVkIG1vZGU9MHgleCBjb3VudD0lbHUpXG4iLCBzb2FwLT5zb2NrZXQsIHNvYXAtPm1vZGUsICh1bnNpZ25lZCBsb25nKXNvYXAtPmNvdW50KSk7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXAtPmRpbWUuY291bnQgPSAwOyAvKiBjb3VudCAjIG9mIGF0dGFjaG1lbnRzICovCisgIHNvYXAtPmRpbWUuc2l6ZSA9IDA7IC8qIGFjY3VtdWxhdGUgdG90YWwgc2l6ZSBvZiBhdHRhY2htZW50cyAqLworICBpZiAoc29hcC0+ZnByZXBhcmVpbml0ICYmIChzb2FwLT5tb2RlICYgU09BUF9JTykgIT0gU09BUF9JT19TVE9SRSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBzb2FwLT5mcHJlcGFyZWluaXQoc29hcCk7ICAgCisjZW5kaWYKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW5kX2NvdW50KHN0cnVjdCBzb2FwICpzb2FwKQoreyAKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPmZwcmVwYXJlZmluYWwpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gc29hcC0+ZnByZXBhcmVmaW5hbChzb2FwKTsKKyNlbmRpZgorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBvZiBjb3VudCBwaGFzZVxuIikpOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9iZWdpbl9zZW5kKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIHNvYXBfY2xyX2F0dHIoc29hcCk7CisgIHNvYXBfc2V0X2xvY2FsX25hbWVzcGFjZXMoc29hcCk7CisgIHNvYXAtPm1vZGUgPSBzb2FwLT5vbW9kZSB8IChzb2FwLT5tb2RlICYgKFNPQVBfSU9fTEVOR1RIIHwgU09BUF9FTkNfRElNRSkpOworI2lmZGVmIFdJVEhfWkxJQgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fRkxVU0gpCisgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fQlVGRkVSOworICAgIGVsc2UKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19TVE9SRTsKKyAgfQorI2VuZGlmCisjaWZkZWYgV0lUSF9VRFAKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JT19VRFApKQorICB7IHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfWE1MOworICAgIGlmIChzb2FwLT5jb3VudCA+IFNPQVBfQlVGTEVOKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9VRFBfRVJST1I7CisgIH0KKyNlbmRpZgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0ZMVVNIICYmIHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgIHsgaWYgKHNvYXAtPmNvdW50IHx8IChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpIHx8IChzb2FwLT5tb2RlICYgU09BUF9FTkNfWE1MKSkKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19CVUZGRVI7CisgICAgZWxzZQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX1NUT1JFOworICB9CisgIHNvYXAtPm1vZGUgJj0gflNPQVBfSU9fTEVOR1RIOworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX1NUT1JFKQorICAgIHNvYXBfbmV3X2Jsb2NrKHNvYXApOworICBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9JT19LRUVQQUxJVkUpKQorICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOworICBpZiAoIXNvYXAtPmVuY29kaW5nU3R5bGUgJiYgIShzb2FwLT5tb2RlICYgU09BUF9YTUxfR1JBUEgpKQorICAgIHNvYXAtPm1vZGUgfD0gU09BUF9YTUxfVFJFRTsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSkKKyAgeyBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX01JTUU7CisgICAgc29hcC0+bW9kZSAmPSB+U09BUF9FTkNfRElNRTsKKyAgfQorICBlbHNlCisgICAgc29hcC0+bW9kZSAmPSB+U09BUF9FTkNfTVRPTTsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKQorICAgIHNvYXBfc2VsZWN0X21pbWVfYm91bmRhcnkoc29hcCk7CisjaWZkZWYgV0lOMzIKKyNpZm5kZWYgVU5ERVJfQ0UKKyNpZm5kZWYgV0lUSF9GQVNUQ0dJCisgIGlmICghc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkgLyogU2V0IHdpbjMyIHN0ZG91dCBvciBzb2FwLT5zZW5kZmQgdG8gQklOQVJZLCBlLmcuIHRvIHN1cHBvcnQgRElNRSAqLworI2lmZGVmIF9fQk9STEFORENfXworICAgIHNldG1vZGUoKFNPQVBfU09DS0VUKXNvYXAtPnNlbmRmZCwgT19CSU5BUlkpOworI2Vsc2UKKyAgICBfc2V0bW9kZSgoU09BUF9TT0NLRVQpc29hcC0+c2VuZGZkLCBfT19CSU5BUlkpOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKQorICB7IHNvYXAtPmJ1ZmlkeCA9IDA7CisgICAgc29hcC0+YnVmbGVuID0gMDsKKyAgfQorICBzb2FwLT5jaHVua3NpemUgPSAwOworICBzb2FwLT5ucyA9IDA7CisgIHNvYXAtPm51bGwgPSAwOworICBzb2FwLT5wb3NpdGlvbiA9IDA7CisgIHNvYXAtPm11c3RVbmRlcnN0YW5kID0gMDsKKyAgc29hcC0+ZW5jb2RpbmcgPSAwOworICBzb2FwLT5pZG51bSA9IDA7CisgIHNvYXAtPmxldmVsID0gMDsKKyNpZmRlZiBXSVRIX1pMSUIKKyAgc29hcC0+el9yYXRpb19vdXQgPSAxLjA7CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIpICYmIHNvYXAtPnpsaWJfc3RhdGUgIT0gU09BUF9aTElCX0RFRkxBVEUpCisgIHsKKyNpZmRlZiBXSVRIX0daSVAKKyAgICBtZW1jcHkoc29hcC0+el9idWYsICJcMzdcMjEzXDEwXDBcMFwwXDBcMFwwXDM3NyIsIDEwKTsKKyAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IChCeXRlKilzb2FwLT56X2J1ZiArIDEwOworICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCA9IFNPQVBfQlVGTEVOIC0gMTA7CisgICAgc29hcC0+el9jcmMgPSBjcmMzMigwTCwgTlVMTCwgMCk7CisgICAgaWYgKGRlZmxhdGVJbml0Migmc29hcC0+ZF9zdHJlYW0sIHNvYXAtPnpfbGV2ZWwsIFpfREVGTEFURUQsIC1NQVhfV0JJVFMsIDgsIFpfREVGQVVMVF9TVFJBVEVHWSkgIT0gWl9PSykKKyNlbHNlCisgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZSopc29hcC0+el9idWY7CisgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0ID0gU09BUF9CVUZMRU47CisgICAgaWYgKGRlZmxhdGVJbml0KCZzb2FwLT5kX3N0cmVhbSwgc29hcC0+el9sZXZlbCkgIT0gWl9PSykKKyNlbmRpZgorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVmbGF0ZSBpbml0aWFsaXplZFxuIikpOworICAgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfREVGTEFURTsKKyAgfQorI2VuZGlmCisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQmVnaW4gc2VuZCBwaGFzZSAoc29ja2V0PSVkIG1vZGU9MHgleCBjb3VudD0lbHUpXG4iLCBzb2FwLT5zb2NrZXQsIHNvYXAtPm1vZGUsICh1bnNpZ25lZCBsb25nKXNvYXAtPmNvdW50KSk7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0JFR0lOOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+ZnByZXBhcmVpbml0ICYmIChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19TVE9SRSkKKyAgICBzb2FwLT5mcHJlcGFyZWluaXQoc29hcCk7ICAgCisjZW5kaWYKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9lbWJlZGRlZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCwgaW50IHQpCit7IHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgaWYgKHNvYXBfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgdCwgJnBwKSkKKyAgeyBwcC0+bWFyazEgPSAxOworICAgIHBwLT5tYXJrMiA9IDE7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbWJlZGRlZCAlcCB0eXBlPSVkIG1hcmsgc2V0IHRvIDFcbiIsIHAsIHQpKTsKKyAgfQorfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlZmVyZW5jZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCwgaW50IHQpCit7IHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgaWYgKCFwIHx8IChzb2FwLT5tb2RlICYgU09BUF9YTUxfVFJFRSkpCisgICAgcmV0dXJuIDE7CisgIGlmIChzb2FwX3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIHQsICZwcCkpCisgIHsgaWYgKHBwLT5tYXJrMSA9PSAwKQorICAgIHsgcHAtPm1hcmsxID0gMjsKKyAgICAgIHBwLT5tYXJrMiA9IDI7CisgICAgfQorICB9CisgIGVsc2UgaWYgKHNvYXBfcG9pbnRlcl9lbnRlcihzb2FwLCBwLCBOVUxMLCAwLCB0LCAmcHApKQorICB7IHBwLT5tYXJrMSA9IDA7CisgICAgcHAtPm1hcmsyID0gMDsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIDE7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVmZXJlbmNlICVwIHR5cGU9JWQgKCVkICVkKVxuIiwgcCwgdCwgKGludClwcC0+bWFyazEsIChpbnQpcHAtPm1hcmsyKSk7CisgIHJldHVybiBwcC0+bWFyazE7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYXJyYXlfcmVmZXJlbmNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGludCB0KQoreyByZWdpc3RlciBpbnQgaTsKKyAgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICBpZiAoIXAgfHwgIWEtPl9fcHRyKQorICAgIHJldHVybiAxOworICBpID0gc29hcF9hcnJheV9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCBhLCBuLCB0LCAmcHApOworICBpZiAoaSkKKyAgeyBpZiAocHAtPm1hcmsxID09IDApCisgICAgeyBwcC0+bWFyazEgPSAyOworICAgICAgcHAtPm1hcmsyID0gMjsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoIXNvYXBfcG9pbnRlcl9lbnRlcihzb2FwLCBwLCBhLCBuLCB0LCAmcHApKQorICAgIHJldHVybiAxOworICBlbHNlCisgIHsgcHAtPm1hcmsxID0gMDsKKyAgICBwcC0+bWFyazIgPSAwOworICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQXJyYXkgcmVmZXJlbmNlICVwIHB0cj0lcCBkaW09JWQgdHlwZT0lZCAoJWQgJWQpXG4iLCBwLCBhLT5fX3B0ciwgbiwgdCwgKGludClwcC0+bWFyazEsIChpbnQpcHAtPm1hcmsyKSk7CisgIHJldHVybiBwcC0+bWFyazE7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW1iZWRkZWRfaWQoc3RydWN0IHNvYXAgKnNvYXAsIGludCBpZCwgY29uc3Qgdm9pZCAqcCwgaW50IHQpCit7IHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9UUkVFKQorICAgIHJldHVybiBpZDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbWJlZGRlZF9pZCAlcCB0eXBlPSVkIGlkPSVkXG4iLCBwLCB0LCBpZCkpOworICBpZiAoc29hcC0+dmVyc2lvbiA9PSAxICYmIHNvYXAtPmVuY29kaW5nU3R5bGUgJiYgIShzb2FwLT5tb2RlICYgU09BUF9YTUxfR1JBUEgpICYmIHNvYXAtPnBhcnQgIT0gU09BUF9JTl9IRUFERVIpCisgIHsgaWYgKGlkIDwgMCkKKyAgICB7IGlkID0gc29hcF9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCB0LCAmcHApOworICAgICAgaWYgKGlkKQorICAgICAgeyBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICAgICAgICAgIHBwLT5tYXJrMSA9IDI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwcC0+bWFyazIgPSAyOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVtYmVkZGVkX2lkIG11bHRpcmVmIGlkPSVkICVwIHR5cGU9JWQgPSAoJWQgJWQpXG4iLCBpZCwgcCwgdCwgKGludClwcC0+bWFyazEsIChpbnQpcHAtPm1hcmsyKSk7CisgICAgICB9CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBpZDsKKyAgfQorICBpZiAoaWQgPCAwKQorICAgIGlkID0gc29hcF9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCB0LCAmcHApOworICBlbHNlIGlmIChpZCAmJiAhc29hcF9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCB0LCAmcHApKQorICAgIHJldHVybiAwOworICBpZiAoaWQgJiYgcHApCisgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICAgIHBwLT5tYXJrMSA9IDE7CisgICAgZWxzZQorICAgICAgcHAtPm1hcmsyID0gMTsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVtYmVkZGVkX2lkIGVtYmVkZGVkIHJlZiBpZD0lZCAlcCB0eXBlPSVkID0gKCVkICVkKVxuIiwgaWQsIHAsIHQsIChpbnQpcHAtPm1hcmsxLCAoaW50KXBwLT5tYXJrMikpOworICB9CisgIHJldHVybiBpZDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9pc19lbWJlZGRlZChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGxpc3QgKnBwKQoreyBpZiAoIXBwKQorICAgIHJldHVybiAwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIklzIGVtYmVkZGVkPyAlZCAlZFxuIiwgKGludClwcC0+bWFyazEsIChpbnQpcHAtPm1hcmsyKSk7CisgIGlmIChzb2FwLT52ZXJzaW9uID09IDEgJiYgc29hcC0+ZW5jb2RpbmdTdHlsZSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9HUkFQSCkgJiYgc29hcC0+cGFydCAhPSBTT0FQX0lOX0hFQURFUikKKyAgeyBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICAgICAgcmV0dXJuIHBwLT5tYXJrMSAhPSAwOworICAgIHJldHVybiBwcC0+bWFyazIgIT0gMDsKKyAgfQorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICAgIHJldHVybiBwcC0+bWFyazEgPT0gMTsKKyAgcmV0dXJuIHBwLT5tYXJrMiA9PSAxOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2lzX3NpbmdsZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGxpc3QgKnBwKQoreyBpZiAoc29hcC0+cGFydCA9PSBTT0FQX0lOX0hFQURFUikKKyAgICByZXR1cm4gMTsKKyAgaWYgKCFwcCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICByZXR1cm4gcHAtPm1hcmsxID09IDA7CisgIHJldHVybiBwcC0+bWFyazIgPT0gMDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2VtYmVkZGVkKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHApCit7IGlmICghcHApCisgICAgcmV0dXJuOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICAgIHBwLT5tYXJrMSA9IDE7CisgIGVsc2UKKyAgICBwcC0+bWFyazIgPSAxOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2F0dGFjaG1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgY29uc3QgY2hhciAqYWlkLCBjb25zdCBjaGFyICphdHlwZSwgY29uc3QgY2hhciAqYW9wdGlvbnMsIGludCBuLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkgCit7IHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgaW50IGk7CisgIGlmICghcCB8fCAhYS0+X19wdHIgfHwgKCFhaWQgJiYgIWF0eXBlKSkKKyAgICByZXR1cm4gc29hcF9lbGVtZW50X2lkKHNvYXAsIHRhZywgaWQsIHAsIGEsIG4sIHR5cGUsIHQpOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkF0dGFjaG1lbnQgdGFnPSclcycgaWQ9JyVzJyAoJWQpIHR5cGU9JyVzJ1xuIiwgdGFnLCBhaWQ/YWlkOiIiLCBpZCwgYXR5cGU/YXR5cGU6IiIpKTsKKyAgaSA9IHNvYXBfYXJyYXlfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgYSwgbiwgdCwgJnBwKTsKKyAgaWYgKCFpKQorICB7IGkgPSBzb2FwX3BvaW50ZXJfZW50ZXIoc29hcCwgcCwgYSwgbiwgdCwgJnBwKTsKKyAgICBpZiAoIWkpCisgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorICBpZiAoaWQgPD0gMCkKKyAgICBpZCA9IGk7CisgIGlmICghYWlkKQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCBzb2FwLT5kaW1lX2lkX2Zvcm1hdCwgaWQpOworICAgIGFpZCA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPnRtcGJ1Zik7CisgIH0KKyAgLyogQWRkIE1UT00geG9wOkluY2x1ZGUgZWxlbWVudCB3aGVuIG5lY2Vzc2FyeSAqLworICAvKiBUT0RPOiB0aGlzIGNvZGUgdG8gYmUgb2Jzb2xldGVkIHdpdGggbmV3IGltcG9ydC94b3AuaCBjb252ZW50aW9ucyAqLworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKSAmJiBzdHJjbXAodGFnLCAieG9wOkluY2x1ZGUiKSkKKyAgeyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIDAsIHR5cGUpCisgICAgIHx8IHNvYXBfZWxlbWVudF9ocmVmKHNvYXAsICJ4b3A6SW5jbHVkZSIsIDAsICJocmVmIiwgYWlkKQorICAgICB8fCBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGVsc2UgaWYgKHNvYXBfZWxlbWVudF9ocmVmKHNvYXAsIHRhZywgMCwgImhyZWYiLCBhaWQpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgeyBpZiAocHAtPm1hcmsxICE9IDMpCisgICAgeyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgICAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pCisgICAgICAgIGNvbnRlbnQgPSBzb2FwX25ld19tdWx0aXBhcnQoc29hcCwgJnNvYXAtPm1pbWUuZmlyc3QsICZzb2FwLT5taW1lLmxhc3QsIChjaGFyKilhLT5fX3B0ciwgYS0+X19zaXplKTsKKyAgICAgIGVsc2UKKyAgICAgICAgY29udGVudCA9IHNvYXBfbmV3X211bHRpcGFydChzb2FwLCAmc29hcC0+ZGltZS5maXJzdCwgJnNvYXAtPmRpbWUubGFzdCwgKGNoYXIqKWEtPl9fcHRyLCBhLT5fX3NpemUpOworICAgICAgaWYgKCFjb250ZW50KQorICAgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBpZiAoIXN0cm5jbXAoYWlkLCAiY2lkOiIsIDQpKSAvKiBSRkMgMjExMSAqLworICAgICAgeyBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pCisgICAgICAgIHsgY2hhciAqcyA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzdHJsZW4oYWlkKSAtIDEpOworCSAgaWYgKHMpCisJICB7ICpzID0gJzwnOworCSAgICBzdHJjcHkocyArIDEsIGFpZCArIDQpOworCSAgICBzdHJjYXQocywgIj4iKTsKKwkgICAgY29udGVudC0+aWQgPSBzOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgY29udGVudC0+aWQgPSBhaWQgKyA0OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBjb250ZW50LT5pZCA9IGFpZDsKKyAgICAgIGNvbnRlbnQtPnR5cGUgPSBhdHlwZTsKKyAgICAgIGNvbnRlbnQtPm9wdGlvbnMgPSBhb3B0aW9uczsKKyAgICAgIGNvbnRlbnQtPmVuY29kaW5nID0gU09BUF9NSU1FX0JJTkFSWTsKKyAgICAgIHBwLT5tYXJrMSA9IDM7CisgICAgfQorICB9CisgIGVsc2UKKyAgICBwcC0+bWFyazIgPSAzOworICByZXR1cm4gLTE7Cit9CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyB2b2lkCitzb2FwX2luaXRfaWh0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgaTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbml0aWFsaXppbmcgSUQgaGFzaHRhYmxlXG4iKSk7CisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0lESEFTSDsgaSsrKQorICAgIHNvYXAtPmlodFtpXSA9IE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZAorc29hcF9mcmVlX2lodChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICppcCwgKnA7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2ZsaXN0ICpmcCwgKmZxOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWUgSUQgaGFzaHRhYmxlXG4iKSk7CisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0lESEFTSDsgaSsrKQorICB7IGZvciAoaXAgPSBzb2FwLT5paHRbaV07IGlwOyBpcCA9IHApCisgICAgeyBmb3IgKGZwID0gaXAtPmZsaXN0OyBmcDsgZnAgPSBmcSkKKyAgICAgIHsgZnEgPSBmcC0+bmV4dDsKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIGZwKTsKKyAgICAgIH0KKyAgICAgIHAgPSBpcC0+bmV4dDsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBpcCk7CisgICAgfQorICAgIHNvYXAtPmlodFtpXSA9IE5VTEw7CisgIH0KK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwX2lsaXN0ICoKK1NPQVBfRk1BQzIKK3NvYXBfbG9va3VwKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworICBmb3IgKGlwID0gc29hcC0+aWh0W3NvYXBfaGFzaChpZCldOyBpcDsgaXAgPSBpcC0+bmV4dCkKKyAgICBpZiAoIXN0cmNtcChpcC0+aWQsIGlkKSkKKyAgICAgIHJldHVybiBpcDsKKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcF9pbGlzdCAqCitTT0FQX0ZNQUMyCitzb2FwX2VudGVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCkKK3sgcmVnaXN0ZXIgc2l6ZV90IGg7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgaXAgPSAoc3RydWN0IHNvYXBfaWxpc3QqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9pbGlzdCkgKyBzdHJsZW4oaWQpKTsKKyAgaWYgKGlwKQorICB7IGggPSBzb2FwX2hhc2goaWQpOworICAgIHN0cmNweShpcC0+aWQsIGlkKTsKKyAgICBpcC0+bmV4dCA9IHNvYXAtPmlodFtoXTsKKyAgICBzb2FwLT5paHRbaF0gPSBpcDsKKyAgICByZXR1cm4gaXA7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQqCitTT0FQX0ZNQUMyCitzb2FwX21hbGxvYyhzdHJ1Y3Qgc29hcCAqc29hcCwgc2l6ZV90IG4pCit7IHJlZ2lzdGVyIGNoYXIgKnA7CisgIGlmICghbikKKyAgICByZXR1cm4gKHZvaWQqKVNPQVBfTk9OX05VTEw7CisgIGlmICghc29hcCkKKyAgICByZXR1cm4gU09BUF9NQUxMT0Moc29hcCwgbik7CisgIG4gKz0gKC0obG9uZyluKSAmIChzaXplb2Yodm9pZCopLTEpOyAvKiBhbGlnbiBhdCA0LSwgOC0gb3IgMTYtYnl0ZSBib3VuZGFyeSAqLworICBpZiAoIShwID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIG4gKyBzaXplb2Yodm9pZCopICsgc2l6ZW9mKHNpemVfdCkpKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHJldHVybiBOVUxMOworICB9CisgIC8qIGtlZXAgY2hhaW4gb2YgYWxsb2NlZCBjZWxscyBmb3IgbGF0ZXIgZGVzdHJ1Y3Rpb24gKi8KKyAgc29hcC0+YWxsb2NlZCA9IDE7CisgICoodm9pZCoqKShwICsgbikgPSBzb2FwLT5hbGlzdDsKKyAgKihzaXplX3QqKShwICsgbiArIHNpemVvZih2b2lkKikpID0gbjsKKyAgc29hcC0+YWxpc3QgPSBwICsgbjsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitzdGF0aWMgdm9pZAorc29hcF9pbml0X21odChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCAoaW50KVNPQVBfUFRSSEFTSDsgaSsrKQorICAgIHNvYXAtPm1odFtpXSA9IE5VTEw7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitzdGF0aWMgdm9pZAorc29hcF9mcmVlX21odChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX21saXN0ICptcCwgKm1xOworICBmb3IgKGkgPSAwOyBpIDwgKGludClTT0FQX1BUUkhBU0g7IGkrKykKKyAgeyBmb3IgKG1wID0gc29hcC0+bWh0W2ldOyBtcDsgbXAgPSBtcSkKKyAgICB7IG1xID0gbXAtPm5leHQ7CisgICAgICBpZiAobXAtPmxpdmUpCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMoJWQpOiBtYWxsb2MoKSA9ICVwIG5vdCBmcmVlZCAobWVtb3J5IGxlYWsgb3IgZm9yZ290IHRvIGNhbGwgc29hcF9lbmQoKT8pXG4iLCBtcC0+ZmlsZSwgbXAtPmxpbmUsIG1wLT5wdHIpOworICAgICAgZnJlZShtcCk7CisgICAgfQorICAgIHNvYXAtPm1odFtpXSA9IE5VTEw7CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK1NPQVBfRk1BQzEKK3ZvaWQqCitTT0FQX0ZNQUMyCitzb2FwX3RyYWNrX21hbGxvYyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIHNpemVfdCBzaXplKQoreyByZWdpc3RlciB2b2lkICpwID0gbWFsbG9jKHNpemUpOworICBpZiAoc29hcCkKKyAgeyByZWdpc3RlciBpbnQgaCA9IHNvYXBfaGFzaF9wdHIocCk7CisgICAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbWxpc3QgKm1wID0gKHN0cnVjdCBzb2FwX21saXN0KiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2FwX21saXN0KSk7CisgICAgaWYgKHNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYX1RFU1RdKQorICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIlcyglZCk6IG1hbGxvYyglbHUpID0gJXBcbiIsIGZpbGUsIGxpbmUsICh1bnNpZ25lZCBsb25nKXNpemUsIHApKTsKKyAgICBtcC0+bmV4dCA9IHNvYXAtPm1odFtoXTsKKyAgICBtcC0+cHRyID0gcDsKKyAgICBtcC0+ZmlsZSA9IGZpbGU7CisgICAgbXAtPmxpbmUgPSBsaW5lOworICAgIG1wLT5saXZlID0gMTsKKyAgICBzb2FwLT5taHRbaF0gPSBtcDsKKyAgfQorICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfdHJhY2tfZnJlZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIHZvaWQgKnApCit7IHJlZ2lzdGVyIGludCBoID0gc29hcF9oYXNoX3B0cihwKTsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbWxpc3QgKm1wOworICBmb3IgKG1wID0gc29hcC0+bWh0W2hdOyBtcDsgbXAgPSBtcC0+bmV4dCkKKyAgICBpZiAobXAtPnB0ciA9PSBwKQorICAgICAgYnJlYWs7CisgIGlmIChtcCkKKyAgeyBpZiAobXAtPmxpdmUpCisgICAgeyBmcmVlKHApOworICAgICAgaWYgKHNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYX1RFU1RdKQorICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIiVzKCVkKTogZnJlZSglcClcbiIsIGZpbGUsIGxpbmUsIHApKTsKKyAgICAgIG1wLT5saXZlID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgICAgZnByaW50ZihzdGRlcnIsICIlcyglZCk6IGZyZWUoJXApIGRvdWJsZSBmcmVlIG9mIHBvaW50ZXIgbWFsbG9jZWQgYXQgJXMoJWQpXG4iLCBmaWxlLCBsaW5lLCBwLCBtcC0+ZmlsZSwgbXAtPmxpbmUpOworICB9CisgIGVsc2UKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzKCVkKTogZnJlZSglcCkgcG9pbnRlciBub3QgbWFsbG9jZWRcbiIsIGZpbGUsIGxpbmUsIHApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworc3RhdGljIHZvaWQKK3NvYXBfdHJhY2tfdW5saW5rKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwKQoreyByZWdpc3RlciBpbnQgaCA9IHNvYXBfaGFzaF9wdHIocCk7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX21saXN0ICptcDsKKyAgZm9yIChtcCA9IHNvYXAtPm1odFtoXTsgbXA7IG1wID0gbXAtPm5leHQpCisgICAgaWYgKG1wLT5wdHIgPT0gcCkKKyAgICAgIGJyZWFrOworICBpZiAobXApCisgICAgbXAtPmxpdmUgPSAwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9kZWFsbG9jKHN0cnVjdCBzb2FwICpzb2FwLCB2b2lkICpwKQoreyBpZiAoIXNvYXApCisgICAgcmV0dXJuOworICBpZiAocCkKKyAgeyByZWdpc3RlciBjaGFyICoqcTsKKyAgICBmb3IgKHEgPSAoY2hhcioqKSZzb2FwLT5hbGlzdDsgKnE7IHEgPSAqKGNoYXIqKiopcSkKKyAgICB7IGlmIChwID09ICh2b2lkKikoKnEgLSAqKHNpemVfdCopKCpxICsgc2l6ZW9mKHZvaWQqKSkpKQorICAgICAgeyAqcSA9ICoqKGNoYXIqKiopcTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlZCBkYXRhIGF0ICVwXG4iLCBwKSk7CisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgICBzb2FwX2RlbGV0ZShzb2FwLCBwKTsKKyAgfQorICBlbHNlCisgIHsgcmVnaXN0ZXIgY2hhciAqcTsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWUgYWxsIHNvYXBfbWFsbG9jKCkgZGF0YVxuIikpOworICAgIHdoaWxlIChzb2FwLT5hbGlzdCkKKyAgICB7IHEgPSAoY2hhciopc29hcC0+YWxpc3Q7CisgICAgICBzb2FwLT5hbGlzdCA9ICoodm9pZCoqKXE7CisgICAgICBxIC09ICooc2l6ZV90KikocSArIHNpemVvZih2b2lkKikpOworICAgICAgU09BUF9GUkVFKHNvYXAsIHEpOworICAgIH0KKyAgfQorICAvKiB3ZSBtdXN0IGFzc3VtZSB0aGVzZSB3ZXJlIGRlYWxsb2NhdGVkOiAqLworICBzb2FwLT5hY3Rpb24gPSBOVUxMOworICBzb2FwLT5mYXVsdCA9IE5VTEw7CisgIHNvYXAtPmhlYWRlciA9IE5VTEw7CisgIHNvYXAtPnVzZXJpZCA9IE5VTEw7CisgIHNvYXAtPnBhc3N3ZCA9IE5VTEw7CisgIHNvYXAtPmF1dGhyZWFsbSA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXBfY2xyX21pbWUoc29hcCk7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZGVsZXRlKHN0cnVjdCBzb2FwICpzb2FwLCB2b2lkICpwKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9jbGlzdCAqKmNwOworICBpZiAoc29hcF9jaGVja19zdGF0ZShzb2FwKSkKKyAgICByZXR1cm47CisgIGNwID0gJnNvYXAtPmNsaXN0OworICBpZiAocCkKKyAgeyB3aGlsZSAoKmNwKQorICAgIHsgaWYgKHAgPT0gKCpjcCktPnB0cikKKyAgICAgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfY2xpc3QgKnEgPSAqY3A7CisgICAgICAgICpjcCA9IHEtPm5leHQ7CisgICAgICAgIHEtPmZkZWxldGUocSk7CisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBxKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgY3AgPSAmKCpjcCktPm5leHQ7CisgICAgfQorICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IGRlYWxsb2MgZGF0YSAlcDogYWRkcmVzcyBub3QgaW4gbGlzdFxuIiwgcCkpOworICB9CisgIGVsc2UKKyAgeyB3aGlsZSAoKmNwKQorICAgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfY2xpc3QgKnEgPSAqY3A7CisgICAgICAqY3AgPSBxLT5uZXh0OworICAgICAgaWYgKHEtPnB0ciA9PSAodm9pZCopc29hcC0+ZmF1bHQpCisgICAgICAgIHNvYXAtPmZhdWx0ID0gTlVMTDsgLyogdGhpcyB3YXMgZGVhbGxvY2F0ZWQgKi8KKyAgICAgIGVsc2UgaWYgKHEtPnB0ciA9PSAodm9pZCopc29hcC0+aGVhZGVyKQorICAgICAgICBzb2FwLT5oZWFkZXIgPSBOVUxMOyAvKiB0aGlzIHdhcyBkZWFsbG9jYXRlZCAqLworICAgICAgcS0+ZmRlbGV0ZShxKTsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBxKTsKKyAgICB9CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwX2NsaXN0ICoKK1NPQVBfRk1BQzIKK3NvYXBfbGluayhzdHJ1Y3Qgc29hcCAqc29hcCwgdm9pZCAqcCwgaW50IHQsIGludCBuLCB2b2lkICgqZmRlbGV0ZSkoc3RydWN0IHNvYXBfY2xpc3QqKSkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfY2xpc3QgKmNwOworICBpZiAoKGNwID0gKHN0cnVjdCBzb2FwX2NsaXN0KilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfY2xpc3QpKSkpCisgIHsgY3AtPm5leHQgPSBzb2FwLT5jbGlzdDsKKyAgICBjcC0+dHlwZSA9IHQ7CisgICAgY3AtPnNpemUgPSBuOyAKKyAgICBjcC0+cHRyID0gcDsKKyAgICBjcC0+ZmRlbGV0ZSA9IGZkZWxldGU7CisgICAgc29hcC0+Y2xpc3QgPSBjcDsKKyAgfQorICByZXR1cm4gY3A7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3VubGluayhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCkKK3sgcmVnaXN0ZXIgY2hhciAqKnE7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2NsaXN0ICoqY3A7CisgIGlmICghc29hcCB8fCAhcCkKKyAgICByZXR1cm47CisgIGZvciAocSA9IChjaGFyKiopJnNvYXAtPmFsaXN0OyAqcTsgcSA9ICooY2hhcioqKilxKQorICB7IGlmIChwID09ICh2b2lkKikoKnEgLSAqKHNpemVfdCopKCpxICsgc2l6ZW9mKHZvaWQqKSkpKQorICAgIHsgKnEgPSAqKihjaGFyKioqKXE7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVubGlua2VkIGRhdGEgJXBcbiIsIHApKTsKKyNpZmRlZiBTT0FQX0RFQlVHCisgICAgICBzb2FwX3RyYWNrX3VubGluayhzb2FwLCBwKTsKKyNlbmRpZgorICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBmb3IgKGNwID0gJnNvYXAtPmNsaXN0OyAqY3A7IGNwID0gJigqY3ApLT5uZXh0KQorICB7IGlmIChwID09ICgqY3ApLT5wdHIpCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVubGlua2VkIGNsYXNzIGluc3RhbmNlICVwXG4iLCBwKSk7CisgICAgICBxID0gKGNoYXIqKikqY3A7CisgICAgICAqY3AgPSAoKmNwKS0+bmV4dDsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBxKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfbG9va3VwX3R5cGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIGlmIChpZCAmJiAqaWQpCisgIHsgaXAgPSBzb2FwX2xvb2t1cChzb2FwLCBpZCk7CisgICAgaWYgKGlwKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJMb29rdXAgaWQ9JyVzJyB0eXBlPSVkXG4iLCBpZCwgaXAtPnR5cGUpKTsKKyAgICAgIHJldHVybiBpcC0+dHlwZTsKKyAgICB9CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJsb29rdXAgdHlwZSBpZD0nJXMnIE5PVCBGT1VORCEgTmVlZCB0byBnZXQgaXQgZnJvbSB4c2k6dHlwZVxuIiwgaWQpKTsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkKgorU09BUF9GTUFDMgorc29hcF9pZF9sb29rdXAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCB2b2lkICoqcCwgaW50IHQsIHNpemVfdCBuLCB1bnNpZ25lZCBpbnQgaykKK3sgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworICB2b2lkICoqcTsKKyAgaWYgKCFwIHx8ICFpZCB8fCAhKmlkKQorICAgIHJldHVybiBwOworICBpcCA9IHNvYXBfbG9va3VwKHNvYXAsIGlkKTsgLyogbG9va3VwIHBvaW50ZXIgdG8gaGFzaCB0YWJsZSBlbnRyeSBmb3Igc3RyaW5nIGlkICovCisgIGlmICghaXApCisgIHsgaXAgPSBzb2FwX2VudGVyKHNvYXAsIGlkKTsgLyogbmV3IGhhc2ggdGFibGUgZW50cnkgZm9yIHN0cmluZyBpZCAqLworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRm9yd2FyZGluZyBmaXJzdCBocmVmPSclcycgdHlwZT0lZCAlcCAoJXUgYnl0ZXMpXG4iLCBpZCwgdCwgcCwgKHVuc2lnbmVkIGludCluKSk7CisgICAgaXAtPnR5cGUgPSB0OworICAgIGlwLT5zaXplID0gbjsgCisgICAgaXAtPmxpbmsgPSBwOworICAgIGlwLT5jb3B5ID0gTlVMTDsKKyAgICBpcC0+Zmxpc3QgPSBOVUxMOworICAgIGlwLT5wdHIgPSBOVUxMOworICAgIGlwLT5sZXZlbCA9IGs7CisgICAgKnAgPSBOVUxMOworICB9CisgIGVsc2UgaWYgKGlwLT5wdHIpCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHZlZCBocmVmPSclcycgdHlwZT0lZCBsb2NhdGlvbj0lcCAoJXUgYnl0ZXMpXG4iLCBpZCwgdCwgaXAtPnB0ciwgKHVuc2lnbmVkIGludCluKSk7CisgICAgaWYgKGlwLT50eXBlICE9IHQpCisgICAgeyBzdHJjcHkoc29hcC0+aWQsIGlkKTsKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9IUkVGOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJUeXBlIGluY29tcGF0aWJpbGl0eTogaWQgdHlwZT0lZCBocmVmIHR5cGU9JWRcbiIsIGlwLT50eXBlLCB0KSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgd2hpbGUgKGlwLT5sZXZlbCA8IGspCisgICAgeyBxID0gKHZvaWQqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yodm9pZCopKTsgIAorICAgICAgaWYgKCFxKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICpwID0gKHZvaWQqKXE7CisgICAgICBwID0gcTsKKyAgICAgIGstLTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVzY2VuZGluZyBvbmUgbGV2ZWwuLi5cbiIpKTsKKyAgICB9CisgICAgKnAgPSBpcC0+cHRyOworICB9CisgIGVsc2UgaWYgKGlwLT5sZXZlbCA+IGspCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHZpbmcgbGV2ZWwgJXUgcG9pbnRlcnMgdG8gaHJlZj0nJXMnXG4iLCBpcC0+bGV2ZWwsIGlkKSk7CisgICAgd2hpbGUgKGlwLT5sZXZlbCA+IGspCisgICAgeyB2b2lkICpzLCAqKnIgPSAmaXAtPmxpbms7CisgICAgICBxID0gKHZvaWQqKilpcC0+bGluazsKKyAgICAgIHdoaWxlIChxKQorICAgICAgeyAqciA9ICh2b2lkKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yodm9pZCopKTsKKyAgICAgICAgcyA9ICpxOworICAgICAgICAqcSA9ICpyOworICAgICAgICByID0gKHZvaWQqKikqcjsKKyAgICAgICAgcSA9ICh2b2lkKiopczsKKyAgICAgIH0KKyAgICAgICpyID0gTlVMTDsKKyAgICAgIGlwLT5zaXplID0gbjsgCisgICAgICBpcC0+Y29weSA9IE5VTEw7CisgICAgICBpcC0+bGV2ZWwgPSBpcC0+bGV2ZWwgLSAxOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJEZXNjZW5kaW5nIG9uZSBsZXZlbC4uLlxuIikpOworICAgIH0KKyAgICBxID0gKHZvaWQqKilpcC0+bGluazsKKyAgICBpcC0+bGluayA9IHA7CisgICAgKnAgPSAodm9pZCopcTsKKyAgfQorICBlbHNlCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGb3J3YXJkZWQgaHJlZj0nJXMnIHR5cGU9JWQgbG9jYXRpb249JXAgKCV1IGJ5dGVzKVxuIiwgaWQsIHQsIHAsICh1bnNpZ25lZCBpbnQpbikpOworICAgIHdoaWxlIChpcC0+bGV2ZWwgPCBrKQorICAgIHsgcSA9ICh2b2lkKiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHZvaWQqKSk7ICAKKyAgICAgICpwID0gcTsKKyAgICAgIHAgPSBxOworICAgICAgay0tOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJEZXNjZW5kaW5nIG9uZSBsZXZlbC4uLlxuIikpOworICAgIH0KKyAgICBxID0gKHZvaWQqKilpcC0+bGluazsKKyAgICBpcC0+bGluayA9IHA7CisgICAgKnAgPSAodm9pZCopcTsKKyAgfQorICByZXR1cm4gcDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQqCitTT0FQX0ZNQUMyCitzb2FwX2lkX2ZvcndhcmQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmhyZWYsIHZvaWQgKnAsIHNpemVfdCBsZW4sIGludCBzdCwgaW50IHR0LCBzaXplX3QgbiwgdW5zaWduZWQgaW50IGssIHZvaWQgKCpmY29weSkoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIHNpemVfdCwgY29uc3Qgdm9pZCosIHNpemVfdCkpCit7IHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgaWYgKCFwIHx8ICFocmVmIHx8ICEqaHJlZikKKyAgICByZXR1cm4gcDsKKyAgaXAgPSBzb2FwX2xvb2t1cChzb2FwLCBocmVmKTsgLyogbG9va3VwIHBvaW50ZXIgdG8gaGFzaCB0YWJsZSBlbnRyeSBmb3Igc3RyaW5nIGlkICovCisgIGlmICghaXApCisgIHsgaXAgPSBzb2FwX2VudGVyKHNvYXAsIGhyZWYpOyAvKiBuZXcgaGFzaCB0YWJsZSBlbnRyeSBmb3Igc3RyaW5nIGlkICovCisgICAgaXAtPnR5cGUgPSBzdDsKKyAgICBpcC0+c2l6ZSA9IG47CisgICAgaXAtPmxpbmsgPSBOVUxMOworICAgIGlwLT5jb3B5ID0gTlVMTDsKKyAgICBpcC0+cHRyID0gTlVMTDsKKyAgICBpcC0+bGV2ZWwgPSAwOworICAgIGlwLT5mbGlzdCA9IE5VTEw7CisgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk5ldyBlbnRyeSBocmVmPSclcycgdHlwZT0lZCBzaXplPSVsdSBsZXZlbD0lZCBsb2NhdGlvbj0lcFxuIiwgaHJlZiwgc3QsICh1bnNpZ25lZCBsb25nKW4sIGssIHApKTsKKyAgfQorICBlbHNlIGlmIChpcC0+dHlwZSAhPSBzdCB8fCAoaXAtPmxldmVsID09IGsgJiYgaXAtPnNpemUgIT0gbikpCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJUeXBlIGluY29tcGF0aWJpbGl0eSBpZD0nJXMnIGV4cGVjdCB0eXBlPSVkIHNpemU9JWx1IGxldmVsPSV1IGdvdCB0eXBlPSVkIHNpemU9JWx1XG4iLCBocmVmLCBpcC0+dHlwZSwgKHVuc2lnbmVkIGxvbmcpaXAtPnNpemUsIGssIHN0LCAodW5zaWduZWQgbG9uZyluKSk7CisgICAgc3RyY3B5KHNvYXAtPmlkLCBocmVmKTsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfSFJFRjsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoZmNvcHkgfHwgbiA8IHNpemVvZih2b2lkKikgfHwgKmhyZWYgIT0gJyMnKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2ZsaXN0ICpmcCA9IChzdHJ1Y3Qgc29hcF9mbGlzdCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2ZsaXN0KSk7CisgICAgaWYgKCFmcCkKKyAgICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZnAtPm5leHQgPSBpcC0+Zmxpc3Q7CisgICAgZnAtPnR5cGUgPSB0dDsKKyAgICBmcC0+cHRyID0gcDsKKyAgICBmcC0+bGV2ZWwgPSBrOworICAgIGZwLT5sZW4gPSBsZW47CisgICAgaWYgKGZjb3B5KQorICAgICAgZnAtPmZjb3B5ID0gZmNvcHk7CisgICAgZWxzZQorICAgICAgZnAtPmZjb3B5ID0gc29hcF9mY29weTsKKyAgICBpcC0+Zmxpc3QgPSBmcDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZvcndhcmRpbmcgdHlwZT0lZCAodGFyZ2V0IHR5cGU9JWQpIHNpemU9JWx1IGxvY2F0aW9uPSVwIGxldmVsPSV1IGxlbj0lbHUgaHJlZj0nJXMnXG4iLCBzdCwgdHQsICh1bnNpZ25lZCBsb25nKW4sIHAsIGssICh1bnNpZ25lZCBsb25nKWxlbiwgaHJlZikpOworICB9CisgIGVsc2UKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZvcndhcmRpbmcgY29weWluZyBhZGRyZXNzICVwIGZvciB0eXBlPSVkIGhyZWY9JyVzJ1xuIiwgcCwgc3QsIGhyZWYpKTsKKyAgICAqKHZvaWQqKilwID0gaXAtPmNvcHk7CisgICAgaXAtPmNvcHkgPSBwOworICB9CisgIHJldHVybiBwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkKgorU09BUF9GTUFDMgorc29hcF9pZF9lbnRlcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIHZvaWQgKnAsIGludCB0LCBzaXplX3QgbiwgdW5zaWduZWQgaW50IGssIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmFycmF5VHlwZSwgdm9pZCAqKCpmaW5zdGFudGlhdGUpKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopKQoreworI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworI2VuZGlmCisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJFbnRlciBpZD0nJXMnIHR5cGU9JWQgbG9jPSVwIHNpemU9JWx1IGxldmVsPSV1XG4iLCBpZCwgdCwgcCwgKHVuc2lnbmVkIGxvbmcpbiwgaykpOworICBzb2FwLT5hbGxvY2VkID0gMDsKKyAgaWYgKCFwKQorICB7IGlmIChmaW5zdGFudGlhdGUpCisgICAgICBwID0gZmluc3RhbnRpYXRlKHNvYXAsIHQsIHR5cGUsIGFycmF5VHlwZSwgJm4pOworICAgIGVsc2UKKyAgICAgIHAgPSBzb2FwX21hbGxvYyhzb2FwLCBuKTsKKyAgICBpZiAocCkKKyAgICAgIHNvYXAtPmFsbG9jZWQgPSAxOworICB9CisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICBpZiAoIWlkIHx8ICEqaWQpCisjZW5kaWYKKyAgICByZXR1cm4gcDsKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgIGlwID0gc29hcF9sb29rdXAoc29hcCwgaWQpOyAvKiBsb29rdXAgcG9pbnRlciB0byBoYXNoIHRhYmxlIGVudHJ5IGZvciBzdHJpbmcgaWQgKi8KKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkxvb2t1cCBlbnRyeSBpZD0nJXMgZm9yIGxvY2F0aW9uPSVwJ1xuIiwgaWQsIHApKTsKKyAgaWYgKCFpcCkKKyAgeyBpcCA9IHNvYXBfZW50ZXIoc29hcCwgaWQpOyAvKiBuZXcgaGFzaCB0YWJsZSBlbnRyeSBmb3Igc3RyaW5nIGlkICovCisgICAgaXAtPnR5cGUgPSB0OworICAgIGlwLT5saW5rID0gTlVMTDsKKyAgICBpcC0+Y29weSA9IE5VTEw7CisgICAgaXAtPmZsaXN0ID0gTlVMTDsKKyAgICBpcC0+c2l6ZSA9IG47CisgICAgaXAtPnB0ciA9IHA7CisgICAgaXAtPmxldmVsID0gazsKKyAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiTmV3IGVudHJ5IGlkPSclcycgdHlwZT0lZCBzaXplPSVsdSBsZXZlbD0ldSBsb2NhdGlvbj0lcFxuIiwgaWQsIHQsICh1bnNpZ25lZCBsb25nKW4sIGssIHApKTsKKyAgfQorICBlbHNlIGlmICgoaXAtPnR5cGUgIT0gdCB8fCAoaXAtPmxldmVsID09IGsgJiYgaXAtPnNpemUgIT0gbikpICYmIChpcC0+Y29weSB8fCBpcC0+Zmxpc3QpKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVHlwZSBpbmNvbXBhdGliaWxpdHkgaWQ9JyVzJyBleHBlY3QgdHlwZT0lZCBzaXplPSVsdSBsZXZlbD0ldSBnb3QgdHlwZT0lZCBzaXplPSVsdVxuIiwgaWQsIGlwLT50eXBlLCAodW5zaWduZWQgbG9uZylpcC0+c2l6ZSwgaywgdCwgKHVuc2lnbmVkIGxvbmcpbikpOworICAgIHN0cmNweShzb2FwLT5pZCwgaWQpOworICAgIHNvYXAtPmVycm9yID0gU09BUF9IUkVGOworICAgIHJldHVybiBOVUxMOworICB9CisgIGVsc2UgaWYgKGlwLT5wdHIpCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJNdWx0aXBseSBkZWZpbmVkIGlkPSclcydcbiIsIGlkKSk7CisgICAgc3RyY3B5KHNvYXAtPmlkLCBpZCk7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0RVUExJQ0FURV9JRDsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBlbHNlIAorICB7IGlwLT5zaXplID0gbjsKKyAgICBpcC0+cHRyID0gcDsKKyAgICBpcC0+bGV2ZWwgPSBrOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVXBkYXRlIGVudHJ5IGlkPSclcycgdHlwZT0lZCBsb2NhdGlvbj0lcCBzaXplPSVsdSBsZXZlbD0ldVxuIiwgaWQsIHQsIHAsICh1bnNpZ25lZCBsb25nKW4sIGspKTsKKyAgfQorICByZXR1cm4gaXAtPnB0cjsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9mY29weShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0LCBpbnQgdHQsIHZvaWQgKnAsIHNpemVfdCBsZW4sIGNvbnN0IHZvaWQgKnEsIHNpemVfdCBuKQoreyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weWluZyBkYXRhIHR5cGU9JWQgKHRhcmdldCB0eXBlPSVkKSAlcCAtPiAlcCAoJWx1IGJ5dGVzKVxuIiwgc3QsIHR0LCBxLCBwLCAodW5zaWduZWQgbG9uZyluKSk7CisgIG1lbWNweShwLCBxLCBuKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbmRfc2VuZChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5kaW1lLmxpc3QpCisgIHsgLyogU09BUCBib2R5IHJlZmVyZW5jZWQgYXR0YWNobWVudHMgbXVzdCBhcHBlYXIgZmlyc3QgKi8KKyAgICBzb2FwLT5kaW1lLmxhc3QtPm5leHQgPSBzb2FwLT5kaW1lLmZpcnN0OworICAgIHNvYXAtPmRpbWUuZmlyc3QgPSBzb2FwLT5kaW1lLmxpc3QtPm5leHQ7CisgICAgc29hcC0+ZGltZS5saXN0LT5uZXh0ID0gTlVMTDsKKyAgICBzb2FwLT5kaW1lLmxhc3QgPSBzb2FwLT5kaW1lLmxpc3Q7CisgIH0KKyAgaWYgKHNvYXBfcHV0ZGltZShzb2FwKSB8fCBzb2FwX3B1dG1pbWUoc29hcCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBzb2FwLT5taW1lLmxpc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5sYXN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5saXN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGFzdCA9IE5VTEw7CisjZW5kaWYKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgc2VuZFxuIikpOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pIC8qIG5lZWQgdG8gZmx1c2ggdGhlIHJlbWFpbmluZyBkYXRhIGluIGJ1ZmZlciAqLworICB7IGlmIChzb2FwX2ZsdXNoKHNvYXApKQorI2lmZGVmIFdJVEhfWkxJQgorICAgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCICYmIHNvYXAtPnpsaWJfc3RhdGUgPT0gU09BUF9aTElCX0RFRkxBVEUpCisgICAgICB7IHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfTk9ORTsKKyAgICAgICAgZGVmbGF0ZUVuZCgmc29hcC0+ZF9zdHJlYW0pOworICAgICAgfQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyNlbHNlCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjZW5kaWYKKyNpZmRlZiBXSVRIX1pMSUIKKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIpCisgICAgeyBpbnQgcjsKKyAgICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luID0gMDsKKyAgICAgIGRvCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVmbGF0aW5nIHJlbWFpbmRlclxuIikpOworICAgICAgICByID0gZGVmbGF0ZSgmc29hcC0+ZF9zdHJlYW0sIFpfRklOSVNIKTsKKyAgICAgICAgaWYgKHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCAhPSBTT0FQX0JVRkxFTikKKyAgICAgICAgeyBpZiAoc29hcF9mbHVzaF9yYXcoc29hcCwgc29hcC0+el9idWYsIFNPQVBfQlVGTEVOIC0gc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0KSkKKyAgICAgICAgICB7IHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfTk9ORTsKKyAgICAgICAgICAgIGRlZmxhdGVFbmQoJnNvYXAtPmRfc3RyZWFtKTsKKyAgICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKwkgIH0KKyAgICAgICAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IChCeXRlKilzb2FwLT56X2J1ZjsKKyAgICAgICAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgPSBTT0FQX0JVRkxFTjsKKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAociA9PSBaX09LKTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVmbGF0ZWQgJWx1LT4lbHUgYnl0ZXNcbiIsIHNvYXAtPmRfc3RyZWFtLnRvdGFsX2luLCBzb2FwLT5kX3N0cmVhbS50b3RhbF9vdXQpKTsKKyAgICAgIHNvYXAtPnpfcmF0aW9fb3V0ID0gKGZsb2F0KXNvYXAtPmRfc3RyZWFtLnRvdGFsX291dCAvIChmbG9hdClzb2FwLT5kX3N0cmVhbS50b3RhbF9pbjsKKyAgICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX1pMSUI7CisgICAgICBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX05PTkU7CisgICAgICBpZiAoZGVmbGF0ZUVuZCgmc29hcC0+ZF9zdHJlYW0pICE9IFpfT0sgfHwgciAhPSBaX1NUUkVBTV9FTkQpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVW5hYmxlIHRvIGVuZCBkZWZsYXRlOiAlc1xuIiwgc29hcC0+ZF9zdHJlYW0ubXNnP3NvYXAtPmRfc3RyZWFtLm1zZzoiIikpOworICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgICB9CisjaWZkZWYgV0lUSF9HWklQCisgICAgICBzb2FwLT56X2J1ZlswXSA9IHNvYXAtPnpfY3JjICYgMHhGRjsKKyAgICAgIHNvYXAtPnpfYnVmWzFdID0gKHNvYXAtPnpfY3JjID4+IDgpICYgMHhGRjsKKyAgICAgIHNvYXAtPnpfYnVmWzJdID0gKHNvYXAtPnpfY3JjID4+IDE2KSAmIDB4RkY7CisgICAgICBzb2FwLT56X2J1ZlszXSA9IChzb2FwLT56X2NyYyA+PiAyNCkgJiAweEZGOworICAgICAgc29hcC0+el9idWZbNF0gPSBzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiAmIDB4RkY7CisgICAgICBzb2FwLT56X2J1Zls1XSA9IChzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiA+PiA4KSAmIDB4RkY7CisgICAgICBzb2FwLT56X2J1Zls2XSA9IChzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiA+PiAxNikgJiAweEZGOworICAgICAgc29hcC0+el9idWZbN10gPSAoc29hcC0+ZF9zdHJlYW0udG90YWxfaW4gPj4gMjQpICYgMHhGRjsKKyAgICAgIGlmIChzb2FwX2ZsdXNoX3Jhdyhzb2FwLCBzb2FwLT56X2J1ZiwgOCkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZ3ppcCBjcmMzMj0lbHVcbiIsICh1bnNpZ25lZCBsb25nKXNvYXAtPnpfY3JjKSk7CisjZW5kaWYKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX1NUT1JFKQorICAgIHsgY2hhciAqcDsKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyAgICAgIGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpKQorICAgICAgeyBzb2FwLT5tb2RlLS07CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2VuZGluZyBidWZmZXJlZCBtZXNzYWdlIG9mIGxlbmd0aCAldVxuIiwgKHVuc2lnbmVkIGludClzb2FwLT5ibGlzdC0+c2l6ZSkpOworICAgICAgICBpZiAoc29hcC0+c3RhdHVzID49IFNPQVBfUE9TVCkKKyAgICAgICAgICBzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0KHNvYXAsIHNvYXAtPmVuZHBvaW50LCBzb2FwLT5ob3N0LCBzb2FwLT5wb3J0LCBzb2FwLT5wYXRoLCBzb2FwLT5hY3Rpb24sIHNvYXAtPmJsaXN0LT5zaXplKTsKKyAgICAgICAgZWxzZSBpZiAoc29hcC0+c3RhdHVzICE9IFNPQVBfU1RPUCkKKyAgICAgICAgICBzb2FwLT5lcnJvciA9IHNvYXAtPmZyZXNwb25zZShzb2FwLCBzb2FwLT5zdGF0dXMsIHNvYXAtPmJsaXN0LT5zaXplKTsKKyAgICAgICAgaWYgKHNvYXAtPmVycm9yIHx8IHNvYXBfZmx1c2goc29hcCkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBzb2FwLT5tb2RlKys7CisgICAgICB9CisjZW5kaWYKKyAgICAgIGZvciAocCA9IHNvYXBfZmlyc3RfYmxvY2soc29hcCk7IHA7IHAgPSBzb2FwX25leHRfYmxvY2soc29hcCkpCisgICAgICB7IERCR01TRyhTRU5ULCBwLCBzb2FwX2Jsb2NrX3NpemUoc29hcCkpOworICAgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnNlbmQoc29hcCwgcCwgc29hcF9ibG9ja19zaXplKHNvYXApKSkpCisgICAgICAgIHsgc29hcF9lbmRfYmxvY2soc29hcCk7CisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICB9CisgICAgICB9CisgICAgICBzb2FwX2VuZF9ibG9jayhzb2FwKTsKKyAgICB9CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgICAgZWxzZSBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKQorICAgIHsgREJHTVNHKFNFTlQsICJcclxuMFxyXG5cclxuIiwgNyk7CisgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnNlbmQoc29hcCwgIlxyXG4wXHJcblxyXG4iLCA3KSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisjZW5kaWYKKyAgfQorI2lmZGVmIFdJVEhfVENQRklOCisjaWZkZWYgV0lUSF9PUEVOU1NMCisgIGlmICghc29hcC0+c3NsICYmIHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkgJiYgIXNvYXAtPmtlZXBfYWxpdmUgJiYgIShzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICBzb2FwLT5mc2h1dGRvd25zb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgMSk7IC8qIFNlbmQgVENQIEZJTiAqLworI2Vsc2UKKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkgJiYgIXNvYXAtPmtlZXBfYWxpdmUgJiYgIShzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICBzb2FwLT5mc2h1dGRvd25zb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgMSk7IC8qIFNlbmQgVENQIEZJTiAqLworI2VuZGlmCisjZW5kaWYKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgb2Ygc2VuZCBwaGFzZVxuIikpOworICBzb2FwLT5vbW9kZSAmPSB+U09BUF9YTUxfU0VDOworICBzb2FwLT5jb3VudCA9IDA7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0VORDsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW5kX3JlY3Yoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPnBhcnQgPSBTT0FQX0VORDsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkgJiYgc29hcF9nZXRkaW1lKHNvYXApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgc29hcC0+ZGltZS5saXN0ID0gc29hcC0+ZGltZS5maXJzdDsKKyAgc29hcC0+ZGltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGFzdCA9IE5VTEw7CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01JTUUpICYmIHNvYXBfZ2V0bWltZShzb2FwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHNvYXAtPm1pbWUubGlzdCA9IHNvYXAtPm1pbWUuZmlyc3Q7CisgIHNvYXAtPm1pbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmxhc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gTlVMTDsKKyNlbmRpZgorICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIG9mIHJlY2VpdmUgbWVzc2FnZSBva1xuIikpOworI2lmZGVmIFdJVEhfWkxJQgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIpCisgIHsgc29hcC0+bW9kZSAmPSB+U09BUF9FTkNfWkxJQjsKKyAgICBtZW1jcHkoc29hcC0+YnVmLCBzb2FwLT56X2J1ZiwgU09BUF9CVUZMRU4pOworICAgIHNvYXAtPmJ1ZmlkeCA9IChjaGFyKilzb2FwLT5kX3N0cmVhbS5uZXh0X2luIC0gc29hcC0+el9idWY7CisgICAgc29hcC0+YnVmbGVuID0gc29hcC0+el9idWZsZW47CisgICAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9OT05FOworICAgIGlmIChpbmZsYXRlRW5kKCZzb2FwLT5kX3N0cmVhbSkgIT0gWl9PSykKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyNpZmRlZiBXSVRIX0daSVAKKyAgICBpZiAoc29hcC0+emxpYl9pbiA9PSBTT0FQX1pMSUJfR1pJUCkKKyAgICB7IHNvYXBfd2NoYXIgYzsKKyAgICAgIHNob3J0IGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgeyBpZiAoKGludCkoYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKSkgPT0gRU9GKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgICAgICBzb2FwLT56X2J1ZltpXSA9IChjaGFyKWM7CisgICAgICB9CisgICAgICBpZiAoc29hcC0+el9jcmMgIT0gKCh1TG9uZykodW5zaWduZWQgY2hhcilzb2FwLT56X2J1ZlswXSB8ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbMV0gPDwgOCkgfCAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzJdIDw8IDE2KSB8ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbM10gPDwgMjQpKSkKKyAgICAgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkd6aXAgZXJyb3I6IGNyYyBjaGVjayBmYWlsZWQsIG1lc3NhZ2UgY29ycnVwdGVkPyAoY3JjMzI9JWx1KVxuIiwgKHVuc2lnbmVkIGxvbmcpc29hcC0+el9jcmMpKTsKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgfQorICAgICAgaWYgKHNvYXAtPmRfc3RyZWFtLnRvdGFsX291dCAhPSAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzRdIHwgKCh1TG9uZykodW5zaWduZWQgY2hhcilzb2FwLT56X2J1Zls1XSA8PCA4KSB8ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbNl0gPDwgMTYpIHwgKCh1TG9uZykodW5zaWduZWQgY2hhcilzb2FwLT56X2J1Zls3XSA8PCAyNCkpKQorICAgICAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiR3ppcCBlcnJvcjogaW5jb3JyZWN0IG1lc3NhZ2UgbGVuZ3RoXG4iKSk7CisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgfQorI2VuZGlmCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgICAgd2hpbGUgKChpbnQpc29hcF9nZXRjaGFyKHNvYXApICE9IEVPRikgLyogYWR2YW5jZSB0byBsYXN0IGNodW5rICovCisgICAgICA7CisgIGlmIChzb2FwLT5mZGlzY29ubmVjdCAmJiAoc29hcC0+ZXJyb3IgPSBzb2FwLT5mZGlzY29ubmVjdChzb2FwKSkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgcmV0dXJuIHNvYXBfcmVzb2x2ZShzb2FwKTsKKyNlbHNlCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT54bGlzdCkKKyAgeyBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX01JTUVfSFJFRjsKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0RJTUVfSFJFRjsKKyAgfQorI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2ZyZWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHN0cnVjdCBOYW1lc3BhY2UgKm5zOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWUgbmFtZXNwYWNlIHN0YWNrXG4iKSk7CisgIHdoaWxlIChzb2FwLT5ubGlzdCkKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnAgPSBzb2FwLT5ubGlzdC0+bmV4dDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+bmxpc3QpOworICAgIHNvYXAtPm5saXN0ID0gbnA7CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIGFueSByZW1haW5pbmcgdGVtcCBibG9ja3NcbiIpKTsKKyAgd2hpbGUgKHNvYXAtPmJsaXN0KQorICAgIHNvYXBfZW5kX2Jsb2NrKHNvYXApOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWUgYXR0cmlidXRlIHN0b3JhZ2VcbiIpKTsKKyAgd2hpbGUgKHNvYXAtPmF0dHJpYnV0ZXMpCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfYXR0cmlidXRlICp0cCA9IHNvYXAtPmF0dHJpYnV0ZXMtPm5leHQ7CisgICAgaWYgKHNvYXAtPmF0dHJpYnV0ZXMtPnZhbHVlKQorICAgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPmF0dHJpYnV0ZXMtPnZhbHVlKTsKKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+YXR0cmlidXRlcyk7CisgICAgc29hcC0+YXR0cmlidXRlcyA9IHRwOworICB9CisjaWZkZWYgV0lUSF9GQVNUCisgIGlmIChzb2FwLT5sYWJidWYpCisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPmxhYmJ1Zik7CisgIHNvYXAtPmxhYmJ1ZiA9IE5VTEw7CisgIHNvYXAtPmxhYmxlbiA9IDA7CisgIHNvYXAtPmxhYmlkeCA9IDA7CisjZW5kaWYKKyAgbnMgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzOworICBpZiAobnMpCisgIHsgZm9yICg7IG5zLT5pZDsgbnMrKykKKyAgICB7IGlmIChucy0+b3V0KQorICAgICAgeyBpZiAoc29hcC0+ZW5jb2RpbmdTdHlsZSA9PSBucy0+b3V0KQorICAgICAgICAgIHNvYXAtPmVuY29kaW5nU3R5bGUgPSBTT0FQX1NUUl9FT1M7CisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBucy0+b3V0KTsKKyAgICAgICAgbnMtPm91dCA9IE5VTEw7CisgICAgICB9CisgICAgICBpZiAoc29hcC0+ZW5jb2RpbmdTdHlsZSA9PSBucy0+bnMpCisgICAgICAgIHNvYXAtPmVuY29kaW5nU3R5bGUgPSBTT0FQX1NUUl9FT1M7CisgICAgfQorICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzKTsKKyAgICBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzID0gTlVMTDsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICB3aGlsZSAoc29hcC0+eGxpc3QpCisgIHsgc3RydWN0IHNvYXBfeGxpc3QgKnhwID0gc29hcC0+eGxpc3QtPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPnhsaXN0KTsKKyAgICBzb2FwLT54bGlzdCA9IHhwOworICB9CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgIHNvYXBfZnJlZV9waHQoc29hcCk7CisgIHNvYXBfZnJlZV9paHQoc29hcCk7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK3N0YXRpYyB2b2lkCitzb2FwX2luaXRfbG9ncyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBTT0FQX01BWExPR1M7IGkrKykKKyAgeyBzb2FwLT5sb2dmaWxlW2ldID0gTlVMTDsKKyAgICBzb2FwLT5mZGVidWdbaV0gPSBOVUxMOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAhZGVmaW5lZChXSVRIX0xFQU4pIHx8IGRlZmluZWQoU09BUF9ERUJVRykKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfb3Blbl9sb2dmaWxlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgaSkKK3sgaWYgKHNvYXAtPmxvZ2ZpbGVbaV0pCisgICAgc29hcC0+ZmRlYnVnW2ldID0gZm9wZW4oc29hcC0+bG9nZmlsZVtpXSwgaSA8IDIgPyAiYWIiIDogImEiKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK3N0YXRpYyB2b2lkCitzb2FwX2Nsb3NlX2xvZ2ZpbGUoc3RydWN0IHNvYXAgKnNvYXAsIGludCBpKQoreyBpZiAoc29hcC0+ZmRlYnVnW2ldKQorICB7IGZjbG9zZShzb2FwLT5mZGVidWdbaV0pOworICAgIHNvYXAtPmZkZWJ1Z1tpXSA9IE5VTEw7CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfY2xvc2VfbG9nZmlsZXMoc3RydWN0IHNvYXAgKnNvYXApCit7IGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9NQVhMT0dTOyBpKyspCisgICAgc29hcF9jbG9zZV9sb2dmaWxlKHNvYXAsIGkpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworc3RhdGljIHZvaWQKK3NvYXBfc2V0X2xvZ2ZpbGUoc3RydWN0IHNvYXAgKnNvYXAsIGludCBpLCBjb25zdCBjaGFyICpsb2dmaWxlKQoreyBjaGFyICpzID0gTlVMTDsKKyAgc29hcF9jbG9zZV9sb2dmaWxlKHNvYXAsIGkpOworICBpZiAoc29hcC0+bG9nZmlsZVtpXSkKKyAgICBTT0FQX0ZSRUUoc29hcCwgKHZvaWQqKXNvYXAtPmxvZ2ZpbGVbaV0pOworICBpZiAobG9nZmlsZSkKKyAgICBpZiAoKHMgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKGxvZ2ZpbGUpICsgMSkpKQorICAgICAgc3RyY3B5KHMsIGxvZ2ZpbGUpOworICBzb2FwLT5sb2dmaWxlW2ldID0gczsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X3JlY3ZfbG9nZmlsZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbG9nZmlsZSkKK3sgc29hcF9zZXRfbG9nZmlsZShzb2FwLCBTT0FQX0lOREVYX1JFQ1YsIGxvZ2ZpbGUpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfc2VudF9sb2dmaWxlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpsb2dmaWxlKQoreyBzb2FwX3NldF9sb2dmaWxlKHNvYXAsIFNPQVBfSU5ERVhfU0VOVCwgbG9nZmlsZSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF90ZXN0X2xvZ2ZpbGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmxvZ2ZpbGUpCit7IHNvYXBfc2V0X2xvZ2ZpbGUoc29hcCwgU09BUF9JTkRFWF9URVNULCBsb2dmaWxlKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwKgorU09BUF9GTUFDMgorc29hcF9jb3B5KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZXR1cm4gc29hcF9jb3B5X2NvbnRleHQoKHN0cnVjdCBzb2FwKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2FwKSksIHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc3RydWN0IHNvYXAqCitTT0FQX0ZNQUMyCitzb2FwX2NvcHlfY29udGV4dChzdHJ1Y3Qgc29hcCAqY29weSwgc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwX2NoZWNrX3N0YXRlKHNvYXApKQorICAgIHJldHVybiBOVUxMOworICBpZiAoY29weSkKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnA7CisgICAgbWVtY3B5KGNvcHksIHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcCkpOworICAgIGNvcHktPnN0YXRlID0gU09BUF9DT1BZOworICAgIGNvcHktPnVzZXIgPSBOVUxMOworICAgIGNvcHktPmVycm9yID0gU09BUF9PSzsKKyAgICBjb3B5LT51c2VyaWQgPSBOVUxMOworICAgIGNvcHktPnBhc3N3ZCA9IE5VTEw7CisgICAgY29weS0+bmxpc3QgPSBOVUxMOworICAgIGNvcHktPmJsaXN0ID0gTlVMTDsKKyAgICBjb3B5LT5jbGlzdCA9IE5VTEw7CisgICAgY29weS0+YWxpc3QgPSBOVUxMOworICAgIGNvcHktPmF0dHJpYnV0ZXMgPSBOVUxMOworI2lmZGVmIFdJVEhfRkFTVAorICAgIGNvcHktPmxhYmJ1ZiA9IE5VTEw7CisgICAgY29weS0+bGFibGVuID0gMDsKKyAgICBjb3B5LT5sYWJpZHggPSAwOworI2VuZGlmCisjaWZkZWYgU09BUF9ERUJVRworICAgIHNvYXBfaW5pdF9taHQoY29weSk7CisjZW5kaWYKKyAgICBjb3B5LT5sb2NhbF9uYW1lc3BhY2VzID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgICAgc29hcF9pbml0X2lodChjb3B5KTsKKyAgICBzb2FwX2luaXRfcGh0KGNvcHkpOworI2VuZGlmCisgICAgY29weS0+aGVhZGVyID0gTlVMTDsKKyAgICBjb3B5LT5mYXVsdCA9IE5VTEw7CisgICAgY29weS0+YWN0aW9uID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisjaWZkZWYgV0lUSF9DT09LSUVTCisgICAgY29weS0+Y29va2llcyA9IHNvYXBfY29weV9jb29raWVzKGNvcHkpOworI2Vsc2UKKyAgICBjb3B5LT5jb29raWVzID0gTlVMTDsKKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgU09BUF9ERUJVRworICAgIHNvYXBfaW5pdF9sb2dzKGNvcHkpOworICAgIHNvYXBfc2V0X3JlY3ZfbG9nZmlsZShjb3B5LCBzb2FwLT5sb2dmaWxlW1NPQVBfSU5ERVhfUkVDVl0pOworICAgIHNvYXBfc2V0X3NlbnRfbG9nZmlsZShjb3B5LCBzb2FwLT5sb2dmaWxlW1NPQVBfSU5ERVhfU0VOVF0pOworICAgIHNvYXBfc2V0X3Rlc3RfbG9nZmlsZShjb3B5LCBzb2FwLT5sb2dmaWxlW1NPQVBfSU5ERVhfVEVTVF0pOworI2VuZGlmCisgICAgY29weS0+cGx1Z2lucyA9IE5VTEw7CisgICAgZm9yIChwID0gc29hcC0+cGx1Z2luczsgcDsgcCA9IHAtPm5leHQpCisgICAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnEgPSAoc3RydWN0IHNvYXBfcGx1Z2luKilTT0FQX01BTExPQyhjb3B5LCBzaXplb2Yoc3RydWN0IHNvYXBfcGx1Z2luKSk7CisgICAgICBpZiAoIXEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5aW5nIHBsdWdpbiAnJXMnXG4iLCBwLT5pZCkpOworICAgICAgKnEgPSAqcDsKKyAgICAgIGlmIChwLT5mY29weSAmJiAoc29hcC0+ZXJyb3IgPSBwLT5mY29weShjb3B5LCBxLCBwKSkpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IGNvcHkgcGx1Z2luICclcydcbiIsIHAtPmlkKSk7CisgICAgICAgIFNPQVBfRlJFRShjb3B5LCBxKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICBxLT5uZXh0ID0gY29weS0+cGx1Z2luczsKKyAgICAgIGNvcHktPnBsdWdpbnMgPSBxOworICAgIH0KKyAgfQorICBlbHNlCisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgcmV0dXJuIGNvcHk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2luaXQoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPnN0YXRlID0gU09BUF9JTklUOworICBzb2FwLT52ZXJzaW9uID0gMDsKKyAgc29hcF9pbW9kZShzb2FwLCBTT0FQX0lPX0RFRkFVTFQpOworICBzb2FwX29tb2RlKHNvYXAsIFNPQVBfSU9fREVGQVVMVCk7CisgIHNvYXAtPnBsdWdpbnMgPSBOVUxMOworICBzb2FwLT51c2VyID0gTlVMTDsKKyAgc29hcC0+dXNlcmlkID0gTlVMTDsKKyAgc29hcC0+cGFzc3dkID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyAgc29hcC0+ZnBvc3QgPSBodHRwX3Bvc3Q7CisgIHNvYXAtPmZnZXQgPSBodHRwX2dldDsKKyAgc29hcC0+ZmZvcm0gPSBOVUxMOworICBzb2FwLT5mcG9zdGhkciA9IGh0dHBfcG9zdF9oZWFkZXI7CisgIHNvYXAtPmZyZXNwb25zZSA9IGh0dHBfcmVzcG9uc2U7CisgIHNvYXAtPmZwYXJzZSA9IGh0dHBfcGFyc2U7CisgIHNvYXAtPmZwYXJzZWhkciA9IGh0dHBfcGFyc2VfaGVhZGVyOworI2VuZGlmCisgIHNvYXAtPmZjb25uZWN0ID0gTlVMTDsKKyAgc29hcC0+ZmRpc2Nvbm5lY3QgPSBOVUxMOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9JUFY2CisgIHNvYXAtPmZyZXNvbHZlID0gdGNwX2dldGhvc3Q7CisjZWxzZQorICBzb2FwLT5mcmVzb2x2ZSA9IE5VTEw7CisjZW5kaWYKKyAgc29hcC0+ZmFjY2VwdCA9IHRjcF9hY2NlcHQ7CisgIHNvYXAtPmZvcGVuID0gdGNwX2Nvbm5lY3Q7CisgIHNvYXAtPmZjbG9zZSA9IHRjcF9kaXNjb25uZWN0OworICBzb2FwLT5mY2xvc2Vzb2NrZXQgPSB0Y3BfY2xvc2Vzb2NrZXQ7CisgIHNvYXAtPmZzaHV0ZG93bnNvY2tldCA9IHRjcF9zaHV0ZG93bnNvY2tldDsKKyAgc29hcC0+ZnNlbmQgPSBmc2VuZDsKKyAgc29hcC0+ZnJlY3YgPSBmcmVjdjsKKyAgc29hcC0+ZnBvbGwgPSBzb2FwX3BvbGw7CisjZWxzZQorICBzb2FwLT5mb3BlbiA9IE5VTEw7CisgIHNvYXAtPmZjbG9zZSA9IE5VTEw7CisgIHNvYXAtPmZwb2xsID0gTlVMTDsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzb2FwLT5mcHJlcGFyZWluaXQgPSBOVUxMOworICBzb2FwLT5mcHJlcGFyZXNlbmQgPSBOVUxMOworICBzb2FwLT5mcHJlcGFyZXJlY3YgPSBOVUxMOworICBzb2FwLT5mcHJlcGFyZWZpbmFsID0gTlVMTDsKKyNlbmRpZgorICBzb2FwLT5mc2V0ZXJyb3IgPSBOVUxMOworICBzb2FwLT5maWdub3JlID0gTlVMTDsKKyAgc29hcC0+ZnNlcnZlbG9vcCA9IE5VTEw7CisgIHNvYXAtPmZwbHVnaW4gPSBmcGx1Z2luOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzb2FwLT5mZGltZXJlYWRvcGVuID0gTlVMTDsKKyAgc29hcC0+ZmRpbWV3cml0ZW9wZW4gPSBOVUxMOworICBzb2FwLT5mZGltZXJlYWRjbG9zZSA9IE5VTEw7CisgIHNvYXAtPmZkaW1ld3JpdGVjbG9zZSA9IE5VTEw7CisgIHNvYXAtPmZkaW1lcmVhZCA9IE5VTEw7CisgIHNvYXAtPmZkaW1ld3JpdGUgPSBOVUxMOworI2VuZGlmCisgIHNvYXAtPmZsb2F0X2Zvcm1hdCA9ICIlLjhnIjsgLyogLjggcHJlc2VydmVzIHNpbmdsZSBGUCBwcmVjaXNpb24gYXMgbXVjaCBhcyBwb3NzaWJsZSwgYnV0IG1pZ2h0IG5vdCBiZSB2ZXJ5IGVmZmljaWVudCAqLworICBzb2FwLT5kb3VibGVfZm9ybWF0ID0gIiUuMTdsZyI7IC8qIC4xNyBwcmVzZXJ2ZXMgZG91YmxlIEZQIHByZWNpc2lvbiBhcyBtdWNoIGFzIHBvc3NpYmxlLCBidXQgbWlnaHQgbm90IGJlIHZlcnkgZWZmaWNpZW50ICovCisgIHNvYXAtPmRpbWVfaWRfZm9ybWF0ID0gImNpZDppZCVkIjsgLyogZGVmYXVsdCBESU1FIGlkIGZvcm1hdCAqLworICBzb2FwLT5odHRwX3ZlcnNpb24gPSAiMS4xIjsKKyAgc29hcC0+YWN0b3IgPSBOVUxMOworICBzb2FwLT5tYXhfa2VlcF9hbGl2ZSA9IFNPQVBfTUFYS0VFUEFMSVZFOworICBzb2FwLT5rZWVwX2FsaXZlID0gMDsKKyAgc29hcC0+cmVjdl90aW1lb3V0ID0gMDsKKyAgc29hcC0+c2VuZF90aW1lb3V0ID0gMDsKKyAgc29hcC0+Y29ubmVjdF90aW1lb3V0ID0gMDsKKyAgc29hcC0+YWNjZXB0X3RpbWVvdXQgPSAwOworICBzb2FwLT5zb2NrZXRfZmxhZ3MgPSAwOworICBzb2FwLT5jb25uZWN0X2ZsYWdzID0gMDsKKyAgc29hcC0+YmluZF9mbGFncyA9IDA7CisgIHNvYXAtPmFjY2VwdF9mbGFncyA9IDA7CisgIHNvYXAtPmlwID0gMDsKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgc29hcC0+bGFiYnVmID0gTlVMTDsKKyAgc29hcC0+bGFibGVuID0gMDsKKyAgc29hcC0+bGFiaWR4ID0gMDsKKyNlbmRpZgorICBzb2FwLT5lbmNvZGluZ1N0eWxlID0gU09BUF9TVFJfRU9TOworI2lmbmRlZiBXSVRIX05PTkFNRVNQQUNFUworICBzb2FwLT5uYW1lc3BhY2VzID0gbmFtZXNwYWNlczsKKyNlbHNlCisgIHNvYXAtPm5hbWVzcGFjZXMgPSBOVUxMOworI2VuZGlmCisgIHNvYXAtPmxvY2FsX25hbWVzcGFjZXMgPSBOVUxMOworICBzb2FwLT5ubGlzdCA9IE5VTEw7CisgIHNvYXAtPmJsaXN0ID0gTlVMTDsKKyAgc29hcC0+Y2xpc3QgPSBOVUxMOworICBzb2FwLT5hbGlzdCA9IE5VTEw7CisgIHNvYXAtPmF0dHJpYnV0ZXMgPSBOVUxMOworICBzb2FwLT5oZWFkZXIgPSBOVUxMOworICBzb2FwLT5mYXVsdCA9IE5VTEw7CisgIHNvYXAtPm1hc3RlciA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIHNvYXAtPnNvY2tldCA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIHNvYXAtPm9zID0gTlVMTDsKKyAgc29hcC0+aXMgPSBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzb2FwLT5kb20gPSBOVUxMOworICBzb2FwLT5kaW1lLmxpc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5sYXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5saXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuYm91bmRhcnkgPSBOVUxMOworICBzb2FwLT5taW1lLnN0YXJ0ID0gTlVMTDsKKyAgc29hcC0+eGxpc3QgPSBOVUxMOworI2VuZGlmCisjaWZuZGVmIFVOREVSX0NFCisgIHNvYXAtPnJlY3ZmZCA9IDA7CisgIHNvYXAtPnNlbmRmZCA9IDE7CisjZWxzZQorICBzb2FwLT5yZWN2ZmQgPSBzdGRpbjsKKyAgc29hcC0+c2VuZGZkID0gc3Rkb3V0OworI2VuZGlmIAorICBzb2FwLT5ob3N0WzBdID0gJ1wwJzsKKyAgc29hcC0+cG9ydCA9IDA7CisgIHNvYXAtPmFjdGlvbiA9IE5VTEw7CisgIHNvYXAtPnByb3h5X2hvc3QgPSBOVUxMOworICBzb2FwLT5wcm94eV9wb3J0ID0gODA4MDsKKyAgc29hcC0+cHJveHlfdXNlcmlkID0gTlVMTDsKKyAgc29hcC0+cHJveHlfcGFzc3dkID0gTlVMTDsKKyAgc29hcC0+YXV0aHJlYWxtID0gTlVMTDsKKyAgc29hcC0+cHJvbG9nID0gTlVMTDsKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgaWYgKCFzc2xfaW5pdF9kb25lKQorICAgIHNvYXBfc3NsX2luaXQoKTsKKyAgc29hcC0+ZnNzbGF1dGggPSBzc2xfYXV0aF9pbml0OworICBzb2FwLT5mc3NsdmVyaWZ5ID0gc3NsX3ZlcmlmeV9jYWxsYmFjazsKKyAgc29hcC0+YmlvID0gTlVMTDsKKyAgc29hcC0+c3NsID0gTlVMTDsKKyAgc29hcC0+Y3R4ID0gTlVMTDsKKyAgc29hcC0+cmVxdWlyZV9zZXJ2ZXJfYXV0aCA9IDA7CisgIHNvYXAtPnJlcXVpcmVfY2xpZW50X2F1dGggPSAwOworICBzb2FwLT5yc2EgPSAwOworICBzb2FwLT5rZXlmaWxlID0gTlVMTDsKKyAgc29hcC0+cGFzc3dvcmQgPSBOVUxMOworICBzb2FwLT5kaGZpbGUgPSBOVUxMOworICBzb2FwLT5jYWZpbGUgPSBOVUxMOworICBzb2FwLT5jYXBhdGggPSBOVUxMOworICBzb2FwLT5jcmxmaWxlID0gTlVMTDsKKyAgc29hcC0+cmFuZGZpbGUgPSBOVUxMOworICBzb2FwLT5zZXNzaW9uID0gTlVMTDsKKyNlbmRpZgorI2lmZGVmIFdJVEhfWkxJQgorICBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX05PTkU7CisgIHNvYXAtPnpsaWJfaW4gPSBTT0FQX1pMSUJfTk9ORTsKKyAgc29hcC0+emxpYl9vdXQgPSBTT0FQX1pMSUJfTk9ORTsKKyAgc29hcC0+ZF9zdHJlYW0uemFsbG9jID0gTlVMTDsKKyAgc29hcC0+ZF9zdHJlYW0uemZyZWUgPSBOVUxMOworICBzb2FwLT5kX3N0cmVhbS5vcGFxdWUgPSBOVUxMOworICBzb2FwLT56X2xldmVsID0gNjsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgc29hcC0+YzE0bmluY2x1ZGUgPSBOVUxMOworICBzb2FwLT5jMTRuZXhjbHVkZSA9IE5VTEw7CisgIHNvYXAtPmNvb2tpZXMgPSBOVUxMOworICBzb2FwLT5jb29raWVfZG9tYWluID0gTlVMTDsKKyAgc29hcC0+Y29va2llX3BhdGggPSBOVUxMOworICBzb2FwLT5jb29raWVfbWF4ID0gMzI7CisjZW5kaWYKKyNpZmRlZiBTT0FQX0RFQlVHCisgIHNvYXBfaW5pdF9taHQoc29hcCk7CisgIHNvYXBfaW5pdF9sb2dzKHNvYXApOworICBzb2FwX3NldF9yZWN2X2xvZ2ZpbGUoc29hcCwgIlJFQ1YubG9nIik7CisgIHNvYXBfc2V0X3NlbnRfbG9nZmlsZShzb2FwLCAiU0VOVC5sb2ciKTsKKyAgc29hcF9zZXRfdGVzdF9sb2dmaWxlKHNvYXAsIE5VTEwpOworI2VuZGlmCisjaWZkZWYgV01XX1JQTV9JTworICBzb2FwLT5ycG1yZXFpZCA9IE5VTEw7CisjZW5kaWYKKyNpZmRlZiBQQUxNCisgIHBhbG1OZXRMaWJPcGVuKCk7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgIHNvYXBfaW5pdF9paHQoc29hcCk7CisgIHNvYXBfaW5pdF9waHQoc29hcCk7CisjZW5kaWYKKyAgc29hcF9iZWdpbihzb2FwKTsKKyNpZmRlZiBTT0FQX0RFQlVHCisgIHNvYXBfc2V0X3Rlc3RfbG9nZmlsZShzb2FwLCAiVEVTVC5sb2ciKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9pbml0MShzdHJ1Y3Qgc29hcCAqc29hcCwgc29hcF9tb2RlIG1vZGUpCit7IHNvYXBfaW5pdDIoc29hcCwgbW9kZSwgbW9kZSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2luaXQyKHN0cnVjdCBzb2FwICpzb2FwLCBzb2FwX21vZGUgaW1vZGUsIHNvYXBfbW9kZSBvbW9kZSkKK3sgc29hcF9pbml0KHNvYXApOworICBzb2FwX2ltb2RlKHNvYXAsIGltb2RlKTsKKyAgc29hcF9vbW9kZShzb2FwLCBvbW9kZSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2JlZ2luKHN0cnVjdCBzb2FwICpzb2FwKQoreyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluaXRpYWxpemluZ1xuIikpOworICBpZiAoIXNvYXAtPmtlZXBfYWxpdmUpCisgIHsgc29hcC0+YnVmbGVuID0gMDsKKyAgICBzb2FwLT5idWZpZHggPSAwOworICB9CisgIHNvYXAtPmtlZXBfYWxpdmUgPSAoKChzb2FwLT5pbW9kZSB8IHNvYXAtPm9tb2RlKSAmIFNPQVBfSU9fS0VFUEFMSVZFKSAhPSAwKTsKKyAgc29hcC0+bnVsbCA9IDA7CisgIHNvYXAtPnBvc2l0aW9uID0gMDsKKyAgc29hcC0+ZW5jb2RpbmcgPSAwOworICBzb2FwLT5tdXN0VW5kZXJzdGFuZCA9IDA7CisgIHNvYXAtPm1vZGUgPSAwOworICBzb2FwLT5ucyA9IDA7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0VORDsKKyAgc29hcC0+YWxsb2NlZCA9IDA7CisgIHNvYXAtPmNvdW50ID0gMDsKKyAgc29hcC0+bGVuZ3RoID0gMDsKKyAgc29hcC0+Y2RhdGEgPSAwOworICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIHNvYXAtPnBlZWtlZCA9IDA7CisgIHNvYXAtPmFoZWFkID0gMDsKKyAgc29hcC0+aWRudW0gPSAwOworICBzb2FwLT5sZXZlbCA9IDA7CisgIHNvYXAtPmVuZHBvaW50WzBdID0gJ1wwJzsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcC0+ZGltZS5jaHVua3NpemUgPSAwOworICBzb2FwLT5kaW1lLmJ1ZmxlbiA9IDA7CisjZW5kaWYKKyAgc29hcF9mcmVlKHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9lbmQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2NsaXN0ICpjcDsKKyAgaWYgKHNvYXBfY2hlY2tfc3RhdGUoc29hcCkpCisgICAgcmV0dXJuOworICBzb2FwX2ZyZWUoc29hcCk7CisgIHNvYXBfZGVhbGxvYyhzb2FwLCBOVUxMKTsKKyAgd2hpbGUgKHNvYXAtPmNsaXN0KQorICB7IGNwID0gc29hcC0+Y2xpc3QtPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPmNsaXN0KTsKKyAgICBzb2FwLT5jbGlzdCA9IGNwOworICB9CisgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworI2lmZGVmIFNPQVBfREVCVUcKKyAgc29hcF9jbG9zZV9sb2dmaWxlcyhzb2FwKTsKKyNlbmRpZgorI2lmZGVmIFBBTE0KKyAgcGFsbU5ldExpYkNsb3NlKCk7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZXRfbmFtZXNwYWNlcyhzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IE5hbWVzcGFjZSAqcCkKK3sgcmVnaXN0ZXIgc3RydWN0IE5hbWVzcGFjZSAqbnMgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnAsICpucSwgKm5yOworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgbGV2ZWwgPSBzb2FwLT5sZXZlbDsKKyAgc29hcC0+bmFtZXNwYWNlcyA9IHA7CisgIHNvYXAtPmxvY2FsX25hbWVzcGFjZXMgPSBOVUxMOworICBzb2FwX3NldF9sb2NhbF9uYW1lc3BhY2VzKHNvYXApOworICAvKiByZXZlcnNlIHRoZSBuYW1lc3BhY2UgbGlzdCAqLworICBucCA9IHNvYXAtPm5saXN0OworICBzb2FwLT5ubGlzdCA9IE5VTEw7CisgIGlmIChucCkKKyAgeyBucSA9IG5wLT5uZXh0OworICAgIG5wLT5uZXh0ID0gTlVMTDsKKyAgICB3aGlsZSAobnEpCisgICAgeyBuciA9IG5xLT5uZXh0OworICAgICAgbnEtPm5leHQgPSBucDsKKyAgICAgIG5wID0gbnE7CisgICAgICBucSA9IG5yOworICAgIH0KKyAgfQorICAvKiB0aGVuIHB1c2ggb24gbmV3IHN0YWNrICovCisgIHdoaWxlIChucCkKKyAgeyByZWdpc3RlciBjb25zdCBjaGFyICpzOworICAgIHNvYXAtPmxldmVsID0gbnAtPmxldmVsOyAvKiBwcmVzZXJ2ZSBlbGVtZW50IG5lc3RpbmcgbGV2ZWwgKi8KKyAgICBzID0gbnAtPm5zOworICAgIGlmICghcyAmJiBucC0+aW5kZXggPj0gMCAmJiBucykKKyAgICB7IHMgPSBuc1tucC0+aW5kZXhdLm91dDsKKyAgICAgIGlmICghcykKKyAgICAgICAgcyA9IG5zW25wLT5pbmRleF0ubnM7CisgICAgfQorICAgIGlmIChzICYmIHNvYXBfcHVzaF9uYW1lc3BhY2Uoc29hcCwgbnAtPmlkLCBzKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBucSA9IG5wOworICAgIG5wID0gbnAtPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIG5xKTsKKyAgfQorICBpZiAobnMpCisgIHsgcmVnaXN0ZXIgaW50IGk7CisgICAgZm9yIChpID0gMDsgbnNbaV0uaWQ7IGkrKykKKyAgICB7IGlmIChuc1tpXS5vdXQpCisgICAgICB7IFNPQVBfRlJFRShzb2FwLCBuc1tpXS5vdXQpOworICAgICAgICBuc1tpXS5vdXQgPSBOVUxMOworICAgICAgfQorICAgIH0KKyAgICBTT0FQX0ZSRUUoc29hcCwgbnMpOworICB9CisgIHNvYXAtPmxldmVsID0gbGV2ZWw7IC8qIHJlc3RvcmUgbGV2ZWwgKi8KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9sb2NhbF9uYW1lc3BhY2VzKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcC0+bmFtZXNwYWNlcyAmJiAhc29hcC0+bG9jYWxfbmFtZXNwYWNlcykKKyAgeyByZWdpc3RlciBjb25zdCBzdHJ1Y3QgTmFtZXNwYWNlICpuczE7CisgICAgcmVnaXN0ZXIgc3RydWN0IE5hbWVzcGFjZSAqbnMyOworICAgIHJlZ2lzdGVyIHNpemVfdCBuID0gMTsKKyAgICBmb3IgKG5zMSA9IHNvYXAtPm5hbWVzcGFjZXM7IG5zMS0+aWQ7IG5zMSsrKQorICAgICAgbisrOworICAgIG4gKj0gc2l6ZW9mKHN0cnVjdCBOYW1lc3BhY2UpOworICAgIG5zMiA9IChzdHJ1Y3QgTmFtZXNwYWNlKilTT0FQX01BTExPQyhzb2FwLCBuKTsKKyAgICBpZiAobnMyKQorICAgIHsgbWVtY3B5KG5zMiwgc29hcC0+bmFtZXNwYWNlcywgbik7CisgICAgICBpZiAobnMyWzBdLm5zKQorICAgICAgeyBpZiAoIXN0cmNtcChuczJbMF0ubnMsIHNvYXBfZW52MSkpCisgICAgICAgICAgc29hcC0+dmVyc2lvbiA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzb2FwLT52ZXJzaW9uID0gMjsKKyAgICAgIH0KKyAgICAgIHNvYXAtPmxvY2FsX25hbWVzcGFjZXMgPSBuczI7CisgICAgfQorICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY29uc3QgY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3N0cnNlYXJjaChjb25zdCBjaGFyICpiaWcsIGNvbnN0IGNoYXIgKmxpdHRsZSkKK3sgc2l6ZV90IG4gPSBzdHJsZW4obGl0dGxlKTsKKyAgY29uc3QgY2hhciAqcyA9IGJpZzsKKyAgd2hpbGUgKHMpIAorICB7IGlmICghc3RybmNtcChzLCBsaXR0bGUsIG4pICYmIChzW25dID09ICdcMCcgfHwgc1tuXSA9PSAnICcpKQorICAgICAgcmV0dXJuIHM7CisgICAgcyA9IHN0cmNocihzLCAnICcpOworICAgIGlmIChzKQorICAgICAgcysrOworICB9CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgc3RydWN0IHNvYXBfbmxpc3QgKgorc29hcF9sb29rdXBfbnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc2l6ZV90IG4pCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucDsKKyAgZm9yIChucCA9IHNvYXAtPm5saXN0OyBucDsgbnAgPSBucC0+bmV4dCkKKyAgeyBpZiAoIXN0cm5jbXAobnAtPmlkLCB0YWcsIG4pICYmICFucC0+aWRbbl0pCisgICAgICByZXR1cm4gbnA7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgc3RydWN0IHNvYXBfbmxpc3QgKgorc29hcF9wdXNoX25zKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqbnMsIHNob3J0IHV0aWxpemVkKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnA7CisgIHNpemVfdCBuLCBrOworICBpZiAoc29hcF9zdHJzZWFyY2goc29hcC0+YzE0bmV4Y2x1ZGUsIGlkKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQdXNoIG5hbWVzcGFjZSBiaW5kaW5nIChsZXZlbD0ldSkgJyVzJyAnJXMnXG4iLCBzb2FwLT5sZXZlbCwgaWQsIG5zP25zOiIiKSk7CisgIGlmICghdXRpbGl6ZWQpCisgIHsgZm9yIChucCA9IHNvYXAtPm5saXN0OyBucDsgbnAgPSBucC0+bmV4dCkKKyAgICB7IGlmICghc3RyY21wKG5wLT5pZCwgaWQpICYmICghbnAtPm5zIHx8ICFzdHJjbXAobnAtPm5zLCBucykpKQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKG5wKQorICAgIHsgaWYgKG5wLT5pbmRleCA9PSAxKQorICAgICAgICB1dGlsaXplZCA9IG5wLT5pbmRleDsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9CisgIG4gPSBzdHJsZW4oaWQpOworICBpZiAobnMpCisgICAgayA9IHN0cmxlbihucyk7CisgIGVsc2UKKyAgICBrID0gMDsKKyAgbnAgPSAoc3RydWN0IHNvYXBfbmxpc3QqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9ubGlzdCkgKyBuICsgayArIDEpOworICBpZiAoIW5wKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgbnAtPm5leHQgPSBzb2FwLT5ubGlzdDsKKyAgc29hcC0+bmxpc3QgPSBucDsKKyAgc3RyY3B5KG5wLT5pZCwgaWQpOworICBpZiAobnMpCisgIHsgbnAtPm5zID0gbnAtPmlkICsgbiArIDE7CisgICAgc3RyY3B5KG5wLT5ucywgbnMpOworICB9CisgIGVsc2UKKyAgICBucC0+bnMgPSBOVUxMOworICBucC0+bGV2ZWwgPSBzb2FwLT5sZXZlbDsKKyAgbnAtPmluZGV4ID0gdXRpbGl6ZWQ7CisgIHJldHVybiBucDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyB2b2lkCitzb2FwX3V0aWxpemVfbnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc2l6ZV90IG4pCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucCA9IHNvYXBfbG9va3VwX25zKHNvYXAsIHRhZywgbik7CisgIGlmIChucCkKKyAgeyBpZiAobnAtPmluZGV4ID09IDApCisgICAgICBzb2FwX3B1c2hfbnMoc29hcCwgbnAtPmlkLCBucC0+bnMsIDEpOworICB9CisgIGVsc2UKKyAgeyBzdHJuY3B5KHNvYXAtPnRtcGJ1ZiwgdGFnLCBuKTsKKyAgICBzb2FwLT50bXBidWZbbl0gPSAnXDAnOworICAgIHNvYXBfcHVzaF9ucyhzb2FwLCBzb2FwLT50bXBidWYsIE5VTEwsIDEpOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgdm9pZAorc29hcF9wb3BfbnMoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXBfcG9wX25hbWVzcGFjZShzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgY2hhciAqdHlwZSkKK3sgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbGVtZW50IGJlZ2luIHRhZz0nJXMnIGlkPSclZCcgdHlwZT0nJXMnXG4iLCB0YWcsIGlkLCB0eXBlP3R5cGU6IiIpKTsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqZWx0ID0gKHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50Kilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQpKTsKKyAgICBpZiAoIWVsdCkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIGVsdC0+c29hcCA9IHNvYXA7CisgICAgZWx0LT5uZXh0ID0gTlVMTDsKKyAgICBlbHQtPnBybnQgPSBzb2FwLT5kb207CisgICAgZWx0LT5uYW1lID0gc29hcF9zdHJkdXAoc29hcCwgdGFnKTsKKyAgICBlbHQtPmVsdHMgPSBOVUxMOworICAgIGVsdC0+YXR0cyA9IE5VTEw7CisgICAgZWx0LT5uc3RyID0gTlVMTDsKKyAgICBlbHQtPmRhdGEgPSBOVUxMOworICAgIGVsdC0+d2lkZSA9IE5VTEw7CisgICAgZWx0LT5ub2RlID0gTlVMTDsKKyAgICBlbHQtPnR5cGUgPSAwOworICAgIGVsdC0+aGVhZCA9IE5VTEw7CisgICAgZWx0LT50YWlsID0gTlVMTDsKKyAgICBpZiAoc29hcC0+ZG9tKQorICAgIHsgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKnAgPSBzb2FwLT5kb20tPmVsdHM7CisgICAgICBpZiAocCkKKyAgICAgIHsgd2hpbGUgKHAtPm5leHQpCisgICAgICAgICAgcCA9IHAtPm5leHQ7CisgICAgICAgIHAtPm5leHQgPSBlbHQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHNvYXAtPmRvbS0+ZWx0cyA9IGVsdDsKKyAgICB9CisgICAgc29hcC0+ZG9tID0gZWx0OworICB9CisgIGVsc2UKKyAgeworI2VuZGlmCisgICAgc29hcC0+bGV2ZWwrKzsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKCFzb2FwLT5ucykKKyAgICB7IGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgICAgICAgJiYgc29hcF9zZW5kKHNvYXAsIHNvYXAtPnByb2xvZyA/IHNvYXAtPnByb2xvZyA6ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiIpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIGVsc2UgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9JTkRFTlQpCisgICAgeyBpZiAoc29hcC0+bnMgPT0gMSAmJiBzb2FwX3NlbmRfcmF3KHNvYXAsIHNvYXBfaW5kZW50LCBzb2FwLT5sZXZlbCA8IHNpemVvZihzb2FwX2luZGVudCkgPyBzb2FwLT5sZXZlbCA6IHNpemVvZihzb2FwX2luZGVudCkgLSAxKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgc29hcC0+Ym9keSA9IDE7CisgICAgfQorI2VuZGlmCisgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgIjwiLCAxKQorICAgICB8fCBzb2FwX3NlbmQoc29hcCwgdGFnKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZmRlZiBXSVRIX0RPTQorICB9CisjZW5kaWYKKyAgaWYgKCFzb2FwLT5ucykKKyAgeyBzdHJ1Y3QgTmFtZXNwYWNlICpuczsKKyAgICBmb3IgKG5zID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlczsgbnMgJiYgbnMtPmlkOyBucysrKQorICAgIHsgaWYgKCpucy0+aWQgJiYgKG5zLT5vdXQgfHwgbnMtPm5zKSkKKyAgICAgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJ4bWxuczolcyIsIG5zLT5pZCk7CisgICAgICAgIGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCBzb2FwLT50bXBidWYsIG5zLT5vdXQgPyBucy0+b3V0IDogbnMtPm5zKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB9CisgICAgfSAgIAorICB9CisgIHNvYXAtPm5zID0gMTsgLyogc3RhcnQgd2l0aCAwIG9yIDIsIGJ1dCBzaG91bGQgYmUgb25lIHRvIGNvbnRpbnVlICovCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgeyBjb25zdCBjaGFyICpzID0gc3RyY2hyKHRhZywgJzonKTsKKyAgICBpZiAocykKKyAgICAgIHNvYXBfdXRpbGl6ZV9ucyhzb2FwLCB0YWcsIHMgLSB0YWcpOworICB9CisjZW5kaWYKKyAgaWYgKGlkID4gMCkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIl8lZCIsIGlkKTsKKyAgICBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgImlkIiwgc29hcC0+dG1wYnVmKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAodHlwZSAmJiAqdHlwZSkKKyAgeyBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgInhzaTp0eXBlIiwgdHlwZSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICAgIHsgY29uc3QgY2hhciAqcyA9IHN0cmNocih0eXBlLCAnOicpOworICAgICAgaWYgKHMpCisgICAgICAgIHNvYXBfdXRpbGl6ZV9ucyhzb2FwLCB0eXBlLCBzIC0gdHlwZSk7CisgICAgfQorI2VuZGlmCisgIH0KKyAgaWYgKHNvYXAtPm51bGwgJiYgc29hcC0+cG9zaXRpb24gPiAwKQorICB7IGludCBpOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiWyVkIiwgc29hcC0+cG9zaXRpb25zWzBdKTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgc29hcC0+cG9zaXRpb247IGkrKykKKyAgICAgIHNwcmludGYoc29hcC0+dG1wYnVmICsgc3RybGVuKHNvYXAtPnRtcGJ1ZiksICIsJWQiLCBzb2FwLT5wb3NpdGlvbnNbaV0pOworICAgIHN0cmNhdChzb2FwLT50bXBidWYsICJdIik7CisgICAgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJTT0FQLUVOQzpwb3NpdGlvbiIsIHNvYXAtPnRtcGJ1ZikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHNvYXAtPm11c3RVbmRlcnN0YW5kKQorICB7IGlmIChzb2FwLT5hY3RvciAmJiAqc29hcC0+YWN0b3IpCisgICAgeyBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgc29hcC0+dmVyc2lvbiA9PSAyID8gIlNPQVAtRU5WOnJvbGUiIDogIlNPQVAtRU5WOmFjdG9yIiwgc29hcC0+YWN0b3IpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAiU09BUC1FTlY6bXVzdFVuZGVyc3RhbmQiLCBzb2FwLT52ZXJzaW9uID09IDIgPyAidHJ1ZSIgOiAiMSIpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIHNvYXAtPm11c3RVbmRlcnN0YW5kID0gMDsKKyAgfQorICBpZiAoc29hcC0+ZW5jb2RpbmcpCisgIHsgaWYgKHNvYXAtPmVuY29kaW5nU3R5bGUgJiYgc29hcC0+bG9jYWxfbmFtZXNwYWNlcykKKyAgICB7IGlmICghKnNvYXAtPmVuY29kaW5nU3R5bGUpCisgICAgICB7IGlmIChzb2FwLT5sb2NhbF9uYW1lc3BhY2VzWzFdLm91dCkKKyAgICAgICAgICBzb2FwLT5lbmNvZGluZ1N0eWxlID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlc1sxXS5vdXQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzb2FwLT5lbmNvZGluZ1N0eWxlID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlc1sxXS5uczsKKyAgICAgIH0KKyAgICAgIGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAiU09BUC1FTlY6ZW5jb2RpbmdTdHlsZSIsIHNvYXAtPmVuY29kaW5nU3R5bGUpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIHNvYXAtPmVuY29kaW5nID0gMDsKKyAgfQorICBzb2FwLT5udWxsID0gMDsKKyAgc29hcC0+cG9zaXRpb24gPSAwOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X2JlZ2luX291dChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnR5cGUpCit7IGlmICgqdGFnID09ICctJykKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgaWYgKHNvYXBfZWxlbWVudChzb2FwLCB0YWcsIGlkLCB0eXBlKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzb2FwLCBOVUxMKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKKyNpZm5kZWYgSEFWRV9TVFJSQ0hSCitTT0FQX0ZNQUMxCitjaGFyKgorU09BUF9GTUFDMgorc29hcF9zdHJyY2hyKGNvbnN0IGNoYXIgKnMsIGludCB0KQoreyByZWdpc3RlciBjaGFyICpyID0gTlVMTDsKKyAgd2hpbGUgKCpzKQorICAgIGlmICgqcysrID09IHQpCisgICAgICByID0gKGNoYXIqKXMgLSAxOworICByZXR1cm4gcjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorI2lmbmRlZiBIQVZFX1NUUlRPTAorU09BUF9GTUFDMQorbG9uZworU09BUF9GTUFDMgorc29hcF9zdHJ0b2woY29uc3QgY2hhciAqcywgY2hhciAqKnQsIGludCBiKQoreyByZWdpc3RlciBsb25nIG4gPSAwOworICByZWdpc3RlciBpbnQgYzsKKyAgd2hpbGUgKCpzID4gMCAmJiAqcyA8PSAzMikKKyAgICBzKys7CisgIGlmIChiID09IDEwKQorICB7IHNob3J0IG5lZyA9IDA7CisgICAgaWYgKCpzID09ICctJykKKyAgICB7IHMrKzsKKyAgICAgIG5lZyA9IDE7CisgICAgfQorICAgIGVsc2UgaWYgKCpzID09ICcrJykKKyAgICAgIHMrKzsKKyAgICB3aGlsZSAoKGMgPSAqcykgJiYgYyA+PSAnMCcgJiYgYyA8PSAnOScpCisgICAgeyBpZiAobiA+PSAyMTQ3NDgzNjQgJiYgKG4gPiAyMTQ3NDgzNjQgfHwgYyA+PSAnOCcpKQorICAgICAgICBicmVhazsKKyAgICAgIG4gKj0gMTA7CisgICAgICBuICs9IGMgLSAnMCc7CisgICAgICBzKys7CisgICAgfQorICAgIGlmIChuZWcpCisgICAgICBuID0gLW47CisgIH0KKyAgZWxzZSAvKiBiID09IDE2IGFuZCB2YWx1ZSBpcyBhbHdheXMgcG9zaXRpdmUgKi8KKyAgeyB3aGlsZSAoKGMgPSAqcykpCisgICAgeyBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCisgICAgICAgIGMgLT0gJzAnOworICAgICAgZWxzZSBpZiAoYyA+PSAnQScgJiYgYyA8PSAnRicpCisgICAgICAgIGMgLT0gJ0EnIC0gMTA7CisgICAgICBlbHNlIGlmIChjID49ICdhJyAmJiBjIDw9ICdmJykKKyAgICAgICAgYyAtPSAnYScgLSAxMDsKKyAgICAgIGlmIChuID4gMHgwN0ZGRkZGRikKKyAgICAgICAgYnJlYWs7CisgICAgICBuIDw8PSA0OworICAgICAgbiArPSBjOworICAgICAgcysrOworICAgIH0KKyAgfQorICBpZiAodCkKKyAgICAqdCA9IChjaGFyKilzOworICByZXR1cm4gbjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorI2lmbmRlZiBIQVZFX1NUUlRPVUwKK1NPQVBfRk1BQzEKK3Vuc2lnbmVkIGxvbmcKK1NPQVBfRk1BQzIKK3NvYXBfc3RydG91bChjb25zdCBjaGFyICpzLCBjaGFyICoqdCwgaW50IGIpCit7IHVuc2lnbmVkIGxvbmcgbiA9IDA7CisgIHJlZ2lzdGVyIGludCBjOworICB3aGlsZSAoKnMgPiAwICYmICpzIDw9IDMyKQorICAgIHMrKzsKKyAgaWYgKGIgPT0gMTApCisgIHsgaWYgKCpzID09ICcrJykKKyAgICAgIHMrKzsKKyAgICB3aGlsZSAoKGMgPSAqcykgJiYgYyA+PSAnMCcgJiYgYyA8PSAnOScpCisgICAgeyBpZiAobiA+PSA0Mjk0OTY3MjkgJiYgKG4gPiA0Mjk0OTY3MjkgfHwgYyA+PSAnNicpKQorICAgICAgICBicmVhazsKKyAgICAgIG4gKj0gMTA7CisgICAgICBuICs9IGMgLSAnMCc7CisgICAgICBzKys7CisgICAgfQorICB9CisgIGVsc2UgLyogYiA9PSAxNiAqLworICB7IHdoaWxlICgoYyA9ICpzKSkKKyAgICB7IGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKKyAgICAgICAgYyAtPSAnMCc7CisgICAgICBlbHNlIGlmIChjID49ICdBJyAmJiBjIDw9ICdGJykKKyAgICAgICAgYyAtPSAnQScgLSAxMDsKKyAgICAgIGVsc2UgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQorICAgICAgICBjIC09ICdhJyAtIDEwOworICAgICAgaWYgKG4gPiAweDBGRkZGRkZGKQorICAgICAgICBicmVhazsKKyAgICAgIG4gPDw9IDQ7CisgICAgICBuICs9IGM7CisgICAgICBzKys7CisgICAgfQorICB9CisgIGlmICh0KQorICAgICp0ID0gKGNoYXIqKXM7CisgIHJldHVybiBuOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYXJyYXlfYmVnaW5fb3V0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqb2Zmc2V0KQoreyBpZiAoc29hcF9lbGVtZW50KHNvYXAsIHRhZywgaWQsICJTT0FQLUVOQzpBcnJheSIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgeyBjb25zdCBjaGFyICpzOworICAgIHMgPSBzb2FwX3N0cnJjaHIodHlwZSwgJ1snKTsKKyAgICBpZiAoKHNpemVfdCkocyAtIHR5cGUpIDwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZikpCisgICAgeyBzdHJuY3B5KHNvYXAtPnRtcGJ1ZiwgdHlwZSwgcyAtIHR5cGUpOworICAgICAgc29hcC0+dG1wYnVmW3MgLSB0eXBlXSA9ICdcMCc7CisgICAgICBpZiAodHlwZSAmJiAqdHlwZSAmJiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgIlNPQVAtRU5DOml0ZW1UeXBlIiwgc29hcC0+dG1wYnVmKSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIGlmIChzICYmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAiU09BUC1FTkM6YXJyYXlTaXplIiwgcyArIDEpKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgfQorICBlbHNlCisgIHsgaWYgKG9mZnNldCAmJiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgIlNPQVAtRU5DOm9mZnNldCIsIG9mZnNldCkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmICh0eXBlICYmICp0eXBlICYmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAiU09BUC1FTkM6YXJyYXlUeXBlIiwgdHlwZSkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAodHlwZSAmJiAqdHlwZSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkpCisgIHsgY29uc3QgY2hhciAqcyA9IHN0cmNocih0eXBlLCAnOicpOworICAgIGlmIChzKQorICAgICAgc29hcF91dGlsaXplX25zKHNvYXAsIHR5cGUsIHMgLSB0eXBlKTsKKyAgfQorI2VuZGlmCisgIHJldHVybiBzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzb2FwLCBOVUxMKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X3N0YXJ0X2VuZF9vdXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZykKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfYXR0cmlidXRlICp0cDsKKyNpZmRlZiBXSVRIX0RPTQorICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICoqYXR0OworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBhdHQgPSAmc29hcC0+ZG9tLT5hdHRzOworICAgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgICB7IGlmICh0cC0+dmlzaWJsZSkKKyAgICAgIHsgKmF0dCA9IChzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSkpOworCWlmICghKmF0dCkKKwkgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworCSgqYXR0KS0+bmV4dCA9IE5VTEw7CisgICAgICAgICgqYXR0KS0+bnN0ciA9IE5VTEw7CisgICAgICAgICgqYXR0KS0+bmFtZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHRwLT5uYW1lKTsKKyAgICAgICAgKCphdHQpLT5kYXRhID0gc29hcF9zdHJkdXAoc29hcCwgdHAtPnZhbHVlKTsKKyAgICAgICAgKCphdHQpLT53aWRlID0gTlVMTDsKKyAgICAgICAgKCphdHQpLT5zb2FwID0gc29hcDsKKyAgICAgICAgdHAtPnZpc2libGUgPSAwOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgeyBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnA7CisgICAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICAgIHsgaWYgKHRwLT52aXNpYmxlICYmIHRwLT5uYW1lKQorICAgICAgeyBjb25zdCBjaGFyICpzID0gc3RyY2hyKHRwLT5uYW1lLCAnOicpOworICAgICAgICBpZiAocykKKyAgICAgICAgICBzb2FwX3V0aWxpemVfbnMoc29hcCwgdHAtPm5hbWUsIHMgLSB0cC0+bmFtZSk7CisgICAgICB9CisgICAgfQorICAgIGZvciAobnAgPSBzb2FwLT5ubGlzdDsgbnA7IG5wID0gbnAtPm5leHQpCisgICAgeyBpZiAobnAtPmluZGV4ID09IDEgJiYgbnAtPm5zKQorICAgICAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgInhtbG5zOiVzIiwgbnAtPmlkKTsKKyAgICAgICAgc29hcF9zZXRfYXR0cihzb2FwLCBzb2FwLT50bXBidWYsIG5wLT5ucyk7CisgICAgICAgIG5wLT5pbmRleCA9IDI7CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYKKyAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICB7IGlmICh0cC0+dmlzaWJsZSkKKyAgICB7IGlmIChzb2FwX3NlbmQoc29hcCwgIiAiKSB8fCBzb2FwX3NlbmQoc29hcCwgdHAtPm5hbWUpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBpZiAodHAtPnZpc2libGUgPT0gMiAmJiB0cC0+dmFsdWUpCisgICAgICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsICI9XCIiLCAyKQorCSB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgdHAtPnZhbHVlLCAxKQorCSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICJcIiIsIDEpKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHRwLT52aXNpYmxlID0gMDsKKyAgICB9CisgIH0KKyAgaWYgKHRhZykKKyAgeyAKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAiPiIsIDEpCisgICAgICAgfHwgc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICBzb2FwLT5sZXZlbC0tOwkvKiBkZWNyZW1lbnQgbGV2ZWwganVzdCBiZWZvcmUgLz4gKi8KKyAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAiLz4iLCAyKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCAiPiIsIDEpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfZW5kX291dChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnKQoreyBpZiAoKnRhZyA9PSAnLScpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRWxlbWVudCBlbmRpbmcgdGFnPSclcydcbiIsIHRhZykpOworI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IGlmIChzb2FwLT5kb20tPnBybnQpCisgICAgICBzb2FwLT5kb20gPSBzb2FwLT5kb20tPnBybnQ7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgICAgc29hcF9wb3BfbnMoc29hcCk7CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfSU5ERU5UKQorICB7IGlmICghc29hcC0+Ym9keSkKKyAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHNvYXBfaW5kZW50LCBzb2FwLT5sZXZlbCA8IHNpemVvZihzb2FwX2luZGVudCkgPyBzb2FwLT5sZXZlbCA6IHNpemVvZihzb2FwX2luZGVudCkgLSAxKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBzb2FwLT5ib2R5ID0gMDsKKyAgfQorI2VuZGlmCisgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsICI8LyIsIDIpCisgICB8fCBzb2FwX3NlbmQoc29hcCwgdGFnKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHNvYXAtPmxldmVsLS07CS8qIGRlY3JlbWVudCBsZXZlbCBqdXN0IGJlZm9yZSA+ICovCisgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsICI+IiwgMSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9yZWYoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBpbnQgaHJlZikKK3sgcmVnaXN0ZXIgaW50IG4gPSAwOworICBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICAgIG4gPSAxOworICBzcHJpbnRmKHNvYXAtPmhyZWYsICIjXyVkIiwgaHJlZik7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfaHJlZihzb2FwLCB0YWcsIGlkLCAiaHJlZiIgKyBuLCBzb2FwLT5ocmVmICsgbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9ocmVmKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgY2hhciAqcmVmLCBjb25zdCBjaGFyICp2YWwpCit7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRWxlbWVudCAnJXMnIHJlZmVyZW5jZSAlcz0nJXMnXG4iLCB0YWcsIHJlZiwgdmFsKSk7CisgIGlmIChzb2FwX2VsZW1lbnQoc29hcCwgdGFnLCBpZCwgTlVMTCkKKyAgIHx8IHNvYXBfYXR0cmlidXRlKHNvYXAsIHJlZiwgdmFsKQorICAgfHwgc29hcF9lbGVtZW50X3N0YXJ0X2VuZF9vdXQoc29hcCwgdGFnKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfbnVsbChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnR5cGUpCit7IHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqdHA7CisgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgICBpZiAodHAtPnZpc2libGUpCisgICAgICBicmVhazsKKyAgaWYgKHRwIHx8IChzb2FwLT52ZXJzaW9uID09IDIgJiYgc29hcC0+cG9zaXRpb24gPiAwKSB8fCBpZCA+IDAgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9OSUwpKQorICB7IGlmIChzb2FwX2VsZW1lbnQoc29hcCwgdGFnLCBpZCwgdHlwZSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHNvYXAtPnBhcnQgIT0gU09BUF9JTl9IRUFERVIgJiYgc29hcC0+ZW5jb2RpbmdTdHlsZSkKKyAgICAgIGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAieHNpOm5pbCIsICJ0cnVlIikpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICByZXR1cm4gc29hcF9lbGVtZW50X3N0YXJ0X2VuZF9vdXQoc29hcCwgdGFnKTsKKyAgfQorICBzb2FwLT5udWxsID0gMTsKKyAgc29hcC0+cG9zaXRpb24gPSAwOworICBzb2FwLT5tdXN0VW5kZXJzdGFuZCA9IDA7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfaWQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KSAKK3sgaWYgKCFwIHx8IChhICYmICFhLT5fX3B0cikpCisgIHsgc29hcF9lbGVtZW50X251bGwoc29hcCwgdGFnLCBpZCwgdHlwZSk7CisgICAgcmV0dXJuIC0xOworICB9CisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1RSRUUpCisgICAgcmV0dXJuIDA7CisgIGlmIChpZCA8IDApCisgIHsgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICAgIGlmIChhKQorICAgICAgaWQgPSBzb2FwX2FycmF5X3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIGEsIG4sIHQsICZwcCk7CisgICAgZWxzZQorICAgICAgaWQgPSBzb2FwX3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIHQsICZwcCk7CisgICAgaWYgKGlkKQorICAgIHsgaWYgKHNvYXBfaXNfZW1iZWRkZWQoc29hcCwgcHApKQorICAgICAgeyBzb2FwX2VsZW1lbnRfcmVmKHNvYXAsIHRhZywgMCwgaWQpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBpZiAoc29hcF9pc19zaW5nbGUoc29hcCwgcHApKQorICAgICAgICByZXR1cm4gMDsKKyAgICAgIHNvYXBfc2V0X2VtYmVkZGVkKHNvYXAsIHBwKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGlkOworI2Vsc2UKKyAgcmV0dXJuIDA7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X3Jlc3VsdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnKQoreyBpZiAoc29hcC0+dmVyc2lvbiA9PSAyICYmIHNvYXAtPmVuY29kaW5nU3R5bGUpCisgICAgaWYgKHNvYXBfZWxlbWVudChzb2FwLCAiU09BUC1SUEM6cmVzdWx0IiwgMCwgTlVMTCkKKyAgICAgfHwgc29hcF9hdHRyaWJ1dGUoc29hcCwgInhtbG5zOlNPQVAtUlBDIiwgc29hcF9ycGMpCisgICAgIHx8IHNvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHNvYXAsIE5VTEwpCisgICAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCB0YWcsIDApCisgICAgIHx8IHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsICJTT0FQLVJQQzpyZXN1bHQiKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYXR0cmlidXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sgCisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAqYSA9IChzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSkpOworICAgIGEtPm5leHQgPSBzb2FwLT5kb20tPmF0dHM7CisgICAgYS0+bnN0ciA9IE5VTEw7CisgICAgYS0+bmFtZSA9IHNvYXBfc3RyZHVwKHNvYXAsIG5hbWUpOworICAgIGEtPmRhdGEgPSBzb2FwX3N0cmR1cChzb2FwLCB2YWx1ZSk7CisgICAgYS0+d2lkZSA9IE5VTEw7CisgICAgYS0+c29hcCA9IHNvYXA7CisgICAgc29hcC0+ZG9tLT5hdHRzID0gYTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgeyAvKiBUT0RPOiBjb25zaWRlciB1c2luZyB0aGlzIGNvZGUgdG8gaGFuZGxlIGRlZmF1bHQgbmFtZXNwYWNlCisgICAgaWYgKCFzdHJuY21wKG5hbWUsICJ4bWxucyIsIDUpICYmIChuYW1lWzVdID09ICc6JyB8fCBuYW1lWzVdID09ICdcMCcpKQorICAgIHsgaWYgKG5hbWVbNV0gPT0gJzonKQorICAgICAgICBzb2FwX3B1c2hfbnMoc29hcCwgbmFtZSArIDYsIHZhbHVlLCAwKTsKKyAgICAgIGVsc2UKKyAgICAgICAgc29hcF9wdXNoX25zKHNvYXAsICIiLCB2YWx1ZSwgMCk7CisgICAgfQorICAgICovCisgICAgaWYgKCFzdHJuY21wKG5hbWUsICJ4bWxuczoiLCA2KSkKKyAgICAgIHNvYXBfcHVzaF9ucyhzb2FwLCBuYW1lICsgNiwgdmFsdWUsIDApOworICAgIGVsc2UgaWYgKHNvYXBfc2V0X2F0dHIoc29hcCwgbmFtZSwgdmFsdWUpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGVsc2UKKyNlbmRpZgorICB7IGlmIChzb2FwX3NlbmQoc29hcCwgIiAiKSB8fCBzb2FwX3NlbmQoc29hcCwgbmFtZSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHZhbHVlKQorICAgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgIj1cIiIsIDIpCisgICAgICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHZhbHVlLCAxKQorICAgICAgIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIlwiIiwgMSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X2JlZ2luX2luKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBuaWxsYWJsZSkKK3sgaWYgKCFzb2FwX3BlZWtfZWxlbWVudChzb2FwKSkKKyAgeyBpZiAoc29hcC0+b3RoZXIpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1RBR19NSVNNQVRDSDsKKyAgICBpZiAodGFnICYmICp0YWcgPT0gJy0nKQorICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgaWYgKCEoc29hcC0+ZXJyb3IgPSBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50YWcsIHRhZykpKQorICAgIHsgc29hcC0+cGVla2VkID0gMDsKKyAgICAgIGlmIChzb2FwLT5ib2R5KQorICAgICAgICBzb2FwLT5sZXZlbCsrOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJCZWdpbiBlbGVtZW50IGZvdW5kIChsZXZlbD0ldSkgJyVzJz0nJXMnXG4iLCBzb2FwLT5sZXZlbCwgc29hcC0+dGFnLCB0YWc/dGFnOiIiICkpOworICAgICAgaWYgKCFuaWxsYWJsZSAmJiBzb2FwLT5udWxsICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9OVUxMOworICAgIH0KKyAgfQorICBlbHNlIGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRyAmJiB0YWcgJiYgKnRhZyA9PSAnLScpCisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9lbmRfaW4oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZykgIAoreyByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIHJlZ2lzdGVyIGNoYXIgKnM7CisgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnQ7CisgIHJlZ2lzdGVyIGludCBuID0gMDsKKyAgaWYgKHRhZyAmJiAqdGFnID09ICctJykKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgc29hcC0+bGV2ZWwtLTsKKyAgc29hcF9wb3BfbmFtZXNwYWNlKHNvYXApOworI2lmZGVmIFdJVEhfRE9NCisgIC8qIHRoaXMgd2hpdGVzcGFjZSBvciBtaXhlZCBjb250ZW50IGlzIG5vdCBpbnNpZ25pZmljYW50IGZvciBET00gKi8KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgaWYgKCFzb2FwLT5wZWVrZWQgJiYgIXNvYXBfc3RyaW5nX2luKHNvYXAsIDMsIC0xLCAtMSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHNvYXAtPmRvbS0+cHJudCkKKyAgICAgIHNvYXAtPmRvbSA9IHNvYXAtPmRvbS0+cHJudDsKKyAgfQorI2VuZGlmCisgIGlmIChzb2FwLT5wZWVrZWQpCisgIHsgaWYgKHNvYXAtPmVycm9yID09IFNPQVBfTk9fVEFHKQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICAgIGlmICgqc29hcC0+dGFnKQorICAgICAgbisrOworICAgIHNvYXAtPnBlZWtlZCA9IDA7CisgIH0KKyAgZG8KKyAgeyB3aGlsZSAoKChjID0gc29hcF9nZXQoc29hcCkpICE9IFNPQVBfVFQpKQorICAgIHsgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgICAgaWYgKGMgPT0gU09BUF9MVCkKKyAgICAgICAgbisrOworICAgICAgZWxzZSBpZiAoYyA9PSAnLycpCisgICAgICB7IGMgPSBzb2FwX2dldChzb2FwKTsKKyAgICAgICAgaWYgKGMgPT0gU09BUF9HVCkKKwkgIG4tLTsKKyAgICAgICAgZWxzZQorCSAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgIH0KKyAgICB9CisgIH0gd2hpbGUgKG4tLSk7CisgIHMgPSBzb2FwLT50YWc7CisgIHdoaWxlIChzb2FwX25vdGJsYW5rKGMgPSBzb2FwX2dldChzb2FwKSkpCisgICAgKnMrKyA9IChjaGFyKWM7CisgICpzID0gJ1wwJzsKKyAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIHdoaWxlIChzb2FwX2JsYW5rKGMpKQorICAgIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgaWYgKGMgIT0gU09BUF9HVCkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1NZTlRBWF9FUlJPUjsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgZWxlbWVudCBmb3VuZCAobGV2ZWw9JXUpICclcyc9JyVzJ1xuIiwgc29hcC0+bGV2ZWwsIHNvYXAtPnRhZywgdGFnP3RhZzoiIikpOworICBpZiAoIXRhZyB8fCAhKnRhZykKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgaWYgKChzID0gc3RyY2hyKHNvYXAtPnRhZywgJzonKSkpCisgICAgcysrOworICBlbHNlCisgICAgcyA9IHNvYXAtPnRhZzsKKyAgaWYgKCh0ID0gc3RyY2hyKHRhZywgJzonKSkpCisgICAgdCsrOworICBlbHNlCisgICAgdCA9IHRhZzsKKyAgaWYgKCFTT0FQX1NUUkNNUChzLCB0KSkKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgZWxlbWVudCB0YWcgbmFtZSBkb2VzIG5vdCBtYXRjaFxuIikpOworICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1NZTlRBWF9FUlJPUjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIgKgorU09BUF9GTUFDMgorc29hcF9hdHRyX3ZhbHVlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgZmxhZykKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfYXR0cmlidXRlICp0cDsKKyAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICAgIGlmICghc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsIG5hbWUpKQorICAgICAgYnJlYWs7CisgIGlmICh0cCAmJiB0cC0+dmlzaWJsZSA9PSAyKQorICB7IGlmIChmbGFnID09IDIgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1BST0hJQklURUQ7CisgICAgZWxzZQorICAgICAgcmV0dXJuIHRwLT52YWx1ZTsKKyAgfQorICBlbHNlIGlmIChmbGFnID09IDEgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKQorICAgIHNvYXAtPmVycm9yID0gU09BUF9SRVFVSVJFRDsKKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2F0dHIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKnRwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNldCBhdHRyaWJ1dGUgJXM9JyVzJ1xuIiwgbmFtZSwgdmFsdWU/dmFsdWU6IiIpKTsKKyAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICB7IGlmICghc3RyY21wKHRwLT5uYW1lLCBuYW1lKSkKKyAgICAgIGJyZWFrOworICB9CisgIGlmICghdHApCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJBbGxvY2F0ZSBhdHRyaWJ1dGUgJXNcbiIsIG5hbWUpKTsKKyAgICBpZiAoISh0cCA9IChzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUpICsgc3RybGVuKG5hbWUpKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICB0cC0+bnMgPSBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgICB7IHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqKnRwcCA9ICZzb2FwLT5hdHRyaWJ1dGVzOworICAgICAgY29uc3QgY2hhciAqcyA9IHN0cmNocihuYW1lLCAnOicpOworICAgICAgaWYgKCFzdHJuY21wKG5hbWUsICJ4bWxucyIsIDUpKQorICAgICAgeyBmb3IgKDsgKnRwcDsgdHBwID0gJigqdHBwKS0+bmV4dCkKKyAgICAgICAgICBpZiAoc3RybmNtcCgoKnRwcCktPm5hbWUsICJ4bWxucyIsIDUpIHx8IHN0cmNtcCgoKnRwcCktPm5hbWUgKyA1LCBuYW1lICsgNSkgPiAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlbHNlIGlmICghcykKKyAgICAgIHsgZm9yICg7ICp0cHA7IHRwcCA9ICYoKnRwcCktPm5leHQpCisgICAgICAgICAgaWYgKHN0cm5jbXAoKCp0cHApLT5uYW1lLCAieG1sbnMiLCA1KSAmJiAoKCp0cHApLT5ucyB8fCBzdHJjbXAoKCp0cHApLT5uYW1lLCBuYW1lKSA+IDApKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IGludCBrOworICAgICAgICBmb3IgKDsgKnRwcDsgdHBwID0gJigqdHBwKS0+bmV4dCkKKwl7IGlmICghc3RybmNtcCgoKnRwcCktPm5hbWUsICJ4bWxuczoiLCA2KSAmJiAhc3RybmNtcCgoKnRwcCktPm5hbWUgKyA2LCBuYW1lLCBzIC0gbmFtZSkgJiYgISgqdHBwKS0+bmFtZVs2ICsgcyAtIG5hbWVdKQorCSAgeyBpZiAoIXRwLT5ucykKKyAgICAgICAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDYW5vbmljYWxpemF0aW9uOiBwcmVmaXggJXM9JXAoJXMpXG4iLCBuYW1lLCAoKnRwcCktPm5zLCAoKnRwcCktPm5zKSk7CisJICAgICAgdHAtPm5zID0gKCp0cHApLT5uczsKKwkgICAgfQorCSAgfQorICAgICAgICAgIGVsc2UgaWYgKHN0cm5jbXAoKCp0cHApLT5uYW1lLCAieG1sbnMiLCA1KSAmJiAoKnRwcCktPm5zICYmIHRwLT5ucyAmJiAoKGsgPSBzdHJjbXAoKCp0cHApLT5ucywgdHAtPm5zKSkgPiAwIHx8ICghayAmJiBzdHJjbXAoKCp0cHApLT5uYW1lLCBuYW1lKSA+IDApKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICB0cC0+bmV4dCA9ICp0cHA7CisgICAgICAqdHBwID0gdHA7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHsgdHAtPm5leHQgPSBzb2FwLT5hdHRyaWJ1dGVzOworICAgICAgc29hcC0+YXR0cmlidXRlcyA9IHRwOworICAgIH0KKyAgICBzdHJjcHkodHAtPm5hbWUsIG5hbWUpOworICAgIHRwLT52YWx1ZSA9IE5VTEw7CisgIH0KKyAgZWxzZSBpZiAodHAtPnZpc2libGUpCisgIHsgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgZWxzZSBpZiAodmFsdWUgJiYgdHAtPnZhbHVlICYmIHRwLT5zaXplIDw9IHN0cmxlbih2YWx1ZSkpCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIGF0dHJpYnV0ZSB2YWx1ZSBvZiAlcyAoZnJlZSAlcClcbiIsIG5hbWUsIHRwLT52YWx1ZSkpOworICAgIFNPQVBfRlJFRShzb2FwLCB0cC0+dmFsdWUpOworICAgIHRwLT52YWx1ZSA9IE5VTEw7CisgICAgdHAtPm5zID0gTlVMTDsKKyAgfQorICBpZiAodmFsdWUpCisgIHsgaWYgKCF0cC0+dmFsdWUpCisgICAgeyB0cC0+c2l6ZSA9IHN0cmxlbih2YWx1ZSkgKyAxOworICAgICAgaWYgKCEodHAtPnZhbHVlID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHRwLT5zaXplKSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJBbGxvY2F0ZSBhdHRyaWJ1dGUgdmFsdWUgb2YgJXMgKCVwKVxuIiwgdHAtPm5hbWUsIHRwLT52YWx1ZSkpOworICAgIH0KKyAgICBzdHJjcHkodHAtPnZhbHVlLCB2YWx1ZSk7CisgICAgaWYgKCFzdHJuY21wKHRwLT5uYW1lLCAieG1sbnM6IiwgNikpCisgICAgICB0cC0+bnMgPSB0cC0+dmFsdWU7CisgICAgdHAtPnZpc2libGUgPSAyOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBpZiAoIXN0cmNtcChuYW1lLCAid3N1OklkIikpCisgICAgeyBzb2FwLT5wYXJ0ID0gU09BUF9CRUdJTl9TRUNVUklUWTsKKyAgICAgIHN0cm5jcHkoc29hcC0+aWQsIHZhbHVlLCBzaXplb2Yoc29hcC0+aWQpKTsKKyAgICAgIHNvYXAtPmlkW3NpemVvZihzb2FwLT5pZCktMV0gPSAnXDAnOworICAgIH0KKyNlbmRpZgorICB9CisgIGVsc2UKKyAgICB0cC0+dmlzaWJsZSA9IDE7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9jbHJfYXR0cihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfYXR0cmlidXRlICp0cDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkpCisgIHsgd2hpbGUgKHNvYXAtPmF0dHJpYnV0ZXMpCisgICAgeyB0cCA9IHNvYXAtPmF0dHJpYnV0ZXMtPm5leHQ7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+YXR0cmlidXRlcy0+dmFsdWUpOworICAgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPmF0dHJpYnV0ZXMpOworICAgICAgc29hcC0+YXR0cmlidXRlcyA9IHRwOworICAgIH0KKyAgfQorICBlbHNlCisjZW5kaWYKKyAgeyBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgICAgICB0cC0+dmlzaWJsZSA9IDA7CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK3N0YXRpYyBpbnQKK3NvYXBfZ2V0YXR0cnZhbChzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqcywgc2l6ZV90IG4sIHNvYXBfd2NoYXIgZCkKK3sgcmVnaXN0ZXIgc2l6ZV90IGk7CisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgIHsgcmVnaXN0ZXIgc29hcF93Y2hhciBjID0gc29hcF9nZXQoc29hcCk7CisgICAgc3dpdGNoIChjKQorICAgIHsKKyAgICBjYXNlIFNPQVBfVFQ6CisgICAgICAqcysrID0gJzwnOworICAgICAgc29hcF91bmdldChzb2FwLCAnLycpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0xUOgorICAgICAgKnMrKyA9ICc8JzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9HVDoKKyAgICAgIGlmIChkID09ICcgJykKKyAgICAgIHsgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgKnMgPSAnXDAnOworICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICAgIH0KKyAgICAgICpzKysgPSAnPic7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfUVQ6CisgICAgICBpZiAoYyA9PSBkKQorICAgICAgeyAqcyA9ICdcMCc7CisgICAgICAgIHJldHVybiBTT0FQX09LOworICAgICAgfQorICAgICAgKnMrKyA9ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9BUDoKKyAgICAgIGlmIChjID09IGQpCisgICAgICB7ICpzID0gJ1wwJzsKKyAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgICB9CisgICAgICAqcysrID0gJ1wnJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1x0JzoKKyAgICBjYXNlICdcbic6CisgICAgY2FzZSAnXHInOgorICAgIGNhc2UgJyAnOgorICAgIGNhc2UgJy8nOgorICAgICAgaWYgKGQgPT0gJyAnKQorICAgICAgeyBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICAqcyA9ICdcMCc7CisgICAgICAgIHJldHVybiBTT0FQX09LOworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgICAqcysrID0gKGNoYXIpYzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBXSVRIX0ZBU1QKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc3RvcmVfbGFiKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBzaXplX3QgbikKK3sgc29hcC0+bGFiaWR4ID0gMDsKKyAgcmV0dXJuIHNvYXBfYXBwZW5kX2xhYihzb2FwLCBzLCBuKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgV0lUSF9GQVNUCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2FwcGVuZF9sYWIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBuKQoreyBpZiAoc29hcC0+bGFiaWR4ICsgbiA+PSBzb2FwLT5sYWJsZW4pCisgIHsgcmVnaXN0ZXIgY2hhciAqdCA9IHNvYXAtPmxhYmJ1ZjsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVubGFyZ2luZyBsb29rLWFzaWRlIGJ1ZmZlciB0byBhcHBlbmQgZGF0YSwgb2xkIHNpemU9JWx1IiwgKHVuc2lnbmVkIGxvbmcpc29hcC0+bGFibGVuKSk7CisgICAgaWYgKHNvYXAtPmxhYmxlbiA9PSAwKQorICAgICAgc29hcC0+bGFibGVuID0gU09BUF9MQUJMRU47CisgICAgd2hpbGUgKHNvYXAtPmxhYmlkeCArIG4gPj0gc29hcC0+bGFibGVuKQorICAgICAgc29hcC0+bGFibGVuIDw8PSAxOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiLCBuZXcgc2l6ZT0lbHVcbiIsICh1bnNpZ25lZCBsb25nKXNvYXAtPmxhYmxlbikpOworICAgIHNvYXAtPmxhYmJ1ZiA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzb2FwLT5sYWJsZW4pOworICAgIGlmICghc29hcC0+bGFiYnVmKQorICAgIHsgaWYgKHQpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCB0KTsKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIH0KKyAgICBpZiAodCkKKyAgICB7IG1lbWNweShzb2FwLT5sYWJidWYsIHQsIHNvYXAtPmxhYmlkeCk7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgdCk7CisgICAgfQorICB9CisgIGlmIChzKQorICB7IG1lbWNweShzb2FwLT5sYWJidWYgKyBzb2FwLT5sYWJpZHgsIHMsIG4pOworICAgIHNvYXAtPmxhYmlkeCArPSBuOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcGVla19lbGVtZW50KHN0cnVjdCBzb2FwICpzb2FwKQoreworI2lmZGVmIFdJVEhfRE9NCisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgKiphdHQgPSBOVUxMOworICByZWdpc3RlciBjaGFyICpsZWFkID0gTlVMTDsKKyNlbmRpZgorICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKnRwOworICBjb25zdCBjaGFyICp0OworICByZWdpc3RlciBjaGFyICpzOworICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIHJlZ2lzdGVyIGludCBpOworICBpZiAoc29hcC0+cGVla2VkKQorICB7IGlmICghKnNvYXAtPnRhZykKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTk9fVEFHOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIHNvYXAtPnBlZWtlZCA9IDE7CisgIGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisjaWZkZWYgV0lUSF9ET00KKyAgLyogd2hpdGVzcGFjZSBsZWFkaW5nIHRvIHN0YXJ0IHRhZyBpcyBub3QgaW5zaWduaWZpY2FudCBmb3IgRE9NICovCisgIGlmIChzb2FwX2JsYW5rKGMpKQorICB7IHNvYXAtPmxhYmlkeCA9IDA7CisgICAgZG8KKyAgICB7IGlmIChzb2FwX2FwcGVuZF9sYWIoc29hcCwgTlVMTCwgMCkpCisgICAgICAgIHJldHVybiBTT0FQX0VPTTsKKyAgICAgIHMgPSBzb2FwLT5sYWJidWYgKyBzb2FwLT5sYWJpZHg7CisgICAgICBpID0gc29hcC0+bGFibGVuIC0gc29hcC0+bGFiaWR4OworICAgICAgc29hcC0+bGFiaWR4ID0gc29hcC0+bGFibGVuOworICAgICAgd2hpbGUgKHNvYXBfYmxhbmsoYykgJiYgaS0tKQorICAgICAgeyAqcysrID0gYzsKKyAgICAgICAgYyA9IHNvYXBfZ2V0dXRmOChzb2FwKTsKKyAgICAgIH0KKyAgICB9CisgICAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworICAgICpzID0gJ1wwJzsKKyAgICBsZWFkID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+bGFiYnVmKTsKKyAgfQorI2Vsc2UKKyAgd2hpbGUgKHNvYXBfYmxhbmsoYykpCisgICAgYyA9IHNvYXBfZ2V0dXRmOChzb2FwKTsKKyNlbmRpZgorICBpZiAoYyAhPSBTT0FQX0xUKQorICB7ICpzb2FwLT50YWcgPSAnXDAnOworICAgIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyNpZmRlZiBXSVRIX0RPTQorICAgIC8qIHdoaXRlc3BhY2UgbGVhZGluZyB0byBlbmQgdGFnIGlzIG5vdCBpbnNpZ25pZmljYW50IGZvciBET00gKi8KKyAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgICAgIHNvYXAtPmRvbS0+dGFpbCA9IHNvYXBfc3RyZHVwKHNvYXAsIGxlYWQpOworI2VuZGlmCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9OT19UQUc7CisgIH0KKyAgcyA9IHNvYXAtPnRhZzsKKyAgZG8gYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworICBpID0gc2l6ZW9mKHNvYXAtPnRhZyk7CisgIHdoaWxlIChjICE9ICc+JyAmJiBjICE9ICcvJyAmJiBzb2FwX25vdGJsYW5rKGMpKQorICB7IGlmICgtLWkgPiAwKQorICAgICAgKnMrKyA9IChjaGFyKWM7CisgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgfQorICB3aGlsZSAoc29hcF9ibGFuayhjKSkKKyAgICBjID0gc29hcF9nZXQxKHNvYXApOworICAqcyA9ICdcMCc7CisgIHNvYXAtPmlkWzBdID0gJ1wwJzsKKyAgc29hcC0+aHJlZlswXSA9ICdcMCc7CisgIHNvYXAtPnR5cGVbMF0gPSAnXDAnOworICBzb2FwLT5hcnJheVR5cGVbMF0gPSAnXDAnOworICBzb2FwLT5hcnJheVNpemVbMF0gPSAnXDAnOworICBzb2FwLT5hcnJheU9mZnNldFswXSA9ICdcMCc7CisgIHNvYXAtPm90aGVyID0gMDsKKyAgc29hcC0+cm9vdCA9IC0xOworICBzb2FwLT5wb3NpdGlvbiA9IDA7CisgIHNvYXAtPm51bGwgPSAwOworICBzb2FwLT5tdXN0VW5kZXJzdGFuZCA9IDA7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKmVsdDsKKyAgICBlbHQgPSAoc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCkpOworICAgIGlmICghZWx0KQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgZWx0LT5uZXh0ID0gTlVMTDsKKyAgICBlbHQtPm5zdHIgPSBOVUxMOworICAgIGVsdC0+bmFtZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPnRhZyk7CisgICAgZWx0LT5wcm50ID0gc29hcC0+ZG9tOworICAgIGVsdC0+ZWx0cyA9IE5VTEw7CisgICAgZWx0LT5hdHRzID0gTlVMTDsKKyAgICBlbHQtPmRhdGEgPSBOVUxMOworICAgIGVsdC0+d2lkZSA9IE5VTEw7CisgICAgZWx0LT50eXBlID0gMDsKKyAgICBlbHQtPm5vZGUgPSBOVUxMOworICAgIGVsdC0+aGVhZCA9IGxlYWQ7CisgICAgZWx0LT50YWlsID0gTlVMTDsKKyAgICBlbHQtPnNvYXAgPSBzb2FwOworICAgIGlmIChzb2FwLT5kb20pCisgICAgeyBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqcCA9IHNvYXAtPmRvbS0+ZWx0czsKKyAgICAgIGlmIChwKQorICAgICAgeyB3aGlsZSAocC0+bmV4dCkKKyAgICAgICAgICBwID0gcC0+bmV4dDsKKyAgICAgICAgcC0+bmV4dCA9IGVsdDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgc29hcC0+ZG9tLT5lbHRzID0gZWx0OworICAgIH0KKyAgICBzb2FwLT5kb20gPSBlbHQ7CisgICAgYXR0ID0gJmVsdC0+YXR0czsKKyAgfQorI2VuZGlmCisgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgICB0cC0+dmlzaWJsZSA9IDA7CisgIHdoaWxlICgoaW50KWMgIT0gRU9GICYmIGMgIT0gJz4nICYmIGMgIT0gJy8nKQorICB7IHMgPSBzb2FwLT50bXBidWY7CisgICAgaSA9IHNpemVvZihzb2FwLT50bXBidWYpOworICAgIHdoaWxlIChjICE9ICc9JyAmJiBjICE9ICc+JyAmJiBjICE9ICcvJyAmJiBzb2FwX25vdGJsYW5rKGMpKQorICAgIHsgaWYgKC0taSA+IDApCisgICAgICAgICpzKysgPSAoY2hhciljOworICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICB9CisgICAgKnMgPSAnXDAnOworICAgIGlmIChpID09IHNpemVvZihzb2FwLT50bXBidWYpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9TWU5UQVhfRVJST1I7CisjaWZkZWYgV0lUSF9ET00KKyAgICAvKiBhZGQgYXR0cmlidXRlIG5hbWUgdG8gZG9tICovCisgICAgaWYgKGF0dCkKKyAgICB7ICphdHQgPSAoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUpKTsKKyAgICAgICBpZiAoISphdHQpCisgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgICAoKmF0dCktPm5leHQgPSBOVUxMOworICAgICAgICgqYXR0KS0+bnN0ciA9IE5VTEw7CisgICAgICAgKCphdHQpLT5uYW1lID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+dG1wYnVmKTsKKyAgICAgICAoKmF0dCktPmRhdGEgPSBOVUxMOworICAgICAgICgqYXR0KS0+d2lkZSA9IE5VTEw7CisgICAgICAgKCphdHQpLT5zb2FwID0gc29hcDsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoIXN0cm5jbXAoc29hcC0+dG1wYnVmLCAieG1sbnMiLCA1KSkKKyAgICB7IGlmIChzb2FwLT50bXBidWZbNV0gPT0gJzonKQorICAgICAgeyBzb2FwLT50bXBidWZbNV0gPSAnXDAnOworICAgICAgICB0ID0gc29hcC0+dG1wYnVmICsgNjsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHNvYXAtPnRtcGJ1Zls1XSkKKyAgICAgICAgdCA9IE5VTEw7CisgICAgICBlbHNlCisgICAgICAgIHQgPSBTT0FQX1NUUl9FT1M7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHQgPSBOVUxMOworICAgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgICB7IGlmICghU09BUF9TVFJDTVAodHAtPm5hbWUsIHNvYXAtPnRtcGJ1ZikpCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIXRwKQorICAgIHsgdHAgPSAoc3RydWN0IHNvYXBfYXR0cmlidXRlKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfYXR0cmlidXRlKSArIHN0cmxlbihzb2FwLT50bXBidWYpKTsKKyAgICAgIGlmICghdHApCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgc3RyY3B5KHRwLT5uYW1lLCBzb2FwLT50bXBidWYpOworICAgICAgdHAtPnZhbHVlID0gTlVMTDsKKyAgICAgIHRwLT5zaXplID0gMDsKKyAgICAgIHRwLT5uZXh0ID0gc29hcC0+YXR0cmlidXRlczsKKyAgICAgIHNvYXAtPmF0dHJpYnV0ZXMgPSB0cDsKKyAgICB9CisgICAgd2hpbGUgKHNvYXBfYmxhbmsoYykpCisgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworICAgIGlmIChjID09ICc9JykKKyAgICB7IGRvIGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisgICAgICB3aGlsZSAoc29hcF9ibGFuayhjKSk7CisgICAgICBpZiAoYyAhPSBTT0FQX1FUICYmIGMgIT0gU09BUF9BUCkKKyAgICAgIHsgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgYyA9ICcgJzsgLyogYmxhbmsgZGVsaW1pdGVyICovCisgICAgICB9CisgICAgICBpZiAoc29hcF9nZXRhdHRydmFsKHNvYXAsIHRwLT52YWx1ZSwgdHAtPnNpemUsIGMpKQorICAgICAgeworI2lmZGVmIFdJVEhfRkFTVAorICAgICAgICBpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9FT00pCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisJaWYgKHNvYXBfc3RvcmVfbGFiKHNvYXAsIHRwLT52YWx1ZSwgdHAtPnNpemUpKQorCSAgcmV0dXJuIHNvYXAtPmVycm9yOworCWlmICh0cC0+dmFsdWUpCisJICBTT0FQX0ZSRUUoc29hcCwgdHAtPnZhbHVlKTsKKwlmb3IgKDs7KQorCXsgaWYgKHNvYXBfZ2V0YXR0cnZhbChzb2FwLCBzb2FwLT5sYWJidWYgKyBzb2FwLT5sYWJpZHgsIHNvYXAtPmxhYmxlbiAtIHNvYXAtPmxhYmlkeCwgYykpCisJICB7IGlmIChzb2FwLT5lcnJvciAhPSBTT0FQX0VPTSkKKwkgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisJICAgIHNvYXAtPmxhYmlkeCA9IHNvYXAtPmxhYmxlbjsKKwkgICAgaWYgKHNvYXBfYXBwZW5kX2xhYihzb2FwLCBOVUxMLCAwKSkKKwkgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisJICB9CisJICBlbHNlCisJICAgIGJyZWFrOworCX0KKwlpZiAoc29hcC0+bGFiaWR4KQorICAgICAgICAgIHRwLT5zaXplID0gc29hcC0+bGFibGVuOworCWVsc2UKKwl7IHRwLT5zaXplID0gc3RybGVuKHNvYXAtPmxhYmJ1ZikgKyAxOworICAgICAgICAgIGlmICh0cC0+c2l6ZSA8IFNPQVBfTEFCTEVOKQorCSAgICB0cC0+c2l6ZSA9IFNPQVBfTEFCTEVOOworICAgICAgICB9CisJaWYgKCEodHAtPnZhbHVlID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHRwLT5zaXplKSkpCisJICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgICAgc3RyY3B5KHRwLT52YWx1ZSwgc29hcC0+bGFiYnVmKTsKKyNlbHNlCisJc2l6ZV90IG47CisgICAgICAgIGlmIChzb2FwLT5lcnJvciAhPSBTT0FQX0VPTSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgICAgICAgaWYgKHNvYXBfbmV3X2Jsb2NrKHNvYXApKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeyBpZiAoIShzID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBTT0FQX0JMS0xFTikpKQorICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICAgIGlmIChzb2FwX2dldGF0dHJ2YWwoc29hcCwgcywgU09BUF9CTEtMRU4sIGMpKQorICAgICAgICAgIHsgaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfRU9NKQorICAgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisJbiA9IHRwLT5zaXplICsgc29hcC0+Ymxpc3QtPnNpemU7CisgICAgICAgIGlmICghKHMgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgbikpKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgICBpZiAodHAtPnZhbHVlKQorICAgICAgICB7IG1lbWNweShzLCB0cC0+dmFsdWUsIHRwLT5zaXplKTsKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgdHAtPnZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBzb2FwX3NhdmVfYmxvY2soc29hcCwgcyArIHRwLT5zaXplLCAwKTsKKyAgICAgICAgdHAtPnZhbHVlID0gczsKKyAgICAgICAgdHAtPnNpemUgPSBuOworI2VuZGlmCisgICAgICB9CisgICAgICBkbyBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworICAgICAgdHAtPnZpc2libGUgPSAyOyAvKiBzZWVuIHRoaXMgYXR0cmlidXRlIHcvIHZhbHVlICovCisjaWZkZWYgV0lUSF9ET00KKyAgICAgIGlmIChhdHQpCisgICAgICAgICgqYXR0KS0+ZGF0YSA9IHNvYXBfc3RyZHVwKHNvYXAsIHRwLT52YWx1ZSk7CisjZW5kaWYKKyAgICB9CisgICAgZWxzZQorICAgICAgdHAtPnZpc2libGUgPSAxOyAvKiBzZWVuIHRoaXMgYXR0cmlidXRlIHcvbyB2YWx1ZSAqLworI2lmZGVmIFdJVEhfRE9NCisgICAgaWYgKGF0dCkKKyAgICAgIGF0dCA9ICYoKmF0dCktPm5leHQ7CisjZW5kaWYKKyAgICBpZiAodCAmJiB0cC0+dmFsdWUpCisgICAgeyBpZiAoc29hcF9wdXNoX25hbWVzcGFjZShzb2FwLCB0LCB0cC0+dmFsdWUpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB0cC0+dmlzaWJsZSA9IDA7CisgICAgfQorICB9CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKGF0dCkKKyAgeyBzb2FwLT5kb20tPm5zdHIgPSBzb2FwX2N1cnJlbnRfbmFtZXNwYWNlKHNvYXAsIHNvYXAtPnRhZyk7CisgICAgZm9yIChhdHQgPSAmc29hcC0+ZG9tLT5hdHRzOyAqYXR0OyBhdHQgPSAmKCphdHQpLT5uZXh0KQorICAgICAgKCphdHQpLT5uc3RyID0gc29hcF9jdXJyZW50X25hbWVzcGFjZShzb2FwLCAoKmF0dCktPm5hbWUpOworICB9CisjZW5kaWYKKyAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIGlmICghKHNvYXAtPmJvZHkgPSAoYyAhPSAnLycpKSkKKyAgICBkbyBjID0gc29hcF9nZXQxKHNvYXApOworICAgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkKKyAgeyBpZiAoIXNvYXAtPmJvZHkgJiYgc29hcC0+ZG9tLT5wcm50KQorICAgICAgc29hcC0+ZG9tID0gc29hcC0+ZG9tLT5wcm50OworICB9CisjZW5kaWYKKyAgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICB7IGlmICh0cC0+dmlzaWJsZSAmJiB0cC0+dmFsdWUpCisgICAgeyBpZiAoIXN0cmNtcCh0cC0+bmFtZSwgImlkIikpCisgICAgICB7ICpzb2FwLT5pZCA9ICcjJzsKKyAgICAgICAgc3RybmNweShzb2FwLT5pZCArIDEsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPmlkKSAtIDIpOworICAgICAgICBzb2FwLT5pZFtzaXplb2Yoc29hcC0+aWQpLTFdID0gJ1wwJzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAodHAtPm5hbWUsICJocmVmIikpCisgICAgICB7IHN0cm5jcHkoc29hcC0+aHJlZiwgdHAtPnZhbHVlLCBzaXplb2Yoc29hcC0+aHJlZikgLSAxKTsKKyAgICAgICAgc29hcC0+aHJlZltzaXplb2Yoc29hcC0+aHJlZiktMV0gPSAnXDAnOworICAgICAgfQorICAgICAgZWxzZSBpZiAoKHNvYXAtPnZlcnNpb24gPT0gMiB8fCAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0dSQVBIKSkgJiYgIXN0cmNtcCh0cC0+bmFtZSwgInJlZiIpKQorICAgICAgeyAqc29hcC0+aHJlZiA9ICcjJzsKKyAgICAgICAgc3RybmNweShzb2FwLT5ocmVmICsgMSwgdHAtPnZhbHVlLCBzaXplb2Yoc29hcC0+aHJlZikgLSAyKTsKKyAgICAgICAgc29hcC0+aHJlZltzaXplb2Yoc29hcC0+aHJlZiktMV0gPSAnXDAnOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAieHNpOnR5cGUiKSkKKyAgICAgIHsgc3RybmNweShzb2FwLT50eXBlLCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT50eXBlKSAtIDEpOworICAgICAgICBzb2FwLT50eXBlW3NpemVvZihzb2FwLT50eXBlKS0xXSA9ICdcMCc7CisgICAgICB9CisgICAgICBlbHNlIGlmIChzb2FwLT52ZXJzaW9uID09IDEgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTkM6YXJyYXlUeXBlIikpCisgICAgICB7IHMgPSBzb2FwX3N0cnJjaHIodHAtPnZhbHVlLCAnWycpOworICAgICAgICBpZiAocyAmJiAoc2l6ZV90KShzIC0gdHAtPnZhbHVlKSA8IHNpemVvZihzb2FwLT5hcnJheVR5cGUpKQorICAgICAgICB7IHN0cm5jcHkoc29hcC0+YXJyYXlUeXBlLCB0cC0+dmFsdWUsIHMgLSB0cC0+dmFsdWUpOworICAgICAgICAgIHNvYXAtPmFycmF5VHlwZVtzIC0gdHAtPnZhbHVlXSA9ICdcMCc7CisgICAgICAgICAgc3RybmNweShzb2FwLT5hcnJheVNpemUsIHMsIHNpemVvZihzb2FwLT5hcnJheVNpemUpIC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHN0cm5jcHkoc29hcC0+YXJyYXlUeXBlLCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT5hcnJheVR5cGUpIC0gMSk7CisgICAgICAgIHNvYXAtPmFycmF5U2l6ZVtzaXplb2Yoc29hcC0+YXJyYXlUeXBlKS0xXSA9ICdcMCc7CisgICAgICAgIHNvYXAtPmFycmF5VHlwZVtzaXplb2Yoc29hcC0+YXJyYXlUeXBlKS0xXSA9ICdcMCc7CisgICAgICB9CisgICAgICBlbHNlIGlmIChzb2FwLT52ZXJzaW9uID09IDIgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTkM6aXRlbVR5cGUiKSkKKyAgICAgICAgc3RybmNweShzb2FwLT5hcnJheVR5cGUsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPmFycmF5VHlwZSkgLSAxKTsKKyAgICAgIGVsc2UgaWYgKHNvYXAtPnZlcnNpb24gPT0gMiAmJiAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOQzphcnJheVNpemUiKSkKKyAgICAgICAgc3RybmNweShzb2FwLT5hcnJheVNpemUsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPmFycmF5U2l6ZSkgLSAxKTsKKyAgICAgIGVsc2UgaWYgKHNvYXAtPnZlcnNpb24gPT0gMSAmJiAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOQzpvZmZzZXQiKSkKKyAgICAgICAgc3RybmNweShzb2FwLT5hcnJheU9mZnNldCwgdHAtPnZhbHVlLCBzaXplb2Yoc29hcC0+YXJyYXlPZmZzZXQpKTsKKyAgICAgIGVsc2UgaWYgKHNvYXAtPnZlcnNpb24gPT0gMSAmJiAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOQzpwb3NpdGlvbiIpKQorICAgICAgICBzb2FwLT5wb3NpdGlvbiA9IHNvYXBfZ2V0cG9zaXRpb24odHAtPnZhbHVlLCBzb2FwLT5wb3NpdGlvbnMpOworICAgICAgZWxzZSBpZiAoc29hcC0+dmVyc2lvbiA9PSAxICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5DOnJvb3QiKSkKKyAgICAgICAgc29hcC0+cm9vdCA9ICgoIXN0cmNtcCh0cC0+dmFsdWUsICIxIikgfHwgIXN0cmNtcCh0cC0+dmFsdWUsICJ0cnVlIikpKTsKKyAgICAgIGVsc2UgaWYgKChzb2FwLT52ZXJzaW9uID09IDEgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTlY6YWN0b3IiKSkKKyAgICAgICAgICAgIHx8IChzb2FwLT52ZXJzaW9uID09IDIgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTlY6cm9sZSIpKSkKKyAgICAgIHsgaWYgKCghc29hcC0+YWN0b3IgfHwgc3RyY21wKHNvYXAtPmFjdG9yLCB0cC0+dmFsdWUpKQorICAgICAgICAgJiYgc3RyY21wKHRwLT52YWx1ZSwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvYWN0b3IvbmV4dCIpCisgICAgICAgICAmJiBzdHJjbXAodHAtPnZhbHVlLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlL3JvbGUvbmV4dCIpKQorICAgICAgICAgIHNvYXAtPm90aGVyID0gMTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5WOm11c3RVbmRlcnN0YW5kIikKKyAgICAgICAgICAgICYmICghc3RyY21wKHRwLT52YWx1ZSwgIjEiKSB8fCAhc3RyY21wKHRwLT52YWx1ZSwgInRydWUiKSkpCisgICAgICAgIHNvYXAtPm11c3RVbmRlcnN0YW5kID0gMTsKKyAgICAgIGVsc2UgaWYgKCghc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJ4c2k6bnVsbCIpCisgICAgICAgICAgICAgfHwgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAieHNpOm5pbCIpKQorICAgICAgICAgICAgJiYgKCFzdHJjbXAodHAtPnZhbHVlLCAiMSIpCisgICAgICAgICAgICAgfHwgIXN0cmNtcCh0cC0+dmFsdWUsICJ0cnVlIikpKQorICAgICAgICBzb2FwLT5udWxsID0gMTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfcmV0cnkoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgc29hcF9yZXZlcnQoc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3JldmVydChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKCFzb2FwLT5wZWVrZWQpCisgIHsgc29hcC0+cGVla2VkID0gMTsKKyAgICBpZiAoc29hcC0+Ym9keSkKKyAgICAgIHNvYXAtPmxldmVsLS07CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXZlcnRpbmcgbGFzdCBlbGVtZW50IChsZXZlbD0ldSlcbiIsIHNvYXAtPmxldmVsKSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc3RyaW5nX291dChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgaW50IGZsYWcpCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnQ7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBtYXNrID0gMHhGRkZGRkY4MFVMOworI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IHNvYXAtPmRvbS0+ZGF0YSA9IHNvYXBfc3RyZHVwKHNvYXAsIHMpOworICAgIHJldHVybiBTT0FQX09LOworICB9CisjZW5kaWYKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0NfVVRGU1RSSU5HKQorICAgIG1hc2sgPSAwOworICB0ID0gczsKKyAgd2hpbGUgKChjID0gKnQrKykpCisgIHsgc3dpdGNoIChjKQorICAgIHsgCisgICAgY2FzZSA5OgorICAgICAgaWYgKGZsYWcpCisgICAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiJiN4OTsiLCA1KSkKKwkgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgcyA9IHQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDEwOgorICAgICAgaWYgKGZsYWcgfHwgIShzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKSkKKyAgICAgIHsgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICImI3hBOyIsIDUpKQorCSAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBzID0gdDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTM6CisgICAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIiYjeEQ7IiwgNSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHMgPSB0OworICAgICAgYnJlYWs7CisgICAgY2FzZSAnJic6CisgICAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIiZhbXA7IiwgNSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHMgPSB0OworICAgICAgYnJlYWs7CisgICAgY2FzZSAnPCc6CisgICAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIiZsdDsiLCA0KSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgcyA9IHQ7CisgICAgICBicmVhazsKKyAgICBjYXNlICc+JzoKKyAgICAgIGlmICghZmxhZykKKyAgICAgIHsgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICImZ3Q7IiwgNCkpCisJICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHMgPSB0OworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnIic6CisgICAgICBpZiAoZmxhZykKKyAgICAgIHsgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICImcXVvdDsiLCA2KSkKKwkgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgcyA9IHQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmZGVmIEhBVkVfTUJUT1dDCisgICAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfQ19NQlNUUklORykKKyAgICAgIHsgd2NoYXJfdCB3YzsKKyAgICAgICAgcmVnaXN0ZXIgaW50IG0gPSBtYnRvd2MoJndjLCB0IC0gMSwgTUJfQ1VSX01BWCk7CisgICAgICAgIGlmIChtID4gMCAmJiB3YyAhPSBjKQorICAgICAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9wdXR1dGY4KHNvYXAsIHdjKSkKKyAgICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKwkgIHMgPSB0ICs9IG0gLSAxOworCSAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyNlbmRpZgorI2VuZGlmCisgICAgICBpZiAoYyAmIG1hc2spCisgICAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9wdXR1dGY4KHNvYXAsICh1bnNpZ25lZCBjaGFyKWMpKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgcyA9IHQ7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfc3RyaW5nX2luKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgZmxhZywgbG9uZyBtaW5sZW4sIGxvbmcgbWF4bGVuKQoreyByZWdpc3RlciBjaGFyICpzOworICBjaGFyICp0ID0gTlVMTDsKKyAgcmVnaXN0ZXIgc2l6ZV90IGk7CisgIHJlZ2lzdGVyIGxvbmcgbCA9IDA7CisgIHJlZ2lzdGVyIGludCBuID0gMDsKKyAgcmVnaXN0ZXIgaW50IG0gPSAwOworICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisjaWYgIWRlZmluZWQoV0lUSF9MRUFORVIpICYmIGRlZmluZWQoSEFWRV9XQ1RPTUIpCisgIGNoYXIgYnVmW01CX0xFTl9NQVggPiA4ID8gTUJfTEVOX01BWCA6IDhdOworI2Vsc2UKKyAgY2hhciBidWZbOF07CisjZW5kaWYKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlYWRpbmcgc3RyaW5nIGNvbnRlbnRcbiIpKTsKKyAgaWYgKHNvYXAtPnBlZWtlZCkKKyAgeyBpZiAoIXNvYXAtPmJvZHkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKnNvYXAtPnRhZykKKyAgICB7IG4gPSAxOworICAgICAgc29hcC0+cGVla2VkID0gMDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICB0ID0gc29hcC0+dG1wYnVmOworICAgICAgdFswXSA9ICc8JzsKKyAgICAgIHN0cm5jcHkodCArIDEsIHNvYXAtPnRhZywgc2l6ZW9mKHNvYXAtPnRtcGJ1ZikgLSAxKTsKKyAgICAgIHN0cm5jYXQodCwgIj4iLCBzaXplb2Yoc29hcC0+dG1wYnVmKSk7CisgICAgICBtID0gc3RybGVuKHNvYXAtPnRhZykgKyAyOworI2VuZGlmCisgICAgfQorICB9CisjaWZkZWYgV0lUSF9DREFUQQorICBpZiAoIWZsYWcpCisgIHsgcmVnaXN0ZXIgaW50IHN0YXRlID0gMDsKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgICBzb2FwLT5sYWJpZHggPSAwOwkJCS8qIHVzZSBsb29rLWFzaWRlIGJ1ZmZlciAqLworI2Vsc2UKKyAgICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICAgIGZvciAoOzspCisgICAgeyAKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgICAgIHJlZ2lzdGVyIHNpemVfdCBrOworICAgICAgaWYgKHNvYXBfYXBwZW5kX2xhYihzb2FwLCBOVUxMLCAwKSkJLyogYWxsb2NhdGUgbW9yZSBzcGFjZSBpbiBsb29rLWFzaWRlIGJ1ZmZlciBpZiBuZWNlc3NhcnkgKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICBzID0gc29hcC0+bGFiYnVmICsgc29hcC0+bGFiaWR4OwkvKiBzcGFjZSB0byBwb3B1bGF0ZSAqLworICAgICAgayA9IHNvYXAtPmxhYmxlbiAtIHNvYXAtPmxhYmlkeDsJLyogbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSAqLworICAgICAgc29hcC0+bGFiaWR4ID0gc29hcC0+bGFibGVuOwkvKiBjbGFpbSB0aGlzIHNwYWNlICovCisjZWxzZQorICAgICAgcmVnaXN0ZXIgc2l6ZV90IGsgPSBTT0FQX0JMS0xFTjsKKyAgICAgIGlmICghKHMgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIGspKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBrOyBpKyspCisgICAgICB7IGlmIChtID4gMCkKKyAgICAgICAgeyAqcysrID0gKnQrKzsJLyogY29weSBtdWx0aWJ5dGUgY2hhcmFjdGVycyAqLworCSAgbS0tOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisJaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIGlmIChjID49IDB4ODAgJiYgIShzb2FwLT5tb2RlICYgU09BUF9FTkNfTEFUSU4pKQorICAgICAgICB7IHNvYXBfdW5nZXQoc29hcCwgYyk7CisJICBjID0gc29hcF9nZXR1dGY4KHNvYXApOworCSAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0NfVVRGU1RSSU5HKQorICAgICAgICAgIHsgaWYgKChjICYgMHg4MDAwMDAwMCkgJiYgYyA+PSAtMHg3RkZGRkY4MCAmJiBjIDwgU09BUF9BUCkKKyAgICAgICAgICAgIHsgYyAmPSAweDdGRkZGRkZGOworICAgICAgICAgICAgICB0ID0gYnVmOworICAgICAgICAgICAgICBpZiAoYyA8IDB4MDgwMCkKKyAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4QzAgfCAoKGMgPj4gNikgJiAweDFGKSk7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeyBpZiAoYyA8IDB4MDEwMDAwKQorICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEUwIHwgKChjID4+IDEyKSAmIDB4MEYpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeyBpZiAoYyA8IDB4MjAwMDAwKQorICAgICAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjAgfCAoKGMgPj4gMTgpICYgMHgwNykpOworICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgeyBpZiAoYyA8IDB4MDQwMDAwMDApCisgICAgICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEY4IHwgKChjID4+IDI0KSAmIDB4MDMpKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7ICp0KysgPSAoY2hhcikoMHhGQyB8ICgoYyA+PiAzMCkgJiAweDAxKSk7CisgICAgICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDI0KSAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTgpICYgMHgzRikpOworICAgICAgICAgICAgICAgICAgfSAgICAgCisgICAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTIpICYgMHgzRikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gNikgJiAweDNGKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKGMgJiAweDNGKSk7CisJICAgICAgbSA9IChpbnQpKHQgLSBidWYpIC0gMTsKKyAgICAgICAgICAgICAgdCA9IGJ1ZjsKKyAgICAgICAgICAgICAgKnMrKyA9ICp0Kys7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworCSAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisJc3dpdGNoIChzdGF0ZSkKKyAgICAgICAgeyBjYXNlIDE6CisgICAgICAgICAgICBpZiAoYyA9PSAnXScpCisJICAgICAgc3RhdGUgPSA0OworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisJICBjYXNlIDI6CisJICAgIGlmIChjID09ICctJykKKyAgICAgICAgICAgICAgc3RhdGUgPSA2OworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisJICBjYXNlIDM6CisJICAgIGlmIChjID09ICc/JykKKwkgICAgICBzdGF0ZSA9IDg7CisJICAgICpzKysgPSBjOworCSAgICBjb250aW51ZTsKKyAgICAgICAgICAvKiBDREFUQSAqLworCSAgY2FzZSA0OgorCSAgICBpZiAoYyA9PSAnXScpCisgICAgICAgICAgICAgIHN0YXRlID0gNTsKKwkgICAgZWxzZQorCSAgICAgIHN0YXRlID0gMTsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworCSAgY2FzZSA1OgorCSAgICBpZiAoYyA9PSAnPicpCisJICAgICAgc3RhdGUgPSAwOworCSAgICBlbHNlCisJICAgICAgc3RhdGUgPSAxOworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisgICAgICAgICAgLyogY29tbWVudCAqLworICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIGlmIChjID09ICctJykKKwkgICAgICBzdGF0ZSA9IDc7CisJICAgIGVsc2UKKwkgICAgICBzdGF0ZSA9IDI7CisJICAgICpzKysgPSBjOworCSAgICBjb250aW51ZTsKKyAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICBpZiAoYyA9PSAnPicpCisJICAgICAgc3RhdGUgPSAwOworCSAgICBlbHNlCisJICAgICAgc3RhdGUgPSAyOworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisgICAgICAgICAgLyogUEkgKi8KKwkgIGNhc2UgODoKKyAgICAgICAgICAgIGlmIChjID09ICc+JykKKwkgICAgICBzdGF0ZSA9IDA7CisJICAgIGVsc2UKKwkgICAgICBzdGF0ZSA9IDM7CisJICAgICpzKysgPSBjOworCSAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGMpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAnLyc6CisgICAgICAgICAgaWYgKG4gPiAwKQorICAgICAgICAgIHsgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgICAgICAgICAgIGlmIChjID09ICc+JykKKyAgICAgICAgICAgICAgbi0tOworICAgICAgICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgICB9CisgICAgICAgICAgKnMrKyA9ICcvJzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnPCc6CisJICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworCSAgaWYgKGMgPT0gJy8nKQorCSAgeyBpZiAobiA9PSAwKQorCSAgICB7IGMgPSBTT0FQX1RUOworCSAgICAgIGdvdG8gZW5kOworCSAgICB9CisJICAgIG4tLTsKKwkgIH0KKwkgIGVsc2UgaWYgKGMgPT0gJyEnKQorCSAgeyBjID0gc29hcF9nZXRjaGFyKHNvYXApOworCSAgICBpZiAoYyA9PSAnWycpCisgICAgICAgICAgICB7IGRvIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgICAgICAgICAgICAgIHdoaWxlICgoaW50KWMgIT0gRU9GICYmIGMgIT0gJ1snKTsKKyAgICAgICAgICAgICAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworCSAgICAgIHQgPSAoY2hhciopIiFbQ0RBVEFbIjsKKwkgICAgICBtID0gODsKKwkgICAgICBzdGF0ZSA9IDE7CisJICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJy0nKQorCSAgICB7IGlmICgoYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKSkgPT0gJy0nKQorCSAgICAgICAgc3RhdGUgPSAyOworCSAgICAgIHQgPSAoY2hhciopIiEtIjsKKwkgICAgICBtID0gMjsKKwkgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeyB0ID0gKGNoYXIqKSIhIjsKKwkgICAgICBtID0gMTsKKwkgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworCSAgICB9CisJICAgICpzKysgPSAnPCc7CisJICAgIGJyZWFrOworCSAgfQorCSAgZWxzZSBpZiAoYyA9PSAnPycpCisJICAgIHN0YXRlID0gMzsKKwkgIGVsc2UKKwkgICAgbisrOworICAgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgICAgKnMrKyA9ICc8JzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnPic6CisgICAgICAgICAgKnMrKyA9ICc+JzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnIic6CisgICAgICAgICAgKnMrKyA9ICciJzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZmRlZiBIQVZFX1dDVE9NQgorICAgICAgICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9DX01CU1RSSU5HKQorICAgICAgICAgIHsgbSA9IHdjdG9tYihidWYsIGMgJiAweDdGRkZGRkZGKTsKKyAgICAgICAgICAgIGlmIChtID49IDEgJiYgbSA8PSAoaW50KU1CX0NVUl9NQVgpCisgICAgICAgICAgICB7IHQgPSBidWY7CisgICAgICAgICAgICAgICpzKysgPSAqdCsrOworICAgICAgICAgICAgICBtLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7ICpzKysgPSBTT0FQX1VOS05PV05fQ0hBUjsKKwkgICAgICBtID0gMDsKKwkgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisjZW5kaWYKKyNlbmRpZgorICAgICAgICAgICAgKnMrKyA9IChjaGFyKShjICYgMHhGRik7CisgICAgICAgIH0KKwlsKys7CisgICAgICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgbWF4bGVuID49IDAgJiYgbCA+IG1heGxlbikKKyAgICAgICAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiU3RyaW5nIHRvbyBsb25nOiBtYXhsZW49JWxkXG4iLCBtYXhsZW4pKTsKKyAgICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfTEVOR1RIOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgc29hcC0+bGFiaWR4ID0gMDsJCQkvKiB1c2UgbG9vay1hc2lkZSBidWZmZXIgKi8KKyNlbHNlCisgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICBmb3IgKDs7KQorICB7IAorI2lmZGVmIFdJVEhfRkFTVAorICAgIHJlZ2lzdGVyIHNpemVfdCBrOworICAgIGlmIChzb2FwX2FwcGVuZF9sYWIoc29hcCwgTlVMTCwgMCkpCS8qIGFsbG9jYXRlIG1vcmUgc3BhY2UgaW4gbG9vay1hc2lkZSBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBzID0gc29hcC0+bGFiYnVmICsgc29hcC0+bGFiaWR4OwkvKiBzcGFjZSB0byBwb3B1bGF0ZSAqLworICAgIGsgPSBzb2FwLT5sYWJsZW4gLSBzb2FwLT5sYWJpZHg7CS8qIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgKi8KKyAgICBzb2FwLT5sYWJpZHggPSBzb2FwLT5sYWJsZW47CS8qIGNsYWltIHRoaXMgc3BhY2UgKi8KKyNlbHNlCisgICAgcmVnaXN0ZXIgc2l6ZV90IGsgPSBTT0FQX0JMS0xFTjsKKyAgICBpZiAoIShzID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBrKSkpCisgICAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICAgIGZvciAoaSA9IDA7IGkgPCBrOyBpKyspCisgICAgeyBpZiAobSA+IDApCisgICAgICB7ICpzKysgPSAqdCsrOwkvKiBjb3B5IG11bHRpYnl0ZSBjaGFyYWN0ZXJzICovCisgICAgICAgIG0tLTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfQ19VVEZTVFJJTkcpCisgICAgICB7IGlmICgoKGMgPSBzb2FwX2dldChzb2FwKSkgJiAweDgwMDAwMDAwKSAmJiBjID49IC0weDdGRkZGRjgwICYmIGMgPCBTT0FQX0FQKQorICAgICAgICB7IGMgJj0gMHg3RkZGRkZGRjsKKyAgICAgICAgICB0ID0gYnVmOworICAgICAgICAgIGlmIChjIDwgMHgwODAwKQorICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEMwIHwgKChjID4+IDYpICYgMHgxRikpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7IGlmIChjIDwgMHgwMTAwMDApCisgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhFMCB8ICgoYyA+PiAxMikgJiAweDBGKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7IGlmIChjIDwgMHgyMDAwMDApCisgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEYwIHwgKChjID4+IDE4KSAmIDB4MDcpKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7IGlmIChjIDwgMHgwNDAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhGOCB8ICgoYyA+PiAyNCkgJiAweDAzKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsgKnQrKyA9IChjaGFyKSgweEZDIHwgKChjID4+IDMwKSAmIDB4MDEpKTsKKyAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAyNCkgJiAweDNGKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAxOCkgJiAweDNGKSk7CisgICAgICAgICAgICAgIH0gICAgIAorICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTIpICYgMHgzRikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDYpICYgMHgzRikpOworICAgICAgICAgIH0KKyAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoYyAmIDB4M0YpKTsKKwkgIG0gPSAoaW50KSh0IC0gYnVmKSAtIDE7CisgICAgICAgICAgdCA9IGJ1ZjsKKyAgICAgICAgICAqcysrID0gKnQrKzsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBjID0gc29hcF9nZXR1dGY4KHNvYXApOworICAgICAgc3dpdGNoIChjKQorICAgICAgeworICAgICAgY2FzZSBTT0FQX1RUOgorICAgICAgICBpZiAobiA9PSAwKQorICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICBuLS07CisgICAgICAgICpzKysgPSAnPCc7CisgICAgICAgIHQgPSAoY2hhciopIi8iOworCW0gPSAxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9MVDoKKyAgICAgICAgbisrOworICAgICAgICAqcysrID0gJzwnOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9HVDoKKyAgICAgICAgKnMrKyA9ICc+JzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfUVQ6CisgICAgICAgICpzKysgPSAnIic7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTT0FQX0FQOgorICAgICAgICAqcysrID0gJ1wnJzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICcvJzoKKyAgICAgICAgaWYgKG4gPiAwKQorICAgICAgICB7IGMgPSBzb2FwX2dldChzb2FwKTsKKyAgICAgICAgICBpZiAoYyA9PSBTT0FQX0dUKQorICAgICAgICAgICAgbi0tOworICAgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgIH0KKyAgICAgICAgKnMrKyA9ICcvJzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICc8JyB8IDB4ODAwMDAwMDA6CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICpzKysgPSAnPCc7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAqcysrID0gJyYnOworICAgICAgICAgIHQgPSAoY2hhciopImx0OyI7CisJICBtID0gMzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJz4nIHwgMHg4MDAwMDAwMDoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9ICc+JzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAnJic7CisgICAgICAgICAgdCA9IChjaGFyKikiZ3Q7IjsKKwkgIG0gPSAzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnJicgfCAweDgwMDAwMDAwOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gJyYnOworICAgICAgICBlbHNlCisgICAgICAgIHsgKnMrKyA9ICcmJzsKKyAgICAgICAgICB0ID0gKGNoYXIqKSJhbXA7IjsKKwkgIG0gPSA0OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnIicgfCAweDgwMDAwMDAwOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gJyInOworICAgICAgICBlbHNlCisgICAgICAgIHsgKnMrKyA9ICcmJzsKKyAgICAgICAgICB0ID0gKGNoYXIqKSJxdW90OyI7CisJICBtID0gNTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ1wnJyB8IDB4ODAwMDAwMDA6CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICpzKysgPSAnXCcnOworICAgICAgICBlbHNlCisgICAgICAgIHsgKnMrKyA9ICcmJzsKKyAgICAgICAgICB0ID0gKGNoYXIqKSJhcG9zOyI7CisJICBtID0gNTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICAgIGdvdG8gZW5kOworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmZGVmIEhBVkVfV0NUT01CCisgICAgICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9DX01CU1RSSU5HKQorICAgICAgICB7IG0gPSB3Y3RvbWIoYnVmLCBjICYgMHg3RkZGRkZGRik7CisgICAgICAgICAgaWYgKG0gPj0gMSAmJiBtIDw9IChpbnQpTUJfQ1VSX01BWCkKKyAgICAgICAgICB7IHQgPSBidWY7CisgICAgICAgICAgICAqcysrID0gKnQrKzsKKyAgICAgICAgICAgIG0tLTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsgKnMrKyA9IFNPQVBfVU5LTk9XTl9DSEFSOworCSAgICBtID0gMDsKKwkgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYKKyNlbmRpZgorICAgICAgICAgICpzKysgPSAoY2hhcikoYyAmIDB4RkYpOworICAgICAgfQorICAgICAgbCsrOworICAgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiBtYXhsZW4gPj0gMCAmJiBsID4gbWF4bGVuKQorICAgICAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiU3RyaW5nIHRvbyBsb25nOiBtYXhsZW49JWxkXG4iLCBtYXhsZW4pKTsKKyAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0xFTkdUSDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgfQorICB9CitlbmQ6CisgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICpzID0gJ1wwJzsKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgdCA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPmxhYmJ1Zik7CisjZWxzZQorICBzb2FwX3NpemVfYmxvY2soc29hcCwgaSsxKTsKKyAgdCA9IHNvYXBfc2F2ZV9ibG9jayhzb2FwLCBOVUxMLCAwKTsKKyNlbmRpZgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIGwgPCBtaW5sZW4pCisgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlN0cmluZyB0b28gc2hvcnQ6ICVsZCBjaGFycywgbWlubGVuPSVsZFxuIiwgbCwgbWlubGVuKSk7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0xFTkdUSDsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IGlmIChmbGFnID09IDMpCisgICAgICBzb2FwLT5kb20tPnRhaWwgPSB0OworICAgIGVsc2UKKyAgICAgIHNvYXAtPmRvbS0+ZGF0YSA9IHQ7CisgIH0KKyNlbmRpZgorICBpZiAoZmxhZyA9PSAyKQorICAgIGlmIChzb2FwX3MyUU5hbWUoc29hcCwgdCwgJnQpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiB0OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3dzdHJpbmdfb3V0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB3Y2hhcl90ICpzLCBpbnQgZmxhZykKK3sgY29uc3QgY2hhciAqdDsKKyAgY2hhciB0bXA7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyB3Y2hhcl90ICpyID0gKHdjaGFyX3QqKXM7CisgICAgaW50IG4gPSAxOworICAgIHdoaWxlICgqcisrKQorICAgICAgbisrOworICAgIHNvYXAtPmRvbS0+d2lkZSA9IHIgPSAod2NoYXJfdCopc29hcF9tYWxsb2Moc29hcCwgbiAqIHNpemVvZih3Y2hhcl90KSk7CisgICAgd2hpbGUgKG4tLSkKKyAgICAgICpyKysgPSAqcysrOworICAgIHJldHVybiBTT0FQX09LOworICB9CisjZW5kaWYKKyAgd2hpbGUgKChjID0gKnMrKykpCisgIHsgc3dpdGNoIChjKQorICAgIHsgCisgICAgY2FzZSA5OgorICAgICAgaWYgKGZsYWcpCisgICAgICAgIHQgPSAiJiN4OTsiOworICAgICAgZWxzZQorICAgICAgICB0ID0gIlx0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTA6CisgICAgICBpZiAoZmxhZyB8fCAhKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpKQorICAgICAgICB0ID0gIiYjeEE7IjsKKyAgICAgIGVsc2UKKyAgICAgICAgdCA9ICJcbiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEzOgorICAgICAgdCA9ICImI3hEOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICcmJzoKKyAgICAgIHQgPSAiJmFtcDsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnPCc6CisgICAgICB0ID0gIiZsdDsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnPic6CisgICAgICBpZiAoZmxhZykKKyAgICAgICAgdCA9ICI+IjsKKyAgICAgIGVsc2UKKwl0ID0gIiZndDsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnIic6CisgICAgICBpZiAoZmxhZykKKyAgICAgICAgdCA9ICImcXVvdDsiOworICAgICAgZWxzZQorICAgICAgICB0ID0gIlwiIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoYyA+IDAgJiYgYyA8IDB4ODApCisgICAgICB7IHRtcCA9IChjaGFyKWM7CisgICAgICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsICZ0bXAsIDEpKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHNvYXBfcHV0dXRmOChzb2FwLCAodW5zaWduZWQgbG9uZyljKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChzb2FwX3NlbmQoc29hcCwgdCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3djaGFyX3QgKgorU09BUF9GTUFDMgorc29hcF93c3RyaW5nX2luKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgZmxhZywgbG9uZyBtaW5sZW4sIGxvbmcgbWF4bGVuKQoreyB3Y2hhcl90ICpzOworICByZWdpc3RlciBpbnQgaSwgbiA9IDA7CisgIHJlZ2lzdGVyIGxvbmcgbCA9IDA7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgY29uc3QgY2hhciAqdCA9IE5VTEw7CisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWFkaW5nIHdpZGUgc3RyaW5nIGNvbnRlbnRcbiIpKTsKKyAgaWYgKHNvYXAtPnBlZWtlZCkKKyAgeyBpZiAoIXNvYXAtPmJvZHkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKnNvYXAtPnRhZykKKyAgICB7IG4gPSAxOworICAgICAgc29hcC0+cGVla2VkID0gMDsKKyAgICB9CisgIH0KKyAgaWYgKHNvYXBfbmV3X2Jsb2NrKHNvYXApKQorICAgIHJldHVybiBOVUxMOworICBmb3IgKDs7KQorICB7IGlmICghKHMgPSAod2NoYXJfdCopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIHNpemVvZih3Y2hhcl90KSpTT0FQX0JMS0xFTikpKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IFNPQVBfQkxLTEVOOyBpKyspCisgICAgeyBpZiAodCkKKyAgICAgIHsgKnMrKyA9ICh3Y2hhcl90KSp0Kys7CisgICAgICAgIGlmICghKnQpCisgICAgICAgICAgdCA9IE5VTEw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgYyA9IHNvYXBfZ2V0dXRmOChzb2FwKTsKKyAgICAgIHN3aXRjaCAoYykKKyAgICAgIHsKKyAgICAgIGNhc2UgU09BUF9UVDoKKyAgICAgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgbi0tOworICAgICAgICAqcysrID0gJzwnOworICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsICcvJyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTT0FQX0xUOgorICAgICAgICBuKys7CisgICAgICAgICpzKysgPSAnPCc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTT0FQX0dUOgorICAgICAgICAqcysrID0gJz4nOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9RVDoKKyAgICAgICAgKnMrKyA9ICciJzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfQVA6CisgICAgICAgICpzKysgPSAnXCcnOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJy8nOgorICAgICAgICBpZiAobiA+IDApCisgICAgICAgIHsgYyA9IHNvYXBfZ2V0dXRmOChzb2FwKTsKKyAgICAgICAgICBpZiAoYyA9PSBTT0FQX0dUKQorICAgICAgICAgICAgbi0tOworICAgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgIH0KKyAgICAgICAgKnMrKyA9ICcvJzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICc8JzoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9IChzb2FwX3djaGFyKSc8JzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAoc29hcF93Y2hhciknJic7CisgICAgICAgICAgdCA9ICJsdDsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnPic6CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICpzKysgPSAoc29hcF93Y2hhciknPic7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAqcysrID0gKHNvYXBfd2NoYXIpJyYnOworICAgICAgICAgIHQgPSAiZ3Q7IjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJyInOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gKHNvYXBfd2NoYXIpJyInOworICAgICAgICBlbHNlCisgICAgICAgIHsgKnMrKyA9IChzb2FwX3djaGFyKScmJzsKKyAgICAgICAgICB0ID0gInF1b3Q7IjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAqcysrID0gKHdjaGFyX3QpYyAmIDB4N0ZGRkZGRkY7CisgICAgICB9CisgICAgICBsKys7CisgICAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIG1heGxlbiA+PSAwICYmIGwgPiBtYXhsZW4pCisgICAgICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJTdHJpbmcgdG9vIGxvbmc6IG1heGxlbj0lbGRcbiIsIG1heGxlbikpOworICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfTEVOR1RIOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICB9CisgIH0KK2VuZDoKKyAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgKnMgPSAnXDAnOworICBzb2FwX3NpemVfYmxvY2soc29hcCwgc2l6ZW9mKHdjaGFyX3QpICogKGkgKyAxKSk7CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgbCA8IG1pbmxlbikKKyAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiU3RyaW5nIHRvbyBzaG9ydDogJWxkIGNoYXJzLCBtaW5sZW49JWxkXG4iLCBsLCBtaW5sZW4pKTsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfTEVOR1RIOworICAgIHJldHVybiBOVUxMOworICB9CisgIHMgPSAod2NoYXJfdCopc29hcF9zYXZlX2Jsb2NrKHNvYXAsIE5VTEwsIDApOworI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICAgIHNvYXAtPmRvbS0+d2lkZSA9IHM7CisjZW5kaWYKKyAgcmV0dXJuIHM7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2ludDJzKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbikKK3sgcmV0dXJuIHNvYXBfbG9uZzJzKHNvYXAsIChsb25nKW4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dGludChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGludCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9sb25nMnMoc29hcCwgKGxvbmcpKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MyaW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBpbnQgKnApCit7IGlmIChzKQorICB7IGNoYXIgKnI7CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBzb2FwX3Jlc2V0X2Vycm5vOworI2VuZGlmCisjZW5kaWYKKyAgICAqcCA9IChpbnQpc29hcF9zdHJ0b2wocywgJnIsIDEwKTsKKyAgICBpZiAoKHMgPT0gciAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpIHx8ICpyCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgfHwgc29hcF9lcnJubyA9PSBTT0FQX0VSQU5HRQorI2VuZGlmCisjZW5kaWYKKyAgICApCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQgKgorU09BUF9GTUFDMgorc29hcF9pbmludChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6Ynl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9IChpbnQqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihpbnQpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAoaW50Kilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKGludCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MyaW50KHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2xvbmcycyhzdHJ1Y3Qgc29hcCAqc29hcCwgbG9uZyBuKQoreyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIiVsZCIsIG4pOworICByZXR1cm4gc29hcC0+dG1wYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dGxvbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBsb25nICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX2xvbmcycyhzb2FwLCAqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJsb25nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBsb25nICpwKQoreyBpZiAocykKKyAgeyBjaGFyICpyOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgc29hcF9yZXNldF9lcnJubzsKKyNlbmRpZgorI2VuZGlmCisgICAgKnAgPSBzb2FwX3N0cnRvbChzLCAmciwgMTApOworICAgIGlmICgocyA9PSByICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkgfHwgKnIKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICB8fCBzb2FwX2Vycm5vID09IFNPQVBfRVJBTkdFCisjZW5kaWYKKyNlbmRpZgorICAgICkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2xvbmcgKgorU09BUF9GTUFDMgorc29hcF9pbmxvbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgbG9uZyAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6aW50IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6c2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpieXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKGxvbmcqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihsb25nKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKGxvbmcqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YobG9uZyksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MybG9uZyhzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9MT05HNjQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgTE9ORzY0IG4pCit7IHNwcmludGYoc29hcC0+dG1wYnVmLCBTT0FQX0xPTkdfRk9STUFULCBuKTsKKyAgcmV0dXJuIHNvYXAtPnRtcGJ1ZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRMT05HNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBMT05HNjQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfTE9ORzY0MnMoc29hcCwgKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MyTE9ORzY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBMT05HNjQgKnApCit7IGlmIChzKQorICB7CisjaWZkZWYgSEFWRV9TVFJUT0xMCisgICAgY2hhciAqcjsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgIHNvYXBfcmVzZXRfZXJybm87CisjZW5kaWYKKyNlbmRpZgorICAgICpwID0gc3RydG9sbChzLCAmciwgMTApOworICAgIGlmICgocyA9PSByICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkgfHwgKnIKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgIHx8IHNvYXBfZXJybm8gPT0gU09BUF9FUkFOR0UKKyNlbmRpZgorI2VuZGlmCisgICAgICApCisjZWxzZQorIyBpZmRlZiBIQVZFX1NTQ0FORgorICAgIGlmIChzc2NhbmYocywgU09BUF9MT05HX0ZPUk1BVCwgcCkgIT0gMSkKKyMgZW5kaWYKKyNlbmRpZgorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorTE9ORzY0ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5MT05HNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgTE9ORzY0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjppbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6cG9zaXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bmVnYXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bm9uUG9zaXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bm9uTmVnYXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bG9uZyIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6Ynl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9IChMT05HNjQqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihMT05HNjQpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAoTE9ORzY0Kilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKExPTkc2NCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MyTE9ORzY0KHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2J5dGUycyhzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciBuKQoreyByZXR1cm4gc29hcF9sb25nMnMoc29hcCwgKGxvbmcpbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0Ynl0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfbG9uZzJzKHNvYXAsIChsb25nKSpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMmJ5dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGNoYXIgKnApCit7IGlmIChzKQorICB7IGxvbmcgbjsKKyAgICBjaGFyICpyOworICAgIG4gPSBzb2FwX3N0cnRvbChzLCAmciwgMTApOworICAgIGlmIChzID09IHIgfHwgKnIgfHwgbiA8IC0xMjggfHwgbiA+IDEyNykKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgICpwID0gKGNoYXIpbjsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5ieXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGNoYXIgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAoY2hhciopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKGNoYXIpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAoY2hhciopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihjaGFyKSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJieXRlKHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3Nob3J0MnMoc3RydWN0IHNvYXAgKnNvYXAsIHNob3J0IG4pCit7IHJldHVybiBzb2FwX2xvbmcycyhzb2FwLCAobG9uZyluKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRzaG9ydChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHNob3J0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX2xvbmcycyhzb2FwLCAobG9uZykqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJzaG9ydChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgc2hvcnQgKnApCit7IGlmIChzKQorICB7IGxvbmcgbjsKKyAgICBjaGFyICpyOworICAgIG4gPSBzb2FwX3N0cnRvbChzLCAmciwgMTApOworICAgIGlmIChzID09IHIgfHwgKnIgfHwgbiA8IC0zMjc2OCB8fCBuID4gMzI3NjcpCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICAqcCA9IChzaG9ydCluOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3Nob3J0ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5zaG9ydChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzaG9ydCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6c2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpieXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKHNob3J0Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2Yoc2hvcnQpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAoc2hvcnQqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2Yoc2hvcnQpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMnNob3J0KHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2Zsb2F0MnMoc3RydWN0IHNvYXAgKnNvYXAsIGZsb2F0IG4pCit7IGNvbnN0IGNoYXIgKnM7CisgIGlmIChzb2FwX2lzbmFuKChkb3VibGUpbikpCisgICAgcyA9ICJOYU4iOworICBlbHNlIGlmIChzb2FwX2lzcGluZmYobikpCisgICAgcyA9ICJJTkYiOworICBlbHNlIGlmIChzb2FwX2lzbmluZmYobikpCisgICAgcyA9ICItSU5GIjsKKyAgZWxzZQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCBzb2FwLT5mbG9hdF9mb3JtYXQsIG4pOworICAgIHMgPSBzb2FwLT50bXBidWY7CisgIH0KKyAgcmV0dXJuIHM7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0ZmxvYXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBmbG9hdCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9mbG9hdDJzKHNvYXAsICpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMmZsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBmbG9hdCAqcCkKK3sgaWYgKHMpCisgIHsgaWYgKCEqcykKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBpZiAoIXNvYXBfdGFnX2NtcChzLCAiSU5GIikpCisgICAgICAqcCA9IEZMVF9QSU5GVFk7CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChzLCAiK0lORiIpKQorICAgICAgKnAgPSBGTFRfUElORlRZOworICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAocywgIi1JTkYiKSkKKyAgICAgICpwID0gRkxUX05JTkZUWTsKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHMsICJOYU4iKSkKKyAgICAgICpwID0gRkxUX05BTjsKKyAgICBlbHNlCisgICAgeworLyogT24gc29tZSBzeXN0ZW1zLCBzdHJ0b2YgYXBwZWFycyB0byBiZSBicm9rZW4gb3IgZG9lc24ndCBsaW5rOiB1c2Ugd2l0aCBjYXV0aW9uICovCisjaWYgZGVmaW5lZChIQVZFX1NUUlRPRikKKyAgICAgIGNoYXIgKnI7CisgICAgICAqcCA9IHN0cnRvZigoY2hhciopcywgJnIpOworICAgICAgaWYgKCpyKQorI2VsaWYgZGVmaW5lZChIQVZFX1NUUlRPRCkKKyAgICAgIGNoYXIgKnI7CisgICAgICAqcCA9IChmbG9hdClzdHJ0b2QocywgJnIpOworICAgICAgaWYgKCpyKQorI2VuZGlmCisjaWZkZWYgSEFWRV9TU0NBTkYKKyAgICAgICAgaWYgKHNzY2FuZihzLCAiJWciLCBwKSAhPSAxKQorICAgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworI2Vsc2UKKyAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisjZW5kaWYKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIGludCBzb2FwX2lzbnVtZXJpYyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdHlwZSkKK3sgaWYgKHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmZsb2F0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6ZG91YmxlIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6ZGVjaW1hbCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpwb3NpdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpuZWdhdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpub25Qb3NpdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpub25OZWdhdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpsb25nIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6aW50IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6c2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpieXRlIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRMb25nIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRJbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZFNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRCeXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIFNPQVBfRVJSOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorZmxvYXQgKgorU09BUF9GTUFDMgorc29hcF9pbmZsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGZsb2F0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlICE9ICdcMCcgJiYgc29hcF9pc251bWVyaWMoc29hcCwgdHlwZSkpCisgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgcCA9IChmbG9hdCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKGZsb2F0KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKGZsb2F0Kilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKGZsb2F0KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJmbG9hdChzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9kb3VibGUycyhzdHJ1Y3Qgc29hcCAqc29hcCwgZG91YmxlIG4pCit7IGNvbnN0IGNoYXIgKnM7CisgIGlmIChzb2FwX2lzbmFuKG4pKQorICAgIHMgPSAiTmFOIjsKKyAgZWxzZSBpZiAoc29hcF9pc3BpbmZkKG4pKQorICAgIHMgPSAiSU5GIjsKKyAgZWxzZSBpZiAoc29hcF9pc25pbmZkKG4pKQorICAgIHMgPSAiLUlORiI7CisgIGVsc2UKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1Ziwgc29hcC0+ZG91YmxlX2Zvcm1hdCwgbik7CisgICAgcyA9IHNvYXAtPnRtcGJ1ZjsKKyAgfQorICByZXR1cm4gczsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRkb3VibGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBkb3VibGUgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfZG91YmxlMnMoc29hcCwgKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MyZG91YmxlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBkb3VibGUgKnApCit7IGlmIChzKQorICB7IGlmICghKnMpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgaWYgKCFzb2FwX3RhZ19jbXAocywgIklORiIpKQorICAgICAgKnAgPSBEQkxfUElORlRZOworICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAocywgIitJTkYiKSkKKyAgICAgICpwID0gREJMX1BJTkZUWTsKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHMsICItSU5GIikpCisgICAgICAqcCA9IERCTF9OSU5GVFk7CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChzLCAiTmFOIikpCisgICAgICAqcCA9IERCTF9OQU47CisgICAgZWxzZQorICAgIHsKKyNpZmRlZiBIQVZFX1NUUlRPRAorICAgICAgY2hhciAqcjsKKyAgICAgICpwID0gc3RydG9kKHMsICZyKTsKKyAgICAgIGlmICgqcikKKyNlbmRpZgorI2lmZGVmIEhBVkVfU1NDQU5GCisgICAgICAgIGlmIChzc2NhbmYocywgIiVsZyIsIHApICE9IDEpCisgICAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisjZWxzZQorICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyNlbmRpZgorICAgIH0KKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitkb3VibGUgKgorU09BUF9GTUFDMgorc29hcF9pbmRvdWJsZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBkb3VibGUgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUgIT0gJ1wwJyAmJiBzb2FwX2lzbnVtZXJpYyhzb2FwLCB0eXBlKSkKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICBwID0gKGRvdWJsZSopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKGRvdWJsZSksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChkb3VibGUqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YoZG91YmxlKSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJkb3VibGUoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfdW5zaWduZWRCeXRlMnMoc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIGNoYXIgbikKK3sgcmV0dXJuIHNvYXBfdW5zaWduZWRMb25nMnMoc29hcCwgKHVuc2lnbmVkIGxvbmcpbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0dW5zaWduZWRCeXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgdW5zaWduZWQgY2hhciAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF91bnNpZ25lZExvbmcycyhzb2FwLCAodW5zaWduZWQgbG9uZykqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJ1bnNpZ25lZEJ5dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGNoYXIgKnApCit7IGlmIChzKQorICB7IHVuc2lnbmVkIGxvbmcgbjsKKyAgICBjaGFyICpyOworICAgIG4gPSBzb2FwX3N0cnRvdWwocywgJnIsIDEwKTsKKyAgICBpZiAocyA9PSByIHx8ICpyIHx8IG4gPiAyNTUpCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICAqcCA9ICh1bnNpZ25lZCBjaGFyKW47CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordW5zaWduZWQgY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX2ludW5zaWduZWRCeXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIGNoYXIgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkQnl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9ICh1bnNpZ25lZCBjaGFyKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YodW5zaWduZWQgY2hhciksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9ICh1bnNpZ25lZCBjaGFyKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMnVuc2lnbmVkQnl0ZShzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF91bnNpZ25lZFNob3J0MnMoc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIHNob3J0IG4pCit7IHJldHVybiBzb2FwX3Vuc2lnbmVkTG9uZzJzKHNvYXAsICh1bnNpZ25lZCBsb25nKW4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHVuc2lnbmVkU2hvcnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCB1bnNpZ25lZCBzaG9ydCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF91bnNpZ25lZExvbmcycyhzb2FwLCAodW5zaWduZWQgbG9uZykqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJ1bnNpZ25lZFNob3J0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBzaG9ydCAqcCkKK3sgaWYgKHMpCisgIHsgdW5zaWduZWQgbG9uZyBuOworICAgIGNoYXIgKnI7CisgICAgbiA9IHNvYXBfc3RydG91bChzLCAmciwgMTApOworICAgIGlmIChzID09IHIgfHwgKnIgfHwgbiA+IDY1NTM1KQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgKnAgPSAodW5zaWduZWQgc2hvcnQpbjsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit1bnNpZ25lZCBzaG9ydCAqCitTT0FQX0ZNQUMyCitzb2FwX2ludW5zaWduZWRTaG9ydChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB1bnNpZ25lZCBzaG9ydCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRTaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkQnl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9ICh1bnNpZ25lZCBzaG9ydCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKHVuc2lnbmVkIHNob3J0Kilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJ1bnNpZ25lZFNob3J0KHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3Vuc2lnbmVkSW50MnMoc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIGludCBuKQoreyByZXR1cm4gc29hcF91bnNpZ25lZExvbmcycyhzb2FwLCAodW5zaWduZWQgbG9uZyluKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXR1bnNpZ25lZEludChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIGludCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF91bnNpZ25lZExvbmcycyhzb2FwLCAodW5zaWduZWQgbG9uZykqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJ1bnNpZ25lZEludChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50ICpwKQoreyBpZiAocykKKyAgeyBjaGFyICpyOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgc29hcF9yZXNldF9lcnJubzsKKyNlbmRpZgorI2VuZGlmCisgICAgKnAgPSAodW5zaWduZWQgaW50KXNvYXBfc3RydG91bChzLCAmciwgMTApOworICAgIGlmICgocyA9PSByICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkgfHwgKnIKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICB8fCBzb2FwX2Vycm5vID09IFNPQVBfRVJBTkdFCisjZW5kaWYKKyNlbmRpZgorICAgICkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3Vuc2lnbmVkIGludCAqCitTT0FQX0ZNQUMyCitzb2FwX2ludW5zaWduZWRJbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgdW5zaWduZWQgaW50ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkU2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAodW5zaWduZWQgaW50Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YodW5zaWduZWQgaW50KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKHVuc2lnbmVkIGludCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZih1bnNpZ25lZCBpbnQpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMnVuc2lnbmVkSW50KHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3Vuc2lnbmVkTG9uZzJzKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBsb25nIG4pCit7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiJWx1Iiwgbik7CisgIHJldHVybiBzb2FwLT50bXBidWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0dW5zaWduZWRMb25nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgdW5zaWduZWQgbG9uZyAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF91bnNpZ25lZExvbmcycyhzb2FwLCAqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJ1bnNpZ25lZExvbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGxvbmcgKnApCit7IGlmIChzKQorICB7IGNoYXIgKnI7CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBzb2FwX3Jlc2V0X2Vycm5vOworI2VuZGlmCisjZW5kaWYKKyAgICAqcCA9IHNvYXBfc3RydG91bChzLCAmciwgMTApOworICAgIGlmICgocyA9PSByICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkgfHwgKnIKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICB8fCBzb2FwX2Vycm5vID09IFNPQVBfRVJBTkdFCisjZW5kaWYKKyNlbmRpZgorICAgICkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3Vuc2lnbmVkIGxvbmcgKgorU09BUF9GTUFDMgorc29hcF9pbnVuc2lnbmVkTG9uZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB1bnNpZ25lZCBsb25nICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkU2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAodW5zaWduZWQgbG9uZyopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAodW5zaWduZWQgbG9uZyopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZih1bnNpZ25lZCBsb25nKSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJ1bnNpZ25lZExvbmcoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfVUxPTkc2NDJzKHN0cnVjdCBzb2FwICpzb2FwLCBVTE9ORzY0IG4pCit7IHNwcmludGYoc29hcC0+dG1wYnVmLCBTT0FQX1VMT05HX0ZPUk1BVCwgbik7CisgIHJldHVybiBzb2FwLT50bXBidWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0VUxPTkc2NChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IFVMT05HNjQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfVUxPTkc2NDJzKHNvYXAsICpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMlVMT05HNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIFVMT05HNjQgKnApCit7IGlmIChzKQorICB7CisjaWZkZWYgSEFWRV9TVFJUT1VMTAorICAgIGNoYXIgKnI7CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBzb2FwX3Jlc2V0X2Vycm5vOworI2VuZGlmCisjZW5kaWYKKyAgICAqcCA9IHN0cnRvdWxsKHMsICZyLCAxMCk7CisgICAgaWYgKChzID09IHIgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKSB8fCAqcgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICAgfHwgc29hcF9lcnJubyA9PSBTT0FQX0VSQU5HRQorI2VuZGlmCisjZW5kaWYKKyAgICAgICkKKyNlbHNlCisjIGlmZGVmIEhBVkVfU1NDQU5GCisgICAgaWYgKHNzY2FuZihzLCBTT0FQX1VMT05HX0ZPUk1BVCwgcCkgIT0gMSkKKyMgZW5kaWYKKyNlbmRpZgorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorVUxPTkc2NCAqCitTT0FQX0ZNQUMyCitzb2FwX2luVUxPTkc2NChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBVTE9ORzY0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnBvc2l0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOm5vbk5lZ2F0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkTG9uZyIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkSW50IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRTaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkQnl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisgIHAgPSAoVUxPTkc2NCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKFVMT05HNjQpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAoVUxPTkc2NCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihVTE9ORzY0KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJVTE9ORzY0KHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMnN0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgY2hhciAqKnQpCit7ICp0ID0gTlVMTDsKKyAgaWYgKHMpCisgIHsgaWYgKCEoKnQgPSBzb2FwX3N0cmR1cChzb2FwLCBzKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICBpZiAoIShzb2FwLT5tb2RlICYgKFNPQVBfRU5DX0xBVElOIHwgU09BUF9DX1VURlNUUklORykpKQorICAgIHsgLyogVE9ETzogY29uc2lkZXIgdHJ1bmNhdGluZyBVVEY4IHRvIEFTQ0lJIGZvciByZWd1bGFyIFhNTCBhdHRyaWJ1dGUgc3RyaW5ncz8gKi8KKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MyUU5hbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGNoYXIgKip0KQoreyBpZiAocykKKyAgeyBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnA7CisgICAgY29uc3QgY2hhciAqcDsKKyAgICBpZiAoIXN0cm5jbXAocywgInhtbDoiLCA0KSkKKyAgICB7ICp0ID0gc29hcF9zdHJkdXAoc29hcCwgcyk7CisgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICB9CisgICAgbnAgPSBzb2FwLT5ubGlzdDsKKyAgICBwID0gc3RyY2hyKHMsICc6Jyk7CisgICAgaWYgKHApCisgICAgeyByZWdpc3RlciBpbnQgbiA9IHAgLSBzOworICAgICAgd2hpbGUgKG5wICYmIChzdHJuY21wKG5wLT5pZCwgcywgbikgfHwgbnAtPmlkW25dKSkKKyAgICAgICAgbnAgPSBucC0+bmV4dDsKKyAgICAgIHArKzsKKyAgICB9CisgICAgZWxzZQorICAgIHsgd2hpbGUgKG5wICYmICpucC0+aWQpCisgICAgICAgIG5wID0gbnAtPm5leHQ7CisgICAgICBwID0gczsKKyAgICB9CisgICAgaWYgKG5wKQorICAgIHsgaWYgKG5wLT5pbmRleCA+PSAwICYmIHNvYXAtPmxvY2FsX25hbWVzcGFjZXMpCisgICAgICB7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnEgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW25wLT5pbmRleF0uaWQ7CisgICAgICAgIGlmIChxKQorICAgICAgICB7IGlmICgoKnQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc3RybGVuKHApICsgc3RybGVuKHEpICsgMikpKQorICAgICAgICAgICAgc3ByaW50ZigqdCwgIiVzOiVzIiwgcSwgcCk7CisgICAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChucC0+bnMpCisgICAgICB7IGlmICgoKnQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc3RybGVuKHApICsgc3RybGVuKG5wLT5ucykgKyA0KSkpCisgICAgICAgICAgc3ByaW50ZigqdCwgIlwiJXNcIjolcyIsIG5wLT5ucywgcCk7CisgICAgICAgIHJldHVybiBTT0FQX09LOworICAgICAgfQorICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJOYW1lc3BhY2UgcHJlZml4IG9mICclcycgbm90IGRlZmluZWQgKGluZGV4PSVkLCBVUkk9JXMpXG4iLCBzLCBucC0+aW5kZXgsIG5wLT5ucz9ucC0+bnM6IiIpKTsKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTkFNRVNQQUNFOyAKKyAgICB9CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJOYW1lc3BhY2UgcHJlZml4IG9mICclcycgbm90IGRlZmluZWQsIGFzc3VtaW5nIGVtcHR5IG5hbWVzcGFjZVxuIiwgcykpOworICAgIGlmICgoKnQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc3RybGVuKHApICsgNCkpKQorICAgICAgc3ByaW50ZigqdCwgIlwiXCI6JXMiLCBwKTsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9RTmFtZTJzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzKQoreyBzdHJ1Y3QgTmFtZXNwYWNlICpwOworICBjaGFyICp0OworICBpbnQgbjsKKyAgaWYgKCFzIHx8ICpzICE9ICciJykKKyAgeworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBpZiAocyAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkpCisgICAgeyB0ID0gKGNoYXIqKXN0cmNocihzLCAnOicpOworICAgICAgaWYgKHQpCisgICAgICAgIHNvYXBfdXRpbGl6ZV9ucyhzb2FwLCBzLCB0IC0gcyk7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIHM7CisgIH0KKyAgcysrOworICBpZiAoKHAgPSBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzKSkKKyAgeyBmb3IgKDsgcC0+aWQ7IHArKykKKyAgICB7IGlmIChwLT5ucykKKyAgICAgICAgaWYgKCFzb2FwX3RhZ19jbXAocywgcC0+bnMpKQorICAgICAgICAgIGJyZWFrOworICAgICAgaWYgKHAtPmluKQorICAgICAgICBpZiAoIXNvYXBfdGFnX2NtcChzLCBwLT5pbikpCisgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChwICYmIHAtPmlkKQorICAgIHsgcyA9IHN0cmNocihzLCAnIicpOworICAgICAgaWYgKHMpCisgICAgICB7IHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc3RybGVuKHAtPmlkKSArIHN0cmxlbihzKSk7CisgICAgICAgIHN0cmNweSh0LCBwLT5pZCk7CisJc3RyY2F0KHQsIHMgKyAxKTsKKyAgICAgICAgcmV0dXJuIHQ7CisgICAgICB9CisgICAgfQorICB9CisgIHQgPSAoY2hhciopc3RyY2hyKHMsICciJyk7CisgIGlmICh0KQorICAgIG4gPSB0IC0gczsKKyAgZWxzZQorICAgIG4gPSAwOworICB0ID0gc29hcF9zdHJkdXAoc29hcCwgcyk7CisgIHRbbl0gPSAnXDAnOworICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgInhtbG5zOl8lZCIsIHNvYXAtPmlkbnVtKyspOworICBzb2FwX3NldF9hdHRyKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgdCk7CisgIHMgPSBzdHJjaHIocywgJyInKTsKKyAgaWYgKHMpCisgIHsgdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzdHJsZW4oc29hcC0+dG1wYnVmKSArIHN0cmxlbihzKSAtIDYpOworICAgIHN0cmNweSh0LCBzb2FwLT50bXBidWYgKyA2KTsKKyAgICBzdHJjYXQodCwgcyArIDEpOworICB9CisgIHJldHVybiB0OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3Myd2NoYXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHdjaGFyX3QgKip0KQoreyB3Y2hhcl90ICpyOworICBpZiAoIXMpCisgICAgKnQgPSBOVUxMOworICBlbHNlCisgIHsgKnQgPSByID0gKHdjaGFyX3QqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZih3Y2hhcl90KSAqIChzdHJsZW4ocykgKyAxKSk7CisgICAgaWYgKCFyKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTEFUSU4pCisgICAgeyB3aGlsZSAoKnMpCisgICAgICAgICpyKysgPSAod2NoYXJfdCkqcysrOworICAgIH0KKyAgICBlbHNlCisgICAgeyAvKiBDb252ZXJ0IFVURjggdG8gd2NoYXIgKi8KKyAgICAgIHdoaWxlICgqcykKKyAgICAgIHsgcmVnaXN0ZXIgc29hcF93Y2hhciBjLCBjMSwgYzIsIGMzLCBjNDsKKyAgICAgICAgYyA9ICpzKys7CisgICAgICAgIGlmIChjIDwgMHg4MCkKKwkgICpyKysgPSAod2NoYXJfdCljOworCWVsc2UKKyAgICAgICAgeyBjMSA9IChzb2FwX3djaGFyKSpzKysgJiAweDNGOworICAgICAgICAgIGlmIChjIDwgMHhFMCkKKyAgICAgICAgICAgICpyKysgPSAod2NoYXJfdCkoKChzb2FwX3djaGFyKShjICYgMHgxRikgPDwgNikgfCBjMSk7CisgICAgICAgICAgZWxzZQorCSAgeyBjMiA9IChzb2FwX3djaGFyKSpzKysgJiAweDNGOworICAgICAgICAgICAgaWYgKGMgPCAweEYwKQorICAgICAgICAgICAgICAqcisrID0gKHdjaGFyX3QpKCgoc29hcF93Y2hhcikoYyAmIDB4MEYpIDw8IDEyKSB8IChjMSA8PCA2KSB8IGMyKTsKKyAgICAgICAgICAgIGVsc2UKKwkgICAgeyBjMyA9IChzb2FwX3djaGFyKSpzKysgJiAweDNGOworICAgICAgICAgICAgICBpZiAoYyA8IDB4RjgpCisgICAgICAgICAgICAgICAgKnIrKyA9ICh3Y2hhcl90KSgoKHNvYXBfd2NoYXIpKGMgJiAweDA3KSA8PCAxOCkgfCAoYzEgPDwgMTIpIHwgKGMyIDw8IDYpIHwgYzMpOworICAgICAgICAgICAgICBlbHNlCisJICAgICAgeyBjNCA9IChzb2FwX3djaGFyKSpzKysgJiAweDNGOworICAgICAgICAgICAgICAgIGlmIChjIDwgMHhGQykKKyAgICAgICAgICAgICAgICAgICpyKysgPSAod2NoYXJfdCkoKChzb2FwX3djaGFyKShjICYgMHgwMykgPDwgMjQpIHwgKGMxIDw8IDE4KSB8IChjMiA8PCAxMikgfCAoYzMgPDwgNikgfCBjNCk7CisgICAgICAgICAgICAgICAgZWxzZQorCQkgICpyKysgPSAod2NoYXJfdCkoKChzb2FwX3djaGFyKShjICYgMHgwMSkgPDwgMzApIHwgKGMxIDw8IDI0KSB8IChjMiA8PCAxOCkgfCAoYzMgPDwgMTIpIHwgKGM0IDw8IDYpIHwgKHNvYXBfd2NoYXIpKCpzKysgJiAweDNGKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgKnIgPSBMJ1wwJzsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3djaGFyMnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHdjaGFyX3QgKnMpCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgcmVnaXN0ZXIgY2hhciAqciwgKnQ7CisgIGNvbnN0IHdjaGFyX3QgKnEgPSBzOworICBzaXplX3QgbiA9IDA7CisgIHdoaWxlICgoYyA9ICpxKyspKQorICB7IGlmIChjID4gMCAmJiBjIDwgMHg4MCkKKyAgICAgIG4rKzsKKyAgICBlbHNlCisgICAgICBuICs9IDY7CisgIH0KKyAgciA9IHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgbiArIDEpOworICBpZiAocikKKyAgeyAvKiBDb252ZXJ0IHdjaGFyIHRvIFVURjggKi8KKyAgICB3aGlsZSAoKGMgPSAqcysrKSkKKyAgICB7IGlmIChjID4gMCAmJiBjIDwgMHg4MCkKKyAgICAgICAgKnQrKyA9IChjaGFyKWM7CisgICAgICBlbHNlCisgICAgICB7IGlmIChjIDwgMHgwODAwKQorICAgICAgICAgICp0KysgPSAoY2hhcikoMHhDMCB8ICgoYyA+PiA2KSAmIDB4MUYpKTsKKyAgICAgICAgZWxzZQorICAgICAgICB7IGlmIChjIDwgMHgwMTAwMDApCisgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RTAgfCAoKGMgPj4gMTIpICYgMHgwRikpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7IGlmIChjIDwgMHgyMDAwMDApCisgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhGMCB8ICgoYyA+PiAxOCkgJiAweDA3KSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7IGlmIChjIDwgMHgwNDAwMDAwMCkKKyAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjggfCAoKGMgPj4gMjQpICYgMHgwMykpOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsgKnQrKyA9IChjaGFyKSgweEZDIHwgKChjID4+IDMwKSAmIDB4MDEpKTsKKyAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMjQpICYgMHgzRikpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAxOCkgJiAweDNGKSk7CisgICAgICAgICAgICB9ICAgICAKKyAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAxMikgJiAweDNGKSk7CisgICAgICAgICAgfQorICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpKTsKKyAgICAgICAgfQorICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoYyAmIDB4M0YpKTsKKyAgICAgIH0KKyAgICB9CisgICAgKnQgPSAnXDAnOworICB9CisgIHJldHVybiByOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHN0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNoYXIgKmNvbnN0KnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKSAKK3sgaWQgPSBzb2FwX2VsZW1lbnRfaWQoc29hcCwgdGFnLCBpZCwgKnAsIE5VTEwsIDAsIHR5cGUsIG4pOworICBpZiAoaWQgPCAwCisgICB8fCBzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgaWQsIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgKnAsIDApCisgICB8fCBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoqCitTT0FQX0ZNQUMyCitzb2FwX2luc3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGNoYXIgKipwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCwgaW50IGZsYWcsIGxvbmcgbWlubGVuLCBsb25nIG1heGxlbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDEpKQorICB7IGlmICghdGFnIHx8ICp0YWcgIT0gJy0nIHx8IHNvYXAtPmVycm9yICE9IFNPQVBfTk9fVEFHKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICB9CisgIGlmICghcCkKKyAgICBpZiAoIShwID0gKGNoYXIqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2YoY2hhciopKSkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgaWYgKHNvYXAtPmJvZHkpCisgIHsgKnAgPSBzb2FwX3N0cmluZ19pbihzb2FwLCBmbGFnLCBtaW5sZW4sIG1heGxlbik7CisgICAgaWYgKCEqcCB8fCAhKGNoYXIqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsICpwLCB0LCBzaXplb2YoY2hhciopLCAwLCBOVUxMLCBOVUxMLCBOVUxMKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGVsc2UgaWYgKHNvYXAtPm51bGwpCisgICAgKnAgPSBOVUxMOworICBlbHNlCisgICAgKnAgPSAoY2hhciopU09BUF9TVFJfRU9TOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChjaGFyKiopc29hcF9pZF9sb29rdXAoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilwLCB0LCBzaXplb2YoY2hhcioqKSwgMCk7CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0d3N0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIHdjaGFyX3QgKmNvbnN0KnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKSAKK3sgaWQgPSBzb2FwX2VsZW1lbnRfaWQoc29hcCwgdGFnLCBpZCwgKnAsIE5VTEwsIDAsIHR5cGUsIG4pOworICBpZiAoaWQgPCAwCisgICB8fCBzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgaWQsIHR5cGUpCisgICB8fCBzb2FwX3dzdHJpbmdfb3V0KHNvYXAsICpwLCAwKQorICAgfHwgc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit3Y2hhcl90ICoqCitTT0FQX0ZNQUMyCitzb2FwX2lud3N0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB3Y2hhcl90ICoqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQsIGxvbmcgbWlubGVuLCBsb25nIG1heGxlbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDEpKQorICB7IGlmICghdGFnIHx8ICp0YWcgIT0gJy0nIHx8IHNvYXAtPmVycm9yICE9IFNPQVBfTk9fVEFHKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICB9CisgIGlmICghcCkKKyAgICBpZiAoIShwID0gKHdjaGFyX3QqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yod2NoYXJfdCopKSkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgaWYgKHNvYXAtPmJvZHkpCisgIHsgKnAgPSBzb2FwX3dzdHJpbmdfaW4oc29hcCwgMSwgbWlubGVuLCBtYXhsZW4pOworICAgIGlmICghKnAgfHwgISh3Y2hhcl90Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCAqcCwgdCwgc2l6ZW9mKHdjaGFyX3QqKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBlbHNlIGlmIChzb2FwLT5udWxsKQorICAgICpwID0gTlVMTDsKKyAgZWxzZQorICAgICpwID0gKHdjaGFyX3QqKVNPQVBfU1RSX0VPUzsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAod2NoYXJfdCoqKXNvYXBfaWRfbG9va3VwKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopcCwgdCwgc2l6ZW9mKHdjaGFyX3QqKiksIDApOworICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgdGltZV90Citzb2FwX3RpbWVnbShzdHJ1Y3QgdG0gKlQpCit7CisjaWYgZGVmaW5lZChIQVZFX1RJTUVHTSkKKyAgcmV0dXJuIHRpbWVnbShUKTsKKyNlbHNlCisgIHRpbWVfdCB0LCBnLCB6OworI2lmZGVmIEhBVkVfR01USU1FX1IKKyAgc3RydWN0IHRtIHRtLCAqdG1wID0gJnRtOworI2Vsc2UKKyAgc3RydWN0IHRtICp0bXA7CisjZW5kaWYKKyAgdCA9IG1rdGltZShUKTsKKyAgaWYgKHQgPT0gLTEpCisgICAgcmV0dXJuIC0xOworI2lmZGVmIEhBVkVfR01USU1FX1IKKyAgZ210aW1lX3IoJnQsIHRtcCk7CisjZWxzZQorICB0bXAgPSBnbXRpbWUoJnQpOworI2VuZGlmCisgIHRtcC0+dG1faXNkc3QgPSAwOworICBnID0gbWt0aW1lKHRtcCk7CisgIGlmIChnID09IC0xKQorICAgIHJldHVybiAtMTsKKyAgeiA9IGcgLSB0OworICByZXR1cm4gdCAtIHo7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2RhdGVUaW1lMnMoc3RydWN0IHNvYXAgKnNvYXAsIHRpbWVfdCBuKQoreyBzdHJ1Y3QgdG0gVCwgKnBUID0gJlQ7CisjaWYgZGVmaW5lZChIQVZFX0dNVElNRV9SKQorICBpZiAoZ210aW1lX3IoJm4sIHBUKSkKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVNaIiwgcFQpOworICAvKiBUaGUgZm9sbG93aW5nIGRlZmluZXMgd2VyZSBhZGRlZCBmb3IgVnhXb3JrcyovCisjZWxpZiBkZWZpbmVkKEhBVkVfUEdNVElNRV9SKQorICBpZiAoZ210aW1lX3IoJm4sIHBUKSkKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVNaIiwgcFQpOworI2VsaWYgZGVmaW5lZChIQVZFX1BHTVRJTUUpCisgIGlmIChnbXRpbWUoJm4sIHBUKSkKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVNaIiwgcFQpOworI2VsaWYgZGVmaW5lZChIQVZFX0dNVElNRSkKKyAgaWYgKChwVCA9IGdtdGltZSgmbikpKQorICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolU1oiLCBwVCk7CisjZWxpZiBkZWZpbmVkKEhBVkVfR0VUVElNRU9GREFZKQorICBzdHJ1Y3QgdGltZXpvbmUgdHo7CisgIG1lbXNldCgodm9pZCopJnR6LCAwLCBzaXplb2YodHopKTsKKyMgaWYgZGVmaW5lZChIQVZFX0xPQ0FMVElNRV9SKQorICBpZiAobG9jYWx0aW1lX3IoJm4sIHBUKSkKKyAgeyBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICBnZXR0aW1lb2ZkYXkoJnR2LCAmdHopOworICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIHN0cmxlbihzb2FwLT50bXBidWYpLCAiJSswM2Q6JTAyZCIsIC10ei50el9taW51dGVzd2VzdC82MCsocFQtPnRtX2lzZHN0IT0wKSwgYWJzKHR6LnR6X21pbnV0ZXN3ZXN0KSU2MCk7CisgIH0KKyMgZWxzZQorICBpZiAoKHBUID0gbG9jYWx0aW1lKCZuKSkpCisgIHsgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgZ2V0dGltZW9mZGF5KCZ0diwgJnR6KTsKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwVCk7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYgKyBzdHJsZW4oc29hcC0+dG1wYnVmKSwgIiUrMDNkOiUwMmQiLCAtdHoudHpfbWludXRlc3dlc3QvNjArKHBULT50bV9pc2RzdCE9MCksIGFicyh0ei50el9taW51dGVzd2VzdCklNjApOworICB9CisjZW5kaWYKKyNlbGlmIGRlZmluZWQoSEFWRV9GVElNRSkKKyAgc3RydWN0IHRpbWViIHQ7CisgIG1lbXNldCgodm9pZCopJnQsIDAsIHNpemVvZih0KSk7CisjIGlmIGRlZmluZWQoSEFWRV9MT0NBTFRJTUVfUikKKyAgaWYgKGxvY2FsdGltZV9yKCZuLCBwVCkpCisgIHsgZnRpbWUoJnQpOworICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIHN0cmxlbihzb2FwLT50bXBidWYpLCAiJSswM2Q6JTAyZCIsIC10LnRpbWV6b25lLzYwKyhwVC0+dG1faXNkc3QhPTApLCBhYnModC50aW1lem9uZSklNjApOworICB9CisgIC8qIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyB3ZXJlIGFkZGVkIGZvciBWeFdvcmtzKi8KKyMgZWxpZiBkZWZpbmVkKEhBVkVfUExPQ0FMVElNRV9SKQorICBpZiAobG9jYWx0aW1lX3IoJm4sIHBUKSkKKyAgeyBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwVCk7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYrc3RybGVuKHNvYXAtPnRtcGJ1ZiksICIlKzAzZDolMDJkIiwgdC50aW1lem9uZS82MCwgYWJzKHQudGltZXpvbmUpJTYwKTsKKyAgfQorIyBlbHNlCisgIGlmICgocFQgPSBsb2NhbHRpbWUoJm4pKSkKKyAgeyBmdGltZSgmdCk7CisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmICsgc3RybGVuKHNvYXAtPnRtcGJ1ZiksICIlKzAzZDolMDJkIiwgLXQudGltZXpvbmUvNjArKHBULT50bV9pc2RzdCE9MCksIGFicyh0LnRpbWV6b25lKSU2MCk7CisgIH0KKyMgZW5kaWYKKyNlbGlmIGRlZmluZWQoSEFWRV9MT0NBTFRJTUVfUikKKyAgaWYgKGxvY2FsdGltZV9yKCZuLCBwVCkpCisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworICAvKiBUaGUgZm9sbG93aW5nIGRlZmluZXMgd2VyZSBhZGRlZCBmb3IgVnhXb3JrcyovCisjZWxpZiBkZWZpbmVkKEhBVkVfUExPQ0FMVElNRV9SKQorICBpZiAobG9jYWx0aW1lX3IoJm4sIHBUKSkKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwVCk7CisjZWxzZQorICBpZiAoKHBUID0gbG9jYWx0aW1lKCZuKSkpCisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworI2VuZGlmCisgIGVsc2UKKyAgICBzdHJjcHkoc29hcC0+dG1wYnVmLCAiMTk2OS0xMi0zMVQyMzo1OTo1OVoiKTsKKyAgcmV0dXJuIHNvYXAtPnRtcGJ1ZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRkYXRlVGltZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHRpbWVfdCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9kYXRlVGltZTJzKHNvYXAsICpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMmRhdGVUaW1lKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCB0aW1lX3QgKnApCit7IGlmIChzKQorICB7IHN0cnVjdCB0bSBUOworICAgIGNoYXIgem9uZVsxNl07CisgICAgY29uc3QgY2hhciAqdDsKKyAgICBtZW1zZXQoKHZvaWQqKSZULCAwLCBzaXplb2YoVCkpOworICAgIHpvbmVbc2l6ZW9mKHpvbmUpLTFdID0gJ1wwJzsKKyAgICBpZiAoc3RyY2hyKHMsICctJykpCisgICAgICB0ID0gIiVkLSVkLSVkVCVkOiVkOiVkJTE1cyI7CisgICAgZWxzZSBpZiAoc3RyY2hyKHMsICc6JykpCisgICAgICB0ID0gIiU0ZCUyZCUyZFQlZDolZDolZCUxNXMiOworICAgIGVsc2UgLyogcGFyc2Ugbm9uLVhTRC1zdGFuZGFyZCBhbHRlcm5hdGl2ZSBJU08gODYwMSBmb3JtYXQgKi8KKyAgICAgIHQgPSAiJTRkJTJkJTJkVCUyZCUyZCUyZCUxNXMiOworICAgIHNzY2FuZihzLCB0LCAmVC50bV95ZWFyLCAmVC50bV9tb24sICZULnRtX21kYXksICZULnRtX2hvdXIsICZULnRtX21pbiwgJlQudG1fc2VjLCB6b25lKTsKKyAgICBpZiAoVC50bV95ZWFyID09IDEpCisgICAgICBULnRtX3llYXIgPSA3MDsKKyAgICBlbHNlCisgICAgICBULnRtX3llYXIgLT0gMTkwMDsKKyAgICBULnRtX21vbi0tOworICAgIGlmICgqem9uZSkKKyAgICB7IGlmICgqem9uZSA9PSAnLicpCisgICAgICB7IGZvciAocyA9IHpvbmUgKyAxOyAqczsgcysrKQorICAgICAgICAgIGlmICgqcyA8ICcwJyB8fCAqcyA+ICc5JykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBzID0gem9uZTsKKyAgICAgIGlmICgqcyA9PSAnKycgfHwgKnMgPT0gJy0nKQorICAgICAgeyBpbnQgaCA9IDAsIG0gPSAwOworICAgICAgICBpZiAoc1szXSA9PSAnOicpCisJeyBzc2NhbmYocywgIiVkOiVkIiwgJmgsICZtKTsKKwkgIGlmIChoIDwgMCkKKwkgICAgbSA9IC1tOworCX0KKwllbHNlCisJeyBtID0gKGludClhdG9sKHMpOworCSAgaCA9IG0gLyAxMDA7CisJICBtID0gbSAlIDEwMDsKKwl9CisgICAgICAgIFQudG1faG91ciAtPSBoOworICAgICAgICBULnRtX21pbiAtPSBtOworICAgICAgfQorICAgICAgVC50bV9pc2RzdCA9IDA7CisgICAgICAqcCA9IHNvYXBfdGltZWdtKCZUKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgVC50bV9pc2RzdCA9IC0xOworICAgICAgKnAgPSBta3RpbWUoJlQpOyAvKiBubyB0aW1lIHpvbmU6IHN1cHBvc2UgaXQgaXMgbG9jYWx0aW1lPyAqLworICAgIH0KKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCit0aW1lX3QgKgorU09BUF9GTUFDMgorc29hcF9pbmRhdGVUaW1lKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHRpbWVfdCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpkYXRlVGltZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisgIHAgPSAodGltZV90Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YodGltZV90KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKHRpbWVfdCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZih0aW1lX3QpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMmRhdGVUaW1lKHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRsaXRlcmFsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGNoYXIgKmNvbnN0KnApCit7IGludCBpOworICBjb25zdCBjaGFyICp0ID0gTlVMTDsKKyAgaWYgKHRhZyAmJiAqdGFnICE9ICctJykKKyAgeyBpZiAoc29hcC0+bG9jYWxfbmFtZXNwYWNlcyAmJiAodCA9IHN0cmNocih0YWcsICc6JykpKQorICAgIHsgc3RybmNweShzb2FwLT50bXBidWYsIHRhZywgdC10YWcpOworICAgICAgc29hcC0+dG1wYnVmW3QtdGFnXSA9ICdcMCc7CisgICAgICBmb3IgKGkgPSAwOyBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW2ldLmlkOyBpKyspCisgICAgICAgIGlmICghc3RyY21wKHNvYXAtPnRtcGJ1Ziwgc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tpXS5pZCkpCisgICAgICAgICAgYnJlYWs7CisgICAgICB0Kys7CisgICAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIjwlcyB4bWxucz1cIiVzXCI+IiwgdCwgc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tpXS5ucyA/IHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0ubnMgOiBTT0FQX1NUUl9FT1MpOworICAgIH0KKyAgICBlbHNlCisgICAgeyB0ID0gdGFnOworICAgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICI8JXM+IiwgdGFnKTsKKyAgICB9CisgICAgaWYgKHNvYXBfc2VuZChzb2FwLCBzb2FwLT50bXBidWYpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmIChwICYmICpwKQorICB7IGlmIChzb2FwX3NlbmQoc29hcCwgKnApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmICh0KQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiPC8lcz4iLCB0KTsKKyAgICByZXR1cm4gc29hcF9zZW5kKHNvYXAsIHNvYXAtPnRtcGJ1Zik7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoqCitTT0FQX0ZNQUMyCitzb2FwX2lubGl0ZXJhbChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBjaGFyICoqcCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDEpKQorICB7IGlmIChzb2FwLT5lcnJvciAhPSBTT0FQX05PX1RBRyB8fCBzb2FwX3VuZ2V0KHNvYXAsIHNvYXBfZ2V0KHNvYXApKSA9PSBTT0FQX1RUKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICB9CisgIGlmICghcCkKKyAgICBpZiAoIShwID0gKGNoYXIqKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2YoY2hhciopKSkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgaWYgKHNvYXAtPmJvZHkpCisgICAgKnAgPSBzb2FwX3N0cmluZ19pbihzb2FwLCAwLCAtMSwgLTEpOworICBlbHNlIGlmIChzb2FwLT5udWxsKQorICAgICpwID0gTlVMTDsKKyAgZWxzZQorICAgICpwID0gKGNoYXIqKVNPQVBfU1RSX0VPUzsKKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXR3bGl0ZXJhbChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB3Y2hhcl90ICpjb25zdCpwKQoreyBpbnQgaTsKKyAgY29uc3QgY2hhciAqdCA9IE5VTEw7CisgIHdjaGFyX3QgYzsKKyAgY29uc3Qgd2NoYXJfdCAqczsKKyAgaWYgKHRhZyAmJiAqdGFnICE9ICctJykKKyAgeyBpZiAoc29hcC0+bG9jYWxfbmFtZXNwYWNlcyAmJiAodCA9IHN0cmNocih0YWcsICc6JykpKQorICAgIHsgc3RybmNweShzb2FwLT50bXBidWYsIHRhZywgdC10YWcpOworICAgICAgc29hcC0+dG1wYnVmW3QtdGFnXSA9ICdcMCc7CisgICAgICBmb3IgKGkgPSAwOyBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW2ldLmlkOyBpKyspCisgICAgICAgIGlmICghc3RyY21wKHNvYXAtPnRtcGJ1Ziwgc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tpXS5pZCkpCisgICAgICAgICAgYnJlYWs7CisgICAgICB0Kys7CisgICAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIjwlcyB4bWxucz1cIiVzXCI+IiwgdCwgc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tpXS5ucyA/IHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0ubnMgOiBTT0FQX1NUUl9FT1MpOworICAgIH0KKyAgICBlbHNlCisgICAgeyB0ID0gdGFnOworICAgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICI8JXM+IiwgdGFnKTsKKyAgICB9CisgICAgaWYgKHNvYXBfc2VuZChzb2FwLCBzb2FwLT50bXBidWYpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmIChwKQorICB7IHMgPSAqcDsKKyAgICB3aGlsZSAoKGMgPSAqcysrKSkKKyAgICAgIGlmIChzb2FwX3B1dHV0Zjgoc29hcCwgKHVuc2lnbmVkIGNoYXIpYykpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAodCkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIjwvJXM+IiwgdCk7CisgICAgcmV0dXJuIHNvYXBfc2VuZChzb2FwLCBzb2FwLT50bXBidWYpOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit3Y2hhcl90ICoqCitTT0FQX0ZNQUMyCitzb2FwX2lud2xpdGVyYWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgd2NoYXJfdCAqKnApCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAxKSkKKyAgeyBpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9OT19UQUcgfHwgc29hcF91bmdldChzb2FwLCBzb2FwX2dldChzb2FwKSkgPT0gU09BUF9UVCkKKyAgICAgIHJldHVybiBOVUxMOworICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgfQorICBpZiAoIXApCisgICAgaWYgKCEocCA9ICh3Y2hhcl90Kiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHdjaGFyX3QqKSkpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIGlmIChzb2FwLT5ib2R5KQorICAgICpwID0gc29hcF93c3RyaW5nX2luKHNvYXAsIDAsIC0xLCAtMSk7CisgIGVsc2UgaWYgKHNvYXAtPm51bGwpCisgICAgKnAgPSBOVUxMOworICBlbHNlCisgICAgKnAgPSAod2NoYXJfdCopU09BUF9TVFJfRU9TOworICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfdG9rZW4oc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNpemVfdCBpOworICByZWdpc3RlciBzb2FwX3djaGFyIGMgPSAwOworICByZWdpc3RlciBjaGFyICpzID0gc29hcC0+dG1wYnVmOworICBpZiAoIXNvYXAtPmJvZHkpCisgICAgcmV0dXJuIFNPQVBfU1RSX0VPUzsKKyAgZG8gYyA9IHNvYXBfZ2V0KHNvYXApOworICB3aGlsZSAoc29hcF9ibGFuayhjKSk7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc29hcC0+dG1wYnVmKSAtIDE7IGkrKykKKyAgeyBpZiAoYyA9PSBTT0FQX1RUIHx8IChpbnQpYyA9PSBFT0YgfHwgc29hcF9ibGFuayhjKSkKKyAgICAgIGJyZWFrOworICAgICpzKysgPSAoY2hhciljOworICAgIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgfQorICBpZiAoKGludCljID09IEVPRiB8fCBjID09IFNPQVBfVFQpCisgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgKnMgPSAnXDAnOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVsZW1lbnQgY29udGVudCB2YWx1ZT0nJXMnXG4iLCBzb2FwLT50bXBidWYpKTsKKyAgcmV0dXJuIHNvYXAtPnRtcGJ1ZjsgLyogcmV0dXJuIG5vbi1udWxsIHBvaW50ZXIgKi8KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIgKgorU09BUF9GTUFDMgorc29hcF92YWx1ZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc2l6ZV90IGk7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IDA7CisgIHJlZ2lzdGVyIGNoYXIgKnMgPSBzb2FwLT50bXBidWY7CisgIGlmICghc29hcC0+Ym9keSkKKyAgICByZXR1cm4gU09BUF9TVFJfRU9TOworICBkbyBjID0gc29hcF9nZXQoc29hcCk7CisgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZihzb2FwLT50bXBidWYpIC0gMTsgaSsrKQorICB7IGlmIChjID09IFNPQVBfVFQgfHwgKGludCljID09IEVPRikKKyAgICAgIGJyZWFrOworICAgICpzKysgPSAoY2hhciljOworICAgIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgfQorICBmb3IgKHMtLTsgaSA+IDA7IGktLSwgcy0tKQorICAgIGlmICghc29hcF9ibGFuaygqcykpCisgICAgICBicmVhazsKKyAgc1sxXSA9ICdcMCc7CisgIGlmICgoaW50KWMgPT0gRU9GIHx8IGMgPT0gU09BUF9UVCkKKyAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVsZW1lbnQgY29udGVudCB2YWx1ZT0nJXMnXG4iLCBzb2FwLT50bXBidWYpKTsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgICBzb2FwLT5kb20tPmRhdGEgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT50bXBidWYpOworI2VuZGlmCisgIHJldHVybiBzb2FwLT50bXBidWY7IC8qIHJldHVybiBub24tbnVsbCBwb2ludGVyICovCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAhZGVmaW5lZChXSVRIX0xFQU5FUikgfHwgIWRlZmluZWQoV0lUSF9OT0hUVFApCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldGxpbmUoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnMsIGludCBsZW4pCit7IGludCBpID0gbGVuOworICBzb2FwX3djaGFyIGMgPSAwOworICBmb3IgKDs7KQorICB7IHdoaWxlICgtLWkgPiAwKQorICAgIHsgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgICAgIGlmIChjID09ICdccicgfHwgYyA9PSAnXG4nKQorICAgICAgICBicmVhazsKKyAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAgICpzKysgPSAoY2hhciljOworICAgIH0KKyAgICBpZiAoYyAhPSAnXG4nKQorICAgICAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsgLyogZ290IFxyLCBub3cgZ2V0IFxuICovCisgICAgaWYgKGMgPT0gJ1xuJykKKyAgICB7ICpzID0gJ1wwJzsKKyAgICAgIGlmIChpKzEgPT0gbGVuKSAvKiBlbXB0eSBsaW5lOiBlbmQgb2YgSFRUUC9NSU1FIGhlYWRlciAqLworICAgICAgICBicmVhazsKKyAgICAgIGMgPSBzb2FwX3VuZ2V0KHNvYXAsIHNvYXBfZ2V0Y2hhcihzb2FwKSk7CisgICAgICBpZiAoYyAhPSAnICcgJiYgYyAhPSAnXHQnKSAvKiBIVFRQIGxpbmUgY29udGludWF0aW9uPyAqLworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZWxzZSBpZiAoKGludCljID09IEVPRikKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc2l6ZV90Citzb2FwX2NvdW50X2F0dGFjaG1lbnRzKHN0cnVjdCBzb2FwICpzb2FwKQoreyAKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICByZWdpc3RlciBzaXplX3QgY291bnQgPSBzb2FwLT5jb3VudDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDYWxjdWxhdGluZyB0aGUgbWVzc2FnZSBzaXplIHdpdGggYXR0YWNobWVudHMsIGN1cnJlbnQgY291bnQ9JWx1XG4iLCAodW5zaWduZWQgbG9uZyljb3VudCkpOworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKSkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNhbGN1bGF0aW5nIHRoZSBzaXplIG9mIERJTUUgYXR0YWNobWVudHNcbiIpKTsKKyAgICBmb3IgKGNvbnRlbnQgPSBzb2FwLT5kaW1lLmZpcnN0OyBjb250ZW50OyBjb250ZW50ID0gY29udGVudC0+bmV4dCkKKyAgICB7IGNvdW50ICs9IDEyICsgKChjb250ZW50LT5zaXplKzMpJih+MykpOworICAgICAgaWYgKGNvbnRlbnQtPmlkKQorICAgICAgICBjb3VudCArPSAoKHN0cmxlbihjb250ZW50LT5pZCkrMykmKH4zKSk7CisgICAgICBpZiAoY29udGVudC0+dHlwZSkKKyAgICAgICAgY291bnQgKz0gKChzdHJsZW4oY29udGVudC0+dHlwZSkrMykmKH4zKSk7CisgICAgICBpZiAoY29udGVudC0+b3B0aW9ucykKKyAgICAgICAgY291bnQgKz0gKCgoKHVuc2lnbmVkIGNoYXIpY29udGVudC0+b3B0aW9uc1syXSA8PCA4KSB8ICgodW5zaWduZWQgY2hhciljb250ZW50LT5vcHRpb25zWzNdKSkrNykmKH4zKTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2l6ZSBvZiBESU1FIGF0dGFjaG1lbnQgY29udGVudCBpcyAlbHUgYnl0ZXNcbiIsICh1bnNpZ25lZCBsb25nKWNvbnRlbnQtPnNpemUpKTsKKyAgICB9CisgIH0KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkgJiYgc29hcC0+bWltZS5ib3VuZGFyeSkKKyAgeyByZWdpc3RlciBzaXplX3QgbiA9IHN0cmxlbihzb2FwLT5taW1lLmJvdW5kYXJ5KTsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNhbGN1bGF0aW5nIHRoZSBzaXplIG9mIE1JTUUgYXR0YWNobWVudHNcbiIpKTsKKyAgICBmb3IgKGNvbnRlbnQgPSBzb2FwLT5taW1lLmZpcnN0OyBjb250ZW50OyBjb250ZW50ID0gY29udGVudC0+bmV4dCkKKyAgICB7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnM7CisgICAgICAvKiBjb3VudCBcclxuLS1ib3VuZGFyeVxyXG4gKi8KKyAgICAgIGNvdW50ICs9IDYgKyBuOworICAgICAgLyogY291bnQgQ29udGVudC1UeXBlOiAuLi5cclxuICovCisgICAgICBpZiAoY29udGVudC0+dHlwZSkKKyAgICAgICAgY291bnQgKz0gMTYgKyBzdHJsZW4oY29udGVudC0+dHlwZSk7CisgICAgICAvKiBjb3VudCBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiAuLi5cclxuICovCisgICAgICBzID0gc29hcF9zdHJfY29kZShtaW1lX2NvZGVzLCBjb250ZW50LT5lbmNvZGluZyk7CisgICAgICBpZiAocykKKyAgICAgICAgY291bnQgKz0gMjkgKyBzdHJsZW4ocyk7CisgICAgICAvKiBjb3VudCBDb250ZW50LUlEOiAuLi5cclxuICovCisgICAgICBpZiAoY29udGVudC0+aWQpCisgICAgICAgIGNvdW50ICs9IDE0ICsgc3RybGVuKGNvbnRlbnQtPmlkKTsKKyAgICAgIC8qIGNvdW50IENvbnRlbnQtTG9jYXRpb246IC4uLlxyXG4gKi8KKyAgICAgIGlmIChjb250ZW50LT5sb2NhdGlvbikKKyAgICAgICAgY291bnQgKz0gMjAgKyBzdHJsZW4oY29udGVudC0+bG9jYXRpb24pOworICAgICAgLyogY291bnQgQ29udGVudC1EZXNjcmlwdGlvbjogLi4uXHJcbiAqLworICAgICAgaWYgKGNvbnRlbnQtPmRlc2NyaXB0aW9uKQorICAgICAgICBjb3VudCArPSAyMyArIHN0cmxlbihjb250ZW50LT5sb2NhdGlvbik7CisgICAgICAvKiBjb3VudCBcclxuLi4uY29udGVudCAqLworICAgICAgY291bnQgKz0gMiArIGNvbnRlbnQtPnNpemU7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNpemUgb2YgTUlNRSBhdHRhY2htZW50IGNvbnRlbnQgaXMgJWx1IGJ5dGVzXG4iLCAodW5zaWduZWQgbG9uZyljb250ZW50LT5zaXplKSk7CisgICAgfQorICAgIC8qIGNvdW50IFxyXG4tLWJvdW5kYXJ5LS0gKi8KKyAgICBjb3VudCArPSA2ICsgbjsKKyAgfQorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk5ldyBjb3VudCBpcyAlbHUgYnl0ZXNcbiIsICh1bnNpZ25lZCBsb25nKWNvdW50KSk7CisgIHJldHVybiBjb3VudDsKKyNlbHNlCisgIHJldHVybiBzb2FwLT5jb3VudDsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc29hcF9wdXRkaW1lZmllbGQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBuKQoreyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCBuKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsIFNPQVBfU1RSX1BBRERJTkcsIC0obG9uZyluJjMpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfZGltZV9vcHRpb24oc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIHNob3J0IG9wdHlwZSwgY29uc3QgY2hhciAqb3B0aW9uKQoreyBzaXplX3QgbjsKKyAgY2hhciAqcyA9IE5VTEw7CisgIGlmIChvcHRpb24pCisgIHsgbiA9IHN0cmxlbihvcHRpb24pOworICAgIHMgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgbiArIDUpOworICAgIGlmIChzKQorICAgIHsgc1swXSA9IG9wdHlwZSA+PiA4OworICAgICAgc1sxXSA9IG9wdHlwZSAmIDB4RkY7CisgICAgICBzWzJdID0gbiA+PiA4OworICAgICAgc1szXSA9IG4gJiAweEZGOworICAgICAgc3RyY3B5KHMgKyA0LCBvcHRpb24pOworICAgIH0KKyAgfQorICByZXR1cm4gczsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dGRpbWVoZHIoc3RydWN0IHNvYXAgKnNvYXApCit7IHVuc2lnbmVkIGNoYXIgdG1wWzEyXTsKKyAgc2l6ZV90IG9wdGxlbiA9IDAsIGlkbGVuID0gMCwgdHlwZWxlbiA9IDA7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUHV0IERJTUUgaGVhZGVyIGlkPSclcydcbiIsIHNvYXAtPmRpbWUuaWQ/c29hcC0+ZGltZS5pZDoiIikpOworICBpZiAoc29hcC0+ZGltZS5vcHRpb25zKQorICAgIG9wdGxlbiA9ICgoKHVuc2lnbmVkIGNoYXIpc29hcC0+ZGltZS5vcHRpb25zWzJdIDw8IDgpIHwgKCh1bnNpZ25lZCBjaGFyKXNvYXAtPmRpbWUub3B0aW9uc1szXSkpICsgNDsKKyAgaWYgKHNvYXAtPmRpbWUuaWQpCisgICAgaWRsZW4gPSBzdHJsZW4oc29hcC0+ZGltZS5pZCk7CisgIGlmIChzb2FwLT5kaW1lLnR5cGUpCisgICAgdHlwZWxlbiA9IHN0cmxlbihzb2FwLT5kaW1lLnR5cGUpOworICB0bXBbMF0gPSBTT0FQX0RJTUVfVkVSU0lPTiB8IChzb2FwLT5kaW1lLmZsYWdzICYgMHg3KTsKKyAgdG1wWzFdID0gc29hcC0+ZGltZS5mbGFncyAmIDB4RjA7CisgIHRtcFsyXSA9IG9wdGxlbiA+PiA4OworICB0bXBbM10gPSBvcHRsZW4gJiAweEZGOworICB0bXBbNF0gPSBpZGxlbiA+PiA4OworICB0bXBbNV0gPSBpZGxlbiAmIDB4RkY7CisgIHRtcFs2XSA9IHR5cGVsZW4gPj4gODsKKyAgdG1wWzddID0gdHlwZWxlbiAmIDB4RkY7CisgIHRtcFs4XSA9IHNvYXAtPmRpbWUuc2l6ZSA+PiAyNDsKKyAgdG1wWzldID0gKHNvYXAtPmRpbWUuc2l6ZSA+PiAxNikgJiAweEZGOworICB0bXBbMTBdID0gKHNvYXAtPmRpbWUuc2l6ZSA+PiA4KSAmIDB4RkY7CisgIHRtcFsxMV0gPSBzb2FwLT5kaW1lLnNpemUgJiAweEZGOworICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAoY2hhciopdG1wLCAxMikKKyAgIHx8IHNvYXBfcHV0ZGltZWZpZWxkKHNvYXAsIHNvYXAtPmRpbWUub3B0aW9ucywgb3B0bGVuKQorICAgfHwgc29hcF9wdXRkaW1lZmllbGQoc29hcCwgc29hcC0+ZGltZS5pZCwgaWRsZW4pCisgICB8fCBzb2FwX3B1dGRpbWVmaWVsZChzb2FwLCBzb2FwLT5kaW1lLnR5cGUsIHR5cGVsZW4pKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRkaW1lKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgIGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSkKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgZm9yIChjb250ZW50ID0gc29hcC0+ZGltZS5maXJzdDsgY29udGVudDsgY29udGVudCA9IGNvbnRlbnQtPm5leHQpCisgIHsgdm9pZCAqaGFuZGxlOworICAgIHNvYXAtPmRpbWUuc2l6ZSA9IGNvbnRlbnQtPnNpemU7CisgICAgc29hcC0+ZGltZS5pZCA9IGNvbnRlbnQtPmlkOworICAgIHNvYXAtPmRpbWUudHlwZSA9IGNvbnRlbnQtPnR5cGU7CisgICAgc29hcC0+ZGltZS5vcHRpb25zID0gY29udGVudC0+b3B0aW9uczsKKyAgICBzb2FwLT5kaW1lLmZsYWdzID0gU09BUF9ESU1FX1ZFUlNJT04gfCBTT0FQX0RJTUVfTUVESUE7CisgICAgaWYgKHNvYXAtPmZkaW1lcmVhZG9wZW4gJiYgKChoYW5kbGUgPSBzb2FwLT5mZGltZXJlYWRvcGVuKHNvYXAsICh2b2lkKiljb250ZW50LT5wdHIsIGNvbnRlbnQtPmlkLCBjb250ZW50LT50eXBlLCBjb250ZW50LT5vcHRpb25zKSkgfHwgc29hcC0+ZXJyb3IpKQorICAgIHsgc2l6ZV90IHNpemUgPSBjb250ZW50LT5zaXplOworICAgICAgaWYgKCFoYW5kbGUpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZmRpbWVyZWFkb3BlbiBmYWlsZWRcbiIpKTsKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgICAgaWYgKCFjb250ZW50LT5zaXplICYmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1hNTCkgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LIHx8IChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19TVE9SRSkpCisgICAgICB7IHNpemVfdCBjaHVua3NpemUgPSBzaXplb2Yoc29hcC0+dG1wYnVmKTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDaHVua2VkIHN0cmVhbWluZyBESU1FXG4iKSk7CisgICAgICAgIGRvIAorICAgICAgICB7IHNpemUgPSBzb2FwLT5mZGltZXJlYWQoc29hcCwgaGFuZGxlLCBzb2FwLT50bXBidWYsIGNodW5rc2l6ZSk7CisgICAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJmZGltZXJlYWQgcmV0dXJuZWQgJWx1IGJ5dGVzXG4iLCAodW5zaWduZWQgbG9uZylzaXplKSk7CisgICAgICAgICAgaWYgKHNpemUgPCBjaHVua3NpemUpCisgCSAgeyBzb2FwLT5kaW1lLmZsYWdzICY9IH5TT0FQX0RJTUVfQ0Y7CisgICAgICAgICAgICBpZiAoIWNvbnRlbnQtPm5leHQpCisgICAgICAgICAgICAgIHNvYXAtPmRpbWUuZmxhZ3MgfD0gU09BUF9ESU1FX01FOworCSAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNvYXAtPmRpbWUuZmxhZ3MgfD0gU09BUF9ESU1FX0NGOworCSAgc29hcC0+ZGltZS5zaXplID0gc2l6ZTsKKyAgICAgICAgICBpZiAoc29hcF9wdXRkaW1laGRyKHNvYXApCisJICAgfHwgc29hcF9wdXRkaW1lZmllbGQoc29hcCwgc29hcC0+dG1wYnVmLCBzaXplKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGlmIChzb2FwLT5kaW1lLmlkKQorIAkgIHsgc29hcC0+ZGltZS5mbGFncyAmPSB+KFNPQVBfRElNRV9NQiB8IFNPQVBfRElNRV9NRURJQSk7CisgICAgICAgICAgICBzb2FwLT5kaW1lLmlkID0gTlVMTDsKKyAgICAgICAgICAgIHNvYXAtPmRpbWUudHlwZSA9IE5VTEw7CisgICAgICAgICAgICBzb2FwLT5kaW1lLm9wdGlvbnMgPSBOVUxMOworICAgICAgICAgIH0gIAorICAgICAgICB9IHdoaWxlIChzaXplID49IGNodW5rc2l6ZSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IGlmICghY29udGVudC0+bmV4dCkKKyAgICAgICAgICBzb2FwLT5kaW1lLmZsYWdzIHw9IFNPQVBfRElNRV9NRTsKKyAgICAgICAgaWYgKHNvYXBfcHV0ZGltZWhkcihzb2FwKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIGRvCisgICAgICAgIHsgc2l6ZV90IGJ1ZnNpemU7CisJICBpZiAoc2l6ZSA8IHNpemVvZihzb2FwLT50bXBidWYpKQorICAgICAgICAgICAgYnVmc2l6ZSA9IHNpemU7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgYnVmc2l6ZSA9IHNpemVvZihzb2FwLT50bXBidWYpOworICAgICAgICAgIGlmICghKGJ1ZnNpemUgPSBzb2FwLT5mZGltZXJlYWQoc29hcCwgaGFuZGxlLCBzb2FwLT50bXBidWYsIGJ1ZnNpemUpKSkKKyAgICAgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZmRpbWVyZWFkIGZhaWxlZDogaW5zdWZmaWNpZW50IGRhdGEgKCVsdSBieXRlcyByZW1haW5pbmcgZnJvbSAlbHUgYnl0ZXMpXG4iLCAodW5zaWduZWQgbG9uZylzaXplLCAodW5zaWduZWQgbG9uZylzb2FwLT5kaW1lLnNpemUpKTsKKyAgICAgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisJICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzb2FwLT50bXBidWYsIGJ1ZnNpemUpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgc2l6ZSAtPSBidWZzaXplOworICAgICAgICB9IHdoaWxlIChzaXplKTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJmZGltZXJlYWRjbG9zZVxuIikpOworICAgICAgICBzb2FwX3NlbmRfcmF3KHNvYXAsIFNPQVBfU1RSX1BBRERJTkcsIC0obG9uZylzb2FwLT5kaW1lLnNpemUmMyk7CisgICAgICB9CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImZkaW1lcmVhZGNsb3NlXG4iKSk7CisgICAgICBpZiAoc29hcC0+ZmRpbWVyZWFkY2xvc2UpCisgICAgICAgIHNvYXAtPmZkaW1lcmVhZGNsb3NlKHNvYXAsIGhhbmRsZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IGlmICghY29udGVudC0+bmV4dCkKKyAgICAgICAgc29hcC0+ZGltZS5mbGFncyB8PSBTT0FQX0RJTUVfTUU7CisgICAgICBpZiAoc29hcF9wdXRkaW1laGRyKHNvYXApCisgICAgICAgfHwgc29hcF9wdXRkaW1lZmllbGQoc29hcCwgKGNoYXIqKWNvbnRlbnQtPnB0ciwgY29udGVudC0+c2l6ZSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBjaGFyICoKK3NvYXBfZ2V0ZGltZWZpZWxkKHN0cnVjdCBzb2FwICpzb2FwLCBzaXplX3QgbikKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgY2hhciAqczsKKyAgY2hhciAqcCA9IE5VTEw7CisgIGlmIChuKQorICB7IHAgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgbiArIDEpOworICAgIGlmIChwKQorICAgIHsgcyA9IHA7CisgICAgICBmb3IgKGkgPSBuOyBpID4gMDsgaS0tKQorICAgICAgeyBpZiAoKGludCkoYyA9IHNvYXBfZ2V0MShzb2FwKSkgPT0gRU9GKQorICAgICAgICB7IHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgKnMrKyA9IChjaGFyKWM7CisgICAgICB9CisgICAgICAqcyA9ICdcMCc7CisgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcF9tb3ZlKHNvYXAsIC0obG9uZyluJjMpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgIH0KKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRkaW1laGRyKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIHJlZ2lzdGVyIGNoYXIgKnM7CisgIHJlZ2lzdGVyIGludCBpOworICB1bnNpZ25lZCBjaGFyIHRtcFsxMl07CisgIHNpemVfdCBvcHRsZW4sIGlkbGVuLCB0eXBlbGVuOworICBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9ESU1FX0VORDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHZXQgRElNRSBoZWFkZXJcbiIpKTsKKyAgaWYgKHNvYXAtPmRpbWUuYnVmbGVuIHx8IHNvYXAtPmRpbWUuY2h1bmtzaXplKQorICB7IGlmIChzb2FwX21vdmUoc29hcCwgKGxvbmcpKHNvYXAtPmRpbWUuc2l6ZSAtIHNvYXBfdGVsbChzb2FwKSkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgc29hcF91bmdldChzb2FwLCBzb2FwX2dldGNoYXIoc29hcCkpOyAvKiBza2lwIHBhZGRpbmcgYW5kIGdldCBoZHIgKi8KKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIi4uLiBGcm9tIGNodW5rZWRcbiIpKTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICBzID0gKGNoYXIqKXRtcDsKKyAgZm9yIChpID0gMTI7IGkgPiAwOyBpLS0pCisgIHsgaWYgKChpbnQpKGMgPSBzb2FwX2dldGNoYXIoc29hcCkpID09IEVPRikKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgICpzKysgPSAoY2hhciljOworICB9CisgIGlmICgodG1wWzBdICYgMHhGOCkgIT0gU09BUF9ESU1FX1ZFUlNJT04pCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9ESU1FX01JU01BVENIOworICBzb2FwLT5kaW1lLmZsYWdzID0gKHRtcFswXSAmIDB4NykgfCAodG1wWzFdICYgMHhGMCk7CisgIG9wdGxlbiA9ICh0bXBbMl0gPDwgOCkgfCB0bXBbM107CisgIGlkbGVuID0gKHRtcFs0XSA8PCA4KSB8IHRtcFs1XTsKKyAgdHlwZWxlbiA9ICh0bXBbNl0gPDwgOCkgfCB0bXBbN107CisgIHNvYXAtPmRpbWUuc2l6ZSA9ICh0bXBbOF0gPDwgMjQpIHwgKHRtcFs5XSA8PCAxNikgfCAodG1wWzEwXSA8PCA4KSB8IHRtcFsxMV07CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRElNRSBzaXplPSVsdSBmbGFncz0weCVYXG4iLCAodW5zaWduZWQgbG9uZylzb2FwLT5kaW1lLnNpemUsIHNvYXAtPmRpbWUuZmxhZ3MpKTsKKyAgaWYgKCEoc29hcC0+ZGltZS5vcHRpb25zID0gc29hcF9nZXRkaW1lZmllbGQoc29hcCwgb3B0bGVuKSkgJiYgc29hcC0+ZXJyb3IpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoIShzb2FwLT5kaW1lLmlkID0gc29hcF9nZXRkaW1lZmllbGQoc29hcCwgaWRsZW4pKSAmJiBzb2FwLT5lcnJvcikKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmICghKHNvYXAtPmRpbWUudHlwZSA9IHNvYXBfZ2V0ZGltZWZpZWxkKHNvYXAsIHR5cGVsZW4pKSAmJiBzb2FwLT5lcnJvcikKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRElNRSBpZD0lcywgdHlwZT0lcywgb3B0aW9ucz0lc1xuIiwgc29hcC0+ZGltZS5pZD9zb2FwLT5kaW1lLmlkOiIiLCBzb2FwLT5kaW1lLnR5cGU/c29hcC0+ZGltZS50eXBlOiIiLCBzb2FwLT5kaW1lLm9wdGlvbnM/c29hcC0+ZGltZS5vcHRpb25zKzQ6IiIpKTsKKyAgaWYgKHNvYXAtPmRpbWUuZmxhZ3MgJiBTT0FQX0RJTUVfTUUpCisgICAgc29hcC0+bW9kZSAmPSB+U09BUF9FTkNfRElNRTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRkaW1lKHN0cnVjdCBzb2FwICpzb2FwKQoreyB3aGlsZSAoc29hcC0+ZGltZS5mbGFncyAmIFNPQVBfRElNRV9DRikKKyAgeyBpZiAoc29hcF9nZXRkaW1laGRyKHNvYXApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmIChzb2FwX21vdmUoc29hcCwgc29hcC0+ZGltZS5zaXplKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICB9CisgIGlmIChzb2FwX21vdmUoc29hcCwgKChzb2FwLT5kaW1lLnNpemUrMykmKH4zKSktc29hcF90ZWxsKHNvYXApKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgZm9yICg7OykKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgICAgaWYgKHNvYXBfZ2V0ZGltZWhkcihzb2FwKSkKKyAgICAgIGJyZWFrOworICAgIGlmIChzb2FwLT5mZGltZXdyaXRlb3BlbiAmJiAoKHNvYXAtPmRpbWUucHRyID0gKGNoYXIqKXNvYXAtPmZkaW1ld3JpdGVvcGVuKHNvYXAsIHNvYXAtPmRpbWUuaWQsIHNvYXAtPmRpbWUudHlwZSwgc29hcC0+ZGltZS5vcHRpb25zKSkgfHwgc29hcC0+ZXJyb3IpKQorICAgIHsgY29uc3QgY2hhciAqaWQsICp0eXBlLCAqb3B0aW9uczsKKyAgICAgIHNpemVfdCBzaXplLCBuOworICAgICAgaWYgKCFzb2FwLT5kaW1lLnB0cikKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgaWQgPSBzb2FwLT5kaW1lLmlkOworICAgICAgdHlwZSA9IHNvYXAtPmRpbWUudHlwZTsKKyAgICAgIG9wdGlvbnMgPSBzb2FwLT5kaW1lLm9wdGlvbnM7CisgICAgICBmb3IgKDs7KQorICAgICAgeyBzaXplID0gc29hcC0+ZGltZS5zaXplOworICAgICAgICBmb3IgKDs7KQorICAgICAgICB7IG4gPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgICAgICAgaWYgKHNpemUgPCBuKQorICAgICAgICAgICAgbiA9IHNpemU7CisgICAgICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZkaW1ld3JpdGUoc29hcCwgKHZvaWQqKXNvYXAtPmRpbWUucHRyLCBzb2FwLT5idWYgKyBzb2FwLT5idWZpZHgsIG4pKSkKKyAgICAgICAgICAgIGJyZWFrOworCSAgc2l6ZSAtPSBuOworCSAgaWYgKCFzaXplKQorCSAgeyBzb2FwLT5idWZpZHggKz0gbjsKKwkgICAgYnJlYWs7CisJICB9CisJICBpZiAoc29hcF9yZWN2KHNvYXApKQorICAgICAgICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKwkgICAgZ290byBlbmQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzb2FwX21vdmUoc29hcCwgLShsb25nKXNvYXAtPmRpbWUuc2l6ZSYzKSkKKyAgICAgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworCSAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEoc29hcC0+ZGltZS5mbGFncyAmIFNPQVBfRElNRV9DRikpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChzb2FwX2dldGRpbWVoZHIoc29hcCkpCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CitlbmQ6CisgICAgICBpZiAoc29hcC0+ZmRpbWV3cml0ZWNsb3NlKQorICAgICAgICBzb2FwLT5mZGltZXdyaXRlY2xvc2Uoc29hcCwgKHZvaWQqKXNvYXAtPmRpbWUucHRyKTsKKyAgICAgIHNvYXAtPmRpbWUuc2l6ZSA9IDA7CisgICAgICBzb2FwLT5kaW1lLmlkID0gaWQ7CisgICAgICBzb2FwLT5kaW1lLnR5cGUgPSB0eXBlOworICAgICAgc29hcC0+ZGltZS5vcHRpb25zID0gb3B0aW9uczsKKyAgICB9CisgICAgZWxzZSBpZiAoc29hcC0+ZGltZS5mbGFncyAmIFNPQVBfRElNRV9DRikKKyAgICB7IGNvbnN0IGNoYXIgKmlkLCAqdHlwZSwgKm9wdGlvbnM7CisgICAgICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgICAgICByZWdpc3RlciBjaGFyICpzOworICAgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgICBpZCA9IHNvYXAtPmRpbWUuaWQ7CisgICAgICB0eXBlID0gc29hcC0+ZGltZS50eXBlOworICAgICAgb3B0aW9ucyA9IHNvYXAtPmRpbWUub3B0aW9uczsKKyAgICAgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICAgICAgcmV0dXJuIFNPQVBfRU9NOworICAgICAgZm9yICg7OykKKyAgICAgIHsgcyA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgc29hcC0+ZGltZS5zaXplKTsKKyAgICAgICAgaWYgKCFzKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgICBmb3IgKGkgPSBzb2FwLT5kaW1lLnNpemU7IGkgPiAwOyBpLS0pCisgICAgICAgIHsgaWYgKChpbnQpKGMgPSBzb2FwX2dldDEoc29hcCkpID09IEVPRikKKyAgICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgICAgICAgICpzKysgPSAoY2hhciljOworICAgICAgICB9CisgICAgICAgIGlmIChzb2FwX21vdmUoc29hcCwgLShsb25nKXNvYXAtPmRpbWUuc2l6ZSYzKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAgICAgaWYgKCEoc29hcC0+ZGltZS5mbGFncyAmIFNPQVBfRElNRV9DRikpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChzb2FwX2dldGRpbWVoZHIoc29hcCkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgICAgc29hcC0+ZGltZS5zaXplID0gc29hcC0+Ymxpc3QtPnNpemUrKzsgLyogYWxsb2NhdGUgb25lIG1vcmUgZm9yICdcMCcgKi8KKyAgICAgIGlmICghKHNvYXAtPmRpbWUucHRyID0gc29hcF9zYXZlX2Jsb2NrKHNvYXAsIE5VTEwsIDApKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgc29hcC0+ZGltZS5wdHJbc29hcC0+ZGltZS5zaXplXSA9ICdcMCc7IC8qIGZvcmNlIDAtdGVybWluYXRlZCAqLworICAgICAgc29hcC0+ZGltZS5pZCA9IGlkOworICAgICAgc29hcC0+ZGltZS50eXBlID0gdHlwZTsKKyAgICAgIHNvYXAtPmRpbWUub3B0aW9ucyA9IG9wdGlvbnM7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHNvYXAtPmRpbWUucHRyID0gc29hcF9nZXRkaW1lZmllbGQoc29hcCwgc29hcC0+ZGltZS5zaXplKTsKKyAgICBjb250ZW50ID0gc29hcF9uZXdfbXVsdGlwYXJ0KHNvYXAsICZzb2FwLT5kaW1lLmZpcnN0LCAmc29hcC0+ZGltZS5sYXN0LCBzb2FwLT5kaW1lLnB0ciwgc29hcC0+ZGltZS5zaXplKTsKKyAgICBpZiAoIWNvbnRlbnQpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICBjb250ZW50LT5pZCA9IHNvYXAtPmRpbWUuaWQ7CisgICAgY29udGVudC0+dHlwZSA9IHNvYXAtPmRpbWUudHlwZTsKKyAgICBjb250ZW50LT5vcHRpb25zID0gc29hcC0+ZGltZS5vcHRpb25zOworICAgIHNvYXBfcmVzb2x2ZV9hdHRhY2htZW50KHNvYXAsIGNvbnRlbnQpOworICAgIGlmIChzb2FwLT5lcnJvcikKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9ESU1FX0VORCkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRtaW1laGRyKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgIGRvCisgIHsgaWYgKHNvYXBfZ2V0bGluZShzb2FwLCBzb2FwLT5tc2didWYsIHNpemVvZihzb2FwLT5tc2didWYpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICB3aGlsZSAoISpzb2FwLT5tc2didWYpOworICBpZiAoc29hcC0+bXNnYnVmWzBdID09ICctJyAmJiBzb2FwLT5tc2didWZbMV0gPT0gJy0nKQorICB7IGNoYXIgKnMgPSBzb2FwLT5tc2didWYgKyBzdHJsZW4oc29hcC0+bXNnYnVmKSAtIDE7CisgICAgLyogcmVtb3ZlIHdoaXRlIHNwYWNlICovCisgICAgd2hpbGUgKHNvYXBfYmxhbmsoKnMpKQorICAgICAgcy0tOworICAgIHNbMV0gPSAnXDAnOworICAgIGlmIChzb2FwLT5taW1lLmJvdW5kYXJ5KQorICAgIHsgaWYgKHN0cmNtcChzb2FwLT5tc2didWYgKyAyLCBzb2FwLT5taW1lLmJvdW5kYXJ5KSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9NSU1FX0VSUk9SOworICAgIH0KKyAgICBlbHNlCisgICAgICBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+bXNnYnVmICsgMik7CisgICAgaWYgKHNvYXBfZ2V0bGluZShzb2FwLCBzb2FwLT5tc2didWYsIHNpemVvZihzb2FwLT5tc2didWYpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAoc29hcF9zZXRfbWltZV9hdHRhY2htZW50KHNvYXAsIE5VTEwsIDAsIFNPQVBfTUlNRV9OT05FLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgY29udGVudCA9IHNvYXAtPm1pbWUubGFzdDsKKyAgZm9yICg7OykKKyAgeyByZWdpc3RlciBjaGFyICprZXkgPSBzb2FwLT5tc2didWY7CisgICAgcmVnaXN0ZXIgY2hhciAqdmFsOworICAgIGlmICghKmtleSkKKyAgICAgIGJyZWFrOworICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJNSU1FIGhlYWRlcjogJXNcbiIsIGtleSkpOworICAgIHZhbCA9IHN0cmNocihzb2FwLT5tc2didWYsICc6Jyk7CisgICAgaWYgKHZhbCkKKyAgICB7ICp2YWwgPSAnXDAnOworICAgICAgZG8gdmFsKys7CisgICAgICB3aGlsZSAoKnZhbCAmJiAqdmFsIDw9IDMyKTsKKyAgICAgIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtSUQiKSkKKyAgICAgICAgY29udGVudC0+aWQgPSBzb2FwX3N0cmR1cChzb2FwLCB2YWwpOworICAgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LUxvY2F0aW9uIikpCisgICAgICAgIGNvbnRlbnQtPmxvY2F0aW9uID0gc29hcF9zdHJkdXAoc29hcCwgdmFsKTsKKyAgICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1EaXNwb3NpdGlvbiIpKQorICAgICAgICBjb250ZW50LT5pZCA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAibmFtZSIpKTsKKyAgICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1UeXBlIikpCisgICAgICAgIGNvbnRlbnQtPnR5cGUgPSBzb2FwX3N0cmR1cChzb2FwLCB2YWwpOworICAgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LURlc2NyaXB0aW9uIikpCisgICAgICAgIGNvbnRlbnQtPmRlc2NyaXB0aW9uID0gc29hcF9zdHJkdXAoc29hcCwgdmFsKTsKKyAgICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyIpKQorICAgICAgICBjb250ZW50LT5lbmNvZGluZyA9IChlbnVtIHNvYXBfbWltZV9lbmNvZGluZylzb2FwX2ludF9jb2RlKG1pbWVfY29kZXMsIHZhbCwgKGxvbmcpU09BUF9NSU1FX05PTkUpOworICAgIH0KKyAgICBpZiAoc29hcF9nZXRsaW5lKHNvYXAsIGtleSwgc2l6ZW9mKHNvYXAtPm1zZ2J1ZikpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0bWltZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjID0gMDsKKyAgaWYgKCFzb2FwLT5taW1lLmxhc3QpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIGZvciAoOzspCisgIHsgcmVnaXN0ZXIgc2l6ZV90IGksIG0gPSAwOworICAgIHJlZ2lzdGVyIGNoYXIgKnMsICp0ID0gTlVMTDsKKyAgICBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQgPSBzb2FwLT5taW1lLmxhc3Q7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQYXJzaW5nIE1JTUUgY29udGVudCBpZD0lcyB0eXBlPSVzXG4iLCBjb250ZW50LT5pZD9jb250ZW50LT5pZDoiIiwgY29udGVudC0+dHlwZT9jb250ZW50LT50eXBlOiIiKSk7CisgICAgaWYgKHNvYXBfbmV3X2Jsb2NrKHNvYXApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgZm9yICg7OykKKyAgICB7IHJlZ2lzdGVyIHNob3J0IGZsYWcgPSAwOworICAgICAgaWYgKCEocyA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgU09BUF9CTEtMRU4pKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICBmb3IgKGkgPSAwOyBpIDwgU09BUF9CTEtMRU47IGkrKykKKyAgICAgIHsgaWYgKG0gPiAwKQorICAgICAgICB7ICpzKysgPSAqdCsrOworCSAgbS0tOworCX0KKwllbHNlCisgICAgICAgIHsgaWYgKCFmbGFnKQorCSAgeyBjID0gc29hcF9nZXQxKHNvYXApOworCSAgICBpZiAoKGludCljID09IEVPRikKKwkgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKwkgIH0KKwkgIGlmIChmbGFnIHx8IGMgPT0gJ1xyJykKKwkgIHsgdCA9IHNvYXAtPnRtcGJ1ZjsKKwkgICAgbWVtc2V0KHQsIDAsIHNpemVvZihzb2FwLT50bXBidWYpKTsKKyAgICAgICAgICAgIHN0cmNweSh0LCAiXG4tLSIpOworICAgICAgICAgICAgaWYgKHNvYXAtPm1pbWUuYm91bmRhcnkpCisJICAgICAgc3RybmNhdCh0LCBzb2FwLT5taW1lLmJvdW5kYXJ5LCBzaXplb2Yoc29hcC0+dG1wYnVmKS00KTsKKwkgICAgZG8gYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKwkgICAgd2hpbGUgKGMgPT0gKnQrKyk7CisJICAgIGlmICgoaW50KWMgPT0gRU9GKQorCSAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworCSAgICBpZiAoISotLXQpCisJICAgICAgZ290byBlbmQ7CisJICAgICp0ID0gKGNoYXIpYzsKKwkgICAgZmxhZyA9IChjID09ICdccicpOworCSAgICBtID0gdCAtIHNvYXAtPnRtcGJ1ZiArIDEgLSBmbGFnOworCSAgICB0ID0gc29hcC0+dG1wYnVmOworCSAgICBjID0gJ1xyJzsKKwkgIH0KKwkgICpzKysgPSAoY2hhciljOworICAgICAgICB9CisgICAgICB9CisgICAgfQorZW5kOgorICAgICpzID0gJ1wwJzsgLyogZm9yY2UgMC10ZXJtaW5hdGVkICovCisgICAgY29udGVudC0+c2l6ZSA9IHNvYXBfc2l6ZV9ibG9jayhzb2FwLCBpKzEpLTE7CisgICAgY29udGVudC0+cHRyID0gc29hcF9zYXZlX2Jsb2NrKHNvYXAsIE5VTEwsIDApOworICAgIHNvYXBfcmVzb2x2ZV9hdHRhY2htZW50KHNvYXAsIGNvbnRlbnQpOworICAgIGlmIChjID09ICctJyAmJiBzb2FwX2dldGNoYXIoc29hcCkgPT0gJy0nKQorICAgICAgYnJlYWs7CisgICAgd2hpbGUgKGMgIT0gJ1xyJyAmJiAoaW50KWMgIT0gRU9GICYmIHNvYXBfYmxhbmsoYykpCisgICAgICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICAgIGlmIChjICE9ICdccicgfHwgc29hcF9nZXRjaGFyKHNvYXApICE9ICdcbicpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX01JTUVfRVJST1I7CisgICAgaWYgKHNvYXBfZ2V0bWltZWhkcihzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc29hcF9tYXRjaF9jaWQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKnQpCit7IHJlZ2lzdGVyIHNpemVfdCBuOworICBpZiAoIXMpCisgICAgcmV0dXJuIDE7CisgIGlmICghc3RyY21wKHMsIHQpKQorICAgIHJldHVybiAwOworICBpZiAoIXN0cm5jbXAocywgImNpZDoiLCA0KSkKKyAgICBzICs9IDQ7CisgIG4gPSBzdHJsZW4odCk7CisgIGlmICgqdCA9PSAnPCcpCisgIHsgdCsrOworICAgIG4gLT0gMjsKKyAgfQorICBpZiAoIXN0cm5jbXAocywgdCwgbikgJiYgIXNbbl0pCisgICAgcmV0dXJuIDA7CisgIHNvYXBfZGVjb2RlKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksIHMsIFNPQVBfU1RSX0VPUyk7CisgIGlmICghc3RybmNtcChzb2FwLT50bXBidWYsIHQsIG4pICYmICFzb2FwLT50bXBidWZbbl0pCisgICAgcmV0dXJuIDA7CisgIHJldHVybiAxOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZAorc29hcF9yZXNvbHZlX2F0dGFjaG1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudCkKK3sgaWYgKGNvbnRlbnQtPmlkKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3hsaXN0ICoqeHAgPSAmc29hcC0+eGxpc3Q7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHZpbmcgYXR0YWNobWVudCBkYXRhIGZvciBpZD0lc1xuIiwgY29udGVudC0+aWQpKTsKKyAgICB3aGlsZSAoKnhwKQorICAgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfeGxpc3QgKnhxID0gKnhwOworICAgICAgaWYgKCFzb2FwX21hdGNoX2NpZChzb2FwLCB4cS0+aWQsIGNvbnRlbnQtPmlkKSkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGb3VuZCBtYXRjaGluZyBhdHRhY2htZW50ICVzIGZvciBjb250ZW50IGlkPSVzXG4iLCB4cS0+aWQsIGNvbnRlbnQtPmlkKSk7CisJKnhwID0geHEtPm5leHQ7CisgICAgICAgICp4cS0+cHRyID0gKHVuc2lnbmVkIGNoYXIqKWNvbnRlbnQtPnB0cjsKKyAgICAgICAgKnhxLT5zaXplID0gKGludCljb250ZW50LT5zaXplOworICAgICAgICAqeHEtPnR5cGUgPSAoY2hhciopY29udGVudC0+dHlwZTsKKwlpZiAoY29udGVudC0+b3B0aW9ucykKKyAgICAgICAgICAqeHEtPm9wdGlvbnMgPSAoY2hhciopY29udGVudC0+b3B0aW9uczsKKyAgICAgICAgZWxzZQorICAgICAgICAgICp4cS0+b3B0aW9ucyA9IChjaGFyKiljb250ZW50LT5kZXNjcmlwdGlvbjsKKwlTT0FQX0ZSRUUoc29hcCwgeHEpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB4cCA9ICYoKnhwKS0+bmV4dDsKKyAgICB9CisgIH0KK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dG1pbWVoZHIoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudCkKK3sgY29uc3QgY2hhciAqczsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJNSU1FIGF0dGFjaG1lbnQgdHlwZT0lc1xuIiwgY29udGVudC0+dHlwZT9jb250ZW50LT50eXBlOiIiKSk7CisgIGlmIChzb2FwX3NlbmQzKHNvYXAsICJcclxuLS0iLCBzb2FwLT5taW1lLmJvdW5kYXJ5LCAiXHJcbiIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKGNvbnRlbnQtPnR5cGUgJiYgc29hcF9zZW5kMyhzb2FwLCAiQ29udGVudC1UeXBlOiAiLCBjb250ZW50LT50eXBlLCAiXHJcbiIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcyA9IHNvYXBfc3RyX2NvZGUobWltZV9jb2RlcywgY29udGVudC0+ZW5jb2RpbmcpOworICBpZiAocyAmJiBzb2FwX3NlbmQzKHNvYXAsICJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiAiLCBzLCAiXHJcbiIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKGNvbnRlbnQtPmlkICYmIHNvYXBfc2VuZDMoc29hcCwgIkNvbnRlbnQtSUQ6ICIsIGNvbnRlbnQtPmlkLCAiXHJcbiIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKGNvbnRlbnQtPmxvY2F0aW9uICYmIHNvYXBfc2VuZDMoc29hcCwgIkNvbnRlbnQtTG9jYXRpb246ICIsIGNvbnRlbnQtPmxvY2F0aW9uLCAiXHJcbiIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKGNvbnRlbnQtPmRlc2NyaXB0aW9uICYmIHNvYXBfc2VuZDMoc29hcCwgIkNvbnRlbnQtRGVzY3JpcHRpb246ICIsIGNvbnRlbnQtPmRlc2NyaXB0aW9uLCAiXHJcbiIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgIlxyXG4iLCAyKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dG1pbWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01JTUUpIHx8ICFzb2FwLT5taW1lLmJvdW5kYXJ5KQorICAgIHJldHVybiBTT0FQX09LOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNlbmRpbmcgTUlNRSBhdHRhY2htZW50c1xuIikpOworICBmb3IgKGNvbnRlbnQgPSBzb2FwLT5taW1lLmZpcnN0OyBjb250ZW50OyBjb250ZW50ID0gY29udGVudC0+bmV4dCkKKyAgICBpZiAoc29hcF9wdXRtaW1laGRyKHNvYXAsIGNvbnRlbnQpCisgICAgIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgY29udGVudC0+cHRyLCBjb250ZW50LT5zaXplKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfc2VuZDMoc29hcCwgIlxyXG4tLSIsIHNvYXAtPm1pbWUuYm91bmRhcnksICItLSIpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9kaW1lKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5vbW9kZSB8PSBTT0FQX0VOQ19ESU1FOworICBzb2FwLT5kaW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5sYXN0ID0gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfbWltZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqYm91bmRhcnksIGNvbnN0IGNoYXIgKnN0YXJ0KQoreyBzb2FwLT5vbW9kZSB8PSBTT0FQX0VOQ19NSU1FOworICBzb2FwLT5taW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5sYXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5ib3VuZGFyeSA9IHNvYXBfc3RyZHVwKHNvYXAsIGJvdW5kYXJ5KTsKKyAgc29hcC0+bWltZS5zdGFydCA9IHNvYXBfc3RyZHVwKHNvYXAsIHN0YXJ0KTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9jbHJfZGltZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+b21vZGUgJj0gflNPQVBfRU5DX0RJTUU7CisgIHNvYXAtPmRpbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmxhc3QgPSBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2Nscl9taW1lKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5vbW9kZSAmPSB+U09BUF9FTkNfTUlNRTsKKyAgc29hcC0+bWltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuYm91bmRhcnkgPSBOVUxMOworICBzb2FwLT5taW1lLnN0YXJ0ID0gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHN0cnVjdCBzb2FwX211bHRpcGFydCoKK3NvYXBfbmV3X211bHRpcGFydChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICoqZmlyc3QsIHN0cnVjdCBzb2FwX211bHRpcGFydCAqKmxhc3QsIGNoYXIgKnB0ciwgc2l6ZV90IHNpemUpCit7IHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgY29udGVudCA9IChzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQpKTsKKyAgaWYgKGNvbnRlbnQpCisgIHsgY29udGVudC0+bmV4dCA9IE5VTEw7CisgICAgY29udGVudC0+cHRyID0gcHRyOworICAgIGNvbnRlbnQtPnNpemUgPSBzaXplOworICAgIGNvbnRlbnQtPmlkID0gTlVMTDsKKyAgICBjb250ZW50LT50eXBlID0gTlVMTDsKKyAgICBjb250ZW50LT5vcHRpb25zID0gTlVMTDsKKyAgICBjb250ZW50LT5lbmNvZGluZyA9IFNPQVBfTUlNRV9OT05FOworICAgIGNvbnRlbnQtPmxvY2F0aW9uID0gTlVMTDsKKyAgICBjb250ZW50LT5kZXNjcmlwdGlvbiA9IE5VTEw7CisgICAgaWYgKCEqZmlyc3QpCisgICAgICAqZmlyc3QgPSBjb250ZW50OworICAgIGlmICgqbGFzdCkKKyAgICAgICgqbGFzdCktPm5leHQgPSBjb250ZW50OworICAgICpsYXN0ID0gY29udGVudDsKKyAgfQorICByZXR1cm4gY29udGVudDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NldF9kaW1lX2F0dGFjaG1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnB0ciwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmlkLCB1bnNpZ25lZCBzaG9ydCBvcHR5cGUsIGNvbnN0IGNoYXIgKm9wdGlvbikKK3sgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50ID0gc29hcF9uZXdfbXVsdGlwYXJ0KHNvYXAsICZzb2FwLT5kaW1lLmZpcnN0LCAmc29hcC0+ZGltZS5sYXN0LCBwdHIsIHNpemUpOworICBpZiAoIWNvbnRlbnQpCisgICAgcmV0dXJuIFNPQVBfRU9NOworICBjb250ZW50LT5pZCA9IHNvYXBfc3RyZHVwKHNvYXAsIGlkKTsKKyAgY29udGVudC0+dHlwZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHR5cGUpOworICBjb250ZW50LT5vcHRpb25zID0gc29hcF9kaW1lX29wdGlvbihzb2FwLCBvcHR5cGUsIG9wdGlvbik7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X21pbWVfYXR0YWNobWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqcHRyLCBzaXplX3Qgc2l6ZSwgZW51bSBzb2FwX21pbWVfZW5jb2RpbmcgZW5jb2RpbmcsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICpsb2NhdGlvbiwgY29uc3QgY2hhciAqZGVzY3JpcHRpb24pCit7IHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudCA9IHNvYXBfbmV3X211bHRpcGFydChzb2FwLCAmc29hcC0+bWltZS5maXJzdCwgJnNvYXAtPm1pbWUubGFzdCwgcHRyLCBzaXplKTsKKyAgaWYgKCFjb250ZW50KQorICAgIHJldHVybiBTT0FQX0VPTTsKKyAgY29udGVudC0+aWQgPSBzb2FwX3N0cmR1cChzb2FwLCBpZCk7CisgIGNvbnRlbnQtPnR5cGUgPSBzb2FwX3N0cmR1cChzb2FwLCB0eXBlKTsKKyAgY29udGVudC0+ZW5jb2RpbmcgPSBlbmNvZGluZzsKKyAgY29udGVudC0+bG9jYXRpb24gPSBzb2FwX3N0cmR1cChzb2FwLCBsb2NhdGlvbik7CisgIGNvbnRlbnQtPmRlc2NyaXB0aW9uID0gc29hcF9zdHJkdXAoc29hcCwgZGVzY3JpcHRpb24pOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc3RydWN0IHNvYXBfbXVsdGlwYXJ0KgorU09BUF9GTUFDMgorc29hcF9uZXh0X211bHRpcGFydChzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQpCit7IGlmIChjb250ZW50KQorICAgIHJldHVybiBjb250ZW50LT5uZXh0OworICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQKK3NvYXBfc2VsZWN0X21pbWVfYm91bmRhcnkoc3RydWN0IHNvYXAgKnNvYXApCit7IHdoaWxlICghc29hcC0+bWltZS5ib3VuZGFyeSB8fCBzb2FwX3ZhbGlkX21pbWVfYm91bmRhcnkoc29hcCkpCisgIHsgcmVnaXN0ZXIgY2hhciAqcyA9IHNvYXAtPm1pbWUuYm91bmRhcnk7CisgICAgcmVnaXN0ZXIgc2l6ZV90IG4gPSAwOworICAgIGlmIChzKQorICAgICAgbiA9IHN0cmxlbihzKTsKKyAgICBpZiAobiA8IDE2KQorICAgIHsgbiA9IDY0OworICAgICAgcyA9IHNvYXAtPm1pbWUuYm91bmRhcnkgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgbiArIDEpOworICAgICAgaWYgKCFzKQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0cmNweShzLCAiPT0iKTsKKyAgICBzICs9IDI7CisgICAgbiAtPSA0OworICAgIHdoaWxlIChuKQorICAgIHsgKnMrKyA9IHNvYXBfYmFzZTY0b1tzb2FwX3JhbmRvbSAmIDB4M0ZdOworICAgICAgbi0tOworICAgIH0KKyAgICBzdHJjcHkocywgIj09Iik7CisgIH0KKyAgaWYgKCFzb2FwLT5taW1lLnN0YXJ0KQorICAgIHNvYXAtPm1pbWUuc3RhcnQgPSAiPFNPQVAtRU5WOkVudmVsb3BlPiI7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NvYXBfdmFsaWRfbWltZV9ib3VuZGFyeShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICByZWdpc3RlciBzaXplX3QgayA9IHN0cmxlbihzb2FwLT5taW1lLmJvdW5kYXJ5KTsKKyAgZm9yIChjb250ZW50ID0gc29hcC0+bWltZS5maXJzdDsgY29udGVudDsgY29udGVudCA9IGNvbnRlbnQtPm5leHQpCisgIHsgaWYgKGNvbnRlbnQtPnB0ciAmJiBjb250ZW50LT5zaXplID49IGspCisgICAgeyByZWdpc3RlciBjb25zdCBjaGFyICpwID0gKGNvbnN0IGNoYXIqKWNvbnRlbnQtPnB0cjsgCisgICAgICByZWdpc3RlciBzaXplX3QgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjb250ZW50LT5zaXplIC0gazsgaSsrLCBwKyspCisgICAgICAgIGlmICghc3RybmNtcChwLCBzb2FwLT5taW1lLmJvdW5kYXJ5LCBrKSkKKyAgICAgICAgICByZXR1cm4gU09BUF9FUlI7CisgICAgfQorICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglIVFRQIGNvb2tpZSBoYW5kbGluZworICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBXSVRIX0NPT0tJRVMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitzaXplX3QKK1NPQVBfRk1BQzIKK3NvYXBfZW5jb2RlX2Nvb2tpZShjb25zdCBjaGFyICpzLCBjaGFyICp0LCBzaXplX3QgbGVuKQoreyByZWdpc3RlciBpbnQgYzsKKyAgcmVnaXN0ZXIgc2l6ZV90IG4gPSBsZW47CisgIHdoaWxlICgoYyA9ICpzKyspICYmIC0tbiA+IDApCisgIHsgaWYgKGMgPiAnICcgJiYgYyA8IDEyOCAmJiAhc3RyY2hyKCIoKTw+QCw7OlxcXCIvW10/PXt9IiwgYykpCisgICAgICAqdCsrID0gYzsKKyAgICBlbHNlIGlmIChuID4gMikKKyAgICB7ICp0KysgPSAnJSc7CisgICAgICAqdCsrID0gKGMgPj4gNCkgKyAoYyA+IDE1OSA/ICc3JyA6ICcwJyk7CisgICAgICBjICY9IDB4RjsKKyAgICAgICp0KysgPSBjICsgKGMgPiA5ID8gJzcnIDogJzAnKTsKKyAgICAgIG4gLT0gMjsKKyAgICB9CisgICAgZWxzZQorICAgICAgYnJlYWs7CisgIH0KKyAgKnQgPSAnXDAnOworICByZXR1cm4gbGVuIC0gbjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwX2Nvb2tpZSoKK1NPQVBfRk1BQzIKK3NvYXBfY29va2llKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgc2l6ZV90IG47CisgIGlmICghZG9tYWluKQorICAgIGRvbWFpbiA9IHNvYXAtPmNvb2tpZV9kb21haW47CisgIGlmICghcGF0aCkKKyAgICBwYXRoID0gc29hcC0+Y29va2llX3BhdGg7CisgIGlmICgqcGF0aCA9PSAnLycpCisgICAgcGF0aCsrOworICBuID0gc3RybGVuKHBhdGgpOworICBmb3IgKHAgPSBzb2FwLT5jb29raWVzOyBwOyBwID0gcC0+bmV4dCkKKyAgICBpZiAoIXN0cmNtcChwLT5uYW1lLCBuYW1lKQorICAgICAmJiBkb21haW4KKyAgICAgJiYgcC0+ZG9tYWluCisgICAgICYmICFzdHJjbXAocC0+ZG9tYWluLCBkb21haW4pCisgICAgICYmICFzdHJuY21wKHAtPnBhdGgsIHBhdGgsIG4pKQorICAgICAgYnJlYWs7CisgIHJldHVybiBwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQorc3RydWN0IHNvYXBfY29va2llKgorU09BUF9GTUFDMgorc29hcF9zZXRfY29va2llKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKipwLCAqcTsKKyAgaW50IG47CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2V0IGNvb2tpZTogJXM9JXMgZG9tYWluPSVzIHBhdGg9JXNcbiIsIG5hbWUsIHZhbHVlP3ZhbHVlOiIiLCBkb21haW4/ZG9tYWluOiIiLCBwYXRoP3BhdGg6IiIpKTsKKyAgaWYgKCFkb21haW4pCisgICAgZG9tYWluID0gc29hcC0+Y29va2llX2RvbWFpbjsKKyAgaWYgKCFwYXRoKQorICAgIHBhdGggPSBzb2FwLT5jb29raWVfcGF0aDsKKyAgaWYgKCFwYXRoKQorICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJDb29raWUgcGF0aCBub3Qgc2V0IiwgTlVMTCwgU09BUF9IVFRQX0VSUk9SKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoKnBhdGggPT0gJy8nKQorICAgIHBhdGgrKzsKKyAgcSA9IHNvYXBfY29va2llKHNvYXAsIG5hbWUsIGRvbWFpbiwgcGF0aCk7CisgIGlmICghcSkKKyAgeyBpZiAoKHEgPSAoc3RydWN0IHNvYXBfY29va2llKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfY29va2llKSkpKQorICAgIHsgaWYgKChxLT5uYW1lID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihuYW1lKSsxKSkpCisgICAgICAgIHN0cmNweShxLT5uYW1lLCBuYW1lKTsKKyAgICAgIHEtPnZhbHVlID0gTlVMTDsKKyAgICAgIHEtPmRvbWFpbiA9IE5VTEw7CisgICAgICBxLT5wYXRoID0gTlVMTDsKKyAgICAgIHEtPmV4cGlyZSA9IC0xOworICAgICAgcS0+dmVyc2lvbiA9IDA7CisgICAgICBxLT5zZWN1cmUgPSAwOworICAgICAgcS0+bW9kaWZpZWQgPSAwOworICAgICAgZm9yIChwID0gJnNvYXAtPmNvb2tpZXMsIG4gPSBzb2FwLT5jb29raWVfbWF4OyAqcCAmJiBuOyBwID0gJigqcCktPm5leHQsIG4tLSkKKyAgICAgICAgaWYgKCFzdHJjbXAoKCpwKS0+bmFtZSwgbmFtZSkgJiYgKCpwKS0+cGF0aCAmJiBzdHJjbXAoKCpwKS0+cGF0aCwgcGF0aCkgPCAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgaWYgKG4pCisgICAgICB7IHEtPm5leHQgPSAqcDsKKyAgICAgICAgKnAgPSBxOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBTT0FQX0ZSRUUoc29hcCwgcS0+bmFtZSk7CisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBxKTsKKyAgICAgICAgcSA9IE5VTEw7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyAgICBxLT5tb2RpZmllZCA9IDE7CisgIGlmIChxKQorICB7IGlmIChxLT52YWx1ZSkKKyAgICB7IFNPQVBfRlJFRShzb2FwLCBxLT52YWx1ZSk7CisgICAgICBxLT52YWx1ZSA9IE5VTEw7CisgICAgfQorICAgIGlmIChxLT5kb21haW4pCisgICAgeyBTT0FQX0ZSRUUoc29hcCwgcS0+ZG9tYWluKTsKKyAgICAgIHEtPmRvbWFpbiA9IE5VTEw7CisgICAgfQorICAgIGlmIChxLT5wYXRoKQorICAgIHsgU09BUF9GUkVFKHNvYXAsIHEtPnBhdGgpOworICAgICAgcS0+cGF0aCA9IE5VTEw7CisgICAgfQorICAgIGlmICh2YWx1ZSAmJiAqdmFsdWUgJiYgKHEtPnZhbHVlID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbih2YWx1ZSkrMSkpKQorICAgICAgc3RyY3B5KHEtPnZhbHVlLCB2YWx1ZSk7CisgICAgaWYgKGRvbWFpbiAmJiAqZG9tYWluICYmIChxLT5kb21haW4gPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKGRvbWFpbikrMSkpKQorICAgICAgc3RyY3B5KHEtPmRvbWFpbiwgZG9tYWluKTsKKyAgICBpZiAocGF0aCAmJiAqcGF0aCAmJiAocS0+cGF0aCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4ocGF0aCkrMSkpKQorICAgICAgc3RyY3B5KHEtPnBhdGgsIHBhdGgpOworICAgIHEtPnNlc3Npb24gPSAxOworICAgIHEtPmVudiA9IDA7CisgIH0KKyAgcmV0dXJuIHE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2Nscl9jb29raWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICoqcCwgKnE7CisgIGlmICghZG9tYWluKQorICAgIGRvbWFpbiA9IHNvYXAtPmNvb2tpZV9kb21haW47CisgIGlmICghZG9tYWluKQorICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJDb29raWUgZG9tYWluIG5vdCBzZXQiLCBOVUxMLCBTT0FQX0hUVFBfRVJST1IpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoIXBhdGgpCisgICAgcGF0aCA9IHNvYXAtPmNvb2tpZV9wYXRoOworICBpZiAoIXBhdGgpCisgIHsgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIkNvb2tpZSBwYXRoIG5vdCBzZXQiLCBOVUxMLCBTT0FQX0hUVFBfRVJST1IpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoKnBhdGggPT0gJy8nKQorICAgIHBhdGgrKzsKKyAgZm9yIChwID0gJnNvYXAtPmNvb2tpZXMsIHEgPSAqcDsgcTsgcSA9ICpwKQorICAgIGlmICghc3RyY21wKHEtPm5hbWUsIG5hbWUpICYmICFzdHJjbXAocS0+ZG9tYWluLCBkb21haW4pICYmICFzdHJuY21wKHEtPnBhdGgsIHBhdGgsIHN0cmxlbihxLT5wYXRoKSkpCisgICAgeyBpZiAocS0+dmFsdWUpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBxLT52YWx1ZSk7CisgICAgICBpZiAocS0+ZG9tYWluKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcS0+ZG9tYWluKTsKKyAgICAgIGlmIChxLT5wYXRoKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcS0+cGF0aCk7CisgICAgICAqcCA9IHEtPm5leHQ7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgcSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHAgPSAmcS0+bmV4dDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9jb29raWVfdmFsdWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBpZiAoKHAgPSBzb2FwX2Nvb2tpZShzb2FwLCBuYW1lLCBkb21haW4sIHBhdGgpKSkKKyAgICByZXR1cm4gcC0+dmFsdWU7CisgIHJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX2Vudl9jb29raWVfdmFsdWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBpZiAoKHAgPSBzb2FwX2Nvb2tpZShzb2FwLCBuYW1lLCBkb21haW4sIHBhdGgpKSAmJiBwLT5lbnYpCisgICAgcmV0dXJuIHAtPnZhbHVlOworICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2xvbmcKK1NPQVBfRk1BQzIKK3NvYXBfY29va2llX2V4cGlyZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGlmICgocCA9IHNvYXBfY29va2llKHNvYXAsIG5hbWUsIGRvbWFpbiwgcGF0aCkpKQorICAgIHJldHVybiBwLT5leHBpcmU7CisgIHJldHVybiAtMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZXRfY29va2llX2V4cGlyZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgbG9uZyBleHBpcmUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBpZiAoKHAgPSBzb2FwX2Nvb2tpZShzb2FwLCBuYW1lLCBkb21haW4sIHBhdGgpKSkKKyAgeyBwLT5leHBpcmUgPSBleHBpcmU7CisgICAgcC0+bW9kaWZpZWQgPSAxOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIHJldHVybiBTT0FQX0VSUjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZXRfY29va2llX3Nlc3Npb24oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBpZiAoKHAgPSBzb2FwX2Nvb2tpZShzb2FwLCBuYW1lLCBkb21haW4sIHBhdGgpKSkKKyAgeyBwLT5zZXNzaW9uID0gMTsKKyAgICBwLT5tb2RpZmllZCA9IDE7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgcmV0dXJuIFNPQVBfRVJSOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2Nscl9jb29raWVfc2Vzc2lvbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGlmICgocCA9IHNvYXBfY29va2llKHNvYXAsIG5hbWUsIGRvbWFpbiwgcGF0aCkpKQorICB7IHAtPnNlc3Npb24gPSAwOworICAgIHAtPm1vZGlmaWVkID0gMTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICByZXR1cm4gU09BUF9FUlI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0c2V0Y29va2llcyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBjaGFyICpzLCB0bXBbNDA5Nl07CisgIGNvbnN0IGNoYXIgKnQ7CisgIGZvciAocCA9IHNvYXAtPmNvb2tpZXM7IHA7IHAgPSBwLT5uZXh0KQorICB7IGlmIChwLT5tb2RpZmllZCB8fCAhcC0+ZW52KQorICAgIHsgcyA9IHRtcDsKKyAgICAgIGlmIChwLT5uYW1lKQorICAgICAgICBzICs9IHNvYXBfZW5jb2RlX2Nvb2tpZShwLT5uYW1lLCBzLCB0bXAtcys0MDY0KTsKKyAgICAgIGlmIChwLT52YWx1ZSAmJiAqcC0+dmFsdWUpCisgICAgICB7ICpzKysgPSAnPSc7CisgICAgICAgIHMgKz0gc29hcF9lbmNvZGVfY29va2llKHAtPnZhbHVlLCBzLCB0bXAtcys0MDY0KTsKKyAgICAgIH0KKyAgICAgIGlmIChwLT5kb21haW4gJiYgKGludClzdHJsZW4ocC0+ZG9tYWluKSA8IHRtcC1zKzQwNjQpCisgICAgICAgIHNwcmludGYocywgIjtEb21haW49XCIlc1wiIiwgcC0+ZG9tYWluKTsKKyAgICAgIGVsc2UgaWYgKHNvYXAtPmNvb2tpZV9kb21haW4gJiYgKGludClzdHJsZW4oc29hcC0+Y29va2llX2RvbWFpbikgPCB0bXAtcys0MDY0KQorICAgICAgICBzcHJpbnRmKHMsICI7RG9tYWluPVwiJXNcIiIsIHNvYXAtPmNvb2tpZV9kb21haW4pOworICAgICAgc3RyY2F0KHMsICI7UGF0aD1cIi8iKTsKKyAgICAgIGlmIChwLT5wYXRoKQorICAgICAgICB0ID0gcC0+cGF0aDsKKyAgICAgIGVsc2UKKyAgICAgICAgdCA9IHNvYXAtPmNvb2tpZV9wYXRoOworICAgICAgaWYgKHQpCisgICAgICB7IGlmICgqdCA9PSAnLycpCisgICAgICAgICAgdCsrOworICAgICAgICBpZiAoKGludClzdHJsZW4odCkgPCB0bXAtcys0MDY0KQorICAgICAgICAgIHN0cmNhdChzLCB0KTsKKyAgICAgIH0KKyAgICAgIHMgKz0gc3RybGVuKHMpOworICAgICAgKnMrKyA9ICciJzsKKyAgICAgIGlmIChwLT52ZXJzaW9uID4gMCkKKyAgICAgICAgc3ByaW50ZihzLCAiO1ZlcnNpb249JXUiLCBwLT52ZXJzaW9uKTsKKyAgICAgIGlmIChwLT5leHBpcmUgPj0gMCkKKyAgICAgICAgc3ByaW50ZihzLCAiO01heC1BZ2U9JWxkIiwgcC0+ZXhwaXJlKTsKKyAgICAgIGlmIChwLT5zZWN1cmUpCisgICAgICAgIHN0cmNhdChzLCAiO1NlY3VyZSIpOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTZXQtQ29va2llOiAlc1xuIiwgdG1wKSk7CisgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlNldC1Db29raWUiLCB0bXApKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRjb29raWVzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgsIGludCBzZWN1cmUpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqKnAsICpxOworICB1bnNpZ25lZCBpbnQgdmVyc2lvbiA9IDA7CisgIHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOworICBjaGFyICpzLCB0bXBbNDA5Nl07CisgIHAgPSAmc29hcC0+Y29va2llczsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTZW5kaW5nIGNvb2tpZXMgZm9yIGRvbWFpbj0lcyBwYXRoPSVzXG4iLCBkb21haW4sIHBhdGgpKTsKKyAgaWYgKCpwYXRoID09ICcvJykKKyAgICBwYXRoKys7CisgIHdoaWxlICgocSA9ICpwKSkKKyAgeyBpZiAocS0+ZXhwaXJlICYmIG5vdyA+IHEtPmV4cGlyZSkKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29va2llICVzIGV4cGlyZWRcbiIsIHEtPm5hbWUpKTsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBxLT5uYW1lKTsKKyAgICAgIGlmIChxLT52YWx1ZSkKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHEtPnZhbHVlKTsKKyAgICAgIGlmIChxLT5kb21haW4pCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBxLT5kb21haW4pOworICAgICAgaWYgKHEtPnBhdGgpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBxLT5wYXRoKTsKKyAgICAgICpwID0gcS0+bmV4dDsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBxKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgc2l6ZV90IGRvbWxlbiA9IDA7CisgICAgICBpZiAocS0+ZG9tYWluKQorICAgICAgeyBjb25zdCBjaGFyICpzID0gc3RyY2hyKHEtPmRvbWFpbiwgJzonKTsKKyAgICAgICAgaWYgKHMpCisJICBkb21sZW4gPSBzIC0gcS0+ZG9tYWluOworCWVsc2UKKyAgICAgICAgICBkb21sZW4gPSBzdHJsZW4ocS0+ZG9tYWluKTsKKyAgICAgIH0KKyAgICAgIGlmICgoIXEtPmRvbWFpbiB8fCAhc3RybmNtcChxLT5kb21haW4sIGRvbWFpbiwgZG9tbGVuKSkKKyAgICAgICAgICAmJiAoIXEtPnBhdGggfHwgIXN0cm5jbXAocS0+cGF0aCwgcGF0aCwgc3RybGVuKHEtPnBhdGgpKSkKKyAgICAgICAgICAmJiAoIXEtPnNlY3VyZSB8fCBzZWN1cmUpKQorICAgICAgeyBzID0gdG1wOworICAgICAgICBpZiAocS0+dmVyc2lvbiAhPSB2ZXJzaW9uKQorICAgICAgICB7IHNwcmludGYocywgIiRWZXJzaW9uPSV1OyIsIHEtPnZlcnNpb24pOworICAgICAgICAgIHZlcnNpb24gPSBxLT52ZXJzaW9uOworICAgICAgICB9CisgICAgICAgIGlmIChxLT5uYW1lKQorICAgICAgICAgIHMgKz0gc29hcF9lbmNvZGVfY29va2llKHEtPm5hbWUsIHMsIHRtcC1zKzQwODApOworICAgICAgICBpZiAocS0+dmFsdWUgJiYgKnEtPnZhbHVlKQorICAgICAgICB7ICpzKysgPSAnPSc7CisgICAgICAgICAgcyArPSBzb2FwX2VuY29kZV9jb29raWUocS0+dmFsdWUsIHMsIHRtcC1zKzQwODApOworICAgICAgICB9CisgICAgICAgIGlmIChxLT5wYXRoICYmIChpbnQpc3RybGVuKHEtPnBhdGgpIDwgdG1wLXMrNDA4MCkKKyAgICAgICAgeyBzcHJpbnRmKHMsICI7JFBhdGg9XCIvJXNcIiIsICgqcS0+cGF0aCA9PSAnLycgPyBxLT5wYXRoICsgMSA6IHEtPnBhdGgpKTsKKyAgICAgICAgICBzICs9IHN0cmxlbihzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocS0+ZG9tYWluICYmIChpbnQpc3RybGVuKHEtPmRvbWFpbikgPCB0bXAtcys0MDgwKQorICAgICAgICAgIHNwcmludGYocywgIjskRG9tYWluPVwiJXNcIiIsIHEtPmRvbWFpbik7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29va2llOiAlc1xuIiwgdG1wKSk7CisgICAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQ29va2llIiwgdG1wKSkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgICAgcCA9ICZxLT5uZXh0OworICAgIH0KKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0Y29va2llcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdmFsKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnAgPSBOVUxMLCAqcTsKKyAgY29uc3QgY2hhciAqczsKKyAgY2hhciAqdCwgdG1wWzQwOTZdOyAvKiBjb29raWUgc2l6ZSBpcyB1cCB0byA0MDk2IGJ5dGVzIFtSRkMyMTA5XSAqLworICBjaGFyICpkb21haW4gPSBOVUxMOworICBjaGFyICpwYXRoID0gTlVMTDsKKyAgdW5zaWduZWQgaW50IHZlcnNpb24gPSAwOworICB0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKKyAgaWYgKCF2YWwpCisgICAgcmV0dXJuOworICBzID0gdmFsOworICB3aGlsZSAoKnMpCisgIHsgcyA9IHNvYXBfZGVjb2RlX2tleSh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICBpZiAoIXNvYXBfdGFnX2NtcCh0bXAsICIkVmVyc2lvbiIpKQorICAgIHsgaWYgKChzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpKSkKKyAgICAgIHsgaWYgKHApCisgICAgICAgICAgcC0+dmVyc2lvbiA9IChpbnQpYXRvbCh0bXApOworICAgICAgICBlbHNlCisgICAgICAgICAgdmVyc2lvbiA9IChpbnQpYXRvbCh0bXApOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHRtcCwgIiRQYXRoIikpCisgICAgeyBzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgICAgaWYgKCp0bXApCisgICAgICB7IGlmICgodCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4odG1wKSsxKSkpCisgICAgICAgICAgc3RyY3B5KHQsIHRtcCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHQgPSBOVUxMOworICAgICAgaWYgKHApCisgICAgICB7IGlmIChwLT5wYXRoKQorICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5wYXRoKTsKKyAgICAgICAgcC0+cGF0aCA9IHQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IGlmIChwYXRoKQorICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwYXRoKTsKKyAgICAgICAgcGF0aCA9IHQ7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAodG1wLCAiJERvbWFpbiIpKQorICAgIHsgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgIGlmICgqdG1wKQorICAgICAgeyBpZiAoKHQgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHRtcCkrMSkpKQorICAgICAgICAgIHN0cmNweSh0LCB0bXApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB0ID0gTlVMTDsKKyAgICAgIGlmIChwKQorICAgICAgeyBpZiAocC0+ZG9tYWluKQorICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5kb21haW4pOworCXAtPmRvbWFpbiA9IHQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IGlmIChkb21haW4pCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIGRvbWFpbik7CisgICAgICAgIGRvbWFpbiA9IHQ7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHAgJiYgIXNvYXBfdGFnX2NtcCh0bXAsICJQYXRoIikpCisgICAgeyBpZiAocC0+cGF0aCkKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnBhdGgpOworICAgICAgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgIGlmICgqdG1wKQorICAgICAgeyBpZiAoKHAtPnBhdGggPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHRtcCkrMSkpKQorICAgICAgICAgIHN0cmNweShwLT5wYXRoLCB0bXApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBwLT5wYXRoID0gTlVMTDsKKyAgICB9CisgICAgZWxzZSBpZiAocCAmJiAhc29hcF90YWdfY21wKHRtcCwgIkRvbWFpbiIpKQorICAgIHsgaWYgKHAtPmRvbWFpbikKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPmRvbWFpbik7CisgICAgICBzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgICAgaWYgKCp0bXApCisgICAgICB7IGlmICgocC0+ZG9tYWluID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbih0bXApKzEpKSkKKyAgICAgICAgICBzdHJjcHkocC0+ZG9tYWluLCB0bXApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBwLT5kb21haW4gPSBOVUxMOworICAgIH0KKyAgICBlbHNlIGlmIChwICYmICFzb2FwX3RhZ19jbXAodG1wLCAiVmVyc2lvbiIpKQorICAgIHsgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgIHAtPnZlcnNpb24gPSAodW5zaWduZWQgaW50KWF0b2wodG1wKTsKKyAgICB9CisgICAgZWxzZSBpZiAocCAmJiAhc29hcF90YWdfY21wKHRtcCwgIk1heC1BZ2UiKSkKKyAgICB7IHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICBwLT5leHBpcmUgPSBub3cgKyBhdG9sKHRtcCk7CisgICAgfQorICAgIGVsc2UgaWYgKHAgJiYgIXNvYXBfdGFnX2NtcCh0bXAsICJFeHBpcmVzIikpCisgICAgeyBzdHJ1Y3QgdG0gVDsKKyAgICAgIGNoYXIgYVszXTsgCisgICAgICBzdGF0aWMgY29uc3QgY2hhciBtbnNbXSA9ICJhbmViYXJwcmF5dW51bHVnZXBjdG92ZWMiOworICAgICAgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgIGlmIChzdHJsZW4odG1wKSA+IDIwKQorICAgICAgeyBtZW1zZXQoKHZvaWQqKSZULCAwLCBzaXplb2YoVCkpOworICAgICAgICBhWzBdID0gdG1wWzRdOworICAgICAgICBhWzFdID0gdG1wWzVdOworICAgICAgICBhWzJdID0gJ1wwJzsKKyAgICAgICAgVC50bV9tZGF5ID0gKGludClhdG9sKGEpOworICAgICAgICBhWzBdID0gdG1wWzhdOworICAgICAgICBhWzFdID0gdG1wWzldOworICAgICAgICBULnRtX21vbiA9IChzdHJzdHIobW5zLCBhKSAtIG1ucykgLyAyOworICAgICAgICBhWzBdID0gdG1wWzExXTsKKyAgICAgICAgYVsxXSA9IHRtcFsxMl07CisgICAgICAgIFQudG1feWVhciA9IDEwMCArIChpbnQpYXRvbChhKTsKKyAgICAgICAgYVswXSA9IHRtcFsxM107CisgICAgICAgIGFbMV0gPSB0bXBbMTRdOworICAgICAgICBULnRtX2hvdXIgPSAoaW50KWF0b2woYSk7CisgICAgICAgIGFbMF0gPSB0bXBbMTZdOworICAgICAgICBhWzFdID0gdG1wWzE3XTsKKyAgICAgICAgVC50bV9taW4gPSAoaW50KWF0b2woYSk7CisgICAgICAgIGFbMF0gPSB0bXBbMTldOworICAgICAgICBhWzFdID0gdG1wWzIwXTsKKyAgICAgICAgVC50bV9zZWMgPSAoaW50KWF0b2woYSk7CisgICAgICAgIHAtPmV4cGlyZSA9IHNvYXBfdGltZWdtKCZUKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAocCAmJiAhc29hcF90YWdfY21wKHRtcCwgIlNlY3VyZSIpKQorICAgICAgcC0+c2VjdXJlID0gMTsKKyAgICBlbHNlCisgICAgeyBpZiAocCkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHb3QgZW52aXJvbm1lbnQgY29va2llICVzPSVzIGRvbWFpbj0lcyBwYXRoPSVzIGV4cGlyZT0lbGQgc2VjdXJlPSVkXG4iLCBwLT5uYW1lLCBwLT52YWx1ZT9wLT52YWx1ZToiIiwgcC0+ZG9tYWluP3AtPmRvbWFpbjoiIiwgcC0+cGF0aD9wLT5wYXRoOiIiLCBwLT5leHBpcmUsIHAtPnNlY3VyZSkpOworICAgICAgICBpZiAoKHEgPSBzb2FwX3NldF9jb29raWUoc29hcCwgcC0+bmFtZSwgcC0+dmFsdWUsIHAtPmRvbWFpbiwgcC0+cGF0aCkpKQorICAgICAgICB7IHEtPnZlcnNpb24gPSBwLT52ZXJzaW9uOworICAgICAgICAgIHEtPmV4cGlyZSA9IHAtPmV4cGlyZTsKKyAgICAgICAgICBxLT5zZWN1cmUgPSBwLT5zZWN1cmU7CisgICAgICAgICAgcS0+ZW52ID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAocC0+bmFtZSkKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+bmFtZSk7CisgICAgICAgIGlmIChwLT52YWx1ZSkKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+dmFsdWUpOworICAgICAgICBpZiAocC0+ZG9tYWluKQorICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5kb21haW4pOworICAgICAgICBpZiAocC0+cGF0aCkKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+cGF0aCk7CisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwKTsKKyAgICAgIH0KKyAgICAgIGlmICgocCA9IChzdHJ1Y3Qgc29hcF9jb29raWUqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9jb29raWUpKSkpCisgICAgICB7IHAtPm5hbWUgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHRtcCkrMSk7CisgICAgICAgIHN0cmNweShwLT5uYW1lLCB0bXApOworICAgICAgICBzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgICAgICBpZiAoKnRtcCkKKyAgICAgICAgeyBwLT52YWx1ZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4odG1wKSsxKTsKKyAgICAgICAgICBzdHJjcHkocC0+dmFsdWUsIHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHAtPnZhbHVlID0gTlVMTDsKKyAgICAgICAgcC0+ZG9tYWluID0gZG9tYWluOworICAgICAgICBwLT5wYXRoID0gcGF0aDsKKyAgICAgICAgcC0+ZXhwaXJlID0gMDsKKyAgICAgICAgcC0+c2VjdXJlID0gMDsKKyAgICAgICAgcC0+dmVyc2lvbiA9IHZlcnNpb247CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChwKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR290IGVudmlyb25tZW50IGNvb2tpZSAlcz0lcyBkb21haW49JXMgcGF0aD0lcyBleHBpcmU9JWxkIHNlY3VyZT0lZFxuIiwgcC0+bmFtZSwgcC0+dmFsdWU/cC0+dmFsdWU6IiIsIHAtPmRvbWFpbj9wLT5kb21haW46IiIsIHAtPnBhdGg/cC0+cGF0aDoiIiwgcC0+ZXhwaXJlLCBwLT5zZWN1cmUpKTsKKyAgICBpZiAoKHEgPSBzb2FwX3NldF9jb29raWUoc29hcCwgcC0+bmFtZSwgcC0+dmFsdWUsIHAtPmRvbWFpbiwgcC0+cGF0aCkpKQorICAgIHsgcS0+dmVyc2lvbiA9IHAtPnZlcnNpb247CisgICAgICBxLT5leHBpcmUgPSBwLT5leHBpcmU7CisgICAgICBxLT5zZWN1cmUgPSBwLT5zZWN1cmU7CisgICAgICBxLT5lbnYgPSAxOworICAgIH0KKyAgICBpZiAocC0+bmFtZSkKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5uYW1lKTsKKyAgICBpZiAocC0+dmFsdWUpCisgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+dmFsdWUpOworICAgIGlmIChwLT5kb21haW4pCisgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+ZG9tYWluKTsKKyAgICBpZiAocC0+cGF0aCkKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5wYXRoKTsKKyAgICBTT0FQX0ZSRUUoc29hcCwgcCk7CisgIH0KKyAgaWYgKGRvbWFpbikKKyAgICBTT0FQX0ZSRUUoc29hcCwgZG9tYWluKTsKKyAgaWYgKHBhdGgpCisgICAgU09BUF9GUkVFKHNvYXAsIHBhdGgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldGVudl9jb29raWVzKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGNvbnN0IGNoYXIgKnM7CisgIGNoYXIga2V5WzQwOTZdLCB2YWxbNDA5Nl07IC8qIGNvb2tpZSBzaXplIGlzIHVwIHRvIDQwOTYgYnl0ZXMgW1JGQzIxMDldICovCisgIGlmICghKHMgPSBnZXRlbnYoIkhUVFBfQ09PS0lFIikpKQorICAgIHJldHVybiBTT0FQX0VSUjsKKyAgZG8KKyAgeyBzID0gc29hcF9kZWNvZGVfa2V5KGtleSwgc2l6ZW9mKGtleSksIHMpOworICAgIHMgPSBzb2FwX2RlY29kZV92YWwodmFsLCBzaXplb2YodmFsKSwgcyk7CisgICAgcCA9IHNvYXBfc2V0X2Nvb2tpZShzb2FwLCBrZXksIHZhbCwgTlVMTCwgTlVMTCk7CisgICAgaWYgKHApCisgICAgICBwLT5lbnYgPSAxOworICB9IHdoaWxlICgqcyk7CisgIHJldHVybiBTT0FQX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQorc3RydWN0IHNvYXBfY29va2llKgorU09BUF9GTUFDMgorc29hcF9jb3B5X2Nvb2tpZXMoc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcCwgKipxLCAqcjsKKyAgcSA9ICZyOworICBmb3IgKHAgPSBzb2FwLT5jb29raWVzOyBwOyBwID0gcC0+bmV4dCkKKyAgeyBpZiAoISgqcSA9IChzdHJ1Y3Qgc29hcF9jb29raWUqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9jb29raWUpKSkpCisgICAgICByZXR1cm4gcjsKKyAgICAqKnEgPSAqcDsKKyAgICBpZiAocC0+bmFtZSkKKyAgICB7IGlmICgoKCpxKS0+bmFtZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4ocC0+bmFtZSkrMSkpKQorICAgICAgICBzdHJjcHkoKCpxKS0+bmFtZSwgcC0+bmFtZSk7CisgICAgfQorICAgIGlmIChwLT52YWx1ZSkKKyAgICB7IGlmICgoKCpxKS0+dmFsdWUgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHAtPnZhbHVlKSsxKSkpCisgICAgICAgIHN0cmNweSgoKnEpLT52YWx1ZSwgcC0+dmFsdWUpOworICAgIH0KKyAgICBpZiAocC0+ZG9tYWluKQorICAgIHsgaWYgKCgoKnEpLT5kb21haW4gPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHAtPmRvbWFpbikrMSkpKQorICAgICAgICBzdHJjcHkoKCpxKS0+ZG9tYWluLCBwLT5kb21haW4pOworICAgIH0KKyAgICBpZiAocC0+cGF0aCkKKyAgICB7IGlmICgoKCpxKS0+cGF0aCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4ocC0+cGF0aCkrMSkpKQorICAgICAgICBzdHJjcHkoKCpxKS0+cGF0aCwgcC0+cGF0aCk7CisgICAgfQorICAgIHEgPSAmKCpxKS0+bmV4dDsKKyAgfQorICAqcSA9IE5VTEw7CisgIHJldHVybiByOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9mcmVlX2Nvb2tpZXMoc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgZm9yIChwID0gc29hcC0+Y29va2llczsgcDsgcCA9IHNvYXAtPmNvb2tpZXMpCisgIHsgc29hcC0+Y29va2llcyA9IHAtPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIHAtPm5hbWUpOworICAgIGlmIChwLT52YWx1ZSkKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT52YWx1ZSk7CisgICAgaWYgKHAtPmRvbWFpbikKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5kb21haW4pOworICAgIGlmIChwLT5wYXRoKQorICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnBhdGgpOworICAgIFNPQVBfRlJFRShzb2FwLCBwKTsKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2VuZGlmIC8qIFdJVEhfQ09PS0lFUyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFdJVEhfR1pJUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NvYXBfZ2V0Z3ppcGhkcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaW50IGk7CisgIHNvYXBfd2NoYXIgYywgZiA9IDA7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR2V0IGd6aXAgaGVhZGVyXG4iKSk7CisgIGZvciAoaSA9IDA7IGkgPCA5OyBpKyspCisgIHsgaWYgKChpbnQpKGMgPSBzb2FwX2dldDEoc29hcCkgPT0gRU9GKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgIGlmIChpID09IDIpCisgICAgICBmID0gYzsKKyAgfQorICBpZiAoZiAmIDB4MDQpIC8qIEZFWFRSQSAqLworICB7IGZvciAoaSA9IHNvYXBfZ2V0MShzb2FwKSB8IChzb2FwX2dldDEoc29hcCkgPDwgOCk7IGk7IGktLSkKKyAgICAgIGlmICgoaW50KXNvYXBfZ2V0MShzb2FwKSA9PSBFT0YpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICB9CisgIGlmIChmICYgMHgwOCkgLyogRk5BTUUgKi8KKyAgICBkbworICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICB3aGlsZSAoYyAmJiAoaW50KWMgIT0gRU9GKTsKKyAgaWYgKChpbnQpYyAhPSBFT0YgJiYgKGYgJiAweDEwKSkgLyogRkNPTU1FTlQgKi8KKyAgICBkbworICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICB3aGlsZSAoYyAmJiAoaW50KWYgIT0gRU9GKTsKKyAgaWYgKChpbnQpYyAhPSBFT0YgJiYgKGYgJiAweDAxKSkgLyogRkhDUkMgKi8KKyAgeyBpZiAoKGludCkoYyA9IHNvYXBfZ2V0MShzb2FwKSkgIT0gRU9GKQorICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgfQorICBpZiAoKGludCljID09IEVPRikKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9iZWdpbl9yZWN2KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwX3djaGFyIGM7CisgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgc29hcF9mcmVlKHNvYXApOworICBzb2FwX3NldF9sb2NhbF9uYW1lc3BhY2VzKHNvYXApOworICBzb2FwLT52ZXJzaW9uID0gMDsJLyogZG9uJ3QgYXNzdW1lIHdlJ3JlIHBhcnNpbmcgU09BUCBjb250ZW50IGJ5IGRlZmF1bHQgKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgIHNvYXBfZnJlZV9paHQoc29hcCk7CisjZW5kaWYKKyAgaWYgKChzb2FwLT5pbW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgICAgc29hcC0+b21vZGUgfD0gU09BUF9JT19DSFVOSzsKKyAgc29hcC0+aW1vZGUgJj0gflNPQVBfSU87CisgIHNvYXAtPm1vZGUgPSBzb2FwLT5pbW9kZTsKKyAgaWYgKCFzb2FwLT5rZWVwX2FsaXZlKQorICB7IHNvYXAtPmJ1ZmxlbiA9IDA7CisgICAgc29hcC0+YnVmaWR4ID0gMDsKKyAgfQorICBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9JT19LRUVQQUxJVkUpKQorICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOworICBzb2FwLT5haGVhZCA9IDA7CisgIHNvYXAtPnBlZWtlZCA9IDA7CisgIHNvYXAtPmxldmVsID0gMDsKKyAgc29hcC0+cGFydCA9IFNPQVBfQkVHSU47CisgIHNvYXAtPmFsbG9jZWQgPSAwOworICBzb2FwLT5jb3VudCA9IDA7CisgIHNvYXAtPmxlbmd0aCA9IDA7CisgIHNvYXAtPmNkYXRhID0gMDsKKyAgKnNvYXAtPmVuZHBvaW50ID0gJ1wwJzsKKyAgc29hcC0+YWN0aW9uID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcC0+ZG9tID0gTlVMTDsKKyAgc29hcC0+ZGltZS5jaHVua3NpemUgPSAwOworICBzb2FwLT5kaW1lLmJ1ZmxlbiA9IDA7CisgIHNvYXAtPmRpbWUubGlzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmxhc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmxpc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5sYXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5ib3VuZGFyeSA9IE5VTEw7CisgIHNvYXAtPm1pbWUuc3RhcnQgPSBOVUxMOworICBzb2FwLT54bGlzdCA9IE5VTEw7CisjZW5kaWYKKyNpZmRlZiBXSU4zMgorI2lmbmRlZiBVTkRFUl9DRQorI2lmbmRlZiBXSVRIX0ZBU1RDR0kKKyAgaWYgKCFzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorI2lmZGVmIF9fQk9STEFORENfXworICAgIHNldG1vZGUoKFNPQVBfU09DS0VUKXNvYXAtPnJlY3ZmZCwgT19CSU5BUlkpOworI2Vsc2UKKyAgICBfc2V0bW9kZSgoU09BUF9TT0NLRVQpc29hcC0+cmVjdmZkLCBfT19CSU5BUlkpOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgV0lUSF9aTElCCisgIHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX1pMSUI7CisgIHNvYXAtPnpsaWJfaW4gPSBTT0FQX1pMSUJfTk9ORTsKKyAgc29hcC0+emxpYl9vdXQgPSBTT0FQX1pMSUJfTk9ORTsKKyAgc29hcC0+ZF9zdHJlYW0ubmV4dF9pbiA9IFpfTlVMTDsKKyAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4gPSAwOworICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IChCeXRlKilzb2FwLT5idWY7CisgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCA9IFNPQVBfQlVGTEVOOworICBzb2FwLT56X3JhdGlvX2luID0gMS4wOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5mcHJlcGFyZWluaXQpCisgICAgc29hcC0+ZnByZXBhcmVpbml0KHNvYXApOworI2VuZGlmCisgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisjaWZkZWYgV0lUSF9HWklQCisgIGlmIChjID09IDB4MUYpCisgIHsgaWYgKHNvYXBfZ2V0Z3ppcGhkcihzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAoaW5mbGF0ZUluaXQyKCZzb2FwLT5kX3N0cmVhbSwgLU1BWF9XQklUUykgIT0gWl9PSykKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX0lORkxBVEU7CisgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19aTElCOworICAgIHNvYXAtPnpsaWJfaW4gPSBTT0FQX1pMSUJfR1pJUDsKKyAgICBzb2FwLT56X2NyYyA9IGNyYzMyKDBMLCBOVUxMLCAwKTsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImd6aXAgaW5pdGlhbGl6ZWRcbiIpKTsKKyAgICBtZW1jcHkoc29hcC0+el9idWYsIHNvYXAtPmJ1ZiwgU09BUF9CVUZMRU4pOworICAgIC8qIHNob3VsZCBub3QgY2h1bmsgb3ZlciBwbGFpbiB0cmFuc3BvcnQsIHNvIHdoeSBib3RoZXIgdG8gY2hlY2s/ICovCisgICAgLyogaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykgKi8KKyAgICAvKiAgIHNvYXAtPnpfYnVmbGVuID0gc29hcC0+YnVmaWR4OyAqLworICAgIC8qIGVsc2UgKi8KKyAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X2luID0gKEJ5dGUqKShzb2FwLT56X2J1ZiArIHNvYXAtPmJ1ZmlkeCk7CisgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4gPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgc29hcC0+el9idWZsZW4gPSBzb2FwLT5idWZsZW47CisgICAgc29hcC0+YnVmbGVuID0gc29hcC0+YnVmaWR4OworICAgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgIH0gIAorI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChjID09ICctJyAmJiBzb2FwX2dldDAoc29hcCkgPT0gJy0nKQorICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfTUlNRTsKKyAgZWxzZSBpZiAoKGMgJiAweEZGRkMpID09IChTT0FQX0RJTUVfVkVSU0lPTiB8IFNPQVBfRElNRV9NQikgJiYgKHNvYXBfZ2V0MChzb2FwKSAmIDB4RkZGMCkgPT0gMHgyMCkKKyAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX0RJTUU7CisgIGVsc2UKKyNlbmRpZgorICB7IHdoaWxlIChzb2FwX2JsYW5rKGMpKQorICAgICAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgfQorICBpZiAoKGludCljID09IEVPRikKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgc29hcF91bmdldChzb2FwLCBjKTsKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyAgLyogaWYgbm90IFhNTCBvciAoc3RhcnQgb2YpQk9NIG9yIE1JTUUvRElNRS9aTElCLCBhc3N1bWUgSFRUUCBoZWFkZXIgKi8KKyAgaWYgKGMgIT0gJzwnICYmIGMgIT0gMHhFRiAmJiAhKHNvYXAtPm1vZGUgJiAoU09BUF9FTkNfTUlNRSB8IFNPQVBfRU5DX0RJTUUgfCBTT0FQX0VOQ19aTElCKSkpCisgIHsgc29hcC0+bW9kZSAmPSB+U09BUF9JTzsKKyAgICBzb2FwLT5lcnJvciA9IHNvYXAtPmZwYXJzZShzb2FwKTsKKyAgICBpZiAoc29hcC0+ZXJyb3IgJiYgc29hcC0+ZXJyb3IgPCBTT0FQX1NUT1ApCisgICAgeyBzb2FwLT5rZWVwX2FsaXZlID0gMDsgLyogZm9yY2UgY2xvc2UgbGF0ZXIgKi8KKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgICB7IHNvYXAtPmNodW5rYnVmbGVuID0gc29hcC0+YnVmbGVuOworICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+YnVmaWR4OworICAgICAgc29hcC0+Y2h1bmtzaXplID0gMDsKKyAgICB9CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgICAgZWxzZSBpZiAoc29hcC0+ZnByZXBhcmVyZWN2ICYmIHNvYXAtPmJ1ZmxlbiAhPSBzb2FwLT5idWZpZHgpCisgICAgICBzb2FwLT5mcHJlcGFyZXJlY3Yoc29hcCwgc29hcC0+YnVmICsgc29hcC0+YnVmaWR4LCBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHgpOworI2VuZGlmCisjaWZkZWYgV0lUSF9aTElCCisgICAgaWYgKHNvYXAtPnpsaWJfaW4gIT0gU09BUF9aTElCX05PTkUpCisgICAgeyAvKiBmcGFyc2Ugc2hvdWxkIG5vdCB1c2Ugc29hcF91bmdldCB0byBwdXNoIGJhY2sgbGFzdCBjaGFyICovCisjaWZkZWYgV0lUSF9HWklQCisgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgaWYgKGMgPT0gMHgxRikKKyAgICAgIHsgaWYgKHNvYXBfZ2V0Z3ppcGhkcihzb2FwKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIGlmIChpbmZsYXRlSW5pdDIoJnNvYXAtPmRfc3RyZWFtLCAtTUFYX1dCSVRTKSAhPSBaX09LKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICAgICAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9JTkZMQVRFOworICAgICAgICBzb2FwLT56X2NyYyA9IGNyYzMyKDBMLCBOVUxMLCAwKTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJnemlwIGluaXRpYWxpemVkXG4iKSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IHNvYXBfcmV2Z2V0MShzb2FwKTsKKyNlbHNlCisgICAgICB7CisjZW5kaWYKKyAgICAgICAgaWYgKGluZmxhdGVJbml0KCZzb2FwLT5kX3N0cmVhbSkgIT0gWl9PSykKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgICAgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfSU5GTEFURTsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbmZsYXRlIGluaXRpYWxpemVkXG4iKSk7CisgICAgICB9CisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX1pMSUI7CisgICAgICBtZW1jcHkoc29hcC0+el9idWYsIHNvYXAtPmJ1ZiwgU09BUF9CVUZMRU4pOworICAgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9pbiA9IChCeXRlKikoc29hcC0+el9idWYgKyBzb2FwLT5idWZpZHgpOworICAgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4gPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgICBzb2FwLT56X2J1ZmxlbiA9IHNvYXAtPmJ1ZmxlbjsKKyAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmJ1ZmlkeDsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoc29hcC0+ZXJyb3IpCisgICAgeyBpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9GT1JNICYmIHNvYXAtPmZmb3JtKQorICAgICAgeyBzb2FwLT5lcnJvciA9IHNvYXAtPmZmb3JtKHNvYXApOworICAgICAgICBpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9PSykKKyAgICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfU1RPUDsgLyogcHJldmVudHMgZnVydGhlciBwcm9jZXNzaW5nICovCisgICAgICB9CisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICB9CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKQorICB7IGlmIChzb2FwX2dldG1pbWVoZHIoc29hcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgc29hcC0+bWltZS5maXJzdC0+dHlwZSwgImFwcGxpY2F0aW9uL2RpbWUiKSkKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfRElNRTsKKyAgfQorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpCisgIHsgaWYgKHNvYXBfZ2V0ZGltZWhkcihzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAoc29hcC0+ZGltZS5mbGFncyAmIFNPQVBfRElNRV9DRikKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ2h1bmtlZCBESU1FIFNPQVAgbWVzc2FnZVxuIikpOworICAgICAgc29hcC0+ZGltZS5jaHVua3NpemUgPSBzb2FwLT5kaW1lLnNpemU7CisgICAgICBpZiAoc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4ID49IHNvYXAtPmRpbWUuY2h1bmtzaXplKQorICAgICAgeyBzb2FwLT5kaW1lLmJ1ZmxlbiA9IHNvYXAtPmJ1ZmxlbjsKKyAgICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+YnVmaWR4ICsgc29hcC0+ZGltZS5jaHVua3NpemU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHNvYXAtPmRpbWUuY2h1bmtzaXplIC09IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICB9CisgICAgc29hcC0+Y291bnQgPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgIH0KKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK2h0dHBfcGFyc2Uoc3RydWN0IHNvYXAgKnNvYXApCit7IGNoYXIgaGVhZGVyW1NPQVBfSERSTEVOXSwgKnM7CisgIHVuc2lnbmVkIHNob3J0IGdldCA9IDAsIHN0YXR1cyA9IDAsIGsgPSAwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIldhaXRpbmcgZm9yIEhUVFAgcmVxdWVzdC9yZXNwb25zZS4uLlxuIikpOworICAqc29hcC0+ZW5kcG9pbnQgPSAnXDAnOworICBzb2FwLT5sZW5ndGggPSAwOworICBzb2FwLT51c2VyaWQgPSBOVUxMOworICBzb2FwLT5wYXNzd2QgPSBOVUxMOworICBzb2FwLT5hY3Rpb24gPSBOVUxMOworICBzb2FwLT5hdXRocmVhbG0gPSBOVUxMOworICBkbworICB7IGlmIChzb2FwX2dldGxpbmUoc29hcCwgc29hcC0+bXNnYnVmLCBzaXplb2Yoc29hcC0+bXNnYnVmKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkhUVFAgc3RhdHVzOiAlc1xuIiwgc29hcC0+bXNnYnVmKSk7CisgICAgZm9yICg7OykKKyAgICB7IGlmIChzb2FwX2dldGxpbmUoc29hcCwgaGVhZGVyLCBTT0FQX0hEUkxFTikpCisgICAgICB7IGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX0VPRikKKwl7IHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgICAgICAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiRU9GIGluIEhUVFAgaGVhZGVyLCBjb250aW51ZSBhbnl3YXlcbiIpKTsKKwkgIGJyZWFrOworCX0KKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgICAgaWYgKCEqaGVhZGVyKQorICAgICAgICBicmVhazsKKyAgICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJIVFRQIGhlYWRlcjogJXNcbiIsIGhlYWRlcikpOworICAgICAgcyA9IHN0cmNocihoZWFkZXIsICc6Jyk7CisgICAgICBpZiAocykKKyAgICAgIHsgKnMgPSAnXDAnOworICAgICAgICBkbyBzKys7CisgICAgICAgIHdoaWxlICgqcyAmJiAqcyA8PSAzMik7CisgICAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcGFyc2VoZHIoc29hcCwgaGVhZGVyLCBzKSkpCisgICAgICAgIHsgaWYgKHNvYXAtPmVycm9yIDwgU09BUF9TVE9QKQorCSAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisJICBzdGF0dXMgPSBzb2FwLT5lcnJvcjsKKwkgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAoKHMgPSBzdHJjaHIoc29hcC0+bXNnYnVmLCAnICcpKSkKKyAgICB7IGsgPSAodW5zaWduZWQgc2hvcnQpc29hcF9zdHJ0b3VsKHMsICZzLCAxMCk7CisgICAgICBpZiAoIXNvYXBfYmxhbmsoKnMpKQorICAgICAgICBrID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgICAgayA9IDA7CisgIH0gd2hpbGUgKGsgPT0gMTAwKTsKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZpbmlzaGVkIEhUVFAgaGVhZGVyIHBhcnNpbmdcbiIpKTsKKyAgcyA9IHN0cnN0cihzb2FwLT5tc2didWYsICJIVFRQLyIpOworICBpZiAocyAmJiBzWzddICE9ICcxJykKKyAgeyBpZiAoc29hcC0+a2VlcF9hbGl2ZSA9PSAxKQorICAgICAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7CisgICAgaWYgKGsgPT0gMCAmJiAoc29hcC0+b21vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKSAvKiBrID09IDAgZm9yIEhUVFAgcmVxdWVzdCAqLworICAgIHsgc29hcC0+aW1vZGUgfD0gU09BUF9JT19DSFVOSzsKKyAgICAgIHNvYXAtPm9tb2RlID0gKHNvYXAtPm9tb2RlICYgflNPQVBfSU8pIHwgU09BUF9JT19TVE9SRTsKKyAgICB9CisgIH0KKyAgaWYgKHNvYXAtPmtlZXBfYWxpdmUgPCAwKQorICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAxOworICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiS2VlcCBhbGl2ZSBjb25uZWN0aW9uID0gJWRcbiIsIHNvYXAtPmtlZXBfYWxpdmUpKTsKKyAgaWYgKHMgJiYgKCgoZ2V0ID0gIXN0cm5jbXAoc29hcC0+bXNnYnVmLCAiR0VUICIsIDQpKSkgfHwgIXN0cm5jbXAoc29hcC0+bXNnYnVmLCAiUE9TVCAiLCA1KSkpCisgIHsgc2l6ZV90IG0gPSBzdHJsZW4oc29hcC0+ZW5kcG9pbnQpOworICAgIHNpemVfdCBuID0gbSArIChzIC0gc29hcC0+bXNnYnVmKSAtIDUgLSAoIWdldCk7CisgICAgaWYgKG4gPj0gc2l6ZW9mKHNvYXAtPmVuZHBvaW50KSkKKyAgICAgIG4gPSBzaXplb2Yoc29hcC0+ZW5kcG9pbnQpIC0gMTsKKyAgICBzdHJuY3B5KHNvYXAtPnBhdGgsIHNvYXAtPm1zZ2J1ZiArIDQgKyAoIWdldCksIG4gLSBtKTsKKyAgICBzb2FwLT5wYXRoW24gLSBtXSA9ICdcMCc7CisgICAgc3RyY2F0KHNvYXAtPmVuZHBvaW50LCBzb2FwLT5wYXRoKTsKKyAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiVGFyZ2V0IGVuZHBvaW50PSclcydcbiIsIHNvYXAtPmVuZHBvaW50KSk7CisgICAgaWYgKGdldCkKKyAgICB7IHNvYXAtPmVycm9yID0gc29hcC0+ZmdldChzb2FwKTsKKyAgICAgIGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX09LKQorICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfU1RPUDsgLyogcHJldmVudHMgZnVydGhlciBwcm9jZXNzaW5nICovCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIGlmIChzdGF0dXMpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBzdGF0dXM7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgaWYgKGsgPT0gMCB8fCAoayA+PSAyMDAgJiYgayA8PSAyOTkpIHx8IGsgPT0gNDAwIHx8IGsgPT0gNTAwKQorICAgIHJldHVybiBTT0FQX09LOworICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiSFRUUCBlcnJvciAlZFxuIiwgaykpOworICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIkhUVFAgZXJyb3IiLCBzb2FwLT5tc2didWYsIGspOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50CitodHRwX3BhcnNlX2hlYWRlcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWwpCit7IGlmICghc29hcF90YWdfY21wKGtleSwgIkhvc3QiKSkKKyAgeyAKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICBpZiAoc29hcC0+aW1vZGUgJiBTT0FQX0VOQ19TU0wpCisgICAgICBzdHJjcHkoc29hcC0+ZW5kcG9pbnQsICJodHRwczovLyIpOworICAgIGVsc2UKKyNlbmRpZgorICAgICAgc3RyY3B5KHNvYXAtPmVuZHBvaW50LCAiaHR0cDovLyIpOworICAgIHN0cm5jYXQoc29hcC0+ZW5kcG9pbnQsIHZhbCwgc2l6ZW9mKHNvYXAtPmVuZHBvaW50KSAtIDgpOworICAgIHNvYXAtPmVuZHBvaW50W3NpemVvZihzb2FwLT5lbmRwb2ludCkgLSAxXSA9ICdcMCc7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LVR5cGUiKSkKKyAgeyBpZiAoc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwsICJhcHBsaWNhdGlvbi9kaW1lIikpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX0RJTUU7CisgICAgZWxzZSBpZiAoc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwsICJtdWx0aXBhcnQvcmVsYXRlZCIpCisgICAgICAgICAgfHwgc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwsICJtdWx0aXBhcnQvZm9ybS1kYXRhIikpCisgICAgeyBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gc29hcF9zdHJkdXAoc29hcCwgc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwsICJib3VuZGFyeSIpKTsKKyAgICAgIHNvYXAtPm1pbWUuc3RhcnQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCwgInN0YXJ0IikpOworICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19NSU1FOworICAgIH0KKyAgfQorI2VuZGlmCisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1MZW5ndGgiKSkKKyAgICBzb2FwLT5sZW5ndGggPSBzb2FwX3N0cnRvdWwodmFsLCBOVUxMLCAxMCk7CisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1FbmNvZGluZyIpKQorICB7IGlmICghc29hcF90YWdfY21wKHZhbCwgImRlZmxhdGUiKSkKKyNpZmRlZiBXSVRIX1pMSUIKKyAgICAgIHNvYXAtPnpsaWJfaW4gPSBTT0FQX1pMSUJfREVGTEFURTsKKyNlbHNlCisgICAgICByZXR1cm4gU09BUF9aTElCX0VSUk9SOworI2VuZGlmCisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcCh2YWwsICJnemlwIikpCisjaWZkZWYgV0lUSF9HWklQCisgICAgICBzb2FwLT56bGliX2luID0gU09BUF9aTElCX0daSVA7CisjZWxzZQorICAgICAgcmV0dXJuIFNPQVBfWkxJQl9FUlJPUjsKKyNlbmRpZgorICB9CisjaWZkZWYgV0lUSF9aTElCCisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQWNjZXB0LUVuY29kaW5nIikpCisgIHsKKyNpZmRlZiBXSVRIX0daSVAKKyAgICBpZiAoc3RyY2hyKHZhbCwgJyonKSB8fCBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCwgImd6aXAiKSkKKyAgICAgIHNvYXAtPnpsaWJfb3V0ID0gU09BUF9aTElCX0daSVA7CisgICAgZWxzZQorI2VuZGlmCisgICAgaWYgKHN0cmNocih2YWwsICcqJykgfHwgc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwsICJkZWZsYXRlIikpCisgICAgICBzb2FwLT56bGliX291dCA9IFNPQVBfWkxJQl9ERUZMQVRFOworICAgIGVsc2UKKyAgICAgIHNvYXAtPnpsaWJfb3V0ID0gU09BUF9aTElCX05PTkU7CisgIH0KKyNlbmRpZgorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIlRyYW5zZmVyLUVuY29kaW5nIikpCisgIHsgc29hcC0+bW9kZSAmPSB+U09BUF9JTzsKKyAgICBpZiAoIXNvYXBfdGFnX2NtcCh2YWwsICJjaHVua2VkIikpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fQ0hVTks7CisgIH0KKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb25uZWN0aW9uIikpCisgIHsgaWYgKCFzb2FwX3RhZ19jbXAodmFsLCAia2VlcC1hbGl2ZSIpKQorICAgICAgc29hcC0+a2VlcF9hbGl2ZSA9IC1zb2FwLT5rZWVwX2FsaXZlOworICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAodmFsLCAiY2xvc2UiKSkKKyAgICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOworICB9CisjaWZuZGVmIFdJVEhfTEVBTgorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkF1dGhvcml6YXRpb24iKSkKKyAgeyBpZiAoIXNvYXBfdGFnX2NtcCh2YWwsICJCYXNpYyAqIikpCisgICAgeyBpbnQgbjsKKyAgICAgIGNoYXIgKnM7CisgICAgICBzb2FwX2Jhc2U2NDJzKHNvYXAsIHZhbCArIDYsIHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZikgLSAxLCAmbik7CisgICAgICBzb2FwLT50bXBidWZbbl0gPSAnXDAnOworICAgICAgaWYgKChzID0gc3RyY2hyKHNvYXAtPnRtcGJ1ZiwgJzonKSkpCisgICAgICB7ICpzID0gJ1wwJzsKKwlzb2FwLT51c2VyaWQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT50bXBidWYpOworCXNvYXAtPnBhc3N3ZCA9IHNvYXBfc3RyZHVwKHNvYXAsIHMgKyAxKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJXV1ctQXV0aGVudGljYXRlIikpCisgICAgc29hcC0+YXV0aHJlYWxtID0gc29hcF9zdHJkdXAoc29hcCwgc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwgKyA2LCAicmVhbG0iKSk7CisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiRXhwZWN0IikpCisgIHsgaWYgKCFzb2FwX3RhZ19jbXAodmFsLCAiMTAwLWNvbnRpbnVlIikpCisgICAgeyBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkhUVFAvMS4xIDEwMCBDb250aW51ZSIsIE5VTEwpKQorICAgICAgIHx8IChzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsIE5VTEwsIE5VTEwpKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgfQorI2VuZGlmCisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiU09BUEFjdGlvbiIpKQorICB7IGlmICgqdmFsID09ICciJykKKyAgICB7IHNvYXAtPmFjdGlvbiA9IHNvYXBfc3RyZHVwKHNvYXAsIHZhbCArIDEpOworICAgICAgc29hcC0+YWN0aW9uW3N0cmxlbihzb2FwLT5hY3Rpb24pIC0gMV0gPSAnXDAnOworICAgIH0KKyAgfQorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkxvY2F0aW9uIikpCisgIHsgc3RybmNweShzb2FwLT5lbmRwb2ludCwgdmFsLCBzaXplb2Yoc29hcC0+ZW5kcG9pbnQpKTsKKyAgICBzb2FwLT5lbmRwb2ludFtzaXplb2Yoc29hcC0+ZW5kcG9pbnQpIC0gMV0gPSAnXDAnOworICB9CisjaWZkZWYgV0lUSF9DT09LSUVTCisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29va2llIikgfHwgIXNvYXBfdGFnX2NtcChrZXksICJTZXQtQ29va2llIikpCisgICAgc29hcF9nZXRjb29raWVzKHNvYXAsIHZhbCk7CisjZW5kaWYKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmICFkZWZpbmVkKFdJVEhfTk9IVFRQKSB8fCAhZGVmaW5lZChXSVRIX0xFQU5FUikKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbGluZSwgY29uc3QgY2hhciAqa2V5KQoreyByZWdpc3RlciBjb25zdCBjaGFyICpzID0gbGluZTsKKyAgaWYgKHMpCisgIHsgd2hpbGUgKCpzKQorICAgIHsgcmVnaXN0ZXIgc2hvcnQgZmxhZzsKKyAgICAgIHMgPSBzb2FwX2RlY29kZV9rZXkoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgcyk7CisgICAgICBmbGFnID0gc29hcF90YWdfY21wKHNvYXAtPnRtcGJ1Ziwga2V5KTsKKyAgICAgIHMgPSBzb2FwX2RlY29kZV92YWwoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgcyk7CisgICAgICBpZiAoIWZsYWcpCisgICAgICAgIHJldHVybiBzb2FwLT50bXBidWY7CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAhZGVmaW5lZChXSVRIX05PSFRUUCkgfHwgIWRlZmluZWQoV0lUSF9MRUFORVIpCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZGVjb2RlX2tleShjaGFyICpidWYsIHNpemVfdCBsZW4sIGNvbnN0IGNoYXIgKnZhbCkKK3sgcmV0dXJuIHNvYXBfZGVjb2RlKGJ1ZiwgbGVuLCB2YWwsICI9LDsiKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgIWRlZmluZWQoV0lUSF9OT0hUVFApIHx8ICFkZWZpbmVkKFdJVEhfTEVBTkVSKQorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2RlY29kZV92YWwoY2hhciAqYnVmLCBzaXplX3QgbGVuLCBjb25zdCBjaGFyICp2YWwpCit7IGlmICgqdmFsICE9ICc9JykKKyAgeyAqYnVmID0gJ1wwJzsKKyAgICByZXR1cm4gdmFsOworICB9CisgIHJldHVybiBzb2FwX2RlY29kZShidWYsIGxlbiwgdmFsICsgMSwgIiw7Iik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmICFkZWZpbmVkKFdJVEhfTk9IVFRQKSB8fCAhZGVmaW5lZChXSVRIX0xFQU5FUikKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY29uc3QgY2hhcioKK3NvYXBfZGVjb2RlKGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwgY29uc3QgY2hhciAqdmFsLCBjb25zdCBjaGFyICpzZXApCit7IGNvbnN0IGNoYXIgKnM7CisgIGNoYXIgKnQgPSBidWY7CisgIGZvciAocyA9IHZhbDsgKnM7IHMrKykKKyAgICBpZiAoKnMgIT0gJyAnICYmICpzICE9ICdcdCcgJiYgIXN0cmNocihzZXAsICpzKSkKKyAgICAgIGJyZWFrOworICBpZiAoKnMgPT0gJyInKQorICB7IHMrKzsKKyAgICB3aGlsZSAoKnMgJiYgKnMgIT0gJyInICYmIC0tbGVuKQorICAgICAgKnQrKyA9ICpzKys7CisgIH0KKyAgZWxzZQorICB7IHdoaWxlIChzb2FwX25vdGJsYW5rKCpzKSAmJiAhc3RyY2hyKHNlcCwgKnMpICYmIC0tbGVuKQorICAgIHsgaWYgKCpzID09ICclJykKKyAgICAgIHsgKnQrKyA9ICgoc1sxXSA+PSAnQScgPyAoc1sxXSAmIDB4NykgKyA5IDogc1sxXSAtICcwJykgPDwgNCkKKyAgICAgICAgICAgICAgKyAoc1syXSA+PSAnQScgPyAoc1syXSAmIDB4NykgKyA5IDogc1syXSAtICcwJyk7CisgICAgICAgIHMgKz0gMzsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgKnQrKyA9ICpzKys7CisgICAgfQorICB9CisgICp0ID0gJ1wwJzsKKyAgd2hpbGUgKCpzICYmICFzdHJjaHIoc2VwLCAqcykpCisgICAgcysrOworICByZXR1cm4gczsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VudmVsb3BlX2JlZ2luX291dChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc2l6ZV90IG4gPSAwOworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKSAmJiBzb2FwLT5taW1lLmJvdW5kYXJ5ICYmIHNvYXAtPm1pbWUuc3RhcnQpCisgIHsgY29uc3QgY2hhciAqczsKKyAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKSkKKyAgICAgIHMgPSAiYXBwbGljYXRpb24vZGltZSI7CisgICAgZWxzZSBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICAgICAgcyA9ICJhcHBsaWNhdGlvbi9zb2FwK3htbDsgY2hhcnNldD11dGYtOCI7CisgICAgZWxzZQorICAgICAgcyA9ICJ0ZXh0L3htbDsgY2hhcnNldD11dGYtOCI7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICItLSVzXHJcbkNvbnRlbnQtVHlwZTogJXNcclxuQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmluYXJ5XHJcbkNvbnRlbnQtSUQ6ICVzXHJcblxyXG4iLCBzb2FwLT5taW1lLmJvdW5kYXJ5LCBzLCBzb2FwLT5taW1lLnN0YXJ0KTsKKyAgICBuID0gc3RybGVuKHNvYXAtPnRtcGJ1Zik7CisgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgc29hcC0+dG1wYnVmLCBuKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICAgIHNvYXAtPmRpbWUuc2l6ZSA9IHNvYXAtPmNvdW50OwkvKiBESU1FIGluIE1JTUUgY29ycmVjdGlvbiAqLworICBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpICYmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkpCisgIHsgaWYgKHNvYXBfcHV0ZGltZWhkcihzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorI2VuZGlmCisgIHNvYXAtPnBhcnQgPSBTT0FQX0lOX0VOVkVMT1BFOworICByZXR1cm4gc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCAiU09BUC1FTlY6RW52ZWxvcGUiLCAwLCBOVUxMKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbnZlbG9wZV9lbmRfb3V0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgIlNPQVAtRU5WOkVudmVsb3BlIikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKSkKKyAgeyBzb2FwLT5kaW1lLnNpemUgPSBzb2FwLT5jb3VudCAtIHNvYXAtPmRpbWUuc2l6ZTsJLyogRElNRSBpbiBNSU1FIGNvcnJlY3Rpb24gKi8KKyAgICBzcHJpbnRmKHNvYXAtPmlkLCBzb2FwLT5kaW1lX2lkX2Zvcm1hdCwgMCk7CisgICAgc29hcC0+ZGltZS5pZCA9IHNvYXAtPmlkOworICAgIGlmIChzb2FwLT5sb2NhbF9uYW1lc3BhY2VzKQorICAgIHsgaWYgKHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbMF0ub3V0KQorICAgICAgICBzb2FwLT5kaW1lLnR5cGUgPSAoY2hhciopc29hcC0+bG9jYWxfbmFtZXNwYWNlc1swXS5vdXQ7CisgICAgICBlbHNlCisgICAgICAgIHNvYXAtPmRpbWUudHlwZSA9IChjaGFyKilzb2FwLT5sb2NhbF9uYW1lc3BhY2VzWzBdLm5zOworICAgIH0KKyAgICBzb2FwLT5kaW1lLm9wdGlvbnMgPSBOVUxMOworICAgIHNvYXAtPmRpbWUuZmxhZ3MgPSBTT0FQX0RJTUVfTUIgfCBTT0FQX0RJTUVfQUJTVVJJOworICAgIGlmICghc29hcC0+ZGltZS5maXJzdCkKKyAgICAgIHNvYXAtPmRpbWUuZmxhZ3MgfD0gU09BUF9ESU1FX01FOworICAgIHNvYXAtPmNvdW50ICs9IDEyICsgKChzdHJsZW4oc29hcC0+ZGltZS5pZCkrMykmKH4zKSkgKyAoKHN0cmxlbihzb2FwLT5kaW1lLnR5cGUpKzMpJih+MykpOworICB9CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpICYmICEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pKQorICAgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsIFNPQVBfU1RSX1BBRERJTkcsIC0obG9uZylzb2FwLT5kaW1lLnNpemUmMyk7CisjZW5kaWYKKyAgc29hcC0+cGFydCA9IFNPQVBfRU5EX0VOVkVMT1BFOworICByZXR1cm4gU09BUF9PSzsKK30gCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW52ZWxvcGVfYmVnaW5faW4oc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHN0cnVjdCBOYW1lc3BhY2UgKnA7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0lOX0VOVkVMT1BFOworICBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsICJTT0FQLUVOVjpFbnZlbG9wZSIsIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfVkVSU0lPTk1JU01BVENIOworICBwID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlczsKKyAgaWYgKHApCisgIHsgY29uc3QgY2hhciAqbnMgPSBwWzBdLm91dDsKKyAgICBpZiAoIW5zKQorICAgICAgbnMgPSBwWzBdLm5zOworICAgIGlmICghc3RyY21wKG5zLCBzb2FwX2VudjEpKQorICAgIHsgc29hcC0+dmVyc2lvbiA9IDE7IC8qIG1ha2Ugc3VyZSB3ZSB1c2UgU09BUCAxLjEgKi8KKyAgICAgIGlmIChwWzFdLm91dCkKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHBbMV0ub3V0KTsKKyAgICAgIGlmICgocFsxXS5vdXQgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHNvYXBfZW5jMSkpKSkKKyAgICAgICAgc3RyY3B5KHBbMV0ub3V0LCBzb2FwX2VuYzEpOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKG5zLCBzb2FwX2VudjIpKQorICAgIHsgc29hcC0+dmVyc2lvbiA9IDI7IC8qIG1ha2Ugc3VyZSB3ZSB1c2UgU09BUCAxLjIgKi8KKyAgICAgIGlmIChwWzFdLm91dCkKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHBbMV0ub3V0KTsKKyAgICAgIGlmICgocFsxXS5vdXQgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHNvYXBfZW5jMikpKSkKKyAgICAgICAgc3RyY3B5KHBbMV0ub3V0LCBzb2FwX2VuYzIpOworICAgIH0KKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbnZlbG9wZV9lbmRfaW4oc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPnBhcnQgPSBTT0FQX0VORF9FTlZFTE9QRTsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgIlNPQVAtRU5WOkVudmVsb3BlIik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYm9keV9iZWdpbl9vdXQoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPnBhcnQgPSBTT0FQX0lOX0JPRFk7CisgIGlmIChzb2FwLT52ZXJzaW9uID09IDEpCisgICAgc29hcC0+ZW5jb2RpbmcgPSAxOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU0VDKSAmJiBzb2FwX3NldF9hdHRyKHNvYXAsICJ3c3U6SWQiLCAiQm9keSIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNlbmRpZgorICBpZiAoc29hcF9lbGVtZW50KHNvYXAsICJTT0FQLUVOVjpCb2R5IiwgMCwgTlVMTCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X3N0YXJ0X2VuZF9vdXQoc29hcCwgTlVMTCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYm9keV9lbmRfb3V0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgIlNPQVAtRU5WOkJvZHkiKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0VORF9CT0RZOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9ib2R5X2JlZ2luX2luKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5wYXJ0ID0gU09BUF9JTl9CT0RZOworICBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsICJTT0FQLUVOVjpCb2R5IiwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoIXNvYXAtPmJvZHkpCisgICAgc29hcC0+cGFydCA9IFNPQVBfTk9fQk9EWTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYm9keV9lbmRfaW4oc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwLT5wYXJ0ID09IFNPQVBfTk9fQk9EWSkKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgc29hcC0+cGFydCA9IFNPQVBfRU5EX0JPRFk7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsICJTT0FQLUVOVjpCb2R5Iik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVjdl9oZWFkZXIoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwX2dldGhlYWRlcihzb2FwKSAmJiBzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2VuZHBvaW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICplbmRwb2ludCkKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKKyAgcmVnaXN0ZXIgc2l6ZV90IGksIG47CisgIHNvYXAtPmVuZHBvaW50WzBdID0gJ1wwJzsKKyAgc29hcC0+aG9zdFswXSA9ICdcMCc7CisgIHNvYXAtPnBhdGhbMF0gPSAnLyc7CisgIHNvYXAtPnBhdGhbMV0gPSAnXDAnOworICBzb2FwLT5wb3J0ID0gODA7CisgIGlmICghZW5kcG9pbnQgfHwgISplbmRwb2ludCkKKyAgICByZXR1cm47CisgIGlmICghc3RybmNtcChlbmRwb2ludCwgImh0dHBzOiIsIDYpKQorICAgIHNvYXAtPnBvcnQgPSA0NDM7CisgIHN0cm5jcHkoc29hcC0+ZW5kcG9pbnQsIGVuZHBvaW50LCBzaXplb2Yoc29hcC0+ZW5kcG9pbnQpIC0gMSk7CisgIHMgPSBzdHJjaHIoZW5kcG9pbnQsICc6Jyk7CisgIGlmIChzICYmIHNbMV0gPT0gJy8nICYmIHNbMl0gPT0gJy8nKQorICAgIHMgKz0gMzsKKyAgZWxzZQorICAgIHMgPSBlbmRwb2ludDsKKyAgbiA9IHN0cmxlbihzKTsKKyAgaWYgKG4gPj0gc2l6ZW9mKHNvYXAtPmhvc3QpKQorICAgIG4gPSBzaXplb2Yoc29hcC0+aG9zdCkgLSAxOworI2lmZGVmIFdJVEhfSVBWNgorICBpZiAoc1swXSA9PSAnWycpCisgIHsgcysrOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgeyBzb2FwLT5ob3N0W2ldID0gc1tpXTsKKyAgICAgIGlmIChzW2ldID09ICddJykKKyAgICAgIHsgcysrOworICAgICAgICBicmVhazsgCisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyAgeyBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIHsgc29hcC0+aG9zdFtpXSA9IHNbaV07CisgICAgICBpZiAoc1tpXSA9PSAnLycgfHwgc1tpXSA9PSAnOicpCisgICAgICAgIGJyZWFrOyAKKyAgICB9CisgIH0KKyNlbHNlCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgIHsgc29hcC0+aG9zdFtpXSA9IHNbaV07CisgICAgaWYgKHNbaV0gPT0gJy8nIHx8IHNbaV0gPT0gJzonKQorICAgICAgYnJlYWs7IAorICB9CisjZW5kaWYKKyAgc29hcC0+aG9zdFtpXSA9ICdcMCc7CisgIGlmIChzW2ldID09ICc6JykKKyAgeyBzb2FwLT5wb3J0ID0gKGludClhdG9sKHMgKyBpICsgMSk7CisgICAgZm9yIChpKys7IGkgPCBuOyBpKyspCisgICAgICBpZiAoc1tpXSA9PSAnLycpCisgICAgICAgIGJyZWFrOworICB9CisgIGlmIChzW2ldKQorICB7IHN0cm5jcHkoc29hcC0+cGF0aCwgcyArIGksIHNpemVvZihzb2FwLT5wYXRoKSk7CisgICAgc29hcC0+cGF0aFtzaXplb2Yoc29hcC0+cGF0aCkgLSAxXSA9ICdcMCc7CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9jb25uZWN0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICplbmRwb2ludCwgY29uc3QgY2hhciAqYWN0aW9uKQoreyByZXR1cm4gc29hcF9jb25uZWN0X2NvbW1hbmQoc29hcCwgU09BUF9QT1NULCBlbmRwb2ludCwgYWN0aW9uKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9jb25uZWN0X2NvbW1hbmQoc3RydWN0IHNvYXAgKnNvYXAsIGludCBodHRwX2NvbW1hbmQsIGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjb25zdCBjaGFyICphY3Rpb24pCit7IGNoYXIgaG9zdFtzaXplb2Yoc29hcC0+aG9zdCldOworICBpbnQgcG9ydDsKKyAgc2l6ZV90IGNvdW50OworICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIHN0cmNweShob3N0LCBzb2FwLT5ob3N0KTsgLyogc2F2ZSB0byBjb21wYXJlICovCisgIHBvcnQgPSBzb2FwLT5wb3J0OyAvKiBzYXZlIHRvIGNvbXBhcmUgKi8KKyAgc29hcF9zZXRfZW5kcG9pbnQoc29hcCwgZW5kcG9pbnQpOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+ZmNvbm5lY3QpCisgIHsgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZjb25uZWN0KHNvYXAsIGVuZHBvaW50LCBzb2FwLT5ob3N0LCBzb2FwLT5wb3J0KSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgZWxzZQorI2VuZGlmCisgIGlmIChzb2FwLT5mb3BlbiAmJiAqc29hcC0+aG9zdCkKKyAgeyBzb2FwLT5zdGF0dXMgPSBodHRwX2NvbW1hbmQ7CisgICAgaWYgKCFzb2FwLT5rZWVwX2FsaXZlIHx8ICFzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpIHx8IHN0cmNtcChzb2FwLT5ob3N0LCBob3N0KSB8fCBzb2FwLT5wb3J0ICE9IHBvcnQgfHwgIXNvYXAtPmZwb2xsIHx8IHNvYXAtPmZwb2xsKHNvYXApKQorICAgIHsgc29hcC0+a2VlcF9hbGl2ZSA9IDA7IC8qIHRvIGZvcmNlIGNsb3NlICovCisgICAgICBzb2FwLT5vbW9kZSAmPSB+U09BUF9JT19VRFA7IC8qIHRvIGZvcmNlIGNsb3NlICovCisgICAgICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJDb25uZWN0L3JlY29ubmVjdCB0byBob3N0PSclcycgcGF0aD0nJXMnIHBvcnQ9JWRcbiIsIHNvYXAtPmhvc3QsIHNvYXAtPnBhdGgsIHNvYXAtPnBvcnQpKTsKKyNpZmRlZiBXSVRIX1VEUAorICAgICAgaWYgKCFzdHJuY21wKGVuZHBvaW50LCAic29hcC51ZHA6IiwgOSkpCisgICAgICAgIHNvYXAtPm9tb2RlIHw9IFNPQVBfSU9fVURQOworI2VuZGlmCisgICAgICBzb2FwLT5zb2NrZXQgPSBzb2FwLT5mb3Blbihzb2FwLCBlbmRwb2ludCwgc29hcC0+aG9zdCwgc29hcC0+cG9ydCk7CisgICAgICBpZiAoc29hcC0+ZXJyb3IpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19LRUVQQUxJVkUpICE9IDApOworICAgIH0KKyAgfQorICBjb3VudCA9IHNvYXBfY291bnRfYXR0YWNobWVudHMoc29hcCk7CisgIGlmIChzb2FwX2JlZ2luX3NlbmQoc29hcCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmbmRlZiBXSVRIX05PSFRUUAorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSAhPSBTT0FQX0lPX1NUT1JFICYmICEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1hNTCkgJiYgZW5kcG9pbnQpCisgIHsgdW5zaWduZWQgaW50IGsgPSBzb2FwLT5tb2RlOworICAgIHNvYXAtPm1vZGUgJj0gfihTT0FQX0lPIHwgU09BUF9FTkNfWkxJQik7CisgICAgaWYgKChrICYgU09BUF9JTykgIT0gU09BUF9JT19GTFVTSCkKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19CVUZGRVI7CisgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0KHNvYXAsIGVuZHBvaW50LCBzb2FwLT5ob3N0LCBzb2FwLT5wb3J0LCBzb2FwLT5wYXRoLCBhY3Rpb24sIGNvdW50KSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgICAgaWYgKChrICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgICB7IGlmIChzb2FwX2ZsdXNoKHNvYXApKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorI2VuZGlmCisgICAgc29hcC0+bW9kZSA9IGs7CisgIH0KKyAgZWxzZSBpZiAoYWN0aW9uKQorICAgIHNvYXAtPmFjdGlvbiA9IHNvYXBfc3RyZHVwKHNvYXAsIGFjdGlvbik7CisgIGlmIChodHRwX2NvbW1hbmQgIT0gU09BUF9QT1NUKQorICAgIHJldHVybiBzb2FwX2VuZF9zZW5kKHNvYXApOworI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfczJiYXNlNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMsIGNoYXIgKnQsIGludCBuKQoreyByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBtOworICByZWdpc3RlciBjaGFyICpwOworICBpZiAoIXQpCisgICAgdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCAobiArIDIpIC8gMyAqIDQgKyAxKTsKKyAgaWYgKCF0KQorICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcCA9IHQ7CisgIHRbMF0gPSAnXDAnOworICBpZiAoIXMpCisgICAgcmV0dXJuIHA7CisgIGZvciAoOyBuID4gMjsgbiAtPSAzLCBzICs9IDMpCisgIHsgbSA9IHNbMF07CisgICAgbSA9IChtIDw8IDgpIHwgc1sxXTsKKyAgICBtID0gKG0gPDwgOCkgfCBzWzJdOworICAgIGZvciAoaSA9IDQ7IGkgPiAwOyBtID4+PSA2KQorICAgICAgdFstLWldID0gc29hcF9iYXNlNjRvW20gJiAweDNGXTsKKyAgICB0ICs9IDQ7CisgIH0KKyAgdFswXSA9ICdcMCc7CisgIGlmIChuID4gMCkKKyAgeyBtID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgbSA9IChtIDw8IDgpIHwgKnMrKzsKKyAgICBmb3IgKDsgaSA8IDM7IGkrKykKKyAgICAgIG0gPDw9IDg7CisgICAgZm9yIChpKys7IGkgPiAwOyBtID4+PSA2KQorICAgICAgdFstLWldID0gc29hcF9iYXNlNjRvW20gJiAweDNGXTsKKyAgICBmb3IgKGkgPSAzOyBpID4gbjsgaS0tKQorICAgICAgdFtpXSA9ICc9JzsKKyAgICB0WzRdID0gJ1wwJzsKKyAgfQorICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2Jhc2U2NDJzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBjaGFyICp0LCBzaXplX3QgbCwgaW50ICpuKQoreyByZWdpc3RlciBpbnQgaSwgaiwgYzsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBtOworICByZWdpc3RlciBjb25zdCBjaGFyICpwOworICBpZiAoIXMgfHwgISpzKQorICB7IGlmIChuKQorICAgICAgKm4gPSAwOworICAgIGlmIChzb2FwLT5lcnJvcikKKyAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBTT0FQX05PTl9OVUxMOworICB9CisgIGlmICghdCkKKyAgeyBsID0gKHN0cmxlbihzKSArIDMpIC8gNCAqIDM7CisgICAgdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBsKTsKKyAgfQorICBpZiAoIXQpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwID0gdDsKKyAgaWYgKG4pCisgICAgKm4gPSAwOworICBmb3IgKDs7KQorICB7IGZvciAoaSA9IDA7IGkgPCBTT0FQX0JMS0xFTjsgaSsrKQorICAgIHsgbSA9IDA7CisgICAgICBqID0gMDsKKyAgICAgIHdoaWxlIChqIDwgNCkKKyAgICAgIHsgYyA9ICpzKys7CisgICAgICAgIGlmIChjID09ICc9JyB8fCAhYykKKyAgICAgICAgeyBpICo9IDM7CisgICAgICAgICAgc3dpdGNoIChqKQorICAgICAgICAgIHsgY2FzZSAyOgorICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKChtID4+IDQpICYgMHhGRik7CisgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoKG0gPj4gMTApICYgMHhGRik7CisgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoKG0gPj4gMikgJiAweEZGKTsKKyAgICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobikKKwkgICAgKm4gKz0gaTsKKyAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgfQorICAgICAgICBjIC09ICcrJzsKKyAgICAgICAgaWYgKGMgPj0gMCAmJiBjIDw9IDc5KQorICAgICAgICB7IG0gPSAobSA8PCA2KSArIHNvYXBfYmFzZTY0aVtjXTsKKyAgICAgICAgICBqKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICp0KysgPSAoY2hhcikoKG0gPj4gMTYpICYgMHhGRik7CisgICAgICAqdCsrID0gKGNoYXIpKChtID4+IDgpICYgMHhGRik7CisgICAgICAqdCsrID0gKGNoYXIpKG0gJiAweEZGKTsKKyAgICAgIGlmIChsIDwgMykKKyAgICAgIHsgaWYgKG4pCisJICAqbiArPSBpOworICAgICAgICByZXR1cm4gcDsKKyAgICAgIH0KKyAgICAgIGwgLT0gMzsKKyAgICB9CisgICAgaWYgKG4pCisgICAgICAqbiArPSAzICogU09BUF9CTEtMRU47CisgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2NoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3MyaGV4KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzLCBjaGFyICp0LCBpbnQgbikKK3sgcmVnaXN0ZXIgY2hhciAqcDsKKyAgaWYgKCF0KQorICAgIHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgMiAqIG4gKyAxKTsKKyAgaWYgKCF0KQorICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcCA9IHQ7CisgIHRbMF0gPSAnXDAnOworICBpZiAocykKKyAgeyBmb3IgKDsgbiA+IDA7IG4tLSkKKyAgICB7IHJlZ2lzdGVyIGludCBtID0gKnMrKzsKKyAgICAgICp0KysgPSAoY2hhcikoKG0gPj4gNCkgKyAobSA+IDE1OSA/ICdhJyAtIDEwIDogJzAnKSk7CisgICAgICBtICY9IDB4MEY7CisgICAgICAqdCsrID0gKGNoYXIpKG0gKyAobSA+IDkgPyAnYScgLSAxMCA6ICcwJykpOworICAgIH0KKyAgfQorICAqdCsrID0gJ1wwJzsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9oZXgycyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgY2hhciAqdCwgc2l6ZV90IGwsIGludCAqbikKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqcDsKKyAgaWYgKCFzIHx8ICEqcykKKyAgeyBpZiAobikKKyAgICAgICpuID0gMDsKKyAgICBpZiAoc29hcC0+ZXJyb3IpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gU09BUF9OT05fTlVMTDsKKyAgfQorICBpZiAoIXQpCisgIHsgbCA9IHN0cmxlbihzKSAvIDI7CisgICAgdCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBsKTsKKyAgfQorICBpZiAoIXQpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwID0gdDsKKyAgd2hpbGUgKGwpCisgIHsgcmVnaXN0ZXIgaW50IGQxLCBkMjsKKyAgICBkMSA9ICpzKys7CisgICAgaWYgKCFkMSkKKyAgICAgIGJyZWFrOworICAgIGQyID0gKnMrKzsKKyAgICBpZiAoIWQyKQorICAgICAgYnJlYWs7CisgICAgKnQrKyA9ICgoZDEgPj0gJ0EnID8gKGQxICYgMHg3KSArIDkgOiBkMSAtICcwJykgPDwgNCkgKyAoZDIgPj0gJ0EnID8gKGQyICYgMHg3KSArIDkgOiBkMiAtICcwJyk7CisgICAgbC0tOworICB9CisgIGlmIChuKQorICAgICpuID0gdCAtIHA7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dGh0dHBoZHIoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdGF0dXMsIHNpemVfdCBjb3VudCkKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqcyA9IE5VTEw7CisgIHJlZ2lzdGVyIGludCBlcnIgPSBTT0FQX09LOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICByZWdpc3RlciBjb25zdCBjaGFyICpyID0gTlVMTDsKKyNlbmRpZgorICBpZiAoc3RhdHVzID09IFNPQVBfRklMRSAmJiBzb2FwLT5odHRwX2NvbnRlbnQpCisgICAgcyA9IHNvYXAtPmh0dHBfY29udGVudDsKKyAgZWxzZSBpZiAoc3RhdHVzID09IFNPQVBfSFRNTCkKKyAgICBzID0gInRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI7CisgIGVsc2UgaWYgKGNvdW50IHx8ICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspKQorICB7IGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgICAgICBzID0gImFwcGxpY2F0aW9uL3NvYXAreG1sOyBjaGFyc2V0PXV0Zi04IjsKKyAgICBlbHNlCisgICAgICBzID0gInRleHQveG1sOyBjaGFyc2V0PXV0Zi04IjsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+bW9kZSAmIChTT0FQX0VOQ19ESU1FIHwgU09BUF9FTkNfTVRPTSkpCisgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKQorICAgIHsgciA9IHM7CisgICAgICBzID0gImFwcGxpY2F0aW9uL3hvcCt4bWw7IGNoYXJzZXQ9dXRmLTgiOworICAgIH0KKyAgICBlbHNlCisgICAgICBzID0gImFwcGxpY2F0aW9uL2RpbWUiOworICB9CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01JTUUpICYmIHNvYXAtPm1pbWUuYm91bmRhcnkgJiYgc29hcC0+c3RhdHVzICE9IFNPQVBfR0VUKQorICB7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnQgPSBzdHJjaHIocywgJzsnKTsKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIm11bHRpcGFydC9yZWxhdGVkOyBib3VuZGFyeT1cIiVzXCI7IHR5cGU9XCIiLCBzb2FwLT5taW1lLmJvdW5kYXJ5KTsKKyAgICBpZiAodCkKKyAgICAgIHN0cm5jYXQoc29hcC0+dG1wYnVmLCBzLCB0IC0gcyk7CisgICAgZWxzZQorICAgICAgc3RyY2F0KHNvYXAtPnRtcGJ1Ziwgcyk7CisgICAgaWYgKHNvYXAtPm1pbWUuc3RhcnQpCisgICAgeyBzdHJjYXQoc29hcC0+dG1wYnVmLCAiXCI7IHN0YXJ0PVwiIik7CisgICAgICBzdHJjYXQoc29hcC0+dG1wYnVmLCBzb2FwLT5taW1lLnN0YXJ0KTsKKyAgICB9CisgICAgc3RyY2F0KHNvYXAtPnRtcGJ1ZiwgIlwiIik7CisgICAgaWYgKHIpCisgICAgeyBzdHJjYXQoc29hcC0+dG1wYnVmLCAiOyBzdGFydC1pbmZvPVwiIik7CisgICAgICBzdHJjYXQoc29hcC0+dG1wYnVmLCByKTsKKyAgICAgIHN0cmNhdChzb2FwLT50bXBidWYsICJcIiIpOworICAgIH0KKyAgICBzID0gc29hcC0+dG1wYnVmOworICB9CisjZW5kaWYKKyAgaWYgKHMgJiYgKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJDb250ZW50LVR5cGUiLCBzKSkpCisgICAgcmV0dXJuIGVycjsKKyNpZmRlZiBXSVRIX1pMSUIKKyAgaWYgKHNvYXAtPm9tb2RlICYgU09BUF9FTkNfWkxJQikKKyAgeworI2lmZGVmIFdJVEhfR1pJUAorICAgIGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJDb250ZW50LUVuY29kaW5nIiwgImd6aXAiKTsKKyNlbHNlCisgICAgZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkNvbnRlbnQtRW5jb2RpbmciLCAiZGVmbGF0ZSIpOworI2VuZGlmCisgICAgaWYgKGVycikKKyAgICAgIHJldHVybiBlcnI7CisgIH0KKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgICBlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiVHJhbnNmZXItRW5jb2RpbmciLCAiY2h1bmtlZCIpOworICBlbHNlCisjZW5kaWYKKyAgaWYgKHNvYXAtPnN0YXR1cyAhPSBTT0FQX0dFVCkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIiVsdSIsICh1bnNpZ25lZCBsb25nKWNvdW50KTsKKyAgICBlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQ29udGVudC1MZW5ndGgiLCBzb2FwLT50bXBidWYpOworICB9CisgIGlmIChlcnIpCisgICAgcmV0dXJuIGVycjsKKyAgcmV0dXJuIHNvYXAtPmZwb3N0aGRyKHNvYXAsICJDb25uZWN0aW9uIiwgc29hcC0+a2VlcF9hbGl2ZSA/ICJrZWVwLWFsaXZlIiA6ICJjbG9zZSIpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50CitodHRwX2dldChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmV0dXJuIFNPQVBfR0VUX01FVEhPRDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAoraHR0cF9wb3N0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICplbmRwb2ludCwgY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQsIGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmFjdGlvbiwgc2l6ZV90IGNvdW50KQoreyByZWdpc3RlciBjb25zdCBjaGFyICpzOworICByZWdpc3RlciBpbnQgZXJyOworICBpZiAoc29hcC0+c3RhdHVzID09IFNPQVBfR0VUKQorICAgIHMgPSAiR0VUIjsKKyAgZWxzZQorICAgIHMgPSAiUE9TVCI7CisjaWZkZWYgUEFMTQorICBpZiAoIWVuZHBvaW50IHx8IChzdHJuY21wKGVuZHBvaW50LCAiaHR0cDoiLCA1KSAmJiBzdHJuY21wKGVuZHBvaW50LCAiaHR0cHM6IiwgNikgJiYgc3RybmNtcChlbmRwb2ludCwgImh0dHBnOiIsIDYpKSAmJiBzdHJuY21wKGVuZHBvaW50LCAiX2JlYW06IiwgNikgJiYgc3RybmNtcChlbmRwb2ludCwgIl9sb2NhbDoiLCA3KSAmJiBzdHJuY21wKGVuZHBvaW50LCAiX2J0b2JleDoiLCA4KSkKKyNlbHNlCisgIGlmICghZW5kcG9pbnQgfHwgKHN0cm5jbXAoZW5kcG9pbnQsICJodHRwOiIsIDUpICYmIHN0cm5jbXAoZW5kcG9pbnQsICJodHRwczoiLCA2KSAmJiBzdHJuY21wKGVuZHBvaW50LCAiaHR0cGc6IiwgNikpKQorI2VuZGlmCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIGlmIChzb2FwLT5wcm94eV9ob3N0ICYmIHN0cm5jbXAoZW5kcG9pbnQsICJodHRwczoiLCA2KSkKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIiVzICVzIEhUVFAvJXMiLCBzLCBlbmRwb2ludCwgc29hcC0+aHR0cF92ZXJzaW9uKTsKKyAgZWxzZQorICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiJXMgLyVzIEhUVFAvJXMiLCBzLCAoKnBhdGggPT0gJy8nID8gcGF0aCArIDEgOiBwYXRoKSwgc29hcC0+aHR0cF92ZXJzaW9uKTsKKyAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCBzb2FwLT50bXBidWYsIE5VTEwpKSkKKyAgICByZXR1cm4gZXJyOworICBpZiAocG9ydCAhPSA4MCkKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIiVzOiVkIiwgaG9zdCwgcG9ydCk7CisgIGVsc2UKKyAgICBzdHJjcHkoc29hcC0+dG1wYnVmLCBob3N0KTsgCisgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkhvc3QiLCBzb2FwLT50bXBidWYpKQorICAgfHwgKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJVc2VyLUFnZW50IiwgImdTT0FQLzIuNyIpKQorICAgfHwgKGVyciA9IHNvYXBfcHV0aHR0cGhkcihzb2FwLCBTT0FQX09LLCBjb3VudCkpKQorICAgIHJldHVybiBlcnI7CisjaWZkZWYgV0lUSF9aTElCCisjaWZkZWYgV0lUSF9HWklQCisgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkFjY2VwdC1FbmNvZGluZyIsICJnemlwLCBkZWZsYXRlIikpKQorI2Vsc2UKKyAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQWNjZXB0LUVuY29kaW5nIiwgImRlZmxhdGUiKSkpCisjZW5kaWYKKyAgICByZXR1cm4gZXJyOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+dXNlcmlkICYmIHNvYXAtPnBhc3N3ZCAmJiBzdHJsZW4oc29hcC0+dXNlcmlkKSArIHN0cmxlbihzb2FwLT5wYXNzd2QpIDwgNzYxKQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmICsgMjYyLCAiJXM6JXMiLCBzb2FwLT51c2VyaWQsIHNvYXAtPnBhc3N3ZCk7CisgICAgc3RyY3B5KHNvYXAtPnRtcGJ1ZiwgIkJhc2ljICIpOworICAgIHNvYXBfczJiYXNlNjQoc29hcCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKShzb2FwLT50bXBidWYgKyAyNjIpLCBzb2FwLT50bXBidWYgKyA2LCBzdHJsZW4oc29hcC0+dG1wYnVmICsgMjYyKSk7CisgICAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQXV0aG9yaXphdGlvbiIsIHNvYXAtPnRtcGJ1ZikpKQorICAgICAgcmV0dXJuIGVycjsKKyAgfQorICBpZiAoc29hcC0+cHJveHlfdXNlcmlkICYmIHNvYXAtPnByb3h5X3Bhc3N3ZCAmJiBzdHJsZW4oc29hcC0+cHJveHlfdXNlcmlkKSArIHN0cmxlbihzb2FwLT5wcm94eV9wYXNzd2QpIDwgNzYxKQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmICsgMjYyLCAiJXM6JXMiLCBzb2FwLT5wcm94eV91c2VyaWQsIHNvYXAtPnByb3h5X3Bhc3N3ZCk7CisgICAgc3RyY3B5KHNvYXAtPnRtcGJ1ZiwgIkJhc2ljICIpOworICAgIHNvYXBfczJiYXNlNjQoc29hcCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKShzb2FwLT50bXBidWYgKyAyNjIpLCBzb2FwLT50bXBidWYgKyA2LCBzdHJsZW4oc29hcC0+dG1wYnVmICsgMjYyKSk7CisgICAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiUHJveHktQXV0aG9yaXphdGlvbiIsIHNvYXAtPnRtcGJ1ZikpKQorICAgICAgcmV0dXJuIGVycjsKKyAgfQorI2VuZGlmCisjaWZkZWYgV0lUSF9DT09LSUVTCisjaWZkZWYgV0lUSF9PUEVOU1NMCisgIGlmIChzb2FwX3B1dGNvb2tpZXMoc29hcCwgaG9zdCwgcGF0aCwgc29hcC0+c3NsICE9IE5VTEwpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNlbHNlCisgIGlmIChzb2FwX3B1dGNvb2tpZXMoc29hcCwgaG9zdCwgcGF0aCwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2VuZGlmCisjZW5kaWYKKyAgaWYgKGFjdGlvbiAmJiBzb2FwLT52ZXJzaW9uID09IDEpCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJcIiVzXCIiLCBhY3Rpb24pOworICAgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlNPQVBBY3Rpb24iLCBzb2FwLT50bXBidWYpKSkKKyAgICAgIHJldHVybiBlcnI7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmZwb3N0aGRyKHNvYXAsIE5VTEwsIE5VTEwpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50CitodHRwX3NlbmRfaGVhZGVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzKQoreyByZWdpc3RlciBjb25zdCBjaGFyICp0OworICBkbworICB7IHQgPSBzdHJjaHIocywgJ1xuJyk7IC8qIGRpc2FsbG93IFxuIGluIEhUVFAgaGVhZGVycyAqLworICAgIGlmICghdCkKKyAgICAgIHQgPSBzICsgc3RybGVuKHMpOworICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBzID0gdCArIDE7CisgIH0gd2hpbGUgKCp0KTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK2h0dHBfcG9zdF9oZWFkZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsKQoreyBpZiAoa2V5KQorICB7IGlmIChodHRwX3NlbmRfaGVhZGVyKHNvYXAsIGtleSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHZhbCAmJiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAiOiAiLCAyKSB8fCBodHRwX3NlbmRfaGVhZGVyKHNvYXAsIHZhbCkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsICJcclxuIiwgMik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK2h0dHBfcmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdGF0dXMsIHNpemVfdCBjb3VudCkKK3sgcmVnaXN0ZXIgaW50IGVycjsKKyNpZmRlZiBXTVdfUlBNX0lPCisgIGlmIChzb2FwLT5ycG1yZXFpZCkKKyAgICBodHRwT3V0cHV0RW5hYmxlKHNvYXAtPnJwbXJlcWlkKTsKKyNlbmRpZgorICBpZiAoIXN0YXR1cyB8fCBzdGF0dXMgPT0gU09BUF9IVE1MIHx8IHN0YXR1cyA9PSBTT0FQX0ZJTEUpCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJPSyAyMDBcbiIpKTsKKyNpZmRlZiBXTVdfUlBNX0lPCisgICAgaWYgKHNvYXAtPnJwbXJlcWlkIHx8IHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikgfHwgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkgLyogUlBNIGJlaGF2ZXMgYXMgaWYgc3RhbmRhbG9uZSAqLworI2Vsc2UKKyAgICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSB8fCBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKSAvKiBzdGFuZGFsb25lIGFwcGxpY2F0aW9uICovCisjZW5kaWYKKyAgICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiSFRUUC8lcyAyMDAgT0siLCBzb2FwLT5odHRwX3ZlcnNpb24pOworICAgICAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCBzb2FwLT50bXBidWYsIE5VTEwpKSkKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgZWxzZSBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJTdGF0dXMiLCAiMjAwIE9LIikpKQorICAgICAgcmV0dXJuIGVycjsKKyAgfQorICBlbHNlIGlmIChzdGF0dXMgPiAyMDAgJiYgc3RhdHVzIDwgNjAwKQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiSFRUUC8lcyAlZCAlcyIsIHNvYXAtPmh0dHBfdmVyc2lvbiwgc3RhdHVzLCBodHRwX2Vycm9yKHNvYXAsIHN0YXR1cykpOworICAgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgc29hcC0+dG1wYnVmLCBOVUxMKSkpCisgICAgICByZXR1cm4gZXJyOworI2lmbmRlZiBXSVRIX0xFQU4gCisgICAgaWYgKHN0YXR1cyA9PSA0MDEpCisgICAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIkJhc2ljIHJlYWxtPVwiJXNcIiIsIHNvYXAtPmF1dGhyZWFsbSA/IHNvYXAtPmF1dGhyZWFsbSA6ICJnU09BUCBXZWIgU2VydmljZSIpOworICAgICAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiV1dXLUF1dGhlbnRpY2F0ZSIsIHNvYXAtPnRtcGJ1ZikpKQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBlbHNlIGlmICgoc3RhdHVzID49IDMwMSAmJiBzdGF0dXMgPD0gMzAzKSB8fCBzdGF0dXMgPT0gMzA3KQorICAgIHsgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiTG9jYXRpb24iLCBzb2FwLT5lbmRwb2ludCkpKQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyNlbmRpZgorICB9CisgIGVsc2UKKyAgeyBjb25zdCBjaGFyICpzID0gKnNvYXBfZmF1bHRjb2RlKHNvYXApOworICAgIGlmIChzb2FwLT52ZXJzaW9uID09IDIgJiYgIXN0cmNtcChzLCAiU09BUC1FTlY6U2VuZGVyIikpCisgICAgICBzID0gIjQwMCBCYWQgUmVxdWVzdCI7CisgICAgZWxzZQorICAgICAgcyA9ICI1MDAgSW50ZXJuYWwgU2VydmVyIEVycm9yIjsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVycm9yICVzIChzdGF0dXM9JWQpXG4iLCBzLCBzdGF0dXMpKTsKKyNpZmRlZiBXTVdfUlBNX0lPCisgICAgaWYgKHNvYXAtPnJwbXJlcWlkIHx8IHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikgfHwgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkgLyogUlBNIGJlaGF2ZXMgYXMgaWYgc3RhbmRhbG9uZSAqLworI2Vsc2UKKyAgICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSB8fCBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKSAvKiBzdGFuZGFsb25lIGFwcGxpY2F0aW9uICovCisjZW5kaWYKKyAgICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiSFRUUC8lcyAlcyIsIHNvYXAtPmh0dHBfdmVyc2lvbiwgcyk7CisgICAgICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgTlVMTCkpKQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBlbHNlIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlN0YXR1cyIsIHMpKSkKKyAgICAgIHJldHVybiBlcnI7CisgIH0KKyAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiU2VydmVyIiwgImdTT0FQLzIuNyIpKQorICAgfHwgKGVyciA9IHNvYXBfcHV0aHR0cGhkcihzb2FwLCBzdGF0dXMsIGNvdW50KSkpCisgICAgcmV0dXJuIGVycjsKKyNpZmRlZiBXSVRIX0NPT0tJRVMKKyAgaWYgKHNvYXBfcHV0c2V0Y29va2llcyhzb2FwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjZW5kaWYKKyAgcmV0dXJuIHNvYXAtPmZwb3N0aGRyKHNvYXAsIE5VTEwsIE5VTEwpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdGF0dXMpCit7IHJlZ2lzdGVyIHNpemVfdCBjb3VudDsKKyAgaWYgKCEoc29hcC0+b21vZGUgJiAoU09BUF9FTkNfWE1MIHwgU09BUF9JT19TVE9SRSAvKiB0aGlzIHRlc3RzIGZvciBjaHVua2luZyB0b28gKi8pKQorICAgJiYgKHN0YXR1cyA9PSBTT0FQX0hUTUwgfHwgc3RhdHVzID09IFNPQVBfRklMRSkpCisgIHsgc29hcC0+b21vZGUgJj0gflNPQVBfSU87CisgICAgc29hcC0+b21vZGUgfD0gU09BUF9JT19TVE9SRTsKKyAgfQorICBzb2FwLT5zdGF0dXMgPSBzdGF0dXM7CisgIGNvdW50ID0gc29hcF9jb3VudF9hdHRhY2htZW50cyhzb2FwKTsKKyAgaWYgKHNvYXBfYmVnaW5fc2VuZChzb2FwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjaWZuZGVmIFdJVEhfTk9IVFRQCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pICE9IFNPQVBfSU9fU1RPUkUgJiYgIShzb2FwLT5tb2RlICYgU09BUF9FTkNfWE1MKSkKKyAgeyByZWdpc3RlciBpbnQgbiA9IHNvYXAtPm1vZGU7CisgICAgc29hcC0+bW9kZSAmPSB+KFNPQVBfSU8gfCBTT0FQX0VOQ19aTElCKTsKKyAgICBpZiAoKG4gJiBTT0FQX0lPKSAhPSBTT0FQX0lPX0ZMVVNIKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX0JVRkZFUjsKKyAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnJlc3BvbnNlKHNvYXAsIHN0YXR1cywgY291bnQpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgICBpZiAoKG4gJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKQorICAgIHsgaWYgKHNvYXBfZmx1c2goc29hcCkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisjZW5kaWYKKyAgICBzb2FwLT5tb2RlID0gbjsKKyAgfQorI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIGNvbnN0IGNoYXIqCitzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICp0KQoreyBpZiAoKnNvYXAtPnRhZykKKyAgICBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIlZhbGlkYXRpb24gY29uc3RyYWludCB2aW9sYXRpb246ICVzJXMgaW4gZWxlbWVudCA8JXM+IiwgcywgdD90OlNPQVBfU1RSX0VPUywgc29hcC0+dGFnKTsKKyAgZWxzZQorICAgIHNwcmludGYoc29hcC0+bXNnYnVmLCAiVmFsaWRhdGlvbiBjb25zdHJhaW50IHZpb2xhdGlvbjogJXMlcyIsIHMsIHQ/dDpTT0FQX1NUUl9FT1MpOworICByZXR1cm4gc29hcC0+bXNnYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXApCit7IGNvbnN0IGNoYXIgKipjID0gc29hcF9mYXVsdGNvZGUoc29hcCk7CisgIGNvbnN0IGNoYXIgKipzID0gc29hcF9mYXVsdHN0cmluZyhzb2FwKTsKKyAgaWYgKCEqYyAmJiAhKnMgJiYgc29hcC0+ZnNldGVycm9yKQorICAgIHNvYXAtPmZzZXRlcnJvcihzb2FwLCBjLCBzKTsKKyAgaWYgKCEqYykKKyAgeyBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICAgICAgKmMgPSAiU09BUC1FTlY6U2VuZGVyIjsKKyAgICBlbHNlCisgICAgICAqYyA9ICJTT0FQLUVOVjpDbGllbnQiOworICB9CisgIGlmICgqcykKKyAgICByZXR1cm47CisgIHN3aXRjaCAoc29hcC0+ZXJyb3IpCisgIHsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgY2FzZSBTT0FQX0NMSV9GQVVMVDoKKyAgICAgICpzID0gIkNsaWVudCBmYXVsdCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfU1ZSX0ZBVUxUOgorICAgICAgKnMgPSAiU2VydmVyIGZhdWx0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9UQUdfTUlTTUFUQ0g6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgInRhZyBuYW1lIG9yIG5hbWVzcGFjZSBtaXNtYXRjaCIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1RZUEU6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgImRhdGEgdHlwZSBtaXNtYXRjaCAiLCBzb2FwLT50eXBlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9TWU5UQVhfRVJST1I6CisgICAgICAqcyA9ICJXZWxsLWZvcm1lZG5lc3MgdmlvbGF0aW9uIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9OT19UQUc6CisgICAgICAqcyA9ICJObyBYTUwgZWxlbWVudCB0YWciOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX01VU1RVTkRFUlNUQU5EOgorICAgICAgKmMgPSAiU09BUC1FTlY6TXVzdFVuZGVyc3RhbmQiOworICAgICAgc3ByaW50Zihzb2FwLT5tc2didWYsICJUaGUgZGF0YSBpbiBlbGVtZW50ICclcycgbXVzdCBiZSB1bmRlcnN0b29kIGJ1dCBjYW5ub3QgYmUgaGFuZGxlZCIsIHNvYXAtPnRhZyk7CisgICAgICAqcyA9IHNvYXAtPm1zZ2J1ZjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9WRVJTSU9OTUlTTUFUQ0g6CisgICAgICAqYyA9ICJTT0FQLUVOVjpWZXJzaW9uTWlzbWF0Y2giOworICAgICAgKnMgPSAiU09BUCB2ZXJzaW9uIG1pc21hdGNoIG9yIGludmFsaWQgU09BUCBtZXNzYWdlIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9EQVRBRU5DT0RJTkdVTktOT1dOOgorICAgICAgKmMgPSAiU09BUC1FTlY6RGF0YUVuY29kaW5nVW5rbm93biI7CisgICAgICAqcyA9ICJVbnN1cHBvcnRlZCBTT0FQIGRhdGEgZW5jb2RpbmciOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX05BTUVTUEFDRToKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAibmFtZXNwYWNlIG1pc21hdGNoIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfVVNFUl9FUlJPUjoKKyAgICAgICpzID0gIlVzZXIgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0ZBVEFMX0VSUk9SOgorICAgICAgKnMgPSAiRmF0YWwgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX05PX01FVEhPRDoKKyAgICAgIHNwcmludGYoc29hcC0+bXNnYnVmLCAiTWV0aG9kICclcycgbm90IGltcGxlbWVudGVkOiBtZXRob2QgbmFtZSBvciBuYW1lc3BhY2Ugbm90IHJlY29nbml6ZWQiLCBzb2FwLT50YWcpOworICAgICAgKnMgPSBzb2FwLT5tc2didWY7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfR0VUX01FVEhPRDoKKyAgICAgICpzID0gIkhUVFAgR0VUIG1ldGhvZCBub3QgaW1wbGVtZW50ZWQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0VPTToKKyAgICAgICpzID0gIk91dCBvZiBtZW1vcnkiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0lPQjoKKyAgICAgICpzID0gIkFycmF5IGluZGV4IG91dCBvZiBib3VuZHMiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX05VTEw6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgIm5pbCBub3QgYWxsb3dlZCIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0RVUExJQ0FURV9JRDoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAibXVsdGlwbGUgZGVmaW5pdGlvbnMgb2YgaWQgIiwgc29hcC0+aWQpOworICAgICAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgICAgICAgKnNvYXBfZmF1bHRzdWJjb2RlKHNvYXApID0gIlNPQVAtRU5DOkR1cGxpY2F0ZUlEIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9NSVNTSU5HX0lEOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJtaXNzaW5nIGlkIGZvciByZWYgIiwgc29hcC0+aWQpOworICAgICAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgICAgICAgKnNvYXBfZmF1bHRzdWJjb2RlKHNvYXApID0gIlNPQVAtRU5DOk1pc3NpbmdJRCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfSFJFRjoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAiaW5jb21wYXRpYmxlIG9iamVjdCByZWYgIiwgc29hcC0+aWQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0ZBVUxUOgorICAgICAgYnJlYWs7CisjaWZuZGVmIFdJVEhfTk9JTworICAgIGNhc2UgU09BUF9VRFBfRVJST1I6CisgICAgICAqcyA9ICJNZXNzYWdlIHRvbyBsYXJnZSBmb3IgVURQIHBhY2tldCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfVENQX0VSUk9SOgorICAgICAgKnMgPSB0Y3BfZXJyb3Ioc29hcCk7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgU09BUF9IVFRQX0VSUk9SOgorICAgICAgKnMgPSAiSFRUUCBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfU1NMX0VSUk9SOgorI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgICAgKnMgPSAiU1NMIGVycm9yIjsKKyNlbHNlCisgICAgICAqcyA9ICJPcGVuU1NMIG5vdCBpbnN0YWxsZWQ6IHJlY29tcGlsZSB3aXRoIC1EV0lUSF9PUEVOU1NMIjsKKyNlbmRpZgorICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1BMVUdJTl9FUlJPUjoKKyAgICAgICpzID0gIlBsdWdpbiByZWdpc3RyeSBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfRElNRV9FUlJPUjoKKyAgICAgICpzID0gIkRJTUUgZm9ybWF0IGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9ESU1FX0hSRUY6CisgICAgICAqcyA9ICJESU1FIGhyZWYgdG8gbWlzc2luZyBhdHRhY2htZW50IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9ESU1FX01JU01BVENIOgorICAgICAgKnMgPSAiRElNRSB2ZXJzaW9uL3RyYW5zbWlzc2lvbiBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfRElNRV9FTkQ6CisgICAgICAqcyA9ICJFbmQgb2YgRElNRSBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTUlNRV9FUlJPUjoKKyAgICAgICpzID0gIk1JTUUgZm9ybWF0IGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9NSU1FX0hSRUY6CisgICAgICAqcyA9ICJNSU1FIGhyZWYgdG8gbWlzc2luZyBhdHRhY2htZW50IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9NSU1FX0VORDoKKyAgICAgICpzID0gIkVuZCBvZiBNSU1FIGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9aTElCX0VSUk9SOgorI2lmZGVmIFdJVEhfWkxJQgorICAgICAgc3ByaW50Zihzb2FwLT5tc2didWYsICJabGliL2d6aXAgZXJyb3I6ICclcyciLCBzb2FwLT5kX3N0cmVhbS5tc2c/c29hcC0+ZF9zdHJlYW0ubXNnOiIiKTsKKyAgICAgICpzID0gc29hcC0+bXNnYnVmOworI2Vsc2UKKyAgICAgICpzID0gIlpsaWIvZ3ppcCBub3QgaW5zdGFsbGVkIGZvciAoZGUpY29tcHJlc3Npb246IHJlY29tcGlsZSB3aXRoIC1EV0lUSF9HWklQIjsKKyNlbmRpZgorICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1JFUVVJUkVEOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJtaXNzaW5nIHJlcXVpcmVkIGF0dHJpYnV0ZSIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1BST0hJQklURUQ6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgInByb2hpYml0ZWQgYXR0cmlidXRlIHByZXNlbnQiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9PQ0NVUlM6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgIm1pbi9tYXhPY2N1cnMgdmlvbGF0aW9uIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTEVOR1RIOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJjb250ZW50IGxlbmd0aCB2aW9sYXRpb24iLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9TVE9QOgorICAgICAgKnMgPSAiU3RvcHBlZDogbm8gcmVzcG9uc2Ugc2VudCI7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgU09BUF9FT0Y6CisjaWZuZGVmIFdJVEhfTk9JTworICAgICAgc3ByaW50Zihzb2FwLT5tc2didWYsICJFbmQgb2YgZmlsZSBvciBubyBpbnB1dDogJyVzJyIsIHNvYXBfc3RyZXJyb3Ioc29hcCkpOworICAgICAgKnMgPSBzb2FwLT5tc2didWY7CisgICAgICBicmVhazsKKyNlbHNlCisgICAgICAqcyA9ICJFbmQgb2YgZmlsZSBvciBubyBpbnB1dCI7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgaWYgKHNvYXAtPmVycm9yID4gMjAwICYmIHNvYXAtPmVycm9yIDwgNjAwKQorICAgICAgeyBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIkhUVFAgRXJyb3I6ICVkICVzIiwgc29hcC0+ZXJyb3IsIGh0dHBfZXJyb3Ioc29hcCwgc29hcC0+ZXJyb3IpKTsKKyAgICAgICAgKnMgPSBzb2FwLT5tc2didWY7CisgICAgICB9CisgICAgICBlbHNlCisjZW5kaWYKKyNlbmRpZgorICAgICAgeyBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIkVycm9yICVkIiwgc29hcC0+ZXJyb3IpOworICAgICAgICAqcyA9IHNvYXAtPm1zZ2J1ZjsKKyAgICAgIH0KKyAgICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2VuZF9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IHN0YXR1cyA9IHNvYXAtPmVycm9yOworICBpbnQgciA9IDE7CisgIGlmIChzdGF0dXMgPT0gU09BUF9TVE9QKQorICAgIHJldHVybiBzdGF0dXM7CisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJTZW5kaW5nIGJhY2sgZmF1bHQgc3RydWN0IGZvciBlcnJvciBjb2RlICVkXG4iLCBzb2FwLT5lcnJvcikpOworICBzb2FwLT5rZWVwX2FsaXZlID0gMDsgLyogdG8gdGVybWluYXRlIGNvbm5lY3Rpb24gKi8KKyAgc29hcF9zZXRfZmF1bHQoc29hcCk7CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICBmZF9zZXQgcmZkLCBzZmQ7CisgICAgdGltZW91dC50dl9zZWMgPSAwOworICAgIHRpbWVvdXQudHZfdXNlYyA9IDA7CisgICAgRkRfWkVSTygmcmZkKTsKKyAgICBGRF9aRVJPKCZzZmQpOworICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmcmZkKTsKKyAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnNmZCk7CisgICAgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCAmcmZkLCAmc2ZkLCBOVUxMLCAmdGltZW91dCk7CisgICAgaWYgKHIgPiAwKQorICAgIHsgaWYgKCFGRF9JU1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmc2ZkKQorICAgICAgIHx8IChGRF9JU1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmcmZkKQorICAgICAgICAmJiByZWN2KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHNvYXAtPnRtcGJ1ZiwgMSwgTVNHX1BFRUspIDwgMCkpCisgICAgICAgIHIgPSAwOworICAgIH0KKyAgfQorI2VuZGlmCisjZW5kaWYKKyAgaWYgKChzdGF0dXMgIT0gU09BUF9FT0YgfHwgKCFzb2FwLT5yZWN2X3RpbWVvdXQgJiYgIXNvYXAtPnNlbmRfdGltZW91dCkpICYmIHIgPiAwKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgICBzb2FwX3NlcmlhbGl6ZWhlYWRlcihzb2FwKTsKKyAgICBzb2FwX3NlcmlhbGl6ZWZhdWx0KHNvYXApOworICAgIHNvYXBfYmVnaW5fY291bnQoc29hcCk7CisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICB7IHNvYXBfZW52ZWxvcGVfYmVnaW5fb3V0KHNvYXApOworICAgICAgc29hcF9wdXRoZWFkZXIoc29hcCk7CisgICAgICBzb2FwX2JvZHlfYmVnaW5fb3V0KHNvYXApOworICAgICAgc29hcF9wdXRmYXVsdChzb2FwKTsKKyAgICAgIHNvYXBfYm9keV9lbmRfb3V0KHNvYXApOworICAgICAgc29hcF9lbnZlbG9wZV9lbmRfb3V0KHNvYXApOworICAgIH0KKyAgICBzb2FwX2VuZF9jb3VudChzb2FwKTsKKyAgICBpZiAoc29hcF9yZXNwb25zZShzb2FwLCBzdGF0dXMpCisgICAgIHx8IHNvYXBfZW52ZWxvcGVfYmVnaW5fb3V0KHNvYXApCisgICAgIHx8IHNvYXBfcHV0aGVhZGVyKHNvYXApCisgICAgIHx8IHNvYXBfYm9keV9iZWdpbl9vdXQoc29hcCkKKyAgICAgfHwgc29hcF9wdXRmYXVsdChzb2FwKQorICAgICB8fCBzb2FwX2JvZHlfZW5kX291dChzb2FwKQorICAgICB8fCBzb2FwX2VudmVsb3BlX2VuZF9vdXQoc29hcCkpCisgICAgICByZXR1cm4gc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgc29hcF9lbmRfc2VuZChzb2FwKTsKKyAgfQorICBzb2FwLT5lcnJvciA9IHN0YXR1czsKKyAgcmV0dXJuIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlY3ZfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBzdGF0dXMgPSBzb2FwLT5lcnJvcjsKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlY2VpdmluZyBTT0FQIEZhdWx0XG4iKSk7CisgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgaWYgKHNvYXBfZ2V0ZmF1bHQoc29hcCkpCisgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVycm9yOiBzb2FwX2dldF9zb2FwZmF1bHQoKSBmYWlsZWQuIElzIHRoaXMgYSBTT0FQIG1lc3NhZ2UgYXQgYWxsP1xuIikpOworICAgICpzb2FwX2ZhdWx0Y29kZShzb2FwKSA9IChzb2FwLT52ZXJzaW9uID09IDIgPyAiU09BUC1FTlY6U2VuZGVyIiA6ICJTT0FQLUVOVjpDbGllbnQiKTsKKyAgICBzb2FwLT5lcnJvciA9IHN0YXR1czsKKyAgICBzb2FwX3NldF9mYXVsdChzb2FwKTsKKyAgfQorICBlbHNlCisgIHsgcmVnaXN0ZXIgY29uc3QgY2hhciAqcyA9ICpzb2FwX2ZhdWx0Y29kZShzb2FwKTsKKyAgICBpZiAoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHMsICJTT0FQLUVOVjpTZXJ2ZXIiKSB8fCAhc29hcF9tYXRjaF90YWcoc29hcCwgcywgIlNPQVAtRU5WOlJlY2VpdmVyIikpCisgICAgICBzdGF0dXMgPSBTT0FQX1NWUl9GQVVMVDsgCisgICAgZWxzZSBpZiAoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHMsICJTT0FQLUVOVjpDbGllbnQiKSB8fCAhc29hcF9tYXRjaF90YWcoc29hcCwgcywgIlNPQVAtRU5WOlNlbmRlciIpKQorICAgICAgc3RhdHVzID0gU09BUF9DTElfRkFVTFQ7CisgICAgZWxzZSBpZiAoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHMsICJTT0FQLUVOVjpNdXN0VW5kZXJzdGFuZCIpKQorICAgICAgc3RhdHVzID0gU09BUF9NVVNUVU5ERVJTVEFORDsKKyAgICBlbHNlIGlmICghc29hcF9tYXRjaF90YWcoc29hcCwgcywgIlNPQVAtRU5WOlZlcnNpb25NaXNtYXRjaCIpKQorICAgICAgc3RhdHVzID0gU09BUF9WRVJTSU9OTUlTTUFUQ0g7CisgICAgZWxzZQorICAgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZhdWx0IGNvZGUgJXNcbiIsIHMpKTsKKyAgICAgIHN0YXR1cyA9IFNPQVBfRkFVTFQ7CisgICAgfQorICAgIGlmIChzb2FwX2JvZHlfZW5kX2luKHNvYXApCisgICAgIHx8IHNvYXBfZW52ZWxvcGVfZW5kX2luKHNvYXApCisgICAgIHx8IHNvYXBfZW5kX3JlY3Yoc29hcCkpCisgICAgICByZXR1cm4gc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgc29hcC0+ZXJyb3IgPSBzdGF0dXM7CisgIH0KKyAgcmV0dXJuIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmRfZW1wdHlfcmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPmNvdW50ID0gMDsKKyAgaWYgKHNvYXBfcmVzcG9uc2Uoc29hcCwgU09BUF9PSykgfHwgc29hcF9lbmRfc2VuZChzb2FwKSkKKyAgICByZXR1cm4gc29hcF9jbG9zZXNvY2soc29hcCk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVjdl9lbXB0eV9yZXNwb25zZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXBfYmVnaW5fcmVjdihzb2FwKSB8fCBzb2FwX2VuZF9yZWN2KHNvYXApKQorICAgIHJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY29uc3QgY2hhcioKK3NvYXBfc3RyZXJyb3Ioc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBlcnIgPSBzb2FwLT5lcnJudW07CisgIGlmIChlcnIpCisgIHsKKyNpZm5kZWYgV0lOMzIKKyAgICByZXR1cm4gc3RyZXJyb3IoZXJyKTsKKyNlbHNlCisgICAgRm9ybWF0TWVzc2FnZShGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTXxGT1JNQVRfTUVTU0FHRV9JR05PUkVfSU5TRVJUUywgTlVMTCwgZXJyLCAwLCAoTFBUU1RSKSZzb2FwLT5lcnJvcnN0ciwgc2l6ZW9mKHNvYXAtPmVycm9yc3RyKSwgTlVMTCk7CisgICAgcmV0dXJuIHNvYXAtPmVycm9yc3RyOworI2VuZGlmCisgIH0KKyAgcmV0dXJuICJPcGVyYXRpb24gaW50ZXJydXB0ZWQgb3IgdGltZWQgb3V0IjsKK30KKyNlbmRpZgorI2VuZGlmIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK3N0YXRpYyBpbnQKK3NvYXBfc2V0X2Vycm9yKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdGNvZGUsIGNvbnN0IGNoYXIgKmZhdWx0c3ViY29kZSwgY29uc3QgY2hhciAqZmF1bHRzdHJpbmcsIGNvbnN0IGNoYXIgKmZhdWx0ZGV0YWlsLCBpbnQgc29hcGVycm9yKQoreyAqc29hcF9mYXVsdGNvZGUoc29hcCkgPSBmYXVsdGNvZGU7CisgIGlmIChmYXVsdHN1YmNvZGUpCisgICAgKnNvYXBfZmF1bHRzdWJjb2RlKHNvYXApID0gZmF1bHRzdWJjb2RlOworICAqc29hcF9mYXVsdHN0cmluZyhzb2FwKSA9IGZhdWx0c3RyaW5nOworICBpZiAoZmF1bHRkZXRhaWwgJiYgKmZhdWx0ZGV0YWlsKQorICB7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKipzID0gc29hcF9mYXVsdGRldGFpbChzb2FwKTsKKyAgICBpZiAocykKKyAgICAgICpzID0gZmF1bHRkZXRhaWw7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yID0gc29hcGVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCwgaW50IHNvYXBlcnJvcikKK3sgcmV0dXJuIHNvYXBfc2V0X2Vycm9yKHNvYXAsIHNvYXAtPnZlcnNpb24gPT0gMiA/ICJTT0FQLUVOVjpTZW5kZXIiIDogIlNPQVAtRU5WOkNsaWVudCIsIE5VTEwsIGZhdWx0c3RyaW5nLCBmYXVsdGRldGFpbCwgc29hcGVycm9yKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCwgaW50IHNvYXBlcnJvcikKK3sgcmV0dXJuIHNvYXBfc2V0X2Vycm9yKHNvYXAsIHNvYXAtPnZlcnNpb24gPT0gMiA/ICJTT0FQLUVOVjpSZWNlaXZlciIgOiAiU09BUC1FTlY6U2VydmVyIiwgTlVMTCwgZmF1bHRzdHJpbmcsIGZhdWx0ZGV0YWlsLCBzb2FwZXJyb3IpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorc3RhdGljIGludAorc29hcF9jb3B5X2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdGNvZGUsIGNvbnN0IGNoYXIgKmZhdWx0c3ViY29kZSwgY29uc3QgY2hhciAqZmF1bHRzdHJpbmcsIGNvbnN0IGNoYXIgKmZhdWx0ZGV0YWlsKQoreyBjaGFyICpyID0gTlVMTCwgKnMgPSBOVUxMLCAqdCA9IE5VTEw7CisgIGlmIChmYXVsdHN1YmNvZGUpCisgICAgciA9IHNvYXBfc3RyZHVwKHNvYXAsIGZhdWx0c3ViY29kZSk7CisgIGlmIChmYXVsdHN0cmluZykKKyAgICBzID0gc29hcF9zdHJkdXAoc29hcCwgZmF1bHRzdHJpbmcpOworICBpZiAoZmF1bHRkZXRhaWwpCisgICAgdCA9IHNvYXBfc3RyZHVwKHNvYXAsIGZhdWx0ZGV0YWlsKTsKKyAgcmV0dXJuIHNvYXBfc2V0X2Vycm9yKHNvYXAsIGZhdWx0Y29kZSwgciwgcywgdCwgU09BUF9GQVVMVCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2VuZGVyX2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdHN0cmluZywgY29uc3QgY2hhciAqZmF1bHRkZXRhaWwpCit7IHJldHVybiBzb2FwX3NlbmRlcl9mYXVsdF9zdWJjb2RlKHNvYXAsIE5VTEwsIGZhdWx0c3RyaW5nLCBmYXVsdGRldGFpbCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2VuZGVyX2ZhdWx0X3N1YmNvZGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZhdWx0c3ViY29kZSwgY29uc3QgY2hhciAqZmF1bHRzdHJpbmcsIGNvbnN0IGNoYXIgKmZhdWx0ZGV0YWlsKQoreyByZXR1cm4gc29hcF9jb3B5X2ZhdWx0KHNvYXAsIHNvYXAtPnZlcnNpb24gPT0gMiA/ICJTT0FQLUVOVjpTZW5kZXIiIDogIlNPQVAtRU5WOkNsaWVudCIsIGZhdWx0c3ViY29kZSwgZmF1bHRzdHJpbmcsIGZhdWx0ZGV0YWlsKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWNlaXZlcl9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRzdHJpbmcsIGNvbnN0IGNoYXIgKmZhdWx0ZGV0YWlsKQoreyByZXR1cm4gc29hcF9yZWNlaXZlcl9mYXVsdF9zdWJjb2RlKHNvYXAsIE5VTEwsIGZhdWx0c3RyaW5nLCBmYXVsdGRldGFpbCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVjZWl2ZXJfZmF1bHRfc3ViY29kZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRzdWJjb2RlLCBjb25zdCBjaGFyICpmYXVsdHN0cmluZywgY29uc3QgY2hhciAqZmF1bHRkZXRhaWwpCit7IHJldHVybiBzb2FwX2NvcHlfZmF1bHQoc29hcCwgc29hcC0+dmVyc2lvbiA9PSAyID8gIlNPQVAtRU5WOlJlY2VpdmVyIiA6ICJTT0FQLUVOVjpTZXJ2ZXIiLCBmYXVsdHN1YmNvZGUsIGZhdWx0c3RyaW5nLCBmYXVsdGRldGFpbCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCisjaWZuZGVmIFdJVEhfTk9TVERMSUIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfcHJpbnRfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXAsIEZJTEUgKmZkKQoreyBpZiAoc29hcF9jaGVja19zdGF0ZShzb2FwKSkKKyAgICBmcHJpbnRmKGZkLCAiRXJyb3I6IHNvYXAgc3RydWN0IG5vdCBpbml0aWFsaXplZFxuIik7CisgIGVsc2UgaWYgKHNvYXAtPmVycm9yKQorICB7IGNvbnN0IGNoYXIgKmMsICp2ID0gTlVMTCwgKnMsICoqZDsKKyAgICBkID0gc29hcF9mYXVsdGNvZGUoc29hcCk7CisgICAgaWYgKCEqZCkKKyAgICAgIHNvYXBfc2V0X2ZhdWx0KHNvYXApOworICAgIGMgPSAqZDsKKyAgICBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICAgICAgdiA9ICpzb2FwX2ZhdWx0c3ViY29kZShzb2FwKTsKKyAgICBzID0gKnNvYXBfZmF1bHRzdHJpbmcoc29hcCk7CisgICAgZCA9IHNvYXBfZmF1bHRkZXRhaWwoc29hcCk7CisgICAgZnByaW50ZihmZCwgIiVzJWQgZmF1bHQ6ICVzIFslc11cblwiJXNcIlxuRGV0YWlsOiAlc1xuIiwgc29hcC0+dmVyc2lvbiA/ICJTT0FQIDEuIiA6ICJFcnJvciAiLCBzb2FwLT52ZXJzaW9uID8gKGludClzb2FwLT52ZXJzaW9uIDogc29hcC0+ZXJyb3IsIGMsIHYgPyB2IDogIm5vIHN1YmNvZGUiLCBzID8gcyA6ICJbbm8gcmVhc29uXSIsIGQgJiYgKmQgPyAqZCA6ICJbbm8gZGV0YWlsXSIpOworICB9Cit9CisjZW5kaWYKKyNlbmRpZgorIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCisjaWZuZGVmIFdJVEhfTk9TVERMSUIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfcHJpbnRfZmF1bHRfbG9jYXRpb24oc3RydWN0IHNvYXAgKnNvYXAsIEZJTEUgKmZkKQoreyAKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGludCBpLCBqLCBjMSwgYzI7CisgIGlmIChzb2FwLT5lcnJvciAmJiBzb2FwLT5idWZsZW4gPiAwKQorICB7IGkgPSAoaW50KXNvYXAtPmJ1ZmlkeCAtIDE7CisgICAgaWYgKGkgPD0gMCkKKyAgICAgIGkgPSAwOworICAgIGMxID0gc29hcC0+YnVmW2ldOworICAgIHNvYXAtPmJ1ZltpXSA9ICdcMCc7CisgICAgaWYgKChpbnQpc29hcC0+YnVmbGVuID49IGkgKyAxMDI0KQorICAgICAgaiA9IGkgKyAxMDIzOworICAgIGVsc2UKKyAgICAgIGogPSAoaW50KXNvYXAtPmJ1ZmxlbiAtIDE7CisgICAgYzIgPSBzb2FwLT5idWZbal07CisgICAgc29hcC0+YnVmW2pdID0gJ1wwJzsKKyAgICBmcHJpbnRmKGZkLCAiJXMlY1xuKiogSEVSRSAqKlxuIiwgc29hcC0+YnVmLCBjMSk7CisgICAgaWYgKHNvYXAtPmJ1ZmlkeCA8IHNvYXAtPmJ1ZmxlbikKKyAgICAgIGZwcmludGYoZmQsICIlc1xuIiwgc29hcC0+YnVmICsgc29hcC0+YnVmaWR4KTsKKyAgICBzb2FwLT5idWZbaV0gPSBjMTsKKyAgICBzb2FwLT5idWZbal0gPSBjMjsKKyAgfQorI2VuZGlmCit9CisjZW5kaWYKKyNlbmRpZgorIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVnaXN0ZXJfcGx1Z2luX2FyZyhzdHJ1Y3Qgc29hcCAqc29hcCwgaW50ICgqZmNyZWF0ZSkoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9wbHVnaW4qLCB2b2lkKiksIHZvaWQgKmFyZykKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGx1Z2luICpwOworICByZWdpc3RlciBpbnQgcjsKKyAgaWYgKCEocCA9IChzdHJ1Y3Qgc29hcF9wbHVnaW4qKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9wbHVnaW4pKSkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgIHAtPmlkID0gTlVMTDsKKyAgcC0+ZGF0YSA9IE5VTEw7CisgIHAtPmZjb3B5ID0gTlVMTDsKKyAgcC0+ZmRlbGV0ZSA9IE5VTEw7CisgIHIgPSBmY3JlYXRlKHNvYXAsIHAsIGFyZyk7CisgIGlmICghciAmJiBwLT5mZGVsZXRlKQorICB7IHAtPm5leHQgPSBzb2FwLT5wbHVnaW5zOworICAgIHNvYXAtPnBsdWdpbnMgPSBwOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVnaXN0ZXJlZCAnJXMnIHBsdWdpblxuIiwgcC0+aWQpKTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCByZWdpc3RlciBwbHVnaW4gJyVzJzogcGx1Z2luIHJldHVybmVkIGVycm9yICVkIChvciBmZGVsZXRlIGNhbGxiYWNrIG5vdCBzZXQpXG4iLCBwLT5pZD9wLT5pZDoiPyIsIHIpKTsKKyAgU09BUF9GUkVFKHNvYXAsIHApOworICByZXR1cm4gcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyB2b2lkICoKK2ZwbHVnaW4oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnA7CisgIGZvciAocCA9IHNvYXAtPnBsdWdpbnM7IHA7IHAgPSBwLT5uZXh0KQorICAgIGlmIChwLT5pZCA9PSBpZCB8fCAhc3RyY21wKHAtPmlkLCBpZCkpCisgICAgICByZXR1cm4gcC0+ZGF0YTsKKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkICoKK1NPQVBfRk1BQzIKK3NvYXBfbG9va3VwX3BsdWdpbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQpCit7IHJldHVybiBzb2FwLT5mcGx1Z2luKHNvYXAsIGlkKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIF9fY3BsdXNwbHVzCisjaWZuZGVmIFdJVEhfTEVBTgorc29hcDo6c29hcCgpCit7IHNvYXBfaW5pdCh0aGlzKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJQysrIHNvYXAgc3RydWN0IG1ldGhvZHMKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIF9fY3BsdXNwbHVzCisjaWZuZGVmIFdJVEhfTEVBTgorc29hcDo6c29hcChzb2FwX21vZGUgbW9kZSkKK3sgc29hcF9pbml0MSh0aGlzLCBtb2RlKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpZm5kZWYgV0lUSF9MRUFOCitzb2FwOjpzb2FwKHNvYXBfbW9kZSBpbW9kZSwgc29hcF9tb2RlIG9tb2RlKQoreyBzb2FwX2luaXQyKHRoaXMsIGltb2RlLCBvbW9kZSk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIF9fY3BsdXNwbHVzCisjaWZuZGVmIFdJVEhfTEVBTgorc29hcDo6c29hcChzdHJ1Y3Qgc29hcCYgc29hcCkKK3sgc29hcF9jb3B5X2NvbnRleHQodGhpcywgJnNvYXApOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworI2lmbmRlZiBXSVRIX0xFQU4KK3NvYXA6On5zb2FwKCkKK3sgc29hcF9kZXN0cm95KHRoaXMpOworICBzb2FwX2VuZCh0aGlzKTsKKyAgc29hcF9kb25lKHRoaXMpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvdWRwX1ZDL3N0ZHNvYXAyLmggYi9zYW1wbGVzL3VkcF9WQy9zdGRzb2FwMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZjQ1YmQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3VkcF9WQy9zdGRzb2FwMi5oCkBAIC0wLDAgKzEsMjA5MyBAQAorLyoKKworc3Rkc29hcDIuaCAyLjcuNmUKKworZ1NPQVAgcnVudGltZQorCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHBhcnQgb2YgdGhlIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2VzOgorR1BMLCB0aGUgZ1NPQVAgcHVibGljIGxpY2Vuc2UsIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDb250cmlidXRvcnM6CisKK1dpbmQgUml2ZXIgU3lzdGVtcywgSW5jLiwgZm9yIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25zIChtYXJrZWQgV1JbLi4uXSk6CisgIC0gdnhXb3JrcyBjb21wYXRpYmxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgcHVibGljIGxpY2Vuc2UuCisKK1RoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGdTT0FQIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4zCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKK0xpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoraHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL3NvYXBsaWNlbnNlLmh0bWwKK1NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCitXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKK2ZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK1RoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4uCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmZGVmIFdJVEhfU09BUERFRlNfSAorIyBpbmNsdWRlICJzb2FwZGVmcy5oIgkJLyogaW5jbHVkZSB1c2VyLWRlZmluZWQgc3R1ZmYgKi8KKyNlbmRpZgorCisjaWZuZGVmIF9USFJFQURfU0FGRQorIyBkZWZpbmUgX1RIUkVBRF9TQUZFCisjZW5kaWYKKworI2lmbmRlZiBPUEVOU0VSVkVSCisjIGlmbmRlZiBfUkVFTlRSQU5UCisjICBkZWZpbmUgX1JFRU5UUkFOVAorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9GTUFDMQkvKiBzdGRzb2FwMi5oIGRlY2xhcmF0aW9uIG1hY3JvICovCisjIGRlZmluZSBTT0FQX0ZNQUMxCisjZW5kaWYKKworI2lmbmRlZiBTT0FQX0ZNQUMyCS8qIHN0ZHNvYXAyLmggZGVjbGFyYXRpb24gbWFjcm8gKi8KKyMgZGVmaW5lIFNPQVBfRk1BQzIKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfRk1BQzMJLyogKGRlKXNlcmlhbGl6ZXIgZGVjbGFyYXRpb24gbWFjcm8gKi8KKyMgZGVmaW5lIFNPQVBfRk1BQzMKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfRk1BQzNTCS8qIHN0cmluZyBjb252ZXJ0ZXIgZm9yIChkZSlzZXJpYWxpemVyIGRlY2xhcmF0aW9uIG1hY3JvICovCisjIGRlZmluZSBTT0FQX0ZNQUMzUyBTT0FQX0ZNQUMzCisjZW5kaWYKKworI2lmbmRlZiBTT0FQX0ZNQUM0CS8qIChkZSlzZXJpYWxpemVyIGRlY2xhcmF0aW9uIG1hY3JvICovCisjIGRlZmluZSBTT0FQX0ZNQUM0CisjZW5kaWYKKworI2lmbmRlZiBTT0FQX0ZNQUM0UwkvKiBzdHJpbmcgY29udmVydGVyIGZvciAoZGUpc2VyaWFsaXplciBkZWNsYXJhdGlvbiBtYWNybyAqLworIyBkZWZpbmUgU09BUF9GTUFDNFMgU09BUF9GTUFDNAorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9GTUFDNQkvKiBzdHViL3NrZWxldG9uIGRlY2xhcmF0aW9uIG1hY3JvICovCisjIGRlZmluZSBTT0FQX0ZNQUM1CisjZW5kaWYKKworI2lmbmRlZiBTT0FQX0ZNQUM2CS8qIHN0dWIvc2tlbGV0b24gZGVjbGFyYXRpb24gbWFjcm8gKi8KKyMgZGVmaW5lIFNPQVBfRk1BQzYKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfQ01BQwkvKiBjbGFzcyBkZWNsYXJhdGlvbiBtYWNybyAqLworIyBkZWZpbmUgU09BUF9DTUFDCisjZW5kaWYKKworI2lmbmRlZiBTT0FQX05NQUMJLyogbmFtZXNwYWNlIHRhYmxlIGRlY2xhcmF0aW9uIG1hY3JvICovCisjIGRlZmluZSBTT0FQX05NQUMKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfU09VUkNFX1NUQU1QCisjIGRlZmluZSBTT0FQX1NPVVJDRV9TVEFNUChzdHIpCisjZW5kaWYKKworLyogZ1NPQVAgMi43LjQgYW5kIGhpZ2hlcjogZmFzdCBsb29rLWFzaWRlIGJ1ZmZlcmluZyBpcyBzdGFibGUgKi8KKyNpZm5kZWYgV0lUSF9GQVNUCisjIGRlZmluZSBXSVRIX0ZBU1QKKyNlbmRpZgorCisjaWZkZWYgV0lUSF9MRUFORVIKKyMgaWZuZGVmIFdJVEhfTEVBTgorIyAgZGVmaW5lIFdJVEhfTEVBTgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBXSVRIX0xFQU4KKyMgaWZkZWYgV0lUSF9DT09LSUVTCisjICBlcnJvciAiQ2Fubm90IGJ1aWxkIFdJVEhfTEVBTiBjb2RlIFdJVEhfQ09PS0lFUyBlbmFibGVkIgorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgU1REU09BUF9ICisjZGVmaW5lIFNURFNPQVBfSAorCisjaWYgZGVmaW5lZChfX3Z4d29ya3MpIHx8IGRlZmluZWQoX19WWFdPUktTX18pCisjIGRlZmluZSBWWFdPUktTCisjZW5kaWYKKworI2lmZGVmIF9XSU4zMgorIyBpZm5kZWYgV0lOMzIKKyMgIGRlZmluZSBXSU4zMgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBVTkRFUl9DRQorIyBpZm5kZWYgV0lOMzIKKyMgIGRlZmluZSBXSU4zMgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX0JPUkxBTkRDX18KKyMgaWZkZWYgX19XSU4zMl9fCisjICBpZm5kZWYgV0lOMzIKKyMgICBkZWZpbmUgV0lOMzIKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fQ1lHV0lOX18KKyMgaWZuZGVmIENZR1dJTgorIyAgZGVmaW5lIENZR1dJTgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX1NZTUJJQU4zMl9fIAorIyBkZWZpbmUgU1lNQklBTgorIyB1bmRlZiBXSU4zMgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fcGFsbW9zX18pIHx8IGRlZmluZWQoUEFMTV9HQ0MpIHx8IGRlZmluZWQoX19QQUxNT1NfVFJBUFNfXykKKyMgaWZuZGVmIFBBTE0KKyMgIGRlZmluZSBQQUxNCisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19ocHV4KQorIyBpZm5kZWYgSFBfVVgKKyMgIGRlZmluZSBIUF9VWAorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fYWxwaGEpICYmICFkZWZpbmVkKF9fVk1TKQorIyBpZm5kZWYgVFJVNjQKKyMgIGRlZmluZSBUUlU2NCAKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19NVlNfXworIyBpZm5kZWYgT1MzOTAKKyMgIGRlZmluZSBPUzM5MAorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgImNvbmZpZy5oIgorIyBpZmRlZiBXSVRIX09QRU5TU0wKKyMgIGlmbmRlZiBIQVZFX09QRU5TU0xfU1NMX0gKKyMgICB1bmRlZiBXSVRIX09QRU5TU0wKKyMgIGVuZGlmCisjIGVuZGlmCisjZWxzZQorIyBpZiBkZWZpbmVkKFVOREVSX0NFKQorIyAgZGVmaW5lIFdJVEhfTEVBTgorIyAgZGVmaW5lIEhBVkVfU1NDQU5GCisjIGVsaWYgZGVmaW5lZChXSU4zMikKKyMgIGRlZmluZSBIQVZFX1NUUlJDSFIKKyMgIGRlZmluZSBIQVZFX1NUUlRPRAorIyAgZGVmaW5lIEhBVkVfU1NDQU5GCisjICBkZWZpbmUgSEFWRV9TVFJUT0wKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUwKKyMgIGRlZmluZSBIQVZFX1NZU19USU1FQl9ICisjICBkZWZpbmUgSEFWRV9GVElNRQorIyAgZGVmaW5lIEhBVkVfV0NUT01CCisjICBkZWZpbmUgSEFWRV9NQlRPV0MKKyMgIGRlZmluZSBTT0FQX0xPTkdfRk9STUFUICIlSTY0ZCIKKyMgIGRlZmluZSBTT0FQX1VMT05HX0ZPUk1BVCAiJUk2NHUiCisjIGVsaWYgZGVmaW5lZChDWUdXSU4pCisjICBkZWZpbmUgSEFWRV9TVFJSQ0hSCisjICBkZWZpbmUgSEFWRV9TVFJUT0QKKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyAgZGVmaW5lIEhBVkVfU1RSVE9MCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMCisjICBkZWZpbmUgSEFWRV9TWVNfVElNRUJfSAorIyAgZGVmaW5lIEhBVkVfRlRJTUUKKyMgIGRlZmluZSBIQVZFX1JBTkRfUgorIyAgZGVmaW5lIEhBVkVfR01USU1FX1IKKyMgIGRlZmluZSBIQVZFX0xPQ0FMVElNRV9SCisjICBkZWZpbmUgSEFWRV9XQ1RPTUIKKyMgIGRlZmluZSBIQVZFX01CVE9XQworIyBlbGlmIGRlZmluZWQoX19BUFBMRV9fKQorIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfUkFORF9SCisjICBkZWZpbmUgSEFWRV9HTVRJTUVfUgorIyAgZGVmaW5lIEhBVkVfTE9DQUxUSU1FX1IKKyMgIGRlZmluZSBIQVZFX1RJTUVHTQorIyAgZGVmaW5lIEhBVkVfV0NUT01CCisjICBkZWZpbmUgSEFWRV9NQlRPV0MKKyMgZWxpZiBkZWZpbmVkKF9BSVhWRVJTSU9OXzQzMSkKKyMgIGRlZmluZSBIQVZFX1NUUlJDSFIKKyMgIGRlZmluZSBIQVZFX1NUUlRPRAorIyAgZGVmaW5lIEhBVkVfU1NDQU5GCisjICBkZWZpbmUgSEFWRV9TVFJUT0wKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUwKKyMgIGRlZmluZSBIQVZFX1NZU19USU1FQl9ICisjICBkZWZpbmUgSEFWRV9GVElNRQorIyAgZGVmaW5lIEhBVkVfUkFORF9SCisjICBkZWZpbmUgSEFWRV9HTVRJTUVfUgorIyAgZGVmaW5lIEhBVkVfTE9DQUxUSU1FX1IKKyMgIGRlZmluZSBIQVZFX1dDVE9NQgorIyAgZGVmaW5lIEhBVkVfTUJUT1dDCisjIGVsaWYgZGVmaW5lZChIUF9VWCkKKyMgIGRlZmluZSBIQVZFX1NUUlJDSFIKKyMgIGRlZmluZSBIQVZFX1NUUlRPRAorIyAgZGVmaW5lIEhBVkVfU1NDQU5GCisjICBkZWZpbmUgSEFWRV9TVFJUT0wKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUwKKyMgIGRlZmluZSBIQVZFX1NZU19USU1FQl9ICisjICBkZWZpbmUgSEFWRV9GVElNRQorIyAgZGVmaW5lIEhBVkVfUkFORF9SCisjICBkZWZpbmUgSEFWRV9HTVRJTUVfUgorIyAgZGVmaW5lIEhBVkVfTE9DQUxUSU1FX1IKKyMgIGRlZmluZSBIQVZFX1dDVE9NQgorIyAgZGVmaW5lIEhBVkVfTUJUT1dDCisjIGVsaWYgZGVmaW5lZChGUkVFQlNEKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQorIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9MTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTEwKKyMgIGRlZmluZSBIQVZFX0dFVFRJTUVPRkRBWQorIyAgZGVmaW5lIEhBVkVfUkFORF9SCisjICBkZWZpbmUgSEFWRV9HTVRJTUVfUgorIyAgZGVmaW5lIEhBVkVfTE9DQUxUSU1FX1IKKyMgIGRlZmluZSBIQVZFX1dDVE9NQgorIyAgZGVmaW5lIEhBVkVfTUJUT1dDCisjICBkZWZpbmUgU09BUF9MT05HX0ZPUk1BVCAiJXFkIgorIyAgZGVmaW5lIFNPQVBfVUxPTkdfRk9STUFUICIlcXUiCisjIGVsaWYgZGVmaW5lZChfX1ZNUykKKyMgIGRlZmluZSBIQVZFX1NUUlJDSFIKKyMgIGRlZmluZSBIQVZFX1NUUlRPRAorIyAgZGVmaW5lIEhBVkVfU1NDQU5GCisjICBkZWZpbmUgSEFWRV9TVFJUT0wKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUwKKyMgIGRlZmluZSBIQVZFX1NZU19USU1FQl9ICisjICBkZWZpbmUgSEFWRV9GVElNRQorIyAgZGVmaW5lIEhBVkVfUkFORF9SCisjICBkZWZpbmUgSEFWRV9HTVRJTUVfUgorIyAgZGVmaW5lIEhBVkVfTE9DQUxUSU1FX1IKKyMgIGRlZmluZSBIQVZFX1dDVE9NQgorIyAgZGVmaW5lIEhBVkVfTUJUT1dDCisjIGVsaWYgZGVmaW5lZChfX0dMSUJDX18pIHx8IGRlZmluZWQoX19HTlVfXykKKyMgIGRlZmluZSBIQVZFX1NUUlJDSFIKKyMgIGRlZmluZSBIQVZFX1NUUlRPRAorIyAgZGVmaW5lIEhBVkVfU1NDQU5GCisjICBkZWZpbmUgSEFWRV9TVFJUT0wKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUwKKyMgIGRlZmluZSBIQVZFX1NUUlRPTEwKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUxMCisjICBkZWZpbmUgSEFWRV9TWVNfVElNRUJfSAorIyAgZGVmaW5lIEhBVkVfRlRJTUUKKyMgIGRlZmluZSBIQVZFX1JBTkRfUgorIyAgZGVmaW5lIEhBVkVfR01USU1FX1IKKyMgIGRlZmluZSBIQVZFX0xPQ0FMVElNRV9SCisjICBkZWZpbmUgSEFWRV9USU1FR00KKyMgIGRlZmluZSBIQVZFX1dDVE9NQgorIyAgZGVmaW5lIEhBVkVfTUJUT1dDCisjICBkZWZpbmUgSEFWRV9JU05BTgorIyBlbGlmIGRlZmluZWQoVFJVNjQpCisjICBkZWZpbmUgSEFWRV9TVFJSQ0hSCisjICBkZWZpbmUgSEFWRV9TVFJUT0QKKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyAgZGVmaW5lIEhBVkVfU1RSVE9MCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMCisjICBkZWZpbmUgSEFWRV9TVFJUT0xMCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMTAorIyAgZGVmaW5lIEhBVkVfR0VUVElNRU9GREFZCisjICBkZWZpbmUgSEFWRV9TWVNfVElNRUJfSAorIyAgZGVmaW5lIEhBVkVfUkFORF9SCisjICBkZWZpbmUgSEFWRV9HTVRJTUVfUgorIyAgZGVmaW5lIEhBVkVfTE9DQUxUSU1FX1IKKyMgIGRlZmluZSBfX1VTRV9TVERfSU9TVFJFQU0KKyMgIGRlZmluZSBIQVZFX1dDVE9NQgorIyAgZGVmaW5lIEhBVkVfTUJUT1dDCisjICBkZWZpbmUgU09BUF9MT05HX0ZPUk1BVCAiJWxkIgorIyAgZGVmaW5lIFNPQVBfVUxPTkdfRk9STUFUICIlbHUiCisjIGVsaWYgZGVmaW5lZChNQUNfQ0FSQk9OKQorIyAgZGVmaW5lIFdJVEhfTk9JTworIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfRlRJTUUKKyMgIGRlZmluZSBIQVZFX1JBTkRfUgorIyAgZGVmaW5lIEhBVkVfR0VUSE9TVEJZTkFNRV9SCisjICBkZWZpbmUgSEFWRV9HTVRJTUVfUgorIyAgZGVmaW5lIEhBVkVfTE9DQUxUSU1FX1IKKyMgIGRlZmluZSBIQVZFX1dDVE9NQgorIyAgZGVmaW5lIEhBVkVfTUJUT1dDCisjIGVsaWYgZGVmaW5lZChQQUxNKQorIyAgZGVmaW5lIFdJVEhfTEVBTgorIyAgZGVmaW5lIEhBVkVfU1RSVE9EICAgLyogc3RydG9kKCkgaXMgZGVmaW5lZCBpbiBwYWxtRnVuY3Rpb25zLmggKi8KKyMgIGluY2x1ZGUgPHN0ZGxpYi5oPgkvKiBOZWVkcyB0byBiZSBpbmNsdWRlZCBiZWZvcmUgdW5peCBoZWFkZXJzICovCisjICBpbmNsdWRlIDxzeXNfdHlwZXMuaD4KKyMgIGRlZmluZSBJR05PUkVfU1RESU9fU1RVQlMKKyMgIGluY2x1ZGUgPFN0ZElPUGFsbS5oPgorIyAgZGVmaW5lIE9fTk9OQkxPQ0sgRk5PTkJJTworIyAgaW5jbHVkZSA8c3lzX3NvY2tldC5oPgorIyAgaW5jbHVkZSAicGFsbUZ1bmN0aW9ucy5oIgorIyBlbGlmIGRlZmluZWQoU1lNQklBTikKKyMgIGRlZmluZSBXSVRIX0xFQU4KKyMgIGRlZmluZSBXSVRIX05PTkFNRVNQQUNFUworIyAgZGVmaW5lIEhBVkVfU1RSVE9ECS8qIHVzZSBTVFJUT0Qgc2luY2Ugc3NjYW5mIGRvZXNuJ3Qgc2VlbSB0byB3b3JrICovCisjICBpbmNsdWRlIDxlMzJkZWYuaD4KKyMgIGluY2x1ZGUgPHN5cy9pb2N0bC5oPgorIyBlbGlmIGRlZmluZWQoVlhXT1JLUykKKyMgIGRlZmluZSBIQVZFX1NUUlJDSFIKKyMgIGRlZmluZSBIQVZFX1NUUlRPRAorIyAgZGVmaW5lIEhBVkVfU1NDQU5GCisjICBkZWZpbmUgSEFWRV9TVFJUT0wKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUwKKyMgIGRlZmluZSBIQVZFX1BHTVRJTUVfUgorIyAgZGVmaW5lIEhBVkVfUExPQ0FMVElNRV9SCisjICBkZWZpbmUgSEFWRV9NS1RJTUUKKyMgZWxpZiBkZWZpbmVkKE9TMzkwKQorIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfU1lTX1RJTUVCX0gKKyMgIGRlZmluZSBIQVZFX0ZUSU1FCisjICBkZWZpbmUgSEFWRV9SQU5EX1IKKyMgIGRlZmluZSBIQVZFX0dNVElNRV9SCisjICBkZWZpbmUgSEFWRV9MT0NBTFRJTUVfUgorIyAgZGVmaW5lIEhBVkVfV0NUT01CCisjICBkZWZpbmUgSEFWRV9NQlRPV0MKKyMgZWxpZiBkZWZpbmVkKEFTNDAwKQorIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfU1lTX1RJTUVCX0gKKyMgIGRlZmluZSBIQVZFX0ZUSU1FCisjICBkZWZpbmUgSEFWRV9SQU5EX1IKKyMgIGRlZmluZSBIQVZFX0dNVElNRV9SCisjICBkZWZpbmUgSEFWRV9MT0NBTFRJTUVfUgorIyAgZGVmaW5lIEhBVkVfV0NUT01CCisjICBkZWZpbmUgSEFWRV9NQlRPV0MKKyMgZWxzZQorLyogRGVmYXVsdCBhc3VtcHRpb25zIG9uIHN1cHBvcnRlZCBmdW5jdGlvbnMgKi8KKyMgIGRlZmluZSBIQVZFX1NUUlJDSFIKKyMgIGRlZmluZSBIQVZFX1NUUlRPRAorIyAgZGVmaW5lIEhBVkVfU1NDQU5GCisjICBkZWZpbmUgSEFWRV9TVFJUT0wKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUwKKyMgIGRlZmluZSBIQVZFX1NZU19USU1FQl9ICisjICBkZWZpbmUgSEFWRV9GVElNRQorIyAgZGVmaW5lIEhBVkVfUkFORF9SCisjICBkZWZpbmUgSEFWRV9HRVRIT1NUQllOQU1FX1IKKyMgIGRlZmluZSBIQVZFX0dNVElNRV9SCisjICBkZWZpbmUgSEFWRV9MT0NBTFRJTUVfUgorIyAgZGVmaW5lIEhBVkVfV0NUT01CCisjICBkZWZpbmUgSEFWRV9NQlRPV0MKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBRTlggZG9lcyBub3QgaGF2ZSBhIHdvcmtpbmcgdmVyc2lvbiBvZiBzdHJ0b2YgKi8KKyNpZiBkZWZpbmVkKF9fUU5YX18pIHx8IGRlZmluZWQoUU5YKQorIyB1bmRlZiBIQVZFX1NUUlRPRgorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9MT05HX0ZPUk1BVAorIyBkZWZpbmUgU09BUF9MT05HX0ZPUk1BVCAiJWxsZCIJLyogcHJpbnRmIGZvcm1hdCBmb3IgNjQgYml0IGludHMgKi8KKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfVUxPTkdfRk9STUFUCisjIGRlZmluZSBTT0FQX1VMT05HX0ZPUk1BVCAiJWxsdSIJLyogcHJpbnRmIGZvcm1hdCBmb3IgdW5zaWduZWQgNjQgYml0IGludHMgKi8KKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9TVERMSUIKKyMgaW5jbHVkZSA8c3RkbGliLmg+CisjIGlmbmRlZiBQQUxNCisjICBpbmNsdWRlIDxzdGRpby5oPgorIyAgaW5jbHVkZSA8c3RyaW5nLmg+CisjIGVuZGlmCisjIGluY2x1ZGUgPGN0eXBlLmg+CisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiAhZGVmaW5lZChXSVRIX0xFQU4pCisjIGluY2x1ZGUgPHN0cmluZz4KKyMgaW5jbHVkZSA8aW9zdHJlYW0+CisjZW5kaWYKKworI2lmZGVmIFdJVEhfTk9IVFRQCisjIGlmbmRlZiBXSVRIX05PSU8KKy8vLy8jICBkZWZpbmUgV0lUSF9OT0lPICAgICBFU0wgVE8gRE8gOiBJIGFkZGVkIHRoZSBjb21tZW50IHRvIG1ha2UgdGhpcyB3b3JrLiBUaGlzIGlzIHZlcnkgc3RyYW5nZSB0aG91Z2ghIQorIyAgdW5kZWYgV0lUSF9DT09LSUVTCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBVTkRFUl9DRQorIyBpZm5kZWYgUEFMTQorIyAgaWZuZGVmIFdJVEhfTk9JTworIyAgIGluY2x1ZGUgPGVycm5vLmg+CisjICAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjICBlbmRpZgorIyAgaWZuZGVmIFdJVEhfTEVBTgorIyAgIGlmZGVmIEhBVkVfU1lTX1RJTUVCX0gKKyMgICAgaW5jbHVkZSA8c3lzL3RpbWViLmg+CQkvKiBmb3IgZnRpbWUoKSAqLworIyAgIGVuZGlmCisjICAgaW5jbHVkZSA8dGltZS5oPgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgT1BFTlNFUlZFUgorIyBpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjIGluY2x1ZGUgPHN5cy9zdHJlYW0uaD4KKyMgaW5jbHVkZSA8c3lzL3Byb3Rvc3cuaD4KKyAgZXh0ZXJuIGludCBoX2Vycm5vOworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9OT0lPCisjIGlmbmRlZiBXSU4zMgorIyAgaWZuZGVmIFBBTE0KKyMgICBpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjICAgaWZkZWYgVlhXT1JLUworIyAgICBpbmNsdWRlIDxzb2NrTGliLmg+CisjICAgIGluY2x1ZGUgPHNlbGVjdExpYi5oPgorIyAgIGVuZGlmCisjICAgaWZuZGVmIFZYV09SS1MKKyMgICAgaWZuZGVmIFNZTUJJQU4KKyMgICAgIGluY2x1ZGUgPHN0cmluZ3MuaD4KKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgIGlmZGVmIFNVTl9PUworIyAgICBpbmNsdWRlIDxzeXMvc3RyZWFtLmg+CQkvKiBTVU4gKi8KKyMgICAgaW5jbHVkZSA8c3lzL3NvY2tldHZhci5oPgkJLyogU1VOIDwgMi44ICg/KSAqLworIyAgIGVuZGlmCisjICAgaWZkZWYgVlhXT1JLUworIyAgICBpZmRlZiBfV1JTX0tFUk5FTAorIyAgICAgaW5jbHVkZSA8c3lzL3RpbWVzLmg+CisjICAgIGVuZGlmCisjICAgZWxzZQorIyAgICBpbmNsdWRlIDxzeXMvdGltZS5oPgorIyAgIGVuZGlmCisjICAgaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorIyAgIGlmZGVmIE9TMzkwCisjICAgIGluY2x1ZGUgPG5ldGluZXQvdGNwX3Zhci5oPgorIyAgIGVsc2UKKyMgICAgaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4gICAgICAgICAgLyogVENQX05PREVMQVkgKi8KKyMgICBlbmRpZgorIyAgIGluY2x1ZGUgPGFycGEvaW5ldC5oPgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgV0lUSF9GQVNUQ0dJCisjIGluY2x1ZGUgPGZjZ2lfc3RkaW8uaD4KKyNlbmRpZgorCisjaWZkZWYgV0lUSF9PUEVOU1NMCisjIGRlZmluZSBPUEVOU1NMX05PX0tSQjUKKyMgaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KKyMgaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyMgaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjIGlmbmRlZiBBTExPV19PTERfVkVSU0lPTlMKKyMgIGlmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgMHgwMDkwNTEwMEwpCisjICAgZXJyb3IgIk11c3QgdXNlIE9wZW5TU0wgMC45LjYgb3IgbGF0ZXIiCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBXSVRIX0daSVAKKyMgaWZuZGVmIFdJVEhfWkxJQgorIyAgZGVmaW5lIFdJVEhfWkxJQgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBXSVRIX0NBU0VJTlNFTlNJVElWRVRBR1MKKyMgZGVmaW5lIFNPQVBfU1RSQ01QIHNvYXBfdGFnX2NtcAkvKiBjYXNlIGluc2Vuc2l0dmUgWE1MIGVsZW1lbnQvYXR0cmlidXRlIG5hbWVzICovCisjZWxzZQorIyBkZWZpbmUgU09BUF9TVFJDTVAgc3RyY21wCQkvKiBjYXNlIHNlbnNpdGl2ZSBYTUwgZWxlbWVudC9hdHRyaWJ1dGUgbmFtZXMgKi8KKyNlbmRpZgorCisjaWZkZWYgV0lUSF9aTElCCisjIGluY2x1ZGUgPHpsaWIuaD4KKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9TVERMSUIKKyMgaWZuZGVmIFBBTE0KKyMgIGluY2x1ZGUgPG1hdGguaD4JLyogZm9yIGlzbmFuKCkgKi8KKyMgZW5kaWYKKyNlbmRpZgorCisvKiAjZGVmaW5lIERFQlVHICovIC8qIFVuY29tbWVudCB0byBkZWJ1ZyBzZW5kaW5nIChpbiBmaWxlIFNFTlQubG9nKSByZWNlaXZpbmcgKGluIGZpbGUgUkVDVi5sb2cpIGFuZCBtZXNzYWdlcyAoaW4gZmlsZSBURVNULmxvZykgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWZkZWYgV0lOMzIKKyMgaWZuZGVmIFVOREVSX0NFCisjICBpbmNsdWRlIDxpby5oPgorIyAgaW5jbHVkZSA8ZmNudGwuaD4KKyMgZW5kaWYKKyMgaW5jbHVkZSA8d2luc29jay5oPgorLyogIyBpbmNsdWRlIDx3aW5zb2NrMi5oPiAqLyAvKiBBbHRlcm5hdGl2ZTogdXNlIHdpbnNvY2syIChub3QgYXZhaWxhYmxlIHdpdGggZVZDKSAqLworIyBpZmRlZiBXSVRIX0lQVjYKKyMgIGluY2x1ZGUgPHdzMnRjcGlwLmg+CisjICBpbmNsdWRlIDx3c3BpYXBpLmg+CisjIGVuZGlmCisjZWxzZQorIyBpZmRlZiBWWFdPUktTCisjICBpbmNsdWRlIDxob3N0TGliLmg+CisjICBpbmNsdWRlIDxpb2N0bC5oPgorIyAgaW5jbHVkZSA8aW9MaWIuaD4KKyMgZW5kaWYKKyMgaWZuZGVmIFdJVEhfTk9JTworIyAgaWZuZGVmIFBBTE0KKyMgICBpbmNsdWRlIDxuZXRkYi5oPgorIyAgIGluY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyMgICBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgICBpbmNsdWRlIDxmY250bC5oPgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBQb3J0YWJpbGl0eTogZGVmaW5lIFNPQVBfU09DS0xFTl9UICovCisjaWYgZGVmaW5lZChfQUlYKQorIyBkZWZpbmUgU09BUF9TT0NLTEVOX1Qgc29ja2xlbl90CisjZWxpZiBkZWZpbmVkKFNPQ0tMRU5fVCkKKyMgZGVmaW5lIFNPQVBfU09DS0xFTl9UIFNPQ0tMRU5fVAorI2VsaWYgZGVmaW5lZChfX3NvY2tsZW5fdF9kZWZpbmVkKSB8fCBkZWZpbmVkKF9TT0NLTEVOX1QpIHx8IGRlZmluZWQoQ1lHV0lOKSB8fCBkZWZpbmVkKEZSRUVCU0QpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19RTlhfXykgfHwgZGVmaW5lZChRTlgpCisjIGRlZmluZSBTT0FQX1NPQ0tMRU5fVCBzb2NrbGVuX3QKKyNlbGlmIGRlZmluZWQoSVJJWCkgfHwgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfX0FQUExFX18pIHx8IGRlZmluZWQoSFBfVVgpIHx8IGRlZmluZWQoU1VOX09TKSB8fCBkZWZpbmVkKE9QRU5TRVJWRVIpIHx8IGRlZmluZWQoVFJVNjQpIHx8IGRlZmluZWQoVlhXT1JLUykKKyMgZGVmaW5lIFNPQVBfU09DS0xFTl9UIGludAorI2Vsc2UKKyMgZGVmaW5lIFNPQVBfU09DS0xFTl9UIHNpemVfdAorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9TT0NLRVQKKyMgaWZkZWYgV0lOMzIKKyMgIGRlZmluZSBTT0FQX1NPQ0tFVCBTT0NLRVQKKyMgZWxzZQorIyAgZGVmaW5lIFNPQVBfU09DS0VUIGludAorIyAgZGVmaW5lIGNsb3Nlc29ja2V0KG4pIGNsb3NlKG4pCisjIGVuZGlmCisjZW5kaWYKKworI2RlZmluZSBTT0FQX0lOVkFMSURfU09DS0VUICgtMSkKKyNkZWZpbmUgc29hcF92YWxpZF9zb2NrZXQobikgKChuKSAhPSBTT0FQX0lOVkFMSURfU09DS0VUKQorCisjaWYgZGVmaW5lZChTWU1CSUFOKQorIyBkZWZpbmUgTE9ORzY0IGxvbmcKKyMgZGVmaW5lIFVMT05HNjQgdW5zaWduZWQgTE9ORzY0CisjZWxpZiAhZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfX0dMSUJDX18pIHx8IGRlZmluZWQoX19HTlVfXykKKyMgaWZuZGVmIExPTkc2NAorIyAgZGVmaW5lIExPTkc2NCBsb25nIGxvbmcKKyMgIGRlZmluZSBVTE9ORzY0IHVuc2lnbmVkIExPTkc2NAorIyBlbmRpZgorI2VsaWYgZGVmaW5lZChVTkRFUl9DRSkKKyMgZGVmaW5lIExPTkc2NCBfX2ludDY0CisjIGRlZmluZSBVTE9ORzY0IHVuc2lnbmVkIExPTkc2NAorI2VsaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pCisjIGRlZmluZSBMT05HNjQgX19pbnQ2NAorIyBkZWZpbmUgVUxPTkc2NCB1bnNpZ25lZCBMT05HNjQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChXSU4zMikKKyMgZGVmaW5lIHNvYXBfaW50MzIgX19pbnQzMgorI2VsaWYgZGVmaW5lZChTWU1CSUFOKQorIyBkZWZpbmUgc29hcF9pbnQzMiBsb25nCisjZWxpZiBkZWZpbmVkKFBBTE0pCisjIGRlZmluZSBzb2FwX2ludDMyIEludDMyCisjZWxzZQorIyBkZWZpbmUgc29hcF9pbnQzMiBpbnQzMl90CisjZW5kaWYKKworI2lmZGVmIFdJTjMyCisjIGRlZmluZSBTT0FQX0VSQU5HRSBFUkFOR0UKKyMgZGVmaW5lIFNPQVBfRUlOVFIgV1NBRUlOVFIKKyMgZGVmaW5lIFNPQVBfRUFHQUlOIFdTQUVXT1VMREJMT0NLCisjIGRlZmluZSBTT0FQX0VXT1VMREJMT0NLIFdTQUVXT1VMREJMT0NLCisjIGRlZmluZSBTT0FQX0VJTlBST0dSRVNTIFdTQUVJTlBST0dSRVNTCisjZWxzZQorIyBkZWZpbmUgU09BUF9FUkFOR0UgRVJBTkdFCisjIGRlZmluZSBTT0FQX0VJTlRSIEVJTlRSCisjIGRlZmluZSBTT0FQX0VBR0FJTiBFQUdBSU4KKyMgaWZkZWYgU1lNQklBTgorIyAgZGVmaW5lIFNPQVBfRVdPVUxEQkxPQ0sgOTg5OAorIyAgZGVmaW5lIFNPQVBfRUlOUFJPR1JFU1MgOTg5OQorIyBlbHNlCisjICBkZWZpbmUgU09BUF9FV09VTERCTE9DSyBFV09VTERCTE9DSworIyAgZGVmaW5lIFNPQVBfRUlOUFJPR1JFU1MgRUlOUFJPR1JFU1MKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgV0lOMzIKKyMgaWZkZWYgVU5ERVJfQ0UKKyMgIGRlZmluZSBzb2FwX2Vycm5vIEdldExhc3RFcnJvcigpCisjICBkZWZpbmUgc29hcF9zb2NrZXRfZXJybm8gR2V0TGFzdEVycm9yKCkKKyMgIGRlZmluZSBzb2FwX3Jlc2V0X2Vycm5vIFNldExhc3RFcnJvcigwKQorIyBlbHNlCisjICBkZWZpbmUgc29hcF9lcnJubyBHZXRMYXN0RXJyb3IoKQorIyAgZGVmaW5lIHNvYXBfc29ja2V0X2Vycm5vIFdTQUdldExhc3RFcnJvcigpCisjICBkZWZpbmUgc29hcF9yZXNldF9lcnJubyBTZXRMYXN0RXJyb3IoMCkKKyMgZW5kaWYKKyNlbHNlCisjIGlmbmRlZiBXSVRIX05PSU8KKyMgIGRlZmluZSBzb2FwX2Vycm5vIGVycm5vCisjICBkZWZpbmUgc29hcF9zb2NrZXRfZXJybm8gZXJybm8KKyMgIGRlZmluZSBzb2FwX3Jlc2V0X2Vycm5vIChlcnJubyA9IDApCisjIGVsc2UKKyMgIGRlZmluZSBzb2FwX2Vycm5vIDAKKyMgIGRlZmluZSBzb2FwX3NvY2tldF9lcnJubyAwCisjICBkZWZpbmUgc29hcF9yZXNldF9lcnJubworIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9CVUZMRU4KKyMgaWZkZWYgV0lUSF9VRFAKKyMgIGRlZmluZSBTT0FQX0JVRkxFTiAoNjU1MzYpIC8qIG1heCBVRFAgcGFja2V0IHNpemUgKi8KKyMgZWxzZQorIyAgaWZuZGVmIFdJVEhfTEVBTgorIyAgIGRlZmluZSBTT0FQX0JVRkxFTiAoNjU1MzYpIC8qIGJ1ZmZlciBsZW5ndGggZm9yIHNvY2tldCBwYWNrZXRzLCBhbHNvIHVzZWQgYnkgZ2V0aG9zdGJ5bmFtZV9yIHNvIGRvbid0IG1ha2UgdGhpcyB0b28gc21hbGwgKi8KKyMgIGVsc2UKKyMgICBkZWZpbmUgU09BUF9CVUZMRU4gICgyMDQ4KQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBTT0FQX0xBQkxFTgorIyBkZWZpbmUgU09BUF9MQUJMRU4gICAgICg2NCkgLyogaW5pdGlhbCBsb29rLWFzaWRlIGJ1ZmZlciBsZW5ndGggKi8KKyNlbmRpZgorI2lmbmRlZiBTT0FQX1BUUkJMSworIyBkZWZpbmUgU09BUF9QVFJCTEsgICAgICgzMikgLyogYmxvY2sgYWxsb2NhdGlvbiBmb3IgcG9pbnRlciBoYXNoIHRhYmxlIGNoYWlucyAqLworI2VuZGlmCisjaWZuZGVmIFNPQVBfUFRSSEFTSAorIyBpZm5kZWYgV0lUSF9MRUFOCisjICBkZWZpbmUgU09BUF9QVFJIQVNIICgxMDI0KSAvKiBzaXplIG9mIHBvaW50ZXIgYW5hbHlzaXMgaGFzaCB0YWJsZSAobXVzdCBiZSBwb3dlciBvZiAyKSAqLworIyBlbHNlCisjICBkZWZpbmUgU09BUF9QVFJIQVNIICAgKDMyKQorIyBlbmRpZgorI2VuZGlmCisjaWZuZGVmIFNPQVBfSURIQVNICisjIGlmbmRlZiBXSVRIX0xFQU4KKyMgIGRlZmluZSBTT0FQX0lESEFTSCAgKDE5OTkpIC8qIHByaW1lIHNpemUgb2YgaGFzaCB0YWJsZSBmb3IgcGFyc2VkIGlkL3JlZiAqLworIyBlbHNlCisjICBkZWZpbmUgU09BUF9JREhBU0ggICAgKDE5KSAvKiAxOSwgMTk5ICovCisjIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgU09BUF9CTEtMRU4KKyMgaWZuZGVmIFdJVEhfTEVBTgorIyAgZGVmaW5lIFNPQVBfQkxLTEVOICAgKDI1NikgLyogc2l6ZSBvZiBibG9ja3MgdG8gY29sbGVjdCBsb25nIHN0cmluZ3MgYW5kIFhNTCBhdHRyaWJ1dGVzICovCisjIGVsc2UKKyMgIGRlZmluZSBTT0FQX0JMS0xFTiAgICAoMzIpCisjIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgU09BUF9UQUdMRU4KKyMgaWZuZGVmIFdJVEhfTEVBTgorIyAgZGVmaW5lIFNPQVBfVEFHTEVOICAoMTAyNCkgLyogbWF4aW11bSBsZW5ndGggb2YgWE1MIGVsZW1lbnQgdGFnL2F0dHJpYnV0ZSBuYW1lIG9yIGhvc3QvcGF0aCBuYW1lICsgMSAqLworIyBlbHNlCisjICBkZWZpbmUgU09BUF9UQUdMRU4gICAgKDY0KQorIyBlbmRpZgorI2VuZGlmCisjaWZuZGVmIFNPQVBfSERSTEVOCisjIGlmbmRlZiBXSVRIX0xFQU4KKyMgIGRlZmluZSBTT0FQX0hEUkxFTiAgKDgxOTIpIC8qIG1heGltdW0gbGVuZ3RoIG9mIEhUVFAgaGVhZGVyIGxpbmUgKG11c3QgYmUgPjQwOTYgdG8gcmVhZCBjb29raWVzKSAqLworIyBlbHNlCisjICBkZWZpbmUgU09BUF9IRFJMRU4gICgxMDI0KQorIyBlbmRpZgorI2VuZGlmCisjaWZuZGVmIFNPQVBfTUFYRElNUworIyBpZm5kZWYgV0lUSF9MRUFOCisjICBkZWZpbmUgU09BUF9NQVhESU1TCSAoMTYpIC8qIG1heGltdW0gYXJyYXkgZGltZW5zaW9ucyAoYXJyYXkgbmVzdGluZ3MpIG11c3QgYmUgbGVzcyB0aGFuIDY0IHRvIHByb3RlY3Qgc29hcC0+dG1wYnVmICovCisjIGVsc2UKKyMgIGRlZmluZSBTT0FQX01BWERJTVMJICAoNCkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfTUFYTE9HUworIyBkZWZpbmUgU09BUF9NQVhMT0dTCSAgKDMpIC8qIG1heCBudW1iZXIgb2YgZGVidWcgbG9ncyBwZXIgc3RydWN0IHNvYXAgZW52aXJvbm1lbnQgKi8KKyMgZGVmaW5lIFNPQVBfSU5ERVhfUkVDViAgKDApCisjIGRlZmluZSBTT0FQX0lOREVYX1NFTlQgICgxKQorIyBkZWZpbmUgU09BUF9JTkRFWF9URVNUICAoMikKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfTUFYS0VFUEFMSVZFCisjIGRlZmluZSBTT0FQX01BWEtFRVBBTElWRSAoMTAwKSAvKiBtYXggaXRlcmF0aW9ucyB0byBrZWVwIHNlcnZlciBjb25uZWN0aW9uIGFsaXZlICovCisjZW5kaWYKKworI2lmbmRlZiBTT0FQX01BWEFSUkFZU0laRQorIyBkZWZpbmUgU09BUF9NQVhBUlJBWVNJWkUgKDEwMDAwMCkgLyogInRydXN0ZWQiIG1heCBzaXplIG9mIGluYm91bmQgU09BUCBhcnJheSBmb3IgY29tcG91bmQgYXJyYXkgYWxsb2NhdGlvbiAqLworI2VuZGlmCisKKyNpZmRlZiBWWFdPUktTCisjIGlmZGVmIF9fSU5DbWF0aGggCisjICBpbmNsdWRlIDxwcml2YXRlL21hdGhQLmg+CisjICBpZm5kZWYgSEFWRV9JU05BTgorIyAgIGRlZmluZSBIQVZFX0lTTkFOCisjICBlbmRpZgorIyAgZGVmaW5lIHNvYXBfaXNuYW4obnVtKSBpc05hbihudW0pCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIFdJTjMyIAorIyBpbmNsdWRlIDxmbG9hdC5oPgorIyBpZm5kZWYgSEFWRV9JU05BTgorIyAgZGVmaW5lIEhBVkVfSVNOQU4KKyMgZW5kaWYKKyMgZGVmaW5lIHNvYXBfaXNuYW4obnVtKSBfaXNuYW4obnVtKQorI2VuZGlmCisKKyNpZmRlZiBTVU5fT1MKKyMgZGVmaW5lIHNvYXBfaXNuYW4obikgaXNuYW4obikKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoSEFWRV9JU05BTikgJiYgKGRlZmluZWQoX01BVEhfSCkgfHwgZGVmaW5lZChfTUFUSF9JTkNMVURFRCkpCisjIGRlZmluZSBIQVZFX0lTTkFOCisjZW5kaWYKKworI2lmbmRlZiBzb2FwX2lzbmFuCisjIGlmZGVmIEhBVkVfSVNOQU4KKyMgIGRlZmluZSBzb2FwX2lzbmFuKG4pIGlzbmFuKG4pCisjIGVsc2UKKyMgIGRlZmluZSBzb2FwX2lzbmFuKF8pICgwKQorIyBlbmRpZgorI2VuZGlmCisKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc29hcF9kb3VibGVfbmFuIHsgdW5zaWduZWQgaW50IG4xLCBuMjsgfSBzb2FwX2RvdWJsZV9uYW47CisKKyNpZmRlZiBWWFdPUktTCisjIGlmbmRlZiBGTFRfTUFYCisjICBkZWZpbmUgRkxUX01BWCBfQVJDSF9GTFRfTUFYCisjIGVuZGlmCisjIGlmbmRlZiBEQkxfTUFYCisjICBkZWZpbmUgREJMX01BWCBfQVJDSF9EQkxfTUFYCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBGTFRfTkFOCisjIGlmZGVmIEhBVkVfSVNOQU4KKyMgIGRlZmluZSBGTFRfTkFOICgqKGZsb2F0Kikodm9pZCopJnNvYXBfZG91YmxlX25hbikKKyMgZWxzZQorIyAgZGVmaW5lIEZMVF9OQU4gKDAuMCkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEZMVF9QSU5GVFkKKyMgaWYgZGVmaW5lZChGTFRfTUFYKQorIyAgZGVmaW5lIEZMVF9QSU5GVFkgRkxUX01BWAorIyBlbGlmIGRlZmluZWQoSFVHRV9WQUxGKQorIyAgZGVmaW5lIEZMVF9QSU5GVFkgKGZsb2F0KUhVR0VfVkFMRgorIyBlbGlmIGRlZmluZWQoSFVHRV9WQUwpCisjICBkZWZpbmUgRkxUX1BJTkZUWSAoZmxvYXQpSFVHRV9WQUwKKyMgZWxpZiBkZWZpbmVkKEZMT0FUX01BWCkKKyMgIGRlZmluZSBGTFRfUElORlRZIEZMT0FUX01BWAorIyBlbHNlCisjICBkZWZpbmUgRkxUX1BJTkZUWSAoMy40MDI4MjM0N2UrMzhGKQorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRkxUX05JTkZUWQorIyBkZWZpbmUgRkxUX05JTkZUWSAoLUZMVF9QSU5GVFkpCisjZW5kaWYKKworI2lmbmRlZiBEQkxfTkFOCisjIGlmZGVmIEhBVkVfSVNOQU4KKyMgIGRlZmluZSBEQkxfTkFOICgqKGRvdWJsZSopKHZvaWQqKSZzb2FwX2RvdWJsZV9uYW4pCisjIGVsc2UKKyMgIGRlZmluZSBEQkxfTkFOICgwLjApCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBEQkxfUElORlRZCisjIGlmIGRlZmluZWQoREJMX01BWCkKKyMgIGRlZmluZSBEQkxfUElORlRZIERCTF9NQVgKKyMgZWxpZiBkZWZpbmVkKEhVR0VfVkFMRikKKyMgIGRlZmluZSBEQkxfUElORlRZIChkb3VibGUpSFVHRV9WQUxGCisjIGVsaWYgZGVmaW5lZChIVUdFX1ZBTCkKKyMgIGRlZmluZSBEQkxfUElORlRZIChkb3VibGUpSFVHRV9WQUwKKyMgZWxpZiBkZWZpbmVkKERPVUJMRV9NQVgpCisjICBkZWZpbmUgREJMX1BJTkZUWSBET1VCTEVfTUFYCisjIGVsc2UKKyMgIGRlZmluZSBEQkxfUElORlRZICgxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOCkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIERCTF9OSU5GVFkKKyMgZGVmaW5lIERCTF9OSU5GVFkgKC1EQkxfUElORlRZKQorI2VuZGlmCisKKyNkZWZpbmUgc29hcF9pc3BpbmZkKG4pICgobikgPj0gREJMX1BJTkZUWSkKKyNkZWZpbmUgc29hcF9pc3BpbmZmKG4pICgobikgPj0gRkxUX1BJTkZUWSkKKyNkZWZpbmUgc29hcF9pc25pbmZkKG4pICgobikgPD0gREJMX05JTkZUWSkKKyNkZWZpbmUgc29hcF9pc25pbmZmKG4pICgobikgPD0gRkxUX05JTkZUWSkKKworLyogZ1NPQVAgZXJyb3IgY29kZXMgKi8KKworI2RlZmluZSBTT0FQX0VPRgkJCUVPRgorI2RlZmluZSBTT0FQX0VSUgkJCUVPRgorI2RlZmluZSBTT0FQX09LCQkJCTAKKyNkZWZpbmUgU09BUF9DTElfRkFVTFQJCQkxCisjZGVmaW5lIFNPQVBfU1ZSX0ZBVUxUCQkJMgorI2RlZmluZSBTT0FQX1RBR19NSVNNQVRDSAkJMworI2RlZmluZSBTT0FQX1RZUEUJCQk0CisjZGVmaW5lIFNPQVBfU1lOVEFYX0VSUk9SCQk1CisjZGVmaW5lIFNPQVBfTk9fVEFHCQkJNgorI2RlZmluZSBTT0FQX0lPQgkJCTcKKyNkZWZpbmUgU09BUF9NVVNUVU5ERVJTVEFORAkJOAorI2RlZmluZSBTT0FQX05BTUVTUEFDRQkJCTkKKyNkZWZpbmUgU09BUF9VU0VSX0VSUk9SCQkJMTAKKyNkZWZpbmUgU09BUF9GQVRBTF9FUlJPUgkJMTEKKyNkZWZpbmUgU09BUF9GQVVMVAkJCTEyCisjZGVmaW5lIFNPQVBfTk9fTUVUSE9ECQkJMTMKKyNkZWZpbmUgU09BUF9HRVRfTUVUSE9ECQkJMTQKKyNkZWZpbmUgU09BUF9FT00JCQkxNQorI2RlZmluZSBTT0FQX05VTEwJCQkxNgorI2RlZmluZSBTT0FQX0RVUExJQ0FURV9JRAkJMTcKKyNkZWZpbmUgU09BUF9NSVNTSU5HX0lECQkJMTgKKyNkZWZpbmUgU09BUF9IUkVGCQkJMTkKKyNkZWZpbmUgU09BUF9VRFBfRVJST1IJCQkyMAorI2RlZmluZSBTT0FQX1RDUF9FUlJPUgkJCTIxCisjZGVmaW5lIFNPQVBfSFRUUF9FUlJPUgkJCTIyCisjZGVmaW5lIFNPQVBfU1NMX0VSUk9SCQkJMjMKKyNkZWZpbmUgU09BUF9aTElCX0VSUk9SCQkJMjQKKyNkZWZpbmUgU09BUF9ESU1FX0VSUk9SCQkJMjUKKyNkZWZpbmUgU09BUF9ESU1FX0hSRUYJCQkyNgorI2RlZmluZSBTT0FQX0RJTUVfTUlTTUFUQ0gJCTI3CisjZGVmaW5lIFNPQVBfRElNRV9FTkQJCQkyOAorI2RlZmluZSBTT0FQX01JTUVfRVJST1IJCQkyOQorI2RlZmluZSBTT0FQX01JTUVfSFJFRgkJCTMwCisjZGVmaW5lIFNPQVBfTUlNRV9FTkQJCQkzMQorI2RlZmluZSBTT0FQX1ZFUlNJT05NSVNNQVRDSAkJMzIKKyNkZWZpbmUgU09BUF9QTFVHSU5fRVJST1IJCTMzCisjZGVmaW5lIFNPQVBfREFUQUVOQ09ESU5HVU5LTk9XTgkzNAorI2RlZmluZSBTT0FQX1JFUVVJUkVECQkJMzUKKyNkZWZpbmUgU09BUF9QUk9ISUJJVEVECQkJMzYKKyNkZWZpbmUgU09BUF9PQ0NVUlMJCQkzNworI2RlZmluZSBTT0FQX0xFTkdUSAkJCTM4CisKKyNkZWZpbmUgc29hcF94bWxfZXJyb3JfY2hlY2soZSkgKChlKSA9PSBTT0FQX1RBR19NSVNNQVRDSCB8fCAoZSkgPT0gU09BUF9UQUdfRU5EIHx8IChlKSA9PSBTT0FQX1NZTlRBWF9FUlJPUiB8fCAoZSkgPT0gU09BUF9OQU1FU1BBQ0UgfHwgKGUpID09IFNPQVBfRFVQTElDQVRFX0lEIHx8IChlKSA9PSBTT0FQX01JU1NJTkdfSUQgfHwgKGUpID09IFNPQVBfUkVRVUlSRUQgfHwgKGUpID09IFNPQVBfUFJPSElCSVRFRCB8fCAoZSkgPT0gU09BUF9PQ0NVUlMgfHwgKGUpID09IFNPQVBfTEVOR1RIIHx8IChlKSA9PSBTT0FQX05VTEwgfHwgKGUpID09IFNPQVBfSFJFRikKKyNkZWZpbmUgc29hcF9zb2FwX2Vycm9yX2NoZWNrKGUpICgoZSkgPT0gU09BUF9DTElfRkFVTFQgfHwgKGUpID09IFNPQVBfU1ZSX0ZBVUxUIHx8IChlKSA9PSBTT0FQX1ZFUlNJT05NSVNNQVRDSCB8fCAoZSkgPT0gU09BUF9NVVNUVU5ERVJTVEFORCB8fCAoZSkgPT0gU09BUF9GQVVMVCB8fCAoZSkgPT0gU09BUF9OT19NRVRIT0QpCisjZGVmaW5lIHNvYXBfdGNwX2Vycm9yX2NoZWNrKGUpICgoZSkgPT0gU09BUF9FT0YgfHwgKGUpID09IFNPQVBfVENQX0VSUk9SKQorI2RlZmluZSBzb2FwX3NzbF9lcnJvcl9jaGVjayhlKSAoKGUpID09IFNPQVBfU1NMX0VSUk9SKQorI2RlZmluZSBzb2FwX3psaWJfZXJyb3JfY2hlY2soZSkgKChlKSA9PSBTT0FQX1pMSUJfRVJST1IpCisjZGVmaW5lIHNvYXBfaHR0cF9lcnJvcl9jaGVjayhlKSAoKGUpID09IFNPQVBfSFRUUF9FUlJPUiB8fCAoZSkgPT0gU09BUF9HRVRfTUVUSE9EIHx8ICgoZSkgPj0gMTAwICYmIChlKSA8IDYwMCkpCisKKy8qIGdTT0FQIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGVzIDEwMCB0byA1OTkgYXJlIHJlc2VydmVkICovCisKKy8qIENvZGVzIDYwMCB0byA5OTkgYXJlIHVzZXIgZGVmaW5hYmxlICovCisKKy8qIEV4Y2VwdGlvbmFsIGdTT0FQIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGVzID49IDEwMDAgKi8KKworI2RlZmluZSBTT0FQX1NUT1AJCTEwMDAJLyogTm8gSFRUUCByZXNwb25zZSAqLworI2RlZmluZSBTT0FQX0ZPUk0JCTEwMDEJLyogRm9ybSByZXF1ZXN0L3Jlc3BvbnNlICovCisjZGVmaW5lIFNPQVBfSFRNTAkJMTAwMgkvKiBDdXN0b20gSFRNTCByZXNwb25zZSAqLworI2RlZmluZSBTT0FQX0ZJTEUJCTEwMDMJLyogQ3VzdG9tIGZpbGUtYmFzZWQgcmVzcG9uc2UgKi8KKworLyogZ1NPQVAgSFRUUCBtZXRob2QgY29kZXMgKi8KKworI2RlZmluZSBTT0FQX1BPU1QJCTIwMDAKKyNkZWZpbmUgU09BUF9HRVQJCTIwMDEKKworLyogZ1NPQVAgRElNRSAqLworCisjZGVmaW5lIFNPQVBfRElNRV9DRgkJMHgwMQorI2RlZmluZSBTT0FQX0RJTUVfTUUJCTB4MDIKKyNkZWZpbmUgU09BUF9ESU1FX01CCQkweDA0CisjZGVmaW5lIFNPQVBfRElNRV9WRVJTSU9OCTB4MDggLyogRElNRSB2ZXJzaW9uIDEgKi8KKyNkZWZpbmUgU09BUF9ESU1FX01FRElBCQkweDEwCisjZGVmaW5lIFNPQVBfRElNRV9BQlNVUkkJMHgyMAorCisvKiBnU09BUCBaTElCICovCisKKyNkZWZpbmUgU09BUF9aTElCX05PTkUJCTB4MDAKKyNkZWZpbmUgU09BUF9aTElCX0RFRkxBVEUJMHgwMQorI2RlZmluZSBTT0FQX1pMSUJfSU5GTEFURQkweDAyCisjZGVmaW5lIFNPQVBfWkxJQl9HWklQCQkweDAyCisKKy8qIGdTT0FQIHRyYW5zcG9ydCwgY29ubmVjdGlvbiwgYW5kIGNvbnRlbnQgZW5jb2RpbmcgbW9kZXMgKi8KKwordHlwZWRlZiBzb2FwX2ludDMyIHNvYXBfbW9kZTsKKworI2RlZmluZSBTT0FQX0lPCQkJMHgwMDAwMDAwMwkvKiBJTyBtYXNrICovCisjZGVmaW5lIFNPQVBfSU9fRkxVU0gJCTB4MDAwMDAwMDAJLyogZmx1c2ggb3V0cHV0IGltbWVkaWF0ZWx5LCBubyBidWZmZXJpbmcgKi8KKyNkZWZpbmUgU09BUF9JT19CVUZGRVIJCTB4MDAwMDAwMDEJLyogYnVmZmVyIG91dHB1dCBpbiBwYWNrZXRzIG9mIHNpemUgU09BUF9CVUZMRU4gKi8KKyNkZWZpbmUgU09BUF9JT19TVE9SRQkJMHgwMDAwMDAwMgkvKiBzdG9yZSBlbnRpcmUgb3V0cHV0IHRvIGRldGVybWluZSBsZW5ndGggZm9yIHRyYW5zcG9ydCAqLworI2RlZmluZSBTT0FQX0lPX0NIVU5LCQkweDAwMDAwMDAzCS8qIHVzZSBIVFRQIGNodW5rZWQgdHJhbnNmZXIgQU5EIGJ1ZmZlciBwYWNrZXRzICovCisKKyNkZWZpbmUgU09BUF9JT19VRFAJCTB4MDAwMDAwMDQKKyNkZWZpbmUgU09BUF9JT19MRU5HVEgJCTB4MDAwMDAwMDgKKyNkZWZpbmUgU09BUF9JT19LRUVQQUxJVkUJMHgwMDAwMDAxMAorCisjZGVmaW5lIFNPQVBfRU5DX0xBVElOCQkweDAwODAwMDIwCS8qIGlzby04ODU5LTEgZW5jb2RpbmcgKi8KKyNkZWZpbmUgU09BUF9FTkNfWE1MCQkweDAwMDAwMDQwCS8qIHBsYWluIFhNTCBlbmNvZGluZywgbm8gSFRUUCBoZWFkZXIgKi8KKyNkZWZpbmUgU09BUF9FTkNfRElNRQkJMHgwMDAwMDA4MAorI2RlZmluZSBTT0FQX0VOQ19NSU1FCQkweDAwMDAwMTAwCisjZGVmaW5lIFNPQVBfRU5DX01UT00JCTB4MDAwMDAyMDAKKyNkZWZpbmUgU09BUF9FTkNfWkxJQgkJMHgwMDAwMDQwMAorI2RlZmluZSBTT0FQX0VOQ19TU0wJCTB4MDAwMDA4MDAKKworI2RlZmluZSBTT0FQX0VOQwkJMHgwMDAwMEZGRgkvKiBJTyBhbmQgRU5DIG1hc2sgKi8KKworI2RlZmluZSBTT0FQX1hNTF9TVFJJQ1QJCTB4MDAwMDEwMDAJLyogc3RyaWN0IHZhbGlkYXRpb24gKi8KKyNkZWZpbmUgU09BUF9YTUxfSU5ERU5UCQkweDAwMDAyMDAwCisjZGVmaW5lIFNPQVBfWE1MX0NBTk9OSUNBTAkweDAwMDA0MDAwCS8qIEVYQyBDMTROIGNhbm9uaWNhbCBYTUwgKi8KKyNkZWZpbmUgU09BUF9YTUxfVFJFRQkJMHgwMDAwODAwMAorI2RlZmluZSBTT0FQX1hNTF9HUkFQSAkJMHgwMDAxMDAwMAorI2RlZmluZSBTT0FQX1hNTF9OSUwJCTB4MDAwMjAwMDAKKyNkZWZpbmUgU09BUF9YTUxfRE9NCQkweDAwMDQwMDAwCisjZGVmaW5lIFNPQVBfWE1MX1NFQwkJMHgwMDA4MDAwMAkvKiByZXNlcnZlZCBmb3IgV1Mgc2VjdXJpdHkgKi8KKworI2RlZmluZSBTT0FQX0NfTk9JT0IJCTB4MDAxMDAwMDAKKyNkZWZpbmUgU09BUF9DX1VURlNUUklORwkweDAwMjAwMDAwCisjZGVmaW5lIFNPQVBfQ19NQlNUUklORwkJMHgwMDQwMDAwMAorCisjZGVmaW5lIFNPQVBfRE9NX1RSRUUJCTB4MDEwMDAwMDAKKyNkZWZpbmUgU09BUF9ET01fTk9ERQkJMHgwMjAwMDAwMAorI2RlZmluZSBTT0FQX0RPTV9BU0lTCQkweDA0MDAwMDAwCisKKyNkZWZpbmUgU09BUF9JT19ERUZBVUxUCQlTT0FQX0lPX0ZMVVNICisKKy8qIFNTTCBjbGllbnQvc2VydmVyIGF1dGhlbnRpY2F0aW9uIHNldHRpbmdzICovCisKKyNkZWZpbmUgU09BUF9TU0xfTk9fQVVUSEVOVElDQVRJT04JCTB4MDAJLyogZm9yIHRlc3RpbmcgcHVycG9zZXMgKi8KKyNkZWZpbmUgU09BUF9TU0xfUkVRVUlSRV9TRVJWRVJfQVVUSEVOVElDQVRJT04JMHgwMQkvKiBjbGllbnQgcmVxdWlyZXMgc2VydmVyIHRvIGF1dGhlbnRpY2F0ZSAqLworI2RlZmluZSBTT0FQX1NTTF9SRVFVSVJFX0NMSUVOVF9BVVRIRU5USUNBVElPTgkweDAyCS8qIHNlcnZlciByZXF1aXJlcyBjbGllbnQgdG8gYXV0aGVudGljYXRlICovCisKKyNkZWZpbmUgU09BUF9TU0xfREVGQVVMVAkJCVNPQVBfU1NMX1JFUVVJUkVfU0VSVkVSX0FVVEhFTlRJQ0FUSU9OCisKKy8qIHN0YXRlICovCisKKyNkZWZpbmUgU09BUF9JTklUCTEKKyNkZWZpbmUgU09BUF9DT1BZCTIKKworI2RlZmluZSBzb2FwX2NoZWNrX3N0YXRlKHNvYXApICghKHNvYXApIHx8ICgoc29hcCktPnN0YXRlICE9IFNPQVBfSU5JVCAmJiAoc29hcCktPnN0YXRlICE9IFNPQVBfQ09QWSkpCisKKy8qIHBhcnQgKi8KKworI2RlZmluZSBTT0FQX0JFR0lOCQkwCisjZGVmaW5lIFNPQVBfSU5fRU5WRUxPUEUJMgorI2RlZmluZSBTT0FQX0lOX0hFQURFUgkJMworI2RlZmluZSBTT0FQX0VORF9IRUFERVIJCTQKKyNkZWZpbmUgU09BUF9OT19CT0RZCQk1CisjZGVmaW5lIFNPQVBfSU5fQk9EWQkJNgorI2RlZmluZSBTT0FQX0VORF9CT0RZCQk3CisjZGVmaW5lIFNPQVBfRU5EX0VOVkVMT1BFCTgKKyNkZWZpbmUgU09BUF9FTkQJCTkKKyNkZWZpbmUgU09BUF9CRUdJTl9TRUNVUklUWQkxMAorI2RlZmluZSBTT0FQX0lOX1NFQ1VSSVRZCTExCisjZGVmaW5lIFNPQVBfRU5EX1NFQ1VSSVRZCTEyCisKKy8qIERFQlVHIG1hY3JvcyAqLworCisjaWZuZGVmIFdJVEhfTEVBTgorIyBpZmRlZiBERUJVRworIyAgaWZuZGVmIFNPQVBfREVCVUcKKyMgICBkZWZpbmUgU09BUF9ERUJVRworIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgU09BUF9ERUJVRworIyBkZWZpbmUgU09BUF9NQUxMT0Moc29hcCwgc2l6ZSkgc29hcF90cmFja19tYWxsb2Moc29hcCwgX19GSUxFX18sIF9fTElORV9fLCBzaXplKQorIyBkZWZpbmUgU09BUF9GUkVFKHNvYXAsIHB0cikgc29hcF90cmFja19mcmVlKHNvYXAsIF9fRklMRV9fLCBfX0xJTkVfXywgcHRyKQorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9NQUxMT0MJCQkvKiB1c2UgbGliYyBtYWxsb2MgKi8KKyMgZGVmaW5lIFNPQVBfTUFMTE9DKHNvYXAsIHNpemUpIG1hbGxvYyhzaXplKQorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9GUkVFCQkJLyogdXNlIGxpYmMgZnJlZSAqLworIyBkZWZpbmUgU09BUF9GUkVFKHNvYXAsIHB0cikgZnJlZShwdHIpCisjZW5kaWYKKworI2lmZGVmIFNPQVBfREVCVUcKKyMgaWZuZGVmIFNPQVBfTUVTU0FHRQorIyAgZGVmaW5lIFNPQVBfTUVTU0FHRSBmcHJpbnRmCisjIGVuZGlmCisjIGlmbmRlZiBEQkdMT0cKKyMgIGRlZmluZSBEQkdMT0coREJHRklMRSwgQ01EKSBcCit7IGlmIChzb2FwKVwKKyAgeyBpZiAoIXNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYXyMjREJHRklMRV0pXAorICAgICAgc29hcF9vcGVuX2xvZ2ZpbGUoKHN0cnVjdCBzb2FwKilzb2FwLCBTT0FQX0lOREVYXyMjREJHRklMRSk7XAorICAgIGlmIChzb2FwLT5mZGVidWdbU09BUF9JTkRFWF8jI0RCR0ZJTEVdKVwKKyAgICB7IEZJTEUgKmZkZWJ1ZyA9IHNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYXyMjREJHRklMRV07XAorICAgICAgQ01EO1wKKyAgICAgIGZmbHVzaChmZGVidWcpO1wKKyAgICB9XAorICB9XAorfQorIyBlbmRpZgorIyBpZm5kZWYgREJHTVNHCisjICBkZWZpbmUgREJHTVNHKERCR0ZJTEUsIE1TRywgTEVOKSBcCit7IGlmIChzb2FwKVwKKyAgeyBpZiAoIXNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYXyMjREJHRklMRV0pXAorICAgICAgc29hcF9vcGVuX2xvZ2ZpbGUoKHN0cnVjdCBzb2FwKilzb2FwLCBTT0FQX0lOREVYXyMjREJHRklMRSk7XAorICAgIGlmIChzb2FwLT5mZGVidWdbU09BUF9JTkRFWF8jI0RCR0ZJTEVdKVwKKyAgICB7IGZ3cml0ZSgoTVNHKSwgMSwgKExFTiksIHNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYXyMjREJHRklMRV0pO1wKKyAgICAgIGZmbHVzaChzb2FwLT5mZGVidWdbU09BUF9JTkRFWF8jI0RCR0ZJTEVdKTtcCisgICAgfVwKKyAgfVwKK30KKyMgZW5kaWYKKyMgaWZuZGVmIERHQkZVTgorIyAgZGVmaW5lIERCR0ZVTihGTkFNRSkgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIlcyglZCk6ICVzKClcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgRk5BTUUpKQorIyAgZGVmaW5lIERCR0ZVTjEoRk5BTUUsIEZNVCwgQVJHKSBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIiVzKCVkKTogJXMoIkZNVCIpXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIEZOQU1FLCAoQVJHKSkpCisjICBkZWZpbmUgREJHRlVOMihGTkFNRSwgRk1UMSwgQVJHMSwgRk1UMiwgQVJHMikgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIlcyglZCk6ICVzKCJGTVQxIiwgIkZNVDIiKVxuIiwgX19GSUxFX18sIF9fTElORV9fLCBGTkFNRSwgKEFSRzEpLCAoQVJHMikpKQorIyAgZGVmaW5lIERCR0ZVTjMoRk5BTUUsIEZNVDEsIEFSRzEsIEZNVDIsIEFSRzIsIEZNVDMsIEFSRzMpIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiJXMoJWQpOiAlcygiRk1UMSIsICJGTVQyIiwgIkZNVDMiKVxuIiwgX19GSUxFX18sIF9fTElORV9fLCBGTkFNRSwgKEFSRzEpLCAoQVJHMiksIChBUkczKSkpCisjIGVuZGlmCisjIGlmbmRlZiBEQkdIRVgKKyMgIGRlZmluZSBEQkdIRVgoREJHRklMRSwgTVNHLCBMRU4pIFwKK3sgaWYgKHNvYXApXAorICB7IGlmICghc29hcC0+ZmRlYnVnW1NPQVBfSU5ERVhfIyNEQkdGSUxFXSlcCisgICAgICBzb2FwX29wZW5fbG9nZmlsZShzb2FwLCBTT0FQX0lOREVYXyMjREJHRklMRSk7XAorICAgIGlmIChzb2FwLT5mZGVidWdbU09BUF9JTkRFWF8jI0RCR0ZJTEVdKVwKKyAgICB7IGludCBpOyBjaGFyICpzO1wKKyAgICAgIGZvciAocyA9IChjaGFyKikoTVNHKSwgaSA9IChMRU4pOyBpOyBpLS0pXAorICAgICAgICBmcHJpbnRmKHNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYXyMjREJHRklMRV0sICIlMi4yaGhYICAiLCAqcysrKTtcCisgICAgICBmZmx1c2goc29hcC0+ZmRlYnVnW1NPQVBfSU5ERVhfIyNEQkdGSUxFXSk7XAorICAgIH1cCisgIH1cCit9CisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgREJHTE9HKERCR0ZJTEUsIENNRCkKKyMgZGVmaW5lIERCR01TRyhEQkdGSUxFLCBNU0csIExFTikKKyMgZGVmaW5lIERCR0ZVTihGTkFNRSkKKyMgZGVmaW5lIERCR0ZVTjEoRk5BTUUsIEZNVCwgQVJHKQorIyBkZWZpbmUgREJHRlVOMihGTkFNRSwgRk1UMSwgQVJHMSwgRk1UMiwgQVJHMikKKyMgZGVmaW5lIERCR0ZVTjMoRk5BTUUsIEZNVDEsIEFSRzEsIEZNVDIsIEFSRzIsIEZNVDMsIEFSRzMpCisjIGRlZmluZSBEQkdIRVgoREJHRklMRSwgTVNHLCBMRU4pCisjZW5kaWYKKworLyogVUNTLTQgcmVxdWlyZXMgMzIgYml0cyAoMC03RkZGRkZGRiwgdGhlIHNpZ24gYml0IGlzIHVzZWQgYnkgZ1NPQVAgdG8gZGlzdGluZ3Vpc2ggWE1MIGVudGl0aWVzKSAqLwordHlwZWRlZiBzb2FwX2ludDMyIHNvYXBfd2NoYXI7CisKKy8qIG5hbWVzcGFjZSB0YWJsZSByb3cgKi8KK3N0cnVjdCBOYW1lc3BhY2UKK3sgY29uc3QgY2hhciAqaWQ7CisgIGNvbnN0IGNoYXIgKm5zOworICBjb25zdCBjaGFyICppbjsKKyAgY2hhciAqb3V0OworfTsKKworLyogbmFtZXNwYWNlIHN0YWNrICovCitzdHJ1Y3Qgc29hcF9ubGlzdAoreyBzdHJ1Y3Qgc29hcF9ubGlzdCAqbmV4dDsKKyAgdW5zaWduZWQgaW50IGxldmVsOyAvKiBuZXN0aW5nIGRlcHRoIGxldmVsICovCisgIHNob3J0IGluZGV4OyAvKiBjb3JyZXNwb25kaW5nIGVudHJ5IGluIG5zIG1hcHBpbmcgdGFibGUgKi8KKyAgY2hhciAqbnM7IC8qIG9ubHkgc2V0IHdoZW4gcGFyc2VkIG5zIFVSSSBpcyBub3QgaW4gdGhlIG5zIG1hcHBpbmcgdGFibGUgKi8KKyAgY2hhciBpZFsxXTsgLyogdGhlIGFjdHVhbCBzdHJpbmcgdmFsdWUgZmxvd3MgaW50byB0aGUgYWxsb2NhdGVkIHJlZ2lvbiBiZWxvdyB0aGlzIHN0cnVjdCAqLworfTsKKworLyogYmxvY2sgc3RhY2sgZm9yIG5lc3RlZCBibG9jayBhbGxvY2F0aW9ucyAqLworc3RydWN0IHNvYXBfYmxpc3QKK3sgc3RydWN0IHNvYXBfYmxpc3QgKm5leHQ7CisgIGNoYXIgKnB0cjsKKyAgc2l6ZV90IHNpemU7Cit9OworCisvKiBhcnJheSBsYXlvdXQgKi8KK3N0cnVjdCBzb2FwX2FycmF5Cit7IHZvaWQgKl9fcHRyOworICBpbnQgX19zaXplOworfTsKKworLyogcG9pbnRlciBzZXJpYWxpemF0aW9uIG1hbmFnZW1lbnQgKi8KK3N0cnVjdCBzb2FwX3BsaXN0Cit7IHN0cnVjdCBzb2FwX3BsaXN0ICpuZXh0OworICBjb25zdCB2b2lkICpwdHI7CisgIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphcnJheTsKKyAgaW50IHR5cGU7CisgIGludCBpZDsKKyAgY2hhciBtYXJrMTsKKyAgY2hhciBtYXJrMjsKK307CisKKy8qIGJsb2NrIGFsbG9jYXRpb24gZm9yIHBvaW50ZXIgc2VyaWFsaXphdGlvbiBtYW5hZ2VtZW50ICovCitzdHJ1Y3Qgc29hcF9wYmxrCit7IHN0cnVjdCBzb2FwX3BibGsgKm5leHQ7CisgIHN0cnVjdCBzb2FwX3BsaXN0IHBsaXN0W1NPQVBfUFRSQkxLXTsKK307CisKKyNpZmRlZiBTT0FQX0RFQlVHCisvKiBtYWxsb2MvZnJlZSB0cmFja2luZyBmb3IgZGVidWdnaW5nICovCitzdHJ1Y3Qgc29hcF9tbGlzdAoreyBzdHJ1Y3Qgc29hcF9tbGlzdCAqbmV4dDsKKyAgY29uc3Qgdm9pZCAqcHRyOworICBjb25zdCBjaGFyICpmaWxlOworICBpbnQgbGluZTsKKyAgc2hvcnQgbGl2ZTsKK307CisjZW5kaWYKKworLyogY2xhc3MgYWxsb2NhdGlvbiBsaXN0ICovCitzdHJ1Y3Qgc29hcF9jbGlzdAoreyBzdHJ1Y3Qgc29hcF9jbGlzdCAqbmV4dDsKKyAgdm9pZCAqcHRyOworICBpbnQgdHlwZTsKKyAgaW50IHNpemU7CisgIHZvaWQgKCpmZGVsZXRlKShzdHJ1Y3Qgc29hcF9jbGlzdCopOworfTsKKworLyogYXR0cmlidXRlcyAqLworc3RydWN0IHNvYXBfYXR0cmlidXRlCit7IHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqbmV4dDsKKyAgY2hhciAqdmFsdWU7CisgIHNpemVfdCBzaXplOworICBjaGFyICpuczsKKyAgc2hvcnQgdmlzaWJsZTsKKyAgY2hhciBuYW1lWzFdOyAvKiB0aGUgYWN0dWFsIG5hbWUgc3RyaW5nIGZsb3dzIGludG8gdGhlIGFsbG9jYXRlZCByZWdpb24gYmVsb3cgdGhpcyBzdHJ1Y3QgKi8KK307CisKK3N0cnVjdCBzb2FwX2Nvb2tpZQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKm5leHQ7CisgIGNoYXIgKm5hbWU7CisgIGNoYXIgKnZhbHVlOworICBjaGFyICpkb21haW47CisgIGNoYXIgKnBhdGg7CisgIGxvbmcgZXhwaXJlOwkJLyogY2xpZW50LXNpZGU6IGxvY2FsIHRpbWUgdG8gZXhwaXJlOyBzZXJ2ZXItc2lkZTogc2Vjb25kcyB0byBleHBpcmUgKi8KKyAgdW5zaWduZWQgaW50IHZlcnNpb247CisgIHNob3J0IHNlY3VyZTsKKyAgc2hvcnQgc2Vzc2lvbjsJLyogc2VydmVyLXNpZGUgKi8KKyAgc2hvcnQgZW52OwkJLyogc2VydmVyLXNpZGU6IGdvdCBjb29raWUgZnJvbSBjbGllbnQgYW5kIHNob3VsZCBub3QgYmUgKHJlKXNlbmQgKi8KKyAgc2hvcnQgbW9kaWZpZWQ7CS8qIHNlcnZlci1zaWRlOiBjbGllbnQgY29va2llIHdhcyBtb2RpZmllZCBhbmQgc2hvdWxkIGJlIHNlbmQgKi8KK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqIFNPQVBfRk1BQzIgc29hcF9uZXh0X211bHRpcGFydChzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKTsKKworY2xhc3Mgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3IKK3sgcHVibGljOgorICBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBzb2FwX211bHRpcGFydF9pdGVyYXRvciYgaXRlcikgY29uc3QKKyAgICB7IHJldHVybiBjb250ZW50ID09IGl0ZXIuY29udGVudDsgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3Qgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3ImIGl0ZXIpIGNvbnN0CisgICAgeyByZXR1cm4gY29udGVudCAhPSBpdGVyLmNvbnRlbnQ7IH0KKyAgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICZvcGVyYXRvciooKSBjb25zdAorICAgIHsgcmV0dXJuICpjb250ZW50OyB9CisgIHNvYXBfbXVsdGlwYXJ0X2l0ZXJhdG9yICZvcGVyYXRvcisrKCkKKyAgICB7IGNvbnRlbnQgPSBzb2FwX25leHRfbXVsdGlwYXJ0KGNvbnRlbnQpOyByZXR1cm4gKnRoaXM7IH0KKyAgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3IoKSA6IGNvbnRlbnQoTlVMTCkKKyAgICB7IH0KKyAgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3Ioc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpwKSA6IGNvbnRlbnQocCkKKyAgICB7IH0KK307CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU5FUgorc3RydWN0IHNvYXBfZGltZQoreyBzaXplX3QgY291bnQ7CisgIHNpemVfdCBzaXplOworICBzaXplX3QgY2h1bmtzaXplOworICBzaXplX3QgYnVmbGVuOworICBjaGFyIGZsYWdzOworICBjaGFyICpwdHI7CisgIGNvbnN0IGNoYXIgKmlkOworICBjb25zdCBjaGFyICp0eXBlOworICBjb25zdCBjaGFyICpvcHRpb25zOworICBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmxpc3Q7CQkvKiBsaXN0IG9mIERJTUUgYXR0YWNobWVudHMgcmVjZWl2ZWQgKi8KKyAgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpmaXJzdCwgKmxhc3Q7CS8qIHRlbXBvcmFyeSBpbi9vdXQgcXVldWUgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworICBzb2FwX211bHRpcGFydF9pdGVyYXRvciBiZWdpbigpCisgICAgeyBzb2FwX211bHRpcGFydF9pdGVyYXRvciBpdGVyKGxpc3QpOyByZXR1cm4gaXRlcjsgfTsKKyAgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3IgZW5kKCkKKyAgICB7IHNvYXBfbXVsdGlwYXJ0X2l0ZXJhdG9yIGl0ZXIoTlVMTCk7IHJldHVybiBpdGVyOyB9OworI2VuZGlmCit9OworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK3N0cnVjdCBzb2FwX21pbWUKK3sgY2hhciAqYm91bmRhcnk7CQkJLyogTUlNRSBib3VuZGFyeSAqLworICBjb25zdCBjaGFyICpzdGFydDsJCQkvKiBNSU1FIHN0YXJ0IElEICovCisgIHN0cnVjdCBzb2FwX211bHRpcGFydCAqbGlzdDsJCS8qIGxpc3Qgb2YgTUlNRSBhdHRhY2htZW50cyByZWNlaXZlZCAqLworICBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmZpcnN0LCAqbGFzdDsJLyogdGVtcG9yYXJ5IGluL291dCBxdWV1ZSAqLworI2lmZGVmIF9fY3BsdXNwbHVzCisgIHNvYXBfbXVsdGlwYXJ0X2l0ZXJhdG9yIGJlZ2luKCkKKyAgICB7IHNvYXBfbXVsdGlwYXJ0X2l0ZXJhdG9yIGl0ZXIobGlzdCk7IHJldHVybiBpdGVyOyB9OworICBzb2FwX211bHRpcGFydF9pdGVyYXRvciBlbmQoKQorICAgIHsgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3IgaXRlcihOVUxMKTsgcmV0dXJuIGl0ZXI7IH07CisjZW5kaWYKK307CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU5FUgorLyogUkZDMjA0NSBNSU1FIGNvbnRlbnQgdHJhbnNmZXIgZW5jb2RpbmdzICovCitlbnVtIHNvYXBfbWltZV9lbmNvZGluZworeyBTT0FQX01JTUVfTk9ORSwKKyAgU09BUF9NSU1FXzdCSVQsCisgIFNPQVBfTUlNRV84QklULAorICBTT0FQX01JTUVfQklOQVJZLAorICBTT0FQX01JTUVfUVVPVEVEX1BSSU5UQUJMRSwKKyAgU09BUF9NSU1FX0JBU0U2NCwKKyAgU09BUF9NSU1FX0lFVEZfVE9LRU4sCisgIFNPQVBfTUlNRV9YX1RPS0VOCit9OworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKKy8qIERJTUUvTUlNRSBtdWx0aXBhcnQgbGlzdCAqLworc3RydWN0IHNvYXBfbXVsdGlwYXJ0Cit7IHN0cnVjdCBzb2FwX211bHRpcGFydCAqbmV4dDsKKyAgY2hhciAqcHRyOwkJCQkvKiBwb2ludHMgdG8gcmF3IGRhdGEgY29udGVudCAqLworICBzaXplX3Qgc2l6ZTsJCQkJLyogc2l6ZSBvZiBkYXRhIGNvbnRlbnQgKi8KKyAgY29uc3QgY2hhciAqaWQ7CQkJLyogRElNRS9NSU1FIGNvbnRlbnQgSUQgb3IgZm9ybSBkYXRhIG5hbWUgKi8KKyAgY29uc3QgY2hhciAqdHlwZTsJCQkvKiBESU1FL01JTUUgdHlwZSAoTUlNRSB0eXBlIGZvcm1hdCkgKi8KKyAgY29uc3QgY2hhciAqb3B0aW9uczsJCQkvKiBESU1FIG9wdGlvbnMgKi8KKyAgZW51bSBzb2FwX21pbWVfZW5jb2RpbmcgZW5jb2Rpbmc7CS8qIE1JTUUgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyAqLworICBjb25zdCBjaGFyICpsb2NhdGlvbjsJCQkvKiBNSU1FIENvbnRlbnQtTG9jYXRpb24gKG9wdGlvbmFsKSAqLworICBjb25zdCBjaGFyICpkZXNjcmlwdGlvbjsJCS8qIE1JTUUgQ29udGVudC1EZXNjcmlwdGlvbiAob3B0aW9uYWwpICovCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgdHlwZWRlZiBzb2FwX211bHRpcGFydF9pdGVyYXRvciBpdGVyYXRvcjsKKyNlbmRpZgorfTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTkVSCisvKiBhdHRhY2htZW50IERJTUUgYW5kIE1UT00gWE9QIGZvcndhcmRpbmcgKi8KK3N0cnVjdCBzb2FwX3hsaXN0Cit7IHN0cnVjdCBzb2FwX3hsaXN0ICpuZXh0OworICB1bnNpZ25lZCBjaGFyICoqcHRyOworICBpbnQgKnNpemU7CisgIGNoYXIgKmlkOworICBjaGFyICoqdHlwZTsKKyAgY2hhciAqKm9wdGlvbnM7Cit9OworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZmRlZiBfX2NwbHVzcGx1cworY2xhc3Mgc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yCit7IHB1YmxpYzoKKyAgc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAqYXR0OworICBjb25zdCBjaGFyICpuc3RyOworICBjb25zdCBjaGFyICpuYW1lOworICBib29sIG9wZXJhdG9yPT0oY29uc3Qgc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3ImKSBjb25zdDsKKyAgc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAmb3BlcmF0b3IqKCkgY29uc3Q7CisgIHNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvciAmb3BlcmF0b3IrKygpOworICBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IoKTsKKyAgc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUqKTsKKyAgfnNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcigpOworfTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK3N0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUKK3sgc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAqbmV4dDsKKyAgY29uc3QgY2hhciAqbnN0cjsKKyAgY2hhciAqbmFtZTsKKyAgY2hhciAqZGF0YTsKKyAgd2NoYXJfdCAqd2lkZTsKKyAgc3RydWN0IHNvYXAgKnNvYXA7CisjaWZkZWYgX19jcGx1c3BsdXMKKyAgdHlwZWRlZiBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IgaXRlcmF0b3I7CisgIHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgJnNldChjb25zdCBjaGFyICpuc3RyLCBjb25zdCBjaGFyICpuYW1lKTsJLyogc2V0IG5hbWVzcGFjZSBhbmQgbmFtZSAqLworICBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICZzZXQoY29uc3QgY2hhciAqZGF0YSk7CQkvKiBzZXQgZGF0YSAqLworICBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IgYmVnaW4oKTsKKyAgc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yIGVuZCgpOworICBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IgZmluZChjb25zdCBjaGFyICpuc3RyLCBjb25zdCBjaGFyICpuYW1lKTsKKyAgdm9pZCB1bmxpbmsoKTsKKyAgc29hcF9kb21fYXR0cmlidXRlKCk7CisgIHNvYXBfZG9tX2F0dHJpYnV0ZShzdHJ1Y3Qgc29hcCAqc29hcCk7CisgIHNvYXBfZG9tX2F0dHJpYnV0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbnN0ciwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZGF0YSk7CisgIH5zb2FwX2RvbV9hdHRyaWJ1dGUoKTsKKyNlbmRpZgorfTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZkZWYgX19jcGx1c3BsdXMKK2NsYXNzIHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IKK3sgcHVibGljOgorICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqZWx0OworICBjb25zdCBjaGFyICpuc3RyOworICBjb25zdCBjaGFyICpuYW1lOworICBpbnQgdHlwZTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3ImKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3ImKSBjb25zdDsKKyAgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgJm9wZXJhdG9yKigpIGNvbnN0OworICBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yICZvcGVyYXRvcisrKCk7CisgIHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IoKTsKKyAgc29hcF9kb21fZWxlbWVudF9pdGVyYXRvcihzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCopOworICB+c29hcF9kb21fZWxlbWVudF9pdGVyYXRvcigpOworfTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK3N0cnVjdCBzb2FwX2RvbV9lbGVtZW50Cit7IHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICpuZXh0OwkvKiBuZXh0IHNpYmxpbmcgKi8KKyAgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKnBybnQ7CS8qIHBhcmVudCAqLworICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqZWx0czsJLyogbGlzdCBvZiBjaGlsZCBlbGVtZW50cyAqLworICBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICphdHRzOwkvKiBsaXN0IG9mIGF0dHJpYnV0ZXMgKi8KKyAgY29uc3QgY2hhciAqbnN0cjsJCQkvKiBuYW1lc3BhY2Ugc3RyaW5nICovCisgIGNoYXIgKm5hbWU7CQkJCS8qIGVsZW1lbnQgdGFnIG5hbWUgKi8KKyAgY2hhciAqZGF0YTsJCQkJLyogZWxlbWVudCBjb250ZW50IGRhdGEgKHdpdGggU09BUF9DX1VURlNUUklORyBmbGFnIHNldCkgKi8KKyAgd2NoYXJfdCAqd2lkZTsJCQkvKiBlbGVtZW50IGNvbnRlbnQgZGF0YSAqLworICBpbnQgdHlwZTsJCQkJLyogb3B0aW9uYWw6IHNlcmlhbGl6ZWQgQy9DKysgZGF0YSB0eXBlICovCisgIHZvaWQgKm5vZGU7CQkJCS8qIG9wdGlvbmFsOiBwb2ludGVyIHRvIHNlcmlhbGl6ZWQgQy9DKysgZGF0YSAqLworICBjaGFyICpoZWFkOwkJCQkvKiBsZWFkaW5nIHdoaXRlc3BhY2UgdG8gc3RhcnQgdGFnICovCisgIGNoYXIgKnRhaWw7CQkJCS8qIGxlYWRpbmcgd2hpdGVzcGFjZSB0byBlbmQgdGFnICovCisgIHN0cnVjdCBzb2FwICpzb2FwOwkJCS8qIHNvYXAgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBub2RlICovCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgdHlwZWRlZiBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yIGl0ZXJhdG9yOworICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAmc2V0KGNvbnN0IGNoYXIgKm5zdHIsIGNvbnN0IGNoYXIgKm5hbWUpOworICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAmc2V0KGNvbnN0IGNoYXIgKmRhdGEpOworICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAmc2V0KHZvaWQgKm5vZGUsIGludCB0eXBlKTsKKyAgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgJmFkZChzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCopOworICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAmYWRkKHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50Jik7CisgIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICZhZGQoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSopOworICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAmYWRkKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUmKTsKKyAgc29hcF9kb21fZWxlbWVudF9pdGVyYXRvciBiZWdpbigpOworICBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yIGVuZCgpOworICBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yIGZpbmQoY29uc3QgY2hhciAqbnN0ciwgY29uc3QgY2hhciAqbmFtZSk7CisgIHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IgZmluZChpbnQgdHlwZSk7CisgIHZvaWQgdW5saW5rKCk7CisgIHNvYXBfZG9tX2VsZW1lbnQoKTsKKyAgc29hcF9kb21fZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCk7CisgIHNvYXBfZG9tX2VsZW1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5zdHIsIGNvbnN0IGNoYXIgKm5hbWUpOworICBzb2FwX2RvbV9lbGVtZW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuc3RyLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkYXRhKTsKKyAgc29hcF9kb21fZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbnN0ciwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqbm9kZSwgaW50IHR5cGUpOworICB+c29hcF9kb21fZWxlbWVudCgpOworI2VuZGlmCit9OworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqIFNPQVBfRk1BQzIgc29hcF9kb21fbmV4dF9lbGVtZW50KHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICplbHQpOworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICogU09BUF9GTUFDMiBzb2FwX2RvbV9uZXh0X2F0dHJpYnV0ZShzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICphdHQpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiAhZGVmaW5lZChXSVRIX0xFQU4pCit9CitleHRlcm4gc3RkOjpvc3RyZWFtICZvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYsIGNvbnN0IHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50Jik7CitleHRlcm4gc3RkOjppc3RyZWFtICZvcGVyYXRvcj4+KHN0ZDo6aXN0cmVhbSYsIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50Jik7CitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3Qgc29hcAoreyBzaG9ydCBzdGF0ZTsJCQkvKiAwID0gdW5pbml0aWFsaXplZCwgMSA9IGluaXRpYWxpemVkLCAyID0gY29weSBvZiBhbm90aGVyIHNvYXAgc3RydWN0ICovCisgIHNob3J0IHZlcnNpb247CQkvKiAxID0gU09BUDEuMSBhbmQgMiA9IFNPQVAxLjIgKHNldCBhdXRvbWF0aWNhbGx5IGZyb20gbmFtZXNwYWNlIFVSSSBpbiBuc21hcCB0YWJsZSkgKi8KKyAgc29hcF9tb2RlIG1vZGU7CisgIHNvYXBfbW9kZSBpbW9kZTsKKyAgc29hcF9tb2RlIG9tb2RlOworICBjb25zdCBjaGFyICpmbG9hdF9mb3JtYXQ7CS8qIHVzZXItZGVmaW5hYmxlIGZvcm1hdCBzdHJpbmcgZm9yIGZsb2F0cyAoPDEwMjQgY2hhcnMpICovCisgIGNvbnN0IGNoYXIgKmRvdWJsZV9mb3JtYXQ7CS8qIHVzZXItZGVmaW5hYmxlIGZvcm1hdCBzdHJpbmcgZm9yIGRvdWJsZXMgKDwxMDI0IGNoYXJzKSAqLworICBjb25zdCBjaGFyICpkaW1lX2lkX2Zvcm1hdDsJLyogdXNlci1kZWZpbmFibGUgZm9ybWF0IHN0cmluZyBmb3IgaW50ZWdlciBESU1FIGlkICg8U09BUF9UQUdMRU4gY2hhcnMpICovCisgIGNvbnN0IGNoYXIgKmh0dHBfdmVyc2lvbjsJLyogSFRUUCB2ZXJzaW9uIHVzZWQgIjEuMCIgb3IgIjEuMSIgKi8KKyAgY29uc3QgY2hhciAqaHR0cF9jb250ZW50OwkvKiBvcHRpb25hbCBjdXN0b20gcmVzcG9uc2UgY29udGVudCB0eXBlICh3aXRoIFNPQVBfRklMRSkgKi8KKyAgY29uc3QgY2hhciAqZW5jb2RpbmdTdHlsZTsJLyogZGVmYXVsdCA9IE5VTEwgd2hpY2ggbWVhbnMgdGhhdCBTT0FQIGVuY29kaW5nIGlzIHVzZWQgKi8KKyAgY29uc3QgY2hhciAqYWN0b3I7CQkvKiBTT0FQLUVOVjphY3RvciBvciByb2xlIGF0dHJpYnV0ZSB2YWx1ZSAqLworICBpbnQgcmVjdl90aW1lb3V0OwkJLyogd2hlbiA+IDAsIGdpdmVzIHNvY2tldCByZWN2IHRpbWVvdXQgaW4gc2Vjb25kcywgPCAwIGluIHVzZWMgKi8KKyAgaW50IHNlbmRfdGltZW91dDsJCS8qIHdoZW4gPiAwLCBnaXZlcyBzb2NrZXQgc2VuZCB0aW1lb3V0IGluIHNlY29uZHMsIDwgMCBpbiB1c2VjICovCisgIGludCBjb25uZWN0X3RpbWVvdXQ7CQkvKiB3aGVuID4gMCwgZ2l2ZXMgc29ja2V0IGNvbm5lY3QoKSB0aW1lb3V0IGluIHNlY29uZHMsIDwgMCBpbiB1c2VjICovCisgIGludCBhY2NlcHRfdGltZW91dDsJCS8qIHdoZW4gPiAwLCBnaXZlcyBzb2NrZXQgYWNjZXB0KCkgdGltZW91dCBpbiBzZWNvbmRzLCA8IDAgaW4gdXNlYyAqLworICBpbnQgc29ja2V0X2ZsYWdzOwkJLyogc29ja2V0IHJlY3YoKSBhbmQgc2VuZCgpIGZsYWdzLCBlLmcuIHNldCB0byBNU0dfTk9TSUdOQUwgdG8gZGlzYWJsZSBzaWdwaXBlICovCisgIGludCBjb25uZWN0X2ZsYWdzOwkJLyogY29ubmVjdCgpIFNPTF9TT0NLRVQgc29ja29wdCBmbGFncywgZS5nLiBzZXQgdG8gU09fREVCVUcgdG8gZGVidWcgc29ja2V0ICovCisgIGludCBiaW5kX2ZsYWdzOwkJLyogYmluZCgpIFNPTF9TT0NLRVQgc29ja29wdCBmbGFncywgZS5nLiBzZXQgdG8gU09fUkVVU0VBRERSIHRvIGVuYWJsZSByZXVzZSAqLworICBpbnQgYWNjZXB0X2ZsYWdzOwkJLyogYWNjZXB0KCkgU09MX1NPQ0tFVCBzb2Nrb3B0IGZsYWdzICovCisgIGNvbnN0IHN0cnVjdCBOYW1lc3BhY2UgKm5hbWVzcGFjZXM7CS8qIFBvaW50ZXIgdG8gZ2xvYmFsIG5hbWVzcGFjZSBtYXBwaW5nIHRhYmxlICovCisgIHN0cnVjdCBOYW1lc3BhY2UgKmxvY2FsX25hbWVzcGFjZXM7CS8qIExvY2FsIG5hbWVzcGFjZSBtYXBwaW5nIHRhYmxlICovCisgIHN0cnVjdCBzb2FwX25saXN0ICpubGlzdDsJLyogbmFtZXNwYWNlIHN0YWNrICovCisgIHN0cnVjdCBzb2FwX2JsaXN0ICpibGlzdDsJLyogYmxvY2sgYWxsb2NhdGlvbiBzdGFjayAqLworICBzdHJ1Y3Qgc29hcF9jbGlzdCAqY2xpc3Q7CS8qIGNsYXNzIGluc3RhbmNlIGFsbG9jYXRpb24gbGlzdCAqLworICB2b2lkICphbGlzdDsJCQkvKiBtZW1vcnkgYWxsb2NhdGlvbiAobWFsbG9jKSBsaXN0ICovCisgIHN0cnVjdCBzb2FwX2lsaXN0ICppaHRbU09BUF9JREhBU0hdOworICBzdHJ1Y3Qgc29hcF9wbGlzdCAqcGh0W1NPQVBfUFRSSEFTSF07CisgIHN0cnVjdCBzb2FwX3BibGsgKnBibGs7CS8qIHBsaXN0IGJsb2NrIGFsbG9jYXRpb24gKi8KKyAgc2hvcnQgcGlkeDsJCQkvKiBwbGlzdCBibG9jayBhbGxvY2F0aW9uICovCisgIHN0cnVjdCBTT0FQX0VOVl9fSGVhZGVyICpoZWFkZXI7CisgIHN0cnVjdCBTT0FQX0VOVl9fRmF1bHQgKmZhdWx0OworICBpbnQgaWRudW07CisgIHZvaWQgKnVzZXI7CQkJLyogdG8gcGFzcyB1c2VyLWRlZmluZWQgZGF0YSAqLworICBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnBsdWdpbnM7CS8qIGxpbmtlZCBsaXN0IG9mIHBsdWctaW4gZGF0YSAqLworICBjaGFyICp1c2VyaWQ7CQkJLyogSFRUUCBCYXNpYyBhdXRob3JpemF0aW9uIHVzZXJpZCAqLworICBjaGFyICpwYXNzd2Q7CQkJLyogSFRUUCBCYXNpYyBhdXRob3JpemF0aW9uIHBhc3N3ZCAqLworICBpbnQgKCpmcG9zdCkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworICBpbnQgKCpmZ2V0KShzdHJ1Y3Qgc29hcCopOworICBpbnQgKCpmZm9ybSkoc3RydWN0IHNvYXAqKTsKKyAgaW50ICgqZnBvc3RoZHIpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKyAgaW50ICgqZnJlc3BvbnNlKShzdHJ1Y3Qgc29hcCosIGludCwgc2l6ZV90KTsKKyAgaW50ICgqZnBhcnNlKShzdHJ1Y3Qgc29hcCopOworICBpbnQgKCpmcGFyc2VoZHIpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKyAgaW50ICgqZnJlc29sdmUpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHN0cnVjdCBpbl9hZGRyKiBpbmFkZHIpOworICBpbnQgKCpmY29ubmVjdCkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGludCk7CisgIGludCAoKmZkaXNjb25uZWN0KShzdHJ1Y3Qgc29hcCopOworICBpbnQgKCpmY2xvc2Vzb2NrZXQpKHN0cnVjdCBzb2FwKiwgU09BUF9TT0NLRVQpOworICBpbnQgKCpmc2h1dGRvd25zb2NrZXQpKHN0cnVjdCBzb2FwKiwgU09BUF9TT0NLRVQsIGludCk7CisgIGludCAoKmZvcGVuKShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgaW50KTsKKyAgaW50ICgqZmFjY2VwdCkoc3RydWN0IHNvYXAqLCBpbnQsIHN0cnVjdCBzb2NrYWRkciosIGludCAqbik7CisgIGludCAoKmZjbG9zZSkoc3RydWN0IHNvYXAqKTsKKyAgaW50ICgqZnNlbmQpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHNpemVfdCk7CisgIHNpemVfdCAoKmZyZWN2KShzdHJ1Y3Qgc29hcCosIGNoYXIqLCBzaXplX3QpOworICBpbnQgKCpmcG9sbCkoc3RydWN0IHNvYXAqKTsKKyAgdm9pZCAoKmZzZXRlcnJvcikoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICoqYywgY29uc3QgY2hhciAqKnMpOworICBpbnQgKCpmaWdub3JlKShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKKyAgaW50ICgqZnNlcnZlbG9vcCkoc3RydWN0IHNvYXAqKTsKKyAgdm9pZCAqKCpmcGx1Z2luKShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaW50ICgqZnByZXBhcmVpbml0KShzdHJ1Y3Qgc29hcCopOworICBpbnQgKCpmcHJlcGFyZXNlbmQpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHNpemVfdCk7CisgIGludCAoKmZwcmVwYXJlcmVjdikoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc2l6ZV90KTsKKyAgaW50ICgqZnByZXBhcmVmaW5hbCkoc3RydWN0IHNvYXAqKTsKKyAgdm9pZCAqKCpmZGltZXJlYWRvcGVuKShzdHJ1Y3Qgc29hcCosIHZvaWQqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKyAgdm9pZCAqKCpmZGltZXdyaXRlb3Blbikoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKyAgdm9pZCAoKmZkaW1lcmVhZGNsb3NlKShzdHJ1Y3Qgc29hcCosIHZvaWQqKTsKKyAgdm9pZCAoKmZkaW1ld3JpdGVjbG9zZSkoc3RydWN0IHNvYXAqLCB2b2lkKik7CisgIHNpemVfdCAoKmZkaW1lcmVhZCkoc3RydWN0IHNvYXAqLCB2b2lkKiwgY2hhciosIHNpemVfdCk7CisgIGludCAoKmZkaW1ld3JpdGUpKHN0cnVjdCBzb2FwKiwgdm9pZCosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworI2VuZGlmCisgIGludCBtYXN0ZXI7CisgIGludCBzb2NrZXQ7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgIWRlZmluZWQoV0lUSF9MRUFOKQorICBzdGQ6Om9zdHJlYW0gKm9zOworICBzdGQ6OmlzdHJlYW0gKmlzOworI2Vsc2UKKyAgdm9pZCAqb3M7CS8qIHByZXNlcnZlIGFsaWdubWVudCAqLworICB2b2lkICppczsJLyogcHJlc2VydmUgYWxpZ25tZW50ICovCisjZW5kaWYKKyNpZm5kZWYgVU5ERVJfQ0UKKyAgaW50IHNlbmRmZDsKKyAgaW50IHJlY3ZmZDsKKyNlbHNlCisgIEZJTEUgKnNlbmRmZDsKKyAgRklMRSAqcmVjdmZkOworI2VuZGlmCisjaWZkZWYgV0lOMzIKKyAgY2hhciBlcnJvcnN0clsyNTZdOwkvKiBidWYgZm9yIEZvcm1hdE1lc3NhZ2UoKSAqLworI2VuZGlmCisgIHNpemVfdCBidWZpZHg7CS8qIGluZGV4IGluIHNvYXAuYnVmW10gKi8KKyAgc2l6ZV90IGJ1ZmxlbjsJLyogbGVuZ3RoIG9mIHNvYXAuYnVmW10gY29udGVudCAqLworICBzb2FwX3djaGFyIGFoZWFkOwkvKiBwYXJzZXIgbG9va2FoZWFkICovCisgIHNob3J0IGNkYXRhOwkJLyogQ0RBVEEgcGFyc2VyIHN0YXRlICovCisgIHNob3J0IGJvZHk7CQkvKiBwYXJzZWQgWE1MIGVsZW1lbnQgaGFzIGEgYm9keSBvciBub3QgKi8KKyAgdW5zaWduZWQgaW50IGxldmVsOwkvKiBYTUwgbmVzdGluZyBsZXZlbCAqLworICBzaXplX3QgY291bnQ7CQkvKiBtZXNzYWdlIGxlbmd0aCBjb3VudGVyICovCisgIHNpemVfdCBsZW5ndGg7CS8qIG1lc3NhZ2UgbGVuZ3RoIGFzIHNldCBieSBIVFRQIGhlYWRlciAqLworI2lmZGVmIFdJVEhfRkFTVAorICBjaGFyICpsYWJidWY7CQkvKiBsb29rLWFzaWRlIGJ1ZmZlciAqLworICBzaXplX3QgbGFibGVuOwkvKiBsb29rLWFzaWRlIGJ1ZmZlciBhbGxvY2F0ZWQgbGVuZ3RoICovCisgIHNpemVfdCBsYWJpZHg7CS8qIGxvb2stYXNpZGUgYnVmZmVyIGluZGV4IHRvIGF2YWlsYWJsZSBwYXJ0ICovCisjZW5kaWYKKyAgY2hhciBidWZbU09BUF9CVUZMRU5dOy8qIHNlbmQgYW5kIHJlY2VpdmUgYnVmZmVyICovCisgIGNoYXIgdG1wYnVmWzEwMjRdOwkvKiBpbi9vdXRwdXQgYnVmZmVyIGZvciBIVFRQIGhlYWRlcnMsIHNpbXBsZVR5cGUgdmFsdWVzLCBhdHRyaWJ1dGUgbmFtZXMsIGFuZCBESU1FID49MTAyNCBieXRlcyAqLworICBjaGFyIG1zZ2J1ZlsxMDI0XTsJLyogb3V0cHV0IGJ1ZmZlciBmb3IgKGVycm9yKSBtZXNzYWdlcyA8PTEwMjQgYnl0ZXMgKi8KKyAgY2hhciB0YWdbU09BUF9UQUdMRU5dOworICBjaGFyIGlkW1NPQVBfVEFHTEVOXTsKKyAgY2hhciBocmVmW1NPQVBfVEFHTEVOXTsKKyAgY2hhciB0eXBlW1NPQVBfVEFHTEVOXTsKKyAgY2hhciBhcnJheVR5cGVbU09BUF9UQUdMRU5dOworICBjaGFyIGFycmF5U2l6ZVtTT0FQX1RBR0xFTl07CisgIGNoYXIgYXJyYXlPZmZzZXRbU09BUF9UQUdMRU5dOworICBzaG9ydCBvdGhlcjsKKyAgc2hvcnQgcG9zaXRpb247CisgIGludCBwb3NpdGlvbnNbU09BUF9NQVhESU1TXTsKKyAgc2hvcnQgcm9vdDsKKyAgc3RydWN0IHNvYXBfYXR0cmlidXRlICphdHRyaWJ1dGVzOwkvKiBhdHRyaWJ1dGUgbGlzdCAqLworICBzaG9ydCBlbmNvZGluZzsJLyogd2hlbiBzZXQsIG91dHB1dCBlbmNvZGluZ1N0eWxlICovCisgIHNob3J0IG11c3RVbmRlcnN0YW5kOwkvKiBhIG11c3RVbmRlcnN0YW5kIGVsZW1lbnQgd2FzIHBhcnNlZCBvciBpcyBvdXRwdXQgKi8KKyAgc2hvcnQga2VlcF9hbGl2ZTsJLyogY29ubmVjdGlvbiBzaG91bGQgYmUga2VwdCBvcGVuICovCisgIHNob3J0IG51bGw7CQkvKiBwYXJzZWQgWE1MIGlzIHhzaTpuaWwgKi8KKyAgc2hvcnQgbnM7CQkvKiB3aGVuIG5vdCBzZXQsIG91dHB1dCBmdWxsIHhtbG5zIGJpbmRpbmdzICovCisgIHNob3J0IHBhcnQ7CQkvKiBwYXJzaW5nIHN0YXRlICovCisgIHNob3J0IGFsbG9jZWQ7CisgIHNob3J0IHBlZWtlZDsKKyAgc2l6ZV90IGNodW5rc2l6ZTsKKyAgc2l6ZV90IGNodW5rYnVmbGVuOworICBjaGFyIGVuZHBvaW50W1NPQVBfVEFHTEVOXTsKKyAgY2hhciBwYXRoW1NPQVBfVEFHTEVOXTsKKyAgY2hhciBob3N0W1NPQVBfVEFHTEVOXTsKKyAgY2hhciAqYWN0aW9uOworICBjaGFyICphdXRocmVhbG07CQkvKiBIVFRQIGF1dGhlbnRpY2F0aW9uIHJlYWxtICovCisgIGNoYXIgKnByb2xvZzsJCQkvKiBYTUwgZGVjbGFyYXRpb24gcHJvbG9nICovCisgIHVuc2lnbmVkIGxvbmcgaXA7CQkvKiBJUCBudW1iZXIgKi8KKyAgaW50IHBvcnQ7CQkJLyogcG9ydCBudW1iZXIgKi8KKyAgdW5zaWduZWQgaW50IG1heF9rZWVwX2FsaXZlOworICBjb25zdCBjaGFyICpwcm94eV9ob3N0OwkvKiBQcm94eSBTZXJ2ZXIgaG9zdCBuYW1lICovCisgIGludCBwcm94eV9wb3J0OwkJLyogUHJveHkgU2VydmVyIHBvcnQgKGRlZmF1bHQgPSA4MDgwKSAqLworICBjb25zdCBjaGFyICpwcm94eV91c2VyaWQ7CS8qIFByb3h5IEF1dGhvcml6YXRpb24gdXNlciBuYW1lICovCisgIGNvbnN0IGNoYXIgKnByb3h5X3Bhc3N3ZDsJLyogUHJveHkgQXV0aG9yaXphdGlvbiBwYXNzd29yZCAqLworICBpbnQgc3RhdHVzOwkJCS8qIC0xIHdoZW4gcmVxdWVzdCwgZWxzZSBlcnJvciBjb2RlIHRvIGJlIHJldHVybmVkIGJ5IHNlcnZlciAqLworICBpbnQgZXJyb3I7CisgIGludCBlcnJtb2RlOworICBpbnQgZXJybnVtOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqZG9tOworICBzdHJ1Y3Qgc29hcF9kaW1lIGRpbWU7CisgIHN0cnVjdCBzb2FwX21pbWUgbWltZTsKKyAgc3RydWN0IHNvYXBfeGxpc3QgKnhsaXN0OworI2VuZGlmCisjaWYgIWRlZmluZWQoV0lUSF9MRUFOKSB8fCBkZWZpbmVkKFNPQVBfREVCVUcpCisgIGNvbnN0IGNoYXIgKmxvZ2ZpbGVbU09BUF9NQVhMT0dTXTsKKyAgRklMRSAqZmRlYnVnW1NPQVBfTUFYTE9HU107CisgIHN0cnVjdCBzb2FwX21saXN0ICptaHRbU09BUF9QVFJIQVNIXTsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgY29uc3QgY2hhciAqYzE0bmluY2x1ZGU7CisgIGNvbnN0IGNoYXIgKmMxNG5leGNsdWRlOworICBzdHJ1Y3Qgc29hcF9jb29raWUgKmNvb2tpZXM7CisgIGNvbnN0IGNoYXIgKmNvb2tpZV9kb21haW47CisgIGNvbnN0IGNoYXIgKmNvb2tpZV9wYXRoOworICBpbnQgY29va2llX21heDsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZmRlZiBXSVRIX0lQVjYKKyAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgcGVlcjsJLyogSVB2Njogc2V0IGJ5IHNvYXBfYWNjZXB0IGFuZCBieSBVRFAgcmVjdiAqLworI2Vsc2UKKyAgc3RydWN0IHNvY2thZGRyX2luIHBlZXI7CS8qIElQdjQ6IHNldCBieSBzb2FwX2Nvbm5lY3Qvc29hcF9hY2NlcHQgYW5kIGJ5IFVEUCByZWN2ICovCisjZW5kaWYKKyAgc2l6ZV90IHBlZXJsZW47CisjZW5kaWYKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgaW50ICgqZnNzbGF1dGgpKHN0cnVjdCBzb2FwKik7CisgIGludCAoKmZzc2x2ZXJpZnkpKGludCwgWDUwOV9TVE9SRV9DVFgqKTsKKyAgQklPICpiaW87CisgIFNTTCAqc3NsOworICBTU0xfQ1RYICpjdHg7CisgIHNob3J0IHJlcXVpcmVfc2VydmVyX2F1dGg7CisgIHNob3J0IHJlcXVpcmVfY2xpZW50X2F1dGg7CisgIHNob3J0IHJzYTsJCQkvKiB3aGVuIHNldCwgdXNlIFJTQSBpbnN0ZWFkIG9mIERIICovCisgIGNvbnN0IGNoYXIgKmtleWZpbGU7CisgIGNvbnN0IGNoYXIgKnBhc3N3b3JkOworICBjb25zdCBjaGFyICpkaGZpbGU7CisgIGNvbnN0IGNoYXIgKmNhZmlsZTsKKyAgY29uc3QgY2hhciAqY2FwYXRoOworICBjb25zdCBjaGFyICpjcmxmaWxlOworICBjb25zdCBjaGFyICpyYW5kZmlsZTsKKyAgU1NMX1NFU1NJT04gKnNlc3Npb247CisgIGNoYXIgc2Vzc2lvbl9ob3N0W1NPQVBfVEFHTEVOXTsKKyAgaW50IHNlc3Npb25fcG9ydDsKKyNlbmRpZgorI2lmZGVmIFdJVEhfWkxJQgorICBzaG9ydCB6bGliX3N0YXRlOwkJLyogU09BUF9aTElCX05PTkUsIFNPQVBfWkxJQl9ERUZMQVRFLCBvciBTT0FQX1pMSUJfSU5GTEFURSAqLworICBzaG9ydCB6bGliX2luOwkJLyogU09BUF9aTElCX05PTkUsIFNPQVBfWkxJQl9ERUZMQVRFLCBvciBTT0FQX1pMSUJfR1pJUCAqLworICBzaG9ydCB6bGliX291dDsJCS8qIFNPQVBfWkxJQl9OT05FLCBTT0FQX1pMSUJfREVGTEFURSwgb3IgU09BUF9aTElCX0daSVAgKi8KKyAgel9zdHJlYW0gZF9zdHJlYW07CQkvKiBkZWNvbXByZXNzaW9uIHN0cmVhbSAqLworICBjaGFyIHpfYnVmW1NPQVBfQlVGTEVOXTsJLyogYnVmZmVyICovCisgIHNpemVfdCB6X2J1ZmxlbjsKKyAgdW5zaWduZWQgc2hvcnQgel9sZXZlbDsJLyogY29tcHJlc3Npb24gbGV2ZWwgdG8gYmUgdXNlZCAoMD1ub25lLCAxPWZhc3QgdG8gOT1iZXN0KSAqLworICB1TG9uZyB6X2NyYzsJCQkvKiBpbnRlcm5hbCBnemlwIGNyYyAqLworICBmbG9hdCB6X3JhdGlvX2luOwkJLyogZGV0ZWN0ZWQgY29tcHJlc3Npb24gcmF0aW8gY29tcHJlc3NlZF9sZW5ndGgvbGVuZ3RoIG9mIGluYm91bmQgbWVzc2FnZSAqLworICBmbG9hdCB6X3JhdGlvX291dDsJCS8qIGRldGVjdGVkIGNvbXByZXNzaW9uIHJhdGlvIGNvbXByZXNzZWRfbGVuZ3RoL2xlbmd0aCBvZiBvdXRib3VuZCBtZXNzYWdlICovCisjZW5kaWYKKyNpZmRlZiBXTVdfUlBNX0lPCisgIHZvaWQgKnJwbXJlcWlkOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorI2lmZGVmIF9fY3BsdXNwbHVzCisgIHNvYXAoKTsKKyAgc29hcChzb2FwX21vZGUpOworICBzb2FwKHNvYXBfbW9kZSwgc29hcF9tb2RlKTsKKyAgc29hcChzdHJ1Y3Qgc29hcCYpOworICB+c29hcCgpOworI2VuZGlmCisjZW5kaWYKK307CisKK3N0cnVjdCBzb2FwX2NvZGVfbWFwCit7IGxvbmcgY29kZTsKKyAgY29uc3QgY2hhciAqc3RyaW5nOworfTsKKworLyogZm9yd2FyZGluZyBsaXN0ICovCitzdHJ1Y3Qgc29hcF9mbGlzdAoreyBzdHJ1Y3Qgc29hcF9mbGlzdCAqbmV4dDsKKyAgaW50IHR5cGU7CisgIHZvaWQgKnB0cjsKKyAgdW5zaWduZWQgaW50IGxldmVsOworICBzaXplX3QgbGVuOworICB2b2lkICgqZmNvcHkpKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBzaXplX3QsIGNvbnN0IHZvaWQqLCBzaXplX3QpOworfTsKKworLyogaWQtcmVmIGZvcndhcmRpbmcgbGlzdCAqLworc3RydWN0IHNvYXBfaWxpc3QKK3sgc3RydWN0IHNvYXBfaWxpc3QgKm5leHQ7CisgIGludCB0eXBlOworICBzaXplX3Qgc2l6ZTsKKyAgdm9pZCAqbGluazsKKyAgdm9pZCAqY29weTsKKyAgc3RydWN0IHNvYXBfZmxpc3QgKmZsaXN0OworICB2b2lkICpwdHI7CisgIHVuc2lnbmVkIGludCBsZXZlbDsKKyAgY2hhciBpZFsxXTsgLyogdGhlIGFjdHVhbCBpZCBzdHJpbmcgdmFsdWUgZmxvd3MgaW50byB0aGUgYWxsb2NhdGVkIHJlZ2lvbiBiZWxvdyB0aGlzIHN0cnVjdCAqLworfTsKKworc3RydWN0IHNvYXBfcGx1Z2luCit7IHN0cnVjdCBzb2FwX3BsdWdpbiAqbmV4dDsKKyAgY29uc3QgY2hhciAqaWQ7CisgIHZvaWQgKmRhdGE7CisgIGludCAoKmZjb3B5KShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGx1Z2luICpkc3QsIHN0cnVjdCBzb2FwX3BsdWdpbiAqc3JjKTsKKyAgdm9pZCAoKmZkZWxldGUpKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnApOyAvKiBzaG91bGQgZGVsZXRlIGZpZWxkcyBvZiBwbHVnaW4gb25seSBhbmQgbm90IGZyZWUocCkgKi8KK307CisKKyNpZm5kZWYgV0lUSF9OT05BTUVTUEFDRVMKK2V4dGVybiBTT0FQX05NQUMgc3RydWN0IE5hbWVzcGFjZSBuYW1lc3BhY2VzW107CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU4KKyMgZGVmaW5lIHNvYXBfZ2V0MChzb2FwKSAoKChzb2FwKS0+YnVmaWR4Pj0oc29hcCktPmJ1ZmxlbiAmJiBzb2FwX3JlY3Yoc29hcCkpID8gRU9GIDogKHVuc2lnbmVkIGNoYXIpKHNvYXApLT5idWZbKHNvYXApLT5idWZpZHhdKQorIyBkZWZpbmUgc29hcF9nZXQxKHNvYXApICgoKHNvYXApLT5idWZpZHg+PShzb2FwKS0+YnVmbGVuICYmIHNvYXBfcmVjdihzb2FwKSkgPyBFT0YgOiAodW5zaWduZWQgY2hhcikoc29hcCktPmJ1Zlsoc29hcCktPmJ1ZmlkeCsrXSkKKyNlbHNlCitzb2FwX3djaGFyIHNvYXBfZ2V0MChzdHJ1Y3Qgc29hcCopOworc29hcF93Y2hhciBzb2FwX2dldDEoc3RydWN0IHNvYXAqKTsKKyNlbmRpZgorCisjZGVmaW5lIHNvYXBfcmV2Z2V0MShzb2FwKSAoKHNvYXApLT5idWZpZHgtLSkKKyNkZWZpbmUgc29hcF91bmdldChzb2FwLCBjKSAoKHNvYXApLT5haGVhZCA9IGMpCisjZGVmaW5lIHNvYXBfcmVnaXN0ZXJfcGx1Z2luKHNvYXAsIHBsdWdpbikgc29hcF9yZWdpc3Rlcl9wbHVnaW5fYXJnKHNvYXAsIHBsdWdpbiwgTlVMTCkKKyNkZWZpbmUgc29hcF9pbW9kZShzb2FwLCBuKSAoKHNvYXApLT5tb2RlID0gKHNvYXApLT5pbW9kZSA9IChuKSkKKyNkZWZpbmUgc29hcF9zZXRfaW1vZGUoc29hcCwgbikgKChzb2FwKS0+aW1vZGUgfD0gKG4pKQorI2RlZmluZSBzb2FwX2Nscl9pbW9kZShzb2FwLCBuKSAoKHNvYXApLT5pbW9kZSAmPSB+KG4pKQorI2RlZmluZSBzb2FwX29tb2RlKHNvYXAsIG4pICgoc29hcCktPm1vZGUgPSAoc29hcCktPm9tb2RlID0gKG4pKQorI2RlZmluZSBzb2FwX3NldF9vbW9kZShzb2FwLCBuKSAoKHNvYXApLT5vbW9kZSB8PSAobikpCisjZGVmaW5lIHNvYXBfY2xyX29tb2RlKHNvYXAsIG4pICgoc29hcCktPm9tb2RlICY9IH4obikpCisjZGVmaW5lIHNvYXBfc2V0X21vZGUoc29hcCwgbikgKChzb2FwKS0+aW1vZGUgfD0gKG4pLCAoc29hcCktPm9tb2RlIHw9IChuKSkKKyNkZWZpbmUgc29hcF9jbHJfbW9kZShzb2FwLCBuKSAoKHNvYXApLT5pbW9kZSAmPSB+KG4pLCAoc29hcCktPm9tb2RlICY9IH4obikpCisjZGVmaW5lIHNvYXBfZGVzdHJveShzb2FwKSBzb2FwX2RlbGV0ZSgoc29hcCksIE5VTEwpCisKKyNpZmRlZiBIQVZFX1NUUlJDSFIKKyMgZGVmaW5lIHNvYXBfc3RycmNocihzLCB0KSBzdHJyY2hyKHMsIHQpCisjZWxzZQorIFNPQVBfRk1BQzEgY2hhciogU09BUF9GTUFDMiBzb2FwX3N0cnJjaHIoY29uc3QgY2hhciAqcywgaW50IHQpOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NUUlRPTAorIyBkZWZpbmUgc29hcF9zdHJ0b2wocywgdCwgYikgc3RydG9sKHMsIHQsIGIpCisjZWxzZQorIFNPQVBfRk1BQzEgbG9uZyBTT0FQX0ZNQUMyIHNvYXBfc3RydG9sKGNvbnN0IGNoYXIgKnMsIGNoYXIgKip0LCBpbnQgYik7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RSVE9VTAorIyBkZWZpbmUgc29hcF9zdHJ0b3VsKHMsIHQsIGIpIHN0cnRvdWwocywgdCwgYikKKyNlbHNlCisgU09BUF9GTUFDMSB1bnNpZ25lZCBsb25nIFNPQVBfRk1BQzIgc29hcF9zdHJ0b3VsKGNvbnN0IGNoYXIgKnMsIGNoYXIgKip0LCBpbnQgYik7CisjZW5kaWYKKworI2lmIGRlZmluZWQoV0lUSF9PUEVOU1NMKQorIyBkZWZpbmUgc29hcF9yYW5kb20gc29hcF9yYW5kKCkKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9yYW5kKCk7CisjZWxpZiBkZWZpbmVkKEhBVkVfUkFORE9NKQorIyBkZWZpbmUgc29hcF9yYW5kb20gKGludClyYW5kb20oKQorI2Vsc2UKKyMgZGVmaW5lIHNvYXBfcmFuZG9tIHJhbmQoKQorI2VuZGlmCisKKyNpZmRlZiBXSVRIX05PSURSRUYKKyMgZGVmaW5lIHNvYXBfZW1iZWRkZWQocywgcCwgdCkgKDApCisjIGRlZmluZSBzb2FwX2lkX2xvb2t1cChzLCBpLCBwLCB0LCBuLCBrKSAocCkKKyMgZGVmaW5lIHNvYXBfaWRfZm9yd2FyZChzLCBoLCBwLCBsZW4sIHN0LCB0dCwgbiwgaywgZmMpIChwKQorIyBkZWZpbmUgc29hcF9yZWZlcmVuY2UocywgYSwgdCkgKDEpCisjIGRlZmluZSBzb2FwX2FycmF5X3JlZmVyZW5jZShzLCBwLCBhLCBuLCB0KSAoMSkKKyMgZGVmaW5lIHNvYXBfZW1iZWQocywgcCwgYSwgbiwgdCwgcHApICgwKQorIyBkZWZpbmUgc29hcF9lbWJlZGRlZF9pZChzLCBpLCBwLCB0KSAoaSkKKyMgZGVmaW5lIHNvYXBfaXNfZW1iZWRkZWQocywgcCkgKDApCisjIGRlZmluZSBzb2FwX2lzX3NpbmdsZShzLCBwKSAoMSkKKyMgZGVmaW5lIHNvYXBfbG9va3VwX3R5cGUocywgaSkgKDApCisjIGRlZmluZSBzb2FwX2dldGluZGVwZW5kZW50KHMpICgwKQorIyBkZWZpbmUgc29hcF9wdXRpbmRlcGVuZGVudChzKSAoMCkKKyMgZGVmaW5lIHNvYXBfZ2V0ZWxlbWVudChzLCBuKSAobikKKyMgZGVmaW5lIHNvYXBfcHV0ZWxlbWVudChzLCBwLCB0LCBpLCBuKSAoMCkKKyMgZGVmaW5lIHNvYXBfbWFya2VsZW1lbnQocywgcCwgbikgKDApCisjZW5kaWYKKworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9mYXVsdChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiogU09BUF9GTUFDMiBzb2FwX2ZhdWx0Y29kZShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiogU09BUF9GTUFDMiBzb2FwX2ZhdWx0c3ViY29kZShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiogU09BUF9GTUFDMiBzb2FwX2ZhdWx0c3RyaW5nKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqKiBTT0FQX0ZNQUMyIHNvYXBfZmF1bHRkZXRhaWwoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfc2VyaWFsaXplaGVhZGVyKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0aGVhZGVyKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZ2V0aGVhZGVyKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NlcmlhbGl6ZWZhdWx0KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0ZmF1bHQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRmYXVsdChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NzbF9pbml0KCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcG9sbChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2Nvbm5lY3RfY29tbWFuZChzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9jb25uZWN0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9iaW5kKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9hY2NlcHQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zc2xfYWNjZXB0KHN0cnVjdCBzb2FwKik7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zc2xfc2VydmVyX2NvbnRleHQoc3RydWN0IHNvYXAqLCB1bnNpZ25lZCBzaG9ydCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NzbF9jbGllbnRfY29udGV4dChzdHJ1Y3Qgc29hcCosIHVuc2lnbmVkIHNob3J0LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0aHR0cGhkcihzdHJ1Y3Qgc29hcCosIGludCBzdGF0dXMsIHNpemVfdCBjb3VudCk7CisKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX2RlY29kZV9rZXkoY2hhciosIHNpemVfdCwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfZGVjb2RlX3ZhbChjaGFyKiwgc2l6ZV90LCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzEgc2l6ZV90IFNPQVBfRk1BQzIgc29hcF9oYXNoKGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfc2V0X2VuZHBvaW50KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2ZsdXNoX3JhdyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2ZsdXNoKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHNvYXBfd2NoYXIgU09BUF9GTUFDMiBzb2FwX2dldChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBzb2FwX3djaGFyIFNPQVBfRk1BQzIgc29hcF9nZXRjaGFyKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfdGFnX2NtcChjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXRfZmF1bHQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZW5kZXJfZmF1bHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NlbmRlcl9mYXVsdF9zdWJjb2RlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcmVjZWl2ZXJfZmF1bHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3JlY2VpdmVyX2ZhdWx0X3N1YmNvZGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgaW50KTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NlbmRfcmF3KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHNpemVfdCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcmVjdl9yYXcoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9yZWN2KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2VuZChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZW5kMihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2VuZDMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3B1dHV0Zjgoc3RydWN0IHNvYXAqLCB1bnNpZ25lZCBsb25nKTsKK1NPQVBfRk1BQzEgc29hcF93Y2hhciBTT0FQX0ZNQUMyIHNvYXBfZ2V0dXRmOChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0YmFzZTY0KHN0cnVjdCBzb2FwKiwgY29uc3QgdW5zaWduZWQgY2hhciosIGludCk7CitTT0FQX0ZNQUMxIHVuc2lnbmVkIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9nZXRiYXNlNjQoc3RydWN0IHNvYXAqLCBpbnQqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3B1dGhleChzdHJ1Y3Qgc29hcCosIGNvbnN0IHVuc2lnbmVkIGNoYXIqLCBpbnQpOworU09BUF9GTUFDMSB1bnNpZ25lZCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfZ2V0aGV4KHN0cnVjdCBzb2FwKiwgaW50Kik7CisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF94b3BfZm9yd2FyZChzdHJ1Y3Qgc29hcCosIHVuc2lnbmVkIGNoYXIqKiwgaW50KiwgY2hhcioqLCBjaGFyKiosIGNoYXIqKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZGltZV9mb3J3YXJkKHN0cnVjdCBzb2FwKiwgdW5zaWduZWQgY2hhcioqLCBpbnQqLCBjaGFyKiosIGNoYXIqKiwgY2hhcioqKTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3BvaW50ZXJfbG9va3VwX2lkKHN0cnVjdCBzb2FwKiwgdm9pZCAqcCwgaW50IHQsIHN0cnVjdCBzb2FwX3BsaXN0KiopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3BvaW50ZXJfbG9va3VwKHN0cnVjdCBzb2FwKiwgY29uc3Qgdm9pZCAqcCwgaW50IHQsIHN0cnVjdCBzb2FwX3BsaXN0KiopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3BvaW50ZXJfZW50ZXIoc3RydWN0IHNvYXAqLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGludCB0LCBzdHJ1Y3Qgc29hcF9wbGlzdCoqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9hcnJheV9wb2ludGVyX2xvb2t1cChzdHJ1Y3Qgc29hcCosIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgbiwgaW50IHQsIHN0cnVjdCBzb2FwX3BsaXN0KiopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VtYmVkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGNvbnN0IGNoYXIgKnRhZywgaW50IHR5cGUpOworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcF9pbGlzdCogU09BUF9GTUFDMiBzb2FwX2xvb2t1cChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgc3RydWN0IHNvYXBfaWxpc3QqIFNPQVBfRk1BQzIgc29hcF9lbnRlcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9yZXNvbHZlKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2VtYmVkZGVkKHN0cnVjdCBzb2FwKiwgY29uc3Qgdm9pZCAqcCwgaW50IHQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3JlZmVyZW5jZShzdHJ1Y3Qgc29hcCosIGNvbnN0IHZvaWQgKnAsIGludCB0KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9hcnJheV9yZWZlcmVuY2Uoc3RydWN0IHNvYXAqLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGludCB0KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbWJlZGRlZF9pZChzdHJ1Y3Qgc29hcCosIGludCBpZCwgY29uc3Qgdm9pZCAqcCwgaW50IHQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2lzX2VtYmVkZGVkKHN0cnVjdCBzb2FwKiwgc3RydWN0IHNvYXBfcGxpc3QqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9pc19zaW5nbGUoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9wbGlzdCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXRfZW1iZWRkZWQoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9wbGlzdCopOworI2VuZGlmCisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9iZWdpbl9jb3VudChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VuZF9jb3VudChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2JlZ2luX3NlbmQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbmRfc2VuZChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwKiBTT0FQX0ZNQUMyIHNvYXBfY29kZShjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCosIGNvbnN0IGNoYXIgKnN0cik7CitTT0FQX0ZNQUMxIGxvbmcgU09BUF9GTUFDMiBzb2FwX2ludF9jb2RlKGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwKiwgY29uc3QgY2hhciAqc3RyLCBsb25nIG90aGVyKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX3N0cl9jb2RlKGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwKiwgbG9uZyBjb2RlKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2dldGxpbmUoc3RydWN0IHNvYXAqLCBjaGFyKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9iZWdpbl9yZWN2KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZW5kX3JlY3Yoc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMSB2b2lkKiBTT0FQX0ZNQUMyIHNvYXBfbWFsbG9jKHN0cnVjdCBzb2FwKiwgc2l6ZV90KTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfZGVhbGxvYyhzdHJ1Y3Qgc29hcCosIHZvaWQqKTsKK1NPQVBfRk1BQzEgc3RydWN0IHNvYXBfY2xpc3QgKiBTT0FQX0ZNQUMyIHNvYXBfbGluayhzdHJ1Y3Qgc29hcCosIHZvaWQqLCBpbnQsIGludCwgdm9pZCAoKmZkZWxldGUpKHN0cnVjdCBzb2FwX2NsaXN0KikpOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF91bmxpbmsoc3RydWN0IHNvYXAqLCBjb25zdCB2b2lkKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2ZyZWUoc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMSB2b2lkKiBTT0FQX0ZNQUMyIHNvYXBfdHJhY2tfbWFsbG9jKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgc2l6ZV90KTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfdHJhY2tfZnJlZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIHZvaWQqKTsKKworI2lmbmRlZiBXSVRIX05PSURSRUYKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9sb29rdXBfdHlwZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKmlkKTsKK1NPQVBfRk1BQzEgdm9pZCogU09BUF9GTUFDMiBzb2FwX2lkX2xvb2t1cChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKmlkLCB2b2lkICoqcCwgaW50IHQsIHNpemVfdCBuLCB1bnNpZ25lZCBpbnQgayk7CitTT0FQX0ZNQUMxIHZvaWQqIFNPQVBfRk1BQzIgc29hcF9pZF9mb3J3YXJkKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqaWQsIHZvaWQgKnAsIHNpemVfdCBsZW4sIGludCBzdCwgaW50IHR0LCBzaXplX3QgbiwgdW5zaWduZWQgaW50IGssIHZvaWQoKmZjb3B5KShzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgc2l6ZV90LCBjb25zdCB2b2lkKiwgc2l6ZV90KSk7CisjZW5kaWYKK1NPQVBfRk1BQzEgdm9pZCogU09BUF9GTUFDMiBzb2FwX2lkX2VudGVyKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqaWQsIHZvaWQgKnAsIGludCB0LCBzaXplX3QgbiwgdW5zaWduZWQgaW50IGssIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmFycmF5VHlwZSwgdm9pZCAqKCpmaW5zdGFudGlhdGUpKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfZmNvcHkoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdCwgaW50IHR0LCB2b2lkICpwLCBzaXplX3QsIGNvbnN0IHZvaWQgKnEsIHNpemVfdCBuKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NpemUoY29uc3QgaW50ICosIGludCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZ2V0b2Zmc2V0cyhjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBpbnQgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRzaXplKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQgKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZ2V0c2l6ZXMoY29uc3QgY2hhciAqLCBpbnQgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRwb3NpdGlvbihjb25zdCBjaGFyICosIGludCAqKTsKKworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfcHV0c2l6ZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgY2hhciogU09BUF9GTUFDMiBzb2FwX3B1dHNpemVzb2Zmc2V0cyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBpbnQpOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfcHV0c2l6ZXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBpbnQpOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfcHV0b2Zmc2V0KHN0cnVjdCBzb2FwKiwgaW50KTsKK1NPQVBfRk1BQzEgY2hhciogU09BUF9GTUFDMiBzb2FwX3B1dG9mZnNldHMoc3RydWN0IHNvYXAqLCBjb25zdCBpbnQgKiwgaW50KTsKKyAKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9jbG9zZXNvY2soc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcCAqU09BUF9GTUFDMiBzb2FwX25ldyh2b2lkKTsKK1NPQVBfRk1BQzEgc3RydWN0IHNvYXAgKlNPQVBfRk1BQzIgc29hcF9uZXcxKHNvYXBfbW9kZSk7CitTT0FQX0ZNQUMxIHN0cnVjdCBzb2FwICpTT0FQX0ZNQUMyIHNvYXBfbmV3Mihzb2FwX21vZGUsIHNvYXBfbW9kZSk7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2RlbChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcCAqU09BUF9GTUFDMiBzb2FwX2NvcHkoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgc3RydWN0IHNvYXAgKlNPQVBfRk1BQzIgc29hcF9jb3B5X2NvbnRleHQoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9pbml0KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2luaXQxKHN0cnVjdCBzb2FwKiwgc29hcF9tb2RlKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfaW5pdDIoc3RydWN0IHNvYXAqLCBzb2FwX21vZGUsIHNvYXBfbW9kZSk7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2RvbmUoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfY2xlYW51cChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9iZWdpbihzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9lbmQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfZGVsZXRlKHN0cnVjdCBzb2FwKiwgdm9pZCopOworCisjaWZkZWYgU09BUF9ERUJVRworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXRfcmVjdl9sb2dmaWxlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXRfc2VudF9sb2dmaWxlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXRfdGVzdF9sb2dmaWxlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9jbG9zZV9sb2dmaWxlcyhzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9vcGVuX2xvZ2ZpbGUoc3RydWN0IHNvYXAqLCBpbnQpOworI2VuZGlmCisKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX3Rva2VuKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF92YWx1ZShzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfbWF0Y2hfdGFnKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfbWF0Y2hfYXJyYXkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbGVtZW50KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnR5cGUpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2FycmF5X2JlZ2luX291dChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICpvZmZzZXQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfcmVmKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGludCBocmVmKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbGVtZW50X2hyZWYoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgY2hhciAqcmVmLCBjb25zdCBjaGFyICp2YWwpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfbnVsbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICp0eXBlKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbGVtZW50X2lkKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgZCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfcmVzdWx0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbGVtZW50X2VuZF9vdXQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZyk7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9hdHRyaWJ1dGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZWxlbWVudF9iZWdpbl9pbihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IG5pbGxhYmxlKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfZW5kX2luKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3BlZWtfZWxlbWVudChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3JldHJ5KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3JldmVydChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9zdHJkdXAoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIgKiBTT0FQX0ZNQUMyIHNvYXBfc3Ryc2VhcmNoKGNvbnN0IGNoYXIgKmJpZywgY29uc3QgY2hhciAqbGl0dGxlKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3N0cmluZ19vdXQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICpzLCBpbnQgZmxhZyk7CitTT0FQX0ZNQUMxIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9zdHJpbmdfaW4oc3RydWN0IHNvYXAqLCBpbnQsIGxvbmcsIGxvbmcpOworCisjaWZuZGVmIFdJVEhfTEVBTkVSCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfd3N0cmluZ19vdXQoc3RydWN0IHNvYXAqLCBjb25zdCB3Y2hhcl90ICpzLCBpbnQgZmxhZyk7CitTT0FQX0ZNQUMxIHdjaGFyX3QqIFNPQVBfRk1BQzIgc29hcF93c3RyaW5nX2luKHN0cnVjdCBzb2FwKiwgaW50LCBsb25nLCBsb25nKTsKKyNlbmRpZgorCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfbWF0Y2hfbmFtZXNwYWNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyKiwgaW50IG4xLCBpbnQgbjIpOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2V0X25hbWVzcGFjZXMoc3RydWN0IHNvYXAqLCBzdHJ1Y3QgTmFtZXNwYWNlKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NldF9sb2NhbF9uYW1lc3BhY2VzKHN0cnVjdCBzb2FwKik7CisKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfcG9wX25hbWVzcGFjZShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3B1c2hfbmFtZXNwYWNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9jdXJyZW50X25hbWVzcGFjZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3N0b3JlX2xhYihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2FwcGVuZF9sYWIoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc2l6ZV90KTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX25ld19ibG9jayhzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSB2b2lkKiBTT0FQX0ZNQUMyIHNvYXBfcHVzaF9ibG9jayhzdHJ1Y3Qgc29hcCosIHNpemVfdCk7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3BvcF9ibG9jayhzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBzaXplX3QgU09BUF9GTUFDMiBzb2FwX3NpemVfYmxvY2soc3RydWN0IHNvYXAqLCBzaXplX3QpOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfZmlyc3RfYmxvY2soc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgY2hhciogU09BUF9GTUFDMiBzb2FwX25leHRfYmxvY2soc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgc2l6ZV90IFNPQVBfRk1BQzIgc29hcF9ibG9ja19zaXplKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9zYXZlX2Jsb2NrKHN0cnVjdCBzb2FwKiwgY2hhciosIGludCk7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2VuZF9ibG9jayhzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZW52ZWxvcGVfYmVnaW5fb3V0KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBzb2FwX2VudmVsb3BlX2VuZF9vdXQoc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VudmVsb3BlX2JlZ2luX2luKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZW52ZWxvcGVfZW5kX2luKHN0cnVjdCBzb2FwKik7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9ib2R5X2JlZ2luX291dChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2JvZHlfZW5kX291dChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfYm9keV9iZWdpbl9pbihzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2JvZHlfZW5kX2luKHN0cnVjdCBzb2FwKik7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9yZWN2X2hlYWRlcihzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcmVzcG9uc2Uoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2VuZF9lbXB0eV9yZXNwb25zZShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3JlY3ZfZW1wdHlfcmVzcG9uc2Uoc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NlbmRfZmF1bHQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9yZWN2X2ZhdWx0KHN0cnVjdCBzb2FwKik7CisKKyNpZm5kZWYgV0lUSF9OT1NURExJQgorU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9wcmludF9mYXVsdChzdHJ1Y3Qgc29hcCosIEZJTEUqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfcHJpbnRfZmF1bHRfbG9jYXRpb24oc3RydWN0IHNvYXAqLCBGSUxFKik7CisjZW5kaWYKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MyYnl0ZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjaGFyKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfczJzaG9ydChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaG9ydCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MyaW50KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MybG9uZyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBsb25nKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfczJMT05HNjQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgTE9ORzY0Kik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfczJmbG9hdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBmbG9hdCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MyZG91YmxlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGRvdWJsZSopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MydW5zaWduZWRCeXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVuc2lnbmVkIGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zMnVuc2lnbmVkU2hvcnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdW5zaWduZWQgc2hvcnQqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zMnVuc2lnbmVkSW50KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVuc2lnbmVkIGludCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MydW5zaWduZWRMb25nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVuc2lnbmVkIGxvbmcqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zMlVMT05HNjQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgVUxPTkc2NCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3Myc3RyaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNoYXIqKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfczJRTmFtZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjaGFyKiopOworCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3Myd2NoYXIoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgd2NoYXJfdCoqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zMmRhdGVUaW1lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHRpbWVfdCopOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfczJiYXNlNjQoc3RydWN0IHNvYXAqLCBjb25zdCB1bnNpZ25lZCBjaGFyKiwgY2hhciosIGludCk7CitTT0FQX0ZNQUMxIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9zMmhleChzdHJ1Y3Qgc29hcCosIGNvbnN0IHVuc2lnbmVkIGNoYXIqLCBjaGFyKiwgaW50KTsKKyNlbmRpZgorCitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9ieXRlMnMoc3RydWN0IHNvYXAqLCBjaGFyKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX3Nob3J0MnMoc3RydWN0IHNvYXAqLCBzaG9ydCk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9pbnQycyhzdHJ1Y3Qgc29hcCosIGludCk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9sb25nMnMoc3RydWN0IHNvYXAqLCBsb25nKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX0xPTkc2NDJzKHN0cnVjdCBzb2FwKiwgTE9ORzY0KTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX2Zsb2F0MnMoc3RydWN0IHNvYXAqLCBmbG9hdCk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9kb3VibGUycyhzdHJ1Y3Qgc29hcCosIGRvdWJsZSk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF91bnNpZ25lZEJ5dGUycyhzdHJ1Y3Qgc29hcCosIHVuc2lnbmVkIGNoYXIpOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfdW5zaWduZWRTaG9ydDJzKHN0cnVjdCBzb2FwKiwgdW5zaWduZWQgc2hvcnQpOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfdW5zaWduZWRJbnQycyhzdHJ1Y3Qgc29hcCosIHVuc2lnbmVkIGludCk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF91bnNpZ25lZExvbmcycyhzdHJ1Y3Qgc29hcCosIHVuc2lnbmVkIGxvbmcpOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfVUxPTkc2NDJzKHN0cnVjdCBzb2FwKiwgVUxPTkc2NCk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9RTmFtZTJzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfd2NoYXIycyhzdHJ1Y3Qgc29hcCosIGNvbnN0IHdjaGFyX3QqKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX2RhdGVUaW1lMnMoc3RydWN0IHNvYXAqLCB0aW1lX3QpOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfYmFzZTY0MnMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY2hhciosIHNpemVfdCwgaW50Kik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9oZXgycyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjaGFyKiwgc2l6ZV90LCBpbnQqKTsKKyNlbmRpZgorCisKK1NPQVBfRk1BQzEgaW50KiBTT0FQX0ZNQUMyIHNvYXBfaW5pbnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfaW5ieXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBjaGFyICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGxvbmcqIFNPQVBfRk1BQzIgc29hcF9pbmxvbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGxvbmcgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgTE9ORzY0KiBTT0FQX0ZNQUMyIHNvYXBfaW5MT05HNjQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIExPTkc2NCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBzaG9ydCogU09BUF9GTUFDMiBzb2FwX2luc2hvcnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHNob3J0ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGZsb2F0KiBTT0FQX0ZNQUMyIHNvYXBfaW5mbG9hdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgZmxvYXQgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgZG91YmxlKiBTT0FQX0ZNQUMyIHNvYXBfaW5kb3VibGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGRvdWJsZSAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSB1bnNpZ25lZCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfaW51bnNpZ25lZEJ5dGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIGNoYXIgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgdW5zaWduZWQgc2hvcnQqIFNPQVBfRk1BQzIgc29hcF9pbnVuc2lnbmVkU2hvcnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIHNob3J0ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIHVuc2lnbmVkIGludCogU09BUF9GTUFDMiBzb2FwX2ludW5zaWduZWRJbnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIGludCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSB1bnNpZ25lZCBsb25nKiBTT0FQX0ZNQUMyIHNvYXBfaW51bnNpZ25lZExvbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIGxvbmcgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgVUxPTkc2NCogU09BUF9GTUFDMiBzb2FwX2luVUxPTkc2NChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgVUxPTkc2NCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBjaGFyKiogU09BUF9GTUFDMiBzb2FwX2luc3RyaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBjaGFyICoqcCwgY29uc3QgY2hhciAqLCBpbnQsIGludCwgbG9uZywgbG9uZyk7CitTT0FQX0ZNQUMxIGNoYXIqKiBTT0FQX0ZNQUMyIHNvYXBfaW5saXRlcmFsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBjaGFyICoqcCk7CisKKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxIHRpbWVfdCogU09BUF9GTUFDMiBzb2FwX2luZGF0ZVRpbWUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHRpbWVfdCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK1NPQVBfRk1BQzEgd2NoYXJfdCoqIFNPQVBfRk1BQzIgc29hcF9pbndzdHJpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHdjaGFyX3QgKipwLCBjb25zdCBjaGFyICosIGludCwgbG9uZywgbG9uZyk7CitTT0FQX0ZNQUMxIHdjaGFyX3QqKiBTT0FQX0ZNQUMyIHNvYXBfaW53bGl0ZXJhbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgd2NoYXJfdCAqKnApOworI2VuZGlmCisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRieXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRzaG9ydChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzaG9ydCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dGludChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBpbnQgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRsb25nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGxvbmcgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRMT05HNjQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgTE9ORzY0ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0ZmxvYXQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgZmxvYXQgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRkb3VibGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgZG91YmxlICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0dW5zaWduZWRCeXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXR1bnNpZ25lZFNob3J0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIHNob3J0ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0dW5zaWduZWRJbnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgdW5zaWduZWQgaW50ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0dW5zaWduZWRMb25nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRVTE9ORzY0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IFVMT05HNjQgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRzdHJpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY2hhciAqY29uc3QqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dGxpdGVyYWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGNoYXIgKmNvbnN0KnApOworCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dGRhdGVUaW1lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHRpbWVfdCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXR3c3RyaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIHdjaGFyX3QgKmNvbnN0KnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXR3bGl0ZXJhbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgd2NoYXJfdCAqY29uc3QqcCk7CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU5FUgorU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2F0dGFjaG1lbnQoc3RydWN0IHNvYXAgKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgdm9pZCosIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBjaGFyKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9tb3ZlKHN0cnVjdCBzb2FwKiwgbG9uZyk7CitTT0FQX0ZNQUMxIHNpemVfdCBTT0FQX0ZNQUMyIHNvYXBfdGVsbChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfZGltZV9vcHRpb24oc3RydWN0IHNvYXAqLCB1bnNpZ25lZCBzaG9ydCwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2dldGRpbWVoZHIoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRkaW1lKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0ZGltZWhkcihzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3B1dGRpbWUoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRtaW1laGRyKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZ2V0bWltZShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3B1dG1pbWVoZHIoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9wdXRtaW1lKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NldF9kaW1lKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NldF9taW1lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqYm91bmRhcnksIGNvbnN0IGNoYXIgKnN0YXJ0KTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfY2xyX2RpbWUoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfY2xyX21pbWUoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZXRfZGltZV9hdHRhY2htZW50KHN0cnVjdCBzb2FwKiwgY2hhciAqcHRyLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqaWQsIHVuc2lnbmVkIHNob3J0IG9wdHlwZSwgY29uc3QgY2hhciAqb3B0aW9uKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZXRfbWltZV9hdHRhY2htZW50KHN0cnVjdCBzb2FwKiwgY2hhciAqcHRyLCBzaXplX3Qgc2l6ZSwgZW51bSBzb2FwX21pbWVfZW5jb2RpbmcgZW5jb2RpbmcsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICpsb2NhdGlvbiwgY29uc3QgY2hhciAqZGVzY3JpcHRpb24pOworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqIFNPQVBfRk1BQzIgc29hcF9uZXh0X211bHRpcGFydChzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKTsKKyNlbmRpZgorCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcmVnaXN0ZXJfcGx1Z2luX2FyZyhzdHJ1Y3Qgc29hcCosIGludCAoKmZjcmVhdGUpKHN0cnVjdCBzb2FwKiwgc3RydWN0IHNvYXBfcGx1Z2luKiwgdm9pZCopLCB2b2lkKik7CitTT0FQX0ZNQUMxIHZvaWQqIFNPQVBfRk1BQzIgc29hcF9sb29rdXBfcGx1Z2luKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9hdHRyX3ZhbHVlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgZmxhZyk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2V0X2F0dHIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfY2xyX2F0dHIoc3RydWN0IHNvYXAgKnNvYXApOworCisjaWZkZWYgV0lUSF9DT09LSUVTCitTT0FQX0ZNQUMxIHNpemVfdCBTT0FQX0ZNQUMyIHNvYXBfZW5jb2RlX2Nvb2tpZShjb25zdCBjaGFyKiwgY2hhciosIHNpemVfdCk7CitTT0FQX0ZNQUMxIGV4dGVybiBzdHJ1Y3Qgc29hcF9jb29raWUqIFNPQVBfRk1BQzIgc29hcF9zZXRfY29va2llKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBleHRlcm4gc3RydWN0IHNvYXBfY29va2llKiBTT0FQX0ZNQUMyIHNvYXBfY29va2llKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGV4dGVybiBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfY29va2llX3ZhbHVlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGV4dGVybiBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfZW52X2Nvb2tpZV92YWx1ZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBleHRlcm4gbG9uZyBTT0FQX0ZNQUMyIHNvYXBfY29va2llX2V4cGlyZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBleHRlcm4gaW50IFNPQVBfRk1BQzIgc29hcF9zZXRfY29va2llX2V4cGlyZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBsb25nLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBleHRlcm4gaW50IFNPQVBfRk1BQzIgc29hcF9zZXRfY29va2llX3Nlc3Npb24oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgZXh0ZXJuIGludCBTT0FQX0ZNQUMyIHNvYXBfY2xyX2Nvb2tpZV9zZXNzaW9uKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGV4dGVybiB2b2lkIFNPQVBfRk1BQzIgc29hcF9jbHJfY29va2llKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGV4dGVybiBpbnQgU09BUF9GTUFDMiBzb2FwX2dldGVudl9jb29raWVzKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGV4dGVybiBzdHJ1Y3Qgc29hcF9jb29raWUqIFNPQVBfRk1BQzIgc29hcF9jb3B5X2Nvb2tpZXMoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgZXh0ZXJuIHZvaWQgU09BUF9GTUFDMiBzb2FwX2ZyZWVfY29va2llcyhzdHJ1Y3Qgc29hcCopOworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBleHRlcm4gIkMiICovCisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvdWRwX1ZDL3VkcC5oIGIvc2FtcGxlcy91ZHBfVkMvdWRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMxY2VmOAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvdWRwX1ZDL3VkcC5oCkBAIC0wLDAgKzEsMTA3IEBACisvKgorCit1ZHAuaAorCitTT0FQLW92ZXItVURQIGRlbW8gc3BlY2lmaWNhdGlvbiBmb3IgdWRwY2xpZW50IGFuZCB1ZHBzZXJ2ZXIgZXhhbXBsZXMKKworUmVxdWlyZXMgV1MtQWRkcmVzc2luZyBmcm9tIGltcG9ydC93c2EuaAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyB0d28gbGljZW5zZXM6CitHUEwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JSW1wb3J0IFdTLUFkZHJlc3NpbmcKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvL2dzb2FwIHdzYSBzY2hlbWEgaW1wb3J0OiBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmcKKworI2ltcG9ydCAid3NhLmgiCQkvLyB3c2EuaCBpcyBpbiB0aGUgaW1wb3J0IGRpcmVjdG9yeQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCURlbW8gVURQIHNlcnZpY2UKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvL2dzb2FwIG5zIHNlcnZpY2UgbmFtZToJdWRwCisvL2dzb2FwIG5zIHNlcnZpY2UgbmFtZXNwYWNlOgl1cm46Z3NvYXAtdWRwLWRlbW8KKy8vZ3NvYXAgbnMgc2VydmljZSBsb2NhdGlvbjoJc29hcC51ZHA6Ly9sb2NhbGhvc3Q6MTAwMDAKKworLy8JSSB3b3VsZCBhc3N1bWUgVURQIHRyYW5zcG9ydCB0byBiZSBkZWZpbmVkIGluIHRoZSBXU0RMIGJpbmRpbmdzLCBidXQKKy8vCXRoaXMgZG9lc24ndCBhcHBlYXIgdG8gYmUgcG9zc2libGUsIHNvIHdlIHdpbGwgdXNlIHRoZSBkZWZhdWx0IEhUVFAKKy8vCXRyYW5zcG9ydCBiaW5kaW5nIGFuZCBvbWl0IHRoZSB0cmFuc3BvcnQgZGlyZWN0aXZlIGJlbG93LgorLy8JZ3NvYXAgbnMgc2VydmljZSB0cmFuc3BvcnQ6CS4uLiA/Pz8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwlTT0FQLW92ZXItVURQIFNPQVAgSGVhZGVycyB3aXRoIFdTLUFkZHJlc3NpbmcKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdHJ1Y3QgU09BUF9FTlZfX0hlYWRlcgoreworICBtdXN0VW5kZXJzdGFuZCBfd3NhX19NZXNzYWdlSUQgICAgICB3c2FfX01lc3NhZ2VJRCAwOyAvLy88IFdTLUFkZHJlc3NpbmcKKyAgbXVzdFVuZGVyc3RhbmQgX3dzYV9fUmVsYXRlc1RvICAgICAqd3NhX19SZWxhdGVzVG8gMDsgLy8vPCBXUy1BZGRyZXNzaW5nCisgIG11c3RVbmRlcnN0YW5kIF93c2FfX0Zyb20gICAgICAgICAgKndzYV9fRnJvbSAgICAgIDA7IC8vLzwgV1MtQWRkcmVzc2luZworICBtdXN0VW5kZXJzdGFuZCBfd3NhX19SZXBseVRvICAgICAgICp3c2FfX1JlcGx5VG8gICAwOyAvLy88IFdTLUFkZHJlc3NpbmcKKyAgbXVzdFVuZGVyc3RhbmQgX3dzYV9fRmF1bHRUbyAgICAgICAqd3NhX19GYXVsdFRvICAgMDsgLy8vPCBXUy1BZGRyZXNzaW5nCisgIG11c3RVbmRlcnN0YW5kIF93c2FfX1RvICAgICAgICAgICAgIHdzYV9fVG8gICAgICAgIDA7IC8vLzwgV1MtQWRkcmVzc2luZworICBtdXN0VW5kZXJzdGFuZCBfd3NhX19BY3Rpb24gICAgICAgICB3c2FfX0FjdGlvbiAgICAwOyAvLy88IFdTLUFkZHJlc3NpbmcKK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JZWNob1N0cmluZyAoYW5vbnltb3VzKSByZXF1ZXN0LXJlc3BvbnNlIE1FUCBvdmVyIFVEUAorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vZ3NvYXAgbnMgc2VydmljZSBtZXRob2QtZG9jdW1lbnRhdGlvbjogZWNob1N0cmluZyBEZW1vIChhbm9ueW1vdXMpIHJlcXVlc3QtcmVzcG9uc2UgTUVQIG92ZXIgVURQCisKKy8vZ3NvYXAgbnMgc2VydmljZSBtZXRob2QtaGVhZGVyLXBhcnQ6CQllY2hvU3RyaW5nIHdzYV9fTWVzc2FnZUlECisvL2dzb2FwIG5zIHNlcnZpY2UgbWV0aG9kLWhlYWRlci1wYXJ0OgkJZWNob1N0cmluZyB3c2FfX1RvCisvL2dzb2FwIG5zIHNlcnZpY2UgbWV0aG9kLWhlYWRlci1wYXJ0OgkJZWNob1N0cmluZyB3c2FfX0FjdGlvbgorLy9nc29hcCBucyBzZXJ2aWNlIG1ldGhvZC1pbnB1dC1oZWFkZXItcGFydDoJc2VuZFN0cmluZyB3c2FfX1JlcGx5VG8KKy8vZ3NvYXAgbnMgc2VydmljZSBtZXRob2Qtb3V0cHV0LWhlYWRlci1wYXJ0OgllY2hvU3RyaW5nIHdzYV9fUmVsYXRlc1RvCisKK2ludCBuc19fZWNob1N0cmluZyhjaGFyICpzdHIsIGNoYXIgKipyZXMpOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXNlbmRTdHJpbmcgb25lLXdheSBNRVAgb3ZlciBVRFAKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvL2dzb2FwIG5zIHNlcnZpY2UgbWV0aG9kLWRvY3VtZW50YXRpb246IHNlbmRTdHJpbmcgRGVtbyBvbmUtd2F5IE1FUCBvdmVyIFVEUAorCisvL2dzb2FwIG5zIHNlcnZpY2UgbWV0aG9kLWhlYWRlci1wYXJ0OgkJc2VuZFN0cmluZyB3c2FfX01lc3NhZ2VJRAorLy9nc29hcCBucyBzZXJ2aWNlIG1ldGhvZC1oZWFkZXItcGFydDoJCXNlbmRTdHJpbmcgd3NhX19UbworLy9nc29hcCBucyBzZXJ2aWNlIG1ldGhvZC1oZWFkZXItcGFydDoJCXNlbmRTdHJpbmcgd3NhX19BY3Rpb24KKworaW50IG5zX19zZW5kU3RyaW5nKGNoYXIgKnN0ciwgdm9pZCk7CmRpZmYgLS1naXQgYS9zYW1wbGVzL3VkcF9WQy91ZHBjbGllbnQuY3BwIGIvc2FtcGxlcy91ZHBfVkMvdWRwY2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDc1MjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy91ZHBfVkMvdWRwY2xpZW50LmNwcApAQCAtMCwwICsxLDExMCBAQAorLyoKKwordWRwY2xpZW50LmMKKworU09BUC1vdmVyLVVEUCBkZW1vIGNsaWVudAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyB0d28gbGljZW5zZXM6CitHUEwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbmNsdWRlICJzb2FwSC5oIgorI2luY2x1ZGUgInVkcC5uc21hcCIKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreyBzdHJ1Y3Qgc29hcCBzb2FwOworICBzdHJ1Y3QgU09BUF9FTlZfX0hlYWRlciBoZWFkZXI7CisgIHN0cnVjdCB3c2FfX0VuZHBvaW50UmVmZXJlbmNlVHlwZSByZXBseVRvOworICBjaGFyICpyZXM7CisgIGNoYXIgKm1pZDEgPSAiaWQxIjsKKyAgY2hhciAqbWlkMiA9ICJpZDIiOworCisgIGlmIChhcmdjID4gMSkKKyAgICBtaWQxID0gYXJndlsxXTsKKyAgaWYgKGFyZ2MgPiAyKQorICAgIG1pZDIgPSBhcmd2WzJdOworCisgIHNvYXBfaW5pdCgmc29hcCk7CisKKyAgc29hcC5zZW5kX3RpbWVvdXQgPSAxOworICBzb2FwLnJlY3ZfdGltZW91dCA9IDE7CisKKyAgLyogVG8gY29tcHJlc3MgdGhlIHJlcXVlc3QgbWVzc2FnZSAoY29tcGlsZSB3aXRoIC1EV0lUSF9HWklQKToKKyAgc29hcF9zZXRfb21vZGUoJnNvYXAsIFNPQVBfRU5DX1pMSUIpOworICAqLworCisgIC8qIFRvIHRyYW5zbWl0IERJTUUgYXR0YWNobWVudHM6CisgIHNvYXBfc2V0X2RpbWUoJnNvYXApOworICBzb2FwX3NldF9kaW1lX2F0dGFjaG1lbnQoJnNvYXAsICJhYmMiLCAzLCAiY2lkOmFiYyIsICJ0ZXh0L3htbCIsIDAsIE5VTEwpOworICAqLworCisgIC8qIFRvIHRyYW5zbWl0IE1JTUUgYXR0YWNobWVudHM6CisgIHNvYXBfc2V0X21pbWUoJnNvYXAsIE5VTEwsIE5VTEwpOworICBzb2FwX3NldF9taW1lX2F0dGFjaG1lbnQoJnNvYXAsICJhYmMiLCAzLCBTT0FQX01JTUVfN0JJVCwgInRleHQveG1sIiwgImNpZDphYmMiLCBOVUxMLCBOVUxMKTsKKyAgKi8KKworICAvKiBQcmVwYXJlIFNPQVAgSGVhZGVyICovCisgIHNvYXBfZGVmYXVsdF9TT0FQX0VOVl9fSGVhZGVyKCZzb2FwLCAmaGVhZGVyKTsKKyAgc29hcC5oZWFkZXIgPSAmaGVhZGVyOworCisgIHNvYXBfZGVmYXVsdF93c2FfX0VuZHBvaW50UmVmZXJlbmNlVHlwZSgmc29hcCwgJnJlcGx5VG8pOworICByZXBseVRvLkFkZHJlc3MgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nL3JvbGUvYW5vbnltb3VzIjsKKworICAvKiBTZXQgV1MtQWRkcmVzc2luZyBlbGVtZW50cyBmb3IgcmVxdWVzdC1yZXNwb25zZSB1bmljYXN0ICovCisgIGhlYWRlci53c2FfX01lc3NhZ2VJRCA9IG1pZDE7CisgIGhlYWRlci53c2FfX1RvID0gImh0dHA6Ly9nZW5pdmlhLmNvbS91ZHAvc2VydmVyIjsKKyAgaGVhZGVyLndzYV9fQWN0aW9uID0gImh0dHA6Ly9nZW5pdmlhLmNvbS91ZHAvZWNob1N0cmluZyI7CisgIGhlYWRlci53c2FfX1JlcGx5VG8gPSAmcmVwbHlUbzsKKworICAvKiBNYWtlIHJlcXVlc3QtcmVzcG9uc2UgY2FsbCAqLworICBpZiAoc29hcF9jYWxsX25zX19lY2hvU3RyaW5nKCZzb2FwLCBOVUxMLCBOVUxMLCAiaGVsbG8gd29ybGQhIiwgJnJlcykpCisgIHsgaWYgKHNvYXAuZXJyb3IgPT0gU09BUF9FT0YgJiYgc29hcC5lcnJudW0gPT0gMCkKKyAgICAgIHByaW50ZigiVGltZW91dDogbWVzc2FnZSBwcm9iYWJseSBhbHJlYWR5IGRlbGl2ZXJlZFxuIik7CisgICAgZWxzZQorICAgICAgc29hcF9wcmludF9mYXVsdCgmc29hcCwgc3RkZXJyKTsKKyAgfQorICBlbHNlCisgICAgcHJpbnRmKCJVRFAgc2VydmVyIHJlc3BvbnNlOiAlc1xuIiwgcmVzKTsKKworICAvKiBSZXNldCB0aGUgU09BUCBIZWFkZXIgKi8KKyAgc29hcF9kZWZhdWx0X1NPQVBfRU5WX19IZWFkZXIoJnNvYXAsICZoZWFkZXIpOworICBzb2FwLmhlYWRlciA9ICZoZWFkZXI7CisKKyAgLyogU2V0IFdTLUFkZHJlc3NpbmcgZWxlbWVudHMgZm9yIG9uZS13YXkgdW5pY2FzdCAqLworICBoZWFkZXIud3NhX19NZXNzYWdlSUQgPSBtaWQyOworICBoZWFkZXIud3NhX19UbyA9ICJodHRwOi8vZ2VuaXZpYS5jb20vdWRwL3NlcnZlciI7CisgIGhlYWRlci53c2FfX0FjdGlvbiA9ICJodHRwOi8vZ2VuaXZpYS5jb20vdWRwL3NlbmRTdHJpbmciOworCisgIC8qIFNlbmQgb25lLXdheSBtZXNzYWdlICovCisgIGlmIChzb2FwX3NlbmRfbnNfX3NlbmRTdHJpbmcoJnNvYXAsIE5VTEwsIE5VTEwsICJoZWxsbyB3b3JsZCEiKSkKKyAgICBzb2FwX3ByaW50X2ZhdWx0KCZzb2FwLCBzdGRlcnIpOworCisgIHNvYXBfZW5kKCZzb2FwKTsKKyAgc29hcF9kb25lKCZzb2FwKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvdWRwX1ZDL3VkcGNsaWVudC5zbG4gYi9zYW1wbGVzL3VkcF9WQy91ZHBjbGllbnQuc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNGIzMTMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3VkcF9WQy91ZHBjbGllbnQuc2xuCkBAIC0wLDAgKzEsMjAgQEAKK++7vworTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gOS4wMAorIyBWaXN1YWwgU3R1ZGlvIDIwMDUKK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAidWRwY2xpZW50IiwgInVkcGNsaWVudC52Y3Byb2oiLCAie0Y2NDcyMTNGLTMxOTctNEM4MC04QTQxLTNGQjU5QUVFNUQ0M30iCitFbmRQcm9qZWN0CitHbG9iYWwKKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgorCQlEZWJ1Z3xXaW4zMiA9IERlYnVnfFdpbjMyCisJCVJlbGVhc2V8V2luMzIgPSBSZWxlYXNlfFdpbjMyCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uCisJCXtGNjQ3MjEzRi0zMTk3LTRDODAtOEE0MS0zRkI1OUFFRTVENDN9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyCisJCXtGNjQ3MjEzRi0zMTk3LTRDODAtOEE0MS0zRkI1OUFFRTVENDN9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMgorCQl7RjY0NzIxM0YtMzE5Ny00QzgwLThBNDEtM0ZCNTlBRUU1RDQzfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzIKKwkJe0Y2NDcyMTNGLTMxOTctNEM4MC04QTQxLTNGQjU5QUVFNUQ0M30uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UKKwlFbmRHbG9iYWxTZWN0aW9uCitFbmRHbG9iYWwKZGlmZiAtLWdpdCBhL3NhbXBsZXMvdWRwX1ZDL3VkcGNsaWVudC52Y3Byb2ogYi9zYW1wbGVzL3VkcF9WQy91ZHBjbGllbnQudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZGJiZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3VkcF9WQy91ZHBjbGllbnQudmNwcm9qCkBAIC0wLDAgKzEsMzI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCis8VmlzdWFsU3R1ZGlvUHJvamVjdA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iOC4wMCINCisJTmFtZT0idWRwY2xpZW50Ig0KKwlQcm9qZWN0R1VJRD0ie0Y2NDcyMTNGLTMxOTctNEM4MC04QTQxLTNGQjU5QUVFNUQ0M30iDQorCVJvb3ROYW1lc3BhY2U9InVkcGNsaWVudCINCisJS2V5d29yZD0iV2luMzJQcm9qIg0KKwk+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiINCisJCS8+DQorCTwvUGxhdGZvcm1zPg0KKwk8VG9vbEZpbGVzPg0KKwk8L1Rvb2xGaWxlcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cRGVidWdDbGllbnQiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXERlYnVnQ2xpZW50Ig0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNjAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIuXERlYnVnQ2xpZW50L3VkcGNsaWVudC50bGIiDQorCQkJCUhlYWRlckZpbGVOYW1lPSIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkgDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XSU5OVD0weDA1MDE7V0lOVkVSPTB4MDUwMTtfV0lOMzJfSUU9MHgwNjAzO1dJTjMyO19ERUJVRztfQ09OU09MRTtXSVRIX05PSFRUUDtXSVRIX1VEUCINCisJCQkJIA0KKwkJCQkgDQorCQkJCSANCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXERlYnVnQ2xpZW50L3VkcGNsaWVudC5wY2giDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlxEZWJ1Z0NsaWVudC8iDQorCQkJCU9iamVjdEZpbGU9Ii5cRGVidWdDbGllbnQvIg0KKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlxEZWJ1Z0NsaWVudC8iDQorCQkJCSANCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQkgDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0lOTlQ9MHgwNTAxO1dJTlZFUj0weDA1MDE7X1dJTjMyX0lFPTB4MDYwMztfREVCVUciDQorCQkJCUN1bHR1cmU9IjEwMzMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Im9kYmMzMi5saWIgb2RiY2NwMzIubGliIHdzb2NrMzIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuXERlYnVnQ2xpZW50L3VkcGNsaWVudC5leGUiDQorCQkJCSANCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQkNCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlxEZWJ1Z0NsaWVudC91ZHBjbGllbnQucGRiIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJT3V0cHV0RmlsZT0iLlxEZWJ1Z0NsaWVudC91ZHBjbGllbnQuYnNjIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxSZWxlYXNlQ2xpZW50Ig0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxSZWxlYXNlQ2xpZW50Ig0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNjAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIuXFJlbGVhc2VDbGllbnQvdWRwY2xpZW50LnRsYiINCisJCQkJSGVhZGVyRmlsZU5hbWU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCSANCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0lOTlQ9MHgwNTAxO1dJTlZFUj0weDA1MDE7X1dJTjMyX0lFPTB4MDYwMztXSU4zMjtOREVCVUc7X0NPTlNPTEUiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCSANCisJCQkJIA0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cUmVsZWFzZUNsaWVudC91ZHBjbGllbnQucGNoIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cUmVsZWFzZUNsaWVudC8iDQorCQkJCU9iamVjdEZpbGU9Ii5cUmVsZWFzZUNsaWVudC8iDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXFJlbGVhc2VDbGllbnQvIg0KKwkJCQkgDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XSU5OVD0weDA1MDE7V0lOVkVSPTB4MDUwMTtfV0lOMzJfSUU9MHgwNjAzO05ERUJVRyINCisJCQkJQ3VsdHVyZT0iMTAzMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iLlxSZWxlYXNlQ2xpZW50L3VkcGNsaWVudC5leGUiDQorCQkJCSANCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXFJlbGVhc2VDbGllbnQvdWRwY2xpZW50LnBkYiINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCU91dHB1dEZpbGU9Ii5cUmVsZWFzZUNsaWVudC91ZHBjbGllbnQuYnNjIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwk8L0NvbmZpZ3VyYXRpb25zPg0KKwk8UmVmZXJlbmNlcz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCINCisJCQk+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSJzb2FwQy5jcHAiDQorCQkJCT4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dJTk5UPTB4MDUwMTtXSU5WRVI9MHgwNTAxO19XSU4zMl9JRT0weDA2MDM7Ig0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0lOTlQ9MHgwNTAxO1dJTlZFUj0weDA1MDE7X1dJTjMyX0lFPTB4MDYwMzsiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9InNvYXBDbGllbnQuY3BwIg0KKwkJCQk+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XSU5OVD0weDA1MDE7V0lOVkVSPTB4MDUwMTtfV0lOMzJfSUU9MHgwNjAzOyINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dJTk5UPTB4MDUwMTtXSU5WRVI9MHgwNTAxO19XSU4zMl9JRT0weDA2MDM7Ig0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSJzdGRzb2FwMi5jcHAiDQorCQkJCT4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dJTk5UPTB4MDUwMTtXSU5WRVI9MHgwNTAxO19XSU4zMl9JRT0weDA2MDM7Ig0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0lOTlQ9MHgwNTAxO1dJTlZFUj0weDA1MDE7X1dJTjMyX0lFPTB4MDYwMzsiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cdWRwY2xpZW50LmNwcCINCisJCQkJPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCU9iamVjdEZpbGU9IiQoSW50RGlyKVwkKElucHV0TmFtZSkxLm9iaiINCisJCQkJCQlYTUxEb2N1bWVudGF0aW9uRmlsZU5hbWU9IiQoSW50RGlyKVwkKElucHV0TmFtZSkxLnhkYyINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlPYmplY3RGaWxlPSIkKEludERpcilcJChJbnB1dE5hbWUpMS5vYmoiDQorCQkJCQkJWE1MRG9jdW1lbnRhdGlvbkZpbGVOYW1lPSIkKEludERpcilcJChJbnB1dE5hbWUpMS54ZGMiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IkhlYWRlciBGaWxlcyINCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmwiDQorCQkJPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0ic29hcEguaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9InNvYXBTdHViLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSJzdGRzb2FwMi5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0idWRwLmgiDQorCQkJCT4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJCQkJRGVzY3JpcHRpb249ImdTT0FQIFdlYiBzZXJ2aWNlIHByb3h5L3NrZWxldG9uIGJ1aWxkIG9uICQoSW5wdXRQYXRoKSINCisJCQkJCQlDb21tYW5kTGluZT0iLlxzb2FwY3BwMi5leGUgJnF1b3Q7JChJbnB1dFBhdGgpJnF1b3Q7IC1JXGRldlx0aGlyZF9wYXJ0eVxnc29hcC13aW4zMi0yLjdcaW1wb3J0JiN4MEQ7JiN4MEE7Ig0KKwkJCQkJCU91dHB1dHM9InNvYXBTdHViLmggc29hcEguaCBzb2FwQy5jcHAgc29hcENsaWVudC5jcHAiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlJlc291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlIg0KKwkJCT4NCisJCTwvRmlsdGVyPg0KKwk8L0ZpbGVzPg0KKwk8R2xvYmFscz4NCisJPC9HbG9iYWxzPg0KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS9zYW1wbGVzL3VkcF9WQy91ZHBzZXJ2ZXIuY3BwIGIvc2FtcGxlcy91ZHBfVkMvdWRwc2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTYwYmY4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy91ZHBfVkMvdWRwc2VydmVyLmNwcApAQCAtMCwwICsxLDE0MyBAQAorLyoKKwordWRwc2VydmVyLmMKKworU09BUC1vdmVyLVVEUCBkZW1vIHNlcnZlcgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyB0d28gbGljZW5zZXM6CitHUEwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbmNsdWRlICJzb2FwSC5oIgorI2luY2x1ZGUgInVkcC5uc21hcCIKKworI2RlZmluZSBNQVhfSElTVE9SWSAoMTAwMCkKKworY2hhciAqcmVjZWl2ZWRfaWRbTUFYX0hJU1RPUlldOworaW50IGxhc3RfcmVjZWl2ZWQ7Cit2b2lkIGluaXRfcmVjZWl2ZWQoKTsKK2ludCBjaGVja19yZWNlaXZlZChjb25zdCBjaGFyICppZCk7CisKK2ludCBpZF9jb3VudCA9IDE7CisKK2ludCBtYWluKCkKK3sgc3RydWN0IHNvYXAgc29hcDsKKyAgaW5pdF9yZWNlaXZlZCgpOworICBzb2FwX2luaXQxKCZzb2FwLCBTT0FQX0lPX1VEUCk7CisgIGlmICghc29hcF92YWxpZF9zb2NrZXQoc29hcF9iaW5kKCZzb2FwLCBOVUxMLCAxMDAwMCwgMTAwKSkpCisgIHsgc29hcF9wcmludF9mYXVsdCgmc29hcCwgc3RkZXJyKTsKKyAgICBleGl0KDEpOworICB9CisgIGZvciAoOzspCisgIHsgcHJpbnRmKCJBY2NlcHRpbmcgcmVxdWVzdHMuLi5cbiIpOworICAgIGlmIChzb2FwX3NlcnZlKCZzb2FwKSkKKyAgICAgIHNvYXBfcHJpbnRfZmF1bHQoJnNvYXAsIHN0ZGVycik7CisgICAgc29hcF9lbmQoJnNvYXApOworICB9CisgIHNvYXBfZG9uZSgmc29hcCk7CisgIHJldHVybiAwOworfQorCit2b2lkIGluaXRfcmVjZWl2ZWQoKQoreyBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IE1BWF9ISVNUT1JZOyBpKyspCisgICAgcmVjZWl2ZWRfaWRbaV0gPSBOVUxMOworICBsYXN0X3JlY2VpdmVkID0gMDsKK30KKworaW50IGNoZWNrX3JlY2VpdmVkKGNvbnN0IGNoYXIgKmlkKQoreyBpbnQgaTsKKyAgaWYgKCFpZCkKKyAgICByZXR1cm4gMTsKKyAgLyogQ2hlY2sgaWYgTWVzc2FnZSBJRCBhbHJlYWR5IHJlY2VpdmVkICovCisgIGZvciAoaSA9IDA7IGkgPCBNQVhfSElTVE9SWTsgaSsrKQorICB7IGlmIChyZWNlaXZlZF9pZFtpXSAmJiAhc3RyY21wKGlkLCByZWNlaXZlZF9pZFtpXSkpCisgICAgICByZXR1cm4gMTsKKyAgfQorICBpZiAocmVjZWl2ZWRfaWRbbGFzdF9yZWNlaXZlZF0pCisgICAgZnJlZShyZWNlaXZlZF9pZFtsYXN0X3JlY2VpdmVkXSk7CisgIHJlY2VpdmVkX2lkW2xhc3RfcmVjZWl2ZWQrK10gPSBzdHJkdXAoaWQpOworICAvKiBXcmFwIHRvIG92ZXJ3cml0ZSBvbGQgSURzICovCisgIGlmIChsYXN0X3JlY2VpdmVkID49IE1BWF9ISVNUT1JZKQorICAgIGxhc3RfcmVjZWl2ZWQgPSAwOworICByZXR1cm4gMDsKK30KKworaW50IGNoZWNrX2hlYWRlcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgLyogTVVTVCBoYXZlIHJlY2VpdmVkIGEgU09BUCBIZWFkZXIgKi8KKyAgaWYgKCFzb2FwLT5oZWFkZXIpCisgICAgcmV0dXJuIHNvYXBfc2VuZGVyX2ZhdWx0KHNvYXAsICJObyBTT0FQIGhlYWRlciIsIE5VTEwpOworICAvKiAuLi4gd2l0aCBhIE1lc3NhZ2UgSUQgKi8KKyAgaWYgKCFzb2FwLT5oZWFkZXItPndzYV9fTWVzc2FnZUlEKQorICAgIHJldHVybiBzb2FwX3NlbmRlcl9mYXVsdChzb2FwLCAiTm8gV1MtQWRkcmVzc2luZyBNZXNzYWdlSUQiLCBOVUxMKTsKKyAgc29hcC0+aGVhZGVyLT53c2FfX1JlbGF0ZXNUbyA9IChzdHJ1Y3Qgd3NhX19SZWxhdGlvbnNoaXAqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3Qgd3NhX19SZWxhdGlvbnNoaXApKTsKKyAgc29hcF9kZWZhdWx0X3dzYV9fUmVsYXRpb25zaGlwKHNvYXAsIHNvYXAtPmhlYWRlci0+d3NhX19SZWxhdGVzVG8pOworICBzb2FwLT5oZWFkZXItPndzYV9fUmVsYXRlc1RvLT5fX2l0ZW0gPSBzb2FwLT5oZWFkZXItPndzYV9fTWVzc2FnZUlEOworICByZXR1cm4gU09BUF9PSzsKK30KKworaW50IG5zX19lY2hvU3RyaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpzdHIsIGNoYXIgKipyZXMpCit7IC8qIEdldCBIZWFkZXIgaW5mbyBhbmQgc2V0dXAgcmVzcG9uc2UgSGVhZGVyICovCisgIGlmIChjaGVja19oZWFkZXIoc29hcCkpCisgIHsgcHJpbnRmKCJNYWxmb3JtZWQgaGVhZGVyXG4iKTsKKyAgICByZXR1cm4gU09BUF9GQVVMVDsgLyogdGhlcmUgd2FzIGEgcHJvYmxlbSAqLworICB9CisKKyAgLyogSWYgbWVzc2FnZSB3aXRoIE1lc3NhZ2VJRCBhbHJlYWR5IHJlY2VpdmVkLCBpZ25vcmUgaXQgKi8KKyAgaWYgKGNoZWNrX3JlY2VpdmVkKHNvYXAtPmhlYWRlci0+d3NhX19NZXNzYWdlSUQpKQorICB7IHByaW50ZigiUmVxdWVzdCBtZXNzYWdlICVzIGFscmVhZHkgcmVjZWl2ZWRcbiIsIHNvYXAtPmhlYWRlci0+d3NhX19NZXNzYWdlSUQpOworICAgIHJldHVybiBTT0FQX1NUT1A7CisgIH0KKworICBwcmludGYoIlJlcXVlc3QgbWVzc2FnZSAlcyBhY2NlcHRlZFxuIiwgc29hcC0+aGVhZGVyLT53c2FfX01lc3NhZ2VJRCk7CisKKyAgLyogQ2hlY2sgUmVwbHlUbyBoYXMgQWRkcmVzcyAqLworICBpZiAoIXNvYXAtPmhlYWRlci0+d3NhX19SZXBseVRvIHx8ICFzb2FwLT5oZWFkZXItPndzYV9fUmVwbHlUby0+QWRkcmVzcykKKyAgICByZXR1cm4gc29hcF9zZW5kZXJfZmF1bHQoc29hcCwgIk5vIFdTLUFkZHJlc3NpbmcgUmVwbHlUbyBhZGRyZXNzIiwgTlVMTCk7CisgIC8qIENvcHkgSGVhZGVyIGluZm8gaW50byByZXNwb25zZSBIZWFkZXIgKi8KKyAgc29hcC0+aGVhZGVyLT53c2FfX1RvID0gc29hcC0+aGVhZGVyLT53c2FfX1JlcGx5VG8tPkFkZHJlc3M7CisKKyAgLyogQWRkIGluZm8gdG8gcmVzcG9uc2UgSGVhZGVyICovCisgIHNvYXAtPmhlYWRlci0+d3NhX19NZXNzYWdlSUQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwX2ludDJzKHNvYXAsIGlkX2NvdW50KyspKTsKKyAgc29hcC0+aGVhZGVyLT53c2FfX0FjdGlvbiA9ICJodHRwOi8vZ2VuaXZpYS5jb20vdWRwL2VjaG9TdHJpbmdSZXNwb25zZSI7CisKKyAgLyogQ29weSByZXF1ZXN0IHN0cmluZyBpbnRvIHJlc3BvbnNlIHN0cmluZyAqLworICBwcmludGYoIlJlc3BvbnNlIG1lc3NhZ2UgJXMgcmV0dXJuZWRcbiIsIHNvYXAtPmhlYWRlci0+d3NhX19NZXNzYWdlSUQpOworICAqcmVzID0gc3RyOworCisgIHJldHVybiBTT0FQX09LOworfQorCitpbnQgbnNfX3NlbmRTdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnN0cikKK3sgaWYgKGNoZWNrX2hlYWRlcihzb2FwKSkKKyAgICBwcmludGYoIk1hbGZvcm1lZCBoZWFkZXJcbiIpOworICBlbHNlIGlmIChjaGVja19yZWNlaXZlZChzb2FwLT5oZWFkZXItPndzYV9fTWVzc2FnZUlEKSkKKyAgICBwcmludGYoIk9uZS13YXkgbWVzc2FnZSAlcyBhbHJlYWR5IHJlY2VpdmVkXG4iLCBzb2FwLT5oZWFkZXItPndzYV9fTWVzc2FnZUlEKTsKKyAgZWxzZQorICAgIHByaW50ZigiT25lLXdheSBtZXNzYWdlICVzIGFjY2VwdGVkIGFuZCBzZXJ2aWNlZFxuIiwgc29hcC0+aGVhZGVyLT53c2FfX01lc3NhZ2VJRCk7CisgIHJldHVybiBTT0FQX09LOworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy91ZHBfVkMvdWRwc2VydmVyLnNsbiBiL3NhbXBsZXMvdWRwX1ZDL3VkcHNlcnZlci5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRiOWJmNAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvdWRwX1ZDL3VkcHNlcnZlci5zbG4KQEAgLTAsMCArMSwyMCBAQAor77u/CitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiA5LjAwCisjIFZpc3VhbCBTdHVkaW8gMjAwNQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJ1ZHBzZXJ2ZXIiLCAidWRwc2VydmVyLnZjcHJvaiIsICJ7MTI0NTBCNTktQkRDQy00MUYwLUFCREQtNEM3NTE3QkU2OTBEfSIKK0VuZFByb2plY3QKK0dsb2JhbAorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uCisJCURlYnVnfFdpbjMyID0gRGVidWd8V2luMzIKKwkJUmVsZWFzZXxXaW4zMiA9IFJlbGVhc2V8V2luMzIKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24KKwkJezEyNDUwQjU5LUJEQ0MtNDFGMC1BQkRELTRDNzUxN0JFNjkwRH0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzIKKwkJezEyNDUwQjU5LUJEQ0MtNDFGMC1BQkRELTRDNzUxN0JFNjkwRH0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyCisJCXsxMjQ1MEI1OS1CRENDLTQxRjAtQUJERC00Qzc1MTdCRTY5MER9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgorCQl7MTI0NTBCNTktQkRDQy00MUYwLUFCREQtNEM3NTE3QkU2OTBEfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvc2FtcGxlcy91ZHBfVkMvdWRwc2VydmVyLnZjcHJvaiBiL3NhbXBsZXMvdWRwX1ZDL3VkcHNlcnZlci52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJjMDEzOAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvdWRwX1ZDL3VkcHNlcnZlci52Y3Byb2oKQEAgLTAsMCArMSwzMTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI4LjAwIg0KKwlOYW1lPSJ1ZHBzZXJ2ZXIiDQorCVByb2plY3RHVUlEPSJ7MTI0NTBCNTktQkRDQy00MUYwLUFCREQtNEM3NTE3QkU2OTBEfSINCisJUm9vdE5hbWVzcGFjZT0idWRwc2VydmVyIg0KKwlLZXl3b3JkPSJXaW4zMlByb2oiDQorCT4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIg0KKwkJLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxUb29sRmlsZXM+DQorCTwvVG9vbEZpbGVzPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxEZWJ1Z1NlcnZlciINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cRGVidWdTZXJ2ZXIiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM2MC52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5cRGVidWdTZXJ2ZXIvdWRwc2VydmVyLnRsYiINCisJCQkJSGVhZGVyRmlsZU5hbWU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCSANCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XSU5OVD0weDA1MDE7V0lOVkVSPTB4MDUwMTtfV0lOMzJfSUU9MHgwNjAzO1dJTjMyO19ERUJVRztfQ09OU09MRTtXSVRIX05PSFRUUDtXSVRIX1VEUCINCisJCQkJIA0KKwkJCQkgDQorCQkJCSANCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXERlYnVnU2VydmVyL3VkcHNlcnZlci5wY2giDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlxEZWJ1Z1NlcnZlci8iDQorCQkJCU9iamVjdEZpbGU9Ii5cRGVidWdTZXJ2ZXIvIg0KKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlxEZWJ1Z1NlcnZlci8iDQorCQkJCSANCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQkgDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0lOTlQ9MHgwNTAxO1dJTlZFUj0weDA1MDE7X1dJTjMyX0lFPTB4MDYwMztfREVCVUciDQorCQkJCUN1bHR1cmU9IjEwMzMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Im9kYmMzMi5saWIgb2RiY2NwMzIubGliIHdzb2NrMzIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuXERlYnVnU2VydmVyL3VkcHNlcnZlci5leGUiDQorCQkJCSANCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQkNCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlxEZWJ1Z1NlcnZlci91ZHBzZXJ2ZXIucGRiIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJT3V0cHV0RmlsZT0iLlxEZWJ1Z1NlcnZlci91ZHBzZXJ2ZXIuYnNjIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlxSZWxlYXNlU2VydmVyIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxSZWxlYXNlU2VydmVyIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNjAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIuXFJlbGVhc2VTZXJ2ZXIvdWRwc2VydmVyLnRsYiINCisJCQkJSGVhZGVyRmlsZU5hbWU9IiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCSANCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0lOTlQ9MHgwNTAxO1dJTlZFUj0weDA1MDE7X1dJTjMyX0lFPTB4MDYwMztXSU4zMjtOREVCVUc7X0NPTlNPTEUiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCSANCisJCQkJIA0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cUmVsZWFzZVNlcnZlci91ZHBzZXJ2ZXIucGNoIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cUmVsZWFzZVNlcnZlci8iDQorCQkJCU9iamVjdEZpbGU9Ii5cUmVsZWFzZVNlcnZlci8iDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXFJlbGVhc2VTZXJ2ZXIvIg0KKwkJCQkgDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9XSU4zMl9XSU5OVD0weDA1MDE7V0lOVkVSPTB4MDUwMTtfV0lOMzJfSUU9MHgwNjAzO05ERUJVRyINCisJCQkJQ3VsdHVyZT0iMTAzMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iLlxSZWxlYXNlU2VydmVyL3VkcHNlcnZlci5leGUiDQorCQkJCSANCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXFJlbGVhc2VTZXJ2ZXIvdWRwc2VydmVyLnBkYiINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCU91dHB1dEZpbGU9Ii5cUmVsZWFzZVNlcnZlci91ZHBzZXJ2ZXIuYnNjIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwk8L0NvbmZpZ3VyYXRpb25zPg0KKwk8UmVmZXJlbmNlcz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCINCisJCQk+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSJzb2FwQy5jcHAiDQorCQkJCT4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dJTk5UPTB4MDUwMTtXSU5WRVI9MHgwNTAxO19XSU4zMl9JRT0weDA2MDM7Ig0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0lOTlQ9MHgwNTAxO1dJTlZFUj0weDA1MDE7X1dJTjMyX0lFPTB4MDYwMzsiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cc29hcFNlcnZlci5jcHAiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSJzdGRzb2FwMi5jcHAiDQorCQkJCT4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX1dJTjMyX1dJTk5UPTB4MDUwMTtXSU5WRVI9MHgwNTAxO19XSU4zMl9JRT0weDA2MDM7Ig0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfV0lOMzJfV0lOTlQ9MHgwNTAxO1dJTlZFUj0weDA1MDE7X1dJTjMyX0lFPTB4MDYwMzsiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cdWRwc2VydmVyLmNwcCINCisJCQkJPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCU9iamVjdEZpbGU9IiQoSW50RGlyKVwkKElucHV0TmFtZSkxLm9iaiINCisJCQkJCQlYTUxEb2N1bWVudGF0aW9uRmlsZU5hbWU9IiQoSW50RGlyKVwkKElucHV0TmFtZSkxLnhkYyINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlPYmplY3RGaWxlPSIkKEludERpcilcJChJbnB1dE5hbWUpMS5vYmoiDQorCQkJCQkJWE1MRG9jdW1lbnRhdGlvbkZpbGVOYW1lPSIkKEludERpcilcJChJbnB1dE5hbWUpMS54ZGMiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IkhlYWRlciBGaWxlcyINCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmwiDQorCQkJPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0ic29hcEguaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9InNvYXBTdHViLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSJzdGRzb2FwMi5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0idWRwLmgiDQorCQkJCT4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJCQkJRGVzY3JpcHRpb249ImdTT0FQIFdlYiBzZXJ2aWNlIHByb3h5L3NrZWxldG9uIGJ1aWxkIG9uICQoSW5wdXRQYXRoKSINCisJCQkJCQlDb21tYW5kTGluZT0iLlxzb2FwY3BwMi5leGUgJnF1b3Q7JChJbnB1dFBhdGgpJnF1b3Q7IC1JXGRldlx0aGlyZF9wYXJ0eVxnc29hcC13aW4zMi0yLjdcaW1wb3J0JiN4MEQ7JiN4MEE7Ig0KKwkJCQkJCU91dHB1dHM9InNvYXBTdHViLmggc29hcEguaCBzb2FwQy5jcHAgc29hcENsaWVudC5jcHAiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlJlc291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlIg0KKwkJCT4NCisJCTwvRmlsdGVyPg0KKwk8L0ZpbGVzPg0KKwk8R2xvYmFscz4NCisJPC9HbG9iYWxzPg0KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS9zYW1wbGVzL3ZhcnBhcmFtL01ha2VmaWxlIGIvc2FtcGxlcy92YXJwYXJhbS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzFkYTIxCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy92YXJwYXJhbS9NYWtlZmlsZQpAQCAtMCwwICsxLDIwIEBACitHU09BUD0uLi8uLi9zb2FwY3BwMgorU09BUEg9Li4vLi4vc3Rkc29hcDIuaAorU09BUEM9Li4vLi4vc3Rkc29hcDIuYworU09BUENQUD0uLi8uLi9zdGRzb2FwMi5jcHAKK0NDPWdjYworQ1BQPWcrKworTElCUz0KK0NPRkxBR1M9LU8yCitDV0ZMQUdTPS1XYWxsCitDSUZMQUdTPS1JLi4vLi4KK0NNRkxBR1M9CitDRkxBR1M9ICQoQ1dGTEFHUykgJChDT0ZMQUdTKSAkKENJRkxBR1MpICQoQ01GTEFHUykKK2FsbDoJCXZhcnBhcmFtCit2YXJwYXJhbToJdmFycGFyYW0uaCB2YXJwYXJhbS5jcHAgJChTT0FQSCkgJChTT0FQQ1BQKQorCQkkKEdTT0FQKSB2YXJwYXJhbS5oCisJCSQoQ1BQKSAkKENGTEFHUykgLW8gdmFycGFyYW0gdmFycGFyYW0uY3BwIHNvYXBDLmNwcCBzb2FwQ2xpZW50LmNwcCBzb2FwU2VydmVyLmNwcCAkKFNPQVBDUFApICQoTElCUykKK2NsZWFuOgorCQlybSAtZiAqLm8gc29hcEguaCBzb2FwU3R1Yi5oIHNvYXBDLmNwcCBzb2FwQy5jIHNvYXBDbGllbnQuY3BwIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmNwcCBzb2FwU2VydmVyLmMgc29hcCpQcm94eS5oCitkaXN0Y2xlYW46CisJCXJtIC1mICoubyAqLndzZGwgKi54c2QgKi54bWwgKi5uc21hcCAqLmxvZyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5LmggdmFycGFyYW0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvdmFycGFyYW0vTWFrZWZpbGVTb2xhcmlzIGIvc2FtcGxlcy92YXJwYXJhbS9NYWtlZmlsZVNvbGFyaXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwODZmYQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvdmFycGFyYW0vTWFrZWZpbGVTb2xhcmlzCkBAIC0wLDAgKzEsMjAgQEAKK0dTT0FQPS4uLy4uL3NvYXBjcHAyCitTT0FQSD0uLi8uLi9zdGRzb2FwMi5oCitTT0FQQz0uLi8uLi9zdGRzb2FwMi5jCitTT0FQQ1BQPS4uLy4uL3N0ZHNvYXAyLmNwcAorQ0M9Z2NjCitDUFA9ZysrCitMSUJTPS1seG5ldCAtbG5zbCAtbHNvY2tldAorQ09GTEFHUz0tTzIKK0NXRkxBR1M9LVdhbGwKK0NJRkxBR1M9LUkuLi8uLgorQ01GTEFHUz0KK0NGTEFHUz0gJChDV0ZMQUdTKSAkKENPRkxBR1MpICQoQ0lGTEFHUykgJChDTUZMQUdTKQorYWxsOgkJdmFycGFyYW0KK3ZhcnBhcmFtOgl2YXJwYXJhbS5oIHZhcnBhcmFtLmNwcCAkKFNPQVBIKSAkKFNPQVBDUFApCisJCSQoR1NPQVApIHZhcnBhcmFtLmgKKwkJJChDUFApICQoQ0ZMQUdTKSAtbyB2YXJwYXJhbSB2YXJwYXJhbS5jcHAgc29hcEMuY3BwIHNvYXBDbGllbnQuY3BwIHNvYXBTZXJ2ZXIuY3BwICQoU09BUENQUCkgJChMSUJTKQorY2xlYW46CisJCXJtIC1mICoubyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5LmgKK2Rpc3RjbGVhbjoKKwkJcm0gLWYgKi5vICoud3NkbCAqLnhzZCAqLnhtbCAqLm5zbWFwICoubG9nIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaCB2YXJwYXJhbQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy92YXJwYXJhbS92YXJwYXJhbS5jcHAgYi9zYW1wbGVzL3ZhcnBhcmFtL3ZhcnBhcmFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmQ3ZjI2Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy92YXJwYXJhbS92YXJwYXJhbS5jcHAKQEAgLTAsMCArMSwzOTAgQEAKKy8qCXZhcnBhcmFtLmNwcAorCisJRXhhbXBsZSB1c2Ugb2YgdmFyaWFibGUgcGFyYW1ldGVyIGxpc3RzIHdpdGggdGhlIGZ1bGwgWE1MCisJc2NoZW1hIHR5cGUgaGllcmFyY2h5IGltcGxlbWVudGVkIGFzIGEgQysrIGNsYXNzIGhpZXJhcmNoeS4KKworCUNvcHlyaWdodCAoQykgMjAwMC0yMDAyIFJvYmVydCBBLiB2YW4gRW5nZWxlbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworRGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgdmFyaWFibGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgYW5kIHBvbHltb3JwaGljCitwYXJhbWV0ZXJzLiBUaGUgJ3RyaWNrJyBpcyB0byB1c2UgX19zaXplIHBhcmFtZXRlcnMuIFRoZSBfX3NpemUgZmllbGRzCitjYW4gYmUgdXNlZCBpbiBzdHJ1Y3RzL2NsYXNzZXMgdG8gZW1iZWQgYXJyYXlzLiBCZWNhdXNlIGEgcmVxdWVzdCBtZXNzYWdlCitvZiBhIHJlbW90ZSBtZXRob2QgaXMgZXNzZW50aWFsbHkgYSBzdHJ1Y3QsIHRoZSB1c2Ugb2YgX19zaXplIGluIAorcGFyYW1ldGVycyBvZiBhIG1ldGhvZCBoYXMgdGhlIGVmZmVjdCBvZiBzZW5kaW5nIGEgdmFyaWFibGUgbnVtYmVyIG9mCitwYXJhbWV0ZXJzLgorCitVc2Ugb3B0aW9uIC1pIHdpdGggc29hcGNwcDIgdG8gY29tcGlsZSB0aGUgaGVhZGVyIGZpbGUgdmFycGFyYW0uaAorCitSdW4gdGhlIGV4ZWN1dGFibGUgYXMgY2xpZW50IGZyb20gdGhlIGNvbW1hbmQgbGluZSB3aXRoIG9uZSBhcmd1bWVudAordG8gdGVzdCB0aGUgcG9seW1vcnBoaWMgcGFyYW1ldGVyIGV4Y2hhbmdlLiBSdW4gd2l0aCBtb3JlIGFyZ3VtZW50cwordG8gc2VuZCB0aGUgYXJndW1lbnRzIGFzIGEgdmFyaWFibGUgcGFyYW1ldGVyIGxpc3QgdG8gdGhlIHNlcnZlci4KKworKi8KKworI2luY2x1ZGUgInNvYXBILmgiCisjaW5jbHVkZSAidmFycGFyYW0ubnNtYXAiCisKK2NoYXIgKmVuZHBvaW50ID0gImh0dHA6Ly93ZWJzcnYuY3MuZnN1LmVkdS9+ZW5nZWxlbi92YXJwYXJhbS5jZ2kiOworCisjZGVmaW5lIE4gMTAwIC8vIG1heCBudW1iZXIgb2YgcGFyYW1ldGVycworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7IHN0cnVjdCBzb2FwIHNvYXA7CisgIHN0cnVjdCBuc19fdmFyUG9seVBhcmFtVGVzdFJlc3BvbnNlIHI7CisgIGludCBuOworICB4c2RfX2FueVR5cGUgKnBbTl07CS8vIGFycmF5IG9mIHBvbHltb3JwaGljIHBhcmFtZXRlcnMKKyAgc29hcF9pbml0KCZzb2FwKTsKKyAgaWYgKGFyZ2MgPCAyKQorICB7IHNvYXBfc2VydmUoJnNvYXApOworICAgIHNvYXBfZGVzdHJveSgmc29hcCk7CisgICAgc29hcF9lbmQoJnNvYXApOworICAgIHJldHVybiAwOworICB9CisgIGlmIChhcmdjIDwgMykKKyAgeyBwWzBdID0gbmV3IHhzZF9fYW55VVJJKGVuZHBvaW50KTsKKyAgICBwWzFdID0gbmV3IHhzZF9fc3RyaW5nKGFyZ3ZbMV0pOworICAgIHBbMl0gPSBuZXcgeHNkX19ib29sZWFuKHRydWUpOworICAgIHBbM10gPSBuZXcgeHNkX19kYXRlVGltZSh0aW1lKE5VTEwpKTsKKyAgICBwWzRdID0gbmV3IHhzZF9fZG91YmxlKDEyMzQ1NjcuODkpOworICAgIHBbNV0gPSBuZXcgeHNkX19iYXNlNjRCaW5hcnkoImVuY29kZWQgaW4gYmFzZTY0Iik7CisgICAgcFs2XSA9IG5ldyB4c2RfX2hleEJpbmFyeSgiZW5jb2RlZCBpbiBoZXgiKTsKKyAgICBwWzddID0gbmV3IGFycmF5KDQpOworICAgICgqcFs3XSlbMF0gPSBuZXcgeHNkX19pbnQoNyk7CisgICAgKCpwWzddKVsxXSA9IE5VTEw7CisgICAgKCpwWzddKVsyXSA9IG5ldyB4c2RfX3Rva2VuKCJ4Iik7CisgICAgKCpwWzddKVszXSA9IHBbMV07CisgICAgcFs4XSA9IHBbMV07CisgICAgbiA9IDk7IC8vIGFjdHVhbCBudW1iZXIgb2YgcGFyYW1ldGVycworICAgIGlmIChzb2FwX2NhbGxfbnNfX3ZhclBvbHlQYXJhbVRlc3QoJnNvYXAsIGVuZHBvaW50LCAiIiwgbiwgcCwgcikpCisgICAgICBzb2FwX3ByaW50X2ZhdWx0KCZzb2FwLCBzdGRlcnIpOworICAgIGVsc2UKKyAgICB7IHN0ZDo6Y291dCA8PCAiU2VydmVyIGhhcyBlY2hvZWQ6IiA8PCBzdGQ6OmVuZGw7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHIuX19zaXplOyBpKyspCisgICAgICAgIHIucGFyYW1baV0tPnByaW50KHN0ZDo6Y291dCk7CisgICAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKKyAgICAgIGRlbGV0ZSBwW2ldOworICB9CisgIGVsc2UKKyAgeyBpZiAoc29hcF9jYWxsX25zX192YXJTdHJpbmdQYXJhbVRlc3QoJnNvYXAsIGVuZHBvaW50LCAiIiwgYXJnYywgYXJndiwgbikpCisgICAgICBzb2FwX3ByaW50X2ZhdWx0KCZzb2FwLCBzdGRlcnIpOworICAgIGVsc2UKKyAgICAgIHByaW50ZigiU2VydmVyIGhhcyByZXNwb25kZWQgdG8gJWQgc3RyaW5nc1xuIiwgbik7CisgIH0KKyAgc29hcF9kZXN0cm95KCZzb2FwKTsKKyAgc29hcF9lbmQoJnNvYXApOworICBzb2FwX2RvbmUoJnNvYXApOworICByZXR1cm4gMDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgUmVtb3RlIG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitpbnQgbnNfX3ZhclN0cmluZ1BhcmFtVGVzdChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IF9fc2l6ZSwgY2hhciAqKnBhcmFtLCBpbnQgJnJldHVybl8pCit7IHJldHVybl8gPSBfX3NpemU7CisgIHJldHVybiBTT0FQX09LOworfQorCitpbnQgbnNfX3ZhclBvbHlQYXJhbVRlc3Qoc3RydWN0IHNvYXAgKnNvYXAsIGludCBfX3NpemUsIHhzZF9fYW55VHlwZSAqKnBhcmFtLCBzdHJ1Y3QgbnNfX3ZhclBvbHlQYXJhbVRlc3RSZXNwb25zZSAmb3V0KQoreyBvdXQuX19zaXplID0gX19zaXplOworICBvdXQucGFyYW0gPSBwYXJhbTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIFhTRCBzY2hlbWEgY2xhc3MgaGllcmFyY2h5CisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworeHNkX19hbnlUeXBlOjp4c2RfX2FueVR5cGUoKQoreyBzb2FwID0gTlVMTDsJCQkvLyBUaGlzIHdpbGwgYmUgc2V0IGJ5IGdTT0FQIGVudmlyb25tZW50IGxhdGVyICh1cG9uIGRlc2VyaWFsaXphdGlvbiBvciBjYWxsaW5nIHNvYXBfbmV3X1goKQorfQoreHNkX19hbnlUeXBlOjp+eHNkX19hbnlUeXBlKCkKK3sgc29hcF91bmxpbmsoc29hcCwgdGhpcyk7CS8vIExldCBnU09BUCBub3QgZGVhbGxvY2F0ZSB0aGlzIG9iamVjdCBhZ2FpbiBpZiB0aGlzIG9iamVjdCB3YXMgZXhwbGljaXRseSByZW1vdmVkCit9Cit4c2RfX2FueVR5cGUqJiB4c2RfX2FueVR5cGU6Om9wZXJhdG9yW10oaW50IGkpCit7IHN0YXRpYyB4c2RfX2FueVR5cGUgKnAgPSB0aGlzOwkvLyB0cmljazogd2UgZG9uJ3QgZXhwZWN0IHRoZSBvcGVyYXRvciB0byBiZSBhcHBsaWVkLCBidXQgd2UgbmVlZCBhIG1ldGhvZAorICByZXR1cm4gcDsKK30KK3ZvaWQgeHNkX19hbnlUeXBlOjpwcmludChzdGQ6Om9zdHJlYW0gJnMpIGNvbnN0Cit7IHMgPDwgIjxhbnlUeXBlPiI7IH0KKworeHNkX19hbnlTaW1wbGVUeXBlOjp4c2RfX2FueVNpbXBsZVR5cGUoKQoreyB9Cit4c2RfX2FueVNpbXBsZVR5cGU6On54c2RfX2FueVNpbXBsZVR5cGUoKQoreyB9Cit2b2lkIHhzZF9fYW55U2ltcGxlVHlwZTo6cHJpbnQoc3RkOjpvc3RyZWFtICZzKSBjb25zdAoreyBzIDw8ICI8YW55U2ltcGxlVHlwZT4iOyB9CisKK3hzZF9fYW55VVJJOjp4c2RfX2FueVVSSSgpCit7IH0KK3hzZF9fYW55VVJJOjp+eHNkX19hbnlVUkkoKQoreyB9Cit4c2RfX2FueVVSSTo6eHNkX19hbnlVUkkoY2hhciAqcykKK3sgX19pdGVtID0gczsgfQordm9pZCB4c2RfX2FueVVSSTo6cHJpbnQoc3RkOjpvc3RyZWFtICZzKSBjb25zdAoreyBzIDw8ICI8YW55VVJJPSIgPDwgKF9faXRlbSA/IF9faXRlbSA6ICIobnVsbCkiKSA8PCAiPiI7IH0KKworeHNkX19ib29sZWFuOjp4c2RfX2Jvb2xlYW4oKQoreyB9Cit4c2RfX2Jvb2xlYW46On54c2RfX2Jvb2xlYW4oKQoreyB9Cit4c2RfX2Jvb2xlYW46OnhzZF9fYm9vbGVhbihib29sIGIpCit7IF9faXRlbSA9IGI7IH0KK3ZvaWQgeHNkX19ib29sZWFuOjpwcmludChzdGQ6Om9zdHJlYW0gJnMpIGNvbnN0Cit7IHMgPDwgIjxib29sZWFuPSIgPDwgX19pdGVtIDw8ICI+IjsgfQorCit4c2RfX2RhdGU6OnhzZF9fZGF0ZSgpCit7IH0KK3hzZF9fZGF0ZTo6fnhzZF9fZGF0ZSgpCit7IH0KK3hzZF9fZGF0ZTo6eHNkX19kYXRlKGNoYXIgKnMpCit7IF9faXRlbSA9IHM7IH0KK3ZvaWQgeHNkX19kYXRlOjpwcmludChzdGQ6Om9zdHJlYW0gJnMpIGNvbnN0Cit7IHMgPDwgIjxkYXRlPSIgPDwgKF9faXRlbSA/IF9faXRlbSA6ICIobnVsbCkiKSA8PCAiPiI7IH0KKworeHNkX19kYXRlVGltZTo6eHNkX19kYXRlVGltZSgpCit7IH0KK3hzZF9fZGF0ZVRpbWU6On54c2RfX2RhdGVUaW1lKCkKK3sgfQoreHNkX19kYXRlVGltZTo6eHNkX19kYXRlVGltZSh0aW1lX3QgdCkKK3sgX19pdGVtID0gdDsgfQordm9pZCB4c2RfX2RhdGVUaW1lOjpwcmludChzdGQ6Om9zdHJlYW0gJnMpIGNvbnN0Cit7IHMgPDwgIjxkYXRlVGltZT0iIDw8IF9faXRlbSA8PCAiPiI7IH0KKworeHNkX19kb3VibGU6OnhzZF9fZG91YmxlKCkKK3sgfQoreHNkX19kb3VibGU6On54c2RfX2RvdWJsZSgpCit7IH0KK3hzZF9fZG91YmxlOjp4c2RfX2RvdWJsZShkb3VibGUgZCkKK3sgX19pdGVtID0gZDsgfQordm9pZCB4c2RfX2RvdWJsZTo6cHJpbnQoc3RkOjpvc3RyZWFtICZzKSBjb25zdAoreyBzIDw8ICI8ZG91YmxlPSIgPDwgX19pdGVtIDw8ICI+IjsgfQorCit4c2RfX2R1cmF0aW9uOjp4c2RfX2R1cmF0aW9uKCkKK3sgfQoreHNkX19kdXJhdGlvbjo6fnhzZF9fZHVyYXRpb24oKQoreyB9Cit4c2RfX2R1cmF0aW9uOjp4c2RfX2R1cmF0aW9uKGNoYXIgKnMpCit7IF9faXRlbSA9IHM7IH0KK3ZvaWQgeHNkX19kdXJhdGlvbjo6cHJpbnQoc3RkOjpvc3RyZWFtICZzKSBjb25zdAoreyBzIDw8ICI8ZHVyYXRpb249IiA8PCAoX19pdGVtID8gX19pdGVtIDogIihudWxsKSIpIDw8ICI+IjsgfQorCit4c2RfX2Zsb2F0Ojp4c2RfX2Zsb2F0KCkKK3sgfQoreHNkX19mbG9hdDo6fnhzZF9fZmxvYXQoKQoreyB9Cit4c2RfX2Zsb2F0Ojp4c2RfX2Zsb2F0KGZsb2F0IGYpCit7IF9faXRlbSA9IGY7IH0KK3ZvaWQgeHNkX19mbG9hdDo6cHJpbnQoc3RkOjpvc3RyZWFtICZzKSBjb25zdAoreyBzIDw8ICI8ZmxvYXQ9IiA8PCBfX2l0ZW0gPDwgIj4iOyB9CisKK3hzZF9fdGltZTo6eHNkX190aW1lKCkKK3sgfQoreHNkX190aW1lOjp+eHNkX190aW1lKCkKK3sgfQoreHNkX190aW1lOjp4c2RfX3RpbWUoY2hhciAqcykKK3sgX19pdGVtID0gczsgfQordm9pZCB4c2RfX3RpbWU6OnByaW50KHN0ZDo6b3N0cmVhbSAmcykgY29uc3QKK3sgcyA8PCAiPHRpbWU9IiA8PCAoX19pdGVtID8gX19pdGVtIDogIihudWxsKSIpIDw8ICI+IjsgfQorCit4c2RfX3N0cmluZzo6eHNkX19zdHJpbmcoKQoreyB9Cit4c2RfX3N0cmluZzo6fnhzZF9fc3RyaW5nKCkKK3sgfQoreHNkX19zdHJpbmc6OnhzZF9fc3RyaW5nKGNoYXIgKnMpCit7IF9faXRlbSA9IHM7IH0KK3ZvaWQgeHNkX19zdHJpbmc6OnByaW50KHN0ZDo6b3N0cmVhbSAmcykgY29uc3QKK3sgcyA8PCAiPHN0cmluZz0iIDw8IChfX2l0ZW0gPyBfX2l0ZW0gOiAiKG51bGwpIikgPDwgIj4iOyB9CisKK3hzZF9fbm9ybWFsaXplZFN0cmluZzo6eHNkX19ub3JtYWxpemVkU3RyaW5nKCkKK3sgfQoreHNkX19ub3JtYWxpemVkU3RyaW5nOjp+eHNkX19ub3JtYWxpemVkU3RyaW5nKCkKK3sgfQoreHNkX19ub3JtYWxpemVkU3RyaW5nOjp4c2RfX25vcm1hbGl6ZWRTdHJpbmcoY2hhciAqcykKK3sgX19pdGVtID0gczsgfQordm9pZCB4c2RfX25vcm1hbGl6ZWRTdHJpbmc6OnByaW50KHN0ZDo6b3N0cmVhbSAmcykgY29uc3QKK3sgcyA8PCAiPG5vcm1hbGl6ZWRTdHJpbmc9IiA8PCAoX19pdGVtID8gX19pdGVtIDogIihudWxsKSIpIDw8ICI+IjsgfQorCit4c2RfX3Rva2VuOjp4c2RfX3Rva2VuKCkKK3sgfQoreHNkX190b2tlbjo6fnhzZF9fdG9rZW4oKQoreyB9Cit4c2RfX3Rva2VuOjp4c2RfX3Rva2VuKGNoYXIgKnMpCit7IF9faXRlbSA9IHM7IH0KK3ZvaWQgeHNkX190b2tlbjo6cHJpbnQoc3RkOjpvc3RyZWFtICZzKSBjb25zdAoreyBzIDw8ICI8dG9rZW49IiA8PCAoX19pdGVtID8gX19pdGVtIDogIihudWxsKSIpIDw8ICI+IjsgfQorCit4c2RfX2RlY2ltYWw6OnhzZF9fZGVjaW1hbCgpCit7IH0KK3hzZF9fZGVjaW1hbDo6fnhzZF9fZGVjaW1hbCgpCit7IH0KK3hzZF9fZGVjaW1hbDo6eHNkX19kZWNpbWFsKGNoYXIgKnMpCit7IF9faXRlbSA9IHM7IH0KK3ZvaWQgeHNkX19kZWNpbWFsOjpwcmludChzdGQ6Om9zdHJlYW0gJnMpIGNvbnN0Cit7IHMgPDwgIjxkZWNpbWFsPSIgPDwgKF9faXRlbSA/IF9faXRlbSA6ICIobnVsbCkiKSA8PCAiPiI7IH0KKworeHNkX19pbnRlZ2VyOjp4c2RfX2ludGVnZXIoKQoreyB9Cit4c2RfX2ludGVnZXI6On54c2RfX2ludGVnZXIoKQoreyB9Cit4c2RfX2ludGVnZXI6OnhzZF9faW50ZWdlcihjaGFyICpzKQoreyBfX2l0ZW0gPSBzOyB9Cit2b2lkIHhzZF9faW50ZWdlcjo6cHJpbnQoc3RkOjpvc3RyZWFtICZzKSBjb25zdAoreyBzIDw8ICI8aW50ZWdlcj0iIDw8IChfX2l0ZW0gPyBfX2l0ZW0gOiAiKG51bGwpIikgPDwgIj4iOyB9CisKK3hzZF9fbm9uUG9zaXRpdmVJbnRlZ2VyOjp4c2RfX25vblBvc2l0aXZlSW50ZWdlcigpCit7IH0KK3hzZF9fbm9uUG9zaXRpdmVJbnRlZ2VyOjp+eHNkX19ub25Qb3NpdGl2ZUludGVnZXIoKQoreyB9Cit4c2RfX25vblBvc2l0aXZlSW50ZWdlcjo6eHNkX19ub25Qb3NpdGl2ZUludGVnZXIoY2hhciAqcykKK3sgX19pdGVtID0gczsgfQordm9pZCB4c2RfX25vblBvc2l0aXZlSW50ZWdlcjo6cHJpbnQoc3RkOjpvc3RyZWFtICZzKSBjb25zdAoreyBzIDw8ICI8bm9uUG9zaXRpdmVJbnRlZ2VyPSIgPDwgKF9faXRlbSA/IF9faXRlbSA6ICIobnVsbCkiKSA8PCAiPiI7IH0KKworeHNkX19uZWdhdGl2ZUludGVnZXI6OnhzZF9fbmVnYXRpdmVJbnRlZ2VyKCkKK3sgfQoreHNkX19uZWdhdGl2ZUludGVnZXI6On54c2RfX25lZ2F0aXZlSW50ZWdlcigpCit7IH0KK3hzZF9fbmVnYXRpdmVJbnRlZ2VyOjp4c2RfX25lZ2F0aXZlSW50ZWdlcihjaGFyICpzKQoreyBfX2l0ZW0gPSBzOyB9Cit2b2lkIHhzZF9fbmVnYXRpdmVJbnRlZ2VyOjpwcmludChzdGQ6Om9zdHJlYW0gJnMpIGNvbnN0Cit7IHMgPDwgIjxuZWdhdGl2ZUludGVnZXI9IiA8PCAoX19pdGVtID8gX19pdGVtIDogIihudWxsKSIpIDw8ICI+IjsgfQorCit4c2RfX25vbk5lZ2F0aXZlSW50ZWdlcjo6eHNkX19ub25OZWdhdGl2ZUludGVnZXIoKQoreyB9Cit4c2RfX25vbk5lZ2F0aXZlSW50ZWdlcjo6fnhzZF9fbm9uTmVnYXRpdmVJbnRlZ2VyKCkKK3sgfQoreHNkX19ub25OZWdhdGl2ZUludGVnZXI6OnhzZF9fbm9uTmVnYXRpdmVJbnRlZ2VyKGNoYXIgKnMpCit7IF9faXRlbSA9IHM7IH0KK3ZvaWQgeHNkX19ub25OZWdhdGl2ZUludGVnZXI6OnByaW50KHN0ZDo6b3N0cmVhbSAmcykgY29uc3QKK3sgcyA8PCAiPG5vbk5lZ2F0aXZlSW50ZWdlcj0iIDw8IChfX2l0ZW0gPyBfX2l0ZW0gOiAiKG51bGwpIikgPDwgIj4iOyB9CisKK3hzZF9fcG9zaXRpdmVJbnRlZ2VyOjp4c2RfX3Bvc2l0aXZlSW50ZWdlcigpCit7IH0KK3hzZF9fcG9zaXRpdmVJbnRlZ2VyOjp+eHNkX19wb3NpdGl2ZUludGVnZXIoKQoreyB9Cit4c2RfX3Bvc2l0aXZlSW50ZWdlcjo6eHNkX19wb3NpdGl2ZUludGVnZXIoY2hhciAqcykKK3sgX19pdGVtID0gczsgfQordm9pZCB4c2RfX3Bvc2l0aXZlSW50ZWdlcjo6cHJpbnQoc3RkOjpvc3RyZWFtICZzKSBjb25zdAoreyBzIDw8ICI8cG9zaXRpdmVJbnRlZ2VyPSIgPDwgKF9faXRlbSA/IF9faXRlbSA6ICIobnVsbCkiKSA8PCAiPiI7IH0KKworeHNkX19sb25nOjp4c2RfX2xvbmcoKQoreyB9Cit4c2RfX2xvbmc6On54c2RfX2xvbmcoKQoreyB9Cit4c2RfX2xvbmc6OnhzZF9fbG9uZyhMT05HNjQgbGwpCit7IF9faXRlbSA9IGxsOyB9Cit2b2lkIHhzZF9fbG9uZzo6cHJpbnQoc3RkOjpvc3RyZWFtICZzKSBjb25zdAoreyBzIDw8ICI8bG9uZz0iIDw8IF9faXRlbSA8PCAiPiI7IH0KKworeHNkX19pbnQ6OnhzZF9faW50KCkKK3sgfQoreHNkX19pbnQ6On54c2RfX2ludCgpCit7IH0KK3hzZF9faW50Ojp4c2RfX2ludChpbnQgaSkKK3sgX19pdGVtID0gaTsgfQordm9pZCB4c2RfX2ludDo6cHJpbnQoc3RkOjpvc3RyZWFtICZzKSBjb25zdAoreyBzIDw8ICI8aW50PSIgPDwgX19pdGVtIDw8ICI+IjsgfQorCit4c2RfX3Nob3J0Ojp4c2RfX3Nob3J0KCkKK3sgfQoreHNkX19zaG9ydDo6fnhzZF9fc2hvcnQoKQoreyB9Cit4c2RfX3Nob3J0Ojp4c2RfX3Nob3J0KHNob3J0IGgpCit7IF9faXRlbSA9IGg7IH0KK3ZvaWQgeHNkX19zaG9ydDo6cHJpbnQoc3RkOjpvc3RyZWFtICZzKSBjb25zdAoreyBzIDw8ICI8c2hvcnQ9IiA8PCBfX2l0ZW0gPDwgIj4iOyB9CisKK3hzZF9fYnl0ZTo6eHNkX19ieXRlKCkKK3sgfQoreHNkX19ieXRlOjp+eHNkX19ieXRlKCkKK3sgfQoreHNkX19ieXRlOjp4c2RfX2J5dGUoY2hhciBjKQoreyBfX2l0ZW0gPSBjOyB9Cit2b2lkIHhzZF9fYnl0ZTo6cHJpbnQoc3RkOjpvc3RyZWFtICZzKSBjb25zdAoreyBzIDw8ICI8Ynl0ZT0iIDw8IF9faXRlbSA8PCAiPiI7IH0KKworeHNkX191bnNpZ25lZExvbmc6OnhzZF9fdW5zaWduZWRMb25nKCkKK3sgfQoreHNkX191bnNpZ25lZExvbmc6On54c2RfX3Vuc2lnbmVkTG9uZygpCit7IH0KK3hzZF9fdW5zaWduZWRMb25nOjp4c2RfX3Vuc2lnbmVkTG9uZyhVTE9ORzY0IHVsbCkKK3sgX19pdGVtID0gdWxsOyB9Cit2b2lkIHhzZF9fdW5zaWduZWRMb25nOjpwcmludChzdGQ6Om9zdHJlYW0gJnMpIGNvbnN0Cit7IHMgPDwgIjx1bnNpZ25lZExvbmc9IiA8PCBfX2l0ZW0gPDwgIj4iOyB9CisKK3hzZF9fdW5zaWduZWRJbnQ6OnhzZF9fdW5zaWduZWRJbnQoKQoreyB9Cit4c2RfX3Vuc2lnbmVkSW50Ojp+eHNkX191bnNpZ25lZEludCgpCit7IH0KK3hzZF9fdW5zaWduZWRJbnQ6OnhzZF9fdW5zaWduZWRJbnQodW5zaWduZWQgaW50IHVpKQoreyBfX2l0ZW0gPSB1aTsgfQordm9pZCB4c2RfX3Vuc2lnbmVkSW50OjpwcmludChzdGQ6Om9zdHJlYW0gJnMpIGNvbnN0Cit7IHMgPDwgIjx1bnNpZ25lZEludD0iIDw8IF9faXRlbSA8PCAiPiI7IH0KKworeHNkX191bnNpZ25lZFNob3J0Ojp4c2RfX3Vuc2lnbmVkU2hvcnQoKQoreyB9Cit4c2RfX3Vuc2lnbmVkU2hvcnQ6On54c2RfX3Vuc2lnbmVkU2hvcnQoKQoreyB9Cit4c2RfX3Vuc2lnbmVkU2hvcnQ6OnhzZF9fdW5zaWduZWRTaG9ydCh1bnNpZ25lZCBzaG9ydCB1aCkKK3sgX19pdGVtID0gdWg7IH0KK3ZvaWQgeHNkX191bnNpZ25lZFNob3J0OjpwcmludChzdGQ6Om9zdHJlYW0gJnMpIGNvbnN0Cit7IHMgPDwgIjx1bnNpZ25lZFNob3J0PSIgPDwgX19pdGVtIDw8ICI+IjsgfQorCit4c2RfX3Vuc2lnbmVkQnl0ZTo6eHNkX191bnNpZ25lZEJ5dGUoKQoreyB9Cit4c2RfX3Vuc2lnbmVkQnl0ZTo6fnhzZF9fdW5zaWduZWRCeXRlKCkKK3sgfQoreHNkX191bnNpZ25lZEJ5dGU6OnhzZF9fdW5zaWduZWRCeXRlKHVuc2lnbmVkIGNoYXIgdWMpCit7IF9faXRlbSA9IHVjOyB9Cit2b2lkIHhzZF9fdW5zaWduZWRCeXRlOjpwcmludChzdGQ6Om9zdHJlYW0gJnMpIGNvbnN0Cit7IHMgPDwgIjx1bnNpZ25lZEJ5dGU9IiA8PCBfX2l0ZW0gPDwgIj4iOyB9CisKK3hzZF9fYmFzZTY0QmluYXJ5Ojp4c2RfX2Jhc2U2NEJpbmFyeSgpCit7IH0KK3hzZF9fYmFzZTY0QmluYXJ5Ojp+eHNkX19iYXNlNjRCaW5hcnkoKQoreyB9Cit4c2RfX2Jhc2U2NEJpbmFyeTo6eHNkX19iYXNlNjRCaW5hcnkoY2hhciAqcykKK3sgX19zaXplID0gc3RybGVuKHMpKzE7CisgIF9fcHRyID0gKHVuc2lnbmVkIGNoYXIqKXM7Cit9Cit2b2lkIHhzZF9fYmFzZTY0QmluYXJ5OjpwcmludChzdGQ6Om9zdHJlYW0gJnMpIGNvbnN0Cit7IHMgPDwgIjxiYXNlNjRCaW5hcnk9IiA8PCBfX3NpemUgPDwgIiBieXRlcz4iOyB9CisKK3hzZF9faGV4QmluYXJ5Ojp4c2RfX2hleEJpbmFyeSgpCit7IH0KK3hzZF9faGV4QmluYXJ5Ojp+eHNkX19oZXhCaW5hcnkoKQoreyB9Cit4c2RfX2hleEJpbmFyeTo6eHNkX19oZXhCaW5hcnkoY2hhciAqcykKK3sgX19zaXplID0gc3RybGVuKHMpKzE7CisgIF9fcHRyID0gKHVuc2lnbmVkIGNoYXIqKXM7Cit9Cit2b2lkIHhzZF9faGV4QmluYXJ5OjpwcmludChzdGQ6Om9zdHJlYW0gJnMpIGNvbnN0Cit7IHMgPDwgIjxoZXhCaW5hcnk9IiA8PCBfX3NpemUgPDwgIiBieXRlcz4iOyB9CisKK2FycmF5OjphcnJheSgpCit7IH0KK2FycmF5Ojp+YXJyYXkoKQoreyB9CithcnJheTo6YXJyYXkoaW50IG4pCit7IF9fc2l6ZSA9IG47CisgIF9fcHRyID0gKHhzZF9fYW55VHlwZSoqKXNvYXBfbWFsbG9jKHNvYXAsIG4qc2l6ZW9mKHhzZF9fYW55VHlwZSopKTsKK30KK3hzZF9fYW55VHlwZSomIGFycmF5OjpvcGVyYXRvcltdKGludCBpKQoreyByZXR1cm4gX19wdHJbaV07Cit9Cit2b2lkIGFycmF5OjpwcmludChzdGQ6Om9zdHJlYW0gJnMpIGNvbnN0Cit7IHMgPDwgIjxhcnJheT0iOworICBmb3IgKGludCBpID0gMDsgaSA8IF9fc2l6ZTsgaSsrKQorICAgIGlmIChfX3B0cltpXSkKKyAgICAgIF9fcHRyW2ldLT5wcmludChzKTsKKyAgICBlbHNlCisgICAgICBzIDw8ICI8W25vbmVdPiI7CisgIHMgPDwgIj4iOworfQorCmRpZmYgLS1naXQgYS9zYW1wbGVzL3ZhcnBhcmFtL3ZhcnBhcmFtLmggYi9zYW1wbGVzL3ZhcnBhcmFtL3ZhcnBhcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRhOWNlMAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvdmFycGFyYW0vdmFycGFyYW0uaApAQCAtMCwwICsxLDI1MCBAQAorLyoJdmFycGFyYW0uaAorCisJRXhhbXBsZSB1c2Ugb2YgdmFyaWFibGUgcGFyYW1ldGVyIGxpc3RzIHdpdGggdGhlIGZ1bGwgWE1MCisJc2NoZW1hIHR5cGUgaGllcmFyY2h5IGltcGxlbWVudGVkIGFzIGEgQysrIGNsYXNzIGhpZXJhcmNoeS4KKworCUNvcHlyaWdodCAoQykgMjAwMC0yMDAyIFJvYmVydCBBLiB2YW4gRW5nZWxlbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyovCisKKy8vZ3NvYXAgbnMgc2VydmljZSBuYW1lOgl2YXJwYXJhbQorLy9nc29hcCBucyBzZXJ2aWNlIHN0eWxlOglycGMKKy8vZ3NvYXAgbnMgc2VydmljZSBlbmNvZGluZzoJZW5jb2RlZAorLy9nc29hcCBucyBzZXJ2aWNlIG5hbWVzcGFjZToJdXJuOnZhcnBhcmFtCisvL2dzb2FwIG5zIHNlcnZpY2UgbG9jYXRpb246CWh0dHA6Ly93ZWJzcnYuY3MuZnN1LmVkdS9+ZW5nZWxlbi92YXJwYXJhbS5jZ2kKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorZXh0ZXJuIGNsYXNzIHN0ZDo6b3N0cmVhbTsJLy8gdHJhbnNpZW50IChleHRlcm5hbCkgdHlwZQorCitjbGFzcyB4c2RfX2FueVR5cGUKK3sgY2hhciAqX19pdGVtOwkJLy8gZGVmYXVsdCBpcyBzdHJpbmcsIGFsc28gdG8gaG9sZCBtaXhlZC1jb250ZW50IHdoZW4gcmVjZWl2aW5nIHR5cGVsZXNzIFhNTAorICBzdHJ1Y3Qgc29hcCAqc29hcDsJLy8gcG9pbnRzIHRvIGN1cnJlbnQgZ1NPQVAgZW52aXJvbm1lbnQgdGhhdCBjcmVhdGVkIHRoaXMgb2JqZWN0CisgIHhzZF9fYW55VHlwZSgpOworICB2aXJ0dWFsIH54c2RfX2FueVR5cGUoKTsKKyAgdmlydHVhbCB4c2RfX2FueVR5cGUqJiBvcGVyYXRvcltdKGludCBpKTsKKyAgdmlydHVhbCB2b2lkIHByaW50KHN0ZDo6b3N0cmVhbSAmcykgY29uc3Q7Cit9OworCitjbGFzcyB4c2RfX2FueVNpbXBsZVR5cGU6IHhzZF9fYW55VHlwZQoreyB4c2RfX2FueVNpbXBsZVR5cGUoKTsKKyAgdmlydHVhbCB+eHNkX19hbnlTaW1wbGVUeXBlKCk7CisgIHZpcnR1YWwgdm9pZCBwcmludChzdGQ6Om9zdHJlYW0gJnMpIGNvbnN0OworfTsKKworY2xhc3MgeHNkX19hbnlVUkk6IHhzZF9fYW55U2ltcGxlVHlwZQoreyB4c2RfX2FueVVSSSgpOworICB2aXJ0dWFsIH54c2RfX2FueVVSSSgpOworICB4c2RfX2FueVVSSShjaGFyICpzKTsKKyAgdmlydHVhbCB2b2lkIHByaW50KHN0ZDo6b3N0cmVhbSAmcykgY29uc3Q7Cit9OyAKKworY2xhc3MgeHNkX19ib29sZWFuOiB4c2RfX2FueVNpbXBsZVR5cGUKK3sgYm9vbCBfX2l0ZW07CisgIHhzZF9fYm9vbGVhbigpOworICB2aXJ0dWFsIH54c2RfX2Jvb2xlYW4oKTsKKyAgeHNkX19ib29sZWFuKGJvb2wgYik7CisgIHZpcnR1YWwgdm9pZCBwcmludChzdGQ6Om9zdHJlYW0gJnMpIGNvbnN0OworfTsgCisKK2NsYXNzIHhzZF9fZGF0ZTogeHNkX19hbnlTaW1wbGVUeXBlCS8vIHJlcXVpcmVzICJDQ1lZLU1NLUREIiBzdHJpbmcgdmFsdWVzCit7IHhzZF9fZGF0ZSgpOworICB2aXJ0dWFsIH54c2RfX2RhdGUoKTsKKyAgeHNkX19kYXRlKGNoYXIgKnMpOworICB2aXJ0dWFsIHZvaWQgcHJpbnQoc3RkOjpvc3RyZWFtICZzKSBjb25zdDsKK307CisKK2NsYXNzIHhzZF9fZGF0ZVRpbWU6IHhzZF9fYW55U2ltcGxlVHlwZQoreyB0aW1lX3QgX19pdGVtOwkJLy8gcmVtb3ZlIHRpbWVfdCBfX2l0ZW0gdG8gdXNlIGNoYXIqX19pdGVtIHdpdGggIkNDWVktTU0tRERUaGg6bW06c3NpIiBmb3IgZGF0ZXMgb3V0c2lkZSB0aGUgcmFuZ2UgMTkwMi0yMDM3CisgIHhzZF9fZGF0ZVRpbWUoKTsKKyAgdmlydHVhbCB+eHNkX19kYXRlVGltZSgpOworICB4c2RfX2RhdGVUaW1lKHRpbWVfdCB0KTsKKyAgdmlydHVhbCB2b2lkIHByaW50KHN0ZDo6b3N0cmVhbSAmcykgY29uc3Q7Cit9OworCitjbGFzcyB4c2RfX2RvdWJsZTogeHNkX19hbnlTaW1wbGVUeXBlCit7IGRvdWJsZSBfX2l0ZW07CisgIHhzZF9fZG91YmxlKCk7CisgIHZpcnR1YWwgfnhzZF9fZG91YmxlKCk7CisgIHhzZF9fZG91YmxlKGRvdWJsZSBkKTsKKyAgdmlydHVhbCB2b2lkIHByaW50KHN0ZDo6b3N0cmVhbSAmcykgY29uc3Q7Cit9OyAKKworY2xhc3MgeHNkX19kdXJhdGlvbjogeHNkX19hbnlTaW1wbGVUeXBlCS8vIHJlcXVpcmVzICJQblluTW5EVG5Ibk1uUyIgc3RyaW5nIHZhbHVlcworeyB4c2RfX2R1cmF0aW9uKCk7CisgIHZpcnR1YWwgfnhzZF9fZHVyYXRpb24oKTsKKyAgeHNkX19kdXJhdGlvbihjaGFyICpzKTsKKyAgdmlydHVhbCB2b2lkIHByaW50KHN0ZDo6b3N0cmVhbSAmcykgY29uc3Q7Cit9OworCitjbGFzcyB4c2RfX2Zsb2F0OiB4c2RfX2FueVNpbXBsZVR5cGUKK3sgZmxvYXQgX19pdGVtOworICB4c2RfX2Zsb2F0KCk7CisgIHZpcnR1YWwgfnhzZF9fZmxvYXQoKTsKKyAgeHNkX19mbG9hdChmbG9hdCBmKTsKKyAgdmlydHVhbCB2b2lkIHByaW50KHN0ZDo6b3N0cmVhbSAmcykgY29uc3Q7Cit9OyAKKworY2xhc3MgeHNkX190aW1lOiB4c2RfX2FueVNpbXBsZVR5cGUJLy8gcmVxdWlyZXMgImhoOm1tOnNzIiBzdHJpbmcgdmFsdWVzCit7IHhzZF9fdGltZSgpOworICB2aXJ0dWFsIH54c2RfX3RpbWUoKTsKKyAgeHNkX190aW1lKGNoYXIgKnMpOworICB2aXJ0dWFsIHZvaWQgcHJpbnQoc3RkOjpvc3RyZWFtICZzKSBjb25zdDsKK307CisKK2NsYXNzIHhzZF9fc3RyaW5nOiB4c2RfX2FueVNpbXBsZVR5cGUKK3sgeHNkX19zdHJpbmcoKTsKKyAgeHNkX19zdHJpbmcoY2hhciAqcyk7CisgIHZpcnR1YWwgfnhzZF9fc3RyaW5nKCk7CisgIHZpcnR1YWwgdm9pZCBwcmludChzdGQ6Om9zdHJlYW0gJnMpIGNvbnN0OworfTsgCisKK2NsYXNzIHhzZF9fbm9ybWFsaXplZFN0cmluZzogeHNkX19zdHJpbmcJLy8gcmVxdWlyZXMgc3RyaW5ncyB3aXRob3V0IENSLCBMRiwgVEFCCit7IHhzZF9fbm9ybWFsaXplZFN0cmluZygpOworICB4c2RfX25vcm1hbGl6ZWRTdHJpbmcoY2hhciAqcyk7CisgIHZpcnR1YWwgfnhzZF9fbm9ybWFsaXplZFN0cmluZygpOworICB2aXJ0dWFsIHZvaWQgcHJpbnQoc3RkOjpvc3RyZWFtICZzKSBjb25zdDsKK307IAorCitjbGFzcyB4c2RfX3Rva2VuOiB4c2RfX25vcm1hbGl6ZWRTdHJpbmcJCS8vIHJlcXVpcmVzIHN0cmluZ3Mgd2l0aG91dCBDUiwgTEYsIFRBQiwgbm8gbGVhZGluZy90cmFpbGluZyBzcGFjZXMsIGFuZCBubyBzZXF1ZW5jZXMgb2YgbW9yZSB0aGFuIG9uZSBzcGFjZQoreyB4c2RfX3Rva2VuKCk7CisgIHhzZF9fdG9rZW4oY2hhciAqcyk7CisgIHZpcnR1YWwgfnhzZF9fdG9rZW4oKTsKKyAgdmlydHVhbCB2b2lkIHByaW50KHN0ZDo6b3N0cmVhbSAmcykgY29uc3Q7Cit9OyAKKworY2xhc3MgeHNkX19kZWNpbWFsOiB4c2RfX2FueVNpbXBsZVR5cGUJLy8gcmVxdWlyZXMgZGVjaW1hbCBhcyBzdHJpbmcgdmFsdWVzLCBjYW4gdXNlIGRvdWJsZSwgYnV0IHBvc3NpYmxlIGxvc3Mgb2YgcHJlY2lzaW9uCit7IHhzZF9fZGVjaW1hbCgpOworICB2aXJ0dWFsIH54c2RfX2RlY2ltYWwoKTsKKyAgeHNkX19kZWNpbWFsKGNoYXIgKnMpOworICB2aXJ0dWFsIHZvaWQgcHJpbnQoc3RkOjpvc3RyZWFtICZzKSBjb25zdDsKK307CisKK2NsYXNzIHhzZF9faW50ZWdlcjogeHNkX19kZWNpbWFsCS8vIHJlcXVpcmVzIGludGVnZXIgYXMgc3RyaW5nIHZhbHVlcywgY2FuIHVzZSBsb29uZyBsb25nLCBidXQgcG9zc2libGUgbG9zcyBvZiBkYXRhCit7IHhzZF9faW50ZWdlcigpOworICB2aXJ0dWFsIH54c2RfX2ludGVnZXIoKTsKKyAgeHNkX19pbnRlZ2VyKGNoYXIgKnMpOworICB2aXJ0dWFsIHZvaWQgcHJpbnQoc3RkOjpvc3RyZWFtICZzKSBjb25zdDsKK307CisKK2NsYXNzIHhzZF9fbm9uUG9zaXRpdmVJbnRlZ2VyOiB4c2RfX2ludGVnZXIJLy8gcmVxdWlyZXMgbm9uLXBvc2l0aXZlIGludGVnZXIgYXMgc3RyaW5nIHZhbHVlcworeyB4c2RfX25vblBvc2l0aXZlSW50ZWdlcigpOworICB2aXJ0dWFsIH54c2RfX25vblBvc2l0aXZlSW50ZWdlcigpOworICB4c2RfX25vblBvc2l0aXZlSW50ZWdlcihjaGFyICpzKTsKKyAgdmlydHVhbCB2b2lkIHByaW50KHN0ZDo6b3N0cmVhbSAmcykgY29uc3Q7Cit9OyAKKworY2xhc3MgeHNkX19uZWdhdGl2ZUludGVnZXI6IHhzZF9fbm9uUG9zaXRpdmVJbnRlZ2VyCS8vIHJlcXVpcmVzIG5lZ2F0aXZlIGludGVnZXIgYXMgc3RyaW5nIHZhbHVlcworeyB4c2RfX25lZ2F0aXZlSW50ZWdlcigpOworICB2aXJ0dWFsIH54c2RfX25lZ2F0aXZlSW50ZWdlcigpOworICB4c2RfX25lZ2F0aXZlSW50ZWdlcihjaGFyICpzKTsKKyAgdmlydHVhbCB2b2lkIHByaW50KHN0ZDo6b3N0cmVhbSAmcykgY29uc3Q7Cit9OyAKKworY2xhc3MgeHNkX19ub25OZWdhdGl2ZUludGVnZXI6IHhzZF9faW50ZWdlcgkvLyByZXF1aXJlcyBub24tbmVnYXRpdmUgaW50ZWdlciBhcyBzdHJpbmcgdmFsdWVzCit7IHhzZF9fbm9uTmVnYXRpdmVJbnRlZ2VyKCk7CisgIHZpcnR1YWwgfnhzZF9fbm9uTmVnYXRpdmVJbnRlZ2VyKCk7CisgIHhzZF9fbm9uTmVnYXRpdmVJbnRlZ2VyKGNoYXIgKnMpOworICB2aXJ0dWFsIHZvaWQgcHJpbnQoc3RkOjpvc3RyZWFtICZzKSBjb25zdDsKK307IAorCitjbGFzcyB4c2RfX3Bvc2l0aXZlSW50ZWdlcjogeHNkX19ub25OZWdhdGl2ZUludGVnZXIJLy8gcmVxdWlyZXMgcG9zaXRpdmUgaW50ZWdlciBhcyBzdHJpbmcgdmFsdWVzCit7IHhzZF9fcG9zaXRpdmVJbnRlZ2VyKCk7CisgIHZpcnR1YWwgfnhzZF9fcG9zaXRpdmVJbnRlZ2VyKCk7CisgIHhzZF9fcG9zaXRpdmVJbnRlZ2VyKGNoYXIgKnMpOworICB2aXJ0dWFsIHZvaWQgcHJpbnQoc3RkOjpvc3RyZWFtICZzKSBjb25zdDsKK307IAorCitjbGFzcyB4c2RfX2xvbmc6IHhzZF9faW50ZWdlcgoreyBMT05HNjQgX19pdGVtOworICB4c2RfX2xvbmcoKTsKKyAgdmlydHVhbCB+eHNkX19sb25nKCk7CisgIHhzZF9fbG9uZyhMT05HNjQgbGwpOworICB2aXJ0dWFsIHZvaWQgcHJpbnQoc3RkOjpvc3RyZWFtICZzKSBjb25zdDsKK307IAorCitjbGFzcyB4c2RfX2ludDogeHNkX19sb25nCit7IGludCBfX2l0ZW07CisgIHhzZF9faW50KCk7CisgIHZpcnR1YWwgfnhzZF9faW50KCk7CisgIHhzZF9faW50KGludCBpKTsKKyAgdmlydHVhbCB2b2lkIHByaW50KHN0ZDo6b3N0cmVhbSAmcykgY29uc3Q7Cit9OyAKKworY2xhc3MgeHNkX19zaG9ydDogeHNkX19pbnQKK3sgc2hvcnQgX19pdGVtOworICB4c2RfX3Nob3J0KCk7CisgIHZpcnR1YWwgfnhzZF9fc2hvcnQoKTsKKyAgeHNkX19zaG9ydChzaG9ydCBoKTsKKyAgdmlydHVhbCB2b2lkIHByaW50KHN0ZDo6b3N0cmVhbSAmcykgY29uc3Q7Cit9OyAKKworY2xhc3MgeHNkX19ieXRlOiB4c2RfX3Nob3J0Cit7IGNoYXIgX19pdGVtOworICB4c2RfX2J5dGUoKTsKKyAgdmlydHVhbCB+eHNkX19ieXRlKCk7CisgIHhzZF9fYnl0ZShjaGFyIGMpOworICB2aXJ0dWFsIHZvaWQgcHJpbnQoc3RkOjpvc3RyZWFtICZzKSBjb25zdDsKK307IAorCitjbGFzcyB4c2RfX3Vuc2lnbmVkTG9uZzogeHNkX19ub25OZWdhdGl2ZUludGVnZXIKK3sgVUxPTkc2NCBfX2l0ZW07CisgIHhzZF9fdW5zaWduZWRMb25nKCk7CisgIHZpcnR1YWwgfnhzZF9fdW5zaWduZWRMb25nKCk7CisgIHhzZF9fdW5zaWduZWRMb25nKFVMT05HNjQgdWxsKTsKKyAgdmlydHVhbCB2b2lkIHByaW50KHN0ZDo6b3N0cmVhbSAmcykgY29uc3Q7Cit9OyAKKworY2xhc3MgeHNkX191bnNpZ25lZEludDogeHNkX191bnNpZ25lZExvbmcKK3sgdW5zaWduZWQgaW50IF9faXRlbTsKKyAgeHNkX191bnNpZ25lZEludCgpOworICB2aXJ0dWFsIH54c2RfX3Vuc2lnbmVkSW50KCk7CisgIHhzZF9fdW5zaWduZWRJbnQodW5zaWduZWQgaW50IHVpKTsKKyAgdmlydHVhbCB2b2lkIHByaW50KHN0ZDo6b3N0cmVhbSAmcykgY29uc3Q7Cit9OyAKKworY2xhc3MgeHNkX191bnNpZ25lZFNob3J0OiB4c2RfX3Vuc2lnbmVkSW50Cit7IHVuc2lnbmVkIHNob3J0IF9faXRlbTsKKyAgeHNkX191bnNpZ25lZFNob3J0KCk7CisgIHZpcnR1YWwgfnhzZF9fdW5zaWduZWRTaG9ydCgpOworICB4c2RfX3Vuc2lnbmVkU2hvcnQodW5zaWduZWQgc2hvcnQgdWgpOworICB2aXJ0dWFsIHZvaWQgcHJpbnQoc3RkOjpvc3RyZWFtICZzKSBjb25zdDsKK307IAorCitjbGFzcyB4c2RfX3Vuc2lnbmVkQnl0ZTogeHNkX191bnNpZ25lZFNob3J0Cit7IHVuc2lnbmVkIGNoYXIgX19pdGVtOworICB4c2RfX3Vuc2lnbmVkQnl0ZSgpOworICB2aXJ0dWFsIH54c2RfX3Vuc2lnbmVkQnl0ZSgpOworICB4c2RfX3Vuc2lnbmVkQnl0ZSh1bnNpZ25lZCBjaGFyIHVjKTsKKyAgdmlydHVhbCB2b2lkIHByaW50KHN0ZDo6b3N0cmVhbSAmcykgY29uc3Q7Cit9OyAKKworY2xhc3MgeHNkX19iYXNlNjRCaW5hcnk6IHhzZF9fYW55U2ltcGxlVHlwZQoreyB1bnNpZ25lZCBjaGFyICpfX3B0cjsKKyAgaW50IF9fc2l6ZTsKKyAgeHNkX19iYXNlNjRCaW5hcnkoKTsKKyAgdmlydHVhbCB+eHNkX19iYXNlNjRCaW5hcnkoKTsKKyAgeHNkX19iYXNlNjRCaW5hcnkoY2hhciAqcyk7CisgIHZpcnR1YWwgdm9pZCBwcmludChzdGQ6Om9zdHJlYW0gJnMpIGNvbnN0OworfTsKKworY2xhc3MgeHNkX19oZXhCaW5hcnk6IHhzZF9fYW55U2ltcGxlVHlwZQoreyB1bnNpZ25lZCBjaGFyICpfX3B0cjsKKyAgaW50IF9fc2l6ZTsKKyAgeHNkX19oZXhCaW5hcnkoKTsKKyAgdmlydHVhbCB+eHNkX19oZXhCaW5hcnkoKTsKKyAgeHNkX19oZXhCaW5hcnkoY2hhciAqcyk7CisgIHZpcnR1YWwgdm9pZCBwcmludChzdGQ6Om9zdHJlYW0gJnMpIGNvbnN0OworfTsKKworY2xhc3MgYXJyYXk6IHhzZF9fYW55VHlwZQoreyB4c2RfX2FueVR5cGUgKipfX3B0cjsKKyAgaW50IF9fc2l6ZTsKKyAgYXJyYXkoKTsKKyAgdmlydHVhbCB+YXJyYXkoKTsKKyAgYXJyYXkoaW50IG4pOworICB2aXJ0dWFsIHhzZF9fYW55VHlwZSomIG9wZXJhdG9yW10oaW50IGkpOworICB2aXJ0dWFsIHZvaWQgcHJpbnQoc3RkOjpvc3RyZWFtICZzKSBjb25zdDsKK307CisKK2ludCBuc19fdmFyU3RyaW5nUGFyYW1UZXN0KGludCBfX3NpemUsIGNoYXIgKipwYXJhbSwgaW50ICZyZXR1cm5fKTsKKworaW50IG5zX192YXJQb2x5UGFyYW1UZXN0KGludCBfX3NpemUsIHhzZF9fYW55VHlwZSAqKnBhcmFtLCBzdHJ1Y3QgbnNfX3ZhclBvbHlQYXJhbVRlc3RSZXNwb25zZSB7IGludCBfX3NpemU7IHhzZF9fYW55VHlwZSAqKnBhcmFtOyB9ICZvdXQpOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy93ZWJzZXJ2ZXIvTWFrZWZpbGUgYi9zYW1wbGVzL3dlYnNlcnZlci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjVlNTY5Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy93ZWJzZXJ2ZXIvTWFrZWZpbGUKQEAgLTAsMCArMSwzMSBAQAorR1NPQVA9Li4vLi4vc29hcGNwcDIKK1NPQVBIPS4uLy4uL3N0ZHNvYXAyLmgKK1NPQVBDPS4uLy4uL3N0ZHNvYXAyLmMKK1NPQVBDUFA9Li4vLi4vc3Rkc29hcDIuY3BwCitDQz1nY2MKK0NQUD1nKysKK0xJQlM9LWxwdGhyZWFkIC1seiAtbHNzbCAtbGNyeXB0bworQ09GTEFHUz0tTzIKK0NXRkxBR1M9LVdhbGwKK0NJRkxBR1M9LUkuLi8uLiAtSS4uLy4uL3BsdWdpbgorQ01GTEFHUz0tRFdJVEhfQ09PS0lFUyAtRFdJVEhfR1pJUCAtRFdJVEhfT1BFTlNTTAorQ0ZMQUdTPSAkKENXRkxBR1MpICQoQ09GTEFHUykgJChDSUZMQUdTKSAkKENNRkxBR1MpCithbGw6CQl3ZWJzZXJ2ZXIKK3dlYnNlcnZlcjoJd2Vic2VydmVyLmggd2Vic2VydmVyLmMgbG9nZ2luZy5vIGh0dHBnZXQubyBodHRwZm9ybS5vIHRocmVhZHMubyBvcHRpb25zLm8gJChTT0FQSCkgJChTT0FQQykKKwkJJChHU09BUCkgLWMgd2Vic2VydmVyLmgKKwkJJChDQykgJChDRkxBR1MpIC1vIHdlYnNlcnZlciB3ZWJzZXJ2ZXIuYyBsb2dnaW5nLm8gaHR0cGdldC5vIGh0dHBmb3JtLm8gdGhyZWFkcy5vIG9wdGlvbnMubyBzb2FwQy5jIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmMgJChTT0FQQykgJChMSUJTKQorb3B0aW9ucy5vOglvcHQuaCBvcHRpb25zLmggb3B0aW9ucy5jCisJCSQoR1NPQVApIC1jbnBvcHQgb3B0LmgKKwkJJChDQykgJChDRkxBR1MpIC1jIG9wdGlvbnMuYworbG9nZ2luZy5vOgkuLi8uLi9wbHVnaW4vbG9nZ2luZy5oIC4uLy4uL3BsdWdpbi9sb2dnaW5nLmMKKwkJJChDQykgJChDRkxBR1MpIC1jIC4uLy4uL3BsdWdpbi9sb2dnaW5nLmMKK2h0dHBnZXQubzoJLi4vLi4vcGx1Z2luL2h0dHBnZXQuaCAuLi8uLi9wbHVnaW4vaHR0cGdldC5jCisJCSQoQ0MpICQoQ0ZMQUdTKSAtYyAuLi8uLi9wbHVnaW4vaHR0cGdldC5jCitodHRwZm9ybS5vOgkuLi8uLi9wbHVnaW4vaHR0cGZvcm0uaCAuLi8uLi9wbHVnaW4vaHR0cGZvcm0uYworCQkkKENDKSAkKENGTEFHUykgLWMgLi4vLi4vcGx1Z2luL2h0dHBmb3JtLmMKK3RocmVhZHMubzoJLi4vLi4vcGx1Z2luL3RocmVhZHMuaCAuLi8uLi9wbHVnaW4vdGhyZWFkcy5jCisJCSQoQ0MpICQoQ0ZMQUdTKSAtYyAuLi8uLi9wbHVnaW4vdGhyZWFkcy5jCitjbGVhbjoKKwkJcm0gLWYgKi5vIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaAorZGlzdGNsZWFuOgorCQlybSAtZiAqLm8gKi53c2RsICoueHNkICoueG1sICoubnNtYXAgKi5sb2cgc29hcEguaCBzb2FwU3R1Yi5oIHNvYXBDLmNwcCBzb2FwQy5jIHNvYXBDbGllbnQuY3BwIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmNwcCBzb2FwU2VydmVyLmMgc29hcENsaWVudExpYi5jIHNvYXBDbGllbnRMaWIuY3BwIHNvYXBTZXJ2ZXJMaWIuYyBzb2FwU2VydmVyTGliLmNwcCBzb2FwKlByb3h5Lmggd2Vic2VydmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL3dlYnNlcnZlci9NYWtlZmlsZVNvbGFyaXMgYi9zYW1wbGVzL3dlYnNlcnZlci9NYWtlZmlsZVNvbGFyaXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFjNDdjMQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvd2Vic2VydmVyL01ha2VmaWxlU29sYXJpcwpAQCAtMCwwICsxLDMxIEBACitHU09BUD0uLi8uLi9zb2FwY3BwMgorU09BUEg9Li4vLi4vc3Rkc29hcDIuaAorU09BUEM9Li4vLi4vc3Rkc29hcDIuYworU09BUENQUD0uLi8uLi9zdGRzb2FwMi5jcHAKK0NDPWdjYworQ1BQPWcrKworTElCUz0tbHB0aHJlYWQgLWx6IC1sc3NsIC1sY3J5cHRvIC1sbnNsIC1seG5ldCAtbHNvY2tldAorQ09GTEFHUz0tTzIKK0NXRkxBR1M9LVdhbGwKK0NJRkxBR1M9LUkuLi8uLiAtSS4uLy4uL3BsdWdpbgorQ01GTEFHUz0tRFdJVEhfQ09PS0lFUyAtRFdJVEhfR1pJUCAtRFdJVEhfT1BFTlNTTAorQ0ZMQUdTPSAkKENXRkxBR1MpICQoQ09GTEFHUykgJChDSUZMQUdTKSAkKENNRkxBR1MpCithbGw6CQl3ZWJzZXJ2ZXIKK3dlYnNlcnZlcjoJd2Vic2VydmVyLmggd2Vic2VydmVyLmMgbG9nZ2luZy5vIGh0dHBnZXQubyBodHRwZm9ybS5vIHRocmVhZHMubyBvcHRpb25zLm8gJChTT0FQSCkgJChTT0FQQykKKwkJJChHU09BUCkgLWMgd2Vic2VydmVyLmgKKwkJJChDQykgJChDRkxBR1MpIC1vIHdlYnNlcnZlciB3ZWJzZXJ2ZXIuYyBsb2dnaW5nLm8gaHR0cGdldC5vIGh0dHBmb3JtLm8gdGhyZWFkcy5vIG9wdGlvbnMubyBzb2FwQy5jIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmMgJChTT0FQQykgJChMSUJTKQorb3B0aW9ucy5vOglvcHQuaCBvcHRpb25zLmggb3B0aW9ucy5jCisJCSQoR1NPQVApIC1jbnBvcHQgb3B0LmgKKwkJJChDQykgJChDRkxBR1MpIC1jIG9wdGlvbnMuYworbG9nZ2luZy5vOgkuLi8uLi9wbHVnaW4vbG9nZ2luZy5oIC4uLy4uL3BsdWdpbi9sb2dnaW5nLmMKKwkJJChDQykgJChDRkxBR1MpIC1jIC4uLy4uL3BsdWdpbi9sb2dnaW5nLmMKK2h0dHBnZXQubzoJLi4vLi4vcGx1Z2luL2h0dHBnZXQuaCAuLi8uLi9wbHVnaW4vaHR0cGdldC5jCisJCSQoQ0MpICQoQ0ZMQUdTKSAtYyAuLi8uLi9wbHVnaW4vaHR0cGdldC5jCitodHRwZm9ybS5vOgkuLi8uLi9wbHVnaW4vaHR0cGZvcm0uaCAuLi8uLi9wbHVnaW4vaHR0cGZvcm0uYworCQkkKENDKSAkKENGTEFHUykgLWMgLi4vLi4vcGx1Z2luL2h0dHBmb3JtLmMKK3RocmVhZHMubzoJLi4vLi4vcGx1Z2luL3RocmVhZHMuaCAuLi8uLi9wbHVnaW4vdGhyZWFkcy5jCisJCSQoQ0MpICQoQ0ZMQUdTKSAtYyAuLi8uLi9wbHVnaW4vdGhyZWFkcy5jCitjbGVhbjoKKwkJcm0gLWYgKi5vIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaAorZGlzdGNsZWFuOgorCQlybSAtZiAqLm8gKi53c2RsICoueHNkICoueG1sICoubnNtYXAgKi5sb2cgc29hcEguaCBzb2FwU3R1Yi5oIHNvYXBDLmNwcCBzb2FwQy5jIHNvYXBDbGllbnQuY3BwIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmNwcCBzb2FwU2VydmVyLmMgc29hcENsaWVudExpYi5jIHNvYXBDbGllbnRMaWIuY3BwIHNvYXBTZXJ2ZXJMaWIuYyBzb2FwU2VydmVyTGliLmNwcCBzb2FwKlByb3h5Lmggd2Vic2VydmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL3dlYnNlcnZlci9SRUFETUUudHh0IGIvc2FtcGxlcy93ZWJzZXJ2ZXIvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2I4ZWY0Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy93ZWJzZXJ2ZXIvUkVBRE1FLnR4dApAQCAtMCwwICsxLDg3IEBACitUaGlzIGRpcmVjdG9yeSBjb250YWlucyBhbiBleGFtcGxlIHN0YW5kLWFsb25lIGdTT0FQIFdlYiBzZXJ2ZXIuIEl0IHVzZXMgdGhlCitnU09BUCBIVFRQIEdFVCBwbHVnaW4gdG8gc2VydmUgSFRUUCBHRVQgcmVxdWVzdHMgYXMgd2VsbCBhcyBTT0FQL1hNTCBIVFRQIFBPU1QKK3JlcXVlc3RzLgorCitUaGlzIGlzIGEgc21hbGwgYnV0IGZ1bGx5IGZ1bmN0aW9uYWwgKGVtYmVkZGVkKSBXZWIgc2VydmVyIHRoYXQgY2FuIHNlcnZlIGJvdGgKK3N0YXRpYyBhbmQgZHluYW1pYyBwYWdlcyBhbmQgcHJvdmlkZSBTT0FQL1hNTCByZXNwb25zZXMuCisKK1RoaXMgV2ViIHNlcnZlciBpbXBsZW1lbnRzIGEgc2ltcGxlIGNhbGN1bGF0b3IgWE1MIFdlYiBzZXJ2aWNlIGZvcgorZGVtb25zdHJhdGlvbiBwdXJwb3Nlcy4KKworVGhpcyBhcHBsaWNhdGlvbiByZXF1aXJlcyBabGliIGFuZCBQdGhyZWFkcyAoeW91IGNhbiByZXBsYWNlIFB0aHJlYWRzIHdpdGgKK2Fub3RoZXIgdGhyZWFkIGxpYnJhcnksIGJ1dCB5b3UgbmVlZCB0byBzdHVkeSB0aGUgT3BlblNTTCBQdGhyZWFkCitpbXBsZW1lbnRhdGlvbiB3aGVuIHlvdSBwbGFuIHRvIHVzZSBPcGVuU1NMKS4KKworT24gVW5peC9MaW51eCwgcGxlYXNlIGVuYWJsZSBTSUdQSVBFIGhhbmRsaW5nLCBzZWUgdGhlIG1haW4gZnVuY3Rpb24gaW4KK3dlYnNlcnZlci5jLiBTSUdQSVBFIGhhbmRsaW5nIHdpbGwgYXZvaWQgeW91ciBzZXJ2ZXIgZnJvbSB0ZXJtaW5hdGlvbiB3aGVuCitzb2NrZXRzIGFyZSBkaXNjb25uZWN0ZWQgYnkgY2xpZW50cyBiZWZvcmUgdGhlIHRyYW5zYWN0aW9uIHdhcyBjb21wbGV0ZWQKKyhha2EgYnJva2VuIHBpcGUpLgorCitQbGVhc2UgZG9uJ3QgYmUgdGVtcHRlZCB0byBydW4gdGhlIHdlYnNlcnZlciB3aXRoIHJvb3QgcGVybWlzc2lvbiEgVGhlIGJlc3QKK3dheSB0byBwcm90ZWN0IHlvdXIgc2l0ZSBpcyBieSBjcmVhdGluZyBhIGR1bW15IGFjY291bnQgd2l0aCB2ZXJ5IGxpbWl0ZWQKK3N5c3RlbSBhY2Nlc3MgYW5kIHJ1biB0aGUgd2Vic2VydmVyIHVuZGVyIHRoaXMgYWNjb3VudC4KKworCUNvbXBpbGUgd2l0aG91dCBPcGVuU1NMOgorCXNvYXBjcHAyIC1jIC1uIC1wb3B0IG9wdC5oCisJc29hcGNwcDIgLWMgd2Vic2VydmVyLmgKKwlDdXN0b21pemUgeW91ciBDT09LSUVfRE9NQUlOIGluIHdlYnNlcnZlci5jIChpZiB5b3UgdXNlIGNvb2tpZXMpCisJZ2NjIC1EV0lUSF9DT09LSUVTIC1EV0lUSF9aTElCIC1JLi4vLi4gLW8gd2Vic2VydmVyIHdlYnNlcnZlci5jCisJb3B0aW9ucy5jIC4uLy4uL3BsdWdpbi9odHRwZ2V0LmMgLi4vLi4vcGx1Z2luL2xvZ2dpbmcuYworCS4uLy4uL3BsdWdpbi90aHJlYWRzLmMgLi4vLi4vc3Rkc29hcDIuYyBzb2FwQy5jIHNvYXBDbGllbnQuYworCXNvYXBTZXJ2ZXIuYyAtbHB0aHJlYWQgLWx6CisKKwlDb21waWxlIHdpdGggT3BlblNTTDoKKwlzb2FwY3BwMiAtYyAtbiAtcG9wdCBvcHQuaAorCXNvYXBjcHAyIC1jIHdlYnNlcnZlci5oCisJZ2NjIC1EV0lUSF9PUEVOU1NMIC1EV0lUSF9DT09LSUVTIC1EV0lUSF9aTElCIC1JLi4vLi4gLW8gd2Vic2VydmVyCisJd2Vic2VydmVyLmMgb3B0aW9ucy5jIC4uLy4uL3BsdWdpbi9odHRwZ2V0LmMgLi4vLi4vcGx1Z2luL2xvZ2dpbmcuYworCS4uLy4uL3BsdWdpbi90aHJlYWRzLmMgLi4vLi4vc3Rkc29hcDIuYyBzb2FwQy5jCisJc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuYyAtbHB0aHJlYWQgLWx6IC1sc3NsIC1sY3J5cHRvCisKKwlVc2UgKEhUVFAgR0VUKToKKwlDb21waWxlIHRoZSB3ZWIgc2VydmVyIGFzIGV4cGxhaW5lZCBhYm92ZQorCVN0YXJ0IHRoZSB3ZWIgc2VydmVyIG9uIGFuIGV2ZW4gbnVtYmVyZWQgcG9ydCAoZS5nLiA4MDgwKToKKwk+IHdlYnNlcnZlciA4MDgwICYKKwlTdGFydCBhIHdlYiBicm93c2VyIGFuZCBvcGVuIGEgKGxvY2FsaG9zdCkgbG9jYXRpb246CisJaHR0cDovLzEyNy4wLjAuMTo4MDgwCisJYW5kIHR5cGUgdXNlcmlkICdhZG1pbicgYW5kIHBhc3N3ZCAnZ3Vlc3QnIHRvIGdhaW4gYWNjZXNzCisJT3BlbiB0aGUgbG9jYXRpb246CisJaHR0cDovLzEyNy4wLjAuMTo4MDgwL2NhbGMuaHRtbAorCWFuZCBlbnRlciBhbiBleHByZXNzaW9uCisJT3BlbiB0aGUgbG9jYXRpb25zOgorCWh0dHA6Ly8xMjcuMC4wLjE6ODA4MC90ZXN0Lmh0bWwKKwlodHRwOi8vMTI3LjAuMC4xOjgwODEvd2Vic2VydmVyLndzZGwKKworCVVzZSAoSFRUUFMgR0VUKToKKwlDcmVhdGUgdGhlIFNTTCBjZXJ0aWZpY2F0ZQorCUNvbXBpbGUgdGhlIHdlYiBzZXJ2ZXIgd2l0aCBPcGVuU1NMIGFzIGV4cGxhaW5lZCBhYm92ZQorCVN0YXJ0IHRoZSB3ZWIgc2VydmVyIG9uIGFuIG9kZCBudW1iZXJlZCBwb3J0IChlLmcuIDgwODEpCisJPiB3ZWJzZXJ2ZXIgODA4MSAmCisJQWN0dWFsbHksIHlvdSBjYW4gc3RhcnQgdHdvIHNlcnZlcnMsIG9uZSBvbiA4MDgwIGFuZCBhIHNlY3VyZSBvbmUgb24KKwk4MDgxCisJU3RhcnQgYSB3ZWIgYnJvd3NlciBhbmQgb3BlbiBhIChsb2NhbGhvc3QpIGxvY2F0aW9uOgorCWh0dHBzOi8vMTI3LjAuMC4xOjgwODEKKwlhbmQgdHlwZSB1c2VyaWQgJ2FkbWluJyBhbmQgcGFzc3dkICdndWVzdCcgdG8gZ2FpbiBhY2Nlc3MKKwlPcGVuIHRoZSBsb2NhdGlvbjoKKwlodHRwczovLzEyNy4wLjAuMTo4MDgxL2NhbGMuaHRtbAorCWFuZCBlbnRlciBhbiBleHByZXNzaW9uCisJT3BlbiB0aGUgbG9jYXRpb25zOgorCWh0dHBzOi8vMTI3LjAuMC4xOjgwODEvdGVzdC5odG1sCisJaHR0cHM6Ly8xMjcuMC4wLjE6ODA4MS93ZWJzZXJ2ZXIud3NkbAorCisJVXNlIChIVFRQIFBPU1QpOgorCVNlcnZlcyBTT0FQL1hNTCBjYWxjdWxhdGlvbiByZXF1ZXN0cworCisJQ29tbWFuZC1saW5lIG9wdGlvbnM6CisJLXoJCWVuYWJsZXMgY29tcHJlc3Npb24KKwktYwkJZW5hYmxlcyBjaHVua2luZworCS1rCQllbmFibGVzIGtlZXAtYWxpdmUKKwktaQkJZW5hYmxlcyBub24tdGhyZWFkZWQgaXRlcmF0aXZlIHNlcnZlcgorCS12CQllbmFibGVzIHZlcmJvc2UgbW9kZQorCS10PHZhbD4JCXNldHMgSS9PIHRpbWVvdXQgdmFsdWUgKHNlY29uZHMpCisJLXM8dmFsPgkJc2V0cyBzZXJ2ZXIgdGltZW91dCB2YWx1ZSAoc2Vjb25kcykKKwktZDxob3N0PglzZXRzIGNvb2tpZSBkb21haW4KKwktcDxwYXRoPglzZXRzIGNvb2tpZSBwYXRoCisJLWxbbm9uZSBpbmJvdW5kIG91dGJvdW5kIGJvdGhdCisJCQllbmFibGVzIGxvZ2dpbmcKKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy93ZWJzZXJ2ZXIvYmFyLmdpZiBiL3NhbXBsZXMvd2Vic2VydmVyL2Jhci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBmYWI4MgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvd2Vic2VydmVyL2Jhci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy93ZWJzZXJ2ZXIvYmIuZ2lmIGIvc2FtcGxlcy93ZWJzZXJ2ZXIvYmIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ODU1NGQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3dlYnNlcnZlci9iYi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy93ZWJzZXJ2ZXIvYmJsLmdpZiBiL3NhbXBsZXMvd2Vic2VydmVyL2JibC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM3N2ZlOQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvd2Vic2VydmVyL2JibC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy93ZWJzZXJ2ZXIvYmJyLmdpZiBiL3NhbXBsZXMvd2Vic2VydmVyL2Jici5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg1ZGZlOQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvd2Vic2VydmVyL2Jici5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy93ZWJzZXJ2ZXIvYmwuZ2lmIGIvc2FtcGxlcy93ZWJzZXJ2ZXIvYmwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5OTg5ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3dlYnNlcnZlci9ibC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy93ZWJzZXJ2ZXIvYnIuZ2lmIGIvc2FtcGxlcy93ZWJzZXJ2ZXIvYnIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MzQzYjcKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3dlYnNlcnZlci9ici5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy93ZWJzZXJ2ZXIvYnMuZ2lmIGIvc2FtcGxlcy93ZWJzZXJ2ZXIvYnMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjY2FmODAKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3dlYnNlcnZlci9icy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy93ZWJzZXJ2ZXIvYnQuZ2lmIGIvc2FtcGxlcy93ZWJzZXJ2ZXIvYnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNGQwMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3dlYnNlcnZlci9idC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy93ZWJzZXJ2ZXIvYnRsLmdpZiBiL3NhbXBsZXMvd2Vic2VydmVyL2J0bC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEzZmMxMgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvd2Vic2VydmVyL2J0bC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy93ZWJzZXJ2ZXIvYnRyLmdpZiBiL3NhbXBsZXMvd2Vic2VydmVyL2J0ci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZiMzcyNgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvd2Vic2VydmVyL2J0ci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy93ZWJzZXJ2ZXIvY2FjZXJ0LnBlbSBiL3NhbXBsZXMvd2Vic2VydmVyL2NhY2VydC5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA0YjA1ZgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvd2Vic2VydmVyL2NhY2VydC5wZW0KQEAgLTAsMCArMSwyMSBAQAorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEaGpDQ0F1K2dBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVVGQURDQmp6RUxNQWtHQTFVRUJoTUNWVk14CitDekFKQmdOVkJBZ1RBa1pNTVJRd0VnWURWUVFIRXd0VVlXeHNZV2hoYzNObFpURVdNQlFHQTFVRUNoTU5SMlZ1CithWFpwWVN3Z1NXNWpMakVMTUFrR0ExVUVDeE1DU1ZReEZEQVNCZ05WQkFNVEMyZGxibWwyYVdFdVkyOXRNU0l3CitJQVlKS29aSWh2Y05BUWtCRmhOamIyNTBZV04wUUdkbGJtbDJhV0V1WTI5dE1CNFhEVEEwTVRBd01qRTNNRGd3CitObG9YRFRBM01UQXdNakUzTURnd05sb3dnWTh4Q3pBSkJnTlZCQVlUQWxWVE1Rc3dDUVlEVlFRSUV3SkdUREVVCitNQklHQTFVRUJ4TUxWR0ZzYkdGb1lYTnpaV1V4RmpBVUJnTlZCQW9URFVkbGJtbDJhV0VzSUVsdVl5NHhDekFKCitCZ05WQkFzVEFrbFVNUlF3RWdZRFZRUURFd3RuWlc1cGRtbGhMbU52YlRFaU1DQUdDU3FHU0liM0RRRUpBUllUCitZMjl1ZEdGamRFQm5aVzVwZG1saExtTnZiVENCbnpBTkJna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBCitsNks5YkxNY3JKNkJ6KzhoeHlvbFNKeTVUZFpLbzhPbW1za1ArTkFKY3Q3YUdXYTMzdTJsa1orR2tvVW1MS1ovCityRE5wZ21ZVk5RbE9RQzRydDVvRHQ0QVVvajU4NEc4UEpLU1B3eW1KY1gwc2JmQjdrOHhSbUxPK3ZWZ1NVdkR1Cithc0xNV0o2UHNZSXVHaHA0QndPQWduWUFDVHpzZDZrU2VJc2VkOFhTeDdjQ0F3RUFBYU9CN3pDQjdEQWRCZ05WCitIUTRFRmdRVTRNeUlpMEdnSVVxa1lSaG5KMkdneVVtVmQ4b3dnYndHQTFVZEl3U0J0RENCc1lBVTRNeUlpMEdnCitJVXFrWVJobkoyR2d5VW1WZDhxaGdaV2tnWkl3Z1k4eEN6QUpCZ05WQkFZVEFsVlRNUXN3Q1FZRFZRUUlFd0pHCitUREVVTUJJR0ExVUVCeE1MVkdGc2JHRm9ZWE56WldVeEZqQVVCZ05WQkFvVERVZGxibWwyYVdFc0lFbHVZeTR4CitDekFKQmdOVkJBc1RBa2xVTVJRd0VnWURWUVFERXd0blpXNXBkbWxoTG1OdmJURWlNQ0FHQ1NxR1NJYjNEUUVKCitBUllUWTI5dWRHRmpkRUJuWlc1cGRtbGhMbU52YllJQkFEQU1CZ05WSFJNRUJUQURBUUgvTUEwR0NTcUdTSWIzCitEUUVCQlFVQUE0R0JBRm1iOWtWK0VEeDVPNGo3ZExNdTkwOW5GZ25CTDA2c2VwanF0QklJYlpZM0duQ2dlZnhLCitwMVM2SWYwMS9tZFY3OW5aR0psZGVnTTc3dHo0VklsenVJYXorMk5PK0dxYnI2RXJPUiszVUdPclJ1SDM5YU1UCisxRHZ3SFlwVTVHVStsRzFhV0hkUXA4dVo1eTRva01nM1o5SVo1bmlqa1VucENIUU8rcS84RnJNTAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy93ZWJzZXJ2ZXIvY2FjZXJ0cy5wZW0gYi9zYW1wbGVzL3dlYnNlcnZlci9jYWNlcnRzLnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTgzZDg4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy93ZWJzZXJ2ZXIvY2FjZXJ0cy5wZW0KQEAgLTAsMCArMSw0MzU0IEBACitBQkFlY29tIChzdWIuLCBBbS4gQmFua2VycyBBc3NuLikgUm9vdCBDQQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogODI6MTI6Rjc6ODk6RTE6MEI6OTE6NjA6QTQ6QjY6MjI6OUY6OTQ6Njg6MTE6OTIKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEK0RDQ0F1Q2dBd0lCQWdJUkFOQWVRSkFBQUNkTEFBQUFBUUFBQUFRd0RRWUpLb1pJaHZjTkFRRUZCUUF3CitnWXd4Q3pBSkJnTlZCQVlUQWxWVE1RMHdDd1lEVlFRSUV3UlZkR0ZvTVJjd0ZRWURWUVFIRXc1VFlXeDBJRXhoCithMlVnUTJsMGVURVlNQllHQTFVRUNoTVBXR05sY25RZ1JWb2dZbmtnUkZOVU1SZ3dGZ1lEVlFRREV3OVlZMlZ5CitkQ0JGV2lCaWVTQkVVMVF4SVRBZkJna3Foa2lHOXcwQkNRRVdFbU5oUUdScFozTnBaM1J5ZFhOMExtTnZiVEFlCitGdzA1T1RBM01UUXhOakUwTVRoYUZ3MHdPVEEzTVRFeE5qRTBNVGhhTUlHTU1Rc3dDUVlEVlFRR0V3SlZVekVOCitNQXNHQTFVRUNCTUVWWFJoYURFWE1CVUdBMVVFQnhNT1UyRnNkQ0JNWVd0bElFTnBkSGt4R0RBV0JnTlZCQW9UCitEMWhqWlhKMElFVmFJR0o1SUVSVFZERVlNQllHQTFVRUF4TVBXR05sY25RZ1JWb2dZbmtnUkZOVU1TRXdId1lKCitLb1pJaHZjTkFRa0JGaEpqWVVCa2FXZHphV2QwY25WemRDNWpiMjB3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBCitBNElCRHdBd2dnRUtBb0lCQVFDdFZCamV0TC8zcmVoMHF1MkxmSS9DMUhVYTFZUzV0bUw4aWUva2wyR1MreDI0Cis0VnBITko2ZUJpTDcwK280eTdpTEIvY2FvQmQzQjFvd0hOUXBPQ0RYSjBEWVVKTkR2OUlZb2lsMkJYS3FhN1pwCittS3Q1SGh4bDlXcUwvTVVXcXFKeTJtRHRUbTRaSlhvS0hURGpVSnRDUEVUcm9iQWdIdHNDZnY0OUg3L1FBSXJiCitRSGFtR0tVVnAxZTJVc0lCRjVoM2o0cUJ4aHEwYWlybXI2bldBS3pQMkJWSmZOc2JvZjZCK29mNTA1REJBc0Q1CiswRUxwa1dnbFg4YS9oem5wbFFCZ0tMK0RMTURuWHJiWE5oYm5ZSWQyNk9jbnNpVU5pM3JscWgzbFdjM09DdzV2Cit4c2ljNHhEWmhUblR0NXY2eHJwOGROSmRkVmFyZEtTaVViOVNmTzV4QWdNQkFBR2pVekJSTUE4R0ExVWRFd0VCCisvd1FGTUFNQkFmOHdId1lEVlIwakJCZ3dGb0FVQ0NCc1p1dUJDbXhjMWJXbVBFSGRISmFSSjNjd0hRWURWUjBPCitCQllFRkFnZ2JHYnJnUXBzWE5XMXBqeEIzUnlXa1NkM01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQmFoMWlQCitMYXQySVd0VURObnhRZlpPelN1ZTR4K2JveTEvMlN0OVdNaG5wQ24xNmV6VnZaWS9vM1A0eEZzMmZOQmpMRFE1CittMGk0UFcvMkZNV2VZK2FuTkc3VDZET3p4endZYmlPdVE1S1pQNWpGYVREeE5qdXR1VENDMXJaWkZwWUNDeWtTCitZYlFSaWZjTUw1U1FoWmdvbkZOc2ZtUGRjL1FaLzBxQjBiSlNJLzA4U2pUT1dodmdVSXJ0VDRHVjJHRG41TVFOCit1MWcrV1BkT2FHOCtaOG5MZXBjV0oreENZUlIydXdERjZ3ZzlGWDlMdGlKZGh6dVE5UFBBL2plejZkbGlETURECitXYTlndlI4TjI2RTBIekRFUFl1dHNCMEVrKzFmMWVTL0lEQUU5RWpwTXdIUkxwQW5Vck9iM2pvY3E2bVhmNXZyCit3bzNDYmV6Y0U5Tkd4WGw4CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAzICgweDIpCisgICAgICAgIFNlcmlhbCBOdW1iZXI6CisgICAgICAgICAgICBkMDoxZTo0MDo5MDowMDowMDoyNzo0YjowMDowMDowMDowMTowMDowMDowMDowNAorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBTVD1VdGFoLCBMPVNhbHQgTGFrZSBDaXR5LCBPPVhjZXJ0IEVaIGJ5IERTVCwgQ049WGNlcnQgRVogYnkgRFNUL0VtYWlsPWNhQGRpZ3NpZ3RydXN0LmNvbQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogSnVsIDE0IDE2OjE0OjE4IDE5OTkgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBKdWwgMTEgMTY6MTQ6MTggMjAwOSBHTVQKKyAgICAgICAgU3ViamVjdDogQz1VUywgU1Q9VXRhaCwgTD1TYWx0IExha2UgQ2l0eSwgTz1YY2VydCBFWiBieSBEU1QsIENOPVhjZXJ0IEVaIGJ5IERTVC9FbWFpbD1jYUBkaWdzaWd0cnVzdC5jb20KKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgyMDQ4IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgyMDQ4IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmFkOjU0OjE4OmRlOmI0OmJmOmY3OmFkOmU4Ojc0OmFhOmVkOjhiOjdjOgorICAgICAgICAgICAgICAgICAgICA4ZjpjMjpkNDo3NToxYTpkNTo4NDpiOTpiNjo2MjpmYzo4OTplZjplNDo5NzoKKyAgICAgICAgICAgICAgICAgICAgNjE6OTI6ZmI6MWQ6Yjg6ZTE6NWE6NDc6MzQ6OWU6OWU6MDY6MjI6ZmI6ZDM6CisgICAgICAgICAgICAgICAgICAgIGVhOjM4OmNiOmI4OjhiOjA3OmY3OjFhOmEwOjE3Ojc3OjA3OjVhOjMwOjFjOgorICAgICAgICAgICAgICAgICAgICBkNDoyOTozODoyMDpkNzoyNzo0MDpkODo1MDo5Mzo0MzpiZjpkMjoxODphMjoKKyAgICAgICAgICAgICAgICAgICAgMjk6NzY6MDU6NzI6YWE6NmI6YjY6Njk6OTg6YWI6Nzk6MWU6MWM6NjU6ZjU6CisgICAgICAgICAgICAgICAgICAgIDZhOjhiOmZjOmM1OjE2OmFhOmEyOjcyOmRhOjYwOmVkOjRlOjZlOjE5OjI1OgorICAgICAgICAgICAgICAgICAgICA3YTowYToxZDozMDplMzo1MDo5Yjo0MjozYzo0NDplYjphMTpiMDoyMDoxZToKKyAgICAgICAgICAgICAgICAgICAgZGI6MDI6N2U6ZmU6M2Q6MWY6YmY6ZDA6MDA6OGE6ZGI6NDA6NzY6YTY6MTg6CisgICAgICAgICAgICAgICAgICAgIGE1OjE1OmE3OjU3OmI2OjUyOmMyOjAxOjE3Ojk4Ojc3OjhmOjhhOjgxOmM2OgorICAgICAgICAgICAgICAgICAgICAxYTpiNDo2YToyYTplNjphZjphOTpkNjowMDphYzpjZjpkODoxNTo0OTo3YzoKKyAgICAgICAgICAgICAgICAgICAgZGI6MWI6YTE6ZmU6ODE6ZmE6ODc6Zjk6ZDM6OTA6YzE6MDI6YzA6Zjk6ZDA6CisgICAgICAgICAgICAgICAgICAgIDQyOmU5OjkxOjY4OjI1OjVmOmM2OmJmOjg3OjM5OmU5Ojk1OjAwOjYwOjI4OgorICAgICAgICAgICAgICAgICAgICBiZjo4MzoyYzpjMDplNzo1ZTpiNjpkNzozNjoxNjplNzo2MDo4Nzo3NjplODoKKyAgICAgICAgICAgICAgICAgICAgZTc6Mjc6YjI6MjU6MGQ6OGI6N2E6ZTU6YWE6MWQ6ZTU6NTk6Y2Q6Y2U6MGI6CisgICAgICAgICAgICAgICAgICAgIDBlOjZmOmM2OmM4OjljOmUzOjEwOmQ5Ojg1OjM5OmQzOmI3OjliOmZhOmM2OgorICAgICAgICAgICAgICAgICAgICBiYTo3Yzo3NDpkMjo1ZDo3NTo1NjphYjo3NDphNDphMjo1MTpiZjo1Mjo3YzoKKyAgICAgICAgICAgICAgICAgICAgZWU6NzEKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgICAgIFg1MDl2MyBleHRlbnNpb25zOgorICAgICAgICAgICAgWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzOiBjcml0aWNhbAorICAgICAgICAgICAgICAgIENBOlRSVUUKKyAgICAgICAgICAgIFg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIGtleWlkOjA4OjIwOjZDOjY2OkVCOjgxOjBBOjZDOjVDOkQ1OkI1OkE2OjNDOjQxOkREOjFDOjk2OjkxOjI3Ojc3CisKKyAgICAgICAgICAgIFg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICAwODoyMDo2Qzo2NjpFQjo4MTowQTo2Qzo1QzpENTpCNTpBNjozQzo0MTpERDoxQzo5Njo5MToyNzo3NworICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA1YTo4Nzo1ODo4ZjoyZDphYjo3NjoyMTo2Yjo1NDowYzpkOTpmMTo0MTpmNjo0ZTpjZDoyYjoKKyAgICAgICAgOWU6ZTM6MWY6OWI6YTM6MmQ6N2Y6ZDk6MmI6N2Q6NTg6Yzg6Njc6YTQ6Mjk6ZjU6ZTk6ZWM6CisgICAgICAgIGQ1OmJkOjk2OjNmOmEzOjczOmY4OmM0OjViOjM2OjdjOmQwOjYzOjJjOjM0OjM5OjliOjQ4OgorICAgICAgICBiODozZDo2ZjpmNjoxNDpjNTo5ZTo2MzplNjphNzozNDo2ZTpkMzplODozMzpiMzpjNzozYzoKKyAgICAgICAgMTg6NmU6MjM6YWU6NDM6OTI6OTk6M2Y6OTg6YzU6Njk6MzA6ZjE6MzY6M2I6YWQ6Yjk6MzA6CisgICAgICAgIDgyOmQ2OmI2OjU5OjE2Ojk2OjAyOjBiOjI5OjEyOjYxOmI0OjExOjg5OmY3OjBjOjJmOjk0OgorICAgICAgICA5MDo4NTo5ODoyODo5Yzo1Mzo2Yzo3ZTo2MzpkZDo3MzpmNDoxOTpmZjo0YTo4MTpkMTpiMjoKKyAgICAgICAgNTI6MjM6ZmQ6M2M6NGE6MzQ6Y2U6NWE6MWI6ZTA6NTA6OGE6ZWQ6NGY6ODE6OTU6ZDg6NjA6CisgICAgICAgIGU3OmU0OmM0OjBkOmJiOjU4OjNlOjU4OmY3OjRlOjY4OjZmOjNlOjY3OmM5OmNiOjdhOjk3OgorICAgICAgICAxNjoyNzplYzo0Mjo2MToxNDo3NjpiYjowMDpjNTplYjowODozZDoxNTo3Zjo0YjpiNjoyMjoKKyAgICAgICAgNWQ6ODc6M2I6OTA6ZjQ6ZjM6YzA6ZmU6Mzc6YjM6ZTk6ZDk6NjI6MGM6YzA6YzM6NTk6YWY6CisgICAgICAgIDYwOmJkOjFmOjBkOmRiOmExOjM0OjFmOjMwOmM0OjNkOjhiOmFkOmIwOjFkOjA0OjkzOmVkOgorICAgICAgICA1ZjpkNTplNDpiZjoyMDozMDowNDpmNDo0ODplOTozMzowMTpkMToyZTo5MDoyNzo1MjpiMzoKKyAgICAgICAgOWI6ZGU6M2E6MWM6YWI6YTk6OTc6N2Y6OWI6ZWI6YzI6OGQ6YzI6NmQ6ZWM6ZGM6MTM6ZDM6CisgICAgICAgIDQ2OmM1Ojc5OjdjCisKK0FOWCBOZXR3b3JrIENBIGJ5IERTVAorPT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IEE4OkVEOkRFOkVCOjkzOjg4OjY2OkQ4OjJGOkMzOkJEOjFEOkJFOjQ1OkJFOjRECitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRFRUQ0NBcmFnQXdJQkFnSUVObTZpYnpBTkJna3Foa2lHOXcwQkFRVUZBREJTTVFzd0NRWURWUVFHRXdKVgorVXpFa01DSUdBMVVFQ2hNYlJHbG5hWFJoYkNCVGFXZHVZWFIxY21VZ1ZISjFjM1FnUTI4dU1SMHdHd1lEVlFRTAorRXhSRVUxUWdLRUZPV0NCT1pYUjNiM0pyS1NCRFFUQWVGdzA1T0RFeU1Ea3hOVFEyTkRoYUZ3MHhPREV5TURreAorTmpFMk5EaGFNRkl4Q3pBSkJnTlZCQVlUQWxWVE1TUXdJZ1lEVlFRS0V4dEVhV2RwZEdGc0lGTnBaMjVoZEhWeQorWlNCVWNuVnpkQ0JEYnk0eEhUQWJCZ05WQkFzVEZFUlRWQ0FvUVU1WUlFNWxkSGR2Y21zcElFTkJNSUdkTUEwRworQ1NxR1NJYjNEUUVCQVFVQUE0R0xBRENCaHdLQmdRQzBTQkdBV0tEVnBaa1A5amNzUkxadTBYenpLbXVlRWJhSQorSXdSY2NTV2VhaEozRVc2L2FEbGxxUGF5OXFJWXNva1ZvR2UzZW93aVNHdjJoRFFmdHNyM0czTEw4bHRJMDRjZQorSW5ZVEJMU3NiSlovNXc0SXlUSlJNQzNWZ09naFo3cnpYZ2drTEFkWm5aQWE3a2JKdGFRZWxyUkJrZFIvMG8wNAorSnJCdlEyNEpmUUlCQTZPQ0FUQXdnZ0VzTUJFR0NXQ0dTQUdHK0VJQkFRUUVBd0lBQnpCMEJnTlZIUjhFYlRCcgorTUdtZ1o2QmxwR013WVRFTE1Ba0dBMVVFQmhNQ1ZWTXhKREFpQmdOVkJBb1RHMFJwWjJsMFlXd2dVMmxuYm1GMAorZFhKbElGUnlkWE4wSUVOdkxqRWRNQnNHQTFVRUN4TVVSRk5VSUNoQlRsZ2dUbVYwZDI5eWF5a2dRMEV4RFRBTAorQmdOVkJBTVRCRU5TVERFd0t3WURWUjBRQkNRd0lvQVBNVGs1T0RFeU1Ea3hOVFEyTkRoYWdROHlNREU0TVRJdworT1RFMU5EWTBPRm93Q3dZRFZSMFBCQVFEQWdFR01COEdBMVVkSXdRWU1CYUFGSXdXVlhETUZncFRaTUtsaEtxegorWkJkRFA0STJNQjBHQTFVZERnUVdCQlNNRmxWd3pCWUtVMlRDcFlTcXMyUVhReitDTmpBTUJnTlZIUk1FQlRBRAorQVFIL01Ca0dDU3FHU0liMmZRZEJBQVFNTUFvYkJGWTBMakFEQWdTUU1BMEdDU3FHU0liM0RRRUJCUVVBQTRHQgorQUVrbHlXQ3hERitwT1JEVHhUUlZmYzk1d3lucjN2bkNRUG5vVnNYd0wrejAyZXhJVWJoak9GNlRiaGlXaGJuSworVUp5a3VPcG1KbWlUaFc5dlRISFF2bm9MUERHNTk3NXBuaERYMFVEb3JCWnhxNjZyT09Gd3NjcVNGdUJkaGFZWQorZ0FZQW5PR21HRUpScDJob1dlOG1sRit0TVF6K0tSNFhBWVEzVytnU01xTmQKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjogOTEzMjIwMjA3ICgweDM2NmVhMjZmKQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBPPURpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLiwgT1U9RFNUIChBTlggTmV0d29yaykgQ0EKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IERlYyAgOSAxNTo0Njo0OCAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogRGVjICA5IDE2OjE2OjQ4IDIwMTggR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89RGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uLCBPVT1EU1QgKEFOWCBOZXR3b3JrKSBDQQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6YjQ6NDg6MTE6ODA6NTg6YTA6ZDU6YTU6OTk6MGY6ZjY6Mzc6MmM6NDQ6CisgICAgICAgICAgICAgICAgICAgIGI2OjZlOmQxOjdjOmYzOjJhOjZiOjllOjExOmI2Ojg4OjIzOjA0OjVjOjcxOgorICAgICAgICAgICAgICAgICAgICAyNTo5ZTo2YToxMjo3NzoxMTo2ZTpiZjo2ODozOTo2NTphODpmNjpiMjpmNjoKKyAgICAgICAgICAgICAgICAgICAgYTI6MTg6YjI6ODk6MTU6YTA6Njc6Yjc6N2E6OGM6MjI6NDg6NmI6ZjY6ODQ6CisgICAgICAgICAgICAgICAgICAgIDM0OjFmOmI2OmNhOmY3OjFiOjcyOmNiOmYyOjViOjQ4OmQzOjg3OjFlOjIyOgorICAgICAgICAgICAgICAgICAgICA3NjoxMzowNDpiNDphYzo2Yzo5Njo3ZjplNzowZTowODpjOTozMjo1MTozMDoKKyAgICAgICAgICAgICAgICAgICAgMmQ6ZDU6ODA6ZTg6MjE6Njc6YmE6ZjM6NWU6MDg6MjQ6MmM6MDc6NTk6OWQ6CisgICAgICAgICAgICAgICAgICAgIDkwOjFhOmVlOjQ2OmM5OmI1OmE0OjFlOjk2OmI0OjQxOjkxOmQ0OjdmOmQyOgorICAgICAgICAgICAgICAgICAgICA4ZDozODoyNjpiMDo2Zjo0Mzo2ZTowOTo3ZAorICAgICAgICAgICAgICAgIEV4cG9uZW50OiAzICgweDMpCisgICAgICAgIFg1MDl2MyBleHRlbnNpb25zOgorICAgICAgICAgICAgTmV0c2NhcGUgQ2VydCBUeXBlOiAKKyAgICAgICAgICAgICAgICBTU0wgQ0EsIFMvTUlNRSBDQSwgT2JqZWN0IFNpZ25pbmcgQ0EKKyAgICAgICAgICAgIFg1MDl2MyBDUkwgRGlzdHJpYnV0aW9uIFBvaW50czogCisgICAgICAgICAgICAgICAgRGlyTmFtZTovQz1VUy9PPURpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLi9PVT1EU1QgKEFOWCBOZXR3b3JrKSBDQS9DTj1DUkwxCisKKyAgICAgICAgICAgIFg1MDl2MyBQcml2YXRlIEtleSBVc2FnZSBQZXJpb2Q6IAorICAgICAgICAgICAgICAgIE5vdCBCZWZvcmU6IERlYyAgOSAxNTo0Njo0OCAxOTk4IEdNVCwgTm90IEFmdGVyOiBEZWMgIDkgMTU6NDY6NDggMjAxOCBHTVQKKyAgICAgICAgICAgIFg1MDl2MyBLZXkgVXNhZ2U6IAorICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIFNpZ24sIENSTCBTaWduCisgICAgICAgICAgICBYNTA5djMgQXV0aG9yaXR5IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICBrZXlpZDo4QzoxNjo1NTo3MDpDQzoxNjowQTo1Mzo2NDpDMjpBNTo4NDpBQTpCMzo2NDoxNzo0MzozRjo4MjozNgorCisgICAgICAgICAgICBYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAgOEM6MTY6NTU6NzA6Q0M6MTY6MEE6NTM6NjQ6QzI6QTU6ODQ6QUE6QjM6NjQ6MTc6NDM6M0Y6ODI6MzYKKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogCisgICAgICAgICAgICAgICAgQ0E6VFJVRQorICAgICAgICAgICAgMS4yLjg0MC4xMTM1MzMuNy42NS4wOiAKKyAgICAgICAgICAgICAgICAwCisuLlY0LjAuLi4uCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDQ5OjI1OmM5OjYwOmIxOjBjOjVmOmE5OjM5OjEwOmQzOmM1OjM0OjU1OjdkOmNmOjc5OmMzOgorICAgICAgICAyOTplYjpkZTpmOTpjMjo0MDpmOTplODo1NjpjNTpmMDoyZjplYzpmNDpkOTplYzo0ODo1MToKKyAgICAgICAgYjg6NjM6Mzg6NWU6OTM6NmU6MTg6OTY6ODU6Yjk6Y2E6NTA6OWM6YTQ6Yjg6ZWE6NjY6MjY6CisgICAgICAgIDY4OjkzOjg1OjZmOjZmOjRjOjcxOmQwOmJlOjdhOjBiOjNjOjMxOmI5OmY3OmJlOjY5OjllOgorICAgICAgICAxMDpkNzpkMTo0MDplODphYzoxNjo3MTphYjphZTphYjozODplMTo3MDpiMTpjYTo5MjoxNjoKKyAgICAgICAgZTA6NWQ6ODU6YTY6MTg6ODA6MDY6MDA6OWM6ZTE6YTY6MTg6NDI6NTE6YTc6Njg6Njg6NTk6CisgICAgICAgIGVmOjI2Ojk0OjVmOmFkOjMxOjBjOmZlOjI5OjFlOjE3OjAxOjg0OjM3OjViOmU4OjEyOjMyOgorICAgICAgICBhMzo1ZAorCitBbWVyaWNhbiBFeHByZXNzIENBCis9PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IDFDOkQ1OjhFOjgyOkJFOjcwOjU1OjhFOjM5OjYxOkRGOkFEOjUxOkRCOjZCOkEwCitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQ2tEQ0NBZmtDQWdDTk1BMEdDU3FHU0liM0RRRUJCQVVBTUlHUE1Rc3dDUVlEVlFRR0V3SlZVekVuTUNVRworQTFVRUNoTWVRVzFsY21sallXNGdSWGh3Y21WemN5QkRiMjF3WVc1NUxDQkpibU11TVNZd0pBWURWUVFMRXgxQgorYldWeWFXTmhiaUJGZUhCeVpYTnpJRlJsWTJodWIyeHZaMmxsY3pFdk1DMEdBMVVFQXhNbVFXMWxjbWxqWVc0ZworUlhod2NtVnpjeUJEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhrd0hoY05PVGd3T0RFME1qSXdNVEF3V2hjTgorTURZd09ERTBNak0xT1RBd1dqQ0JqekVMTUFrR0ExVUVCaE1DVlZNeEp6QWxCZ05WQkFvVEhrRnRaWEpwWTJGdQorSUVWNGNISmxjM01nUTI5dGNHRnVlU3dnU1c1akxqRW1NQ1FHQTFVRUN4TWRRVzFsY21sallXNGdSWGh3Y21WegorY3lCVVpXTm9ibTlzYjJkcFpYTXhMekF0QmdOVkJBTVRKa0Z0WlhKcFkyRnVJRVY0Y0hKbGMzTWdRMlZ5ZEdsbQorYVdOaGRHVWdRWFYwYUc5eWFYUjVNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0JnUURKOGttUworaGNyOUZTbTFCclpFN1B5SW8vS0d6djhVVHlRY2t2bkNJOEhPUTk5ZE5NaTRGT3pWS25DUlNaWFhWczJVOGFtVAorMEdnaTNFMTlvQXB5S2tmcUpmQ0ZBRjgyVkdIUEMvazNXbWVkNlIvcFpEOXdsV0duMERBQzNpWW9wR1lEQk9rdworKzQ4ekIvbHZZWWVpY3R2emFIaGpabG1weWJkbTRSV3lTRFlzK1FJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQkFVQQorQTRHQkFHZ1hZcmh6aTB4czYwcWxQcXZsblM3U3pZb0hWL1BHV1pkMkZ4ZjRVbzRuazloWTJDaHM5S0lFZW9yQworZGlTeEFyVGZLUEwzODZpbmZpTklZWWowRVdpdUpsMzJvVXRUSldyWUtoUUNEdUNISUc2ZUdWeHprQXNqNGpHWAorSXovVklxTFRCbnZhTi9YWHRVRkVGM3BGQXRtRlJXYldqc2Z3ZWd5WllpSnBXKzNTCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAxICgweDApCisgICAgICAgIFNlcmlhbCBOdW1iZXI6IDE0MSAoMHg4ZCkKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBPPUFtZXJpY2FuIEV4cHJlc3MgQ29tcGFueSwgSW5jLiwgT1U9QW1lcmljYW4gRXhwcmVzcyBUZWNobm9sb2dpZXMsIENOPUFtZXJpY2FuIEV4cHJlc3MgQ2VydGlmaWNhdGUgQXV0aG9yaXR5CisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBBdWcgMTQgMjI6MDE6MDAgMTk5OCBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEF1ZyAxNCAyMzo1OTowMCAyMDA2IEdNVAorICAgICAgICBTdWJqZWN0OiBDPVVTLCBPPUFtZXJpY2FuIEV4cHJlc3MgQ29tcGFueSwgSW5jLiwgT1U9QW1lcmljYW4gRXhwcmVzcyBUZWNobm9sb2dpZXMsIENOPUFtZXJpY2FuIEV4cHJlc3MgQ2VydGlmaWNhdGUgQXV0aG9yaXR5CisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpjOTpmMjo0OTo5Mjo4NTpjYTpmZDoxNToyOTpiNTowNjpiNjo0NDplYzoKKyAgICAgICAgICAgICAgICAgICAgZmM6ODg6YTM6ZjI6ODY6Y2U6ZmY6MTQ6NGY6MjQ6MWM6OTI6Zjk6YzI6MjM6CisgICAgICAgICAgICAgICAgICAgIGMxOmNlOjQzOmRmOjVkOjM0OmM4OmI4OjE0OmVjOmQ1OjJhOjcwOjkxOjQ5OgorICAgICAgICAgICAgICAgICAgICA5NTpkNzo1NjpjZDo5NDpmMTphOTo5MzpkMDo2ODoyMjpkYzo0ZDo3ZDphMDoKKyAgICAgICAgICAgICAgICAgICAgMGE6NzI6MmE6NDc6ZWE6MjU6ZjA6ODU6MDA6NWY6MzY6NTQ6NjE6Y2Y6MGI6CisgICAgICAgICAgICAgICAgICAgIGY5OjM3OjVhOjY3OjlkOmU5OjFmOmU5OjY0OjNmOjcwOjk1OjYxOmE3OmQwOgorICAgICAgICAgICAgICAgICAgICAzMDowMjpkZToyNjoyODphNDo2NjowMzowNDplOTozMDpmYjo4ZjozMzowNzoKKyAgICAgICAgICAgICAgICAgICAgZjk6NmY6NjE6ODc6YTI6NzI6ZGI6ZjM6Njg6Nzg6NjM6NjY6NTk6YTk6Yzk6CisgICAgICAgICAgICAgICAgICAgIGI3OjY2OmUxOjE1OmIyOjQ4OjM2OjJjOmY5CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDY4OjE3OjYyOmI4OjczOjhiOjRjOjZjOmViOjRhOmE1OjNlOmFiOmU1OjlkOjJlOmQyOmNkOgorICAgICAgICA4YTowNzo1NzpmMzpjNjo1OTo5Nzo3NjoxNzoxNzpmODo1Mjo4ZToyNzo5MzpkODo1ODpkODoKKyAgICAgICAgMjg6NmM6ZjQ6YTI6MDQ6N2E6OGE6YzI6NzY6MjQ6YjE6MDI6YjQ6ZGY6Mjg6ZjI6Zjc6ZjM6CisgICAgICAgIGE4OmE3OjdlOjIzOjQ4OjYxOjg4OmY0OjExOjY4OmFlOjI2OjVkOmY2OmExOjRiOjUzOjI1OgorICAgICAgICA2YTpkODoyYToxNDowMjowZTplMDo4NzoyMDo2ZTo5ZToxOTo1Yzo3Mzo5MDowYjoyMzplMjoKKyAgICAgICAgMzE6OTc6MjM6M2Y6ZDU6MjI6YTI6ZDM6MDY6N2I6ZGE6Mzc6ZjU6ZDc6YjU6NDE6NDQ6MTc6CisgICAgICAgIDdhOjQ1OjAyOmQ5Ojg1OjQ1OjY2OmQ2OjhlOmM3OmYwOjdhOjBjOjk5OjYyOjIyOjY5OjViOgorICAgICAgICBlZDpkMgorCitBbWVyaWNhbiBFeHByZXNzIEdsb2JhbCBDQQorPT09PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogNjM6MUI6NjY6OTM6OEM6RjM6NjY6Q0I6M0M6Nzk6NTc6REM6MDU6NDk6RUE6REIKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFQkRDQ0F1eWdBd0lCQWdJQ0FJVXdEUVlKS29aSWh2Y05BUUVGQlFBd2daWXhDekFKQmdOVkJBWVRBbFZUCitNU2N3SlFZRFZRUUtFeDVCYldWeWFXTmhiaUJGZUhCeVpYTnpJRU52YlhCaGJua3NJRWx1WXk0eEpqQWtCZ05WCitCQXNUSFVGdFpYSnBZMkZ1SUVWNGNISmxjM01nVkdWamFHNXZiRzluYVdWek1UWXdOQVlEVlFRREV5MUJiV1Z5CithV05oYmlCRmVIQnlaWE56SUVkc2IySmhiQ0JEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhrd0hoY05PVGd3CitPREUwTVRrd05qQXdXaGNOTVRNd09ERTBNak0xT1RBd1dqQ0JsakVMTUFrR0ExVUVCaE1DVlZNeEp6QWxCZ05WCitCQW9USGtGdFpYSnBZMkZ1SUVWNGNISmxjM01nUTI5dGNHRnVlU3dnU1c1akxqRW1NQ1FHQTFVRUN4TWRRVzFsCitjbWxqWVc0Z1JYaHdjbVZ6Y3lCVVpXTm9ibTlzYjJkcFpYTXhOakEwQmdOVkJBTVRMVUZ0WlhKcFkyRnVJRVY0CitjSEpsYzNNZ1IyeHZZbUZzSUVObGNuUnBabWxqWVhSbElFRjFkR2h2Y21sMGVUQ0NBU0l3RFFZSktvWklodmNOCitBUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBUEFrSm1ZdSsrdEtjM0ZUaVVmTEpqeFRrcFJNeXNLRnRRMzR3MWU5CitMeW9mYWhpM1Y2OE1BQmI2b0xhUXB2Y2FvUzVtSnNkb280cVRhV2ExUmxZdEhZTHFrQXdLSXNLSlVJMEY4OVNyCitjMEh3enhLc0tMUnZGSlNXV1V1ZWtIV0czK0pINitIcFQwTitoOG9uR0dhZXRjRkFaWDM4WVcrdG0zTFBxVjdZCis4L25hYnBFUStreTE2bjRnM3FrNUwvV0k1SXB2TmNZZ25DdUdSak1LL0RGVnBXdXNGa0RwelRWWmJ6SUV3M3UxCitEM3QzY1BOSXV5cFNnczZ2S1czeEVXOXQ1Z2NBQWUrYTh5WU5wbmtUWjYvNHF4eDFySkcxYTc1QXNONmNETEZwCitoUmx4a1JORnl0L1IvZWF5eXBhRGVkdkZ1S3BiZXBBTGVGWSt4dGVmbEVnUjlhMENBd0VBQWFOYU1GZ3dFZ1lECitWUjBUQVFIL0JBZ3dCZ0VCL3dJQkJUQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0Z3WURWUjBnQkJBd0RqQU1CZ29xCitoa2lHK1E4S0FRVUJNQmtHQTFVZERnUVNCQkJYUnpWN05pY1JxQWo4TDBZbDZ5UnBNQTBHQ1NxR1NJYjNEUUVCCitCUVVBQTRJQkFRREhZVVdvaW5HNXZqVHBJWHNoelZZVG1OVXdZK2tZcWt1U0ZiOExIYnZza21uRkxzTmhpK2d3CitSY3NRUnNGek9GeUxHZElyODBEcmZIS3pMaDRuNDNXVmloeWJMc1NWQllaeTBGWDBvWkpTZVZ6YjlQamM1ZGNTCitzVURIUElia01XVkt5amZHM25aWEdXbE1SbW44S3EwV04zcVRyUGNoU3kzNzY2bFF5OEhSUUFqYUEybUhwemRlCitWY0hGN2NUampnd21sNXRjVjB0eTQvSURCZEFDT3lZRFFKQ2V2Z3RiU1F4NDhkVk1WU25nOXYxTUE2bFVBakxSCitWMXFGckVQdFd6c1dYNkMvTmR0TG5udm8vK2NOUER1b20wbEJSdlZ6VHYrU1pTR0RFMVZ4NjBrOGY0Z2F3aElvCitKYUZHUzBFM2wzL3NqdkhVb1piQ0lMWmVyYWtjSGhHZworLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiAxMzMgKDB4ODUpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9VVMsIE89QW1lcmljYW4gRXhwcmVzcyBDb21wYW55LCBJbmMuLCBPVT1BbWVyaWNhbiBFeHByZXNzIFRlY2hub2xvZ2llcywgQ049QW1lcmljYW4gRXhwcmVzcyBHbG9iYWwgQ2VydGlmaWNhdGUgQXV0aG9yaXR5CisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBBdWcgMTQgMTk6MDY6MDAgMTk5OCBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEF1ZyAxNCAyMzo1OTowMCAyMDEzIEdNVAorICAgICAgICBTdWJqZWN0OiBDPVVTLCBPPUFtZXJpY2FuIEV4cHJlc3MgQ29tcGFueSwgSW5jLiwgT1U9QW1lcmljYW4gRXhwcmVzcyBUZWNobm9sb2dpZXMsIENOPUFtZXJpY2FuIEV4cHJlc3MgR2xvYmFsIENlcnRpZmljYXRlIEF1dGhvcml0eQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDIwNDggYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDIwNDggYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6ZjA6MjQ6MjY6NjY6MmU6ZmI6ZWI6NGE6NzM6NzE6NTM6ODk6NDc6Y2I6CisgICAgICAgICAgICAgICAgICAgIDI2OjNjOjUzOjkyOjk0OjRjOmNhOmMyOjg1OmI1OjBkOmY4OmMzOjU3OmJkOgorICAgICAgICAgICAgICAgICAgICAyZjoyYToxZjo2YToxODpiNzo1NzphZjowYzowMDoxNjpmYTphMDpiNjo5MDoKKyAgICAgICAgICAgICAgICAgICAgYTY6Zjc6MWE6YTE6MmU6NjY6MjY6Yzc6Njg6YTM6OGE6OTM6Njk6NjY6YjU6CisgICAgICAgICAgICAgICAgICAgIDQ2OjU2OjJkOjFkOjgyOmVhOjkwOjBjOjBhOjIyOmMyOjg5OjUwOjhkOjA1OgorICAgICAgICAgICAgICAgICAgICBmMzpkNDphYjo3Mzo0MTpmMDpjZjoxMjphYzoyODpiNDo2ZjoxNDo5NDo5NjoKKyAgICAgICAgICAgICAgICAgICAgNTk6NGI6OWU6OTA6NzU6ODY6ZGY6ZTI6NDc6ZWI6ZTE6ZTk6NGY6NDM6N2U6CisgICAgICAgICAgICAgICAgICAgIDg3OmNhOjI3OjE4OjY2OjllOmI1OmMxOjQwOjY1OjdkOmZjOjYxOjZmOmFkOgorICAgICAgICAgICAgICAgICAgICA5Yjo3MjpjZjphOTo1ZTpkODpmMzpmOTpkYTo2ZTo5MToxMDpmYTo0YzpiNToKKyAgICAgICAgICAgICAgICAgICAgZWE6N2U6MjA6ZGU6YTk6Mzk6MmY6ZjU6ODg6ZTQ6OGE6NmY6MzU6YzY6MjA6CisgICAgICAgICAgICAgICAgICAgIDljOjJiOjg2OjQ2OjMzOjBhOmZjOjMxOjU1OmE1OjZiOmFjOjE2OjQwOmU5OgorICAgICAgICAgICAgICAgICAgICBjZDozNTo1OTo2ZjozMjowNDpjMzo3YjpiNTowZjo3Yjo3Nzo3MDpmMzo0ODoKKyAgICAgICAgICAgICAgICAgICAgYmI6MmE6NTI6ODI6Y2U6YWY6Mjk6NmQ6ZjE6MTE6NmY6NmQ6ZTY6MDc6MDA6CisgICAgICAgICAgICAgICAgICAgIDAxOmVmOjlhOmYzOjI2OjBkOmE2Ojc5OjEzOjY3OmFmOmY4OmFiOjFjOjc1OgorICAgICAgICAgICAgICAgICAgICBhYzo5MTpiNTo2YjpiZTo0MDpiMDpkZTo5YzowYzpiMTo2OTo4NToxOTo3MToKKyAgICAgICAgICAgICAgICAgICAgOTE6MTM6NDU6Y2E6ZGY6ZDE6ZmQ6ZTY6YjI6Y2E6OTY6ODM6Nzk6ZGI6YzU6CisgICAgICAgICAgICAgICAgICAgIGI4OmFhOjViOjdhOjkwOjBiOjc4OjU2OjNlOmM2OmQ3OjlmOjk0OjQ4OjExOgorICAgICAgICAgICAgICAgICAgICBmNTphZAorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBYNTA5djMgQmFzaWMgQ29uc3RyYWludHM6IGNyaXRpY2FsCisgICAgICAgICAgICAgICAgQ0E6VFJVRSwgcGF0aGxlbjo1CisgICAgICAgICAgICBYNTA5djMgS2V5IFVzYWdlOiBjcml0aWNhbAorICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIFNpZ24sIENSTCBTaWduCisgICAgICAgICAgICBYNTA5djMgQ2VydGlmaWNhdGUgUG9saWNpZXM6IAorICAgICAgICAgICAgICAgIFBvbGljeTogMS4yLjg0MC4xMTM4MDcuMTAuMS41LjEKKworICAgICAgICAgICAgWDUwOXYzIFN1YmplY3QgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIDU3OjQ3OjM1OjdCOjM2OjI3OjExOkE4OjA4OkZDOjJGOjQ2OjI1OkVCOjI0OjY5CisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIGM3OjYxOjQ1OmE4OjhhOjcxOmI5OmJlOjM0OmU5OjIxOjdiOjIxOmNkOjU2OjEzOjk4OmQ1OgorICAgICAgICAzMDo2MzplOToxODphYTo0Yjo5MjoxNTpiZjowYjoxZDpiYjplYzo5Mjo2OTpjNToyZTpjMzoKKyAgICAgICAgNjE6OGI6ZTg6MzA6NDU6Y2I6MTA6NDY6YzE6NzM6Mzg6NWM6OGI6MTk6ZDI6MmI6ZjM6NDA6CisgICAgICAgIGViOjdjOjcyOmIzOjJlOjFlOjI3OmUzOjc1Ojk1OjhhOjFjOjliOjJlOmM0Ojk1OjA1Ojg2OgorICAgICAgICA3MjpkMDo1NTpmNDphMTo5Mjo1Mjo3OTo1YzpkYjpmNDpmODpkYzplNTpkNzoxMjpiMTo0MDoKKyAgICAgICAgYzc6M2M6ODY6ZTQ6MzE6NjU6NGE6Y2E6Mzc6YzY6ZGU6NzY6NTc6MTk6Njk6NGM6NDY6Njk6CisgICAgICAgIGZjOjJhOmFkOjE2OjM3OjdhOjkzOmFjOmY3OjIxOjRiOjJkOmZiOmViOmE5OjUwOmNiOmMxOgorICAgICAgICBkMTo0MDowODpkYTowMzo2OTo4NzphNzozNzo1ZTo1NTpjMTpjNTplZDpjNDplMzo4ZTowYzoKKyAgICAgICAgMjY6OTc6OWI6NWM6NTc6NGI6NzI6ZTM6ZjI6MDM6MDU6ZDA6MDI6M2I6MjY6MDM6NDA6OTA6CisgICAgICAgIDllOmJlOjBiOjViOjQ5OjBjOjc4OmYxOmQ1OjRjOjU1OjI5OmUwOmY2OmZkOjRjOjAzOmE5OgorICAgICAgICA1NDowMjozMjpkMTo1Nzo1YTo4NTphYzo0MzplZDo1YjozYjoxNjo1ZjphMDpiZjozNTpkYjoKKyAgICAgICAgNGI6OWU6N2I6ZTg6ZmY6ZTc6MGQ6M2M6M2I6YTg6OWI6NDk6NDE6NDY6ZjU6NzM6NGU6ZmY6CisgICAgICAgIDkyOjY1OjIxOjgzOjEzOjU1OjcxOmViOjQ5OjNjOjdmOjg4OjFhOmMyOjEyOjI4OjI1OmExOgorICAgICAgICA0Njo0Yjo0MTozNzo5Nzo3ZjplYzo4ZTpmMTpkNDphMTo5NjpjMjoyMDpiNjo1ZTphZDphOToKKyAgICAgICAgMWM6MWU6MTE6YTAKKworQmVsU2lnbiBPYmplY3QgUHVibGlzaGluZyBDQQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiA4QTowMjpGODpERjpCODpFMTo4NDo5Rjo1QTpDMjo2MDoyNDo2NTpEMTo3MzpGQgorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURBekNDQW15Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRUUZBRENCdXpFTE1Ba0dBMVVFQmhNQ1FrVXgKK0VUQVBCZ05WQkFjVENFSnlkWE56Wld4ek1STXdFUVlEVlFRS0V3cENaV3hUYVdkdUlFNVdNVGd3TmdZRFZRUUwKK0V5OUNaV3hUYVdkdUlFOWlhbVZqZENCUWRXSnNhWE5vYVc1bklFTmxjblJwWm1sallYUmxJRUYxZEdodmNtbDAKK2VURWxNQ01HQTFVRUF4TWNRbVZzVTJsbmJpQlBZbXBsWTNRZ1VIVmliR2x6YUdsdVp5QkRRVEVqTUNFR0NTcUcKK1NJYjNEUUVKQVJZVWQyVmliV0Z6ZEdWeVFHSmxiSE5wWjI0dVltVXdIaGNOT1Rjd09URTVNakl3TXpBd1doY04KK01EY3dPVEU1TWpJd016QXdXakNCdXpFTE1Ba0dBMVVFQmhNQ1FrVXhFVEFQQmdOVkJBY1RDRUp5ZFhOelpXeHoKK01STXdFUVlEVlFRS0V3cENaV3hUYVdkdUlFNVdNVGd3TmdZRFZRUUxFeTlDWld4VGFXZHVJRTlpYW1WamRDQlEKK2RXSnNhWE5vYVc1bklFTmxjblJwWm1sallYUmxJRUYxZEdodmNtbDBlVEVsTUNNR0ExVUVBeE1jUW1Wc1UybG4KK2JpQlBZbXBsWTNRZ1VIVmliR2x6YUdsdVp5QkRRVEVqTUNFR0NTcUdTSWIzRFFFSkFSWVVkMlZpYldGemRHVnkKK1FHSmxiSE5wWjI0dVltVXdnWjh3RFFZSktvWklodmNOQVFFQkJRQURnWTBBTUlHSkFvR0JBTVF1SDdhLzdvSkEKKzNmbTNMa0hWbmdXeFd0QW1mR0pWQTV2OHkySGVTKy8rNkpuK2g3bUl6NURhRHdrOGR0OFhsN2JMUHlWRi9iUzgKK1dBQytzRnEyRkllUDdtZGtyUjJJZzd0bm4yVmhBRmdJZ0ZDZmdNa3g5aXFRSEMzM1Ntd1E5aU5EWFRnSllJaFgKK0FzMFdiQmo4emZ1U0tuZlFucE9qWFloazBNajRYVlJSQWdNQkFBR2pGVEFUTUJFR0NXQ0dTQUdHK0VJQkFRUUUKK0F3SUFCekFOQmdrcWhraUc5dzBCQVFRRkFBT0JnUUJqZGhkOGx2QlRwVjBCSEZQT0tjSitkYXhNRGFJSWM3UnEKK01mMENCaFNaM0ZRRXBML0lsb2FmTVVNeUpWZjJoZllsdXplK29Ya2p5VmNHSlhGclJVLzQ5QUpBRm9JaXIxVHEKK01pajJEZTZadWtzSVVROXVoaU1oVEMwbGlJSEVMZzd4RXl3NGlwVUNKTU02bFdQa2s0NUl1d2hIY2wrdTVqcGEKK1I5Wnh4cDZhVWc9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiAxICgweDEpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1CRSwgTD1CcnVzc2VscywgTz1CZWxTaWduIE5WLCBPVT1CZWxTaWduIE9iamVjdCBQdWJsaXNoaW5nIENlcnRpZmljYXRlIEF1dGhvcml0eSwgQ049QmVsU2lnbiBPYmplY3QgUHVibGlzaGluZyBDQS9FbWFpbD13ZWJtYXN0ZXJAYmVsc2lnbi5iZQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogU2VwIDE5IDIyOjAzOjAwIDE5OTcgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBTZXAgMTkgMjI6MDM6MDAgMjAwNyBHTVQKKyAgICAgICAgU3ViamVjdDogQz1CRSwgTD1CcnVzc2VscywgTz1CZWxTaWduIE5WLCBPVT1CZWxTaWduIE9iamVjdCBQdWJsaXNoaW5nIENlcnRpZmljYXRlIEF1dGhvcml0eSwgQ049QmVsU2lnbiBPYmplY3QgUHVibGlzaGluZyBDQS9FbWFpbD13ZWJtYXN0ZXJAYmVsc2lnbi5iZQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6YzQ6MmU6MWY6YjY6YmY6ZWU6ODI6NDA6ZGQ6Zjk6Yjc6MmU6NDE6ZDU6CisgICAgICAgICAgICAgICAgICAgIDllOjA1OmIxOjVhOmQwOjI2OjdjOjYyOjU1OjAzOjliOmZjOmNiOjYxOmRlOgorICAgICAgICAgICAgICAgICAgICA0YjplZjpmZTplODo5OTpmZTo4NzpiOTo4ODpjZjo5MDpkYTowZjowOTozYzoKKyAgICAgICAgICAgICAgICAgICAgNzY6ZGY6MTc6OTc6YjY6Y2I6M2Y6MjU6NDU6ZmQ6YjQ6YmM6NTg6MDA6YmU6CisgICAgICAgICAgICAgICAgICAgIGIwOjVhOmI2OjE0Ojg3OjhmOmVlOjY3OjY0OmFkOjFkOjg4OjgzOmJiOjY3OgorICAgICAgICAgICAgICAgICAgICA5Zjo2NTo2MTowMDo1ODowODo4MDo1MDo5Zjo4MDpjOTozMTpmNjoyYTo5MDoKKyAgICAgICAgICAgICAgICAgICAgMWM6MmQ6Zjc6NGE6NmM6MTA6ZjY6MjM6NDM6NWQ6Mzg6MDk6NjA6ODg6NTc6CisgICAgICAgICAgICAgICAgICAgIDAyOmNkOjE2OjZjOjE4OmZjOmNkOmZiOjkyOjJhOjc3OmQwOjllOjkzOmEzOgorICAgICAgICAgICAgICAgICAgICA1ZDo4ODo2NDpkMDpjODpmODo1ZDo1NDo1MQorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBOZXRzY2FwZSBDZXJ0IFR5cGU6IAorICAgICAgICAgICAgICAgIFNTTCBDQSwgUy9NSU1FIENBLCBPYmplY3QgU2lnbmluZyBDQQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDYzOjc2OjE3OjdjOjk2OmYwOjUzOmE1OjVkOjAxOjFjOjUzOmNlOjI5OmMyOjdlOjc1OmFjOgorICAgICAgICA0YzowZDphMjowODo3MzpiNDo2YTozMTpmZDowMjowNjoxNDo5OTpkYzo1NDowNDphNDpiZjoKKyAgICAgICAgYzg6OTY6ODY6OWY6MzE6NDM6MzI6MjU6NTc6ZjY6ODU6ZjY6MjU6YmI6Mzc6YmU6YTE6Nzk6CisgICAgICAgIDIzOmM5OjU3OjA2OjI1OjcxOjZiOjQ1OjRmOmY4OmY0OjAyOjQwOjE2OjgyOjIyOmFmOjU0OgorICAgICAgICBlYTozMjoyODpmNjowZDplZTo5OTpiYTo0YjowODo1MTowZjo2ZTo4NjoyMzoyMTo0YzoyZDoKKyAgICAgICAgMjU6ODg6ODE6YzQ6MmU6MGU6ZjE6MTM6MmM6Mzg6OGE6OTU6MDI6MjQ6YzM6M2E6OTU6NjM6CisgICAgICAgIGU0OjkzOjhlOjQ4OmJiOjA4OjQ3OjcyOjVmOmFlOmU2OjNhOjVhOjQ3OmQ2OjcxOmM2OjllOgorICAgICAgICA5YTo1MgorCitCZWxTaWduIFNlY3VyZSBTZXJ2ZXIgQ0EKKz09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiAzRDo1RTo4MjpDNjpEOTpBRDpEOTo4Qjo5Mzo2QjowQzoxMDpCOTo0OTowQTpCMQorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUM4ekNDQWx5Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRUUZBRENCc3pFTE1Ba0dBMVVFQmhNQ1FrVXgKK0VUQVBCZ05WQkFjVENFSnlkWE56Wld4ek1STXdFUVlEVlFRS0V3cENaV3hUYVdkdUlFNVdNVFF3TWdZRFZRUUwKK0V5dENaV3hUYVdkdUlGTmxZM1Z5WlNCVFpYSjJaWElnUTJWeWRHbG1hV05oZEdVZ1FYVjBhRzl5YVhSNU1TRXcKK0h3WURWUVFERXhoQ1pXeFRhV2R1SUZObFkzVnlaU0JUWlhKMlpYSWdRMEV4SXpBaEJna3Foa2lHOXcwQkNRRVcKK0ZIZGxZbTFoYzNSbGNrQmlaV3h6YVdkdUxtSmxNQjRYRFRrM01EY3hOakl5TURBMU5Gb1hEVEEzTURjeE5qSXkKK01EQTFORm93Z2JNeEN6QUpCZ05WQkFZVEFrSkZNUkV3RHdZRFZRUUhFd2hDY25WemMyVnNjekVUTUJFR0ExVUUKK0NoTUtRbVZzVTJsbmJpQk9WakUwTURJR0ExVUVDeE1yUW1Wc1UybG5iaUJUWldOMWNtVWdVMlZ5ZG1WeUlFTmwKK2NuUnBabWxqWVhSbElFRjFkR2h2Y21sMGVURWhNQjhHQTFVRUF4TVlRbVZzVTJsbmJpQlRaV04xY21VZ1UyVnkKK2RtVnlJRU5CTVNNd0lRWUpLb1pJaHZjTkFRa0JGaFIzWldKdFlYTjBaWEpBWW1Wc2MybG5iaTVpWlRDQm56QU4KK0Jna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBMWdFU2VKTDRCRUoveWNjaWcveDhSM0F3SzBrTFBqWkEKK2tDamFJWE9EVS9MRTBSWkF3RlAvcnFiR0pMTW5iYVd6UFRsM1hhZ0c5dWJwdkdNUlRnWmxjQXFkay9taVFJdC8KK1NvUU9qUmF4MXN3SVpCSU00Q2hMeUtXRWtCZjdFVVl1MXFlRkdNc1lybU9hc0ZnRzlBRFArTVFKR2pVTW9mbnUKK1N2MXQzdjRtcFRzQ0F3RUFBYU1WTUJNd0VRWUpZSVpJQVliNFFnRUJCQVFEQWdDZ01BMEdDU3FHU0liM0RRRUIKK0JBVUFBNEdCQUd3OW1jTUY0aDNLNVMycWFJV0xRREVnWmhObzVsZzZpZENOZGJMRll0aDlnby8zMlRLQmQvWTEKK1c0VXB6bWV5dWJ3ckdYalA4NGY5UnZHVmRiSUpWd013d1hyTmNrZHhnTXA5bmNsbFBFY1JJbjM2Qndzb2VLR1QKKzZBVkZTT0l5TWtvOTZGTWNFTGZIYzR3SFVPSDV5U3RUUWZXRGplVUpPVXFPQTJLcVFHT0wKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjogMSAoMHgxKQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9QkUsIEw9QnJ1c3NlbHMsIE89QmVsU2lnbiBOViwgT1U9QmVsU2lnbiBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRlIEF1dGhvcml0eSwgQ049QmVsU2lnbiBTZWN1cmUgU2VydmVyIENBL0VtYWlsPXdlYm1hc3RlckBiZWxzaWduLmJlCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBKdWwgMTYgMjI6MDA6NTQgMTk5NyBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEp1bCAxNiAyMjowMDo1NCAyMDA3IEdNVAorICAgICAgICBTdWJqZWN0OiBDPUJFLCBMPUJydXNzZWxzLCBPPUJlbFNpZ24gTlYsIE9VPUJlbFNpZ24gU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHksIENOPUJlbFNpZ24gU2VjdXJlIFNlcnZlciBDQS9FbWFpbD13ZWJtYXN0ZXJAYmVsc2lnbi5iZQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6ZDY6MDE6MTI6Nzg6OTI6Zjg6MDQ6NDI6N2Y6Yzk6Yzc6MjI6ODM6ZmM6CisgICAgICAgICAgICAgICAgICAgIDdjOjQ3OjcwOjMwOjJiOjQ5OjBiOjNlOjM2OjQwOjkwOjI4OmRhOjIxOjczOgorICAgICAgICAgICAgICAgICAgICA4Mzo1MzpmMjpjNDpkMToxNjo0MDpjMDo1MzpmZjphZTphNjpjNjoyNDpiMzoKKyAgICAgICAgICAgICAgICAgICAgMjc6NmQ6YTU6YjM6M2Q6Mzk6Nzc6NWQ6YTg6MDY6ZjY6ZTY6ZTk6YmM6NjM6CisgICAgICAgICAgICAgICAgICAgIDExOjRlOjA2OjY1OjcwOjBhOjlkOjkzOmY5OmEyOjQwOjhiOjdmOjRhOjg0OgorICAgICAgICAgICAgICAgICAgICAwZTo4ZDoxNjpiMTpkNjpjYzowODo2NDoxMjowYzplMDoyODo0YjpjODphNToKKyAgICAgICAgICAgICAgICAgICAgODQ6OTA6MTc6ZmI6MTE6NDY6MmU6ZDY6YTc6ODU6MTg6Y2I6MTg6YWU6NjM6CisgICAgICAgICAgICAgICAgICAgIDlhOmIwOjU4OjA2OmY0OjAwOmNmOmY4OmM0OjA5OjFhOjM1OjBjOmExOmY5OgorICAgICAgICAgICAgICAgICAgICBlZTo0YTpmZDo2ZDpkZTpmZToyNjphNTozYgorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBOZXRzY2FwZSBDZXJ0IFR5cGU6IAorICAgICAgICAgICAgICAgIFNTTCBDbGllbnQsIFMvTUlNRQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDZjOjNkOjk5OmMzOjA1OmUyOjFkOmNhOmU1OjJkOmFhOjY4Ojg1OjhiOjQwOjMxOjIwOjY2OgorICAgICAgICAxMzo2ODplNjo1ODozYTo4OTpkMDo4ZDo3NTpiMjpjNTo2MjpkODo3ZDo4Mjo4ZjpmNzpkOToKKyAgICAgICAgMzI6ODE6Nzc6ZjY6MzU6NWI6ODU6Mjk6Y2U6Njc6YjI6Yjk6YmM6MmI6MTk6Nzg6Y2Y6ZjM6CisgICAgICAgIDg3OmZkOjQ2OmYxOjk1Ojc1OmIyOjA5OjU3OjAzOjMwOmMxOjdhOmNkOjcyOjQ3OjcxOjgwOgorICAgICAgICBjYTo3ZDo5ZDpjOTo2NTozYzo0NzoxMToyMjo3ZDpmYTowNzowYjoyODo3ODphMTo5MzplODoKKyAgICAgICAgMDU6NDU6NDg6ZTI6MzI6MzI6NGE6M2Q6ZTg6NTM6MWM6MTA6Yjc6Yzc6NzM6OGM6MDc6NTA6CisgICAgICAgIGUxOmY5OmM5OjJiOjUzOjQxOmY1OjgzOjhkOmU1OjA5OjM5OjRhOjhlOjAzOjYyOmFhOjQwOgorICAgICAgICA2Mzo4YgorCitEZXV0c2NoZSBUZWxla29tIEFHIFJvb3QgQ0EKKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiA3NzpERTowNDo5NDo3NzpEMDowQzo1RjpBNzpCMTpGNDozMDoxODo4NzpGQjo1NQorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUNqakNDQWZlZ0F3SUJBZ0lCQmpBTkJna3Foa2lHOXcwQkFRUUZBREJ0TVFzd0NRWURWUVFHRXdKRVJURWMKK01Cb0dBMVVFQ2hNVFJHVjFkSE5qYUdVZ1ZHVnNaV3R2YlNCQlJ6RWRNQnNHQTFVRUN4TVVWR1ZzWlZObFl5QlUKK2NuVnpkQ0JEWlc1MFpYSXhJVEFmQmdOVkJBTVRHRVJsZFhSelkyaGxJRlJsYkdWcmIyMGdVbTl2ZENCRFFUQWUKK0Z3MDVPREV5TURrd09URXhNREJhRncwd05ERXlNRGt5TXpVNU1EQmFNRzB4Q3pBSkJnTlZCQVlUQWtSRk1Sd3cKK0dnWURWUVFLRXhORVpYVjBjMk5vWlNCVVpXeGxhMjl0SUVGSE1SMHdHd1lEVlFRTEV4UlVaV3hsVTJWaklGUnkKK2RYTjBJRU5sYm5SbGNqRWhNQjhHQTFVRUF4TVlSR1YxZEhOamFHVWdWR1ZzWld0dmJTQlNiMjkwSUVOQk1JR2YKK01BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FEZEJTejVCYk81RXRkcGNmZnFWakFJVnhSRGU3c2EKK25HMHZWMkhYNHZWRWErNDJRWmIyWk03aHdiSzVwQlFFbUZEb2NQaU9OWnA5U2NGaEhWbXUyZ1lZbFgydHp1eXAKK3Z0RVlEMENSZGlxajVmMytpUlgwVi9mZ1ZkcDFyUUQwTE1FMXpMUkRKbFZpUkM0QkpaeUtXL0RCMEFBMWVQNDEKKzNwUkFaSGlEb2N3NWlRSURBUUFCb3o0d1BEQVBCZ05WSFJNRUNEQUdBUUgvQWdFRk1BNEdBMVVkRHdFQi93UUUKK0F3SUJCakFaQmdOVkhRNEVFZ1FRTElkWkg0c1RnTEw1aHAwK0VuNVlsakFOQmdrcWhraUc5dzBCQVFRRkFBT0IKK2dRQVAvbk8xQjRodm9BdUo2c3BRSDVUZWxDc0xKMTVQOVJ5Vkp0cU1sbFN0R1pFM1ExMnJ5WXV6elcrWU9UM3QKKzNUWGpjYmZ0RTVPRDZJYmxLVE1URTd3MWUvMG9MM0JaMWRPMGpTZ1RXVHZJMVhUNVJjSUhZS3E0R0ZUNXBXai8KKzF3WFZqN1lGTVM1QlN2UVFIMkJIR2d1TEdVMlNWeURTNzFBWjZNM1FjTHk4Tmc9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiA2ICgweDYpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1ERSwgTz1EZXV0c2NoZSBUZWxla29tIEFHLCBPVT1UZWxlU2VjIFRydXN0IENlbnRlciwgQ049RGV1dHNjaGUgVGVsZWtvbSBSb290IENBCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBEZWMgIDkgMDk6MTE6MDAgMTk5OCBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IERlYyAgOSAyMzo1OTowMCAyMDA0IEdNVAorICAgICAgICBTdWJqZWN0OiBDPURFLCBPPURldXRzY2hlIFRlbGVrb20gQUcsIE9VPVRlbGVTZWMgVHJ1c3QgQ2VudGVyLCBDTj1EZXV0c2NoZSBUZWxla29tIFJvb3QgQ0EKKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgxMDI0IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgxMDI0IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmRkOjA1OjJjOmY5OjA1OmIzOmI5OjEyOmQ3OjY5OjcxOmY3OmVhOjU2OgorICAgICAgICAgICAgICAgICAgICAzMDowODo1NzoxNDo0Mzo3YjpiYjoxYTo5Yzo2ZDoyZjo1Nzo2MTpkNzplMjoKKyAgICAgICAgICAgICAgICAgICAgZjU6NDQ6NmI6ZWU6MzY6NDE6OTY6ZjY6NjQ6Y2U6ZTE6YzE6YjI6Yjk6YTQ6CisgICAgICAgICAgICAgICAgICAgIDE0OjA0Ojk4OjUwOmU4OjcwOmY4OjhlOjM1OjlhOjdkOjQ5OmMxOjYxOjFkOgorICAgICAgICAgICAgICAgICAgICA1OTphZTpkYTowNjoxODo5NTo3ZDphZDpjZTplYzphOTpiZTpkMToxODowZjoKKyAgICAgICAgICAgICAgICAgICAgNDA6OTE6NzY6MmE6YTM6ZTU6ZmQ6ZmU6ODk6MTU6ZjQ6NTc6Zjc6ZTA6NTU6CisgICAgICAgICAgICAgICAgICAgIGRhOjc1OmFkOjAwOmY0OjJjOmMxOjM1OmNjOmI0OjQzOjI2OjU1OjYyOjQ0OgorICAgICAgICAgICAgICAgICAgICAyZTowMToyNTo5Yzo4YTo1YjpmMDpjMTpkMDowMDozNTo3ODpmZTozNTpkZToKKyAgICAgICAgICAgICAgICAgICAgOTQ6NDA6NjQ6Nzg6ODM6YTE6Y2M6Mzk6ODkKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgICAgIFg1MDl2MyBleHRlbnNpb25zOgorICAgICAgICAgICAgWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzOiAKKyAgICAgICAgICAgICAgICBDQTpUUlVFLCBwYXRobGVuOjUKKyAgICAgICAgICAgIFg1MDl2MyBLZXkgVXNhZ2U6IGNyaXRpY2FsCisgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUgU2lnbiwgQ1JMIFNpZ24KKyAgICAgICAgICAgIFg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICAyQzo4Nzo1OToxRjo4QjoxMzo4MDpCMjpGOTo4Njo5RDozRToxMjo3RTo1ODo5NgorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDBmOmZlOjczOmI1OjA3Ojg4OjZmOmEwOjBiOjg5OmVhOmNhOjUwOjFmOjk0OmRlOjk0OjJiOgorICAgICAgICAwYjoyNzo1ZTo0ZjpmNToxYzo5NToyNjpkYTo4Yzo5Njo1NDphZDoxOTo5MTozNzo0Mzo1ZDoKKyAgICAgICAgYWI6Yzk6OGI6YjM6Y2Q6NmY6OTg6Mzk6M2Q6ZWQ6ZGQ6MzU6ZTM6NzE6Yjc6ZWQ6MTM6OTM6CisgICAgICAgIDgzOmU4Ojg2OmU1OjI5OjMzOjEzOjEzOmJjOjM1OjdiOmZkOjI4OjJmOjcwOjU5OmQ1OmQzOgorICAgICAgICBiNDo4ZDoyODoxMzo1OTozYjpjODpkNTo3NDpmOTo0NTpjMjowNzo2MDphYTpiODoxODo1NDoKKyAgICAgICAgZjk6YTU6Njg6ZmY6ZDc6MDU6ZDU6OGY6YjY6MDU6MzE6MmU6NDE6NGE6ZjQ6MTA6MWY6NjA6CisgICAgICAgIDQ3OjFhOjBiOjhiOjE5OjRkOjkyOjU3OjIwOmQyOmVmOjUwOjE5OmU4OmNkOmQwOjcwOmJjOgorICAgICAgICBiYzozNgorCitEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4gR2xvYmFsIENBIDEKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiAyNTo3QTpCQTo4MzoyRTpCNjpBMjowQjpEQTpGRTpGNTowMjowRjowODpENzpBRAorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURLVENDQXBLZ0F3SUJBZ0lFTm5BVmxqQU5CZ2txaGtpRzl3MEJBUVVGQURCR01Rc3dDUVlEVlFRR0V3SlYKK1V6RWtNQ0lHQTFVRUNoTWJSR2xuYVhSaGJDQlRhV2R1WVhSMWNtVWdWSEoxYzNRZ1EyOHVNUkV3RHdZRFZRUUwKK0V3aEVVMVJEUVNCRk1UQWVGdzA1T0RFeU1UQXhPREV3TWpOYUZ3MHhPREV5TVRBeE9EUXdNak5hTUVZeEN6QUoKK0JnTlZCQVlUQWxWVE1TUXdJZ1lEVlFRS0V4dEVhV2RwZEdGc0lGTnBaMjVoZEhWeVpTQlVjblZ6ZENCRGJ5NHgKK0VUQVBCZ05WQkFzVENFUlRWRU5CSUVVeE1JR2RNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R0xBRENCaHdLQmdRQ2cKK2JJR3B6elFlSk4zK2hpak0zb012K1Y3VVF0TG9kR0JtRTVnR0hLbFJFbWx2TVZXNVNYSUFDSDdUcFdKRU55U1oKK2o5bURTSStaYlpVVHUwTTdMa2xPaURmQnUxaC8vdUc5K0x0aHpmTkh3Sm1tOGZPUjZIaDhBTXRoeVVRbmNXbFYKK1NuNUpUZTJpbzc0Q1RBREtBcWp1QVFJeFpBOVNMUk4wZGphMWVyUXRjUUlCQTZPQ0FTUXdnZ0VnTUJFR0NXQ0cKK1NBR0crRUlCQVFRRUF3SUFCekJvQmdOVkhSOEVZVEJmTUYyZ1c2QlpwRmN3VlRFTE1Ba0dBMVVFQmhNQ1ZWTXgKK0pEQWlCZ05WQkFvVEcwUnBaMmwwWVd3Z1UybG5ibUYwZFhKbElGUnlkWE4wSUVOdkxqRVJNQThHQTFVRUN4TUkKK1JGTlVRMEVnUlRFeERUQUxCZ05WQkFNVEJFTlNUREV3S3dZRFZSMFFCQ1F3SW9BUE1UazVPREV5TVRBeE9ERXcKK01qTmFnUTh5TURFNE1USXhNREU0TVRBeU0xb3dDd1lEVlIwUEJBUURBZ0VHTUI4R0ExVWRJd1FZTUJhQUZHcDUKK2ZwRnBSaGdUQ2dKM3BWbGJZSmdsRHFMNE1CMEdBMVVkRGdRV0JCUnFlWDZSYVVZWUV3b0NkNlZaVzJDWUpRNmkKKytEQU1CZ05WSFJNRUJUQURBUUgvTUJrR0NTcUdTSWIyZlFkQkFBUU1NQW9iQkZZMExqQURBZ1NRTUEwR0NTcUcKK1NJYjNEUUVCQlFVQUE0R0JBQ0lTMkhvZDNJRUd0Z2xsc29mSUgxNjBMK25FSHZJOHdic0VrQkZLZzA1K2s3bE4KK1FzZVNKcUJjTkpvNGN2ajlheFkrSU82Q2l6RXFremFGSTRpS1BBTm8wOGtKRDAzOGJLVGFLSEtURG9tQXNIMysKK2dHOWxiUmd6bDR2Q2E0bnVZRDNJbSs5L0t6SmljNVBMUE9ONzRuWjRSYnloa3dTN2hwODZXME42dzRwbAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiA5MTMzMTUyMjIgKDB4MzY3MDE1OTYpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9VVMsIE89RGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uLCBPVT1EU1RDQSBFMQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogRGVjIDEwIDE4OjEwOjIzIDE5OTggR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBEZWMgMTAgMTg6NDA6MjMgMjAxOCBHTVQKKyAgICAgICAgU3ViamVjdDogQz1VUywgTz1EaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4sIE9VPURTVENBIEUxCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDphMDo2Yzo4MTphOTpjZjozNDoxZToyNDpkZDpmZTo4NjoyODpjYzpkZToKKyAgICAgICAgICAgICAgICAgICAgODM6MmY6Zjk6NWU6ZDQ6NDI6ZDI6ZTg6NzQ6NjA6NjY6MTM6OTg6MDY6MWM6CisgICAgICAgICAgICAgICAgICAgIGE5OjUxOjEyOjY5OjZmOjMxOjU1OmI5OjQ5OjcyOjAwOjA4OjdlOmQzOmE1OgorICAgICAgICAgICAgICAgICAgICA2Mjo0NDozNzoyNDo5OTo4ZjpkOTo4Mzo0ODo4Zjo5OTo2ZDo5NToxMzpiYjoKKyAgICAgICAgICAgICAgICAgICAgNDM6M2I6MmU6NDk6NGU6ODg6Mzc6YzE6YmI6NTg6N2Y6ZmU6ZTE6YmQ6Zjg6CisgICAgICAgICAgICAgICAgICAgIGJiOjYxOmNkOmYzOjQ3OmMwOjk5OmE2OmYxOmYzOjkxOmU4Ojc4OjdjOjAwOgorICAgICAgICAgICAgICAgICAgICBjYjo2MTpjOTo0NDoyNzo3MTo2OTo1NTo0YTo3ZTo0OTo0ZDplZDphMjphMzoKKyAgICAgICAgICAgICAgICAgICAgYmU6MDI6NGM6MDA6Y2E6MDI6YTg6ZWU6MDE6MDI6MzE6NjQ6MGY6NTI6MmQ6CisgICAgICAgICAgICAgICAgICAgIDEzOjc0Ojc2OjM2OmI1OjdhOmI0OjJkOjcxCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDMgKDB4MykKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBOZXRzY2FwZSBDZXJ0IFR5cGU6IAorICAgICAgICAgICAgICAgIFNTTCBDQSwgUy9NSU1FIENBLCBPYmplY3QgU2lnbmluZyBDQQorICAgICAgICAgICAgWDUwOXYzIENSTCBEaXN0cmlidXRpb24gUG9pbnRzOiAKKyAgICAgICAgICAgICAgICBEaXJOYW1lOi9DPVVTL089RGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uL09VPURTVENBIEUxL0NOPUNSTDEKKworICAgICAgICAgICAgWDUwOXYzIFByaXZhdGUgS2V5IFVzYWdlIFBlcmlvZDogCisgICAgICAgICAgICAgICAgTm90IEJlZm9yZTogRGVjIDEwIDE4OjEwOjIzIDE5OTggR01ULCBOb3QgQWZ0ZXI6IERlYyAxMCAxODoxMDoyMyAyMDE4IEdNVAorICAgICAgICAgICAgWDUwOXYzIEtleSBVc2FnZTogCisgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUgU2lnbiwgQ1JMIFNpZ24KKyAgICAgICAgICAgIFg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIGtleWlkOjZBOjc5OjdFOjkxOjY5OjQ2OjE4OjEzOjBBOjAyOjc3OkE1OjU5OjVCOjYwOjk4OjI1OjBFOkEyOkY4CisKKyAgICAgICAgICAgIFg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICA2QTo3OTo3RTo5MTo2OTo0NjoxODoxMzowQTowMjo3NzpBNTo1OTo1Qjo2MDo5ODoyNTowRTpBMjpGOAorICAgICAgICAgICAgWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzOiAKKyAgICAgICAgICAgICAgICBDQTpUUlVFCisgICAgICAgICAgICAxLjIuODQwLjExMzUzMy43LjY1LjA6IAorICAgICAgICAgICAgICAgIDAKKy4uVjQuMC4uLi4KKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgMjI6MTI6ZDg6N2E6MWQ6ZGM6ODE6MDY6YjY6MDk6NjU6YjI6ODc6Yzg6MWY6NWU6YjQ6MmY6CisgICAgICAgIGU5OmM0OjFlOmYyOjNjOmMxOmJiOjA0OjkwOjExOjRhOjgzOjRlOjdlOjkzOmI5OjRkOjQyOgorICAgICAgICBjNzo5MjoyNjphMDo1YzozNDo5YTozODo3MjpmODpmZDo2YjoxNjozZToyMDplZTo4Mjo4YjoKKyAgICAgICAgMzE6MmE6OTM6MzY6ODU6MjM6ODg6OGE6M2M6MDM6Njg6ZDM6Yzk6MDk6MGY6NGQ6ZmM6NmM6CisgICAgICAgIGE0OmRhOjI4OjcyOjkzOjBlOjg5OjgwOmIwOjdkOmZlOjgwOjZmOjY1OjZkOjE4OjMzOjk3OgorICAgICAgICA4YjpjMjo2Yjo4OTplZTo2MDozZDpjODo5YjplZjo3ZjoyYjozMjo2Mjo3Mzo5MzpjYjozYzoKKyAgICAgICAgZTM6N2I6ZTI6NzY6Nzg6NDU6YmM6YTE6OTM6MDQ6YmI6ODY6OWY6M2E6NWI6NDM6N2E6YzM6CisgICAgICAgIDhhOjY1CisKK0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLiBHbG9iYWwgQ0EgMgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IDZDOkM5OkE3OjZFOjQ3OkYxOjBDOkUzOjUzOjNCOjc4OjRDOjREOkMyOjZBOkM1CitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRDJEQ0NBc0FDRVFEUUhrQ0xBQUFDZkFBQUFBSUFBQUFCTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUdwTVFzdworQ1FZRFZRUUdFd0oxY3pFTk1Bc0dBMVVFQ0JNRVZYUmhhREVYTUJVR0ExVUVCeE1PVTJGc2RDQk1ZV3RsSUVOcAorZEhreEpEQWlCZ05WQkFvVEcwUnBaMmwwWVd3Z1UybG5ibUYwZFhKbElGUnlkWE4wSUVOdkxqRVJNQThHQTFVRQorQ3hNSVJGTlVRMEVnV0RFeEZqQVVCZ05WQkFNVERVUlRWQ0JTYjI5MFEwRWdXREV4SVRBZkJna3Foa2lHOXcwQgorQ1FFV0VtTmhRR1JwWjNOcFozUnlkWE4wTG1OdmJUQWVGdzA1T0RFeU1ERXhPREU0TlRWYUZ3MHdPREV4TWpneAorT0RFNE5UVmFNSUdwTVFzd0NRWURWUVFHRXdKMWN6RU5NQXNHQTFVRUNCTUVWWFJoYURFWE1CVUdBMVVFQnhNTworVTJGc2RDQk1ZV3RsSUVOcGRIa3hKREFpQmdOVkJBb1RHMFJwWjJsMFlXd2dVMmxuYm1GMGRYSmxJRlJ5ZFhOMAorSUVOdkxqRVJNQThHQTFVRUN4TUlSRk5VUTBFZ1dERXhGakFVQmdOVkJBTVREVVJUVkNCU2IyOTBRMEVnV0RFeAorSVRBZkJna3Foa2lHOXcwQkNRRVdFbU5oUUdScFozTnBaM1J5ZFhOMExtTnZiVENDQVNJd0RRWUpLb1pJaHZjTgorQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU5MR0pyYm5wVDNCeEdqVlVHOVR4VzlKRXdtNHJ5eElqUlJxb3hkZgorV3ZuVExuVXYyQ2hpMFpNdi9FM1VxNGZsQ01lWjU1SS9kYjNySmJRVndac1pQZEpFamRkMElHMDNBbzlwazF1SworeEJtZDlMSU8vQlpzdWJFRmtvUFJoU3hnbEQ1RlZhRFpxd2doNW1Eb08zVHltVkJSYU5BRExiR0F2cVBZVXJCRQorelVOS2NJNVloWlhoVGl6V0xVRnYxb1RueUpoRXlrZmJMQ1NsYVNiUGE3Z25Zc1AweVhxU0krMFRaNEt1UlM1RgorNVg1eVA0V2RsR0lRNWp5Um9hMTNBT0FWN1BPRWdISjZqbTVnbDhja1dSQTBnMXZocGFScHRsYzFISGhaeHRNdgorT25ObjdwVEtCQk1GWWdad0k3UDBmTzVGMldRTFcwbXFwRVBPSnNSRUVteTQzWGtDQXdFQUFUQU5CZ2txaGtpRworOXcwQkFRVUZBQU9DQVFFQW9qZXlQMm43MTRaNVZFa3hsVE1yODlFSkZFbGlZSWFsc0JIaVVNSWRCbGMrTGVnegorWkw2YnFxMWZHMDNVbVpXaWk1ckpZbksxYWVyWldLczE3UldpUTlhMnZBZDVaV1J6ZmRkNXludlZXbEhHNFZNRQorbG8wNHo2TVhyRGx4YXdIRGkxTThZK251ZWNEa3ZwSXlaSHF6SDVlVVlyM3FzaUFWbGZ1WDhuZ3ZZelpBT09ORworRHgzZHJKWEs1MHVRZTdGTHFkVEY2NXJhcXRXamxCUkdqUzBmOHpyV2t6cjJQbm44Nk9hd2RlM3VQY2x3eDEycQorZ1V0R0pSekhiQlhqbFU0UHFqSTNsQW9YSkpJVGhGalNZMjhyOStaYllnc1RGN0FOVWt6Ky9tOWM0cEZ1SGYyaworWXRkbytvNTZUOUlJMnBQYzhKSVJldERjY3BNTWM1TmloV2pROUE9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMSAoMHgwKQorICAgICAgICBTZXJpYWwgTnVtYmVyOgorICAgICAgICAgICAgZDA6MWU6NDA6OGI6MDA6MDA6MDI6N2M6MDA6MDA6MDA6MDI6MDA6MDA6MDA6MDEKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz11cywgU1Q9VXRhaCwgTD1TYWx0IExha2UgQ2l0eSwgTz1EaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4sIE9VPURTVENBIFgxLCBDTj1EU1QgUm9vdENBIFgxL0VtYWlsPWNhQGRpZ3NpZ3RydXN0LmNvbQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogRGVjICAxIDE4OjE4OjU1IDE5OTggR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBOb3YgMjggMTg6MTg6NTUgMjAwOCBHTVQKKyAgICAgICAgU3ViamVjdDogQz11cywgU1Q9VXRhaCwgTD1TYWx0IExha2UgQ2l0eSwgTz1EaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4sIE9VPURTVENBIFgxLCBDTj1EU1QgUm9vdENBIFgxL0VtYWlsPWNhQGRpZ3NpZ3RydXN0LmNvbQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDIwNDggYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDIwNDggYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6ZDI6YzY6MjY6YjY6ZTc6YTU6M2Q6YzE6YzQ6Njg6ZDU6NTA6NmY6NTM6CisgICAgICAgICAgICAgICAgICAgIGM1OjZmOjQ5OjEzOjA5OmI4OmFmOjJjOjQ4OjhkOjE0OjZhOmEzOjE3OjVmOgorICAgICAgICAgICAgICAgICAgICA1YTpmOTpkMzoyZTo3NToyZjpkODoyODo2MjpkMTo5MzoyZjpmYzo0ZDpkNDoKKyAgICAgICAgICAgICAgICAgICAgYWI6ODc6ZTU6MDg6Yzc6OTk6ZTc6OTI6M2Y6NzU6YmQ6ZWI6MjU6YjQ6MTU6CisgICAgICAgICAgICAgICAgICAgIGMxOjliOjE5OjNkOmQyOjQ0OjhkOmQ3Ojc0OjIwOjZkOjM3OjAyOjhmOjY5OgorICAgICAgICAgICAgICAgICAgICA5Mzo1Yjo4YTpjNDoxOTo5ZDpmNDpiMjowZTpmYzoxNjo2YzpiOTpiMTowNToKKyAgICAgICAgICAgICAgICAgICAgOTI6ODM6ZDE6ODU6MmM6NjA6OTQ6M2U6NDU6NTU6YTA6ZDk6YWI6MDg6MjE6CisgICAgICAgICAgICAgICAgICAgIGU2OjYwOmU4OjNiOjc0OmYyOjk5OjUwOjUxOjY4OmQwOjAzOjJkOmIxOjgwOgorICAgICAgICAgICAgICAgICAgICBiZTphMzpkODo1MjpiMDo0NDpjZDo0Mzo0YTo3MDo4ZTo1ODo4NTo5NTplMToKKyAgICAgICAgICAgICAgICAgICAgNGU6MmM6ZDY6MmQ6NDE6NmY6ZDY6ODQ6ZTc6Yzg6OTg6NDQ6Y2E6NDc6ZGI6CisgICAgICAgICAgICAgICAgICAgIDJjOjI0OmE1OjY5OjI2OmNmOjZiOmI4OjI3OjYyOmMzOmY0OmM5OjdhOjkyOgorICAgICAgICAgICAgICAgICAgICAyMzplZDoxMzo2Nzo4MjphZTo0NToyZTo0NTplNTo3ZTo3MjozZjo4NTo5ZDoKKyAgICAgICAgICAgICAgICAgICAgOTQ6NjI6MTA6ZTY6M2M6OTE6YTE6YWQ6Nzc6MDA6ZTA6MTU6ZWM6ZjM6ODQ6CisgICAgICAgICAgICAgICAgICAgIDgwOjcyOjdhOjhlOjZlOjYwOjk3OmM3OjI0OjU5OjEwOjM0OjgzOjViOmUxOgorICAgICAgICAgICAgICAgICAgICBhNTphNDo2OTpiNjo1NzozNToxYzo3ODo1OTpjNjpkMzoyZjozYTo3Mzo2NzoKKyAgICAgICAgICAgICAgICAgICAgZWU6OTQ6Y2E6MDQ6MTM6MDU6NjI6MDY6NzA6MjM6YjM6ZjQ6N2M6ZWU6NDU6CisgICAgICAgICAgICAgICAgICAgIGQ5OjY0OjBiOjViOjQ5OmFhOmE0OjQzOmNlOjI2OmM0OjQ0OjEyOjZjOmI4OgorICAgICAgICAgICAgICAgICAgICBkZDo3OQorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgYTI6Mzc6YjI6M2Y6Njk6ZmI6ZDc6ODY6Nzk6NTQ6NDk6MzE6OTU6MzM6MmI6ZjM6ZDE6MDk6CisgICAgICAgIDE0OjQ5OjYyOjYwOjg2OmE1OmIwOjExOmUyOjUwOmMyOjFkOjA2OjU3OjNlOjJkOmU4OjMzOgorICAgICAgICA2NDpiZTo5YjphYTphZDo1ZjoxYjo0ZDpkNDo5OTo5NTphMjo4Yjo5YTpjOTo2Mjo3MjpiNToKKyAgICAgICAgNjk6ZWE6ZDk6NTg6YWI6MzU6ZWQ6MTU6YTI6NDM6ZDY6YjY6YmM6MDc6Nzk6NjU6NjQ6NzM6CisgICAgICAgIDdkOmQ3Ojc5OmNhOjdiOmQ1OjVhOjUxOmM2OmUxOjUzOjA0Ojk2OjhkOjM4OmNmOmEzOjE3OgorICAgICAgICBhYzozOTo3MTo2YjowMTpjMzo4Yjo1MzozYzo2MzplOTplZTo3OTpjMDplNDpiZTo5MjozMjoKKyAgICAgICAgNjQ6N2E6YjM6MWY6OTc6OTQ6NjI6YmQ6ZWE6YjI6MjA6MTU6OTU6ZmI6OTc6ZjI6Nzg6MmY6CisgICAgICAgIDYzOjM2OjQwOjM4OmUzOjQ2OjBmOjFkOmRkOmFjOjk1OmNhOmU3OjRiOjkwOjdiOmIxOjRiOgorICAgICAgICBhOTpkNDpjNTplYjo5YTpkYTphYTpkNTphMzo5NDoxNDo0Njo4ZDoyZDoxZjpmMzozYTpkNjoKKyAgICAgICAgOTM6M2E6ZjY6M2U6Nzk6ZmM6ZTg6ZTY6YjA6NzU6ZWQ6ZWU6M2Q6Yzk6NzA6Yzc6NWQ6YWE6CisgICAgICAgIDgxOjRiOjQ2OjI1OjFjOmM3OjZjOjE1OmUzOjk1OjRlOjBmOmFhOjMyOjM3Ojk0OjBhOjE3OgorICAgICAgICAyNDo5MjoxMzo4NDo1ODpkMjo2Mzo2ZjoyYjpmNzplNjo1Yjo2MjowYjoxMzoxNzpiMDowZDoKKyAgICAgICAgNTI6NGM6ZmU6ZmU6NmY6NWM6ZTI6OTE6NmU6MWQ6ZmQ6YTQ6NjI6ZDc6Njg6ZmE6OGU6N2E6CisgICAgICAgIDRmOmQyOjA4OmRhOjkzOmRjOmYwOjkyOjExOjdhOmQwOmRjOjcyOjkzOjBjOjczOjkzOjYyOgorICAgICAgICA4NTo2ODpkMDpmNAorCitEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4gR2xvYmFsIENBIDMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiA5MzpDMjo4RToxMTo3QjpENDpGMzowMzoxOTpCRDoyODo3NToxMzo0QTo0NTo0QQorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURLVENDQXBLZ0F3SUJBZ0lFTm03VHpqQU5CZ2txaGtpRzl3MEJBUVVGQURCR01Rc3dDUVlEVlFRR0V3SlYKK1V6RWtNQ0lHQTFVRUNoTWJSR2xuYVhSaGJDQlRhV2R1WVhSMWNtVWdWSEoxYzNRZ1EyOHVNUkV3RHdZRFZRUUwKK0V3aEVVMVJEUVNCRk1qQWVGdzA1T0RFeU1Ea3hPVEUzTWpaYUZ3MHhPREV5TURreE9UUTNNalphTUVZeEN6QUoKK0JnTlZCQVlUQWxWVE1TUXdJZ1lEVlFRS0V4dEVhV2RwZEdGc0lGTnBaMjVoZEhWeVpTQlVjblZ6ZENCRGJ5NHgKK0VUQVBCZ05WQkFzVENFUlRWRU5CSUVVeU1JR2RNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R0xBRENCaHdLQmdRQy8KK2s0OFhrdTh6RXhqckVIOU9Gci8vQm84cWhieGUrU1NtSklpMkE3ZkJ3MThEVzlGdnJuNUM2bVlqdUdPRFZ2c28KK0xlRTRpN1R1cUFIaHpoeTJpQ29pUm9YN242ZHdxVWNVUDg3ZVpmQ29jZmRQSm15TXZNYTE3OTVKSi85SUtuM28KK1RRUE14N0pTeGhjeEV6dTFUZHZJeFBiRER5UXEyZ3lkNTVGYmdNMlVuUUlCQTZPQ0FTUXdnZ0VnTUJFR0NXQ0cKK1NBR0crRUlCQVFRRUF3SUFCekJvQmdOVkhSOEVZVEJmTUYyZ1c2QlpwRmN3VlRFTE1Ba0dBMVVFQmhNQ1ZWTXgKK0pEQWlCZ05WQkFvVEcwUnBaMmwwWVd3Z1UybG5ibUYwZFhKbElGUnlkWE4wSUVOdkxqRVJNQThHQTFVRUN4TUkKK1JGTlVRMEVnUlRJeERUQUxCZ05WQkFNVEJFTlNUREV3S3dZRFZSMFFCQ1F3SW9BUE1UazVPREV5TURreE9URTMKK01qWmFnUTh5TURFNE1USXdPVEU1TVRjeU5sb3dDd1lEVlIwUEJBUURBZ0VHTUI4R0ExVWRJd1FZTUJhQUZCNkMKK1RTaGxnRHpKUVc2c05TNWF5OTd1K0RsYk1CMEdBMVVkRGdRV0JCUWVnazBvWllBOHlVRnVyRFV1V3N2ZTd2ZzUKK1d6QU1CZ05WSFJNRUJUQURBUUgvTUJrR0NTcUdTSWIyZlFkQkFBUU1NQW9iQkZZMExqQURBZ1NRTUEwR0NTcUcKK1NJYjNEUUVCQlFVQUE0R0JBRWVOZzYxaTh0dXdua1VpQmJtaTFnTU9PSExubnZ4NzVwTzJtcVdpbE1nMEhaSFIKK3hkZjBDaVVQUFhpQm5nK3haOFNRVEdQZFhxZml1cC8xOTAybE1YdWNLUzFNL21RKzdMWlQvdXFiN1lMYmRIVkwKK0IzbHVIdGdaZzNQZTlUN1F0ZDduUzJoOVF5NHFJT0Yrb0hoRW5najFtUG5IZnhzYjFnWWdBbGlodzZJRAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiA5MTMyMzI4NDYgKDB4MzY2ZWQzY2UpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9VVMsIE89RGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uLCBPVT1EU1RDQSBFMgorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogRGVjICA5IDE5OjE3OjI2IDE5OTggR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBEZWMgIDkgMTk6NDc6MjYgMjAxOCBHTVQKKyAgICAgICAgU3ViamVjdDogQz1VUywgTz1EaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4sIE9VPURTVENBIEUyCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpiZjo5Mzo4ZjoxNzo5MjplZjozMzoxMzoxODplYjoxMDo3Zjo0ZToxNjoKKyAgICAgICAgICAgICAgICAgICAgYmY6ZmY6MDY6OGY6MmE6ODU6YmM6NWU6Zjk6MjQ6YTY6MjQ6ODg6YjY6MDM6CisgICAgICAgICAgICAgICAgICAgIGI3OmMxOmMzOjVmOjAzOjViOmQxOjZmOmFlOjdlOjQyOmVhOjY2OjIzOmI4OgorICAgICAgICAgICAgICAgICAgICA2Mzo4Mzo1NjpmYjoyODoyZDplMTozODo4YjpiNDplZTphODowMTplMTpjZToKKyAgICAgICAgICAgICAgICAgICAgMWM6YjY6ODg6MmE6MjI6NDY6ODU6ZmI6OWY6YTc6NzA6YTk6NDc6MTQ6M2Y6CisgICAgICAgICAgICAgICAgICAgIGNlOmRlOjY1OmYwOmE4OjcxOmY3OjRmOjI2OjZjOjhjOmJjOmM2OmI1OmVmOgorICAgICAgICAgICAgICAgICAgICBkZTo0OToyNzpmZjo0ODoyYTo3ZDplODo0ZDowMzpjYzpjNzpiMjo1MjpjNjoKKyAgICAgICAgICAgICAgICAgICAgMTc6MzE6MTM6M2I6YjU6NGQ6ZGI6Yzg6YzQ6ZjY6YzM6MGY6MjQ6MmE6ZGE6CisgICAgICAgICAgICAgICAgICAgIDBjOjlkOmU3OjkxOjViOjgwOmNkOjk0OjlkCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDMgKDB4MykKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBOZXRzY2FwZSBDZXJ0IFR5cGU6IAorICAgICAgICAgICAgICAgIFNTTCBDQSwgUy9NSU1FIENBLCBPYmplY3QgU2lnbmluZyBDQQorICAgICAgICAgICAgWDUwOXYzIENSTCBEaXN0cmlidXRpb24gUG9pbnRzOiAKKyAgICAgICAgICAgICAgICBEaXJOYW1lOi9DPVVTL089RGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uL09VPURTVENBIEUyL0NOPUNSTDEKKworICAgICAgICAgICAgWDUwOXYzIFByaXZhdGUgS2V5IFVzYWdlIFBlcmlvZDogCisgICAgICAgICAgICAgICAgTm90IEJlZm9yZTogRGVjICA5IDE5OjE3OjI2IDE5OTggR01ULCBOb3QgQWZ0ZXI6IERlYyAgOSAxOToxNzoyNiAyMDE4IEdNVAorICAgICAgICAgICAgWDUwOXYzIEtleSBVc2FnZTogCisgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUgU2lnbiwgQ1JMIFNpZ24KKyAgICAgICAgICAgIFg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIGtleWlkOjFFOjgyOjREOjI4OjY1OjgwOjNDOkM5OjQxOjZFOkFDOjM1OjJFOjVBOkNCOkRFOkVFOkY4OjM5OjVCCisKKyAgICAgICAgICAgIFg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICAxRTo4Mjo0RDoyODo2NTo4MDozQzpDOTo0MTo2RTpBQzozNToyRTo1QTpDQjpERTpFRTpGODozOTo1QgorICAgICAgICAgICAgWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzOiAKKyAgICAgICAgICAgICAgICBDQTpUUlVFCisgICAgICAgICAgICAxLjIuODQwLjExMzUzMy43LjY1LjA6IAorICAgICAgICAgICAgICAgIDAKKy4uVjQuMC4uLi4KKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgNDc6OGQ6ODM6YWQ6NjI6ZjI6ZGI6YjA6OWU6NDU6MjI6MDU6Yjk6YTI6ZDY6MDM6MGU6Mzg6CisgICAgICAgIDcyOmU3OjllOmZjOjdiOmU2OjkzOmI2OjlhOmE1OmEyOjk0OmM4OjM0OjFkOjkxOmQxOmM1OgorICAgICAgICBkNzpmNDowYToyNTowZjozZDo3ODo4MTo5ZTowZjpiMTo2NzpjNDo5MDo0Yzo2MzpkZDo1ZToKKyAgICAgICAgYTc6ZTI6YmE6OWY6ZjU6Zjc6NGQ6YTU6MzE6N2I6OWM6Mjk6MmQ6NGM6ZmU6NjQ6M2U6ZWM6CisgICAgICAgIGI2OjUzOmZlOmVhOjliOmVkOjgyOmRiOjc0Ojc1OjRiOjA3Ojc5OjZlOjFlOmQ4OjE5OjgzOgorICAgICAgICA3MzpkZTpmNTozZTpkMDpiNTpkZTplNzo0Yjo2ODo3ZDo0MzoyZToyYToyMDplMTo3ZTphMDoKKyAgICAgICAgNzg6NDQ6OWU6MDg6ZjU6OTg6Zjk6Yzc6N2Y6MWI6MWI6ZDY6MDY6MjA6MDI6NTg6YTE6YzM6CisgICAgICAgIGEyOjAzCisKK0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLiBHbG9iYWwgQ0EgNAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IENEOjNCOjNEOjYyOjVCOjA5OkI4OjA5OjM2Ojg3OjlFOjEyOjJGOjcxOjY0OkJBCitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRDJEQ0NBc0FDRVFEUUhrQ0xBQUIzYlFBQUFBRUFBQUFFTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUdwTVFzdworQ1FZRFZRUUdFd0oxY3pFTk1Bc0dBMVVFQ0JNRVZYUmhhREVYTUJVR0ExVUVCeE1PVTJGc2RDQk1ZV3RsSUVOcAorZEhreEpEQWlCZ05WQkFvVEcwUnBaMmwwWVd3Z1UybG5ibUYwZFhKbElGUnlkWE4wSUVOdkxqRVJNQThHQTFVRQorQ3hNSVJGTlVRMEVnV0RJeEZqQVVCZ05WQkFNVERVUlRWQ0JTYjI5MFEwRWdXREl4SVRBZkJna3Foa2lHOXcwQgorQ1FFV0VtTmhRR1JwWjNOcFozUnlkWE4wTG1OdmJUQWVGdzA1T0RFeE16QXlNalEyTVRaYUZ3MHdPREV4TWpjeQorTWpRMk1UWmFNSUdwTVFzd0NRWURWUVFHRXdKMWN6RU5NQXNHQTFVRUNCTUVWWFJoYURFWE1CVUdBMVVFQnhNTworVTJGc2RDQk1ZV3RsSUVOcGRIa3hKREFpQmdOVkJBb1RHMFJwWjJsMFlXd2dVMmxuYm1GMGRYSmxJRlJ5ZFhOMAorSUVOdkxqRVJNQThHQTFVRUN4TUlSRk5VUTBFZ1dESXhGakFVQmdOVkJBTVREVVJUVkNCU2IyOTBRMEVnV0RJeAorSVRBZkJna3Foa2lHOXcwQkNRRVdFbU5oUUdScFozTnBaM1J5ZFhOMExtTnZiVENDQVNJd0RRWUpLb1pJaHZjTgorQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU54MThJekFkWmFhd0dJZkp2ZkU0WnJxNEZaelc1bk5BVVNvQ0xiVgorcDlvYUJCZzVra3A0bzRIQzlYZDZVTFJ3LzVxcnhzZktib05QUXBqN0pndmEzRzNXcVpsVlVtZnBLQU9TM09XdworQlpvUEZmbHJXWEpXOHZvNS9LcG83ZzhmRUlNdi9KMzZGNWJkZ3VQbVJYM0FTNEJFSCswczRJVDlrVnlTVkdrbAorNVdKcDNPWHVBRks5TXd1dGRRS0ZwMlJRTGNVWkdUREFKdHZKMC8wdW1hMVp0UXROMUVHdWhVaERXZHkzcU9LaQorM3NPUDE3aWhZcVpvVUZMa3p6R25sSVhhbjBZeUYxYmw4dXRtUFJML1E5dVk3M2ZQeTRHTk5MSEdVRW9tMGVRKworUVZDdmJLNGlOQzdWYTI2RHVubTRkbVZJMmdrcFpHTWl1ZnRIZG9XTWhrVExDZHNDQXdFQUFUQU5CZ2txaGtpRworOXcwQkFRVUZBQU9DQVFFQXRUWU9YZUZoS0ZvUlpjQS9nd041VGI0b3Bnc0hBbEtGemZpUjBCQnN0V29nV3h5UQorMlRBOHhraWVpbDVrK2FGeGQrOEVKeDhINitRbTkzTjB5VVFZR21iVDRFT3ZrVHZSeXl6WWRGUTZIRTNLMUdqTgorSTN3ZEVKNUY2ZllBYnFiTkdmOVBMQ21QVjAzRWQ1Sys0RXdKKzExRWhtWWhxTGt5b2xiVjZZeURmRmsveFBFTAorNTUzc25yMmNHQTQrd2psNUtMY0REUWpMeHVmWkFUZFFFT3pNWVJaQTFLOHhkSHY4UHpHbjBFZHpNemtiekU1cQorMTBtREVRYis2NEpZTXpKTThGYXNIcHd2VnBwN3dVb2NwZjFWTnM3OGxrMzBzUERzdDJ5QzdTOHhtVUpNcWJJTgordUJWZDhkKzZ5YlZLMUdTWXN5YXBNTWo5cHV5cmxpR3RmOEo0dGc9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMSAoMHgwKQorICAgICAgICBTZXJpYWwgTnVtYmVyOgorICAgICAgICAgICAgZDA6MWU6NDA6OGI6MDA6MDA6Nzc6NmQ6MDA6MDA6MDA6MDE6MDA6MDA6MDA6MDQKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz11cywgU1Q9VXRhaCwgTD1TYWx0IExha2UgQ2l0eSwgTz1EaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4sIE9VPURTVENBIFgyLCBDTj1EU1QgUm9vdENBIFgyL0VtYWlsPWNhQGRpZ3NpZ3RydXN0LmNvbQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogTm92IDMwIDIyOjQ2OjE2IDE5OTggR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBOb3YgMjcgMjI6NDY6MTYgMjAwOCBHTVQKKyAgICAgICAgU3ViamVjdDogQz11cywgU1Q9VXRhaCwgTD1TYWx0IExha2UgQ2l0eSwgTz1EaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4sIE9VPURTVENBIFgyLCBDTj1EU1QgUm9vdENBIFgyL0VtYWlsPWNhQGRpZ3NpZ3RydXN0LmNvbQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDIwNDggYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDIwNDggYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6ZGM6NzU6ZjA6OGM6YzA6NzU6OTY6OWE6YzA6NjI6MWY6MjY6Zjc6YzQ6CisgICAgICAgICAgICAgICAgICAgIGUxOjlhOmVhOmUwOjU2OjczOjViOjk5OmNkOjAxOjQ0OmE4OjA4OmI2OmQ1OgorICAgICAgICAgICAgICAgICAgICBhNzpkYToxYTowNDoxODozOTo5Mjo0YTo3ODphMzo4MTpjMjpmNTo3Nzo3YToKKyAgICAgICAgICAgICAgICAgICAgNTA6YjQ6NzA6ZmY6OWE6YWI6YzY6Yzc6Y2E6NmU6ODM6NGY6NDI6OTg6ZmI6CisgICAgICAgICAgICAgICAgICAgIDI2OjBiOmRhOmRjOjZkOmQ2OmE5Ojk5OjU1OjUyOjY3OmU5OjI4OjAzOjkyOgorICAgICAgICAgICAgICAgICAgICBkYzplNTpiMDowNTo5YTowZjoxNTpmOTo2Yjo1OTo3Mjo1NjpmMjpmYTozOToKKyAgICAgICAgICAgICAgICAgICAgZmM6YWE6Njg6ZWU6MGY6MWY6MTA6ODM6MmY6ZmM6OWQ6ZmE6MTc6OTY6ZGQ6CisgICAgICAgICAgICAgICAgICAgIDgyOmUzOmU2OjQ1OjdkOmMwOjRiOjgwOjQ0OjFmOmVkOjJjOmUwOjg0OmZkOgorICAgICAgICAgICAgICAgICAgICA5MTo1Yzo5Mjo1NDo2OToyNTplNTo2Mjo2OTpkYzplNTplZTowMDo1MjpiZDoKKyAgICAgICAgICAgICAgICAgICAgMzM6MGI6YWQ6NzU6MDI6ODU6YTc6NjQ6NTA6MmQ6YzU6MTk6MTk6MzA6YzA6CisgICAgICAgICAgICAgICAgICAgIDI2OmRiOmM5OmQzOmZkOjJlOjk5OmFkOjU5OmI1OjBiOjRkOmQ0OjQxOmFlOgorICAgICAgICAgICAgICAgICAgICA4NTo0ODo0Mzo1OTpkYzpiNzphODplMjphMjpkZTpjMzo4ZjpkNzpiODphMToKKyAgICAgICAgICAgICAgICAgICAgNjI6YTY6Njg6NTA6NTI6ZTQ6Y2Y6MzE6YTc6OTQ6ODU6ZGE6OWY6NDY6MzI6CisgICAgICAgICAgICAgICAgICAgIDE3OjU2OmU1OmYyOmViOjY2OjNkOjEyOmZmOjQzOmRiOjk4OmVmOjc3OmNmOgorICAgICAgICAgICAgICAgICAgICBjYjo4MTo4ZDozNDpiMTpjNjo1MDo0YToyNjpkMTplNDozZTo0MTo1MDphZjoKKyAgICAgICAgICAgICAgICAgICAgNmM6YWU6MjI6MzQ6MmU6ZDU6NmI6NmU6ODM6YmE6Nzk6Yjg6NzY6NjU6NDg6CisgICAgICAgICAgICAgICAgICAgIGRhOjA5OjI5OjY0OjYzOjIyOmI5OmZiOjQ3Ojc2Ojg1OjhjOjg2OjQ0OmNiOgorICAgICAgICAgICAgICAgICAgICAwOTpkYgorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgYjU6MzY6MGU6NWQ6ZTE6NjE6Mjg6NWE6MTE6NjU6YzA6M2Y6ODM6MDM6Nzk6NGQ6YmU6Mjg6CisgICAgICAgIGE2OjBiOjA3OjAyOjUyOjg1OmNkOmY4OjkxOmQwOjEwOjZjOmI1OjZhOjIwOjViOjFjOjkwOgorICAgICAgICBkOTozMDozYzpjNjo0ODo5ZTo4YTo1ZTo2NDpmOTphMTo3MTo3NzplZjowNDoyNzoxZjowNzoKKyAgICAgICAgZWI6ZTQ6MjY6Zjc6NzM6NzQ6Yzk6NDQ6MTg6MWE6NjY6ZDM6ZTA6NDM6YWY6OTE6M2I6ZDE6CisgICAgICAgIGNiOjJjOmQ4Ojc0OjU0OjNhOjFjOjRkOmNhOmQ0OjY4OmNkOjIzOjdjOjFkOjEwOjllOjQ1OgorICAgICAgICBlOTpmNjowMDo2ZTphNjpjZDoxOTpmZjo0ZjoyYzoyOTo4Zjo1Nzo0ZDpjNDo3Nzo5MjpiZToKKyAgICAgICAgZTA6NGM6MDk6ZmI6NWQ6NDQ6ODY6NjY6MjE6YTg6Yjk6MzI6YTI6NTY6ZDU6ZTk6OGM6ODM6CisgICAgICAgIDdjOjU5OjNmOmM0OmYxOjBiOmU3OjlkOmVjOjllOmJkOjljOjE4OjBlOjNlOmMyOjM5Ojc5OgorICAgICAgICAyODpiNzowMzowZDowODpjYjpjNjplNzpkOTowMTozNzo1MDoxMDplYzpjYzo2MToxNjo0MDoKKyAgICAgICAgZDQ6YWY6MzE6NzQ6N2I6ZmM6M2Y6MzE6YTc6ZDA6NDc6NzM6MzM6Mzk6MWI6Y2M6NGU6NmE6CisgICAgICAgIGQ3OjQ5OjgzOjExOjA2OmZlOmViOjgyOjU4OjMzOjMyOjRjOmYwOjU2OmFjOjFlOjljOjJmOgorICAgICAgICA1Njo5YTo3YjpjMTo0YToxYzphNTpmZDo1NTozNjpjZTpmYzo5Njo0ZDpmNDpiMDpmMDplYzoKKyAgICAgICAgYjc6NmM6ODI6ZWQ6MmY6MzE6OTk6NDI6NGM6YTk6YjI6MGQ6Yjg6MTU6NWQ6ZjE6ZGY6YmE6CisgICAgICAgIGM5OmI1OjRhOmQ0OjY0Ojk4OmIzOjI2OmE5OjMwOmM4OmZkOmE2OmVjOmFiOjk2OjIxOmFkOgorICAgICAgICA3ZjpjMjo3ODpiNgorCitFbnRydXN0IFdvcmxkd2lkZSBieSBEU1QKKz09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiBCNDo2NToyMjowQTo3QzpBRDpERjo0MTpCNzpENTo0NDpENTpBRDpGQTo5QTo3NQorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURSekNDQXJDZ0F3SUJBZ0lFTm0zRkdEQU5CZ2txaGtpRzl3MEJBUVVGQURCUU1Rc3dDUVlEVlFRR0V3SlYKK1V6RWtNQ0lHQTFVRUNoTWJSR2xuYVhSaGJDQlRhV2R1WVhSMWNtVWdWSEoxYzNRZ1EyOHVNUnN3R1FZRFZRUUwKK0V4SkVVMVF0Ulc1MGNuVnpkQ0JIVkVrZ1EwRXdIaGNOT1RneE1qQTVNREF3TWpJMFdoY05NVGd4TWpBNU1EQXoKK01qSTBXakJRTVFzd0NRWURWUVFHRXdKVlV6RWtNQ0lHQTFVRUNoTWJSR2xuYVhSaGJDQlRhV2R1WVhSMWNtVWcKK1ZISjFjM1FnUTI4dU1Sc3dHUVlEVlFRTEV4SkVVMVF0Ulc1MGNuVnpkQ0JIVkVrZ1EwRXdnWjB3RFFZSktvWkkKK2h2Y05BUUVCQlFBRGdZc0FNSUdIQW9HQkFMWWQ5MHVORHhQakV2VUovZ1l5RHE5TVFmVjkxRWM5S2dyZmd3WGUKKzNuM21BeGIyVVRyTFJ4cEtyWDdFL1IyMHZuU0tlTjBMZzQ2MGhCUEUrL2h0S2E2aDRROFBRK08xWG1CcCtvT1UKKy9Ibm0zSGJ0MFVRcmp2MFN1LzRYZHhjTWllMm43MUY5eE8wNHd6dWpldnZpVGFCZ3RmTDlFMlhUeHV3L3ZqV2MKK1BTTHZBZ0VEbzRJQkxqQ0NBU293RVFZSllJWklBWWI0UWdFQkJBUURBZ0FITUhJR0ExVWRId1JyTUdrd1o2QmwKK29HT2tZVEJmTVFzd0NRWURWUVFHRXdKVlV6RWtNQ0lHQTFVRUNoTWJSR2xuYVhSaGJDQlRhV2R1WVhSMWNtVWcKK1ZISjFjM1FnUTI4dU1Sc3dHUVlEVlFRTEV4SkVVMVF0Ulc1MGNuVnpkQ0JIVkVrZ1EwRXhEVEFMQmdOVkJBTVQKK0JFTlNUREV3S3dZRFZSMFFCQ1F3SW9BUE1UazVPREV5TURrd01EQXlNalJhZ1E4eU1ERTRNVEl3T1RBd01ESXkKK05Gb3dDd1lEVlIwUEJBUURBZ0VHTUI4R0ExVWRJd1FZTUJhQUZKT2FSTXJRZUZPQUtVa0UzOGV2TXorWmRWK3UKK01CMEdBMVVkRGdRV0JCU1Rta1RLMEhoVGdDbEpCTi9IcnpNL21YVmZyakFNQmdOVkhSTUVCVEFEQVFIL01Ca0cKK0NTcUdTSWIyZlFkQkFBUU1NQW9iQkZZMExqQURBZ1NRTUEwR0NTcUdTSWIzRFFFQkJRVUFBNEdCQUdTSnpBT24KKzNBcnlXQ0RuL1JlZ0tITE5oN0RObUxVa1IyTXpNUkFRc3UrS1YzS3VUQVBnWjUrc1lFT0VJc0dwbytXeHA5NEoKKzFNOE5lRVlqVzQ5SmUvNFRJcGVVNm5KSTRTd2dlSmJwWmtVWnl3bGxZMkUvMFVtWXNYWVFWZFZqU21aTHBBZHIKKzNudC91ZWFUV3hvQ1c0QU8zWTBZMUlxandtanhvK0FZMFU1TQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiA5MTMxNjM1NDQgKDB4MzY2ZGM1MTgpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9VVMsIE89RGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uLCBPVT1EU1QtRW50cnVzdCBHVEkgQ0EKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IERlYyAgOSAwMDowMjoyNCAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogRGVjICA5IDAwOjMyOjI0IDIwMTggR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89RGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uLCBPVT1EU1QtRW50cnVzdCBHVEkgQ0EKKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgxMDI0IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgxMDI0IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmI2OjFkOmY3OjRiOjhkOjBmOjEzOmUzOjEyOmY1OjA5OmZlOjA2OjMyOgorICAgICAgICAgICAgICAgICAgICAwZTphZjo0Yzo0MTpmNTo3ZDpkNDo0NzozZDoyYTowYTpkZjo4MzowNTpkZToKKyAgICAgICAgICAgICAgICAgICAgZGU6N2Q6ZTY6MDM6MTY6ZjY6NTE6M2E6Y2I6NDc6MWE6NGE6YWQ6N2U6YzQ6CisgICAgICAgICAgICAgICAgICAgIGZkOjFkOmI0OmJlOjc0OjhhOjc4OmRkOjBiOjgzOjhlOmI0Ojg0OjEzOmM0OgorICAgICAgICAgICAgICAgICAgICBmYjpmODo2ZDoyOTphZTphMTplMTowZjowZjo0MzplMzpiNTo1ZTo2MDo2OToKKyAgICAgICAgICAgICAgICAgICAgZmE6ODM6OTQ6ZmM6Nzk6ZTY6ZGM6NzY6ZWQ6ZDE6NDQ6MmI6OGU6ZmQ6MTI6CisgICAgICAgICAgICAgICAgICAgIGJiOmZlOjE3Ojc3OjE3OjBjOjg5OmVkOmE3OmVmOjUxOjdkOmM0OmVkOjM4OgorICAgICAgICAgICAgICAgICAgICBjMzozYjphMzo3YTpmYjplMjo0ZDphMDo2MDpiNTpmMjpmZDoxMzo2NTpkMzoKKyAgICAgICAgICAgICAgICAgICAgYzY6ZWM6M2Y6YmU6MzU6OWM6M2Q6MjI6ZWYKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogMyAoMHgzKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIE5ldHNjYXBlIENlcnQgVHlwZTogCisgICAgICAgICAgICAgICAgU1NMIENBLCBTL01JTUUgQ0EsIE9iamVjdCBTaWduaW5nIENBCisgICAgICAgICAgICBYNTA5djMgQ1JMIERpc3RyaWJ1dGlvbiBQb2ludHM6IAorICAgICAgICAgICAgICAgIERpck5hbWU6L0M9VVMvTz1EaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4vT1U9RFNULUVudHJ1c3QgR1RJIENBL0NOPUNSTDEKKworICAgICAgICAgICAgWDUwOXYzIFByaXZhdGUgS2V5IFVzYWdlIFBlcmlvZDogCisgICAgICAgICAgICAgICAgTm90IEJlZm9yZTogRGVjICA5IDAwOjAyOjI0IDE5OTggR01ULCBOb3QgQWZ0ZXI6IERlYyAgOSAwMDowMjoyNCAyMDE4IEdNVAorICAgICAgICAgICAgWDUwOXYzIEtleSBVc2FnZTogCisgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUgU2lnbiwgQ1JMIFNpZ24KKyAgICAgICAgICAgIFg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIGtleWlkOjkzOjlBOjQ0OkNBOkQwOjc4OjUzOjgwOjI5OjQ5OjA0OkRGOkM3OkFGOjMzOjNGOjk5Ojc1OjVGOkFFCisKKyAgICAgICAgICAgIFg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICA5Mzo5QTo0NDpDQTpEMDo3ODo1Mzo4MDoyOTo0OTowNDpERjpDNzpBRjozMzozRjo5OTo3NTo1RjpBRQorICAgICAgICAgICAgWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzOiAKKyAgICAgICAgICAgICAgICBDQTpUUlVFCisgICAgICAgICAgICAxLjIuODQwLjExMzUzMy43LjY1LjA6IAorICAgICAgICAgICAgICAgIDAKKy4uVjQuMC4uLi4KKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgNjQ6ODk6Y2M6MDM6YTc6ZGM6MGE6ZjI6NTg6MjA6ZTc6ZmQ6MTc6YTA6Mjg6NzI6Y2Q6ODc6CisgICAgICAgIGIwOmNkOjk4OmI1OjI0OjQ3OjYzOjMzOjMxOjEwOjEwOmIyOmVmOjhhOjU3OjcyOmFlOjRjOgorICAgICAgICAwMzplMDo2Nzo5ZjphYzo2MDo0Mzo4NDoyMjpjMTphOTphMzplNTpiMTphNzpkZTowOTpkNDoKKyAgICAgICAgY2Y6MGQ6Nzg6NDY6MjM6NWI6OGY6NDk6N2I6ZmU6MTM6MjI6OTc6OTQ6ZWE6NzI6NDg6ZTE6CisgICAgICAgIDJjOjIwOjc4Ojk2OmU5OjY2OjQ1OjE5OmNiOjA5OjY1OjYzOjYxOjNmOmQxOjQ5Ojk4OmIxOgorICAgICAgICA3NjoxMDo1NTpkNTo2Mzo0YTo2Njo0YjphNDowNzo2YjpkZTo3Yjo3ZjpiOTplNjo5Mzo1YjoKKyAgICAgICAgMWE6MDI6NWI6ODA6MGU6ZGQ6OGQ6MTg6ZDQ6OGE6YTM6YzI6Njg6ZjE6YTM6ZTA6MTg6ZDE6CisgICAgICAgIDRlOjRjCisKK0VudHJ1c3QubmV0IFByZW1pdW0gMjA0OCBTZWN1cmUgU2VydmVyIENBCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiBCQToyMTpFQToyMDpENjpERDpEQjo4RjpDMTo1Nzo4Qjo0MDpBRDpBMTpGQzpGQworUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVYRENDQTBTZ0F3SUJBZ0lFT0dPNVpqQU5CZ2txaGtpRzl3MEJBUVVGQURDQnRERVVNQklHQTFVRUNoTUwKK1JXNTBjblZ6ZEM1dVpYUXhRREErQmdOVkJBc1VOM2QzZHk1bGJuUnlkWE4wTG01bGRDOURVRk5mTWpBME9DQnAKK2JtTnZjbkF1SUdKNUlISmxaaTRnS0d4cGJXbDBjeUJzYVdGaUxpa3hKVEFqQmdOVkJBc1RIQ2hqS1NBeE9UazUKK0lFVnVkSEoxYzNRdWJtVjBJRXhwYldsMFpXUXhNekF4QmdOVkJBTVRLa1Z1ZEhKMWMzUXVibVYwSUVObGNuUnAKK1ptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlDZ3lNRFE0S1RBZUZ3MDVPVEV5TWpReE56VXdOVEZhRncweE9URXkKK01qUXhPREl3TlRGYU1JRzBNUlF3RWdZRFZRUUtFd3RGYm5SeWRYTjBMbTVsZERGQU1ENEdBMVVFQ3hRM2QzZDMKK0xtVnVkSEoxYzNRdWJtVjBMME5RVTE4eU1EUTRJR2x1WTI5eWNDNGdZbmtnY21WbUxpQW9iR2x0YVhSeklHeHAKK1lXSXVLVEVsTUNNR0ExVUVDeE1jS0dNcElERTVPVGtnUlc1MGNuVnpkQzV1WlhRZ1RHbHRhWFJsWkRFek1ERUcKK0ExVUVBeE1xUlc1MGNuVnpkQzV1WlhRZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGtnS0RJd05EZ3AKK01JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBclUxTHFSS0dzdXFqSUFjVkZtUXEKK0swdlJ2d3RLVFk3dGdIYWxaN2Q0UU1CelFzaG93TnRUSzkxZXVIYVlOWk9MR3AxOEV6b09IMXUzSHMvbEpCUWUKK3NZR3BqWDI0ekd0TEEvRUNETnlycFVBa0FIOTBsS0dkQ0NtemlBdjFoM2VkVmMza3czN1hhbVNyaFJTR2xWdVgKK01sQnZQY2k2Wmd6ai9MMjRTY0YyaVVrWi9jQ292WW1qWnkvR243eHhHV0M0TGVrc3laQjJabnVVNHE5NDFtVlQKK1hUelduTExQS1FQNUw2UlFzdFJJemdVeVZZcjlzbVJNRHVTWUIzWGJmOSs1Q0ZWZ2hUQXArWHRJcEdtRzR6VS8KK0hvWmRlbm9WdmU4QWpoVWlWQmNBa0NhVHZBNUphSkcvK0VmVG5aVkN3UTVOMzI4bXo4TVlJV0ptUTNEVzFjQUgKKzRRSURBUUFCbzNRd2NqQVJCZ2xnaGtnQmh2aENBUUVFQkFNQ0FBY3dId1lEVlIwakJCZ3dGb0FVVmVTQjBSR0EKK3Z0aUp1UWlqTWZtaEpBa1d1WEF3SFFZRFZSME9CQllFRkZYa2dkRVJnTDdZaWJrSW96SDVvU1FKRnJsd01CMEcKK0NTcUdTSWIyZlFkQkFBUVFNQTRiQ0ZZMUxqQTZOQzR3QXdJRWtEQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUEKK1dVZXNJWVNLRjhtY2lWTWV1b0NGR3NZOFRqNnhuTFo4eHBKZEdHUUM0OU1HQ0JGaGZHUGpLNTB4QTNCMjBxTW8KK29QUzdtbU56N1czbEt0dnRGS2tyeGpZUjBDdnJCNHVsMnA1Y0daMVdFdlZVS2NnRjdiSVNLbzMwQXh2LzU1SVEKK2g3QTZ0Y09kQlRjU284ZjBGYm5WcERrV20xTTZJNUh4cUlLaWFvaG93WGtDSXJ5cXB0YXUzN0FVWDdpSDBOMTgKK2Yzdi9yeHpQNXRzSHJWN2JoWjNRS3cwejJ3VFI1a2xBRXl0Mit6N3BuSWtQRmM0WXNJVjRJVTlyVHc3Nk5tZk4KK0IvTC9DTkRpM3RtL0txKzRoNFloUEFUS3Q1Um9mODg4NlpqWE9QL3N3TmxROEM1TFdLNUdiOUF1dzJEYWNsVnkKK3ZVeEZubUc2djRTQmtnUFIwbWw4eFE9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiA5NDYwNTk2MjIgKDB4Mzg2M2I5NjYpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IE89RW50cnVzdC5uZXQsIE9VPXd3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLiksIE9VPShjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQsIENOPUVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogRGVjIDI0IDE3OjUwOjUxIDE5OTkgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBEZWMgMjQgMTg6MjA6NTEgMjAxOSBHTVQKKyAgICAgICAgU3ViamVjdDogTz1FbnRydXN0Lm5ldCwgT1U9d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKSwgT1U9KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZCwgQ049RW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMjA0OCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMjA0OCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDphZDo0ZDo0YjphOToxMjo4NjpiMjplYTphMzoyMDowNzoxNToxNjo2NDoKKyAgICAgICAgICAgICAgICAgICAgMmE6MmI6NGI6ZDE6YmY6MGI6NGE6NGQ6OGU6ZWQ6ODA6NzY6YTU6Njc6Yjc6CisgICAgICAgICAgICAgICAgICAgIDc4OjQwOmMwOjczOjQyOmM4OjY4OmMwOmRiOjUzOjJiOmRkOjVlOmI4Ojc2OgorICAgICAgICAgICAgICAgICAgICA5ODozNTo5Mzo4YjoxYTo5ZDo3YzoxMzozYTowZToxZjo1YjpiNzoxZTpjZjoKKyAgICAgICAgICAgICAgICAgICAgZTU6MjQ6MTQ6MWU6YjE6ODE6YTk6OGQ6N2Q6Yjg6Y2M6NmI6NGI6MDM6ZjE6CisgICAgICAgICAgICAgICAgICAgIDAyOjBjOmRjOmFiOmE1OjQwOjI0OjAwOjdmOjc0Ojk0OmExOjlkOjA4OjI5OgorICAgICAgICAgICAgICAgICAgICBiMzo4ODowYjpmNTo4Nzo3Nzo5ZDo1NTpjZDplNDpjMzo3ZTpkNzo2YTo2NDoKKyAgICAgICAgICAgICAgICAgICAgYWI6ODU6MTQ6ODY6OTU6NWI6OTc6MzI6NTA6NmY6M2Q6Yzg6YmE6NjY6MGM6CisgICAgICAgICAgICAgICAgICAgIGUzOmZjOmJkOmI4OjQ5OmMxOjc2Ojg5OjQ5OjE5OmZkOmMwOmE4OmJkOjg5OgorICAgICAgICAgICAgICAgICAgICBhMzo2NzoyZjpjNjo5ZjpiYzo3MToxOTo2MDpiODoyZDplOToyYzpjOTo5MDoKKyAgICAgICAgICAgICAgICAgICAgNzY6NjY6N2I6OTQ6ZTI6YWY6Nzg6ZDY6NjU6NTM6NWQ6M2M6ZDY6OWM6YjI6CisgICAgICAgICAgICAgICAgICAgIGNmOjI5OjAzOmY5OjJmOmE0OjUwOmIyOmQ0OjQ4OmNlOjA1OjMyOjU1OjhhOgorICAgICAgICAgICAgICAgICAgICBmZDpiMjo2NDo0YzowZTplNDo5ODowNzo3NTpkYjo3ZjpkZjpiOTowODo1NToKKyAgICAgICAgICAgICAgICAgICAgNjA6ODU6MzA6Mjk6Zjk6N2I6NDg6YTQ6Njk6ODY6ZTM6MzU6M2Y6MWU6ODY6CisgICAgICAgICAgICAgICAgICAgIDVkOjdhOjdhOjE1OmJkOmVmOjAwOjhlOjE1OjIyOjU0OjE3OjAwOjkwOjI2OgorICAgICAgICAgICAgICAgICAgICA5MzpiYzowZTo0OTo2ODo5MTpiZjpmODo0NzpkMzo5ZDo5NTo0MjpjMTowZToKKyAgICAgICAgICAgICAgICAgICAgNGQ6ZGY6NmY6MjY6Y2Y6YzM6MTg6MjE6NjI6NjY6NDM6NzA6ZDY6ZDU6YzA6CisgICAgICAgICAgICAgICAgICAgIDA3OmUxCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIE5ldHNjYXBlIENlcnQgVHlwZTogCisgICAgICAgICAgICAgICAgU1NMIENBLCBTL01JTUUgQ0EsIE9iamVjdCBTaWduaW5nIENBCisgICAgICAgICAgICBYNTA5djMgQXV0aG9yaXR5IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICBrZXlpZDo1NTpFNDo4MTpEMToxMTo4MDpCRTpEODo4OTpCOTowODpBMzozMTpGOTpBMToyNDowOToxNjpCOTo3MAorCisgICAgICAgICAgICBYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAgNTU6RTQ6ODE6RDE6MTE6ODA6QkU6RDg6ODk6Qjk6MDg6QTM6MzE6Rjk6QTE6MjQ6MDk6MTY6Qjk6NzAKKyAgICAgICAgICAgIDEuMi44NDAuMTEzNTMzLjcuNjUuMDogCisgICAgICAgICAgICAgICAgMC4uLlY1LjA6NC4wLi4uLgorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA1OTo0NzphYzoyMTo4NDo4YToxNzpjOTo5Yzo4OTo1MzoxZTpiYTo4MDo4NToxYTpjNjozYzoKKyAgICAgICAgNGU6M2U6YjE6OWM6YjY6N2M6YzY6OTI6NWQ6MTg6NjQ6MDI6ZTM6ZDM6MDY6MDg6MTE6NjE6CisgICAgICAgIDdjOjYzOmUzOjJiOjlkOjMxOjAzOjcwOjc2OmQyOmEzOjI4OmEwOmY0OmJiOjlhOjYzOjczOgorICAgICAgICBlZDo2ZDplNToyYTpkYjplZDoxNDphOToyYjpjNjozNjoxMTpkMDoyYjplYjowNzo4YjphNToKKyAgICAgICAgZGE6OWU6NWM6MTk6OWQ6NTY6MTI6ZjU6NTQ6Mjk6Yzg6MDU6ZWQ6YjI6MTI6MmE6OGQ6ZjQ6CisgICAgICAgIDAzOjFiOmZmOmU3OjkyOjEwOjg3OmIwOjNhOmI1OmMzOjlkOjA1OjM3OjEyOmEzOmM3OmY0OgorICAgICAgICAxNTpiOTpkNTphNDozOToxNjo5Yjo1MzozYToyMzo5MTpmMTphODo4MjphMjo2YTo4ODo2ODoKKyAgICAgICAgYzE6Nzk6MDI6MjI6YmM6YWE6YTY6ZDY6YWU6ZGY6YjA6MTQ6NWY6Yjg6ODc6ZDA6ZGQ6N2M6CisgICAgICAgIDdmOjdiOmZmOmFmOjFjOmNmOmU2OmRiOjA3OmFkOjVlOmRiOjg1OjlkOmQwOjJiOjBkOjMzOgorICAgICAgICBkYjowNDpkMTplNjo0OTo0MDoxMzoyYjo3NjpmYjozZTplOTo5Yzo4OTowZjoxNTpjZToxODoKKyAgICAgICAgYjA6ODU6Nzg6MjE6NGY6NmI6NGY6MGU6ZmE6MzY6Njc6Y2Q6MDc6ZjI6ZmY6MDg6ZDA6ZTI6CisgICAgICAgIGRlOmQ5OmJmOjJhOmFmOmI4Ojg3Ojg2OjIxOjNjOjA0OmNhOmI3Ojk0OjY4OjdmOmNmOjNjOgorICAgICAgICBlOTo5ODpkNzozODpmZjplYzpjMDpkOTo1MDpmMDoyZTo0Yjo1ODphZTo0Njo2ZjpkMDoyZToKKyAgICAgICAgYzM6NjA6ZGE6NzI6NTU6NzI6YmQ6NGM6NDU6OWU6NjE6YmE6YmY6ODQ6ODE6OTI6MDM6ZDE6CisgICAgICAgIGQyOjY5OjdjOmM1CisKK0VudHJ1c3QubmV0IFNlY3VyZSBQZXJzb25hbCBDQQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IDBDOjQxOjJGOjEzOjVCOkEwOjU0OkY1Ojk2OjY2OjJEOjdFOkNEOjBFOjAzOkY0CitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRTdUQ0NCRmFnQXdJQkFnSUVPQU9SN2pBTkJna3Foa2lHOXcwQkFRUUZBRENCeVRFTE1Ba0dBMVVFQmhNQworVlZNeEZEQVNCZ05WQkFvVEMwVnVkSEoxYzNRdWJtVjBNVWd3UmdZRFZRUUxGRDkzZDNjdVpXNTBjblZ6ZEM1dQorWlhRdlEyeHBaVzUwWDBOQlgwbHVabTh2UTFCVElHbHVZMjl5Y0M0Z1lua2djbVZtTGlCc2FXMXBkSE1nYkdsaAorWWk0eEpUQWpCZ05WQkFzVEhDaGpLU0F4T1RrNUlFVnVkSEoxYzNRdWJtVjBJRXhwYldsMFpXUXhNekF4QmdOVgorQkFNVEtrVnVkSEoxYzNRdWJtVjBJRU5zYVdWdWRDQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRBZQorRncwNU9URXdNVEl4T1RJME16QmFGdzB4T1RFd01USXhPVFUwTXpCYU1JSEpNUXN3Q1FZRFZRUUdFd0pWVXpFVQorTUJJR0ExVUVDaE1MUlc1MGNuVnpkQzV1WlhReFNEQkdCZ05WQkFzVVAzZDNkeTVsYm5SeWRYTjBMbTVsZEM5RAorYkdsbGJuUmZRMEZmU1c1bWJ5OURVRk1nYVc1amIzSndMaUJpZVNCeVpXWXVJR3hwYldsMGN5QnNhV0ZpTGpFbAorTUNNR0ExVUVDeE1jS0dNcElERTVPVGtnUlc1MGNuVnpkQzV1WlhRZ1RHbHRhWFJsWkRFek1ERUdBMVVFQXhNcQorUlc1MGNuVnpkQzV1WlhRZ1EyeHBaVzUwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNSUdkTUEwRworQ1NxR1NJYjNEUUVCQVFVQUE0R0xBRENCaHdLQmdRRElPcGxlTVJmZnJDZHZrSHZrR2Y5Rm96VEMyOEdvVC9CbworNm9UOW4zVjV6OEdLVVpTdngxY0RSMlNlcllJYld0cC9OM2hIdXplWUVwYk94aE45NzlJTU1GR3BPWjVWK1B1eAorNXpEZWc3SzZQdkhWaVRzN2hicXFkQ3orUHpGdXI1R1ZiZ2JVQjAxTExGWkhHQVJTMmc0UWs3OWprSnZoMzR6bQorQXFUbVQxNzNpd0lCQTZPQ0FlQXdnZ0hjTUJFR0NXQ0dTQUdHK0VJQkFRUUVBd0lBQnpDQ0FTSUdBMVVkSHdTQworQVJrd2dnRVZNSUhrb0lIaG9JSGVwSUhiTUlIWU1Rc3dDUVlEVlFRR0V3SlZVekVVTUJJR0ExVUVDaE1MUlc1MAorY25WemRDNXVaWFF4U0RCR0JnTlZCQXNVUDNkM2R5NWxiblJ5ZFhOMExtNWxkQzlEYkdsbGJuUmZRMEZmU1c1bQorYnk5RFVGTWdhVzVqYjNKd0xpQmllU0J5WldZdUlHeHBiV2wwY3lCc2FXRmlMakVsTUNNR0ExVUVDeE1jS0dNcAorSURFNU9Ua2dSVzUwY25WemRDNXVaWFFnVEdsdGFYUmxaREV6TURFR0ExVUVBeE1xUlc1MGNuVnpkQzV1WlhRZworUTJ4cFpXNTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1RMHdDd1lEVlFRREV3UkRVa3d4TUN5ZworS3FBb2hpWm9kSFJ3T2k4dmQzZDNMbVZ1ZEhKMWMzUXVibVYwTDBOU1RDOURiR2xsYm5ReExtTnliREFyQmdOVgorSFJBRUpEQWlnQTh4T1RrNU1UQXhNakU1TWpRek1GcUJEekl3TVRreE1ERXlNVGt5TkRNd1dqQUxCZ05WSFE4RQorQkFNQ0FRWXdId1lEVlIwakJCZ3dGb0FVeFB1Y0tYdVh6VXlXL081YnM4cVpkSXVWNmt3d0hRWURWUjBPQkJZRQorRk1UN25DbDdsODFNbHZ6dVc3UEttWFNMbGVwTU1Bd0dBMVVkRXdRRk1BTUJBZjh3R1FZSktvWklodlo5QjBFQQorQkF3d0Noc0VWalF1TUFNQ0JKQXdEUVlKS29aSWh2Y05BUUVFQlFBRGdZRUFQNjZLOGRkbUF3V2VQdnJxSEVhNworcEZ1UGVKb1NTSm41OURYZUREWUhBbXNRT29rVWdad3hwbnl5UWJKcTV3Y0JvVXY1bnlVN2xzcVp3ejZoVVJ6egord3k1RTk3Qm5ScXFTNVR2YUhCa1VPRERWNHFJeEpTN3g3RVU0N2ZnR1dBTnpZckFRTVk5QXYyVGdYRDdGVHgvYQorRWtQL1RPWUdKcWliR2FwRVBIYXlYT3c9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAzICgweDIpCisgICAgICAgIFNlcmlhbCBOdW1iZXI6IDkzOTc1ODA2MiAoMHgzODAzOTFlZSkKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBPPUVudHJ1c3QubmV0LCBPVT13d3cuZW50cnVzdC5uZXQvQ2xpZW50X0NBX0luZm8vQ1BTIGluY29ycC4gYnkgcmVmLiBsaW1pdHMgbGlhYi4sIE9VPShjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQsIENOPUVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogT2N0IDEyIDE5OjI0OjMwIDE5OTkgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBPY3QgMTIgMTk6NTQ6MzAgMjAxOSBHTVQKKyAgICAgICAgU3ViamVjdDogQz1VUywgTz1FbnRydXN0Lm5ldCwgT1U9d3d3LmVudHJ1c3QubmV0L0NsaWVudF9DQV9JbmZvL0NQUyBpbmNvcnAuIGJ5IHJlZi4gbGltaXRzIGxpYWIuLCBPVT0oYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVkLCBDTj1FbnRydXN0Lm5ldCBDbGllbnQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgxMDI0IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgxMDI0IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmM4OjNhOjk5OjVlOjMxOjE3OmRmOmFjOjI3OjZmOjkwOjdiOmU0OjE5OgorICAgICAgICAgICAgICAgICAgICBmZjo0NTphMzozNDpjMjpkYjpjMTphODo0ZjpmMDo2ODplYTo4NDpmZDo5ZjoKKyAgICAgICAgICAgICAgICAgICAgNzU6Nzk6Y2Y6YzE6OGE6NTE6OTQ6YWY6Yzc6NTc6MDM6NDc6NjQ6OWU6YWQ6CisgICAgICAgICAgICAgICAgICAgIDgyOjFiOjVhOmRhOjdmOjM3Ojc4OjQ3OmJiOjM3Ojk4OjEyOjk2OmNlOmM2OgorICAgICAgICAgICAgICAgICAgICAxMzo3ZDplZjpkMjowYzozMDo1MTphOTozOTo5ZTo1NTpmODpmYjpiMTplNzoKKyAgICAgICAgICAgICAgICAgICAgMzA6ZGU6ODM6YjI6YmE6M2U6ZjE6ZDU6ODk6M2I6M2I6ODU6YmE6YWE6NzQ6CisgICAgICAgICAgICAgICAgICAgIDJjOmZlOjNmOjMxOjZlOmFmOjkxOjk1OjZlOjA2OmQ0OjA3OjRkOjRiOjJjOgorICAgICAgICAgICAgICAgICAgICA1Njo0NzoxODowNDo1MjpkYTowZToxMDo5MzpiZjo2Mzo5MDo5YjplMTpkZjoKKyAgICAgICAgICAgICAgICAgICAgOGM6ZTY6MDI6YTQ6ZTY6NGY6NWU6Zjc6OGIKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogMyAoMHgzKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIE5ldHNjYXBlIENlcnQgVHlwZTogCisgICAgICAgICAgICAgICAgU1NMIENBLCBTL01JTUUgQ0EsIE9iamVjdCBTaWduaW5nIENBCisgICAgICAgICAgICBYNTA5djMgQ1JMIERpc3RyaWJ1dGlvbiBQb2ludHM6IAorICAgICAgICAgICAgICAgIERpck5hbWU6L0M9VVMvTz1FbnRydXN0Lm5ldC9PVT13d3cuZW50cnVzdC5uZXQvQ2xpZW50X0NBX0luZm8vQ1BTIGluY29ycC4gYnkgcmVmLiBsaW1pdHMgbGlhYi4vT1U9KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZC9DTj1FbnRydXN0Lm5ldCBDbGllbnQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkvQ049Q1JMMQorICAgICAgICAgICAgICAgIFVSSTpodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9DbGllbnQxLmNybAorCisgICAgICAgICAgICBYNTA5djMgUHJpdmF0ZSBLZXkgVXNhZ2UgUGVyaW9kOiAKKyAgICAgICAgICAgICAgICBOb3QgQmVmb3JlOiBPY3QgMTIgMTk6MjQ6MzAgMTk5OSBHTVQsIE5vdCBBZnRlcjogT2N0IDEyIDE5OjI0OjMwIDIwMTkgR01UCisgICAgICAgICAgICBYNTA5djMgS2V5IFVzYWdlOiAKKyAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZSBTaWduLCBDUkwgU2lnbgorICAgICAgICAgICAgWDUwOXYzIEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAga2V5aWQ6QzQ6RkI6OUM6Mjk6N0I6OTc6Q0Q6NEM6OTY6RkM6RUU6NUI6QjM6Q0E6OTk6NzQ6OEI6OTU6RUE6NEMKKworICAgICAgICAgICAgWDUwOXYzIFN1YmplY3QgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIEM0OkZCOjlDOjI5OjdCOjk3OkNEOjRDOjk2OkZDOkVFOjVCOkIzOkNBOjk5Ojc0OjhCOjk1OkVBOjRDCisgICAgICAgICAgICBYNTA5djMgQmFzaWMgQ29uc3RyYWludHM6IAorICAgICAgICAgICAgICAgIENBOlRSVUUKKyAgICAgICAgICAgIDEuMi44NDAuMTEzNTMzLjcuNjUuMDogCisgICAgICAgICAgICAgICAgMAorLi5WNC4wLi4uLgorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDNmOmFlOjhhOmYxOmQ3OjY2OjAzOjA1OjllOjNlOmZhOmVhOjFjOjQ2OmJiOmE0OjViOjhmOgorICAgICAgICA3ODo5YToxMjo0ODo5OTpmOTpmNDozNTpkZTowYzozNjowNzowMjo2YjoxMDozYTo4OToxNDoKKyAgICAgICAgODE6OWM6MzE6YTY6N2M6YjI6NDE6YjI6NmE6ZTc6MDc6MDE6YTE6NGI6Zjk6OWY6MjU6M2I6CisgICAgICAgIDk2OmNhOjk5OmMzOjNlOmExOjUxOjFjOmYzOmMzOjJlOjQ0OmY3OmIwOjY3OjQ2OmFhOjkyOgorICAgICAgICBlNTozYjpkYToxYzoxOToxNDozODozMDpkNTplMjphMjozMToyNToyZTpmMTplYzo0NTozODoKKyAgICAgICAgZWQ6Zjg6MDY6NTg6MDM6NzM6NjI6YjA6MTA6MzE6OGY6NDA6YmY6NjQ6ZTA6NWM6M2U6YzU6CisgICAgICAgIDRmOjFmOmRhOjEyOjQzOmZmOjRjOmU2OjA2OjI2OmE4OjliOjE5OmFhOjQ0OjNjOjc2OmIyOgorICAgICAgICA1YzplYworCitFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENBCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IERGOkYyOjgwOjczOkNDOkYxOkU2OjYxOjczOkZDOkY1OjQyOkU5OkM1OjdDOkVFCitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRTJEQ0NCRUdnQXdJQkFnSUVOMHJTUXpBTkJna3Foa2lHOXcwQkFRVUZBRENCd3pFTE1Ba0dBMVVFQmhNQworVlZNeEZEQVNCZ05WQkFvVEMwVnVkSEoxYzNRdWJtVjBNVHN3T1FZRFZRUUxFekozZDNjdVpXNTBjblZ6ZEM1dQorWlhRdlExQlRJR2x1WTI5eWNDNGdZbmtnY21WbUxpQW9iR2x0YVhSeklHeHBZV0l1S1RFbE1DTUdBMVVFQ3hNYworS0dNcElERTVPVGtnUlc1MGNuVnpkQzV1WlhRZ1RHbHRhWFJsWkRFNk1EZ0dBMVVFQXhNeFJXNTBjblZ6ZEM1dQorWlhRZ1UyVmpkWEpsSUZObGNuWmxjaUJEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzA1T1RBMQorTWpVeE5qQTVOREJhRncweE9UQTFNalV4TmpNNU5EQmFNSUhETVFzd0NRWURWUVFHRXdKVlV6RVVNQklHQTFVRQorQ2hNTFJXNTBjblZ6ZEM1dVpYUXhPekE1QmdOVkJBc1RNbmQzZHk1bGJuUnlkWE4wTG01bGRDOURVRk1nYVc1agorYjNKd0xpQmllU0J5WldZdUlDaHNhVzFwZEhNZ2JHbGhZaTRwTVNVd0l3WURWUVFMRXh3b1l5a2dNVGs1T1NCRgorYm5SeWRYTjBMbTVsZENCTWFXMXBkR1ZrTVRvd09BWURWUVFERXpGRmJuUnlkWE4wTG01bGRDQlRaV04xY21VZworVTJWeWRtVnlJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1JR2RNQTBHQ1NxR1NJYjNEUUVCQVFVQQorQTRHTEFEQ0Jod0tCZ1FETktJTTBWQnVKOHcrdk41RXgvNjh4WU1tbzZMSVFhTzJmNTVNMjhRcGt1MGYxQkJjLworSTBkTnhTY1pnU1lNVkhJTmlDM1pINW9Tbjd5emNkT0FHVDlIWm51TU5TalN1UXJmSk5xYzFsQjVnWHBhMHpmMword2tyWUtaSW1aTkhrbUd3NkFJcjFOSnRsK08zakVQLzl1RWxZM0tEZWdqbHJnYkVXR1dHNVZMYm1Rd0lCQTZPQworQWRjd2dnSFRNQkVHQ1dDR1NBR0crRUlCQVFRRUF3SUFCekNDQVJrR0ExVWRId1NDQVJBd2dnRU1NSUhlb0lIYgorb0lIWXBJSFZNSUhTTVFzd0NRWURWUVFHRXdKVlV6RVVNQklHQTFVRUNoTUxSVzUwY25WemRDNXVaWFF4T3pBNQorQmdOVkJBc1RNbmQzZHk1bGJuUnlkWE4wTG01bGRDOURVRk1nYVc1amIzSndMaUJpZVNCeVpXWXVJQ2hzYVcxcAorZEhNZ2JHbGhZaTRwTVNVd0l3WURWUVFMRXh3b1l5a2dNVGs1T1NCRmJuUnlkWE4wTG01bGRDQk1hVzFwZEdWaworTVRvd09BWURWUVFERXpGRmJuUnlkWE4wTG01bGRDQlRaV04xY21VZ1UyVnlkbVZ5SUVObGNuUnBabWxqWVhScAorYjI0Z1FYVjBhRzl5YVhSNU1RMHdDd1lEVlFRREV3UkRVa3d4TUNtZ0o2QWxoaU5vZEhSd09pOHZkM2QzTG1WdQorZEhKMWMzUXVibVYwTDBOU1RDOXVaWFF4TG1OeWJEQXJCZ05WSFJBRUpEQWlnQTh4T1RrNU1EVXlOVEUyTURrMAorTUZxQkR6SXdNVGt3TlRJMU1UWXdPVFF3V2pBTEJnTlZIUThFQkFNQ0FRWXdId1lEVlIwakJCZ3dGb0FVOEJkaQorRTFVOXMvOEtBR3Y3VUlTWDgrMWkwQm93SFFZRFZSME9CQllFRlBBWFloTlZQYlAvQ2dCcisxQ0VsL1B0WXRBYQorTUF3R0ExVWRFd1FGTUFNQkFmOHdHUVlKS29aSWh2WjlCMEVBQkF3d0Noc0VWalF1TUFNQ0JKQXdEUVlKS29aSQoraHZjTkFRRUZCUUFEZ1lFQWtOd3dBdnBrZE1LbkNxVjhJWTAwRjZqN1J3Ny9KWHlORXdyNzVKaTE3NHo0eFJBTgorOTVLKzhjUFYxWlZxQkxzc3ppWTJaY2d4eHVmdVArTlhkWVI2RWU5R1R4ajAwNWk3cUljeXVuTDJQT0k5bjljZAorMmNOZ1E0eFlEaUtXTDJLakxCKzZyUVh2cXpKNGg2QlVjeG0xWEFYNVVqNXRMVVVMOXdxVDZ1MEcrYkk9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAzICgweDIpCisgICAgICAgIFNlcmlhbCBOdW1iZXI6IDkyNzY1MDM3MSAoMHgzNzRhZDI0MykKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1VUywgTz1FbnRydXN0Lm5ldCwgT1U9d3d3LmVudHJ1c3QubmV0L0NQUyBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLiksIE9VPShjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQsIENOPUVudHJ1c3QubmV0IFNlY3VyZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IE1heSAyNSAxNjowOTo0MCAxOTk5IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogTWF5IDI1IDE2OjM5OjQwIDIwMTkgR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89RW50cnVzdC5uZXQsIE9VPXd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pLCBPVT0oYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVkLCBDTj1FbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpjZDoyODo4MzozNDo1NDoxYjo4OTpmMzowZjphZjozNzo5MTozMTpmZjoKKyAgICAgICAgICAgICAgICAgICAgYWY6MzE6NjA6Yzk6YTg6ZTg6YjI6MTA6Njg6ZWQ6OWY6ZTc6OTM6MzY6ZjE6CisgICAgICAgICAgICAgICAgICAgIDBhOjY0OmJiOjQ3OmY1OjA0OjE3OjNmOjIzOjQ3OjRkOmM1OjI3OjE5OjgxOgorICAgICAgICAgICAgICAgICAgICAyNjowYzo1NDo3MjowZDo4ODoyZDpkOToxZjo5YToxMjo5ZjpiYzpiMzo3MToKKyAgICAgICAgICAgICAgICAgICAgZDM6ODA6MTk6M2Y6NDc6NjY6N2I6OGM6MzU6Mjg6ZDI6Yjk6MGE6ZGY6MjQ6CisgICAgICAgICAgICAgICAgICAgIGRhOjljOmQ2OjUwOjc5OjgxOjdhOjVhOmQzOjM3OmY3OmMyOjRhOmQ4OjI5OgorICAgICAgICAgICAgICAgICAgICA5MjoyNjo2NDpkMTplNDo5ODo2YzozYTowMDo4YTpmNTozNDo5Yjo2NTpmODoKKyAgICAgICAgICAgICAgICAgICAgZWQ6ZTM6MTA6ZmY6ZmQ6Yjg6NDk6NTg6ZGM6YTA6ZGU6ODI6Mzk6NmI6ODE6CisgICAgICAgICAgICAgICAgICAgIGIxOjE2OjE5OjYxOmI5OjU0OmI2OmU2OjQzCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDMgKDB4MykKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBOZXRzY2FwZSBDZXJ0IFR5cGU6IAorICAgICAgICAgICAgICAgIFNTTCBDQSwgUy9NSU1FIENBLCBPYmplY3QgU2lnbmluZyBDQQorICAgICAgICAgICAgWDUwOXYzIENSTCBEaXN0cmlidXRpb24gUG9pbnRzOiAKKyAgICAgICAgICAgICAgICBEaXJOYW1lOi9DPVVTL089RW50cnVzdC5uZXQvT1U9d3d3LmVudHJ1c3QubmV0L0NQUyBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikvT1U9KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZC9DTj1FbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5L0NOPUNSTDEKKyAgICAgICAgICAgICAgICBVUkk6aHR0cDovL3d3dy5lbnRydXN0Lm5ldC9DUkwvbmV0MS5jcmwKKworICAgICAgICAgICAgWDUwOXYzIFByaXZhdGUgS2V5IFVzYWdlIFBlcmlvZDogCisgICAgICAgICAgICAgICAgTm90IEJlZm9yZTogTWF5IDI1IDE2OjA5OjQwIDE5OTkgR01ULCBOb3QgQWZ0ZXI6IE1heSAyNSAxNjowOTo0MCAyMDE5IEdNVAorICAgICAgICAgICAgWDUwOXYzIEtleSBVc2FnZTogCisgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUgU2lnbiwgQ1JMIFNpZ24KKyAgICAgICAgICAgIFg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIGtleWlkOkYwOjE3OjYyOjEzOjU1OjNEOkIzOkZGOjBBOjAwOjZCOkZCOjUwOjg0Ojk3OkYzOkVEOjYyOkQwOjFBCisKKyAgICAgICAgICAgIFg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICBGMDoxNzo2MjoxMzo1NTozRDpCMzpGRjowQTowMDo2QjpGQjo1MDo4NDo5NzpGMzpFRDo2MjpEMDoxQQorICAgICAgICAgICAgWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzOiAKKyAgICAgICAgICAgICAgICBDQTpUUlVFCisgICAgICAgICAgICAxLjIuODQwLjExMzUzMy43LjY1LjA6IAorICAgICAgICAgICAgICAgIDAKKy4uVjQuMC4uLi4KKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgOTA6ZGM6MzA6MDI6ZmE6NjQ6NzQ6YzI6YTc6MGE6YTU6N2M6MjE6OGQ6MzQ6MTc6YTg6ZmI6CisgICAgICAgIDQ3OjBlOmZmOjI1OjdjOjhkOjEzOjBhOmZiOmU0Ojk4OmI1OmVmOjhjOmY4OmM1OjEwOjBkOgorICAgICAgICBmNzo5MjpiZTpmMTpjMzpkNTpkNTo5NTo2YTowNDpiYjoyYzpjZToyNjozNjo2NTpjODozMToKKyAgICAgICAgYzY6ZTc6ZWU6M2Y6ZTM6NTc6NzU6ODQ6N2E6MTE6ZWY6NDY6NGY6MTg6ZjQ6ZDM6OTg6YmI6CisgICAgICAgIGE4Ojg3OjMyOmJhOjcyOmY2OjNjOmUyOjNkOjlmOmQ3OjFkOmQ5OmMzOjYwOjQzOjhjOjU4OgorICAgICAgICAwZToyMjo5NjoyZjo2MjphMzoyYzoxZjpiYTphZDowNTplZjphYjozMjo3ODo4NzphMDo1NDoKKyAgICAgICAgNzM6MTk6YjU6NWM6MDU6Zjk6NTI6M2U6NmQ6MmQ6NDU6MGI6Zjc6MGE6OTM6ZWE6ZWQ6MDY6CisgICAgICAgIGY5OmIyCisKK0VxdWlmYXggUHJlbWl1bSBDQQorPT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IEE5OkU5OkE4OjlEOjBFOjczOkUzOkIxOjJGOjM3OjBEOkU4OjQ4OjNGOjg2OkVECitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJREl6Q0NBb3lnQXdJQkFnSUVOZUh2SGpBTkJna3Foa2lHOXcwQkFRVUZBREJQTVFzd0NRWURWUVFHRXdKVgorVXpFUU1BNEdBMVVFQ2hNSFJYRjFhV1poZURFdU1Dd0dBMVVFQ3hNbFJYRjFhV1poZUNCUWNtVnRhWFZ0SUVObAorY25ScFptbGpZWFJsSUVGMWRHaHZjbWwwZVRBZUZ3MDVPREE0TWpReU1qVTBNak5hRncweE9EQTRNalF5TWpVMAorTWpOYU1FOHhDekFKQmdOVkJBWVRBbFZUTVJBd0RnWURWUVFLRXdkRmNYVnBabUY0TVM0d0xBWURWUVFMRXlWRgorY1hWcFptRjRJRkJ5WlcxcGRXMGdRMlZ5ZEdsbWFXTmhkR1VnUVhWMGFHOXlhWFI1TUlHZk1BMEdDU3FHU0liMworRFFFQkFRVUFBNEdOQURDQmlRS0JnUURPb1FhT0Jzd0lDOEdHcU40ZzFRME8wUTNFbitwcTJiUENNa2RBYjRxSQorcEFtOU9Dd2Q1c3ZtcFBNMjY5cnJ2UHhrc3dmMkxieXF6cDhaU0doSy9QV2lSWDRKRVBXUHMwbGNJd1k1NmhPTAordUF2TmtSMTJYOWszb1VUN1g1RHlaN1BOR0psREgzWVNhd0x5bFlNNFE4TDJZalRLeVhoZFg5TFl1cHIvdmhCZworV3dJREFRQUJvNElCQ2pDQ0FRWXdjUVlEVlIwZkJHb3dhREJtb0dTZ1lxUmdNRjR4Q3pBSkJnTlZCQVlUQWxWVAorTVJBd0RnWURWUVFLRXdkRmNYVnBabUY0TVM0d0xBWURWUVFMRXlWRmNYVnBabUY0SUZCeVpXMXBkVzBnUTJWeQorZEdsbWFXTmhkR1VnUVhWMGFHOXlhWFI1TVEwd0N3WURWUVFERXdSRFVrd3hNQm9HQTFVZEVBUVRNQkdCRHpJdworTVRnd09ESTBNakkxTkRJeldqQUxCZ05WSFE4RUJBTUNBUVl3SHdZRFZSMGpCQmd3Rm9BVUZlNnlLRm1yYnVYNAorejR1QjlDVGhyajkxRzVnd0hRWURWUjBPQkJZRUZCWHVzaWhacTI3bCtNK0xnZlFrNGE0L2RSdVlNQXdHQTFVZAorRXdRRk1BTUJBZjh3R2dZSktvWklodlo5QjBFQUJBMHdDeHNGVmpNdU1HTURBZ2JBTUEwR0NTcUdTSWIzRFFFQgorQlFVQUE0R0JBTDBMbkNlcEE5c28zSmlwUzlEUmpxZW9HbHFSNEp6eDl4aDhMaUtlTmgvSnFMWE5Sa3B1K2pVSAorRzRZSTY1L2lxUG1kUVMwNnJseGN0bDgwQk92OEttQ3crM1RraGVsbE9KYnVGY2ZHZDJNU3ZZcG9INnRzZmRySworWEJQTzZzbnJDVnpGYytjU0FkWFpVd2VlNEErVzhJdTB1MFZJbjRiRkdWV2d5NWJGQS94SQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiA5MDM5OTkyNjIgKDB4MzVlMWVmMWUpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9VVMsIE89RXF1aWZheCwgT1U9RXF1aWZheCBQcmVtaXVtIENlcnRpZmljYXRlIEF1dGhvcml0eQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogQXVnIDI0IDIyOjU0OjIzIDE5OTggR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBBdWcgMjQgMjI6NTQ6MjMgMjAxOCBHTVQKKyAgICAgICAgU3ViamVjdDogQz1VUywgTz1FcXVpZmF4LCBPVT1FcXVpZmF4IFByZW1pdW0gQ2VydGlmaWNhdGUgQXV0aG9yaXR5CisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpjZTphMTowNjo4ZTowNjpjYzowODowYjpjMTo4NjphODpkZToyMDpkNToKKyAgICAgICAgICAgICAgICAgICAgMGQ6MGU6ZDE6MGQ6YzQ6OWY6ZWE6NmE6ZDk6YjM6YzI6MzI6NDc6NDA6NmY6CisgICAgICAgICAgICAgICAgICAgIDhhOjg4OmE0OjA5OmJkOjM4OjJjOjFkOmU2OmNiOmU2OmE0OmYzOjM2OmViOgorICAgICAgICAgICAgICAgICAgICBkYTplYjpiYzpmYzo2NDpiMzowNzpmNjoyZDpiYzphYTpjZTo5ZjoxOTo0ODoKKyAgICAgICAgICAgICAgICAgICAgNjg6NGE6ZmM6ZjU6YTI6NDU6N2U6MDk6MTA6ZjU6OGY6YjM6NDk6NWM6MjM6CisgICAgICAgICAgICAgICAgICAgIDA2OjM5OmVhOjEzOjhiOmI4OjBiOmNkOjkxOjFkOjc2OjVmOmQ5OjM3OmExOgorICAgICAgICAgICAgICAgICAgICA0NDpmYjo1Zjo5MDpmMjo2NzpiMzpjZDoxODo5OTo0MzoxZjo3NjoxMjo2YjoKKyAgICAgICAgICAgICAgICAgICAgMDI6ZjI6OTU6ODM6Mzg6NDM6YzI6ZjY6NjI6MzQ6Y2E6Yzk6Nzg6NWQ6NWY6CisgICAgICAgICAgICAgICAgICAgIGQyOmQ4OmJhOjlhOmZmOmJlOjEwOjYwOjViCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIFg1MDl2MyBDUkwgRGlzdHJpYnV0aW9uIFBvaW50czogCisgICAgICAgICAgICAgICAgRGlyTmFtZTovQz1VUy9PPUVxdWlmYXgvT1U9RXF1aWZheCBQcmVtaXVtIENlcnRpZmljYXRlIEF1dGhvcml0eS9DTj1DUkwxCisKKyAgICAgICAgICAgIFg1MDl2MyBQcml2YXRlIEtleSBVc2FnZSBQZXJpb2Q6IAorICAgICAgICAgICAgICAgIE5vdCBBZnRlcjogQXVnIDI0IDIyOjU0OjIzIDIwMTggR01UCisgICAgICAgICAgICBYNTA5djMgS2V5IFVzYWdlOiAKKyAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZSBTaWduLCBDUkwgU2lnbgorICAgICAgICAgICAgWDUwOXYzIEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAga2V5aWQ6MTU6RUU6QjI6Mjg6NTk6QUI6NkU6RTU6Rjg6Q0Y6OEI6ODE6RjQ6MjQ6RTE6QUU6M0Y6NzU6MUI6OTgKKworICAgICAgICAgICAgWDUwOXYzIFN1YmplY3QgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIDE1OkVFOkIyOjI4OjU5OkFCOjZFOkU1OkY4OkNGOjhCOjgxOkY0OjI0OkUxOkFFOjNGOjc1OjFCOjk4CisgICAgICAgICAgICBYNTA5djMgQmFzaWMgQ29uc3RyYWludHM6IAorICAgICAgICAgICAgICAgIENBOlRSVUUKKyAgICAgICAgICAgIDEuMi44NDAuMTEzNTMzLjcuNjUuMDogCisgICAgICAgICAgICAgICAgMC4uLlYzLjBjLi4uLgorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBiZDowYjo5YzoyNzphOTowMzpkYjoyODpkYzo5ODphOTo0YjpkMDpkMTo4ZTphNzphODoxYToKKyAgICAgICAgNWE6OTE6ZTA6OWM6ZjE6Zjc6MTg6N2M6MmU6MjI6OWU6MzY6MWY6Yzk6YTg6YjU6Y2Q6NDY6CisgICAgICAgIDRhOjZlOmZhOjM1OjA3OjFiOjg2OjA4OmViOjlmOmUyOmE4OmY5OjlkOjQxOjJkOjNhOmFlOgorICAgICAgICA1Yzo1YzpiNjo1ZjozNDowNDplYjpmYzoyYTo2MDpiMDpmYjo3NDplNDo4NTplOTo2NTozODoKKyAgICAgICAgOTY6ZWU6MTU6Yzc6YzY6Nzc6NjM6MTI6YmQ6OGE6Njg6MWY6YWI6NmM6N2Q6ZGE6Y2E6NWM6CisgICAgICAgIDEzOmNlOmVhOmM5OmViOjA5OjVjOmM1OjczOmU3OjEyOjAxOmQ1OmQ5OjUzOjA3OjllOmUwOgorICAgICAgICAwZjo5NjpmMDo4YjpiNDpiYjo0NTo0ODo5Zjo4NjpjNToxOTo1NTphMDpjYjo5NjpjNTowMzoKKyAgICAgICAgZmM6NDgKKworRXF1aWZheCBTZWN1cmUgQ0EKKz09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IDY3OkNCOjlEOkMwOjEzOjI0OjhBOjgyOjlCOkIyOjE3OjFFOkQxOjFCOkVDOkQ0CitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRElEQ0NBb21nQXdJQkFnSUVOZDcwenpBTkJna3Foa2lHOXcwQkFRVUZBREJPTVFzd0NRWURWUVFHRXdKVgorVXpFUU1BNEdBMVVFQ2hNSFJYRjFhV1poZURFdE1Dc0dBMVVFQ3hNa1JYRjFhV1poZUNCVFpXTjFjbVVnUTJWeQorZEdsbWFXTmhkR1VnUVhWMGFHOXlhWFI1TUI0WERUazRNRGd5TWpFMk5ERTFNVm9YRFRFNE1EZ3lNakUyTkRFMQorTVZvd1RqRUxNQWtHQTFVRUJoTUNWVk14RURBT0JnTlZCQW9UQjBWeGRXbG1ZWGd4TFRBckJnTlZCQXNUSkVWeAorZFdsbVlYZ2dVMlZqZFhKbElFTmxjblJwWm1sallYUmxJRUYxZEdodmNtbDBlVENCbnpBTkJna3Foa2lHOXcwQgorQVFFRkFBT0JqUUF3Z1lrQ2dZRUF3VjJ4V0djSVl1NmdtaTBmQ0cyUkZHaVlDaDcrMmdSdkU0UmlJY1BSZk02ZgorQmVDNEFmQk9OT3ppaXBVRVpLenhhMU5mQmJQTFo0Qy9RZ0tPL3QwQkNlemhBQlJQL1B2d0ROMUR1bHNyNFIrQQorY0prVlY1TVc4UStYYXJmQ2FDTWN6RTFaTUt4UkhqdXZLOWJ1WTBWN3hkbGZVTkxqVUE4NmlPZS9GUDNneDdrQworQXdFQUFhT0NBUWt3Z2dFRk1IQUdBMVVkSHdScE1HY3daYUJqb0dHa1h6QmRNUXN3Q1FZRFZRUUdFd0pWVXpFUQorTUE0R0ExVUVDaE1IUlhGMWFXWmhlREV0TUNzR0ExVUVDeE1rUlhGMWFXWmhlQ0JUWldOMWNtVWdRMlZ5ZEdsbQorYVdOaGRHVWdRWFYwYUc5eWFYUjVNUTB3Q3dZRFZRUURFd1JEVWt3eE1Cb0dBMVVkRUFRVE1CR0JEekl3TVRndworT0RJeU1UWTBNVFV4V2pBTEJnTlZIUThFQkFNQ0FRWXdId1lEVlIwakJCZ3dGb0FVU09abytTdlNzcFhYUjlnagorSUJCUE01aVFuOVF3SFFZRFZSME9CQllFRkVqbWFQa3IwcktWMTBmWUl5QVFUek9Za0ovVU1Bd0dBMVVkRXdRRgorTUFNQkFmOHdHZ1lKS29aSWh2WjlCMEVBQkEwd0N4c0ZWak11TUdNREFnYkFNQTBHQ1NxR1NJYjNEUUVCQlFVQQorQTRHQkFGak9LZXI4OTk2MXpnSzVGN1dGMGJuajRKWE1KVEVOQUthU2JuKzJrbU9lVUpYUm1tL2tFZDVqaFc2WQorN3FqL1dzalRWYkptY1ZmZXdDSHJQU3FuSTBrQkJJWkNlL3p1ZjZJV1VyVm5aOU5BMnpzbVdMSW9kejJ1RkhkaAorMXZvcVppZWdEZnFuYzF6cWNQR1VJV1ZFWC9yODd5bG9xYUtIZWU5NTcwK3NCM2M0CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAzICgweDIpCisgICAgICAgIFNlcmlhbCBOdW1iZXI6IDkwMzgwNDExMSAoMHgzNWRlZjRjZikKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1VUywgTz1FcXVpZmF4LCBPVT1FcXVpZmF4IFNlY3VyZSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IEF1ZyAyMiAxNjo0MTo1MSAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogQXVnIDIyIDE2OjQxOjUxIDIwMTggR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89RXF1aWZheCwgT1U9RXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5CisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpjMTo1ZDpiMTo1ODo2NzowODo2MjplZTphMDo5YToyZDoxZjowODo2ZDoKKyAgICAgICAgICAgICAgICAgICAgOTE6MTQ6Njg6OTg6MGE6MWU6ZmU6ZGE6MDQ6NmY6MTM6ODQ6NjI6MjE6YzM6CisgICAgICAgICAgICAgICAgICAgIGQxOjdjOmNlOjlmOjA1OmUwOmI4OjAxOmYwOjRlOjM0OmVjOmUyOjhhOjk1OgorICAgICAgICAgICAgICAgICAgICAwNDo2NDphYzpmMTo2Yjo1Mzo1ZjowNTpiMzpjYjo2Nzo4MDpiZjo0MjowMjoKKyAgICAgICAgICAgICAgICAgICAgOGU6ZmU6ZGQ6MDE6MDk6ZWM6ZTE6MDA6MTQ6NGY6ZmM6ZmI6ZjA6MGM6ZGQ6CisgICAgICAgICAgICAgICAgICAgIDQzOmJhOjViOjJiOmUxOjFmOjgwOjcwOjk5OjE1OjU3OjkzOjE2OmYxOjBmOgorICAgICAgICAgICAgICAgICAgICA5Nzo2YTpiNzpjMjo2ODoyMzoxYzpjYzo0ZDo1OTozMDphYzo1MToxZTozYjoKKyAgICAgICAgICAgICAgICAgICAgYWY6MmI6ZDY6ZWU6NjM6NDU6N2I6YzU6ZDk6NWY6NTA6ZDI6ZTM6NTA6MGY6CisgICAgICAgICAgICAgICAgICAgIDNhOjg4OmU3OmJmOjE0OmZkOmUwOmM3OmI5CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIFg1MDl2MyBDUkwgRGlzdHJpYnV0aW9uIFBvaW50czogCisgICAgICAgICAgICAgICAgRGlyTmFtZTovQz1VUy9PPUVxdWlmYXgvT1U9RXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5L0NOPUNSTDEKKworICAgICAgICAgICAgWDUwOXYzIFByaXZhdGUgS2V5IFVzYWdlIFBlcmlvZDogCisgICAgICAgICAgICAgICAgTm90IEFmdGVyOiBBdWcgMjIgMTY6NDE6NTEgMjAxOCBHTVQKKyAgICAgICAgICAgIFg1MDl2MyBLZXkgVXNhZ2U6IAorICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIFNpZ24sIENSTCBTaWduCisgICAgICAgICAgICBYNTA5djMgQXV0aG9yaXR5IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICBrZXlpZDo0ODpFNjo2ODpGOToyQjpEMjpCMjo5NTpENzo0NzpEODoyMzoyMDoxMDo0RjozMzo5ODo5MDo5RjpENAorCisgICAgICAgICAgICBYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAgNDg6RTY6Njg6Rjk6MkI6RDI6QjI6OTU6RDc6NDc6RDg6MjM6MjA6MTA6NEY6MzM6OTg6OTA6OUY6RDQKKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogCisgICAgICAgICAgICAgICAgQ0E6VFJVRQorICAgICAgICAgICAgMS4yLjg0MC4xMTM1MzMuNy42NS4wOiAKKyAgICAgICAgICAgICAgICAwLi4uVjMuMGMuLi4uCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDU4OmNlOjI5OmVhOmZjOmY3OmRlOmI1OmNlOjAyOmI5OjE3OmI1Ojg1OmQxOmI5OmUzOmUwOgorICAgICAgICA5NTpjYzoyNTozMTowZDowMDphNjo5Mjo2ZTo3ZjpiNjo5Mjo2Mzo5ZTo1MDo5NTpkMTo5YToKKyAgICAgICAgNmY6ZTQ6MTE6ZGU6NjM6ODU6NmU6OTg6ZWU6YTg6ZmY6NWE6Yzg6ZDM6NTU6YjI6NjY6NzE6CisgICAgICAgIDU3OmRlOmMwOjIxOmViOjNkOjJhOmE3OjIzOjQ5OjAxOjA0Ojg2OjQyOjdiOmZjOmVlOjdmOgorICAgICAgICBhMjoxNjo1MjpiNTo2Nzo2NzpkMzo0MDpkYjozYjoyNjo1ODpiMjoyODo3NzozZDphZToxNDoKKyAgICAgICAgNzc6NjE6ZDY6ZmE6MmE6NjY6Mjc6YTA6MGQ6ZmE6YTc6NzM6NWM6ZWE6NzA6ZjE6OTQ6MjE6CisgICAgICAgIDY1OjQ0OjVmOmZhOmZjOmVmOjI5OjY4OmE5OmEyOjg3Ojc5OmVmOjc5OmVmOjRmOmFjOjA3OgorICAgICAgICA3NzozOAorCitHVEUgQ3liZXJUcnVzdCBHbG9iYWwgUm9vdAorPT09PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogQ0E6M0Q6RDM6Njg6RjE6MDM6NUM6RDA6MzI6RkE6Qjg6MkI6NTk6RTg6NUE6REIKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlDV2pDQ0FjTUNBZ0dsTUEwR0NTcUdTSWIzRFFFQkJBVUFNSFV4Q3pBSkJnTlZCQVlUQWxWVE1SZ3dGZ1lECitWUVFLRXc5SFZFVWdRMjl5Y0c5eVlYUnBiMjR4SnpBbEJnTlZCQXNUSGtkVVJTQkRlV0psY2xSeWRYTjBJRk52CitiSFYwYVc5dWN5d2dTVzVqTGpFak1DRUdBMVVFQXhNYVIxUkZJRU41WW1WeVZISjFjM1FnUjJ4dlltRnNJRkp2CitiM1F3SGhjTk9UZ3dPREV6TURBeU9UQXdXaGNOTVRnd09ERXpNak0xT1RBd1dqQjFNUXN3Q1FZRFZRUUdFd0pWCitVekVZTUJZR0ExVUVDaE1QUjFSRklFTnZjbkJ2Y21GMGFXOXVNU2N3SlFZRFZRUUxFeDVIVkVVZ1EzbGlaWEpVCitjblZ6ZENCVGIyeDFkR2x2Ym5Nc0lFbHVZeTR4SXpBaEJnTlZCQU1UR2tkVVJTQkRlV0psY2xSeWRYTjBJRWRzCitiMkpoYkNCU2IyOTBNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0JnUUNWRDZDMjhGQ2M2SHJICitpTTNkRnc0dXNKVFFHejBPOXBUQWlwVEhCc2lRbDhpNFpCcDZmbXc4VStFM0tITmdmN0tYVXdlZlUvbHRXSlRTCityNDF0aUdlQTV1MnlsYzl5TWNxbEhISzZYQUxuWkVMbitha3Mxam9OckkxQ3FpUUJPZWFjUHdHRlZ3MVloMFg0CiswNFdxazJrbWhYQklnRDhTRmNkNXRCOEZMenRpbVFJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQkFVQUE0R0JBRzNyCitHd25wWHRsUjIyY2lZYVFxUEVoMzQ2QjhwdDV6b2hRRGhUMzdxdzR3eFlNV000RVRDSjU3TkU3ZlFNaDAxN2w5CiszUFIyVlgyYlkxUVk2ZkRxODF5eDJZdENIcm5BbFU2Nit0WGlmUFZvWWIrTzdBV1hYMXV3MTZPRk5NUWtwdzBQCitsWlB2eTVUWW5oK2RYSVZ0eDZxdVR4OGl0YzJWcmJxbnpQbXJDM3AvCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAxICgweDApCisgICAgICAgIFNlcmlhbCBOdW1iZXI6IDQyMSAoMHgxYTUpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1VUywgTz1HVEUgQ29ycG9yYXRpb24sIE9VPUdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLiwgQ049R1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IEF1ZyAxMyAwMDoyOTowMCAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogQXVnIDEzIDIzOjU5OjAwIDIwMTggR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89R1RFIENvcnBvcmF0aW9uLCBPVT1HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4sIENOPUdURSBDeWJlclRydXN0IEdsb2JhbCBSb290CisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDo5NTowZjphMDpiNjpmMDo1MDo5YzplODo3YTpjNzo4ODpjZDpkZDoxNzoKKyAgICAgICAgICAgICAgICAgICAgMGU6MmU6YjA6OTQ6ZDA6MWI6M2Q6MGU6ZjY6OTQ6YzA6OGE6OTQ6Yzc6MDY6CisgICAgICAgICAgICAgICAgICAgIGM4OjkwOjk3OmM4OmI4OjY0OjFhOjdhOjdlOjZjOjNjOjUzOmUxOjM3OjI4OgorICAgICAgICAgICAgICAgICAgICA3Mzo2MDo3ZjpiMjo5Nzo1MzowNzo5Zjo1MzpmOTo2ZDo1ODo5NDpkMjphZjoKKyAgICAgICAgICAgICAgICAgICAgOGQ6NmQ6ODg6Njc6ODA6ZTY6ZWQ6YjI6OTU6Y2Y6NzI6MzE6Y2E6YTU6MWM6CisgICAgICAgICAgICAgICAgICAgIDcyOmJhOjVjOjAyOmU3OjY0OjQyOmU3OmY5OmE5OjJjOmQ2OjNhOjBkOmFjOgorICAgICAgICAgICAgICAgICAgICA4ZDo0MjphYToyNDowMTozOTplNjo5YzozZjowMTo4NTo1NzowZDo1ODo4NzoKKyAgICAgICAgICAgICAgICAgICAgNDU6Zjg6ZDM6ODU6YWE6OTM6Njk6MjY6ODU6NzA6NDg6ODA6M2Y6MTI6MTU6CisgICAgICAgICAgICAgICAgICAgIGM3Ojc5OmI0OjFmOjA1OjJmOjNiOjYyOjk5CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDZkOmViOjFiOjA5OmU5OjVlOmQ5OjUxOmRiOjY3OjIyOjYxOmE0OjJhOjNjOjQ4Ojc3OmUzOgorICAgICAgICBhMDo3YzphNjpkZTo3MzphMjoxNDowMzo4NTozZDpmYjphYjowZTozMDpjNTo4MzoxNjozMzoKKyAgICAgICAgODE6MTM6MDg6OWU6N2I6MzQ6NGU6ZGY6NDA6Yzg6NzQ6ZDc6Yjk6N2Q6ZGM6ZjQ6NzY6NTU6CisgICAgICAgIDdkOjliOjYzOjU0OjE4OmU5OmYwOmVhOmYzOjVjOmIxOmQ5OjhiOjQyOjFlOmI5OmMwOjk1OgorICAgICAgICA0ZTpiYTpmYTpkNTplMjo3YzpmNTo2ODo2MTpiZjo4ZTplYzowNTo5Nzo1Zjo1YjpiMDpkNzoKKyAgICAgICAgYTM6ODU6MzQ6YzQ6MjQ6YTc6MGQ6MGY6OTU6OTM6ZWY6Y2I6OTQ6ZDg6OWU6MWY6OWQ6NWM6CisgICAgICAgIDg1OjZkOmM3OmFhOmFlOjRmOjFmOjIyOmI1OmNkOjk1OmFkOmJhOmE3OmNjOmY5OmFiOjBiOgorICAgICAgICA3YTo3ZgorCitHVEUgQ3liZXJUcnVzdCBKYXBhbiBSb290IENBCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IERFOkFCOkZGOjQzOjJBOjY1OjM3OjA2OjlCOjI4OkI1OjdBOkU4Ojg0OkQzOjhFCitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQ0VUQ0NBWG9DQVU0d0RRWUpLb1pJaHZjTkFRRUVCUUF3VVRFTE1Ba0dBMVVFQmhNQ1NsQXhIekFkQmdOVgorQkFvVEZrTjVZbVZ5VkhKMWMzUWdTbUZ3WVc0c0lFbHVZeTR4SVRBZkJnTlZCQU1UR0VONVltVnlWSEoxYzNRZworU2tGUVFVNGdVbTl2ZENCRFFUQWVGdzA1T0RBNE1EUXdOelUzTURCYUZ3MHdNekE0TURReU16VTVNREJhTUZFeAorQ3pBSkJnTlZCQVlUQWtwUU1SOHdIUVlEVlFRS0V4WkRlV0psY2xSeWRYTjBJRXBoY0dGdUxDQkpibU11TVNFdworSHdZRFZRUURFeGhEZVdKbGNsUnlkWE4wSUVwQlVFRk9JRkp2YjNRZ1EwRXdnWjh3RFFZSktvWklodmNOQVFFQgorQlFBRGdZMEFNSUdKQW9HQkFMZXQvTXBIRUhhSi9XZXM1SE1HZklGTEhkYTFmQTVIcit5bVZIV294UDFscitmSQorc2JGc05EV045N2xrVnlnTElWcmVkUDdjZUM2R1JoSk1meEVmM0pPOVg3NW1tSWE0dCt4dFNkT1EyZUY1QUZabwordXExc0h5dzdIOGtzakVPd0JFTHFnWE9tempOMVJRMktSWEl2cWxkVjVBZkRRK0oxT2crOFBOQ0V6cnJ2QWdNQgorQUFFd0RRWUpLb1pJaHZjTkFRRUVCUUFEZ1lFQXQ2Wmtvd3lBUEJ6RTJPNUJPK1dHcEo1Z1hkWUJNcWhxWkMwZworY0VDNmNrNW0rZ2RsVGdPT0MvMVc0SzA3SUtjeStySVNIb0RmSHVONkdNeFgyK2JKTkdEdmRlc1FGdENrTG5EWQorSkNPNHBYZHpRdmtIT3QwQmJBaVRCelVtRUNWZ0tmOEo1V1NmYWJrV1NmTmMzU1JqUnBNTnNGTTJkYnhJSUxzWgordG8vUUl2MD0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDEgKDB4MCkKKyAgICAgICAgU2VyaWFsIE51bWJlcjogNzggKDB4NGUpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1KUCwgTz1DeWJlclRydXN0IEphcGFuLCBJbmMuLCBDTj1DeWJlclRydXN0IEpBUEFOIFJvb3QgQ0EKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IEF1ZyAgNCAwNzo1NzowMCAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogQXVnICA0IDIzOjU5OjAwIDIwMDMgR01UCisgICAgICAgIFN1YmplY3Q6IEM9SlAsIE89Q3liZXJUcnVzdCBKYXBhbiwgSW5jLiwgQ049Q3liZXJUcnVzdCBKQVBBTiBSb290IENBCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpiNzphZDpmYzpjYTo0NzoxMDo3Njo4OTpmZDo2NzphYzplNDo3MzowNjoKKyAgICAgICAgICAgICAgICAgICAgN2M6ODE6NGI6MWQ6ZDY6YjU6N2M6MGU6NDc6YWY6ZWM6YTY6NTQ6NzU6YTg6CisgICAgICAgICAgICAgICAgICAgIGM0OmZkOjY1OmFmOmU3OmM4OmIxOmIxOjZjOjM0OjM1OjhkOmY3OmI5OjY0OgorICAgICAgICAgICAgICAgICAgICA1NzoyODowYjoyMTo1YTpkZTo3NDpmZTpkYzo3ODoyZTo4Njo0NjoxMjo0YzoKKyAgICAgICAgICAgICAgICAgICAgN2Y6MTE6MWY6ZGM6OTM6YmQ6NWY6YmU6NjY6OTg6ODY6Yjg6Yjc6ZWM6NmQ6CisgICAgICAgICAgICAgICAgICAgIDQ5OmQzOjkwOmQ5OmUxOjc5OjAwOjU2OjY4OmJhOmFkOjZjOjFmOjJjOjNiOgorICAgICAgICAgICAgICAgICAgICAxZjpjOToyYzo4Yzo0MzpiMDowNDo0MjplYTo4MTo3MzphNjpjZTozMzo3NToKKyAgICAgICAgICAgICAgICAgICAgNDU6MGQ6OGE6NDU6NzI6MmY6YWE6NTc6NTU6ZTQ6MDc6YzM6NDM6ZTI6NzU6CisgICAgICAgICAgICAgICAgICAgIDNhOjBmOmJjOjNjOmQwOjg0OmNlOmJhOmVmCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIGI3OmE2OjY0OmEzOjBjOjgwOjNjOjFjOmM0OmQ4OmVlOjQxOjNiOmU1Ojg2OmE0OjllOjYwOgorICAgICAgICA1ZDpkNjowMTozMjphODo2YTo2NDoyZDoyMDo3MDo0MDpiYTo3Mjo0ZTo2NjpmYTowNzo2NToKKyAgICAgICAgNGU6MDM6OGU6MGI6ZmQ6NTY6ZTA6YWQ6M2I6MjA6YTc6MzI6ZmE6YjI6MTI6MWU6ODA6ZGY6CisgICAgICAgIDFlOmUzOjdhOjE4OmNjOjU3OmRiOmU2OmM5OjM0OjYwOmVmOjc1OmViOjEwOjE2OmQwOmE0OgorICAgICAgICAyZTo3MDpkODoyNDoyMzpiODphNTo3Nzo3Mzo0MjpmOTowNzozYTpkZDowMTo2YzowODo5MzoKKyAgICAgICAgMDc6MzU6MjY6MTA6MjU6NjA6Mjk6ZmY6MDk6ZTU6NjQ6OWY6Njk6Yjk6MTY6NDk6ZjM6NWM6CisgICAgICAgIGRkOjI0OjYzOjQ2OjkzOjBkOmIwOjUzOjM2Ojc1OmJjOjQ4OjIwOmJiOjE5OmI2OjhmOmQwOgorICAgICAgICAyMjpmZAorCitHVEUgQ3liZXJUcnVzdCBKYXBhbiBTZWN1cmUgU2VydmVyIENBCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IEREOjBEOjBEOkI0Ojc4OjRCOjdEOkNFOjMwOjBBOkE2OjM1OkM2OkFCOjRDOjg4CitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQ0l6Q0NBWXdDQVU4d0RRWUpLb1pJaHZjTkFRRUVCUUF3V2pFTE1Ba0dBMVVFQmhNQ1NsQXhIekFkQmdOVgorQkFvVEZrTjVZbVZ5VkhKMWMzUWdTbUZ3WVc0c0lFbHVZeTR4S2pBb0JnTlZCQU1USVVONVltVnlWSEoxYzNRZworU2tGUVFVNGdVMlZqZFhKbElGTmxjblpsY2lCRFFUQWVGdzA1T0RBNE1EUXdPREEyTXpKYUZ3MHdNekE0TURReQorTXpVNU1EQmFNRm94Q3pBSkJnTlZCQVlUQWtwUU1SOHdIUVlEVlFRS0V4WkRlV0psY2xSeWRYTjBJRXBoY0dGdQorTENCSmJtTXVNU293S0FZRFZRUURFeUZEZVdKbGNsUnlkWE4wSUVwQlVFRk9JRk5sWTNWeVpTQlRaWEoyWlhJZworUTBFd2daOHdEUVlKS29aSWh2Y05BUUVCQlFBRGdZMEFNSUdKQW9HQkFLd21vNkc0YjJyQUxCTDUyekVGa3VmOQorK3RTQnRMalZLdFdRK3ZCRFpmd1NGY3JzMjdsaDNqTmpOMCt2QUR4L2tqY2JHSFBsbnp5SThSb1RSUDU1OHNNbQorbFE4TDhKNFVCeUZzVjhKZHcrSlJzTTJMWDgxZmhqajRlWmM1N09pL1VpNnhYcXFwcm96dDd0Zkl0eTR4aTdRNQora2p0OGdTY0hHZ0ZFTDBseklMYkpBZ01CQUFFd0RRWUpLb1pJaHZjTkFRRUVCUUFEZ1lFQWFCMTdFdTVhZVNreAoreWdHc2kxQ3BKNWtzQVB3NEdoei93dFh3RS80YnB6bjFnQlRyVWZyQWpYdUVHMW11c1RWUmJxRSsxeHZzb0o3ZgorNEtXQ2x1T3hQOWlvOGN0NWdJNzM4RVNaZmhUMUk2TVI0MmhMQlRadWlPT3JocW80VXdOQ085TzUrZUMvQmVuVAorWDhOS3A3Yjl0MTJRU2ZpYXNxMW1wb0lBazY1Zy95QT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDEgKDB4MCkKKyAgICAgICAgU2VyaWFsIE51bWJlcjogNzkgKDB4NGYpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1KUCwgTz1DeWJlclRydXN0IEphcGFuLCBJbmMuLCBDTj1DeWJlclRydXN0IEpBUEFOIFNlY3VyZSBTZXJ2ZXIgQ0EKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IEF1ZyAgNCAwODowNjozMiAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogQXVnICA0IDIzOjU5OjAwIDIwMDMgR01UCisgICAgICAgIFN1YmplY3Q6IEM9SlAsIE89Q3liZXJUcnVzdCBKYXBhbiwgSW5jLiwgQ049Q3liZXJUcnVzdCBKQVBBTiBTZWN1cmUgU2VydmVyIENBCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDphYzoyNjphMzphMTpiODo2Zjo2YTpjMDoyYzoxMjpmOTpkYjozMTowNToKKyAgICAgICAgICAgICAgICAgICAgOTI6ZTc6ZmQ6ZmE6ZDQ6ODE6YjQ6Yjg6ZDU6MmE6ZDU6OTA6ZmE6ZjA6NDM6CisgICAgICAgICAgICAgICAgICAgIDY1OmZjOjEyOjE1OmNhOmVjOmRiOmI5OjYxOmRlOjMzOjYzOjM3OjRmOmFmOgorICAgICAgICAgICAgICAgICAgICAwMDozYzo3Zjo5MjozNzoxYjoxODo3MzplNTo5ZjozYzo4ODpmMToxYToxMzoKKyAgICAgICAgICAgICAgICAgICAgNDQ6ZmU6Nzk6ZjI6YzM6MjY6OTU6MGY6MGI6ZjA6OWU6MTQ6MDc6MjE6NmM6CisgICAgICAgICAgICAgICAgICAgIDU3OmMyOjVkOmMzOmUyOjUxOmIwOmNkOjhiOjVmOmNkOjVmOjg2OjM4OmY4OgorICAgICAgICAgICAgICAgICAgICA3OTo5NzozOTplYzplODpiZjo1MjoyZTpiMTo1ZTphYTphOTphZTo4YzplZDoKKyAgICAgICAgICAgICAgICAgICAgZWU6ZDc6Yzg6Yjc6MmU6MzE6OGI6YjQ6Mzk6OTI6M2I6N2M6ODE6Mjc6MDc6CisgICAgICAgICAgICAgICAgICAgIDFhOjAxOjQ0OjJmOjQ5OjczOjIwOmI2OmM5CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDY4OjFkOjdiOjEyOmVlOjVhOjc5OjI5OjMxOmNhOjAxOmFjOjhiOjUwOmE5OjI3Ojk5OjJjOgorICAgICAgICAwMDpmYzozODoxYToxYzpmZjpjMjpkNTpmMDoxMzpmZToxYjphNzozOTpmNTo4MDoxNDplYjoKKyAgICAgICAgNTE6ZmE6YzA6OGQ6N2I6ODQ6MWI6NTk6YWU6YjE6MzU6NTE6NmU6YTE6M2U6ZDc6MWI6ZWM6CisgICAgICAgIGEwOjllOmRmOmUwOmE1OjgyOjk2OmUzOmIxOjNmOmQ4OmE4OmYxOmNiOjc5OjgwOjhlOmY3OgorICAgICAgICBmMDo0NDo5OTo3ZToxNDpmNToyMzphMzoxMTplMzo2ODo0YjowNTozNjo2ZTo4ODplMzphYjoKKyAgICAgICAgODY6YWE6Mzg6NTM6MDM6NDI6M2I6ZDM6Yjk6Zjk6ZTA6YmY6MDU6ZTk6ZDM6NWY6YzM6NGE6CisgICAgICAgIGE3OmI2OmZkOmI3OjVkOjkwOjQ5OmY4OjlhOmIyOmFkOjY2OmE2OjgyOjAwOjkzOmFlOjYwOgorICAgICAgICBmZjoyMAorCitHVEUgQ3liZXJUcnVzdCBSb290IDIKKz09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiBCQTpFRDoxNzo1Nzo5QTo0QjpGRjo3QzpGOTpDOToxRjpBMjpDRDoxQTpENjo4NworUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUNVRENDQWJrQ0FnR2JNQTBHQ1NxR1NJYjNEUUVCQkFVQU1IQXhDekFKQmdOVkJBWVRBbFZUTVJnd0ZnWUQKK1ZRUUtFdzlIVkVVZ1EyOXljRzl5WVhScGIyNHhKekFsQmdOVkJBc1RIa2RVUlNCRGVXSmxjbFJ5ZFhOMElGTnYKK2JIVjBhVzl1Y3l3Z1NXNWpMakVlTUJ3R0ExVUVBeE1WUjFSRklFTjVZbVZ5VkhKMWMzUWdVbTl2ZENBeU1CNFgKK0RUazRNRGd4TVRFeE16VXdOMW9YRFRBNE1EZ3hNVEV4TWpJeE5sb3djREVMTUFrR0ExVUVCaE1DVlZNeEdEQVcKK0JnTlZCQW9URDBkVVJTQkRiM0p3YjNKaGRHbHZiakVuTUNVR0ExVUVDeE1lUjFSRklFTjVZbVZ5VkhKMWMzUWcKK1UyOXNkWFJwYjI1ekxDQkpibU11TVI0d0hBWURWUVFERXhWSFZFVWdRM2xpWlhKVWNuVnpkQ0JTYjI5MElESXcKK2daOHdEUVlKS29aSWh2Y05BUUVCQlFBRGdZMEFNSUdKQW9HQkFOa3NURTR2YVJvajQxYTY4ODZFd0FuQWVmRkUKK1h6TWZGWkYvaW9nb3VDUkZ6SThZelI5MDBiV1BjVXpXTWZaemxvU1VRTVdwZzJBa2ZhOXZOTGRMVE1JSmdEdEYKK0JKN0VQTVFuZFhzQURLRmtSN1VVWFlKTFVUcFl1MFJNUGRQbEJqam9ZVnlZZUx1QXM1emFjb0ppb04rY1grdjUKK1QzZkN6R0FZQUdzMGdpV3pBZ01CQUFFd0RRWUpLb1pJaHZjTkFRRUVCUUFEZ1lFQW8yU1JieER0NTI2aVFrQ1UKK2VNNzRGQWpSK2tPRjYwYk5raFRRN3k0dE5qa1kyYnJKSjRncDZVZ1hiL2pCcXNoaGJTMzlRQzExUXpDWE9mZ1UKK1pMMXY3Mk9vSzBMZnNsb05KZXg3TjlqT2tTbUNGdm5vWXFMaGRzUUNmZDBsaTVqaDlnMWdqUFpaa0VCUlJOSEMKKyt4a2tIaGM1YTNRaEZUUFdWZGVDSG5Bc0o2Zz0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDEgKDB4MCkKKyAgICAgICAgU2VyaWFsIE51bWJlcjogNDExICgweDE5YikKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBPPUdURSBDb3Jwb3JhdGlvbiwgT1U9R1RFIEN5YmVyVHJ1c3QgU29sdXRpb25zLCBJbmMuLCBDTj1HVEUgQ3liZXJUcnVzdCBSb290IDIKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IEF1ZyAxMSAxMTozNTowNyAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogQXVnIDExIDExOjIyOjE2IDIwMDggR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89R1RFIENvcnBvcmF0aW9uLCBPVT1HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4sIENOPUdURSBDeWJlclRydXN0IFJvb3QgMgorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6ZDk6MmM6NGM6NGU6MmY6Njk6MWE6MjM6ZTM6NTY6YmE6ZjM6Y2U6ODQ6CisgICAgICAgICAgICAgICAgICAgIGMwOjA5OmMwOjc5OmYxOjQ0OjVmOjMzOjFmOjE1OjkxOjdmOjhhOjg4OjI4OgorICAgICAgICAgICAgICAgICAgICBiODoyNDo0NTpjYzo4ZjoxODpjZDoxZjo3NDpkMTpiNTo4Zjo3MTo0YzpkNjoKKyAgICAgICAgICAgICAgICAgICAgMzE6ZjY6NzM6OTY6ODQ6OTQ6NDA6YzU6YTk6ODM6NjA6MjQ6N2Q6YWY6NmY6CisgICAgICAgICAgICAgICAgICAgIDM0OmI3OjRiOjRjOmMyOjA5OjgwOjNiOjQ1OjA0OjllOmM0OjNjOmM0OjI3OgorICAgICAgICAgICAgICAgICAgICA3NTo3YjowMDowYzphMTo2NDo0NzpiNToxNDo1ZDo4Mjo0Yjo1MTozYTo1ODoKKyAgICAgICAgICAgICAgICAgICAgYmI6NDQ6NGM6M2Q6ZDM6ZTU6MDY6Mzg6ZTg6NjE6NWM6OTg6Nzg6YmI6ODA6CisgICAgICAgICAgICAgICAgICAgIGIzOjljOmRhOjcyOjgyOjYyOmEwOmRmOjljOjVmOmViOmY5OjRmOjc3OmMyOgorICAgICAgICAgICAgICAgICAgICBjYzo2MDoxODowMDo2YjozNDo4MjoyNTpiMworICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBhMzo2NDo5MTo2ZjoxMDplZDplNzo2ZTphMjo0Mjo0MDo5NDo3ODpjZTpmODoxNDowODpkMToKKyAgICAgICAgZmE6NDM6ODU6ZWI6NDY6Y2Q6OTI6MTQ6ZDA6ZWY6MmU6MmQ6MzY6Mzk6MTg6ZDk6YmE6Yzk6CisgICAgICAgIDI3Ojg4OjI5OmU5OjQ4OjE3OjZmOmY4OmMxOmFhOmM4OjYxOjZkOjJkOmZkOjQwOjJkOjc1OgorICAgICAgICA0MzozMDo5NzozOTpmODoxNDo2NDpiZDo2ZjplZjo2MzphODoyYjo0MjpkZjpiMjo1YTowZDoKKyAgICAgICAgMjU6ZWM6N2I6Mzc6ZDg6Y2U6OTE6Mjk6ODI6MTY6Zjk6ZTg6NjI6YTI6ZTE6NzY6YzQ6MDI6CisgICAgICAgIDdkOmRkOjI1OjhiOjk4OmUxOmY2OjBkOjYwOjhjOmY2OjU5OjkwOjQwOjUxOjQ0OmQxOmMyOgorICAgICAgICBmYjoxOToyNDoxZToxNzozOTo2Yjo3NDoyMToxNTozMzpkNjo1NTpkNzo4MjoxZTo3MDoyYzoKKyAgICAgICAgMjc6YTgKKworR1RFIEN5YmVyVHJ1c3QgUm9vdCAzCis9PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogREI6ODE6OTY6NTc6QUU6NjQ6NjE6RUY6Nzc6QTc6ODM6QzQ6NTE6MjQ6M0M6ODcKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlDVURDQ0Fia0NBZ0dYTUEwR0NTcUdTSWIzRFFFQkJRVUFNSEF4Q3pBSkJnTlZCQVlUQWxWVE1SZ3dGZ1lECitWUVFLRXc5SFZFVWdRMjl5Y0c5eVlYUnBiMjR4SnpBbEJnTlZCQXNUSGtkVVJTQkRlV0psY2xSeWRYTjBJRk52CitiSFYwYVc5dWN5d2dTVzVqTGpFZU1Cd0dBMVVFQXhNVlIxUkZJRU41WW1WeVZISjFjM1FnVW05dmRDQXpNQjRYCitEVGs0TURneE1ERTVOVGt3T0ZvWERUQTRNRGd4TURFNU16WXpPVm93Y0RFTE1Ba0dBMVVFQmhNQ1ZWTXhHREFXCitCZ05WQkFvVEQwZFVSU0JEYjNKd2IzSmhkR2x2YmpFbk1DVUdBMVVFQ3hNZVIxUkZJRU41WW1WeVZISjFjM1FnCitVMjlzZFhScGIyNXpMQ0JKYm1NdU1SNHdIQVlEVlFRREV4VkhWRVVnUTNsaVpYSlVjblZ6ZENCU2IyOTBJRE13CitnWjh3RFFZSktvWklodmNOQVFFQkJRQURnWTBBTUlHSkFvR0JBT0h6c1NzTHp0d1UyVFNYWWxBU1ZtT0VURlA2Cit3SVhQK3NIZEQ5NTVFMzlUKzZvT1lOM2lZci9HN2s2Wk5LcG9ReldaK0tQOTgyTzlBVlJxbnJJNmxpeDdlQ2pHCitXcldOR2hVWS9lT01McUpRQ1Z0eDFnMjFHQjhaamdRcGs1TjRxMThVNTNOQzhnTU1WNkliVURzTHUxbmdvRG9ECis3aWNiV2t5NXNBakt1UnFKQWdNQkFBRXdEUVlKS29aSWh2Y05BUUVGQlFBRGdZRUFoZXV0bENBRzZiS2lhenZ5CitadXZqUzdnU0pnWGw5SkdvM0lmY21QU1V3ZlJodmRXY2JGRnpsVjdRdmRmbVJkdzh6MGFFMWVlNTdPUm5ZMjRBCitLSGR4WFVvRjZibDhoc3pDUkx2ZUtVamE2dDI5RjU4ZFVRR282QlJlc1ZmMy85cVB6cFgrTGUweUVuZi9mR3BoCitsYTR4Y2dZSThQbnpEWTdpNzZoVFhaRURnOTQ9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAxICgweDApCisgICAgICAgIFNlcmlhbCBOdW1iZXI6IDQwNyAoMHgxOTcpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9VVMsIE89R1RFIENvcnBvcmF0aW9uLCBPVT1HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4sIENOPUdURSBDeWJlclRydXN0IFJvb3QgMworICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogQXVnIDEwIDE5OjU5OjA4IDE5OTggR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBBdWcgMTAgMTk6MzY6MzkgMjAwOCBHTVQKKyAgICAgICAgU3ViamVjdDogQz1VUywgTz1HVEUgQ29ycG9yYXRpb24sIE9VPUdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLiwgQ049R1RFIEN5YmVyVHJ1c3QgUm9vdCAzCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDplMTpmMzpiMToyYjowYjpjZTpkYzoxNDpkOTozNDo5Nzo2Mjo1MDoxMjoKKyAgICAgICAgICAgICAgICAgICAgNTY6NjM6ODQ6NGM6NTM6ZmE6YzA6ODU6Y2Y6ZmE6YzE6ZGQ6MGY6ZGU6Nzk6CisgICAgICAgICAgICAgICAgICAgIDEzOjdmOjUzOmZiOmFhOjBlOjYwOmRkOmUyOjYyOmJmOmM2OmVlOjRlOjk5OgorICAgICAgICAgICAgICAgICAgICAzNDphYTo2ODo0MzozNTo5OTpmODphMzpmZDpmMzo2MzpiZDowMTo1NDo2YToKKyAgICAgICAgICAgICAgICAgICAgOWU6YjI6M2E6OTY6MmM6N2I6Nzg6Mjg6YzY6NWE6YjU6OGQ6MWE6MTU6MTg6CisgICAgICAgICAgICAgICAgICAgIGZkOmUzOjhjOjJlOmEyOjUwOjA5OjViOjcxOmQ2OjBkOmI1OjE4OjFmOjE5OgorICAgICAgICAgICAgICAgICAgICA4ZTowNDoyOTo5Mzo5Mzo3ODphYjo1ZjoxNDplNzo3Mzo0MjpmMjowMzowYzoKKyAgICAgICAgICAgICAgICAgICAgNTc6YTI6MWI6NTA6M2I6MGI6YmI6NTk6ZTA6YTA6M2E6MDM6ZWU6Mjc6MWI6CisgICAgICAgICAgICAgICAgICAgIDVhOjRjOmI5OmIwOjA4OmNhOmI5OjFhOjg5CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA4NTplYjphZDo5NDoyMDowNjplOTpiMjphMjo2YjozYjpmMjo2NjplYjplMzo0YjpiODoxMjoKKyAgICAgICAgMjY6MDU6ZTU6ZjQ6OTE6YTg6ZGM6ODc6ZGM6OTg6ZjQ6OTQ6YzE6ZjQ6NjE6YmQ6ZDU6OWM6CisgICAgICAgIDZjOjUxOjczOjk1OjVlOmQwOmJkOmQ3OmU2OjQ1OmRjOjNjOmNmOjQ2Ojg0OmQ1OmU3OmI5OgorICAgICAgICBlYzplNDo2Nzo2Mzo2ZTowMDoyODo3Nzo3MTo1ZDo0YTowNTplOTpiOTo3Yzo4NjpjYzpjMjoKKyAgICAgICAgNDQ6YmI6ZGU6Mjk6NDg6ZGE6ZWE6ZGQ6YmQ6MTc6OWY6MWQ6NTE6MDE6YTg6ZTg6MTQ6NWU6CisgICAgICAgIGIxOjU3OmY3OmZmOmRhOjhmOmNlOjk1OmZlOjJkOmVkOjMyOjEyOjc3OmZmOjdjOjZhOjYxOgorICAgICAgICA5NTphZTozMTo3MjowNjowODpmMDpmOTpmMzowZDo4ZTplMjplZjphODo1Mzo1ZDo5MTowMzoKKyAgICAgICAgODM6ZGUKKworR1RFIEN5YmVyVHJ1c3QgUm9vdCA0Cis9PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogMzM6NDM6MDI6QjE6Qjk6RTA6NzM6QjE6QjE6MjA6Q0E6Q0I6Qzc6ODQ6MDM6NTAKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEVlRDQ0FqMENBZ0dvTUEwR0NTcUdTSWIzRFFFQkJRVUFNSEF4Q3pBSkJnTlZCQVlUQWxWVE1SZ3dGZ1lECitWUVFLRXc5SFZFVWdRMjl5Y0c5eVlYUnBiMjR4SnpBbEJnTlZCQXNUSGtkVVJTQkRlV0psY2xSeWRYTjBJRk52CitiSFYwYVc5dWN5d2dTVzVqTGpFZU1Cd0dBMVVFQXhNVlIxUkZJRU41WW1WeVZISjFjM1FnVW05dmRDQTBNQjRYCitEVGs0TURneE16RXpOVEV3TUZvWERURXpNRGd4TXpJek5Ua3dNRm93Y0RFTE1Ba0dBMVVFQmhNQ1ZWTXhHREFXCitCZ05WQkFvVEQwZFVSU0JEYjNKd2IzSmhkR2x2YmpFbk1DVUdBMVVFQ3hNZVIxUkZJRU41WW1WeVZISjFjM1FnCitVMjlzZFhScGIyNXpMQ0JKYm1NdU1SNHdIQVlEVlFRREV4VkhWRVVnUTNsaVpYSlVjblZ6ZENCU2IyOTBJRFF3CitnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDNm5TSnVmOXBtUERsQ3NhTXFiOVAzCit2SzZzTVZyWEVaQkh1WjBaTHZuekd5S2d3K0dudXNUOFhncVVTNWhhU3lia0gvVGM4LzZPaU54c0xYeDNoeVpRCit3RjVPcUNpaDZoZHBUMDNHQVE3YW1nMEdWaVlWdHFSZGVqV3ZqZTE0VW9iNU9LdXpBZFBhQlpheHRsQ3J3S0d1CitGMVA2UXprZ2NXVWoyMjNFdHUyWVJZUFgwdmJpcVd2NytYWE03OFdyY1pZMTZOK09rWnVvRUhVZnQ4NFRqbXV6CitsbmVYR3BFdnh5eHBtZkFQS21nQW1IWkVHNHdvMHV1TzlJTzBmNlFsWG13NzJjWm8xV0c0MUY0eEI3VmJrRFZTCitWM3NYSU8wdHVCNk9pRGsrVXN2ZjhGeXhaYnVsRXJTUVk3OXhuVExCMnI5UVNwVytCanJFSyt2Tm1IWkVUUXZsCitBZ01CQUFFd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFFT3ZISWZKU2JwbGlUUkpQT29ITzBlaWVkU2dPNUJzCiszbitvVk1Qb1RFQXl2TWpzSE9YWnJFQzYvSXcvd25PYzlHVHEzNm50VGx2SUFXRHVPVzFESi9OL3FnalMvazV2CitGREpOZmVRMGdLVTF4TlpHVUxRN29DMWxIMDlsZmpRb0xjQ25kbjB4eVEwekZ2WWdHU0FSVUxzRHpIQnRscmZ2CitUS2ZhTmhYUHUwM1VsdHlJVFd5WTdibHovaWhYb08xaytBcUJLWFAyOXBjeWh6bTBnZS9aVFJvSE5QZTZRalhlCitWOXhjMXZmRjZ3b25ESUdtd3RCb1R2MlNXMGlEOWhhS2p6WmI3VEZzUDBGNmNmZVNQekdrQ2tCTTg0YmlZY0U4CitTWUV0cGJqdnVwY1B2Q3NkbTRueTBvNGVUWWJ5d3F2MkxabkFHeW9Ob2JaUCtTeFlUVDE5TndvPQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMSAoMHgwKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiA0MjQgKDB4MWE4KQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBPPUdURSBDb3Jwb3JhdGlvbiwgT1U9R1RFIEN5YmVyVHJ1c3QgU29sdXRpb25zLCBJbmMuLCBDTj1HVEUgQ3liZXJUcnVzdCBSb290IDQKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IEF1ZyAxMyAxMzo1MTowMCAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogQXVnIDEzIDIzOjU5OjAwIDIwMTMgR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89R1RFIENvcnBvcmF0aW9uLCBPVT1HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4sIENOPUdURSBDeWJlclRydXN0IFJvb3QgNAorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDIwNDggYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDIwNDggYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6YmE6OWQ6MjI6NmU6N2Y6ZGE6NjY6M2M6Mzk6NDI6YjE6YTM6MmE6NmY6CisgICAgICAgICAgICAgICAgICAgIGQzOmY3OmJjOmFlOmFjOjMxOjVhOmQ3OjExOjkwOjQ3OmI5OjlkOjE5OjJlOgorICAgICAgICAgICAgICAgICAgICBmOTpmMzoxYjoyMjphMDpjMzplMTphNzpiYTpjNDpmYzo1ZTowYTo5NDo0YjoKKyAgICAgICAgICAgICAgICAgICAgOTg6NWE6NGI6MjY6ZTQ6MWY6ZjQ6ZGM6ZjM6ZmU6OGU6ODg6ZGM6NmM6MmQ6CisgICAgICAgICAgICAgICAgICAgIDdjOjc3Ojg3OjI2OjUwOmMwOjVlOjRlOmE4OjI4OmExOmVhOjE3OjY5OjRmOgorICAgICAgICAgICAgICAgICAgICA0ZDpjNjowMTowZTpkYTo5YTowZDowNjo1NjoyNjoxNTpiNjphNDo1ZDo3YToKKyAgICAgICAgICAgICAgICAgICAgMzU6YWY6OGQ6ZWQ6Nzg6NTI6ODY6Zjk6Mzg6YWI6YjM6MDE6ZDM6ZGE6MDU6CisgICAgICAgICAgICAgICAgICAgIDk2OmIxOmI2OjUwOmFiOmMwOmExOmFlOjE3OjUzOmZhOjQzOjM5OjIwOjcxOgorICAgICAgICAgICAgICAgICAgICA2NToyMzpkYjo2ZDpjNDpiNjplZDo5ODo0NTo4MzpkNzpkMjpmNjplMjphOToKKyAgICAgICAgICAgICAgICAgICAgNmI6ZmI6Zjk6NzU6Y2M6ZWY6YzU6YWI6NzE6OTY6MzU6ZTg6ZGY6OGU6OTE6CisgICAgICAgICAgICAgICAgICAgIDliOmE4OjEwOjc1OjFmOmI3OmNlOjEzOjhlOjZiOmIzOjk2Ojc3Ojk3OjFhOgorICAgICAgICAgICAgICAgICAgICA5MToyZjpjNzoyYzo2OTo5OTpmMDowZjoyYTo2ODowMDo5ODo3Njo0NDoxYjoKKyAgICAgICAgICAgICAgICAgICAgOGM6Mjg6ZDI6ZWI6OGU6ZjQ6ODM6YjQ6N2Y6YTQ6MjU6NWU6NmM6M2I6ZDk6CisgICAgICAgICAgICAgICAgICAgIGM2OjY4OmQ1OjYxOmI4OmQ0OjVlOjMxOjA3OmI1OjViOjkwOjM1OjUyOjU3OgorICAgICAgICAgICAgICAgICAgICA3YjoxNzoyMDplZDoyZDpiODoxZTo4ZTo4ODozOTozZTo1MjpjYjpkZjpmMDoKKyAgICAgICAgICAgICAgICAgICAgNWM6YjE6NjU6YmI6YTU6MTI6YjQ6OTA6NjM6YmY6NzE6OWQ6MzI6YzE6ZGE6CisgICAgICAgICAgICAgICAgICAgIGJmOjUwOjRhOjk1OmJlOjA2OjNhOmM0OjJiOmViOmNkOjk4Ojc2OjQ0OjRkOgorICAgICAgICAgICAgICAgICAgICAwYjplNQorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgNDM6YWY6MWM6ODc6Yzk6NDk6YmE6NjU6ODk6MzQ6NDk6M2M6ZWE6MDc6M2I6NDc6YTI6Nzk6CisgICAgICAgIGQ0OmEwOjNiOjkwOjZjOmRlOjdmOmE4OjU0OmMzOmU4OjRjOjQwOjMyOmJjOmM4OmVjOjFjOgorICAgICAgICBlNTpkOTphYzo0MDpiYTpmYzo4YzozZjpjMjo3Mzo5YzpmNDo2NDplYTpkZjphOTplZDo0ZToKKyAgICAgICAgNWI6Yzg6MDE6NjA6ZWU6Mzk6NmQ6NDM6Mjc6ZjM6N2Y6YWE6MDg6ZDI6ZmU6NGU6NmY6MTQ6CisgICAgICAgIDMyOjRkOjdkOmU0OjM0OjgwOmE1OjM1OmM0OmQ2OjQ2OjUwOmI0OjNiOmEwOjJkOjY1OjFmOgorICAgICAgICA0Zjo2NTo3ZTozNDoyODoyZDpjMDphNzo3Njo3ZDozMTpjOTowZDozMzoxNjpmNjoyMDoxOToKKyAgICAgICAgMjA6MTE6NTA6YmI6MDM6Y2M6NzA6NmQ6OTY6Yjc6ZWY6NGM6YTc6ZGE6MzY6MTU6Y2Y6YmI6CisgICAgICAgIDRkOmQ0Ojk2OmRjOjg4OjRkOjZjOjk4OmVkOmI5OjczOmZlOjI4OjU3OmEwOmVkOjY0OmY4OgorICAgICAgICAwYTo4MToyOTo3MzpmNjpmNjo5NzozMjo4NzozOTpiNDo4MTplZjpkOTo0ZDoxYTowNzozNDoKKyAgICAgICAgZjc6YmE6NDI6MzU6ZGU6NTc6ZGM6NWM6ZDY6Zjc6YzU6ZWI6MGE6Mjc6MGM6ODE6YTY6YzI6CisgICAgICAgIGQwOjY4OjRlOmZkOjkyOjViOjQ4OjgzOmY2OjE2OjhhOjhmOjM2OjViOmVkOjMxOjZjOjNmOgorICAgICAgICA0MTo3YTo3MTpmNzo5MjozZjozMTphNDowYTo0MDo0YzpmMzo4NjplMjo2MTpjMTozYzo0OToKKyAgICAgICAgODE6MmQ6YTU6Yjg6ZWY6YmE6OTc6MGY6YmM6MmI6MWQ6OWI6ODk6ZjI6ZDI6OGU6MWU6NGQ6CisgICAgICAgIDg2OmYyOmMyOmFiOmY2OjJkOjk5OmMwOjFiOjJhOjBkOmExOmI2OjRmOmY5OjJjOjU4OjRkOgorICAgICAgICAzZDo3ZDozNzowYQorCitHVEUgQ3liZXJUcnVzdCBSb290IDUKKz09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiA3RDo2Qzo4NjpFNDpGQzo0RDpEMTowQjowMDpCQToyMjpCQjo0RTo3Qzo2QTo4RQorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUR0akNDQXA2Z0F3SUJBZ0lDQWJZd0RRWUpLb1pJaHZjTkFRRUZCUUF3Y0RFTE1Ba0dBMVVFQmhNQ1ZWTXgKK0dEQVdCZ05WQkFvVEQwZFVSU0JEYjNKd2IzSmhkR2x2YmpFbk1DVUdBMVVFQ3hNZVIxUkZJRU41WW1WeVZISjEKK2MzUWdVMjlzZFhScGIyNXpMQ0JKYm1NdU1SNHdIQVlEVlFRREV4VkhWRVVnUTNsaVpYSlVjblZ6ZENCU2IyOTAKK0lEVXdIaGNOT1Rnd09ERTBNVFExTURBd1doY05NVE13T0RFME1qTTFPVEF3V2pCd01Rc3dDUVlEVlFRR0V3SlYKK1V6RVlNQllHQTFVRUNoTVBSMVJGSUVOdmNuQnZjbUYwYVc5dU1TY3dKUVlEVlFRTEV4NUhWRVVnUTNsaVpYSlUKK2NuVnpkQ0JUYjJ4MWRHbHZibk1zSUVsdVl5NHhIakFjQmdOVkJBTVRGVWRVUlNCRGVXSmxjbFJ5ZFhOMElGSnYKK2IzUWdOVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMd1NiaitLZkhxWEFld2UKK3V6bGFBdlI0UktKSUc0NTdTVko2dUh0SHM2K1VtMis3bHZvcmFtVmN1QnlVYzc2L2lRb2lnTzVYL0l3RnUzQ2YKK2x6a0UycU9IWEtqbHlxL0FNNXJWTjF4THJPU0EwS1lqWVB2OWNpNlVuY2ZPd2dReTczaGdYZTJ0aHc5RlpSNDgKK21ncWF2bDBkbWV6bjh0SEdlaGZaclp0VWxuL0VmR0MvaGFvVk5SMUEyaEc4N0ZRaEtDMGpvYWp3enkzTjNmeCsKK0QxN2haUWRXeXdlMDBsYm9YakhNR0dQRWh0SXRoYytUa3F0dC9tZzUrOTV6dlliNDVFWjY2cDhNeS9RWi9tTzgKKzBTeDdpRE0yOXVUaG5BeFRnV0FjMmk2cmxxa1dpQk5RbWJLOVZkOFZNSDdvNVpqN2NINXN0UWY4L0VhMzBPMDMKK2xuNHkvaUVDQXdFQUFhTmFNRmd3RWdZRFZSMFRBUUgvQkFnd0JnRUIvd0lCQlRBT0JnTlZIUThCQWY4RUJBTUMKK0FRWXdGd1lEVlIwZ0JCQXdEakFNQmdvcWhraUcrR01CQWdFRE1Ca0dBMVVkRGdRU0JCQjJDa2toT0V5ZjN2akUKK1NjZHhjWkdkTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFCQk90UVlXOXE0M2lFYzRZNEo1ZkZvTlAvZWx2UUgKKzlhYzg4NnhLc1p2Nmt2cWI3ZVl5SWFwS2RzWGNUempsMzlXRzVOWElkbjJZMTdITmowMjFrU05zaTRycjZuenYKK0ZKVEV4dkFmU2kweWNXTXJZNUVtQWdtMmdCM3Q0c3k0Zjl1SFk4amgwR3dtc1RVZFFHWVFHODJWVkJnellld1QKK1Q5b1Q5NW12UHREUGpxWnlvclBEQlpySkozMlN6SDVTamJPcmNHMmVpWjlONnhwMXdwaXExUUlXMXd5S3Z5WGsKKzZ5MjhtT2xZT0JsOHVUZisyK0taQ0hNR3g1ZURhbjBRQVM4eXVSY0ZTbVhtTDg2K1hsT21ndW1hVXdxRWRDMkQKK3lzaVVGblpmbEdFbzhJV25PYnZYaTltb3NoTWRWQWswSkgwZ2dYMW1mcUtRZEZ3UXhyM3NxeHZDCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAzICgweDIpCisgICAgICAgIFNlcmlhbCBOdW1iZXI6IDQzOCAoMHgxYjYpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9VVMsIE89R1RFIENvcnBvcmF0aW9uLCBPVT1HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4sIENOPUdURSBDeWJlclRydXN0IFJvb3QgNQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogQXVnIDE0IDE0OjUwOjAwIDE5OTggR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBBdWcgMTQgMjM6NTk6MDAgMjAxMyBHTVQKKyAgICAgICAgU3ViamVjdDogQz1VUywgTz1HVEUgQ29ycG9yYXRpb24sIE9VPUdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLiwgQ049R1RFIEN5YmVyVHJ1c3QgUm9vdCA1CisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMjA0OCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMjA0OCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpiYzoxMjo2ZTozZjo4YTo3Yzo3YTo5NzowMTplYzoxZTpiYjozOTo1YToKKyAgICAgICAgICAgICAgICAgICAgMDI6ZjQ6Nzg6NDQ6YTI6NDg6MWI6OGU6N2I6NDk6NTI6N2E6Yjg6N2I6NDc6CisgICAgICAgICAgICAgICAgICAgIGIzOmFmOjk0OjliOjZmOmJiOjk2OmZhOjJiOjZhOjY1OjVjOmI4OjFjOjk0OgorICAgICAgICAgICAgICAgICAgICA3MzpiZTpiZjo4OTowYToyMjo4MDplZTo1NzpmYzo4YzowNTpiYjo3MDo5ZjoKKyAgICAgICAgICAgICAgICAgICAgOTc6Mzk6MDQ6ZGE6YTM6ODc6NWM6YTg6ZTU6Y2E6YWY6YzA6MzM6OWE6ZDU6CisgICAgICAgICAgICAgICAgICAgIDM3OjVjOjRiOmFjOmU0OjgwOmQwOmE2OjIzOjYwOmZiOmZkOjcyOjJlOjk0OgorICAgICAgICAgICAgICAgICAgICA5ZDpjNzpjZTpjMjowNDozMjplZjo3ODo2MDo1ZDplZDphZDo4NzowZjo0NToKKyAgICAgICAgICAgICAgICAgICAgNjU6MWU6M2M6OWE6MGE6OWE6YmU6NWQ6MWQ6OTk6ZWM6ZTc6ZjI6ZDE6YzY6CisgICAgICAgICAgICAgICAgICAgIDdhOjE3OmQ5OmFkOjliOjU0Ojk2OjdmOmM0OjdjOjYwOmJmOjg1OmFhOjE1OgorICAgICAgICAgICAgICAgICAgICAzNToxZDo0MDpkYToxMTpiYzplYzo1NDoyMToyODoyZDoyMzphMTphODpmMDoKKyAgICAgICAgICAgICAgICAgICAgY2Y6MmQ6Y2Q6ZGQ6ZmM6N2U6MGY6NWU6ZTE6NjU6MDc6NTY6Y2I6MDc6YjQ6CisgICAgICAgICAgICAgICAgICAgIGQyOjU2OmU4OjVlOjMxOmNjOjE4OjYzOmM0Ojg2OmQyOjJkOjg1OmNmOjkzOgorICAgICAgICAgICAgICAgICAgICA5MjphYjo2ZDpmZTo2ODozOTpmYjpkZTo3MzpiZDo4NjpmODplNDo0Njo3YToKKyAgICAgICAgICAgICAgICAgICAgZWE6OWY6MGM6Y2I6ZjQ6MTk6ZmU6NjM6YmM6ZDE6MmM6N2I6ODg6MzM6MzY6CisgICAgICAgICAgICAgICAgICAgIGY2OmU0OmUxOjljOjBjOjUzOjgxOjYwOjFjOmRhOjJlOmFiOjk2OmE5OjE2OgorICAgICAgICAgICAgICAgICAgICA4ODoxMzo1MDo5OTpiMjpiZDo1NTpkZjoxNTozMDo3ZTplODplNTo5ODpmYjoKKyAgICAgICAgICAgICAgICAgICAgNzA6N2U6NmM6YjU6MDc6ZmM6ZmM6NDY6Yjc6ZDA6ZWQ6Mzc6OTY6N2U6MzI6CisgICAgICAgICAgICAgICAgICAgIGZlOjIxCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogY3JpdGljYWwKKyAgICAgICAgICAgICAgICBDQTpUUlVFLCBwYXRobGVuOjUKKyAgICAgICAgICAgIFg1MDl2MyBLZXkgVXNhZ2U6IGNyaXRpY2FsCisgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUgU2lnbiwgQ1JMIFNpZ24KKyAgICAgICAgICAgIFg1MDl2MyBDZXJ0aWZpY2F0ZSBQb2xpY2llczogCisgICAgICAgICAgICAgICAgUG9saWN5OiAxLjIuODQwLjExMzc2My4xLjIuMS4zCisKKyAgICAgICAgICAgIFg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICA3NjowQTo0OToyMTozODo0Qzo5RjpERTpGODpDNDo0OTpDNzo3MTo3MTo5MTo5RAorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA0MTozYTpkNDoxODo1YjpkYTpiODpkZToyMToxYzplMTo4ZTowOTplNTpmMTo2ODozNDpmZjoKKyAgICAgICAgZGU6OTY6ZjQ6MDc6ZjU6YTc6M2M6ZjM6YWM6NGE6YjE6OWI6ZmE6OTI6ZmE6OWI6ZWQ6ZTY6CisgICAgICAgIDMyOjIxOmFhOjRhOjc2OmM1OmRjOjRmOjM4OmU1OmRmOmQ1Ojg2OmU0OmQ1OmM4Ojc2OjdkOgorICAgICAgICA5ODpkNzpiMTpjZDo4Zjo0ZDpiNTo5MToyMzo2Yzo4Yjo4YTplYjplYTo3YzplZjoxNDo5NDoKKyAgICAgICAgYzQ6YzY6ZjA6MWY6NGE6MmQ6MzI6NzE6NjM6MmI6NjM6OTE6MjY6MDI6MDk6YjY6ODA6MWQ6CisgICAgICAgIGVkOmUyOmNjOmI4OjdmOmRiOjg3OjYzOmM4OmUxOmQwOjZjOjI2OmIxOjM1OjFkOjQwOjY2OgorICAgICAgICAxMDoxYjpjZDo5NTo1NDoxODozMzo2MTplYzoxMzo0ZjpkYToxMzpmNzo5OTphZjozZTpkMDoKKyAgICAgICAgY2Y6OGU6YTY6NzI6YTI6YjM6YzM6MDU6OWE6Yzk6Mjc6N2Q6OTI6Y2M6N2U6NTI6OGQ6YjM6CisgICAgICAgIGFiOjcwOjZkOjllOjg5OjlmOjRkOmViOjFhOjc1OmMyOjk4OmFhOmQ1OjAyOjE2OmQ3OjBjOgorICAgICAgICA4YTpiZjoyNTplNDplYjoyZDpiYzo5ODplOTo1ODozODoxOTo3YzpiOTozNzpmZTpkYjplMjoKKyAgICAgICAgOTk6MDg6NzM6MDY6Yzc6OTc6ODM6NmE6N2Q6MTA6MDE6MmY6MzI6Yjk6MTc6MDU6NGE6NjU6CisgICAgICAgIGU2OjJmOmNlOmJlOjVlOjUzOmE2OjgyOmU5OjlhOjUzOjBhOjg0Ojc0OjJkOjgzOmNhOmM4OgorICAgICAgICA5NDoxNjo3Njo1Zjo5NDo2MToyODpmMDo4NTphNzozOTpiYjpkNzo4YjpkOTphODpiMjoxMzoKKyAgICAgICAgMWQ6NTQ6MDk6MzQ6MjQ6N2Q6MjA6ODE6N2Q6NjY6N2U6YTI6OTA6NzQ6NWM6MTA6YzY6YmQ6CisgICAgICAgIGVjOmFiOjFiOmMyCisKK0dURSBDeWJlclRydXN0IFJvb3QgQ0EKKz09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogQzQ6RDc6RjA6QjI6QTM6QzU6N0Q6NjE6Njc6RjA6MDQ6Q0Q6NDM6RDM6QkE6NTgKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlCK2pDQ0FXTUNBZ0dqTUEwR0NTcUdTSWIzRFFFQkJBVUFNRVV4Q3pBSkJnTlZCQVlUQWxWVE1SZ3dGZ1lECitWUVFLRXc5SFZFVWdRMjl5Y0c5eVlYUnBiMjR4SERBYUJnTlZCQU1URTBkVVJTQkRlV0psY2xSeWRYTjBJRkp2CitiM1F3SGhjTk9UWXdNakl6TWpNd01UQXdXaGNOTURZd01qSXpNak0xT1RBd1dqQkZNUXN3Q1FZRFZRUUdFd0pWCitVekVZTUJZR0ExVUVDaE1QUjFSRklFTnZjbkJ2Y21GMGFXOXVNUnd3R2dZRFZRUURFeE5IVkVVZ1EzbGlaWEpVCitjblZ6ZENCU2IyOTBNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0JnUUM0NWsrNjI1aDhjWHl2CitSTGZURDBiWlpPV1R3VUtPeDdwSmpUVXRldWVMdmVVRk1WbkdzUzhLRFB1ZnB6K2lDV2FFVmg0M0tSdUg2WDRNCit5cHFmcFgvMUZaU2oxYUpHZ3Rob1RORTNGUVpvcjczNHNMUHdLZldWV2drV1lYY0tJaVhVVDBXcXg3M2xsdC81CisxS2lPUXN3a3dCNlJKMHExYlFhQVl6bkVvbDQ0QXdJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQkFVQUE0R0JBQkt6CitkY1pmSGVGaFZZQUExSUZMZXpFUEkyUG5QZk1EK2ZRMnFMdlo0NldYVGVvcktlRFdhbk9CNXNDSm85UHg0S1dsCitJamVhWThKSUlMVGJjdVBJOXRsOHZyR3ZVOW9VdENHNDF0V1c0LzVPREZsaXRwcEsrVUxkakcrQnFYSC85QXB5CitiVzFFRHAzemRIU28xVFJKNlY2ZTZiUjY0ZVZhSDRRd25OT2ZwU1hZCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAxICgweDApCisgICAgICAgIFNlcmlhbCBOdW1iZXI6IDQxOSAoMHgxYTMpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1VUywgTz1HVEUgQ29ycG9yYXRpb24sIENOPUdURSBDeWJlclRydXN0IFJvb3QKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IEZlYiAyMyAyMzowMTowMCAxOTk2IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogRmViIDIzIDIzOjU5OjAwIDIwMDYgR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89R1RFIENvcnBvcmF0aW9uLCBDTj1HVEUgQ3liZXJUcnVzdCBSb290CisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpiODplNjo0ZjpiYTpkYjo5ODo3Yzo3MTo3YzphZjo0NDpiNzpkMzowZjoKKyAgICAgICAgICAgICAgICAgICAgNDY6ZDk6NjQ6ZTU6OTM6YzE6NDI6OGU6Yzc6YmE6NDk6OGQ6MzU6MmQ6N2E6CisgICAgICAgICAgICAgICAgICAgIGU3OjhiOmJkOmU1OjA1OjMxOjU5OmM2OmIxOjJmOjBhOjBjOmZiOjlmOmE3OgorICAgICAgICAgICAgICAgICAgICAzZjphMjowOTo2Njo4NDo1NjoxZTozNzoyOToxYjo4NzplOTo3ZTowYzpjYToKKyAgICAgICAgICAgICAgICAgICAgOWE6OWY6YTU6N2Y6ZjU6MTU6OTQ6YTM6ZDU6YTI6NDY6ODI6ZDg6Njg6NGM6CisgICAgICAgICAgICAgICAgICAgIGQxOjM3OjE1OjA2OjY4OmFmOmJkOmY4OmIwOmIzOmYwOjI5OmY1Ojk1OjVhOgorICAgICAgICAgICAgICAgICAgICAwOToxNjo2MTo3NzowYToyMjoyNTpkNDo0Zjo0NTphYTpjNzpiZDplNTo5NjoKKyAgICAgICAgICAgICAgICAgICAgZGY6Zjk6ZDQ6YTg6OGU6NDI6Y2M6MjQ6YzA6MWU6OTE6Mjc6NGE6YjU6NmQ6CisgICAgICAgICAgICAgICAgICAgIDA2OjgwOjYzOjM5OmM0OmEyOjVlOjM4OjAzCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDEyOmIzOjc1OmM2OjVmOjFkOmUxOjYxOjU1OjgwOjAwOmQ0OjgxOjRiOjdiOjMxOjBmOjIzOgorICAgICAgICA2MzplNzozZDpmMzowMzpmOTpmNDozNjphODpiYjpkOTplMzphNTo5Nzo0ZDplYToyYjoyOToKKyAgICAgICAgZTA6ZDY6NmE6NzM6ODE6ZTY6YzA6ODk6YTM6ZDM6ZjE6ZTA6YTU6YTU6MjI6Mzc6OWE6NjM6CisgICAgICAgIGMyOjQ4OjIwOmI0OmRiOjcyOmUzOmM4OmY2OmQ5OjdjOmJlOmIxOmFmOjUzOmRhOjE0OmI0OgorICAgICAgICAyMTpiODpkNjpkNTo5NjplMzpmZTo0ZTowYzo1OTo2MjpiNjo5YTo0YTpmOTo0MjpkZDo4YzoKKyAgICAgICAgNmY6ODE6YTk6NzE6ZmY6ZjQ6MGE6NzI6NmQ6NmQ6NDQ6MGU6OWQ6ZjM6NzQ6NzQ6YTg6ZDU6CisgICAgICAgIDM0OjQ5OmU5OjVlOjllOmU5OmI0OjdhOmUxOmU1OjVhOjFmOjg0OjMwOjljOmQzOjlmOmE1OgorICAgICAgICAyNTpkOAorCitHbG9iYWxTaWduIFBhcnRuZXJzIENBCis9PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IDNDOjc1OkNEOjRDOkJEOkE5OkQwOjhBOjc5OjRGOjUwOjE2OjM3Ojg0OkY0OjJCCitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRG5qQ0NBb2FnQXdJQkFnSUxBZ0FBQUFBQTFuaTUwYTh3RFFZSktvWklodmNOQVFFRUJRQXdWekVMTUFrRworQTFVRUJoTUNRa1V4R1RBWEJnTlZCQW9URUVkc2IySmhiRk5wWjI0Z2JuWXRjMkV4RURBT0JnTlZCQXNUQjFKdgorYjNRZ1EwRXhHekFaQmdOVkJBTVRFa2RzYjJKaGJGTnBaMjRnVW05dmRDQkRRVEFlRncwNU9UQXhNamd4TWpBdworTURCYUZ3MHdPVEF4TWpneE1qQXdNREJhTUY4eEN6QUpCZ05WQkFZVEFrSkZNUmt3RndZRFZRUUtFeEJIYkc5aQorWVd4VGFXZHVJRzUyTFhOaE1SUXdFZ1lEVlFRTEV3dFFZWEowYm1WeWN5QkRRVEVmTUIwR0ExVUVBeE1XUjJ4dgorWW1Gc1UybG5iaUJRWVhKMGJtVnljeUJEUVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQworZ2dFQkFOSXMrREtzU2hKNk44Z3BrYVd1akc0ZURzQTBNNGpsTTNFV0hIaUVhTU1ZTkZBdUZqNnhsSUpQc1pxZgorQVBqR0VUWEdhWHVZQXEwQUJvaHM1MHd6S0FDSUowWWZoN054ZFdPOE1ydUkzbVlZRGxBR2s3VDJ2QlEzTUQwaQorM3ozL2RYN1pDaHJGbjdQODBLeXpDSHFKMHdIb0FGem5TZ3M5VFhzbW9yZGlCb3ZhUnQyVEZ6OC9Xd0pMQzdhSQorSUJHU0FLMjd4eTdVNDBXdTlZbGFmSTJrcllWa01zQW5qTWJ5aW9DU2hpUldXWTEwYUtLRFFyT2VQVkJCaG04ZworYnZiOXp0TVo0ekxNaisyYVhtMGZLUFZTckc0WVh2ZzkwWkxsdW13QmlFc0s4aTNlWlRNRlFxQk1xakYydnYyLworZ1hqNWNSeEdYaTBWbFMwd1dZNU1RZEZpcXowQ0F3RUFBYU5qTUdFd0RnWURWUjBQQVFIL0JBUURBZ0FHTUIwRworQTFVZERnUVdCQlJESkkxd0ZRaGlWWnhQREVBWFhZWmVENkpNK3pBZkJnTlZIU01FR0RBV2dCUmdlMllhUlEyWAoreW9sUUwzMEV6VFNvLy96OVN6QVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BMEdDU3FHU0liM0RRRUJCQVVBQTRJQgorQVFCbTdiU0lhUkdaZ2lHRHJLRnRpNXVFclE4dHlCNk15bnQrcmFyVWp0NEgxcDVGeDZXNG5BYzVZQ1ZWR3NCUAorR2VYUEZ5bEppUmcxWnVYcktFQk9WOG12cytTNElBV2pPNVZRa1VtVUtYMHM1WWhCcFVXSVhwMkNKL2ZTNzF1MQorVDUrKy9qVmxMRlZrbitGUjJpSmhkN3BZVG8vR2VWbFpiakNBb2srUWJpRUxyZEJvT1pBUW0rMGlaVzhlRVRqbQorZjR6Uzh6bHRSOVVoNk9wMU9rSFJyZllXblYwTEliM3pIMk1HSlIzQkh6VnhMT3NnR2RYQnNPdzk1Vy90QWdjLworRTN0bWt0WkV3WmozWDFDTGVsdkNiMjJ3MGZqbGRLQkFONk1sRCtROXltUXhrNUJjTUh1NU9UR2FYa3pOdVVGUAorVU9ROU9LN0ladG5ITzExUlI2eWJxL0t0CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAzICgweDIpCisgICAgICAgIFNlcmlhbCBOdW1iZXI6CisgICAgICAgICAgICAwMjowMDowMDowMDowMDowMDpkNjo3ODpiOTpkMTphZgorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9QkUsIE89R2xvYmFsU2lnbiBudi1zYSwgT1U9Um9vdCBDQSwgQ049R2xvYmFsU2lnbiBSb290IENBCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBKYW4gMjggMTI6MDA6MDAgMTk5OSBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEphbiAyOCAxMjowMDowMCAyMDA5IEdNVAorICAgICAgICBTdWJqZWN0OiBDPUJFLCBPPUdsb2JhbFNpZ24gbnYtc2EsIE9VPVBhcnRuZXJzIENBLCBDTj1HbG9iYWxTaWduIFBhcnRuZXJzIENBCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMjA0OCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMjA0OCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpkMjoyYzpmODozMjphYzo0YToxMjo3YTozNzpjODoyOTo5MTphNTphZToKKyAgICAgICAgICAgICAgICAgICAgOGM6NmU6MWU6MGU6YzA6MzQ6MzM6ODg6ZTU6MzM6NzE6MTY6MWM6Nzg6ODQ6CisgICAgICAgICAgICAgICAgICAgIDY4OmMzOjE4OjM0OjUwOjJlOjE2OjNlOmIxOjk0OjgyOjRmOmIxOjlhOjlmOgorICAgICAgICAgICAgICAgICAgICAwMDpmODpjNjoxMTozNTpjNjo2OTo3Yjo5ODowMjphZDowMDowNjo4ODo2YzoKKyAgICAgICAgICAgICAgICAgICAgZTc6NGM6MzM6Mjg6MDA6ODg6Mjc6NDY6MWY6ODc6YjM6NzE6NzU6NjM6YmM6CisgICAgICAgICAgICAgICAgICAgIDMyOmJiOjg4OmRlOjY2OjE4OjBlOjUwOjA2OjkzOmI0OmY2OmJjOjE0OjM3OgorICAgICAgICAgICAgICAgICAgICAzMDozZDoyMjpkZjozZDpmZjo3NTo3ZTpkOTowYToxYTpjNTo5ZjpiMzpmYzoKKyAgICAgICAgICAgICAgICAgICAgZDA6YWM6YjM6MDg6N2E6ODk6ZDM6MDE6ZTg6MDA6NWM6ZTc6NGE6MGI6M2Q6CisgICAgICAgICAgICAgICAgICAgIDRkOjdiOjI2OmEyOmI3OjYyOjA2OjhiOmRhOjQ2OmRkOjkzOjE3OjNmOjNmOgorICAgICAgICAgICAgICAgICAgICA1YjowMjo0YjowYjpiNjo4ODoyMDoxMTo5MjowMDphZDpiYjpjNzoyZTpkNDoKKyAgICAgICAgICAgICAgICAgICAgZTM6NDU6YWU6ZjU6ODk6NWE6N2M6OGQ6YTQ6YWQ6ODU6NjQ6MzI6YzA6Mjc6CisgICAgICAgICAgICAgICAgICAgIDhjOmM2OmYyOjhhOjgwOjkyOjg2OjI0OjU2OjU5OjhkOjc0OjY4OmEyOjgzOgorICAgICAgICAgICAgICAgICAgICA0MjpiMzo5ZTozZDo1MDo0MTo4Njo2ZjoyMDo2ZTpmNjpmZDpjZTpkMzoxOToKKyAgICAgICAgICAgICAgICAgICAgZTM6MzI6Y2M6OGY6ZWQ6OWE6NWU6NmQ6MWY6Mjg6ZjU6NTI6YWM6NmU6MTg6CisgICAgICAgICAgICAgICAgICAgIDVlOmY4OjNkOmQxOjkyOmU1OmJhOjZjOjAxOjg4OjRiOjBhOmYyOjJkOmRlOgorICAgICAgICAgICAgICAgICAgICA2NTozMzowNTo0MjphMDo0YzphYTozMTo3NjpiZTpmZDpiZjo4MTo3ODpmOToKKyAgICAgICAgICAgICAgICAgICAgNzE6MWM6NDY6NWU6MmQ6MTU6OTU6MmQ6MzA6NTk6OGU6NGM6NDE6ZDE6NjI6CisgICAgICAgICAgICAgICAgICAgIGFiOjNkCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIFg1MDl2MyBLZXkgVXNhZ2U6IGNyaXRpY2FsCisgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUgU2lnbiwgQ1JMIFNpZ24KKyAgICAgICAgICAgIFg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICA0MzoyNDo4RDo3MDoxNTowODo2Mjo1NTo5Qzo0RjowQzo0MDoxNzo1RDo4Njo1RTowRjpBMjo0QzpGQgorICAgICAgICAgICAgWDUwOXYzIEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAga2V5aWQ6NjA6N0I6NjY6MUE6NDU6MEQ6OTc6Q0E6ODk6NTA6MkY6N0Q6MDQ6Q0Q6MzQ6QTg6RkY6RkM6RkQ6NEIKKworICAgICAgICAgICAgWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzOiBjcml0aWNhbAorICAgICAgICAgICAgICAgIENBOlRSVUUKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA2NjplZDpiNDo4ODo2OToxMTo5OTo4MjoyMTo4MzphYzphMTo2ZDo4Yjo5Yjo4NDphZDowZjoKKyAgICAgICAgMmQ6Yzg6MWU6OGM6Y2E6N2I6N2U6YWQ6YWE6ZDQ6OGU6ZGU6MDc6ZDY6OWU6NDU6Yzc6YTU6CisgICAgICAgIGI4OjljOjA3OjM5OjYwOjI1OjU1OjFhOmMwOjRmOjE5OmU1OmNmOjE3OjI5OjQ5Ojg5OjE4OgorICAgICAgICAzNTo2NjplNTplYjoyODo0MDo0ZTo1NzpjOTphZjpiMzplNDpiODoyMDowNTphMzozYjo5NToKKyAgICAgICAgNTA6OTE6NDk6OTQ6Mjk6N2Q6MmM6ZTU6ODg6NDE6YTU6NDU6ODg6NWU6OWQ6ODI6Mjc6Zjc6CisgICAgICAgIGQyOmVmOjViOmI1OjRmOjlmOmJlOmZlOjM1OjY1OjJjOjU1OjY0OjlmOmUxOjUxOmRhOjIyOgorICAgICAgICA2MTo3NzpiYTo1ODo0ZTo4ZjpjNjo3OTo1OTo1OTo2ZTozMDo4MDphMjo0Zjo5MDo2ZToyMToKKyAgICAgICAgMGI6YWQ6ZDA6Njg6Mzk6OTA6MTA6OWI6ZWQ6MjI6NjU6NmY6MWU6MTE6Mzg6ZTY6N2Y6OGM6CisgICAgICAgIGQyOmYzOjM5OjZkOjQ3OmQ1OjIxOmU4OmVhOjc1OjNhOjQxOmQxOmFkOmY2OjE2OjlkOjVkOgorICAgICAgICAwYjoyMTpiZDpmMzoxZjo2MzowNjoyNToxZDpjMToxZjozNTo3MToyYzplYjoyMDoxOTpkNToKKyAgICAgICAgYzE6YjA6ZWM6M2Q6ZTU6NmY6ZWQ6MDI6MDc6M2Y6MTM6N2I6NjY6OTI6ZDY6NDQ6YzE6OTg6CisgICAgICAgIGY3OjVmOjUwOjhiOjdhOjViOmMyOjZmOjZkOmIwOmQxOmY4OmU1Ojc0OmEwOjQwOjM3OmEzOgorICAgICAgICAyNTowZjplNDozZDpjYTo2NDozMTo5Mzo5MDo1YzozMDo3YjpiOTozOTozMTo5YTo1ZTo0YzoKKyAgICAgICAgY2Q6Yjk6NDE6NGY6NTA6ZTQ6M2Q6Mzg6YWU6Yzg6NjY6ZDk6Yzc6M2I6NWQ6NTE6NDc6YWM6CisgICAgICAgIDliOmFiOmYyOmFkCisKK0dsb2JhbFNpZ24gUHJpbWFyeSBDbGFzcyAxIENBCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiA1QzpBQzo1OTowMTpBNDo4Njo1MzpDQjoxMDo2NjpCNTpENjpENjo3MTpGRjowMQorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURyRENDQXBTZ0F3SUJBZ0lMQWdBQUFBQUExbmk0Tjg4d0RRWUpLb1pJaHZjTkFRRUVCUUF3VnpFTE1Ba0cKK0ExVUVCaE1DUWtVeEdUQVhCZ05WQkFvVEVFZHNiMkpoYkZOcFoyNGdibll0YzJFeEVEQU9CZ05WQkFzVEIxSnYKK2IzUWdRMEV4R3pBWkJnTlZCQU1URWtkc2IySmhiRk5wWjI0Z1VtOXZkQ0JEUVRBZUZ3MDVPREE1TVRVeE1qQXcKK01EQmFGdzB3T1RBeE1qZ3hNakF3TURCYU1HMHhDekFKQmdOVkJBWVRBa0pGTVJrd0Z3WURWUVFLRXhCSGJHOWkKK1lXeFRhV2R1SUc1MkxYTmhNUnN3R1FZRFZRUUxFeEpRY21sdFlYSjVJRU5zWVhOeklERWdRMEV4SmpBa0JnTlYKK0JBTVRIVWRzYjJKaGJGTnBaMjRnVUhKcGJXRnllU0JEYkdGemN5QXhJRU5CTUlJQklqQU5CZ2txaGtpRzl3MEIKK0FRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXZTQTFSOUVvMWdpakVqa2pSdzI5Y0NGU0RsY3hsYVkwVjJ2c2ZrTjUKK3d3WlNTTTI4dGFHWnZkZ2ZNcnpQMTI1eWJTNTNJcENDVGt1UG1nd0JRcHJaY0ZtMm5SL21ZOUVNclIxTytJV0IKKythN3ZuNlpTWVVSNUduVkY0R0ZXUlcxQ2pEMXl5NmFrRXJlYTlkWmcwR0JRczQ2bXB1eTA5QkxOZjZqTzc3UGgKK2hURCtjc1RtNTNlem5saEIxbEdEaUFmR3RtbFBOdDdSQzBnL3ZkYWZJWFJrYnljR1BrdjlEcWFidjZSSVY0eVEKKzdva1lDd0tCR0w1bi9sTmdpQ2U2bzNNMFMxcFd0TjV6QmUyWWxsM3NTdWRBL0VzSll1dlE0ekZQaGRGNnExbG4KK0svdUlEK3VxZzcwMS9XRW43R1lPUWxmM2FjSU03L3hxd201SjJvOUJPSzVJcVFJREFRQUJvMk13WVRBT0JnTlYKK0hROEJBZjhFQkFNQ0FBWXdIUVlEVlIwT0JCWUVGUHpnWnZaYU5abnJRQjdTdUI1RHZKaU9INHJETUI4R0ExVWQKK0l3UVlNQmFBRkdCN1pocEZEWmZLaVZBdmZRVE5OS2ovL1AxTE1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUoKK0tvWklodmNOQVFFRUJRQURnZ0VCQUp1akNFVE84cENkY2ZNeXN3VnF0ZXJQS1pqZVZUNmdGbjBHZWtUV3I5TDYKK0UxaU0rQnpIcXgyMEcrOXBhSmhjQ0RtUDRQZjdTTXdoNTdnejJ3V3FOQ1JzU3VYcGUyRGVnN01mQ3I1QmRmek0KK01FaTN3U1lkQkRPcXRuanRLc3U2VnBjeWJ2Y3hsUzVHOGhUdUo4ZjNZb201WEZyVE9JcGs5VGUwOGJNMGN0WFYKK0lUMUwxM2lUMXpGbU5SNmoyRWRKYnh5dDRZQi8rSmdrYkhPc0RzSWFkd0tqSmdlM3gydGR2SUxWS2tnZFk4OVEKK01xYjdIQmhIRlFwYkRGdzRKSm9FbUtnSVNGOThOSWRqcXkyTlRBQjNsQnQydXZVV0dLTVZyeStVOWlrQWRzRVYKK0Y5UHBOMDEyMU10TEtWa2tyTnBLb09wajNsOVVzZnJ6MFVYTHhXUzBjeUU9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAzICgweDIpCisgICAgICAgIFNlcmlhbCBOdW1iZXI6CisgICAgICAgICAgICAwMjowMDowMDowMDowMDowMDpkNjo3ODpiODozNzpjZgorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9QkUsIE89R2xvYmFsU2lnbiBudi1zYSwgT1U9Um9vdCBDQSwgQ049R2xvYmFsU2lnbiBSb290IENBCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBTZXAgMTUgMTI6MDA6MDAgMTk5OCBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEphbiAyOCAxMjowMDowMCAyMDA5IEdNVAorICAgICAgICBTdWJqZWN0OiBDPUJFLCBPPUdsb2JhbFNpZ24gbnYtc2EsIE9VPVByaW1hcnkgQ2xhc3MgMSBDQSwgQ049R2xvYmFsU2lnbiBQcmltYXJ5IENsYXNzIDEgQ0EKKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgyMDQ4IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgyMDQ4IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmJkOjIwOjM1OjQ3OmQxOjI4OmQ2OjA4OmEzOjEyOjM5OjIzOjQ3OjBkOgorICAgICAgICAgICAgICAgICAgICBiZDo3MDoyMTo1MjowZTo1NzozMTo5NTphNjozNDo1Nzo2YjplYzo3ZTo0MzoKKyAgICAgICAgICAgICAgICAgICAgNzk6YzM6MDY6NTI6NDg6Y2Q6YmM6YjU6YTE6OTk6YmQ6ZDg6MWY6MzI6YmM6CisgICAgICAgICAgICAgICAgICAgIGNmOmQ3OjZlOjcyOjZkOjJlOjc3OjIyOjkwOjgyOjRlOjRiOjhmOjlhOjBjOgorICAgICAgICAgICAgICAgICAgICAwMTo0Mjo5YTpkOTo3MDo1OTpiNjo5ZDoxZjplNjo2MzpkMTowYzphZDoxZDoKKyAgICAgICAgICAgICAgICAgICAgNGU6Zjg6ODU6ODE6Zjk6YWU6ZWY6OWY6YTY6NTI6NjE6NDQ6Nzk6MWE6NzU6CisgICAgICAgICAgICAgICAgICAgIDQ1OmUwOjYxOjU2OjQ1OjZkOjQyOjhjOjNkOjcyOmNiOmE2OmE0OjEyOmI3OgorICAgICAgICAgICAgICAgICAgICA5YTpmNTpkNjo2MDpkMDo2MDo1MDpiMzo4ZTphNjphNjplYzpiNDpmNDoxMjoKKyAgICAgICAgICAgICAgICAgICAgY2Q6N2Y6YTg6Y2U6ZWY6YjM6ZTE6ODU6MzA6ZmU6NzI6YzQ6ZTY6ZTc6Nzc6CisgICAgICAgICAgICAgICAgICAgIGIzOjllOjU4OjQxOmQ2OjUxOjgzOjg4OjA3OmM2OmI2OjY5OjRmOjM2OmRlOgorICAgICAgICAgICAgICAgICAgICBkMTowYjo0ODozZjpiZDpkNjo5ZjoyMTo3NDo2NDo2ZjoyNzowNjozZTo0YjoKKyAgICAgICAgICAgICAgICAgICAgZmQ6MGU6YTY6OWI6YmY6YTQ6NDg6NTc6OGM6OTA6ZWU6ODk6MTg6MGI6MDI6CisgICAgICAgICAgICAgICAgICAgIDgxOjE4OmJlOjY3OmZlOjUzOjYwOjg4OjI3OmJhOmEzOjczOjM0OjRiOjVhOgorICAgICAgICAgICAgICAgICAgICA1NjpiNDpkZTo3MzowNTplZDo5ODo5Njo1ZDplYzo0YTplNzo0MDpmYzo0YjoKKyAgICAgICAgICAgICAgICAgICAgMDk6NjI6ZWI6ZDA6ZTM6MzE6NGY6ODU6ZDE6N2E6YWI6NTk6Njc6MmI6ZmI6CisgICAgICAgICAgICAgICAgICAgIDg4OjBmOmViOmFhOjgzOmJkOjM1OmZkOjYxOjI3OmVjOjY2OjBlOjQyOjU3OgorICAgICAgICAgICAgICAgICAgICBmNzo2OTpjMjowYzplZjpmYzo2YTpjMjo2ZTo0OTpkYTo4Zjo0MTozODphZToKKyAgICAgICAgICAgICAgICAgICAgNDg6YTkKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgICAgIFg1MDl2MyBleHRlbnNpb25zOgorICAgICAgICAgICAgWDUwOXYzIEtleSBVc2FnZTogY3JpdGljYWwKKyAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZSBTaWduLCBDUkwgU2lnbgorICAgICAgICAgICAgWDUwOXYzIFN1YmplY3QgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIEZDOkUwOjY2OkY2OjVBOjM1Ojk5OkVCOjQwOjFFOkQyOkI4OjFFOjQzOkJDOjk4OjhFOjFGOjhBOkMzCisgICAgICAgICAgICBYNTA5djMgQXV0aG9yaXR5IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICBrZXlpZDo2MDo3Qjo2NjoxQTo0NTowRDo5NzpDQTo4OTo1MDoyRjo3RDowNDpDRDozNDpBODpGRjpGQzpGRDo0QgorCisgICAgICAgICAgICBYNTA5djMgQmFzaWMgQ29uc3RyYWludHM6IGNyaXRpY2FsCisgICAgICAgICAgICAgICAgQ0E6VFJVRQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDliOmEzOjA4OjQ0OmNlOmYyOjkwOjlkOjcxOmYzOjMyOmIzOjA1OjZhOmI1OmVhOmNmOjI5OgorICAgICAgICA5ODpkZTo1NTozZTphMDoxNjo3ZDowNjo3YTo0NDpkNjphZjpkMjpmYToxMzo1ODo4YzpmODoKKyAgICAgICAgMWM6Yzc6YWI6MWQ6YjQ6MWI6ZWY6Njk6Njg6OTg6NWM6MDg6Mzk6OGY6ZTA6Zjc6ZmI6NDg6CisgICAgICAgIGNjOjIxOmU3OmI4OjMzOmRiOjA1OmFhOjM0OjI0OjZjOjRhOmU1OmU5OjdiOjYwOmRlOjgzOgorICAgICAgICBiMzoxZjowYTpiZTo0MTo3NTpmYzpjYzozMDo0ODpiNzpjMToyNjoxZDowNDozMzphYTpiNjoKKyAgICAgICAgNzg6ZWQ6MmE6Y2I6YmE6NTY6OTc6MzI6NmU6Zjc6MzE6OTU6MmU6NDY6ZjI6MTQ6ZWU6Mjc6CisgICAgICAgIGM3OmY3OjYyOjg5OmI5OjVjOjVhOmQzOjM4OjhhOjY0OmY1OjM3OmI0OmYxOmIzOjM0OjcyOgorICAgICAgICBkNTpkNToyMTozZDo0YjpkNzo3ODo5MzpkNzozMTo2NjozNToxZTphMzpkODo0Nzo0OTo2ZjoKKyAgICAgICAgMWM6YWQ6ZTE6ODA6N2Y6Zjg6OTg6MjQ6NmM6NzM6YWM6MGU6YzI6MWE6Nzc6MDI6YTM6MjY6CisgICAgICAgIDA3OmI3OmM3OjZiOjVkOmJjOjgyOmQ1OjJhOjQ4OjFkOjYzOmNmOjUwOjMyOmE2OmZiOjFjOgorICAgICAgICAxODo0NzoxNTowYTo1YjowYzo1YzozODoyNDo5YTowNDo5ODphODowODo0ODo1Zjo3YzozNDoKKyAgICAgICAgODc6NjM6YWI6MmQ6OGQ6NGM6MDA6Nzc6OTQ6MWI6NzY6YmE6ZjU6MTY6MTg6YTM6MTU6YWY6CisgICAgICAgIDJmOjk0OmY2OjI5OjAwOjc2OmMxOjE1OjE3OmQzOmU5OjM3OjRkOjc2OmQ0OmNiOjRiOjI5OgorICAgICAgICA1OToyNDphYzpkYTo0YTphMDplYTo2MzpkZTo1Zjo1NDpiMTpmYTpmMzpkMTo0NTpjYjpjNToKKyAgICAgICAgNjQ6YjQ6NzM6MjEKKworR2xvYmFsU2lnbiBQcmltYXJ5IENsYXNzIDIgQ0EKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IEE5OkE5OjQyOjU5OjdFOkJFOjVBOjk0OkU0OjJDOkM2OjhCOjFDOjJBOjQ0OkI2CitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRHJEQ0NBcFNnQXdJQkFnSUxBZ0FBQUFBQTFuaTRqWTB3RFFZSktvWklodmNOQVFFRUJRQXdWekVMTUFrRworQTFVRUJoTUNRa1V4R1RBWEJnTlZCQW9URUVkc2IySmhiRk5wWjI0Z2JuWXRjMkV4RURBT0JnTlZCQXNUQjFKdgorYjNRZ1EwRXhHekFaQmdOVkJBTVRFa2RzYjJKaGJGTnBaMjRnVW05dmRDQkRRVEFlRncwNU9UQXhNamd4TWpBdworTURCYUZ3MHdPVEF4TWpneE1qQXdNREJhTUcweEN6QUpCZ05WQkFZVEFrSkZNUmt3RndZRFZRUUtFeEJIYkc5aQorWVd4VGFXZHVJRzUyTFhOaE1Sc3dHUVlEVlFRTEV4SlFjbWx0WVhKNUlFTnNZWE56SURJZ1EwRXhKakFrQmdOVgorQkFNVEhVZHNiMkpoYkZOcFoyNGdVSEpwYldGeWVTQkRiR0Z6Y3lBeUlFTkJNSUlCSWpBTkJna3Foa2lHOXcwQgorQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBa296KzcvUkZqaGRCYnZ6WXZ5RnZxd2FkVXNFc0FKMC9qb1c0ZjBxUAordmFCaktzcEpKNjVhZ3ZSMDRsV1MvOExScW5taXR2clZuWUlFVDhheXhsNWpwenE2Mk83cmltK2Z0cnNvUWNBaQorKzA1SUdnYVMxNy9YejduWnZUaFBPdzFFYmxWQi92d0oyOWkvODQ0aDhlZ1N0ZllUcGRQR1RKTWlzQUwvN2gwTQoreEtoclQzVm9WdWpjS0JKUTk2Z2tuUzRrT2ZzSkJkN2xvMlJKSWRCb2ZuRXdrYkZnNERuMFVQaDZUWmdBYTN4NQordWs3T1N1SzZOaDIzeFRZVmxaeGtRdXBmeExyMVFBVys0VHBadllTbkdiamVUVk5RemdmUjBsSFQ3dzJCYk9ibgorYmN0ZGZEOTh6T3hQZ3ljbC8zQlE5b05aZFlRR1psZ3Mzb21OQUtaSithVkRkd0lEQVFBQm8yTXdZVEFPQmdOVgorSFE4QkFmOEVCQU1DQUFZd0hRWURWUjBPQkJZRUZIem5zckVzM3JHbmErbDJET0dqL1U1c3g3bjJNQjhHQTFVZAorSXdRWU1CYUFGR0I3WmhwRkRaZktpVkF2ZlFUTk5Lai8vUDFMTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSgorS29aSWh2Y05BUUVFQlFBRGdnRUJBR1BkV2M2S2VhcVluVTdGaVdRM2ZvcVRaeThRNm04bnc0MTNiZkpjVnBRWgorR21sZ01FWmRqL0p0UlR5T05aZDhMN2hSNHVpSnZZalBKeHdJTkZ5SXdXZ2syNUdGNU0vNyswT042Q1VCRzhRTworOXdCQ1NJWWZKQWhZV295TjhtdEhMR2lSc1dsQy9RMk55U2Jta29hbVpHNlN4YzQrUEgxeDR5T2txOGZWcUtuZgorZ3FjNzZJYlZ3MDhZNDBUUTROenp4V2d1L3FVdkJZVElma2RDVTJ1SFN2NHkvMTQrY0l5M3FCWE1GOEwvUnV6UQorN0MyMGJoSW9xZmxBNmV2VVpwZFRxV2xWd0ttcXNpN04wV24wdnZpN2ZHbnVWS2JibnZ0YXBqNyttdStVVVV0MQorN3RqVTRacnhBbFlUaVE2blFvdVdpNFVNRzRXK0pxNnJwcG04SXZGejMwST0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjoKKyAgICAgICAgICAgIDAyOjAwOjAwOjAwOjAwOjAwOmQ2Ojc4OmI4OjhkOjhkCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1CRSwgTz1HbG9iYWxTaWduIG52LXNhLCBPVT1Sb290IENBLCBDTj1HbG9iYWxTaWduIFJvb3QgQ0EKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IEphbiAyOCAxMjowMDowMCAxOTk5IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogSmFuIDI4IDEyOjAwOjAwIDIwMDkgR01UCisgICAgICAgIFN1YmplY3Q6IEM9QkUsIE89R2xvYmFsU2lnbiBudi1zYSwgT1U9UHJpbWFyeSBDbGFzcyAyIENBLCBDTj1HbG9iYWxTaWduIFByaW1hcnkgQ2xhc3MgMiBDQQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDIwNDggYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDIwNDggYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6OTI6OGM6ZmU6ZWY6ZjQ6NDU6OGU6MTc6NDE6NmU6ZmM6ZDg6YmY6MjE6CisgICAgICAgICAgICAgICAgICAgIDZmOmFiOjA2OjlkOjUyOmMxOjJjOjAwOjlkOjNmOjhlOjg1OmI4OjdmOjRhOgorICAgICAgICAgICAgICAgICAgICA4ZjpiZDphMDo2MzoyYTpjYTo0OToyNzphZTo1YTo4MjpmNDo3NDplMjo1NToKKyAgICAgICAgICAgICAgICAgICAgOTI6ZmY6YzI6ZDE6YWE6Nzk6YTI6YjY6ZmE6ZDU6OWQ6ODI6MDQ6NGY6YzY6CisgICAgICAgICAgICAgICAgICAgIGIyOmM2OjVlOjYzOmE3OjNhOmJhOmQ4OmVlOmViOjhhOjZmOjlmOmI2OmJiOgorICAgICAgICAgICAgICAgICAgICAyODo0MTpjMDoyMjpmYjo0ZTo0ODoxYTowNjo5MjpkNzpiZjpkNzpjZjpiOToKKyAgICAgICAgICAgICAgICAgICAgZDk6YmQ6Mzg6NGY6M2I6MGQ6NDQ6NmU6NTU6NDE6ZmU6ZmM6MDk6ZGI6ZDg6CisgICAgICAgICAgICAgICAgICAgIGJmOmYzOjhlOjIxOmYxOmU4OjEyOmI1OmY2OjEzOmE1OmQzOmM2OjRjOjkzOgorICAgICAgICAgICAgICAgICAgICAyMjpiMDowMjpmZjplZToxZDowYzpjNDphODo2Yjo0Zjo3NTo2ODo1NjplODoKKyAgICAgICAgICAgICAgICAgICAgZGM6Mjg6MTI6NTA6Zjc6YTg6MjQ6OWQ6MmU6MjQ6Mzk6ZmI6MDk6MDU6ZGU6CisgICAgICAgICAgICAgICAgICAgIGU1OmEzOjY0OjQ5OjIxOmQwOjY4OjdlOjcxOjMwOjkxOmIxOjYwOmUwOjM5OgorICAgICAgICAgICAgICAgICAgICBmNDo1MDpmODo3YTo0ZDo5ODowMDo2Yjo3Yzo3OTpiYTo0ZTpjZTo0YTplMjoKKyAgICAgICAgICAgICAgICAgICAgYmE6MzY6MWQ6Yjc6YzU6MzY6MTU6OTU6OWM6NjQ6NDI6ZWE6NWY6YzQ6YmE6CisgICAgICAgICAgICAgICAgICAgIGY1OjQwOjA1OmJlOmUxOjNhOjU5OmJkOjg0OmE3OjE5OmI4OmRlOjRkOjUzOgorICAgICAgICAgICAgICAgICAgICA1MDpjZTowNzpkMTpkMjo1MTpkMzplZjowZDo4MTo2YzplNjplNzo2ZDpjYjoKKyAgICAgICAgICAgICAgICAgICAgNWQ6N2M6M2Y6N2M6Y2M6ZWM6NGY6ODM6Mjc6MjU6ZmY6NzA6NTA6ZjY6ODM6CisgICAgICAgICAgICAgICAgICAgIDU5Ojc1Ojg0OjA2OjY2OjU4OjJjOmRlOjg5OjhkOjAwOmE2OjQ5OmY5OmE1OgorICAgICAgICAgICAgICAgICAgICA0Mzo3NworICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBYNTA5djMgS2V5IFVzYWdlOiBjcml0aWNhbAorICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIFNpZ24sIENSTCBTaWduCisgICAgICAgICAgICBYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAgN0M6RTc6QjI6QjE6MkM6REU6QjE6QTc6NkI6RTk6NzY6MEM6RTE6QTM6RkQ6NEU6NkM6Qzc6Qjk6RjYKKyAgICAgICAgICAgIFg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIGtleWlkOjYwOjdCOjY2OjFBOjQ1OjBEOjk3OkNBOjg5OjUwOjJGOjdEOjA0OkNEOjM0OkE4OkZGOkZDOkZEOjRCCisKKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogY3JpdGljYWwKKyAgICAgICAgICAgICAgICBDQTpUUlVFCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgNjM6ZGQ6NTk6Y2U6OGE6Nzk6YWE6OTg6OWQ6NGU6YzU6ODk6NjQ6Mzc6N2U6OGE6OTM6Njc6CisgICAgICAgIDJmOjEwOmVhOjZmOjI3OmMzOjhkOjc3OjZkOmYyOjVjOjU2Ojk0OjE5OjFhOjY5OjYwOjMwOgorICAgICAgICA0Njo1ZDo4ZjpmMjo2ZDo0NTozYzo4ZTozNTo5Nzo3YzoyZjpiODo1MTplMjplODo4OTpiZDoKKyAgICAgICAgODg6Y2Y6Mjc6MWM6MDg6MzQ6NWM6ODg6YzE6Njg6MjQ6ZGI6OTE6ODU6ZTQ6Y2Y6ZmI6ZmI6CisgICAgICAgIDQzOjhkOmU4OjI1OjAxOjFiOmM0OjBlOmY3OjAwOjQyOjQ4Ojg2OjFmOjI0OjA4OjU4OjVhOgorICAgICAgICA4Yzo4ZDpmMjo2Yjo0NzoyYzo2ODo5MTpiMTo2OTo0MjpmZDowZDo4ZDpjOToyNjplNjo5MjoKKyAgICAgICAgODY6YTY6NjQ6NmU6OTI6YzU6Y2U6M2U6M2M6N2Q6NzE6ZTM6MjM6YTQ6YWI6Yzc6ZDU6YTg6CisgICAgICAgIGE5OmRmOjgyOmE3OjNiOmU4Ojg2OmQ1OmMzOjRmOjE4OmUzOjQ0OmQwOmUwOmRjOmYzOmM1OgorICAgICAgICA2ODoyZTpmZTphNToyZjowNTo4NDpjODo3ZTo0Nzo0Mjo1Mzo2Yjo4Nzo0YTpmZTozMjpmZjoKKyAgICAgICAgNWU6M2U6NzA6OGM6Yjc6YTg6MTU6Y2M6MTc6YzI6ZmY6NDY6ZWM6ZDA6ZWM6MmQ6YjQ6NmU6CisgICAgICAgIDEyOjI4OmE5OmY5OjQwOmU5OmViOmQ0OjY2Ojk3OjUzOmE5OjY5OjU1OmMwOmE5OmFhOmIyOgorICAgICAgICAyZTpjZDpkMTo2OTpmNDpiZTpmODpiYjo3Yzo2OTplZTo1NDphNjpkYjo5ZTpmYjo1YTphNjoKKyAgICAgICAgM2U6ZmU6OWE6ZWY6OTQ6NTE6NGI6NzU6ZWU6ZDg6ZDQ6ZTE6OWE6ZjE6MDI6NTY6MTM6ODk6CisgICAgICAgIDBlOmE3OjQyOjhiOjk2OjhiOjg1OjBjOjFiOjg1OmJlOjI2OmFlOmFiOmE2Ojk5OmJjOjIyOgorICAgICAgICBmMTo3MzpkZjo0MgorCitHbG9iYWxTaWduIFByaW1hcnkgQ2xhc3MgMyBDQQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogOTg6MTI6QTM6NEI6OTU6QTk6OTY6NjQ6OTQ6RTc6NTA6OEM6M0U6RTE6ODM6NUEKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEckRDQ0FwU2dBd0lCQWdJTEFnQUFBQUFBMW5pNDFzTXdEUVlKS29aSWh2Y05BUUVFQlFBd1Z6RUxNQWtHCitBMVVFQmhNQ1FrVXhHVEFYQmdOVkJBb1RFRWRzYjJKaGJGTnBaMjRnYm5ZdGMyRXhFREFPQmdOVkJBc1RCMUp2CitiM1FnUTBFeEd6QVpCZ05WQkFNVEVrZHNiMkpoYkZOcFoyNGdVbTl2ZENCRFFUQWVGdzA1T1RBeE1qZ3hNakF3CitNREJhRncwd09UQXhNamd4TWpBd01EQmFNRzB4Q3pBSkJnTlZCQVlUQWtKRk1Sa3dGd1lEVlFRS0V4QkhiRzlpCitZV3hUYVdkdUlHNTJMWE5oTVJzd0dRWURWUVFMRXhKUWNtbHRZWEo1SUVOc1lYTnpJRE1nUTBFeEpqQWtCZ05WCitCQU1USFVkc2IySmhiRk5wWjI0Z1VISnBiV0Z5ZVNCRGJHRnpjeUF6SUVOQk1JSUJJakFOQmdrcWhraUc5dzBCCitBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFrVjVXWmRiQXdBU2N2MGZFWEh0Nk1RSDVXSmFaNHh5RUw5eFdqNjMxCitXWUhWUTJaZFdwT01kY3FwNXhIQlVSQVVZTWtzMUh1dnhuZUdxM29ucm0rVnVRdkt0a2I3ZmhyMERSUnQwc2xPCitzcTd3VlBaY1FFdzJTSFRvVkl4bFpoQ252U3UzSUkwRlNhMTRmZElrSTFEajhMUjVtd0U1LzY4NzB5M3U0VW1OCitqUzg4YWtGRkw1dmpQZUVTNUpGMW5zK2dQanlTZ1crS0xoamM0UEtNalAySDJRZjBRSlRKVGs5RDMyZFdiNzBECitVSHlaWjZTNVBKRnNBbTZFMXZ4Rzk4eHZHRDRYOE84TFpCWlg1cXlHOFVpcVE4SEpKM2h6UkVYaWhYMjYvN1BoCisreHNGcEVzN21SSWxBVkFVYXE5ZDZzZ003dVRhN0V1TFhHZ1RsZHpEdFRBNjF3SURBUUFCbzJNd1lUQU9CZ05WCitIUThCQWY4RUJBTUNBQVl3SFFZRFZSME9CQllFRk13MnpCZTBSWkV2N2M4N01FaDMrN1VVbWI3ak1COEdBMVVkCitJd1FZTUJhQUZHQjdaaHBGRFpmS2lWQXZmUVROTktqLy9QMUxNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKCitLb1pJaHZjTkFRRUVCUUFEZ2dFQkFGZXlWTXk5bFJka1lJbTJVNUVNUlpMRFBhaHN3OHl5R1BWNFFYVFlmYU1uCityM2NOV1Q2VUhXbjZpZE1NdlJvQjlEL280SGNhZ2loYTVtTFh0K00yeVE2ZmV1UEMwOHhaaVF6dkZvdndObmNpCit5cVMydDhGQ1p3RkFZOHpuT0dTSFd4U1dabnN0Rk82OVNXMy9kOURpVGx2VGdNSk5EOHE0bllHWHB6UnV4K09jCitTT1cwcWtYMTltVk1TUElTd3RLVGpNSVZKUE1yVXYvakNLNjRidFlzRXM4NXl4SXE1Nmw3WDVnOW8rSE1wbU9KCitYSDB4ZGZuVjFsM3kwTlE5MzU1eHFBN2M1Q0NYZU9aL1U2UU5VVStPT3dPdW93MWFUY041NXpWWWNFTEpYcUZlCit0TmtpbzBSVE5hVFF6M09BeGMrZlZwaDIrUlJNZDRlQ3lkeCtYVFRWTm5VPQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOgorICAgICAgICAgICAgMDI6MDA6MDA6MDA6MDA6MDA6ZDY6Nzg6Yjg6ZDY6YzMKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPUJFLCBPPUdsb2JhbFNpZ24gbnYtc2EsIE9VPVJvb3QgQ0EsIENOPUdsb2JhbFNpZ24gUm9vdCBDQQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogSmFuIDI4IDEyOjAwOjAwIDE5OTkgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBKYW4gMjggMTI6MDA6MDAgMjAwOSBHTVQKKyAgICAgICAgU3ViamVjdDogQz1CRSwgTz1HbG9iYWxTaWduIG52LXNhLCBPVT1QcmltYXJ5IENsYXNzIDMgQ0EsIENOPUdsb2JhbFNpZ24gUHJpbWFyeSBDbGFzcyAzIENBCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMjA0OCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMjA0OCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDo5MTo1ZTo1Njo2NTpkNjpjMDpjMDowNDo5YzpiZjo0NzpjNDo1Yzo3YjoKKyAgICAgICAgICAgICAgICAgICAgN2E6MzE6MDE6Zjk6NTg6OTY6OTk6ZTM6MWM6ODQ6MmY6ZGM6NTY6OGY6YWQ6CisgICAgICAgICAgICAgICAgICAgIGY1OjU5OjgxOmQ1OjQzOjY2OjVkOjVhOjkzOjhjOjc1OmNhOmE5OmU3OjExOgorICAgICAgICAgICAgICAgICAgICBjMTo1MToxMDoxNDo2MDpjOToyYzpkNDo3YjphZjpjNjo3Nzo4NjphYjo3YToKKyAgICAgICAgICAgICAgICAgICAgMjc6YWU6NmY6OTU6Yjk6MGI6Y2E6YjY6NDY6ZmI6N2U6MWE6ZjQ6MGQ6MTQ6CisgICAgICAgICAgICAgICAgICAgIDZkOmQyOmM5OjRlOmIyOmFlOmYwOjU0OmY2OjVjOjQwOjRjOjM2OjQ4Ojc0OgorICAgICAgICAgICAgICAgICAgICBlODo1NDo4Yzo2NTo2NjoxMDphNzpiZDoyYjpiNzoyMDo4ZDowNTo0OTphZDoKKyAgICAgICAgICAgICAgICAgICAgNzg6N2Q6ZDI6MjQ6MjM6NTA6ZTM6ZjA6YjQ6Nzk6OWI6MDE6Mzk6ZmY6YWY6CisgICAgICAgICAgICAgICAgICAgIDNiOmQzOjJkOmVlOmUxOjQ5OjhkOjhkOjJmOjNjOjZhOjQxOjQ1OjJmOjliOgorICAgICAgICAgICAgICAgICAgICBlMzozZDplMToxMjplNDo5MTo3NTo5ZTpjZjphMDozZTozYzo5Mjo4MTo2ZjoKKyAgICAgICAgICAgICAgICAgICAgOGE6MmU6MTg6ZGM6ZTA6ZjI6OGM6OGM6ZmQ6ODc6ZDk6MDc6ZjQ6NDA6OTQ6CisgICAgICAgICAgICAgICAgICAgIGM5OjRlOjRmOjQzOmRmOjY3OjU2OjZmOmJkOjAzOjUwOjdjOjk5OjY3OmE0OgorICAgICAgICAgICAgICAgICAgICBiOTozYzo5MTo2YzowMjo2ZTo4NDpkNjpmYzo0NjpmNzpjYzo2ZjoxODozZToKKyAgICAgICAgICAgICAgICAgICAgMTc6ZjA6ZWY6MGI6NjQ6MTY6NTc6ZTY6YWM6ODY6ZjE6NDg6YWE6NDM6YzE6CisgICAgICAgICAgICAgICAgICAgIGM5OjI3Ojc4OjczOjQ0OjQ1OmUyOjg1OjdkOmJhOmZmOmIzOmUxOmZiOjFiOgorICAgICAgICAgICAgICAgICAgICAwNTphNDo0YjozYjo5OToxMjoyNTowMTo1MDoxNDo2YTphZjo1ZDplYTpjODoKKyAgICAgICAgICAgICAgICAgICAgMGM6ZWU6ZTQ6ZGE6ZWM6NGI6OGI6NWM6Njg6MTM6OTU6ZGM6YzM6YjU6MzA6CisgICAgICAgICAgICAgICAgICAgIDNhOmQ3CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIFg1MDl2MyBLZXkgVXNhZ2U6IGNyaXRpY2FsCisgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUgU2lnbiwgQ1JMIFNpZ24KKyAgICAgICAgICAgIFg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICBDQzozNjpDQzoxNzpCNDo0NTo5MToyRjpFRDpDRjozQjozMDo0ODo3NzpGQjpCNToxNDo5OTpCRTpFMworICAgICAgICAgICAgWDUwOXYzIEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAga2V5aWQ6NjA6N0I6NjY6MUE6NDU6MEQ6OTc6Q0E6ODk6NTA6MkY6N0Q6MDQ6Q0Q6MzQ6QTg6RkY6RkM6RkQ6NEIKKworICAgICAgICAgICAgWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzOiBjcml0aWNhbAorICAgICAgICAgICAgICAgIENBOlRSVUUKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA1NzpiMjo1NDpjYzpiZDo5NToxNzo2NDo2MDo4OTpiNjo1Mzo5MTowYzo0NTo5MjpjMzozZDoKKyAgICAgICAgYTg6NmM6YzM6Y2M6YjI6MTg6ZjU6Nzg6NDE6NzQ6ZDg6N2Q6YTM6Mjc6YWY6Nzc6MGQ6NTk6CisgICAgICAgIDNlOjk0OjFkOjY5OmZhOjg5OmQzOjBjOmJkOjFhOjAxOmY0OjNmOmU4OmUwOjc3OjFhOjgyOgorICAgICAgICAyODo1YTplNjo2MjpkNzpiNzplMzozNjpjOTowZTo5Zjo3YTplMzpjMjpkMzpjYzo1OTo4OToKKyAgICAgICAgMGM6ZWY6MTY6OGI6ZjA6MzY6Nzc6MjI6Y2E6YTQ6YjY6Yjc6YzE6NDI6Njc6MDE6NDA6NjM6CisgICAgICAgIGNjOmU3OjM4OjY0Ojg3OjViOjE0Ojk2OjY2OjdiOjJkOjE0OmVlOmJkOjQ5OjZkOmZmOjc3OgorICAgICAgICBkMDplMjo0ZTo1YjpkMzo4MDpjMjo0ZDowZjpjYTpiODo5ZDo4MTo5NzphNzozNDo2ZTpjNzoKKyAgICAgICAgZTM6OWM6NDg6ZTU6YjQ6YWE6NDU6ZjU6ZjY6NjU6NGM6NDg6ZjI6MTI6YzI6ZDI6OTM6OGM6CisgICAgICAgIGMyOjE1OjI0OmYzOjJiOjUyOmZmOmUzOjA4OmFlOmI4OjZlOmQ2OjJjOjEyOmNmOjM5OmNiOgorICAgICAgICAxMjoyYTplNzphOTo3Yjo1Zjo5ODozZDphMzplMTpjYzphNjo2Mzo4OTo1Yzo3ZDozMTo3NToKKyAgICAgICAgZjk6ZDU6ZDY6NWQ6ZjI6ZDA6ZDQ6M2Q6ZGY6OWU6NzE6YTg6MGU6ZGM6ZTQ6MjA6OTc6Nzg6CisgICAgICAgIGU2OjdmOjUzOmE0OjBkOjUxOjRmOjhlOjNiOjAzOmFlOmEzOjBkOjVhOjRkOmMzOjc5OmU3OgorICAgICAgICAzNTo1ODo3MDo0MjpjOTo1ZTphMTo1ZTpiNDpkOToyMjphMzo0NDo1MzozNTphNDpkMDpjZjoKKyAgICAgICAgNzM6ODA6YzU6Y2Y6OWY6NTY6OTg6NzY6Zjk6MTQ6NGM6Nzc6ODc6ODI6Yzk6ZGM6N2U6NWQ6CisgICAgICAgIDM0OmQ1OjM2Ojc1CisKK0dsb2JhbFNpZ24gUm9vdCBDQQorPT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IEFCOkJGOkVBOkUzOjZCOjI5OkE2OkNDOkE2Ojc4OjM1Ojk5OkVGOkFEOjJCOjgwCitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRGRUQ0NBbDJnQXdJQkFnSUxBZ0FBQUFBQTFuaTNsQVV3RFFZSktvWklodmNOQVFFRUJRQXdWekVMTUFrRworQTFVRUJoTUNRa1V4R1RBWEJnTlZCQW9URUVkc2IySmhiRk5wWjI0Z2JuWXRjMkV4RURBT0JnTlZCQXNUQjFKdgorYjNRZ1EwRXhHekFaQmdOVkJBTVRFa2RzYjJKaGJGTnBaMjRnVW05dmRDQkRRVEFlRncwNU9EQTVNREV4TWpBdworTURCYUZ3MHhOREF4TWpneE1qQXdNREJhTUZjeEN6QUpCZ05WQkFZVEFrSkZNUmt3RndZRFZRUUtFeEJIYkc5aQorWVd4VGFXZHVJRzUyTFhOaE1SQXdEZ1lEVlFRTEV3ZFNiMjkwSUVOQk1Sc3dHUVlEVlFRREV4SkhiRzlpWVd4VAorYVdkdUlGSnZiM1FnUTBFd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURhRHVhWgoramM2ajQwK0tmdnZ4aTRNbGErcElIL0Vxc0xtVkVRUzk4R1BSNG1kbXp4emR6eHRJSys2TmlZNmFyeW1BWmF2cAoreHkwU3k2c2NUSEFIb1QwS01NMFZqVS80M2RTTVVCVWM3MUR1eEM3My9PbFM4cEY5NEczVk5UQ09Ya056OGtIcAorMVdyanNvazZWams0YndZOGlHbGJLazNGcDFTNGJJbk1tL2s4eXVYOWlmVVNQSko0bHRiY2RHNlRSR0hSamNkRworc25VT2h1Z1ppdFZ0Yk5WNEZwV2k2Y2dLT092eUpCTlBjMVNURTRVNkc3d2VOTFdMQll5NWQ0dXgyeDhna2FzSgorVTI2UXpuczNkTGx3UjVFaVVXTVdlYTZ4cmtFbUNNZ1pLOUZHcWtqV1pDclhnelQvTENyQmJCbERTZ2VGNTlOOAorOWlGbzcrcnlVcDkvazVEUEFnTUJBQUdqUWpCQU1BNEdBMVVkRHdFQi93UUVBd0lBQmpBZEJnTlZIUTRFRmdRVQorWUh0bUdrVU5sOHFKVUM5OUJNMDBxUC84L1Vzd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBTkJna3Foa2lHOXcwQgorQVFRRkFBT0NBUUVBcnFxZi9MZlN5eDlmT1Nrb0dKNDB5V3hQYnhyd1pLSndTazhUaHB0Z0tKN29nVW1ZZlFxNworNWJDZFBUYmJqd1ZSL3dreEtoL2RpWGVlRHk1c2xRVHRoc3UwQUQrRUFrMkFhaW90ZUF1dWJ5dWlnMFNESDgxUQorZ2t3a3I3MzNwYlRJV2cvMDUwZGVTWTQzbHY2YWlBVTYyY0RiS1lmbUdaWkhwenFtaklzOGQvNUdZNmRUMmlIUgorckg1Sm9rdm13MmRaTDdPS0Ryc3N2YW1xUW53MXdkaC8xYWN4T2s1alF6bXZDTEJoTkl6VG1LbEROUFlQaHlrNworbmNKV1dKaDN3L2NiclBhZCtENnFwMVJGOFBYNTFURmwvbXRZbkhHekh0ZFM2aklYL0VCZ0hjbDVKTEwyYlAybworWmc2QzNaakwyc0pFVHk2Z2UvTDNheXgyRVlSR2luaWo0dz09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAzICgweDIpCisgICAgICAgIFNlcmlhbCBOdW1iZXI6CisgICAgICAgICAgICAwMjowMDowMDowMDowMDowMDpkNjo3ODpiNzo5NDowNQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9QkUsIE89R2xvYmFsU2lnbiBudi1zYSwgT1U9Um9vdCBDQSwgQ049R2xvYmFsU2lnbiBSb290IENBCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBTZXAgIDEgMTI6MDA6MDAgMTk5OCBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEphbiAyOCAxMjowMDowMCAyMDE0IEdNVAorICAgICAgICBTdWJqZWN0OiBDPUJFLCBPPUdsb2JhbFNpZ24gbnYtc2EsIE9VPVJvb3QgQ0EsIENOPUdsb2JhbFNpZ24gUm9vdCBDQQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDIwNDggYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDIwNDggYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6ZGE6MGU6ZTY6OTk6OGQ6Y2U6YTM6ZTM6NGY6OGE6N2U6ZmI6ZjE6OGI6CisgICAgICAgICAgICAgICAgICAgIDgzOjI1OjZiOmVhOjQ4OjFmOmYxOjJhOmIwOmI5Ojk1OjExOjA0OmJkOmYwOgorICAgICAgICAgICAgICAgICAgICA2MzpkMTplMjo2Nzo2NjpjZjoxYzpkZDpjZjoxYjo0ODoyYjplZTo4ZDo4OToKKyAgICAgICAgICAgICAgICAgICAgOGU6OWE6YWY6Mjk6ODA6NjU6YWI6ZTk6Yzc6MmQ6MTI6Y2I6YWI6MWM6NGM6CisgICAgICAgICAgICAgICAgICAgIDcwOjA3OmExOjNkOjBhOjMwOmNkOjE1OjhkOjRmOmY4OmRkOmQ0OjhjOjUwOgorICAgICAgICAgICAgICAgICAgICAxNToxYzplZjo1MDplZTpjNDoyZTpmNzpmYzplOTo1MjpmMjo5MTo3ZDplMDoKKyAgICAgICAgICAgICAgICAgICAgNmQ6ZDU6MzU6MzA6OGU6NWU6NDM6NzM6ZjI6NDE6ZTk6ZDU6NmE6ZTM6YjI6CisgICAgICAgICAgICAgICAgICAgIDg5OjNhOjU2OjM5OjM4OjZmOjA2OjNjOjg4OjY5OjViOjJhOjRkOmM1OmE3OgorICAgICAgICAgICAgICAgICAgICA1NDpiODo2Yzo4OTpjYzo5YjpmOTozYzpjYTplNTpmZDo4OTpmNToxMjozYzoKKyAgICAgICAgICAgICAgICAgICAgOTI6Nzg6OTY6ZDY6ZGM6NzQ6NmU6OTM6NDQ6NjE6ZDE6OGQ6Yzc6NDY6YjI6CisgICAgICAgICAgICAgICAgICAgIDc1OjBlOjg2OmU4OjE5OjhhOmQ1OjZkOjZjOmQ1Ojc4OjE2Ojk1OmEyOmU5OgorICAgICAgICAgICAgICAgICAgICBjODowYTozODplYjpmMjoyNDoxMzo0Zjo3Mzo1NDo5MzoxMzo4NTozYToxYjoKKyAgICAgICAgICAgICAgICAgICAgYmM6MWU6MzQ6YjU6OGI6MDU6OGM6Yjk6Nzc6OGI6YjE6ZGI6MWY6MjA6OTE6CisgICAgICAgICAgICAgICAgICAgIGFiOjA5OjUzOjZlOjkwOmNlOjdiOjM3Ojc0OmI5OjcwOjQ3OjkxOjIyOjUxOgorICAgICAgICAgICAgICAgICAgICA2MzoxNjo3OTphZTpiMTphZTo0MToyNjowODpjODoxOToyYjpkMTo0NjphYToKKyAgICAgICAgICAgICAgICAgICAgNDg6ZDY6NjQ6MmE6ZDc6ODM6MzQ6ZmY6MmM6MmE6YzE6NmM6MTk6NDM6NGE6CisgICAgICAgICAgICAgICAgICAgIDA3Ojg1OmU3OmQzOjdjOmY2OjIxOjY4OmVmOmVhOmYyOjUyOjlmOjdmOjkzOgorICAgICAgICAgICAgICAgICAgICA5MDpjZgorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBYNTA5djMgS2V5IFVzYWdlOiBjcml0aWNhbAorICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIFNpZ24sIENSTCBTaWduCisgICAgICAgICAgICBYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAgNjA6N0I6NjY6MUE6NDU6MEQ6OTc6Q0E6ODk6NTA6MkY6N0Q6MDQ6Q0Q6MzQ6QTg6RkY6RkM6RkQ6NEIKKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogY3JpdGljYWwKKyAgICAgICAgICAgICAgICBDQTpUUlVFCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgYWU6YWE6OWY6ZmM6Yjc6ZDI6Y2I6MWY6NWY6Mzk6Mjk6Mjg6MTg6OWU6MzQ6Yzk6NmM6NGY6CisgICAgICAgIDZmOjFhOmYwOjY0OmEyOjcwOjRhOjRmOjEzOjg2OjliOjYwOjI4OjllOmU4OjgxOjQ5Ojk4OgorICAgICAgICA3ZDowYTpiYjplNTpiMDo5ZDozZDozNjpkYjo4ZjowNTo1MTpmZjowOTozMToyYToxZjpkZDoKKyAgICAgICAgODk6Nzc6OWU6MGY6MmU6NmM6OTU6MDQ6ZWQ6ODY6Y2I6YjQ6MDA6M2Y6ODQ6MDI6NGQ6ODA6CisgICAgICAgIDZhOjJhOjJkOjc4OjBiOmFlOjZmOjJiOmEyOjgzOjQ0OjgzOjFmOmNkOjUwOjgyOjRjOjI0OgorICAgICAgICBhZjpiZDpmNzphNTpiNDpjODo1YTowZjpmNDplNzo0Nzo1ZTo0OTo4ZTozNzo5NjpmZTo5YToKKyAgICAgICAgODg6MDU6M2E6ZDk6YzA6ZGI6Mjk6ODc6ZTY6MTk6OTY6NDc6YTc6M2E6YTY6OGM6OGI6M2M6CisgICAgICAgIDc3OmZlOjQ2OjYzOmE3OjUzOmRhOjIxOmQxOmFjOjdlOjQ5OmEyOjRiOmU2OmMzOjY3OjU5OgorICAgICAgICAyZjpiMzo4YTowZTpiYjoyYzpiZDphOTphYTo0Mjo3YzozNTpjMTpkODo3ZjpkNTphNzozMToKKyAgICAgICAgM2E6NGU6NjM6NDM6Mzk6YWY6MDg6YjA6NjE6MzQ6OGM6ZDM6OTg6YTk6NDM6MzQ6ZjY6MGY6CisgICAgICAgIDg3OjI5OjNiOjlkOmMyOjU2OjU4Ojk4Ojc3OmMzOmY3OjFiOmFjOmY2OjlkOmY4OjNlOmFhOgorICAgICAgICBhNzo1NDo0NTpmMDpmNTpmOTpkNTozMTo2NTpmZTo2Yjo1ODo5Yzo3MTpiMzoxZTpkNzo1MjoKKyAgICAgICAgZWE6MzI6MTc6ZmM6NDA6NjA6MWQ6Yzk6Nzk6MjQ6YjI6ZjY6NmM6ZmQ6YTg6NjY6MGU6ODI6CisgICAgICAgIGRkOjk4OmNiOmRhOmMyOjQ0OjRmOjJlOmEwOjdiOmYyOmY3OjZiOjJjOjc2OjExOjg0OjQ2OgorICAgICAgICA4YTo3ODphMzplMworCitOYXRpb25hbCBSZXRhaWwgRmVkZXJhdGlvbiBieSBEU1QKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiBBRDo4RTowRjo5RTowMTo2QjpBMDpDNTo3NDpENTowQzpEMzo2ODo2NTo0RjoxRQorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVBakNDQXVvQ0VRRFFIa0NLQUFBQ2ZBQUFBQU1BQUFBQk1BMEdDU3FHU0liM0RRRUJCUVVBTUlHK01Rc3cKK0NRWURWUVFHRXdKMWN6RU5NQXNHQTFVRUNCTUVWWFJoYURFWE1CVUdBMVVFQnhNT1UyRnNkQ0JNWVd0bElFTnAKK2RIa3hKREFpQmdOVkJBb1RHMFJwWjJsMFlXd2dVMmxuYm1GMGRYSmxJRlJ5ZFhOMElFTnZMakVqTUNFR0ExVUUKK0N4TWFUbUYwYVc5dVlXd2dVbVYwWVdsc0lFWmxaR1Z5WVhScGIyNHhHVEFYQmdOVkJBTVRFRVJUVkNBb1RsSkcKK0tTQlNiMjkwUTBFeElUQWZCZ2txaGtpRzl3MEJDUUVXRW1OaFFHUnBaM05wWjNSeWRYTjBMbU52YlRBZUZ3MDUKK09ERXlNVEV4TmpFME1UWmFGdzB3T0RFeU1EZ3hOakUwTVRaYU1JRytNUXN3Q1FZRFZRUUdFd0oxY3pFTk1Bc0cKK0ExVUVDQk1FVlhSaGFERVhNQlVHQTFVRUJ4TU9VMkZzZENCTVlXdGxJRU5wZEhreEpEQWlCZ05WQkFvVEcwUnAKK1oybDBZV3dnVTJsbmJtRjBkWEpsSUZSeWRYTjBJRU52TGpFak1DRUdBMVVFQ3hNYVRtRjBhVzl1WVd3Z1VtVjAKK1lXbHNJRVpsWkdWeVlYUnBiMjR4R1RBWEJnTlZCQU1URUVSVFZDQW9UbEpHS1NCU2IyOTBRMEV4SVRBZkJna3EKK2hraUc5dzBCQ1FFV0VtTmhRR1JwWjNOcFozUnlkWE4wTG1OdmJUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQUQKK2dnRVBBRENDQVFvQ2dnRUJBTm1zbTNmNlVOUE0zTGxBckxseWFnQ0hJL3dQbGlIUUpxL2s0clZmK3RPbWZTRXcKK0xzd1hnbytZZFB4bnBLYmZpSmVpUWluMXA5c1JrL3RlSXpEQ3Fyd2k1MEViNWUwbDNzZy8yOTVYUlhoQVJvT3kKKzFSbzkzdzlGYmRWakFuWFlMOFp1cTVXUmREY055MDBKWE5IVVd6cmEzUTdJYTVuWTFUbk0zNFZWeEpKVEFxUGgKKzk0REpjS1BhM0RQRWY2SkhDQncxbGgraEF4d3dnL1RFelArWXc3QkdSS0xBdjYzYjBvSDJUSmdzcDE0azg0YksKK1k5VzZmZkNhd0VyUUcxanU3S2xuejJrQ2JDTEFZQ3dzMGNnZzZzZ3QrOTJjdTh0UlROem5Wd1E3VkpzUnBUSjAKKzdIUUI4NUFWV3k5OExKTmx1V1pudElHSU5lV2VrUmgvZ2FoQnlNc0NBd0VBQVRBTkJna3Foa2lHOXcwQkFRVUYKK0FBT0NBUUVBaEY0TE8reWdqUnliMER3ZGNXbmtHbjlrdm9GbFljV01hdGQ4QUhUZ2VtSlY3U1I4NEdIajh0MFUKKzVoRnVndzdoNnFtZWdLMmFJTC9nVjM3VjBMV0VZeTNaR09TOUd6VXNYcTVoZHFwbmhUczQ0VEdCSHpGLzV0ZjQKK1c5SzdZM21HeEl6RjNncXUxOUg4QVhUL3RyWU5Zb0ZuSExzbStDU0E0RnhlMktTS09vOTl5LytTby8xOHFUSnAKK0IxaFlZVUtaVWdPeE9EM0djVzlzOHVoOUJxckJmRlBMR2kySVQ4bXBwNnhwYi9la0g5aDBnZlZLdjdGVnQ5TjMKK09LZHZ3a3JJNG5PSjAxZHk0VU12Y2p6Mkg3ZjRCRXB1d2VtVUYrU1hGL1FPRTRadmphdm9YeTIwLzJ6V29yUWYKKzdMbVVhcW9TVHhyZDlYZTFKWXp5aWdyeC9GSmJXQT09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAxICgweDApCisgICAgICAgIFNlcmlhbCBOdW1iZXI6CisgICAgICAgICAgICBkMDoxZTo0MDo4YTowMDowMDowMjo3YzowMDowMDowMDowMzowMDowMDowMDowMQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPXVzLCBTVD1VdGFoLCBMPVNhbHQgTGFrZSBDaXR5LCBPPURpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLiwgT1U9TmF0aW9uYWwgUmV0YWlsIEZlZGVyYXRpb24sIENOPURTVCAoTlJGKSBSb290Q0EvRW1haWw9Y2FAZGlnc2lndHJ1c3QuY29tCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBEZWMgMTEgMTY6MTQ6MTYgMTk5OCBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IERlYyAgOCAxNjoxNDoxNiAyMDA4IEdNVAorICAgICAgICBTdWJqZWN0OiBDPXVzLCBTVD1VdGFoLCBMPVNhbHQgTGFrZSBDaXR5LCBPPURpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLiwgT1U9TmF0aW9uYWwgUmV0YWlsIEZlZGVyYXRpb24sIENOPURTVCAoTlJGKSBSb290Q0EvRW1haWw9Y2FAZGlnc2lndHJ1c3QuY29tCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMjA0OCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMjA0OCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpkOTphYzo5Yjo3NzpmYTo1MDpkMzpjYzpkYzpiOTo0MDphYzpiOTo3MjoKKyAgICAgICAgICAgICAgICAgICAgNmE6MDA6ODc6MjM6ZmM6MGY6OTY6MjE6ZDA6MjY6YWY6ZTQ6ZTI6YjU6NWY6CisgICAgICAgICAgICAgICAgICAgIGZhOmQzOmE2OjdkOjIxOjMwOjJlOmNjOjE3OjgyOjhmOjk4Ojc0OmZjOjY3OgorICAgICAgICAgICAgICAgICAgICBhNDphNjpkZjo4ODo5NzphMjo0MjoyOTpmNTphNzpkYjoxMTo5MzpmYjo1ZToKKyAgICAgICAgICAgICAgICAgICAgMjM6MzA6YzI6YWE6YmM6MjI6ZTc6NDE6MWI6ZTU6ZWQ6MjU6ZGU6Yzg6M2Y6CisgICAgICAgICAgICAgICAgICAgIGRiOmRlOjU3OjQ1Ojc4OjQwOjQ2OjgzOmIyOmQ1OjFhOjNkOmRmOjBmOjQ1OgorICAgICAgICAgICAgICAgICAgICA2ZDpkNTo2MzowMjo3NTpkODoyZjpjNjo2ZTphYjo5NTo5MTo3NDozNzowZDoKKyAgICAgICAgICAgICAgICAgICAgY2I6NGQ6MDk6NWM6ZDE6ZDQ6NWI6M2E6ZGE6ZGQ6MGU6Yzg6NmI6OTk6ZDg6CisgICAgICAgICAgICAgICAgICAgIGQ1OjM5OmNjOmRmOjg1OjU1OmM0OjkyOjUzOjAyOmEzOmUxOmY3OjgwOmM5OgorICAgICAgICAgICAgICAgICAgICA3MDphMzpkYTpkYzozMzpjNDo3ZjphMjo0NzowODoxYzozNTo5NjoxZjphMToKKyAgICAgICAgICAgICAgICAgICAgMDM6MWM6MzA6ODM6ZjQ6YzQ6Y2M6ZmY6OTg6YzM6YjA6NDY6NDQ6YTI6YzA6CisgICAgICAgICAgICAgICAgICAgIGJmOmFkOmRiOmQyOjgxOmY2OjRjOjk4OjJjOmE3OjVlOjI0OmYzOjg2OmNhOgorICAgICAgICAgICAgICAgICAgICA2MzpkNTpiYTo3ZDpmMDo5YTpjMDo0YTpkMDoxYjo1ODplZTplYzphOTo2NzoKKyAgICAgICAgICAgICAgICAgICAgY2Y6Njk6MDI6NmM6MjI6YzA6NjA6MmM6MmM6ZDE6Yzg6MjA6ZWE6Yzg6MmQ6CisgICAgICAgICAgICAgICAgICAgIGZiOmRkOjljOmJiOmNiOjUxOjRjOmRjOmU3OjU3OjA0OjNiOjU0OjliOjExOgorICAgICAgICAgICAgICAgICAgICBhNTozMjo3NDplYzo3NDowMTpmMzo5MDoxNTo1YjoyZjo3YzoyYzo5Mzo2NToKKyAgICAgICAgICAgICAgICAgICAgYjk6NjY6Njc6YjQ6ODE6ODg6MzU6ZTU6OWU6OTE6MTg6N2Y6ODE6YTg6NDE6CisgICAgICAgICAgICAgICAgICAgIGM4OmNiCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA4NDo1ZTowYjozYjplYzphMDo4ZDoxYzo5YjpkMDozYzoxZDo3MTo2OTplNDoxYTo3Zjo2NDoKKyAgICAgICAgYmU6ODE6NjU6NjE6YzU6OGM6NmE6ZDc6N2M6MDA6NzQ6ZTA6N2E6NjI6NTU6ZWQ6MjQ6N2M6CisgICAgICAgIGUwOjYxOmUzOmYyOmRkOjE0OmU2OjExOjZlOjgzOjBlOmUxOmVhOmE5OjllOjgwOmFkOjlhOgorICAgICAgICAyMDpiZjplMDo1Nzo3ZTpkNTpkMDpiNTo4NDo2MzoyZDpkOToxODplNDpiZDoxYjozNToyYzoKKyAgICAgICAgNWU6YWU6NjE6NzY6YWE6Njc6ODU6M2I6Mzg6ZTE6MzE6ODE6MWY6MzE6N2Y6ZTY6ZDc6Zjg6CisgICAgICAgIDViOmQyOmJiOjYzOjc5Ojg2OmM0OjhjOmM1OmRlOjBhOmFlOmQ3OmQxOmZjOjAxOjc0OmZmOgorICAgICAgICBiNjpiNjowZDo2Mjo4MTo2NzoxYzpiYjoyNjpmODoyNDo4MDplMDo1Yzo1ZTpkODphNDo4YToKKyAgICAgICAgM2E6OGY6N2Q6Y2I6ZmY6OTI6YTM6ZmQ6N2M6YTk6MzI6Njk6MDc6NTg6NTg6NjE6NDI6OTk6CisgICAgICAgIDUyOjAzOmIxOjM4OjNkOmM2OjcxOjZmOjZjOmYyOmU4OjdkOjA2OmFhOmMxOjdjOjUzOmNiOgorICAgICAgICAxYToyZDo4ODo0ZjpjOTphOTphNzphYzo2OTo2ZjpmNzphNDoxZjpkODo3NDo4MTpmNTo0YToKKyAgICAgICAgYmY6YjE6NTU6Yjc6ZDM6Nzc6Mzg6YTc6NmY6YzI6NGE6Yzg6ZTI6NzM6ODk6ZDM6NTc6NzI6CisgICAgICAgIGUxOjQzOjJmOjcyOjNjOmY2OjFmOmI3OmY4OjA0OjRhOjZlOmMxOmU5Ojk0OjE3OmU0Ojk3OgorICAgICAgICAxNzpmNDowZToxMzo4Njo2Zjo4ZDphYjplODo1ZjoyZDpiNDpmZjo2YzpkNjphMjpiNDoxZjoKKyAgICAgICAgZWM6Yjk6OTQ6NmE6YWE6MTI6NGY6MWE6ZGQ6ZjU6Nzc6YjU6MjU6OGM6ZjI6OGE6MGE6ZjE6CisgICAgICAgIGZjOjUyOjViOjU4CisKK1RDIFRydXN0Q2VudGVyLCBHZXJtYW55LCBDbGFzcyAxIENBCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiA2NDozRjpGODozRTo1MjoxNDo0QTo1OTpCQTo5Mzo1NjowNDowQjoyMzowMjpEMQorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVOVENDQTU2Z0F3SUJBZ0lCQWpBTkJna3Foa2lHOXcwQkFRUUZBRENCdkRFTE1Ba0dBMVVFQmhNQ1JFVXgKK0VEQU9CZ05WQkFnVEIwaGhiV0oxY21jeEVEQU9CZ05WQkFjVEIwaGhiV0oxY21jeE9qQTRCZ05WQkFvVE1WUkQKK0lGUnlkWE4wUTJWdWRHVnlJR1p2Y2lCVFpXTjFjbWwwZVNCcGJpQkVZWFJoSUU1bGRIZHZjbXR6SUVkdFlrZ3gKK0lqQWdCZ05WQkFzVEdWUkRJRlJ5ZFhOMFEyVnVkR1Z5SUVOc1lYTnpJREVnUTBFeEtUQW5CZ2txaGtpRzl3MEIKK0NRRVdHbU5sY25ScFptbGpZWFJsUUhSeWRYTjBZMlZ1ZEdWeUxtUmxNQjRYRFRrNE1ETXdPVEV6TlRZek0xb1gKK0RUQTFNVEl6TVRFek5UWXpNMW93Z2J3eEN6QUpCZ05WQkFZVEFrUkZNUkF3RGdZRFZRUUlFd2RJWVcxaWRYSm4KK01SQXdEZ1lEVlFRSEV3ZElZVzFpZFhKbk1Ub3dPQVlEVlFRS0V6RlVReUJVY25WemRFTmxiblJsY2lCbWIzSWcKK1UyVmpkWEpwZEhrZ2FXNGdSR0YwWVNCT1pYUjNiM0pyY3lCSGJXSklNU0l3SUFZRFZRUUxFeGxVUXlCVWNuVnoKK2RFTmxiblJsY2lCRGJHRnpjeUF4SUVOQk1Ta3dKd1lKS29aSWh2Y05BUWtCRmhwalpYSjBhV1pwWTJGMFpVQjAKK2NuVnpkR05sYm5SbGNpNWtaVENCbnpBTkJna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBc0NucnRIYXoKK3J0ZTJXN1JlNTczanNaeEpCRmRib2F2WmZ4TWIvYnBocTlqbmNkOHRBSlJkVVVoOUkrOTFZb1NRUEFvZldSRjAKK0w0NkFwZjB3QWowcFVzMXlHa2tobkx6TFVvNUlvV09XeUJDRk1HbFhkRVhBV29iRzFUM2dhRmQ5TVdva2pVV1gKK1BqRithR1l5YmlSdDdESTJ5VUhLOERGRXlLTmh5aHVnTmg4Q0F3RUFBYU9DQVVNd2dnRS9NRUFHQ1dDR1NBR0cKKytFSUJBd1F6RmpGb2RIUndjem92TDNkM2R5NTBjblZ6ZEdObGJuUmxjaTVrWlM5aloya3RZbWx1TDJOb1pXTnIKK0xYSmxkaTVqWjJrL01FQUdDV0NHU0FHRytFSUJCQVF6RmpGb2RIUndjem92TDNkM2R5NTBjblZ6ZEdObGJuUmwKK2NpNWtaUzlqWjJrdFltbHVMMk5vWldOckxYSmxkaTVqWjJrL01Ed0dDV0NHU0FHRytFSUJCd1F2Rmkxb2RIUncKK2N6b3ZMM2QzZHk1MGNuVnpkR05sYm5SbGNpNWtaUzlqWjJrdFltbHVMMUpsYm1WM0xtTm5hVDh3UGdZSllJWkkKK0FZYjRRZ0VJQkRFV0wyaDBkSEE2THk5M2QzY3VkSEoxYzNSalpXNTBaWEl1WkdVdlozVnBaR1ZzYVc1bGN5OXAKK2JtUmxlQzVvZEcxc01DZ0dDV0NHU0FHRytFSUJEUVFiRmhsVVF5QlVjblZ6ZEVObGJuUmxjaUJEYkdGemN5QXgKK0lFTkJNQkVHQ1dDR1NBR0crRUlCQVFRRUF3SUFCekFOQmdrcWhraUc5dzBCQVFRRkFBT0JnUUFGUWxJbXBBd24KK0FVU3NYQ1Vvd2tSQ1ZBaTVIY1UrYkZsbXhMTk9VS2Y0K0paMW9aWjE2Qlk0b00xZGJ2cDVweHQ3SFI3REFMbG0KK3ZscldZZy9uOG51NDcwemd3RDlacmptM2hBbWVxL0dwTG10cDRxM004dXA0Q1FVZ09FSnhHSDdIc3BmbTFRSUYKK0JsYWpYL0dxd3NSUC92ZnZGZytkN0txRnp6MHBKUEVFelE9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiAyICgweDIpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1ERSwgU1Q9SGFtYnVyZywgTD1IYW1idXJnLCBPPVRDIFRydXN0Q2VudGVyIGZvciBTZWN1cml0eSBpbiBEYXRhIE5ldHdvcmtzIEdtYkgsIE9VPVRDIFRydXN0Q2VudGVyIENsYXNzIDEgQ0EvRW1haWw9Y2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IE1hciAgOSAxMzo1NjozMyAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogRGVjIDMxIDEzOjU2OjMzIDIwMDUgR01UCisgICAgICAgIFN1YmplY3Q6IEM9REUsIFNUPUhhbWJ1cmcsIEw9SGFtYnVyZywgTz1UQyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJILCBPVT1UQyBUcnVzdENlbnRlciBDbGFzcyAxIENBL0VtYWlsPWNlcnRpZmljYXRlQHRydXN0Y2VudGVyLmRlCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpiMDoyOTplYjpiNDo3NjpiMzphZTpkNzpiNjo1YjpiNDo1ZTplNzpiZDoKKyAgICAgICAgICAgICAgICAgICAgZTM6YjE6OWM6NDk6MDQ6NTc6NWI6YTE6YWI6ZDk6N2Y6MTM6MWI6ZmQ6YmE6CisgICAgICAgICAgICAgICAgICAgIDYxOmFiOmQ4OmU3OjcxOmRmOjJkOjAwOjk0OjVkOjUxOjQ4OjdkOjIzOmVmOgorICAgICAgICAgICAgICAgICAgICA3NTo2Mjo4NDo5MDozYzowYToxZjo1OToxMTo3NDoyZjo4ZTo4MDphNTpmZDoKKyAgICAgICAgICAgICAgICAgICAgMzA6MDI6M2Q6Mjk6NTI6Y2Q6NzI6MWE6NDk6MjE6OWM6YmM6Y2I6NTI6OGU6CisgICAgICAgICAgICAgICAgICAgIDQ4OmExOjYzOjk2OmM4OjEwOjg1OjMwOjY5OjU3Ojc0OjQ1OmMwOjVhOjg2OgorICAgICAgICAgICAgICAgICAgICBjNjpkNTozZDplMDo2ODo1Nzo3ZDozMTo2YToyNDo4ZDo0NTo5NzozZTozMToKKyAgICAgICAgICAgICAgICAgICAgN2U6Njg6NjY6MzI6NmU6MjQ6NmQ6ZWM6MzI6MzY6Yzk6NDE6Y2E6ZjA6MzE6CisgICAgICAgICAgICAgICAgICAgIDQ0OmM4OmEzOjYxOmNhOjFiOmEwOjM2OjFmCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIE5ldHNjYXBlIFJldm9jYXRpb24gVXJsOiAKKyAgICAgICAgICAgICAgICBodHRwczovL3d3dy50cnVzdGNlbnRlci5kZS9jZ2ktYmluL2NoZWNrLXJldi5jZ2k/CisgICAgICAgICAgICBOZXRzY2FwZSBDQSBSZXZvY2F0aW9uIFVybDogCisgICAgICAgICAgICAgICAgaHR0cHM6Ly93d3cudHJ1c3RjZW50ZXIuZGUvY2dpLWJpbi9jaGVjay1yZXYuY2dpPworICAgICAgICAgICAgTmV0c2NhcGUgUmVuZXdhbCBVcmw6IAorICAgICAgICAgICAgICAgIGh0dHBzOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NnaS1iaW4vUmVuZXcuY2dpPworICAgICAgICAgICAgTmV0c2NhcGUgQ0EgUG9saWN5IFVybDogCisgICAgICAgICAgICAgICAgaHR0cDovL3d3dy50cnVzdGNlbnRlci5kZS9ndWlkZWxpbmVzL2luZGV4Lmh0bWwKKyAgICAgICAgICAgIE5ldHNjYXBlIENvbW1lbnQ6IAorICAgICAgICAgICAgICAgIFRDIFRydXN0Q2VudGVyIENsYXNzIDEgQ0EKKyAgICAgICAgICAgIE5ldHNjYXBlIENlcnQgVHlwZTogCisgICAgICAgICAgICAgICAgU1NMIENBLCBTL01JTUUgQ0EsIE9iamVjdCBTaWduaW5nIENBCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgMDU6NDI6NTI6MjY6YTQ6MGM6Mjc6MDE6NDQ6YWM6NWM6MjU6Mjg6YzI6NDQ6NDI6NTQ6MDg6CisgICAgICAgIGI5OjFkOmM1OjNlOjZjOjU5OjY2OmM0OmIzOjRlOjUwOmE3OmY4OmY4Ojk2Ojc1OmExOjk2OgorICAgICAgICA3NTplODoxNjozODphMDpjZDo1ZDo2ZTpmYTo3OTphNzoxYjo3YjoxZDoxZTpjMzowMDpiOToKKyAgICAgICAgNjY6YmU6NWE6ZDY6NjI6MGY6ZTc6ZjI6N2I6Yjg6ZWY6NGM6ZTA6YzA6M2Y6NTk6YWU6Mzk6CisgICAgICAgIGI3Ojg0OjA5OjllOmFiOmYxOmE5OjJlOjZiOjY5OmUyOmFkOmNjOmYyOmVhOjc4OjA5OjA1OgorICAgICAgICAyMDozODo0Mjo3MToxODo3ZTpjNzpiMjo5NzplNjpkNTowMjowNTowNjo1NjphMzo1ZjpmMToKKyAgICAgICAgYWE6YzI6YzQ6NGY6ZmU6Zjc6ZWY6MTY6MGY6OWQ6ZWM6YWE6ODU6Y2Y6M2Q6Mjk6MjQ6ZjE6CisgICAgICAgIDA0OmNkCisKK1RDIFRydXN0Q2VudGVyLCBHZXJtYW55LCBDbGFzcyAyIENBCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiBFMTpFOTo5Njo1Mzo3NzpFMTpGMDozODpBMDowMjpBQjo5NDpDNjo5NTo3QjpGQworUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVOVENDQTU2Z0F3SUJBZ0lCQXpBTkJna3Foa2lHOXcwQkFRUUZBRENCdkRFTE1Ba0dBMVVFQmhNQ1JFVXgKK0VEQU9CZ05WQkFnVEIwaGhiV0oxY21jeEVEQU9CZ05WQkFjVEIwaGhiV0oxY21jeE9qQTRCZ05WQkFvVE1WUkQKK0lGUnlkWE4wUTJWdWRHVnlJR1p2Y2lCVFpXTjFjbWwwZVNCcGJpQkVZWFJoSUU1bGRIZHZjbXR6SUVkdFlrZ3gKK0lqQWdCZ05WQkFzVEdWUkRJRlJ5ZFhOMFEyVnVkR1Z5SUVOc1lYTnpJRElnUTBFeEtUQW5CZ2txaGtpRzl3MEIKK0NRRVdHbU5sY25ScFptbGpZWFJsUUhSeWRYTjBZMlZ1ZEdWeUxtUmxNQjRYRFRrNE1ETXdPVEV6TlRjME5Gb1gKK0RUQTFNVEl6TVRFek5UYzBORm93Z2J3eEN6QUpCZ05WQkFZVEFrUkZNUkF3RGdZRFZRUUlFd2RJWVcxaWRYSm4KK01SQXdEZ1lEVlFRSEV3ZElZVzFpZFhKbk1Ub3dPQVlEVlFRS0V6RlVReUJVY25WemRFTmxiblJsY2lCbWIzSWcKK1UyVmpkWEpwZEhrZ2FXNGdSR0YwWVNCT1pYUjNiM0pyY3lCSGJXSklNU0l3SUFZRFZRUUxFeGxVUXlCVWNuVnoKK2RFTmxiblJsY2lCRGJHRnpjeUF5SUVOQk1Ta3dKd1lKS29aSWh2Y05BUWtCRmhwalpYSjBhV1pwWTJGMFpVQjAKK2NuVnpkR05sYm5SbGNpNWtaVENCbnpBTkJna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBMmpqbzdUSUEKK0tYR0RBUTIvakFIYzJzYXRPYVNwaWkvVmkxeG9YMURHWXZWbXZjcVJJdXlxSFZIWFBiTlJzb05PWGN0SnNQQk0KK1ZlVnJMY2VGQ3pBY2trNkMxTW9DN2ZkdnZ0emc0eFM0QlZQeW12UldpMXFlaFpQUnRJSldyazI3cUV0WEZyeisKKytGaWUrQ21Oc0h2TmVNbFBySXRuRFBHYysveFhtMWRjVHcwQ0F3RUFBYU9DQVVNd2dnRS9NRUFHQ1dDR1NBR0cKKytFSUJBd1F6RmpGb2RIUndjem92TDNkM2R5NTBjblZ6ZEdObGJuUmxjaTVrWlM5aloya3RZbWx1TDJOb1pXTnIKK0xYSmxkaTVqWjJrL01FQUdDV0NHU0FHRytFSUJCQVF6RmpGb2RIUndjem92TDNkM2R5NTBjblZ6ZEdObGJuUmwKK2NpNWtaUzlqWjJrdFltbHVMMk5vWldOckxYSmxkaTVqWjJrL01Ed0dDV0NHU0FHRytFSUJCd1F2Rmkxb2RIUncKK2N6b3ZMM2QzZHk1MGNuVnpkR05sYm5SbGNpNWtaUzlqWjJrdFltbHVMMUpsYm1WM0xtTm5hVDh3UGdZSllJWkkKK0FZYjRRZ0VJQkRFV0wyaDBkSEE2THk5M2QzY3VkSEoxYzNSalpXNTBaWEl1WkdVdlozVnBaR1ZzYVc1bGN5OXAKK2JtUmxlQzVvZEcxc01DZ0dDV0NHU0FHRytFSUJEUVFiRmhsVVF5QlVjblZ6ZEVObGJuUmxjaUJEYkdGemN5QXkKK0lFTkJNQkVHQ1dDR1NBR0crRUlCQVFRRUF3SUFCekFOQmdrcWhraUc5dzBCQVFRRkFBT0JnUUNKRy9UdjZUamkKK2JBejJ6VzlKemluTSs2WVArWTArbFViVy9FY3lpYkxJQm1GNjB1Y05Fd0tVQzltTFZrZjB1K2ZGWDN2MFkweXUKK2ZEVHFEYUtwc3l5RjgrUCtKMVFRa3JDUGtzR1lRaGh3U050T0xPc05KR2prMGZlK0Nha3BoN3ZvMnR3K280aEMKK01mWFI0Myt1Mkk0QVduU1lzRS9HL3lON1hITUFlTW5iVGc9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiAzICgweDMpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1ERSwgU1Q9SGFtYnVyZywgTD1IYW1idXJnLCBPPVRDIFRydXN0Q2VudGVyIGZvciBTZWN1cml0eSBpbiBEYXRhIE5ldHdvcmtzIEdtYkgsIE9VPVRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EvRW1haWw9Y2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IE1hciAgOSAxMzo1Nzo0NCAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogRGVjIDMxIDEzOjU3OjQ0IDIwMDUgR01UCisgICAgICAgIFN1YmplY3Q6IEM9REUsIFNUPUhhbWJ1cmcsIEw9SGFtYnVyZywgTz1UQyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJILCBPVT1UQyBUcnVzdENlbnRlciBDbGFzcyAyIENBL0VtYWlsPWNlcnRpZmljYXRlQHRydXN0Y2VudGVyLmRlCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpkYTozODplODplZDozMjowMDoyOTo3MTo4MzowMTowZDpiZjo4YzowMToKKyAgICAgICAgICAgICAgICAgICAgZGM6ZGE6YzY6YWQ6Mzk6YTQ6YTk6OGE6MmY6ZDU6OGI6NWM6Njg6NWY6NTA6CisgICAgICAgICAgICAgICAgICAgIGM2OjYyOmY1OjY2OmJkOmNhOjkxOjIyOmVjOmFhOjFkOjUxOmQ3OjNkOmIzOgorICAgICAgICAgICAgICAgICAgICA1MTpiMjo4Mzo0ZTo1ZDpjYjo0OTpiMDpmMDo0Yzo1NTplNTo2YjoyZDpjNzoKKyAgICAgICAgICAgICAgICAgICAgODU6MGI6MzA6MWM6OTI6NGU6ODI6ZDQ6Y2E6MDI6ZWQ6Zjc6NmY6YmU6ZGM6CisgICAgICAgICAgICAgICAgICAgIGUwOmUzOjE0OmI4OjA1OjUzOmYyOjlhOmY0OjU2OjhiOjVhOjllOjg1OjkzOgorICAgICAgICAgICAgICAgICAgICBkMTpiNDo4Mjo1NjphZTo0ZDpiYjphODo0Yjo1NzoxNjpiYzpmZTpmODo1ODoKKyAgICAgICAgICAgICAgICAgICAgOWU6Zjg6Mjk6OGQ6YjA6N2I6Y2Q6Nzg6Yzk6NGY6YWM6OGI6Njc6MGM6ZjE6CisgICAgICAgICAgICAgICAgICAgIDljOmZiOmZjOjU3OjliOjU3OjVjOjRmOjBkCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIE5ldHNjYXBlIFJldm9jYXRpb24gVXJsOiAKKyAgICAgICAgICAgICAgICBodHRwczovL3d3dy50cnVzdGNlbnRlci5kZS9jZ2ktYmluL2NoZWNrLXJldi5jZ2k/CisgICAgICAgICAgICBOZXRzY2FwZSBDQSBSZXZvY2F0aW9uIFVybDogCisgICAgICAgICAgICAgICAgaHR0cHM6Ly93d3cudHJ1c3RjZW50ZXIuZGUvY2dpLWJpbi9jaGVjay1yZXYuY2dpPworICAgICAgICAgICAgTmV0c2NhcGUgUmVuZXdhbCBVcmw6IAorICAgICAgICAgICAgICAgIGh0dHBzOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NnaS1iaW4vUmVuZXcuY2dpPworICAgICAgICAgICAgTmV0c2NhcGUgQ0EgUG9saWN5IFVybDogCisgICAgICAgICAgICAgICAgaHR0cDovL3d3dy50cnVzdGNlbnRlci5kZS9ndWlkZWxpbmVzL2luZGV4Lmh0bWwKKyAgICAgICAgICAgIE5ldHNjYXBlIENvbW1lbnQ6IAorICAgICAgICAgICAgICAgIFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EKKyAgICAgICAgICAgIE5ldHNjYXBlIENlcnQgVHlwZTogCisgICAgICAgICAgICAgICAgU1NMIENBLCBTL01JTUUgQ0EsIE9iamVjdCBTaWduaW5nIENBCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgODk6MWI6ZjQ6ZWY6ZTk6Mzg6ZTI6NmM6MGM6ZjY6Y2Q6NmY6NDk6Y2U6Mjk6Y2M6ZmI6YTY6CisgICAgICAgIDBmOmY5OjhkOjNlOjk1OjQ2OmQ2OmZjOjQ3OjMyOjg5OmIyOmM4OjA2OjYxOjdhOmQyOmU3OgorICAgICAgICAwZDoxMzowMjo5NDowYjpkOTo4Yjo1Njo0NzpmNDpiYjplNzpjNTo1Zjo3YjpmNDo2Mzo0YzoKKyAgICAgICAgYWU6N2M6MzQ6ZWE6MGQ6YTI6YTk6YjM6MmM6ODU6ZjM6ZTM6ZmU6Mjc6NTQ6MTA6OTI6YjA6CisgICAgICAgIDhmOjkyOmMxOjk4OjQyOjE4OjcwOjQ4OmRiOjRlOjJjOmViOjBkOjI0OjY4OmU0OmQxOmY3OgorICAgICAgICBiZTowOTphOToyOTo4NzpiYjplODpkYTpkYzozZTphMzo4ODo0MjozMTpmNTpkMTplMzo3ZjoKKyAgICAgICAgYWU6ZDg6OGU6MDA6NWE6NzQ6OTg6YjA6NGY6YzY6ZmY6MjM6N2I6NWM6NzM6MDA6Nzg6Yzk6CisgICAgICAgIGRiOjRlCisKK1RDIFRydXN0Q2VudGVyLCBHZXJtYW55LCBDbGFzcyAzIENBCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiA2MjpBQjpCNjoxNTo0QTpCNDpCMDoxNjo3NzpGRjpBRTpDRjoxNjoxNjoyQjo4QworUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVOVENDQTU2Z0F3SUJBZ0lCQkRBTkJna3Foa2lHOXcwQkFRUUZBRENCdkRFTE1Ba0dBMVVFQmhNQ1JFVXgKK0VEQU9CZ05WQkFnVEIwaGhiV0oxY21jeEVEQU9CZ05WQkFjVEIwaGhiV0oxY21jeE9qQTRCZ05WQkFvVE1WUkQKK0lGUnlkWE4wUTJWdWRHVnlJR1p2Y2lCVFpXTjFjbWwwZVNCcGJpQkVZWFJoSUU1bGRIZHZjbXR6SUVkdFlrZ3gKK0lqQWdCZ05WQkFzVEdWUkRJRlJ5ZFhOMFEyVnVkR1Z5SUVOc1lYTnpJRE1nUTBFeEtUQW5CZ2txaGtpRzl3MEIKK0NRRVdHbU5sY25ScFptbGpZWFJsUUhSeWRYTjBZMlZ1ZEdWeUxtUmxNQjRYRFRrNE1ETXdPVEV6TlRnME9Wb1gKK0RUQTFNVEl6TVRFek5UZzBPVm93Z2J3eEN6QUpCZ05WQkFZVEFrUkZNUkF3RGdZRFZRUUlFd2RJWVcxaWRYSm4KK01SQXdEZ1lEVlFRSEV3ZElZVzFpZFhKbk1Ub3dPQVlEVlFRS0V6RlVReUJVY25WemRFTmxiblJsY2lCbWIzSWcKK1UyVmpkWEpwZEhrZ2FXNGdSR0YwWVNCT1pYUjNiM0pyY3lCSGJXSklNU0l3SUFZRFZRUUxFeGxVUXlCVWNuVnoKK2RFTmxiblJsY2lCRGJHRnpjeUF6SUVOQk1Ta3dKd1lKS29aSWh2Y05BUWtCRmhwalpYSjBhV1pwWTJGMFpVQjAKK2NuVnpkR05sYm5SbGNpNWtaVENCbnpBTkJna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBdHJUQk5RVXUKK0RZM3NvRUJxSEE0bnBsQ1NhMUFiQjk0dTUzYk00TnI4aEtoZWpHTnFLMDNaVGdKMkVjRUw4bzE1eWdDMjhiQU8KKzEvdWtGejJ2cTJsNmxpZS9yek9obWlwWnFzUzFOd2p5RXFVeHRrUDFNcFp4S0NpcmpTaUczN3Z1NHd4OU1OYkQKK1VxdVBYU2VjYThDajV3VnJWMGxFczI3cVpNL1NqbnBRZDNjQ0F3RUFBYU9DQVVNd2dnRS9NRUFHQ1dDR1NBR0cKKytFSUJBd1F6RmpGb2RIUndjem92TDNkM2R5NTBjblZ6ZEdObGJuUmxjaTVrWlM5aloya3RZbWx1TDJOb1pXTnIKK0xYSmxkaTVqWjJrL01FQUdDV0NHU0FHRytFSUJCQVF6RmpGb2RIUndjem92TDNkM2R5NTBjblZ6ZEdObGJuUmwKK2NpNWtaUzlqWjJrdFltbHVMMk5vWldOckxYSmxkaTVqWjJrL01Ed0dDV0NHU0FHRytFSUJCd1F2Rmkxb2RIUncKK2N6b3ZMM2QzZHk1MGNuVnpkR05sYm5SbGNpNWtaUzlqWjJrdFltbHVMMUpsYm1WM0xtTm5hVDh3UGdZSllJWkkKK0FZYjRRZ0VJQkRFV0wyaDBkSEE2THk5M2QzY3VkSEoxYzNSalpXNTBaWEl1WkdVdlozVnBaR1ZzYVc1bGN5OXAKK2JtUmxlQzVvZEcxc01DZ0dDV0NHU0FHRytFSUJEUVFiRmhsVVF5QlVjblZ6ZEVObGJuUmxjaUJEYkdGemN5QXoKK0lFTkJNQkVHQ1dDR1NBR0crRUlCQVFRRUF3SUFCekFOQmdrcWhraUc5dzBCQVFRRkFBT0JnUUNFaGxCaWVhQW4KKzRTVzZDYkUwRHhNSjdTM0tvK2FWK1RDc3pSZWx6ajJYbmV4OGp5Wi93R0hLSXZlUjNUdzJXWnFiZGZlODVNanQKKzdBSzJJcWZ6TFBISWtuaHR0dTdGS095QUlFKzVhd2puTDZlR0huMnhDSjlVdVFBM1BLRFlHc2lXSFBReUZKdzUKK2xiZnU4RU5Kd2w3b3kzbHZVNy83U1lvczJFdlpWZklTY0E9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiA0ICgweDQpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1ERSwgU1Q9SGFtYnVyZywgTD1IYW1idXJnLCBPPVRDIFRydXN0Q2VudGVyIGZvciBTZWN1cml0eSBpbiBEYXRhIE5ldHdvcmtzIEdtYkgsIE9VPVRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EvRW1haWw9Y2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IE1hciAgOSAxMzo1ODo0OSAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogRGVjIDMxIDEzOjU4OjQ5IDIwMDUgR01UCisgICAgICAgIFN1YmplY3Q6IEM9REUsIFNUPUhhbWJ1cmcsIEw9SGFtYnVyZywgTz1UQyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJILCBPVT1UQyBUcnVzdENlbnRlciBDbGFzcyAzIENBL0VtYWlsPWNlcnRpZmljYXRlQHRydXN0Y2VudGVyLmRlCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpiNjpiNDpjMTozNTowNToyZTowZDo4ZDplYzphMDo0MDo2YToxYzowZToKKyAgICAgICAgICAgICAgICAgICAgMjc6YTY6NTA6OTI6NmI6NTA6MWI6MDc6ZGU6MmU6ZTc6NzY6Y2M6ZTA6ZGE6CisgICAgICAgICAgICAgICAgICAgIGZjOjg0OmE4OjVlOjhjOjYzOjZhOjJiOjRkOmQ5OjRlOjAyOjc2OjExOmMxOgorICAgICAgICAgICAgICAgICAgICAwYjpmMjo4ZDo3OTpjYTowMDpiNjpmMTpiMDowZTpkNzpmYjphNDoxNzozZDoKKyAgICAgICAgICAgICAgICAgICAgYWY6YWI6Njk6N2E6OTY6Mjc6YmY6YWY6MzM6YTE6OWE6MmE6NTk6YWE6YzQ6CisgICAgICAgICAgICAgICAgICAgIGI1OjM3OjA4OmYyOjEyOmE1OjMxOmI2OjQzOmY1OjMyOjk2OjcxOjI4OjI4OgorICAgICAgICAgICAgICAgICAgICBhYjo4ZDoyODo4NjpkZjpiYjplZTplMzowYzo3ZDozMDpkNjpjMzo1MjphYjoKKyAgICAgICAgICAgICAgICAgICAgOGY6NWQ6Mjc6OWM6NmI6YzA6YTM6ZTc6MDU6NmI6NTc6NDk6NDQ6YjM6NmU6CisgICAgICAgICAgICAgICAgICAgIGVhOjY0OmNmOmQyOjhlOjdhOjUwOjc3Ojc3CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIE5ldHNjYXBlIFJldm9jYXRpb24gVXJsOiAKKyAgICAgICAgICAgICAgICBodHRwczovL3d3dy50cnVzdGNlbnRlci5kZS9jZ2ktYmluL2NoZWNrLXJldi5jZ2k/CisgICAgICAgICAgICBOZXRzY2FwZSBDQSBSZXZvY2F0aW9uIFVybDogCisgICAgICAgICAgICAgICAgaHR0cHM6Ly93d3cudHJ1c3RjZW50ZXIuZGUvY2dpLWJpbi9jaGVjay1yZXYuY2dpPworICAgICAgICAgICAgTmV0c2NhcGUgUmVuZXdhbCBVcmw6IAorICAgICAgICAgICAgICAgIGh0dHBzOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NnaS1iaW4vUmVuZXcuY2dpPworICAgICAgICAgICAgTmV0c2NhcGUgQ0EgUG9saWN5IFVybDogCisgICAgICAgICAgICAgICAgaHR0cDovL3d3dy50cnVzdGNlbnRlci5kZS9ndWlkZWxpbmVzL2luZGV4Lmh0bWwKKyAgICAgICAgICAgIE5ldHNjYXBlIENvbW1lbnQ6IAorICAgICAgICAgICAgICAgIFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EKKyAgICAgICAgICAgIE5ldHNjYXBlIENlcnQgVHlwZTogCisgICAgICAgICAgICAgICAgU1NMIENBLCBTL01JTUUgQ0EsIE9iamVjdCBTaWduaW5nIENBCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgODQ6ODY6NTA6NjI6Nzk6YTA6Mjc6ZTE6MjU6YmE6MDk6YjE6MzQ6MGY6MTM6MDk6ZWQ6MmQ6CisgICAgICAgIGNhOmEzOmU2Ojk1OmY5OjMwOmFjOmNkOjE3OmE1OmNlOjNkOjk3OjlkOmVjOjdjOjhmOjI2OgorICAgICAgICA3ZjpjMDo2MTpjYToyMjpmNzo5MTpkZDozYzozNjo1OTo5YTo5Yjo3NTpmNzpiYzplNDpjODoKKyAgICAgICAgZWQ6ZWM6MDI6YjY6MjI6YTc6ZjM6MmM6ZjE6Yzg6OTI6Nzg6NmQ6YjY6ZWU6YzU6Mjg6ZWM6CisgICAgICAgIDgwOjIwOjRmOmI5OjZiOjA4OmU3OjJmOmE3Ojg2OjFlOjdkOmIxOjA4OjlmOjU0OmI5OjAwOgorICAgICAgICAzNzozYzphMDpkODoxYTpjODo5NjoxYzpmNDozMjoxNDo5YzozOTo5NTpiNzplZTpmMDo0MzoKKyAgICAgICAgNDk6YzI6NWU6ZTg6Y2I6Nzk6NmY6NTM6YmY6ZmI6NDk6OGE6MmM6ZDg6NGI6ZDk6NTU6ZjI6CisgICAgICAgIDEyOjcwCisKK1RDIFRydXN0Q2VudGVyLCBHZXJtYW55LCBDbGFzcyA0IENBCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiBCRjpBRjpFQzpDNDpEQTpGOTozMDpGOTpDQTozNTpDQToyNTpFNDozRjo4RDo4OQorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVOVENDQTU2Z0F3SUJBZ0lCQlRBTkJna3Foa2lHOXcwQkFRUUZBRENCdkRFTE1Ba0dBMVVFQmhNQ1JFVXgKK0VEQU9CZ05WQkFnVEIwaGhiV0oxY21jeEVEQU9CZ05WQkFjVEIwaGhiV0oxY21jeE9qQTRCZ05WQkFvVE1WUkQKK0lGUnlkWE4wUTJWdWRHVnlJR1p2Y2lCVFpXTjFjbWwwZVNCcGJpQkVZWFJoSUU1bGRIZHZjbXR6SUVkdFlrZ3gKK0lqQWdCZ05WQkFzVEdWUkRJRlJ5ZFhOMFEyVnVkR1Z5SUVOc1lYTnpJRFFnUTBFeEtUQW5CZ2txaGtpRzl3MEIKK0NRRVdHbU5sY25ScFptbGpZWFJsUUhSeWRYTjBZMlZ1ZEdWeUxtUmxNQjRYRFRrNE1ETXdPVEUwTURBeU1Gb1gKK0RUQTFNVEl6TVRFME1EQXlNRm93Z2J3eEN6QUpCZ05WQkFZVEFrUkZNUkF3RGdZRFZRUUlFd2RJWVcxaWRYSm4KK01SQXdEZ1lEVlFRSEV3ZElZVzFpZFhKbk1Ub3dPQVlEVlFRS0V6RlVReUJVY25WemRFTmxiblJsY2lCbWIzSWcKK1UyVmpkWEpwZEhrZ2FXNGdSR0YwWVNCT1pYUjNiM0pyY3lCSGJXSklNU0l3SUFZRFZRUUxFeGxVUXlCVWNuVnoKK2RFTmxiblJsY2lCRGJHRnpjeUEwSUVOQk1Ta3dKd1lKS29aSWh2Y05BUWtCRmhwalpYSjBhV1pwWTJGMFpVQjAKK2NuVnpkR05sYm5SbGNpNWtaVENCbnpBTkJna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBdnk5ajFqWjcKK3NnM1RWZlZrYk9ZbFhjYTB5QlM2SlRpRDYxWmlwVldwWmFQMEk1bkNTN25RelZSbnBxT2dvNmt6SzNia3ZhMTMKK3N1MWNFblREeGJZUFVwcHlrME9RWW1ZVkQwV2wzZURkdUc5QWJsZkJlWEtqWUtxNmRoMFNpVk5hL0FLKzRRa1QKK3hVb3YzRDJMR2EzWGl5UkYrMHowelZ3MUhTbE1VZlB5YkZVQ0F3RUFBYU9DQVVNd2dnRS9NRUFHQ1dDR1NBR0cKKytFSUJBd1F6RmpGb2RIUndjem92TDNkM2R5NTBjblZ6ZEdObGJuUmxjaTVrWlM5aloya3RZbWx1TDJOb1pXTnIKK0xYSmxkaTVqWjJrL01FQUdDV0NHU0FHRytFSUJCQVF6RmpGb2RIUndjem92TDNkM2R5NTBjblZ6ZEdObGJuUmwKK2NpNWtaUzlqWjJrdFltbHVMMk5vWldOckxYSmxkaTVqWjJrL01Ed0dDV0NHU0FHRytFSUJCd1F2Rmkxb2RIUncKK2N6b3ZMM2QzZHk1MGNuVnpkR05sYm5SbGNpNWtaUzlqWjJrdFltbHVMMUpsYm1WM0xtTm5hVDh3UGdZSllJWkkKK0FZYjRRZ0VJQkRFV0wyaDBkSEE2THk5M2QzY3VkSEoxYzNSalpXNTBaWEl1WkdVdlozVnBaR1ZzYVc1bGN5OXAKK2JtUmxlQzVvZEcxc01DZ0dDV0NHU0FHRytFSUJEUVFiRmhsVVF5QlVjblZ6ZEVObGJuUmxjaUJEYkdGemN5QTAKK0lFTkJNQkVHQ1dDR1NBR0crRUlCQVFRRUF3SUFCekFOQmdrcWhraUc5dzBCQVFRRkFBT0JnUUNVYUJRYkpaNHAKK21iR3lJOUpFczVXZjBaNVZCTjNqTDRJelZaWjNHWjBybm1VYytvcmp4NDhsL0xFZVZVWVBqLzlQTnkra2RsbW0KK1pPdlZGbkM5M1pVekRLUU5KT3RrVUxSREVmSkR2ZzF4bUNMc0FhL3M5OGRjY2NOMWtWZ1o2TjJnOUxUeHZCQksKKzg1TzBCa203SDJiU3ZYUkg0WnI1NjllcmJSKzY0UjBzMmc9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiA1ICgweDUpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1ERSwgU1Q9SGFtYnVyZywgTD1IYW1idXJnLCBPPVRDIFRydXN0Q2VudGVyIGZvciBTZWN1cml0eSBpbiBEYXRhIE5ldHdvcmtzIEdtYkgsIE9VPVRDIFRydXN0Q2VudGVyIENsYXNzIDQgQ0EvRW1haWw9Y2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IE1hciAgOSAxNDowMDoyMCAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogRGVjIDMxIDE0OjAwOjIwIDIwMDUgR01UCisgICAgICAgIFN1YmplY3Q6IEM9REUsIFNUPUhhbWJ1cmcsIEw9SGFtYnVyZywgTz1UQyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJILCBPVT1UQyBUcnVzdENlbnRlciBDbGFzcyA0IENBL0VtYWlsPWNlcnRpZmljYXRlQHRydXN0Y2VudGVyLmRlCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpiZjoyZjo2MzpkNjozNjo3YjpiMjowZDpkMzo1NTpmNTo2NDo2YzplNjoKKyAgICAgICAgICAgICAgICAgICAgMjU6NWQ6YzY6YjQ6Yzg6MTQ6YmE6MjU6Mzg6ODM6ZWI6NTY6NjI6YTU6NTU6CisgICAgICAgICAgICAgICAgICAgIGE5OjY1OmEzOmY0OjIzOjk5OmMyOjRiOmI5OmQwOmNkOjU0OjY3OmE2OmEzOgorICAgICAgICAgICAgICAgICAgICBhMDphMzphOTozMzoyYjo3NjplNDpiZDphZDo3NzpiMjplZDo1YzoxMjo3NDoKKyAgICAgICAgICAgICAgICAgICAgYzM6YzU6YjY6MGY6NTI6OWE6NzI6OTM6NDM6OTA6NjI6NjY6MTU6MGY6NDU6CisgICAgICAgICAgICAgICAgICAgIGE1OmRkOmUwOmRkOmI4OjZmOjQwOjZlOjU3OmMxOjc5OjcyOmEzOjYwOmFhOgorICAgICAgICAgICAgICAgICAgICBiYTo3NjoxZDoxMjo4OTo1Mzo1YTpmYzowMjpiZTplMTowOToxMzpjNTo0YToKKyAgICAgICAgICAgICAgICAgICAgMmY6ZGM6M2Q6OGI6MTk6YWQ6ZDc6OGI6MjQ6NDU6ZmI6NGM6ZjQ6Y2Q6NWM6CisgICAgICAgICAgICAgICAgICAgIDM1OjFkOjI5OjRjOjUxOmYzOmYyOjZjOjU1CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIE5ldHNjYXBlIFJldm9jYXRpb24gVXJsOiAKKyAgICAgICAgICAgICAgICBodHRwczovL3d3dy50cnVzdGNlbnRlci5kZS9jZ2ktYmluL2NoZWNrLXJldi5jZ2k/CisgICAgICAgICAgICBOZXRzY2FwZSBDQSBSZXZvY2F0aW9uIFVybDogCisgICAgICAgICAgICAgICAgaHR0cHM6Ly93d3cudHJ1c3RjZW50ZXIuZGUvY2dpLWJpbi9jaGVjay1yZXYuY2dpPworICAgICAgICAgICAgTmV0c2NhcGUgUmVuZXdhbCBVcmw6IAorICAgICAgICAgICAgICAgIGh0dHBzOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NnaS1iaW4vUmVuZXcuY2dpPworICAgICAgICAgICAgTmV0c2NhcGUgQ0EgUG9saWN5IFVybDogCisgICAgICAgICAgICAgICAgaHR0cDovL3d3dy50cnVzdGNlbnRlci5kZS9ndWlkZWxpbmVzL2luZGV4Lmh0bWwKKyAgICAgICAgICAgIE5ldHNjYXBlIENvbW1lbnQ6IAorICAgICAgICAgICAgICAgIFRDIFRydXN0Q2VudGVyIENsYXNzIDQgQ0EKKyAgICAgICAgICAgIE5ldHNjYXBlIENlcnQgVHlwZTogCisgICAgICAgICAgICAgICAgU1NMIENBLCBTL01JTUUgQ0EsIE9iamVjdCBTaWduaW5nIENBCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgOTQ6Njg6MTQ6MWI6MjU6OWU6Mjk6OTk6YjE6YjI6MjM6ZDI6NDQ6YjM6OTU6OWY6ZDE6OWU6CisgICAgICAgIDU1OjA0OmRkOmUzOjJmOjgyOjMzOjU1Ojk2Ojc3OjE5OjlkOjJiOjllOjY1OjFjOmZhOjhhOgorICAgICAgICBlMzpjNzo4ZjoyNTpmYzpiMToxZTo1NTo0NjowZjo4ZjpmZjo0ZjozNzoyZjphNDo3Njo1OToKKyAgICAgICAgYTY6NjQ6ZWI6ZDU6MTY6NzA6YmQ6ZGQ6OTU6MzM6MGM6YTQ6MGQ6MjQ6ZWI6NjQ6NTA6YjQ6CisgICAgICAgIDQzOjExOmYyOjQzOmJlOjBkOjcxOjk4OjIyOmVjOjAxOmFmOmVjOmY3OmM3OjVjOjcxOmMzOgorICAgICAgICA3NTo5MTo1ODoxOTplODpkZDphMDpmNDpiNDpmMTpiYzoxMDo0YTpmMzo5MzpiNDowNjo0OToKKyAgICAgICAgYmI6MWY6NjY6ZDI6YmQ6NzQ6NDc6ZTE6OWE6Zjk6ZWI6ZDc6YWI6NmQ6MWY6YmE6ZTE6MWQ6CisgICAgICAgIDJjOmRhCisKK1RoYXd0ZSBQZXJzb25hbCBCYXNpYyBDQQorPT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IEU2OjBCOkQyOkM5OkNBOjJEOjg4OkRCOjFBOjcxOjBFOjRCOjc4OkVCOjAyOjQxCitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRElUQ0NBb3FnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFRRkFEQ0J5ekVMTUFrR0ExVUVCaE1DV2tFeAorRlRBVEJnTlZCQWdUREZkbGMzUmxjbTRnUTJGd1pURVNNQkFHQTFVRUJ4TUpRMkZ3WlNCVWIzZHVNUm93R0FZRAorVlFRS0V4RlVhR0YzZEdVZ1EyOXVjM1ZzZEdsdVp6RW9NQ1lHQTFVRUN4TWZRMlZ5ZEdsbWFXTmhkR2x2YmlCVAorWlhKMmFXTmxjeUJFYVhacGMybHZiakVoTUI4R0ExVUVBeE1ZVkdoaGQzUmxJRkJsY25OdmJtRnNJRUpoYzJsagorSUVOQk1TZ3dKZ1lKS29aSWh2Y05BUWtCRmhsd1pYSnpiMjVoYkMxaVlYTnBZMEIwYUdGM2RHVXVZMjl0TUI0WAorRFRrMk1ERXdNVEF3TURBd01Gb1hEVEl3TVRJek1USXpOVGsxT1Zvd2djc3hDekFKQmdOVkJBWVRBbHBCTVJVdworRXdZRFZRUUlFd3hYWlhOMFpYSnVJRU5oY0dVeEVqQVFCZ05WQkFjVENVTmhjR1VnVkc5M2JqRWFNQmdHQTFVRQorQ2hNUlZHaGhkM1JsSUVOdmJuTjFiSFJwYm1jeEtEQW1CZ05WQkFzVEgwTmxjblJwWm1sallYUnBiMjRnVTJWeQorZG1salpYTWdSR2wyYVhOcGIyNHhJVEFmQmdOVkJBTVRHRlJvWVhkMFpTQlFaWEp6YjI1aGJDQkNZWE5wWXlCRAorUVRFb01DWUdDU3FHU0liM0RRRUpBUllaY0dWeWMyOXVZV3d0WW1GemFXTkFkR2hoZDNSbExtTnZiVENCbnpBTgorQmdrcWhraUc5dzBCQVFFRkFBT0JqUUF3Z1lrQ2dZRUF2THlUVTIzQVVFK0NGZVpJbERXbVdyNXZRdm9QUis1MworZFhMZGpVbWJsbGVnZU5US1AxR3phUXVSZGhjaUI1ZHF4RkdUUytDTjd6ZVZvUXhOMmpTUUhSZUpsK0ExT0ZkSword1BRSWNPazhSSHRRZm1HYWtPTWowNGdSUmlmMUN3Y091OTNSZnlBS2lMbFdDeTRjZ05yeDQ1NHA3eFM5Q2tUNworRzFzWTBiOGpreUVDQXdFQUFhTVRNQkV3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFOQmdrcWhraUc5dzBCQVFRRgorQUFPQmdRQXQ0cGxyc0QxNmlkZFpvcFFCSHl2ZEVrdFR3cTEvcXFjQVhKRkFWeVZLT0txRWNMblpnQStsZTF6NworYzhhOTE0cGhYQVBqTFNlb0YrQ0VoVUxjWHB2R3Q3SnR1M1N2NUQvTHA3ZXc0RjIrZUlNbGxOTGJnUTk1QjIxUAorOURrVldsSUJlOTR5MWswNDloSmNCbERmQlZ1OUZFdWgzeW02TzBHTjkyTldvZDhpc1E9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiAwICgweDApCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1aQSwgU1Q9V2VzdGVybiBDYXBlLCBMPUNhcGUgVG93biwgTz1UaGF3dGUgQ29uc3VsdGluZywgT1U9Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbiwgQ049VGhhd3RlIFBlcnNvbmFsIEJhc2ljIENBL0VtYWlsPXBlcnNvbmFsLWJhc2ljQHRoYXd0ZS5jb20KKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IEphbiAgMSAwMDowMDowMCAxOTk2IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogRGVjIDMxIDIzOjU5OjU5IDIwMjAgR01UCisgICAgICAgIFN1YmplY3Q6IEM9WkEsIFNUPVdlc3Rlcm4gQ2FwZSwgTD1DYXBlIFRvd24sIE89VGhhd3RlIENvbnN1bHRpbmcsIE9VPUNlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24sIENOPVRoYXd0ZSBQZXJzb25hbCBCYXNpYyBDQS9FbWFpbD1wZXJzb25hbC1iYXNpY0B0aGF3dGUuY29tCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpiYzpiYzo5Mzo1Mzo2ZDpjMDo1MDo0Zjo4MjoxNTplNjo0ODo5NDozNToKKyAgICAgICAgICAgICAgICAgICAgYTY6NWE6YmU6NmY6NDI6ZmE6MGY6NDc6ZWU6Nzc6NzU6NzI6ZGQ6OGQ6NDk6CisgICAgICAgICAgICAgICAgICAgIDliOjk2OjU3OmEwOjc4OmQ0OmNhOjNmOjUxOmIzOjY5OjBiOjkxOjc2OjE3OgorICAgICAgICAgICAgICAgICAgICAyMjowNzo5Nzo2YTpjNDo1MTo5Mzo0YjplMDo4ZDplZjozNzo5NTphMTowYzoKKyAgICAgICAgICAgICAgICAgICAgNGQ6ZGE6MzQ6OTA6MWQ6MTc6ODk6OTc6ZTA6MzU6Mzg6NTc6NGE6YzA6ZjQ6CisgICAgICAgICAgICAgICAgICAgIDA4OjcwOmU5OjNjOjQ0OjdiOjUwOjdlOjYxOjlhOjkwOmUzOjIzOmQzOjg4OgorICAgICAgICAgICAgICAgICAgICAxMTo0NjoyNzpmNTowYjowNzowZTpiYjpkZDpkMTo3ZjoyMDowYTo4ODpiOToKKyAgICAgICAgICAgICAgICAgICAgNTY6MGI6MmU6MWM6ODA6ZGE6ZjE6ZTM6OWU6Mjk6ZWY6MTQ6YmQ6MGE6NDQ6CisgICAgICAgICAgICAgICAgICAgIGZiOjFiOjViOjE4OmQxOmJmOjIzOjkzOjIxCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogY3JpdGljYWwKKyAgICAgICAgICAgICAgICBDQTpUUlVFCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgMmQ6ZTI6OTk6NmI6YjA6M2Q6N2E6ODk6ZDc6NTk6YTI6OTQ6MDE6MWY6MmI6ZGQ6MTI6NGI6CisgICAgICAgIDUzOmMyOmFkOjdmOmFhOmE3OjAwOjVjOjkxOjQwOjU3OjI1OjRhOjM4OmFhOjg0OjcwOmI5OgorICAgICAgICBkOTo4MDowZjphNTo3Yjo1YzpmYjo3MzpjNjpiZDpkNzo4YTo2MTo1YzowMzplMzoyZDoyNzoKKyAgICAgICAgYTg6MTc6ZTA6ODQ6ODU6NDI6ZGM6NWU6OWI6YzY6Yjc6YjI6NmQ6YmI6NzQ6YWY6ZTQ6M2Y6CisgICAgICAgIGNiOmE3OmI3OmIwOmUwOjVkOmJlOjc4OjgzOjI1Ojk0OmQyOmRiOjgxOjBmOjc5OjA3OjZkOgorICAgICAgICA0ZjpmNDozOToxNTo1YTo1MjowMTo3YjpkZTozMjpkNjo0ZDozODpmNjoxMjo1YzowNjo1MDoKKyAgICAgICAgZGY6MDU6NWI6YmQ6MTQ6NGI6YTE6ZGY6Mjk6YmE6M2I6NDE6OGQ6Zjc6NjM6NTY6YTE6ZGY6CisgICAgICAgIDIyOmIxCisKK1RoYXd0ZSBQZXJzb25hbCBGcmVlbWFpbCBDQQorPT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IDFFOjc0OkMzOjg2OjNDOjBDOjM1OkM1OjNFOkMyOjdGOkVGOjNDOkFBOjNDOkQ5CitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRExUQ0NBcGFnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFRRkFEQ0IwVEVMTUFrR0ExVUVCaE1DV2tFeAorRlRBVEJnTlZCQWdUREZkbGMzUmxjbTRnUTJGd1pURVNNQkFHQTFVRUJ4TUpRMkZ3WlNCVWIzZHVNUm93R0FZRAorVlFRS0V4RlVhR0YzZEdVZ1EyOXVjM1ZzZEdsdVp6RW9NQ1lHQTFVRUN4TWZRMlZ5ZEdsbWFXTmhkR2x2YmlCVAorWlhKMmFXTmxjeUJFYVhacGMybHZiakVrTUNJR0ExVUVBeE1iVkdoaGQzUmxJRkJsY25OdmJtRnNJRVp5WldWdAorWVdsc0lFTkJNU3N3S1FZSktvWklodmNOQVFrQkZoeHdaWEp6YjI1aGJDMW1jbVZsYldGcGJFQjBhR0YzZEdVdQorWTI5dE1CNFhEVGsyTURFd01UQXdNREF3TUZvWERUSXdNVEl6TVRJek5UazFPVm93Z2RFeEN6QUpCZ05WQkFZVAorQWxwQk1SVXdFd1lEVlFRSUV3eFhaWE4wWlhKdUlFTmhjR1V4RWpBUUJnTlZCQWNUQ1VOaGNHVWdWRzkzYmpFYQorTUJnR0ExVUVDaE1SVkdoaGQzUmxJRU52Ym5OMWJIUnBibWN4S0RBbUJnTlZCQXNUSDBObGNuUnBabWxqWVhScAorYjI0Z1UyVnlkbWxqWlhNZ1JHbDJhWE5wYjI0eEpEQWlCZ05WQkFNVEcxUm9ZWGQwWlNCUVpYSnpiMjVoYkNCRworY21WbGJXRnBiQ0JEUVRFck1Da0dDU3FHU0liM0RRRUpBUlljY0dWeWMyOXVZV3d0Wm5KbFpXMWhhV3hBZEdoaAorZDNSbExtTnZiVENCbnpBTkJna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBMUduWDFMQ1VaRnR4NlVmWQorREZHMjZuS1JzSVJlZlMwTmozc1MzNFVsZFNoME9rSXNZeWVmbFh0TDczNFpoeDJHNnFQZHVjNldaQnJDRkc1RQorckh6bWoraE5EM0VmUURpbUFLT0hlUGI1bElaZXJlckFYbmJyMlJTalhXNTZmQXlsUzFWL0Joa3BmNTZhSnRWcQordXpna0NHcVl4N0hhbzVpUi9YbmI1VnJFSExrQ0F3RUFBYU1UTUJFd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBTgorQmdrcWhraUc5dzBCQVFRRkFBT0JnUURIN0pKK1R2ajFscVZuWWlxazhFMFJZTkJ2aldCWVlhd211MUkxWEFqUAorTVB1b1NwYUtIMkpDSTR3WEQvUzZaSndYckVjcDM1MllYdEpzWUhGY29xemNlZVBuYmdCSEg3VU5LT2dDbmVTYQorL1JQMHB0bDhzZmpjWHlNbUNaR0FjOUFVRzk1RHFZTWw4dWFjTHhYSy9xYXJpZ2QxaXd6ZFVZUnI1UGpSem5laQorZ1E9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiAwICgweDApCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1aQSwgU1Q9V2VzdGVybiBDYXBlLCBMPUNhcGUgVG93biwgTz1UaGF3dGUgQ29uc3VsdGluZywgT1U9Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbiwgQ049VGhhd3RlIFBlcnNvbmFsIEZyZWVtYWlsIENBL0VtYWlsPXBlcnNvbmFsLWZyZWVtYWlsQHRoYXd0ZS5jb20KKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IEphbiAgMSAwMDowMDowMCAxOTk2IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogRGVjIDMxIDIzOjU5OjU5IDIwMjAgR01UCisgICAgICAgIFN1YmplY3Q6IEM9WkEsIFNUPVdlc3Rlcm4gQ2FwZSwgTD1DYXBlIFRvd24sIE89VGhhd3RlIENvbnN1bHRpbmcsIE9VPUNlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24sIENOPVRoYXd0ZSBQZXJzb25hbCBGcmVlbWFpbCBDQS9FbWFpbD1wZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUuY29tCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpkNDo2OTpkNzpkNDpiMDo5NDo2NDo1Yjo3MTplOTo0NzpkODowYzo1MToKKyAgICAgICAgICAgICAgICAgICAgYjY6ZWE6NzI6OTE6YjA6ODQ6NWU6N2Q6MmQ6MGQ6OGY6N2I6MTI6ZGY6ODU6CisgICAgICAgICAgICAgICAgICAgIDI1Ojc1OjI4Ojc0OjNhOjQyOjJjOjYzOjI3OjlmOjk1OjdiOjRiOmVmOjdlOgorICAgICAgICAgICAgICAgICAgICAxOTo4NzoxZDo4NjplYTphMzpkZDpiOTpjZTo5Njo2NDoxYTpjMjoxNDo2ZToKKyAgICAgICAgICAgICAgICAgICAgNDQ6YWM6N2M6ZTY6OGY6ZTg6NGQ6MGY6NzE6MWY6NDA6Mzg6YTY6MDA6YTM6CisgICAgICAgICAgICAgICAgICAgIDg3Ojc4OmY2OmY5Ojk0Ojg2OjVlOmFkOmVhOmMwOjVlOjc2OmViOmQ5OjE0OgorICAgICAgICAgICAgICAgICAgICBhMzo1ZDo2ZTo3YTo3YzowYzphNTo0Yjo1NTo3ZjowNjoxOToyOTo3Zjo5ZToKKyAgICAgICAgICAgICAgICAgICAgOWE6MjY6ZDU6NmE6YmI6Mzg6MjQ6MDg6NmE6OTg6Yzc6YjE6ZGE6YTM6OTg6CisgICAgICAgICAgICAgICAgICAgIDkxOmZkOjc5OmRiOmU1OjVhOmM0OjFjOmI5CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogY3JpdGljYWwKKyAgICAgICAgICAgICAgICBDQTpUUlVFCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgYzc6ZWM6OTI6N2U6NGU6Zjg6ZjU6OTY6YTU6Njc6NjI6MmE6YTQ6ZjA6NGQ6MTE6NjA6ZDA6CisgICAgICAgIDZmOjhkOjYwOjU4OjYxOmFjOjI2OmJiOjUyOjM1OjVjOjA4OmNmOjMwOmZiOmE4OjRhOjk2OgorICAgICAgICA4YToxZjo2Mjo0MjoyMzo4YzoxNzowZjpmNDpiYTo2NDo5YzoxNzphYzo0NzoyOTpkZjo5ZDoKKyAgICAgICAgOTg6NWU6ZDI6NmM6NjA6NzE6NWM6YTI6YWM6ZGM6Nzk6ZTM6ZTc6NmU6MDA6NDc6MWY6YjU6CisgICAgICAgIDBkOjI4OmU4OjAyOjlkOmU0OjlhOmZkOjEzOmY0OmE2OmQ5OjdjOmIxOmY4OmRjOjVmOjIzOgorICAgICAgICAyNjowOTo5MTo4MDo3MzpkMDoxNDoxYjpkZTo0MzphOTo4MzoyNTpmMjplNjo5YzoyZjoxNToKKyAgICAgICAgY2E6ZmU6YTY6YWI6OGE6MDc6NzU6OGI6MGM6ZGQ6NTE6ODQ6NmI6ZTQ6Zjg6ZDE6Y2U6Nzc6CisgICAgICAgIGEyOjgxCisKK1RoYXd0ZSBQZXJzb25hbCBQcmVtaXVtIENBCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiAzQTpCMjpERToyMjo5QToyMDo5Mzo0OTpGOTpFRDpDODpEMjo4QTpFNzo2ODowRAorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURLVENDQXBLZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRUUZBRENCenpFTE1Ba0dBMVVFQmhNQ1drRXgKK0ZUQVRCZ05WQkFnVERGZGxjM1JsY200Z1EyRndaVEVTTUJBR0ExVUVCeE1KUTJGd1pTQlViM2R1TVJvd0dBWUQKK1ZRUUtFeEZVYUdGM2RHVWdRMjl1YzNWc2RHbHVaekVvTUNZR0ExVUVDeE1mUTJWeWRHbG1hV05oZEdsdmJpQlQKK1pYSjJhV05sY3lCRWFYWnBjMmx2YmpFak1DRUdBMVVFQXhNYVZHaGhkM1JsSUZCbGNuTnZibUZzSUZCeVpXMXAKK2RXMGdRMEV4S2pBb0Jna3Foa2lHOXcwQkNRRVdHM0JsY25OdmJtRnNMWEJ5WlcxcGRXMUFkR2hoZDNSbExtTnYKK2JUQWVGdzA1TmpBeE1ERXdNREF3TURCYUZ3MHlNREV5TXpFeU16VTVOVGxhTUlIUE1Rc3dDUVlEVlFRR0V3SmEKK1FURVZNQk1HQTFVRUNCTU1WMlZ6ZEdWeWJpQkRZWEJsTVJJd0VBWURWUVFIRXdsRFlYQmxJRlJ2ZDI0eEdqQVkKK0JnTlZCQW9URVZSb1lYZDBaU0JEYjI1emRXeDBhVzVuTVNnd0pnWURWUVFMRXg5RFpYSjBhV1pwWTJGMGFXOXUKK0lGTmxjblpwWTJWeklFUnBkbWx6YVc5dU1TTXdJUVlEVlFRREV4cFVhR0YzZEdVZ1VHVnljMjl1WVd3Z1VISmwKK2JXbDFiU0JEUVRFcU1DZ0dDU3FHU0liM0RRRUpBUlliY0dWeWMyOXVZV3d0Y0hKbGJXbDFiVUIwYUdGM2RHVXUKK1kyOXRNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0JnUURKWnRuNEIwVFB1WXd1OEtIdkUwVnMKK0JkL2VKeFpSTmtFUmJHdzc3ZjRRZlJLZTVadENtdjVnTWNObXQzTTZTSzVPMERJM2xJaTFEYmJaOC9KRTJkV0kKK0V0MTJUZklhL0c4akhucngySmhGVGdjUTd4WkMwRU4xYlVyZTRxckpNZjhmQUhCOFpzOFFKUWk2K3U0QTZVWUQKK1ppY1JGVHVxVy9LWTNUWkNzdHFJZFFJREFRQUJveE13RVRBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUEwR0NTcUcKK1NJYjNEUUVCQkFVQUE0R0JBR2syaWZjMEtqTnlMMjA3MUNLeXVHK2F4VFptRGhzOG9iRjFXdWI5TmRQNHFQSUgKK2I0Vm5qdDRydWVJWHNEcWc4QTZpQUpyZjh4UVZicnZJaFZxWWdQbi92blFkUGZQK01DWFJOelJuK3FWeGVUQmgKK0tYTEE0Q3hNKzFia09xaHY1VEpaVXR0MUtGQlpEUGdMR2VTczJhK1dqUzlRMndmRDZoK3JNK0QxS3pHSgorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiAwICgweDApCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1aQSwgU1Q9V2VzdGVybiBDYXBlLCBMPUNhcGUgVG93biwgTz1UaGF3dGUgQ29uc3VsdGluZywgT1U9Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbiwgQ049VGhhd3RlIFBlcnNvbmFsIFByZW1pdW0gQ0EvRW1haWw9cGVyc29uYWwtcHJlbWl1bUB0aGF3dGUuY29tCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBKYW4gIDEgMDA6MDA6MDAgMTk5NiBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IERlYyAzMSAyMzo1OTo1OSAyMDIwIEdNVAorICAgICAgICBTdWJqZWN0OiBDPVpBLCBTVD1XZXN0ZXJuIENhcGUsIEw9Q2FwZSBUb3duLCBPPVRoYXd0ZSBDb25zdWx0aW5nLCBPVT1DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uLCBDTj1UaGF3dGUgUGVyc29uYWwgUHJlbWl1bSBDQS9FbWFpbD1wZXJzb25hbC1wcmVtaXVtQHRoYXd0ZS5jb20KKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgxMDI0IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgxMDI0IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmM5OjY2OmQ5OmY4OjA3OjQ0OmNmOmI5OjhjOjJlOmYwOmExOmVmOjEzOgorICAgICAgICAgICAgICAgICAgICA0NTo2YzowNTpkZjpkZToyNzoxNjo1MTozNjo0MToxMTo2Yzo2YzozYjplZDoKKyAgICAgICAgICAgICAgICAgICAgZmU6MTA6N2Q6MTI6OWU6ZTU6OWI6NDI6OWE6ZmU6NjA6MzE6YzM6NjY6Yjc6CisgICAgICAgICAgICAgICAgICAgIDczOjNhOjQ4OmFlOjRlOmQwOjMyOjM3Ojk0Ojg4OmI1OjBkOmI2OmQ5OmYzOgorICAgICAgICAgICAgICAgICAgICBmMjo0NDpkOTpkNTo4ODoxMjpkZDo3Njo0ZDpmMjoxYTpmYzo2ZjoyMzoxZToKKyAgICAgICAgICAgICAgICAgICAgN2E6ZjE6ZDg6OTg6NDU6NGU6MDc6MTA6ZWY6MTY6NDI6ZDA6NDM6NzU6NmQ6CisgICAgICAgICAgICAgICAgICAgIDRhOmRlOmUyOmFhOmM5OjMxOmZmOjFmOjAwOjcwOjdjOjY2OmNmOjEwOjI1OgorICAgICAgICAgICAgICAgICAgICAwODpiYTpmYTplZTowMDplOTo0NjowMzo2NjoyNzoxMToxNTozYjphYTo1YjoKKyAgICAgICAgICAgICAgICAgICAgZjI6OTg6ZGQ6MzY6NDI6YjI6ZGE6ODg6NzUKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgICAgIFg1MDl2MyBleHRlbnNpb25zOgorICAgICAgICAgICAgWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzOiBjcml0aWNhbAorICAgICAgICAgICAgICAgIENBOlRSVUUKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA2OTozNjo4OTpmNzozNDoyYTozMzo3MjoyZjo2ZDozYjpkNDoyMjpiMjpiODo2Zjo5YTpjNToKKyAgICAgICAgMzY6NjY6MGU6MWI6M2M6YTE6YjE6NzU6NWE6ZTY6ZmQ6MzU6ZDM6Zjg6YTg6ZjI6MDc6NmY6CisgICAgICAgIDg1OjY3OjhlOmRlOjJiOmI5OmUyOjE3OmIwOjNhOmEwOmYwOjBlOmEyOjAwOjlhOmRmOmYzOgorICAgICAgICAxNDoxNTo2ZTpiYjpjODo4NTo1YTo5ODo4MDpmOTpmZjpiZTo3NDoxZDozZDpmMzpmZTozMDoKKyAgICAgICAgMjU6ZDE6Mzc6MzQ6Njc6ZmE6YTU6NzE6Nzk6MzA6NjE6Mjk6NzI6YzA6ZTA6MmM6NGM6ZmI6CisgICAgICAgIDU2OmU0OjNhOmE4OjZmOmU1OjMyOjU5OjUyOmRiOjc1OjI4OjUwOjU5OjBjOmY4OjBiOjE5OgorICAgICAgICBlNDphYzpkOTphZjo5Njo4ZDoyZjo1MDpkYjowNzpjMzplYToxZjphYjozMzplMDpmNToyYjoKKyAgICAgICAgMzE6ODkKKworVGhhd3RlIFByZW1pdW0gU2VydmVyIENBCis9PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogMDY6OUY6Njk6Nzk6MTY6NjY6OTA6MDI6MUI6OEM6OEM6QTI6QzM6MDc6NkY6M0EKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlESnpDQ0FwQ2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVFGQURDQnpqRUxNQWtHQTFVRUJoTUNXa0V4CitGVEFUQmdOVkJBZ1RERmRsYzNSbGNtNGdRMkZ3WlRFU01CQUdBMVVFQnhNSlEyRndaU0JVYjNkdU1SMHdHd1lECitWUVFLRXhSVWFHRjNkR1VnUTI5dWMzVnNkR2x1WnlCall6RW9NQ1lHQTFVRUN4TWZRMlZ5ZEdsbWFXTmhkR2x2CitiaUJUWlhKMmFXTmxjeUJFYVhacGMybHZiakVoTUI4R0ExVUVBeE1ZVkdoaGQzUmxJRkJ5WlcxcGRXMGdVMlZ5CitkbVZ5SUVOQk1TZ3dKZ1lKS29aSWh2Y05BUWtCRmhsd2NtVnRhWFZ0TFhObGNuWmxja0IwYUdGM2RHVXVZMjl0CitNQjRYRFRrMk1EZ3dNVEF3TURBd01Gb1hEVEl3TVRJek1USXpOVGsxT1Zvd2djNHhDekFKQmdOVkJBWVRBbHBCCitNUlV3RXdZRFZRUUlFd3hYWlhOMFpYSnVJRU5oY0dVeEVqQVFCZ05WQkFjVENVTmhjR1VnVkc5M2JqRWRNQnNHCitBMVVFQ2hNVVZHaGhkM1JsSUVOdmJuTjFiSFJwYm1jZ1kyTXhLREFtQmdOVkJBc1RIME5sY25ScFptbGpZWFJwCitiMjRnVTJWeWRtbGpaWE1nUkdsMmFYTnBiMjR4SVRBZkJnTlZCQU1UR0ZSb1lYZDBaU0JRY21WdGFYVnRJRk5sCitjblpsY2lCRFFURW9NQ1lHQ1NxR1NJYjNEUUVKQVJZWmNISmxiV2wxYlMxelpYSjJaWEpBZEdoaGQzUmxMbU52CitiVENCbnpBTkJna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBMGpZMmFvdlh3bHVlMm9GQllvODQ3a2tFCitWZGJRN3h3YmxSWkg3eGhJTlRwUzlDdHFCbzg3TCtwVzQ2K0dqWjRYOTU2MFpYVUNUZS9MQ2FJaFVkaWIwR2ZRCit1ZzJTQmhSejFKUExseW9BbkZ4T0RMejZGVkw4OGtSdTJoRktiZ2lmTHkzaithbzZobk8yUmxOWXlJa0Z2WU1SCit1SE0vcWdlTjlFSk41MENkSERjQ0F3RUFBYU1UTUJFd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBTkJna3Foa2lHCis5dzBCQVFRRkFBT0JnUUFtU0N3V3dsajY2QlowREtxcVgxUS84dGZKZUdCZVhtNDNZeUozTm42eUY4UTB1ZlVJCitoZnpKQVRqL1RiN3lGa0pENTd0YVJ2dkJ4aEVmOFVxd0tFYkp3OFJDZmJ6NnExbHUxYmRSaUJIanBJVVphNEpNCitwQXdTcmVta3JqL3h3MGxsbW96RnlENGx0NVNadTVJeWNRZndobDd0VUNlbURhWWorYnZMcGdjVVFnPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjogMSAoMHgxKQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9WkEsIFNUPVdlc3Rlcm4gQ2FwZSwgTD1DYXBlIFRvd24sIE89VGhhd3RlIENvbnN1bHRpbmcgY2MsIE9VPUNlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24sIENOPVRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQS9FbWFpbD1wcmVtaXVtLXNlcnZlckB0aGF3dGUuY29tCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBBdWcgIDEgMDA6MDA6MDAgMTk5NiBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IERlYyAzMSAyMzo1OTo1OSAyMDIwIEdNVAorICAgICAgICBTdWJqZWN0OiBDPVpBLCBTVD1XZXN0ZXJuIENhcGUsIEw9Q2FwZSBUb3duLCBPPVRoYXd0ZSBDb25zdWx0aW5nIGNjLCBPVT1DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uLCBDTj1UaGF3dGUgUHJlbWl1bSBTZXJ2ZXIgQ0EvRW1haWw9cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6ZDI6MzY6MzY6NmE6OGI6ZDc6YzI6NWI6OWU6ZGE6ODE6NDE6NjI6OGY6CisgICAgICAgICAgICAgICAgICAgIDM4OmVlOjQ5OjA0OjU1OmQ2OmQwOmVmOjFjOjFiOjk1OjE2OjQ3OmVmOjE4OgorICAgICAgICAgICAgICAgICAgICA0ODozNTozYTo1MjpmNDoyYjo2YTowNjo4ZjozYjoyZjplYTo1NjplMzphZjoKKyAgICAgICAgICAgICAgICAgICAgODY6OGQ6OWU6MTc6Zjc6OWU6YjQ6NjU6NzU6MDI6NGQ6ZWY6Y2I6MDk6YTI6CisgICAgICAgICAgICAgICAgICAgIDIxOjUxOmQ4OjliOmQwOjY3OmQwOmJhOjBkOjkyOjA2OjE0OjczOmQ0OjkzOgorICAgICAgICAgICAgICAgICAgICBjYjo5NzoyYTowMDo5Yzo1Yzo0ZTowYzpiYzpmYToxNTo1MjpmYzpmMjo0NDoKKyAgICAgICAgICAgICAgICAgICAgNmU6ZGE6MTE6NGE6NmU6MDg6OWY6MmY6MmQ6ZTM6Zjk6YWE6M2E6ODY6NzM6CisgICAgICAgICAgICAgICAgICAgIGI2OjQ2OjUzOjU4OmM4Ojg5OjA1OmJkOjgzOjExOmI4OjczOjNmOmFhOjA3OgorICAgICAgICAgICAgICAgICAgICA4ZDpmNDo0Mjo0ZDplNzo0MDo5ZDoxYzozNworICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBYNTA5djMgQmFzaWMgQ29uc3RyYWludHM6IGNyaXRpY2FsCisgICAgICAgICAgICAgICAgQ0E6VFJVRQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDI2OjQ4OjJjOjE2OmMyOjU4OmZhOmU4OjE2Ojc0OjBjOmFhOmFhOjVmOjU0OjNmOmYyOmQ3OgorICAgICAgICBjOTo3ODo2MDo1ZTo1ZTo2ZTozNzo2MzoyMjo3NzozNjo3ZTpiMjoxNzpjNDozNDpiOTpmNToKKyAgICAgICAgMDg6ODU6ZmM6Yzk6MDE6Mzg6ZmY6NGQ6YmU6ZjI6MTY6NDI6NDM6ZTc6YmI6NWE6NDY6ZmI6CisgICAgICAgIGMxOmM2OjExOjFmOmYxOjRhOmIwOjI4OjQ2OmM5OmMzOmM0OjQyOjdkOmJjOmZhOmFiOjU5OgorICAgICAgICA2ZTpkNTpiNzo1MTo4ODoxMTplMzphNDo4NToxOTo2Yjo4Mjo0YzphNDowYzoxMjphZDplOToKKyAgICAgICAgYTQ6YWU6M2Y6ZjE6YzM6NDk6NjU6OWE6OGM6YzU6Yzg6M2U6MjU6Yjc6OTQ6OTk6YmI6OTI6CisgICAgICAgIDMyOjcxOjA3OmYwOjg2OjVlOmVkOjUwOjI3OmE2OjBkOmE2OjIzOmY5OmJiOmNiOmE2OjA3OgorICAgICAgICAxNDo0MgorCitUaGF3dGUgU2VydmVyIENBCis9PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IEM1OjcwOkM0OkEyOkVEOjUzOjc4OjBDOkM4OjEwOjUzOjgxOjY0OkNCOkQwOjFECitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJREV6Q0NBbnlnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFRRkFEQ0J4REVMTUFrR0ExVUVCaE1DV2tFeAorRlRBVEJnTlZCQWdUREZkbGMzUmxjbTRnUTJGd1pURVNNQkFHQTFVRUJ4TUpRMkZ3WlNCVWIzZHVNUjB3R3dZRAorVlFRS0V4UlVhR0YzZEdVZ1EyOXVjM1ZzZEdsdVp5QmpZekVvTUNZR0ExVUVDeE1mUTJWeWRHbG1hV05oZEdsdgorYmlCVFpYSjJhV05sY3lCRWFYWnBjMmx2YmpFWk1CY0dBMVVFQXhNUVZHaGhkM1JsSUZObGNuWmxjaUJEUVRFbQorTUNRR0NTcUdTSWIzRFFFSkFSWVhjMlZ5ZG1WeUxXTmxjblJ6UUhSb1lYZDBaUzVqYjIwd0hoY05PVFl3T0RBeAorTURBd01EQXdXaGNOTWpBeE1qTXhNak0xT1RVNVdqQ0J4REVMTUFrR0ExVUVCaE1DV2tFeEZUQVRCZ05WQkFnVAorREZkbGMzUmxjbTRnUTJGd1pURVNNQkFHQTFVRUJ4TUpRMkZ3WlNCVWIzZHVNUjB3R3dZRFZRUUtFeFJVYUdGMworZEdVZ1EyOXVjM1ZzZEdsdVp5QmpZekVvTUNZR0ExVUVDeE1mUTJWeWRHbG1hV05oZEdsdmJpQlRaWEoyYVdObAorY3lCRWFYWnBjMmx2YmpFWk1CY0dBMVVFQXhNUVZHaGhkM1JsSUZObGNuWmxjaUJEUVRFbU1DUUdDU3FHU0liMworRFFFSkFSWVhjMlZ5ZG1WeUxXTmxjblJ6UUhSb1lYZDBaUzVqYjIwd2daOHdEUVlKS29aSWh2Y05BUUVCQlFBRAorZ1kwQU1JR0pBb0dCQU5Pa1VHN0kvMVpyNXM5ZHR1b01hSFZIb3FyQzJvUWwvS2owUjFIYWhiVWdkSlNHSGc5MQoreWVrSVlmVUdiVEJ1RlJrQzZWTEFZdHRObVo3aWFneEVPTTMrdnVOa0NYREYvckZyS2JZdlNjZzcxQ2NFSlJDWAorTCtlUWJjQW9RcG5YVEVQZXcvVWhiVlNmWGNOWTRjRGsyVnV3dU55MGU5ODJPc0sxWmlJUzFvY05BZ01CQUFHagorRXpBUk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUVCUUFEZ1lFQUIvcE1hVno3bGN4RworN29XRFRTRXdqc3JacUc5Skd1YmFVZU5nY0d5RVlSR2hHc2hJUGxsRGZVK1ZQYUdMdHd0aW1IcDFpdDJJVGs2ZQorUU51b3pESjB1VzhOeHVPelJBdlppbSthS1p1WkdDZzcwZU5BS0pwYVBOVzE1eUFiaThxa3E0M3BVZG5pVEN4WgorcWRxNXNuVWI5a0x5NzhmeUdQbUp2S1AvaWlNdWNFYz0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjogMSAoMHgxKQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9WkEsIFNUPVdlc3Rlcm4gQ2FwZSwgTD1DYXBlIFRvd24sIE89VGhhd3RlIENvbnN1bHRpbmcgY2MsIE9VPUNlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24sIENOPVRoYXd0ZSBTZXJ2ZXIgQ0EvRW1haWw9c2VydmVyLWNlcnRzQHRoYXd0ZS5jb20KKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IEF1ZyAgMSAwMDowMDowMCAxOTk2IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogRGVjIDMxIDIzOjU5OjU5IDIwMjAgR01UCisgICAgICAgIFN1YmplY3Q6IEM9WkEsIFNUPVdlc3Rlcm4gQ2FwZSwgTD1DYXBlIFRvd24sIE89VGhhd3RlIENvbnN1bHRpbmcgY2MsIE9VPUNlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24sIENOPVRoYXd0ZSBTZXJ2ZXIgQ0EvRW1haWw9c2VydmVyLWNlcnRzQHRoYXd0ZS5jb20KKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgxMDI0IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgxMDI0IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmQzOmE0OjUwOjZlOmM4OmZmOjU2OjZiOmU2OmNmOjVkOmI2OmVhOjBjOgorICAgICAgICAgICAgICAgICAgICA2ODo3NTo0NzphMjphYTpjMjpkYTo4NDoyNTpmYzphODpmNDo0Nzo1MTpkYToKKyAgICAgICAgICAgICAgICAgICAgODU6YjU6MjA6NzQ6OTQ6ODY6MWU6MGY6NzU6Yzk6ZTk6MDg6NjE6ZjU6MDY6CisgICAgICAgICAgICAgICAgICAgIDZkOjMwOjZlOjE1OjE5OjAyOmU5OjUyOmMwOjYyOmRiOjRkOjk5OjllOmUyOgorICAgICAgICAgICAgICAgICAgICA2YTowYzo0NDozODpjZDpmZTpiZTplMzo2NDowOTo3MDpjNTpmZTpiMTo2YjoKKyAgICAgICAgICAgICAgICAgICAgMjk6YjY6MmY6NDk6Yzg6M2I6ZDQ6Mjc6MDQ6MjU6MTA6OTc6MmY6ZTc6OTA6CisgICAgICAgICAgICAgICAgICAgIDZkOmMwOjI4OjQyOjk5OmQ3OjRjOjQzOmRlOmMzOmY1OjIxOjZkOjU0OjlmOgorICAgICAgICAgICAgICAgICAgICA1ZDpjMzo1ODplMTpjMDplNDpkOTo1YjpiMDpiODpkYzpiNDo3YjpkZjozNjoKKyAgICAgICAgICAgICAgICAgICAgM2E6YzI6YjU6NjY6MjI6MTI6ZDY6ODc6MGQKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgICAgIFg1MDl2MyBleHRlbnNpb25zOgorICAgICAgICAgICAgWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzOiBjcml0aWNhbAorICAgICAgICAgICAgICAgIENBOlRSVUUKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICAwNzpmYTo0Yzo2OTo1YzpmYjo5NTpjYzo0NjplZTo4NTo4Mzo0ZDoyMTozMDo4ZTpjYTpkOToKKyAgICAgICAgYTg6NmY6NDk6MWE6ZTY6ZGE6NTE6ZTM6NjA6NzA6NmM6ODQ6NjE6MTE6YTE6MWE6Yzg6NDg6CisgICAgICAgIDNlOjU5OjQzOjdkOjRmOjk1OjNkOmExOjhiOmI3OjBiOjYyOjk4OjdhOjc1OjhhOmRkOjg4OgorICAgICAgICA0ZTo0ZTo5ZTo0MDpkYjphODpjYzozMjo3NDpiOTo2ZjowZDpjNjplMzpiMzo0NDowYjpkOToKKyAgICAgICAgOGE6NmY6OWE6Mjk6OWI6OTk6MTg6Mjg6M2I6ZDE6ZTM6NDA6Mjg6OWE6NWE6M2M6ZDU6YjU6CisgICAgICAgIGU3OjIwOjFiOjhiOmNhOmE0OmFiOjhkOmU5OjUxOmQ5OmUyOjRjOjJjOjU5OmE5OmRhOmI5OgorICAgICAgICBiMjo3NToxYjpmNjo0MjpmMjplZjpjNzpmMjoxODpmOTo4OTpiYzphMzpmZjo4YToyMzoyZToKKyAgICAgICAgNzA6NDcKKworVGhhd3RlIFVuaXZlcnNhbCBDQSBSb290Cis9PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogMTc6QUY6NzE6MTY6NTI6N0I6NzM6NjU6MjI6MDU6Mjk6Mjg6ODQ6NzE6OUQ6MTMKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlSSWpDQ0NRb0NBUUF3RFFZSktvWklodmNOQVFFRkJRQXdWekVQTUEwR0ExVUVDaE1HVkdoaGQzUmxNU0V3CitId1lEVlFRTEV4aFVhR0YzZEdVZ1ZXNXBkbVZ5YzJGc0lFTkJJRkp2YjNReElUQWZCZ05WQkFNVEdGUm9ZWGQwCitaU0JWYm1sMlpYSnpZV3dnUTBFZ1VtOXZkREFlRncwNU9URXlNRFV4TXpVMk1EVmFGdzB6TnpBME1ETXhNelUyCitNRFZhTUZjeER6QU5CZ05WQkFvVEJsUm9ZWGQwWlRFaE1COEdBMVVFQ3hNWVZHaGhkM1JsSUZWdWFYWmxjbk5oCitiQ0JEUVNCU2IyOTBNU0V3SHdZRFZRUURFeGhVYUdGM2RHVWdWVzVwZG1WeWMyRnNJRU5CSUZKdmIzUXdnZ2dpCitNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUlEd0F3Z2dnS0FvSUlBUURpaVFWdHczK3Rwb2s2Lzd2SHpaMDNzZUhTCitJUjZiWVNvVjUzdFhUMVU4MEx2NTJUMCtwcnpzdEsxVG1oWUM2d3R5L1lyeWowUUZ4ZXZUNWIyMlJEbm0rMGUvCithcDRLbFJqaWFPTFdsdFlocllqOTlSZjEwOXBDcFpEdEtaV1dkVHJhaDZIVTlkT0gzZ1ZpcHVObWRKTFBwYnk3CiszMmovY1hWV1FWazE2ek5hWmxIeTBxTUt3WXpPYzF3UmJ5Mk1sWXlSc2YzUDVhMVdsY3lGa29PUVZVSEp3bmZ0CisrYU4wUWdwb0NQUFEwV1g5Wnl3MC95Ui81M25JQnpzbFY5MmtESmc5dnVETUdXWGI4bFNpcjBMVW5lS3VoQ01sCitDVE1TdFdvZWRzU0wyVWtBYkY2NkgvSWIybWZLSjZxalJDTWJnNExPOHFzejdWU2szTW1yV1dYUk9BN0JQaHRuCitqOVoxQWVCVkl0MTJkK3lPM2ZUUGVTSnR1VmNEOVprSXB6dytOUHZFRjY0aldNMGs4eVBLYWdJb2xBR0JOTFJzCithNjZMR3NPajBnazhGbFQxTmw4azQ1OUtvZUpreGhiRHBvRjZKRFpIanNGZUR2djVGWGdFMWc1WjJaMVlabUxTCitsQ2t5TXNoNHVXYjJ0VmJoYk1ZVVM1WlNXWkVDSkdwVlI5Yy90aU1hWUhlWEx1SkFyNTRFVjU2dEVjWEpRM0R2CitTTFJlckJ4cExpNkMxVnVMdm9LK0dSUmU1dzBpeDFFYi94NmI4VENQY1RFR3N6UW5qMTk2Wm9KUGlpMFRxMExQCitJVmFlbDQ1bU5nK1dtK1VyOUFLcEttcU1MTVREdUhBc0xTa2VQMUIzSG0wcVZPUlZDcEU0b2NXMVpxSjJXdTRQCit2N1JuNFNodUQrRTJvWUxSdjlSMzRjUm5NcE40eU9kVVUvNGplZVpvekNhUTloQmpYU3B2a1Mya2N6SlJJZks3CitGZCtxSkFoSUJ0NmhuaWEvdW9PL2ZLVElvSXk5MHYrOGhHa25FeVFZeEVVWUl5WmVHQlRLTG9pSFlxTlQ1aUczCit1SVY3bW9XN0ZTWnkrTG4zYW5RUFNUK1N2cWtGdDVrbnY3OEpGMHVaVEswUkVIemZkREgyanlaZnFvaXVPRmZJCitWUzNUKzlnYlVabStKUnM2dXNCOUcrM08wa201ei9QRmZZbVFnZGhwU0NBUW8vanZrbEVZTW9zUkdNQS9HNFZXCit6bGZKOG9Ka3h0OENDUzVLRVMreEoyMDNVdkR3Rm1IeFo0M2ZoM0t2aDlyUCsxQ1VidFNVaGV1S0xPb2g5WlpLCitSTlhnem1wMFJFM1FCZE9IRmUwMjBLU0xabFZ3ays1SEJzRitMcVVZZVdmektJWHhjUGNPZzZSK1ZKNWFkakxMCitaUnU0emZ2SUtBUFNWSkhScDhXRlF3Z1hkcVhtTDJjSTJLR2lnaTBNK01Hdlk5UlFkMjFyUmtwQmhkV1FYM2t0Cit4T3pYRVlkQWl1Rm80bVQ0VlRMN2I1TXMybmZaSWNFWDVUWXNUbjZRZjZ5VUt6Sm52amhRZHJpdVFiblhJY1VKCitUR0RJbzFIRU5KdFhOOS9MeVROWGkrdjdkcDhaVGNWcUh5cEZyaXZ0TDQybnBRRExCUG9sWWk1MFNCdktLb3k2CisyN1orOXJzQ2ZLbkQyMWg0b2Ivdy9ob1FWUkhPNkdsT2xtWEdGd1BXQjJpTVZJS3VIQ0pWUC9IMENaY293RWIzCitUZ3NsSGZjSDF3a2RPaGhYT0R2b013Ym5qM2hHSGx2MUJyYnN1S1lOOGJvVFM5WVlJTjFwTTBvekZhNjR5SmlLCitKeXlUdkMzNzdqTy9adVpOdXJhYkJsVmdsMHU4Uk0xKzlLSFlxaS9BQWlnaEZtSjQyd2hVOHZ6ME5PUEdqeHhECitWODZRR2t2Y0xqc29rWWsvZXRvMUhZNHM3a25zOURPdHlWT29qSjhFVXo0a0hGTEpFdmxpVjZPODdpenJRSHdnCitJM0FybGZsekY0clJ3UnhwcHJjNG1tZjNjQjE2V2d4QXoySVBoVHpDQWs1K3RmYkZLaW1Fc3g4M0t1R3Fja0xFCis3V3NhajVJY1hiN1I4bHZ5cTZxcDB2VzRwRUVySzVGdUVrakttTmczamNqdEFEQzF0Z1JPZnB6YWhPekErbnZsCitIWWlrVTBhd2xPUmNHNkVsTEE5SVVuZVhDV3pzV3hnemd3TGxnbjdOaFNFd0VmMG5UOC9rSHV3L3BWZHM2U293CitHU3FJNWNOcE9LdHZPWEYvaE9GQncrSE1Lb2tnVWk2REQydzVQMHN0RnF3dDhDU3NBSFAwbTdNR1B3VzRGSVVmCitxNTVjUEo1aW5RNXRPNEFKL0FMcW9wZDB5c2Y1NDFiaHc4cWxwcHJBa09Ba0VsUFN3b3ZhdnUwQ1ExNW40WW1ZCitlZTdMcXNyREc5em5wVWFsZkdzV2g3WmFLTmZiSnp4ZXBiMjJVZDBmUTg4N0pzZzZqU1Zod1VuMFBCdkpST3F2CitITUlybEFFcURqRFJXNHNyUitYRDBRUURtdzQ1TE5ZbjFPWndXdGwxenlyWXlRQUY1Qk9JN01NNSs0ZGhNRFpECitBOGllbktJR3dpL0YvUENBWTdGVUJLQk1xUzdHOVhaNjJORGsxSlFSNVJXMWVBYmN1SUNQbWFrZ016MFFoVXhsCitDY28rV0Y1Z2s1cXFZbDNBVVFZY1hXQ2dEWnhMUS9hbkZpR2toNnJ5d1M3dWtqQzRudC9mRUFHTGhnbHcyR3lvCit0MUFlRnBhMDkyZjlOVG9oa0NveXh3QjdUUWNRQ2JrdmM5Z1lmbWVaQkU4Ry9GREhoWnVkUUoyemxqZjZwZHl5Citjazd2VGdrcy9aSDlUZmU3cHFFK3EzdWlBMENtcVZVbjR2cjVHYzZIZGFyeGRUYno4N2lSK0pIRGkzVVRqa3hsCittaFk1YXVVMDZIcVdXWDgxc0FEOVcybjhReWI2OVNodS9vZlpmaVQ3dEtDQ2JsU2kvNjYvWXJUMGNnSEN5NWhICittT0ZNdFJlQWdNNlBwaWp1SGtWcSs5L3hIZnhhTzlicTlHd2RZa2xYTzRxUGh1cndVd1RPbkJaby83cTUvSWdQCitSL2NDUkhKQXVNbzdMVk9kM0R4V2pGbDdhQm9zalhHN2JBREhHczV2UUpLeG95OFAyVVR5bzNBdW51NE9yakxRCitPejZMQitybWViTmNLZUo5YTZoZStWb3g2QWlXb293RG1FYnh1SDJRVkNidGRtTCtudW1hYmw3SlNjZGNORk1wCitWTm5zNUViaGdEdDEyZC83ZWRXSDhicWU2eG5PVEZKejVsdUhyaVZQT1huTXhyajVFSHZzOEp0eHBBV2cweW5UCitUbjhmOUMwb2VNeFZsWHNla1MvTVZoaHppN0xidkdrSDV0RFlUKzJpLzFpRm8yM2dTbE8zWjMyTkRGeGJlM2NvCitBalZFZWdUVEtFUElhekFYWFRLNEtUVzZkdG83RkVwMkdGaWsrSkk4bmswemIwWnJDTmt4U0dqZDlQc2tWalN5Cit6MmxtdmtqU2ltWWl6ZkpwemNKVEUwVXBRU0xXWFpnZnRxU3lvOEx1QWk5Ukc5eURwT3h3SmFqVUNHRXliK1NoCitnUzU4WTNMNktXVzhjRVRQWFFJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUlBUUJWbWpScUlnWnBDVVV6Cit4NjZwWE1jSlRwdUd2RUdRMUpSUzlzMGpLWlJMSXMzb3ZmNmR6Vkx5dmUycmg4bXJxMFlFdEwyaVB5SXdSMURBCitTNHgyRHdQMWt0S3hMY1I2Tlp6SmM0ZnJwcC9lRDNPTjAzK1oyTHFQYjhUenZocXVpNktVTnBEaTVldU5CZlQ4CitaZCtWOGNTVVRSZFcxNTg4ajFBODUzZS9sWVltWlB0cS84YmE2WXl1UXJ0cDVUUEcyT2tOeGxVaFNjRU10S1A1CittMHRjM29OUFFRUE9LbmxvT0gzd1ZFa2c5YllRL3dqY00yYVdtLzhHM2dDZTE4NVdRNXBSL0hETjl2QlJvN2ZOCit0RnlGWXMxeHQ4WXJJeXZkdzI1QVF2bzMvemNjOW5wWGxJZUZJOWZVeWNkZndVMHZ5UTNYWE95Y0plNmVNSUtSCitsbks0ZFIzNENXaFhsN0l0Uys0bDdIb2tLZTV5MUp3VDI2dmNBd3JZU2hUSkNGZEVYYUcxVTRBMDhoU1h6MUxlCitvZzZLRU9rVTc5Qmd2bUdoOFNWZDFSaHpQNU1ReXBidXMwRFMyNk5WejFkYXBRNVBkVWZmNnZlUW1tMzFjQzRkCitGQnczWkFSWlVMRGNjb1p2bkRjOVhTaXZjMVh2MHU0a2RIUVQ3OXpiTVVuN1AyUDEwd2crTTZYbm5RcmVVeXhSCitqbWZibTBGbFFWQzkxS1NXYkllOEV1Q1V4OVBBNU10eldBQ0Q0YXduaGRhZFU1MWN2UW8rQTBPY0RKSDFiWHY0CitRSEoxcXhGMmtTdmh4cW9mY0dsMmNCVUovcFBRMWkyM0ZXcWJaMXkwYVo4bHBuMksrMzBpcVhIeXprNk11Q0V0CiszdjVCY1EzL25leHpwcnNIVDRnT1dFY3VmcW5DeDNqZHVucWVUdUF3VG1OdmhkUWdRZW42L2tORjUvdXZlckxPCitwQVVkSXBwWWh0L2t6a3lwL3RnV3BXLzcyTTVXZS9YV0lPL2tSODFqSlArNXZ2RklvOEVCY3VhOXdLM3RKZzNLCitOSi84QWkwZ1R3VWdyaUU5RE1JZ1BEL3dCSVRjejRuOXVTV1JqdEJENXJNZ3Exd3QxVUNlb0V2WTlMTE1mZkZZCitDbzZIN1lpc05wYmtWcUFSaXZLYTBMTlhvelM3R2FzNDRYUnJJc1F4emdIVkd6YmpIamhNTTVQZlFPTlpWMDZzCitibnNlV2ozRkhWdXN5QkNDTlFJaXN2eDE2QkNSamNSOWVKTkhuaHlkckd0aUFsaU0xaHdqMXE5NHdvQ2NwS29rCitWQlMxRkpqRytDc2FKTXR4TWdyaW13NXBhOTErakdUUkxtUHZEbit4UG9oTW5WWGx5VzRYQkxkQi83MktRY3NsCitNVzlFZHo5SHNmeUJpQWVPQlVrZ3R4SFphUU1xQTUyNU00U2EzOTk2NDBaem85aWlqRk1aaUZWTWRMajJSSVFyCiswUlF0VGprdWttai9hZnlGWWh2clZVL3ZKWVJpUlpuVzJFNXZQMU1JZlIwR2xZR0FmMDlPZERhWXRlS0hjSmpjCisxL1hjVWhYbXh0WjVsamwvajVYUHE0QlRyUnNMUlVBTzFCaTlMTjZLZDNiOThrUkh4aUhRNUhUdzJCZ0Z5SHd3Citjc2ZmOGJ2OEFqQ3A5RUltV1EyVEJZS2hjKzAwNVRoZHpWQ1EvcFQ4RTd5OS9LaWlpS2R6eExLbzBWMkl4QUtpCitldkVFeWY2TWRNbnZIV1JCbjZ3ZWxtZGtyS3NvUWNlZDk4Q1lHMjRId21SOVdvTm1WaWcybk9mN0hIY09LS0RFCis5MnQ1T1FRZ2hNZFhrN3dib09xODYwTGxxQkgrL0t4bHpQMzRLSWowcFpybGMxSGdxSnNOQTNkTzVlQ1lzNGphCitmZWJHbm53VVpzRXVVMHFTQnplZ2Z1azlDZVFWZk0vOXVFR2w3NTVtbmNSZUJ4MkgrRUd0NnVjdjBrRmpHRGY1CitGT05OME9YM1EvMFY0L2syY3dZbTN3RlBxY05PM2lCR2Q1aTBlaVFyTzNVclRsaU5tMTJreHhhZ3ZES0lQNkdECis4d0RJK05oWTZXTmRUQ3UxOEhKQjJLdDNOOVp5ZEs2Mk5weklwb05KUytESlZnc3B2Z0F3eTkzV3lFS0tBTm5zCitGZEUwY2ZKYlpJZjJKOUszNjRhd2tMOHAyeUdlTm96aklDK1ZJMUZzRzhLazFlYllBa05ub1A2YlVBTkVmN3ZrCitjdFhSNU5xUGtoUmsrMTBVRUJKS2xRYkpaUWdweWlHakpqZ1J5U2ZmY0djRS9jcElNbjlqc2tWME1WQlBoOWtnCitjTkloY0xIV0VKMHpYWGlEa1cxVmd1emE1R0pqeDRGRzF4bGxjaXBER1pDNDF5Tk5UQnpnUktsbVo2enVjWGtuCitKbmh0Y2c3MVhVc2p0WHg4WmVrWHhqb0xEZDFlSGxIRGhyanNmOGNuU3FWRzZHb3RHY0dIbzh1Wms0ZGtvbFVVCitUTGREcFpQWDU5Sk9lVURLWlpsR1BUOTZnSHFJYXN3ZTVXc3pSdlJRd05VZkNiak5paTZoSit0ZGM2Zm9hd3JsCitWNElxc1B6aVZGSlc4S3VwRXNZamxnY2tuT0M4UnFXMElBVGFDWk5qNWRRdXduN0ZNZTIxRlhTR0Y3bXo4eWFLCitIUUpxMmhvLzZMcnhCRzJVVVZUaVdyUlpneDFnMEMxenpBZTFKb3o1MThhSWtlK0F6MTBQb1dETFJkUkNJdEd4CitjQjM5MExjd2tEckdTRzFuNVRMYWo5dmpxT01kSUNXaUhPRk11YVQyeGo5Y1dBMjd4ckozQVJhUm54Y0dEYmRBCitQc3lQanB4TDRKMStteDRGcTRnaSt0TW9HMWNVWkVvK0pDdzRUU0ZwQUhNdTBGVXRkUElWNkpSRFBrQXF4c2E1CithbHZlb3N3WVVGUmRUaXFGYlBhU2l5a1pmdWZxU3VBaUt5Vzg5MmJQZDVwQmRQSThGQTEwYWZWUWc4M05MeUhiCitJa2FLMFBkUkdwVlg4Z1dMR2hudE8wWG9Oc0p1ZnZ0WElnQWZCbE9wcnBQR2ozRXFNVVdTNTQ1dDVwa2l3SVA4Cis3OXhYWm5kUG9qWXgrNkVUamVYS281VjlBUXhrY0R0VFFtaUF4N3VkcUFBMWFaZ01xR2ZZUStXcXo1WGdVWldrCitGejlDbmJnRXp0TjVlY2pUaWhZeWt1RFhvdTdYTjB3dnJMaDd2a1gyOFJnem5IczNwaVRadkVDckFPbkRONHVyCisyTGJ6WG9GT3NCUnJCejRmN01MMlJDS1Z1N1BtYjliNWNHVzZDb05scWc0VEw0TVRJMU9MUUJiNnppLzhUUVQ0Cis2OWlzeFRiQ0ZWZElPT3hWczdRZXVxM1NRZ1lYRFhQSVY2YStsazJwOHNEN2VpRWM5Y2x3cVlLUXRmRU0xSGtRCit2b0dtNlZ4aG5IZDVtcVRETnlaWE44bFNMUG9JLzlCZnhtSEE5SGErL041T3o2dFJtWEhIMzM3MDFzOEdWaGtUCitVd3R0ZEZsSUdadFRCUzJkTWxUVDVTeFRpMlErMUdSNzQ0QUpGTXorRmtaamEzRnArUG5MSi9hSVZMeEZzODRDCit5SlR1UUZ2NVFnTEMvN0RZTE9zb2YxN0pKZ0dacHc9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMSAoMHgwKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiAwICgweDApCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IE89VGhhd3RlLCBPVT1UaGF3dGUgVW5pdmVyc2FsIENBIFJvb3QsIENOPVRoYXd0ZSBVbml2ZXJzYWwgQ0EgUm9vdAorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogRGVjICA1IDEzOjU2OjA1IDE5OTkgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBBcHIgIDMgMTM6NTY6MDUgMjAzNyBHTVQKKyAgICAgICAgU3ViamVjdDogTz1UaGF3dGUsIE9VPVRoYXd0ZSBVbml2ZXJzYWwgQ0EgUm9vdCwgQ049VGhhd3RlIFVuaXZlcnNhbCBDQSBSb290CisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTYzODQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDE2Mzg0IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmUyOjg5OjA1OjZkOmMzOjdmOmFkOmE2Ojg5OjNhOmZmOmJiOmM3OmNkOgorICAgICAgICAgICAgICAgICAgICA5ZDozNzpiMTplMTpkMjoyMToxZTo5Yjo2MToyYToxNTplNzo3Yjo1Nzo0ZjoKKyAgICAgICAgICAgICAgICAgICAgNTU6M2M6ZDA6YmI6Zjk6ZDk6M2Q6M2U6YTY6YmM6ZWM6YjQ6YWQ6NTM6OWE6CisgICAgICAgICAgICAgICAgICAgIDE2OjAyOmViOjBiOjcyOmZkOjhhOmYyOjhmOjQ0OjA1OmM1OmViOmQzOmU1OgorICAgICAgICAgICAgICAgICAgICBiZDpiNjo0NDozOTplNjpmYjo0NzpiZjo2YTo5ZTowYTo5NToxODplMjo2ODoKKyAgICAgICAgICAgICAgICAgICAgZTI6ZDY6OTY6ZDY6MjE6YWQ6ODg6ZmQ6ZjU6MTc6ZjU6ZDM6ZGE6NDI6YTU6CisgICAgICAgICAgICAgICAgICAgIDkwOmVkOjI5Ojk1Ojk2Ojc1OjNhOmRhOjg3OmExOmQ0OmY1OmQzOjg3OmRlOgorICAgICAgICAgICAgICAgICAgICAwNTo2MjphNjplMzo2Njo3NDo5MjpjZjphNTpiYzpiYjpkZjo2ODpmZjo3MToKKyAgICAgICAgICAgICAgICAgICAgNzU6NTY6NDE6NTk6MzU6ZWI6MzM6NWE6NjY6NTE6ZjI6ZDI6YTM6MGE6YzE6CisgICAgICAgICAgICAgICAgICAgIDhjOmNlOjczOjVjOjExOjZmOjJkOjhjOjk1OjhjOjkxOmIxOmZkOmNmOmU1OgorICAgICAgICAgICAgICAgICAgICBhZDo1Njo5NTpjYzo4NTo5Mjo4Mzo5MDo1NTo0MTpjOTpjMjo3NzplZDpmOToKKyAgICAgICAgICAgICAgICAgICAgYTM6NzQ6NDI6MGE6Njg6MDg6ZjM6ZDA6ZDE6NjU6ZmQ6Njc6MmM6MzQ6ZmY6CisgICAgICAgICAgICAgICAgICAgIDI0OjdmOmU3Ojc5OmM4OjA3OjNiOjI1OjU3OmRkOmE0OjBjOjk4OjNkOmJlOgorICAgICAgICAgICAgICAgICAgICBlMDpjYzoxOTo2NTpkYjpmMjo1NDphMjphZjo0MjpkNDo5ZDplMjphZTo4NDoKKyAgICAgICAgICAgICAgICAgICAgMjM6MjU6MDk6MzM6MTI6YjU6NmE6MWU6NzY6YzQ6OGI6ZDk6NDk6MDA6NmM6CisgICAgICAgICAgICAgICAgICAgIDVlOmJhOjFmOmYyOjFiOmRhOjY3OmNhOjI3OmFhOmEzOjQ0OjIzOjFiOjgzOgorICAgICAgICAgICAgICAgICAgICA4MjpjZTpmMjphYjozMzplZDo1NDphNDpkYzpjOTphYjo1OTo2NTpkMTozODoKKyAgICAgICAgICAgICAgICAgICAgMGU6YzE6M2U6MWI6Njc6OGY6ZDY6NzU6MDE6ZTA6NTU6MjI6ZGQ6NzY6Nzc6CisgICAgICAgICAgICAgICAgICAgIGVjOjhlOmRkOmY0OmNmOjc5OjIyOjZkOmI5OjU3OjAzOmY1Ojk5OjA4OmE3OgorICAgICAgICAgICAgICAgICAgICAzYzozZTozNDpmYjpjNDoxNzphZToyMzo1ODpjZDoyNDpmMzoyMzpjYTo2YToKKyAgICAgICAgICAgICAgICAgICAgMDI6Mjg6OTQ6MDE6ODE6MzQ6YjQ6NmM6NmI6YWU6OGI6MWE6YzM6YTM6ZDI6CisgICAgICAgICAgICAgICAgICAgIDA5OjNjOjE2OjU0OmY1OjM2OjVmOjI0OmUzOjlmOjRhOmExOmUyOjY0OmM2OgorICAgICAgICAgICAgICAgICAgICAxNjpjMzphNjo4MTo3YToyNDozNjo0Nzo4ZTpjMTo1ZTowZTpmYjpmOToxNToKKyAgICAgICAgICAgICAgICAgICAgNzg6MDQ6ZDY6MGU6NTk6ZDk6OWQ6NTg6NjY6NjI6ZDI6OTQ6Mjk6MzI6MzI6CisgICAgICAgICAgICAgICAgICAgIGM4Ojc4OmI5OjY2OmY2OmI1OjU2OmUxOjZjOmM2OjE0OjRiOjk2OjUyOjU5OgorICAgICAgICAgICAgICAgICAgICA5MTowMjoyNDo2YTo1NTo0NzpkNzozZjpiNjoyMzoxYTo2MDo3Nzo5NzoyZToKKyAgICAgICAgICAgICAgICAgICAgZTI6NDA6YWY6OWU6MDQ6NTc6OWU6YWQ6MTE6YzU6Yzk6NDM6NzA6ZWY6NDg6CisgICAgICAgICAgICAgICAgICAgIGI0OjVlOmFjOjFjOjY5OjJlOjJlOjgyOmQ1OjViOjhiOmJlOjgyOmJlOjE5OgorICAgICAgICAgICAgICAgICAgICAxNDo1ZTplNzowZDoyMjpjNzo1MToxYjpmZjoxZTo5YjpmMTozMDo4Zjo3MToKKyAgICAgICAgICAgICAgICAgICAgMzE6MDY6YjM6MzQ6Mjc6OGY6NWY6N2E6NjY6ODI6NGY6OGE6MmQ6MTM6YWI6CisgICAgICAgICAgICAgICAgICAgIDQyOmNmOjIxOjU2OjllOjk3OjhlOjY2OjM2OjBmOjk2OjliOmU1OjJiOmY0OgorICAgICAgICAgICAgICAgICAgICAwMjphOToyYTo2YTo4YzoyYzpjNDpjMzpiODo3MDoyYzoyZDoyOToxZTozZjoKKyAgICAgICAgICAgICAgICAgICAgNTA6Nzc6MWU6NmQ6MmE6NTQ6ZTQ6NTU6MGE6OTE6Mzg6YTE6YzU6YjU6NjY6CisgICAgICAgICAgICAgICAgICAgIGEyOjc2OjVhOmVlOjBmOmJmOmI0OjY3OmUxOjI4OjZlOjBmOmUxOjM2OmExOgorICAgICAgICAgICAgICAgICAgICA4MjpkMTpiZjpkNDo3NzplMTpjNDo2NzozMjo5Mzo3ODpjODplNzo1NDo1MzoKKyAgICAgICAgICAgICAgICAgICAgZmU6MjM6Nzk6ZTY6Njg6Y2M6MjY6OTA6ZjY6MTA6NjM6NWQ6MmE6NmY6OTE6CisgICAgICAgICAgICAgICAgICAgIDJkOmE0OjczOjMyOjUxOjIxOmYyOmJiOjE1OmRmOmFhOjI0OjA4OjQ4OjA2OgorICAgICAgICAgICAgICAgICAgICBkZTphMTo5ZToyNjpiZjpiYTo4MzpiZjo3YzphNDpjODphMDo4YzpiZDpkMjoKKyAgICAgICAgICAgICAgICAgICAgZmY6YmM6ODQ6Njk6Mjc6MTM6MjQ6MTg6YzQ6NDU6MTg6MjM6MjY6NWU6MTg6CisgICAgICAgICAgICAgICAgICAgIDE0OmNhOjJlOjg4Ojg3OjYyOmEzOjUzOmU2OjIxOmI3OmI4Ojg1OjdiOjlhOgorICAgICAgICAgICAgICAgICAgICA4NTpiYjoxNToyNjo3MjpmODpiOTpmNzo2YTo3NDowZjo0OTozZjo5MjpiZToKKyAgICAgICAgICAgICAgICAgICAgYTk6MDU6Yjc6OTk6Mjc6YmY6YmY6MDk6MTc6NGI6OTk6NGM6YWQ6MTE6MTA6CisgICAgICAgICAgICAgICAgICAgIDdjOmRmOjc0OjMxOmY2OjhmOjI2OjVmOmFhOjg4OmFlOjM4OjU3OmM4OjU1OgorICAgICAgICAgICAgICAgICAgICAyZDpkMzpmYjpkODoxYjo1MTo5OTpiZToyNToxYjozYTpiYTpjMDo3ZDoxYjoKKyAgICAgICAgICAgICAgICAgICAgZWQ6Y2U6ZDI6NDk6Yjk6Y2Y6ZjM6YzU6N2Q6ODk6OTA6ODE6ZDg6Njk6NDg6CisgICAgICAgICAgICAgICAgICAgIDIwOjEwOmEzOmY4OmVmOjkyOjUxOjE4OjMyOjhiOjExOjE4OmMwOjNmOjFiOgorICAgICAgICAgICAgICAgICAgICA4NTo1NjpjZTo1NzpjOTpmMjo4Mjo2NDpjNjpkZjowMjowOToyZTo0YToxMToKKyAgICAgICAgICAgICAgICAgICAgMmY6YjE6Mjc6NmQ6Mzc6NTI6ZjA6ZjA6MTY6NjE6ZjE6Njc6OGQ6ZGY6ODc6CisgICAgICAgICAgICAgICAgICAgIDcyOmFmOjg3OmRhOmNmOmZiOjUwOjk0OjZlOmQ0Ojk0Ojg1OmViOjhhOjJjOgorICAgICAgICAgICAgICAgICAgICBlYToyMTpmNTo5Njo0YTo0NDpkNTplMDpjZTo2YTo3NDo0NDo0ZDpkMDowNToKKyAgICAgICAgICAgICAgICAgICAgZDM6ODc6MTU6ZWQ6MzY6ZDA6YTQ6OGI6NjY6NTU6NzA6OTM6ZWU6NDc6MDY6CisgICAgICAgICAgICAgICAgICAgIGMxOjdlOjJlOmE1OjE4Ojc5OjY3OmYzOjI4Ojg1OmYxOjcwOmY3OjBlOjgzOgorICAgICAgICAgICAgICAgICAgICBhNDo3ZTo1NDo5ZTo1YTo3NjozMjpjYjo2NToxYjpiODpjZDpmYjpjODoyODoKKyAgICAgICAgICAgICAgICAgICAgMDM6ZDI6NTQ6OTE6ZDE6YTc6YzU6ODU6NDM6MDg6MTc6NzY6YTU6ZTY6MmY6CisgICAgICAgICAgICAgICAgICAgIDY3OjA4OmQ4OmExOmEyOjgyOjJkOjBjOmY4OmMxOmFmOjYzOmQ0OjUwOjc3OgorICAgICAgICAgICAgICAgICAgICA2ZDo2Yjo0Njo0YTo0MTo4NTpkNTo5MDo1Zjo3OToyZDpjNDplYzpkNzoxMToKKyAgICAgICAgICAgICAgICAgICAgODc6NDA6OGE6ZTE6Njg6ZTI6NjQ6Zjg6NTU6MzI6ZmI6NmY6OTM6MmM6ZGE6CisgICAgICAgICAgICAgICAgICAgIDc3OmQ5OjIxOmMxOjE3OmU1OjM2OjJjOjRlOjdlOjkwOjdmOmFjOjk0OjJiOgorICAgICAgICAgICAgICAgICAgICAzMjo2NzpiZTozODo1MDo3NjpiODphZTo0MTpiOTpkNzoyMTpjNTowOTo0YzoKKyAgICAgICAgICAgICAgICAgICAgNjA6Yzg6YTM6NTE6YzQ6MzQ6OWI6NTc6Mzc6ZGY6Y2I6Yzk6MzM6NTc6OGI6CisgICAgICAgICAgICAgICAgICAgIGViOmZiOjc2OjlmOjE5OjRkOmM1OjZhOjFmOjJhOjQ1OmFlOjJiOmVkOjJmOgorICAgICAgICAgICAgICAgICAgICA4ZDphNzphNTowMDpjYjowNDpmYToyNTo2MjoyZTo3NDo0ODoxYjpjYToyYToKKyAgICAgICAgICAgICAgICAgICAgOGM6YmE6ZGI6YjY6N2U6ZjY6YmI6MDI6N2M6YTk6YzM6ZGI6NTg6Nzg6YTE6CisgICAgICAgICAgICAgICAgICAgIGJmOmYwOmZlOjFhOjEwOjU1OjExOmNlOmU4OjY5OjRlOjk2OjY1OmM2OjE3OgorICAgICAgICAgICAgICAgICAgICAwMzpkNjowNzo2ODo4Yzo1NDo4MjphZToxYzoyMjo1NTozZjpmMTpmNDowOToKKyAgICAgICAgICAgICAgICAgICAgOTc6Mjg6YzA6NDY6Zjc6NGU6MGI6MjU6MWQ6Zjc6MDc6ZDc6MDk6MWQ6M2E6CisgICAgICAgICAgICAgICAgICAgIDE4OjU3OjM4OjNiOmU4OjMzOjA2OmU3OjhmOjc4OjQ2OjFlOjViOmY1OjA2OgorICAgICAgICAgICAgICAgICAgICBiNjplYzpiODphNjowZDpmMTpiYToxMzo0YjpkNjoxODoyMDpkZDo2OTozMzoKKyAgICAgICAgICAgICAgICAgICAgNGE6MzM6MTU6YWU6Yjg6Yzg6OTg6OGE6Mjc6MmM6OTM6YmM6MmQ6ZmI6ZWU6CisgICAgICAgICAgICAgICAgICAgIDMzOmJmOjY2OmU2OjRkOmJhOmI2OjliOjA2OjU1OjYwOjk3OjRiOmJjOjQ0OgorICAgICAgICAgICAgICAgICAgICBjZDo3ZTpmNDphMTpkODphYToyZjpjMDowMjoyODoyMToxNjo2Mjo3ODpkYjoKKyAgICAgICAgICAgICAgICAgICAgMDg6NTQ6ZjI6ZmM6ZjQ6MzQ6ZTM6YzY6OGY6MWM6NDM6NTc6Y2U6OTA6MWE6CisgICAgICAgICAgICAgICAgICAgIDRiOmRjOjJlOjNiOjI4OjkxOjg5OjNmOjdhOmRhOjM1OjFkOjhlOjJjOmVlOgorICAgICAgICAgICAgICAgICAgICA0OTplYzpmNDozMzphZDpjOTo1MzphODo4Yzo5ZjowNDo1MzozZToyNDoxYzoKKyAgICAgICAgICAgICAgICAgICAgNTI6Yzk6MTI6Zjk6NjI6NTc6YTM6YmM6ZWU6MmM6ZWI6NDA6N2M6MjA6MjM6CisgICAgICAgICAgICAgICAgICAgIDcwOjJiOjk1OmY5OjczOjE3OjhhOmQxOmMxOjFjOjY5OmE2OmI3OjM4OjlhOgorICAgICAgICAgICAgICAgICAgICA2NzpmNzo3MDoxZDo3YTo1YTowYzo0MDpjZjo2MjowZjo4NTozYzpjMjowMjoKKyAgICAgICAgICAgICAgICAgICAgNGU6N2U6YjU6ZjY6YzU6MmE6Mjk6ODQ6YjM6MWY6Mzc6MmE6ZTE6YWE6NzI6CisgICAgICAgICAgICAgICAgICAgIDQyOmM0OmVkOjZiOjFhOjhmOjkyOjFjOjVkOmJlOmQxOmYyOjViOmYyOmFiOgorICAgICAgICAgICAgICAgICAgICBhYTphOTpkMjpmNTpiODphNDo0MToyYjoyYjo5MTo2ZToxMjo0ODpjYTo5ODoKKyAgICAgICAgICAgICAgICAgICAgZDg6Mzc6OGQ6Yzg6ZWQ6MDA6MzA6YjU6YjY6MDQ6NGU6N2U6OWM6ZGE6ODQ6CisgICAgICAgICAgICAgICAgICAgIGVjOmMwOmZhOjdiOmU1OjFkOjg4OmE0OjUzOjQ2OmIwOjk0OmU0OjVjOjFiOgorICAgICAgICAgICAgICAgICAgICBhMToyNToyYzowZjo0ODo1Mjo3Nzo5NzowOTo2YzplYzo1YjoxODozMzo4MzoKKyAgICAgICAgICAgICAgICAgICAgMDI6ZTU6ODI6N2U6Y2Q6ODU6MjE6MzA6MTE6ZmQ6Mjc6NGY6Y2Y6ZTQ6MWU6CisgICAgICAgICAgICAgICAgICAgIGVjOjNmOmE1OjU3OjZjOmU5OjJhOjMwOjE5OjJhOjg4OmU1OmMzOjY5OjM4OgorICAgICAgICAgICAgICAgICAgICBhYjo2ZjozOTo3MTo3Zjo4NDplMTo0MTpjMzplMTpjYzoyYTo4OToyMDo1MjoKKyAgICAgICAgICAgICAgICAgICAgMmU6ODM6MGY6NmM6Mzk6M2Y6NGI6MmQ6MTY6YWM6MmQ6ZjA6MjQ6YWM6MDA6CisgICAgICAgICAgICAgICAgICAgIDczOmY0OjliOmIzOjA2OjNmOjA1OmI4OjE0Ojg1OjFmOmFiOjllOjVjOjNjOgorICAgICAgICAgICAgICAgICAgICA5ZTo2Mjo5ZDowZTo2ZDozYjo4MDowOTpmYzowMjplYTphMjo5Nzo3NDpjYToKKyAgICAgICAgICAgICAgICAgICAgYzc6Zjk6ZTM6NTY6ZTE6YzM6Y2E6YTU6YTY6OWE6YzA6OTA6ZTA6MjQ6MTI6CisgICAgICAgICAgICAgICAgICAgIDUzOmQyOmMyOjhiOmRhOmJlOmVkOjAyOjQzOjVlOjY3OmUxOjg5Ojk4Ojc5OgorICAgICAgICAgICAgICAgICAgICBlZTpjYjphYTpjYTpjMzoxYjpkYzplNzphNTo0NjphNTo3Yzo2YjoxNjo4NzoKKyAgICAgICAgICAgICAgICAgICAgYjY6NWE6Mjg6ZDc6ZGI6Mjc6M2M6NWU6YTU6YmQ6YjY6NTE6ZGQ6MWY6NDM6CisgICAgICAgICAgICAgICAgICAgIGNmOjNiOjI2OmM4OjNhOjhkOjI1OjYxOmMxOjQ5OmY0OjNjOjFiOmM5OjQ0OgorICAgICAgICAgICAgICAgICAgICBlYTphZjoxYzpjMjoyYjo5NDowMToyYTowZTozMDpkMTo1Yjo4YjoyYjo0NzoKKyAgICAgICAgICAgICAgICAgICAgZTU6YzM6ZDE6MDQ6MDM6OWI6MGU6Mzk6MmM6ZDY6Mjc6ZDQ6ZTY6NzA6NWE6CisgICAgICAgICAgICAgICAgICAgIGQ5Ojc1OmNmOjJhOmQ4OmM5OjAwOjA1OmU0OjEzOjg4OmVjOmMzOjM5OmZiOgorICAgICAgICAgICAgICAgICAgICA4Nzo2MTozMDozNjo0MzowMzpjODo5ZTo5YzphMjowNjpjMjoyZjpjNTpmYzoKKyAgICAgICAgICAgICAgICAgICAgZjA6ODA6NjM6YjE6NTQ6MDQ6YTA6NGM6YTk6MmU6YzY6ZjU6NzY6N2E6ZDg6CisgICAgICAgICAgICAgICAgICAgIGQwOmU0OmQ0Ojk0OjExOmU1OjE1OmI1Ojc4OjA2OmRjOmI4OjgwOjhmOjk5OgorICAgICAgICAgICAgICAgICAgICBhOToyMDozMzozZDoxMDo4NTo0Yzo2NTowOTpjYTozZTo1ODo1ZTo2MDo5MzoKKyAgICAgICAgICAgICAgICAgICAgOWE6YWE6NjI6NWQ6YzA6NTE6MDY6MWM6NWQ6NjA6YTA6MGQ6OWM6NGI6NDM6CisgICAgICAgICAgICAgICAgICAgIGY2OmE3OjE2OjIxOmE0Ojg3OmFhOmYyOmMxOjJlOmVlOjkyOjMwOmI4OjllOgorICAgICAgICAgICAgICAgICAgICBkZjpkZjoxMDowMTo4Yjo4NjowOTo3MDpkODo2YzphODpiNzo1MDoxZToxNjoKKyAgICAgICAgICAgICAgICAgICAgOTY6YjQ6Zjc6Njc6ZmQ6MzU6M2E6MjE6OTA6MmE6MzI6Yzc6MDA6N2I6NGQ6CisgICAgICAgICAgICAgICAgICAgIDA3OjEwOjA5OmI5OjJmOjczOmQ4OjE4OjdlOjY3Ojk5OjA0OjRmOjA2OmZjOgorICAgICAgICAgICAgICAgICAgICA1MDpjNzo4NTo5Yjo5ZDo0MDo5ZDpiMzo5NjozNzpmYTphNTpkYzpiMjo3MjoKKyAgICAgICAgICAgICAgICAgICAgNGU6ZWY6NGU6MDk6MmM6ZmQ6OTE6ZmQ6NGQ6Zjc6YmI6YTY6YTE6M2U6YWI6CisgICAgICAgICAgICAgICAgICAgIDdiOmEyOjAzOjQwOmE2OmE5OjU1OjI3OmUyOmZhOmY5OjE5OmNlOjg3Ojc1OgorICAgICAgICAgICAgICAgICAgICBhYTpmMTo3NTozNjpmMzpmMzpiODo5MTpmODo5MTpjMzo4Yjo3NToxMzo4ZToKKyAgICAgICAgICAgICAgICAgICAgNGM6NjU6OWE6MTY6Mzk6NmE6ZTU6MzQ6ZTg6N2E6OTY6NTk6N2Y6MzU6YjA6CisgICAgICAgICAgICAgICAgICAgIDAwOmZkOjViOjY5OmZjOjQzOjI2OmZhOmY1OjI4OjZlOmZlOjg3OmQ5OjdlOgorICAgICAgICAgICAgICAgICAgICAyNDpmYjpiNDphMDo4Mjo2ZTo1NDphMjpmZjphZTpiZjo2MjpiNDpmNDo3MjoKKyAgICAgICAgICAgICAgICAgICAgMDE6YzI6Y2I6OTg6NDc6OTg6ZTE6NGM6YjU6MTc6ODA6ODA6Y2U6OGY6YTY6CisgICAgICAgICAgICAgICAgICAgIDI4OmVlOjFlOjQ1OjZhOmZiOmRmOmYxOjFkOmZjOjVhOjNiOmQ2OmVhOmY0OgorICAgICAgICAgICAgICAgICAgICA2YzoxZDo2Mjo0OTo1NzozYjo4YTo4Zjo4NjplYTpmMDo1MzowNDpjZTo5YzoKKyAgICAgICAgICAgICAgICAgICAgMTY6Njg6ZmY6YmE6Yjk6ZmM6ODg6MGY6NDc6Zjc6MDI6NDQ6NzI6NDA6Yjg6CisgICAgICAgICAgICAgICAgICAgIGNhOjNiOjJkOjUzOjlkOmRjOjNjOjU2OjhjOjU5OjdiOjY4OjFhOjJjOjhkOgorICAgICAgICAgICAgICAgICAgICA3MTpiYjo2YzowMDpjNzoxYTpjZTo2Zjo0MDo5MjpiMTphMzoyZjowZjpkOToKKyAgICAgICAgICAgICAgICAgICAgNDQ6ZjI6YTM6NzA6MmU6OWU6ZWU6MGU6YWU6MzI6ZDA6M2I6M2U6OGI6MDc6CisgICAgICAgICAgICAgICAgICAgIGVhOmU2Ojc5OmIzOjVjOjI5OmUyOjdkOjZiOmE4OjVlOmY5OjVhOjMxOmU4OgorICAgICAgICAgICAgICAgICAgICAwODo5NjphMjo4YzowMzo5ODo0NjpmMTpiODo3ZDo5MDo1NDoyNjplZDo3NjoKKyAgICAgICAgICAgICAgICAgICAgNjI6ZmU6OWU6ZTk6OWE6NmU6NWU6Yzk6NDk6Yzc6NWM6MzQ6NTM6Mjk6NTQ6CisgICAgICAgICAgICAgICAgICAgIGQ5OmVjOmU0OjQ2OmUxOjgwOjNiOjc1OmQ5OmRmOmZiOjc5OmQ1Ojg3OmYxOgorICAgICAgICAgICAgICAgICAgICBiYTo5ZTplYjoxOTpjZTo0Yzo1Mjo3MzplNjo1Yjo4NzphZToyNTo0ZjozOToKKyAgICAgICAgICAgICAgICAgICAgNzk6Y2M6YzY6Yjg6Zjk6MTA6N2I6ZWM6ZjA6OWI6NzE6YTQ6MDU6YTA6ZDM6CisgICAgICAgICAgICAgICAgICAgIDI5OmQzOjRlOjdmOjFmOmY0OjJkOjI4Ojc4OmNjOjU1Ojk1OjdiOjFlOjkxOgorICAgICAgICAgICAgICAgICAgICAyZjpjYzo1NjoxODo3Mzo4YjpiMjpkYjpiYzo2OTowNzplNjpkMDpkODo0ZjoKKyAgICAgICAgICAgICAgICAgICAgZWQ6YTI6ZmY6NTg6ODU6YTM6NmQ6ZTA6NGE6NTM6Yjc6Njc6N2Q6OGQ6MGM6CisgICAgICAgICAgICAgICAgICAgIDVjOjViOjdiOjc3OjI4OjAyOjM1OjQ0OjdhOjA0OmQzOjI4OjQzOmM4OjZiOgorICAgICAgICAgICAgICAgICAgICAzMDoxNzo1ZDozMjpiODoyOTozNTpiYTo3NjpkYTozYjoxNDo0YTo3NjoxODoKKyAgICAgICAgICAgICAgICAgICAgNTg6YTQ6Zjg6OTI6M2M6OWU6NGQ6MzM6NmY6NDY6NmI6MDg6ZDk6MzE6NDg6CisgICAgICAgICAgICAgICAgICAgIDY4OmRkOmY0OmZiOjI0OjU2OjM0OmIyOmNmOjY5OjY2OmJlOjQ4OmQyOjhhOgorICAgICAgICAgICAgICAgICAgICA2NjoyMjpjZDpmMjo2OTpjZDpjMjo1MzoxMzo0NToyOTo0MToyMjpkNjo1ZDoKKyAgICAgICAgICAgICAgICAgICAgOTg6MWY6YjY6YTQ6YjI6YTM6YzI6ZWU6MDI6MmY6NTE6MWI6ZGM6ODM6YTQ6CisgICAgICAgICAgICAgICAgICAgIGVjOjcwOjI1OmE4OmQ0OjA4OjYxOjMyOjZmOmU0OmExOjgxOjJlOjdjOjYzOgorICAgICAgICAgICAgICAgICAgICA3MjpmYToyOTo2NTpiYzo3MDo0NDpjZjo1ZAorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgNTU6OWE6MzQ6NmE6MjI6MDY6Njk6MDk6NDU6MzM6Yzc6YWU6YTk6NWM6Yzc6MDk6NGU6OWI6CisgICAgICAgIDg2OmJjOjQxOjkwOmQ0Ojk0OjUyOmY2OmNkOjIzOjI5Ojk0OjRiOjIyOmNkOmU4OmJkOmZlOgorICAgICAgICA5ZDpjZDo1MjpmMjpiZDplZDphYjo4NzpjOTphYjphYjo0NjowNDpiNDpiZDphMjozZjoyMjoKKyAgICAgICAgMzA6NDc6NTA6YzA6NGI6OGM6NzY6MGY6MDM6ZjU6OTI6ZDI6YjE6MmQ6YzQ6N2E6MzU6OWM6CisgICAgICAgIGM5OjczOjg3OmViOmE2OjlmOmRlOjBmOjczOjhkOmQzOjdmOjk5OmQ4OmJhOjhmOjZmOmM0OgorICAgICAgICBmMzpiZToxYTphZTo4YjphMjo5NDozNjo5MDplMjplNTplYjo4ZDowNTpmNDpmYzo2NTpkZjoKKyAgICAgICAgOTU6ZjE6YzQ6OTQ6NGQ6MTc6NTY6ZDc6OWY6M2M6OGY6NTA6M2M6ZTc6Nzc6YmY6OTU6ODY6CisgICAgICAgIDI2OjY0OmZiOjZhOmZmOmM2OmRhOmU5OjhjOmFlOjQyOmJiOjY5OmU1OjMzOmM2OmQ4OmU5OgorICAgICAgICAwZDpjNjo1NToyMTo0OTpjMTowYzpiNDphMzpmOTo5Yjo0Yjo1YzpkZTo4Mzo0Zjo0MTowMzoKKyAgICAgICAgY2U6MmE6Nzk6Njg6Mzg6N2Q6ZjA6NTQ6NDk6MjA6ZjU6YjY6MTA6ZmY6MDg6ZGM6MzM6NjY6CisgICAgICAgIDk2OjliOmZmOjA2OmRlOjAwOjllOmQ3OmNlOjU2OjQzOjlhOjUxOmZjOjcwOmNkOmY2OmYwOgorICAgICAgICA1MTphMzpiNzpjZDpiNDo1Yzo4NTo2MjpjZDo3MTpiNzpjNjoyYjoyMzoyYjpkZDpjMzo2ZToKKyAgICAgICAgNDA6NDI6ZmE6Mzc6ZmY6Mzc6MWM6ZjY6N2E6NTc6OTQ6ODc6ODU6MjM6ZDc6ZDQ6Yzk6Yzc6CisgICAgICAgIDVmOmMxOjRkOjJmOmM5OjBkOmQ3OjVjOmVjOjljOjI1OmVlOjllOjMwOjgyOjkxOjk2OjcyOgorICAgICAgICBiODo3NToxZDpmODowOTo2ODo1Nzo5NzpiMjoyZDo0YjplZToyNTplYzo3YToyNDoyOTplZToKKyAgICAgICAgNzI6ZDQ6OWM6MTM6ZGI6YWI6ZGM6MDM6MGE6ZDg6NGE6MTQ6Yzk6MDg6NTc6NDQ6NWQ6YTE6CisgICAgICAgIGI1OjUzOjgwOjM0OmYyOjE0Ojk3OmNmOjUyOmRlOmEyOjBlOjhhOjEwOmU5OjE0OmVmOmQwOgorICAgICAgICA2MDpiZTo2MTphMTpmMToyNTo1ZDpkNToxODo3MzozZjo5MzoxMDpjYTo5NjplZTpiMzo0MDoKKyAgICAgICAgZDI6ZGI6YTM6NTU6Y2Y6NTc6NWE6YTU6MGU6NGY6NzU6NDc6ZGY6ZWE6Zjc6OTA6OWE6NmQ6CisgICAgICAgIGY1OjcwOjJlOjFkOjE0OjFjOjM3OjY0OjA0OjU5OjUwOmIwOmRjOjcyOjg2OjZmOjljOjM3OgorICAgICAgICAzZDo1ZDoyODphZjo3Mzo1NTplZjpkMjplZToyNDo3NDo3NDoxMzplZjpkYzpkYjozMTo0OToKKyAgICAgICAgZmI6M2Y6NjM6ZjU6ZDM6MDg6M2U6MzM6YTU6ZTc6OWQ6MGE6ZGU6NTM6MmM6NTE6OGU6Njc6CisgICAgICAgIGRiOjliOjQxOjY1OjQxOjUwOmJkOmQ0OmE0Ojk2OjZjOjg3OmJjOjEyOmUwOjk0OmM3OmQzOgorICAgICAgICBjMDplNDpjYjo3Mzo1ODowMDo4MzplMTphYzoyNzo4NTpkNjo5ZDo1Mzo5ZDo1YzpiZDowYToKKyAgICAgICAgM2U6MDM6NDM6OWM6MGM6OTE6ZjU6NmQ6N2I6Zjg6NDA6NzI6NzU6YWI6MTE6NzY6OTE6MmI6CisgICAgICAgIGUxOmM2OmFhOjFmOjcwOjY5Ojc2OjcwOjE1OjA5OmZlOjkzOmQwOmQ2OjJkOmI3OjE1OjZhOgorICAgICAgICA5Yjo2Nzo1YzpiNDo2OTo5ZjoyNTphNjo3ZDo4YTpmYjo3ZDoyMjphOTo3MTpmMjpjZTo0ZToKKyAgICAgICAgOGM6Yjg6MjE6MmQ6ZGU6ZmU6NDE6NzE6MGQ6ZmY6OWQ6ZWM6NzM6YTY6YmI6MDc6NGY6ODg6CisgICAgICAgIDBlOjU4OjQ3OjJlOjdlOmE5OmMyOmM3Ojc4OmRkOmJhOjdhOjllOjRlOmUwOjMwOjRlOjYzOgorICAgICAgICA2Zjo4NTpkNDoyMDo0MTplOTpmYTpmZTo0Mzo0NTplNzpmYjphZjo3YTpiMjpjZTphNDowNToKKyAgICAgICAgMWQ6MjI6OWE6NTg6ODY6ZGY6ZTQ6Y2U6NGM6YTk6ZmU6ZDg6MTY6YTU6NmY6ZmI6ZDg6Y2U6CisgICAgICAgIDU2OjdiOmY1OmQ2OjIwOmVmOmU0OjQ3OmNkOjYzOjI0OmZmOmI5OmJlOmYxOjQ4OmEzOmMxOgorICAgICAgICAwMTo3MjplNjpiZDpjMDphZDplZDoyNjowZDpjYTozNDo5ZjpmYzowMjoyZDoyMDo0ZjowNToKKyAgICAgICAgMjA6YWU6MjE6M2Q6MGM6YzI6MjA6M2M6M2Y6ZjA6MDQ6ODQ6ZGM6Y2Y6ODk6ZmQ6Yjk6MjU6CisgICAgICAgIDkxOjhlOmQwOjQzOmU2OmIzOjIwOmFiOjVjOjJkOmQ1OjQwOjllOmEwOjRiOmQ4OmY0OmIyOgorICAgICAgICBjYzo3ZDpmMTo1ODowYTo4ZTo4NzplZDo4ODphYzozNjo5NjplNDo1NjphMDoxMTo4YTpmMjoKKyAgICAgICAgOWE6ZDA6YjM6NTc6YTM6MzQ6YmI6MTk6YWI6Mzg6ZTE6NzQ6NmI6MjI6YzQ6MzE6Y2U6MDE6CisgICAgICAgIGQ1OjFiOjM2OmUzOjFlOjM4OjRjOjMzOjkzOmRmOjQwOmUzOjU5OjU3OjRlOmFjOjZlOjdiOgorICAgICAgICAxZTo1YTozZDpjNToxZDo1YjphYzpjODoxMDo4MjozNTowMjoyMjpiMjpmYzo3NTplODoxMDoKKyAgICAgICAgOTE6OGQ6YzQ6N2Q6Nzg6OTM6NDc6OWU6MWM6OWQ6YWM6NmI6NjI6MDI6NTg6OGM6ZDY6MWM6CisgICAgICAgIDIzOmQ2OmFmOjc4OmMyOjgwOjljOmE0OmFhOjI0OjU0OjE0OmI1OjE0Ojk4OmM2OmY4OjJiOgorICAgICAgICAxYToyNDpjYjo3MTozMjowYTplMjo5YjowZTo2OTo2YjpkZDo3ZTo4Yzo2NDpkMToyZTo2MzoKKyAgICAgICAgZWY6MGU6N2Y6YjE6M2U6ODg6NGM6OWQ6NTU6ZTU6Yzk6NmU6MTc6MDQ6Yjc6NDE6ZmY6YmQ6CisgICAgICAgIDhhOjQxOmNiOjI1OjMxOjZmOjQ0Ojc3OjNmOjQ3OmIxOmZjOjgxOjg4OjA3OjhlOjA1OjQ5OgorICAgICAgICAyMDpiNzoxMTpkOTo2OTowMzoyYTowMzo5ZDpiOTozMzo4NDo5YTpkZjpkZjo3YTplMzo0NjoKKyAgICAgICAgNzM6YTM6ZDg6YTI6OGM6NTM6MTk6ODg6NTU6NGM6NzQ6Yjg6ZjY6NDQ6ODQ6MmI6ZDE6MTQ6CisgICAgICAgIDJkOjRlOjM5OjJlOjkyOjY4OmZmOjY5OmZjOjg1OjYyOjFiOmViOjU1OjRmOmVmOjI1Ojg0OgorICAgICAgICA2Mjo0NTo5OTpkNjpkODo0ZTo2ZjozZjo1MzowODo3ZDoxZDowNjo5NTo4MTo4MDo3Zjo0ZjoKKyAgICAgICAgNGU6NzQ6MzY6OTg6YjU6ZTI6ODc6NzA6OTg6ZGM6ZDc6ZjU6ZGM6NTI6MTU6ZTY6YzY6ZDY6CisgICAgICAgIDc5Ojk2OjM5OjdmOjhmOjk1OmNmOmFiOjgwOjUzOmFkOjFiOjBiOjQ1OjQwOjBlOmQ0OjE4OgorICAgICAgICBiZDoyYzpkZTo4YTo3Nzo3NjpmZDpmMjo0NDo0NzpjNjoyMTpkMDplNDo3NDpmMDpkODoxODoKKyAgICAgICAgMDU6Yzg6N2M6MzA6NzI6Yzc6ZGY6ZjE6YmI6ZmM6MDI6MzA6YTk6ZjQ6NDI6MjY6NTk6MGQ6CisgICAgICAgIDkzOjA1OjgyOmExOjczOmVkOjM0OmU1OjM4OjVkOmNkOjUwOjkwOmZlOjk0OmZjOjEzOmJjOgorICAgICAgICBiZDpmYzphODphMjo4ODphNzo3MzpjNDpiMjphODpkMTo1ZDo4ODpjNDowMjphMjo3YTpmMToKKyAgICAgICAgMDQ6Yzk6ZmU6OGM6NzQ6Yzk6ZWY6MWQ6NjQ6NDE6OWY6YWM6MWU6OTY6Njc6NjQ6YWM6YWI6CisgICAgICAgIDI4OjQxOmM3OjlkOmY3OmMwOjk4OjFiOjZlOjA3OmMyOjY0OjdkOjVhOjgzOjY2OjU2OjI4OgorICAgICAgICAzNjo5YzplNzpmYjoxYzo3NzowZToyODphMDpjNDpmNzo2Yjo3OTozOTowNDoyMDo4NDpjNzoKKyAgICAgICAgNTc6OTM6YmM6MWI6YTA6ZWE6YmM6ZWI6NDI6ZTU6YTg6MTE6ZmU6ZmM6YWM6NjU6Y2M6ZmQ6CisgICAgICAgIGY4OjI4Ojg4OmY0OmE1OjlhOmU1OjczOjUxOmUwOmE4OjliOjBkOjAzOjc3OjRlOmU1OmUwOgorICAgICAgICA5ODpiMzo4ODpkYTo3ZDplNjpjNjo5ZTo3YzoxNDo2NjpjMToyZTo1Mzo0YTo5MjowNzozNzoKKyAgICAgICAgYTA6N2U6ZTk6M2Q6MDk6ZTQ6MTU6N2M6Y2Y6ZmQ6Yjg6NDE6YTU6ZWY6OWU6NjY6OWQ6YzQ6CisgICAgICAgIDVlOjA3OjFkOjg3OmY4OjQxOmFkOmVhOmU3OjJmOmQyOjQxOjYzOjE4OjM3OmY5OjE0OmUzOgorICAgICAgICA0ZDpkMDplNTpmNzo0MzpmZDoxNTplMzpmOTozNjo3MzowNjoyNjpkZjowMTo0ZjphOTpjMzoKKyAgICAgICAgNGU6ZGU6MjA6NDY6Nzc6OTg6YjQ6N2E6MjQ6MmI6M2I6NzU6MmI6NGU6NTg6OGQ6OWI6NWQ6CisgICAgICAgIGE0OmM3OjE2OmEwOmJjOjMyOjg4OjNmOmExOjgzOmYzOjAwOmM4OmY4OmQ4OjU4OmU5OjYzOgorICAgICAgICA1ZDo0YzoyYjpiNTpmMDo3Mjo0MTpkODphYjo3NzozNzpkNjo3Mjo3NDphZTpiNjozNjo5YzoKKyAgICAgICAgYzg6YTY6ODM6NDk6NGI6ZTA6Yzk6NTY6MGI6Mjk6YmU6MDA6MzA6Y2I6ZGQ6ZDY6Yzg6NDI6CisgICAgICAgIDhhOjAwOmQ5OmVjOjE1OmQxOjM0OjcxOmYyOjViOjY0Ojg3OmY2OjI3OmQyOmI3OmViOjg2OgorICAgICAgICBiMDo5MDpiZjoyOTpkYjoyMTo5ZTozNjo4YzplMzoyMDoyZjo5NToyMzo1MTo2YzoxYjpjMjoKKyAgICAgICAgYTQ6ZDU6ZTY6ZDg6MDI6NDM6Njc6YTA6ZmU6OWI6NTA6MDM6NDQ6N2Y6YmI6ZTQ6NzI6ZDU6CisgICAgICAgIGQxOmU0OmRhOjhmOjkyOjE0OjY0OmZiOjVkOjE0OjEwOjEyOjRhOjk1OjA2OmM5OjY1OjA4OgorICAgICAgICAyOTpjYToyMTphMzoyNjozODoxMTpjOToyNzpkZjo3MDo2NzowNDpmZDpjYTo0ODozMjo3ZjoKKyAgICAgICAgNjM6YjI6NDU6NzQ6MzE6NTA6NGY6ODc6ZDk6MjA6NzA6ZDI6MjE6NzA6YjE6ZDY6MTA6OWQ6CisgICAgICAgIDMzOjVkOjc4OjgzOjkxOjZkOjU1OjgyOmVjOmRhOmU0OjYyOjYzOmM3OjgxOjQ2OmQ3OjE5OgorICAgICAgICA2NTo3MjoyYTo0MzoxOTo5MDpiODpkNzoyMzo0ZDo0YzoxYzplMDo0NDphOTo2Njo2NzphYzoKKyAgICAgICAgZWU6NzE6Nzk6Mjc6MjY6Nzg6NmQ6NzI6MGU6ZjU6NWQ6NGI6MjM6YjU6N2M6N2M6NjU6ZTk6CisgICAgICAgIDE3OmM2OjNhOjBiOjBkOmRkOjVlOjFlOjUxOmMzOjg2OmI4OmVjOjdmOmM3OjI3OjRhOmE1OgorICAgICAgICA0NjplODo2YToyZDoxOTpjMTo4NzphMzpjYjo5OTo5Mzo4Nzo2NDphMjo1NToxNDo0YzpiNzoKKyAgICAgICAgNDM6YTU6OTM6ZDc6ZTc6ZDI6NGU6Nzk6NDA6Y2E6NjU6OTk6NDY6M2Q6M2Y6N2E6ODA6N2E6CisgICAgICAgIDg4OjZhOmNjOjFlOmU1OjZiOjMzOjQ2OmY0OjUwOmMwOmQ1OjFmOjA5OmI4OmNkOjhhOjJlOgorICAgICAgICBhMToyNzplYjo1ZDo3MzphNzplODo2YjowYTplNTo1Nzo4MjoyYTpiMDpmYzplMjo1NDo1MjoKKyAgICAgICAgNTY6ZjA6YWI6YTk6MTI6YzY6MjM6OTY6MDc6MjQ6OWM6ZTA6YmM6NDY6YTU6YjQ6MjA6MDQ6CisgICAgICAgIGRhOjA5OjkzOjYzOmU1OmQ0OjJlOmMyOjdlOmM1OjMxOmVkOmI1OjE1Ojc0Ojg2OjE3OmI5OgorICAgICAgICBiMzpmMzoyNjo4YToxZDowMjo2YTpkYToxYTozZjplODpiYTpmMTowNDo2ZDo5NDo1MTo1NDoKKyAgICAgICAgZTI6NWE6YjQ6NTk6ODM6MWQ6NjA6ZDA6MmQ6NzM6Y2M6MDc6YjU6MjY6OGM6Zjk6ZDc6YzY6CisgICAgICAgIDg4OjkxOmVmOjgwOmNmOjVkOjBmOmExOjYwOmNiOjQ1OmQ0OjQyOjIyOmQxOmIxOjcwOjFkOgorICAgICAgICBmZDpkMDpiNzozMDo5MDozYTpjNjo0ODo2ZDo2NzplNTozMjpkYTo4ZjpkYjplMzphODplMzoKKyAgICAgICAgMWQ6MjA6MjU6YTI6MWM6ZTE6NGM6Yjk6YTQ6ZjY6YzY6M2Y6NWM6NTg6MGQ6YmI6YzY6YjI6CisgICAgICAgIDc3OjAxOjE2OjkxOjlmOjE3OjA2OjBkOmI3OjQwOjNlOmNjOjhmOjhlOjljOjRiOmUwOjlkOgorICAgICAgICA3ZTo5YjoxZTowNTphYjo4ODoyMjpmYTpkMzoyODoxYjo1NzoxNDo2NDo0YTozZToyNDoyYzoKKyAgICAgICAgMzg6NGQ6MjE6Njk6MDA6NzM6MmU6ZDA6NTU6MmQ6NzQ6ZjI6MTU6ZTg6OTQ6NDM6M2U6NDA6CisgICAgICAgIDJhOmM2OmM2OmI5OjZhOjViOmRlOmEyOmNjOjE4OjUwOjU0OjVkOjRlOjJhOjg1OjZjOmY2OgorICAgICAgICA5Mjo4YjoyOToxOTo3ZTplNzplYTo0YTplMDoyMjoyYjoyNTpiYzpmNzo2NjpjZjo3Nzo5YToKKyAgICAgICAgNDE6NzQ6ZjI6M2M6MTQ6MGQ6NzQ6Njk6ZjU6NTA6ODM6Y2Q6Y2Q6MmY6MjE6ZGI6MjI6NDY6CisgICAgICAgIDhhOmQwOmY3OjUxOjFhOjk1OjU3OmYyOjA1OjhiOjFhOjE5OmVkOjNiOjQ1OmU4OjM2OmMyOgorICAgICAgICA2ZTo3ZTpmYjo1NzoyMjowMDoxZjowNjo1MzphOTphZTo5MzpjNjo4Zjo3MToyYTozMTo0NToKKyAgICAgICAgOTI6ZTc6OGU6NmQ6ZTY6OTk6MjI6YzA6ODM6ZmM6ZWY6ZGM6NTc6NjY6Nzc6NGY6YTI6MzY6CisgICAgICAgIDMxOmZiOmExOjEzOjhkOmU1OmNhOmEzOjk1OjdkOjAxOjBjOjY0OjcwOjNiOjUzOjQyOjY4OgorICAgICAgICA4MDpjNzpiYjo5ZDphODowMDozNTo2OTo5ODowYzphODo2NzpkODo0MzplNTphYTpjZjo5NToKKyAgICAgICAgZTA6NTE6OTU6YTQ6MTc6M2Y6NDI6OWQ6Yjg6MDQ6Y2U6ZDM6Nzk6Nzk6Yzg6ZDM6OGE6MTY6CisgICAgICAgIDMyOjkyOmUwOmQ3OmEyOmVlOmQ3OjM3OjRjOjJmOmFjOmI4OjdiOmJlOjQ1OmY2OmYxOjE4OgorICAgICAgICAzMzo5Yzo3YjozNzphNjoyNDpkOTpiYzo0MDphYjowMDplOTpjMzozNzo4YjphYjpkODpiNjoKKyAgICAgICAgZjM6NWU6ODE6NGU6YjA6MTQ6NmI6MDc6M2U6MWY6ZWM6YzI6ZjY6NDQ6MjI6OTU6YmI6YjM6CisgICAgICAgIGU2OjZmOmQ2OmY5OjcwOjY1OmJhOjBhOjgzOjY1OmFhOjBlOjEzOjJmOjgzOjEzOjIzOjUzOgorICAgICAgICA4Yjo0MDoxNjpmYTpjZToyZjpmYzo0ZDowNDpmODplYjpkODphYzpjNTozNjpjMjoxNTo1NzoKKyAgICAgICAgNDg6Mzg6ZWM6NTU6YjM6YjQ6MWU6YmE6YWQ6ZDI6NDI6MDY6MTc6MGQ6NzM6Yzg6NTc6YTY6CisgICAgICAgIGJlOjk2OjRkOmE5OmYyOmMwOmZiOjdhOjIxOjFjOmY1OmM5OjcwOmE5OjgyOjkwOmI1OmYxOgorICAgICAgICAwYzpkNDo3OToxMDpiZTo4MTphNjplOTo1Yzo2MTo5Yzo3Nzo3OTo5YTphNDpjMzozNzoyNjoKKyAgICAgICAgNTc6Mzc6Yzk6NTI6MmM6ZmE6MDg6ZmY6ZDA6NWY6YzY6NjE6YzA6ZjQ6NzY6YmU6ZmM6ZGU6CisgICAgICAgIDRlOmNmOmFiOjUxOjk5OjcxOmM3OmRmOjdlOmY0OmQ2OmNmOjA2OjU2OjE5OjEzOjUzOjBiOgorICAgICAgICA2ZDo3NDo1OTo0ODoxOTo5Yjo1MzowNToyZDo5ZDozMjo1NDpkMzplNToyYzo1Mzo4Yjo2NDoKKyAgICAgICAgM2U6ZDQ6NjQ6N2I6ZTM6ODA6MDk6MTQ6Y2M6ZmU6MTY6NDY6NjM6NmI6NzE6Njk6Zjg6Zjk6CisgICAgICAgIGNiOjI3OmY2Ojg4OjU0OmJjOjQ1OmIzOmNlOjAyOmM4Ojk0OmVlOjQwOjViOmY5OjQyOjAyOgorICAgICAgICBjMjpmZjpiMDpkODoyYzplYjoyODo3Zjo1ZTpjOToyNjowMTo5OTphNworCitVUFMgRG9jdW1lbnQgRXhjaGFuZ2UgYnkgRFNUCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IDc4OkE1OkZCOjEwOjRCOkU0OjYzOjJFOkQyOjZCOkZCOkYyOkI2OkMyOjRCOjhFCitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRCtEQ0NBdUFDRVFEUUhrQ0xBQUFDZkFBQUFBY0FBQUFCTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUc1TVFzdworQ1FZRFZRUUdFd0oxY3pFTk1Bc0dBMVVFQ0JNRVZYUmhhREVYTUJVR0ExVUVCeE1PVTJGc2RDQk1ZV3RsSUVOcAorZEhreEpEQWlCZ05WQkFvVEcwUnBaMmwwWVd3Z1UybG5ibUYwZFhKbElGUnlkWE4wSUVOdkxqRWVNQndHQTFVRQorQ3hNVlZXNXBkR1ZrSUZCaGNtTmxiQ0JUWlhKMmFXTmxNUmt3RndZRFZRUURFeEJFVTFRZ0tGVlFVeWtnVW05dgorZEVOQk1TRXdId1lKS29aSWh2Y05BUWtCRmhKallVQmthV2R6YVdkMGNuVnpkQzVqYjIwd0hoY05PVGd4TWpFdworTURBeU5UUTJXaGNOTURneE1qQTNNREF5TlRRMldqQ0J1VEVMTUFrR0ExVUVCaE1DZFhNeERUQUxCZ05WQkFnVAorQkZWMFlXZ3hGekFWQmdOVkJBY1REbE5oYkhRZ1RHRnJaU0JEYVhSNU1TUXdJZ1lEVlFRS0V4dEVhV2RwZEdGcworSUZOcFoyNWhkSFZ5WlNCVWNuVnpkQ0JEYnk0eEhqQWNCZ05WQkFzVEZWVnVhWFJsWkNCUVlYSmpaV3dnVTJWeQorZG1salpURVpNQmNHQTFVRUF4TVFSRk5VSUNoVlVGTXBJRkp2YjNSRFFURWhNQjhHQ1NxR1NJYjNEUUVKQVJZUworWTJGQVpHbG5jMmxuZEhKMWMzUXVZMjl0TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQworQVFFQTd4ZnNyeW5tMlNzbndOdDdKSjltOUFTandxMEt5ckROaEN1cU4vT0FvV0R2UW8vbFhYZGZWMEpVM1N2YgorWWJKeFhwTjdiMS9ySkN2bnBQTHI4WE96QzQzMVdkY3kzNnlRams0eHVpVk50Z3ltOGVXdkRPSGxiMUlERmNIZgordm41S3BxWVlSbkEvNzZkTnFOejFkTmxoZWtBOG9aUW82c0tVaU1zM0ZRVVpQSlZpdWh3dCt5aU0wY2lla2p4YgorRVZRN2VObEhPNXN0U3VZK2UydmY5UFlGenlqMnVwZzJBSjQ4TjRVS25ONjNwSVhGWS8yM1loUnRGeDdNaW9DRgorUWpJUnNDSGluWGZKZ0JaQm51dmxGSWwvdDhPOFQ4R2ZoNXVXN0dQMitaQldEcFdqSXdxTVpOcWJ1eHgzc0V4ZAorNXNqbzlYMTVMVmNrUDh6alBTeVl6eEtmRndJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUM3T0k0RQorSWlaWURpRkVWc3k5V1h3cGFNdGNEOGlHVkQrQmVLZXRqOHhHOXh4VXVIa3RXM0lGYXVnaDBPd2RIZjZrTkZHKworN3UzT3pKd1dhT0pkZFhNSVF6R1JhaEFyRU1KTGFmakpyWmlvL2JqdjlxdndYeUh2eTRWckNlMHZTR2ExWUhMQQorNktESG1Oc085eHR6alRRSUNudkZkMktxTUNPYnNCNkxnSmhVM0FXSHM2bGlXZnlMdHhXYXJFVHN6elVhOXc4dQorWFpKTEFjaDc3cUEzN2VRZGdnMlpRVU1YcmRUVnl1UDVmUmVpQWRBd0QwQzUzTGtFZ21tRHR2a1ArZ2FTOTZqMAorMWhjYzhGNS94Q25JNXVIaS96Wm9JVkd1LzZtNmhKS3RpbnN6MkpEU3dYbHRNek01ZEt3Yk9IR2ZMQWVRNmgzZworMDRsZnkrOFVqU2RVcGIxRworLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMSAoMHgwKQorICAgICAgICBTZXJpYWwgTnVtYmVyOgorICAgICAgICAgICAgZDA6MWU6NDA6OGI6MDA6MDA6MDI6N2M6MDA6MDA6MDA6MDc6MDA6MDA6MDA6MDEKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz11cywgU1Q9VXRhaCwgTD1TYWx0IExha2UgQ2l0eSwgTz1EaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4sIE9VPVVuaXRlZCBQYXJjZWwgU2VydmljZSwgQ049RFNUIChVUFMpIFJvb3RDQS9FbWFpbD1jYUBkaWdzaWd0cnVzdC5jb20KKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IERlYyAxMCAwMDoyNTo0NiAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogRGVjICA3IDAwOjI1OjQ2IDIwMDggR01UCisgICAgICAgIFN1YmplY3Q6IEM9dXMsIFNUPVV0YWgsIEw9U2FsdCBMYWtlIENpdHksIE89RGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uLCBPVT1Vbml0ZWQgUGFyY2VsIFNlcnZpY2UsIENOPURTVCAoVVBTKSBSb290Q0EvRW1haWw9Y2FAZGlnc2lndHJ1c3QuY29tCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMjA0OCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMjA0OCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDplZjoxNzplYzphZjoyOTplNjpkOToyYjoyNzpjMDpkYjo3YjoyNDo5ZjoKKyAgICAgICAgICAgICAgICAgICAgNjY6ZjQ6MDQ6YTM6YzI6YWQ6MGE6Y2E6YjA6Y2Q6ODQ6MmI6YWE6Mzc6ZjM6CisgICAgICAgICAgICAgICAgICAgIDgwOmExOjYwOmVmOjQyOjhmOmU1OjVkOjc3OjVmOjU3OjQyOjU0OmRkOjJiOgorICAgICAgICAgICAgICAgICAgICBkYjo2MTpiMjo3MTo1ZTo5Mzo3Yjo2Zjo1ZjplYjoyNDoyYjplNzphNDpmMjoKKyAgICAgICAgICAgICAgICAgICAgZWI6ZjE6NzM6YjM6MGI6OGQ6ZjU6NTk6ZDc6MzI6ZGY6YWM6OTA6OGU6NGU6CisgICAgICAgICAgICAgICAgICAgIDMxOmJhOjI1OjRkOmI2OjBjOmE2OmYxOmU1OmFmOjBjOmUxOmU1OjZmOjUyOgorICAgICAgICAgICAgICAgICAgICAwMzoxNTpjMTpkZjpiZTo3ZTo0YTphNjphNjoxODo0Njo3MDozZjplZjphNzoKKyAgICAgICAgICAgICAgICAgICAgNGQ6YTg6ZGM6ZjU6NzQ6ZDk6NjE6N2E6NDA6M2M6YTE6OTQ6Mjg6ZWE6YzI6CisgICAgICAgICAgICAgICAgICAgIDk0Ojg4OmNiOjM3OjE1OjA1OjE5OjNjOjk1OjYyOmJhOjFjOjJkOmZiOjI4OgorICAgICAgICAgICAgICAgICAgICA4YzpkMTpjODo5ZTo5MjozYzo1YjoxMTo1NDozYjo3ODpkOTo0NzozYjo5YjoKKyAgICAgICAgICAgICAgICAgICAgMmQ6NGE6ZTY6M2U6N2I6NmI6ZGY6ZjQ6ZjY6MDU6Y2Y6Mjg6ZjY6YmE6OTg6CisgICAgICAgICAgICAgICAgICAgIDM2OjAwOjllOjNjOjM3Ojg1OjBhOjljOmRlOmI3OmE0Ojg1OmM1OjYzOmZkOgorICAgICAgICAgICAgICAgICAgICBiNzo2MjoxNDo2ZDoxNzoxZTpjYzo4YTo4MDo4NTo0MjozMjoxMTpiMDoyMToKKyAgICAgICAgICAgICAgICAgICAgZTI6OWQ6Nzc6Yzk6ODA6MTY6NDE6OWU6ZWI6ZTU6MTQ6ODk6N2Y6Yjc6YzM6CisgICAgICAgICAgICAgICAgICAgIGJjOjRmOmMxOjlmOjg3OjliOjk2OmVjOjYzOmY2OmY5OjkwOjU2OjBlOjk1OgorICAgICAgICAgICAgICAgICAgICBhMzoyMzowYTo4Yzo2NDpkYTo5YjpiYjoxYzo3NzpiMDo0Yzo1ZDplNjpjODoKKyAgICAgICAgICAgICAgICAgICAgZTg6ZjU6N2Q6Nzk6MmQ6NTc6MjQ6M2Y6Y2M6ZTM6M2Q6MmM6OTg6Y2Y6MTI6CisgICAgICAgICAgICAgICAgICAgIDlmOjE3CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBiYjozODo4ZTowNDoyMjoyNjo1ODowZToyMTo0NDo1NjpjYzpiZDo1OTo3YzoyOTo2ODpjYjoKKyAgICAgICAgNWM6MGY6Yzg6ODY6NTQ6M2Y6ODE6Nzg6YTc6YWQ6OGY6Y2M6NDY6Zjc6MWM6NTQ6Yjg6Nzk6CisgICAgICAgIDJkOjViOjcyOjA1OjZhOmU4OjIxOmQwOmVjOjFkOjFkOmZlOmE0OjM0OjUxOmJlOmVlOmVkOgorICAgICAgICBjZTpjYzo5YzoxNjo2ODplMjo1ZDo3NTo3MzowODo0MzozMTo5MTo2YToxMDoyYjoxMDpjMjoKKyAgICAgICAgNGI6Njk6Zjg6Yzk6YWQ6OTg6YTg6ZmQ6Yjg6ZWY6ZjY6YWI6ZjA6NWY6MjE6ZWY6Y2I6ODU6CisgICAgICAgIDZiOjA5OmVkOjJmOjQ4OjY2OmI1OjYwOjcyOmMwOmU4OmEwOmM3Ojk4OmRiOjBlOmY3OjFiOgorICAgICAgICA3Mzo4ZDozNDowODowYTo3YjpjNTo3Nzo2MjphYTozMDoyMzo5YjpiMDoxZTo4Yjo4MDo5ODoKKyAgICAgICAgNTQ6ZGM6MDU6ODc6YjM6YTk6NjI6NTk6ZmM6OGI6Yjc6MTU6OWE6YWM6NDQ6ZWM6Y2Y6MzU6CisgICAgICAgIDFhOmY3OjBmOjJlOjVkOjkyOjRiOjAxOmM4OjdiOmVlOmEwOjM3OmVkOmU0OjFkOjgyOjBkOgorICAgICAgICA5OTo0MTo0MzoxNzphZDpkNDpkNTpjYTplMzpmOTo3ZDoxNzphMjowMTpkMDozMDowZjo0MDoKKyAgICAgICAgYjk6ZGM6Yjk6MDQ6ODI6Njk6ODM6YjY6Zjk6MGY6ZmE6MDY6OTI6Zjc6YTg6ZjQ6ZDY6MTc6CisgICAgICAgIDFjOmYwOjVlOjdmOmM0OjI5OmM4OmU2OmUxOmUyOmZmOjM2OjY4OjIxOjUxOmFlOmZmOmE5OgorICAgICAgICBiYTo4NDo5MjphZDo4YTo3YjozMzpkODo5MDpkMjpjMTo3OTo2ZDozMzozMzozOTo3NDphYzoKKyAgICAgICAgMWI6Mzg6NzE6OWY6MmM6MDc6OTA6ZWE6MWQ6ZTA6ZDM6ODk6NWY6Y2I6ZWY6MTQ6OGQ6Mjc6CisgICAgICAgIDU0OmE1OmJkOjQ2CisKK1ZhbGlDZXJ0IENsYXNzIDEgVkEKKz09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogNjU6NTg6QUI6MTU6QUQ6NTc6NkM6MUU6QTg6QTc6QjU6Njk6QUM6QkY6RkY6RUIKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlDNXpDQ0FsQUNBUUV3RFFZSktvWklodmNOQVFFRkJRQXdnYnN4SkRBaUJnTlZCQWNURzFaaGJHbERaWEowCitJRlpoYkdsa1lYUnBiMjRnVG1WMGQyOXlhekVYTUJVR0ExVUVDaE1PVm1Gc2FVTmxjblFzSUVsdVl5NHhOVEF6CitCZ05WQkFzVExGWmhiR2xEWlhKMElFTnNZWE56SURFZ1VHOXNhV041SUZaaGJHbGtZWFJwYjI0Z1FYVjBhRzl5CithWFI1TVNFd0h3WURWUVFERXhob2RIUndPaTh2ZDNkM0xuWmhiR2xqWlhKMExtTnZiUzh4SURBZUJna3Foa2lHCis5dzBCQ1FFV0VXbHVabTlBZG1Gc2FXTmxjblF1WTI5dE1CNFhEVGs1TURZeU5USXlNak0wT0ZvWERURTVNRFl5CitOVEl5TWpNME9Gb3dnYnN4SkRBaUJnTlZCQWNURzFaaGJHbERaWEowSUZaaGJHbGtZWFJwYjI0Z1RtVjBkMjl5CithekVYTUJVR0ExVUVDaE1PVm1Gc2FVTmxjblFzSUVsdVl5NHhOVEF6QmdOVkJBc1RMRlpoYkdsRFpYSjBJRU5zCitZWE56SURFZ1VHOXNhV041SUZaaGJHbGtZWFJwYjI0Z1FYVjBhRzl5YVhSNU1TRXdId1lEVlFRREV4aG9kSFJ3CitPaTh2ZDNkM0xuWmhiR2xqWlhKMExtTnZiUzh4SURBZUJna3Foa2lHOXcwQkNRRVdFV2x1Wm05QWRtRnNhV05sCitjblF1WTI5dE1JR2ZNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R05BRENCaVFLQmdRRFlXWUo2aWJpV3VxWXZhRzlZCitMcWRVSEFadTlPcU5TTHd4bEJmdzgwNjhzcmcxa25hdzBLV2xBZGNBQXhJaUdRajQveEVqbTg0SDliOXBHaWIrCitUdW5SZjUwc1FCMVphRzZtK0Zpd25ScVAwei94M0JrR2dhZ080RHJkeUZORkNRYm1EM0REK2tDbUR1SldCUThZCitUZndnZ3RGelZYU05kbktnSFowZHdOMC9jUUlEQVFBQk1BMEdDU3FHU0liM0RRRUJCUVVBQTRHQkFGQm9QVW4wCitMQndHbE4rVllIK1dleGYrVDNHdFpNamRkOUx2V1ZYb1AraU9CU29oOGdmU3RhZFMvcHl4dHVKYmR4ZEE2bkxXCitJOHNvZ1RMREFIa1k3RmtYaWNuR2FoNXh5ZjIzZEtVbFJXbkZTS3NaNFVXS0pXc1o3dVc3RXZWLzk2YU5VY1B3CituWFMzcVQ2Z3BmKzJTUU1UMmlMTTdYR0NLNW5QT3JmMUxYTEkKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDEgKDB4MCkKKyAgICAgICAgU2VyaWFsIE51bWJlcjogMSAoMHgxKQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBMPVZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29yaywgTz1WYWxpQ2VydCwgSW5jLiwgT1U9VmFsaUNlcnQgQ2xhc3MgMSBQb2xpY3kgVmFsaWRhdGlvbiBBdXRob3JpdHksIENOPWh0dHA6Ly93d3cudmFsaWNlcnQuY29tLy9FbWFpbD1pbmZvQHZhbGljZXJ0LmNvbQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogSnVuIDI1IDIyOjIzOjQ4IDE5OTkgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBKdW4gMjUgMjI6MjM6NDggMjAxOSBHTVQKKyAgICAgICAgU3ViamVjdDogTD1WYWxpQ2VydCBWYWxpZGF0aW9uIE5ldHdvcmssIE89VmFsaUNlcnQsIEluYy4sIE9VPVZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5LCBDTj1odHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8vRW1haWw9aW5mb0B2YWxpY2VydC5jb20KKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgxMDI0IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgxMDI0IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmQ4OjU5OjgyOjdhOjg5OmI4Ojk2OmJhOmE2OjJmOjY4OjZmOjU4OjJlOgorICAgICAgICAgICAgICAgICAgICBhNzo1NDoxYzowNjo2ZTpmNDplYTo4ZDo0ODpiYzozMTo5NDoxNzpmMDpmMzoKKyAgICAgICAgICAgICAgICAgICAgNGU6YmM6YjI6Yjg6MzU6OTI6NzY6YjA6ZDA6YTU6YTU6MDE6ZDc6MDA6MDM6CisgICAgICAgICAgICAgICAgICAgIDEyOjIyOjE5OjA4OmY4OmZmOjExOjIzOjliOmNlOjA3OmY1OmJmOjY5OjFhOgorICAgICAgICAgICAgICAgICAgICAyNjpmZTo0ZTplOTpkMTo3Zjo5ZDoyYzo0MDoxZDo1OTo2ODo2ZTphNjpmODoKKyAgICAgICAgICAgICAgICAgICAgNTg6YjA6OWQ6MWE6OGY6ZDM6M2Y6ZjE6ZGM6MTk6MDY6ODE6YTg6MGU6ZTA6CisgICAgICAgICAgICAgICAgICAgIDNhOmRkOmM4OjUzOjQ1OjA5OjA2OmU2OjBmOjcwOmMzOmZhOjQwOmE2OjBlOgorICAgICAgICAgICAgICAgICAgICBlMjo1NjowNTowZjoxODo0ZDpmYzoyMDo4MjpkMTo3Mzo1NTo3NDo4ZDo3NjoKKyAgICAgICAgICAgICAgICAgICAgNzI6YTA6MWQ6OWQ6MWQ6YzA6ZGQ6M2Y6NzEKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDUwOjY4OjNkOjQ5OmY0OjJjOjFjOjA2Ojk0OmRmOjk1OjYwOjdmOjk2OjdiOjE3OmZlOjRmOgorICAgICAgICA3MTphZDo2NDpjODpkZDo3NzpkMjplZjo1OTo1NTplODozZjplODo4ZTowNToyYToyMTpmMjoKKyAgICAgICAgMDc6ZDI6YjU6YTc6NTI6ZmU6OWM6YjE6YjY6ZTI6NWI6Nzc6MTc6NDA6ZWE6NzI6ZDY6MjM6CisgICAgICAgIGNiOjI4OjgxOjMyOmMzOjAwOjc5OjE4OmVjOjU5OjE3Ojg5OmM5OmM2OjZhOjFlOjcxOmM5OgorICAgICAgICBmZDpiNzo3NDphNToyNTo0NTo2OTpjNTo0ODphYjoxOTplMTo0NTo4YToyNTo2YjoxOTplZToKKyAgICAgICAgZTU6YmI6MTI6ZjU6N2Y6Zjc6YTY6OGQ6NTE6YzM6ZjA6OWQ6NzQ6Yjc6YTk6M2U6YTA6YTU6CisgICAgICAgIGZmOmI2OjQ5OjAzOjEzOmRhOjIyOmNjOmVkOjcxOjgyOjJiOjk5OmNmOjNhOmI3OmY1OjJkOgorICAgICAgICA3MjpjOAorCitWYWxpQ2VydCBDbGFzcyAyIFZBCis9PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IEE5OjIzOjc1OjlCOkJBOjQ5OjM2OjZFOjMxOkMyOkRCOkYyOkU3OjY2OkJBOjg3CitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQzV6Q0NBbEFDQVFFd0RRWUpLb1pJaHZjTkFRRUZCUUF3Z2JzeEpEQWlCZ05WQkFjVEcxWmhiR2xEWlhKMAorSUZaaGJHbGtZWFJwYjI0Z1RtVjBkMjl5YXpFWE1CVUdBMVVFQ2hNT1ZtRnNhVU5sY25Rc0lFbHVZeTR4TlRBegorQmdOVkJBc1RMRlpoYkdsRFpYSjBJRU5zWVhOeklESWdVRzlzYVdONUlGWmhiR2xrWVhScGIyNGdRWFYwYUc5eQorYVhSNU1TRXdId1lEVlFRREV4aG9kSFJ3T2k4dmQzZDNMblpoYkdsalpYSjBMbU52YlM4eElEQWVCZ2txaGtpRworOXcwQkNRRVdFV2x1Wm05QWRtRnNhV05sY25RdVkyOXRNQjRYRFRrNU1EWXlOakF3TVRrMU5Gb1hEVEU1TURZeQorTmpBd01UazFORm93Z2JzeEpEQWlCZ05WQkFjVEcxWmhiR2xEWlhKMElGWmhiR2xrWVhScGIyNGdUbVYwZDI5eQorYXpFWE1CVUdBMVVFQ2hNT1ZtRnNhVU5sY25Rc0lFbHVZeTR4TlRBekJnTlZCQXNUTEZaaGJHbERaWEowSUVOcworWVhOeklESWdVRzlzYVdONUlGWmhiR2xrWVhScGIyNGdRWFYwYUc5eWFYUjVNU0V3SHdZRFZRUURFeGhvZEhSdworT2k4dmQzZDNMblpoYkdsalpYSjBMbU52YlM4eElEQWVCZ2txaGtpRzl3MEJDUUVXRVdsdVptOUFkbUZzYVdObAorY25RdVkyOXRNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0JnUURPT25ISzVhdklXWkpWMTZ2WQorZEE3NTd0bjJWVWRaWlVjT0JWWGM2NWcyUEZ4VFhkTXd6empzdlVHSjdTVkNDU1JyQ2w2emZOMVNMVXptMU5aOQorV2xtcFpkUkpFeTBrVFJ4UWI3WEJoVlE3L25IazAxeEMrWURna1JvS1d6azJaL00vVlh3YlA3UmZaSE0wNDdRUwordjRkaytOb1MvemNud2JORHUrOTdiaTVwOXdJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0R0JBRHQvVUc5dgorVUpTWlNXSTRPQjlMK0tYSVBxZUNnZllyeCtqRnp1ZzZFSUxMR0FDT1RiMm9XSCtoZVFDMXUrbU5yMEhaRHpUdQorSVlFWm9ESkpLUFRFamxiVlVqUDlVTlYrbVd3RDVNbE0vTXRzcTJhelNpR001YlVNTWo0UXNzeHNvZHlhbUV3QworVy9QT3VaNmxjZzVLdHo4ODVoWm8rTDd0ZEV5OFc5VmlIMFBkCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAxICgweDApCisgICAgICAgIFNlcmlhbCBOdW1iZXI6IDEgKDB4MSkKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogTD1WYWxpQ2VydCBWYWxpZGF0aW9uIE5ldHdvcmssIE89VmFsaUNlcnQsIEluYy4sIE9VPVZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5LCBDTj1odHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8vRW1haWw9aW5mb0B2YWxpY2VydC5jb20KKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IEp1biAyNiAwMDoxOTo1NCAxOTk5IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogSnVuIDI2IDAwOjE5OjU0IDIwMTkgR01UCisgICAgICAgIFN1YmplY3Q6IEw9VmFsaUNlcnQgVmFsaWRhdGlvbiBOZXR3b3JrLCBPPVZhbGlDZXJ0LCBJbmMuLCBPVT1WYWxpQ2VydCBDbGFzcyAyIFBvbGljeSBWYWxpZGF0aW9uIEF1dGhvcml0eSwgQ049aHR0cDovL3d3dy52YWxpY2VydC5jb20vL0VtYWlsPWluZm9AdmFsaWNlcnQuY29tCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpjZTozYTo3MTpjYTplNTphYjpjODo1OTo5Mjo1NTpkNzphYjpkODo3NDoKKyAgICAgICAgICAgICAgICAgICAgMGU6Zjk6ZWU6ZDk6ZjY6NTU6NDc6NTk6NjU6NDc6MGU6MDU6NTU6ZGM6ZWI6CisgICAgICAgICAgICAgICAgICAgIDk4OjM2OjNjOjVjOjUzOjVkOmQzOjMwOmNmOjM4OmVjOmJkOjQxOjg5OmVkOgorICAgICAgICAgICAgICAgICAgICAyNTo0MjowOToyNDo2YjowYTo1ZTpiMzo3YzpkZDo1MjoyZDo0YzplNjpkNDoKKyAgICAgICAgICAgICAgICAgICAgZDY6N2Q6NWE6NTk6YTk6NjU6ZDQ6NDk6MTM6MmQ6MjQ6NGQ6MWM6NTA6NmY6CisgICAgICAgICAgICAgICAgICAgIGI1OmMxOjg1OjU0OjNiOmZlOjcxOmU0OmQzOjVjOjQyOmY5OjgwOmUwOjkxOgorICAgICAgICAgICAgICAgICAgICAxYTowYTo1YjozOTozNjo2NzpmMzozZjo1NTo3YzoxYjozZjpiNDo1Zjo2NDoKKyAgICAgICAgICAgICAgICAgICAgNzM6MzQ6ZTM6YjQ6MTI6YmY6ODc6NjQ6Zjg6ZGE6MTI6ZmY6Mzc6Mjc6YzE6CisgICAgICAgICAgICAgICAgICAgIGIzOjQzOmJiOmVmOjdiOjZlOjJlOjY5OmY3CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICAzYjo3Zjo1MDo2Zjo2Zjo1MDo5NDo5OTo0OTo2MjozODozODoxZjo0YjpmODphNTpjODozZToKKyAgICAgICAgYTc6ODI6ODE6ZjY6MmI6Yzc6ZTg6YzU6Y2U6ZTg6M2E6MTA6ODI6Y2I6MTg6MDA6OGU6NGQ6CisgICAgICAgIGJkOmE4OjU4OjdmOmExOjc5OjAwOmI1OmJiOmU5OjhkOmFmOjQxOmQ5OjBmOjM0OmVlOjIxOgorICAgICAgICA4MToxOTphMDozMjo0OToyODpmNDpjNDo4ZTo1NjpkNTo1MjozMzpmZDo1MDpkNTo3ZTo5OToKKyAgICAgICAgNmM6MDM6ZTQ6Yzk6NGM6ZmM6Y2I6NmM6YWI6NjY6YjM6NGE6MjE6OGM6ZTU6YjU6MGM6MzI6CisgICAgICAgIDNlOjEwOmIyOmNjOjZjOmExOmRjOjlhOjk4OjRjOjAyOjViOmYzOmNlOmI5OjllOmE1OjcyOgorICAgICAgICAwZTo0YTpiNzozZjozYzplNjoxNjo2ODpmODpiZTplZDo3NDo0YzpiYzo1YjpkNTo2MjoxZjoKKyAgICAgICAgNDM6ZGQKKworVmFsaUNlcnQgQ2xhc3MgMyBWQQorPT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiBBMjo2Rjo1MzpCNzpFRTo0MDpEQjo0QTo2ODpFNzpGQToxODpEOToxMDo0Qjo3MgorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUM1ekNDQWxBQ0FRRXdEUVlKS29aSWh2Y05BUUVGQlFBd2dic3hKREFpQmdOVkJBY1RHMVpoYkdsRFpYSjAKK0lGWmhiR2xrWVhScGIyNGdUbVYwZDI5eWF6RVhNQlVHQTFVRUNoTU9WbUZzYVVObGNuUXNJRWx1WXk0eE5UQXoKK0JnTlZCQXNUTEZaaGJHbERaWEowSUVOc1lYTnpJRE1nVUc5c2FXTjVJRlpoYkdsa1lYUnBiMjRnUVhWMGFHOXkKK2FYUjVNU0V3SHdZRFZRUURFeGhvZEhSd09pOHZkM2QzTG5aaGJHbGpaWEowTG1OdmJTOHhJREFlQmdrcWhraUcKKzl3MEJDUUVXRVdsdVptOUFkbUZzYVdObGNuUXVZMjl0TUI0WERUazVNRFl5TmpBd01qSXpNMW9YRFRFNU1EWXkKK05qQXdNakl6TTFvd2dic3hKREFpQmdOVkJBY1RHMVpoYkdsRFpYSjBJRlpoYkdsa1lYUnBiMjRnVG1WMGQyOXkKK2F6RVhNQlVHQTFVRUNoTU9WbUZzYVVObGNuUXNJRWx1WXk0eE5UQXpCZ05WQkFzVExGWmhiR2xEWlhKMElFTnMKK1lYTnpJRE1nVUc5c2FXTjVJRlpoYkdsa1lYUnBiMjRnUVhWMGFHOXlhWFI1TVNFd0h3WURWUVFERXhob2RIUncKK09pOHZkM2QzTG5aaGJHbGpaWEowTG1OdmJTOHhJREFlQmdrcWhraUc5dzBCQ1FFV0VXbHVabTlBZG1Gc2FXTmwKK2NuUXVZMjl0TUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FEam1GR1dIT2pWc1FhQmFsZkQKK2NuV1RxOCtlcHZ6ekZsTFdMVTJmTlVTb0xnUk5CMG1LT0NuMWR6Zm50NnRkM3paeEZKbVAzTUtTOGVkZ2twZnMKKzJFamN2OEVDSU1Za3BDaE1NRnAyYmJGYzg5M2VuaEJ4b1lqSFc1dEJiY3F3dUk0VjdxMHpLODlIQkZ4MWNRcVkKK0pKZ3BwMGxacGQzNHQwTmlZZlBUNHRCVlB3SURBUUFCTUEwR0NTcUdTSWIzRFFFQkJRVUFBNEdCQUZhN0FsaUUKK1p3Z3MzeC9iZTBrejlkTm5uZlMwQ2hDenljVXM0cEpxY1hnbjhuQ0RRdE0rejZsVTlQSFlraGFNMFFUTFM2dkoKK24wV3VQSXFwc0hFelhjakZWOSt2cURXemY0bUg2ZWdsa3JoL2hYcXUxcndlTjFncVo4bVJ6eXFCUHUzR09kL0EKK1BobWNHY3dUVFlKQnRZemU0RDFnQ0NBUFJYNXJvbitqakJYdQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMSAoMHgwKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiAxICgweDEpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEw9VmFsaUNlcnQgVmFsaWRhdGlvbiBOZXR3b3JrLCBPPVZhbGlDZXJ0LCBJbmMuLCBPVT1WYWxpQ2VydCBDbGFzcyAzIFBvbGljeSBWYWxpZGF0aW9uIEF1dGhvcml0eSwgQ049aHR0cDovL3d3dy52YWxpY2VydC5jb20vL0VtYWlsPWluZm9AdmFsaWNlcnQuY29tCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBKdW4gMjYgMDA6MjI6MzMgMTk5OSBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEp1biAyNiAwMDoyMjozMyAyMDE5IEdNVAorICAgICAgICBTdWJqZWN0OiBMPVZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29yaywgTz1WYWxpQ2VydCwgSW5jLiwgT1U9VmFsaUNlcnQgQ2xhc3MgMyBQb2xpY3kgVmFsaWRhdGlvbiBBdXRob3JpdHksIENOPWh0dHA6Ly93d3cudmFsaWNlcnQuY29tLy9FbWFpbD1pbmZvQHZhbGljZXJ0LmNvbQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6ZTM6OTg6NTE6OTY6MWM6ZTg6ZDU6YjE6MDY6ODE6NmE6NTc6YzM6NzI6CisgICAgICAgICAgICAgICAgICAgIDc1OjkzOmFiOmNmOjllOmE2OmZjOmYzOjE2OjUyOmQ2OjJkOjRkOjlmOjM1OgorICAgICAgICAgICAgICAgICAgICA0NDphODoyZTowNDo0ZDowNzo0OTo4YTozODoyOTpmNTo3NzozNzplNzpiNzoKKyAgICAgICAgICAgICAgICAgICAgYWI6NWQ6ZGY6MzY6NzE6MTQ6OTk6OGY6ZGM6YzI6OTI6ZjE6ZTc6NjA6OTI6CisgICAgICAgICAgICAgICAgICAgIDk3OmVjOmQ4OjQ4OmRjOmJmOmMxOjAyOjIwOmM2OjI0OmE0OjI4OjRjOjMwOgorICAgICAgICAgICAgICAgICAgICA1YTo3Njo2ZDpiMTo1YzpmMzpkZDpkZTo5ZToxMDo3MTphMTo4ODpjNzo1YjoKKyAgICAgICAgICAgICAgICAgICAgOWI6NDE6NmQ6Y2E6YjA6Yjg6OGU6MTU6ZWU6YWQ6MzM6MmI6Y2Y6NDc6MDQ6CisgICAgICAgICAgICAgICAgICAgIDVjOjc1OjcxOjBhOjk4OjI0Ojk4OjI5OmE3OjQ5OjU5OmE1OmRkOmY4OmI3OgorICAgICAgICAgICAgICAgICAgICA0Mzo2Mjo2MTpmMzpkMzplMjpkMDo1NTozZgorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgNTY6YmI6MDI6NTg6ODQ6Njc6MDg6MmM6ZGY6MWY6ZGI6N2I6NDk6MzM6ZjU6ZDM6Njc6OWQ6CisgICAgICAgIGY0OmI0OjBhOjEwOmIzOmM5OmM1OjJjOmUyOjkyOjZhOjcxOjc4OjI3OmYyOjcwOjgzOjQyOgorICAgICAgICBkMzozZTpjZjphOTo1NDpmNDpmMTpkODo5MjoxNjo4YzpkMTowNDpjYjo0YjphYjpjOTo5ZjoKKyAgICAgICAgNDU6YWU6M2M6OGE6YTk6YjA6NzE6MzM6NWQ6Yzg6YzU6NTc6ZGY6YWY6YTg6MzU6YjM6N2Y6CisgICAgICAgIDg5Ojg3OmU5OmU4OjI1OjkyOmI4OjdmOjg1OjdhOmFlOmQ2OmJjOjFlOjM3OjU4OjJhOjY3OgorICAgICAgICBjOTo5MTpjZjoyYTo4MTozZTplZDpjNjozOTpkZjpjMDozZToxOTo5YzoxOTpjYzoxMzo0ZDoKKyAgICAgICAgODI6NDE6YjU6OGM6ZGU6ZTA6M2Q6NjA6MDg6MjA6MGY6NDU6N2U6NmI6YTI6N2Y6YTM6OGM6CisgICAgICAgIDE1OmVlCisKK1ZlcmlTaWduIENsYXNzIDQgUHJpbWFyeSBDQQorPT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IDFCOkQxOkFEOjE3OjhCOjdGOjIyOjEzOjI0OkY1OjI2OkUyOjVEOjRFOkI5OjEwCitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQ01UQ0NBWm9DQlFLbUFBQUJNQTBHQ1NxR1NJYjNEUUVCQWdVQU1GOHhDekFKQmdOVkJBWVRBbFZUTVJjdworRlFZRFZRUUtFdzVXWlhKcFUybG5iaXdnU1c1akxqRTNNRFVHQTFVRUN4TXVRMnhoYzNNZ05DQlFkV0pzYVdNZworVUhKcGJXRnllU0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzA1TmpBeE1qa3dNREF3TURCYQorRncwNU9URXlNekV5TXpVNU5UbGFNRjh4Q3pBSkJnTlZCQVlUQWxWVE1SY3dGUVlEVlFRS0V3NVdaWEpwVTJsbgorYml3Z1NXNWpMakUzTURVR0ExVUVDeE11UTJ4aGMzTWdOQ0JRZFdKc2FXTWdVSEpwYldGeWVTQkRaWEowYVdacAorWTJGMGFXOXVJRUYxZEdodmNtbDBlVENCbnpBTkJna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBMExKMQorOW5qUXJscFE5T2xRcVorTTErK1JsSERvMGlTUWRvbUYxdCtzNWdFWE1vRHduWk5IdkpwbG5SK1hyci9waG5WagorSUltOWdGaWRCQXlkcU1FazZRdmxNWGk5L0MwTU4ycWVlSURwUm5YNTdhUDdFM3ZJd1V6U28rLzFQTEJpajBwZAorTzkyVlo0OFR1Y0U4MXFjbW0rekRPM3JaVGJ4dG0rZ1ZBZVB3UjZrQ0F3RUFBVEFOQmdrcWhraUc5dzBCQVFJRgorQUFPQmdRQlQzZFB3bkNSK1FLcmkvQUFhMTlvTS9ESmh1QlVObHZQNlZ4dC9NM3l2NlppYVljaDZzN2Yvc2R5WgorZzl5c0V2eHd5Ujg0UXUxRTlvQXVXMnN6YWF5YzAxem5YMW9ZeDdFdGVRU1dRWkdaUWJFOERicUVPY1k3bC9BbQoreVk3dXZjeENsZjhleHdJL1ZBeDQ5YnlxWUh3Q2FlamNyT0lDZG1IRVBnUHEwb29rMFE9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMSAoMHgwKQorICAgICAgICBTZXJpYWwgTnVtYmVyOgorICAgICAgICAgICAgMDI6YTY6MDA6MDA6MDEKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQyV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBPPVZlcmlTaWduLCBJbmMuLCBPVT1DbGFzcyA0IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBKYW4gMjkgMDA6MDA6MDAgMTk5NiBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IERlYyAzMSAyMzo1OTo1OSAxOTk5IEdNVAorICAgICAgICBTdWJqZWN0OiBDPVVTLCBPPVZlcmlTaWduLCBJbmMuLCBPVT1DbGFzcyA0IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpkMDpiMjo3NTpmNjo3ODpkMDphZTo1YTo1MDpmNDplOTo1MDphOTo5ZjoKKyAgICAgICAgICAgICAgICAgICAgOGM6ZDc6ZWY6OTE6OTQ6NzA6ZTg6ZDI6MjQ6OTA6NzY6ODk6ODU6ZDY6ZGY6CisgICAgICAgICAgICAgICAgICAgIGFjOmU2OjAxOjE3OjMyOjgwOmYwOjlkOjkzOjQ3OmJjOjlhOjY1OjlkOjFmOgorICAgICAgICAgICAgICAgICAgICA5NzphZTpiZjplOTo4Njo3NTo2MzoyMDo4OTpiZDo4MDo1ODo5ZDowNDowYzoKKyAgICAgICAgICAgICAgICAgICAgOWQ6YTg6YzE6MjQ6ZTk6MGI6ZTU6MzE6Nzg6YmQ6ZmM6MmQ6MGM6Mzc6NmE6CisgICAgICAgICAgICAgICAgICAgIDllOjc4OjgwOmU5OjQ2Ojc1OmY5OmVkOmEzOmZiOjEzOjdiOmM4OmMxOjRjOgorICAgICAgICAgICAgICAgICAgICBkMjphMzplZjpmNTozYzpiMDo2Mjo4Zjo0YTo1ZDozYjpkZDo5NTo2Nzo4ZjoKKyAgICAgICAgICAgICAgICAgICAgMTM6Yjk6YzE6M2M6ZDY6YTc6MjY6OWI6ZWM6YzM6M2I6N2E6ZDk6NGQ6YmM6CisgICAgICAgICAgICAgICAgICAgIDZkOjliOmU4OjE1OjAxOmUzOmYwOjQ3OmE5CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kMldpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDUzOmRkOmQzOmYwOjljOjI0OjdlOjQwOmFhOmUyOmZjOjAwOjFhOmQ3OmRhOjBjOmZjOjMyOgorICAgICAgICA2MTpiODoxNTowZDo5NjpmMzpmYTo1NzoxYjo3ZjozMzo3YzphZjplOTo5ODo5YTo2MTpjODoKKyAgICAgICAgN2E6YjM6Yjc6ZmY6YjE6ZGM6OTk6ODM6ZGM6YWM6MTI6ZmM6NzA6Yzk6MWY6Mzg6NDI6ZWQ6CisgICAgICAgIDQ0OmY2OjgwOjJlOjViOjZiOjMzOjY5OmFjOjljOmQzOjVjOmU3OjVmOjVhOjE4OmM3OmIxOgorICAgICAgICAyZDo3OTowNDo5Njo0MTo5MTo5OTo0MTpiMTozYzowZDpiYTo4NDozOTpjNjozYjo5NzpmMDoKKyAgICAgICAgMjY6Yzk6OGU6ZWU6YmQ6Y2M6NDI6OTU6ZmY6MWU6Yzc6MDI6M2Y6NTQ6MGM6Nzg6ZjU6YmM6CisgICAgICAgIGFhOjYwOjdjOjAyOjY5OmU4OmRjOmFjOmUyOjAyOjc2OjYxOmM0OjNlOjAzOmVhOmQyOjhhOgorICAgICAgICAyNDpkMQorCitWZXJpc2lnbiBDbGFzcyAxIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IDk3OjYwOkU4OjU3OjVGOkQzOjUwOjQ3OkU1OjQzOjBDOjk0OjM2OjhBOkIwOjYyCitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQ1BUQ0NBYVlDRVFETnVuOVc4Ti9rdkZUK0lxeXpjcXBWTUEwR0NTcUdTSWIzRFFFQkFnVUFNRjh4Q3pBSgorQmdOVkJBWVRBbFZUTVJjd0ZRWURWUVFLRXc1V1pYSnBVMmxuYml3Z1NXNWpMakUzTURVR0ExVUVDeE11UTJ4aAorYzNNZ01TQlFkV0pzYVdNZ1VISnBiV0Z5ZVNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFlRncwNQorTmpBeE1qa3dNREF3TURCYUZ3MHlPREE0TURFeU16VTVOVGxhTUY4eEN6QUpCZ05WQkFZVEFsVlRNUmN3RlFZRAorVlFRS0V3NVdaWEpwVTJsbmJpd2dTVzVqTGpFM01EVUdBMVVFQ3hNdVEyeGhjM01nTVNCUWRXSnNhV01nVUhKcAorYldGeWVTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRDQm56QU5CZ2txaGtpRzl3MEJBUUVGQUFPQgoralFBd2dZa0NnWUVBNVJtL2JhTldZUzJaU0hIMlo5NjVqZXUzbm9hQUNwRU8ramdscjBhSWd1VnpxS0NiSkYwTgorSDh4bGJneXcwRmFFR0llYUJwc1FvWFBmdEZnNWEyN0I5aFhWcUtnL3FoSUdqVEdzZjdBMDE0ODBaNGdKelJRUgorNGs1RlZta2ZlQUtBMnR4SGtTbTdOc2xqWE1YZzF5MkhlNkczTXJCN01Mb3FMekdxN3FObjJ0c0NBd0VBQVRBTgorQmdrcWhraUc5dzBCQVFJRkFBT0JnUUJNUDdpTHhtamY3a016RGwzcHBzc0hoRTE2TS8rU0cvUTJyZGlWSWpabworRVd4OFFzenpuQzdFQno4VXNBOVAvNUNTZHZuaXZFcnBqODJnZ0FyM3hTbnhnaUpkdUxIZGdTT2pleVVWUmpCNQorRnZqcUJVdVVmeDNDSE1qanQvUVFRRHdUdzE4ZlUraEk1SWEwZTZFMXNIc2x1cmpUanFzL09KMEFOQUNZODlGeAorbEE9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMSAoMHgwKQorICAgICAgICBTZXJpYWwgTnVtYmVyOgorICAgICAgICAgICAgY2Q6YmE6N2Y6NTY6ZjA6ZGY6ZTQ6YmM6NTQ6ZmU6MjI6YWM6YjM6NzI6YWE6NTUKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQyV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBPPVZlcmlTaWduLCBJbmMuLCBPVT1DbGFzcyAxIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBKYW4gMjkgMDA6MDA6MDAgMTk5NiBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEF1ZyAgMSAyMzo1OTo1OSAyMDI4IEdNVAorICAgICAgICBTdWJqZWN0OiBDPVVTLCBPPVZlcmlTaWduLCBJbmMuLCBPVT1DbGFzcyAxIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDplNToxOTpiZjo2ZDphMzo1Njo2MToyZDo5OTo0ODo3MTpmNjo2NzpkZToKKyAgICAgICAgICAgICAgICAgICAgYjk6OGQ6ZWI6Yjc6OWU6ODY6ODA6MGE6OTE6MGU6ZmE6Mzg6MjU6YWY6NDY6CisgICAgICAgICAgICAgICAgICAgIDg4OjgyOmU1OjczOmE4OmEwOjliOjI0OjVkOjBkOjFmOmNjOjY1OjZlOjBjOgorICAgICAgICAgICAgICAgICAgICBiMDpkMDo1Njo4NDoxODo4Nzo5YTowNjo5YjoxMDphMTo3MzpkZjpiNDo1ODoKKyAgICAgICAgICAgICAgICAgICAgMzk6NmI6NmU6YzE6ZjY6MTU6ZDU6YTg6YTg6M2Y6YWE6MTI6MDY6OGQ6MzE6CisgICAgICAgICAgICAgICAgICAgIGFjOjdmOmIwOjM0OmQ3OjhmOjM0OjY3Ojg4OjA5OmNkOjE0OjExOmUyOjRlOgorICAgICAgICAgICAgICAgICAgICA0NTo1Njo2OToxZjo3ODowMjo4MDpkYTpkYzo0Nzo5MToyOTpiYjozNjpjOToKKyAgICAgICAgICAgICAgICAgICAgNjM6NWM6YzU6ZTA6ZDc6MmQ6ODc6N2I6YTE6Yjc6MzI6YjA6N2I6MzA6YmE6CisgICAgICAgICAgICAgICAgICAgIDJhOjJmOjMxOmFhOmVlOmEzOjY3OmRhOmRiCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kMldpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDRjOjNmOmI4OjhiOmM2OjY4OmRmOmVlOjQzOjMzOjBlOjVkOmU5OmE2OmNiOjA3Ojg0OjRkOgorICAgICAgICA3YTozMzpmZjo5MjoxYjpmNDozNjphZDpkODo5NToyMjozNjo2ODoxMTo2Yzo3Yzo0MjpjYzoKKyAgICAgICAgZjM6OWM6MmU6YzQ6MDc6M2Y6MTQ6YjA6MGY6NGY6ZmY6OTA6OTI6NzY6Zjk6ZTI6YmM6NGE6CisgICAgICAgIGU5OjhmOmNkOmEwOjgwOjBhOmY3OmM1OjI5OmYxOjgyOjIyOjVkOmI4OmIxOmRkOjgxOjIzOgorICAgICAgICBhMzo3YjoyNToxNTo0NjozMDo3OToxNjpmODplYTowNTo0Yjo5NDo3ZjoxZDpjMjoxYzpjODoKKyAgICAgICAgZTM6Yjc6ZjQ6MTA6NDA6M2M6MTM6YzM6NWY6MWY6NTM6ZTg6NDg6ZTQ6ODY6YjQ6N2I6YTE6CisgICAgICAgIDM1OmIwOjdiOjI1OmJhOmI4OmQzOjhlOmFiOjNmOjM4OjlkOjAwOjM0OjAwOjk4OmYzOmQxOgorICAgICAgICA3MTo5NAorCitWZXJpc2lnbiBDbGFzcyAxIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiBGMjo3RDpFOTo1NDpFNDpBMzoyMjowRDo3Njo5RjpFNzowQjpCQjpCMzoyNDoyQgorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURBakNDQW1zQ0VEbktWSW4rVUNJeS9qTFoyL3NiaEJrd0RRWUpLb1pJaHZjTkFRRUZCUUF3Z2NFeEN6QUoKK0JnTlZCQVlUQWxWVE1SY3dGUVlEVlFRS0V3NVdaWEpwVTJsbmJpd2dTVzVqTGpFOE1Eb0dBMVVFQ3hNelEyeGgKK2MzTWdNU0JRZFdKc2FXTWdVSEpwYldGeWVTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVNBdElFY3kKK01Ub3dPQVlEVlFRTEV6RW9ZeWtnTVRrNU9DQldaWEpwVTJsbmJpd2dTVzVqTGlBdElFWnZjaUJoZFhSb2IzSnAKK2VtVmtJSFZ6WlNCdmJteDVNUjh3SFFZRFZRUUxFeFpXWlhKcFUybG5iaUJVY25WemRDQk9aWFIzYjNKck1CNFgKK0RUazRNRFV4T0RBd01EQXdNRm9YRFRFNE1EVXhPREl6TlRrMU9Wb3dnY0V4Q3pBSkJnTlZCQVlUQWxWVE1SY3cKK0ZRWURWUVFLRXc1V1pYSnBVMmxuYml3Z1NXNWpMakU4TURvR0ExVUVDeE16UTJ4aGMzTWdNU0JRZFdKc2FXTWcKK1VISnBiV0Z5ZVNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlU0F0SUVjeU1Ub3dPQVlEVlFRTEV6RW8KK1l5a2dNVGs1T0NCV1pYSnBVMmxuYml3Z1NXNWpMaUF0SUVadmNpQmhkWFJvYjNKcGVtVmtJSFZ6WlNCdmJteDUKK01SOHdIUVlEVlFRTEV4WldaWEpwVTJsbmJpQlVjblZ6ZENCT1pYUjNiM0pyTUlHZk1BMEdDU3FHU0liM0RRRUIKK0FRVUFBNEdOQURDQmlRS0JnUUNxMExxK0ZpMjRnOVRLMGcrOGRqSEtsTmdkazR4V0FyelpieHB2VWpadWRWWUsKK1ZkUGZRNGNoRVdXS2ZvKzlJZDVyTWo4YmhEU1ZCWjFCTmV1UzY1YmRxbGsvQVZOdG1VL3Q1ZUlxV3BEQnVjU20KK0ZjL0lSZXVtWFk2Y1B2QmtKSGFsemFzYWI3YlllMUZoYnFaL2g4aml0K1UwM0VHSTZnbEF2bk9TUFd2bmRRSUQKK0FRQUJNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0R0JBSXYzR2hET2Rsd0hxNE9aM0JlQWJ6UTVYWmcrYTNJczRjZWkKK2UwQXB1WGlJdWt6Rm8ycGVubTU3NC9JQ1FReG12cTM3cnFJVXpwTHpvalNMdExLMkpQTGwxZURJNVdKdGhIdkwKK3Zyc0RpM3hYeXZBM3FaQ3ZpdTREdmgwb25Oa21kcUROeEoxTzhLNEhGdFcrcjFjSWF0Q2dRa0pDSHZRZ3pLVjQKK2dwVW1PSXBICistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAxICgweDApCisgICAgICAgIFNlcmlhbCBOdW1iZXI6CisgICAgICAgICAgICAzOTpjYTo1NDo4OTpmZTo1MDoyMjozMjpmZTozMjpkOTpkYjpmYjoxYjo4NDoxOQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBPPVZlcmlTaWduLCBJbmMuLCBPVT1DbGFzcyAxIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIsIE9VPShjKSAxOTk4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHksIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IE1heSAxOCAwMDowMDowMCAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogTWF5IDE4IDIzOjU5OjU5IDIwMTggR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89VmVyaVNpZ24sIEluYy4sIE9VPUNsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMiwgT1U9KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seSwgT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yaworICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6YWE6ZDA6YmE6YmU6MTY6MmQ6Yjg6ODM6ZDQ6Y2E6ZDI6MGY6YmM6NzY6CisgICAgICAgICAgICAgICAgICAgIDMxOmNhOjk0OmQ4OjFkOjkzOjhjOjU2OjAyOmJjOmQ5OjZmOjFhOjZmOjUyOgorICAgICAgICAgICAgICAgICAgICAzNjo2ZTo3NTo1NjowYTo1NTpkMzpkZjo0Mzo4NzoyMToxMTo2NTo4YTo3ZToKKyAgICAgICAgICAgICAgICAgICAgOGY6YmQ6MjE6ZGU6NmI6MzI6M2Y6MWI6ODQ6MzQ6OTU6MDU6OWQ6NDE6MzU6CisgICAgICAgICAgICAgICAgICAgIGViOjkyOmViOjk2OmRkOmFhOjU5OjNmOjAxOjUzOjZkOjk5OjRmOmVkOmU1OgorICAgICAgICAgICAgICAgICAgICBlMjoyYTo1YTo5MDpjMTpiOTpjNDphNjoxNTpjZjpjODo0NTplYjphNjo1ZDoKKyAgICAgICAgICAgICAgICAgICAgOGU6OWM6M2U6ZjA6NjQ6MjQ6NzY6YTU6Y2Q6YWI6MWE6NmY6YjY6ZDg6N2I6CisgICAgICAgICAgICAgICAgICAgIDUxOjYxOjZlOmE2OjdmOjg3OmM4OmUyOmI3OmU1OjM0OmRjOjQxOjg4OmVhOgorICAgICAgICAgICAgICAgICAgICAwOTo0MDpiZTo3Mzo5MjozZDo2YjplNzo3NQorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgOGI6Zjc6MWE6MTA6Y2U6NzY6NWM6MDc6YWI6ODM6OTk6ZGM6MTc6ODA6NmY6MzQ6Mzk6NWQ6CisgICAgICAgIDk4OjNlOjZiOjcyOjJjOmUxOmM3OmEyOjdiOjQwOjI5OmI5Ojc4Ojg4OmJhOjRjOmM1OmEzOgorICAgICAgICA2YTo1ZTo5ZTo2ZTo3YjplMzpmMjowMjo0MTowYzo2NjpiZTphZDpmYjphZTphMjoxNDpjZToKKyAgICAgICAgOTI6ZjM6YTI6MzQ6OGI6YjQ6YjI6YjY6MjQ6ZjI6ZTU6ZDU6ZTA6Yzg6ZTU6NjI6NmQ6ODQ6CisgICAgICAgIDdiOmNiOmJlOmJiOjAzOjhiOjdjOjU3OmNhOmYwOjM3OmE5OjkwOmFmOjhhOmVlOjAzOmJlOgorICAgICAgICAxZDoyODo5YzpkOToyNjo3NjphMDpjZDpjNDo5ZDo0ZTpmMDphZTowNzoxNjpkNTpiZTphZjoKKyAgICAgICAgNTc6MDg6NmE6ZDA6YTA6NDI6NDI6NDI6MWU6ZjQ6MjA6Y2M6YTU6Nzg6ODI6OTU6MjY6Mzg6CisgICAgICAgIDhhOjQ3CisKK1ZlcmlzaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IEIxOjQ3OkJDOjE4OjU3OkQxOjE4OkEwOjc4OjJEOkVDOjcxOkU4OjJBOjk1OjczCitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRUdqQ0NBd0lDRVFDTFczVldoRlNGQ3dEUHJ6aEl6ckdrTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUhLTVFzdworQ1FZRFZRUUdFd0pWVXpFWE1CVUdBMVVFQ2hNT1ZtVnlhVk5wWjI0c0lFbHVZeTR4SHpBZEJnTlZCQXNURmxabAorY21sVGFXZHVJRlJ5ZFhOMElFNWxkSGR2Y21zeE9qQTRCZ05WQkFzVE1TaGpLU0F4T1RrNUlGWmxjbWxUYVdkdQorTENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hSVEJEQmdOVkJBTVRQRlpsY21sVAorYVdkdUlFTnNZWE56SURFZ1VIVmliR2xqSUZCeWFXMWhjbmtnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcAorZEhrZ0xTQkhNekFlRncwNU9URXdNREV3TURBd01EQmFGdzB6TmpBM01UWXlNelU1TlRsYU1JSEtNUXN3Q1FZRAorVlFRR0V3SlZVekVYTUJVR0ExVUVDaE1PVm1WeWFWTnBaMjRzSUVsdVl5NHhIekFkQmdOVkJBc1RGbFpsY21sVAorYVdkdUlGUnlkWE4wSUU1bGRIZHZjbXN4T2pBNEJnTlZCQXNUTVNoaktTQXhPVGs1SUZabGNtbFRhV2R1TENCSgorYm1NdUlDMGdSbTl5SUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreFJUQkRCZ05WQkFNVFBGWmxjbWxUYVdkdQorSUVOc1lYTnpJREVnVUhWaWJHbGpJRkJ5YVcxaGNua2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZworTFNCSE16Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU4yRTFMbTArYWZZOHdSNAorbk40OTNHd1RGdGw2M1NSUlpzREhKbGtOckFZSXdwVFJNeC93Z3pVZmJodkkzcXB1RlU1VUorL0ViUnJzQytNTworOEVTbFY4ZEFXQjZqUng5eDdHRDJiWlRJR0RudC9rSVlWdC9rVEVrUWVFNEJkalZqRWpiZFpyd0JCRGFqVldqVgorb2pZSnJLc2hKbFFHclQvS0ZPQ3N5cTBHSFpYaStKM3g0R0Qvd245MUswek0ydjZIbVNIcXV2NCtWTmZTV1hqYgorUEc3UG9CTUFHcmdub2VTK1o1YktvTVd6bk4zSmRaN3JNSnBmbzgzWnJuZ1pQeVBwWE5zcHZhMVZ5QnRVakdQMgorNkticXh6Y1NYS01wSGdMWjJ4ODd0TmNQVmtlQkZRUktyNE1uMGNWWWlNSGQ5cXFub3hqYWFLcHRFVkhodjJWcgorbjVaMjBUMENBd0VBQVRBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQXEyYU4xN082eDVxMjVsWFFCZkdmTVkxYQorcXRtcVJpWVBjZTJsclZOV1lnRkhLa1RwL2o5MEN4T2J1ZlJORzdMUlg3SzIwb2hjczUvTnk5U24yV0NWaERyNAord1RjZFljcm5zTVhsa2RwVXBxd3hnYTZYM3MwSXJMakFsNEIvYm5LazUya1RsV1VmeEpNOC9YbVBCTlErVCtyMworbnM3TlozeFBaUUwva1lWVWM4Zi9OdmVHTGV6UVhrLy9FWjl5QnRhNEd2Rk1EU1psNGtTQUhzZWY0OTNvQ3RycworcFNDQWFXaWhUMzdoYTg4SFFmcURqcnc0M2JBdUViRnJza0xNbXJ6NVNDSjVTaGtQc2h3K0lIVFphc08rOGloNAorRTFaNVQyMVE2aHV3dFZleE4yWllJL1BjRDk4S2g4VHZoZ1hWT0JSZ21hTkwzZ2FXY1N6eTI3WWZwTzgvN2c9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMSAoMHgwKQorICAgICAgICBTZXJpYWwgTnVtYmVyOgorICAgICAgICAgICAgOGI6NWI6NzU6NTY6ODQ6NTQ6ODU6MGI6MDA6Y2Y6YWY6Mzg6NDg6Y2U6YjE6YTQKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1VUywgTz1WZXJpU2lnbiwgSW5jLiwgT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yaywgT1U9KGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seSwgQ049VmVyaVNpZ24gQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBPY3QgIDEgMDA6MDA6MDAgMTk5OSBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEp1bCAxNiAyMzo1OTo1OSAyMDM2IEdNVAorICAgICAgICBTdWJqZWN0OiBDPVVTLCBPPVZlcmlTaWduLCBJbmMuLCBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrLCBPVT0oYykgMTk5OSBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5LCBDTj1WZXJpU2lnbiBDbGFzcyAxIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzMKKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgyMDQ4IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgyMDQ4IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmRkOjg0OmQ0OmI5OmI0OmY5OmE3OmQ4OmYzOjA0Ojc4OjljOmRlOjNkOgorICAgICAgICAgICAgICAgICAgICBkYzo2YzoxMzoxNjpkOTo3YTpkZDoyNDo1MTo2NjpjMDpjNzoyNjo1OTowZDoKKyAgICAgICAgICAgICAgICAgICAgYWM6MDY6MDg6YzI6OTQ6ZDE6MzM6MWY6ZjA6ODM6MzU6MWY6NmU6MWI6Yzg6CisgICAgICAgICAgICAgICAgICAgIGRlOmFhOjZlOjE1OjRlOjU0OjI3OmVmOmM0OjZkOjFhOmVjOjBiOmUzOjBlOgorICAgICAgICAgICAgICAgICAgICBmMDo0NDphNTo1NzpjNzo0MDo1ODoxZTphMzo0NzoxZjo3MTplYzo2MDpmNjoKKyAgICAgICAgICAgICAgICAgICAgNmQ6OTQ6Yzg6MTg6Mzk6ZWQ6ZmU6NDI6MTg6NTY6ZGY6ZTQ6NGM6NDk6MTA6CisgICAgICAgICAgICAgICAgICAgIDc4OjRlOjAxOjc2OjM1OjYzOjEyOjM2OmRkOjY2OmJjOjAxOjA0OjM2OmEzOgorICAgICAgICAgICAgICAgICAgICA1NTo2ODpkNTphMjozNjowOTphYzphYjoyMToyNjo1NDowNjphZDozZjpjYToKKyAgICAgICAgICAgICAgICAgICAgMTQ6ZTA6YWM6Y2E6YWQ6MDY6MWQ6OTU6ZTI6Zjg6OWQ6ZjE6ZTA6NjA6ZmY6CisgICAgICAgICAgICAgICAgICAgIGMyOjdmOjc1OjJiOjRjOmNjOmRhOmZlOjg3Ojk5OjIxOmVhOmJhOmZlOjNlOgorICAgICAgICAgICAgICAgICAgICA1NDpkNzpkMjo1OTo3ODpkYjozYzo2ZTpjZjphMDoxMzowMDoxYTpiODoyNzoKKyAgICAgICAgICAgICAgICAgICAgYTE6ZTQ6YmU6Njc6OTY6Y2E6YTA6YzU6YjM6OWM6ZGQ6Yzk6NzU6OWU6ZWI6CisgICAgICAgICAgICAgICAgICAgIDMwOjlhOjVmOmEzOmNkOmQ5OmFlOjc4OjE5OjNmOjIzOmU5OjVjOmRiOjI5OgorICAgICAgICAgICAgICAgICAgICBiZDphZDo1NTpjODoxYjo1NDo4Yzo2MzpmNjplODphNjplYTpjNzozNzoxMjoKKyAgICAgICAgICAgICAgICAgICAgNWM6YTM6Mjk6MWU6MDI6ZDk6ZGI6MWY6M2I6YjQ6ZDc6MGY6NTY6NDc6ODE6CisgICAgICAgICAgICAgICAgICAgIDE1OjA0OjRhOmFmOjgzOjI3OmQxOmM1OjU4Ojg4OmMxOmRkOmY2OmFhOmE3OgorICAgICAgICAgICAgICAgICAgICBhMzoxODpkYTo2ODphYTo2ZDoxMTo1MTplMTpiZjo2NTo2Yjo5Zjo5Njo3NjoKKyAgICAgICAgICAgICAgICAgICAgZDE6M2QKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIGFiOjY2OjhkOmQ3OmIzOmJhOmM3OjlhOmI2OmU2OjU1OmQwOjA1OmYxOjlmOjMxOjhkOjVhOgorICAgICAgICBhYTpkOTphYTo0NjoyNjowZjo3MTplZDphNTphZDo1Mzo1Njo2MjowMTo0NzoyYTo0NDplOToKKyAgICAgICAgZmU6M2Y6NzQ6MGI6MTM6OWI6Yjk6ZjQ6NGQ6MWI6YjI6ZDE6NWY6YjI6YjY6ZDI6ODg6NWM6CisgICAgICAgIGIzOjlmOmNkOmNiOmQ0OmE3OmQ5OjYwOjk1Ojg0OjNhOmY4OmMxOjM3OjFkOjYxOmNhOmU3OgorICAgICAgICBiMDpjNTplNTo5MTpkYTo1NDphNjphYzozMTo4MTphZTo5NzpkZTpjZDowODphYzpiODpjMDoKKyAgICAgICAgOTc6ODA6N2Y6NmU6NzI6YTQ6ZTc6Njk6MTM6OTU6NjU6MWY6YzQ6OTM6M2M6ZmQ6Nzk6OGY6CisgICAgICAgIDA0OmQ0OjNlOjRmOmVhOmY3OjllOmNlOmNkOjY3OjdjOjRmOjY1OjAyOmZmOjkxOjg1OjU0OgorICAgICAgICA3MzpjNzpmZjozNjpmNzo4NjoyZDplYzpkMDo1ZTo0ZjpmZjoxMTo5Zjo3MjowNjpkNjpiODoKKyAgICAgICAgMWE6ZjE6NGM6MGQ6MjY6NjU6ZTI6NDQ6ODA6MWU6Yzc6OWY6ZTM6ZGQ6ZTg6MGE6ZGE6ZWM6CisgICAgICAgIGE1OjIwOjgwOjY5OjY4OmExOjRmOjdlOmUxOjZiOmNmOjA3OjQxOmZhOjgzOjhlOmJjOjM4OgorICAgICAgICBkZDpiMDoyZToxMTpiMTo2YjpiMjo0MjpjYzo5YTpiYzpmOTo0ODoyMjo3OTo0YToxOTowZjoKKyAgICAgICAgYjI6MWM6M2U6MjA6NzQ6ZDk6NmE6YzM6YmU6ZjI6Mjg6Nzg6MTM6NTY6Nzk6NGY6NmQ6NTA6CisgICAgICAgIGVhOjFiOmIwOmI1OjU3OmIxOjM3OjY2OjU4OjIzOmYzOmRjOjBmOmRmOjBhOjg3OmM0OmVmOgorICAgICAgICA4NjowNTpkNTozODoxNDo2MDo5OTphMzo0YjpkZTowNjo5Njo3MToyYzpmMjpkYjpiNjoxZjoKKyAgICAgICAgYTQ6ZWY6M2Y6ZWUKKworVmVyaXNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiBCMzo5QzoyNTpCMTpDMzoyRTozMjo1Mzo4MDoxNTozMDo5RDo0RDowMjo3NzozRQorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUNQRENDQWFVQ0VDMGIvRW9YamFPUjYrZi85WXRGdmdzd0RRWUpLb1pJaHZjTkFRRUNCUUF3WHpFTE1Ba0cKK0ExVUVCaE1DVlZNeEZ6QVZCZ05WQkFvVERsWmxjbWxUYVdkdUxDQkpibU11TVRjd05RWURWUVFMRXk1RGJHRnoKK2N5QXlJRkIxWW14cFl5QlFjbWx0WVhKNUlFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUI0WERUazIKK01ERXlPVEF3TURBd01Gb1hEVEk0TURnd01USXpOVGsxT1Zvd1h6RUxNQWtHQTFVRUJoTUNWVk14RnpBVkJnTlYKK0JBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1UY3dOUVlEVlFRTEV5NURiR0Z6Y3lBeUlGQjFZbXhwWXlCUWNtbHQKK1lYSjVJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1JR2ZNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R04KK0FEQ0JpUUtCZ1FDMldvdWpEV29qZzRCcnp6bUg5Q0VUTXdaTUphTHRWUktYeGFlQXVmcUR3U0NnK2k4VkRYeWgKK1lHdCtlU3o2Qmc4NnJ2WWJiN0hTL3k4b1VsK0RmVXZFZXJmNFpoK0FWUHkzd281WlNoUlhSdEdhazc1QmtRTzcKK0ZZQ1RYT3ZuekFoc1B6NnpTdnovUzJ3ajFWQ0NKa1FaamlQRGNlb1pKRWNFbm5XL3lLWUFId0lEQVFBQk1BMEcKK0NTcUdTSWIzRFFFQkFnVUFBNEdCQUlvYksvbzV3WFRYWHRnWlpLSllTaTAzNEROSEQ2enQ5NnJiSHVTTEJseGcKK0o4cEZVczRXN3o4R1pPZVVhSHhnTXhVUmFhK2RZbzJqQTFScnByN2w3Z1VZWUFTL1FvRDkwS2lvSGdFNzk2TmMKK3I2UGM1aWFBSXp5NFJIVDNDcTVKaTJGNHpDUy9pSXFuRHVwekdVSDlUUVB3aU5IbGVJMmxLay8ybHcwWGQ4clkKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDEgKDB4MCkKKyAgICAgICAgU2VyaWFsIE51bWJlcjoKKyAgICAgICAgICAgIDJkOjFiOmZjOjRhOjE3OjhkOmEzOjkxOmViOmU3OmZmOmY1OjhiOjQ1OmJlOjBiCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kMldpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1VUywgTz1WZXJpU2lnbiwgSW5jLiwgT1U9Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogSmFuIDI5IDAwOjAwOjAwIDE5OTYgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBBdWcgIDEgMjM6NTk6NTkgMjAyOCBHTVQKKyAgICAgICAgU3ViamVjdDogQz1VUywgTz1WZXJpU2lnbiwgSW5jLiwgT1U9Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6YjY6NWE6OGI6YTM6MGQ6NmE6MjM6ODM6ODA6NmI6Y2Y6Mzk6ODc6ZjQ6CisgICAgICAgICAgICAgICAgICAgIDIxOjEzOjMzOjA2OjRjOjI1OmEyOmVkOjU1OjEyOjk3OmM1OmE3OjgwOmI5OgorICAgICAgICAgICAgICAgICAgICBmYTo4MzpjMToyMDphMDpmYToyZjoxNTowZDo3YzphMTo2MDo2Yjo3ZTo3OToKKyAgICAgICAgICAgICAgICAgICAgMmM6ZmE6MDY6MGY6M2E6YWU6ZjY6MWI6NmY6YjE6ZDI6ZmY6MmY6Mjg6NTI6CisgICAgICAgICAgICAgICAgICAgIDVmOjgzOjdkOjRiOmM0OjdhOmI3OmY4OjY2OjFmOjgwOjU0OmZjOmI3OmMyOgorICAgICAgICAgICAgICAgICAgICA4ZTo1OTo0YToxNDo1Nzo0NjpkMTo5YTo5MzpiZTo0MTo5MTowMzpiYjoxNToKKyAgICAgICAgICAgICAgICAgICAgODA6OTM6NWM6ZWI6ZTc6Y2M6MDg6NmM6M2Y6M2U6YjM6NGE6ZmM6ZmY6NGI6CisgICAgICAgICAgICAgICAgICAgIDZjOjIzOmQ1OjUwOjgyOjI2OjQ0OjE5OjhlOjIzOmMzOjcxOmVhOjE5OjI0OgorICAgICAgICAgICAgICAgICAgICA0NzowNDo5ZTo3NTpiZjpjODphNjowMDoxZgorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDJXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA4YToxYjoyYjpmYTozOTpjMTo3NDpkNzo1ZTpkODoxOTo2NDphMjo1ODo0YToyZDozNzplMDoKKyAgICAgICAgMzM6NDc6MGY6YWM6ZWQ6Zjc6YWE6ZGI6MWU6ZTQ6OGI6MDY6NWM6NjA6Mjc6Y2E6NDU6NTI6CisgICAgICAgIGNlOjE2OmVmOjNmOjA2OjY0OmU3Ojk0OjY4OjdjOjYwOjMzOjE1OjExOjY5OmFmOjlkOjYyOgorICAgICAgICA4ZDphMzowMzo1NDo2YjphNjpiZTplNTplZTowNToxODo2MDowNDpiZjo0Mjo4MDpmZDpkMDoKKyAgICAgICAgYTg6YTg6MWU6MDE6M2I6Zjc6YTM6NWM6YWY6YTM6ZGM6ZTY6MjY6ODA6MjM6M2M6Yjg6NDQ6CisgICAgICAgIDc0OmY3OjBhOmFlOjQ5OjhiOjYxOjc4OmNjOjI0OmJmOjg4OjhhOmE3OjBlOmVhOjczOjE5OgorICAgICAgICA0MTpmZDo0ZDowMzpmMDo4ODpkMTplNTo3ODo4ZDphNToyYTo0ZjpmNjo5NzowZDoxNzo3NzoKKyAgICAgICAgY2E6ZDgKKworVmVyaXNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogMkQ6QkI6RTU6MjU6RDM6RDE6NjU6ODI6M0E6Qjc6MEU6RkE6RTY6RUI6RTI6RTEKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEQXpDQ0Ftd0NFUUM1TDJETWlKK2hla1lKdUZ0d2JJcXZNQTBHQ1NxR1NJYjNEUUVCQlFVQU1JSEJNUXN3CitDUVlEVlFRR0V3SlZVekVYTUJVR0ExVUVDaE1PVm1WeWFWTnBaMjRzSUVsdVl5NHhQREE2QmdOVkJBc1RNME5zCitZWE56SURJZ1VIVmliR2xqSUZCeWFXMWhjbmtnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2dMU0JICitNakU2TURnR0ExVUVDeE14S0dNcElERTVPVGdnVm1WeWFWTnBaMjRzSUVsdVl5NGdMU0JHYjNJZ1lYVjBhRzl5CithWHBsWkNCMWMyVWdiMjVzZVRFZk1CMEdBMVVFQ3hNV1ZtVnlhVk5wWjI0Z1ZISjFjM1FnVG1WMGQyOXlhekFlCitGdzA1T0RBMU1UZ3dNREF3TURCYUZ3MHlPREE0TURFeU16VTVOVGxhTUlIQk1Rc3dDUVlEVlFRR0V3SlZVekVYCitNQlVHQTFVRUNoTU9WbVZ5YVZOcFoyNHNJRWx1WXk0eFBEQTZCZ05WQkFzVE0wTnNZWE56SURJZ1VIVmliR2xqCitJRkJ5YVcxaGNua2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZ0xTQkhNakU2TURnR0ExVUVDeE14CitLR01wSURFNU9UZ2dWbVZ5YVZOcFoyNHNJRWx1WXk0Z0xTQkdiM0lnWVhWMGFHOXlhWHBsWkNCMWMyVWdiMjVzCitlVEVmTUIwR0ExVUVDeE1XVm1WeWFWTnBaMjRnVkhKMWMzUWdUbVYwZDI5eWF6Q0JuekFOQmdrcWhraUc5dzBCCitBUUVGQUFPQmpRQXdnWWtDZ1lFQXA0Z0JJWFFzNXhvRDhKamhsendQSVFqeG5OdVg2WnI4d2dRR0U3NWZVc2pNCitIaXdTVml5NEFXa3N6SmtmcmJDV3Jua0U4aE01d1h1WXVnZ3M2TUtFRXl5cWFla0o5TWVwQXFSQ3dpTlBTdGp3CitEcUw3TVd6SjVtK1pKd2YxNXZSTWVKNXQ2MGFHK3JtR3lWVHlzc1N2MUVZY1dza1ZNUDhOYlBVdERtM09mM2NDCitBd0VBQVRBTkJna3Foa2lHOXcwQkFRVUZBQU9CZ1FCeUx2bC8wZkZ4KzhTZTlzVmVVWXBBbUxobytKc2NnOWppCituYjMvN2FIbVp1b3ZDZlRLMStxbEs1WDJKR0NHVFVRdWc2WEVMYURUcm5ocGIzTGFiSzRJOEdPU04rYTd4REFYCityWGZNU1RXcXo5aVAwYjYzR0paSGMycFVJalJrTGJZV20xbGJ0RkZaT3JNTEZQUVMzMmVnOUsweVpGNnhSbkluCitqQko3eFVTMHJnPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDEgKDB4MCkKKyAgICAgICAgU2VyaWFsIE51bWJlcjoKKyAgICAgICAgICAgIGI5OjJmOjYwOmNjOjg4OjlmOmExOjdhOjQ2OjA5OmI4OjViOjcwOjZjOjhhOmFmCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9VVMsIE89VmVyaVNpZ24sIEluYy4sIE9VPUNsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMiwgT1U9KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seSwgT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yaworICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogTWF5IDE4IDAwOjAwOjAwIDE5OTggR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBBdWcgIDEgMjM6NTk6NTkgMjAyOCBHTVQKKyAgICAgICAgU3ViamVjdDogQz1VUywgTz1WZXJpU2lnbiwgSW5jLiwgT1U9Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyLCBPVT0oYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5LCBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDphNzo4ODowMToyMTo3NDoyYzplNzoxYTowMzpmMDo5ODplMTo5NzozYzoKKyAgICAgICAgICAgICAgICAgICAgMGY6MjE6MDg6ZjE6OWM6ZGI6OTc6ZTk6OWE6ZmM6YzI6MDQ6MDY6MTM6YmU6CisgICAgICAgICAgICAgICAgICAgIDVmOjUyOmM4OmNjOjFlOjJjOjEyOjU2OjJjOmI4OjAxOjY5OjJjOmNjOjk5OgorICAgICAgICAgICAgICAgICAgICAxZjphZDpiMDo5NjphZTo3OTowNDpmMjoxMzozOTpjMTo3Yjo5ODpiYTowODoKKyAgICAgICAgICAgICAgICAgICAgMmM6ZTg6YzI6ODQ6MTM6MmM6YWE6Njk6ZTk6MDk6ZjQ6Yzc6YTk6MDI6YTQ6CisgICAgICAgICAgICAgICAgICAgIDQyOmMyOjIzOjRmOjRhOmQ4OmYwOjBlOmEyOmZiOjMxOjZjOmM5OmU2OjZmOgorICAgICAgICAgICAgICAgICAgICA5OToyNzowNzpmNTplNjpmNDo0Yzo3ODo5ZTo2ZDplYjo0Njo4NjpmYTpiOToKKyAgICAgICAgICAgICAgICAgICAgODY6Yzk6NTQ6ZjI6YjI6YzQ6YWY6ZDQ6NDY6MWM6NWE6Yzk6MTU6MzA6ZmY6CisgICAgICAgICAgICAgICAgICAgIDBkOjZjOmY1OjJkOjBlOjZkOmNlOjdmOjc3CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA3MjoyZTpmOTo3ZjpkMTpmMTo3MTpmYjpjNDo5ZTpmNjpjNTo1ZTo1MTo4YTo0MDo5ODpiODoKKyAgICAgICAgNjg6Zjg6OWI6MWM6ODM6ZDg6ZTI6OWQ6YmQ6ZmY6ZWQ6YTE6ZTY6NjY6ZWE6MmY6MDk6ZjQ6CisgICAgICAgIGNhOmQ3OmVhOmE1OjJiOjk1OmY2OjI0OjYwOjg2OjRkOjQ0OjJlOjgzOmE1OmM0OjJkOmEwOgorICAgICAgICBkMzphZTo3ODo2OTo2Zjo3MjpkYTo2YzphZTowODpmMDo2Mzo5MjozNzplNjpiYjpjNDozMDoKKyAgICAgICAgMTc6YWQ6Nzc6Y2M6NDk6MzU6YWE6Y2Y6ZDg6OGY6ZDE6YmU6Yjc6MTg6OTY6NDc6NzM6NmE6CisgICAgICAgIDU0OjIyOjM0OjY0OjJkOmI2OjE2OjliOjU5OjViOmI0OjUxOjU5OjNhOmIzOjBiOjE0OmY0OgorICAgICAgICAxMjpkZjo2NzphMDpmNDphZDozMjo2NDo1ZTpiMTo0Njo3MjoyNzo4YzoxMjo3YjpjNTo0NDoKKyAgICAgICAgYjQ6YWUKKworVmVyaXNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogRjg6QkU6QzQ6NjM6MjI6Qzk6QTg6NDY6NzQ6OEI6Qjg6MUQ6MUU6NEE6MkI6RjYKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFR1RDQ0F3RUNFR0Z3eTBtTVg1aEZLZWV3cHRsUVczb3dEUVlKS29aSWh2Y05BUUVGQlFBd2djb3hDekFKCitCZ05WQkFZVEFsVlRNUmN3RlFZRFZRUUtFdzVXWlhKcFUybG5iaXdnU1c1akxqRWZNQjBHQTFVRUN4TVdWbVZ5CithVk5wWjI0Z1ZISjFjM1FnVG1WMGQyOXlhekU2TURnR0ExVUVDeE14S0dNcElERTVPVGtnVm1WeWFWTnBaMjRzCitJRWx1WXk0Z0xTQkdiM0lnWVhWMGFHOXlhWHBsWkNCMWMyVWdiMjVzZVRGRk1FTUdBMVVFQXhNOFZtVnlhVk5wCitaMjRnUTJ4aGMzTWdNaUJRZFdKc2FXTWdVSEpwYldGeWVTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwCitlU0F0SUVjek1CNFhEVGs1TVRBd01UQXdNREF3TUZvWERUTTJNRGN4TmpJek5UazFPVm93Z2NveEN6QUpCZ05WCitCQVlUQWxWVE1SY3dGUVlEVlFRS0V3NVdaWEpwVTJsbmJpd2dTVzVqTGpFZk1CMEdBMVVFQ3hNV1ZtVnlhVk5wCitaMjRnVkhKMWMzUWdUbVYwZDI5eWF6RTZNRGdHQTFVRUN4TXhLR01wSURFNU9Ua2dWbVZ5YVZOcFoyNHNJRWx1CitZeTRnTFNCR2IzSWdZWFYwYUc5eWFYcGxaQ0IxYzJVZ2IyNXNlVEZGTUVNR0ExVUVBeE04Vm1WeWFWTnBaMjRnCitRMnhoYzNNZ01pQlFkV0pzYVdNZ1VISnBiV0Z5ZVNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlU0F0CitJRWN6TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFyd29Od3RVczIyZTVMZVdVCitKOTJsdnVDd1RZK3pZVlk4MW56RDlNMCtoc3VpaU9MaDJLUnB4YlhpdjhHbVIxQmVSam1MMVphNnRXOFV2eERPCitKeE9lQlVlYk1Yb1QyQi9aMHdJM2k2MHNSL0NPZ1FhbkRUQU02L2M4RHlBZDNISkc3cVVDeUZ2RHlWWnBUTVVZCit3WkY3QzlVVEFKdTg3OE5JUGtaZ0lJVXExWkMyell1Z3pETGR0LzFBVmJKUUhGYXV6STEzVGNjZ1RhY3hkdTlvCitrb3FRSGdpQlZyS3RhYU5TME1zY3hDTTlINW4rVE9nV1k0N0dDSTcyTWZiUyt1VjIzYlVja3FOSnpjMEJ6V2pOCitxV202bytzZERaeWtJS2JCb01YUlJrd1hiZEtzWmorV2pPQ0UxRGIvSWxuRitSRmdxRjhFZmZJYTlpVkNZUS9FCitTcmcraVFJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUEwSmhVOHdJMU5RMGtkdmVraGt0ZG1uTGZlCit4YmpRNUYxZmRpTEFKdm1FT2pyNWpMWDc3R0R4Nk00RXNNamRwd09QTVBPWTM2VG1wREhmMHh3TFJ0eHlJRCt1Cis3Z1U4cERNL0N6bXNjSGh6UzVrcjN6RENWTENvTzFXaC9oWW96VUs5ZEc2QTJ5ZEVwODVFWGRRYmtKZ05Ia0tVCitzUUFzQk5CMG93SUZJbU5qellPMSs4RnRZbXRwZGYxZGNFRzU5Yjk4Mzc3Qk1uTWlJWXRZZ1hzVmtYcTY0MlJJCitzSC83TmlYYWxkRHhKQlFYM1JpQWEwWWpPVlQxam1JSkJCMlVrS2FiNWlYaVFrV3F1SkN0dmdpUHFRdENHSlRQCitjam5oc1VQZ0tNKzM1MXBzRTJ0SnMvL2pHSHlKaXpOZHJEUFhwL25hT2xYSldCRDVxdTlhdHM5TFM5OHEKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDEgKDB4MCkKKyAgICAgICAgU2VyaWFsIE51bWJlcjoKKyAgICAgICAgICAgIDYxOjcwOmNiOjQ5OjhjOjVmOjk4OjQ1OjI5OmU3OmIwOmE2OmQ5OjUwOjViOjdhCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9VVMsIE89VmVyaVNpZ24sIEluYy4sIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmssIE9VPShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHksIENOPVZlcmlTaWduIENsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMworICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogT2N0ICAxIDAwOjAwOjAwIDE5OTkgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBKdWwgMTYgMjM6NTk6NTkgMjAzNiBHTVQKKyAgICAgICAgU3ViamVjdDogQz1VUywgTz1WZXJpU2lnbiwgSW5jLiwgT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yaywgT1U9KGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seSwgQ049VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMjA0OCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMjA0OCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDphZjowYTowZDpjMjpkNToyYzpkYjo2NzpiOToyZDplNTo5NDoyNzpkZDoKKyAgICAgICAgICAgICAgICAgICAgYTU6YmU6ZTA6YjA6NGQ6OGY6YjM6NjE6NTY6M2M6ZDY6N2M6YzM6ZjQ6Y2Q6CisgICAgICAgICAgICAgICAgICAgIDNlOjg2OmNiOmEyOjg4OmUyOmUxOmQ4OmE0OjY5OmM1OmI1OmUyOmJmOmMxOgorICAgICAgICAgICAgICAgICAgICBhNjo0Nzo1MDo1ZTo0NjozOTo4YjpkNTo5NjpiYTpiNTo2ZjoxNDpiZjoxMDoKKyAgICAgICAgICAgICAgICAgICAgY2U6Mjc6MTM6OWU6MDU6NDc6OWI6MzE6N2E6MTM6ZDg6MWY6ZDk6ZDM6MDI6CisgICAgICAgICAgICAgICAgICAgIDM3OjhiOmFkOjJjOjQ3OmYwOjhlOjgxOjA2OmE3OjBkOjMwOjBjOmViOmY3OgorICAgICAgICAgICAgICAgICAgICAzYzowZjoyMDoxZDpkYzo3Mjo0NjplZTphNTowMjpjODo1YjpjMzpjOTo1NjoKKyAgICAgICAgICAgICAgICAgICAgNjk6NGM6YzU6MTg6YzE6OTE6N2I6MGI6ZDU6MTM6MDA6OWI6YmM6ZWY6YzM6CisgICAgICAgICAgICAgICAgICAgIDQ4OjNlOjQ2OjYwOjIwOjg1OjJhOmQ1OjkwOmI2OmNkOjhiOmEwOmNjOjMyOgorICAgICAgICAgICAgICAgICAgICBkZDpiNzpmZDo0MDo1NTpiMjo1MDoxYzo1NjphZTpjYzo4ZDo3Nzo0ZDpjNzoKKyAgICAgICAgICAgICAgICAgICAgMjA6NGQ6YTc6MzE6NzY6ZWY6Njg6OTI6OGE6OTA6MWU6MDg6ODE6NTY6YjI6CisgICAgICAgICAgICAgICAgICAgIGFkOjY5OmEzOjUyOmQwOmNiOjFjOmM0OjIzOjNkOjFmOjk5OmZlOjRjOmU4OgorICAgICAgICAgICAgICAgICAgICAxNjo2Mzo4ZTpjNjowODo4ZTpmNjozMTpmNjpkMjpmYTplNTo3NjpkZDpiNToKKyAgICAgICAgICAgICAgICAgICAgMWM6OTI6YTM6NDk6Y2Q6Y2Q6MDE6Y2Q6Njg6Y2Q6YTk6Njk6YmE6YTM6ZWI6CisgICAgICAgICAgICAgICAgICAgIDFkOjBkOjljOmE0OjIwOmE2OmMxOmEwOmM1OmQxOjQ2OjRjOjE3OjZkOmQyOgorICAgICAgICAgICAgICAgICAgICBhYzo2NjozZjo5Njo4YzplMDo4NDpkNDozNjpmZjoyMjo1OTpjNTpmOToxMToKKyAgICAgICAgICAgICAgICAgICAgNjA6YTg6NWY6MDQ6N2Q6ZjI6MWE6ZjY6MjU6NDI6NjE6MGY6YzQ6NGE6Yjg6CisgICAgICAgICAgICAgICAgICAgIDNlOjg5CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICAzNDoyNjoxNTozYzpjMDo4ZDo0ZDo0Mzo0OToxZDpiZDplOToyMTo5MjpkNzo2Njo5YzpiNzoKKyAgICAgICAgZGU6YzU6Yjg6ZDA6ZTQ6NWQ6NWY6NzY6MjI6YzA6MjY6Zjk6ODQ6M2E6M2E6Zjk6OGM6YjU6CisgICAgICAgIGZiOmVjOjYwOmYxOmU4OmNlOjA0OmIwOmM4OmRkOmE3OjAzOjhmOjMwOmYzOjk4OmRmOmE0OgorICAgICAgICBlNjphNDozMTpkZjpkMzoxYzowYjo0NjpkYzo3MjoyMDozZjphZTplZTowNTozYzphNDozMzoKKyAgICAgICAgM2Y6MGI6Mzk6YWM6NzA6Nzg6NzM6NGI6OTk6MmI6ZGY6MzA6YzI6NTQ6YjA6YTg6M2I6NTU6CisgICAgICAgIGExOmZlOjE2OjI4OmNkOjQyOmJkOjc0OjZlOjgwOmRiOjI3OjQ0OmE3OmNlOjQ0OjVkOmQ0OgorICAgICAgICAxYjo5MDo5ODowZDoxZTo0Mjo5NDpiMTowMDoyYzowNDpkMDo3NDphMzowMjowNToyMjo2MzoKKyAgICAgICAgNjM6Y2Q6ODM6YjU6ZmI6YzE6NmQ6NjI6NmI6Njk6NzU6ZmQ6NWQ6NzA6NDE6Yjk6ZjU6YmY6CisgICAgICAgIDdjOmRmOmJlOmMxOjMyOjczOjIyOjIxOjhiOjU4OjgxOjdiOjE1OjkxOjdhOmJhOmUzOjY0OgorICAgICAgICA0ODpiMDo3ZjpmYjozNjoyNTpkYTo5NTpkMDpmMToyNDoxNDoxNzpkZDoxODo4MDo2Yjo0NjoKKyAgICAgICAgMjM6Mzk6NTQ6ZjU6OGU6NjI6MDk6MDQ6MWQ6OTQ6OTA6YTY6OWI6ZTY6MjU6ZTI6NDI6NDU6CisgICAgICAgIGFhOmI4OjkwOmFkOmJlOjA4OjhmOmE5OjBiOjQyOjE4Ojk0OmNmOjcyOjM5OmUxOmIxOjQzOgorICAgICAgICBlMDoyODpjZjpiNzplNzo1YTo2YzoxMzo2Yjo0OTpiMzpmZjplMzoxODo3Yzo4OTo4YjozMzoKKyAgICAgICAgNWQ6YWM6MzM6ZDc6YTc6Zjk6ZGE6M2E6NTU6Yzk6NTg6MTA6Zjk6YWE6ZWY6NWE6YjY6Y2Y6CisgICAgICAgIDRiOjRiOmRmOjJhCisKK1ZlcmlzaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogMTA6RkM6NjM6NUQ6RjY6MjY6M0U6MEQ6RjM6MjU6QkU6NUY6Nzk6Q0Q6Njc6NjcKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlDUERDQ0FhVUNFSEM2NUIwUTJTazB0ampLZXdQTXVyOHdEUVlKS29aSWh2Y05BUUVDQlFBd1h6RUxNQWtHCitBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1UY3dOUVlEVlFRTEV5NURiR0Z6CitjeUF6SUZCMVlteHBZeUJRY21sdFlYSjVJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1CNFhEVGsyCitNREV5T1RBd01EQXdNRm9YRFRJNE1EZ3dNVEl6TlRrMU9Wb3dYekVMTUFrR0ExVUVCaE1DVlZNeEZ6QVZCZ05WCitCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNVGN3TlFZRFZRUUxFeTVEYkdGemN5QXpJRkIxWW14cFl5QlFjbWx0CitZWEo1SUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOCitBRENCaVFLQmdRREpYRm1lOGh1S0FSUzBFTjhFUU52alY2OXFSVUNQaEF3TDBUUFoyUkhQN2dKWUh5WDNLcWhFCitCYXJzQXg5NGY1NlR1Wm9BcWlOOTFxeUZvbU5GeDNJbnpQUk14blZ4MGpudlQwTHdkZDhLa01hT0lHK1lEL2lzCitJMTl3S1Rha3lZYm5zWm9neTFPbGhlYzl2bjJhL2lSRk05eDJGZTBQb25Ga1RHVXVnV2hGcHdJREFRQUJNQTBHCitDU3FHU0liM0RRRUJBZ1VBQTRHQkFMdE1FaXZQTENZQVR4UVQzYWI3L0FvUmhJenpLQnhua2k5OHRzWDYzL0RvCitsYndkajJ3c3FGSE1jOWlrd0ZQd1R0WW13SFlCVjRHU1hpSHgwYkgvNTlBaFdNMXBGK05FSEp3WlJEbUpYTnljCitBQTlXalFLWjdhS1FSVXprdXhDa1BmQXlBdzd4enZqb3lWR001bUtmNXAvQWZiZHluTWsyT211ZlRxai9aQTFrCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAxICgweDApCisgICAgICAgIFNlcmlhbCBOdW1iZXI6CisgICAgICAgICAgICA3MDpiYTplNDoxZDoxMDpkOToyOTozNDpiNjozODpjYTo3YjowMzpjYzpiYTpiZgorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDJXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9VVMsIE89VmVyaVNpZ24sIEluYy4sIE9VPUNsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IEphbiAyOSAwMDowMDowMCAxOTk2IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogQXVnICAxIDIzOjU5OjU5IDIwMjggR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89VmVyaVNpZ24sIEluYy4sIE9VPUNsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgxMDI0IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgxMDI0IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmM5OjVjOjU5OjllOmYyOjFiOjhhOjAxOjE0OmI0OjEwOmRmOjA0OjQwOgorICAgICAgICAgICAgICAgICAgICBkYjplMzo1NzphZjo2YTo0NTo0MDo4Zjo4NDowYzowYjpkMTozMzpkOTpkOToKKyAgICAgICAgICAgICAgICAgICAgMTE6Y2Y6ZWU6MDI6NTg6MWY6MjU6Zjc6MmE6YTg6NDQ6MDU6YWE6ZWM6MDM6CisgICAgICAgICAgICAgICAgICAgIDFmOjc4OjdmOjllOjkzOmI5OjlhOjAwOmFhOjIzOjdkOmQ2OmFjOjg1OmEyOgorICAgICAgICAgICAgICAgICAgICA2Mzo0NTpjNzo3MjoyNzpjYzpmNDo0YzpjNjo3NTo3MTpkMjozOTplZjo0ZjoKKyAgICAgICAgICAgICAgICAgICAgNDI6ZjA6NzU6ZGY6MGE6OTA6YzY6OGU6MjA6NmY6OTg6MGY6Zjg6YWM6MjM6CisgICAgICAgICAgICAgICAgICAgIDVmOjcwOjI5OjM2OmE0OmM5Ojg2OmU3OmIxOjlhOjIwOmNiOjUzOmE1Ojg1OgorICAgICAgICAgICAgICAgICAgICBlNzozZDpiZTo3ZDo5YTpmZToyNDo0NTozMzpkYzo3NjoxNTplZDowZjphMjoKKyAgICAgICAgICAgICAgICAgICAgNzE6NjQ6NGM6NjU6MmU6ODE6Njg6NDU6YTcKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQyV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgYmI6NGM6MTI6MmI6Y2Y6MmM6MjY6MDA6NGY6MTQ6MTM6ZGQ6YTY6ZmI6ZmM6MGE6MTE6ODQ6CisgICAgICAgIDhjOmYzOjI4OjFjOjY3OjkyOjJmOjdjOmI2OmM1OmZhOmRmOmYwOmU4Ojk1OmJjOjFkOjhmOgorICAgICAgICA2YzoyYzphODo1MTpjYzo3MzpkODphNDpjMDo1MzpmMDo0ZTpkNjoyNjpjMDo3NjowMTo1NzoKKyAgICAgICAgODE6OTI6NWU6MjE6ZjE6ZDE6YjE6ZmY6ZTc6ZDA6MjE6NTg6Y2Q6Njk6MTc6ZTM6NDQ6MWM6CisgICAgICAgIDljOjE5OjQ0OjM5Ojg5OjVjOmRjOjljOjAwOjBmOjU2OjhkOjAyOjk5OmVkOmEyOjkwOjQ1OgorICAgICAgICA0YzplNDpiYjoxMDphNDozZDpmMDozMjowMzowZTpmMTpjZTpmODplODpjOTo1MTo4YzplNjoKKyAgICAgICAgNjI6OWY6ZTY6OWY6YzA6N2Q6Yjc6NzI6OWM6Yzk6MzY6M2E6NmI6OWY6NGU6YTg6ZmY6NjQ6CisgICAgICAgIDBkOjY0CisKK1ZlcmlzaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IEEyOjMzOjlCOjRDOjc0Ojc4OjczOkQ0OjZDOkU3OkMxOkYzOjhEOkNCOjVDOkU5CitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJREFqQ0NBbXNDRUgzWi9nZlBxQjYzRUhsbis2ZUpOTVl3RFFZSktvWklodmNOQVFFRkJRQXdnY0V4Q3pBSgorQmdOVkJBWVRBbFZUTVJjd0ZRWURWUVFLRXc1V1pYSnBVMmxuYml3Z1NXNWpMakU4TURvR0ExVUVDeE16UTJ4aAorYzNNZ015QlFkV0pzYVdNZ1VISnBiV0Z5ZVNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlU0F0SUVjeQorTVRvd09BWURWUVFMRXpFb1l5a2dNVGs1T0NCV1pYSnBVMmxuYml3Z1NXNWpMaUF0SUVadmNpQmhkWFJvYjNKcAorZW1Wa0lIVnpaU0J2Ym14NU1SOHdIUVlEVlFRTEV4WldaWEpwVTJsbmJpQlVjblZ6ZENCT1pYUjNiM0pyTUI0WAorRFRrNE1EVXhPREF3TURBd01Gb1hEVEk0TURnd01USXpOVGsxT1Zvd2djRXhDekFKQmdOVkJBWVRBbFZUTVJjdworRlFZRFZRUUtFdzVXWlhKcFUybG5iaXdnU1c1akxqRThNRG9HQTFVRUN4TXpRMnhoYzNNZ015QlFkV0pzYVdNZworVUhKcGJXRnllU0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVTQXRJRWN5TVRvd09BWURWUVFMRXpFbworWXlrZ01UazVPQ0JXWlhKcFUybG5iaXdnU1c1akxpQXRJRVp2Y2lCaGRYUm9iM0pwZW1Wa0lIVnpaU0J2Ym14NQorTVI4d0hRWURWUVFMRXhaV1pYSnBVMmxuYmlCVWNuVnpkQ0JPWlhSM2IzSnJNSUdmTUEwR0NTcUdTSWIzRFFFQgorQVFVQUE0R05BRENCaVFLQmdRRE1YdEVSWFZ4cDBLdlR1V3BNbVI5Wm1EQ09Gb1VnUm0xSFA5U0ZJSVRoYmJQNAorcE8wTThSY1BPL21uK1NYWHdjK0VZL0o4WTgraVIvTEdXek9PWkVBRWFNR0F1V1FjUlhmSDJHNzFsU2s4VU9nMAorMTNnZnFMcHRRNUdWajBWWFhuN0YrOHFrQk92cWx6ZFVNRys3QVVjeU04M2NWNXRrYVdING14MGNpVTljWndJRAorQVFBQk1BMEdDU3FHU0liM0RRRUJCUVVBQTRHQkFGRk56YjVjeTVnWm5CV3lBVGw0TGswUFozQndtY1lRV3BTaworVTAxVWJTdXZEVjFBaTJUVDErN2VWbUdTWDZiRUhSQmhOdE1zSnp6b0tRbTVFV1IwekxWem54eElxYnhoQWU3aQorRjZZTTQwQUlPdzduNjBSektwcnhhWkx2Y1JURE9heHhwNUVKYitSeEJyTzZXVmNtZVFEMitBMmlNekFvMUtwWQorb0oyZGFaSDkKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDEgKDB4MCkKKyAgICAgICAgU2VyaWFsIE51bWJlcjoKKyAgICAgICAgICAgIDdkOmQ5OmZlOjA3OmNmOmE4OjFlOmI3OjEwOjc5OjY3OmZiOmE3Ojg5OjM0OmM2CisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9VVMsIE89VmVyaVNpZ24sIEluYy4sIE9VPUNsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMiwgT1U9KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seSwgT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yaworICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogTWF5IDE4IDAwOjAwOjAwIDE5OTggR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBBdWcgIDEgMjM6NTk6NTkgMjAyOCBHTVQKKyAgICAgICAgU3ViamVjdDogQz1VUywgTz1WZXJpU2lnbiwgSW5jLiwgT1U9Q2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyLCBPVT0oYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5LCBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpjYzo1ZTpkMToxMTo1ZDo1Yzo2OTpkMDphYjpkMzpiOTo2YTo0Yzo5OToKKyAgICAgICAgICAgICAgICAgICAgMWY6NTk6OTg6MzA6OGU6MTY6ODU6MjA6NDY6NmQ6NDc6M2Y6ZDQ6ODU6MjA6CisgICAgICAgICAgICAgICAgICAgIDg0OmUxOjZkOmIzOmY4OmE0OmVkOjBjOmYxOjE3OjBmOjNiOmY5OmE3OmY5OgorICAgICAgICAgICAgICAgICAgICAyNTpkNzpjMTpjZjo4NDo2MzpmMjo3Yzo2MzpjZjphMjo0NzpmMjpjNjo1YjoKKyAgICAgICAgICAgICAgICAgICAgMzM6OGU6NjQ6NDA6MDQ6Njg6YzE6ODA6Yjk6NjQ6MWM6NDU6Nzc6Yzc6ZDg6CisgICAgICAgICAgICAgICAgICAgIDZlOmY1Ojk1OjI5OjNjOjUwOmU4OjM0OmQ3Ojc4OjFmOmE4OmJhOjZkOjQzOgorICAgICAgICAgICAgICAgICAgICA5MTo5NTo4Zjo0NTo1Nzo1ZTo3ZTpjNTpmYjpjYTphNDowNDplYjplYTo5NzoKKyAgICAgICAgICAgICAgICAgICAgMzc6NTQ6MzA6NmY6YmI6MDE6NDc6MzI6MzM6Y2Q6ZGM6NTc6OWI6NjQ6Njk6CisgICAgICAgICAgICAgICAgICAgIDYxOmY4OjliOjFkOjFjOjg5OjRmOjVjOjY3CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA1MTo0ZDpjZDpiZTo1YzpjYjo5ODoxOTo5YzoxNTpiMjowMTozOTo3ODoyZTo0ZDowZjo2NzoKKyAgICAgICAgNzA6NzA6OTk6YzY6MTA6NWE6OTQ6YTQ6NTM6NGQ6NTQ6NmQ6MmI6YWY6MGQ6NWQ6NDA6OGI6CisgICAgICAgIDY0OmQzOmQ3OmVlOmRlOjU2OjYxOjkyOjVmOmE2OmM0OjFkOjEwOjYxOjM2OmQzOjJjOjI3OgorICAgICAgICAzYzplODoyOTowOTpiOToxMTo2NDo3NDpjYzpiNTo3Mzo5ZjoxYzo0ODphOTpiYzo2MTowMToKKyAgICAgICAgZWU6ZTI6MTc6YTY6MGM6ZTM6NDA6MDg6M2I6MGU6ZTc6ZWI6NDQ6NzM6MmE6OWE6ZjE6Njk6CisgICAgICAgIDkyOmVmOjcxOjE0OmMzOjM5OmFjOjcxOmE3OjkxOjA5OjZmOmU0OjcxOjA2OmIzOmJhOjU5OgorICAgICAgICA1NzoyNjo3OTowMDpmNjpmODowZDphMjozMzozMDoyODpkNDphYTo1ODphMDo5ZDo5ZDo2OToKKyAgICAgICAgOTE6ZmQKKworVmVyaXNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogQ0Q6Njg6QjY6QTc6Qzc6QzQ6Q0U6NzU6RTA6MUQ6NEY6NTc6NDQ6NjE6OTI6MDkKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFR2pDQ0F3SUNFUUNiZmdaSm96NWl1ZFh1a0VoeEtlOVhNQTBHQ1NxR1NJYjNEUUVCQlFVQU1JSEtNUXN3CitDUVlEVlFRR0V3SlZVekVYTUJVR0ExVUVDaE1PVm1WeWFWTnBaMjRzSUVsdVl5NHhIekFkQmdOVkJBc1RGbFpsCitjbWxUYVdkdUlGUnlkWE4wSUU1bGRIZHZjbXN4T2pBNEJnTlZCQXNUTVNoaktTQXhPVGs1SUZabGNtbFRhV2R1CitMQ0JKYm1NdUlDMGdSbTl5SUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreFJUQkRCZ05WQkFNVFBGWmxjbWxUCithV2R1SUVOc1lYTnpJRE1nVUhWaWJHbGpJRkJ5YVcxaGNua2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwCitkSGtnTFNCSE16QWVGdzA1T1RFd01ERXdNREF3TURCYUZ3MHpOakEzTVRZeU16VTVOVGxhTUlIS01Rc3dDUVlECitWUVFHRXdKVlV6RVhNQlVHQTFVRUNoTU9WbVZ5YVZOcFoyNHNJRWx1WXk0eEh6QWRCZ05WQkFzVEZsWmxjbWxUCithV2R1SUZSeWRYTjBJRTVsZEhkdmNtc3hPakE0QmdOVkJBc1RNU2hqS1NBeE9UazVJRlpsY21sVGFXZHVMQ0JKCitibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4UlRCREJnTlZCQU1UUEZabGNtbFRhV2R1CitJRU5zWVhOeklETWdVSFZpYkdsaklGQnlhVzFoY25rZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGtnCitMU0JITXpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTXU2bkZMOGVCOGFIbThiCitOM085K01scmxCSXdUL0EyUi9YUWtRcjFGOGlsWWNFV1FFMzdpbUdRNVhZZ3dSRUdmYXNzYnFiMUVVR08raTJ0CitLbUZacEdjbVRORG92RkpiY0NBRVdORjZ5YVJwdklNWFpLMEZpN3pRV002TmpQWHI4RUpKQzUyWEoyY3lidUd1CitreFVjY0x3Z1RTOFkzcEtJNkd5RlZ4RWE2WDdqSmhGVW9rV1dWWVBLTUlubzNOaWo3U3FBUDM5NVpWYytGU0JtCitDQytWazcrcVJ5K29ScGZ3RXVMK3dnb3JVZVoyNXJkR3QrSU5wc3lvdzB4WlZZbm02Rk5jSE9xZDhHSVdDNmZKCitYd3p3M3NKMnpxLzNhdkw2UWFhaU14VEo1WHBqMDU1aU45V0ZaWjRPNWxNa2RCdGVIUkpUVzhjczU0TkpPeFd1CitpbWk1VjVjQ0F3RUFBVEFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBRVJTV3dhdVNDUGMvTDhteS91UmFuMlRlCisyeUZQaHBrMGRqWlgzZEFWTDhXdGZ4VWZOMkp6UHRUblg4NFhBOXMxK2l2YnJtQUpYeDVmajI2N0N6M3FXaE1lCitER0J2dGNDMUl5SXVCd3ZMcVhUTFI3c2R3ZGVsYTh3djBrTDlTZDJuaWM5VHV0b0FXaWkvZ3QvNHVoTWRVSWFDCisvWTR3anlsR3NCNDlOZG80WWhZWVNxM210bEZzM3E5aTZ3SFFIaVQrZW84U0doSm91UHRtbVJRVVJWeXU1NjVwCitGNEVyV2pmSlhpcjB4dUtoWEZTYnBsUUF6L0R4d2NlWU1CbzdOaGJibzI3cS9hMnl3dHJ2QWtjVGlzRHhzekd0CitUeHpoVDV5dkR3eWQ5M2dOMlBRMVZvRGF0MjBYajUwZWdXVGgvc1ZGdXExcnVRcDZUazlMaE81TDhYM2RFUT09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAxICgweDApCisgICAgICAgIFNlcmlhbCBOdW1iZXI6CisgICAgICAgICAgICA5Yjo3ZTowNjo0OTphMzozZTo2MjpiOTpkNTplZTo5MDo0ODo3MToyOTplZjo1NworICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBPPVZlcmlTaWduLCBJbmMuLCBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrLCBPVT0oYykgMTk5OSBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5LCBDTj1WZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzMKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IE9jdCAgMSAwMDowMDowMCAxOTk5IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogSnVsIDE2IDIzOjU5OjU5IDIwMzYgR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89VmVyaVNpZ24sIEluYy4sIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmssIE9VPShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHksIENOPVZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMworICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDIwNDggYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDIwNDggYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6Y2I6YmE6OWM6NTI6ZmM6Nzg6MWY6MWE6MWU6NmY6MWI6Mzc6NzM6YmQ6CisgICAgICAgICAgICAgICAgICAgIGY4OmM5OjZiOjk0OjEyOjMwOjRmOmYwOjM2OjQ3OmY1OmQwOjkxOjBhOmY1OgorICAgICAgICAgICAgICAgICAgICAxNzpjODphNTo2MTpjMToxNjo0MDo0ZDpmYjo4YTo2MTo5MDplNTo3NjoyMDoKKyAgICAgICAgICAgICAgICAgICAgYzE6MTE6MDY6N2Q6YWI6MmM6NmU6YTY6ZjU6MTE6NDE6OGU6ZmE6MmQ6YWQ6CisgICAgICAgICAgICAgICAgICAgIDJhOjYxOjU5OmE0OjY3OjI2OjRjOmQwOmU4OmJjOjUyOjViOjcwOjIwOjA0OgorICAgICAgICAgICAgICAgICAgICA1ODpkMTo3YTpjOTphNDo2OTpiYzo4MzoxNzo2NDphZDowNTo4YjpiYzpkMDoKKyAgICAgICAgICAgICAgICAgICAgNTg6Y2U6OGQ6OGM6ZjU6ZWI6ZjA6NDI6NDk6MGI6OWQ6OTc6Mjc6Njc6MzI6CisgICAgICAgICAgICAgICAgICAgIDZlOmUxOmFlOjkzOjE1OjFjOjcwOmJjOjIwOjRkOjJmOjE4OmRlOjkyOjg4OgorICAgICAgICAgICAgICAgICAgICBlODo2Yzo4NTo1NzoxMToxYTplOTo3ZTplMzoyNjoxMTo1NDphMjo0NTo5NjoKKyAgICAgICAgICAgICAgICAgICAgNTU6ODM6Y2E6MzA6ODk6ZTg6ZGM6ZDg6YTM6ZWQ6MmE6ODA6M2Y6N2Y6Nzk6CisgICAgICAgICAgICAgICAgICAgIDY1OjU3OjNlOjE1OjIwOjY2OjA4OjJmOjk1OjkzOmJmOmFhOjQ3OjJmOmE4OgorICAgICAgICAgICAgICAgICAgICA0Njo5NzpmMDoxMjplMjpmZTpjMjowYToyYjo1MTplNjo3NjplNjpiNzo0NjoKKyAgICAgICAgICAgICAgICAgICAgYjc6ZTI6MGQ6YTY6Y2M6YTg6YzM6NGM6NTk6NTU6ODk6ZTY6ZTg6NTM6NWM6CisgICAgICAgICAgICAgICAgICAgIDFjOmVhOjlkOmYwOjYyOjE2OjBiOmE3OmM5OjVmOjBjOmYwOmRlOmMyOjc2OgorICAgICAgICAgICAgICAgICAgICBjZTphZjpmNzo2YTpmMjpmYTo0MTphNjphMjozMzoxNDpjOTplNTo3YTo2MzoKKyAgICAgICAgICAgICAgICAgICAgZDM6OWU6NjI6Mzc6ZDU6ODU6NjU6OWU6MGU6ZTY6NTM6MjQ6NzQ6MWI6NWU6CisgICAgICAgICAgICAgICAgICAgIDFkOjEyOjUzOjViOmM3OjJjOmU3OjgzOjQ5OjNiOjE1OmFlOjhhOjY4OmI5OgorICAgICAgICAgICAgICAgICAgICA1Nzo5NworICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgMTE6MTQ6OTY6YzE6YWI6OTI6MDg6Zjc6M2Y6MmY6Yzk6YjI6ZmU6ZTQ6NWE6OWY6NjQ6ZGU6CisgICAgICAgIGRiOjIxOjRmOjg2Ojk5OjM0Ojc2OjM2OjU3OmRkOmQwOjE1OjJmOmM1OmFkOjdmOjE1OjFmOgorICAgICAgICAzNzo2Mjo3MzozZTpkNDplNzo1ZjpjZToxNzowMzpkYjozNTpmYToyYjpkYjphZTo2MDowOToKKyAgICAgICAgNWY6MWU6NWY6OGY6NmU6YmI6MGI6M2Q6ZWE6NWE6MTM6MWU6MGM6NjA6NmY6YjU6YzA6YjU6CisgICAgICAgIDIzOjIyOjJlOjA3OjBiOmNiOmE5Ojc0OmNiOjQ3OmJiOjFkOmMxOmQ3OmE1OjZiOmNjOjJmOgorICAgICAgICBkMjo0MjpmZDo0OTpkZDphNzo4OTpjZjo1MzpiYTpkYTowMDo1YToyODpiZjo4MjpkZjpmODoKKyAgICAgICAgYmE6MTM6MWQ6NTA6ODY6ODI6ZmQ6OGU6MzA6OGY6Mjk6NDY6YjA6MWU6M2Q6MzU6ZGE6Mzg6CisgICAgICAgIDYyOjE2OjE4OjRhOmFkOmU2OmI2OjUxOjZjOmRlOmFmOjYyOmViOjAxOmQwOjFlOjI0OmZlOgorICAgICAgICA3YTo4ZjoxMjoxYToxMjo2ODpiODpmYjo2Njo5OToxNDoxNDo0NTo1YzphZTplNzphZTo2OToKKyAgICAgICAgMTc6ODE6MmI6NWE6Mzc6Yzk6NWU6MmE6ZjQ6YzY6ZTI6YTE6NWM6NTQ6OWI6YTY6NTQ6MDA6CisgICAgICAgIGNmOmYwOmYxOmMxOmM3Ojk4OjMwOjFhOjNiOjM2OjE2OmRiOmEzOjZlOmVhOmZkOmFkOmIyOgorICAgICAgICBjMjpkYTplZjowMjo0NzoxMzo4YTpjMDpmMTpiMzozMTphZDo0ZjoxYzplMTo0Zjo5YzphZjoKKyAgICAgICAgMGY6MGM6OWQ6Zjc6Nzg6MGQ6ZDg6ZjQ6MzU6NTY6ODA6ZGE6Yjc6NmQ6MTc6OGY6OWQ6MWU6CisgICAgICAgIDgxOjY0OmUxOmZlOmM1OjQ1OmJhOmFkOjZiOmI5OjBhOjdhOjRlOjRmOjRiOjg0OmVlOjRiOgorICAgICAgICBmMTo3ZDpkZDoxMQorCitWZXJpc2lnbiBDbGFzcyA0IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiAyNjo2RDoyQzoxOTo5ODpCNjo3MDo2ODozODo1MDo1NDoxOTpFQzo5MDozNDo2MAorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURBakNDQW1zQ0VES0lqcHJTOWVzVFIvaC94Q0EzSmZnd0RRWUpLb1pJaHZjTkFRRUZCUUF3Z2NFeEN6QUoKK0JnTlZCQVlUQWxWVE1SY3dGUVlEVlFRS0V3NVdaWEpwVTJsbmJpd2dTVzVqTGpFOE1Eb0dBMVVFQ3hNelEyeGgKK2MzTWdOQ0JRZFdKc2FXTWdVSEpwYldGeWVTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVNBdElFY3kKK01Ub3dPQVlEVlFRTEV6RW9ZeWtnTVRrNU9DQldaWEpwVTJsbmJpd2dTVzVqTGlBdElFWnZjaUJoZFhSb2IzSnAKK2VtVmtJSFZ6WlNCdmJteDVNUjh3SFFZRFZRUUxFeFpXWlhKcFUybG5iaUJVY25WemRDQk9aWFIzYjNKck1CNFgKK0RUazRNRFV4T0RBd01EQXdNRm9YRFRJNE1EZ3dNVEl6TlRrMU9Wb3dnY0V4Q3pBSkJnTlZCQVlUQWxWVE1SY3cKK0ZRWURWUVFLRXc1V1pYSnBVMmxuYml3Z1NXNWpMakU4TURvR0ExVUVDeE16UTJ4aGMzTWdOQ0JRZFdKc2FXTWcKK1VISnBiV0Z5ZVNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlU0F0SUVjeU1Ub3dPQVlEVlFRTEV6RW8KK1l5a2dNVGs1T0NCV1pYSnBVMmxuYml3Z1NXNWpMaUF0SUVadmNpQmhkWFJvYjNKcGVtVmtJSFZ6WlNCdmJteDUKK01SOHdIUVlEVlFRTEV4WldaWEpwVTJsbmJpQlVjblZ6ZENCT1pYUjNiM0pyTUlHZk1BMEdDU3FHU0liM0RRRUIKK0FRVUFBNEdOQURDQmlRS0JnUUM2OE9UUCtjU3VoVlM1QjFmNWo4Vi9hQkg0eEJld1JOempNSFBWS21JcXVORE0KK0hPMG9XMzY5YXR5emtTVEtRV0k4L0FJQnZ4d1dNWlFGbDNadW9xMjlZUmRzVGpDRzhGRTNLbERIcUdLQjNGdEsKK3FzR2d0RzdyTCtWWHhiRXJRSERiV2syaGpoKzlBeC9ZQTlTUFRKbHh2T0tDekZqb21EcUcwNFk0OHdBcEh3SUQKK0FRQUJNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0R0JBSVdNRXNHbnVWQVZlc3MrckxoRGl0eXEzUlM2aVlGK0FUd2oKK2NTR0lMNExjWS9vQ1JheEZXZGNxV0VSYnQ1K0JPNUpvUGVJM0pQVjdiSTkyTlpZSnFGbWR1YzRqcTNUV2cvMHkKK2N5ZllhVDVEZFBhdXhZbWE1MU44Nlh2MlMvUEJaWVBlallxY1BJaU5PVm44cWo4aWphSEJabENCY2t6dEltUlAKK1Q4cUFrYllwCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAxICgweDApCisgICAgICAgIFNlcmlhbCBOdW1iZXI6CisgICAgICAgICAgICAzMjo4ODo4ZTo5YTpkMjpmNTplYjoxMzo0NzpmODo3ZjpjNDoyMDozNzoyNTpmOAorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBPPVZlcmlTaWduLCBJbmMuLCBPVT1DbGFzcyA0IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIsIE9VPShjKSAxOTk4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHksIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IE1heSAxOCAwMDowMDowMCAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogQXVnICAxIDIzOjU5OjU5IDIwMjggR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89VmVyaVNpZ24sIEluYy4sIE9VPUNsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMiwgT1U9KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seSwgT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yaworICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6YmE6ZjA6ZTQ6Y2Y6Zjk6YzQ6YWU6ODU6NTQ6Yjk6MDc6NTc6Zjk6OGY6CisgICAgICAgICAgICAgICAgICAgIGM1OjdmOjY4OjExOmY4OmM0OjE3OmIwOjQ0OmRjOmUzOjMwOjczOmQ1OjJhOgorICAgICAgICAgICAgICAgICAgICA2MjoyYTpiODpkMDpjYzoxYzplZDoyODo1Yjo3ZTpiZDo2YTpkYzpiMzo5MToKKyAgICAgICAgICAgICAgICAgICAgMjQ6Y2E6NDE6NjI6M2M6ZmM6MDI6MDE6YmY6MWM6MTY6MzE6OTQ6MDU6OTc6CisgICAgICAgICAgICAgICAgICAgIDc2OjZlOmEyOmFkOmJkOjYxOjE3OjZjOjRlOjMwOjg2OmYwOjUxOjM3OjJhOgorICAgICAgICAgICAgICAgICAgICA1MDpjNzphODo2Mjo4MTpkYzo1Yjo0YTphYTpjMTphMDpiNDo2ZTplYjoyZjoKKyAgICAgICAgICAgICAgICAgICAgZTU6NTc6YzU6YjE6MmI6NDA6NzA6ZGI6NWE6NGQ6YTE6OGU6MWY6YmQ6MDM6CisgICAgICAgICAgICAgICAgICAgIDFmOmQ4OjAzOmQ0OjhmOjRjOjk5OjcxOmJjOmUyOjgyOmNjOjU4OmU4Ojk4OgorICAgICAgICAgICAgICAgICAgICAzYTo4NjpkMzo4NjozODpmMzowMDoyOToxZgorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgODU6OGM6MTI6YzE6YTc6Yjk6NTA6MTU6N2E6Y2I6M2U6YWM6Yjg6NDM6OGE6ZGM6YWE6ZGQ6CisgICAgICAgIDE0OmJhOjg5OjgxOjdlOjAxOjNjOjIzOjcxOjIxOjg4OjJmOjgyOmRjOjYzOmZhOjAyOjQ1OgorICAgICAgICBhYzo0NTo1OTpkNzoyYTo1ODo0NDo1YjpiNzo5Zjo4MTozYjo5Mjo2ODozZDplMjozNzoyNDoKKyAgICAgICAgZjU6N2I6NmM6OGY6NzY6MzU6OTY6MDk6YTg6NTk6OWQ6Yjk6Y2U6MjM6YWI6NzQ6ZDY6ODM6CisgICAgICAgIGZkOjMyOjczOjI3OmQ4OjY5OjNlOjQzOjc0OmY2OmFlOmM1Ojg5OjlhOmU3OjUzOjdjOmU5OgorICAgICAgICA3YjpmNjo0YjpmMzpjMTo2NTo4MzpkZTo4ZDo4YTo5YzozYzo4ODo4ZDozOTo1OTpmYzphYToKKyAgICAgICAgM2Y6MjI6OGQ6YTE6YzE6NjY6NTA6ODE6NzI6NGM6ZWQ6MjI6NjQ6NGY6NGY6Y2E6ODA6OTE6CisgICAgICAgIGI2OjI5CisKK1ZlcmlzaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IERCOkM4OkYyOjI3OjJFOkIxOkVBOjZBOjI5OjIzOjVEOkZFOjU2OjNFOjMzOkRGCitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRUdqQ0NBd0lDRVFEc29LZUxiblZxQWMvRWZNd3ZsRjdYTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUhLTVFzdworQ1FZRFZRUUdFd0pWVXpFWE1CVUdBMVVFQ2hNT1ZtVnlhVk5wWjI0c0lFbHVZeTR4SHpBZEJnTlZCQXNURmxabAorY21sVGFXZHVJRlJ5ZFhOMElFNWxkSGR2Y21zeE9qQTRCZ05WQkFzVE1TaGpLU0F4T1RrNUlGWmxjbWxUYVdkdQorTENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hSVEJEQmdOVkJBTVRQRlpsY21sVAorYVdkdUlFTnNZWE56SURRZ1VIVmliR2xqSUZCeWFXMWhjbmtnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcAorZEhrZ0xTQkhNekFlRncwNU9URXdNREV3TURBd01EQmFGdzB6TmpBM01UWXlNelU1TlRsYU1JSEtNUXN3Q1FZRAorVlFRR0V3SlZVekVYTUJVR0ExVUVDaE1PVm1WeWFWTnBaMjRzSUVsdVl5NHhIekFkQmdOVkJBc1RGbFpsY21sVAorYVdkdUlGUnlkWE4wSUU1bGRIZHZjbXN4T2pBNEJnTlZCQXNUTVNoaktTQXhPVGs1SUZabGNtbFRhV2R1TENCSgorYm1NdUlDMGdSbTl5SUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreFJUQkRCZ05WQkFNVFBGWmxjbWxUYVdkdQorSUVOc1lYTnpJRFFnVUhWaWJHbGpJRkJ5YVcxaGNua2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZworTFNCSE16Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUszTHBSRnB4bG1yOFkrMQorR1E5V3pzeTFIeURrbmlZbFMrQnpaWWxaM3RDRDVQVVB0YnV0OFh6b0lmems2QXp1ZkVVaUdYYVN0Qk8zSUZzSgorK21HdXFQS2xqWVhDS3RiZVpqYlNtd0wwcUpKZ2ZKeHB0SThrSHRDR1V2WXluRUZZSGlLOXpVVmlsUWh1MEdiZAorVTZMTThCRGNWSE9MQktGR016TmNGMEM1bmszVDg3NVZnK2l4aVk1YWZKcVdJcEE3aUNYeTBsT0lBZ3dMZVBMbQorTnhkTE1FWUg1SUJ0cHRpV0x1Z3MrQkd6T0ExbXBwdnF5U05iMjQ3aTh4T09HbGt0cWdMdzdLU0hadHpCUC9YWQordWZUc2dzYlNQWlVkNWNCUGhNblpvMFFvQm1yWFJhendhMnJ2VGwvNEVZSWVPR00wWmxEVVBwTnorakREWnEzLwora3kyWDd3TUNBd0VBQVRBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQWovb2xhMDliNUtST0oxV3JJaFZaUE1xMQorQ3RSSzI2dmRvVjlUeGFCWE9jTE9SeXUrT3NoV3Y4TFpKeEE2c1FVOHdIY3h1enJUQlh0dG1od3dqSURMazVNcQorZzZzRlVZSUNBQkZuYS9PSVlVZGZBNVBWV3czZzhkU2hNaldGc2pyYnNJS3IwY3NLdkUrTVc4VkxBRHNmS29LbQorZmphRjNINDhad0MxNUR0UzRLanJYUlg1eG0zd3JSME9oYmVwbW5NVVdsdVBRU2pBMWVndFRhUmV6YXJaN2M3YworMk5VOFFoMFh3UkpkUlRqRE9QUDhoUzZEUmtpeTF5QmZramFQNTNrUG1GNlo2UERRcEx2MVU3MHF6bG13cjI1LworYkx2U0hnQ3dJZTM0UVdLQ3VkaXl4THRHVVBNeHhZOEJxSFRyOVhnbjJ1ZjNaa1B6bm9NK0lLckROV0NSemc9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMSAoMHgwKQorICAgICAgICBTZXJpYWwgTnVtYmVyOgorICAgICAgICAgICAgZWM6YTA6YTc6OGI6NmU6NzU6NmE6MDE6Y2Y6YzQ6N2M6Y2M6MmY6OTQ6NWU6ZDcKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1VUywgTz1WZXJpU2lnbiwgSW5jLiwgT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yaywgT1U9KGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seSwgQ049VmVyaVNpZ24gQ2xhc3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBPY3QgIDEgMDA6MDA6MDAgMTk5OSBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEp1bCAxNiAyMzo1OTo1OSAyMDM2IEdNVAorICAgICAgICBTdWJqZWN0OiBDPVVTLCBPPVZlcmlTaWduLCBJbmMuLCBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrLCBPVT0oYykgMTk5OSBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5LCBDTj1WZXJpU2lnbiBDbGFzcyA0IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzMKKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgyMDQ4IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgyMDQ4IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmFkOmNiOmE1OjExOjY5OmM2OjU5OmFiOmYxOjhmOmI1OjE5OjBmOjU2OgorICAgICAgICAgICAgICAgICAgICBjZTpjYzpiNToxZjoyMDplNDo5ZToyNjoyNTo0YjplMDo3Mzo2NTo4OTo1OToKKyAgICAgICAgICAgICAgICAgICAgZGU6ZDA6ODM6ZTQ6ZjU6MGY6YjU6YmI6YWQ6ZjE6N2M6ZTg6MjE6ZmM6ZTQ6CisgICAgICAgICAgICAgICAgICAgIGU4OjBjOmVlOjdjOjQ1OjIyOjE5Ojc2OjkyOmI0OjEzOmI3OjIwOjViOjA5OgorICAgICAgICAgICAgICAgICAgICBmYTo2MTphZTphODpmMjphNTo4ZDo4NTpjMjoyYTpkNjpkZTo2NjozNjpkMjoKKyAgICAgICAgICAgICAgICAgICAgOWI6MDI6ZjQ6YTg6OTI6NjA6N2M6OWM6Njk6YjQ6OGY6MjQ6MWU6ZDA6ODY6CisgICAgICAgICAgICAgICAgICAgIDUyOmY2OjMyOjljOjQxOjU4OjFlOjIyOmJkOmNkOjQ1OjYyOjk1OjA4OjZlOgorICAgICAgICAgICAgICAgICAgICBkMDo2NjpkZDo1MzphMjpjYzpmMDoxMDpkYzo1NDo3Mzo4YjowNDphMTo0NjoKKyAgICAgICAgICAgICAgICAgICAgMzM6MzM6NWM6MTc6NDA6Yjk6OWU6NGQ6ZDM6ZjM6YmU6NTU6ODM6ZTg6YjE6CisgICAgICAgICAgICAgICAgICAgIDg5OjhlOjVhOjdjOjlhOjk2OjIyOjkwOjNiOjg4OjI1OmYyOmQyOjUzOjg4OgorICAgICAgICAgICAgICAgICAgICAwMjowYzowYjo3ODpmMjplNjozNzoxNzo0YjozMDo0NjowNzplNDo4MDo2ZDoKKyAgICAgICAgICAgICAgICAgICAgYTY6ZDg6OTY6MmU6ZTg6MmM6Zjg6MTE6YjM6Mzg6MGQ6NjY6YTY6OWI6ZWE6CisgICAgICAgICAgICAgICAgICAgIGM5OjIzOjViOmRiOjhlOmUyOmYzOjEzOjhlOjFhOjU5OjJkOmFhOjAyOmYwOgorICAgICAgICAgICAgICAgICAgICBlYzphNDo4Nzo2NjpkYzpjMTozZjpmNTpkODpiOTpmNDplYzo4MjpjNjpkMjoKKyAgICAgICAgICAgICAgICAgICAgM2Q6OTU6MWQ6ZTU6YzA6NGY6ODQ6Yzk6ZDk6YTM6NDQ6Mjg6MDY6NmE6ZDc6CisgICAgICAgICAgICAgICAgICAgIDQ1OmFjOmYwOjZiOjZhOmVmOjRlOjVmOmY4OjExOjgyOjFlOjM4OjYzOjM0OgorICAgICAgICAgICAgICAgICAgICA2Njo1MDpkNDozZTo5Mzo3MzpmYTozMDpjMzo2NjphZDpmZjo5MzoyZDo5NzoKKyAgICAgICAgICAgICAgICAgICAgZWY6MDMKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDhmOmZhOjI1OjZiOjRmOjViOmU0OmE0OjRlOjI3OjU1OmFiOjIyOjE1OjU5OjNjOmNhOmI1OgorICAgICAgICAwYTpkNDo0YTpkYjphYjpkZDphMTo1Zjo1MzpjNTphMDo1NzozOTpjMjpjZTo0NzoyYjpiZToKKyAgICAgICAgM2E6Yzg6NTY6YmY6YzI6ZDk6Mjc6MTA6M2E6YjE6MDU6M2M6YzA6Nzc6MzE6YmI6M2E6ZDM6CisgICAgICAgIDA1OjdiOjZkOjlhOjFjOjMwOjhjOjgwOmNiOjkzOjkzOjJhOjgzOmFiOjA1OjUxOjgyOjAyOgorICAgICAgICAwMDoxMTo2Nzo2YjpmMzo4ODo2MTo0Nzo1ZjowMzo5MzpkNTo1YjowZDplMDpmMTpkNDphMToKKyAgICAgICAgMzI6MzU6ODU6YjI6M2E6ZGI6YjA6ODI6YWI6ZDE6Y2I6MGE6YmM6NGY6OGM6NWI6YzU6NGI6CisgICAgICAgIDAwOjNiOjFmOjJhOjgyOmE2OjdlOjM2Ojg1OmRjOjdlOjNjOjY3OjAwOmI1OmU0OjNiOjUyOgorICAgICAgICBlMDphODplYjo1ZDoxNTpmOTpjNjo2ZDpmMDphZDoxZDowZTo4NTpiNzphOTo5YTo3MzoxNDoKKyAgICAgICAgNWE6NWI6OGY6NDE6Mjg6YzA6ZDU6ZTg6MmQ6NGQ6YTQ6NWU6Y2Q6YWE6ZDk6ZWQ6Y2U6ZGM6CisgICAgICAgIGQ4OmQ1OjNjOjQyOjFkOjE3OmMxOjEyOjVkOjQ1OjM4OmMzOjM4OmYzOmZjOjg1OjJlOjgzOgorICAgICAgICA0Njo0ODpiMjpkNzoyMDo1Zjo5MjozNjo4ZjplNzo3OTowZjo5ODo1ZTo5OTplODpmMDpkMDoKKyAgICAgICAgYTQ6YmI6ZjU6NTM6YmQ6MmE6Y2U6NTk6YjA6YWY6NmU6N2Y6NmM6YmI6ZDI6MWU6MDA6YjA6CisgICAgICAgIDIxOmVkOmY4OjQxOjYyOjgyOmI5OmQ4OmIyOmM0OmJiOjQ2OjUwOmYzOjMxOmM1OjhmOjAxOgorICAgICAgICBhODo3NDplYjpmNTo3ODoyNzpkYTplNzpmNzo2Njo0MzpmMzo5ZTo4MzozZToyMDphYTpjMzoKKyAgICAgICAgMzU6NjA6OTE6Y2UKKworVmVyaXNpZ24vUlNBIENvbW1lcmNpYWwgQ0EKKz09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IDVBOjBCOkREOjQyOjlFOkIyOkI0OjYyOjk3OjMyOjdGOjdGOjBBOkFBOjlBOjM5CitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQ0l6Q0NBWkFDQlFKQkFBQVdNQTBHQ1NxR1NJYjNEUUVCQWdVQU1Gd3hDekFKQmdOVkJBWVRBbFZUTVNBdworSGdZRFZRUUtFeGRTVTBFZ1JHRjBZU0JUWldOMWNtbDBlU3dnU1c1akxqRXJNQ2tHQTFVRUN4TWlRMjl0YldWeQorWTJsaGJDQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRBZUZ3MDVOREV4TURReE9EVTRNelJhRncwNQorT1RFeE1ETXhPRFU0TXpSYU1Gd3hDekFKQmdOVkJBWVRBbFZUTVNBd0hnWURWUVFLRXhkU1UwRWdSR0YwWVNCVAorWldOMWNtbDBlU3dnU1c1akxqRXJNQ2tHQTFVRUN4TWlRMjl0YldWeVkybGhiQ0JEWlhKMGFXWnBZMkYwYVc5dQorSUVGMWRHaHZjbWwwZVRDQm16QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmlRQXdnWVVDZmdDays0RmllODRRSjkzbworOTc1c2JzWndtZHU0MVFVRGFTaUNuSEovbGorTzdLd3BraitLRlBoQ2RyNjlYUU81a05UUXZBYXlVVE5meE1LLwordG91UG1iWmlJbURkMjk4Z2dyVEtvaTh0VU8yVU10N2dWWTNVYU9MZ1ROTE5CUll1bFdaY1lWSTRIbEdvZ3FIRQorN3lYcEN1YUxLNDR4WnRuNDJmMjlPMm5aNndJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQWdVQUEzNEFkclcyRVA0agorOS9kWllrdXdYNXpCYUx4SnU3TkpieUZIWFN1ZFZNUUFLRCtZdWZLS2c1dGdmK3RReDZzRkVDMDk3VGdDd2FWSQorMHY1bG9NQzg2cVlqRm1ac0d5U3A4K3g1TlJoUEpzampyMUJLeDZjeGE5QjhHSjFRdjZrbStpWXJScHdVcWJ0YgorTUpoQ0tMVkxVN3REQ1pKQXVxaXFXcVRHdG90WFRjVT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDEgKDB4MCkKKyAgICAgICAgU2VyaWFsIE51bWJlcjoKKyAgICAgICAgICAgIDAyOjQxOjAwOjAwOjE2CisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kMldpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1VUywgTz1SU0EgRGF0YSBTZWN1cml0eSwgSW5jLiwgT1U9Q29tbWVyY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogTm92ICA0IDE4OjU4OjM0IDE5OTQgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBOb3YgIDMgMTg6NTg6MzQgMTk5OSBHTVQKKyAgICAgICAgU3ViamVjdDogQz1VUywgTz1SU0EgRGF0YSBTZWN1cml0eSwgSW5jLiwgT1U9Q29tbWVyY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMDAgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMDAgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6YTQ6ZmI6ODE6NjI6N2I6Y2U6MTA6Mjc6ZGQ6ZTg6Zjc6YmU6NmM6NmU6CisgICAgICAgICAgICAgICAgICAgIGM2OjcwOjk5OmRiOmI4OmQ1OjA1OjAzOjY5OjI4OjgyOjljOjcyOjdmOjk2OgorICAgICAgICAgICAgICAgICAgICAzZjo4ZTplYzphYzoyOTo5MjozZjo4YToxNDpmODo0Mjo3NjpiZTpiZDo1ZDoKKyAgICAgICAgICAgICAgICAgICAgMDM6Yjk6OTA6ZDQ6ZDA6YmM6MDY6YjI6NTE6MzM6NWY6YzQ6YzI6YmY6YjY6CisgICAgICAgICAgICAgICAgICAgIDhiOjhmOjk5OmI2OjYyOjIyOjYwOmRkOmRiOmRmOjIwOjgyOmI0OmNhOmEyOgorICAgICAgICAgICAgICAgICAgICAyZjoyZDo1MDplZDo5NDozMjpkZTplMDo1NTo4ZDpkNDo2ODplMjplMDo0YzoKKyAgICAgICAgICAgICAgICAgICAgZDI6Y2Q6MDU6MTY6MmU6OTU6NjY6NWM6NjE6NTI6Mzg6MWU6NTE6YTg6ODI6CisgICAgICAgICAgICAgICAgICAgIGExOmM0OmVmOjI1OmU5OjBhOmU2OjhiOjJiOjhlOjMxOjY2OmQ5OmY4OmQ5OgorICAgICAgICAgICAgICAgICAgICBmZDpiZDozYjo2OTpkOTplYgorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDJXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA3NjpiNTpiNjoxMDpmZToyMzpmNzpmNzo1OTo2Mjo0YjpiMDo1Zjo5YzpjMTo2ODpiYzo0OToKKyAgICAgICAgYmI6YjM6NDk6NmY6MjE6NDc6NWQ6MmI6OWQ6NTQ6YzQ6MDA6Mjg6M2Y6OTg6Yjk6ZjI6OGE6CisgICAgICAgIDgzOjliOjYwOjdmOmViOjUwOmM3OmFiOjA1OjEwOjJkOjNkOmVkOjM4OjAyOmMxOmE1OjQ4OgorICAgICAgICBkMjpmZTo2NTphMDpjMDpiYzplYTphNjoyMzoxNjo2Njo2YzoxYjoyNDphOTpmMzplYzo3OToKKyAgICAgICAgMzU6MTg6NGY6MjY6Yzg6ZTM6YWY6NTA6NGE6Yzc6YTc6MzE6NmI6ZDA6N2M6MTg6OWQ6NTA6CisgICAgICAgIGJmOmE5OjI2OmZhOjI2OjJiOjQ2OjljOjE0OmE5OmJiOjViOjMwOjk4OjQyOjI4OmI1OjRiOgorICAgICAgICA1MzpiYjo0MzowOTo5Mjo0MDpiYTphODphYTo1YTphNDpjNjpiNjo4Yjo1Nzo0ZDpjNQorCitWZXJpc2lnbi9SU0EgU2VjdXJlIFNlcnZlciBDQQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogNzQ6N0I6ODI6MDM6NDM6RjA6MDA6OUU6NkI6QjM6RUM6NDc6QkY6ODU6QTU6OTMKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlDTkRDQ0FhRUNFQUt0Wm41T1JmNWVWMjg4bUJsZTNjQXdEUVlKS29aSWh2Y05BUUVDQlFBd1h6RUxNQWtHCitBMVVFQmhNQ1ZWTXhJREFlQmdOVkJBb1RGMUpUUVNCRVlYUmhJRk5sWTNWeWFYUjVMQ0JKYm1NdU1TNHdMQVlECitWUVFMRXlWVFpXTjFjbVVnVTJWeWRtVnlJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1CNFhEVGswCitNVEV3T1RBd01EQXdNRm9YRFRFd01ERXdOekl6TlRrMU9Wb3dYekVMTUFrR0ExVUVCaE1DVlZNeElEQWVCZ05WCitCQW9URjFKVFFTQkVZWFJoSUZObFkzVnlhWFI1TENCSmJtTXVNUzR3TEFZRFZRUUxFeVZUWldOMWNtVWdVMlZ5CitkbVZ5SUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNSUdiTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdKCitBRENCaFFKK0FKTE9lc0d1Z3o1YXFvbURWNndsQVhZTXJhNk9MRGZPNnpWNFpGUUQ1WVJBVWNtL2p3amlpb0lJCiswaGFHTjFYcHNTRUNyWFpvZ1pvRm9rdkpTeVZtSWxac2lBZVA5NEZaYllRSFpYQVRjWFkrbTNkTTQxQ0pWcGhJCit1UjJuS1JvVExrb1JXWndlRmRWSlZDeHpPbW1Dc1pjNW5HMXdaMGpsM1MzV3lCNTdBZ01CQUFFd0RRWUpLb1pJCitodmNOQVFFQ0JRQURmZ0JsM1g3aHN1eXc0anJnN0hGR21oa1J1TlBIb0xRRFFDWUNQZ21jNFJLejBWcjJONlczCitZUU8yV3hacE84WkVDQXlJVXd4cmwwbkhQalhjYkxtN3F0OWN1em92azJDMnFVdE44aUQzelY5L1pIdU8zQUJjCisxL3AzeWprV1dXOE82dE8xZzM5TlRVSldkclRKWHdUNE9QanIwbDkxWDgxNy9PV09nSHo4VUE9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMSAoMHgwKQorICAgICAgICBTZXJpYWwgTnVtYmVyOgorICAgICAgICAgICAgMDI6YWQ6NjY6N2U6NGU6NDU6ZmU6NWU6NTc6NmY6M2M6OTg6MTk6NWU6ZGQ6YzAKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQyV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBPPVJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuLCBPVT1TZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBOb3YgIDkgMDA6MDA6MDAgMTk5NCBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEphbiAgNyAyMzo1OTo1OSAyMDEwIEdNVAorICAgICAgICBTdWJqZWN0OiBDPVVTLCBPPVJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuLCBPVT1TZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAwMCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAwMCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDo5MjpjZTo3YTpjMTphZTo4MzozZTo1YTphYTo4OTo4Mzo1NzphYzoyNToKKyAgICAgICAgICAgICAgICAgICAgMDE6NzY6MGM6YWQ6YWU6OGU6MmM6Mzc6Y2U6ZWI6MzU6Nzg6NjQ6NTQ6MDM6CisgICAgICAgICAgICAgICAgICAgIGU1Ojg0OjQwOjUxOmM5OmJmOjhmOjA4OmUyOjhhOjgyOjA4OmQyOjE2Ojg2OgorICAgICAgICAgICAgICAgICAgICAzNzo1NTplOTpiMToyMTowMjphZDo3Njo2ODo4MTo5YTowNTphMjo0YjpjOToKKyAgICAgICAgICAgICAgICAgICAgNGI6MjU6NjY6MjI6NTY6NmM6ODg6MDc6OGY6Zjc6ODE6NTk6NmQ6ODQ6MDc6CisgICAgICAgICAgICAgICAgICAgIDY1OjcwOjEzOjcxOjc2OjNlOjliOjc3OjRjOmUzOjUwOjg5OjU2Ojk4OjQ4OgorICAgICAgICAgICAgICAgICAgICBiOToxZDphNzoyOToxYToxMzoyZTo0YToxMTo1OTo5YzoxZToxNTpkNTo0OToKKyAgICAgICAgICAgICAgICAgICAgNTQ6MmM6NzM6M2E6Njk6ODI6YjE6OTc6Mzk6OWM6NmQ6NzA6Njc6NDg6ZTU6CisgICAgICAgICAgICAgICAgICAgIGRkOjJkOmQ2OmM4OjFlOjdiCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kMldpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDY1OmRkOjdlOmUxOmIyOmVjOmIwOmUyOjNhOmUwOmVjOjcxOjQ2OjlhOjE5OjExOmI4OmQzOgorICAgICAgICBjNzphMDpiNDowMzo0MDoyNjowMjozZTowOTo5YzplMToxMjpiMzpkMTo1YTpmNjozNzphNToKKyAgICAgICAgYjc6NjE6MDM6YjY6NWI6MTY6Njk6M2I6YzY6NDQ6MDg6MGM6ODg6NTM6MGM6NmI6OTc6NDk6CisgICAgICAgIGM3OjNlOjM1OmRjOjZjOmI5OmJiOmFhOmRmOjVjOmJiOjNhOjJmOjkzOjYwOmI2OmE5OjRiOgorICAgICAgICA0ZDpmMjoyMDpmNzpjZDo1Zjo3Zjo2NDo3Yjo4ZTpkYzowMDo1YzpkNzpmYTo3NzpjYTozOToKKyAgICAgICAgMTY6NTk6NmY6MGU6ZWE6ZDM6YjU6ODM6N2Y6NGQ6NGQ6NDI6NTY6NzY6YjQ6Yzk6NWY6MDQ6CisgICAgICAgIGY4OjM4OmY4OmViOmQyOjVmOjc1OjVmOmNkOjdiOmZjOmU1OjhlOjgwOjdjOmZjOjUwCmRpZmYgLS1naXQgYS9zYW1wbGVzL3dlYnNlcnZlci9jYWxjZm9ybTEuaHRtbCBiL3NhbXBsZXMvd2Vic2VydmVyL2NhbGNmb3JtMS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMGQxNjYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3dlYnNlcnZlci9jYWxjZm9ybTEuaHRtbApAQCAtMCwwICsxLDM1IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCisNCis8aHRtbD4NCisNCisJPGhlYWQ+DQorCQk8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PUlTTy04ODU5LTEiPg0KKwkJPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJBZG9iZSBHb0xpdmUgNiI+DQorCQk8dGl0bGU+U2ltcGxlIENhbGN1bGF0b3IgV2ViIFNlcnZpY2UgVXNpbmcgSFRUUCBQT1NUIG11bHRpcGFydC9mb3JtLWRhdGE8L3RpdGxlPg0KKwk8L2hlYWQ+DQorDQorCTxib2R5IGJnY29sb3I9IiNmZmZmZmYiPg0KKwkJPGZvcm0gYWN0aW9uPSJmb3JtIiBtZXRob2Q9InBvc3QiIG5hbWU9IkNhbGMiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPg0KKwkJPCEtLSBUaGUgZmlyc3QgPGlucHV0PiBmb3JtIGVsZW1lbnQgbXVzdCBiZSBhIGhpZGRlbiB0eXBlIHdpdGgNCisJCSAgICAgdGhlIFNPQVAvWE1MIHJlcXVlc3QgbWVzc2FnZSBhcyBhIHZhbHVlIGF0dHJpYnV0ZSB0aGF0DQorCQkgICAgIHRyaWdnZXJzIHRoZSBzZXJ2ZXIncyBvcGVyYXRpb24gKGY6Zm9ybTEgaW4gdGhpcyBleGFtcGxlKS4NCisJCSAgICAgVGhlIG90aGVyIGZvcm0gdmFsdWVzIGFyZSBwYXNzZWQgYXMgTUlNRSBhdHRhY2htZW50cyB0bw0KKwkJICAgICB0aGUgb3BlcmF0aW9uLiBUaGUgb3BlcmF0aW9uIHJldHVybnMgYSBTT0FQL1hNTCByZXNwb25zZQ0KKwkJICAgICBtZXNzYWdlLCB1bmxlc3MgaXRzIGRlZmluZWQgYXMgYSBhc3luY2hyb25vdXMgb25lLXdheQ0KKwkJICAgICBtZXNzYWdlLiBJbiB0aGF0IGNhc2UsIGNvZGUgY2FuIGJlIGFkZGVkIHRvIHJldHVybiBhDQorCQkgICAgIGN1c3RvbSAoZS5nLiBIVE1MKSByZXNwb25zZS4NCisJCS0tPg0KKwkJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlNPQVAiIHZhbHVlPSI8czpFbnZlbG9wZSB4bWxuczpzPSdodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyc+PHM6Qm9keT48Zjpmb3JtMSB4bWxuczpmPSd1cm46Zm9ybScvPjwvczpCb2R5PjwvczpFbnZlbG9wZT4iPg0KKwkJCTxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhIiB2YWx1ZT0iMSIgc2l6ZT0iOCIgdGFiaW5kZXg9IjEiPg0KKwkJCTxzZWxlY3QgbmFtZT0ibyIgc2l6ZT0iMSIgdGFiaW5kZXg9IjQiPg0KKwkJCQk8b3B0aW9uIHZhbHVlPSJhIj4rPC9vcHRpb24+DQorCQkJCTxvcHRpb24gdmFsdWU9InMiPi08L29wdGlvbj4NCisJCQkJPG9wdGlvbiB2YWx1ZT0ibSI+Kjwvb3B0aW9uPg0KKwkJCQk8b3B0aW9uIHZhbHVlPSJkIj4vPC9vcHRpb24+DQorCQkJPC9zZWxlY3Q+DQorCQkJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImIiIHZhbHVlPSIyIiBzaXplPSI4IiB0YWJpbmRleD0iMyI+PQ0KKwkJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdGFiaW5kZXg9IjQiPg0KKwkJPC9mb3JtPg0KKwk8L2JvZHk+DQorDQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvd2Vic2VydmVyL2NhbGNmb3JtMi5odG1sIGIvc2FtcGxlcy93ZWJzZXJ2ZXIvY2FsY2Zvcm0yLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhhOWI0ZgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvd2Vic2VydmVyL2NhbGNmb3JtMi5odG1sCkBAIC0wLDAgKzEsMzUgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKw0KKzxodG1sPg0KKw0KKwk8aGVhZD4NCisJCTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9SVNPLTg4NTktMSI+DQorCQk8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9IkFkb2JlIEdvTGl2ZSA2Ij4NCisJCTx0aXRsZT5TaW1wbGUgQ2FsY3VsYXRvciBXZWIgU2VydmljZSBVc2luZyBIVFRQIFBPU1QgbXVsdGlwYXJ0L2Zvcm0tZGF0YTwvdGl0bGU+DQorCTwvaGVhZD4NCisNCisJPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiI+DQorCQk8Zm9ybSBhY3Rpb249ImZvcm0iIG1ldGhvZD0icG9zdCIgbmFtZT0iQ2FsYyIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+DQorCQk8IS0tIFRoZSBmaXJzdCA8aW5wdXQ+IGZvcm0gZWxlbWVudCBtdXN0IGJlIGEgaGlkZGVuIHR5cGUgd2l0aA0KKwkJICAgICB0aGUgU09BUC9YTUwgcmVxdWVzdCBtZXNzYWdlIGFzIGEgdmFsdWUgYXR0cmlidXRlIHRoYXQNCisJCSAgICAgdHJpZ2dlcnMgdGhlIHNlcnZlcidzIG9wZXJhdGlvbiAoZjpmb3JtMiBpbiB0aGlzIGV4YW1wbGUpLg0KKwkJICAgICBUaGUgb3RoZXIgZm9ybSB2YWx1ZXMgYXJlIHBhc3NlZCBhcyBNSU1FIGF0dGFjaG1lbnRzIHRvDQorCQkgICAgIHRoZSBvcGVyYXRpb24uIFRoZSBvcGVyYXRpb24gcmV0dXJucyBhIFNPQVAvWE1MIHJlc3BvbnNlDQorCQkgICAgIG1lc3NhZ2UsIHVubGVzcyBpdHMgZGVmaW5lZCBhcyBhIGFzeW5jaHJvbm91cyBvbmUtd2F5DQorCQkgICAgIG1lc3NhZ2UuIEluIHRoYXQgY2FzZSwgY29kZSBjYW4gYmUgYWRkZWQgdG8gcmV0dXJuIGENCisJCSAgICAgY3VzdG9tIChlLmcuIEhUTUwpIHJlc3BvbnNlLg0KKwkJLS0+DQorCQkJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU09BUCIgdmFsdWU9IjxzOkVudmVsb3BlIHhtbG5zOnM9J2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvJz48czpCb2R5PjxmOmZvcm0yIHhtbG5zOmY9J3Vybjpmb3JtJy8+PC9zOkJvZHk+PC9zOkVudmVsb3BlPiI+DQorCQkJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImEiIHZhbHVlPSIxIiBzaXplPSI4IiB0YWJpbmRleD0iMSI+DQorCQkJPHNlbGVjdCBuYW1lPSJvIiBzaXplPSIxIiB0YWJpbmRleD0iNCI+DQorCQkJCTxvcHRpb24gdmFsdWU9ImEiPis8L29wdGlvbj4NCisJCQkJPG9wdGlvbiB2YWx1ZT0icyI+LTwvb3B0aW9uPg0KKwkJCQk8b3B0aW9uIHZhbHVlPSJtIj4qPC9vcHRpb24+DQorCQkJCTxvcHRpb24gdmFsdWU9ImQiPi88L29wdGlvbj4NCisJCQk8L3NlbGVjdD4NCisJCQk8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYiIgdmFsdWU9IjIiIHNpemU9IjgiIHRhYmluZGV4PSIzIj49DQorCQkJPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0IiB0YWJpbmRleD0iNCI+DQorCQk8L2Zvcm0+DQorCTwvYm9keT4NCisNCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy93ZWJzZXJ2ZXIvY2FsY2dldC5odG1sIGIvc2FtcGxlcy93ZWJzZXJ2ZXIvY2FsY2dldC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2Y2Y1NjgKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3dlYnNlcnZlci9jYWxjZ2V0Lmh0bWwKQEAgLTAsMCArMSwyMiBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorDQorPGh0bWw+DQorDQorCTxoZWFkPg0KKwkJPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD1JU08tODg1OS0xIj4NCisJCTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iQWRvYmUgR29MaXZlIDYiPg0KKwkJPHRpdGxlPlNpbXBsZSBDYWxjdWxhdG9yIFdlYiBTZXJ2aWNlIFVzaW5nIEhUVFAgR0VUPC90aXRsZT4NCisJPC9oZWFkPg0KKw0KKwk8Ym9keSBiZ2NvbG9yPSIjZmZmZmZmIj4NCisJCTxmb3JtIGFjdGlvbj0iY2FsYyIgbWV0aG9kPSJnZXQiIG5hbWU9IkNhbGMiPg0KKwkJCTxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhIiB2YWx1ZT0iMSIgc2l6ZT0iOCIgdGFiaW5kZXg9IjEiPjxzZWxlY3QgbmFtZT0ibyIgc2l6ZT0iMSIgdGFiaW5kZXg9IjQiPg0KKwkJCQk8b3B0aW9uIHZhbHVlPSJhIj4rPC9vcHRpb24+DQorCQkJCTxvcHRpb24gdmFsdWU9InMiPi08L29wdGlvbj4NCisJCQkJPG9wdGlvbiB2YWx1ZT0ibSI+Kjwvb3B0aW9uPg0KKwkJCQk8b3B0aW9uIHZhbHVlPSJkIj4vPC9vcHRpb24+DQorCQkJPC9zZWxlY3Q+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImIiIHZhbHVlPSIyIiBzaXplPSI4IiB0YWJpbmRleD0iMyI+PTxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdGFiaW5kZXg9IjQiPg0KKwkJPC9mb3JtPg0KKwk8L2JvZHk+DQorDQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvd2Vic2VydmVyL2NhbGNwb3N0Lmh0bWwgYi9zYW1wbGVzL3dlYnNlcnZlci9jYWxjcG9zdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NDA2MGEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3dlYnNlcnZlci9jYWxjcG9zdC5odG1sCkBAIC0wLDAgKzEsMjIgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKw0KKzxodG1sPg0KKw0KKwk8aGVhZD4NCisJCTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9SVNPLTg4NTktMSI+DQorCQk8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9IkFkb2JlIEdvTGl2ZSA2Ij4NCisJCTx0aXRsZT5TaW1wbGUgQ2FsY3VsYXRvciBXZWIgU2VydmljZSBVc2luZyBIVFRQIFBPU1Q8L3RpdGxlPg0KKwk8L2hlYWQ+DQorDQorCTxib2R5IGJnY29sb3I9IiNmZmZmZmYiPg0KKwkJPGZvcm0gYWN0aW9uPSJjYWxjIiBtZXRob2Q9InBvc3QiIG5hbWU9IkNhbGMiPg0KKwkJCTxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhIiB2YWx1ZT0iMSIgc2l6ZT0iOCIgdGFiaW5kZXg9IjEiPjxzZWxlY3QgbmFtZT0ibyIgc2l6ZT0iMSIgdGFiaW5kZXg9IjQiPg0KKwkJCQk8b3B0aW9uIHZhbHVlPSJhIj4rPC9vcHRpb24+DQorCQkJCTxvcHRpb24gdmFsdWU9InMiPi08L29wdGlvbj4NCisJCQkJPG9wdGlvbiB2YWx1ZT0ibSI+Kjwvb3B0aW9uPg0KKwkJCQk8b3B0aW9uIHZhbHVlPSJkIj4vPC9vcHRpb24+DQorCQkJPC9zZWxlY3Q+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImIiIHZhbHVlPSIyIiBzaXplPSI4IiB0YWJpbmRleD0iMyI+PTxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdGFiaW5kZXg9IjQiPg0KKwkJPC9mb3JtPg0KKwk8L2JvZHk+DQorDQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvd2Vic2VydmVyL2NoZWNrZWQuZ2lmIGIvc2FtcGxlcy93ZWJzZXJ2ZXIvY2hlY2tlZC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI3NmI5YQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvd2Vic2VydmVyL2NoZWNrZWQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvd2Vic2VydmVyL2NsaWVudC5wZW0gYi9zYW1wbGVzL3dlYnNlcnZlci9jbGllbnQucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhODgyYTEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3dlYnNlcnZlci9jbGllbnQucGVtCkBAIC0wLDAgKzEsNjEgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRHNUQ0NBeHFnQXdJQkFnSUJCekFOQmdrcWhraUc5dzBCQVFVRkFEQ0JqekVMTUFrR0ExVUVCaE1DVlZNeAorQ3pBSkJnTlZCQWdUQWtaTU1SUXdFZ1lEVlFRSEV3dFVZV3hzWVdoaGMzTmxaVEVXTUJRR0ExVUVDaE1OUjJWdQorYVhacFlTd2dTVzVqTGpFTE1Ba0dBMVVFQ3hNQ1NWUXhGREFTQmdOVkJBTVRDMmRsYm1sMmFXRXVZMjl0TVNJdworSUFZSktvWklodmNOQVFrQkZoTmpiMjUwWVdOMFFHZGxibWwyYVdFdVkyOXRNQjRYRFRBMU1USXlOREU1TXpFMQorTTFvWERUQTRNVEl5TXpFNU16RTFNMW93Z1kweEN6QUpCZ05WQkFZVEFsVlRNUXN3Q1FZRFZRUUlFd0pHVERFVQorTUJJR0ExVUVCeE1MVkdGc2JHRm9ZWE56WldVeEZqQVVCZ05WQkFvVERVZGxibWwyYVdFc0lFbHVZeTR4Q3pBSgorQmdOVkJBc1RBa2xVTVJJd0VBWURWUVFERXdsc2IyTmhiR2h2YzNReElqQWdCZ2txaGtpRzl3MEJDUUVXRTJOdgorYm5SaFkzUkFaMlZ1YVhacFlTNWpiMjB3Z1o4d0RRWUpLb1pJaHZjTkFRRUJCUUFEZ1kwQU1JR0pBb0dCQUtLeAorQk9JaklEKytLNmduaW5GaGJCSUtaTUM2QnVRVGtnT3JROUJ3RlRwa25Hbit0alNyNE9KZGtkeXZPVE5DS29VVworNUJ3M3RyTHVFRkpEU0FGUWFOYW1WTE1pdW9WNEZWb0VTZ1ByQ0k4VW9aQlAzS1RGWGxITGJ2a0o4QUxrOG9uagorQU9kQnRlSEpkNEZ2RytESy96dXVIdG1FUkhqaUwza2ZZQXdtSmU4VEFnTUJBQUdqZ2dFYk1JSUJGekFKQmdOVgorSFJNRUFqQUFNQ3dHQ1dDR1NBR0crRUlCRFFRZkZoMVBjR1Z1VTFOTUlFZGxibVZ5WVhSbFpDQkRaWEowYVdacAorWTJGMFpUQWRCZ05WSFE0RUZnUVVxSjdwWDFhZnlGUDRKcVJpKzFYMlY4QjhLQ293Z2J3R0ExVWRJd1NCdERDQgorc1lBVTRNeUlpMEdnSVVxa1lSaG5KMkdneVVtVmQ4cWhnWldrZ1pJd2dZOHhDekFKQmdOVkJBWVRBbFZUTVFzdworQ1FZRFZRUUlFd0pHVERFVU1CSUdBMVVFQnhNTFZHRnNiR0ZvWVhOelpXVXhGakFVQmdOVkJBb1REVWRsYm1sMgorYVdFc0lFbHVZeTR4Q3pBSkJnTlZCQXNUQWtsVU1SUXdFZ1lEVlFRREV3dG5aVzVwZG1saExtTnZiVEVpTUNBRworQ1NxR1NJYjNEUUVKQVJZVFkyOXVkR0ZqZEVCblpXNXBkbWxoTG1OdmJZSUJBREFOQmdrcWhraUc5dzBCQVFVRgorQUFPQmdRQmZzQ2FRYitBTGZqV0dySDBoS0VzZmw2QXVYa3RIelN2L041RDBVVEU3UFR4M09BdlRlWExOVGZYeAorQ2ZrVDBuZlZ0WU9LMlJaaXlsaVJxQ0xrcEpGMTU5bmJuZ01ETzFHd1hwdUtuRXY2ZmNOQWcwUEU5SmJmZTRHTworbjFSSVlKSitoMXVVdDcxWEtGc3d6ZzRud21COGxrdVo5aWtlREE3bkR6YWdicUVYcGc9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorUHJvYy1UeXBlOiA0LEVOQ1JZUFRFRAorREVLLUluZm86IERFUy1FREUzLUNCQyxBMkFFRUJDQUIxQkFCOEE3CisKK3FpMlg3VmFaRVpaVjVZZEJJQ1RFd1YwUnQ2bjZLT1FNWlJkQXJMR054dXVmTFRQbjByejZKY3VSK29mOXJ4SXoKK2tUSy82U0dzVVpuTUg1bzRsdWFiZUVPZTdEdGNBdXVEVDAwbEJSWGNUeElSdkF5aXd0UkRNa1RVdUdiTkVNRHMKKy82Rld6MXRXRURic1lyWXR6MGY3U2x5NmhrNmtoUFZqaUV0VW1Lem5HaVgzMUxCWlFGSjA5ME1UT3JvRG1BWUYKK1hNTkZBdmVYaUxENzhIVjcrd05oQmhZZVZ3bWtQRldLdTNqcEVaMDkrbURkbVEweU9JMloyZWppaU9iaWxxY28KK252cDd0dDhnelFheUI0OEJPTXlNTWZwMTZVK01QdFdzZkhUL1pnZ0F2dDk5cyt3dWFzYWF6UGJGVU11dW1oUXUKK09sbzV5V0JUVUVxaHVZell6bFJSWWJiM21BdTFBVko2NFgwa08vWHQxL0U0NkYrZmxJSTVhRk1RU3EyYWlodEoKK3VzMlBDWFoyUk1sV3lsTWdkY3pjckV3emthU3pLbEJTWC9NVzRjc05FY29GcE5Yb2VrWUhtekRVSFFodlBpaFAKKzNha21TMWRaL2NZNWhTMUljSWIrWVg2S1BNdmhHUHIyVUhub2hRRlMxWDZrOWliSGxpOHAwd0JnTUE1K2M0aTcKK2RpdjJIVElGdlhDbTBza2JaTzUzNFYxMUN0aXg3NXowWm1Jd2NibisrWXRuMktTV3l6ME43RE5sRzJxYVhLc2QKK1ZWREhva0RTUFNpcndrQXVicFFITGhsT01ieTA0cFBCVkVkL0RaS3ZlT3Qwc3RXRHJveGtVY0d2YjVBTC9jREIKKzJQL2g2MEpBZURHUVl2MFo4ZU9rQTFaVlh5cm1wUFFQQWNkaEZuYTB3TWIrSmJtTXJuRHJ0RUVLeFgxTGVmekIKK202SU5tRWo1RnZ2WU04SkZNdk1Bc2RyOHNka0xwZkRsZlFTNDhRdUxYWERQeVNBYlc2SWlabGVpdUkzaGtYNWYKK1JIRWVFQzg1V1pWb2xsOS8ra25CVzZsbnVmaG9GVVY3U1Q3WE5uUzFQZUhnWnpSQmlQSkdNdz09CistLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEaGpDQ0F1K2dBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVVGQURDQmp6RUxNQWtHQTFVRUJoTUNWVk14CitDekFKQmdOVkJBZ1RBa1pNTVJRd0VnWURWUVFIRXd0VVlXeHNZV2hoYzNObFpURVdNQlFHQTFVRUNoTU5SMlZ1CithWFpwWVN3Z1NXNWpMakVMTUFrR0ExVUVDeE1DU1ZReEZEQVNCZ05WQkFNVEMyZGxibWwyYVdFdVkyOXRNU0l3CitJQVlKS29aSWh2Y05BUWtCRmhOamIyNTBZV04wUUdkbGJtbDJhV0V1WTI5dE1CNFhEVEEwTVRBd01qRTNNRGd3CitObG9YRFRBM01UQXdNakUzTURnd05sb3dnWTh4Q3pBSkJnTlZCQVlUQWxWVE1Rc3dDUVlEVlFRSUV3SkdUREVVCitNQklHQTFVRUJ4TUxWR0ZzYkdGb1lYTnpaV1V4RmpBVUJnTlZCQW9URFVkbGJtbDJhV0VzSUVsdVl5NHhDekFKCitCZ05WQkFzVEFrbFVNUlF3RWdZRFZRUURFd3RuWlc1cGRtbGhMbU52YlRFaU1DQUdDU3FHU0liM0RRRUpBUllUCitZMjl1ZEdGamRFQm5aVzVwZG1saExtTnZiVENCbnpBTkJna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBCitsNks5YkxNY3JKNkJ6KzhoeHlvbFNKeTVUZFpLbzhPbW1za1ArTkFKY3Q3YUdXYTMzdTJsa1orR2tvVW1MS1ovCityRE5wZ21ZVk5RbE9RQzRydDVvRHQ0QVVvajU4NEc4UEpLU1B3eW1KY1gwc2JmQjdrOHhSbUxPK3ZWZ1NVdkR1Cithc0xNV0o2UHNZSXVHaHA0QndPQWduWUFDVHpzZDZrU2VJc2VkOFhTeDdjQ0F3RUFBYU9CN3pDQjdEQWRCZ05WCitIUTRFRmdRVTRNeUlpMEdnSVVxa1lSaG5KMkdneVVtVmQ4b3dnYndHQTFVZEl3U0J0RENCc1lBVTRNeUlpMEdnCitJVXFrWVJobkoyR2d5VW1WZDhxaGdaV2tnWkl3Z1k4eEN6QUpCZ05WQkFZVEFsVlRNUXN3Q1FZRFZRUUlFd0pHCitUREVVTUJJR0ExVUVCeE1MVkdGc2JHRm9ZWE56WldVeEZqQVVCZ05WQkFvVERVZGxibWwyYVdFc0lFbHVZeTR4CitDekFKQmdOVkJBc1RBa2xVTVJRd0VnWURWUVFERXd0blpXNXBkbWxoTG1OdmJURWlNQ0FHQ1NxR1NJYjNEUUVKCitBUllUWTI5dWRHRmpkRUJuWlc1cGRtbGhMbU52YllJQkFEQU1CZ05WSFJNRUJUQURBUUgvTUEwR0NTcUdTSWIzCitEUUVCQlFVQUE0R0JBRm1iOWtWK0VEeDVPNGo3ZExNdTkwOW5GZ25CTDA2c2VwanF0QklJYlpZM0duQ2dlZnhLCitwMVM2SWYwMS9tZFY3OW5aR0psZGVnTTc3dHo0VklsenVJYXorMk5PK0dxYnI2RXJPUiszVUdPclJ1SDM5YU1UCisxRHZ3SFlwVTVHVStsRzFhV0hkUXA4dVo1eTRva01nM1o5SVo1bmlqa1VucENIUU8rcS84RnJNTAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy93ZWJzZXJ2ZXIvZGVzZWxlY3RlZC5naWYgYi9zYW1wbGVzL3dlYnNlcnZlci9kZXNlbGVjdGVkLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTZiYTU4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy93ZWJzZXJ2ZXIvZGVzZWxlY3RlZC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy93ZWJzZXJ2ZXIvZGg1MTIucGVtIGIvc2FtcGxlcy93ZWJzZXJ2ZXIvZGg1MTIucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNzA4ODAKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3dlYnNlcnZlci9kaDUxMi5wZW0KQEAgLTAsMCArMSw0IEBACistLS0tLUJFR0lOIERIIFBBUkFNRVRFUlMtLS0tLQorTUVZQ1FRRFliaEdOVlY2R294T1BzWCtyQk5HbWdmSnFoNytlMVBGajhJa2V0THFXdEEyZ2tYQUI5UEt4cmtEUQoranZ1RW9YRTRBNlBWUGZzdG1QL0VmNHVOZkNxTEFnRUMKKy0tLS0tRU5EIERIIFBBUkFNRVRFUlMtLS0tLQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy93ZWJzZXJ2ZXIvZmF2aWNvbi5naWYgYi9zYW1wbGVzL3dlYnNlcnZlci9mYXZpY29uLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTYwZmJkCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy93ZWJzZXJ2ZXIvZmF2aWNvbi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy93ZWJzZXJ2ZXIvZmF2aWNvbi5pY28gYi9zYW1wbGVzL3dlYnNlcnZlci9mYXZpY29uLmljbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDBmYzM4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy93ZWJzZXJ2ZXIvZmF2aWNvbi5pY28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy93ZWJzZXJ2ZXIvaWJscy5naWYgYi9zYW1wbGVzL3dlYnNlcnZlci9pYmxzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODc1M2QzCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy93ZWJzZXJ2ZXIvaWJscy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy93ZWJzZXJ2ZXIvaWJycy5naWYgYi9zYW1wbGVzL3dlYnNlcnZlci9pYnJzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Zjk3ZmVmCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy93ZWJzZXJ2ZXIvaWJycy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy93ZWJzZXJ2ZXIvaXRscy5naWYgYi9zYW1wbGVzL3dlYnNlcnZlci9pdGxzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmZiNTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy93ZWJzZXJ2ZXIvaXRscy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy93ZWJzZXJ2ZXIvaXRycy5naWYgYi9zYW1wbGVzL3dlYnNlcnZlci9pdHJzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjQzYzkxCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy93ZWJzZXJ2ZXIvaXRycy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy93ZWJzZXJ2ZXIvbHMuZ2lmIGIvc2FtcGxlcy93ZWJzZXJ2ZXIvbHMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZjAwNmUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3dlYnNlcnZlci9scy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy93ZWJzZXJ2ZXIvb2Jscy5naWYgYi9zYW1wbGVzL3dlYnNlcnZlci9vYmxzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTA5ZWE0Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy93ZWJzZXJ2ZXIvb2Jscy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy93ZWJzZXJ2ZXIvb2Jycy5naWYgYi9zYW1wbGVzL3dlYnNlcnZlci9vYnJzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGMzZmRmCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy93ZWJzZXJ2ZXIvb2Jycy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy93ZWJzZXJ2ZXIvb3B0LmggYi9zYW1wbGVzL3dlYnNlcnZlci9vcHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGUxNThjCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy93ZWJzZXJ2ZXIvb3B0LmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKworb3B0LmgKKworVG8gZ2VuZXJhdGUgc2VyaWFsaXplcnMgZm9yIG9wdGlvbnMuYy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMS0yMDA0LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzOgorR1BMIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyovCisKKyNtb2R1bGUgIm9wdCIKKworc3RydWN0IHRfX09wdGlvbgoreyBjaGFyICprZXk7CisgIGNoYXIgKnZhbDsKK307CmRpZmYgLS1naXQgYS9zYW1wbGVzL3dlYnNlcnZlci9vcHRpb25zLmMgYi9zYW1wbGVzL3dlYnNlcnZlci9vcHRpb25zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk1MzcxMwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvd2Vic2VydmVyL29wdGlvbnMuYwpAQCAtMCwwICsxLDQ0NCBAQAorLyoKKworb3B0aW9ucy5jCisKK1BhcnNlcyBjb21tYW5kIGxpbmUgb3B0aW9ucyBhbmQgcHJvdmlkZXMgb3B0aW9ucyBjb250cm9sIHBhbmVsIHdpdGggYW4KK2ludGVyYWN0aXZlIFdlYiBpbnRlcmZhY2UgZm9yIHRoZSBXZWIgc2VydmVyICh3ZWJzZXJ2ZXIuYykuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR3byBsaWNlbnNlczoKK0dQTCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqLworCisjZGVmaW5lIFNPQVBfTk9HTE9CQUwKKyNkZWZpbmUgU09BUF9GTUFDMyBzdGF0aWMKKyNpbmNsdWRlICJvcHRDLmMiCisjaW5jbHVkZSAib3B0aW9ucy5oIgorI2luY2x1ZGUgImh0dHBnZXQuaCIKKworI2lmZGVmIFdJTjMyCisjZGVmaW5lIE9QVElPTl9DSEFSICcvJworI2Vsc2UKKyNkZWZpbmUgT1BUSU9OX0NIQVIgJy0nCisjZW5kaWYKKworc3RydWN0IG9wdGlvbiAqY29weV9vcHRpb25zKGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdGlvbnMpOworaW50IHBhcnNlX29wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBzdHJ1Y3Qgb3B0aW9uICpvcHRpb25zKTsKK3ZvaWQgcXVlcnlfb3B0aW9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG9wdGlvbiAqb3B0aW9ucyk7CitpbnQgbG9hZF9vcHRpb25zKGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBvcHRpb24gKm9wdGlvbnMpOworaW50IHNhdmVfb3B0aW9ucyhjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3Qgb3B0aW9uICpvcHRpb25zKTsKK2ludCBodG1sX29wdGlvbnMoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBvcHRpb24gKm9wdGlvbnMpOworaW50IGh0bWxfZm9ybV9vcHRpb25zKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgb3B0aW9uICpvcHRpb25zKTsKK3N0YXRpYyBpbnQgc2V0X29wdGlvbihjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbCwgc3RydWN0IG9wdGlvbiAqb3B0aW9ucyk7CitzdGF0aWMgaW50IHNldF9zZWxlY3Rpb24oY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qgb3B0aW9uICpwKTsKK3N0YXRpYyBpbnQgZmluZF9zZWxlY3Rpb24oY29uc3QgY2hhciAqdmFsdWUsIGNvbnN0IGNoYXIgKnNlbGVjdGlvbnMpOworc3RhdGljIHZvaWQgcHJpbnRfdXNhZ2UoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBzdHJ1Y3Qgb3B0aW9uICpvcHRpb25zKTsKKworc3RydWN0IG9wdGlvbiAqY29weV9vcHRpb25zKGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdGlvbnMpCit7IHN0cnVjdCBvcHRpb24gKnA7CisgIGludCBuOworICBmb3IgKG4gPSAwOyBvcHRpb25zW25dLm5hbWU7IG4rKykKKyAgICA7CisgIHAgPSAoc3RydWN0IG9wdGlvbiopbWFsbG9jKChuICsgMSkgKiBzaXplb2Yoc3RydWN0IG9wdGlvbikpOworICBpZiAocCkKKyAgeyBmb3IgKG4gPSAwOyBvcHRpb25zW25dLm5hbWU7IG4rKykKKyAgICB7IHBbbl0ubmFtZSA9IG9wdGlvbnNbbl0ubmFtZTsKKyAgICAgIHBbbl0uc2VsZWN0aW9ucyA9IG9wdGlvbnNbbl0uc2VsZWN0aW9uczsKKyAgICAgIHBbbl0uc2VsZWN0ZWQgPSBvcHRpb25zW25dLnNlbGVjdGVkOworICAgICAgaWYgKG9wdGlvbnNbbl0udmFsdWUpCisgICAgICB7IHBbbl0udmFsdWUgPSAoY2hhciopbWFsbG9jKHN0cmxlbihvcHRpb25zW25dLnZhbHVlKSArIDEpOworICAgICAgICBzdHJjcHkocFtuXS52YWx1ZSwgb3B0aW9uc1tuXS52YWx1ZSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHBbbl0udmFsdWUgPSBOVUxMOworICAgIH0KKyAgICBwW25dLm5hbWUgPSBOVUxMOworICAgIHBbbl0uc2VsZWN0aW9ucyA9IE5VTEw7CisgICAgcFtuXS5zZWxlY3RlZCA9IDA7CisgICAgcFtuXS52YWx1ZSA9IE5VTEw7CisgIH0KKyAgcmV0dXJuIHA7Cit9CisKK3ZvaWQgZnJlZV9vcHRpb25zKHN0cnVjdCBvcHRpb24gKm9wdGlvbnMpCit7IGlmIChvcHRpb25zKQorICB7IHN0cnVjdCBvcHRpb24gKnA7CisgICAgZm9yIChwID0gb3B0aW9uczsgcC0+bmFtZTsgcCsrICkKKyAgICB7IGlmIChwLT52YWx1ZSkKKyAgICAgICAgZnJlZShwLT52YWx1ZSk7CisgICAgfQorICAgIGZyZWUob3B0aW9ucyk7CisgIH0KK30KKworaW50IHBhcnNlX29wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBzdHJ1Y3Qgb3B0aW9uICpvcHRpb25zKQoreyBpbnQgaTsKKyAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKKyAgeyBjb25zdCBjaGFyICprZXksICp2YWw7CisgICAga2V5ID0gYXJndltpXTsKKyAgICBpZiAoKmtleSA9PSBPUFRJT05fQ0hBUikKKyAgICB7IGludCBmbGFnID0gMTsKKyAgICAgIHdoaWxlIChmbGFnICYmICorK2tleSkKKyAgICAgIHsgaWYgKCprZXkgPT0gJz8nIHx8ICFzdHJjbXAoa2V5LCAiaGVscCIpKQorICAgICAgICB7IHByaW50X3VzYWdlKGFyZ2MsIGFyZ3YsIG9wdGlvbnMpOworCSAgcmV0dXJuIDE7CisgICAgICAgIH0KKwlpZiAoaSA8IGFyZ2MpCisJICB2YWwgPSBhcmd2W2kgKyAxXTsKKwllbHNlCisJICB2YWwgPSBOVUxMOworCXN3aXRjaCAoc2V0X29wdGlvbihrZXksIHZhbCwgb3B0aW9ucykpCisJeyBjYXNlIDI6CisJICAgIGkrKzsKKwkgIGNhc2UgMToKKwkgICAgZmxhZyA9IDA7CisJICBjYXNlIDA6CisJICAgIGJyZWFrOworCSAgY2FzZSAtMToKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG1pc3NpbmcgYXJndW1lbnQgdmFsdWUgZm9yIG9wdGlvbiAlYyVzXG4iLCBhcmd2WzBdLCBPUFRJT05fQ0hBUiwga2V5KTsKKwkgICAgcHJpbnRfdXNhZ2UoYXJnYywgYXJndiwgb3B0aW9ucyk7CisJICAgIHJldHVybiAxOworCSAgY2FzZSAtMjoKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHVua25vd24gb3B0aW9uICVjJXNcbiIsIGFyZ3ZbMF0sIE9QVElPTl9DSEFSLCBrZXkpOworCSAgICBwcmludF91c2FnZShhcmdjLCBhcmd2LCBvcHRpb25zKTsKKwkgICAgcmV0dXJuIDE7CisJfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChzZXRfb3B0aW9uKE5VTEwsIGtleSwgb3B0aW9ucykgPCAwKQorICAgICAgZnByaW50ZihzdGRlcnIsICIlczogaW52YWxpZCBhcmd1bWVudCAlc1xuIiwgYXJndlswXSwga2V5KTsKKyAgfQorICByZXR1cm4gMDsKK30KKwordm9pZCBxdWVyeV9vcHRpb25zKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgb3B0aW9uICpvcHRpb25zKQoreyBjaGFyICpzID0gcXVlcnkoc29hcCk7IC8qIGdldCBhcmd1bWVudHMgZnJvbSBxdWVyeSBzdHJpbmcgKi8KKyAgd2hpbGUgKHMpCisgIHsgY2hhciAqa2V5ID0gcXVlcnlfa2V5KHNvYXAsICZzKTsgLyogZGVjb2RlIG5leHQgcXVlcnkgc3RyaW5nIGtleSAqLworICAgIGNoYXIgKnZhbCA9IHF1ZXJ5X3ZhbChzb2FwLCAmcyk7IC8qIGRlY29kZSBuZXh0IHF1ZXJ5IHN0cmluZyB2YWx1ZSAqLworICAgIGlmIChrZXkpCisgICAgICBzZXRfb3B0aW9uKGtleSwgdmFsLCBvcHRpb25zKTsKKyAgfQorfQorCitpbnQgbG9hZF9vcHRpb25zKGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBvcHRpb24gKm9wdGlvbnMpCit7IHN0cnVjdCBzb2FwIHNvYXA7CisgIHNvYXBfaW5pdCgmc29hcCk7CisgIGlmIChmaWxlKQorICB7IHNvYXAucmVjdmZkID0gb3BlbihmaWxlLCBPX1JET05MWSk7CisgICAgaWYgKHNvYXAucmVjdmZkIDwgMCkKKyAgICB7IHNvYXBfZG9uZSgmc29hcCk7CisgICAgICByZXR1cm4gRU9GOworICAgIH0KKyAgfQorICBpZiAoIXNvYXBfYmVnaW5fcmVjdigmc29hcCkgJiYgIXNvYXBfZWxlbWVudF9iZWdpbl9pbigmc29hcCwgbmFtZSwgMSkpCisgIHsgc3RydWN0IHRfX09wdGlvbiB0OworICAgIHdoaWxlIChzb2FwX2luX3RfX09wdGlvbigmc29hcCwgIm9wdGlvbiIsICZ0LCBOVUxMKSkKKyAgICAgIGlmIChzZXRfb3B0aW9uKHQua2V5LCB0LnZhbCwgb3B0aW9ucykgPCAwKQorICAgICAgICA7IC8qIGVycm9yLCBqdXN0IGlnbm9yZSBmb3Igbm93ICovCisgICAgaWYgKCFzb2FwX2VsZW1lbnRfZW5kX2luKCZzb2FwLCBuYW1lKSkKKyAgICAgIHNvYXBfZW5kX3JlY3YoJnNvYXApOworICB9CisgIGlmIChmaWxlKQorICAgIGNsb3NlKHNvYXAucmVjdmZkKTsKKyAgc29hcF9lbmQoJnNvYXApOworICBzb2FwX2RvbmUoJnNvYXApOworICByZXR1cm4gc29hcC5lcnJvcjsKK30KKworaW50IHNhdmVfb3B0aW9ucyhjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3Qgb3B0aW9uICpvcHRpb25zKQoreyBzdHJ1Y3Qgc29hcCBzb2FwOworICBzb2FwX2luaXQxKCZzb2FwLCBTT0FQX1hNTF9UUkVFKTsKKyAgc29hcC5uYW1lc3BhY2VzID0gTlVMTDsKKyAgc29hcC5lbmNvZGluZ1N0eWxlID0gTlVMTDsKKyAgaWYgKGZpbGUpCisgIHsgc29hcC5zZW5kZmQgPSBvcGVuKGZpbGUsIE9fQ1JFQVQgfCBPX1dST05MWSk7CisgICAgaWYgKHNvYXAuc2VuZGZkIDwgMCkKKyAgICB7IHNvYXBfZG9uZSgmc29hcCk7CisgICAgICByZXR1cm4gRU9GOworICAgIH0KKyAgfQorICBpZiAoIXNvYXBfYmVnaW5fc2VuZCgmc29hcCkgJiYgIXNvYXBfZWxlbWVudF9iZWdpbl9vdXQoJnNvYXAsIG5hbWUsIDAsIE5VTEwpKQorICB7IHN0cnVjdCBvcHRpb24gKnA7CisgICAgc3RydWN0IHRfX09wdGlvbiB0OworICAgIGZvciAocCA9IG9wdGlvbnM7IHAtPm5hbWU7IHArKykKKyAgICB7IHQudmFsID0gTlVMTDsKKyAgICAgIGlmICghcC0+bmFtZVswXSkKKyAgICAgIHsgaWYgKCFwLT52YWx1ZSkKKyAgICAgICAgICBjb250aW51ZTsKKwl0LmtleSA9IE5VTEw7CisJdC52YWwgPSBwLT52YWx1ZTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHAtPm5hbWVbMV0gPT0gJy4nKQorICAgICAgICB0LmtleSA9IChjaGFyKilwLT5uYW1lICsgMjsKKyAgICAgIGVsc2UKKyAgICAgICAgdC5rZXkgPSAoY2hhciopcC0+bmFtZTsKKyAgICAgIGlmIChwLT5zZWxlY3Rpb25zICYmIHN0cmNocihwLT5zZWxlY3Rpb25zLCAnICcpKQorICAgICAgeyBjb25zdCBjaGFyICpzID0gcC0+c2VsZWN0aW9ucyAtIDE7CisgICAgICAgIGNoYXIgKnI7CisJaW50IGk7CisgICAgICAgIGZvciAoaSA9IHAtPnNlbGVjdGVkOyBpID4gMDsgaS0tKQorICAgICAgICB7IHMgPSBzdHJjaHIocyArIDEsICcgJyk7CisJICBpZiAoIXMpCisJICAgIGJyZWFrOworCX0KKyAgICAgICAgaWYgKHMpCisJeyB0LnZhbCA9IHNvYXBfc3RyZHVwKCZzb2FwLCBzICsgMSk7CisgICAgICAgICAgciA9IHN0cmNocih0LnZhbCwgJyAnKTsKKwkgIGlmIChyKQorCSAgICAqciA9ICdcMCc7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHAtPnZhbHVlKQorICAgICAgICB0LnZhbCA9IHAtPnZhbHVlOworICAgICAgZWxzZSBpZiAoIXAtPnNlbGVjdGVkKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGlmIChzb2FwX291dF90X19PcHRpb24oJnNvYXAsICJvcHRpb24iLCAwLCAmdCwgTlVMTCkpCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIXNvYXBfZWxlbWVudF9lbmRfb3V0KCZzb2FwLCBuYW1lKSkKKyAgICAgIHNvYXBfZW5kX3NlbmQoJnNvYXApOworICB9CisgIGlmIChmaWxlKQorICAgIGNsb3NlKHNvYXAuc2VuZGZkKTsKKyAgc29hcF9lbmQoJnNvYXApOworICBzb2FwX2RvbmUoJnNvYXApOworICByZXR1cm4gc29hcC5lcnJvcjsKK30KKworaW50IGh0bWxfb3B0aW9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG9wdGlvbiAqb3B0aW9ucykKK3sgc3RydWN0IG9wdGlvbiAqcDsKKyAgc29hcF9zZW5kKHNvYXAsICI8dGFibGUgYm9yZGVyPScwJyBjZWxsc3BhY2luZz0nMCcgY2VsbHBhZGRpbmc9JzAnIGJnY29sb3I9JyM2NjY2NjYnIG5vc2F2ZT5cbiIpOworICBzb2FwX3NlbmQoc29hcCwgIjx0ciBoZWlnaHQ9JzEwJz48dGQgYmFja2dyb3VuZD0nYnRsLmdpZic+PC90ZD48dGQgYmFja2dyb3VuZD0nYnQuZ2lmJz48L3RkPjx0ZCBiYWNrZ3JvdW5kPSdidC5naWYnPjwvdGQ+PHRkIGJhY2tncm91bmQ9J2J0LmdpZic+PC90ZD48dGQgYmFja2dyb3VuZD0nYnQuZ2lmJz48L3RkPjx0ZCBiYWNrZ3JvdW5kPSdidC5naWYnPjwvdGQ+PHRkIHdpZHRoPScxMCcgYmFja2dyb3VuZD0nYnRyLmdpZic+PC90ZD48dGQgd2lkdGg9JzEwJyBoZWlnaHQ9JzEwJyBiYWNrZ3JvdW5kPSdvYmxzLmdpZic+PC90ZD48L3RyPiIpOworICBmb3IgKHAgPSBvcHRpb25zOyBwLT5uYW1lOyBwKyspCisgIHsgY29uc3QgY2hhciAqcywgKnQsICpuOworICAgIGludCBpOworICAgIG4gPSBwLT5uYW1lOworICAgIGlmIChuWzBdICYmIG5bMV0gPT0gJy4nKQorICAgICAgbiArPSAyOworICAgIHMgPSBwLT5zZWxlY3Rpb25zOworICAgIHNvYXBfc2VuZChzb2FwLCAiPHRyPjx0ZCBiYWNrZ3JvdW5kPSdibC5naWYnPjwvdGQ+PHRkIGFsaWduPSdyaWdodCc+Iik7CisgICAgaWYgKCFuWzBdKQorICAgIHsgaWYgKHMpCisgICAgICAgIHNvYXBfc2VuZChzb2FwLCBzKTsKKyAgICAgIHNvYXBfc2VuZChzb2FwLCAiPC90ZD48dGQ+PC90ZD48dGQ+PC90ZD48dGQ+PC90ZD48dGQ+Iik7CisgICAgICBpZiAocC0+dmFsdWUpCisgICAgICAgIHNvYXBfc2VuZChzb2FwLCBwLT52YWx1ZSk7CisgICAgICBzb2FwX3NlbmQoc29hcCwgIjwvdGQ+Iik7CisgICAgfQorICAgIGVsc2UgaWYgKCFzKQorICAgIHsgc29hcF9zZW5kKHNvYXAsIG4pOworICAgICAgc29hcF9zZW5kKHNvYXAsICI8L3RkPjx0ZCB3aWR0aD0nMTAnIGJhY2tncm91bmQ9J2xzLmdpZic+PC90ZD48dGQgYmdjb2xvcj0nI0ZGRkZGRic+PGEgaHJlZj0nPyIpOworICAgICAgc29hcF9zZW5kKHNvYXAsIG4pOworICAgICAgaWYgKHAtPnNlbGVjdGVkKQorICAgICAgICBzb2FwX3NlbmQoc29hcCwgIj0nPjxpbWcgc3JjPSdjaGVja2VkLmdpZicgYWxpZ249J2Fic21pZGRsZScgYm9yZGVyPScwJz48L2E+PC90ZD48dGQgd2lkdGg9JzEwJyBiYWNrZ3JvdW5kPSdycy5naWYnPjwvdGQ+PHRkPm9uPC90ZD4iKTsKKyAgICAgIGVsc2UKKyAgICAgICAgc29hcF9zZW5kKHNvYXAsICInPjxpbWcgc3JjPSd1bmNoZWNrZWQuZ2lmJyBhbGlnbj0nYWJzbWlkZGxlJyBib3JkZXI9JzAnPjwvYT48L3RkPjx0ZCB3aWR0aD0nMTAnIGJhY2tncm91bmQ9J3JzLmdpZic+PC90ZD48dGQ+b2ZmPC90ZD4iKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc3RyY2hyKHMsICcgJykpCisgICAgeyBzb2FwX3NlbmQoc29hcCwgbik7CisgICAgICBzb2FwX3NlbmQoc29hcCwgIjwvdGQ+Iik7CisgICAgICBmb3IgKGkgPSAwOyA7IGkrKykKKyAgICAgIHsgdCA9IHN0cmNocihzLCAnICcpOworICAgICAgICBpZiAoaSA9PSAwKQorCSAgc29hcF9zZW5kKHNvYXAsICI8dGQgd2lkdGg9JzEwJyBiYWNrZ3JvdW5kPSdscy5naWYnPjwvdGQ+PHRkIGJnY29sb3I9JyNGRkZGRkYnPiIpOworICAgICAgICBlbHNlCisJICBzb2FwX3NlbmQoc29hcCwgIjx0cj48dGQgYmFja2dyb3VuZD0nYmwuZ2lmJz48L3RkPjx0ZD48L3RkPjx0ZCB3aWR0aD0nMTAnIGJhY2tncm91bmQ9J2xzLmdpZic+PC90ZD48dGQgYmdjb2xvcj0nI0ZGRkZGRic+Iik7CisgICAgICAgIGlmIChpID09IHAtPnNlbGVjdGVkKQorICAgICAgICAgIHNvYXBfc2VuZChzb2FwLCAiPGltZyBzcmM9J3NlbGVjdGVkLmdpZicgYWxpZ249J2Fic21pZGRsZScgYm9yZGVyPScwJz48L3RkPjx0ZCB3aWR0aD0nMTAnIGJhY2tncm91bmQ9J3JzLmdpZic+PC90ZD48dGQ+Iik7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyBzb2FwX3NlbmQoc29hcCwgIjxhIGhyZWY9Jz8iKTsKKyAgICAgICAgICBzb2FwX3NlbmQoc29hcCwgbik7CisgICAgICAgICAgc29hcF9zZW5kKHNvYXAsICI9Iik7CisgICAgICAgICAgaWYgKHQpCisgICAgICAgICAgICBzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBzb2FwX3NlbmQoc29hcCwgcyk7CisgICAgICAgICAgc29hcF9zZW5kKHNvYXAsICInPiIpOworICAgICAgICAgIHNvYXBfc2VuZChzb2FwLCAiPGltZyBzcmM9J2Rlc2VsZWN0ZWQuZ2lmJyBhbGlnbj0nYWJzbWlkZGxlJyBib3JkZXI9JzAnPjwvYT48L3RkPjx0ZCB3aWR0aD0nMTAnIGJhY2tncm91bmQ9J3JzLmdpZic+PC90ZD48dGQ+Iik7CisJfQorICAgICAgICBpZiAodCkKKyAgICAgICAgICBzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHNvYXBfc2VuZChzb2FwLCBzKTsKKyAgICAgICAgc29hcF9zZW5kKHNvYXAsICI8L3RkPiIpOworICAgICAgICBpZiAoIXQpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHNvYXBfc2VuZChzb2FwLCAiPHRkIHdpZHRoPScxMCcgYmFja2dyb3VuZD0nYnIuZ2lmJz48L3RkPjx0ZCB3aWR0aD0nMTAnIGJhY2tncm91bmQ9J2xzLmdpZic+PC90ZD48L3RyPlxuIik7CisgICAgICAgIHMgPSB0ICsgMTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgY2hhciBidWZbMTZdOworICAgICAgc29hcF9zZW5kKHNvYXAsIG4pOworICAgICAgc29hcF9zZW5kKHNvYXAsICI8L3RkPjx0ZCB3aWR0aD0nMTAnIGJhY2tncm91bmQ9J2xzLmdpZic+PC90ZD48dGQgYmdjb2xvcj0nI0ZGRkZGRic+Jm5ic3A7PC90ZD48dGQgd2lkdGg9JzEwJyBiYWNrZ3JvdW5kPSdycy5naWYnPjwvdGQ+PHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSciKTsKKyAgICAgIHNvYXBfc2VuZChzb2FwLCBuKTsKKyAgICAgIHNvYXBfc2VuZChzb2FwLCAiJyB2YWx1ZT0nIik7CisgICAgICBpZiAocC0+dmFsdWUpCisgICAgICAgIHNvYXBfc2VuZChzb2FwLCBwLT52YWx1ZSk7CisgICAgICBzb2FwX3NlbmQoc29hcCwgIicgc2l6ZT0nIik7CisgICAgICBzcHJpbnRmKGJ1ZiwgIiVkIiwgcC0+c2VsZWN0ZWQgPiAwID8gcC0+c2VsZWN0ZWQgOiAyNCk7CisgICAgICBzb2FwX3NlbmQoc29hcCwgYnVmKTsKKyAgICAgIHNvYXBfc2VuZChzb2FwLCAiJz48aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nU2V0ICIpOworICAgICAgc29hcF9zZW5kKHNvYXAsIHMpOworICAgICAgc29hcF9zZW5kKHNvYXAsICInPjwvdGQ+Iik7CisgICAgfQorICAgIHNvYXBfc2VuZChzb2FwLCAiPHRkIHdpZHRoPScxMCcgYmFja2dyb3VuZD0nYnIuZ2lmJz48L3RkPjx0ZCB3aWR0aD0nMTAnIGJhY2tncm91bmQ9J2xzLmdpZic+PC90ZD48L3RyPlxuIik7CisgICAgLy8gPHRyIGhlaWdodD0nMSc+PHRkIGhlaWdodD0nMScgYmFja2dyb3VuZD0nYmwuZ2lmJz48L3RkPjx0ZD48L3RkPjx0ZD48L3RkPjx0ZD48L3RkPjx0ZD48L3RkPjx0ZCB3aWR0aD0nMTAnIGhlaWdodD0nMScgYmFja2dyb3VuZD0nYnIuZ2lmJz48L3RkPjx0ZCB3aWR0aD0nMTAnIGhlaWdodD0nMScgYmFja2dyb3VuZD0nbHMuZ2lmJz48L3RkPjwvdHI+XG4iKTsKKyAgfQorICBzb2FwX3NlbmQoc29hcCwgIjx0ciBoZWlnaHQ9JzEwJz48dGQgYmFja2dyb3VuZD0nYmJsLmdpZic+PC90ZD48dGQgYmFja2dyb3VuZD0nYmIuZ2lmJz48L3RkPjx0ZCBiYWNrZ3JvdW5kPSdiYi5naWYnPjwvdGQ+PHRkIGJhY2tncm91bmQ9J2JiLmdpZic+PC90ZD48dGQgYmFja2dyb3VuZD0nYmIuZ2lmJz48L3RkPjx0ZCBiYWNrZ3JvdW5kPSdiYi5naWYnPjwvdGQ+PHRkIHdpZHRoPScxMCcgYmFja2dyb3VuZD0nYmJyLmdpZic+PHRkIHdpZHRoPScxMCcgaGVpZ2h0PScxMCcgYmFja2dyb3VuZD0nbHMuZ2lmJzwvdGQ+PC90cj5cbjx0ciBoZWlnaHQ9JzEwJz48dGQgd2lkdGg9JzEwJyBoZWlnaHQ9JzEwJyBiYWNrZ3JvdW5kPW90cnMuZ2lmPjwvdGQ+PHRkIGhlaWdodD0nMTAnIGJhY2tncm91bmQ9J3RzLmdpZic+PC90ZD48dGQgaGVpZ2h0PScxMCcgYmFja2dyb3VuZD0ndHMuZ2lmJz48L3RkPjx0ZCBoZWlnaHQ9JzEwJyBiYWNrZ3JvdW5kPSd0cy5naWYnPjwvdGQ+PHRkIGhlaWdodD0nMTAnIGJhY2tncm91bmQ9J3RzLmdpZic+PC90ZD48dGQgaGVpZ2h0PScxMCcgYmFja2dyb3VuZD0ndHMuZ2lmJz48L3RkPjx0ZCBoZWlnaHQ9JzEwJyBiYWNrZ3JvdW5kPSd0cy5naWYnPjwvdGQ+PHRkIHdpZHRoPScxMCcgaGVpZ2h0PScxMCcgYmFja2dyb3VuZD0nb3Rscy5naWYnPjwvdGQ+PC90cj5cbjwvdGFibGU+XG4iKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK2ludCBodG1sX2Zvcm1fb3B0aW9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG9wdGlvbiAqb3B0aW9ucykKK3sgc29hcF9zZW5kKHNvYXAsICI8Zm9ybSBhY3Rpb249JycgbWV0aG9kPSdnZXQnIG5hbWU9J2Zvcm0nPiIpOworICBodG1sX29wdGlvbnMoc29hcCwgb3B0aW9ucyk7CisgIHJldHVybiBzb2FwX3NlbmQoc29hcCwgIjwvZm9ybT4iKTsKK30KKworc3RhdGljIGludCBzZXRfb3B0aW9uKGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qgb3B0aW9uICpvcHRpb25zKQoreyBzdHJ1Y3Qgb3B0aW9uICpwOworICBpZiAoIWtleSkKKyAgeyBmb3IgKHAgPSBvcHRpb25zOyBwLT5uYW1lOyBwKyspCisgICAgeyBpZiAoIXAtPm5hbWVbMF0pCisgICAgICB7IGlmIChwLT52YWx1ZSkKKyAgICAgICAgeyBjaGFyICpzID0gKGNoYXIqKW1hbGxvYyhzdHJsZW4ocC0+dmFsdWUpICsgc3RybGVuKHZhbCkgKyAxKTsKKwkgIGlmIChzKQorCSAgeyBzdHJjcHkocywgcC0+dmFsdWUpOworCSAgICBzdHJjYXQocywgIiAiKTsKKwkgICAgc3RyY2F0KHMsIHZhbCk7CisJICAgIGZyZWUoKHZvaWQqKXAtPnZhbHVlKTsKKwkgICAgcC0+dmFsdWUgPSBzOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgcC0+dmFsdWUgPSAoY2hhciopbWFsbG9jKHN0cmxlbih2YWwpICsgMSk7CisgICAgICAgICAgaWYgKHAtPnZhbHVlKQorICAgICAgICAgICAgc3RyY3B5KHAtPnZhbHVlLCB2YWwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAyOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTI7CisgIH0KKyAgZm9yIChwID0gb3B0aW9uczsgcC0+bmFtZTsgcCsrKQorICB7IGlmIChwLT5uYW1lWzBdICYmICgocC0+bmFtZVsxXSA9PSAnLicgJiYgIXN0cmNtcChrZXksIHAtPm5hbWUgKyAyKSkgfHwgKHAtPm5hbWVbMV0gIT0gJy4nICYmICFzdHJjbXAoa2V5LCBwLT5uYW1lKSkpKQorICAgIHsgaWYgKHAtPnNlbGVjdGlvbnMpCisgICAgICB7IGlmICghdmFsKQorICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKHNldF9zZWxlY3Rpb24odmFsLCBwKSA8IDApCisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gMjsKKyAgICAgIH0KKyAgICAgIGlmICh2YWwgJiYgISp2YWwpCisgICAgICB7IHAtPnNlbGVjdGVkID0gMDsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgICB9CisgICAgICBwLT5zZWxlY3RlZCA9IDE7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKyAgZm9yIChwID0gb3B0aW9uczsgcC0+bmFtZTsgcCsrKQorICB7IGlmIChwLT5uYW1lWzBdID09IGtleVswXSAmJiBwLT5uYW1lWzFdID09ICcuJykKKyAgICB7IGlmIChwLT5zZWxlY3Rpb25zKQorICAgICAgeyBjb25zdCBjaGFyICpzID0ga2V5ICsgMTsKKyAgICAgICAgaWYgKCFzWzBdKQorICAgICAgICB7IHMgPSB2YWw7CisgICAgICAgICAgaWYgKCFzKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChzZXRfc2VsZWN0aW9uKHMsIHApIDwgMCkKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChzID09IHZhbCkKKyAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgICBwLT5zZWxlY3RlZCA9IDE7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIC0yOworfQorCitzdGF0aWMgaW50IHNldF9zZWxlY3Rpb24oY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qgb3B0aW9uICpwKQoreyBpZiAoc3RyY2hyKHAtPnNlbGVjdGlvbnMsICcgJykpCisgICAgcmV0dXJuIHAtPnNlbGVjdGVkID0gZmluZF9zZWxlY3Rpb24odmFsLCBwLT5zZWxlY3Rpb25zKTsKKyAgaWYgKHAtPnZhbHVlKQorICAgIGZyZWUocC0+dmFsdWUpOworICBwLT52YWx1ZSA9IChjaGFyKiltYWxsb2Moc3RybGVuKHZhbCkgKyAxKTsKKyAgaWYgKHAtPnZhbHVlKQorICAgIHN0cmNweShwLT52YWx1ZSwgdmFsKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9zZWxlY3Rpb24oY29uc3QgY2hhciAqdmFsLCBjb25zdCBjaGFyICpzZWxlY3Rpb25zKQoreyBpbnQgaSA9IDA7CisgIGNvbnN0IGNoYXIgKnMgPSBzZWxlY3Rpb25zOworICBzaXplX3QgbiA9IHN0cmxlbih2YWwpOworICBmb3IgKDs7KQorICB7IGlmICghc3RybmNtcChzLCB2YWwsIG4pICYmIChzW25dID09ICcgJyB8fCBzW25dID09ICdcMCcpKQorICAgICAgcmV0dXJuIGk7CisgICAgcyA9IHN0cmNocihzLCAnICcpOworICAgIGlmICghcykKKyAgICAgIGJyZWFrOworICAgIHMrKzsKKyAgICBpKys7CisgIH0KKyAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBwcmludF91c2FnZShpbnQgYXJnYywgY2hhciAqKmFyZ3YsIHN0cnVjdCBvcHRpb24gKm9wdGlvbnMpCit7IHN0cnVjdCBvcHRpb24gKnA7CisgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIiwgYXJndlswXSk7CisgIGZvciAocCA9IG9wdGlvbnM7IHAtPm5hbWU7IHArKykKKyAgeyBpZiAocC0+bmFtZVswXSkKKyAgICB7IGludCBmbGFnID0gKHAtPm5hbWVbMV0gPT0gJy4nKTsKKyAgICAgIGlmIChwLT5zZWxlY3Rpb25zKQorICAgICAgeyBpZiAoc3RyY2hyKHAtPnNlbGVjdGlvbnMsICcgJykpCisgICAgICAgIHsgaWYgKGZsYWcpCisJICAgIGZwcmludGYoc3RkZXJyLCAiICVjJWNbJXNdIiwgT1BUSU9OX0NIQVIsIHAtPm5hbWVbMF0sIHAtPnNlbGVjdGlvbnMpOworICAgICAgICAgIGVsc2UKKwkgICAgZnByaW50ZihzdGRlcnIsICIgJWMlcyBbJXNdIiwgT1BUSU9OX0NIQVIsIHAtPm5hbWUsIHAtPnNlbGVjdGlvbnMpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGZsYWcpCisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgJWMlYzwlcz4iLCBPUFRJT05fQ0hBUiwgcC0+bmFtZVswXSwgcC0+c2VsZWN0aW9ucyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAlYyVzIDwlcz4iLCBPUFRJT05fQ0hBUiwgcC0+bmFtZSwgcC0+c2VsZWN0aW9ucyk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChmbGFnKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAlYyVjIiwgT1BUSU9OX0NIQVIsIHAtPm5hbWVbMF0pOworICAgICAgZWxzZQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAlYyVzIiwgT1BUSU9OX0NIQVIsIHAtPm5hbWUpOworICAgIH0KKyAgICBlbHNlIGlmIChwLT5zZWxlY3Rpb25zKQorICAgICAgZnByaW50ZihzdGRlcnIsICIgJXMiLCBwLT5zZWxlY3Rpb25zKTsKKyAgICBlbHNlCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAuLi4iKTsKKyAgfQorICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Cit9CisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvd2Vic2VydmVyL29wdGlvbnMuaCBiL3NhbXBsZXMvd2Vic2VydmVyL29wdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2VhN2M1Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy93ZWJzZXJ2ZXIvb3B0aW9ucy5oCkBAIC0wLDAgKzEsMTI0IEBACisvKgorCitvcHRpb25zLmgKKworQ29tbWFuZCBsaW5lIG9wdGlvbiBoYW5kbGVyIGZvciB3ZWJzZXJ2ZXIuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR3byBsaWNlbnNlczoKK0dQTCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJVGhlIG9wdGlvbiBzdHJ1Y3R1cmUgZGVmaW5lcyBhIHByb2dyYW0gb3B0aW9uIGFzIGZvbGxvd3M6CisJbmFtZQkJdGhlIG5hbWUgb2YgdGhlIG9wdGlvbiwgd2hpY2ggbWF5IGluY2x1ZGUgYSBwZXJpb2QgdG8KKwkJCWRlZmluZSBhIG9uZS1jaGFyYWN0ZXIgbmFtZSBmb3IgY29tbWFuZC1saW5lIG9wdGlvbnMKKwkJCShzaW5nbGUgY2hhcmFjdGVyIGZvbGxvd2VkIGJ5IGEgcGVyaW9kIGFuZCB0aGUgZnVsbAorCQkJbmFtZSkuIFRoZSBsYXN0IG9wdGlvbiBpbiBhbiBhcnJheSBNVVNUIGJlIE5VTEwuCisJCQlXaGVuIHRoZSBuYW1lIGlzIGVtcHR5ICgiIiksIHRoZW4gdGhpcyBvcHRpb24gaXMgdXNlZCB0bworCQkJY29sbGVjdCByZW1haW5pbmcgY29tbWFuZC1saW5lIGFyZ3VtZW50cywgc3VjaCBhcyBmaWxlCisJCQluYW1lcyBhbmQgc28gb24uCisJc2VsZWN0aW9uczoJZWl0aGVyIG11c3QgYmUgTlVMTCB0byBkZWZpbmUgYSBib29sZWFuIG9wdGlvbi4gSW4gdGhpcworCQkJCWNhc2Ugc2VsZWN0ZWQ9MCBpcyBmYWxzZSBhbmQgc2VsZWN0ZWQ9MSBpcyB0cnVlLgorCQkJb3IgYSBzcGFjZS1kZWxpbWl0ZWQgc3RyaW5nIG9mIG9wdGlvbiB2YWx1ZXMuIEluIHRoaXMKKwkJCQljYXNlICdzZWxlY3RlZCcgaXMgc2V0IHRvICMgd29yZCBpbiBsaXN0LgorCQkJb3IgYSBzaW5nbGUtd29yZCBkZXNjcmlwdGlvbiBmb3Igb3B0aW9uIHZhbHVlcy4gSW4gdGhpcworCQkJCWNhc2UgdGhlIGFyZ3VtZW50IGlzIHN0b3JlZCBpbiAndmFsdWUnIGZpZWxkLgorCXNlbGVjdGVkOgl3b3JkIGluZGV4IGluICdzZWxlY3Rpb25zJyBsaXN0LCBvciAwLzEgZm9yIGJvb2xlYW4KKwkJCW9wdGlvbiwgb3IgbWF4IGxlbmd0aCBvZiBzdHJpbmcgdmFsdWUgYSB1c2VyIGNhbiBlbnRlcgorCQkJKHNlZSBiZWxvdykuCisJdmFsdWU6CQl0aGUgKGRlZmF1bHQpIHN0cmluZyB2YWx1ZSBvZiBvcHRpb24KKworCUV4YW1wbGU6CisKKwlzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPQorCXsgeyAiYy5jb21wcmVzcyIsIE5VTEwgfSwJb24vb2ZmIG9wdGlvbiAoLWMgdHVybnMgaXQgb24pCisgIAkgIHsgImUuZW5kcG9pbnQiLCAiVVJMIiB9LCAJdGhpcyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQgdmFsdWUKKyAgCSAgeyAibmFtZSIsICJhbHBoYW51bSIsIDIwLCAiZGVtbyIgfSwKKwkgIAkJCQl0aGlzIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCB2YWx1ZS4KKwkJCQkJVGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSAiZGVtbyIuCisJCQkJCVRoZSBIVE1MIHNsb3Qgd2lsbCBiZSAyMCBjaGFycyB3aWRlLgorICAJICB7ICJhY3Rpb24iLCAic3RhcnQgZmluaXNoIiB9LCB0aGlzIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCAic3RhcnQiCisJICAJCQkJb3IgImZpbmlzaCIKKyAgCSAgeyAiIiwgImZpbGUxIGZpbGUyIC4uLiIgfSwJY29sbGVjdCByZW1haW5pbmcgYXJndW1lbnRzCisgIAkgIHsgTlVMTCB9LAkJCWVuZCBvZiB0YWJsZQorCX07CisKKwlGdW5jdGlvbmFsaXR5OgorCisJaW50IHBhcnNlX29wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBzdHJ1Y3Qgb3B0aW9uICpvcHRpb25zKQorCVBhcnNlcyBvcHRpb25zIGZyb20gdGhlIGNvbW1hbmQgbGluZSAoYXJnYywgYXJndikuIFdoZW4gdGhlIGNvbW1hbmQKKwlsaW5lIG9wdGlvbnMgaW5jbHVkZSB0aGUgJy0/JyBhbmQgJy1oZWxwJywgYSBkaWFnbm9zdGljICdVc2FnZTonCisJbWVzc2FnZSBpcyBwcm9kdWNlZCBhbmQgdGhlIGZ1bmN0aW9uIHJldHVybnMgMSBpbnN0ZWFkIG9mIGEgbm9ybWFsIDAKKwlyZXR1cm4gdmFsdWUuCisKKwl2b2lkIHF1ZXJ5X29wdGlvbnMoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBvcHRpb24gKm9wdGlvbnMpCisJUGFyc2VzIG9wdGlvbnMgZnJvbSB0aGUgSFRUUCBxdWVyeSBzdHJpbmcuIFRoaXMgcmVxdWlyZXMgbGlua2luZyB0aGUKKwlodHRwZ2V0IHBsdWdpbi4gVGhlIGZ1bmN0aW9uIGlzIG5vcm1hbGx5IGNhbGxlZCBpbiB0aGUgSFRUUCBHRVQgaGFuZGxlci4KKwkKKwlpbnQgc2F2ZV9vcHRpb25zKGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBvcHRpb24gKm9wdGlvbnMpCisJU2F2ZXMgYW4gYXJyYXkgb2Ygb3B0aW9ucyB0byBhIGZpbGUuIFRoZSBsYXN0IG9wdGlvbiBpbiB0aGUgJ29wdGlvbnMnCisJYXJyYXkgTVVTVCBoYXZlIGEgTlVMTCBuYW1lIHRvIGRlbGltaXQgdGhlIGFycmF5LiBPcHRpb25zIGFyZSBzYXZlZAorCWluIFhNTCBmb3JtYXQuCisKKwlpbnQgbG9hZF9vcHRpb25zKGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBvcHRpb24gKm9wdGlvbnMpCisJUGFyc2VzIG9wdGlvbnMgZnJvbSBhIGZpbGUgc2F2ZWQgd2l0aCBzYXZlX29wdGlvbnMoKS4gVGhlIGxhc3Qgb3B0aW9uCisJaW4gdGhlICdvcHRpb25zJyBhcnJheSBNVVNUIGhhdmUgYSBOVUxMIG5hbWUgdG8gZGVsaW1pdCB0aGUgYXJyYXkuCisKKwlpbnQgaHRtbF9vcHRpb25zKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgb3B0aW9uICpvcHRpb25zKQorCVByb2R1Y2VzIGFuIEhUTUwgdGFibGUgd2l0aCBvcHRpb25zIGFuZCBmb3JtIHN1Ym1pdCBidXR0b25zIHRvCisJaW50ZXJhY3RpdmVseSBjaGFuZ2Ugb3B0aW9ucyB0aHJvdWdoIGEgV2ViIHBhZ2UuIFRoZSB0YWJsZSBpcyBvdXRwdXQKKwl2aWEgc29hcF9zZW5kKCkgd2hpY2ggdXNlcyB0aGUgY3VycmVudCBzb2FwLnNvY2tldCBvciBzb2FwLnNlbmRmZAorCWRlc2NyaXB0b3JzLiBUaGUgdGFibGUgc2hvdWxkIGJlIHByb2R1Y2VkIHdpdGhpbiBhIGZvcm0sIHNlZSBhbHNvCisJaHRtbF9mb3JtX29wdGlvbnMoKS4KKwlUaGUgSFRNTCB0YWJsZSB1c2VzIHRoZSBmb2xsb3dpbmcgcGljdHVyZSBmaWxlczoKKwkJY2hlY2tlZC5naWYJCWNoZWNrIGJveCAoY2hlY2tlZCkKKwkJdW5jaGVja2VkLmdpZgkJY2hlY2sgYm94ICh1bmNoZWNrZWQpCisJCXNlbGVjdGVkLmdpZgkJcmFkaW8gYnV0dG9uIChzZWxlY3RlZCkKKwkJZGVzZWxlY3RlZC5naWYJCXJhZGlvIGJ1dHRvbiAoZGVzZWxlY3RlZCkKKworCWludCBodG1sX2Zvcm1fb3B0aW9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG9wdGlvbiAqb3B0aW9ucykKKwlQcm9kdWNlcyBhbiBIVE1MIGZvcm0gd2l0aCBhY3Rpb249JycgYW5kIG1ldGhvZD0nZ2V0JyAodG8gc2VuZCB0aGUKKwlyZXF1ZXN0IGJhY2sgdG8gdGhlIGN1cnJlbnQgc2VydmljZS4gQW4gSFRNTCBvcHRpb24gdGFibGUgaXMgcHJvZHVjZWQKKwl3aXRoaW4gdGhlIGZvcm0uCisqLworCitzdHJ1Y3Qgb3B0aW9uCit7IGNvbnN0IGNoYXIgKm5hbWU7CQkvKiBuYW1lICovCisgIGNvbnN0IGNoYXIgKnNlbGVjdGlvbnM7CS8qIE5VTEwgKG9wdGlvbiBkb2VzIG5vdCByZXF1aXJlIGFyZ3VtZW50KSwKKyAgCQkJCSAgIG9yIG9uZS13b3JkIGRlc2NyaXB0aW9uLAorCQkJCSAgIG9yIHNlbGVjdGlvbiBvZiBwb3NzaWJsZSB2YWx1ZXMgKHNlcGFyYXRlZCBieSBzcGFjZXMpICovCisgIGludCBzZWxlY3RlZDsJCQkvKiA+PTA6IGN1cnJlbnQgc2VsZWN0aW9uIGluIHNlbGVjdGlvbnMgbGlzdCAqLworICBjaGFyICp2YWx1ZTsJCQkvKiBwYXJzZWQgdmFsdWUgKHdoZW4gJ3NlbGVjdGlvbnMnIGlzIG9uZSBuYW1lKSAqLworfTsKKworZXh0ZXJuIHN0cnVjdCBvcHRpb24gKmNvcHlfb3B0aW9ucyhjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHRpb25zKTsKK2V4dGVybiB2b2lkIGZyZWVfb3B0aW9ucyhzdHJ1Y3Qgb3B0aW9uICpvcHRpb25zKTsKK2V4dGVybiBpbnQgcGFyc2Vfb3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YsIHN0cnVjdCBvcHRpb24gKm9wdGlvbnMpOworZXh0ZXJuIHZvaWQgcXVlcnlfb3B0aW9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG9wdGlvbiAqb3B0aW9ucyk7CitleHRlcm4gaW50IHNhdmVfb3B0aW9ucyhjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3Qgb3B0aW9uICpvcHRpb25zKTsKK2V4dGVybiBpbnQgbG9hZF9vcHRpb25zKGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBvcHRpb24gKm9wdGlvbnMpOworZXh0ZXJuIGludCBodG1sX29wdGlvbnMoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBvcHRpb24gKm9wdGlvbnMpOworZXh0ZXJuIGludCBodG1sX2Zvcm1fb3B0aW9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IG9wdGlvbiAqb3B0aW9ucyk7CisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvd2Vic2VydmVyL290bHMuZ2lmIGIvc2FtcGxlcy93ZWJzZXJ2ZXIvb3Rscy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyY2Q3MAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvd2Vic2VydmVyL290bHMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvd2Vic2VydmVyL290cnMuZ2lmIGIvc2FtcGxlcy93ZWJzZXJ2ZXIvb3Rycy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNmMWI4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvd2Vic2VydmVyL290cnMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvd2Vic2VydmVyL3JzLmdpZiBiL3NhbXBsZXMvd2Vic2VydmVyL3JzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTZjMjhkCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy93ZWJzZXJ2ZXIvcnMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvd2Vic2VydmVyL3J1bGVyLmdpZiBiL3NhbXBsZXMvd2Vic2VydmVyL3J1bGVyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTY3ZjhiCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy93ZWJzZXJ2ZXIvcnVsZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvd2Vic2VydmVyL3NlbGVjdGVkLmdpZiBiL3NhbXBsZXMvd2Vic2VydmVyL3NlbGVjdGVkLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWJhMWJmCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy93ZWJzZXJ2ZXIvc2VsZWN0ZWQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvd2Vic2VydmVyL3NlcnZlci5wZW0gYi9zYW1wbGVzL3dlYnNlcnZlci9zZXJ2ZXIucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZWYwMGYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3dlYnNlcnZlci9zZXJ2ZXIucGVtCkBAIC0wLDAgKzEsNjEgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRHNUQ0NBeHFnQXdJQkFnSUJDREFOQmdrcWhraUc5dzBCQVFVRkFEQ0JqekVMTUFrR0ExVUVCaE1DVlZNeAorQ3pBSkJnTlZCQWdUQWtaTU1SUXdFZ1lEVlFRSEV3dFVZV3hzWVdoaGMzTmxaVEVXTUJRR0ExVUVDaE1OUjJWdQorYVhacFlTd2dTVzVqTGpFTE1Ba0dBMVVFQ3hNQ1NWUXhGREFTQmdOVkJBTVRDMmRsYm1sMmFXRXVZMjl0TVNJdworSUFZSktvWklodmNOQVFrQkZoTmpiMjUwWVdOMFFHZGxibWwyYVdFdVkyOXRNQjRYRFRBMU1USXlOREU1TXpNeAorTTFvWERUQTRNVEl5TXpFNU16TXhNMW93Z1kweEN6QUpCZ05WQkFZVEFsVlRNUXN3Q1FZRFZRUUlFd0pHVERFVQorTUJJR0ExVUVCeE1MVkdGc2JHRm9ZWE56WldVeEZqQVVCZ05WQkFvVERVZGxibWwyYVdFc0lFbHVZeTR4Q3pBSgorQmdOVkJBc1RBa2xVTVJJd0VBWURWUVFERXdsc2IyTmhiR2h2YzNReElqQWdCZ2txaGtpRzl3MEJDUUVXRTJOdgorYm5SaFkzUkFaMlZ1YVhacFlTNWpiMjB3Z1o4d0RRWUpLb1pJaHZjTkFRRUJCUUFEZ1kwQU1JR0pBb0dCQU01UgorU2hBdTBmM0YyNjdiK1hodTRIbDNQZTV6VGlVbGtLOTUrdjdGZzZERTVxWDFPNERDV0NyZ3ZhVlU3amd5SnA1NworVU0zbjRZdkVSSHkydndscE9saWVvOTFWTVZHbjROQ0QvaHYxKzJLR3RGVGlKMmJjTkxiTXhlUDZWOXpBRmJtbQorVUFuUk1lbVVyNFJQUkVLMDNJS0lGMWc1K1VBZ3dCbWozcC9Kd1piM0FnTUJBQUdqZ2dFYk1JSUJGekFKQmdOVgorSFJNRUFqQUFNQ3dHQ1dDR1NBR0crRUlCRFFRZkZoMVBjR1Z1VTFOTUlFZGxibVZ5WVhSbFpDQkRaWEowYVdacAorWTJGMFpUQWRCZ05WSFE0RUZnUVVQY0hJdFJrWHc0d1NaRHdGd3lMdWU3b250TUV3Z2J3R0ExVWRJd1NCdERDQgorc1lBVTRNeUlpMEdnSVVxa1lSaG5KMkdneVVtVmQ4cWhnWldrZ1pJd2dZOHhDekFKQmdOVkJBWVRBbFZUTVFzdworQ1FZRFZRUUlFd0pHVERFVU1CSUdBMVVFQnhNTFZHRnNiR0ZvWVhOelpXVXhGakFVQmdOVkJBb1REVWRsYm1sMgorYVdFc0lFbHVZeTR4Q3pBSkJnTlZCQXNUQWtsVU1SUXdFZ1lEVlFRREV3dG5aVzVwZG1saExtTnZiVEVpTUNBRworQ1NxR1NJYjNEUUVKQVJZVFkyOXVkR0ZqZEVCblpXNXBkbWxoTG1OdmJZSUJBREFOQmdrcWhraUc5dzBCQVFVRgorQUFPQmdRQnUwQTdzaGVxcGNXQmR5eE02RE1MR29aSVZGQ3E3aGlvZGFMRkxRY0FMK3pYSEQyNVJtYk1sbFU5WQorR0QxejhnWVlZMEFocDBRZHEwYmIzV3dnZlNNakNJU1N6Z1NURUxQTGhHZjlQMU9CVVNWZzd0RUNpUVpZNXVDMAord2lEWTZJU0tUbzFaWW1jelRKVzlvL2RvZGw2NjJZUS9nTWdlU1RwWjBMUjBuaTNOOWc9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorUHJvYy1UeXBlOiA0LEVOQ1JZUFRFRAorREVLLUluZm86IERFUy1FREUzLUNCQyxGMTIwQUYzQUU4QjJBMUY5CisKKzNOeFZNMit2cU1oODhTYkVqUlhXUjFhbndYRTYweDRWWEIwU0VrTm16djNiT1NZR3BlSVk3c0ViNG05M0xMamoKK21rdk1CT1NKWVd6dVV4V0hlUGNkSUtva0RSa0N3RGptNlVSOUhzZjgyRTBJTUJpd1BzcHluUDM5NkRaYVhFRFkKK29rcWxHQm1GWDV6NkZ1akc5Z05sNThabTA5RlJsOHptcmlKdG9TdTRlc2FzUmFlei9LYWtsdWdyTWlNSHdWVloKK1BXTDRmWnhtb3hmL2dSV2p3WUcvdVlmbk1yWDJZdElack96V241YkorRUZ6cy84SWZrTWhSNWVtUENENjdvTW4KK1ExRjZBWmdtQzlKMlFRMEIrZXZtVWJKSkxHa00wS0lUcDNyNmtmeHd1cEZZZ2lxM1B4eWo2VDRoYkdYaGwzVHMKK3kyazJCRmxSN081aWpKT1NCYzZWdktoODRLZ1BNZVJHQzA0cDM1ZHpDT3Y5anZCVkpYbWo4dmIzSS9VeDFHalkKK3RxbWlTZWtjc2pYbkZ6alEzVnozOWU5SXgwRXVIbWQ2SUJaS0VCRVZpeHk2bDlZSyt0azZYZC8yb2ZoNUdiOGgKK3FjQ2I4N2IrdWp2a1RmaXRWcDN6eG5sa09XMVNPM1BudjNISkU0UGNDSVpKZkhkZ0Z4Q2lvUE1vbVlrNS9aWVoKK2tYSExlRk1xWUhSVWdZeDBFUW4vWjZ0dWIzNkVPNHU3QjFyV2w0MkhoS2thcjdWZG1JV2wzdmU2Y0dLdmEvNmwKK2NYNVdTRms4LzZXdG1QY1d0OHp0RThtKzVZMEVqRUxjZjlOWnhDKzF3TE9EMFRuaGZoZGtJU0lCaGw0T2N3MXMKK0JKMVFvbkNiMVhJVWQwZTNENkVGNW96Y0VtaGxiY09paDYzTndBZUQzb0VGeUF2ZjZSaTkrcmFuWTV5OW1UNk0KK01scjJDK2hFNWZJa3ZDSmhoRWZFbWVKdXY0Q0NKbFVXSittVlBOZ3hDeWVYcDdQN0c1azFraVZxTFlRRm1RZUoKK3BrbExTSFhBVFo1M2lpWFZWaVVDcEd6MWlVZFZKdGRmK2lVdHVUME1JQVdVZVVqeXlic0hIQT09CistLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEaGpDQ0F1K2dBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVVGQURDQmp6RUxNQWtHQTFVRUJoTUNWVk14CitDekFKQmdOVkJBZ1RBa1pNTVJRd0VnWURWUVFIRXd0VVlXeHNZV2hoYzNObFpURVdNQlFHQTFVRUNoTU5SMlZ1CithWFpwWVN3Z1NXNWpMakVMTUFrR0ExVUVDeE1DU1ZReEZEQVNCZ05WQkFNVEMyZGxibWwyYVdFdVkyOXRNU0l3CitJQVlKS29aSWh2Y05BUWtCRmhOamIyNTBZV04wUUdkbGJtbDJhV0V1WTI5dE1CNFhEVEEwTVRBd01qRTNNRGd3CitObG9YRFRBM01UQXdNakUzTURnd05sb3dnWTh4Q3pBSkJnTlZCQVlUQWxWVE1Rc3dDUVlEVlFRSUV3SkdUREVVCitNQklHQTFVRUJ4TUxWR0ZzYkdGb1lYTnpaV1V4RmpBVUJnTlZCQW9URFVkbGJtbDJhV0VzSUVsdVl5NHhDekFKCitCZ05WQkFzVEFrbFVNUlF3RWdZRFZRUURFd3RuWlc1cGRtbGhMbU52YlRFaU1DQUdDU3FHU0liM0RRRUpBUllUCitZMjl1ZEdGamRFQm5aVzVwZG1saExtTnZiVENCbnpBTkJna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBCitsNks5YkxNY3JKNkJ6KzhoeHlvbFNKeTVUZFpLbzhPbW1za1ArTkFKY3Q3YUdXYTMzdTJsa1orR2tvVW1MS1ovCityRE5wZ21ZVk5RbE9RQzRydDVvRHQ0QVVvajU4NEc4UEpLU1B3eW1KY1gwc2JmQjdrOHhSbUxPK3ZWZ1NVdkR1Cithc0xNV0o2UHNZSXVHaHA0QndPQWduWUFDVHpzZDZrU2VJc2VkOFhTeDdjQ0F3RUFBYU9CN3pDQjdEQWRCZ05WCitIUTRFRmdRVTRNeUlpMEdnSVVxa1lSaG5KMkdneVVtVmQ4b3dnYndHQTFVZEl3U0J0RENCc1lBVTRNeUlpMEdnCitJVXFrWVJobkoyR2d5VW1WZDhxaGdaV2tnWkl3Z1k4eEN6QUpCZ05WQkFZVEFsVlRNUXN3Q1FZRFZRUUlFd0pHCitUREVVTUJJR0ExVUVCeE1MVkdGc2JHRm9ZWE56WldVeEZqQVVCZ05WQkFvVERVZGxibWwyYVdFc0lFbHVZeTR4CitDekFKQmdOVkJBc1RBa2xVTVJRd0VnWURWUVFERXd0blpXNXBkbWxoTG1OdmJURWlNQ0FHQ1NxR1NJYjNEUUVKCitBUllUWTI5dWRHRmpkRUJuWlc1cGRtbGhMbU52YllJQkFEQU1CZ05WSFJNRUJUQURBUUgvTUEwR0NTcUdTSWIzCitEUUVCQlFVQUE0R0JBRm1iOWtWK0VEeDVPNGo3ZExNdTkwOW5GZ25CTDA2c2VwanF0QklJYlpZM0duQ2dlZnhLCitwMVM2SWYwMS9tZFY3OW5aR0psZGVnTTc3dHo0VklsenVJYXorMk5PK0dxYnI2RXJPUiszVUdPclJ1SDM5YU1UCisxRHZ3SFlwVTVHVStsRzFhV0hkUXA4dVo1eTRva01nM1o5SVo1bmlqa1VucENIUU8rcS84RnJNTAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy93ZWJzZXJ2ZXIvdGVzdC5odG1sIGIvc2FtcGxlcy93ZWJzZXJ2ZXIvdGVzdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxY2QxMTUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3dlYnNlcnZlci90ZXN0Lmh0bWwKQEAgLTAsMCArMSwyNCBAQAorPEhUTUw+DQorPEJPRFk+DQorPEgxPlRlc3QgUGFnZTwvSDE+DQorVGV4dCB0ZXN0Lg0KKzxwPg0KKzxpbWcgc3JjPSJmYXZpY29uLmdpZiI+IEltYWdlIHRlc3QuDQorPHA+DQorPGEgaHJlZj0iY2FsY2dldC5odG1sIj5IVFRQIEdFVCBmb3JtIHRlc3Q8L2E+IChIVE1MIHJlc3BvbnNlKS4NCis8cD4NCis8YSBocmVmPSJjYWxjcG9zdC5odG1sIj5IVFRQIFBPU1QgZm9ybSB0ZXN0PC9hPiAoSFRNTCByZXNwb25zZSkuDQorPHA+DQorPGEgaHJlZj0iY2FsY2Zvcm0xLmh0bWwiPkhUVFAgUE9TVCBtdWx0aXBhcnQvZm9ybS1kYXRhIHRlc3Q8L2E+IChIVE1MIHJlc3BvbnNlKS4NCis8cD4NCis8YSBocmVmPSJjYWxjZm9ybTIuaHRtbCI+SFRUUCBQT1NUIG11bHRpcGFydC9mb3JtLWRhdGEgdGVzdDwvYT4gKFhNTCByZXNwb25zZSkuDQorPGJyPg0KKzxicj4NCitQb3dlcmVkIGJ5IGdTT0FQLg0KKzxicj4NCis8YnI+DQorPGJyPg0KKzxicj4NCitDb3B5cmlnaHQgKGMpIDIwMDUgUm9iZXJ0IHZhbiBFbmdlbGVuLCBGbG9yaWRhIFN0YXRlIFVuaXZlcnNpdHkgYW5kIDxhIGhyZWY9Imdlbml2aWEiPkdlbml2aWEgSW5jLjwvYT4NCis8L0JPRFk+DQorPC9IVE1MPg0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvd2Vic2VydmVyL3RvcC5naWYgYi9zYW1wbGVzL3dlYnNlcnZlci90b3AuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZGViOTkKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3dlYnNlcnZlci90b3AuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvd2Vic2VydmVyL3RzLmdpZiBiL3NhbXBsZXMvd2Vic2VydmVyL3RzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDc5MjM3Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy93ZWJzZXJ2ZXIvdHMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvd2Vic2VydmVyL3VuY2hlY2tlZC5naWYgYi9zYW1wbGVzL3dlYnNlcnZlci91bmNoZWNrZWQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NzM2ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3dlYnNlcnZlci91bmNoZWNrZWQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvd2Vic2VydmVyL3dlYnNlcnZlci5jIGIvc2FtcGxlcy93ZWJzZXJ2ZXIvd2Vic2VydmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTczNTFhZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvd2Vic2VydmVyL3dlYnNlcnZlci5jCkBAIC0wLDAgKzEsMTMyNiBAQAorLyoKKword2Vic2VydmVyLmMKKworRXhhbXBsZSBzdGFuZC1hbG9uZSBnU09BUCBXZWIgc2VydmVyIGJhc2VkIG9uIHRoZSBnU09BUCBIVFRQIEdFVCBwbHVnaW4uCitUaGlzIGlzIGEgc21hbGwgYnV0IGZ1bGx5IGZ1bmN0aW9uYWwgKGVtYmVkZGVkKSBXZWIgc2VydmVyIGZvciBzZXJ2aW5nCitzdGF0aWMgYW5kIGR5bmFtaWMgcGFnZXMgYW5kIFNPQVAvWE1MIHJlc3BvbnNlcy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMS0yMDA0LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzOgorR1BMIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlUaGUgV2ViIHNlcnZlciBoYW5kbGVzIEhUVFAgR0VUIHJlcXVlc3RzIHRvIHNlcnZlIHBhZ2VzIGFuZCBIVFRQIFBPU1QKKwlyZWd1ZXN0cyB0byBoYW5kbGUgU09BUC9YTUwgbWVzc2FnZXMuIFRoaXMgZXhhbXBsZSBvbmx5IGltcGxlbWVudHMKKwlhIHNpbXBsZSBjYWxjdWxhdG9yIFhNTCBXZWIgc2VydmljZSBmb3IgZGVtb25zdHJhdGlvbiBwdXJwb3NlcyAodGhlCisJc2VydmljZSByZXNwb25kcyB3aXRoIFNPQVAvWE1MKS4KKworCVRoaXMgYXBwbGljYXRpb24gcmVxdWlyZXMgWmxpYiBhbmQgUHRocmVhZHMgKHlvdSBjYW4gcmVwbGFjZSBQdGhyZWFkcworCXdpdGggYW5vdGhlciB0aHJlYWQgbGlicmFyeSwgYnV0IHlvdSBuZWVkIHRvIHN0dWR5IHRoZSBPcGVuU1NMIHRocmVhZAorCWNoYW5nZXMgaW4gdGhlIE9wZW5TU0wgZG9jdW1lbnRhdGlvbikuCisKKwlPbiBVbml4L0xpbnV4LCBwbGVhc2UgZW5hYmxlIFNJR1BJUEUgaGFuZGxpbmcsIHNlZSBtYWluIGZ1bmN0aW9uIGJlbG93LgorCVNJR1BJUEUgaGFuZGxpbmcgd2lsbCBhdm9pZCB5b3VyIHNlcnZlciBmcm9tIHRlcm1pbmF0aW9uIHdoZW4gc29ja2V0cworCWFyZSBkaXNjb25uZWN0ZWQgYnkgY2xpZW50cyBiZWZvcmUgdGhlIHRyYW5zYWN0aW9uIHdhcyBjb21wbGV0ZWQKKwkoYWthIGJyb2tlbiBwaXBlKS4KKworCUNvbXBpbGUgd2l0aG91dCBPcGVuU1NMOgorCXNvYXBjcHAyIC1jIC1uIC1wb3B0IG9wdC5oCisJc29hcGNwcDIgLWMgd2Vic2VydmVyLmgKKwlDdXN0b21pemUgeW91ciBDT09LSUVfRE9NQUlOIGluIHRoaXMgZmlsZQorCWdjYyAtRFdJVEhfQ09PS0lFUyAtRFdJVEhfWkxJQiAtbyB3ZWJzZXJ2ZXIgd2Vic2VydmVyLmMgb3B0aW9ucy5jIHBsdWdpbi9odHRwZ2V0LmMgcGx1Z2luL2h0dHBmb3JtLmMgcGx1Z2luL2xvZ2dpbmcuYyBzdGRzb2FwMi5jIHNvYXBDLmMgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuYyAtbHB0aHJlYWQgLWx6CisKKwlDb21waWxlIHdpdGggT3BlblNTTDoKKwlzb2FwY3BwMiAtYyAtbiAtcG9wdCBvcHQuaAorCXNvYXBjcHAyIC1jIHdlYnNlcnZlci5oCisJQ3VzdG9taXplIHlvdXIgQ09PS0lFX0RPTUFJTiBpbiB0aGlzIGZpbGUKKwlnY2MgLURXSVRIX09QRU5TU0wgLURXSVRIX0NPT0tJRVMgLURXSVRIX1pMSUIgLW8gd2Vic2VydmVyIHdlYnNlcnZlci5jIG9wdGlvbnMuYyBwbHVnaW4vaHR0cGdldC5jIHBsdWdpbi9odHRwZm9ybS5jIHBsdWdpbi9sb2dnaW5nLmMgc3Rkc29hcDIuYyBzb2FwQy5jIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmMgLWxwdGhyZWFkIC1seiAtbHNzbCAtbGNyeXB0bworCisJVXNlIChIVFRQIEdFVCk6CisJQ29tcGlsZSB0aGUgd2ViIHNlcnZlciBhcyBleHBsYWluZWQgYWJvdmUKKwlTdGFydCB0aGUgd2ViIHNlcnZlciBvbiBhbiBldmVuIG51bWJlcmVkIHBvcnQgKGUuZy4gODA4MCk6CisJPiB3ZWJzZXJ2ZXIgODA4MCAmCisJU3RhcnQgYSB3ZWIgYnJvd3NlciBhbmQgb3BlbiBhIChsb2NhbGhvc3QpIGxvY2F0aW9uOgorCWh0dHA6Ly8xMjcuMC4wLjE6ODA4MAorCWFuZCB0eXBlIHVzZXJpZCAnYWRtaW4nIGFuZCBwYXNzd2QgJ2d1ZXN0JyB0byBnYWluIGFjY2VzcworCU9wZW4gdGhlIGxvY2F0aW9uOgorCWh0dHA6Ly8xMjcuMC4wLjE6ODA4MC9jYWxjLmh0bWwKKwl0aGVuIGVudGVyIGFuIGV4cHJlc3Npb24KKwlPcGVuIHRoZSBsb2NhdGlvbnM6CisJaHR0cDovLzEyNy4wLjAuMTo4MDgwL3Rlc3QuaHRtbAorCWh0dHA6Ly8xMjcuMC4wLjE6ODA4MS93ZWJzZXJ2ZXIud3NkbAorCisJVXNlIChIVFRQUyBHRVQpOgorCUNyZWF0ZSB0aGUgU1NMIGNlcnRpZmljYXRlCisJQ29tcGlsZSB0aGUgd2ViIHNlcnZlciB3aXRoIE9wZW5TU0wgYXMgZXhwbGFpbmVkIGFib3ZlCisJU3RhcnQgdGhlIHdlYiBzZXJ2ZXIgb24gYW4gb2RkIG51bWJlcmVkIHBvcnQgKGUuZy4gODA4MSkKKwk+IHdlYnNlcnZlciA4MDgxICYKKwlBY3R1YWxseSwgeW91IGNhbiBzdGFydCB0d28gc2VydmVycywgb25lIG9uIDgwODAgYW5kIGEgc2VjdXJlIG9uZSBvbgorCTgwODEKKwlTdGFydCBhIHdlYiBicm93c2VyIGFuZCBvcGVuIGEgKGxvY2FsaG9zdCkgbG9jYXRpb246CisJaHR0cHM6Ly8xMjcuMC4wLjE6ODA4MQorCWFuZCB0eXBlIHVzZXJpZCAnYWRtaW4nIGFuZCBwYXNzd2QgJ2d1ZXN0JyB0byBnYWluIGFjY2VzcworCU9wZW4gdGhlIGxvY2F0aW9uOgorCWh0dHBzOi8vMTI3LjAuMC4xOjgwODEvY2FsYy5odG1sCisJYW5kIGVudGVyIGFuIGV4cHJlc3Npb24KKwlPcGVuIHRoZSBsb2NhdGlvbnM6CisJaHR0cHM6Ly8xMjcuMC4wLjE6ODA4MS90ZXN0Lmh0bWwKKwlodHRwczovLzEyNy4wLjAuMTo4MDgxL3dlYnNlcnZlci53c2RsCisKKwlVc2UgKEhUVFAgUE9TVCk6CisJU2VydmVzIFNPQVAvWE1MIGNhbGN1bGF0aW9uIHJlcXVlc3RzCisKKwlDb21tYW5kLWxpbmUgb3B0aW9uczoKKwktegkJZW5hYmxlcyBjb21wcmVzc2lvbgorCS1jCQllbmFibGVzIGNodW5raW5nCisJLWsJCWVuYWJsZXMga2VlcC1hbGl2ZQorCS1pCQllbmFibGVzIG5vbi10aHJlYWRlZCBpdGVyYXRpdmUgc2VydmVyCisJLXYJCWVuYWJsZXMgdmVyYm9zZSBtb2RlCisJLW88bnVtPgkJcG9vbCBvZiA8bnVtPiB0aHJlYWRzIChjYW5ub3QgYmUgdXNlZCB3aXRoIG9wdGlvbiAtaSkKKwkJCU5vdGU6IGludGVyYWN0aXZlIGNodW5raW5nL2tlZXAtYWxpdmUgc2V0dGluZ3MgY2Fubm90IGJlCisJCQljaGFuZ2VkLCB1bmxlc3MgdGhlIG51bWJlciBvZiB0aHJlYWRzIGlzIGludGVyYWN0aXZlbHkKKwkJCWNoYW5nZWQgdG8gcmVzdGFydCB0aGUgcG9vbAorCQkJTm90ZTogPG51bT49MCBzcGVjaWZpZXMgdW5saW1pdGVkIHRocmVhZHMKKwktdDxudW0+CQlzZXRzIEkvTyB0aW1lb3V0IHZhbHVlIChzZWNvbmRzKQorCS1zPG51bT4JCXNldHMgc2VydmVyIHRpbWVvdXQgdmFsdWUgKHNlY29uZHMpCisJLWQ8aG9zdD4Jc2V0cyBjb29raWUgZG9tYWluCisJLXA8cGF0aD4Jc2V0cyBjb29raWUgcGF0aAorCS1sW25vbmUgaW5ib3VuZCBvdXRib3VuZCBib3RoXQorCQkJZW5hYmxlcyBsb2dnaW5nCisKKwlSZXF1aXJlcyBvcHRpb25zLmggYW5kIG9wdGlvbnMuYyBmb3IgY29tbWFuZCBsaW5lIG9wdGlvbiBwYXJzaW5nIGFuZAorCWZvciBwYXJzaW5nIGludGVyYWN0aXZlIFdlYiBwYWdlIG9wdGlvbnMgc2V0dGluZ3MuIFRoZQorCWRlZmF1bHRfb3B0aW9uc1tdIGFycmF5IGRlZmluZXMgYXBwbGljYXRpb24gb3B0aW9ucywgc2hvcnQtaGFuZHMsCisJc2VsZWN0aW9uIGxpc3RzLCBhbmQgZGVmYXVsdCB2YWx1ZXMuIFNlZSBvcHRpb25zLmggZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNpbmNsdWRlICJzb2FwSC5oIgorI2luY2x1ZGUgIndlYnNlcnZlci5uc21hcCIKKyNpbmNsdWRlICJvcHRpb25zLmgiCisjaW5jbHVkZSAiaHR0cGdldC5oIgorI2luY2x1ZGUgImh0dHBmb3JtLmgiCisjaW5jbHVkZSAibG9nZ2luZy5oIgorI2luY2x1ZGUgInRocmVhZHMuaCIKKy8qICNpbmNsdWRlICJodHRwZGEuaCIgKi8JLyogZW5hYmxlIEhUVFAgRGlnZXN0IEF1dGhlbnRpY2F0aW9uICovCisjaW5jbHVkZSA8c2lnbmFsLmg+CQkvKiBkZWZpbmVzIFNJR1BJUEUgKi8KKworI2RlZmluZSBCQUNLTE9HICgxMDApCisKKyNkZWZpbmUgQVVUSF9SRUFMTSAiZ1NPQVAgV2ViIFNlcnZlciBBZG1pbiIKKyNkZWZpbmUgQVVUSF9VU0VSSUQgImFkbWluIgkvKiB1c2VyIElEIHRvIGFjY2VzcyBhZG1pbiBwYWdlcyAqLworI2RlZmluZSBBVVRIX1BBU1NXRCAiZ3Vlc3QiCS8qIHVzZXIgcHcgdG8gYWNjZXNzIGFkbWluIHBhZ2VzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJVGhyZWFkIHBvb2wgYW5kIHJlcXVlc3QgcXVldWUKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1BWF9USFIgKDEwMCkKKyNkZWZpbmUgTUFYX1FVRVVFICgxMDAwKQorCitzdGF0aWMgaW50IHBvb2xzaXplID0gMDsKKworc3RhdGljIGludCBxdWV1ZVtNQVhfUVVFVUVdOworc3RhdGljIGludCBoZWFkID0gMCwgdGFpbCA9IDA7CisKK3N0YXRpYyBNVVRFWF9UWVBFIHF1ZXVlX2NzOworc3RhdGljIENPTkRfVFlQRSBxdWV1ZV9jdjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglQcm9ncmFtIG9wdGlvbnMKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbiBkZWZhdWx0X29wdGlvbnNbXSA9Cit7IHsgInouY29tcHJlc3MiLCBOVUxMLCB9LAorICB7ICJjLmNodW5raW5nIiwgTlVMTCwgfSwKKyAgeyAiay5rZWVwYWxpdmUiLCBOVUxMLCB9LAorICB7ICJpLml0ZXJhdGl2ZSIsIE5VTEwsIH0sCisgIHsgInYudmVyYm9zZSIsIE5VTEwsIH0sCisgIHsgIm8ucG9vbCIsICJ0aHJlYWRzIiwgNiwgIm5vbmUifSwKKyAgeyAidC5pb1RpbWVvdXQiLCAic2Vjb25kcyIsIDYsICIxMjAifSwKKyAgeyAicy5zZXJ2ZXJUaW1lb3V0IiwgInNlY29uZHMiLCA2LCAiMzYwMCJ9LAorICB7ICJkLmNvb2tpZURvbWFpbiIsICJob3N0IiwgMjAsICJsb2NhbGhvc3Q6ODA4MCJ9LAorICB7ICJwLmNvb2tpZVBhdGgiLCAicGF0aCIsIDIwLCAiLyJ9LAorICB7ICJsLmxvZ2dpbmciLCAibm9uZSBpbmJvdW5kIG91dGJvdW5kIGJvdGgiLCB9LAorICB7ICIiLCAicG9ydCIsIH0sCQkvKiByZXN0IG9mIGNvbW1hbmQgbGluZSBhcmdzICovCisgIHsgTlVMTCB9LAkJCS8qIG11c3QgYmUgTlVMTCB0ZXJtaW5hdGVkICovCit9OworCisvKiBUaGUgbnVtYmVyaW5nIG9mIHRoZXNlIGRlZmluZXMgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBvcHRpb24gc2VxdWVuY2UgKi8KKyNkZWZpbmUgT1BUSU9OX3oJMAorI2RlZmluZSBPUFRJT05fYwkxCisjZGVmaW5lIE9QVElPTl9rCTIKKyNkZWZpbmUgT1BUSU9OX2kJMworI2RlZmluZSBPUFRJT05fdgk0CisjZGVmaW5lIE9QVElPTl9vCTUKKyNkZWZpbmUgT1BUSU9OX3QJNgorI2RlZmluZSBPUFRJT05fcwk3CisjZGVmaW5lIE9QVElPTl9kCTgKKyNkZWZpbmUgT1BUSU9OX3AJOQorI2RlZmluZSBPUFRJT05fbAkxMAorI2RlZmluZSBPUFRJT05fcG9ydAkxMQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqCVN0YXRpYworICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3Qgb3B0aW9uICpvcHRpb25zID0gTlVMTDsKK3N0YXRpYyB0aW1lX3Qgc3RhcnQ7CitzdGF0aWMgaW50IHNlY3VyZSA9IDA7CQkvKiA9MDogbm8gU1NMLCA9MTogc3VwcG9ydCBTU0wgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKm1pbnV0ZXNbNjBdID0geyIwIiwgIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIsICI2IiwgIjciLCAiOCIsICI5IiwgIjAiLCAiMSIsICIyIiwgIjMiLCAiNCIsICI1IiwgIjYiLCAiNyIsICI4IiwgIjkiLCAiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiLCAiNiIsICI3IiwgIjgiLCAiOSIsICIwIiwgIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIsICI2IiwgIjciLCAiOCIsICI5IiwgIjAiLCAiMSIsICIyIiwgIjMiLCAiNCIsICI1IiwgIjYiLCAiNyIsICI4IiwgIjkiLCAiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiLCAiNiIsICI3IiwgIjgiLCAiOSIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICpob3Vyc1syNF0gPSB7IjAwIiwgIjAxIiwgIjAyIiwgIjAzIiwgIjA0IiwgIjA1IiwgIjA2IiwgIjA3IiwgIjA4IiwgIjA5IiwgIjEwIiwgIjExIiwgIjEyIiwgIjEzIiwgIjE0IiwgIjE1IiwgIjE2IiwgIjE3IiwgIjE4IiwgIjE5IiwgIjIwIiwgIjIxIiwgIjIyIiwgIjIzIn07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJRm9yd2FyZCBkZWNscworICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgc2VydmVyX2xvb3Aoc3RydWN0IHNvYXAqKTsKK3ZvaWQgKnByb2Nlc3NfcmVxdWVzdCh2b2lkKik7CS8qIG11bHRpLXRocmVhZGVkIHJlcXVlc3QgaGFuZGxlciAqLwordm9pZCAqcHJvY2Vzc19xdWV1ZSh2b2lkKik7CS8qIG11bHRpLXRocmVhZGVkIHJlcXVlc3QgaGFuZGxlciBmb3IgcG9vbCAqLworaW50IGVucXVldWUoU09BUF9TT0NLRVQpOworU09BUF9TT0NLRVQgZGVxdWV1ZSgpOworaW50IGh0dHBfZ2V0X2hhbmRsZXIoc3RydWN0IHNvYXAqKTsJLyogSFRUUCBnZXQgaGFuZGxlciAqLworaW50IGh0dHBfZm9ybV9oYW5kbGVyKHN0cnVjdCBzb2FwKik7CS8qIEhUVFAgZm9ybSBoYW5kbGVyICovCitpbnQgY2hlY2tfYXV0aGVudGljYXRpb24oc3RydWN0IHNvYXAqKTsJLyogSFRUUCBhdXRoZW50aWNhdGlvbiBjaGVjayAqLworaW50IGNvcHlfZmlsZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CS8qIGNvcHkgZmlsZSBhcyBIVFRQIHJlc3BvbnNlICovCitpbnQgY2FsY2dldChzdHJ1Y3Qgc29hcCopOworaW50IGNhbGNwb3N0KHN0cnVjdCBzb2FwKik7CitpbnQgaW5mbyhzdHJ1Y3Qgc29hcCopOworaW50IGh0bWxfaGJhcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaXplX3QsIHNpemVfdCwgdW5zaWduZWQgbG9uZyk7CitpbnQgaHRtbF9oaXN0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHNpemVfdCwgc2l6ZV90LCBzaXplX3QsIGNvbnN0IGNoYXIqKiwgc2l6ZV90Kiwgc2l6ZV90KTsKK3ZvaWQgc2lncGlwZV9oYW5kbGUoaW50KTsgLyogU0lHUElQRSBoYW5kbGVyOiBVbml4L0xpbnV4IG9ubHkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglPcGVuU1NMCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IENSWVBUT190aHJlYWRfc2V0dXAoKTsKK3ZvaWQgQ1JZUFRPX3RocmVhZF9jbGVhbnVwKCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJTWFpbgorICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgc3RydWN0IHNvYXAgc29hcDsKKyAgU09BUF9TT0NLRVQgbWFzdGVyOworICBpbnQgcG9ydCA9IDA7CisKKyAgc3RhcnQgPSB0aW1lKE5VTEwpOworCisgIG9wdGlvbnMgPSBjb3B5X29wdGlvbnMoZGVmYXVsdF9vcHRpb25zKTsgLyogbXVzdCBjb3B5LCBzbyBvcHRpb24gdmFsdWVzIGNhbiBiZSBtb2RpZmllZCAqLworICBpZiAocGFyc2Vfb3B0aW9ucyhhcmdjLCBhcmd2LCBvcHRpb25zKSkKKyAgICBleGl0KDApOworCisgIGlmIChvcHRpb25zW09QVElPTl9wb3J0XS52YWx1ZSkKKyAgICBwb3J0ID0gYXRvbChvcHRpb25zW09QVElPTl9wb3J0XS52YWx1ZSk7CisgIGlmICghcG9ydCkKKyAgICBwb3J0ID0gODA4MDsKKyAgZnByaW50ZihzdGRlcnIsICJTdGFydGluZyBXZWIgc2VydmVyIG9uIHBvcnQgJWRcbiIsIHBvcnQpOworICBpZiAocG9ydCAhPSA4MDgwKQorICAgIGZwcmludGYoc3RkZXJyLCAiW05vdGU6IHVzZSBwb3J0IDgwODAgdG8gdGVzdCBzZXJ2ZXIgZnJvbSBicm93c2VyIHdpdGggdGVzdC5odG1sIGFuZCBjYWxjLmh0bWxdXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJbTm90ZTogeW91IG11c3QgZW5hYmxlIExpbnV4L1VuaXggU0lHUElQRSBoYW5kbGVyIHRvIGF2b2lkIGJyb2tlbiBwaXBlXVxuIik7CisKKyAgc29hcF9pbml0Migmc29hcCwgU09BUF9JT19LRUVQQUxJVkUsIFNPQVBfSU9fREVGQVVMVCk7CisKKyAgLyogU1NMIGluaXQgKHRvIGVuYWJsZTogY29tcGlsZSBhbGwgc291cmNlcyB3aXRoIC1EV0lUSF9PUEVOU1NMKSAqLworICBzb2FwX3NzbF9pbml0KCk7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgIGlmIChDUllQVE9fdGhyZWFkX3NldHVwKCkpCisgIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBzZXR1cCB0aHJlYWQgbXV0ZXhcbiIpOworICAgIGV4aXQoMSk7CisgIH0KKyAgLyogaWYgdGhlIHBvcnQgaXMgYW4gb2RkIG51bWJlciwgdGhlIFdlYiBzZXJ2ZXIgdXNlcyBIVFRQUyBvbmx5ICovCisgIGlmIChwb3J0ICUgMikKKyAgICBzZWN1cmUgPSAxOworICBpZiAoc2VjdXJlICYmIHNvYXBfc3NsX3NlcnZlcl9jb250ZXh0KCZzb2FwLAorICAgIFNPQVBfU1NMX0RFRkFVTFQsCisgICAgInNlcnZlci5wZW0iLAkvKiBrZXlmaWxlOiBzZWUgU1NMIGRvY3Mgb24gaG93IHRvIG9idGFpbiB0aGlzIGZpbGUgKi8KKyAgICAicGFzc3dvcmQiLAkJLyogcGFzc3dvcmQgdG8gcmVhZCB0aGUga2V5IGZpbGUgKi8KKyAgICBOVUxMLCAJCS8qIGNhY2VydCAqLworICAgIE5VTEwsCQkvKiBjYXBhdGggKi8KKyAgICAiZGg1MTIucGVtIiwJLyogREggZmlsZSwgaWYgTlVMTCB1c2UgUlNBICovCisgICAgTlVMTCwJCS8qIGlmIHJhbmRmaWxlIT1OVUxMOiB1c2UgYSBmaWxlIHdpdGggcmFuZG9tIGRhdGEgdG8gc2VlZCByYW5kb21uZXNzICovIAorICAgICJ3ZWJzZXJ2ZXIiCQkvKiBzZXJ2ZXIgaWRlbnRpZmljYXRpb24gZm9yIFNTTCBzZXNzaW9uIGNhY2hlIChtdXN0IGJlIGEgdW5pcXVlIG5hbWUpICovCisgICkpCisgIHsKKyAgICBzb2FwX3ByaW50X2ZhdWx0KCZzb2FwLCBzdGRlcnIpOworICAgIGV4aXQoMSk7CisgIH0KKyNlbmRpZgorICAvKiBSZWdpc3RlciBIVFRQIEdFVCBwbHVnaW4gKi8KKyAgaWYgKHNvYXBfcmVnaXN0ZXJfcGx1Z2luX2FyZygmc29hcCwgaHR0cF9nZXQsICh2b2lkKilodHRwX2dldF9oYW5kbGVyKSkKKyAgICBzb2FwX3ByaW50X2ZhdWx0KCZzb2FwLCBzdGRlcnIpOworICAvKiBSZWdpc3RlciBIVFRQIFBPU1QgcGx1Z2luICovCisgIGlmIChzb2FwX3JlZ2lzdGVyX3BsdWdpbl9hcmcoJnNvYXAsIGh0dHBfZm9ybSwgKHZvaWQqKWh0dHBfZm9ybV9oYW5kbGVyKSkKKyAgICBzb2FwX3ByaW50X2ZhdWx0KCZzb2FwLCBzdGRlcnIpOworICAvKiBSZWdpc3RlciBsb2dnaW5nIHBsdWdpbiAqLworICBpZiAoc29hcF9yZWdpc3Rlcl9wbHVnaW4oJnNvYXAsIGxvZ2dpbmcpKQorICAgIHNvYXBfcHJpbnRfZmF1bHQoJnNvYXAsIHN0ZGVycik7CisjaWZkZWYgSFRUUERBX0gKKyAgLyogUmVnaXN0ZXIgSFRUUCBEaWdlc3QgQXV0aGVudGljYXRpb24gcGx1Z2luICovCisgIGlmIChzb2FwX3JlZ2lzdGVyX3BsdWdpbigmc29hcCwgaHR0cF9kYSkpCisgICAgc29hcF9wcmludF9mYXVsdCgmc29hcCwgc3RkZXJyKTsKKyNlbmRpZgorICAvKiBVbml4IFNJR1BJUEUsIHRoaXMgaXMgT1MgZGVwZW5kZW50ICh3aW4gZG9lcyBub3QgbmVlZCB0aGlzKSAqLworICAvKiBzb2FwLmFjY2VwdF9mbGFncyA9IFNPX05PU0lHUElQRTsgKi8gCS8qIHNvbWUgc3lzdGVtcyBsaWtlIHRoaXMgKi8KKyAgLyogc29hcC5zb2NrZXRfZmxhZ3MgPSBNU0dfTk9TSUdOQUw7ICovCS8qIG90aGVycyBuZWVkIHRoaXMgKi8KKyAgLyogc2lnbmFsKFNJR1BJUEUsIHNpZ3BpcGVfaGFuZGxlKTsgKi8JLyogYW5kIHNvbWUgb2xkZXIgVW5peCBzeXN0ZW1zIG1heSByZXF1aXJlIGEgc2lncGlwZSBoYW5kbGVyICovCisgIG1hc3RlciA9IHNvYXBfYmluZCgmc29hcCwgTlVMTCwgcG9ydCwgQkFDS0xPRyk7CisgIGlmICghc29hcF92YWxpZF9zb2NrZXQobWFzdGVyKSkKKyAgeworICAgIHNvYXBfcHJpbnRfZmF1bHQoJnNvYXAsIHN0ZGVycik7CisgICAgZXhpdCgxKTsKKyAgfQorICBmcHJpbnRmKHN0ZGVyciwgIlBvcnQgYmluZCBzdWNjZXNzZnVsOiBtYXN0ZXIgc29ja2V0ID0gJWRcbiIsIG1hc3Rlcik7CisgIE1VVEVYX1NFVFVQKHF1ZXVlX2NzKTsKKyAgQ09ORF9TRVRVUChxdWV1ZV9jdik7CisgIHNlcnZlcl9sb29wKCZzb2FwKTsKKyAgTVVURVhfQ0xFQU5VUChxdWV1ZV9jcyk7CisgIENPTkRfQ0xFQU5VUChxdWV1ZV9jdik7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgIENSWVBUT190aHJlYWRfY2xlYW51cCgpOworI2VuZGlmCisgIGZyZWVfb3B0aW9ucyhvcHRpb25zKTsKKyAgc29hcF9lbmQoJnNvYXApOworICBzb2FwX2RvbmUoJnNvYXApOworICBUSFJFQURfRVhJVDsKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgc2VydmVyX2xvb3Aoc3RydWN0IHNvYXAgKnNvYXApCit7CisgIHN0cnVjdCBzb2FwICpzb2FwX3RocltNQVhfVEhSXTsKKyAgVEhSRUFEX1RZUEUgdGlkLCB0aWRzW01BWF9USFJdOworICBpbnQgcmVxOworICBzdHJ1Y3QgbG9nZ2luZ19kYXRhICpsb2dkYXRhOworCisgIGxvZ2RhdGEgPSAoc3RydWN0IGxvZ2dpbmdfZGF0YSopc29hcF9sb29rdXBfcGx1Z2luKHNvYXAsIGxvZ2dpbmdfaWQpOyAvKiBuZWVkIHRvIGFjY2VzcyBwbHVnaW4ncyBkYXRhICovCisKKyAgZm9yIChyZXEgPSAxOyA7IHJlcSsrKQorICB7CisgICAgU09BUF9TT0NLRVQgc29jazsKKyAgICBpbnQgbmV3cG9vbHNpemU7CisgICAgCisgICAgc29hcC0+Y29va2llX2RvbWFpbiA9IG9wdGlvbnNbT1BUSU9OX2RdLnZhbHVlOworICAgIHNvYXAtPmNvb2tpZV9wYXRoID0gb3B0aW9uc1tPUFRJT05fcF0udmFsdWU7CisgICAgc29hcF9zZXRfY29va2llKHNvYXAsICJ2aXNpdCIsICJ0cnVlIiwgTlVMTCwgTlVMTCk7CisgICAgc29hcF9zZXRfY29va2llX2V4cGlyZShzb2FwLCAidmlzaXQiLCA2MDAsIE5VTEwsIE5VTEwpOworCisgICAgaWYgKG9wdGlvbnNbT1BUSU9OX2NdLnNlbGVjdGVkKQorICAgICAgc29hcF9zZXRfb21vZGUoc29hcCwgU09BUF9JT19DSFVOSyk7IC8qIHVzZSBjaHVua2VkIEhUVFAgY29udGVudCAoZmFzdCkgKi8KKyAgICBpZiAob3B0aW9uc1tPUFRJT05fa10uc2VsZWN0ZWQpCisgICAgICBzb2FwX3NldF9vbW9kZShzb2FwLCBTT0FQX0lPX0tFRVBBTElWRSk7CisgICAgaWYgKG9wdGlvbnNbT1BUSU9OX3RdLnZhbHVlKQorICAgICAgc29hcC0+c2VuZF90aW1lb3V0ID0gc29hcC0+cmVjdl90aW1lb3V0ID0gYXRvbChvcHRpb25zW09QVElPTl90XS52YWx1ZSk7CisgICAgaWYgKG9wdGlvbnNbT1BUSU9OX3NdLnZhbHVlKQorICAgICAgc29hcC0+YWNjZXB0X3RpbWVvdXQgPSBhdG9sKG9wdGlvbnNbT1BUSU9OX3NdLnZhbHVlKTsKKyAgICBpZiAob3B0aW9uc1tPUFRJT05fbF0uc2VsZWN0ZWQgPT0gMSB8fCBvcHRpb25zW09QVElPTl9sXS5zZWxlY3RlZCA9PSAzKQorICAgICAgbG9nZGF0YS0+aW5ib3VuZCA9IHN0ZG91dDsKKyAgICBlbHNlCisgICAgICBsb2dkYXRhLT5pbmJvdW5kID0gTlVMTDsKKyAgICBpZiAob3B0aW9uc1tPUFRJT05fbF0uc2VsZWN0ZWQgPT0gMiB8fCBvcHRpb25zW09QVElPTl9sXS5zZWxlY3RlZCA9PSAzKQorICAgICAgbG9nZGF0YS0+b3V0Ym91bmQgPSBzdGRvdXQ7CisgICAgZWxzZQorICAgICAgbG9nZGF0YS0+b3V0Ym91bmQgPSBOVUxMOworCisgICAgbmV3cG9vbHNpemUgPSBhdG9sKG9wdGlvbnNbT1BUSU9OX29dLnZhbHVlKTsKKworICAgIGlmIChuZXdwb29sc2l6ZSA8IDApCisgICAgICBuZXdwb29sc2l6ZSA9IDA7CisgICAgZWxzZSBpZiAobmV3cG9vbHNpemUgPiBNQVhfVEhSKQorICAgICAgbmV3cG9vbHNpemUgPSBNQVhfVEhSOworCisgICAgaWYgKHBvb2xzaXplID4gbmV3cG9vbHNpemUpCisgICAgeworICAgICAgaW50IGpvYjsKKworICAgICAgZm9yIChqb2IgPSAwOyBqb2IgPCBwb29sc2l6ZTsgam9iKyspCisgICAgICB7CisgICAgICAgIHdoaWxlIChlbnF1ZXVlKFNPQVBfSU5WQUxJRF9TT0NLRVQpID09IFNPQVBfRU9NKQorICAgICAgICAgIHNsZWVwKDEpOworICAgICAgfQorCisgICAgICBmb3IgKGpvYiA9IDA7IGpvYiA8IHBvb2xzaXplOyBqb2IrKykKKyAgICAgIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJXYWl0aW5nIGZvciB0aHJlYWQgJWQgdG8gdGVybWluYXRlLi4uXG4iLCBqb2IpOworICAgICAgICBUSFJFQURfSk9JTih0aWRzW2pvYl0pOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlRocmVhZCAlZCBoYXMgc3RvcHBlZFxuIiwgam9iKTsKKyAgICAgICAgc29hcF9kb25lKHNvYXBfdGhyW2pvYl0pOworICAgICAgICBmcmVlKHNvYXBfdGhyW2pvYl0pOworICAgICAgfQorCisgICAgICBwb29sc2l6ZSA9IDA7CisgICAgfQorCisgICAgaWYgKHBvb2xzaXplIDwgbmV3cG9vbHNpemUpCisgICAgeworICAgICAgaW50IGpvYjsKKworICAgICAgZm9yIChqb2IgPSBwb29sc2l6ZTsgam9iIDwgbmV3cG9vbHNpemU7IGpvYisrKQorICAgICAgeworICAgICAgICBzb2FwX3Rocltqb2JdID0gc29hcF9jb3B5KHNvYXApOworCWlmICghc29hcF90aHJbam9iXSkKKwkgIGJyZWFrOworCisgICAgICAgIHNvYXBfdGhyW2pvYl0tPnVzZXIgPSAodm9pZCopam9iOworCQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlN0YXJ0aW5nIHRocmVhZCAlZFxuIiwgam9iKTsKKyAgICAgICAgVEhSRUFEX0NSRUFURSgmdGlkc1tqb2JdLCAodm9pZCooKikodm9pZCopKXByb2Nlc3NfcXVldWUsICh2b2lkKilzb2FwX3Rocltqb2JdKTsKKyAgICAgIH0KKworICAgICAgcG9vbHNpemUgPSBqb2I7CisgICAgfQorCisgICAgc29jayA9IHNvYXBfYWNjZXB0KHNvYXApOworICAgIGlmICghc29hcF92YWxpZF9zb2NrZXQoc29jaykpCisgICAgeworICAgICAgaWYgKHNvYXAtPmVycm51bSkKKyAgICAgIHsKKyAgICAgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlJldHJ5Li4uXG4iKTsKKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGZwcmludGYoc3RkZXJyLCAiZ1NPQVAgV2ViIHNlcnZlciB0aW1lZCBvdXRcbiIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKG9wdGlvbnNbT1BUSU9OX3ZdLnNlbGVjdGVkKQorICAgICAgZnByaW50ZihzdGRlcnIsICJSZXF1ZXN0ICMlZCBhY2NlcHRlZCBvbiBzb2NrZXQgJWQgY29ubmVjdGVkIGZyb20gSVAgJWQuJWQuJWQuJWRcbiIsIHJlcSwgc29jaywgKGludCkoc29hcC0+aXA+PjI0KSYweEZGLCAoaW50KShzb2FwLT5pcD4+MTYpJjB4RkYsIChpbnQpKHNvYXAtPmlwPj44KSYweEZGLCAoaW50KXNvYXAtPmlwJjB4RkYpOworCisgICAgaWYgKHBvb2xzaXplID4gMCkKKyAgICB7CisgICAgICB3aGlsZSAoZW5xdWV1ZShzb2NrKSA9PSBTT0FQX0VPTSkKKyAgICAgICAgc2xlZXAoMSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBzdHJ1Y3Qgc29hcCAqdHNvYXAgPSBOVUxMOworCisgICAgICBpZiAoIW9wdGlvbnNbT1BUSU9OX2ldLnNlbGVjdGVkKQorICAgICAgICB0c29hcCA9IHNvYXBfY29weShzb2FwKTsKKworICAgICAgaWYgKHRzb2FwKQorICAgICAgeworI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgICAgICBpZiAoc2VjdXJlICYmIHNvYXBfc3NsX2FjY2VwdCh0c29hcCkpCisgICAgICAgIHsKKwkgIHNvYXBfcHJpbnRfZmF1bHQodHNvYXAsIHN0ZGVycik7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJTU0wgcmVxdWVzdCBmYWlsZWQsIGNvbnRpbnVlIHdpdGggbmV4dCBjYWxsLi4uXG4iKTsKKyAgICAgICAgICBzb2FwX2VuZCh0c29hcCk7CisgICAgICAgICAgc29hcF9kb25lKHRzb2FwKTsKKyAgICAgICAgICBmcmVlKHRzb2FwKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIHRzb2FwLT51c2VyID0gKHZvaWQqKXJlcTsKKyAgICAgICAgVEhSRUFEX0NSRUFURSgmdGlkLCAodm9pZCooKikodm9pZCopKXByb2Nlc3NfcmVxdWVzdCwgKHZvaWQqKXRzb2FwKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICAgICAgaWYgKHNlY3VyZSAmJiBzb2FwX3NzbF9hY2NlcHQoc29hcCkpCisgICAgICAgIHsKKwkgIHNvYXBfcHJpbnRfZmF1bHQoc29hcCwgc3RkZXJyKTsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlNTTCByZXF1ZXN0IGZhaWxlZCwgY29udGludWUgd2l0aCBuZXh0IGNhbGwuLi5cbiIpOworICAgICAgICAgIHNvYXBfZW5kKHNvYXApOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgaWYgKHNvYXBfc2VydmUoc29hcCkpCisgICAgICAgIHsKKwkgIGZwcmludGYoc3RkZXJyLCAiUmVxdWVzdCAjJWQgY29tcGxldGVkIHdpdGggZmFpbHVyZSAlZFxuIiwgcmVxLCBzb2FwLT5lcnJvcik7CisgICAgICAgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOworICAgICAgICB9CisKKyAgICAgICAgc29hcF9lbmQoc29hcCk7CisgICAgICAgIGlmIChvcHRpb25zW09QVElPTl92XS5zZWxlY3RlZCkKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlJlcXVlc3QgIyVkIGNvbXBsZXRlZFxuIiwgcmVxKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAocG9vbHNpemUgPiAwKQorICB7CisgICAgaW50IGpvYjsKKworICAgIGZvciAoam9iID0gMDsgam9iIDwgcG9vbHNpemU7IGpvYisrKQorICAgIHsKKyAgICAgIHdoaWxlIChlbnF1ZXVlKFNPQVBfSU5WQUxJRF9TT0NLRVQpID09IFNPQVBfRU9NKQorICAgICAgICBzbGVlcCgxKTsKKyAgICB9CisKKyAgICBmb3IgKGpvYiA9IDA7IGpvYiA8IHBvb2xzaXplOyBqb2IrKykKKyAgICB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIldhaXRpbmcgZm9yIHRocmVhZCAlZCB0byB0ZXJtaW5hdGUuLi4gIiwgam9iKTsKKyAgICAgIFRIUkVBRF9KT0lOKHRpZHNbam9iXSk7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgInRlcm1pbmF0ZWRcbiIpOworICAgICAgc29hcF9kb25lKHNvYXBfdGhyW2pvYl0pOworICAgICAgZnJlZShzb2FwX3Rocltqb2JdKTsKKyAgICB9CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglQcm9jZXNzIGRpc3BhdGNoZXIKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkICpwcm9jZXNzX3JlcXVlc3Qodm9pZCAqc29hcCkKK3sKKyAgc3RydWN0IHNvYXAgKnRzb2FwID0gKHN0cnVjdCBzb2FwKilzb2FwOworCisgIFRIUkVBRF9ERVRBQ0goVEhSRUFEX0lEKTsKKworICBpZiAoc29hcF9zZXJ2ZSh0c29hcCkpCisgIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlRocmVhZCAlZCBjb21wbGV0ZWQgd2l0aCBmYWlsdXJlICVkXG4iLCAoaW50KXRzb2FwLT51c2VyLCB0c29hcC0+ZXJyb3IpOworICAgIHNvYXBfcHJpbnRfZmF1bHQodHNvYXAsIHN0ZGVycik7CisgIH0KKyAgZWxzZSBpZiAob3B0aW9uc1tPUFRJT05fdl0uc2VsZWN0ZWQpCisgICAgZnByaW50ZihzdGRlcnIsICJUaHJlYWQgJWQgY29tcGxldGVkXG4iLCAoaW50KXRzb2FwLT51c2VyKTsKKyAgLyogc29hcF9kZXN0cm95KChzdHJ1Y3Qgc29hcCopc29hcCk7ICovIC8qIGNsZWFudXAgY2xhc3MgaW5zdGFuY2VzIChidXQgdGhpcyBpcyBhIEMgYXBwKSAqLworCisgIHNvYXBfZW5kKHRzb2FwKTsKKyAgc29hcF9kb25lKHRzb2FwKTsKKyAgZnJlZShzb2FwKTsKKworICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglUaHJlYWQgcG9vbCAoZW5hYmxlZCB3aXRoIG9wdGlvbiAtbzxudW0+KQorICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgKnByb2Nlc3NfcXVldWUodm9pZCAqc29hcCkKK3sKKyAgc3RydWN0IHNvYXAgKnRzb2FwID0gKHN0cnVjdCBzb2FwKilzb2FwOworCisgIGZvciAoOzspCisgIHsKKyAgICB0c29hcC0+c29ja2V0ID0gZGVxdWV1ZSgpOworICAgIGlmICghc29hcF92YWxpZF9zb2NrZXQodHNvYXAtPnNvY2tldCkpCisgICAgeyBpZiAob3B0aW9uc1tPUFRJT05fdl0uc2VsZWN0ZWQpCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVGhyZWFkICVkIHRlcm1pbmF0aW5nXG4iLCAoaW50KXRzb2FwLT51c2VyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgIGlmIChzZWN1cmUgJiYgc29hcF9zc2xfYWNjZXB0KHRzb2FwKSkKKyAgICB7CisgICAgICBzb2FwX3ByaW50X2ZhdWx0KHRzb2FwLCBzdGRlcnIpOworICAgICAgZnByaW50ZihzdGRlcnIsICJTU0wgcmVxdWVzdCBmYWlsZWQsIGNvbnRpbnVlIHdpdGggbmV4dCBjYWxsLi4uXG4iKTsKKyAgICAgIHNvYXBfZW5kKHRzb2FwKTsKKyAgICAgIHNvYXBfZG9uZSh0c29hcCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmIChvcHRpb25zW09QVElPTl92XS5zZWxlY3RlZCkKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiVGhyZWFkICVkIGFjY2VwdGVkIGEgcmVxdWVzdFxuIiwgKGludCl0c29hcC0+dXNlcik7CisgICAgaWYgKHNvYXBfc2VydmUodHNvYXApKQorICAgIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiVGhyZWFkICVkIGZpbmlzaGVkIHNlcnZpbmcgcmVxdWVzdCB3aXRoIGZhaWx1cmUgJWRcbiIsIChpbnQpdHNvYXAtPnVzZXIsIHRzb2FwLT5lcnJvcik7CisgICAgICBzb2FwX3ByaW50X2ZhdWx0KHRzb2FwLCBzdGRlcnIpOworICAgIH0KKyAgICBlbHNlIGlmIChvcHRpb25zW09QVElPTl92XS5zZWxlY3RlZCkKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiVGhyZWFkICVkIGZpbmlzaGVkIHNlcnZpbmcgcmVxdWVzdFxuIiwgKGludCl0c29hcC0+dXNlcik7CisKKyAgICBzb2FwX2Rlc3Ryb3kodHNvYXApOworICAgIHNvYXBfZW5kKHRzb2FwKTsKKyAgfQorCisgIHJldHVybiBOVUxMOworfQorCitpbnQgZW5xdWV1ZShTT0FQX1NPQ0tFVCBzb2NrKQoreworICBpbnQgc3RhdHVzID0gU09BUF9PSzsKKyAgaW50IG5leHQ7CisgIGludCByZXQ7CisKKyAgaWYgKChyZXQgPSBNVVRFWF9MT0NLKHF1ZXVlX2NzKSkpCisgICAgZnByaW50ZihzdGRlcnIsICJNVVRFWF9MT0NLIGVycm9yICVkXG4iLCByZXQpOworCisgIG5leHQgPSAodGFpbCArIDEpICUgTUFYX1FVRVVFOworICBpZiAoaGVhZCA9PSBuZXh0KQorICB7CisgICAgLyogZG9uJ3QgYmxvY2sgb24gZnVsbCBxdWV1ZSwgcmV0dXJuIFNPQVBfRU9NICovCisgICAgc3RhdHVzID0gU09BUF9FT007CisgIH0KKyAgZWxzZQorICB7CisgICAgcXVldWVbdGFpbF0gPSBzb2NrOworICAgIHRhaWwgPSBuZXh0OworCisgICAgaWYgKG9wdGlvbnNbT1BUSU9OX3ZdLnNlbGVjdGVkKQorICAgICAgZnByaW50ZihzdGRlcnIsICJlbnF1ZXVlKCVkKVxuIiwgc29jayk7CisKKyAgICBpZiAoKHJldCA9IENPTkRfU0lHTkFMKHF1ZXVlX2N2KSkpCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNPTkRfU0lHTkFMIGVycm9yICVkXG4iLCByZXQpOworICB9CisKKyAgaWYgKChyZXQgPSBNVVRFWF9VTkxPQ0socXVldWVfY3MpKSkKKyAgICBmcHJpbnRmKHN0ZGVyciwgIk1VVEVYX1VOTE9DSyBlcnJvciAlZFxuIiwgcmV0KTsKKworICByZXR1cm4gc3RhdHVzOworfQorCitTT0FQX1NPQ0tFVCBkZXF1ZXVlKCkKK3sKKyAgU09BUF9TT0NLRVQgc29jazsKKyAgaW50IHJldDsKKworICBpZiAoKHJldCA9IE1VVEVYX0xPQ0socXVldWVfY3MpKSkKKyAgICBmcHJpbnRmKHN0ZGVyciwgIk1VVEVYX0xPQ0sgZXJyb3IgJWRcbiIsIHJldCk7CisKKyAgd2hpbGUgKGhlYWQgPT0gdGFpbCkKKyAgICBpZiAoKHJldCA9IENPTkRfV0FJVChxdWV1ZV9jdiwgcXVldWVfY3MpKSkKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiQ09ORF9XQUlUIGVycm9yICVkXG4iLCByZXQpOworCisgIHNvY2sgPSBxdWV1ZVtoZWFkXTsKKyAgCisgIGhlYWQgPSAoaGVhZCArIDEpICUgTUFYX1FVRVVFOworCisgIGlmIChvcHRpb25zW09QVElPTl92XS5zZWxlY3RlZCkKKyAgICBmcHJpbnRmKHN0ZGVyciwgImRlcXVldWUoJWQpXG4iLCBzb2NrKTsKKworICBpZiAoKHJldCA9IE1VVEVYX1VOTE9DSyhxdWV1ZV9jcykpKQorICAgIGZwcmludGYoc3RkZXJyLCAiTVVURVhfVU5MT0NLIGVycm9yICVkXG4iLCByZXQpOworCisgIHJldHVybiBzb2NrOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqCVNPQVAvWE1MIGhhbmRsaW5nOiBjYWxjdWxhdG9yIGV4YW1wbGUKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgbnNfX2FkZChzdHJ1Y3Qgc29hcCAqc29hcCwgZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgKmMpCit7CisgICpjID0gYSArIGI7CisgIHJldHVybiBTT0FQX09LOworfQorCitpbnQgbnNfX3N1YihzdHJ1Y3Qgc29hcCAqc29hcCwgZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgKmMpCit7CisgICpjID0gYSAtIGI7CisgIHJldHVybiBTT0FQX09LOworfQorCitpbnQgbnNfX211bChzdHJ1Y3Qgc29hcCAqc29hcCwgZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgKmMpCit7CisgICpjID0gYSAqIGI7CisgIHJldHVybiBTT0FQX09LOworfQorCitpbnQgbnNfX2RpdihzdHJ1Y3Qgc29hcCAqc29hcCwgZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgKmMpCit7CisgICpjID0gYSAvIGI7CisgIHJldHVybiBTT0FQX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqCVNlcnZlciBkdW1teSBtZXRob2RzIHRvIGF2b2lkIGxpbmsgZXJyb3JzCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IG5zX19hZGRSZXNwb25zZV8oc3RydWN0IHNvYXAgKnNvYXAsIGRvdWJsZSBhKQoreworICByZXR1cm4gU09BUF9OT19NRVRIT0Q7IC8qIHdlIGRvbid0IHVzZSB0aGlzOiB3ZSB1c2Ugc29hcF9zZW5kX25zX19hZGRSZXNwb25zZSBpbnN0ZWFkICovCit9CisKK2ludCBuc19fc3ViUmVzcG9uc2VfKHN0cnVjdCBzb2FwICpzb2FwLCBkb3VibGUgYSkKK3sKKyAgcmV0dXJuIFNPQVBfTk9fTUVUSE9EOyAvKiB3ZSBkb24ndCB1c2UgdGhpczogd2UgdXNlIHNvYXBfc2VuZF9uc19fc3ViUmVzcG9uc2UgaW5zdGVhZCAqLworfQorCitpbnQgbnNfX211bFJlc3BvbnNlXyhzdHJ1Y3Qgc29hcCAqc29hcCwgZG91YmxlIGEpCit7CisgIHJldHVybiBTT0FQX05PX01FVEhPRDsgLyogd2UgZG9uJ3QgdXNlIHRoaXM6IHdlIHVzZSBzb2FwX3NlbmRfbnNfX211bFJlc3BvbnNlIGluc3RlYWQgKi8KK30KKworaW50IG5zX19kaXZSZXNwb25zZV8oc3RydWN0IHNvYXAgKnNvYXAsIGRvdWJsZSBhKQoreworICByZXR1cm4gU09BUF9OT19NRVRIT0Q7IC8qIHdlIGRvbid0IHVzZSB0aGlzOiB3ZSB1c2Ugc29hcF9zZW5kX25zX19kaXZSZXNwb25zZSBpbnN0ZWFkICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJSFRUUCBHRVQgaGFuZGxlciBmb3IgcGx1Z2luCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IGh0dHBfZ2V0X2hhbmRsZXIoc3RydWN0IHNvYXAgKnNvYXApCit7CisgIC8qIGdTT0FQID49Mi41IHNvYXBfcmVzcG9uc2UoKSB3aWxsIGRvIHRoaXMgYXV0b21hdGljYWxseSBmb3IgdXMsIHdoZW4gc2VuZGluZyBTT0FQX0hUTUwgb3IgU09BUF9GSUxFOgorICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JTykgIT0gU09BUF9JT19DSFVOSykKKyAgICBzb2FwX3NldF9vbW9kZShzb2FwLCBTT0FQX0lPX1NUT1JFKTsgKi8gLyogaWYgbm90IGNodW5raW5nIHdlIE1VU1QgYnVmZmVyIGVudGlyZSBjb250ZW50IHdoZW4gcmV0dXJuaW5nIEhUTUwgcGFnZXMgdG8gZGV0ZXJtaW5lIGNvbnRlbnQgbGVuZ3RoICovCisjaWZkZWYgV0lUSF9aTElCCisgIGlmIChvcHRpb25zW09QVElPTl96XS5zZWxlY3RlZCAmJiBzb2FwLT56bGliX291dCA9PSBTT0FQX1pMSUJfR1pJUCkgLyogY2xpZW50IGFjY2VwdHMgZ3ppcCAqLworICAgIHNvYXBfc2V0X29tb2RlKHNvYXAsIFNPQVBfRU5DX1pMSUIpOyAvKiBzbyB3ZSBjYW4gY29tcHJlc3MgY29udGVudCAoZ3ppcCkgKi8KKyAgc29hcC0+el9sZXZlbCA9IDk7IC8qIGJlc3QgY29tcHJlc3Npb24gKi8KKyNlbmRpZgorICAvKiBVc2Ugc29hcC0+cGF0aCAoZnJvbSByZXF1ZXN0IFVSTCkgdG8gZGV0ZXJtaW5lIHJlcXVlc3Q6ICovCisgIGlmIChvcHRpb25zW09QVElPTl92XS5zZWxlY3RlZCkKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkhUVFAgR0VUIFJlcXVlc3Q6ICVzXG4iLCBzb2FwLT5lbmRwb2ludCk7CisgIC8qIE5vdGU6IHNvYXAtPnBhdGggYWx3YXlzIHN0YXJ0cyB3aXRoICcvJyAqLworICBpZiAoc3RyY2hyKHNvYXAtPnBhdGggKyAxLCAnLycpIHx8IHN0cmNocihzb2FwLT5wYXRoICsgMSwgJ1xcJykpCS8qIHdlIGRvbid0IGxpa2Ugc25vb3BpbmcgaW4gZGlycyAqLworICAgIHJldHVybiA0MDM7IC8qIEhUVFAgZm9yYmlkZGVuICovCisgIGlmICghc29hcF90YWdfY21wKHNvYXAtPnBhdGgsICIqLmh0bWwiKSkKKyAgICByZXR1cm4gY29weV9maWxlKHNvYXAsIHNvYXAtPnBhdGggKyAxLCAidGV4dC9odG1sIik7CisgIGlmICghc29hcF90YWdfY21wKHNvYXAtPnBhdGgsICIqLnhtbCIpCisgICB8fCAhc29hcF90YWdfY21wKHNvYXAtPnBhdGgsICIqLnhzZCIpCisgICB8fCAhc29hcF90YWdfY21wKHNvYXAtPnBhdGgsICIqLndzZGwiKSkKKyAgICByZXR1cm4gY29weV9maWxlKHNvYXAsIHNvYXAtPnBhdGggKyAxLCAidGV4dC94bWwiKTsKKyAgaWYgKCFzb2FwX3RhZ19jbXAoc29hcC0+cGF0aCwgIiouanBnIikpCisgICAgcmV0dXJuIGNvcHlfZmlsZShzb2FwLCBzb2FwLT5wYXRoICsgMSwgImltYWdlL2pwZWciKTsKKyAgaWYgKCFzb2FwX3RhZ19jbXAoc29hcC0+cGF0aCwgIiouZ2lmIikpCisgICAgcmV0dXJuIGNvcHlfZmlsZShzb2FwLCBzb2FwLT5wYXRoICsgMSwgImltYWdlL2dpZiIpOworICBpZiAoIXNvYXBfdGFnX2NtcChzb2FwLT5wYXRoLCAiKi5wbmciKSkKKyAgICByZXR1cm4gY29weV9maWxlKHNvYXAsIHNvYXAtPnBhdGggKyAxLCAiaW1hZ2UvcG5nIik7CisgIGlmICghc29hcF90YWdfY21wKHNvYXAtPnBhdGgsICIqLmljbyIpKQorICAgIHJldHVybiBjb3B5X2ZpbGUoc29hcCwgc29hcC0+cGF0aCArIDEsICJpbWFnZS9pY28iKTsKKyAgaWYgKCFzdHJuY21wKHNvYXAtPnBhdGgsICIvY2FsYz8iLCA2KSkKKyAgICByZXR1cm4gY2FsY2dldChzb2FwKTsKKyAgaWYgKCFzdHJuY21wKHNvYXAtPnBhdGgsICIvZ2VuaXZpYSIsIDgpKQorICB7IHN0cmNweShzb2FwLT5lbmRwb2ludCwgImh0dHA6Ly9nZW5pdmlhLmNvbSIpOyAvKiByZWRpcmVjdCAqLworICAgIHN0cmNhdChzb2FwLT5lbmRwb2ludCwgc29hcC0+cGF0aCArIDgpOworICAgIHJldHVybiAzMDc7IC8qIFRlbXBvcmFyeSBSZWRpcmVjdCAqLworICB9CisgIC8qIENoZWNrIHJlcXVlc3RvcidzIGF1dGhlbnRpY2F0aW9uOiAqLworICBpZiAoY2hlY2tfYXV0aGVudGljYXRpb24oc29hcCkpCisgICAgcmV0dXJuIDQwMTsgLyogSFRUUCBub3QgYXV0aG9yaXplZCAqLworICAvKiBSZXR1cm4gV2ViIHNlcnZlciBzdGF0dXMgKi8KKyAgaWYgKHNvYXAtPnBhdGhbMV0gPT0gJ1wwJyB8fCBzb2FwLT5wYXRoWzFdID09ICc/JykKKyAgICByZXR1cm4gaW5mbyhzb2FwKTsKKyAgcmV0dXJuIDQwNDsgLyogSFRUUCBub3QgZm91bmQgKi8KK30KKworaW50IGNoZWNrX2F1dGhlbnRpY2F0aW9uKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcC0+dXNlcmlkICYmIHNvYXAtPnBhc3N3ZCkKKyAgeyBpZiAoIXN0cmNtcChzb2FwLT51c2VyaWQsIEFVVEhfVVNFUklEKSAmJiAhc3RyY21wKHNvYXAtPnBhc3N3ZCwgQVVUSF9QQVNTV0QpKQorICAgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNpZmRlZiBIVFRQREFfSAorICBlbHNlIGlmIChzb2FwLT5hdXRocmVhbG0gJiYgc29hcC0+dXNlcmlkKQorICB7IGlmICghc3RyY21wKHNvYXAtPmF1dGhyZWFsbSwgQVVUSF9SRUFMTSkgJiYgIXN0cmNtcChzb2FwLT51c2VyaWQsIEFVVEhfVVNFUklEKSkKKyAgICAgIGlmICghaHR0cF9kYV92ZXJpZnlfZ2V0KHNvYXAsIEFVVEhfUEFTU1dEKSkKKyAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNlbmRpZgorICBzb2FwLT5hdXRocmVhbG0gPSBBVVRIX1JFQUxNOworICByZXR1cm4gNDAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqCUhUVFAgUE9TVCBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQgaGFuZGxlciBmb3IgcGx1Z2luCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IGh0dHBfZm9ybV9oYW5kbGVyKHN0cnVjdCBzb2FwICpzb2FwKQoreworI2lmZGVmIFdJVEhfWkxJQgorICBpZiAob3B0aW9uc1tPUFRJT05fel0uc2VsZWN0ZWQgJiYgc29hcC0+emxpYl9vdXQgPT0gU09BUF9aTElCX0daSVApIC8qIGNsaWVudCBhY2NlcHRzIGd6aXAgKi8KKyAgICBzb2FwX3NldF9vbW9kZShzb2FwLCBTT0FQX0VOQ19aTElCKTsgLyogc28gd2UgY2FuIGNvbXByZXNzIGNvbnRlbnQgKGd6aXApICovCisgIHNvYXAtPnpfbGV2ZWwgPSA5OyAvKiBiZXN0IGNvbXByZXNzaW9uICovCisjZW5kaWYKKyAgLyogVXNlIHNvYXAtPnBhdGggKGZyb20gcmVxdWVzdCBVUkwpIHRvIGRldGVybWluZSByZXF1ZXN0OiAqLworICBpZiAob3B0aW9uc1tPUFRJT05fdl0uc2VsZWN0ZWQpCisgICAgZnByaW50ZihzdGRlcnIsICJIVFRQIFBPU1QgUmVxdWVzdDogJXNcbiIsIHNvYXAtPmVuZHBvaW50KTsKKyAgLyogTm90ZTogc29hcC0+cGF0aCBhbHdheXMgc3RhcnRzIHdpdGggJy8nICovCisgIGlmICghc3RyY21wKHNvYXAtPnBhdGgsICIvY2FsYyIpKQorICAgIHJldHVybiBjYWxjcG9zdChzb2FwKTsKKyAgcmV0dXJuIDQwNDsgLyogSFRUUCBub3QgZm91bmQgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglDb3B5IHN0YXRpYyBwYWdlCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IGNvcHlfZmlsZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdHlwZSkKK3sgRklMRSAqZmQ7CisgIHNpemVfdCByOworICBmZCA9IGZvcGVuKG5hbWUsICJyYiIpOyAvKiBvcGVuIGZpbGUgdG8gY29weSAqLworICBpZiAoIWZkKQorICAgIHJldHVybiA0MDQ7IC8qIHJldHVybiBIVFRQIG5vdCBmb3VuZCAqLworICBzb2FwLT5odHRwX2NvbnRlbnQgPSB0eXBlOworICBpZiAoc29hcF9yZXNwb25zZShzb2FwLCBTT0FQX0ZJTEUpKSAvKiBPSyBIVFRQIHJlc3BvbnNlIGhlYWRlciAqLworICB7IHNvYXBfZW5kX3NlbmQoc29hcCk7CisgICAgZmNsb3NlKGZkKTsKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgZm9yICg7OykKKyAgeyByID0gZnJlYWQoc29hcC0+dG1wYnVmLCAxLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgZmQpOworICAgIGlmICghcikKKyAgICAgIGJyZWFrOworICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHNvYXAtPnRtcGJ1ZiwgcikpCisgICAgeyBzb2FwX2VuZF9zZW5kKHNvYXApOworICAgICAgZmNsb3NlKGZkKTsKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgIH0KKyAgZmNsb3NlKGZkKTsKKyAgcmV0dXJuIHNvYXBfZW5kX3NlbmQoc29hcCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJRXhhbXBsZSBkeW5hbWljIEhUVFAgR0VUIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBjYWxjdWxhdG9yCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IGNhbGNnZXQoc3RydWN0IHNvYXAgKnNvYXApCit7IGludCBvID0gMCwgYSA9IDAsIGIgPSAwLCB2YWw7CisgIGNoYXIgYnVmWzI1Nl07CisgIGNoYXIgKnMgPSBxdWVyeShzb2FwKTsgLyogZ2V0IGFyZ3VtZW50IHN0cmluZyBmcm9tIFVSTCA/cXVlcnkgc3RyaW5nICovCisgIHdoaWxlIChzKQorICB7IGNoYXIgKmtleSA9IHF1ZXJ5X2tleShzb2FwLCAmcyk7IC8qIGRlY29kZSBuZXh0IHF1ZXJ5IHN0cmluZyBrZXkgKi8KKyAgICBjaGFyICp2YWwgPSBxdWVyeV92YWwoc29hcCwgJnMpOyAvKiBkZWNvZGUgbmV4dCBxdWVyeSBzdHJpbmcgdmFsdWUgKGlmIGFueSkgKi8KKyAgICBpZiAoa2V5ICYmIHZhbCkKKyAgICB7IGlmICghc3RyY21wKGtleSwgIm8iKSkKKyAgICAgICAgbyA9IHZhbFswXTsKKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAoa2V5LCAiYSIpKQorICAgICAgICBhID0gc3RydG9sKHZhbCwgTlVMTCwgMTApOworICAgICAgZWxzZSBpZiAoIXN0cmNtcChrZXksICJiIikpCisgICAgICAgIGIgPSBzdHJ0b2wodmFsLCBOVUxMLCAxMCk7CisgICAgfQorICB9CisgIHN3aXRjaCAobykKKyAgeyBjYXNlICdhJzoKKyAgICAgIHZhbCA9IGEgKyBiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAncyc6CisgICAgICB2YWwgPSBhIC0gYjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ20nOgorICAgICAgdmFsID0gYSAqIGI7CisgICAgICBicmVhazsKKyAgICBjYXNlICdkJzoKKyAgICAgIHZhbCA9IGEgLyBiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBzb2FwX3NlbmRlcl9mYXVsdChzb2FwLCAiVW5rbm93biBvcGVyYXRpb24iLCBOVUxMKTsKKyAgfQorICBzb2FwX3Jlc3BvbnNlKHNvYXAsIFNPQVBfSFRNTCk7CisgIHNwcmludGYoYnVmLCAiPGh0bWw+dmFsdWU9JWQ8L2h0bWw+IiwgdmFsKTsKKyAgc29hcF9zZW5kKHNvYXAsIGJ1Zik7CisgIHNvYXBfZW5kX3NlbmQoc29hcCk7CisgIHJldHVybiBTT0FQX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqCUV4YW1wbGUgZHluYW1pYyBIVFRQIFBPU1QgYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIGNhbGN1bGF0b3IKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgY2FsY3Bvc3Qoc3RydWN0IHNvYXAgKnNvYXApCit7IGludCBvID0gMCwgYSA9IDAsIGIgPSAwLCB2YWw7CisgIGNoYXIgYnVmWzI1Nl07CisgIGNoYXIgKnMgPSBmb3JtKHNvYXApOyAvKiBnZXQgZm9ybSBkYXRhIGZyb20gYm9keSAqLworICB3aGlsZSAocykKKyAgeyBjaGFyICprZXkgPSBxdWVyeV9rZXkoc29hcCwgJnMpOyAvKiBkZWNvZGUgbmV4dCBrZXkgKi8KKyAgICBjaGFyICp2YWwgPSBxdWVyeV92YWwoc29hcCwgJnMpOyAvKiBkZWNvZGUgbmV4dCB2YWx1ZSAoaWYgYW55KSAqLworICAgIGlmIChrZXkgJiYgdmFsKQorICAgIHsgaWYgKCFzdHJjbXAoa2V5LCAibyIpKQorICAgICAgICBvID0gdmFsWzBdOworICAgICAgZWxzZSBpZiAoIXN0cmNtcChrZXksICJhIikpCisgICAgICAgIGEgPSBzdHJ0b2wodmFsLCBOVUxMLCAxMCk7CisgICAgICBlbHNlIGlmICghc3RyY21wKGtleSwgImIiKSkKKyAgICAgICAgYiA9IHN0cnRvbCh2YWwsIE5VTEwsIDEwKTsKKyAgICB9CisgIH0KKyAgc3dpdGNoIChvKQorICB7IGNhc2UgJ2EnOgorICAgICAgdmFsID0gYSArIGI7CisgICAgICBicmVhazsKKyAgICBjYXNlICdzJzoKKyAgICAgIHZhbCA9IGEgLSBiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnbSc6CisgICAgICB2YWwgPSBhICogYjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2QnOgorICAgICAgdmFsID0gYSAvIGI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIHNvYXBfc2VuZGVyX2ZhdWx0KHNvYXAsICJVbmtub3duIG9wZXJhdGlvbiIsIE5VTEwpOworICB9CisgIHNvYXBfcmVzcG9uc2Uoc29hcCwgU09BUF9IVE1MKTsKKyAgc3ByaW50ZihidWYsICI8aHRtbD52YWx1ZT0lZDwvaHRtbD4iLCB2YWwpOworICBzb2FwX3NlbmQoc29hcCwgYnVmKTsKKyAgc29hcF9lbmRfc2VuZChzb2FwKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJRXhhbXBsZSBkeW5hbWljIEhUVFAgUE9TVCBtdWx0aXBhcnQvZm9ybS1kYXRhIGZvcm0tYmFzZWQgY2FsY3VsYXRvcgorICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBmX19mb3JtMShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaW50IG8gPSAwLCBhID0gMCwgYiA9IDAsIHZhbDsKKyAgY2hhciBidWZbMjU2XTsKKyAgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICBmb3IgKGNvbnRlbnQgPSBzb2FwLT5taW1lLmxpc3Q7IGNvbnRlbnQ7IGNvbnRlbnQgPSBjb250ZW50LT5uZXh0KQorICB7IGlmIChjb250ZW50LT5pZCAmJiBjb250ZW50LT5wdHIpCisgICAgeyAvKiBtYXkgaGF2ZSB0byBjaGVjayBjb250ZW50LT5lbmNvZGluZyB0byBjb252ZXJ0IGRhdGEgd2hlbiBuZWNlc3NhcnkhICovCisgICAgICBpZiAoIXN0cmNtcChjb250ZW50LT5pZCwgIm8iKSkKKyAgICAgICAgbyA9IGNvbnRlbnQtPnB0clswXTsKKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAoY29udGVudC0+aWQsICJhIikpCisgICAgICAgIGEgPSBzdHJ0b2woY29udGVudC0+cHRyLCBOVUxMLCAxMCk7CisgICAgICBlbHNlIGlmICghc3RyY21wKGNvbnRlbnQtPmlkLCAiYiIpKQorICAgICAgICBiID0gc3RydG9sKGNvbnRlbnQtPnB0ciwgTlVMTCwgMTApOworICAgIH0KKyAgfQorICBzd2l0Y2ggKG8pCisgIHsgY2FzZSAnYSc6CisgICAgICB2YWwgPSBhICsgYjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3MnOgorICAgICAgdmFsID0gYSAtIGI7CisgICAgICBicmVhazsKKyAgICBjYXNlICdtJzoKKyAgICAgIHZhbCA9IGEgKiBiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnZCc6CisgICAgICB2YWwgPSBhIC8gYjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gc29hcF9zZW5kZXJfZmF1bHQoc29hcCwgIlVua25vd24gb3BlcmF0aW9uIiwgTlVMTCk7CisgIH0KKyAgc29hcF9yZXNwb25zZShzb2FwLCBTT0FQX0hUTUwpOworICBzcHJpbnRmKGJ1ZiwgIjxodG1sPnZhbHVlPSVkPC9odG1sPiIsIHZhbCk7CisgIHNvYXBfc2VuZChzb2FwLCBidWYpOworICBzb2FwX2VuZF9zZW5kKHNvYXApOworICByZXR1cm4gU09BUF9PSzsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK2ludCBmX19mb3JtMihzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IGZfX2Zvcm1SZXNwb25zZSAqcmVzcG9uc2UpCit7IGludCBvID0gMCwgYSA9IDAsIGIgPSAwOworICBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgIGZvciAoY29udGVudCA9IHNvYXAtPm1pbWUubGlzdDsgY29udGVudDsgY29udGVudCA9IGNvbnRlbnQtPm5leHQpCisgIHsgaWYgKGNvbnRlbnQtPmlkICYmIGNvbnRlbnQtPnB0cikKKyAgICB7IC8qIG1heSBoYXZlIHRvIGNoZWNrIGNvbnRlbnQtPmVuY29kaW5nIHRvIGNvbnZlcnQgZGF0YSB3aGVuIG5lY2Vzc2FyeSEgKi8KKyAgICAgIGlmICghc3RyY21wKGNvbnRlbnQtPmlkLCAibyIpKQorICAgICAgICBvID0gY29udGVudC0+cHRyWzBdOworICAgICAgZWxzZSBpZiAoIXN0cmNtcChjb250ZW50LT5pZCwgImEiKSkKKyAgICAgICAgYSA9IHN0cnRvbChjb250ZW50LT5wdHIsIE5VTEwsIDEwKTsKKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAoY29udGVudC0+aWQsICJiIikpCisgICAgICAgIGIgPSBzdHJ0b2woY29udGVudC0+cHRyLCBOVUxMLCAxMCk7CisgICAgfQorICB9CisgIHN3aXRjaCAobykKKyAgeyBjYXNlICdhJzoKKyAgICAgIHJlc3BvbnNlLT5yZXN1bHQgPSBhICsgYjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3MnOgorICAgICAgcmVzcG9uc2UtPnJlc3VsdCA9IGEgLSBiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnbSc6CisgICAgICByZXNwb25zZS0+cmVzdWx0ID0gYSAqIGI7CisgICAgICBicmVhazsKKyAgICBjYXNlICdkJzoKKyAgICAgIHJlc3BvbnNlLT5yZXN1bHQgPSBhIC8gYjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gc29hcF9zZW5kZXJfZmF1bHQoc29hcCwgIlVua25vd24gb3BlcmF0aW9uIiwgTlVMTCk7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJRHluYW1pYyBXZWIgc2VydmVyIGluZm8gcGFnZQorICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBpbmZvKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3QgaHR0cF9nZXRfZGF0YSAqZ2V0ZGF0YTsKKyAgc3RydWN0IGxvZ2dpbmdfZGF0YSAqbG9nZGF0YTsKKyAgY29uc3QgY2hhciAqdDAsICp0MSwgKnQyLCAqdDMsICp0NCwgKnQ1LCAqdDYsICp0NzsKKyAgY2hhciBidWZbMjA0OF07IC8qIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBIVE1MIGNvbnRlbnQgKi8KKyAgc3RydWN0IHNvYXBfcGx1Z2luICpwOworICB0aW1lX3Qgbm93ID0gdGltZShOVUxMKSwgZWxhcHNlZCA9IG5vdyAtIHN0YXJ0OworICBxdWVyeV9vcHRpb25zKHNvYXAsIG9wdGlvbnMpOworICBpZiAoc29hcC0+b21vZGUgJiBTT0FQX0lPX0tFRVBBTElWRSkKKyAgICB0MCA9ICI8dGQgYWxpZ249J2NlbnRlcicgYmdjb2xvcj0nZ3JlZW4nPllFUzwvdGQ+IjsKKyAgZWxzZQorICAgIHQwID0gIjx0ZCBhbGlnbj0nY2VudGVyJyBiZ2NvbG9yPSdyZWQnPk5PPC90ZD4iOworI2lmZGVmIFdJVEhfQ09PS0lFUworICB0MSA9ICI8dGQgYWxpZ249J2NlbnRlcicgYmdjb2xvcj0nZ3JlZW4nPllFUzwvdGQ+IjsKKyAgLyogc29hcF9lbnZfY29va2llX3ZhbHVlKCkgcmV0dXJucyB2YWx1ZSBvZiBhIGNvb2tpZSByZWNlaXZlZCAoZnJvbSBjbGllbnQpICovCisgIGlmIChzb2FwX2Vudl9jb29raWVfdmFsdWUoc29hcCwgInZpc2l0IiwgTlVMTCwgTlVMTCkpCisgICAgdDIgPSAiPHRkIGFsaWduPSdjZW50ZXInIGJnY29sb3I9J2dyZWVuJz5QQVNTPC90ZD4iOworICBlbHNlCisgICAgdDIgPSAiPHRkIGFsaWduPSdjZW50ZXInIGJnY29sb3I9J3llbGxvdyc+V0FJVDwvdGQ+IjsKKyNlbHNlCisgIHQxID0gIjx0ZCBhbGlnbj0nY2VudGVyJyBiZ2NvbG9yPSdyZWQnPk5PPC90ZD4iOworICB0MiA9ICI8dGQgYWxpZ249J2NlbnRlcicgYmdjb2xvcj0nYmx1ZSc+Ti9BPC90ZD4iOworI2VuZGlmCisgIGlmIChzZWN1cmUpCisgIHsgdDMgPSAiPHRkIGFsaWduPSdjZW50ZXInIGJnY29sb3I9J2dyZWVuJz5ZRVM8L3RkPiI7CisgICAgaWYgKHNvYXAtPmltb2RlICYgU09BUF9FTkNfU1NMKQorICAgICAgdDQgPSAiPHRkIGFsaWduPSdjZW50ZXInIGJnY29sb3I9J2dyZWVuJz5QQVNTPC90ZD4iOworICAgIGVsc2UKKyAgICAgIHQ0ID0gIjx0ZCBhbGlnbj0nY2VudGVyJyBiZ2NvbG9yPSdyZWQnPjxibGluaz5GQUlMPC9ibGluaz48L3RkPiI7CisgIH0KKyAgZWxzZQorICB7IHQzID0gIjx0ZCBhbGlnbj0nY2VudGVyJyBiZ2NvbG9yPSdyZWQnPk5PPC90ZD4iOworICAgIHQ0ID0gIjx0ZCBhbGlnbj0nY2VudGVyJyBiZ2NvbG9yPSdibHVlJz5OL0E8L3RkPiI7CisgIH0KKyNpZmRlZiBXSVRIX1pMSUIKKyAgaWYgKG9wdGlvbnNbT1BUSU9OX3pdLnNlbGVjdGVkKQorICB7IHQ1ID0gIjx0ZCBhbGlnbj0nY2VudGVyJyBiZ2NvbG9yPSdncmVlbic+WUVTPC90ZD4iOworICAgIGlmIChzb2FwLT5vbW9kZSAmIFNPQVBfRU5DX1pMSUIpCisgICAgICB0NiA9ICI8dGQgYWxpZ249J2NlbnRlcicgYmdjb2xvcj0nZ3JlZW4nPlBBU1M8L3RkPiI7CisgICAgZWxzZQorICAgICAgdDYgPSAiPHRkIGFsaWduPSdjZW50ZXInIGJnY29sb3I9J3llbGxvdyc+V0FJVDwvdGQ+IjsKKyAgfQorICBlbHNlCisgIHsgdDUgPSAiPHRkIGFsaWduPSdjZW50ZXInIGJnY29sb3I9J3JlZCc+Tk88L3RkPiI7CisgICAgdDYgPSAiPHRkIGFsaWduPSdjZW50ZXInIGJnY29sb3I9J2JsdWUnPk4vQTwvdGQ+IjsKKyAgfQorI2Vsc2UKKyAgdDUgPSAiPHRkIGFsaWduPSdjZW50ZXInIGJnY29sb3I9J3JlZCc+Tk88L3RkPiI7CisgIHQ2ID0gIjx0ZCBhbGlnbj0nY2VudGVyJyBiZ2NvbG9yPSdibHVlJz5OL0E8L3RkPiI7CisjZW5kaWYKKyAgaWYgKG9wdGlvbnNbT1BUSU9OX2NdLnNlbGVjdGVkIHx8IChzb2FwLT5vbW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgICAgdDcgPSAiPHRkIGFsaWduPSdjZW50ZXInIGJnY29sb3I9J2dyZWVuJz5ZRVM8L3RkPiI7CisgIGVsc2UKKyAgICB0NyA9ICI8dGQgYWxpZ249J2NlbnRlcicgYmdjb2xvcj0ncmVkJz5OTzwvdGQ+IjsKKyAgaWYgKHNvYXBfcmVzcG9uc2Uoc29hcCwgU09BUF9IVE1MKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHNwcmludGYoYnVmLCAiXAorPGh0bWw+XAorPGhlYWQ+XAorPG1ldGEgbmFtZT0nQXV0aG9yJyBjb250ZW50PSdSb2JlcnQgQS4gdmFuIEVuZ2VsZW4nPlwKKzxtZXRhIG5hbWU9J0dlbmVyYXRvcicgY29udGVudD0nZ1NPQVAnPlwKKzxtZXRhIGh0dHAtZXF1aXY9J1JlZnJlc2gnIGNvbnRlbnQ9JzYwJz5cCis8c3R5bGUgdHlwZT0ndGV4dC9jc3MnIG1lZGlhPSdzY3JlZW4nPjwhLS0gdGFibGUgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjNjY2IH0gdGQgeyBjb2xvcjogd2hpdGU7IGZvbnQtc2l6ZTogMTBweDsgbGluZS1oZWlnaHQ6IDEwcHg7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBHZW5ldmEsIFN3aXNzLCBTdW5TYW5zLVJlZ3VsYXIgfSAtLT48L3N0eWxlPlwKKzx0aXRsZT5nU09BUCBXZWIgU2VydmVyIEFkbWluaXN0cmF0aW9uPC90aXRsZT5cCis8L2hlYWQ+XAorPGJvZHkgYmdjb2xvcj0nI0ZGRkZGRic+XAorPGgxPmdTT0FQIFdlYiBTZXJ2ZXIgQWRtaW5pc3RyYXRpb248L2gxPlwKKzxwPlNlcnZlciBlbmRwb2ludD0lcyBjbGllbnQgYWdlbnQgSVA9JWQuJWQuJWQuJWRcCis8aDI+UmVnaXN0ZXJlZCBQbHVnaW5zPC9oMj5cCisiLCBzb2FwLT5lbmRwb2ludCwgKGludCkoc29hcC0+aXA+PjI0KSYweEZGLCAoaW50KShzb2FwLT5pcD4+MTYpJjB4RkYsIChpbnQpKHNvYXAtPmlwPj44KSYweEZGLCAoaW50KXNvYXAtPmlwJjB4RkYpOworICBpZiAoc29hcF9zZW5kKHNvYXAsIGJ1ZikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBmb3IgKHAgPSBzb2FwLT5wbHVnaW5zOyBwOyBwID0gcC0+bmV4dCkKKyAgeyBzcHJpbnRmKGJ1ZiwgIiVzPGJyPiIsIHAtPmlkKTsKKyAgICBpZiAoc29hcF9zZW5kKHNvYXAsIGJ1ZikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHNvYXBfc2VuZChzb2FwLCAiPGgyPkVsYXBzZWQgVGltZTwvaDI+IikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoZWxhcHNlZCA+PSA4NjQwMCkKKyAgICBodG1sX2hiYXIoc29hcCwgIkRheXM6IiwgMTAwLCBlbGFwc2VkLzg2NDAwLCAweDAwMDAwMCk7CisgIGlmIChlbGFwc2VkID49IDM2MDApCisgICAgaHRtbF9oYmFyKHNvYXAsICJIb3VyczoiLCAxMDAsIGVsYXBzZWQvMzYwMCUyNCwgMHgwMDAwMDApOworICBodG1sX2hiYXIoc29hcCwgIk1pbnV0ZXM6IiwgMTAwLCBlbGFwc2VkLzYwJTYwLCAweDAwMDAwMCk7CisgIHNvYXBfc2VuZChzb2FwLCAiPGgyPkNvbnRyb2wgUGFuZWw8L2gyPiIpOworICBpZiAoaHRtbF9mb3JtX29wdGlvbnMoc29hcCwgb3B0aW9ucykpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBzcHJpbnRmKGJ1ZiwgIlwKKzxoMj5GdW5jdGlvbiBUZXN0czwvaDI+XAorPHRhYmxlIGJvcmRlcj0nMCcgY2VsbHNwYWNpbmc9JzAnIGNlbGxwYWRkaW5nPScwJyBiZ2NvbG9yPScjNjY2NjY2JyBub3NhdmU+XAorPHRyIGhlaWdodD0nMTAnPjx0ZCBoZWlnaHQ9JzEwJyBiYWNrZ3JvdW5kPSdibC5naWYnPjwvdGQ+PHRkIGhlaWdodD0nMTAnPjxpPkZ1bmN0aW9uPC9pPjwvdGQ+PHRkIGFsaWduPSdjZW50ZXInIGhlaWdodD0nMTAnPjxpPlJlc3VsdDwvaT48L3RkPjx0ZCBoZWlnaHQ9JzEwJyBiYWNrZ3JvdW5kPSdvYmxzLmdpZic+PC90ZD48L3RyPlwKKzx0cj48dGQgYmFja2dyb3VuZD0nYmwuZ2lmJz48L3RkPjx0ZD5IVFRQIG9wZXJhdGlvbmFsPC90ZD48dGQgYWxpZ249J2NlbnRlcicgYmdjb2xvcj0nZ3JlZW4nPllFUzwvdGQ+PHRkIHdpZHRoPScxMCcgYmFja2dyb3VuZD0nbHMuZ2lmJz48L3RkPjwvdHI+XAorPHRyPjx0ZCBiYWNrZ3JvdW5kPSdibC5naWYnPjwvdGQ+PHRkPkhUVFAga2VlcCBhbGl2ZSBlbmFibGVkPC90ZD4lczx0ZCB3aWR0aD0nMTAnIGJhY2tncm91bmQ9J2xzLmdpZic+PC90ZD48L3RyPlwKKzx0cj48dGQgYmFja2dyb3VuZD0nYmwuZ2lmJz48L3RkPjx0ZD5IVFRQIGNvb2tpZXMgZW5hYmxlZDwvdGQ+JXM8dGQgd2lkdGg9JzEwJyBiYWNrZ3JvdW5kPSdscy5naWYnPjwvdGQ+PC90cj5cCis8dHI+PHRkIGJhY2tncm91bmQ9J2JsLmdpZic+PC90ZD48dGQ+SFRUUCBjb29raWVzIHRlc3Q8L3RkPiVzPHRkIHdpZHRoPScxMCcgYmFja2dyb3VuZD0nbHMuZ2lmJz48L3RkPjwvdHI+XAorPHRyPjx0ZCBiYWNrZ3JvdW5kPSdibC5naWYnPjwvdGQ+PHRkPkhUVFBTIChPcGVuU1NMKSBlbmFibGVkPC90ZD4lczx0ZCB3aWR0aD0nMTAnIGJhY2tncm91bmQ9J2xzLmdpZic+PC90ZD48L3RyPlwKKzx0cj48dGQgYmFja2dyb3VuZD0nYmwuZ2lmJz48L3RkPjx0ZD5IVFRQUyAoT3BlblNTTCkgdGVzdDwvdGQ+JXM8dGQgd2lkdGg9JzEwJyBiYWNrZ3JvdW5kPSdscy5naWYnPjwvdGQ+PC90cj5cCis8dHI+PHRkIGJhY2tncm91bmQ9J2JsLmdpZic+PC90ZD48dGQ+SFRUUCBjb21wcmVzc2lvbiBlbmFibGVkPC90ZD4lczx0ZCB3aWR0aD0nMTAnIGJhY2tncm91bmQ9J2xzLmdpZic+PC90ZD48L3RyPlwKKzx0cj48dGQgYmFja2dyb3VuZD0nYmwuZ2lmJz48L3RkPjx0ZD5IVFRQIGNvbXByZXNzaW9uIHRlc3Q8L3RkPiVzPHRkIHdpZHRoPScxMCcgYmFja2dyb3VuZD0nbHMuZ2lmJz48L3RkPjwvdHI+XAorPHRyPjx0ZCBiYWNrZ3JvdW5kPSdibC5naWYnPjwvdGQ+PHRkPkhUVFAgY2h1bmtpbmcgZW5hYmxlZDwvdGQ+JXM8dGQgd2lkdGg9JzEwJyBiYWNrZ3JvdW5kPSdscy5naWYnPjwvdGQ+PC90cj5cCis8dHIgaGVpZ2h0PScxMCc+PHRkIHdpZHRoPScxMCcgaGVpZ2h0PScxMCcgYmFja2dyb3VuZD1vdHJzLmdpZj48L3RkPjx0ZCBoZWlnaHQ9JzEwJyBiYWNrZ3JvdW5kPSd0cy5naWYnPjwvdGQ+PHRkIGhlaWdodD0nMTAnIGJhY2tncm91bmQ9J3RzLmdpZic+PC90ZD48dGQgd2lkdGg9JzEwJyBoZWlnaHQ9JzEwJyBiYWNrZ3JvdW5kPSdvdGxzLmdpZic+PC90ZD48L3RyPlwKKzwvdGFibGU+IiwgdDAsIHQxLCB0MiwgdDMsIHQ0LCB0NSwgdDYsIHQ3KTsKKyAgaWYgKHNvYXBfc2VuZChzb2FwLCBidWYpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgZ2V0ZGF0YSA9IChzdHJ1Y3QgaHR0cF9nZXRfZGF0YSopc29hcF9sb29rdXBfcGx1Z2luKHNvYXAsIGh0dHBfZ2V0X2lkKTsKKyAgbG9nZGF0YSA9IChzdHJ1Y3QgbG9nZ2luZ19kYXRhKilzb2FwX2xvb2t1cF9wbHVnaW4oc29hcCwgbG9nZ2luZ19pZCk7CisgIHNvYXBfc2VuZChzb2FwLCAiPGgyPlVzYWdlIFN0YXRpc3RpY3M8L2gyPiIpOworICBpZiAoZ2V0ZGF0YSkKKyAgeyBodG1sX2hiYXIoc29hcCwgIkhUVFAmbmJzcDtHRVQiLCAxMjAsIGdldGRhdGEtPnN0YXRfZ2V0LCAweDAwMDBGRik7CisgICAgaHRtbF9oYmFyKHNvYXAsICJIVFRQJm5ic3A7UE9TVCIsIDEyMCwgZ2V0ZGF0YS0+c3RhdF9wb3N0LCAweDAwRkYwMCk7CisgICAgaHRtbF9oYmFyKHNvYXAsICJIVFRQJm5ic3A7RkFJTCIsIDEyMCwgZ2V0ZGF0YS0+c3RhdF9mYWlsLCAweEZGMDAwMCk7CisgIH0KKyAgaWYgKGxvZ2RhdGEpCisgIHsgaHRtbF9oYmFyKHNvYXAsICJTRU5UKGtCKSIsIDEyMCwgbG9nZGF0YS0+c3RhdF9zZW50LzEwMjQsIDB4MDBGRkZGKTsKKyAgICBodG1sX2hiYXIoc29hcCwgIlJFQ1Yoa0IpIiwgMTIwLCBsb2dkYXRhLT5zdGF0X3JlY3YvMTAyNCwgMHgwMEZGRkYpOworICAgIGlmIChlbGFwc2VkID4gMCkKKyAgICB7IGh0bWxfaGJhcihzb2FwLCAiU0VOVChrQi9zKSIsIDEyMCwgbG9nZGF0YS0+c3RhdF9zZW50L2VsYXBzZWQvMTAyNCwgMHgwMEZGRkYpOworICAgICAgaHRtbF9oYmFyKHNvYXAsICJSRUNWKGtCL3MpIiwgMTIwLCBsb2dkYXRhLT5zdGF0X3JlY3YvZWxhcHNlZC8xMDI0LCAweDAwRkZGRik7CisgICAgfQorICB9CisgIGlmIChnZXRkYXRhKQorICB7IHN0cnVjdCB0bSBUOworICAgIFQudG1fbWluID0gOTk7CisgICAgVC50bV9ob3VyID0gOTk7CisgICAgVC50bV95ZGF5ID0gOTk5OworI2lmZGVmIEhBVkVfTE9DQUxUSU1FX1IKKyAgICBsb2NhbHRpbWVfcigmbm93LCAmVCk7CisjZWxzZQorICAgIFQgPSAqbG9jYWx0aW1lKCZub3cpOworI2VuZGlmCisgICAgc29hcF9zZW5kKHNvYXAsICI8aDI+UmVxdWVzdHMgYnkgdGhlIE1pbnV0ZTwvaDI+Iik7CisgICAgaHRtbF9oaXN0KHNvYXAsICJNaW51dGUiLCAxMiwgMCwgNjAsIG1pbnV0ZXMsIGdldGRhdGEtPm1pbiwgVC50bV9taW4pOworICAgIHNvYXBfc2VuZChzb2FwLCAiPGgyPlJlcXVlc3RzIGJ5IHRoZSBIb3VyPC9oMj4iKTsKKyAgICBodG1sX2hpc3Qoc29hcCwgIkhvdXIiLCAzMCwgMCwgMjQsIGhvdXJzLCBnZXRkYXRhLT5ob3VyLCBULnRtX2hvdXIpOworICAgIHNvYXBfc2VuZChzb2FwLCAiPGgyPlJlcXVlc3RzIGJ5IERheSBvZiB0aGUgWWVhcjwvaDI+Iik7CisgICAgaHRtbF9oaXN0KHNvYXAsICJEYXkiLCAyLCAwLCAzNjUsIE5VTEwsIGdldGRhdGEtPmRheSwgVC50bV95ZGF5KTsKKyAgfQorICBzb2FwX3NlbmQoc29hcCwgIlwKKzxwPlRoaXMgcGFnZSB3aWxsIGF1dG9tYXRpY2FsbHkgcmVsb2FkIGV2ZXJ5IG1pbnV0ZSB0byByZWZyZXNoIHRoZSBzdGF0aXN0aWNzLlwKKzxicj48YnI+PGJyPjxpbWcgc3JjPSdmYXZpY29uLmdpZicgYWxpZ249J2Fic21pZGRsZSc+UG93ZXJlZCBieSBnU09BUFwKKzwvYm9keT5cCis8L0hUTUw+Iik7CisgIHJldHVybiBzb2FwX2VuZF9zZW5kKHNvYXApOworfQorCitzdGF0aWMgc2l6ZV90IGh0bWxfc2NhbGVkKGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sgaWYgKGxlbiA+IDEwMDAwMDApCisgIHsgc3ByaW50ZihidWYsICIlLjJmJiMxODM7MTA8c3VwPjY8L3N1cD4iLCAoZmxvYXQpbGVuLzEwMDAwMDAuMCk7CisgICAgcmV0dXJuIGxlbiAvIDEwMDAwMDA7CisgIH0KKyAgaWYgKGxlbiA+IDEwMDApCisgIHsgc3ByaW50ZihidWYsICIlLjJmJiMxODM7MTA8c3VwPjM8L3N1cD4iLCAoZmxvYXQpbGVuLzEwMDAuMCk7CisgICAgcmV0dXJuIGxlbiAvIDEwMDA7CisgIH0KKyAgc3ByaW50ZihidWYsICIlbHUiLCAodW5zaWduZWQgbG9uZylsZW4pOworICByZXR1cm4gbGVuOworfQorCitpbnQgaHRtbF9oYmFyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0aXRsZSwgc2l6ZV90IHBpeCwgc2l6ZV90IGxlbiwgdW5zaWduZWQgbG9uZyBjb2xvcikKK3sgY2hhciBidWZbMjA0OF07IC8qIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBIVE1MIGNvbnRlbnQgKi8KKyAgY2hhciBsYWJbMzJdOworICBsZW4gPSBodG1sX3NjYWxlZChsYWIsIGxlbik7CisgIHNwcmludGYoYnVmLCAiXAorPHRhYmxlIGJvcmRlcj0nMCcgY2VsbHNwYWNpbmc9JzAnIGNlbGxwYWRkaW5nPScwJyBoZWlnaHQ9JzMwJz5cCis8dHIgaGVpZ2h0PScxMCc+XAorPHRkIHdpZHRoPScxMCcgaGVpZ2h0PScxMCcgYmFja2dyb3VuZD0nYmwuZ2lmJz48L3RkPlwKKzx0ZCByb3dzcGFuPScyJyBiZ2NvbG9yPScjNjY2NjY2JyB3aWR0aD0nJWx1JyBoZWlnaHQ9JzIwJz4lcyZuYnNwOyVzPC90ZD5cCis8dGQgYmdjb2xvcj0nIyUuNmx4JyB3aWR0aD0nJWx1JyBoZWlnaHQ9JzEwJz48L3RkPlwKKzx0ZCB3aWR0aD0nMTAnIGhlaWdodD0nMTAnIGJhY2tncm91bmQ9J29ibHMuZ2lmJz48L3RkPlwKKzwvdHI+XAorPHRyIGhlaWdodD0nMTAnPlwKKzx0ZCB3aWR0aD0nMTAnIGhlaWdodD0nMTAnIGJhY2tncm91bmQ9J2JsLmdpZic+PC90ZD5cCis8dGQgaGVpZ2h0PScxMCcgYmFja2dyb3VuZD0ncnVsZXIuZ2lmJz48L3RkPlwKKzx0ZCB3aWR0aD0nMTAnIGhlaWdodD0nMTAnIGJhY2tncm91bmQ9J2xzLmdpZic+PC90ZD5cCis8L3RyPlwKKzx0ciBoZWlnaHQ9JzEwJz5cCis8dGQgd2lkdGg9JzEwJyBoZWlnaHQ9JzEwJyBiYWNrZ3JvdW5kPSdvdHJzLmdpZic+PC90ZD5cCis8dGQgY29sc3Bhbj0nMicgaGVpZ2h0PScxMCcgYmFja2dyb3VuZD0ndHMuZ2lmJz48L3RkPlwKKzx0ZCB3aWR0aD0nMTAnIGhlaWdodD0nMTAnIGJhY2tncm91bmQ9J290bHMuZ2lmJz48L3RkPlwKKzwvdHI+XAorPC90YWJsZT4iLCAodW5zaWduZWQgbG9uZylwaXgsIHRpdGxlID8gdGl0bGUgOiAiIiwgbGFiLCBjb2xvciwgKHVuc2lnbmVkIGxvbmcpbGVuICogMik7CisgIHJldHVybiBzb2FwX3NlbmQoc29hcCwgYnVmKTsKK30KKworaW50IGh0bWxfaGlzdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGl0bGUsIHNpemVfdCBiYXJ3aWR0aCwgc2l6ZV90IGhlaWdodCwgc2l6ZV90IG51bSwgY29uc3QgY2hhciAqKmtleSwgc2l6ZV90ICp2YWwsIHNpemVfdCBoaWdobGlnaHQpCit7IGNoYXIgYnVmWzIwNDhdOyAvKiBidWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgSFRNTCBjb250ZW50ICovCisgIGNoYXIgbGFiWzMyXTsKKyAgc2l6ZV90IGksIG1heDsKKyAgZmxvYXQgc2NhbGU7CisgIG1heCA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKKyAgeyBpZiAodmFsW2ldID4gbWF4KQorICAgICAgbWF4ID0gdmFsW2ldOworICB9CisgIGlmIChoZWlnaHQgPCAyMCkKKyAgeyBoZWlnaHQgPSBtYXg7CisgICAgaWYgKGhlaWdodCA8IDIwKQorICAgICAgaGVpZ2h0ID0gMjA7CisgICAgZWxzZSBpZiAoaGVpZ2h0ID4gMjU2KQorICAgICAgaGVpZ2h0ID0gMjU2OworICB9CisgIHNjYWxlID0gKGZsb2F0KWhlaWdodCAvIChmbG9hdCltYXg7CisgIGh0bWxfc2NhbGVkKGxhYiwgbWF4KTsKKyAgc3ByaW50ZihidWYsICJcCis8YSBuYW1lPSclcyc+PC9hPlwKKzx0YWJsZSBiZ2NvbG9yPScjRkZGRkZGJyBib3JkZXI9JzAnIGNlbGxzcGFjaW5nPScwJyBjZWxscGFkZGluZz0nMCcgaGVpZ2h0PSclbHUnIGFsaWduPSdjZW50ZXInPlwKKzx0ciBoZWlnaHQ9JzEwJz5cCis8dGQgd2lkdGg9JzEwJyBoZWlnaHQ9JzEwJyBiYWNrZ3JvdW5kPSdidGwuZ2lmJz48L3RkPjx0ZCBjb2xzcGFuPSclbHUnIGhlaWdodD0nMTAnIGJhY2tncm91bmQ9J2J0LmdpZic+PC90ZD48dGQgd2lkdGg9JzEwJyBoZWlnaHQ9JzEwJyBiYWNrZ3JvdW5kPSdidHIuZ2lmJz48L3RkPjx0ZCB3aWR0aD0nMTAnIGhlaWdodD0nMTAnIGJhY2tncm91bmQ9J29ibHMuZ2lmJz48L3RkPlwKKzwvdHI+XAorPHRyIGhlaWdodD0nJWx1JyBhbGlnbj0nY2VudGVyJyB2YWxpZ249J2JvdHRvbSc+XAorPHRkIHdpZHRoPScxMCcgaGVpZ2h0PSclbHUnIGJhY2tncm91bmQ9J2JsLmdpZic+PC90ZD5cCis8dGQgYmdjb2xvcj0nIzY2NjY2NicgdmFsaWduPSd0b3AnPiVzPC90ZD4iLCB0aXRsZSA/IHRpdGxlIDogIiIsICh1bnNpZ25lZCBsb25nKWhlaWdodCArIDUwLCAodW5zaWduZWQgbG9uZyludW0gKyAxLCAodW5zaWduZWQgbG9uZyloZWlnaHQsICh1bnNpZ25lZCBsb25nKWhlaWdodCwgbGFiKTsKKyAgaWYgKHNvYXBfc2VuZChzb2FwLCBidWYpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQorICB7IHVuc2lnbmVkIGxvbmcgYmFyID0gKHNjYWxlICogdmFsW2ldICsgMC41KTsKKyAgICBpZiAoYmFyID49IDEpCisgICAgICBzcHJpbnRmKGJ1ZiwgIlwKKzx0ZCBiZ2NvbG9yPScjRkZGRkZGJz48YSBvbm1vdXNlb3Zlcj1cIndpbmRvdy5zdGF0dXM9JyVsdSc7cmV0dXJuIHRydWVcIiBvbm1vdXNlb3V0PVwid2luZG93LnN0YXR1cz0nJztyZXR1cm4gdHJ1ZVwiIGhyZWY9JyMlcyc+PGltZyBzcmM9J3RvcC5naWYnIGFsdD0nJyB3aWR0aD0nJWx1JyBoZWlnaHQ9JzEnIGFsaWduPSdib3R0b20nIGJvcmRlcj0nMCc+PGJyPjxpbWcgc3JjPSdiYXIuZ2lmJyBhbHQ9Jycgd2lkdGg9JyVsdScgaGVpZ2h0PSclbHUnIGFsaWduPSdib3R0b20nIGJvcmRlcj0nMCc+PC9hPjwvdGQ+IiwgKHVuc2lnbmVkIGxvbmcpaSwgdGl0bGUgPyB0aXRsZSA6ICIiLCAodW5zaWduZWQgbG9uZyliYXJ3aWR0aCwgKHVuc2lnbmVkIGxvbmcpYmFyd2lkdGgsIGJhciAtIDEpOworICAgIGVsc2UKKyAgICAgIHNwcmludGYoYnVmLCAiXAorPHRkIGJnY29sb3I9JyNGRkZGRkYnPjxpbWcgc3JjPSdiYXIuZ2lmJyBhbHQ9Jycgd2lkdGg9JyVsdScgaGVpZ2h0PScwJyBhbGlnbj0nYm90dG9tJyBib3JkZXI9JzAnPjwvdGQ+IiwgKHVuc2lnbmVkIGxvbmcpYmFyd2lkdGgpOworICAgIGlmIChzb2FwX3NlbmQoc29hcCwgYnVmKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBzcHJpbnRmKGJ1ZiwgIlwKKzx0ZCB3aWR0aD0nMTAnIGhlaWdodD0nJWx1JyBiYWNrZ3JvdW5kPSdici5naWYnPjwvdGQ+XAorPHRkIHdpZHRoPScxMCcgaGVpZ2h0PSclbHUnIGJhY2tncm91bmQ9J2xzLmdpZic+PC90ZD5cCis8L3RyPlwKKzx0ciBiZ2NvbG9yPScjNjY2NjY2JyBoZWlnaHQ9JzIwJyBhbGlnbj0nY2VudGVyJz5cCis8dGQgd2lkdGg9JzEwJyBoZWlnaHQ9JzIwJyBiYWNrZ3JvdW5kPSdibC5naWYnPjwvdGQ+XAorPHRkIGJnY29sb3I9JyM2NjY2NjYnPiVzPC90ZD4iLCAodW5zaWduZWQgbG9uZyloZWlnaHQsICh1bnNpZ25lZCBsb25nKWhlaWdodCwgdGl0bGUgPyB0aXRsZSA6ICIiKTsKKyAgaWYgKHNvYXBfc2VuZChzb2FwLCBidWYpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQorICB7IHNwcmludGYoYnVmLCAiPHRkJXM+JXM8L3RkPiIsIChpID09IGhpZ2hsaWdodCkgPyAiIGJnY29sb3I9JyM3Nzc3NzcnIiA6ICIiLCBrZXkgPyBrZXlbaV0gOiAiPGltZyBzcmM9J2Jhci5naWYnPiIpOworICAgIGlmIChzb2FwX3NlbmQoc29hcCwgYnVmKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAoc29hcF9zZW5kKHNvYXAsICJcCis8dGQgd2lkdGg9JzEwJyBoZWlnaHQ9JzIwJyBiYWNrZ3JvdW5kPSdici5naWYnPjwvdGQ+XAorPHRkIHdpZHRoPScxMCcgaGVpZ2h0PScyMCcgYmFja2dyb3VuZD0nbHMuZ2lmJz48L3RkPiIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgc3ByaW50ZihidWYsICJcCis8L3RyPlwKKzx0ciBoZWlnaHQ9JzEwJz5cCis8dGQgd2lkdGg9JzEwJyBoZWlnaHQ9JzEwJyBiYWNrZ3JvdW5kPSdiYmwuZ2lmJz48L3RkPjx0ZCBjb2xzcGFuPSclbHUnIGhlaWdodD0nMTAnIGJhY2tncm91bmQ9J2JiLmdpZic+PC90ZD48dGQgd2lkdGg9JzEwJyBoZWlnaHQ9JzEwJyBiYWNrZ3JvdW5kPSdiYnIuZ2lmJz48L3RkPjx0ZCB3aWR0aD0nMTAnIGhlaWdodD0nMTAnIGJhY2tncm91bmQ9J2xzLmdpZic+PC90ZD5cCis8L3RyPlwKKzx0ciBoZWlnaHQ9JzEwJz5cCis8dGQgd2lkdGg9JzEwJyBoZWlnaHQ9JzEwJyBiYWNrZ3JvdW5kPSdvdHJzLmdpZic+PC90ZD5cCis8dGQgY29sc3Bhbj0nJWx1JyBoZWlnaHQ9JzEwJyBiYWNrZ3JvdW5kPSd0cy5naWYnPjwvdGQ+XAorPHRkIHdpZHRoPScxMCcgaGVpZ2h0PScxMCcgYmFja2dyb3VuZD0nb3Rscy5naWYnPjwvdGQ+XAorPC90cj5cCis8L3RhYmxlPiIsICh1bnNpZ25lZCBsb25nKW51bSArIDEsICh1bnNpZ25lZCBsb25nKW51bSArIDIpOworICByZXR1cm4gc29hcF9zZW5kKHNvYXAsIGJ1Zik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJT3BlblNTTAorICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBXSVRIX09QRU5TU0wKKworc3RydWN0IENSWVBUT19keW5sb2NrX3ZhbHVlCit7IE1VVEVYX1RZUEUgbXV0ZXg7Cit9OworCitzdGF0aWMgTVVURVhfVFlQRSAqbXV0ZXhfYnVmOworCitzdGF0aWMgc3RydWN0IENSWVBUT19keW5sb2NrX3ZhbHVlICpkeW5fY3JlYXRlX2Z1bmN0aW9uKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKQoreyBzdHJ1Y3QgQ1JZUFRPX2R5bmxvY2tfdmFsdWUgKnZhbHVlOworICB2YWx1ZSA9IChzdHJ1Y3QgQ1JZUFRPX2R5bmxvY2tfdmFsdWUqKW1hbGxvYyhzaXplb2Yoc3RydWN0IENSWVBUT19keW5sb2NrX3ZhbHVlKSk7CisgIGlmICh2YWx1ZSkKKyAgICBNVVRFWF9TRVRVUCh2YWx1ZS0+bXV0ZXgpOworICByZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkIGR5bl9sb2NrX2Z1bmN0aW9uKGludCBtb2RlLCBzdHJ1Y3QgQ1JZUFRPX2R5bmxvY2tfdmFsdWUgKmwsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKQoreyBpZiAobW9kZSAmIENSWVBUT19MT0NLKQorICAgIE1VVEVYX0xPQ0sobC0+bXV0ZXgpOworICBlbHNlCisgICAgTVVURVhfVU5MT0NLKGwtPm11dGV4KTsKK30KKworc3RhdGljIHZvaWQgZHluX2Rlc3Ryb3lfZnVuY3Rpb24oc3RydWN0IENSWVBUT19keW5sb2NrX3ZhbHVlICpsLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKK3sgTVVURVhfQ0xFQU5VUChsLT5tdXRleCk7CisgIGZyZWUobCk7Cit9CisKK3ZvaWQgbG9ja2luZ19mdW5jdGlvbihpbnQgbW9kZSwgaW50IG4sIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKQoreyBpZiAobW9kZSAmIENSWVBUT19MT0NLKQorICAgIE1VVEVYX0xPQ0sobXV0ZXhfYnVmW25dKTsKKyAgZWxzZQorICAgIE1VVEVYX1VOTE9DSyhtdXRleF9idWZbbl0pOworfQorCit1bnNpZ25lZCBsb25nIGlkX2Z1bmN0aW9uKCkKK3sgcmV0dXJuICh1bnNpZ25lZCBsb25nKVRIUkVBRF9JRDsKK30KKworaW50IENSWVBUT190aHJlYWRfc2V0dXAoKQoreyBpbnQgaTsKKyAgbXV0ZXhfYnVmID0gKE1VVEVYX1RZUEUqKW1hbGxvYyhDUllQVE9fbnVtX2xvY2tzKCkgKiBzaXplb2YoTVVURVhfVFlQRSkpOworICBpZiAoIW11dGV4X2J1ZikKKyAgICByZXR1cm4gU09BUF9FT007CisgIGZvciAoaSA9IDA7IGkgPCBDUllQVE9fbnVtX2xvY2tzKCk7IGkrKykKKyAgICBNVVRFWF9TRVRVUChtdXRleF9idWZbaV0pOworICBDUllQVE9fc2V0X2lkX2NhbGxiYWNrKGlkX2Z1bmN0aW9uKTsKKyAgQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKGxvY2tpbmdfZnVuY3Rpb24pOworICBDUllQVE9fc2V0X2R5bmxvY2tfY3JlYXRlX2NhbGxiYWNrKGR5bl9jcmVhdGVfZnVuY3Rpb24pOworICBDUllQVE9fc2V0X2R5bmxvY2tfbG9ja19jYWxsYmFjayhkeW5fbG9ja19mdW5jdGlvbik7CisgIENSWVBUT19zZXRfZHlubG9ja19kZXN0cm95X2NhbGxiYWNrKGR5bl9kZXN0cm95X2Z1bmN0aW9uKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK3ZvaWQgQ1JZUFRPX3RocmVhZF9jbGVhbnVwKCkKK3sgaW50IGk7CisgIGlmICghbXV0ZXhfYnVmKQorICAgIHJldHVybjsKKyAgQ1JZUFRPX3NldF9pZF9jYWxsYmFjayhOVUxMKTsKKyAgQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKE5VTEwpOworICBDUllQVE9fc2V0X2R5bmxvY2tfY3JlYXRlX2NhbGxiYWNrKE5VTEwpOworICBDUllQVE9fc2V0X2R5bmxvY2tfbG9ja19jYWxsYmFjayhOVUxMKTsKKyAgQ1JZUFRPX3NldF9keW5sb2NrX2Rlc3Ryb3lfY2FsbGJhY2soTlVMTCk7CisgIGZvciAoaSA9IDA7IGkgPCBDUllQVE9fbnVtX2xvY2tzKCk7IGkrKykKKyAgICBNVVRFWF9DTEVBTlVQKG11dGV4X2J1ZltpXSk7CisgIGZyZWUobXV0ZXhfYnVmKTsKKyAgbXV0ZXhfYnVmID0gTlVMTDsKK30KKworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJU0lHUElQRQorICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgc2lncGlwZV9oYW5kbGUoaW50IHgpIHsgfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy93ZWJzZXJ2ZXIvd2Vic2VydmVyLmggYi9zYW1wbGVzL3dlYnNlcnZlci93ZWJzZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjU2ZDBmCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy93ZWJzZXJ2ZXIvd2Vic2VydmVyLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKword2Vic2VydmVyLmgKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMS0yMDA0LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzOgorR1BMIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyovCisKKy8vZ3NvYXAgbnMgc2VydmljZSBuYW1lOgl3ZWJzZXJ2ZXIKKy8vZ3NvYXAgbnMgc2VydmljZSBuYW1lc3BhY2U6CWh0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi93ZWJzZXJ2ZXIud3NkbAorLy9nc29hcCBucyBzZXJ2aWNlIGxvY2F0aW9uOglodHRwOi8vbG9jYWxob3N0OjgwODAKKy8vZ3NvYXAgbnMgc2VydmljZSBzdHlsZToJcnBjCisvL2dzb2FwIG5zIHNlcnZpY2UgZW5jb2Rpbmc6CWVuY29kZWQKKworLy9nc29hcCBucyBzY2hlbWEgbmFtZXNwYWNlOiB1cm46ZGVtb3dlYnNlcnZlcgorCitpbnQgbnNfX2FkZChkb3VibGUsIGRvdWJsZSwgZG91YmxlKik7CQkvLyBIVFRQIFBPU1QgcmVxdWVzdCAtIHJlc3BvbnNlCitpbnQgbnNfX3N1Yihkb3VibGUsIGRvdWJsZSwgZG91YmxlKik7CQkvLyBIVFRQIFBPU1QgcmVxdWVzdCAtIHJlc3BvbnNlCitpbnQgbnNfX211bChkb3VibGUsIGRvdWJsZSwgZG91YmxlKik7CQkvLyBIVFRQIFBPU1QgcmVxdWVzdCAtIHJlc3BvbnNlCitpbnQgbnNfX2Rpdihkb3VibGUsIGRvdWJsZSwgZG91YmxlKik7CQkvLyBIVFRQIFBPU1QgcmVxdWVzdCAtIHJlc3BvbnNlCisKKy8vZ3NvYXAgZiBzY2hlbWEgbmFtZXNwYWNlOiB1cm46Zm9ybQorCitpbnQgZl9fZm9ybTEodm9pZCk7CS8vIG9uZS13YXkgTUVQCisKK2ludCBmX19mb3JtMihzdHJ1Y3QgZl9fZm9ybVJlc3BvbnNlIHsgZG91YmxlIHJlc3VsdDsgfSAqKTsKKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy93c3NlL01ha2VmaWxlIGIvc2FtcGxlcy93c3NlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5OGIzNjAKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3dzc2UvTWFrZWZpbGUKQEAgLTAsMCArMSwyOCBAQAorR1NPQVA9Li4vLi4vc29hcGNwcDIKK0dXU0RMPS4uLy4uL3dzZGwyaAorU09BUEg9Li4vLi4vc3Rkc29hcDIuaAorU09BUEM9Li4vLi4vc3Rkc29hcDIuYworU09BUENQUD0uLi8uLi9zdGRzb2FwMi5jcHAKK0NDPWdjYworQ1BQPWcrKworTElCUz0tbGNyeXB0byAtbHNzbAorQ09GTEFHUz0tTzIKK0NXRkxBR1M9LVdhbGwKK0NJRkxBR1M9LUkuIC1JLi4vLi4gLUkuLi8uLi9wbHVnaW4KK0NNRkxBR1M9LURXSVRIX0RPTSAtRFdJVEhfT1BFTlNTTAorQ0ZMQUdTPSAkKENXRkxBR1MpICQoQ09GTEFHUykgJChDSUZMQUdTKSAkKENNRkxBR1MpCithbGw6CQl3c3NlZGVtbword3NzZWRlbW86CXdzc2VkZW1vLmggd3NzZWRlbW8uYyBzb2FwQy5jICQoU09BUEgpICQoU09BUEMpIC4uLy4uL2RvbS5jIHdzc2VhcGkubyBzbWRldnAubworCQkkKENDKSAkKENGTEFHUykgLW8gd3NzZWRlbW8gd3NzZWRlbW8uYyBzb2FwQy5jIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmMgLi4vLi4vZG9tLmMgJChTT0FQQykgd3NzZWFwaS5vIHNtZGV2cC5vICQoTElCUykKK3dzc2VkZW1vLmg6CXdzc2VkZW1vLndzZGwKKwkJJChHV1NETCkgLWMgLXQgLi4vLi4vdHlwZW1hcC5kYXQgd3NzZWRlbW8ud3NkbAorc29hcEMuYzoJd3NzZWRlbW8uaAorCQkkKEdTT0FQKSAtYyAtSS4uLy4uL2ltcG9ydCB3c3NlZGVtby5oCit3c3NlYXBpLm86CS4uLy4uL3BsdWdpbi93c3NlYXBpLmggLi4vLi4vcGx1Z2luL3dzc2VhcGkuYworCQkkKENDKSAkKENGTEFHUykgLWMgLi4vLi4vcGx1Z2luL3dzc2VhcGkuYworc21kZXZwLm86CS4uLy4uL3BsdWdpbi9zbWRldnAuaCAuLi8uLi9wbHVnaW4vc21kZXZwLmMKKwkJJChDQykgJChDRkxBR1MpIC1jIC4uLy4uL3BsdWdpbi9zbWRldnAuYworY2xlYW46CisJCXJtIC1mICoubyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5Lmggc29hcCpPYmplY3QuaCBzb2FwQ2xpZW50TGliLmMgc29hcFNlcnZlckxpYi5jCitkaXN0Y2xlYW46CisJCXJtIC1mICoubyAqLnhtbCAqLm5zbWFwICoubG9nIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXBDbGllbnRMaWIuYyBzb2FwU2VydmVyTGliLmMgc29hcCpQcm94eS5oIHNvYXAqT2JqZWN0Lmggd3NzZWRlbW8gd3NzZWRlbW8uaApkaWZmIC0tZ2l0IGEvc2FtcGxlcy93c3NlL01ha2VmaWxlU29sYXJpcyBiL3NhbXBsZXMvd3NzZS9NYWtlZmlsZVNvbGFyaXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE0ODQwOQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvd3NzZS9NYWtlZmlsZVNvbGFyaXMKQEAgLTAsMCArMSwyOCBAQAorR1NPQVA9Li4vLi4vc29hcGNwcDIKK0dXU0RMPS4uLy4uL3dzZGwyaAorU09BUEg9Li4vLi4vc3Rkc29hcDIuaAorU09BUEM9Li4vLi4vc3Rkc29hcDIuYworU09BUENQUD0uLi8uLi9zdGRzb2FwMi5jcHAKK0NDPWdjYworQ1BQPWcrKworTElCUz0tbGNyeXB0byAtbHNzbCAtbHhuZXQgLWxuc2wgLWxzb2NrZXQKK0NPRkxBR1M9LU8yCitDV0ZMQUdTPS1XYWxsCitDSUZMQUdTPS1JLiAtSS4uLy4uIC1JLi4vLi4vcGx1Z2luCitDTUZMQUdTPS1EV0lUSF9ET00gLURXSVRIX09QRU5TU0wKK0NGTEFHUz0gJChDV0ZMQUdTKSAkKENPRkxBR1MpICQoQ0lGTEFHUykgJChDTUZMQUdTKQorYWxsOgkJd3NzZWRlbW8KK3dzc2VkZW1vOgl3c3NlZGVtby5oIHdzc2VkZW1vLmMgc29hcEMuYyAkKFNPQVBIKSAkKFNPQVBDKSAuLi8uLi9kb20uYyB3c3NlYXBpLm8gc21kZXZwLm8KKwkJJChDQykgJChDRkxBR1MpIC1vIHdzc2VkZW1vIHdzc2VkZW1vLmMgc29hcEMuYyBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jIC4uLy4uL2RvbS5jICQoU09BUEMpIHdzc2VhcGkubyBzbWRldnAubyAkKExJQlMpCit3c3NlZGVtby5oOgl3c3NlZGVtby53c2RsCisJCSQoR1dTREwpIC1jIC10IC4uLy4uL3R5cGVtYXAuZGF0IHdzc2VkZW1vLndzZGwKK3NvYXBDLmM6CXdzc2VkZW1vLmgKKwkJJChHU09BUCkgLWMgLUkuLi8uLi9pbXBvcnQgd3NzZWRlbW8uaAord3NzZWFwaS5vOgkuLi8uLi9wbHVnaW4vd3NzZWFwaS5oIC4uLy4uL3BsdWdpbi93c3NlYXBpLmMKKwkJJChDQykgJChDRkxBR1MpIC1jIC4uLy4uL3BsdWdpbi93c3NlYXBpLmMKK3NtZGV2cC5vOgkuLi8uLi9wbHVnaW4vc21kZXZwLmggLi4vLi4vcGx1Z2luL3NtZGV2cC5jCisJCSQoQ0MpICQoQ0ZMQUdTKSAtYyAuLi8uLi9wbHVnaW4vc21kZXZwLmMKK2NsZWFuOgorCQlybSAtZiAqLm8gc29hcEguaCBzb2FwU3R1Yi5oIHNvYXBDLmNwcCBzb2FwQy5jIHNvYXBDbGllbnQuY3BwIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmNwcCBzb2FwU2VydmVyLmMgc29hcCpQcm94eS5oIHNvYXAqT2JqZWN0Lmggc29hcENsaWVudExpYi5jIHNvYXBTZXJ2ZXJMaWIuYworZGlzdGNsZWFuOgorCQlybSAtZiAqLm8gKi54bWwgKi5uc21hcCAqLmxvZyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwQ2xpZW50TGliLmMgc29hcFNlcnZlckxpYi5jIHNvYXAqUHJveHkuaCBzb2FwKk9iamVjdC5oIHdzc2VkZW1vIHdzc2VkZW1vLmgKZGlmZiAtLWdpdCBhL3NhbXBsZXMvd3NzZS9jYWNlcnQucGVtIGIvc2FtcGxlcy93c3NlL2NhY2VydC5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA0YjA1ZgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvd3NzZS9jYWNlcnQucGVtCkBAIC0wLDAgKzEsMjEgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRGhqQ0NBdStnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQ0JqekVMTUFrR0ExVUVCaE1DVlZNeAorQ3pBSkJnTlZCQWdUQWtaTU1SUXdFZ1lEVlFRSEV3dFVZV3hzWVdoaGMzTmxaVEVXTUJRR0ExVUVDaE1OUjJWdQorYVhacFlTd2dTVzVqTGpFTE1Ba0dBMVVFQ3hNQ1NWUXhGREFTQmdOVkJBTVRDMmRsYm1sMmFXRXVZMjl0TVNJdworSUFZSktvWklodmNOQVFrQkZoTmpiMjUwWVdOMFFHZGxibWwyYVdFdVkyOXRNQjRYRFRBME1UQXdNakUzTURndworTmxvWERUQTNNVEF3TWpFM01EZ3dObG93Z1k4eEN6QUpCZ05WQkFZVEFsVlRNUXN3Q1FZRFZRUUlFd0pHVERFVQorTUJJR0ExVUVCeE1MVkdGc2JHRm9ZWE56WldVeEZqQVVCZ05WQkFvVERVZGxibWwyYVdFc0lFbHVZeTR4Q3pBSgorQmdOVkJBc1RBa2xVTVJRd0VnWURWUVFERXd0blpXNXBkbWxoTG1OdmJURWlNQ0FHQ1NxR1NJYjNEUUVKQVJZVAorWTI5dWRHRmpkRUJuWlc1cGRtbGhMbU52YlRDQm56QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmpRQXdnWWtDZ1lFQQorbDZLOWJMTWNySjZCeis4aHh5b2xTSnk1VGRaS284T21tc2tQK05BSmN0N2FHV2EzM3UybGtaK0drb1VtTEtaLworckROcGdtWVZOUWxPUUM0cnQ1b0R0NEFVb2o1ODRHOFBKS1NQd3ltSmNYMHNiZkI3azh4Um1MTyt2VmdTVXZEdQorYXNMTVdKNlBzWUl1R2hwNEJ3T0FnbllBQ1R6c2Q2a1NlSXNlZDhYU3g3Y0NBd0VBQWFPQjd6Q0I3REFkQmdOVgorSFE0RUZnUVU0TXlJaTBHZ0lVcWtZUmhuSjJHZ3lVbVZkOG93Z2J3R0ExVWRJd1NCdERDQnNZQVU0TXlJaTBHZworSVVxa1lSaG5KMkdneVVtVmQ4cWhnWldrZ1pJd2dZOHhDekFKQmdOVkJBWVRBbFZUTVFzd0NRWURWUVFJRXdKRworVERFVU1CSUdBMVVFQnhNTFZHRnNiR0ZvWVhOelpXVXhGakFVQmdOVkJBb1REVWRsYm1sMmFXRXNJRWx1WXk0eAorQ3pBSkJnTlZCQXNUQWtsVU1SUXdFZ1lEVlFRREV3dG5aVzVwZG1saExtTnZiVEVpTUNBR0NTcUdTSWIzRFFFSgorQVJZVFkyOXVkR0ZqZEVCblpXNXBkbWxoTG1OdmJZSUJBREFNQmdOVkhSTUVCVEFEQVFIL01BMEdDU3FHU0liMworRFFFQkJRVUFBNEdCQUZtYjlrVitFRHg1TzRqN2RMTXU5MDluRmduQkwwNnNlcGpxdEJJSWJaWTNHbkNnZWZ4SworcDFTNklmMDEvbWRWNzluWkdKbGRlZ003N3R6NFZJbHp1SWF6KzJOTytHcWJyNkVyT1IrM1VHT3JSdUgzOWFNVAorMUR2d0hZcFU1R1UrbEcxYVdIZFFwOHVaNXk0b2tNZzNaOUlaNW5pamtVbnBDSFFPK3EvOEZyTUwKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvd3NzZS9zZXJ2ZXIucGVtIGIvc2FtcGxlcy93c3NlL3NlcnZlci5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVlZjAwZgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvd3NzZS9zZXJ2ZXIucGVtCkBAIC0wLDAgKzEsNjEgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRHNUQ0NBeHFnQXdJQkFnSUJDREFOQmdrcWhraUc5dzBCQVFVRkFEQ0JqekVMTUFrR0ExVUVCaE1DVlZNeAorQ3pBSkJnTlZCQWdUQWtaTU1SUXdFZ1lEVlFRSEV3dFVZV3hzWVdoaGMzTmxaVEVXTUJRR0ExVUVDaE1OUjJWdQorYVhacFlTd2dTVzVqTGpFTE1Ba0dBMVVFQ3hNQ1NWUXhGREFTQmdOVkJBTVRDMmRsYm1sMmFXRXVZMjl0TVNJdworSUFZSktvWklodmNOQVFrQkZoTmpiMjUwWVdOMFFHZGxibWwyYVdFdVkyOXRNQjRYRFRBMU1USXlOREU1TXpNeAorTTFvWERUQTRNVEl5TXpFNU16TXhNMW93Z1kweEN6QUpCZ05WQkFZVEFsVlRNUXN3Q1FZRFZRUUlFd0pHVERFVQorTUJJR0ExVUVCeE1MVkdGc2JHRm9ZWE56WldVeEZqQVVCZ05WQkFvVERVZGxibWwyYVdFc0lFbHVZeTR4Q3pBSgorQmdOVkJBc1RBa2xVTVJJd0VBWURWUVFERXdsc2IyTmhiR2h2YzNReElqQWdCZ2txaGtpRzl3MEJDUUVXRTJOdgorYm5SaFkzUkFaMlZ1YVhacFlTNWpiMjB3Z1o4d0RRWUpLb1pJaHZjTkFRRUJCUUFEZ1kwQU1JR0pBb0dCQU01UgorU2hBdTBmM0YyNjdiK1hodTRIbDNQZTV6VGlVbGtLOTUrdjdGZzZERTVxWDFPNERDV0NyZ3ZhVlU3amd5SnA1NworVU0zbjRZdkVSSHkydndscE9saWVvOTFWTVZHbjROQ0QvaHYxKzJLR3RGVGlKMmJjTkxiTXhlUDZWOXpBRmJtbQorVUFuUk1lbVVyNFJQUkVLMDNJS0lGMWc1K1VBZ3dCbWozcC9Kd1piM0FnTUJBQUdqZ2dFYk1JSUJGekFKQmdOVgorSFJNRUFqQUFNQ3dHQ1dDR1NBR0crRUlCRFFRZkZoMVBjR1Z1VTFOTUlFZGxibVZ5WVhSbFpDQkRaWEowYVdacAorWTJGMFpUQWRCZ05WSFE0RUZnUVVQY0hJdFJrWHc0d1NaRHdGd3lMdWU3b250TUV3Z2J3R0ExVWRJd1NCdERDQgorc1lBVTRNeUlpMEdnSVVxa1lSaG5KMkdneVVtVmQ4cWhnWldrZ1pJd2dZOHhDekFKQmdOVkJBWVRBbFZUTVFzdworQ1FZRFZRUUlFd0pHVERFVU1CSUdBMVVFQnhNTFZHRnNiR0ZvWVhOelpXVXhGakFVQmdOVkJBb1REVWRsYm1sMgorYVdFc0lFbHVZeTR4Q3pBSkJnTlZCQXNUQWtsVU1SUXdFZ1lEVlFRREV3dG5aVzVwZG1saExtTnZiVEVpTUNBRworQ1NxR1NJYjNEUUVKQVJZVFkyOXVkR0ZqZEVCblpXNXBkbWxoTG1OdmJZSUJBREFOQmdrcWhraUc5dzBCQVFVRgorQUFPQmdRQnUwQTdzaGVxcGNXQmR5eE02RE1MR29aSVZGQ3E3aGlvZGFMRkxRY0FMK3pYSEQyNVJtYk1sbFU5WQorR0QxejhnWVlZMEFocDBRZHEwYmIzV3dnZlNNakNJU1N6Z1NURUxQTGhHZjlQMU9CVVNWZzd0RUNpUVpZNXVDMAord2lEWTZJU0tUbzFaWW1jelRKVzlvL2RvZGw2NjJZUS9nTWdlU1RwWjBMUjBuaTNOOWc9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorUHJvYy1UeXBlOiA0LEVOQ1JZUFRFRAorREVLLUluZm86IERFUy1FREUzLUNCQyxGMTIwQUYzQUU4QjJBMUY5CisKKzNOeFZNMit2cU1oODhTYkVqUlhXUjFhbndYRTYweDRWWEIwU0VrTm16djNiT1NZR3BlSVk3c0ViNG05M0xMamoKK21rdk1CT1NKWVd6dVV4V0hlUGNkSUtva0RSa0N3RGptNlVSOUhzZjgyRTBJTUJpd1BzcHluUDM5NkRaYVhFRFkKK29rcWxHQm1GWDV6NkZ1akc5Z05sNThabTA5RlJsOHptcmlKdG9TdTRlc2FzUmFlei9LYWtsdWdyTWlNSHdWVloKK1BXTDRmWnhtb3hmL2dSV2p3WUcvdVlmbk1yWDJZdElack96V241YkorRUZ6cy84SWZrTWhSNWVtUENENjdvTW4KK1ExRjZBWmdtQzlKMlFRMEIrZXZtVWJKSkxHa00wS0lUcDNyNmtmeHd1cEZZZ2lxM1B4eWo2VDRoYkdYaGwzVHMKK3kyazJCRmxSN081aWpKT1NCYzZWdktoODRLZ1BNZVJHQzA0cDM1ZHpDT3Y5anZCVkpYbWo4dmIzSS9VeDFHalkKK3RxbWlTZWtjc2pYbkZ6alEzVnozOWU5SXgwRXVIbWQ2SUJaS0VCRVZpeHk2bDlZSyt0azZYZC8yb2ZoNUdiOGgKK3FjQ2I4N2IrdWp2a1RmaXRWcDN6eG5sa09XMVNPM1BudjNISkU0UGNDSVpKZkhkZ0Z4Q2lvUE1vbVlrNS9aWVoKK2tYSExlRk1xWUhSVWdZeDBFUW4vWjZ0dWIzNkVPNHU3QjFyV2w0MkhoS2thcjdWZG1JV2wzdmU2Y0dLdmEvNmwKK2NYNVdTRms4LzZXdG1QY1d0OHp0RThtKzVZMEVqRUxjZjlOWnhDKzF3TE9EMFRuaGZoZGtJU0lCaGw0T2N3MXMKK0JKMVFvbkNiMVhJVWQwZTNENkVGNW96Y0VtaGxiY09paDYzTndBZUQzb0VGeUF2ZjZSaTkrcmFuWTV5OW1UNk0KK01scjJDK2hFNWZJa3ZDSmhoRWZFbWVKdXY0Q0NKbFVXSittVlBOZ3hDeWVYcDdQN0c1azFraVZxTFlRRm1RZUoKK3BrbExTSFhBVFo1M2lpWFZWaVVDcEd6MWlVZFZKdGRmK2lVdHVUME1JQVdVZVVqeXlic0hIQT09CistLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEaGpDQ0F1K2dBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVVGQURDQmp6RUxNQWtHQTFVRUJoTUNWVk14CitDekFKQmdOVkJBZ1RBa1pNTVJRd0VnWURWUVFIRXd0VVlXeHNZV2hoYzNObFpURVdNQlFHQTFVRUNoTU5SMlZ1CithWFpwWVN3Z1NXNWpMakVMTUFrR0ExVUVDeE1DU1ZReEZEQVNCZ05WQkFNVEMyZGxibWwyYVdFdVkyOXRNU0l3CitJQVlKS29aSWh2Y05BUWtCRmhOamIyNTBZV04wUUdkbGJtbDJhV0V1WTI5dE1CNFhEVEEwTVRBd01qRTNNRGd3CitObG9YRFRBM01UQXdNakUzTURnd05sb3dnWTh4Q3pBSkJnTlZCQVlUQWxWVE1Rc3dDUVlEVlFRSUV3SkdUREVVCitNQklHQTFVRUJ4TUxWR0ZzYkdGb1lYTnpaV1V4RmpBVUJnTlZCQW9URFVkbGJtbDJhV0VzSUVsdVl5NHhDekFKCitCZ05WQkFzVEFrbFVNUlF3RWdZRFZRUURFd3RuWlc1cGRtbGhMbU52YlRFaU1DQUdDU3FHU0liM0RRRUpBUllUCitZMjl1ZEdGamRFQm5aVzVwZG1saExtTnZiVENCbnpBTkJna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBCitsNks5YkxNY3JKNkJ6KzhoeHlvbFNKeTVUZFpLbzhPbW1za1ArTkFKY3Q3YUdXYTMzdTJsa1orR2tvVW1MS1ovCityRE5wZ21ZVk5RbE9RQzRydDVvRHQ0QVVvajU4NEc4UEpLU1B3eW1KY1gwc2JmQjdrOHhSbUxPK3ZWZ1NVdkR1Cithc0xNV0o2UHNZSXVHaHA0QndPQWduWUFDVHpzZDZrU2VJc2VkOFhTeDdjQ0F3RUFBYU9CN3pDQjdEQWRCZ05WCitIUTRFRmdRVTRNeUlpMEdnSVVxa1lSaG5KMkdneVVtVmQ4b3dnYndHQTFVZEl3U0J0RENCc1lBVTRNeUlpMEdnCitJVXFrWVJobkoyR2d5VW1WZDhxaGdaV2tnWkl3Z1k4eEN6QUpCZ05WQkFZVEFsVlRNUXN3Q1FZRFZRUUlFd0pHCitUREVVTUJJR0ExVUVCeE1MVkdGc2JHRm9ZWE56WldVeEZqQVVCZ05WQkFvVERVZGxibWwyYVdFc0lFbHVZeTR4CitDekFKQmdOVkJBc1RBa2xVTVJRd0VnWURWUVFERXd0blpXNXBkbWxoTG1OdmJURWlNQ0FHQ1NxR1NJYjNEUUVKCitBUllUWTI5dWRHRmpkRUJuWlc1cGRtbGhMbU52YllJQkFEQU1CZ05WSFJNRUJUQURBUUgvTUEwR0NTcUdTSWIzCitEUUVCQlFVQUE0R0JBRm1iOWtWK0VEeDVPNGo3ZExNdTkwOW5GZ25CTDA2c2VwanF0QklJYlpZM0duQ2dlZnhLCitwMVM2SWYwMS9tZFY3OW5aR0psZGVnTTc3dHo0VklsenVJYXorMk5PK0dxYnI2RXJPUiszVUdPclJ1SDM5YU1UCisxRHZ3SFlwVTVHVStsRzFhV0hkUXA4dVo1eTRva01nM1o5SVo1bmlqa1VucENIUU8rcS84RnJNTAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy93c3NlL3dzc2VkZW1vLmMgYi9zYW1wbGVzL3dzc2Uvd3NzZWRlbW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2QwYWVhCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy93c3NlL3dzc2VkZW1vLmMKQEAgLTAsMCArMSwyNzMgQEAKKy8qCisKK3dzc2VkZW1vLmMKKworV1MtU2VjdXJpdHkgcGx1Z2luIGRlbW8gYXBwbGljYXRpb24KKworZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlczoKK0dQTCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworLyoKKworVGhpcyBhcHBsaWNhdGlvbiBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiB0aGUgd3NzZSBwbHVnaW4uCisKK0NvbXBpbGU6CisKK3dzZGwyaCAtYyAtdCB0eXBlbWFwLmRhdCB3c3NlZGVtby53c2RsCitzb2FwY3BwMiAtSSBpbXBvcnQgd3NzZWRlbW8uaAorY2MgLW8gd3NzZWRlbW8gd3NzZWRlbW8uYyB3c3NlYXBpLmMgc21kZXZwLmMgZG9tLmMgc3Rkc29hcDIuYyBzb2FwQy5jIHNvYXBDbGllbnQuYyBzb2FwU2VydmVyLmMgLWxjcnlwdG8gLWxzc2wKKworT3RoZXIgZmlsZXMgcmVxdWlyZWQ6CisKK3NlcnZlci5wZW0KK2NhY2VydC5wZW0KKworTm90ZToKKworVGhlIHdzc2UuaCwgd3N1LmgsIGRzLmgsIGMxNG4uaCBmaWxlcyBhcmUgbG9jYXRlZCBpbiAnaW1wb3J0Jy4KK1RoZSBzbWRldnAuKiBhbmQgd3NzZWFwaS4qIGZpbGVzIGFyZSBsb2NhdGVkIGluICdwbHVnaW4nLgorCitVc2FnZTogd3NzZWRlbW8gY2luaGtzdCBbcG9ydF0KKword2l0aCBvcHRpb25zOgorCitjIGNodW5rZWQgSFRUUAoraSBpbmRlbnQgWE1MCituIGNhbm9uaWNhbCBYTUwKK2ggdXNlIGhtYWMKK2sgZG9uJ3QgdXNlIGtleXMKK3Mgc2VydmVyCit0IHVzZSBwbGFpbi10ZXh0IHBhc3N3b3JkcworCitGb3IgZXhhbXBsZSwgdG8gZ2VuZXJhdGUgYSByZXF1ZXN0IG1lc3NhZ2UgYW5kIHN0b3JlIGl0IGluIGEgZmlsZToKKworLi93c3NlZGVtbyBpbiA+IHdzc2VkZW1vLnhtbCA8IC9kZXYvbnVsbAorCitUbyBwYXJzZSBhbmQgdmVyaWZ5IHRoaXMgcmVxdWVzdCBtZXNzYWdlOgorCisuL3dzc2VkZW1vIHMgPCB3c3NlZGVtby54bWwKKworKi8KKworI2luY2x1ZGUgInNtZGV2cC5oIgorI2luY2x1ZGUgIndzc2VhcGkuaCIKKyNpbmNsdWRlICJ3c3NldGVzdC5uc21hcCIKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreyBzdHJ1Y3Qgc29hcCAqc29hcDsKKyAgaW50IHNlcnZlciA9IDA7CisgIGludCBobWFjID0gMDsKKyAgaW50IHRleHQgPSAwOworICBpbnQgbm9rZXkgPSAwOworICBpbnQgcG9ydCA9IDA7CisgIFg1MDkgKmNlcnQgPSBOVUxMOworICBFVlBfUEtFWSAqcnNhX3ByaXZrID0gTlVMTCwgKnJzYV9wdWJrID0gTlVMTDsKKyAgRklMRSAqZmQ7CisgIGRvdWJsZSByZXN1bHQ7CisgIC8qIG5vdC1zby1yYW5kb20gSE1BQyBrZXkgZm9yIHRlc3RpbmcgKi8KKyAgc3RhdGljIGNoYXIgaG1hY19rZXlbMTZdID0KKyAgeyAweGZmLCAweGVlLCAweGRkLCAweGNjLCAweGJiLCAweGFhLCAweDk5LCAweDg4LAorICAgIDB4NzcsIDB4NjYsIDB4NTUsIDB4NDQsIDB4MzMsIDB4MjIsIDB4MTEsIDB4MDAgfTsKKyAgLyogY3JlYXRlIGNvbnRleHQgKi8KKyAgc29hcCA9IHNvYXBfbmV3KCk7CisgIC8qIHJlZ2lzdGVyIHdzc2UgcGx1Z2luICovCisgIHNvYXBfcmVnaXN0ZXJfcGx1Z2luKHNvYXAsIHNvYXBfd3NzZSk7CisgIC8qIG9wdGlvbnMgKi8KKyAgaWYgKGFyZ2MgPj0gMikKKyAgeyBpZiAoc3RyY2hyKGFyZ3ZbMV0sICdjJykpCisgICAgICBzb2FwX3NldF9vbW9kZShzb2FwLCBTT0FQX0lPX0NIVU5LKTsKKyAgICBpZiAoc3RyY2hyKGFyZ3ZbMV0sICdpJykpCisgICAgICBzb2FwX3NldF9vbW9kZShzb2FwLCBTT0FQX1hNTF9JTkRFTlQpOworICAgIGlmIChzdHJjaHIoYXJndlsxXSwgJ24nKSkKKyAgICAgIHNvYXBfc2V0X29tb2RlKHNvYXAsIFNPQVBfWE1MX0NBTk9OSUNBTCk7CisgICAgaWYgKHN0cmNocihhcmd2WzFdLCAnaCcpKQorICAgICAgaG1hYyA9IDE7CisgICAgaWYgKHN0cmNocihhcmd2WzFdLCAnaycpKQorICAgICAgbm9rZXkgPSAxOworICAgIGlmIChzdHJjaHIoYXJndlsxXSwgJ3MnKSkKKyAgICAgIHNlcnZlciA9IDE7CisgICAgaWYgKHN0cmNocihhcmd2WzFdLCAndCcpKQorICAgICAgdGV4dCA9IDE7CisgIH0KKyAgLyogc29hcC0+YWN0b3IgPSAiLi4uIjsgKi8gLyogc2V0IG9ubHkgd2hlbiByZXF1aXJlZCAqLworICBzb2FwX3dzc2VfYWRkX1RpbWVzdGFtcChzb2FwLCAiVGltZSIsIDEwKTsJLyogbGlmZXRpbWUgb2YgMTAgc2Vjb25kcyAqLworICAvKiBhZGQgdGV4dCBvciBkaWdlc3QgcGFzc3dvcmQgKi8KKyAgaWYgKHRleHQpCisgICAgc29hcF93c3NlX2FkZF9Vc2VybmFtZVRva2VuVGV4dChzb2FwLCAiVXNlciIsICJqb2huIGRvZSIsICJzZWNyZXQiKTsKKyAgZWxzZQorICAgIHNvYXBfd3NzZV9hZGRfVXNlcm5hbWVUb2tlbkRpZ2VzdChzb2FwLCAiVXNlciIsICJqb2huIGRvZSIsICJzZWNyZXQiKTsKKyAgLyogcmVhZCBSU0EgcHJpdmF0ZSBrZXkgZm9yIHNpZ25pbmcgKi8KKyAgaWYgKChmZCA9IGZvcGVuKCJzZXJ2ZXIucGVtIiwgInIiKSkpCisgIHsgcnNhX3ByaXZrID0gUEVNX3JlYWRfUHJpdmF0ZUtleShmZCwgTlVMTCwgTlVMTCwgInBhc3N3b3JkIik7CisgICAgZmNsb3NlKGZkKTsKKyAgICBpZiAoIXJzYV9wcml2aykKKyAgICB7IGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IHJlYWQgcHJpdmF0ZSBSU0Ega2V5IGZyb20gc2VydmVyLnBlbVxuIik7CisgICAgICBleGl0KDEpOworICAgIH0KKyAgfQorICBlbHNlCisgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgcmVhZCBzZXJ2ZXIucGVtXG4iKTsKKyAgLyogcmVhZCBjZXJ0aWZpY2F0ZSAobW9yZSBlZmZpY2llbnQgaXMgdG8ga2VlcCBjZXJ0aWZpY2F0ZSBpbiBtZW1vcnkpOiAqLworICBpZiAoKGZkID0gZm9wZW4oInNlcnZlci5wZW0iLCAiciIpKSkKKyAgeyBjZXJ0ID0gUEVNX3JlYWRfWDUwOShmZCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgZmNsb3NlKGZkKTsKKyAgICBpZiAoIWNlcnQpCisgICAgeyBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCByZWFkIGNlcnRpZmljYXRlIGZyb20gc2VydmVyLnBlbVxuIik7CisgICAgICBleGl0KDEpOworICAgIH0KKyAgfQorICBlbHNlCisgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgcmVhZCBzZXJ2ZXIucGVtXG4iKTsKKyAgcnNhX3B1YmsgPSBYNTA5X2dldF9wdWJrZXkoY2VydCk7CisgIGlmICghcnNhX3B1YmspCisgIHsgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgZ2V0IHB1YmxpYyBrZXkgZnJvbSBjZXJ0aWZpY2F0ZVxuIik7CisgICAgZXhpdCgxKTsKKyAgfQorICAvKiBwb3J0IGFyZ3VtZW50ICovCisgIGlmIChhcmdjID49IDMpCisgICAgcG9ydCA9IGF0b2koYXJndlsyXSk7CisgIC8qIG5lZWQgY2FjZXJ0IHRvIHZlcmlmeSBjZXJ0aWZpY2F0ZSAqLworICBzb2FwLT5jYWZpbGUgPSAiY2FjZXJ0LnBlbSI7CisgIC8qIHNlcnZlciBvciBjbGllbnQvICovCisgIGlmIChzZXJ2ZXIpCisgIHsgaWYgKHBvcnQpCisgICAgeyAvKiBzdGFuZC1hbG9uZSBzZXJ2ZXIgc2VydmluZyBtZXNzYWdlcyBvdmVyIHBvcnQgKi8KKyAgICAgIGlmICghc29hcF92YWxpZF9zb2NrZXQoc29hcF9iaW5kKHNvYXAsIE5VTEwsIHBvcnQsIDEwMCkpKQorICAgICAgeyBzb2FwX3ByaW50X2ZhdWx0KHNvYXAsIHN0ZGVycik7CisgICAgICAgIGV4aXQoMSk7CisgICAgICB9CisgICAgICB3aGlsZSAoc29hcF92YWxpZF9zb2NrZXQoc29hcF9hY2NlcHQoc29hcCkpKQorICAgICAgeyBpZiAoaG1hYykKKyAgICAgICAgICBzb2FwX3dzc2VfdmVyaWZ5X2F1dG8oc29hcCwgU09BUF9TTURfSE1BQ19TSEExLCBobWFjX2tleSwgc2l6ZW9mKGhtYWNfa2V5KSk7CisgICAgICAgIGVsc2UgaWYgKG5va2V5KQorICAgICAgICAgIHNvYXBfd3NzZV92ZXJpZnlfYXV0byhzb2FwLCBTT0FQX1NNRF9WUkZZX1JTQV9TSEExLCByc2FfcHViaywgMCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzb2FwX3dzc2VfdmVyaWZ5X2F1dG8oc29hcCwgU09BUF9TTURfTk9ORSwgTlVMTCwgMCk7CisgICAgICAgIGlmIChzb2FwX3NlcnZlKHNvYXApKQorICAgICAgICB7IHNvYXBfd3NzZV9kZWxldGVfU2VjdXJpdHkoc29hcCk7CisgICAgICAgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOworICAgICAgICAgIHNvYXBfcHJpbnRfZmF1bHRfbG9jYXRpb24oc29hcCwgc3RkZXJyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOworICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgLyogQ0dJLXN0eWxlIHNlcnZlciBzZXJ2aW5nIG1lc3NhZ2VzIG92ZXIgc3RkaW4vb3V0ICovCisgICAgICBpZiAoaG1hYykKKyAgICAgICAgc29hcF93c3NlX3ZlcmlmeV9hdXRvKHNvYXAsIFNPQVBfU01EX0hNQUNfU0hBMSwgaG1hY19rZXksIHNpemVvZihobWFjX2tleSkpOworICAgICAgZWxzZSBpZiAobm9rZXkpCisgICAgICAgIHNvYXBfd3NzZV92ZXJpZnlfYXV0byhzb2FwLCBTT0FQX1NNRF9WUkZZX1JTQV9TSEExLCByc2FfcHViaywgMCk7CisgICAgICBlbHNlCisgICAgICAgIHNvYXBfd3NzZV92ZXJpZnlfYXV0byhzb2FwLCBTT0FQX1NNRF9OT05FLCBOVUxMLCAwKTsKKyAgICAgIGlmIChzb2FwX3NlcnZlKHNvYXApKQorICAgICAgeyBzb2FwX3dzc2VfZGVsZXRlX1NlY3VyaXR5KHNvYXApOworICAgICAgICBzb2FwX3ByaW50X2ZhdWx0KHNvYXAsIHN0ZGVycik7CisgICAgICAgIHNvYXBfcHJpbnRfZmF1bHRfbG9jYXRpb24oc29hcCwgc3RkZXJyKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZSAvKiBjbGllbnQgKi8KKyAgeyBjaGFyIGVuZHBvaW50WzgwXTsKKyAgICAvKiBjbGllbnQgc2VuZGluZyBtZXNzYWdlcyB0byBzdGRvdXQgb3Igb3ZlciBwb3J0ICovCisgICAgaWYgKHBvcnQpCisgICAgICBzcHJpbnRmKGVuZHBvaW50LCAiaHR0cDovL2xvY2FsaG9zdDolZCIsIHBvcnQpOworICAgIGVsc2UKKyAgICAgIHN0cmNweShlbmRwb2ludCwgImh0dHA6Ly8iKTsKKyAgICBpZiAoaG1hYykKKyAgICAgIHNvYXBfd3NzZV9zaWduX2JvZHkoc29hcCwgU09BUF9TTURfSE1BQ19TSEExLCBobWFjX2tleSwgc2l6ZW9mKGhtYWNfa2V5KSk7CisgICAgZWxzZQorICAgIHsgaWYgKG5va2V5KQorICAgICAgICBzb2FwX3dzc2VfYWRkX0tleUluZm9fS2V5TmFtZShzb2FwLCAiTXlLZXkiKTsKKyAgICAgIGVsc2UKKyAgICAgIHsgc29hcF93c3NlX2FkZF9CaW5hcnlTZWN1cml0eVRva2VuWDUwOShzb2FwLCAiWDUwOVRva2VuIiwgY2VydCk7CisgICAgICAgIHNvYXBfd3NzZV9hZGRfS2V5SW5mb19TZWN1cml0eVRva2VuUmVmZXJlbmNlWDUwOShzb2FwLCAiI1g1MDlUb2tlbiIpOworICAgICAgfQorICAgICAgc29hcF93c3NlX3NpZ25fYm9keShzb2FwLCBTT0FQX1NNRF9TSUdOX1JTQV9TSEExLCByc2FfcHJpdmssIDApOworICAgIH0KKyAgICBzb2FwX3dzc2VfdmVyaWZ5X2F1dG8oc29hcCwgU09BUF9TTURfTk9ORSwgTlVMTCwgMCk7CisgICAgaWYgKCFzb2FwX2NhbGxfbnMxX19hZGQoc29hcCwgZW5kcG9pbnQsIE5VTEwsIDEuMCwgMi4wLCAmcmVzdWx0KQorICAgICAmJiAhc29hcF93c3NlX3ZlcmlmeV9UaW1lc3RhbXAoc29hcCkKKyAgICAgJiYgIXNvYXBfd3NzZV92ZXJpZnlfUGFzc3dvcmQoc29hcCwgInNlY3JldCIpKQorICAgICAgcHJpbnRmKCJSZXN1bHQgPSAlZ1xuIiwgcmVzdWx0KTsKKyAgICBlbHNlCisgICAgeyBzb2FwX3dzc2VfZGVsZXRlX1NlY3VyaXR5KHNvYXApOworICAgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOworICAgICAgc29hcF9wcmludF9mYXVsdF9sb2NhdGlvbihzb2FwLCBzdGRlcnIpOworICAgIH0KKyAgICBzb2FwX3dzc2VfdmVyaWZ5X2RvbmUoc29hcCk7CisgIH0KKyAgLyogY2xlYW51cCBrZXlzICovCisgIGlmIChyc2FfcHJpdmspCisgICAgRVZQX1BLRVlfZnJlZShyc2FfcHJpdmspOworICBpZiAocnNhX3B1YmspCisgICAgRVZQX1BLRVlfZnJlZShyc2FfcHViayk7CisgIGlmIChjZXJ0KQorICAgIFg1MDlfZnJlZShjZXJ0KTsKKyAgLyogY2xlYW51cCBnU09BUCBlbmdpbmUgKi8KKyAgc29hcF9lbmQoc29hcCk7CisgIHNvYXBfZG9uZShzb2FwKTsKKyAgZnJlZShzb2FwKTsKKyAgLyogZG9uZSAqLworICByZXR1cm4gMDsKK30KKworaW50IG5zMV9fYWRkKHN0cnVjdCBzb2FwICpzb2FwLCBkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSAqcmVzdWx0KQoreyBjb25zdCBjaGFyICp1c2VybmFtZSA9IHNvYXBfd3NzZV9nZXRfVXNlcm5hbWUoc29hcCk7CisgIGlmICh1c2VybmFtZSkKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkhlbGxvICVzLCB3YW50IHRvIGFkZCAlZyArICVnID0gP1xuIiwgdXNlcm5hbWUsIGEsIGIpOworICBpZiAoc29hcF93c3NlX3ZlcmlmeV9UaW1lc3RhbXAoc29hcCkKKyAgIHx8IHNvYXBfd3NzZV92ZXJpZnlfUGFzc3dvcmQoc29hcCwgInNlY3JldCIpKQorICB7IHNvYXBfd3NzZV9kZWxldGVfU2VjdXJpdHkoc29hcCk7CisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgICpyZXN1bHQgPSBhICsgYjsKKyAgc29hcF93c3NlX2RlbGV0ZV9TZWN1cml0eShzb2FwKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK2ludCBuczFfX3N1YihzdHJ1Y3Qgc29hcCAqc29hcCwgZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgKnJlc3VsdCkKK3sgKnJlc3VsdCA9IGEgLSBiOworICBzb2FwX3dzc2VfZGVsZXRlX1NlY3VyaXR5KHNvYXApOworICByZXR1cm4gU09BUF9PSzsKK30KKworaW50IG5zMV9fbXVsKHN0cnVjdCBzb2FwICpzb2FwLCBkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSAqcmVzdWx0KQoreyAqcmVzdWx0ID0gYSAqIGI7CisgIHNvYXBfd3NzZV9kZWxldGVfU2VjdXJpdHkoc29hcCk7CisgIHJldHVybiBTT0FQX09LOworfQorCitpbnQgbnMxX19kaXYoc3RydWN0IHNvYXAgKnNvYXAsIGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlICpyZXN1bHQpCit7IHNvYXBfd3NzZV9kZWxldGVfU2VjdXJpdHkoc29hcCk7CisgIGlmIChiICE9IDAuMCkKKyAgeyAqcmVzdWx0ID0gYSAvIGI7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgcmV0dXJuIHNvYXBfc2VuZGVyX2ZhdWx0KHNvYXAsICJEaXZpc2lvbiBieSB6ZXJvIiwgTlVMTCk7Cit9CisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvd3NzZS93c3NlZGVtby53c2RsIGIvc2FtcGxlcy93c3NlL3dzc2VkZW1vLndzZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY3ZTVhYgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvd3NzZS93c3NlZGVtby53c2RsCkBAIC0wLDAgKzEsMTMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGRlZmluaXRpb25zIG5hbWU9Indzc2V0ZXN0IgorIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5nZW5pdmlhLmNvbS93c2RsL3dzc2V0ZXN0LndzZGwiCisgeG1sbnM6dG5zPSJodHRwOi8vd3d3Lmdlbml2aWEuY29tL3dzZGwvd3NzZXRlc3Qud3NkbCIKKyB4bWxuczpTT0FQLUVOVj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iCisgeG1sbnM6U09BUC1FTkM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgorIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKKyB4bWxuczpucz0iaHR0cDovL3d3dy5nZW5pdmlhLmNvbS9zY2hlbWFzL3dzc2V0ZXN0LnhzZCIKKyB4bWxuczp3c3NlPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiCisgeG1sbnM6U09BUD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKKyB4bWxuczpNSU1FPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIgorIHhtbG5zOkRJTUU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDIvMDQvZGltZS93c2RsLyIKKyB4bWxuczpXU0RMPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKKyB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgorCis8bWVzc2FnZSBuYW1lPSJhZGRSZXF1ZXN0Ij4KKyA8cGFydCBuYW1lPSJhIiB0eXBlPSJ4c2Q6ZG91YmxlIi8+CisgPHBhcnQgbmFtZT0iYiIgdHlwZT0ieHNkOmRvdWJsZSIvPgorPC9tZXNzYWdlPgorCis8bWVzc2FnZSBuYW1lPSJhZGRSZXNwb25zZSI+CisgPHBhcnQgbmFtZT0icmVzdWx0IiB0eXBlPSJ4c2Q6ZG91YmxlIi8+Cis8L21lc3NhZ2U+CisKKzxtZXNzYWdlIG5hbWU9InN1YlJlcXVlc3QiPgorIDxwYXJ0IG5hbWU9ImEiIHR5cGU9InhzZDpkb3VibGUiLz4KKyA8cGFydCBuYW1lPSJiIiB0eXBlPSJ4c2Q6ZG91YmxlIi8+Cis8L21lc3NhZ2U+CisKKzxtZXNzYWdlIG5hbWU9InN1YlJlc3BvbnNlIj4KKyA8cGFydCBuYW1lPSJyZXN1bHQiIHR5cGU9InhzZDpkb3VibGUiLz4KKzwvbWVzc2FnZT4KKworPG1lc3NhZ2UgbmFtZT0ibXVsUmVxdWVzdCI+CisgPHBhcnQgbmFtZT0iYSIgdHlwZT0ieHNkOmRvdWJsZSIvPgorIDxwYXJ0IG5hbWU9ImIiIHR5cGU9InhzZDpkb3VibGUiLz4KKzwvbWVzc2FnZT4KKworPG1lc3NhZ2UgbmFtZT0ibXVsUmVzcG9uc2UiPgorIDxwYXJ0IG5hbWU9InJlc3VsdCIgdHlwZT0ieHNkOmRvdWJsZSIvPgorPC9tZXNzYWdlPgorCis8bWVzc2FnZSBuYW1lPSJkaXZSZXF1ZXN0Ij4KKyA8cGFydCBuYW1lPSJhIiB0eXBlPSJ4c2Q6ZG91YmxlIi8+CisgPHBhcnQgbmFtZT0iYiIgdHlwZT0ieHNkOmRvdWJsZSIvPgorPC9tZXNzYWdlPgorCis8bWVzc2FnZSBuYW1lPSJkaXZSZXNwb25zZSI+CisgPHBhcnQgbmFtZT0icmVzdWx0IiB0eXBlPSJ4c2Q6ZG91YmxlIi8+Cis8L21lc3NhZ2U+CisKKzxtZXNzYWdlIG5hbWU9IkhlYWRlciI+CisgPHBhcnQgbmFtZT0iU2VjdXJpdHkiIGVsZW1lbnQ9Indzc2U6U2VjdXJpdHkiLz4KKzwvbWVzc2FnZT4KKworPHBvcnRUeXBlIG5hbWU9Indzc2V0ZXN0UG9ydFR5cGUiPgorIDxvcGVyYXRpb24gbmFtZT0iYWRkIj4KKyAgPGlucHV0IG1lc3NhZ2U9InRuczphZGRSZXF1ZXN0Ii8+CisgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmFkZFJlc3BvbnNlIi8+CisgPC9vcGVyYXRpb24+CisgPG9wZXJhdGlvbiBuYW1lPSJzdWIiPgorICA8aW5wdXQgbWVzc2FnZT0idG5zOnN1YlJlcXVlc3QiLz4KKyAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6c3ViUmVzcG9uc2UiLz4KKyA8L29wZXJhdGlvbj4KKyA8b3BlcmF0aW9uIG5hbWU9Im11bCI+CisgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6bXVsUmVxdWVzdCIvPgorICA8b3V0cHV0IG1lc3NhZ2U9InRuczptdWxSZXNwb25zZSIvPgorIDwvb3BlcmF0aW9uPgorIDxvcGVyYXRpb24gbmFtZT0iZGl2Ij4KKyAgPGlucHV0IG1lc3NhZ2U9InRuczpkaXZSZXF1ZXN0Ii8+CisgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmRpdlJlc3BvbnNlIi8+CisgPC9vcGVyYXRpb24+Cis8L3BvcnRUeXBlPgorCis8YmluZGluZyBuYW1lPSJ3c3NldGVzdCIgdHlwZT0idG5zOndzc2V0ZXN0UG9ydFR5cGUiPgorIDxTT0FQOmJpbmRpbmcgc3R5bGU9InJwYyIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KKyA8b3BlcmF0aW9uIG5hbWU9ImFkZCI+CisgIDxTT0FQOm9wZXJhdGlvbiBzdHlsZT0icnBjIiBzb2FwQWN0aW9uPSIiLz4KKyAgPGlucHV0PgorICAgICA8U09BUDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vd3d3Lmdlbml2aWEuY29tL3NjaGVtYXMvd3NzZXRlc3QueHNkIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgorICAgICA8U09BUDpoZWFkZXIgdXNlPSJsaXRlcmFsIiBtZXNzYWdlPSJ0bnM6SGVhZGVyIiBwYXJ0PSJTZWN1cml0eSIvPgorICA8L2lucHV0PgorICA8b3V0cHV0PgorICAgICA8U09BUDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vd3d3Lmdlbml2aWEuY29tL3NjaGVtYXMvd3NzZXRlc3QueHNkIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgorICAgICA8U09BUDpoZWFkZXIgdXNlPSJsaXRlcmFsIiBtZXNzYWdlPSJ0bnM6SGVhZGVyIiBwYXJ0PSJTZWN1cml0eSIvPgorICA8L291dHB1dD4KKyA8L29wZXJhdGlvbj4KKyA8b3BlcmF0aW9uIG5hbWU9InN1YiI+CisgIDxTT0FQOm9wZXJhdGlvbiBzdHlsZT0icnBjIiBzb2FwQWN0aW9uPSIiLz4KKyAgPGlucHV0PgorICAgICA8U09BUDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vd3d3Lmdlbml2aWEuY29tL3NjaGVtYXMvd3NzZXRlc3QueHNkIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgorICAgICA8U09BUDpoZWFkZXIgdXNlPSJsaXRlcmFsIiBtZXNzYWdlPSJ0bnM6SGVhZGVyIiBwYXJ0PSJTZWN1cml0eSIvPgorICA8L2lucHV0PgorICA8b3V0cHV0PgorICAgICA8U09BUDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vd3d3Lmdlbml2aWEuY29tL3NjaGVtYXMvd3NzZXRlc3QueHNkIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgorICAgICA8U09BUDpoZWFkZXIgdXNlPSJsaXRlcmFsIiBtZXNzYWdlPSJ0bnM6SGVhZGVyIiBwYXJ0PSJTZWN1cml0eSIvPgorICA8L291dHB1dD4KKyA8L29wZXJhdGlvbj4KKyA8b3BlcmF0aW9uIG5hbWU9Im11bCI+CisgIDxTT0FQOm9wZXJhdGlvbiBzdHlsZT0icnBjIiBzb2FwQWN0aW9uPSIiLz4KKyAgPGlucHV0PgorICAgICA8U09BUDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vd3d3Lmdlbml2aWEuY29tL3NjaGVtYXMvd3NzZXRlc3QueHNkIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgorICAgICA8U09BUDpoZWFkZXIgdXNlPSJsaXRlcmFsIiBtZXNzYWdlPSJ0bnM6SGVhZGVyIiBwYXJ0PSJTZWN1cml0eSIvPgorICA8L2lucHV0PgorICA8b3V0cHV0PgorICAgICA8U09BUDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vd3d3Lmdlbml2aWEuY29tL3NjaGVtYXMvd3NzZXRlc3QueHNkIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgorICAgICA8U09BUDpoZWFkZXIgdXNlPSJsaXRlcmFsIiBtZXNzYWdlPSJ0bnM6SGVhZGVyIiBwYXJ0PSJTZWN1cml0eSIvPgorICA8L291dHB1dD4KKyA8L29wZXJhdGlvbj4KKyA8b3BlcmF0aW9uIG5hbWU9ImRpdiI+CisgIDxTT0FQOm9wZXJhdGlvbiBzdHlsZT0icnBjIiBzb2FwQWN0aW9uPSIiLz4KKyAgPGlucHV0PgorICAgICA8U09BUDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vd3d3Lmdlbml2aWEuY29tL3NjaGVtYXMvd3NzZXRlc3QueHNkIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgorICAgICA8U09BUDpoZWFkZXIgdXNlPSJsaXRlcmFsIiBtZXNzYWdlPSJ0bnM6SGVhZGVyIiBwYXJ0PSJTZWN1cml0eSIvPgorICA8L2lucHV0PgorICA8b3V0cHV0PgorICAgICA8U09BUDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vd3d3Lmdlbml2aWEuY29tL3NjaGVtYXMvd3NzZXRlc3QueHNkIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgorICAgICA8U09BUDpoZWFkZXIgdXNlPSJsaXRlcmFsIiBtZXNzYWdlPSJ0bnM6SGVhZGVyIiBwYXJ0PSJTZWN1cml0eSIvPgorICA8L291dHB1dD4KKyA8L29wZXJhdGlvbj4KKzwvYmluZGluZz4KKworPHNlcnZpY2UgbmFtZT0id3NzZXRlc3QiPgorIDxwb3J0IG5hbWU9Indzc2V0ZXN0IiBiaW5kaW5nPSJ0bnM6d3NzZXRlc3QiPgorICA8U09BUDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwIi8+CisgPC9wb3J0PgorPC9zZXJ2aWNlPgorCis8L2RlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy94bWwtcnBjL01ha2VmaWxlIGIvc2FtcGxlcy94bWwtcnBjL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ODQxMDYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3htbC1ycGMvTWFrZWZpbGUKQEAgLTAsMCArMSwyNCBAQAorR1NPQVA9Li4vLi4vc29hcGNwcDIKK1NPQVBIPS4uLy4uL3N0ZHNvYXAyLmgKK1NPQVBDPS4uLy4uL3N0ZHNvYXAyLmMKK1NPQVBDUFA9Li4vLi4vc3Rkc29hcDIuY3BwCitDQz1nY2MKK0NQUD1nKysKK0xJQlM9CitDT0ZMQUdTPS1PMgorQ1dGTEFHUz0tV2FsbAorQ0lGTEFHUz0tSS4uLy4uCitDTUZMQUdTPQorQ0ZMQUdTPSAkKENXRkxBR1MpICQoQ09GTEFHUykgJChDSUZMQUdTKSAkKENNRkxBR1MpCithbGw6CQl4bWwtcnBjLWN1cnJlbnRUaW1lIHhtbC1ycGMtd2VibG9ncworeG1sLXJwYy1jdXJyZW50VGltZToJeG1sLXJwYy5oIHhtbC1ycGMtY3VycmVudFRpbWUuYyAkKFNPQVBIKSAkKFNPQVBDKQorCQkkKEdTT0FQKSAtYyB4bWwtcnBjLmgKKwkJJChDQykgJChDRkxBR1MpIC1vIHhtbC1ycGMtY3VycmVudFRpbWUgeG1sLXJwYy1jdXJyZW50VGltZS5jIHNvYXBDLmMgJChTT0FQQykgJChMSUJTKQoreG1sLXJwYy13ZWJsb2dzOgl4bWwtcnBjLmggeG1sLXJwYy1pby5oIHhtbC1ycGMtaXRlcnMuaCB4bWwtcnBjLmNwcAoreG1sLXJwYy1pby5jcHAgeG1sLXJwYy13ZWJsb2dzLmNwcCAkKFNPQVBIKSAkKFNPQVBDUFApCisJCSQoR1NPQVApIHhtbC1ycGMuaAorCQkkKENQUCkgJChDRkxBR1MpIC1vIHhtbC1ycGMtd2VibG9ncyB4bWwtcnBjLXdlYmxvZ3MuY3BwIHhtbC1ycGMuY3BwIHhtbC1ycGMtaW8uY3BwICQoU09BUENQUCkgJChMSUJTKQorY2xlYW46CisJCXJtIC1mICoubyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5LmgKK2Rpc3RjbGVhbjoKKwkJcm0gLWYgKi5vICoud3NkbCAqLnhzZCAqLnhtbCAqLm5zbWFwICoubG9nIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaCB4bWwtcnBjLWN1cnJlbnRUaW1lIHhtbC1ycGMtd2VibG9ncwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy94bWwtcnBjL01ha2VmaWxlU29sYXJpcyBiL3NhbXBsZXMveG1sLXJwYy9NYWtlZmlsZVNvbGFyaXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE5YmU4MgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMveG1sLXJwYy9NYWtlZmlsZVNvbGFyaXMKQEAgLTAsMCArMSwyNCBAQAorR1NPQVA9Li4vLi4vc29hcGNwcDIKK1NPQVBIPS4uLy4uL3N0ZHNvYXAyLmgKK1NPQVBDPS4uLy4uL3N0ZHNvYXAyLmMKK1NPQVBDUFA9Li4vLi4vc3Rkc29hcDIuY3BwCitDQz1nY2MKK0NQUD1nKysKK0xJQlM9LWx4bmV0IC1sbnNsIC1sc29ja2V0CitDT0ZMQUdTPS1PMgorQ1dGTEFHUz0tV2FsbAorQ0lGTEFHUz0tSS4uLy4uCitDTUZMQUdTPQorQ0ZMQUdTPSAkKENXRkxBR1MpICQoQ09GTEFHUykgJChDSUZMQUdTKSAkKENNRkxBR1MpCithbGw6CQl4bWwtcnBjLWN1cnJlbnRUaW1lIHhtbC1ycGMtd2VibG9ncworeG1sLXJwYy1jdXJyZW50VGltZToJeG1sLXJwYy5oIHhtbC1ycGMtY3VycmVudFRpbWUuYyAkKFNPQVBIKSAkKFNPQVBDKQorCQkkKEdTT0FQKSAtYyB4bWwtcnBjLmgKKwkJJChDQykgJChDRkxBR1MpIC1vIHhtbC1ycGMtY3VycmVudFRpbWUgeG1sLXJwYy1jdXJyZW50VGltZS5jIHNvYXBDLmMgJChTT0FQQykgJChMSUJTKQoreG1sLXJwYy13ZWJsb2dzOgl4bWwtcnBjLmggeG1sLXJwYy1pby5oIHhtbC1ycGMtaXRlcnMuaCB4bWwtcnBjLmNwcAoreG1sLXJwYy1pby5jcHAgeG1sLXJwYy13ZWJsb2dzLmNwcCAkKFNPQVBIKSAkKFNPQVBDUFApCisJCSQoR1NPQVApIHhtbC1ycGMuaAorCQkkKENQUCkgJChDRkxBR1MpIC1vIHhtbC1ycGMtd2VibG9ncyB4bWwtcnBjLXdlYmxvZ3MuY3BwIHhtbC1ycGMuY3BwIHhtbC1ycGMtaW8uY3BwICQoU09BUENQUCkgJChMSUJTKQorY2xlYW46CisJCXJtIC1mICoubyBzb2FwSC5oIHNvYXBTdHViLmggc29hcEMuY3BwIHNvYXBDLmMgc29hcENsaWVudC5jcHAgc29hcENsaWVudC5jIHNvYXBTZXJ2ZXIuY3BwIHNvYXBTZXJ2ZXIuYyBzb2FwKlByb3h5LmgKK2Rpc3RjbGVhbjoKKwkJcm0gLWYgKi5vICoud3NkbCAqLnhzZCAqLnhtbCAqLm5zbWFwICoubG9nIHNvYXBILmggc29hcFN0dWIuaCBzb2FwQy5jcHAgc29hcEMuYyBzb2FwQ2xpZW50LmNwcCBzb2FwQ2xpZW50LmMgc29hcFNlcnZlci5jcHAgc29hcFNlcnZlci5jIHNvYXAqUHJveHkuaCB4bWwtcnBjLWN1cnJlbnRUaW1lIHhtbC1ycGMtd2VibG9ncwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy94bWwtcnBjL3htbC1ycGMtY3VycmVudFRpbWUuYyBiL3NhbXBsZXMveG1sLXJwYy94bWwtcnBjLWN1cnJlbnRUaW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBkZmM3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMveG1sLXJwYy94bWwtcnBjLWN1cnJlbnRUaW1lLmMKQEAgLTAsMCArMSw5MiBAQAorLyoKKworWE1MLVJQQyBjdXJyZW5UaW1lIGV4YW1wbGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMS0yMDA0LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzOgorR1BMIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaW5jbHVkZSAic29hcEguaCIKKworaW50IG1ldGhvZENhbGwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKlVSTCwgc3RydWN0IG1ldGhvZENhbGwgKm0sIHN0cnVjdCBtZXRob2RSZXNwb25zZSAqcik7CisKK2ludCBtYWluKCkKK3sgc3RydWN0IHNvYXAgKnNvYXAgPSBzb2FwX25ldygpOworICBzdHJ1Y3QgbWV0aG9kQ2FsbCBtOworICBzdHJ1Y3QgbWV0aG9kUmVzcG9uc2UgcjsKKyAgLyogU2V0IHVwIG1ldGhvZCBjYWxsICovCisgIG0ubWV0aG9kTmFtZSA9ICJjdXJyZW50VGltZS5nZXRDdXJyZW50VGltZSI7CisgIC8qIG5vIHBhcmFtZXRlcnMgKi8KKyAgbS5wYXJhbXMuX19zaXplID0gMDsKKyAgLyogbm8gbmFtZXNwYWNlcyAqLworICBzb2FwLT5uYW1lc3BhY2VzID0gTlVMTDsKKyAgLyogbm8gU09BUCBlbmNvZGluZ1N0eWxlICovCisgIHNvYXAtPmVuY29kaW5nU3R5bGUgPSBOVUxMOworICAvKiBjb25uZWN0LCBzZW5kIHJlcXVlc3QsIGFuZCByZWNlaXZlIHJlc3BvbnNlICovCisgIGlmIChtZXRob2RDYWxsKHNvYXAsICJodHRwOi8vdGltZS54bWxycGMuY29tL1JQQzIiLCAmbSwgJnIpKQorICB7IHNvYXBfcHJpbnRfZmF1bHQoc29hcCwgc3RkZXJyKTsKKyAgICBleGl0KHNvYXAtPmVycm9yKTsKKyAgfQorICBpZiAoci5mYXVsdCkKKyAgeyAvKiBwcmludCBmYXVsdCBvbiBzdGRvdXQgKi8KKyAgICBzb2FwX2JlZ2luX3NlbmQoc29hcCk7CisgICAgc29hcF9wdXRfZmF1bHQoc29hcCwgci5mYXVsdCwgImZhdWx0IiwgTlVMTCk7CisgICAgc29hcF9lbmRfc2VuZChzb2FwKTsKKyAgfQorICBlbHNlIGlmIChyLnBhcmFtcyAmJiByLnBhcmFtcy0+X19zaXplID09IDEpCisgIHsgLyogcHJpbnQgcmVzcG9uc2UgcGFyYW1ldGVyICovCisgICAgaWYgKHIucGFyYW1zLT5wYXJhbVswXS52YWx1ZS5fX3R5cGUgPT0gU09BUF9UWVBFX19kYXRlVGltZV9ET1Rpc284NjAxKQorICAgICAgcHJpbnRmKCJUaW1lID0gJXNcbiIsIChjaGFyKilyLnBhcmFtcy0+cGFyYW1bMF0udmFsdWUucmVmKTsKKyAgICBlbHNlCisgICAgICBwcmludGYoIlRpbWUgbm90IHByb3ZpZGVkXG4iKTsKKyAgfQorICBzb2FwX2VuZChzb2FwKTsKKyAgc29hcF9kb25lKHNvYXApOworICBmcmVlKHNvYXApOworICByZXR1cm4gMDsKK30KKworaW50IG1ldGhvZENhbGwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKlVSTCwgc3RydWN0IG1ldGhvZENhbGwgKm0sIHN0cnVjdCBtZXRob2RSZXNwb25zZSAqcikKK3sgLyogbm8gbmFtZXNwYWNlcyAqLworICBzb2FwLT5uYW1lc3BhY2VzID0gTlVMTDsKKyAgLyogbm8gU09BUCBlbmNvZGluZ1N0eWxlICovCisgIHNvYXAtPmVuY29kaW5nU3R5bGUgPSBOVUxMOworICAvKiBjb25uZWN0LCBzZW5kIHJlcXVlc3QsIGFuZCByZWNlaXZlIHJlc3BvbnNlICovCisgIGlmIChzb2FwX2Nvbm5lY3Qoc29hcCwgVVJMLCBOVUxMKQorICAgfHwgc29hcF9iZWdpbl9zZW5kKHNvYXApCisgICB8fCBzb2FwX3B1dF9tZXRob2RDYWxsKHNvYXAsIG0sICJtZXRob2RDYWxsIiwgTlVMTCkKKyAgIHx8IHNvYXBfZW5kX3NlbmQoc29hcCkKKyAgIHx8IHNvYXBfYmVnaW5fcmVjdihzb2FwKQorICAgfHwgIXNvYXBfZ2V0X21ldGhvZFJlc3BvbnNlKHNvYXAsIHIsICJtZXRob2RSZXNwb25zZSIsIE5VTEwpCisgICB8fCBzb2FwX2VuZF9yZWN2KHNvYXApKQorICAgIHJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsgLyogY2xvc2VzIHNvY2tldCBhbmQgcmV0dXJucyBzb2FwLT5lcnJvciAqLworICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qIERvbid0IG5lZWQgYSBuYW1lc3BhY2UgdGFibGUuIFdlIHB1dCBhbiBlbXB0eSBvbmUgaGVyZSB0byBhdm9pZCBsaW5rIGVycm9ycyAqLworc3RydWN0IE5hbWVzcGFjZSBuYW1lc3BhY2VzW10gPSB7IHtOVUxMLCBOVUxMfSB9OwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy94bWwtcnBjL3htbC1ycGMtaW8uY3BwIGIvc2FtcGxlcy94bWwtcnBjL3htbC1ycGMtaW8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3OWQyZTgKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3htbC1ycGMveG1sLXJwYy1pby5jcHAKQEAgLTAsMCArMSw4NSBAQAorLyoKKworWE1MLVJQQyBpbyBzdHJlYW0gb3BlcmF0aW9ucyBvbiBYTUwtUlBDIHZhbHVlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyB0d28gbGljZW5zZXM6CitHUEwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbmNsdWRlICJzb2FwSC5oIgorI2luY2x1ZGUgInhtbC1ycGMtaW8uaCIKKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgbywgY29uc3Qgc3RydWN0IHZhbHVlJiB2KQoreyBzd2l0Y2ggKHYuX190eXBlKQorICB7IGNhc2UgU09BUF9UWVBFX19hcnJheTogCisgICAgICBvIDw8ICJ7YXJyYXkiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGZvciAoX2FycmF5OjppdGVyYXRvciBpID0gKChzdHJ1Y3QgX2FycmF5KXYpLmJlZ2luKCk7IGkgIT0gKChzdHJ1Y3QgX2FycmF5KXYpLmVuZCgpOyArK2kpCisJICBvIDw8ICJbIiA8PCBpLmluZGV4KCkgPDwgIl09IiA8PCAqaSA8PCBzdGQ6OmVuZGw7CisgICAgICBvIDw8ICJ9IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9UWVBFX19iYXNlNjQ6IAorICAgICAgbyA8PCAie2Jhc2U2NCAiIDw8ICgoc3RydWN0IF9iYXNlNjQpdikuc2l6ZSgpIDw8ICIgYnl0ZXN9IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9UWVBFX19ib29sZWFuOiAKKyAgICAgIGlmICh2LmlzX3RydWUoKSkKKyAgICAgICAgbyA8PCAiVFJVRSI7CisgICAgICBlbHNlCisJbyA8PCAiRkFMU0UiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1RZUEVfX2RhdGVUaW1lX0RPVGlzbzg2MDE6IAorICAgICAgbyA8PCAoY29uc3QgY2hhciopdjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9UWVBFX19kb3VibGU6IAorICAgICAgbyA8PCAoZG91YmxlKXY7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfVFlQRV9faTQ6IAorICAgIGNhc2UgU09BUF9UWVBFX19pbnQ6IAorICAgICAgbyA8PCAoaW50KXY7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfVFlQRV9fc3RyaW5nOiAKKyAgICAgIG8gPDwgKGNvbnN0IGNoYXIqKXY7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfVFlQRV9fc3RydWN0OiAKKyAgICAgIG8gPDwgIntzdHJ1Y3QiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIGZvciAoc3RydWN0IF9zdHJ1Y3Q6Oml0ZXJhdG9yIGkgPSAoKHN0cnVjdCBfc3RydWN0KXYpLmJlZ2luKCk7IGkgIT0gKChzdHJ1Y3QgX3N0cnVjdCl2KS5lbmQoKTsgKytpKQorICAgICAgICBvIDw8ICJbIiA8PCBpLmluZGV4KCkgPDwgIl09IiA8PCAqaSA8PCBzdGQ6OmVuZGw7CisgICAgICBvIDw8ICJ9IjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBpZiAodi5fX2FueSkKKyAgICAgICAgbyA8PCB2Ll9fYW55OworICAgICAgZWxzZQorICAgICAgICBvIDw8ICJ7P30iOworICB9CisgIHJldHVybiBvOworfQorCitzdGQ6OmlzdHJlYW0mIG9wZXJhdG9yPj4oc3RkOjppc3RyZWFtJiBpLCBzdHJ1Y3QgdmFsdWUmIHYpCit7IC8vIFRPRE8KKyAgcmV0dXJuIGk7Cit9CisKZGlmZiAtLWdpdCBhL3NhbXBsZXMveG1sLXJwYy94bWwtcnBjLWlvLmggYi9zYW1wbGVzL3htbC1ycGMveG1sLXJwYy1pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYTcyZjQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3htbC1ycGMveG1sLXJwYy1pby5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisKK1hNTC1SUEMgaW8gc3RyZWFtIG9wZXJhdGlvbnMgb24gWE1MLVJQQyB2YWx1ZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMS0yMDA0LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzOgorR1BMIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCitleHRlcm4gc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYsIGNvbnN0IHN0cnVjdCB2YWx1ZSYpOworZXh0ZXJuIHN0ZDo6aXN0cmVhbSYgb3BlcmF0b3I+PihzdGQ6OmlzdHJlYW0mLCBzdHJ1Y3QgdmFsdWUmKTsKKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy94bWwtcnBjL3htbC1ycGMtaXRlcnMuaCBiL3NhbXBsZXMveG1sLXJwYy94bWwtcnBjLWl0ZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNiZDc0ZAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMveG1sLXJwYy94bWwtcnBjLWl0ZXJzLmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKworWE1MLVJQQyBpdGVyYXRvciBkZWZpbml0aW9ucyBmb3IgQysrCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR3byBsaWNlbnNlczoKK0dQTCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZiBYTUxfUlBDX0lURVJTX0gKKyNkZWZpbmUgWE1MX1JQQ19JVEVSU19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworCitjbGFzcyBfc3RydWN0X2l0ZXJhdG9yCit7Citwcml2YXRlOgorICBzdHJ1Y3QgbWVtYmVyKgltZW1iZXI7CitwdWJsaWM6CisgIAkJCV9zdHJ1Y3RfaXRlcmF0b3IoKTsKKyAgCQkJX3N0cnVjdF9pdGVyYXRvcihjb25zdCBzdHJ1Y3QgX3N0cnVjdCopOworICBib29sCQkJb3BlcmF0b3I9PShjb25zdCBfc3RydWN0X2l0ZXJhdG9yJikgY29uc3Q7CisgIGJvb2wJCQlvcGVyYXRvciE9KGNvbnN0IF9zdHJ1Y3RfaXRlcmF0b3ImKSBjb25zdDsKKyAgY29uc3QgY2hhcioJCWluZGV4KCkgY29uc3Q7CisgIHN0cnVjdCB2YWx1ZSYJCW9wZXJhdG9yKigpIGNvbnN0OworICBfc3RydWN0X2l0ZXJhdG9yJglvcGVyYXRvcisrKCk7CisgIF9zdHJ1Y3RfaXRlcmF0b3ImCW9wZXJhdG9yKz0oaW50KTsKK307CisKK2NsYXNzIF9hcnJheV9pdGVyYXRvcgoreworcHJpdmF0ZToKKyAgc3RydWN0IHZhbHVlKgkJc3RhcnQ7CisgIHN0cnVjdCB2YWx1ZSoJCXZhbHVlOworcHVibGljOgorICAJCQlfYXJyYXlfaXRlcmF0b3IoKTsKKyAgCQkJX2FycmF5X2l0ZXJhdG9yKGNvbnN0IHN0cnVjdCBfYXJyYXkqKTsKKyAgYm9vbAkJCW9wZXJhdG9yPT0oY29uc3QgX2FycmF5X2l0ZXJhdG9yJikgY29uc3Q7CisgIGJvb2wJCQlvcGVyYXRvciE9KGNvbnN0IF9hcnJheV9pdGVyYXRvciYpIGNvbnN0OworICBpbnQgCQkJaW5kZXgoKSBjb25zdDsKKyAgc3RydWN0IHZhbHVlJgkJb3BlcmF0b3IqKCkgY29uc3Q7CisgIF9hcnJheV9pdGVyYXRvciYJb3BlcmF0b3IrKygpOworICBfYXJyYXlfaXRlcmF0b3ImCW9wZXJhdG9yKz0oaW50KTsKK307CisKK2NsYXNzIHBhcmFtc19pdGVyYXRvcgoreworcHJpdmF0ZToKKyAgc3RydWN0IHBhcmFtKgkJc3RhcnQ7CisgIHN0cnVjdCBwYXJhbSoJCXBhcmFtOworcHVibGljOgorICAJCQlwYXJhbXNfaXRlcmF0b3IoKTsKKyAgCQkJcGFyYW1zX2l0ZXJhdG9yKGNvbnN0IHN0cnVjdCBwYXJhbXMqKTsKKyAgYm9vbAkJCW9wZXJhdG9yPT0oY29uc3QgcGFyYW1zX2l0ZXJhdG9yJikgY29uc3Q7CisgIGJvb2wJCQlvcGVyYXRvciE9KGNvbnN0IHBhcmFtc19pdGVyYXRvciYpIGNvbnN0OworICBpbnQJCQlpbmRleCgpIGNvbnN0OworICBzdHJ1Y3QgdmFsdWUmCQlvcGVyYXRvciooKSBjb25zdDsKKyAgcGFyYW1zX2l0ZXJhdG9yJglvcGVyYXRvcisrKCk7CisgIHBhcmFtc19pdGVyYXRvciYJb3BlcmF0b3IrPShpbnQpOworfTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NhbXBsZXMveG1sLXJwYy94bWwtcnBjLXdlYmxvZ3MuYyBiL3NhbXBsZXMveG1sLXJwYy94bWwtcnBjLXdlYmxvZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWNmNmIxCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy94bWwtcnBjL3htbC1ycGMtd2VibG9ncy5jCkBAIC0wLDAgKzEsMTE3IEBACisvKgorCitYTUwtUlBDIHdlYmxvZ1VwZGF0ZXMucGluZyBleGFtcGxlIGluIEMKKworU2VlIGh0dHA6Ly94bWxycGMuc2NyaXB0aW5nLmNvbS93ZWJsb2dzQ29tIGZvciBtb3JlIGRldGFpbHMuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR3byBsaWNlbnNlczoKK0dQTCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2luY2x1ZGUgInNvYXBILmgiCisKK2ludCBtZXRob2RDYWxsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpVUkwsIHN0cnVjdCBtZXRob2RDYWxsICptLCBzdHJ1Y3QgbWV0aG9kUmVzcG9uc2UgKnIpOworCitpbnQgbWFpbigpCit7IHN0cnVjdCBzb2FwICpzb2FwID0gc29hcF9uZXcoKTsKKyAgc3RydWN0IG1ldGhvZENhbGwgbTsKKyAgc3RydWN0IG1ldGhvZFJlc3BvbnNlIHI7CisgIHN0cnVjdCBwYXJhbSBwWzJdOworICAvKiBTZXQgdXAgbWV0aG9kIGNhbGwgKi8KKyAgbS5tZXRob2ROYW1lID0gIndlYmxvZ1VwZGF0ZXMucGluZyI7CisgIC8qIHR3byBwYXJhbWV0ZXJzIHdpdGggc3RyaW5nIGNvbnRlbnQgKi8KKyAgbS5wYXJhbXMuX19zaXplID0gMjsKKyAgbS5wYXJhbXMucGFyYW0gPSBwOworICBwWzBdLnZhbHVlLl9fYW55ID0gIlNjcmlwdGluZyBOZXdzIjsKKyAgcFsxXS52YWx1ZS5fX2FueSA9ICJodHRwOi8vd3d3LnNjcmlwdGluZy5jb20vIjsKKyAgLyogY29ubmVjdCwgc2VuZCByZXF1ZXN0LCBhbmQgcmVjZWl2ZSByZXNwb25zZSAqLworICBpZiAobWV0aG9kQ2FsbChzb2FwLCAiaHR0cDovL3JwYy53ZWJsb2dzLmNvbS9SUEMyIiwgJm0sICZyKSkKKyAgeyBzb2FwX3ByaW50X2ZhdWx0KHNvYXAsIHN0ZGVycik7CisgICAgZXhpdChzb2FwLT5lcnJvcik7CisgIH0KKyAgaWYgKHIuZmF1bHQpCisgIHsgLyogcHJpbnQgZmF1bHQgb24gc3Rkb3V0ICovCisgICAgc29hcF9iZWdpbl9zZW5kKHNvYXApOworICAgIHNvYXBfcHV0X2ZhdWx0KHNvYXAsIHIuZmF1bHQsICJmYXVsdCIsIE5VTEwpOworICAgIHNvYXBfZW5kX3NlbmQoc29hcCk7CisgIH0KKyAgZWxzZSBpZiAoci5wYXJhbXMgJiYgci5wYXJhbXMtPl9fc2l6ZSA9PSAxKQorICB7IC8qIHByaW50IHJlc3BvbnNlIHBhcmFtZXRlciwgY2hlY2sgaWYgZmlyc3QgaXMgYSBzdHJ1Y3QgKi8KKyAgICBpZiAoci5wYXJhbXMtPnBhcmFtWzBdLnZhbHVlLl9fdHlwZSA9PSBTT0FQX1RZUEVfX3N0cnVjdCkKKyAgICB7IC8qIGl0IGlzIGEgc3RydWN0IHdpdGggdHdvIG1lbWJlcnMgKi8KKyAgICAgIHN0cnVjdCBfc3RydWN0ICpzID0gci5wYXJhbXMtPnBhcmFtWzBdLnZhbHVlLnJlZjsKKyAgICAgIGlmIChzLT5fX3NpemUgPT0gMikKKyAgICAgIHsgaWYgKCFzdHJjbXAocy0+bWVtYmVyWzBdLm5hbWUsICJmbGVycm9yIikpCisJICBpZiAocy0+bWVtYmVyWzBdLnZhbHVlLl9fdHlwZSA9PSBTT0FQX1RZUEVfX2Jvb2xlYW4pCisJICAgIGlmICgoKihfYm9vbGVhbiopcy0+bWVtYmVyWzBdLnZhbHVlLnJlZikgPT0gMCkKKwkgICAgICBwcmludGYoIldlYmxvZyBwaW5nIHN1Y2Nlc3NmdWxcbiIpOworCSAgICBlbHNlCisJICAgICAgcHJpbnRmKCJXZWJsb2cgcGluZyBmYWlsZWRcbiIpOworCSAgZWxzZSAKKwkgICAgcHJpbnRmKCJYTUwtUlBDIG1lc3NhZ2UgZm9ybWF0IGVycm9yOiBib29sZWFuIHZhbHVlIGV4cGVjdGVkXG4iKTsKKwllbHNlIAorCSAgcHJpbnRmKCJYTUwtUlBDIG1lc3NhZ2UgZm9ybWF0IGVycm9yOiBzdHJpbmcgdmFsdWUgXCJmbGVycm9yXCIgZXhwZWN0ZWRcbiIpOworICAgICAgICBpZiAoIXN0cmNtcChzLT5tZW1iZXJbMV0ubmFtZSwgIm1lc3NhZ2UiKSkKKwkgIGlmIChzLT5tZW1iZXJbMV0udmFsdWUuX19hbnkpCisJICAgIHByaW50ZigiJXNcbiIsIHMtPm1lbWJlclsxXS52YWx1ZS5fX2FueSk7CisJICBlbHNlCisJICAgIHByaW50ZigiWE1MLVJQQyBtZXNzYWdlIGZvcm1hdCBlcnJvcjogc3RyaW5nIHZhbHVlIGV4cGVjdGVkXG4iKTsKKwllbHNlIAorCSAgcHJpbnRmKCJYTUwtUlBDIG1lc3NhZ2UgZm9ybWF0IGVycm9yOiBzdHJpbmcgdmFsdWUgXCJtZXNzYWdlXCIgZXhwZWN0ZWRcbiIpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBwcmludGYoIlhNTC1SUEMgbWVzc2FnZSBmb3JtYXQgZXJyb3I6IHN0cnVjdCB3aXRoIHR3byBtZW1iZXJzIGV4cGVjdGVkXG4iKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgcHJpbnRmKCJYTUwtUlBDIG1lc3NhZ2UgZm9ybWF0IGVycm9yOiBzdHJ1Y3QgZXhwZWN0ZWRcbiIpOworICB9CisgIHNvYXBfZW5kKHNvYXApOworICBzb2FwX2RvbmUoc29hcCk7CisgIGZyZWUoc29hcCk7CisgIHJldHVybiAwOworfQorCitpbnQgbWV0aG9kQ2FsbChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqVVJMLCBzdHJ1Y3QgbWV0aG9kQ2FsbCAqbSwgc3RydWN0IG1ldGhvZFJlc3BvbnNlICpyKQoreyAvKiBubyBuYW1lc3BhY2VzICovCisgIHNvYXAtPm5hbWVzcGFjZXMgPSBOVUxMOworICAvKiBubyBTT0FQIGVuY29kaW5nU3R5bGUgKi8KKyAgc29hcC0+ZW5jb2RpbmdTdHlsZSA9IE5VTEw7CisgIC8qIGNvbm5lY3QsIHNlbmQgcmVxdWVzdCwgYW5kIHJlY2VpdmUgcmVzcG9uc2UgKi8KKyAgaWYgKHNvYXBfY29ubmVjdChzb2FwLCBVUkwsIE5VTEwpCisgICB8fCBzb2FwX2JlZ2luX3NlbmQoc29hcCkKKyAgIHx8IHNvYXBfcHV0X21ldGhvZENhbGwoc29hcCwgbSwgIm1ldGhvZENhbGwiLCBOVUxMKQorICAgfHwgc29hcF9lbmRfc2VuZChzb2FwKQorICAgfHwgc29hcF9iZWdpbl9yZWN2KHNvYXApCisgICB8fCAhc29hcF9nZXRfbWV0aG9kUmVzcG9uc2Uoc29hcCwgciwgIm1ldGhvZFJlc3BvbnNlIiwgTlVMTCkKKyAgIHx8IHNvYXBfZW5kX3JlY3Yoc29hcCkpCisgICAgcmV0dXJuIHNvYXBfY2xvc2Vzb2NrKHNvYXApOyAvKiBjbG9zZXMgc29ja2V0IGFuZCByZXR1cm5zIHNvYXAtPmVycm9yICovCisgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICByZXR1cm4gU09BUF9PSzsKK30KKworLyogRG9uJ3QgbmVlZCBhIG5hbWVzcGFjZSB0YWJsZS4gV2UgcHV0IGFuIGVtcHR5IG9uZSBoZXJlIHRvIGF2b2lkIGxpbmsgZXJyb3JzICovCitzdHJ1Y3QgTmFtZXNwYWNlIG5hbWVzcGFjZXNbXSA9IHsge05VTEwsIE5VTEx9IH07CmRpZmYgLS1naXQgYS9zYW1wbGVzL3htbC1ycGMveG1sLXJwYy13ZWJsb2dzLmNwcCBiL3NhbXBsZXMveG1sLXJwYy94bWwtcnBjLXdlYmxvZ3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYmYxNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3htbC1ycGMveG1sLXJwYy13ZWJsb2dzLmNwcApAQCAtMCwwICsxLDgxIEBACisvKgorCitYTUwtUlBDIHdlYmxvZ1VwZGF0ZXMucGluZyBleGFtcGxlIGluIEMrKworCitTZWUgaHR0cDovL3htbHJwYy5zY3JpcHRpbmcuY29tL3dlYmxvZ3NDb20gZm9yIG1vcmUgZGV0YWlscy4KKworUmVxdWlyZXMgeG1sLXJwYy5oIGFuZCB4bWwtcnBjLmNwcAorCitDb21waWxlOgorc29hcGNwcDIgeG1sLXJwYy5oCitjYyB4bWwtcnBjLXdlYmxvZ3MuY3BwIHhtbC1ycGMuY3BwIHhtbC1ycGMtaW8uY3BwIHN0ZHNvYXAyLmNwcCBzb2FwQy5jcHAKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMS0yMDA0LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzOgorR1BMIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaW5jbHVkZSAic29hcEguaCIKKyNpbmNsdWRlICJ4bWwtcnBjLWlvLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKyNkZWZpbmUgRU5EUE9JTlQgImh0dHA6Ly9ycGMud2VibG9ncy5jb20vUlBDMiIKKworaW50IG1haW4oKQoreyBzb2FwICpjdHggPSBzb2FwX25ldygpOworICAvLyBkZWZpbmUgdGhlIHdlYmxvZ3NVcGRhdGVzLnBpbmcgbWV0aG9kCisgIG1ldGhvZENhbGwgcGluZyhjdHgsIEVORFBPSU5ULCAid2VibG9nc1VwZGF0ZXMucGluZyIpOworICAvLyBkZWZpbmUgYW5kIHNldCB0aGUgdHdvIHBhcmFtZXRlcnMgb2YgdGhlIG1ldGhvZAorICBwYXJhbXMgaW5wdXQoY3R4KTsKKyAgaW5wdXRbMF0gPSAiU2NyaXB0aW5nIE5ld3MiOworICBpbnB1dFsxXSA9ICJodHRwOi8vd3d3LnNjcmlwdGluZy5jb20vIjsKKyAgLy8gbWFrZSB0aGUgY2FsbAorICBwYXJhbXMgb3V0cHV0ID0gcGluZyhpbnB1dCk7CisgIC8vIGVycm9yPworICBpZiAocGluZy5lcnJvcigpKQorICAgIHNvYXBfcHJpbnRfZmF1bHQoY3R4LCBzdGRlcnIpOworICBlbHNlIGlmIChvdXRwdXQuZW1wdHkoKSkKKyAgICBjb3V0IDw8IHBpbmcuZmF1bHQoKSA8PCBlbmRsOworICBlbHNlCisgIHsgaWYgKG91dHB1dFswXS5pc19zdHJ1Y3QoKSkKKyAgICB7IGlmIChvdXRwdXRbMF1bImZsZXJyb3IiXS5pc19mYWxzZSgpKQorICAgICAgICBjb3V0IDw8ICJTdWNjZXNzOiAiOworICAgICAgZWxzZQorICAgICAgICBjb3V0IDw8ICJGYWlsdXJlOiAiOworICAgICAgY291dCA8PCBvdXRwdXRbMF1bIm1lc3NhZ2UiXSA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlCisgICAgICBjb3V0IDw8ICJNZXNzYWdlIGZvcm1hdCBlcnJvcjoiIDw8IGVuZGwgPDwgb3V0cHV0WzBdIDw8IGVuZGw7CisgIH0KKyAgc29hcF9lbmQoY3R4KTsKKyAgc29hcF9kb25lKGN0eCk7CisgIGZyZWUoY3R4KTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qIERvbid0IG5lZWQgYSBuYW1lc3BhY2UgdGFibGUuIFdlIHB1dCBhbiBlbXB0eSBvbmUgaGVyZSB0byBhdm9pZCBsaW5rIGVycm9ycyAqLworc3RydWN0IE5hbWVzcGFjZSBuYW1lc3BhY2VzW10gPSB7IHtOVUxMLCBOVUxMfSB9OwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy94bWwtcnBjL3htbC1ycGMuY3BwIGIvc2FtcGxlcy94bWwtcnBjL3htbC1ycGMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNDY3NWQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3htbC1ycGMveG1sLXJwYy5jcHAKQEAgLTAsMCArMSw2MzMgQEAKKy8qCisKK1hNTC1SUEMgZGVmaW5pdGlvbnMgZm9yIEMrKworCitOb3RlOiAKK1hNTC1SUEMgZGVjbGFyYXRpb25zIGFyZSBnaXZlbiBpbiB0aGUgZ1NPQVAgaGVhZGVyIGZpbGUgeG1sLXJwYy5oCitJdGVyYXRvcnMgYW5kIGlvc3RyZWFtIG9wZXJhdG9ycyBhcmUgZGVjbGFyZWQgaW4geG1sLXJwYy1pdGVycy5oCisKK0V4YW1wbGUgY2FsbGluZyBzZXF1ZW5jZToKKworLy8gZ2V0IFhNTC1SUEMgc2VyaWFsaXplcnMKKyNpbmNsdWRlICJzb2FwSC5oIgorI2luY2x1ZGUgInhtbC1ycGMtaW8uaCIKKworLy8gc2V0IHVwIGNvbnRleHQKK3NvYXAgKmN0eCA9IHNvYXBfbmV3KCk7CisvLyBkZWZpbmUgbWV0aG9kCittZXRob2RDYWxsIG15TWV0aG9kKGN0eCwgIjxlbmRwb2ludC1VUkw+IiwgIjxtZXRob2QtbmFtZT4iKTsKKy8vIHBvcHVsYXRlIGlucHV0IHBhcmFtZXRlcnMKK215TWV0aG9kWzBdID0gLi4uOyAvLyBmaXJzdCBwYXJhbQorbXlNZXRob2RbMV0gPSAuLi47IC8vIHNlY29uZCBwYXJhbQorLi4uCisvLyBtYWtlIHRoZSBjYWxsIGFuZCBnZXQgdGhlIHJlc3BvbnNlIHBhcmFtZXRlcnMKK3BhcmFtcyBvdXRwdXQgPSBteU1ldGhvZCgpOworLy8gZXJyb3I/CitpZiAobXlNZXRob2QuZXJyb3IoKSkKKyAgc29hcF9wcmludF9mYXVsdChjdHgsIHN0ZGVycik7CitlbHNlIGlmIChvdXRwdXQuZW1wdHkoKSkKKyAgY291dCA8PCBteU1ldGhvZC5mYXVsdCgpIDw8IGVuZGw7CitlbHNlCisgIGZvciAocGFyYW1zOjppdGVyYXRvciBhcmcgPSBvdXRwdXQuYmVnaW4oKTsgYXJnICE9IG91dHB1dC5lbmQoKTsgKythcmcpCisgICAgY291dCA8PCAqYXJnIDw8IGVuZGw7CisvLyBkZWxldGUgYWxsCitzb2FwX2Rlc3Ryb3koY3R4KTsKK3NvYXBfZW5kKGN0eCk7Citzb2FwX2RvbmUoY3R4KTsKK2ZyZWUoY3R4KTsKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMS0yMDA0LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzOgorR1BMIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaW5jbHVkZSAic29hcEguSCIKKwordmFsdWU6OnZhbHVlKCkKK3sgfQorCit2YWx1ZTo6dmFsdWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXBfZGVmYXVsdF92YWx1ZShzb2FwLCB0aGlzKTsKK30KKwordmFsdWU6OnZhbHVlKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3QgX2FycmF5ICZhKQoreyBzb2FwX2RlZmF1bHRfdmFsdWUoc29hcCwgdGhpcyk7CisgICp0aGlzID0gYTsKK30KKwordmFsdWU6OnZhbHVlKHN0cnVjdCBzb2FwICpzb2FwLCBfYmFzZTY0ICZiKQoreyBzb2FwX2RlZmF1bHRfdmFsdWUoc29hcCwgdGhpcyk7CisgICp0aGlzID0gYjsKK30KKwordmFsdWU6OnZhbHVlKHN0cnVjdCBzb2FwICpzb2FwLCBib29sIGIpCit7IHNvYXBfZGVmYXVsdF92YWx1ZShzb2FwLCB0aGlzKTsKKyAgKnRoaXMgPSBiOworfQorCit2YWx1ZTo6dmFsdWUoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnMpCit7IHNvYXBfZGVmYXVsdF92YWx1ZShzb2FwLCB0aGlzKTsKKyAgKnRoaXMgPSBzOworfQorCit2YWx1ZTo6dmFsdWUoc3RydWN0IHNvYXAgKnNvYXAsIGRvdWJsZSBkKQoreyBzb2FwX2RlZmF1bHRfdmFsdWUoc29hcCwgdGhpcyk7CisgICp0aGlzID0gZDsKK30KKwordmFsdWU6OnZhbHVlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbikKK3sgc29hcF9kZWZhdWx0X3ZhbHVlKHNvYXAsIHRoaXMpOworICAqdGhpcyA9IG47Cit9CisKK3ZhbHVlOjp2YWx1ZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IF9zdHJ1Y3QgJnIpCit7IHNvYXBfZGVmYXVsdF92YWx1ZShzb2FwLCB0aGlzKTsKKyAgKnRoaXMgPSByOworfQorCitib29sIHZhbHVlOjppc19hcnJheSgpIGNvbnN0Cit7IHJldHVybiBfX3R5cGUgPT0gU09BUF9UWVBFX19hcnJheTsKK30KKworYm9vbCB2YWx1ZTo6aXNfYmFzZTY0KCkgY29uc3QKK3sgcmV0dXJuIF9fdHlwZSA9PSBTT0FQX1RZUEVfX2Jhc2U2NDsKK30KKworYm9vbCB2YWx1ZTo6aXNfYm9vbCgpIGNvbnN0Cit7IHJldHVybiBfX3R5cGUgPT0gU09BUF9UWVBFX19ib29sZWFuOworfQorCitib29sIHZhbHVlOjppc19kb3VibGUoKSBjb25zdAoreyByZXR1cm4gX190eXBlID09IFNPQVBfVFlQRV9fZG91YmxlOworfQorCitib29sIHZhbHVlOjppc19mYWxzZSgpIGNvbnN0Cit7IHJldHVybiBfX3R5cGUgPT0gU09BUF9UWVBFX19ib29sZWFuICYmIChib29sKSooX2Jvb2xlYW4qKXJlZiA9PSBmYWxzZTsKK30KKworYm9vbCB2YWx1ZTo6aXNfaW50KCkgY29uc3QKK3sgcmV0dXJuIF9fdHlwZSA9PSBTT0FQX1RZUEVfX2ludCB8fCBfX3R5cGUgPT0gU09BUF9UWVBFX19pNDsKK30KKworYm9vbCB2YWx1ZTo6aXNfc3RydWN0KCkgY29uc3QKK3sgcmV0dXJuIF9fdHlwZSA9PSBTT0FQX1RZUEVfX3N0cnVjdDsKK30KKworYm9vbCB2YWx1ZTo6aXNfc3RyaW5nKCkgY29uc3QKK3sgcmV0dXJuIF9fdHlwZSA9PSBTT0FQX1RZUEVfX3N0cmluZyB8fCAoX19hbnkgJiYgKl9fYW55KTsKK30KKworYm9vbCB2YWx1ZTo6aXNfdHJ1ZSgpIGNvbnN0Cit7IHJldHVybiBfX3R5cGUgPT0gU09BUF9UWVBFX19ib29sZWFuICYmIChib29sKSooX2Jvb2xlYW4qKXJlZiA9PSB0cnVlOworfQorCit2YWx1ZTo6b3BlcmF0b3Igc3RydWN0IF9hcnJheSYoKQoreyBpZiAoX190eXBlID09IFNPQVBfVFlQRV9fYXJyYXkpCisgICAgcmV0dXJuICooc3RydWN0IF9hcnJheSopcmVmOworICByZXR1cm4gKnNvYXBfbmV3X19hcnJheShzb2FwLCAtMSk7Cit9CisKK3ZhbHVlOjpvcGVyYXRvciBjb25zdCBzdHJ1Y3QgX2FycmF5JigpIGNvbnN0Cit7IGlmIChfX3R5cGUgPT0gU09BUF9UWVBFX19hcnJheSkKKyAgICByZXR1cm4gKihjb25zdCBzdHJ1Y3QgX2FycmF5KilyZWY7CisgIHJldHVybiAqc29hcF9uZXdfX2FycmF5KHNvYXAsIC0xKTsKK30KKwordmFsdWU6Om9wZXJhdG9yIHN0cnVjdCBfYmFzZTY0JigpCit7IGlmIChfX3R5cGUgPT0gU09BUF9UWVBFX19iYXNlNjQpCisgICAgcmV0dXJuICooc3RydWN0IF9iYXNlNjQqKXJlZjsKKyAgcmV0dXJuICpzb2FwX25ld19fYmFzZTY0KHNvYXAsIC0xKTsKK30KKwordmFsdWU6Om9wZXJhdG9yIGNvbnN0IHN0cnVjdCBfYmFzZTY0JigpIGNvbnN0Cit7IGlmIChfX3R5cGUgPT0gU09BUF9UWVBFX19iYXNlNjQpCisgICAgcmV0dXJuICooY29uc3Qgc3RydWN0IF9iYXNlNjQqKXJlZjsKKyAgcmV0dXJuICpzb2FwX25ld19fYmFzZTY0KHNvYXAsIC0xKTsKK30KKwordmFsdWU6Om9wZXJhdG9yIGNoYXIqKCkKK3sgaWYgKF9fdHlwZSA9PSBTT0FQX1RZUEVfX3N0cmluZyB8fCBfX3R5cGUgPT0gU09BUF9UWVBFX19kYXRlVGltZV9ET1Rpc284NjAxKQorICAgIHJldHVybiAoY2hhciopcmVmOworICBpZiAoX19hbnkpCisgICAgcmV0dXJuIF9fYW55OworICByZXR1cm4gIiI7Cit9CisKK3ZhbHVlOjpvcGVyYXRvciBjb25zdCBjaGFyKigpIGNvbnN0Cit7IGlmIChfX3R5cGUgPT0gU09BUF9UWVBFX19zdHJpbmcgfHwgX190eXBlID09IFNPQVBfVFlQRV9fZGF0ZVRpbWVfRE9UaXNvODYwMSkKKyAgICByZXR1cm4gKGNvbnN0IGNoYXIqKXJlZjsKKyAgaWYgKF9fYW55KQorICAgIHJldHVybiBfX2FueTsKKyAgcmV0dXJuICIiOworfQorCit2YWx1ZTo6b3BlcmF0b3IgZG91YmxlKCkgY29uc3QKK3sgaWYgKF9fdHlwZSA9PSBTT0FQX1RZUEVfX2RvdWJsZSkKKyAgICByZXR1cm4gKGRvdWJsZSkqKF9kb3VibGUqKXJlZjsKKyAgcmV0dXJuIDAuMDsKK30KKwordmFsdWU6Om9wZXJhdG9yIGludCgpIGNvbnN0Cit7IGlmIChfX3R5cGUgPT0gU09BUF9UWVBFX19pbnQpCisgICAgcmV0dXJuIChpbnQpKihfaW50KilyZWY7CisgIGlmIChfX3R5cGUgPT0gU09BUF9UWVBFX19pNCkKKyAgICByZXR1cm4gKGludCkqKF9pNCopcmVmOworICByZXR1cm4gMDsKK30KKwordmFsdWU6Om9wZXJhdG9yIHN0cnVjdCBfc3RydWN0JigpCit7IGlmIChfX3R5cGUgPT0gU09BUF9UWVBFX19zdHJ1Y3QpCisgICAgcmV0dXJuICooc3RydWN0IF9zdHJ1Y3QqKXJlZjsKKyAgcmV0dXJuICpzb2FwX25ld19fc3RydWN0KHNvYXAsIC0xKTsKK30KKwordmFsdWU6Om9wZXJhdG9yIGNvbnN0IHN0cnVjdCBfc3RydWN0JigpIGNvbnN0Cit7IGlmIChfX3R5cGUgPT0gU09BUF9UWVBFX19zdHJ1Y3QpCisgICAgcmV0dXJuICooY29uc3Qgc3RydWN0IF9zdHJ1Y3QqKXJlZjsKKyAgcmV0dXJuICpzb2FwX25ld19fc3RydWN0KHNvYXAsIC0xKTsKK30KKworc3RydWN0IHZhbHVlJiB2YWx1ZTo6b3BlcmF0b3JbXShpbnQgbikKK3sgcmV0dXJuICgoc3RydWN0IF9hcnJheSYpKnRoaXMpW25dOworfQorCitzdHJ1Y3QgdmFsdWUmIHZhbHVlOjpvcGVyYXRvcltdKGNvbnN0IGNoYXIgKnMpCit7IHJldHVybiAoKHN0cnVjdCBfc3RydWN0JikqdGhpcylbc107Cit9CisKK3N0cnVjdCBfYXJyYXkmIHZhbHVlOjpvcGVyYXRvcj0oc3RydWN0IF9hcnJheSYgYSkKK3sgX190eXBlID0gU09BUF9UWVBFX19hcnJheTsKKyAgX19hbnkgPSBOVUxMOworICByZWYgPSAmYTsKKyAgcmV0dXJuIGE7Cit9CisKK19iYXNlNjQmIHZhbHVlOjpvcGVyYXRvcj0oX2Jhc2U2NCYgYikKK3sgX190eXBlID0gU09BUF9UWVBFX19iYXNlNjQ7CisgIF9fYW55ID0gTlVMTDsKKyAgcmVmID0gJmI7CisgIHJldHVybiBiOworfQorCitib29sIHZhbHVlOjpvcGVyYXRvcj0oYm9vbCBiKQoreyBfX3R5cGUgPSBTT0FQX1RZUEVfX2Jvb2xlYW47CisgIF9fYW55ID0gTlVMTDsKKyAgcmVmID0gc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKF9ib29sZWFuKSk7CisgICooX2Jvb2xlYW4qKXJlZiA9IChfYm9vbGVhbiliOworICByZXR1cm4gYjsKK30KKworY2hhciogdmFsdWU6Om9wZXJhdG9yPShjaGFyICpzKQoreyBfX3R5cGUgPSBTT0FQX1RZUEVfX3N0cmluZzsKKyAgX19hbnkgPSBOVUxMOworICByZWYgPSBzb2FwX3N0cmR1cChzb2FwLCBzKTsKKyAgcmV0dXJuIHM7Cit9CisKK2RvdWJsZSB2YWx1ZTo6b3BlcmF0b3I9KGRvdWJsZSBkKQoreyBfX3R5cGUgPSBTT0FQX1RZUEVfX2RvdWJsZTsKKyAgX19hbnkgPSBOVUxMOworICByZWYgPSBzb2FwX21hbGxvYyhzb2FwLCBzaXplb2YoX2RvdWJsZSkpOworICAqKF9kb3VibGUqKXJlZiA9IChfZG91YmxlKWQ7CisgIHJldHVybiBkOworfQorCitpbnQgdmFsdWU6Om9wZXJhdG9yPShpbnQgbikKK3sgX190eXBlID0gU09BUF9UWVBFX19pbnQ7CisgIF9fYW55ID0gTlVMTDsKKyAgcmVmID0gc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKF9pbnQpKTsKKyAgKihfaW50KilyZWYgPSAoX2ludCluOworICByZXR1cm4gbjsKK30KKworc3RydWN0IF9zdHJ1Y3QmIHZhbHVlOjpvcGVyYXRvcj0oc3RydWN0IF9zdHJ1Y3QmIHIpCit7IF9fdHlwZSA9IFNPQVBfVFlQRV9fc3RydWN0OworICBfX2FueSA9IE5VTEw7CisgIHJlZiA9ICZyOworICByZXR1cm4gcjsKK30KKwordGltZV90IHZhbHVlOjpvcGVyYXRvcj0odGltZV90IHQpCit7IF9fdHlwZSA9IFNPQVBfVFlQRV9fZGF0ZVRpbWVfRE9UaXNvODYwMTsKKyAgX19hbnkgPSBOVUxMOworICByZWYgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwX2RhdGVUaW1lMnMoc29hcCwgdCkpOworICByZXR1cm4gdDsKK30KKworX3N0cnVjdDo6X3N0cnVjdCgpCit7IH0KKworX3N0cnVjdDo6X3N0cnVjdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcF9kZWZhdWx0X19zdHJ1Y3Qoc29hcCwgdGhpcyk7Cit9CisKK19zdHJ1Y3Q6Ol9zdHJ1Y3Qoc3RydWN0IHNvYXAgKnNvYXAsIGludCBsZW4pCit7IHNvYXBfZGVmYXVsdF9fc3RydWN0KHNvYXAsIHRoaXMpOworICBfX3NpemUgPSBsZW47CisgIG1lbWJlciA9IChzdHJ1Y3QgbWVtYmVyKilzb2FwX21hbGxvYyhzb2FwLCBfX3NpemUgKiBzaXplb2Yoc3RydWN0IG1lbWJlcikpOworICBmb3IgKGludCBpID0gMDsgaSA8IF9fc2l6ZTsgaSsrKQorICAgIHNvYXBfZGVmYXVsdF9tZW1iZXIoc29hcCwgJm1lbWJlcltpXSk7Cit9CisKK2Jvb2wgX3N0cnVjdDo6ZW1wdHkoKSBjb25zdAoreyByZXR1cm4gX19zaXplID09IDA7Cit9CisKK2ludCBfc3RydWN0OjpzaXplKCkgY29uc3QKK3sgcmV0dXJuIF9fc2l6ZTsKK30KKworc3RydWN0IHZhbHVlJiBfc3RydWN0OjpvcGVyYXRvcltdKGNvbnN0IGNoYXIgKnMpCit7IGludCBpID0gMDsKKyAgaWYgKCFtZW1iZXIpCisgIHsgX19zaXplID0gMTsKKyAgICBtZW1iZXIgPSAoc3RydWN0IG1lbWJlciopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBtZW1iZXIpKTsKKyAgfQorICBlbHNlCisgIHsgZm9yIChpID0gMDsgaSA8IF9fc2l6ZTsgaSsrKQorICAgIHsgaWYgKCFzdHJjbXAobWVtYmVyW2ldLm5hbWUsIHMpKQorICAgICAgICByZXR1cm4gbWVtYmVyW2ldLnZhbHVlOworICAgIH0KKyAgICBfX3NpemUrKzsKKyAgICBzdHJ1Y3QgbWVtYmVyICpuZXdtZW1iZXIgPSAoc3RydWN0IG1lbWJlciopc29hcF9tYWxsb2Moc29hcCwgX19zaXplICogc2l6ZW9mKHN0cnVjdCBtZW1iZXIpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgX19zaXplIC0gMTsgaSsrKQorICAgICAgbmV3bWVtYmVyW2ldID0gbWVtYmVyW2ldOworICAgIHNvYXBfdW5saW5rKHNvYXAsIG1lbWJlcik7CisgICAgZnJlZShtZW1iZXIpOworICAgIG1lbWJlciA9IG5ld21lbWJlcjsKKyAgfQorICBtZW1iZXJbaV0ubmFtZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHMpOworICBzb2FwX2RlZmF1bHRfdmFsdWUoc29hcCwgJm1lbWJlcltpXS52YWx1ZSk7CisgIHJldHVybiBtZW1iZXJbaV0udmFsdWU7Cit9CisKK19zdHJ1Y3RfaXRlcmF0b3IgX3N0cnVjdDo6YmVnaW4oKQoreyBfc3RydWN0X2l0ZXJhdG9yIGl0ZXIodGhpcyk7CisgIHJldHVybiBpdGVyOworfQorCitfc3RydWN0X2l0ZXJhdG9yIF9zdHJ1Y3Q6OmVuZCgpCit7IF9zdHJ1Y3RfaXRlcmF0b3IgaXRlcih0aGlzKTsKKyAgaXRlciArPSBfX3NpemU7CisgIHJldHVybiBpdGVyOworfQorCitfYXJyYXk6Ol9hcnJheSgpCit7IH0KKworX2FycmF5OjpfYXJyYXkoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXBfZGVmYXVsdF9fYXJyYXkoc29hcCwgdGhpcyk7Cit9CisKK19hcnJheTo6X2FycmF5KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbGVuKQoreyBzb2FwX2RlZmF1bHRfX2FycmF5KHNvYXAsIHRoaXMpOworICBkYXRhLl9fc2l6ZSA9IGxlbjsKKyAgZGF0YS52YWx1ZSA9IChzdHJ1Y3QgdmFsdWUqKXNvYXBfbWFsbG9jKHNvYXAsIGRhdGEuX19zaXplICogc2l6ZW9mKHN0cnVjdCB2YWx1ZSkpOworICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGEuX19zaXplOyBpKyspCisgICAgc29hcF9kZWZhdWx0X3ZhbHVlKHNvYXAsICZkYXRhLnZhbHVlW2ldKTsKK30KKworYm9vbCBfYXJyYXk6OmVtcHR5KCkgY29uc3QKK3sgcmV0dXJuIGRhdGEuX19zaXplID09IDA7Cit9CisKK2ludCBfYXJyYXk6OnNpemUoKSBjb25zdAoreyByZXR1cm4gZGF0YS5fX3NpemU7Cit9CisKK3N0cnVjdCB2YWx1ZSYgX2FycmF5OjpvcGVyYXRvcltdKGludCBuKQoreyBpZiAoIWRhdGEudmFsdWUpCisgIHsgZGF0YS5fX3NpemUgPSBuICsgMTsKKyAgICBkYXRhLnZhbHVlID0gKHN0cnVjdCB2YWx1ZSopc29hcF9tYWxsb2Moc29hcCwgZGF0YS5fX3NpemUgKiBzaXplb2Yoc3RydWN0IHZhbHVlKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLl9fc2l6ZTsgaSsrKQorICAgICAgc29hcF9kZWZhdWx0X3ZhbHVlKHNvYXAsICZkYXRhLnZhbHVlW2ldKTsKKyAgfQorICBlbHNlIGlmIChkYXRhLl9fc2l6ZSA8PSBuKQorICB7IGludCBvbGRzaXplID0gZGF0YS5fX3NpemU7CisgICAgZGF0YS5fX3NpemUgPSBuICsgMTsKKyAgICBzdHJ1Y3QgdmFsdWUgKm5ld3ZhbHVlID0gKHN0cnVjdCB2YWx1ZSopc29hcF9tYWxsb2Moc29hcCwgZGF0YS5fX3NpemUgKiBzaXplb2Yoc3RydWN0IHZhbHVlKSk7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG9sZHNpemU7IGkrKykKKyAgICAgIG5ld3ZhbHVlW2ldID0gZGF0YS52YWx1ZVtpXTsKKyAgICBmb3IgKDsgaSA8IGRhdGEuX19zaXplOyBpKyspCisgICAgICBzb2FwX2RlZmF1bHRfdmFsdWUoc29hcCwgJm5ld3ZhbHVlW2ldKTsKKyAgICBzb2FwX3VubGluayhzb2FwLCBkYXRhLnZhbHVlKTsKKyAgICBmcmVlKGRhdGEudmFsdWUpOworICAgIGRhdGEudmFsdWUgPSBuZXd2YWx1ZTsKKyAgfQorICByZXR1cm4gZGF0YS52YWx1ZVtuXTsKK30KKworX2FycmF5X2l0ZXJhdG9yIF9hcnJheTo6YmVnaW4oKQoreyBfYXJyYXlfaXRlcmF0b3IgaXRlcih0aGlzKTsKKyAgcmV0dXJuIGl0ZXI7Cit9CisKK19hcnJheV9pdGVyYXRvciBfYXJyYXk6OmVuZCgpCit7IF9hcnJheV9pdGVyYXRvciBpdGVyKHRoaXMpOworICBpdGVyICs9IGRhdGEuX19zaXplOworICByZXR1cm4gaXRlcjsKK30KKworX2Jhc2U2NDo6X2Jhc2U2NCgpCit7IH0KKworX2Jhc2U2NDo6X2Jhc2U2NChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcF9kZWZhdWx0X19iYXNlNjQoc29hcCwgdGhpcyk7Cit9CisKK2ludCBfYmFzZTY0OjpzaXplKCkgY29uc3QKK3sgcmV0dXJuIF9fc2l6ZTsKK30KKwordW5zaWduZWQgY2hhciogX2Jhc2U2NDo6cHRyKCkKK3sgcmV0dXJuIF9fcHRyOworfQorCitwYXJhbXM6OnBhcmFtcygpCit7IH0KKworcGFyYW1zOjpwYXJhbXMoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXBfZGVmYXVsdF9wYXJhbXMoc29hcCwgdGhpcyk7Cit9CisKK3BhcmFtczo6cGFyYW1zKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbGVuKQoreyBzb2FwX2RlZmF1bHRfcGFyYW1zKHNvYXAsIHRoaXMpOworICBfX3NpemUgPSBsZW47CisgIHBhcmFtID0gKHN0cnVjdCBwYXJhbSopc29hcF9tYWxsb2Moc29hcCwgX19zaXplICogc2l6ZW9mKHN0cnVjdCBwYXJhbSkpOworICBmb3IgKGludCBpID0gMDsgaSA8IF9fc2l6ZTsgaSsrKQorICAgIHNvYXBfZGVmYXVsdF9wYXJhbShzb2FwLCAmcGFyYW1baV0pOworfQorCitib29sIHBhcmFtczo6ZW1wdHkoKSBjb25zdAoreyByZXR1cm4gX19zaXplID09IDA7Cit9CisKK2ludCBwYXJhbXM6OnNpemUoKSBjb25zdAoreyByZXR1cm4gX19zaXplOworfQorCitzdHJ1Y3QgdmFsdWUmIHBhcmFtczo6b3BlcmF0b3JbXShpbnQgbikKK3sgaWYgKCFwYXJhbSkKKyAgeyBfX3NpemUgPSBuICsgMTsKKyAgICBwYXJhbSA9IChzdHJ1Y3QgcGFyYW0qKXNvYXBfbWFsbG9jKHNvYXAsIF9fc2l6ZSAqIHNpemVvZihzdHJ1Y3QgcGFyYW0pKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IF9fc2l6ZTsgaSsrKQorICAgICAgc29hcF9kZWZhdWx0X3BhcmFtKHNvYXAsICZwYXJhbVtpXSk7CisgIH0KKyAgZWxzZSBpZiAoX19zaXplIDw9IG4pCisgIHsgaW50IG9sZHNpemUgPSBfX3NpemU7CisgICAgX19zaXplID0gbiArIDE7CisgICAgc3RydWN0IHBhcmFtICpuZXdwYXJhbSA9IChzdHJ1Y3QgcGFyYW0qKXNvYXBfbWFsbG9jKHNvYXAsIF9fc2l6ZSAqIHNpemVvZihzdHJ1Y3QgcGFyYW0pKTsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgb2xkc2l6ZTsgaSsrKQorICAgICAgbmV3cGFyYW1baV0gPSBwYXJhbVtpXTsKKyAgICBmb3IgKDsgaSA8IF9fc2l6ZTsgaSsrKQorICAgICAgc29hcF9kZWZhdWx0X3BhcmFtKHNvYXAsICZuZXdwYXJhbVtpXSk7CisgICAgc29hcF91bmxpbmsoc29hcCwgcGFyYW0pOworICAgIGZyZWUocGFyYW0pOworICAgIHBhcmFtID0gbmV3cGFyYW07CisgIH0KKyAgcmV0dXJuIHBhcmFtW25dLnZhbHVlOworfQorCitwYXJhbXNfaXRlcmF0b3IgcGFyYW1zOjpiZWdpbigpCit7IHBhcmFtc19pdGVyYXRvciBpdGVyKHRoaXMpOworICByZXR1cm4gaXRlcjsKK30KKworcGFyYW1zX2l0ZXJhdG9yIHBhcmFtczo6ZW5kKCkKK3sgcGFyYW1zX2l0ZXJhdG9yIGl0ZXIodGhpcyk7CisgIGl0ZXIgKz0gX19zaXplOworICByZXR1cm4gaXRlcjsKK30KKworbWV0aG9kQ2FsbDo6bWV0aG9kQ2FsbCgpCit7IH0KKworbWV0aG9kQ2FsbDo6bWV0aG9kQ2FsbChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZW5kcG9pbnQsIGNvbnN0IGNoYXIgKm5hbWUpCit7IHNvYXBfZGVmYXVsdF9tZXRob2RDYWxsKHNvYXAsIHRoaXMpOworICBtZXRob2ROYW1lID0gc29hcF9zdHJkdXAoc29hcCwgbmFtZSk7CisgIG1ldGhvZEVuZHBvaW50ID0gc29hcF9zdHJkdXAoc29hcCwgZW5kcG9pbnQpOworICBtZXRob2RSZXNwb25zZSA9IE5VTEw7Cit9CisKK3N0cnVjdCB2YWx1ZSYgbWV0aG9kQ2FsbDo6b3BlcmF0b3JbXShpbnQgbikKK3sgcmV0dXJuIHBhcmFtc1tuXTsKK30KKworc3RydWN0IHBhcmFtcyYgbWV0aG9kQ2FsbDo6b3BlcmF0b3IoKSgpCit7IC8qIG5vIG5hbWVzcGFjZXMgKi8KKyAgc29hcC0+bmFtZXNwYWNlcyA9IE5VTEw7CisgIC8qIG5vIFNPQVAgZW5jb2RpbmdTdHlsZSAqLworICBzb2FwLT5lbmNvZGluZ1N0eWxlID0gTlVMTDsKKyAgLyogY29ubmVjdCwgc2VuZCByZXF1ZXN0LCBhbmQgcmVjZWl2ZSByZXNwb25zZSAqLworICBpZiAoc29hcF9jb25uZWN0KHNvYXAsIG1ldGhvZEVuZHBvaW50LCBOVUxMKQorICAgfHwgc29hcF9iZWdpbl9zZW5kKHNvYXApCisgICB8fCBzb2FwX3B1dF9tZXRob2RDYWxsKHNvYXAsIHRoaXMsICJtZXRob2RDYWxsIiwgTlVMTCkKKyAgIHx8IHNvYXBfZW5kX3NlbmQoc29hcCkKKyAgIHx8IHNvYXBfYmVnaW5fcmVjdihzb2FwKQorICAgfHwgIShtZXRob2RSZXNwb25zZSA9IHNvYXBfZ2V0X21ldGhvZFJlc3BvbnNlKHNvYXAsIG1ldGhvZFJlc3BvbnNlLCAibWV0aG9kUmVzcG9uc2UiLCBOVUxMKSkKKyAgIHx8IHNvYXBfZW5kX3JlY3Yoc29hcCkpCisgICAgbWV0aG9kUmVzcG9uc2UgPSBOVUxMOworICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgaWYgKG1ldGhvZFJlc3BvbnNlICYmIG1ldGhvZFJlc3BvbnNlLT5wYXJhbXMpCisgICAgcmV0dXJuICptZXRob2RSZXNwb25zZS0+cGFyYW1zOworICByZXR1cm4gKnNvYXBfbmV3X3BhcmFtcyhzb2FwLCAtMSk7Cit9CisKK3N0cnVjdCBwYXJhbXMmIG1ldGhvZENhbGw6Om9wZXJhdG9yKCkoY29uc3Qgc3RydWN0IHBhcmFtcyYgYXJncykKK3sgLyogcGFyYW1ldGVycyAqLworICBwYXJhbXMgPSBhcmdzOworICAvKiBpbnZva2UgKi8KKyAgcmV0dXJuICgqdGhpcykoKTsKK30KKworc3RydWN0IHBhcmFtcyYgbWV0aG9kQ2FsbDo6cmVzcG9uc2UoKQoreyBpZiAoIW1ldGhvZFJlc3BvbnNlKQorICAgIG1ldGhvZFJlc3BvbnNlID0gc29hcF9uZXdfbWV0aG9kUmVzcG9uc2Uoc29hcCwgLTEpOworICBpZiAoIW1ldGhvZFJlc3BvbnNlLT5wYXJhbXMpCisgICAgbWV0aG9kUmVzcG9uc2UtPnBhcmFtcyA9IHNvYXBfbmV3X3BhcmFtcyhzb2FwLCAtMSk7CisgIHJldHVybiAqbWV0aG9kUmVzcG9uc2UtPnBhcmFtczsKK30KKworc3RydWN0IHZhbHVlJiBtZXRob2RDYWxsOjpmYXVsdCgpCit7IGlmIChtZXRob2RSZXNwb25zZSAmJiBtZXRob2RSZXNwb25zZS0+ZmF1bHQpCisgICAgcmV0dXJuIG1ldGhvZFJlc3BvbnNlLT5mYXVsdC0+dmFsdWU7CisgIHJldHVybiAqc29hcF9uZXdfdmFsdWUoc29hcCwgLTEpOworfQorCitpbnQgbWV0aG9kQ2FsbDo6ZXJyb3IoKSBjb25zdAoreyByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisKK21ldGhvZFJlc3BvbnNlOjptZXRob2RSZXNwb25zZSgpCit7IH0KKworbWV0aG9kUmVzcG9uc2U6Om1ldGhvZFJlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwX2RlZmF1bHRfbWV0aG9kUmVzcG9uc2Uoc29hcCwgdGhpcyk7Cit9CisKK19hcnJheV9pdGVyYXRvcjo6X2FycmF5X2l0ZXJhdG9yKCkKK3sgdmFsdWUgPSBzdGFydCA9IE5VTEw7Cit9CisKK19hcnJheV9pdGVyYXRvcjo6X2FycmF5X2l0ZXJhdG9yKGNvbnN0IHN0cnVjdCBfYXJyYXkqIGEpCit7IHZhbHVlID0gc3RhcnQgPSBhLT5kYXRhLnZhbHVlOworfQorCitib29sIF9hcnJheV9pdGVyYXRvcjo6b3BlcmF0b3I9PShjb25zdCBfYXJyYXlfaXRlcmF0b3ImIHRoYXQpIGNvbnN0Cit7IHJldHVybiB0aGlzLT52YWx1ZSA9PSB0aGF0LnZhbHVlOworfQorCitib29sIF9hcnJheV9pdGVyYXRvcjo6b3BlcmF0b3IhPShjb25zdCBfYXJyYXlfaXRlcmF0b3ImIHRoYXQpIGNvbnN0Cit7IHJldHVybiB0aGlzLT52YWx1ZSAhPSB0aGF0LnZhbHVlOworfQorCitpbnQgX2FycmF5X2l0ZXJhdG9yOjppbmRleCgpIGNvbnN0Cit7IHJldHVybiB2YWx1ZSAtIHN0YXJ0OworfQorCitzdHJ1Y3QgdmFsdWUmIF9hcnJheV9pdGVyYXRvcjo6b3BlcmF0b3IqKCkgY29uc3QKK3sgcmV0dXJuICp2YWx1ZTsKK30KKworX2FycmF5X2l0ZXJhdG9yJiBfYXJyYXlfaXRlcmF0b3I6Om9wZXJhdG9yKysoKQoreyB2YWx1ZSsrOworICByZXR1cm4gKnRoaXM7Cit9CisKK19hcnJheV9pdGVyYXRvciYgX2FycmF5X2l0ZXJhdG9yOjpvcGVyYXRvcis9KGludCBzdGVwKQoreyB2YWx1ZSArPSBzdGVwOworICByZXR1cm4gKnRoaXM7Cit9CisKK19zdHJ1Y3RfaXRlcmF0b3I6Ol9zdHJ1Y3RfaXRlcmF0b3IoKQoreyBtZW1iZXIgPSBOVUxMOworfQorCitfc3RydWN0X2l0ZXJhdG9yOjpfc3RydWN0X2l0ZXJhdG9yKGNvbnN0IHN0cnVjdCBfc3RydWN0KiBzKQoreyBtZW1iZXIgPSBzLT5tZW1iZXI7Cit9CisKK2Jvb2wgX3N0cnVjdF9pdGVyYXRvcjo6b3BlcmF0b3I9PShjb25zdCBfc3RydWN0X2l0ZXJhdG9yJiB0aGF0KSBjb25zdAoreyByZXR1cm4gdGhpcy0+bWVtYmVyID09IHRoYXQubWVtYmVyOworfQorCitib29sIF9zdHJ1Y3RfaXRlcmF0b3I6Om9wZXJhdG9yIT0oY29uc3QgX3N0cnVjdF9pdGVyYXRvciYgdGhhdCkgY29uc3QKK3sgcmV0dXJuIHRoaXMtPm1lbWJlciAhPSB0aGF0Lm1lbWJlcjsKK30KKworY29uc3QgY2hhciogX3N0cnVjdF9pdGVyYXRvcjo6aW5kZXgoKSBjb25zdAoreyByZXR1cm4gbWVtYmVyLT5uYW1lOworfQorCitzdHJ1Y3QgdmFsdWUmIF9zdHJ1Y3RfaXRlcmF0b3I6Om9wZXJhdG9yKigpIGNvbnN0Cit7IHJldHVybiBtZW1iZXItPnZhbHVlOworfQorCitfc3RydWN0X2l0ZXJhdG9yJiBfc3RydWN0X2l0ZXJhdG9yOjpvcGVyYXRvcisrKCkKK3sgbWVtYmVyKys7CisgIHJldHVybiAqdGhpczsKK30KKworX3N0cnVjdF9pdGVyYXRvciYgX3N0cnVjdF9pdGVyYXRvcjo6b3BlcmF0b3IrPShpbnQgc3RlcCkKK3sgbWVtYmVyICs9IHN0ZXA7CisgIHJldHVybiAqdGhpczsKK30KKworcGFyYW1zX2l0ZXJhdG9yOjpwYXJhbXNfaXRlcmF0b3IoKQoreyBzdGFydCA9IHBhcmFtID0gTlVMTDsKK30KKworcGFyYW1zX2l0ZXJhdG9yOjpwYXJhbXNfaXRlcmF0b3IoY29uc3Qgc3RydWN0IHBhcmFtcyogcykKK3sgc3RhcnQgPSBwYXJhbSA9IHMtPnBhcmFtOworfQorCitib29sIHBhcmFtc19pdGVyYXRvcjo6b3BlcmF0b3I9PShjb25zdCBwYXJhbXNfaXRlcmF0b3ImIHRoYXQpIGNvbnN0Cit7IHJldHVybiB0aGlzLT5wYXJhbSA9PSB0aGF0LnBhcmFtOworfQorCitib29sIHBhcmFtc19pdGVyYXRvcjo6b3BlcmF0b3IhPShjb25zdCBwYXJhbXNfaXRlcmF0b3ImIHRoYXQpIGNvbnN0Cit7IHJldHVybiB0aGlzLT5wYXJhbSAhPSB0aGF0LnBhcmFtOworfQorCitpbnQgcGFyYW1zX2l0ZXJhdG9yOjppbmRleCgpIGNvbnN0Cit7IHJldHVybiBwYXJhbSAtIHN0YXJ0OworfQorCitzdHJ1Y3QgdmFsdWUmIHBhcmFtc19pdGVyYXRvcjo6b3BlcmF0b3IqKCkgY29uc3QKK3sgcmV0dXJuIHBhcmFtLT52YWx1ZTsKK30KKworcGFyYW1zX2l0ZXJhdG9yJiBwYXJhbXNfaXRlcmF0b3I6Om9wZXJhdG9yKysoKQoreyBwYXJhbSsrOworICByZXR1cm4gKnRoaXM7Cit9CisKK3BhcmFtc19pdGVyYXRvciYgcGFyYW1zX2l0ZXJhdG9yOjpvcGVyYXRvcis9KGludCBzdGVwKQoreyBwYXJhbSArPSBzdGVwOworICByZXR1cm4gKnRoaXM7Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL3htbC1ycGMveG1sLXJwYy5oIGIvc2FtcGxlcy94bWwtcnBjL3htbC1ycGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGE2NzE4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy94bWwtcnBjL3htbC1ycGMuaApAQCAtMCwwICsxLDI1MyBAQAorLyoKKworWE1MLVJQQyBiaW5kaW5nIGZvciBDIG9yIEMrKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyB0d28gbGljZW5zZXM6CitHUEwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbmNsdWRlICJ4bWwtcnBjLWl0ZXJzLmgiCS8vIGRlZmVycmVkIHRvIEMrKyBjb21waWxlcgorCisvLy8gZm9yIEMrKyBvbmx5OiBleHRlcm5hbCBpdGVyYXRvciBjbGFzcyBmb3Igc3RydWN0cworZXh0ZXJuIGNsYXNzIF9zdHJ1Y3RfaXRlcmF0b3I7CisKKy8vLyBmb3IgQysrIG9ubHk6IGV4dGVybmFsIGl0ZXJhdG9yIGNsYXNzIGZvciBhcnJheXMKK2V4dGVybiBjbGFzcyBfYXJyYXlfaXRlcmF0b3I7CisKKy8vLyBmb3IgQysrIG9ubHk6IGV4dGVybmFsIGl0ZXJhdG9yIGNsYXNzIGZvciBwYXJhbWV0ZXJzCitleHRlcm4gY2xhc3MgcGFyYW1zX2l0ZXJhdG9yOworCisvLy8gU2NhbGFyIDxib29sZWFuPiBlbGVtZW50CisKK3R5cGVkZWYgY2hhcgkJX2Jvb2xlYW47CS8vLzwgYm9vbGVhbiB2YWx1ZXMgYXJlIDAgKGZhbHNlKSBvciAxICh0cnVlKQorCisvLy8gU2NhbGFyIDxkb3VibGU+IGVsZW1lbnQKKwordHlwZWRlZiBkb3VibGUJCV9kb3VibGU7CS8vLzwgZG91YmxlIGZsb2F0aW5nIHBvaW50IHZhbHVlCisKKy8vLyBTY2FsYXIgPGk0PiBlbGVtZW50CisKK3R5cGVkZWYgaW50CQlfaTQ7CQkvLy88IDMyYml0IGludCB2YWx1ZQorCisvLy8gU2NhbGFyIDxpbnQ+IGVsZW1lbnQKKwordHlwZWRlZiBpbnQJCV9pbnQ7CQkvLy88IDMyYml0IGludCB2YWx1ZQorCisvLy8gU2NhbGFyIDxzdHJpbmc+IGVsZW1lbnQKKwordHlwZWRlZiBjaGFyKgkJX3N0cmluZzsJLy8vPCBzdHJpbmcgdmFsdWUKKworLy8vIFNjYWxhciA8ZGF0ZVRpbWUuaXNvODYwMT4gZWxlbWVudAorCit0eXBlZGVmIGNoYXIqCQlfZGF0ZVRpbWVfRE9UaXNvODYwMTsJLy8vPCBJU084NjAxIGRhdGUgYW5kIHRpbWUgZm9ybWF0dGVkIHN0cmluZworCisvLy8gPGJhc2U2ND4gYmluYXJ5IGRhdGEgZWxlbWVudAorCitzdHJ1Y3QgX2Jhc2U2NAoreyB1bnNpZ25lZCBjaGFyKglfX3B0cjsJCS8vLzwgcG9pbnRlciB0byByYXcgYmluYXJ5IGRhdGEgYmxvY2sKKyAgaW50CQkJX19zaXplOwkJLy8vPCBzaXplIG9mIHJhdyBiaW5hcnkgZGF0YSBibG9jaworLy8gQysrIGZ1bmN0aW9uIG1lbWJlcnMsIG5vdCBhdmFpbGFibGUgaW4gQyAod2hlbiB1c2luZyBzdGRzb2FwMiAtYykKK3B1YmxpYzoKKyAgCQkJX2Jhc2U2NCgpOworICAJCQlfYmFzZTY0KHN0cnVjdCBzb2FwKik7CisgIGludAkJCXNpemUoKSBjb25zdDsJLy8vPCBieXRlIHNpemUgb2YgZGF0YQorICB1bnNpZ25lZCBjaGFyKglwdHIoKTsJCS8vLzwgcG9pbnRlciB0byBkYXRhCit9OworCisvLy8gPHN0cnVjdD4gZWxlbWVudAorCitzdHJ1Y3QgX3N0cnVjdAoreyBpbnQJCQlfX3NpemU7CQkvLy88IG51bWJlciBvZiBtZW1iZXJzCisgIHN0cnVjdCBtZW1iZXIqCW1lbWJlcjsJCS8vLzwgcG9pbnRlciB0byBtZW1iZXIgYXJyYXkKKy8vIEMrKyBmdW5jdGlvbiBtZW1iZXJzLCBub3QgYXZhaWxhYmxlIGluIEMgKHdoZW4gdXNpbmcgc3Rkc29hcDIgLWMpCitwdWJsaWM6CisgIHR5cGVkZWYgX3N0cnVjdF9pdGVyYXRvciBpdGVyYXRvcjsKKyAgCQkJX3N0cnVjdCgpOworICAJCQlfc3RydWN0KHN0cnVjdCBzb2FwKik7CisgIAkJCV9zdHJ1Y3Qoc3RydWN0IHNvYXAqLCBpbnQpOworICBleHRlcm4gYm9vbAkJZW1wdHkoKSBjb25zdDsJLy8vPCB0cnVlIHdoZW4gc3RydWN0IGlzIGVtcHR5CisgIGludAkJCXNpemUoKSBjb25zdDsJLy8vPCBudW1iZXIgb2YgYWNjZXNzb3JzIGluIHN0cnVjdAorICBzdHJ1Y3QgdmFsdWUmCQlvcGVyYXRvcltdKGNvbnN0IGNoYXIqKTsvLy88IHN0cnVjdCBhY2Nlc3NvciBpbmRleAorICBfc3RydWN0X2l0ZXJhdG9yCWJlZ2luKCk7CS8vLzwgc3RydWN0IGFjY2Vzc29yIGl0ZXJhdG9yIGJlZ2luCisgIF9zdHJ1Y3RfaXRlcmF0b3IJZW5kKCk7CQkvLy88IHN0cnVjdCBhY2Nlc3NvciBpdGVyYXRvciBlbmQKKyAgc3RydWN0IHNvYXAqCQlzb2FwOwkJLy8vPCByZWYgdG8gc29hcCBzdHJ1Y3QgdGhhdCBtYW5hZ2VzIHRoaXMgdHlwZQorfTsKKworLy8vIDxkYXRhPiBlbGVtZW50CisKK3N0cnVjdCBkYXRhCit7IGludAkJCV9fc2l6ZTsJCS8vLzwgbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzCisgIHN0cnVjdCB2YWx1ZSoJCXZhbHVlOwkJLy8vPCBwb2ludGVyIHRvIGFycmF5IGVsZW1lbnRzCit9OworCisvLy8gPGFycmF5PiBlbGVtZW50CisKK3N0cnVjdCBfYXJyYXkKK3sgc3RydWN0IGRhdGEJCWRhdGE7CQkvLy88IGRhdGEgd2l0aCB2YWx1ZXMKKy8vIEMrKyBmdW5jdGlvbiBtZW1iZXJzLCBub3QgYXZhaWxhYmxlIGluIEMgKHdoZW4gdXNpbmcgc3Rkc29hcDIgLWMpCitwdWJsaWM6CisgIHR5cGVkZWYgX2FycmF5X2l0ZXJhdG9yIGl0ZXJhdG9yOworICAJCQlfYXJyYXkoKTsKKyAgCQkJX2FycmF5KHN0cnVjdCBzb2FwKik7CisgIAkJCV9hcnJheShzdHJ1Y3Qgc29hcCosIGludCk7CisgIGV4dGVybiBib29sCQllbXB0eSgpIGNvbnN0OwkvLy88IHRydWUgd2hlbiBhcnJheSBpcyBlbXB0eQorICBpbnQJCQlzaXplKCkgY29uc3Q7CS8vLzwgbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzCisgIHN0cnVjdCB2YWx1ZSYJCW9wZXJhdG9yW10oaW50KTsvLy88IGFycmF5IGluZGV4CisgIF9hcnJheV9pdGVyYXRvcgliZWdpbigpOwkvLy88IGFycmF5IGl0ZXJhdG9yIGJlZ2luCisgIF9hcnJheV9pdGVyYXRvcgllbmQoKTsJCS8vLzwgYXJyYXkgaXRlcmF0b3IgZW5kCisgIHN0cnVjdCBzb2FwKgkJc29hcDsJCS8vLzwgcmVmIHRvIHNvYXAgc3RydWN0IHRoYXQgbWFuYWdlcyB0aGlzIHR5cGUKK307CisKKy8vLyA8dmFsdWU+CisKKy8qKgorVGhlIHZhbHVlIGVsZW1lbnQgY29udGFpbnMgZWl0aGVyIHN0cmluZyBkYXRhIHN0b3JlZCBpbiBfX2FueSBvciBhbiBvdGhlciB0eXBlCitvZiBkYXRhIHN0b3JlZCBpbiBhIHN1YmVsZW1lbnQuIEluIGNhc2Ugb2YgYSBzdWJlbGVtZW50LCB0aGUgX190eXBlIG1lbWJlcgoraW5kaWNhdGVzIHRoZSB0eXBlIG9mIGRhdGEgcG9pbnRlZCB0byBieSB0aGUgcmVmIG1lbWJlci4gRm9yIGV4YW1wbGUsIHdoZW4KK19fdHlwZSA9IFNPQVBfVFlQRV9faW50IHRoZW4gKihpbnQqKXJlZiBpcyBhbiBpbnRlZ2VyIGFuZCB3aGVuIF9fdHlwZSA9CitTT0FQX1RZUEVfX3N0cmluZyAoY2hhciopcmVmIGlzIGEgc3RyaW5nLgorKi8KK3N0cnVjdCB2YWx1ZQoreyBpbnQJCQlfX3R5cGUgMDsJLy8vPCBvcHRpb25hbCBTT0FQX1RZUEVfWCwgd2hlcmUgWCBpcyBhIHR5cGUgbmFtZQorICB2b2lkKgkJCXJlZjsJCS8vLzwgcmVmIHRvIGRhdGEKKyAgY2hhcioJCQlfX2FueTsJCS8vLzwgPHZhbHVlPiBzdHJpbmcgY29udGVudCwgd2hlbiBwcmVzZW50CisvLyBDKysgZnVuY3Rpb24gbWVtYmVycywgbm90IGF2YWlsYWJsZSBpbiBDICh3aGVuIHVzaW5nIHN0ZHNvYXAyIC1jKQorcHVibGljOgorCQkJdmFsdWUoKTsKKwkJCXZhbHVlKHN0cnVjdCBzb2FwKik7CisJCQl2YWx1ZShzdHJ1Y3Qgc29hcCosIHN0cnVjdCBfYXJyYXkmKTsKKwkJCXZhbHVlKHN0cnVjdCBzb2FwKiwgc3RydWN0IF9iYXNlNjQmKTsKKwkJCXZhbHVlKHN0cnVjdCBzb2FwKiwgYm9vbCk7CisJCQl2YWx1ZShzdHJ1Y3Qgc29hcCosIGNoYXIqKTsKKwkJCXZhbHVlKHN0cnVjdCBzb2FwKiwgZG91YmxlKTsKKwkJCXZhbHVlKHN0cnVjdCBzb2FwKiwgaW50KTsKKwkJCXZhbHVlKHN0cnVjdCBzb2FwKiwgc3RydWN0IF9zdHJ1Y3QmKTsKKwkJCW9wZXJhdG9yIHN0cnVjdCBfYXJyYXkmKCk7CisJCQlvcGVyYXRvciBjb25zdCBzdHJ1Y3QgX2FycmF5JigpIGNvbnN0OworCQkJb3BlcmF0b3Igc3RydWN0IF9iYXNlNjQmKCk7CisJCQlvcGVyYXRvciBjb25zdCBzdHJ1Y3QgX2Jhc2U2NCYoKSBjb25zdDsKKwkJCW9wZXJhdG9yIGNoYXIqKCk7CisJCQlvcGVyYXRvciBjb25zdCBjaGFyKigpIGNvbnN0OworCQkJb3BlcmF0b3IgZG91YmxlKCkgY29uc3Q7CisJCQlvcGVyYXRvciBpbnQoKSBjb25zdDsKKwkJCW9wZXJhdG9yIHN0cnVjdCBfc3RydWN0JigpOworCQkJb3BlcmF0b3IgY29uc3Qgc3RydWN0IF9zdHJ1Y3QmKCkgY29uc3Q7CisgIHN0cnVjdCB2YWx1ZSYJCW9wZXJhdG9yW10oaW50KTsKKyAgc3RydWN0IHZhbHVlJgkJb3BlcmF0b3JbXShjb25zdCBjaGFyKik7CisgIHN0cnVjdCBfYXJyYXkmCW9wZXJhdG9yPShzdHJ1Y3QgX2FycmF5Jik7CisgIHN0cnVjdCBfYmFzZTY0JglvcGVyYXRvcj0oc3RydWN0IF9iYXNlNjQmKTsKKyAgZXh0ZXJuIGJvb2wJCW9wZXJhdG9yPShib29sKTsKKyAgY2hhcioJCQlvcGVyYXRvcj0oY2hhciopOworICBkb3VibGUJCW9wZXJhdG9yPShkb3VibGUpOworICBpbnQJCQlvcGVyYXRvcj0oaW50KTsKKyAgc3RydWN0IF9zdHJ1Y3QmCW9wZXJhdG9yPShzdHJ1Y3QgX3N0cnVjdCYpOworICB0aW1lX3QJCW9wZXJhdG9yPSh0aW1lX3QpOworICBleHRlcm4gYm9vbAkJaXNfYXJyYXkoKSBjb25zdDsJLy8vPCB0cnVlIGlmIHZhbHVlIGlzIGFycmF5IHR5cGUKKyAgZXh0ZXJuIGJvb2wJCWlzX2Jhc2U2NCgpIGNvbnN0OwkvLy88IHRydWUgaWYgdmFsdWUgaXMgYmFzZTY0IHR5cGUKKyAgZXh0ZXJuIGJvb2wJCWlzX2Jvb2woKSBjb25zdDsJLy8vPCB0cnVlIGlmIHZhbHVlIGlzIGJvb2xlYW4gdHlwZQorICBleHRlcm4gYm9vbAkJaXNfZG91YmxlKCkgY29uc3Q7CS8vLzwgdHJ1ZSBpZiB2YWx1ZSBpcyBkb3VibGUgdHlwZQorICBleHRlcm4gYm9vbAkJaXNfZmFsc2UoKSBjb25zdDsJLy8vPCB0cnVlIGlmIHZhbHVlIGlzIGJvb2xlYW4gZmFsc2UKKyAgZXh0ZXJuIGJvb2wJCWlzX2ludCgpIGNvbnN0OwkJLy8vPCB0cnVlIGlmIHZhbHVlIGlzIGludCB0eXBlCisgIGV4dGVybiBib29sCQlpc19zdHJpbmcoKSBjb25zdDsJLy8vPCB0cnVlIGlmIHZhbHVlIGlzIHN0cmluZyB0eXBlCisgIGV4dGVybiBib29sCQlpc19zdHJ1Y3QoKSBjb25zdDsJLy8vPCB0cnVlIGlmIHZhbHVlIGlzIHN0cnVjdCB0eXBlCisgIGV4dGVybiBib29sCQlpc190cnVlKCkgY29uc3Q7CS8vLzwgdHJ1ZSBpZiB2YWx1ZSBpcyBib29sZWFuIHRydWUKKyAgc3RydWN0IHNvYXAqCQlzb2FwOwkJLy8vPCByZWYgdG8gc29hcCBzdHJ1Y3QgdGhhdCBtYW5hZ2VzIHRoaXMgdHlwZQorfTsKKworLy8vIDxtZW1iZXI+CisKK3N0cnVjdCBtZW1iZXIKK3sgY2hhcioJCQluYW1lOwkJLy8vPCBzdHJ1Y3QgYWNjZXNzb3IgbmFtZQorICBzdHJ1Y3QgdmFsdWUJCXZhbHVlOwkJLy8vPCBzdHJ1Y3QgYWNjZXNzb3IgdmFsdWUKK307CisKKy8vLyA8cGFyYW1zPgorCitzdHJ1Y3QgcGFyYW1zCit7IGludAkJCV9fc2l6ZTsJCS8vLzwgbnVtYmVyIG9mIHBhcmFtZXRlcnMKKyAgc3RydWN0IHBhcmFtKgkJcGFyYW07CQkvLy88IHBvaW50ZXIgdG8gYXJyYXkgb2YgcGFyYW1ldGVycworLy8gQysrIGZ1bmN0aW9uIG1lbWJlcnMsIG5vdCBhdmFpbGFibGUgaW4gQyAod2hlbiB1c2luZyBzdGRzb2FwMiAtYykKK3B1YmxpYzoKKyAgdHlwZWRlZiBwYXJhbXNfaXRlcmF0b3IgaXRlcmF0b3I7CisgIAkJCXBhcmFtcygpOworICAJCQlwYXJhbXMoc3RydWN0IHNvYXAqKTsKKyAgCQkJcGFyYW1zKHN0cnVjdCBzb2FwKiwgaW50KTsKKyAgZXh0ZXJuIGJvb2wJCWVtcHR5KCkgY29uc3Q7CS8vLzwgdHJ1ZSBpZiBubyBwYXJhbWV0ZXJzCisgIGludAkJCXNpemUoKSBjb25zdDsJLy8vPCBudW1iZXIgb2YgcGFyYW1ldGVycworICBzdHJ1Y3QgdmFsdWUmCQlvcGVyYXRvcltdKGludCk7Ly8vPCBwYXJhbWV0ZXIgaW5kZXgKKyAgcGFyYW1zX2l0ZXJhdG9yCWJlZ2luKCk7CS8vLzwgc3RydWN0IGFjY2Vzc29yIGl0ZXJhdG9yIGJlZ2luCisgIHBhcmFtc19pdGVyYXRvcgllbmQoKTsJCS8vLzwgc3RydWN0IGFjY2Vzc29yIGl0ZXJhdG9yIGVuZAorICBzdHJ1Y3Qgc29hcCoJCXNvYXA7CQkvLy88IHJlZiB0byBzb2FwIHN0cnVjdCB0aGF0IG1hbmFnZXMgdGhpcyB0eXBlCit9OworCisvLy8gPHBhcmFtPgorCitzdHJ1Y3QgcGFyYW0KK3sgc3RydWN0IHZhbHVlCQl2YWx1ZTsJCS8vLzwgcGFyYW1ldGVyIHZhbHVlCisvLyBDKysgZnVuY3Rpb24gbWVtYmVycywgbm90IGF2YWlsYWJsZSBpbiBDICh3aGVuIHVzaW5nIHN0ZHNvYXAyIC1jKQorcHVibGljOgorICBzdHJ1Y3Qgc29hcCoJCXNvYXA7CQkvLy88IHJlZiB0byBzb2FwIHN0cnVjdCB0aGF0IG1hbmFnZXMgdGhpcyB0eXBlCit9OworCisvLy8gPG1ldGhvZFJlc3BvbnNlPgorIAorc3RydWN0IG1ldGhvZFJlc3BvbnNlCit7IHN0cnVjdCBwYXJhbXMqCXBhcmFtczsJCS8vLzwgcmVzcG9uc2UgcGFyYW1ldGVycworICBzdHJ1Y3QgZmF1bHQqCQlmYXVsdDsJCS8vLzwgcmVzcG9uc2UgZmF1bHQKK3B1YmxpYzoKKyAgCQkJbWV0aG9kUmVzcG9uc2UoKTsKKyAgCQkJbWV0aG9kUmVzcG9uc2Uoc3RydWN0IHNvYXAqKTsKKyAgc3RydWN0IHNvYXAqCQlzb2FwOwkJLy8vPCByZWYgdG8gc29hcCBzdHJ1Y3QgdGhhdCBtYW5hZ2VzIHRoaXMgdHlwZQorfTsKKyAgCisvLy8gPG1ldGhvZENhbGw+CisKK3N0cnVjdCBtZXRob2RDYWxsCit7IGNoYXIqCQkJbWV0aG9kTmFtZTsJLy8vPCBuYW1lIG9mIHRoZSBtZXRob2QKKyAgc3RydWN0IHBhcmFtcwkJcGFyYW1zOwkJLy8vPCBtZXRob2QgcmVxdWVzdCBwYXJhbWV0ZXJzCisvLyBDKysgZnVuY3Rpb24gbWVtYmVycywgbm90IGF2YWlsYWJsZSBpbiBDICh3aGVuIHVzaW5nIHN0ZHNvYXAyIC1jKQorcHJpdmF0ZToKKyAgY2hhcioJCQltZXRob2RFbmRwb2ludDsJLy8vPCBYTUwtUlBDIGVuZHBvaW50CisgIHN0cnVjdCBtZXRob2RSZXNwb25zZSptZXRob2RSZXNwb25zZTsgLy8vPCBob2xkcyB0aGUgcmVzcG9uc2UgYWZ0ZXIgdGhlIGNhbGwKK3B1YmxpYzoKKyAgCQkJbWV0aG9kQ2FsbCgpOworICAJCQltZXRob2RDYWxsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKyAgc3RydWN0IHZhbHVlJgkJb3BlcmF0b3JbXShpbnQpOy8vLzwgbWV0aG9kIHBhcmFtZXRlciBhY2Nlc3NvciBpbmRleAorICBzdHJ1Y3QgcGFyYW1zJglvcGVyYXRvcigpKCk7CS8vLzwgbWV0aG9kIGludm9jYXRpb24KKyAgc3RydWN0IHBhcmFtcyYJb3BlcmF0b3IoKShjb25zdCBzdHJ1Y3QgcGFyYW1zJik7CisgIAkJCQkJLy8vPCBtZXRob2QgaW52b2NhdGlvbiB3aXRoIHBhcmFtIGxpc3QKKyAgc3RydWN0IHBhcmFtcyYJcmVzcG9uc2UoKTsJLy8vPCBnZXQgbGFzdCByZXNwb25zZQorICBzdHJ1Y3QgdmFsdWUmCQlmYXVsdCgpOwkvLy88IGZhdWx0IHZhbHVlCisgIGludAkJCWVycm9yKCkgY29uc3Q7CS8vLzwgZ1NPQVAgZXJyb3IgY29kZQorICBzdHJ1Y3Qgc29hcCoJCXNvYXA7CQkvLy88IHJlZiB0byBzb2FwIHN0cnVjdCB0aGF0IG1hbmFnZXMgdGhpcyB0eXBlCit9OworCisvLy8gPGZhdWx0PgorCitzdHJ1Y3QgZmF1bHQKK3sgc3RydWN0IHZhbHVlCQl2YWx1ZTsJCS8vLzwgdmFsdWUgb2YgdGhlIGZhdWx0Cit9OwpkaWZmIC0tZ2l0IGEvc29hcGNwcDIgYi9zb2FwY3BwMgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YWU3MDgwCi0tLSAvZGV2L251bGwKKysrIGIvc29hcGNwcDIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc29hcGNwcDIuZXhlIGIvc29hcGNwcDIuZXhlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ3Y2U4NjIKLS0tIC9kZXYvbnVsbAorKysgYi9zb2FwY3BwMi5leGUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc29hcGNwcDJfbWFjIGIvc29hcGNwcDJfbWFjCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmEzNGI3ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zb2FwY3BwMl9tYWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL01ha2VmaWxlIGIvc3JjL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZTc5MjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvTWFrZWZpbGUKQEAgLTAsMCArMSwyNCBAQAorQ0M9Z2NjCitDUFA9ZysrCitMSUJTPS91c3IvbGliL2xpYmwuYQorQ09GTEFHUz0tTzEKKyNDT0ZMQUdTPS1nIC1EREVCVUcKK0NXRkxBR1M9CitDSUZMQUdTPQorQ01GTEFHUz0KK0NGTEFHUz0gJChDV0ZMQUdTKSAkKENPRkxBR1MpICQoQ0lGTEFHUykgJChDTUZMQUdTKQorc29hcGNwcDI6CXNvYXBjcHAyLmggc29hcGNwcDJfeWFjYy5vIHN5bWJvbDIubyBlcnJvcjIubyBsZXgueXkubyBpbml0Mi5vIHNvYXBjcHAyLm8KKwkJJChDQykgJChDRkxBR1MpIHN5bWJvbDIubyBlcnJvcjIubyBzb2FwY3BwMl95YWNjLm8gbGV4Lnl5Lm8gaW5pdDIubyBzb2FwY3BwMi5vICQoTElCUykgLW8gJEAKKwkJY3Agc29hcGNwcDIgLi4vCitzb2FwY3BwMl95YWNjLmM6CXNvYXBjcHAyX3lhY2MueSBzb2FwY3BwMi5oIGVycm9yMi5oCisJCWJpc29uIC1kIC12IHNvYXBjcHAyX3lhY2MueQorCQltdiAtZiBzb2FwY3BwMl95YWNjLnRhYi5oIHNvYXBjcHAyX3lhY2MuaAorCQltdiAtZiBzb2FwY3BwMl95YWNjLnRhYi5jIHNvYXBjcHAyX3lhY2MuYworbGV4Lnl5LmM6CXNvYXBjcHAyX3lhY2MuaCBzb2FwY3BwMl95YWNjLmMgc29hcGNwcDJfbGV4LmwKKwkJZmxleCAtbCBzb2FwY3BwMl9sZXgubAorLmMubzoJCXNvYXBjcHAyLmggc29hcGNwcDJfeWFjYy5oIGVycm9yMi5oCisJCSQoQ0MpICQoQ0ZMQUdTKSAtRFdJVEhfQklTT04gLURXSVRIX0ZMRVggLWMgJDwKK2NsZWFuOgkJCisJCXJtIC1mICoubworZGlzdGNsZWFuOgkJCisJCXJtIC1mIHNvYXBjcHAyICoubyBsZXgueXkuKiBzb2FwY3BwMl95YWNjLmggc29hcGNwcDJfeWFjYy5jIHkudGFiLiogKi5vdXRwdXQgc29hcGNwcDIgLi4vc29hcGNwcDIKZGlmZiAtLWdpdCBhL3NyYy9NYWtlZmlsZU1hY09TWCBiL3NyYy9NYWtlZmlsZU1hY09TWApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGU0NGZiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL01ha2VmaWxlTWFjT1NYCkBAIC0wLDAgKzEsMjMgQEAKK0NDPWdjYworQ1BQPWcrKworTElCUz0vdXNyL2xpYi9saWJsLmEKK0NPRkxBR1M9LU8xCisjQ09GTEFHUz0tZyAtRERFQlVHCitDV0ZMQUdTPS1hcmNoIGkzODYgLWFyY2ggcHBjCitDSUZMQUdTPQorQ01GTEFHUz0KK0NGTEFHUz0gJChDV0ZMQUdTKSAkKENPRkxBR1MpICQoQ0lGTEFHUykgJChDTUZMQUdTKQorc29hcGNwcDI6CXNvYXBjcHAyLmggc29hcGNwcDJfeWFjYy5vIHN5bWJvbDIubyBlcnJvcjIubyBsZXgueXkubyBpbml0Mi5vIHNvYXBjcHAyLm8KKwkJJChDQykgJChDRkxBR1MpIHN5bWJvbDIubyBlcnJvcjIubyBzb2FwY3BwMl95YWNjLm8gbGV4Lnl5Lm8gaW5pdDIubyBzb2FwY3BwMi5vICQoTElCUykgLW8gJEAKK3NvYXBjcHAyX3lhY2MuYzoJc29hcGNwcDJfeWFjYy55IHNvYXBjcHAyLmggZXJyb3IyLmgKKwkJYmlzb24gLWQgLXYgc29hcGNwcDJfeWFjYy55CisJCW12IC1mIHNvYXBjcHAyX3lhY2MudGFiLmggc29hcGNwcDJfeWFjYy5oCisJCW12IC1mIHNvYXBjcHAyX3lhY2MudGFiLmMgc29hcGNwcDJfeWFjYy5jCitsZXgueXkuYzoJc29hcGNwcDJfeWFjYy5oIHNvYXBjcHAyX3lhY2MuYyBzb2FwY3BwMl9sZXgubAorCQlmbGV4IC1sIHNvYXBjcHAyX2xleC5sCisuYy5vOgkJc29hcGNwcDIuaCBzb2FwY3BwMl95YWNjLmggZXJyb3IyLmgKKwkJJChDQykgJChDRkxBR1MpIC1EV0lUSF9CSVNPTiAtRFdJVEhfRkxFWCAtYyAkPAorY2xlYW46CQkKKwkJcm0gLWYgKi5vCitkaXN0Y2xlYW46CQkKKwkJcm0gLWYgc29hcGNwcDIgKi5vIGxleC55eS4qIHNvYXBjcHAyX3lhY2MuaCBzb2FwY3BwMl95YWNjLmMgeS50YWIuKiAqLm91dHB1dCBzb2FwY3BwMgpkaWZmIC0tZ2l0IGEvc3JjL1JFQURNRS50eHQgYi9zcmMvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODM2NDEzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL1JFQURNRS50eHQKQEAgLTAsMCArMSwzMiBAQAorVGhlIHNvYXBjcHAyIGNvbXBpbGVyIHNvdXJjZSBkaXN0cmlidXRpb24gY29udGFpbnMgdGhlIGZvbGxvd2luZyBmaWxlczoKKworUkVBRE1FLnR4dAlUaGlzIGZpbGUKK01ha2VmaWxlCVVuaXgvbGludXggbWFrZWZpbGUKK01ha2VmaWxlTWFjT1NYCU1hYyBPUyBYIE1ha2VmaWxlCitzb2FwY3BwMi5oCU1haW4gaGVhZGVyIGZpbGUKK3NvYXBjcHAyLmMJTWFpbiBhcHBsaWNhdGlvbgorc3ltYm9sMi5jCVN5bWJvbCB0YWJsZSBoYW5kbGluZyBhbmQgY29kZSBnZW5lcmF0aW9uIG1vZHVsZQorZXJyb3IyLmgJSGVhZGVyIGZpbGUgZm9yIGVycm9yMi5jCitlcnJvcjIuYwlFcnJvciBoYW5kbGluZyByb3V0aW5lcworaW5pdDIuYwkJQ29tcGlsZXIgc3ltYm9sIHRhYmxlIGluaXRpYWxpemF0aW9uCitzb2FwY3BwMl9sZXgubAlGbGV4L0xleCB0b2tlbnMKK3NvYXBjcHAyX3lhY2MueQlZYWNjL0Jpc29uIGdyYW1tYXIKKworCitCVUlMRCBOT1RFUworCitRTlgKKz09PQorCitPbiBRTlggdGhlIGJpc29uLnNpbXBsZSBmaWxlIGlzIGxvY2F0ZWQgaW4gJFFOWF9IT1NUL3Vzci9zaGFyZS9iaXNvbi5zaW1wbGUKK1VwZGF0ZSB5b3VyIC5wcm9maWxlIHRvIGluY2x1ZGU6CisKK2V4cG9ydCBCSVNPTl9TSU1QTEU9JFFOWF9IT1NUL3Vzci9zaGFyZS9iaXNvbi9iaXNvbi5zaW1wbGUgCitleHBvcnQgQklTT05fSEFJUlk9JFFOWF9IT1NUL3Vzci9zaGFyZS9iaXNvbi9iaXNvbi5oYWlyeSAKKworV0lOMzIKKz09PT09CisKK0Jpc29uIDEuNiBjYW4gY3Jhc2ggb24gV2luMzIgc3lzdGVtcyBpZiBZWUlOSVRERVBUSCBpcyB0b28gc21hbGwgQ29tcGlsZSB3aXRoCisvRFlZSU5JVERFUFRIPTEwMDAKKwpkaWZmIC0tZ2l0IGEvc3JjL2Vycm9yMi5jIGIvc3JjL2Vycm9yMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMWEwNTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZXJyb3IyLmMKQEAgLTAsMCArMSwxNTggQEAKKy8qCisKK2Vycm9yMi5jCisKK0Vycm9yIGhhbmRsaW5nLgorCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgcGFydCBvZiB0aGUgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXM6CitHUEwsIHRoZSBnU09BUCBwdWJsaWMgbGljZW5zZSwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIHB1YmxpYyBsaWNlbnNlLgorCitUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBnU09BUCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMworKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCitMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK2h0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9zb2FwbGljZW5zZS5odG1sCitTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAorV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCitmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLgorQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLCBHZW5pdmlhIGluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaW5jbHVkZSAic29hcGNwcDIuaCIKKyNpbmNsdWRlICJzb2FwY3BwMl95YWNjLmgiCisKKyNkZWZpbmUJTUFYRVJSIDEwCisKK2V4dGVybiBjaGFyIHl5dGV4dFtdOwkvKiBsZXhlbWUgZm91bmQgYnkgdGhlIGxleGljYWwgYW5hbHl6ZXIgKi8KKworc3RhdGljIGludCBsZXhlcnJubyA9IDA7CitzdGF0aWMgaW50IHN5bmVycm5vID0gMDsKK3N0YXRpYyBpbnQgc2VtZXJybm8gPSAwOworc3RhdGljIGludCBzZW13YXJubyA9IDA7CisKK2NoYXIgZXJyYnVmWzEwMjRdOwkvKiB0byBob2xkIGVycm9yIG1lc3NhZ2VzICovCisKKy8qCit5eWVycm9yIC0gY2FsbGVkIGJ5IHBhcnNlciBmcm9tIGFuIGVycm9yIHByb2R1Y3Rpb24gd2l0aCBub250ZXJtaW5hbCBgZXJyb3InCisqLworeXllcnJvcihjaGFyICpzKQorewlmcHJpbnRmKHN0ZGVyciwgIiVzKCVkKTogJXNcbiIsIGZpbGVuYW1lLCB5eWxpbmVubywgcyk7Cit9CisKKy8qCitsZXhlcnJvciAtIGNhbGxlZCBieSBsZXhpY2FsIGFuYWx5emVyIHVwb24gZmFpbHVyZSB0byByZWNvZ25pemUgYSB0b2tlbgorKi8KK2xleGVycm9yKGNvbnN0IGNoYXIgKnMpCit7CWZwcmludGYoc3RkZXJyLCAiJXMoJWQpOiAlczogJXNcbiIsIGZpbGVuYW1lLCB5eWxpbmVubywgcywgeXl0ZXh0KTsKKwlpZiAobGV4ZXJybm8rKyA+PSBNQVhFUlIpCisJCWV4ZWNlcnJvcigidG9vIG1hbnkgc3ludGFjdGljIGVycm9ycywgYmFpbGluZyBvdXQiKTsKK30KKworLyoKK3N5bmVycm9yIC0gY2FsbGVkIGJ5IGEgc2VtYW50aWMgYWN0aW9uIGluIHRoZSB5YWNjIGdyYW1tYXIKKyovCitzeW5lcnJvcihjb25zdCBjaGFyICpzKQorewlmcHJpbnRmKHN0ZGVyciwgIiVzKCVkKTogU3ludGF4IGVycm9yOiAlc1xuIiwgZmlsZW5hbWUsIHl5bGluZW5vLTEsIHMpOworCWlmIChzeW5lcnJubysrID49IE1BWEVSUikKKwkJZXhlY2Vycm9yKCJ0b28gbWFueSBzeW50YWN0aWMgZXJyb3JzLCBiYWlsaW5nIG91dCIpOworfQorCisvKgorc2VtZXJyb3IgLSByZXBvcnQgc2VtYW50aWMgZXJyb3IgZnJvbSBzdGF0aWMgY2hlY2tpbmcKKyovCitzZW1lcnJvcihjb25zdCBjaGFyICpzKQorewlmcHJpbnRmKHN0ZGVyciwgIlxuJXMoJWQpOiAqKkVSUk9SKio6ICVzXG5cbiIsIGZpbGVuYW1lLCB5eWxpbmVubywgcyk7CisJaWYgKHNlbWVycm5vKysgPj0gTUFYRVJSKQorCQlleGVjZXJyb3IoInRvbyBtYW55IHNlbWFudGljIGVycm9ycywgYmFpbGluZyBvdXQiKTsKK30KKworLyoKK3NlbXdhcm4gLSByZXBvcnQgc2VtYW50aWMgd2FybmluZyBmcm9tIHN0YXRpYyBjaGVja2luZworKi8KK3NlbXdhcm4oY29uc3QgY2hhciAqcykKK3sJZnByaW50ZihzdGRlcnIsICJcbioqV0FSTklORyoqOiAlcyAoZGV0ZWN0ZWQgYXQgbGluZSAlZCBpbiAlcylcblxuIiwgcywgeXlsaW5lbm8sIGZpbGVuYW1lKTsKKwlzZW13YXJubysrOworfQorCisvKgorY29tcGxpYW5jZXdhcm4gLSByZXBvcnQgY29tcGxpYW5jZSB3YXJuaW5nCisqLworY29tcGxpYW5jZXdhcm4oY29uc3QgY2hhciAqcykKK3sJZnByaW50ZihzdGRlcnIsICJDb21wbGlhbmNlIHdhcm5pbmc6ICVzXG4iLCBzKTsKK30KKworLyoKK3R5cGVycm9yIC0gcmVwb3J0IHR5cGUgZXJyb3IgKGEgc2VtYW50aWMgZXJyb3IpCisqLwordHlwZXJyb3IoY29uc3QgY2hhciAqcykKK3sJZnByaW50ZihzdGRlcnIsICIlcyglZCk6IFR5cGUgZXJyb3I6ICVzXG4iLCBmaWxlbmFtZSwgeXlsaW5lbm8sIHMpOworCWlmIChzZW1lcnJubysrID49IE1BWEVSUikKKwkJZXhlY2Vycm9yKCJ0b28gbWFueSBzZW1hbnRpYyBlcnJvcnMsIGJhaWxpbmcgb3V0Iik7Cit9CisKKy8qCitleGVjZXJyb3IgLSBwcmludCBlcnJvciBtZXNzYWdlIGFuZCB0ZXJtaW5hdGUgZXhlY3V0aW9uCisqLworZXhlY2Vycm9yKGNvbnN0IGNoYXIgKnMpCit7CWZwcmludGYoc3RkZXJyLCAiQ3JpdGljYWwgZXJyb3I6ICVzXG4iLCBzKTsKKwlleGl0KDEpOworfQorCisvKgorcHJvZ2Vycm9yIC0gY2FsbGVkIHdoZW4gY2hlY2soZXhwcikgZmFpbGVkLCBpLmUuIHVwb24gcHJvZ3JhbW1pbmcgZXJyb3IKKyovCitwcm9nZXJyb3IoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqZiwgaW50IGwpCit7CWZwcmludGYoc3RkZXJyLCAiUHJvZ3JhbSBmYWlsdXJlOiAlcyBpbiBmaWxlICVzIGxpbmUgJWRcbiIsIHMsIGYsIGwpOworCWV4aXQoMSk7Cit9CisKKy8qCitlcnJzdGF0IC0gc2hvdyBlcnJvciBzdGF0aXN0aWNzCisqLworaW50IGVycnN0YXQoKQorewlpZiAoIWxleGVycm5vICYmICFzeW5lcnJubyAmJiAhc2VtZXJybm8pCisJewlmcHJpbnRmKHN0ZGVyciwgIlxuQ29tcGlsYXRpb24gc3VjY2Vzc2Z1bCAiKTsKKwkJaWYgKHNlbXdhcm5vKQorCQkJZnByaW50ZihzdGRlcnIsICIoJWQgd2FybmluZyVzKVxuXG4iLCBzZW13YXJubywgc2Vtd2Fybm8+MT8icyI6IiIpOworCQllbHNlCisJCQlmcHJpbnRmKHN0ZGVyciwgIlxuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWZwcmludGYoc3RkZXJyLCAiXG5UaGVyZSB3ZXJlIGVycm9yczpcbiIpOworCWlmIChsZXhlcnJubykKKwkJZnByaW50ZihzdGRlcnIsICIlZCBsZXhpY2FsIGVycm9yJXNcbiIsIGxleGVycm5vLCBsZXhlcnJubz4xPyJzIjoiIik7CisJaWYgKHN5bmVycm5vKQorCQlmcHJpbnRmKHN0ZGVyciwgIiVkIHN5bnRheCBlcnJvciVzXG4iLCBzeW5lcnJubywgc3luZXJybm8+MT8icyI6IiIpOworCWlmIChzZW1lcnJubykKKwkJZnByaW50ZihzdGRlcnIsICIlZCBzZW1hbnRpYyBlcnJvciVzXG4iLCBzZW1lcnJubywgc2VtZXJybm8+MT8icyI6IiIpOworCWlmIChzZW13YXJubykKKwkJZnByaW50ZihzdGRlcnIsICIlZCB3YXJuaW5nJXNcbiIsIHNlbXdhcm5vLCBzZW13YXJubz4xPyJzIjoiIik7CisJZnByaW50ZihzdGRlcnIsICJcbiIpOworCXJldHVybiAtMTsKK30KZGlmZiAtLWdpdCBhL3NyYy9lcnJvcjIuaCBiL3NyYy9lcnJvcjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTE0NTc2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2Vycm9yMi5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisKK2Vycm9yMi5oCisKK0Vycm9yIGhhbmRsaW5nLgorCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgcGFydCBvZiB0aGUgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXM6CitHUEwsIHRoZSBnU09BUCBwdWJsaWMgbGljZW5zZSwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIHB1YmxpYyBsaWNlbnNlLgorCitUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBnU09BUCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMworKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCitMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK2h0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9zb2FwbGljZW5zZS5odG1sCitTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAorV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCitmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLgorQ29weXJpZ2h0IChDKSAyMDAwLTIwMDMgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLCBHZW5pdmlhIGluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCitleHRlcm4gY2hhciBlcnJidWZbXTsKKworI2lmZGVmIFdJTjMyCitleHRlcm4gc29hcGNwcDJlcnJvcihjaGFyKik7CisjZWxzZQorZXh0ZXJuIHl5ZXJyb3IoY2hhciopOworI2VuZGlmCisKK2V4dGVybiBsZXhlcnJvcihjb25zdCBjaGFyKik7CitleHRlcm4gc3luZXJyb3IoY29uc3QgY2hhciAqKTsKK2V4dGVybiBzZW1lcnJvcihjb25zdCBjaGFyICopOworZXh0ZXJuIHNlbXdhcm4oY29uc3QgY2hhciAqKTsKK2V4dGVybiBjb21wbGlhbmNld2Fybihjb25zdCBjaGFyICopOworZXh0ZXJuIHR5cGVycm9yKGNvbnN0IGNoYXIqKTsKK2V4dGVybiBleGVjZXJyb3IoY29uc3QgY2hhciopOworZXh0ZXJuIHByb2dlcnJvcihjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGludCk7CitleHRlcm4gZXJyc3RhdCgpOwpkaWZmIC0tZ2l0IGEvc3JjL2luaXQyLmMgYi9zcmMvaW5pdDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2FkZGJkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2luaXQyLmMKQEAgLTAsMCArMSwyMDggQEAKKy8qCisKK2luaXQyLmMKKworU3ltYm9sIHRhYmxlIGluaXRpYWxpemF0aW9uLgorCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgcGFydCBvZiB0aGUgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXM6CitHUEwsIHRoZSBnU09BUCBwdWJsaWMgbGljZW5zZSwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIHB1YmxpYyBsaWNlbnNlLgorCitUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBnU09BUCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMworKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCitMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK2h0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9zb2FwbGljZW5zZS5odG1sCitTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAorV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCitmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLgorQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLCBHZW5pdmlhIGluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaW5jbHVkZSAic29hcGNwcDIuaCIKKyNpbmNsdWRlICJzb2FwY3BwMl95YWNjLmgiCisKK3R5cGVkZWYJc3RydWN0IEtleXdvcmQKK3sgY2hhciAqczsJLyogbmFtZSAqLworICBUb2tlbiB0OwkvKiB0b2tlbiAqLworfSBLZXl3b3JkOworCitzdGF0aWMgS2V5d29yZCBrZXl3b3Jkc1tdID0KK3sJImFzbSIsCQlOT05FLAorCSJhdXRvIiwJCUFVVE8sCisJImJvb2wiLAkJQk9PTCwKKwkiYnJlYWsiLAlCUkVBSywKKwkiY2FzZSIsCQlDQVNFLAorCSJjYXRjaCIsCU5PTkUsCisJImNoYXIiLAkJQ0hBUiwKKwkiY2xhc3MiLAlDTEFTUywKKwkiY29uc3QiLAlDT05TVCwKKwkiY29uc3RfY2FzdCIsCU5PTkUsCisJImNvbnRpbnVlIiwJQ09OVElOVUUsCisJImRlZmF1bHQiLAlERUZBVUxULAorCSJkZWxldGUiLAlOT05FLAorCSJkbyIsCQlETywKKwkiZG91YmxlIiwJRE9VQkxFLAorCSJkeW5hbWljX2Nhc3QiLAlOT05FLAorCSJlbHNlIiwJCUVMU0UsCisJImVudW0iLAkJRU5VTSwKKwkiZXJybm8iLAlOT05FLAorCSJleHBsaWNpdCIsCUVYUExJQ0lULAorCSJleHBvcnQiLAlOT05FLAorCSJleHRlcm4iLAlFWFRFUk4sCisJImZhbHNlIiwJQ0ZBTFNFLAorCSJmbG9hdCIsCUZMT0FULAorCSJmb3IiLAkJRk9SLAorCSJmcmllbmQiLAlGUklFTkQsCisJImdvdG8iLAkJR09UTywKKwkiaWYiLAkJSUYsCisJImlubGluZSIsCUlOTElORSwKKwkiaW50IiwJCUlOVCwKKwkiaW50OF90IiwJQ0hBUiwKKwkiaW50MTZfdCIsCVNIT1JULAorCSJpbnQzMl90IiwJTE9ORywKKwkiaW50NjRfdCIsCUxMT05HLAorCSJsb25nIiwJCUxPTkcsCisJIkxPTkc2NCIsCUxMT05HLAorCSJtdXRhYmxlIiwJTk9ORSwKKwkibmFtZXNwYWNlIiwJTkFNRVNQQUNFLAorCSJuZXciLAkJTk9ORSwKKwkiTlVMTCIsCQludWxsLAorCSJvcGVyYXRvciIsCU9QRVJBVE9SLAorCSJwcml2YXRlIiwJUFJJVkFURSwKKwkicHJvdGVjdGVkIiwJUFJPVEVDVEVELAorCSJwdWJsaWMiLAlQVUJMSUMsCisJInJlZ2lzdGVyIiwJUkVHSVNURVIsCisJInJlaW50ZXJwcmV0X2Nhc3QiLAorCQkJTk9ORSwKKwkicmVzdHJpY3QiLAlOT05FLAorCSJyZXR1cm4iLAlSRVRVUk4sCisJInNob3J0IiwJU0hPUlQsCisJInNpZ25lZCIsCVNJR05FRCwKKwkic2l6ZV90IiwJU0laRSwKKwkic2l6ZW9mIiwJU0laRU9GLAorCSJzdGF0aWMiLAlTVEFUSUMsCisJInN0YXRpY19jYXN0IiwJTk9ORSwKKwkic3RydWN0IiwJU1RSVUNULAorCSJzd2l0Y2giLAlTV0lUQ0gsCisJInRlbXBsYXRlIiwJVEVNUExBVEUsCisJInRoaXMiLAkJTk9ORSwKKwkidGhyb3ciLAlOT05FLAorCSJ0aW1lX3QiLAlUSU1FLAorCSJ0cnVlIiwJCUNUUlVFLAorCSJ0eXBlZGVmIiwJVFlQRURFRiwKKwkidHlwZWlkIiwJTk9ORSwKKwkidHlwZW5hbWUiLAlUWVBFTkFNRSwKKwkiVUxPTkc2NCIsCVVMTE9ORywKKwkidW5pb24iLAlVTklPTiwKKwkidW5zaWduZWQiLAlVTlNJR05FRCwKKwkidXNpbmciLAlVU0lORywKKwkidmlydHVhbCIsCVZJUlRVQUwsCisJInZvaWQiLAkJVk9JRCwKKwkidm9sYXRpbGUiLAlWT0xBVElMRSwKKwkid2NoYXJfdCIsCVdDSEFSLAorCSJ3aGlsZSIsCVdISUxFLAorCisJIm9wZXJhdG9yISIsCU5PTkUsCisJIm9wZXJhdG9yfiIsCU5PTkUsCisJIm9wZXJhdG9yPSIsCU5PTkUsCisJIm9wZXJhdG9yKz0iLAlOT05FLAorCSJvcGVyYXRvci09IiwJTk9ORSwKKwkib3BlcmF0b3IqPSIsCU5PTkUsCisJIm9wZXJhdG9yLz0iLAlOT05FLAorCSJvcGVyYXRvciU9IiwJTk9ORSwKKwkib3BlcmF0b3ImPSIsCU5PTkUsCisJIm9wZXJhdG9yXj0iLAlOT05FLAorCSJvcGVyYXRvcnw9IiwJTk9ORSwKKwkib3BlcmF0b3I8PD0iLAlOT05FLAorCSJvcGVyYXRvcj4+PSIsCU5PTkUsCisJIm9wZXJhdG9yfHwiLAlOT05FLAorCSJvcGVyYXRvciYmIiwJTk9ORSwKKwkib3BlcmF0b3J8IiwJTk9ORSwKKwkib3BlcmF0b3JeIiwJTk9ORSwKKwkib3BlcmF0b3ImIiwJTk9ORSwKKwkib3BlcmF0b3I9PSIsCU5PTkUsCisJIm9wZXJhdG9yIT0iLAlOT05FLAorCSJvcGVyYXRvcjwiLAlOT05FLAorCSJvcGVyYXRvcjw9IiwJTk9ORSwKKwkib3BlcmF0b3I+IiwJTk9ORSwKKwkib3BlcmF0b3I+PSIsCU5PTkUsCisJIm9wZXJhdG9yPDwiLAlOT05FLAorCSJvcGVyYXRvcj4+IiwJTk9ORSwKKwkib3BlcmF0b3IrIiwJTk9ORSwKKwkib3BlcmF0b3ItIiwJTk9ORSwKKwkib3BlcmF0b3IqIiwJTk9ORSwKKwkib3BlcmF0b3IvIiwJTk9ORSwKKwkib3BlcmF0b3IlIiwJTk9ORSwKKwkib3BlcmF0b3IrKyIsCU5PTkUsCisJIm9wZXJhdG9yLS0iLAlOT05FLAorCSJvcGVyYXRvci0+IiwJTk9ORSwKKwkib3BlcmF0b3JbXSIsCU5PTkUsCisJIm9wZXJhdG9yKCkiLAlOT05FLAorCisJIm11c3RVbmRlcnN0YW5kIiwJTVVTVFVOREVSU1RBTkQsCisKKwkiU09BUF9FTlZfX0hlYWRlciIsCUlELAorCSJkdW1teSIsCQlJRCwKKwkic29hcF9oZWFkZXIiLAkJSUQsCisKKwkiU09BUF9FTlZfX0ZhdWx0IiwJSUQsCisJIlNPQVBfRU5WX19Db2RlIiwJSUQsCisJIlNPQVBfRU5WX19TdWJjb2RlIiwJSUQsCisJIlNPQVBfRU5WX19SZWFzb24iLAlJRCwKKwkiU09BUF9FTlZfX1RleHQiLAlJRCwKKwkiU09BUF9FTlZfX0RldGFpbCIsCUlELAorCSJTT0FQX0VOVl9fVmFsdWUiLAlJRCwKKwkiU09BUF9FTlZfX05vZGUiLAlJRCwKKwkiU09BUF9FTlZfX1JvbGUiLAlJRCwKKwkiZmF1bHRjb2RlIiwJCUlELAorCSJmYXVsdHN0cmluZyIsCQlJRCwKKwkiZmF1bHRhY3RvciIsCQlJRCwKKwkiZGV0YWlsIiwJCUlELAorCSJfX3R5cGUiLAkJSUQsCisJImZhdWx0IiwJCUlELAorCSJfX2FueSIsCQlJRCwKKworCSJfUU5hbWUiLAkJVFlQRSwKKwkiX1hNTCIsCQkJVFlQRSwKKwkic3RkOjpzdHJpbmciLAkJVFlQRSwKKwkic3RkOjp3c3RyaW5nIiwJCVRZUEUsCisKKwkiLyo/Ki8iLAkJTk9ORSwKKworCTAsCQkJMAorfTsKKworLyoKK2luaXQgLSBpbml0aWFsaXplIHN5bWJvbCB0YWJsZSB3aXRoIHByZWRlZmluZWQga2V5d29yZHMKKyovCitpbml0KCkKK3sgc3RydWN0IEtleXdvcmQgKms7CisgIGZvciAoayA9IGtleXdvcmRzOyBrLT5zOyBrKyspCisgICAgaW5zdGFsbChrLT5zLCBrLT50KTsKK30KZGlmZiAtLWdpdCBhL3NyYy9zb2FwY3BwMi5jIGIvc3JjL3NvYXBjcHAyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBlZDg1NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zb2FwY3BwMi5jCkBAIC0wLDAgKzEsMjQzIEBACisvKgorCitzb2FwY3BwMi5jCisKK01haW4gY29tcGlsZXIuCisKK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMC0yMDA2LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlczoKK0dQTCwgdGhlIGdTT0FQIHB1YmxpYyBsaWNlbnNlLCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgcHVibGljIGxpY2Vuc2UuCisKK1RoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGdTT0FQIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4zCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKK0xpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoraHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL3NvYXBsaWNlbnNlLmh0bWwKK1NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCitXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKK2ZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK1RoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4uCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNiwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaW5jbHVkZSAic29hcGNwcDIuaCIKKworZXh0ZXJuIGludCBpbml0KCk7CitleHRlcm4gaW50IHl5cGFyc2UoKTsKK2V4dGVybiBGSUxFICp5eWluOworCitGSUxFICpmbXNnOwkJLyogZmQgdG8gZmx1c2ggY29tcGlsZXIgbWVzc2FnZXMgKi8KKworaW50IHZmbGFnID0gMDsJCS8qIFNPQVAgdmVyc2lvbiwgMD1ub3Qgc2V0LCAxPTEuMSwgMj0xLjIgKi8KK2ludCB3ZmxhZyA9IDA7CQkvKiB3aGVuIHNldCwgZG9uJ3QgZ2VuZXJhdGUgV1NETCBhbmQgc2NoZW1hIGZpbGVzICovCitpbnQgQ2ZsYWcgPSAwOwkJLyogd2hlbiBzZXQsIGdlbmVyYXRlIG9ubHkgZmlsZXMgZm9yIGNsaWVudHMgKi8KK2ludCBjZmxhZyA9IDA7CQkvKiB3aGVuIHNldCwgZ2VuZXJhdGUgZmlsZXMgd2l0aCAuYyBleHRlbnNpb24gKi8KK2ludCBhZmxhZyA9IDA7CQkvKiB3aGVuIHNldCwgdXNlIHZhbHVlIG9mIFNPQVAgQWN0aW9uIHRvIGRpc3BhdGNoIG1ldGhvZCBhdCBzZXJ2ZXIgc2lkZSAqLworaW50IGVmbGFnID0gMDsJCS8qIHdoZW4gc2V0LCB1c2UgU09BUCBSUEMgZW5jb2RpbmcgYnkgZGVmYXVsdCAqLworaW50IGlmbGFnID0gMDsJCS8qIHdoZW4gc2V0LCBnZW5lcmF0ZSBuZXcgc3R5bGUgcHJveHkvb2JqZWN0IGNsYXNzZXMgaW5oZXJpdGVkIGZyb20gc29hcCBzdHJ1Y3QgKi8KK2ludCBtZmxhZyA9IDA7CQkvKiB3aGVuIHNldCwgZ2VuZXJhdGUgY29kZSB0aGF0IHJlcXVpcmVzIGFycmF5L2JpbmFyeSBjbGFzc2VzIHRvIGV4cGxpY2l0bHkgcmVtb3ZlIG1hbGxvY2VkIGFycmF5ICovCitpbnQgbmZsYWcgPSAwOwkJLyogd2hlbiBzZXQsIG5hbWVzIHRoZSBuYW1lc3BhY2VzIGdsb2JhbCBzdHJ1Y3QgJyVOQU1FJV9uYW1lc3BhY2VzICovCitpbnQgbGZsYWcgPSAwOwkJLyogd2hlbiBzZXQsIGNyZWF0ZSBsaWJyYXJ5ICovCitpbnQgTGZsYWcgPSAwOwkJLyogd2hlbiBzZXQsIGRvbid0IGdlbmVyYXRlIHNvYXBDbGllbnRMaWIvc29hcFNlcnZlckxpYiAqLworaW50IFNmbGFnID0gMDsJCS8qIHdoZW4gc2V0LCBnZW5lcmF0ZSBvbmx5IGZpbGVzIGZvciBzZXJ2ZXJzICovCitpbnQgdGZsYWcgPSAwOwkJLyogd2hlbiBzZXQsIGdlbmVyYXRlcyB0eXBlZCBtZXNzc2FnZXMgKHdpdGggeHNpOnR5cGUgYXR0cmlidXRlcykgKi8KK2ludCB4ZmxhZyA9IDA7CQkvKiB3aGVuIHNldCwgZXhjbHVkZXMgaW1wb3J0ZWQgdHlwZXMgKi8KKworaW50IHN0b3BfZmxhZyA9IDA7CisKK2NoYXIgZGlycGF0aFsxMDI0XTsJLyogZGlyZWN0b3J5IHBhdGggZm9yIGdlbmVyYXRlZCBzb3VyY2UgZmlsZXMgKi8KK2NoYXIgKnByZWZpeCA9ICJzb2FwIjsJLyogZmlsZSBuYW1lIHByZWZpeCBmb3IgZ2VuZXJhdGVkIHNvdXJjZSBmaWxlcyAqLworY2hhciBmaWxlbmFtZVsxMDI0XTsJLyogY3VycmVudCBmaWxlIG5hbWUgKi8KK2NoYXIgKmltcG9ydHBhdGggPSBOVUxMOy8qIGZpbGUgaW1wb3J0IHBhdGggKi8KKworLyoKK0lNUE9SVEFOVDoKKworVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRvIG5vdCBhbGxvdyBmb3IgdGhlIHJlbW92YWwKK29mIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZyb20gdGhlIG1haW4gcHJvZ3JhbSBmb3IgdmlzdWFsIGRpc3BsYXkuIEZvcgoraW50ZWdyYXRpb25zIHdpdGggb3RoZXIgc29mdHdhcmUsIGEgc2ltaWxhciBjb3B5cmlnaHQgbm90aWNlIG11c3QgYmUgcHJvZHVjZWQKK3RoYXQgaXMgdmlzaWJsZSB0byB1c2VycyBvZiB0aGUgc29mdHdhcmUuCisqLworCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorewlpbnQgaSwgZzsKKwljaGFyICphLCAqczsKKwlmbXNnID0gc3RkZXJyOworCXN0cmNweShmaWxlbmFtZSwgIjxzdGRpbj4iKTsKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQorCXsJYSA9IGFyZ3ZbaV07CisJCWlmICgqYSA9PSAnLScKKyNpZmRlZiBXSU4zMgorCQkgfHwgKmEgPT0gJy8nCisjZW5kaWYKKwkJKQorCQl7CWcgPSAxOworCQkJd2hpbGUgKGcgJiYgKisrYSkKKwkJCQlzd2l0Y2ggKCphKQorCQkJCXsJY2FzZSAnQyc6CisJCQkJCQlDZmxhZyA9IDE7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAnYyc6CisJCQkJCQljZmxhZyA9IDE7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAnZCc6CisJCQkJCQlhKys7CisJCQkJCQlnID0gMDsKKwkJCQkJCWlmICgqYSkKKwkJCQkJCQlzdHJjcHkoZGlycGF0aCwgYSk7CisJCQkJCQllbHNlIGlmIChpIDwgYXJnYyAmJiBhcmd2WysraV0pCisJCQkJCQkJc3RyY3B5KGRpcnBhdGgsIGFyZ3ZbaV0pOworCQkJCQkJZWxzZQorCQkJCQkJCWV4ZWNlcnJvcigiT3B0aW9uIC1kIHJlcXVpcmVzIGEgZGlyZWN0b3J5IHBhdGgiKTsKKwkJCQkJCWlmICgqZGlycGF0aCAmJiBkaXJwYXRoW3N0cmxlbihkaXJwYXRoKS0xXSAhPSAnLycgJiYgZGlycGF0aFtzdHJsZW4oZGlycGF0aCktMV0gIT0gJ1xcJykKKwkJCQkJCQlzdHJjYXQoZGlycGF0aCwgU09BUF9QQVRIQ0FUKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICdlJzoKKwkJCQkJCWVmbGFnID0gMTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICdhJzoKKwkJCQkJCWFmbGFnID0gMTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICc/JzoKKwkJCQkJY2FzZSAnaCc6CisJCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBzb2FwY3BwMiBbLTF8LTJdIFstQ3wtU10gWy1MXSBbLWFdIFstY10gWy1kIHBhdGhdIFstZV0gWy1oXSBbLWldIFstSSBwYXRoIlNPQVBfUEFUSFNFUCJwYXRoIlNPQVBfUEFUSFNFUCIuLi5dIFstbF0gWy1tXSBbLW5dIFstcCBuYW1lXSBbLXRdIFstdl0gWy13XSBbLXhdIFtpbmZpbGVdXG5cbiIpOworCQkJCQkJZnByaW50ZihzdGRlcnIsICJcCistMSAgICAgIGdlbmVyYXRlIFNPQVAgMS4xIGJpbmRpbmdzXG5cCistMiAgICAgIGdlbmVyYXRlIFNPQVAgMS4yIGJpbmRpbmdzXG5cCistQwlnZW5lcmF0ZSBjbGllbnQtc2lkZSBjb2RlIG9ubHlcblwKKy1TCWdlbmVyYXRlIHNlcnZlci1zaWRlIGNvZGUgb25seVxuXAorLUwJZG9uJ3QgZ2VuZXJhdGUgc29hcENsaWVudExpYi9zb2FwU2VydmVyTGliXG5cCistYQl1c2UgdmFsdWUgb2YgU09BUEFjdGlvbiBIVFRQIGhlYWRlciB0byBkaXNwYXRjaCBtZXRob2QgYXQgc2VydmVyIHNpZGVcblwKKy1jICAgICAgZ2VuZXJhdGUgQyBzb3VyY2UgY29kZVxuXAorLWRwYXRoICB1c2UgcGF0aCB0byBzYXZlIGZpbGVzXG5cCistZQlnZW5lcmF0ZSBTT0FQIFJQQyBlbmNvZGluZyBzdHlsZSBiaW5kaW5nc1xuXAorLWgJZGlzcGxheSBoZWxwIGluZm9cblwKKy1pICAgICAgZ2VuZXJhdGUgc2VydmljZSBwcm94aWVzIGFuZCBvYmplY3RzIGluaGVyaXRlZCBmcm9tIHNvYXAgc3RydWN0XG5cCistSXBhdGggIHVzZSBwYXRoKHMpIGZvciAjaW1wb3J0XG5cCistbCAgICAgIGdlbmVyYXRlIGxpbmthYmxlIG1vZHVsZXMgKGV4cGVyaW1lbnRhbClcblwKKy1tICAgICAgZ2VuZXJhdGUgTWF0bGFiKHRtKSBjb2RlIGZvciBNRVggY29tcGlsZXJcblwKKy1uICAgICAgdXNlIHNlcnZpY2UgbmFtZSB0byByZW5hbWUgc2VydmljZSBmdW5jdGlvbnMgYW5kIG5hbWVzcGFjZSB0YWJsZVxuXAorLXBuYW1lICBzYXZlIGZpbGVzIHdpdGggbmV3IHByZWZpeCBuYW1lIGluc3RlYWQgb2YgJ3NvYXAnXG5cCistdCAgICAgIGdlbmVyYXRlIGNvZGUgZm9yIGZ1bGx5IHhzaTp0eXBlIHR5cGVkIFNPQVAvWE1MIG1lc3NhZ2luZ1xuXAorLXYJZGlzcGxheSB2ZXJzaW9uIGluZm9cblwKKy13CWRvbid0IGdlbmVyYXRlIFdTREwgYW5kIHNjaGVtYSBmaWxlc1xuXAorLXgJZG9uJ3QgZ2VuZXJhdGUgc2FtcGxlIFhNTCBtZXNzYWdlIGZpbGVzXG5cCitpbmZpbGUJaGVhZGVyIGZpbGUgdG8gcGFyc2UgKG9yIHN0ZGluKVxuXAorXG4iKTsKKwkJCQkJCWV4aXQoMCk7CisJCQkJCWNhc2UgJ0knOgorCQkJCQkJYSsrOworCQkJCQkJZyA9IDA7CisJCQkJCQlzID0gTlVMTDsKKwkJCQkJCWlmICgqYSkKKwkJCQkJCQlzID0gYTsKKwkJCQkJCWVsc2UgaWYgKGkgPCBhcmdjICYmIGFyZ3ZbKytpXSkKKwkJCQkJCQlzID0gYXJndltpXTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlleGVjZXJyb3IoIk9wdGlvbiAtSSByZXF1aXJlcyBhbiBpbXBvcnQgcGF0aCIpOworCQkJCQkJaWYgKGltcG9ydHBhdGggJiYgcykKKwkJCQkJCXsJY2hhciAqdAk9IGVtYWxsb2Moc3RybGVuKGltcG9ydHBhdGgpICsgc3RybGVuKHMpICsgMik7CisJCQkJCQkJc3RyY3B5KHQsIGltcG9ydHBhdGgpOworCQkJCQkJCXN0cmNhdCh0LCBTT0FQX1BBVEhTRVApOworCQkJCQkJCXN0cmNhdCh0LCBzKTsKKwkJCQkJCQlpbXBvcnRwYXRoID0gdDsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCQlpbXBvcnRwYXRoID0gczsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICdpJzoKKwkJCQkJCWlmbGFnID0gMTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICdtJzoKKwkJCQkJCW1mbGFnID0gMTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICduJzoKKwkJCQkJCW5mbGFnID0gMTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICdsJzoKKwkJCQkJCWxmbGFnID0gMTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICdMJzoKKwkJCQkJCUxmbGFnID0gMTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICdTJzoKKwkJCQkJCVNmbGFnID0gMTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICd0JzoKKwkJCQkJCXRmbGFnID0gMTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICd3JzoKKwkJCQkJCXdmbGFnID0gMTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICd4JzoKKwkJCQkJCXhmbGFnID0gMTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICdwJzoKKwkJCQkJCWErKzsKKwkJCQkJCWcgPSAwOworCQkJCQkJaWYgKCphKQorCQkJCQkJCXByZWZpeCA9IGE7CisJCQkJCQllbHNlIGlmIChpIDwgYXJnYyAmJiBhcmd2WysraV0pCisJCQkJCQkJcHJlZml4ID0gYXJndltpXTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlleGVjZXJyb3IoIk9wdGlvbiAtcCByZXF1aXJlcyBhbiBvdXRwdXQgZmlsZSBuYW1lIHByZWZpeCIpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgJzEnOgorCQkJCQkJdmZsYWcgPSAxOworCQkJCQkJZW52VVJJID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIjsKKwkJCQkJCWVuY1VSSSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAnMic6CisJCQkJCQl2ZmxhZyA9IDI7CisJCQkJCQllbnZVUkkgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIjsKKwkJCQkJCWVuY1VSSSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW5jb2RpbmciOworCQkJCQkJcnBjVVJJID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1ycGMiOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgJ3YnOgorCQkJCQkJc3RvcF9mbGFnID0gMTsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorICAgICAgICAgICAgCQkJCQlmcHJpbnRmKHN0ZGVyciwgInNvYXBjcHAyOiBVbmtub3duIG9wdGlvbiAlc1xuIiwgYSk7CisgICAgICAgICAgICAJCQkJCWV4aXQoMSk7CisJCQkJfQorCQl9CisJCWVsc2UgaWYgKCEoeXlpbiA9IGZvcGVuKGFyZ3ZbaV0sICJyIikpKQorCQl7CXNwcmludGYoZXJyYnVmLCAiQ2Fubm90IG9wZW4gZmlsZSBcIiVzXCIgZm9yIHJlYWRpbmciLCBhcmd2W2ldKTsKKwkJCWV4ZWNlcnJvcihlcnJidWYpOworCQl9CisJCWVsc2UKKwkJCXN0cmNweShmaWxlbmFtZSwgYXJndltpXSk7CisJfQorCWZwcmludGYoZm1zZywgIlxuKiogIFRoZSBnU09BUCBTdHViIGFuZCBTa2VsZXRvbiBDb21waWxlciBmb3IgQyBhbmQgQysrICJWRVJTSU9OIlxuKiogIENvcHlyaWdodCAoQykgMjAwMC0yMDA2LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLlxuKiogIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgcHJvZHVjdCBpcyBwcm92aWRlZCBcImFzIGlzXCIsIHdpdGhvdXQgYW55IHdhcnJhbnR5LlxuKiogIFRoZSBnU09BUCBjb21waWxlciBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyB0aHJlZSBsaWNlbnNlczpcbioqICBHUEwsIHRoZSBnU09BUCBwdWJsaWMgbGljZW5zZSwgb3IgdGhlIGNvbW1lcmNpYWwgbGljZW5zZSBieSBHZW5pdmlhIEluYy5cblxuIik7CisJaWYgKHN0b3BfZmxhZykKKwkgIGV4aXQoMCk7CisJaW5pdCgpOworCWlmICh5eXBhcnNlKCkpCisJCXN5bmVycm9yKCJza2lwcGluZyB0aGUgcmVtYWluaW5nIHBhcnQgb2YgdGhlIGlucHV0Iik7CisJcmV0dXJuIGVycnN0YXQoKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9zb2FwY3BwMi5oIGIvc3JjL3NvYXBjcHAyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGViNTQ1MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zb2FwY3BwMi5oCkBAIC0wLDAgKzEsMzg2IEBACisvKgorCitzb2FwY3BwMi5oCisKK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMC0yMDA2LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlczoKK0dQTCwgdGhlIGdTT0FQIHB1YmxpYyBsaWNlbnNlLCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgcHVibGljIGxpY2Vuc2UuCisKK1RoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGdTT0FQIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4zCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKK0xpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoraHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL3NvYXBsaWNlbnNlLmh0bWwKK1NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCitXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKK2ZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK1RoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4uCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNiBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4sIEdlbml2aWEgaW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSAiZXJyb3IyLmgiCisKKyNpZm5kZWYgVkVSU0lPTgorI2RlZmluZSBWRVJTSU9OICIyLjcuNmUiIC8qIEN1cnJlbnQgdmVyc2lvbiAqLworI2VuZGlmCisKKyNpZmRlZiBXSU4zMgorI2lmbmRlZiBXSVRIX0JJU09OCisjZGVmaW5lIFdJVEhfQklTT04KKyNlbmRpZgorI2VuZGlmCisKKy8qICNkZWZpbmUgREVCVUcgKi8gLyogdW5jb21tZW50IHRvIGRlYnVnICovCisKKyNpZmRlZiBERUJVRworI2RlZmluZQljaGVjayhleHByLCBtc2cpICgoZXhwcikgPyAxIDogcHJvZ2Vycm9yKG1zZywgX19GSUxFX18sIF9fTElORV9fKSkKKyNkZWZpbmUgREJHTE9HKERCR0NNRCkgeyBEQkdDTUQ7IH0KKyNlbHNlCisjZGVmaW5lIGNoZWNrKGV4cHIsIG1zZykgKGV4cHIsIDEpCisjZGVmaW5lIERCR0xPRyhEQkdDTUQpCisjZW5kaWYKKworI2lmZGVmIFdJVEhfQklTT04KKyNpZmRlZiBXSU4zMl9XSVRIT1VUX1NPTEFSSVNfRkxFWAorI2RlZmluZSB5eXBhcnNlIHNvYXBjcHAycGFyc2UKKyNkZWZpbmUgeXlsZXggc29hcGNwcDJsZXgKKyNkZWZpbmUgeXllcnJvciBzb2FwY3BwMmVycm9yCisjZGVmaW5lIHl5bHZhbCBzb2FwY3BwMmx2YWwKKyNkZWZpbmUgeXljaGFyIHNvYXBjcHAyY2hhcgorI2RlZmluZSB5eWRlYnVnIHNvYXBjcHAyZGVidWcKKyNkZWZpbmUgeXluZXJycyBzb2FwY3BwMm5lcnJzCisjZGVmaW5lIHl5bGluZW5vIHNvYXBjcHAybGluZW5vCisjZGVmaW5lIHl5dGV4dCBzb2FwY3BwMnRleHQKKyNkZWZpbmUgeXlpbiBzb2FwY3BwMmluCisjZGVmaW5lIHl5d3JhcCBzb2FwY3BwMndyYXAKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBXSU4zMgorI2RlZmluZSBTT0FQX1BBVEhDQVQgIlxcIgorI2RlZmluZSBTT0FQX1BBVEhTRVAgIjsiCisjZGVmaW5lIExPTkc2NCBfX2ludDY0CisjZWxzZQorI2RlZmluZSBTT0FQX1BBVEhDQVQgIi8iCisjZGVmaW5lIFNPQVBfUEFUSFNFUCAiOiIKKyNkZWZpbmUgTE9ORzY0IGxvbmcgbG9uZworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFdJTjMyKQorI2RlZmluZSBTT0FQX0xPTkdfRk9STUFUICIlSTY0ZCIKKyNkZWZpbmUgU09BUF9VTE9OR19GT1JNQVQgIiVJNjR1IgorI2RlZmluZSBTT0FQX1hMT05HX0ZPUk1BVCAiJUk2NHgiCisjZWxpZiBkZWZpbmVkKFRSVTY0KQorI2RlZmluZSBTT0FQX0xPTkdfRk9STUFUICIlbGQiCisjZGVmaW5lIFNPQVBfVUxPTkdfRk9STUFUICIlbHUiCisjZGVmaW5lIFNPQVBfWExPTkdfRk9STUFUICIlbHgiCisjZW5kaWYKKworI2lmbmRlZiBTT0FQX0xPTkdfRk9STUFUCisjZGVmaW5lIFNPQVBfTE9OR19GT1JNQVQgIiVsbGQiCQkvKiBwcmludGYgZm9ybWF0IGZvciA2NCBiaXQgaW50cyAqLworI2VuZGlmCisjaWZuZGVmIFNPQVBfVUxPTkdfRk9STUFUCisjZGVmaW5lIFNPQVBfVUxPTkdfRk9STUFUICIlbGx1IgkvKiBwcmludGYgZm9ybWF0IGZvciB1bnNpZ25lZCA2NCBiaXQgaW50cyAqLworI2VuZGlmCisjaWZuZGVmIFNPQVBfWExPTkdfRk9STUFUCisjZGVmaW5lIFNPQVBfWExPTkdfRk9STUFUICIlbGx4IgkvKiBwcmludGYgZm9ybWF0IGZvciB1bnNpZ25lZCA2NCBiaXQgaGV4IGludHMgKi8KKyNlbmRpZgorCitleHRlcm4gaW50IHl5bGluZW5vOworCit0eXBlZGVmCWVudW0gQm9vbCB7RmFsc2UsIFRydWV9IEJvb2w7CisKK3R5cGVkZWYJaW50IFRva2VuOworCit0eXBlZGVmCWVudW0gVHlwZQorewlUbm9uZSwKKwlUdm9pZCwJCS8qIHByaW1pdGl2ZSB0eXBlcyAqLworCVRjaGFyLAorCVR3Y2hhciwKKwlUc2hvcnQsCisJVGludCwKKwlUbG9uZywKKwlUbGxvbmcsCisJVGZsb2F0LAorCVRkb3VibGUsCisJVHVjaGFyLAorCVR1c2hvcnQsCisJVHVpbnQsCisJVHVsb25nLAorCVR1bGxvbmcsCisJVGVudW0sCisJVHRpbWUsCisJVGNsYXNzLAkJLyogY29tcG91bmQgdHlwZXMgKi8KKwlUc3RydWN0LAorCVR1bmlvbiwKKwlUcG9pbnRlciwKKwlUcmVmZXJlbmNlLAorCVRhcnJheSwKKwlUdGVtcGxhdGUsCisJVGZ1bgorfSBUeXBlOworCisjZGVmaW5lCVRZUEVTIChUZnVuKzEpCS8qIG51bWJlciBvZiB0eXBlIChvcGVyYXRvcnMpIGVudW1lcmF0ZWQgYWJvdmUgKi8KKwordHlwZWRlZgllbnVtIFN0b3JhZ2UKK3sJU25vbmUJCT0gMCwKKwlTYXV0bwkJPSAweDAwMDAwMSwKKwlTcmVnaXN0ZXIJPSAweDAwMDAwMiwKKwlTc3RhdGljCQk9IDB4MDAwMDA0LAorCVNleHRlcm4JCT0gMHgwMDAwMDgsCisJU3R5cGVkZWYJPSAweDAwMDAxMCwKKwlTdmlydHVhbAk9IDB4MDAwMDIwLAorCVNjb25zdAkJPSAweDAwMDA0MCwKKwlTZnJpZW5kCQk9IDB4MDAwMDgwLAorCVNpbmxpbmUJCT0gMHgwMDAxMDAsCisJU2NvbnN0b2JqCT0gMHgwMDAyMDAsCisJU2Fic3RyYWN0CT0gMHgwMDA0MDAsCisJU211c3RVbmRlcnN0YW5kCT0gMHgwMDA4MDAsCisJU3JldHVybgkJPSAweDAwMTAwMCwKKwlTYXR0cmlidXRlCT0gMHgwMDIwMDAsCisJU2V4cGxpY2l0CT0gMHgwMDQwMDAsCisJU3ByaXZhdGUJPSAweDAxMDAwMCwKKwlTcHJvdGVjdGVkCT0gMHgwMjAwMDAKK30gU3RvcmFnZTsKKwordHlwZWRlZgllbnVtIExldmVsIHsgSU5URVJOQUwsIEdMT0JBTCwgUEFSQU0sIExPQ0FMIH0gTGV2ZWw7CisKKyNkZWZpbmUgbWtub25lKCkJbWt0eXBlKFRub25lLCAgICAgTlVMTCwgMCkKKyNkZWZpbmUgbWt2b2lkKCkJbWt0eXBlKFR2b2lkLCAgICAgTlVMTCwgMCkKKyNkZWZpbmUgbWtib29sKCkJbWt0eXBlKFRlbnVtLCAgICAgYm9vbHRhYmxlLCAyKQorI2RlZmluZSBta2NoYXIoKQlta3R5cGUoVGNoYXIsICAgICBOVUxMLCAxKQorI2RlZmluZSBta3djaGFydCgpCW1rdHlwZShUd2NoYXIsICAgIE5VTEwsIDQpCisjZGVmaW5lIG1rc2hvcnQoKQlta3R5cGUoVHNob3J0LCAgICBOVUxMLCAyKQorI2RlZmluZSBta2ludCgpCQlta3R5cGUoVGludCwgICAgICBOVUxMLCA0KQorI2RlZmluZSBta2xvbmcoKQlta3R5cGUoVGxvbmcsICAgICBOVUxMLCA4KQorI2RlZmluZSBta2xsb25nKCkJbWt0eXBlKFRsbG9uZywgICAgTlVMTCwgOCkKKyNkZWZpbmUgbWtmbG9hdCgpCW1rdHlwZShUZmxvYXQsICAgIE5VTEwsIDQpCisjZGVmaW5lIG1rZG91YmxlKCkJbWt0eXBlKFRkb3VibGUsICAgTlVMTCwgOCkKKyNkZWZpbmUgbWt1Y2hhcigpCW1rdHlwZShUdWNoYXIsICAgIE5VTEwsIDEpCS8qIHVuc2lnbmVkIGNoYXIgKi8KKyNkZWZpbmUgbWt1c2hvcnQoKQlta3R5cGUoVHVzaG9ydCwgICBOVUxMLCAyKQkvKiB1bnNpZ25lZCBzaG9ydCAqLworI2RlZmluZSBta3VpbnQoKQlta3R5cGUoVHVpbnQsICAgICBOVUxMLCA0KQkvKiB1bnNpZ25lZCBpbnQgKi8KKyNkZWZpbmUgbWt1bG9uZygpCW1rdHlwZShUdWxvbmcsICAgIE5VTEwsIDgpCS8qIHVuc2lnbmVkIGxvbmcgKi8KKyNkZWZpbmUgbWt1bGxvbmcoKQlta3R5cGUoVHVsbG9uZywgICBOVUxMLCA4KQkvKiB1bnNpZ25lZCBsb25nICovCisjZGVmaW5lIG1rdGltZXQoKQlta3R5cGUoVHRpbWUsICAgICBOVUxMLCA0KQorI2RlZmluZSBta2VudW0odCkJbWt0eXBlKFRlbnVtLAkgIHQsICAgIDQpCisjZGVmaW5lIG1rbWFzayh0KQlta3R5cGUoVGVudW0sCSAgdCwgICAgOCkKKyNkZWZpbmUJbWtwb2ludGVyKHQpCW1rdHlwZShUcG9pbnRlciwgIHQsICAgIDQpCisjZGVmaW5lCW1rcmVmZXJlbmNlKHQpCW1rdHlwZShUcmVmZXJlbmNlLHQsICAgIDQpCisjZGVmaW5lCW1rY2xhc3ModCwgdykJbWt0eXBlKFRjbGFzcywgICAgdCwgICAgdykKKyNkZWZpbmUJbWtzdHJ1Y3QodCwgdykJbWt0eXBlKFRzdHJ1Y3QsICAgdCwgICAgdykKKyNkZWZpbmUJbWt1bmlvbih0LCB3KQlta3R5cGUoVHVuaW9uLCAgICB0LCAgICB3KQorI2RlZmluZQlta2FycmF5KHQsIHcpCW1rdHlwZShUYXJyYXksICAgIHQsICAgIHcpCisjZGVmaW5lCW1rZnVuKHQpCW1rdHlwZShUZnVuLCAgICAgIHQsICAgIDApCisjZGVmaW5lIG1rc3RyaW5nKCkJbWtwb2ludGVyKG1rY2hhcigpKQorCit0eXBlZGVmIHN0cnVjdCBTeW1ib2wKK3sJY2hhcgkqbmFtZTsKKwlUb2tlbgl0b2tlbjsKKwlzdHJ1Y3QJU3ltYm9sICpuZXh0OworfSBTeW1ib2w7CisKK1N5bWJvbAkqaW5zdGFsbChjb25zdCBjaGFyKiwgVG9rZW4pLCAqbG9va3VwKGNvbnN0IGNoYXIqKSwgKmdlbnN5bShjb25zdCBjaGFyKiksICpnZW5zeW1pZHgoY29uc3QgY2hhciosIGludCk7CisKK3R5cGVkZWYJc3RydWN0IFRub2RlCit7CVR5cGUJdHlwZTsKKwl2b2lkCSpyZWY7CisJU3ltYm9sCSppZDsJLyogc3RydWN0L2NsYXNzL3VuaW9uL2VudW0gbmFtZSAqLworCVN5bWJvbAkqYmFzZTsJLyogYmFzZSBjbGFzcyBuYW1lICovCisJU3ltYm9sCSpzeW07CS8qIHR5cGVkZWYgbmFtZSAqLworCXN0cnVjdAlFbnRyeSAqcmVzcG9uc2U7IC8qIGZ1bmNzIG9ubHk6IHBvaW50cyB0byByZXNwb25zZSBzdHJ1Y3QgKi8KKwlpbnQJd2lkdGg7CisJaW50CXRyYW5zaWVudDsKKwlpbnQJaW1wb3J0czsKKwlzdHJ1Y3QJVG5vZGUgKm5leHQ7CisgICAgICAgIEJvb2wJZ2VuZXJhdGVkOworICAgICAgICBCb29sCXdzZGw7CisJaW50CW51bTsKKwljaGFyCSpwYXR0ZXJuOworCWxvbmcJbWluTGVuZ3RoOworCWxvbmcJbWF4TGVuZ3RoOworfSBUbm9kZTsKKwordHlwZWRlZgl1bmlvbiBWYWx1ZSB7CisJTE9ORzY0CWk7CisJZG91YmxlCXI7CisJY2hhcgkqczsKK30gVmFsdWU7CisKK3R5cGVkZWYJc3RydWN0IElEaW5mbyB7CisJVG5vZGUJKnR5cDsKKwlTdG9yYWdlCXN0bzsKKwlCb29sCWhhc3ZhbDsJCS8qIGlmIHRydWUsIGlkZW50aWZpZXIgaXMgY29uc3RhbnQgKi8KKwlWYWx1ZQl2YWw7CQkvKiAuLi4gd2l0aCB0aGlzIHZhbHVlICovCisJaW50CW9mZnNldDsKKwlsb25nCW1pbk9jY3VyczsKKwlsb25nCW1heE9jY3VyczsKK30gSURpbmZvOworCit0eXBlZGVmCXN0cnVjdCBFbnRyeSB7CisJU3ltYm9sCSpzeW07CisJSURpbmZvCWluZm87CisJTGV2ZWwJbGV2ZWw7CisJaW50CWxpbmVubzsKKwlzdHJ1Y3QJRW50cnkgKm5leHQ7Cit9IEVudHJ5OworCit0eXBlZGVmCXN0cnVjdCBUYWJsZSB7CisJU3ltYm9sCSpzeW07CisJTGV2ZWwJbGV2ZWw7CisJRW50cnkJKmxpc3Q7CisJc3RydWN0CVRhYmxlICpwcmV2OworfSBUYWJsZTsKKwordHlwZWRlZiBzdHJ1Y3QgRk5pbmZvIHsKKwlUbm9kZQkqcmV0OworCVRhYmxlCSphcmdzOworfSBGTmluZm87CisKKwordHlwZWRlZglzdHJ1Y3QgTm9kZSB7CisJVG5vZGUJKnR5cDsKKwlTdG9yYWdlCXN0bzsKKwlCb29sCWhhc3ZhbDsJCS8qIGlmIHRydWUsIHRoaXMgbm9kZSBoYXMgYSBjb25zdGFudCB2YWx1ZSAqLworCVZhbHVlCXZhbDsJCS8qIC4uLiB0aGlzIGlzIHRoZSB2YWx1ZSAqLworCWxvbmcJbWluT2NjdXJzOworCWxvbmcJbWF4T2NjdXJzOworCWNoYXIJKnBhdHRlcm47Cit9IE5vZGU7CisKKyNkZWZpbmUgQUNUSU9OIDAKKyNkZWZpbmUgSERSSU4gMQkKKyNkZWZpbmUgSERST1VUIDIKKyNkZWZpbmUgTUlNRUlOIDQKKyNkZWZpbmUgTUlNRU9VVCA4CisjZGVmaW5lIENPTU1FTlQgMTYKKyNkZWZpbmUgRU5DT0RJTkcgMzIKKyNkZWZpbmUgUkVTUE9OU0VfRU5DT0RJTkcgNjQKKyNkZWZpbmUgU1RZTEUgMTI4CisjZGVmaW5lIEZBVUxUIDI1NgorCit0eXBlZGVmIHN0cnVjdCBEYXRhCit7CXN0cnVjdCBEYXRhICpuZXh0OworCWNoYXIgKm5hbWU7CisJY2hhciAqcGFydDsKK30gRGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgTWV0aG9kCit7CXN0cnVjdCBNZXRob2QgKm5leHQ7CisJY2hhciAqbmFtZTsKKwlzaG9ydCBtZXNzOyAvKiBzZWUgI2RlZmluZXMgYWJvdmUgKi8KKwljaGFyICpwYXJ0OworfSBNZXRob2Q7CisKK3R5cGVkZWYgc3RydWN0IFNlcnZpY2UKK3sJc3RydWN0IFNlcnZpY2UgKm5leHQ7CisJY2hhciAqbnM7CisJY2hhciAqbmFtZTsKKwljaGFyICpwb3J0OworCWNoYXIgKmJpbmRpbmc7CisJY2hhciAqZGVmaW5pdGlvbnM7CisJY2hhciAqdHJhbnNwb3J0OworCWNoYXIgKlVSTDsKKwljaGFyICpleGVjdXRhYmxlOworCWNoYXIgKmltcG9ydDsKKwljaGFyICpVUkk7CisJY2hhciAqV1NETDsKKwljaGFyICpzdHlsZTsKKwljaGFyICplbmNvZGluZzsKKwljaGFyICplbGVtZW50Rm9ybTsKKwljaGFyICphdHRyaWJ1dGVGb3JtOworCWNoYXIgKmRvY3VtZW50YXRpb247CisJc3RydWN0IE1ldGhvZCAqbGlzdDsKKwlzdHJ1Y3QgRGF0YSAqZGF0YTsKK30gU2VydmljZTsKKwordHlwZWRlZiBzdHJ1Y3QgUHJhZ21hCit7CXN0cnVjdCBQcmFnbWEgKm5leHQ7CisJY2hhciAqcHJhZ21hOworfSBQcmFnbWE7CisKK2V4dGVybiBFbnRyeSAqZW50ZXIoVGFibGUqLCBTeW1ib2wqKSwgKmVudHJ5KFRhYmxlKiwgU3ltYm9sKiksICpyZWVudGVyKFRhYmxlKiwgU3ltYm9sKiksICplbnVtZW50cnkoU3ltYm9sKik7CisKK2V4dGVybiBUYWJsZSAqbWt0YWJsZShUYWJsZSopOworCitleHRlcm4gVG5vZGUgKm1rbWV0aG9kKFRub2RlKiwgVGFibGUqKTsKKworZXh0ZXJuIGNoYXIgKmVtYWxsb2ModW5zaWduZWQgaW50KTsKKworZXh0ZXJuIFRub2RlICpta3R5cGUoVHlwZSwgdm9pZCosIGludCk7CitleHRlcm4gVG5vZGUgKm1rc3ltdHlwZShUbm9kZSosIFN5bWJvbCopOworZXh0ZXJuIFRub2RlICpta3RlbXBsYXRlKFRub2RlKiwgU3ltYm9sKik7CisKK2V4dGVybiBpbnQgaXNfdHJhbnNpZW50KFRub2RlKik7CitleHRlcm4gaW50IGlzX3Jlc3BvbnNlKFRub2RlKik7CisKK2V4dGVybiBUYWJsZSAqdHlwZXRhYmxlLCAqZW51bXRhYmxlLCAqY2xhc3N0YWJsZSwgKmJvb2x0YWJsZSwgKnRlbXBsYXRldGFibGU7CisKK2V4dGVybiB2b2lkIGNvbXBpbGUoVGFibGUqKTsKK2V4dGVybiB2b2lkIGZyZWV0YWJsZShUYWJsZSopOworZXh0ZXJuIEVudHJ5ICp1bmxpbmtsYXN0KFRhYmxlKik7IAorCitleHRlcm4gRklMRSAqZm1zZzsKKworZXh0ZXJuIGludCBhZmxhZzsKK2V4dGVybiBpbnQgdmZsYWc7CitleHRlcm4gaW50IHdmbGFnOworZXh0ZXJuIGludCBjZmxhZzsKK2V4dGVybiBpbnQgQ2ZsYWc7CitleHRlcm4gaW50IGVmbGFnOworZXh0ZXJuIGludCBpZmxhZzsKK2V4dGVybiBpbnQgbWZsYWc7CitleHRlcm4gaW50IG5mbGFnOworZXh0ZXJuIGludCBsZmxhZzsKK2V4dGVybiBpbnQgTGZsYWc7CitleHRlcm4gaW50IFNmbGFnOworZXh0ZXJuIGludCB0ZmxhZzsKK2V4dGVybiBpbnQgeGZsYWc7CitleHRlcm4gaW50IGlzX21vZHVsZTsKK2V4dGVybiBjaGFyIGRpcnBhdGhbMTAyNF07CitleHRlcm4gY2hhciBmaWxlbmFtZVsxMDI0XTsKK2V4dGVybiBjaGFyICpwcmVmaXg7CitleHRlcm4gY2hhciAqaW1wb3J0cGF0aDsKK2V4dGVybiBpbnQgY3VzdG9tX2hlYWRlcjsKK2V4dGVybiBpbnQgY3VzdG9tX2ZhdWx0OworZXh0ZXJuIFByYWdtYSAqcHJhZ21hczsKK2V4dGVybiBTZXJ2aWNlICpzZXJ2aWNlczsKK2V4dGVybiBjaGFyICpuYW1lc3BhY2VpZDsKK2V4dGVybiBpbnQgdHJhbnNpZW50OworZXh0ZXJuIGludCBpbXBvcnRzOworZXh0ZXJuIGludCB0eXBlTk87CisKK2V4dGVybiBjaGFyICplbnZVUkk7CitleHRlcm4gY2hhciAqZW5jVVJJOworZXh0ZXJuIGNoYXIgKnJwY1VSSTsKK2V4dGVybiBjaGFyICp4c2lVUkk7CitleHRlcm4gY2hhciAqeHNkVVJJOwpkaWZmIC0tZ2l0IGEvc3JjL3NvYXBjcHAyLnNsbiBiL3NyYy9zb2FwY3BwMi5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY2YWViMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zb2FwY3BwMi5zbG4KQEAgLTAsMCArMSwyMCBAQAor77u/CitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMC4wMAorIyBWaXN1YWwgU3R1ZGlvIDIwMDgKK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAic29hcGNwcDIiLCAic29hcGNwcDIudmNwcm9qIiwgIntCREQxQjI5My1DRTM5LTRCRUMtOEU2My04QjE2MjFGM0VCNTZ9IgorRW5kUHJvamVjdAorR2xvYmFsCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24KKwkJRGVidWd8V2luMzIgPSBEZWJ1Z3xXaW4zMgorCQlSZWxlYXNlfFdpbjMyID0gUmVsZWFzZXxXaW4zMgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7QkREMUIyOTMtQ0UzOS00QkVDLThFNjMtOEIxNjIxRjNFQjU2fS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMgorCQl7QkREMUIyOTMtQ0UzOS00QkVDLThFNjMtOEIxNjIxRjNFQjU2fS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzIKKwkJe0JERDFCMjkzLUNFMzktNEJFQy04RTYzLThCMTYyMUYzRUI1Nn0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXtCREQxQjI5My1DRTM5LTRCRUMtOEU2My04QjE2MjFGM0VCNTZ9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24KKwkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFCisJRW5kR2xvYmFsU2VjdGlvbgorRW5kR2xvYmFsCmRpZmYgLS1naXQgYS9zcmMvc29hcGNwcDIudmNwcm9qIGIvc3JjL3NvYXBjcHAyLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmU3OWY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3NvYXBjcHAyLnZjcHJvagpAQCAtMCwwICsxLDI3NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjkuMDAiDQorCU5hbWU9InNvYXBjcHAyIg0KKwlQcm9qZWN0R1VJRD0ie0JERDFCMjkzLUNFMzktNEJFQy04RTYzLThCMTYyMUYzRUI1Nn0iDQorCVJvb3ROYW1lc3BhY2U9InNvYXBjcHAyIg0KKwlLZXl3b3JkPSJXaW4zMlByb2oiDQorCVRhcmdldEZyYW1ld29ya1ZlcnNpb249IjEzMTA3MiINCisJPg0KKwk8UGxhdGZvcm1zPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luMzIiDQorCQkvPg0KKwk8L1BsYXRmb3Jtcz4NCisJPFRvb2xGaWxlcz4NCisJPC9Ub29sRmlsZXM+DQorCTxDb25maWd1cmF0aW9ucz4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uRGlyKSQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJQ2hhcmFjdGVyU2V0PSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCSANCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfQ09OU09MRTtZWV9ORVZFUl9JTlRFUkFDVElWRTtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyINCisJCQkJIA0KKwkJCQkgDQorCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiDQorCQkJCSANCisJCQkJIA0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJrZXJuZWwzMi5saWIgJChOb0luaGVyaXQpIg0KKwkJCQkgDQorCQkJCQ0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCQ0KKwkJCQkNCisJCQkJVGFyZ2V0TWFjaGluZT0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbkRpcikkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCisJCQkgDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfQ09OU09MRTtZWV9ORVZFUl9JTlRFUkFDVElWRTtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyINCisJCQkJIA0KKwkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIg0KKwkJCQkgDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Imtlcm5lbDMyLmxpYiAkKE5vSW5oZXJpdCkiDQorCQkJCSANCisJCQkJDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJT3B0aW1pemVSZWZlcmVuY2VzPSIyIg0KKwkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIyIg0KKwkJCQkNCisJCQkJDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCTwvUmVmZXJlbmNlcz4NCisJPEZpbGVzPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9ImNwcDtjO2NjO2N4eDtkZWY7b2RsO2lkbDtocGo7YmF0O2FzbTthc214Ig0KKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins0RkM3MzdGMS1DN0E1LTQzNzYtQTA2Ni0yQTMyRDc1MkEyRkZ9Ig0KKwkJCT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cZXJyb3IyLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGluaXQyLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGxleC5zb2FwY3BwMl9sZXguYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cc29hcGNwcDIuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cc29hcGNwcDJfeWFjYy50YWIuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cc3ltYm9sMi5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iSGVhZGVyIEZpbGVzIg0KKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubDtpbmM7eHNkIg0KKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9Ig0KKwkJCT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cZXJyb3IyLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXHNvYXBjcHAyLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXHNvYXBjcHAyX3lhY2MuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlJlc291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0icmM7aWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlO3Jlc3g7dGlmZjt0aWY7cG5nO3dhdiINCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7NjdEQTZBQjYtRjgwMC00YzA4LThCN0EtODNCQjEyMUFBRDAxfSINCisJCQk+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuXHNvYXBjcHAyX2xleC5sIg0KKwkJCT4NCisJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJCT4NCisJCQkJPFRvb2wNCisJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCQkJRGVzY3JpcHRpb249IkNhbGxpbmcgRmxleCINCisJCQkJCUNvbW1hbmRMaW5lPSJmbGV4IC1sIC10ICAkKElucHV0UGF0aCkgJmd0OyBsZXguc29hcGNwcDJfbGV4LmMiDQorCQkJCQlPdXRwdXRzPSJsZXguc29hcGNwcDJfbGV4LmMiDQorCQkJCS8+DQorCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQkJPg0KKwkJCQk8VG9vbA0KKwkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJCQlEZXNjcmlwdGlvbj0iQ2FsbGluZyBGbGV4Ig0KKwkJCQkJQ29tbWFuZExpbmU9ImZsZXggLWwgLXQgICQoSW5wdXRQYXRoKSAmZ3Q7IGxleC5zb2FwY3BwMl9sZXguYyINCisJCQkJCU91dHB1dHM9ImxleC5zb2FwY3BwMl9sZXguYyINCisJCQkJLz4NCisJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii5cc29hcGNwcDJfeWFjYy55Ig0KKwkJCT4NCisJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJCT4NCisJCQkJPFRvb2wNCisJCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCQkJRGVzY3JpcHRpb249IkNhbGxpbmcgQmlzb24iDQorCQkJCQlDb21tYW5kTGluZT0iYmlzb24gLWQgLXYgJChJbnB1dFBhdGgpJiN4MEQ7JiN4MEE7OyBjb3B5IHNvYXBjcHAyX3lhY2MudGFiLmggc29hcGNwcDJfeWFjYy5oIg0KKwkJCQkJT3V0cHV0cz0ic29hcGNwcDJfeWFjYy50YWIuYyBzb2FwY3BwMl95YWNjLmgiDQorCQkJCS8+DQorCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQkJPg0KKwkJCQk8VG9vbA0KKwkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJCQlEZXNjcmlwdGlvbj0iQ2FsbGluZyBCaXNvbiINCisJCQkJCUNvbW1hbmRMaW5lPSJiaXNvbiAtZCAtdiAkKElucHV0UGF0aCkmI3gwRDsmI3gwQTs7IGNvcHkgc29hcGNwcDJfeWFjYy50YWIuaCBzb2FwY3BwMl95YWNjLmgiDQorCQkJCQlPdXRwdXRzPSJzb2FwY3BwMl95YWNjLnRhYi5jIHNvYXBjcHAyX3lhY2MuaCINCisJCQkJLz4NCisJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJPC9GaWxlPg0KKwk8L0ZpbGVzPg0KKwk8R2xvYmFscz4NCisJPC9HbG9iYWxzPg0KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS9zcmMvc29hcGNwcDJfbGV4LmwgYi9zcmMvc29hcGNwcDJfbGV4LmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY5YTJmNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zb2FwY3BwMl9sZXgubApAQCAtMCwwICsxLDg2NCBAQAorLyoKKworc29hcGNwcDJfbGV4LmwKKworRmxleC9MZXggdG9rZW5pemVyLgorCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgcGFydCBvZiB0aGUgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXM6CitHUEwsIHRoZSBnU09BUCBwdWJsaWMgbGljZW5zZSwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIHB1YmxpYyBsaWNlbnNlLgorCitUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBnU09BUCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMworKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCitMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK2h0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9zb2FwbGljZW5zZS5odG1sCitTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAorV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCitmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLgorQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLCBHZW5pdmlhIGluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisleworI2luY2x1ZGUgInNvYXBjcHAyLmgiCisjaW5jbHVkZSAic29hcGNwcDJfeWFjYy5oIgorI2lmZGVmIFdJVEhfQklTT04KK1lZU1RZUEUgc29hcGNwcDJsdmFsOworI3VuZGVmIFlZX0lOUFVUCisjZGVmaW5lIFlZX0lOUFVUKGJ1ZiwgcmVzdWx0LCBtYXhfc2l6ZSkgXAorCXsgXAorCWludCBjID0gZ2V0Yyh5eWluKTsgXAorCXJlc3VsdCA9IChjID09IEVPRikgPyBZWV9OVUxMIDogKGJ1ZlswXSA9IGMsIDEpOyBcCisJfQorI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRVgKKyNkZWZpbmUgTUFYX0lNUE9SVF9ERVBUSCAxNgorc3RhdGljIHN0cnVjdCBpbXBvcnRlZCB7IHN0cnVjdCBpbXBvcnRlZCAqbmV4dDsgY2hhciBuYW1lWzFdOyB9ICppbXBvcnRlZCA9IE5VTEw7CitzdGF0aWMgY2hhciBmbnN0a1tNQVhfSU1QT1JUX0RFUFRIXVsxMDI0XTsKK3N0YXRpYyBpbnQgbG5zdGtbTUFYX0lNUE9SVF9ERVBUSF07CitzdGF0aWMgWVlfQlVGRkVSX1NUQVRFIGluc3RrW01BWF9JTVBPUlRfREVQVEhdOworI2VuZGlmCitpbnQgaW1wb3J0cyA9IDA7CitpbnQgaXNfbW9kdWxlID0gMDsKK3N0YXRpYyBUb2tlbiBpbnN0YWxsX2lkKCk7CitzdGF0aWMgVG9rZW4gaW5zdGFsbF9pbnQoKTsKK3N0YXRpYyBUb2tlbiBpbnN0YWxsX2hleCgpOworc3RhdGljIFRva2VuIGluc3RhbGxfbnVtKCk7CitzdGF0aWMgVG9rZW4gaW5zdGFsbF9jaHIoKTsKK3N0YXRpYyBUb2tlbiBpbnN0YWxsX3N0cigpOworc3RhdGljIFRva2VuIGluc3RhbGxfcHJhZ21hKCk7CitzdGF0aWMgdm9pZCBkaXJlY3RpdmUoKSwgb3B0aW9uKCk7CitzdGF0aWMgVG9rZW4gZXJyb3JfY2hyKCk7CitzdGF0aWMgVG9rZW4gZXJyb3Jfc3RyKCk7CitzdGF0aWMgaW50IGNvbnZjaGFyKGludCopOworc3RhdGljIGludCBoZXhjaGFyKGludCopOworc3RhdGljIGludCBvY3RjaGFyKGludCopOworc3RhdGljIHZvaWQgbW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpLCBpbXBvcnQoY29uc3QgY2hhciAqZmlsZSk7CitzdGF0aWMgdm9pZCBlbmRpbXBvcnQoKTsKK3N0YXRpYyBpbnQgbWFnaWMoY29uc3QgY2hhciAqbmFtZSk7CislfQord3MJCVsgXHRcdlxuXGZcclx4MUFceEEwXQorZGlnaXQJCVswLTldCithbHBoYQkJW2EtekEtWl9dCitzY29wZQkJOjoKK2lkCQl7YWxwaGF9KHthbHBoYX18e2RpZ2l0fXx7c2NvcGV9KSoKK2ludAkJe2RpZ2l0fSsKK2hleAkJMFt4WF1bMC05YS1mQS1GXSsKK251bQkJe2ludH0oXC57aW50fShbRWVdWystXT97aW50fSk/fChcLntpbnR9KT9bRWVdWystXT97aW50fSkKK2NocgkJJyhcXCd8W14nXG5dKSonCitzdHIJCVwiKFxcXCJ8XFxcbnxbXiJdKSpcIgorbW9kdWxlCQkjbW9kdWxle3dzfSp7c3RyfS4qXG4KK2ltcG9ydAkJI2ltcG9ydHt3c30qe3N0cn0uKlxuCitlb2YJCTw8RU9GPj4KKyV4IE1MQ09NTUVOVAorJSUKK3t3c30JCQl7IC8qIHNraXAgd2hpdGUgc3BhY2UgKi8gfQorIi8qIgkJCXsgQkVHSU4oTUxDT01NRU5UKTsgfQorPE1MQ09NTUVOVD4ufFxuCQl7IH0KKzxNTENPTU1FTlQ+IiovIgkJeyBCRUdJTihJTklUSUFMKTsgfQorPE1MQ09NTUVOVD48PEVPRj4+CXsgZXhlY2Vycm9yKCJVbmNsb3NlZCBtdWx0aWxpbmUgY29tbWVudCBhdCB0aGUgZW5kIG9mIGZpbGUiKTsgfQorIi8vZ3NvYXBvcHQiLipcbgl7IG9wdGlvbigpOyB9CisiLy9nc29hcCIuKlxuCQl7IGRpcmVjdGl2ZSgpOyB9CisiLy8iLipcbgkJeyAvKiBza2lwIHNpbmdsZSBsaW5lIGNvbW1lbnQgKi8gfQorIis9IgkJCXsgcmV0dXJuIFBBOyB9CisiLT0iCQkJeyByZXR1cm4gTkE7IH0KKyIqPSIJCQl7IHJldHVybiBUQTsgfQorIi89IgkJCXsgcmV0dXJuIERBOyB9CisiJT0iCQkJeyByZXR1cm4gTUE7IH0KKyImPSIJCQl7IHJldHVybiBBQTsgfQorIl49IgkJCXsgcmV0dXJuIFhBOyB9CisifD0iCQkJeyByZXR1cm4gT0E7IH0KKyI8PD0iCQkJeyByZXR1cm4gTEE7IH0KKyI+Pj0iCQkJeyByZXR1cm4gUkE7IH0KKyJ8fCIJCQl7IHJldHVybiBPUjsgfQorIiYmIgkJCXsgcmV0dXJuIEFOOyB9CisiPT0iCQkJeyByZXR1cm4gRVE7IH0KKyIhPSIJCQl7IHJldHVybiBORTsgfQorIjw9IgkJCXsgcmV0dXJuIExFOyB9CisiPj0iCQkJeyByZXR1cm4gR0U7IH0KKyI8PCIJCQl7IHJldHVybiBMUzsgfQorIj4+IgkJCXsgcmV0dXJuIFJTOyB9CisiKysiCQkJeyByZXR1cm4gUFA7IH0KKyItLSIJCQl7IHJldHVybiBOTjsgfQorIi0+IgkJCXsgcmV0dXJuIEFSOyB9CitbOyw6PXxeJjw+K1wtKi8lIT9+KCl7fVxbXF0uQF0JeyByZXR1cm4geXl0ZXh0WzBdOyB9Cit7aWR9CQkJeyByZXR1cm4gaW5zdGFsbF9pZCgpOyB9Cit7aW50fQkJCXsgcmV0dXJuIGluc3RhbGxfaW50KCk7IH0KK3toZXh9CQkJeyByZXR1cm4gaW5zdGFsbF9oZXgoKTsgfQore251bX0JCQl7IHJldHVybiBpbnN0YWxsX251bSgpOyB9Cit7Y2hyfQkJCXsgcmV0dXJuIGluc3RhbGxfY2hyKCk7IH0KK3tzdHJ9CQkJeyByZXR1cm4gaW5zdGFsbF9zdHIoKTsgfQore21vZHVsZX0JCXsgY2hhciAqcywgYnVmWzEwMjRdOworCQkJICBzID0gc3RyY2hyKHl5dGV4dCwgJyInKTsKKwkJCSAgc3RyY3B5KGJ1ZiwgcysxKTsKKwkJCSAgcyA9IHN0cmNocihidWYsICciJyk7CisJCQkgICpzID0gJ1wwJzsKKwkJCSAgbW9kdWxlKGJ1Zik7CisJCQl9Cit7aW1wb3J0fQkJeyBjaGFyICpzLCBidWZbMTAyNF07CisJCQkgIHMgPSBzdHJjaHIoeXl0ZXh0LCAnIicpOworCQkJICBzdHJjcHkoYnVmLCBzKzEpOworCQkJICBzID0gc3RyY2hyKGJ1ZiwgJyInKTsKKwkJCSAgKnMgPSAnXDAnOworCQkJICBpbXBvcnQoYnVmKTsKKwkJCX0KKyMuKlxuCQkJeyByZXR1cm4gaW5zdGFsbF9wcmFnbWEoKTsgfQorJ1teJ1xuXSovXG4JCXsgcmV0dXJuIGVycm9yX2NocigpOyB9CitcIlteIlxuXSovXG4JCXsgcmV0dXJuIGVycm9yX3N0cigpOyB9CisuCQkJeyBsZXhlcnJvcigiU2tpcHBpbmcgdW5rbm93biBzeW1ib2wiKTsgfQore2VvZn0JCQl7IC8qIGluIGNhc2UgTGV4IGNvbXBsYWlucywgcmVtb3ZlIHRoaXMgbGluZSAqLworI2lmbmRlZiBXSVRIX0xFWAorCQkJICBpZiAoLS1pbXBvcnRzIDwgMCkKKwkJCSAgICB5eXRlcm1pbmF0ZSgpOworCQkJICBlbHNlCisJCQkgIHsgeXlfZGVsZXRlX2J1ZmZlcihZWV9DVVJSRU5UX0JVRkZFUik7CisJCQkgICAgeXlfc3dpdGNoX3RvX2J1ZmZlcihpbnN0a1tpbXBvcnRzXSk7CisJCQkgICAgc3RyY3B5KGZpbGVuYW1lLCBmbnN0a1tpbXBvcnRzXSk7CisJCQkgICAgeXlsaW5lbm8gPSBsbnN0a1tpbXBvcnRzXTsKKwkJCSAgfQorI2VuZGlmCisJCQl9CislJQorCisvKgorCWluc3RhbGxfaWQgLSBsb29rdXAgaWRlbnRpZmllciBpbiBzeW1ib2wgdGFibGUuIElmIGZvdW5kLCByZXR1cm4gdG9rZW4KKwlhbmQgc3ltYm9sIHRhYmxlIGVudHJ5LiBJZiBub3QgZm91bmQsIGNyZWF0ZSBlbnRyeSBpbiBzeW1ib2wgdGFibGUgYW5kCisJcmV0dXJuIElEIHRva2VuLgorKi8gCitzdGF0aWMgVG9rZW4KK2luc3RhbGxfaWQoKQorewlTeW1ib2wgKnAgPSBsb29rdXAoeXl0ZXh0KTsKKwlpZiAoIXApCisJCXAgPSBpbnN0YWxsKHl5dGV4dCwgSUQpOworCXl5bHZhbC5zeW0gPSBwOworCXJldHVybiBwLT50b2tlbjsKK30KKworLyoKKwlpbnN0YWxsX2ludCAtIGNvbnZlcnQgZGlnaXRzIHRvIGludGVnZXIgYW5kIHJldHVybiBMTkcgdG9rZW4uCisqLworc3RhdGljIFRva2VuCitpbnN0YWxsX2ludCgpCit7CisJc3NjYW5mKHl5dGV4dCwgU09BUF9VTE9OR19GT1JNQVQsICZ5eWx2YWwuaSk7CisJcmV0dXJuIExORzsKK30KKworLyoKKwlpbnN0YWxsX2hleCAtIGNvbnZlcnQgaGV4YWRlY2ltYWwgZGlnaXRzIHRvIGludGVnZXIgYW5kIHJldHVybiBMTkcKKyovCitzdGF0aWMgVG9rZW4KK2luc3RhbGxfaGV4KCkKK3sKKwlzc2NhbmYoeXl0ZXh0LCBTT0FQX1hMT05HX0ZPUk1BVCwgJnl5bHZhbC5pKTsKKwlyZXR1cm4gTE5HOworfQorCisvKgorCWluc3RhbGxfbnVtIC0gY29udmVydCBkaWdpdHMgdG8gZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGFuZCByZXR1cm4gREJMCisqLworc3RhdGljIFRva2VuCitpbnN0YWxsX251bSgpCit7CXNzY2FuZih5eXRleHQsICIlbGYiLCAmeXlsdmFsLnIpOworCXJldHVybiBEQkw7Cit9CisKKy8qCisJaW5zdGFsbF9jaHIgLSBjb252ZXJ0IGNoYXJhY3RlciBjb25zdGFudCBhbmQgcmV0dXJuIENIUi4KKyovCitzdGF0aWMgVG9rZW4KK2luc3RhbGxfY2hyKCkKK3sJaW50IGkgPSAyOworCWlmICh5eXRleHRbMV0gPT0gJ1xcJykKKwkJeXlsdmFsLmMgPSBjb252Y2hhcigmaSk7CisJZWxzZQl5eWx2YWwuYyA9IHl5dGV4dFtpLTFdOworCWlmICh5eXRleHRbaV0gIT0gJ1wnJykKKwkJbGV4ZXJyb3IoIklsbGVnYWwgY2hhcmFjdGVyIGNvbnN0YW50Iik7CisJcmV0dXJuIENIUjsKK30KKworLyoKKwlpbnN0YWxsX3N0ciAtIGNvbnZlcnQgYW5kIHN0b3JlIHN0cmluZyBpbiBtZW1vcnkuIFJldHVybiBTVFIuCisqLworc3RhdGljIFRva2VuCitpbnN0YWxsX3N0cigpCit7CWludCBpLCBqID0gMDsKKwl5eWx2YWwucyA9IGVtYWxsb2MoeXlsZW5nLTEpOwkvKiB5eWxlbmcgPSBsZW5ndGgoeXl0ZXh0KSAqLworCWZvciAoaSA9IDE7IGkgPCB5eWxlbmctMTsgaSsrKQorCQlpZiAoeXl0ZXh0W2ldID09ICdcXCcpCisJCXsJaWYgKHl5dGV4dFsrK2ldICE9ICdcbicpCisJCQl7CXl5bHZhbC5zW2orK10gPSBjb252Y2hhcigmaSk7CisJCQkJaS0tOworCQkJfQorCQl9CisJCWVsc2UKKwkJCXl5bHZhbC5zW2orK10gPSB5eXRleHRbaV07CisJeXlsdmFsLnNbal0gPSAnXDAnOworCXJldHVybiBTVFI7Cit9CisKKy8qCisJaW5zdGFsbF9wcmFnbWEgLSBzdG9yZSBwcmFnbWEgaW4gc3RyaW5nLiBSZXR1cm4gUFJBR01BLgorKi8KK3N0YXRpYyBUb2tlbgoraW5zdGFsbF9wcmFnbWEoKQorewl5eWx2YWwucyA9IGVtYWxsb2MoeXlsZW5nKTsJLyogeXlsZW5nID0gbGVuZ3RoKHl5dGV4dCkgKi8KKwlzdHJuY3B5KHl5bHZhbC5zLCB5eXRleHQsIHN0cmxlbih5eXRleHQpLTEpOworCXl5bHZhbC5zW3N0cmxlbih5eXRleHQpLTFdID0gJ1wwJzsKKwlyZXR1cm4gUFJBR01BOworfQorCitzdGF0aWMgdm9pZCBkaXJlY3RpdmUoKQorewlpbnQgaSwgaiwgazsKKwljaGFyICpzOworCVNlcnZpY2UgKnNwOworCU1ldGhvZCAqbTsKKwlEYXRhICpkOworCWludCBzZXJ2aWNlOworCWZvciAoaSA9IDc7IHl5dGV4dFtpXTsgaSsrKQorCQlpZiAoeXl0ZXh0W2ldID4gMzIpCisJCQlicmVhazsKKwlmb3IgKGogPSBpOyB5eXRleHRbal07IGorKykKKwkJaWYgKHl5dGV4dFtqXSA8PSAzMikKKwkJCWJyZWFrOworCWlmIChpID09IGopCisJCXJldHVybjsKKwlzID0gKGNoYXIqKWVtYWxsb2Moai1pKzEpOworCXN0cm5jcHkocywgeXl0ZXh0K2ksIGotaSk7CisJc1tqLWldID0gJ1wwJzsKKwlmb3IgKHNwID0gc2VydmljZXM7IHNwOyBzcCA9IHNwLT5uZXh0KQorCQlpZiAoIXN0cmNtcChzcC0+bnMsIHMpKQorCQkJYnJlYWs7CisJaWYgKCFzcCkKKwl7CXNwID0gKFNlcnZpY2UqKWVtYWxsb2Moc2l6ZW9mKFNlcnZpY2UpKTsKKwkJc3AtPm5leHQgPSBzZXJ2aWNlczsKKwkJc3AtPm5zID0gczsKKwkJc3AtPm5hbWUgPSBOVUxMOworCQlzcC0+cG9ydCA9IE5VTEw7CisJCXNwLT5iaW5kaW5nID0gTlVMTDsKKwkJc3AtPmRlZmluaXRpb25zID0gTlVMTDsKKwkJc3AtPnRyYW5zcG9ydCA9IE5VTEw7CisJCXNwLT5VUkwgPSBOVUxMOworCQlzcC0+VVJJID0gTlVMTDsKKwkJc3AtPldTREwgPSBOVUxMOworCQlzcC0+c3R5bGUgPSBOVUxMOworCQlzcC0+ZW5jb2RpbmcgPSBOVUxMOworCQlzcC0+ZWxlbWVudEZvcm0gPSBOVUxMOworCQlzcC0+YXR0cmlidXRlRm9ybSA9IE5VTEw7CisJCXNwLT5leGVjdXRhYmxlID0gTlVMTDsKKwkJc3AtPmltcG9ydCA9IE5VTEw7CisJCXNwLT5kb2N1bWVudGF0aW9uID0gTlVMTDsKKwkJc3AtPmxpc3QgPSBOVUxMOworCQlzcC0+ZGF0YSA9IE5VTEw7CisJCXNlcnZpY2VzID0gc3A7CisJfQorCWZvciAoaSA9IGo7IHl5dGV4dFtpXTsgaSsrKQorCQlpZiAoeXl0ZXh0W2ldID4gMzIpCisJCQlicmVhazsKKwlpZiAoIXN0cm5jbXAoeXl0ZXh0K2ksICJzZXJ2aWNlIiwgNykgfHwgIXN0cm5jbXAoeXl0ZXh0K2ksICJzY2hlbWEiLCA2KSkKKwl7CXNlcnZpY2UgPSBzdHJuY21wKHl5dGV4dCtpLCAic2NoZW1hIiwgNik7CisJCWZvciAoaSArPSA3OyB5eXRleHRbaV07IGkrKykKKwkJCWlmICh5eXRleHRbaV0gPiAzMikKKwkJCQlicmVhazsKKwkJZm9yIChqID0gaTsgeXl0ZXh0W2pdOyBqKyspCisJCQlpZiAoeXl0ZXh0W2pdIDw9IDMyKQorCQkJCWJyZWFrOworCQlmb3IgKDsgeXl0ZXh0W2pdOyBqKyspCisJCQlpZiAoeXl0ZXh0W2pdID4gMzIpCisJCQkJYnJlYWs7CisJCWZvciAoayA9IGo7IHl5dGV4dFtrXTsgaysrKQorCQkJaWYgKHl5dGV4dFtrXSA8PSAzMikKKwkJCQlicmVhazsKKwkJaWYgKGogPT0gaykKKwkJCXJldHVybjsKKwkJcyA9IChjaGFyKillbWFsbG9jKGstaisxKTsKKwkJc3RybmNweShzLCB5eXRleHQraiwgay1qKTsKKwkJc1trLWpdID0gJ1wwJzsKKwkJaWYgKCFzdHJuY21wKHl5dGV4dCtpLCAibmFtZToiLCA1KSkKKwkJewlzcC0+bmFtZSA9IHM7CisJCQlmb3IgKGogPSBrOyB5eXRleHRbal07IGorKykKKwkJCQlpZiAoeXl0ZXh0W2pdID4gMzIpCisJCQkJCWJyZWFrOworCQkJZm9yIChrID0gajsgeXl0ZXh0W2tdOyBrKyspCisJCQkJaWYgKHl5dGV4dFtrXSA9PSAxMCB8fCB5eXRleHRba10gPT0gMTMpCisJCQkJCWJyZWFrOworCQkJaWYgKGogPT0gaykKKwkJCQlyZXR1cm47CisJCQlzID0gKGNoYXIqKWVtYWxsb2Moay1qKzEpOworCQkJc3RybmNweShzLCB5eXRleHQraiwgay1qKTsKKwkJCXNbay1qXSA9ICdcMCc7CisJCQlzcC0+ZG9jdW1lbnRhdGlvbiA9IHM7CisJCX0KKwkJZWxzZSBpZiAoIXN0cm5jbXAoeXl0ZXh0K2ksICJ0eXBlOiIsIDUpKQorCQkJc3AtPnBvcnQgPSBzOworCQllbHNlIGlmICghc3RybmNtcCh5eXRleHQraSwgInBvcnRUeXBlOiIsIDkpKQorCQkJc3AtPnBvcnQgPSBzOworCQllbHNlIGlmICghc3RybmNtcCh5eXRleHQraSwgImJpbmRpbmc6IiwgOCkpCisJCQlzcC0+YmluZGluZyA9IHM7CisJCWVsc2UgaWYgKCFzdHJuY21wKHl5dGV4dCtpLCAiZGVmaW5pdGlvbnM6IiwgMTIpKQorCQkJc3AtPmRlZmluaXRpb25zID0gczsKKwkJZWxzZSBpZiAoIXN0cm5jbXAoeXl0ZXh0K2ksICJkb2N1bWVudGF0aW9uOiIsIDE0KSkKKwkJewlmb3IgKGsgPSBqOyB5eXRleHRba107IGsrKykKKwkJCQlpZiAoeXl0ZXh0W2tdID09IDEwIHx8IHl5dGV4dFtrXSA9PSAxMykKKwkJCQkJYnJlYWs7CisJCQlpZiAoaiA9PSBrKQorCQkJCXJldHVybjsKKwkJCXMgPSAoY2hhciopZW1hbGxvYyhrLWorMSk7CisJCQlzdHJuY3B5KHMsIHl5dGV4dCtqLCBrLWopOworCQkJc1trLWpdID0gJ1wwJzsKKwkJCXNwLT5kb2N1bWVudGF0aW9uID0gczsKKwkJfQorCQllbHNlIGlmICghc3RybmNtcCh5eXRleHQraSwgInRyYW5zcG9ydDoiLCAxMCkpCisJCQlzcC0+dHJhbnNwb3J0ID0gczsKKwkJZWxzZSBpZiAoIXN0cm5jbXAoeXl0ZXh0K2ksICJsb2NhdGlvbjoiLCA5KSB8fCAhc3RybmNtcCh5eXRleHQraSwgInBvcnQ6IiwgNSkpCisJCQlzcC0+VVJMID0gczsKKwkJZWxzZSBpZiAoIXN0cm5jbXAoeXl0ZXh0K2ksICJleGVjdXRhYmxlOiIsIDExKSkKKwkJCXNwLT5leGVjdXRhYmxlID0gczsKKwkJZWxzZSBpZiAoIXN0cm5jbXAoeXl0ZXh0K2ksICJuYW1lc3BhY2U6IiwgMTApKQorCQl7CWlmIChzZXJ2aWNlKQorCQkJewlpZiAoIXNwLT5VUkkpCisJCQkJCXNwLT5VUkkgPSBzOworCQkJCXNwLT5XU0RMID0gczsKKwkJCX0KKwkJCWVsc2UgaWYgKCFzdHJjbXAoc3AtPm5zLCAiU09BUC1FTlYiKSkKKwkJCQlzcC0+VVJJID0gZW52VVJJID0gczsKKwkJCWVsc2UgaWYgKCFzdHJjbXAoc3AtPm5zLCAiU09BUC1FTkMiKSkKKwkJCQlzcC0+VVJJID0gZW5jVVJJID0gczsKKwkJCWVsc2UKKwkJCQlzcC0+VVJJID0gczsKKwkJfQorCQllbHNlIGlmICghc3RybmNtcCh5eXRleHQraSwgImZvcm06IiwgNSkpCisJCXsJc3AtPmVsZW1lbnRGb3JtID0gczsKKwkJCXNwLT5hdHRyaWJ1dGVGb3JtID0gczsKKwkJfQorCQllbHNlIGlmICghc3RybmNtcCh5eXRleHQraSwgImVsZW1lbnRGb3JtOiIsIDEyKSkKKwkJCXNwLT5lbGVtZW50Rm9ybSA9IHM7CisJCWVsc2UgaWYgKCFzdHJuY21wKHl5dGV4dCtpLCAiYXR0cmlidXRlRm9ybToiLCAxNCkpCisJCQlzcC0+YXR0cmlidXRlRm9ybSA9IHM7CisJCWVsc2UgaWYgKCFzdHJuY21wKHl5dGV4dCtpLCAiaW1wb3J0OiIsIDcpKQorCQl7CWlmICghc3AtPlVSSSkKKwkJCQlzcC0+VVJJID0gczsKKwkJCXNwLT5pbXBvcnQgPSBzOworCQl9CisJCWVsc2UgaWYgKCFzdHJuY21wKHl5dGV4dCtpLCAiZW5jb2Rpbmc6IiwgOSkpCisJCXsJaWYgKCFzdHJjbXAocywgImVuY29kZWQiKSkKKwkJCQlzcC0+ZW5jb2RpbmcgPSAiIjsKKwkJCWVsc2UKKwkJCQlzcC0+ZW5jb2RpbmcgPSBzOworCQl9CisJCWVsc2UgaWYgKCFzdHJuY21wKHl5dGV4dCtpLCAic3R5bGU6IiwgNikpCisJCQlzcC0+c3R5bGUgPSBzOworCQllbHNlIGlmICghc3RybmNtcCh5eXRleHQraSwgIm1ldGhvZC1zdHlsZToiLCAxMykpCisJCXsJbSA9IChNZXRob2QqKWVtYWxsb2Moc2l6ZW9mKE1ldGhvZCkpOworCQkJbS0+bmFtZSA9IHM7CisJCQltLT5tZXNzID0gU1RZTEU7CisJCQltLT5wYXJ0ID0gTlVMTDsKKwkJCW0tPm5leHQgPSBzcC0+bGlzdDsKKwkJCXNwLT5saXN0ID0gbTsKKwkJCWZvciAoaiA9IGs7IHl5dGV4dFtqXTsgaisrKQorCQkJCWlmICh5eXRleHRbal0gPiAzMikKKwkJCQkJYnJlYWs7CisJCQlmb3IgKGsgPSBqOyB5eXRleHRba107IGsrKykKKwkJCQlpZiAoeXl0ZXh0W2tdID09IDEwIHx8IHl5dGV4dFtrXSA9PSAxMykKKwkJCQkJYnJlYWs7CisJCQlpZiAoaiA9PSBrKQorCQkJCXJldHVybjsKKwkJCXMgPSAoY2hhciopZW1hbGxvYyhrLWorMSk7CisJCQlzdHJuY3B5KHMsIHl5dGV4dCtqLCBrLWopOworCQkJc1trLWpdID0gJ1wwJzsKKwkJCW0tPnBhcnQgPSBzOworCQl9CisJCWVsc2UgaWYgKCFzdHJuY21wKHl5dGV4dCtpLCAibWV0aG9kLWVuY29kaW5nOiIsIDE2KSkKKwkJewltID0gKE1ldGhvZCopZW1hbGxvYyhzaXplb2YoTWV0aG9kKSk7CisJCQltLT5uYW1lID0gczsKKwkJCW0tPm1lc3MgPSBFTkNPRElORzsKKwkJCW0tPnBhcnQgPSBOVUxMOworCQkJbS0+bmV4dCA9IHNwLT5saXN0OworCQkJc3AtPmxpc3QgPSBtOworCQkJZm9yIChqID0gazsgeXl0ZXh0W2pdOyBqKyspCisJCQkJaWYgKHl5dGV4dFtqXSA+IDMyKQorCQkJCQlicmVhazsKKwkJCWZvciAoayA9IGo7IHl5dGV4dFtrXTsgaysrKQorCQkJCWlmICh5eXRleHRba10gPT0gMTAgfHwgeXl0ZXh0W2tdID09IDEzKQorCQkJCQlicmVhazsKKwkJCWlmIChqID09IGspCisJCQkJcmV0dXJuOworCQkJcyA9IChjaGFyKillbWFsbG9jKGstaisxKTsKKwkJCXN0cm5jcHkocywgeXl0ZXh0K2osIGstaik7CisJCQlzW2stal0gPSAnXDAnOworCQkgCWlmIChzdHJjbXAocywgImVuY29kZWQiKSkKKwkJCQltLT5wYXJ0ID0gczsKKwkJCWVsc2UKKwkJCQltLT5wYXJ0ID0gIiI7CisJCX0KKwkJZWxzZSBpZiAoIXN0cm5jbXAoeXl0ZXh0K2ksICJtZXRob2QtcmVzcG9uc2UtZW5jb2Rpbmc6IiwgMjUpKQorCQl7CW0gPSAoTWV0aG9kKillbWFsbG9jKHNpemVvZihNZXRob2QpKTsKKwkJCW0tPm5hbWUgPSBzOworCQkJbS0+bWVzcyA9IFJFU1BPTlNFX0VOQ09ESU5HOworCQkJbS0+cGFydCA9IE5VTEw7CisJCQltLT5uZXh0ID0gc3AtPmxpc3Q7CisJCQlzcC0+bGlzdCA9IG07CisJCQlmb3IgKGogPSBrOyB5eXRleHRbal07IGorKykKKwkJCQlpZiAoeXl0ZXh0W2pdID4gMzIpCisJCQkJCWJyZWFrOworCQkJZm9yIChrID0gajsgeXl0ZXh0W2tdOyBrKyspCisJCQkJaWYgKHl5dGV4dFtrXSA9PSAxMCB8fCB5eXRleHRba10gPT0gMTMpCisJCQkJCWJyZWFrOworCQkJaWYgKGogPT0gaykKKwkJCQlyZXR1cm47CisJCQlzID0gKGNoYXIqKWVtYWxsb2Moay1qKzEpOworCQkJc3RybmNweShzLCB5eXRleHQraiwgay1qKTsKKwkJCXNbay1qXSA9ICdcMCc7CisJCSAJaWYgKHN0cmNtcChzLCAiZW5jb2RlZCIpKQorCQkJCW0tPnBhcnQgPSBzOworCQkJZWxzZQorCQkJCW0tPnBhcnQgPSAiIjsKKwkJfQorCQllbHNlIGlmICghc3RybmNtcCh5eXRleHQraSwgIm1ldGhvZC1kb2N1bWVudGF0aW9uOiIsIDIxKSkKKwkJewltID0gKE1ldGhvZCopZW1hbGxvYyhzaXplb2YoTWV0aG9kKSk7CisJCQltLT5uYW1lID0gczsKKwkJCW0tPm1lc3MgPSBDT01NRU5UOworCQkJbS0+cGFydCA9IE5VTEw7CisJCQltLT5uZXh0ID0gc3AtPmxpc3Q7CisJCQlzcC0+bGlzdCA9IG07CisJCQlmb3IgKGogPSBrOyB5eXRleHRbal07IGorKykKKwkJCQlpZiAoeXl0ZXh0W2pdID4gMzIpCisJCQkJCWJyZWFrOworCQkJZm9yIChrID0gajsgeXl0ZXh0W2tdOyBrKyspCisJCQkJaWYgKHl5dGV4dFtrXSA9PSAxMCB8fCB5eXRleHRba10gPT0gMTMpCisJCQkJCWJyZWFrOworCQkJaWYgKGogPT0gaykKKwkJCQlyZXR1cm47CisJCQlzID0gKGNoYXIqKWVtYWxsb2Moay1qKzEpOworCQkJc3RybmNweShzLCB5eXRleHQraiwgay1qKTsKKwkJCXNbay1qXSA9ICdcMCc7CisJCQltLT5wYXJ0ID0gczsKKwkJfQorCQllbHNlIGlmICghc3RybmNtcCh5eXRleHQraSwgIm1ldGhvZC1hY3Rpb246IiwgMTQpKQorCQl7CW0gPSAoTWV0aG9kKillbWFsbG9jKHNpemVvZihNZXRob2QpKTsKKwkJCW0tPm5hbWUgPSBzOworCQkJbS0+bWVzcyA9IEFDVElPTjsKKwkJCW0tPnBhcnQgPSBOVUxMOworCQkJbS0+bmV4dCA9IHNwLT5saXN0OworCQkJc3AtPmxpc3QgPSBtOworCQkJZm9yIChqID0gazsgeXl0ZXh0W2pdOyBqKyspCisJCQkJaWYgKHl5dGV4dFtqXSA+IDMyKQorCQkJCQlicmVhazsKKwkJCWZvciAoayA9IGo7IHl5dGV4dFtrXTsgaysrKQorCQkJCWlmICh5eXRleHRba10gPD0gMzIpCisJCQkJCWJyZWFrOworCQkJaWYgKGogPT0gaykKKwkJCQlyZXR1cm47CisJCQlzID0gKGNoYXIqKWVtYWxsb2Moay1qKzEpOworCQkJc3RybmNweShzLCB5eXRleHQraiwgay1qKTsKKwkJCXNbay1qXSA9ICdcMCc7CisJCQltLT5wYXJ0ID0gczsKKwkJfQorCQllbHNlIGlmICghc3RybmNtcCh5eXRleHQraSwgIm1ldGhvZC1taW1lLXR5cGU6IiwgMTcpKQorCQl7CW0gPSAoTWV0aG9kKillbWFsbG9jKHNpemVvZihNZXRob2QpKTsKKwkJCW0tPm5hbWUgPSBzOworCQkJbS0+bWVzcyA9IE1JTUVJTiB8IE1JTUVPVVQ7CisJCQltLT5wYXJ0ID0gTlVMTDsKKwkJCW0tPm5leHQgPSBzcC0+bGlzdDsKKwkJCXNwLT5saXN0ID0gbTsKKwkJCWZvciAoaiA9IGs7IHl5dGV4dFtqXTsgaisrKQorCQkJCWlmICh5eXRleHRbal0gPiAzMikKKwkJCQkJYnJlYWs7CisJCQlmb3IgKGsgPSBqOyB5eXRleHRba107IGsrKykKKwkJCQlpZiAoeXl0ZXh0W2tdIDw9IDMyKQorCQkJCQlicmVhazsKKwkJCWlmIChqID09IGspCisJCQkJcmV0dXJuOworCQkJcyA9IChjaGFyKillbWFsbG9jKGstaisxKTsKKwkJCXN0cm5jcHkocywgeXl0ZXh0K2osIGstaik7CisJCQlzW2stal0gPSAnXDAnOworCQkJbS0+cGFydCA9IHM7CisJCX0KKwkJZWxzZSBpZiAoIXN0cm5jbXAoeXl0ZXh0K2ksICJtZXRob2QtaW5wdXQtbWltZS10eXBlOiIsIDIzKSkKKwkJewltID0gKE1ldGhvZCopZW1hbGxvYyhzaXplb2YoTWV0aG9kKSk7CisJCQltLT5uYW1lID0gczsKKwkJCW0tPm1lc3MgPSBNSU1FSU47CisJCQltLT5wYXJ0ID0gTlVMTDsKKwkJCW0tPm5leHQgPSBzcC0+bGlzdDsKKwkJCXNwLT5saXN0ID0gbTsKKwkJCWZvciAoaiA9IGs7IHl5dGV4dFtqXTsgaisrKQorCQkJCWlmICh5eXRleHRbal0gPiAzMikKKwkJCQkJYnJlYWs7CisJCQlmb3IgKGsgPSBqOyB5eXRleHRba107IGsrKykKKwkJCQlpZiAoeXl0ZXh0W2tdIDw9IDMyKQorCQkJCQlicmVhazsKKwkJCWlmIChqID09IGspCisJCQkJcmV0dXJuOworCQkJcyA9IChjaGFyKillbWFsbG9jKGstaisxKTsKKwkJCXN0cm5jcHkocywgeXl0ZXh0K2osIGstaik7CisJCQlzW2stal0gPSAnXDAnOworCQkJbS0+cGFydCA9IHM7CisJCX0KKwkJZWxzZSBpZiAoIXN0cm5jbXAoeXl0ZXh0K2ksICJtZXRob2Qtb3V0cHV0LW1pbWUtdHlwZToiLCAyNCkpCisJCXsJbSA9IChNZXRob2QqKWVtYWxsb2Moc2l6ZW9mKE1ldGhvZCkpOworCQkJbS0+bmFtZSA9IHM7CisJCQltLT5tZXNzID0gTUlNRU9VVDsKKwkJCW0tPnBhcnQgPSBOVUxMOworCQkJbS0+bmV4dCA9IHNwLT5saXN0OworCQkJc3AtPmxpc3QgPSBtOworCQkJZm9yIChqID0gazsgeXl0ZXh0W2pdOyBqKyspCisJCQkJaWYgKHl5dGV4dFtqXSA+IDMyKQorCQkJCQlicmVhazsKKwkJCWZvciAoayA9IGo7IHl5dGV4dFtrXTsgaysrKQorCQkJCWlmICh5eXRleHRba10gPD0gMzIpCisJCQkJCWJyZWFrOworCQkJaWYgKGogPT0gaykKKwkJCQlyZXR1cm47CisJCQlzID0gKGNoYXIqKWVtYWxsb2Moay1qKzEpOworCQkJc3RybmNweShzLCB5eXRleHQraiwgay1qKTsKKwkJCXNbay1qXSA9ICdcMCc7CisJCQltLT5wYXJ0ID0gczsKKwkJfQorCQllbHNlIGlmICghc3RybmNtcCh5eXRleHQraSwgIm1ldGhvZC1oZWFkZXItcGFydDoiLCAxOSkpCisJCXsJbSA9IChNZXRob2QqKWVtYWxsb2Moc2l6ZW9mKE1ldGhvZCkpOworCQkJbS0+bmFtZSA9IHM7CisJCQltLT5tZXNzID0gSERSSU4gfCBIRFJPVVQ7CisJCQltLT5wYXJ0ID0gTlVMTDsKKwkJCW0tPm5leHQgPSBzcC0+bGlzdDsKKwkJCXNwLT5saXN0ID0gbTsKKwkJCWZvciAoaiA9IGs7IHl5dGV4dFtqXTsgaisrKQorCQkJCWlmICh5eXRleHRbal0gPiAzMikKKwkJCQkJYnJlYWs7CisJCQlmb3IgKGsgPSBqOyB5eXRleHRba107IGsrKykKKwkJCQlpZiAoeXl0ZXh0W2tdIDw9IDMyKQorCQkJCQlicmVhazsKKwkJCWlmIChqID09IGspCisJCQkJcmV0dXJuOworCQkJcyA9IChjaGFyKillbWFsbG9jKGstaisxKTsKKwkJCXN0cm5jcHkocywgeXl0ZXh0K2osIGstaik7CisJCQlzW2stal0gPSAnXDAnOworCQkJbS0+cGFydCA9IHM7CisJCX0KKwkJZWxzZSBpZiAoIXN0cm5jbXAoeXl0ZXh0K2ksICJtZXRob2QtaW5wdXQtaGVhZGVyLXBhcnQ6IiwgMjUpKQorCQl7CW0gPSAoTWV0aG9kKillbWFsbG9jKHNpemVvZihNZXRob2QpKTsKKwkJCW0tPm5hbWUgPSBzOworCQkJbS0+bWVzcyA9IEhEUklOOworCQkJbS0+cGFydCA9IE5VTEw7CisJCQltLT5uZXh0ID0gc3AtPmxpc3Q7CisJCQlzcC0+bGlzdCA9IG07CisJCQlmb3IgKGogPSBrOyB5eXRleHRbal07IGorKykKKwkJCQlpZiAoeXl0ZXh0W2pdID4gMzIpCisJCQkJCWJyZWFrOworCQkJZm9yIChrID0gajsgeXl0ZXh0W2tdOyBrKyspCisJCQkJaWYgKHl5dGV4dFtrXSA8PSAzMikKKwkJCQkJYnJlYWs7CisJCQlpZiAoaiA9PSBrKQorCQkJCXJldHVybjsKKwkJCXMgPSAoY2hhciopZW1hbGxvYyhrLWorMSk7CisJCQlzdHJuY3B5KHMsIHl5dGV4dCtqLCBrLWopOworCQkJc1trLWpdID0gJ1wwJzsKKwkJCW0tPnBhcnQgPSBzOworCQl9CisJCWVsc2UgaWYgKCFzdHJuY21wKHl5dGV4dCtpLCAibWV0aG9kLW91dHB1dC1oZWFkZXItcGFydDoiLCAyNikpCisJCXsJbSA9IChNZXRob2QqKWVtYWxsb2Moc2l6ZW9mKE1ldGhvZCkpOworCQkJbS0+bmFtZSA9IHM7CisJCQltLT5tZXNzID0gSERST1VUOworCQkJbS0+cGFydCA9IE5VTEw7CisJCQltLT5uZXh0ID0gc3AtPmxpc3Q7CisJCQlzcC0+bGlzdCA9IG07CisJCQlmb3IgKGogPSBrOyB5eXRleHRbal07IGorKykKKwkJCQlpZiAoeXl0ZXh0W2pdID4gMzIpCisJCQkJCWJyZWFrOworCQkJZm9yIChrID0gajsgeXl0ZXh0W2tdOyBrKyspCisJCQkJaWYgKHl5dGV4dFtrXSA8PSAzMikKKwkJCQkJYnJlYWs7CisJCQlpZiAoaiA9PSBrKQorCQkJCXJldHVybjsKKwkJCXMgPSAoY2hhciopZW1hbGxvYyhrLWorMSk7CisJCQlzdHJuY3B5KHMsIHl5dGV4dCtqLCBrLWopOworCQkJc1trLWpdID0gJ1wwJzsKKwkJCW0tPnBhcnQgPSBzOworCQl9CisJCWVsc2UgaWYgKCFzdHJuY21wKHl5dGV4dCtpLCAibWV0aG9kLWZhdWx0OiIsIDEzKSkKKwkJewltID0gKE1ldGhvZCopZW1hbGxvYyhzaXplb2YoTWV0aG9kKSk7CisJCQltLT5uYW1lID0gczsKKwkJCW0tPm1lc3MgPSBGQVVMVDsKKwkJCW0tPnBhcnQgPSBOVUxMOworCQkJbS0+bmV4dCA9IHNwLT5saXN0OworCQkJc3AtPmxpc3QgPSBtOworCQkJZm9yIChqID0gazsgeXl0ZXh0W2pdOyBqKyspCisJCQkJaWYgKHl5dGV4dFtqXSA+IDMyKQorCQkJCQlicmVhazsKKwkJCWZvciAoayA9IGo7IHl5dGV4dFtrXTsgaysrKQorCQkJCWlmICh5eXRleHRba10gPD0gMzIpCisJCQkJCWJyZWFrOworCQkJaWYgKGogPT0gaykKKwkJCQlyZXR1cm47CisJCQlzID0gKGNoYXIqKWVtYWxsb2Moay1qKzEpOworCQkJc3RybmNweShzLCB5eXRleHQraiwgay1qKTsKKwkJCXNbay1qXSA9ICdcMCc7CisJCQltLT5wYXJ0ID0gczsKKwkJfQorCQllbHNlIGlmICghc3RybmNtcCh5eXRleHQraSwgInR5cGUtZG9jdW1lbnRhdGlvbjoiLCAxOSkpCisJCXsJZCA9IChEYXRhKillbWFsbG9jKHNpemVvZihEYXRhKSk7CisJCQlkLT5uYW1lID0gczsKKwkJCWQtPnBhcnQgPSBOVUxMOworCQkJZC0+bmV4dCA9IHNwLT5kYXRhOworCQkJc3AtPmRhdGEgPSBkOworCQkJZm9yIChqID0gazsgeXl0ZXh0W2pdOyBqKyspCisJCQkJaWYgKHl5dGV4dFtqXSA+IDMyKQorCQkJCQlicmVhazsKKwkJCWZvciAoayA9IGo7IHl5dGV4dFtrXTsgaysrKQorCQkJCWlmICh5eXRleHRba10gPT0gMTAgfHwgeXl0ZXh0W2tdID09IDEzKQorCQkJCQlicmVhazsKKwkJCWlmIChqID09IGspCisJCQkJcmV0dXJuOworCQkJcyA9IChjaGFyKillbWFsbG9jKGstaisxKTsKKwkJCXN0cm5jcHkocywgeXl0ZXh0K2osIGstaik7CisJCQlzW2stal0gPSAnXDAnOworCQkJZC0+cGFydCA9IHM7CisJCX0KKwkJZWxzZQorICAgICAgICAgICAgICAgIHsJc3ByaW50ZihlcnJidWYsICJ1bnJlY29nbml6ZWQgZ3NvYXAgZGlyZWN0aXZlOiAlcyIsIHl5dGV4dCtpKTsKKwkJCXNlbXdhcm4oZXJyYnVmKTsKKwkJfQorCX0KKwllbHNlCisgICAgICAgIHsJc3ByaW50ZihlcnJidWYsICJ1bnJlY29nbml6ZWQgZ3NvYXAgZGlyZWN0aXZlOiAlcyIsIHl5dGV4dCk7CisJCXNlbXdhcm4oZXJyYnVmKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9wdGlvbigpCit7CWludCBpOworCWlmIChpbXBvcnRzKQorICAgICAgICB7CXNwcmludGYoZXJyYnVmLCAib3B0aW9ucyBkaXJlY3RpdmU6ICVzIGlnbm9yZWQgaW4gaW1wb3J0ZWQgZmlsZShzKSIsIHl5dGV4dCk7CisJCXNlbXdhcm4oZXJyYnVmKTsKKwkJcmV0dXJuOworCX0KKwlmb3IgKGkgPSAxMDsgeXl0ZXh0W2ldOyBpKyspCisJCWlmICh5eXRleHRbaV0gPiAzMikKKwkJCWJyZWFrOworCWZvciAoOyB5eXRleHRbaV07IGkrKykKKwkJc3dpdGNoICh5eXRleHRbaV0pCisJCXsJY2FzZSAnYyc6CisJCQkJY2ZsYWcgPSAxOworCQkJCWJyZWFrOworCQkgCWNhc2UgJ2UnOgorCQkJCWVmbGFnID0gMTsKKwkJCQlicmVhazsKKwkJIAljYXNlICduJzoKKwkJCQluZmxhZyA9IDE7CisJCQkJYnJlYWs7CisJCSAJY2FzZSAnbCc6CisJCQkJbGZsYWcgPSAxOworCQkJCWJyZWFrOworCQkgCWNhc2UgJ3cnOgorCQkJCXdmbGFnID0gMTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJaWYgKHl5dGV4dFtpXSA8PSAzMikKKwkJCQkJcmV0dXJuOworCQl9Cit9CisKKy8qCisJZXJyb3JfY2hyIC0gbGV4aWNhbCBlcnJvciBpbiBjaGFyYWN0ZXIgY29uc3RhbnQuIFJldHVybiBjaGFyYWN0ZXIgMCB0bworCWFsbG93IHBhcnNpbmcgdG8gY29udGludWUKKyovCitzdGF0aWMgVG9rZW4KK2Vycm9yX2NocigpCit7CWxleGVycm9yKCJFbmRpbmctJyBtaXNzaW5nIGluIGNoYXJhY3RlciBjb25zdGFudCIpOworCXl5bHZhbC5jID0gJ1wwJzsKKwlyZXR1cm4gQ0hSOworfQorCisvKgorCWVycm9yX3N0ciAtIGxleGljYWwgZXJyb3IgaW4gc3RyaW5nLiBSZXR1cm4gZW1wdHkgc3RyaW5nIHRvIGFsbG93CisJcGFyc2luZyB0byBjb250aW51ZQorKi8KK3N0YXRpYyBUb2tlbgorZXJyb3Jfc3RyKCkKK3sJbGV4ZXJyb3IoIkVuZGluZy1cIiBtaXNzaW5nIGluIHN0cmluZyIpOworCXl5bHZhbC5zID0gIiI7CisJcmV0dXJuIFNUUjsKK30KKworLyoKKwlDaGFyYWN0ZXIgY29udmVyc2lvbiBmdW5jdGlvbnMKKyovCitzdGF0aWMgaW50Citjb252Y2hhcihpbnQgKnApCit7CXN3aXRjaCAoeXl0ZXh0WygqcCkrK10pCisJewljYXNlICdhJzoJcmV0dXJuICdcYSc7CisJCWNhc2UgJ2InOglyZXR1cm4gJ1xiJzsKKwkJY2FzZSAnZic6CXJldHVybiAnXGYnOworCQljYXNlICduJzoJcmV0dXJuICdcbic7CisJCWNhc2UgJ3InOglyZXR1cm4gJ1xyJzsKKwkJY2FzZSAndCc6CXJldHVybiAnXHQnOworCQljYXNlICd2JzoJcmV0dXJuICdcdic7CisJCWNhc2UgJ3gnOglyZXR1cm4gaGV4Y2hhcihwKTsKKwkJY2FzZSAnMCc6CisJCWNhc2UgJzEnOgorCQljYXNlICcyJzoKKwkJY2FzZSAnMyc6CisJCWNhc2UgJzQnOgorCQljYXNlICc1JzoKKwkJY2FzZSAnNic6CisJCWNhc2UgJzcnOgkoKnApLS07CisJCQkJcmV0dXJuIG9jdGNoYXIocCk7CisJCWRlZmF1bHQ6CXJldHVybiB5eXRleHRbKnAtMV07CisJfQorfQorCitzdGF0aWMgaW50CitoZXhjaGFyKGludCAqcCkKK3sJaW50IGksIGQsIGMgPSAwOworCWZvciAoaSA9IDA7IGlzeGRpZ2l0KGQgPSB5eXRleHRbKnBdKSAmJiBpIDwgMjsgaSsrKQorCXsJYyA9IChjIDw8IDQpICsgKGQgPD0gJzknID8gZCAtICcwJyA6IHRvdXBwZXIoZCkgLSAnNycpOworCQkoKnApKys7CisJfQorCXJldHVybiBjOworfQorCitzdGF0aWMgaW50CitvY3RjaGFyKGludCAqcCkKK3sJaW50IGksIGQsIGMgPSAwOworCWZvciAoaSA9IDA7IChkID0geXl0ZXh0WypwXSkgPj0gJzAnICYmIGQgPD0gJzcnICYmIGkgPCAzOyBpKyspCisJewljID0gKGMgPDwgMykgKyBkIC0gJzAnOworCQkoKnApKys7CisJfQorCXJldHVybiBjOworfQorCitzdGF0aWMgdm9pZCBtb2R1bGUoY29uc3QgY2hhciAqbmFtZSkKK3sgaWYgKGltcG9ydHMpCisgIHsgaWYgKCFsZmxhZykKKyAgICB7IFByYWdtYSAqKnBwOworICAgICAgY2hhciAqcyA9IGVtYWxsb2MoMjU2KTsKKyAgICAgIHNwcmludGYocywgIiNpbmNsdWRlIFwiJXNILmhcIiIsIG5hbWUpOworICAgICAgZm9yIChwcCA9ICZwcmFnbWFzOyAqcHA7IHBwID0gJigqcHApLT5uZXh0KQorICAgICAgICA7CisgICAgICAqcHAgPSAoUHJhZ21hKillbWFsbG9jKHNpemVvZihQcmFnbWEpKTsKKyAgICAgICgqcHApLT5wcmFnbWEgPSBzOworICAgICAgKCpwcCktPm5leHQgPSBOVUxMOworICAgICAgaXNfbW9kdWxlID0gMTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiSW1wb3J0aW5nIG1vZHVsZSAlc1xuXG4iLCBuYW1lKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7IGxmbGFnID0gMTsKKyAgICB0eXBlTk8gPSBtYWdpYyhuYW1lKTsKKyAgICBwcmVmaXggPSBlbWFsbG9jKHN0cmxlbihuYW1lKSsxKTsKKyAgICBzdHJjcHkocHJlZml4LCBuYW1lKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIk1vZHVsZSAlcyBtYWdpYyBudW1iZXIgPSAlZFxuXG4iLCBuYW1lLCB0eXBlTk8pOworICB9Cit9CisKK3N0YXRpYyBpbnQgbWFnaWMoY29uc3QgY2hhciAqbmFtZSkKK3sgaW50IGksIG47CisgIGlmIChzdHJsZW4obmFtZSkgPiA0KQorICAgIHNlbWVycm9yKCIjbW9kdWxlIG5hbWUgbGVuZ3RoIG11c3Qgbm90IGV4Y2VlZCBmb3VyIGNoYXJhY3RlcnMiKTsKKyAgbiA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBzdHJsZW4obmFtZSk7IGkrKykKKyAgICBpZiAobmFtZVtpXSA+PSAnYScgJiYgbmFtZVtpXSA8PSAneicpCisgICAgICBuID0gMjYqbiArIG5hbWVbaV0gLSAnYSc7CisgICAgZWxzZSBpZiAobmFtZVtpXSA+PSAnQScgJiYgbmFtZVtpXSA8PSAnWicpCisgICAgICBuID0gMjYqbiArIG5hbWVbaV0gLSAnQSc7CisgICAgZWxzZQorICAgICAgc2VtZXJyb3IoIiNtb2R1bGUgbmFtZSBtdXN0IGJlIGFscGhhYmV0aWMgYW5kIHRoZSBsZW5ndGggbXVzdCBub3QgZXhjZWVkIGZvdXIgY2hhcmFjdGVycyIpOworICByZXR1cm4gNDY5OSpuICsgMTUzNDI0OworfQorCisjaWZkZWYgV0lUSF9MRVgKK3N0YXRpYyB2b2lkIGltcG9ydChjb25zdCBjaGFyICpmaWxlKQoreyBleGVjZXJyb3IoIkNhbm5vdCAjaW1wb3J0OiBzb2FwY3BwMiBub3QgY29tcGlsZWQgd2l0aCBmbGV4Iik7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgaW1wb3J0KGNvbnN0IGNoYXIgKmZpbGUpCit7IGNoYXIgYnVmWzEwMjRdOworICBzdHJ1Y3QgaW1wb3J0ZWQgKnA7CisgIGZvciAocCA9IGltcG9ydGVkOyBwOyBwID0gcC0+bmV4dCkKKyAgICBpZiAoIXN0cmNtcChwLT5uYW1lLCBmaWxlKSkKKyAgICAgIHJldHVybjsKKyAgaWYgKGltcG9ydHMgPj0gTUFYX0lNUE9SVF9ERVBUSCkKKyAgICBleGVjZXJyb3IoIkltcG9ydHMgbmVzdGVkIHRvbyBkZWVwbHkiKTsKKyAgaW5zdGtbaW1wb3J0c10gPSBZWV9DVVJSRU5UX0JVRkZFUjsKKyAgc3RyY3B5KGZuc3RrW2ltcG9ydHNdLCBmaWxlbmFtZSk7CisgIGxuc3RrW2ltcG9ydHNdID0geXlsaW5lbm87CisgIGltcG9ydHMrKzsKKyAgaWYgKCEoeXlpbiA9IGZvcGVuKGZpbGUsICJyIikpKQorICB7IGlmIChpbXBvcnRwYXRoKQorICAgIHsgY2hhciAqcywgKnQ7CisgICAgICBzID0gaW1wb3J0cGF0aDsKKyAgICAgIGRvCisgICAgICB7IHQgPSBzdHJzdHIocywgU09BUF9QQVRIU0VQKTsKKyAgICAgICAgaWYgKHQpCisgICAgICAgIHsgc3RybmNweShidWYsIHMsIHQgLSBzKTsKKwkgIGJ1Zlt0IC0gc10gPSAnXDAnOworCSAgcyA9IHQgKyBzaXplb2YoU09BUF9QQVRIU0VQKSAtIDE7CisJfQorCWVsc2UKKyAgICAgICAgeyBzdHJjcHkoYnVmLCBzKTsKKyAgICAgICAgICBzID0gTlVMTDsKKwl9CisgICAgICAgIHN0cmNhdChidWYsICIvIik7CisgICAgICAgIHN0cmNhdChidWYsIGZpbGUpOworICAgICAgICB5eWluID0gZm9wZW4oYnVmLCAiciIpOworICAgICAgfQorICAgICAgd2hpbGUgKHMgJiYgIXl5aW4pOworICAgIH0KKyAgICBpZiAoIXl5aW4pCisgICAgeyBzcHJpbnRmKGVycmJ1ZiwgIiNpbXBvcnQ6IENhbm5vdCBvcGVuIGZpbGUgXCIlc1wiIGZvciByZWFkaW5nLlxuSGludDogdXNlIG9wdGlvbiAtSTxwYXRoPiAoeW91IGNhbiBkZWZpbmUgbXVsdGlwbGUgcGF0aHMgc2VwYXJhdGVkIHdpdGggJyJTT0FQX1BBVEhTRVAiJykiLCBmaWxlKTsKKyAgICAgIGV4ZWNlcnJvcihlcnJidWYpOworICAgIH0KKyAgfQorICBwID0gKHN0cnVjdCBpbXBvcnRlZCopbWFsbG9jKHNpemVvZihzdHJ1Y3QgaW1wb3J0ZWQpICsgc3RybGVuKGZpbGUpKTsKKyAgc3RyY3B5KHAtPm5hbWUsIGZpbGUpOworICBwLT5uZXh0ID0gaW1wb3J0ZWQ7CisgIGltcG9ydGVkID0gcDsKKyAgc3RyY3B5KGZpbGVuYW1lLCBmaWxlKTsKKyAgeXlfc3dpdGNoX3RvX2J1ZmZlcih5eV9jcmVhdGVfYnVmZmVyKHl5aW4sIFlZX0JVRl9TSVpFKSk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9zb2FwY3BwMl95YWNjLnkgYi9zcmMvc29hcGNwcDJfeWFjYy55Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZjE4NmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc29hcGNwcDJfeWFjYy55CkBAIC0wLDAgKzEsMTgwNCBAQAorLyoKKworc29hcGNwcDJfeWFjYy55CisKK1lhY2MvQmlzb24gZ3JhbW1hci4KKworTm90ZXM6CisKK0Jpc29uIDEuNiBjYW4gY3Jhc2ggb24gV2luMzIgc3lzdGVtcyBpZiBZWUlOSVRERVBUSCBpcyB0b28gc21hbGwgQ29tcGlsZSB3aXRoCistRFlZSU5JVERFUFRIPTUwMDAKKworVGhpcyBncmFtbWFyIGhhcyBvbmUgc2hpZnQvcmVkdWNlIGNvbmZsaWN0IHJlbGF0ZWQgdG8gdGhlIHVzZSBvZiBhIGNsYXNzCitkZWNsYXJhdGlvbiB3aXRoIGEgYmFzZSBjbGFzcyAoZS5nLiBjbGFzcyBZIDogcHVibGljIFgpIGFuZCB0aGUgdXNlIG9mIGEKK21heE9jY3VycyAoY2xhc3MgWSA6MTApLiBJbnRlcm5hbGx5IHRoZSBjb25mbGljdCBpcyByZXNvbHZlZCBpbiBmYXZvciBvZiBhCitzaGlmdCBieSBCaXNvbi9ZYWNjLCB3aGljaCBsZWFkcyB0byB0aGUgY29ycmVjdCBwYXJzaW5nIGJlaGF2aW9yLiBUaGVyZWZvcmUsCit0aGUgd2FybmluZyBjYW4gYmUgaWdub3JlZC4KKworZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHBhcnQgb2YgdGhlIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2VzOgorR1BMLCB0aGUgZ1NPQVAgcHVibGljIGxpY2Vuc2UsIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBwdWJsaWMgbGljZW5zZS4KKworVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZ1NPQVAgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjMKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcGxpY2Vuc2UuaHRtbAorU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKK1dJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQorZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFJvYmVydCBBLiB2YW4gRW5nZWxlbi4KK0NvcHlyaWdodCAoQykgMjAwMC0yMDA0IFJvYmVydCBBLiB2YW4gRW5nZWxlbiwgR2VuaXZpYSBpbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworJXsKKworI2luY2x1ZGUgInNvYXBjcHAyLmgiCisjaWZkZWYgV0lOMzIKK2V4dGVybiBpbnQgc29hcGNwcDJsZXgoKTsKKyNlbmRpZgorCisjZGVmaW5lIE1BWE5FU1QgMTYJLyogbWF4LiBuZXN0aW5nIGRlcHRoIG9mIHNjb3BlcyAqLworCitzdHJ1Y3QgU2NvcGUKK3sJVGFibGUJKnRhYmxlOworCUVudHJ5CSplbnRyeTsKKwlOb2RlCW5vZGU7CisJTE9ORzY0CXZhbDsKKwlpbnQJb2Zmc2V0OworCUJvb2wJZ3JvdzsJLyogdHJ1ZSBpZiBvZmZzZXQgZ3Jvd3Mgd2l0aCBkZWNsYXJhdGlvbnMgKi8KKwlCb29sCW1hc2s7CS8qIHRydWUgaWYgZW51bSBpcyBtYXNrICovCit9CXN0YWNrW01BWE5FU1RdLAkvKiBzdGFjayBvZiB0YWJsZXMgYW5kIG9mZnNldHMgKi8KKwkqc3A7CQkvKiBjdXJyZW50IHNjb3BlIHN0YWNrIHBvaW50ZXIgKi8KKworVGFibGUJKmNsYXNzdGFibGUgPSAoVGFibGUqKTAsCisJKmVudW10YWJsZSA9IChUYWJsZSopMCwKKwkqdHlwZXRhYmxlID0gKFRhYmxlKikwLAorCSpib29sdGFibGUgPSAoVGFibGUqKTAsCisJKnRlbXBsYXRldGFibGUgPSAoVGFibGUqKTA7CisKK2NoYXIJKm5hbWVzcGFjZWlkID0gTlVMTDsKK2ludAl0cmFuc2llbnQgPSAwOworaW50CXBlcm1pc3Npb24gPSAwOworaW50CWN1c3RvbV9oZWFkZXIgPSAxOworaW50CWN1c3RvbV9mYXVsdCA9IDE7CitQcmFnbWEJKnByYWdtYXMgPSBOVUxMOworVG5vZGUJKnFuYW1lID0gTlVMTDsKK1Rub2RlCSp4bWwgPSBOVUxMOworCisvKiBmdW5jdGlvbiBwcm90b3R5cGVzIGZvciBzdXBwb3J0IHJvdXRpbmUgc2VjdGlvbiAqLworc3RhdGljIEVudHJ5CSp1bmRlZmluZWQoU3ltYm9sKik7CitzdGF0aWMgVG5vZGUJKm1ndHlwZShUbm9kZSosIFRub2RlKik7CitzdGF0aWMgTm9kZQlvcChjb25zdCBjaGFyKiwgTm9kZSwgTm9kZSksIGlvcChjb25zdCBjaGFyKiwgTm9kZSwgTm9kZSksIHJlbG9wKGNvbnN0IGNoYXIqLCBOb2RlLCBOb2RlKTsKK3N0YXRpYyB2b2lkCW1rc2NvcGUoVGFibGUqLCBpbnQpLCBlbnRlcnNjb3BlKFRhYmxlKiwgaW50KSwgZXhpdHNjb3BlKCk7CitzdGF0aWMgaW50CWludGVnZXIoVG5vZGUqKSwgcmVhbChUbm9kZSopLCBudW1lcmljKFRub2RlKiksIHBvaW50ZXIoVG5vZGUqKTsKK3N0YXRpYyB2b2lkCWFkZF9YTUwoKSwgYWRkX3FuYW1lKCksIGFkZF9oZWFkZXIoVGFibGUqKSwgYWRkX2ZhdWx0KFRhYmxlKiksIGFkZF9yZXNwb25zZShFbnRyeSosIEVudHJ5KiksIGFkZF9yZXN1bHQoVG5vZGUqKTsKK2V4dGVybiBjaGFyCSpjX3N0b3JhZ2UoU3RvcmFnZSksICpjX3R5cGUoVG5vZGUqKSwgKmNfaWRlbnQoVG5vZGUqKTsKK2V4dGVybiBpbnQJaXNfcHJpbWl0aXZlX29yX3N0cmluZyhUbm9kZSopLCBpc19zdGRzdHIoVG5vZGUqKSwgaXNfYmluYXJ5KFRub2RlKik7CisKKy8qIHRlbXBvcmFyaWVzIHVzZWQgaW4gc2VtYW50aWMgcnVsZXMgKi8KK2ludAlpOworY2hhcgkqcywgKnMxLCAqczI7CitTeW1ib2wJKnN5bTsKK0VudHJ5CSpwLCAqcTsKK1Rub2RlCSp0OworTm9kZQl0bXAsIGM7CitQcmFnbWEJKipwcDsKKworJX0KKworLyogd2UgZXhwZWN0IG9uZSBzaGlmdC1yZWR1Y2UgY29uZmxpY3QgKi8KKyVleHBlY3QgMQorLyogcmVtb3ZlIHRoaXMgbGluZSBpZiBuZWNlc3NhcnkgdG8gYWxsb3cgWWFjYyB0byBwcm9jZWVkICovCisKKyV1bmlvbgorewlTeW1ib2wJKnN5bTsKKwlMT05HNjQJaTsKKwlkb3VibGUJcjsKKwljaGFyCWM7CisJY2hhcgkqczsKKwlUbm9kZQkqdHlwOworCVN0b3JhZ2UJc3RvOworCU5vZGUJcmVjOworCUVudHJ5CSplOworfQorCisvKiBwcmFnbWFzICovCisldG9rZW4JPHM+IFBSQUdNQQorLyoga2V5d29yZHMgKi8KKyV0b2tlbgk8c3ltPiBBVVRPICAgICBET1VCTEUgIElOVCAgICAgICBTVFJVQ1QKKyV0b2tlbgk8c3ltPiBCUkVBSyAgICBFTFNFICAgIExPTkcgICAgICBTV0lUQ0gKKyV0b2tlbgk8c3ltPiBDQVNFICAgICBFTlVNICAgIFJFR0lTVEVSICBUWVBFREVGCisldG9rZW4JPHN5bT4gQ0hBUiAgICAgRVhURVJOICBSRVRVUk4gICAgVU5JT04KKyV0b2tlbgk8c3ltPiBDT05TVCAgICBGTE9BVCAgIFNIT1JUICAgICBVTlNJR05FRAorJXRva2VuCTxzeW0+IENPTlRJTlVFIEZPUiAgICAgU0lHTkVEICAgIFZPSUQKKyV0b2tlbgk8c3ltPiBERUZBVUxUICBHT1RPICAgIFNJWkVPRiAgICBWT0xBVElMRQorJXRva2VuCTxzeW0+IERPICAgICAgIElGICAgICAgU1RBVElDICAgIFdISUxFCisldG9rZW4JPHN5bT4gQ0xBU1MgICAgUFJJVkFURSBQUk9URUNURUQgUFVCTElDCisldG9rZW4JPHN5bT4gVklSVFVBTCAgSU5MSU5FICBPUEVSQVRPUiAgTExPTkcKKyV0b2tlbgk8c3ltPiBCT09MICAgICBDRkFMU0UgIENUUlVFCSBXQ0hBUgorJXRva2VuCTxzeW0+IFRJTUUgICAgIFVTSU5HICAgTkFNRVNQQUNFIFVMTE9ORworJXRva2VuCTxzeW0+IE1VU1RVTkRFUlNUQU5EICAgU0laRSAgICAgIEZSSUVORAorJXRva2VuCTxzeW0+IFRFTVBMQVRFIEVYUExJQ0lUCQkgVFlQRU5BTUUKKyV0b2tlbgk8c3ltPiBSRVNUUklDVCBudWxsCisvKiAqLworJXRva2VuCU5PTkUKKy8qIGlkZW50aWZpZXJzIChUWVBFID0gdHlwZWRlZiBpZGVudGlmaWVyKSAqLworJXRva2VuCTxzeW0+IElEIFRZUEUKKy8qIGNvbnN0YW50cyAqLworJXRva2VuCTxpPiBMTkcKKyV0b2tlbgk8cj4gREJMCisldG9rZW4JPGM+IENIUgorJXRva2VuCTxzPiBTVFIKKy8qIHR5cGVzIGFuZCByZWxhdGVkICovCisldHlwZQk8dHlwPiB0eXBlCisldHlwZQk8c3RvPiBzdG9yZSB2aXJ0dWFsIGNvbnN0b2JqIGFic3RyYWN0CisldHlwZQk8ZT4gZm5hbWUgc3RydWN0IGNsYXNzIHN1cGVyCisldHlwZQk8c3ltPiBpZCBhcmcgbmFtZQorJXR5cGUJPHM+IHBhdHQKKyV0eXBlCTxpPiBjaW50CisvKiBleHByZXNzaW9ucyBhbmQgc3RhdGVtZW50cyAqLworJXR5cGUJPHJlYz4gZXhwciBjZXhwIG9leHAgb2JleCBhZXhwIGFiZXggcmV4cCBsZXhwIHBleHAgaW5pdCBzcGVjIHRzcGVjIHB0cnMgYXJyYXkgYXJyYXljayB0ZXhwIHFleHAgb2NjdXJzCisvKiB0ZXJtaW5hbHMgKi8KKyVsZWZ0CScsJworJXJpZ2h0CSc9JyBQQSBOQSBUQSBEQSBNQSBBQSBYQSBPQSBMQSBSQSAgLyogKz0gLT0gKj0gLz0gJT0gJj0gXj0gfD0gPDw9ID4+PSAqLworJXJpZ2h0CSc/JworJXJpZ2h0CSc6JworJWxlZnQJT1IJCS8qIHx8ICovCislbGVmdAlBTgkJLyogJiYgKi8KKyVsZWZ0CSd8JworJWxlZnQJJ14nCislbGVmdAknJicKKyVsZWZ0CUVRIE5FCQkvKiA9PSAhPSAqLworJWxlZnQJJzwnIExFICc+JyBHRQkvKiA8PSA+PSAqLworJWxlZnQJTFMgUlMJCS8qIDw8ID4+ICovCislbGVmdAknKycgJy0nCislbGVmdAknKicgJy8nICclJworJWxlZnQJQVIJCS8qIC0+ICovCisldG9rZW4JUFAgTk4JCS8qICsrIC0tICovCisKKyUlCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisKKwlQcm9ncmFtIHN5bnRheAorCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwcm9nCTogczEgZXh0cwl7IGlmIChsZmxhZykKKyAgICAJCQkgIHsJY3VzdG9tX2hlYWRlciA9IDA7CisgICAgCQkJICAJY3VzdG9tX2ZhdWx0ID0gMDsKKwkJCSAgfQorCQkJICBlbHNlCisJCQkgIHsJYWRkX2hlYWRlcihzcC0+dGFibGUpOworCQkJICAJYWRkX2ZhdWx0KHNwLT50YWJsZSk7CisJCQkgIH0KKwkJCSAgY29tcGlsZShzcC0+dGFibGUpOworCQkJICBmcmVldGFibGUoY2xhc3N0YWJsZSk7CisJCQkgIGZyZWV0YWJsZShlbnVtdGFibGUpOworCQkJICBmcmVldGFibGUodHlwZXRhYmxlKTsKKwkJCSAgZnJlZXRhYmxlKGJvb2x0YWJsZSk7CisJCQkgIGZyZWV0YWJsZSh0ZW1wbGF0ZXRhYmxlKTsKKwkJCX0KKwk7CitzMQk6IC8qIGVtcHR5ICovCXsgY2xhc3N0YWJsZSA9IG1rdGFibGUoKFRhYmxlKikwKTsKKwkJCSAgZW51bXRhYmxlID0gbWt0YWJsZSgoVGFibGUqKTApOworCQkJICB0eXBldGFibGUgPSBta3RhYmxlKChUYWJsZSopMCk7CisJCQkgIGJvb2x0YWJsZSA9IG1rdGFibGUoKFRhYmxlKikwKTsKKwkJCSAgdGVtcGxhdGV0YWJsZSA9IG1rdGFibGUoKFRhYmxlKikwKTsKKwkJCSAgcCA9IGVudGVyKGJvb2x0YWJsZSwgbG9va3VwKCJmYWxzZSIpKTsKKwkJCSAgcC0+aW5mby50eXAgPSBta2ludCgpOworCQkJICBwLT5pbmZvLnZhbC5pID0gMDsKKwkJCSAgcCA9IGVudGVyKGJvb2x0YWJsZSwgbG9va3VwKCJ0cnVlIikpOworCQkJICBwLT5pbmZvLnR5cCA9IG1raW50KCk7CisJCQkgIHAtPmluZm8udmFsLmkgPSAxOworCQkJICBta3Njb3BlKG1rdGFibGUobWt0YWJsZSgoVGFibGUqKTApKSwgMCk7CisJCQl9CisJOworZXh0cwk6IE5BTUVTUEFDRSBJRCAneycgZXh0czEgJ30nCisJCQl7IG5hbWVzcGFjZWlkID0gJDItPm5hbWU7IH0KKwl8IGV4dHMxCQl7IG5hbWVzcGFjZWlkID0gTlVMTDsgfQorCTsKK2V4dHMxCTogLyogZW1wdHkgKi8JeyBpZiAoIWxmbGFnKQorCQkJICB7CWFkZF9YTUwoKTsKKwkJCQlhZGRfcW5hbWUoKTsKKwkJCSAgfQorCQkJfQorCXwgZXh0czEgZXh0CXsgfQorCTsKK2V4dAk6IGRjbHJzICc7Jwl7IH0KKwl8IHByYWdtYQl7IH0KKwl8IGVycm9yICc7Jwl7IHN5bmVycm9yKCJpbnB1dCBiZWZvcmUgOyBza2lwcGVkIik7CisJCQkgIHdoaWxlIChzcCA+IHN0YWNrKQorCQkJICB7CWZyZWV0YWJsZShzcC0+dGFibGUpOworCQkJICAJZXhpdHNjb3BlKCk7CisJCQkgIH0KKwkJCSAgeXllcnJvazsKKwkJCX0KKwl8IHQxCQl7IH0KKwl8IHQyCQl7IH0KKwk7CitwcmFnbWEJOiBQUkFHTUEJeyBpZiAoJDFbMV0gPj0gJ2EnICYmICQxWzFdIDw9ICd6JykKKwkJCSAgewlmb3IgKHBwID0gJnByYWdtYXM7ICpwcDsgcHAgPSAmKCpwcCktPm5leHQpCisJCQkgICAgICAgICAgOworCQkJCSpwcCA9IChQcmFnbWEqKWVtYWxsb2Moc2l6ZW9mKFByYWdtYSkpOworCQkJCSgqcHApLT5wcmFnbWEgPSAoY2hhciopZW1hbGxvYyhzdHJsZW4oJDEpKzEpOworCQkJCXN0cmNweSgoKnBwKS0+cHJhZ21hLCAkMSk7CisJCQkJKCpwcCktPm5leHQgPSBOVUxMOworCQkJICB9CisJCQkgIGVsc2UgaWYgKChpID0gYXRvaSgkMSsyKSkgPiAwKQorCQkJCXl5bGluZW5vID0gaTsKKwkJCSAgZWxzZQorCQkJICB7CXNwcmludGYoZXJyYnVmLCAiZGlyZWN0aXZlICclcycgaWdub3JlZCAodXNlICNpbXBvcnQgdG8gaW1wb3J0IGZpbGVzIGFuZC9vciB1c2Ugb3B0aW9uIC1pKSIsICQxKTsKKwkJCSAgCXNlbXdhcm4oZXJyYnVmKTsKKwkJCSAgfQorCQkJfQorCTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKworCURlY2xhcmF0aW9ucworCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitkZWNscwk6IC8qIGVtcHR5ICovCXsgdHJhbnNpZW50ICY9IH42OworCQkJICBwZXJtaXNzaW9uID0gMDsKKwkJCX0KKwl8IGRjbHJzICc7JyBkZWNscworCQkJeyB9CisJfCBQUklWQVRFICc6JyB0MyBkZWNscworCQkJeyB9CisJfCBQUk9URUNURUQgJzonIHQ0IGRlY2xzCisJCQl7IH0KKwl8IFBVQkxJQyAnOicgdDUgZGVjbHMKKwkJCXsgfQorCXwgdDEgZGVjbHMgdDIgZGVjbHMKKwkJCXsgfQorCTsKK3QxCTogJ1snCQl7IHRyYW5zaWVudCB8PSAxOworCQkJfQorCTsKK3QyCTogJ10nCQl7IHRyYW5zaWVudCAmPSB+MTsKKwkJCX0KKwk7Cit0Mwk6CQl7IHBlcm1pc3Npb24gPSBTcHJpdmF0ZTsKKwkJCX0KKwk7Cit0NAk6CQl7IHBlcm1pc3Npb24gPSBTcHJvdGVjdGVkOworCQkJfQorCTsKK3Q1CToJCXsgcGVybWlzc2lvbiA9IDA7CisJCQl9CisJOworZGNscnMJOiBzcGVjCQl7IH0KKwl8IHNwZWMgZGNscgl7IH0KKwl8IHNwZWMgZmRjbHIgZnVuYworCQkJeyB9CisJfCBjb25zdHIgZnVuYwl7IH0KKwl8IGRlc3RyIGZ1bmMJeyB9CisJfCBkY2xycyAnLCcgZGNscnsgfQorCXwgZGNscnMgJywnIGZkY2xyIGZ1bmMKKwkJCXsgfQorCTsKK2RjbHIJOiBwdHJzIElEIGFycmF5Y2sgb2NjdXJzIGluaXQKKwkJCXsgaWYgKCgkMy5zdG8gJiBTdHlwZWRlZikgJiYgc3AtPnRhYmxlLT5sZXZlbCA9PSBHTE9CQUwpCisJCQkgIHsJaWYgKCgkMy50eXAtPnR5cGUgIT0gVHN0cnVjdCAmJiAkMy50eXAtPnR5cGUgIT0gVHVuaW9uICYmICQzLnR5cC0+dHlwZSAhPSBUZW51bSkgfHwgc3RyY21wKCQyLT5uYW1lLCAkMy50eXAtPmlkLT5uYW1lKSkKKworCQkJCXsJcCA9IGVudGVyKHR5cGV0YWJsZSwgJDIpOworCQkJCQlwLT5pbmZvLnR5cCA9IG1rc3ltdHlwZSgkMy50eXAsICQyKTsKKwkJCSAgCQlpZiAoJDMuc3RvICYgU2V4dGVybikKKwkJCQkJCXAtPmluZm8udHlwLT50cmFuc2llbnQgPSAtMTsKKwkJCQkJZWxzZQorCQkJCQkJcC0+aW5mby50eXAtPnRyYW5zaWVudCA9ICQzLnR5cC0+dHJhbnNpZW50OworCQkJICAJCXAtPmluZm8uc3RvID0gJDMuc3RvOworCQkJCQlwLT5pbmZvLnR5cC0+cGF0dGVybiA9ICQ0LnBhdHRlcm47CisJCQkJCWlmICgkNC5taW5PY2N1cnMgIT0gLTEpCisJCQkJCXsJcC0+aW5mby50eXAtPm1pbkxlbmd0aCA9ICQ0Lm1pbk9jY3VyczsKKwkJCQkJfQorCQkJCQlpZiAoJDQubWF4T2NjdXJzID4gMSkKKwkJCQkJCXAtPmluZm8udHlwLT5tYXhMZW5ndGggPSAkNC5tYXhPY2N1cnM7CisJCQkJfQorCQkJCSQyLT50b2tlbiA9IFRZUEU7CisJCQkgIH0KKwkJCSAgZWxzZQorCQkJICB7CXAgPSBlbnRlcihzcC0+dGFibGUsICQyKTsKKwkJCSAgCXAtPmluZm8udHlwID0gJDMudHlwOworCQkJICAJcC0+aW5mby5zdG8gPSAoJDMuc3RvIHwgcGVybWlzc2lvbik7CisJCQkJaWYgKCQ1Lmhhc3ZhbCkKKwkJCQl7CXAtPmluZm8uaGFzdmFsID0gVHJ1ZTsKKwkJCQkJc3dpdGNoICgkMy50eXAtPnR5cGUpCisJCQkJCXsJY2FzZSBUY2hhcjoKKwkJCQkJCWNhc2UgVHVjaGFyOgorCQkJCQkJY2FzZSBUc2hvcnQ6CisJCQkJCQljYXNlIFR1c2hvcnQ6CisJCQkJCQljYXNlIFRpbnQ6CisJCQkJCQljYXNlIFR1aW50OgorCQkJCQkJY2FzZSBUbG9uZzoKKwkJCQkJCWNhc2UgVHVsb25nOgorCQkJCQkJY2FzZSBUbGxvbmc6CisJCQkJCQljYXNlIFR1bGxvbmc6CisJCQkJCQljYXNlIFRlbnVtOgorCQkJCQkJY2FzZSBUdGltZToKKwkJCQkJCQlpZiAoJDUudHlwLT50eXBlID09IFRpbnQgfHwgJDUudHlwLT50eXBlID09IFRjaGFyIHx8ICQ1LnR5cC0+dHlwZSA9PSBUZW51bSkKKwkJCQkJCQkJc3AtPnZhbCA9IHAtPmluZm8udmFsLmkgPSAkNS52YWwuaTsKKwkJCQkJCQllbHNlCisJCQkJCQkJewlzZW1lcnJvcigidHlwZSBlcnJvciBpbiBpbml0aWFsaXphdGlvbiBjb25zdGFudCIpOworCQkJCQkJCQlwLT5pbmZvLmhhc3ZhbCA9IEZhbHNlOworCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgVGZsb2F0OgorCQkJCQkJY2FzZSBUZG91YmxlOgorCQkJCQkJCWlmICgkNS50eXAtPnR5cGUgPT0gVGZsb2F0IHx8ICQ1LnR5cC0+dHlwZSA9PSBUZG91YmxlKQorCQkJCQkJCQlwLT5pbmZvLnZhbC5yID0gJDUudmFsLnI7CisJCQkJCQkJZWxzZSBpZiAoJDUudHlwLT50eXBlID09IFRpbnQpCisJCQkJCQkJCXAtPmluZm8udmFsLnIgPSAoZG91YmxlKSQ1LnZhbC5pOworCQkJCQkJCWVsc2UKKwkJCQkJCQl7CXNlbWVycm9yKCJ0eXBlIGVycm9yIGluIGluaXRpYWxpemF0aW9uIGNvbnN0YW50Iik7CisJCQkJCQkJCXAtPmluZm8uaGFzdmFsID0gRmFsc2U7CisJCQkJCQkJfQorCQkJCQkJCWJyZWFrOworCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQlpZiAoJDMudHlwLT50eXBlID09IFRwb2ludGVyCisJCQkJCQkJICYmICgoVG5vZGUqKSQzLnR5cC0+cmVmKS0+dHlwZSA9PSBUY2hhcgorCQkJCQkJCSAmJiAkNS50eXAtPnR5cGUgPT0gVHBvaW50ZXIKKwkJCQkJCQkgJiYgKChUbm9kZSopJDUudHlwLT5yZWYpLT50eXBlID09IFRjaGFyKQorCQkJCQkJCQlwLT5pbmZvLnZhbC5zID0gJDUudmFsLnM7CisJCQkJCQkJZWxzZSBpZiAoJDMudHlwLT50eXBlID09IFRwb2ludGVyCisJCQkJCQkJICAgICAgJiYgKChUbm9kZSopJDMudHlwLT5yZWYpLT5pZCA9PSBsb29rdXAoInN0ZDo6c3RyaW5nIikpCisJCQkJCQkJICAgICAgCXAtPmluZm8udmFsLnMgPSAkNS52YWwuczsKKwkJCQkJCQllbHNlIGlmICgkMy50eXAtPmlkID09IGxvb2t1cCgic3RkOjpzdHJpbmciKSkKKwkJCQkJCQkgICAgICAJcC0+aW5mby52YWwucyA9ICQ1LnZhbC5zOworCQkJCQkJCWVsc2UgaWYgKCQzLnR5cC0+dHlwZSA9PSBUcG9pbnRlcgorCQkJCQkJCSAgICAgICYmICQ1LnR5cC0+dHlwZSA9PSBUaW50CisJCQkJCQkJICAgICAgJiYgJDUudmFsLmkgPT0gMCkKKwkJCQkJCQkJcC0+aW5mby52YWwuaSA9IDA7CisJCQkJCQkJZWxzZQorCQkJCQkJCXsJc2VtZXJyb3IoInR5cGUgZXJyb3IgaW4gaW5pdGlhbGl6YXRpb24gY29uc3RhbnQiKTsKKwkJCQkJCQkJcC0+aW5mby5oYXN2YWwgPSBGYWxzZTsKKwkJCQkJCQl9CisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCQlwLT5pbmZvLnZhbC5pID0gc3AtPnZhbDsKKwkJCSAgICAgICAgaWYgKCQ0Lm1pbk9jY3VycyA8IDApCisJCQkgICAgICAgIHsJaWYgKCgkMy5zdG8gJiBTYXR0cmlidXRlKSB8fCAkMy50eXAtPnR5cGUgPT0gVHBvaW50ZXIgfHwgJDMudHlwLT50eXBlID09IFR0ZW1wbGF0ZSB8fCAhc3RybmNtcCgkMi0+bmFtZSwgIl9fc2l6ZSIsIDYpKQorCQkJICAgICAgICAJCXAtPmluZm8ubWluT2NjdXJzID0gMDsKKwkJCSAgICAgICAgCWVsc2UKKwkJCSAgICAgICAgCQlwLT5pbmZvLm1pbk9jY3VycyA9IDE7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJcC0+aW5mby5taW5PY2N1cnMgPSAkNC5taW5PY2N1cnM7CisJCQkJcC0+aW5mby5tYXhPY2N1cnMgPSAkNC5tYXhPY2N1cnM7CisJCQkJaWYgKHNwLT5tYXNrKQorCQkJCQlzcC0+dmFsIDw8PSAxOworCQkJCWVsc2UKKwkJCQkJc3AtPnZhbCsrOworCQkJICAJcC0+aW5mby5vZmZzZXQgPSBzcC0+b2Zmc2V0OworCQkJCWlmICgkMy5zdG8gJiBTZXh0ZXJuKQorCQkJCQlwLT5sZXZlbCA9IEdMT0JBTDsKKwkJCQllbHNlIGlmICgkMy5zdG8gJiBTdHlwZWRlZikKKwkJCQkJOworCQkJICAJZWxzZSBpZiAoc3AtPmdyb3cpCisJCQkJCXNwLT5vZmZzZXQgKz0gcC0+aW5mby50eXAtPndpZHRoOworCQkJCWVsc2UgaWYgKHAtPmluZm8udHlwLT53aWR0aCA+IHNwLT5vZmZzZXQpCisJCQkJCXNwLT5vZmZzZXQgPSBwLT5pbmZvLnR5cC0+d2lkdGg7CisJCQkgIH0KKwkJCSAgc3AtPmVudHJ5ID0gcDsKKwkJCX0KKwk7CitmZGNscgk6IHB0cnMgbmFtZQl7IGlmICgkMS5zdG8gJiBTdHlwZWRlZikKKwkJCSAgewlzcHJpbnRmKGVycmJ1ZiwgImludmFsaWQgdHlwZWRlZiBxdWFsaWZpZXIgZm9yICclcyciLCAkMi0+bmFtZSk7CisJCQkJc2Vtd2FybihlcnJidWYpOworCQkJICB9CisJCQkgIHAgPSBlbnRlcihzcC0+dGFibGUsICQyKTsKKwkJCSAgcC0+aW5mby50eXAgPSAkMS50eXA7CisJCQkgIHAtPmluZm8uc3RvID0gJDEuc3RvOworCQkJICBwLT5pbmZvLmhhc3ZhbCA9IEZhbHNlOworCQkJICBwLT5pbmZvLm9mZnNldCA9IHNwLT5vZmZzZXQ7CisJCQkgIGlmIChzcC0+Z3JvdykKKwkJCQlzcC0+b2Zmc2V0ICs9IHAtPmluZm8udHlwLT53aWR0aDsKKwkJCSAgZWxzZSBpZiAocC0+aW5mby50eXAtPndpZHRoID4gc3AtPm9mZnNldCkKKwkJCQlzcC0+b2Zmc2V0ID0gcC0+aW5mby50eXAtPndpZHRoOworCQkJICBzcC0+ZW50cnkgPSBwOworCQkJfQorCTsKK2lkCTogSUQJCXsgJCQgPSAkMTsgfQorCXwgVFlQRQkJeyAkJCA9ICQxOyB9CisJOworbmFtZQk6IElECQl7ICQkID0gJDE7IH0KKwl8IE9QRVJBVE9SICchJwl7ICQkID0gbG9va3VwKCJvcGVyYXRvciEiKTsgfQorCXwgT1BFUkFUT1IgJ34nCXsgJCQgPSBsb29rdXAoIm9wZXJhdG9yfiIpOyB9CisJfCBPUEVSQVRPUiAnPScJeyAkJCA9IGxvb2t1cCgib3BlcmF0b3I9Iik7IH0KKwl8IE9QRVJBVE9SIFBBCXsgJCQgPSBsb29rdXAoIm9wZXJhdG9yKz0iKTsgfQorCXwgT1BFUkFUT1IgTkEJeyAkJCA9IGxvb2t1cCgib3BlcmF0b3ItPSIpOyB9CisJfCBPUEVSQVRPUiBUQQl7ICQkID0gbG9va3VwKCJvcGVyYXRvcio9Iik7IH0KKwl8IE9QRVJBVE9SIERBCXsgJCQgPSBsb29rdXAoIm9wZXJhdG9yLz0iKTsgfQorCXwgT1BFUkFUT1IgTUEJeyAkJCA9IGxvb2t1cCgib3BlcmF0b3IlPSIpOyB9CisJfCBPUEVSQVRPUiBBQQl7ICQkID0gbG9va3VwKCJvcGVyYXRvciY9Iik7IH0KKwl8IE9QRVJBVE9SIFhBCXsgJCQgPSBsb29rdXAoIm9wZXJhdG9yXj0iKTsgfQorCXwgT1BFUkFUT1IgT0EJeyAkJCA9IGxvb2t1cCgib3BlcmF0b3J8PSIpOyB9CisJfCBPUEVSQVRPUiBMQQl7ICQkID0gbG9va3VwKCJvcGVyYXRvcjw8PSIpOyB9CisJfCBPUEVSQVRPUiBSQQl7ICQkID0gbG9va3VwKCJvcGVyYXRvcj4+PSIpOyB9CisJfCBPUEVSQVRPUiBPUgl7ICQkID0gbG9va3VwKCJvcGVyYXRvcnx8Iik7IH0KKwl8IE9QRVJBVE9SIEFOCXsgJCQgPSBsb29rdXAoIm9wZXJhdG9yJiYiKTsgfQorCXwgT1BFUkFUT1IgJ3wnCXsgJCQgPSBsb29rdXAoIm9wZXJhdG9yfCIpOyB9CisJfCBPUEVSQVRPUiAnXicJeyAkJCA9IGxvb2t1cCgib3BlcmF0b3JeIik7IH0KKwl8IE9QRVJBVE9SICcmJwl7ICQkID0gbG9va3VwKCJvcGVyYXRvciYiKTsgfQorCXwgT1BFUkFUT1IgRVEJeyAkJCA9IGxvb2t1cCgib3BlcmF0b3I9PSIpOyB9CisJfCBPUEVSQVRPUiBORQl7ICQkID0gbG9va3VwKCJvcGVyYXRvciE9Iik7IH0KKwl8IE9QRVJBVE9SICc8Jwl7ICQkID0gbG9va3VwKCJvcGVyYXRvcjwiKTsgfQorCXwgT1BFUkFUT1IgTEUJeyAkJCA9IGxvb2t1cCgib3BlcmF0b3I8PSIpOyB9CisJfCBPUEVSQVRPUiAnPicJeyAkJCA9IGxvb2t1cCgib3BlcmF0b3I+Iik7IH0KKwl8IE9QRVJBVE9SIEdFCXsgJCQgPSBsb29rdXAoIm9wZXJhdG9yPj0iKTsgfQorCXwgT1BFUkFUT1IgTFMJeyAkJCA9IGxvb2t1cCgib3BlcmF0b3I8PCIpOyB9CisJfCBPUEVSQVRPUiBSUwl7ICQkID0gbG9va3VwKCJvcGVyYXRvcj4+Iik7IH0KKwl8IE9QRVJBVE9SICcrJwl7ICQkID0gbG9va3VwKCJvcGVyYXRvcisiKTsgfQorCXwgT1BFUkFUT1IgJy0nCXsgJCQgPSBsb29rdXAoIm9wZXJhdG9yLSIpOyB9CisJfCBPUEVSQVRPUiAnKicJeyAkJCA9IGxvb2t1cCgib3BlcmF0b3IqIik7IH0KKwl8IE9QRVJBVE9SICcvJwl7ICQkID0gbG9va3VwKCJvcGVyYXRvci8iKTsgfQorCXwgT1BFUkFUT1IgJyUnCXsgJCQgPSBsb29rdXAoIm9wZXJhdG9yJSIpOyB9CisJfCBPUEVSQVRPUiBQUAl7ICQkID0gbG9va3VwKCJvcGVyYXRvcisrIik7IH0KKwl8IE9QRVJBVE9SIE5OCXsgJCQgPSBsb29rdXAoIm9wZXJhdG9yLS0iKTsgfQorCXwgT1BFUkFUT1IgQVIgICB7ICQkID0gbG9va3VwKCJvcGVyYXRvci0+Iik7IH0KKwl8IE9QRVJBVE9SJ1snJ10neyAkJCA9IGxvb2t1cCgib3BlcmF0b3JbXSIpOyB9CisJfCBPUEVSQVRPUicoJycpJ3sgJCQgPSBsb29rdXAoIm9wZXJhdG9yKCkiKTsgfQorCXwgT1BFUkFUT1IgdGV4cCB7IHMxID0gY19zdG9yYWdlKCQyLnN0byk7CisJCQkgIHMyID0gY190eXBlKCQyLnR5cCk7CisJCQkgIHMgPSAoY2hhciopZW1hbGxvYyhzdHJsZW4oczEpICsgc3RybGVuKHMyKSArIDEwKTsKKwkJCSAgc3RyY3B5KHMsICJvcGVyYXRvciAiKTsKKwkJCSAgc3RyY2F0KHMsIHMxKTsKKwkJCSAgc3RyY2F0KHMsIHMyKTsKKwkJCSAgJCQgPSBsb29rdXAocyk7CisJCQkgIGlmICghJCQpCisJCQkJJCQgPSBpbnN0YWxsKHMsIElEKTsKKwkJCX0KKwk7Citjb25zdHIJOiBUWVBFCQl7IGlmICghKHAgPSBlbnRyeShjbGFzc3RhYmxlLCAkMSkpKQorCQkJICAJc2VtZXJyb3IoImludmFsaWQgY29uc3RydWN0b3IiKTsKKwkJCSAgc3AtPmVudHJ5ID0gZW50ZXIoc3AtPnRhYmxlLCAkMSk7CisJCQkgIHNwLT5lbnRyeS0+aW5mby50eXAgPSBta25vbmUoKTsKKwkJCSAgc3AtPmVudHJ5LT5pbmZvLnN0byA9IFNub25lOworCQkJICBzcC0+ZW50cnktPmluZm8ub2Zmc2V0ID0gc3AtPm9mZnNldDsKKwkJCSAgc3AtPm5vZGUudHlwID0gbWt2b2lkKCk7CisJCQkgIHNwLT5ub2RlLnN0byA9IFNub25lOworCQkJfQorCTsKK2Rlc3RyCTogdmlydHVhbCAnficgVFlQRQorCQkJeyBpZiAoIShwID0gZW50cnkoY2xhc3N0YWJsZSwgJDMpKSkKKwkJCSAgCXNlbWVycm9yKCJpbnZhbGlkIGRlc3RydWN0b3IiKTsKKwkJCSAgcyA9IChjaGFyKillbWFsbG9jKHN0cmxlbigkMy0+bmFtZSkgKyAyKTsKKwkJCSAgc3RyY3B5KHMsICJ+Iik7CisJCQkgIHN0cmNhdChzLCAkMy0+bmFtZSk7CisJCQkgIHN5bSA9IGxvb2t1cChzKTsKKwkJCSAgaWYgKCFzeW0pCisJCQkJc3ltID0gaW5zdGFsbChzLCBJRCk7CisJCQkgIHNwLT5lbnRyeSA9IGVudGVyKHNwLT50YWJsZSwgc3ltKTsKKwkJCSAgc3AtPmVudHJ5LT5pbmZvLnR5cCA9IG1rbm9uZSgpOworCQkJICBzcC0+ZW50cnktPmluZm8uc3RvID0gJDE7CisJCQkgIHNwLT5lbnRyeS0+aW5mby5vZmZzZXQgPSBzcC0+b2Zmc2V0OworCQkJICBzcC0+bm9kZS50eXAgPSBta3ZvaWQoKTsKKwkJCSAgc3AtPm5vZGUuc3RvID0gU25vbmU7CisJCQl9CisJOworZnVuYwk6IGZuYW1lICcoJyBzNiBmYXJnc28gJyknIGNvbnN0b2JqIGFic3RyYWN0CisJCQl7IGlmICgkMS0+bGV2ZWwgPT0gR0xPQkFMKQorCQkJICB7CWlmICghKCQxLT5pbmZvLnN0byAmIFNleHRlcm4pICYmIHNwLT5lbnRyeSAmJiBzcC0+ZW50cnktPmluZm8udHlwLT50eXBlID09IFRwb2ludGVyICYmICgoVG5vZGUqKXNwLT5lbnRyeS0+aW5mby50eXAtPnJlZiktPnR5cGUgPT0gVGNoYXIpCisJCQkgIAl7CXNwcmludGYoZXJyYnVmLCAibGFzdCBvdXRwdXQgcGFyYW1ldGVyIG9mIHJlbW90ZSBtZXRob2QgZnVuY3Rpb24gcHJvdG90eXBlICclcycgaXMgYSBwb2ludGVyIHRvIGEgY2hhciB3aGljaCB3aWxsIG9ubHkgcmV0dXJuIG9uZSBieXRlOiB1c2UgY2hhcioqIGluc3RlYWQgdG8gcmV0dXJuIGEgc3RyaW5nIiwgJDEtPnN5bS0+bmFtZSk7CisJCQkJCXNlbXdhcm4oZXJyYnVmKTsKKwkJCQl9CisJCQkJaWYgKCQxLT5pbmZvLnN0byAmIFNleHRlcm4pCisJCQkJIAkkMS0+aW5mby50eXAgPSBta21ldGhvZCgkMS0+aW5mby50eXAsIHNwLT50YWJsZSk7CisJCQkgIAllbHNlIGlmIChzcC0+ZW50cnkgJiYgKHNwLT5lbnRyeS0+aW5mby50eXAtPnR5cGUgPT0gVHBvaW50ZXIgfHwgc3AtPmVudHJ5LT5pbmZvLnR5cC0+dHlwZSA9PSBUcmVmZXJlbmNlIHx8IHNwLT5lbnRyeS0+aW5mby50eXAtPnR5cGUgPT0gVGFycmF5IHx8IGlzX3RyYW5zaWVudChzcC0+ZW50cnktPmluZm8udHlwKSkpCisJCQkJewlpZiAoJDEtPmluZm8udHlwLT50eXBlID09IFRpbnQpCisJCQkJCXsJc3AtPmVudHJ5LT5pbmZvLnN0byA9IChTdG9yYWdlKSgoaW50KXNwLT5lbnRyeS0+aW5mby5zdG8gfCAoaW50KVNyZXR1cm4pOworCQkJCQkJJDEtPmluZm8udHlwID0gbWtmdW4oc3AtPmVudHJ5KTsKKwkJCQkJCSQxLT5pbmZvLnR5cC0+aWQgPSAkMS0+c3ltOworCQkJCQkJaWYgKCFpc190cmFuc2llbnQoc3AtPmVudHJ5LT5pbmZvLnR5cCkpCisJCQkJCQkJaWYgKCFpc19yZXNwb25zZShzcC0+ZW50cnktPmluZm8udHlwKSkKKwkJCQkJCQl7CWlmICghaXNfWE1MKHNwLT5lbnRyeS0+aW5mby50eXApKQorCQkJCQkJCQkJYWRkX3Jlc3BvbnNlKCQxLCBzcC0+ZW50cnkpOworCQkJCQkJCX0KKwkJCQkJCQllbHNlCisJCQkJCQkJCWFkZF9yZXN1bHQoc3AtPmVudHJ5LT5pbmZvLnR5cCk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CXNwcmludGYoZXJyYnVmLCAicmV0dXJuIHR5cGUgb2YgcmVtb3RlIG1ldGhvZCBmdW5jdGlvbiBwcm90b3R5cGUgJyVzJyBtdXN0IGJlIGludGVnZXIiLCAkMS0+c3ltLT5uYW1lKTsKKwkJCQkJCXNlbWVycm9yKGVycmJ1Zik7CisJCQkJCX0KKwkJCQl9CisJCQkgIAllbHNlCisJCQkgIAl7CXNwcmludGYoZXJyYnVmLCAibGFzdCBvdXRwdXQgcGFyYW1ldGVyIG9mIHJlbW90ZSBtZXRob2QgZnVuY3Rpb24gcHJvdG90eXBlICclcycgaXMgYSByZXR1cm4gcGFyYW1ldGVyIGFuZCBtdXN0IGJlIGEgcG9pbnRlciBvciByZWZlcmVuY2UiLCAkMS0+c3ltLT5uYW1lKTsKKwkJCQkJc2VtZXJyb3IoZXJyYnVmKTsKKwkJCSAgCX0KKwkJCQlpZiAoISgkMS0+aW5mby5zdG8gJiBTZXh0ZXJuKSkKKwkJCSAgCXsJdW5saW5rbGFzdChzcC0+dGFibGUpOworCQkJICAJCWlmICgocCA9IGVudHJ5KGNsYXNzdGFibGUsICQxLT5zeW0pKSkKKwkJCQkJewlpZiAoKFRhYmxlKikgcC0+aW5mby50eXAtPnJlZikKKwkJCQkJCXsJc3ByaW50ZihlcnJidWYsICJyZW1vdGUgbWV0aG9kIG5hbWUgY2xhc2g6IHN0cnVjdC9jbGFzcyAnJXMnIGFscmVhZHkgZGVjbGFyZWQgYXQgbGluZSAlZCIsICQxLT5zeW0tPm5hbWUsIHAtPmxpbmVubyk7CisJCQkJCQkJc2VtZXJyb3IoZXJyYnVmKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsJcC0+aW5mby50eXAtPnJlZiA9IHNwLT50YWJsZTsKKwkJCQkJCQlwLT5pbmZvLnR5cC0+d2lkdGggPSBzcC0+b2Zmc2V0OworCQkJCQkJfQorCQkJCQl9CisJCQkgIAkJZWxzZQorCQkJICAJCXsJcCA9IGVudGVyKGNsYXNzdGFibGUsICQxLT5zeW0pOworCQkJCQkJcC0+aW5mby50eXAgPSBta3N0cnVjdChzcC0+dGFibGUsIHNwLT5vZmZzZXQpOworCQkJCQkJcC0+aW5mby50eXAtPmlkID0gJDEtPnN5bTsKKwkJCSAgCQl9CisJCQkgIAl9CisJCQkgIH0KKwkJCSAgZWxzZSBpZiAoJDEtPmxldmVsID09IElOVEVSTkFMKQorCQkJICB7CSQxLT5pbmZvLnR5cCA9IG1rbWV0aG9kKCQxLT5pbmZvLnR5cCwgc3AtPnRhYmxlKTsKKwkJCQkkMS0+aW5mby5zdG8gPSAoU3RvcmFnZSkoKGludCkkMS0+aW5mby5zdG8gfCAoaW50KSQ2IHwgKGludCkkNyk7CisJCQkgIAl0cmFuc2llbnQgJj0gfjE7CisJCQkgIH0KKwkJCSAgZXhpdHNjb3BlKCk7CisJCQl9CisJOworZm5hbWUJOgkJeyAkJCA9IHNwLT5lbnRyeTsgfQorCTsKK2Zhcmdzbwk6IC8qIGVtcHR5ICovCXsgfQorCXwgZmFyZ3MJCXsgfQorCTsKK2ZhcmdzCTogZmFyZwkJeyB9CisJfCBmYXJnICcsJyBmYXJnc3sgfQorCTsKK2ZhcmcJOiB0c3BlYyBwdHJzIGFyZyBhcnJheWNrIG9jY3VycyBpbml0CisJCQl7IGlmICgkNC5zdG8gJiBTdHlwZWRlZikKKwkJCSAgCXNlbXdhcm4oInR5cGVkZWYgaW4gZnVuY3Rpb24gYXJndW1lbnQiKTsKKwkJCSAgcCA9IGVudGVyKHNwLT50YWJsZSwgJDMpOworCQkJICBwLT5pbmZvLnR5cCA9ICQ0LnR5cDsKKwkJCSAgcC0+aW5mby5zdG8gPSAkNC5zdG87CisJCQkgIGlmICgkNS5taW5PY2N1cnMgPCAwKQorCQkJICB7CWlmICgoJDQuc3RvICYgU2F0dHJpYnV0ZSkgfHwgJDQudHlwLT50eXBlID09IFRwb2ludGVyKQorCQkJICAgICAgICAJcC0+aW5mby5taW5PY2N1cnMgPSAwOworCQkJICAgICAgIAllbHNlCisJCQkgICAgICAgIAlwLT5pbmZvLm1pbk9jY3VycyA9IDE7CisJCQkgIH0KKwkJCSAgZWxzZQorCQkJCXAtPmluZm8ubWluT2NjdXJzID0gJDUubWluT2NjdXJzOworCQkJICBwLT5pbmZvLm1heE9jY3VycyA9ICQ1Lm1heE9jY3VyczsKKwkJCSAgaWYgKCQ2Lmhhc3ZhbCkKKwkJCSAgewlwLT5pbmZvLmhhc3ZhbCA9IFRydWU7CisJCQkJc3dpdGNoICgkNC50eXAtPnR5cGUpCisJCQkJewljYXNlIFRjaGFyOgorCQkJCQljYXNlIFR1Y2hhcjoKKwkJCQkJY2FzZSBUc2hvcnQ6CisJCQkJCWNhc2UgVHVzaG9ydDoKKwkJCQkJY2FzZSBUaW50OgorCQkJCQljYXNlIFR1aW50OgorCQkJCQljYXNlIFRsb25nOgorCQkJCQljYXNlIFR1bG9uZzoKKwkJCQkJY2FzZSBUZW51bToKKwkJCQkJY2FzZSBUdGltZToKKwkJCQkJCWlmICgkNi50eXAtPnR5cGUgPT0gVGludCB8fCAkNi50eXAtPnR5cGUgPT0gVGNoYXIgfHwgJDYudHlwLT50eXBlID09IFRlbnVtKQorCQkJCQkJCXNwLT52YWwgPSBwLT5pbmZvLnZhbC5pID0gJDYudmFsLmk7CisJCQkJCQllbHNlCisJCQkJCQl7CXNlbWVycm9yKCJ0eXBlIGVycm9yIGluIGluaXRpYWxpemF0aW9uIGNvbnN0YW50Iik7CisJCQkJCQkJcC0+aW5mby5oYXN2YWwgPSBGYWxzZTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFRmbG9hdDoKKwkJCQkJY2FzZSBUZG91YmxlOgorCQkJCQkJaWYgKCQ2LnR5cC0+dHlwZSA9PSBUZmxvYXQgfHwgJDYudHlwLT50eXBlID09IFRkb3VibGUpCisJCQkJCQkJcC0+aW5mby52YWwuciA9ICQ2LnZhbC5yOworCQkJCQkJZWxzZSBpZiAoJDYudHlwLT50eXBlID09IFRpbnQpCisJCQkJCQkJcC0+aW5mby52YWwuciA9IChkb3VibGUpJDYudmFsLmk7CisJCQkJCQllbHNlCisJCQkJCQl7CXNlbWVycm9yKCJ0eXBlIGVycm9yIGluIGluaXRpYWxpemF0aW9uIGNvbnN0YW50Iik7CisJCQkJCQkJcC0+aW5mby5oYXN2YWwgPSBGYWxzZTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJaWYgKCQ0LnR5cC0+dHlwZSA9PSBUcG9pbnRlcgorCQkJCQkJICYmICgoVG5vZGUqKSQ0LnR5cC0+cmVmKS0+dHlwZSA9PSBUY2hhcgorCQkJCQkJICYmICQ2LnR5cC0+dHlwZSA9PSBUcG9pbnRlcgorCQkJCQkJICYmICgoVG5vZGUqKSQ2LnR5cC0+cmVmKS0+dHlwZSA9PSBUY2hhcikKKwkJCQkJCQlwLT5pbmZvLnZhbC5zID0gJDYudmFsLnM7CisJCQkJCQllbHNlIGlmICgkNC50eXAtPnR5cGUgPT0gVHBvaW50ZXIKKwkJCQkJCSAgICAgICYmICgoVG5vZGUqKSQ0LnR5cC0+cmVmKS0+aWQgPT0gbG9va3VwKCJzdGQ6OnN0cmluZyIpKQorCQkJCQkJICAgICAgCXAtPmluZm8udmFsLnMgPSAkNi52YWwuczsKKwkJCQkJCWVsc2UgaWYgKCQ0LnR5cC0+aWQgPT0gbG9va3VwKCJzdGQ6OnN0cmluZyIpKQorCQkJCQkJICAgICAgCXAtPmluZm8udmFsLnMgPSAkNi52YWwuczsKKwkJCQkJCWVsc2UgaWYgKCQ0LnR5cC0+dHlwZSA9PSBUcG9pbnRlcgorCQkJCQkJICAgICAgJiYgJDYudHlwLT50eXBlID09IFRpbnQKKwkJCQkJCSAgICAgICYmICQ2LnZhbC5pID09IDApCisJCQkJCQkJcC0+aW5mby52YWwuaSA9IDA7CisJCQkJCQllbHNlCisJCQkJCQl7CXNlbWVycm9yKCJ0eXBlIGVycm9yIGluIGluaXRpYWxpemF0aW9uIGNvbnN0YW50Iik7CisJCQkJCQkJcC0+aW5mby5oYXN2YWwgPSBGYWxzZTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCSAgfQorCQkJICBwLT5pbmZvLm9mZnNldCA9IHNwLT5vZmZzZXQ7CisJCQkgIGlmICgkNC5zdG8gJiBTZXh0ZXJuKQorCQkJCXAtPmxldmVsID0gR0xPQkFMOworCQkJICBlbHNlIGlmIChzcC0+Z3JvdykKKwkJCQlzcC0+b2Zmc2V0ICs9IHAtPmluZm8udHlwLT53aWR0aDsKKwkJCSAgZWxzZSBpZiAocC0+aW5mby50eXAtPndpZHRoID4gc3AtPm9mZnNldCkKKwkJCQlzcC0+b2Zmc2V0ID0gcC0+aW5mby50eXAtPndpZHRoOworCQkJICBzcC0+ZW50cnkgPSBwOworCQkJfQorCTsKK2FyZwk6IC8qIGVtcHR5ICovCXsgaWYgKHNwLT50YWJsZS0+bGV2ZWwgIT0gUEFSQU0pCisJCQkgICAgJCQgPSBnZW5zeW1pZHgoInBhcmFtIiwgKytzcC0+dmFsKTsKKwkJCSAgZWxzZSBpZiAoZWZsYWcpCisJCQkJJCQgPSBnZW5zeW1pZHgoIl9wYXJhbSIsICsrc3AtPnZhbCk7CisJCQkgIGVsc2UKKwkJCQkkJCA9IGdlbnN5bSgiX3BhcmFtIik7CisJCQl9CisJfCBJRAkJeyBpZiAodmZsYWcgIT0gMSAmJiAqJDEtPm5hbWUgPT0gJ18nICYmIHNwLT50YWJsZS0+bGV2ZWwgPT0gR0xPQkFMKQorCQkJICB7IHNwcmludGYoZXJyYnVmLCAiU09BUCAxLjIgZG9lcyBub3Qgc3VwcG9ydCBhbm9ueW1vdXMgcGFyYW1ldGVycyAnJXMnIiwgJDEtPm5hbWUpOworCQkJICAgIHNlbXdhcm4oZXJyYnVmKTsKKwkJCSAgfQorCQkJICAkJCA9ICQxOworCQkJfQorCTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKworCVR5cGUgc3BlY2lmaWNhdGlvbgorCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiB0ZXhwIDogdHlwZSBleHByZXNzaW9uIChzdWJzZXQgb2YgQykgKi8KK3RleHAJOiB0c3BlYyBwdHJzIGFycmF5CisJCQl7ICQkID0gJDM7IH0KKwl8IHRzcGVjIHB0cnMgSUQgYXJyYXkKKwkJCXsgJCQgPSAkNDsgfQorCTsKK3NwZWMJOiAvKmVtcHR5ICovCXsgJCQudHlwID0gbWtpbnQoKTsKKwkJCSAgJCQuc3RvID0gU25vbmU7CisJCQkgIHNwLT5ub2RlID0gJCQ7CisJCQl9CisJfCBzdG9yZSBzcGVjCXsgJCQudHlwID0gJDIudHlwOworCQkJICAkJC5zdG8gPSAoU3RvcmFnZSkoKGludCkkMSB8IChpbnQpJDIuc3RvKTsKKwkJCSAgaWYgKCgkJC5zdG8gJiBTYXR0cmlidXRlKSAmJiAhaXNfcHJpbWl0aXZlX29yX3N0cmluZygkMi50eXApICYmICFpc19zdGRzdHIoJDIudHlwKSAmJiAhaXNfYmluYXJ5KCQyLnR5cCkpCisJCQkgIHsJc2Vtd2FybigiaW52YWxpZCBhdHRyaWJ1dGUgdHlwZSIpOworCQkJICAJJCQuc3RvICY9IH5TYXR0cmlidXRlOworCQkJICB9CisJCQkgIHNwLT5ub2RlID0gJCQ7CisJCQkgIGlmICgkMSAmIFNleHRlcm4pCisJCQkJdHJhbnNpZW50ID0gMDsKKwkJCX0KKwl8IHR5cGUgc3BlYwl7IGlmICgkMS0+dHlwZSA9PSBUaW50KQorCQkJCXN3aXRjaCAoJDIudHlwLT50eXBlKQorCQkJCXsgY2FzZSBUY2hhcjoJJCQudHlwID0gJDIudHlwOyBicmVhazsKKwkJCQkgIGNhc2UgVHNob3J0OgkkJC50eXAgPSAkMi50eXA7IGJyZWFrOworCQkJCSAgY2FzZSBUaW50OgkkJC50eXAgPSAkMTsgYnJlYWs7CisJCQkJICBjYXNlIFRsb25nOgkkJC50eXAgPSAkMi50eXA7IGJyZWFrOworCQkJCSAgY2FzZSBUbGxvbmc6CSQkLnR5cCA9ICQyLnR5cDsgYnJlYWs7CisJCQkJICBkZWZhdWx0OglzZW13YXJuKCJpbGxlZ2FsIHVzZSBvZiAnc2lnbmVkJyIpOworCQkJCQkJJCQudHlwID0gJDIudHlwOworCQkJCX0KKwkJCSAgZWxzZSBpZiAoJDEtPnR5cGUgPT0gVHVpbnQpCisJCQkJc3dpdGNoICgkMi50eXAtPnR5cGUpCisJCQkJeyBjYXNlIFRjaGFyOgkkJC50eXAgPSBta3VjaGFyKCk7IGJyZWFrOworCQkJCSAgY2FzZSBUc2hvcnQ6CSQkLnR5cCA9IG1rdXNob3J0KCk7IGJyZWFrOworCQkJCSAgY2FzZSBUaW50OgkkJC50eXAgPSAkMTsgYnJlYWs7CisJCQkJICBjYXNlIFRsb25nOgkkJC50eXAgPSBta3Vsb25nKCk7IGJyZWFrOworCQkJCSAgY2FzZSBUbGxvbmc6CSQkLnR5cCA9IG1rdWxsb25nKCk7IGJyZWFrOworCQkJCSAgZGVmYXVsdDoJc2Vtd2FybigiaWxsZWdhbCB1c2Ugb2YgJ3Vuc2lnbmVkJyIpOworCQkJCQkJJCQudHlwID0gJDIudHlwOworCQkJCX0KKwkJCSAgZWxzZSBpZiAoJDEtPnR5cGUgPT0gVGxvbmcpCisJCQkJc3dpdGNoICgkMi50eXAtPnR5cGUpCisJCQkJeyBjYXNlIFRpbnQ6CSQkLnR5cCA9ICQxOyBicmVhazsKKwkJCQkgIGNhc2UgVGxvbmc6CSQkLnR5cCA9IG1rbGxvbmcoKTsgYnJlYWs7CisJCQkJICBjYXNlIFR1aW50OgkkJC50eXAgPSBta3Vsb25nKCk7IGJyZWFrOworCQkJCSAgY2FzZSBUdWxvbmc6CSQkLnR5cCA9IG1rdWxsb25nKCk7IGJyZWFrOworCQkJCSAgZGVmYXVsdDoJc2Vtd2FybigiaWxsZWdhbCB1c2Ugb2YgJ2xvbmcnIik7CisJCQkJCQkkJC50eXAgPSAkMi50eXA7CisJCQkJfQorCQkJICBlbHNlIGlmICgkMS0+dHlwZSA9PSBUdWxvbmcpCisJCQkJc3dpdGNoICgkMi50eXAtPnR5cGUpCisJCQkJeyBjYXNlIFRpbnQ6CSQkLnR5cCA9ICQxOyBicmVhazsKKwkJCQkgIGNhc2UgVGxvbmc6CSQkLnR5cCA9IG1rdWxsb25nKCk7IGJyZWFrOworCQkJCSAgY2FzZSBUdWludDoJJCQudHlwID0gJDE7IGJyZWFrOworCQkJCSAgY2FzZSBUdWxvbmc6CSQkLnR5cCA9IG1rdWxsb25nKCk7IGJyZWFrOworCQkJCSAgZGVmYXVsdDoJc2Vtd2FybigiaWxsZWdhbCB1c2Ugb2YgJ2xvbmcnIik7CisJCQkJCQkkJC50eXAgPSAkMi50eXA7CisJCQkJfQorCQkJICBlbHNlIGlmICgkMi50eXAtPnR5cGUgPT0gVGludCkKKwkJCQkkJC50eXAgPSAkMTsKKwkJCSAgZWxzZQorCQkJICAJc2Vtd2FybigiaW52YWxpZCB0eXBlIChtaXNzaW5nICc7Jz8pIik7CisJCQkgICQkLnN0byA9ICQyLnN0bzsKKwkJCSAgc3AtPm5vZGUgPSAkJDsKKwkJCX0KKwk7Cit0c3BlYwk6IHN0b3JlCQl7ICQkLnR5cCA9IG1raW50KCk7CisJCQkgICQkLnN0byA9ICQxOworCQkJICBzcC0+bm9kZSA9ICQkOworCQkJICBpZiAoJDEgJiBTZXh0ZXJuKQorCQkJCXRyYW5zaWVudCA9IDA7CisJCQl9CisJfCB0eXBlCQl7ICQkLnR5cCA9ICQxOworCQkJICAkJC5zdG8gPSBTbm9uZTsKKwkJCSAgc3AtPm5vZGUgPSAkJDsKKwkJCX0KKwl8IHN0b3JlIHRzcGVjCXsgJCQudHlwID0gJDIudHlwOworCQkJICAkJC5zdG8gPSAoU3RvcmFnZSkoKGludCkkMSB8IChpbnQpJDIuc3RvKTsKKwkJCSAgaWYgKCgkJC5zdG8gJiBTYXR0cmlidXRlKSAmJiAhaXNfcHJpbWl0aXZlX29yX3N0cmluZygkMi50eXApICYmICFpc19zdGRzdHIoJDIudHlwKSAmJiAhaXNfYmluYXJ5KCQyLnR5cCkpCisJCQkgIHsJc2Vtd2FybigiaW52YWxpZCBhdHRyaWJ1dGUgdHlwZSIpOworCQkJICAJJCQuc3RvICY9IH5TYXR0cmlidXRlOworCQkJICB9CisJCQkgIHNwLT5ub2RlID0gJCQ7CisJCQkgIGlmICgkMSAmIFNleHRlcm4pCisJCQkJdHJhbnNpZW50ID0gMDsKKwkJCX0KKwl8IHR5cGUgdHNwZWMJeyBpZiAoJDEtPnR5cGUgPT0gVGludCkKKwkJCQlzd2l0Y2ggKCQyLnR5cC0+dHlwZSkKKwkJCQl7IGNhc2UgVGNoYXI6CSQkLnR5cCA9ICQyLnR5cDsgYnJlYWs7CisJCQkJICBjYXNlIFRzaG9ydDoJJCQudHlwID0gJDIudHlwOyBicmVhazsKKwkJCQkgIGNhc2UgVGludDoJJCQudHlwID0gJDE7IGJyZWFrOworCQkJCSAgY2FzZSBUbG9uZzoJJCQudHlwID0gJDIudHlwOyBicmVhazsKKwkJCQkgIGNhc2UgVGxsb25nOgkkJC50eXAgPSAkMi50eXA7IGJyZWFrOworCQkJCSAgZGVmYXVsdDoJc2Vtd2FybigiaWxsZWdhbCB1c2Ugb2YgJ3NpZ25lZCciKTsKKwkJCQkJCSQkLnR5cCA9ICQyLnR5cDsKKwkJCQl9CisJCQkgIGVsc2UgaWYgKCQxLT50eXBlID09IFR1aW50KQorCQkJCXN3aXRjaCAoJDIudHlwLT50eXBlKQorCQkJCXsgY2FzZSBUY2hhcjoJJCQudHlwID0gbWt1Y2hhcigpOyBicmVhazsKKwkJCQkgIGNhc2UgVHNob3J0OgkkJC50eXAgPSBta3VzaG9ydCgpOyBicmVhazsKKwkJCQkgIGNhc2UgVGludDoJJCQudHlwID0gJDE7IGJyZWFrOworCQkJCSAgY2FzZSBUbG9uZzoJJCQudHlwID0gbWt1bG9uZygpOyBicmVhazsKKwkJCQkgIGNhc2UgVGxsb25nOgkkJC50eXAgPSBta3VsbG9uZygpOyBicmVhazsKKwkJCQkgIGRlZmF1bHQ6CXNlbXdhcm4oImlsbGVnYWwgdXNlIG9mICd1bnNpZ25lZCciKTsKKwkJCQkJCSQkLnR5cCA9ICQyLnR5cDsKKwkJCQl9CisJCQkgIGVsc2UgaWYgKCQxLT50eXBlID09IFRsb25nKQorCQkJCXN3aXRjaCAoJDIudHlwLT50eXBlKQorCQkJCXsgY2FzZSBUaW50OgkkJC50eXAgPSAkMTsgYnJlYWs7CisJCQkJICBjYXNlIFRsb25nOgkkJC50eXAgPSBta2xsb25nKCk7IGJyZWFrOworCQkJCSAgY2FzZSBUdWludDoJJCQudHlwID0gbWt1bG9uZygpOyBicmVhazsKKwkJCQkgIGNhc2UgVHVsb25nOgkkJC50eXAgPSBta3VsbG9uZygpOyBicmVhazsKKwkJCQkgIGRlZmF1bHQ6CXNlbXdhcm4oImlsbGVnYWwgdXNlIG9mICdsb25nJyIpOworCQkJCQkJJCQudHlwID0gJDIudHlwOworCQkJCX0KKwkJCSAgZWxzZSBpZiAoJDEtPnR5cGUgPT0gVHVsb25nKQorCQkJCXN3aXRjaCAoJDIudHlwLT50eXBlKQorCQkJCXsgY2FzZSBUaW50OgkkJC50eXAgPSAkMTsgYnJlYWs7CisJCQkJICBjYXNlIFRsb25nOgkkJC50eXAgPSBta3VsbG9uZygpOyBicmVhazsKKwkJCQkgIGNhc2UgVHVpbnQ6CSQkLnR5cCA9ICQxOyBicmVhazsKKwkJCQkgIGNhc2UgVHVsb25nOgkkJC50eXAgPSBta3VsbG9uZygpOyBicmVhazsKKwkJCQkgIGRlZmF1bHQ6CXNlbXdhcm4oImlsbGVnYWwgdXNlIG9mICdsb25nJyIpOworCQkJCQkJJCQudHlwID0gJDIudHlwOworCQkJCX0KKwkJCSAgZWxzZSBpZiAoJDIudHlwLT50eXBlID09IFRpbnQpCisJCQkJJCQudHlwID0gJDE7CisJCQkgIGVsc2UKKwkJCSAgCXNlbXdhcm4oImludmFsaWQgdHlwZSIpOworCQkJICAkJC5zdG8gPSAkMi5zdG87CisJCQkgIHNwLT5ub2RlID0gJCQ7CisJCQl9CisJOwordHlwZQk6IFZPSUQJCXsgJCQgPSBta3ZvaWQoKTsgfQorCXwgQk9PTAkJeyAkJCA9IG1rYm9vbCgpOyB9CisJfCBDSEFSCQl7ICQkID0gbWtjaGFyKCk7IH0KKwl8IFdDSEFSCQl7ICQkID0gbWt3Y2hhcnQoKTsgfQorCXwgU0hPUlQJCXsgJCQgPSBta3Nob3J0KCk7IH0KKwl8IElOVAkJeyAkJCA9IG1raW50KCk7IH0KKwl8IExPTkcJCXsgJCQgPSBta2xvbmcoKTsgfQorCXwgTExPTkcJCXsgJCQgPSBta2xsb25nKCk7IH0KKwl8IFVMTE9ORwl7ICQkID0gbWt1bGxvbmcoKTsgfQorCXwgU0laRQkJeyAkJCA9IG1rdWxvbmcoKTsgfQorCXwgRkxPQVQJCXsgJCQgPSBta2Zsb2F0KCk7IH0KKwl8IERPVUJMRQl7ICQkID0gbWtkb3VibGUoKTsgfQorCXwgU0lHTkVECXsgJCQgPSBta2ludCgpOyB9CisJfCBVTlNJR05FRAl7ICQkID0gbWt1aW50KCk7IH0KKwl8IFRJTUUJCXsgJCQgPSBta3RpbWV0KCk7IH0KKwl8IFRFTVBMQVRFICc8JyB0bmFtZSBpZCAnPicgQ0xBU1MgaWQKKwkJCXsgaWYgKCEocCA9IGVudHJ5KHRlbXBsYXRldGFibGUsICQ3KSkpCisJCQkgIHsJcCA9IGVudGVyKHRlbXBsYXRldGFibGUsICQ3KTsKKwkJCSAgCXAtPmluZm8udHlwID0gbWt0ZW1wbGF0ZShOVUxMLCAkNyk7CisJCQkgIAkkNy0+dG9rZW4gPSBUWVBFOworCQkJICB9CisJCQkgICQkID0gcC0+aW5mby50eXA7CisJCQl9CisJfCBDTEFTUyAneycgczIgZGVjbHMgJ30nCisJCQl7IHN5bSA9IGdlbnN5bSgiX1N0cnVjdCIpOworCQkJICBzcHJpbnRmKGVycmJ1ZiwgImFub255bW91cyBjbGFzcyB3aWxsIGJlIG5hbWVkICclcyciLCBzeW0tPm5hbWUpOworCQkJICBzZW13YXJuKGVycmJ1Zik7CisJCQkgIGlmICgocCA9IGVudHJ5KGNsYXNzdGFibGUsIHN5bSkpKQorCQkJICB7CWlmIChwLT5pbmZvLnR5cC0+cmVmIHx8IHAtPmluZm8udHlwLT50eXBlICE9IFRjbGFzcykKKwkJCQl7CXNwcmludGYoZXJyYnVmLCAiY2xhc3MgJyVzJyBhbHJlYWR5IGRlY2xhcmVkIGF0IGxpbmUgJWQiLCBzeW0tPm5hbWUsIHAtPmxpbmVubyk7CisJCQkJCXNlbWVycm9yKGVycmJ1Zik7CisJCQkJfQorCQkJICB9CisJCQkgIGVsc2UKKwkJCSAgewlwID0gZW50ZXIoY2xhc3N0YWJsZSwgc3ltKTsKKwkJCQlwLT5pbmZvLnR5cCA9IG1rY2xhc3MoKFRhYmxlKikwLCAwKTsKKwkJCSAgfQorCQkJICBzeW0tPnRva2VuID0gVFlQRTsKKwkJCSAgc3AtPnRhYmxlLT5zeW0gPSBzeW07CisJCQkgIHAtPmluZm8udHlwLT5yZWYgPSBzcC0+dGFibGU7CisJCQkgIHAtPmluZm8udHlwLT53aWR0aCA9IHNwLT5vZmZzZXQ7CisJCQkgIHAtPmluZm8udHlwLT5pZCA9IHN5bTsKKwkJCSAgJCQgPSBwLT5pbmZvLnR5cDsKKwkJCSAgZXhpdHNjb3BlKCk7CisJCQl9CisJfCBjbGFzcyAneycgczIgZGVjbHMgJ30nCisJCQl7IHAgPSByZWVudGVyKGNsYXNzdGFibGUsICQxLT5zeW0pOworCQkJICBzcC0+dGFibGUtPnN5bSA9IHAtPnN5bTsKKwkJCSAgcC0+aW5mby50eXAtPnJlZiA9IHNwLT50YWJsZTsKKwkJCSAgcC0+aW5mby50eXAtPndpZHRoID0gc3AtPm9mZnNldDsKKwkJCSAgcC0+aW5mby50eXAtPmlkID0gcC0+c3ltOworCQkJICBpZiAocC0+aW5mby50eXAtPmJhc2UpCisJCQkgIAlzcC0+dGFibGUtPnByZXYgPSAoVGFibGUqKWVudHJ5KGNsYXNzdGFibGUsIHAtPmluZm8udHlwLT5iYXNlKS0+aW5mby50eXAtPnJlZjsKKwkJCSAgJCQgPSBwLT5pbmZvLnR5cDsKKwkJCSAgZXhpdHNjb3BlKCk7CisJCQl9CisJfCBjbGFzcyAnOicgc3VwZXIgJ3snIHMyIGRlY2xzICd9JworCQkJeyBwID0gcmVlbnRlcihjbGFzc3RhYmxlLCAkMS0+c3ltKTsKKwkJCSAgc3AtPnRhYmxlLT5zeW0gPSBwLT5zeW07CisJCQkgIGlmICghJDMpCisJCQkJc2VtZXJyb3IoImludmFsaWQgYmFzZSBjbGFzcyIpOworCQkJICBlbHNlCisJCQkgIHsJc3AtPnRhYmxlLT5wcmV2ID0gKFRhYmxlKikkMy0+aW5mby50eXAtPnJlZjsKKwkJCQlpZiAoIXNwLT50YWJsZS0+cHJldiAmJiAhJDMtPmluZm8udHlwLT50cmFuc2llbnQpCisJCQkJewlzcHJpbnRmKGVycmJ1ZiwgImNsYXNzICclcycgaGFzIGluY29tcGxldGUgdHlwZSIsICQzLT5zeW0tPm5hbWUpOworCQkJCQlzZW1lcnJvcihlcnJidWYpOworCQkJCX0KKwkJCSAgfQorCQkJICBwLT5pbmZvLnR5cC0+cmVmID0gc3AtPnRhYmxlOworCQkJICBwLT5pbmZvLnR5cC0+d2lkdGggPSBzcC0+b2Zmc2V0OworCQkJICBwLT5pbmZvLnR5cC0+aWQgPSBwLT5zeW07CisJCQkgIHAtPmluZm8udHlwLT5iYXNlID0gJDMtPmluZm8udHlwLT5pZDsKKwkJCSAgJCQgPSBwLT5pbmZvLnR5cDsKKwkJCSAgZXhpdHNjb3BlKCk7CisJCQl9CisJfCBjbGFzcwkJeyAkMS0+aW5mby50eXAtPmlkID0gJDEtPnN5bTsKKwkJCSAgJCQgPSAkMS0+aW5mby50eXA7CisJCQl9CisJfCBjbGFzcyAnOicgc3VwZXIKKwkJCXsgaWYgKCEkMykKKwkJCQlzZW1lcnJvcigiaW52YWxpZCBiYXNlIGNsYXNzIik7CisJCQkgIGVsc2UKKwkJCSAgewlpZiAoISQzLT5pbmZvLnR5cC0+cmVmICYmICEkMy0+aW5mby50eXAtPnRyYW5zaWVudCkKKwkJCQl7CXNwcmludGYoZXJyYnVmLCAiY2xhc3MgJyVzJyBoYXMgaW5jb21wbGV0ZSB0eXBlIiwgJDMtPnN5bS0+bmFtZSk7CisJCQkJCXNlbWVycm9yKGVycmJ1Zik7CisJCQkJfQorCQkJICB9CisJCQkgICQxLT5pbmZvLnR5cC0+aWQgPSAkMS0+c3ltOworCQkJICAkMS0+aW5mby50eXAtPmJhc2UgPSAkMy0+aW5mby50eXAtPmlkOworCQkJICAkJCA9ICQxLT5pbmZvLnR5cDsKKwkJCX0KKwl8IFNUUlVDVCAneycgczIgZGVjbHMgJ30nCisJCQl7IHN5bSA9IGdlbnN5bSgiX1N0cnVjdCIpOworCQkJICBzcHJpbnRmKGVycmJ1ZiwgImFub255bW91cyBzdHJ1Y3Qgd2lsbCBiZSBuYW1lZCAnJXMnIiwgc3ltLT5uYW1lKTsKKwkJCSAgc2Vtd2FybihlcnJidWYpOworCQkJICBpZiAoKHAgPSBlbnRyeShjbGFzc3RhYmxlLCBzeW0pKSkKKwkJCSAgewlpZiAocC0+aW5mby50eXAtPnJlZiB8fCBwLT5pbmZvLnR5cC0+dHlwZSAhPSBUc3RydWN0KQorCQkJCXsJc3ByaW50ZihlcnJidWYsICJzdHJ1Y3QgJyVzJyBhbHJlYWR5IGRlY2xhcmVkIGF0IGxpbmUgJWQiLCBzeW0tPm5hbWUsIHAtPmxpbmVubyk7CisJCQkJCXNlbWVycm9yKGVycmJ1Zik7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CXAtPmluZm8udHlwLT5yZWYgPSBzcC0+dGFibGU7CisJCQkJCXAtPmluZm8udHlwLT53aWR0aCA9IHNwLT5vZmZzZXQ7CisJCQkJfQorCQkJICB9CisJCQkgIGVsc2UKKwkJCSAgewlwID0gZW50ZXIoY2xhc3N0YWJsZSwgc3ltKTsKKwkJCQlwLT5pbmZvLnR5cCA9IG1rc3RydWN0KHNwLT50YWJsZSwgc3AtPm9mZnNldCk7CisJCQkgIH0KKwkJCSAgcC0+aW5mby50eXAtPmlkID0gc3ltOworCQkJICAkJCA9IHAtPmluZm8udHlwOworCQkJICBleGl0c2NvcGUoKTsKKwkJCX0KKwl8IHN0cnVjdCAneycgczIgZGVjbHMgJ30nCisJCQl7IGlmICgocCA9IGVudHJ5KGNsYXNzdGFibGUsICQxLT5zeW0pKSAmJiBwLT5pbmZvLnR5cC0+cmVmKQorCQkJICB7CXNwcmludGYoZXJyYnVmLCAic3RydWN0ICclcycgYWxyZWFkeSBkZWNsYXJlZCBhdCBsaW5lICVkIiwgJDEtPnN5bS0+bmFtZSwgcC0+bGluZW5vKTsKKwkJCQlzZW1lcnJvcihlcnJidWYpOworCQkJICB9CisJCQkgIGVsc2UKKwkJCSAgewlwID0gcmVlbnRlcihjbGFzc3RhYmxlLCAkMS0+c3ltKTsKKwkJCSAgCXAtPmluZm8udHlwLT5yZWYgPSBzcC0+dGFibGU7CisJCQkgIAlwLT5pbmZvLnR5cC0+d2lkdGggPSBzcC0+b2Zmc2V0OworCQkJICAJcC0+aW5mby50eXAtPmlkID0gcC0+c3ltOworCQkJICB9CisJCQkgICQkID0gcC0+aW5mby50eXA7CisJCQkgIGV4aXRzY29wZSgpOworCQkJfQorCXwgU1RSVUNUIElECXsgaWYgKChwID0gZW50cnkoY2xhc3N0YWJsZSwgJDIpKSkKKwkJCSAgewlpZiAocC0+aW5mby50eXAtPnR5cGUgPT0gVHN0cnVjdCkKKwkJCSAgCQkkJCA9IHAtPmluZm8udHlwOworCQkJICAJZWxzZQorCQkJCXsJc3ByaW50ZihlcnJidWYsICInc3RydWN0ICVzJyByZWRlY2xhcmF0aW9uICVzIiwgJDItPm5hbWUpOworCQkJICAJCXNlbWVycm9yKGVycmJ1Zik7CisJCQkgIAkJJCQgPSBta2ludCgpOworCQkJCX0KKwkJCSAgfQorCQkJICBlbHNlCisJCQkgIHsJcCA9IGVudGVyKGNsYXNzdGFibGUsICQyKTsKKwkJCSAgCSQkID0gcC0+aW5mby50eXAgPSBta3N0cnVjdCgoVGFibGUqKTAsIDApOworCQkJCXAtPmluZm8udHlwLT5pZCA9ICQyOworCQkJICB9CisJCQl9CisJfCBTVFJVQ1QgVFlQRQl7IGlmICgocCA9IGVudHJ5KGNsYXNzdGFibGUsICQyKSkpCisJCQkgIHsJaWYgKHAtPmluZm8udHlwLT50eXBlID09IFRzdHJ1Y3QpCisJCQkJCSQkID0gcC0+aW5mby50eXA7CisJCQkgIAllbHNlCisJCQkJewlzcHJpbnRmKGVycmJ1ZiwgIidzdHJ1Y3QgJXMnIHJlZGVjbGFyYXRpb24gJXMiLCAkMi0+bmFtZSk7CisJCQkgIAkJc2VtZXJyb3IoZXJyYnVmKTsKKwkJCSAgCQkkJCA9IG1raW50KCk7CisJCQkJfQorCQkJICB9CisJCQkgIGVsc2UKKwkJCSAgewlwID0gZW50ZXIoY2xhc3N0YWJsZSwgJDIpOworCQkJICAJJCQgPSBwLT5pbmZvLnR5cCA9IG1rc3RydWN0KChUYWJsZSopMCwgMCk7CisJCQkJcC0+aW5mby50eXAtPmlkID0gJDI7CisJCQkgIH0KKwkJCX0KKwl8IFVOSU9OICd7JyBzMyBkZWNscyAnfScKKwkJCXsgc3ltID0gZ2Vuc3ltKCJfVW5pb24iKTsKKwkJCSAgc3ByaW50ZihlcnJidWYsICJhbm9ueW1vdXMgdW5pb24gd2lsbCBiZSBuYW1lZCAnJXMnIiwgc3ltLT5uYW1lKTsKKwkJCSAgc2Vtd2FybihlcnJidWYpOworCQkJICAkJCA9IG1rdW5pb24oc3AtPnRhYmxlLCBzcC0+b2Zmc2V0KTsKKwkJCSAgaWYgKChwID0gZW50cnkoY2xhc3N0YWJsZSwgc3ltKSkpCisJCQkgIHsJaWYgKChUYWJsZSopIHAtPmluZm8udHlwLT5yZWYpCisJCQkJewlzcHJpbnRmKGVycmJ1ZiwgInVuaW9uIG9yIHN0cnVjdCAnJXMnIGFscmVhZHkgZGVjbGFyZWQgYXQgbGluZSAlZCIsIHN5bS0+bmFtZSwgcC0+bGluZW5vKTsKKwkJCQkJc2VtZXJyb3IoZXJyYnVmKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsJcC0+aW5mby50eXAtPnJlZiA9IHNwLT50YWJsZTsKKwkJCQkJcC0+aW5mby50eXAtPndpZHRoID0gc3AtPm9mZnNldDsKKwkJCQl9CisJCQkgIH0KKwkJCSAgZWxzZQorCQkJICB7CXAgPSBlbnRlcihjbGFzc3RhYmxlLCBzeW0pOworCQkJCXAtPmluZm8udHlwID0gbWt1bmlvbihzcC0+dGFibGUsIHNwLT5vZmZzZXQpOworCQkJICB9CisJCQkgIHAtPmluZm8udHlwLT5pZCA9IHN5bTsKKwkJCSAgJCQgPSBwLT5pbmZvLnR5cDsKKwkJCSAgZXhpdHNjb3BlKCk7CisJCQl9CisJfCBVTklPTiBpZCAneycgczMgZGVjbHMgJ30nCisJCQl7IGlmICgocCA9IGVudHJ5KGNsYXNzdGFibGUsICQyKSkpCisJCQkgIHsJaWYgKHAtPmluZm8udHlwLT5yZWYgfHwgcC0+aW5mby50eXAtPnR5cGUgIT0gVHVuaW9uKQorCQkJICAJewlzcHJpbnRmKGVycmJ1ZiwgInVuaW9uICclcycgYWxyZWFkeSBkZWNsYXJlZCBhdCBsaW5lICVkIiwgJDItPm5hbWUsIHAtPmxpbmVubyk7CisJCQkJCXNlbWVycm9yKGVycmJ1Zik7CisJCQkgIAkJcC0+aW5mby50eXA7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CXAgPSByZWVudGVyKGNsYXNzdGFibGUsICQyKTsKKwkJCQkJcC0+aW5mby50eXAtPnJlZiA9IHNwLT50YWJsZTsKKwkJCQkJcC0+aW5mby50eXAtPndpZHRoID0gc3AtPm9mZnNldDsKKwkJCQl9CisJCQkgIH0KKwkJCSAgZWxzZQorCQkJICB7CXAgPSBlbnRlcihjbGFzc3RhYmxlLCAkMik7CisJCQkJcC0+aW5mby50eXAgPSBta3VuaW9uKHNwLT50YWJsZSwgc3AtPm9mZnNldCk7CisJCQkgIH0KKwkJCSAgcC0+aW5mby50eXAtPmlkID0gJDI7CisJCQkgICQkID0gcC0+aW5mby50eXA7CisJCQkgIGV4aXRzY29wZSgpOworCQkJfQorCXwgVU5JT04gSUQJeyBpZiAoKHAgPSBlbnRyeShjbGFzc3RhYmxlLCAkMikpKQorCQkJICB7CWlmIChwLT5pbmZvLnR5cC0+dHlwZSA9PSBUdW5pb24pCisJCQkJCSQkID0gcC0+aW5mby50eXA7CisJCQkgIAllbHNlCisJCQkJewlzcHJpbnRmKGVycmJ1ZiwgIid1bmlvbiAlcycgcmVkZWNsYXJhdGlvbiAlcyIsICQyLT5uYW1lKTsKKwkJCSAgCQlzZW1lcnJvcihlcnJidWYpOworCQkJICAJCSQkID0gbWtpbnQoKTsKKwkJCQl9CisJCQkgIH0KKwkJCSAgZWxzZQorCQkJICB7CXAgPSBlbnRlcihjbGFzc3RhYmxlLCAkMik7CisJCQkgIAkkJCA9IHAtPmluZm8udHlwID0gbWt1bmlvbigoVGFibGUqKSAwLCAwKTsKKwkJCQlwLT5pbmZvLnR5cC0+aWQgPSAkMjsKKwkJCSAgfQorCQkJfQorCXwgVU5JT04gVFlQRQl7IGlmICgocCA9IGVudHJ5KGNsYXNzdGFibGUsICQyKSkpCisJCQkgIHsJaWYgKHAtPmluZm8udHlwLT50eXBlID09IFR1bmlvbikKKwkJCQkJJCQgPSBwLT5pbmZvLnR5cDsKKwkJCSAgCWVsc2UKKwkJCQl7CXNwcmludGYoZXJyYnVmLCAiJ3VuaW9uICVzJyByZWRlY2xhcmF0aW9uICVzIiwgJDItPm5hbWUpOworCQkJICAJCXNlbWVycm9yKGVycmJ1Zik7CisJCQkgIAkJJCQgPSBta2ludCgpOworCQkJCX0KKwkJCSAgfQorCQkJICBlbHNlCisJCQkgIHsJcCA9IGVudGVyKGNsYXNzdGFibGUsICQyKTsKKwkJCSAgCSQkID0gcC0+aW5mby50eXAgPSBta3VuaW9uKChUYWJsZSopIDAsIDApOworCQkJCXAtPmluZm8udHlwLT5pZCA9ICQyOworCQkJICB9CisJCQl9CisJfCBFTlVNICd7JyBzMiBkY2xycyBzNSAnfScKKwkJCXsgc3ltID0gZ2Vuc3ltKCJfRW51bSIpOworCQkJICBzcHJpbnRmKGVycmJ1ZiwgImFub255bW91cyBlbnVtIHdpbGwgYmUgbmFtZWQgJyVzJyIsIHN5bS0+bmFtZSk7CisJCQkgIHNlbXdhcm4oZXJyYnVmKTsKKwkJCSAgaWYgKChwID0gZW50cnkoZW51bXRhYmxlLCBzeW0pKSkKKwkJCSAgewlpZiAoKFRhYmxlKikgcC0+aW5mby50eXAtPnJlZikKKwkJCQl7CXNwcmludGYoZXJyYnVmLCAiZW51bSAnJXMnIGFscmVhZHkgZGVjbGFyZWQgYXQgbGluZSAlZCIsIHN5bS0+bmFtZSwgcC0+bGluZW5vKTsKKwkJCQkJc2VtZXJyb3IoZXJyYnVmKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsJcC0+aW5mby50eXAtPnJlZiA9IHNwLT50YWJsZTsKKwkJCQkJcC0+aW5mby50eXAtPndpZHRoID0gNDsgLyogNCA9IGVudW0gKi8KKwkJCQl9CisJCQkgIH0KKwkJCSAgZWxzZQorCQkJICB7CXAgPSBlbnRlcihlbnVtdGFibGUsIHN5bSk7CisJCQkJcC0+aW5mby50eXAgPSBta2VudW0oc3AtPnRhYmxlKTsKKwkJCSAgfQorCQkJICBwLT5pbmZvLnR5cC0+aWQgPSBzeW07CisJCQkgICQkID0gcC0+aW5mby50eXA7CisJCQkgIGV4aXRzY29wZSgpOworCQkJfQorCXwgRU5VTSBpZCAneycgczIgZGNscnMgczUgJ30nCisJCQl7IGlmICgocCA9IGVudHJ5KGVudW10YWJsZSwgJDIpKSkKKwkJCSAgewlpZiAoKFRhYmxlKikgcC0+aW5mby50eXAtPnJlZikKKwkJCQl7CXNwcmludGYoZXJyYnVmLCAiZW51bSAnJXMnIGFscmVhZHkgZGVjbGFyZWQgYXQgbGluZSAlZCIsICQyLT5uYW1lLCBwLT5saW5lbm8pOworCQkJCQlzZW1lcnJvcihlcnJidWYpOworCQkJCX0KKwkJCQllbHNlCisJCQkJewlwLT5pbmZvLnR5cC0+cmVmID0gc3AtPnRhYmxlOworCQkJCQlwLT5pbmZvLnR5cC0+d2lkdGggPSA0OyAvKiA0ID0gZW51bSAqLworCQkJCX0KKwkJCSAgfQorCQkJICBlbHNlCisJCQkgIHsJcCA9IGVudGVyKGVudW10YWJsZSwgJDIpOworCQkJCXAtPmluZm8udHlwID0gbWtlbnVtKHNwLT50YWJsZSk7CisJCQkgIH0KKwkJCSAgcC0+aW5mby50eXAtPmlkID0gJDI7CisJCQkgICQkID0gcC0+aW5mby50eXA7CisJCQkgIGV4aXRzY29wZSgpOworCQkJfQorCXwgRU5VTSAnKicgaWQgJ3snIHM0IGRjbHJzIHM1ICd9JworCQkJeyBpZiAoKHAgPSBlbnRyeShlbnVtdGFibGUsICQzKSkpCisJCQkgIHsJaWYgKHAtPmluZm8udHlwLT5yZWYpCisJCQkJewlzcHJpbnRmKGVycmJ1ZiwgImVudW0gJyVzJyBhbHJlYWR5IGRlY2xhcmVkIGF0IGxpbmUgJWQiLCAkMy0+bmFtZSwgcC0+bGluZW5vKTsKKwkJCQkJc2VtZXJyb3IoZXJyYnVmKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsJcC0+aW5mby50eXAtPnJlZiA9IHNwLT50YWJsZTsKKwkJCQkJcC0+aW5mby50eXAtPndpZHRoID0gODsgLyogOCA9IG1hc2sgKi8KKwkJCQl9CisJCQkgIH0KKwkJCSAgZWxzZQorCQkJICB7CXAgPSBlbnRlcihlbnVtdGFibGUsICQzKTsKKwkJCQlwLT5pbmZvLnR5cCA9IG1rbWFzayhzcC0+dGFibGUpOworCQkJICB9CisJCQkgIHAtPmluZm8udHlwLT5pZCA9ICQzOworCQkJICAkJCA9IHAtPmluZm8udHlwOworCQkJICBleGl0c2NvcGUoKTsKKwkJCX0KKwl8IEVOVU0gSUQJeyBpZiAoKHAgPSBlbnRyeShlbnVtdGFibGUsICQyKSkpCisJCQkgIAkkJCA9IHAtPmluZm8udHlwOworCQkJICBlbHNlCisJCQkgIHsJcCA9IGVudGVyKGVudW10YWJsZSwgJDIpOworCQkJICAJJCQgPSBwLT5pbmZvLnR5cCA9IG1rZW51bSgoVGFibGUqKTApOworCQkJCXAtPmluZm8udHlwLT5pZCA9ICQyOworCQkJICB9CisJCQl9CisJfCBFTlVNIFRZUEUJeyBpZiAoKHAgPSBlbnRyeShlbnVtdGFibGUsICQyKSkpCisJCQkJJCQgPSBwLT5pbmZvLnR5cDsKKwkJCSAgZWxzZQorCQkJICB7CXAgPSBlbnRlcihlbnVtdGFibGUsICQyKTsKKwkJCSAgCSQkID0gcC0+aW5mby50eXAgPSBta2VudW0oKFRhYmxlKikwKTsKKwkJCQlwLT5pbmZvLnR5cC0+aWQgPSAkMjsKKwkJCSAgfQorCQkJfQorCXwgVFlQRQkJeyBpZiAoKHAgPSBlbnRyeSh0eXBldGFibGUsICQxKSkpCisJCQkJJCQgPSBwLT5pbmZvLnR5cDsKKwkJCSAgZWxzZSBpZiAoKHAgPSBlbnRyeShjbGFzc3RhYmxlLCAkMSkpKQorCQkJICAJJCQgPSBwLT5pbmZvLnR5cDsKKwkJCSAgZWxzZSBpZiAoKHAgPSBlbnRyeShlbnVtdGFibGUsICQxKSkpCisJCQkgIAkkJCA9IHAtPmluZm8udHlwOworCQkJICBlbHNlIGlmICgkMSA9PSBsb29rdXAoInN0ZDo6c3RyaW5nIikgfHwgJDEgPT0gbG9va3VwKCJzdGQ6OndzdHJpbmciKSkKKwkJCSAgewlwID0gZW50ZXIoY2xhc3N0YWJsZSwgJDEpOworCQkJCSQkID0gcC0+aW5mby50eXAgPSBta2NsYXNzKChUYWJsZSopMCwgMCk7CisJCQkgIAlwLT5pbmZvLnR5cC0+aWQgPSAkMTsKKwkJCSAgCXAtPmluZm8udHlwLT50cmFuc2llbnQgPSAtMjsKKwkJCSAgfQorCQkJICBlbHNlCisJCQkgIHsJc3ByaW50ZihlcnJidWYsICJ1bmtub3duIHR5cGUgJyVzJyIsICQxLT5uYW1lKTsKKwkJCQlzZW1lcnJvcihlcnJidWYpOworCQkJCSQkID0gbWtpbnQoKTsKKwkJCSAgfQorCQkJfQorCXwgVFlQRSAnPCcgdGV4cCAnPicKKwkJCXsgaWYgKChwID0gZW50cnkodGVtcGxhdGV0YWJsZSwgJDEpKSkKKwkJCQkkJCA9IG1rdGVtcGxhdGUoJDMudHlwLCAkMSk7CisJCQkgIGVsc2UKKwkJCSAgewlzcHJpbnRmKGVycmJ1ZiwgImludmFsaWQgdGVtcGxhdGUgJyVzJyIsICQxLT5uYW1lKTsKKwkJCQlzZW1lcnJvcihlcnJidWYpOworCQkJCSQkID0gbWtpbnQoKTsKKwkJCSAgfQorCQkJfQorCTsKK3N0cnVjdAk6IFNUUlVDVCBpZAl7IGlmICgocCA9IGVudHJ5KGNsYXNzdGFibGUsICQyKSkpCisJCQkgIHsJaWYgKHAtPmluZm8udHlwLT5yZWYpCisJCQkJewlzcHJpbnRmKGVycmJ1ZiwgInN0cnVjdCAnJXMnIGFscmVhZHkgZGVjbGFyZWQgYXQgbGluZSAlZCIsICQyLT5uYW1lLCBwLT5saW5lbm8pOworCQkJCQlzZW1lcnJvcihlcnJidWYpOworCQkJCX0KKwkJCQllbHNlCisJCQkJCXAgPSByZWVudGVyKGNsYXNzdGFibGUsICQyKTsKKwkJCSAgfQorCQkJICBlbHNlCisJCQkgIHsJcCA9IGVudGVyKGNsYXNzdGFibGUsICQyKTsKKwkJCQlwLT5pbmZvLnR5cCA9IG1rc3RydWN0KChUYWJsZSopMCwgMCk7CisJCQkgIH0KKwkJCSAgJCQgPSBwOworCQkJfQorCTsKK2NsYXNzCTogQ0xBU1MgaWQJeyBpZiAoKHAgPSBlbnRyeShjbGFzc3RhYmxlLCAkMikpKQorCQkJICB7CWlmIChwLT5pbmZvLnR5cC0+cmVmKQorCQkJCXsJc3ByaW50ZihlcnJidWYsICJjbGFzcyAnJXMnIGFscmVhZHkgZGVjbGFyZWQgYXQgbGluZSAlZCIsICQyLT5uYW1lLCBwLT5saW5lbm8pOworCQkJCQlzZW1lcnJvcihlcnJidWYpOworCQkJCX0KKwkJCQllbHNlCisJCQkJCXAgPSByZWVudGVyKGNsYXNzdGFibGUsICQyKTsKKwkJCSAgfQorCQkJICBlbHNlCisJCQkgIHsJcCA9IGVudGVyKGNsYXNzdGFibGUsICQyKTsKKwkJCQlwLT5pbmZvLnR5cCA9IG1rY2xhc3MoKFRhYmxlKikwLCAwKTsKKwkJCQlwLT5pbmZvLnR5cC0+aWQgPSBwLT5zeW07CisJCQkgIH0KKwkJCSAgJDItPnRva2VuID0gVFlQRTsKKwkJCSAgJCQgPSBwOworCQkJfQorCTsKK3RuYW1lCTogQ0xBU1MJCXsgfQorCXwgVFlQRU5BTUUJeyB9CisJOworc3VwZXIJOiBQUk9URUNURUQgVFlQRXsgJCQgPSBlbnRyeShjbGFzc3RhYmxlLCAkMik7IH0KKwl8IFBSSVZBVEUgVFlQRQl7ICQkID0gZW50cnkoY2xhc3N0YWJsZSwgJDIpOyB9CisJfCBQVUJMSUMgVFlQRQl7ICQkID0gZW50cnkoY2xhc3N0YWJsZSwgJDIpOyB9CisJfCBUWVBFCQl7ICQkID0gZW50cnkoY2xhc3N0YWJsZSwgJDEpOyB9CisJOworczIJOiAvKiBlbXB0eSAqLwl7IGlmICh0cmFuc2llbnQgPT0gLTIpCisJCQkgIAl0cmFuc2llbnQgPSAwOworCQkJICBwZXJtaXNzaW9uID0gMDsKKwkJCSAgZW50ZXJzY29wZShta3RhYmxlKE5VTEwpLCAwKTsKKwkJCSAgc3AtPmVudHJ5ID0gTlVMTDsKKwkJCX0KKwk7CitzMwk6IC8qIGVtcHR5ICovCXsgaWYgKHRyYW5zaWVudCA9PSAtMikKKwkJCSAgCXRyYW5zaWVudCA9IDA7CisJCQkgIHBlcm1pc3Npb24gPSAwOworCQkJICBlbnRlcnNjb3BlKG1rdGFibGUoTlVMTCksIDApOworCQkJICBzcC0+ZW50cnkgPSBOVUxMOworCQkJICBzcC0+Z3JvdyA9IEZhbHNlOworCQkJfQorCTsKK3M0CTogLyogZW1wdHkgKi8JeyBlbnRlcnNjb3BlKG1rdGFibGUoTlVMTCksIDApOworCQkJICBzcC0+ZW50cnkgPSBOVUxMOworCQkJICBzcC0+bWFzayA9IFRydWU7CisJCQkgIHNwLT52YWwgPSAxOworCQkJfQorCTsKK3M1CTogLyogZW1wdHkgKi8JeyB9CisJfCAnLCcJCXsgfQorCTsKK3M2CTogLyogZW1wdHkgKi8JeyBpZiAoc3AtPnRhYmxlLT5sZXZlbCA9PSBJTlRFUk5BTCkKKwkJCSAgCXRyYW5zaWVudCB8PSAxOworCQkJICBwZXJtaXNzaW9uID0gMDsKKwkJCSAgZW50ZXJzY29wZShta3RhYmxlKE5VTEwpLCAwKTsKKwkJCSAgc3AtPmVudHJ5ID0gTlVMTDsKKwkJCSAgc3AtPnRhYmxlLT5sZXZlbCA9IFBBUkFNOworCQkJfQorCTsKK3N0b3JlCTogQVVUTwkJeyAkJCA9IFNhdXRvOyB9CisJfCBSRUdJU1RFUgl7ICQkID0gU3JlZ2lzdGVyOyB9CisJfCBTVEFUSUMJeyAkJCA9IFNzdGF0aWM7IH0KKwl8IEVYUExJQ0lUCXsgJCQgPSBTZXhwbGljaXQ7IH0KKwl8IEVYVEVSTgl7ICQkID0gU2V4dGVybjsgdHJhbnNpZW50ID0gMTsgfQorCXwgVFlQRURFRgl7ICQkID0gU3R5cGVkZWY7IH0KKwl8IFZJUlRVQUwJeyAkJCA9IFN2aXJ0dWFsOyB9CisJfCBDT05TVAkJeyAkJCA9IFNjb25zdDsgfQorCXwgRlJJRU5ECXsgJCQgPSBTZnJpZW5kOyB9CisJfCBJTkxJTkUJeyAkJCA9IFNpbmxpbmU7IH0KKwl8IE1VU1RVTkRFUlNUQU5EeyAkJCA9IFNtdXN0VW5kZXJzdGFuZDsgfQorCXwgUkVUVVJOCXsgJCQgPSBTcmV0dXJuOyB9CisJfCAnQCcJCXsgJCQgPSBTYXR0cmlidXRlOworCQkJICBpZiAoZWZsYWcpCisJCQkgICAJc2Vtd2FybigiU09BUCBSUEMgZW5jb2RpbmcgZG9lcyBub3Qgc3VwcG9ydCBYTUwgYXR0cmlidXRlcyIpOworCQkJfQorCXwgVk9MQVRJTEUJeyAkJCA9IFNleHRlcm47IHRyYW5zaWVudCA9IC0yOyB9CisJOworY29uc3RvYmo6IC8qIGVtcHR5ICovCXsgJCQgPSBTbm9uZTsgfQorCXwgQ09OU1QJCXsgJCQgPSBTY29uc3RvYmo7IH0KKwk7CithYnN0cmFjdDogLyogZW1wdHkgKi8JeyAkJCA9IFNub25lOyB9CisJfCAnPScgTE5HCXsgJCQgPSBTYWJzdHJhY3Q7IH0KKwk7Cit2aXJ0dWFsIDogLyogZW1wdHkgKi8JeyAkJCA9IFNub25lOyB9CisJfCBWSVJUVUFMCXsgJCQgPSBTdmlydHVhbDsgfQorCTsKK3B0cnMJOiAvKiBlbXB0eSAqLwl7ICQkID0gdG1wID0gc3AtPm5vZGU7IH0KKwl8IHB0cnMgJyonCXsgdG1wLnR5cCA9IG1rcG9pbnRlcih0bXAudHlwKTsKKwkJCSAgdG1wLnR5cC0+dHJhbnNpZW50ID0gdHJhbnNpZW50OworCQkJICAkJCA9IHRtcDsKKwkJCX0KKwl8IHB0cnMgJyYnCXsgdG1wLnR5cCA9IG1rcmVmZXJlbmNlKHRtcC50eXApOworCQkJICB0bXAudHlwLT50cmFuc2llbnQgPSB0cmFuc2llbnQ7CisJCQkgICQkID0gdG1wOworCQkJfQorCTsKK2FycmF5CTogLyogZW1wdHkgKi8gCXsgJCQgPSB0bXA7CS8qIHRtcCBpcyBpbmhlcml0ZWQgKi8KKwkJCX0KKwl8ICdbJyBjZXhwICddJyBhcnJheQorCQkJeyBpZiAoJDQudHlwLT50eXBlID09IFRjaGFyKQorCQkJICB7CXNwcmludGYoZXJyYnVmLCAiY2hhclsiU09BUF9MT05HX0ZPUk1BVCJdIHdpbGwgYmUgZW5jb2RlZCBhcyBhbiBhcnJheSBvZiAiU09BUF9MT05HX0ZPUk1BVCIgYnl0ZXM6IHVzZSBjaGFyKiBmb3Igc3RyaW5ncyIsICQyLnZhbC5pLCAkMi52YWwuaSk7CisJCQkgIAlzZW13YXJuKGVycmJ1Zik7CisJCQkgIH0KKwkJCSAgaWYgKCQyLmhhc3ZhbCAmJiAkMi50eXAtPnR5cGUgPT0gVGludCAmJiAkMi52YWwuaSA+IDAgJiYgJDQudHlwLT53aWR0aCA+IDApCisJCQkJJCQudHlwID0gbWthcnJheSgkNC50eXAsIChpbnQpICQyLnZhbC5pICogJDQudHlwLT53aWR0aCk7CisJCQkgIGVsc2UKKwkJCSAgewkkJC50eXAgPSBta2FycmF5KCQ0LnR5cCwgMCk7CisJCQkgIAlzZW1lcnJvcigidW5kZXRlcm1pbmVkIGFycmF5IHNpemUiKTsKKwkJCSAgfQorCQkJICAkJC5zdG8gPSAkNC5zdG87CisJCQl9CisJfCAnWycgJ10nIGFycmF5CXsgJCQudHlwID0gbWtwb2ludGVyKCQzLnR5cCk7IC8qIHplcm8gc2l6ZSBhcnJheSA9IHBvaW50ZXIgKi8KKwkJCSAgJCQuc3RvID0gJDMuc3RvOworCQkJfQorCTsKK2FycmF5Y2sJOiBhcnJheQkJeyBpZiAoJDEudHlwLT50eXBlID09IFRzdHJ1Y3QgfHwgJDEudHlwLT50eXBlID09IFRjbGFzcykKKwkJCQlpZiAoISQxLnR5cC0+cmVmICYmICEkMS50eXAtPnRyYW5zaWVudCAmJiAhKCQxLnN0byAmIFN0eXBlZGVmKSkKKwkJCSAgIAl7CXNwcmludGYoZXJyYnVmLCAic3RydWN0L2NsYXNzICclcycgaGFzIGluY29tcGxldGUgdHlwZSIsICQxLnR5cC0+aWQtPm5hbWUpOworCQkJCQlzZW1lcnJvcihlcnJidWYpOworCQkJCX0KKwkJCSAgJCQgPSAkMTsKKwkJCX0KKwk7Citpbml0CTogLyogZW1wdHkgKi8gICB7ICQkLmhhc3ZhbCA9IEZhbHNlOyB9CisJfCAnPScgY2V4cCAgICAgIHsgaWYgKCQyLmhhc3ZhbCkKKwkJCSAgewkkJC50eXAgPSAkMi50eXA7CisJCQkJJCQuaGFzdmFsID0gVHJ1ZTsKKwkJCQkkJC52YWwgPSAkMi52YWw7CisJCQkgIH0KKwkJCSAgZWxzZQorCQkJICB7CSQkLmhhc3ZhbCA9IEZhbHNlOworCQkJCXNlbWVycm9yKCJpbml0aWFsaXphdGlvbiBleHByZXNzaW9uIG5vdCBjb25zdGFudCIpOworCQkJICB9CisJCQl9CisgICAgICAgIDsKK29jY3Vycwk6IHBhdHQKKwkJCXsgJCQubWluT2NjdXJzID0gLTE7CisJCQkgICQkLm1heE9jY3VycyA9IDE7CisJCQkgICQkLnBhdHRlcm4gPSAkMTsKKwkJCX0KKwl8IHBhdHQgY2ludAorCQkJeyAkJC5taW5PY2N1cnMgPSAkMjsKKwkJCSAgJCQubWF4T2NjdXJzID0gMTsKKwkJCSAgJCQucGF0dGVybiA9ICQxOworCQkJfQorCXwgcGF0dCBjaW50ICc6JworCQkJeyAkJC5taW5PY2N1cnMgPSAkMjsKKwkJCSAgJCQubWF4T2NjdXJzID0gMTsKKwkJCSAgJCQucGF0dGVybiA9ICQxOworCQkJfQorCXwgcGF0dCBjaW50ICc6JyBjaW50CisJCQl7ICQkLm1pbk9jY3VycyA9ICQyOworCQkJICAkJC5tYXhPY2N1cnMgPSAkNDsKKwkJCSAgJCQucGF0dGVybiA9ICQxOworCQkJfQorCXwgcGF0dCAnOicgY2ludAorCQkJeyAkJC5taW5PY2N1cnMgPSAtMTsKKwkJCSAgJCQubWF4T2NjdXJzID0gJDM7CisJCQkgICQkLnBhdHRlcm4gPSAkMTsKKwkJCX0KKwk7CitwYXR0CTogLyogZW1wdHkgKi8JeyAkJCA9IE5VTEw7IH0KKwl8IFNUUgkJeyAkJCA9ICQxOyB9CisJOworY2ludAk6IExORwkJeyAkJCA9ICQxOyB9CisJfCAnLScgTE5HCXsgJCQgPSAtJDI7IH0KKwk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisKKwlFeHByZXNzaW9ucworCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitleHByCTogZXhwciAnLCcgZXhwcgl7ICQkID0gJDM7IH0KKwl8IGNleHAJCXsgJCQgPSAkMTsgfQorCTsKKy8qIGNleHAgOiBjb25kaXRpb25hbCBleHByZXNzaW9uICovCitjZXhwCTogb2JleCAnPycgcWV4cCAnOicgY2V4cAorCQkJeyAkJC50eXAgPSAkMy50eXA7CisJCQkgICQkLnN0byA9IFNub25lOworCQkJICAkJC5oYXN2YWwgPSBGYWxzZTsKKwkJCX0KKwl8IG9leHAKKwk7CisvKiBxZXhwIDogdHJ1ZS1icmFuY2ggb2YgPyA6IGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gKi8KK3FleHAJOiBleHByCQl7ICQkID0gJDE7IH0KKwk7CisvKiBvZXhwIDogb3ItZXhwcmVzc2lvbiAqLworb2V4cAk6IG9iZXggT1IgYWV4cAl7ICQkLmhhc3ZhbCA9IEZhbHNlOworCQkJICAkJC50eXAgPSBta2ludCgpOworCQkJfQorCXwgYWV4cAkJeyAkJCA9ICQxOyB9CisJOworb2JleAk6IG9leHAJCXsgJCQgPSAkMTsgfQorCTsKKy8qIGFleHAgOiBhbmQtZXhwcmVzc2lvbiAqLworYWV4cAk6IGFiZXggQU4gcmV4cAl7ICQkLmhhc3ZhbCA9IEZhbHNlOworCQkJICAkJC50eXAgPSBta2ludCgpOworCQkJfQorCXwgcmV4cAkJeyAkJCA9ICQxOyB9CisJOworYWJleAk6IGFleHAJCXsgJCQgPSAkMTsgfQorCTsKKy8qIHJleHAgOiByZWxhdGlvbmFsIGV4cHJlc3Npb24gKi8KK3JleHAJOiByZXhwICd8JyByZXhwCXsgJCQgPSBpb3AoInwiLCAkMSwgJDMpOyB9CisJfCByZXhwICdeJyByZXhwCXsgJCQgPSBpb3AoIl4iLCAkMSwgJDMpOyB9CisJfCByZXhwICcmJyByZXhwCXsgJCQgPSBpb3AoIiYiLCAkMSwgJDMpOyB9CisJfCByZXhwIEVRICByZXhwCXsgJCQgPSByZWxvcCgiPT0iLCAkMSwgJDMpOyB9CisJfCByZXhwIE5FICByZXhwCXsgJCQgPSByZWxvcCgiIT0iLCAkMSwgJDMpOyB9CisJfCByZXhwICc8JyByZXhwCXsgJCQgPSByZWxvcCgiPCIsICQxLCAkMyk7IH0KKwl8IHJleHAgTEUgIHJleHAJeyAkJCA9IHJlbG9wKCI8PSIsICQxLCAkMyk7IH0KKwl8IHJleHAgJz4nIHJleHAJeyAkJCA9IHJlbG9wKCI+IiwgJDEsICQzKTsgfQorCXwgcmV4cCBHRSAgcmV4cAl7ICQkID0gcmVsb3AoIj49IiwgJDEsICQzKTsgfQorCXwgcmV4cCBMUyAgcmV4cAl7ICQkID0gaW9wKCI8PCIsICQxLCAkMyk7IH0KKwl8IHJleHAgUlMgIHJleHAJeyAkJCA9IGlvcCgiPj4iLCAkMSwgJDMpOyB9CisJfCByZXhwICcrJyByZXhwCXsgJCQgPSBvcCgiKyIsICQxLCAkMyk7IH0KKwl8IHJleHAgJy0nIHJleHAJeyAkJCA9IG9wKCItIiwgJDEsICQzKTsgfQorCXwgcmV4cCAnKicgcmV4cAl7ICQkID0gb3AoIioiLCAkMSwgJDMpOyB9CisJfCByZXhwICcvJyByZXhwCXsgJCQgPSBvcCgiLyIsICQxLCAkMyk7IH0KKwl8IHJleHAgJyUnIHJleHAJeyAkJCA9IGlvcCgiJSIsICQxLCAkMyk7IH0KKwl8IGxleHAJCXsgJCQgPSAkMTsgfQorCTsKKy8qIGxleHAgOiBsdmFsdWUga2luZCBvZiBleHByZXNzaW9uIHdpdGggb3B0aW9uYWwgcHJlZml4IGNvbnRydWN0cyAqLworbGV4cAk6ICchJyBsZXhwCXsgaWYgKCQyLmhhc3ZhbCkKKwkJCQkkJC52YWwuaSA9ICEkMi52YWwuaTsKKwkJCSAgJCQudHlwID0gJDIudHlwOworCQkJICAkJC5oYXN2YWwgPSAkMi5oYXN2YWw7CisJCQl9CisJfCAnficgbGV4cAl7IGlmICgkMi5oYXN2YWwpCisJCQkJJCQudmFsLmkgPSB+JDIudmFsLmk7CisJCQkgICQkLnR5cCA9ICQyLnR5cDsKKwkJCSAgJCQuaGFzdmFsID0gJDIuaGFzdmFsOworCQkJfQorCXwgJy0nIGxleHAJeyBpZiAoJDIuaGFzdmFsKSB7CisJCQkJaWYgKGludGVnZXIoJDIudHlwKSkKKwkJCQkJJCQudmFsLmkgPSAtJDIudmFsLmk7CisJCQkJZWxzZSBpZiAocmVhbCgkMi50eXApKQorCQkJCQkkJC52YWwuciA9IC0kMi52YWwucjsKKwkJCQllbHNlCXR5cGVycm9yKCJzdHJpbmc/Iik7CisJCQkgIH0KKwkJCSAgJCQudHlwID0gJDIudHlwOworCQkJICAkJC5oYXN2YWwgPSAkMi5oYXN2YWw7CisJCQl9CisJfCAnKycgbGV4cAl7ICQkID0gJDI7IH0KKwl8ICcqJyBsZXhwCXsgaWYgKCQyLnR5cC0+dHlwZSA9PSBUcG9pbnRlcikgeworCQkJICAJJCQudHlwID0gKFRub2RlKikgJDIudHlwLT5yZWY7CisJCQkgIH0gZWxzZQorCQkJICAJdHlwZXJyb3IoImRlcmVmZXJlbmNlIG9mIG5vbi1wb2ludGVyIHR5cGUiKTsKKwkJCSAgJCQuc3RvID0gU25vbmU7CisJCQkgICQkLmhhc3ZhbCA9IEZhbHNlOworCQkJfQorCXwgJyYnIGxleHAJeyAkJC50eXAgPSBta3BvaW50ZXIoJDIudHlwKTsKKwkJCSAgJCQuc3RvID0gU25vbmU7CisJCQkgICQkLmhhc3ZhbCA9IEZhbHNlOworCQkJfQorCXwgU0laRU9GICcoJyB0ZXhwICcpJworCQkJeyAkJC5oYXN2YWwgPSBUcnVlOworCQkJICAkJC50eXAgPSBta2ludCgpOworCQkJICAkJC52YWwuaSA9ICQzLnR5cC0+d2lkdGg7CisJCQl9CisJfCBwZXhwCQl7ICQkID0gJDE7IH0KKwk7CisvKiBwZXhwIDogcHJpbWl0aXZlIGV4cHJlc3Npb24gd2l0aCBvcHRpb25hbCBwb3N0Zml4IGNvbnN0cnVjdHMgKi8KK3BleHAJOiAnKCcgZXhwciAnKScJeyAkJCA9ICQyOyB9CisJfCBJRAkJeyBpZiAoKHAgPSBlbnVtZW50cnkoJDEpKSA9PSAoRW50cnkqKSAwKQorCQkJCXAgPSB1bmRlZmluZWQoJDEpOworCQkJICBlbHNlCisJCQkgIAkkJC5oYXN2YWwgPSBUcnVlOworCQkJICAkJC50eXAgPSBwLT5pbmZvLnR5cDsKKwkJCSAgJCQudmFsID0gcC0+aW5mby52YWw7CisJCQl9CisJfCBMTkcJCXsgJCQudHlwID0gbWtpbnQoKTsKKwkJCSAgJCQuaGFzdmFsID0gVHJ1ZTsKKwkJCSAgJCQudmFsLmkgPSAkMTsKKwkJCX0KKwl8IG51bGwJCXsgJCQudHlwID0gbWtpbnQoKTsKKwkJCSAgJCQuaGFzdmFsID0gVHJ1ZTsKKwkJCSAgJCQudmFsLmkgPSAwOworCQkJfQorCXwgREJMCQl7ICQkLnR5cCA9IG1rZmxvYXQoKTsKKwkJCSAgJCQuaGFzdmFsID0gVHJ1ZTsKKwkJCSAgJCQudmFsLnIgPSAkMTsKKwkJCX0KKwl8IENIUgkJeyAkJC50eXAgPSBta2NoYXIoKTsKKwkJCSAgJCQuaGFzdmFsID0gVHJ1ZTsKKwkJCSAgJCQudmFsLmkgPSAkMTsKKwkJCX0KKwl8IFNUUgkJeyAkJC50eXAgPSBta3N0cmluZygpOworCQkJICAkJC5oYXN2YWwgPSBUcnVlOworCQkJICAkJC52YWwucyA9ICQxOworCQkJfQorCXwgQ0ZBTFNFCXsgJCQudHlwID0gbWtib29sKCk7CisJCQkgICQkLmhhc3ZhbCA9IFRydWU7CisJCQkgICQkLnZhbC5pID0gMDsKKwkJCX0KKwl8IENUUlVFCQl7ICQkLnR5cCA9IG1rYm9vbCgpOworCQkJICAkJC5oYXN2YWwgPSBUcnVlOworCQkJICAkJC52YWwuaSA9IDE7CisJCQl9CisJOworCislJQorCisvKgorICogPz8/CisgKi8KK2ludAoreXl3cmFwKCkKK3sJcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisKKwlTdXBwb3J0IHJvdXRpbmVzCisKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBOb2RlCitvcChjb25zdCBjaGFyICpvcCwgTm9kZSBwLCBOb2RlIHEpCit7CU5vZGUJcjsKKwlUbm9kZQkqdHlwOworCXIudHlwID0gcC50eXA7CisJci5zdG8gPSBTbm9uZTsKKwlpZiAocC5oYXN2YWwgJiYgcS5oYXN2YWwpIHsKKwkJaWYgKGludGVnZXIocC50eXApICYmIGludGVnZXIocS50eXApKQorCQkJc3dpdGNoIChvcFswXSkgeworCQkJY2FzZSAnfCc6CXIudmFsLmkgPSBwLnZhbC5pIHwgIHEudmFsLmk7IGJyZWFrOworCQkJY2FzZSAnXic6CXIudmFsLmkgPSBwLnZhbC5pIF4gIHEudmFsLmk7IGJyZWFrOworCQkJY2FzZSAnJic6CXIudmFsLmkgPSBwLnZhbC5pICYgIHEudmFsLmk7IGJyZWFrOworCQkJY2FzZSAnPCc6CXIudmFsLmkgPSBwLnZhbC5pIDw8IHEudmFsLmk7IGJyZWFrOworCQkJY2FzZSAnPic6CXIudmFsLmkgPSBwLnZhbC5pID4+IHEudmFsLmk7IGJyZWFrOworCQkJY2FzZSAnKyc6CXIudmFsLmkgPSBwLnZhbC5pICsgIHEudmFsLmk7IGJyZWFrOworCQkJY2FzZSAnLSc6CXIudmFsLmkgPSBwLnZhbC5pIC0gIHEudmFsLmk7IGJyZWFrOworCQkJY2FzZSAnKic6CXIudmFsLmkgPSBwLnZhbC5pICogIHEudmFsLmk7IGJyZWFrOworCQkJY2FzZSAnLyc6CXIudmFsLmkgPSBwLnZhbC5pIC8gIHEudmFsLmk7IGJyZWFrOworCQkJY2FzZSAnJSc6CXIudmFsLmkgPSBwLnZhbC5pICUgIHEudmFsLmk7IGJyZWFrOworCQkJZGVmYXVsdDoJdHlwZXJyb3Iob3ApOworCQkJfQorCQllbHNlIGlmIChyZWFsKHAudHlwKSAmJiByZWFsKHEudHlwKSkKKwkJCXN3aXRjaCAob3BbMF0pIHsKKwkJCWNhc2UgJysnOglyLnZhbC5yID0gcC52YWwuciArIHEudmFsLnI7IGJyZWFrOworCQkJY2FzZSAnLSc6CXIudmFsLnIgPSBwLnZhbC5yIC0gcS52YWwucjsgYnJlYWs7CisJCQljYXNlICcqJzoJci52YWwuciA9IHAudmFsLnIgKiBxLnZhbC5yOyBicmVhazsKKwkJCWNhc2UgJy8nOglyLnZhbC5yID0gcC52YWwuciAvIHEudmFsLnI7IGJyZWFrOworCQkJZGVmYXVsdDoJdHlwZXJyb3Iob3ApOworCQkJfQorCQllbHNlCXNlbWVycm9yKCJpbGxlZ2FsIGNvbnN0YW50IG9wZXJhdGlvbiIpOworCQlyLmhhc3ZhbCA9IFRydWU7CisJfSBlbHNlIHsKKwkJdHlwID0gbWd0eXBlKHAudHlwLCBxLnR5cCk7CisJCXIuaGFzdmFsID0gRmFsc2U7CisJfQorCXJldHVybiByOworfQorCitzdGF0aWMgTm9kZQoraW9wKGNvbnN0IGNoYXIgKmlvcCwgTm9kZSBwLCBOb2RlIHEpCit7CWlmIChpbnRlZ2VyKHAudHlwKSAmJiBpbnRlZ2VyKHEudHlwKSkKKwkJcmV0dXJuIG9wKGlvcCwgcCwgcSk7CisJdHlwZXJyb3IoImludGVnZXIgb3BlcmFuZHMgb25seSIpOworCXJldHVybiBwOworfQorCitzdGF0aWMgTm9kZQorcmVsb3AoY29uc3QgY2hhciAqb3AsIE5vZGUgcCwgTm9kZSBxKQorewlOb2RlCXI7CisJVG5vZGUJKnR5cDsKKwlyLnR5cCA9IG1raW50KCk7CisJci5zdG8gPSBTbm9uZTsKKwlyLmhhc3ZhbCA9IEZhbHNlOworCWlmIChwLnR5cC0+dHlwZSAhPSBUcG9pbnRlciB8fCBwLnR5cCAhPSBxLnR5cCkKKwkJdHlwID0gbWd0eXBlKHAudHlwLCBxLnR5cCk7CisJcmV0dXJuIHI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisKKwlTY29wZSBtYW5hZ2VtZW50CisKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCitta3Njb3BlIC0gaW5pdGlhbGl6ZSBzY29wZSBzdGFjayB3aXRoIGEgbmV3IHRhYmxlIGFuZCBvZmZzZXQKKyovCitzdGF0aWMgdm9pZAorbWtzY29wZShUYWJsZSAqdGFibGUsIGludCBvZmZzZXQpCit7CXNwID0gc3RhY2stMTsKKwllbnRlcnNjb3BlKHRhYmxlLCBvZmZzZXQpOworfQorCisvKgorZW50ZXJzY29wZSAtIGVudGVyIGEgbmV3IHNjb3BlIGJ5IHB1c2hpbmcgYSBuZXcgdGFibGUgYW5kIG9mZnNldCBvbiB0aGUgc3RhY2sKKyovCitzdGF0aWMgdm9pZAorZW50ZXJzY29wZShUYWJsZSAqdGFibGUsIGludCBvZmZzZXQpCit7CWlmICgrK3NwID09IHN0YWNrK01BWE5FU1QpCisJCWV4ZWNlcnJvcigibWF4aW11bSBzY29wZSBkZXB0aCBleGNlZWRlZCIpOworCXNwLT50YWJsZSA9IHRhYmxlOworCXNwLT52YWwgPSAwOworCXNwLT5vZmZzZXQgPSBvZmZzZXQ7CisJc3AtPmdyb3cgPSBUcnVlOwkvKiBieSBkZWZhdWx0LCBvZmZzZXQgZ3Jvd3MgKi8KKwlzcC0+bWFzayA9IEZhbHNlOworfQorCisvKgorZXhpdHNjb3BlIC0gZXhpdCBhIHNjb3BlIGJ5IHBvcHBpbmcgdGhlIHRhYmxlIGFuZCBvZmZzZXQgZnJvbSB0aGUgc3RhY2sKKyovCitzdGF0aWMgdm9pZAorZXhpdHNjb3BlKCkKK3sJY2hlY2soc3AtLSAhPSBzdGFjaywgImV4aXRzY29wZSgpIGhhcyBubyBtYXRjaGluZyBlbnRlcnNjb3BlKCkiKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKworCVVuZGVmaW5lZCBzeW1ib2wKKworXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIEVudHJ5KgordW5kZWZpbmVkKFN5bWJvbCAqc3ltKQorewlFbnRyeQkqcDsKKwlzcHJpbnRmKGVycmJ1ZiwgInVuZGVmaW5lZCBpZGVudGlmaWVyICclcyciLCBzeW0tPm5hbWUpOworCXNlbXdhcm4oZXJyYnVmKTsKKwlwID0gZW50ZXIoc3AtPnRhYmxlLCBzeW0pOworCXAtPmxldmVsID0gR0xPQkFMOworCXAtPmluZm8udHlwID0gbWtpbnQoKTsKKwlwLT5pbmZvLnN0byA9IFNleHRlcm47CisJcC0+aW5mby5oYXN2YWwgPSBGYWxzZTsKKwlyZXR1cm4gcDsKK30KKworLyoKK21ndHlwZSAtIHJldHVybiBtb3N0IGdlbmVyYWwgdHlwZSBhbW9uZyB0d28gbnVtZXJpY2FsIHR5cGVzCisqLworVG5vZGUqCittZ3R5cGUoVG5vZGUgKnR5cDEsIFRub2RlICp0eXAyKQorewlpZiAobnVtZXJpYyh0eXAxKSAmJiBudW1lcmljKHR5cDIpKSB7CisJCWlmICh0eXAxLT50eXBlIDwgdHlwMi0+dHlwZSkKKwkJCXJldHVybiB0eXAyOworCX0gZWxzZQl0eXBlcnJvcigibm9uLW51bWVyaWMgdHlwZSIpOworCXJldHVybiB0eXAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorCisJVHlwZSBjaGVja3MKKworXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludAoraW50ZWdlcihUbm9kZSAqdHlwKQorewlzd2l0Y2ggKHR5cC0+dHlwZSkgeworCWNhc2UgVGNoYXI6CisJY2FzZSBUc2hvcnQ6CisJY2FzZSBUaW50OgorCWNhc2UgVGxvbmc6CXJldHVybiBUcnVlOworCX0KKwlyZXR1cm4gRmFsc2U7Cit9CisKK3N0YXRpYyBpbnQKK3JlYWwoVG5vZGUgKnR5cCkKK3sJc3dpdGNoICh0eXAtPnR5cGUpIHsKKwljYXNlIFRmbG9hdDoKKwljYXNlIFRkb3VibGU6CXJldHVybiBUcnVlOworCX0KKwlyZXR1cm4gRmFsc2U7Cit9CisKK3N0YXRpYyBpbnQKK251bWVyaWMoVG5vZGUgKnR5cCkKK3sJcmV0dXJuIGludGVnZXIodHlwKSB8fCByZWFsKHR5cCk7Cit9CisKK3N0YXRpYyBpbnQKK3BvaW50ZXIoVG5vZGUgKnR5cCkKK3sJcmV0dXJuIHR5cC0+dHlwZSA9PSBUcG9pbnRlcjsKK30KKworc3RhdGljIHZvaWQKK2FkZF9mYXVsdChUYWJsZSAqZ3QpCit7IFRhYmxlICp0OworICBFbnRyeSAqcDEsICpwMiwgKnAzLCAqcDQ7CisgIFN5bWJvbCAqczEsICpzMiwgKnMzLCAqczQ7CisgIHMxID0gbG9va3VwKCJTT0FQX0VOVl9fQ29kZSIpOworICBwMSA9IGVudHJ5KGNsYXNzdGFibGUsIHMxKTsKKyAgaWYgKCFwMSB8fCAhcDEtPmluZm8udHlwLT5yZWYpCisgIHsgdCA9IG1rdGFibGUoKFRhYmxlKikwKTsKKyAgICBpZiAoIXAxKQorICAgIHsgcDEgPSBlbnRlcihjbGFzc3RhYmxlLCBzMSk7CisgICAgICBwMS0+aW5mby50eXAgPSBta3N0cnVjdCh0LCAzKjQpOworICAgICAgcDEtPmluZm8udHlwLT5pZCA9IHMxOworICAgIH0KKyAgICBlbHNlCisgICAgICBwMS0+aW5mby50eXAtPnJlZiA9IHQ7CisgICAgcDIgPSBlbnRlcih0LCBsb29rdXAoIlNPQVBfRU5WX19WYWx1ZSIpKTsKKyAgICBwMi0+aW5mby50eXAgPSBxbmFtZTsKKyAgICBwMi0+aW5mby5taW5PY2N1cnMgPSAwOworICAgIHAyID0gZW50ZXIodCwgbG9va3VwKCJTT0FQX0VOVl9fU3ViY29kZSIpKTsKKyAgICBwMi0+aW5mby50eXAgPSBta3BvaW50ZXIocDEtPmluZm8udHlwKTsKKyAgICBwMi0+aW5mby5taW5PY2N1cnMgPSAwOworICB9CisgIHMyID0gbG9va3VwKCJTT0FQX0VOVl9fRGV0YWlsIik7CisgIHAyID0gZW50cnkoY2xhc3N0YWJsZSwgczIpOworICBpZiAoIXAyIHx8ICFwMi0+aW5mby50eXAtPnJlZikKKyAgeyB0ID0gbWt0YWJsZSgoVGFibGUqKTApOworICAgIGlmICghcDIpCisgICAgeyBwMiA9IGVudGVyKGNsYXNzdGFibGUsIHMyKTsKKyAgICAgIHAyLT5pbmZvLnR5cCA9IG1rc3RydWN0KHQsIDMqNCk7CisgICAgICBwMi0+aW5mby50eXAtPmlkID0gczI7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHAyLT5pbmZvLnR5cC0+cmVmID0gdDsKKyAgICBwMyA9IGVudGVyKHQsIGxvb2t1cCgiX190eXBlIikpOworICAgIHAzLT5pbmZvLnR5cCA9IG1raW50KCk7CisgICAgcDMtPmluZm8ubWluT2NjdXJzID0gMDsKKyAgICBwMyA9IGVudGVyKHQsIGxvb2t1cCgiZmF1bHQiKSk7CisgICAgcDMtPmluZm8udHlwID0gbWtwb2ludGVyKG1rdm9pZCgpKTsKKyAgICBwMy0+aW5mby5taW5PY2N1cnMgPSAwOworICAgIHAzID0gZW50ZXIodCwgbG9va3VwKCJfX2FueSIpKTsKKyAgICBwMy0+aW5mby50eXAgPSB4bWw7CisgICAgcDMtPmluZm8ubWluT2NjdXJzID0gMDsKKyAgICBjdXN0b21fZmF1bHQgPSAwOworICB9CisgIHM0ID0gbG9va3VwKCJTT0FQX0VOVl9fUmVhc29uIik7CisgIHA0ID0gZW50cnkoY2xhc3N0YWJsZSwgczQpOworICBpZiAoIXA0IHx8ICFwNC0+aW5mby50eXAtPnJlZikKKyAgeyB0ID0gbWt0YWJsZSgoVGFibGUqKTApOworICAgIGlmICghcDQpCisgICAgeyBwNCA9IGVudGVyKGNsYXNzdGFibGUsIHM0KTsKKyAgICAgIHA0LT5pbmZvLnR5cCA9IG1rc3RydWN0KHQsIDQpOworICAgICAgcDQtPmluZm8udHlwLT5pZCA9IHM0OworICAgIH0KKyAgICBlbHNlCisgICAgICBwNC0+aW5mby50eXAtPnJlZiA9IHQ7CisgICAgcDMgPSBlbnRlcih0LCBsb29rdXAoIlNPQVBfRU5WX19UZXh0IikpOworICAgIHAzLT5pbmZvLnR5cCA9IG1rc3RyaW5nKCk7CisgICAgcDMtPmluZm8ubWluT2NjdXJzID0gMDsKKyAgfQorICBzMyA9IGxvb2t1cCgiU09BUF9FTlZfX0ZhdWx0Iik7CisgIHAzID0gZW50cnkoY2xhc3N0YWJsZSwgczMpOworICBpZiAoIXAzKQorICB7IHQgPSBta3RhYmxlKE5VTEwpOworICAgIHAzID0gZW50ZXIoY2xhc3N0YWJsZSwgczMpOworICAgIHAzLT5pbmZvLnR5cCA9IG1rc3RydWN0KHQsIDkqNCk7CisgICAgcDMtPmluZm8udHlwLT5pZCA9IHMzOworICAgIHAzID0gZW50ZXIodCwgbG9va3VwKCJmYXVsdGNvZGUiKSk7CisgICAgcDMtPmluZm8udHlwID0gcW5hbWU7CisgICAgcDMtPmluZm8ubWluT2NjdXJzID0gMDsKKyAgICBwMyA9IGVudGVyKHQsIGxvb2t1cCgiZmF1bHRzdHJpbmciKSk7CisgICAgcDMtPmluZm8udHlwID0gbWtzdHJpbmcoKTsKKyAgICBwMy0+aW5mby5taW5PY2N1cnMgPSAwOworICAgIHAzID0gZW50ZXIodCwgbG9va3VwKCJmYXVsdGFjdG9yIikpOworICAgIHAzLT5pbmZvLnR5cCA9IG1rc3RyaW5nKCk7CisgICAgcDMtPmluZm8ubWluT2NjdXJzID0gMDsKKyAgICBwMyA9IGVudGVyKHQsIGxvb2t1cCgiZGV0YWlsIikpOworICAgIHAzLT5pbmZvLnR5cCA9IG1rcG9pbnRlcihwMi0+aW5mby50eXApOworICAgIHAzLT5pbmZvLm1pbk9jY3VycyA9IDA7CisgICAgcDMgPSBlbnRlcih0LCBzMSk7CisgICAgcDMtPmluZm8udHlwID0gbWtwb2ludGVyKHAxLT5pbmZvLnR5cCk7CisgICAgcDMtPmluZm8ubWluT2NjdXJzID0gMDsKKyAgICBwMyA9IGVudGVyKHQsIHM0KTsKKyAgICBwMy0+aW5mby50eXAgPSBta3BvaW50ZXIocDQtPmluZm8udHlwKTsKKyAgICBwMy0+aW5mby5taW5PY2N1cnMgPSAwOworICAgIHAzID0gZW50ZXIodCwgbG9va3VwKCJTT0FQX0VOVl9fTm9kZSIpKTsKKyAgICBwMy0+aW5mby50eXAgPSBta3N0cmluZygpOworICAgIHAzLT5pbmZvLm1pbk9jY3VycyA9IDA7CisgICAgcDMgPSBlbnRlcih0LCBsb29rdXAoIlNPQVBfRU5WX19Sb2xlIikpOworICAgIHAzLT5pbmZvLnR5cCA9IG1rc3RyaW5nKCk7CisgICAgcDMtPmluZm8ubWluT2NjdXJzID0gMDsKKyAgICBwMyA9IGVudGVyKHQsIGxvb2t1cCgiU09BUF9FTlZfX0RldGFpbCIpKTsKKyAgICBwMy0+aW5mby50eXAgPSBta3BvaW50ZXIocDItPmluZm8udHlwKTsKKyAgICBwMy0+aW5mby5taW5PY2N1cnMgPSAwOworICB9Cit9CisKK3N0YXRpYyB2b2lkCithZGRfWE1MKCkKK3sgU3ltYm9sICpzID0gbG9va3VwKCJfWE1MIik7CisgIGludCB0bXAgPSBpbXBvcnRzOworICBpbXBvcnRzID0gMDsKKyAgcCA9IGVudGVyKHR5cGV0YWJsZSwgcyk7CisgIHhtbCA9IHAtPmluZm8udHlwID0gbWtzeW10eXBlKG1rc3RyaW5nKCksIHMpOworICBwLT5pbmZvLnN0byA9IFN0eXBlZGVmOworICBpbXBvcnRzID0gdG1wOworfQorCitzdGF0aWMgdm9pZAorYWRkX3FuYW1lKCkKK3sgU3ltYm9sICpzID0gbG9va3VwKCJfUU5hbWUiKTsKKyAgaW50IHRtcCA9IGltcG9ydHM7CisgIHAgPSBlbnRlcih0eXBldGFibGUsIHMpOworICBxbmFtZSA9IHAtPmluZm8udHlwID0gbWtzeW10eXBlKG1rc3RyaW5nKCksIHMpOworICBxbmFtZS0+aW1wb3J0cyA9IDA7CisgIHAtPmluZm8uc3RvID0gU3R5cGVkZWY7CisgIGltcG9ydHMgPSB0bXA7Cit9CisKK3N0YXRpYyB2b2lkCithZGRfaGVhZGVyKFRhYmxlICpndCkKK3sgVGFibGUgKnQ7CisgIEVudHJ5ICpwOworICBTeW1ib2wgKnMgPSBsb29rdXAoIlNPQVBfRU5WX19IZWFkZXIiKTsKKyAgcCA9IGVudHJ5KGNsYXNzdGFibGUsIHMpOworICBpZiAoIXApCisgIHsgdCA9IG1rdGFibGUoKFRhYmxlKikwKTsKKyAgICBwID0gZW50ZXIodCwgbG9va3VwKCJkdW1teSIpKTsKKyAgICBwLT5pbmZvLnR5cCA9IG1rcG9pbnRlcihta3ZvaWQoKSk7CisgICAgcCA9IGVudGVyKGNsYXNzdGFibGUsIHMpOworICAgIHAtPmluZm8udHlwID0gbWtzdHJ1Y3QodCwgNCk7CisgICAgcC0+aW5mby50eXAtPmlkID0gczsKKyAgICBjdXN0b21faGVhZGVyID0gMDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorYWRkX3Jlc3BvbnNlKEVudHJ5ICpmdW4sIEVudHJ5ICpyZXQpCit7IFRhYmxlICp0OworICBFbnRyeSAqcCwgKnE7CisgIFN5bWJvbCAqczsKKyAgaW50IG4gPSBzdHJsZW4oZnVuLT5zeW0tPm5hbWUpOworICBjaGFyICpyID0gKGNoYXIqKWVtYWxsb2Mobis5KTsKKyAgc3RyY3B5KHIsIGZ1bi0+c3ltLT5uYW1lKTsKKyAgc3RyY2F0KHIsICJSZXNwb25zZSIpOworICBpZiAoIShzID0gbG9va3VwKHIpKSkKKyAgICBzID0gaW5zdGFsbChyLCBJRCk7CisgIGZyZWUocik7CisgIHQgPSBta3RhYmxlKChUYWJsZSopMCk7CisgIHEgPSBlbnRlcih0LCByZXQtPnN5bSk7CisgIHEtPmluZm8gPSByZXQtPmluZm87CisgIGlmIChxLT5pbmZvLnR5cC0+dHlwZSA9PSBUcmVmZXJlbmNlKQorICAgIHEtPmluZm8udHlwID0gKFRub2RlKilxLT5pbmZvLnR5cC0+cmVmOworICBwID0gZW50ZXIoY2xhc3N0YWJsZSwgcyk7CisgIHAtPmluZm8udHlwID0gbWtzdHJ1Y3QodCwgNCk7CisgIHAtPmluZm8udHlwLT5pZCA9IHM7CisgIGZ1bi0+aW5mby50eXAtPnJlc3BvbnNlID0gcDsKK30KKworc3RhdGljIHZvaWQKK2FkZF9yZXN1bHQoVG5vZGUgKnR5cCkKK3sgRW50cnkgKnA7CisgIGlmICghdHlwLT5yZWYgfHwgISgoVG5vZGUqKXR5cC0+cmVmKS0+cmVmKQorICB7IHNlbXdhcm4oInJlc3BvbnNlIHN0cnVjdC9jbGFzcyBtdXN0IGJlIGRlY2xhcmVkIGJlZm9yZSB1c2VkIGluIGZ1bmN0aW9uIHByb3RvdHlwZSIpOworICAgIHJldHVybjsKKyAgfQorICBmb3IgKHAgPSAoKFRhYmxlKikoKFRub2RlKil0eXAtPnJlZiktPnJlZiktPmxpc3Q7IHA7IHAgPSBwLT5uZXh0KQorICAgIGlmIChwLT5pbmZvLnN0byAmIFNyZXR1cm4pCisgICAgICByZXR1cm47CisgIHAgPSAoKFRhYmxlKikoKFRub2RlKil0eXAtPnJlZiktPnJlZiktPmxpc3Q7CisgIGlmIChwKQorICAgIHAtPmluZm8uc3RvID0gKFN0b3JhZ2UpKChpbnQpcC0+aW5mby5zdG8gfCAoaW50KVNyZXR1cm4pOworfQpkaWZmIC0tZ2l0IGEvc3JjL3N5bWJvbDIuYyBiL3NyYy9zeW1ib2wyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdlNWExYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zeW1ib2wyLmMKQEAgLTAsMCArMSw5ODU4IEBACisvKgorCitzeW1ib2wyLmMKKworU3ltYm9sIHRhYmxlIGhhbmRsaW5nLCB0eXBlIGdyYXBoIGhhbmRsaW5nLCBhbmQgY29kZSBnZW5lcmF0aW9uLgorCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgcGFydCBvZiB0aGUgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXM6CitHUEwsIHRoZSBnU09BUCBwdWJsaWMgbGljZW5zZSwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIHB1YmxpYyBsaWNlbnNlLgorCitUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBnU09BUCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMworKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCitMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK2h0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9zb2FwbGljZW5zZS5odG1sCitTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAorV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCitmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLgorQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2luY2x1ZGUgInNvYXBjcHAyLmgiCisjaW5jbHVkZSAic29hcGNwcDJfeWFjYy5oIgorCitjaGFyICplbnZVUkkgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iOworY2hhciAqZW5jVVJJID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIjsKK2NoYXIgKnJwY1VSSSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtcnBjIjsKK2NoYXIgKnhzaVVSSSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI7CitjaGFyICp4c2RVUkkgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOworY2hhciAqdG1wVVJJID0gImh0dHA6Ly90ZW1wdXJpLm9yZyI7CisKK3N0YXRpYwlTeW1ib2wgKnN5bWxpc3QgPSAoU3ltYm9sKikgMDsJLyogcG9pbnRlciB0byBsaW5rZWQgbGlzdCBvZiBzeW1ib2xzICovCitzdGF0aWMJU3ltYm9sICpuc2xpc3QgPSAoU3ltYm9sKikgMDsJLyogcG9pbnRlciB0byBsaW5rZWQgbGlzdCBvZiBuYW1lc3BhY2UgcHJlZml4IHN5bWJvbHMgKi8KKworc3RhdGljCVRub2RlICpUcHRyW1RZUEVTXTsKKworU2VydmljZSAqc2VydmljZXMgPSBOVUxMOworCitGSUxFICpmb3V0LCAqZmhlYWQsICpmY2xpZW50LCAqZnNlcnZlciwgKmZoZWFkZXIsICpmbGliLCAqZm1hdGxhYiwgKmZtaGVhZGVyOworCitpbnQgdHlwZU5PID0gMTsJLyogdW5pcXVlIG5vLiBhc3NpZ25lZCB0byBhbGwgdHlwZXMgKi8KKworc3RhdGljIGludCBpc19hbnl0eXBlX2ZsYWcgPSAwOyAvKiBhbnl0eXBlIGlzIHVzZWQgKi8KKworLyoKK2luc3RhbGwgLSBhZGQgbmV3IHN5bWJvbAorKi8KK1N5bWJvbCAqCitpbnN0YWxsKGNvbnN0IGNoYXIgKm5hbWUsIFRva2VuIHRva2VuKQoreyBTeW1ib2wgKnA7CisgIHAgPSAoU3ltYm9sKillbWFsbG9jKHNpemVvZihTeW1ib2wpKTsKKyAgcC0+bmFtZSA9IGVtYWxsb2Moc3RybGVuKG5hbWUpKzEpOworICBzdHJjcHkocC0+bmFtZSwgbmFtZSk7CisgIHAtPnRva2VuID0gdG9rZW47CisgIHAtPm5leHQgPSBzeW1saXN0OworICBzeW1saXN0ID0gcDsKKyAgcmV0dXJuIHA7Cit9CisKKy8qCitsb29rdXAgLSBzZWFyY2ggZm9yIGFuIGlkZW50aWZpZXIncyBuYW1lLiBJZiBmb3VuZCwgcmV0dXJuIHBvaW50ZXIgdG8gc3ltYm9sIHRhYmxlIGVudHJ5LiBSZXR1cm4gcG9pbnRlciAwIGlmIG5vdCBmb3VuZC4KKyovCitTeW1ib2wgKgorbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpCit7IFN5bWJvbCAqcDsKKyAgZm9yIChwID0gc3ltbGlzdDsgcDsgcCA9IHAtPm5leHQpCisgICAgaWYgKCFzdHJjbXAocC0+bmFtZSwgbmFtZSkpCisgICAgICByZXR1cm4gcDsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qCitnZW5zeW1pZHggLSBnZW5lcmF0ZSBuZXcgc3ltYm9sIGZyb20gYmFzZSBuYW1lIGFuZCBpbmRleAorKi8KK1N5bWJvbCAqCitnZW5zeW1pZHgoY29uc3QgY2hhciAqYmFzZSwgaW50IGlkeCkKK3sgY2hhciBidWZbMTAyNF07CisgIFN5bWJvbCAqczsKKyAgc3ByaW50ZihidWYsICIlc18lZCIsIGJhc2UsIGlkeCk7CisgIHMgPSBsb29rdXAoYnVmKTsKKyAgaWYgKHMpCisgICAgcmV0dXJuIHM7CisgIHJldHVybiBpbnN0YWxsKGJ1ZiwgSUQpOworfQorCisvKgorZ2Vuc3ltIC0gZ2VuZXJhdGUgbmV3IHN5bWJvbCBmcm9tIGJhc2UgbmFtZQorKi8KK1N5bWJvbCAqCitnZW5zeW0oY29uc3QgY2hhciAqYmFzZSkKK3sgc3RhdGljIGludCBudW0gPSAxOworICByZXR1cm4gZ2Vuc3ltaWR4KGJhc2UsIG51bSsrKTsKK30KKworLyoKK21rdGFibGUgLSBtYWtlIGEgbmV3IHN5bWJvbCB0YWJsZSB3aXRoIGEgcG9pbnRlciB0byBhIHByZXZpb3VzIHRhYmxlCisqLworVGFibGUqCitta3RhYmxlKFRhYmxlICp0YWJsZSkKK3sJVGFibGUJKnA7CisJcCA9IChUYWJsZSopZW1hbGxvYyhzaXplb2YoVGFibGUpKTsKKwlwLT5zeW0gPSBsb29rdXAoIi8qPyovIik7CisJcC0+bGlzdCA9IChFbnRyeSopIDA7CisJaWYgKHRhYmxlID09IChUYWJsZSopIDApCisJCXAtPmxldmVsID0gSU5URVJOQUw7CisJZWxzZQlwLT5sZXZlbCA9IHRhYmxlLT5sZXZlbCsxOworCXAtPnByZXYgPSB0YWJsZTsKKwlyZXR1cm4gcDsKK30KKworLyoKK21rbWV0aG9kIC0gbWFrZSBhIG5ldyBtZXRob2QgYnkgY2FsbGluZyBta3R5cGUKKyovCitUbm9kZSoKK21rbWV0aG9kKFRub2RlICpyZXQsIFRhYmxlICphcmdzKQorewlGTmluZm8gKmZuID0gKEZOaW5mbyopZW1hbGxvYyhzaXplb2YoRk5pbmZvKSk7CisJZm4tPnJldCA9IHJldDsKKwlmbi0+YXJncyA9IGFyZ3M7CisJcmV0dXJuIG1rdHlwZShUZnVuLCBmbiwgMCk7Cit9CisKKy8qCitmcmVldGFibGUgLSBmcmVlIHNwYWNlIGJ5IHJlbW92aW5nIGEgdGFibGUKKyovCit2b2lkCitmcmVldGFibGUoVGFibGUgKnRhYmxlKQorewlFbnRyeQkqcCwgKnE7CisJaWYgKHRhYmxlID09IChUYWJsZSopIDApCisJCXJldHVybjsKKwlmb3IgKHAgPSB0YWJsZS0+bGlzdDsgcCAhPSAoRW50cnkqKSAwOyBwID0gcSkgeworCQlxID0gcC0+bmV4dDsKKwkJZnJlZShwKTsKKwl9CisJZnJlZSh0YWJsZSk7Cit9CisKKy8qCit1bmxpbmtsYXN0IC0gdW5saW5rIGxhc3QgZW50cnkgYWRkZWQgdG8gdGFibGUKKyovCitFbnRyeSAqCit1bmxpbmtsYXN0KFRhYmxlICp0YWJsZSkKK3sJRW50cnkJKipwLCAqcTsKKwlpZiAodGFibGUgPT0gKFRhYmxlKikwKQorCQlyZXR1cm4gKEVudHJ5KikwOworCWZvciAocCA9ICZ0YWJsZS0+bGlzdDsgKnAgIT0gKEVudHJ5KikwICYmICgqcCktPm5leHQgIT0gKEVudHJ5KikwOworCSAgICAgcCA9ICYoKnApLT5uZXh0KTsKKwlxID0gKnA7CisJKnAgPSAoRW50cnkqKTA7CisJcmV0dXJuIHE7Cit9CisKKy8qCitlbnRlciAtIGVudGVyIGEgc3ltYm9sIGluIGEgdGFibGUuIEVycm9yIGlmIGFscmVhZHkgaW4gdGhlIHRhYmxlCisqLworRW50cnkJKgorZW50ZXIodGFibGUsIHN5bSkKK1RhYmxlCSp0YWJsZTsKK1N5bWJvbAkqc3ltOworeyBFbnRyeQkqcCwgKnEgPSBOVUxMOworICBmb3IgKHAgPSB0YWJsZS0+bGlzdDsgcDsgcSA9IHAsIHAgPSBwLT5uZXh0KQorICAgIGlmIChwLT5zeW0gPT0gc3ltICYmIHAtPmluZm8udHlwLT50eXBlICE9IFRmdW4pCisgICAgeyBzcHJpbnRmKGVycmJ1ZiwgIkR1cGxpY2F0ZSBkZWNsYXJhdGlvbiBvZiAlcyAoYWxyZWFkeSBkZWNsYXJhcmVkIGF0IGxpbmUgJWQpIiwgc3ltLT5uYW1lLCBwLT5saW5lbm8pOworICAgICAgc2VtZXJyb3IoZXJyYnVmKTsKKyAgICAgIHJldHVybiBwOworICAgIH0KKyAgcCA9IChFbnRyeSopZW1hbGxvYyhzaXplb2YoRW50cnkpKTsKKyAgcC0+c3ltID0gc3ltOworICBwLT5pbmZvLnR5cCA9IE5VTEw7CisgIHAtPmluZm8uc3RvID0gU25vbmU7CisgIHAtPmluZm8uaGFzdmFsID0gRmFsc2U7CisgIHAtPmluZm8ubWluT2NjdXJzID0gMTsKKyAgcC0+aW5mby5tYXhPY2N1cnMgPSAxOworICBwLT5pbmZvLm9mZnNldCA9IDA7CisgIHAtPmxldmVsID0gdGFibGUtPmxldmVsOworICBwLT5saW5lbm8gPSB5eWxpbmVubzsKKyAgcC0+bmV4dCA9IE5VTEw7CisgIGlmICghcSkKKyAgICB0YWJsZS0+bGlzdCA9IHA7CisgIGVsc2UKKyAgICBxLT5uZXh0ID0gcDsKKyAgcmV0dXJuIHA7Cit9CisKKy8qCitlbnRyeSAtIHJldHVybiBwb2ludGVyIHRvIHRhYmxlIGVudHJ5IG9mIGEgc3ltYm9sCisqLworRW50cnkJKmVudHJ5KHRhYmxlLCBzeW0pCitUYWJsZQkqdGFibGU7CitTeW1ib2wJKnN5bTsKK3sgVGFibGUJKnQ7CisgIEVudHJ5CSpwOworICBmb3IgKHQgPSB0YWJsZTsgdDsgdCA9IHQtPnByZXYpCisgICAgZm9yIChwID0gdC0+bGlzdDsgcDsgcCA9IHAtPm5leHQpCisgICAgICBpZiAocC0+c3ltID09IHN5bSkKKwlyZXR1cm4gcDsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qCityZWVudGVyIC0gcmUtZW50ZXIgYSBzeW1ib2wgaW4gYSB0YWJsZS4KKyovCitFbnRyeQkqCityZWVudGVyKHRhYmxlLCBzeW0pCitUYWJsZQkqdGFibGU7CitTeW1ib2wJKnN5bTsKK3sgRW50cnkJKnAsICpxID0gTlVMTDsKKyAgZm9yIChwID0gdGFibGUtPmxpc3Q7IHA7IHEgPSBwLCBwID0gcC0+bmV4dCkKKyAgICBpZiAocC0+c3ltID09IHN5bSkKKyAgICAgIGJyZWFrOworICBpZiAocCAmJiBwLT5uZXh0KQorICB7IGlmIChxKQorICAgICAgcS0+bmV4dCA9IHAtPm5leHQ7CisgICAgZWxzZQorICAgICAgdGFibGUtPmxpc3QgPSBwLT5uZXh0OworICAgIGZvciAocSA9IHAtPm5leHQ7IHEtPm5leHQ7IHEgPSBxLT5uZXh0KQorICAgICAgOworICAgIHEtPm5leHQgPSBwOworICAgIHAtPm5leHQgPSBOVUxMOworICB9CisgIHJldHVybiBwOworfQorCitFbnRyeSAqCitlbnVtZW50cnkoU3ltYm9sICpzeW0pCit7IFRhYmxlCSp0OworICBFbnRyeQkqcCwgKnE7CisgIGZvciAodCA9IGVudW10YWJsZTsgdDsgdCA9IHQtPnByZXYpCisgICAgZm9yIChwID0gdC0+bGlzdDsgcDsgcCA9IHAtPm5leHQpCisgICAgICBpZiAocSA9IGVudHJ5KHAtPmluZm8udHlwLT5yZWYsIHN5bSkpCisJcmV0dXJuIHE7CisgIHJldHVybiBOVUxMOworfQorCitjaGFyICpnZXRfbXhDbGFzc0lEKFRub2RlKik7CitjaGFyICp0X2lkZW50KFRub2RlKik7CitjaGFyICpjX2lkZW50KFRub2RlKik7CitjaGFyICpzb2FwX3R5cGUoVG5vZGUqKTsKK2NoYXIgKmNfc3RvcmFnZShTdG9yYWdlKTsKK2NoYXIgKmNfaW5pdChFbnRyeSopOworY2hhciAqY190eXBlKFRub2RlKik7CitjaGFyICpjX3R5cGVfaWQoVG5vZGUqLCBjaGFyKik7CitjaGFyICp4c2lfdHlwZV9jb25kKFRub2RlKiwgaW50KTsKK2NoYXIgKnhzaV90eXBlKFRub2RlKik7CitjaGFyICp4c2lfdHlwZV9jb25kX3UoVG5vZGUqLCBpbnQpOworY2hhciAqeHNpX3R5cGVfdShUbm9kZSopOworY2hhciAqdGhlX3R5cGUoVG5vZGUqKTsKK2NoYXIgKndzZGxfdHlwZShUbm9kZSosIGNoYXIqKTsKK2NoYXIgKmJhc2VfdHlwZShUbm9kZSosIGNoYXIqKTsKK2NoYXIgKnhtbF90YWcoVG5vZGUqKTsKK2NoYXIgKm5zX3F1YWxpZmllZEVsZW1lbnQoVG5vZGUqKTsKK2NoYXIgKm5zX3F1YWxpZmllZEF0dHJpYnV0ZShUbm9kZSopOworY2hhciAqbnNfY29udmVydChjaGFyKik7CitjaGFyICpuc19hZGQoY2hhciosIGNoYXIqKTsKK2NoYXIgKm5zX3JlbW92ZShjaGFyKik7CitjaGFyICpuc19yZW1vdmUxKGNoYXIqKTsKK2NoYXIgKm5zX3JlbW92ZTIoY2hhciopOworY2hhciAqcmVzX3JlbW92ZShjaGFyKik7CitjaGFyICpuc19vdmVycmlkZGVuKFRhYmxlKiwgRW50cnkqKTsKK2NoYXIgKm5zX25hbWUoY2hhciopOworY2hhciAqbnNfY25hbWUoY2hhciosIGNoYXIqKTsKKworaW50IGhhc19jbGFzcyhUbm9kZSopOworaW50IGhhc19jb25zdHJ1Y3RvcihUbm9kZSopOworaW50IGhhc19kZXN0cnVjdG9yKFRub2RlKik7CitpbnQgaGFzX2dldHRlcihUbm9kZSopOworaW50IGhhc19zZXR0ZXIoVG5vZGUqKTsKK2ludCBoYXNfbnMoVG5vZGUqKTsKK2ludCBoYXNfbnNfdChUbm9kZSopOworaW50IGhhc19uc19lcShjaGFyKiwgY2hhciopOworY2hhciAqbnNfb2YoY2hhciopOworY2hhciAqcHJlZml4X29mKGNoYXIqKTsKK2ludCBoYXNfb2Zmc2V0KFRub2RlKik7CitpbnQgcmVmbGV2ZWwoVG5vZGUgKnR5cCk7CitUbm9kZSogcmVmdHlwZShUbm9kZSAqdHlwKTsKK2ludCBpc19yZXNwb25zZShUbm9kZSopOworRW50cnkgKmdldF9yZXNwb25zZShUbm9kZSopOworaW50IGlzX3ByaW1pdGl2ZV9vcl9zdHJpbmcoVG5vZGUqKTsKK2ludCBpc19wcmltaXRpdmUoVG5vZGUqKTsKK0VudHJ5ICppc19kaXNjcmltaW5hbnQoVG5vZGUqKTsKK0VudHJ5ICppc19keW5hbWljX2FycmF5KFRub2RlKik7CitpbnQgaXNfdHJhbnNpZW50KFRub2RlKik7CitpbnQgaXNfZXh0ZXJuYWwoVG5vZGUqKTsKK2ludCBpc19iaW5hcnkoVG5vZGUqKTsKK2ludCBpc19oZXhCaW5hcnkoVG5vZGUqKTsKK2ludCBpc19zdHJpbmcoVG5vZGUqKTsKK2ludCBpc193c3RyaW5nKFRub2RlKik7CitpbnQgaXNfc3Rkc3RyaW5nKFRub2RlKik7CitpbnQgaXNfc3Rkd3N0cmluZyhUbm9kZSopOworaW50IGlzX3N0ZHN0cihUbm9kZSopOworaW50IGlzX3R5cGVkZWYoVG5vZGUqKTsKK2ludCBnZXRfZGltZW5zaW9uKFRub2RlKik7CitjaGFyICpoYXNfc29hcHJlZihUbm9kZSopOworaW50IGlzX2RvY3VtZW50KGNvbnN0IGNoYXIqKTsKK2ludCBpc19saXRlcmFsKGNvbnN0IGNoYXIqKTsKK2ludCBpc19rZXl3b3JkKGNvbnN0IGNoYXIgKik7CisKK2ludCBpc19yZXBldGl0aW9uKEVudHJ5Kik7CitpbnQgaXNfY2hvaWNlKEVudHJ5Kik7CitpbnQgaXNfYW55dHlwZShFbnRyeSopOworCitjaGFyICp4c2lfdHlwZV9UYXJyYXkoVG5vZGUqKTsgICAgCitjaGFyICp4c2lfdHlwZV9EYXJyYXkoVG5vZGUqKTsgICAgCisKK3ZvaWQgbWF0bGFiX2RlZl90YWJsZShUYWJsZSopOwordm9pZCBkZWZfdGFibGUoVGFibGUqKTsKK3ZvaWQgb3V0X2dlbmVyYXRlKFRub2RlICopOworaW50IG5vX29mX3ZhcihUbm9kZSopOworY2hhciAqcG9pbnRlcl9zdHVmZihUbm9kZSopOwordm9pZCBpbl9kZWZzKFRhYmxlKik7Cit2b2lkIGluX2RlZnMyKFRhYmxlKik7Cit2b2lkIG91dF9kZWZzKFRhYmxlKik7Cit2b2lkIG1hcmtfZGVmcyhUYWJsZSopOwordm9pZCBpbl9hdHRhY2goVGFibGUqKTsKK3ZvaWQgb3V0X2F0dGFjaChUYWJsZSopOwordm9pZCBtYXJrKFRub2RlKik7Cit2b2lkIGRlZmF1bHRzKFRub2RlKik7Cit2b2lkIHNvYXBfcHV0KFRub2RlKik7Cit2b2lkIHNvYXBfb3V0KFRub2RlKik7Cit2b2lkIHNvYXBfb3V0X0RhcnJheShUbm9kZSAqKTsKK3ZvaWQgc29hcF9nZXQoVG5vZGUqKTsKK3ZvaWQgc29hcF9pbihUbm9kZSopOyAKK3ZvaWQgc29hcF9pbl9EYXJyYXkoVG5vZGUgKik7Cit2b2lkIHNvYXBfaW5zdGFudGlhdGVfY2xhc3MoVG5vZGUgKik7CitpbnQgZ2V0X0RhcnJheWRpbXMoVG5vZGUgKnR5cCk7CisKK3ZvaWQgc29hcF9zZXJ2ZShUYWJsZSopOwordm9pZCBnZW5lcmF0ZV9wcm90byhUYWJsZSosIEVudHJ5Kik7CisvKgordm9pZCBnZW5lcmF0ZV9jYWxsKFRhYmxlKiwgRW50cnkqKTsKK3ZvaWQgZ2VuZXJhdGVfc2VydmVyKFRhYmxlKiwgRW50cnkqKTsKKyovCit2b2lkIGdlbmVyYXRlX2hlYWRlcihUYWJsZSopOwordm9pZCBnZW5lcmF0ZV9zY2hlbWEoVGFibGUqKTsKK3ZvaWQgZ2VuX3NjaGVtYShGSUxFKixUYWJsZSosY2hhciosY2hhciosaW50LGludCxjaGFyKixjaGFyKixjaGFyKixjaGFyKik7Cit2b2lkIGdlbl90eXBlX2RvY3VtZW50YXRpb24oRklMRSAqZmQsIFRhYmxlICp0LCBFbnRyeSAqcCwgY2hhciAqbnMsIGNoYXIgKm5zMSk7Cit2b2lkIGdlbl9zY2hlbWFfZWxlbWVudHNfYXR0cmlidXRlcyhGSUxFICpmZCwgVGFibGUgKnQsIGNoYXIgKm5zLCBjaGFyICpuczEsIGNoYXIgKmVuY29kaW5nLCBjaGFyICpzdHlsZSk7Cit2b2lkIGdlbl9zY2hlbWFfZWxlbWVudHMoRklMRSAqZmQsIFRub2RlICpwLCBjaGFyICpucywgY2hhciAqbnMxKTsKK2ludCBnZW5fc2NoZW1hX2VsZW1lbnQoRklMRSAqZmQsIEVudHJ5ICpxLCBjaGFyICpucywgY2hhciAqbnMxKTsKK3ZvaWQgZ2VuX3NjaGVtYV9hdHRyaWJ1dGVzKEZJTEUgKmZkLCBUbm9kZSAqcCwgY2hhciAqbnMsIGNoYXIgKm5zMSk7Cit2b2lkIGdlbl93c2RsKEZJTEUqLFRhYmxlKixjaGFyKixjaGFyKixjaGFyKixjaGFyKixjaGFyKixjaGFyKixjaGFyKik7Cit2b2lkIGdlbl9uc21hcChGSUxFKixTeW1ib2wqLGNoYXIqKTsKKwordm9pZCBnZW5fcHJveHkoRklMRSosVGFibGUqLFN5bWJvbCosY2hhciosY2hhciosY2hhciosY2hhciosY2hhciopOwordm9pZCBnZW5fb2JqZWN0KEZJTEUqLFRhYmxlKixTeW1ib2wqLGNoYXIqLGNoYXIqLGNoYXIqLGNoYXIqLGNoYXIqKTsKK3ZvaWQgZ2VuX3Byb3h5X2hlYWRlcihGSUxFKixUYWJsZSosU3ltYm9sKixjaGFyKixjaGFyKixjaGFyKixjaGFyKixjaGFyKik7Cit2b2lkIGdlbl9wcm94eV9jb2RlKEZJTEUqLFRhYmxlKixTeW1ib2wqLGNoYXIqLGNoYXIqLGNoYXIqLGNoYXIqLGNoYXIqKTsKK3ZvaWQgZ2VuX29iamVjdF9oZWFkZXIoRklMRSosVGFibGUqLFN5bWJvbCosY2hhciosY2hhciosY2hhciosY2hhciosY2hhciopOwordm9pZCBnZW5fb2JqZWN0X2NvZGUoRklMRSosVGFibGUqLFN5bWJvbCosY2hhciosY2hhciosY2hhciosY2hhciosY2hhciopOwordm9pZCBnZW5fbWV0aG9kKEZJTEUgKmZkLCBUYWJsZSAqdGFibGUsIEVudHJ5ICptZXRob2QpOwordm9pZCBnZW5fcGFyYW1zKEZJTEUgKmZkLCBUYWJsZSAqcGFyYW1zLCBFbnRyeSAqcmVzdWx0LCBpbnQgZmxhZyk7Cit2b2lkIGdlbl9jYWxsX21ldGhvZChGSUxFICpmZCwgVGFibGUgKnRhYmxlLCBFbnRyeSAqbWV0aG9kLCBjaGFyICpuYW1lKTsKK3ZvaWQgZ2VuX3NlcnZlX21ldGhvZChGSUxFICpmZCwgVGFibGUgKnRhYmxlLCBFbnRyeSAqcGFyYW0sIGNoYXIgKm5hbWUpOworCit2b2lkIGdlbl9kYXRhKGNoYXIqLFRhYmxlKixjaGFyKixjaGFyKixjaGFyKixjaGFyKixjaGFyKixjaGFyKik7CitGSUxFICpnZW5fZW52KGNoYXIqLGNoYXIqLGludCxUYWJsZSosY2hhciosY2hhciosY2hhciosY2hhciosY2hhciosY2hhciopOwordm9pZCBnZW5fZmllbGQoRklMRSosaW50LEVudHJ5KixjaGFyKixjaGFyKixjaGFyKik7Cit2b2lkIGdlbl92YWwoRklMRSosaW50LFRub2RlKixjaGFyKixjaGFyKixjaGFyKik7Cit2b2lkIGdlbl9hdHRzKEZJTEUqLFRhYmxlKixjaGFyKik7CisKKy8qCitta3R5cGUgLSBtYWtlIGEgKG5ldykgdHlwZSB3aXRoIGEgcmVmZXJlbmNlIHRvIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYW5kIHRoZQord2lkdGggaW4gYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgb2JqZWN0cyBvZiB0aGF0IHR5cGUuIEEgcG9pbnRlciB0byB0aGUKK3R5cGUgaXMgcmV0dXJuZWQgd2hpY2ggY2FuIGJlIGNvbXBhcmVkIHRvIGNoZWNrIGlmIHR5cGVzIGFyZSBpZGVudGljYWwuCisqLworVG5vZGUgKgorbWt0eXBlKFR5cGUgdHlwZSwgdm9pZCAqcmVmLCBpbnQgd2lkdGgpCit7CVRub2RlCSpwOworCWludCB0ID0gMDsKKwlpZiAodHJhbnNpZW50ICE9IC0yIHx8IHR5cGUgPiBUdGltZSkKKwkgIHQgPSB0cmFuc2llbnQ7CisJaWYgKHR5cGUgIT0gVHN0cnVjdCAmJiB0eXBlICE9IFRjbGFzcykKKwlmb3IgKHAgPSBUcHRyW3R5cGVdOyBwICE9IChUbm9kZSopIDA7IHAgPSBwLT5uZXh0KQorCQlpZiAocC0+cmVmID09IHJlZiAmJiBwLT5zeW0gPT0gKFN5bWJvbCopIDAgJiYgcC0+d2lkdGggPT0gd2lkdGggJiYgcC0+dHJhbnNpZW50ID09IHQpCisJCQlyZXR1cm4gcDsJLyogdHlwZSBhbHJhZHkgZXhpc3RzIGluIHRhYmxlICovCisJcCA9IChUbm9kZSopZW1hbGxvYyhzaXplb2YoVG5vZGUpKTsJLyogaW5zdGFsbCBuZXcgdHlwZSAqLworCXAtPnR5cGUgPSB0eXBlOworCXAtPnJlZiA9IHJlZjsKKwlwLT5pZCA9IGxvb2t1cCgiLyo/Ki8iKTsKKwlwLT5iYXNlID0gTlVMTDsKKwlwLT5zeW0gPSAoU3ltYm9sKikwOworCXAtPnJlc3BvbnNlID0gKEVudHJ5KikwOworCXAtPndpZHRoID0gd2lkdGg7CisJcC0+Z2VuZXJhdGVkID0gRmFsc2U7CisJcC0+d3NkbCA9IEZhbHNlOworCXAtPm5leHQgPSBUcHRyW3R5cGVdOworCXAtPnRyYW5zaWVudCA9IHQ7CisJcC0+aW1wb3J0cyA9IGltcG9ydHM7CisJcC0+cGF0dGVybiA9IE5VTEw7CisJcC0+bWluTGVuZ3RoID0gLTE7CisJcC0+bWF4TGVuZ3RoID0gLTE7CisJcC0+bnVtID0gdHlwZU5PKys7CisJVHB0clt0eXBlXSA9IHA7CisJcmV0dXJuIHA7Cit9CisKK1Rub2RlICoKK21rc3ltdHlwZShUbm9kZSAqdHlwLCBTeW1ib2wgKnN5bSkKK3sJVG5vZGUgKnA7CisJcCA9IChUbm9kZSopZW1hbGxvYyhzaXplb2YoVG5vZGUpKTsJLyogaW5zdGFsbCBuZXcgdHlwZSAqLworCXAtPnR5cGUgPSB0eXAtPnR5cGU7CisJcC0+cmVmID0gdHlwLT5yZWY7CisJcC0+aWQgPSB0eXAtPmlkOworCXAtPnN5bSA9IHN5bTsKKwlwLT5yZXNwb25zZSA9IChFbnRyeSopMDsKKwlwLT53aWR0aCA9IHR5cC0+d2lkdGg7CisJcC0+Z2VuZXJhdGVkID0gVHJ1ZTsgLyogY29weSBvZiBleGlzdGluZyAoZ2VuZXJhdGVkKSB0eXBlICovCisJcC0+d3NkbCA9IEZhbHNlOworCXAtPm5leHQgPSBUcHRyW3R5cC0+dHlwZV07CisJcC0+dHJhbnNpZW50ID0gdHJhbnNpZW50OworCXAtPmltcG9ydHMgPSBpbXBvcnRzOworCXAtPnBhdHRlcm4gPSBOVUxMOworCXAtPm1pbkxlbmd0aCA9IC0xOworCXAtPm1heExlbmd0aCA9IC0xOworCXAtPm51bSA9IHR5cGVOTysrOworCVRwdHJbdHlwLT50eXBlXSA9IHA7CisJcmV0dXJuIHA7Cit9CisKK1Rub2RlICoKK21rdGVtcGxhdGUoVG5vZGUgKnR5cCwgU3ltYm9sICppZCkKK3sJVG5vZGUgKnA7CisJZm9yIChwID0gVHB0cltUdGVtcGxhdGVdOyBwOyBwID0gcC0+bmV4dCkKKwkJaWYgKHAtPnJlZiA9PSB0eXAgJiYgcC0+aWQgPT0gaWQgJiYgcC0+dHJhbnNpZW50ID09IHRyYW5zaWVudCkKKwkJCXJldHVybiBwOwkvKiB0eXBlIGFscmFkeSBleGlzdHMgaW4gdGFibGUgKi8KKwlwID0gKFRub2RlKillbWFsbG9jKHNpemVvZihUbm9kZSkpOwkvKiBpbnN0YWxsIG5ldyB0eXBlICovCisJcC0+dHlwZSA9IFR0ZW1wbGF0ZTsKKwlwLT5yZWYgPSB0eXA7CisJcC0+aWQgPSBpZDsKKwlwLT5zeW0gPSBOVUxMOworCXAtPnJlc3BvbnNlID0gKEVudHJ5KikwOworCXAtPndpZHRoID0gMDsKKwlwLT5nZW5lcmF0ZWQgPSBGYWxzZTsgLyogY29weSBvZiBleGlzdGluZyAoZ2VuZXJhdGVkKSB0eXBlICovCisJcC0+d3NkbCA9IEZhbHNlOworCXAtPm5leHQgPSBUcHRyW1R0ZW1wbGF0ZV07CisJcC0+dHJhbnNpZW50ID0gdHJhbnNpZW50OworCXAtPmltcG9ydHMgPSBpbXBvcnRzOworCXAtPnBhdHRlcm4gPSBOVUxMOworCXAtPm1pbkxlbmd0aCA9IC0xOworCXAtPm1heExlbmd0aCA9IC0xOworCXAtPm51bSA9IHR5cGVOTysrOworCVRwdHJbVHRlbXBsYXRlXSA9IHA7CisJcmV0dXJuIHA7Cit9CisKKy8qCURPIE5PVCBSRU1PVkUgT1IgQUxURVIgKFNFRSBMSUNFTkNFIEFHUkVFTUVOVCBBTkQgQ09QWUlORy50eHQpCSovCit2b2lkCitjb3B5cmlnaHRub3RlKEZJTEUgKmZkLCBjaGFyICpmbikKK3sgZnByaW50ZihmZCwgIi8qICVzXG4gICBHZW5lcmF0ZWQgYnkgZ1NPQVAgIlZFUlNJT04iIGZyb20gJXNcbiAgIENvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgVGhpcyBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlczpcbiAgIEdQTCwgdGhlIGdTT0FQIHB1YmxpYyBsaWNlbnNlLCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuXG4qLyIsIGZuLCBmaWxlbmFtZSk7Cit9CisKK3ZvaWQKK2Jhbm5lcihGSUxFICpmZCwgY29uc3QgY2hhciAqdGV4dCkKK3sgaW50IGk7CisgIGZwcmludGYoZmQsICJcblxuLyIpOworICBmb3IgKGkgPSAwOyBpIDwgNzg7IGkrKykKKyAgICBmcHV0YygnKicsIGZkKTsKKyAgZnByaW50ZihmZCwgIlxcXG4gKiU3NnMqXG4gKiAlLTc1cypcbiAqJTc2cypcblxcIiwgIiIsIHRleHQsICIiKTsKKyAgZm9yIChpID0gMDsgaSA8IDc4OyBpKyspCisgICAgZnB1dGMoJyonLCBmZCk7CisgIGZwcmludGYoZmQsICIvXG4iKTsKK30KKwordm9pZAoraWRlbnQoRklMRSAqZmQsIGNoYXIgKmZuKQoreyB0aW1lX3QgdCA9IHRpbWUoTlVMTCksICpwID0gJnQ7CisgIGNoYXIgdG1wWzI1Nl07CisgIHN0cmZ0aW1lKHRtcCwgMjU2LCAiJVktJW0tJWQgJUg6JU06JVMgR01UIiwgZ210aW1lKHApKTsKKyAgZnByaW50ZihmZCwgIlxuXG5TT0FQX1NPVVJDRV9TVEFNUChcIkAoIykgJXMgdmVyICJWRVJTSU9OIiAlc1wiKVxuIiwgZm4sIHRtcCk7Cit9CisKK3ZvaWQKK2NvbXBpbGUoVGFibGUgKnRhYmxlKQorewlFbnRyeSAqcDsKKwlUbm9kZSAqdHlwOworCVByYWdtYSAqcHJhZ21hOworCWludCBjbGFzc2ZsYWcgPSAwOworCWNoYXIgKnM7CisJY2hhciBiYXNlWzEwMjRdOworCWNoYXIgc29hcFN0dWJbMTAyNF07CisJY2hhciBzb2FwSFsxMDI0XTsKKwljaGFyIHNvYXBDWzEwMjRdOworCWNoYXIgc29hcENsaWVudFsxMDI0XTsKKwljaGFyIHNvYXBTZXJ2ZXJbMTAyNF07CisJY2hhciBzb2FwQ2xpZW50TGliWzEwMjRdOworCWNoYXIgc29hcFNlcnZlckxpYlsxMDI0XTsKKwljaGFyIHBhdGhzb2FwU3R1YlsxMDI0XTsKKwljaGFyIHBhdGhzb2FwSFsxMDI0XTsKKwljaGFyIHBhdGhzb2FwQ1sxMDI0XTsKKwljaGFyIHBhdGhzb2FwQ2xpZW50WzEwMjRdOworCWNoYXIgcGF0aHNvYXBTZXJ2ZXJbMTAyNF07CisJY2hhciBwYXRoc29hcENsaWVudExpYlsxMDI0XTsKKwljaGFyIHBhdGhzb2FwU2VydmVyTGliWzEwMjRdOworICAgICAgCWNoYXIgc29hcE1hdGxhYlsxMDI0XTsKKyAgICAgIAljaGFyIHBhdGhzb2FwTWF0bGFiWzEwMjRdOworICAJY2hhciBzb2FwTWF0bGFiSGRyWzEwMjRdOworICAgICAgCWNoYXIgcGF0aHNvYXBNYXRsYWJIZHJbMTAyNF07CisKKwlpZiAoKmRpcnBhdGgpCisJICBmcHJpbnRmKGZtc2csICJVc2luZyBwcm9qZWN0IGRpcmVjdG9yeSBwYXRoOiAlc1xuIiwgZGlycGF0aCk7CisKKwlpZiAobmFtZXNwYWNlaWQpCisJeyBwcmVmaXggPSBuYW1lc3BhY2VpZDsKKwkgIGZwcmludGYoZm1zZywgIlVzaW5nIGNvZGUgbmFtZXNwYWNlOiAlc1xuIiwgbmFtZXNwYWNlaWQpOworCX0KKwlzdHJjcHkoYmFzZSwgcHJlZml4KTsKKwlpZiAoY2ZsYWcpCisJCXMgPSAiLmMiOworCWVsc2UKKwkJcyA9ICIuY3BwIjsKKworICAJc3RyY3B5KHNvYXBNYXRsYWIsIGJhc2UpOworICAJc3RyY2F0KHNvYXBNYXRsYWIsICJNYXRsYWIuYyIpOworICAJc3RyY3B5KHBhdGhzb2FwTWF0bGFiLCBkaXJwYXRoKTsKKyAgCXN0cmNhdChwYXRoc29hcE1hdGxhYiwgc29hcE1hdGxhYiApOworICAKKyAgCXN0cmNweShzb2FwTWF0bGFiSGRyLCBiYXNlKTsKKyAgCXN0cmNhdChzb2FwTWF0bGFiSGRyLCAiTWF0bGFiLmgiKTsKKyAgCXN0cmNweShwYXRoc29hcE1hdGxhYkhkciwgZGlycGF0aCk7CisgIAlzdHJjYXQocGF0aHNvYXBNYXRsYWJIZHIsIHNvYXBNYXRsYWJIZHIpOworCisJc3RyY3B5KHNvYXBTdHViLCBiYXNlKTsKKwlzdHJjYXQoc29hcFN0dWIsICJTdHViLmgiKTsKKwlzdHJjcHkocGF0aHNvYXBTdHViLCBkaXJwYXRoKTsKKwlzdHJjYXQocGF0aHNvYXBTdHViLCBzb2FwU3R1Yik7CisJc3RyY3B5KHNvYXBILCBiYXNlKTsKKwlzdHJjYXQoc29hcEgsICJILmgiKTsKKwlzdHJjcHkocGF0aHNvYXBILCBkaXJwYXRoKTsKKwlzdHJjYXQocGF0aHNvYXBILCBzb2FwSCk7CisJc3RyY3B5KHNvYXBDLCBiYXNlKTsKKwlzdHJjYXQoc29hcEMsICJDIik7CisJc3RyY2F0KHNvYXBDLCBzKTsKKwlzdHJjcHkocGF0aHNvYXBDLCBkaXJwYXRoKTsKKwlzdHJjYXQocGF0aHNvYXBDLCBzb2FwQyk7CisJc3RyY3B5KHNvYXBDbGllbnQsIGJhc2UpOworCXN0cmNhdChzb2FwQ2xpZW50LCAiQ2xpZW50Iik7CisJc3RyY2F0KHNvYXBDbGllbnQsIHMpOworCXN0cmNweShwYXRoc29hcENsaWVudCwgZGlycGF0aCk7CisJc3RyY2F0KHBhdGhzb2FwQ2xpZW50LCBzb2FwQ2xpZW50KTsKKwlzdHJjcHkoc29hcFNlcnZlciwgYmFzZSk7CisJc3RyY2F0KHNvYXBTZXJ2ZXIsICJTZXJ2ZXIiKTsKKwlzdHJjYXQoc29hcFNlcnZlciwgcyk7CisJc3RyY3B5KHBhdGhzb2FwU2VydmVyLCBkaXJwYXRoKTsKKwlzdHJjYXQocGF0aHNvYXBTZXJ2ZXIsIHNvYXBTZXJ2ZXIpOworCXN0cmNweShzb2FwQ2xpZW50TGliLCBiYXNlKTsKKwlzdHJjYXQoc29hcENsaWVudExpYiwgIkNsaWVudExpYiIpOworCXN0cmNhdChzb2FwQ2xpZW50TGliLCBzKTsKKwlzdHJjcHkocGF0aHNvYXBDbGllbnRMaWIsIGRpcnBhdGgpOworCXN0cmNhdChwYXRoc29hcENsaWVudExpYiwgc29hcENsaWVudExpYik7CisJc3RyY3B5KHNvYXBTZXJ2ZXJMaWIsIGJhc2UpOworCXN0cmNhdChzb2FwU2VydmVyTGliLCAiU2VydmVyTGliIik7CisJc3RyY2F0KHNvYXBTZXJ2ZXJMaWIsIHMpOworCXN0cmNweShwYXRoc29hcFNlcnZlckxpYiwgZGlycGF0aCk7CisJc3RyY2F0KHBhdGhzb2FwU2VydmVyTGliLCBzb2FwU2VydmVyTGliKTsKKworCWlmIChtZmxhZykKKyAJeyBmcHJpbnRmKGZtc2csICJTYXZpbmcgJXNcbiIsIHBhdGhzb2FwTWF0bGFiKTsKKyAJICBmbWF0bGFiPWZvcGVuKHBhdGhzb2FwTWF0bGFiLCAidyIpOworIAkgIGlmICghZm1hdGxhYikKKyAJCWV4ZWNlcnJvcigiQ2Fubm90IHdyaXRlIHRvIGZpbGUiKTsKKyAJICBjb3B5cmlnaHRub3RlKGZtYXRsYWIsIHNvYXBNYXRsYWIpOworIAkgIGZwcmludGYoZm1hdGxhYiwiXG4jaW5jbHVkZSBcIiVzXCJcbiIsIHNvYXBNYXRsYWJIZHIpOworIAkgIGZwcmludGYoZm1zZywgIlNhdmluZyAlc1xuIiwgcGF0aHNvYXBNYXRsYWJIZHIpOworIAkgIGZtaGVhZGVyPWZvcGVuKHBhdGhzb2FwTWF0bGFiSGRyLCAidyIpOworIAkgIGlmICghZm1oZWFkZXIpCisJCWV4ZWNlcnJvcigiQ2Fubm90IHdyaXRlIHRvIGZpbGUiKTsKKyAJICBjb3B5cmlnaHRub3RlKGZtaGVhZGVyLCBzb2FwTWF0bGFiSGRyKTsKKyAJICBmcHJpbnRmKGZtaGVhZGVyLCJcbiNpbmNsdWRlIFwibWV4LmhcIlxuI2luY2x1ZGUgXCIlc1wiXG4iLCBzb2FwU3R1Yik7CisJfQorCisJZnByaW50ZihmbXNnLCAiU2F2aW5nICVzXG4iLCBwYXRoc29hcFN0dWIpOworCWZoZWFkZXI9Zm9wZW4ocGF0aHNvYXBTdHViLCAidyIpOworCWlmICghZmhlYWRlcikKKwkJZXhlY2Vycm9yKCJDYW5ub3Qgd3JpdGUgdG8gZmlsZSIpOworCWNvcHlyaWdodG5vdGUoZmhlYWRlciwgc29hcFN0dWIpOworCWZwcmludGYoZm1zZywgIlNhdmluZyAlc1xuIiwgcGF0aHNvYXBIKTsKKwlmaGVhZD1mb3BlbihwYXRoc29hcEgsInciKTsKKwlpZiAoIWZoZWFkKQorCQlleGVjZXJyb3IoIkNhbm5vdCB3cml0ZSB0byBmaWxlIik7CisJY29weXJpZ2h0bm90ZShmaGVhZCwgc29hcEgpOworCWZwcmludGYoZm1zZywgIlNhdmluZyAlc1xuIiwgcGF0aHNvYXBDKTsKKwlmb3V0PWZvcGVuKHBhdGhzb2FwQywidyIpOworCWlmICghZm91dCkKKwkJZXhlY2Vycm9yKCJDYW5ub3Qgd3JpdGUgdG8gZmlsZSIpOworCWNvcHlyaWdodG5vdGUoZm91dCwgc29hcEMpOworCWlmICghU2ZsYWcgJiYgIWlmbGFnKQorCXsgZnByaW50ZihmbXNnLCAiU2F2aW5nICVzXG4iLCBwYXRoc29hcENsaWVudCk7CisgICAgICAgICAgZmNsaWVudD1mb3BlbihwYXRoc29hcENsaWVudCwidyIpOworCSAgaWYgKCFmY2xpZW50KQorCQlleGVjZXJyb3IoIkNhbm5vdCB3cml0ZSB0byBmaWxlIik7CisJICBjb3B5cmlnaHRub3RlKGZjbGllbnQsIHNvYXBDbGllbnQpOworICAgICAgICAgIGZwcmludGYoZmNsaWVudCwiXG4jaW5jbHVkZSBcIiVzSC5oXCIiLCBwcmVmaXgpOworCSAgaWYgKGNmbGFnKQorCSAgICBmcHJpbnRmKGZjbGllbnQsIlxuI2lmZGVmIF9fY3BsdXNwbHVzXG5leHRlcm4gXCJDXCIge1xuI2VuZGlmIik7CisgICAgICAgICAgaWYgKG5hbWVzcGFjZWlkKQorICAgICAgICAgICAgZnByaW50ZihmY2xpZW50LCJcblxubmFtZXNwYWNlICVzIHsiLCBuYW1lc3BhY2VpZCk7CisJICBpZGVudChmY2xpZW50LCBzb2FwQ2xpZW50KTsKKworCSAgaWYgKCFMZmxhZykKKwkgIHsgZmxpYj1mb3BlbihwYXRoc29hcENsaWVudExpYiwidyIpOworCSAgICBpZiAoIWZsaWIpCisJCWV4ZWNlcnJvcigiQ2Fubm90IHdyaXRlIHRvIGZpbGUiKTsKKwkgICAgY29weXJpZ2h0bm90ZShmbGliLCBzb2FwQ2xpZW50TGliKTsKKwkgICAgZnByaW50ZihmbXNnLCAiU2F2aW5nICVzXG4iLCBwYXRoc29hcENsaWVudExpYik7CisJICAgIGZwcmludGYoZmxpYiwgIlxuI2lmbmRlZiBXSVRIX05PR0xPQkFMXG4jZGVmaW5lIFdJVEhfTk9HTE9CQUxcbiNlbmRpZiIpOworCSAgICBmcHJpbnRmKGZsaWIsICJcbiNkZWZpbmUgU09BUF9GTUFDMyBzdGF0aWMiKTsKKwkgICAgZnByaW50ZihmbGliLCAiXG4jaW5jbHVkZSBcIiVzXCIiLCBzb2FwQyk7CisJICAgIGZwcmludGYoZmxpYiwgIlxuI2luY2x1ZGUgXCIlc1wiIiwgc29hcENsaWVudCk7CisJICAgIGZwcmludGYoZmxpYiwgIlxuXG4vKiBFbmQgb2YgJXMgKi9cbiIsIHNvYXBDbGllbnRMaWIpOworCSAgICBmY2xvc2UoZmxpYik7CisJICB9CisJfQorCWlmICghQ2ZsYWcgJiYgIWlmbGFnKQorCXsgZnByaW50ZihmbXNnLCAiU2F2aW5nICVzXG4iLCBwYXRoc29hcFNlcnZlcik7CisgICAgICAgICAgZnNlcnZlcj1mb3BlbihwYXRoc29hcFNlcnZlciwidyIpOworCSAgaWYgKCFmc2VydmVyKQorCQlleGVjZXJyb3IoIkNhbm5vdCB3cml0ZSB0byBmaWxlIik7CisJICBjb3B5cmlnaHRub3RlKGZzZXJ2ZXIsIHNvYXBTZXJ2ZXIpOworICAgICAgICAgIGZwcmludGYoZnNlcnZlciwiXG4jaW5jbHVkZSBcIiVzSC5oXCIiLCBwcmVmaXgpOworCSAgaWYgKGNmbGFnKQorCSAgICBmcHJpbnRmKGZzZXJ2ZXIsIlxuI2lmZGVmIF9fY3BsdXNwbHVzXG5leHRlcm4gXCJDXCIge1xuI2VuZGlmIik7CisgICAgICAgICAgaWYgKG5hbWVzcGFjZWlkKQorICAgICAgICAgICAgZnByaW50Zihmc2VydmVyLCJcblxubmFtZXNwYWNlICVzIHsiLCBuYW1lc3BhY2VpZCk7CisJICBpZGVudChmc2VydmVyLCBzb2FwU2VydmVyKTsKKworCSAgaWYgKCFMZmxhZykKKwkgIHsgZmxpYj1mb3BlbihwYXRoc29hcFNlcnZlckxpYiwidyIpOworCSAgICBpZiAoIWZsaWIpCisJCWV4ZWNlcnJvcigiQ2Fubm90IHdyaXRlIHRvIGZpbGUiKTsKKwkgICAgY29weXJpZ2h0bm90ZShmbGliLCBzb2FwU2VydmVyTGliKTsKKwkgICAgZnByaW50ZihmbXNnLCAiU2F2aW5nICVzXG4iLCBwYXRoc29hcFNlcnZlckxpYik7CisJICAgIGZwcmludGYoZmxpYiwgIlxuI2lmbmRlZiBXSVRIX05PR0xPQkFMXG4jZGVmaW5lIFdJVEhfTk9HTE9CQUxcbiNlbmRpZiIpOworCSAgICBmcHJpbnRmKGZsaWIsICJcbiNkZWZpbmUgU09BUF9GTUFDMyBzdGF0aWMiKTsKKwkgICAgZnByaW50ZihmbGliLCAiXG4jaW5jbHVkZSBcIiVzXCIiLCBzb2FwQyk7CisJICAgIGZwcmludGYoZmxpYiwgIlxuI2luY2x1ZGUgXCIlc1wiIiwgc29hcFNlcnZlcik7CisJICAgIGZwcmludGYoZmxpYiwgIlxuXG4vKiBFbmQgb2YgJXMgKi9cbiIsIHNvYXBTZXJ2ZXJMaWIpOworCSAgICBmY2xvc2UoZmxpYik7CisJICB9CisJfQorCisJZnByaW50ZihmaGVhZCwiXG5cbiNpZm5kZWYgJXNIX0hcbiNkZWZpbmUgJXNIX0giLCBwcmVmaXgsIHByZWZpeCk7CisJZnByaW50ZihmaGVhZCwiXG4jaW5jbHVkZSBcIiVzXCIiLCBzb2FwU3R1Yik7CisJaWYgKGNmbGFnKQorCSAgZnByaW50ZihmaGVhZCwiXG4jaWZkZWYgX19jcGx1c3BsdXNcbmV4dGVybiBcIkNcIiB7XG4jZW5kaWYiKTsKKwlpZiAobmFtZXNwYWNlaWQpCisJICBmcHJpbnRmKGZoZWFkLCJcblxubmFtZXNwYWNlICVzIHsiLCBuYW1lc3BhY2VpZCk7CisJZnByaW50ZihmaGVhZGVyLCJcblxuI2lmbmRlZiAlc1N0dWJfSFxuI2RlZmluZSAlc1N0dWJfSCIsIHByZWZpeCwgcHJlZml4KTsKKwlmb3IgKHByYWdtYSA9IHByYWdtYXM7IHByYWdtYTsgcHJhZ21hID0gcHJhZ21hLT5uZXh0KQorCSAgZnByaW50ZihmaGVhZGVyLCJcbiVzIiwgcHJhZ21hLT5wcmFnbWEpOworCWlmIChuZmxhZykKKwkgIGZwcmludGYoZmhlYWRlciwiXG4jZGVmaW5lIFdJVEhfTk9OQU1FU1BBQ0VTIik7CisJaWYgKG5hbWVzcGFjZWlkKQorCXsgZnByaW50ZihmaGVhZGVyLCJcbiNpZm5kZWYgV0lUSF9OT0dMT0JBTFxuI2RlZmluZSBXSVRIX05PR0xPQkFMXG4jZW5kaWYiKTsKKwl9CisJZnByaW50ZihmaGVhZGVyLCJcbiNpbmNsdWRlIFwic3Rkc29hcDIuaFwiIik7CisJaWYgKGNmbGFnKQorCSAgZnByaW50ZihmaGVhZGVyLCJcbiNpZmRlZiBfX2NwbHVzcGx1c1xuZXh0ZXJuIFwiQ1wiIHtcbiNlbmRpZiIpOworCWlmIChuYW1lc3BhY2VpZCkKKwkgIGZwcmludGYoZmhlYWRlciwiXG5cbm5hbWVzcGFjZSAlcyB7IiwgbmFtZXNwYWNlaWQpOworCWdlbmVyYXRlX2hlYWRlcih0YWJsZSk7CisJZ2VuZXJhdGVfc2NoZW1hKHRhYmxlKTsKKwlmcHJpbnRmKGZvdXQsIlxuXG4jaW5jbHVkZSBcIiVzSC5oXCIiLCBwcmVmaXgpOworCWlmIChjZmxhZykKKwkgIGZwcmludGYoZm91dCwiXG4jaWZkZWYgX19jcGx1c3BsdXNcbmV4dGVybiBcIkNcIiB7XG4jZW5kaWYiKTsKKwlpZiAobmFtZXNwYWNlaWQpCisJICBmcHJpbnRmKGZvdXQsIlxuXG5uYW1lc3BhY2UgJXMgeyIsIG5hbWVzcGFjZWlkKTsKKwlpZGVudChmb3V0LCBzb2FwQyk7CisKKyAgICAgICAgaWYgKCFpZmxhZykKKwkgIHNvYXBfc2VydmUodGFibGUpOworCisJZnByaW50ZihmaGVhZCwgIlxuU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX2lnbm9yZV9lbGVtZW50KHN0cnVjdCBzb2FwKik7Iik7CisJZnByaW50ZihmaGVhZCwgIlxuI2lmbmRlZiBXSVRIX05PSURSRUYiKTsKKwlmcHJpbnRmKGZoZWFkLCAiXG5TT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0aW5kZXBlbmRlbnQoc3RydWN0IHNvYXAqKTsiKTsKKwlmcHJpbnRmKGZoZWFkLCAiXG5TT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfZ2V0aW5kZXBlbmRlbnQoc3RydWN0IHNvYXAqKTsiKTsKKwlmcHJpbnRmKGZoZWFkLCAiXG5TT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX21hcmtlbGVtZW50KHN0cnVjdCBzb2FwKiwgY29uc3Qgdm9pZCosIGludCk7Iik7CisJZnByaW50ZihmaGVhZCwgIlxuU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dGVsZW1lbnQoc3RydWN0IHNvYXAqLCBjb25zdCB2b2lkKiwgY29uc3QgY2hhciosIGludCwgaW50KTsiKTsKKwlmcHJpbnRmKGZoZWFkLCAiXG5TT0FQX0ZNQUMzIHZvaWQgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0ZWxlbWVudChzdHJ1Y3Qgc29hcCosIGludCopOyIpOworCWZwcmludGYoZmhlYWQsICJcbiNlbmRpZiIpOworCWlmICghbGZsYWcpCisJeworCWZwcmludGYoZm91dCwiXG5cbiNpZm5kZWYgV0lUSF9OT0dMT0JBTCIpOworICAgICAgICBpZiAoZW50cnkoY2xhc3N0YWJsZSwgbG9va3VwKCJTT0FQX0VOVl9fSGVhZGVyIikpLT5pbmZvLnR5cC0+dHlwZSA9PSBUc3RydWN0KQorCSAgZnByaW50Zihmb3V0LCJcblxuU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVoZWFkZXIoc3RydWN0IHNvYXAgKnNvYXApXG57XG5cdGlmIChzb2FwLT5oZWFkZXIpXG5cdFx0c29hcF9zZXJpYWxpemVfU09BUF9FTlZfX0hlYWRlcihzb2FwLCBzb2FwLT5oZWFkZXIpO1xufSIpOworCWVsc2UKKwkgIGZwcmludGYoZm91dCwiXG5cblNPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplaGVhZGVyKHN0cnVjdCBzb2FwICpzb2FwKVxue1xuXHRpZiAoc29hcC0+aGVhZGVyKVxuXHRcdHNvYXAtPmhlYWRlci0+c29hcF9zZXJpYWxpemUoc29hcCk7XG59Iik7CisJZnByaW50Zihmb3V0LCJcblxuU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dGhlYWRlcihzdHJ1Y3Qgc29hcCAqc29hcClcbntcblx0aWYgKHNvYXAtPmhlYWRlcilcblx0e1x0c29hcC0+cGFydCA9IFNPQVBfSU5fSEVBREVSO1xuXHRcdHNvYXBfb3V0X1NPQVBfRU5WX19IZWFkZXIoc29hcCwgXCJTT0FQLUVOVjpIZWFkZXJcIiwgMCwgc29hcC0+aGVhZGVyLCBOVUxMKTtcblx0XHRzb2FwLT5wYXJ0ID0gU09BUF9FTkRfSEVBREVSO1xuXHR9XG5cdHJldHVybiBTT0FQX09LO1xufSIpOworCWZwcmludGYoZm91dCwiXG5cblNPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9nZXRoZWFkZXIoc3RydWN0IHNvYXAgKnNvYXApXG57XG5cdHNvYXAtPnBhcnQgPSBTT0FQX0lOX0hFQURFUjtcblx0c29hcC0+aGVhZGVyID0gc29hcF9pbl9TT0FQX0VOVl9fSGVhZGVyKHNvYXAsIFwiU09BUC1FTlY6SGVhZGVyXCIsIE5VTEwsIE5VTEwpO1xuXHRzb2FwLT5wYXJ0ID0gU09BUF9FTkRfSEVBREVSO1xuXHRyZXR1cm4gc29hcC0+aGVhZGVyID09IE5VTEw7XG59Iik7CisgICAgICAgIGlmICgocCA9IGVudHJ5KGNsYXNzdGFibGUsIGxvb2t1cCgiU09BUF9FTlZfX0ZhdWx0IikpKS0+aW5mby50eXAtPnR5cGUgPT0gVHN0cnVjdCAmJiAhaGFzX2NsYXNzKHAtPmluZm8udHlwKSkKKwl7IGZwcmludGYoZm91dCwiXG5cblNPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXApXG57XG5cdGlmICghc29hcC0+ZmF1bHQpXG5cdHtcdHNvYXAtPmZhdWx0ID0gKHN0cnVjdCBTT0FQX0VOVl9fRmF1bHQqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3QgU09BUF9FTlZfX0ZhdWx0KSk7XG5cdFx0c29hcF9kZWZhdWx0X1NPQVBfRU5WX19GYXVsdChzb2FwLCBzb2FwLT5mYXVsdCk7XG5cdH1cblx0aWYgKHNvYXAtPnZlcnNpb24gPT0gMiAmJiAhc29hcC0+ZmF1bHQtPlNPQVBfRU5WX19Db2RlKVxuXHR7XHRzb2FwLT5mYXVsdC0+U09BUF9FTlZfX0NvZGUgPSAoc3RydWN0IFNPQVBfRU5WX19Db2RlKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IFNPQVBfRU5WX19Db2RlKSk7XG5cdFx0c29hcF9kZWZhdWx0X1NPQVBfRU5WX19Db2RlKHNvYXAsIHNvYXAtPmZhdWx0LT5TT0FQX0VOVl9fQ29kZSk7XG5cdH1cblx0aWYgKHNvYXAtPnZlcnNpb24gPT0gMiAmJiAhc29hcC0+ZmF1bHQtPlNPQVBfRU5WX19SZWFzb24pXG5cdHtcdHNvYXAtPmZhdWx0LT5TT0FQX0VOVl9fUmVhc29uID0gKHN0cnVjdCBTT0FQX0VOVl9fUmVhc29uKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IFNPQVBfRU5WX19SZWFzb24pKTtcblx0XHRzb2FwX2RlZmF1bHRfU09BUF9FTlZfX1JlYXNvbihzb2FwLCBzb2FwLT5mYXVsdC0+U09BUF9FTlZfX1JlYXNvbik7XG5cdH1cbn0iKTsKKwkgIGZwcmludGYoZm91dCwiXG5cblNPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplZmF1bHQoc3RydWN0IHNvYXAgKnNvYXApXG57XG5cdGlmIChzb2FwLT5mYXVsdClcblx0XHRzb2FwX3NlcmlhbGl6ZV9TT0FQX0VOVl9fRmF1bHQoc29hcCwgc29hcC0+ZmF1bHQpO1xufSIpOworCX0KKwllbHNlCisJeyBmcHJpbnRmKGZvdXQsIlxuXG5TT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwKVxue1xuXHRpZiAoIXNvYXAtPmZhdWx0KVxuXHR7XHRzb2FwLT5mYXVsdCA9IHNvYXBfbmV3X1NPQVBfRU5WX19GYXVsdChzb2FwLCAtMSk7XG5cdFx0c29hcC0+ZmF1bHQtPnNvYXBfZGVmYXVsdChzb2FwKTtcblx0fVxuXHRpZiAoc29hcC0+dmVyc2lvbiA9PSAyICYmICFzb2FwLT5mYXVsdC0+U09BUF9FTlZfX0NvZGUpXG5cdHtcdHNvYXAtPmZhdWx0LT5TT0FQX0VOVl9fQ29kZSA9IChzdHJ1Y3QgU09BUF9FTlZfX0NvZGUqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3QgU09BUF9FTlZfX0NvZGUpKTtcblx0XHRzb2FwX2RlZmF1bHRfU09BUF9FTlZfX0NvZGUoc29hcCwgc29hcC0+ZmF1bHQtPlNPQVBfRU5WX19Db2RlKTtcblx0fVxuXHRpZiAoc29hcC0+dmVyc2lvbiA9PSAyICYmICFzb2FwLT5mYXVsdC0+U09BUF9FTlZfX1JlYXNvbilcblx0e1x0c29hcC0+ZmF1bHQtPlNPQVBfRU5WX19SZWFzb24gPSAoc3RydWN0IFNPQVBfRU5WX19SZWFzb24qKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3QgU09BUF9FTlZfX1JlYXNvbikpO1xuXHRcdHNvYXBfZGVmYXVsdF9TT0FQX0VOVl9fUmVhc29uKHNvYXAsIHNvYXAtPmZhdWx0LT5TT0FQX0VOVl9fUmVhc29uKTtcblx0fVxufSIpOworCSAgZnByaW50Zihmb3V0LCJcblxuU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVmYXVsdChzdHJ1Y3Qgc29hcCAqc29hcClcbntcblx0c29hcF9mYXVsdChzb2FwKTtcblx0aWYgKHNvYXAtPmZhdWx0KVxuXHRcdHNvYXAtPmZhdWx0LT5zb2FwX3NlcmlhbGl6ZShzb2FwKTtcbn0iKTsKKwl9CisgICAgICAgIGlmICgocCA9IGVudHJ5KGNsYXNzdGFibGUsIGxvb2t1cCgiU09BUF9FTlZfX0ZhdWx0IikpKS0+aW5mby50eXAtPnR5cGUgPT0gVHN0cnVjdCkKKwl7IGZwcmludGYoZm91dCwiXG5cblNPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRmYXVsdChzdHJ1Y3Qgc29hcCAqc29hcClcbntcblx0aWYgKHNvYXAtPmZhdWx0KVxuXHRcdHJldHVybiBzb2FwX3B1dF9TT0FQX0VOVl9fRmF1bHQoc29hcCwgc29hcC0+ZmF1bHQsIFwiU09BUC1FTlY6RmF1bHRcIiwgTlVMTCk7XG5cdHJldHVybiBTT0FQX09LO1xufSIpOworCSAgZnByaW50Zihmb3V0LCJcblxuU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX2dldGZhdWx0KHN0cnVjdCBzb2FwICpzb2FwKVxue1xuXHRyZXR1cm4gKHNvYXAtPmZhdWx0ID0gc29hcF9nZXRfU09BUF9FTlZfX0ZhdWx0KHNvYXAsIE5VTEwsIFwiU09BUC1FTlY6RmF1bHRcIiwgTlVMTCkpID09IE5VTEw7XG59Iik7CisJfQorCWVsc2UKKwl7IGZwcmludGYoZm91dCwiXG5cblNPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRmYXVsdChzdHJ1Y3Qgc29hcCAqc29hcClcbntcblx0c29hcF9mYXVsdChzb2FwKTtcblx0aWYgKHNvYXAtPmZhdWx0KVxuXHRcdHJldHVybiBzb2FwLT5mYXVsdC0+c29hcF9wdXQoc29hcCwgXCJTT0FQLUVOVjpGYXVsdFwiLCBOVUxMKTtcblx0cmV0dXJuIFNPQVBfRU9NO1xufSIpOworCSAgZnByaW50Zihmb3V0LCJcblxuU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX2dldGZhdWx0KHN0cnVjdCBzb2FwICpzb2FwKVxue1xuXHRzb2FwX2ZhdWx0KHNvYXApO1xuXHRpZiAoc29hcC0+ZmF1bHQpXG5cdFx0cmV0dXJuIHNvYXAtPmZhdWx0LT5zb2FwX2dldChzb2FwLCBcIlNPQVAtRU5WOkZhdWx0XCIsIE5VTEwpID09IE5VTEw7XG5cdHJldHVybiBTT0FQX0VPTTtcbn0iKTsKKwl9CisJZnByaW50Zihmb3V0LCJcblxuU09BUF9GTUFDMyBjb25zdCBjaGFyICoqIFNPQVBfRk1BQzQgc29hcF9mYXVsdGNvZGUoc3RydWN0IHNvYXAgKnNvYXApXG57XG5cdHNvYXBfZmF1bHQoc29hcCk7XG5cdGlmIChzb2FwLT52ZXJzaW9uID09IDIpXG5cdFx0cmV0dXJuIChjb25zdCBjaGFyKiopJnNvYXAtPmZhdWx0LT5TT0FQX0VOVl9fQ29kZS0+U09BUF9FTlZfX1ZhbHVlO1xuXHRyZXR1cm4gKGNvbnN0IGNoYXIqKikmc29hcC0+ZmF1bHQtPmZhdWx0Y29kZTtcbn0iKTsKKwlmcHJpbnRmKGZvdXQsIlxuXG5TT0FQX0ZNQUMzIGNvbnN0IGNoYXIgKiogU09BUF9GTUFDNCBzb2FwX2ZhdWx0c3ViY29kZShzdHJ1Y3Qgc29hcCAqc29hcClcbntcblx0c29hcF9mYXVsdChzb2FwKTtcblx0aWYgKHNvYXAtPnZlcnNpb24gPT0gMilcblx0e1x0aWYgKCFzb2FwLT5mYXVsdC0+U09BUF9FTlZfX0NvZGUtPlNPQVBfRU5WX19TdWJjb2RlKVxuXHRcdHtcdHNvYXAtPmZhdWx0LT5TT0FQX0VOVl9fQ29kZS0+U09BUF9FTlZfX1N1YmNvZGUgPSAoc3RydWN0IFNPQVBfRU5WX19Db2RlKilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IFNPQVBfRU5WX19Db2RlKSk7XG5cdFx0XHRzb2FwX2RlZmF1bHRfU09BUF9FTlZfX0NvZGUoc29hcCwgc29hcC0+ZmF1bHQtPlNPQVBfRU5WX19Db2RlLT5TT0FQX0VOVl9fU3ViY29kZSk7XG5cdFx0fVxuXHRcdHJldHVybiAoY29uc3QgY2hhcioqKSZzb2FwLT5mYXVsdC0+U09BUF9FTlZfX0NvZGUtPlNPQVBfRU5WX19TdWJjb2RlLT5TT0FQX0VOVl9fVmFsdWU7XG5cdH1cblx0cmV0dXJuIChjb25zdCBjaGFyKiopJnNvYXAtPmZhdWx0LT5mYXVsdGNvZGU7XG59Iik7CisJZnByaW50Zihmb3V0LCJcblxuU09BUF9GTUFDMyBjb25zdCBjaGFyICoqIFNPQVBfRk1BQzQgc29hcF9mYXVsdHN0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcClcbntcblx0c29hcF9mYXVsdChzb2FwKTtcblx0aWYgKHNvYXAtPnZlcnNpb24gPT0gMilcblx0XHRyZXR1cm4gKGNvbnN0IGNoYXIqKikmc29hcC0+ZmF1bHQtPlNPQVBfRU5WX19SZWFzb24tPlNPQVBfRU5WX19UZXh0O1xuXHRyZXR1cm4gKGNvbnN0IGNoYXIqKikmc29hcC0+ZmF1bHQtPmZhdWx0c3RyaW5nO1xufSIpOworCWZwcmludGYoZm91dCwiXG5cblNPQVBfRk1BQzMgY29uc3QgY2hhciAqKiBTT0FQX0ZNQUM0IHNvYXBfZmF1bHRkZXRhaWwoc3RydWN0IHNvYXAgKnNvYXApXG57XG5cdHNvYXBfZmF1bHQoc29hcCk7Iik7CisJaWYgKGhhc19kZXRhaWxfc3RyaW5nKCkpCisJICBmcHJpbnRmKGZvdXQsIlxuXHRpZiAoc29hcC0+dmVyc2lvbiA9PSAxKVxuXHR7XHRpZiAoIXNvYXAtPmZhdWx0LT5kZXRhaWwpXG5cdFx0e1x0c29hcC0+ZmF1bHQtPmRldGFpbCA9IChzdHJ1Y3QgU09BUF9FTlZfX0RldGFpbCopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBTT0FQX0VOVl9fRGV0YWlsKSk7XG5cdFx0XHRzb2FwX2RlZmF1bHRfU09BUF9FTlZfX0RldGFpbChzb2FwLCBzb2FwLT5mYXVsdC0+ZGV0YWlsKTtcblx0XHR9XG5cdFx0cmV0dXJuIChjb25zdCBjaGFyKiopJnNvYXAtPmZhdWx0LT5kZXRhaWwtPl9fYW55O1xuXHR9Iik7CisJaWYgKGhhc19EZXRhaWxfc3RyaW5nKCkpCisJICBmcHJpbnRmKGZvdXQsIlxuXHRpZiAoIXNvYXAtPmZhdWx0LT5TT0FQX0VOVl9fRGV0YWlsKVxuXHR7XHRzb2FwLT5mYXVsdC0+U09BUF9FTlZfX0RldGFpbCA9IChzdHJ1Y3QgU09BUF9FTlZfX0RldGFpbCopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBTT0FQX0VOVl9fRGV0YWlsKSk7XG5cdFx0c29hcF9kZWZhdWx0X1NPQVBfRU5WX19EZXRhaWwoc29hcCwgc29hcC0+ZmF1bHQtPlNPQVBfRU5WX19EZXRhaWwpO1xuXHR9XG5cdHJldHVybiAoY29uc3QgY2hhcioqKSZzb2FwLT5mYXVsdC0+U09BUF9FTlZfX0RldGFpbC0+X19hbnk7XG59Iik7CisgICAgICAgIGVsc2UKKwkgIGZwcmludGYoZm91dCwiXG5cdHJldHVybiBOVUxMO1xufSIpOworCWZwcmludGYoZm91dCwiXG5cbiNlbmRpZiIpOworCisJZnByaW50Zihmb3V0LCJcblxuI2lmbmRlZiBXSVRIX05PSURSRUYiKTsKKwlmcHJpbnRmKGZvdXQsIlxuU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX2dldGluZGVwZW5kZW50KHN0cnVjdCBzb2FwICpzb2FwKVxueyIpOworCWZwcmludGYoZm91dCwiXG5cdGludCB0O1xuXHRmb3IgKDs7KSIpOworCWZwcmludGYoZm91dCwiXG5cdFx0aWYgKCFzb2FwX2dldGVsZW1lbnQoc29hcCwgJnQpKSIpOworICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0aWYgKHNvYXAtPmVycm9yIHx8IHNvYXBfaWdub3JlX2VsZW1lbnQoc29hcCkpXG5cdFx0XHRcdGJyZWFrOyIpOworICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcgfHwgc29hcC0+ZXJyb3IgPT0gU09BUF9FT0YpIik7CisgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0c29hcC0+ZXJyb3IgPSBTT0FQX09LOyIpOworICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRyZXR1cm4gc29hcC0+ZXJyb3I7Iik7CisgICAgICAgIGZwcmludGYoZm91dCwiXG59XG4jZW5kaWYiKTsKKworICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXG4jaWZuZGVmIFdJVEhfTk9JRFJFRiIpOworCWZwcmludGYoZm91dCwiXG5TT0FQX0ZNQUMzIHZvaWQgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0ZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50ICp0eXBlKVxueyIpOworICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRpZiAoc29hcF9wZWVrX2VsZW1lbnQoc29hcCkpXG5cdFx0cmV0dXJuIE5VTEw7Iik7CisJZnByaW50Zihmb3V0LCJcblx0aWYgKCEqc29hcC0+aWQgfHwgISgqdHlwZSA9IHNvYXBfbG9va3VwX3R5cGUoc29hcCwgc29hcC0+aWQpKSlcblx0XHQqdHlwZSA9IHNvYXBfbG9va3VwX3R5cGUoc29hcCwgc29hcC0+aHJlZik7Iik7CisJZnByaW50Zihmb3V0LCJcblx0c3dpdGNoICgqdHlwZSlcblx0eyIpOworCURCR0xPRyhmcHJpbnRmKHN0ZGVyciwiXG4gQ2FsbGluZyBpbl9kZWZzKCApLiIpKTsKKwlmZmx1c2goZm91dCk7CisJaW5fZGVmcyh0YWJsZSk7CisJREJHTE9HKGZwcmludGYoc3RkZXJyLCJcbiBDb21wbGV0ZWQgaW5fZGVmcyggKS4iKSk7CisgICAgICAgIGZwcmludGYoZm91dCwiXG5cdGRlZmF1bHQ6XG5cdHtcdGNvbnN0IGNoYXIgKnQgPSBzb2FwLT50eXBlO1xuXHRcdGlmICghKnQpXG5cdFx0XHR0ID0gc29hcC0+dGFnOyIpOworCWZmbHVzaChmb3V0KTsKKwlpbl9kZWZzMih0YWJsZSk7CisgICAgICAgIGZwcmludGYoZm91dCwiXG5cdH1cblx0fVxuXHRzb2FwLT5lcnJvciA9IFNPQVBfVEFHX01JU01BVENIO1xuXHRyZXR1cm4gTlVMTDtcbn1cbiNlbmRpZiIpOworCisJZnByaW50Zihmb3V0LCJcblxuU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX2lnbm9yZV9lbGVtZW50KHN0cnVjdCBzb2FwICpzb2FwKVxueyIpOworCWZwcmludGYoZm91dCwiXG5cdGlmICghc29hcF9wZWVrX2VsZW1lbnQoc29hcCkpIik7CisJZnByaW50Zihmb3V0LCJcblx0e1x0aW50IHQ7Iik7CisJZnByaW50Zihmb3V0LCJcblx0XHRpZiAoc29hcC0+bXVzdFVuZGVyc3RhbmQgJiYgIXNvYXAtPm90aGVyKSIpOworCWZwcmludGYoZm91dCwiXG5cdFx0XHRyZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX01VU1RVTkRFUlNUQU5EOyIpOworCWZwcmludGYoZm91dCwiXG5cdFx0aWYgKCgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgc29hcC0+cGFydCAhPSBTT0FQX0lOX0hFQURFUikgfHwgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnRhZywgXCJTT0FQLUVOVjpcIikpXG5cdFx0XHRyZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1RBR19NSVNNQVRDSDsiKTsKKwlmcHJpbnRmKGZvdXQsIlxuXHRcdGlmICghKnNvYXAtPmlkIHx8ICFzb2FwX2dldGVsZW1lbnQoc29hcCwgJnQpKSIpOworCWZwcmludGYoZm91dCwiXG5cdFx0e1x0c29hcC0+cGVla2VkID0gMDsiKTsKKwlmcHJpbnRmKGZvdXQsIlxuXHRcdFx0REJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsIFwiVW5rbm93biBlbGVtZW50ICclJXMnIChsZXZlbD0lJXUsICUlZClcXG5cIiwgc29hcC0+dGFnLCBzb2FwLT5sZXZlbCwgc29hcC0+Ym9keSkpOyIpOworCWZwcmludGYoZm91dCwiXG5cdFx0XHRpZiAoc29hcC0+Zmlnbm9yZSlcblx0XHRcdFx0c29hcC0+ZXJyb3IgPSBzb2FwLT5maWdub3JlKHNvYXAsIHNvYXAtPnRhZyk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHNvYXAtPmVycm9yID0gU09BUF9PSzsiKTsKKwlmcHJpbnRmKGZvdXQsIlxuXHRcdFx0REJHTE9HKFRFU1QsIGlmICghc29hcC0+ZXJyb3IpIFNPQVBfTUVTU0FHRShmZGVidWcsIFwiSUdOT1JJTkcgZWxlbWVudCAnJSVzJ1xcblwiLCBzb2FwLT50YWcpKTsiKTsKKwlmcHJpbnRmKGZvdXQsIlxuXHRcdFx0aWYgKCFzb2FwLT5lcnJvciAmJiBzb2FwLT5ib2R5KSIpOworCWZwcmludGYoZm91dCwiXG5cdFx0XHR7XHRzb2FwLT5sZXZlbCsrOyIpOworCWZwcmludGYoZm91dCwiXG5cdFx0XHRcdHdoaWxlICghc29hcF9pZ25vcmVfZWxlbWVudChzb2FwKSkiKTsKKwlmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRcdDsiKTsKKwlmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcpIik7CisJZnByaW50Zihmb3V0LCJcblx0XHRcdFx0XHRzb2FwLT5lcnJvciA9IHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgTlVMTCk7Iik7CisJZnByaW50Zihmb3V0LCJcblx0XHRcdH0iKTsKKwlmcHJpbnRmKGZvdXQsIlxuXHRcdH0iKTsKKwlmcHJpbnRmKGZvdXQsIlxuXHR9Iik7CisJZnByaW50Zihmb3V0LCJcblx0cmV0dXJuIHNvYXAtPmVycm9yOyIpOworCWZwcmludGYoZm91dCwiXG59Iik7CisKKwlmcHJpbnRmKGZvdXQsIlxuXG4jaWZuZGVmIFdJVEhfTk9JRFJFRiIpOworCWZwcmludGYoZm91dCwiXG5TT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0aW5kZXBlbmRlbnQoc3RydWN0IHNvYXAgKnNvYXApXG57XG5cdGludCBpO1xuXHRzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7Iik7CisJZnByaW50Zihmb3V0LCJcblx0aWYgKHNvYXAtPnZlcnNpb24gPT0gMSAmJiBzb2FwLT5lbmNvZGluZ1N0eWxlICYmICEoc29hcC0+bW9kZSAmIChTT0FQX1hNTF9UUkVFIHwgU09BUF9YTUxfR1JBUEgpKSkiKTsKKwlmcHJpbnRmKGZvdXQsIlxuXHRcdGZvciAoaSA9IDA7IGkgPCBTT0FQX1BUUkhBU0g7IGkrKykiKTsKKwlmcHJpbnRmKGZvdXQsIlxuXHRcdFx0Zm9yIChwcCA9IHNvYXAtPnBodFtpXTsgcHA7IHBwID0gcHAtPm5leHQpIik7CisJZnByaW50Zihmb3V0LCJcblx0XHRcdFx0aWYgKHBwLT5tYXJrMSA9PSAyIHx8IHBwLT5tYXJrMiA9PSAyKSIpOworCWZwcmludGYoZm91dCwiXG5cdFx0XHRcdFx0aWYgKHNvYXBfcHV0ZWxlbWVudChzb2FwLCBwcC0+cHRyLCBcImlkXCIsIHBwLT5pZCwgcHAtPnR5cGUpKVxuXHRcdFx0XHRcdFx0cmV0dXJuIHNvYXAtPmVycm9yOyIpOworCWZwcmludGYoZm91dCwiXG5cdHJldHVybiBTT0FQX09LO1xufVxuI2VuZGlmIik7CisKKwlmcHJpbnRmKGZvdXQsIlxuXG4jaWZuZGVmIFdJVEhfTk9JRFJFRiIpOworCWZwcmludGYoZm91dCwiXG5TT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0ZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcHRyLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgaW50IHR5cGUpXG57Iik7CisJZnByaW50Zihmb3V0LCJcblx0c3dpdGNoICh0eXBlKVxuXHR7Iik7CisJZmZsdXNoKGZvdXQpOworICAgICAgICBvdXRfZGVmcyh0YWJsZSk7CisJZnByaW50Zihmb3V0LCJcblx0fVxuXHRyZXR1cm4gU09BUF9PSztcbn1cbiNlbmRpZiIpOworCisJZnByaW50Zihmb3V0LCJcblxuI2lmbmRlZiBXSVRIX05PSURSRUYiKTsKKwlpZiAoaXNfYW55dHlwZV9mbGFnKQorCXsgZnByaW50Zihmb3V0LCJcblNPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfbWFya2VsZW1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnB0ciwgaW50IHR5cGUpXG57Iik7CisJICBmcHJpbnRmKGZvdXQsIlxuXHQodm9pZClzb2FwOyAodm9pZClwdHI7ICh2b2lkKXR5cGU7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLyIpOworCSAgZnByaW50Zihmb3V0LCJcblx0c3dpdGNoICh0eXBlKVxuXHR7Iik7CisJICBmZmx1c2goZm91dCk7CisgICAgICAgICAgbWFya19kZWZzKHRhYmxlKTsKKyAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHR9XG59Iik7CisgICAgICAgIH0KKwllbHNlCisJeyBmcHJpbnRmKGZvdXQsIlxuU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9tYXJrZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcHRyLCBpbnQgdHlwZSlcbnsiKTsKKwkgIGZwcmludGYoZm91dCwiXG5cdCh2b2lkKXNvYXA7ICh2b2lkKXB0cjsgKHZvaWQpdHlwZTsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovIik7CisgICAgICAgICAgZnByaW50Zihmb3V0LCJcbn0iKTsKKwl9CisJZnByaW50Zihmb3V0LCJcbiNlbmRpZiIpOworCisJfQorCQorCWNsYXNzZmxhZyA9IDA7CisJZm9yIChwID0gY2xhc3N0YWJsZS0+bGlzdDsgcDsgcCA9IHAtPm5leHQpCisJICBpZiAocC0+aW5mby50eXAtPnR5cGUgPT0gVGNsYXNzICYmIHAtPmluZm8udHlwLT50cmFuc2llbnQgPD0gMCkKKwkgIHsgY2xhc3NmbGFnID0gMTsKKwkgICAgYnJlYWs7CisJICB9CisKKwlpZiAoY2xhc3NmbGFnIHx8IFRwdHJbVHRlbXBsYXRlXSkKKwl7CisJICBpZiAoY2ZsYWcpCisJICAgIHNlbXdhcm4oIk9wdGlvbiAtYyBjb25mbGljdHMgd2l0aCB0aGUgdXNlIG9mIGNsYXNzZXMiKTsKKwl9CisKKwlpZiAoIWNmbGFnKQorCXsKKwlmcHJpbnRmKGZoZWFkLCJcblxuU09BUF9GTUFDMyB2b2lkICogU09BUF9GTUFDNCBzb2FwX2luc3RhbnRpYXRlKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOyIpOworCWlmICghbGZsYWcpCisJeworCWZwcmludGYoZm91dCwiXG5cblNPQVBfRk1BQzMgdm9pZCAqIFNPQVBfRk1BQzQgc29hcF9pbnN0YW50aWF0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHQsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmFycmF5VHlwZSwgc2l6ZV90ICpuKVxue1xuXHRzd2l0Y2ggKHQpXG5cdHsiKTsKKwlpZiAoY2xhc3N0YWJsZSkKKwkgIGZvciAocCA9IGNsYXNzdGFibGUtPmxpc3Q7IHA7IHAgPSBwLT5uZXh0KQorCSAgICBpZiAoKHAtPmluZm8udHlwLT50eXBlID09IFRjbGFzcyB8fCBwLT5pbmZvLnR5cC0+dHlwZSA9PSBUc3RydWN0KSAmJiAhaXNfdHJhbnNpZW50KHAtPmluZm8udHlwKSAmJiAhaXNfaGVhZGVyX29yX2ZhdWx0KHAtPmluZm8udHlwKSkKKwkgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRjYXNlICVzOlxuXHRcdHJldHVybiAodm9pZCopc29hcF9pbnN0YW50aWF0ZV8lcyhzb2FwLCAtMSwgdHlwZSwgYXJyYXlUeXBlLCBuKTsiLCBzb2FwX3R5cGUocC0+aW5mby50eXApLCBjX2lkZW50KHAtPmluZm8udHlwKSk7CisJaWYgKHR5cGV0YWJsZSkKKwkgIGZvciAocCA9IHR5cGV0YWJsZS0+bGlzdDsgcDsgcCA9IHAtPm5leHQpCisJICAgIGlmICgocC0+aW5mby50eXAtPnR5cGUgPT0gVGNsYXNzIHx8IHAtPmluZm8udHlwLT50eXBlID09IFRzdHJ1Y3QpICYmICFpc190cmFuc2llbnQocC0+aW5mby50eXApICYmICFpc19oZWFkZXJfb3JfZmF1bHQocC0+aW5mby50eXApKQorCSAgICAgIGZwcmludGYoZm91dCwiXG5cdGNhc2UgJXM6XG5cdFx0cmV0dXJuICh2b2lkKilzb2FwX2luc3RhbnRpYXRlXyVzKHNvYXAsIC0xLCB0eXBlLCBhcnJheVR5cGUsIG4pOyIsIHNvYXBfdHlwZShwLT5pbmZvLnR5cCksIGNfaWRlbnQocC0+aW5mby50eXApKTsKKwlmb3IgKHR5cCA9IFRwdHJbVHRlbXBsYXRlXTsgdHlwOyB0eXAgPSB0eXAtPm5leHQpCisJICBpZiAodHlwLT5yZWYgJiYgIWlzX3RyYW5zaWVudCh0eXApKQorCSAgICBmcHJpbnRmKGZvdXQsIlxuXHRjYXNlICVzOlxuXHRcdHJldHVybiAodm9pZCopc29hcF9pbnN0YW50aWF0ZV8lcyhzb2FwLCAtMSwgdHlwZSwgYXJyYXlUeXBlLCBuKTsiLCBzb2FwX3R5cGUodHlwKSwgY19pZGVudCh0eXApKTsKKworCWZwcmludGYoZm91dCwiXG5cdH1cblx0cmV0dXJuIE5VTEw7XG59Iik7CisJfQorCisJZnByaW50ZihmaGVhZCwiXG5TT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2ZkZWxldGUoc3RydWN0IHNvYXBfY2xpc3QqKTsiKTsKKwlpZiAoIWxmbGFnKQorCXsKKwlmcHJpbnRmKGZvdXQsIlxuXG5TT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2ZkZWxldGUoc3RydWN0IHNvYXBfY2xpc3QgKnApIik7CisJZnByaW50Zihmb3V0LCJcbntcdHN3aXRjaCAocC0+dHlwZSlcblx0eyIpOworCWlmIChjbGFzc3RhYmxlKQorCSAgZm9yIChwID0gY2xhc3N0YWJsZS0+bGlzdDsgcDsgcCA9IHAtPm5leHQpCisJICAgIGlmICgocC0+aW5mby50eXAtPnR5cGUgPT0gVGNsYXNzIHx8IHAtPmluZm8udHlwLT50eXBlID09IFRzdHJ1Y3QpICYmICFpc190cmFuc2llbnQocC0+aW5mby50eXApKQorCSAgICB7IGZwcmludGYoZm91dCwiXG5cdGNhc2UgJXM6Iiwgc29hcF90eXBlKHAtPmluZm8udHlwKSk7CisJICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRpZiAocC0+c2l6ZSA8IDApXG5cdFx0XHRkZWxldGUgKCVzKilwLT5wdHI7XG5cdFx0ZWxzZVxuXHRcdFx0ZGVsZXRlW10gKCVzKilwLT5wdHI7XG5cdFx0YnJlYWs7IiwgY190eXBlKHAtPmluZm8udHlwKSwgY190eXBlKHAtPmluZm8udHlwKSk7CisJICAgIH0KKwlpZiAodHlwZXRhYmxlKQorCSAgZm9yIChwID0gdHlwZXRhYmxlLT5saXN0OyBwOyBwID0gcC0+bmV4dCkKKwkgICAgaWYgKHAtPmluZm8udHlwLT50eXBlID09IFRjbGFzcyB8fCBwLT5pbmZvLnR5cC0+dHlwZSA9PSBUc3RydWN0KSAvKiAmJiBpc19leHRlcm5hbChwLT5pbmZvLnR5cCkpICovCisJICAgIHsgZnByaW50Zihmb3V0LCJcblx0Y2FzZSAlczoiLCBzb2FwX3R5cGUocC0+aW5mby50eXApKTsKKwkgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdGlmIChwLT5zaXplIDwgMClcblx0XHRcdGRlbGV0ZSAoJXMqKXAtPnB0cjtcblx0XHRlbHNlXG5cdFx0XHRkZWxldGVbXSAoJXMqKXAtPnB0cjtcblx0XHRicmVhazsiLCBjX3R5cGUocC0+aW5mby50eXApLCBjX3R5cGUocC0+aW5mby50eXApKTsKKwkgICAgfQorCWZvciAodHlwID0gVHB0cltUdGVtcGxhdGVdOyB0eXA7IHR5cCA9IHR5cC0+bmV4dCkKKwkgIGlmICh0eXAtPnJlZiAmJiAhaXNfdHJhbnNpZW50KHR5cCkpCisJICB7IGZwcmludGYoZm91dCwiXG5cdGNhc2UgJXM6Iiwgc29hcF90eXBlKHR5cCkpOworCSAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdGlmIChwLT5zaXplIDwgMClcblx0XHRcdGRlbGV0ZSAoJXMqKXAtPnB0cjtcblx0XHRlbHNlXG5cdFx0XHRkZWxldGVbXSAoJXMqKXAtPnB0cjtcblx0XHRicmVhazsiLCBjX3R5cGUodHlwKSwgY190eXBlKHR5cCkpOworCSAgfQorCWZwcmludGYoZm91dCwiXG5cdH0iKTsKKwlmcHJpbnRmKGZvdXQsIlxufSIpOworCX0KKworCWZwcmludGYoZmhlYWQsIlxuU09BUF9GTUFDMyB2b2lkKiBTT0FQX0ZNQUM0IHNvYXBfY2xhc3NfaWRfZW50ZXIoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdm9pZCosIGludCwgc2l6ZV90LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOyIpOworCWlmICghbGZsYWcpCisJeworCWZwcmludGYoZm91dCwiXG5cblNPQVBfRk1BQzMgdm9pZCogU09BUF9GTUFDNCBzb2FwX2NsYXNzX2lkX2VudGVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgdm9pZCAqcCwgaW50IHQsIHNpemVfdCBuLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICphcnJheVR5cGUpIik7CisJZnByaW50Zihmb3V0LCAiXG57XHRyZXR1cm4gc29hcF9pZF9lbnRlcihzb2FwLCBpZCwgcCwgdCwgbiwgMCwgdHlwZSwgYXJyYXlUeXBlLCBzb2FwX2luc3RhbnRpYXRlKTtcbn0iKTsKKwl9CisKKwlpZiAoVHB0cltUdGVtcGxhdGVdKQorCXsKKwlmcHJpbnRmKGZoZWFkLCAiXG5cblNPQVBfRk1BQzMgdm9pZCogU09BUF9GTUFDNCBzb2FwX2NvbnRhaW5lcl9pZF9mb3J3YXJkKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHZvaWQqLCBzaXplX3QsIGludCwgaW50LCBzaXplX3QsIHVuc2lnbmVkIGludCk7Iik7CisJaWYgKCFsZmxhZykKKwl7CisJZnByaW50Zihmb3V0LCAiXG5cblNPQVBfRk1BQzMgdm9pZCogU09BUF9GTUFDNCBzb2FwX2NvbnRhaW5lcl9pZF9mb3J3YXJkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpocmVmLCB2b2lkICpwLCBzaXplX3QgbGVuLCBpbnQgc3QsIGludCB0dCwgc2l6ZV90IG4sIHVuc2lnbmVkIGludCBrKSIpOworCWZwcmludGYoZm91dCwgIlxue1x0cmV0dXJuIHNvYXBfaWRfZm9yd2FyZChzb2FwLCBocmVmLCBwLCBsZW4sIHN0LCB0dCwgbiwgaywgc29hcF9jb250YWluZXJfaW5zZXJ0KTtcbn0iKTsKKwl9CisKKwlmcHJpbnRmKGZoZWFkLCAiXG5cblNPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfY29udGFpbmVyX2luc2VydChzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgc2l6ZV90LCBjb25zdCB2b2lkKiwgc2l6ZV90KTsiKTsKKwlpZiAoIWxmbGFnKQorCXsKKwlmcHJpbnRmKGZvdXQsICJcblxuU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9jb250YWluZXJfaW5zZXJ0KHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3QsIGludCB0dCwgdm9pZCAqcCwgc2l6ZV90IGxlbiwgY29uc3Qgdm9pZCAqcSwgc2l6ZV90IG4pIik7CisJZnByaW50Zihmb3V0LCAiXG57XHRzd2l0Y2ggKHR0KVxuXHR7Iik7CisJZm9yICh0eXAgPSBUcHRyW1R0ZW1wbGF0ZV07IHR5cDsgdHlwID0gdHlwLT5uZXh0KQorCXsgaWYgKHR5cC0+cmVmICYmICFpc190cmFuc2llbnQodHlwKSkKKwkgIHsgZnByaW50Zihmb3V0LCAiXG5cdGNhc2UgJXM6Iiwgc29hcF90eXBlKHR5cCkpOworCSAgICBmcHJpbnRmKGZvdXQsICJcblx0XHREQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgXCJDb250YWluZXIgaW5zZXJ0IHR5cGU9JSVkIGluICUlZCBsb2NhdGlvbj0lJXAgb2JqZWN0PSUlcCBsZW49JSVsdVxcblwiLCBzdCwgdHQsIHAsIHEsICh1bnNpZ25lZCBsb25nKWxlbikpOyIpOworICAgICAgICAgICAgaWYgKCFzdHJjbXAodHlwLT5pZC0+bmFtZSwgInN0ZDo6dmVjdG9yIikgfHwgIXN0cmNtcCh0eXAtPmlkLT5uYW1lLCAic3RkOjpkZXF1ZSIpKQorCSAgICAgIGZwcmludGYoZm91dCwgIlxuXHRcdCgqKCVzKXApW2xlbl0gPSAqKCVzKXE7IiwgY190eXBlX2lkKHR5cCwgIioiKSwgY190eXBlX2lkKHR5cC0+cmVmLCAiKiIpKTsKKwkgICAgZWxzZQorCSAgICAgIGZwcmludGYoZm91dCwgIlxuXHRcdCgoJXMpcCktPmluc2VydCgoKCVzKXApLT5lbmQoKSwgKiglcylxKTsiLCBjX3R5cGVfaWQodHlwLCAiKiIpLCBjX3R5cGVfaWQodHlwLCAiKiIpLCBjX3R5cGVfaWQodHlwLT5yZWYsICIqIikpOworCSAgICBmcHJpbnRmKGZvdXQsICJcblx0XHRicmVhazsiKTsKKwkgIH0KKwl9CisJZnByaW50Zihmb3V0LCAiXG5cdGRlZmF1bHQ6XG5cdFx0REJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsIFwiQ291bGQgbm90IGluc2VydCB0eXBlPSUlZCBpbiAlJWRcXG5cIiwgc3QsIHR0KSk7Iik7CisJZnByaW50Zihmb3V0LCAiXG5cdH0iKTsKKwlmcHJpbnRmKGZvdXQsICJcbn0iKTsKKwl9CisJfQorCX0KKworCURCR0xPRyhmcHJpbnRmKHN0ZGVyciwiXG4gQ2FsbGluZyBkZWZfdGFibGUoICkuIikpOworICAgICAgICBkZWZfdGFibGUodGFibGUpOworCURCR0xPRyhmcHJpbnRmKHN0ZGVyciwiXG4gQ29tcGxldGVkIGRlZl90YWJsZSggKS4iKSk7CisJaWYgKG1mbGFnKQorIAl7IERCR0xPRyhmcHJpbnRmKHN0ZGVyciwiXG4gQ2FsbGluZyBtYXRsYWJfZGVmX3RhYmxlKCApLiIpKTsKKwkgIG1hdGxhYl9kZWZfdGFibGUodGFibGUpOworIAkgIERCR0xPRyhmcHJpbnRmKHN0ZGVyciwiXG4gQ29tcGxldGVkIG1hdGxhYl9kZWZfdGFibGUoICkuIikpOworIAkgIGZjbG9zZShmbWF0bGFiKTsKKyAJICBmY2xvc2UoZm1oZWFkZXIpOworCX0KKwlpZiAobmFtZXNwYWNlaWQpCisJICBmcHJpbnRmKGZvdXQsIlxuXG59IC8vIG5hbWVzcGFjZSAlc1xuIiwgbmFtZXNwYWNlaWQpOworCWlmIChjZmxhZykKKwkgIGZwcmludGYoZm91dCwiXG5cbiNpZmRlZiBfX2NwbHVzcGx1c1xufVxuI2VuZGlmIik7CisJZnByaW50Zihmb3V0LCAiXG5cbi8qIEVuZCBvZiAlcyAqL1xuIiwgc29hcEMpOworICAgICAgICBmY2xvc2UoZm91dCk7CisJaWYgKG5hbWVzcGFjZWlkKQorCSAgZnByaW50ZihmaGVhZCwiXG5cbn0gLy8gbmFtZXNwYWNlICVzXG4iLCBuYW1lc3BhY2VpZCk7CisJaWYgKGNmbGFnKQorCSAgZnByaW50ZihmaGVhZCwiXG5cbiNpZmRlZiBfX2NwbHVzcGx1c1xufVxuI2VuZGlmIik7CisJZnByaW50ZihmaGVhZCwgIlxuXG4jZW5kaWYiKTsKKwlmcHJpbnRmKGZoZWFkLCAiXG5cbi8qIEVuZCBvZiAlcyAqL1xuIiwgc29hcEgpOworCWZjbG9zZShmaGVhZCk7CisJaWYgKG5hbWVzcGFjZWlkKQorCSAgZnByaW50ZihmaGVhZGVyLCJcblxufSAvLyBuYW1lc3BhY2UgJXNcbiIsIG5hbWVzcGFjZWlkKTsKKwlpZiAoY2ZsYWcpCisJICBmcHJpbnRmKGZoZWFkZXIsIlxuXG4jaWZkZWYgX19jcGx1c3BsdXNcbn1cbiNlbmRpZiIpOworCWZwcmludGYoZmhlYWRlciwgIlxuXG4jZW5kaWYiKTsKKwlmcHJpbnRmKGZoZWFkZXIsICJcblxuLyogRW5kIG9mICVzICovXG4iLCBzb2FwU3R1Yik7CisJZmNsb3NlKGZoZWFkZXIpOworCisJaWYgKCFTZmxhZyAmJiAhaWZsYWcpCisJeyBpZiAobmFtZXNwYWNlaWQpCisJICAgIGZwcmludGYoZmNsaWVudCwiXG5cbn0gLy8gbmFtZXNwYWNlICVzXG4iLCBuYW1lc3BhY2VpZCk7CisJICBpZiAoY2ZsYWcpCisJICAgIGZwcmludGYoZmNsaWVudCwiXG5cbiNpZmRlZiBfX2NwbHVzcGx1c1xufVxuI2VuZGlmIik7CisJICBmcHJpbnRmKGZjbGllbnQsICJcblxuLyogRW5kIG9mICVzICovXG4iLCBzb2FwQ2xpZW50KTsKKyAgICAgICAgICBmY2xvc2UoZmNsaWVudCk7CisgICAgICAgIH0KKworCWlmICghQ2ZsYWcgJiYgIWlmbGFnKQorCXsgaWYgKG5hbWVzcGFjZWlkKQorCSAgICBmcHJpbnRmKGZzZXJ2ZXIsIlxuXG59IC8vIG5hbWVzcGFjZSAlc1xuIiwgbmFtZXNwYWNlaWQpOworCSAgaWYgKGNmbGFnKQorCSAgICBmcHJpbnRmKGZzZXJ2ZXIsIlxuXG4jaWZkZWYgX19jcGx1c3BsdXNcbn1cbiNlbmRpZiIpOworCSAgZnByaW50Zihmc2VydmVyLCAiXG5cbi8qIEVuZCBvZiAlcyAqL1xuIiwgc29hcFNlcnZlcik7CisgCSAgZmNsb3NlKGZzZXJ2ZXIpOworICAgICAgICB9Cit9CisKK3ZvaWQKK2dlbl9jbGFzcyhGSUxFICpmZCwgVG5vZGUgKnR5cCkKK3sgRW50cnkgKkVwdHI7CisgIGNoYXIgKng7CisgIHggPSB4c2lfdHlwZSh0eXApOworICBpZiAoIXggfHwgISp4KQorICAgIHggPSB3c2RsX3R5cGUodHlwLCAiIik7CisgIHR5cC0+Z2VuZXJhdGVkID0gVHJ1ZTsKKyAgaWYgKGlzX3ZvbGF0aWxlKHR5cCkpCisgICAgZnByaW50ZihmZCwgIlxuXG4jaWYgMCAvKiB2b2xhdGlsZSB0eXBlOiBkbyBubyByZWRlY2xhcmUgKi9cbiIpOworICBlbHNlIGlmICh0eXAtPnJlZikKKyAgeyBmcHJpbnRmKGZoZWFkZXIsICJcblxuI2lmbmRlZiAlcyIsIHNvYXBfdHlwZSh0eXApKTsKKyAgICBmcHJpbnRmKGZoZWFkZXIsICJcbiNkZWZpbmUgJXMgKCVkKVxuIixzb2FwX3R5cGUodHlwKSx0eXAtPm51bSk7CQorICB9CisgIGVsc2UKKyAgICBmcHJpbnRmKGZkLCAiXG5cbiIpOworICBpZiAoaXNfdHJhbnNpZW50KHR5cCkgJiYgdHlwLT5yZWYpCisgICAgZnByaW50ZihmZCwgIi8qIFRyYW5zaWVudCB0eXBlOiAqL1xuIik7CisgIGVsc2UgaWYgKGlzX2ludmlzaWJsZSh0eXAtPmlkLT5uYW1lKSAmJiB0eXAtPnJlZikKKyAgICBmcHJpbnRmKGZkLCAiLyogT3BlcmF0aW9uIHdyYXBwZXI6ICovXG4iKTsKKyAgZWxzZSBpZiAoaXNfaGV4QmluYXJ5KHR5cCkpCisgICAgZnByaW50ZihmZCwgIi8qIGhleEJpbmFyeSBzY2hlbWEgdHlwZTogKi9cbiIpOworICBlbHNlIGlmIChpc19iaW5hcnkodHlwKSkKKyAgICBmcHJpbnRmKGZkLCAiLyogQmFzZTY0IHNjaGVtYSB0eXBlOiAqL1xuIik7CisgIGVsc2UgaWYgKGlzX2Rpc2NyaW1pbmFudCh0eXApKQorICAgIGZwcmludGYoZmQsICIvKiBDaG9pY2U6ICovXG4iKTsKKyAgZWxzZSBpZiAoaXNfZHluYW1pY19hcnJheSh0eXApKQorICB7IEVwdHIgPSAoKFRhYmxlKil0eXAtPnJlZiktPmxpc3Q7CisgICAgaWYgKCFpc191bnR5cGVkKEVwdHItPmluZm8udHlwKSAmJiAoaXNfZXh0ZXJuYWwoRXB0ci0+aW5mby50eXAtPnJlZikgJiYgKChUbm9kZSopRXB0ci0+aW5mby50eXAtPnJlZiktPnR5cGUgPT0gVGNsYXNzIHx8IGhhc19leHRlcm5hbChFcHRyLT5pbmZvLnR5cC0+cmVmKSkpCisgICAgeyBzcHJpbnRmKGVycmJ1ZiwgIkZpZWxkICclcycgbXVzdCBiZSBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gJXMgdG8gcHJldmVudCBpZC1yZWYgY29weWluZyBvZiAlcyBpbnN0YW5jZXMgY29udGFpbnRpbmcgYW4gZXh0ZXJuYWwgb2JqZWN0IChkZWNsYXJlZCBhdCBsaW5lICVkKSIsIEVwdHItPnN5bS0+bmFtZSwgY190eXBlKEVwdHItPmluZm8udHlwLT5yZWYpLCBjX3R5cGUoRXB0ci0+aW5mby50eXAtPnJlZiksIEVwdHItPmxpbmVubyk7CisgICAgICBzZW13YXJuKGVycmJ1Zik7CisgICAgfQorICAgIGVsc2UgaWYgKCFpc191bnR5cGVkKEVwdHItPmluZm8udHlwKSAmJiAoaXNfdm9sYXRpbGUoRXB0ci0+aW5mby50eXAtPnJlZikgJiYgKChUbm9kZSopRXB0ci0+aW5mby50eXAtPnJlZiktPnR5cGUgPT0gVGNsYXNzIHx8IGhhc192b2xhdGlsZShFcHRyLT5pbmZvLnR5cC0+cmVmKSkpCisgICAgeyBzcHJpbnRmKGVycmJ1ZiwgIkZpZWxkICclcycgbXVzdCBiZSBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gJXMgdG8gcHJldmVudCBpZC1yZWYgY29weWluZyBvZiAlcyBpbnN0YW5jZXMgY29udGFpbnRpbmcgYSB2b2xhdGlsZSBvYmplY3QgKGRlY2xhcmVkIGF0IGxpbmUgJWQpIiwgRXB0ci0+c3ltLT5uYW1lLCBjX3R5cGUoRXB0ci0+aW5mby50eXAtPnJlZiksIGNfdHlwZShFcHRyLT5pbmZvLnR5cC0+cmVmKSwgRXB0ci0+bGluZW5vKTsKKyAgICAgIHNlbXdhcm4oZXJyYnVmKTsKKyAgICB9CisgICAgaWYgKGhhc19ucyh0eXApIHx8IGlzX3VudHlwZWQodHlwKSkKKyAgICAgIGZwcmludGYoZmQsICIvKiBTZXF1ZW5jZSBvZiAlcyBzY2hlbWEgdHlwZTogKi9cbiIsIHgpOworICAgIGVsc2UKKyAgICB7IGlmICghZWZsYWcpCisgICAgICB7IHNwcmludGYoZXJyYnVmLCAiYXJyYXkgJyVzJyBpcyBub3QgY29tcGxpYW50IHdpdGggV1MtSSBCYXNpYyBQcm9maWxlIDEuMGEsIHJlYXNvbjogU09BUCBlbmNvZGVkIGFycmF5IiwgY190eXBlKHR5cCkpOworICAgICAgICBjb21wbGlhbmNld2FybihlcnJidWYpOworICAgICAgfQorICAgICAgZnByaW50ZihmZCwgIi8qIFNPQVAgZW5jb2RlZCBhcnJheSBvZiAlcyBzY2hlbWEgdHlwZTogKi9cbiIsIHgpOworICAgIH0KKyAgfQorICBlbHNlIGlmIChpc19wcmltY2xhc3ModHlwKSkKKyAgICBmcHJpbnRmKGZkLCAiLyogUHJpbWl0aXZlICVzIHNjaGVtYSB0eXBlOiAqL1xuIiwgeCk7CisgIGVsc2UgaWYgKCFzdHJjbXAodHlwLT5pZC0+bmFtZSwgIlNPQVBfRU5WX19IZWFkZXIiKSkKKyAgICBmcHJpbnRmKGZkLCAiLyogU09BUCBIZWFkZXI6ICovXG4iKTsKKyAgZWxzZSBpZiAoIXN0cmNtcCh0eXAtPmlkLT5uYW1lLCAiU09BUF9FTlZfX0ZhdWx0IikpCisgICAgZnByaW50ZihmZCwgIi8qIFNPQVAgRmF1bHQ6ICovXG4iKTsKKyAgZWxzZSBpZiAoIXN0cmNtcCh0eXAtPmlkLT5uYW1lLCAiU09BUF9FTlZfX0NvZGUiKSkKKyAgICBmcHJpbnRmKGZkLCAiLyogU09BUCBGYXVsdCBDb2RlOiAqL1xuIik7CisgIGVsc2UgaWYgKHggJiYgKnggJiYgdHlwLT5yZWYpCisgICAgZnByaW50ZihmZCwgIi8qICVzICovXG4iLCB4KTsKKyAgZmZsdXNoKGZkKTsKKyAgaWYgKHR5cC0+dHlwZSA9PSBUc3RydWN0KQorICB7ICAgREJHTE9HKGZwcmludGYoc3RkZXJyLCJcbnN0cnVjdCAlc1xuIiwgdHlwLT5pZC0+bmFtZSkpOworICAgICAgaWYgKHR5cC0+cmVmKQorICAgICAgeyBpbnQgcGVybWlzc2lvbiA9IC0xOworICAgICAgICBmcHJpbnRmKGZkLCAic3RydWN0ICVzXG57IiwgdHlwLT5pZC0+bmFtZSApOworICAgICAgICBmb3IgKEVwdHIgPSAoKFRhYmxlKil0eXAtPnJlZiktPmxpc3Q7IEVwdHI7IEVwdHIgPSBFcHRyLT5uZXh0KQorICAgICAgICB7IGlmICghY2ZsYWcgJiYgcGVybWlzc2lvbiAhPSAoRXB0ci0+aW5mby5zdG8gJiAoU3ByaXZhdGUgfCBTcHJvdGVjdGVkKSkpCisgICAgICAgICAgeyBpZiAoRXB0ci0+aW5mby5zdG8gJiBTcHJpdmF0ZSkKKyAgICAgICAgICAgICAgZnByaW50ZihmZCwgIlxucHJpdmF0ZToiKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKEVwdHItPmluZm8uc3RvICYgU3Byb3RlY3RlZCkKKyAgICAgICAgICAgICAgZnByaW50ZihmZCwgIlxucHJvdGVjdGVkOiIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAiXG5wdWJsaWM6Iik7CisJICAgIHBlcm1pc3Npb24gPSAoRXB0ci0+aW5mby5zdG8gJiAoU3ByaXZhdGUgfCBTcHJvdGVjdGVkKSk7CisJICB9CisJICBpZiAoY2ZsYWcgJiYgRXB0ci0+aW5mby50eXAtPnR5cGUgPT0gVGZ1bikKKwkgICAgY29udGludWU7CisJICBpZiAoY2ZsYWcgJiYgKEVwdHItPmluZm8uc3RvICYgU3R5cGVkZWYpKQorCSAgICBjb250aW51ZTsKKwkgIGZwcmludGYoZmQsICJcblx0JXMiLCBjX3N0b3JhZ2UoRXB0ci0+aW5mby5zdG8pKTsKKwkgIC8qaWYgKEVwdHItPmluZm8udHlwLT50eXBlID09IFRjbGFzcyAmJiAhaXNfZXh0ZXJuYWwoRXB0ci0+aW5mby50eXApICYmIEVwdHItPmluZm8udHlwLT5nZW5lcmF0ZWQgPT0gRmFsc2UgfHwgKEVwdHItPmluZm8udHlwLT50eXBlID09IFRwb2ludGVyIHx8IEVwdHItPmluZm8udHlwLT50eXBlID09IFRyZWZlcmVuY2UpICYmIEVwdHItPmluZm8udHlwLT5yZWYgJiYgKChUbm9kZSopRXB0ci0+aW5mby50eXAtPnJlZiktPnR5cGUgPT0gVGNsYXNzICYmICFpc19leHRlcm5hbChFcHRyLT5pbmZvLnR5cC0+cmVmKSAmJiAoKFRub2RlKilFcHRyLT5pbmZvLnR5cC0+cmVmKS0+Z2VuZXJhdGVkID09IEZhbHNlKQorCSAgICBmcHJpbnRmKGZkLCAiY2xhc3MgIik7CisJICAqLworCSAgaWYgKEVwdHItPnN5bSA9PSB0eXAtPmlkKSAvKiBhIGhhY2sgdG8gZW1pdCBjb25zdHJ1Y3RvciBpbiBhIHN0cnVjdCAqLworICAgICAgICAgICAgKChGTmluZm8qKUVwdHItPmluZm8udHlwLT5yZWYpLT5yZXQgPSBta25vbmUoKTsKKyAgICAgICAgICBmcHJpbnRmKGZkLCAiJXMiLCBjX3R5cGVfaWQoRXB0ci0+aW5mby50eXAsRXB0ci0+c3ltLT5uYW1lKSk7CisJICBpZiAoRXB0ci0+aW5mby5zdG8gJiBTY29uc3RvYmopCisJICAgIGZwcmludGYoZmQsICIgY29uc3Q7Iik7CisJICBlbHNlCisJICAgIGZwcmludGYoZmQsICI7Iik7CisJICBpZiAoRXB0ci0+aW5mby5zdG8gJiBTcmV0dXJuKQorCSAgICBmcHJpbnRmKGZkLCAiXHQvKiBSUEMgcmV0dXJuIGVsZW1lbnQgKi8iKTsKKwkgIGlmIChpc19leHRlcm5hbChFcHRyLT5pbmZvLnR5cCkpCisJICAgIGZwcmludGYoZmQsICJcdC8qIGV4dGVybmFsICovIik7CisJICBpZiAoaXNfdHJhbnNpZW50KEVwdHItPmluZm8udHlwKSkKKwkgICAgZnByaW50ZihmZCwgIlx0LyogdHJhbnNpZW50ICovIik7CisJICBpZiAoRXB0ci0+aW5mby5zdG8gJiBTYXR0cmlidXRlKQorCSAgICBpZiAoRXB0ci0+aW5mby5taW5PY2N1cnMgPj0gMSkKKwkgICAgICBmcHJpbnRmKGZkLCAiXHQvKiByZXF1aXJlZCBhdHRyaWJ1dGUgb2YgdHlwZSAlcyAqLyIsIHdzZGxfdHlwZShFcHRyLT5pbmZvLnR5cCwgIiIpKTsKKyAgICAgICAgICAgIGVsc2UKKwkgICAgICBmcHJpbnRmKGZkLCAiXHQvKiBvcHRpb25hbCBhdHRyaWJ1dGUgb2YgdHlwZSAlcyAqLyIsIHdzZGxfdHlwZShFcHRyLT5pbmZvLnR5cCwgIiIpKTsKKwkgIGlmIChFcHRyLT5pbmZvLnN0byAmIChTY29uc3QgfCBTcHJpdmF0ZSB8IFNwcm90ZWN0ZWQpKQorCSAgICBmcHJpbnRmKGZkLCAiXHQvKiBub3Qgc2VyaWFsaXplZCAqLyIpOworCSAgZWxzZSBpZiAoRXB0ci0+aW5mby5zdG8gJiBTbXVzdFVuZGVyc3RhbmQpCisJICAgIGZwcmludGYoZmQsICJcdC8qIG11c3RVbmRlcnN0YW5kICovIik7CisJICBlbHNlIGlmICghaXNfZHluYW1pY19hcnJheSh0eXApICYmIGlzX3JlcGV0aXRpb24oRXB0cikpCisgICAgICAgICAgeyBpZiAoIWlzX3VudHlwZWQoRXB0ci0+bmV4dC0+aW5mby50eXApICYmIGhhc19ucyhFcHRyLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSAmJiAoaXNfZXh0ZXJuYWwoRXB0ci0+bmV4dC0+aW5mby50eXAtPnJlZikgJiYgKChUbm9kZSopRXB0ci0+bmV4dC0+aW5mby50eXAtPnJlZiktPnR5cGUgPT0gVGNsYXNzIHx8IGhhc19leHRlcm5hbChFcHRyLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSkpCisgICAgICAgICAgICB7IHNwcmludGYoZXJyYnVmLCAiRmllbGQgJyVzJyBtdXN0IGJlIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBwb2ludGVycyB0byAlcyB0byBwcmV2ZW50IGlkLXJlZiBjb3B5aW5nIG9mICVzIGluc3RhbmNlcyBjb250YWluaW5nIGFuIGV4dGVybmFsIG9iamVjdCAoZGVjbGFyZWQgYXQgbGluZSAlZCkiLCBFcHRyLT5uZXh0LT5zeW0tPm5hbWUsIGNfdHlwZShFcHRyLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSwgY190eXBlKEVwdHItPm5leHQtPmluZm8udHlwLT5yZWYpLCBFcHRyLT5uZXh0LT5saW5lbm8pOworCSAgICAgIHNlbXdhcm4oZXJyYnVmKTsKKwkgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIWlzX3VudHlwZWQoRXB0ci0+bmV4dC0+aW5mby50eXApICYmIGhhc19ucyhFcHRyLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSAmJiAoaXNfdm9sYXRpbGUoRXB0ci0+bmV4dC0+aW5mby50eXAtPnJlZikgJiYgKChUbm9kZSopRXB0ci0+bmV4dC0+aW5mby50eXAtPnJlZiktPnR5cGUgPT0gVGNsYXNzIHx8IGhhc192b2xhdGlsZShFcHRyLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSkpCisgICAgICAgICAgICB7IHNwcmludGYoZXJyYnVmLCAiRmllbGQgJyVzJyBtdXN0IGJlIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBwb2ludGVycyB0byAlcyB0byBwcmV2ZW50IGlkLXJlZiBjb3B5aW5nIG9mICVzIGluc3RhbmNlcyBjb250YWluaW5nIGEgdm9sYXRpbGUgb2JqZWN0IChkZWNsYXJlZCBhdCBsaW5lICVkKSIsIEVwdHItPm5leHQtPnN5bS0+bmFtZSwgY190eXBlKEVwdHItPm5leHQtPmluZm8udHlwLT5yZWYpLCBjX3R5cGUoRXB0ci0+bmV4dC0+aW5mby50eXAtPnJlZiksIEVwdHItPm5leHQtPmxpbmVubyk7CisJICAgICAgc2Vtd2FybihlcnJidWYpOworCSAgICB9CisJICAgIGlmIChFcHRyLT5pbmZvLm1heE9jY3VycyA+IDEpCisJICAgICAgZnByaW50ZihmZCwgIlx0Lyogc2VxdWVuY2Ugb2YgJWxkIHRvICVsZCBlbGVtZW50cyA8JXM+ICovIiwgRXB0ci0+aW5mby5taW5PY2N1cnMsIEVwdHItPmluZm8ubWF4T2NjdXJzLCBuc19jb252ZXJ0KEVwdHItPm5leHQtPnN5bS0+bmFtZSkpOworCSAgICBlbHNlCisJICAgICAgZnByaW50ZihmZCwgIlx0Lyogc2VxdWVuY2Ugb2YgZWxlbWVudHMgPCVzPiAqLyIsIG5zX2NvbnZlcnQoRXB0ci0+bmV4dC0+c3ltLT5uYW1lKSk7CisJICB9CisJICBlbHNlIGlmIChpc19hbnl0eXBlKEVwdHIpKQorCSAgICBmcHJpbnRmKGZkLCAiXHQvKiBhbnkgdHlwZSBvZiBlbGVtZW50IDwlcz4gKGRlZmluZWQgYmVsb3cpICovIiwgbnNfY29udmVydChFcHRyLT5uZXh0LT5zeW0tPm5hbWUpKTsKKwkgIGVsc2UgaWYgKGlzX2Nob2ljZShFcHRyKSkKKwkgICAgZnByaW50ZihmZCwgIlx0LyogdW5pb24gZGlzY3JpbWluYW50IChvZiB1bmlvbiBkZWZpbmVkIGJlbG93KSAqLyIpOworCSAgZWxzZSBpZiAoRXB0ci0+aW5mby50eXAtPnR5cGUgIT0gVGZ1biAmJiAhKEVwdHItPmluZm8uc3RvICYgKFNjb25zdCB8IFNwcml2YXRlIHwgU3Byb3RlY3RlZCkpICYmICEoRXB0ci0+aW5mby5zdG8gJiBTYXR0cmlidXRlKSAmJiAhaXNfdHJhbnNpZW50KEVwdHItPmluZm8udHlwKSAmJiAhaXNfZXh0ZXJuYWwoRXB0ci0+aW5mby50eXApICYmIHN0cm5jbXAoRXB0ci0+c3ltLT5uYW1lLCAiX18iLCAyKSkKKwkgIHsgaWYgKEVwdHItPmluZm8ubWF4T2NjdXJzID4gMSkKKwkgICAgICBmcHJpbnRmKGZkLCAiXHQvKiBzZXF1ZW5jZSBvZiAlbGQgdG8gJWxkIGVsZW1lbnRzIG9mIHR5cGUgJXMgKi8iLCBFcHRyLT5pbmZvLm1pbk9jY3VycywgRXB0ci0+aW5mby5tYXhPY2N1cnMsIHdzZGxfdHlwZShFcHRyLT5pbmZvLnR5cCwgIiIpKTsKKwkgICAgZWxzZSBpZiAoRXB0ci0+aW5mby5taW5PY2N1cnMgPj0gMSkKKwkgICAgICBmcHJpbnRmKGZkLCAiXHQvKiByZXF1aXJlZCBlbGVtZW50IG9mIHR5cGUgJXMgKi8iLCB3c2RsX3R5cGUoRXB0ci0+aW5mby50eXAsICIiKSk7CisgICAgICAgICAgICBlbHNlCisJICAgICAgZnByaW50ZihmZCwgIlx0Lyogb3B0aW9uYWwgZWxlbWVudCBvZiB0eXBlICVzICovIiwgd3NkbF90eXBlKEVwdHItPmluZm8udHlwLCAiIikpOworCSAgfQorCSAgaWYgKCFpc19keW5hbWljX2FycmF5KHR5cCkgJiYgIWlzX3ByaW1jbGFzcyh0eXApKQorCSAgeyBpZiAoIXN0cm5jbXAoRXB0ci0+c3ltLT5uYW1lLCAiX19zaXplIiwgNikpCisJICAgIHsgaWYgKCFFcHRyLT5uZXh0IHx8IEVwdHItPm5leHQtPmluZm8udHlwLT50eXBlICE9IFRwb2ludGVyKQorICAgICAgICAgICAgICB7IHNwcmludGYoZXJyYnVmLCAiRmllbGQgJyVzJyBpcyBub3QgZm9sbG93ZWQgYnkgYSBwb2ludGVyIGZpZWxkIGluIHN0cnVjdCAnJXMnIiwgRXB0ci0+c3ltLT5uYW1lLCB0eXAtPmlkLT5uYW1lKTsKKyAgICAgICAgICAgICAgICBzZW13YXJuKGVycmJ1Zik7CisJICAgICAgfQorCSAgICB9CisJICAgIGVsc2UgaWYgKCFzdHJuY21wKEVwdHItPnN5bS0+bmFtZSwgIl9fdHlwZSIsIDYpKQorCSAgICB7IGlmICghRXB0ci0+bmV4dCB8fCAoKEVwdHItPm5leHQtPmluZm8udHlwLT50eXBlICE9IFRwb2ludGVyIHx8ICgoVG5vZGUqKUVwdHItPm5leHQtPmluZm8udHlwLT5yZWYpLT50eXBlICE9IFR2b2lkKSkpCisgICAgICAgICAgICAgIHsgc3ByaW50ZihlcnJidWYsICJGaWVsZCAnJXMnIGlzIG5vdCBmb2xsb3dlZCBieSBhIHZvaWQgcG9pbnRlciBvciB1bmlvbiBmaWVsZCBpbiBzdHJ1Y3QgJyVzJyIsIEVwdHItPnN5bS0+bmFtZSwgdHlwLT5pZC0+bmFtZSk7CisgICAgICAgICAgICAgICAgc2Vtd2FybihlcnJidWYpOworCSAgICAgIH0KKwkgICAgfQorCSAgfQorCX0KKyAgICAgICAgZnByaW50ZihmZCwgIlxufTsiKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFpc190cmFuc2llbnQodHlwKSAmJiAhaXNfZXh0ZXJuYWwodHlwKSAmJiAhaXNfdm9sYXRpbGUodHlwKSkKKyAgICAgIHsgc3ByaW50ZihlcnJidWYsICJzdHJ1Y3QgJyVzJyBpcyBlbXB0eSIsIHR5cC0+aWQtPm5hbWUpOworICAgICAgICBzZW13YXJuKGVycmJ1Zik7CisgICAgICB9CisgIH0KKyAgZWxzZSBpZiAodHlwLT50eXBlID09IFRjbGFzcykKKyAgeyBEQkdMT0coZnByaW50ZihzdGRlcnIsIlxuY2xhc3MgJXNcbiIsIHR5cC0+aWQtPm5hbWUpKTsKKyAgICBpZiAodHlwLT5yZWYpCisgICAgeyBpbnQgcGVybWlzc2lvbiA9IC0xOworICAgICAgZnByaW50ZihmZCwiY2xhc3MgU09BUF9DTUFDICVzIiwgdHlwLT5pZC0+bmFtZSApOworICAgICAgaWYgKHR5cC0+YmFzZSkKKyAgICAgICAgZnByaW50ZihmZCwiIDogcHVibGljICVzIiwgdHlwLT5iYXNlLT5uYW1lKTsKKyAgICAgIGZwcmludGYoZmQsIlxueyIpOworICAgICAgZm9yIChFcHRyID0gKChUYWJsZSopdHlwLT5yZWYpLT5saXN0OyBFcHRyOyBFcHRyID0gRXB0ci0+bmV4dCkKKyAgICAgIHsgaWYgKHBlcm1pc3Npb24gIT0gKEVwdHItPmluZm8uc3RvICYgKFNwcml2YXRlIHwgU3Byb3RlY3RlZCkpKQorICAgICAgICB7IGlmIChFcHRyLT5pbmZvLnN0byAmIFNwcml2YXRlKQorICAgICAgICAgICAgZnByaW50ZihmZCwgIlxucHJpdmF0ZToiKTsKKyAgICAgICAgICBlbHNlIGlmIChFcHRyLT5pbmZvLnN0byAmIFNwcm90ZWN0ZWQpCisgICAgICAgICAgICBmcHJpbnRmKGZkLCAiXG5wcm90ZWN0ZWQ6Iik7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZnByaW50ZihmZCwgIlxucHVibGljOiIpOworCSAgcGVybWlzc2lvbiA9IChFcHRyLT5pbmZvLnN0byAmIChTcHJpdmF0ZSB8IFNwcm90ZWN0ZWQpKTsKKwl9CisgICAgICAgIGZwcmludGYoZmQsIlxuXHQlcyIsIGNfc3RvcmFnZShFcHRyLT5pbmZvLnN0bykpOworCS8qIGlmIChFcHRyLT5pbmZvLnR5cC0+dHlwZSA9PSBUY2xhc3MgJiYgIWlzX2V4dGVybmFsKEVwdHItPmluZm8udHlwKSAmJiBFcHRyLT5pbmZvLnR5cC0+Z2VuZXJhdGVkID09IEZhbHNlIHx8IChFcHRyLT5pbmZvLnR5cC0+dHlwZSA9PSBUcG9pbnRlciB8fCBFcHRyLT5pbmZvLnR5cC0+dHlwZSA9PSBUcmVmZXJlbmNlKSAmJiBFcHRyLT5pbmZvLnR5cC0+cmVmICYmICgoVG5vZGUqKUVwdHItPmluZm8udHlwLT5yZWYpLT50eXBlID09IFRjbGFzcyAmJiAhaXNfZXh0ZXJuYWwoRXB0ci0+aW5mby50eXAtPnJlZikgJiYgKChUbm9kZSopRXB0ci0+aW5mby50eXAtPnJlZiktPmdlbmVyYXRlZCA9PSBGYWxzZSkKKwkgIGZwcmludGYoZmQsICJjbGFzcyAiKTsKKwkqLworCWZwcmludGYoZmQsIiVzIiwgY190eXBlX2lkKEVwdHItPmluZm8udHlwLEVwdHItPnN5bS0+bmFtZSkpOworCWlmIChFcHRyLT5pbmZvLnN0byAmIFNjb25zdG9iaikKKwkgIGZwcmludGYoZmQsICIgY29uc3QiKTsKKwlpZiAoRXB0ci0+aW5mby5zdG8gJiBTYWJzdHJhY3QpCisJICBmcHJpbnRmKGZkLCAiID0gMDsiKTsKKwllbHNlCisJICBmcHJpbnRmKGZkLCAiOyIpOworCWlmIChFcHRyLT5pbmZvLnN0byAmIFNyZXR1cm4pCisJICAgZnByaW50ZihmZCwgIlx0LyogUlBDIHJldHVybiBlbGVtZW50ICovIik7CisJIGlmIChpc19leHRlcm5hbChFcHRyLT5pbmZvLnR5cCkpCisJICAgZnByaW50ZihmZCwgIlx0LyogZXh0ZXJuYWwgKi8iKTsKKwkgaWYgKGlzX3RyYW5zaWVudChFcHRyLT5pbmZvLnR5cCkpCisJICAgZnByaW50ZihmZCwgIlx0LyogdHJhbnNpZW50ICovIik7CisJIGlmIChFcHRyLT5pbmZvLnN0byAmIFNhdHRyaWJ1dGUpCisJICAgaWYgKEVwdHItPmluZm8ubWluT2NjdXJzID49IDEpCisJICAgICBmcHJpbnRmKGZkLCAiXHQvKiByZXF1aXJlZCBhdHRyaWJ1dGUgKi8iKTsKKyAgICAgICAgICAgZWxzZQorCSAgICAgZnByaW50ZihmZCwgIlx0Lyogb3B0aW9uYWwgYXR0cmlidXRlICovIik7CisJIGlmIChFcHRyLT5pbmZvLnN0byAmIChTY29uc3QgfCBTcHJpdmF0ZSB8IFNwcm90ZWN0ZWQpKQorCSAgIGZwcmludGYoZmQsICJcdC8qIG5vdCBzZXJpYWxpemVkICovIik7CisJIGVsc2UgaWYgKEVwdHItPmluZm8uc3RvICYgU211c3RVbmRlcnN0YW5kKQorCSAgIGZwcmludGYoZmQsICJcdC8qIG11c3RVbmRlcnN0YW5kICovIik7CisJIGVsc2UgaWYgKCFpc19keW5hbWljX2FycmF5KHR5cCkgJiYgaXNfcmVwZXRpdGlvbihFcHRyKSkKKyAgICAgICAgIHsgaWYgKCFpc191bnR5cGVkKEVwdHItPm5leHQtPmluZm8udHlwKSAmJiBoYXNfbnMoRXB0ci0+bmV4dC0+aW5mby50eXAtPnJlZikgJiYgKGlzX2V4dGVybmFsKEVwdHItPm5leHQtPmluZm8udHlwLT5yZWYpICYmICgoVG5vZGUqKUVwdHItPm5leHQtPmluZm8udHlwLT5yZWYpLT50eXBlID09IFRjbGFzcyB8fCBoYXNfZXh0ZXJuYWwoRXB0ci0+bmV4dC0+aW5mby50eXAtPnJlZikpKQorICAgICAgICAgICB7IHNwcmludGYoZXJyYnVmLCAiRmllbGQgJyVzJyBtdXN0IGJlIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBwb2ludGVycyB0byAlcyB0byBwcmV2ZW50IGlkLXJlZiBjb3B5aW5nIG9mICVzIGluc3RhbmNlcyBjb250YWluaW5nIGFuIGV4dGVybmFsIG9iamVjdCAoZGVjbGFyZWQgYXQgbGluZSAlZCkiLCBFcHRyLT5uZXh0LT5zeW0tPm5hbWUsIGNfdHlwZShFcHRyLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSwgY190eXBlKEVwdHItPm5leHQtPmluZm8udHlwLT5yZWYpLCBFcHRyLT5uZXh0LT5saW5lbm8pOworCSAgICAgc2Vtd2FybihlcnJidWYpOworCSAgIH0KKyAgICAgICAgICAgZWxzZSBpZiAoIWlzX3VudHlwZWQoRXB0ci0+bmV4dC0+aW5mby50eXApICYmIGhhc19ucyhFcHRyLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSAmJiAoaXNfdm9sYXRpbGUoRXB0ci0+bmV4dC0+aW5mby50eXAtPnJlZikgJiYgKChUbm9kZSopRXB0ci0+bmV4dC0+aW5mby50eXAtPnJlZiktPnR5cGUgPT0gVGNsYXNzIHx8IGhhc192b2xhdGlsZShFcHRyLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSkpCisgICAgICAgICAgIHsgc3ByaW50ZihlcnJidWYsICJGaWVsZCAnJXMnIG11c3QgYmUgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvICVzIHRvIHByZXZlbnQgaWQtcmVmIGNvcHlpbmcgb2YgJXMgaW5zdGFuY2VzIGNvbnRhaW5pbmcgYSB2b2xhdGlsZSBvYmplY3QgKGRlY2xhcmVkIGF0IGxpbmUgJWQpIiwgRXB0ci0+bmV4dC0+c3ltLT5uYW1lLCBjX3R5cGUoRXB0ci0+bmV4dC0+aW5mby50eXAtPnJlZiksIGNfdHlwZShFcHRyLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSwgRXB0ci0+bmV4dC0+bGluZW5vKTsKKwkgICAgIHNlbXdhcm4oZXJyYnVmKTsKKwkgICB9CisJICAgaWYgKEVwdHItPmluZm8ubWF4T2NjdXJzID4gMSkKKwkgICAgIGZwcmludGYoZmQsICJcdC8qIHNlcXVlbmNlIG9mICVsZCB0byAlbGQgZWxlbWVudHMgPCVzPiAqLyIsIEVwdHItPmluZm8ubWluT2NjdXJzLCBFcHRyLT5pbmZvLm1heE9jY3VycywgbnNfY29udmVydChFcHRyLT5uZXh0LT5zeW0tPm5hbWUpKTsKKwkgICBlbHNlCisJICAgICBmcHJpbnRmKGZkLCAiXHQvKiBzZXF1ZW5jZSBvZiBlbGVtZW50cyA8JXM+ICovIiwgbnNfY29udmVydChFcHRyLT5uZXh0LT5zeW0tPm5hbWUpKTsKKwkgfQorCSBlbHNlIGlmIChpc19hbnl0eXBlKEVwdHIpKQorCSAgIGZwcmludGYoZmQsICJcdC8qIGFueSB0eXBlIG9mIGVsZW1lbnQgPCVzPiAoZGVmaW5lZCBiZWxvdykgKi8iLCBuc19jb252ZXJ0KEVwdHItPm5leHQtPnN5bS0+bmFtZSkpOworCSBlbHNlIGlmIChpc19jaG9pY2UoRXB0cikpCisJICAgZnByaW50ZihmZCwgIlx0LyogdW5pb24gZGlzY3JpbWluYW50IChvZiB1bmlvbiBkZWZpbmVkIGJlbG93KSAqLyIpOworCSBlbHNlIGlmIChFcHRyLT5pbmZvLnR5cC0+dHlwZSAhPSBUZnVuICYmICEoRXB0ci0+aW5mby5zdG8gJiAoU2NvbnN0IHwgU3ByaXZhdGUgfCBTcHJvdGVjdGVkKSkgJiYgIShFcHRyLT5pbmZvLnN0byAmIFNhdHRyaWJ1dGUpICYmICFpc190cmFuc2llbnQoRXB0ci0+aW5mby50eXApICYmICFpc19leHRlcm5hbChFcHRyLT5pbmZvLnR5cCkgJiYgc3RybmNtcChFcHRyLT5zeW0tPm5hbWUsICJfXyIsIDIpKQorCSB7IGlmIChFcHRyLT5pbmZvLm1heE9jY3VycyA+IDEpCisJICAgICBmcHJpbnRmKGZkLCAiXHQvKiBzZXF1ZW5jZSBvZiAlbGQgdG8gJWxkIGVsZW1lbnRzICovIiwgRXB0ci0+aW5mby5taW5PY2N1cnMsIEVwdHItPmluZm8ubWF4T2NjdXJzKTsKKwkgICBlbHNlIGlmIChFcHRyLT5pbmZvLm1pbk9jY3VycyA+PSAxKQorCSAgICAgZnByaW50ZihmZCwgIlx0LyogcmVxdWlyZWQgZWxlbWVudCBvZiB0eXBlICVzICovIiwgd3NkbF90eXBlKEVwdHItPmluZm8udHlwLCAiIikpOworICAgICAgICAgICBlbHNlCisJICAgICBmcHJpbnRmKGZkLCAiXHQvKiBvcHRpb25hbCBlbGVtZW50IG9mIHR5cGUgJXMgKi8iLCB3c2RsX3R5cGUoRXB0ci0+aW5mby50eXAsICIiKSk7CisJIH0KKwkgaWYgKCFpc19keW5hbWljX2FycmF5KHR5cCkgJiYgIWlzX3ByaW1jbGFzcyh0eXApKQorCSB7IGlmICghc3RybmNtcChFcHRyLT5zeW0tPm5hbWUsICJfX3NpemUiLCA2KSkKKwkgICB7IGlmICghRXB0ci0+bmV4dCB8fCBFcHRyLT5uZXh0LT5pbmZvLnR5cC0+dHlwZSAhPSBUcG9pbnRlcikKKyAgICAgICAgICAgICB7IHNwcmludGYoZXJyYnVmLCAiRmllbGQgJyVzJyBpcyBub3QgZm9sbG93ZWQgYnkgYSBwb2ludGVyIGZpZWxkIGluIHN0cnVjdCAnJXMnIiwgRXB0ci0+c3ltLT5uYW1lLCB0eXAtPmlkLT5uYW1lKTsKKyAgICAgICAgICAgICAgIHNlbXdhcm4oZXJyYnVmKTsKKwkgICAgIH0KKwkgICB9CisJICAgZWxzZSBpZiAoIXN0cm5jbXAoRXB0ci0+c3ltLT5uYW1lLCAiX190eXBlIiwgNikpCisJICAgeyBpZiAoIUVwdHItPm5leHQgfHwgKChFcHRyLT5uZXh0LT5pbmZvLnR5cC0+dHlwZSAhPSBUcG9pbnRlciB8fCAoKFRub2RlKilFcHRyLT5uZXh0LT5pbmZvLnR5cC0+cmVmKS0+dHlwZSAhPSBUdm9pZCkpKQorICAgICAgICAgICAgIHsgc3ByaW50ZihlcnJidWYsICJGaWVsZCAnJXMnIGlzIG5vdCBmb2xsb3dlZCBieSBhIHZvaWQgcG9pbnRlciBvciB1bmlvbiBmaWVsZCBpbiBzdHJ1Y3QgJyVzJyIsIEVwdHItPnN5bS0+bmFtZSwgdHlwLT5pZC0+bmFtZSk7CisgICAgICAgICAgICAgICBzZW13YXJuKGVycmJ1Zik7CisJICAgICB9CisJICAgfQorCSB9CisgICAgICB9CisgICAgICBpZiAoIWlzX3RyYW5zaWVudCh0eXApICYmICFpc192b2xhdGlsZSh0eXApKQorICAgICAgeyBmcHJpbnRmKGZkLCJcbnB1YmxpYzpcblx0dmlydHVhbCBpbnQgc29hcF90eXBlKCkgY29uc3QgeyByZXR1cm4gJWQ7IH0gLyogPSB1bmlxdWUgaWQgJXMgKi8iLCB0eXAtPm51bSwgc29hcF90eXBlKHR5cCkpOworICAgICAgICBmcHJpbnRmKGZkLCJcblx0dmlydHVhbCB2b2lkIHNvYXBfZGVmYXVsdChzdHJ1Y3Qgc29hcCopOyIpOworICAgICAgICBmcHJpbnRmKGZkLCJcblx0dmlydHVhbCB2b2lkIHNvYXBfc2VyaWFsaXplKHN0cnVjdCBzb2FwKikgY29uc3Q7Iik7CisgICAgICAgIGZwcmludGYoZmQsIlxuXHR2aXJ0dWFsIGludCBzb2FwX3B1dChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKikgY29uc3Q7Iik7CisgICAgICAgIGZwcmludGYoZmQsIlxuXHR2aXJ0dWFsIGludCBzb2FwX291dChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IGNoYXIqKSBjb25zdDsiKTsKKyAgICAgICAgZnByaW50ZihmZCwiXG5cdHZpcnR1YWwgdm9pZCAqc29hcF9nZXQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOyIpOworICAgICAgICBmcHJpbnRmKGZkLCJcblx0dmlydHVhbCB2b2lkICpzb2FwX2luKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsiKTsKKwlpZiAoIWhhc19jb25zdHJ1Y3Rvcih0eXApKQorCXsgVGFibGUgKnQ7CisJICBFbnRyeSAqcDsKKwkgIGludCBjID0gJzonOworCSAgZnByaW50ZihmZCwiXG5cdCAgICAgICAgICVzKCkgIiwgdHlwLT5pZC0+bmFtZSk7CisgICAgICAgICAgdCA9IChUYWJsZSopdHlwLT5yZWY7CisJICBpZiAodCkKKyAgICAgICAgICB7IGZvciAocCA9IHQtPmxpc3Q7IHA7IHAgPSBwLT5uZXh0KQorCSAgICB7IGlmICghKHAtPmluZm8uc3RvICYgU2NvbnN0KSAmJiBwLT5pbmZvLnR5cC0+dHlwZSA9PSBUcG9pbnRlcikKKwkgICAgICB7IGZwcmludGYoZmQsICIlYyAlcyhOVUxMKSIsIGMsIHAtPnN5bS0+bmFtZSk7CisJICAgICAgICBjID0gJywnOworCSAgICAgIH0KKwkgICAgfQorCSAgfQorCSAgZnByaW50ZihmZCwiIHsgfSIpOworCX0KKyAgICBpZiAoIWhhc19kZXN0cnVjdG9yKHR5cCkpIHsKKyAgICAgIFRhYmxlICp0OworCSAgRW50cnkgKnA7CisJICBmcHJpbnRmKGZkLCJcblx0dmlydHVhbCB+JXMoKSB7ICIsIHR5cC0+aWQtPm5hbWUpOworICAgICAgdCA9IChUYWJsZSopdHlwLT5yZWY7CisJICBpZiAodCkKKyAgICAgICAgICB7IGZvciAocCA9IHQtPmxpc3Q7IHA7IHAgPSBwLT5uZXh0KQorCSAgICB7IGlmICghKHAtPmluZm8uc3RvICYgU2NvbnN0KSAmJiBwLT5pbmZvLnR5cC0+dHlwZSA9PSBUcG9pbnRlcikKKwkgICAgICB7IGZwcmludGYoZmQsICJpZiglcykgZGVsZXRlICVzOyIsIHAtPnN5bS0+bmFtZSwgcC0+c3ltLT5uYW1lKTsKKwkgICAgICB9CisJICAgIH0KKwkgIH0KKwkgIGZwcmludGYoZmQsIiB9Iik7CisgICAgfQorCisJLyogdGhlIHVzZSBvZiAnZnJpZW5kJyBjYXVzZXMgcHJvYmxlbXMgbGlua2luZyBzdGF0aWMgZnVuY3Rpb25zLiBBZGRpbmcgdGhlc2UgZnJpZW5kcyBjb3VsZCBlbmFibGUgc2VyaWFsaXppbmcgcHJvdGVjdGVkL3ByaXZhdGUgbWVtYmVycyAod2hpY2ggaXMgbm90IGltcGxlbWVudGVkKQorICAgICAgICBmcHJpbnRmKGZkLCJcblx0ZnJpZW5kICVzICpzb2FwX2luc3RhbnRpYXRlXyVzKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOyIsIHR5cC0+aWQtPm5hbWUsIHR5cC0+aWQtPm5hbWUpOworICAgICAgICBmcHJpbnRmKGZkLCJcblx0ZnJpZW5kICVzICpzb2FwX2luXyVzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosICVzKiwgY29uc3QgY2hhciopOyIsIHR5cC0+aWQtPm5hbWUsIHR5cC0+aWQtPm5hbWUsIHR5cC0+aWQtPm5hbWUpOworICAgICAgICBmcHJpbnRmKGZkLCJcblx0ZnJpZW5kIGludCBzb2FwX291dF8lcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0ICVzKiwgY29uc3QgY2hhciopOyIsIHR5cC0+aWQtPm5hbWUsIHR5cC0+aWQtPm5hbWUpOworICAgICAgICAqLworICAgICAgfQorICAgIGZwcmludGYoZmQsIlxufTsiKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIWlzX3RyYW5zaWVudCh0eXApICYmICFpc19leHRlcm5hbCh0eXApICYmICFpc192b2xhdGlsZSh0eXApKQorICAgIHsgc3ByaW50ZihlcnJidWYsICJjbGFzcyAnJXMnIGlzIGVtcHR5IiwgdHlwLT5pZC0+bmFtZSk7CisgICAgICBzZW13YXJuKGVycmJ1Zik7CisgICAgfQorICB9CisgIGVsc2UgaWYgKHR5cC0+dHlwZSA9PSBUdW5pb24pCisgIHsgaW50IGkgPSAxOworICAgICAgaWYgKHR5cC0+cmVmKQorICAgICAgeyBmcHJpbnRmKGZkLCAidW5pb24gJXNcbnsiLCB0eXAtPmlkLT5uYW1lKTsKKyAgICAgICAgZm9yIChFcHRyID0gKChUYWJsZSopdHlwLT5yZWYpLT5saXN0OyBFcHRyOyBFcHRyID0gRXB0ci0+bmV4dCkKKwl7IGZwcmludGYoZmQsICJcbiNkZWZpbmUgU09BUF9VTklPTl8lc18lc1x0KCVkKSIsIGNfaWRlbnQodHlwKSwgRXB0ci0+c3ltLT5uYW1lLCBpKTsKKwkgIGkrKzsKKwkgIGZwcmludGYoZmQsICJcblx0JXMiLCBjX3N0b3JhZ2UoRXB0ci0+aW5mby5zdG8pKTsKKyAgICAgICAgICBmcHJpbnRmKGZkLCAiJXM7IiwgY190eXBlX2lkKEVwdHItPmluZm8udHlwLEVwdHItPnN5bS0+bmFtZSkpOworCSAgaWYgKEVwdHItPmluZm8uc3RvICYgKFNjb25zdCB8IFNwcml2YXRlIHwgU3Byb3RlY3RlZCkpCisJICAgIGZwcmludGYoZmQsICJcdC8qIGNvbnN0IGZpZWxkIGNhbm5vdCBiZSBkZXNlcmlhbGl6ZWQgKi8iKTsKKwkgIGlmIChpc19leHRlcm5hbChFcHRyLT5pbmZvLnR5cCkpCisJICAgIGZwcmludGYoZmQsICJcdC8qIGV4dGVybmFsICovIik7CisJICBpZiAoaXNfdHJhbnNpZW50KEVwdHItPmluZm8udHlwKSkKKwkgICAgZnByaW50ZihmZCwgIlx0LyogdHJhbnNpZW50ICovIik7CisJICBpZiAoRXB0ci0+aW5mby5zdG8gJiBTYXR0cmlidXRlKQorCSAgeyBmcHJpbnRmKGZkLCAiXHQvKiBhdHRyaWJ1dGUgbm90IGFsbG93ZWQgaW4gdW5pb24gKi8iKTsKKyAgICAgICAgICAgIHNwcmludGYoZXJyYnVmLCAidW5pb24gJyVzJyBjb250YWlucyBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zIiwgdHlwLT5pZC0+bmFtZSk7CisgICAgICAgICAgICBzZW13YXJuKGVycmJ1Zik7CisJICB9CisJICBpZiAoRXB0ci0+aW5mby5zdG8gJiBTbXVzdFVuZGVyc3RhbmQpCisJICAgIGZwcmludGYoZmQsICJcdC8qIG11c3RVbmRlcnN0YW5kICovIik7CisJfQorICAgICAgICBmcHJpbnRmKGZkLCAiXG59OyIpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIWlzX3RyYW5zaWVudCh0eXApICYmICFpc19leHRlcm5hbCh0eXApICYmICFpc192b2xhdGlsZSh0eXApKQorICAgICAgeyBzcHJpbnRmKGVycmJ1ZiwgInVuaW9uICclcycgaXMgZW1wdHkiLCB0eXAtPmlkLT5uYW1lKTsKKyAgICAgICAgc2Vtd2FybihlcnJidWYpOworICAgICAgfQorICB9CisgIGlmIChpc192b2xhdGlsZSh0eXApKQorICAgIGZwcmludGYoZmQsICJcbiNlbmRpZiIpOworICBlbHNlIGlmICh0eXAtPnJlZikKKyAgICBmcHJpbnRmKGZkLCAiXG4jZW5kaWYiKTsKKyAgZmZsdXNoKGZkKTsKK30KKwordm9pZAorZ2VuZXJhdGVfaGVhZGVyKFRhYmxlICp0KQoreyBFbnRyeSAqcCwgKnE7CisgIGJhbm5lcihmaGVhZGVyLCAiRW51bWVyYXRpb25zIik7CisgIGZmbHVzaChmaGVhZGVyKTsKKyAgaWYgKGVudW10YWJsZSkKKyAgICBmb3IgKHAgPSBlbnVtdGFibGUtPmxpc3Q7IHA7IHAgPSBwLT5uZXh0KQorICAgIHsgY2hhciAqeDsKKyAgICAgIHggPSB4c2lfdHlwZShwLT5pbmZvLnR5cCk7CisgICAgICBpZiAoIXggfHwgISp4KQorICAgICAgICB4ID0gd3NkbF90eXBlKHAtPmluZm8udHlwLCAiIik7CisgICAgICBpZiAoaXNfaW1wb3J0ZWQocC0+aW5mby50eXApKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGZwcmludGYoZmhlYWRlciwgIlxuXG4jaWZuZGVmICVzIiwgc29hcF90eXBlKHAtPmluZm8udHlwKSk7CisgICAgICBmcHJpbnRmKGZoZWFkZXIsICJcbiNkZWZpbmUgJXMgKCVkKSIsc29hcF90eXBlKHAtPmluZm8udHlwKSxwLT5pbmZvLnR5cC0+bnVtKTsJCisgICAgICBpZiAoaXNfbWFzayhwLT5pbmZvLnR5cCkpCisgICAgICAgIGZwcmludGYoZmhlYWRlciwgIlxuLyogQml0bWFzayAlcyAqLyIsIHgpOworICAgICAgZWxzZQorICAgICAgICBmcHJpbnRmKGZoZWFkZXIsICJcbi8qICVzICovIiwgeCk7CisgICAgICBmcHJpbnRmKGZoZWFkZXIsICJcbmVudW0gJXMgeyIsIHAtPmluZm8udHlwLT5pZC0+bmFtZSk7CisgICAgICBpZiAoKFRhYmxlKilwLT5pbmZvLnR5cC0+cmVmKQorICAgICAgeyBxID0gKChUYWJsZSopcC0+aW5mby50eXAtPnJlZiktPmxpc3Q7CisgICAgICAgIGlmIChxKQorICAgICAgICB7IGZwcmludGYoZmhlYWRlciwgIiVzID0gIlNPQVBfTE9OR19GT1JNQVQsIHEtPnN5bS0+bmFtZSwgcS0+aW5mby52YWwuaSk7CisgICAgICAgICAgZm9yIChxID0gcS0+bmV4dDsgcTsgcSA9IHEtPm5leHQpCisgICAgICAgICAgICBmcHJpbnRmKGZoZWFkZXIsICIsICVzID0gIlNPQVBfTE9OR19GT1JNQVQsIHEtPnN5bS0+bmFtZSwgcS0+aW5mby52YWwuaSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZwcmludGYoZmhlYWRlciwgIn07XG4jZW5kaWYiKTsKKyAgICB9CisgIGJhbm5lcihmaGVhZGVyLCAiQ2xhc3NlcyBhbmQgU3RydWN0cyIpOworICBmZmx1c2goZmhlYWRlcik7CisgIC8qIE9ic29sZXRlOiBtb3ZlZCB1bmlvbnMgaW4gY2xhc3N0YWJsZQorICBpZiAodW5pb250YWJsZSkKKyAgICBmb3IgKHAgPSB1bmlvbnRhYmxlLT5saXN0OyBwOyBwID0gcC0+bmV4dCkKKyAgICAgIGlmICghaXNfaW1wb3J0ZWQocC0+aW5mby50eXApKQorICAgICAgICBnZW5fdW5pb24oZmhlYWRlciwgcC0+aW5mby50eXApOworICAqLworICBpZiAoY2xhc3N0YWJsZSkKKyAgICBmb3IgKHAgPSBjbGFzc3RhYmxlLT5saXN0OyBwOyBwID0gcC0+bmV4dCkKKyAgICAgIGlmICghaXNfaW1wb3J0ZWQocC0+aW5mby50eXApKQorICAgICAgICBnZW5fY2xhc3MoZmhlYWRlciwgcC0+aW5mby50eXApOworICBiYW5uZXIoZmhlYWRlciwgIlR5cGVzIHdpdGggQ3VzdG9tIFNlcmlhbGl6ZXJzIik7CisgIGZmbHVzaChmaGVhZGVyKTsKKyAgaWYgKHR5cGV0YWJsZSkKKyAgICBmb3IgKHAgPSB0eXBldGFibGUtPmxpc3Q7IHA7IHAgPSBwLT5uZXh0KQorICAgIHsgaWYgKGlzX2V4dGVybmFsKHAtPmluZm8udHlwKSAmJiAhaXNfdm9sYXRpbGUocC0+aW5mby50eXApICYmICFpc19pbXBvcnRlZChwLT5pbmZvLnR5cCkpCisgICAgICB7IGZwcmludGYoZmhlYWRlciwgIlxuI2lmbmRlZiAlcyIsIHNvYXBfdHlwZShwLT5pbmZvLnR5cCkpOworCWZwcmludGYoZmhlYWRlciwgIlxuI2RlZmluZSAlcyAoJWQpIixzb2FwX3R5cGUocC0+aW5mby50eXApLHAtPmluZm8udHlwLT5udW0pOwkKKyAgICAgICAgZnByaW50ZihmaGVhZGVyLCAiXG4lcyVzOyIsIGNfc3RvcmFnZShwLT5pbmZvLnN0byksIGNfdHlwZV9pZChwLT5pbmZvLnR5cCwgcC0+c3ltLT5uYW1lKSk7CisgICAgICAgIGZwcmludGYoZmhlYWRlciwgIlxuI2VuZGlmIik7CisgICAgICB9CisgICAgfQorICBiYW5uZXIoZmhlYWRlciwgIlR5cGVkZWZzIik7CisgIGZmbHVzaChmaGVhZGVyKTsKKyAgaWYgKHR5cGV0YWJsZSkKKyAgICBmb3IgKHAgPSB0eXBldGFibGUtPmxpc3Q7IHA7IHAgPSBwLT5uZXh0KQorICAgIHsgaWYgKCFpc19wcmltaXRpdmVfb3Jfc3RyaW5nKHAtPmluZm8udHlwKSAmJiAhaXNfZXh0ZXJuYWwocC0+aW5mby50eXApICYmICFpc19YTUwocC0+aW5mby50eXApICYmICFpc190cmFuc2llbnQocC0+aW5mby50eXApICYmICFoYXNfbnNfdChwLT5pbmZvLnR5cCkgJiYgIWlzX2ltcG9ydGVkKHAtPmluZm8udHlwKSAmJiAhaXNfdGVtcGxhdGUocC0+aW5mby50eXApKQorICAgICAgeyBzcHJpbnRmKGVycmJ1ZiwgInR5cGVkZWYgJyVzJyBpcyBub3QgbmFtZXNwYWNlIHF1YWxpZmllZDogc2NoZW1hIGRlZmluaXRpb24gZm9yICclcycgaW4gV1NETCBmaWxlIG91dHB1dCBtYXkgYmUgaW52YWxpZCIsIHAtPnN5bS0+bmFtZSwgcC0+c3ltLT5uYW1lKTsKKyAgICAgICAgc2Vtd2FybihlcnJidWYpOworICAgICAgfQorICAgICAgaWYgKCFpc19leHRlcm5hbChwLT5pbmZvLnR5cCkgJiYgIWlzX2ltcG9ydGVkKHAtPmluZm8udHlwKSkKKyAgICAgIHsgZnByaW50ZihmaGVhZGVyLCAiXG4jaWZuZGVmICVzIiwgc29hcF90eXBlKHAtPmluZm8udHlwKSk7CisJZnByaW50ZihmaGVhZGVyLCAiXG4jZGVmaW5lICVzICglZCkiLHNvYXBfdHlwZShwLT5pbmZvLnR5cCkscC0+aW5mby50eXAtPm51bSk7CQorICAgICAgICBmcHJpbnRmKGZoZWFkZXIsIlxuJXMlczsiLCBjX3N0b3JhZ2UocC0+aW5mby5zdG8pLCBjX3R5cGVfaWQocC0+aW5mby50eXAsIHAtPnN5bS0+bmFtZSkpOworICAgICAgICBmcHJpbnRmKGZoZWFkZXIsICJcbiNlbmRpZlxuIik7CisgICAgICB9CisgICAgfQorICBiYW5uZXIoZmhlYWRlciwgIlR5cGVkZWYgU3lub255bXMiKTsKKyAgaWYgKGVudW10YWJsZSkKKyAgICBmb3IgKHAgPSBlbnVtdGFibGUtPmxpc3Q7IHA7IHAgPSBwLT5uZXh0KQorICAgICAgaWYgKHAtPnN5bS0+dG9rZW4gPT0gVFlQRSkKKyAgICAgICAgZnByaW50ZihmaGVhZGVyLCAiXG50eXBlZGVmICVzICVzOyIsIGNfdHlwZShwLT5pbmZvLnR5cCksIHAtPnN5bS0+bmFtZSk7CisgIGlmIChjbGFzc3RhYmxlKQorICAgIGZvciAocCA9IGNsYXNzdGFibGUtPmxpc3Q7IHA7IHAgPSBwLT5uZXh0KQorICAgICAgaWYgKChwLT5pbmZvLnR5cC0+dHlwZSA9PSBUc3RydWN0IHx8IHAtPmluZm8udHlwLT50eXBlID09IFR1bmlvbikgJiYgcC0+c3ltLT50b2tlbiA9PSBUWVBFKQorICAgICAgICBmcHJpbnRmKGZoZWFkZXIsICJcbnR5cGVkZWYgJXMgJXM7IiwgY190eXBlKHAtPmluZm8udHlwKSwgcC0+c3ltLT5uYW1lKTsKKyAgYmFubmVyKGZoZWFkZXIsICJFeHRlcm5hbHMiKTsKKyAgZmZsdXNoKGZoZWFkZXIpOworICBpZiAodCkKKyAgICBmb3IgKHAgPSB0LT5saXN0OyBwOyBwID0gcC0+bmV4dCkKKyAgICAgIGlmIChwLT5pbmZvLnR5cC0+dHlwZSAhPSBUZnVuIHx8IHAtPmluZm8uc3RvICYgU2V4dGVybikKKyAgICAgIHsgZnByaW50ZihmaGVhZGVyLCJcblxuZXh0ZXJuICVzIiwgY19zdG9yYWdlKHAtPmluZm8uc3RvKSk7CisgICAgICAgIGZwcmludGYoZmhlYWRlciwiJXM7IiwgY190eXBlX2lkKHAtPmluZm8udHlwLCBwLT5zeW0tPm5hbWUpKTsKKyAgICAgIH0KKyAgZmZsdXNoKGZoZWFkZXIpOworfQorCit2b2lkCitnZXRfbmFtZXNwYWNlX3ByZWZpeGVzKCkKK3sgU3ltYm9sICpwLCAqcTsKKyAgaW50IGksIG47CisgIGNoYXIgKnMsIGJ1ZlsyNTZdOworICBpZiAobnNsaXN0KQorICAgIHJldHVybjsKKyAgZm9yIChwID0gc3ltbGlzdDsgcDsgcCA9IHAtPm5leHQpCisgIHsgaWYgKCpwLT5uYW1lICE9ICd+JykKKyAgICB7IHMgPSBwLT5uYW1lOworICAgICAgd2hpbGUgKCpzID09ICdfJykKKwlzKys7CisgICAgICBuID0gc3RybGVuKHMpIC0gMjsKKyAgICAgIGZvciAoaSA9IDE7IGkgPCBuOyBpKyspCisgICAgICB7IGlmIChzW2ldID09ICdfJyAmJiBzW2krMV0gPT0gJ18nICYmIHNbaSsyXSAmJiBzW2krMl0gIT0gJ18nKQorICAgICAgICB7IHN0cm5jcHkoYnVmLCBzLCBpKTsKKyAgICAgICAgICBidWZbaV0gPSAnXDAnOworCSAgaWYgKCFzdHJjbXAoYnVmLCAiU09BUF9FTlYiKSB8fCAhc3RyY21wKGJ1ZiwgIlNPQVBfRU5DIikgfHwgIXN0cmNtcChidWYsICJ4c2QiKSB8fCAhc3RyY21wKGJ1ZiwgInhzaSIpIHx8ICFzdHJjbXAoYnVmLCAieG1sIikgfHwgIXN0cm5jbXAoYnVmLCAic29hcF8iLCA1KSkKKwkgICAgZ290byBuc25leHQ7CisgICAgICAgICAgZm9yIChxID0gbnNsaXN0OyBxOyBxID0gcS0+bmV4dCkKKyAgICAgICAgICAgIGlmICghc3RyY21wKHEtPm5hbWUsIGJ1ZikpCisgICAgICAgICAgICAgIGdvdG8gbnNuZXh0OworICAgICAgICAgIHEgPSAoU3ltYm9sKillbWFsbG9jKHNpemVvZihTeW1ib2wpKTsKKyAgICAgICAgICBxLT5uYW1lID0gKGNoYXIqKWVtYWxsb2MoaSsxKTsKKwkgIHN0cmNweShxLT5uYW1lLCBidWYpOworCSAgcS0+bmFtZVtpXSA9ICdcMCc7CisJICBxLT5uZXh0ID0gbnNsaXN0OworCSAgbnNsaXN0ID0gcTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KK25zbmV4dDoKKyAgICA7CisgIH0KKyAgcSA9IChTeW1ib2wqKWVtYWxsb2Moc2l6ZW9mKFN5bWJvbCkpOworICBxLT5uYW1lID0gInhzZCI7CisgIHEtPm5leHQgPSBuc2xpc3Q7CisgIG5zbGlzdCA9IHE7CisgIHEgPSAoU3ltYm9sKillbWFsbG9jKHNpemVvZihTeW1ib2wpKTsKKyAgcS0+bmFtZSA9ICJ4c2kiOworICBxLT5uZXh0ID0gbnNsaXN0OworICBuc2xpc3QgPSBxOworICBxID0gKFN5bWJvbCopZW1hbGxvYyhzaXplb2YoU3ltYm9sKSk7CisgIHEtPm5hbWUgPSAiU09BUC1FTkMiOworICBxLT5uZXh0ID0gbnNsaXN0OworICBuc2xpc3QgPSBxOworICBxID0gKFN5bWJvbCopZW1hbGxvYyhzaXplb2YoU3ltYm9sKSk7CisgIHEtPm5hbWUgPSAiU09BUC1FTlYiOworICBxLT5uZXh0ID0gbnNsaXN0OworICBuc2xpc3QgPSBxOworfQorCit2b2lkCitnZW5lcmF0ZV9zY2hlbWEoVGFibGUgKnQpCit7IEVudHJ5ICpwOworICBTeW1ib2wgKm5zLCAqbnMxOworICBjaGFyICpuYW1lID0gTlVMTDsKKyAgY2hhciAqVVJMID0gTlVMTDsKKyAgY2hhciAqZXhlY3V0YWJsZSA9IE5VTEw7CisgIGNoYXIgKlVSSSA9IE5VTEw7CisgIGNoYXIgKnN0eWxlID0gTlVMTDsKKyAgY2hhciAqZW5jb2RpbmcgPSBOVUxMOworICBjaGFyICppbXBvcnQgPSBOVUxMOworICBTZXJ2aWNlICpzcDsKKyAgY2hhciBidWZbMTAyNF07CisgIEZJTEUgKmZkOworICBnZXRfbmFtZXNwYWNlX3ByZWZpeGVzKCk7CisgIGZvciAobnMgPSBuc2xpc3Q7IG5zOyBucyA9IG5zLT5uZXh0KQorICB7IGlmICghc3RyY21wKG5zLT5uYW1lLCAiU09BUC1FTlYiKSB8fCAhc3RyY21wKG5zLT5uYW1lLCAiU09BUC1FTkMiKSB8fCAhc3RyY21wKG5zLT5uYW1lLCAieHNpIikgfHwgIXN0cmNtcChucy0+bmFtZSwgInhzZCIpKQorICAgICAgY29udGludWU7CisgICAgbmFtZSA9IE5VTEw7CisgICAgVVJMID0gTlVMTDsKKyAgICBleGVjdXRhYmxlID0gTlVMTDsKKyAgICBVUkkgPSBOVUxMOworICAgIHN0eWxlID0gTlVMTDsKKyAgICBlbmNvZGluZyA9IE5VTEw7CisgICAgaW1wb3J0ID0gTlVMTDsKKyAgICBmb3IgKHNwID0gc2VydmljZXM7IHNwOyBzcCA9IHNwLT5uZXh0KQorICAgIHsgaWYgKCFzdHJjbXAoc3AtPm5zLCBucy0+bmFtZSkpCisJewluYW1lID0gbnNfY25hbWUoc3AtPm5hbWUsIE5VTEwpOworCQlVUkwgPSBzcC0+VVJMOworCQlleGVjdXRhYmxlID0gc3AtPmV4ZWN1dGFibGU7CisJCVVSSSA9IHNwLT5VUkk7CisJCXN0eWxlID0gc3AtPnN0eWxlOworCQllbmNvZGluZyA9IHNwLT5lbmNvZGluZzsKKwkJaW1wb3J0ID0gc3AtPmltcG9ydDsKKwkJYnJlYWs7CisgIAl9CisgICAgfQorICAgIGlmICghVVJJKQorICAgICAgVVJJID0gdG1wVVJJOworICAgIGlmIChpc19kb2N1bWVudChzdHlsZSkgJiYgZW5jb2RpbmcgJiYgISplbmNvZGluZykKKyAgICB7CXNlbXdhcm4oIkNhbm5vdCB1c2UgZG9jdW1lbnQgc3R5bGUgd2l0aCBTT0FQIGVuY29kaW5nIik7CisgICAgCWVuY29kaW5nID0gTlVMTDsKKyAgICB9CisgICAgaWYgKCFuYW1lKQorICAJbmFtZSA9ICJTZXJ2aWNlIjsKKyAgICBpZiAoIVVSTCkKKyAgCVVSTCA9ICJodHRwOi8vbG9jYWxob3N0OjgwIjsKKyAgICBpZiAodCkKKyAgICAgIGZvciAocCA9IHQtPmxpc3Q7IHA7IHAgPSBwLT5uZXh0KQorICAgICAgeyBpZiAocC0+aW5mby50eXAtPnR5cGUgPT0gVGZ1biAmJiAhKHAtPmluZm8uc3RvICYgU2V4dGVybikgJiYgaGFzX25zX2VxKG5zLT5uYW1lLCBwLT5zeW0tPm5hbWUpKQorCXsgaWYgKG5hbWUpCisJICAgIGZwcmludGYoZm1zZywgIlVzaW5nICVzIHNlcnZpY2UgbmFtZTogJXNcbiIsIG5zLT5uYW1lLCBuYW1lKTsKKwkgIGlmIChzdHlsZSkKKwkgICAgZnByaW50ZihmbXNnLCAiVXNpbmcgJXMgc2VydmljZSBzdHlsZTogJXNcbiIsIG5zLT5uYW1lLCBzdHlsZSk7CisJICBlbHNlIGlmICghZWZsYWcpCisJICAgIGZwcmludGYoZm1zZywgIlVzaW5nICVzIHNlcnZpY2Ugc3R5bGU6IGRvY3VtZW50XG4iLCBucy0+bmFtZSk7CisJICBpZiAoZW5jb2RpbmcgJiYgKmVuY29kaW5nKQorCSAgICBmcHJpbnRmKGZtc2csICJVc2luZyAlcyBzZXJ2aWNlIGVuY29kaW5nOiAlc1xuIiwgbnMtPm5hbWUsIGVuY29kaW5nKTsKKwkgIGVsc2UgaWYgKGVuY29kaW5nICYmICEqZW5jb2RpbmcpCisJICAgIGZwcmludGYoZm1zZywgIlVzaW5nICVzIHNlcnZpY2UgZW5jb2Rpbmc6IGVuY29kZWRcbiIsIG5zLT5uYW1lKTsKKwkgIGVsc2UgaWYgKCFlZmxhZykKKwkgICAgZnByaW50ZihmbXNnLCAiVXNpbmcgJXMgc2VydmljZSBlbmNvZGluZzogbGl0ZXJhbFxuIiwgbnMtPm5hbWUpOworCSAgaWYgKFVSTCkKKwkgICAgZnByaW50ZihmbXNnLCAiVXNpbmcgJXMgc2VydmljZSBsb2NhdGlvbjogJXNcbiIsIG5zLT5uYW1lLCBVUkwpOworCSAgaWYgKGV4ZWN1dGFibGUpCisJICAgIGZwcmludGYoZm1zZywgIlVzaW5nICVzIHNlcnZpY2UgZXhlY3V0YWJsZTogJXNcbiIsIG5zLT5uYW1lLCBleGVjdXRhYmxlKTsKKwkgIGlmIChpbXBvcnQpCisJICAgIGZwcmludGYoZm1zZywgIlVzaW5nICVzIHNjaGVtYSBpbXBvcnQ6ICVzXG4iLCBucy0+bmFtZSwgaW1wb3J0KTsKKwkgIGVsc2UgaWYgKFVSSSkKKwkgICAgZnByaW50ZihmbXNnLCAiVXNpbmcgJXMgc2NoZW1hIG5hbWVzcGFjZTogJXNcbiIsIG5zLT5uYW1lLCBVUkkpOworICAgICAgICAgIGlmIChzcCAmJiBzcC0+bmFtZSkKKwkgICAgc3ByaW50ZihidWYsICIlcyVzLndzZGwiLCBkaXJwYXRoLCBuc19jbmFtZShuYW1lLCBOVUxMKSk7CisJICBlbHNlCisJICAgIHNwcmludGYoYnVmLCAiJXMlcy53c2RsIiwgZGlycGF0aCwgbnNfY25hbWUobnMtPm5hbWUsIE5VTEwpKTsKKwkgIGlmICghd2ZsYWcpCisJICB7IGZwcmludGYoZm1zZywgIlNhdmluZyAlcyBXZWIgU2VydmljZSBkZXNjcmlwdGlvblxuIiwgYnVmKTsKKyAgICAgICAgICAgIGZkID0gZm9wZW4oYnVmLCAidyIpOworCSAgICBpZiAoIWZkKQorCSAgICAgIGV4ZWNlcnJvcigiQ2Fubm90IHdyaXRlIFdTREwgZmlsZSIpOworICAgICAgICAgICAgZ2VuX3dzZGwoZmQsIHQsIG5zLT5uYW1lLCBuYW1lLCBVUkwsIGV4ZWN1dGFibGUsIFVSSSwgc3R5bGUsIGVuY29kaW5nKTsKKyAgICAgICAgICAgIGZjbG9zZShmZCk7CisJICB9CisJICBpZiAoIWNmbGFnKQorCSAgeyBpZiAoaWZsYWcpCisgICAgICAgICAgICB7IGlmICghU2ZsYWcgJiYgc3AgJiYgc3AtPm5hbWUpCisgICAgICAgICAgICAgIHsgY2hhciAqbmFtZTEgPSBuc19jbmFtZShzcC0+bmFtZSwgIlByb3h5Iik7CisJICAgICAgICBzcHJpbnRmKGJ1ZiwgIiVzJXMlcy5oIiwgZGlycGF0aCwgcHJlZml4LCBuYW1lMSk7CisJICAgICAgICBmcHJpbnRmKGZtc2csICJTYXZpbmcgJXMgY2xpZW50IHByb3h5IGNsYXNzXG4iLCBidWYpOworICAgICAgICAgICAgICAgIGZkID0gZm9wZW4oYnVmLCAidyIpOworCSAgICAgICAgaWYgKCFmZCkKKwkgICAgICAgICAgZXhlY2Vycm9yKCJDYW5ub3Qgd3JpdGUgcHJveHkgY2xhc3MgZmlsZSIpOworCSAgICAgICAgc3ByaW50ZihidWYsICIlcyVzLmgiLCBwcmVmaXgsIG5hbWUxKTsKKwkgICAgICAgIGNvcHlyaWdodG5vdGUoZmQsIGJ1Zik7CisgICAgICAgICAgICAgICAgZ2VuX3Byb3h5X2hlYWRlcihmZCwgdCwgbnMsIG5hbWUxLCBVUkwsIGV4ZWN1dGFibGUsIFVSSSwgZW5jb2RpbmcpOworICAgICAgICAgICAgICAgIGZjbG9zZShmZCk7CisJICAgICAgICBzcHJpbnRmKGJ1ZiwgIiVzJXMlcy5jcHAiLCBkaXJwYXRoLCBwcmVmaXgsIG5hbWUxKTsKKwkgICAgICAgIGZwcmludGYoZm1zZywgIlNhdmluZyAlcyBjbGllbnQgcHJveHkgY2xhc3NcbiIsIGJ1Zik7CisgICAgICAgICAgICAgICAgZmQgPSBmb3BlbihidWYsICJ3Iik7CisJICAgICAgICBpZiAoIWZkKQorCSAgICAgICAgICBleGVjZXJyb3IoIkNhbm5vdCB3cml0ZSBwcm94eSBjbGFzcyBmaWxlIik7CisJICAgICAgICBzcHJpbnRmKGJ1ZiwgIiVzJXMuY3BwIiwgcHJlZml4LCBuYW1lMSk7CisJICAgICAgICBjb3B5cmlnaHRub3RlKGZkLCBidWYpOworICAgICAgICAgICAgICAgIGdlbl9wcm94eV9jb2RlKGZkLCB0LCBucywgbmFtZTEsIFVSTCwgZXhlY3V0YWJsZSwgVVJJLCBlbmNvZGluZyk7CisgICAgICAgICAgICAgICAgZmNsb3NlKGZkKTsKKwkgICAgICB9CisgICAgICAgICAgICAgIGlmICghQ2ZsYWcgJiYgc3AgJiYgc3AtPm5hbWUpCisgICAgICAgICAgICAgIHsgY2hhciAqbmFtZTEgPSBuc19jbmFtZShzcC0+bmFtZSwgIlNlcnZpY2UiKTsKKwkgICAgICAgIHNwcmludGYoYnVmLCAiJXMlcyVzLmgiLCBkaXJwYXRoLCBwcmVmaXgsIG5hbWUxKTsKKwkgICAgICAgIGZwcmludGYoZm1zZywgIlNhdmluZyAlcyBzZXJ2aWNlIGNsYXNzXG4iLCBidWYpOworICAgICAgICAgICAgICAgIGZkID0gZm9wZW4oYnVmLCAidyIpOworCSAgICAgICAgaWYgKCFmZCkKKwkgICAgICAgICAgZXhlY2Vycm9yKCJDYW5ub3Qgd3JpdGUgc2VydmljZSBjbGFzcyBmaWxlIik7CisJICAgICAgICBzcHJpbnRmKGJ1ZiwgIiVzJXMuaCIsIHByZWZpeCwgbmFtZTEpOworCSAgICAgICAgY29weXJpZ2h0bm90ZShmZCwgYnVmKTsKKyAgICAgICAgICAgICAgICBnZW5fb2JqZWN0X2hlYWRlcihmZCwgdCwgbnMsIG5hbWUxLCBVUkwsIGV4ZWN1dGFibGUsIFVSSSwgZW5jb2RpbmcpOworICAgICAgICAgICAgICAgIGZjbG9zZShmZCk7CisJICAgICAgICBzcHJpbnRmKGJ1ZiwgIiVzJXMlcy5jcHAiLCBkaXJwYXRoLCBwcmVmaXgsIG5hbWUxKTsKKwkgICAgICAgIGZwcmludGYoZm1zZywgIlNhdmluZyAlcyBzZXJ2aWNlIGNsYXNzXG4iLCBidWYpOworICAgICAgICAgICAgICAgIGZkID0gZm9wZW4oYnVmLCAidyIpOworCSAgICAgICAgaWYgKCFmZCkKKwkgICAgICAgICAgZXhlY2Vycm9yKCJDYW5ub3Qgd3JpdGUgc2VydmljZSBjbGFzcyBmaWxlIik7CisJICAgICAgICBzcHJpbnRmKGJ1ZiwgIiVzJXMuY3BwIiwgcHJlZml4LCBuYW1lMSk7CisJICAgICAgICBjb3B5cmlnaHRub3RlKGZkLCBidWYpOworICAgICAgICAgICAgICAgIGdlbl9vYmplY3RfY29kZShmZCwgdCwgbnMsIG5hbWUxLCBVUkwsIGV4ZWN1dGFibGUsIFVSSSwgZW5jb2RpbmcpOworICAgICAgICAgICAgICAgIGZjbG9zZShmZCk7CisJICAgICAgfQorCSAgICB9CisJICAgIGVsc2UKKwkgICAgeyBpZiAoIVNmbGFnICYmIHNwICYmIHNwLT5uYW1lKQorCSAgICAgIHsgc3ByaW50ZihidWYsICIlcyVzJXMuaCIsIGRpcnBhdGgsIHByZWZpeCwgbnNfY25hbWUobmFtZSwgIlByb3h5IikpOworCSAgICAgICAgZnByaW50ZihmbXNnLCAiU2F2aW5nICVzIGNsaWVudCBwcm94eVxuIiwgYnVmKTsKKyAgICAgICAgICAgICAgICBmZCA9IGZvcGVuKGJ1ZiwgInciKTsKKwkgICAgICAgIGlmICghZmQpCisJICAgICAgICAgIGV4ZWNlcnJvcigiQ2Fubm90IHdyaXRlIHByb3h5IGZpbGUiKTsKKwkgICAgICAgIHNwcmludGYoYnVmLCAiJXMlcy5oIiwgcHJlZml4LCBuc19jbmFtZShuYW1lLCAiUHJveHkiKSk7CisJICAgICAgICBjb3B5cmlnaHRub3RlKGZkLCBidWYpOworICAgICAgICAgICAgICAgIGdlbl9wcm94eShmZCwgdCwgbnMsIG5hbWUsIFVSTCwgZXhlY3V0YWJsZSwgVVJJLCBlbmNvZGluZyk7CisgICAgICAgICAgICAgICAgZmNsb3NlKGZkKTsKKwkgICAgICB9CisJICAgICAgZWxzZSBpZiAoIVNmbGFnKQorCSAgICAgIHsgc3ByaW50ZihidWYsICIlcyVzLmgiLCBkaXJwYXRoLCBuc19jbmFtZShwcmVmaXgsICJQcm94eSIpKTsKKwkgICAgICAgIGZwcmludGYoZm1zZywgIlNhdmluZyAlcyBjbGllbnQgcHJveHlcbiIsIGJ1Zik7CisgICAgICAgICAgICAgICAgZmQgPSBmb3BlbihidWYsICJ3Iik7CisJICAgICAgICBpZiAoIWZkKQorCSAgICAgICAgICBleGVjZXJyb3IoIkNhbm5vdCB3cml0ZSBwcm94eSBmaWxlIik7CisJICAgICAgICBzcHJpbnRmKGJ1ZiwgIiVzLmgiLCBuc19jbmFtZShwcmVmaXgsICJQcm94eSIpKTsKKwkgICAgICAgIGNvcHlyaWdodG5vdGUoZmQsIGJ1Zik7CisgICAgICAgICAgICAgICAgZ2VuX3Byb3h5KGZkLCB0LCBucywgIlNlcnZpY2UiLCBVUkwsIGV4ZWN1dGFibGUsIFVSSSwgZW5jb2RpbmcpOworICAgICAgICAgICAgICAgIGZjbG9zZShmZCk7CisJICAgICAgfQorICAgICAgICAgICAgICBpZiAoIUNmbGFnICYmIHNwICYmIHNwLT5uYW1lKQorCSAgICAgIHsgc3ByaW50ZihidWYsICIlcyVzJXMuaCIsIGRpcnBhdGgsIHByZWZpeCwgbnNfY25hbWUobmFtZSwgIk9iamVjdCIpKTsKKwkgICAgICAgIGZwcmludGYoZm1zZywgIlNhdmluZyAlcyBzZXJ2ZXIgb2JqZWN0XG4iLCBidWYpOworICAgICAgICAgICAgICAgIGZkID0gZm9wZW4oYnVmLCAidyIpOworCSAgICAgICAgaWYgKCFmZCkKKwkgICAgICAgICAgZXhlY2Vycm9yKCJDYW5ub3Qgd3JpdGUgc2VydmVyIG9iamVjdCBmaWxlIik7CisJICAgICAgICBzcHJpbnRmKGJ1ZiwgIiVzJXMuaCIsIHByZWZpeCwgbnNfY25hbWUobmFtZSwgIk9iamVjdCIpKTsKKwkgICAgICAgIGNvcHlyaWdodG5vdGUoZmQsIGJ1Zik7CisgICAgICAgICAgICAgICAgZ2VuX29iamVjdChmZCwgdCwgbnMsIG5hbWUsIFVSTCwgZXhlY3V0YWJsZSwgVVJJLCBlbmNvZGluZyk7CisgICAgICAgICAgICAgICAgZmNsb3NlKGZkKTsKKwkgICAgICB9CisJICAgICAgZWxzZSBpZiAoIUNmbGFnKQorCSAgICAgIHsgc3ByaW50ZihidWYsICIlcyVzLmgiLCBkaXJwYXRoLCBuc19jbmFtZShwcmVmaXgsICJPYmplY3QiKSk7CisJICAgICAgICBmcHJpbnRmKGZtc2csICJTYXZpbmcgJXMgc2VydmVyIG9iamVjdFxuIiwgYnVmKTsKKyAgICAgICAgICAgICAgICBmZCA9IGZvcGVuKGJ1ZiwgInciKTsKKwkgICAgICAgIGlmICghZmQpCisJICAgICAgICAgIGV4ZWNlcnJvcigiQ2Fubm90IHdyaXRlIHNlcnZlciBvYmplY3QgZmlsZSIpOworCSAgICAgICAgc3ByaW50ZihidWYsICIlcy5oIiwgbnNfY25hbWUocHJlZml4LCAiT2JqZWN0IikpOworCSAgICAgICAgY29weXJpZ2h0bm90ZShmZCwgYnVmKTsKKyAgICAgICAgICAgICAgICBnZW5fb2JqZWN0KGZkLCB0LCBucywgIlNlcnZpY2UiLCBVUkwsIGV4ZWN1dGFibGUsIFVSSSwgZW5jb2RpbmcpOworICAgICAgICAgICAgICAgIGZjbG9zZShmZCk7CisJICAgICAgfQorCSAgICB9CisJICB9CisJICBpZiAoIXhmbGFnKQorCSAgeyBzdHJjcHkoYnVmLCBkaXJwYXRoKTsKKyAgICAgICAgICAgIGlmIChzcCAmJiBzcC0+bmFtZSkKKwkgICAgICBzdHJjYXQoYnVmLCBuc19jbmFtZShuYW1lLCBOVUxMKSk7CisJICAgIGVsc2UKKwkgICAgICBzdHJjYXQoYnVmLCBuc19jbmFtZShucy0+bmFtZSwgTlVMTCkpOworCSAgICBzdHJjYXQoYnVmLCAiLiIpOworICAgICAgICAgICAgZ2VuX2RhdGEoYnVmLCB0LCBucy0+bmFtZSwgbmFtZSwgVVJMLCBleGVjdXRhYmxlLCBVUkksIGVuY29kaW5nKTsKKwkgIH0KKwkgIGlmIChuZmxhZykKKwkgICAgc3ByaW50ZihidWYsICIlcyVzLm5zbWFwIiwgZGlycGF0aCwgcHJlZml4LCBuc19jbmFtZShucy0+bmFtZSwgTlVMTCkpOworICAgICAgICAgIGVsc2UgaWYgKHNwICYmIHNwLT5uYW1lKQorCSAgICBzcHJpbnRmKGJ1ZiwgIiVzJXMubnNtYXAiLCBkaXJwYXRoLCBuc19jbmFtZShuYW1lLCBOVUxMKSk7CisgICAgICAgICAgZWxzZQorCSAgICBzcHJpbnRmKGJ1ZiwgIiVzJXMubnNtYXAiLCBkaXJwYXRoLCBuc19jbmFtZShucy0+bmFtZSwgTlVMTCkpOworCSAgZnByaW50ZihmbXNnLCAiU2F2aW5nICVzIG5hbWVzcGFjZSBtYXBwaW5nIHRhYmxlXG4iLCBidWYpOworICAgICAgICAgIGZkID0gZm9wZW4oYnVmLCAidyIpOworCSAgaWYgKCFmZCkKKwkgICAgZXhlY2Vycm9yKCJDYW5ub3Qgd3JpdGUgbnNtYXAgZmlsZSIpOworCSAgZnByaW50ZihmZCwgIlxuI2luY2x1ZGUgXCIlc0guaFwiIiwgcHJlZml4KTsKKyAJICBpZiAobmZsYWcpCisJICAgIGZwcmludGYoZmQsICJcblNPQVBfTk1BQyBzdHJ1Y3QgTmFtZXNwYWNlICVzX25hbWVzcGFjZXNbXSA9XG4iLCBwcmVmaXgpOworIAkgIGVsc2UKKyAJICAgIGZwcmludGYoZmQsICJcblNPQVBfTk1BQyBzdHJ1Y3QgTmFtZXNwYWNlIG5hbWVzcGFjZXNbXSA9XG4iKTsgCisJICBnZW5fbnNtYXAoZmQsIG5zLCBVUkkpOworICAgICAgICAgIGZjbG9zZShmZCk7CisJICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIGlmICghd2ZsYWcgJiYgIWltcG9ydCkKKyAgICB7IHNwcmludGYoYnVmLCAiJXMlcy54c2QiLCBkaXJwYXRoLCBuc19jb252ZXJ0KG5zLT5uYW1lKSk7CisgICAgICBmcHJpbnRmKGZtc2csICJTYXZpbmcgJXMgWE1MIHNjaGVtYVxuIiwgYnVmKTsKKyAgICAgIGZkID0gZm9wZW4oYnVmLCAidyIpOworICAgICAgaWYgKCFmZCkKKyAgICAgICAgZXhlY2Vycm9yKCJDYW5ub3Qgd3JpdGUgc2NoZW1hIGZpbGUiKTsKKyAgICAgIGZwcmludGYoZmQsICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiIpOworICAgICAgaWYgKHQpCisgICAgICAgIGZvciAocCA9IHQtPmxpc3Q7IHA7IHAgPSBwLT5uZXh0KQorICAgICAgICAgIGlmIChwLT5pbmZvLnR5cC0+dHlwZSA9PSBUZnVuICYmICEocC0+aW5mby5zdG8gJiBTZXh0ZXJuKSAmJiBoYXNfbnNfZXEobnMtPm5hbWUsIHAtPnN5bS0+bmFtZSkpCisgICAgICAgICAgeyBnZW5fc2NoZW1hKGZkLCB0LCBucy0+bmFtZSwgbnMtPm5hbWUsIDAsIDEsIFVSTCwgVVJJLCBzdHlsZSwgZW5jb2RpbmcpOworCSAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICBpZiAoIXQgfHwgIXApCisgICAgICAgIGdlbl9zY2hlbWEoZmQsIHQsIG5zLT5uYW1lLCBucy0+bmFtZSwgMCwgMCwgVVJMLCBVUkksIHN0eWxlLCBlbmNvZGluZyk7CisgICAgICBmY2xvc2UoZmQpOworICAgIH0KKyAgfQorfQorCitpbnQKK2Noa2hkcihjaGFyICpwYXJ0KQoreyBFbnRyeSAqcDsKKyAgcCA9IGVudHJ5KGNsYXNzdGFibGUsIGxvb2t1cCgiU09BUF9FTlZfX0hlYWRlciIpKTsKKyAgZm9yIChwID0gKChUYWJsZSopcC0+aW5mby50eXAtPnJlZiktPmxpc3Q7IHA7IHAgPSBwLT5uZXh0KQorICAgIGlmIChoYXNfbnNfZXEoTlVMTCwgcC0+c3ltLT5uYW1lKSAmJiAoIXN0cmNtcChwYXJ0LCBwLT5zeW0tPm5hbWUpIHx8IGlzX2VxX25vbnMocGFydCwgcC0+c3ltLT5uYW1lKSkpCisgICAgICByZXR1cm4gMTsKKyAgc3ByaW50ZihlcnJidWYsICJDYW5ub3QgZGVmaW5lIG1ldGhvZC1oZWFkZXItcGFydCBpbiBXU0RMOiBTT0FQX0VOVl9fSGVhZGVyIFwiJXNcIiBmaWVsZCBpcyBub3QgcXVhbGlmaWVkIiwgcGFydCk7CisgIHNlbXdhcm4oZXJyYnVmKTsKKyAgcmV0dXJuIDA7Cit9ICAgICAgCisKK3ZvaWQKK2dlbl93c2RsKEZJTEUgKmZkLCBUYWJsZSAqdCwgY2hhciAqbnMsIGNoYXIgKm5hbWUsIGNoYXIgKlVSTCwgY2hhciAqZXhlY3V0YWJsZSwgY2hhciAqVVJJLCBjaGFyICpzdHlsZSwgY2hhciAqZW5jb2RpbmcpCit7IEVudHJ5ICpwLCAqcSwgKnI7CisgIFN5bWJvbCAqczsKKyAgU2VydmljZSAqc3AsICpzcDI7CisgIE1ldGhvZCAqbTsKKyAgaW50IG1pbWVpbiwgbWltZW91dDsKKyAgY2hhciAqYWN0aW9uLCAqY29tbWVudCwgKm1ldGhvZF9zdHlsZSA9IE5VTEwsICptZXRob2RfZW5jb2RpbmcgPSBOVUxMLCAqbWV0aG9kX3Jlc3BvbnNlX2VuY29kaW5nID0gTlVMTDsKKyAgY2hhciAqYmluZGluZzsKKyAgZnByaW50ZihmZCwgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIik7CisgIGZvciAoc3AgPSBzZXJ2aWNlczsgc3A7IHNwID0gc3AtPm5leHQpCisgICAgaWYgKCFzdHJjbXAoc3AtPm5zLCBucykpCisgICAgICBicmVhazsKKyAgaWYgKHNwICYmIHNwLT5kZWZpbml0aW9ucykKKyAgICBmcHJpbnRmKGZkLCAiPGRlZmluaXRpb25zIG5hbWU9XCIlc1wiXG4iLCBzcC0+ZGVmaW5pdGlvbnMpOworICBlbHNlCisgICAgZnByaW50ZihmZCwgIjxkZWZpbml0aW9ucyBuYW1lPVwiJXNcIlxuIiwgbmFtZSk7CisgIGlmIChzcCAmJiBzcC0+V1NETCkKKyAgICBmcHJpbnRmKGZkLCAiIHRhcmdldE5hbWVzcGFjZT1cIiVzXCJcbiB4bWxuczp0bnM9XCIlc1wiIiwgc3AtPldTREwsIHNwLT5XU0RMKTsKKyAgZWxzZQorICAgIGZwcmludGYoZmQsICIgdGFyZ2V0TmFtZXNwYWNlPVwiJXMvJXMud3NkbFwiXG4geG1sbnM6dG5zPVwiJXMvJXMud3NkbFwiIiwgVVJMLCBuYW1lLCBVUkwsIG5hbWUpOworICBpZiAoc3AgJiYgc3AtPmJpbmRpbmcpCisgICAgYmluZGluZyA9IG5zX2NuYW1lKHNwLT5iaW5kaW5nLCBOVUxMKTsKKyAgZWxzZQorICAgIGJpbmRpbmcgPSBuYW1lOworICBmb3IgKHMgPSBuc2xpc3Q7IHM7IHMgPSBzLT5uZXh0KQorICB7IGZvciAoc3AyID0gc2VydmljZXM7IHNwMjsgc3AyID0gc3AyLT5uZXh0KQorICAgICAgaWYgKCFzdHJjbXAoc3AyLT5ucywgcy0+bmFtZSkgJiYgc3AyLT5VUkkpCisgICAgICAgIGJyZWFrOworICAgIGlmIChzcDIpCisgICAgICBmcHJpbnRmKGZkLCAiXG4geG1sbnM6JXM9XCIlc1wiIiwgbnNfY29udmVydChzLT5uYW1lKSwgc3AyLT5VUkkpOworICAgIGVsc2UgaWYgKCFzdHJjbXAocy0+bmFtZSwgIlNPQVAtRU5WIikpCisgICAgICBmcHJpbnRmKGZkLCAiXG4geG1sbnM6U09BUC1FTlY9XCIlc1wiIiwgZW52VVJJKTsKKyAgICBlbHNlIGlmICghc3RyY21wKHMtPm5hbWUsICJTT0FQLUVOQyIpKQorICAgICAgZnByaW50ZihmZCwgIlxuIHhtbG5zOlNPQVAtRU5DPVwiJXNcIiIsIGVuY1VSSSk7CisgICAgZWxzZSBpZiAoIXN0cmNtcChzLT5uYW1lLCAieHNpIikpCisgICAgICBmcHJpbnRmKGZkLCAiXG4geG1sbnM6eHNpPVwiJXNcIiIsIHhzaVVSSSk7CisgICAgZWxzZSBpZiAoIXN0cmNtcChzLT5uYW1lLCAieHNkIikpCisgICAgICBmcHJpbnRmKGZkLCAiXG4geG1sbnM6eHNkPVwiJXNcIiIsIHhzZFVSSSk7CisgICAgZWxzZQorICAgICAgZnByaW50ZihmZCwgIlxuIHhtbG5zOiVzPVwiJXMvJXMueHNkXCIiLCBuc19jb252ZXJ0KHMtPm5hbWUpLCB0bXBVUkksIG5zX2NvbnZlcnQocy0+bmFtZSkpOworICB9CisgIGlmIChpc19zb2FwMTIoKSkKKyAgICBmcHJpbnRmKGZkLCAiXG4geG1sbnM6U09BUD1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcDEyL1wiIik7CisgIGVsc2UKKyAgICBmcHJpbnRmKGZkLCAiXG4geG1sbnM6U09BUD1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC9cIiIpOworICBmcHJpbnRmKGZkLCAiXG4geG1sbnM6TUlNRT1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS9cIiIpOworICBmcHJpbnRmKGZkLCAiXG4geG1sbnM6RElNRT1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDIvMDQvZGltZS93c2RsL1wiIik7CisgIGZwcmludGYoZmQsICJcbiB4bWxuczpXU0RMPVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9cIiIpOworICBmcHJpbnRmKGZkLCAiXG4geG1sbnM9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL1wiPlxuXG4iKTsKKyAgZnByaW50ZihmZCwgIjx0eXBlcz5cblxuIik7CisgIGZvciAocyA9IG5zbGlzdDsgczsgcyA9IHMtPm5leHQpCisgICAgZ2VuX3NjaGVtYShmZCwgdCwgbnMsIHMtPm5hbWUsICFzdHJjbXAocy0+bmFtZSwgbnMpLCAxLCBVUkwsIFVSSSwgc3R5bGUsIGVuY29kaW5nKTsKKyAgZnByaW50ZihmZCwgIjwvdHlwZXM+XG5cbiIpOworICBmZmx1c2goZmQpOworICBpZiAodCkKKyAgeyBmb3IgKHAgPSB0LT5saXN0OyBwOyBwID0gcC0+bmV4dCkKKyAgICB7IGlmIChwLT5pbmZvLnR5cC0+dHlwZSA9PSBUZnVuICYmICEocC0+aW5mby5zdG8gJiBTZXh0ZXJuKSAmJiBoYXNfbnNfZXEobnMsIHAtPnN5bS0+bmFtZSkpCisgICAgICB7IG1pbWVpbiA9IDA7CisgICAgICAgIG1pbWVvdXQgPSAwOworCWNvbW1lbnQgPSBOVUxMOworICAgICAgICBtZXRob2Rfc3R5bGUgPSBzdHlsZTsKKwltZXRob2RfZW5jb2RpbmcgPSBlbmNvZGluZzsKKwltZXRob2RfcmVzcG9uc2VfZW5jb2RpbmcgPSBOVUxMOworCWlmIChzcCkKKwl7ICAgZm9yIChtID0gc3AtPmxpc3Q7IG07IG0gPSBtLT5uZXh0KQorCSAgICB7IGlmIChpc19lcV9ub25zKG0tPm5hbWUsIHAtPnN5bS0+bmFtZSkpCisJICAgICAgeyBpZiAobS0+bWVzcyZNSU1FSU4pCisJCSAgbWltZWluID0gMTsKKwkgICAgICAgIGlmIChtLT5tZXNzJk1JTUVPVVQpCisJCSAgbWltZW91dCA9IDE7CisgICAgICAgICAgICAgICAgaWYgKG0tPm1lc3MgPT0gRU5DT0RJTkcpCisJICAgICAgICAgIG1ldGhvZF9lbmNvZGluZyA9IG0tPnBhcnQ7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobS0+bWVzcyA9PSBSRVNQT05TRV9FTkNPRElORykKKwkgICAgICAgICAgbWV0aG9kX3Jlc3BvbnNlX2VuY29kaW5nID0gbS0+cGFydDsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChtLT5tZXNzID09IFNUWUxFKQorCSAgICAgICAgICBtZXRob2Rfc3R5bGUgPSBtLT5wYXJ0OworCSAgICAgICAgZWxzZSBpZiAobS0+bWVzcyA9PSBDT01NRU5UKQorCSAgICAgICAgICBjb21tZW50ID0gbS0+cGFydDsKKwkgICAgICB9CisJICAgIH0KKwl9CisgICAgICAgIGlmICghbWV0aG9kX3Jlc3BvbnNlX2VuY29kaW5nKQorICAgICAgICAgIG1ldGhvZF9yZXNwb25zZV9lbmNvZGluZyA9IG1ldGhvZF9lbmNvZGluZzsKKwlpZiAoZ2V0X3Jlc3BvbnNlKHAtPmluZm8udHlwKSkKKyAgICAgICAgICBmcHJpbnRmKGZkLCAiPG1lc3NhZ2UgbmFtZT1cIiVzUmVxdWVzdFwiPlxuIiwgbnNfcmVtb3ZlKHAtPnN5bS0+bmFtZSkpOworCWVsc2UKKyAgICAgICAgICBmcHJpbnRmKGZkLCAiPG1lc3NhZ2UgbmFtZT1cIiVzXCI+XG4iLCBuc19yZW1vdmUocC0+c3ltLT5uYW1lKSk7CisgICAgICAgIGZmbHVzaChmZCk7CisJaWYgKGlzX2RvY3VtZW50KG1ldGhvZF9zdHlsZSkpCisJeyBpZiAoaXNfaW52aXNpYmxlKHAtPnN5bS0+bmFtZSkpCisJICB7IHEgPSBlbnRyeShjbGFzc3RhYmxlLCBwLT5zeW0pOworCSAgICBpZiAocSkKKwkgICAgeyBxID0gKChUYWJsZSopcS0+aW5mby50eXAtPnJlZiktPmxpc3Q7CisJICAgICAgaWYgKHEpCisJICAgICAgeyBpZiAoaXNfaW52aXNpYmxlKHEtPnN5bS0+bmFtZSkpCisJICAgICAgICB7IHIgPSBlbnRyeShjbGFzc3RhYmxlLCBxLT5zeW0pOworCQkgIGlmIChyKQorCQkgIHsgciA9ICgoVGFibGUqKXItPmluZm8udHlwLT5yZWYpLT5saXN0OworCQkgICAgaWYgKHIpCisJCSAgICAgIGZwcmludGYoZmQsICIgPHBhcnQgbmFtZT1cInBhcmFtZXRlcnNcIiBlbGVtZW50PVwiJXNcIi8+XG4iLCBuc19hZGQoci0+c3ltLT5uYW1lLCBucykpOworCQkgIH0KKwkJfQorICAgICAgICAgICAgICAgIGVsc2UKKwkgICAgICAgICAgZnByaW50ZihmZCwgIiA8cGFydCBuYW1lPVwicGFyYW1ldGVyc1wiIGVsZW1lbnQ9XCIlc1wiLz5cbiIsIG5zX2FkZChxLT5zeW0tPm5hbWUsIG5zKSk7CisJICAgICAgfQorCSAgICB9CisJICB9CisJICBlbHNlCisJICAgIGZwcmludGYoZmQsICIgPHBhcnQgbmFtZT1cInBhcmFtZXRlcnNcIiBlbGVtZW50PVwiJXNcIi8+XG4iLCBuc19hZGQocC0+c3ltLT5uYW1lLCBucykpOworCX0KKwllbHNlCisgIAl7IHEgPSBlbnRyeShjbGFzc3RhYmxlLCBwLT5zeW0pOworICAJICBpZiAocSkKKwkgICAgZm9yIChxID0gKChUYWJsZSopcS0+aW5mby50eXAtPnJlZiktPmxpc3Q7IHE7IHEgPSBxLT5uZXh0KQorCSAgICB7IGlmICghaXNfdHJhbnNpZW50KHEtPmluZm8udHlwKSAmJiAhKHEtPmluZm8uc3RvICYgU2F0dHJpYnV0ZSkgJiYgcS0+aW5mby50eXAtPnR5cGUgIT0gVGZ1biAmJiAhaXNfcmVwZXRpdGlvbihxKSAmJiAhaXNfYW55dHlwZShxKSkKKyAgCSAgICAgIHsgaWYgKGlzX2xpdGVyYWwobWV0aG9kX2VuY29kaW5nKSkKKwkgICAgICAgICAgZnByaW50ZihmZCwgIiA8cGFydCBuYW1lPVwiJXNcIiBlbGVtZW50PVwiJXNcIi8+XG4iLCBuc19yZW1vdmUocS0+c3ltLT5uYW1lKSwgbnNfYWRkKHEtPnN5bS0+bmFtZSwgbnMpKTsKKwkgICAgICAgIGVsc2UgaWYgKGlzX1hNTChxLT5pbmZvLnR5cCkpCisJICAgICAgICAgIGZwcmludGYoZmQsICIgPHBhcnQgbmFtZT1cInBhcmFtZXRlcnNcIiB0eXBlPVwieHNkOmFueVR5cGVcIi8+XG4iKTsKKwkgICAgICAgIGVsc2UKKwkgICAgICAgICAgZnByaW50ZihmZCwgIiA8cGFydCBuYW1lPVwiJXNcIiB0eXBlPVwiJXNcIi8+XG4iLCBuc19yZW1vdmUocS0+c3ltLT5uYW1lKSwgd3NkbF90eXBlKHEtPmluZm8udHlwLCBucykpOworCSAgICAgIH0KKwkgICAgfQorCX0KKwlpZiAobWltZWluKQorICAgICAgICAgIGZwcmludGYoZmQsICIgPHBhcnQgbmFtZT1cImF0dGFjaG1lbnRzXCIgdHlwZT1cInhzZDpiYXNlNjRCaW5hcnlcIi8+XG4iKTsKKyAgICAgICAgZnByaW50ZihmZCwgIjwvbWVzc2FnZT5cblxuIik7CisgICAgICAgIGZmbHVzaChmZCk7CisJcSA9IChFbnRyeSopcC0+aW5mby50eXAtPnJlZjsKKwlpZiAocSAmJiBpc190cmFuc2llbnQocS0+aW5mby50eXApKQorCSAgOworCWVsc2UgaWYgKHEgJiYgIWlzX3Jlc3BvbnNlKHEtPmluZm8udHlwKSkKKyAgICAgICAgeyBmcHJpbnRmKGZkLCAiPG1lc3NhZ2UgbmFtZT1cIiVzUmVzcG9uc2VcIj5cbiIsIG5zX3JlbW92ZShwLT5zeW0tPm5hbWUpKTsKKwkgIGlmIChpc19kb2N1bWVudChtZXRob2Rfc3R5bGUpKQorCSAgICBmcHJpbnRmKGZkLCAiIDxwYXJ0IG5hbWU9XCJwYXJhbWV0ZXJzXCIgZWxlbWVudD1cIiVzUmVzcG9uc2VcIi8+XG4iLCBuc19hZGQocC0+c3ltLT5uYW1lLCBucykpOworICAJICBlbHNlIGlmIChpc19saXRlcmFsKG1ldGhvZF9yZXNwb25zZV9lbmNvZGluZykpCisJICAgIGZwcmludGYoZmQsICIgPHBhcnQgbmFtZT1cIiVzXCIgZWxlbWVudD1cIiVzXCIvPlxuIiwgbnNfcmVtb3ZlKHEtPnN5bS0+bmFtZSksIG5zX2FkZChxLT5zeW0tPm5hbWUsIG5zKSk7CisJICBlbHNlIGlmIChpc19YTUwocS0+aW5mby50eXAtPnJlZikpCisJICAgIGZwcmludGYoZmQsICIgPHBhcnQgbmFtZT1cInBhcmFtZXRlcnNcIiB0eXBlPVwieHNkOmFueVR5cGVcIi8+XG4iKTsKKwkgIGVsc2UKKwkgICAgZnByaW50ZihmZCwgIiA8cGFydCBuYW1lPVwiJXNcIiB0eXBlPVwiJXNcIi8+XG4iLCBuc19yZW1vdmUocS0+c3ltLT5uYW1lKSwgd3NkbF90eXBlKHEtPmluZm8udHlwLCBucykpOworCSAgaWYgKG1pbWVvdXQpCisgICAgICAgICAgICBmcHJpbnRmKGZkLCAiIDxwYXJ0IG5hbWU9XCJhdHRhY2htZW50c1wiIHR5cGU9XCJ4c2Q6YmFzZTY0QmluYXJ5XCIvPlxuIik7CisgICAgICAgICAgZnByaW50ZihmZCwgIjwvbWVzc2FnZT5cblxuIik7CisJfQorICAgICAgICBlbHNlIGlmIChxICYmIHEtPmluZm8udHlwLT53c2RsID09IEZhbHNlKQorCXsgcS0+aW5mby50eXAtPndzZGwgPSBUcnVlOworCSAgZnByaW50ZihmZCwgIjxtZXNzYWdlIG5hbWU9XCIlc1wiPlxuIiwgbnNfcmVtb3ZlKCgoVG5vZGUqKXEtPmluZm8udHlwLT5yZWYpLT5pZC0+bmFtZSkpOworCSAgaWYgKGlzX2RvY3VtZW50KG1ldGhvZF9zdHlsZSkpCisJICB7IGlmIChoYXNfbnNfZXEoTlVMTCwgKChFbnRyeSopcC0+aW5mby50eXAtPnJlZiktPnN5bS0+bmFtZSkpCisJICAgICAgZnByaW50ZihmZCwgIiA8cGFydCBuYW1lPVwicGFyYW1ldGVyc1wiIGVsZW1lbnQ9XCIlc1wiLz5cbiIsIG5zX2NvbnZlcnQoKChFbnRyeSopcC0+aW5mby50eXAtPnJlZiktPnN5bS0+bmFtZSkpOworICAgICAgICAgICAgZWxzZSBpZiAoaXNfaW52aXNpYmxlKCgoVG5vZGUqKXEtPmluZm8udHlwLT5yZWYpLT5pZC0+bmFtZSkpCisJICAgIHsgciA9ICgoVGFibGUqKSgoVG5vZGUqKXEtPmluZm8udHlwLT5yZWYpLT5yZWYpLT5saXN0OworCSAgICAgIGlmIChyKQorCSAgICAgICAgZnByaW50ZihmZCwgIiA8cGFydCBuYW1lPVwicGFyYW1ldGVyc1wiIGVsZW1lbnQ9XCIlc1wiLz5cbiIsIG5zX2FkZChyLT5zeW0tPm5hbWUsIG5zKSk7CisJICAgIH0KKyAgICAgICAgICAgIGVsc2UKKwkgICAgICBmcHJpbnRmKGZkLCAiIDxwYXJ0IG5hbWU9XCJwYXJhbWV0ZXJzXCIgZWxlbWVudD1cIiVzXCIvPlxuIiwgbnNfY29udmVydCgoKFRub2RlKilxLT5pbmZvLnR5cC0+cmVmKS0+aWQtPm5hbWUpKTsKKwkgIH0KKwkgIGVsc2UKKwkgIHsgaWYgKCgoVG5vZGUqKXEtPmluZm8udHlwLT5yZWYpLT5yZWYpCisJICAgIHsgZm9yIChxID0gKChUYWJsZSopKChUbm9kZSopcS0+aW5mby50eXAtPnJlZiktPnJlZiktPmxpc3Q7IHE7IHEgPSBxLT5uZXh0KQorCSAgICAgIHsgaWYgKCFpc190cmFuc2llbnQocS0+aW5mby50eXApICYmICEocS0+aW5mby5zdG8gJiBTYXR0cmlidXRlKSAmJiBxLT5pbmZvLnR5cC0+dHlwZSAhPSBUZnVuICYmICFpc19yZXBldGl0aW9uKHEpICYmICFpc19hbnl0eXBlKHEpKQorICAJICAgICAgICAgIGlmIChpc19saXRlcmFsKG1ldGhvZF9yZXNwb25zZV9lbmNvZGluZykpCisJICAgICAgICAgICAgZnByaW50ZihmZCwgIiA8cGFydCBuYW1lPVwiJXNcIiBlbGVtZW50PVwiJXNcIi8+XG4iLCBuc19yZW1vdmUocS0+c3ltLT5uYW1lKSwgbnNfYWRkKHEtPnN5bS0+bmFtZSwgbnMpKTsKKwkgICAgICAgICAgZWxzZSBpZiAoaXNfWE1MKHEtPmluZm8udHlwKSkKKwkgICAgICAgICAgICBmcHJpbnRmKGZkLCAiIDxwYXJ0IG5hbWU9XCJwYXJhbWV0ZXJzXCIgdHlwZT1cInhzZDphbnlUeXBlXCIvPlxuIik7CisJICAgICAgICAgIGVsc2UKKwkgICAgICAgICAgICBmcHJpbnRmKGZkLCAiIDxwYXJ0IG5hbWU9XCIlc1wiIHR5cGU9XCIlc1wiLz5cbiIsIG5zX3JlbW92ZShxLT5zeW0tPm5hbWUpLCB3c2RsX3R5cGUocS0+aW5mby50eXAsIG5zKSk7CisJICAgICAgfQorCSAgICB9CisJICB9CisJICBpZiAobWltZW91dCkKKyAgICAgICAgICAgIGZwcmludGYoZmQsICIgPHBhcnQgbmFtZT1cImF0dGFjaG1lbnRzXCIgdHlwZT1cInhzZDpiYXNlNjRCaW5hcnlcIi8+XG4iKTsKKyAgICAgICAgICBmcHJpbnRmKGZkLCAiPC9tZXNzYWdlPlxuXG4iKTsKKwl9CisgICAgICAgIGZmbHVzaChmZCk7CisgICAgICB9CisgICAgfQorICAgIGlmIChjdXN0b21faGVhZGVyKQorICAgIHsgVGFibGUgKnI7CisgICAgICBmcHJpbnRmKGZkLCAiPG1lc3NhZ2UgbmFtZT1cIiVzSGVhZGVyXCI+XG4iLCBuYW1lKTsKKyAgICAgIHIgPSBlbnRyeShjbGFzc3RhYmxlLCBsb29rdXAoIlNPQVBfRU5WX19IZWFkZXIiKSktPmluZm8udHlwLT5yZWY7CisgICAgICBpZiAocikKKyAgICAgICAgZm9yIChxID0gci0+bGlzdDsgcTsgcSA9IHEtPm5leHQpCisJICBpZiAoIWlzX3RyYW5zaWVudChxLT5pbmZvLnR5cCkgJiYgIShxLT5pbmZvLnN0byAmIFNhdHRyaWJ1dGUpICYmIHEtPmluZm8udHlwLT50eXBlICE9IFRmdW4gJiYgIWlzX3JlcGV0aXRpb24ocSkgJiYgIWlzX2FueXR5cGUocSkpCisJICAgIGZwcmludGYoZmQsICIgPHBhcnQgbmFtZT1cIiVzXCIgZWxlbWVudD1cIiVzXCIvPlxuIiwgbnNfcmVtb3ZlKHEtPnN5bS0+bmFtZSksIG5zX2FkZChxLT5zeW0tPm5hbWUsIG5zKSk7CisgICAgICBmcHJpbnRmKGZkLCAiPC9tZXNzYWdlPlxuXG4iKTsKKyAgICB9CisgICAgaWYgKGN1c3RvbV9mYXVsdCkKKyAgICB7IFRhYmxlICpyOworICAgICAgZnByaW50ZihmZCwgIjxtZXNzYWdlIG5hbWU9XCIlc0ZhdWx0XCI+XG4iLCBuYW1lKTsKKyAgICAgIHIgPSBlbnRyeShjbGFzc3RhYmxlLCBsb29rdXAoIlNPQVBfRU5WX19EZXRhaWwiKSktPmluZm8udHlwLT5yZWY7CisgICAgICBpZiAocikKKyAgICAgICAgZm9yIChxID0gci0+bGlzdDsgcTsgcSA9IHEtPm5leHQpCisJICBpZiAoIWlzX3RyYW5zaWVudChxLT5pbmZvLnR5cCkgJiYgIWlzX3JlcGV0aXRpb24ocSkgJiYgIWlzX2FueXR5cGUocSkgJiYgIShxLT5pbmZvLnN0byAmIFNhdHRyaWJ1dGUpICYmIHEtPmluZm8udHlwLT50eXBlICE9IFRmdW4gJiYgaGFzX25zX2VxKE5VTEwsIHEtPnN5bS0+bmFtZSkpCisJICAgIGZwcmludGYoZmQsICIgPHBhcnQgbmFtZT1cIiVzXCIgZWxlbWVudD1cIiVzXCIvPlxuIiwgbnNfcmVtb3ZlKHEtPnN5bS0+bmFtZSksIG5zX2FkZChxLT5zeW0tPm5hbWUsIG5zKSk7CisgICAgICBmcHJpbnRmKGZkLCAiPC9tZXNzYWdlPlxuXG4iKTsKKyAgICB9CisgICAgaWYgKHNwKQorICAgIHsgZm9yIChtID0gc3AtPmxpc3Q7IG07IG0gPSBtLT5uZXh0KQorICAgICAgeyBpZiAobS0+bWVzcyZGQVVMVCkKKyAgICAgICAgeyBNZXRob2QgKm0yOworCSAgaW50IGZsYWcgPSAwOworCSAgZm9yIChtMiA9IHNwLT5saXN0OyBtMiAmJiBtMiAhPSBtOyBtMiA9IG0yLT5uZXh0KQorCSAgICBpZiAobTItPm1lc3MmRkFVTFQgJiYgIXN0cmNtcChtMi0+cGFydCwgbS0+cGFydCkpCisJICAgICAgZmxhZyA9IDE7CisJICBpZiAoIWZsYWcpCisJICB7IGlmICh0eXBldGFibGUpCisgICAgICAgICAgICAgIGZvciAocCA9IHR5cGV0YWJsZS0+bGlzdDsgcDsgcCA9IHAtPm5leHQpCisJICAgICAgICBpZiAoKG0tPm1lc3MmRkFVTFQpICYmIGlzX2VxKG0tPnBhcnQsIHAtPmluZm8udHlwLT5zeW0tPm5hbWUpKQorCSAgICAgICAgICBicmVhazsKKwkgICAgaWYgKCFwICYmIGNsYXNzdGFibGUpIAorICAgICAgICAgICAgICBmb3IgKHAgPSBjbGFzc3RhYmxlLT5saXN0OyBwOyBwID0gcC0+bmV4dCkKKwkgICAgICAgIGlmICgobS0+bWVzcyZGQVVMVCkgJiYgaXNfZXEobS0+cGFydCwgcC0+aW5mby50eXAtPmlkLT5uYW1lKSkKKwkgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAocCkKKyAgICAgICAgICAgIHsgZnByaW50ZihmZCwgIjxtZXNzYWdlIG5hbWU9XCIlc0ZhdWx0XCI+XG4iLCBuc19yZW1vdmUobS0+cGFydCkpOworICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAiIDxwYXJ0IG5hbWU9XCJmYXVsdFwiIGVsZW1lbnQ9XCIlc1wiLz5cbiIsIG5zX2NvbnZlcnQobS0+cGFydCkpOworICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAiPC9tZXNzYWdlPlxuXG4iKTsKKwkgICAgfQorCSAgICBlbHNlCisgICAgICAgICAgICB7IHNwcmludGYoZXJyYnVmLCAiLy9nc29hcCAlcyBtZXRob2QtZmF1bHQgJXMgJXMgZGlyZWN0aXZlIGRvZXMgbm90IHJlZmVyIHRvIGNsYXNzIG9yIHR5cGVkZWYiLCBzcC0+bnMsIG0tPm5hbWUsIG0tPnBhcnQpOworICAgICAgICAgICAgICBzZW13YXJuKGVycmJ1Zik7CisJICAgIH0KKwkgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBmZmx1c2goZmQpOworICAgIGlmIChzcCAmJiBzcC0+cG9ydCkKKyAgICAgIGZwcmludGYoZmQsICI8cG9ydFR5cGUgbmFtZT1cIiVzXCI+XG4iLCBzcC0+cG9ydCk7CisgICAgZWxzZQorICAgICAgZnByaW50ZihmZCwgIjxwb3J0VHlwZSBuYW1lPVwiJXNcIj5cbiIsIG5zX2NuYW1lKG5hbWUsICJQb3J0VHlwZSIpKTsKKyAgICBmb3IgKHAgPSB0LT5saXN0OyBwOyBwID0gcC0+bmV4dCkKKyAgICB7IGlmIChwLT5pbmZvLnR5cC0+dHlwZSA9PSBUZnVuICYmICEocC0+aW5mby5zdG8gJiBTZXh0ZXJuKSAmJiBoYXNfbnNfZXEobnMsIHAtPnN5bS0+bmFtZSkpCisgICAgICB7IGNvbW1lbnQgPSBOVUxMOworCWlmIChzcCkKKwkgIGZvciAobSA9IHNwLT5saXN0OyBtOyBtID0gbS0+bmV4dCkKKwkgICAgaWYgKG0tPm1lc3MgPT0gQ09NTUVOVCAmJiBpc19lcV9ub25zKG0tPm5hbWUsIHAtPnN5bS0+bmFtZSkpCisJICAgICAgY29tbWVudCA9IG0tPnBhcnQ7CisgICAgICAgIGZwcmludGYoZmQsICIgPG9wZXJhdGlvbiBuYW1lPVwiJXNcIj5cbiIsIG5zX3JlbW92ZShwLT5zeW0tPm5hbWUpKTsKKyAgICAgICAgaWYgKGNvbW1lbnQpCisgICAgICAgICAgZnByaW50ZihmZCwgIiAgPGRvY3VtZW50YXRpb24+JXM8L2RvY3VtZW50YXRpb24+XG4iLCBjb21tZW50KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGZwcmludGYoZmQsICIgIDxkb2N1bWVudGF0aW9uPlNlcnZpY2UgZGVmaW5pdGlvbiBvZiBmdW5jdGlvbiAlczwvZG9jdW1lbnRhdGlvbj5cbiIsIHAtPnN5bS0+bmFtZSk7CisJaWYgKGdldF9yZXNwb25zZShwLT5pbmZvLnR5cCkpCisgICAgICAgICAgZnByaW50ZihmZCwgIiAgPGlucHV0IG1lc3NhZ2U9XCJ0bnM6JXNSZXF1ZXN0XCIvPlxuIiwgbnNfcmVtb3ZlKHAtPnN5bS0+bmFtZSkpOworCWVsc2UKKyAgICAgICAgICBmcHJpbnRmKGZkLCAiICA8aW5wdXQgbWVzc2FnZT1cInRuczolc1wiLz5cbiIsIG5zX3JlbW92ZShwLT5zeW0tPm5hbWUpKTsKKwlxID0gKEVudHJ5KilwLT5pbmZvLnR5cC0+cmVmOworCWlmIChxICYmIGlzX3RyYW5zaWVudChxLT5pbmZvLnR5cCkpCisJICA7CisJZWxzZSBpZiAocSAmJiAhaXNfcmVzcG9uc2UocS0+aW5mby50eXApKQorCSAgZnByaW50ZihmZCwgIiAgPG91dHB1dCBtZXNzYWdlPVwidG5zOiVzUmVzcG9uc2VcIi8+XG4iLCBuc19yZW1vdmUocC0+c3ltLT5uYW1lKSk7CisgICAgICAgIGVsc2UgaWYgKHEpCisJICBmcHJpbnRmKGZkLCAiICA8b3V0cHV0IG1lc3NhZ2U9XCJ0bnM6JXNcIi8+XG4iLCBuc19yZW1vdmUoKChUbm9kZSopcS0+aW5mby50eXAtPnJlZiktPmlkLT5uYW1lKSk7CisJaWYgKHNwKQorCSAgZm9yIChtID0gc3AtPmxpc3Q7IG07IG0gPSBtLT5uZXh0KQorCSAgICBpZiAoKG0tPm1lc3MmRkFVTFQpICYmIGlzX2VxX25vbnMobS0+bmFtZSwgcC0+c3ltLT5uYW1lKSkKKwkgICAgICBmcHJpbnRmKGZkLCAiICA8ZmF1bHQgbmFtZT1cIiVzXCIgbWVzc2FnZT1cInRuczolc0ZhdWx0XCIvPlxuIiwgbnNfcmVtb3ZlKG0tPnBhcnQpLCBuc19yZW1vdmUobS0+cGFydCkpOworICAgICAgICBmcHJpbnRmKGZkLCAiIDwvb3BlcmF0aW9uPlxuIik7CisgICAgICB9CisgICAgfQorICAgIGZwcmludGYoZmQsICI8L3BvcnRUeXBlPlxuXG4iKTsKKyAgICBmcHJpbnRmKGZkLCAiPGJpbmRpbmcgbmFtZT1cIiVzXCIgIiwgYmluZGluZyk7CisgICAgaWYgKGlzX2RvY3VtZW50KHN0eWxlKSkKKyAgICAgIGlmIChzcCAmJiBzcC0+cG9ydCkKKyAgICAgICAgZnByaW50ZihmZCwgInR5cGU9XCJ0bnM6JXNcIj5cbiA8U09BUDpiaW5kaW5nIHN0eWxlPVwiZG9jdW1lbnRcIiIsIHNwLT5wb3J0KTsKKyAgICAgIGVsc2UKKyAgICAgICAgZnByaW50ZihmZCwgInR5cGU9XCJ0bnM6JXNcIj5cbiA8U09BUDpiaW5kaW5nIHN0eWxlPVwiZG9jdW1lbnRcIiIsIG5zX2NuYW1lKG5hbWUsICJQb3J0VHlwZSIpKTsKKyAgICBlbHNlCisgICAgICBpZiAoc3AgJiYgc3AtPnBvcnQpCisgICAgICAgIGZwcmludGYoZmQsICJ0eXBlPVwidG5zOiVzXCI+XG4gPFNPQVA6YmluZGluZyBzdHlsZT1cInJwY1wiIiwgc3AtPnBvcnQpOworICAgICAgZWxzZQorICAgICAgICBmcHJpbnRmKGZkLCAidHlwZT1cInRuczolc1wiPlxuIDxTT0FQOmJpbmRpbmcgc3R5bGU9XCJycGNcIiIsIG5zX2NuYW1lKG5hbWUsICJQb3J0VHlwZSIpKTsKKyAgICBpZiAoc3AgJiYgc3AtPnRyYW5zcG9ydCkKKyAgICAgIGZwcmludGYoZmQsICIgdHJhbnNwb3J0PVwiJXNcIi8+XG4iLCBzcC0+dHJhbnNwb3J0KTsKKyAgICBlbHNlCisgICAgICBmcHJpbnRmKGZkLCAiIHRyYW5zcG9ydD1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cFwiLz5cbiIpOworICAgIGZmbHVzaChmZCk7CisgICAgZm9yIChwID0gdC0+bGlzdDsgcDsgcCA9IHAtPm5leHQpCisgICAgeyBpZiAocC0+aW5mby50eXAtPnR5cGUgPT0gVGZ1biAmJiAhKHAtPmluZm8uc3RvICYgU2V4dGVybikgJiYgaGFzX25zX2VxKG5zLCBwLT5zeW0tPm5hbWUpKQorICAgICAgeyBhY3Rpb24gPSAiIjsKKwkgIG1pbWVpbiA9IDA7CisJICBtaW1lb3V0ID0gMDsKKyAgICAgICAgICBtZXRob2Rfc3R5bGUgPSBzdHlsZTsKKwkgIG1ldGhvZF9lbmNvZGluZyA9IGVuY29kaW5nOworCSAgbWV0aG9kX3Jlc3BvbnNlX2VuY29kaW5nID0gTlVMTDsKKwkgIGlmIChzcCkKKwkgIHsgZm9yIChtID0gc3AtPmxpc3Q7IG07IG0gPSBtLT5uZXh0KQorCSAgICB7IGlmIChpc19lcV9ub25zKG0tPm5hbWUsIHAtPnN5bS0+bmFtZSkpCisJICAgICAgeyBpZiAobS0+bWVzcyZNSU1FSU4pCisJCSAgbWltZWluID0gMTsKKwkgICAgICAgIGlmIChtLT5tZXNzJk1JTUVPVVQpCisJCSAgbWltZW91dCA9IDE7CisgICAgICAgICAgICAgICAgaWYgKG0tPm1lc3MgPT0gRU5DT0RJTkcpCisJICAgICAgICAgIG1ldGhvZF9lbmNvZGluZyA9IG0tPnBhcnQ7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobS0+bWVzcyA9PSBSRVNQT05TRV9FTkNPRElORykKKwkgICAgICAgICAgbWV0aG9kX3Jlc3BvbnNlX2VuY29kaW5nID0gbS0+cGFydDsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChtLT5tZXNzID09IFNUWUxFKQorCSAgICAgICAgICBtZXRob2Rfc3R5bGUgPSBtLT5wYXJ0OworCSAgICAgICAgZWxzZSBpZiAobS0+bWVzcyA9PSBBQ1RJT04pCisJICAgICAgICAgIGFjdGlvbiA9IG0tPnBhcnQ7CisJICAgICAgfQorCSAgICB9CisJICB9CisJaWYgKCFtZXRob2RfcmVzcG9uc2VfZW5jb2RpbmcpCisJICBtZXRob2RfcmVzcG9uc2VfZW5jb2RpbmcgPSBtZXRob2RfZW5jb2Rpbmc7CisgICAgICAgIGZwcmludGYoZmQsICIgPG9wZXJhdGlvbiBuYW1lPVwiJXNcIj5cbiIsIG5zX3JlbW92ZShwLT5zeW0tPm5hbWUpKTsKKyAgICAgICAgaWYgKGlzX2RvY3VtZW50KHN0eWxlKSkKKwl7IGlmIChpc19kb2N1bWVudChtZXRob2Rfc3R5bGUpKQorICAgICAgICAgIHsgaWYgKGlzX3NvYXAxMigpKQorCSAgICAgIGZwcmludGYoZmQsICIgIDxTT0FQOm9wZXJhdGlvbi8+XG4iKTsKKwkgICAgZWxzZSBpZiAoKmFjdGlvbiA9PSAnIicpCisJICAgICAgZnByaW50ZihmZCwgIiAgPFNPQVA6b3BlcmF0aW9uIHNvYXBBY3Rpb249JXMvPlxuIiwgYWN0aW9uKTsKKyAgICAgICAgICAgIGVsc2UKKwkgICAgICBmcHJpbnRmKGZkLCAiICA8U09BUDpvcGVyYXRpb24gc29hcEFjdGlvbj1cIiVzXCIvPlxuIiwgYWN0aW9uKTsKKwkgIH0KKwkgIGVsc2UgaWYgKGlzX3NvYXAxMigpKQorICAgICAgICAgICAgZnByaW50ZihmZCwgIiAgPFNPQVA6b3BlcmF0aW9uIHN0eWxlPVwicnBjXCIvPlxuIik7CisJICBlbHNlIGlmICgqYWN0aW9uID09ICciJykKKyAgICAgICAgICAgIGZwcmludGYoZmQsICIgIDxTT0FQOm9wZXJhdGlvbiBzdHlsZT1cInJwY1wiIHNvYXBBY3Rpb249JXMvPlxuIiwgYWN0aW9uKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICA8U09BUDpvcGVyYXRpb24gc3R5bGU9XCJycGNcIiBzb2FwQWN0aW9uPVwiJXNcIi8+XG4iLCBhY3Rpb24pOworCX0KKyAgICAgICAgZWxzZQorCXsgaWYgKGlzX2RvY3VtZW50KG1ldGhvZF9zdHlsZSkpCisgICAgICAgICAgeyBpZiAoaXNfc29hcDEyKCkpCisJICAgICAgZnByaW50ZihmZCwgIiAgPFNPQVA6b3BlcmF0aW9uIHN0eWxlPVwiZG9jdW1lbnRcIi8+XG4iKTsKKwkgICAgZWxzZSBpZiAoKmFjdGlvbiA9PSAnIicpCisJICAgICAgZnByaW50ZihmZCwgIiAgPFNPQVA6b3BlcmF0aW9uIHN0eWxlPVwiZG9jdW1lbnRcIiBzb2FwQWN0aW9uPSVzLz5cbiIsIGFjdGlvbik7CisgICAgICAgICAgICBlbHNlCisJICAgICAgZnByaW50ZihmZCwgIiAgPFNPQVA6b3BlcmF0aW9uIHN0eWxlPVwiZG9jdW1lbnRcIiBzb2FwQWN0aW9uPVwiJXNcIi8+XG4iLCBhY3Rpb24pOworCSAgfQorCSAgZWxzZSBpZiAoaXNfc29hcDEyKCkpCisgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICA8U09BUDpvcGVyYXRpb24gc3R5bGU9XCJycGNcIi8+XG4iKTsKKwkgIGVsc2UgaWYgKCphY3Rpb24gPT0gJyInKQorICAgICAgICAgICAgZnByaW50ZihmZCwgIiAgPFNPQVA6b3BlcmF0aW9uIHN0eWxlPVwicnBjXCIgc29hcEFjdGlvbj0lcy8+XG4iLCBhY3Rpb24pOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZwcmludGYoZmQsICIgIDxTT0FQOm9wZXJhdGlvbiBzdHlsZT1cInJwY1wiIHNvYXBBY3Rpb249XCIlc1wiLz5cbiIsIGFjdGlvbik7CisJfQorCWZwcmludGYoZmQsICIgIDxpbnB1dD5cbiIpOworCWlmIChtaW1laW4pCisJICBmcHJpbnRmKGZkLCAiICAgPE1JTUU6bXVsdGlwYXJ0UmVsYXRlZD5cbiAgICA8TUlNRTpwYXJ0PlxuIik7CisgIAlxID0gZW50cnkoY2xhc3N0YWJsZSwgcC0+c3ltKTsKKyAgCWlmIChpc19saXRlcmFsKG1ldGhvZF9lbmNvZGluZykgfHwgcSAmJiAocSA9ICgoKFRhYmxlKilxLT5pbmZvLnR5cC0+cmVmKS0+bGlzdCkpICYmIHEgJiYgaXNfWE1MKHEtPmluZm8udHlwKSkKKwl7IGlmIChpc19kb2N1bWVudChtZXRob2Rfc3R5bGUpKQorCSAgICBmcHJpbnRmKGZkLCAiICAgICA8U09BUDpib2R5IHBhcnRzPVwicGFyYW1ldGVyc1wiIHVzZT1cImxpdGVyYWxcIi8+XG4iKTsKKyAgICAgICAgICBlbHNlCisJICAgIGZwcmludGYoZmQsICIgICAgIDxTT0FQOmJvZHkgcGFydHM9XCJwYXJhbWV0ZXJzXCIgdXNlPVwibGl0ZXJhbFwiIG5hbWVzcGFjZT1cIiVzXCIvPlxuIiwgVVJJKTsKKwl9CisgICAgICAgIGVsc2UKKwl7IGlmIChlbmNvZGluZyAmJiAqZW5jb2RpbmcpCisJICAgIGZwcmludGYoZmQsICIgICAgIDxTT0FQOmJvZHkgdXNlPVwiZW5jb2RlZFwiIG5hbWVzcGFjZT1cIiVzXCIgZW5jb2RpbmdTdHlsZT1cIiVzXCIvPlxuIiwgVVJJLCBlbmNvZGluZyk7CisgICAgICAgICAgZWxzZSBpZiAobWV0aG9kX2VuY29kaW5nICYmICptZXRob2RfZW5jb2RpbmcpCisJICAgIGZwcmludGYoZmQsICIgICAgIDxTT0FQOmJvZHkgdXNlPVwiZW5jb2RlZFwiIG5hbWVzcGFjZT1cIiVzXCIgZW5jb2RpbmdTdHlsZT1cIiVzXCIvPlxuIiwgVVJJLCBtZXRob2RfZW5jb2RpbmcpOworICAgICAgICAgIGVsc2UKKwkgICAgZnByaW50ZihmZCwgIiAgICAgPFNPQVA6Ym9keSB1c2U9XCJlbmNvZGVkXCIgbmFtZXNwYWNlPVwiJXNcIiBlbmNvZGluZ1N0eWxlPVwiJXNcIi8+XG4iLCBVUkksIGVuY1VSSSk7CisgICAgICAgICAgaWYgKCFlZmxhZykKKyAgICAgICAgICB7IHNwcmludGYoZXJyYnVmLCAib3BlcmF0aW9uICclcycgaXMgbm90IGNvbXBsaWFudCB3aXRoIFdTLUkgQmFzaWMgUHJvZmlsZSAxLjBhLCByZWFzb246IHVzZXMgU09BUCBlbmNvZGluZyIsIHAtPnN5bS0+bmFtZSk7CisgICAgICAgICAgICBjb21wbGlhbmNld2FybihlcnJidWYpOworCSAgfQorCX0KKwlpZiAoY3VzdG9tX2hlYWRlcikKKwl7IGludCBmID0gMDsKKwkgIG0gPSBOVUxMOworCSAgaWYgKHNwKQorCSAgICBmb3IgKG0gPSBzcC0+bGlzdDsgbTsgbSA9IG0tPm5leHQpCisJICAgICAgaWYgKGlzX2VxX25vbnMobS0+bmFtZSwgcC0+c3ltLT5uYW1lKSAmJiAobS0+bWVzcyZIRFJJTikpCisJICAgICAgeyBmID0gMTsKKwkgICAgICAgIGlmIChjaGtoZHIobS0+cGFydCkpCisJICAgICAgICAgIGZwcmludGYoZmQsICIgICAgIDxTT0FQOmhlYWRlciB1c2U9XCJsaXRlcmFsXCIgbWVzc2FnZT1cInRuczolc0hlYWRlclwiIHBhcnQ9XCIlc1wiLz5cbiIsIG5hbWUsIG5zX3JlbW92ZShtLT5wYXJ0KSk7CisJICAgICAgfQorCX0KKwlpZiAobWltZWluKQorCXsgaWYgKHNwKQorCSAgeyBmb3IgKG0gPSBzcC0+bGlzdDsgbTsgbSA9IG0tPm5leHQpCisJICAgIHsgaWYgKGlzX2VxX25vbnMobS0+bmFtZSwgcC0+c3ltLT5uYW1lKSAmJiAobS0+bWVzcyZNSU1FSU4pKQorCSAgICAgICAgZnByaW50ZihmZCwgIiAgICA8L01JTUU6cGFydD5cbiAgICA8TUlNRTpwYXJ0PlxuICAgICA8TUlNRTpjb250ZW50IHBhcnQ9XCJhdHRhY2htZW50c1wiIHR5cGU9XCIlc1wiLz5cbiIsIG0tPnBhcnQpOworCSAgICB9CisJICB9CisJICBmcHJpbnRmKGZkLCAiICAgIDwvTUlNRTpwYXJ0PlxuICAgPC9NSU1FOm11bHRpcGFydFJlbGF0ZWQ+XG4iKTsKKwl9CisJZnByaW50ZihmZCwgIiAgPC9pbnB1dD5cbiIpOworCXEgPSAoRW50cnkqKXAtPmluZm8udHlwLT5yZWY7CisJaWYgKCFxIHx8ICFxLT5pbmZvLnR5cC0+cmVmKQorCXsgZnByaW50ZihmZCwgIiA8L29wZXJhdGlvbj5cbiIpOworCSAgY29udGludWU7CisJfQorCWZwcmludGYoZmQsICIgIDxvdXRwdXQ+XG4iKTsKKwlpZiAobWltZW91dCkKKwkgIGZwcmludGYoZmQsICIgICA8TUlNRTptdWx0aXBhcnRSZWxhdGVkPlxuICAgIDxNSU1FOnBhcnQ+XG4iKTsKKwlpZiAoaXNfbGl0ZXJhbChtZXRob2RfcmVzcG9uc2VfZW5jb2RpbmcpIHx8IGlzX1hNTChxLT5pbmZvLnR5cC0+cmVmKSkKKwl7IGlmIChpc19kb2N1bWVudChtZXRob2Rfc3R5bGUpKQorCSAgICBmcHJpbnRmKGZkLCAiICAgICA8U09BUDpib2R5IHBhcnRzPVwicGFyYW1ldGVyc1wiIHVzZT1cImxpdGVyYWxcIi8+XG4iKTsKKyAgICAgICAgICBlbHNlCisJICAgIGZwcmludGYoZmQsICIgICAgIDxTT0FQOmJvZHkgcGFydHM9XCJwYXJhbWV0ZXJzXCIgdXNlPVwibGl0ZXJhbFwiIG5hbWVzcGFjZT1cIiVzXCIvPlxuIiwgVVJJKTsKKwl9CisJZWxzZSBpZiAoZW5jb2RpbmcgJiYgKmVuY29kaW5nKQorCSAgZnByaW50ZihmZCwgIiAgICAgPFNPQVA6Ym9keSB1c2U9XCJlbmNvZGVkXCIgbmFtZXNwYWNlPVwiJXNcIiBlbmNvZGluZ1N0eWxlPVwiJXNcIi8+XG4iLCBVUkksIGVuY29kaW5nKTsKKwllbHNlIGlmIChtZXRob2RfcmVzcG9uc2VfZW5jb2RpbmcgJiYgKm1ldGhvZF9yZXNwb25zZV9lbmNvZGluZykKKwkgIGZwcmludGYoZmQsICIgICAgIDxTT0FQOmJvZHkgdXNlPVwiZW5jb2RlZFwiIG5hbWVzcGFjZT1cIiVzXCIgZW5jb2RpbmdTdHlsZT1cIiVzXCIvPlxuIiwgVVJJLCBtZXRob2RfcmVzcG9uc2VfZW5jb2RpbmcpOworCWVsc2UKKwkgIGZwcmludGYoZmQsICIgICAgIDxTT0FQOmJvZHkgdXNlPVwiZW5jb2RlZFwiIG5hbWVzcGFjZT1cIiVzXCIgZW5jb2RpbmdTdHlsZT1cIiVzXCIvPlxuIiwgVVJJLCBlbmNVUkkpOworCWlmIChjdXN0b21faGVhZGVyKQorCXsgaW50IGYgPSAwOworCSAgaWYgKHNwKQorCSAgICBmb3IgKG0gPSBzcC0+bGlzdDsgbTsgbSA9IG0tPm5leHQpCisJICAgICAgaWYgKGlzX2VxX25vbnMobS0+bmFtZSwgcC0+c3ltLT5uYW1lKSAmJiAobS0+bWVzcyZIRFJPVVQpKQorCSAgICAgIHsgZiA9IDE7CisJICAgICAgICBpZiAoY2hraGRyKG0tPnBhcnQpKQorCSAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgICA8U09BUDpoZWFkZXIgdXNlPVwibGl0ZXJhbFwiIG1lc3NhZ2U9XCJ0bnM6JXNIZWFkZXJcIiBwYXJ0PVwiJXNcIi8+XG4iLCBuYW1lLCBuc19yZW1vdmUobS0+cGFydCkpOworCSAgICAgIH0KKwl9CisJaWYgKG1pbWVvdXQpCisJeyBpZiAoc3ApCisJICB7IGZvciAobSA9IHNwLT5saXN0OyBtOyBtID0gbS0+bmV4dCkKKwkgICAgeyBpZiAoaXNfZXFfbm9ucyhtLT5uYW1lLCBwLT5zeW0tPm5hbWUpICYmIChtLT5tZXNzJk1JTUVPVVQpKQorCSAgICAgICAgZnByaW50ZihmZCwgIiAgICA8L01JTUU6cGFydD5cbiAgICA8TUlNRTpwYXJ0PlxuICAgICA8TUlNRTpjb250ZW50IHBhcnQ9XCJhdHRhY2htZW50c1wiIHR5cGU9XCIlc1wiLz5cbiIsIG0tPnBhcnQpOworCSAgICB9CisJICB9CisJICBmcHJpbnRmKGZkLCAiICAgIDwvTUlNRTpwYXJ0PlxuICAgPC9NSU1FOm11bHRpcGFydFJlbGF0ZWQ+XG4iKTsKKwl9CisJZnByaW50ZihmZCwgIiAgPC9vdXRwdXQ+XG4iKTsKKwlpZiAoc3ApCisJICBmb3IgKG0gPSBzcC0+bGlzdDsgbTsgbSA9IG0tPm5leHQpCisJICAgIGlmICgobS0+bWVzcyZGQVVMVCkgJiYgaXNfZXFfbm9ucyhtLT5uYW1lLCBwLT5zeW0tPm5hbWUpKQorCSAgICAgIGZwcmludGYoZmQsICIgIDxmYXVsdCBuYW1lPVwiJXNcIj5cbiAgIDxTT0FQOmZhdWx0IG5hbWU9XCIlc1wiIHVzZT1cImxpdGVyYWxcIi8+XG4gIDwvZmF1bHQ+XG4iLCBuc19yZW1vdmUobS0+cGFydCksIG5zX3JlbW92ZShtLT5wYXJ0KSk7CisJZnByaW50ZihmZCwgIiA8L29wZXJhdGlvbj5cbiIpOworICAgICAgICBmZmx1c2goZmQpOworICAgICAgfQorICAgIH0KKyAgICBmcHJpbnRmKGZkLCAiPC9iaW5kaW5nPlxuXG4iKTsKKyAgfQorICBmcHJpbnRmKGZkLCAiPHNlcnZpY2UgbmFtZT1cIiVzXCI+XG4iLCBuYW1lKTsKKyAgaWYgKHNwICYmIHNwLT5kb2N1bWVudGF0aW9uKQorICAgIGZwcmludGYoZmQsICIgPGRvY3VtZW50YXRpb24+JXM8L2RvY3VtZW50YXRpb24+XG4iLCBzcC0+ZG9jdW1lbnRhdGlvbik7CisgIGVsc2UKKyAgICBmcHJpbnRmKGZkLCAiIDxkb2N1bWVudGF0aW9uPmdTT0FQICJWRVJTSU9OIiBnZW5lcmF0ZWQgc2VydmljZSBkZWZpbml0aW9uPC9kb2N1bWVudGF0aW9uPlxuIik7CisgIGlmIChleGVjdXRhYmxlKQorICAgIGZwcmludGYoZmQsICIgPHBvcnQgbmFtZT1cIiVzXCIgYmluZGluZz1cInRuczolc1wiPlxuICA8U09BUDphZGRyZXNzIGxvY2F0aW9uPVwiJXMvJXNcIi8+XG4gPC9wb3J0PlxuPC9zZXJ2aWNlPlxuXG48L2RlZmluaXRpb25zPlxuIiwgbmFtZSwgYmluZGluZywgVVJMLCBleGVjdXRhYmxlKTsKKyAgZWxzZQorICAgIGZwcmludGYoZmQsICIgPHBvcnQgbmFtZT1cIiVzXCIgYmluZGluZz1cInRuczolc1wiPlxuICA8U09BUDphZGRyZXNzIGxvY2F0aW9uPVwiJXNcIi8+XG4gPC9wb3J0PlxuPC9zZXJ2aWNlPlxuXG48L2RlZmluaXRpb25zPlxuIiwgbmFtZSwgYmluZGluZywgVVJMKTsKK30KKworY2hhciAqCitkZWZhdWx0X3ZhbHVlKEVudHJ5ICplLCBjb25zdCBjaGFyICphKQoreyBFbnRyeSAqcTsKKyAgc3RhdGljIGNoYXIgYnVmWzEwMjRdOworICBidWZbMF0gPSAnXDAnOworICBpZiAoZS0+aW5mby5oYXN2YWwpCisgICAgc3dpdGNoIChlLT5pbmZvLnR5cC0+dHlwZSkKKyAgICB7IGNhc2UgVGNoYXI6CisgICAgICBjYXNlIFR3Y2hhcjoKKyAgICAgIGNhc2UgVHVjaGFyOgorICAgICAgY2FzZSBUc2hvcnQ6CisgICAgICBjYXNlIFR1c2hvcnQ6CisgICAgICBjYXNlIFRpbnQ6CisgICAgICBjYXNlIFR1aW50OgorICAgICAgY2FzZSBUbG9uZzoKKyAgICAgIGNhc2UgVGxsb25nOgorICAgICAgY2FzZSBUdWxvbmc6CisgICAgICBjYXNlIFR1bGxvbmc6CisgICAgICAgIHNwcmludGYoYnVmLCAiICVzPVwiIlNPQVBfTE9OR19GT1JNQVQiXCIiLCBhLCBlLT5pbmZvLnZhbC5pKTsKKwlicmVhazsKKyAgICAgIGNhc2UgVGZsb2F0OgorICAgICAgY2FzZSBUZG91YmxlOgorICAgICAgICBzcHJpbnRmKGJ1ZiwgIiAlcz1cIiVmXCIiLCBhLCBlLT5pbmZvLnZhbC5yKTsKKwlicmVhazsKKyAgICAgIGNhc2UgVHRpbWU6CisgICAgICAgIGJyZWFrOyAvKiBzaG91bGQgZ2V0IHZhbHVlPyAqLworICAgICAgY2FzZSBUZW51bToKKwlmb3IgKHEgPSAoKFRhYmxlKillLT5pbmZvLnR5cC0+cmVmKS0+bGlzdDsgcTsgcSA9IHEtPm5leHQpCisJICBpZiAocS0+aW5mby52YWwuaSA9PSBlLT5pbmZvLnZhbC5pKQorCSAgeyBzcHJpbnRmKGJ1ZiwgIiAlcz1cIiVzXCIiLCBhLCBuc19jb252ZXJ0KHEtPnN5bS0+bmFtZSkpOworCSAgICBicmVhazsKKwkgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorCWlmIChlLT5pbmZvLnZhbC5zICYmIHN0cmxlbihlLT5pbmZvLnZhbC5zKSA8IHNpemVvZihidWYpLTEyKQorICAgICAgICAgIHNwcmludGYoYnVmLCAiICVzPVwiJXNcIiIsIGEsIGUtPmluZm8udmFsLnMpOworCWJyZWFrOworICAgIH0KKyAgcmV0dXJuIGJ1ZjsKK30KKworY29uc3QgY2hhciAqbmlsbGFibGUobG9uZyBtaW5PY2N1cnMpCit7IGlmIChtaW5PY2N1cnMpCisgICAgcmV0dXJuICJmYWxzZSI7CisgIHJldHVybiAidHJ1ZSI7Cit9CisKK3ZvaWQKK2dlbl9zY2hlbWEoRklMRSAqZmQsIFRhYmxlICp0LCBjaGFyICpuczEsIGNoYXIgKm5zLCBpbnQgYWxsLCBpbnQgd3NkbCwgY2hhciAqVVJMLCBjaGFyICpVUkksIGNoYXIgKnN0eWxlLCBjaGFyICplbmNvZGluZykKK3sgaW50IGksIGQ7CisgIGNoYXIgY2J1Zls0XTsKKyAgRW50cnkgKnAsICpxLCAqcjsKKyAgVG5vZGUgKm47CisgIFN5bWJvbCAqczsKKyAgU2VydmljZSAqc3AsICpzcDI7CisgIE1ldGhvZCAqbTsKKyAgaW50IGZsYWc7CisgIGlmICghc3RyY21wKG5zLCAiU09BUC1FTlYiKSB8fCAhc3RyY21wKG5zLCAiU09BUC1FTkMiKSB8fCAhc3RyY21wKG5zLCAieHNpIikgfHwgIXN0cmNtcChucywgInhzZCIpKQorICAgIHJldHVybjsKKyAgZm9yIChzcCA9IHNlcnZpY2VzOyBzcDsgc3AgPSBzcC0+bmV4dCkKKyAgICBpZiAoIXN0cmNtcChzcC0+bnMsIG5zKSAmJiBzcC0+VVJJKQorICAgICAgYnJlYWs7CisgIGlmIChzcCAmJiBzcC0+aW1wb3J0KQorICAgICByZXR1cm47CisgIGZwcmludGYoZmQsICIgPHNjaGVtYSAiKTsKKyAgaWYgKHNwKQorICAgIGZwcmludGYoZmQsICJ0YXJnZXROYW1lc3BhY2U9XCIlc1wiIiwgc3AtPlVSSSk7CisgIGVsc2UKKyAgICBmcHJpbnRmKGZkLCAidGFyZ2V0TmFtZXNwYWNlPVwiJXMvJXMueHNkXCIiLCB0bXBVUkksIG5zX2NvbnZlcnQobnMpKTsKKyAgZm9yIChzID0gbnNsaXN0OyBzOyBzID0gcy0+bmV4dCkKKyAgeyBmb3IgKHNwMiA9IHNlcnZpY2VzOyBzcDI7IHNwMiA9IHNwMi0+bmV4dCkKKyAgICAgIGlmICghc3RyY21wKHNwMi0+bnMsIHMtPm5hbWUpICYmIHNwMi0+VVJJKQorICAgICAgICBicmVhazsKKyAgICBpZiAoc3AyKQorICAgICAgZnByaW50ZihmZCwgIlxuICB4bWxuczolcz1cIiVzXCIiLCBuc19jb252ZXJ0KHMtPm5hbWUpLCBzcDItPlVSSSk7CisgICAgZWxzZSBpZiAoIXN0cmNtcChzLT5uYW1lLCAiU09BUC1FTlYiKSkKKyAgICAgIGZwcmludGYoZmQsICJcbiAgeG1sbnM6U09BUC1FTlY9XCIlc1wiIiwgZW52VVJJKTsKKyAgICBlbHNlIGlmICghc3RyY21wKHMtPm5hbWUsICJTT0FQLUVOQyIpKQorICAgICAgZnByaW50ZihmZCwgIlxuICB4bWxuczpTT0FQLUVOQz1cIiVzXCIiLCBlbmNVUkkpOworICAgIGVsc2UgaWYgKCFzdHJjbXAocy0+bmFtZSwgInhzaSIpKQorICAgICAgZnByaW50ZihmZCwgIlxuICB4bWxuczp4c2k9XCIlc1wiIiwgeHNpVVJJKTsKKyAgICBlbHNlIGlmICghc3RyY21wKHMtPm5hbWUsICJ4c2QiKSkKKyAgICAgIGZwcmludGYoZmQsICJcbiAgeG1sbnM6eHNkPVwiJXNcIiIsIHhzZFVSSSk7CisgICAgZWxzZQorICAgICAgZnByaW50ZihmZCwgIlxuICB4bWxuczolcz1cIiVzLyVzLnhzZFwiIiwgbnNfY29udmVydChzLT5uYW1lKSwgdG1wVVJJLCBuc19jb252ZXJ0KHMtPm5hbWUpKTsKKyAgfQorICBmcHJpbnRmKGZkLCAiXG4gIHhtbG5zPVwiJXNcIlxuIiwgeHNkVVJJKTsKKyAgaWYgKHNwICYmIChzcC0+ZWxlbWVudEZvcm0gfHwgc3AtPmF0dHJpYnV0ZUZvcm0pKQorICAgIGZwcmludGYoZmQsICIgIGVsZW1lbnRGb3JtRGVmYXVsdD1cIiVzXCJcbiAgYXR0cmlidXRlRm9ybURlZmF1bHQ9XCIlc1wiPlxuIiwgc3AtPmVsZW1lbnRGb3JtP3NwLT5lbGVtZW50Rm9ybToidW5xdWFsaWZpZWQiLCBzcC0+YXR0cmlidXRlRm9ybT9zcC0+YXR0cmlidXRlRm9ybToidW5xdWFsaWZpZWQiKTsKKyAgZWxzZSBpZiAoc3R5bGUgJiYgIXN0cmNtcChzdHlsZSwgImRvY3VtZW50IikpCisgICAgZnByaW50ZihmZCwgIiAgZWxlbWVudEZvcm1EZWZhdWx0PVwicXVhbGlmaWVkXCJcbiAgYXR0cmlidXRlRm9ybURlZmF1bHQ9XCJxdWFsaWZpZWRcIj5cbiIpOworICBlbHNlCisgICAgZnByaW50ZihmZCwgIiAgZWxlbWVudEZvcm1EZWZhdWx0PVwidW5xdWFsaWZpZWRcIlxuICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD1cInVucXVhbGlmaWVkXCI+XG4iKTsKKyAgZmZsdXNoKGZkKTsKKyAgZmxhZyA9IDA7CisgIGZvciAocyA9IG5zbGlzdDsgczsgcyA9IHMtPm5leHQpCisgIHsgZm9yIChzcDIgPSBzZXJ2aWNlczsgc3AyOyBzcDIgPSBzcDItPm5leHQpCisgICAgICBpZiAoIXN0cmNtcChzcDItPm5zLCBzLT5uYW1lKSAmJiBzcDItPmltcG9ydCAmJiBzcDItPlVSSSkKKyAgICAgICAgYnJlYWs7CisgICAgaWYgKHNwMikKKyAgICB7IGZwcmludGYoZmQsICIgIDxpbXBvcnQgbmFtZXNwYWNlPVwiJXNcIiIsIHNwMi0+VVJJKTsKKyAgICAgIGlmIChzdHJjbXAoc3AyLT5pbXBvcnQsIHNwMi0+VVJJKSkKKyAgICAgICAgZnByaW50ZihmZCwgIiBzY2hlbWFMb2NhdGlvbj1cIiVzXCIiLCBzcDItPmltcG9ydCk7CisgICAgICBmcHJpbnRmKGZkLCAiLz5cbiIpOworICAgICAgaWYgKCFzdHJjbXAoc3AyLT5VUkksIGVuY1VSSSkpCisgICAgICAgIGZsYWcgPSAxOworICAgIH0KKyAgfQorICBpZiAoIWZsYWcpCisgICAgZnByaW50ZihmZCwgIiAgPGltcG9ydCBuYW1lc3BhY2U9XCIlc1wiLz4iLCBlbmNVUkkpOworICBmcHJpbnRmKGZkLCAiXG4iKTsKKyAgZmZsdXNoKGZkKTsKKyAgaWYgKHR5cGV0YWJsZSkKKyAgICBmb3IgKHAgPSB0eXBldGFibGUtPmxpc3Q7IHA7IHAgPSBwLT5uZXh0KQorICAgIHsgaWYgKHAtPmluZm8udHlwLT50eXBlICE9IFR0ZW1wbGF0ZSAmJiAhaXNfdHJhbnNpZW50KHAtPmluZm8udHlwKSAmJiAoIWlzX2V4dGVybmFsKHAtPmluZm8udHlwKSB8fCBpc192b2xhdGlsZShwLT5pbmZvLnR5cCkpICYmICgoaGFzX25zX2VxKG5zLCBwLT5zeW0tPm5hbWUpKSkpCisgICAgICB7IC8qIG9taXQgdGhlIHR5cGVkZWZzIHRoYXQgYXJlIHVzZWQgZm9yIFNPQVAgRmF1bHQgZGV0YWlscyAqLworICAgICAgICBtID0gTlVMTDsKKyAgICAgICAgZm9yIChzcDIgPSBzZXJ2aWNlczsgc3AyICYmICFtOyBzcDIgPSBzcDItPm5leHQpCisJICBmb3IgKG0gPSBzcDItPmxpc3Q7IG07IG0gPSBtLT5uZXh0KQorCSAgICBpZiAoKG0tPm1lc3MmRkFVTFQpICYmIG0tPnBhcnQgJiYgaXNfZXEobS0+cGFydCwgcC0+c3ltLT5uYW1lKSkKKwkgICAgICBicmVhazsKKyAgICAgICAgaWYgKG0pCisgICAgICAgIHsgZnByaW50ZihmZCwgIiAgPCEtLSBmYXVsdCBlbGVtZW50IC0tPlxuIik7CisgICAgICAgICAgZnByaW50ZihmZCwgIiAgPGVsZW1lbnQgbmFtZT1cIiVzXCIgdHlwZT1cIiVzXCIvPlxuIiwgbnNfcmVtb3ZlKHAtPnN5bS0+bmFtZSksIGJhc2VfdHlwZShwLT5pbmZvLnR5cCwgbnMxKSk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzX3ByaW1pdGl2ZV9vcl9zdHJpbmcocC0+aW5mby50eXApIHx8IHAtPmluZm8udHlwLT50eXBlID09IFRwb2ludGVyICYmIGlzX3ByaW1pdGl2ZV9vcl9zdHJpbmcocC0+aW5mby50eXAtPnJlZikpCisJeyBmcHJpbnRmKGZkLCAiICA8c2ltcGxlVHlwZSBuYW1lPVwiJXNcIj4iLCBuc19yZW1vdmUocC0+c3ltLT5uYW1lKSk7CisgICAgICAgICAgZ2VuX3R5cGVfZG9jdW1lbnRhdGlvbihmZCwgdCwgcCwgbnMsIG5zMSk7CisJICBmcHJpbnRmKGZkLCAiICAgPHJlc3RyaWN0aW9uIGJhc2U9XCIlc1wiPlxuIiwgYmFzZV90eXBlKHAtPmluZm8udHlwLCBuczEpKTsKKwkgIGlmIChwLT5pbmZvLnR5cC0+cGF0dGVybikKKyAgICAgICAgICAgIGZwcmludGYoZmQsICIgICAgPHBhdHRlcm4gdmFsdWU9XCIlc1wiLz5cbiIsIHAtPmluZm8udHlwLT5wYXR0ZXJuKTsKKyAgICAgICAgICBpZiAoaXNfcHJpbWl0aXZlKHAtPmluZm8udHlwKSB8fCBwLT5pbmZvLnR5cC0+dHlwZSA9PSBUcG9pbnRlciAmJiBpc19wcmltaXRpdmUocC0+aW5mby50eXAtPnJlZikpCisJICB7IGlmIChwLT5pbmZvLnR5cC0+bWluTGVuZ3RoICE9IC0xKQorICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgIDxtaW5JbmNsdXNpdmUgdmFsdWU9XCIlZFwiLz5cbiIsIHAtPmluZm8udHlwLT5taW5MZW5ndGgpOworCSAgICBpZiAocC0+aW5mby50eXAtPm1heExlbmd0aCAhPSAtMSkKKyAgICAgICAgICAgICAgZnByaW50ZihmZCwgIiAgICA8bWF4SW5jbHVzaXZlIHZhbHVlPVwiJWRcIi8+XG4iLCBwLT5pbmZvLnR5cC0+bWF4TGVuZ3RoKTsKKwkgIH0KKwkgIGVsc2UKKwkgIHsgaWYgKHAtPmluZm8udHlwLT5tYXhMZW5ndGggPiAwICYmIHAtPmluZm8udHlwLT5taW5MZW5ndGggPT0gcC0+aW5mby50eXAtPm1heExlbmd0aCkKKyAgICAgICAgICAgICAgZnByaW50ZihmZCwgIiAgICA8bGVuZ3RoIHZhbHVlPVwiJWRcIi8+XG4iLCBwLT5pbmZvLnR5cC0+bWluTGVuZ3RoKTsKKwkgICAgZWxzZQorCSAgICB7IGlmIChwLT5pbmZvLnR5cC0+bWluTGVuZ3RoID4gMCkKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgIDxtaW5MZW5ndGggdmFsdWU9XCIlZFwiLz5cbiIsIHAtPmluZm8udHlwLT5taW5MZW5ndGgpOworCSAgICAgIGlmIChwLT5pbmZvLnR5cC0+bWF4TGVuZ3RoID4gMCkKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgIDxtYXhMZW5ndGggdmFsdWU9XCIlZFwiLz5cbiIsIHAtPmluZm8udHlwLT5tYXhMZW5ndGgpOworCSAgICB9CisJICB9CisgICAgICAgICAgZnByaW50ZihmZCwgIiAgIDwvcmVzdHJpY3Rpb24+XG4gIDwvc2ltcGxlVHlwZT5cbiIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKwl7IGZwcmludGYoZmQsICIgIDxjb21wbGV4VHlwZSBuYW1lPVwiJXNcIj4iLCBuc19yZW1vdmUocC0+c3ltLT5uYW1lKSk7CisJICBnZW5fdHlwZV9kb2N1bWVudGF0aW9uKGZkLCB0LCBwLCBucywgbnMxKTsKKwkgIGZwcmludGYoZmQsICIgICA8Y29tcGxleENvbnRlbnQ+XG4gICAgPHJlc3RyaWN0aW9uIGJhc2U9XCIlc1wiPlxuIiwgYmFzZV90eXBlKHAtPmluZm8udHlwLCBuczEpKTsKKyAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgIDwvcmVzdHJpY3Rpb24+XG4gICA8L2NvbXBsZXhDb250ZW50PlxuICA8L2NvbXBsZXhUeXBlPlxuIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIGZmbHVzaChmZCk7CisgIGlmIChlbnVtdGFibGUpCisgICAgZm9yIChwID0gZW51bXRhYmxlLT5saXN0OyBwOyBwID0gcC0+bmV4dCkKKyAgICB7IGlmICghaXNfdHJhbnNpZW50KHAtPmluZm8udHlwKSAmJiAoIWhhc19ucyhwLT5pbmZvLnR5cCkgJiYgYWxsIHx8IGhhc19uc19lcShucywgcC0+c3ltLT5uYW1lKSkpCisgICAgICB7IGlmIChpc19tYXNrKHAtPmluZm8udHlwKSkKKyAgICAgICAgeyBmcHJpbnRmKGZkLCAiICA8c2ltcGxlVHlwZSBuYW1lPVwiJXNcIj4iLCB3c2RsX3R5cGUocC0+aW5mby50eXAsIE5VTEwpKTsKKyAgICAgICAgICBnZW5fdHlwZV9kb2N1bWVudGF0aW9uKGZkLCB0LCBwLCBucywgbnMxKTsKKyAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgPGxpc3Q+XG4gICAgPHJlc3RyaWN0aW9uIGJhc2U9XCJ4c2Q6c3RyaW5nXCI+XG4iKTsKKyAgICAgICAgICBpZiAoKFRhYmxlKilwLT5pbmZvLnR5cC0+cmVmKQorICAgICAgICAgICAgZm9yIChxID0gKChUYWJsZSopcC0+aW5mby50eXAtPnJlZiktPmxpc3Q7IHE7IHEgPSBxLT5uZXh0KQorICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgICA8ZW51bWVyYXRpb24gdmFsdWU9XCIlc1wiLz5cbiIsIG5zX3JlbW92ZTIocS0+c3ltLT5uYW1lKSk7CisgICAgICAgICAgZnByaW50ZihmZCwgIiAgICA8L3Jlc3RyaWN0aW9uPlxuICAgPC9saXN0PlxuICA8L3NpbXBsZVR5cGU+XG4iKTsKKwl9CisJZWxzZQorCXsgZnByaW50ZihmZCwgIiAgPHNpbXBsZVR5cGUgbmFtZT1cIiVzXCI+Iiwgd3NkbF90eXBlKHAtPmluZm8udHlwLCBOVUxMKSk7CisgICAgICAgICAgZ2VuX3R5cGVfZG9jdW1lbnRhdGlvbihmZCwgdCwgcCwgbnMsIG5zMSk7CisJICBmcHJpbnRmKGZkLCAiICAgPHJlc3RyaWN0aW9uIGJhc2U9XCJ4c2Q6c3RyaW5nXCI+XG4iKTsKKyAgICAgICAgICBpZiAoKFRhYmxlKilwLT5pbmZvLnR5cC0+cmVmKQorICAgICAgICAgICAgZm9yIChxID0gKChUYWJsZSopcC0+aW5mby50eXAtPnJlZiktPmxpc3Q7IHE7IHEgPSBxLT5uZXh0KQorICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT1cIiVzXCIvPlxuIiwgbnNfcmVtb3ZlMihxLT5zeW0tPm5hbWUpKTsKKyAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgPC9yZXN0cmljdGlvbj5cbiAgPC9zaW1wbGVUeXBlPlxuIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIGZmbHVzaChmZCk7CisgIGlmIChjbGFzc3RhYmxlKQorICAgIGZvciAocCA9IGNsYXNzdGFibGUtPmxpc3Q7IHA7IHAgPSBwLT5uZXh0KQorICAgIHsgZm9yIChxID0gdC0+bGlzdDsgcTsgcSA9IHEtPm5leHQpCisgICAgICAgIGlmIChxLT5pbmZvLnR5cC0+dHlwZSA9PSBUZnVuICYmICEocS0+aW5mby5zdG8gJiBTZXh0ZXJuKSAmJiBwID09IGdldF9yZXNwb25zZShxLT5pbmZvLnR5cCkpCisJICBicmVhazsKKyAgICAgIC8qIG9taXQgdGhlIGF1dG8tZ2VuZXJhdGVkIGFuZCB1c2VyLWRlZmluZWQgcmVzcG9uc2Ugc3RydWN0L2NsYXNzICh3aGVuIG5lY2Vzc2FyeSkgKi8KKyAgICAgIGlmICghcSkKKyAgICAgICAgZm9yIChxID0gdC0+bGlzdDsgcTsgcSA9IHEtPm5leHQpCisgICAgICAgICAgaWYgKHEtPmluZm8udHlwLT50eXBlID09IFRmdW4gJiYgIShxLT5pbmZvLnN0byAmIFNleHRlcm4pICYmICFoYXNfbnNfZXEoTlVMTCwgKChFbnRyeSopcS0+aW5mby50eXAtPnJlZiktPnN5bS0+bmFtZSkpCisgICAgICAgICAgeyByID0gZW50cnkodCwgcS0+c3ltKTsKKyAgICAgICAgICAgIGlmIChyICYmIHItPmluZm8udHlwLT5yZWYgJiYgaXNfcmVzcG9uc2UoKChFbnRyeSopci0+aW5mby50eXAtPnJlZiktPmluZm8udHlwKSAmJiBwLT5pbmZvLnR5cCA9PSAoKEVudHJ5KilyLT5pbmZvLnR5cC0+cmVmKS0+aW5mby50eXAtPnJlZikKKyAgICAgICAgICAgICAgYnJlYWs7CisJICB9CisgICAgICBpZiAocSkKKyAgICAgICAgY29udGludWU7CisgICAgICAvKiBvbWl0IHRoZSBjbGFzc2VzIHRoYXQgYXJlIHVzZWQgZm9yIFNPQVAgRmF1bHQgZGV0YWlscyAqLworICAgICAgbSA9IE5VTEw7CisgICAgICBmb3IgKHNwMiA9IHNlcnZpY2VzOyBzcDIgJiYgIW07IHNwMiA9IHNwMi0+bmV4dCkKKwlmb3IgKG0gPSBzcDItPmxpc3Q7IG07IG0gPSBtLT5uZXh0KQorCSAgaWYgKChtLT5tZXNzJkZBVUxUKSAmJiBtLT5wYXJ0ICYmIGlzX2VxKG0tPnBhcnQsIHAtPnN5bS0+bmFtZSkpCisJICAgIGJyZWFrOworICAgICAgaWYgKG0pCisgICAgICB7IGlmICghaGFzX25zKHAtPmluZm8udHlwKSAmJiBhbGwgfHwgaGFzX25zX2VxKG5zLCBwLT5zeW0tPm5hbWUpKQorICAgICAgICB7IGZwcmludGYoZmQsICIgIDwhLS0gZmF1bHQgZWxlbWVudCAtLT5cbiIpOworICAgICAgICAgIGZwcmludGYoZmQsICIgIDxlbGVtZW50IG5hbWU9XCIlc1wiPlxuICAgPGNvbXBsZXhUeXBlPlxuICAgIDxzZXF1ZW5jZT5cbiIsIG5zX3JlbW92ZShwLT5zeW0tPm5hbWUpKTsKKwkgIGdlbl9zY2hlbWFfZWxlbWVudHMoZmQsIHAtPmluZm8udHlwLCBucywgbnMxKTsKKyAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgIDwvc2VxdWVuY2U+XG4iKTsKKwkgIGdlbl9zY2hlbWFfYXR0cmlidXRlcyhmZCwgcC0+aW5mby50eXAsIG5zLCBuczEpOworICAgICAgICAgIGZwcmludGYoZmQsICIgICA8L2NvbXBsZXhUeXBlPlxuICA8L2VsZW1lbnQ+XG4iKTsKKwl9CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHAtPmluZm8udHlwLT5yZWYgJiYgaXNfYmluYXJ5KHAtPmluZm8udHlwKSkKKyAgICAgIHsgaWYgKCFoYXNfbnMocC0+aW5mby50eXApICYmIGFsbCB8fCBoYXNfbnNfZXEobnMsIHAtPnN5bS0+bmFtZSkpCisJeyBpZiAoaXNfYXR0YWNobWVudChwLT5pbmZvLnR5cCkpCisJICB7IGZwcmludGYoZmQsICIgIDxjb21wbGV4VHlwZSBuYW1lPVwiJXNcIj4iLCBuc19yZW1vdmUocC0+c3ltLT5uYW1lKSk7CisJICAgIGdlbl90eXBlX2RvY3VtZW50YXRpb24oZmQsIHQsIHAsIG5zLCBuczEpOworCSAgICBmcHJpbnRmKGZkLCAiICAgPHNpbXBsZUNvbnRlbnQ+XG4gICAgPGV4dGVuc2lvbiBiYXNlPVwieHNkOmJhc2U2NEJpbmFyeVwiPlxuIik7CisJICAgIGlmICghZWZsYWcpCisgICAgICAgICAgICAgIGZwcmludGYoZmQsICIgICAgIDxhdHRyaWJ1dGUgbmFtZT1cImhyZWZcIiB0eXBlPVwieHNkOmFueVVSSVwiIHVzZT1cIm9wdGlvbmFsXCIvPlxuIik7CisJICAgIGdlbl9zY2hlbWFfYXR0cmlidXRlcyhmZCwgcC0+aW5mby50eXAsIG5zLCBuczEpOworICAgICAgICAgICAgZnByaW50ZihmZCwgIiAgICA8L2V4dGVuc2lvbj5cbiAgIDwvc2ltcGxlQ29udGVudD5cbiAgPC9jb21wbGV4VHlwZT5cbiIpOworCSAgfQorCSAgZWxzZQorCSAgeyBmcHJpbnRmKGZkLCAiICA8c2ltcGxlVHlwZSBuYW1lPVwiJXNcIj4iLCBuc19yZW1vdmUocC0+c3ltLT5uYW1lKSk7CisJICAgIGdlbl90eXBlX2RvY3VtZW50YXRpb24oZmQsIHQsIHAsIG5zLCBuczEpOworCSAgICBmcHJpbnRmKGZkLCAiICAgPHJlc3RyaWN0aW9uIGJhc2U9XCJ4c2Q6YmFzZTY0QmluYXJ5XCI+XG4iKTsKKwkgICAgaWYgKHAtPmluZm8udHlwLT5tYXhMZW5ndGggPiAwICYmIHAtPmluZm8udHlwLT5taW5MZW5ndGggPT0gcC0+aW5mby50eXAtPm1heExlbmd0aCkKKyAgICAgICAgICAgICAgZnByaW50ZihmZCwgIiAgICA8bGVuZ3RoIHZhbHVlPVwiJWRcIi8+XG4iLCBwLT5pbmZvLnR5cC0+bWluTGVuZ3RoKTsKKwkgICAgZWxzZQorCSAgICB7IGlmIChwLT5pbmZvLnR5cC0+bWluTGVuZ3RoID4gMCkKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgIDxtaW5MZW5ndGggdmFsdWU9XCIlZFwiLz5cbiIsIHAtPmluZm8udHlwLT5taW5MZW5ndGgpOworCSAgICAgIGlmIChwLT5pbmZvLnR5cC0+bWF4TGVuZ3RoID4gMCkKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgIDxtYXhMZW5ndGggdmFsdWU9XCIlZFwiLz5cbiIsIHAtPmluZm8udHlwLT5tYXhMZW5ndGgpOworCSAgICB9CisgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgPC9yZXN0cmljdGlvbj5cbiAgPC9zaW1wbGVUeXBlPlxuIik7CisJICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHAtPmluZm8udHlwLT5yZWYgJiYgIWlzX3RyYW5zaWVudChwLT5pbmZvLnR5cCkgJiYgaXNfcHJpbWNsYXNzKHAtPmluZm8udHlwKSkKKyAgICAgIHsgaWYgKCghaGFzX25zKHAtPmluZm8udHlwKSAmJiBhbGwgfHwgaGFzX25zX2VxKG5zLCBwLT5zeW0tPm5hbWUpKSkKKyAgICAgICAgeyBxID0gKChUYWJsZSopcC0+aW5mby50eXAtPnJlZiktPmxpc3Q7CisJICBpZiAocSAmJiBzdHJuY21wKHEtPnN5bS0+bmFtZSwgInhzZF9fYW55VHlwZSIsIDEyKSkKKwkgIHsgaWYgKGlzX3N0cmluZyhxLT5pbmZvLnR5cCkgfHwgaXNfd3N0cmluZyhxLT5pbmZvLnR5cCkgfHwgaXNfc3Rkc3RyaW5nKHEtPmluZm8udHlwKSB8fCBpc19zdGR3c3RyaW5nKHEtPmluZm8udHlwKSkKKyAgICAgICAgICAgIHsgZnByaW50ZihmZCwgIiAgPGNvbXBsZXhUeXBlIG5hbWU9XCIlc1wiIG1peGVkPVwidHJ1ZVwiPiIsIG5zX3JlbW92ZShwLT5zeW0tPm5hbWUpKTsKKwkgICAgICBnZW5fdHlwZV9kb2N1bWVudGF0aW9uKGZkLCB0LCBwLCBucywgbnMxKTsKKyAgICAgICAgICAgICAgZnByaW50ZihmZCwgIiAgIDxzaW1wbGVDb250ZW50PlxuICAgIDxleHRlbnNpb24gYmFzZT1cIiVzXCI+XG4iLCB3c2RsX3R5cGUocS0+aW5mby50eXAsIG5zMSkpOworCSAgICAgIGdlbl9zY2hlbWFfYXR0cmlidXRlcyhmZCwgcC0+aW5mby50eXAsIG5zLCBuczEpOworICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgIDwvZXh0ZW5zaW9uPlxuICAgPC9zaW1wbGVDb250ZW50PlxuICA8L2NvbXBsZXhUeXBlPlxuIik7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoaXNfcHJpbWl0aXZlKHEtPmluZm8udHlwKSkKKyAgICAgICAgICAgIHsgZnByaW50ZihmZCwgIiAgPGNvbXBsZXhUeXBlIG5hbWU9XCIlc1wiPiIsIG5zX3JlbW92ZShwLT5zeW0tPm5hbWUpKTsKKwkgICAgICBnZW5fdHlwZV9kb2N1bWVudGF0aW9uKGZkLCB0LCBwLCBucywgbnMxKTsKKyAgICAgICAgICAgICAgZnByaW50ZihmZCwgIiAgIDxzaW1wbGVDb250ZW50PlxuICAgIDxleHRlbnNpb24gYmFzZT1cIiVzXCI+XG4iLCB3c2RsX3R5cGUocS0+aW5mby50eXAsIG5zMSkpOworCSAgICAgIGdlbl9zY2hlbWFfYXR0cmlidXRlcyhmZCwgcC0+aW5mby50eXAsIG5zLCBuczEpOworICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgIDwvZXh0ZW5zaW9uPlxuICAgPC9zaW1wbGVDb250ZW50PlxuICA8L2NvbXBsZXhUeXBlPlxuIik7CisJICAgIH0KKwkgICAgZWxzZQorICAgICAgICAgICAgeyBmcHJpbnRmKGZkLCAiICA8Y29tcGxleFR5cGUgbmFtZT1cIiVzXCI+IiwgbnNfcmVtb3ZlKHAtPnN5bS0+bmFtZSkpOworCSAgICAgIGdlbl90eXBlX2RvY3VtZW50YXRpb24oZmQsIHQsIHAsIG5zLCBuczEpOworICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgPGNvbXBsZXhDb250ZW50PlxuICAgIDxleHRlbnNpb24gYmFzZT1cIiVzXCI+XG4iLCB3c2RsX3R5cGUocS0+aW5mby50eXAsIG5zMSkpOworCSAgICAgIGdlbl9zY2hlbWFfYXR0cmlidXRlcyhmZCwgcC0+aW5mby50eXAsIG5zLCBuczEpOworICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgIDwvZXh0ZW5zaW9uPlxuICAgPC9jb21wbGV4Q29udGVudD5cbiAgPC9jb21wbGV4VHlwZT5cbiIpOworCSAgICB9CisJICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHAtPmluZm8udHlwLT5yZWYgJiYgIWlzX3RyYW5zaWVudChwLT5pbmZvLnR5cCkpCisgICAgICB7IHEgPSAoKFRhYmxlKilwLT5pbmZvLnR5cC0+cmVmKS0+bGlzdDsKKyAgICAgICAgaWYgKGVudHJ5KHQsIHAtPnN5bSkgJiYgKCFxIHx8ICFpc19YTUwocS0+aW5mby50eXApKSkKKyAgICAgICAgICA7CisgICAgICAgIGVsc2UgaWYgKGlzX2R5bmFtaWNfYXJyYXkocC0+aW5mby50eXApKQorICAgICAgICB7IGlmICghaGFzX25zKHAtPmluZm8udHlwKSAmJiAhaXNfdW50eXBlZChwLT5pbmZvLnR5cCkpCisgICAgICAgICAgeyBpZiAoYWxsKQorCSAgICAgIGlmICgxIC8qIHdzZGwgKi8pCisJICAgICAgeyBkID0gZ2V0X0RhcnJheWRpbXMocC0+aW5mby50eXApLTE7CisJICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZDsgaSsrKQorCSAgICAgICAgICBjYnVmW2ldID0gJywnOworCSAgICAgICAgY2J1ZltpXSA9ICdcMCc7CisJCWlmIChxLT5pbmZvLm1heE9jY3VycyA9PSAxKQorCSAgICAgICAgICBmcHJpbnRmKGZkLCAiICA8Y29tcGxleFR5cGUgbmFtZT1cIiVzXCI+XG4gICA8Y29tcGxleENvbnRlbnQ+XG4gICAgPHJlc3RyaWN0aW9uIGJhc2U9XCJTT0FQLUVOQzpBcnJheVwiPlxuICAgICA8c2VxdWVuY2U+XG4gICAgICA8ZWxlbWVudCBuYW1lPVwiJXNcIiB0eXBlPVwiJXNcIiBtaW5PY2N1cnM9XCIwXCIgbWF4T2NjdXJzPVwidW5ib3VuZGVkXCIvPlxuICAgICA8L3NlcXVlbmNlPlxuICAgICA8YXR0cmlidXRlIHJlZj1cIlNPQVAtRU5DOmFycmF5VHlwZVwiIFdTREw6YXJyYXlUeXBlPVwiJXNbJXNdXCIvPlxuICAgIDwvcmVzdHJpY3Rpb24+XG4gICA8L2NvbXBsZXhDb250ZW50PlxuICA8L2NvbXBsZXhUeXBlPlxuIiwgd3NkbF90eXBlKHAtPmluZm8udHlwLCBOVUxMKSwgcS0+c3ltLT5uYW1lWzVdP25zX3JlbW92ZShxLT5zeW0tPm5hbWUrNSk6Iml0ZW0iLCB3c2RsX3R5cGUocS0+aW5mby50eXAsIG5zMSksIHdzZGxfdHlwZShxLT5pbmZvLnR5cCwgbnMxKSwgY2J1Zik7CisgICAgICAgICAgICAgICAgZWxzZQorCSAgICAgICAgICBmcHJpbnRmKGZkLCAiICA8Y29tcGxleFR5cGUgbmFtZT1cIiVzXCI+XG4gICA8Y29tcGxleENvbnRlbnQ+XG4gICAgPHJlc3RyaWN0aW9uIGJhc2U9XCJTT0FQLUVOQzpBcnJheVwiPlxuICAgICA8c2VxdWVuY2U+XG4gICAgICA8ZWxlbWVudCBuYW1lPVwiJXNcIiB0eXBlPVwiJXNcIiBtaW5PY2N1cnM9XCIlbGRcIiBtYXhPY2N1cnM9XCIlbGRcIi8+XG4gICAgIDwvc2VxdWVuY2U+XG4gICAgIDxhdHRyaWJ1dGUgcmVmPVwiU09BUC1FTkM6YXJyYXlUeXBlXCIgV1NETDphcnJheVR5cGU9XCIlc1slc11cIi8+XG4gICAgPC9yZXN0cmljdGlvbj5cbiAgIDwvY29tcGxleENvbnRlbnQ+XG4gIDwvY29tcGxleFR5cGU+XG4iLCB3c2RsX3R5cGUocC0+aW5mby50eXAsIE5VTEwpLCBxLT5zeW0tPm5hbWVbNV0/bnNfcmVtb3ZlKHEtPnN5bS0+bmFtZSs1KToiaXRlbSIsIHdzZGxfdHlwZShxLT5pbmZvLnR5cCwgbnMxKSwgcS0+aW5mby5taW5PY2N1cnMsIHEtPmluZm8ubWF4T2NjdXJzLCB3c2RsX3R5cGUocS0+aW5mby50eXAsIG5zMSksIGNidWYpOworCSAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorCQlpZiAocS0+aW5mby5tYXhPY2N1cnMgPT0gMSkKKwkgICAgICAgICAgZnByaW50ZihmZCwgIiAgPGNvbXBsZXhUeXBlIG5hbWU9XCIlc1wiPlxuICAgPGNvbXBsZXhDb250ZW50PlxuICAgIDxyZXN0cmljdGlvbiBiYXNlPVwiU09BUC1FTkM6QXJyYXlcIj5cbiAgICAgPHNlcXVlbmNlPlxuICAgICAgPGVsZW1lbnQgbmFtZT1cIiVzXCIgdHlwZT1cIiVzXCIgbWluT2NjdXJzPVwiMFwiIG1heE9jY3Vycz1cInVuYm91bmRlZFwiLz5cbiAgICAgPC9zZXF1ZW5jZT5cbiAgICA8L3Jlc3RyaWN0aW9uPlxuICAgPC9jb21wbGV4Q29udGVudD5cbiAgPC9jb21wbGV4VHlwZT5cbiIsIHdzZGxfdHlwZShwLT5pbmZvLnR5cCwgTlVMTCksIHEtPnN5bS0+bmFtZVs1XT9uc19yZW1vdmUocS0+c3ltLT5uYW1lKzUpOiJpdGVtIiwgd3NkbF90eXBlKHEtPmluZm8udHlwLCBuczEpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisJICAgICAgICAgIGZwcmludGYoZmQsICIgIDxjb21wbGV4VHlwZSBuYW1lPVwiJXNcIj5cbiAgIDxjb21wbGV4Q29udGVudD5cbiAgICA8cmVzdHJpY3Rpb24gYmFzZT1cIlNPQVAtRU5DOkFycmF5XCI+XG4gICAgIDxzZXF1ZW5jZT5cbiAgICAgIDxlbGVtZW50IG5hbWU9XCIlc1wiIHR5cGU9XCIlc1wiIG1pbk9jY3Vycz1cIiVsZFwiIG1heE9jY3Vycz1cIiVsZFwiLz5cbiAgICAgPC9zZXF1ZW5jZT5cbiAgICA8L3Jlc3RyaWN0aW9uPlxuICAgPC9jb21wbGV4Q29udGVudD5cbiAgPC9jb21wbGV4VHlwZT5cbiIsIHdzZGxfdHlwZShwLT5pbmZvLnR5cCwgTlVMTCksIHEtPnN5bS0+bmFtZVs1XT9uc19yZW1vdmUocS0+c3ltLT5uYW1lKzUpOiJpdGVtIiwgd3NkbF90eXBlKHEtPmluZm8udHlwLCBuczEpLCAgcS0+aW5mby5taW5PY2N1cnMsIHEtPmluZm8ubWF4T2NjdXJzKTsKKyAgICAgICAgICB9CisJICBlbHNlIGlmIChwLT5pbmZvLnR5cC0+cmVmICYmICgoVGFibGUqKXAtPmluZm8udHlwLT5yZWYpLT5wcmV2ICYmICFpc190cmFuc2llbnQoZW50cnkoY2xhc3N0YWJsZSwgKChUYWJsZSopcC0+aW5mby50eXAtPnJlZiktPnByZXYtPnN5bSktPmluZm8udHlwKSAmJiBzdHJuY21wKCgoVGFibGUqKXAtPmluZm8udHlwLT5yZWYpLT5wcmV2LT5zeW0tPm5hbWUsICJ4c2RfX2FueVR5cGUiLCAxMikpCisJICB7IGlmIChxLT5pbmZvLm1heE9jY3VycyA9PSAxKQorICAgICAgICAgICAgeyBmcHJpbnRmKGZkLCAiICA8Y29tcGxleFR5cGUgbmFtZT1cIiVzXCI+IiwgbnNfcmVtb3ZlKHAtPnN5bS0+bmFtZSkpOworCSAgICAgIGdlbl90eXBlX2RvY3VtZW50YXRpb24oZmQsIHQsIHAsIG5zLCBuczEpOworICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgPGNvbXBsZXhDb250ZW50PlxuICAgIDxleHRlbnNpb24gYmFzZT1cIiVzXCI+XG4gICAgIDxzZXF1ZW5jZT5cbiIsIG5zX2NvbnZlcnQoKChUYWJsZSopcC0+aW5mby50eXAtPnJlZiktPnByZXYtPnN5bS0+bmFtZSkpOworCSAgICAgIGZwcmludGYoZmQsICIgICAgICA8ZWxlbWVudCBuYW1lPVwiJXNcIiB0eXBlPVwiJXNcIiBtaW5PY2N1cnM9XCIwXCIgbWF4T2NjdXJzPVwidW5ib3VuZGVkXCIgbmlsbGFibGU9XCJ0cnVlXCIvPlxuIiwgcS0+c3ltLT5uYW1lWzVdP25zX3JlbW92ZShxLT5zeW0tPm5hbWUrNSk6Iml0ZW0iLCB3c2RsX3R5cGUocS0+aW5mby50eXAsIG5zMSkpOworICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgICA8L3NlcXVlbmNlPlxuICAgIDwvZXh0ZW5zaW9uPlxuICAgPC9jb21wbGV4Q29udGVudD5cbiIpOworCSAgICAgIGdlbl9zY2hlbWFfYXR0cmlidXRlcyhmZCwgcC0+aW5mby50eXAsIG5zLCBuczEpOworICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICA8L2NvbXBsZXhUeXBlPlxuIik7CisJICAgIH0KKwkgICAgZWxzZQorICAgICAgICAgICAgeyBmcHJpbnRmKGZkLCAiICA8Y29tcGxleFR5cGUgbmFtZT1cIiVzXCI+IiwgbnNfcmVtb3ZlKHAtPnN5bS0+bmFtZSkpOworCSAgICAgIGdlbl90eXBlX2RvY3VtZW50YXRpb24oZmQsIHQsIHAsIG5zLCBuczEpOworICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgPGNvbXBsZXhDb250ZW50PlxuICAgIDxleHRlbnNpb24gYmFzZT1cIiVzXCI+XG4gICAgIDxzZXF1ZW5jZT5cbiIsIG5zX2NvbnZlcnQoKChUYWJsZSopcC0+aW5mby50eXAtPnJlZiktPnByZXYtPnN5bS0+bmFtZSkpOworCSAgICAgIGZwcmludGYoZmQsICIgICAgICA8ZWxlbWVudCBuYW1lPVwiJXNcIiB0eXBlPVwiJXNcIiBtaW5PY2N1cnM9XCIlbGRcIiBtYXhPY2N1cnM9XCIlbGRcIiBuaWxsYWJsZT1cIiVzXCIvPlxuIiwgcS0+c3ltLT5uYW1lWzVdP25zX3JlbW92ZShxLT5zeW0tPm5hbWUrNSk6Iml0ZW0iLCB3c2RsX3R5cGUocS0+aW5mby50eXAsIG5zMSksIHEtPmluZm8ubWluT2NjdXJzLCBxLT5pbmZvLm1heE9jY3VycywgbmlsbGFibGUocS0+aW5mby5taW5PY2N1cnMpKTsKKyAgICAgICAgICAgICAgZnByaW50ZihmZCwgIiAgICAgPC9zZXF1ZW5jZT5cbiAgICA8L2V4dGVuc2lvbj5cbiAgIDwvY29tcGxleENvbnRlbnQ+XG4iKTsKKwkgICAgICBnZW5fc2NoZW1hX2F0dHJpYnV0ZXMoZmQsIHAtPmluZm8udHlwLCBucywgbnMxKTsKKyAgICAgICAgICAgICAgZnByaW50ZihmZCwgIiAgPC9jb21wbGV4VHlwZT5cbiIpOworCSAgICB9CisJICB9CisJICBlbHNlCisJICB7IGlmIChxLT5pbmZvLm1heE9jY3VycyA9PSAxKQorCSAgICB7IGZwcmludGYoZmQsICIgIDxjb21wbGV4VHlwZSBuYW1lPVwiJXNcIj4iLCBuc19yZW1vdmUocC0+c3ltLT5uYW1lKSk7CisJICAgICAgZ2VuX3R5cGVfZG9jdW1lbnRhdGlvbihmZCwgdCwgcCwgbnMsIG5zMSk7CisJICAgICAgZnByaW50ZihmZCwgIiAgIDxzZXF1ZW5jZT5cbiAgICA8ZWxlbWVudCBuYW1lPVwiJXNcIiB0eXBlPVwiJXNcIiBtaW5PY2N1cnM9XCIwXCIgbWF4T2NjdXJzPVwidW5ib3VuZGVkXCIgbmlsbGFibGU9XCJ0cnVlXCIvPlxuICAgPC9zZXF1ZW5jZT5cbiAgPC9jb21wbGV4VHlwZT5cbiIsIHEtPnN5bS0+bmFtZVs1XT9uc19yZW1vdmUocS0+c3ltLT5uYW1lKzUpOiJpdGVtIiwgd3NkbF90eXBlKHEtPmluZm8udHlwLCBuczEpKTsKKwkgICAgfQorICAgICAgICAgICAgZWxzZQorCSAgICB7IGZwcmludGYoZmQsICIgIDxjb21wbGV4VHlwZSBuYW1lPVwiJXNcIj4iLCBuc19yZW1vdmUocC0+c3ltLT5uYW1lKSk7CisJICAgICAgZ2VuX3R5cGVfZG9jdW1lbnRhdGlvbihmZCwgdCwgcCwgbnMsIG5zMSk7CisJICAgICAgZnByaW50ZihmZCwgIiAgIDxzZXF1ZW5jZT5cbiAgICA8ZWxlbWVudCBuYW1lPVwiJXNcIiB0eXBlPVwiJXNcIiBtaW5PY2N1cnM9XCIlbGRcIiBtYXhPY2N1cnM9XCIlbGRcIiBuaWxsYWJsZT1cIiVzXCIvPlxuICAgPC9zZXF1ZW5jZT5cbiAgPC9jb21wbGV4VHlwZT5cbiIsIHEtPnN5bS0+bmFtZVs1XT9uc19yZW1vdmUocS0+c3ltLT5uYW1lKzUpOiJpdGVtIiwgd3NkbF90eXBlKHEtPmluZm8udHlwLCBuczEpLCBxLT5pbmZvLm1pbk9jY3VycywgcS0+aW5mby5tYXhPY2N1cnMsIG5pbGxhYmxlKHEtPmluZm8ubWluT2NjdXJzKSk7CisJICAgIH0KKwkgIH0KKwl9CisgICAgICAgIGVsc2UgaWYgKGlzX2Rpc2NyaW1pbmFudChwLT5pbmZvLnR5cCkgJiYgKCFoYXNfbnMocC0+aW5mby50eXApICYmIGFsbCB8fCBoYXNfbnNfZXEobnMsIHAtPnN5bS0+bmFtZSkpKQorICAgICAgICB7IGlmIChwLT5pbmZvLnR5cC0+cmVmKQorICAgICAgICAgIHsgZnByaW50ZihmZCwgIiAgPGNvbXBsZXhUeXBlIG5hbWU9XCIlc1wiPlxuIiwgbnNfcmVtb3ZlKHAtPnN5bS0+bmFtZSkpOworCSAgICBnZW5fc2NoZW1hX2VsZW1lbnRzKGZkLCBwLT5pbmZvLnR5cCwgbnMsIG5zMSk7CisgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICA8L2NvbXBsZXhUeXBlPlxuIik7CisJICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocC0+aW5mby50eXAtPnR5cGUgPT0gVHN0cnVjdCAmJiAoIWhhc19ucyhwLT5pbmZvLnR5cCkgJiYgYWxsIHx8IGhhc19uc19lcShucywgcC0+c3ltLT5uYW1lKSkpCisgICAgICAgIHsgaWYgKHAtPmluZm8udHlwLT5yZWYpCisgICAgICAgICAgeyBmcHJpbnRmKGZkLCAiICA8Y29tcGxleFR5cGUgbmFtZT1cIiVzXCI+IiwgbnNfcmVtb3ZlKHAtPnN5bS0+bmFtZSkpOworCSAgICBnZW5fdHlwZV9kb2N1bWVudGF0aW9uKGZkLCB0LCBwLCBucywgbnMxKTsKKyAgICAgICAgICAgIGZwcmludGYoZmQsICIgICA8c2VxdWVuY2U+XG4iKTsKKwkgICAgZ2VuX3NjaGVtYV9lbGVtZW50cyhmZCwgcC0+aW5mby50eXAsIG5zLCBuczEpOworICAgICAgICAgICAgZnByaW50ZihmZCwgIiAgIDwvc2VxdWVuY2U+XG4iKTsKKwkgICAgZ2VuX3NjaGVtYV9hdHRyaWJ1dGVzKGZkLCBwLT5pbmZvLnR5cCwgbnMsIG5zMSk7CisgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICA8L2NvbXBsZXhUeXBlPlxuIik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHAtPmluZm8udHlwLT50eXBlID09IFRjbGFzcyAmJiAoIWhhc19ucyhwLT5pbmZvLnR5cCkgJiYgYWxsIHx8IGhhc19uc19lcShucywgcC0+c3ltLT5uYW1lKSkpCisgICAgICAgIHsgaWYgKHAtPmluZm8udHlwLT5yZWYpCisgICAgICAgICAgeyBpZiAoKChUYWJsZSopcC0+aW5mby50eXAtPnJlZiktPnByZXYgJiYgIWlzX3RyYW5zaWVudChlbnRyeShjbGFzc3RhYmxlLCAoKFRhYmxlKilwLT5pbmZvLnR5cC0+cmVmKS0+cHJldi0+c3ltKS0+aW5mby50eXApICYmIHN0cm5jbXAoKChUYWJsZSopcC0+aW5mby50eXAtPnJlZiktPnByZXYtPnN5bS0+bmFtZSwgInhzZF9fYW55VHlwZSIsIDEyKSkKKyAgICAgICAgICAgIHsgZnByaW50ZihmZCwgIiAgPGNvbXBsZXhUeXBlIG5hbWU9XCIlc1wiPiIsIG5zX3JlbW92ZShwLT5zeW0tPm5hbWUpKTsKKwkgICAgICBnZW5fdHlwZV9kb2N1bWVudGF0aW9uKGZkLCB0LCBwLCBucywgbnMxKTsKKyAgICAgICAgICAgICAgZnByaW50ZihmZCwgIiAgIDxjb21wbGV4Q29udGVudD5cbiAgICA8ZXh0ZW5zaW9uIGJhc2U9XCIlc1wiPlxuICAgICA8c2VxdWVuY2U+XG4iLCBuc19jb252ZXJ0KCgoVGFibGUqKXAtPmluZm8udHlwLT5yZWYpLT5wcmV2LT5zeW0tPm5hbWUpKTsKKwkgICAgICBnZW5fc2NoZW1hX2VsZW1lbnRzKGZkLCBwLT5pbmZvLnR5cCwgbnMsIG5zMSk7CisgICAgICAgICAgICAgIGZwcmludGYoZmQsICIgICAgIDwvc2VxdWVuY2U+XG4gICAgPC9leHRlbnNpb24+XG4gICA8L2NvbXBsZXhDb250ZW50PlxuIik7CisJICAgICAgZ2VuX3NjaGVtYV9hdHRyaWJ1dGVzKGZkLCBwLT5pbmZvLnR5cCwgbnMsIG5zMSk7CisgICAgICAgICAgICAgIGZwcmludGYoZmQsICIgIDwvY29tcGxleFR5cGU+XG4iKTsKKwkgICAgfQorCSAgICBlbHNlCisgICAgICAgICAgICB7IGZwcmludGYoZmQsICIgIDxjb21wbGV4VHlwZSBuYW1lPVwiJXNcIj4iLCBuc19yZW1vdmUocC0+c3ltLT5uYW1lKSk7CisJICAgICAgZ2VuX3R5cGVfZG9jdW1lbnRhdGlvbihmZCwgdCwgcCwgbnMsIG5zMSk7CisgICAgICAgICAgICAgIGZwcmludGYoZmQsICIgICA8c2VxdWVuY2U+XG4iKTsKKwkgICAgICBnZW5fc2NoZW1hX2VsZW1lbnRzKGZkLCBwLT5pbmZvLnR5cCwgbnMsIG5zMSk7CisgICAgICAgICAgICAgIGZwcmludGYoZmQsICIgICA8L3NlcXVlbmNlPlxuIik7CisJICAgICAgZ2VuX3NjaGVtYV9hdHRyaWJ1dGVzKGZkLCBwLT5pbmZvLnR5cCwgbnMsIG5zMSk7CisgICAgICAgICAgICAgIGZwcmludGYoZmQsICIgIDwvY29tcGxleFR5cGU+XG4iKTsKKyAgICAgICAgICAgIH0KKwkgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgZmZsdXNoKGZkKTsKKyAgZm9yIChuID0gVHB0cltUYXJyYXldOyBuOyBuID0gbi0+bmV4dCkKKyAgeyBpZiAoaXNfdHJhbnNpZW50KG4pKQorICAgICAgY29udGludWU7CisgICAgZWxzZSBpZiAoMSAvKiB3c2RsICovKQorICAgICAgZnByaW50ZihmZCwgIiAgPGNvbXBsZXhUeXBlIG5hbWU9XCIlc1wiPlxuICAgPGNvbXBsZXhDb250ZW50PlxuICAgIDxyZXN0cmljdGlvbiBiYXNlPVwiU09BUC1FTkM6QXJyYXlcIj5cbiAgICAgPGF0dHJpYnV0ZSByZWY9XCJTT0FQLUVOQzphcnJheVR5cGVcIiBXU0RMOmFycmF5VHlwZT1cIiVzW11cIi8+XG4gICAgPC9yZXN0cmljdGlvbj5cbiAgIDwvY29tcGxleENvbnRlbnQ+XG4gIDwvY29tcGxleFR5cGU+XG4iLCBjX2lkZW50KG4pLCB3c2RsX3R5cGUobi0+cmVmLCBuczEpKTsKKyAgICBlbHNlCisgICAgICBmcHJpbnRmKGZkLCAiICA8Y29tcGxleFR5cGUgbmFtZT1cIiVzXCI+XG4gICA8Y29tcGxleENvbnRlbnQ+XG4gICAgPHJlc3RyaWN0aW9uIGJhc2U9XCJTT0FQLUVOQzpBcnJheVwiPlxuICAgICA8ZWxlbWVudCBuYW1lPVwiaXRlbVwiIHR5cGU9XCIlc1wiIG1heE9jY3Vycz1cInVuYm91bmRlZFwiLz5cbiAgICA8L3Jlc3RyaWN0aW9uPlxuICAgPC9jb21wbGV4Q29udGVudD5cbiAgPC9jb21wbGV4VHlwZT5cbiIsIGNfaWRlbnQobiksIHhzaV90eXBlKG4tPnJlZikpOworICAgIGZmbHVzaChmZCk7CisgIH0KKyAgZ2VuX3NjaGVtYV9lbGVtZW50c19hdHRyaWJ1dGVzKGZkLCB0LCBucywgbnMxLCBzdHlsZSwgZW5jb2RpbmcpOworICBmcHJpbnRmKGZkLCAiIDwvc2NoZW1hPlxuXG4iKTsKK30KKwordm9pZAorZ2VuX3NjaGVtYV9lbGVtZW50cyhGSUxFICpmZCwgVG5vZGUgKnAsIGNoYXIgKm5zLCBjaGFyICpuczEpCit7IEVudHJ5ICpxOworICBmb3IgKHEgPSAoKFRhYmxlKilwLT5yZWYpLT5saXN0OyBxOyBxID0gcS0+bmV4dCkKKyAgICBpZiAoZ2VuX3NjaGVtYV9lbGVtZW50KGZkLCBxLCBucywgbnMxKSkKKyAgICAgIHEgPSBxLT5uZXh0OworfQorCitpbnQKK2dlbl9zY2hlbWFfZWxlbWVudChGSUxFICpmZCwgRW50cnkgKnEsIGNoYXIgKm5zLCBjaGFyICpuczEpCit7IGNoYXIgKnMsICp0OworICAgICAgaWYgKGlzX3RyYW5zaWVudChxLT5pbmZvLnR5cCkgfHwgKHEtPmluZm8uc3RvICYgU2F0dHJpYnV0ZSkgfHwgcS0+aW5mby50eXAtPnR5cGUgPT0gVGZ1biB8fCBxLT5pbmZvLnR5cC0+dHlwZSA9PSBUdW5pb24pCisgICAgICAgIHJldHVybiAwOworICAgICAgaWYgKGlzX3JlcGV0aXRpb24ocSkpCisgICAgICB7IHQgPSBuc19jb252ZXJ0KHEtPm5leHQtPnN5bS0+bmFtZSk7CisgICAgICAgIGlmICgocyA9IHN0cmNocih0LCAnOicpKSkgLyogJiYgIWhhc19uc19lcShucywgcS0+bmV4dC0+c3ltLT5uYW1lKSkgKi8KKwl7IGlmICgoKFRub2RlKilxLT5uZXh0LT5pbmZvLnR5cC0+cmVmKS0+dHlwZSA9PSBUcG9pbnRlcikKKyAgICAgICAgICAgIGlmIChxLT5pbmZvLm1heE9jY3VycyA9PSAxKQorCSAgICAgIGZwcmludGYoZmQsICIgICAgIDxlbGVtZW50IHJlZj1cIiVzXCIgbWluT2NjdXJzPVwiJWxkXCIgbWF4T2NjdXJzPVwidW5ib3VuZGVkXCIgbmlsbGFibGU9XCIlc1wiLz5cbiIsIHQsIHEtPmluZm8ubWluT2NjdXJzLCBuaWxsYWJsZShxLT5pbmZvLm1pbk9jY3VycykpOworICAgICAgICAgICAgZWxzZQorCSAgICAgIGZwcmludGYoZmQsICIgICAgIDxlbGVtZW50IHJlZj1cIiVzXCIgbWluT2NjdXJzPVwiJWxkXCIgbWF4T2NjdXJzPVwiJWxkXCIgbmlsbGFibGU9XCIlc1wiLz5cbiIsIHQsIHEtPmluZm8ubWluT2NjdXJzLCBxLT5pbmZvLm1heE9jY3VycywgbmlsbGFibGUocS0+aW5mby5taW5PY2N1cnMpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICBpZiAocS0+aW5mby5tYXhPY2N1cnMgPT0gMSkKKyAgICAgICAgICAgICAgZnByaW50ZihmZCwgIiAgICAgPGVsZW1lbnQgcmVmPVwiJXNcIiBtaW5PY2N1cnM9XCIlbGRcIiBtYXhPY2N1cnM9XCJ1bmJvdW5kZWRcIi8+XG4iLCB0LCBxLT5pbmZvLm1pbk9jY3Vycyk7CisJICAgIGVsc2UKKyAgICAgICAgICAgICAgZnByaW50ZihmZCwgIiAgICAgPGVsZW1lbnQgcmVmPVwiJXNcIiBtaW5PY2N1cnM9XCIlbGRcIiBtYXhPY2N1cnM9XCIlbGRcIi8+XG4iLCB0LCBxLT5pbmZvLm1pbk9jY3VycywgcS0+aW5mby5tYXhPY2N1cnMpOworCX0KKwllbHNlCisJeyBpZiAocykgcysrOyBlbHNlIHMgPSB0OworCSAgaWYgKCgoVG5vZGUqKXEtPm5leHQtPmluZm8udHlwLT5yZWYpLT50eXBlID09IFRwb2ludGVyKQorICAgICAgICAgICAgaWYgKHEtPmluZm8ubWF4T2NjdXJzID09IDEpCisJICAgICAgZnByaW50ZihmZCwgIiAgICAgPGVsZW1lbnQgbmFtZT1cIiVzXCIgdHlwZT1cIiVzXCIgbWluT2NjdXJzPVwiJWxkXCIgbWF4T2NjdXJzPVwidW5ib3VuZGVkXCIgbmlsbGFibGU9XCIlc1wiLz5cbiIsIHMsIHdzZGxfdHlwZShxLT5uZXh0LT5pbmZvLnR5cC0+cmVmLCBuczEpLCBxLT5pbmZvLm1pbk9jY3VycywgbmlsbGFibGUocS0+aW5mby5taW5PY2N1cnMpKTsKKyAgICAgICAgICAgIGVsc2UKKwkgICAgICBmcHJpbnRmKGZkLCAiICAgICA8ZWxlbWVudCBuYW1lPVwiJXNcIiB0eXBlPVwiJXNcIiBtaW5PY2N1cnM9XCIlbGRcIiBtYXhPY2N1cnM9XCIlbGRcIiBuaWxsYWJsZT1cIiVzXCIvPlxuIiwgcywgd3NkbF90eXBlKHEtPm5leHQtPmluZm8udHlwLT5yZWYsIG5zMSksIHEtPmluZm8ubWluT2NjdXJzLCBxLT5pbmZvLm1heE9jY3VycywgbmlsbGFibGUocS0+aW5mby5taW5PY2N1cnMpKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBpZiAocS0+aW5mby5tYXhPY2N1cnMgPT0gMSkKKyAgICAgICAgICAgICAgZnByaW50ZihmZCwgIiAgICAgPGVsZW1lbnQgbmFtZT1cIiVzXCIgdHlwZT1cIiVzXCIgbWluT2NjdXJzPVwiJWxkXCIgbWF4T2NjdXJzPVwidW5ib3VuZGVkXCIvPlxuIiwgcywgd3NkbF90eXBlKHEtPm5leHQtPmluZm8udHlwLT5yZWYsIG5zMSksIHEtPmluZm8ubWluT2NjdXJzKTsKKwkgICAgZWxzZQorICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgICA8ZWxlbWVudCBuYW1lPVwiJXNcIiB0eXBlPVwiJXNcIiBtaW5PY2N1cnM9XCIlbGRcIiBtYXhPY2N1cnM9XCIlbGRcIi8+XG4iLCBzLCB3c2RsX3R5cGUocS0+bmV4dC0+aW5mby50eXAtPnJlZiwgbnMxKSwgcS0+aW5mby5taW5PY2N1cnMsIHEtPmluZm8ubWF4T2NjdXJzKTsKKwl9CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgICAgZWxzZSBpZiAocS0+aW5mby50eXAtPnR5cGUgPT0gVHRlbXBsYXRlIHx8IHEtPmluZm8udHlwLT50eXBlID09IFRwb2ludGVyICYmICgoVG5vZGUqKXEtPmluZm8udHlwLT5yZWYpLT50eXBlID09IFR0ZW1wbGF0ZSB8fCBxLT5pbmZvLnR5cC0+dHlwZSA9PSBUcmVmZXJlbmNlICYmICgoVG5vZGUqKXEtPmluZm8udHlwLT5yZWYpLT50eXBlID09IFR0ZW1wbGF0ZSkKKyAgICAgIHsgdCA9IG5zX2NvbnZlcnQocS0+c3ltLT5uYW1lKTsKKyAgICAgICAgaWYgKChzID0gc3RyY2hyKHQsICc6JykpKSAvKiAmJiAhaGFzX25zX2VxKG5zLCBxLT5zeW0tPm5hbWUpKSAqLworCXsgaWYgKCgoVG5vZGUqKXEtPmluZm8udHlwLT5yZWYpLT50eXBlID09IFRwb2ludGVyKQorICAgICAgICAgICAgaWYgKHEtPmluZm8ubWF4T2NjdXJzID09IDEpCisJICAgICAgZnByaW50ZihmZCwgIiAgICAgPGVsZW1lbnQgcmVmPVwiJXNcIiBtaW5PY2N1cnM9XCIlbGRcIiBtYXhPY2N1cnM9XCJ1bmJvdW5kZWRcIiBuaWxsYWJsZT1cIiVzXCIvPlxuIiwgdCwgcS0+aW5mby5taW5PY2N1cnMsIG5pbGxhYmxlKHEtPmluZm8ubWluT2NjdXJzKSk7CisgICAgICAgICAgICBlbHNlCisJICAgICAgZnByaW50ZihmZCwgIiAgICAgPGVsZW1lbnQgcmVmPVwiJXNcIiBtaW5PY2N1cnM9XCIlbGRcIiBtYXhPY2N1cnM9XCIlbGRcIiBuaWxsYWJsZT1cIiVzXCIvPlxuIiwgdCwgcS0+aW5mby5taW5PY2N1cnMsIHEtPmluZm8ubWF4T2NjdXJzLCBuaWxsYWJsZShxLT5pbmZvLm1pbk9jY3VycykpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgIGlmIChxLT5pbmZvLm1heE9jY3VycyA9PSAxKQorICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgICA8ZWxlbWVudCByZWY9XCIlc1wiIG1pbk9jY3Vycz1cIiVsZFwiIG1heE9jY3Vycz1cInVuYm91bmRlZFwiLz5cbiIsIHQsIHEtPmluZm8ubWluT2NjdXJzKTsKKwkgICAgZWxzZQorICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgICA8ZWxlbWVudCByZWY9XCIlc1wiIG1pbk9jY3Vycz1cIiVsZFwiIG1heE9jY3Vycz1cIiVsZFwiLz5cbiIsIHQsIHEtPmluZm8ubWluT2NjdXJzLCBxLT5pbmZvLm1heE9jY3Vycyk7CisJfQorCWVsc2UKKwl7IGlmIChzKSBzKys7IGVsc2UgcyA9IHQ7CisJICBpZiAoKChUbm9kZSopcS0+aW5mby50eXAtPnJlZiktPnR5cGUgPT0gVHBvaW50ZXIpCisgICAgICAgICAgICBpZiAocS0+aW5mby5tYXhPY2N1cnMgPT0gMSkKKwkgICAgICBmcHJpbnRmKGZkLCAiICAgICA8ZWxlbWVudCBuYW1lPVwiJXNcIiB0eXBlPVwiJXNcIiBtaW5PY2N1cnM9XCIlbGRcIiBtYXhPY2N1cnM9XCJ1bmJvdW5kZWRcIiBuaWxsYWJsZT1cIiVzXCIvPlxuIiwgcywgd3NkbF90eXBlKHEtPmluZm8udHlwLT5yZWYsIG5zMSksIHEtPmluZm8ubWluT2NjdXJzLCBuaWxsYWJsZShxLT5pbmZvLm1pbk9jY3VycykpOworICAgICAgICAgICAgZWxzZQorCSAgICAgIGZwcmludGYoZmQsICIgICAgIDxlbGVtZW50IG5hbWU9XCIlc1wiIHR5cGU9XCIlc1wiIG1pbk9jY3Vycz1cIiVsZFwiIG1heE9jY3Vycz1cIiVsZFwiIG5pbGxhYmxlPVwiJXNcIi8+XG4iLCBzLCB3c2RsX3R5cGUocS0+aW5mby50eXAtPnJlZiwgbnMxKSwgcS0+aW5mby5taW5PY2N1cnMsIHEtPmluZm8ubWF4T2NjdXJzLCBuaWxsYWJsZShxLT5pbmZvLm1pbk9jY3VycykpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmIChxLT5pbmZvLm1heE9jY3VycyA9PSAxKQorICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgICA8ZWxlbWVudCBuYW1lPVwiJXNcIiB0eXBlPVwiJXNcIiBtaW5PY2N1cnM9XCIlbGRcIiBtYXhPY2N1cnM9XCJ1bmJvdW5kZWRcIi8+XG4iLCBzLCB3c2RsX3R5cGUocS0+aW5mby50eXAtPnJlZiwgbnMxKSwgcS0+aW5mby5taW5PY2N1cnMpOworCSAgICBlbHNlCisgICAgICAgICAgICAgIGZwcmludGYoZmQsICIgICAgIDxlbGVtZW50IG5hbWU9XCIlc1wiIHR5cGU9XCIlc1wiIG1pbk9jY3Vycz1cIiVsZFwiIG1heE9jY3Vycz1cIiVsZFwiLz5cbiIsIHMsIHdzZGxfdHlwZShxLT5pbmZvLnR5cC0+cmVmLCBuczEpLCBxLT5pbmZvLm1pbk9jY3VycywgcS0+aW5mby5tYXhPY2N1cnMpOworCX0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGlzX2FueXR5cGUocSkpIC8qIC4uLiBtYXliZSBuZWVkIHRvIHNob3cgYWxsIHBvc3NpYmxlIHR5cGVzIHJhdGhlciB0aGFuIHhzZDphbnlUeXBlICovCisgICAgICB7IGZwcmludGYoZmQsICIgICAgIDxlbGVtZW50IG5hbWU9XCIlc1wiIHR5cGU9XCJ4c2Q6YW55VHlwZVwiIG1pbk9jY3Vycz1cIiVsZFwiIG1heE9jY3Vycz1cIiVsZFwiIG5pbGxhYmxlPVwiJXNcIi8+XG4iLCBuc19jb252ZXJ0KHEtPm5leHQtPnN5bS0+bmFtZSksIHEtPmluZm8ubWluT2NjdXJzLCBxLT5pbmZvLm1heE9jY3VycywgbmlsbGFibGUocS0+aW5mby5taW5PY2N1cnMpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgICBlbHNlIGlmIChpc19jaG9pY2UocSkpCisgICAgICB7IGlmIChxLT5pbmZvLm1pbk9jY3VycyA9PSAwKQorICAgICAgICAgIGZwcmludGYoZmQsICIgICAgPGNob2ljZSBtaW5PY2N1cnM9XCIwXCIgbWF4T2NjdXJzPVwiMVwiPlxuIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgIDxjaG9pY2U+XG4iKTsKKwlpZiAocS0+bmV4dC0+aW5mby50eXAtPnJlZikKKwkgIGdlbl9zY2hlbWFfZWxlbWVudHMoZmQsIHEtPm5leHQtPmluZm8udHlwLCBucywgbnMxKTsKKyAgICAgICAgZnByaW50ZihmZCwgIiAgICA8L2Nob2ljZT5cbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgdCA9IG5zX2NvbnZlcnQocS0+c3ltLT5uYW1lKTsKKyAgICAgICAgaWYgKChzID0gc3RyY2hyKHQsICc6JykpKSAvKiAmJiAhaGFzX25zX2VxKG5zLCBxLT5zeW0tPm5hbWUpKSAqLworCXsgaWYgKHEtPmluZm8udHlwLT50eXBlID09IFRwb2ludGVyIHx8IHEtPmluZm8udHlwLT50eXBlID09IFRhcnJheSB8fCBpc19keW5hbWljX2FycmF5KHEtPmluZm8udHlwKSkKKyAgICAgICAgICAgIGZwcmludGYoZmQsICIgICAgIDxlbGVtZW50IHJlZj1cIiVzXCIgbWluT2NjdXJzPVwiJWxkXCIgbWF4T2NjdXJzPVwiJWxkXCIgbmlsbGFibGU9XCIlc1wiJXMvPlxuIiwgdCwgcS0+aW5mby5taW5PY2N1cnMsIHEtPmluZm8ubWF4T2NjdXJzLCBuaWxsYWJsZShxLT5pbmZvLm1pbk9jY3VycyksIGRlZmF1bHRfdmFsdWUocSwgImRlZmF1bHQiKSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZnByaW50ZihmZCwgIiAgICAgPGVsZW1lbnQgcmVmPVwiJXNcIiBtaW5PY2N1cnM9XCIlbGRcIiBtYXhPY2N1cnM9XCIlbGRcIiVzLz5cbiIsIHQsIHEtPmluZm8ubWluT2NjdXJzLCBxLT5pbmZvLm1heE9jY3VycywgZGVmYXVsdF92YWx1ZShxLCAiZGVmYXVsdCIpKTsKKwl9CisgICAgICAgIGVsc2UKKwl7IGlmIChzKSBzKys7IGVsc2UgcyA9IHQ7CisJICBpZiAocS0+aW5mby50eXAtPnR5cGUgPT0gVHBvaW50ZXIgfHwgcS0+aW5mby50eXAtPnR5cGUgPT0gVGFycmF5IHx8IGlzX2R5bmFtaWNfYXJyYXkocS0+aW5mby50eXApKQorICAgICAgICAgICAgZnByaW50ZihmZCwgIiAgICAgPGVsZW1lbnQgbmFtZT1cIiVzXCIgdHlwZT1cIiVzXCIgbWluT2NjdXJzPVwiJWxkXCIgbWF4T2NjdXJzPVwiJWxkXCIgbmlsbGFibGU9XCIlc1wiJXMvPlxuIiwgcywgd3NkbF90eXBlKHEtPmluZm8udHlwLCBuczEpLCBxLT5pbmZvLm1pbk9jY3VycywgcS0+aW5mby5tYXhPY2N1cnMsIG5pbGxhYmxlKHEtPmluZm8ubWluT2NjdXJzKSwgZGVmYXVsdF92YWx1ZShxLCAiZGVmYXVsdCIpKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgICA8ZWxlbWVudCBuYW1lPVwiJXNcIiB0eXBlPVwiJXNcIiBtaW5PY2N1cnM9XCIlbGRcIiBtYXhPY2N1cnM9XCIlbGRcIiVzLz5cbiIsIHMsIHdzZGxfdHlwZShxLT5pbmZvLnR5cCwgbnMxKSwgcS0+aW5mby5taW5PY2N1cnMsIHEtPmluZm8ubWF4T2NjdXJzLCBkZWZhdWx0X3ZhbHVlKHEsICJkZWZhdWx0IikpOworICAgICAgICB9CisgICAgICB9CisgICAgICBmZmx1c2goZmQpOworICByZXR1cm4gMDsKK30KKwordm9pZAorZ2VuX3NjaGVtYV9lbGVtZW50c19hdHRyaWJ1dGVzKEZJTEUgKmZkLCBUYWJsZSAqdCwgY2hhciAqbnMsIGNoYXIgKm5zMSwgY2hhciAqc3R5bGUsIGNoYXIgKmVuY29kaW5nKQoreyBFbnRyeSAqcCwgKnEsICplOworICBUYWJsZSAqcjsKKyAgU2VydmljZSAqc3A7CisgIE1ldGhvZCAqbTsKKyAgY2hhciAqbWV0aG9kX3N0eWxlLCAqbWV0aG9kX2VuY29kaW5nLCAqbWV0aG9kX3Jlc3BvbnNlX2VuY29kaW5nOworICBpbnQgYWxsID0gIXN0cmNtcChucywgbnMxKTsKKyAgciA9IG1rdGFibGUoTlVMTCk7CisgIGZvciAocCA9IGNsYXNzdGFibGUtPmxpc3Q7IHA7IHAgPSBwLT5uZXh0KQorICB7IGlmICghcC0+aW5mby50eXAtPnJlZiB8fCAvKiBpc19pbnZpc2libGUocC0+aW5mby50eXAtPmlkLT5uYW1lKSB8fCAqLyBpc190cmFuc2llbnQocC0+aW5mby50eXApIHx8IGlzX3ByaW1jbGFzcyhwLT5pbmZvLnR5cCkgfHwgaXNfZHluYW1pY19hcnJheShwLT5pbmZvLnR5cCkpCisgICAgICBjb250aW51ZTsKKyAgICBmb3IgKHEgPSAoKFRhYmxlKilwLT5pbmZvLnR5cC0+cmVmKS0+bGlzdDsgcTsgcSA9IHEtPm5leHQpCisgICAgeyBpZiAoIWlzX3JlcGV0aXRpb24ocSkgJiYgIWlzX2FueXR5cGUocSkgJiYgaGFzX25zX2VxKG5zLCBxLT5zeW0tPm5hbWUpICYmICFpc190cmFuc2llbnQocS0+aW5mby50eXApICYmIHEtPmluZm8udHlwLT50eXBlICE9IFRmdW4pCisgICAgICB7IGUgPSBlbnRyeShyLCBxLT5zeW0pOworICAgICAgICBpZiAoZSkKKwl7IGlmICgoZS0+aW5mby5zdG8gJiBTYXR0cmlidXRlKSAhPSAocS0+aW5mby5zdG8gJiBTYXR0cmlidXRlKXx8IHJlZnR5cGUoZS0+aW5mby50eXApICE9IHJlZnR5cGUocS0+aW5mby50eXApKQorICAgICAgICAgIHsgc3ByaW50ZihlcnJidWYsICJGaWVsZCAnJXMnIG9mIHR5cGUgJyVzJyBhdCBsaW5lICVkIGhhcyBhIHR5cGUgdGhhdCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIHRoZSByZXF1aXJlZCB1bmlxdWUgdHlwZSAnJXMnIGRlZmluZWQgZm9yIGVsZW1lbnRzICc8JXM+JyBpbiB0aGUgV1NETCBuYW1lc3BhY2UgYmFzZWQgb24gbGl0ZXJhbCBlbmNvZGluZzogdXNlIFNPQVAgUlBDIGVuY29kaW5nIG9yIHJlbmFtZSBvciB1c2UgYSBuYW1lc3BhY2UgcXVhbGlmaWVyIiwgcS0+c3ltLT5uYW1lLCBjX3R5cGUocS0+aW5mby50eXApLCBxLT5saW5lbm8sIGNfdHlwZShlLT5pbmZvLnR5cCksIG5zX2NvbnZlcnQocS0+c3ltLT5uYW1lKSk7CisgICAgICAgICAgICBzZW13YXJuKGVycmJ1Zik7CisJICB9CisJfQorICAgICAgICBlbHNlCisJeyBpZiAocS0+aW5mby5zdG8gJiBTYXR0cmlidXRlKQorCSAgICBmcHJpbnRmKGZkLCAiICA8YXR0cmlidXRlIG5hbWU9XCIlc1wiIHR5cGU9XCIlc1wiLz5cbiIsIG5zX3JlbW92ZShxLT5zeW0tPm5hbWUpLCB3c2RsX3R5cGUocS0+aW5mby50eXAsIG5zMSkpOworCSAgZWxzZQkKKwkgICAgZnByaW50ZihmZCwgIiAgPGVsZW1lbnQgbmFtZT1cIiVzXCIgdHlwZT1cIiVzXCIvPlxuIiwgbnNfcmVtb3ZlKHEtPnN5bS0+bmFtZSksIHdzZGxfdHlwZShxLT5pbmZvLnR5cCwgbnMxKSk7CisJICBlID0gZW50ZXIociwgcS0+c3ltKTsKKwkgIGUtPmluZm8gPSBxLT5pbmZvOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmICh0ICYmIGFsbCkKKyAgeyBmb3IgKHAgPSB0LT5saXN0OyBwOyBwID0gcC0+bmV4dCkKKyAgICB7IGlmIChwLT5pbmZvLnR5cC0+dHlwZSA9PSBUZnVuICYmICFpc19pbnZpc2libGUocC0+c3ltLT5uYW1lKSAmJiAhKHAtPmluZm8uc3RvICYgU2V4dGVybikgJiYgaGFzX25zX2VxKG5zLCBwLT5zeW0tPm5hbWUpKQorICAgICAgeyBtZXRob2RfZW5jb2RpbmcgPSBlbmNvZGluZzsKKwltZXRob2RfcmVzcG9uc2VfZW5jb2RpbmcgPSBOVUxMOworCW1ldGhvZF9zdHlsZSA9IHN0eWxlOworCWZvciAoc3AgPSBzZXJ2aWNlczsgc3A7IHNwID0gc3AtPm5leHQpCisJICBpZiAoIXN0cmNtcChzcC0+bnMsIG5zKSkKKwkgICAgZm9yIChtID0gc3AtPmxpc3Q7IG07IG0gPSBtLT5uZXh0KQorCSAgICAgIGlmIChpc19lcV9ub25zKG0tPm5hbWUsIHAtPnN5bS0+bmFtZSkpCisgICAgICAgICAgICAgICAgaWYgKG0tPm1lc3MgPT0gRU5DT0RJTkcpCisJICAgICAgICAgIG1ldGhvZF9lbmNvZGluZyA9IG0tPnBhcnQ7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobS0+bWVzcyA9PSBSRVNQT05TRV9FTkNPRElORykKKwkgICAgICAgICAgbWV0aG9kX3Jlc3BvbnNlX2VuY29kaW5nID0gbS0+cGFydDsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChtLT5tZXNzID09IFNUWUxFKQorCSAgICAgICAgICBtZXRob2Rfc3R5bGUgPSBtLT5wYXJ0OworCWlmICghZWZsYWcpCisJeyBpZiAoIW1ldGhvZF9yZXNwb25zZV9lbmNvZGluZykKKyAgICAgICAgICAgIG1ldGhvZF9yZXNwb25zZV9lbmNvZGluZyA9IG1ldGhvZF9lbmNvZGluZzsKKyAgICAgICAgICBxID0gZW50cnkoY2xhc3N0YWJsZSwgcC0+c3ltKTsKKyAgICAgICAgICBpZiAocSkKKwkgIHsgaWYgKGlzX2RvY3VtZW50KG1ldGhvZF9zdHlsZSkpCisgICAgICAgICAgICB7IGZwcmludGYoZmQsICIgIDwhLS0gb3BlcmF0aW9uIHJlcXVlc3QgZWxlbWVudCAtLT5cbiIpOworCSAgICAgIGZwcmludGYoZmQsICIgIDxlbGVtZW50IG5hbWU9XCIlc1wiPlxuICAgPGNvbXBsZXhUeXBlPlxuICAgIDxzZXF1ZW5jZT5cbiIsIG5zX3JlbW92ZShwLT5zeW0tPm5hbWUpKTsKKwkgICAgICBnZW5fc2NoZW1hX2VsZW1lbnRzKGZkLCBxLT5pbmZvLnR5cCwgbnMsIG5zMSk7CisJICAgICAgZnByaW50ZihmZCwgIiAgICA8L3NlcXVlbmNlPlxuIik7CisJICAgICAgZ2VuX3NjaGVtYV9hdHRyaWJ1dGVzKGZkLCBxLT5pbmZvLnR5cCwgbnMsIG5zMSk7CisJICAgICAgZnByaW50ZihmZCwgIiAgIDwvY29tcGxleFR5cGU+XG4gIDwvZWxlbWVudD5cbiIpOworCSAgICB9CisJICAgIGVsc2UgaWYgKGlzX2xpdGVyYWwobWV0aG9kX2VuY29kaW5nKSkKKwkgICAgeyBmb3IgKHEgPSAoKFRhYmxlKilxLT5pbmZvLnR5cC0+cmVmKS0+bGlzdDsgcTsgcSA9IHEtPm5leHQpCisgICAgICAgICAgICAgIHsgaWYgKCFpc19yZXBldGl0aW9uKHEpICYmICFpc19hbnl0eXBlKHEpICYmICFoYXNfbnNfZXEoTlVMTCwgcS0+c3ltLT5uYW1lKSAmJiAhaXNfdHJhbnNpZW50KHEtPmluZm8udHlwKSAmJiBxLT5pbmZvLnR5cC0+dHlwZSAhPSBUZnVuICYmICEocS0+aW5mby5zdG8gJiBTYXR0cmlidXRlKSkKKyAgICAgICAgICAgICAgICB7IGUgPSBlbnRyeShyLCBxLT5zeW0pOworICAgICAgICAgICAgICAgICAgaWYgKGUpCisJICAgICAgICAgIHsgaWYgKChlLT5pbmZvLnN0byAmIFNhdHRyaWJ1dGUpICE9IChxLT5pbmZvLnN0byAmIFNhdHRyaWJ1dGUpfHwgcmVmdHlwZShlLT5pbmZvLnR5cCkgIT0gcmVmdHlwZShxLT5pbmZvLnR5cCkpCisgICAgICAgICAgICAgICAgICAgIHsgc3ByaW50ZihlcnJidWYsICJQYXJhbWV0ZXIgJyVzJyBvZiB0eXBlICclcycgYXQgbGluZSAlZCBoYXMgYSB0eXBlIHRoYXQgZG9lcyBub3QgY29ycmVzcG9uZCB0byB0aGUgcmVxdWlyZWQgdW5pcXVlIHR5cGUgJyVzJyBkZWZpbmVkIGZvciBlbGVtZW50cyAnPCVzPicgaW4gdGhlIFdTREwgbmFtZXNwYWNlIGJhc2VkIG9uIGxpdGVyYWwgZW5jb2Rpbmc6IHVzZSBTT0FQIFJQQyBlbmNvZGluZyBvciByZW5hbWUgb3IgdXNlIGEgbmFtZXNwYWNlIHF1YWxpZmllciIsIHEtPnN5bS0+bmFtZSwgY190eXBlKHEtPmluZm8udHlwKSwgcS0+bGluZW5vLCBjX3R5cGUoZS0+aW5mby50eXApLCBuc19jb252ZXJ0KHEtPnN5bS0+bmFtZSkpOworICAgICAgICAgICAgICAgICAgICAgIHNlbXdhcm4oZXJyYnVmKTsKKwkgICAgICAgICAgICB9CisJICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHsgZnByaW50ZihmZCwgIiAgPCEtLSBvcGVyYXRpb24gcmVxdWVzdCBlbGVtZW50IC0tPlxuIik7CisJICAgICAgICAgICAgZnByaW50ZihmZCwgIiAgPGVsZW1lbnQgbmFtZT1cIiVzXCIgdHlwZT1cIiVzXCIvPlxuIiwgbnNfcmVtb3ZlKHEtPnN5bS0+bmFtZSksIHdzZGxfdHlwZShxLT5pbmZvLnR5cCwgbnMxKSk7CisJICAgICAgICAgICAgZSA9IGVudGVyKHIsIHEtPnN5bSk7CisJCSAgICBlLT5pbmZvID0gcS0+aW5mbzsKKwkgICAgICAgICAgfQorCSAgICAgICAgfQorCSAgICAgIH0KKwkgICAgfQorICAgICAgICAgICAgcSA9IChFbnRyeSopcC0+aW5mby50eXAtPnJlZjsKKyAgICAgICAgICAgIGlmIChxICYmICFpc190cmFuc2llbnQocS0+aW5mby50eXApKQorICAgICAgICAgICAgeyBpZiAoIWlzX3Jlc3BvbnNlKHEtPmluZm8udHlwKSkKKwkgICAgICB7IGlmIChpc19kb2N1bWVudChtZXRob2Rfc3R5bGUpKQorICAgICAgICAgICAgICAgIHsgZnByaW50ZihmZCwgIiAgPCEtLSBvcGVyYXRpb24gcmVzcG9uc2UgZWxlbWVudCAtLT5cbiIpOworCSAgICAgICAgICBmcHJpbnRmKGZkLCAiICA8ZWxlbWVudCBuYW1lPVwiJXNSZXNwb25zZVwiPlxuICAgPGNvbXBsZXhUeXBlPlxuICAgIDxzZXF1ZW5jZT5cbiIsIG5zX3JlbW92ZShwLT5zeW0tPm5hbWUpKTsKKwkgICAgICAgICAgZ2VuX3NjaGVtYV9lbGVtZW50KGZkLCBxLCBucywgbnMxKTsKKwkgICAgICAgICAgZnByaW50ZihmZCwgIiAgICA8L3NlcXVlbmNlPlxuIik7CisJICAgICAgICAgIGZwcmludGYoZmQsICIgICA8L2NvbXBsZXhUeXBlPlxuICA8L2VsZW1lbnQ+XG4iKTsKKwkJfQorICAJICAgICAgICBlbHNlIGlmIChpc19saXRlcmFsKG1ldGhvZF9yZXNwb25zZV9lbmNvZGluZykpCisgICAgICAgICAgICAgICAgeyBlID0gZW50cnkociwgcS0+c3ltKTsKKyAgICAgICAgICAgICAgICAgIGlmIChlKQorCSAgICAgICAgICB7IGlmICgoZS0+aW5mby5zdG8gJiBTYXR0cmlidXRlKSAhPSAocS0+aW5mby5zdG8gJiBTYXR0cmlidXRlKXx8IHJlZnR5cGUoZS0+aW5mby50eXApICE9IHJlZnR5cGUocS0+aW5mby50eXApKQorICAgICAgICAgICAgICAgICAgICB7IHNwcmludGYoZXJyYnVmLCAiUXVhbGlmaWVkIGZpZWxkICclcycgaGFzIGEgdHlwZSB0aGF0IGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gdGhlIHVuaXF1ZSB0eXBlICclcycgZGVmaW5lZCBmb3IgZWxlbWVudHMgJzwlcz4nIiwgcS0+c3ltLT5uYW1lLCBjX3R5cGUocS0+aW5mby50eXApLCBuc19jb252ZXJ0KHEtPnN5bS0+bmFtZSkpOworICAgICAgICAgICAgICAgICAgICAgIHNlbXdhcm4oZXJyYnVmKTsKKwkgICAgICAgICAgICB9CisJICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHsgZnByaW50ZihmZCwgIiAgPCEtLSBvcGVyYXRpb24gcmVzcG9uc2UgZWxlbWVudCAtLT5cbiIpOworCSAgICAgICAgICAgIGZwcmludGYoZmQsICIgIDxlbGVtZW50IG5hbWU9XCIlc1wiIHR5cGU9XCIlc1wiLz5cbiIsIG5zX3JlbW92ZShxLT5zeW0tPm5hbWUpLCB3c2RsX3R5cGUocS0+aW5mby50eXAsIG5zMSkpOworCSAgICAgICAgICAgIGUgPSBlbnRlcihyLCBxLT5zeW0pOworCQkgICAgZS0+aW5mbyA9IHEtPmluZm87CisJICAgICAgICAgIH0KKwkgICAgICAgIH0KKwkgICAgICB9CisgICAgICAgICAgICAgIGVsc2UgaWYgKCgoVG5vZGUqKXEtPmluZm8udHlwLT5yZWYpLT5yZWYpCisJICAgICAgeyBpZiAoaXNfZG9jdW1lbnQobWV0aG9kX3N0eWxlKSkKKwkgICAgICAgIHsgaWYgKCFoYXNfbnNfZXEoTlVMTCwgcS0+c3ltLT5uYW1lKSkKKwkJICB7IGUgPSBlbnRyeShyLCAoKFRub2RlKilxLT5pbmZvLnR5cC0+cmVmKS0+aWQpOworCQkgICAgaWYgKCFlKQorICAgICAgICAgICAgICAgICAgICB7IGZwcmludGYoZmQsICIgIDwhLS0gb3BlcmF0aW9uIHJlc3BvbnNlIGVsZW1lbnQgLS0+XG4iKTsKKwkJICAgICAgZnByaW50ZihmZCwgIiAgPGVsZW1lbnQgbmFtZT1cIiVzXCI+XG4gICA8Y29tcGxleFR5cGU+XG4gICAgPHNlcXVlbmNlPlxuIiwgbnNfcmVtb3ZlKCgoVG5vZGUqKXEtPmluZm8udHlwLT5yZWYpLT5pZC0+bmFtZSkpOworCSAgICAgICAgICAgICAgZ2VuX3NjaGVtYV9lbGVtZW50cyhmZCwgcS0+aW5mby50eXAtPnJlZiwgbnMsIG5zMSk7CisJICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgIDwvc2VxdWVuY2U+XG4iKTsKKwkgICAgICAgICAgICAgIGdlbl9zY2hlbWFfYXR0cmlidXRlcyhmZCwgcS0+aW5mby50eXAtPnJlZiwgbnMsIG5zMSk7CisJICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgPC9jb21wbGV4VHlwZT5cbiAgPC9lbGVtZW50PlxuIik7CisJCSAgICAgIGUgPSBlbnRlcihyLCAoKFRub2RlKilxLT5pbmZvLnR5cC0+cmVmKS0+aWQpOworCQkgICAgICBlLT5pbmZvID0gcS0+aW5mbzsKKwkJICAgIH0KKwkJICB9CisJCX0KKwkJZWxzZSBpZiAoaXNfbGl0ZXJhbChtZXRob2RfcmVzcG9uc2VfZW5jb2RpbmcpKQorCSAgICAgICAgeyBmb3IgKHEgPSAoKFRhYmxlKikoKFRub2RlKilxLT5pbmZvLnR5cC0+cmVmKS0+cmVmKS0+bGlzdDsgcTsgcSA9IHEtPm5leHQpCisgIAkgICAgICAgICAgeyBpZiAoIWlzX3JlcGV0aXRpb24ocSkgJiYgIWlzX2FueXR5cGUocSkgJiYgIWhhc19uc19lcShOVUxMLCBxLT5zeW0tPm5hbWUpICYmICFpc190cmFuc2llbnQocS0+aW5mby50eXApICYmIHEtPmluZm8udHlwLT50eXBlICE9IFRmdW4gJiYgIShxLT5pbmZvLnN0byAmIFNhdHRyaWJ1dGUpKQorICAgICAgICAgICAgICAgICAgICB7IGUgPSBlbnRyeShyLCBxLT5zeW0pOworICAgICAgICAgICAgICAgICAgICAgIGlmIChlKQorCSAgICAgICAgICAgICAgeyBpZiAoKGUtPmluZm8uc3RvICYgU2F0dHJpYnV0ZSkgIT0gKHEtPmluZm8uc3RvICYgU2F0dHJpYnV0ZSl8fCByZWZ0eXBlKGUtPmluZm8udHlwKSAhPSByZWZ0eXBlKHEtPmluZm8udHlwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgc3ByaW50ZihlcnJidWYsICJRdWFsaWZpZWQgZmllbGQgJyVzJyBoYXMgYSB0eXBlIHRoYXQgZG9lcyBub3QgY29ycmVzcG9uZCB0byB0aGUgdW5pcXVlIHR5cGUgJyVzJyBkZWZpbmVkIGZvciBlbGVtZW50cyAnPCVzPiciLCBxLT5zeW0tPm5hbWUsIGNfdHlwZShxLT5pbmZvLnR5cCksIG5zX2NvbnZlcnQocS0+c3ltLT5uYW1lKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbXdhcm4oZXJyYnVmKTsKKwkgICAgICAgICAgICAgICAgfQorCSAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICB7IGZwcmludGYoZmQsICIgIDwhLS0gb3BlcmF0aW9uIHJlc3BvbnNlIGVsZW1lbnQgLS0+XG4iKTsKKwkgICAgICAgICAgICAgICAgZnByaW50ZihmZCwgIiAgPGVsZW1lbnQgbmFtZT1cIiVzXCIgdHlwZT1cIiVzXCIvPlxuIiwgbnNfcmVtb3ZlKHEtPnN5bS0+bmFtZSksIHdzZGxfdHlwZShxLT5pbmZvLnR5cCwgbnMxKSk7CisJICAgICAgICAgICAgICAgIGUgPSBlbnRlcihyLCBxLT5zeW0pOworCQkgICAgICAgIGUtPmluZm8gPSBxLT5pbmZvOworCSAgICAgICAgICAgICAgfQorCSAgICAgICAgICAgIH0KKwkgICAgICAgICAgfQorCSAgICAgICAgfQorCSAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKHQpCisgIHsgZm9yIChwID0gdC0+bGlzdDsgcDsgcCA9IHAtPm5leHQpCisgICAgeyBpZiAocC0+aW5mby50eXAtPnR5cGUgPT0gVGZ1biAmJiAhKHAtPmluZm8uc3RvICYgU2V4dGVybikgJiYgIWVmbGFnKQorICAgICAgeyBxID0gKEVudHJ5KilwLT5pbmZvLnR5cC0+cmVmOworICAgICAgICBpZiAocSAmJiAhaXNfdHJhbnNpZW50KHEtPmluZm8udHlwKSkKKyAgICAgICAgeyBpZiAoaXNfcmVzcG9uc2UocS0+aW5mby50eXApKQorCSAgeyBpZiAoaGFzX25zX2VxKG5zLCBxLT5zeW0tPm5hbWUpKQorICAgICAgICAgICAgeyBlID0gZW50cnkociwgcS0+c3ltKTsKKyAgICAgICAgICAgICAgaWYgKCFlKQorICAgICAgICAgICAgICB7IGZwcmludGYoZmQsICIgIDwhLS0gb3BlcmF0aW9uIHJlc3BvbnNlIGVsZW1lbnQgLS0+XG4iKTsKKwkgICAgICAgIGZwcmludGYoZmQsICIgIDxlbGVtZW50IG5hbWU9XCIlc1wiIHR5cGU9XCIlc1wiLz5cbiIsIG5zX3JlbW92ZShxLT5zeW0tPm5hbWUpLCB3c2RsX3R5cGUocS0+aW5mby50eXAsIG5zMSkpOworCSAgICAgICAgZSA9IGVudGVyKHIsIHEtPnN5bSk7CisJCWUtPmluZm8gPSBxLT5pbmZvOworCSAgICAgIH0KKwkgICAgfQorCSAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGZyZWV0YWJsZShyKTsKK30KKwordm9pZAorZ2VuX3NjaGVtYV9hdHRyaWJ1dGVzKEZJTEUgKmZkLCBUbm9kZSAqcCwgY2hhciAqbnMsIGNoYXIgKm5zMSkKK3sgRW50cnkgKnE7CisgIGNoYXIgKnQsICpzLCAqcjsKKyAgZm9yIChxID0gKChUYWJsZSopcC0+cmVmKS0+bGlzdDsgcTsgcSA9IHEtPm5leHQpCisgIHsgaWYgKHEtPmluZm8uc3RvICYgU2F0dHJpYnV0ZSkKKyAgICB7IHQgPSBuc19jb252ZXJ0KHEtPnN5bS0+bmFtZSk7CisgICAgICByID0gZGVmYXVsdF92YWx1ZShxLCAidmFsdWUiKTsKKyAgICAgIGlmICgocyA9IHN0cmNocih0LCAnOicpKSkKKyAgICAgIHsgaWYgKHIgJiYgKnIpCisgICAgICAgICAgZnByaW50ZihmZCwgIiAgICAgPGF0dHJpYnV0ZSByZWY9XCIlc1wiIHVzZT1cImRlZmF1bHRcIiVzLz5cbiIsIHQsIHIpOworCWVsc2UgaWYgKHEtPmluZm8udHlwLT50eXBlICE9IFRwb2ludGVyIHx8IHEtPmluZm8ubWluT2NjdXJzKQorICAgICAgICAgIGZwcmludGYoZmQsICIgICAgIDxhdHRyaWJ1dGUgcmVmPVwiJXNcIiB1c2U9XCJyZXF1aXJlZFwiLz5cbiIsIHQpOworCWVsc2UKKyAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgICA8YXR0cmlidXRlIHJlZj1cIiVzXCIgdXNlPVwib3B0aW9uYWxcIi8+XG4iLCB0KTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgaWYgKCFzKQorICAgICAgICAgIHMgPSB0OworICAgICAgICBlbHNlCisJICBzKys7CisJaWYgKHIgJiYgKnIpCisgICAgICAgICAgZnByaW50ZihmZCwgIiAgICAgPGF0dHJpYnV0ZSBuYW1lPVwiJXNcIiB0eXBlPVwiJXNcIiB1c2U9XCJkZWZhdWx0XCIlcy8+XG4iLCBzLCB3c2RsX3R5cGUocS0+aW5mby50eXAsIG5zMSksIHIpOworCWVsc2UgaWYgKHEtPmluZm8udHlwLT50eXBlICE9IFRwb2ludGVyIHx8IHEtPmluZm8ubWluT2NjdXJzKQorICAgICAgICAgIGZwcmludGYoZmQsICIgICAgIDxhdHRyaWJ1dGUgbmFtZT1cIiVzXCIgdHlwZT1cIiVzXCIgdXNlPVwicmVxdWlyZWRcIi8+XG4iLCBzLCB3c2RsX3R5cGUocS0+aW5mby50eXAsIG5zMSkpOworCWVsc2UKKyAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgICA8YXR0cmlidXRlIG5hbWU9XCIlc1wiIHR5cGU9XCIlc1wiIHVzZT1cIm9wdGlvbmFsXCIvPlxuIiwgcywgd3NkbF90eXBlKHEtPmluZm8udHlwLCBuczEpKTsKKyAgICAgIH0KKyAgICAgIGZmbHVzaChmZCk7CisgICAgfQorICB9Cit9CisKK3ZvaWQKK2dlbl90eXBlX2RvY3VtZW50YXRpb24oRklMRSAqZmQsIFRhYmxlICp0LCBFbnRyeSAqcCwgY2hhciAqbnMsIGNoYXIgKm5zMSkKK3sgU2VydmljZSAqc3A7CisgIERhdGEgKmQ7CisgIGZwcmludGYoZmQsICJcbiIpOworICBpZiAoIXAtPnN5bSkKKyAgICByZXR1cm47CisgIGZvciAoc3AgPSBzZXJ2aWNlczsgc3A7IHNwID0gc3AtPm5leHQpCisgICAgaWYgKCFzdHJjbXAoc3AtPm5zLCBucykpCisgICAgICBmb3IgKGQgPSBzcC0+ZGF0YTsgZDsgZCA9IGQtPm5leHQpCisgICAgICAgIGlmIChpc19lcV9ub25zKGQtPm5hbWUsIHAtPnN5bS0+bmFtZSkpCisgICAgICAgICAgZnByaW50ZihmZCwgIiAgIDxhbm5vdGF0aW9uPlxuICAgIDxkb2N1bWVudGF0aW9uPiVzPC9kb2N1bWVudGF0aW9uPlxuICAgPC9hbm5vdGF0aW9uPlxuIiwgZC0+cGFydCk7Cit9CisKK3ZvaWQKK2dlbl9uc21hcChGSUxFICpmZCwgU3ltYm9sICpucywgY2hhciAqVVJJKQoreyBTeW1ib2wgKm5zMTsKKyAgU2VydmljZSAqc3A7CisgIGZwcmludGYoZmQsICJ7XG4iKTsKKyAgZm9yIChuczEgPSBuc2xpc3Q7IG5zMTsgbnMxID0gbnMxLT5uZXh0KQorICAgIC8qIGlmIChuczEgIT0gbnMpICovCisgICAgeyBmb3IgKHNwID0gc2VydmljZXM7IHNwOyBzcCA9IHNwLT5uZXh0KQorICAgICAgICBpZiAoIXN0cmNtcChzcC0+bnMsIG5zMS0+bmFtZSkgJiYgc3AtPlVSSSkKKwkgIGJyZWFrOworICAgICAgICBpZiAoc3ApCisgICAgICAgIHsgaWYgKCFzdHJjbXAobnMxLT5uYW1lLCAiU09BUC1FTlYiKSkKKwkgICAgZnByaW50ZihmZCwgIlx0e1wiJXNcIiwgXCIlc1wiLCBcIiVzXCIsIE5VTEx9LFxuIiwgbnNfY29udmVydChuczEtPm5hbWUpLCBzcC0+VVJJLCBlbnZVUkkpOworICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAobnMxLT5uYW1lLCAiU09BUC1FTkMiKSkKKwkgICAgZnByaW50ZihmZCwgIlx0e1wiJXNcIiwgXCIlc1wiLCBcIiVzXCIsIE5VTEx9LFxuIiwgbnNfY29udmVydChuczEtPm5hbWUpLCBzcC0+VVJJLCBlbmNVUkkpOworICAgICAgICAgIGVsc2UKKwkgICAgZnByaW50ZihmZCwgIlx0e1wiJXNcIiwgXCIlc1wiLCBOVUxMLCBOVUxMfSxcbiIsIG5zX2NvbnZlcnQobnMxLT5uYW1lKSwgc3AtPlVSSSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChuczEtPm5hbWUsICJTT0FQLUVOViIpKQorCSAgZnByaW50ZihmZCwgIlx0e1wiU09BUC1FTlZcIiwgXCIlc1wiLCBcImh0dHA6Ly93d3cudzMub3JnLyovc29hcC1lbnZlbG9wZVwiLCBOVUxMfSxcbiIsIGVudlVSSSk7CisgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAobnMxLT5uYW1lLCAiU09BUC1FTkMiKSkKKwkgIGZwcmludGYoZmQsICJcdHtcIlNPQVAtRU5DXCIsIFwiJXNcIiwgXCJodHRwOi8vd3d3LnczLm9yZy8qL3NvYXAtZW5jb2RpbmdcIiwgTlVMTH0sXG4iLCBlbmNVUkkpOworICAgICAgICBlbHNlIGlmICghc3RyY21wKG5zMS0+bmFtZSwgInhzaSIpKQorCSAgZnByaW50ZihmZCwgIlx0e1wieHNpXCIsIFwiJXNcIiwgXCJodHRwOi8vd3d3LnczLm9yZy8qL1hNTFNjaGVtYS1pbnN0YW5jZVwiLCBOVUxMfSxcbiIsIHhzaVVSSSk7CisgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAobnMxLT5uYW1lLCAieHNkIikpCisJICBmcHJpbnRmKGZkLCAiXHR7XCJ4c2RcIiwgXCIlc1wiLCBcImh0dHA6Ly93d3cudzMub3JnLyovWE1MU2NoZW1hXCIsIE5VTEx9LFxuIiwgeHNkVVJJKTsKKyAgICAgICAgZWxzZQorCSAgZnByaW50ZihmZCwgIlx0e1wiJXNcIiwgXCIlcy8lcy54c2RcIiwgTlVMTCwgTlVMTH0sXG4iLCBuc19jb252ZXJ0KG5zMS0+bmFtZSksIHRtcFVSSSwgbnNfY29udmVydChuczEtPm5hbWUpKTsgCisgICAgfQorICAgIC8qIGZwcmludGYoZmQsICJcdHtcIiVzXCIsIFwiJXNcIn0sXG4iLCBuc19jb252ZXJ0KG5zLT5uYW1lKSwgVVJJKTsgKi8KKyAgICBmcHJpbnRmKGZkLCAiXHR7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH1cbn07XG4iKTsKK30KKwordm9pZAorZ2VuX3Byb3h5KEZJTEUgKmZkLCBUYWJsZSAqdGFibGUsIFN5bWJvbCAqbnMsIGNoYXIgKm5hbWUsIGNoYXIgKlVSTCwgY2hhciAqZXhlY3V0YWJsZSwgY2hhciAqVVJJLCBjaGFyICplbmNvZGluZykKK3sgRW50cnkgKnAsICpxLCAqcjsKKyAgVGFibGUgKnQsICpvdXRwdXQ7CisgIGNoYXIgKnM7CisgIFNlcnZpY2UgKnNwOworICBNZXRob2QgKm07CisgIGludCBmbGFnOworICBjaGFyICpuYW1lMTsKKyAgbmFtZTEgPSBlbWFsbG9jKHN0cmxlbihuYW1lKSsxKTsKKyAgc3RyY3B5KG5hbWUxLCBuYW1lKTsKKyAgZm9yIChzID0gbmFtZTErMTsgKnM7IHMrKykKKyAgeyBpZiAoIWlzYWxudW0oKnMpKQorICAgIHsgKnMgPSAnXDAnOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGZvciAoc3AgPSBzZXJ2aWNlczsgc3A7IHNwID0gc3AtPm5leHQpCisgICAgaWYgKCFzdHJjbXAoc3AtPm5zLCBucy0+bmFtZSkpCisgICAgICBicmVhazsKKyAgZnByaW50ZihmZCwgIlxuXG4jaWZuZGVmICVzJXNfSFxuI2RlZmluZSAlcyVzX0hcbiNpbmNsdWRlIFwiJXNILmhcIiIsIHByZWZpeCwgbmFtZTEsIHByZWZpeCwgbmFtZTEsIHByZWZpeCk7CisgIGlmIChuZmxhZykKKyAgICBmcHJpbnRmKGZkLCAiXG5leHRlcm4gU09BUF9OTUFDIHN0cnVjdCBOYW1lc3BhY2UgJXNfbmFtZXNwYWNlc1tdOyIsIHByZWZpeCk7CisgIGlmIChuYW1lc3BhY2VpZCkKKyAgICBmcHJpbnRmKGZkLCJcblxubmFtZXNwYWNlICVzIHsiLCBuYW1lc3BhY2VpZCk7CisgIGZwcmludGYoZmQsICJcbmNsYXNzICVzXG57ICAgcHVibGljOlxuXHRzdHJ1Y3Qgc29hcCAqc29hcDtcblx0Y29uc3QgY2hhciAqZW5kcG9pbnQ7XG4iLCBuYW1lMSk7CisgIGlmIChuZmxhZykKKyAgICBmcHJpbnRmKGZkLCAiXHQlcygpIHsgc29hcCA9IHNvYXBfbmV3KCk7IGlmIChzb2FwKSBzb2FwLT5uYW1lc3BhY2VzID0gJXNfbmFtZXNwYWNlczsgZW5kcG9pbnQgPSBcIiVzXCI7IH07XG4iLCBuYW1lMSwgcHJlZml4LCBVUkwpOworICBlbHNlCisgIHsgZnByaW50ZihmZCwgIlx0JXMoKVxuXHR7IHNvYXAgPSBzb2FwX25ldygpOyBlbmRwb2ludCA9IFwiJXNcIjsgaWYgKHNvYXAgJiYgIXNvYXAtPm5hbWVzcGFjZXMpIHsgc3RhdGljIGNvbnN0IHN0cnVjdCBOYW1lc3BhY2UgbmFtZXNwYWNlc1tdID0gXG4iLCBuYW1lMSwgVVJMKTsKKyAgICBnZW5fbnNtYXAoZmQsIG5zLCBVUkkpOworICAgIGZwcmludGYoZmQsICJcdHNvYXAtPm5hbWVzcGFjZXMgPSBuYW1lc3BhY2VzOyB9IH07XG4iLCBuYW1lMSwgVVJMKTsKKyAgfQorICBmcHJpbnRmKGZkLCAiXHR2aXJ0dWFsIH4lcygpIHsgaWYgKHNvYXApIHsgc29hcF9kZXN0cm95KHNvYXApOyBzb2FwX2VuZChzb2FwKTsgc29hcF9kb25lKHNvYXApOyBzb2FwX2RlbChzb2FwKTsgfSB9O1xuIiwgbmFtZTEpOworICBmZmx1c2goZmQpOworICBmb3IgKHIgPSB0YWJsZS0+bGlzdDsgcjsgciA9IHItPm5leHQpCisgICAgaWYgKHItPmluZm8udHlwLT50eXBlID09IFRmdW4gJiYgIShyLT5pbmZvLnN0byAmIFNleHRlcm4pICYmIGhhc19uc19lcShucy0+bmFtZSwgci0+c3ltLT5uYW1lKSkKKyAgICB7IHAgPSBlbnRyeSh0YWJsZSwgci0+c3ltKTsKKyAgICAgIGlmIChwKQorICAgICAgICBxID0gKEVudHJ5KilwLT5pbmZvLnR5cC0+cmVmOworICAgICAgZWxzZQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkludGVybmFsIGVycm9yOiBubyB0YWJsZSBlbnRyeVxuIik7CisgICAgICBwID0gZW50cnkoY2xhc3N0YWJsZSwgci0+c3ltKTsKKyAgICAgIGlmICghcCkKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbnRlcm5hbCBlcnJvcjogbm8gcGFyYW1ldGVyIHRhYmxlIGVudHJ5XG4iKTsKKyAgICAgIG91dHB1dCA9IChUYWJsZSopcC0+aW5mby50eXAtPnJlZjsKKyAgICAgIC8qCisgICAgICBpZiAoKHMgPSBzdHJzdHIoci0+c3ltLT5uYW1lLCAiX18iKSkpCisgICAgICAgIHMgKz0gMjsKKyAgICAgIGVsc2UKKyAgICAgICAgcyA9IHItPnN5bS0+bmFtZTsKKyAgICAgIGZwcmludGYoZmQsICJcdHZpcnR1YWwgaW50ICVzKCIsIHMpOworICAgICAgKi8KKyAgICAgIGZwcmludGYoZmQsICJcdHZpcnR1YWwgaW50ICVzKCIsIHItPnN5bS0+bmFtZSk7CisgICAgICBmbGFnID0gMDsKKyAgICAgIGZvciAodCA9IG91dHB1dDsgdDsgdCA9IHQtPnByZXYpCisgICAgICB7IHAgPSB0LT5saXN0OworICAgICAgICBpZiAocCkKKyAgICAgICAgeyBmcHJpbnRmKGZkLCAiJXMlcyVzIiwgY19zdG9yYWdlKHAtPmluZm8uc3RvKSwgY190eXBlX2lkKHAtPmluZm8udHlwLCBwLT5zeW0tPm5hbWUpLCBjX2luaXQocCkpOworICAgICAgICAgIGZvciAocCA9IHAtPm5leHQ7IHA7IHAgPSBwLT5uZXh0KQorICAgICAgICAgICAgZnByaW50ZihmZCwgIiwgJXMlcyVzIiwgY19zdG9yYWdlKHAtPmluZm8uc3RvKSwgY190eXBlX2lkKHAtPmluZm8udHlwLCBwLT5zeW0tPm5hbWUpLCBjX2luaXQocCkpOworCSAgZmxhZyA9IDE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChpc190cmFuc2llbnQocS0+aW5mby50eXApKQorICAgICAgICBmcHJpbnRmKGZkLCIpIHsgcmV0dXJuIHNvYXAgPyBzb2FwX3NlbmRfJXMoc29hcCwgZW5kcG9pbnQsIE5VTEwiLCByLT5zeW0tPm5hbWUpOworICAgICAgZWxzZSBpZiAoZmxhZykKKyAgICAgICAgZnByaW50ZihmZCwiLCAlcyVzKSB7IHJldHVybiBzb2FwID8gc29hcF9jYWxsXyVzKHNvYXAsIGVuZHBvaW50LCBOVUxMIiwgY19zdG9yYWdlKHEtPmluZm8uc3RvKSwgY190eXBlX2lkKHEtPmluZm8udHlwLCBxLT5zeW0tPm5hbWUpLCByLT5zeW0tPm5hbWUpOworICAgICAgZWxzZQorICAgICAgICBmcHJpbnRmKGZkLCIlcyVzKSB7IHJldHVybiBzb2FwID8gc29hcF9jYWxsXyVzKHNvYXAsIGVuZHBvaW50LCBOVUxMIiwgY19zdG9yYWdlKHEtPmluZm8uc3RvKSwgY190eXBlX2lkKHEtPmluZm8udHlwLCBxLT5zeW0tPm5hbWUpLCByLT5zeW0tPm5hbWUpOworICAgICAgLyogdGhlIGFjdGlvbiBpcyBub3cgaGFuZGxlZCBieSB0aGUgc29hcF9jYWxsL3NvYXBfc2VuZCBvcGVyYXRpb24gd2hlbiB3ZSBwYXNzIE5VTEwKKyAgICAgIG0gPSBOVUxMOworICAgICAgaWYgKHNwICYmIChzID0gc3Ryc3RyKHItPnN5bS0+bmFtZSwgIl9fIikpKQorICAgICAgICBmb3IgKG0gPSBzcC0+bGlzdDsgbTsgbSA9IG0tPm5leHQpCisgICAgICAgICAgaWYgKG0tPnBhcnQgJiYgbS0+bWVzcyA9PSBBQ1RJT04gJiYgIXN0cmNtcChtLT5uYW1lLCBzKzIpKQorICAgICAgICAgIHsgaWYgKCptLT5wYXJ0ID09ICciJykKKwkgICAgICBmcHJpbnRmKGZkLCAiJXMiLCBtLT5wYXJ0KTsKKyAgICAgICAgICAgIGVsc2UKKwkgICAgICBmcHJpbnRmKGZkLCAiXCIlc1wiIiwgbS0+cGFydCk7CisJICAgIGJyZWFrOworCSAgfQorICAgICAgaWYgKCFtKQorICAgICAgICBmcHJpbnRmKGZkLCAiTlVMTCIpOworICAgICAgKi8KKyAgICAgIGZvciAodCA9IG91dHB1dDsgdDsgdCA9IHQtPnByZXYpCisgICAgICAgIGZvciAocCA9IHQtPmxpc3Q7IHA7IHAgPSBwLT5uZXh0KQorICAgICAgICAgIGZwcmludGYoZmQsICIsICVzIiwgcC0+c3ltLT5uYW1lKTsKKyAgICAgIGlmIChpc190cmFuc2llbnQocS0+aW5mby50eXApKQorICAgICAgICBmcHJpbnRmKGZkLCIpIDogU09BUF9FT007IH07XG4iKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZnByaW50ZihmZCwiLCAlcykgOiBTT0FQX0VPTTsgfTtcbiIsIHEtPnN5bS0+bmFtZSk7CisgICAgICBmZmx1c2goZmQpOworICAgIH0KKyAgZnByaW50ZihmZCwgIn07Iik7CisgIGlmIChuYW1lc3BhY2VpZCkKKyAgICBmcHJpbnRmKGZkLCJcblxufSAvLyBuYW1lc3BhY2UgJXNcbiIsIG5hbWVzcGFjZWlkKTsKKyAgZnByaW50ZihmZCwgIlxuI2VuZGlmXG4iKTsKK30KKwordm9pZAorZ2VuX29iamVjdChGSUxFICpmZCwgVGFibGUgKnRhYmxlLCBTeW1ib2wgKm5zLCBjaGFyICpuYW1lLCBjaGFyICpVUkwsIGNoYXIgKmV4ZWN1dGFibGUsIGNoYXIgKlVSSSwgY2hhciAqZW5jb2RpbmcpCit7IGNoYXIgKnM7CisgIGNoYXIgKm5hbWUxOworICBuYW1lMSA9IGVtYWxsb2Moc3RybGVuKG5hbWUpKzEpOworICBzdHJjcHkobmFtZTEsIG5hbWUpOworICBmb3IgKHMgPSBuYW1lMSsxOyAqczsgcysrKQorICB7IGlmICghaXNhbG51bSgqcykpCisgICAgeyAqcyA9ICdcMCc7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZnByaW50ZihmZCwgIlxuXG4jaWZuZGVmICVzJXNfSFxuI2RlZmluZSAlcyVzX0hcbiNpbmNsdWRlIFwiJXNILmhcIiIsIHByZWZpeCwgbmFtZTEsIHByZWZpeCwgbmFtZTEsIHByZWZpeCk7CisgIGlmIChuZmxhZykKKyAgICBmcHJpbnRmKGZkLCAiXG5leHRlcm4gU09BUF9OTUFDIHN0cnVjdCBOYW1lc3BhY2UgJXNfbmFtZXNwYWNlc1tdOyIsIHByZWZpeCk7CisgIGlmIChuYW1lc3BhY2VpZCkKKyAgICBmcHJpbnRmKGZkLCJcblxubmFtZXNwYWNlICVzIHsiLCBuYW1lc3BhY2VpZCk7CisgIGZwcmludGYoZmQsICJcbmNsYXNzICVzIDogcHVibGljIHNvYXBcbnsgICAgcHVibGljOiIsIG5hbWUxKTsKKyAgaWYgKG5mbGFnKQorICAgIGZwcmludGYoZmQsICJcblx0JXMoKVxuXHR7IHNvYXBfaW5pdCh0aGlzKTsgdGhpcy0+bmFtZXNwYWNlcyA9ICVzX25hbWVzcGFjZXM7IH07IiwgbmFtZTEsIHByZWZpeCk7CisgIGVsc2UKKyAgeyBmcHJpbnRmKGZkLCAiXG5cdCVzKClcblx0eyBzdGF0aWMgY29uc3Qgc3RydWN0IE5hbWVzcGFjZSBuYW1lc3BhY2VzW10gPVxuIiwgbmFtZTEpOworICAgIGdlbl9uc21hcChmZCwgbnMsIFVSSSk7CisgICAgZnByaW50ZihmZCwgIlx0c29hcF9pbml0KHRoaXMpOyBpZiAoIXRoaXMtPm5hbWVzcGFjZXMpIHRoaXMtPm5hbWVzcGFjZXMgPSBuYW1lc3BhY2VzOyB9OyIpOworICB9CisgIGZwcmludGYoZmQsICJcblx0dmlydHVhbCB+JXMoKSB7IHNvYXBfZGVzdHJveSh0aGlzKTsgc29hcF9lbmQodGhpcyk7IHNvYXBfZG9uZSh0aGlzKTsgfTsiLCBuYW1lMSk7CisgIGlmIChuZmxhZykKKyAgICBmcHJpbnRmKGZkLCAiXG5cdHZpcnR1YWxcdGludCBzZXJ2ZSgpIHsgcmV0dXJuICVzX3NlcnZlKHRoaXMpOyB9OyIsIHByZWZpeCk7CisgIGVsc2UKKyAgICBmcHJpbnRmKGZkLCAiXG5cdHZpcnR1YWxcdGludCBzZXJ2ZSgpIHsgcmV0dXJuIHNvYXBfc2VydmUodGhpcyk7IH07Iik7CisgIGZwcmludGYoZmQsICJcbn07Iik7CisgIGlmIChuYW1lc3BhY2VpZCkKKyAgICBmcHJpbnRmKGZkLCJcblxufSAvLyBuYW1lc3BhY2UgJXNcbiIsIG5hbWVzcGFjZWlkKTsKKyAgZnByaW50ZihmZCwgIlxuI2VuZGlmXG4iKTsKK30KKwordm9pZAorZ2VuX3Byb3h5X2hlYWRlcihGSUxFICpmZCwgVGFibGUgKnRhYmxlLCBTeW1ib2wgKm5zLCBjaGFyICpuYW1lLCBjaGFyICpVUkwsIGNoYXIgKmV4ZWN1dGFibGUsIGNoYXIgKlVSSSwgY2hhciAqZW5jb2RpbmcpCit7IEVudHJ5ICptZXRob2Q7CisgIGZwcmludGYoZmQsICJcblxuI2lmbmRlZiAlcyVzX0hcbiNkZWZpbmUgJXMlc19IXG4jaW5jbHVkZSBcIiVzSC5oXCIiLCBwcmVmaXgsIG5hbWUsIHByZWZpeCwgbmFtZSwgcHJlZml4KTsKKyAgaWYgKG5hbWVzcGFjZWlkKQorICAgIGZwcmludGYoZmQsIlxuXG5uYW1lc3BhY2UgJXMgeyIsIG5hbWVzcGFjZWlkKTsKKyAgZnByaW50ZihmZCwgIlxuXG5jbGFzcyBTT0FQX0NNQUMgJXMgOiBwdWJsaWMgc29hcFxueyBwdWJsaWM6IiwgbmFtZSk7CisgIGZwcmludGYoZmQsICJcblx0XHQlcygpOyIsIG5hbWUpOworICBmcHJpbnRmKGZkLCAiXG5cdFx0JXMoc29hcF9tb2RlIGlvbW9kZSk7IiwgbmFtZSk7CisgIGZwcmludGYoZmQsICJcblx0XHQlcyhzb2FwX21vZGUgaW1vZGUsIHNvYXBfbW9kZSBvbW9kZSk7IiwgbmFtZSk7CisgIGZwcmludGYoZmQsICJcblx0dmlydHVhbCB+JXMoKTsiLCBuYW1lKTsKKyAgZnByaW50ZihmZCwgIlxuXHR2aXJ0dWFsXHR2b2lkICVzX2luaXQoc29hcF9tb2RlIGltb2RlLCBzb2FwX21vZGUgb21vZGUpOyIsIG5hbWUpOworICBmb3IgKG1ldGhvZCA9IHRhYmxlLT5saXN0OyBtZXRob2Q7IG1ldGhvZCA9IG1ldGhvZC0+bmV4dCkKKyAgICBpZiAobWV0aG9kLT5pbmZvLnR5cC0+dHlwZSA9PSBUZnVuICYmICEobWV0aG9kLT5pbmZvLnN0byAmIFNleHRlcm4pKQorICAgICAgZ2VuX21ldGhvZChmZCwgdGFibGUsIG1ldGhvZCk7CisgIGZwcmludGYoZmQsICJcblx0XHRjb25zdCBjaGFyICpzb2FwX2VuZHBvaW50OyIpOworICBmcHJpbnRmKGZkLCAiXG59OyIpOworICBpZiAobmFtZXNwYWNlaWQpCisgICAgZnByaW50ZihmZCwiXG5cbn0gLy8gbmFtZXNwYWNlICVzXG4iLCBuYW1lc3BhY2VpZCk7CisgIGZwcmludGYoZmQsICJcbiNlbmRpZlxuIik7Cit9CisKK3ZvaWQKK2dlbl9wcm94eV9jb2RlKEZJTEUgKmZkLCBUYWJsZSAqdGFibGUsIFN5bWJvbCAqbnMsIGNoYXIgKm5hbWUsIGNoYXIgKlVSTCwgY2hhciAqZXhlY3V0YWJsZSwgY2hhciAqVVJJLCBjaGFyICplbmNvZGluZykKK3sgRW50cnkgKm1ldGhvZDsKKyAgZnByaW50ZihmZCwgIlxuXG4jaW5jbHVkZSBcIiVzJXMuaFwiIiwgcHJlZml4LCBuYW1lKTsKKyAgaWYgKG5hbWVzcGFjZWlkKQorICAgIGZwcmludGYoZmQsIlxuXG5uYW1lc3BhY2UgJXMgeyIsIG5hbWVzcGFjZWlkKTsKKyAgZnByaW50ZihmZCwgIlxuXG4lczo6JXMoKVxue1x0JXNfaW5pdChTT0FQX0lPX0RFRkFVTFQsIFNPQVBfSU9fREVGQVVMVCk7XG59IiwgbmFtZSwgbmFtZSwgbmFtZSk7CisgIGZwcmludGYoZmQsICJcblxuJXM6OiVzKHNvYXBfbW9kZSBpb21vZGUpXG57XHQlc19pbml0KGlvbW9kZSwgaW9tb2RlKTtcbn0iLCBuYW1lLCBuYW1lLCBuYW1lKTsKKyAgZnByaW50ZihmZCwgIlxuXG4lczo6JXMoc29hcF9tb2RlIGltb2RlLCBzb2FwX21vZGUgb21vZGUpXG57XHQlc19pbml0KGltb2RlLCBvbW9kZSk7XG59IiwgbmFtZSwgbmFtZSwgbmFtZSk7CisgIGZwcmludGYoZmQsICJcblxudm9pZCAlczo6JXNfaW5pdChzb2FwX21vZGUgaW1vZGUsIHNvYXBfbW9kZSBvbW9kZSlcbntcdHNvYXBfaW5pdDIodGhpcywgaW1vZGUsIG9tb2RlKTtcblx0c29hcF9lbmRwb2ludCA9IE5VTEw7XG5cdHN0YXRpYyBjb25zdCBzdHJ1Y3QgTmFtZXNwYWNlIG5hbWVzcGFjZXNbXSA9XG4iLCBuYW1lLCBuYW1lKTsKKyAgZ2VuX25zbWFwKGZkLCBucywgVVJJKTsKKyAgaWYgKG5mbGFnKQorICAgIGZwcmludGYoZmQsICJcdHRoaXMtPm5hbWVzcGFjZXMgPSBuYW1lc3BhY2VzO1xufTsiKTsKKyAgZWxzZQorICAgIGZwcmludGYoZmQsICJcdGlmICghdGhpcy0+bmFtZXNwYWNlcylcblx0XHR0aGlzLT5uYW1lc3BhY2VzID0gbmFtZXNwYWNlcztcbn07Iik7CisgIGZwcmludGYoZmQsICJcblxuJXM6On4lcygpXG57XHRzb2FwX2Rlc3Ryb3kodGhpcyk7XG5cdHNvYXBfZW5kKHRoaXMpO1xuXHRzb2FwX2RvbmUodGhpcyk7XG59OyIsIG5hbWUsIG5hbWUpOworICBmb3IgKG1ldGhvZCA9IHRhYmxlLT5saXN0OyBtZXRob2Q7IG1ldGhvZCA9IG1ldGhvZC0+bmV4dCkKKyAgICBpZiAobWV0aG9kLT5pbmZvLnR5cC0+dHlwZSA9PSBUZnVuICYmICEobWV0aG9kLT5pbmZvLnN0byAmIFNleHRlcm4pICYmICFpc19pbXBvcnRlZChtZXRob2QtPmluZm8udHlwKSkKKyAgICAgIGdlbl9jYWxsX21ldGhvZChmZCwgdGFibGUsIG1ldGhvZCwgbmFtZSk7CisgIGlmIChuYW1lc3BhY2VpZCkKKyAgICBmcHJpbnRmKGZkLCJcblxufSAvLyBuYW1lc3BhY2UgJXNcbiIsIG5hbWVzcGFjZWlkKTsKK30KKwordm9pZAorZ2VuX29iamVjdF9oZWFkZXIoRklMRSAqZmQsIFRhYmxlICp0YWJsZSwgU3ltYm9sICpucywgY2hhciAqbmFtZSwgY2hhciAqVVJMLCBjaGFyICpleGVjdXRhYmxlLCBjaGFyICpVUkksIGNoYXIgKmVuY29kaW5nKQoreyBFbnRyeSAqbWV0aG9kOworICBmcHJpbnRmKGZkLCAiXG5cbiNpZm5kZWYgJXMlc19IXG4jZGVmaW5lICVzJXNfSFxuI2luY2x1ZGUgXCIlc0guaFwiIiwgcHJlZml4LCBuYW1lLCBwcmVmaXgsIG5hbWUsIHByZWZpeCk7CisgIGlmIChuYW1lc3BhY2VpZCkKKyAgICBmcHJpbnRmKGZkLCJcblxubmFtZXNwYWNlICVzIHsiLCBuYW1lc3BhY2VpZCk7CisgIGZwcmludGYoZmQsICJcbmNsYXNzIFNPQVBfQ01BQyAlcyA6IHB1YmxpYyBzb2FwXG57IHB1YmxpYzoiLCBuYW1lKTsKKyAgZnByaW50ZihmZCwgIlxuXHRcdCVzKCk7IiwgbmFtZSk7CisgIGZwcmludGYoZmQsICJcblx0XHQlcyhzb2FwX21vZGUgaW9tb2RlKTsiLCBuYW1lKTsKKyAgZnByaW50ZihmZCwgIlxuXHRcdCVzKHNvYXBfbW9kZSBpbW9kZSwgc29hcF9tb2RlIG9tb2RlKTsiLCBuYW1lKTsKKyAgZnByaW50ZihmZCwgIlxuXHR2aXJ0dWFsIH4lcygpOyIsIG5hbWUpOworICBmcHJpbnRmKGZkLCAiXG5cdHZpcnR1YWxcdHZvaWQgJXNfaW5pdChzb2FwX21vZGUgaW1vZGUsIHNvYXBfbW9kZSBvbW9kZSk7IiwgbmFtZSk7CisgIGZwcmludGYoZmQsICJcblx0dmlydHVhbCBpbnQgc2VydmUoKTsiKTsKKyAgZnByaW50ZihmZCwgIlxuXHR2aXJ0dWFsIGludCBkaXNwYXRjaCgpOyIpOworICBmb3IgKG1ldGhvZCA9IHRhYmxlLT5saXN0OyBtZXRob2Q7IG1ldGhvZCA9IG1ldGhvZC0+bmV4dCkKKyAgICBpZiAobWV0aG9kLT5pbmZvLnR5cC0+dHlwZSA9PSBUZnVuICYmICEobWV0aG9kLT5pbmZvLnN0byAmIFNleHRlcm4pKQorICAgICAgZ2VuX21ldGhvZChmZCwgdGFibGUsIG1ldGhvZCk7CisgIGZwcmludGYoZmQsICJcbn07Iik7CisgIGlmIChuYW1lc3BhY2VpZCkKKyAgICBmcHJpbnRmKGZkLCJcblxufSAvLyBuYW1lc3BhY2UgJXNcbiIsIG5hbWVzcGFjZWlkKTsKKyAgZnByaW50ZihmZCwgIlxuI2VuZGlmXG4iKTsKK30KKwordm9pZAorZ2VuX21ldGhvZChGSUxFICpmZCwgVGFibGUgKnRhYmxlLCBFbnRyeSAqbWV0aG9kKQoreyBUYWJsZSAqcGFyYW1zOworICBFbnRyeSAqcmVzdWx0LCAqcDsgCisgIHJlc3VsdCA9IG1ldGhvZC0+aW5mby50eXAtPnJlZjsKKyAgcCA9IGVudHJ5KGNsYXNzdGFibGUsIG1ldGhvZC0+c3ltKTsKKyAgaWYgKCFwKQorICAgIGV4ZWNlcnJvcigibm8gdGFibGUgZW50cnkiKTsKKyAgcGFyYW1zID0gKFRhYmxlKilwLT5pbmZvLnR5cC0+cmVmOworICBmcHJpbnRmKGZkLCAiXG5cdHZpcnR1YWwgaW50ICVzKCIsIG5zX2NuYW1lKG1ldGhvZC0+c3ltLT5uYW1lLCBOVUxMKSk7CisgIGdlbl9wYXJhbXMoZmQsIHBhcmFtcywgcmVzdWx0LCAwKTsKKyAgZnByaW50ZihmZCwgIjsiKTsKK30KKwordm9pZAorZ2VuX3BhcmFtcyhGSUxFICpmZCwgVGFibGUgKnBhcmFtcywgRW50cnkgKnJlc3VsdCwgaW50IGZsYWcpCit7IEVudHJ5ICpwYXJhbTsKKyAgZm9yIChwYXJhbSA9IHBhcmFtcy0+bGlzdDsgcGFyYW07IHBhcmFtID0gcGFyYW0tPm5leHQpCisgICAgZnByaW50ZihmZCwgIiVzJXMlcyIsIGZsYWcgfHwgcGFyYW0gIT0gcGFyYW1zLT5saXN0ID8gIiwgIiA6ICIiLCBjX3N0b3JhZ2UocGFyYW0tPmluZm8uc3RvKSwgY190eXBlX2lkKHBhcmFtLT5pbmZvLnR5cCwgcGFyYW0tPnN5bS0+bmFtZSkpOworICBpZiAoaXNfdHJhbnNpZW50KHJlc3VsdC0+aW5mby50eXApKQorICAgIGZwcmludGYoZmQsICIpIik7CisgIGVsc2UKKyAgICBmcHJpbnRmKGZkLCAiJXMlcyVzKSIsIGZsYWcgfHwgcGFyYW1zLT5saXN0ID8gIiwgIiA6ICIiLCBjX3N0b3JhZ2UocmVzdWx0LT5pbmZvLnN0byksIGNfdHlwZV9pZChyZXN1bHQtPmluZm8udHlwLCByZXN1bHQtPnN5bS0+bmFtZSkpOworfQorCit2b2lkCitnZW5fY2FsbF9tZXRob2QoRklMRSAqZmQsIFRhYmxlICp0YWJsZSwgRW50cnkgKm1ldGhvZCwgY2hhciAqbmFtZSkKK3sgU2VydmljZSAqc3A7CisgIE1ldGhvZCAqbTsKKyAgY2hhciAqc3R5bGUsICplbmNvZGluZzsKKyAgY2hhciAqeHRhZywgKnh0eXA7CisgIGNoYXIgKnMsICphY3Rpb24gPSBOVUxMLCAqbWV0aG9kX3N0eWxlID0gTlVMTCwgKm1ldGhvZF9lbmNvZGluZyA9IE5VTEwsICptZXRob2RfcmVzcG9uc2VfZW5jb2RpbmcgPSBOVUxMOworICBUYWJsZSAqcGFyYW1zOworICBFbnRyeSAqcGFyYW0sICpyZXN1bHQsICpwLCAqcmVzcG9uc2UgPSBOVUxMOyAKKyAgcmVzdWx0ID0gbWV0aG9kLT5pbmZvLnR5cC0+cmVmOworICBwID0gZW50cnkoY2xhc3N0YWJsZSwgbWV0aG9kLT5zeW0pOworICBpZiAoIXApCisgICAgZXhlY2Vycm9yKCJubyB0YWJsZSBlbnRyeSIpOworICBwYXJhbXMgPSAoVGFibGUqKXAtPmluZm8udHlwLT5yZWY7CisgIGlmICghaXNfcmVzcG9uc2UocmVzdWx0LT5pbmZvLnR5cCkgJiYgIWlzX1hNTChyZXN1bHQtPmluZm8udHlwKSkKKyAgICByZXNwb25zZSA9IGdldF9yZXNwb25zZShtZXRob2QtPmluZm8udHlwKTsKKyAgaWYgKG5hbWUpCisgIHsgZnByaW50ZihmZCwgIlxuXG5pbnQgJXM6OiVzKCIsIG5hbWUsIG5zX2NuYW1lKG1ldGhvZC0+c3ltLT5uYW1lLCBOVUxMKSk7CisgICAgZ2VuX3BhcmFtcyhmZCwgcGFyYW1zLCByZXN1bHQsIDApOworICB9CisgIGVsc2UgaWYgKCFpc190cmFuc2llbnQocmVzdWx0LT5pbmZvLnR5cCkpCisgIHsgZnByaW50ZihmaGVhZGVyLCAiXG5cblNPQVBfRk1BQzUgaW50IFNPQVBfRk1BQzYgc29hcF9jYWxsXyVzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzb2FwX2VuZHBvaW50LCBjb25zdCBjaGFyICpzb2FwX2FjdGlvbiIsIG1ldGhvZC0+c3ltLT5uYW1lKTsKKyAgICBnZW5fcGFyYW1zKGZoZWFkZXIsIHBhcmFtcywgcmVzdWx0LCAxKTsKKyAgICBmcHJpbnRmKGZkLCAiXG5cblNPQVBfRk1BQzUgaW50IFNPQVBfRk1BQzYgc29hcF9jYWxsXyVzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzb2FwX2VuZHBvaW50LCBjb25zdCBjaGFyICpzb2FwX2FjdGlvbiIsIG1ldGhvZC0+c3ltLT5uYW1lKTsKKyAgICBnZW5fcGFyYW1zKGZkLCBwYXJhbXMsIHJlc3VsdCwgMSk7CisgIH0KKyAgZWxzZQorICB7IGZwcmludGYoZmhlYWRlciwgIlxuXG5TT0FQX0ZNQUM1IGludCBTT0FQX0ZNQUM2IHNvYXBfc2VuZF8lcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqc29hcF9lbmRwb2ludCwgY29uc3QgY2hhciAqc29hcF9hY3Rpb24iLCBtZXRob2QtPnN5bS0+bmFtZSk7CisgICAgZ2VuX3BhcmFtcyhmaGVhZGVyLCBwYXJhbXMsIHJlc3VsdCwgMSk7CisgICAgZnByaW50ZihmZCwgIlxuXG5TT0FQX0ZNQUM1IGludCBTT0FQX0ZNQUM2IHNvYXBfc2VuZF8lcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqc29hcF9lbmRwb2ludCwgY29uc3QgY2hhciAqc29hcF9hY3Rpb24iLCBtZXRob2QtPnN5bS0+bmFtZSk7CisgICAgZ2VuX3BhcmFtcyhmZCwgcGFyYW1zLCByZXN1bHQsIDEpOworICB9CisgIGlmIChuYW1lKQorICAgIGZwcmludGYoZmQsICJcbntcdHN0cnVjdCBzb2FwICpzb2FwID0gdGhpcztcbiIpOworICBlbHNlCisgIHsgZnByaW50ZihmaGVhZGVyLCAiOyIpOworICAgIGZwcmludGYoZmQsICJcbnsiKTsKKyAgfQorICBmcHJpbnRmKGZkLCAiXHRzdHJ1Y3QgJXMgc29hcF90bXBfJXM7IiwgbWV0aG9kLT5zeW0tPm5hbWUsIG1ldGhvZC0+c3ltLT5uYW1lKTsKKyAgaWYgKCFpc19yZXNwb25zZShyZXN1bHQtPmluZm8udHlwKSAmJiByZXNwb25zZSkKKyAgICBmcHJpbnRmKGZkLCAiXG5cdHN0cnVjdCAlcyAqc29hcF90bXBfJXM7IiwgY19pZGVudChyZXNwb25zZS0+aW5mby50eXApLCBjX2lkZW50KHJlc3BvbnNlLT5pbmZvLnR5cCkpOworICBmb3IgKHNwID0gc2VydmljZXM7IHNwOyBzcCA9IHNwLT5uZXh0KQorICB7IGlmIChoYXNfbnNfZXEoc3AtPm5zLCBtZXRob2QtPnN5bS0+bmFtZSkpCisgICAgeyBzdHlsZSA9IHNwLT5zdHlsZTsKKyAgICAgIGVuY29kaW5nID0gc3AtPmVuY29kaW5nOworICAgICAgbWV0aG9kX3N0eWxlID0gc3R5bGU7CisgICAgICBtZXRob2RfZW5jb2RpbmcgPSBlbmNvZGluZzsKKyAgICAgIG1ldGhvZF9yZXNwb25zZV9lbmNvZGluZyA9IE5VTEw7CisgICAgICBmb3IgKG0gPSBzcC0+bGlzdDsgbTsgbSA9IG0tPm5leHQpCisgICAgICAgIGlmIChpc19lcV9ub25zKG0tPm5hbWUsIG1ldGhvZC0+c3ltLT5uYW1lKSkKKyAgICAgICAgICBpZiAobS0+bWVzcyA9PSBBQ1RJT04pCisgICAgICAgICAgICBhY3Rpb24gPSBtLT5wYXJ0OworICAgICAgICAgIGVsc2UgaWYgKG0tPm1lc3MgPT0gRU5DT0RJTkcpCisgICAgICAgICAgICBtZXRob2RfZW5jb2RpbmcgPSBtLT5wYXJ0OworICAgICAgICAgIGVsc2UgaWYgKG0tPm1lc3MgPT0gUkVTUE9OU0VfRU5DT0RJTkcpCisgICAgICAgICAgICBtZXRob2RfcmVzcG9uc2VfZW5jb2RpbmcgPSBtLT5wYXJ0OworICAgICAgICAgIGVsc2UgaWYgKG0tPm1lc3MgPT0gU1RZTEUpCisgICAgICAgICAgICBtZXRob2Rfc3R5bGUgPSBtLT5wYXJ0OworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmIChuYW1lKQorICAgIGZwcmludGYoZmQsICJcblx0Y29uc3QgY2hhciAqc29hcF9hY3Rpb24gPSBOVUxMOyIpOworICBpZiAoc3AgJiYgc3AtPlVSTCkKKyAgICBmcHJpbnRmKGZkLCAiXG5cdGlmICghc29hcF9lbmRwb2ludClcblx0XHRzb2FwX2VuZHBvaW50ID0gXCIlc1wiOyIsIHNwLT5VUkwpOworICBpZiAoYWN0aW9uKQorICB7IGlmIChuYW1lKQorICAgICAgZnByaW50ZihmZCwgIlxuXHRzb2FwX2FjdGlvbiA9ICIpOworICAgIGVsc2UKKyAgICAgIGZwcmludGYoZmQsICJcblx0aWYgKCFzb2FwX2FjdGlvbilcblx0XHRzb2FwX2FjdGlvbiA9ICIpOworICAgIGlmICgqYWN0aW9uID09ICciJykKKyAgICAgIGZwcmludGYoZmQsICIlczsiLCBhY3Rpb24pOworICAgIGVsc2UKKyAgICAgIGZwcmludGYoZmQsICJcIiVzXCI7IiwgYWN0aW9uKTsKKyAgfQorICBpZiAoIW1ldGhvZF9yZXNwb25zZV9lbmNvZGluZykKKyAgICBtZXRob2RfcmVzcG9uc2VfZW5jb2RpbmcgPSBtZXRob2RfZW5jb2Rpbmc7CisgIGlmIChzcCAmJiBzcC0+VVJJICYmIG1ldGhvZF9lbmNvZGluZykKKyAgeyBpZiAoaXNfbGl0ZXJhbChtZXRob2RfZW5jb2RpbmcpKQorICAgICAgZnByaW50ZihmZCwgIlxuXHRzb2FwLT5lbmNvZGluZ1N0eWxlID0gTlVMTDsiKTsKKyAgICBlbHNlIGlmIChtZXRob2RfZW5jb2RpbmcpCisgICAgICBmcHJpbnRmKGZkLCAiXG5cdHNvYXAtPmVuY29kaW5nU3R5bGUgPSBcIiVzXCI7IiwgbWV0aG9kX2VuY29kaW5nKTsKKyAgfQorICBlbHNlIGlmICghZWZsYWcpCisgICAgZnByaW50ZihmZCwgIlxuXHRzb2FwLT5lbmNvZGluZ1N0eWxlID0gTlVMTDsiKTsKKyAgZm9yIChwYXJhbSA9IHBhcmFtcy0+bGlzdDsgcGFyYW07IHBhcmFtID0gcGFyYW0tPm5leHQpCisgIHsgaWYgKHBhcmFtLT5pbmZvLnR5cC0+dHlwZSA9PSBUYXJyYXkpCisgICAgICBmcHJpbnRmKGZkLCAiXG5cdG1lbWNweShzb2FwX3RtcF8lcy4lcywgJXMsIHNpemVvZiglcykpOyIsIG1ldGhvZC0+c3ltLT5uYW1lLCBwYXJhbS0+c3ltLT5uYW1lLCBwYXJhbS0+c3ltLT5uYW1lLCBjX3R5cGUocGFyYW0tPmluZm8udHlwKSk7CisgICAgZWxzZQorICAgICAgZnByaW50ZihmZCwgIlxuXHRzb2FwX3RtcF8lcy4lcyA9ICVzOyIsIG1ldGhvZC0+c3ltLT5uYW1lLCBwYXJhbS0+c3ltLT5uYW1lLCBwYXJhbS0+c3ltLT5uYW1lKTsKKyAgfQkKKyAgZnByaW50ZihmZCwgIlxuXHRzb2FwX2JlZ2luKHNvYXApOyIpOworICBmcHJpbnRmKGZkLCAiXG5cdHNvYXBfc2VyaWFsaXplaGVhZGVyKHNvYXApOyIpOworICBmcHJpbnRmKGZkLCAiXG5cdHNvYXBfc2VyaWFsaXplXyVzKHNvYXAsICZzb2FwX3RtcF8lcyk7IiwgbWV0aG9kLT5zeW0tPm5hbWUsIG1ldGhvZC0+c3ltLT5uYW1lKTsKKyAgZnByaW50ZihmZCwgIlxuXHRpZiAoc29hcF9iZWdpbl9jb3VudChzb2FwKSlcblx0XHRyZXR1cm4gc29hcC0+ZXJyb3I7Iik7CisgIGZwcmludGYoZmQsICJcblx0aWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkiKTsKKyAgZnByaW50ZihmZCwgIlxuXHR7XHRpZiAoc29hcF9lbnZlbG9wZV9iZWdpbl9vdXQoc29hcCkiKTsKKyAgZnByaW50ZihmZCwgIlxuXHRcdCB8fCBzb2FwX3B1dGhlYWRlcihzb2FwKSIpOworICBmcHJpbnRmKGZkLCAiXG5cdFx0IHx8IHNvYXBfYm9keV9iZWdpbl9vdXQoc29hcCkiKTsKKyAgZnByaW50ZihmZCwgIlxuXHRcdCB8fCBzb2FwX3B1dF8lcyhzb2FwLCAmc29hcF90bXBfJXMsIFwiJXNcIiwgXCJcIikiLCBtZXRob2QtPnN5bS0+bmFtZSxtZXRob2QtPnN5bS0+bmFtZSwgbnNfY29udmVydChtZXRob2QtPnN5bS0+bmFtZSkpOyAKKyAgZnByaW50ZihmZCwgIlxuXHRcdCB8fCBzb2FwX2JvZHlfZW5kX291dChzb2FwKSIpOworICBmcHJpbnRmKGZkLCAiXG5cdFx0IHx8IHNvYXBfZW52ZWxvcGVfZW5kX291dChzb2FwKSkiKTsKKyAgZnByaW50ZihmZCwgIlxuXHRcdFx0IHJldHVybiBzb2FwLT5lcnJvcjsiKTsKKyAgZnByaW50ZihmZCwgIlxuXHR9Iik7CisgIGZwcmludGYoZmQsICJcblx0aWYgKHNvYXBfZW5kX2NvdW50KHNvYXApKVxuXHRcdHJldHVybiBzb2FwLT5lcnJvcjsiKTsKKyAgZnByaW50ZihmZCwgIlxuXHRpZiAoc29hcF9jb25uZWN0KHNvYXAsIHNvYXBfZW5kcG9pbnQsIHNvYXBfYWN0aW9uKSIpOworICBmcHJpbnRmKGZkLCAiXG5cdCB8fCBzb2FwX2VudmVsb3BlX2JlZ2luX291dChzb2FwKSIpOworICBmcHJpbnRmKGZkLCAiXG5cdCB8fCBzb2FwX3B1dGhlYWRlcihzb2FwKSIpOworICBmcHJpbnRmKGZkLCAiXG5cdCB8fCBzb2FwX2JvZHlfYmVnaW5fb3V0KHNvYXApIik7CisgIGZwcmludGYoZmQsICJcblx0IHx8IHNvYXBfcHV0XyVzKHNvYXAsICZzb2FwX3RtcF8lcywgXCIlc1wiLCBcIlwiKSIsIG1ldGhvZC0+c3ltLT5uYW1lLCBtZXRob2QtPnN5bS0+bmFtZSwgbnNfY29udmVydChtZXRob2QtPnN5bS0+bmFtZSkpOyAKKyAgZnByaW50ZihmZCwgIlxuXHQgfHwgc29hcF9ib2R5X2VuZF9vdXQoc29hcCkiKTsKKyAgZnByaW50ZihmZCwgIlxuXHQgfHwgc29hcF9lbnZlbG9wZV9lbmRfb3V0KHNvYXApIik7CisgIGZwcmludGYoZmQsICJcblx0IHx8IHNvYXBfZW5kX3NlbmQoc29hcCkpIik7CisgIGZwcmludGYoZmQsICJcblx0XHRyZXR1cm4gc29hcF9jbG9zZXNvY2soc29hcCk7Iik7CisgIGlmIChpc190cmFuc2llbnQocmVzdWx0LT5pbmZvLnR5cCkpCisgIHsgZnByaW50ZihmZCwgIlxuXHRyZXR1cm4gU09BUF9PSztcbn0iKTsKKyAgICBpZiAobmFtZSkKKyAgICAgIHJldHVybjsKKyAgICBmcHJpbnRmKGZoZWFkZXIsICJcblxuU09BUF9GTUFDNSBpbnQgU09BUF9GTUFDNiBzb2FwX3JlY3ZfJXMoc3RydWN0IHNvYXAgKnNvYXAsICIsIG1ldGhvZC0+c3ltLT5uYW1lKTsKKyAgICBmcHJpbnRmKGZkLCAiXG5cblNPQVBfRk1BQzUgaW50IFNPQVBfRk1BQzYgc29hcF9yZWN2XyVzKHN0cnVjdCBzb2FwICpzb2FwLCAiLCBtZXRob2QtPnN5bS0+bmFtZSk7CisgICAgZnByaW50ZihmaGVhZGVyLCAic3RydWN0ICVzIColcyk7XG4iLCBtZXRob2QtPnN5bS0+bmFtZSwgcmVzdWx0LT5zeW0tPm5hbWUpOworICAgIGZwcmludGYoZmQsICJzdHJ1Y3QgJXMgKiVzKVxueyIsIG1ldGhvZC0+c3ltLT5uYW1lLCByZXN1bHQtPnN5bS0+bmFtZSk7CisgICAgZnByaW50ZihmZCwgIlxuXHRzb2FwX2RlZmF1bHRfJXMoc29hcCwgJXMpOyIsIG1ldGhvZC0+c3ltLT5uYW1lLCByZXN1bHQtPnN5bS0+bmFtZSk7CisgICAgZnByaW50ZihmZCwgIlxuXHRzb2FwX2JlZ2luKHNvYXApOyIpOworICB9CisgIGVsc2UgaWYgKHJlc3VsdC0+aW5mby50eXAtPnR5cGUgPT0gVGFycmF5KQorICAgIGZwcmludGYoZmQsICJcblx0c29hcF9kZWZhdWx0XyVzKHNvYXAsICVzKTsiLCBjX2lkZW50KHJlc3VsdC0+aW5mby50eXApLCByZXN1bHQtPnN5bS0+bmFtZSk7CisgIGVsc2UgaWYgKHJlc3VsdC0+aW5mby50eXAtPnR5cGUgPT0gVHJlZmVyZW5jZSAmJiAoKFRub2RlKilyZXN1bHQtPmluZm8udHlwLT5yZWYpLT50eXBlID09IFRjbGFzcyAmJiAhaXNfZXh0ZXJuYWwocmVzdWx0LT5pbmZvLnR5cC0+cmVmKSAmJiAhaXNfdm9sYXRpbGUocmVzdWx0LT5pbmZvLnR5cC0+cmVmKSkKKyAgICBmcHJpbnRmKGZkLCAiXG5cdGlmICghJiVzKVxuXHRcdHJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTtcblx0JXMuc29hcF9kZWZhdWx0KHNvYXApOyIsIHJlc3VsdC0+c3ltLT5uYW1lLCByZXN1bHQtPnN5bS0+bmFtZSk7CisgIGVsc2UgaWYgKCgoVG5vZGUqKXJlc3VsdC0+aW5mby50eXAtPnJlZiktPnR5cGUgPT0gVGNsYXNzICYmICFpc19leHRlcm5hbChyZXN1bHQtPmluZm8udHlwLT5yZWYpICYmICFpc192b2xhdGlsZShyZXN1bHQtPmluZm8udHlwLT5yZWYpKQorICAgIGZwcmludGYoZmQsICJcblx0aWYgKCElcylcblx0XHRyZXR1cm4gc29hcF9jbG9zZXNvY2soc29hcCk7XG5cdCVzLT5zb2FwX2RlZmF1bHQoc29hcCk7IiwgcmVzdWx0LT5zeW0tPm5hbWUsIHJlc3VsdC0+c3ltLT5uYW1lKTsKKyAgZWxzZSBpZiAocmVzdWx0LT5pbmZvLnR5cC0+dHlwZSA9PSBUcmVmZXJlbmNlICYmICgoVG5vZGUqKXJlc3VsdC0+aW5mby50eXAtPnJlZiktPnR5cGUgPT0gVHBvaW50ZXIpCisgICAgZnByaW50ZihmZCwgIlxuXHQlcyA9IE5VTEw7IiwgcmVzdWx0LT5zeW0tPm5hbWUpOworICBlbHNlIGlmICgoKFRub2RlKilyZXN1bHQtPmluZm8udHlwLT5yZWYpLT50eXBlID09IFRwb2ludGVyKQorICAgIGZwcmludGYoZmQsICJcblx0KiVzID0gTlVMTDsiLCByZXN1bHQtPnN5bS0+bmFtZSk7CisgIGVsc2UgaWYgKHJlc3VsdC0+aW5mby50eXAtPnR5cGUgPT0gVHJlZmVyZW5jZSkKKyAgICBmcHJpbnRmKGZkLCAiXG5cdHNvYXBfZGVmYXVsdF8lcyhzb2FwLCAmJXMpOyIsIGNfaWRlbnQoKFRub2RlKilyZXN1bHQtPmluZm8udHlwLT5yZWYpLCByZXN1bHQtPnN5bS0+bmFtZSk7CisgIGVsc2UgaWYgKCFpc192b2lkKHJlc3VsdC0+aW5mby50eXApKQorICAgIGZwcmludGYoZmQsICJcblx0c29hcF9kZWZhdWx0XyVzKHNvYXAsICVzKTsiLCBjX2lkZW50KChUbm9kZSopcmVzdWx0LT5pbmZvLnR5cC0+cmVmKSwgcmVzdWx0LT5zeW0tPm5hbWUpOworICBmcHJpbnRmKGZkLCJcblx0aWYgKHNvYXBfYmVnaW5fcmVjdihzb2FwKSIpOworICBmcHJpbnRmKGZkLCJcblx0IHx8IHNvYXBfZW52ZWxvcGVfYmVnaW5faW4oc29hcCkiKTsKKyAgZnByaW50ZihmZCwiXG5cdCB8fCBzb2FwX3JlY3ZfaGVhZGVyKHNvYXApIik7CisgIGZwcmludGYoZmQsIlxuXHQgfHwgc29hcF9ib2R5X2JlZ2luX2luKHNvYXApKSIpOworICBmcHJpbnRmKGZkLCJcblx0XHRyZXR1cm4gc29hcF9jbG9zZXNvY2soc29hcCk7Iik7CisgIGlmIChpc190cmFuc2llbnQocmVzdWx0LT5pbmZvLnR5cCkpCisgIHsgZnByaW50ZihmZCwiXG5cdHNvYXBfZ2V0XyVzKHNvYXAsICVzLCBcIiVzXCIsIE5VTEwpOyIsIG1ldGhvZC0+c3ltLT5uYW1lLCByZXN1bHQtPnN5bS0+bmFtZSwgbnNfY29udmVydChtZXRob2QtPnN5bS0+bmFtZSkpOworICAgIGZwcmludGYoZmQsIlxuXHRpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0ggJiYgc29hcC0+bGV2ZWwgPT0gMilcblx0XHRzb2FwLT5lcnJvciA9IFNPQVBfTk9fTUVUSE9EOyIpOworICAgIGZwcmludGYoZmQsIlxuXHRpZiAoc29hcC0+ZXJyb3IiKTsKKyAgICBmcHJpbnRmKGZkLCJcblx0IHx8IHNvYXBfYm9keV9lbmRfaW4oc29hcCkiKTsKKyAgICBmcHJpbnRmKGZkLCJcblx0IHx8IHNvYXBfZW52ZWxvcGVfZW5kX2luKHNvYXApIik7CisgICAgZnByaW50ZihmZCwiXG5cdCB8fCBzb2FwX2VuZF9yZWN2KHNvYXApKSIpOworICAgIGZwcmludGYoZmQsIlxuXHRcdHJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsiKTsKKyAgICBmcHJpbnRmKGZkLCJcblx0cmV0dXJuIHNvYXBfY2xvc2Vzb2NrKHNvYXApO1xufSIpOworICAgIGZmbHVzaChmZCk7CisgICAgcmV0dXJuOworICB9CisgIAorICBpZiAoaGFzX25zX2VxKE5VTEwsIHJlc3VsdC0+c3ltLT5uYW1lKSkKKyAgeyB4dHlwID0geHNpX3R5cGUocmVzdWx0LT5pbmZvLnR5cCk7CisgICAgeHRhZyA9IG5zX2NvbnZlcnQocmVzdWx0LT5zeW0tPm5hbWUpOworICB9CisgIGVsc2UKKyAgeyB4dHlwID0gIiI7CisgICAgeHRhZyA9IHhtbF90YWcocmVzdWx0LT5pbmZvLnR5cCk7CisgIH0KKyAgaWYgKHJlc3VsdC0+aW5mby50eXAtPnR5cGUgPT0gVHJlZmVyZW5jZSAmJiAoKFRub2RlICopIHJlc3VsdC0+aW5mby50eXAtPnJlZiktPnR5cGUgPT0gVGNsYXNzICYmICFpc19leHRlcm5hbChyZXN1bHQtPmluZm8udHlwLT5yZWYpICYmICFpc192b2xhdGlsZShyZXN1bHQtPmluZm8udHlwLT5yZWYpICYmICFpc19keW5hbWljX2FycmF5KHJlc3VsdC0+aW5mby50eXAtPnJlZikpCisgICAgZnByaW50ZihmZCwiXG5cdCVzLnNvYXBfZ2V0KHNvYXAsIFwiJXNcIiwgXCIlc1wiKTsiLCByZXN1bHQtPnN5bS0+bmFtZSwgeHRhZywgeHR5cCk7CisgIGVsc2UgaWYgKHJlc3VsdC0+aW5mby50eXAtPnR5cGUgPT0gVHBvaW50ZXIgJiYgKChUbm9kZSAqKSByZXN1bHQtPmluZm8udHlwLT5yZWYpLT50eXBlID09IFRjbGFzcyAmJiAhaXNfZXh0ZXJuYWwocmVzdWx0LT5pbmZvLnR5cC0+cmVmKSAmJiAhaXNfdm9sYXRpbGUocmVzdWx0LT5pbmZvLnR5cC0+cmVmKSAmJiAhaXNfZHluYW1pY19hcnJheShyZXN1bHQtPmluZm8udHlwLT5yZWYpKQorICAgIGZwcmludGYoZmQsIlxuXHQlcy0+c29hcF9nZXQoc29hcCwgXCIlc1wiLCBcIiVzXCIpOyIsIHJlc3VsdC0+c3ltLT5uYW1lLCB4dGFnLCB4dHlwKTsKKyAgZWxzZSBpZiAocmVzdWx0LT5pbmZvLnR5cC0+dHlwZSA9PSBUcmVmZXJlbmNlICYmICgoVG5vZGUgKikgcmVzdWx0LT5pbmZvLnR5cC0+cmVmKS0+dHlwZSA9PSBUc3RydWN0ICYmICFpc19leHRlcm5hbChyZXN1bHQtPmluZm8udHlwLT5yZWYpICYmICFpc192b2xhdGlsZShyZXN1bHQtPmluZm8udHlwLT5yZWYpICYmICFpc19keW5hbWljX2FycmF5KHJlc3VsdC0+aW5mby50eXAtPnJlZikpCisgIHsgZnByaW50ZihmZCwiXG5cdHNvYXBfZ2V0XyVzKHNvYXAsICYlcywgXCIlc1wiLCBcIiVzXCIpOyIsIGNfaWRlbnQocmVzdWx0LT5pbmZvLnR5cC0+cmVmKSwgcmVzdWx0LT5zeW0tPm5hbWUsIHh0YWcsIHh0eXApOworICB9CisgIGVsc2UgaWYgKHJlc3VsdC0+aW5mby50eXAtPnR5cGUgPT0gVHBvaW50ZXIgJiYgKChUbm9kZSAqKSByZXN1bHQtPmluZm8udHlwLT5yZWYpLT50eXBlID09IFRzdHJ1Y3QgJiYgIWlzX2R5bmFtaWNfYXJyYXkocmVzdWx0LT5pbmZvLnR5cC0+cmVmKSkKKyAgeyAKKyAgICBmcHJpbnRmKGZkLCJcblx0c29hcF9nZXRfJXMoc29hcCwgJXMsIFwiJXNcIiwgXCIlc1wiKTsiLCBjX2lkZW50KHJlc3VsdC0+aW5mby50eXAtPnJlZiksIHJlc3VsdC0+c3ltLT5uYW1lLCB4dGFnLCB4dHlwKTsKKyAgfQorICBlbHNlIGlmIChyZXN1bHQtPmluZm8udHlwLT50eXBlID09IFRwb2ludGVyICYmIGlzX1hNTChyZXN1bHQtPmluZm8udHlwLT5yZWYpICYmIGlzX3N0cmluZyhyZXN1bHQtPmluZm8udHlwLT5yZWYpKQorICB7IGZwcmludGYoZmQsIlxuXHRzb2FwX2lubGl0ZXJhbChzb2FwLCBOVUxMLCAlcyk7IiwgcmVzdWx0LT5zeW0tPm5hbWUpOworICB9CisgIGVsc2UgaWYgKHJlc3VsdC0+aW5mby50eXAtPnR5cGUgPT0gVHJlZmVyZW5jZSAmJiBpc19YTUwocmVzdWx0LT5pbmZvLnR5cC0+cmVmKSAmJiBpc19zdHJpbmcocmVzdWx0LT5pbmZvLnR5cC0+cmVmKSkKKyAgeyBmcHJpbnRmKGZkLCJcblx0c29hcF9pbmxpdGVyYWwoc29hcCwgTlVMTCwgJiVzKTsiLCByZXN1bHQtPnN5bS0+bmFtZSk7CisgIH0KKyAgZWxzZSBpZiAocmVzdWx0LT5pbmZvLnR5cC0+dHlwZSA9PSBUcG9pbnRlciAmJiBpc19YTUwocmVzdWx0LT5pbmZvLnR5cC0+cmVmKSAmJiBpc193c3RyaW5nKHJlc3VsdC0+aW5mby50eXAtPnJlZikpCisgIHsgZnByaW50ZihmZCwiXG5cdHNvYXBfaW53bGl0ZXJhbChzb2FwLCBOVUxMLCAlcyk7IiwgcmVzdWx0LT5zeW0tPm5hbWUpOworICB9CisgIGVsc2UgaWYgKHJlc3VsdC0+aW5mby50eXAtPnR5cGUgPT0gVHJlZmVyZW5jZSAmJiBpc19YTUwocmVzdWx0LT5pbmZvLnR5cC0+cmVmKSAmJiBpc193c3RyaW5nKHJlc3VsdC0+aW5mby50eXAtPnJlZikpCisgIHsgZnByaW50ZihmZCwiXG5cdHNvYXBfaW53bGl0ZXJhbChzb2FwLCBOVUxMLCAmJXMpOyIsIHJlc3VsdC0+c3ltLT5uYW1lKTsKKyAgfQorICAvKiBOb3RlOiB0aGUgdHJvdWJsZSB3aXRoICIiIHRhZ3MgaXMgdGhhdCBTT0FQLUVOVjpGYXVsdCBjYW5ub3QgYmUgcGFyc2VkLiBIb3dldmVyLCBTT0FQIGVuY29kaW5nIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlIHJlc3VsdCBzdHJ1Y3QgbmFtZSEKKyAgZWxzZSBpZiAocmVzcG9uc2UgJiYgIWlzX2xpdGVyYWwobWV0aG9kX3Jlc3BvbnNlX2VuY29kaW5nKSkKKyAgeyBmcHJpbnRmKGZkLCJcblx0c29hcF90bXBfJXMgPSBzb2FwX2dldF8lcyhzb2FwLCBOVUxMLCBcIlwiLCBcIlwiKTsiLCBjX2lkZW50KHJlc3BvbnNlLT5pbmZvLnR5cCksIGNfaWRlbnQocmVzcG9uc2UtPmluZm8udHlwKSk7CisgIH0KKyAgKi8KKyAgZWxzZSBpZiAocmVzcG9uc2UpCisgIHsgZnByaW50ZihmZCwiXG5cdHNvYXBfdG1wXyVzID0gc29hcF9nZXRfJXMoc29hcCwgTlVMTCwgXCIlc1wiLCBcIlwiKTsiLCBjX2lkZW50KHJlc3BvbnNlLT5pbmZvLnR5cCksIGNfaWRlbnQocmVzcG9uc2UtPmluZm8udHlwKSwgeG1sX3RhZyhyZXNwb25zZS0+aW5mby50eXApKTsKKyAgfQorICBlbHNlIGlmIChyZXN1bHQtPmluZm8udHlwLT50eXBlID09IFRyZWZlcmVuY2UpCisgIHsgZnByaW50ZihmZCwiXG5cdHNvYXBfZ2V0XyVzKHNvYXAsICYlcywgXCIlc1wiLCBcIiVzXCIpOyIsIGNfaWRlbnQocmVzdWx0LT5pbmZvLnR5cCksIHJlc3VsdC0+c3ltLT5uYW1lLCB4dGFnLCB4dHlwKTsKKyAgfQorICBlbHNlCisgIHsgZnByaW50ZihmZCwiXG5cdHNvYXBfZ2V0XyVzKHNvYXAsICVzLCBcIiVzXCIsIFwiJXNcIik7IiwgY19pZGVudChyZXN1bHQtPmluZm8udHlwKSwgcmVzdWx0LT5zeW0tPm5hbWUsIHh0YWcsIHh0eXApOworICB9CisgIGZmbHVzaChmZCk7CisgIGZwcmludGYoZmQsIlxuXHRpZiAoc29hcC0+ZXJyb3IpIik7CisgIGZwcmludGYoZmQsIlxuXHR7XHRpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0ggJiYgc29hcC0+bGV2ZWwgPT0gMilcblx0XHRcdHJldHVybiBzb2FwX3JlY3ZfZmF1bHQoc29hcCk7Iik7CisgIGZwcmludGYoZmQsIlxuXHRcdHJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsiKTsKKyAgZnByaW50ZihmZCwiXG5cdH0iKTsKKyAgZnByaW50ZihmZCwiXG5cdGlmIChzb2FwX2JvZHlfZW5kX2luKHNvYXApIik7CisgIGZwcmludGYoZmQsIlxuXHQgfHwgc29hcF9lbnZlbG9wZV9lbmRfaW4oc29hcCkiKTsKKyAgZnByaW50ZihmZCwiXG5cdCB8fCBzb2FwX2VuZF9yZWN2KHNvYXApKSIpOworICBmcHJpbnRmKGZkLCJcblx0XHRyZXR1cm4gc29hcF9jbG9zZXNvY2soc29hcCk7Iik7CisgIGlmICghaXNfcmVzcG9uc2UocmVzdWx0LT5pbmZvLnR5cCkgJiYgcmVzcG9uc2UpCisgIHsgaWYgKHJlc3VsdC0+aW5mby50eXAtPnR5cGUgPT0gVGFycmF5KQorICAgICAgZnByaW50ZihmZCwiXG5cdG1lbWNweSglcywgc29hcF90bXBfJXMtPiVzIiwgcmVzdWx0LT5zeW0tPm5hbWUsIGNfaWRlbnQocmVzcG9uc2UtPmluZm8udHlwKSwgcmVzdWx0LT5zeW0tPm5hbWUsIGNfdHlwZShyZXN1bHQtPmluZm8udHlwKSk7CisgICAgZWxzZSBpZiAocmVzdWx0LT5pbmZvLnR5cC0+dHlwZSA9PSBUcmVmZXJlbmNlKQorICAgICAgZnByaW50ZihmZCwiXG5cdCVzID0gc29hcF90bXBfJXMtPiVzOyIsIHJlc3VsdC0+c3ltLT5uYW1lLCBjX2lkZW50KHJlc3BvbnNlLT5pbmZvLnR5cCksIHJlc3VsdC0+c3ltLT5uYW1lKTsKKyAgICBlbHNlIGlmICghaXNfZXh0ZXJuYWwocmVzdWx0LT5pbmZvLnR5cC0+cmVmKSkKKyAgICB7IGZwcmludGYoZmQsIlxuXHRpZiAoJXMgJiYgc29hcF90bXBfJXMtPiVzKSIsIHJlc3VsdC0+c3ltLT5uYW1lLCBjX2lkZW50KHJlc3BvbnNlLT5pbmZvLnR5cCksIHJlc3VsdC0+c3ltLT5uYW1lKTsKKyAgICAgIGZwcmludGYoZmQsIlxuXHRcdColcyA9ICpzb2FwX3RtcF8lcy0+JXM7IiwgcmVzdWx0LT5zeW0tPm5hbWUsIGNfaWRlbnQocmVzcG9uc2UtPmluZm8udHlwKSwgcmVzdWx0LT5zeW0tPm5hbWUpOworICAgIH0KKyAgfQorICBmcHJpbnRmKGZkLCJcblx0cmV0dXJuIHNvYXBfY2xvc2Vzb2NrKHNvYXApOyIpOworICBmcHJpbnRmKGZkICwiXG59Iik7CisgIGZmbHVzaChmZCk7Cit9CisKK3ZvaWQKK2dlbl9zZXJ2ZV9tZXRob2QoRklMRSAqZmQsIFRhYmxlICp0YWJsZSwgRW50cnkgKnBhcmFtLCBjaGFyICpuYW1lKQoreyBTZXJ2aWNlICpzcCA9IE5VTEw7CisgIGNoYXIgKnN0eWxlLCAqZW5jb2Rpbmc7CisgIEVudHJ5ICpxLCpwaW4sICpwb3V0LCAqcmVzcG9uc2U7CisgIFRhYmxlICp0LCAqaW5wdXQ7CisgIGNoYXIgKnh0YWc7CisgIE1ldGhvZCAqbTsKKyAgY2hhciAqcywgKm1ldGhvZF9zdHlsZSA9IE5VTEwsICptZXRob2RfZW5jb2RpbmcgPSBOVUxMLCAqbWV0aG9kX3Jlc3BvbnNlX2VuY29kaW5nID0gTlVMTDsKKyAgcSA9IGVudHJ5KHRhYmxlLCBwYXJhbS0+c3ltKTsKKyAgaWYgKCFxKQorICAgIGV4ZWNlcnJvcigibm8gdGFibGUgZW50cnkiKTsKKyAgcG91dCA9IChFbnRyeSopcS0+aW5mby50eXAtPnJlZjsKKyAgaWYgKCFpc19yZXNwb25zZShwb3V0LT5pbmZvLnR5cCkpCisgICAgcmVzcG9uc2UgPSBnZXRfcmVzcG9uc2UocGFyYW0tPmluZm8udHlwKTsKKyAgaWYgKG5hbWUpCisgICAgZnByaW50ZihmZCwgIlxuXG5zdGF0aWMgaW50IHNlcnZlXyVzKCVzICpzb2FwKSIsIHBhcmFtLT5zeW0tPm5hbWUsIG5hbWUpOworICBlbHNlCisgIHsgZnByaW50ZihmaGVhZGVyLCAiXG5cblNPQVBfRk1BQzUgaW50IFNPQVBfRk1BQzYgc29hcF9zZXJ2ZV8lcyhzdHJ1Y3Qgc29hcCopOyIscGFyYW0tPnN5bS0+bmFtZSk7CisgICAgZnByaW50ZihmZCwgIlxuXG5TT0FQX0ZNQUM1IGludCBTT0FQX0ZNQUM2IHNvYXBfc2VydmVfJXMoc3RydWN0IHNvYXAgKnNvYXApIixwYXJhbS0+c3ltLT5uYW1lKTsKKyAgfQorICBmcHJpbnRmKGZkLCAiXG57XHRzdHJ1Y3QgJXMgc29hcF90bXBfJXM7IiwgcGFyYW0tPnN5bS0+bmFtZSwgcGFyYW0tPnN5bS0+bmFtZSk7CisgIGZvciAoc3AgPSBzZXJ2aWNlczsgc3A7IHNwID0gc3AtPm5leHQpCisgICAgaWYgKGhhc19uc19lcShzcC0+bnMsIHBhcmFtLT5zeW0tPm5hbWUpKQorICAgIHsgc3R5bGUgPSBzcC0+c3R5bGU7CisgICAgICBlbmNvZGluZyA9IHNwLT5lbmNvZGluZzsKKyAgICAgIG1ldGhvZF9zdHlsZSA9IHN0eWxlOworICAgICAgbWV0aG9kX2VuY29kaW5nID0gZW5jb2Rpbmc7CisgICAgICBtZXRob2RfcmVzcG9uc2VfZW5jb2RpbmcgPSBOVUxMOworICAgICAgZm9yIChtID0gc3AtPmxpc3Q7IG07IG0gPSBtLT5uZXh0KQorCWlmIChpc19lcV9ub25zKG0tPm5hbWUsIHBhcmFtLT5zeW0tPm5hbWUpKQorCSAgaWYgKG0tPm1lc3MgPT0gRU5DT0RJTkcpCisJICAgIG1ldGhvZF9lbmNvZGluZyA9IG0tPnBhcnQ7CisJICBlbHNlIGlmIChtLT5tZXNzID09IFJFU1BPTlNFX0VOQ09ESU5HKQorCSAgICBtZXRob2RfcmVzcG9uc2VfZW5jb2RpbmcgPSBtLT5wYXJ0OworCSAgZWxzZSBpZiAobS0+bWVzcyA9PSBTVFlMRSkKKwkgICAgbWV0aG9kX3N0eWxlID0gbS0+cGFydDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgaWYgKCFtZXRob2RfcmVzcG9uc2VfZW5jb2RpbmcpCisgICAgbWV0aG9kX3Jlc3BvbnNlX2VuY29kaW5nID0gbWV0aG9kX2VuY29kaW5nOworICBmZmx1c2goZmQpOworICBpZiAoIWlzX3RyYW5zaWVudChwb3V0LT5pbmZvLnR5cCkpCisgIHsgaWYgKHBvdXQtPmluZm8udHlwLT50eXBlID09IFRhcnJheSkKKyAgICB7IGZwcmludGYoZmQsIlxuXHRzdHJ1Y3QgJXMgc29hcF90bXBfJXM7IiwgY19pZGVudChyZXNwb25zZS0+aW5mby50eXApLCBjX2lkZW50KHJlc3BvbnNlLT5pbmZvLnR5cCkpOworICAgICAgZnByaW50ZihmZCwiXG5cdHNvYXBfZGVmYXVsdF8lcyhzb2FwLCAmc29hcF90bXBfJXMpOyIsIGNfaWRlbnQocmVzcG9uc2UtPmluZm8udHlwKSwgY19pZGVudChyZXNwb25zZS0+aW5mby50eXApKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKChUbm9kZSAqKXBvdXQtPmluZm8udHlwLT5yZWYpLT50eXBlID09IFRjbGFzcyAmJiAhaXNfc3Rkc3RyaW5nKHBvdXQtPmluZm8udHlwLT5yZWYpICYmICFpc19zdGR3c3RyaW5nKHBvdXQtPmluZm8udHlwLT5yZWYpICYmIChpc19leHRlcm5hbChwb3V0LT5pbmZvLnR5cC0+cmVmKSB8fCBpc192b2xhdGlsZShwb3V0LT5pbmZvLnR5cC0+cmVmKSB8fCBpc190eXBlZGVmKHBvdXQtPmluZm8udHlwLT5yZWYpKSAmJiAhaXNfZHluYW1pY19hcnJheShwb3V0LT5pbmZvLnR5cC0+cmVmKSkKKyAgICB7IGZwcmludGYoZmQsICJcblx0JXM7IiwgY190eXBlX2lkKChUbm9kZSopcG91dC0+aW5mby50eXAtPnJlZiwgcG91dC0+c3ltLT5uYW1lKSk7CisgICAgICBmcHJpbnRmKGZkLCJcblx0c29hcF9kZWZhdWx0XyVzKHNvYXAsICYlcyk7IiwgY19pZGVudCgoVG5vZGUqKXBvdXQtPmluZm8udHlwLT5yZWYpLCBwb3V0LT5zeW0tPm5hbWUpOyAgCisgICAgfQorICAgIGVsc2UgaWYgKCgoVG5vZGUgKilwb3V0LT5pbmZvLnR5cC0+cmVmKS0+dHlwZSA9PSBUY2xhc3MgJiYgIWlzX3N0ZHN0cmluZyhwb3V0LT5pbmZvLnR5cC0+cmVmKSAmJiAhaXNfc3Rkd3N0cmluZyhwb3V0LT5pbmZvLnR5cC0+cmVmKSAmJiAhaXNfZHluYW1pY19hcnJheShwb3V0LT5pbmZvLnR5cC0+cmVmKSkKKyAgICB7IGZwcmludGYoZmQsICJcblx0JXM7IiwgY190eXBlX2lkKChUbm9kZSopcG91dC0+aW5mby50eXAtPnJlZiwgcG91dC0+c3ltLT5uYW1lKSk7CisgICAgICBmcHJpbnRmKGZkLCJcblx0JXMuc29hcF9kZWZhdWx0KHNvYXApOyIsIHBvdXQtPnN5bS0+bmFtZSk7CisgICAgfQorICAgIGVsc2UgaWYgKCgoVG5vZGUgKilwb3V0LT5pbmZvLnR5cC0+cmVmKS0+dHlwZSA9PSBUc3RydWN0ICYmICFpc19keW5hbWljX2FycmF5KHBvdXQtPmluZm8udHlwLT5yZWYpKQorICAgIHsgZnByaW50ZihmZCwgIlxuXHQlczsiLCBjX3R5cGVfaWQoKFRub2RlKilwb3V0LT5pbmZvLnR5cC0+cmVmLCBwb3V0LT5zeW0tPm5hbWUpKTsKKyAgICAgIGZwcmludGYoZmQsIlxuXHRzb2FwX2RlZmF1bHRfJXMoc29hcCwgJiVzKTsiLCBjX2lkZW50KChUbm9kZSAqKXBvdXQtPmluZm8udHlwLT5yZWYpLCBwb3V0LT5zeW0tPm5hbWUpOyAgCisgICAgfQorICAgIGVsc2UgaWYgKHBvdXQtPmluZm8udHlwLT50eXBlID09IFRwb2ludGVyICYmICFpc19zdGRzdHJpbmcocG91dC0+aW5mby50eXApICYmICFpc19zdGR3c3RyaW5nKHBvdXQtPmluZm8udHlwKSAmJiByZXNwb25zZSkKKyAgICB7IGZwcmludGYoZmQsIlxuXHRzdHJ1Y3QgJXMgc29hcF90bXBfJXM7IiwgY19pZGVudChyZXNwb25zZS0+aW5mby50eXApLCBjX2lkZW50KHJlc3BvbnNlLT5pbmZvLnR5cCkpOworICAgICAgZnByaW50ZihmZCwiXG5cdCVzIHNvYXBfdG1wXyVzOyIsIGNfdHlwZShwb3V0LT5pbmZvLnR5cC0+cmVmKSwgY19pZGVudChwb3V0LT5pbmZvLnR5cC0+cmVmKSk7CisgICAgICBmcHJpbnRmKGZkLCJcblx0c29hcF9kZWZhdWx0XyVzKHNvYXAsICZzb2FwX3RtcF8lcyk7IiwgY19pZGVudChyZXNwb25zZS0+aW5mby50eXApLCBjX2lkZW50KHJlc3BvbnNlLT5pbmZvLnR5cCkpOworICAgICAgaWYgKCgoVG5vZGUqKXBvdXQtPmluZm8udHlwLT5yZWYpLT50eXBlID09IFRjbGFzcyAmJiAhaXNfZXh0ZXJuYWwocG91dC0+aW5mby50eXAtPnJlZikgJiYgIWlzX3ZvbGF0aWxlKHBvdXQtPmluZm8udHlwLT5yZWYpICYmICFpc190eXBlZGVmKHBvdXQtPmluZm8udHlwLT5yZWYpKQorICAgICAgICBmcHJpbnRmKGZkLCJcblx0c29hcF90bXBfJXMuc29hcF9kZWZhdWx0KHNvYXApOyIsIGNfaWRlbnQocG91dC0+aW5mby50eXAtPnJlZikpOworICAgICAgZWxzZSBpZiAoKChUbm9kZSopcG91dC0+aW5mby50eXAtPnJlZiktPnR5cGUgPT0gVHBvaW50ZXIpCisgICAgICAgIGZwcmludGYoZmQsIlxuXHRzb2FwX3RtcF8lcyA9IE5VTEw7IiwgY19pZGVudChwb3V0LT5pbmZvLnR5cC0+cmVmKSk7CisgICAgICBlbHNlCisgICAgICAgIGZwcmludGYoZmQsIlxuXHRzb2FwX2RlZmF1bHRfJXMoc29hcCwgJnNvYXBfdG1wXyVzKTsiLCBjX2lkZW50KHBvdXQtPmluZm8udHlwLT5yZWYpLCBjX2lkZW50KHBvdXQtPmluZm8udHlwLT5yZWYpKTsKKyAgICAgIGZwcmludGYoZmQsIlxuXHRzb2FwX3RtcF8lcy4lcyA9ICZzb2FwX3RtcF8lczsiLCBjX2lkZW50KHJlc3BvbnNlLT5pbmZvLnR5cCkscG91dC0+c3ltLT5uYW1lLCBjX2lkZW50KHBvdXQtPmluZm8udHlwLT5yZWYpKTsKKyAgICB9CisgICAgZWxzZSBpZiAocmVzcG9uc2UpCisgICAgeyBmcHJpbnRmKGZkLCJcblx0c3RydWN0ICVzIHNvYXBfdG1wXyVzOyIsIGNfaWRlbnQocmVzcG9uc2UtPmluZm8udHlwKSwgY19pZGVudChyZXNwb25zZS0+aW5mby50eXApKTsKKyAgICAgIGZwcmludGYoZmQsIlxuXHRzb2FwX2RlZmF1bHRfJXMoc29hcCwgJnNvYXBfdG1wXyVzKTsiLCBjX2lkZW50KHJlc3BvbnNlLT5pbmZvLnR5cCksIGNfaWRlbnQocmVzcG9uc2UtPmluZm8udHlwKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IGZwcmludGYoZmQsIlxuXHQlcyBzb2FwX3RtcF8lczsiLCBjX3R5cGUocG91dC0+aW5mby50eXAtPnJlZiksIGNfaWRlbnQocG91dC0+aW5mby50eXAtPnJlZikpOworICAgICAgaWYgKGlzX3N0cmluZyhwb3V0LT5pbmZvLnR5cC0+cmVmKSB8fCBpc193c3RyaW5nKHBvdXQtPmluZm8udHlwLT5yZWYpKQorICAgICAgICBmcHJpbnRmKGZkLCJcblx0c29hcF90bXBfJXMgPSBOVUxMOyIsIGNfaWRlbnQocG91dC0+aW5mby50eXAtPnJlZikpOworICAgICAgZWxzZQorICAgICAgICBmcHJpbnRmKGZkLCJcblx0c29hcF9kZWZhdWx0XyVzKHNvYXAsICZzb2FwX3RtcF8lcyk7IiwgY19pZGVudChwb3V0LT5pbmZvLnR5cC0+cmVmKSwgY19pZGVudChwb3V0LT5pbmZvLnR5cC0+cmVmKSk7CisgICAgfQorICB9CisgIGZwcmludGYoZmQsIlxuXHRzb2FwX2RlZmF1bHRfJXMoc29hcCwgJnNvYXBfdG1wXyVzKTsiLCBwYXJhbS0+c3ltLT5uYW1lLCBwYXJhbS0+c3ltLT5uYW1lKTsKKyAgZmZsdXNoKGZkKTsKKyAgaWYgKHNwICYmIHNwLT5VUkkgJiYgbWV0aG9kX3Jlc3BvbnNlX2VuY29kaW5nKQorICB7ICAgICBpZiAoaXNfbGl0ZXJhbChtZXRob2RfcmVzcG9uc2VfZW5jb2RpbmcpKQorICAgICAgICAgIGZwcmludGYoZmQsICJcblx0c29hcC0+ZW5jb2RpbmdTdHlsZSA9IE5VTEw7Iik7CisgICAgICAgIGVsc2UgaWYgKHNwLT5lbmNvZGluZykKKyAgICAgICAgICBmcHJpbnRmKGZkLCAiXG5cdHNvYXAtPmVuY29kaW5nU3R5bGUgPSBcIiVzXCI7Iiwgc3AtPmVuY29kaW5nKTsKKwllbHNlIGlmIChtZXRob2RfcmVzcG9uc2VfZW5jb2RpbmcpCisJICBmcHJpbnRmKGZkLCAiXG5cdHNvYXAtPmVuY29kaW5nU3R5bGUgPSBcIiVzXCI7IiwgbWV0aG9kX3Jlc3BvbnNlX2VuY29kaW5nKTsKKyAgICAgICAgZWxzZSBpZiAoIWVmbGFnKQorICAgICAgICAgIGZwcmludGYoZmQsICJcblx0c29hcC0+ZW5jb2RpbmdTdHlsZSA9IE5VTEw7Iik7CisgIH0KKyAgZWxzZSBpZiAoIWVmbGFnKQorICAgIGZwcmludGYoZmQsICJcblx0c29hcC0+ZW5jb2RpbmdTdHlsZSA9IE5VTEw7Iik7CisgIGZwcmludGYoZmQsIlxuXHRpZiAoIXNvYXBfZ2V0XyVzKHNvYXAsICZzb2FwX3RtcF8lcywgXCIlc1wiLCBOVUxMKSkiLCBwYXJhbS0+c3ltLT5uYW1lLCBwYXJhbS0+c3ltLT5uYW1lLCBuc19jb252ZXJ0KHBhcmFtLT5zeW0tPm5hbWUpKTsKKyAgZnByaW50ZihmZCwiXG5cdFx0cmV0dXJuIHNvYXAtPmVycm9yOyIpOworICBmcHJpbnRmKGZkLCJcblx0aWYgKHNvYXBfYm9keV9lbmRfaW4oc29hcCkiKTsKKyAgZnByaW50ZihmZCwiXG5cdCB8fCBzb2FwX2VudmVsb3BlX2VuZF9pbihzb2FwKSIpOworICBmcHJpbnRmKGZkLCJcblx0IHx8IHNvYXBfZW5kX3JlY3Yoc29hcCkpXG5cdFx0cmV0dXJuIHNvYXAtPmVycm9yOyIpOworICBpZiAobmFtZSkKKyAgICBmcHJpbnRmKGZkLCAiXG5cdHNvYXAtPmVycm9yID0gc29hcC0+JXMoIiwgbnNfY25hbWUocGFyYW0tPnN5bS0+bmFtZSwgTlVMTCkpOworICBlbHNlCisgICAgZnByaW50ZihmZCwgIlxuXHRzb2FwLT5lcnJvciA9ICVzKHNvYXAiLCBwYXJhbS0+c3ltLT5uYW1lKTsKKyAgZmZsdXNoKGZkKTsKKyAgcT1lbnRyeShjbGFzc3RhYmxlLCBwYXJhbS0+c3ltKTsKKyAgaW5wdXQ9KFRhYmxlKikgcS0+aW5mby50eXAtPnJlZjsKKyAgZm9yIChwaW4gPSBpbnB1dC0+bGlzdDsgcGluOyBwaW4gPSBwaW4tPm5leHQpCisgICAgZnByaW50ZihmZCwgIiVzc29hcF90bXBfJXMuJXMiLCAhbmFtZSB8fCBwaW4gIT0gaW5wdXQtPmxpc3QgPyAiLCAiIDogIiIsIHBhcmFtLT5zeW0tPm5hbWUsIHBpbi0+c3ltLT5uYW1lKTsKKyAgaWYgKGlzX3RyYW5zaWVudChwb3V0LT5pbmZvLnR5cCkpCisgICAgZnByaW50ZihmZCwgIik7Iik7CisgIGVsc2UKKyAgeyBpZiAoIW5hbWUgfHwgaW5wdXQtPmxpc3QpCisgICAgICBmcHJpbnRmKGZkLCAiLCAiKTsKKyAgICBpZiAocG91dC0+aW5mby50eXAtPnR5cGUgPT0gVGFycmF5KQorICAgICAgZnByaW50ZihmZCwgInNvYXBfdG1wXyVzLiVzKTsiLCBjX2lkZW50KHJlc3BvbnNlLT5pbmZvLnR5cCksIHBvdXQtPnN5bS0+bmFtZSk7CisgICAgZWxzZSBpZiAocG91dC0+aW5mby50eXAtPnR5cGUgPT0gVHJlZmVyZW5jZSAmJiAoKChUbm9kZSopcG91dC0+aW5mby50eXAtPnJlZiktPnR5cGUgPT0gVHN0cnVjdCB8fCAoKFRub2RlKilwb3V0LT5pbmZvLnR5cC0+cmVmKS0+dHlwZSA9PSBUY2xhc3MpICYmICFpc19zdGRzdHJpbmcocG91dC0+aW5mby50eXAtPnJlZikgJiYgIWlzX3N0ZHdzdHJpbmcocG91dC0+aW5mby50eXAtPnJlZikgJiYgIWlzX2R5bmFtaWNfYXJyYXkocG91dC0+aW5mby50eXAtPnJlZikpCisgICAgICBmcHJpbnRmKGZkLCAiJXMpOyIsIHBvdXQtPnN5bS0+bmFtZSk7CisgICAgZWxzZSBpZiAoKCgoVG5vZGUqKXBvdXQtPmluZm8udHlwLT5yZWYpLT50eXBlID09IFRzdHJ1Y3QgfHwgKChUbm9kZSopcG91dC0+aW5mby50eXAtPnJlZiktPnR5cGUgPT0gVGNsYXNzKSAmJiAhaXNfc3Rkc3RyaW5nKHBvdXQtPmluZm8udHlwLT5yZWYpICYmICFpc19zdGR3c3RyaW5nKHBvdXQtPmluZm8udHlwLT5yZWYpICYmICFpc19keW5hbWljX2FycmF5KHBvdXQtPmluZm8udHlwLT5yZWYpKQorICAgICAgZnByaW50ZihmZCwgIiYlcyk7IiwgcG91dC0+c3ltLT5uYW1lKTsKKyAgICBlbHNlIGlmKHBvdXQtPmluZm8udHlwLT50eXBlID09IFRyZWZlcmVuY2UgJiYgcmVzcG9uc2UpCisgICAgICBmcHJpbnRmKGZkLCAic29hcF90bXBfJXMuJXMpOyIsIGNfaWRlbnQocmVzcG9uc2UtPmluZm8udHlwKSwgcG91dC0+c3ltLT5uYW1lKTsKKyAgICBlbHNlIGlmKHBvdXQtPmluZm8udHlwLT50eXBlID09IFRyZWZlcmVuY2UpCisgICAgICBmcHJpbnRmKGZkLCAic29hcF90bXBfJXMpOyIsIGNfaWRlbnQocG91dC0+aW5mby50eXAtPnJlZikpOworICAgIGVsc2UKKyAgICAgIGZwcmludGYoZmQsICImc29hcF90bXBfJXMpOyIsIGNfaWRlbnQocG91dC0+aW5mby50eXAtPnJlZikpOworICB9CisgIGZwcmludGYoZmQsIlxuXHRpZiAoc29hcC0+ZXJyb3IpXG5cdFx0cmV0dXJuIHNvYXAtPmVycm9yOyIpOworICAKKyAgaWYgKCFpc190cmFuc2llbnQocG91dC0+aW5mby50eXApKQorICB7IGZwcmludGYoZmQsIlxuXHRzb2FwX3NlcmlhbGl6ZWhlYWRlcihzb2FwKTsiKTsKKyAgICBpZiAocG91dC0+aW5mby50eXAtPnR5cGUgPT0gVGFycmF5KQorICAgICAgZnByaW50ZihmZCwgIlxuXHRzb2FwX3NlcmlhbGl6ZV8lcyhzb2FwLCAmc29hcF90bXBfJXMpOyIsIGNfaWRlbnQocmVzcG9uc2UtPmluZm8udHlwKSwgY19pZGVudChyZXNwb25zZS0+aW5mby50eXApKTsKKyAgICBlbHNlIGlmICgoKFRub2RlICopcG91dC0+aW5mby50eXAtPnJlZiktPnR5cGUgPT0gVGNsYXNzICYmICFpc19zdGRzdHJpbmcocG91dC0+aW5mby50eXAtPnJlZikgJiYgIWlzX3N0ZHdzdHJpbmcocG91dC0+aW5mby50eXAtPnJlZikgJiYgKGlzX2V4dGVybmFsKHBvdXQtPmluZm8udHlwLT5yZWYpIHx8IGlzX3ZvbGF0aWxlKHBvdXQtPmluZm8udHlwLT5yZWYpIHx8IGlzX3R5cGVkZWYocG91dC0+aW5mby50eXAtPnJlZikpICYmICFpc19keW5hbWljX2FycmF5KHBvdXQtPmluZm8udHlwLT5yZWYpKQorICAgICAgZnByaW50ZihmZCwgIlxuXHRzb2FwX3NlcmlhbGl6ZV8lcyhzb2FwLCAmJXMpOyIsIGNfaWRlbnQoKFRub2RlKilwb3V0LT5pbmZvLnR5cC0+cmVmKSwgcG91dC0+c3ltLT5uYW1lKTsKKyAgICBlbHNlIGlmKCgoVG5vZGUgKilwb3V0LT5pbmZvLnR5cC0+cmVmKS0+dHlwZSA9PSBUY2xhc3MgJiYgIWlzX3N0ZHN0cmluZyhwb3V0LT5pbmZvLnR5cC0+cmVmKSAmJiAhaXNfc3Rkd3N0cmluZyhwb3V0LT5pbmZvLnR5cC0+cmVmKSAmJiAhaXNfZHluYW1pY19hcnJheShwb3V0LT5pbmZvLnR5cC0+cmVmKSkKKyAgICAgIGZwcmludGYoZmQsICJcblx0JXMuc29hcF9zZXJpYWxpemUoc29hcCk7IiwgcG91dC0+c3ltLT5uYW1lKTsKKyAgICBlbHNlIGlmKCgoVG5vZGUgKilwb3V0LT5pbmZvLnR5cC0+cmVmKS0+dHlwZSA9PSBUc3RydWN0ICYmICFpc19keW5hbWljX2FycmF5KHBvdXQtPmluZm8udHlwLT5yZWYpKQorICAgICAgZnByaW50ZihmZCwgIlxuXHRzb2FwX3NlcmlhbGl6ZV8lcyhzb2FwLCAmJXMpOyIsIGNfaWRlbnQoKFRub2RlKilwb3V0LT5pbmZvLnR5cC0+cmVmKSwgcG91dC0+c3ltLT5uYW1lKTsKKyAgICBlbHNlIGlmIChyZXNwb25zZSkKKyAgICAgIGZwcmludGYoZmQsICJcblx0c29hcF9zZXJpYWxpemVfJXMoc29hcCwgJnNvYXBfdG1wXyVzKTsiLCBjX2lkZW50KHJlc3BvbnNlLT5pbmZvLnR5cCksIGNfaWRlbnQocmVzcG9uc2UtPmluZm8udHlwKSk7CisgICAgZWxzZSBpZiAoIWlzX1hNTChwb3V0LT5pbmZvLnR5cC0+cmVmKSkKKyAgICAgIGZwcmludGYoZmQsICJcblx0c29hcF9zZXJpYWxpemVfJXMoc29hcCwgJnNvYXBfdG1wXyVzKTsiLCBjX2lkZW50KHBvdXQtPmluZm8udHlwLT5yZWYpLCBjX2lkZW50KHBvdXQtPmluZm8udHlwLT5yZWYpKTsKKyAgICBpZiAoaGFzX25zX2VxKE5VTEwsIHBvdXQtPnN5bS0+bmFtZSkpCisgICAgICB4dGFnID0gbnNfY29udmVydChwb3V0LT5zeW0tPm5hbWUpOworICAgIGVsc2UKKyAgICAgIHh0YWcgPSB4bWxfdGFnKHBvdXQtPmluZm8udHlwKTsKKyAgICBmcHJpbnRmKGZkLCAiXG5cdGlmIChzb2FwX2JlZ2luX2NvdW50KHNvYXApKVxuXHRcdHJldHVybiBzb2FwLT5lcnJvcjsiKTsKKyAgICBmcHJpbnRmKGZkLCAiXG5cdGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpIik7CisgICAgZnByaW50ZihmZCwgIlxuXHR7XHRpZiAoc29hcF9lbnZlbG9wZV9iZWdpbl9vdXQoc29hcCkiKTsKKyAgICBmcHJpbnRmKGZkLCJcblx0XHQgfHwgc29hcF9wdXRoZWFkZXIoc29hcCkiKTsKKyAgICBmcHJpbnRmKGZkLCJcblx0XHQgfHwgc29hcF9ib2R5X2JlZ2luX291dChzb2FwKSIpOworICAgIGlmIChwb3V0LT5pbmZvLnR5cC0+dHlwZSA9PSBUYXJyYXkpCisgICAgICBmcHJpbnRmKGZkLCJcblx0XHQgfHwgc29hcF9wdXRfJXMoc29hcCwgJnNvYXBfdG1wXyVzLiVzLCBcIiVzXCIsIFwiXCIpIiwgY19pZGVudChyZXNwb25zZS0+aW5mby50eXApLCBjX2lkZW50KHJlc3BvbnNlLT5pbmZvLnR5cCksIHBvdXQtPnN5bS0+bmFtZSwgeHRhZyk7CisgICAgZWxzZSBpZiAoKChUbm9kZSopcG91dC0+aW5mby50eXAtPnJlZiktPnR5cGUgPT0gVGNsYXNzICYmICFpc19zdGRzdHJpbmcocG91dC0+aW5mby50eXAtPnJlZikgJiYgIWlzX3N0ZHdzdHJpbmcocG91dC0+aW5mby50eXAtPnJlZikgJiYgKGlzX2V4dGVybmFsKHBvdXQtPmluZm8udHlwLT5yZWYpIHx8IGlzX3ZvbGF0aWxlKHBvdXQtPmluZm8udHlwLT5yZWYpIHx8IGlzX3R5cGVkZWYocG91dC0+aW5mby50eXAtPnJlZikpICYmICFpc19keW5hbWljX2FycmF5KHBvdXQtPmluZm8udHlwLT5yZWYpKQorICAgICAgZnByaW50ZihmZCwgIlxuXHRcdCB8fCBzb2FwX3B1dF8lcyhzb2FwLCAmJXMsIFwiJXNcIiwgXCJcIikiLCBjX2lkZW50KChUbm9kZSopcG91dC0+aW5mby50eXAtPnJlZiksIHBvdXQtPnN5bS0+bmFtZSwgbnNfY29udmVydChwb3V0LT5zeW0tPm5hbWUpKTsKKyAgICBlbHNlIGlmICgoKFRub2RlKilwb3V0LT5pbmZvLnR5cC0+cmVmKS0+dHlwZSA9PSBUY2xhc3MgJiYgIWlzX3N0ZHN0cmluZyhwb3V0LT5pbmZvLnR5cC0+cmVmKSAmJiAhaXNfc3Rkd3N0cmluZyhwb3V0LT5pbmZvLnR5cC0+cmVmKSAmJiAhaXNfZHluYW1pY19hcnJheShwb3V0LT5pbmZvLnR5cC0+cmVmKSkKKyAgICAgIGZwcmludGYoZmQsICJcblx0XHQgfHwgJXMuc29hcF9wdXQoc29hcCwgXCIlc1wiLCBcIlwiKSIsIHBvdXQtPnN5bS0+bmFtZSwgeHRhZyk7CisgICAgZWxzZSBpZiAoKChUbm9kZSopcG91dC0+aW5mby50eXAtPnJlZiktPnR5cGUgPT0gVHN0cnVjdCAmJiAhaXNfZHluYW1pY19hcnJheShwb3V0LT5pbmZvLnR5cC0+cmVmKSkKKyAgICAgIGZwcmludGYoZmQsICJcblx0XHQgfHwgc29hcF9wdXRfJXMoc29hcCwgJiVzLCBcIiVzXCIsIFwiXCIpIiwgY19pZGVudCgoVG5vZGUqKXBvdXQtPmluZm8udHlwLT5yZWYpLCBwb3V0LT5zeW0tPm5hbWUsIHh0YWcpOworICAgIGVsc2UgaWYgKHJlc3BvbnNlKQorICAgICAgZnByaW50ZihmZCwiXG5cdFx0IHx8IHNvYXBfcHV0XyVzKHNvYXAsICZzb2FwX3RtcF8lcywgXCIlc1wiLCBcIlwiKSIsIGNfaWRlbnQocmVzcG9uc2UtPmluZm8udHlwKSwgY19pZGVudChyZXNwb25zZS0+aW5mby50eXApLCB4bWxfdGFnKHJlc3BvbnNlLT5pbmZvLnR5cCkpOworICAgIGVsc2UgaWYgKGlzX1hNTChwb3V0LT5pbmZvLnR5cC0+cmVmKSAmJiBpc19zdHJpbmcocG91dC0+aW5mby50eXAtPnJlZikpCisgICAgICBmcHJpbnRmKGZkLCJcblx0XHQgfHwgc29hcF9vdXRsaXRlcmFsKHNvYXAsIFwiJXNcIiwgJnNvYXBfdG1wXyVzKSIsIG5zX2NvbnZlcnQocG91dC0+c3ltLT5uYW1lKSwgY19pZGVudChwb3V0LT5pbmZvLnR5cC0+cmVmKSk7CisgICAgZWxzZSBpZiAoaXNfWE1MKHBvdXQtPmluZm8udHlwLT5yZWYpICYmIGlzX3dzdHJpbmcocG91dC0+aW5mby50eXAtPnJlZikpCisgICAgICBmcHJpbnRmKGZkLCJcblx0XHQgfHwgc29hcF9vdXR3bGl0ZXJhbChzb2FwLCBcIiVzXCIsICZzb2FwX3RtcF8lcykiLCBuc19jb252ZXJ0KHBvdXQtPnN5bS0+bmFtZSksIGNfaWRlbnQocG91dC0+aW5mby50eXAtPnJlZikpOworICAgIGVsc2UKKyAgICAgIGZwcmludGYoZmQsIlxuXHRcdCB8fCBzb2FwX3B1dF8lcyhzb2FwLCAmc29hcF90bXBfJXMsIFwiJXNcIiwgXCJcIikiLCBjX2lkZW50KHBvdXQtPmluZm8udHlwKSwgY19pZGVudChwb3V0LT5pbmZvLnR5cC0+cmVmKSwgbnNfY29udmVydChwb3V0LT5zeW0tPm5hbWUpKTsKKyAgICBmcHJpbnRmKGZkLCJcblx0XHQgfHwgc29hcF9ib2R5X2VuZF9vdXQoc29hcCkiKTsKKyAgICBmcHJpbnRmKGZkLCJcblx0XHQgfHwgc29hcF9lbnZlbG9wZV9lbmRfb3V0KHNvYXApKSIpOworICAgIGZwcmludGYoZmQsIlxuXHRcdFx0IHJldHVybiBzb2FwLT5lcnJvcjsiKTsKKyAgICBmcHJpbnRmKGZkLCJcblx0fTsiKTsKKyAgICBmcHJpbnRmKGZkLCJcblx0aWYgKHNvYXBfZW5kX2NvdW50KHNvYXApIik7CisgICAgZnByaW50ZihmZCwiXG5cdCB8fCBzb2FwX3Jlc3BvbnNlKHNvYXAsIFNPQVBfT0spIik7CisgICAgZnByaW50ZihmZCwiXG5cdCB8fCBzb2FwX2VudmVsb3BlX2JlZ2luX291dChzb2FwKSIpOworICAgIGZwcmludGYoZmQsIlxuXHQgfHwgc29hcF9wdXRoZWFkZXIoc29hcCkiKTsKKyAgICBmcHJpbnRmKGZkLCJcblx0IHx8IHNvYXBfYm9keV9iZWdpbl9vdXQoc29hcCkiKTsKKyAgICBpZiAocG91dC0+aW5mby50eXAtPnR5cGUgPT0gVGFycmF5KQorICAgICAgZnByaW50ZihmZCwiXG5cdCB8fCBzb2FwX3B1dF8lcyhzb2FwLCAmc29hcF90bXBfJXMuJXMsIFwiJXNcIiwgXCJcIikiLCBjX2lkZW50KHJlc3BvbnNlLT5pbmZvLnR5cCksIGNfaWRlbnQocmVzcG9uc2UtPmluZm8udHlwKSwgcG91dC0+c3ltLT5uYW1lLCB4dGFnKTsKKyAgICBlbHNlIGlmICgoKFRub2RlICopcG91dC0+aW5mby50eXAtPnJlZiktPnR5cGUgPT0gVGNsYXNzICYmICFpc19zdGRzdHJpbmcocG91dC0+aW5mby50eXAtPnJlZikgJiYgIWlzX3N0ZHdzdHJpbmcocG91dC0+aW5mby50eXAtPnJlZikgJiYgKGlzX2V4dGVybmFsKHBvdXQtPmluZm8udHlwLT5yZWYpIHx8IGlzX3ZvbGF0aWxlKHBvdXQtPmluZm8udHlwLT5yZWYpIHx8IGlzX3R5cGVkZWYocG91dC0+aW5mby50eXAtPnJlZikpICYmICFpc19keW5hbWljX2FycmF5KHBvdXQtPmluZm8udHlwLT5yZWYpKQorICAgICAgZnByaW50ZihmZCwgIlxuXHQgfHwgc29hcF9wdXRfJXMoc29hcCwgJiVzLCBcIiVzXCIsIFwiXCIpIiwgY19pZGVudCgoVG5vZGUqKXBvdXQtPmluZm8udHlwLT5yZWYpLCBwb3V0LT5zeW0tPm5hbWUsIG5zX2NvbnZlcnQocG91dC0+c3ltLT5uYW1lKSk7CisgICAgZWxzZSBpZigoKFRub2RlICopcG91dC0+aW5mby50eXAtPnJlZiktPnR5cGUgPT0gVGNsYXNzICYmICFpc19zdGRzdHJpbmcocG91dC0+aW5mby50eXAtPnJlZikgJiYgIWlzX3N0ZHdzdHJpbmcocG91dC0+aW5mby50eXAtPnJlZikgJiYgIWlzX2R5bmFtaWNfYXJyYXkocG91dC0+aW5mby50eXAtPnJlZikpCisgICAgICBmcHJpbnRmKGZkLCAiXG5cdCB8fCAlcy5zb2FwX3B1dChzb2FwLCBcIiVzXCIsIFwiXCIpIiwgcG91dC0+c3ltLT5uYW1lLCB4dGFnKTsKKyAgICBlbHNlIGlmKCgoVG5vZGUgKilwb3V0LT5pbmZvLnR5cC0+cmVmKS0+dHlwZSA9PSBUc3RydWN0ICYmICFpc19keW5hbWljX2FycmF5KHBvdXQtPmluZm8udHlwLT5yZWYpKQorICAgICAgZnByaW50ZihmZCwgIlxuXHQgfHwgc29hcF9wdXRfJXMoc29hcCwgJiVzLCBcIiVzXCIsIFwiXCIpIiwgY19pZGVudCgoVG5vZGUqKXBvdXQtPmluZm8udHlwLT5yZWYpLCBwb3V0LT5zeW0tPm5hbWUsIHh0YWcpOworICAgIGVsc2UgaWYgKHJlc3BvbnNlKQorICAgICAgZnByaW50ZihmZCwiXG5cdCB8fCBzb2FwX3B1dF8lcyhzb2FwLCAmc29hcF90bXBfJXMsIFwiJXNcIiwgXCJcIikiLCBjX2lkZW50KHJlc3BvbnNlLT5pbmZvLnR5cCksIGNfaWRlbnQocmVzcG9uc2UtPmluZm8udHlwKSwgeG1sX3RhZyhyZXNwb25zZS0+aW5mby50eXApKTsKKyAgICBlbHNlIGlmIChpc19YTUwocG91dC0+aW5mby50eXAtPnJlZikgJiYgaXNfc3RyaW5nKHBvdXQtPmluZm8udHlwLT5yZWYpKQorICAgICAgZnByaW50ZihmZCwiXG5cdCB8fCBzb2FwX291dGxpdGVyYWwoc29hcCwgXCIlc1wiLCAmc29hcF90bXBfJXMpIiwgbnNfY29udmVydChwb3V0LT5zeW0tPm5hbWUpLCBjX2lkZW50KHBvdXQtPmluZm8udHlwLT5yZWYpKTsKKyAgICBlbHNlIGlmIChpc19YTUwocG91dC0+aW5mby50eXAtPnJlZikgJiYgaXNfd3N0cmluZyhwb3V0LT5pbmZvLnR5cC0+cmVmKSkKKyAgICAgIGZwcmludGYoZmQsIlxuXHQgfHwgc29hcF9vdXR3bGl0ZXJhbChzb2FwLCBcIiVzXCIsICZzb2FwX3RtcF8lcykiLCBuc19jb252ZXJ0KHBvdXQtPnN5bS0+bmFtZSksIGNfaWRlbnQocG91dC0+aW5mby50eXAtPnJlZikpOworICAgIGVsc2UKKyAgICAgIGZwcmludGYoZmQsIlxuXHQgfHwgc29hcF9wdXRfJXMoc29hcCwgJnNvYXBfdG1wXyVzLCBcIiVzXCIsIFwiXCIpIiwgY19pZGVudChwb3V0LT5pbmZvLnR5cCksIGNfaWRlbnQocG91dC0+aW5mby50eXAtPnJlZiksIG5zX2NvbnZlcnQocG91dC0+c3ltLT5uYW1lKSk7CisgICAgZnByaW50ZihmZCwiXG5cdCB8fCBzb2FwX2JvZHlfZW5kX291dChzb2FwKSIpOworICAgIGZwcmludGYoZmQsIlxuXHQgfHwgc29hcF9lbnZlbG9wZV9lbmRfb3V0KHNvYXApIik7CisgICAgZnByaW50ZihmZCwiXG5cdCB8fCBzb2FwX2VuZF9zZW5kKHNvYXApKSIpOworICAgIGZwcmludGYoZmQsICJcblx0XHRyZXR1cm4gc29hcC0+ZXJyb3I7Iik7CisgIH0KKyAgZnByaW50ZihmZCwiXG5cdHJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsiKTsKKyAgZnByaW50ZihmZCwiXG59Iik7CisgIGZmbHVzaChmZCk7Cit9CisKK3ZvaWQKK2dlbl9vYmplY3RfY29kZShGSUxFICpmZCwgVGFibGUgKnRhYmxlLCBTeW1ib2wgKm5zLCBjaGFyICpuYW1lLCBjaGFyICpVUkwsIGNoYXIgKmV4ZWN1dGFibGUsIGNoYXIgKlVSSSwgY2hhciAqZW5jb2RpbmcpCit7IEVudHJ5ICptZXRob2QsICpjYXRjaF9tZXRob2Q7CisgIGZwcmludGYoZmQsICJcblxuI2luY2x1ZGUgXCIlcyVzLmhcIiIsIHByZWZpeCwgbmFtZSk7CisgIGlmIChuYW1lc3BhY2VpZCkKKyAgICBmcHJpbnRmKGZkLCJcblxubmFtZXNwYWNlICVzIHsiLCBuYW1lc3BhY2VpZCk7CisgIGZwcmludGYoZmQsICJcblxuJXM6OiVzKClcbntcdCVzX2luaXQoU09BUF9JT19ERUZBVUxULCBTT0FQX0lPX0RFRkFVTFQpO1xufSIsIG5hbWUsIG5hbWUsIG5hbWUpOworICBmcHJpbnRmKGZkLCAiXG5cbiVzOjolcyhzb2FwX21vZGUgaW9tb2RlKVxue1x0JXNfaW5pdChpb21vZGUsIGlvbW9kZSk7XG59IiwgbmFtZSwgbmFtZSwgbmFtZSk7CisgIGZwcmludGYoZmQsICJcblxuJXM6OiVzKHNvYXBfbW9kZSBpbW9kZSwgc29hcF9tb2RlIG9tb2RlKVxue1x0JXNfaW5pdChpbW9kZSwgb21vZGUpO1xufSIsIG5hbWUsIG5hbWUsIG5hbWUpOworICBmcHJpbnRmKGZkLCAiXG5cbnZvaWQgJXM6OiVzX2luaXQoc29hcF9tb2RlIGltb2RlLCBzb2FwX21vZGUgb21vZGUpXG57XHRzdGF0aWMgY29uc3Qgc3RydWN0IE5hbWVzcGFjZSBuYW1lc3BhY2VzW10gPVxuIiwgbmFtZSwgbmFtZSk7CisgIGdlbl9uc21hcChmZCwgbnMsIFVSSSk7CisgIGZwcmludGYoZmQsICJcdHNvYXBfaW5pdDIodGhpcywgaW1vZGUsIG9tb2RlKTsiKTsKKyAgaWYgKG5mbGFnKQorICAgIGZwcmludGYoZmQsICJcblx0dGhpcy0+bmFtZXNwYWNlcyA9IG5hbWVzcGFjZXM7XG59OyIpOworICBlbHNlCisgICAgZnByaW50ZihmZCwgIlxuXHRpZiAoIXRoaXMtPm5hbWVzcGFjZXMpXG5cdFx0dGhpcy0+bmFtZXNwYWNlcyA9IG5hbWVzcGFjZXM7XG59OyIpOworICBmcHJpbnRmKGZkLCAiXG5cbiVzOjp+JXMoKVxue1x0c29hcF9kZXN0cm95KHRoaXMpO1xuXHRzb2FwX2VuZCh0aGlzKTtcblx0c29hcF9kb25lKHRoaXMpO1xufTsiLCBuYW1lLCBuYW1lKTsKKyAgZnByaW50ZihmZCwgIlxuXG5pbnQgJXM6OnNlcnZlKCkiLCBuYW1lKTsKKyAgZnByaW50ZihmZCwgIlxue1x0XG4jaWZuZGVmIFdJVEhfRkFTVENHSVxuXHR1bnNpZ25lZCBpbnQgayA9IHRoaXMtPm1heF9rZWVwX2FsaXZlO1xuI2VuZGlmXG5cdGRvXG5cdHtcdHNvYXBfYmVnaW4odGhpcyk7Iik7CisgIGZwcmludGYoZmQsIlxuI2lmZGVmIFdJVEhfRkFTVENHSVxuXHRcdGlmIChGQ0dJX0FjY2VwdCgpIDwgMClcblx0XHR7XG5cdFx0XHR0aGlzLT5lcnJvciA9IFNPQVBfRU9GO1xuXHRcdFx0cmV0dXJuIHNvYXBfc2VuZF9mYXVsdCh0aGlzKTtcblx0XHR9XG4jZW5kaWYiCispOworICBmcHJpbnRmKGZkLCJcblxuXHRcdHNvYXBfYmVnaW4odGhpcyk7Iik7CisKKyAgZnByaW50ZihmZCwiXG5cbiNpZm5kZWYgV0lUSF9GQVNUQ0dJXG5cdFx0aWYgKCEtLWspXG5cdFx0XHR0aGlzLT5rZWVwX2FsaXZlID0gMDtcbiNlbmRpZiIpOworICBmcHJpbnRmKGZkLCJcblxuXHRcdGlmIChzb2FwX2JlZ2luX3JlY3YodGhpcykpXG5cdFx0e1x0aWYgKHRoaXMtPmVycm9yIDwgU09BUF9TVE9QKVxuXHRcdFx0e1xuI2lmZGVmIFdJVEhfRkFTVENHSVxuXHRcdFx0XHRzb2FwX3NlbmRfZmF1bHQodGhpcyk7XG4jZWxzZSBcblx0XHRcdFx0cmV0dXJuIHNvYXBfc2VuZF9mYXVsdCh0aGlzKTtcbiNlbmRpZlxuXHRcdFx0fVxuXHRcdFx0c29hcF9jbG9zZXNvY2sodGhpcyk7XG5cblx0XHRcdGNvbnRpbnVlO1xuXHRcdH0iKTsKKyAgZnByaW50ZihmZCwiXG5cblx0XHRpZiAoc29hcF9lbnZlbG9wZV9iZWdpbl9pbih0aGlzKVxuXHRcdCB8fCBzb2FwX3JlY3ZfaGVhZGVyKHRoaXMpXG5cdFx0IHx8IHNvYXBfYm9keV9iZWdpbl9pbih0aGlzKVxuXHRcdCB8fCBkaXNwYXRjaCgpIHx8ICh0aGlzLT5mc2VydmVsb29wICYmIHRoaXMtPmZzZXJ2ZWxvb3AodGhpcykpKVxuXHRcdHtcbiNpZmRlZiBXSVRIX0ZBU1RDR0lcblx0XHRcdHNvYXBfc2VuZF9mYXVsdCh0aGlzKTtcbiNlbHNlXG5cdFx0XHRyZXR1cm4gc29hcF9zZW5kX2ZhdWx0KHRoaXMpO1xuI2VuZGlmXG5cdFx0fSIsIG5mbGFnP3ByZWZpeDoic29hcCIpOworICBmcHJpbnRmKGZkLCJcblxuI2lmZGVmIFdJVEhfRkFTVENHSVxuXHR9IHdoaWxlICgxKTtcbiNlbHNlXG5cdH0gd2hpbGUgKHRoaXMtPmtlZXBfYWxpdmUpO1xuI2VuZGlmIik7CisKKyAgZnByaW50ZihmZCwgIlxuXHRyZXR1cm4gU09BUF9PSzsiKTsKKyAgZnByaW50ZihmZCwgIlxufVxuIik7CisgIGZvciAobWV0aG9kID0gdGFibGUtPmxpc3Q7IG1ldGhvZDsgbWV0aG9kID0gbWV0aG9kLT5uZXh0KQorICAgIGlmIChtZXRob2QtPmluZm8udHlwLT50eXBlID09IFRmdW4gJiYgIShtZXRob2QtPmluZm8uc3RvICYgU2V4dGVybikpCisgICAgICBmcHJpbnRmKGZkLCAiXG5zdGF0aWMgaW50IHNlcnZlXyVzKCVzKik7IiwgbWV0aG9kLT5zeW0tPm5hbWUsIG5hbWUpOworICBmcHJpbnRmKGZkLCAiXG5cbmludCAlczo6ZGlzcGF0Y2goKSIsIG5hbWUpOworICBmcHJpbnRmKGZkLCAiXG57XHRpZiAoc29hcF9wZWVrX2VsZW1lbnQodGhpcykpXG5cdFx0cmV0dXJuIHRoaXMtPmVycm9yOyIpOworICBjYXRjaF9tZXRob2QgPSBOVUxMOworICBmb3IgKG1ldGhvZCA9IHRhYmxlLT5saXN0OyBtZXRob2Q7IG1ldGhvZCA9IG1ldGhvZC0+bmV4dCkKKyAgeyBjaGFyICphY3Rpb24gPSBOVUxMOworICAgIGlmIChtZXRob2QtPmluZm8udHlwLT50eXBlID09IFRmdW4gJiYgIShtZXRob2QtPmluZm8uc3RvICYgU2V4dGVybikpCisgICAgeyBpZiAoYWZsYWcpCisgICAgICB7IFNlcnZpY2UgKnNwOworICAgICAgICBmb3IgKHNwID0gc2VydmljZXM7IHNwOyBzcCA9IHNwLT5uZXh0KQorICAgICAgICB7IGlmIChoYXNfbnNfZXEoc3AtPm5zLCBtZXRob2QtPnN5bS0+bmFtZSkpCisJICB7IE1ldGhvZCAqbTsKKwkgICAgZm9yIChtID0gc3AtPmxpc3Q7IG07IG0gPSBtLT5uZXh0KQorCSAgICB7IGlmIChpc19lcV9ub25zKG0tPm5hbWUsIG1ldGhvZC0+c3ltLT5uYW1lKSkKKwkgICAgICB7IGlmIChtLT5tZXNzID09IEFDVElPTikKKwkgICAgICAgICAgYWN0aW9uID0gbS0+cGFydDsKKwkgICAgICB9CisJICAgIH0KKyAgCSAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoaXNfaW52aXNpYmxlKG1ldGhvZC0+c3ltLT5uYW1lKSkKKyAgICAgIHsgRW50cnkgKnBhcmFtID0gZW50cnkoY2xhc3N0YWJsZSwgbWV0aG9kLT5zeW0pOworICAgICAgICBpZiAocGFyYW0pCisgICAgICAgIHsgcGFyYW0gPSAoKFRhYmxlKilwYXJhbS0+aW5mby50eXAtPnJlZiktPmxpc3Q7CisgICAgICAgICAgaWYgKHBhcmFtKQorICAgICAgICAgIHsgZnByaW50ZihmZCwgIlxuXHRpZiAoIXNvYXBfbWF0Y2hfdGFnKHRoaXMsIHRoaXMtPnRhZywgXCIlc1wiKSIsIG5zX2NvbnZlcnQocGFyYW0tPnN5bS0+bmFtZSkpOworCSAgICBpZiAoYWN0aW9uKQorICAgICAgICAgICAgICBpZiAoKmFjdGlvbiA9PSAnIicpCisJICAgICAgICBmcHJpbnRmKGZkLCAiICYmICghc29hcC0+YWN0aW9uIHx8ICFzdHJjbXAoc29hcC0+YWN0aW9uLCAlcykpIiwgYWN0aW9uKTsKKyAgICAgICAgICAgICAgZWxzZQorCSAgICAgICAgZnByaW50ZihmZCwgIiAmJiAoIXNvYXAtPmFjdGlvbiB8fCAhc3RyY21wKHNvYXAtPmFjdGlvbiwgXCIlc1wiKSkiLCBhY3Rpb24pOworICAgICAgICAgICAgZnByaW50ZihmZCwgIilcblx0XHRyZXR1cm4gc2VydmVfJXModGhpcyk7IiwgbWV0aG9kLT5zeW0tPm5hbWUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCWVsc2UKKwkgIGNhdGNoX21ldGhvZCA9IG1ldGhvZDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgZnByaW50ZihmZCwgIlxuXHRpZiAoIXNvYXBfbWF0Y2hfdGFnKHRoaXMsIHRoaXMtPnRhZywgXCIlc1wiKSIsIG5zX2NvbnZlcnQobWV0aG9kLT5zeW0tPm5hbWUpKTsKKwlpZiAoYWN0aW9uKQorICAgICAgICAgIGlmICgqYWN0aW9uID09ICciJykKKwkgICAgZnByaW50ZihmZCwgIiAmJiAoIXNvYXAtPmFjdGlvbiB8fCAhc3RyY21wKHNvYXAtPmFjdGlvbiwgJXMpKSIsIGFjdGlvbik7CisgICAgICAgICAgZWxzZQorCSAgICBmcHJpbnRmKGZkLCAiICYmICghc29hcC0+YWN0aW9uIHx8ICFzdHJjbXAoc29hcC0+YWN0aW9uLCBcIiVzXCIpKSIsIGFjdGlvbik7CisgICAgICAgIGZwcmludGYoZmQsICIpXG5cdFx0cmV0dXJuIHNlcnZlXyVzKHRoaXMpOyIsIG1ldGhvZC0+c3ltLT5uYW1lKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKGNhdGNoX21ldGhvZCkKKyAgICBmcHJpbnRmKGZkLCAiXG5cdHJldHVybiBzZXJ2ZV8lcyh0aGlzKTsiLCBjYXRjaF9tZXRob2QtPnN5bS0+bmFtZSk7CisgIGVsc2UKKyAgICBmcHJpbnRmKGZkLCAiXG5cdHJldHVybiB0aGlzLT5lcnJvciA9IFNPQVBfTk9fTUVUSE9EO1xufSIpOworICBmb3IgKG1ldGhvZCA9IHRhYmxlLT5saXN0OyBtZXRob2Q7IG1ldGhvZCA9IG1ldGhvZC0+bmV4dCkKKyAgICBpZiAobWV0aG9kLT5pbmZvLnR5cC0+dHlwZSA9PSBUZnVuICYmICEobWV0aG9kLT5pbmZvLnN0byAmIFNleHRlcm4pICYmICFpc19pbXBvcnRlZChtZXRob2QtPmluZm8udHlwKSkKKyAgICAgIGdlbl9zZXJ2ZV9tZXRob2QoZmQsIHRhYmxlLCBtZXRob2QsIG5hbWUpOworICBpZiAobmFtZXNwYWNlaWQpCisgICAgZnByaW50ZihmZCwiXG5cbn0gLy8gbmFtZXNwYWNlICVzXG4iLCBuYW1lc3BhY2VpZCk7Cit9CisKK3ZvaWQKK2dlbl9yZXNwb25zZV9iZWdpbihGSUxFICpmZCwgaW50IG4sIGNoYXIgKnMpCit7IGlmICghaXNfaW52aXNpYmxlKHMpKQorICAgIGZwcmludGYoZmQsICIlKnM8JXNSZXNwb25zZT5cbiIsIG4sICIiLCBzKTsKK30KKwordm9pZAorZ2VuX3Jlc3BvbnNlX2VuZChGSUxFICpmZCwgaW50IG4sIGNoYXIgKnMpCit7IGlmICghaXNfaW52aXNpYmxlKHMpKQorICAgIGZwcmludGYoZmQsICIlKnM8LyVzUmVzcG9uc2U+XG4iLCBuLCAiIiwgcyk7Cit9CisKK3ZvaWQKK2dlbl9lbGVtZW50X2JlZ2luKEZJTEUgKmZkLCBpbnQgbiwgY2hhciAqcywgY2hhciAqdCkKK3sgaWYgKCFpc19pbnZpc2libGUocykpCisgIHsgaWYgKHRmbGFnICYmIHQgJiYgKnQpCisgICAgICBmcHJpbnRmKGZkLCAiJSpzPCVzIHhzaTp0eXBlPVwiJXNcIiIsIG4sICIiLCBzLCB0KTsKKyAgICBlbHNlCisgICAgICBmcHJpbnRmKGZkLCAiJSpzPCVzIiwgbiwgIiIsIHMpOworICB9Cit9CisKK3ZvaWQKK2dlbl9lbGVtZW50X2VuZChGSUxFICpmZCwgaW50IG4sIGNoYXIgKnMpCit7IGlmICghaXNfaW52aXNpYmxlKHMpKQorICAgIGZwcmludGYoZmQsICIlKnM8LyVzPlxuIiwgbiwgIiIsIHMpOworICBlbHNlCisgICAgZnByaW50ZihmZCwgIlxuIik7Cit9CisKK3ZvaWQKK2dlbl9kYXRhKGNoYXIgKmJ1ZiwgVGFibGUgKnQsIGNoYXIgKm5zLCBjaGFyICpuYW1lLCBjaGFyICpVUkwsIGNoYXIgKmV4ZWN1dGFibGUsIGNoYXIgKlVSSSwgY2hhciAqZW5jb2RpbmcpCit7IEVudHJ5ICpwLCAqcSwgKnI7CisgIEZJTEUgKmZkOworICBjaGFyICptZXRob2RfZW5jb2RpbmcgPSBOVUxMOworICBjaGFyICptZXRob2RfcmVzcG9uc2VfZW5jb2RpbmcgPSBOVUxMOworICBpZiAodCkKKyAgeyBmb3IgKHAgPSB0LT5saXN0OyBwOyBwID0gcC0+bmV4dCkKKyAgICAgIGlmIChwLT5pbmZvLnR5cC0+dHlwZSA9PSBUZnVuICYmICEocC0+aW5mby5zdG8gJiBTZXh0ZXJuKSAmJiBoYXNfbnNfZXEobnMsIHAtPnN5bS0+bmFtZSkpCisgICAgICB7IFNlcnZpY2UgKnNwOworICAgICAgICBNZXRob2QgKm07CisJY2hhciAqbnNlID0gbnNfcXVhbGlmaWVkRWxlbWVudChwLT5pbmZvLnR5cCk7CisJY2hhciAqbnNhID0gbnNfcXVhbGlmaWVkQXR0cmlidXRlKHAtPmluZm8udHlwKTsKKyAgICAgICAgbWV0aG9kX2VuY29kaW5nID0gZW5jb2Rpbmc7CisJbWV0aG9kX3Jlc3BvbnNlX2VuY29kaW5nID0gTlVMTDsKKwlmb3IgKHNwID0gc2VydmljZXM7IHNwOyBzcCA9IHNwLT5uZXh0KQorCSAgaWYgKCFzdHJjbXAoc3AtPm5zLCBucykpCisJICAgIGZvciAobSA9IHNwLT5saXN0OyBtOyBtID0gbS0+bmV4dCkKKwkgICAgICBpZiAoaXNfZXFfbm9ucyhtLT5uYW1lLCBwLT5zeW0tPm5hbWUpKQorICAgICAgICAgICAgICAgIGlmIChtLT5tZXNzID09IEVOQ09ESU5HKQorCSAgICAgICAgICBtZXRob2RfZW5jb2RpbmcgPSBtLT5wYXJ0OworICAgICAgICAgICAgICAgIGVsc2UgaWYgKG0tPm1lc3MgPT0gUkVTUE9OU0VfRU5DT0RJTkcpCisJICAgICAgICAgIG1ldGhvZF9yZXNwb25zZV9lbmNvZGluZyA9IG0tPnBhcnQ7CisJaWYgKCFtZXRob2RfcmVzcG9uc2VfZW5jb2RpbmcpCisJICBtZXRob2RfcmVzcG9uc2VfZW5jb2RpbmcgPSBtZXRob2RfZW5jb2Rpbmc7CisJLyogcmVxdWVzdCAqLworICAgICAgICBmZCA9IGdlbl9lbnYoYnVmLCBuc19yZW1vdmUocC0+c3ltLT5uYW1lKSwgMCwgdCwgbnMsIG5hbWUsIFVSTCwgZXhlY3V0YWJsZSwgVVJJLCBtZXRob2RfZW5jb2RpbmcpOworCWlmICghZmQpCisJICByZXR1cm47CisgIAlxID0gZW50cnkoY2xhc3N0YWJsZSwgcC0+c3ltKTsKKwlnZW5fZWxlbWVudF9iZWdpbihmZCwgMiwgbnNfY29udmVydChwLT5zeW0tPm5hbWUpLCBOVUxMKTsKKyAgCWlmIChxKQorCXsgaWYgKCFpc19pbnZpc2libGUocC0+c3ltLT5uYW1lKSkKKwkgIHsgZ2VuX2F0dHMoZmQsIHEtPmluZm8udHlwLT5yZWYsIG5zYSk7CisgICAgICAgICAgICBmcHJpbnRmKGZkLCAiXG4iKTsKKwkgIH0KKwkgIGZvciAocSA9ICgoVGFibGUqKXEtPmluZm8udHlwLT5yZWYpLT5saXN0OyBxOyBxID0gcS0+bmV4dCkKKwkgICAgZ2VuX2ZpZWxkKGZkLCAzLCBxLCBuc2UsIG5zYSwgbWV0aG9kX2VuY29kaW5nKTsKKwl9CisgICAgICAgIGdlbl9lbGVtZW50X2VuZChmZCwgMiwgbnNfY29udmVydChwLT5zeW0tPm5hbWUpKTsKKyAgICAgICAgZnByaW50ZihmZCwgIiA8L1NPQVAtRU5WOkJvZHk+XG48L1NPQVAtRU5WOkVudmVsb3BlPlxuIik7CisgICAgICAgIGZjbG9zZShmZCk7CisJLyogcmVzcG9uc2UgKi8KKwlxID0gKEVudHJ5KilwLT5pbmZvLnR5cC0+cmVmOworCWlmIChxICYmICFpc190cmFuc2llbnQocS0+aW5mby50eXApKQorICAgICAgICB7IGZkID0gZ2VuX2VudihidWYsIG5zX3JlbW92ZShwLT5zeW0tPm5hbWUpLCAxLCB0LCBucywgbmFtZSwgVVJMLCBleGVjdXRhYmxlLCBVUkksIG1ldGhvZF9yZXNwb25zZV9lbmNvZGluZyk7CisJICBpZiAoIWZkKQorCSAgICByZXR1cm47CisJICBpZiAocSAmJiAhaXNfcmVzcG9uc2UocS0+aW5mby50eXApKQorCSAgICBpZiAoaXNfWE1MKHEtPmluZm8udHlwLT5yZWYpKQorCSAgICB7IGdlbl9yZXNwb25zZV9iZWdpbihmZCwgMiwgbnNfY29udmVydChwLT5zeW0tPm5hbWUpKTsKKwkgICAgICBnZW5fcmVzcG9uc2VfZW5kKGZkLCAyLCBuc19jb252ZXJ0KHAtPnN5bS0+bmFtZSkpOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeyBnZW5fcmVzcG9uc2VfYmVnaW4oZmQsIDIsIG5zX2NvbnZlcnQocC0+c3ltLT5uYW1lKSk7CisJICAgICAgZ2VuX2ZpZWxkKGZkLCAzLCBxLCBuc2UsIG5zYSwgbWV0aG9kX3Jlc3BvbnNlX2VuY29kaW5nKTsKKwkgICAgICBnZW5fcmVzcG9uc2VfZW5kKGZkLCAyLCBuc19jb252ZXJ0KHAtPnN5bS0+bmFtZSkpOworCSAgICB9CisgICAgICAgICAgZWxzZSBpZiAocSAmJiBxLT5pbmZvLnR5cC0+cmVmICYmICgoVG5vZGUqKXEtPmluZm8udHlwLT5yZWYpLT5yZWYpCisgICAgICAgICAgeyBjaGFyICp4dGFnOworCSAgICBuc2UgPSBuc19xdWFsaWZpZWRFbGVtZW50KHEtPmluZm8udHlwLT5yZWYpOworCSAgICBuc2EgPSBuc19xdWFsaWZpZWRBdHRyaWJ1dGUocS0+aW5mby50eXAtPnJlZik7CisJICAgIGlmIChoYXNfbnNfZXEoTlVMTCwgcS0+c3ltLT5uYW1lKSkKKyAgICAgICAgICAgICAgeHRhZyA9IHEtPnN5bS0+bmFtZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeHRhZyA9ICgoVG5vZGUqKXEtPmluZm8udHlwLT5yZWYpLT5pZC0+bmFtZTsKKwkgICAgZ2VuX2VsZW1lbnRfYmVnaW4oZmQsIDIsIG5zX2FkZCh4dGFnLCBuc2UpLCBOVUxMKTsKKwkgICAgaWYgKCFpc19pbnZpc2libGUoeHRhZykpCisJICAgIHsgZ2VuX2F0dHMoZmQsICgoVG5vZGUqKXEtPmluZm8udHlwLT5yZWYpLT5yZWYsIG5zYSk7CisgICAgICAgICAgICAgIGZwcmludGYoZmQsICJcbiIpOworCSAgICB9CisJICAgIGZvciAociA9ICgoVGFibGUqKSgoVG5vZGUqKXEtPmluZm8udHlwLT5yZWYpLT5yZWYpLT5saXN0OyByOyByID0gci0+bmV4dCkKKwkgICAgICBnZW5fZmllbGQoZmQsIDMsIHIsIG5zZSwgbnNhLCBtZXRob2RfcmVzcG9uc2VfZW5jb2RpbmcpOworCSAgICBnZW5fZWxlbWVudF9lbmQoZmQsIDIsIG5zX2FkZCh4dGFnLCBuc2UpKTsKKwkgIH0KKyAgICAgICAgICBmZmx1c2goZmQpOworICAgICAgICAgIGZwcmludGYoZmQsICIgPC9TT0FQLUVOVjpCb2R5PlxuPC9TT0FQLUVOVjpFbnZlbG9wZT5cbiIpOworICAgICAgICAgIGZjbG9zZShmZCk7CisJfQorICAgICAgfQorICB9Cit9CisKK3ZvaWQKK2dlbl9maWVsZChGSUxFICpmZCwgaW50IG4sIEVudHJ5ICpwLCBjaGFyICpuc2UsIGNoYXIgKm5zYSwgY2hhciAqZW5jb2RpbmcpCit7IEVudHJ5ICpxOworICBjaGFyICpzLCB0bXBbMzJdOworICBpbnQgaSwgZDsKKyAgaWYgKCEocC0+aW5mby5zdG8gJiBTYXR0cmlidXRlKSAmJiAhaXNfdHJhbnNpZW50KHAtPmluZm8udHlwKSAmJiBwLT5pbmZvLnR5cC0+dHlwZSAhPSBUZnVuICYmIHN0cm5jbXAocC0+c3ltLT5uYW1lLCAiX19zaXplIiwgNikgJiYgc3RybmNtcChwLT5zeW0tPm5hbWUsICJfX3R5cGUiLCA2KSAmJiBzdHJuY21wKHAtPnN5bS0+bmFtZSwgIl9fdW5pb24iLCA3KSkKKyAgeyBpZiAoaXNfc29hcDEyKCkgJiYgKHAtPmluZm8uc3RvICYgU3JldHVybikgJiYgIWlzX2xpdGVyYWwoZW5jb2RpbmcpKQorICAgICAgZnByaW50ZihmZCwgIiUqczxTT0FQLVJQQzpyZXN1bHQgeG1sbnM6U09BUC1SUEM9XCIlc1wiPiVzPC9TT0FQLVJQQzpyZXN1bHQ+XG4iLCBuLCAiIiwgcnBjVVJJLCBuc19jb252ZXJ0KHAtPnN5bS0+bmFtZSkpOworICAgIGlmIChpc19YTUwocC0+aW5mby50eXApKQorICAgIHsgZ2VuX2VsZW1lbnRfYmVnaW4oZmQsIG4sIG5zX2FkZChwLT5zeW0tPm5hbWUsIG5zZSksIE5VTEwpOworICAgICAgZnByaW50ZihmZCwgIj4iKTsKKyAgICAgIGdlbl9lbGVtZW50X2VuZChmZCwgbiwgbnNfYWRkKHAtPnN5bS0+bmFtZSwgbnNlKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IGlmICghaXNfc3RyaW5nKHAtPmluZm8udHlwKSAmJiBuID49IDEwICYmIChwLT5pbmZvLnR5cC0+dHlwZSA9PSBUcG9pbnRlciB8fCBwLT5pbmZvLnR5cC0+dHlwZSA9PSBUcmVmZXJlbmNlKSkKKyAgICAgIHsgaWYgKCFpc19pbnZpc2libGUocC0+c3ltLT5uYW1lKSkKKyAgICAgICAgeyBnZW5fZWxlbWVudF9iZWdpbihmZCwgbiwgbnNfYWRkKHAtPnN5bS0+bmFtZSwgbnNlKSwgTlVMTCk7CisgICAgICAgICAgZnByaW50ZihmZCwgIiB4c2k6bmlsPVwidHJ1ZVwiPiIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmIChwLT5pbmZvLnR5cC0+dHlwZSA9PSBUYXJyYXkpCisgICAgICB7IGkgPSAoKFRub2RlKikgcC0+aW5mby50eXAtPnJlZiktPndpZHRoOworICAgICAgICBpZiAoaSkKKyAgICAgICAgeyBpID0gcC0+aW5mby50eXAtPndpZHRoIC8gaTsKKyAgICAgICAgICBpZiAoaSA+IDEwMCkKKyAgICAgICAgICAgIGkgPSAxMDA7CisJfQorCWdlbl9lbGVtZW50X2JlZ2luKGZkLCBuLCBuc19hZGQocC0+c3ltLT5uYW1lLCBuc2UpLCAiU09BUC1FTkM6QXJyYXkiKTsKKwlmcHJpbnRmKGZkLCAiIFNPQVAtRU5DOmFycmF5VHlwZT1cIiVzWyVkXVwiPiIsIHhzaV90eXBlX1RhcnJheShwLT5pbmZvLnR5cCksIGkpOworICAgICAgICBmZmx1c2goZmQpOworCWdlbl92YWwoZmQsIG4sIHAtPmluZm8udHlwLCBuc2UsIG5zYSwgZW5jb2RpbmcpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoaXNfZHluYW1pY19hcnJheShwLT5pbmZvLnR5cCkgJiYgIWlzX2JpbmFyeShwLT5pbmZvLnR5cCkpCisgICAgICB7IGlmIChoYXNfbnMocC0+aW5mby50eXApIHx8IGlzX3VudHlwZWQocC0+aW5mby50eXApKQorICAgICAgICB7IGdlbl9lbGVtZW50X2JlZ2luKGZkLCBuLCBuc19hZGQocC0+c3ltLT5uYW1lLCBuc2UpLCB4c2lfdHlwZShwLT5pbmZvLnR5cCkpOworICAgICAgICAgIGZwcmludGYoZmQsICI+Iik7CisJfQorICAgICAgICBlbHNlCisJeyBkID0gZ2V0X0RhcnJheWRpbXMocC0+aW5mby50eXApOworCSAgaWYgKGQpCisJICB7IGZvciAoaSA9IDA7IGkgPCBkLTE7IGkrKykKKwkgICAgeyB0bXBbMippXSA9ICcsJzsKKwkgICAgICB0bXBbMippKzFdID0gJzEnOworCSAgICB9CisJICAgIHRtcFsyKmQtMl0gPSAnXDAnOworCSAgfQorCSAgZWxzZQorCSAgICAqdG1wID0gJ1wwJzsKKwkgIGdlbl9lbGVtZW50X2JlZ2luKGZkLCBuLCBuc19hZGQocC0+c3ltLT5uYW1lLCBuc2UpLCAiU09BUC1FTkM6QXJyYXkiKTsKKwkgIGlmICgoKFRhYmxlKilwLT5pbmZvLnR5cC0+cmVmKS0+bGlzdC0+aW5mby5taW5PY2N1cnMgPiAxKQorCSAgICBmcHJpbnRmKGZkLCAiIFNPQVAtRU5DOmFycmF5VHlwZT1cIiVzWyVsZCVzXVwiPiIsIHdzZGxfdHlwZSgoKFRhYmxlKilwLT5pbmZvLnR5cC0+cmVmKS0+bGlzdC0+aW5mby50eXAsICIiKSwgKChUYWJsZSopcC0+aW5mby50eXAtPnJlZiktPmxpc3QtPmluZm8ubWluT2NjdXJzLCB0bXApOworCSAgZWxzZQorCSAgICBmcHJpbnRmKGZkLCAiIFNPQVAtRU5DOmFycmF5VHlwZT1cIiVzWzElc11cIj4iLCB3c2RsX3R5cGUoKChUYWJsZSopcC0+aW5mby50eXAtPnJlZiktPmxpc3QtPmluZm8udHlwLCAiIiksIHRtcCk7CisJfQorICAgICAgICBmZmx1c2goZmQpOworICAgICAgICBnZW5fdmFsKGZkLCBuLCBwLT5pbmZvLnR5cCwgbnNlLCBuc2EsIGVuY29kaW5nKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKChwLT5pbmZvLnR5cC0+dHlwZSA9PSBUcG9pbnRlciB8fCBwLT5pbmZvLnR5cC0+dHlwZSA9PSBUcmVmZXJlbmNlKSAmJiBpc19keW5hbWljX2FycmF5KHAtPmluZm8udHlwLT5yZWYpICYmICFpc19iaW5hcnkocC0+aW5mby50eXAtPnJlZikpCisgICAgICB7IGlmIChoYXNfbnMocC0+aW5mby50eXAtPnJlZikgfHwgaXNfdW50eXBlZChwLT5pbmZvLnR5cC0+cmVmKSkKKyAgICAgICAgeyBnZW5fZWxlbWVudF9iZWdpbihmZCwgbiwgbnNfYWRkKHAtPnN5bS0+bmFtZSwgbnNlKSwgeHNpX3R5cGUocC0+aW5mby50eXAtPnJlZikpOworCSAgZnByaW50ZihmZCwgIj4iKTsKKwl9CisgICAgICAgIGVsc2UKKwl7IGQgPSBnZXRfRGFycmF5ZGltcyhwLT5pbmZvLnR5cC0+cmVmKTsKKwkgIGlmIChkKQorCSAgeyBmb3IgKGkgPSAwOyBpIDwgZC0xOyBpKyspCisJICAgIHsgdG1wWzIqaV0gPSAnLCc7CisJICAgICAgdG1wWzIqaSsxXSA9ICcxJzsKKwkgICAgfQorCSAgICB0bXBbMipkLTJdID0gJ1wwJzsKKwkgIH0KKwkgIGVsc2UKKwkgICAgKnRtcCA9ICdcMCc7CisJICBnZW5fZWxlbWVudF9iZWdpbihmZCwgbiwgbnNfYWRkKHAtPnN5bS0+bmFtZSwgbnNlKSwgIlNPQVAtRU5DOkFycmF5Iik7CisJICBpZiAoKCgoVG5vZGUqKXAtPmluZm8udHlwLT5yZWYpLT50eXBlID09IFRzdHJ1Y3QgfHwgKChUbm9kZSopcC0+aW5mby50eXAtPnJlZiktPnR5cGUgPT0gVGNsYXNzKSAmJiAoKFRhYmxlKikoKFRub2RlKilwLT5pbmZvLnR5cC0+cmVmKS0+cmVmKS0+bGlzdC0+aW5mby5taW5PY2N1cnMgPiAxKQorCSAgICBmcHJpbnRmKGZkLCAiIFNPQVAtRU5DOmFycmF5VHlwZT1cIiVzWyVsZCVzXVwiPiIsIHdzZGxfdHlwZSgoKFRhYmxlKikoKFRub2RlKilwLT5pbmZvLnR5cC0+cmVmKS0+cmVmKS0+bGlzdC0+aW5mby50eXAsICIiKSwgKChUYWJsZSopKChUbm9kZSopcC0+aW5mby50eXAtPnJlZiktPnJlZiktPmxpc3QtPmluZm8ubWluT2NjdXJzLCB0bXApOworCSAgZWxzZQorCSAgICBmcHJpbnRmKGZkLCAiIFNPQVAtRU5DOmFycmF5VHlwZT1cIiVzWzElc11cIj4iLCB3c2RsX3R5cGUoKChUYWJsZSopKChUbm9kZSopcC0+aW5mby50eXAtPnJlZiktPnJlZiktPmxpc3QtPmluZm8udHlwLCAiIiksIHRtcCk7CisJfQorICAgICAgICBmZmx1c2goZmQpOworICAgICAgICBnZW5fdmFsKGZkLCBuLCBwLT5pbmZvLnR5cC0+cmVmLCBuc2UsIG5zYSwgZW5jb2RpbmcpOworICAgICAgfQorICAgICAgZWxzZSBpZiAocC0+aW5mby50eXAtPnR5cGUgPT0gVHN0cnVjdCB8fCBwLT5pbmZvLnR5cC0+dHlwZSA9PSBUY2xhc3MpCisgICAgICB7IC8qCisgICAgICAgIGlmICghaXNfcHJpbWNsYXNzKHAtPmluZm8udHlwKSkKKyAgICAgICAgeyBjaGFyICpuc2UxID0gbnNfcXVhbGlmaWVkRWxlbWVudChwLT5pbmZvLnR5cCk7CisgIAkgIGNoYXIgKm5zYTEgPSBuc19xdWFsaWZpZWRBdHRyaWJ1dGUocC0+aW5mby50eXApOworCSAgaWYgKG5zZTEpCisJICAgIG5zZSA9IG5zZTE7CisJICBpZiAobnNhMSkKKwkgICAgbnNhID0gbnNhMTsKKwl9CisJKi8KKyAgICAgICAgaWYgKCFpc19pbnZpc2libGUocC0+c3ltLT5uYW1lKSkKKyAgICAgICAgeyBnZW5fZWxlbWVudF9iZWdpbihmZCwgbiwgbnNfYWRkKHAtPnN5bS0+bmFtZSwgbnNlKSwgeHNpX3R5cGVfdShwLT5pbmZvLnR5cCkpOworICAgICAgICAgIGdlbl9hdHRzKGZkLCBwLT5pbmZvLnR5cC0+cmVmLCBuc2EpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmICgocC0+aW5mby50eXAtPnR5cGUgPT0gVHBvaW50ZXIgfHwgcC0+aW5mby50eXAtPnR5cGUgPT0gVHJlZmVyZW5jZSkKKyAgICAgICAgICAgICAmJiAoKChUbm9kZSopcC0+aW5mby50eXAtPnJlZiktPnR5cGUgPT0gVHN0cnVjdCB8fCAoKFRub2RlKilwLT5pbmZvLnR5cC0+cmVmKS0+dHlwZSA9PSBUY2xhc3MpKQorICAgICAgeyAvKgorICAgICAgICBpZiAoIWlzX3ByaW1jbGFzcyhwLT5pbmZvLnR5cC0+cmVmKSkKKyAgICAgICAgeyBjaGFyICpuc2UxID0gbnNfcXVhbGlmaWVkRWxlbWVudChwLT5pbmZvLnR5cC0+cmVmKTsKKwkgIGNoYXIgKm5zYTEgPSBuc19xdWFsaWZpZWRBdHRyaWJ1dGUocC0+aW5mby50eXAtPnJlZik7CisJICBpZiAobnNlMSkKKwkgICAgbnNlID0gbnNlMTsKKwkgIGlmIChuc2ExKQorCSAgICBuc2EgPSBuc2ExOworCX0KKwkqLworICAgICAgICBpZiAoIWlzX2ludmlzaWJsZShwLT5zeW0tPm5hbWUpKQorICAgICAgICB7IGdlbl9lbGVtZW50X2JlZ2luKGZkLCBuLCBuc19hZGQocC0+c3ltLT5uYW1lLCBuc2UpLCB4c2lfdHlwZV91KHAtPmluZm8udHlwKSk7CisgICAgICAgICAgZ2VuX2F0dHMoZmQsICgoVG5vZGUqKXAtPmluZm8udHlwLT5yZWYpLT5yZWYsIG5zYSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHAtPmluZm8udHlwLT50eXBlICE9IFR1bmlvbikKKyAgICAgIHsgaWYgKCFpc19pbnZpc2libGUocC0+c3ltLT5uYW1lKSkKKyAgICAgICAgeyBnZW5fZWxlbWVudF9iZWdpbihmZCwgbiwgbnNfYWRkKHAtPnN5bS0+bmFtZSwgbnNlKSwgeHNpX3R5cGVfdShwLT5pbmZvLnR5cCkpOworCSAgZnByaW50ZihmZCwgIj4iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc3dpdGNoIChwLT5pbmZvLnR5cC0+dHlwZSkKKyAgICAgIHsgY2FzZSBUY2hhcjoKKyAgICAgICAgY2FzZSBUc2hvcnQ6CisgICAgICAgIGNhc2UgVGludDoKKyAgICAgICAgY2FzZSBUbG9uZzoKKyAgICAgICAgY2FzZSBUbGxvbmc6CisgICAgICAgIGNhc2UgVHVjaGFyOgorICAgICAgICBjYXNlIFR1c2hvcnQ6CisgICAgICAgIGNhc2UgVHVpbnQ6CisgICAgICAgIGNhc2UgVHVsb25nOgorICAgICAgICBjYXNlIFR1bGxvbmc6CisgICAgICAgICAgaWYgKHAtPmluZm8uaGFzdmFsKQorCSAgICBmcHJpbnRmKGZkLCBTT0FQX0xPTkdfRk9STUFULCBwLT5pbmZvLnZhbC5pKTsKKwkgIGVsc2UKKwkgICAgZnByaW50ZihmZCwgIjAiKTsKKwkgIGJyZWFrOworICAgICAgICBjYXNlIFRmbG9hdDoKKyAgICAgICAgY2FzZSBUZG91YmxlOgorICAgICAgICAgIGlmIChwLT5pbmZvLmhhc3ZhbCkKKwkgICAgZnByaW50ZihmZCwgIiVmIiwgcC0+aW5mby52YWwucik7CisJICBlbHNlCisJICAgIGZwcmludGYoZmQsICIwLjAiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUZW51bToKKwkgIGlmIChwLT5pbmZvLmhhc3ZhbCAmJiBwLT5pbmZvLnR5cC0+cmVmKQorCSAgeyBmb3IgKHEgPSAoKFRhYmxlKilwLT5pbmZvLnR5cC0+cmVmKS0+bGlzdDsgcTsgcSA9IHEtPm5leHQpCisJICAgICAgaWYgKHAtPmluZm8udmFsLmkgPT0gcS0+aW5mby52YWwuaSkKKwkgICAgICB7IGZwcmludGYoZmQsICIlcyIsIG5zX3JlbW92ZTIocS0+c3ltLT5uYW1lKSk7CisJCWJyZWFrOworCSAgICAgIH0KKwkgIH0KKwkgIGVsc2UKKwkgICAgZ2VuX3ZhbChmZCwgbisxLCBwLT5pbmZvLnR5cCwgbnNlLCBuc2EsIGVuY29kaW5nKTsKKwkgIGJyZWFrOworICAgICAgICBjYXNlIFRwb2ludGVyOgorICAgICAgICBjYXNlIFRyZWZlcmVuY2U6CisJICBpZiAoaXNfc3RyaW5nKHAtPmluZm8udHlwKSB8fCBpc193c3RyaW5nKHAtPmluZm8udHlwKSkKKwkgIHsgaWYgKHAtPmluZm8uaGFzdmFsKQorCSAgICAgIGZwcmludGYoZmQsICIlcyIsIHAtPmluZm8udmFsLnMpOworCSAgICBlbHNlCisJICAgICAgZ2VuX3ZhbChmZCwgbiwgcC0+aW5mby50eXAsIG5zZSwgbnNhLCBlbmNvZGluZyk7CisJICB9CisJICBlbHNlIGlmICghaXNfZHluYW1pY19hcnJheShwLT5pbmZvLnR5cC0+cmVmKSAmJiBuIDwgMTApCisJICAgIGdlbl92YWwoZmQsIG4sIHAtPmluZm8udHlwLT5yZWYsIG5zZSwgbnNhLCBlbmNvZGluZyk7CisJICBicmVhazsKKyAgICAgICAgY2FzZSBUY2xhc3M6CisJICBpZiAoaXNfc3Rkc3RyKHAtPmluZm8udHlwKSkKKwkgIHsgaWYgKHAtPmluZm8uaGFzdmFsKQorCSAgICAgIGZwcmludGYoZmQsICIlcyIsIHAtPmluZm8udmFsLnMpOworCSAgICBlbHNlCisJICAgICAgZ2VuX3ZhbChmZCwgbiwgcC0+aW5mby50eXAsIG5zZSwgbnNhLCBlbmNvZGluZyk7CisJICAgIGJyZWFrOworCSAgfQorICAgICAgICBjYXNlIFRzdHJ1Y3Q6CisJICBpZiAoIWlzX2R5bmFtaWNfYXJyYXkocC0+aW5mby50eXApKQorCSAgICBnZW5fdmFsKGZkLCBuLCBwLT5pbmZvLnR5cCwgbnNlLCBuc2EsIGVuY29kaW5nKTsKKwkgIGJyZWFrOworICAgICAgICBjYXNlIFR1bmlvbjoKKwkgIGdlbl92YWwoZmQsIG4sIHAtPmluZm8udHlwLCBuc2UsIG5zYSwgZW5jb2RpbmcpOworCSAgYnJlYWs7CisJY2FzZSBUdGVtcGxhdGU6CisJICBnZW5fdmFsKGZkLCBuLCBwLT5pbmZvLnR5cCwgbnNlLCBuc2EsIGVuY29kaW5nKTsKKwkgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChwLT5pbmZvLnR5cC0+dHlwZSAhPSBUdW5pb24pCisJICBnZW5fZWxlbWVudF9lbmQoZmQsIDAsIG5zX2FkZChwLT5zeW0tPm5hbWUsIG5zZSkpOworICAgICAgICBmZmx1c2goZmQpOworICAgIH0KKyAgfQorfQorCit2b2lkCitnZW5fYXR0cyhGSUxFICpmZCwgVGFibGUgKnAsIGNoYXIgKm5zYSkKK3sgRW50cnkgKnEsICpyOworICBpbnQgaTsKKyAgaWYgKHApCisgIGZvciAocSA9IHAtPmxpc3Q7IHE7IHEgPSBxLT5uZXh0KQorICAgIGlmIChxLT5pbmZvLnN0byAmIFNhdHRyaWJ1dGUgJiYgIWlzX2ludmlzaWJsZShxLT5zeW0tPm5hbWUpKQorICAgIHsgZnByaW50ZihmZCwgIiAlcz1cIiIsIG5zX2FkZChxLT5zeW0tPm5hbWUsIG5zYSkpOworICAgICAgc3dpdGNoIChxLT5pbmZvLnR5cC0+dHlwZSkKKyAgICAgIHsgY2FzZSBUY2hhcjoKKyAgICAgICAgY2FzZSBUc2hvcnQ6CisgICAgICAgIGNhc2UgVGludDoKKyAgICAgICAgY2FzZSBUbG9uZzoKKyAgICAgICAgY2FzZSBUbGxvbmc6CisgICAgICAgIGNhc2UgVHVjaGFyOgorICAgICAgICBjYXNlIFR1c2hvcnQ6CisgICAgICAgIGNhc2UgVHVpbnQ6CisgICAgICAgIGNhc2UgVHVsb25nOgorICAgICAgICBjYXNlIFR1bGxvbmc6CisgICAgICAgICAgaWYgKHEtPmluZm8uaGFzdmFsKQorCSAgICBmcHJpbnRmKGZkLCBTT0FQX0xPTkdfRk9STUFULCBxLT5pbmZvLnZhbC5pKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBmcHJpbnRmKGZkLCAiMCIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRmbG9hdDoKKyAgICAgICAgY2FzZSBUZG91YmxlOgorICAgICAgICAgIGlmIChxLT5pbmZvLmhhc3ZhbCkKKwkgICAgZnByaW50ZihmZCwgIiVmIiwgcS0+aW5mby52YWwucik7CisJICBlbHNlCisJICAgIGZwcmludGYoZmQsICIwLjAiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUdGltZToKKwkgIGJyZWFrOyAvKiBzaG91bGQgcHJpbnQgdmFsdWU/ICovCisgICAgICAgIGNhc2UgVGVudW06CisJICBpZiAocS0+aW5mby5oYXN2YWwgJiYgcS0+aW5mby50eXAtPnJlZikKKwkgIHsgZm9yIChyID0gKChUYWJsZSopcS0+aW5mby50eXAtPnJlZiktPmxpc3Q7IHI7IHIgPSByLT5uZXh0KQorCSAgICAgIGlmIChyLT5pbmZvLnZhbC5pID09IHEtPmluZm8udmFsLmkpCisJICAgICAgeyBmcHJpbnRmKGZkLCAiJXMiLCBuc19yZW1vdmUyKHItPnN5bS0+bmFtZSkpOworCQlicmVhazsKKwkgICAgICB9CisJICB9CisJICBicmVhazsKKyAgICAgICAgY2FzZSBUcG9pbnRlcjoKKyAgICAgICAgY2FzZSBUcmVmZXJlbmNlOgorCSAgaWYgKGlzX3N0cmluZyhxLT5pbmZvLnR5cCkpCisJICB7IGlmIChxLT5pbmZvLmhhc3ZhbCkKKwkgICAgICBmcHJpbnRmKGZkLCAiJXMiLCBxLT5pbmZvLnZhbC5zKTsKKwkgICAgZWxzZSBpZiAocS0+aW5mby50eXAtPm1pbkxlbmd0aCA+IDAgJiYgcS0+aW5mby50eXAtPm1pbkxlbmd0aCA8IDEwMDAwKQorCSAgICAgIGZvciAoaSA9IDA7IGkgPCBxLT5pbmZvLnR5cC0+bWluTGVuZ3RoOyBpKyspCisJICAgICAgICBmcHJpbnRmKGZkLCAiWCIpOworCSAgfQorCSAgYnJlYWs7CisgICAgICAgIGNhc2UgVGNsYXNzOgorCSAgaWYgKGlzX3N0ZHN0cihxLT5pbmZvLnR5cCkpCisJICB7IGlmIChxLT5pbmZvLmhhc3ZhbCkKKwkgICAgICBmcHJpbnRmKGZkLCAiJXMiLCBxLT5pbmZvLnZhbC5zKTsKKwkgICAgZWxzZSBpZiAocS0+aW5mby50eXAtPm1pbkxlbmd0aCA+IDAgJiYgcS0+aW5mby50eXAtPm1pbkxlbmd0aCA8IDEwMDAwKQorCSAgICAgIGZvciAoaSA9IDA7IGkgPCBxLT5pbmZvLnR5cC0+bWluTGVuZ3RoOyBpKyspCisJICAgICAgICBmcHJpbnRmKGZkLCAiWCIpOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZwcmludGYoZmQsICJcIiIpOworICAgIH0KKyAgZnByaW50ZihmZCwgIj4iKTsKKyAgZmZsdXNoKGZkKTsKK30KKwordm9pZAorZ2VuX3ZhbChGSUxFICpmZCwgaW50IG4sIFRub2RlICpwLCBjaGFyICpuc2UsIGNoYXIgKm5zYSwgY2hhciAqZW5jb2RpbmcpCit7IEVudHJ5ICpxOworICBpbnQgaTsKKyAgaWYgKCFpc190cmFuc2llbnQocCkgJiYgcC0+dHlwZSAhPSBUZnVuICYmICFpc19YTUwocCkpIAorICB7IGlmIChwLT50eXBlID09IFRhcnJheSkKKyAgICB7IGkgPSAoKFRub2RlKikgcC0+cmVmKS0+d2lkdGg7CisgICAgICBpZiAoaSkKKyAgICAgIHsgaSA9IHAtPndpZHRoIC8gaTsKKyAgICAgICAgaWYgKGkgPiAxMDApCisgICAgICAgICAgaSA9IDEwMDsKKyAgICAgICAgZnByaW50ZihmZCwgIlxuIik7CisgICAgICAgIGZvciAoOyBpID4gMDsgaS0tKQorICAgICAgICB7IGZwcmludGYoZmQsICIlKnM8aXRlbT4iLCBuKzEsICIiKTsKKyAgICAgICAgICBnZW5fdmFsKGZkLCBuKzEsIHAtPnJlZiwgbnNlLCBuc2EsIGVuY29kaW5nKTsKKyAgICAgICAgICBmcHJpbnRmKGZkLCAiPC9pdGVtPlxuIik7CisgICAgICAgIH0KKyAgICAgICAgZnByaW50ZihmZCwgIiUqcyIsIG4sICIiKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoaXNfZHluYW1pY19hcnJheShwKSkKKyAgICB7IGlmICghaXNfYmluYXJ5KHApKQorICAgICAgeyBmcHJpbnRmKGZkLCAiXG4iKTsKKyAgICAgICAgZ2VuX2ZpZWxkKGZkLCBuKzEsICgoVGFibGUqKXAtPnJlZiktPmxpc3QsIG5zZSwgbnNhLCBlbmNvZGluZyk7CisgICAgICAgIGZwcmludGYoZmQsICIlKnMiLCBuLCAiIik7CisgICAgICB9CisgICAgfQorICAgIHN3aXRjaCAocC0+dHlwZSkKKyAgICB7IGNhc2UgVGNoYXI6CisgICAgICBjYXNlIFRzaG9ydDoKKyAgICAgIGNhc2UgVGludDoKKyAgICAgIGNhc2UgVGxvbmc6CisgICAgICBjYXNlIFRsbG9uZzoKKyAgICAgIGNhc2UgVHVjaGFyOgorICAgICAgY2FzZSBUdXNob3J0OgorICAgICAgY2FzZSBUdWludDoKKyAgICAgIGNhc2UgVHVsb25nOgorICAgICAgY2FzZSBUdWxsb25nOgorCWZwcmludGYoZmQsICIwIik7CisJYnJlYWs7CisgICAgICBjYXNlIFRmbG9hdDoKKyAgICAgIGNhc2UgVGRvdWJsZToKKwlmcHJpbnRmKGZkLCAiMC4wIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBUZW51bToKKyAgICAgICAgaWYgKHAtPnJlZiAmJiAocSA9ICgoVGFibGUqKXAtPnJlZiktPmxpc3QpKQorICAgICAgICAgIGZwcmludGYoZmQsICIlcyIsIG5zX3JlbW92ZShxLT5zeW0tPm5hbWUpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGZwcmludGYoZmQsICIwIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBUdGltZToKKyAgICAgICAgeyBjaGFyIHRtcFsyNTZdOworICAgICAgICAgIHRpbWVfdCB0ID0gdGltZShOVUxMKSwgKnAgPSAmdDsKKyAgICAgICAgICBzdHJmdGltZSh0bXAsIDI1NiwgIiVZLSVtLSVkVCVIOiVNOiVTWiIsIGdtdGltZShwKSk7CisJICBmcHJpbnRmKGZkLCAiJXMiLCB0bXApOworCX0KKwlicmVhazsKKyAgICAgIGNhc2UgVHBvaW50ZXI6CisgICAgICBjYXNlIFRyZWZlcmVuY2U6CisJaWYgKGlzX3N0cmluZyhwKSB8fCBpc193c3RyaW5nKHApKQorCXsgaWYgKHAtPm1pbkxlbmd0aCA+IDAgJiYgcC0+bWluTGVuZ3RoIDwgMTAwMDApCisJICAgIGZvciAoaSA9IDA7IGkgPCBwLT5taW5MZW5ndGg7IGkrKykKKwkgICAgICBmcHJpbnRmKGZkLCAiWCIpOworCX0KKyAgICAgICAgZWxzZSBpZiAobiA8IDEwKQorCSAgZ2VuX3ZhbChmZCwgbiwgcC0+cmVmLCBuc2UsIG5zYSwgZW5jb2RpbmcpOworCWJyZWFrOworICAgICAgY2FzZSBUY2xhc3M6CisgICAgICBjYXNlIFRzdHJ1Y3Q6CisJaWYgKCFpc19keW5hbWljX2FycmF5KHApICYmICFpc19wcmltY2xhc3MocCkgJiYgcC0+cmVmKQorICAgICAgICB7IG5zZSA9IG5zX3F1YWxpZmllZEVsZW1lbnQocCk7CisgIAkgIG5zYSA9IG5zX3F1YWxpZmllZEF0dHJpYnV0ZShwKTsKKwkgIGZwcmludGYoZmQsICJcbiIpOworCSAgZm9yIChxID0gKChUYWJsZSopcC0+cmVmKS0+bGlzdDsgcTsgcSA9IHEtPm5leHQpCisJICAgIGdlbl9maWVsZChmZCwgbisxLCBxLCBuc2UsIG5zYSwgZW5jb2RpbmcpOworCSAgZnByaW50ZihmZCwgIiUqcyIsIG4sICIiKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVHVuaW9uOgorICAgICAgICBpZiAoKChUYWJsZSopcC0+cmVmKS0+bGlzdCkKKyAgICAgICAgICBnZW5fZmllbGQoZmQsIG4sICgoVGFibGUqKXAtPnJlZiktPmxpc3QsIG5zZSwgbnNhLCBlbmNvZGluZyk7CisJYnJlYWs7CisgICAgICBjYXNlIFR0ZW1wbGF0ZToKKwlpZiAobiA8IDEwKQorICAgICAgICAgIGdlbl92YWwoZmQsIG4sIHAtPnJlZiwgbnNlLCBuc2EsIGVuY29kaW5nKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKK3ZvaWQKK2dlbl9oZWFkZXIoRklMRSAqZmQsIGNoYXIgKm1ldGhvZCwgaW50IHJlc3BvbnNlLCBjaGFyICplbmNvZGluZykKK3sgaWYgKGN1c3RvbV9oZWFkZXIpCisgIHsgU2VydmljZSAqc3A7CisgICAgTWV0aG9kICptID0gTlVMTDsKKyAgICBFbnRyeSAqcTsKKyAgICBUYWJsZSAqcjsKKyAgICBmcHJpbnRmKGZkLCAiIDxTT0FQLUVOVjpIZWFkZXI+XG4iKTsKKyAgICByID0gZW50cnkoY2xhc3N0YWJsZSwgbG9va3VwKCJTT0FQX0VOVl9fSGVhZGVyIikpLT5pbmZvLnR5cC0+cmVmOworICAgIGlmIChyKQorICAgIGZvciAocSA9IHItPmxpc3Q7IHE7IHEgPSBxLT5uZXh0KQorICAgICAgaWYgKCFpc190cmFuc2llbnQocS0+aW5mby50eXApICYmICEocS0+aW5mby5zdG8gJiBTYXR0cmlidXRlKSAmJiBxLT5pbmZvLnR5cC0+dHlwZSAhPSBUZnVuKQorICAgICAgeyBmb3IgKHNwID0gc2VydmljZXM7IHNwOyBzcCA9IHNwLT5uZXh0KQorICAgICAgICAgIGZvciAobSA9IHNwLT5saXN0OyBtOyBtID0gbS0+bmV4dCkKKwkgICAgaWYgKGlzX2VxKG0tPm5hbWUsIG1ldGhvZCkgJiYgKCFzdHJjbXAobS0+cGFydCwgcS0+c3ltLT5uYW1lKSB8fCBpc19lcV9ub25zKG0tPnBhcnQsIHEtPnN5bS0+bmFtZSkpICYmICghcmVzcG9uc2UgJiYgKG0tPm1lc3MmSERSSU4pIHx8IHJlc3BvbnNlICYmIChtLT5tZXNzJkhEUk9VVCkpKQorCSAgICB7IGdlbl9maWVsZChmZCwgMiwgcSwgTlVMTCwgTlVMTCwgZW5jb2RpbmcpOworCSAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgfQorICAgIGZwcmludGYoZmQsICIgPC9TT0FQLUVOVjpIZWFkZXI+XG4iKTsKKyAgfQorfQorCitGSUxFICoKK2dlbl9lbnYoY2hhciAqYnVmLCBjaGFyICptZXRob2QsIGludCByZXNwb25zZSwgVGFibGUgKnQsIGNoYXIgKm5zLCBjaGFyICpuYW1lLCBjaGFyICpVUkwsIGNoYXIgKmV4ZWN1dGFibGUsIGNoYXIgKlVSSSwgY2hhciAqZW5jb2RpbmcpCit7IFN5bWJvbCAqczsKKyAgU2VydmljZSAqc3AgPSBOVUxMOworICBjaGFyIHRtcFsxMDI0XTsKKyAgRklMRSAqZmQ7CisgIHN0cmNweSh0bXAsIGJ1Zik7CisgIHN0cmNweShzdHJyY2hyKHRtcCwgJy4nKSsxLCBtZXRob2QpOworICBpZiAoIXJlc3BvbnNlKQorICB7IHN0cmNhdCh0bXAsICIucmVxLnhtbCIpOworICAgIGZwcmludGYoZm1zZywgIlNhdmluZyAlcyBzYW1wbGUgU09BUC9YTUwgcmVxdWVzdFxuIiwgdG1wKTsKKyAgfQorICBlbHNlCisgIHsgc3RyY2F0KHRtcCwgIi5yZXMueG1sIik7CisgICAgZnByaW50ZihmbXNnLCAiU2F2aW5nICVzIHNhbXBsZSBTT0FQL1hNTCByZXNwb25zZVxuIiwgdG1wKTsKKyAgfQorICBmZCA9IGZvcGVuKHRtcCwgInciKTsKKyAgaWYgKCFmZCkKKyAgICBleGVjZXJyb3IoIkNhbm5vdCB3cml0ZSBYTUwgZmlsZSIpOworICBmcHJpbnRmKGZkLCAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iKTsKKyAgZnByaW50ZihmZCwgIjxTT0FQLUVOVjpFbnZlbG9wZSIpOworICBmb3IgKHMgPSBuc2xpc3Q7IHM7IHMgPSBzLT5uZXh0KQorICB7IGZvciAoc3AgPSBzZXJ2aWNlczsgc3A7IHNwID0gc3AtPm5leHQpCisgICAgICBpZiAoIXN0cmNtcChzcC0+bnMsIHMtPm5hbWUpICYmIHNwLT5VUkkpCisgICAgICAgIGJyZWFrOworICAgIGlmIChzcCkKKyAgICAgIGZwcmludGYoZmQsICJcbiB4bWxuczolcz1cIiVzXCIiLCBuc19jb252ZXJ0KHMtPm5hbWUpLCBzcC0+VVJJKTsKKyAgICBlbHNlIGlmICghc3RyY21wKHMtPm5hbWUsICJTT0FQLUVOViIpKQorICAgICAgZnByaW50ZihmZCwgIlxuIHhtbG5zOlNPQVAtRU5WPVwiJXNcIiIsIGVudlVSSSk7CisgICAgZWxzZSBpZiAoIXN0cmNtcChzLT5uYW1lLCAiU09BUC1FTkMiKSkKKyAgICAgIGZwcmludGYoZmQsICJcbiB4bWxuczpTT0FQLUVOQz1cIiVzXCIiLCBlbmNVUkkpOworICAgIGVsc2UgaWYgKCFzdHJjbXAocy0+bmFtZSwgInhzaSIpKQorICAgICAgZnByaW50ZihmZCwgIlxuIHhtbG5zOnhzaT1cIiVzXCIiLCB4c2lVUkkpOworICAgIGVsc2UgaWYgKCFzdHJjbXAocy0+bmFtZSwgInhzZCIpKQorICAgICAgZnByaW50ZihmZCwgIlxuIHhtbG5zOnhzZD1cIiVzXCIiLCB4c2RVUkkpOworICAgIGVsc2UKKyAgICAgIGZwcmludGYoZmQsICJcbiB4bWxuczolcz1cIiVzLyVzLnhzZFwiIiwgbnNfY29udmVydChzLT5uYW1lKSwgdG1wVVJJLCBuc19jb252ZXJ0KHMtPm5hbWUpKTsKKyAgfQorICBmcHJpbnRmKGZkLCAiPlxuIik7CisgIGdlbl9oZWFkZXIoZmQsIG1ldGhvZCwgcmVzcG9uc2UsIGVuY29kaW5nKTsKKyAgZnByaW50ZihmZCwgIiA8U09BUC1FTlY6Qm9keSIpOworICBpZiAoZWZsYWcgJiYgIWVuY29kaW5nKQorICAgIGZwcmludGYoZmQsICIgU09BUC1FTlY6ZW5jb2RpbmdTdHlsZT1cIiVzXCIiLCBlbmNVUkkpOworICBlbHNlIGlmIChlbmNvZGluZyAmJiAhKmVuY29kaW5nKQorICAgIGZwcmludGYoZmQsICIgU09BUC1FTlY6ZW5jb2RpbmdTdHlsZT1cIiVzXCIiLCBlbmNVUkkpOworICBlbHNlIGlmIChlbmNvZGluZyAmJiBzdHJjbXAoZW5jb2RpbmcsICJsaXRlcmFsIikpCisgICAgZnByaW50ZihmZCwgIiBTT0FQLUVOVjplbmNvZGluZ1N0eWxlPVwiJXNcIiIsIGVuY29kaW5nKTsKKyAgZnByaW50ZihmZCwgIj5cbiIpOworICByZXR1cm4gZmQ7Cit9CisKK2NoYXIgKgorZW1hbGxvYyh1bnNpZ25lZCBpbnQgbikKK3sgY2hhcgkqcDsKKyAgaWYgKChwID0gKGNoYXIqKW1hbGxvYyhuKSkgPT0gTlVMTCkKKyAgICBleGVjZXJyb3IoIm91dCBvZiBtZW1vcnkiKTsKKyAgcmV0dXJuIHA7Cit9CisKK3ZvaWQKK3NvYXBfc2VydmUoVGFibGUgKnRhYmxlKQoreyBpbnQgaT0xOworICBFbnRyeSAqbWV0aG9kLCAqY2F0Y2hfbWV0aG9kOworICBpZiAoIUNmbGFnKQorICB7CisgIGZwcmludGYoZnNlcnZlciwiXG5cblNPQVBfRk1BQzUgaW50IFNPQVBfRk1BQzYgJXNfc2VydmUoc3RydWN0IHNvYXAgKnNvYXApIiwgbmZsYWc/cHJlZml4OiJzb2FwIik7IAorCisgIGZwcmludGYoZnNlcnZlciwiXG57XG4jaWZuZGVmIFdJVEhfRkFTVENHSVxuXHR1bnNpZ25lZCBpbnQgayA9IHNvYXAtPm1heF9rZWVwX2FsaXZlO1xuI2VuZGlmXG5cblx0ZG9cblx0eyIpOworICBmcHJpbnRmKGZzZXJ2ZXIsIlxuI2lmZGVmIFdJVEhfRkFTVENHSVxuXHRcdGlmIChGQ0dJX0FjY2VwdCgpIDwgMClcblx0XHR7XG5cdFx0XHRzb2FwLT5lcnJvciA9IFNPQVBfRU9GO1xuXHRcdFx0cmV0dXJuIHNvYXBfc2VuZF9mYXVsdChzb2FwKTtcblx0XHR9XG4jZW5kaWYiKTsKKyAgZnByaW50Zihmc2VydmVyLCJcblxuXHRcdHNvYXBfYmVnaW4oc29hcCk7Iik7CisKKyAgZnByaW50Zihmc2VydmVyLCJcblxuI2lmbmRlZiBXSVRIX0ZBU1RDR0lcblx0XHRpZiAoIS0taylcblx0XHRcdHNvYXAtPmtlZXBfYWxpdmUgPSAwO1xuI2VuZGlmIik7CisgIGZwcmludGYoZnNlcnZlciwiXG5cblx0XHRpZiAoc29hcF9iZWdpbl9yZWN2KHNvYXApKVxuXHRcdHtcdGlmIChzb2FwLT5lcnJvciA8IFNPQVBfU1RPUClcblx0XHRcdHtcbiNpZmRlZiBXSVRIX0ZBU1RDR0lcblx0XHRcdFx0c29hcF9zZW5kX2ZhdWx0KHNvYXApO1xuI2Vsc2UgXG5cdFx0XHRcdHJldHVybiBzb2FwX3NlbmRfZmF1bHQoc29hcCk7XG4jZW5kaWZcblx0XHRcdH1cblx0XHRcdHNvYXBfY2xvc2Vzb2NrKHNvYXApO1xuXG5cdFx0XHRjb250aW51ZTtcblx0XHR9Iik7CisgIGZwcmludGYoZnNlcnZlciwiXG5cblx0XHRpZiAoc29hcF9lbnZlbG9wZV9iZWdpbl9pbihzb2FwKVxuXHRcdCB8fCBzb2FwX3JlY3ZfaGVhZGVyKHNvYXApXG5cdFx0IHx8IHNvYXBfYm9keV9iZWdpbl9pbihzb2FwKVxuXHRcdCB8fCAlc19zZXJ2ZV9yZXF1ZXN0KHNvYXApXG5cdFx0IHx8IChzb2FwLT5mc2VydmVsb29wICYmIHNvYXAtPmZzZXJ2ZWxvb3Aoc29hcCkpKVxuXHRcdHtcbiNpZmRlZiBXSVRIX0ZBU1RDR0lcblx0XHRcdHNvYXBfc2VuZF9mYXVsdChzb2FwKTtcbiNlbHNlXG5cdFx0XHRyZXR1cm4gc29hcF9zZW5kX2ZhdWx0KHNvYXApO1xuI2VuZGlmXG5cdFx0fSIsIG5mbGFnP3ByZWZpeDoic29hcCIpOworICBmcHJpbnRmKGZzZXJ2ZXIsIlxuXG4jaWZkZWYgV0lUSF9GQVNUQ0dJXG5cdH0gd2hpbGUgKDEpO1xuI2Vsc2Vcblx0fSB3aGlsZSAoc29hcC0+a2VlcF9hbGl2ZSk7XG4jZW5kaWYiKTsKKworICBmcHJpbnRmKGZzZXJ2ZXIsIlxuXHRyZXR1cm4gU09BUF9PSzsiKTsKKyAgZnByaW50Zihmc2VydmVyLCJcbn0iKTsKKworICBmcHJpbnRmKGZzZXJ2ZXIsIlxuXG4jaWZuZGVmIFdJVEhfTk9TRVJWRVJFUVVFU1RcblNPQVBfRk1BQzUgaW50IFNPQVBfRk1BQzYgJXNfc2VydmVfcmVxdWVzdChzdHJ1Y3Qgc29hcCAqc29hcClcbnsiLCBuZmxhZz9wcmVmaXg6InNvYXAiKTsKKyAgZnByaW50Zihmc2VydmVyLCAiXG5cdHNvYXBfcGVla19lbGVtZW50KHNvYXApOyIpOworICBjYXRjaF9tZXRob2QgPSBOVUxMOworICBmb3IgKG1ldGhvZCA9IHRhYmxlLT5saXN0OyBtZXRob2Q7IG1ldGhvZCA9IG1ldGhvZC0+bmV4dCkKKyAgeyBjaGFyICphY3Rpb24gPSBOVUxMOworICAgIGlmIChtZXRob2QtPmluZm8udHlwLT50eXBlID09IFRmdW4gJiYgIShtZXRob2QtPmluZm8uc3RvICYgU2V4dGVybikpCisgICAgeyBpZiAoYWZsYWcpCisgICAgICB7IFNlcnZpY2UgKnNwOworICAgICAgICBmb3IgKHNwID0gc2VydmljZXM7IHNwOyBzcCA9IHNwLT5uZXh0KQorICAgICAgICB7IGlmIChoYXNfbnNfZXEoc3AtPm5zLCBtZXRob2QtPnN5bS0+bmFtZSkpCisJICB7IE1ldGhvZCAqbTsKKwkgICAgZm9yIChtID0gc3AtPmxpc3Q7IG07IG0gPSBtLT5uZXh0KQorCSAgICB7IGlmIChpc19lcV9ub25zKG0tPm5hbWUsIG1ldGhvZC0+c3ltLT5uYW1lKSkKKwkgICAgICB7IGlmIChtLT5tZXNzID09IEFDVElPTikKKwkgICAgICAgICAgYWN0aW9uID0gbS0+cGFydDsKKwkgICAgICB9CisJICAgIH0KKyAgCSAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoaXNfaW52aXNpYmxlKG1ldGhvZC0+c3ltLT5uYW1lKSkKKyAgICAgIHsgRW50cnkgKnBhcmFtID0gZW50cnkoY2xhc3N0YWJsZSwgbWV0aG9kLT5zeW0pOworCWlmIChwYXJhbSkKKwl7IHBhcmFtID0gKChUYWJsZSopcGFyYW0tPmluZm8udHlwLT5yZWYpLT5saXN0OworCSAgaWYgKHBhcmFtKQorICAgICAgICAgIHsgZnByaW50Zihmc2VydmVyLCJcblx0aWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50YWcsIFwiJXNcIikiLCBuc19jb252ZXJ0KHBhcmFtLT5zeW0tPm5hbWUpKTsKKwkgICAgaWYgKGFjdGlvbikKKyAgICAgICAgICAgICAgaWYgKCphY3Rpb24gPT0gJyInKQorCSAgICAgICAgZnByaW50Zihmc2VydmVyLCAiICYmICghc29hcC0+YWN0aW9uIHx8ICFzdHJjbXAoc29hcC0+YWN0aW9uLCAlcykpIiwgYWN0aW9uKTsKKyAgICAgICAgICAgICAgZWxzZQorCSAgICAgICAgZnByaW50Zihmc2VydmVyLCAiICYmICghc29hcC0+YWN0aW9uIHx8ICFzdHJjbXAoc29hcC0+YWN0aW9uLCBcIiVzXCIpKSIsIGFjdGlvbik7CisgICAgICAgICAgICBmcHJpbnRmKGZzZXJ2ZXIsIilcblx0XHRyZXR1cm4gc29hcF9zZXJ2ZV8lcyhzb2FwKTsiLCBtZXRob2QtPnN5bS0+bmFtZSk7CisJICB9CisJICBlbHNlCisJICAgIGNhdGNoX21ldGhvZCA9IG1ldGhvZDsKKwl9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IGZwcmludGYoZnNlcnZlciwiXG5cdGlmICghc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dGFnLCBcIiVzXCIpIiwgbnNfY29udmVydChtZXRob2QtPnN5bS0+bmFtZSkpOworCWlmIChhY3Rpb24pCisgICAgICAgICAgaWYgKCphY3Rpb24gPT0gJyInKQorCSAgICBmcHJpbnRmKGZzZXJ2ZXIsICIgJiYgKCFzb2FwLT5hY3Rpb24gfHwgIXN0cmNtcChzb2FwLT5hY3Rpb24sICVzKSkiLCBhY3Rpb24pOworICAgICAgICAgIGVsc2UKKwkgICAgZnByaW50Zihmc2VydmVyLCAiICYmICghc29hcC0+YWN0aW9uIHx8ICFzdHJjbXAoc29hcC0+YWN0aW9uLCBcIiVzXCIpKSIsIGFjdGlvbik7CisgICAgICAgIGZwcmludGYoZnNlcnZlciwiKVxuXHRcdHJldHVybiBzb2FwX3NlcnZlXyVzKHNvYXApOyIsIG1ldGhvZC0+c3ltLT5uYW1lKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKGNhdGNoX21ldGhvZCkKKyAgICBmcHJpbnRmKGZzZXJ2ZXIsICJcblx0cmV0dXJuIHNvYXBfc2VydmVfJXMoc29hcCk7IiwgY2F0Y2hfbWV0aG9kLT5zeW0tPm5hbWUpOworICBlbHNlCisgICAgZnByaW50Zihmc2VydmVyLCJcblx0cmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9OT19NRVRIT0Q7Iik7CisKKyAgZnByaW50Zihmc2VydmVyLCJcbn1cbiNlbmRpZiIpOworCisgIGJhbm5lcihmaGVhZGVyLCAiU2VydmljZSBPcGVyYXRpb25zIik7CisgIGZvciAobWV0aG9kID0gdGFibGUtPmxpc3Q7IG1ldGhvZDsgbWV0aG9kID0gbWV0aG9kLT5uZXh0KQorICAgIGlmIChtZXRob2QtPmluZm8udHlwLT50eXBlID09IFRmdW4gJiYgIShtZXRob2QtPmluZm8uc3RvICYgU2V4dGVybikpCisJZ2VuZXJhdGVfcHJvdG8odGFibGUsIG1ldGhvZCk7CisgIH0KKworICBpZiAoIVNmbGFnKQorICB7IGJhbm5lcihmaGVhZGVyLCAiU3R1YnMiKTsKKyAgICBmb3IgKG1ldGhvZCA9IHRhYmxlLT5saXN0OyBtZXRob2Q7IG1ldGhvZCA9IG1ldGhvZC0+bmV4dCkKKyAgICAgIGlmIChtZXRob2QtPmluZm8udHlwLT50eXBlID09IFRmdW4gJiYgIShtZXRob2QtPmluZm8uc3RvICYgU2V4dGVybikgJiYgIWlzX2ltcG9ydGVkKG1ldGhvZC0+aW5mby50eXApKQorCWdlbl9jYWxsX21ldGhvZChmY2xpZW50LCB0YWJsZSwgbWV0aG9kLCBOVUxMKTsKKyAgfQorCisgIGlmICghQ2ZsYWcpCisgIHsgYmFubmVyKGZoZWFkZXIsICJTa2VsZXRvbnMiKTsKKyAgICBmcHJpbnRmKGZoZWFkZXIsICJcblNPQVBfRk1BQzUgaW50IFNPQVBfRk1BQzYgJXNfc2VydmUoc3RydWN0IHNvYXAqKTsiLCBuZmxhZz9wcmVmaXg6InNvYXAiKTsKKyAgICBmcHJpbnRmKGZoZWFkZXIsICJcblxuU09BUF9GTUFDNSBpbnQgU09BUF9GTUFDNiAlc19zZXJ2ZV9yZXF1ZXN0KHN0cnVjdCBzb2FwKik7IiwgbmZsYWc/cHJlZml4OiJzb2FwIik7CisgICAgZm9yIChtZXRob2QgPSB0YWJsZS0+bGlzdDsgbWV0aG9kOyBtZXRob2QgPSBtZXRob2QtPm5leHQpCisgICAgICBpZiAobWV0aG9kLT5pbmZvLnR5cC0+dHlwZSA9PSBUZnVuICYmICEobWV0aG9kLT5pbmZvLnN0byAmIFNleHRlcm4pICYmICFpc19pbXBvcnRlZChtZXRob2QtPmluZm8udHlwKSkKKwlnZW5fc2VydmVfbWV0aG9kKGZzZXJ2ZXIsIHRhYmxlLCBtZXRob2QsIE5VTEwpOworICB9Cit9CisKK3ZvaWQKK2dlbmVyYXRlX3Byb3RvKFRhYmxlICp0YWJsZSwgRW50cnkgKnBhcmFtKQoreyBFbnRyeSAqcGluLCpxLCpwb3V0OworICBUYWJsZSAqb3V0cHV0LCp0OworICBxPWVudHJ5KHRhYmxlLCBwYXJhbS0+c3ltKTsKKyAgaWYgKHEpCisgICAgcG91dCA9IChFbnRyeSopcS0+aW5mby50eXAtPnJlZjsKKyAgZWxzZQorICAgIGZwcmludGYoc3RkZXJyLCAiSW50ZXJuYWwgZXJyb3I6IG5vIHRhYmxlIGVudHJ5XG4iKTsKKyAgcT1lbnRyeShjbGFzc3RhYmxlLCBwYXJhbS0+c3ltKTsKKyAgb3V0cHV0PShUYWJsZSopIHEtPmluZm8udHlwLT5yZWY7CisgIGZwcmludGYoZmhlYWRlciwgIlxuXG5TT0FQX0ZNQUM1IGludCBTT0FQX0ZNQUM2ICVzKHN0cnVjdCBzb2FwKiIscGFyYW0tPnN5bS0+bmFtZSk7CisgIGdlbl9wYXJhbXMoZmhlYWRlciwgb3V0cHV0LCBwb3V0LCAxKTsKKyAgZnByaW50ZihmaGVhZGVyLCI7Iik7Cit9CisKK2ludAoraXNfcW5hbWUoVG5vZGUgKnApCit7IHJldHVybiBwLT5zeW0gJiYgaXNfc3RyaW5nKHApICYmIChpc19lcShwLT5zeW0tPm5hbWUsICJ4c2RfX1FOYW1lIikgfHwgaXNfZXEocC0+c3ltLT5uYW1lLCAiUU5hbWUiKSk7Cit9CisKK2ludAoraXNfc3RkcW5hbWUoVG5vZGUgKnApCit7IHJldHVybiBwLT5zeW0gJiYgaXNfc3Rkc3RyaW5nKHApICYmIChpc19lcShwLT5zeW0tPm5hbWUsICJ4c2RfX1FOYW1lIikgfHwgaXNfZXEocC0+c3ltLT5uYW1lLCAiUU5hbWUiKSk7Cit9CisKK2ludAoraXNfWE1MKFRub2RlICpwKQoreyByZXR1cm4gcC0+c3ltICYmIChpc19zdHJpbmcocCkgfHwgaXNfd3N0cmluZyhwKSkgJiYgaXNfZXEocC0+c3ltLT5uYW1lLCAiWE1MIikgfHwgKHAtPnR5cGUgPT0gVHBvaW50ZXIgfHwgcC0+dHlwZSA9PSBUcmVmZXJlbmNlKSAmJiBpc19YTUwocC0+cmVmKTsKK30KKworaW50Citpc19yZXNwb25zZShUbm9kZSAqcCkKK3sgcmV0dXJuIChwLT50eXBlID09IFRwb2ludGVyIHx8IHAtPnR5cGUgPT0gVHJlZmVyZW5jZSkgJiYgcC0+cmVmICYmICgoKChUbm9kZSopcC0+cmVmKS0+dHlwZSA9PSBUc3RydWN0IHx8ICgoVG5vZGUqKXAtPnJlZiktPnR5cGUgPT0gVGNsYXNzKSAmJiAhaXNfcHJpbWNsYXNzKHAtPnJlZikgJiYgIWlzX2R5bmFtaWNfYXJyYXkocC0+cmVmKSAmJiAhaXNfc3Rkc3RyaW5nKHAtPnJlZikgJiYgIWlzX3N0ZHdzdHJpbmcocC0+cmVmKSk7Cit9CisKK0VudHJ5KgorZ2V0X3Jlc3BvbnNlKFRub2RlICpwKQoreyBpZiAocC0+dHlwZSA9PSBUZnVuKQorICAgIHJldHVybiBwLT5yZXNwb25zZTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludAoraXNfdW5tYXRjaGVkKFN5bWJvbCAqc3ltKQoreyByZXR1cm4gc3ltLT5uYW1lWzBdID09ICdfJworICAgICAgJiYgc3ltLT5uYW1lWzFdICE9ICdfJworICAgICAgJiYgc3RybmNtcChzeW0tPm5hbWUsICJfRE9UIiwgNCkgCisgICAgICAmJiBzdHJuY21wKHN5bS0+bmFtZSwgIl9VU0NPUkUiLCA3KQorICAgICAgJiYgKHN0cm5jbXAoc3ltLT5uYW1lLCAiX3giLCAyKSB8fCAhaXN4ZGlnaXQoc3ltLT5uYW1lWzJdKSB8fCAhaXN4ZGlnaXQoc3ltLT5uYW1lWzNdKSB8fCAhaXN4ZGlnaXQoc3ltLT5uYW1lWzRdKSB8fCAhaXN4ZGlnaXQoc3ltLT5uYW1lWzVdKSk7Cit9CisKK2ludAoraXNfaW52aXNpYmxlKGNvbnN0IGNoYXIgKm5hbWUpCit7IHJldHVybiBuYW1lWzBdID09ICctJyB8fCBuYW1lWzBdID09ICdfJyAmJiBuYW1lWzFdID09ICdfJyAmJiBzdHJuY21wKG5hbWUsICJfX3B0ciIsIDUpOworfQorCitpbnQKK2lzX2VsZW1lbnQoVG5vZGUgKnR5cCkKK3sgaWYgKHR5cC0+c3ltKQorICAgIHJldHVybiBpc191bm1hdGNoZWQodHlwLT5zeW0pOworICBpZiAodHlwLT50eXBlID09IFRzdHJ1Y3QgfHwgdHlwLT50eXBlID09IFRjbGFzcykKKyAgICByZXR1cm4gaXNfdW5tYXRjaGVkKHR5cC0+aWQpOworICByZXR1cm4gMDsKK30KKworaW50Citpc191bnR5cGVkKFRub2RlICp0eXApCit7IFRub2RlICpwOworICBpZiAodHlwLT5zeW0pCisgICAgcmV0dXJuIGlzX3VubWF0Y2hlZCh0eXAtPnN5bSk7CisgIGlmICh0eXAtPnR5cGUgPT0gVHBvaW50ZXIgfHwgdHlwLT50eXBlID09IFRyZWZlcmVuY2UgfHwgdHlwLT50eXBlID09IFRhcnJheSkKKyAgICByZXR1cm4gaXNfdW50eXBlZCh0eXAtPnJlZik7CisgIGlmICh0eXAtPnR5cGUgPT0gVHN0cnVjdCB8fCB0eXAtPnR5cGUgPT0gVGNsYXNzKQorICAgIGlmIChpc19keW5hbWljX2FycmF5KHR5cCkgJiYgIWhhc19ucyh0eXApICYmICFpc19iaW5hcnkodHlwKSkKKyAgICB7IHAgPSAoKFRhYmxlKil0eXAtPnJlZiktPmxpc3QtPmluZm8udHlwLT5yZWY7CisgICAgICAgIHJldHVybiBpc191bnR5cGVkKHApOworICAgIH0KKyAgICBlbHNlCisgICAgICByZXR1cm4gaXNfdW5tYXRjaGVkKHR5cC0+aWQpOworICByZXR1cm4gMDsKK30KKworaW50Citpc19wcmltY2xhc3MoVG5vZGUgKnR5cCkKK3sgVGFibGUgKnQ7CisgIGlmICh0eXAtPnR5cGUgPT0gVHN0cnVjdCB8fCB0eXAtPnR5cGUgPT0gVGNsYXNzKQorICB7IGlmICghaXNfZHluYW1pY19hcnJheSh0eXApKQorICAgIHsgdCA9IChUYWJsZSopdHlwLT5yZWY7CisgICAgICB3aGlsZSAodCkKKyAgICAgIHsgaWYgKHQtPmxpc3QgJiYgaXNfaXRlbSh0LT5saXN0KSkKKyAgICAgICAgICBicmVhazsKKwl0ID0gdC0+cHJldjsKKyAgICAgIH0KKyAgICAgIGlmICghdCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB0ID0gKFRhYmxlKil0eXAtPnJlZjsKKyAgICAgIHdoaWxlICh0KQorICAgICAgeyBFbnRyeSAqcDsKKyAgICAgICAgZm9yIChwID0gdC0+bGlzdDsgcDsgcCA9IHAtPm5leHQpCisJICBpZiAoIWlzX2l0ZW0ocCkpCisJICAgIGlmIChwLT5pbmZvLnR5cC0+dHlwZSAhPSBUZnVuICYmICFpc190cmFuc2llbnQocC0+aW5mby50eXApICYmIHAtPmluZm8uc3RvICE9IFNhdHRyaWJ1dGUgJiYgcC0+aW5mby5zdG8gIT0gU3ByaXZhdGUgJiYgcC0+aW5mby5zdG8gIT0gU3Byb3RlY3RlZCkKKwkgICAgICByZXR1cm4gMDsKKyAgICAgICAgdCA9IHQtPnByZXY7CisgICAgICB9CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAodHlwLT50eXBlID09IFRwb2ludGVyIHx8IHR5cC0+dHlwZSA9PSBUcmVmZXJlbmNlKQorICAgIHJldHVybiBpc19wcmltY2xhc3ModHlwLT5yZWYpOworICByZXR1cm4gMDsKK30KKworaW50Citpc19tYXNrKFRub2RlICp0eXApCit7IHJldHVybiAodHlwLT50eXBlID09IFRlbnVtICYmIHR5cC0+d2lkdGggPT0gOCk7Cit9CisKK2ludAoraXNfdm9pZChUbm9kZSAqdHlwKQoreyBpZiAoIXR5cCkKKyAgICByZXR1cm4gMTsKKyAgaWYgKHR5cC0+dHlwZSA9PSBUdm9pZCkKKyAgICByZXR1cm4gMTsKKyAgaWYgKHR5cC0+dHlwZSA9PSBUcG9pbnRlcikKKyAgICByZXR1cm4gaXNfdm9pZCh0eXAtPnJlZik7IAorICBpZiAodHlwLT50eXBlID09IFRyZWZlcmVuY2UpCisgICAgcmV0dXJuIGlzX3ZvaWQodHlwLT5yZWYpOyAKKyAgaWYgKHR5cC0+dHlwZSA9PSBUYXJyYXkpCisgICAgcmV0dXJuIGlzX3ZvaWQodHlwLT5yZWYpOyAKKyAgaWYgKHR5cC0+dHlwZSA9PSBUdGVtcGxhdGUpCisgICAgcmV0dXJuIGlzX3ZvaWQodHlwLT5yZWYpOyAKKyAgcmV0dXJuIDA7Cit9CisKK2ludAoraXNfdHJhbnNpZW50KFRub2RlICp0eXApCit7IGlmICghdHlwKQorICAgIHJldHVybiAxOworICBpZiAoaXNfZXh0ZXJuYWwodHlwKSB8fCBpc192b2xhdGlsZSh0eXApKQorICAgIHJldHVybiAwOworICBpZiAodHlwLT50cmFuc2llbnQpCisgICAgcmV0dXJuIDE7CisgIHN3aXRjaCAodHlwLT50eXBlKQorICB7IGNhc2UgVHBvaW50ZXI6CisgICAgY2FzZSBUcmVmZXJlbmNlOgorICAgIGNhc2UgVGFycmF5OgorICAgIGNhc2UgVHRlbXBsYXRlOgorICAgICAgcmV0dXJuIGlzX3RyYW5zaWVudCh0eXAtPnJlZik7CisgICAgY2FzZSBUc3RydWN0OgorICAgICAgcmV0dXJuIHR5cC0+aWQgPT0gbG9va3VwKCJzb2FwIik7CisgICAgY2FzZSBUbm9uZToKKyAgICBjYXNlIFR2b2lkOgorICAgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludAoraXNfaW1wb3J0ZWQoVG5vZGUqIHR5cCkKK3sgaWYgKGlzX21vZHVsZSB8fCBsZmxhZykKKyAgICByZXR1cm4gdHlwLT5pbXBvcnRzID4gMDsKKyAgcmV0dXJuIDA7Cit9CisKK2ludAoraXNfZXh0ZXJuYWwoVG5vZGUqIHR5cCkKK3sgcmV0dXJuIHR5cC0+dHJhbnNpZW50ID09IC0xOworfQorCitpbnQKK2lzX3ZvbGF0aWxlKFRub2RlKiB0eXApCit7IHJldHVybiB0eXAtPnRyYW5zaWVudCA9PSAtMjsKK30KKworaW50Citpc190ZW1wbGF0ZShUbm9kZSAqcCkKK3sgaWYgKHAtPnR5cGUgPT0gVHBvaW50ZXIpCisgICAgcmV0dXJuIGlzX3RlbXBsYXRlKHAtPnJlZik7CisgIHJldHVybiBwLT50eXBlID09IFR0ZW1wbGF0ZTsKK30KKworaW50Citpc19yZXBldGl0aW9uKEVudHJ5ICpwKQoreyBpZiAocCkKKyAgICByZXR1cm4gcC0+bmV4dCAmJiBwLT5uZXh0LT5pbmZvLnR5cC0+dHlwZSA9PSBUcG9pbnRlciAmJiAocC0+aW5mby50eXAtPnR5cGUgPT0gVGludCB8fCBwLT5pbmZvLnR5cC0+dHlwZSA9PSBUdWludCkgJiYgIXN0cm5jbXAocC0+c3ltLT5uYW1lLCAiX19zaXplIiwgNik7CisgIHJldHVybiAwOworfSAKKworaW50Citpc19pdGVtKEVudHJ5ICpwKQoreyBpZiAocCkKKyAgICByZXR1cm4gIXN0cmNtcChwLT5zeW0tPm5hbWUsICJfX2l0ZW0iKTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludAoraXNfY2hvaWNlKEVudHJ5ICpwKQoreyBpZiAocCkKKyAgICBpZiAocC0+bmV4dCAmJiBwLT5uZXh0LT5pbmZvLnR5cC0+dHlwZSA9PSBUdW5pb24gJiYgcC0+aW5mby50eXAtPnR5cGUgPT0gVGludCAmJiAhc3RybmNtcChwLT5zeW0tPm5hbWUsICJfX3VuaW9uIiwgNykpCisgICAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9IAorCitpbnQKK2lzX2FueXR5cGUoRW50cnkgKnApCit7IGlmIChwKQorICAgIGlmIChwLT5uZXh0ICYmIHAtPm5leHQtPmluZm8udHlwLT50eXBlID09IFRwb2ludGVyICYmICgoVG5vZGUqKXAtPm5leHQtPmluZm8udHlwLT5yZWYpLT50eXBlID09IFR2b2lkICYmIHAtPmluZm8udHlwLT50eXBlID09IFRpbnQgJiYgIXN0cm5jbXAocC0+c3ltLT5uYW1lLCAiX190eXBlIiwgNikpCisgICAgeyBpc19hbnl0eXBlX2ZsYWcgPSAxOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICByZXR1cm4gMDsKK30gCisKK2ludAoraXNfa2V5d29yZChjb25zdCBjaGFyICpuYW1lKQoreyBTeW1ib2wgKnMgPSBsb29rdXAobmFtZSk7CisgIGlmIChzKQorICAgIHJldHVybiBzLT50b2tlbiAhPSBJRDsKKyAgcmV0dXJuIDA7Cit9CisKKworaW50CitoYXNfcHRyKFRub2RlICp0eXApCit7IFRub2RlCSpwOworICBpZiAodHlwLT50eXBlID09IFRwb2ludGVyIHx8IHR5cC0+dHlwZSA9PSBUcmVmZXJlbmNlKQorICAgIHJldHVybiAwOworICBmb3IgKHAgPSBUcHRyW1Rwb2ludGVyXTsgcDsgcCA9IHAtPm5leHQpCisgICAgaWYgKHAtPnJlZiA9PSB0eXAgJiYgcC0+dHJhbnNpZW50ICE9IDEpCisgICAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludAoraGFzX2RldGFpbF9zdHJpbmcoKQoreyBFbnRyeSAqcCA9IGVudHJ5KGNsYXNzdGFibGUsIGxvb2t1cCgiU09BUF9FTlZfX0ZhdWx0IikpOworICBpZiAocCAmJiBwLT5pbmZvLnR5cC0+cmVmICYmIChwLT5pbmZvLnR5cC0+dHlwZSA9PSBUc3RydWN0IHx8IHAtPmluZm8udHlwLT50eXBlID09IFRjbGFzcykpCisgIHsgRW50cnkgKmUgPSBlbnRyeShwLT5pbmZvLnR5cC0+cmVmLCBsb29rdXAoImRldGFpbCIpKTsKKyAgICBpZiAoZSAmJiBlLT5pbmZvLnR5cC0+cmVmICYmIGUtPmluZm8udHlwLT50eXBlID09IFRwb2ludGVyICYmICgoVG5vZGUqKWUtPmluZm8udHlwLT5yZWYpLT50eXBlID09IFRzdHJ1Y3QpCisgICAgeyBFbnRyeSAqZTIgPSBlbnRyeSgoKFRub2RlKillLT5pbmZvLnR5cC0+cmVmKS0+cmVmLCBsb29rdXAoIl9fYW55IikpOworICAgICAgcmV0dXJuIGUyICYmIGlzX3N0cmluZyhlMi0+aW5mby50eXApOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworaW50CitoYXNfRGV0YWlsX3N0cmluZygpCit7IEVudHJ5ICpwID0gZW50cnkoY2xhc3N0YWJsZSwgbG9va3VwKCJTT0FQX0VOVl9fRmF1bHQiKSk7CisgIGlmIChwICYmIHAtPmluZm8udHlwLT5yZWYgJiYgKHAtPmluZm8udHlwLT50eXBlID09IFRzdHJ1Y3QgfHwgcC0+aW5mby50eXAtPnR5cGUgPT0gVGNsYXNzKSkKKyAgeyBFbnRyeSAqZSA9IGVudHJ5KHAtPmluZm8udHlwLT5yZWYsIGxvb2t1cCgiU09BUF9FTlZfX0RldGFpbCIpKTsKKyAgICBpZiAoZSAmJiBlLT5pbmZvLnR5cC0+cmVmICYmIGUtPmluZm8udHlwLT50eXBlID09IFRwb2ludGVyICYmICgoVG5vZGUqKWUtPmluZm8udHlwLT5yZWYpLT50eXBlID09IFRzdHJ1Y3QpCisgICAgeyBFbnRyeSAqZTIgPSBlbnRyeSgoKFRub2RlKillLT5pbmZvLnR5cC0+cmVmKS0+cmVmLCBsb29rdXAoIl9fYW55IikpOworICAgICAgcmV0dXJuIGUyICYmIGlzX3N0cmluZyhlMi0+aW5mby50eXApOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworaW50CitoYXNfY2xhc3MoVG5vZGUgKnR5cCkKK3sgRW50cnkgKnA7CisgIGlmICh0eXAtPnR5cGUgPT0gVHN0cnVjdCAmJiB0eXAtPnJlZikKKyAgeyBmb3IgKHAgPSAoKFRhYmxlKil0eXAtPnJlZiktPmxpc3Q7IHA7IHAgPSBwLT5uZXh0KQorICAgIHsgaWYgKHAtPmluZm8uc3RvICYgU3R5cGVkZWYpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgaWYgKHAtPmluZm8udHlwLT50eXBlID09IFRjbGFzcyB8fCBwLT5pbmZvLnR5cC0+dHlwZSA9PSBUdGVtcGxhdGUpCisgICAgICAgIHJldHVybiAxOworICAgICAgaWYgKHAtPmluZm8udHlwLT50eXBlID09IFRzdHJ1Y3QgJiYgaGFzX2NsYXNzKHAtPmluZm8udHlwKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCitpbnQKK2hhc19leHRlcm5hbChUbm9kZSAqdHlwKQoreyBFbnRyeSAqcDsKKyAgaWYgKCh0eXAtPnR5cGUgPT0gVHN0cnVjdCB8fCB0eXAtPnR5cGUgPT0gVGNsYXNzKSAmJiB0eXAtPnJlZikKKyAgeyBmb3IgKHAgPSAoKFRhYmxlKil0eXAtPnJlZiktPmxpc3Q7IHA7IHAgPSBwLT5uZXh0KQorICAgIHsgaWYgKHAtPmluZm8udHlwLT50eXBlID09IFRzdHJ1Y3QgfHwgcC0+aW5mby50eXAtPnR5cGUgPT0gVGNsYXNzKQorICAgICAgeyBpZiAoaXNfZXh0ZXJuYWwocC0+aW5mby50eXApIHx8IGhhc19leHRlcm5hbChwLT5pbmZvLnR5cCkpCisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCitpbnQKK2hhc192b2xhdGlsZShUbm9kZSAqdHlwKQoreyBFbnRyeSAqcDsKKyAgaWYgKCh0eXAtPnR5cGUgPT0gVHN0cnVjdCB8fCB0eXAtPnR5cGUgPT0gVGNsYXNzKSAmJiB0eXAtPnJlZikKKyAgeyBmb3IgKHAgPSAoKFRhYmxlKil0eXAtPnJlZiktPmxpc3Q7IHA7IHAgPSBwLT5uZXh0KQorICAgIHsgaWYgKHAtPmluZm8udHlwLT50eXBlID09IFRzdHJ1Y3QgfHwgcC0+aW5mby50eXAtPnR5cGUgPT0gVGNsYXNzKQorICAgICAgeyBpZiAoaXNfdm9sYXRpbGUocC0+aW5mby50eXApIHx8IGhhc192b2xhdGlsZShwLT5pbmZvLnR5cCkpCisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCitpbnQKK2hhc19ucyhUbm9kZSAqdHlwKQoreyBjaGFyICpzOworICBpZiAodHlwLT50eXBlID09IFRzdHJ1Y3QgfHwgdHlwLT50eXBlID09IFRjbGFzcyB8fCB0eXAtPnR5cGUgPT0gVGVudW0pCisgICAgcmV0dXJuIGhhc19uc19lcShOVUxMLCB0eXAtPmlkLT5uYW1lKTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludAoraGFzX25zX3QoVG5vZGUgKnR5cCkKK3sgY2hhciAqczsKKyAgaWYgKHR5cC0+c3ltKQorICB7IHMgPSBzdHJzdHIodHlwLT5zeW0tPm5hbWUgKyAxLCAiX18iKTsKKyAgICBpZiAoIXMpCisgICAgICBzID0gc3Ryc3RyKHR5cC0+c3ltLT5uYW1lLCAiOjoiKTsKKyAgICByZXR1cm4gcyAmJiBzWzJdICYmIHNbMl0gIT0gJ18nOworICB9CisgIHJldHVybiBoYXNfbnModHlwKTsKK30KKworaW50Citpc19lcV9ub25zKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKnQpCit7IGludCBuLCBtOworICBjaGFyICpyOworICB3aGlsZSAoKnMgPT0gJ18nKQorICAgIHMrKzsKKyAgd2hpbGUgKCp0ID09ICdfJykKKyAgICB0Kys7CisgIGlmICghKnMgfHwgISp0KQorICAgIHJldHVybiAwOworICByID0gc3Ryc3RyKHQsICJfXyIpOworICBpZiAocikKKyAgICB0ID0gciArIDI7CisgIGZvciAobiA9IHN0cmxlbihzKSAtIDE7IG4gJiYgc1tuXSA9PSAnXyc7IG4tLSkKKyAgICA7CisgIGZvciAobSA9IHN0cmxlbih0KSAtIDE7IG0gJiYgdFttXSA9PSAnXyc7IG0tLSkKKyAgICA7CisgIGlmIChuICE9IG0pCisgICAgcmV0dXJuIDA7CisgIHJldHVybiAhc3RybmNtcChzLCB0LCBuICsgMSk7Cit9CisKK2ludAoraXNfZXEoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqdCkKK3sgaW50IG4sIG07CisgIHdoaWxlICgqcyA9PSAnXycpCisgICAgcysrOworICB3aGlsZSAoKnQgPT0gJ18nKQorICAgIHQrKzsKKyAgaWYgKCEqcyB8fCAhKnQpCisgICAgcmV0dXJuIDA7CisgIGZvciAobiA9IHN0cmxlbihzKSAtIDE7IG4gJiYgc1tuXSA9PSAnXyc7IG4tLSkKKyAgICA7CisgIGZvciAobSA9IHN0cmxlbih0KSAtIDE7IG0gJiYgdFttXSA9PSAnXyc7IG0tLSkKKyAgICA7CisgIGlmIChuICE9IG0pCisgICAgcmV0dXJuIDA7CisgIHJldHVybiAhc3RybmNtcChzLCB0LCBuICsgMSk7Cit9CisKK2ludAoraGFzX25zX2VxKGNoYXIgKm5zLCBjaGFyICpzKQoreyBpbnQgbjsKKyAgd2hpbGUgKCpzID09ICdfJykKKyAgICBzKys7CisgIGlmICghbnMpCisgIHsgY2hhciAqdCA9IHN0cnN0cihzICsgMSwgIl9fIik7CisgICAgaWYgKCF0KQorICAgICAgdCA9IHN0cnN0cihzLCAiOjoiKTsKKyAgICByZXR1cm4gdCAmJiB0WzJdICYmIHRbMl0gIT0gJ18nOworICB9CisgIGlmICgobiA9IHN0cmxlbihucykpIDwgc3RybGVuKHMpKQorICAgIHJldHVybiBzW25dID09ICdfJyAmJiBzW24rMV0gPT0gJ18nICYmICFzdHJuY21wKG5zLCBzLCBuKTsKKyAgcmV0dXJuIDA7Cit9CisKK2NoYXIgKgorbnNfb2YoY2hhciAqbmFtZSkKK3sgU2VydmljZSAqc3A7CisgIGZvciAoc3AgPSBzZXJ2aWNlczsgc3A7IHNwID0gc3AtPm5leHQpCisgICAgaWYgKGhhc19uc19lcShzcC0+bnMsIG5hbWUpKQorICAgICAgYnJlYWs7CisgIGlmIChzcCkKKyAgICByZXR1cm4gc3AtPlVSSTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK2NoYXIgKgorcHJlZml4X29mKGNoYXIgKnMpCit7IGludCBuOworICBjaGFyICp0OworICB3aGlsZSAoKnMgPT0gJ18nKQorICAgIHMrKzsKKyAgdCA9IHN0cnN0cihzICsgMSwgIl9fIik7CisgIGlmICghdCkKKyAgICB0ID0gc3Ryc3RyKHMsICI6OiIpOworICBpZiAodCAmJiB0WzJdICYmIHRbMl0gIT0gJ18nKQorICB7IGNoYXIgKnIgID0gKGNoYXIqKWVtYWxsb2ModCAtIHMgKyAxKTsKKyAgICBzdHJuY3B5KHIsIHMsIHQgLSBzKTsKKyAgICByW3QgLSBzXSA9ICdcMCc7CisgICAgcmV0dXJuIHI7CisgIH0KKyAgcmV0dXJuIHM7Cit9CisKK2NoYXIgKgorbnNfb3ZlcnJpZGRlbihUYWJsZSAqdCwgRW50cnkgKnApCit7IEVudHJ5ICpxOworICBTeW1ib2wgKnMgPSB0LT5zeW07CisgIGNoYXIgKm47CisgIGlmIChzKQorICAgIHdoaWxlICh0ID0gdC0+cHJldikKKyAgICAgIGZvciAocSA9IHQtPmxpc3Q7IHE7IHEgPSBxLT5uZXh0KQorICAgICAgICBpZiAoIXN0cmNtcChxLT5zeW0tPm5hbWUsIHAtPnN5bS0+bmFtZSkpCisgICAgICAgIHsgbiA9IChjaGFyKillbWFsbG9jKHN0cmxlbihzLT5uYW1lKStzdHJsZW4ocC0+c3ltLT5uYW1lKSsyKTsKKwkgIHN0cmNweShuLCBzLT5uYW1lKTsKKwkgIHN0cmNhdChuLCAiLiIpOworCSAgc3RyY2F0KG4sIHAtPnN5bS0+bmFtZSk7CisJICByZXR1cm4gbnNfY29udmVydChuKTsKKyAgICAgICAgfQorICByZXR1cm4gbnNfY29udmVydChwLT5zeW0tPm5hbWUpOworfQorCitjaGFyICoKK25zX2FkZF9vdmVycmlkZGVuKFRhYmxlICp0LCBFbnRyeSAqcCwgY2hhciAqbnMpCit7IEVudHJ5ICpxOworICBTeW1ib2wgKnMgPSB0LT5zeW07CisgIGNoYXIgKm47CisgIGlmIChzKQorICAgIHdoaWxlICh0ID0gdC0+cHJldikKKyAgICAgIGZvciAocSA9IHQtPmxpc3Q7IHE7IHEgPSBxLT5uZXh0KQorICAgICAgICBpZiAoIXN0cmNtcChxLT5zeW0tPm5hbWUsIHAtPnN5bS0+bmFtZSkpCisgICAgICAgIHsgbiA9IChjaGFyKillbWFsbG9jKHN0cmxlbihzLT5uYW1lKStzdHJsZW4ocC0+c3ltLT5uYW1lKSsyKTsKKwkgIHN0cmNweShuLCBzLT5uYW1lKTsKKwkgIHN0cmNhdChuLCAiLiIpOworCSAgc3RyY2F0KG4sIHAtPnN5bS0+bmFtZSk7CisJICByZXR1cm4gbnNfYWRkKG4sIG5zKTsKKyAgICAgICAgfQorICByZXR1cm4gbnNfYWRkKHAtPnN5bS0+bmFtZSwgbnMpOworfQorCisKK2NoYXIgKgorY19pZGVudChUbm9kZSAqdHlwKQoreyBpZiAodHlwLT5zeW0gJiYgc3RyY21wKHR5cC0+c3ltLT5uYW1lLCAiLyo/Ki8iKSkKKyAgICByZXR1cm4gdHlwLT5zeW0tPm5hbWU7CisgIHJldHVybiB0X2lkZW50KHR5cCk7Cit9CisKK2NoYXIgKgorc29hcF90eXBlKFRub2RlICp0eXApCit7IGNoYXIgKnMsICp0ID0gY19pZGVudCh0eXApOworICBpZiAobmFtZXNwYWNlaWQpCisgIHsgcyA9IChjaGFyKillbWFsbG9jKHN0cmxlbih0KSArIHN0cmxlbihuYW1lc3BhY2VpZCkgKyAxMik7CisgICAgc3RyY3B5KHMsICJTT0FQX1RZUEVfIik7CisgICAgc3RyY2F0KHMsIG5hbWVzcGFjZWlkKTsKKyAgICBzdHJjYXQocywgIl8iKTsKKyAgfQorICBlbHNlCisgIHsgcyA9IChjaGFyKillbWFsbG9jKHN0cmxlbih0KSArIDExKTsKKyAgICBzdHJjcHkocywgIlNPQVBfVFlQRV8iKTsKKyAgfQorICBzdHJjYXQocywgdCk7CisgIHJldHVybiBzOworfQorCisvKnRfaWRlbnQgZ2l2ZXMgdGhlIG5hbWUgb2YgYSB0eXBlIGluIGlkZW50aWZpZXIgZm9ybWF0Ki8KK2NoYXIgKgordF9pZGVudChUbm9kZSAqdHlwKQoreyBjaGFyICpwLCAqcTsKKyAgc3dpdGNoKHR5cC0+dHlwZSkKKyAgeworICBjYXNlIFRub25lOgorICAgIHJldHVybiAiIjsKKyAgY2FzZSBUdm9pZDoKKyAgICByZXR1cm4gInZvaWQiOworICBjYXNlIFRjaGFyOgorICAgIHJldHVybiAiYnl0ZSI7CisgIGNhc2UgVHdjaGFyOgorICAgIHJldHVybiAid2NoYXIiOworICBjYXNlIFRzaG9ydDoKKyAgICByZXR1cm4gInNob3J0IjsKKyAgY2FzZSBUaW50OgorICAgIHJldHVybiAiaW50IjsKKyAgY2FzZSBUbG9uZzoKKyAgICByZXR1cm4gImxvbmciOworICBjYXNlIFRsbG9uZzoKKyAgICByZXR1cm4gIkxPTkc2NCI7CisgIGNhc2UgVGZsb2F0OgorICAgIHJldHVybiAiZmxvYXQiOworICBjYXNlIFRkb3VibGU6CisgICAgcmV0dXJuICJkb3VibGUiOworICBjYXNlIFR1Y2hhcjoKKyAgICByZXR1cm4gInVuc2lnbmVkQnl0ZSI7CisgIGNhc2UgVHVzaG9ydDoKKyAgICByZXR1cm4gInVuc2lnbmVkU2hvcnQiOworICBjYXNlIFR1aW50OgorICAgIHJldHVybiAidW5zaWduZWRJbnQiOworICBjYXNlIFR1bG9uZzoKKyAgICByZXR1cm4gInVuc2lnbmVkTG9uZyI7CisgIGNhc2UgVHVsbG9uZzoKKyAgICByZXR1cm4gInVuc2lnbmVkTE9ORzY0IjsKKyAgY2FzZSBUdGltZToKKyAgICByZXR1cm4gInRpbWUiOworICBjYXNlIFRzdHJ1Y3Q6CisgIGNhc2UgVGNsYXNzOgorICBjYXNlIFR1bmlvbjoKKyAgY2FzZSBUZW51bToKKyAgICBpZiAodHlwLT5yZWYgPT0gYm9vbHRhYmxlKQorICAgICAgcmV0dXJuICJib29sIjsKKyAgICByZXR1cm4gcmVzX3JlbW92ZSh0eXAtPmlkLT5uYW1lKTsKKyAgY2FzZSBUcmVmZXJlbmNlOgorICAgIHJldHVybiBjX2lkZW50KHR5cC0+cmVmKTsKKyAgY2FzZSBUcG9pbnRlcjoKKyAgICBpZigoKFRub2RlKil0eXAtPnJlZiktPnR5cGUgPT0gVGNoYXIpIAorCXJldHVybiAic3RyaW5nIjsKKyAgICBpZigoKFRub2RlKil0eXAtPnJlZiktPnR5cGUgPT0gVHdjaGFyKSAKKwlyZXR1cm4gIndzdHJpbmciOworICAgIHA9KGNoYXIqKSBlbWFsbG9jKCgxMCtzdHJsZW4ocSA9IGNfaWRlbnQodHlwLT5yZWYpKSkqc2l6ZW9mKGNoYXIpKTsKKyAgICBzdHJjcHkocCwiUG9pbnRlclRvIik7CisgICAgc3RyY2F0KHAscSk7CisgICAgcmV0dXJuIHA7CisgIGNhc2UgVGFycmF5OgorICAgIHA9KGNoYXIqKSBlbWFsbG9jKCgxNitzdHJsZW4oY19pZGVudCh0eXAtPnJlZikpKSpzaXplb2YoY2hhcikpOworICAgIGlmICgoKFRub2RlKil0eXAtPnJlZiktPndpZHRoKQorICAgICAgc3ByaW50ZihwLCAiQXJyYXklZE9mJXMiLHR5cC0+d2lkdGggLyAoKFRub2RlKikgdHlwLT5yZWYpLT53aWR0aCxjX2lkZW50KHR5cC0+cmVmKSk7CisgICAgZWxzZQorICAgICAgc3ByaW50ZihwLCAiQXJyYXlPZiVzIiwgY19pZGVudCh0eXAtPnJlZikpOworICAgIHJldHVybiBwOworICBjYXNlIFR0ZW1wbGF0ZToKKyAgICBpZiAodHlwLT5yZWYpCisgICAgeyBwPShjaGFyKikgZW1hbGxvYygoMTErc3RybGVuKHJlc19yZW1vdmUodHlwLT5pZC0+bmFtZSkpK3N0cmxlbihxID0gY19pZGVudCh0eXAtPnJlZikpKSpzaXplb2YoY2hhcikpOworICAgICAgc3RyY3B5KHAsIHJlc19yZW1vdmUodHlwLT5pZC0+bmFtZSkpOworICAgICAgc3RyY2F0KHAsICJUZW1wbGF0ZU9mIik7CisgICAgICBzdHJjYXQocCwgcSk7CisgICAgICByZXR1cm4gcDsKKyAgICB9CisgIGNhc2UgVGZ1bjoKKyAgICByZXR1cm4gIkZ1bmN0aW9uIjsKKyAgfQorICByZXR1cm4gImFueVR5cGUiOworfQorCit2b2lkCit1dGY4KGNoYXIgKip0LCBsb25nIGMpCit7IGlmIChjIDwgMHgwMDgwKQorICAgICooKnQpKysgPSAoY2hhciljOworICBlbHNlCisgIHsgaWYgKGMgPCAweDA4MDApCisgICAgICAqKCp0KSsrID0gKGNoYXIpKDB4QzAgfCAoKGMgPj4gNikgJiAweDFGKSk7CisgICAgZWxzZQorICAgIHsgaWYgKGMgPCAweDAxMDAwMCkKKyAgICAgICAgKigqdCkrKyA9IChjaGFyKSgweEUwIHwgKChjID4+IDEyKSAmIDB4MEYpKTsKKyAgICAgIGVsc2UKKyAgICAgIHsgaWYgKGMgPCAweDIwMDAwMCkKKyAgICAgICAgICAqKCp0KSsrID0gKGNoYXIpKDB4RjAgfCAoKGMgPj4gMTgpICYgMHgwNykpOworICAgICAgICBlbHNlCisgICAgICAgIHsgaWYgKGMgPCAweDA0MDAwMDAwKQorICAgICAgICAgICAgKigqdCkrKyA9IChjaGFyKSgweEY4IHwgKChjID4+IDI0KSAmIDB4MDMpKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeyAqKCp0KSsrID0gKGNoYXIpKDB4RkMgfCAoKGMgPj4gMzApICYgMHgwMSkpOworICAgICAgICAgICAgKigqdCkrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDI0KSAmIDB4M0YpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgKigqdCkrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDE4KSAmIDB4M0YpKTsKKyAgICAgICAgfSAgICAgCisgICAgICAgICooKnQpKysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAxMikgJiAweDNGKSk7CisgICAgICB9CisgICAgICAqKCp0KSsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gNikgJiAweDNGKSk7CisgICAgfQorICAgICooKnQpKysgPSAoY2hhcikoMHg4MCB8IChjICYgMHgzRikpOworICB9CisgICooKnQpID0gJ1wwJzsKK30KKworY2hhciAqCituc19jb252ZXJ0KGNoYXIgKnRhZykKK3sgY2hhciAqdCwgKnM7CisgIGludCBpLCBuOworICBpZiAoKnRhZyA9PSAnXycpCisgIHsgaWYgKCFzdHJuY21wKHRhZywgIl9fcHRyIiwgNSkpCisgICAgICBpZiAodGFnWzVdKQorICAgICAgICB0YWcgKz0gNTsKKyAgICAgIGVsc2UKKyAgICAgICAgdGFnID0gIml0ZW0iOworICAgIGVsc2UgaWYgKHN0cm5jbXAodGFnLCAiX0RPVCIsIDQpIAorICAgICAgICAgICYmIHN0cm5jbXAodGFnLCAiX1VTQ09SRSIsIDcpCisgICAgICAgICAgJiYgKHN0cm5jbXAodGFnLCAiX3giLCAyKSB8fCAhaXN4ZGlnaXQodGFnWzJdKSB8fCAhaXN4ZGlnaXQodGFnWzNdKSB8fCAhaXN4ZGlnaXQodGFnWzRdKSB8fCAhaXN4ZGlnaXQodGFnWzVdKSkpCisgICAgICB0YWcrKzsgLyogc2tpcCBsZWFkaW5nIF8gKi8KKyAgfQorICBmb3IgKG4gPSBzdHJsZW4odGFnKTsgbiA+IDA7IG4tLSkKKyAgICBpZiAodGFnW24tMV0gIT0gJ18nKQorICAgICAgYnJlYWs7CisgIHMgPSB0ID0gKGNoYXIqKWVtYWxsb2MobisxKTsKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgeyBpZiAodGFnW2ldID09ICdfJykKKyAgICAgIGlmICh0YWdbaSsxXSA9PSAnXycpCisgICAgICAgIGJyZWFrOworICAgICAgZWxzZSBpZiAoIXN0cm5jbXAodGFnK2ksICJfRE9UIiwgNCkpCisgICAgICB7ICpzKysgPSAnLic7CisgICAgICAgIGkgKz0gMzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzdHJuY21wKHRhZytpLCAiX1VTQ09SRSIsIDcpKQorICAgICAgeyAqcysrID0gJ18nOworICAgICAgICBpICs9IDY7CisgICAgICB9CisgICAgICBlbHNlIGlmICghc3RybmNtcCh0YWcraSwgIl94IiwgMikgJiYgaXN4ZGlnaXQodGFnW2krMl0pICYmIGlzeGRpZ2l0KHRhZ1tpKzNdKSAmJiBpc3hkaWdpdCh0YWdbaSs0XSkgJiYgaXN4ZGlnaXQodGFnW2krNV0pKQorICAgICAgeyBjaGFyIGRbNV07CisJc3RybmNweShkLCB0YWcraSsyLCA0KTsKKwlkWzRdID0gJ1wwJzsKKyAgICAgICAgdXRmOCgmcywgc3RydG91bChkLCBOVUxMLCAxNikpOworICAgICAgICBpICs9IDU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgICpzKysgPSAnLSc7CisgICAgZWxzZSBpZiAodGFnW2ldID09ICc6JyAmJiB0YWdbaSsxXSA9PSAnOicpCisgICAgICBicmVhazsKKyAgICBlbHNlCisgICAgICAqcysrID0gdGFnW2ldOworICB9CisgIGlmIChpIDwgbikKKyAgeyAqcysrID0gJzonOworICAgIGZvciAoaSArPSAyOyBpIDwgbjsgaSsrKQorICAgICAgaWYgKHRhZ1tpXSA9PSAnXycpCisgICAgICAgIGlmICghc3RybmNtcCh0YWcraSwgIl9ET1QiLCA0KSkKKyAgICAgICAgeyAqcysrID0gJy4nOworICAgICAgICAgIGkgKz0gMzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghc3RybmNtcCh0YWcraSwgIl9VU0NPUkUiLCA3KSkKKyAgICAgICAgeyAqcysrID0gJ18nOworICAgICAgICAgIGkgKz0gNjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghc3RybmNtcCh0YWcraSwgIl94IiwgMikgJiYgaXN4ZGlnaXQodGFnW2krMl0pICYmIGlzeGRpZ2l0KHRhZ1tpKzNdKSAmJiBpc3hkaWdpdCh0YWdbaSs0XSkgJiYgaXN4ZGlnaXQodGFnW2krNV0pKQorICAgICAgICB7IGNoYXIgZFs1XTsKKwkgIHN0cm5jcHkoZCwgdGFnK2krMiwgNCk7CisJICBkWzRdID0gJ1wwJzsKKyAgICAgICAgICB1dGY4KCZzLCBzdHJ0b3VsKGQsIE5VTEwsIDE2KSk7CisgICAgICAgICAgaSArPSA1OworICAgICAgICB9CisJZWxzZQorCSAgKnMrKyA9ICctJzsKKyAgICAgIGVsc2UKKyAgICAgICAgKnMrKyA9IHRhZ1tpXTsKKyAgfQorICBlbHNlCisgIHsgLyogY29uc2lkZXIgYWRkaW5nIGRlZmF1bHQgcHJlZml4IHdoZW4gZWxlbWVudC9hdHRyaWJ1dGVGb3JtRGVmYXVsdCBpcyBxdWFsaWZpZWQgKi8KKyAgfQorICAqcyA9ICdcMCc7CisgIHJldHVybiB0OworfQorCitjaGFyICoKK3Jlc19yZW1vdmUoY2hhciAqdGFnKQoreyBjaGFyICpzLCAqdDsKKyAgaWYgKCEocyA9IHN0cmNocih0YWcsICc6JykpKQorICAgIHJldHVybiB0YWc7CisgIHMgPSBlbWFsbG9jKHN0cmxlbih0YWcpICsgMSk7CisgIHN0cmNweShzLCB0YWcpOworICB3aGlsZSAoKHQgPSBzdHJjaHIocywgJzonKSkpCisgICAgKnQgPSAnXyc7CisgIHJldHVybiBzOworfQorCitjaGFyICoKK25zX3F1YWxpZmllZEVsZW1lbnQoVG5vZGUgKnR5cCkKK3sgU2VydmljZSAqc3A7CisgIGNoYXIgKnMgPSBOVUxMOworICBpZiAodHlwLT5zeW0pCisgICAgcyA9IHByZWZpeF9vZih0eXAtPnN5bS0+bmFtZSk7CisgIGlmICghcyAmJiB0eXAtPmlkKQorICAgIHMgPSBwcmVmaXhfb2YodHlwLT5pZC0+bmFtZSk7CisgIGlmICghcykKKyAgICByZXR1cm4gTlVMTDsKKyAgZm9yIChzcCA9IHNlcnZpY2VzOyBzcDsgc3AgPSBzcC0+bmV4dCkKKyAgeyBpZiAoc3AtPmVsZW1lbnRGb3JtICYmICFzdHJjbXAoc3AtPm5zLCBzKSkKKyAgICB7IGlmICghc3RyY21wKHNwLT5lbGVtZW50Rm9ybSwgInF1YWxpZmllZCIpKQorICAgICAgICByZXR1cm4gczsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgfQorICBmb3IgKHNwID0gc2VydmljZXM7IHNwOyBzcCA9IHNwLT5uZXh0KQorICAgIGlmICghc3RyY21wKHNwLT5ucywgcykpCisgICAgICBpZiAoc3AtPnN0eWxlICYmICFzdHJjbXAoc3AtPnN0eWxlLCAiZG9jdW1lbnQiKSkKKyAgICAgICAgcmV0dXJuIHM7CisgIHJldHVybiBOVUxMOworfQorCitjaGFyICoKK25zX3F1YWxpZmllZEF0dHJpYnV0ZShUbm9kZSAqdHlwKQoreyBTZXJ2aWNlICpzcDsKKyAgY2hhciAqcyA9IE5VTEw7CisgIGlmICh0eXAtPnN5bSkKKyAgICBzID0gcHJlZml4X29mKHR5cC0+c3ltLT5uYW1lKTsKKyAgaWYgKCFzICYmIHR5cC0+aWQpCisgICAgcyA9IHByZWZpeF9vZih0eXAtPmlkLT5uYW1lKTsKKyAgaWYgKCFzKQorICAgIHJldHVybiBOVUxMOworICBmb3IgKHNwID0gc2VydmljZXM7IHNwOyBzcCA9IHNwLT5uZXh0KQorICB7IGlmIChzcC0+YXR0cmlidXRlRm9ybSAmJiAhc3RyY21wKHNwLT5ucywgcykpCisgICAgeyBpZiAoIXN0cmNtcChzcC0+YXR0cmlidXRlRm9ybSwgInF1YWxpZmllZCIpKQorICAgICAgICByZXR1cm4gczsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgfQorICBmb3IgKHNwID0gc2VydmljZXM7IHNwOyBzcCA9IHNwLT5uZXh0KQorICAgIGlmICghc3RyY21wKHNwLT5ucywgcykpCisgICAgICBpZiAoc3AtPnN0eWxlICYmICFzdHJjbXAoc3AtPnN0eWxlLCAiZG9jdW1lbnQiKSkKKyAgICAgICAgcmV0dXJuIHM7CisgIHJldHVybiBOVUxMOworfQorCitjaGFyICoKK25zX2FkZChjaGFyICp0YWcsIGNoYXIgKm5zKQoreyBjaGFyICp0LCAqcyA9IG5zX2NvbnZlcnQodGFnKTsKKyAgaWYgKCFucyB8fCAqcyA9PSAnLScgfHwgKHQgPSBzdHJjaHIocywgJzonKSkpCisgICAgcmV0dXJuIHM7CisgIHQgPSBlbWFsbG9jKHN0cmxlbihucykgKyBzdHJsZW4ocykgKyAyKTsKKyAgc3RyY3B5KHQsIG5zKTsKKyAgc3RyY2F0KHQsICI6Iik7CisgIHN0cmNhdCh0LCBzKTsKKyAgcmV0dXJuIHQ7Cit9CisKK2NoYXIgKgorbnNfbmFtZShjaGFyICp0YWcpCit7IGNoYXIgKnQsICpzID0gdGFnOworICBpZiAoKnMpCisgICAgZm9yICh0ID0gcyArIDE7ICp0OyB0KyspCisgICAgICBpZiAodFswXSA9PSAnXycgJiYgdFsxXSA9PSAnXycpCisgICAgICB7IHMgPSB0ICsgMjsKKyAgICAgICAgdCsrOworICAgICAgfQorICByZXR1cm4gczsKK30KKworY2hhciAqCituc19jbmFtZShjaGFyICp0YWcsIGNoYXIgKnN1ZmZpeCkKK3sgY2hhciAqcywgKnQ7CisgIGludCBpLCBuOworICBpZiAoIXRhZykKKyAgICByZXR1cm4gTlVMTDsKKyAgdCA9IG5zX25hbWUodGFnKTsKKyAgbiA9IHN0cmxlbih0KTsKKyAgaWYgKHN1ZmZpeCkKKyAgICBzID0gZW1hbGxvYyhuICsgc3RybGVuKHN1ZmZpeCkgKyAyKTsKKyAgZWxzZQorICAgIHMgPSBlbWFsbG9jKG4gKyAyKTsKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgeyBpZiAoIWlzYWxudW0odFtpXSkpCisgICAgICBzW2ldID0gJ18nOworICAgIGVsc2UKKyAgICAgIHNbaV0gPSB0W2ldOworICB9CisgIHNbaV0gPSAnXDAnOworICBpZiAoc3VmZml4KQorICAgIHN0cmNhdChzLCBzdWZmaXgpOworICBpZiAoaXNfa2V5d29yZCh0KSkKKyAgICBzdHJjYXQocywgIl8iKTsKKyAgcmV0dXJuIHM7Cit9CisKK2NoYXIgKgorbnNfcmVtb3ZlKGNoYXIgKnRhZykKK3sgcmV0dXJuIG5zX2NvbnZlcnQobnNfbmFtZSh0YWcpKTsKK30KKworY2hhciAqCituc19yZW1vdmUxKGNoYXIgKnRhZykKK3sgY2hhciAqdCwgKnMgPSB0YWc7CisgIGludCBuID0gMjsKKyAgLyogaGFuZGxlICdlbnVtX3h4X195eScgZ2VuZXJhdGVkIGJ5IHdzZGwyaCAqLworICBpZiAoIXN0cm5jbXAocywgImVudW1fIiwgNSkpCisgICAgbiA9IDE7CisgIGlmICgqcykKKyAgeyBmb3IgKHQgPSBzICsgMTsgKnQgJiYgbjsgdCsrKQorICAgICAgaWYgKHRbMF0gPT0gJ18nICYmIHRbMV0gPT0gJ18nKQorICAgICAgeyBzID0gdCArIDI7CisgICAgICAgIHQrKzsKKwluLS07CisgICAgICB9CisgICAgaWYgKG4gfHwgKHNbMF0gPT0gJ18nICYmIHNbMV0gIT0gJ3gnKSB8fCAhKnMpCisgICAgICBzID0gdGFnOworICB9CisgIHJldHVybiBzOworfQorCitjaGFyICoKK25zX3JlbW92ZTIoY2hhciAqdGFnKQoreyByZXR1cm4gbnNfY29udmVydChuc19yZW1vdmUxKHRhZykpOworfQorCitjaGFyICoKK3hzaV90eXBlX2NvbmQoVG5vZGUgKnR5cCwgaW50IGZsYWcpCit7IGlmIChmbGFnKQorICAgIHJldHVybiB4c2lfdHlwZSh0eXApOworICByZXR1cm4gIiI7Cit9CisKK2NoYXIgKgoreHNpX3R5cGVfY29uZF91KFRub2RlICp0eXAsIGludCBmbGFnKQoreyBpZiAoZmxhZyAmJiB0ZmxhZykKKyAgICByZXR1cm4geHNpX3R5cGUodHlwKTsKKyAgcmV0dXJuICIiOworfQorCitjaGFyICoKK3hzaV90eXBlX3UoVG5vZGUgKnR5cCkKK3sgaWYgKHRmbGFnKQorICAgIHJldHVybiB4c2lfdHlwZSh0eXApOworICByZXR1cm4gIiI7Cit9CisKK2NoYXIgKgoreHNpX3R5cGUoVG5vZGUgKnR5cCkKK3sgaWYgKCF0eXApCisgICAgcmV0dXJuICJOVUxMIjsKKyAgaWYgKGlzX2R5bmFtaWNfYXJyYXkodHlwKSAmJiAhaGFzX25zKHR5cCkpCisgICAgcmV0dXJuIHhzaV90eXBlX0RhcnJheSh0eXApOworICBpZiAodHlwLT50eXBlID09IFRhcnJheSkKKyAgICByZXR1cm4geHNpX3R5cGVfVGFycmF5KHR5cCk7CisgIGlmIChpc191bnR5cGVkKHR5cCkpCisgICAgcmV0dXJuICIiOworICBpZiAodHlwLT5zeW0pCisgICAgaWYgKCFzdHJuY21wKHR5cC0+c3ltLT5uYW1lLCAiU09BUF9FTlZfXyIsIDEwKSkKKyAgICAgIHJldHVybiAiIjsKKyAgICBlbHNlIGlmIChpc19YTUwodHlwKSkKKyAgICAgIHJldHVybiAieHNkOmFueVR5cGUiOworICAgIGVsc2UgaWYgKHR5cC0+dHlwZSAhPSBUdGVtcGxhdGUpCisgICAgICByZXR1cm4gbnNfY29udmVydCh0eXAtPnN5bS0+bmFtZSk7CisgIGlmIChpc19zdHJpbmcodHlwKSB8fCBpc193c3RyaW5nKHR5cCkgfHwgaXNfc3Rkc3RyaW5nKHR5cCkgfHwgaXNfc3Rkd3N0cmluZyh0eXApKQorICAgIHJldHVybiAieHNkOnN0cmluZyI7CisgIHN3aXRjaCh0eXAtPnR5cGUpeworICBjYXNlIFRjaGFyOgorICAgIHJldHVybiAieHNkOmJ5dGUiOworICBjYXNlIFR3Y2hhcjoKKyAgICByZXR1cm4gIndjaGFyIjsKKyAgY2FzZSBUc2hvcnQ6CisgICAgcmV0dXJuICJ4c2Q6c2hvcnQiOworICBjYXNlIFRpbnQ6CisgICAgcmV0dXJuICJ4c2Q6aW50IjsKKyAgY2FzZSBUbG9uZzoKKyAgY2FzZSBUbGxvbmc6CisgICAgcmV0dXJuICJ4c2Q6bG9uZyI7CisgIGNhc2UgVGZsb2F0OgorICAgIHJldHVybiAieHNkOmZsb2F0IjsKKyAgY2FzZSBUZG91YmxlOgorICAgIHJldHVybiAieHNkOmRvdWJsZSI7CisgIGNhc2UgVHVjaGFyOgorICAgIHJldHVybiAieHNkOnVuc2lnbmVkQnl0ZSI7CisgIGNhc2UgVHVzaG9ydDoKKyAgICByZXR1cm4gInhzZDp1bnNpZ25lZFNob3J0IjsKKyAgY2FzZSBUdWludDoKKyAgICByZXR1cm4gInhzZDp1bnNpZ25lZEludCI7CisgIGNhc2UgVHVsb25nOgorICBjYXNlIFR1bGxvbmc6CisgICAgcmV0dXJuICJ4c2Q6dW5zaWduZWRMb25nIjsKKyAgY2FzZSBUdGltZToKKyAgICByZXR1cm4gInhzZDpkYXRlVGltZSI7CisgIGNhc2UgVHBvaW50ZXI6CisgIGNhc2UgVHJlZmVyZW5jZToKKyAgICByZXR1cm4geHNpX3R5cGUodHlwLT5yZWYpOworICBjYXNlIFRlbnVtOgorICAgIGlmICh0eXAtPnJlZiA9PSBib29sdGFibGUpCisgICAgICByZXR1cm4gInhzZDpib29sZWFuIjsKKyAgY2FzZSBUc3RydWN0OgorICBjYXNlIFRjbGFzczoKKyAgICBpZiAoIXN0cm5jbXAodHlwLT5pZC0+bmFtZSwgIlNPQVBfRU5WX18iLCAxMCkpCisgICAgICByZXR1cm4gIiI7CisgICAgcmV0dXJuIG5zX2NvbnZlcnQodHlwLT5pZC0+bmFtZSk7CisgIGNhc2UgVHRlbXBsYXRlOgorICAgIGlmICh0eXAtPnJlZikKKyAgICAgIHJldHVybiB4c2lfdHlwZSh0eXAtPnJlZik7CisgIH0KKyAgcmV0dXJuICIiOworfQorCitjaGFyICoKK3htbF90YWcoVG5vZGUgKnR5cCkKK3sgaWYgKCF0eXApCisgICAgcmV0dXJuICJOVUxMIjsKKyAgaWYgKHR5cC0+dHlwZSA9PSBUcG9pbnRlciB8fCB0eXAtPnR5cGUgPT0gVHJlZmVyZW5jZSkKKyAgICByZXR1cm4geG1sX3RhZyh0eXAtPnJlZik7CisgIGlmICh0eXAtPnN5bSkKKyAgICByZXR1cm4gbnNfY29udmVydCh0eXAtPnN5bS0+bmFtZSk7CisgIHJldHVybiB0aGVfdHlwZSh0eXApOworfQorCitjaGFyICoKK3dzZGxfdHlwZShUbm9kZSAqdHlwLCBjaGFyICpucykKK3sgaWYgKCF0eXApCisgICAgcmV0dXJuICJOVUxMIjsKKyAgLyoKKyAgaWYgKGlzX3FuYW1lKHR5cCkgJiYgbnMpCisgICAgICByZXR1cm4gInhzZDpRTmFtZSI7CisgICovCisgIGlmICh0eXAtPnN5bSkKKyAgICBpZiAoaXNfWE1MKHR5cCkpCisgICAgICByZXR1cm4gInhzZDphbnlUeXBlIjsKKyAgICBlbHNlIGlmIChucykKKyAgICAgIHJldHVybiBuc19jb252ZXJ0KHR5cC0+c3ltLT5uYW1lKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gbnNfcmVtb3ZlKHR5cC0+c3ltLT5uYW1lKTsKKyAgcmV0dXJuIGJhc2VfdHlwZSh0eXAsIG5zKTsKK30KKworY2hhciAqCitiYXNlX3R5cGUoVG5vZGUgKnR5cCwgY2hhciAqbnMpCit7IGludCBkOworICBjaGFyICpzLCAqdDsKKyAgaWYgKGlzX3N0cmluZyh0eXApIHx8IGlzX3dzdHJpbmcodHlwKSB8fCBpc19zdGRzdHJpbmcodHlwKSB8fCBpc19zdGR3c3RyaW5nKHR5cCkpCisgIHsgaWYgKG5zKQorICAgICAgcmV0dXJuICJ4c2Q6c3RyaW5nIjsKKyAgICByZXR1cm4gInN0cmluZyI7CisgIH0KKyAgaWYgKGlzX2R5bmFtaWNfYXJyYXkodHlwKSAmJiAhaXNfYmluYXJ5KHR5cCkgJiYgIWhhc19ucyh0eXApICYmICFpc191bnR5cGVkKHR5cCkpCisgIHsgcyA9IG5zX3JlbW92ZSh3c2RsX3R5cGUoKChUYWJsZSopdHlwLT5yZWYpLT5saXN0LT5pbmZvLnR5cCwgTlVMTCkpOworICAgIGlmIChucyAmJiAqbnMpCisgICAgeyB0ID0gKGNoYXIqKWVtYWxsb2Moc3RybGVuKHMpK3N0cmxlbihuc19jb252ZXJ0KG5zKSkrMTMpOworICAgICAgc3RyY3B5KHQsIG5zX2NvbnZlcnQobnMpKTsKKyAgICAgIHN0cmNhdCh0LCAiOiIpOworICAgICAgc3RyY2F0KHQsICJBcnJheU9mIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7IHQgPSAoY2hhciopZW1hbGxvYyhzdHJsZW4ocykrMTIpOworICAgICAgc3RyY3B5KHQsICJBcnJheU9mIik7CisgICAgfQorICAgIHN0cmNhdCh0LCBzKTsKKyAgICBkID0gZ2V0X0RhcnJheWRpbXModHlwKTsKKyAgICBpZiAoZCkKKyAgICAgIHNwcmludGYodCtzdHJsZW4odCksICIlZEQiLCBkKTsKKyAgICByZXR1cm4gdDsKKyAgfQorICBzd2l0Y2ggKHR5cC0+dHlwZSl7CisgIGNhc2UgVGNoYXIgOgorICAgIGlmIChucykKKyAgICAgIHJldHVybiAieHNkOmJ5dGUiOworICAgIHJldHVybiAiYnl0ZSI7CisgIGNhc2UgVHdjaGFyIDoKKyAgICBpZiAobnMpCisgICAgICByZXR1cm4gInhzZDp3Y2hhciI7CisgICAgcmV0dXJuICJ3Y2hhciI7CisgIGNhc2UgVHNob3J0IDoKKyAgICBpZiAobnMpCisgICAgICByZXR1cm4gInhzZDpzaG9ydCI7CisgICAgcmV0dXJuICJzaG9ydCI7CisgIGNhc2UgVGludCAgOgorICAgIGlmIChucykKKyAgICAgIHJldHVybiAieHNkOmludCI7CisgICAgcmV0dXJuICJpbnQiOworICBjYXNlIFRsb25nICA6CisgIGNhc2UgVGxsb25nICA6CisgICAgaWYgKG5zKQorICAgICAgcmV0dXJuICJ4c2Q6bG9uZyI7CisgICAgcmV0dXJuICJsb25nIjsKKyAgY2FzZSBUZmxvYXQ6CisgICAgaWYgKG5zKQorICAgICAgcmV0dXJuICJ4c2Q6ZmxvYXQiOworICAgIHJldHVybiAiZmxvYXQiOworICBjYXNlIFRkb3VibGU6CisgICAgaWYgKG5zKQorICAgICAgcmV0dXJuICJ4c2Q6ZG91YmxlIjsKKyAgICByZXR1cm4gImRvdWJsZSI7CisgIGNhc2UgVHVjaGFyOgorICAgIGlmIChucykKKyAgICAgIHJldHVybiAieHNkOnVuc2lnbmVkQnl0ZSI7CisgICAgcmV0dXJuICJ1bnNpZ25lZEJ5dGUiOworICBjYXNlIFR1c2hvcnQ6CisgICAgaWYgKG5zKQorICAgICAgcmV0dXJuICJ4c2Q6dW5zaWduZWRTaG9ydCI7CisgICAgcmV0dXJuICJ1bnNpZ25lZFNob3J0IjsKKyAgY2FzZSBUdWludDoKKyAgICBpZiAobnMpCisgICAgICByZXR1cm4gInhzZDp1bnNpZ25lZEludCI7CisgICAgcmV0dXJuICJ1bnNpZ25lZEludCI7CisgIGNhc2UgVHVsb25nOgorICBjYXNlIFR1bGxvbmc6CisgICAgaWYgKG5zKQorICAgICAgcmV0dXJuICJ4c2Q6dW5zaWduZWRMb25nIjsKKyAgICByZXR1cm4gInVuc2lnbmVkTG9uZyI7CisgIGNhc2UgVHRpbWU6CisgICAgaWYgKG5zKQorICAgICAgcmV0dXJuICJ4c2Q6ZGF0ZVRpbWUiOworICAgIHJldHVybiAiZGF0ZVRpbWUiOworICBjYXNlIFRwb2ludGVyOgorICBjYXNlIFRyZWZlcmVuY2U6CisgICAgcmV0dXJuIHdzZGxfdHlwZSh0eXAtPnJlZiwgbnMpOworICBjYXNlIFRhcnJheToKKyAgICBpZiAobnMgJiYgKm5zKQorICAgIHsgcyA9IChjaGFyKillbWFsbG9jKChzdHJsZW4obnNfY29udmVydChucykpK3N0cmxlbihjX2lkZW50KHR5cCkpKzIpKnNpemVvZihjaGFyKSk7CisgICAgICBzdHJjcHkocywgbnNfY29udmVydChucykpOworICAgICAgc3RyY2F0KHMsICI6Iik7CisgICAgICBzdHJjYXQocywgY19pZGVudCh0eXApKTsKKyAgICAgIHJldHVybiBzOworICAgIH0KKyAgICBlbHNlCisgICAgICByZXR1cm4gY19pZGVudCh0eXApOworICBjYXNlIFRlbnVtOgorICAgIGlmICh0eXAtPnJlZiA9PSBib29sdGFibGUpCisgICAgeyBpZiAobnMpCisgICAgICAgIHJldHVybiAieHNkOmJvb2xlYW4iOworICAgICAgcmV0dXJuICJib29sZWFuIjsKKyAgICB9CisgIGNhc2UgVHN0cnVjdDoKKyAgY2FzZSBUY2xhc3M6CisgICAgaWYgKCFoYXNfbnModHlwKSAmJiBucyAmJiAqbnMpCisgICAgeyBzID0gKGNoYXIqKWVtYWxsb2MoKHN0cmxlbihuc19jb252ZXJ0KG5zKSkrc3RybGVuKHR5cC0+aWQtPm5hbWUpKzIpKnNpemVvZihjaGFyKSk7CisgICAgICBzdHJjcHkocywgbnNfY29udmVydChucykpOworICAgICAgc3RyY2F0KHMsICI6Iik7CisgICAgICBzdHJjYXQocywgbnNfY29udmVydCh0eXAtPmlkLT5uYW1lKSk7CisgICAgICByZXR1cm4gczsKKyAgICB9CisgICAgZWxzZSBpZiAobnMpCisgICAgICByZXR1cm4gbnNfY29udmVydCh0eXAtPmlkLT5uYW1lKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gbnNfcmVtb3ZlKHR5cC0+aWQtPm5hbWUpOworICBjYXNlIFR1bmlvbjoKKyAgICBpZiAobnMpCisgICAgICByZXR1cm4gInhzZDpjaG9pY2UiOworICAgIHJldHVybiAiY2hvaWNlIjsKKyAgY2FzZSBUdGVtcGxhdGU6CisgICAgaWYgKHR5cC0+cmVmKQorICAgICAgcmV0dXJuIHdzZGxfdHlwZSh0eXAtPnJlZiwgbnMpOworICB9CisgIHJldHVybiAiIjsKK30KKworY2hhciAqCit0aGVfdHlwZShUbm9kZSAqdHlwKQoreyBpZiAoIXR5cCkKKyAgICByZXR1cm4gIk5VTEwiOworICBpZiAodHlwLT50eXBlID09IFRhcnJheSB8fCBpc19keW5hbWljX2FycmF5KHR5cCkgJiYgIWhhc19ucyh0eXApICYmICFpc191bnR5cGVkKHR5cCkpCisgICAgcmV0dXJuICJTT0FQLUVOQzpBcnJheSI7CisgIGlmIChpc19zdHJpbmcodHlwKSB8fCBpc193c3RyaW5nKHR5cCkgfHwgaXNfc3Rkc3RyaW5nKHR5cCkgfHwgaXNfc3Rkd3N0cmluZyh0eXApKQorICAgIHJldHVybiAic3RyaW5nIjsKKyAgc3dpdGNoICh0eXAtPnR5cGUpCisgIHsKKyAgY2FzZSBUY2hhcjoKKyAgICByZXR1cm4gImJ5dGUiOworICBjYXNlIFR3Y2hhcjoKKyAgICByZXR1cm4gIndjaGFyIjsKKyAgY2FzZSBUc2hvcnQ6CisgICAgcmV0dXJuICJzaG9ydCI7CisgIGNhc2UgVGludCA6CisgICAgcmV0dXJuICJpbnQiOworICBjYXNlIFRsb25nIDoKKyAgY2FzZSBUbGxvbmcgOgorICAgIHJldHVybiAibG9uZyI7CisgIGNhc2UgVGZsb2F0OgorICAgIHJldHVybiAiZmxvYXQiOworICBjYXNlIFRkb3VibGU6CisgICAgcmV0dXJuICJkb3VibGUiOworICBjYXNlIFR1Y2hhcjoKKyAgICByZXR1cm4gInVuc2lnbmVkQnl0ZSI7CisgIGNhc2UgVHVzaG9ydDoKKyAgICByZXR1cm4gInVuc2lnbmVkU2hvcnQiOworICBjYXNlIFR1aW50OgorICAgIHJldHVybiAidW5zaWduZWRJbnQiOworICBjYXNlIFR1bG9uZzoKKyAgY2FzZSBUdWxsb25nOgorICAgIHJldHVybiAidW5zaWduZWRMb25nIjsKKyAgY2FzZSBUdGltZToKKyAgICByZXR1cm4gImRhdGVUaW1lIjsKKyAgY2FzZSBUcG9pbnRlcjoKKyAgY2FzZSBUcmVmZXJlbmNlOgorICAgIHJldHVybiB0aGVfdHlwZSh0eXAtPnJlZik7CisgIGNhc2UgVGFycmF5OgorICAgIHJldHVybiAiU09BUC1FTkM6QXJyYXkiOworICBjYXNlIFRlbnVtOgorICAgIGlmICh0eXAtPnJlZiA9PSBib29sdGFibGUpCisgICAgICByZXR1cm4gImJvb2xlYW4iOworICBjYXNlIFRzdHJ1Y3Q6CisgIGNhc2UgVGNsYXNzOgorICAgIHJldHVybiBuc19jb252ZXJ0KHR5cC0+aWQtPm5hbWUpOworICB9CisgIHJldHVybiAiIjsKK30KKworLyogY190eXBlIHJldHVybnMgdGhlIHR5cGUgdG8gYmUgdXNlZCBpbiBwYXJhbWV0ZXIgZGVjbGFyYXRpb24qLworY2hhciAqCitjX3R5cGUoVG5vZGUgKnR5cCkKK3sKKyAgY2hhciAqcCwgKnEsIHRlbXBCdWZbMTBdOworICBUbm9kZSAqdGVtcDsKKyAgaWYgKHR5cD09MCkKKyAgICByZXR1cm4gIk5VTEwiOworICBzd2l0Y2godHlwLT50eXBlKXsKKyAgY2FzZSBUbm9uZToKKyAgICByZXR1cm4gIiI7CisgIGNhc2UgVHZvaWQ6CisgICAgcmV0dXJuICJ2b2lkIjsKKyAgY2FzZSBUY2hhcjoKKyAgICByZXR1cm4gImNoYXIiOworICBjYXNlIFR3Y2hhcjoKKyAgICByZXR1cm4gIndjaGFyX3QiOworICBjYXNlIFRzaG9ydDoKKyAgICByZXR1cm4gInNob3J0IjsKKyAgY2FzZSBUaW50ICA6CisgICAgcmV0dXJuICJpbnQiOworICBjYXNlIFRsb25nICA6CisgICAgcmV0dXJuICJsb25nIjsKKyAgY2FzZSBUbGxvbmcgIDoKKyAgICByZXR1cm4gIkxPTkc2NCI7CisgIGNhc2UgVGZsb2F0OgorICAgIHJldHVybiAiZmxvYXQiOworICBjYXNlIFRkb3VibGU6CisgICAgcmV0dXJuICJkb3VibGUiOworICBjYXNlIFR1Y2hhcjoKKyAgICByZXR1cm4gInVuc2lnbmVkIGNoYXIiOworICBjYXNlIFR1c2hvcnQ6CisgICAgcmV0dXJuICJ1bnNpZ25lZCBzaG9ydCI7CisgIGNhc2UgVHVpbnQ6CisgICAgcmV0dXJuICJ1bnNpZ25lZCBpbnQiOworICBjYXNlIFR1bG9uZzoKKyAgICByZXR1cm4gInVuc2lnbmVkIGxvbmciOworICBjYXNlIFR1bGxvbmc6CisgICAgcmV0dXJuICJVTE9ORzY0IjsKKyAgY2FzZSBUdGltZToKKyAgICByZXR1cm4gInRpbWVfdCI7CisgIGNhc2UgVHN0cnVjdDpwPShjaGFyKikgZW1hbGxvYygoOCtzdHJsZW4odHlwLT5pZC0+bmFtZSkpICpzaXplb2YoY2hhcikpOworICAgIHN0cmNweShwLCJzdHJ1Y3QgIik7CisgICAgc3RyY2F0KHAsdHlwLT5pZC0+bmFtZSk7CisgICAgYnJlYWs7CisgIGNhc2UgVGNsYXNzOgorICAgcCA9IHR5cC0+aWQtPm5hbWU7CisgICBicmVhazsKKyAgY2FzZSBUdW5pb246IHA9KGNoYXIqKSBlbWFsbG9jKCg3K3N0cmxlbih0eXAtPmlkLT5uYW1lKSkgKnNpemVvZihjaGFyKSk7CisgICAgc3RyY3B5KHAsInVuaW9uICIpOworICAgIHN0cmNhdChwLHR5cC0+aWQtPm5hbWUpOworICAgIGJyZWFrOworICBjYXNlIFRlbnVtOgorICAgIGlmICh0eXAtPnJlZiA9PSBib29sdGFibGUpCisgICAgICByZXR1cm4gImJvb2wiOworICAgIHA9KGNoYXIqKSBlbWFsbG9jKCg2K3N0cmxlbih0eXAtPmlkLT5uYW1lKSkgKnNpemVvZihjaGFyKSk7CisgICAgc3RyY3B5KHAsImVudW0gIik7CisgICAgc3RyY2F0KHAsdHlwLT5pZC0+bmFtZSk7CisgICAgYnJlYWs7CisgIGNhc2UgVHBvaW50ZXI6CisgICAgcCA9IGNfdHlwZV9pZCh0eXAtPnJlZiwgIioiKTsKKyAgICBicmVhazsKKyAgY2FzZSBUcmVmZXJlbmNlOgorICAgIHAgPSBjX3R5cGVfaWQodHlwLT5yZWYsICImIik7CisgICAgYnJlYWs7CisgIGNhc2UgVGFycmF5OgorICAgIHA9KGNoYXIqKSBlbWFsbG9jKCgxMitzdHJsZW4ocSA9IGNfdHlwZSh0eXAtPnJlZikpKSAqc2l6ZW9mKGNoYXIpKTsKKyAgICB0ZW1wID0gdHlwOworICAgIHdoaWxlKCgoVG5vZGUqKSAodHlwLT5yZWYpKS0+dHlwZT09VGFycmF5KXsKKyAgICAgIHR5cCA9IHR5cC0+cmVmOworICAgIH0KKyAgICBpZiAoKChUbm9kZSopdHlwLT5yZWYpLT50eXBlID09IFRwb2ludGVyKQorICAgICAgc3ByaW50ZihwLCIlcyIsY190eXBlKHR5cC0+cmVmKSk7CisgICAgZWxzZQorICAgICAgc3RyY3B5KHAsIHEpOworICAgIHR5cCA9IHRlbXA7CisgICAgaWYgKCgoVG5vZGUqKSB0eXAtPnJlZiktPndpZHRoKQorICAgIHsgc3ByaW50Zih0ZW1wQnVmLCJbJWRdIiwodHlwLT53aWR0aCAvICgoVG5vZGUqKSB0eXAtPnJlZiktPndpZHRoKSk7CisgICAgICBzdHJjYXQocCx0ZW1wQnVmKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgVHRlbXBsYXRlOgorICAgIGlmICh0eXAtPnJlZikKKyAgICB7IHA9KGNoYXIqKWVtYWxsb2MoKHN0cmxlbihxID0gY190eXBlKHR5cC0+cmVmKSkrc3RybGVuKHR5cC0+aWQtPm5hbWUpKzQpICpzaXplb2YoY2hhcikpOworICAgICAgc3RyY3B5KHAsIHR5cC0+aWQtPm5hbWUpOworICAgICAgc3RyY2F0KHAsICI8Iik7CisgICAgICBzdHJjYXQocCwgcSk7CisgICAgICBzdHJjYXQocCwgIiA+Iik7CisgICAgICBicmVhazsKKyAgICB9CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuICJVbmtub3duVHlwZSI7ICAgCisgIH0KKyAgcmV0dXJuIHA7Cit9CisKK2NoYXIgKgorY19zdG9yYWdlKFN0b3JhZ2Ugc3RvKQoreyBjaGFyICpwOworICBzdGF0aWMgY2hhciBidWZbMjU2XTsKKyAgaWYgKHN0byAmIFNjb25zdCkKKyAgeyBwID0gY19zdG9yYWdlKHN0byAmIH5TY29uc3QpOworICAgIHN0cmNhdChwLCAiY29uc3QgIik7CisgICAgcmV0dXJuIHA7CisgIH0KKyAgaWYgKHN0byAmIFNhdXRvKQorICB7IHAgPSBjX3N0b3JhZ2Uoc3RvICYgflNhdXRvKTsKKyAgICBzdHJjYXQocCwgImF1dG8gIik7CisgICAgcmV0dXJuIHA7CisgIH0KKyAgaWYgKHN0byAmIFNyZWdpc3RlcikKKyAgeyBwID0gY19zdG9yYWdlKHN0byAmIH5TcmVnaXN0ZXIpOworICAgIHN0cmNhdChwLCAicmVnaXN0ZXIgIik7CisgICAgcmV0dXJuIHA7CisgIH0KKyAgaWYgKHN0byAmIFNzdGF0aWMpCisgIHsgcCA9IGNfc3RvcmFnZShzdG8gJiB+U3N0YXRpYyk7CisgICAgc3RyY2F0KHAsICJzdGF0aWMgIik7CisgICAgcmV0dXJuIHA7CisgIH0KKyAgaWYgKHN0byAmIFNleHBsaWNpdCkKKyAgeyBwID0gY19zdG9yYWdlKHN0byAmIH5TZXhwbGljaXQpOworICAgIHN0cmNhdChwLCAiZXhwbGljaXQgIik7CisgICAgcmV0dXJuIHA7CisgIH0KKyAgaWYgKHN0byAmIFNleHRlcm4pCisgIHsgcCA9IGNfc3RvcmFnZShzdG8gJiB+U2V4dGVybik7CisgICAgcmV0dXJuIHA7CisgIH0KKyAgaWYgKHN0byAmIFN0eXBlZGVmKQorICB7IHAgPSBjX3N0b3JhZ2Uoc3RvICYgflN0eXBlZGVmKTsKKyAgICBzdHJjYXQocCwgInR5cGVkZWYgIik7CisgICAgcmV0dXJuIHA7CisgIH0KKyAgaWYgKHN0byAmIFN2aXJ0dWFsKQorICB7IHAgPSBjX3N0b3JhZ2Uoc3RvICYgflN2aXJ0dWFsKTsKKyAgICBzdHJjYXQocCwgInZpcnR1YWwgIik7CisgICAgcmV0dXJuIHA7CisgIH0KKyAgaWYgKHN0byAmIFNmcmllbmQpCisgIHsgcCA9IGNfc3RvcmFnZShzdG8gJiB+U2ZyaWVuZCk7CisgICAgc3RyY2F0KHAsICJmcmllbmQgIik7CisgICAgcmV0dXJuIHA7CisgIH0KKyAgaWYgKHN0byAmIFNpbmxpbmUpCisgIHsgcCA9IGNfc3RvcmFnZShzdG8gJiB+U2lubGluZSk7CisgICAgc3RyY2F0KHAsICJpbmxpbmUgIik7CisgICAgcmV0dXJuIHA7CisgIH0KKyAgYnVmWzBdPSAnXDAnOworICByZXR1cm4gYnVmOworfQorCitjaGFyICoKK2NfaW5pdChFbnRyeSAqZSkKK3sgc3RhdGljIGNoYXIgYnVmWzEwMjRdOworICBidWZbMF0gPSAnXDAnOworICBpZiAoZS0+aW5mby5oYXN2YWwpCisgICAgc3dpdGNoIChlLT5pbmZvLnR5cC0+dHlwZSkKKyAgICB7IGNhc2UgVGNoYXI6CisgICAgICBjYXNlIFR3Y2hhcjoKKyAgICAgIGNhc2UgVHVjaGFyOgorICAgICAgY2FzZSBUc2hvcnQ6CisgICAgICBjYXNlIFR1c2hvcnQ6CisgICAgICBjYXNlIFRpbnQ6CisgICAgICBjYXNlIFR1aW50OgorICAgICAgY2FzZSBUbG9uZzoKKyAgICAgIGNhc2UgVGxsb25nOgorICAgICAgY2FzZSBUdWxvbmc6CisgICAgICBjYXNlIFR1bGxvbmc6CisgICAgICBjYXNlIFR0aW1lOgorICAgICAgICBzcHJpbnRmKGJ1ZiwgIiA9ICJTT0FQX0xPTkdfRk9STUFULCBlLT5pbmZvLnZhbC5pKTsKKwlicmVhazsKKyAgICAgIGNhc2UgVGZsb2F0OgorICAgICAgY2FzZSBUZG91YmxlOgorICAgICAgICBzcHJpbnRmKGJ1ZiwgIiA9ICVmIiwgZS0+aW5mby52YWwucik7CisJYnJlYWs7CisgICAgICBjYXNlIFRlbnVtOgorICAgICAgICBzcHJpbnRmKGJ1ZiwgIiA9ICglcykiU09BUF9MT05HX0ZPUk1BVCwgY190eXBlKGUtPmluZm8udHlwKSwgZS0+aW5mby52YWwuaSk7CisJYnJlYWs7CisgICAgICBkZWZhdWx0OgorCWlmIChlLT5pbmZvLnZhbC5zICYmIHN0cmxlbihlLT5pbmZvLnZhbC5zKSA8IHNpemVvZihidWYpLTYpCisgICAgICAgICAgc3ByaW50ZihidWYsICIgPSBcIiVzXCIiLCBlLT5pbmZvLnZhbC5zKTsKKwllbHNlIGlmIChlLT5pbmZvLnR5cC0+dHlwZSA9PSBUcG9pbnRlcikKKyAgICAgICAgICBzcHJpbnRmKGJ1ZiwgIiA9IE5VTEwiKTsKKwlicmVhazsKKyAgICB9CisgIHJldHVybiBidWY7Cit9CisKKy8qIGNfdHlwZV9pZCByZXR1cm5zIHRoZSBhcnJheXR5cGUgdG8gYmUgdXNlZCBpbiBwYXJhbWV0ZXIgZGVjbGFyYXRpb24KKyAgIEFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgaWRlbnRpZmllciB0aGF0IGFjdHMgYWN0cyBhcyB0ZWggbmFtZSBvZiB0ZWgKKyAgIHR5cGUgb2YgYXJyYXkgKi8KK2NoYXIgKgorY190eXBlX2lkKFRub2RlICp0eXAsIGNoYXIgKmlkZW50KQoreworICBjaGFyICpwLCpxLHRlbXBCdWZbMTBdOworICBUbm9kZSAqdGVtcDsKKyAgRW50cnkgKmU7CisgIGlmICghdHlwKQorICAgIHJldHVybiAiTlVMTCI7CisgIAorICBzd2l0Y2godHlwLT50eXBlKQorICB7CisgIGNhc2UgVG5vbmU6CisgICAgcCA9IGlkZW50OworICAgIGJyZWFrOworICBjYXNlIFR2b2lkOgorICAgIHAgPSAoY2hhciopZW1hbGxvYyg2K3N0cmxlbihpZGVudCkpOworICAgIHN0cmNweShwLCAidm9pZCAiKTsKKyAgICBzdHJjYXQocCwgaWRlbnQpOworICAgIGJyZWFrOworICBjYXNlIFRjaGFyOgorICAgIHAgPSAoY2hhciopZW1hbGxvYyg2K3N0cmxlbihpZGVudCkpOworICAgIHN0cmNweShwLCAiY2hhciAiKTsKKyAgICBzdHJjYXQocCwgaWRlbnQpOworICAgIGJyZWFrOworICBjYXNlIFR3Y2hhcjoKKyAgICBwID0gKGNoYXIqKWVtYWxsb2MoOStzdHJsZW4oaWRlbnQpKTsKKyAgICBzdHJjcHkocCwgIndjaGFyX3QgIik7CisgICAgc3RyY2F0KHAsIGlkZW50KTsKKyAgICBicmVhazsKKyAgY2FzZSBUc2hvcnQ6CisgICAgcCA9IChjaGFyKillbWFsbG9jKDcrc3RybGVuKGlkZW50KSk7CisgICAgc3RyY3B5KHAsICJzaG9ydCAiKTsKKyAgICBzdHJjYXQocCwgaWRlbnQpOworICAgIGJyZWFrOworICBjYXNlIFRpbnQgIDoKKyAgICBwID0gKGNoYXIqKWVtYWxsb2MoNStzdHJsZW4oaWRlbnQpKTsKKyAgICBzdHJjcHkocCwgImludCAiKTsKKyAgICBzdHJjYXQocCwgaWRlbnQpOworICAgIGJyZWFrOworICBjYXNlIFRsb25nICA6CisgICAgcCA9IChjaGFyKillbWFsbG9jKDYrc3RybGVuKGlkZW50KSk7CisgICAgc3RyY3B5KHAsICJsb25nICIpOworICAgIHN0cmNhdChwLCBpZGVudCk7CisgICAgYnJlYWs7CisgIGNhc2UgVGxsb25nICA6CisgICAgcCA9IChjaGFyKillbWFsbG9jKDgrc3RybGVuKGlkZW50KSk7CisgICAgc3RyY3B5KHAsICJMT05HNjQgIik7CisgICAgc3RyY2F0KHAsIGlkZW50KTsKKyAgICBicmVhazsKKyAgY2FzZSBUZmxvYXQ6CisgICAgcCA9IChjaGFyKillbWFsbG9jKDcrc3RybGVuKGlkZW50KSk7CisgICAgc3RyY3B5KHAsICJmbG9hdCAiKTsKKyAgICBzdHJjYXQocCwgaWRlbnQpOworICAgIGJyZWFrOworICBjYXNlIFRkb3VibGU6CisgICAgcCA9IChjaGFyKillbWFsbG9jKDgrc3RybGVuKGlkZW50KSk7CisgICAgc3RyY3B5KHAsICJkb3VibGUgIik7CisgICAgc3RyY2F0KHAsIGlkZW50KTsKKyAgICBicmVhazsKKyAgY2FzZSBUdWNoYXI6CisgICAgcCA9IChjaGFyKillbWFsbG9jKDE1K3N0cmxlbihpZGVudCkpOworICAgIHN0cmNweShwLCAidW5zaWduZWQgY2hhciAiKTsKKyAgICBzdHJjYXQocCwgaWRlbnQpOworICAgIGJyZWFrOworICBjYXNlIFR1c2hvcnQ6CisgICAgcCA9IChjaGFyKillbWFsbG9jKDE2K3N0cmxlbihpZGVudCkpOworICAgIHN0cmNweShwLCAidW5zaWduZWQgc2hvcnQgIik7CisgICAgc3RyY2F0KHAsIGlkZW50KTsKKyAgICBicmVhazsKKyAgY2FzZSBUdWludDoKKyAgICBwID0gKGNoYXIqKWVtYWxsb2MoMTQrc3RybGVuKGlkZW50KSk7CisgICAgc3RyY3B5KHAsICJ1bnNpZ25lZCBpbnQgIik7CisgICAgc3RyY2F0KHAsIGlkZW50KTsKKyAgICBicmVhazsKKyAgY2FzZSBUdWxvbmc6CisgICAgcCA9IChjaGFyKillbWFsbG9jKDE1K3N0cmxlbihpZGVudCkpOworICAgIHN0cmNweShwLCAidW5zaWduZWQgbG9uZyAiKTsKKyAgICBzdHJjYXQocCwgaWRlbnQpOworICAgIGJyZWFrOworICBjYXNlIFR1bGxvbmc6CisgICAgcCA9IChjaGFyKillbWFsbG9jKDkrc3RybGVuKGlkZW50KSk7CisgICAgc3RyY3B5KHAsICJVTE9ORzY0ICIpOworICAgIHN0cmNhdChwLCBpZGVudCk7CisgICAgYnJlYWs7CisgIGNhc2UgVHRpbWU6CisgICAgcCA9IChjaGFyKillbWFsbG9jKDgrc3RybGVuKGlkZW50KSk7CisgICAgc3RyY3B5KHAsICJ0aW1lX3QgIik7CisgICAgc3RyY2F0KHAsIGlkZW50KTsKKyAgICBicmVhazsKKyAgY2FzZSBUc3RydWN0OgorICAgIHA9KGNoYXIqKSBlbWFsbG9jKCg5K3N0cmxlbih0eXAtPmlkLT5uYW1lKStzdHJsZW4oaWRlbnQpKSAqc2l6ZW9mKGNoYXIpKTsKKyAgICBzdHJjcHkocCwic3RydWN0ICIpOworICAgIHN0cmNhdChwLHR5cC0+aWQtPm5hbWUpOworICAgIHN0cmNhdChwLCAiICIpOworICAgIHN0cmNhdChwLGlkZW50KTsKKyAgICBicmVhazsKKyAgY2FzZSBUY2xhc3M6CisgICAgaWYgKCF0eXAtPmdlbmVyYXRlZCkKKyAgICB7IHA9KGNoYXIqKSBlbWFsbG9jKCg4K3N0cmxlbih0eXAtPmlkLT5uYW1lKStzdHJsZW4oaWRlbnQpKSAqc2l6ZW9mKGNoYXIpKTsKKyAgICAgIHN0cmNweShwLCAiY2xhc3MgIik7CisgICAgICBzdHJjYXQocCwgdHlwLT5pZC0+bmFtZSk7CisgICAgICB0eXAtPmdlbmVyYXRlZCA9IFRydWU7CisgICAgfQorICAgIGVsc2UKKyAgICB7IHA9KGNoYXIqKSBlbWFsbG9jKCgyK3N0cmxlbih0eXAtPmlkLT5uYW1lKStzdHJsZW4oaWRlbnQpKSAqc2l6ZW9mKGNoYXIpKTsKKyAgICAgIHN0cmNweShwLCB0eXAtPmlkLT5uYW1lKTsKKyAgICB9CisgICAgc3RyY2F0KHAsICIgIik7CisgICAgc3RyY2F0KHAsIGlkZW50KTsKKyAgICBicmVhazsKKyAgY2FzZSBUdW5pb246CisgICAgcD0oY2hhciopIGVtYWxsb2MoKDgrc3RybGVuKHR5cC0+aWQtPm5hbWUpK3N0cmxlbihpZGVudCkpICpzaXplb2YoY2hhcikpOworICAgIHN0cmNweShwLCJ1bmlvbiAiKTsKKyAgICBzdHJjYXQocCx0eXAtPmlkLT5uYW1lKTsKKyAgICBzdHJjYXQocCwgIiAiKTsKKyAgICBzdHJjYXQocCwgaWRlbnQpOworICAgIGJyZWFrOworICBjYXNlIFRlbnVtOgorICAgIGlmICh0eXAtPnJlZiA9PSBib29sdGFibGUpCisgICAgeyBwID0gKGNoYXIqKWVtYWxsb2MoKHN0cmxlbihpZGVudCkrNikqc2l6ZW9mKGNoYXIpKTsKKyAgICAgIHN0cmNweShwLCAiYm9vbCAiKTsKKyAgICAgIHN0cmNhdChwLCBpZGVudCk7CisgICAgICByZXR1cm4gcDsKKyAgICB9CisgICAgcD0oY2hhciopIGVtYWxsb2MoKDcrc3RybGVuKHR5cC0+aWQtPm5hbWUpK3N0cmxlbihpZGVudCkpICpzaXplb2YoY2hhcikpOworICAgIHN0cmNweShwLCAiZW51bSAiKTsKKyAgICBzdHJjYXQocCwgdHlwLT5pZC0+bmFtZSk7CisgICAgc3RyY2F0KHAsICIgIik7CisgICAgc3RyY2F0KHAsIGlkZW50KTsKKyAgICBicmVhazsKKyAgY2FzZSBUcG9pbnRlcjoKKyAgICBwID0gKGNoYXIqKWVtYWxsb2Moc3RybGVuKGlkZW50KSsyKTsKKyAgICBzdHJjcHkocCsxLCBpZGVudCk7CisgICAgcFswXSA9ICcqJzsKKyAgICBwID0gY190eXBlX2lkKHR5cC0+cmVmLCBwKTsKKyAgICBicmVhazsKKyAgY2FzZSBUcmVmZXJlbmNlOgorICAgIHAgPSAoY2hhciopZW1hbGxvYyhzdHJsZW4oaWRlbnQpKzIpOworICAgIHN0cmNweShwKzEsIGlkZW50KTsKKyAgICBwWzBdID0gJyYnOworICAgIHAgPSBjX3R5cGVfaWQodHlwLT5yZWYsIHApOworICAgIGJyZWFrOworICBjYXNlIFRhcnJheToKKyAgICB0ZW1wID0gdHlwOworICAgIHdoaWxlKCgoVG5vZGUqKSAodHlwLT5yZWYpKS0+dHlwZT09VGFycmF5KXsKKyAgICAgIHR5cCA9IHR5cC0+cmVmOworICAgIH0KKyAgICBwPShjaGFyKikgZW1hbGxvYygoMTIrc3RybGVuKHEgPSBjX3R5cGVfaWQodHlwLT5yZWYsIGlkZW50KSkpICpzaXplb2YoY2hhcikpOworICAgIHN0cmNweShwLCBxKTsKKyAgICB0eXAgPSB0ZW1wOworICAgIHdoaWxlKHR5cC0+dHlwZT09VGFycmF5KXsKKyAgICAgIGlmICgoKFRub2RlKikgdHlwLT5yZWYpLT53aWR0aCkKKyAgICAgIHsgc3ByaW50Zih0ZW1wQnVmLCJbJWRdIiwodHlwLT53aWR0aCAvICgoVG5vZGUqKSB0eXAtPnJlZiktPndpZHRoKSk7CisgICAgICAgIHN0cmNhdChwLHRlbXBCdWYpOworICAgICAgfQorICAgICAgdHlwID0gdHlwLT5yZWY7CisgICAgfQorICAgIC8qaWYoKChUbm9kZSopICh0eXAtPnJlZikpLT50eXBlPT1UYXJyYXkpeworICAgICAgc3ByaW50ZihwLCIlcyBbJWRdIixjX3R5cGUodHlwLT5yZWYpLCh0eXAtPndpZHRoIC8gKChUbm9kZSopIHR5cC0+cmVmKS0+d2lkdGgpKTsKKyAgICB9ZWxzZQorICAgIHNwcmludGYocCwiJXMgYVslZF0iLGNfdHlwZSh0eXAtPnJlZiksKHR5cC0+d2lkdGggLygoVG5vZGUqKSB0eXAtPnJlZiktPndpZHRoKSk7Ki8KKyAgICBicmVhazsKKyAgY2FzZSBUZnVuOgorICAgIGlmIChzdHJuY21wKGlkZW50LCAib3BlcmF0b3IgIiwgOSkpCisgICAgICBxID0gY190eXBlX2lkKCgoRk5pbmZvKil0eXAtPnJlZiktPnJldCwgaWRlbnQpOworICAgIGVsc2UKKyAgICAgIHEgPSBpZGVudDsKKyAgICBwID0gKGNoYXIqKWVtYWxsb2MoMTAyNCk7CisgICAgc3RyY3B5KHAsIHEpOworICAgIHN0cmNhdChwLCAiKCIpOworICAgIGZvciAoZSA9ICgoRk5pbmZvKil0eXAtPnJlZiktPmFyZ3MtPmxpc3Q7IGU7IGUgPSBlLT5uZXh0KQorICAgIHsgc3RyY2F0KHAsIGNfc3RvcmFnZShlLT5pbmZvLnN0bykpOworICAgICAgc3RyY2F0KHAsIGNfdHlwZV9pZChlLT5pbmZvLnR5cCwgZS0+c3ltLT5uYW1lKSk7CisgICAgICBzdHJjYXQocCwgY19pbml0KGUpKTsKKyAgICAgIGlmIChlLT5uZXh0KQorICAgICAgICBzdHJjYXQocCwgIiwgIik7CisgICAgfQorICAgIHN0cmNhdChwLCAiKSIpOworICAgIGJyZWFrOworICBjYXNlIFR0ZW1wbGF0ZToKKyAgICBpZiAodHlwLT5yZWYpCisgICAgeyBwPShjaGFyKillbWFsbG9jKChzdHJsZW4ocSA9IGNfdHlwZSh0eXAtPnJlZikpK3N0cmxlbih0eXAtPmlkLT5uYW1lKStzdHJsZW4oaWRlbnQpKzQpICpzaXplb2YoY2hhcikpOworICAgICAgc3RyY3B5KHAsIHR5cC0+aWQtPm5hbWUpOworICAgICAgc3RyY2F0KHAsICI8Iik7CisgICAgICBzdHJjYXQocCwgcSk7CisgICAgICBzdHJjYXQocCwgIiA+Iik7CisgICAgICBzdHJjYXQocCwgaWRlbnQpOworICAgICAgYnJlYWs7CisgICAgfQorICBkZWZhdWx0OgorICAgIHJldHVybiAiVW5rbm93blR5cGUiOyAgIAorICB9CisgIHJldHVybiBwOworfQorCitjaGFyICoKK3hzaV90eXBlX1RhcnJheShUbm9kZSAqdHlwKQoreyBUbm9kZSAqdDsKKyAgaW50IGNhcmRpbmFsaXR5OworICBjaGFyICpwLCAqczsKKyAgdCA9IHR5cC0+cmVmOworICBjYXJkaW5hbGl0eSA9IDE7CisgIHdoaWxlICh0LT50eXBlID09IFRhcnJheSB8fCAoaXNfZHluYW1pY19hcnJheSh0KSAmJiAhaGFzX25zKHQpICYmICFpc191bnR5cGVkKHR5cCkpKQorICB7IGlmKCB0LT50eXBlID09IFRhcnJheSkKKyAgICAgIHQgPSB0LT5yZWY7CisgICAgZWxzZQorICAgICAgdCA9ICgoVGFibGUqKXQtPnJlZiktPmxpc3QtPmluZm8udHlwLT5yZWY7CisgICAgY2FyZGluYWxpdHkrKzsKKyAgfQorICBzID0geHNpX3R5cGUodCk7CisgIGlmICghKnMpCisgICAgcyA9IHdzZGxfdHlwZSh0LCAiIik7CisgIHAgPSAoY2hhciopZW1hbGxvYyhzdHJsZW4ocykrY2FyZGluYWxpdHkrMyk7CisgIHN0cmNweShwLCBzKTsKKyAgaWYgKGNhcmRpbmFsaXR5ID4gMSkKKyAgeyBzdHJjYXQocCwgIlsiKTsKKyAgICBmb3IgKDsgY2FyZGluYWxpdHkgPiAyOyBjYXJkaW5hbGl0eS0tKQorICAgICAgc3RyY2F0KHAsICIsIik7CisgICAgc3RyY2F0KHAsICJdIik7CisgIH0KKyAgLyoKKyAgZm9yICg7IGNhcmRpbmFsaXR5OyBjYXJkaW5hbGl0eS0tKQorICB7IHQgPSB0eXA7CisgICAgZm9yIChpID0gMTsgaSA8IGNhcmRpbmFsaXR5OyBpKyspCisgICAgICB0ID0gdC0+cmVmOworICAgIHNwcmludGYodGVtcCwiWyVkXSIsZ2V0X2RpbWVuc2lvbih0KSk7CisgICAgc3RyY2F0KHAsIHRlbXApOworICB9CisgICovCisgIHJldHVybiBwOworfQorCitjaGFyICoKK3hzaV90eXBlX0RhcnJheShUbm9kZSAqdHlwKQoreyBUbm9kZSAqdDsKKyAgaW50IGNhcmRpbmFsaXR5OworICBjaGFyICpwLCAqczsKKyAgaWYgKCF0eXAtPnJlZikKKyAgICByZXR1cm4gIiI7CisgIHQgPSAoKFRhYmxlKil0eXAtPnJlZiktPmxpc3QtPmluZm8udHlwLT5yZWY7CisgIGNhcmRpbmFsaXR5ID0gMTsKKyAgd2hpbGUgKHQtPnR5cGUgPT0gVGFycmF5IHx8IChpc19keW5hbWljX2FycmF5KHQpICYmICFoYXNfbnModCkgJiYgIWlzX3VudHlwZWQodHlwKSkpCisgIHsgaWYoIHQtPnR5cGUgPT0gVGFycmF5KQorICAgICAgdCA9IHQtPnJlZjsKKyAgICBlbHNlCisgICAgICB0ID0gKChUYWJsZSopdC0+cmVmKS0+bGlzdC0+aW5mby50eXAtPnJlZjsKKyAgICBjYXJkaW5hbGl0eSsrOworICB9CisgIHMgPSB4c2lfdHlwZSh0KTsKKyAgaWYgKCEqcykKKyAgICBzID0gd3NkbF90eXBlKHQsICIiKTsKKyAgcCA9IChjaGFyKillbWFsbG9jKHN0cmxlbihzKStjYXJkaW5hbGl0eSoyKzEpOworICBzdHJjcHkocCwgcyk7CisgIGlmIChjYXJkaW5hbGl0eSA+IDEpCisgIHsgc3RyY2F0KHAsICJbIik7CisgICAgZm9yICg7IGNhcmRpbmFsaXR5ID4gMjsgY2FyZGluYWxpdHktLSkKKyAgICAgIHN0cmNhdChwLCAiLCIpOworICAgIHN0cmNhdChwLCAiXSIpOworICB9CisgIHJldHVybiBwOworfQorCit2b2lkCitvdXRfZ2VuZXJhdGUoVG5vZGUgKnR5cCkKK3sKKwlpZiAoaXNfdHJhbnNpZW50KHR5cCkgfHwgdHlwLT50eXBlID09IFR3Y2hhciB8fCBpc19YTUwodHlwKSB8fCBpc192b2lkKHR5cCkpCisJICByZXR1cm47CisJaWYgKGlzX2ltcG9ydGVkKHR5cCkpCisJICByZXR1cm47CisJaWYgKGxmbGFnICYmIHR5cC0+dHlwZSA9PSBUaW50ICYmICF0eXAtPnN5bSkKKwl7IGZwcmludGYoZmhlYWQsIlxuXG4jaWZuZGVmICVzIixzb2FwX3R5cGUodHlwKSk7CQorCSAgZnByaW50ZihmaGVhZCwiXG4jZGVmaW5lICVzICglZCkiLHNvYXBfdHlwZSh0eXApLHR5cC0+bnVtKTsJCisJICBmcHJpbnRmKGZoZWFkLCJcbiNlbmRpZiIpOwkKKyAgICAgICAgICBmcHJpbnRmKGZoZWFkLCJcblxuU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9kZWZhdWx0X2ludChzdHJ1Y3Qgc29hcCosIGludCopOyIpOyAKKyAgICAgICAgICBmcHJpbnRmKGZoZWFkLCJcblNPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRfaW50KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgaW50KiwgY29uc3QgY2hhciopOyIpOyAKKyAgICAgICAgICBmcHJpbnRmKGZoZWFkLCJcblNPQVBfRk1BQzEgaW50KiBTT0FQX0ZNQUMyIHNvYXBfaW5faW50KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCosIGNvbnN0IGNoYXIqKTsiKTsgCisJICByZXR1cm47IC8qIGRvIG5vdCBnZW5lcmF0ZSBpbnQgc2VyaWFsaXplcnMgaW4gbGlicyAqLworCX0KKwlpZiAoaXNfcHJpbWl0aXZlKHR5cCkgfHwgaXNfc3RyaW5nKHR5cCkgfHwgaXNfd3N0cmluZyh0eXApKQorCXsJICAgICAgLyogdHlwZU5PKys7ICovCisJCSAgICAgIGZwcmludGYoZmhlYWQsIlxuXG4jaWZuZGVmICVzIixzb2FwX3R5cGUodHlwKSk7CQorCQkgICAgICBmcHJpbnRmKGZoZWFkLCJcbiNkZWZpbmUgJXMgKCVkKSIsc29hcF90eXBlKHR5cCksdHlwLT5udW0pOwkKKwkJICAgICAgZnByaW50ZihmaGVhZCwiXG4jZW5kaWYiKTsJCisJCQlmZmx1c2goZmhlYWQpOworCQkJZGVmYXVsdHModHlwKTsKKwkJCW1hcmsodHlwKTsKKwkJCXNvYXBfcHV0KHR5cCk7CisJCQlzb2FwX291dCh0eXApOworCQkJc29hcF9nZXQodHlwKTsKKwkJCXNvYXBfaW4odHlwKTsKKwkgIHJldHVybjsKKwl9CisgICAgICAgIHN3aXRjaCh0eXAtPnR5cGUpCisgICAgICAgIHsKKwkgIGNhc2UgVHRlbXBsYXRlOgorCSAgY2FzZSBUZW51bToKKyAgICAgICAgICBjYXNlIFRwb2ludGVyOgorICAgICAgICAgIGNhc2UgVGFycmF5OgorICAgICAgICAgIGNhc2UgVHN0cnVjdDoKKwkgIGNhc2UgVGNsYXNzOgorICAgICAgICAgIGNhc2UgVHVuaW9uOgorICAJCQlpZiAoaXNfaGVhZGVyX29yX2ZhdWx0KHR5cCkgfHwgaXNfYm9keSh0eXApKQorCQkJeyBmcHJpbnRmKGZoZWFkLCJcblxuI2lmbmRlZiBXSVRIX05PR0xPQkFMIik7CisJCQkgIGZwcmludGYoZm91dCwiXG5cbiNpZm5kZWYgV0lUSF9OT0dMT0JBTCIpOworCQkgICAgICAgIH0KKwkJICAgICAgZnByaW50ZihmaGVhZCwiXG5cbiNpZm5kZWYgJXMiLHNvYXBfdHlwZSh0eXApKTsJCisJCSAgICAgIGZwcmludGYoZmhlYWQsIlxuI2RlZmluZSAlcyAoJWQpIixzb2FwX3R5cGUodHlwKSx0eXAtPm51bSk7CQorCQkgICAgICBmcHJpbnRmKGZoZWFkLCJcbiNlbmRpZiIpOwkKKwkJICAgICAgZmZsdXNoKGZoZWFkKTsKKyAgICAgICAgICAgICAgICAgICAgICBtYXJrKHR5cCk7CisJCSAgICAgIGRlZmF1bHRzKHR5cCk7CQorCQkgICAgICBzb2FwX3B1dCh0eXApOworCQkgICAgICBzb2FwX291dCh0eXApOworCQkgICAgICBzb2FwX2dldCh0eXApOwkKKwkJICAgICAgc29hcF9pbih0eXApOworCQkgICAgICBpZiAodHlwLT50eXBlID09IFRzdHJ1Y3QgfHwgdHlwLT50eXBlID09IFRjbGFzcyB8fCB0eXAtPnR5cGUgPT0gVHRlbXBsYXRlKQorCQkgICAgICAgIHNvYXBfaW5zdGFudGlhdGVfY2xhc3ModHlwKTsKKyAgCQkgICAgICBpZiAoaXNfaGVhZGVyX29yX2ZhdWx0KHR5cCkgfHwgaXNfYm9keSh0eXApKQorICAgIAkJICAgICAgeyBmcHJpbnRmKGZoZWFkLCJcblxuI2VuZGlmIik7CisgICAgCQkgICAgICAgIGZwcmludGYoZm91dCwiXG5cbiNlbmRpZiIpOworCQkgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6YnJlYWs7CisgICAgICAgICB9Cit9CisKK3ZvaWQKK21hdGxhYl9nZW5fc3BhcnNlU3RydWN0KHZvaWQpCit7CisgIGZwcmludGYoZm1oZWFkZXIsIlxuc3RydWN0IHNvYXBTcGFyc2VBcnJheXtcbiIpOworICBmcHJpbnRmKGZtaGVhZGVyLCIgIGludCAqaXI7XG4iKTsKKyAgZnByaW50ZihmbWhlYWRlciwiICBpbnQgKmpjO1xuIik7CisgIGZwcmludGYoZm1oZWFkZXIsIiAgZG91YmxlICpwcjtcbiIpOworICBmcHJpbnRmKGZtaGVhZGVyLCIgIGludCBudW1fY29sdW1ucztcbiIpOworICBmcHJpbnRmKGZtaGVhZGVyLCIgIGludCBudW1fcm93cztcbiIpOworICBmcHJpbnRmKGZtaGVhZGVyLCIgIGludCBuem1heDtcbiIpOworICBmcHJpbnRmKGZtaGVhZGVyLCJ9O1xuIik7Cit9CisKK3ZvaWQKK21hdGxhYl9jX3RvX214X3NwYXJzZSh2b2lkKQoreworICBmcHJpbnRmKGZtaGVhZGVyLCJcbm14QXJyYXkqIGNfdG9fbXhfc29hcFNwYXJzZUFycmF5KHN0cnVjdCBzb2FwU3BhcnNlQXJyYXkpO1xuIik7CisgIGZwcmludGYoZm1hdGxhYiwiXG5teEFycmF5KiBjX3RvX214X3NvYXBTcGFyc2VBcnJheShzdHJ1Y3Qgc29hcFNwYXJzZUFycmF5IGEpXG4iKTsKKyAgZnByaW50ZihmbWF0bGFiLCJ7XG4iKTsKKyAgZnByaW50ZihmbWF0bGFiLCIgIG14QXJyYXkgKmI7XG4iKTsKKyAgZnByaW50ZihmbWF0bGFiLCIgIGIgPSBteENyZWF0ZVNwYXJzZShhLm51bV9yb3dzLCBhLm51bV9jb2x1bW5zLCBhLm56bWF4LCBteFJFQUwpO1xuIik7CisgIGZwcmludGYoZm1hdGxhYiwiICBteFNldElyKGIsYS5pcik7XG4iKTsKKyAgZnByaW50ZihmbWF0bGFiLCIgIG14U2V0SmMoYixhLmpjKTtcbiIpOworICBmcHJpbnRmKGZtYXRsYWIsIiAgbXhTZXRQcihiLGEucHIpO1xuIik7CisgIGZwcmludGYoZm1hdGxhYiwiICByZXR1cm4gYjtcbiIpOworICBmcHJpbnRmKGZtYXRsYWIsIn1cbiIpOworfQorCit2b2lkIAorbWF0bGFiX214X3RvX2Nfc3BhcnNlKHZvaWQpCit7CisgIGZwcmludGYoZm1oZWFkZXIsIlxubXhBcnJheSogbXhfdG9fY19zb2FwU3BhcnNlQXJyYXkoY29uc3QgbXhBcnJheSAqLCBzdHJ1Y3Qgc29hcFNwYXJzZUFycmF5ICopO1xuIik7CisgIGZwcmludGYoZm1hdGxhYiwiXG5teEFycmF5KiBteF90b19jX3NvYXBTcGFyc2VBcnJheShjb25zdCBteEFycmF5ICphLCBzdHJ1Y3Qgc29hcFNwYXJzZUFycmF5ICpiKVxuIik7CisgIGZwcmludGYoZm1hdGxhYiwie1xuIik7CisgIGZwcmludGYoZm1hdGxhYiwiICBpZighbXhJc1NwYXJzZShhKSlcbiIpOworICBmcHJpbnRmKGZtYXRsYWIsIiAgICB7XG4iKTsKKyAgZnByaW50ZihmbWF0bGFiLCIgICAgICBtZXhFcnJNc2dUeHQoXCJJbnB1dCBzaG91bGQgYmUgYSBzcGFyc2UgYXJyYXkuXCIpO1xuIik7CisgIGZwcmludGYoZm1hdGxhYiwiICAgIH1cbiIpOworICAKKyAgZnByaW50ZihmbWF0bGFiLCIgIC8qIEdldCB0aGUgc3RhcnRpbmcgcG9zaXRpb25zIG9mIHRoZSBkYXRhIGluIHRoZSBzcGFyc2UgYXJyYXkuICovICBcbiIpOworICBmcHJpbnRmKGZtYXRsYWIsIiAgYi0+cHIgPSBteEdldFByKGEpO1xuIik7CisgIGZwcmludGYoZm1hdGxhYiwiICBiLT5pciA9IG14R2V0SXIoYSk7XG4iKTsKKyAgZnByaW50ZihmbWF0bGFiLCIgIGItPmpjID0gbXhHZXRKYyhhKTtcbiIpOworICBmcHJpbnRmKGZtYXRsYWIsIiAgYi0+bnVtX2NvbHVtbnMgPSBteEdldE4oYSk7XG4iKTsKKyAgZnByaW50ZihmbWF0bGFiLCIgIGItPm51bV9yb3dzID0gbXhHZXRNKGEpO1xuIik7CisgIGZwcmludGYoZm1hdGxhYiwiICBiLT5uem1heCA9IG14R2V0TnptYXgoYSk7XG4iKTsKKyAgZnByaW50ZihmbWF0bGFiLCJ9XG4iKTsKK30KKwordm9pZAorbWF0bGFiX214X3RvX2NfZHluYW1pY0FycmF5KHR5cCkKK1Rub2RlKiB0eXA7Cit7ICAKKyAgaW50IGQsaTsKKyAgRW50cnkgKnA7CisKKyAgcCA9IGlzX2R5bmFtaWNfYXJyYXkodHlwKTsKKworICBmcHJpbnRmKGZtYXRsYWIsIntcbiIpOyAgCisgIGZwcmludGYoZm1hdGxhYiwiXHRpbnQgaSwgbnVtZGltcztcbiIpOworICBmcHJpbnRmKGZtYXRsYWIsIlx0Y29uc3QgaW50ICpkaW1zO1xuIik7CisgIGZwcmludGYoZm1hdGxhYiwiXHRkb3VibGUgKnRlbXA7XG4iKTsKKyAgZnByaW50ZihmbWF0bGFiLCJcdGludCBzaXplID0gMTtcbiIpOworICBmcHJpbnRmKGZtYXRsYWIsIlx0aW50IHJldDtcbiIpOworICBmcHJpbnRmKGZtYXRsYWIsIlx0bnVtZGltcyA9IG14R2V0TnVtYmVyT2ZEaW1lbnNpb25zKGEpO1xuIik7CisgIGZwcmludGYoZm1hdGxhYiwiXHRkaW1zID0gbXhHZXREaW1lbnNpb25zKGEpO1xuIik7CisKKyAgZCA9IGdldF9EYXJyYXlkaW1zKHR5cCk7CisgIGZwcmludGYoZm1hdGxhYiwiXHRpZiAobnVtZGltcyAhPSAlZClcbiIsIGQpOworICBmcHJpbnRmKGZtYXRsYWIsIlx0XHRtZXhFcnJNc2dUeHQoXCJJbmNvbXBhdGlibGUgYXJyYXkgc3BlY2lmaWNhdGlvbnMgaW4gQyBhbmQgbXguXCIpO1xuIik7CisgIAorICAvKgorICBmcHJpbnRmKGZtYXRsYWIsIlx0Zm9yKGk9MDtpPG51bWRpbXM7IGkrKykge1xuIik7CisgIGZwcmludGYoZm1hdGxhYiwiXHQgIGItPl9fc2l6ZVtpXSA9IGRpbXNbaV07XG4iKTsKKyAgZnByaW50ZihmbWF0bGFiLCJcdH1cbiIpOworICAqLworCisgIGlmKCgoKFRub2RlICopcC0+aW5mby50eXAtPnJlZiktPnR5cGUgIT0gVGNoYXIpICYmICgoKFRub2RlICopcC0+aW5mby50eXAtPnJlZiktPnR5cGUgIT0gVHVjaGFyKSkKKyAgICB7CisgICAgICBmcHJpbnRmKGZtYXRsYWIsIlx0dGVtcCA9IChkb3VibGUqKW14R2V0UHIoYSk7XG4iKTsKKyAgICAgIGZwcmludGYoZm1hdGxhYiwiXHRpZiAoIXRlbXApXG5cdFx0bWV4RXJyTXNnVHh0KFwibXhfdG9fY19BcnJheU9mZG91YmxlOiBQb2ludGVyIHRvIGRhdGEgaXMgTlVMTFwiKTtcbiIpOworICAgIH0KKworICBmcHJpbnRmKGZtYXRsYWIsIlx0Zm9yIChpID0gMDsgaSA8IG51bWRpbXM7IGkrKykge1xuIik7CisgIGZwcmludGYoZm1hdGxhYiwiXHRcdGlmIChiLT5fX3NpemVbaV0gPCBkaW1zW2ldKVxuIik7CisgIGZwcmludGYoZm1hdGxhYiwiXHRcdFx0bWV4RXJyTXNnVHh0KFwiSW5jb21wYXRpYmxlIGFycmF5IGRpbWVuc2lvbnMgaW4gQyBhbmQgbXguXCIpO1xuIik7CisgIGZwcmludGYoZm1hdGxhYiwiXHRcdHNpemUgKj0gZGltc1tpXTtcbiIpOworICBmcHJpbnRmKGZtYXRsYWIsIlx0fVxuIik7CisKKyAgaWYoKCgoVG5vZGUgKilwLT5pbmZvLnR5cC0+cmVmKS0+dHlwZSAhPSBUY2hhcikgJiYgKCgoVG5vZGUgKilwLT5pbmZvLnR5cC0+cmVmKS0+dHlwZSAhPSBUdWNoYXIpKQorICAgIHsgCisgICAgICBmcHJpbnRmKGZtYXRsYWIsIlx0Zm9yIChpID0gMDsgaSA8IHNpemU7IGkrKylcbiIpOworICAgICAgZnByaW50ZihmbWF0bGFiLCJcdFx0Yi0+X19wdHJbaV0gPSAoJXMpKnRlbXArKztcbiIsIGNfdHlwZShwLT5pbmZvLnR5cC0+cmVmKSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZnByaW50ZihmbWF0bGFiLCJcdHJldCA9IG14R2V0U3RyaW5nKGEsIGItPl9fcHRyLCBzaXplICsgMSk7XG4iKTsKKyAgICAgIGZwcmludGYoZm1hdGxhYiwiXHRtZXhQcmludGYoXCJyZXQgPSAlJWQsIGItPl9fcHRyID0gJSVzLCBzaXplID0gJSVkXCIsIHJldCwgYi0+X19wdHIsIHNpemUpO1xuIik7CisgICAgfQorICBmcHJpbnRmKGZtYXRsYWIsIlxufVxuIik7CisKKyAgZmZsdXNoKGZtYXRsYWIpOworfQorCisKK3ZvaWQKK21hdGxhYl9jX3RvX214X2R5bmFtaWNBcnJheSh0eXApCitUbm9kZSogdHlwOworeyAgCisgIGludCBkLGk7CisgIEVudHJ5ICpwOworCisgIHAgPSBpc19keW5hbWljX2FycmF5KHR5cCk7CisKKyAgZnByaW50ZihmbWF0bGFiLCJ7XG4iKTsgIAorICBmcHJpbnRmKGZtYXRsYWIsIlx0bXhBcnJheSAqb3V0O1xuIik7CisgIGZwcmludGYoZm1hdGxhYiwiXHQlcztcbiIsY190eXBlX2lkKHAtPmluZm8udHlwLT5yZWYsIip0ZW1wIikpOworICBkID0gZ2V0X0RhcnJheWRpbXModHlwKTsKKyAgZnByaW50ZihmbWF0bGFiLCJcdGludCBpO1xuIik7CisKKyAgZnByaW50ZihmbWF0bGFiLCJcdGludCBuZGltID0gJWQsIGRpbXNbJWRdID0geyIsIGQsIGQpOworICBmb3IgKGkgPSAwOyBpIDwgZDsgaSsrKQorICAgIHsgCisgICAgICBpZihpPT0wKQorCWZwcmludGYoZm1hdGxhYiwiYS5fX3NpemVbJWRdIixpKTsKKyAgICAgIGVsc2UKKwlmcHJpbnRmKGZtYXRsYWIsIiwgYS5fX3NpemVbJWRdIixpKTsKKyAgICB9CisgIGZwcmludGYoZm1hdGxhYiwifTtcbiIpOworCisgIGZwcmludGYoZm1hdGxhYiwiXHRpbnQgc2l6ZSA9ICIpOworICAgZm9yIChpID0gMDsgaSA8IGQ7IGkrKykKKyAgICB7IAorICAgICAgaWYoaT09MCkKKwlmcHJpbnRmKGZtYXRsYWIsImRpbXNbJWRdIixpKTsKKyAgICAgIGVsc2UKKwlmcHJpbnRmKGZtYXRsYWIsIipkaW1zWyVkXSIsaSk7CisgICAgfQorICAgZnByaW50ZihmbWF0bGFiLCI7XG4iKTsKKyAgIGlmKCgoKFRub2RlICopcC0+aW5mby50eXAtPnJlZiktPnR5cGUgIT0gVGNoYXIpICYmICgoKFRub2RlICopcC0+aW5mby50eXAtPnJlZiktPnR5cGUgIT0gVHVjaGFyKSkKKyAgICAgeworICAgICAgIGZwcmludGYoZm1hdGxhYiwiXHRvdXQgPSBteENyZWF0ZU51bWVyaWNBcnJheShuZGltLCBkaW1zLCAlcywgbXhSRUFMKTtcbiIsZ2V0X214Q2xhc3NJRChwLT5pbmZvLnR5cC0+cmVmKSk7CisgICAgICAgZnByaW50ZihmbWF0bGFiLCJcdGlmICghb3V0KVxuXHRcdG1leEVyck1zZ1R4dChcIkNvdWxkIG5vdCBjcmVhdGUgbXhBcnJheS5cIik7XG4iKTsKKyAgICAgICBmcHJpbnRmKGZtYXRsYWIsIlx0dGVtcCA9ICglcykgbXhHZXRQcihvdXQpO1xuIixjX3R5cGVfaWQocC0+aW5mby50eXAtPnJlZiwiKiIpKTsKKyAgICAgICBmcHJpbnRmKGZtYXRsYWIsIlx0aWYgKCF0ZW1wKVxuXHRcdG1leEVyck1zZ1R4dChcIm1hdGxhYl9hcnJheV9jX3RvX214OiBQb2ludGVyIHRvIGRhdGEgaXMgTlVMTFwiKTtcbiIpOworCisgICAgICAgZnByaW50ZihmbWF0bGFiLCJcdGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspXG4iKTsKKyAgICAgICBmcHJpbnRmKGZtYXRsYWIsIlx0XHQqdGVtcCsrID0gYS5fX3B0cltpXTtcbiIpOworICAgICB9CisgICBlbHNlCisgICAgIHsKKyAgICAgICBmcHJpbnRmKGZtYXRsYWIsIlx0b3V0ID0gbXhDcmVhdGVTdHJpbmcoYS5fX3B0cik7XG4iKTsKKyAgICAgICBmcHJpbnRmKGZtYXRsYWIsIlx0aWYgKCFvdXQpXG5cdFx0bWV4RXJyTXNnVHh0KFwiQ291bGQgbm90IGNyZWF0ZSBteEFycmF5LlwiKTtcbiIpOworICAgICB9CisgIGZwcmludGYoZm1hdGxhYiwiXHRyZXR1cm4gb3V0O1xufVxuIik7CisgIGZmbHVzaChmbWF0bGFiKTsKK30KKworY2hhciogCitnZXRfbXhDbGFzc0lEKFRub2RlKiB0eXApCit7CisgIAorICBzd2l0Y2godHlwLT50eXBlKQorICAgIHsKKyAgICBjYXNlIFRkb3VibGU6IAorICAgICAgcmV0dXJuICJteERPVUJMRV9DTEFTUyI7CisgICAgY2FzZSBUZmxvYXQ6CisgICAgICByZXR1cm4gIm14U0lOR0xFX0NMQVNTIjsKKyAgICBjYXNlIFRzaG9ydDoKKyAgICAgIHJldHVybiAibXhJTlQxNl9DTEFTUyI7CisgICAgY2FzZSBUdXNob3J0OgorICAgICAgcmV0dXJuICJteFVJTlQxNl9DTEFTUyI7CisgICAgY2FzZSBUaW50OgorICAgICAgcmV0dXJuICJteElOVDMyX0NMQVNTIjsKKyAgICBjYXNlIFR1aW50OgorICAgICAgcmV0dXJuICJteFVJTlQzMl9DTEFTUyI7CisgICAgY2FzZSBUbG9uZzoKKyAgICAgIHJldHVybiAibXhJTlQzMl9DTEFTUyI7CisgICAgY2FzZSBUdWxvbmc6CisgICAgICByZXR1cm4gIm14VUlOVDMyX0NMQVNTIjsKKyAgICBjYXNlIFRsbG9uZzoKKyAgICAgIHJldHVybiAibXhJTlQ2NF9DTEFTUyI7CisgICAgY2FzZSBUdWxsb25nOgorICAgICAgcmV0dXJuICJteFVJTlQ2NF9DTEFTUyI7CisgICAgY2FzZSBUY2hhcjoKKyAgICAgIHJldHVybiAibXhDSEFSX0NMQVNTIjsKKyAgICBjYXNlIFR1Y2hhcjoKKyAgICAgIHJldHVybiAibXhDSEFSX0NMQVNTIjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICIiOworICAgIH07Cit9CisKKy8qRnVuY3Rpb24gbm90IGluIHVzZS4qLwordm9pZCAKK21hdGxhYl9hcnJheV9jX3RvX214KHR5cCkKK1Rub2RlKiB0eXA7Cit7CisgIFRub2RlKiB0ZW1wOworICBpbnQgY2FyZGluYWxpdHk7CisgIGludCBkLGk7CisgIAorICBmcHJpbnRmKGZtYXRsYWIsIntcblx0aW50IHJvd3MsIHIsIGNvbHMsIGM7XG4iKTsKKyAgZnByaW50ZihmbWF0bGFiLCJcdG14QXJyYXkqIG91dDtcbiIpOworICBmcHJpbnRmKGZtYXRsYWIsIlx0ZG91YmxlKiB0ZW1wO1xuIik7CisgIGQgPSBnZXRfZGltZW5zaW9uKHR5cCk7CisgIGZwcmludGYoZm1hdGxhYiwiXHRpbnQgbmRpbSA9ICVkLCBkaW1zWyVkXSA9IHsiLGQsZCk7CisgIHRlbXA9dHlwOworICBmb3IoaT0wO2k8ZDsgaSsrKQorICAgIHsKKyAgICAgIGlmKGk9PTApCisJZnByaW50ZihmbWF0bGFiLCIlZCIsdGVtcC0+d2lkdGggLyAoKFRub2RlKikgdGVtcC0+cmVmKS0+d2lkdGgpOworICAgICAgZWxzZQorCWZwcmludGYoZm1hdGxhYiwiLCVkIix0ZW1wLT53aWR0aCAvICgoVG5vZGUqKSB0ZW1wLT5yZWYpLT53aWR0aCk7CisgICAgICB0ZW1wPXR5cC0+cmVmOworICAgIH0KKyAgZnByaW50ZihmbWF0bGFiLCJ9O1xuIik7CisKKyAgZnByaW50ZihmbWF0bGFiLCJcdG91dCA9IG14Q3JlYXRlTnVtZXJpY0FycmF5KG5kaW0sIGRpbXMsIG14RE9VQkxFX0NMQVNTLCBteFJFQUwpO1xuIik7CisgIGZwcmludGYoZm1hdGxhYiwiXHR0ZW1wID0gKGRvdWJsZSAqKSBteEdldFByKG91dCk7XG4iKTsKKyAgZnByaW50ZihmbWF0bGFiLCJcdGlmICghb3V0KVxuXHRcdG1leEVyck1zZ1R4dChcIkNvdWxkIG5vdCBjcmVhdGUgbXhBcnJheS5cIik7XG4iKTsKKyAgZnByaW50ZihmbWF0bGFiLCJcdGlmICghdGVtcClcblx0XHRtZXhFcnJNc2dUeHQoXCJtYXRsYWJfYXJyYXlfY190b19teDogUG9pbnRlciB0byBkYXRhIGlzIE5VTExcIik7XG4iKTsKKyAgZnByaW50ZihmbWF0bGFiLCJcdHJvd3MgPSBteEdldE0ob3V0KTtcbiIpOworICBmcHJpbnRmKGZtYXRsYWIsIlx0aWYgKCFyb3dzKVxuXHRcdG1leEVyck1zZ1R4dChcIm1hdGxhYl9hcnJheV9jX3RvX214OiBEYXRhIGhhcyB6ZXJvIHJvd3NcIik7XG4iKTsKKyAgZnByaW50ZihmbWF0bGFiLCJcdGNvbHMgPSBteEdldE4ob3V0KTtcbiIpOworICBmcHJpbnRmKGZtYXRsYWIsIlx0aWYgKCFjb2xzKVxuXHRcdG1leEVyck1zZ1R4dChcIm1hdGxhYl9hcnJheV9jX3RvX214OiBEYXRhIGhhcyB6ZXJvIGNvbHVtbnNcIik7XG4iKTsKKyAgZnByaW50ZihmbWF0bGFiLCJcdGZvciAoYyA9IDA7IGMgPCBjb2xzOyBjKyspXG4iKTsKKyAgZnByaW50ZihmbWF0bGFiLCJcdFx0Zm9yIChyID0gMDsgciA8IHJvd3M7IHIrKylcbiIpOworICBmcHJpbnRmKGZtYXRsYWIsIlx0XHRcdCp0ZW1wKysgPSB6LT5hW3JdW2NdO1xuIik7CisgIGZwcmludGYoZm1hdGxhYiwiXHRyZXR1cm4gb3V0O1xufVxuIik7CisgIGZmbHVzaChmbWF0bGFiKTsKK30KKworCit2b2lkIG1hdGxhYl9jX3RvX214X3BvaW50ZXIodHlwKQorVG5vZGUqIHR5cDsKK3sKKyAgaWYgKCF0eXAtPnJlZikKKyAgICByZXR1cm47CisKKyAgLyogIGlmKCgoVG5vZGUqKXR5cC0+cmVmKS0+dHlwZSA9PSBUc3RydWN0KQorICAgIHsKKyAgICAgIGZwcmludGYoZm1oZWFkZXIsIlxubXhBcnJheSogY190b19teF8lcyglcyk7XG4iLGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiKiIpKTsKKyAgICAgIGZwcmludGYoZm1hdGxhYiwiXG5teEFycmF5KiBjX3RvX214XyVzKCVzKVxuIixjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgIiphIikpOworICAgIH0KKyAgZWxzZQorICB7Ki8KKyAgZnByaW50ZihmbWhlYWRlciwiXG5teEFycmF5KiBjX3RvX214XyVzKCVzKTtcbiIsY19pZGVudCh0eXApLGNfdHlwZV9pZCh0eXAsICIiKSk7CisgIGZwcmludGYoZm1hdGxhYiwiXG5teEFycmF5KiBjX3RvX214XyVzKCVzKVxuIixjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgImEiKSk7CisgICAgICAvKiAgfSovCisgIGZwcmludGYoZm1hdGxhYiwie1xuIik7CisgIGZwcmludGYoZm1hdGxhYiwiXHRteEFycmF5ICAqZm91dDtcbiIpOworICBmcHJpbnRmKGZtYXRsYWIsIlx0Zm91dCA9IGNfdG9fbXhfJXMoKmEpO1xuIixjX2lkZW50KHR5cC0+cmVmKSk7CisgIGZwcmludGYoZm1hdGxhYiwiXHRyZXR1cm4gZm91dDtcbiIpOworICBmcHJpbnRmKGZtYXRsYWIsIn1cbiIpOworfQorCit2b2lkIG1hdGxhYl9teF90b19jX3BvaW50ZXIodHlwKQorVG5vZGUqIHR5cDsKK3sKKyAgaWYgKCF0eXAtPnJlZikKKyAgICByZXR1cm47CisgIGZwcmludGYoZm1oZWFkZXIsIlxudm9pZCBteF90b19jXyVzKGNvbnN0IG14QXJyYXkqLCVzKTtcbiIsY19pZGVudCh0eXApLGNfdHlwZV9pZCh0eXAsICIqIikpOworICBmcHJpbnRmKGZtYXRsYWIsIlxudm9pZCBteF90b19jXyVzKGNvbnN0IG14QXJyYXkqIGEsJXMpXG4iLGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiKmIiKSk7CisgIGZwcmludGYoZm1hdGxhYiwie1xuXHRteF90b19jXyVzKGEsKmIpO1xuIixjX2lkZW50KHR5cC0+cmVmKSk7CisgIGZwcmludGYoZm1hdGxhYiwiXG59XG4iKTsKK30KKwordm9pZCBmdW5jMih0eXApCitUbm9kZSogdHlwOworeworICBUYWJsZSAqdGFibGUsKnQ7CisgIEVudHJ5ICpwOworCisgIGZwcmludGYoZm1hdGxhYiwiXHRpZighbXhJc1N0cnVjdChhKSlcblx0XHRtZXhFcnJNc2dUeHQoXCJJbnB1dCBtdXN0IGJlIGEgc3RydWN0dXJlLlwiKTtcbiIpOworCisgIHRhYmxlPShUYWJsZSopdHlwLT5yZWY7CisgIGZvciAodCA9IHRhYmxlOyB0ICE9IChUYWJsZSAqKSAwOyB0ID0gdC0+cHJldikgeyAKKyAgICBmb3IgKHAgPSB0LT5saXN0OyBwICE9IChFbnRyeSopIDA7IHAgPSBwLT5uZXh0KSB7CisgICAgICBpZiAocC0+aW5mby50eXAtPnR5cGUgIT0gVGZ1biAmJiAhaXNfdm9pZChwLT5pbmZvLnR5cCkgJiYgIWlzX1hNTChwLT5pbmZvLnR5cCkpCisJeworCSAgZnByaW50ZihmbWF0bGFiLCJcdHtteEFycmF5ICp0bXAgPSBteEdldEZpZWxkKGEsMCxcIiVzXCIpO1xuIixwLT5zeW0tPm5hbWUpOworCSAgZnByaW50ZihmbWF0bGFiLCJcdGlmICghdG1wKSB7XG4iKTsKKwkgIGZwcmludGYoZm1hdGxhYiwiXHRcdG1leEVyck1zZ1R4dChcIkFib3ZlIGZpZWxkIGlzIGVtcHR5IVwiKTtcblx0fVxuIik7ICAgCisJICBmcHJpbnRmKGZtYXRsYWIsIlx0bXhfdG9fY18lcyh0bXAsJihiLT4lcykpO31cbiIsY19pZGVudChwLT5pbmZvLnR5cCkscC0+c3ltLT5uYW1lKTsKKwl9CisgICAgfQorICB9Cit9CisKK3ZvaWQgCittYXRsYWJfbXhfdG9fY19zdHJ1Y3QodHlwKQorVG5vZGUqIHR5cDsKK3sKKyAgaWYgKCF0eXAtPnJlZikKKyAgICByZXR1cm47CisKKyAgCisgIGlmIChpc19keW5hbWljX2FycmF5KHR5cCkpCisgICAgeworICAgICAgZnByaW50ZihmbWhlYWRlciwiXG52b2lkIG14X3RvX2NfJXMoY29uc3QgbXhBcnJheSosICVzKTtcbiIsY19pZGVudCh0eXApLGNfdHlwZV9pZCh0eXAsICIqIikpOworICAgICAgZnByaW50ZihmbWF0bGFiLCJcbnZvaWQgbXhfdG9fY18lcyhjb25zdCBteEFycmF5KiBhLCAlcylcbiIsY19pZGVudCh0eXApLGNfdHlwZV9pZCh0eXAsICIqYiIpKTsKKyAgICAgIG1hdGxhYl9teF90b19jX2R5bmFtaWNBcnJheSh0eXApOworICAgICAgcmV0dXJuOworICAgIH0KKyAgZWxzZSBpZihzdHJzdHIoY190eXBlX2lkKHR5cCwgIiIpLCJzb2FwU3BhcnNlQXJyYXkiKSkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGZwcmludGYoZm1oZWFkZXIsIlxudm9pZCBteF90b19jXyVzKGNvbnN0IG14QXJyYXkqLCAlcyk7XG4iLGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiKiIpKTsKKyAgZnByaW50ZihmbWF0bGFiLCJcbnZvaWQgbXhfdG9fY18lcyhjb25zdCBteEFycmF5KiBhLCAlcylcbiIsY19pZGVudCh0eXApLGNfdHlwZV9pZCh0eXAsICIqYiIpKTsKKyAgZnByaW50ZihmbWF0bGFiLCJ7XG4iKTsKKyAgCisgIGZ1bmMyKHR5cCk7CisgIGZwcmludGYoZm1hdGxhYiwiXG59XG4iKTsKKyAgCisgIHJldHVybjsKK30KKworCisKK3ZvaWQKK21hdGxhYl9jX3RvX214X3N0cnVjdCh0eXApCitUbm9kZSogdHlwOworeworICBUYWJsZSAqdGFibGUsKnQ7CisgIEVudHJ5ICpwOworICBpbnQgbnVtYmVyX29mX2ZpZWxkcz0wOworCisgIGlmICghdHlwLT5yZWYpCisgICAgcmV0dXJuOworCisgIGlmIChpc19keW5hbWljX2FycmF5KHR5cCkpCisgICAgeworICAgICAgZnByaW50ZihmbWhlYWRlciwiXG5teEFycmF5KiBjX3RvX214XyVzKCVzKTtcbiIsY19pZGVudCh0eXApLGNfdHlwZV9pZCh0eXAsICIiKSk7CisgICAgICBmcHJpbnRmKGZtYXRsYWIsIlxubXhBcnJheSogY190b19teF8lcyglcylcbiIsY19pZGVudCh0eXApLGNfdHlwZV9pZCh0eXAsICJhIikpOworICAgICAgbWF0bGFiX2NfdG9fbXhfZHluYW1pY0FycmF5KHR5cCk7CisgICAgICByZXR1cm47CisgICAgfQorICBlbHNlIGlmKHN0cnN0cihjX3R5cGVfaWQodHlwLCAiIiksInNvYXBTcGFyc2VBcnJheSIpKQorICAgIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIAorICBmcHJpbnRmKGZtaGVhZGVyLCJcbm14QXJyYXkqIGNfdG9fbXhfJXMoJXMpO1xuIixjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgIiIpKTsKKyAgZnByaW50ZihmbWF0bGFiLCJcbm14QXJyYXkqIGNfdG9fbXhfJXMoJXMpXG4iLGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiYSIpKTsKKyAgdGFibGU9KFRhYmxlKil0eXAtPnJlZjsJCisgIGZwcmludGYoZm1hdGxhYiwie1xuXHRjb25zdCBjaGFyKiBmbmFtZXNbXSA9IHsiKTsgCisgIGZvciAodCA9IHRhYmxlOyB0ICE9IChUYWJsZSAqKSAwOyB0ID0gdC0+cHJldikgeyAKKyAgICBmb3IgKHAgPSB0LT5saXN0OyBwICE9IChFbnRyeSopIDA7IHAgPSBwLT5uZXh0KSB7CisgICAgICBpZiAocC0+aW5mby50eXAtPnR5cGUgIT0gVGZ1biAmJiAhaXNfdm9pZChwLT5pbmZvLnR5cCkgJiYgIWlzX1hNTChwLT5pbmZvLnR5cCkpCisJeworCSAgaWYobnVtYmVyX29mX2ZpZWxkcykKKwkgICAgZnByaW50ZihmbWF0bGFiLCIsXCIlc1wiIixwLT5zeW0tPm5hbWUpOworCSAgZWxzZSAKKwkgICAgZnByaW50ZihmbWF0bGFiLCJcIiVzXCIiLHAtPnN5bS0+bmFtZSk7CisJICBudW1iZXJfb2ZfZmllbGRzKys7CisJfQorICAgIH0KKyAgfQkKKyAgZnByaW50ZihmbWF0bGFiLCJ9OyAvKiBwb2ludGVycyB0byBmaWVsZCBuYW1lcyovXG4iKTsgCisgIAorICBmcHJpbnRmKGZtYXRsYWIsIlx0aW50IHJvd3MgPSAxLCBjb2xzID0gMTtcblx0aW50IGluZGV4ID0gMDtcblx0aW50IG51bWJlcl9vZl9maWVsZHMgPSAlZDtcblx0bXhBcnJheSAqc3RydWN0X2FycmF5X3B0cjtcbiIsbnVtYmVyX29mX2ZpZWxkcyk7CisgIGZwcmludGYoZm1hdGxhYiwiXHQvKiBDcmVhdGUgYSAxeDEgc3RydWN0IG1hdHJpeCBmb3Igb3V0cHV0ICAqL1xuIik7CisgIGZwcmludGYoZm1hdGxhYiwiXHRzdHJ1Y3RfYXJyYXlfcHRyID0gbXhDcmVhdGVTdHJ1Y3RNYXRyaXgocm93cywgY29scywgbnVtYmVyX29mX2ZpZWxkcywgZm5hbWVzKTtcblx0bWV4UHJpbnRmKFwiNlwiKTtcblx0aWYoc3RydWN0X2FycmF5X3B0ciA9PSBOVUxMKSB7XG5cdFx0bWV4UHJpbnRmKFwiQ09VTEROVCBDUkVBVEUgQSBNQVRSSVhcIik7fVxuXHRtZXhQcmludGYoXCI3XCIpO1xuIik7CisgIAorICAKKyAgZm9yICh0ID0gdGFibGU7IHQgIT0gKFRhYmxlICopIDA7IHQgPSB0LT5wcmV2KSB7IAorICAgIGZvciAocCA9IHQtPmxpc3Q7IHAgIT0gKEVudHJ5KikgMDsgcCA9IHAtPm5leHQpIHsKKyAgICAgIGlmIChwLT5pbmZvLnR5cC0+dHlwZSAhPSBUZnVuICYmICFpc192b2lkKHAtPmluZm8udHlwKSAmJiAhaXNfWE1MKHAtPmluZm8udHlwKSkKKwl7CisJICBmcHJpbnRmKGZtYXRsYWIsIlx0e214QXJyYXkgKmZvdXQgPSBjX3RvX214XyVzKGEuJXMpO1xuIixjX2lkZW50KHAtPmluZm8udHlwKSxwLT5zeW0tPm5hbWUpOworCSAgZnByaW50ZihmbWF0bGFiLCJcdG14U2V0RmllbGQoc3RydWN0X2FycmF5X3B0ciwgaW5kZXgsXCIlc1wiICwgZm91dCk7fVxuIixwLT5zeW0tPm5hbWUpOworCX0KKyAgICB9CisgIH0KKyAgZnByaW50ZihmbWF0bGFiLCJcdHJldHVybiBzdHJ1Y3RfYXJyYXlfcHRyO1xufVxuIik7CisgIHJldHVybjsKK30KKy8qCitjaGFyKgorbWF0bGFiX2NfdG9fbXgodHlwKQorVG5vZGUqIHR5cDsKK3sKKworICBzd2l0Y2godHlwLT50eXBlKQorICAgIHsKKyAgICBjYXNlIFRzdHJ1Y3Q6CisgICAgICBicmVhazsKKyAgICBjYXNlIFRhcnJheToKKyAgICAgIG1hdGxhYl9hcnJheV9jX3RvX214KHR5cCk7YnJlYWs7CisgICAgY2FzZSBUcG9pbnRlcjoKKyAgICAgIGZwcmludGYoZm1oZWFkZXIsIlxucG9pbnRlciBpbiBtYXRsYWJfY190b19teFxuIik7YnJlYWs7CisgICAgZGVmYXVsdDpicmVhazsKKyAgICB9CisgIAorICByZXR1cm4gTlVMTDsKK30KKyovCisKK3ZvaWQKK21hdGxhYl9jX3RvX214X3ByaW1pdGl2ZSh0eXApCitUbm9kZSAqdHlwOworeworICBmcHJpbnRmKGZtaGVhZGVyLCJcbm14QXJyYXkqIGNfdG9fbXhfJXMoJXMpOyIsY19pZGVudCh0eXApLGNfdHlwZV9pZCh0eXAsICIiKSk7CisgIGZwcmludGYoZm1hdGxhYiwiXG5teEFycmF5KiBjX3RvX214XyVzKCVzKVxuIixjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgImEiKSk7CisKKyAgZnByaW50ZihmbWF0bGFiLCJ7XG5cdG14QXJyYXkgICpmb3V0O1xuIik7CisgIGlmKCh0eXAtPnR5cGUgPT0gVGNoYXIpIHx8ICh0eXAtPnR5cGUgPT0gVHVjaGFyKSkKKyAgICB7CisgICAgICBmcHJpbnRmKGZtYXRsYWIsIlx0Y2hhciBidWZbMl07XG4iKTsKKyAgICAgIGZwcmludGYoZm1hdGxhYiwiXHRidWZbMF0gPSBhO1xuIik7CisgICAgICBmcHJpbnRmKGZtYXRsYWIsIlx0YnVmWzFdID0gXCdcXDBcJztcbiIpOworICAgICAgZnByaW50ZihmbWF0bGFiLCJcdGZvdXQgPSBteENyZWF0ZVN0cmluZyhidWYpO1xuIik7CisgICAgICBmcHJpbnRmKGZtYXRsYWIsIlx0aWYgKCFmb3V0KVxuIik7CisgICAgICBmcHJpbnRmKGZtYXRsYWIsIlx0XHRtZXhFcnJNc2dUeHQoXCJDb3VsZCBub3QgY3JlYXRlIG14QXJyYXkuXCIpO1xuIik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZnByaW50ZihmbWF0bGFiLCJcdGludCBuZGltID0gMSwgZGltc1sxXSA9IHsxfTtcbiIpOworICAgICAgZnByaW50ZihmbWF0bGFiLCJcdGZvdXQgPSBteENyZWF0ZU51bWVyaWNBcnJheShuZGltLCBkaW1zLCAlcywgbXhSRUFMKTtcbiIsZ2V0X214Q2xhc3NJRCh0eXApKTsKKyAgICAgIGZwcmludGYoZm1hdGxhYiwiXHQlcyA9ICglcylteEdldFByKGZvdXQpO1xuIixjX3R5cGVfaWQodHlwLCIqdGVtcCIpLGNfdHlwZV9pZCh0eXAsIioiKSk7CisgICAgICBmcHJpbnRmKGZtYXRsYWIsIlx0aWYgKCFmb3V0KVxuIik7CisgICAgICBmcHJpbnRmKGZtYXRsYWIsIlx0XHRtZXhFcnJNc2dUeHQoXCJDb3VsZCBub3QgY3JlYXRlIG14QXJyYXkuXCIpO1xuIik7CisgICAgICBmcHJpbnRmKGZtYXRsYWIsIlx0aWYgKCF0ZW1wKSBcbiIpOworICAgICAgZnByaW50ZihmbWF0bGFiLCJcdFx0bWV4RXJyTXNnVHh0KFwibWF0bGFiX2FycmF5X2NfdG9fbXg6IFBvaW50ZXIgdG8gZGF0YSBpcyBOVUxMXCIpO1xuIik7CisgICAgICBmcHJpbnRmKGZtYXRsYWIsIlx0KnRlbXArKz0gYTtcbiIpOworICAgIH0KKyAgZnByaW50ZihmbWF0bGFiLCJcdHJldHVybiBmb3V0O1xufVxuIik7Cit9CisKK3ZvaWQKK21hdGxhYl9teF90b19jX3ByaW1pdGl2ZSh0eXApCitUbm9kZSAqdHlwOworeworICBmcHJpbnRmKGZtaGVhZGVyLCAiXG52b2lkIG14X3RvX2NfJXMoY29uc3QgbXhBcnJheSAqLCAlcyk7XG4iLGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiKiIpKTsKKyAgZnByaW50ZihmbWF0bGFiLCAiXG52b2lkIG14X3RvX2NfJXMoY29uc3QgbXhBcnJheSAqYSwgJXMpXG4iLGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiKmIiKSk7CisgIGlmKCh0eXAtPnR5cGUgPT0gVGNoYXIpIHx8ICh0eXAtPnR5cGUgPT0gVHVjaGFyKSkKKyAgICB7CisgICAgICBmcHJpbnRmKGZtYXRsYWIsIntcblx0aW50IHJldDtcbiIpOworICAgICAgZnByaW50ZihmbWF0bGFiLCJcdGNoYXIgYnVmWzJdO1xuIik7CisgICAgICBmcHJpbnRmKGZtYXRsYWIsIlx0cmV0ID0gbXhHZXRTdHJpbmcoYSwgYnVmLCAyKTtcbiIpOworICAgICAgZnByaW50ZihmbWF0bGFiLCJcdG1leFByaW50ZihcInJldCA9ICUlZCwgYnVmID0gJSVzXCIsIHJldCwgYnVmKTtcbiIpOworICAgICAgZnByaW50ZihmbWF0bGFiLCJcdCpiID0gYnVmWzBdO1xuIik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZnByaW50ZihmbWF0bGFiLCJ7XG5cdGRvdWJsZSogZGF0YSA9IChkb3VibGUqKW14R2V0RGF0YShhKTtcbiIpOworICAgICAgZnByaW50ZihmbWF0bGFiLCJcdCpiID0gKCVzKSpkYXRhO1xuIixjX3R5cGUodHlwKSk7CisgICAgfQorICAgICAgZnByaW50ZihmbWF0bGFiLCJcbn1cbiIpOworfQorCit2b2lkCittYXRsYWJfb3V0X2dlbmVyYXRlKHR5cCkKK1Rub2RlICp0eXA7Cit7CisKKyAgaWYgKGlzX3RyYW5zaWVudCh0eXApIHx8IHR5cC0+dHlwZSA9PSBUd2NoYXIgfHwgaXNfWE1MKHR5cCkpCisgICAgcmV0dXJuOworCisgIC8qCisgIHR5cGVOTysrOworICBpZiAodHlwZU5PPj0xMDI0KQorICAgIGV4ZWNlcnJvcigiVG9vIG1hbnkgdXNlci1kZWZpbmVkIGRhdGEgdHlwZXMiKTsKKyAgICAqLworCisgIGlmKGlzX3ByaW1pdGl2ZSh0eXApKQorICAgIHsKKyAgICAgIG1hdGxhYl9jX3RvX214X3ByaW1pdGl2ZSh0eXApOworICAgICAgbWF0bGFiX214X3RvX2NfcHJpbWl0aXZlKHR5cCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHN3aXRjaCh0eXAtPnR5cGUpCisgICAgeworICAgIGNhc2UgVHN0cnVjdDoKKyAgICAgIG1hdGxhYl9jX3RvX214X3N0cnVjdCh0eXApOworICAgICAgbWF0bGFiX214X3RvX2Nfc3RydWN0KHR5cCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRwb2ludGVyOgorICAgICAgbWF0bGFiX2NfdG9fbXhfcG9pbnRlcih0eXApOworICAgICAgbWF0bGFiX214X3RvX2NfcG9pbnRlcih0eXApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUYXJyYXk6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OmJyZWFrOworICAgIH0KK30KKworLypoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZpcnN0IGl0IGZpcnN0IGdlbmVyYXRlcyBhbGwgcm91dGluZXMKKyAgYW5kIHRoZW4gaW4gdGhlIHNlY29uZCBwYXNzIGNhbGxzIGFsbCByb3V0aW5lcyB0byBnZW5lcmF0ZQorICBtYXRsYWJfb3V0IGZvciB0aGUgdGFibGUqLworCit2b2lkCitmdW5jMShUYWJsZSAqdGFibGUsIEVudHJ5ICpwYXJhbSkKK3sgCisKKyAgU2VydmljZSAqc3A7CisgIEVudHJ5ICpwaW4sKnEsKnBvdXQsKnJlc3BvbnNlPU5VTEw7CisgIFRub2RlICp0ZW1wOworICBUYWJsZSAqb3V0cHV0LCp0OworICBpbnQgY2FyZGluYWxpdHksIGVsZW1lbnRfd2lkdGgsIGksIGZsYWcgPSAwOworICBxPWVudHJ5KHRhYmxlLCBwYXJhbS0+c3ltKTsKKyAgaWYgKHEpCisgICAgcG91dCA9IChFbnRyeSopcS0+aW5mby50eXAtPnJlZjsKKyAgZWxzZQlmcHJpbnRmKHN0ZGVyciwgIkludGVybmFsIGVycm9yOiBubyB0YWJsZSBlbnRyeVxuIik7CisgIHE9ZW50cnkoY2xhc3N0YWJsZSwgcGFyYW0tPnN5bSk7CisgIG91dHB1dD0oVGFibGUqKSBxLT5pbmZvLnR5cC0+cmVmOworCisgIGlmICghaXNfcmVzcG9uc2UocG91dC0+aW5mby50eXApKQorICB7IHJlc3BvbnNlID0gZ2V0X3Jlc3BvbnNlKHBhcmFtLT5pbmZvLnR5cCk7CisgIH0KKyAgCisgIGZwcmludGYoZm1oZWFkZXIsIlxuXHRvdXRzaWRlIGxvb3Agc3RydWN0ICVzIHNvYXBfdG1wXyVzOyIscGFyYW0tPnN5bS0+bmFtZSxwYXJhbS0+c3ltLT5uYW1lKTsKKyAgaWYgKCFpc19yZXNwb25zZShwb3V0LT5pbmZvLnR5cCkgJiYgcmVzcG9uc2UpCisgIHsgZnByaW50ZihmbWhlYWRlciwiXG5cdGlmLi5pbnNpZGUgbG9vcCBzdHJ1Y3QgJXMgKnNvYXBfdG1wXyVzOyIsY19pZGVudChyZXNwb25zZS0+aW5mby50eXApLCBjX2lkZW50KHJlc3BvbnNlLT5pbmZvLnR5cCkpOworICB9IAorCisgIGZmbHVzaChmbWhlYWRlcik7Cit9CisKK3ZvaWQKK21hdGxhYl9kZWZfdGFibGUoVGFibGUgKnRhYmxlKQoreworICBFbnRyeSAqcTEsKnEsKnBvdXQsKmUsKnJlc3BvbnNlOworICBpbnQgaTsKKyAgVG5vZGUgKnA7CisgIGNoYXIgdGVtcFsxMDBdOworCisgIC8qICBmb3IgKHExID0gdGFibGUtPmxpc3Q7IHExICE9IChFbnRyeSopIDA7IHExID0gcTEtPm5leHQpCisgICAgaWYgKHExLT5pbmZvLnR5cC0+dHlwZT09VGZ1bikKKyAgICAgIGZ1bmMxKHRhYmxlLCBxMSk7CisgICovCisKKyAgLyogU3BhcnNlIG1hdHJpeCBjb2RlIHdpbGwgYmUgcHJlc2VudCBieSBkZWZhdWx0ICovCisgIG1hdGxhYl9nZW5fc3BhcnNlU3RydWN0KCk7CisgIG1hdGxhYl9jX3RvX214X3NwYXJzZSgpOworICBtYXRsYWJfbXhfdG9fY19zcGFyc2UoKTsgIAorCisgIGZvcihpPTA7aTxUWVBFUztpKyspCisgICAgZm9yKHA9VHB0cltpXTtwIT0oVG5vZGUqKSAwO3A9cC0+bmV4dCkKKyAgICAgIHsKKwkvKiBUaGlzIGlzIGdlbmVyYXRlZCBmb3IgZXZlcnl0aGluZyBkZWNsYXJlZCBpbiB0aGUgIi5oIiBmaWxlLiBUbyBtYWtlCisJICAgc3VyZSB0aGF0IGl0IGRvZXNudCBnZXQgZ2VuZXJhdGVkIGZvciBmdW5jdGlvbnMgZG8gYSBjb21wYXJpc29uIHdpdGgKKwkgICBwLT5zeW0tPm5hbWUsIHNvIHRoYXQgaXRzIG5vdCBnZW5lcmF0ZWQgZm9yIGZ1bmN0aW9ucy4KKwkqLworCWlmKGlzX1hNTChwKSkKKwkgIGNvbnRpbnVlOworCWlmKHN0cnN0cihjX2lkZW50KHApLCJTT0FQX0VOVl8iKSAhPSBOVUxMKQorCSAgY29udGludWU7CisJCisJZm9yKHEgPSB0YWJsZS0+bGlzdDsgcSAhPSAoRW50cnkqKSAwOyBxID0gcS0+bmV4dCkKKwkgIHsKKwkgICAgaWYoc3RyY21wKGNfaWRlbnQocCkscS0+c3ltLT5uYW1lKSA9PSAwKQorCSAgICAgIGJyZWFrOworCSAgICAKKworCSAgICBlPWVudHJ5KHRhYmxlLCBxLT5zeW0pOworCSAgICBpZiAoZSkKKwkgICAgICBwb3V0ID0gKEVudHJ5KillLT5pbmZvLnR5cC0+cmVmOworCSAgICBlbHNlCWZwcmludGYoc3RkZXJyLCAiSW50ZXJuYWwgZXJyb3I6IG5vIHRhYmxlIGVudHJ5XG4iKTsKKwkgICAgCisJICAgIGlmICghaXNfcmVzcG9uc2UocG91dC0+aW5mby50eXApKQorCSAgICB7IHJlc3BvbnNlID0gZ2V0X3Jlc3BvbnNlKHEtPmluZm8udHlwKTsKKwkgICAgfQorCSAgICBpZiAoIWlzX3Jlc3BvbnNlKHBvdXQtPmluZm8udHlwKSAmJiByZXNwb25zZSkKKwkgICAgeworCSAgICAgIGlmKHN0cmNtcChjX2lkZW50KHApLGNfaWRlbnQocmVzcG9uc2UtPmluZm8udHlwKSkgPT0gMCkKKwkJIGJyZWFrOworCSAgICB9CisJICB9CisKKwlpZihxID09IChFbnRyeSopIDApCisJICBtYXRsYWJfb3V0X2dlbmVyYXRlKHApOwkgIAorICAgICAgfQorfQorCit2b2lkCitkZWZfdGFibGUoVGFibGUgKnRhYmxlKQoreyBpbnQgaTsgIAorICBUbm9kZSAqcDsgCisgIGZvciAoaSA9IDA7IGkgPCBUWVBFUzsgaSsrKQorICAgIGZvciAocCA9IFRwdHJbaV07IHA7IHAgPSBwLT5uZXh0KQorICAgICAgb3V0X2dlbmVyYXRlKHApOworfQorCisgICAgICAgICAKK2ludCAKK25vX29mX3Zhcih0eXApCitUbm9kZSAqIHR5cDsKK3sKKyAgRW50cnkgKnA7CisgIFRhYmxlICp0OworICBpbnQgaT0wOworICBpZih0eXAtPnR5cGU9PVRzdHJ1Y3QgfHwgdHlwLT50eXBlPT1UY2xhc3MpCisgICAgeworICAgICAgdD10eXAtPnJlZjsKKyAgICAgIGZvciAocCA9IHQtPmxpc3Q7IHAgIT0gKEVudHJ5KikgMDsgcCA9IHAtPm5leHQpIHsKKwlpZihwLT5pbmZvLnR5cC0+dHlwZT09VHBvaW50ZXIpCisJICBpKys7CisgICAgICB9CisgICAgfQorICBpZigoKChUbm9kZSAqKSh0eXAtPnJlZikpLT50eXBlPT1Uc3RydWN0KSB8fAorICAgICAoKChUbm9kZSAqKSh0eXAtPnJlZikpLT50eXBlPT1UY2xhc3MpICkKKyAgICB7CisgICAgICB0PSgoVG5vZGUqKSh0eXAtPnJlZikpLT5yZWY7CisgICAgICBmb3IgKHAgPSB0LT5saXN0OyBwICE9IChFbnRyeSopIDA7IHAgPSBwLT5uZXh0KSB7CisJaWYocC0+aW5mby50eXAtPnR5cGU9PVRwb2ludGVyKQorCSAgaSsrOworICAgICAgfQorICAgIH0KKyAgcmV0dXJuIGk7Cit9ICAgICAgCisKK3ZvaWQKK2luX2RlZnMoVGFibGUgKnRhYmxlKQoreyBpbnQgaTsgIAorICBUbm9kZSAqcDsKKyAgZm9yIChpID0gMDsgaSA8IFRZUEVTOyBpKyspCisgIHsgZm9yIChwID0gVHB0cltpXTsgcDsgcCA9IHAtPm5leHQpCisgICAgeyBpZiAoIWlzX3RyYW5zaWVudChwKSAmJiBwLT50eXBlICE9IFR3Y2hhciAmJiBwLT50eXBlICE9IFRmdW4gJiYgcC0+dHlwZSAhPSBUcmVmZXJlbmNlICYmIHAtPnR5cGUgIT0gVHVuaW9uICYmICFpc19YTUwocCkgJiYgIWlzX2hlYWRlcl9vcl9mYXVsdChwKSAmJiAhaXNfYm9keShwKSAmJiAhaXNfdGVtcGxhdGUocCkpCisgICAgICB7IGNoYXIgKnMgPSB4c2lfdHlwZShwKTsKKyAgICAgICAgaWYgKCEqcykKKyAgICAgICAgICBzID0gd3NkbF90eXBlKHAsICIiKTsKKwlpZiAoKnMgPT0gJy0nKQorCSAgY29udGludWU7CisJaWYgKGlzX3N0cmluZyhwKSkKKyAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRjYXNlICVzOlxuXHR7XHRjaGFyICoqcztcblx0XHRzID0gc29hcF9pbl8lcyhzb2FwLCBOVUxMLCBOVUxMLCBcIiVzXCIpO1xuXHRcdHJldHVybiBzID8gKnMgOiBOVUxMO1xuXHR9Iiwgc29hcF90eXBlKHApLCBjX2lkZW50KHApLCBzKTsKKwllbHNlIGlmIChpc193c3RyaW5nKHApKQorICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdGNhc2UgJXM6XG5cdHtcdHdjaGFyX3QgKipzO1xuXHRcdHMgPSBzb2FwX2luXyVzKHNvYXAsIE5VTEwsIE5VTEwsIFwiJXNcIik7XG5cdFx0cmV0dXJuIHMgPyAqcyA6IE5VTEw7XG5cdH0iLCBzb2FwX3R5cGUocCksIGNfaWRlbnQocCksIHMpOworCWVsc2UKKyAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRjYXNlICVzOlxuXHRcdHJldHVybiBzb2FwX2luXyVzKHNvYXAsIE5VTEwsIE5VTEwsIFwiJXNcIik7Iiwgc29hcF90eXBlKHApLCBjX2lkZW50KHApLCBzKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZAoraW5fZGVmczIoVGFibGUgKnRhYmxlKQoreyBpbnQgaTsKKyAgVG5vZGUgKnA7CisgIGNoYXIgKnM7CisgIGZvciAoaSA9IDA7IGkgPCBUWVBFUzsgaSsrKQorICB7IGZvciAocCA9IFRwdHJbaV07IHA7IHAgPSBwLT5uZXh0KQorICAgIHsgaWYgKCFpc190cmFuc2llbnQocCkgJiYgIWlzX3RlbXBsYXRlKHApICYmIHAtPnR5cGUgIT0gVHdjaGFyICYmIHAtPnR5cGUgIT0gVGZ1biAmJiBwLT50eXBlICE9IFRwb2ludGVyICYmIHAtPnR5cGUgIT0gVHJlZmVyZW5jZSAmJiBwLT50eXBlICE9IFR1bmlvbiAmJiAhaXNfWE1MKHApICYmICFpc19oZWFkZXJfb3JfZmF1bHQocCkgJiYgIWlzX2JvZHkocCkgfHwgaXNfc3RyaW5nKHApICYmICFpc19YTUwocCkpCisgICAgICB7IHMgPSB4c2lfdHlwZShwKTsKKwlpZiAoISpzKQorCSAgcyA9IHdzZGxfdHlwZShwLCAiIik7CisJaWYgKCpzID09ICctJykKKwkgIGNvbnRpbnVlOworCWlmICgqcykKKwkgIGlmIChpc19keW5hbWljX2FycmF5KHApICYmICFpc19iaW5hcnkocCkgJiYgIWhhc19ucyhwKSAmJiAhaXNfdW50eXBlZChwKSkKKwkgICAgZnByaW50Zihmb3V0LCJcblx0XHRpZiAoKnNvYXAtPmFycmF5VHlwZSAmJiAhc29hcF9tYXRjaF9hcnJheShzb2FwLCBcIiVzXCIpKVxuXHRcdHtcdCp0eXBlID0gJXM7XG5cdFx0XHRyZXR1cm4gc29hcF9pbl8lcyhzb2FwLCBOVUxMLCBOVUxMLCBOVUxMKTtcblx0XHR9Iiwgcywgc29hcF90eXBlKHApLCBjX2lkZW50KHApKTsKKwkgIGVsc2UgaWYgKGlzX3N0cmluZyhwKSkKKwkgICAgZnByaW50Zihmb3V0LCJcblx0XHRpZiAoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHQsIFwiJXNcIikpXG5cdFx0e1x0Y2hhciAqKnM7XG5cdFx0XHQqdHlwZSA9ICVzO1xuXHRcdFx0cyA9IHNvYXBfaW5fJXMoc29hcCwgTlVMTCwgTlVMTCwgTlVMTCk7XG5cdFx0XHRyZXR1cm4gcyA/ICpzIDogTlVMTDtcblx0XHR9Iiwgcywgc29hcF90eXBlKHApLCBjX2lkZW50KHApKTsKKwkgIGVsc2UgaWYgKGlzX3dzdHJpbmcocCkpCisJICAgIGZwcmludGYoZm91dCwiXG5cdFx0aWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCB0LCBcIiVzXCIpKVxuXHRcdHtcdHdjaGFyX3QgKipzO1xuXHRcdFx0KnR5cGUgPSAlcztcblx0XHRcdHMgPSBzb2FwX2luXyVzKHNvYXAsIE5VTEwsIE5VTEwsIE5VTEwpO1xuXHRcdFx0cmV0dXJuIHMgPyAqcyA6IE5VTEw7XG5cdFx0fSIsIHMsIHNvYXBfdHlwZShwKSwgY19pZGVudChwKSk7CisgICAgICAgICAgZWxzZQorCSAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdGlmICghc29hcF9tYXRjaF90YWcoc29hcCwgdCwgXCIlc1wiKSlcblx0XHR7XHQqdHlwZSA9ICVzO1xuXHRcdFx0cmV0dXJuIHNvYXBfaW5fJXMoc29hcCwgTlVMTCwgTlVMTCwgTlVMTCk7XG5cdFx0fSIsIHMsIHNvYXBfdHlwZShwKSwgY19pZGVudChwKSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQKK291dF9kZWZzKFRhYmxlICp0YWJsZSkKK3sgaW50IGk7ICAKKyAgY2hhciAqczsKKyAgVG5vZGUgKnA7CisgIGZvciAoaSA9IDA7IGkgPCBUWVBFUzsgaSsrKQorICB7IGZvciAocCA9IFRwdHJbaV07IHA7IHAgPSBwLT5uZXh0KQorICAgIHsgaWYgKGlzX3RyYW5zaWVudChwKSB8fCBpc190ZW1wbGF0ZShwKSB8fCBpc19YTUwocCkgfHwgaXNfaGVhZGVyX29yX2ZhdWx0KHApIHx8IGlzX2JvZHkocCkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgaWYgKGlzX2VsZW1lbnQocCkpCisgICAgICB7IHMgPSB3c2RsX3R5cGUocCwgIiIpOworCWlmICgqcyA9PSAnLScpCisJICBjb250aW51ZTsKKyAgICAgICAgaWYgKHAtPnR5cGUgPT0gVGFycmF5KQorICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdGNhc2UgJXM6XG5cdFx0cmV0dXJuIHNvYXBfb3V0XyVzKHNvYXAsIFwiJXNcIiwgaWQsICglcylwdHIsIE5VTEwpOyIsIHNvYXBfdHlwZShwKSxjX2lkZW50KHApLHMsY190eXBlX2lkKHAtPnJlZiwgIigqKSIpKTsKKyAgICAgICAgZWxzZSBpZihwLT50eXBlID09IFRjbGFzcyAmJiAhaXNfZXh0ZXJuYWwocCkgJiYgIWlzX3ZvbGF0aWxlKHApICYmICFpc190eXBlZGVmKHApKQorICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdGNhc2UgJXM6XG5cdFx0cmV0dXJuICgoJXMpcHRyKS0+c29hcF9vdXQoc29hcCwgXCIlc1wiLCBpZCwgTlVMTCk7Iiwgc29hcF90eXBlKHApLCBjX3R5cGVfaWQocCwgIioiKSxzKTsKKyAgICAgICAgZWxzZSBpZiAoaXNfc3RyaW5nKHApKQorICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdGNhc2UgJXM6XG5cdFx0cmV0dXJuIHNvYXBfb3V0X3N0cmluZyhzb2FwLCBcIiVzXCIsIGlkLCAoY2hhcioqKSZwdHIsIE5VTEwpOyIsIHNvYXBfdHlwZShwKSxzKTsKKyAgICAgICAgZWxzZSBpZiAoaXNfd3N0cmluZyhwKSkKKyAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRjYXNlICVzOlxuXHRcdHJldHVybiBzb2FwX291dF93c3RyaW5nKHNvYXAsIFwiJXNcIiwgaWQsICh3Y2hhcl90KiopJnB0ciwgTlVMTCk7Iiwgc29hcF90eXBlKHApLHMpOworICAgICAgICBlbHNlIGlmIChwLT50eXBlID09IFRwb2ludGVyKQorICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdGNhc2UgJXM6XG5cdFx0cmV0dXJuIHNvYXBfb3V0XyVzKHNvYXAsIFwiJXNcIiwgaWQsICglcylwdHIsIE5VTEwpOyIsIHNvYXBfdHlwZShwKSxjX2lkZW50KHApLHMsY190eXBlX2lkKHAsICJjb25zdCoiKSk7CisgICAgICAgIGVsc2UgaWYocC0+dHlwZSAhPSBUbm9uZSAmJiBwLT50eXBlICE9IFR0ZW1wbGF0ZSAmJiBwLT50eXBlICE9IFR3Y2hhciAmJiAhaXNfdm9pZChwKSAmJiBwLT50eXBlICE9IFRmdW4gJiYgcC0+dHlwZSAhPSBUcmVmZXJlbmNlICYmIHAtPnR5cGUgIT0gVHVuaW9uKQorICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdGNhc2UgJXM6XG5cdFx0cmV0dXJuIHNvYXBfb3V0XyVzKHNvYXAsIFwiJXNcIiwgaWQsIChjb25zdCAlcylwdHIsIE5VTEwpOyIsIHNvYXBfdHlwZShwKSxjX2lkZW50KHApLHMsY190eXBlX2lkKHAsICIqIikpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBzID0geHNpX3R5cGUocCk7CisgICAgICAgIGlmICghKnMpCisgICAgICAgICAgcyA9IHdzZGxfdHlwZShwLCAiIik7CisgICAgICAgIGlmICgqcyA9PSAnLScpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChwLT50eXBlID09IFRhcnJheSkKKyAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRjYXNlICVzOlxuXHRcdHJldHVybiBzb2FwX291dF8lcyhzb2FwLCB0YWcsIGlkLCAoJXMpcHRyLCBcIiVzXCIpOyIsIHNvYXBfdHlwZShwKSwgY19pZGVudChwKSxjX3R5cGVfaWQocC0+cmVmLCAiKCopIiksIHMpOworICAgICAgICBlbHNlIGlmKHAtPnR5cGUgPT0gVGNsYXNzICYmICFpc19leHRlcm5hbChwKSAmJiAhaXNfdm9sYXRpbGUocCkgJiYgIWlzX3R5cGVkZWYocCkpCisgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0Y2FzZSAlczpcblx0XHRyZXR1cm4gKCglcylwdHIpLT5zb2FwX291dChzb2FwLCB0YWcsIGlkLCBcIiVzXCIpOyIsIHNvYXBfdHlwZShwKSwgY190eXBlX2lkKHAsICIqIiksIHMpOworICAgICAgICBlbHNlIGlmIChpc19zdHJpbmcocCkpCisgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0Y2FzZSAlczpcblx0XHRyZXR1cm4gc29hcF9vdXRfc3RyaW5nKHNvYXAsIHRhZywgaWQsIChjaGFyKiopJnB0ciwgXCIlc1wiKTsiLCBzb2FwX3R5cGUocCksIHMpOworICAgICAgICBlbHNlIGlmIChpc193c3RyaW5nKHApKQorICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdGNhc2UgJXM6XG5cdFx0cmV0dXJuIHNvYXBfb3V0X3dzdHJpbmcoc29hcCwgdGFnLCBpZCwgKHdjaGFyX3QqKikmcHRyLCBcIiVzXCIpOyIsIHNvYXBfdHlwZShwKSwgcyk7CisgICAgICAgIGVsc2UgaWYgKHAtPnR5cGUgPT0gVHBvaW50ZXIpCisgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0Y2FzZSAlczpcblx0XHRyZXR1cm4gc29hcF9vdXRfJXMoc29hcCwgdGFnLCBpZCwgKCVzKXB0ciwgXCIlc1wiKTsiLCBzb2FwX3R5cGUocCksIGNfaWRlbnQocCksY190eXBlX2lkKHAsICJjb25zdCoiKSwgcyk7CisgICAgICAgIGVsc2UgaWYocC0+dHlwZSAhPSBUbm9uZSAmJiBwLT50eXBlICE9IFR0ZW1wbGF0ZSAmJiBwLT50eXBlICE9IFR3Y2hhciAmJiAhaXNfdm9pZChwKSAmJiBwLT50eXBlICE9IFRmdW4gJiYgcC0+dHlwZSAhPSBUcmVmZXJlbmNlICYmIHAtPnR5cGUgIT0gVHVuaW9uKQorICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdGNhc2UgJXM6XG5cdFx0cmV0dXJuIHNvYXBfb3V0XyVzKHNvYXAsIHRhZywgaWQsIChjb25zdCAlcylwdHIsIFwiJXNcIik7Iiwgc29hcF90eXBlKHApLCBjX2lkZW50KHApLGNfdHlwZV9pZChwLCAiKiIpLCBzKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZAorbWFya19kZWZzKFRhYmxlICp0YWJsZSkKK3sgaW50IGk7ICAKKyAgVG5vZGUgKnA7CisgIGZvciAoaSA9IDA7IGkgPCBUWVBFUzsgaSsrKQorICB7IGZvciAocCA9IFRwdHJbaV07IHA7IHAgPSBwLT5uZXh0KQorICAgIHsgaWYgKGlzX3RyYW5zaWVudChwKSB8fCBpc190ZW1wbGF0ZShwKSB8fCBpc19YTUwocCkgfHwgaXNfaGVhZGVyX29yX2ZhdWx0KHApIHx8IGlzX2JvZHkocCkgfHwgaXNfdm9pZChwKSkKKyAgICAgICAgY29udGludWU7CisgICAgICBpZiAocC0+dHlwZSA9PSBUYXJyYXkpCisgICAgICAgIGZwcmludGYoZm91dCwiXG5cdGNhc2UgJXM6XG5cdFx0c29hcF9zZXJpYWxpemVfJXMoc29hcCwgKCVzKXB0cik7XG5cdFx0YnJlYWs7Iiwgc29hcF90eXBlKHApLCBjX2lkZW50KHApLGNfdHlwZV9pZChwLT5yZWYsICIoKikiKSk7CisgICAgICBlbHNlIGlmKHAtPnR5cGUgPT0gVGNsYXNzICYmICFpc19leHRlcm5hbChwKSAmJiAhaXNfdm9sYXRpbGUocCkgJiYgIWlzX3R5cGVkZWYocCkpCisgICAgICAgIGZwcmludGYoZm91dCwiXG5cdGNhc2UgJXM6XG5cdFx0KCglcylwdHIpLT5zb2FwX3NlcmlhbGl6ZShzb2FwKTtcblx0XHRicmVhazsiLCBzb2FwX3R5cGUocCksIGNfdHlwZV9pZChwLCAiKiIpKTsKKyAgICAgIGVsc2UgaWYgKGlzX3N0cmluZyhwKSkKKyAgICAgICAgZnByaW50Zihmb3V0LCJcblx0Y2FzZSAlczpcblx0XHRzb2FwX3NlcmlhbGl6ZV9zdHJpbmcoc29hcCwgKGNoYXIqKikmcHRyKTtcblx0XHRicmVhazsiLCBzb2FwX3R5cGUocCkpOworICAgICAgZWxzZSBpZiAoaXNfd3N0cmluZyhwKSkKKyAgICAgICAgZnByaW50Zihmb3V0LCJcblx0Y2FzZSAlczpcblx0XHRzb2FwX3NlcmlhbGl6ZV93c3RyaW5nKHNvYXAsICh3Y2hhcl90KiopJnB0cik7XG5cdFx0YnJlYWs7Iiwgc29hcF90eXBlKHApKTsKKyAgICAgIGVsc2UgaWYgKHAtPnR5cGUgPT0gVHBvaW50ZXIpCisgICAgICAgIGZwcmludGYoZm91dCwiXG5cdGNhc2UgJXM6XG5cdFx0c29hcF9zZXJpYWxpemVfJXMoc29hcCwgKCVzKXB0cik7XG5cdFx0YnJlYWs7Iiwgc29hcF90eXBlKHApLCBjX2lkZW50KHApLGNfdHlwZV9pZChwLCAiY29uc3QqIikpOworICAgICAgZWxzZSBpZihwLT50eXBlID09IFR0ZW1wbGF0ZSAmJiBwLT5yZWYpCisgICAgICAgIGZwcmludGYoZm91dCwiXG5cdGNhc2UgJXM6XG5cdFx0c29hcF9zZXJpYWxpemVfJXMoc29hcCwgKGNvbnN0ICVzKXB0cik7XG5cdFx0YnJlYWs7Iiwgc29hcF90eXBlKHApLCBjX2lkZW50KHApLGNfdHlwZV9pZChwLCAiKiIpKTsKKyAgICAgIGVsc2UgaWYoIWlzX3ByaW1pdGl2ZShwKSAmJiBwLT50eXBlICE9IFRub25lICYmIHAtPnR5cGUgIT0gVHRlbXBsYXRlICYmICFpc192b2lkKHApICYmIHAtPnR5cGUgIT0gVGZ1biAmJiBwLT50eXBlICE9IFRyZWZlcmVuY2UgJiYgcC0+dHlwZSAhPSBUdW5pb24pCisgICAgICAgIGZwcmludGYoZm91dCwiXG5cdGNhc2UgJXM6XG5cdFx0c29hcF9zZXJpYWxpemVfJXMoc29hcCwgKGNvbnN0ICVzKXB0cik7XG5cdFx0YnJlYWs7Iiwgc29hcF90eXBlKHApLCBjX2lkZW50KHApLGNfdHlwZV9pZChwLCAiKiIpKTsKKyAgICB9CisgIH0KK30KKwordm9pZAoraW5fYXR0YWNoKFRhYmxlICp0YWJsZSkKK3sgaW50IGk7ICAKKyAgVG5vZGUgKnA7CisgIGZvciAoaSA9IDA7IGkgPCBUWVBFUzsgaSsrKQorICAgIGZvciAocCA9IFRwdHJbaV07IHA7IHAgPSBwLT5uZXh0KQorICAgICAgaWYgKGlzX2F0dGFjaG1lbnQocCkpCisgICAgICAgIGlmIChwLT50eXBlID09IFRjbGFzcykKKwkgIGZwcmludGYoZm91dCwiXG5cdFx0Y2FzZSAlczpcblx0XHR7XHQlcyBhO1xuXHRcdFx0YSA9ICglcylzb2FwX2NsYXNzX2lkX2VudGVyKHNvYXAsIHNvYXAtPmRpbWUuaWQsIE5VTEwsICVzLCBzaXplb2YoJXMpLCBOVUxMLCBOVUxMKTtcblx0XHRcdGlmIChhKVxuXHRcdFx0e1x0YS0+X19wdHIgPSAodW5zaWduZWQgY2hhciopc29hcC0+ZGltZS5wdHI7XG5cdFx0XHRcdGEtPl9fc2l6ZSA9IHNvYXAtPmRpbWUuc2l6ZTtcblx0XHRcdFx0YS0+aWQgPSAoY2hhciopc29hcC0+ZGltZS5pZDtcblx0XHRcdFx0YS0+dHlwZSA9IChjaGFyKilzb2FwLT5kaW1lLnR5cGU7XG5cdFx0XHRcdGEtPm9wdGlvbnMgPSAoY2hhciopc29hcC0+ZGltZS5vcHRpb25zO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRyZXR1cm4gc29hcC0+ZXJyb3I7XG5cdFx0XHRicmVhaztcblx0XHR9Iiwgc29hcF90eXBlKHApLCBjX3R5cGVfaWQocCwgIioiKSwgY190eXBlX2lkKHAsICIqIiksIHNvYXBfdHlwZShwKSwgY190eXBlKHApKTsKKwllbHNlCisJICBmcHJpbnRmKGZvdXQsIlxuXHRcdGNhc2UgJXM6XG5cdFx0e1x0JXMgYTtcblx0XHRcdGEgPSAoJXMpc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5kaW1lLmlkLCBOVUxMLCAlcywgc2l6ZW9mKCVzKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7XG5cdFx0XHRpZiAoIWEpXG5cdFx0XHRcdHJldHVybiBzb2FwLT5lcnJvcjtcblx0XHRcdGEtPl9fcHRyID0gKHVuc2lnbmVkIGNoYXIqKXNvYXAtPmRpbWUucHRyO1xuXHRcdFx0YS0+X19zaXplID0gc29hcC0+ZGltZS5zaXplO1xuXHRcdFx0YS0+aWQgPSAoY2hhciopc29hcC0+ZGltZS5pZDtcblx0XHRcdGEtPnR5cGUgPSAoY2hhciopc29hcC0+ZGltZS50eXBlO1xuXHRcdFx0YS0+b3B0aW9ucyA9IChjaGFyKilzb2FwLT5kaW1lLm9wdGlvbnM7XG5cdFx0XHRicmVhaztcblx0XHR9Iiwgc29hcF90eXBlKHApLCBjX3R5cGVfaWQocCwgIioiKSwgY190eXBlX2lkKHAsICIqIiksIHNvYXBfdHlwZShwKSwgY190eXBlKHApKTsKKyAgICAgIGVsc2UgaWYgKGlzX2JpbmFyeShwKSAmJiAhaXNfdHJhbnNpZW50KHApKQorICAgICAgICBpZiAocC0+dHlwZSA9PSBUY2xhc3MpCisJICBmcHJpbnRmKGZvdXQsIlxuXHRcdGNhc2UgJXM6XG5cdFx0e1x0JXMgYTtcblx0XHRcdGEgPSAoJXMpc29hcF9jbGFzc19pZF9lbnRlcihzb2FwLCBzb2FwLT5kaW1lLmlkLCBOVUxMLCAlcywgc2l6ZW9mKCVzKSwgTlVMTCwgTlVMTCk7XG5cdFx0XHRpZiAoIWEpXG5cdFx0XHRcdHJldHVybiBzb2FwLT5lcnJvcjtcblx0XHRcdGEtPl9fcHRyID0gKHVuc2lnbmVkIGNoYXIqKXNvYXAtPmRpbWUucHRyO1xuXHRcdFx0YS0+X19zaXplID0gc29hcC0+ZGltZS5zaXplO1xuXHRcdFx0YnJlYWs7XG5cdFx0fSIsIHNvYXBfdHlwZShwKSwgY190eXBlX2lkKHAsICIqIiksIGNfdHlwZV9pZChwLCAiKiIpLCBzb2FwX3R5cGUocCksIGNfdHlwZShwKSk7CisJZWxzZQorCSAgZnByaW50Zihmb3V0LCJcblx0XHRjYXNlICVzOlxuXHRcdHtcdCVzIGE7XG5cdFx0XHRhID0gKCVzKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+ZGltZS5pZCwgTlVMTCwgJXMsIHNpemVvZiglcyksIDAsIE5VTEwsIE5VTEwsIE5VTEwpO1xuXHRcdFx0aWYgKCFhKVxuXHRcdFx0XHRyZXR1cm4gc29hcC0+ZXJyb3I7XG5cdFx0XHRhLT5fX3B0ciA9ICh1bnNpZ25lZCBjaGFyKilzb2FwLT5kaW1lLnB0cjtcblx0XHRcdGEtPl9fc2l6ZSA9IHNvYXAtPmRpbWUuc2l6ZTtcblx0XHRcdGJyZWFrO1xuXHRcdH0iLCBzb2FwX3R5cGUocCksIGNfdHlwZV9pZChwLCAiKiIpLCBjX3R5cGVfaWQocCwgIioiKSwgc29hcF90eXBlKHApLCBjX3R5cGUocCkpOworfQorCit2b2lkCitzb2FwX2luc3RhbnRpYXRlX2NsYXNzKFRub2RlICp0eXApCit7IFRhYmxlICpUcHRyOworICBFbnRyeSAqRXB0cjsKKyAgaW50IGRlcmNsYXNzID0gMDsKKyAgY2hhciAqczsKKyAgCisgIGlmIChjZmxhZykKKyAgICByZXR1cm47CisKKyAgZnByaW50ZihmaGVhZCwiXG5TT0FQX0ZNQUM1ICVzICogU09BUF9GTUFDNiBzb2FwX25ld18lcyhzdHJ1Y3Qgc29hcCosIGludCk7IiwgY190eXBlKHR5cCksIGNfaWRlbnQodHlwKSk7CisgIGZwcmludGYoZm91dCwiXG5cblNPQVBfRk1BQzUgJXMgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3XyVzKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgbilcbntcdHJldHVybiBzb2FwX2luc3RhbnRpYXRlXyVzKHNvYXAsIG4sIE5VTEwsIE5VTEwsIE5VTEwpO1xufSIsIGNfdHlwZSh0eXApLCBjX2lkZW50KHR5cCksIGNfaWRlbnQodHlwKSk7CisgIGZwcmludGYoZmhlYWQsIlxuU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfJXMoc3RydWN0IHNvYXAqLCAlcyopOyIsIGNfaWRlbnQodHlwKSwgY190eXBlKHR5cCkpOworICBmcHJpbnRmKGZoZWFkLCJcblNPQVBfRk1BQzMgJXMgKiBTT0FQX0ZNQUM0IHNvYXBfaW5zdGFudGlhdGVfJXMoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7IiwgY190eXBlKHR5cCksIGNfaWRlbnQodHlwKSk7CisKKyAgZnByaW50Zihmb3V0LCJcblxuU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfJXMoc3RydWN0IHNvYXAgKnNvYXAsICVzKVxue1x0c29hcF9kZWxldGUoc29hcCwgcCk7XG59IiwgY19pZGVudCh0eXApLCBjX3R5cGVfaWQodHlwLCAiKnAiKSk7CisgIGZwcmludGYoZm91dCwiXG5cblNPQVBfRk1BQzMgJXMgKiBTT0FQX0ZNQUM0IHNvYXBfaW5zdGFudGlhdGVfJXMoc3RydWN0IHNvYXAgKnNvYXAsIGludCBuLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICphcnJheVR5cGUsIHNpemVfdCAqc2l6ZSkiLCBjX3R5cGUodHlwKSwgY19pZGVudCh0eXApKTsKKyAgZnByaW50Zihmb3V0LCJcbnsiKTsKKyAgZnByaW50Zihmb3V0LCAiXG5cdERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCBcInNvYXBfaW5zdGFudGlhdGVfJXMoJSVkLCAlJXMsICUlcylcXG5cIiwgbiwgdHlwZT90eXBlOlwiXCIsIGFycmF5VHlwZT9hcnJheVR5cGU6XCJcIikpOyIsIGNfaWRlbnQodHlwKSk7CisKKyAgZnByaW50Zihmb3V0LCJcblx0c3RydWN0IHNvYXBfY2xpc3QgKmNwID0gc29hcF9saW5rKHNvYXAsIE5VTEwsICVzLCBuLCBzb2FwX2ZkZWxldGUpOyIsIHNvYXBfdHlwZSh0eXApKTsKKyAgZnByaW50Zihmb3V0LCJcblx0aWYgKCFjcClcblx0XHRyZXR1cm4gTlVMTDsiKTsKKyAgZm9yIChFcHRyID0gY2xhc3N0YWJsZS0+bGlzdDsgRXB0cjsgRXB0ciA9IEVwdHItPm5leHQpCisgIHsKKyAgICBUcHRyID0gKChUYWJsZSAqKSBFcHRyLT5pbmZvLnR5cC0+cmVmKTsKKyAgICBpZihUcHRyID09ICgoVGFibGUgKikgdHlwLT5yZWYpKXsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAKKyAgICBkZXJjbGFzcyA9IDA7CisgICAgd2hpbGUoVHB0cikKKyAgICB7CisgICAgICBpZihUcHRyID09IHR5cC0+cmVmKXsKKwlkZXJjbGFzcyA9IDE7CisgICAgICB9CisKKyAgICAgIFRwdHIgPSBUcHRyLT5wcmV2OworICAgIH0KKworICAgIGlmKGRlcmNsYXNzID09IDEgJiYgIWlzX3RyYW5zaWVudChFcHRyLT5pbmZvLnR5cCkpeworICAgICAgaWYgKGlzX2R5bmFtaWNfYXJyYXkoRXB0ci0+aW5mby50eXApICYmICFpc19iaW5hcnkoRXB0ci0+aW5mby50eXApICYmICFoYXNfbnMoRXB0ci0+aW5mby50eXApICYmICFpc191bnR5cGVkKEVwdHItPmluZm8udHlwKSkKKyAgICAgICAgZnByaW50Zihmb3V0LCJcblx0aWYgKGFycmF5VHlwZSAmJiAhc29hcF9tYXRjaF90YWcoc29hcCwgYXJyYXlUeXBlLCBcIiVzXCIpKSIsIHhzaV90eXBlKEVwdHItPmluZm8udHlwKSk7CisgICAgICBlbHNlCisgICAgICAgIGZwcmludGYoZm91dCwiXG5cdGlmICh0eXBlICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0eXBlLCBcIiVzXCIpKSIsIHRoZV90eXBlKEVwdHItPmluZm8udHlwKSk7CisgICAgICBmcHJpbnRmKGZvdXQsIlxuXHR7XHRjcC0+dHlwZSA9ICVzOyIsIHNvYXBfdHlwZShFcHRyLT5pbmZvLnR5cCkpOworICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRpZiAobiA8IDApIik7CisgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdHtcdGNwLT5wdHIgPSAodm9pZCopbmV3ICVzOyIsIGNfdHlwZShFcHRyLT5pbmZvLnR5cCkpOworICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdGlmIChzaXplKVxuXHRcdFx0XHQqc2l6ZSA9IHNpemVvZiglcyk7IiwgY190eXBlKEVwdHItPmluZm8udHlwKSk7CisgICAgICBpZiAoKHMgPSBoYXNfc29hcHJlZihFcHRyLT5pbmZvLnR5cCkpKQorICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0KCglcyopY3AtPnB0ciktPiVzID0gc29hcDsiLCBjX3R5cGUoRXB0ci0+aW5mby50eXApLCBzKTsKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0fVxuXHRcdGVsc2UiKTsKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0e1x0Y3AtPnB0ciA9ICh2b2lkKiluZXcgJXNbbl07IiwgY190eXBlKEVwdHItPmluZm8udHlwKSk7CisgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0aWYgKHNpemUpXG5cdFx0XHRcdCpzaXplID0gbiAqIHNpemVvZiglcyk7IiwgY190eXBlKEVwdHItPmluZm8udHlwKSk7CisgICAgICBpZiAocykKKyAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKVxuXHRcdFx0XHQoKCVzKiljcC0+cHRyKVtpXS4lcyA9IHNvYXA7IiwgY190eXBlKEVwdHItPmluZm8udHlwKSwgcyk7CisgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdH0iKTsKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCBcIkluc3RhbnRpYXRlZCBsb2NhdGlvbj0lJXBcXG5cIiwgY3AtPnB0cikpOyIpOworICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRyZXR1cm4gKCVzKiljcC0+cHRyOyIsIGNfdHlwZShFcHRyLT5pbmZvLnR5cCkpOworICAgICAgZnByaW50Zihmb3V0LCJcblx0fSIpOworCisgICAgICBkZXJjbGFzcyA9IDA7CisgICAgfQorICB9CisKKyAgZnByaW50Zihmb3V0LCJcblx0aWYgKG4gPCAwKSIpOworICBmcHJpbnRmKGZvdXQsIlxuXHR7XHRjcC0+cHRyID0gKHZvaWQqKW5ldyAlczsiLCBjX3R5cGUodHlwKSk7CisgIGZwcmludGYoZm91dCwiXG5cdFx0aWYgKHNpemUpXG5cdFx0XHQqc2l6ZSA9IHNpemVvZiglcyk7IiwgY190eXBlKHR5cCkpOworICBpZiAoKHMgPSBoYXNfc29hcHJlZih0eXApKSkKKyAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdCgoJXMqKWNwLT5wdHIpLT4lcyA9IHNvYXA7IiwgY190eXBlKHR5cCksIHMpOworICBmcHJpbnRmKGZvdXQsIlxuXHR9XG5cdGVsc2UiKTsKKyAgZnByaW50Zihmb3V0LCJcblx0e1x0Y3AtPnB0ciA9ICh2b2lkKiluZXcgJXNbbl07IiwgY190eXBlKHR5cCkpOworICBmcHJpbnRmKGZvdXQsIlxuXHRcdGlmIChzaXplKVxuXHRcdFx0KnNpemUgPSBuICogc2l6ZW9mKCVzKTsiLCBjX3R5cGUodHlwKSk7CisgIGlmIChzKQorICAgIGZwcmludGYoZm91dCwiXG5cdFx0Zm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspXG5cdFx0XHQoKCVzKiljcC0+cHRyKVtpXS4lcyA9IHNvYXA7IiwgY190eXBlKHR5cCksIHMpOworICBmcHJpbnRmKGZvdXQsIlxuXHR9Iik7CisgIGZwcmludGYoZm91dCwiXG5cdFx0REJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsIFwiSW5zdGFudGlhdGVkIGxvY2F0aW9uPSUlcFxcblwiLCBjcC0+cHRyKSk7Iik7CisgIGZwcmludGYoZm91dCwiXG5cdHJldHVybiAoJXMqKWNwLT5wdHI7IiwgY190eXBlKHR5cCkpOworICAKKyAgZnByaW50Zihmb3V0LCJcbn0iKTsKKworICBmcHJpbnRmKGZoZWFkLCJcblNPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfY29weV8lcyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgc2l6ZV90LCBjb25zdCB2b2lkKiwgc2l6ZV90KTsiLCBjX2lkZW50KHR5cCkpOworICBmcHJpbnRmKGZvdXQsIlxuXG5TT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2NvcHlfJXMoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdCwgaW50IHR0LCB2b2lkICpwLCBzaXplX3QgbGVuLCBjb25zdCB2b2lkICpxLCBzaXplX3QgbikiLCBjX2lkZW50KHR5cCkpOworICBmcHJpbnRmKGZvdXQsIlxueyIpOworICBmcHJpbnRmKGZvdXQsIlxuXHREQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgXCJDb3B5aW5nICVzICUlcCAtPiAlJXBcXG5cIiwgcSwgcCkpOyIsIGNfdHlwZSh0eXApKTsKKyAgZnByaW50Zihmb3V0LCJcblx0KiglcyopcCA9ICooJXMqKXE7XG59IiwgY190eXBlKHR5cCksIGNfdHlwZSh0eXApKTsKK30KKworaW50CitnZXRfZGltZW5zaW9uKFRub2RlICp0eXApCit7IGlmICgoKFRub2RlKil0eXAtPnJlZiktPndpZHRoKQorICAgIHJldHVybiB0eXAtPndpZHRoIC8gKChUbm9kZSopIHR5cC0+cmVmKS0+d2lkdGg7CisgIHJldHVybiAwOworfQorCisKK3ZvaWQKK21hcmsoVG5vZGUgKnR5cCkKK3sgaW50IGQ7CisgIFRhYmxlICp0YWJsZSwqdDsKKyAgRW50cnkgKnA7CisgIFRub2RlKiB0ZW1wOworICBpbnQgY2FyZGluYWxpdHk7CisKKyAgaWYgKGlzX3ByaW1pdGl2ZSh0eXApKQorICAgIHJldHVybjsKKworICBpZiAoaXNfdHlwZWRlZih0eXApKQorICB7IGZwcmludGYoZmhlYWQsIlxuU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfJXMoc3RydWN0IHNvYXAqLCAlcyk7IixjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgImNvbnN0KiIpKTsgCisgICAgaWYgKHR5cC0+dHlwZSA9PSBUY2xhc3MgJiYgIWlzX3N0ZHN0cmluZyh0eXApICYmICFpc19zdGR3c3RyaW5nKHR5cCkgJiYgIWlzX3ZvbGF0aWxlKHR5cCkpCisgICAgICBmcHJpbnRmKGZvdXQsIlxuXG5TT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV8lcyhzdHJ1Y3Qgc29hcCAqc29hcCwgJXMpXG57XHRhLT5zb2FwX3NlcmlhbGl6ZShzb2FwKTtcbn0iLGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiY29uc3QqYSIpKTsgCisgICAgZWxzZQorICAgICAgZnByaW50Zihmb3V0LCJcblxuU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfJXMoc3RydWN0IHNvYXAgKnNvYXAsICVzKVxue1x0c29hcF9zZXJpYWxpemVfJXMoc29hcCwgYSk7XG59IixjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgImNvbnN0KmEiKSx0X2lkZW50KHR5cCkpOyAKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoKHAgPSBpc19keW5hbWljX2FycmF5KHR5cCkpKQorICB7IGlmICh0eXAtPnR5cGUgPT0gVGNsYXNzICYmICFpc192b2xhdGlsZSh0eXApKQorICAgIHsgaWYgKGlzX2V4dGVybmFsKHR5cCkpCisgICAgICAgICAgcmV0dXJuOworICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXG52b2lkICVzOjpzb2FwX3NlcmlhbGl6ZShzdHJ1Y3Qgc29hcCAqc29hcCkgY29uc3RcbnsiLGNfaWRlbnQodHlwKSk7CisgICAgICAgIGlmIChpc19iaW5hcnkodHlwKSkKKwl7IGlmIChpc19hdHRhY2htZW50KHR5cCkpCisgICAgICAgICAgeyBmcHJpbnRmKGZvdXQsIlxuXHRpZiAodGhpcy0+X19wdHIgJiYgIXNvYXBfYXJyYXlfcmVmZXJlbmNlKHNvYXAsIHRoaXMsIChzdHJ1Y3Qgc29hcF9hcnJheSopJnRoaXMtPl9fcHRyLCAxLCAlcykpIiwgc29hcF90eXBlKHR5cCkpOworICAgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRpZiAodGhpcy0+aWQgfHwgdGhpcy0+dHlwZSlcblx0XHRcdHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfRElNRTtcbn0iKTsKKwkgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRpZiAodGhpcy0+X19wdHIpXG5cdFx0c29hcF9hcnJheV9yZWZlcmVuY2Uoc29hcCwgdGhpcywgKHN0cnVjdCBzb2FwX2FycmF5KikmdGhpcy0+JXMsIDEsICVzKTtcbn0iLCBwLT5zeW0tPm5hbWUsIHNvYXBfdHlwZSh0eXApKTsKKyAgICAgIGZmbHVzaChmb3V0KTsKKyAgICAgIHJldHVybjsKKwl9CisJZWxzZQorCXsKKyAgICAgIGlmIChpc19YTUwocC0+aW5mby50eXAtPnJlZikpCisgICAgICB7IGZwcmludGYoZm91dCwiXG59Iik7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGQgPSBnZXRfRGFycmF5ZGltcyh0eXApOworICAgICAgaWYgKGQpCisgICAgICB7IGZwcmludGYoZm91dCwiXG5cdGlmICh0aGlzLT4lcyAmJiAhc29hcF9hcnJheV9yZWZlcmVuY2Uoc29hcCwgdGhpcywgKHN0cnVjdCBzb2FwX2FycmF5KikmdGhpcy0+JXMsICVkLCAlcykpIiwgcC0+c3ltLT5uYW1lLCBwLT5zeW0tPm5hbWUsIGQsIHNvYXBfdHlwZSh0eXApKTsKKyAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRmb3IgKGludCBpID0gMDsgaSA8IHNvYXBfc2l6ZSh0aGlzLT5fX3NpemUsICVkKTsgaSsrKSIsIGQpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBmcHJpbnRmKGZvdXQsIlxuXHRpZiAodGhpcy0+JXMgJiYgIXNvYXBfYXJyYXlfcmVmZXJlbmNlKHNvYXAsIHRoaXMsIChzdHJ1Y3Qgc29hcF9hcnJheSopJnRoaXMtPiVzLCAxLCAlcykpIiwgcC0+c3ltLT5uYW1lLCBwLT5zeW0tPm5hbWUsIHNvYXBfdHlwZSh0eXApKTsKKyAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPl9fc2l6ZTsgaSsrKSIpOworICAgICAgfQorICAgICAgZnByaW50Zihmb3V0LCJcblx0XHR7Iik7CisgICAgICBpZiAoaGFzX3B0cihwLT5pbmZvLnR5cC0+cmVmKSkKKyAgICAgICAgZnByaW50Zihmb3V0LCJcdHNvYXBfZW1iZWRkZWQoc29hcCwgdGhpcy0+JXMgKyBpLCAlcyk7IiwgcC0+c3ltLT5uYW1lLCBzb2FwX3R5cGUocC0+aW5mby50eXAtPnJlZikpOworICAgICAgaWYgKCgoVG5vZGUqKXAtPmluZm8udHlwLT5yZWYpLT50eXBlID09IFRjbGFzcyAmJiAhaXNfZXh0ZXJuYWwocC0+aW5mby50eXAtPnJlZikgJiYgIWlzX3ZvbGF0aWxlKHAtPmluZm8udHlwLT5yZWYpICYmICFpc190eXBlZGVmKHAtPmluZm8udHlwLT5yZWYpKQorICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0dGhpcy0+JXNbaV0uc29hcF9zZXJpYWxpemUoc29hcCk7IiwgcC0+c3ltLT5uYW1lKTsKKyAgICAgIGVsc2UgaWYgKCFpc19wcmltaXRpdmUocC0+aW5mby50eXAtPnJlZikpCisgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRzb2FwX3NlcmlhbGl6ZV8lcyhzb2FwLCB0aGlzLT4lcyArIGkpOyIsIGNfaWRlbnQocC0+aW5mby50eXAtPnJlZiksIHAtPnN5bS0+bmFtZSk7CisgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdH1cbn0iKTsKKyAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgaWYgKGlzX2V4dGVybmFsKHR5cCkpCisgICAgICAgIHsgZnByaW50ZihmaGVhZCwiXG5TT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NlcmlhbGl6ZV8lcyhzdHJ1Y3Qgc29hcCosICVzKTsiLGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiY29uc3QqIikpOyAKKyAgICAgICAgICByZXR1cm47CisJfQorICAgICAgICBmcHJpbnRmKGZoZWFkLCJcblNPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplXyVzKHN0cnVjdCBzb2FwKiwgJXMpOyIsY19pZGVudCh0eXApLGNfdHlwZV9pZCh0eXAsICJjb25zdCoiKSk7IAorICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXG5TT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV8lcyhzdHJ1Y3Qgc29hcCAqc29hcCwgJXMpXG57IixjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgImNvbnN0KmEiKSk7IAorICAgICAgICBpZiAoaXNfYmluYXJ5KHR5cCkpCisJeyBpZiAoaXNfYXR0YWNobWVudCh0eXApKQorICAgICAgICAgIHsgZnByaW50Zihmb3V0LCJcblx0aWYgKGEtPl9fcHRyICYmICFzb2FwX2FycmF5X3JlZmVyZW5jZShzb2FwLCBhLCAoc3RydWN0IHNvYXBfYXJyYXkqKSZhLT5fX3B0ciwgMSwgJXMpKSIsIHNvYXBfdHlwZSh0eXApKTsKKyAgICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0aWYgKGEtPmlkIHx8IGEtPnR5cGUpXG5cdFx0XHRzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX0RJTUU7XG59Iik7CisJICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0aWYgKGEtPl9fcHRyKVxuXHRcdHNvYXBfYXJyYXlfcmVmZXJlbmNlKHNvYXAsIGEsIChzdHJ1Y3Qgc29hcF9hcnJheSopJmEtPiVzLCAxLCAlcyk7XG59IiwgcC0+c3ltLT5uYW1lLCBzb2FwX3R5cGUodHlwKSk7CisgICAgICBmZmx1c2goZm91dCk7CisgICAgICByZXR1cm47CisJfQorCWVsc2UKKwl7CisgICAgICBpZiAoaXNfWE1MKHAtPmluZm8udHlwLT5yZWYpKQorICAgICAgeyBmcHJpbnRmKGZvdXQsIlxufSIpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRpbnQgaTsiKTsKKyAgICAgIGQgPSBnZXRfRGFycmF5ZGltcyh0eXApOworICAgICAgaWYgKGQpCisgICAgICB7IGZwcmludGYoZm91dCwiXG5cdGlmIChhLT4lcyAmJiAhc29hcF9hcnJheV9yZWZlcmVuY2Uoc29hcCwgYSwgKHN0cnVjdCBzb2FwX2FycmF5KikmYS0+JXMsICVkLCAlcykpIiwgcC0+c3ltLT5uYW1lLCBwLT5zeW0tPm5hbWUsIGQsIHNvYXBfdHlwZSh0eXApKTsKKyAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRmb3IgKGkgPSAwOyBpIDwgc29hcF9zaXplKGEtPl9fc2l6ZSwgJWQpOyBpKyspIiwgZCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IGZwcmludGYoZm91dCwiXG5cdGlmIChhLT4lcyAmJiAhc29hcF9hcnJheV9yZWZlcmVuY2Uoc29hcCwgYSwgKHN0cnVjdCBzb2FwX2FycmF5KikmYS0+JXMsIDEsICVzKSkiLCBwLT5zeW0tPm5hbWUsIHAtPnN5bS0+bmFtZSwgc29hcF90eXBlKHR5cCkpOworICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdGZvciAoaSA9IDA7IGkgPCBhLT5fX3NpemU7IGkrKykiKTsKKyAgICAgIH0KKyAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0eyIpOworICAgICAgaWYgKGhhc19wdHIocC0+aW5mby50eXAtPnJlZikpCisgICAgICAgIGZwcmludGYoZm91dCwiXHRzb2FwX2VtYmVkZGVkKHNvYXAsIGEtPiVzICsgaSwgJXMpOyIsIHAtPnN5bS0+bmFtZSwgc29hcF90eXBlKHAtPmluZm8udHlwLT5yZWYpKTsKKyAgICAgIGlmICgoKFRub2RlKilwLT5pbmZvLnR5cC0+cmVmKS0+dHlwZSA9PSBUY2xhc3MgJiYgIWlzX2V4dGVybmFsKHAtPmluZm8udHlwLT5yZWYpICYmICFpc192b2xhdGlsZShwLT5pbmZvLnR5cC0+cmVmKSAmJiAhaXNfdHlwZWRlZihwLT5pbmZvLnR5cC0+cmVmKSkKKyAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdGEtPiVzW2ldLnNvYXBfc2VyaWFsaXplKHNvYXApOyIsIHAtPnN5bS0+bmFtZSk7CisgICAgICBlbHNlIGlmICghaXNfcHJpbWl0aXZlKHAtPmluZm8udHlwLT5yZWYpKQorICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0c29hcF9zZXJpYWxpemVfJXMoc29hcCwgYS0+JXMgKyBpKTsiLCBjX2lkZW50KHAtPmluZm8udHlwLT5yZWYpLCBwLT5zeW0tPm5hbWUpOworICAgICAgZnByaW50Zihmb3V0LCJcblx0XHR9XG59Iik7CisgICAgICBmZmx1c2goZm91dCk7CisgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChpc19zdGRzdHJpbmcodHlwKSB8fCBpc19zdGR3c3RyaW5nKHR5cCkpCisgIHsgZnByaW50ZihmaGVhZCwiXG5TT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV8lcyhzdHJ1Y3Qgc29hcCosIGNvbnN0ICVzKTsiLGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiKiIpKTsgCisgICAgZnByaW50Zihmb3V0LCJcblxuU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfJXMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0ICVzKVxue1x0KHZvaWQpc29hcDsgKHZvaWQpcDsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovXG59IixjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgIipwIikpOyAKKyAgICByZXR1cm47CisgIH0KKyAgc3dpdGNoKHR5cC0+dHlwZSkKKyAgewkKKyAgICBjYXNlIFRjbGFzczoKKyAgICAgIGlmICghaXNfdm9sYXRpbGUodHlwKSkKKyAgICAgIHsKKyAgICAgIGlmIChpc19leHRlcm5hbCh0eXApKQorICAgICAgeyBmcHJpbnRmKGZoZWFkLCJcblNPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfc2VyaWFsaXplXyVzKHN0cnVjdCBzb2FwKiwgY29uc3QgJXMpOyIsY19pZGVudCh0eXApLGNfdHlwZV9pZCh0eXAsICIqIikpOyAKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgdGFibGU9KFRhYmxlKil0eXAtPnJlZjsKKyAgICAgIGZwcmludGYoZm91dCwiXG5cbnZvaWQgJXM6OnNvYXBfc2VyaWFsaXplKHN0cnVjdCBzb2FwICpzb2FwKSBjb25zdFxueyIsIHR5cC0+aWQtPm5hbWUpOyAKKyAgICAgIGZwcmludGYoZm91dCwgIlxuXHQodm9pZClzb2FwOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8iKTsKKyAgICAgIGZvciAodCA9IHRhYmxlOyB0ICE9IChUYWJsZSAqKSAwOyB0ID0gdC0+cHJldikKKyAgICAgIHsgCisJZm9yIChwID0gdC0+bGlzdDsgcCAhPSAoRW50cnkqKSAwOyBwID0gcC0+bmV4dCkgeworCSAgaWYgKHAtPmluZm8uc3RvICYgKFNjb25zdCB8IFNwcml2YXRlIHwgU3Byb3RlY3RlZCkpCisJICAgIGZwcmludGYoZm91dCwgIlxuXHQvKiBub24tc2VyaWFsaXphYmxlICVzIHNraXBwZWQgKi8iLCBwLT5zeW0tPm5hbWUpOworCSAgZWxzZSBpZiAoaXNfdHJhbnNpZW50KHAtPmluZm8udHlwKSkKKwkgICAgZnByaW50Zihmb3V0LCAiXG5cdC8qIHRyYW5zaWVudCAlcyBza2lwcGVkICovIiwgcC0+c3ltLT5uYW1lKTsKKwkgIGVsc2UgaWYgKHAtPmluZm8uc3RvICYgU2F0dHJpYnV0ZSkKKwkgICAgOworCSAgZWxzZSBpZiAoaXNfcmVwZXRpdGlvbihwKSkKKwkgIHsgCisgICAgICBpZiAoIWlzX1hNTChwLT5uZXh0LT5pbmZvLnR5cCkpIHsKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdGlmICgoKCVzKil0aGlzKS0+JXMpIiwgdC0+c3ltLT5uYW1lLCBwLT5uZXh0LT5zeW0tPm5hbWUpOworICAgICAgZnByaW50Zihmb3V0LCJcblx0e1x0aW50IGk7XG5cdFx0Zm9yIChpID0gMDsgaSA8ICgoJXMqKXRoaXMpLT4lczsgaSsrKVxuXHRcdHsiLCB0LT5zeW0tPm5hbWUsIHAtPnN5bS0+bmFtZSk7CisgICAgICBpZiAoIWlzX2ludmlzaWJsZShwLT5uZXh0LT5zeW0tPm5hbWUpKQorICAgICAgICBpZiAoaGFzX3B0cihwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSkKKyAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0c29hcF9lbWJlZGRlZChzb2FwLCAoKCVzKil0aGlzKS0+JXMgKyBpLCAlcyk7IiwgdC0+c3ltLT5uYW1lLCBwLT5uZXh0LT5zeW0tPm5hbWUsIHNvYXBfdHlwZShwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSk7CisgICAgICBpZiAoKChUbm9kZSopcC0+bmV4dC0+aW5mby50eXAtPnJlZiktPnR5cGUgPT0gVGNsYXNzICYmICFpc19leHRlcm5hbChwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSAmJiAhaXNfdm9sYXRpbGUocC0+bmV4dC0+aW5mby50eXAtPnJlZikgJiYgIWlzX3R5cGVkZWYocC0+bmV4dC0+aW5mby50eXAtPnJlZikpCisgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHQoKCVzKil0aGlzKS0+JXNbaV0uc29hcF9zZXJpYWxpemUoc29hcCk7IiwgdC0+c3ltLT5uYW1lLCBwLT5uZXh0LT5zeW0tPm5hbWUpOworICAgICAgZWxzZSBpZiAoIWlzX3ByaW1pdGl2ZShwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSkKKyAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdHNvYXBfc2VyaWFsaXplXyVzKHNvYXAsICgoJXMqKXRoaXMpLT4lcyArIGkpOyIsIGNfaWRlbnQocC0+bmV4dC0+aW5mby50eXAtPnJlZiksIHQtPnN5bS0+bmFtZSwgcC0+bmV4dC0+c3ltLT5uYW1lKTsKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0fVxuXHR9Iik7CisJICB9CisgICAgICAgICAgcCA9IHAtPm5leHQ7CisJICB9CisJICBlbHNlIGlmIChpc19hbnl0eXBlKHApKQorCSAgeyBmcHJpbnRmKGZvdXQsIlxuXHRzb2FwX21hcmtlbGVtZW50KHNvYXAsIHRoaXMtPiVzLCB0aGlzLT4lcyk7IiwgcC0+bmV4dC0+c3ltLT5uYW1lLCBwLT5zeW0tPm5hbWUpOworICAgICAgICAgICAgcCA9IHAtPm5leHQ7CisJICB9CisJICBlbHNlIGlmIChpc19jaG9pY2UocCkpCisJICB7IGZwcmludGYoZm91dCwiXG5cdHNvYXBfc2VyaWFsaXplXyVzKHNvYXAsICgoJXMqKXRoaXMpLT4lcywgJigoJXMqKXRoaXMpLT4lcyk7IiwgY19pZGVudChwLT5uZXh0LT5pbmZvLnR5cCksdC0+c3ltLT5uYW1lLHAtPnN5bS0+bmFtZSx0LT5zeW0tPm5hbWUscC0+bmV4dC0+c3ltLT5uYW1lKTsKKyAgICAgICAgICAgIHAgPSBwLT5uZXh0OworCSAgfQorCSAgZWxzZSBpZihwLT5pbmZvLnR5cC0+dHlwZT09VGFycmF5KQorCSAgICB7CisgICAgICAgICAgICAgIGlmIChoYXNfcHRyKHAtPmluZm8udHlwKSkKKwkgICAgICAgIGZwcmludGYoZm91dCwiXG5cdHNvYXBfZW1iZWRkZWQoc29hcCwgKCglcyopdGhpcyktPiVzLCAlcyk7IiwgdC0+c3ltLT5uYW1lLCBwLT5zeW0tPm5hbWUsIHNvYXBfdHlwZShwLT5pbmZvLnR5cCkpOworCSAgICAgIGZwcmludGYoZm91dCwiXG5cdHNvYXBfc2VyaWFsaXplXyVzKHNvYXAsICgoJXMqKXRoaXMpLT4lcyk7IiwgY19pZGVudChwLT5pbmZvLnR5cCksdC0+c3ltLT5uYW1lLCBwLT5zeW0tPm5hbWUpOworCSAgICB9CisJICBlbHNlIGlmKHAtPmluZm8udHlwLT50eXBlPT1UY2xhc3MgJiYgIWlzX2V4dGVybmFsKHAtPmluZm8udHlwKSAmJiAhaXNfdm9sYXRpbGUocC0+aW5mby50eXApICYmICFpc190eXBlZGVmKHAtPmluZm8udHlwKSkKKwkgICAgeworICAgICAgICAgICAgICBpZiAoaGFzX3B0cihwLT5pbmZvLnR5cCkpCisJICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRzb2FwX2VtYmVkZGVkKHNvYXAsICYoKCVzKil0aGlzKS0+JXMsICVzKTsiLCB0LT5zeW0tPm5hbWUsIHAtPnN5bS0+bmFtZSwgc29hcF90eXBlKHAtPmluZm8udHlwKSk7CisJICAgICAgZnByaW50Zihmb3V0LCJcblx0KCglcyopdGhpcyktPiVzLnNvYXBfc2VyaWFsaXplKHNvYXApOyIsIHQtPnN5bS0+bmFtZSwgcC0+c3ltLT5uYW1lICk7CisJICAgIH0KKwkgIGVsc2UgaWYgKHAtPmluZm8udHlwLT50eXBlICE9IFRmdW4gJiYgIWlzX3ZvaWQocC0+aW5mby50eXApICYmICFpc19YTUwocC0+aW5mby50eXApKQorCSAgeworCSAgICBpZiAoIWlzX3RlbXBsYXRlKHAtPmluZm8udHlwKSkKKyAgICAgICAgICAgICAgaWYgKGhhc19wdHIocC0+aW5mby50eXApKQorCSAgICAgICAgZnByaW50Zihmb3V0LCJcblx0c29hcF9lbWJlZGRlZChzb2FwLCAmKCglcyopdGhpcyktPiVzLCAlcyk7IiwgdC0+c3ltLT5uYW1lLHAtPnN5bS0+bmFtZSwgc29hcF90eXBlKHAtPmluZm8udHlwKSk7CisJICAgIGlmICghaXNfcHJpbWl0aXZlKHAtPmluZm8udHlwKSkKKwkgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRzb2FwX3NlcmlhbGl6ZV8lcyhzb2FwLCAmKCglcyopdGhpcyktPiVzKTsiLCBjX2lkZW50KHAtPmluZm8udHlwKSx0LT5zeW0tPm5hbWUscC0+c3ltLT5uYW1lKTsKKwkgIH0KKwl9CisgICAgICB9CisgICAgICBmcHJpbnRmKGZvdXQsIlxufSIpOwkgCisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIFRzdHJ1Y3Q6CisKKyAgICAgIGlmIChpc19leHRlcm5hbCh0eXApICYmICFpc192b2xhdGlsZSh0eXApKQorICAgICAgeyBmcHJpbnRmKGZoZWFkLCJcblNPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfc2VyaWFsaXplXyVzKHN0cnVjdCBzb2FwKiwgY29uc3QgJXMpOyIsY19pZGVudCh0eXApLGNfdHlwZV9pZCh0eXAsICIqIikpOyAKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgZnByaW50ZihmaGVhZCwiXG5TT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV8lcyhzdHJ1Y3Qgc29hcCosIGNvbnN0ICVzKTsiLGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiKiIpKTsgCisgICAgICBpZiAoIXR5cC0+cmVmKQorICAgICAgICByZXR1cm47CisgICAgICBmcHJpbnRmKGZvdXQsIlxuXG5TT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV8lcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgJXMpXG57IixjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgIiphIikpOyAKKyAgICAgIC8qIERZTkFNSUMgQVJSQVkgKi8KKyAgICAgIAorICAgICAgZnByaW50Zihmb3V0LCAiXG5cdCh2b2lkKXNvYXA7ICh2b2lkKWE7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLyIpOworICAgICAgdGFibGU9KFRhYmxlKil0eXAtPnJlZjsKKyAgICAgIGZvciAodCA9IHRhYmxlOyB0ICE9IChUYWJsZSAqKSAwOyB0ID0gdC0+cHJldikgeyAKKwlmb3IgKHAgPSB0LT5saXN0OyBwICE9IChFbnRyeSopIDA7IHAgPSBwLT5uZXh0KSB7CisJICBpZiAocC0+aW5mby5zdG8gJiAoU2NvbnN0IHwgU3ByaXZhdGUgfCBTcHJvdGVjdGVkKSkKKwkgICAgZnByaW50Zihmb3V0LCAiXG5cdC8qIG5vbi1zZXJpYWxpemFibGUgJXMgc2tpcHBlZCAqLyIsIHAtPnN5bS0+bmFtZSk7CisJICBlbHNlIGlmIChpc190cmFuc2llbnQocC0+aW5mby50eXApKQorCSAgICBmcHJpbnRmKGZvdXQsICJcblx0LyogdHJhbnNpZW50ICVzIHNraXBwZWQgKi8iLCBwLT5zeW0tPm5hbWUpOworCSAgZWxzZSBpZiAocC0+aW5mby5zdG8gJiBTYXR0cmlidXRlKQorCSAgICA7CisJICBlbHNlIGlmIChpc19yZXBldGl0aW9uKHApKQorCSAgeyAKKyAgICAgIGlmICghaXNfWE1MKHAtPm5leHQtPmluZm8udHlwKSkgeworICAgICAgZnByaW50Zihmb3V0LCJcblx0aWYgKGEtPiVzKSIsIHAtPm5leHQtPnN5bS0+bmFtZSk7CisgICAgICBmcHJpbnRmKGZvdXQsIlxuXHR7XHRpbnQgaTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgYS0+JXM7IGkrKylcblx0XHR7IiwgcC0+c3ltLT5uYW1lKTsKKyAgICAgIGlmICghaXNfaW52aXNpYmxlKHAtPm5leHQtPnN5bS0+bmFtZSkpCisgICAgICAgIGlmIChoYXNfcHRyKHAtPm5leHQtPmluZm8udHlwLT5yZWYpKQorICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRzb2FwX2VtYmVkZGVkKHNvYXAsIGEtPiVzICsgaSwgJXMpOyIsIHAtPm5leHQtPnN5bS0+bmFtZSwgc29hcF90eXBlKHAtPm5leHQtPmluZm8udHlwLT5yZWYpKTsKKyAgICAgIGlmICgoKFRub2RlKilwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKS0+dHlwZSA9PSBUY2xhc3MgJiYgIWlzX2V4dGVybmFsKHAtPm5leHQtPmluZm8udHlwLT5yZWYpICYmICFpc192b2xhdGlsZShwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSAmJiAhaXNfdHlwZWRlZihwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSkKKyAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdGEtPiVzW2ldLnNvYXBfc2VyaWFsaXplKHNvYXApOyIsIHAtPm5leHQtPnN5bS0+bmFtZSk7CisgICAgICBlbHNlIGlmICghaXNfcHJpbWl0aXZlKHAtPm5leHQtPmluZm8udHlwLT5yZWYpKQorICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0c29hcF9zZXJpYWxpemVfJXMoc29hcCwgYS0+JXMgKyBpKTsiLCBjX2lkZW50KHAtPm5leHQtPmluZm8udHlwLT5yZWYpLCBwLT5uZXh0LT5zeW0tPm5hbWUpOworICAgICAgZnByaW50Zihmb3V0LCJcblx0XHR9XG5cdH0iKTsKKwkgIH0KKyAgICAgICAgICBwID0gcC0+bmV4dDsKKwkgIH0KKwkgIGVsc2UgaWYgKGlzX2FueXR5cGUocCkpCisJICB7IGZwcmludGYoZm91dCwiXG5cdHNvYXBfbWFya2VsZW1lbnQoc29hcCwgYS0+JXMsIGEtPiVzKTsiLCBwLT5uZXh0LT5zeW0tPm5hbWUsIHAtPnN5bS0+bmFtZSk7CisgICAgICAgICAgICBwID0gcC0+bmV4dDsKKwkgIH0KKwkgIGVsc2UgaWYgKGlzX2Nob2ljZShwKSkKKwkgIHsgZnByaW50Zihmb3V0LCJcblx0c29hcF9zZXJpYWxpemVfJXMoc29hcCwgYS0+JXMsICZhLT4lcyk7IiwgY19pZGVudChwLT5uZXh0LT5pbmZvLnR5cCkscC0+c3ltLT5uYW1lLHAtPm5leHQtPnN5bS0+bmFtZSk7CisgICAgICAgICAgICBwID0gcC0+bmV4dDsKKwkgIH0KKwkgIGVsc2UgaWYocC0+aW5mby50eXAtPnR5cGU9PVRhcnJheSkKKwkgICAgeworICAgICAgICAgICAgICBpZiAoaGFzX3B0cihwLT5pbmZvLnR5cCkpCisJICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRzb2FwX2VtYmVkZGVkKHNvYXAsIGEtPiVzLCAlcyk7IiwgcC0+c3ltLT5uYW1lLCBzb2FwX3R5cGUocC0+aW5mby50eXApKTsKKwkgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRzb2FwX3NlcmlhbGl6ZV8lcyhzb2FwLCBhLT4lcyk7IiwgY19pZGVudChwLT5pbmZvLnR5cCkscC0+c3ltLT5uYW1lKTsKKwkgICAgfQorCSAgZWxzZSBpZihwLT5pbmZvLnR5cC0+dHlwZSA9PSBUY2xhc3MgJiYgIWlzX2V4dGVybmFsKHAtPmluZm8udHlwKSAmJiAhaXNfdm9sYXRpbGUocC0+aW5mby50eXApICYmICFpc190eXBlZGVmKHAtPmluZm8udHlwKSkKKwkgICAgeworICAgICAgICAgICAgICBpZiAoaGFzX3B0cihwLT5pbmZvLnR5cCkpCisJICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRzb2FwX2VtYmVkZGVkKHNvYXAsICZhLT4lcywgJXMpOyIsIHAtPnN5bS0+bmFtZSwgc29hcF90eXBlKHAtPmluZm8udHlwKSk7CisJICAgICAgZnByaW50Zihmb3V0LCJcblx0YS0+JXMuc29hcF9zZXJpYWxpemUoc29hcCk7IixwLT5zeW0tPm5hbWUpOworCSAgICB9CisJICBlbHNlIGlmIChwLT5pbmZvLnR5cC0+dHlwZSAhPSBUZnVuICYmICFpc192b2lkKHAtPmluZm8udHlwKSAmJiAhaXNfWE1MKHAtPmluZm8udHlwKSkKKwkgICAgeworCSAgICAgIGlmICghaXNfdGVtcGxhdGUocC0+aW5mby50eXApKQorICAgICAgICAgICAgICAgIGlmIChoYXNfcHRyKHAtPmluZm8udHlwKSkKKwkgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0c29hcF9lbWJlZGRlZChzb2FwLCAmYS0+JXMsICVzKTsiLCBwLT5zeW0tPm5hbWUsIHNvYXBfdHlwZShwLT5pbmZvLnR5cCkpOworCSAgICAgIGlmICghaXNfcHJpbWl0aXZlKHAtPmluZm8udHlwKSkKKwkgICAgICAgIGZwcmludGYoZm91dCwiXG5cdHNvYXBfc2VyaWFsaXplXyVzKHNvYXAsICZhLT4lcyk7IiwgY19pZGVudChwLT5pbmZvLnR5cCkscC0+c3ltLT5uYW1lKTsKKwkgICAgfQorCX0KKyAgICAgIH0KKyAgICAgIGZwcmludGYoZm91dCwiXG59Iik7CSAKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBUdW5pb246CisgICAgICBpZiAoaXNfZXh0ZXJuYWwodHlwKSAmJiAhaXNfdm9sYXRpbGUodHlwKSkKKyAgICAgIHsgZnByaW50ZihmaGVhZCwgIlxuU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXJpYWxpemVfJXMoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0ICVzKTsiLCBjX2lkZW50KHR5cCksIGNfdHlwZV9pZCh0eXAsICIqIikpOyAKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgdGFibGU9KFRhYmxlKil0eXAtPnJlZjsKKyAgICAgIGZwcmludGYoZmhlYWQsICJcblNPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplXyVzKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCAlcyk7IiwgY19pZGVudCh0eXApLCBjX3R5cGVfaWQodHlwLCAiKiIpKTsgCisgICAgICBmcHJpbnRmKGZvdXQsICJcblxuU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfJXMoc3RydWN0IHNvYXAgKnNvYXAsIGludCBjaG9pY2UsIGNvbnN0ICVzKVxueyIsIGNfaWRlbnQodHlwKSwgY190eXBlX2lkKHR5cCwgIiphIikpOyAKKyAgICAgIGZwcmludGYoZm91dCwgIlxuXHQodm9pZClzb2FwOyAodm9pZClhOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8iKTsKKyAgICAgIGZwcmludGYoZm91dCwgIlxuXHRzd2l0Y2ggKGNob2ljZSlcblx0eyIpOworICAgICAgZm9yICh0ID0gdGFibGU7IHQ7IHQgPSB0LT5wcmV2KQorICAgICAgeyBmb3IgKHAgPSB0LT5saXN0OyBwOyBwID0gcC0+bmV4dCkKKwl7IGlmIChwLT5pbmZvLnN0byAmIChTY29uc3QgfCBTcHJpdmF0ZSB8IFNwcm90ZWN0ZWQpKQorCSAgICBmcHJpbnRmKGZvdXQsICJcblx0Lyogbm9uLXNlcmlhbGl6YWJsZSAlcyBza2lwcGVkICovIiwgcC0+c3ltLT5uYW1lKTsKKwkgIGVsc2UgaWYgKGlzX3RyYW5zaWVudChwLT5pbmZvLnR5cCkpCisJICAgIGZwcmludGYoZm91dCwgIlxuXHQvKiB0cmFuc2llbnQgJXMgc2tpcHBlZCAqLyIsIHAtPnN5bS0+bmFtZSk7CisJICBlbHNlIGlmIChwLT5pbmZvLnN0byAmIFNhdHRyaWJ1dGUpCisJICAgIDsKKwkgIGVsc2UgaWYgKGlzX3JlcGV0aXRpb24ocCkpCisJICAgIDsKKwkgIGVsc2UgaWYgKGlzX2FueXR5cGUocCkpCisJICAgIDsKKwkgIGVsc2UgaWYgKHAtPmluZm8udHlwLT50eXBlPT1UYXJyYXkpCisJICAgIHsKKwkgICAgICBmcHJpbnRmKGZvdXQsICJcblx0Y2FzZSBTT0FQX1VOSU9OXyVzXyVzOiIsIGNfaWRlbnQodHlwKSwgcC0+c3ltLT5uYW1lKTsKKyAgICAgICAgICAgICAgaWYgKGhhc19wdHIocC0+aW5mby50eXApKQorCSAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRzb2FwX2VtYmVkZGVkKHNvYXAsIGEtPiVzLCAlcyk7IiwgcC0+c3ltLT5uYW1lLCBzb2FwX3R5cGUocC0+aW5mby50eXApKTsKKwkgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdHNvYXBfc2VyaWFsaXplXyVzKHNvYXAsIGEtPiVzKTsiLCBjX2lkZW50KHAtPmluZm8udHlwKSxwLT5zeW0tPm5hbWUpOworCSAgICAgIGZwcmludGYoZm91dCwgIlxuXHRcdGJyZWFrOyIpOworCSAgICB9CisJICBlbHNlIGlmKHAtPmluZm8udHlwLT50eXBlID09IFRjbGFzcyAmJiAhaXNfZXh0ZXJuYWwocC0+aW5mby50eXApICYmICFpc192b2xhdGlsZShwLT5pbmZvLnR5cCkgJiYgIWlzX3R5cGVkZWYocC0+aW5mby50eXApKQorCSAgICB7CisJICAgICAgZnByaW50Zihmb3V0LCAiXG5cdGNhc2UgU09BUF9VTklPTl8lc18lczoiLCBjX2lkZW50KHR5cCksIHAtPnN5bS0+bmFtZSk7CisgICAgICAgICAgICAgIGlmIChoYXNfcHRyKHAtPmluZm8udHlwKSkKKwkgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0c29hcF9lbWJlZGRlZChzb2FwLCAmYS0+JXMsICVzKTsiLCBwLT5zeW0tPm5hbWUsIHNvYXBfdHlwZShwLT5pbmZvLnR5cCkpOworCSAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0YS0+JXMuc29hcF9zZXJpYWxpemUoc29hcCk7IixwLT5zeW0tPm5hbWUpOworCSAgICAgIGZwcmludGYoZm91dCwgIlxuXHRcdGJyZWFrOyIpOworCSAgICB9CisJICBlbHNlIGlmIChwLT5pbmZvLnR5cC0+dHlwZSAhPSBUZnVuICYmICFpc192b2lkKHAtPmluZm8udHlwKSAmJiAhaXNfWE1MKHAtPmluZm8udHlwKSkKKwkgICAgeworCSAgICAgIGZwcmludGYoZm91dCwgIlxuXHRjYXNlIFNPQVBfVU5JT05fJXNfJXM6IiwgY19pZGVudCh0eXApLCBwLT5zeW0tPm5hbWUpOworICAgICAgICAgICAgICBpZiAoaGFzX3B0cihwLT5pbmZvLnR5cCkpCisJICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdHNvYXBfZW1iZWRkZWQoc29hcCwgJmEtPiVzLCAlcyk7IiwgcC0+c3ltLT5uYW1lLCBzb2FwX3R5cGUocC0+aW5mby50eXApKTsKKwkgICAgICBpZiAoIWlzX3ByaW1pdGl2ZShwLT5pbmZvLnR5cCkpCisJICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdHNvYXBfc2VyaWFsaXplXyVzKHNvYXAsICZhLT4lcyk7IiwgY19pZGVudChwLT5pbmZvLnR5cCkscC0+c3ltLT5uYW1lKTsKKwkgICAgICBmcHJpbnRmKGZvdXQsICJcblx0XHRicmVhazsiKTsKKwkgICAgfQorCX0KKyAgICAgIH0KKyAgICAgIGZwcmludGYoZm91dCwiXG5cdH1cbn0iKTsJIAorICAgICAgYnJlYWs7CisgICAgY2FzZSBUcG9pbnRlcjoKKyAgICAgIGlmICgoKFRub2RlKil0eXAtPnJlZiktPnR5cGUgPT0gVGNsYXNzICYmICFpc19leHRlcm5hbCh0eXAtPnJlZikgJiYgIWlzX3ZvbGF0aWxlKHR5cC0+cmVmKSAmJiAhaXNfdHlwZWRlZih0eXAtPnJlZikpCisgICAgICB7IGlmIChpc19leHRlcm5hbCh0eXApKQorICAgICAgICB7IGZwcmludGYoZmhlYWQsIlxuU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXJpYWxpemVfJXMoc3RydWN0IHNvYXAqLCAlcyk7IiwgY19pZGVudCh0eXApLGNfdHlwZV9pZCh0eXAsICJjb25zdCoiKSk7CisgICAgICAgICAgcmV0dXJuOworCX0KKyAgICAgICAgZnByaW50ZihmaGVhZCwiXG5TT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV8lcyhzdHJ1Y3Qgc29hcCosICVzKTsiLCBjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgImNvbnN0KiIpKTsKKwlmcHJpbnRmKGZvdXQsIlxuXG5TT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV8lcyhzdHJ1Y3Qgc29hcCAqc29hcCwgJXMpXG57IiwgY19pZGVudCh0eXApLGNfdHlwZV9pZCh0eXAsICJjb25zdCphIikpOworCWlmIChwID0gaXNfZHluYW1pY19hcnJheSh0eXAtPnJlZikpCisgICAgICAgIHsgZCA9IGdldF9EYXJyYXlkaW1zKHR5cC0+cmVmKTsKKyAgICAgICAgICBpZiAoZCkKKwkgICAgZnByaW50Zihmb3V0LCJcblx0aWYgKCphKSIpOworCSAgZWxzZQorCSAgICBmcHJpbnRmKGZvdXQsIlxuXHRpZiAoKmEpIik7CisJfQorCWVsc2UKKwkgIGZwcmludGYoZm91dCwiXG5cdGlmICghc29hcF9yZWZlcmVuY2Uoc29hcCwgKmEsICVzKSkiLCBzb2FwX3R5cGUodHlwLT5yZWYpKTsKKwlmcHJpbnRmKGZvdXQsIlxuXHRcdCgqYSktPnNvYXBfc2VyaWFsaXplKHNvYXApO1xufSIpOworCWJyZWFrOwkKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaWYgKGlzX2V4dGVybmFsKHR5cCkpCisJeyBmcHJpbnRmKGZoZWFkLCJcblNPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfc2VyaWFsaXplXyVzKHN0cnVjdCBzb2FwKiwgJXMpOyIsIGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiY29uc3QqIikpOworICAgICAgICAgIHJldHVybjsKKwl9CisJZnByaW50ZihmaGVhZCwiXG5TT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV8lcyhzdHJ1Y3Qgc29hcCosICVzKTsiLCBjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgImNvbnN0KiIpKTsKKwlmcHJpbnRmKGZvdXQsIlxuXG5TT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV8lcyhzdHJ1Y3Qgc29hcCAqc29hcCwgJXMpXG57IiwgY19pZGVudCh0eXApLGNfdHlwZV9pZCh0eXAsICJjb25zdCphIikpOworCWlmIChpc19zdHJpbmcodHlwKSB8fCBpc193c3RyaW5nKHR5cCkpCisJICBmcHJpbnRmKGZvdXQsIlxuXHRzb2FwX3JlZmVyZW5jZShzb2FwLCAqYSwgJXMpO1xufSIsIHNvYXBfdHlwZSh0eXApKTsKKwllbHNlIGlmIChpc19wcmltaXRpdmUodHlwLT5yZWYpKQorCSAgZnByaW50Zihmb3V0LCJcblx0c29hcF9yZWZlcmVuY2Uoc29hcCwgKmEsICVzKTtcbn0iLCBzb2FwX3R5cGUodHlwLT5yZWYpKTsKKwllbHNlIGlmIChwID0gaXNfZHluYW1pY19hcnJheSh0eXAtPnJlZikpCisgICAgICAgIHsgZCA9IGdldF9EYXJyYXlkaW1zKHR5cC0+cmVmKTsKKyAgICAgICAgICBpZiAoZCkKKwkgICAgZnByaW50Zihmb3V0LCJcblx0aWYgKCphKSIpOworCSAgZWxzZQorCSAgICBmcHJpbnRmKGZvdXQsIlxuXHRpZiAoKmEpIik7CisJICBmcHJpbnRmKGZvdXQsIlxuXHRcdHNvYXBfc2VyaWFsaXplXyVzKHNvYXAsICphKTtcbn0iLCBjX2lkZW50KHR5cC0+cmVmKSk7CisJfQorCWVsc2UKKwl7IGZwcmludGYoZm91dCwiXG5cdGlmICghc29hcF9yZWZlcmVuY2Uoc29hcCwgKmEsICVzKSkiLCBzb2FwX3R5cGUodHlwLT5yZWYpKTsKKwkgIGZwcmludGYoZm91dCwiXG5cdFx0c29hcF9zZXJpYWxpemVfJXMoc29hcCwgKmEpO1xufSIsIGNfaWRlbnQodHlwLT5yZWYpKTsKKwl9CisJYnJlYWs7CisgICAgICB9CisJCisgICAgY2FzZSBUYXJyYXkgOgorICAgICAgaWYgKGlzX2V4dGVybmFsKHR5cCkpCisgICAgICB7IGZwcmludGYoZmhlYWQsIlxuU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXJpYWxpemVfJXMoc3RydWN0IHNvYXAqLCAlcyk7IiwgY19pZGVudCh0eXApLGNfdHlwZV9pZCh0eXAsICJjb25zdCIpKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgZnByaW50ZihmaGVhZCwiXG5TT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV8lcyhzdHJ1Y3Qgc29hcCosICVzKTsiLCBjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgImNvbnN0IikpOworICAgICAgZnByaW50Zihmb3V0LCJcblxuU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfJXMoc3RydWN0IHNvYXAgKnNvYXAsICVzKSIsIGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiY29uc3QgYSIpKTsKKyAgICAgIGlmIChpc19wcmltaXRpdmUodHlwLT5yZWYpKQorICAgICAgeyBmcHJpbnRmKGZvdXQsICJcbnsiKTsKKyAgICAgICAgZnByaW50Zihmb3V0LCAiXG5cdCh2b2lkKXNvYXA7ICh2b2lkKWE7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLyIpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBmcHJpbnRmKGZvdXQsIlxue1x0aW50IGk7Iik7CisgICAgICAgIGZwcmludGYoZm91dCwiXG5cdGZvcihpID0gMDsgaSA8ICVkOyBpKyspIiwgZ2V0X2RpbWVuc2lvbih0eXApKTsKKwkKKyAgICAgICAgdGVtcD10eXAtPnJlZjs7CisgICAgICAgIGNhcmRpbmFsaXR5ID0gMTsKKyAgICAgICAgd2hpbGUodGVtcC0+dHlwZT09VGFycmF5KQorCXsKKwkgIHRlbXA9dGVtcC0+cmVmOworCSAgY2FyZGluYWxpdHkrKzsKKwl9CisgICAgICAgIGZwcmludGYoZm91dCwiXG5cdHsiKTsKKyAgICAgICAgaWYgKGhhc19wdHIodHlwLT5yZWYpKQorCXsKKyAgICAgICAgICBmcHJpbnRmKGZvdXQsIlx0c29hcF9lbWJlZGRlZChzb2FwLCBhIik7CisgICAgICAgICAgaWYoY2FyZGluYWxpdHkgPiAxKQorCSAgICBmcHJpbnRmKGZvdXQsIltpXSIpOworICAgICAgICAgIGVsc2UKKwkgICAgZnByaW50Zihmb3V0LCIraSIpOworICAgICAgICAgIGZwcmludGYoZm91dCwiLCAlcyk7Iiwgc29hcF90eXBlKHR5cC0+cmVmKSk7CisgICAgICAgIH0KKwlpZiAoKChUbm9kZSAqKXR5cC0+cmVmKS0+dHlwZSA9PSBUY2xhc3MgJiYgIWlzX2V4dGVybmFsKHR5cC0+cmVmKSAmJiAhaXNfdm9sYXRpbGUodHlwLT5yZWYpICYmICFpc190eXBlZGVmKHR5cC0+cmVmKSkKKyAgICAgIAl7CWZwcmludGYoZm91dCwiXG5cdGFbaV0uc29hcF9zZXJpYWxpemUoc29hcCkiKTsKKwl9CisJZWxzZSBpZiAoIWlzX3ByaW1pdGl2ZSh0eXAtPnJlZikpCisgICAgICAJewlmcHJpbnRmKGZvdXQsIlxuXHRzb2FwX3NlcmlhbGl6ZV8lcyhzb2FwLCBhIixjX2lkZW50KHR5cC0+cmVmKSk7CisgICAgICAJCWlmKGNhcmRpbmFsaXR5ID4gMSl7CisJCWZwcmludGYoZm91dCwiW2ldKSIpOworICAgICAgCQl9ZWxzZSB7CisJICAJZnByaW50Zihmb3V0LCIraSkiKTsKKyAgICAgIAkJfQorCX0KKyAgICAgICAgZnByaW50Zihmb3V0LCI7XG5cdH0iKTsKKyAgICAgIH0KKyAgICAgIGZwcmludGYoZm91dCwiXG59Iik7CisgICAgICBicmVhazsJCisgICAgY2FzZSBUdGVtcGxhdGU6CisgICAgICBpZiAoaXNfZXh0ZXJuYWwodHlwKSkKKyAgICAgIHsgZnByaW50ZihmaGVhZCwiXG5TT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NlcmlhbGl6ZV8lcyhzdHJ1Y3Qgc29hcCosIGNvbnN0ICVzKTsiLGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiKiIpKTsgCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGZwcmludGYoZmhlYWQsIlxuU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfJXMoc3RydWN0IHNvYXAqLCBjb25zdCAlcyk7IixjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgIioiKSk7IAorICAgICAgdGVtcCA9IHR5cC0+cmVmOworICAgICAgaWYgKCF0ZW1wKQorICAgICAgICByZXR1cm47CisgICAgICBmcHJpbnRmKGZvdXQsIlxuXG5TT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV8lcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgJXMpXG57IixjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgIiphIikpOyAKKyAgICAgIGlmICghaXNfcHJpbWl0aXZlKHRlbXApICYmICFpc19YTUwodGVtcCkgJiYgdGVtcC0+dHlwZSAhPSBUZnVuICYmICFpc192b2lkKHRlbXApKQorICAgICAgeyBmcHJpbnRmKGZvdXQsICJcblx0Zm9yICglczo6Y29uc3RfaXRlcmF0b3IgaSA9IGEtPmJlZ2luKCk7IGkgIT0gYS0+ZW5kKCk7ICsraSkiLCBjX3R5cGUodHlwKSk7CisgICAgICAgIGlmICh0ZW1wLT50eXBlPT1UY2xhc3MgJiYgIWlzX2V4dGVybmFsKHRlbXApICYmICFpc192b2xhdGlsZSh0ZW1wKSAmJiAhaXNfdHlwZWRlZih0ZW1wKSkKKwkgIGZwcmludGYoZm91dCwiXG5cdFx0KCppKS5zb2FwX3NlcmlhbGl6ZShzb2FwKTsiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0c29hcF9zZXJpYWxpemVfJXMoc29hcCwgJigqaSkpOyIsIGNfaWRlbnQodGVtcCkpOworICAgICAgfQorICAgICAgZnByaW50Zihmb3V0LCAiXG59Iik7CisgICAgZGVmYXVsdDogICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZAorZGVmYXVsdHModHlwKQorVG5vZGUqIHR5cDsKK3sgaW50IGksIGQ7CisgIFRhYmxlICp0YWJsZSwqdDsKKyAgRW50cnkgKnA7CisgIFRub2RlICp0ZW1wOworICBjaGFyICpzOworICBpbnQgY2FyZGluYWxpdHk7CisKKyAgaWYgKHR5cC0+dHlwZSA9PSBUcG9pbnRlciAmJiAhaXNfc3RyaW5nKHR5cCkpCisgICAgcmV0dXJuOworCisgIGlmIChpc190eXBlZGVmKHR5cCkpCisgIHsgZnByaW50ZihmaGVhZCwiXG5TT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfJXMoc3RydWN0IHNvYXAqLCAlcyk7IixjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgIioiKSk7IAorICAgIGlmICh0eXAtPnR5cGUgPT0gVGNsYXNzICYmICFpc19zdGRzdHJpbmcodHlwKSAmJiAhaXNfc3Rkd3N0cmluZyh0eXApICYmICFpc192b2xhdGlsZSh0eXApKQorICAgICAgZnByaW50Zihmb3V0LCJcblxuU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0XyVzKHN0cnVjdCBzb2FwICpzb2FwLCAlcylcbntcdGEtPiVzOjpzb2FwX2RlZmF1bHQoc29hcCk7XG59IixjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgIiphIiksdF9pZGVudCh0eXApKTsgCisgICAgZWxzZQorICAgICAgZnByaW50Zihmb3V0LCJcblxuU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0XyVzKHN0cnVjdCBzb2FwICpzb2FwLCAlcylcbntcdHNvYXBfZGVmYXVsdF8lcyhzb2FwLCBhKTtcbn0iLGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiKmEiKSx0X2lkZW50KHR5cCkpOyAKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHAgPSBpc19keW5hbWljX2FycmF5KHR5cCkpCisgIHsgaWYgKHR5cC0+dHlwZSA9PSBUY2xhc3MgJiYgIWlzX3ZvbGF0aWxlKHR5cCkpCisgICAgeyBpZiAoaXNfZXh0ZXJuYWwodHlwKSkKKyAgICAgICAgcmV0dXJuOworICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXG52b2lkICVzOjpzb2FwX2RlZmF1bHQoc3RydWN0IHNvYXAgKnNvYXApXG57IiwgY19pZGVudCh0eXApKTsgCisgICAgICAgIGlmICgocyA9IGhhc19zb2FwcmVmKHR5cCkpKQorICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdHRoaXMtPiVzID0gc29hcDsiLCBzKTsKKwlkID0gZ2V0X0RhcnJheWRpbXModHlwKTsKKyAgICAgICAgaWYgKGQpCisJeyBmcHJpbnRmKGZvdXQsIlxuXHR0aGlzLT4lcyA9IE5VTEw7IiwgcC0+c3ltLT5uYW1lKTsKKwkgIGZvciAoaSA9IDA7IGkgPCBkOyBpKyspCisJICB7IGZwcmludGYoZm91dCwiXG5cdHRoaXMtPl9fc2l6ZVslZF0gPSAwOyIsIGkpOworICAgICAgICAgICAgaWYgKGhhc19vZmZzZXQodHlwKSAmJiAoKChUYWJsZSopdHlwLT5yZWYpLT5saXN0LT5uZXh0LT5uZXh0LT5pbmZvLnN0byAmIFNjb25zdCkgPT0gMCkKKyAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG5cdHRoaXMtPl9fb2Zmc2V0WyVkXSA9IDA7IiwgaSk7CisJICB9CisJfQorCWVsc2UKKwl7IGZwcmludGYoZm91dCwiXG5cdHRoaXMtPl9fc2l6ZSA9IDA7XG5cdHRoaXMtPiVzID0gTlVMTDsiLCBwLT5zeW0tPm5hbWUpOworICAgICAgICAgIGlmIChoYXNfb2Zmc2V0KHR5cCkgJiYgKCgoVGFibGUqKXR5cC0+cmVmKS0+bGlzdC0+bmV4dC0+bmV4dC0+aW5mby5zdG8gJiBTY29uc3QpID09IDApCisgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcblx0dGhpcy0+X19vZmZzZXQgPSAwOyIpOworCX0KKwlpZiAoaXNfYXR0YWNobWVudCh0eXApKQorICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdHRoaXMtPmlkID0gTlVMTDtcblx0dGhpcy0+dHlwZSA9IE5VTEw7XG5cdHRoaXMtPm9wdGlvbnMgPSBOVUxMOyIpOworICAgICAgICBmcHJpbnRmKGZvdXQsIlxufSIpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBpZiAoaXNfZXh0ZXJuYWwodHlwKSkKKyAgICAgICAgeyBmcHJpbnRmKGZoZWFkLCJcblNPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfZGVmYXVsdF8lcyhzdHJ1Y3Qgc29hcCosICVzKTsiLGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiKiIpKTsgCisgICAgICAgICAgcmV0dXJuOworCX0KKyAgICAgICAgZnByaW50ZihmaGVhZCwiXG5TT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfJXMoc3RydWN0IHNvYXAqLCAlcyk7IixjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgIioiKSk7IAorICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXG5TT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfJXMoc3RydWN0IHNvYXAgKnNvYXAsICVzKVxueyIsIGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiKmEiKSk7IAorICAgICAgICBpZiAoKHMgPSBoYXNfc29hcHJlZih0eXApKSkKKyAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRhLT4lcyA9IHNvYXA7Iiwgcyk7CisJZCA9IGdldF9EYXJyYXlkaW1zKHR5cCk7CisgICAgICAgIGlmIChkKQorCXsgZnByaW50Zihmb3V0LCJcblx0YS0+JXMgPSBOVUxMOyIsIHAtPnN5bS0+bmFtZSk7CisJICBmb3IgKGkgPSAwOyBpIDwgZDsgaSsrKQorCSAgeyBmcHJpbnRmKGZvdXQsIlxuXHRhLT5fX3NpemVbJWRdID0gMDsiLCBpKTsKKyAgICAgICAgICAgIGlmIChoYXNfb2Zmc2V0KHR5cCkgJiYgKCgoVGFibGUqKXR5cC0+cmVmKS0+bGlzdC0+bmV4dC0+bmV4dC0+aW5mby5zdG8gJiBTY29uc3QpID09IDApCisgICAgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuXHRhLT5fX29mZnNldFslZF0gPSAwOyIsIGkpOworCSAgfQorCX0KKwllbHNlCisJeyBmcHJpbnRmKGZvdXQsIlxuXHRhLT5fX3NpemUgPSAwO1xuXHRhLT4lcyA9IE5VTEw7IiwgcC0+c3ltLT5uYW1lKTsKKyAgICAgICAgICBpZiAoaGFzX29mZnNldCh0eXApICYmICgoKFRhYmxlKil0eXAtPnJlZiktPmxpc3QtPm5leHQtPm5leHQtPmluZm8uc3RvICYgU2NvbnN0KSA9PSAwKQorICAgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG5cdGEtPl9fb2Zmc2V0ID0gMDsiKTsKKwl9CisJaWYgKGlzX2F0dGFjaG1lbnQodHlwKSkKKyAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRhLT5pZCA9IE5VTEw7XG5cdGEtPnR5cGUgPSBOVUxMO1xuXHRhLT5vcHRpb25zID0gTlVMTDsiKTsKKyAgICAgICAgZnByaW50Zihmb3V0LCJcbn0iKTsKKyAgICAgIH0KKyAgICAgIGZmbHVzaChmb3V0KTsKKyAgICAgIHJldHVybjsKKyAgfQorICBpZiAoaXNfcHJpbWl0aXZlKHR5cCkgfHwgaXNfc3RyaW5nKHR5cCkpCisgIHsgICBpZiAoaXNfZXh0ZXJuYWwodHlwKSkKKyAgICAgIHsgZnByaW50ZihmaGVhZCwiXG5TT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2RlZmF1bHRfJXMoc3RydWN0IHNvYXAqLCAlcyk7IixjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgIioiKSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGZwcmludGYoZmhlYWQsIlxuU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0XyVzKHN0cnVjdCBzb2FwKiwgJXMpOyIsY19pZGVudCh0eXApLGNfdHlwZV9pZCh0eXAsICIqIikpOworICAgICAgZnByaW50Zihmb3V0LCJcblxuU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0XyVzKHN0cnVjdCBzb2FwICpzb2FwLCAlcylcbntcdCh2b2lkKXNvYXA7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqL1xuI2lmZGVmIFNPQVBfREVGQVVMVF8lc1xuXHQqYSA9IFNPQVBfREVGQVVMVF8lcztcbiNlbHNlXG5cdCphID0gKCVzKTA7XG4jZW5kaWZcbn0iLGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiKmEiKSwgY19pZGVudCh0eXApLCBjX2lkZW50KHR5cCksIGNfdHlwZSh0eXApKTsKKyAgICAgIHJldHVybjsKKyAgfQorICBpZiAoaXNfc3Rkc3RyaW5nKHR5cCkgfHwgaXNfc3Rkd3N0cmluZyh0eXApKQorICB7IGZwcmludGYoZmhlYWQsIlxuU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0XyVzKHN0cnVjdCBzb2FwKiwgJXMpOyIsY19pZGVudCh0eXApLGNfdHlwZV9pZCh0eXAsICIqIikpOyAKKyAgICBmcHJpbnRmKGZvdXQsIlxuXG5TT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfJXMoc3RydWN0IHNvYXAgKnNvYXAsICVzKVxue1x0KHZvaWQpc29hcDsgLyogYXBwZWFzZSAtV2FsbCAtV2Vycm9yICovXG5cdHAtPmVyYXNlKCk7XG59IixjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgIipwIikpOyAKKyAgICByZXR1cm47CisgIH0KKyAgc3dpdGNoKHR5cC0+dHlwZSkKKyAgICB7CisgICAgY2FzZSBUY2xhc3M6CisgICAgICAvKiBDTEFTUyAqLworICAgICAgaWYgKCFpc192b2xhdGlsZSh0eXApKQorICAgICAgeworICAgICAgaWYgKGlzX2V4dGVybmFsKHR5cCkpCisgICAgICB7IGZwcmludGYoZmhlYWQsIlxuU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9kZWZhdWx0XyVzKHN0cnVjdCBzb2FwKiwgJXMpOyIsY19pZGVudCh0eXApLGNfdHlwZV9pZCh0eXAsICIqIikpOyAKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgdGFibGU9KFRhYmxlKil0eXAtPnJlZjsKKyAgICAgIGZwcmludGYoZm91dCwiXG5cbnZvaWQgJXM6OnNvYXBfZGVmYXVsdChzdHJ1Y3Qgc29hcCAqc29hcClcbnsiLCB0eXAtPmlkLT5uYW1lICk7IAorICAgICAgaWYgKChzID0gaGFzX3NvYXByZWYodHlwKSkpCisgICAgICAgIGZwcmludGYoZm91dCwiXG5cdHRoaXMtPiVzID0gc29hcDsiLCBzKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZnByaW50Zihmb3V0LCAiXG5cdCh2b2lkKXNvYXA7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLyIpOworCQorICAgICAgZmZsdXNoKGZvdXQpOworICAgICAgZm9yICh0ID0gdGFibGU7IHQgIT0gKFRhYmxlICopIDA7IHQgPSB0LT5wcmV2KQorICAgICAgeyBmb3IgKHAgPSB0LT5saXN0OyBwICE9IChFbnRyeSopIDA7IHAgPSBwLT5uZXh0KQorCSAgaWYgKHAtPmluZm8uc3RvICYgU2NvbnN0KQorCSAgICBmcHJpbnRmKGZvdXQsICJcblx0Lyogbm9uLXNlcmlhbGl6YWJsZSAlcyBza2lwcGVkICovIiwgcC0+c3ltLT5uYW1lKTsKKwkgIGVsc2UgaWYgKGlzX3RyYW5zaWVudChwLT5pbmZvLnR5cCkpCisJICAgIGZwcmludGYoZm91dCwgIlxuXHQvKiB0cmFuc2llbnQgJXMgc2tpcHBlZCAqLyIsIHAtPnN5bS0+bmFtZSk7CisJICBlbHNlIGlmIChpc19jaG9pY2UocCkpCisJICB7IGZwcmludGYoZm91dCwgIlxuXHQoKCVzKil0aGlzKS0+JXMgPSAwOyIsIHQtPnN5bS0+bmFtZSwgcC0+c3ltLT5uYW1lKTsKKwkgICAgcCA9IHAtPm5leHQ7CisJICB9CisJICBlbHNlIGlmIChpc19yZXBldGl0aW9uKHApIHx8IGlzX2FueXR5cGUocCkpCisJICB7IGZwcmludGYoZm91dCwgIlxuXHQoKCVzKil0aGlzKS0+JXMgPSAwO1xuXHQoKCVzKil0aGlzKS0+JXMgPSBOVUxMOyIsIHQtPnN5bS0+bmFtZSwgcC0+c3ltLT5uYW1lLCB0LT5zeW0tPm5hbWUsIHAtPm5leHQtPnN5bS0+bmFtZSk7CisJICAgIHAgPSBwLT5uZXh0OworCSAgfQorCSAgZWxzZQorCSAgeworCSAgaWYocC0+aW5mby50eXAtPnR5cGU9PVRhcnJheSl7CisJICAgIGZwcmludGYoZm91dCwiXG5cdHNvYXBfZGVmYXVsdF8lcyhzb2FwLCAoKCVzKil0aGlzKS0+JXMpOyIsIGNfaWRlbnQocC0+aW5mby50eXApLHQtPnN5bS0+bmFtZSxwLT5zeW0tPm5hbWUpOworCSAgfQorCSAgZWxzZSBpZihwLT5pbmZvLnR5cC0+dHlwZT09VGNsYXNzICYmICFpc19leHRlcm5hbChwLT5pbmZvLnR5cCkgJiYgIWlzX3ZvbGF0aWxlKHAtPmluZm8udHlwKSAmJiAhaXNfdHlwZWRlZihwLT5pbmZvLnR5cCkpCisJICAgIGZwcmludGYoZm91dCwiXG5cdCgoJXMqKXRoaXMpLT4lcy4lczo6c29hcF9kZWZhdWx0KHNvYXApOyIsdC0+c3ltLT5uYW1lLCBwLT5zeW0tPm5hbWUsIGNfaWRlbnQocC0+aW5mby50eXApKTsKKwkgIGVsc2UgaWYgKHAtPmluZm8uaGFzdmFsKQorCSAgeyBpZiAocC0+aW5mby50eXAtPnR5cGUgPT0gVHBvaW50ZXIgJiYgaXNfc3Rkc3RyaW5nKHAtPmluZm8udHlwLT5yZWYpKQorCSAgICAgIGZwcmludGYoZm91dCwiXG5cdHN0YXRpYyBzdGQ6OnN0cmluZyBzb2FwX3RtcF8lcyhcIiVzXCIpO1xuXHQoKCVzKil0aGlzKS0+JXMgPSAmc29hcF90bXBfJXM7IiwgcC0+c3ltLT5uYW1lLCBwLT5pbmZvLnZhbC5zLCB0LT5zeW0tPm5hbWUsIHAtPnN5bS0+bmFtZSwgcC0+c3ltLT5uYW1lLCBwLT5zeW0tPm5hbWUpOworCSAgICBlbHNlCisJICAgICAgZnByaW50Zihmb3V0LCJcblx0KCglcyopdGhpcyktPiVzJXM7IiwgdC0+c3ltLT5uYW1lLHAtPnN5bS0+bmFtZSxjX2luaXQocCkpOworCSAgfQorCSAgZWxzZSBpZiAocC0+aW5mby50eXAtPnR5cGUgPT0gVHBvaW50ZXIgJiYgKCFpc19zdHJpbmcocC0+aW5mby50eXApIHx8IGlzX1hNTChwLT5pbmZvLnR5cCkpKQorLy8gRVNMQFRQTgkgICAgZnByaW50Zihmb3V0LCJcblx0KCglcyopdGhpcyktPiVzID0gTlVMTDsiLCB0LT5zeW0tPm5hbWUscC0+c3ltLT5uYW1lKTsKKwkgICAgZnByaW50Zihmb3V0LCJcblx0aWYoKCglcyopdGhpcyktPiVzKSBkZWxldGUgKCglcyopdGhpcyktPiVzOyAoKCVzKil0aGlzKS0+JXMgPSBOVUxMOyIsIHQtPnN5bS0+bmFtZSxwLT5zeW0tPm5hbWUsIHQtPnN5bS0+bmFtZSxwLT5zeW0tPm5hbWUsIHQtPnN5bS0+bmFtZSxwLT5zeW0tPm5hbWUpOworCSAgZWxzZSBpZiAocC0+aW5mby50eXAtPnR5cGUgIT0gVGZ1biAmJiAhaXNfdm9pZChwLT5pbmZvLnR5cCkpIHsKKwkgICAgZnByaW50Zihmb3V0LCJcblx0c29hcF9kZWZhdWx0XyVzKHNvYXAsICYoKCVzKil0aGlzKS0+JXMpOyIsIGNfaWRlbnQocC0+aW5mby50eXApLHQtPnN5bS0+bmFtZSxwLT5zeW0tPm5hbWUpOworCSAgfQorCX0KKyAgICAgIH0KKyAgICAgIGZwcmludGYoZm91dCwiXG59Iik7CSAKKyAgICAgIGZmbHVzaChmb3V0KTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgY2FzZSBUc3RydWN0OgorICAgICAgdGFibGU9KFRhYmxlKil0eXAtPnJlZjsKKworICAgICAgaWYgKGlzX2V4dGVybmFsKHR5cCkgJiYgIWlzX3ZvbGF0aWxlKHR5cCkpCisgICAgICB7IGZwcmludGYoZmhlYWQsIlxuU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9kZWZhdWx0XyVzKHN0cnVjdCBzb2FwKiwgJXMpOyIsY19pZGVudCh0eXApLGNfdHlwZV9pZCh0eXAsICIqIikpOyAKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgZnByaW50ZihmaGVhZCwiXG5TT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfJXMoc3RydWN0IHNvYXAqLCAlcyk7IixjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgIioiKSk7IAorICAgICAgZnByaW50Zihmb3V0LCJcblxuU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0XyVzKHN0cnVjdCBzb2FwICpzb2FwLCAlcylcbnsiLCBjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgIiphIikpOyAKKyAgICAgIGZmbHVzaChmb3V0KTsKKyAgICAgIGlmICgocyA9IGhhc19zb2FwcmVmKHR5cCkpKQorICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRhLT4lcyA9IHNvYXA7Iiwgcyk7CisgICAgICBlbHNlCisgICAgICAgIGZwcmludGYoZm91dCwgIlxuXHQodm9pZClzb2FwOyAodm9pZClhOyAvKiBhcHBlYXNlIC1XYWxsIC1XZXJyb3IgKi8iKTsKKyAgICAgIGZvciAodCA9IHRhYmxlOyB0ICE9IChUYWJsZSAqKSAwOyB0ID0gdC0+cHJldikKKyAgICAgIHsgZm9yIChwID0gdC0+bGlzdDsgcCAhPSAoRW50cnkqKSAwOyBwID0gcC0+bmV4dCkKKwkgIGlmIChwLT5pbmZvLnN0byAmIChTY29uc3QgfCBTcHJpdmF0ZSB8IFNwcm90ZWN0ZWQpKQorCSAgICBmcHJpbnRmKGZvdXQsICJcblx0Lyogbm9uLXNlcmlhbGl6YWJsZSAlcyBza2lwcGVkICovIiwgcC0+c3ltLT5uYW1lKTsKKwkgIGVsc2UgaWYgKGlzX3RyYW5zaWVudChwLT5pbmZvLnR5cCkpCisJICAgIGZwcmludGYoZm91dCwgIlxuXHQvKiB0cmFuc2llbnQgJXMgc2tpcHBlZCAqLyIsIHAtPnN5bS0+bmFtZSk7CisJICBlbHNlIGlmIChpc19jaG9pY2UocCkpCisJICB7IGZwcmludGYoZm91dCwgIlxuXHRhLT4lcyA9IDA7IiwgcC0+c3ltLT5uYW1lKTsKKwkgICAgcCA9IHAtPm5leHQ7CisJICB9CisJICBlbHNlIGlmIChpc19yZXBldGl0aW9uKHApIHx8IGlzX2FueXR5cGUocCkpCisJICB7IGZwcmludGYoZm91dCwgIlxuXHRhLT4lcyA9IDA7XG5cdGEtPiVzID0gTlVMTDsiLCBwLT5zeW0tPm5hbWUsIHAtPm5leHQtPnN5bS0+bmFtZSk7CisJICAgIHAgPSBwLT5uZXh0OworCSAgfQorCSAgZWxzZQorCSAgeworCSAgaWYgKHAtPmluZm8udHlwLT50eXBlPT1UYXJyYXkpCisJICAgIGZwcmludGYoZm91dCwiXG5cdHNvYXBfZGVmYXVsdF8lcyhzb2FwLCBhLT4lcyk7IiwgY19pZGVudChwLT5pbmZvLnR5cCkscC0+c3ltLT5uYW1lKTsKKwkgIGVsc2UgaWYgKHAtPmluZm8udHlwLT50eXBlPT1UY2xhc3MgJiYgIWlzX2V4dGVybmFsKHAtPmluZm8udHlwKSAmJiAhaXNfdm9sYXRpbGUocC0+aW5mby50eXApICYmICFpc190eXBlZGVmKHAtPmluZm8udHlwKSkKKwkgICAgZnByaW50Zihmb3V0LCJcblx0YS0+JXMuJXM6OnNvYXBfZGVmYXVsdChzb2FwKTsiLHAtPnN5bS0+bmFtZSwgY19pZGVudChwLT5pbmZvLnR5cCkpOworCSAgZWxzZSBpZiAocC0+aW5mby5oYXN2YWwpCisJICB7IGlmIChwLT5pbmZvLnR5cC0+dHlwZSA9PSBUcG9pbnRlciAmJiBpc19zdGRzdHJpbmcocC0+aW5mby50eXAtPnJlZikpCisJICAgICAgZnByaW50Zihmb3V0LCJcblx0c3RhdGljIHN0ZDo6c3RyaW5nIHNvYXBfdG1wXyVzKFwiJXNcIik7XG5cdGEtPiVzID0gJnNvYXBfdG1wXyVzOyIsIHAtPnN5bS0+bmFtZSwgcC0+aW5mby52YWwucywgcC0+c3ltLT5uYW1lLCBwLT5zeW0tPm5hbWUpOworCSAgICBlbHNlCisJICAgICAgZnByaW50Zihmb3V0LCJcblx0YS0+JXMlczsiLCBwLT5zeW0tPm5hbWUsY19pbml0KHApKTsKKwkgIH0KKwkgIGVsc2UgaWYgKHAtPmluZm8udHlwLT50eXBlID09IFRwb2ludGVyICYmICghaXNfc3RyaW5nKHAtPmluZm8udHlwKSB8fCBpc19YTUwocC0+aW5mby50eXApKSkKKwkgICAgZnByaW50Zihmb3V0LCJcblx0YS0+JXMgPSBOVUxMOyIsIHAtPnN5bS0+bmFtZSk7CisJICBlbHNlIGlmIChwLT5pbmZvLnR5cC0+dHlwZSAhPSBUZnVuICYmICFpc192b2lkKHAtPmluZm8udHlwKSkKKwkgICAgZnByaW50Zihmb3V0LCJcblx0c29hcF9kZWZhdWx0XyVzKHNvYXAsICZhLT4lcyk7IiwgY19pZGVudChwLT5pbmZvLnR5cCkscC0+c3ltLT5uYW1lKTsKKwl9CisgICAgICB9CisgICAgICBmcHJpbnRmKGZvdXQsIlxufSIpOwkgCisgICAgICBmZmx1c2goZm91dCk7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgVGFycmF5OgorICAgICAgaWYgKGlzX2V4dGVybmFsKHR5cCkpCisgICAgICB7IGZwcmludGYoZmhlYWQsIlxuU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9kZWZhdWx0XyVzKHN0cnVjdCBzb2FwKiwgJXMpOyIsY19pZGVudCh0eXApLGNfdHlwZSh0eXApKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgZnByaW50ZihmaGVhZCwiXG5TT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfJXMoc3RydWN0IHNvYXAqLCAlcyk7IixjX2lkZW50KHR5cCksY190eXBlKHR5cCkpOworICAgICAgZnByaW50Zihmb3V0LCJcblxuU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0XyVzKHN0cnVjdCBzb2FwICpzb2FwLCAlcylcbnsiLCBjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgImEiKSk7CisgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRpbnQgaTsiKTsKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdCh2b2lkKXNvYXA7IC8qIGFwcGVhc2UgLVdhbGwgLVdlcnJvciAqLyIpOworICAgICAgZnByaW50Zihmb3V0LCJcblx0Zm9yIChpID0gMDsgaSA8ICVkOyBpKyspIixnZXRfZGltZW5zaW9uKHR5cCkpOworICAgICAgdGVtcCA9IHR5cC0+cmVmOworICAgICAgY2FyZGluYWxpdHkgPSAxOworICAgICAgd2hpbGUodGVtcC0+dHlwZT09VGFycmF5KQorICAgICAgeworCSAgdGVtcD10ZW1wLT5yZWY7CisJICBjYXJkaW5hbGl0eSsrOworICAgICAgfQorICAgICAgaWYgKCgoVG5vZGUgKil0eXAtPnJlZiktPnR5cGUgPT0gVGNsYXNzICYmICFpc19leHRlcm5hbCh0eXAtPnJlZikgJiYgIWlzX3ZvbGF0aWxlKHR5cC0+cmVmKSkKKyAgICAgIHsKKyAgICAgIAlpZiAoY2FyZGluYWxpdHk+MSkKKwkJZnByaW50Zihmb3V0LCJhW2ldLiVzOjpzb2FwX2RlZmF1bHQoc29hcCkiLCB0X2lkZW50KHR5cC0+cmVmKSk7CisgICAgIAllbHNlCisJCWZwcmludGYoZm91dCwiKGEraSktPnNvYXBfZGVmYXVsdChzb2FwKSIpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoKChUbm9kZSopdHlwLT5yZWYpLT50eXBlID09IFRwb2ludGVyKQorICAgICAgCWZwcmludGYoZm91dCwiXG5cdGFbaV0gPSBOVUxMIik7CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAJZnByaW50Zihmb3V0LCJcblx0c29hcF9kZWZhdWx0XyVzKHNvYXAsIGEiLGNfaWRlbnQodHlwLT5yZWYpKTsKKyAgICAgIAlpZiAoY2FyZGluYWxpdHk+MSkKKwkJZnByaW50Zihmb3V0LCJbaV0pIik7CisgICAgIAkgZWxzZQorCQlmcHJpbnRmKGZvdXQsIitpKSIpOworICAgICAgfQorICAgICAgZnByaW50Zihmb3V0LCI7XG59Iik7CisgICAgICBicmVhazsJCisgICAgICAKKyAgICBjYXNlIFR0ZW1wbGF0ZToKKyAgICAgIGlmIChpc19leHRlcm5hbCh0eXApKQorICAgICAgeyBmcHJpbnRmKGZoZWFkLCJcblNPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfZGVmYXVsdF8lcyhzdHJ1Y3Qgc29hcCosICVzKTsiLGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiKiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgZnByaW50ZihmaGVhZCwiXG5TT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfJXMoc3RydWN0IHNvYXAqLCAlcyk7IixjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgIioiKSk7CisgICAgICBmcHJpbnRmKGZvdXQsIlxuXG5TT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfJXMoc3RydWN0IHNvYXAgKnNvYXAsICVzKVxueyIsY19pZGVudCh0eXApLGNfdHlwZV9pZCh0eXAsICIqcCIpKTsKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdHAtPmNsZWFyKCk7Iik7CisgICAgICBmcHJpbnRmKGZvdXQsIlxufSIpOworICAgICAgZmZsdXNoKGZvdXQpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdCAgICA6YnJlYWs7CisgICAgfQorICAKK30KKwordm9pZAorc29hcF9wdXQoVG5vZGUgKnR5cCkKK3sgaW50IGQ7CisgIEVudHJ5ICpwOworICBjaGFyICpjaSA9IGNfaWRlbnQodHlwKTsKKyAgY2hhciAqY3QgPSBjX3R5cGUodHlwKTsKKyAgY2hhciAqY3RhID0gY190eXBlX2lkKHR5cCwgImEiKTsKKyAgY2hhciAqY3RwID0gY190eXBlX2lkKHR5cCwgIioiKTsKKyAgY2hhciAqY3RwYSA9IGNfdHlwZV9pZCh0eXAsICIqYSIpOworICBjaGFyICpjdGMgPSBjX3R5cGVfaWQodHlwLCAiY29uc3QiKTsKKyAgY2hhciAqY3RjYSA9IGNfdHlwZV9pZCh0eXAsICJjb25zdCBhIik7CisgIGNoYXIgKmN0Y3AgPSBjX3R5cGVfaWQodHlwLCAiY29uc3QqIik7CisgIGNoYXIgKmN0Y3BhID0gY190eXBlX2lkKHR5cCwgImNvbnN0KmEiKTsKKworICBpZiAodHlwLT50eXBlID09IFR0ZW1wbGF0ZSB8fCB0eXAtPnR5cGUgPT0gVHVuaW9uKQorICAgIHJldHVybjsKKworICBpZiAodHlwLT50eXBlID09IFRhcnJheSkKKyAgeyBmcHJpbnRmKGZoZWFkLCJcblNPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfJXMoc3RydWN0IHNvYXAqLCAlcywgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsiLCBjaSxjdGMpOworICAgIGZwcmludGYoZm91dCwiXG5cblNPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfJXMoc3RydWN0IHNvYXAgKnNvYXAsICVzLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpXG57IiwgY2ksY3RjYSk7CisgIH0KKyAgZWxzZSBpZiAodHlwLT50eXBlID09IFRjbGFzcyAmJiAhaXNfZXh0ZXJuYWwodHlwKSAmJiAhaXNfdm9sYXRpbGUodHlwKSAmJiAhaXNfdHlwZWRlZih0eXApKQorICAgIGZwcmludGYoZm91dCwiXG5cbmludCAlczo6c29hcF9wdXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgIGNoYXIgKnR5cGUpIGNvbnN0XG57IiwgY3QpOworICBlbHNlIGlmICh0eXAtPnR5cGUgPT0gVHBvaW50ZXIpCisgIHsgZnByaW50ZihmaGVhZCwiXG5TT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0XyVzKHN0cnVjdCBzb2FwKiwgJXMsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7IiwgY2ksY3RjcCk7CisgICAgZnByaW50Zihmb3V0LCJcblxuU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF8lcyhzdHJ1Y3Qgc29hcCAqc29hcCwgJXMsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSlcbnsiLCBjaSxjdGNwYSk7CisgIH0KKyAgZWxzZQorICB7IGZwcmludGYoZmhlYWQsIlxuU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF8lcyhzdHJ1Y3Qgc29hcCosIGNvbnN0ICVzLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOyIsIGNpLGN0cCk7CisgICAgZnByaW50Zihmb3V0LCJcblxuU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF8lcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgJXMsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSlcbnsiLCBjaSxjdHBhKTsKKyAgfQorICBmZmx1c2goZm91dCk7CisgICAgZnByaW50Zihmb3V0LCJcblx0cmVnaXN0ZXIgaW50IGlkID0gIik7CisgICAgaWYgKGlzX2ludmlzaWJsZSh0eXAtPmlkLT5uYW1lKSkKKyAgICAgIGZwcmludGYoZm91dCwiMDsiKTsKKyAgICBlbHNlIGlmIChwID0gaXNfZHluYW1pY19hcnJheSh0eXApKQorICAgIHsgZCA9IGdldF9EYXJyYXlkaW1zKHR5cCk7CisgICAgICBpZiAodHlwLT50eXBlID09IFRjbGFzcyAmJiAhaXNfdm9sYXRpbGUodHlwKSAmJiAhaXNfdHlwZWRlZih0eXApKQorICAgICAgeyBpZiAoZCkKKyAgICAgICAgICBmcHJpbnRmKGZvdXQsInNvYXBfZW1iZWQoc29hcCwgKHZvaWQqKXRoaXMsIChzdHJ1Y3Qgc29hcF9hcnJheSopJnRoaXMtPiVzLCAlZCwgdGFnLCAlcyk7IiwgcC0+c3ltLT5uYW1lLCBkLCBzb2FwX3R5cGUodHlwKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBmcHJpbnRmKGZvdXQsInNvYXBfZW1iZWQoc29hcCwgKHZvaWQqKXRoaXMsIChzdHJ1Y3Qgc29hcF9hcnJheSopJnRoaXMtPiVzLCAxLCB0YWcsICVzKTsiLCBwLT5zeW0tPm5hbWUsIHNvYXBfdHlwZSh0eXApKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGQpCisgICAgICAgIGZwcmludGYoZm91dCwic29hcF9lbWJlZChzb2FwLCAodm9pZCopYSwgKHN0cnVjdCBzb2FwX2FycmF5KikmYS0+JXMsICVkLCB0YWcsICVzKTsiLCBwLT5zeW0tPm5hbWUsIGQsIHNvYXBfdHlwZSh0eXApKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZnByaW50Zihmb3V0LCJzb2FwX2VtYmVkKHNvYXAsICh2b2lkKilhLCAoc3RydWN0IHNvYXBfYXJyYXkqKSZhLT4lcywgMSwgdGFnLCAlcyk7IiwgcC0+c3ltLT5uYW1lLCBzb2FwX3R5cGUodHlwKSk7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cC0+dHlwZSA9PSBUY2xhc3MgJiYgIWlzX2V4dGVybmFsKHR5cCkgJiYgIWlzX3ZvbGF0aWxlKHR5cCkgJiYgIWlzX3R5cGVkZWYodHlwKSkKKyAgICAgIGZwcmludGYoZm91dCwic29hcF9lbWJlZChzb2FwLCAodm9pZCopdGhpcywgTlVMTCwgMCwgdGFnLCAlcyk7Iiwgc29hcF90eXBlKHR5cCkpOworICAgIGVsc2UKKyAgICAgIGZwcmludGYoZm91dCwic29hcF9lbWJlZChzb2FwLCAodm9pZCopYSwgTlVMTCwgMCwgdGFnLCAlcyk7Iiwgc29hcF90eXBlKHR5cCkpOworICBpZiAodHlwLT50eXBlID09IFRjbGFzcyAmJiAhaXNfZXh0ZXJuYWwodHlwKSAmJiAhaXNfdm9sYXRpbGUodHlwKSAmJiAhaXNfdHlwZWRlZih0eXApKQorICAgIGZwcmludGYoZm91dCwiXG5cdGlmICh0aGlzLT5zb2FwX291dChzb2FwLCB0YWcsIGlkLCB0eXBlKSlcblx0XHRyZXR1cm4gc29hcC0+ZXJyb3I7Iik7CisgIGVsc2UKKyAgICBmcHJpbnRmKGZvdXQsIlxuXHRpZiAoc29hcF9vdXRfJXMoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSkpXG5cdFx0cmV0dXJuIHNvYXAtPmVycm9yOyIsIGNpKTsKKyAgaWYgKCFpc19pbnZpc2libGUodHlwLT5pZC0+bmFtZSkpCisgICAgZnByaW50Zihmb3V0LCJcblx0cmV0dXJuIHNvYXBfcHV0aW5kZXBlbmRlbnQoc29hcCk7XG59Iik7CisgIGVsc2UKKyAgICBmcHJpbnRmKGZvdXQsIlxuXHRyZXR1cm4gU09BUF9PSztcbn0iKTsKKyAgZmZsdXNoKGZvdXQpOworfQorCitFbnRyeSAqCitpc19keW5hbWljX2FycmF5KFRub2RlICp0eXApCit7IEVudHJ5ICpwOworICBUYWJsZSAqdDsKKyAgaWYgKCh0eXAtPnR5cGUgPT0gVHN0cnVjdCB8fCB0eXAtPnR5cGUgPT0gVGNsYXNzKSAmJiB0eXAtPnJlZikKKyAgeyBmb3IgKHQgPSAoVGFibGUqKXR5cC0+cmVmOyB0OyB0ID0gdC0+cHJldikKKyAgICB7IHAgPSB0LT5saXN0OworICAgICAgaWYgKHAgJiYgcC0+aW5mby50eXAtPnR5cGUgPT0gVHBvaW50ZXIgJiYgIXN0cm5jbXAocC0+c3ltLT5uYW1lLCAiX19wdHIiLCA1KSkKKyAgICAgICAgaWYgKHAtPm5leHQgJiYgKHAtPm5leHQtPmluZm8udHlwLT50eXBlID09IFRpbnQgfHwgcC0+bmV4dC0+aW5mby50eXAtPnR5cGUgPT0gVHVsb25nIHx8IHAtPm5leHQtPmluZm8udHlwLT50eXBlID09IFRhcnJheSAmJiAoKChUbm9kZSopcC0+bmV4dC0+aW5mby50eXAtPnJlZiktPnR5cGUgPT0gVGludCB8fCAoKFRub2RlKilwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKS0+dHlwZSA9PSBUdWludCkpICYmICFzdHJjbXAocC0+bmV4dC0+c3ltLT5uYW1lLCAiX19zaXplIikpCisJICByZXR1cm4gcDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK0VudHJ5ICoKK2lzX2Rpc2NyaW1pbmFudChUbm9kZSAqdHlwKQoreyBFbnRyeSAqcDsKKyAgVGFibGUgKnQ7CisgIGlmICgodHlwLT50eXBlID09IFRzdHJ1Y3QgfHwgdHlwLT50eXBlID09IFRjbGFzcykgJiYgdHlwLT5yZWYpCisgIHsgZm9yICh0ID0gKFRhYmxlKil0eXAtPnJlZjsgdDsgdCA9IHQtPnByZXYpCisgICAgeyBwID0gdC0+bGlzdDsKKyAgICAgIGlmIChwICYmIHAtPmluZm8udHlwLT50eXBlID09IFRpbnQgJiYgIXN0cm5jbXAocC0+c3ltLT5uYW1lLCAiX191bmlvbiIsIDcpKQorICAgICAgICBpZiAocC0+bmV4dCAmJiBwLT5uZXh0LT5pbmZvLnR5cC0+dHlwZSA9PSBUdW5pb24gJiYgIXAtPm5leHQtPm5leHQpCisJICByZXR1cm4gcDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludAorZ2V0X0RhcnJheWRpbXMoVG5vZGUgKnR5cCkKK3sgRW50cnkgKnA7CisgIFRhYmxlICp0OworICBpZiAoKHR5cC0+dHlwZSA9PSBUc3RydWN0IHx8IHR5cC0+dHlwZSA9PSBUY2xhc3MpICYmIHR5cC0+cmVmKQorICB7IGZvciAodCA9IChUYWJsZSopdHlwLT5yZWY7IHQ7IHQgPSB0LT5wcmV2KQorICAgIHsgcCA9IHQtPmxpc3Q7CisgICAgICBpZiAocCAmJiBwLT5pbmZvLnR5cC0+dHlwZSA9PSBUcG9pbnRlciAmJiAhc3RybmNtcChwLT5zeW0tPm5hbWUsICJfX3B0ciIsIDUpKQorICAgICAgICBpZiAocC0+bmV4dCAmJiBwLT5uZXh0LT5pbmZvLnR5cC0+dHlwZSA9PSBUYXJyYXkgJiYgKCgoVG5vZGUqKXAtPm5leHQtPmluZm8udHlwLT5yZWYpLT50eXBlID09IFRpbnQgfHwgKChUbm9kZSopcC0+bmV4dC0+aW5mby50eXAtPnJlZiktPnR5cGUgPT0gVHVpbnQpICYmICFzdHJjbXAocC0+bmV4dC0+c3ltLT5uYW1lLCAiX19zaXplIikpCisgICAgICAgICAgcmV0dXJuIGdldF9kaW1lbnNpb24ocC0+bmV4dC0+aW5mby50eXApOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworaW50CitoYXNfb2Zmc2V0KFRub2RlICp0eXApCit7IEVudHJ5ICpwOworICBUYWJsZSAqdDsKKyAgaWYgKHR5cC0+dHlwZSA9PSBUc3RydWN0IHx8IHR5cC0+dHlwZSA9PSBUY2xhc3MpCisgIHsgZm9yICh0ID0gKFRhYmxlKil0eXAtPnJlZjsgdDsgdCA9IHQtPnByZXYpCisgICAgeyBmb3IgKHAgPSB0LT5saXN0OyBwOyBwID0gcC0+bmV4dCkKKyAgICAgIHsgaWYgKChwLT5pbmZvLnR5cC0+dHlwZSA9PSBUaW50IHx8IHAtPmluZm8udHlwLT50eXBlID09IFRhcnJheSAmJiAoKFRub2RlKilwLT5pbmZvLnR5cC0+cmVmKS0+dHlwZSA9PSBUaW50KSAmJiAhc3RyY21wKHAtPnN5bS0+bmFtZSwgIl9fb2Zmc2V0IikpCisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCitpbnQKK2lzX2hleEJpbmFyeShUbm9kZSAqdHlwKQoreyBFbnRyeSAqcDsKKyAgVGFibGUgKnQ7CisgIGludCBuID0gc3RybGVuKHR5cC0+aWQtPm5hbWUpOworICBpZiAoKHR5cC0+dHlwZSA9PSBUc3RydWN0IHx8IHR5cC0+dHlwZSA9PSBUY2xhc3MpICYmIG4gPj0gOSAmJiBpc19lcSh0eXAtPmlkLT5uYW1lICsgbiAtIDksICJoZXhCaW5hcnkiKSkKKyAgeyBmb3IgKHQgPSAoVGFibGUqKXR5cC0+cmVmOyB0OyB0ID0gdC0+cHJldikKKyAgICB7IHAgPSB0LT5saXN0OworICAgICAgaWYgKHAgJiYgcC0+aW5mby50eXAtPnR5cGUgPT0gVHBvaW50ZXIgJiYgKChUbm9kZSopcC0+aW5mby50eXAtPnJlZiktPnR5cGUgPT0gVHVjaGFyICYmICFzdHJjbXAocC0+c3ltLT5uYW1lLCAiX19wdHIiKSkKKyAgICAgIHsgcCA9IHAtPm5leHQ7CisgICAgICAgIHJldHVybiBwICYmIChwLT5pbmZvLnR5cC0+dHlwZSA9PSBUaW50IHx8IHAtPmluZm8udHlwLT50eXBlID09IFR1aW50KSAmJiAhc3RyY21wKHAtPnN5bS0+bmFtZSwgIl9fc2l6ZSIpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworaW50Citpc19iaW5hcnkoVG5vZGUgKnR5cCkKK3sgRW50cnkgKnA7CisgIFRhYmxlICp0OworICBpZiAoIWhhc19ucyh0eXApICYmICFpc19lbGVtZW50KHR5cCkpCisgICAgcmV0dXJuIDA7CisgIGlmICh0eXAtPnR5cGUgPT0gVHN0cnVjdCB8fCB0eXAtPnR5cGUgPT0gVGNsYXNzKSAKKyAgeyBmb3IgKHQgPSAoVGFibGUqKXR5cC0+cmVmOyB0OyB0ID0gdC0+cHJldikKKyAgICB7IHAgPSB0LT5saXN0OworICAgICAgaWYgKHAgJiYgcC0+aW5mby50eXAtPnR5cGUgPT0gVHBvaW50ZXIgJiYgKChUbm9kZSopcC0+aW5mby50eXAtPnJlZiktPnR5cGUgPT0gVHVjaGFyICYmICFzdHJjbXAocC0+c3ltLT5uYW1lLCAiX19wdHIiKSkKKyAgICAgIHsgcCA9IHAtPm5leHQ7CisgICAgICAgIHJldHVybiBwICYmIChwLT5pbmZvLnR5cC0+dHlwZSA9PSBUaW50IHx8IHAtPmluZm8udHlwLT50eXBlID09IFR1aW50KSAmJiAhc3RyY21wKHAtPnN5bS0+bmFtZSwgIl9fc2l6ZSIpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworaXNfYXR0YWNobWVudChUbm9kZSAqdHlwKQoreyBFbnRyeSAqcDsKKyAgVGFibGUgKnQ7CisgIGlmICghaXNfYmluYXJ5KHR5cCkgfHwgaXNfdHJhbnNpZW50KHR5cCkpCisgICAgcmV0dXJuIDA7CisgIGZvciAodCA9IChUYWJsZSopdHlwLT5yZWY7IHQ7IHQgPSB0LT5wcmV2KQorICB7IGZvciAocCA9IHQtPmxpc3Q7IHA7IHAgPSBwLT5uZXh0KQorICAgIHsgaWYgKGlzX3N0cmluZyhwLT5pbmZvLnR5cCkgJiYgIXN0cmNtcChwLT5zeW0tPm5hbWUsICJpZCIpKQorICAgICAgeyBwID0gcC0+bmV4dDsKKyAgICAgICAgaWYgKCFwIHx8ICFpc19zdHJpbmcocC0+aW5mby50eXApIHx8IHN0cmNtcChwLT5zeW0tPm5hbWUsICJ0eXBlIikpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHAgPSBwLT5uZXh0OworICAgICAgICBpZiAoIXAgfHwgIWlzX3N0cmluZyhwLT5pbmZvLnR5cCkgfHwgc3RyY21wKHAtPnN5bS0+bmFtZSwgIm9wdGlvbnMiKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCitpbnQKK2lzX2hlYWRlcl9vcl9mYXVsdChUbm9kZSAqdHlwKQoreyBpZiAodHlwLT50eXBlID09IFRwb2ludGVyIHx8IHR5cC0+dHlwZSA9PSBUcmVmZXJlbmNlKQorICAgIHJldHVybiBpc19oZWFkZXJfb3JfZmF1bHQodHlwLT5yZWYpOworICByZXR1cm4gKHR5cC0+dHlwZSA9PSBUc3RydWN0IHx8IHR5cC0+dHlwZSA9PSBUY2xhc3MpICYmICghc3RyY21wKHR5cC0+aWQtPm5hbWUsICJTT0FQX0VOVl9fSGVhZGVyIikgfHwgIXN0cmNtcCh0eXAtPmlkLT5uYW1lLCAiU09BUF9FTlZfX0ZhdWx0IikgfHwgIXN0cmNtcCh0eXAtPmlkLT5uYW1lLCAiU09BUF9FTlZfX0NvZGUiKSB8fCAhc3RyY21wKHR5cC0+aWQtPm5hbWUsICJTT0FQX0VOVl9fRGV0YWlsIikgfHwgIXN0cmNtcCh0eXAtPmlkLT5uYW1lLCAiU09BUF9FTlZfX1JlYXNvbiIpKTsKK30KKworaW50Citpc19ib2R5KFRub2RlICp0eXApCit7IGlmICh0eXAtPnR5cGUgPT0gVHBvaW50ZXIgfHwgdHlwLT50eXBlID09IFRyZWZlcmVuY2UpCisgICAgcmV0dXJuIGlzX2JvZHkodHlwLT5yZWYpOworICByZXR1cm4gKHR5cC0+dHlwZSA9PSBUc3RydWN0IHx8IHR5cC0+dHlwZSA9PSBUY2xhc3MpICYmICFzdHJjbXAodHlwLT5pZC0+bmFtZSwgIlNPQVBfRU5WX19Cb2R5Iik7Cit9CisKK2ludAoraXNfc29hcDEyKCkKK3sgcmV0dXJuICFzdHJjbXAoZW52VVJJLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIik7Cit9CisKK2ludAoraXNfZG9jdW1lbnQoY29uc3QgY2hhciAqc3R5bGUpCit7IHJldHVybiAhZWZsYWcgJiYgIXN0eWxlIHx8IHN0eWxlICYmICFzdHJjbXAoc3R5bGUsICJkb2N1bWVudCIpOworfQorCitpbnQKK2lzX2xpdGVyYWwoY29uc3QgY2hhciAqZW5jb2RpbmcpCit7IHJldHVybiAhZWZsYWcgJiYgIWVuY29kaW5nIHx8IGVuY29kaW5nICYmICFzdHJjbXAoZW5jb2RpbmcsICJsaXRlcmFsIik7Cit9CisKK2NoYXIgKgoraGFzX3NvYXByZWYoVG5vZGUgKnR5cCkKK3sgRW50cnkgKnA7CisgIFRhYmxlICp0OworICBpZiAodHlwLT50eXBlID09IFRzdHJ1Y3QgfHwgdHlwLT50eXBlID09IFRjbGFzcykgCisgIHsgZm9yICh0ID0gKFRhYmxlKil0eXAtPnJlZjsgdDsgdCA9IHQtPnByZXYpCisgICAgeyBmb3IgKHAgPSB0LT5saXN0OyBwOyBwID0gcC0+bmV4dCkKKyAgICAgICAgaWYgKHAtPmluZm8udHlwLT50eXBlID09IFRwb2ludGVyICYmICgoVG5vZGUqKXAtPmluZm8udHlwLT5yZWYpLT50eXBlID09IFRzdHJ1Y3QgJiYgKChUbm9kZSopcC0+aW5mby50eXAtPnJlZiktPmlkID09IGxvb2t1cCgic29hcCIpKQorICAgICAgICAgIHJldHVybiBwLT5zeW0tPm5hbWU7CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOworfQorCitpbnQKK2hhc19jb25zdHJ1Y3RvcihUbm9kZSAqdHlwKQoreyBFbnRyeSAqcCwgKnE7CisgIFRhYmxlICp0OworICBpZiAodHlwLT50eXBlID09IFRjbGFzcykgCisgICAgZm9yICh0ID0gKFRhYmxlKil0eXAtPnJlZjsgdDsgdCA9IHQtPnByZXYpCisgICAgICBmb3IgKHAgPSB0LT5saXN0OyBwOyBwID0gcC0+bmV4dCkKKyAgICAgICAgaWYgKHAtPmluZm8udHlwLT50eXBlID09IFRmdW4gJiYgIXN0cmNtcChwLT5zeW0tPm5hbWUsIHR5cC0+aWQtPm5hbWUpICYmICgoRk5pbmZvICopcC0+aW5mby50eXAtPnJlZiktPnJldC0+dHlwZSA9PSBUbm9uZSkKKwl7IHEgPSAoKEZOaW5mbyopcC0+aW5mby50eXAtPnJlZiktPmFyZ3MtPmxpc3Q7CisgICAgICAgICAgaWYgKCFxKQorCSAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICByZXR1cm4gMDsKK30KKworaW50CitoYXNfZGVzdHJ1Y3RvcihUbm9kZSAqdHlwKQoreyBFbnRyeSAqcCwgKnE7CisgIFRhYmxlICp0OworICBpZiAodHlwLT50eXBlID09IFRjbGFzcykgCisgICAgZm9yICh0ID0gKFRhYmxlKil0eXAtPnJlZjsgdDsgdCA9IHQtPnByZXYpCisgICAgICBmb3IgKHAgPSB0LT5saXN0OyBwOyBwID0gcC0+bmV4dCkKKyAgICAgICAgaWYgKHAtPmluZm8udHlwLT50eXBlID09IFRmdW4gJiYgKnAtPnN5bS0+bmFtZSA9PSAnficpCisJICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludAoraGFzX2dldHRlcihUbm9kZSAqdHlwKQoreyBFbnRyeSAqcCwgKnE7CisgIFRhYmxlICp0OworICBpZiAodHlwLT50eXBlID09IFRjbGFzcykgCisgICAgZm9yICh0ID0gKFRhYmxlKil0eXAtPnJlZjsgdDsgdCA9IHQtPnByZXYpCisgICAgICBmb3IgKHAgPSB0LT5saXN0OyBwOyBwID0gcC0+bmV4dCkKKyAgICAgICAgaWYgKHAtPmluZm8udHlwLT50eXBlID09IFRmdW4gJiYgIXN0cmNtcChwLT5zeW0tPm5hbWUsICJnZXQiKSAmJiAoKEZOaW5mbyAqKXAtPmluZm8udHlwLT5yZWYpLT5yZXQtPnR5cGUgPT0gVGludCkKKwl7IHEgPSAoKEZOaW5mbyopcC0+aW5mby50eXAtPnJlZiktPmFyZ3MtPmxpc3Q7CisgICAgICAgICAgaWYgKHEgJiYgcS0+aW5mby50eXAtPnR5cGUgPT0gVHBvaW50ZXIgJiYgKChUbm9kZSopcS0+aW5mby50eXAtPnJlZiktPnR5cGUgPT0gVHN0cnVjdCAmJiAoKFRub2RlKilxLT5pbmZvLnR5cC0+cmVmKS0+aWQgPT0gbG9va3VwKCJzb2FwIikpCisJICAgIHJldHVybiAxOworICAgICAgICB9CisgIHJldHVybiAwOworfQorCitpbnQKK2hhc19zZXR0ZXIoVG5vZGUgKnR5cCkKK3sgRW50cnkgKnAsICpxOworICBUYWJsZSAqdDsKKyAgaWYgKHR5cC0+dHlwZSA9PSBUY2xhc3MpIAorICAgIGZvciAodCA9IChUYWJsZSopdHlwLT5yZWY7IHQ7IHQgPSB0LT5wcmV2KQorICAgICAgZm9yIChwID0gdC0+bGlzdDsgcDsgcCA9IHAtPm5leHQpCisgICAgICAgIGlmIChwLT5pbmZvLnR5cC0+dHlwZSA9PSBUZnVuICYmICFzdHJjbXAocC0+c3ltLT5uYW1lLCAic2V0IikgJiYgKChGTmluZm8gKilwLT5pbmZvLnR5cC0+cmVmKS0+cmV0LT50eXBlID09IFRpbnQpCisJeyBxID0gKChGTmluZm8qKXAtPmluZm8udHlwLT5yZWYpLT5hcmdzLT5saXN0OworICAgICAgICAgIGlmIChxICYmIHEtPmluZm8udHlwLT50eXBlID09IFRwb2ludGVyICYmICgoVG5vZGUqKXEtPmluZm8udHlwLT5yZWYpLT50eXBlID09IFRzdHJ1Y3QgJiYgKChUbm9kZSopcS0+aW5mby50eXAtPnJlZiktPmlkID09IGxvb2t1cCgic29hcCIpKQorCSAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICByZXR1cm4gMDsKK30KKworaW50Citpc19wcmltaXRpdmVfb3Jfc3RyaW5nKFRub2RlICp0eXApCit7IHJldHVybiBpc19wcmltaXRpdmUodHlwKSB8fCBpc19zdHJpbmcodHlwKSB8fCBpc193c3RyaW5nKHR5cCkgfHwgaXNfc3Rkc3RyaW5nKHR5cCkgfHwgaXNfc3Rkd3N0cmluZyh0eXApOyAKK30KKworaW50Citpc19wcmltaXRpdmUoVG5vZGUgKnR5cCkKK3sgcmV0dXJuIHR5cC0+dHlwZSA8PSBUdGltZTsgCit9CisKK2ludAoraXNfc3RyaW5nKFRub2RlICp0eXApCit7IHJldHVybiB0eXAtPnR5cGUgPT0gVHBvaW50ZXIgJiYgKChUbm9kZSopdHlwLT5yZWYpLT50eXBlID09IFRjaGFyOworfQorCitpbnQKK2lzX3dzdHJpbmcoVG5vZGUgKnR5cCkKK3sgcmV0dXJuIHR5cC0+dHlwZSA9PSBUcG9pbnRlciAmJiAoKFRub2RlKil0eXAtPnJlZiktPnR5cGUgPT0gVHdjaGFyOworfQorCitpbnQKK2lzX3N0ZHN0cmluZyhUbm9kZSAqdHlwKQoreyByZXR1cm4gdHlwLT50eXBlID09IFRjbGFzcyAmJiB0eXAtPmlkID09IGxvb2t1cCgic3RkOjpzdHJpbmciKTsKK30KKworaW50Citpc19zdGR3c3RyaW5nKFRub2RlICp0eXApCit7IHJldHVybiB0eXAtPnR5cGUgPT0gVGNsYXNzICYmIHR5cC0+aWQgPT0gbG9va3VwKCJzdGQ6OndzdHJpbmciKTsKK30KKworaW50Citpc19zdGRzdHIoVG5vZGUgKnR5cCkKK3sgaWYgKHR5cC0+dHlwZSA9PSBUcG9pbnRlcikKKyAgICByZXR1cm4gaXNfc3Rkc3RyaW5nKHR5cC0+cmVmKSB8fCBpc19zdGR3c3RyaW5nKHR5cC0+cmVmKTsKKyAgcmV0dXJuIGlzX3N0ZHN0cmluZyh0eXApIHx8IGlzX3N0ZHdzdHJpbmcodHlwKTsKK30KKworaW50Citpc190eXBlZGVmKFRub2RlICp0eXApCit7IHJldHVybiB0eXAtPnN5bSAmJiAhaXNfdHJhbnNpZW50KHR5cCkgJiYgIWlzX2V4dGVybmFsKHR5cCk7Cit9CisKK2ludAorcmVmbGV2ZWwoVG5vZGUgKnR5cCkKK3sgaW50IGxldmVsOworICBmb3IgKGxldmVsID0gMDsgdHlwLT50eXBlID09IFRwb2ludGVyOyBsZXZlbCsrKQorICAgIHR5cCA9IChUbm9kZSopdHlwLT5yZWY7CisgIHJldHVybiBsZXZlbDsKK30KKworVG5vZGUgKgorcmVmdHlwZShUbm9kZSAqdHlwKQoreyB3aGlsZSAodHlwLT50eXBlID09IFRwb2ludGVyIHx8IHR5cC0+dHlwZSA9PSBUcmVmZXJlbmNlKQorICAgIHR5cCA9IHR5cC0+cmVmOworICByZXR1cm4gdHlwOworfQorCit2b2lkCitzb2FwX3NldF9hdHRyKFRub2RlICp0eXAsIGNoYXIgKm9iaiwgY2hhciAqbmFtZSwgY2hhciAqdGFnKQoreyBpZiAoaXNfcW5hbWUodHlwKSkKKyAgICBmcHJpbnRmKGZvdXQsICJcblx0aWYgKCVzLT4lcylcblx0XHRzb2FwX3NldF9hdHRyKHNvYXAsIFwiJXNcIiwgc29hcF9RTmFtZTJzKHNvYXAsICVzLT4lcykpOyIsIG9iaiwgbmFtZSwgdGFnLCBvYmosIG5hbWUpOworICBlbHNlIGlmIChpc19zdHJpbmcodHlwKSkKKyAgICBmcHJpbnRmKGZvdXQsICJcblx0aWYgKCVzLT4lcylcblx0XHRzb2FwX3NldF9hdHRyKHNvYXAsIFwiJXNcIiwgJXMtPiVzKTsiLCBvYmosIG5hbWUsIHRhZywgb2JqLCBuYW1lKTsKKyAgZWxzZSBpZiAoaXNfd3N0cmluZyh0eXApKQorICAgIGZwcmludGYoZm91dCwgIlxuXHRpZiAoJXMtPiVzKVxuXHRcdHNvYXBfc2V0X2F0dHIoc29hcCwgXCIlc1wiLCBzb2FwX3djaGFyMnMoc29hcCwgJXMtPiVzKSk7Iiwgb2JqLCBuYW1lLCB0YWcsIG9iaiwgbmFtZSk7CisgIGVsc2UgaWYgKGlzX3N0ZHFuYW1lKHR5cCkpCisgICAgZnByaW50Zihmb3V0LCAiXG5cdGlmICghJXMtPiVzLmVtcHR5KCkpXG5cdFx0c29hcF9zZXRfYXR0cihzb2FwLCBcIiVzXCIsIHNvYXBfUU5hbWUycyhzb2FwLCAlcy0+JXMuY19zdHIoKSkpOyIsIG9iaiwgbmFtZSwgdGFnLCBvYmosIG5hbWUpOworICBlbHNlIGlmIChpc19zdGRzdHJpbmcodHlwKSkKKyAgICBmcHJpbnRmKGZvdXQsICJcblx0aWYgKCElcy0+JXMuZW1wdHkoKSlcblx0XHRzb2FwX3NldF9hdHRyKHNvYXAsIFwiJXNcIiwgJXMtPiVzLmNfc3RyKCkpOyIsIG9iaiwgbmFtZSwgdGFnLCBvYmosIG5hbWUpOworICBlbHNlIGlmIChpc19zdGR3c3RyaW5nKHR5cCkpCisgICAgZnByaW50Zihmb3V0LCAiXG5cdGlmICghJXMtPiVzLmVtcHR5KCkpXG5cdFx0c29hcF9zZXRfYXR0cihzb2FwLCBcIiVzXCIsIHNvYXBfd2NoYXIycyhzb2FwLCAlcy0+JXMuY19zdHIoKSkpOyIsIG9iaiwgbmFtZSwgdGFnLCBvYmosIG5hbWUpOworICBlbHNlIGlmICh0eXAtPnR5cGUgPT0gVGxsb25nIHx8IHR5cC0+dHlwZSA9PSBUdWxsb25nKQorICAgIGZwcmludGYoZm91dCwgIlxuXHRzb2FwX3NldF9hdHRyKHNvYXAsIFwiJXNcIiwgc29hcF8lczJzKHNvYXAsICVzLT4lcykpOyIsIHRhZywgY190eXBlKHR5cCksIG9iaiwgbmFtZSk7CisgIGVsc2UgaWYgKHR5cC0+dHlwZSA9PSBUZW51bSkKKyAgICBmcHJpbnRmKGZvdXQsICJcblx0c29hcF9zZXRfYXR0cihzb2FwLCBcIiVzXCIsIHNvYXBfJXMycyhzb2FwLCAlcy0+JXMpKTsiLCB0YWcsIGNfaWRlbnQodHlwKSwgb2JqLCBuYW1lKTsKKyAgZWxzZSBpZiAodHlwLT50eXBlID09IFRwb2ludGVyKQorICB7IFRub2RlICpwdHIgPSB0eXAtPnJlZjsKKyAgICBmcHJpbnRmKGZvdXQsICJcblx0aWYgKCVzLT4lcykiLCBvYmosIG5hbWUpOworICAgIGlmIChwdHItPnR5cGUgPT0gVGxsb25nIHx8IHB0ci0+dHlwZSA9PSBUdWxsb25nKQorICAgICAgZnByaW50Zihmb3V0LCAiXG5cdFx0c29hcF9zZXRfYXR0cihzb2FwLCBcIiVzXCIsIHNvYXBfJXMycyhzb2FwLCAqJXMtPiVzKSk7IiwgdGFnLCBjX3R5cGUocHRyKSwgb2JqLCBuYW1lKTsKKyAgICBlbHNlIGlmIChwdHItPnR5cGUgPT0gVGVudW0pCisgICAgICBmcHJpbnRmKGZvdXQsICJcblx0XHRzb2FwX3NldF9hdHRyKHNvYXAsIFwiJXNcIiwgc29hcF8lczJzKHNvYXAsIColcy0+JXMpKTsiLCB0YWcsIGNfaWRlbnQocHRyKSwgb2JqLCBuYW1lKTsKKyAgICBlbHNlIGlmIChpc19zdGRxbmFtZShwdHIpKQorICAgICAgZnByaW50Zihmb3V0LCAiXG5cdFx0c29hcF9zZXRfYXR0cihzb2FwLCBcIiVzXCIsIHNvYXBfUU5hbWUycyhzb2FwLCAlcy0+JXMtPmNfc3RyKCkpKTsiLCB0YWcsIG9iaiwgbmFtZSk7CisgICAgZWxzZSBpZiAoaXNfc3Rkc3RyaW5nKHB0cikpCisgICAgICBmcHJpbnRmKGZvdXQsICJcblx0XHRzb2FwX3NldF9hdHRyKHNvYXAsIFwiJXNcIiwgJXMtPiVzLT5jX3N0cigpKTsiLCB0YWcsIG9iaiwgbmFtZSk7CisgICAgZWxzZSBpZiAoaXNfc3Rkd3N0cmluZyhwdHIpKQorICAgICAgZnByaW50Zihmb3V0LCAiXG5cdFx0c29hcF9zZXRfYXR0cihzb2FwLCBcIiVzXCIsIHNvYXBfd2NoYXIycyhzb2FwLCAlcy0+JXMtPmNfc3RyKCkpKTsiLCB0YWcsIG9iaiwgbmFtZSk7CisgICAgZWxzZSBpZiAoaXNfcHJpbWl0aXZlKHB0cikpCisgICAgICBmcHJpbnRmKGZvdXQsICJcblx0XHRzb2FwX3NldF9hdHRyKHNvYXAsIFwiJXNcIiwgc29hcF8lczJzKHNvYXAsIColcy0+JXMpKTsiLCB0YWcsIHRoZV90eXBlKHB0ciksIG9iaiwgbmFtZSk7CisgICAgZWxzZSBpZiAoaXNfaGV4QmluYXJ5KHB0cikpCisgICAgICBmcHJpbnRmKGZvdXQsICJcblx0XHRpZiAoJXMtPiVzLT5fX3B0cilcblx0XHRcdHNvYXBfc2V0X2F0dHIoc29hcCwgXCIlc1wiLCBzb2FwX3MyaGV4KHNvYXAsICVzLT4lcy0+X19wdHIsIE5VTEwsICVzLT4lcy0+X19zaXplKSk7Iiwgb2JqLCBuYW1lLCB0YWcsIG9iaiwgbmFtZSwgb2JqLCBuYW1lKTsKKyAgICBlbHNlIGlmIChpc19iaW5hcnkocHRyKSkKKyAgICAgIGZwcmludGYoZm91dCwgIlxuXHRcdGlmICglcy0+JXMtPl9fcHRyKVxuXHRcdFx0c29hcF9zZXRfYXR0cihzb2FwLCBcIiVzXCIsIHNvYXBfczJiYXNlNjQoc29hcCwgJXMtPiVzLT5fX3B0ciwgTlVMTCwgJXMtPiVzLT5fX3NpemUpKTsiLCBvYmosIG5hbWUsIHRhZywgb2JqLCBuYW1lLCBvYmosIG5hbWUpOworICAgIGVsc2UKKyAgICB7IHNwcmludGYoZXJyYnVmLCAiRmllbGQgJyVzJyBjYW5ub3QgYmUgc2VyaWFsaXplZCBhcyBYTUwgYXR0cmlidXRlIiwgbmFtZSk7CisgICAgICBzZW13YXJuKGVycmJ1Zik7CisgICAgfQorICB9CisgIGVsc2UgaWYgKGlzX3ByaW1pdGl2ZSh0eXApKQorICAgIGZwcmludGYoZm91dCwgIlxuXHRzb2FwX3NldF9hdHRyKHNvYXAsIFwiJXNcIiwgc29hcF8lczJzKHNvYXAsICVzLT4lcykpOyIsIHRhZywgdGhlX3R5cGUodHlwKSwgb2JqLCBuYW1lKTsKKyAgZWxzZSBpZiAoaXNfaGV4QmluYXJ5KHR5cCkpCisgICAgZnByaW50Zihmb3V0LCAiXG5cdGlmICglcy0+JXMuX19wdHIpXG5cdFx0c29hcF9zZXRfYXR0cihzb2FwLCBcIiVzXCIsIHNvYXBfczJoZXgoc29hcCwgJXMtPiVzLl9fcHRyLCBOVUxMLCAlcy0+JXMuX19zaXplKSk7Iiwgb2JqLCBuYW1lLCB0YWcsIG9iaiwgbmFtZSwgb2JqLCBuYW1lKTsKKyAgZWxzZSBpZiAoaXNfYmluYXJ5KHR5cCkpCisgICAgZnByaW50Zihmb3V0LCAiXG5cdGlmICglcy0+JXMuX19wdHIpXG5cdFx0c29hcF9zZXRfYXR0cihzb2FwLCBcIiVzXCIsIHNvYXBfczJiYXNlNjQoc29hcCwgJXMtPiVzLl9fcHRyLCBOVUxMLCAlcy0+JXMuX19zaXplKSk7Iiwgb2JqLCBuYW1lLCB0YWcsIG9iaiwgbmFtZSwgb2JqLCBuYW1lKTsKKyAgZWxzZQorICB7IHNwcmludGYoZXJyYnVmLCAiRmllbGQgJyVzJyBjYW5ub3QgYmUgc2VyaWFsaXplZCBhcyBYTUwgYXR0cmlidXRlIiwgbmFtZSk7CisgICAgc2Vtd2FybihlcnJidWYpOworICB9Cit9CisKK3ZvaWQKK3NvYXBfYXR0cl92YWx1ZShFbnRyeSAqcCwgY2hhciAqb2JqLCBjaGFyICpuYW1lLCBjaGFyICp0YWcpCit7IGludCBmbGFnID0gMDsKKyAgVG5vZGUgKnR5cCA9IHAtPmluZm8udHlwOworICBpZiAocC0+aW5mby5tYXhPY2N1cnMgPT0gMCkKKyAgICBmbGFnID0gMjsgLyogcHJvaGliaXRlZCAqLworICBlbHNlIGlmIChwLT5pbmZvLm1pbk9jY3VycyA+PSAxICYmICFwLT5pbmZvLmhhc3ZhbCkKKyAgICBmbGFnID0gMTsgLyogcmVxdWlyZWQgKi8KKyAgaWYgKHR5cC0+dHlwZSA9PSBUbGxvbmcgfHwgdHlwLT50eXBlID09IFR1bGxvbmcpCisgICAgZnByaW50Zihmb3V0LCAiXG5cdGlmIChzb2FwX3MyJXMoc29hcCwgc29hcF9hdHRyX3ZhbHVlKHNvYXAsIFwiJXNcIiwgJWQpLCAmJXMtPiVzKSlcblx0XHRyZXR1cm4gTlVMTDsiLCBjX3R5cGUodHlwKSwgdGFnLCBmbGFnLCBvYmosIG5hbWUpOworICBlbHNlIGlmICh0eXAtPnR5cGUgPT0gVGVudW0pCisgICAgZnByaW50Zihmb3V0LCAiXG5cdGlmIChzb2FwX3MyJXMoc29hcCwgc29hcF9hdHRyX3ZhbHVlKHNvYXAsIFwiJXNcIiwgJWQpLCAmJXMtPiVzKSlcblx0XHRyZXR1cm4gTlVMTDsiLCBjX2lkZW50KHR5cCksIHRhZywgZmxhZywgb2JqLCBuYW1lKTsKKyAgZWxzZSBpZiAoaXNfcW5hbWUodHlwKSkKKyAgICBmcHJpbnRmKGZvdXQsICJcblx0aWYgKHNvYXBfczJRTmFtZShzb2FwLCBzb2FwX2F0dHJfdmFsdWUoc29hcCwgXCIlc1wiLCAlZCksICYlcy0+JXMpKVxuXHRcdHJldHVybiBOVUxMOyIsIHRhZywgZmxhZywgb2JqLCBuYW1lKTsKKyAgZWxzZSBpZiAoaXNfc3RyaW5nKHR5cCkpCisgICAgZnByaW50Zihmb3V0LCAiXG5cdGlmIChzb2FwX3Myc3RyaW5nKHNvYXAsIHNvYXBfYXR0cl92YWx1ZShzb2FwLCBcIiVzXCIsICVkKSwgJiVzLT4lcykpXG5cdFx0cmV0dXJuIE5VTEw7IiwgdGFnLCBmbGFnLCBvYmosIG5hbWUpOworICBlbHNlIGlmIChpc193c3RyaW5nKHR5cCkpCisgICAgZnByaW50Zihmb3V0LCAiXG5cdGlmIChzb2FwX3Myd2NoYXIoc29hcCwgc29hcF9hdHRyX3ZhbHVlKHNvYXAsIFwiJXNcIiwgJWQpLCAmJXMtPiVzKSlcblx0XHRyZXR1cm4gTlVMTDsiLCB0YWcsIGZsYWcsIG9iaiwgbmFtZSk7CisgIGVsc2UgaWYgKGlzX3N0ZHFuYW1lKHR5cCkpCisgICAgZnByaW50Zihmb3V0LCAiXG5cdHtcdGNvbnN0IGNoYXIgKnQgPSBzb2FwX2F0dHJfdmFsdWUoc29hcCwgXCIlc1wiLCAlZCk7XG5cdFx0aWYgKHQpXG5cdFx0e1x0Y2hhciAqcztcblx0XHRcdGlmIChzb2FwX3MyUU5hbWUoc29hcCwgdCwgJnMpKVxuXHRcdFx0XHRyZXR1cm4gTlVMTDtcblx0XHRcdCVzLT4lcy5hc3NpZ24ocyk7XG5cdFx0fVxuXHR9IiwgdGFnLCBmbGFnLCBvYmosIG5hbWUpOworICBlbHNlIGlmIChpc19zdGRzdHJpbmcodHlwKSkKKyAgICBmcHJpbnRmKGZvdXQsICJcblx0e1x0Y29uc3QgY2hhciAqdCA9IHNvYXBfYXR0cl92YWx1ZShzb2FwLCBcIiVzXCIsICVkKTtcblx0XHRpZiAodClcblx0XHR7XHRjaGFyICpzO1xuXHRcdFx0aWYgKHNvYXBfczJzdHJpbmcoc29hcCwgdCwgJnMpKVxuXHRcdFx0XHRyZXR1cm4gTlVMTDtcblx0XHRcdCVzLT4lcy5hc3NpZ24ocyk7XG5cdFx0fVxuXHR9IiwgdGFnLCBmbGFnLCBvYmosIG5hbWUpOworICBlbHNlIGlmIChpc19zdGR3c3RyaW5nKHR5cCkpCisgICAgZnByaW50Zihmb3V0LCAiXG5cdHtcdGNvbnN0IGNoYXIgKnQgPSBzb2FwX2F0dHJfdmFsdWUoc29hcCwgXCIlc1wiLCAlZCk7XG5cdFx0aWYgKHQpXG5cdFx0e1x0Y2hhciAqcztcblx0XHRcdGlmIChzb2FwX3Myd2NoYXIoc29hcCwgdCwgJnMpKVxuXHRcdFx0XHRyZXR1cm4gTlVMTDtcblx0XHRcdCVzLT4lcy5hc3NpZ24ocyk7XG5cdFx0fVxuXHR9IiwgdGFnLCBmbGFnLCBvYmosIG5hbWUpOworICBlbHNlIGlmICh0eXAtPnR5cGUgPT0gVHBvaW50ZXIpCisgIHsgVG5vZGUgKnB0ciA9IHR5cC0+cmVmOworICAgIGZwcmludGYoZm91dCwgIlxuXHR7XHRjb25zdCBjaGFyICp0ID0gc29hcF9hdHRyX3ZhbHVlKHNvYXAsIFwiJXNcIiwgJWQpO1xuXHRcdGlmICh0KSIsIHRhZywgZmxhZyk7CisgICAgZnByaW50Zihmb3V0LCAiXG5cdFx0e1x0aWYgKCEoJXMtPiVzID0gKCVzKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZiglcykpKSlcblx0XHRcdHtcdHNvYXAtPmVycm9yID0gU09BUF9FT007XG5cdFx0XHRcdHJldHVybiBOVUxMO1xuXHRcdFx0fSIsIG9iaiwgbmFtZSwgY190eXBlKHR5cCksIGNfdHlwZShwdHIpKTsKKyAgICBpZiAocHRyLT50eXBlID09IFRsbG9uZyB8fCBwdHItPnR5cGUgPT0gVHVsbG9uZykKKyAgICAgIGZwcmludGYoZm91dCwgIlxuXHRpZiAoc29hcF9zMiVzKHNvYXAsIHQsICVzLT4lcykpXG5cdFx0cmV0dXJuIE5VTEw7IiwgY190eXBlKHB0ciksIG9iaiwgbmFtZSk7CisgICAgZWxzZSBpZiAocHRyLT50eXBlID09IFRlbnVtKQorICAgICAgZnByaW50Zihmb3V0LCAiXG5cdGlmIChzb2FwX3MyJXMoc29hcCwgdCwgJXMtPiVzKSlcblx0XHRyZXR1cm4gTlVMTDsiLCBjX2lkZW50KHB0ciksIG9iaiwgbmFtZSk7CisgICAgZWxzZSBpZiAoaXNfc3RkcW5hbWUocHRyKSkKKyAgICAgIGZwcmludGYoZm91dCwgIlxuXHRjaGFyICpzO1xuXHRcdGlmIChzb2FwX3MyUU5hbWUoc29hcCwgdCwgJnMpKVxuXHRcdFx0cmV0dXJuIE5VTEw7XG5cdFx0aWYgKHMpXG5cdFx0e1x0JXMtPiVzID0gc29hcF9uZXdfc3RkX19zdHJpbmcoc29hcCwgLTEpO1xuXHRcdFx0JXMtPiVzLT5hc3NpZ24ocyk7XG5cdFx0fSIsIG9iaiwgbmFtZSwgb2JqLCBuYW1lKTsKKyAgICBlbHNlIGlmIChpc19zdGRzdHJpbmcocHRyKSkKKyAgICAgIGZwcmludGYoZm91dCwgIlxuXHRjaGFyICpzO1xuXHRcdGlmIChzb2FwX3Myc3RyaW5nKHNvYXAsIHQsICZzKSlcblx0XHRcdHJldHVybiBOVUxMO1xuXHRcdGlmIChzKVxuXHRcdHtcdCVzLT4lcyA9IHNvYXBfbmV3X3N0ZF9fc3RyaW5nKHNvYXAsIC0xKTtcblx0XHRcdCVzLT4lcy0+YXNzaWduKHMpO1xuXHRcdH0iLCBvYmosIG5hbWUsIG9iaiwgbmFtZSk7CisgICAgZWxzZSBpZiAoaXNfc3Rkd3N0cmluZyhwdHIpKQorICAgICAgZnByaW50Zihmb3V0LCAiXG5cdHdjaGFyX3QgKnM7XG5cdFx0aWYgKHNvYXBfczJ3Y2hhcihzb2FwLCB0LCAmcykpXG5cdFx0XHRyZXR1cm4gTlVMTDtcblx0XHRpZiAocylcblx0XHR7XHQlcy0+JXMgPSBzb2FwX25ld19zdGRfX3dzdHJpbmcoc29hcCwgLTEpO1xuXHRcdFx0JXMtPiVzLT5hc3NpZ24ocyk7XG5cdFx0fSIsIG9iaiwgbmFtZSwgb2JqLCBuYW1lKTsKKyAgICBlbHNlIGlmIChpc19oZXhCaW5hcnkocHRyKSkKKyAgICAgIGZwcmludGYoZm91dCwgIlxuXHRpZiAoISglcy0+JXMtPl9fcHRyID0gKHVuc2lnbmVkIGNoYXIqKXNvYXBfaGV4MnMoc29hcCwgc29hcF9hdHRyX3ZhbHVlKHNvYXAsIFwiJXNcIiwgJWQpLCBOVUxMLCAwLCAmJXMtPiVzLT5fX3NpemUpKSlcblx0XHRyZXR1cm4gTlVMTDsiLCBvYmosIG5hbWUsIHRhZywgZmxhZywgb2JqLCBuYW1lKTsKKyAgICBlbHNlIGlmIChpc19iaW5hcnkocHRyKSkKKyAgICAgIGZwcmludGYoZm91dCwgIlxuXHRpZiAoISglcy0+JXMtPl9fcHRyID0gKHVuc2lnbmVkIGNoYXIqKXNvYXBfYmFzZTY0MnMoc29hcCwgc29hcF9hdHRyX3ZhbHVlKHNvYXAsIFwiJXNcIiwgJWQpLCBOVUxMLCAwLCAmJXMtPiVzLT5fX3NpemUpKSlcblx0XHRyZXR1cm4gTlVMTDsiLCBvYmosIG5hbWUsIHRhZywgZmxhZywgb2JqLCBuYW1lKTsKKyAgICBlbHNlCisgICAgICBmcHJpbnRmKGZvdXQsICJcblx0aWYgKHNvYXBfczIlcyhzb2FwLCB0LCAlcy0+JXMpKVxuXHRcdHJldHVybiBOVUxMOyIsIHRoZV90eXBlKHB0ciksIG9iaiwgbmFtZSk7CisgICAgZnByaW50Zihmb3V0LCAiXG5cdFx0fVxuXHR9Iik7CisgIH0KKyAgZWxzZSBpZiAoaXNfaGV4QmluYXJ5KHR5cCkpCisgICAgZnByaW50Zihmb3V0LCAiXG5cdGlmICghKCVzLT4lcy5fX3B0ciA9ICh1bnNpZ25lZCBjaGFyKilzb2FwX2hleDJzKHNvYXAsIHNvYXBfYXR0cl92YWx1ZShzb2FwLCBcIiVzXCIsICVkKSwgTlVMTCwgMCwgJiVzLT4lcy5fX3NpemUpKSlcblx0XHRyZXR1cm4gTlVMTDsiLCBvYmosIG5hbWUsIHRhZywgZmxhZywgb2JqLCBuYW1lKTsKKyAgZWxzZSBpZiAoaXNfYmluYXJ5KHR5cCkpCisgICAgZnByaW50Zihmb3V0LCAiXG5cdGlmICghKCVzLT4lcy5fX3B0ciA9ICh1bnNpZ25lZCBjaGFyKilzb2FwX2Jhc2U2NDJzKHNvYXAsIHNvYXBfYXR0cl92YWx1ZShzb2FwLCBcIiVzXCIsICVkKSwgTlVMTCwgMCwgJiVzLT4lcy5fX3NpemUpKSlcblx0XHRyZXR1cm4gTlVMTDsiLCBvYmosIG5hbWUsIHRhZywgZmxhZywgb2JqLCBuYW1lKTsKKyAgZWxzZSBpZiAoaXNfcHJpbWl0aXZlKHR5cCkpCisgICAgZnByaW50Zihmb3V0LCAiXG5cdGlmIChzb2FwX3MyJXMoc29hcCwgc29hcF9hdHRyX3ZhbHVlKHNvYXAsIFwiJXNcIiwgJWQpLCAmJXMtPiVzKSlcblx0XHRyZXR1cm4gTlVMTDsiLCB0aGVfdHlwZSh0eXApLCB0YWcsIGZsYWcsIG9iaiwgbmFtZSk7Cit9CisKK2NoYXIgKgorcHRyX2Nhc3QoVG5vZGUgKnR5cCwgY2hhciAqbmFtZSkKK3sgY2hhciAqcyA9IGNfdHlwZV9pZCh0eXAsICIqIik7CisgIGNoYXIgKnQgPSBlbWFsbG9jKHN0cmxlbihzKSArIHN0cmxlbihuYW1lKSArIDYpOworICBzcHJpbnRmKHQsICIoKCVzKSVzKSIsIHMsIG5hbWUpOworICByZXR1cm4gdDsKK30KKwordm9pZAorc29hcF9vdXQoVG5vZGUgKnR5cCkKK3sgVGFibGUgKnRhYmxlLCp0OworICBFbnRyeSAqcDsKKyAgaW50IGNhcmRpbmFsaXR5LGksaixkOworICBUbm9kZSAqbjsKKyAgY2hhciAqbnNlID0gbnNfcXVhbGlmaWVkRWxlbWVudCh0eXApOworICBjaGFyICpuc2EgPSBuc19xdWFsaWZpZWRBdHRyaWJ1dGUodHlwKTsKKworICBpZiAoaXNfZHluYW1pY19hcnJheSh0eXApKQorICB7IHNvYXBfb3V0X0RhcnJheSh0eXApOworICAgIHJldHVybjsKKyAgfQorICBpZiAoaXNfcHJpbWl0aXZlKHR5cCkgJiYgdHlwLT50eXBlICE9IFRlbnVtKQorICB7IGlmIChpc19leHRlcm5hbCh0eXApKQorICAgIHsgZnByaW50ZihmaGVhZCwiXG5TT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0XyVzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgJXMsIGNvbnN0IGNoYXIqKTsiLCBjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgIioiKSk7IAorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmcHJpbnRmKGZoZWFkLCJcblNPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfJXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCAlcywgY29uc3QgY2hhciopOyIsIGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiKiIpKTsgCisgICAgZnByaW50Zihmb3V0LCJcblxuU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF8lcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0ICVzLCBjb25zdCBjaGFyICp0eXBlKVxueyIsIGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiKmEiKSk7IAorICAgIGlmICh0eXAtPnR5cGUgPT0gVGxsb25nIHx8IHR5cC0+dHlwZSA9PSBUdWxsb25nKQorICAgICAgZnByaW50Zihmb3V0LCJcblx0cmV0dXJuIHNvYXBfb3V0JXMoc29hcCwgdGFnLCBpZCwgYSwgdHlwZSwgJXMpO1xufSIsIGNfdHlwZSh0eXApLCBzb2FwX3R5cGUodHlwKSk7IAorICAgIGVsc2UKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdHJldHVybiBzb2FwX291dCVzKHNvYXAsIHRhZywgaWQsIGEsIHR5cGUsICVzKTtcbn0iLCB0aGVfdHlwZSh0eXApLCBzb2FwX3R5cGUodHlwKSk7IAorICAgIHJldHVybjsKKyAgfQorICBpZiAoaXNfc3RyaW5nKHR5cCkpCisgIHsgaWYgKGlzX2V4dGVybmFsKHR5cCkpCisgICAgeyBmcHJpbnRmKGZoZWFkLCJcblNPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRfJXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjaGFyKmNvbnN0KiwgY29uc3QgY2hhciopOyIsIGNfaWRlbnQodHlwKSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGZwcmludGYoZmhlYWQsIlxuU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF8lcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNoYXIqY29uc3QqLCBjb25zdCBjaGFyKik7IiwgY19pZGVudCh0eXApKTsKKyAgICBmcHJpbnRmKGZvdXQsIlxuXG5TT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0XyVzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY2hhciAqY29uc3QqYSwgY29uc3QgY2hhciAqdHlwZSlcbnsiLCBjX2lkZW50KHR5cCkpOworICAgIGZwcmludGYoZm91dCwiXG5cdHJldHVybiBzb2FwX291dHN0cmluZyhzb2FwLCB0YWcsIGlkLCBhLCB0eXBlLCAlcyk7XG59Iiwgc29hcF90eXBlKHR5cCkpOyAKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGlzX3dzdHJpbmcodHlwKSkKKyAgeyBpZiAoaXNfZXh0ZXJuYWwodHlwKSkKKyAgICB7IGZwcmludGYoZmhlYWQsIlxuU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dF8lcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIHdjaGFyX3QqY29uc3QqLCBjb25zdCBjaGFyKik7IiwgY19pZGVudCh0eXApKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmcHJpbnRmKGZoZWFkLCJcblNPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfJXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCB3Y2hhcl90KmNvbnN0KiwgY29uc3QgY2hhciopOyIsIGNfaWRlbnQodHlwKSk7CisgICAgZnByaW50Zihmb3V0LCJcblxuU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF8lcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIHdjaGFyX3QgKmNvbnN0KmEsIGNvbnN0IGNoYXIgKnR5cGUpXG57IiwgY19pZGVudCh0eXApKTsKKyAgICBmcHJpbnRmKGZvdXQsIlxuXHRyZXR1cm4gc29hcF9vdXR3c3RyaW5nKHNvYXAsIHRhZywgaWQsIGEsIHR5cGUsICVzKTtcbn0iLCBzb2FwX3R5cGUodHlwKSk7IAorICAgIHJldHVybjsKKyAgfQorICBpZiAoaXNfc3Rkc3RyaW5nKHR5cCkpCisgIHsgZnByaW50ZihmaGVhZCwiXG5TT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0XyVzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RkOjpzdHJpbmcqLCBjb25zdCBjaGFyKik7IiwgY19pZGVudCh0eXApKTsgCisgICAgZnByaW50Zihmb3V0LCJcblNPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfJXMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzdGQ6OnN0cmluZyAqcywgY29uc3QgY2hhciAqdHlwZSlcbntcblx0aWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBzLCAlcyksIHR5cGUpIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzLT5jX3N0cigpLCAwKSB8fCBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpKVxuXHRcdHJldHVybiBzb2FwLT5lcnJvcjtcblx0cmV0dXJuIFNPQVBfT0s7XG59IiwgY19pZGVudCh0eXApLCBzb2FwX3R5cGUodHlwKSk7CisgICAgcmV0dXJuOworICB9CisgIGlmIChpc19zdGRzdHJpbmcodHlwKSkKKyAgeyBmcHJpbnRmKGZoZWFkLCJcblNPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfJXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdGQ6OnN0cmluZyosIGNvbnN0IGNoYXIqKTsiLCBjX2lkZW50KHR5cCkpOyAKKyAgICBmcHJpbnRmKGZvdXQsIlxuU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF8lcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHN0ZDo6c3RyaW5nICpzLCBjb25zdCBjaGFyICp0eXBlKVxue1xuXHRpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHMsICVzKSwgdHlwZSkgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHMtPmNfc3RyKCksIDApIHx8IHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZykpXG5cdFx0cmV0dXJuIHNvYXAtPmVycm9yO1xuXHRyZXR1cm4gU09BUF9PSztcbn0iLCBjX2lkZW50KHR5cCksIHNvYXBfdHlwZSh0eXApKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGlzX3N0ZHdzdHJpbmcodHlwKSkKKyAgeyBmcHJpbnRmKGZoZWFkLCJcblNPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfJXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdGQ6OndzdHJpbmcqLCBjb25zdCBjaGFyKik7IiwgY19pZGVudCh0eXApKTsgCisgICAgZnByaW50Zihmb3V0LCJcblNPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfJXMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzdGQ6OndzdHJpbmcgKnMsIGNvbnN0IGNoYXIgKnR5cGUpXG57XG5cdGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcywgJXMpLCB0eXBlKSB8fCBzb2FwX3dzdHJpbmdfb3V0KHNvYXAsIHMtPmNfc3RyKCksIDApIHx8IHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZykpXG5cdFx0cmV0dXJuIHNvYXAtPmVycm9yO1xuXHRyZXR1cm4gU09BUF9PSztcbn0iLCBjX2lkZW50KHR5cCksIHNvYXBfdHlwZSh0eXApKTsKKyAgICByZXR1cm47CisgIH0KKyAgc3dpdGNoKHR5cC0+dHlwZSkKKyAgeyBjYXNlIFRzdHJ1Y3Q6CisgICAgICB0YWJsZT0oVGFibGUqKXR5cC0+cmVmOworICAgICAgaWYgKGlzX2V4dGVybmFsKHR5cCkpCisgICAgICB7IGZwcmludGYoZmhlYWQsIlxuU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dF8lcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0ICVzLCBjb25zdCBjaGFyKik7IiwgY19pZGVudCh0eXApLGNfdHlwZV9pZCh0eXAsICIqIikpOyAKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgZnByaW50ZihmaGVhZCwiXG5TT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0XyVzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgJXMsIGNvbnN0IGNoYXIqKTsiLCBjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgIioiKSk7IAorICAgICAgZnByaW50Zihmb3V0LCJcblxuU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF8lcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0ICVzLCBjb25zdCBjaGFyICp0eXBlKVxueyIsIGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiKmEiKSk7IAorICAgICAgZm9yICh0ID0gdGFibGU7IHQ7IHQgPSB0LT5wcmV2KQorICAgICAgewlmb3IgKHAgPSB0LT5saXN0OyBwOyBwID0gcC0+bmV4dCkKKwl7IGlmIChwLT5pbmZvLnN0byAmIFNhdHRyaWJ1dGUpCisJICAgIHNvYXBfc2V0X2F0dHIocC0+aW5mby50eXAsICJhIiwgcC0+c3ltLT5uYW1lLCBuc19hZGQocC0+c3ltLT5uYW1lLCBuc2EpKTsKKwkgIGVsc2UgaWYgKGlzX3FuYW1lKHAtPmluZm8udHlwKSkKKyAgICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdGNvbnN0IGNoYXIgKnNvYXBfdG1wXyVzID0gc29hcF9RTmFtZTJzKHNvYXAsIGEtPiVzKTsiLCBwLT5zeW0tPm5hbWUsIHAtPnN5bS0+bmFtZSk7CisJICBlbHNlIGlmIChpc19zdGRxbmFtZShwLT5pbmZvLnR5cCkpCisgICAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRzdGQ6OnN0cmluZyBzb2FwX3RtcF8lcyhzb2FwX1FOYW1lMnMoc29hcCwgYS0+JXMuY19zdHIoKSkpOyIsIHAtPnN5bS0+bmFtZSwgcC0+c3ltLT5uYW1lKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICBpZiAoaXNfcHJpbWNsYXNzKHR5cCkpCisgICAgIHsKKwlmb3IgKHRhYmxlID0gKFRhYmxlKil0eXAtPnJlZjsgdGFibGU7IHRhYmxlID0gdGFibGUtPnByZXYpCisJeyBwID0gdGFibGUtPmxpc3Q7CisJICBpZiAocCAmJiBpc19pdGVtKHApKQorCSAgICBicmVhazsKKyAgICAgICAgfQorCSAgaWYgKChwLT5pbmZvLnN0byAmIFNtdXN0VW5kZXJzdGFuZCkgJiYgIShwLT5pbmZvLnN0byAmIChTY29uc3QgfCBTcHJpdmF0ZSB8IFNwcm90ZWN0ZWQpKSAmJiAhKHAtPmluZm8uc3RvICYgU2F0dHJpYnV0ZSkgJiYgIWlzX3RyYW5zaWVudChwLT5pbmZvLnR5cCkgJiYgIWlzX3ZvaWQocC0+aW5mby50eXApICYmIHAtPmluZm8udHlwLT50eXBlICE9IFRmdW4pCisJICAgIGZwcmludGYoZm91dCwgIlxuXHRzb2FwLT5tdXN0VW5kZXJzdGFuZCA9IDE7Iik7CisJICBpZihwLT5pbmZvLnR5cC0+dHlwZT09VGFycmF5KQorCSAgICBmcHJpbnRmKGZvdXQsIlxuXHRyZXR1cm4gc29hcF9vdXRfJXMoc29hcCwgdGFnLCBpZCwgYS0+JXMsIFwiJXNcIik7IiwgY19pZGVudChwLT5pbmZvLnR5cCksIHAtPnN5bS0+bmFtZSwgeHNpX3R5cGVfdSh0eXApKTsKKwkgIGVsc2UgaWYocC0+aW5mby50eXAtPnR5cGU9PVRjbGFzcyAmJiAhaXNfZXh0ZXJuYWwocC0+aW5mby50eXApICYmICFpc192b2xhdGlsZShwLT5pbmZvLnR5cCkgJiYgIWlzX3R5cGVkZWYocC0+aW5mby50eXApKQorCSAgICBmcHJpbnRmKGZvdXQsIlxuXHRyZXR1cm4gYS0+JXMuc29hcF9vdXQoc29hcCwgdGFnLCBpZCwgXCIlc1wiKTsiLCBwLT5zeW0tPm5hbWUseHNpX3R5cGVfdSh0eXApKTsKKwkgIGVsc2UgaWYgKGlzX3FuYW1lKHAtPmluZm8udHlwKSkKKwkgICAgZnByaW50Zihmb3V0LCJcblx0cmV0dXJuIHNvYXBfb3V0XyVzKHNvYXAsIHRhZywgaWQsIChjaGFyKmNvbnN0Kikmc29hcF90bXBfJXMsIFwiJXNcIik7IiwgY19pZGVudChwLT5pbmZvLnR5cCksIHAtPnN5bS0+bmFtZSwgeHNpX3R5cGVfdSh0eXApKTsKKwkgIGVsc2UgaWYgKGlzX3N0ZHFuYW1lKHAtPmluZm8udHlwKSkKKwkgICAgZnByaW50Zihmb3V0LCJcblx0cmV0dXJuIHNvYXBfb3V0XyVzKHNvYXAsIHRhZywgaWQsICZzb2FwX3RtcF8lcywgXCIlc1wiKTsiLCBjX2lkZW50KHAtPmluZm8udHlwKSwgcC0+c3ltLT5uYW1lLCB4c2lfdHlwZV91KHR5cCkpOworCSAgZWxzZSBpZiAoaXNfWE1MKHAtPmluZm8udHlwKSAmJiBpc19zdHJpbmcocC0+aW5mby50eXApKQorCSAgICBmcHJpbnRmKGZvdXQsIlxuXHRyZXR1cm4gc29hcF9vdXRsaXRlcmFsKHNvYXAsIFwiJXNcIiwgJmEtPiVzKTsiLCBuc19hZGQocC0+c3ltLT5uYW1lLCBuc2UpLHAtPnN5bS0+bmFtZSk7CisJICBlbHNlIGlmIChpc19YTUwocC0+aW5mby50eXApICYmIGlzX3dzdHJpbmcocC0+aW5mby50eXApKQorCSAgICBmcHJpbnRmKGZvdXQsIlxuXHRyZXR1cm4gc29hcF9vdXR3bGl0ZXJhbChzb2FwLCBcIiVzXCIsICZhLT4lcyk7IiwgbnNfYWRkKHAtPnN5bS0+bmFtZSwgbnNlKSxwLT5zeW0tPm5hbWUpOworCSAgZWxzZSBpZiAocC0+aW5mby50eXAtPnR5cGUgIT0gVGZ1biAmJiAhaXNfdm9pZChwLT5pbmZvLnR5cCkpCisJICAgIGZwcmludGYoZm91dCwiXG5cdHJldHVybiBzb2FwX291dF8lcyhzb2FwLCB0YWcsIGlkLCAmYS0+JXMsIFwiJXNcIik7IiwgY19pZGVudChwLT5pbmZvLnR5cCksIHAtPnN5bS0+bmFtZSwgeHNpX3R5cGVfdSh0eXApKTsKKwkgIGVsc2UKKyAgICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdHJldHVybiBTT0FQX09LOyIpOwkgCisgICAgICBmcHJpbnRmKGZvdXQsIlxufSIpOwkgCisgICB9CisgICBlbHNlCisgICB7ICBpZiAoIWlzX2ludmlzaWJsZSh0eXAtPmlkLT5uYW1lKSkKKyAgICAgICAgZnByaW50Zihmb3V0LCJcblx0c29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIGEsICVzKSwgdHlwZSk7Iiwgc29hcF90eXBlKHR5cCkpOworICAgICAgZmZsdXNoKGZvdXQpOworICAgICAgZm9yICh0ID0gdGFibGU7IHQ7IHQgPSB0LT5wcmV2KQorICAgICAgewlmb3IgKHAgPSB0LT5saXN0OyBwOyBwID0gcC0+bmV4dCkKKwl7IGlmIChwLT5pbmZvLnN0byAmIFNyZXR1cm4pCisJICB7IGlmIChwLT5pbmZvLnR5cC0+dHlwZSA9PSBUcG9pbnRlcikKKwkgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRpZiAoYS0+JXMpXG5cdFx0c29hcF9lbGVtZW50X3Jlc3VsdChzb2FwLCBcIiVzXCIpOyIsIHAtPnN5bS0+bmFtZSwgbnNfYWRkKHAtPnN5bS0+bmFtZSwgbnNlKSk7CisgICAgICAgICAgICBlbHNlCisJICAgICAgZnByaW50Zihmb3V0LCJcblx0c29hcF9lbGVtZW50X3Jlc3VsdChzb2FwLCBcIiVzXCIpOyIsIG5zX2FkZChwLT5zeW0tPm5hbWUsIG5zZSkpOworCSAgfQorCSAgaWYgKChwLT5pbmZvLnN0byAmIFNtdXN0VW5kZXJzdGFuZCkgJiYgIShwLT5pbmZvLnN0byAmIChTY29uc3QgfCBTcHJpdmF0ZSB8IFNwcm90ZWN0ZWQpKSAmJiAhaXNfdHJhbnNpZW50KHAtPmluZm8udHlwKSAmJiAhaXNfdm9pZChwLT5pbmZvLnR5cCkgJiYgcC0+aW5mby50eXAtPnR5cGUgIT0gVGZ1bikKKwkgICAgZnByaW50Zihmb3V0LCAiXG5cdHNvYXAtPm11c3RVbmRlcnN0YW5kID0gMTsiKTsKKwkgIGlmIChwLT5pbmZvLnN0byAmIChTY29uc3QgfCBTcHJpdmF0ZSB8IFNwcm90ZWN0ZWQpKQorCSAgICBmcHJpbnRmKGZvdXQsICJcblx0Lyogbm9uLXNlcmlhbGl6YWJsZSAlcyBza2lwcGVkICovIiwgcC0+c3ltLT5uYW1lKTsKKwkgIGVsc2UgaWYgKGlzX3RyYW5zaWVudChwLT5pbmZvLnR5cCkpCisJICAgIGZwcmludGYoZm91dCwgIlxuXHQvKiB0cmFuc2llbnQgJXMgc2tpcHBlZCAqLyIsIHAtPnN5bS0+bmFtZSk7CisJICBlbHNlIGlmIChwLT5pbmZvLnN0byAmIFNhdHRyaWJ1dGUpCisJICAgIDsKKwkgIGVsc2UgaWYgKGlzX3JlcGV0aXRpb24ocCkpCisJICB7IGZwcmludGYoZm91dCwiXG5cdGlmIChhLT4lcykiLCBwLT5uZXh0LT5zeW0tPm5hbWUpOworICAgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0e1x0aW50IGk7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGEtPiVzOyBpKyspIiwgcC0+c3ltLT5uYW1lKTsKKyAgICAgICAgICAgIGlmICgoKFRub2RlKilwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKS0+dHlwZSA9PSBUY2xhc3MgJiYgIWlzX2V4dGVybmFsKHAtPm5leHQtPmluZm8udHlwLT5yZWYpICYmICFpc192b2xhdGlsZShwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSAmJiAhaXNfdHlwZWRlZihwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSkKKyAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdGEtPiVzW2ldLnNvYXBfb3V0KHNvYXAsIFwiJXNcIiwgLTEsIFwiJXNcIik7IiwgcC0+bmV4dC0+c3ltLT5uYW1lLCBuc19hZGQocC0+bmV4dC0+c3ltLT5uYW1lLCBuc2UpLHhzaV90eXBlX2NvbmRfdShwLT5uZXh0LT5pbmZvLnR5cC0+cmVmLCAhaGFzX25zX2VxKE5VTEwsIHAtPm5leHQtPnN5bS0+bmFtZSkpKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGlzX1hNTChwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSAmJiBpc19zdHJpbmcocC0+bmV4dC0+aW5mby50eXAtPnJlZikpCisJICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdHNvYXBfb3V0bGl0ZXJhbChzb2FwLCBcIiVzXCIsIGEtPiVzICsgaSk7IiwgbnNfYWRkKHAtPm5leHQtPnN5bS0+bmFtZSwgbnNlKSxwLT5uZXh0LT5zeW0tPm5hbWUpOworICAgICAgICAgICAgZWxzZSBpZiAoaXNfWE1MKHAtPm5leHQtPmluZm8udHlwLT5yZWYpICYmIGlzX3dzdHJpbmcocC0+bmV4dC0+aW5mby50eXAtPnJlZikpCisJICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdHNvYXBfb3V0d2xpdGVyYWwoc29hcCwgXCIlc1wiLCBhLT4lcyArIGkpOyIsIG5zX2FkZChwLT5uZXh0LT5zeW0tPm5hbWUsIG5zZSkscC0+bmV4dC0+c3ltLT5uYW1lKTsKKwkgICAgZWxzZQorICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0c29hcF9vdXRfJXMoc29hcCwgXCIlc1wiLCAtMSwgYS0+JXMgKyBpLCBcIiVzXCIpOyIsIGNfaWRlbnQocC0+bmV4dC0+aW5mby50eXAtPnJlZiksIG5zX2FkZChwLT5uZXh0LT5zeW0tPm5hbWUsIG5zZSksIHAtPm5leHQtPnN5bS0+bmFtZSwgeHNpX3R5cGVfY29uZF91KHAtPm5leHQtPmluZm8udHlwLT5yZWYsICFoYXNfbnNfZXEoTlVMTCwgcC0+bmV4dC0+c3ltLT5uYW1lKSkpOworICAgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0fSIpOworICAgICAgICAgICAgcCA9IHAtPm5leHQ7CisJICB9CisJICBlbHNlIGlmIChpc19hbnl0eXBlKHApKQorCSAgeyBmcHJpbnRmKGZvdXQsIlxuXHRzb2FwX3B1dGVsZW1lbnQoc29hcCwgYS0+JXMsIFwiJXNcIiwgLTEsIGEtPiVzKTsiLCBwLT5uZXh0LT5zeW0tPm5hbWUsIG5zX2FkZChwLT5uZXh0LT5zeW0tPm5hbWUsIG5zZSkscC0+c3ltLT5uYW1lKTsKKyAgICAgICAgICAgIHAgPSBwLT5uZXh0OworCSAgfQorCSAgZWxzZSBpZiAoaXNfY2hvaWNlKHApKQorCSAgeyBmcHJpbnRmKGZvdXQsIlxuXHRzb2FwX291dF8lcyhzb2FwLCBhLT4lcywgJmEtPiVzKTsiLCBjX2lkZW50KHAtPm5leHQtPmluZm8udHlwKSxwLT5zeW0tPm5hbWUsIHAtPm5leHQtPnN5bS0+bmFtZSk7CisgICAgICAgICAgICBwID0gcC0+bmV4dDsKKwkgIH0KKwkgIGVsc2UgaWYgKHAtPmluZm8udHlwLT50eXBlPT1UYXJyYXkpCisJICAgIGZwcmludGYoZm91dCwiXG5cdHNvYXBfb3V0XyVzKHNvYXAsIFwiJXNcIiwgLTEsIGEtPiVzLCBcIiVzXCIpOyIsIGNfaWRlbnQocC0+aW5mby50eXApLG5zX2FkZChwLT5zeW0tPm5hbWUsIG5zZSkscC0+c3ltLT5uYW1lLHhzaV90eXBlX2NvbmRfdShwLT5pbmZvLnR5cCwgIWhhc19uc19lcShOVUxMLCBwLT5zeW0tPm5hbWUpKSk7CisJICBlbHNlIGlmIChwLT5pbmZvLnR5cC0+dHlwZT09VGNsYXNzICYmICFpc19leHRlcm5hbChwLT5pbmZvLnR5cCkgJiYgIWlzX3ZvbGF0aWxlKHAtPmluZm8udHlwKSAmJiAhaXNfdHlwZWRlZihwLT5pbmZvLnR5cCkpCisJICAgIGZwcmludGYoZm91dCwiXG5cdGEtPiVzLnNvYXBfb3V0KHNvYXAsIFwiJXNcIiwgLTEsIFwiJXNcIik7IiwgcC0+c3ltLT5uYW1lLG5zX2FkZChwLT5zeW0tPm5hbWUsIG5zZSkseHNpX3R5cGVfY29uZF91KHAtPmluZm8udHlwLCAhaGFzX25zX2VxKE5VTEwsIHAtPnN5bS0+bmFtZSkpKTsKKwkgIGVsc2UgaWYgKGlzX3FuYW1lKHAtPmluZm8udHlwKSkKKwkgICAgZnByaW50Zihmb3V0LCJcblx0c29hcF9vdXRfJXMoc29hcCwgXCIlc1wiLCAtMSwgKGNoYXIqY29uc3QqKSZzb2FwX3RtcF8lcywgXCIlc1wiKTsiLCBjX2lkZW50KHAtPmluZm8udHlwKSxuc19hZGQocC0+c3ltLT5uYW1lLCBuc2UpLHAtPnN5bS0+bmFtZSwgeHNpX3R5cGVfY29uZF91KHAtPmluZm8udHlwLCAhaGFzX25zX2VxKE5VTEwsIHAtPnN5bS0+bmFtZSkpKTsKKwkgIGVsc2UgaWYgKGlzX3N0ZHFuYW1lKHAtPmluZm8udHlwKSkKKwkgICAgZnByaW50Zihmb3V0LCJcblx0c29hcF9vdXRfJXMoc29hcCwgXCIlc1wiLCAtMSwgJnNvYXBfdG1wXyVzLCBcIiVzXCIpOyIsIGNfaWRlbnQocC0+aW5mby50eXApLG5zX2FkZChwLT5zeW0tPm5hbWUsIG5zZSkscC0+c3ltLT5uYW1lLCB4c2lfdHlwZV9jb25kX3UocC0+aW5mby50eXAsICFoYXNfbnNfZXEoTlVMTCwgcC0+c3ltLT5uYW1lKSkpOworCSAgZWxzZSBpZiAoaXNfWE1MKHAtPmluZm8udHlwKSAmJiBpc19zdHJpbmcocC0+aW5mby50eXApKQorCSAgICBmcHJpbnRmKGZvdXQsIlxuXHRzb2FwX291dGxpdGVyYWwoc29hcCwgXCIlc1wiLCAmYS0+JXMpOyIsIG5zX2FkZChwLT5zeW0tPm5hbWUsIG5zZSkscC0+c3ltLT5uYW1lKTsKKwkgIGVsc2UgaWYgKGlzX1hNTChwLT5pbmZvLnR5cCkgJiYgaXNfd3N0cmluZyhwLT5pbmZvLnR5cCkpCisJICAgIGZwcmludGYoZm91dCwiXG5cdHNvYXBfb3V0d2xpdGVyYWwoc29hcCwgXCIlc1wiLCAmYS0+JXMpOyIsIG5zX2FkZChwLT5zeW0tPm5hbWUsIG5zZSkscC0+c3ltLT5uYW1lKTsKKwkgIGVsc2UgaWYgKHAtPmluZm8udHlwLT50eXBlICE9IFRmdW4gJiYgIWlzX3ZvaWQocC0+aW5mby50eXApKQorCSAgICBmcHJpbnRmKGZvdXQsIlxuXHRzb2FwX291dF8lcyhzb2FwLCBcIiVzXCIsIC0xLCAmYS0+JXMsIFwiJXNcIik7IiwgY19pZGVudChwLT5pbmZvLnR5cCksbnNfYWRkKHAtPnN5bS0+bmFtZSwgbnNlKSxwLT5zeW0tPm5hbWUsIHhzaV90eXBlX2NvbmRfdShwLT5pbmZvLnR5cCwgIWhhc19uc19lcShOVUxMLCBwLT5zeW0tPm5hbWUpKSk7CisJfQorICAgICAgfQkKKyAgICAgIGlmICghaXNfaW52aXNpYmxlKHR5cC0+aWQtPm5hbWUpKQorICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOyIpOworICAgICAgZnByaW50Zihmb3V0LCJcblx0cmV0dXJuIFNPQVBfT0s7XG59Iik7CSAKKyAgICB9CisgICAgZmZsdXNoKGZvdXQpOworICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBUY2xhc3M6CisgICAgICB0YWJsZT0oVGFibGUqKXR5cC0+cmVmOworICAgICAgaWYgKCFpc192b2xhdGlsZSh0eXApICYmICFpc190eXBlZGVmKHR5cCkpCisgICAgICB7IAorICAgICAgICBpZiAoaXNfZXh0ZXJuYWwodHlwKSkKKyAgICAgICAgeyBmcHJpbnRmKGZoZWFkLCJcblNPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRfJXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCAlcywgY29uc3QgY2hhciopOyIsIGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiKiIpKTsgCisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZwcmludGYoZm91dCwiXG5cbmludCAlczo6c29hcF9vdXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICp0eXBlKSBjb25zdCIsIHR5cC0+aWQtPm5hbWUpOyAKKyAgICAgICAgZnByaW50Zihmb3V0LCJcbntcblx0cmV0dXJuIHNvYXBfb3V0XyVzKHNvYXAsIHRhZywgaWQsIHRoaXMsIHR5cGUpO1xufSIsIGNfaWRlbnQodHlwKSk7IAorICAgICAgfQorICAgICAgZnByaW50ZihmaGVhZCwiXG5cblNPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfJXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCAlcywgY29uc3QgY2hhciopOyIsIGNfaWRlbnQodHlwKSwgY190eXBlX2lkKHR5cCwgIioiKSk7IAorICAgICAgZnByaW50Zihmb3V0LCJcblxuU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF8lcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0ICVzLCBjb25zdCBjaGFyICp0eXBlKVxueyIsIGNfaWRlbnQodHlwKSwgY190eXBlX2lkKHR5cCwgIiphIikpOyAKKyAgICAgIGZmbHVzaChmb3V0KTsKKyAgICAgIGlmIChoYXNfc2V0dGVyKHR5cCkpCisgICAgICAgIGZwcmludGYoZm91dCwgIlxuXHQoKCVzKWEpLT5zZXQoc29hcCk7IiwgY190eXBlX2lkKHR5cCwgIioiKSk7CisgICAgICBmb3IgKHQgPSB0YWJsZTsgdDsgdCA9IHQtPnByZXYpCisgICAgICB7CWZvciAocCA9IHQtPmxpc3Q7IHA7IHAgPSBwLT5uZXh0KQorCXsgaWYgKHAtPmluZm8uc3RvICYgU2F0dHJpYnV0ZSkKKwkgICAgc29hcF9zZXRfYXR0cihwLT5pbmZvLnR5cCwgcHRyX2Nhc3QodHlwLCAiYSIpLCBwLT5zeW0tPm5hbWUsIG5zX2FkZChwLT5zeW0tPm5hbWUsIG5zYSkpOworCSAgZWxzZSBpZiAoaXNfcW5hbWUocC0+aW5mby50eXApKQorICAgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0Y29uc3QgY2hhciAqc29hcF90bXBfJXMgPSBzb2FwX1FOYW1lMnMoc29hcCwgYS0+JXMpOyIsIHAtPnN5bS0+bmFtZSwgcC0+c3ltLT5uYW1lKTsKKwkgIGVsc2UgaWYgKGlzX3N0ZHFuYW1lKHAtPmluZm8udHlwKSkKKyAgICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdHN0ZDo6c3RyaW5nIHNvYXBfdG1wXyVzKHNvYXBfUU5hbWUycyhzb2FwLCBhLT4lcy5jX3N0cigpKSk7IiwgcC0+c3ltLT5uYW1lLCBwLT5zeW0tPm5hbWUpOworICAgICAgICB9CisgICAgIH0KKyAgICAgaWYgKGlzX3ByaW1jbGFzcyh0eXApKQorICAgICB7CisJZm9yICh0ID0gdGFibGU7IHQ7IHQgPSB0LT5wcmV2KQorCXsgcCA9IHQtPmxpc3Q7CisJICBpZiAocCAmJiBpc19pdGVtKHApKQorCSAgICBicmVhazsKKyAgICAgICAgfQorCWlmIChwLT5pbmZvLnN0byAmIFNyZXR1cm4pCisJeyBpZiAocC0+aW5mby50eXAtPnR5cGUgPT0gVHBvaW50ZXIpCisJICAgIGZwcmludGYoZm91dCwiXG5cdGlmIChhLT4lcylcblx0XHRzb2FwX2VsZW1lbnRfcmVzdWx0KHNvYXAsIFwiJXNcIik7IiwgcC0+c3ltLT5uYW1lLCBuc19hZGQocC0+c3ltLT5uYW1lLCBuc2UpKTsKKyAgICAgICAgICBlbHNlCisJICAgIGZwcmludGYoZm91dCwiXG5cdHNvYXBfZWxlbWVudF9yZXN1bHQoc29hcCwgXCIlc1wiKTsiLCBuc19hZGQocC0+c3ltLT5uYW1lLCBuc2UpKTsKKwl9CisJICBpZiAoKHAtPmluZm8uc3RvICYgU211c3RVbmRlcnN0YW5kKSAmJiAhKHAtPmluZm8uc3RvICYgKFNjb25zdCB8IFNwcml2YXRlIHwgU3Byb3RlY3RlZCkpICYmICEocC0+aW5mby5zdG8gJiBTYXR0cmlidXRlKSAmJiAhaXNfdHJhbnNpZW50KHAtPmluZm8udHlwKSAmJiAhaXNfdm9pZChwLT5pbmZvLnR5cCkgJiYgcC0+aW5mby50eXAtPnR5cGUgIT0gVGZ1bikKKwkgICAgZnByaW50Zihmb3V0LCAiXG5cdHNvYXAtPm11c3RVbmRlcnN0YW5kID0gMTsiKTsKKwkgIGlmIChpc19YTUwocC0+aW5mby50eXApICYmIGlzX3N0cmluZyhwLT5pbmZvLnR5cCkpCisJICAgIGZwcmludGYoZm91dCwiXG5cdHJldHVybiBzb2FwX291dGxpdGVyYWwoc29hcCwgXCIlc1wiLCAmKCgoJXMqKWEpLT4lcykpOyIsIG5zX2FkZChwLT5zeW0tPm5hbWUsIG5zZSksdC0+c3ltLT5uYW1lLHAtPnN5bS0+bmFtZSk7CisJICBlbHNlIGlmIChpc19YTUwocC0+aW5mby50eXApICYmIGlzX3dzdHJpbmcocC0+aW5mby50eXApKQorCSAgICBmcHJpbnRmKGZvdXQsIlxuXHRyZXR1cm4gc29hcF9vdXR3bGl0ZXJhbChzb2FwLCBcIiVzXCIsICYoKCglcyopYSktPiVzKSk7IiwgbnNfYWRkKHAtPnN5bS0+bmFtZSwgbnNlKSx0LT5zeW0tPm5hbWUscC0+c3ltLT5uYW1lKTsKKwkgIGVsc2UgaWYgKHRhYmxlLT5wcmV2KQorCSAgeworCSAgICBpZihwLT5pbmZvLnR5cC0+dHlwZT09VGFycmF5KQorCSAgICAgIGZwcmludGYoZm91dCwiXG5cdHJldHVybiBzb2FwX291dF8lcyhzb2FwLCB0YWcsIGlkLCAoKCVzKilhKS0+JXMsIFwiJXNcIik7IiwgY19pZGVudChwLT5pbmZvLnR5cCksIHQtPnN5bS0+bmFtZSxwLT5zeW0tPm5hbWUsIHhzaV90eXBlX3UodHlwKSk7CisJICAgIGVsc2UgaWYocC0+aW5mby50eXAtPnR5cGU9PVRjbGFzcyAmJiAhaXNfZXh0ZXJuYWwocC0+aW5mby50eXApICYmICFpc192b2xhdGlsZShwLT5pbmZvLnR5cCkgJiYgIWlzX3R5cGVkZWYocC0+aW5mby50eXApKQorCSAgICAgIGZwcmludGYoZm91dCwiXG5cdHJldHVybiAoKCglcyopYSktPiVzKS5zb2FwX291dChzb2FwLCB0YWcsIGlkLCBcIiVzXCIpOyIsIHQtPnN5bS0+bmFtZSwgcC0+c3ltLT5uYW1lLHhzaV90eXBlX3UodHlwKSk7CisJICAgIGVsc2UgaWYgKGlzX3FuYW1lKHAtPmluZm8udHlwKSkKKwkgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRyZXR1cm4gc29hcF9vdXRfJXMoc29hcCwgdGFnLCBpZCwgKGNoYXIqY29uc3QqKSZzb2FwX3RtcF8lcywgXCIlc1wiKTsiLCBjX2lkZW50KHAtPmluZm8udHlwKSwgcC0+c3ltLT5uYW1lLCB4c2lfdHlwZV91KHR5cCkpOworCSAgICBlbHNlIGlmIChpc19zdGRxbmFtZShwLT5pbmZvLnR5cCkpCisJICAgICAgZnByaW50Zihmb3V0LCJcblx0cmV0dXJuIHNvYXBfb3V0XyVzKHNvYXAsIHRhZywgaWQsICZzb2FwX3RtcF8lcywgXCIlc1wiKTsiLCBjX2lkZW50KHAtPmluZm8udHlwKSwgcC0+c3ltLT5uYW1lLCB4c2lfdHlwZV91KHR5cCkpOworCSAgICBlbHNlIGlmIChwLT5pbmZvLnR5cC0+dHlwZSAhPSBUZnVuICYmICFpc192b2lkKHAtPmluZm8udHlwKSkKKwkgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRyZXR1cm4gc29hcF9vdXRfJXMoc29hcCwgdGFnLCBpZCwgJigoKCVzKilhKS0+JXMpLCBcIiVzXCIpOyIsIGNfaWRlbnQocC0+aW5mby50eXApLCB0LT5zeW0tPm5hbWUscC0+c3ltLT5uYW1lLHhzaV90eXBlX3UodHlwKSk7CisJICAgIGVsc2UKKyAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0cmV0dXJuIFNPQVBfT0s7Iik7CSAKKwkgIH0KKwkgIGVsc2UKKwkgIHsgaWYocC0+aW5mby50eXAtPnR5cGU9PVRhcnJheSkKKwkgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRyZXR1cm4gc29hcF9vdXRfJXMoc29hcCwgdGFnLCBpZCwgKCglcyopYSktPiVzLCBcIiVzXCIpOyIsIGNfaWRlbnQocC0+aW5mby50eXApLCB0LT5zeW0tPm5hbWUscC0+c3ltLT5uYW1lLCB4c2lfdHlwZV91KHR5cCkpOworCSAgICBlbHNlIGlmKHAtPmluZm8udHlwLT50eXBlPT1UY2xhc3MgJiYgIWlzX2V4dGVybmFsKHAtPmluZm8udHlwKSAmJiAhaXNfdm9sYXRpbGUocC0+aW5mby50eXApICYmICFpc190eXBlZGVmKHAtPmluZm8udHlwKSkKKwkgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRyZXR1cm4gKCgoJXMqKWEpLT4lcykuc29hcF9vdXQoc29hcCwgdGFnLCBpZCwgXCIlc1wiKTsiLCB0LT5zeW0tPm5hbWUsIHAtPnN5bS0+bmFtZSx4c2lfdHlwZV91KHR5cCkpOworCSAgICBlbHNlIGlmIChpc19xbmFtZShwLT5pbmZvLnR5cCkpCisJICAgICAgZnByaW50Zihmb3V0LCJcblx0cmV0dXJuIHNvYXBfb3V0XyVzKHNvYXAsIHRhZywgaWQsIChjaGFyKmNvbnN0Kikmc29hcF90bXBfJXMsIFwiJXNcIik7IiwgY19pZGVudChwLT5pbmZvLnR5cCksIHAtPnN5bS0+bmFtZSwgeHNpX3R5cGVfdSh0eXApKTsKKwkgICAgZWxzZSBpZiAoaXNfc3RkcW5hbWUocC0+aW5mby50eXApKQorCSAgICAgIGZwcmludGYoZm91dCwiXG5cdHJldHVybiBzb2FwX291dF8lcyhzb2FwLCB0YWcsIGlkLCAmc29hcF90bXBfJXMsIFwiJXNcIik7IiwgY19pZGVudChwLT5pbmZvLnR5cCksIHAtPnN5bS0+bmFtZSwgeHNpX3R5cGVfdSh0eXApKTsKKwkgICAgZWxzZSBpZiAocC0+aW5mby50eXAtPnR5cGUgIT0gVGZ1biAmJiAhaXNfdm9pZChwLT5pbmZvLnR5cCkpCisJICAgICAgZnByaW50Zihmb3V0LCJcblx0cmV0dXJuIHNvYXBfb3V0XyVzKHNvYXAsIHRhZywgaWQsICYoKCglcyopYSktPiVzKSwgXCIlc1wiKTsiLCBjX2lkZW50KHAtPmluZm8udHlwKSwgdC0+c3ltLT5uYW1lLHAtPnN5bS0+bmFtZSx4c2lfdHlwZV91KHR5cCkpOworCSAgICBlbHNlCisgICAgICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdHJldHVybiBTT0FQX09LOyIpOwkgCisJICB9CisgICAgICAgZnByaW50Zihmb3V0LCJcbn0iKTsJIAorICAgICB9CisgICAgIGVsc2UKKyAgICAgeyBpZiAoIWlzX2ludmlzaWJsZSh0eXAtPmlkLT5uYW1lKSkKKyAgICAgICAgIGlmICh0YWJsZSAmJiB0YWJsZS0+cHJldikKKyAgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0c29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIGEsICVzKSwgXCIlc1wiKTsiLCBzb2FwX3R5cGUodHlwKSwgeHNpX3R5cGUodHlwKSk7CisgICAgICAgICBlbHNlCisgICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBhLCAlcyksIHR5cGUpOyIsIHNvYXBfdHlwZSh0eXApKTsKKyAgICAgICBmZmx1c2goZm91dCk7CisgICAgICAKKyAgICAgIGk9MDsKKyAgICAgIC8qIEdldCB0aGUgZGVwdGggb2YgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeSAqLworICAgICAgZm9yICh0ID0gdGFibGU7IHQ7IHQgPSB0LT5wcmV2KQorCWkrKzsKKworICAgICAgLyogQ2FsbCByb3V0aW5lcyB0byBvdXRwdXQgdGhlIG1lbWJlciBkYXRhIG9mIHRoZSBjbGFzcyAqLworICAgICAgLyogRGF0YSBtZW1iZXJzIG9mIHRoZSBCYXNlIENsYXNzZXMgYXJlIG91dHB1dGVkIGZpcnN0CisJIGZvbGxvd2VkIGJ5IHRoZSBkYXRhIG1lbWJlcnMgb2YgdGhlIERlcml2ZWQgY2xhc3Nlcy4KKwkgT3ZlcnJpZGRlbiBkYXRhIG1lbWJlcnMgYXJlIG91dHB1dCB0d2ljZSBvbmNlIGZvciB0aGUgYmFzZSBjbGFzcworCSB0aGV5IGFyZSBkZWZpbmVkIGluIGFuZCBvbmNlIGZvciB0aGUgZGVyaXZlZCBjbGFzcyB0aGF0IG92ZXJ3cml0ZXMKKwkgdGhlbSAqLworICAgICAgCisgICAgICBmb3IgKDsgaSA+IDA7IGktLSkKKyAgICAgIHsgdCA9IHRhYmxlOworCWZvciAoaiA9IDA7IGo8IGktMTsgaisrKQorCSAgdCA9IHQtPnByZXY7CisJZm9yIChwID0gdC0+bGlzdDsgcCAhPSAoRW50cnkqKSAwOyBwID0gcC0+bmV4dCkKKwl7IGlmICgocC0+aW5mby5zdG8gJiBTbXVzdFVuZGVyc3RhbmQpICYmICEocC0+aW5mby5zdG8gJiAoU2NvbnN0IHwgU3ByaXZhdGUgfCBTcHJvdGVjdGVkKSkgJiYgIShwLT5pbmZvLnN0byAmIFNhdHRyaWJ1dGUpICYmICFpc190cmFuc2llbnQocC0+aW5mby50eXApICYmICFpc192b2lkKHAtPmluZm8udHlwKSAmJiBwLT5pbmZvLnR5cC0+dHlwZSAhPSBUZnVuKQorCSAgICBmcHJpbnRmKGZvdXQsICJcblx0c29hcC0+bXVzdFVuZGVyc3RhbmQgPSAxOyIpOworCSAgaWYgKGlzX2l0ZW0ocCkpCisJICAgIDsKKwkgIGVsc2UgaWYgKHAtPmluZm8uc3RvICYgKFNjb25zdCB8IFNwcml2YXRlIHwgU3Byb3RlY3RlZCkpCisJICAgIGZwcmludGYoZm91dCwgIlxuXHQvKiBub24tc2VyaWFsaXphYmxlICVzIHNraXBwZWQgKi8iLCBwLT5zeW0tPm5hbWUpOworCSAgZWxzZSBpZiAoaXNfdHJhbnNpZW50KHAtPmluZm8udHlwKSkKKwkgICAgZnByaW50Zihmb3V0LCAiXG5cdC8qIHRyYW5zaWVudCAlcyBza2lwcGVkICovIiwgcC0+c3ltLT5uYW1lKTsKKwkgIGVsc2UgaWYgKHAtPmluZm8uc3RvICYgU2F0dHJpYnV0ZSkKKwkgICAgOworCSAgZWxzZSBpZiAoaXNfcmVwZXRpdGlvbihwKSkKKwkgIHsgZnByaW50Zihmb3V0LCJcblx0aWYgKCgoJXMqKWEpLT4lcykiLCB0LT5zeW0tPm5hbWUsIHAtPm5leHQtPnN5bS0+bmFtZSk7CisgICAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHR7XHRpbnQgaTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgKCglcyopYSktPiVzOyBpKyspIiwgdC0+c3ltLT5uYW1lLCBwLT5zeW0tPm5hbWUpOworICAgICAgICAgICAgaWYgKCgoVG5vZGUqKXAtPm5leHQtPmluZm8udHlwLT5yZWYpLT50eXBlID09IFRjbGFzcyAmJiAhaXNfZXh0ZXJuYWwocC0+bmV4dC0+aW5mby50eXAtPnJlZikgJiYgIWlzX3ZvbGF0aWxlKHAtPm5leHQtPmluZm8udHlwLT5yZWYpICYmICFpc190eXBlZGVmKHAtPm5leHQtPmluZm8udHlwLT5yZWYpKQorICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0KCglcyopYSktPiVzW2ldLnNvYXBfb3V0KHNvYXAsIFwiJXNcIiwgLTEsIFwiJXNcIik7IiwgdC0+c3ltLT5uYW1lLCBwLT5uZXh0LT5zeW0tPm5hbWUsIG5zX2FkZF9vdmVycmlkZGVuKHQsIHAtPm5leHQsIG5zZSkseHNpX3R5cGVfY29uZF91KHAtPm5leHQtPmluZm8udHlwLT5yZWYsICFoYXNfbnNfZXEoTlVMTCwgcC0+bmV4dC0+c3ltLT5uYW1lKSkpOworICAgICAgICAgICAgZWxzZSBpZiAoaXNfWE1MKHAtPm5leHQtPmluZm8udHlwLT5yZWYpICYmIGlzX3N0cmluZyhwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSkKKwkgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0c29hcF9vdXRsaXRlcmFsKHNvYXAsIFwiJXNcIiwgKCglcyopYSktPiVzICsgaSk7IiwgbnNfYWRkKHAtPm5leHQtPnN5bS0+bmFtZSwgbnNlKSx0LT5zeW0tPm5hbWUsIHAtPm5leHQtPnN5bS0+bmFtZSk7CisgICAgICAgICAgICBlbHNlIGlmIChpc19YTUwocC0+bmV4dC0+aW5mby50eXAtPnJlZikgJiYgaXNfd3N0cmluZyhwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSkKKyAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdHNvYXBfb3V0d2xpdGVyYWwoc29hcCwgXCIlc1wiLCAoKCVzKmEpLT4lcyArIGkpOyIsIG5zX2FkZChwLT5uZXh0LT5zeW0tPm5hbWUsIG5zZSksdC0+c3ltLT5uYW1lLCBwLT5uZXh0LT5zeW0tPm5hbWUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0c29hcF9vdXRfJXMoc29hcCwgXCIlc1wiLCAtMSwgKCglcyopYSktPiVzICsgaSwgXCIlc1wiKTsiLCBjX2lkZW50KHAtPm5leHQtPmluZm8udHlwLT5yZWYpLCBuc19hZGRfb3ZlcnJpZGRlbih0LCBwLT5uZXh0LCBuc2UpLCB0LT5zeW0tPm5hbWUsIHAtPm5leHQtPnN5bS0+bmFtZSwgeHNpX3R5cGVfY29uZF91KHAtPm5leHQtPmluZm8udHlwLT5yZWYsICFoYXNfbnNfZXEoTlVMTCwgcC0+bmV4dC0+c3ltLT5uYW1lKSkpOworICAgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0fSIpOworICAgICAgICAgICAgcCA9IHAtPm5leHQ7CisJICB9CisJICBlbHNlIGlmIChpc19hbnl0eXBlKHApKQorCSAgeyBmcHJpbnRmKGZvdXQsIlxuXHRzb2FwX3B1dGVsZW1lbnQoc29hcCwgKCglcyopYSktPiVzLCBcIiVzXCIsIC0xLCAoKCVzKilhKS0+JXMpOyIsIHQtPnN5bS0+bmFtZSwgcC0+bmV4dC0+c3ltLT5uYW1lLCBuc19hZGQocC0+c3ltLT5uYW1lLCBuc2UpLHQtPnN5bS0+bmFtZSxwLT5zeW0tPm5hbWUpOworICAgICAgICAgICAgcCA9IHAtPm5leHQ7CisJICB9CisJICBlbHNlIGlmIChpc19jaG9pY2UocCkpCisJICB7IGZwcmludGYoZm91dCwiXG5cdHNvYXBfb3V0XyVzKHNvYXAsICgoJXMqKWEpLT4lcywgJigoJXMqKWEpLT4lcyk7IiwgY19pZGVudChwLT5uZXh0LT5pbmZvLnR5cCksIHQtPnN5bS0+bmFtZSwgcC0+c3ltLT5uYW1lLCB0LT5zeW0tPm5hbWUsIHAtPm5leHQtPnN5bS0+bmFtZSk7CisgICAgICAgICAgICBwID0gcC0+bmV4dDsKKwkgIH0KKwkgIGVsc2UgaWYgKHAtPmluZm8udHlwLT50eXBlPT1UYXJyYXkpCisJICAgIGZwcmludGYoZm91dCwiXG5cdHNvYXBfb3V0XyVzKHNvYXAsIFwiJXNcIiwgLTEsICgoJXMqKWEpLT4lcywgXCIlc1wiKTsiLCBjX2lkZW50KHAtPmluZm8udHlwKSxuc19hZGRfb3ZlcnJpZGRlbih0LCBwLCBuc2UpLCB0LT5zeW0tPm5hbWUscC0+c3ltLT5uYW1lLCB4c2lfdHlwZV9jb25kX3UocC0+aW5mby50eXAsICFoYXNfbnNfZXEoTlVMTCwgcC0+c3ltLT5uYW1lKSkpOworCSAgZWxzZSBpZiAocC0+aW5mby50eXAtPnR5cGU9PVRjbGFzcyAmJiAhaXNfZXh0ZXJuYWwocC0+aW5mby50eXApICYmICFpc192b2xhdGlsZShwLT5pbmZvLnR5cCkgJiYgIWlzX3R5cGVkZWYocC0+aW5mby50eXApKQorCSAgICBmcHJpbnRmKGZvdXQsIlxuXHQoKCglcyopYSktPiVzKS5zb2FwX291dChzb2FwLCBcIiVzXCIsIC0xLCBcIiVzXCIpOyIsIHQtPnN5bS0+bmFtZSwgcC0+c3ltLT5uYW1lLG5zX2FkZF9vdmVycmlkZGVuKHQsIHAsIG5zZSkseHNpX3R5cGVfY29uZF91KHAtPmluZm8udHlwLCAhaGFzX25zX2VxKE5VTEwsIHAtPnN5bS0+bmFtZSkpKTsKKwkgIGVsc2UgaWYgKGlzX3FuYW1lKHAtPmluZm8udHlwKSkKKwkgICAgZnByaW50Zihmb3V0LCJcblx0c29hcF9vdXRfJXMoc29hcCwgXCIlc1wiLCAtMSwgKGNoYXIqY29uc3QqKSZzb2FwX3RtcF8lcywgXCIlc1wiKTsiLCBjX2lkZW50KHAtPmluZm8udHlwKSxuc19hZGRfb3ZlcnJpZGRlbih0LCBwLCBuc2UpLHAtPnN5bS0+bmFtZSwgeHNpX3R5cGVfY29uZF91KHAtPmluZm8udHlwLCAhaGFzX25zX2VxKE5VTEwsIHAtPnN5bS0+bmFtZSkpKTsKKwkgIGVsc2UgaWYgKGlzX3N0ZHFuYW1lKHAtPmluZm8udHlwKSkKKwkgICAgZnByaW50Zihmb3V0LCJcblx0c29hcF9vdXRfJXMoc29hcCwgXCIlc1wiLCAtMSwgJnNvYXBfdG1wXyVzLCBcIiVzXCIpOyIsIGNfaWRlbnQocC0+aW5mby50eXApLG5zX2FkZF9vdmVycmlkZGVuKHQsIHAsIG5zZSkscC0+c3ltLT5uYW1lLCB4c2lfdHlwZV9jb25kX3UocC0+aW5mby50eXAsICFoYXNfbnNfZXEoTlVMTCwgcC0+c3ltLT5uYW1lKSkpOworCSAgZWxzZSBpZiAoaXNfWE1MKHAtPmluZm8udHlwKSAmJiBpc19zdHJpbmcocC0+aW5mby50eXApKQorCSAgICBmcHJpbnRmKGZvdXQsIlxuXHRzb2FwX291dGxpdGVyYWwoc29hcCwgXCIlc1wiLCAmKCgoJXMqKWEpLT4lcykpOyIsIG5zX2FkZF9vdmVycmlkZGVuKHQsIHAsIG5zZSksdC0+c3ltLT5uYW1lLHAtPnN5bS0+bmFtZSk7CisJICBlbHNlIGlmIChpc19YTUwocC0+aW5mby50eXApICYmIGlzX3dzdHJpbmcocC0+aW5mby50eXApKQorCSAgICBmcHJpbnRmKGZvdXQsIlxuXHRzb2FwX291dHdsaXRlcmFsKHNvYXAsIFwiJXNcIiwgJigoKCVzKilhKS0+JXMpKTsiLCBuc19hZGRfb3ZlcnJpZGRlbih0LCBwLCBuc2UpLHQtPnN5bS0+bmFtZSxwLT5zeW0tPm5hbWUpOworCSAgZWxzZSBpZiAocC0+aW5mby50eXAtPnR5cGUgIT0gVGZ1biAmJiAhaXNfdm9pZChwLT5pbmZvLnR5cCkpCisJICAgIGZwcmludGYoZm91dCwiXG5cdHNvYXBfb3V0XyVzKHNvYXAsIFwiJXNcIiwgLTEsICYoKCglcyopYSktPiVzKSwgXCIlc1wiKTsiLCBjX2lkZW50KHAtPmluZm8udHlwKSxuc19hZGRfb3ZlcnJpZGRlbih0LCBwLCBuc2UpLCB0LT5zeW0tPm5hbWUscC0+c3ltLT5uYW1lLHhzaV90eXBlX2NvbmRfdShwLT5pbmZvLnR5cCwgIWhhc19uc19lcShOVUxMLCBwLT5zeW0tPm5hbWUpKSk7CisgIAkgIGZmbHVzaChmb3V0KTsKKwl9CisgICAgICAgfQorICAgICAgIGlmICghaXNfaW52aXNpYmxlKHR5cC0+aWQtPm5hbWUpKQorICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0c29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsiKTsKKyAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRyZXR1cm4gU09BUF9PSztcbn0iKTsJIAorICAgICAgfQorICAgICAgZmZsdXNoKGZvdXQpOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIFR1bmlvbjoKKyAgICAgIGlmIChpc19leHRlcm5hbCh0eXApKQorICAgICAgeyBmcHJpbnRmKGZoZWFkLCAiXG5TT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0XyVzKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCAlcyk7IiwgY19pZGVudCh0eXApLCBjX3R5cGVfaWQodHlwLCAiKiIpKTsgCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGZwcmludGYoZmhlYWQsICJcblNPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfJXMoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0ICVzKTsiLCBjX2lkZW50KHR5cCksIGNfdHlwZV9pZCh0eXAsICIqIikpOyAKKyAgICAgIGZwcmludGYoZm91dCwgIlxuXG5TT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0XyVzKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgY2hvaWNlLCBjb25zdCAlcylcbnsiLCBjX2lkZW50KHR5cCksIGNfdHlwZV9pZCh0eXAsICIqYSIpKTsgCisgICAgICB0YWJsZSA9IChUYWJsZSopdHlwLT5yZWY7CisgICAgICBmcHJpbnRmKGZvdXQsICJcblx0c3dpdGNoIChjaG9pY2UpXG5cdHsiKTsKKyAgICAgIGZvciAocCA9IHRhYmxlLT5saXN0OyBwOyBwID0gcC0+bmV4dCkKKyAgICAgIHsgaWYgKHAtPmluZm8uc3RvICYgKFNjb25zdCB8IFNwcml2YXRlIHwgU3Byb3RlY3RlZCkpCisJICBmcHJpbnRmKGZvdXQsICJcblx0Lyogbm9uLXNlcmlhbGl6YWJsZSAlcyBza2lwcGVkICovIiwgcC0+c3ltLT5uYW1lKTsKKwllbHNlIGlmIChpc190cmFuc2llbnQocC0+aW5mby50eXApKQorCSAgZnByaW50Zihmb3V0LCAiXG5cdC8qIHRyYW5zaWVudCAlcyBza2lwcGVkICovIiwgcC0+c3ltLT5uYW1lKTsKKwllbHNlIGlmIChwLT5pbmZvLnN0byAmIFNhdHRyaWJ1dGUpCisJICA7CisJZWxzZSBpZiAoaXNfcmVwZXRpdGlvbihwKSkKKwkgIDsKKwllbHNlIGlmIChpc19hbnl0eXBlKHApKQorCSAgOworCWVsc2UgaWYgKHAtPmluZm8udHlwLT50eXBlID09IFRhcnJheSkKKwl7IGZwcmludGYoZm91dCwgIlxuXHRjYXNlIFNPQVBfVU5JT05fJXNfJXM6IiwgY19pZGVudCh0eXApLCBwLT5zeW0tPm5hbWUpOworCSAgZnByaW50Zihmb3V0LCAiXG5cdFx0cmV0dXJuIHNvYXBfb3V0XyVzKHNvYXAsIFwiJXNcIiwgLTEsIGEtPiVzLCBcIiVzXCIpOyIsIGNfaWRlbnQocC0+aW5mby50eXApLG5zX2FkZChwLT5zeW0tPm5hbWUsIG5zZSkscC0+c3ltLT5uYW1lLHhzaV90eXBlX2NvbmRfdShwLT5pbmZvLnR5cCwgIWhhc19uc19lcShOVUxMLCBwLT5zeW0tPm5hbWUpKSk7CisJfQorCWVsc2UgaWYgKHAtPmluZm8udHlwLT50eXBlID09IFRjbGFzcyAmJiAhaXNfZXh0ZXJuYWwocC0+aW5mby50eXApICYmICFpc192b2xhdGlsZShwLT5pbmZvLnR5cCkgJiYgIWlzX3R5cGVkZWYocC0+aW5mby50eXApKQorCXsgZnByaW50Zihmb3V0LCAiXG5cdGNhc2UgU09BUF9VTklPTl8lc18lczoiLCBjX2lkZW50KHR5cCksIHAtPnN5bS0+bmFtZSk7CisJICBmcHJpbnRmKGZvdXQsICJcblx0XHRyZXR1cm4gYS0+JXMuc29hcF9vdXQoc29hcCwgXCIlc1wiLCAtMSwgXCIlc1wiKTsiLCBwLT5zeW0tPm5hbWUsbnNfYWRkKHAtPnN5bS0+bmFtZSwgbnNlKSx4c2lfdHlwZV9jb25kX3UocC0+aW5mby50eXAsICFoYXNfbnNfZXEoTlVMTCwgcC0+c3ltLT5uYW1lKSkpOworCX0KKwllbHNlIGlmIChpc19xbmFtZShwLT5pbmZvLnR5cCkgfHwgaXNfc3RkcW5hbWUocC0+aW5mby50eXApKQorCXsgZnByaW50Zihmb3V0LCAiXG5cdGNhc2UgU09BUF9VTklPTl8lc18lczoiLCBjX2lkZW50KHR5cCksIHAtPnN5bS0+bmFtZSk7CisgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0e1x0Y29uc3QgY2hhciAqc29hcF90bXBfJXMgPSBzb2FwX1FOYW1lMnMoc29hcCwgYS0+JXMpOyIsIHAtPnN5bS0+bmFtZSwgcC0+c3ltLT5uYW1lKTsKKwkgIGZwcmludGYoZm91dCwiXG5cdFx0cmV0dXJuIHNvYXBfb3V0XyVzKHNvYXAsIFwiJXNcIiwgLTEsIChjaGFyKmNvbnN0Kikmc29hcF90bXBfJXMsIFwiJXNcIik7XG5cdH0iLCBjX2lkZW50KHAtPmluZm8udHlwKSxuc19hZGQocC0+c3ltLT5uYW1lLCBuc2UpLHAtPnN5bS0+bmFtZSwgeHNpX3R5cGVfY29uZF91KHAtPmluZm8udHlwLCAhaGFzX25zX2VxKE5VTEwsIHAtPnN5bS0+bmFtZSkpKTsKKwl9CisJZWxzZSBpZiAoaXNfWE1MKHAtPmluZm8udHlwKSAmJiBpc19zdHJpbmcocC0+aW5mby50eXApKQorCXsgZnByaW50Zihmb3V0LCAiXG5cdGNhc2UgU09BUF9VTklPTl8lc18lczoiLCBjX2lkZW50KHR5cCksIHAtPnN5bS0+bmFtZSk7CisJICBmcHJpbnRmKGZvdXQsIlxuXHRcdHJldHVybiBzb2FwX291dGxpdGVyYWwoc29hcCwgXCIlc1wiLCAmYS0+JXMpOyIsIG5zX2FkZChwLT5zeW0tPm5hbWUsIG5zZSkscC0+c3ltLT5uYW1lKTsKKwl9CisJZWxzZSBpZiAoaXNfWE1MKHAtPmluZm8udHlwKSAmJiBpc193c3RyaW5nKHAtPmluZm8udHlwKSkKKwl7IGZwcmludGYoZm91dCwgIlxuXHRjYXNlIFNPQVBfVU5JT05fJXNfJXM6IiwgY19pZGVudCh0eXApLCBwLT5zeW0tPm5hbWUpOworCSAgZnByaW50Zihmb3V0LCJcblx0XHRyZXR1cm4gc29hcF9vdXR3bGl0ZXJhbChzb2FwLCBcIiVzXCIsICZhLT4lcyk7IiwgbnNfYWRkKHAtPnN5bS0+bmFtZSwgbnNlKSxwLT5zeW0tPm5hbWUpOworCX0KKwllbHNlIGlmIChwLT5pbmZvLnR5cC0+dHlwZSAhPSBUZnVuICYmICFpc192b2lkKHAtPmluZm8udHlwKSkKKwl7IGZwcmludGYoZm91dCwgIlxuXHRjYXNlIFNPQVBfVU5JT05fJXNfJXM6IiwgY19pZGVudCh0eXApLCBwLT5zeW0tPm5hbWUpOworCSAgZnByaW50Zihmb3V0LCJcblx0XHRyZXR1cm4gc29hcF9vdXRfJXMoc29hcCwgXCIlc1wiLCAtMSwgJmEtPiVzLCBcIiVzXCIpOyIsIGNfaWRlbnQocC0+aW5mby50eXApLG5zX2FkZChwLT5zeW0tPm5hbWUsIG5zZSkscC0+c3ltLT5uYW1lLCB4c2lfdHlwZV9jb25kX3UocC0+aW5mby50eXAsICFoYXNfbnNfZXEoTlVMTCwgcC0+c3ltLT5uYW1lKSkpOworICAgICAgICB9CisgICAgICB9CQorICAgICAgZnByaW50Zihmb3V0LCAiXG5cdH1cblx0cmV0dXJuIFNPQVBfT0s7XG59Iik7CisgICAgICBmZmx1c2goZm91dCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVHBvaW50ZXI6CisgICAgICBpZiAoaXNfZXh0ZXJuYWwodHlwKSkKKyAgICAgIHsgZnByaW50ZihmaGVhZCwiXG5TT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0XyVzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsICVzLCBjb25zdCBjaGFyICopOyIsIGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiY29uc3QqIikpOyAKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgZnByaW50ZihmaGVhZCwiXG5TT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0XyVzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsICVzLCBjb25zdCBjaGFyICopOyIsIGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiY29uc3QqIikpOyAKKyAgICAgIGZwcmludGYoZm91dCwiXG5cblNPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfJXMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCAlcywgY29uc3QgY2hhciAqdHlwZSlcbnsiLCBjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgImNvbnN0KmEiKSk7IAorICAgICAgaWYgKGlzX3RlbXBsYXRlKHR5cCkpCisgICAgICB7IGZwcmludGYoZm91dCwiXG5cdGlmICghKmEpIik7CisgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0cmV0dXJuIHNvYXBfZWxlbWVudF9udWxsKHNvYXAsIHRhZywgaWQsIHR5cGUpOyIpOworICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRyZXR1cm4gc29hcF9vdXRfJXMoc29hcCwgdGFnLCBpZCwgKmEsIHR5cGUpOyIsIGNfaWRlbnQodHlwLT5yZWYpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgaWYgKHAgPSBpc19keW5hbWljX2FycmF5KHR5cC0+cmVmKSkKKyAgICAgICAgeyBkID0gZ2V0X0RhcnJheWRpbXModHlwLT5yZWYpOworCSAgaWYgKGQpCisgICAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRpZCA9IHNvYXBfZWxlbWVudF9pZChzb2FwLCB0YWcsIGlkLCAqYSwgKHN0cnVjdCBzb2FwX2FycmF5KikmKCphKS0+JXMsICVkLCB0eXBlLCAlcyk7IiwgcC0+c3ltLT5uYW1lLCBkLCBzb2FwX3R5cGUodHlwLT5yZWYpKTsKKwkgIGVsc2UKKyAgICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdGlkID0gc29hcF9lbGVtZW50X2lkKHNvYXAsIHRhZywgaWQsICphLCAoc3RydWN0IHNvYXBfYXJyYXkqKSYoKmEpLT4lcywgMSwgdHlwZSwgJXMpOyIsIHAtPnN5bS0+bmFtZSwgc29hcF90eXBlKHR5cC0+cmVmKSk7CisgICAgICAgIH0KKwllbHNlCisgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0aWQgPSBzb2FwX2VsZW1lbnRfaWQoc29hcCwgdGFnLCBpZCwgKmEsIE5VTEwsIDAsIHR5cGUsICVzKTsiLCBzb2FwX3R5cGUodHlwLT5yZWYpKTsKKwlmcHJpbnRmKGZvdXQsIlxuXHRpZiAoaWQgPCAwKVxuXHRcdHJldHVybiBzb2FwLT5lcnJvcjsiKTsKKyAgICAgICAgaWYoKChUbm9kZSAqKSB0eXAtPnJlZiktPnR5cGUgPT0gVGNsYXNzICYmICFpc19leHRlcm5hbCh0eXAtPnJlZikgJiYgIWlzX3ZvbGF0aWxlKHR5cC0+cmVmKSAmJiAhaXNfdHlwZWRlZih0eXAtPnJlZikpCisJICBmcHJpbnRmKGZvdXQsIlxuXHRyZXR1cm4gKCphKS0+c29hcF9vdXQoc29hcCwgdGFnLCBpZCwgdHlwZSk7IiwgY19pZGVudCh0eXAtPnJlZikpOworICAgICAgICBlbHNlCisJICBmcHJpbnRmKGZvdXQsIlxuXHRyZXR1cm4gc29hcF9vdXRfJXMoc29hcCwgdGFnLCBpZCwgKmEsIHR5cGUpOyIsY19pZGVudCh0eXAtPnJlZikpOworICAgICAgfQorICAgICAgZnByaW50Zihmb3V0LCJcbn0iKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUYXJyYXk6CisgICAgICBpZiAoaXNfZXh0ZXJuYWwodHlwKSkKKyAgICAgIHsgZnByaW50ZihmaGVhZCwiXG5TT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0XyVzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgJXMsIGNvbnN0IGNoYXIqKTsiLCBjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgImNvbnN0IikpOyAKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgZnByaW50ZihmaGVhZCwiXG5TT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0XyVzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgJXMsIGNvbnN0IGNoYXIqKTsiLCBjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgImNvbnN0IikpOyAKKyAgICAgIGZwcmludGYoZm91dCwiXG5cblNPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfJXMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCAlcywgY29uc3QgY2hhciAqdHlwZSlcbnsiLCBjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgImNvbnN0IGEiKSk7IAorICAgICAgZnByaW50Zihmb3V0LCJcblx0aW50IGk7Iik7CisgICAgICAgIGZwcmludGYoZm91dCwiXG5cdHNvYXBfYXJyYXlfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgYSwgJXMpLCBcIiVzWyVkXVwiLCAwKTsiLCBzb2FwX3R5cGUodHlwKSwgeHNpX3R5cGVfVGFycmF5KHR5cCksIGdldF9kaW1lbnNpb24odHlwKSk7CisgICAgICBuPXR5cC0+cmVmOworICAgICAgY2FyZGluYWxpdHkgPSAxOworICAgICAgd2hpbGUobi0+dHlwZT09VGFycmF5KQorCXsKKwkgIG49bi0+cmVmOworCSAgY2FyZGluYWxpdHkrKzsKKwl9CisKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdGZvciAoaSA9IDA7IGkgPCAlZDsgaSsrKVxuXHR7IixnZXRfZGltZW5zaW9uKHR5cCkpOworICAgICBpZiAoKChUbm9kZSAqKXR5cC0+cmVmKS0+dHlwZSA9PSBUY2xhc3MgJiYgIWlzX2V4dGVybmFsKHR5cC0+cmVmKSAmJiAhaXNfdm9sYXRpbGUodHlwLT5yZWYpICYmICFpc190eXBlZGVmKHR5cC0+cmVmKSkKKyAgICAgeyBpZihjYXJkaW5hbGl0eT4xKQorICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRhW2ldLnNvYXBfb3V0KHNvYXAsIFwiaXRlbVwiLCAtMSwgXCIlc1wiKSIsIHhzaV90eXBlX3UodHlwLT5yZWYpKTsKKyAgICAgICBlbHNlIGZwcmludGYoZm91dCwiXG5cdFx0KGEraSktPnNvYXBfb3V0KHNvYXAsIFwiaXRlbVwiLCAtMSwgXCIlc1wiKSIsIHhzaV90eXBlX3UodHlwLT5yZWYpKTsKKyAgICAgfQorICAgICBlbHNlCisgICAgIHsgaWYoKChUbm9kZSAqKXR5cC0+cmVmKS0+dHlwZSAhPSBUYXJyYXkpCisgICAgICAgeyBpZigoKFRub2RlICopdHlwLT5yZWYpLT50eXBlID09IFRwb2ludGVyKQorCSAgZnByaW50Zihmb3V0LCJcblx0XHRzb2FwLT5wb3NpdGlvbiA9IDE7XG5cdFx0c29hcC0+cG9zaXRpb25zWzBdID0gaTtcblx0XHRzb2FwX291dF8lcyhzb2FwLCBcIml0ZW1cIiwgLTEsIGEiLCBjX2lkZW50KHR5cC0+cmVmKSk7CisJIGVsc2UKKwkgIGZwcmludGYoZm91dCwiXG5cdFx0c29hcF9vdXRfJXMoc29hcCwgXCJpdGVtXCIsIC0xLCBhIixjX2lkZW50KHR5cC0+cmVmKSk7CisgICAgICAgfQorICAgICAgIGVsc2UKKyAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0c29hcF9vdXRfJXMoc29hcCwgXCJpdGVtXCIsIC0xLCBhIixjX2lkZW50KHR5cC0+cmVmKSk7CisgICAgICAgaWYoY2FyZGluYWxpdHk+MSkKKyAgICAgICAgIGZwcmludGYoZm91dCwiW2ldLCBcIiVzXCIpIiwgeHNpX3R5cGVfdSh0eXAtPnJlZikpOworICAgICAgIGVsc2UKKyAgICAgICAgIGZwcmludGYoZm91dCwiK2ksIFwiJXNcIikiLCB4c2lfdHlwZV91KHR5cC0+cmVmKSk7CisgICAgICB9CisgICAgICBpZigoKFRub2RlICopdHlwLT5yZWYpLT50eXBlID09IFRwb2ludGVyKQorICAgICAgICBmcHJpbnRmKGZvdXQsIjtcblx0fVxuXHRzb2FwLT5wb3NpdGlvbiA9IDA7XG5cdHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Iik7CisgICAgICBlbHNlCisgICAgICAgIGZwcmludGYoZm91dCwiO1xuXHR9XG5cdHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Iik7CQkKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdHJldHVybiBTT0FQX09LO1xufSIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRlbnVtOgorICAgICAgaWYgKGlzX2V4dGVybmFsKHR5cCkpCisgICAgICB7IGZwcmludGYoZmhlYWQsICJcblNPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRfJXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCAlcywgY29uc3QgY2hhciopOyIsIGNfaWRlbnQodHlwKSwgY190eXBlX2lkKHR5cCwgIioiKSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGZwcmludGYoZmhlYWQsICJcblNPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfJXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCAlcywgY29uc3QgY2hhciopOyIsIGNfaWRlbnQodHlwKSwgY190eXBlX2lkKHR5cCwgIioiKSk7CisgICAgICBpZiAoIWlzX3R5cGVkZWYodHlwKSkKKyAgICAgIHsgZnByaW50Zihmb3V0LCAiXG5cbnN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCBzb2FwX2NvZGVzXyVzW10gPVxueyIsIGNfaWRlbnQodHlwKSk7CisgICAgICAgIGZvciAodCA9IChUYWJsZSopdHlwLT5yZWY7IHQ7IHQgPSB0LT5wcmV2KQorICAgICAgICB7IGZvciAocCA9IHQtPmxpc3Q7IHA7IHAgPSBwLT5uZXh0KQorCSAgICBmcHJpbnRmKGZvdXQsICJcdHsgKGxvbmcpJXMsIFwiJXNcIiB9LFxuIiwgcC0+c3ltLT5uYW1lLCBuc19yZW1vdmUyKHAtPnN5bS0+bmFtZSkpOworICAgICAgICB9CQorICAgICAgICBmcHJpbnRmKGZvdXQsICJcdHsgMCwgTlVMTCB9XG4iKTsKKyAgICAgICAgZnByaW50Zihmb3V0LCAifTsiKTsKKyAgICAgIH0KKyAgICAgIGlmICghaXNfbWFzayh0eXApKQorICAgICAgeyBmcHJpbnRmKGZoZWFkLCAiXG5cblNPQVBfRk1BQzNTIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzRTIHNvYXBfJXMycyhzdHJ1Y3Qgc29hcCosICVzKTsiLCBjX2lkZW50KHR5cCksIGNfdHlwZSh0eXApKTsKKyAgICAgICAgZnByaW50Zihmb3V0LCAiXG5cblNPQVBfRk1BQzNTIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzRTIHNvYXBfJXMycyhzdHJ1Y3Qgc29hcCAqc29hcCwgJXMpIiwgY19pZGVudCh0eXApLCBjX3R5cGVfaWQodHlwLCAibiIpKTsKKwlpZiAoaXNfdHlwZWRlZih0eXApKQorICAgICAgICAgIGZwcmludGYoZm91dCwgIlxue1x0cmV0dXJuIHNvYXBfJXMycyhzb2FwLCBuKTtcbn0iLCB0X2lkZW50KHR5cCkpOworCWVsc2UKKyAgICAgICAgeyBmcHJpbnRmKGZvdXQsICJcbntcdGNvbnN0IGNoYXIgKnMgPSBzb2FwX3N0cl9jb2RlKHNvYXBfY29kZXNfJXMsIChsb25nKW4pOyIsIGNfaWRlbnQodHlwKSk7CisgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG5cdGlmIChzKVxuXHRcdHJldHVybiBzOyIpOworICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuXHRyZXR1cm4gc29hcF9sb25nMnMoc29hcCwgKGxvbmcpbik7Iik7CisgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG59Iik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChpc19tYXNrKHR5cCkpCisgICAgICB7IGZwcmludGYoZm91dCwgIlxuXG5TT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0XyVzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgJXMsIGNvbnN0IGNoYXIgKnR5cGUpIiwgY19pZGVudCh0eXApLCBjX3R5cGVfaWQodHlwLCAiKmEiKSk7CisgICAgICAgIGZwcmludGYoZm91dCwgIlxue1x0bG9uZyBpO1xuXHRzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgYSwgJXMpLCB0eXBlKTsiLCBzb2FwX3R5cGUodHlwKSk7CisgICAgICAgIGZwcmludGYoZm91dCwgIlxuXHRmb3IgKGkgPSAxOyBpOyBpIDw8PSAxKSIpOworICAgICAgICBmcHJpbnRmKGZvdXQsICJcblx0XHRzd2l0Y2ggKChsb25nKSphICYgaSlcblx0XHR7Iik7CisgICAgICAgIGZvciAodCA9IChUYWJsZSopdHlwLT5yZWY7IHQ7IHQgPSB0LT5wcmV2KQorICAgICAgICB7IGZvciAocCA9IHQtPmxpc3Q7IHA7IHAgPSBwLT5uZXh0KQorCSAgICBmcHJpbnRmKGZvdXQsICJcblx0XHRcdGNhc2UgIlNPQVBfTE9OR19GT1JNQVQiOiBzb2FwX3NlbmQoc29hcCwgXCIlcyBcIik7IGJyZWFrOyIsIHAtPmluZm8udmFsLmksIG5zX3JlbW92ZTIocC0+c3ltLT5uYW1lKSk7CisgICAgICAgIH0JCisgICAgICAgIGZwcmludGYoZm91dCwgIlxuXHRcdH0iKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgZnByaW50Zihmb3V0LCAiXG5cblNPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfJXMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCAlcywgY29uc3QgY2hhciAqdHlwZSkiLCBjX2lkZW50KHR5cCksIGNfdHlwZV9pZCh0eXAsICIqYSIpKTsKKyAgICAgICAgZnByaW50Zihmb3V0LCAiXG57XHRzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgYSwgJXMpLCB0eXBlKTsiLCBzb2FwX3R5cGUodHlwKSk7CisgICAgICAgIGZwcmludGYoZm91dCwgIlxuXHRzb2FwX3NlbmQoc29hcCwgc29hcF8lczJzKHNvYXAsICphKSk7IiwgY19pZGVudCh0eXApKTsKKyAgICAgIH0KKyAgICAgIGZwcmludGYoZm91dCwgIlxuXHRyZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTtcbn0iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHRlbXBsYXRlOgorICAgICAgaWYgKGlzX2V4dGVybmFsKHR5cCkpCisgICAgICB7IGZwcmludGYoZmhlYWQsIlxuU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dF8lcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0ICVzLCBjb25zdCBjaGFyKik7IiwgY19pZGVudCh0eXApLGNfdHlwZV9pZCh0eXAsICIqIikpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBmcHJpbnRmKGZoZWFkLCJcblNPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfJXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCAlcywgY29uc3QgY2hhciopOyIsIGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiKiIpKTsKKyAgICAgIG4gPSB0eXAtPnJlZjsKKyAgICAgIGlmICghbikKKyAgICAgICAgcmV0dXJuOworICAgICAgZnByaW50Zihmb3V0LCJcblxuU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF8lcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0ICVzLCBjb25zdCBjaGFyICp0eXBlKVxueyIsIGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiKmEiKSk7IAorCisgICAgICBmcHJpbnRmKGZvdXQsICJcblx0Zm9yICglczo6Y29uc3RfaXRlcmF0b3IgaSA9IGEtPmJlZ2luKCk7IGkgIT0gYS0+ZW5kKCk7ICsraSlcblx0eyIsIGNfdHlwZSh0eXApKTsKKyAgICAgIGlmIChuLT50eXBlPT1UYXJyYXkpCisJZnByaW50Zihmb3V0LCJcblx0XHRpZiAoc29hcF9vdXRfJXMoc29hcCwgdGFnLCBpZCwgKmksIFwiJXNcIikpIiwgY19pZGVudChuKSwgeHNpX3R5cGVfdSh0eXApKTsKKyAgICAgIGVsc2UgaWYgKG4tPnR5cGU9PVRjbGFzcyAmJiAhaXNfZXh0ZXJuYWwobikgJiYgIWlzX3ZvbGF0aWxlKG4pICYmICFpc190eXBlZGVmKG4pKQorCWZwcmludGYoZm91dCwiXG5cdFx0aWYgKCgqaSkuc29hcF9vdXQoc29hcCwgdGFnLCBpZCwgXCIlc1wiKSkiLCB4c2lfdHlwZV91KHR5cCkpOworICAgICAgZWxzZSBpZiAoaXNfWE1MKG4pICYmIGlzX3N0cmluZyhuKSkKKyAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRpZiAoc29hcF9vdXRsaXRlcmFsKHNvYXAsIFwiJXNcIiwgJigqaSkpKSIsIHhzaV90eXBlX3UodHlwKSk7CisgICAgICBlbHNlIGlmIChpc19YTUwobikgJiYgaXNfd3N0cmluZyhuKSkKKyAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRpZiAoc29hcF9vdXR3bGl0ZXJhbChzb2FwLCBcIiVzXCIsICYoKmkpKSkiLCB4c2lfdHlwZV91KHR5cCkpOworICAgICAgZWxzZSBpZiAobi0+dHlwZSA9PSBUZW51bSAmJiBuLT5yZWYgPT0gYm9vbHRhYmxlKQorCWZwcmludGYoZm91dCwiXG5cdFx0Ym9vbCBiID0gKCppKTtcblx0XHRpZiAoc29hcF9vdXRfJXMoc29hcCwgdGFnLCBpZCwgJmIsIFwiJXNcIikpIiwgY19pZGVudChuKSwgeHNpX3R5cGVfdSh0eXApKTsKKyAgICAgIGVsc2UKKwlmcHJpbnRmKGZvdXQsIlxuXHRcdGlmIChzb2FwX291dF8lcyhzb2FwLCB0YWcsIGlkLCAmKCppKSwgXCIlc1wiKSkiLCBjX2lkZW50KG4pLCB4c2lfdHlwZV91KHR5cCkpOworICAgICAgZnByaW50Zihmb3V0LCAiXG5cdFx0XHRyZXR1cm4gc29hcC0+ZXJyb3I7Iik7CisgICAgICBmcHJpbnRmKGZvdXQsICJcblx0fVxuXHRyZXR1cm4gU09BUF9PSztcbn0iKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIH0KK30JICAKKwordm9pZAorc29hcF9vdXRfRGFycmF5KFRub2RlICp0eXApCit7IGludCBpLCBqLCBkID0gMDsKKyAgVGFibGUgKnQsICp0YWJsZTsKKyAgRW50cnkgKnAsICpxOworICBjaGFyICpuc2UgPSBuc19xdWFsaWZpZWRFbGVtZW50KHR5cCk7CisgIGNoYXIgKm5zYSA9IG5zX3F1YWxpZmllZEF0dHJpYnV0ZSh0eXApOworICBjaGFyICppdGVtOworCisgIHRhYmxlPShUYWJsZSopdHlwLT5yZWY7CisgIGZwcmludGYoZmhlYWQsIlxuU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF8lcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0ICVzLCBjb25zdCBjaGFyKik7IiwgY19pZGVudCh0eXApLGNfdHlwZV9pZCh0eXAsICIqIikpOyAKKyAgICAgIGlmIChpc19leHRlcm5hbCh0eXApKQorICAgICAgICByZXR1cm47CisgIGlmICh0eXAtPnR5cGUgPT0gVGNsYXNzICYmICFpc192b2xhdGlsZSh0eXApICYmICFpc190eXBlZGVmKHR5cCkpCisgIHsgZnByaW50Zihmb3V0LCJcblxuaW50ICVzOjpzb2FwX291dChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnR5cGUpIGNvbnN0IiwgY190eXBlKHR5cCkpOyAKKyAgICBmcHJpbnRmKGZvdXQsIlxue1x0cmV0dXJuIHNvYXBfb3V0XyVzKHNvYXAsIHRhZywgaWQsIHRoaXMsIHR5cGUpO1xufSIsIGNfaWRlbnQodHlwKSk7IAorICB9CisgIGZmbHVzaChmb3V0KTsKKyAgZnByaW50Zihmb3V0LCJcblxuU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF8lcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0ICVzLCBjb25zdCBjaGFyICp0eXBlKVxueyIsIGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiKmEiKSk7IAorICBpZiAoaGFzX3NldHRlcih0eXApKQorICAgIGZwcmludGYoZm91dCwgIlxuXHQoKCVzKWEpLT5zZXQoc29hcCk7IiwgY190eXBlX2lkKHR5cCwgIioiKSk7CisgIGlmICghaXNfYmluYXJ5KHR5cCkpCisgIHsgZCA9IGdldF9EYXJyYXlkaW1zKHR5cCk7CisgICAgaWYgKGQpCisgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRpbnQgaSwgbiA9IHNvYXBfc2l6ZShhLT5fX3NpemUsICVkKTsiLCBkKTsKKyAgICBlbHNlCisgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRpbnQgaSwgbiA9IGEtPl9fc2l6ZTsiKTsKKyAgfQorICBpZiAodHlwLT50eXBlID09IFRjbGFzcykKKyAgeyBmb3IgKHQgPSB0YWJsZTsgdDsgdCA9IHQtPnByZXYpCisgICAgewlmb3IgKHAgPSB0LT5saXN0OyBwOyBwID0gcC0+bmV4dCkKKwl7IGlmIChwLT5pbmZvLnN0byAmIFNhdHRyaWJ1dGUpCisJICAgIHNvYXBfc2V0X2F0dHIocC0+aW5mby50eXAsIHB0cl9jYXN0KHR5cCwgImEiKSwgcC0+c3ltLT5uYW1lLCBuc19hZGQocC0+c3ltLT5uYW1lLCBuc2EpKTsKKyAgICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsgZm9yICh0ID0gdGFibGU7IHQ7IHQgPSB0LT5wcmV2KQorICAgIHsJZm9yIChwID0gdC0+bGlzdDsgcDsgcCA9IHAtPm5leHQpCisJeyBpZiAocC0+aW5mby5zdG8gJiBTYXR0cmlidXRlKQorCSAgICBzb2FwX3NldF9hdHRyKHAtPmluZm8udHlwLCAiYSIsIHAtPnN5bS0+bmFtZSwgbnNfYWRkKHAtPnN5bS0+bmFtZSwgbnNhKSk7CisgICAgICAgIH0KKyAgICB9CisgIH0KKyAgcCA9IGlzX2R5bmFtaWNfYXJyYXkodHlwKTsKKyAgaWYgKHAtPnN5bS0+bmFtZVs1XSkKKyAgICBpdGVtID0gbnNfYWRkKHAtPnN5bS0+bmFtZSArIDUsIG5zZSk7CisgIGVsc2UKKyAgICBpdGVtID0gbnNfYWRkKCJpdGVtIiwgbnNlKTsKKyAgcSA9IHRhYmxlLT5saXN0OworICBpZiAoIWhhc19ucyh0eXApICYmICFpc191bnR5cGVkKHR5cCkgJiYgIWlzX2JpbmFyeSh0eXApKQorICB7IGlmIChpc191bnR5cGVkKHAtPmluZm8udHlwKSkKKyAgICB7IGlmIChoYXNfb2Zmc2V0KHR5cCkpCisgICAgICAgIGlmIChkKQorICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdGNoYXIgKnQgPSBzb2FwX3B1dHNpemVzb2Zmc2V0cyhzb2FwLCBcIiVzXCIsIGEtPl9fc2l6ZSwgYS0+X19vZmZzZXQsICVkKTsiLCB3c2RsX3R5cGUocC0+aW5mby50eXAsICJ4c2QiKSwgZCk7IAorICAgICAgICBlbHNlCisgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0Y2hhciAqdCA9IHNvYXBfcHV0c2l6ZShzb2FwLCBcIiVzXCIsIG4gKyBhLT5fX29mZnNldCk7Iiwgd3NkbF90eXBlKHAtPmluZm8udHlwLCAieHNkIikpOworICAgICAgZWxzZSBpZiAoZCkKKwlmcHJpbnRmKGZvdXQsIlxuXHRjaGFyICp0ID0gc29hcF9wdXRzaXplcyhzb2FwLCBcIiVzXCIsIGEtPl9fc2l6ZSwgJWQpOyIsIHdzZGxfdHlwZShwLT5pbmZvLnR5cCwgInhzZCIpLCBkKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZnByaW50Zihmb3V0LCJcblx0Y2hhciAqdCA9IHNvYXBfcHV0c2l6ZShzb2FwLCBcIiVzXCIsIG4pOyIsIHdzZGxfdHlwZShwLT5pbmZvLnR5cCwgInhzZCIpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgaWYgKGhhc19vZmZzZXQodHlwKSkKKyAgICAgICAgaWYgKGQpCisgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0Y2hhciAqdCA9IHNvYXBfcHV0c2l6ZXNvZmZzZXRzKHNvYXAsIFwiJXNcIiwgYS0+X19zaXplLCBhLT5fX29mZnNldCwgJWQpOyIsIHhzaV90eXBlKHR5cCksIGQpOworICAgICAgICBlbHNlCisgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0Y2hhciAqdCA9IHNvYXBfcHV0c2l6ZShzb2FwLCBcIiVzXCIsIG4gKyBhLT5fX29mZnNldCk7Iix4c2lfdHlwZSh0eXApKTsKKyAgICAgIGVsc2UgaWYgKGQpCisgICAgICAgIGZwcmludGYoZm91dCwiXG5cdGNoYXIgKnQgPSBzb2FwX3B1dHNpemVzKHNvYXAsIFwiJXNcIiwgYS0+X19zaXplLCAlZCk7IiwgeHNpX3R5cGUodHlwKSxkKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZnByaW50Zihmb3V0LCJcblx0Y2hhciAqdCA9IHNvYXBfcHV0c2l6ZShzb2FwLCBcIiVzXCIsIGEtPl9fc2l6ZSk7IiAseHNpX3R5cGUodHlwKSk7CisgICAgfQorICB9CisgIGlmIChkKQorICAgIGZwcmludGYoZm91dCwiXG5cdGlkID0gc29hcF9lbGVtZW50X2lkKHNvYXAsIHRhZywgaWQsIGEsIChzdHJ1Y3Qgc29hcF9hcnJheSopJmEtPiVzLCAlZCwgdHlwZSwgJXMpOyIsIHAtPnN5bS0+bmFtZSwgZCwgc29hcF90eXBlKHR5cCkpOworICBlbHNlIGlmIChpc19hdHRhY2htZW50KHR5cCkpCisgICAgZnByaW50Zihmb3V0LCJcblx0aWQgPSBzb2FwX2F0dGFjaG1lbnQoc29hcCwgdGFnLCBpZCwgYSwgKHN0cnVjdCBzb2FwX2FycmF5KikmYS0+JXMsIGEtPmlkLCBhLT50eXBlLCBhLT5vcHRpb25zLCAxLCB0eXBlLCAlcyk7IiwgcC0+c3ltLT5uYW1lLCBzb2FwX3R5cGUodHlwKSk7CisgIGVsc2UKKyAgICBmcHJpbnRmKGZvdXQsIlxuXHRpZCA9IHNvYXBfZWxlbWVudF9pZChzb2FwLCB0YWcsIGlkLCBhLCAoc3RydWN0IHNvYXBfYXJyYXkqKSZhLT4lcywgMSwgdHlwZSwgJXMpOyIsIHAtPnN5bS0+bmFtZSwgc29hcF90eXBlKHR5cCkpOworICBmcHJpbnRmKGZvdXQsIlxuXHRpZiAoaWQgPCAwKVxuXHRcdHJldHVybiBzb2FwLT5lcnJvcjsiKTsKKyAgaWYgKGhhc19ucyh0eXApIHx8IGlzX3VudHlwZWQodHlwKSB8fCBpc19iaW5hcnkodHlwKSkKKyAgeyBpZiAodGFibGUtPnByZXYpCisgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgaWQsIFwiJXNcIik7IiwgeHNpX3R5cGUodHlwKSk7CisgICAgZWxzZQorICAgICAgZnByaW50Zihmb3V0LCJcblx0c29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIGlkLCB0eXBlKTsiKTsKKyAgfQorICBlbHNlIGlmIChoYXNfb2Zmc2V0KHR5cCkpCisgICAgaWYgKGQpCisgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRzb2FwX2FycmF5X2JlZ2luX291dChzb2FwLCB0YWcsIGlkLCB0LCBzb2FwX3B1dG9mZnNldHMoc29hcCwgYS0+X19vZmZzZXQsICVkKSk7IiwgZCk7CisgICAgZWxzZQorICAgICAgZnByaW50Zihmb3V0LCJcblx0c29hcF9hcnJheV9iZWdpbl9vdXQoc29hcCwgdGFnLCBpZCwgdCwgc29hcF9wdXRvZmZzZXQoc29hcCwgYS0+X19vZmZzZXQpKTsiKTsKKyAgZWxzZQorICAgIGZwcmludGYoZm91dCwiXG5cdHNvYXBfYXJyYXlfYmVnaW5fb3V0KHNvYXAsIHRhZywgaWQsIHQsIE5VTEwpOyIpOworICBpZiAoaXNfYmluYXJ5KHR5cCkgJiYgIWlzX2hleEJpbmFyeSh0eXApKQorICAgIGZwcmludGYoZm91dCwgIlxuXHRzb2FwX3B1dGJhc2U2NChzb2FwLCBhLT5fX3B0ciwgYS0+X19zaXplKTsiKTsKKyAgZWxzZSBpZiAoaXNfaGV4QmluYXJ5KHR5cCkpCisgICAgZnByaW50Zihmb3V0LCAiXG5cdHNvYXBfcHV0aGV4KHNvYXAsIGEtPl9fcHRyLCBhLT5fX3NpemUpOyIpOworICBlbHNlCisgIHsgZnByaW50Zihmb3V0LCJcblx0Zm9yIChpID0gMDsgaSA8IG47IGkrKylcblx0eyIpOworICAgIGlmICghaGFzX25zKHR5cCkgJiYgIWlzX3VudHlwZWQodHlwKSkKKyAgICB7IGlmIChkKQorICAgICAgeyBmcHJpbnRmKGZvdXQsIlxuXHRcdHNvYXAtPnBvc2l0aW9uID0gJWQ7IiwgZCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkOyBpKyspCisJeyBmcHJpbnRmKGZvdXQsICJcblx0XHRzb2FwLT5wb3NpdGlvbnNbJWRdID0gaSIsIGkpOworICAgICAgICAgIGZvciAoaiA9IGkrMTsgaiA8IGQ7IGorKykKKwkgICAgZnByaW50Zihmb3V0LCAiL2EtPl9fc2l6ZVslZF0iLCBqKTsKKwkgIGZwcmludGYoZm91dCwgIiUlYS0+X19zaXplWyVkXTsiLCBpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNfWE1MKHAtPmluZm8udHlwLT5yZWYpICYmIGlzX3N0cmluZyhwLT5pbmZvLnR5cC0+cmVmKSkKKyAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdHNvYXBfb3V0bGl0ZXJhbChzb2FwLCBcIiVzXCIsICZhLT4lc1tpXSk7IiwgaXRlbSxwLT5zeW0tPm5hbWUpOworICAgICAgICBlbHNlIGlmIChpc19YTUwocC0+aW5mby50eXAtPnJlZikgJiYgaXNfd3N0cmluZyhwLT5pbmZvLnR5cC0+cmVmKSkKKyAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdHNvYXBfb3V0d2xpdGVyYWwoc29hcCwgXCIlc1wiLCAmYS0+JXNbaV0pOyIsIGl0ZW0scC0+c3ltLT5uYW1lKTsKKyAgICAgICAgZWxzZSBpZiAoKChUbm9kZSAqKXAtPmluZm8udHlwLT5yZWYpLT50eXBlID09IFRjbGFzcyAmJiAhaXNfZXh0ZXJuYWwocC0+aW5mby50eXAtPnJlZikgJiYgIWlzX3ZvbGF0aWxlKHAtPmluZm8udHlwLT5yZWYpICYmICFpc190eXBlZGVmKHAtPmluZm8udHlwLT5yZWYpKQorICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0YS0+JXNbaV0uc29hcF9vdXQoc29hcCwgXCJpdGVtXCIsIC0xLCBcIiVzXCIpOyIsIHAtPnN5bS0+bmFtZSwgeHNpX3R5cGVfdSgoKFRub2RlICopcC0+aW5mby50eXAtPnJlZikpKTsKKwllbHNlCisJICBmcHJpbnRmKGZvdXQsICJcblx0XHRzb2FwX291dF8lcyhzb2FwLCBcIiVzXCIsIC0xLCAmYS0+JXNbaV0sIFwiJXNcIik7IixjX2lkZW50KCgoVG5vZGUgKilwLT5pbmZvLnR5cC0+cmVmKSksIGl0ZW0sIHAtPnN5bS0+bmFtZSwgeHNpX3R5cGVfdSgoKFRub2RlICopcC0+aW5mby50eXAtPnJlZikpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgZnByaW50Zihmb3V0LCJcblx0XHRzb2FwLT5wb3NpdGlvbiA9IDE7XG5cdFx0c29hcC0+cG9zaXRpb25zWzBdID0gaTsiKTsKKyAgICAgICAgaWYgKGlzX1hNTChwLT5pbmZvLnR5cC0+cmVmKSAmJiBpc19zdHJpbmcocC0+aW5mby50eXAtPnJlZikpCisgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRzb2FwX291dGxpdGVyYWwoc29hcCwgXCIlc1wiLCAmYS0+JXNbaV0pOyIsIGl0ZW0scC0+c3ltLT5uYW1lKTsKKyAgICAgICAgZWxzZSBpZiAoaXNfWE1MKHAtPmluZm8udHlwLT5yZWYpICYmIGlzX3dzdHJpbmcocC0+aW5mby50eXAtPnJlZikpCisgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRzb2FwX291dHdsaXRlcmFsKHNvYXAsIFwiJXNcIiwgJmEtPiVzW2ldKTsiLCBpdGVtLHAtPnN5bS0+bmFtZSk7CisgICAgICAgIGVsc2UgaWYgKCgoVG5vZGUgKilwLT5pbmZvLnR5cC0+cmVmKS0+dHlwZSA9PSBUY2xhc3MgJiYgIWlzX2V4dGVybmFsKHAtPmluZm8udHlwLT5yZWYpICYmICFpc192b2xhdGlsZShwLT5pbmZvLnR5cC0+cmVmKSAmJiAhaXNfdHlwZWRlZihwLT5pbmZvLnR5cC0+cmVmKSkKKyAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdGEtPiVzW2ldLnNvYXBfb3V0KHNvYXAsIFwiaXRlbVwiLCAtMSwgXCIlc1wiKTsiLCBwLT5zeW0tPm5hbWUsIHhzaV90eXBlX3UoKChUbm9kZSAqKXAtPmluZm8udHlwLT5yZWYpKSk7CisJZWxzZQorICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0c29hcF9vdXRfJXMoc29hcCwgXCIlc1wiLCAtMSwgJmEtPiVzW2ldLCBcIiVzXCIpOyIsY19pZGVudCgoKFRub2RlICopcC0+aW5mby50eXAtPnJlZikpLCBpdGVtLCBwLT5zeW0tPm5hbWUseHNpX3R5cGVfdSgoKFRub2RlICopcC0+aW5mby50eXAtPnJlZikpKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRzb2FwX291dF8lcyhzb2FwLCBcIiVzXCIsIC0xLCAmYS0+JXNbaV0sIFwiJXNcIik7IixjX2lkZW50KCgoVG5vZGUgKilwLT5pbmZvLnR5cC0+cmVmKSksIAorCWl0ZW0sIHAtPnN5bS0+bmFtZSwgeHNpX3R5cGVfdSgoKFRub2RlICopcC0+aW5mby50eXAtPnJlZikpKTsKKyAgfQorICBpZiAoaXNfYmluYXJ5KHR5cCkpCisgICAgZnByaW50Zihmb3V0LCJcblx0c29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsiKTsKKyAgZWxzZSBpZiAoIWhhc19ucyh0eXApICYmICFpc191bnR5cGVkKHR5cCkpCisgICAgZnByaW50Zihmb3V0LCJcblx0fVxuXHRzb2FwLT5wb3NpdGlvbiA9IDA7XG5cdHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Iik7CisgIGVsc2UKKyAgICBmcHJpbnRmKGZvdXQsIlxuXHR9XG5cdHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Iik7CisgIGZwcmludGYoZm91dCwiXG5cdHJldHVybiBTT0FQX09LO1xufSIpOwkgCit9CisKK3ZvaWQKK3NvYXBfZ2V0KFRub2RlICp0eXApCit7CisgIFRub2RlICp0ZW1wOworICAKKyAgaWYgKHR5cC0+dHlwZSA9PSBUdGVtcGxhdGUgfHwgdHlwLT50eXBlID09IFR1bmlvbikKKyAgICByZXR1cm47CisKKyAgaWYodHlwLT50eXBlPT1UYXJyYXkpCisgICAgeworICAgICAgLyogQVJSQVkgKi8KKyAgICAgIHRlbXAgPSB0eXA7CisgICAgICB3aGlsZSh0ZW1wLT50eXBlID09IFRhcnJheSl7CisJdGVtcCA9IHRlbXAtPnJlZjsKKyAgICAgIH0KKyAgICAgIGZwcmludGYoZmhlYWQsIlxuU09BUF9GTUFDMyAlcyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfJXMoc3RydWN0IHNvYXAqLCAlcywgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsiLCBjX3R5cGUodGVtcCksY19pZGVudCh0eXApLGNfdHlwZSh0eXApKTsKKyAgICAgIGZwcmludGYoZm91dCwiXG5cblNPQVBfRk1BQzMgJXMgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0XyVzKHN0cnVjdCBzb2FwICpzb2FwLCAlcywgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKSIsIGNfdHlwZSh0ZW1wKSxjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgImEiKSk7CisgICAgICBmcHJpbnRmKGZvdXQsIlxue1x0JXM7IixjX3R5cGVfaWQodGVtcCwgIigqcCkiKSk7CisgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRpZiAoKHAgPSBzb2FwX2luXyVzKHNvYXAsIHRhZywgYSwgdHlwZSkpKSIsIGNfaWRlbnQodHlwKSk7CisgICAgfQorICBlbHNlIGlmKHR5cC0+dHlwZT09VGNsYXNzICYmICFpc19leHRlcm5hbCh0eXApICYmICFpc192b2xhdGlsZSh0eXApICYmICFpc190eXBlZGVmKHR5cCkpCisgICAgeworICAgICAgLyogQ0xBU1MgICovCisgICAgICBmcHJpbnRmKGZvdXQsIlxuXG52b2lkIColczo6c29hcF9nZXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSkiLCBjX3R5cGUodHlwKSk7CisgICAgICBmcHJpbnRmKGZvdXQsIlxue1xuXHRyZXR1cm4gc29hcF9nZXRfJXMoc29hcCwgdGhpcywgdGFnLCB0eXBlKTtcbn0iLCBjX2lkZW50KHR5cCkpOworICAgICAgZnByaW50ZihmaGVhZCwiXG5TT0FQX0ZNQUMzICVzIFNPQVBfRk1BQzQgc29hcF9nZXRfJXMoc3RydWN0IHNvYXAqLCAlcywgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsiLCBjX3R5cGVfaWQodHlwLCAiKiIpLGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiKiIpKTsKKyAgICAgIGZwcmludGYoZm91dCwiXG5cblNPQVBfRk1BQzMgJXMgU09BUF9GTUFDNCBzb2FwX2dldF8lcyhzdHJ1Y3Qgc29hcCAqc29hcCwgJXMsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdHlwZSlcbnsiLCBjX3R5cGVfaWQodHlwLCAiKiIpLGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiKnAiKSk7CisgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRpZiAoKHAgPSBzb2FwX2luXyVzKHNvYXAsIHRhZywgcCwgdHlwZSkpKSIsIGNfaWRlbnQodHlwKSk7CisgICAgfQorICBlbHNlIAorICAgIHsKKyAgICAgIGZwcmludGYoZmhlYWQsIlxuU09BUF9GTUFDMyAlcyBTT0FQX0ZNQUM0IHNvYXBfZ2V0XyVzKHN0cnVjdCBzb2FwKiwgJXMsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7IiwgY190eXBlX2lkKHR5cCwgIioiKSxjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgIioiKSk7CisgICAgICBmcHJpbnRmKGZvdXQsIlxuXG5TT0FQX0ZNQUMzICVzIFNPQVBfRk1BQzQgc29hcF9nZXRfJXMoc3RydWN0IHNvYXAgKnNvYXAsICVzLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnR5cGUpXG57IiwgY190eXBlX2lkKHR5cCwgIioiKSxjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgIipwIikpOworICAgICAgZnByaW50Zihmb3V0LCJcblx0aWYgKChwID0gc29hcF9pbl8lcyhzb2FwLCB0YWcsIHAsIHR5cGUpKSkiLCBjX2lkZW50KHR5cCkpOworICAgIH0KKyAgZnByaW50Zihmb3V0LCJcblx0XHRzb2FwX2dldGluZGVwZW5kZW50KHNvYXApOyIpOworICBmcHJpbnRmKGZvdXQsIlxuXHRyZXR1cm4gcDtcbn0iKTsKKyAgZmZsdXNoKGZvdXQpOworfQorCit2b2lkCitzb2FwX2luKFRub2RlICp0eXApCit7IEVudHJ5ICpwOworICBUYWJsZSAqdGFibGUsKnQ7CisgIGludCB0b3RhbCxhLCBjYXJkaW5hbGl0eSxpLGo7CisgIGxvbmcgazsKKyAgdW5zaWduZWQgbG9uZyBtOworICBUbm9kZSAqbiwgKnRlbXA7CisgIGNoYXIgKm5zZSA9IG5zX3F1YWxpZmllZEVsZW1lbnQodHlwKTsKKyAgY2hhciAqbnNhID0gbnNfcXVhbGlmaWVkQXR0cmlidXRlKHR5cCk7CisgIGlmIChpc19keW5hbWljX2FycmF5KHR5cCkpCisgIHsgc29hcF9pbl9EYXJyYXkodHlwKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGlzX3ByaW1pdGl2ZV9vcl9zdHJpbmcodHlwKSAmJiB0eXAtPnR5cGUgIT0gVGVudW0pCisgIHsKKyAgICAgIGlmIChpc19zdGRxbmFtZSh0eXApKQorICAgICAgeyBmcHJpbnRmKGZoZWFkLCJcblNPQVBfRk1BQzMgc3RkOjpzdHJpbmcgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fJXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RkOjpzdHJpbmcqLCBjb25zdCBjaGFyKik7IiwgY19pZGVudCh0eXApKTsKKyAgICAgICAgZnByaW50Zihmb3V0LCJcblxuU09BUF9GTUFDMSBzdGQ6OnN0cmluZyAqIFNPQVBfRk1BQzIgc29hcF9pbl8lcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzdGQ6OnN0cmluZyAqcywgY29uc3QgY2hhciAqdHlwZSlcbntcblx0aWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDEpKVxuXHRcdHJldHVybiBOVUxMO1xuXHRpZiAoIXMpXG5cdFx0cyA9IHNvYXBfbmV3X3N0ZF9fc3RyaW5nKHNvYXAsIC0xKTtcblx0aWYgKHNvYXAtPm51bGwpXG5cdFx0aWYgKHMpXG5cdFx0XHRzLT5lcmFzZSgpO1xuXHRpZiAoKnNvYXAtPnR5cGUgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkpXG5cdHtcdHNvYXAtPmVycm9yID0gU09BUF9UWVBFO1xuXHRcdHJldHVybiBOVUxMO1xuXHR9IiwgY19pZGVudCh0eXApKTsKKyAgICAgICAgZnByaW50Zihmb3V0LCJcblx0aWYgKHNvYXAtPmJvZHkgJiYgISpzb2FwLT5ocmVmKVxuXHR7XHRjaGFyICp0O1xuXHRcdHMgPSAoc3RkOjpzdHJpbmcqKXNvYXBfY2xhc3NfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHMsICVzLCBzaXplb2Yoc3RkOjpzdHJpbmcpLCBzb2FwLT50eXBlLCBzb2FwLT5hcnJheVR5cGUpO1xuXHRcdGlmIChzKVxuXHRcdFx0aWYgKCh0ID0gc29hcF9zdHJpbmdfaW4oc29hcCwgMiwgJWxkLCAlbGQpKSlcblx0XHRcdFx0cy0+YXNzaWduKHQpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRyZXR1cm4gTlVMTDtcblx0fVxuXHRlbHNlXG5cdFx0cyA9IChzdGQ6OnN0cmluZyopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHNvYXBfY2xhc3NfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHMsICVzLCBzaXplb2Yoc3RkOjpzdHJpbmcpLCBzb2FwLT50eXBlLCBzb2FwLT5hcnJheVR5cGUpLCAwLCAlcywgMCwgc2l6ZW9mKHN0ZDo6c3RyaW5nKSwgMCwgc29hcF9jb3B5XyVzKTtcblx0aWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKVxuXHRcdHJldHVybiBOVUxMO1xuXHRyZXR1cm4gcztcbn0iLCBzb2FwX3R5cGUodHlwKSwgdHlwLT5taW5MZW5ndGgsIHR5cC0+bWF4TGVuZ3RoLCBzb2FwX3R5cGUodHlwKSwgc29hcF90eXBlKHR5cCksIGNfaWRlbnQodHlwKSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmIChpc19zdGRzdHJpbmcodHlwKSkKKyAgICAgIHsgZnByaW50ZihmaGVhZCwiXG5TT0FQX0ZNQUMzIHN0ZDo6c3RyaW5nICogU09BUF9GTUFDNCBzb2FwX2luXyVzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHN0ZDo6c3RyaW5nKiwgY29uc3QgY2hhciopOyIsIGNfaWRlbnQodHlwKSk7CisgICAgICAgIGZwcmludGYoZm91dCwiXG5cblNPQVBfRk1BQzEgc3RkOjpzdHJpbmcgKiBTT0FQX0ZNQUMyIHNvYXBfaW5fJXMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc3RkOjpzdHJpbmcgKnMsIGNvbnN0IGNoYXIgKnR5cGUpXG57XG5cdGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAxKSlcblx0XHRyZXR1cm4gTlVMTDtcblx0aWYgKCFzKVxuXHRcdHMgPSBzb2FwX25ld19zdGRfX3N0cmluZyhzb2FwLCAtMSk7XG5cdGlmIChzb2FwLT5udWxsKVxuXHRcdGlmIChzKVxuXHRcdFx0cy0+ZXJhc2UoKTtcblx0aWYgKCpzb2FwLT50eXBlICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpKVxuXHR7XHRzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTtcblx0XHRyZXR1cm4gTlVMTDtcblx0fSIsIGNfaWRlbnQodHlwKSk7CisgICAgICAgIGZwcmludGYoZm91dCwiXG5cdGlmIChzb2FwLT5ib2R5ICYmICEqc29hcC0+aHJlZilcblx0e1x0Y2hhciAqdDtcblx0XHRzID0gKHN0ZDo6c3RyaW5nKilzb2FwX2NsYXNzX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBzLCAlcywgc2l6ZW9mKHN0ZDo6c3RyaW5nKSwgc29hcC0+dHlwZSwgc29hcC0+YXJyYXlUeXBlKTtcblx0XHRpZiAocylcblx0XHRcdGlmICgodCA9IHNvYXBfc3RyaW5nX2luKHNvYXAsIDEsICVsZCwgJWxkKSkpXG5cdFx0XHRcdHMtPmFzc2lnbih0KTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0cmV0dXJuIE5VTEw7XG5cdH1cblx0ZWxzZVxuXHRcdHMgPSAoc3RkOjpzdHJpbmcqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBzb2FwX2NsYXNzX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBzLCAlcywgc2l6ZW9mKHN0ZDo6c3RyaW5nKSwgc29hcC0+dHlwZSwgc29hcC0+YXJyYXlUeXBlKSwgMCwgJXMsIDAsIHNpemVvZihzdGQ6OnN0cmluZyksIDAsIHNvYXBfY29weV8lcyk7XG5cdGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSlcblx0XHRyZXR1cm4gTlVMTDtcblx0cmV0dXJuIHM7XG59Iiwgc29hcF90eXBlKHR5cCksIHR5cC0+bWluTGVuZ3RoLCB0eXAtPm1heExlbmd0aCwgc29hcF90eXBlKHR5cCksIHNvYXBfdHlwZSh0eXApLCBjX2lkZW50KHR5cCkpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpZiAoaXNfc3Rkd3N0cmluZyh0eXApKQorICAgICAgeyBmcHJpbnRmKGZoZWFkLCJcblNPQVBfRk1BQzMgc3RkOjp3c3RyaW5nICogU09BUF9GTUFDNCBzb2FwX2luXyVzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHN0ZDo6d3N0cmluZyosIGNvbnN0IGNoYXIqKTsiLCBjX2lkZW50KHR5cCkpOworICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXG5TT0FQX0ZNQUMxIHN0ZDo6d3N0cmluZyAqIFNPQVBfRk1BQzIgc29hcF9pbl8lcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzdGQ6OndzdHJpbmcgKnMsIGNvbnN0IGNoYXIgKnR5cGUpXG57XG5cdGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAxKSlcblx0XHRyZXR1cm4gTlVMTDtcblx0aWYgKCFzKVxuXHRcdHMgPSBzb2FwX25ld19zdGRfX3dzdHJpbmcoc29hcCwgLTEpO1xuXHRpZiAoc29hcC0+bnVsbClcblx0XHRpZiAocylcblx0XHRcdHMtPmVyYXNlKCk7XG5cdGlmICgqc29hcC0+dHlwZSAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKSlcblx0e1x0c29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7XG5cdFx0cmV0dXJuIE5VTEw7XG5cdH0iLCBjX2lkZW50KHR5cCkpOworICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRpZiAoc29hcC0+Ym9keSAmJiAhKnNvYXAtPmhyZWYpXG5cdHtcdHdjaGFyX3QgKnQ7XG5cdFx0cyA9IChzdGQ6OndzdHJpbmcqKXNvYXBfY2xhc3NfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHMsICVzLCBzaXplb2Yoc3RkOjp3c3RyaW5nKSwgc29hcC0+dHlwZSwgc29hcC0+YXJyYXlUeXBlKTtcblx0XHRpZiAocylcblx0XHRcdGlmICgodCA9IHNvYXBfd3N0cmluZ19pbihzb2FwLCAxLCAlbGQsICVsZCkpKVxuXHRcdFx0XHRzLT5hc3NpZ24odCk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHJldHVybiBOVUxMO1xuXHR9XG5cdGVsc2Vcblx0XHRzID0gKHN0ZDo6d3N0cmluZyopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHNvYXBfY2xhc3NfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHMsICVzLCBzaXplb2Yoc3RkOjp3c3RyaW5nKSwgc29hcC0+dHlwZSwgc29hcC0+YXJyYXlUeXBlKSwgMCwgJXMsIDAsIHNpemVvZihzdGQ6OndzdHJpbmcpLCAwLCBzb2FwX2NvcHlfJXMpO1xuXHRpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpXG5cdFx0cmV0dXJuIE5VTEw7XG5cdHJldHVybiBzO1xufSIsIHNvYXBfdHlwZSh0eXApLCB0eXAtPm1pbkxlbmd0aCwgdHlwLT5tYXhMZW5ndGgsIHNvYXBfdHlwZSh0eXApLCBzb2FwX3R5cGUodHlwKSwgY19pZGVudCh0eXApKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIGlmIChpc19leHRlcm5hbCh0eXApKQorICAgIHsgZnByaW50ZihmaGVhZCwiXG5TT0FQX0ZNQUMxICVzICogU09BUF9GTUFDMiBzb2FwX2luXyVzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosICVzLCBjb25zdCBjaGFyKik7IiwgY190eXBlKHR5cCksIGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiKiIpKTsgCisgICAgICByZXR1cm47CisgICAgfQorICAgIGZwcmludGYoZmhlYWQsIlxuU09BUF9GTUFDMyAlcyAqIFNPQVBfRk1BQzQgc29hcF9pbl8lcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCAlcywgY29uc3QgY2hhciopOyIsIGNfdHlwZSh0eXApLCBjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgIioiKSk7IAorICAgIGZwcmludGYoZm91dCwiXG5cblNPQVBfRk1BQzMgJXMgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fJXMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgJXMsIGNvbnN0IGNoYXIgKnR5cGUpXG57IiwgY190eXBlKHR5cCksIGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiKmEiKSk7IAorICAgIGlmICh0eXAtPnR5cGUgPT0gVGxsb25nIHx8IHR5cC0+dHlwZSA9PSBUdWxsb25nKQorICAgICAgZnByaW50Zihmb3V0LCJcblx0cmV0dXJuIHNvYXBfaW4lcyhzb2FwLCB0YWcsIGEsIHR5cGUsICVzKTtcbn0iLCBjX3R5cGUodHlwKSwgc29hcF90eXBlKHR5cCkpOworICAgIGVsc2UgaWYgKGlzX3dzdHJpbmcodHlwKSkKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdHJldHVybiBzb2FwX2lud3N0cmluZyhzb2FwLCB0YWcsIGEsIHR5cGUsICVzLCAlbGQsICVsZCk7XG59Iiwgc29hcF90eXBlKHR5cCksIHR5cC0+bWluTGVuZ3RoLCB0eXAtPm1heExlbmd0aCk7CisgICAgZWxzZSBpZiAoaXNfc3RyaW5nKHR5cCkpCisgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRyZXR1cm4gc29hcF9pbnN0cmluZyhzb2FwLCB0YWcsIGEsIHR5cGUsICVzLCAlZCwgJWxkLCAlbGQpO1xufSIsIHNvYXBfdHlwZSh0eXApLCBpc19xbmFtZSh0eXApKzEsIHR5cC0+bWluTGVuZ3RoLCB0eXAtPm1heExlbmd0aCk7CisgICAgZWxzZQorICAgICAgZnByaW50Zihmb3V0LCJcblx0cmV0dXJuIHNvYXBfaW4lcyhzb2FwLCB0YWcsIGEsIHR5cGUsICVzKTtcbn0iLCB0aGVfdHlwZSh0eXApLCBzb2FwX3R5cGUodHlwKSk7CisgICAgZmZsdXNoKGZvdXQpOworICAgIHJldHVybjsKKyAgfQorICBzd2l0Y2godHlwLT50eXBlKQorICB7IGNhc2UgVHN0cnVjdDoKKyAgICAgIGlmIChpc19leHRlcm5hbCh0eXApKQorICAgICAgeyBmcHJpbnRmKGZoZWFkLCJcblNPQVBfRk1BQzEgJXMgU09BUF9GTUFDMiBzb2FwX2luXyVzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosICVzLCBjb25zdCBjaGFyKik7IiwgY190eXBlX2lkKHR5cCwgIioiKSxjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgIioiKSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGZwcmludGYoZmhlYWQsIlxuU09BUF9GTUFDMyAlcyBTT0FQX0ZNQUM0IHNvYXBfaW5fJXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgJXMsIGNvbnN0IGNoYXIqKTsiLCBjX3R5cGVfaWQodHlwLCAiKiIpLGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiKiIpKTsKKyAgICAgIGZwcmludGYoZm91dCwiXG5cblNPQVBfRk1BQzMgJXMgU09BUF9GTUFDNCBzb2FwX2luXyVzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsICVzLCBjb25zdCBjaGFyICp0eXBlKVxueyIsIGNfdHlwZV9pZCh0eXAsICIqIiksY19pZGVudCh0eXApLGNfdHlwZV9pZCh0eXAsICIqYSIpKTsKKyAgICAgIHRhYmxlID0gKFRhYmxlICopdHlwLT5yZWY7CisgICAgICBpZiAoaXNfcHJpbWNsYXNzKHR5cCkpCisgICAgICB7IGZwcmludGYoZm91dCwgIlxuXHRpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMSkpXG5cdFx0cmV0dXJuIE5VTEw7Iik7CisJaWYgKGhhc19jbGFzcyh0eXApKQorICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdGlmICghKGEgPSAoJXMpc29hcF9jbGFzc19pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgYSwgJXMsIHNpemVvZiglcyksIHNvYXAtPnR5cGUsIHNvYXAtPmFycmF5VHlwZSkpKVxuXHRcdHJldHVybiBOVUxMOyIsIGNfdHlwZV9pZCh0eXAsICIqIiksIHNvYXBfdHlwZSh0eXApLCBjX3R5cGUodHlwKSk7CisJZWxzZQorICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdGlmICghKGEgPSAoJXMpc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgYSwgJXMsIHNpemVvZiglcyksIDAsIE5VTEwsIE5VTEwsIE5VTEwpKSlcblx0XHRyZXR1cm4gTlVMTDsiLCBjX3R5cGVfaWQodHlwLCAiKiIpLCBzb2FwX3R5cGUodHlwKSwgY190eXBlKHR5cCkpOworICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRzb2FwX3JldmVydChzb2FwKTtcblx0KnNvYXAtPmlkID0gJ1xcMCc7Iik7CisJLyogZnByaW50Zihmb3V0LCJcblx0aWYgKHNvYXAtPmFsbG9jZWQpIik7ICovCisgICAgICAgIGZwcmludGYoZm91dCwiXG5cdHNvYXBfZGVmYXVsdF8lcyhzb2FwLCBhKTsiLGNfaWRlbnQodHlwKSk7CisgICAgICAgICAgZm9yICh0ID0gKFRhYmxlKil0eXAtPnJlZjsgdDsgdCA9IHQtPnByZXYpCisgICAgICAgICAgeyBmb3IgKHAgPSB0LT5saXN0OyBwOyBwID0gcC0+bmV4dCkgCisJICAgICAgaWYgKHAtPmluZm8uc3RvICYgU2F0dHJpYnV0ZSkKKwkJc29hcF9hdHRyX3ZhbHVlKHAsICJhIiwgcC0+c3ltLT5uYW1lLCBuc19hZGQocC0+c3ltLT5uYW1lLCBuc2EpKTsKKwkgIH0KKyAgICAgIGZmbHVzaChmb3V0KTsKKwlmb3IgKHRhYmxlID0gKFRhYmxlKil0eXAtPnJlZjsgdGFibGU7IHRhYmxlID0gdGFibGUtPnByZXYpCisJeyBwID0gdGFibGUtPmxpc3Q7CisJICBpZiAocCAmJiBpc19pdGVtKHApKQorCSAgICBicmVhazsKKyAgICAgICAgfQorCSAgICBpZiAoaXNfWE1MKHAtPmluZm8udHlwKSAmJiBpc19zdHJpbmcocC0+aW5mby50eXApKQorCSAgICB7IGZwcmludGYoZm91dCwiXG5cdGlmICghc29hcF9pbmxpdGVyYWwoc29hcCwgdGFnLCAmYS0+JXMpKSIsIHAtPnN5bS0+bmFtZSx4c2lfdHlwZSh0eXApKTsKKwkgICAgfQorCSAgICBlbHNlIGlmIChpc19YTUwocC0+aW5mby50eXApICYmIGlzX3dzdHJpbmcocC0+aW5mby50eXApKQorCSAgICB7IGZwcmludGYoZm91dCwiXG5cdGlmICghc29hcF9pbndsaXRlcmFsKHNvYXAsIHRhZywgJmEtPiVzKSkiLCBwLT5zeW0tPm5hbWUseHNpX3R5cGUodHlwKSk7CisJICAgIH0KKwkgICAgZWxzZSBpZihwLT5pbmZvLnR5cC0+dHlwZT09VGFycmF5KSB7CisJICAgICAgZnByaW50Zihmb3V0LCJcblx0aWYgKCFzb2FwX2luXyVzKHNvYXAsIHRhZywgYS0+JXMsIFwiJXNcIikpIiwgY19pZGVudChwLT5pbmZvLnR5cCkscC0+c3ltLT5uYW1lLHhzaV90eXBlKHR5cCkpOworCSAgICB9CisJICAgIGVsc2UgaWYocC0+aW5mby50eXAtPnR5cGU9PVRjbGFzcyAmJiAhaXNfZXh0ZXJuYWwocC0+aW5mby50eXApICYmICFpc192b2xhdGlsZShwLT5pbmZvLnR5cCkgJiYgIWlzX3R5cGVkZWYocC0+aW5mby50eXApKSB7CisJICAgICAgZnByaW50Zihmb3V0LCJcblx0aWYgKCFhLT4lcy5zb2FwX2luKHNvYXAsIHRhZywgXCIlc1wiKSkiLCBwLT5zeW0tPm5hbWUseHNpX3R5cGUodHlwKSk7CisJICAgIH0KKwkgICAgZWxzZSBpZiAocC0+aW5mby50eXAtPnR5cGUgIT0gVGZ1biAmJiAhaXNfdm9pZChwLT5pbmZvLnR5cCkpIHsKKwkgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRpZiAoIXNvYXBfaW5fJXMoc29hcCwgdGFnLCAmYS0+JXMsIFwiJXNcIikpIiwgY19pZGVudChwLT5pbmZvLnR5cCkscC0+c3ltLT5uYW1lLHhzaV90eXBlKHR5cCkpOworCSAgICB9CisgICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0cmV0dXJuIE5VTEw7Iik7CisgICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuXHRyZXR1cm4gYTtcbn0iKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgYT0wOworICAgICAgICB0YWJsZSA9IChUYWJsZSAqKXR5cC0+cmVmOworCWlmICghaXNfZGlzY3JpbWluYW50KHR5cCkpCisgICAgICAgIHsgZm9yICh0ID0gdGFibGU7IHQ7IHQgPSB0LT5wcmV2KQorCSAgICBmb3IgKHAgPSB0LT5saXN0OyBwOyBwID0gcC0+bmV4dCkKKwkgICAgeyBpZiAoIShwLT5pbmZvLnN0byAmIChTY29uc3QgfCBTcHJpdmF0ZSB8IFNwcm90ZWN0ZWQpKSAmJiAhKHAtPmluZm8uc3RvICYgU2F0dHJpYnV0ZSkgJiYgcC0+aW5mby50eXAtPnR5cGUgIT0gVGZ1biAmJiAhaXNfdm9pZChwLT5pbmZvLnR5cCkgJiYgIWlzX3RyYW5zaWVudChwLT5pbmZvLnR5cCkgJiYgIWlzX3JlcGV0aXRpb24ocCkgJiYgIWlzX3RlbXBsYXRlKHAtPmluZm8udHlwKSkKKwkgICAgICB7IGlmIChpc19hbnl0eXBlKHApIHx8IGlzX2Nob2ljZShwKSkKKwkgICAgICAgICAgcCA9IHAtPm5leHQ7CisJICAgICAgICBpZiAoYT09MCkKKwkgICAgICAgIHsgZnByaW50Zihmb3V0LCJcblx0c2hvcnQgc29hcF9mbGFnXyVzID0gJWxkIiwgcC0+c3ltLT5uYW1lLCBwLT5pbmZvLm1heE9jY3Vycyk7CisJICAgICAgICAgIGE9MTsKKyAgICAgICAgICAgICAgICB9CisJICAgICAgICBlbHNlCisJICAgICAgICAgIGZwcmludGYoZm91dCwiLCBzb2FwX2ZsYWdfJXMgPSAlbGQiLCBwLT5zeW0tPm5hbWUsIHAtPmluZm8ubWF4T2NjdXJzKTsKKwkgICAgICB9CisJICAgIH0KKwkgICAgZnByaW50Zihmb3V0LCI7Iik7CisJICB9CisgICAgICAgICAgaWYgKCFpc19pbnZpc2libGUodHlwLT5pZC0+bmFtZSkpCisgICAgICAgICAgeyBmcHJpbnRmKGZvdXQsIlxuXHRpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpXG5cdFx0cmV0dXJuIE5VTEw7Iik7CisgICAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRpZiAoKnNvYXAtPnR5cGUgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkpIik7CisgICAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHR7XHRzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsiKTsKKyAgICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0cmV0dXJuIE5VTEw7XG5cdH0iKTsKKwkgIH0KKwkgIGlmIChoYXNfY2xhc3ModHlwKSkKKyAgICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdGEgPSAoJXMpc29hcF9jbGFzc19pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgYSwgJXMsIHNpemVvZiglcyksIHNvYXAtPnR5cGUsIHNvYXAtPmFycmF5VHlwZSk7IixjX3R5cGVfaWQodHlwLCAiKiIpLCBzb2FwX3R5cGUodHlwKSwgY190eXBlKHR5cCkpOworCSAgZWxzZQorICAgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0YSA9ICglcylzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBhLCAlcywgc2l6ZW9mKCVzKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7IixjX3R5cGVfaWQodHlwLCAiKiIpLCBzb2FwX3R5cGUodHlwKSwgY190eXBlKHR5cCkpOworCSAgZnByaW50Zihmb3V0LCJcblx0aWYgKCFhKVxuXHRcdHJldHVybiBOVUxMOyIpOworICAgICAgICAgIC8qIGZwcmludGYoZm91dCwiXG5cdGlmIChzb2FwLT5hbGxvY2VkKSIpOyAqLworICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdHNvYXBfZGVmYXVsdF8lcyhzb2FwLCBhKTsiLGNfaWRlbnQodHlwKSk7CisgICAgICAgICAgZm9yICh0ID0gdGFibGU7IHQ7IHQgPSB0LT5wcmV2KQorICAgICAgICAgIHsgZm9yIChwID0gdC0+bGlzdDsgcDsgcCA9IHAtPm5leHQpIAorCSAgICAgIGlmIChwLT5pbmZvLnN0byAmIFNhdHRyaWJ1dGUpCisJCXNvYXBfYXR0cl92YWx1ZShwLCAiYSIsIHAtPnN5bS0+bmFtZSwgbnNfYWRkKHAtPnN5bS0+bmFtZSwgbnNhKSk7CisJICB9CisgICAgICAgIGlmICghaXNfaW52aXNpYmxlKHR5cC0+aWQtPm5hbWUpKQorCSAgZnByaW50Zihmb3V0LCJcblx0aWYgKHNvYXAtPmJvZHkgJiYgISpzb2FwLT5ocmVmKVxuXHR7Iik7CisJaWYgKCFpc19kaXNjcmltaW5hbnQodHlwKSkKKyAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdGZvciAoOzspXG5cdFx0e1x0c29hcC0+ZXJyb3IgPSBTT0FQX1RBR19NSVNNQVRDSDsiKTsKKyAgICAgICAgYT0wOworICAgICAgICBmb3IgKHQgPSB0YWJsZTsgdDsgdCA9IHQtPnByZXYpCisJeyBmb3IgKHAgPSB0LT5saXN0OyBwOyBwID0gcC0+bmV4dCkgCisJICB7IGlmIChwLT5pbmZvLnN0byAmIChTY29uc3QgfCBTcHJpdmF0ZSB8IFNwcm90ZWN0ZWQpKQorCSAgICAgIGZwcmludGYoZm91dCwgIlxuXHRcdC8qIG5vbi1zZXJpYWxpemFibGUgJXMgc2tpcHBlZCAqLyIsIHAtPnN5bS0+bmFtZSk7CisJICAgIGVsc2UgaWYgKGlzX3RyYW5zaWVudChwLT5pbmZvLnR5cCkpCisJICAgICAgZnByaW50Zihmb3V0LCAiXG5cdFx0LyogdHJhbnNpZW50ICVzIHNraXBwZWQgKi8iLCBwLT5zeW0tPm5hbWUpOworCSAgICBlbHNlIGlmIChwLT5pbmZvLnN0byAmIFNhdHRyaWJ1dGUpCisJICAgICAgOworCSAgICBlbHNlIGlmIChpc19yZXBldGl0aW9uKHApKQorCSAgICB7IAorICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0aWYgKHNvYXBfZmxhZ18lcyAmJiBzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkiLHAtPm5leHQtPnN5bS0+bmFtZSk7CisgICAgICAgICAgICAgIGlmICgoKFRub2RlKilwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKS0+dHlwZSA9PSBUY2xhc3MgJiYgIWlzX3ZvbGF0aWxlKHAtPm5leHQtPmluZm8udHlwLT5yZWYpKQorICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHR7XHQlcztcblx0XHRcdFx0JXM7XG5cdFx0XHRcdHEuc29hcF9kZWZhdWx0KHNvYXApO1xuXHRcdFx0XHRzb2FwX25ld19ibG9jayhzb2FwKTsiLCBjX3R5cGVfaWQocC0+bmV4dC0+aW5mby50eXAsICJwIiksIGNfdHlwZV9pZChwLT5uZXh0LT5pbmZvLnR5cC0+cmVmLCAicSIpKTsKKyAgICAgICAgICAgICAgZWxzZSBpZiAoKChUbm9kZSopcC0+bmV4dC0+aW5mby50eXAtPnJlZiktPnR5cGUgPT0gVGNsYXNzIHx8IGhhc19jbGFzcyhwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSkKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0e1x0JXM7XG5cdFx0XHRcdCVzO1xuXHRcdFx0XHRzb2FwX25ld19ibG9jayhzb2FwKTsiLCBjX3R5cGVfaWQocC0+bmV4dC0+aW5mby50eXAsICJwIiksIGNfdHlwZV9pZChwLT5uZXh0LT5pbmZvLnR5cC0+cmVmLCAicSIpKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHR7XHQlcztcblx0XHRcdFx0c29hcF9uZXdfYmxvY2soc29hcCk7IiwgY190eXBlX2lkKHAtPm5leHQtPmluZm8udHlwLCAicCIpKTsKKwkgICAgICBpZiAoaXNfdW5tYXRjaGVkKHAtPm5leHQtPnN5bSkpCisgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0Zm9yIChhLT4lcyA9IDA7ICFzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgTlVMTCwgMSk7IGEtPiVzKyspIiwgcC0+c3ltLT5uYW1lLCBwLT5zeW0tPm5hbWUpOworCSAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRmb3IgKGEtPiVzID0gMDsgIXNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCBcIiVzXCIsIDEpOyBhLT4lcysrKSIsIHAtPnN5bS0+bmFtZSxuc19hZGQocC0+bmV4dC0+c3ltLT5uYW1lLCBuc2UpLCBwLT5zeW0tPm5hbWUpOworICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHR7XHRwID0gKCVzKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBzaXplb2YoJXMpKTsiLCBjX3R5cGUocC0+bmV4dC0+aW5mby50eXApLCBjX3R5cGUocC0+bmV4dC0+aW5mby50eXAtPnJlZikpOworICAgICAgICAgICAgICBpZiAoKChUbm9kZSopcC0+bmV4dC0+aW5mby50eXAtPnJlZiktPnR5cGUgPT0gVGNsYXNzIHx8IGhhc19jbGFzcyhwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSkKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRcdG1lbWNweShwLCAmcSwgc2l6ZW9mKCVzKSk7IiwgY190eXBlKHAtPm5leHQtPmluZm8udHlwLT5yZWYpKTsKKyAgICAgICAgICAgICAgaWYgKCgoVG5vZGUqKXAtPm5leHQtPmluZm8udHlwLT5yZWYpLT50eXBlID09IFRjbGFzcyAmJiAhaXNfZXh0ZXJuYWwocC0+bmV4dC0+aW5mby50eXAtPnJlZikgJiYgIWlzX3ZvbGF0aWxlKHAtPm5leHQtPmluZm8udHlwLT5yZWYpICYmICFpc190eXBlZGVmKHAtPm5leHQtPmluZm8udHlwLT5yZWYpKQorICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdFx0cC0+c29hcF9kZWZhdWx0KHNvYXApOyIpOworICAgICAgICAgICAgICBlbHNlIGlmICgoKFRub2RlKilwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKS0+dHlwZSAhPSBUcG9pbnRlciAgJiYgIWlzX1hNTChwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSkKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRcdHNvYXBfZGVmYXVsdF8lcyhzb2FwLCBwKTsiLCBjX2lkZW50KHAtPm5leHQtPmluZm8udHlwLT5yZWYpKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdFx0KnAgPSBOVUxMOyIpOworCSAgICAgIGlmICghaXNfaW52aXNpYmxlKHAtPm5leHQtPnN5bS0+bmFtZSkpCisgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0XHRzb2FwX3JldmVydChzb2FwKTsiKTsKKwkgICAgICBpZiAoaXNfdW5tYXRjaGVkKHAtPm5leHQtPnN5bSkpCisJICAgICAgeyBpZiAoaXNfWE1MKHAtPm5leHQtPmluZm8udHlwLT5yZWYpICYmIGlzX3N0cmluZyhwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSkKKyAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdFx0aWYgKHNvYXBfaW5saXRlcmFsKHNvYXAsIE5VTEwsIHApKSIpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzX1hNTChwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSAmJiBpc193c3RyaW5nKHAtPm5leHQtPmluZm8udHlwLT5yZWYpKQorICAgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0XHRpZiAoc29hcF9pbndsaXRlcmFsKHNvYXAsIE5VTEwsIHApKSIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdFx0aWYgKCFzb2FwX2luXyVzKHNvYXAsIE5VTEwsIHAsIFwiJXNcIikpIiwgY19pZGVudChwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSwgeHNpX3R5cGUocC0+bmV4dC0+aW5mby50eXAtPnJlZikpOworCSAgICAgIH0KKwkgICAgICBlbHNlCisJICAgICAgeyBpZiAoaXNfWE1MKHAtPm5leHQtPmluZm8udHlwLT5yZWYpICYmIGlzX3N0cmluZyhwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSkKKyAgICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdFx0aWYgKHNvYXBfaW5saXRlcmFsKHNvYXAsIFwiJXNcIiwgcCkpIiwgbnNfYWRkKHAtPm5leHQtPnN5bS0+bmFtZSwgbnNlKSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNfWE1MKHAtPm5leHQtPmluZm8udHlwLT5yZWYpICYmIGlzX3dzdHJpbmcocC0+bmV4dC0+aW5mby50eXAtPnJlZikpCisgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRcdGlmIChzb2FwX2lud2xpdGVyYWwoc29hcCwgXCIlc1wiLCBwKSkiLCBuc19hZGQocC0+bmV4dC0+c3ltLT5uYW1lLCBuc2UpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRcdGlmICghc29hcF9pbl8lcyhzb2FwLCBcIiVzXCIsIHAsIFwiJXNcIikpIiwgY19pZGVudChwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSwgbnNfYWRkKHAtPm5leHQtPnN5bS0+bmFtZSwgbnNlKSwgeHNpX3R5cGUocC0+bmV4dC0+aW5mby50eXAtPnJlZikpOworCSAgICAgIH0KKyAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0XHRcdGJyZWFrOyIpOworICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRcdHNvYXBfZmxhZ18lcyA9IDA7IiwgcC0+bmV4dC0+c3ltLT5uYW1lKTsKKyAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0fSIpOworICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRhLT4lcyA9ICglcylzb2FwX3NhdmVfYmxvY2soc29hcCwgTlVMTCwgMSk7IiwgcC0+bmV4dC0+c3ltLT5uYW1lLCBjX3R5cGUocC0+bmV4dC0+aW5mby50eXApKTsKKyAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0aWYgKCFzb2FwX2ZsYWdfJXMgJiYgc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpXG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9IiwgcC0+bmV4dC0+c3ltLT5uYW1lKTsKKyAgICAgICAgICAgIHAgPSBwLT5uZXh0OworCSAgfQorCSAgZWxzZSBpZiAoaXNfYW55dHlwZShwKSkKKyAgICAgICAgICB7IGZwcmludGYoZm91dCwiXG5cdFx0XHRpZiAoc29hcF9mbGFnXyVzICYmIHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKSIscC0+bmV4dC0+c3ltLT5uYW1lKTsKKwkgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0aWYgKChhLT4lcyA9IHNvYXBfZ2V0ZWxlbWVudChzb2FwLCAmYS0+JXMpKSkiLCBwLT5uZXh0LT5zeW0tPm5hbWUsIHAtPnN5bS0+bmFtZSk7CisJICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdHtcdHNvYXBfZmxhZ18lcyA9IDA7IiwgcC0+bmV4dC0+c3ltLT5uYW1lKTsKKwkgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0XHRjb250aW51ZTsiKTsKKwkgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0fSIpOworICAgICAgICAgICAgcCA9IHAtPm5leHQ7CisJICB9CisgICAgICAgICAgZWxzZSBpZiAoaXNfZGlzY3JpbWluYW50KHR5cCkpCisgICAgICAgICAgeyBmcHJpbnRmKGZvdXQsIlxuXHRcdGlmICghc29hcF9pbl8lcyhzb2FwLCAmYS0+JXMsICZhLT4lcykpIiwgY19pZGVudChwLT5uZXh0LT5pbmZvLnR5cCksIHAtPnN5bS0+bmFtZSwgcC0+bmV4dC0+c3ltLT5uYW1lKTsKKyAgICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRyZXR1cm4gTlVMTDsiKTsKKyAgICAgICAgICAgIGJyZWFrOworCSAgfQorCSAgZWxzZSBpZiAoaXNfY2hvaWNlKHApKQorCSAgeyBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0aWYgKHNvYXBfZmxhZ18lcyAmJiBzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkiLHAtPm5leHQtPnN5bS0+bmFtZSk7CisJICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdGlmIChzb2FwX2luXyVzKHNvYXAsICZhLT4lcywgJmEtPiVzKSkiLCBjX2lkZW50KHAtPm5leHQtPmluZm8udHlwKSwgcC0+c3ltLT5uYW1lLCBwLT5uZXh0LT5zeW0tPm5hbWUpOworCSAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHR7XHRzb2FwX2ZsYWdfJXMgPSAwOyIsIHAtPm5leHQtPnN5bS0+bmFtZSk7CisJICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdFx0Y29udGludWU7Iik7CisJICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdH0iKTsKKyAgICAgICAgICAgIHAgPSBwLT5uZXh0OworCSAgfQorCSAgZWxzZQorCSAgeyAKKwkgICBpZiAoIWlzX2ludmlzaWJsZShwLT5zeW0tPm5hbWUpICYmICFpc19wcmltY2xhc3ModHlwKSAmJiBwLT5pbmZvLnR5cC0+dHlwZSAhPSBUZnVuICYmICFpc192b2lkKHAtPmluZm8udHlwKSkKKwkgICB7IGlmIChpc19zdHJpbmcocC0+aW5mby50eXApIHx8IGlzX3dzdHJpbmcocC0+aW5mby50eXApIHx8IGlzX3N0ZHN0cihwLT5pbmZvLnR5cCkpCisJICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRpZiAoc29hcF9mbGFnXyVzICYmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCB8fCBzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykpIixwLT5zeW0tPm5hbWUpOworCSAgICAgZWxzZSBpZiAoaXNfdGVtcGxhdGUocC0+aW5mby50eXApKQorCSAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0aWYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKSIpOworICAgICAgICAgICAgIGVsc2UKKwkgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdGlmIChzb2FwX2ZsYWdfJXMgJiYgc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpIixwLT5zeW0tPm5hbWUpOworCSAgIH0KKwkgICBpZiAoaXNfdW5tYXRjaGVkKHAtPnN5bSkpCisJICAgeworCSAgICBpZiAoaXNfWE1MKHAtPmluZm8udHlwKSAmJiBpc19zdHJpbmcocC0+aW5mby50eXApKSB7CisJICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0aWYgKHNvYXBfaW5saXRlcmFsKHNvYXAsIE5VTEwsICZhLT4lcykpIiwgcC0+c3ltLT5uYW1lKTsKKwkgICAgfSBlbHNlIGlmIChpc19YTUwocC0+aW5mby50eXApICYmIGlzX3dzdHJpbmcocC0+aW5mby50eXApKSB7CisJICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0aWYgKHNvYXBfaW53bGl0ZXJhbChzb2FwLCBOVUxMLCAmYS0+JXMpKSIsIHAtPnN5bS0+bmFtZSk7CisJICAgIH0gZWxzZSBpZihwLT5pbmZvLnR5cC0+dHlwZT09VGFycmF5KSB7CisJICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0aWYgKHNvYXBfaW5fJXMoc29hcCwgTlVMTCwgYS0+JXMsIFwiJXNcIikpIiwgY19pZGVudChwLT5pbmZvLnR5cCkscC0+c3ltLT5uYW1lLHhzaV90eXBlKHAtPmluZm8udHlwKSk7CisJICAgIH0gZWxzZSBpZihwLT5pbmZvLnR5cC0+dHlwZT09VGNsYXNzICYmICFpc19leHRlcm5hbChwLT5pbmZvLnR5cCkgJiYgIWlzX3ZvbGF0aWxlKHAtPmluZm8udHlwKSAmJiAhaXNfdHlwZWRlZihwLT5pbmZvLnR5cCkpIHsKKwkgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRpZiAoYS0+JXMuc29hcF9pbihzb2FwLCBOVUxMLCBcIiVzXCIpKSIsIHAtPnN5bS0+bmFtZSx4c2lfdHlwZShwLT5pbmZvLnR5cCkpOworCSAgICB9IGVsc2UgaWYgKHAtPmluZm8udHlwLT50eXBlICE9IFRmdW4gJiYgIWlzX3ZvaWQocC0+aW5mby50eXApKSB7CisJICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0aWYgKHNvYXBfaW5fJXMoc29hcCwgTlVMTCwgJmEtPiVzLCBcIiVzXCIpKSIsIGNfaWRlbnQocC0+aW5mby50eXApLHAtPnN5bS0+bmFtZSx4c2lfdHlwZShwLT5pbmZvLnR5cCkpOworCSAgICB9CisJICAgfQorCSAgIGVsc2UgaWYgKCFpc19pbnZpc2libGUocC0+c3ltLT5uYW1lKSkKKwkgICB7CisJICAgIGlmIChpc19YTUwocC0+aW5mby50eXApICYmIGlzX3N0cmluZyhwLT5pbmZvLnR5cCkpIHsKKwkgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRpZiAoc29hcF9pbmxpdGVyYWwoc29hcCwgXCIlc1wiLCAmYS0+JXMpKSIsIG5zX2FkZChwLT5zeW0tPm5hbWUsIG5zZSksIHAtPnN5bS0+bmFtZSk7CisJICAgIH0gZWxzZSBpZiAoaXNfWE1MKHAtPmluZm8udHlwKSAmJiBpc193c3RyaW5nKHAtPmluZm8udHlwKSkgeworCSAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdGlmIChzb2FwX2lud2xpdGVyYWwoc29hcCwgXCIlc1wiLCAmYS0+JXMpKSIsIG5zX2FkZChwLT5zeW0tPm5hbWUsIG5zZSksIHAtPnN5bS0+bmFtZSk7CisJICAgIH0gZWxzZSBpZihwLT5pbmZvLnR5cC0+dHlwZT09VGFycmF5KSB7CisJICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0aWYgKHNvYXBfaW5fJXMoc29hcCwgXCIlc1wiLCBhLT4lcywgXCIlc1wiKSkiLCBjX2lkZW50KHAtPmluZm8udHlwKSxuc19hZGQocC0+c3ltLT5uYW1lLCBuc2UpLHAtPnN5bS0+bmFtZSx4c2lfdHlwZShwLT5pbmZvLnR5cCkpOworCSAgICB9IGVsc2UgaWYocC0+aW5mby50eXAtPnR5cGU9PVRjbGFzcyAmJiAhaXNfZXh0ZXJuYWwocC0+aW5mby50eXApICYmICFpc192b2xhdGlsZShwLT5pbmZvLnR5cCkgJiYgIWlzX3R5cGVkZWYocC0+aW5mby50eXApKSB7CisJICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0aWYgKGEtPiVzLnNvYXBfaW4oc29hcCwgXCIlc1wiLCBcIiVzXCIpKSIsIHAtPnN5bS0+bmFtZSxuc19hZGQocC0+c3ltLT5uYW1lLCBuc2UpLHhzaV90eXBlKHAtPmluZm8udHlwKSk7CisJICAgIH0gZWxzZSBpZiAocC0+aW5mby50eXAtPnR5cGUgIT0gVGZ1biAmJiAhaXNfdm9pZChwLT5pbmZvLnR5cCkpIHsKKwkgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRpZiAoc29hcF9pbl8lcyhzb2FwLCBcIiVzXCIsICZhLT4lcywgXCIlc1wiKSkiLCBjX2lkZW50KHAtPmluZm8udHlwKSxuc19hZGQocC0+c3ltLT5uYW1lLCBuc2UpLHAtPnN5bS0+bmFtZSx4c2lfdHlwZShwLT5pbmZvLnR5cCkpOworCSAgICB9CisJICAgfQorCSAgICBpZiAoIWlzX2ludmlzaWJsZShwLT5zeW0tPm5hbWUpICYmICFpc19wcmltY2xhc3ModHlwKSAmJiBwLT5pbmZvLnR5cC0+dHlwZSAhPSBUZnVuICYmICFpc192b2lkKHAtPmluZm8udHlwKSkKKwkgICAgeyBpZiAoaXNfdGVtcGxhdGUocC0+aW5mby50eXApKQorCSAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0XHRjb250aW51ZTsiKTsKKwkgICAgICBlbHNlCisJICAgICAgeyBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHR7XHRzb2FwX2ZsYWdfJXMtLTsiLCBwLT5zeW0tPm5hbWUpOworCSAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0XHRjb250aW51ZTsiKTsKKwkgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdH0iKTsKKwkgICAgICB9CisJICAgIH0KKwkgIH0KKwkgIGZmbHVzaChmb3V0KTsKKwl9CisgICAgICB9CisgICAgICBpZiAoIWlzX2Rpc2NyaW1pbmFudCh0eXApKQorICAgICAgeyBmb3IgKHQgPSB0YWJsZTsgdDsgdCA9IHQtPnByZXYpCisJeyBmb3IgKHAgPSB0LT5saXN0OyBwOyBwID0gcC0+bmV4dCkgCisJICB7IGlmIChpc19yZXBldGl0aW9uKHApIHx8IGlzX2FueXR5cGUocCkgfHwgaXNfY2hvaWNlKHApKQorCSAgICB7IHAgPSBwLT5uZXh0OworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJICAgIGlmIChpc19pbnZpc2libGUocC0+c3ltLT5uYW1lKQorCSAgICAgICYmICEocC0+aW5mby5zdG8gJiAoU2NvbnN0IHwgU3ByaXZhdGUgfCBTcHJvdGVjdGVkKSkgJiYgIWlzX3RyYW5zaWVudChwLT5pbmZvLnR5cCkgJiYgIShwLT5pbmZvLnN0byAmIFNhdHRyaWJ1dGUpKQorCSAgICB7IGlmIChpc19zdHJpbmcocC0+aW5mby50eXApIHx8IGlzX3dzdHJpbmcocC0+aW5mby50eXApIHx8IGlzX3N0ZHN0cihwLT5pbmZvLnR5cCkpCisJICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0aWYgKHNvYXBfZmxhZ18lcyAmJiAoc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0ggfHwgc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcpKSIscC0+c3ltLT5uYW1lKTsKKyAgICAgICAgICAgICAgZWxzZSBpZiAoaXNfdGVtcGxhdGUocC0+aW5mby50eXApKQorCSAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkiKTsKKyAgICAgICAgICAgICAgZWxzZQorCSAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdGlmIChzb2FwX2ZsYWdfJXMgJiYgc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpIixwLT5zeW0tPm5hbWUpOworCSAgICBpZiAoaXNfWE1MKHAtPmluZm8udHlwKSAmJiBpc19zdHJpbmcocC0+aW5mby50eXApKQorCSAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdGlmIChzb2FwX2lubGl0ZXJhbChzb2FwLCBcIiVzXCIsICZhLT4lcykpIiwgbnNfYWRkKHAtPnN5bS0+bmFtZSwgbnNlKSwgcC0+c3ltLT5uYW1lKTsKKwkgICAgZWxzZSBpZiAoaXNfWE1MKHAtPmluZm8udHlwKSAmJiBpc193c3RyaW5nKHAtPmluZm8udHlwKSkKKwkgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRpZiAoc29hcF9pbndsaXRlcmFsKHNvYXAsIFwiJXNcIiwgJmEtPiVzKSkiLCBuc19hZGQocC0+c3ltLT5uYW1lLCBuc2UpLCBwLT5zeW0tPm5hbWUpOworCSAgICBlbHNlIGlmKHAtPmluZm8udHlwLT50eXBlPT1UYXJyYXkpCisJICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0aWYgKHNvYXBfaW5fJXMoc29hcCwgXCIlc1wiLCBhLT4lcywgXCIlc1wiKSkiLCBjX2lkZW50KHAtPmluZm8udHlwKSxuc19hZGQocC0+c3ltLT5uYW1lLCBuc2UpLHAtPnN5bS0+bmFtZSx4c2lfdHlwZShwLT5pbmZvLnR5cCkpOworCSAgICBlbHNlIGlmKHAtPmluZm8udHlwLT50eXBlPT1UY2xhc3MgJiYgIWlzX2V4dGVybmFsKHAtPmluZm8udHlwKSAmJiAhaXNfdm9sYXRpbGUocC0+aW5mby50eXApICYmICFpc190eXBlZGVmKHAtPmluZm8udHlwKSkKKwkgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRpZiAoYS0+JXMuc29hcF9pbihzb2FwLCBcIiVzXCIsIFwiJXNcIikpIiwgcC0+c3ltLT5uYW1lLG5zX2FkZChwLT5zeW0tPm5hbWUsIG5zZSkseHNpX3R5cGUocC0+aW5mby50eXApKTsKKwkgICAgZWxzZSBpZiAocC0+aW5mby50eXAtPnR5cGUgIT0gVGZ1biAmJiAhaXNfdm9pZChwLT5pbmZvLnR5cCkpCisJICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0aWYgKHNvYXBfaW5fJXMoc29hcCwgXCIlc1wiLCAmYS0+JXMsIFwiJXNcIikpIiwgY19pZGVudChwLT5pbmZvLnR5cCksbnNfYWRkKHAtPnN5bS0+bmFtZSwgbnNlKSxwLT5zeW0tPm5hbWUseHNpX3R5cGUocC0+aW5mby50eXApKTsKKwkgICAgaWYgKGlzX3RlbXBsYXRlKHAtPmluZm8udHlwKSkKKwkgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRcdGNvbnRpbnVlOyIpOworCSAgICBlbHNlCisJICAgIHsgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0e1x0c29hcF9mbGFnXyVzLS07IiwgcC0+c3ltLT5uYW1lKTsKKwkgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRcdGNvbnRpbnVlOyIpOworCSAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdH0iKTsKKwkgICAgfQorCSAgIH0KKwkgIH0KKyAgICAgICAgfQorICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0aWYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKSIpOworICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRzb2FwLT5lcnJvciA9IHNvYXBfaWdub3JlX2VsZW1lbnQoc29hcCk7Iik7CisgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcpIik7CisgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdGJyZWFrOyIpOworICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0aWYgKHNvYXAtPmVycm9yKVxuXHRcdFx0XHRyZXR1cm4gTlVMTDsiKTsKKyAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHR9Iik7CisgICAgICB9CisJYSA9IDA7CisJaWYgKHRhYmxlICYmICFpc19kaXNjcmltaW5hbnQodHlwKSkKKwl7IGZvciAocCA9IHRhYmxlLT5saXN0OyBwOyBwID0gcC0+bmV4dCkKKwkgIHsgaWYgKHAtPmluZm8ubWluT2NjdXJzID4gMCAmJiBwLT5pbmZvLm1heE9jY3VycyA+PSAwICYmICEocC0+aW5mby5zdG8gJiAoU2NvbnN0IHwgU3ByaXZhdGUgfCBTcHJvdGVjdGVkKSkgJiYgIShwLT5pbmZvLnN0byAmIFNhdHRyaWJ1dGUpICYmIHAtPmluZm8udHlwLT50eXBlICE9IFRmdW4gJiYgIWlzX3ZvaWQocC0+aW5mby50eXApICYmICFpc190cmFuc2llbnQocC0+aW5mby50eXApICYmICFpc190ZW1wbGF0ZShwLT5pbmZvLnR5cCkgJiYgIWlzX3JlcGV0aXRpb24ocCkgJiYgIWlzX2Nob2ljZShwKSAmJiBwLT5pbmZvLmhhc3ZhbCA9PSBGYWxzZSkKKwkgICAgeyBpZiAoaXNfaXRlbShwKSkKKwkgICAgICAgIGNvbnRpbnVlOworCSAgICAgIGlmIChpc19hbnl0eXBlKHApKQorCSAgICAgICAgcCA9IHAtPm5leHQ7CisJICAgICAgaWYgKGE9PTApCisJICAgICAgeyBmcHJpbnRmKGZvdXQsIlxuXHRcdGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgKHNvYXBfZmxhZ18lcyA+ICVsZCIsIHAtPnN5bS0+bmFtZSwgcC0+aW5mby5tYXhPY2N1cnMgLSBwLT5pbmZvLm1pbk9jY3Vycyk7CisJICAgICAgICBhPTE7CisgICAgICAgICAgICAgIH0KKwkgICAgICBlbHNlCisJICAgICAgICBmcHJpbnRmKGZvdXQsIiB8fCBzb2FwX2ZsYWdfJXMgPiAlbGQiLCBwLT5zeW0tPm5hbWUsIHAtPmluZm8ubWF4T2NjdXJzIC0gcC0+aW5mby5taW5PY2N1cnMpOworCSAgICB9CisJICAgIGVsc2UgaWYgKGlzX3RlbXBsYXRlKHAtPmluZm8udHlwKSkKKwkgICAgeyBpZiAocC0+aW5mby5taW5PY2N1cnMgPiAxKQorCSAgICAgIHsgaWYgKHAtPmluZm8udHlwLT50eXBlID09IFRwb2ludGVyKQorCSAgICAgICAgeyBpZiAoYT09MCkKKwkgICAgICAgICAgeyBmcHJpbnRmKGZvdXQsIlxuXHRcdGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgKCFhLT4lcyB8fCBhLT4lcy0+c2l6ZSgpIDwgJWxkIiwgcC0+c3ltLT5uYW1lLCBwLT5zeW0tPm5hbWUsIHAtPmluZm8ubWluT2NjdXJzKTsKKwkgICAgICAgICAgICBhPTE7CisgICAgICAgICAgICAgICAgICB9CisJICAgICAgICAgIGVsc2UKKwkgICAgICAgICAgICBmcHJpbnRmKGZvdXQsIiB8fCAhYS0+JXMgfHwgYS0+JXMtPnNpemUoKSA8ICVsZCIsIHAtPnN5bS0+bmFtZSwgcC0+c3ltLT5uYW1lLCBwLT5pbmZvLm1pbk9jY3Vycyk7CisJICAgICAgICB9CisJICAgICAgICBlbHNlCisJICAgICAgICB7IGlmIChhPT0wKQorCSAgICAgICAgICB7IGZwcmludGYoZm91dCwiXG5cdFx0aWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiAoYS0+JXMuc2l6ZSgpIDwgJWxkIiwgcC0+c3ltLT5uYW1lLCBwLT5pbmZvLm1pbk9jY3Vycyk7CisJICAgICAgICAgICAgYT0xOworICAgICAgICAgICAgICAgICAgfQorCSAgICAgICAgICBlbHNlCisJICAgICAgICAgICAgZnByaW50Zihmb3V0LCIgfHwgYS0+JXMuc2l6ZSgpIDwgJWxkIiwgcC0+c3ltLT5uYW1lLCBwLT5pbmZvLm1pbk9jY3Vycyk7CisJICAgICAgICB9CisJICAgICAgfQorCSAgICAgIGlmICggcC0+aW5mby5tYXhPY2N1cnMgPiAxKQorCSAgICAgIHsgaWYgKHAtPmluZm8udHlwLT50eXBlID09IFRwb2ludGVyKQorCSAgICAgICAgeyBpZiAoYT09MCkKKwkgICAgICAgICAgeyBmcHJpbnRmKGZvdXQsIlxuXHRcdGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgKGEtPiVzICYmIGEtPiVzLT5zaXplKCkgPiAlbGQpIiwgcC0+c3ltLT5uYW1lLCBwLT5zeW0tPm5hbWUsIHAtPmluZm8ubWF4T2NjdXJzKTsKKwkgICAgICAgICAgICBhPTE7CisgICAgICAgICAgICAgICAgICB9CisJICAgICAgICAgIGVsc2UKKwkgICAgICAgICAgICBmcHJpbnRmKGZvdXQsIiB8fCAoYS0+JXMgJiYgYS0+JXMtPnNpemUoKSA+ICVsZCkiLCBwLT5zeW0tPm5hbWUsIHAtPnN5bS0+bmFtZSwgcC0+aW5mby5tYXhPY2N1cnMpOworCSAgICAgICAgfQorCQllbHNlCisJICAgICAgICB7IGlmIChhPT0wKQorCSAgICAgICAgICB7IGZwcmludGYoZm91dCwiXG5cdFx0aWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiAoYS0+JXMuc2l6ZSgpID4gJWxkIiwgcC0+c3ltLT5uYW1lLCBwLT5pbmZvLm1heE9jY3Vycyk7CisJICAgICAgICAgICAgYT0xOworICAgICAgICAgICAgICAgICAgfQorCSAgICAgICAgICBlbHNlCisJICAgICAgICAgICAgZnByaW50Zihmb3V0LCIgfHwgYS0+JXMuc2l6ZSgpID4gJWxkIiwgcC0+c3ltLT5uYW1lLCBwLT5pbmZvLm1heE9jY3Vycyk7CisJICAgICAgICB9CisJICAgICAgfQorCSAgICB9CisJICAgIGVsc2UgaWYgKGlzX3JlcGV0aXRpb24ocCkpCisJICAgIHsgaWYgKHAtPmluZm8ubWluT2NjdXJzID4gMSkKKwkgICAgICB7IGlmIChhPT0wKQorCSAgICAgICAgeyBmcHJpbnRmKGZvdXQsIlxuXHRcdGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgKGEtPiVzIDwgJWxkIiwgcC0+c3ltLT5uYW1lLCBwLT5pbmZvLm1pbk9jY3Vycyk7CisJICAgICAgICAgIGE9MTsKKyAgICAgICAgICAgICAgICB9CisJICAgICAgICBlbHNlCisJICAgICAgICAgIGZwcmludGYoZm91dCwiIHx8IGEtPiVzIDwgJWxkIiwgcC0+c3ltLT5uYW1lLCBwLT5pbmZvLm1pbk9jY3Vycyk7CisJICAgICAgfQorCSAgICAgIGlmIChwLT5pbmZvLm1heE9jY3VycyA+IDEpCisJICAgICAgeyBpZiAoYT09MCkKKwkgICAgICAgIHsgZnByaW50Zihmb3V0LCJcblx0XHRpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIChhLT4lcyA+ICVsZCIsIHAtPnN5bS0+bmFtZSwgcC0+aW5mby5tYXhPY2N1cnMpOworCSAgICAgICAgICBhPTE7CisgICAgICAgICAgICAgICAgfQorCSAgICAgICAgZWxzZQorCSAgICAgICAgICBmcHJpbnRmKGZvdXQsIiB8fCBhLT4lcyA+ICVsZCIsIHAtPnN5bS0+bmFtZSwgcC0+aW5mby5tYXhPY2N1cnMpOworCSAgICAgIH0KKwkgICAgICBwID0gcC0+bmV4dDsKKwkgICAgfQorCSAgICBlbHNlIGlmIChpc19jaG9pY2UocCkpCisJICAgIHsgaWYgKHAtPmluZm8ubWluT2NjdXJzICE9IDApCisJICAgICAgeyBpZiAoYT09MCkKKwkgICAgICAgIHsgZnByaW50Zihmb3V0LCJcblx0XHRpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIChzb2FwX2ZsYWdfJXMiLCBwLT5uZXh0LT5zeW0tPm5hbWUpOworCSAgICAgICAgICBhPTE7CisgICAgICAgICAgICAgICAgfQorCSAgICAgICAgZWxzZQorCSAgICAgICAgICBmcHJpbnRmKGZvdXQsIiB8fCBzb2FwX2ZsYWdfJXMiLCBwLT5uZXh0LT5zeW0tPm5hbWUpOworCSAgICAgIH0KKwkgICAgICBwID0gcC0+bmV4dDsKKwkgICAgfQorCSAgfQorCSAgaWYgKGEpCisJICAgIGZwcmludGYoZm91dCwiKSlcblx0XHR7XHRzb2FwLT5lcnJvciA9IFNPQVBfT0NDVVJTO1xuXHRcdFx0cmV0dXJuIE5VTEw7XG5cdFx0fSIpOworCX0KKyAgICAgICAgaWYgKCFpc19pbnZpc2libGUodHlwLT5pZC0+bmFtZSkpCisgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRpZiAoc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKVxuXHRcdFx0cmV0dXJuIE5VTEw7Iik7CisJICAvKgorCSAgZWxzZQorICAgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRzb2FwLT5lcnJvciA9IFNPQVBfT0s7Iik7CisJICAqLworICAgICAgICAgIGlmICghaXNfaW52aXNpYmxlKHR5cC0+aWQtPm5hbWUpKQorICAgICAgICAgIHsgZnByaW50Zihmb3V0LCJcblx0fVxuXHRlbHNlXG5cdHtcdCIpOworCSAgICBpZiAoaGFzX2NsYXNzKHR5cCkpCisgICAgICAgICAgICAgIGZwcmludGYoZm91dCwiYSA9ICglcylzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilhLCAwLCAlcywgMCwgc2l6ZW9mKCVzKSwgMCwgc29hcF9jb3B5XyVzKTsiLGNfdHlwZV9pZCh0eXAsICIqIiksIHNvYXBfdHlwZSh0eXApLCBjX3R5cGUodHlwKSwgY19pZGVudCh0eXApKTsKKwkgICAgZWxzZQorICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsImEgPSAoJXMpc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopYSwgMCwgJXMsIDAsIHNpemVvZiglcyksIDAsIE5VTEwpOyIsY190eXBlX2lkKHR5cCwgIioiKSwgc29hcF90eXBlKHR5cCksIGNfdHlwZSh0eXApKTsKKyAgICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0aWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKVxuXHRcdFx0cmV0dXJuIE5VTEw7Iik7CisgICAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcblx0fSIpOworCSAgfQorICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuXHRyZXR1cm4gYTtcbn0iKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIAorICAgICBjYXNlIFRjbGFzczoKKyAgICAgIGlmIChpc19leHRlcm5hbCh0eXApKQorICAgICAgeyBmcHJpbnRmKGZoZWFkLCJcblNPQVBfRk1BQzEgJXMgU09BUF9GTUFDMiBzb2FwX2luXyVzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosICVzLCBjb25zdCBjaGFyKik7IiwgY190eXBlX2lkKHR5cCwgIioiKSxjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgIioiKSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGZwcmludGYoZmhlYWQsIlxuU09BUF9GTUFDMyAlcyBTT0FQX0ZNQUM0IHNvYXBfaW5fJXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgJXMsIGNvbnN0IGNoYXIqKTsiLCBjX3R5cGVfaWQodHlwLCAiKiIpLGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiKiIpKTsKKyAgICAgIGlmICghaXNfdm9sYXRpbGUodHlwKSAmJiAhaXNfdHlwZWRlZih0eXApKQorICAgICAgeyBmcHJpbnRmKGZvdXQsIlxuXG52b2lkIColczo6c29hcF9pbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKSIsIGNfdHlwZSh0eXApKTsKKwlmcHJpbnRmKGZvdXQsIlxue1x0cmV0dXJuIHNvYXBfaW5fJXMoc29hcCwgdGFnLCB0aGlzLCB0eXBlKTtcbn0iLGNfaWRlbnQodHlwKSk7CisgICAgICAgIGZmbHVzaChmb3V0KTsKKyAgICAgIH0KKyAgICAgIGZwcmludGYoZm91dCwiXG5cblNPQVBfRk1BQzMgJXMgU09BUF9GTUFDNCBzb2FwX2luXyVzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsICVzLCBjb25zdCBjaGFyICp0eXBlKVxueyIsIGNfdHlwZV9pZCh0eXAsICIqIiksY19pZGVudCh0eXApLGNfdHlwZV9pZCh0eXAsICIqYSIpKTsKKyAgICAgIGlmIChpc19wcmltY2xhc3ModHlwKSkKKyAgICAgIHsKKyAgICAgICAgZnByaW50Zihmb3V0LCAiXG5cdGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAxKSlcblx0XHRyZXR1cm4gTlVMTDsiKTsKKyAgICAgICAgZnByaW50Zihmb3V0LCJcblx0aWYgKCEoYSA9ICglcylzb2FwX2NsYXNzX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBhLCAlcywgc2l6ZW9mKCVzKSwgc29hcC0+dHlwZSwgc29hcC0+YXJyYXlUeXBlKSkpXG5cdHtcdHNvYXAtPmVycm9yID0gU09BUF9UQUdfTUlTTUFUQ0g7XG5cdFx0cmV0dXJuIE5VTEw7XG5cdH0iLCBjX3R5cGVfaWQodHlwLCAiKiIpLCBzb2FwX3R5cGUodHlwKSwgY190eXBlKHR5cCkpOworICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRzb2FwX3JldmVydChzb2FwKTtcblx0KnNvYXAtPmlkID0gJ1xcMCc7Iik7CisgICAgICAgIGZwcmludGYoZm91dCwiXG5cdGlmIChzb2FwLT5hbGxvY2VkKSIpOworICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHR7XHRhLT5zb2FwX2RlZmF1bHQoc29hcCk7IixjX2lkZW50KHR5cCkpOworICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdGlmIChzb2FwLT5jbGlzdC0+dHlwZSAhPSAlcykiLCBzb2FwX3R5cGUodHlwKSk7CisgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRyZXR1cm4gKCVzKWEtPnNvYXBfaW4oc29hcCwgdGFnLCB0eXBlKTsiLCBjX3R5cGVfaWQodHlwLCAiKiIpKTsKKyAgICAgICAgZnByaW50Zihmb3V0LCJcblx0fSIpOworICAgICAgICAgIGZvciAodCA9IChUYWJsZSopdHlwLT5yZWY7IHQ7IHQgPSB0LT5wcmV2KQorICAgICAgICAgIHsgZm9yIChwID0gdC0+bGlzdDsgcDsgcCA9IHAtPm5leHQpIAorCSAgICAgIGlmIChwLT5pbmZvLnN0byAmIFNhdHRyaWJ1dGUpCisJCXNvYXBfYXR0cl92YWx1ZShwLCBwdHJfY2FzdCh0eXAsICJhIiksIHAtPnN5bS0+bmFtZSwgbnNfYWRkKHAtPnN5bS0+bmFtZSwgbnNhKSk7CisJICB9CisgICAgICBmZmx1c2goZm91dCk7CisJZm9yICh0YWJsZSA9IChUYWJsZSopdHlwLT5yZWY7IHRhYmxlOyB0YWJsZSA9IHRhYmxlLT5wcmV2KQorCXsgcCA9IHRhYmxlLT5saXN0OworCSAgaWYgKHAgJiYgaXNfaXRlbShwKSkKKwkgICAgYnJlYWs7CisgICAgICAgIH0KKwkgICAgaWYgKGlzX1hNTChwLT5pbmZvLnR5cCkgJiYgaXNfc3RyaW5nKHAtPmluZm8udHlwKSkKKwkgICAgeyBmcHJpbnRmKGZvdXQsIlxuXHRpZiAoIXNvYXBfaW5saXRlcmFsKHNvYXAsIHRhZywgJigoKCVzKilhKS0+JXMpKSkiLCB0YWJsZS0+c3ltLT5uYW1lLHAtPnN5bS0+bmFtZSx4c2lfdHlwZSh0eXApKTsKKwkgICAgfQorCSAgICBlbHNlIGlmIChpc19YTUwocC0+aW5mby50eXApICYmIGlzX3dzdHJpbmcocC0+aW5mby50eXApKQorCSAgICB7IGZwcmludGYoZm91dCwiXG5cdGlmICghc29hcF9pbndsaXRlcmFsKHNvYXAsIHRhZywgJigoKCVzKilhKS0+JXMpKSkiLCB0YWJsZS0+c3ltLT5uYW1lLHAtPnN5bS0+bmFtZSx4c2lfdHlwZSh0eXApKTsKKwkgICAgfQorCSAgICBlbHNlIGlmKHAtPmluZm8udHlwLT50eXBlPT1UYXJyYXkpIHsKKwkgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRpZiAoIXNvYXBfaW5fJXMoc29hcCwgdGFnLCAoKCVzKilhKS0+JXMsIFwiJXNcIikpIiwgY19pZGVudChwLT5pbmZvLnR5cCksdGFibGUtPnN5bS0+bmFtZSxwLT5zeW0tPm5hbWUseHNpX3R5cGUodHlwKSk7CisJICAgIH0KKwkgICAgZWxzZSBpZihwLT5pbmZvLnR5cC0+dHlwZT09VGNsYXNzICYmICFpc19leHRlcm5hbChwLT5pbmZvLnR5cCkgJiYgIWlzX3ZvbGF0aWxlKHAtPmluZm8udHlwKSAmJiAhaXNfdHlwZWRlZihwLT5pbmZvLnR5cCkpIHsKKwkgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRpZiAoISgoKCVzKilhKS0+JXMpLnNvYXBfaW4oc29hcCwgdGFnLCBcIiVzXCIpKSIsIHRhYmxlLT5zeW0tPm5hbWUscC0+c3ltLT5uYW1lLHhzaV90eXBlKHR5cCkpOworCSAgICB9CisJICAgIGVsc2UgaWYgKHAtPmluZm8udHlwLT50eXBlICE9IFRmdW4gJiYgIWlzX3ZvaWQocC0+aW5mby50eXApKSB7CisJICAgICAgZnByaW50Zihmb3V0LCJcblx0aWYgKCFzb2FwX2luXyVzKHNvYXAsIHRhZywgJigoKCVzKilhKS0+JXMpLCBcIiVzXCIpKSIsIGNfaWRlbnQocC0+aW5mby50eXApLHRhYmxlLT5zeW0tPm5hbWUscC0+c3ltLT5uYW1lLHhzaV90eXBlKHR5cCkpOworCSAgICB9CisgICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0cmV0dXJuIE5VTEw7Iik7CisgICAgICAgICAgIGlmIChoYXNfZ2V0dGVyKHR5cCkpCisgICAgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0aWYgKGEtPmdldChzb2FwKSlcblx0XHRyZXR1cm4gTlVMTDsiKTsKKyAgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0cmV0dXJuIGE7XG59Iik7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmICghaXNfaW52aXNpYmxlKHR5cC0+aWQtPm5hbWUpKQorICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSlcblx0XHRyZXR1cm4gTlVMTDsiKTsKKyAgICAgICAgZnByaW50Zihmb3V0LCJcblx0YSA9ICglcylzb2FwX2NsYXNzX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBhLCAlcywgc2l6ZW9mKCVzKSwgc29hcC0+dHlwZSwgc29hcC0+YXJyYXlUeXBlKTsiLCBjX3R5cGVfaWQodHlwLCAiKiIpLCBzb2FwX3R5cGUodHlwKSwgY190eXBlKHR5cCkpOworICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRpZiAoIWEpXG5cdFx0cmV0dXJuIE5VTEw7Iik7CisgICAgICAgIGZwcmludGYoZm91dCwiXG5cdGlmIChzb2FwLT5hbGxvY2VkKSIpOworCWlmIChpc192b2xhdGlsZSh0eXApIHx8IGlzX3R5cGVkZWYodHlwKSkKKyAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHR7XHRzb2FwX2RlZmF1bHRfJXMoc29hcCwgYSk7IixjX2lkZW50KHR5cCkpOworCWVsc2UKKyAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHR7XHRhLT5zb2FwX2RlZmF1bHQoc29hcCk7Iik7CisgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0aWYgKHNvYXAtPmNsaXN0LT50eXBlICE9ICVzKSIsIHNvYXBfdHlwZSh0eXApKTsKKyAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHR7XHRzb2FwX3JldmVydChzb2FwKTsiKTsKKyAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdCpzb2FwLT5pZCA9ICdcXDAnOyIpOworCWlmIChpc192b2xhdGlsZSh0eXApIHx8IGlzX3R5cGVkZWYodHlwKSkKKyAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0cmV0dXJuIHNvYXBfaW5fJXMoc29hcCwgdGFnLCBhLCB0eXBlKTsiLCBjX2lkZW50KHR5cCkpOworCWVsc2UKKyAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0cmV0dXJuICglcylhLT5zb2FwX2luKHNvYXAsIHRhZywgdHlwZSk7IiwgY190eXBlX2lkKHR5cCwgIioiKSk7CisgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0fVxuXHR9Iik7CisgICAgICAgIHRhYmxlPShUYWJsZSAqKXR5cC0+cmVmOworICAgICAgICBmb3IgKHQgPSB0YWJsZTsgdDsgdCA9IHQtPnByZXYpCisgICAgICAgIHsgZm9yIChwID0gdC0+bGlzdDsgcDsgcCA9IHAtPm5leHQpIAorCSAgICBpZiAocC0+aW5mby5zdG8gJiBTYXR0cmlidXRlKQorICAgICAgICAgICAgICBzb2FwX2F0dHJfdmFsdWUocCwgcHRyX2Nhc3QodHlwLCAiYSIpLCBwLT5zeW0tPm5hbWUsIG5zX2FkZChwLT5zeW0tPm5hbWUsIG5zYSkpOworCX0KKyAgICAgICAgZmZsdXNoKGZvdXQpOworICAgICAgIAorICAgICAgaT0wOworICAgIGlmICghaXNfZGlzY3JpbWluYW50KHR5cCkpCisgICAgeyBmb3IgKHQgPSB0YWJsZTsgdDsgdCA9IHQtPnByZXYpCisJaSsrOworICAgICAgYT0wOworICAgICAgZm9yICg7IGkgPiAwOyBpLS0pCisgICAgICB7IHQgPSB0YWJsZTsKKwlmb3IgKGogPSAwOyBqIDwgaS0xOyBqKyspCisJICB0ID0gdC0+cHJldjsKKwlmb3IgKHAgPSB0LT5saXN0OyBwOyBwID0gcC0+bmV4dCkKKwkgIHsgaWYgKCEocC0+aW5mby5zdG8gJiAoU2NvbnN0IHwgU3ByaXZhdGUgfCBTcHJvdGVjdGVkKSkgJiYgIShwLT5pbmZvLnN0byAmIFNhdHRyaWJ1dGUpICYmIHAtPmluZm8udHlwLT50eXBlICE9IFRmdW4gJiYgIWlzX3ZvaWQocC0+aW5mby50eXApICYmICFpc190cmFuc2llbnQocC0+aW5mby50eXApICYmICFpc19yZXBldGl0aW9uKHApICYmICFpc190ZW1wbGF0ZShwLT5pbmZvLnR5cCkpCisJICAgIHsgaWYgKGlzX2FueXR5cGUocCkgfHwgaXNfY2hvaWNlKHApKQorCSAgICAgICAgcCA9IHAtPm5leHQ7CisJICAgICAgaWYoIGE9PTApCisJICAgICAgeyBmcHJpbnRmKGZvdXQsIlxuXHRzaG9ydCBzb2FwX2ZsYWdfJXMlZCA9ICVsZCIsIHAtPnN5bS0+bmFtZSwgaSwgcC0+aW5mby5tYXhPY2N1cnMpOworCSAgICAgICAgYSA9IDE7CisgICAgICAgICAgICAgIH0KKwkgICAgICBlbHNlCisJICAgICAgICBmcHJpbnRmKGZvdXQsIiwgc29hcF9mbGFnXyVzJWQgPSAlbGQiLCBwLT5zeW0tPm5hbWUsIGksIHAtPmluZm8ubWF4T2NjdXJzKTsKKwkgICAgfQorCSAgfQorICAgICAgfQorICAgICAgZnByaW50Zihmb3V0LCI7Iik7IAorICAgIH0KKyAgICAgIGZmbHVzaChmb3V0KTsKKyAgICAgIGlmICghaXNfaW52aXNpYmxlKHR5cC0+aWQtPm5hbWUpKQorICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRpZiAoc29hcC0+Ym9keSAmJiAhKnNvYXAtPmhyZWYpXG5cdHsiKTsKKyAgICAgIGlmICghaXNfZGlzY3JpbWluYW50KHR5cCkpCisgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0Zm9yICg7Oylcblx0XHR7XHRzb2FwLT5lcnJvciA9IFNPQVBfVEFHX01JU01BVENIOyIpOyAKKyAgICAgIHRhYmxlPShUYWJsZSAqKXR5cC0+cmVmOworICAgICAgYT0wOworICAgICAgaT0wOworICAgICAgZm9yICh0ID0gdGFibGU7IHQ7IHQgPSB0LT5wcmV2KQorCWkrKzsKKyAgICAgIGZvciAoOyBpID4gMDsgaS0tKQorICAgICAgeyB0ID0gdGFibGU7CisJZm9yIChqID0gMDsgaiA8IGktMTsgaisrKQorCSAgdCA9IHQtPnByZXY7CisJZm9yIChwID0gdC0+bGlzdDsgcDsgcCA9IHAtPm5leHQpCisJeyBpZiAoaXNfaXRlbShwKSkKKwkgICAgOworCSAgZWxzZSBpZiAocC0+aW5mby5zdG8gJiAoU2NvbnN0IHwgU3ByaXZhdGUgfCBTcHJvdGVjdGVkKSkKKwkgICAgZnByaW50Zihmb3V0LCAiXG5cdFx0XHQvKiBub24tc2VyaWFsaXphYmxlICVzIHNraXBwZWQgKi8iLCBwLT5zeW0tPm5hbWUpOworCSAgZWxzZSBpZiAoaXNfdHJhbnNpZW50KHAtPmluZm8udHlwKSkKKwkgICAgZnByaW50Zihmb3V0LCAiXG5cdFx0XHQvKiB0cmFuc2llbnQgJXMgc2tpcHBlZCAqLyIsIHAtPnN5bS0+bmFtZSk7CisJICBlbHNlIGlmIChwLT5pbmZvLnN0byAmIFNhdHRyaWJ1dGUpCisJICAgIDsKKwkgIGVsc2UgaWYgKGlzX3JlcGV0aXRpb24ocCkpCisJICB7IAorICAgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdGlmIChzb2FwX2ZsYWdfJXMlZCAmJiBzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkiLHAtPm5leHQtPnN5bS0+bmFtZSxpKTsKKyAgICAgICAgICAgIGlmICgoKFRub2RlKilwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKS0+dHlwZSA9PSBUY2xhc3MgJiYgIWlzX3ZvbGF0aWxlKHAtPm5leHQtPmluZm8udHlwLT5yZWYpKQorICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0e1x0JXM7XG5cdFx0XHRcdCVzO1xuXHRcdFx0XHRxLnNvYXBfZGVmYXVsdChzb2FwKTtcblx0XHRcdFx0c29hcF9uZXdfYmxvY2soc29hcCk7IiwgY190eXBlX2lkKHAtPm5leHQtPmluZm8udHlwLCAicCIpLCBjX3R5cGVfaWQocC0+bmV4dC0+aW5mby50eXAtPnJlZiwgInEiKSk7CisgICAgICAgICAgICBlbHNlIGlmICgoKFRub2RlKilwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKS0+dHlwZSA9PSBUY2xhc3MgfHwgaGFzX2NsYXNzKHAtPm5leHQtPmluZm8udHlwLT5yZWYpKQorICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0e1x0JXM7XG5cdFx0XHRcdCVzO1xuXHRcdFx0XHRzb2FwX25ld19ibG9jayhzb2FwKTsiLCBjX3R5cGVfaWQocC0+bmV4dC0+aW5mby50eXAsICJwIiksIGNfdHlwZV9pZChwLT5uZXh0LT5pbmZvLnR5cC0+cmVmLCAicSIpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdHtcdCVzO1xuXHRcdFx0XHRzb2FwX25ld19ibG9jayhzb2FwKTsiLCBjX3R5cGVfaWQocC0+bmV4dC0+aW5mby50eXAsICJwIikpOworCSAgICBpZiAoaXNfdW5tYXRjaGVkKHAtPm5leHQtPnN5bSkpCisgICAgICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdGZvciAoKCglcyopYSktPiVzID0gMDsgIXNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCBOVUxMLCAxKTsgKCglcyopYSktPiVzKyspIiwgdC0+c3ltLT5uYW1lLCBwLT5zeW0tPm5hbWUsIG5zX2FkZF9vdmVycmlkZGVuKHQsIHAtPm5leHQsIG5zZSksIHQtPnN5bS0+bmFtZSwgcC0+c3ltLT5uYW1lKTsKKwkgICAgZWxzZQorICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRmb3IgKCgoJXMqKWEpLT4lcyA9IDA7ICFzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgXCIlc1wiLCAxKTsgKCglcyopYSktPiVzKyspIiwgdC0+c3ltLT5uYW1lLCBwLT5zeW0tPm5hbWUsIG5zX2FkZF9vdmVycmlkZGVuKHQsIHAtPm5leHQsIG5zZSksIHQtPnN5bS0+bmFtZSwgcC0+c3ltLT5uYW1lKTsKKyAgICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdHtcdHAgPSAoJXMpc29hcF9wdXNoX2Jsb2NrKHNvYXAsIHNpemVvZiglcykpO1xuXHRcdFx0XHRcdGlmICghcClcblx0XHRcdFx0XHRcdHJldHVybiBOVUxMOyIsIGNfdHlwZShwLT5uZXh0LT5pbmZvLnR5cCksIGNfdHlwZShwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSk7CisgICAgICAgICAgICBpZiAoKChUbm9kZSopcC0+bmV4dC0+aW5mby50eXAtPnJlZiktPnR5cGUgPT0gVGNsYXNzIHx8IGhhc19jbGFzcyhwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSkKKyAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0XHRtZW1jcHkocCwgJnEsIHNpemVvZiglcykpOyIsIGNfdHlwZShwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSk7CisgICAgICAgICAgICBpZiAoKChUbm9kZSopcC0+bmV4dC0+aW5mby50eXAtPnJlZiktPnR5cGUgPT0gVGNsYXNzICYmICFpc19leHRlcm5hbChwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSAmJiAhaXNfdm9sYXRpbGUocC0+bmV4dC0+aW5mby50eXAtPnJlZikgJiYgIWlzX3R5cGVkZWYocC0+bmV4dC0+aW5mby50eXAtPnJlZikpCisgICAgICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdFx0cC0+c29hcF9kZWZhdWx0KHNvYXApOyIpOworICAgICAgICAgICAgZWxzZSBpZiAoKChUbm9kZSopcC0+bmV4dC0+aW5mby50eXAtPnJlZiktPnR5cGUgIT0gVHBvaW50ZXIgICYmICFpc19YTUwocC0+bmV4dC0+aW5mby50eXAtPnJlZikpCisgICAgICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdFx0c29hcF9kZWZhdWx0XyVzKHNvYXAsIHApOyIsIGNfaWRlbnQocC0+bmV4dC0+aW5mby50eXAtPnJlZikpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRcdCpwID0gTlVMTDsiKTsKKwkgICAgaWYgKCFpc19pbnZpc2libGUocC0+bmV4dC0+c3ltLT5uYW1lKSkKKyAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0XHRzb2FwX3JldmVydChzb2FwKTsiKTsKKwkgICAgaWYgKGlzX3VubWF0Y2hlZChwLT5uZXh0LT5zeW0pKQorICAgICAgICAgICAgeyBpZiAoaXNfWE1MKHAtPm5leHQtPmluZm8udHlwLT5yZWYpICYmIGlzX3N0cmluZyhwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSkKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRcdGlmIChzb2FwX2lubGl0ZXJhbChzb2FwLCBOVUxMLCBwKSkiKTsKKyAgICAgICAgICAgICAgZWxzZSBpZiAoaXNfWE1MKHAtPm5leHQtPmluZm8udHlwLT5yZWYpICYmIGlzX3dzdHJpbmcocC0+bmV4dC0+aW5mby50eXAtPnJlZikpCisgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0XHRpZiAoc29hcF9pbndsaXRlcmFsKHNvYXAsIE5VTEwsIHApKSIpOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0XHRpZiAoIXNvYXBfaW5fJXMoc29hcCwgTlVMTCwgcCwgXCIlc1wiKSkiLCBjX2lkZW50KHAtPm5leHQtPmluZm8udHlwLT5yZWYpLCB4c2lfdHlwZShwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSk7CisJICAgIH0KKwkgICAgZWxzZQorICAgICAgICAgICAgeyBpZiAoaXNfWE1MKHAtPm5leHQtPmluZm8udHlwLT5yZWYpICYmIGlzX3N0cmluZyhwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSkKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRcdGlmIChzb2FwX2lubGl0ZXJhbChzb2FwLCBcIiVzXCIsIHApKSIsIG5zX2FkZF9vdmVycmlkZGVuKHQsIHAtPm5leHQsIG5zZSkpOworICAgICAgICAgICAgICBlbHNlIGlmIChpc19YTUwocC0+bmV4dC0+aW5mby50eXAtPnJlZikgJiYgaXNfd3N0cmluZyhwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSkKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRcdGlmIChzb2FwX2lud2xpdGVyYWwoc29hcCwgXCIlc1wiLCBwKSkiLCBuc19hZGRfb3ZlcnJpZGRlbih0LCBwLT5uZXh0LCBuc2UpKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdFx0aWYgKCFzb2FwX2luXyVzKHNvYXAsIFwiJXNcIiwgcCwgXCIlc1wiKSkiLCBjX2lkZW50KHAtPm5leHQtPmluZm8udHlwLT5yZWYpLCBuc19hZGRfb3ZlcnJpZGRlbih0LCBwLT5uZXh0LCBuc2UpLCB4c2lfdHlwZShwLT5uZXh0LT5pbmZvLnR5cC0+cmVmKSk7CisJICAgIH0KKyAgICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdFx0XHRicmVhazsiKTsKKyAgICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdFx0c29hcF9mbGFnXyVzJWQgPSAwOyIsIHAtPm5leHQtPnN5bS0+bmFtZSwgaSk7CisgICAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHR9Iik7CisgICAgICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHQoKCVzKilhKS0+JXMgPSAoJXMpc29hcF9zYXZlX2Jsb2NrKHNvYXAsIE5VTEwsIDEpOyIsIHQtPnN5bS0+bmFtZSwgcC0+bmV4dC0+c3ltLT5uYW1lLCBjX3R5cGUocC0+bmV4dC0+aW5mby50eXApKTsKKyAgICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdGlmICghc29hcF9mbGFnXyVzJWQgJiYgc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpXG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9IiwgcC0+bmV4dC0+c3ltLT5uYW1lLCBpKTsKKyAgICAgICAgICBwID0gcC0+bmV4dDsKKwkgIH0KKwkgIGVsc2UgaWYgKGlzX2FueXR5cGUocCkpCisgICAgICAgICAgeyBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0aWYgKHNvYXBfZmxhZ18lcyVkICYmIHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKSIscC0+bmV4dC0+c3ltLT5uYW1lLGkpOworCSAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRpZiAoKCgoJXMqKWEpLT4lcyA9IHNvYXBfZ2V0ZWxlbWVudChzb2FwLCAmKCglcyopYSktPiVzKSkpIiwgdC0+c3ltLT5uYW1lLCBwLT5uZXh0LT5zeW0tPm5hbWUsIHQtPnN5bS0+bmFtZSwgcC0+c3ltLT5uYW1lKTsKKwkgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0e1x0c29hcF9mbGFnXyVzJWQgPSAwOyIsIHAtPm5leHQtPnN5bS0+bmFtZSxpKTsKKwkgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0XHRjb250aW51ZTsiKTsKKwkgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0fSIpOworICAgICAgICAgICAgcCA9IHAtPm5leHQ7CisJICB9CisgICAgICAgICAgZWxzZSBpZiAoaXNfZGlzY3JpbWluYW50KHR5cCkpCisgICAgICAgICAgeyBmcHJpbnRmKGZvdXQsIlxuXHRcdGlmICghc29hcF9pbl8lcyhzb2FwLCAmYS0+JXMsICZhLT4lcykpIiwgY19pZGVudChwLT5uZXh0LT5pbmZvLnR5cCksIHAtPnN5bS0+bmFtZSwgcC0+bmV4dC0+c3ltLT5uYW1lKTsKKyAgICAgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRyZXR1cm4gTlVMTDsiKTsKKwkgICAgaSA9IDA7CisgICAgICAgICAgICBicmVhazsKKwkgIH0KKwkgIGVsc2UgaWYgKGlzX2Nob2ljZShwKSkKKyAgICAgICAgICB7IGZwcmludGYoZm91dCwiXG5cdFx0XHRpZiAoc29hcF9mbGFnXyVzJWQgJiYgc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpIixwLT5uZXh0LT5zeW0tPm5hbWUsaSk7CisJICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdGlmIChzb2FwX2luXyVzKHNvYXAsICYoKCVzKilhKS0+JXMsICYoKCVzKilhKS0+JXMpKSIsIGNfaWRlbnQocC0+bmV4dC0+aW5mby50eXApLCB0LT5zeW0tPm5hbWUsIHAtPnN5bS0+bmFtZSwgdC0+c3ltLT5uYW1lLCBwLT5uZXh0LT5zeW0tPm5hbWUpOworCSAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHR7XHRzb2FwX2ZsYWdfJXMlZCA9IDA7IiwgcC0+bmV4dC0+c3ltLT5uYW1lLGkpOworCSAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRcdGNvbnRpbnVlOyIpOworCSAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHR9Iik7CisgICAgICAgICAgICBwID0gcC0+bmV4dDsKKwkgIH0KKwkgIGVsc2UKKwkgIHsKKwkgICAgaWYgKCFpc19pbnZpc2libGUocC0+c3ltLT5uYW1lKSAmJiAhaXNfcHJpbWNsYXNzKHR5cCkgJiYgcC0+aW5mby50eXAtPnR5cGUgIT0gVGZ1biAmJiAhaXNfdm9pZChwLT5pbmZvLnR5cCkpCisJICAgeyBpZiAoaXNfc3RyaW5nKHAtPmluZm8udHlwKSB8fCBpc193c3RyaW5nKHAtPmluZm8udHlwKSB8fCBpc19zdGRzdHIocC0+aW5mby50eXApKQorCSAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0aWYgKHNvYXBfZmxhZ18lcyVkICYmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCB8fCBzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykpIixwLT5zeW0tPm5hbWUsIGkpOworICAgICAgICAgICAgIGVsc2UgaWYgKGlzX3RlbXBsYXRlKHAtPmluZm8udHlwKSkKKwkgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0aWYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKSIpOworCSAgICAgZWxzZQorCSAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0aWYgKHNvYXBfZmxhZ18lcyVkICYmIHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKSIscC0+c3ltLT5uYW1lLCBpKTsKKwkgICB9CisJICAgaWYgKGlzX3VubWF0Y2hlZChwLT5zeW0pKQorCSAgIHsgCisJICAgIGlmIChpc19YTUwocC0+aW5mby50eXApICYmIGlzX3N0cmluZyhwLT5pbmZvLnR5cCkpIHsKKwkgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRpZiAoc29hcF9pbmxpdGVyYWwoc29hcCwgTlVMTCwgJigoKCVzKilhKS0+JXMpKSkiLCB0LT5zeW0tPm5hbWUsIHAtPnN5bS0+bmFtZSk7CisJICAgIH0gZWxzZSBpZiAoaXNfWE1MKHAtPmluZm8udHlwKSAmJiBpc193c3RyaW5nKHAtPmluZm8udHlwKSkgeworCSAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdGlmIChzb2FwX2lud2xpdGVyYWwoc29hcCwgTlVMTCwgJigoKCVzKilhKS0+JXMpKSkiLCB0LT5zeW0tPm5hbWUsIHAtPnN5bS0+bmFtZSk7CisJICAgIH0KKwkgICAgZWxzZSBpZihwLT5pbmZvLnR5cC0+dHlwZT09VGFycmF5KSB7CisJICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0aWYgKHNvYXBfaW5fJXMoc29hcCwgTlVMTCwgKCglcyopYSktPiVzLCBcIiVzXCIpKSIsIGNfaWRlbnQocC0+aW5mby50eXApLHQtPnN5bS0+bmFtZSxwLT5zeW0tPm5hbWUseHNpX3R5cGUocC0+aW5mby50eXApKTsKKwkgICAgfSBlbHNlIGlmKHAtPmluZm8udHlwLT50eXBlPT1UY2xhc3MgJiYgIWlzX2V4dGVybmFsKHAtPmluZm8udHlwKSAmJiAhaXNfdm9sYXRpbGUocC0+aW5mby50eXApICYmICFpc190eXBlZGVmKHAtPmluZm8udHlwKSkgeworCSAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdGlmICgoKCglcyopYSktPiVzKS5zb2FwX2luKHNvYXAsIE5VTEwsIFwiJXNcIikpIiwgdC0+c3ltLT5uYW1lLHAtPnN5bS0+bmFtZSx4c2lfdHlwZShwLT5pbmZvLnR5cCkpOworCSAgICB9IGVsc2UgaWYgKHAtPmluZm8udHlwLT50eXBlICE9IFRmdW4gJiYgIWlzX3ZvaWQocC0+aW5mby50eXApKSB7CisJICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0aWYgKHNvYXBfaW5fJXMoc29hcCwgTlVMTCwgJigoKCVzKilhKS0+JXMpLCBcIiVzXCIpKSIsIGNfaWRlbnQocC0+aW5mby50eXApLHQtPnN5bS0+bmFtZSxwLT5zeW0tPm5hbWUseHNpX3R5cGUocC0+aW5mby50eXApKTsKKwkgICAgfQorICAgICAgICAgICB9CisJICAgZWxzZSBpZiAoIWlzX2ludmlzaWJsZShwLT5zeW0tPm5hbWUpKQorCSAgIHsgCisJICAgIGlmIChpc19YTUwocC0+aW5mby50eXApICYmIGlzX3N0cmluZyhwLT5pbmZvLnR5cCkpIHsKKwkgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRpZiAoc29hcF9pbmxpdGVyYWwoc29hcCwgXCIlc1wiLCAmKCgoJXMqKWEpLT4lcykpKSIsIG5zX2FkZF9vdmVycmlkZGVuKHQsIHAsIG5zZSksIHQtPnN5bS0+bmFtZSxwLT5zeW0tPm5hbWUpOworCSAgICB9IGVsc2UgaWYgKGlzX1hNTChwLT5pbmZvLnR5cCkgJiYgaXNfd3N0cmluZyhwLT5pbmZvLnR5cCkpIHsKKwkgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRpZiAoc29hcF9pbndsaXRlcmFsKHNvYXAsIFwiJXNcIiwgJigoKCVzKilhKS0+JXMpKSkiLCBuc19hZGRfb3ZlcnJpZGRlbih0LCBwLCBuc2UpLCB0LT5zeW0tPm5hbWUscC0+c3ltLT5uYW1lKTsKKwkgICAgfQorCSAgICBlbHNlIGlmKHAtPmluZm8udHlwLT50eXBlPT1UYXJyYXkpIHsKKwkgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRpZiAoc29hcF9pbl8lcyhzb2FwLCBcIiVzXCIsICgoJXMqKWEpLT4lcywgXCIlc1wiKSkiLCBjX2lkZW50KHAtPmluZm8udHlwKSxuc19hZGRfb3ZlcnJpZGRlbih0LCBwLCBuc2UpLHQtPnN5bS0+bmFtZSxwLT5zeW0tPm5hbWUseHNpX3R5cGUocC0+aW5mby50eXApKTsKKwkgICAgfSBlbHNlIGlmKHAtPmluZm8udHlwLT50eXBlPT1UY2xhc3MgJiYgIWlzX2V4dGVybmFsKHAtPmluZm8udHlwKSAmJiAhaXNfdm9sYXRpbGUocC0+aW5mby50eXApICYmICFpc190eXBlZGVmKHAtPmluZm8udHlwKSkgeworCSAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdGlmICgoKCglcyopYSktPiVzKS5zb2FwX2luKHNvYXAsIFwiJXNcIiwgXCIlc1wiKSkiLCB0LT5zeW0tPm5hbWUscC0+c3ltLT5uYW1lLG5zX2FkZF9vdmVycmlkZGVuKHQsIHAsIG5zZSkseHNpX3R5cGUocC0+aW5mby50eXApKTsKKwkgICAgfSBlbHNlIGlmIChwLT5pbmZvLnR5cC0+dHlwZSAhPSBUZnVuICYmICFpc192b2lkKHAtPmluZm8udHlwKSkgeworCSAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdGlmIChzb2FwX2luXyVzKHNvYXAsIFwiJXNcIiwgJigoKCVzKilhKS0+JXMpLCBcIiVzXCIpKSIsIGNfaWRlbnQocC0+aW5mby50eXApLG5zX2FkZF9vdmVycmlkZGVuKHQsIHAsIG5zZSksdC0+c3ltLT5uYW1lLHAtPnN5bS0+bmFtZSx4c2lfdHlwZShwLT5pbmZvLnR5cCkpOworCSAgICB9CisgICAgICAgICAgIH0KKwkgICAgaWYgKCFpc19pbnZpc2libGUocC0+c3ltLT5uYW1lKSAmJiAhaXNfcHJpbWNsYXNzKHR5cCkgJiYgcC0+aW5mby50eXAtPnR5cGUgIT0gVGZ1biAmJiAhaXNfdm9pZChwLT5pbmZvLnR5cCkpCisJICAgIHsgaWYgKGlzX3RlbXBsYXRlKHAtPmluZm8udHlwKSkKKwkgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdFx0Y29udGludWU7Iik7CisJICAgICAgZWxzZQorCSAgICAgIHsgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0e1x0c29hcF9mbGFnXyVzJWQtLTsiLCBwLT5zeW0tPm5hbWUsIGkpOworCSAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0XHRjb250aW51ZTsiKTsKKwkgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdH0iKTsKKwkgICAgICB9CisJICAgIH0KKwkgICAgZmZsdXNoKGZvdXQpOworCSAgfQorICAgICAgICB9CisgICAgICB9CisgICAgaWYgKCFpc19kaXNjcmltaW5hbnQodHlwKSkKKyAgICB7CisgICAgICBpPTA7CisgICAgICBmb3IgKHQgPSB0YWJsZTsgdDsgdCA9IHQtPnByZXYpCisJaSsrOworICAgICAgZm9yICg7IGkgPiAwOyBpLS0pCisgICAgICB7IHQgPSB0YWJsZTsKKwlmb3IgKGogPSAwOyBqIDwgaS0xOyBqKyspCisJICB0ID0gdC0+cHJldjsKKyAgICAgICAgZm9yIChwID0gdC0+bGlzdDsgcDsgcCA9IHAtPm5leHQpCisJICB7IGlmIChpc19yZXBldGl0aW9uKHApIHx8IGlzX2FueXR5cGUocCkgfHwgaXNfY2hvaWNlKHApKQorCSAgICB7IHAgPSBwLT5uZXh0OworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJICAgIGlmIChpc19pbnZpc2libGUocC0+c3ltLT5uYW1lKQorCSAgICAgICYmICEocC0+aW5mby5zdG8gJiAoU2NvbnN0IHwgU3ByaXZhdGUgfCBTcHJvdGVjdGVkKSkgJiYgIWlzX3RyYW5zaWVudChwLT5pbmZvLnR5cCkgJiYgIShwLT5pbmZvLnN0byAmIFNhdHRyaWJ1dGUpKQorCSAgICB7IGlmIChpc19zdHJpbmcocC0+aW5mby50eXApIHx8IGlzX3dzdHJpbmcocC0+aW5mby50eXApIHx8IGlzX3N0ZHN0cihwLT5pbmZvLnR5cCkpCisJICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRpZiAoc29hcF9mbGFnXyVzJWQgJiYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIIHx8IHNvYXAtPmVycm9yID09IFNPQVBfTk9fVEFHKSkiLHAtPnN5bS0+bmFtZSwgaSk7CisgICAgICAgICAgICAgZWxzZSBpZiAoaXNfdGVtcGxhdGUocC0+aW5mby50eXApKQorCSAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0aWYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKSIpOworICAgICAgICAgICAgIGVsc2UKKwkgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdGlmIChzb2FwX2ZsYWdfJXMlZCAmJiBzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCkiLHAtPnN5bS0+bmFtZSwgaSk7CisJICAgIGlmIChpc19YTUwocC0+aW5mby50eXApICYmIGlzX3N0cmluZyhwLT5pbmZvLnR5cCkpIHsKKwkgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRpZiAoc29hcF9pbmxpdGVyYWwoc29hcCwgXCIlc1wiLCAmKCgoJXMqKWEpLT4lcykpKSIsIG5zX2FkZF9vdmVycmlkZGVuKHQsIHAsIG5zZSksIHQtPnN5bS0+bmFtZSxwLT5zeW0tPm5hbWUpOworCSAgICB9IGVsc2UgaWYgKGlzX1hNTChwLT5pbmZvLnR5cCkgJiYgaXNfd3N0cmluZyhwLT5pbmZvLnR5cCkpIHsKKwkgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRpZiAoc29hcF9pbndsaXRlcmFsKHNvYXAsIFwiJXNcIiwgJigoKCVzKilhKS0+JXMpKSkiLCBuc19hZGRfb3ZlcnJpZGRlbih0LCBwLCBuc2UpLCB0LT5zeW0tPm5hbWUscC0+c3ltLT5uYW1lKTsKKwkgICAgfQorCSAgICBlbHNlIGlmKHAtPmluZm8udHlwLT50eXBlPT1UYXJyYXkpIHsKKwkgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRpZiAoc29hcF9pbl8lcyhzb2FwLCBcIiVzXCIsICgoJXMqKWEpLT4lcywgXCIlc1wiKSkiLCBjX2lkZW50KHAtPmluZm8udHlwKSxuc19hZGRfb3ZlcnJpZGRlbih0LCBwLCBuc2UpLHQtPnN5bS0+bmFtZSxwLT5zeW0tPm5hbWUseHNpX3R5cGUocC0+aW5mby50eXApKTsKKwkgICAgfSBlbHNlIGlmKHAtPmluZm8udHlwLT50eXBlPT1UY2xhc3MgJiYgIWlzX2V4dGVybmFsKHAtPmluZm8udHlwKSAmJiAhaXNfdm9sYXRpbGUocC0+aW5mby50eXApICYmICFpc190eXBlZGVmKHAtPmluZm8udHlwKSkgeworCSAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdGlmICgoKCglcyopYSktPiVzKS5zb2FwX2luKHNvYXAsIFwiJXNcIiwgXCIlc1wiKSkiLCB0LT5zeW0tPm5hbWUscC0+c3ltLT5uYW1lLG5zX2FkZF9vdmVycmlkZGVuKHQsIHAsIG5zZSkseHNpX3R5cGUocC0+aW5mby50eXApKTsKKwkgICAgfSBlbHNlIGlmIChwLT5pbmZvLnR5cC0+dHlwZSAhPSBUZnVuICYmICFpc192b2lkKHAtPmluZm8udHlwKSkgeworCSAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdGlmIChzb2FwX2luXyVzKHNvYXAsIFwiJXNcIiwgJigoKCVzKilhKS0+JXMpLCBcIiVzXCIpKSIsIGNfaWRlbnQocC0+aW5mby50eXApLG5zX2FkZF9vdmVycmlkZGVuKHQsIHAsIG5zZSksdC0+c3ltLT5uYW1lLHAtPnN5bS0+bmFtZSx4c2lfdHlwZShwLT5pbmZvLnR5cCkpOworCSAgICB9CisJICAgaWYgKGlzX3RlbXBsYXRlKHAtPmluZm8udHlwKSkKKwkgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRcdGNvbnRpbnVlOyIpOworCSAgIGVsc2UKKwkgICB7IGZwcmludGYoZm91dCwiXG5cdFx0XHRcdHtcdHNvYXBfZmxhZ18lcyVkLS07IiwgcC0+c3ltLT5uYW1lLCBpKTsKKwkgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdFx0Y29udGludWU7Iik7CisJICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHR9Iik7CisJICAgfQorCSAgfQorCSB9CisgICAgICB9CisgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0aWYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIKSIpOworICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0c29hcC0+ZXJyb3IgPSBzb2FwX2lnbm9yZV9lbGVtZW50KHNvYXApOyIpOworICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykiKTsKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdGJyZWFrOyIpOworICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdGlmIChzb2FwLT5lcnJvcilcblx0XHRcdFx0cmV0dXJuIE5VTEw7Iik7CisgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdH0iKTsKKyAgICAgIGZvciAodCA9IHRhYmxlOyB0OyB0ID0gdC0+cHJldikKKwlpKys7CisgICAgICBhPTA7CisgICAgICBmb3IgKDsgaSA+IDA7IGktLSkKKyAgICAgIHsgdCA9IHRhYmxlOworCWZvciAoaiA9IDA7IGogPCBpLTE7IGorKykKKwkgIHQgPSB0LT5wcmV2OworCWZvciAocCA9IHQtPmxpc3Q7IHA7IHAgPSBwLT5uZXh0KQorCSAgeyBpZiAocC0+aW5mby5taW5PY2N1cnMgPiAwICYmIHAtPmluZm8ubWF4T2NjdXJzID49IDAgJiYgIShwLT5pbmZvLnN0byAmIChTY29uc3QgfCBTcHJpdmF0ZSB8IFNwcm90ZWN0ZWQpKSAmJiAhKHAtPmluZm8uc3RvICYgU2F0dHJpYnV0ZSkgJiYgcC0+aW5mby50eXAtPnR5cGUgIT0gVGZ1biAmJiAhaXNfdm9pZChwLT5pbmZvLnR5cCkgJiYgIWlzX3RyYW5zaWVudChwLT5pbmZvLnR5cCkgJiYgIWlzX3RlbXBsYXRlKHAtPmluZm8udHlwKSAmJiAhaXNfcmVwZXRpdGlvbihwKSAmJiAhaXNfY2hvaWNlKHApICYmIHAtPmluZm8uaGFzdmFsID09IEZhbHNlKQorCSAgICB7IGlmIChpc19pdGVtKHApKQorCSAgICAgICAgY29udGludWU7CisJICAgICAgaWYgKGlzX2FueXR5cGUocCkpCisJICAgICAgICBwID0gcC0+bmV4dDsKKwkgICAgICBpZiAoYT09MCkKKwkgICAgICB7IGZwcmludGYoZm91dCwiXG5cdFx0aWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiAoc29hcF9mbGFnXyVzJWQgPiAlbGQiLCBwLT5zeW0tPm5hbWUsIGksIHAtPmluZm8ubWF4T2NjdXJzIC0gcC0+aW5mby5taW5PY2N1cnMpOworCSAgICAgICAgYT0xOworICAgICAgICAgICAgICB9CisJICAgICAgZWxzZQorCSAgICAgICAgZnByaW50Zihmb3V0LCIgfHwgc29hcF9mbGFnXyVzJWQgPiAlbGQiLCBwLT5zeW0tPm5hbWUsIGksIHAtPmluZm8ubWF4T2NjdXJzIC0gcC0+aW5mby5taW5PY2N1cnMpOworCSAgICB9CisJICAgIGVsc2UgaWYgKGlzX3RlbXBsYXRlKHAtPmluZm8udHlwKSkKKwkgICAgeyBpZiAocC0+aW5mby5taW5PY2N1cnMgPiAxKQorCSAgICAgIHsgaWYgKHAtPmluZm8udHlwLT50eXBlID09IFRwb2ludGVyKQorCSAgICAgICAgeyBpZiAoYT09MCkKKwkgICAgICAgICAgeyBmcHJpbnRmKGZvdXQsIlxuXHRcdGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgKCEoKCVzKilhKS0+JXMgfHwgKCglcyopYSktPiVzLT5zaXplKCkgPCAlbGQiLCB0LT5zeW0tPm5hbWUsIHAtPnN5bS0+bmFtZSwgdC0+c3ltLT5uYW1lLCBwLT5zeW0tPm5hbWUsIHAtPmluZm8ubWluT2NjdXJzKTsKKwkgICAgICAgICAgICBhPTE7CisgICAgICAgICAgICAgICAgICB9CisJICAgICAgICAgIGVsc2UKKwkgICAgICAgICAgICBmcHJpbnRmKGZvdXQsIiB8fCAhKCglcyopYSktPiVzIHx8ICgoJXMqKWEpLT4lcy0+c2l6ZSgpIDwgJWxkIiwgdC0+c3ltLT5uYW1lLCBwLT5zeW0tPm5hbWUsIHQtPnN5bS0+bmFtZSwgcC0+c3ltLT5uYW1lLCBwLT5pbmZvLm1pbk9jY3Vycyk7CisJICAgICAgICB9CisJICAgICAgICBlbHNlCisJICAgICAgICB7IGlmIChhPT0wKQorCSAgICAgICAgICB7IGZwcmludGYoZm91dCwiXG5cdFx0aWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiAoKCglcyopYSktPiVzLnNpemUoKSA8ICVsZCIsIHQtPnN5bS0+bmFtZSwgcC0+c3ltLT5uYW1lLCBwLT5pbmZvLm1pbk9jY3Vycyk7CisJICAgICAgICAgICAgYT0xOworICAgICAgICAgICAgICAgICAgfQorCSAgICAgICAgICBlbHNlCisJICAgICAgICAgICAgZnByaW50Zihmb3V0LCIgfHwgKCglcyopYSktPiVzLnNpemUoKSA8ICVsZCIsIHQtPnN5bS0+bmFtZSwgcC0+c3ltLT5uYW1lLCBwLT5pbmZvLm1pbk9jY3Vycyk7CisJICAgICAgICB9CisJICAgICAgfQorCSAgICAgIGlmICggcC0+aW5mby5tYXhPY2N1cnMgPiAxKQorCSAgICAgIHsgaWYgKHAtPmluZm8udHlwLT50eXBlID09IFRwb2ludGVyKQorCSAgICAgICAgeyBpZiAoYT09MCkKKwkgICAgICAgICAgeyBmcHJpbnRmKGZvdXQsIlxuXHRcdGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgKCgoKCVzKilhKS0+JXMgJiYgKCglcyopYSktPiVzLT5zaXplKCkgPiAlbGQpIiwgdC0+c3ltLT5uYW1lLCBwLT5zeW0tPm5hbWUsIHQtPnN5bS0+bmFtZSwgcC0+c3ltLT5uYW1lLCBwLT5pbmZvLm1heE9jY3Vycyk7CisJICAgICAgICAgICAgYT0xOworICAgICAgICAgICAgICAgICAgfQorCSAgICAgICAgICBlbHNlCisJICAgICAgICAgICAgZnByaW50Zihmb3V0LCIgfHwgKCgoJXMqKWEpLT4lcyAmJiAoKCVzKilhKS0+JXMtPnNpemUoKSA+ICVsZCkiLCB0LT5zeW0tPm5hbWUsIHAtPnN5bS0+bmFtZSwgdC0+c3ltLT5uYW1lLCBwLT5zeW0tPm5hbWUsIHAtPmluZm8ubWF4T2NjdXJzKTsKKwkgICAgICAgIH0KKwkJZWxzZQorCSAgICAgICAgeyBpZiAoYT09MCkKKwkgICAgICAgICAgeyBmcHJpbnRmKGZvdXQsIlxuXHRcdGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgKCgoJXMqKWEpLT4lcy5zaXplKCkgPiAlbGQiLCB0LT5zeW0tPm5hbWUsIHAtPnN5bS0+bmFtZSwgcC0+aW5mby5tYXhPY2N1cnMpOworCSAgICAgICAgICAgIGE9MTsKKyAgICAgICAgICAgICAgICAgIH0KKwkgICAgICAgICAgZWxzZQorCSAgICAgICAgICAgIGZwcmludGYoZm91dCwiIHx8ICgoJXMqKWEpLT4lcy5zaXplKCkgPiAlbGQiLCB0LT5zeW0tPm5hbWUsIHAtPnN5bS0+bmFtZSwgcC0+aW5mby5tYXhPY2N1cnMpOworCSAgICAgICAgfQorCSAgICAgIH0KKwkgICAgfQorCSAgICBlbHNlIGlmIChpc19yZXBldGl0aW9uKHApKQorCSAgICB7IGlmIChwLT5pbmZvLm1pbk9jY3VycyA+IDEpCisJICAgICAgeyBpZiAoYT09MCkKKwkgICAgICAgIHsgZnByaW50Zihmb3V0LCJcblx0XHRpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmICgoKCVzKilhKS0+JXMgPCAlbGQiLCB0LT5zeW0tPm5hbWUsIHAtPnN5bS0+bmFtZSwgcC0+aW5mby5taW5PY2N1cnMpOworCSAgICAgICAgICBhPTE7CisgICAgICAgICAgICAgICAgfQorCSAgICAgICAgZWxzZQorCSAgICAgICAgICBmcHJpbnRmKGZvdXQsIiB8fCAoKCVzKilhKS0+JXMgPCAlbGQiLCB0LT5zeW0tPm5hbWUsIHAtPnN5bS0+bmFtZSwgcC0+aW5mby5taW5PY2N1cnMpOworCSAgICAgIH0KKwkgICAgICBpZiAocC0+aW5mby5tYXhPY2N1cnMgPiAxKQorCSAgICAgIHsgaWYgKGE9PTApCisJICAgICAgICB7IGZwcmludGYoZm91dCwiXG5cdFx0aWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiAoKCglcyopYSktPiVzID4gJWxkIiwgdC0+c3ltLT5uYW1lLCBwLT5zeW0tPm5hbWUsIHAtPmluZm8ubWF4T2NjdXJzKTsKKwkgICAgICAgICAgYT0xOworICAgICAgICAgICAgICAgIH0KKwkgICAgICAgIGVsc2UKKwkgICAgICAgICAgZnByaW50Zihmb3V0LCIgfHwgKCglcyopYSktPiVzID4gJWxkIiwgdC0+c3ltLT5uYW1lLCBwLT5zeW0tPm5hbWUsIHAtPmluZm8ubWF4T2NjdXJzKTsKKwkgICAgICB9CisJICAgICAgcCA9IHAtPm5leHQ7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoaXNfY2hvaWNlKHApKQorCSAgICB7IGlmIChwLT5pbmZvLm1pbk9jY3VycyAhPSAwKQorCSAgICAgIHsgaWYgKGE9PTApCisJICAgICAgICB7IGZwcmludGYoZm91dCwiXG5cdFx0aWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiAoc29hcF9mbGFnXyVzJWQiLCBwLT5uZXh0LT5zeW0tPm5hbWUsIGkpOworCSAgICAgICAgICBhPTE7CisgICAgICAgICAgICAgICAgfQorCSAgICAgICAgZWxzZQorCSAgICAgICAgICBmcHJpbnRmKGZvdXQsIiB8fCBzb2FwX2ZsYWdfJXMlZCIsIHAtPm5leHQtPnN5bS0+bmFtZSwgaSk7CisJICAgICAgfQorCSAgICAgIHAgPSBwLT5uZXh0OworCSAgICB9CisJICB9CisgICAgICB9CisgICAgICBpZiAoYSkKKyAgICAgICAgZnByaW50Zihmb3V0LCIpKVxuXHRcdHtcdHNvYXAtPmVycm9yID0gU09BUF9PQ0NVUlM7XG5cdFx0XHRyZXR1cm4gTlVMTDtcblx0XHR9Iik7CisgICAgfQorICAgICAgaWYgKGhhc19nZXR0ZXIodHlwKSkKKyAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRpZiAoYS0+Z2V0KHNvYXApKVxuXHRcdFx0cmV0dXJuIE5VTEw7Iik7CisgICAgICBpZiAoIWlzX2ludmlzaWJsZSh0eXAtPmlkLT5uYW1lKSkKKyAgICAgIHsgZnByaW50Zihmb3V0LCAiXG5cdFx0aWYgKHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSlcblx0XHRcdHJldHVybiBOVUxMOyIpOworICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHR9XG5cdGVsc2Vcblx0e1x0YSA9ICglcylzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilhLCAwLCAlcywgMCwgc2l6ZW9mKCVzKSwgMCwgc29hcF9jb3B5XyVzKTsiLGNfdHlwZV9pZCh0eXAsICIqIiksIHNvYXBfdHlwZSh0eXApLCBjX3R5cGUodHlwKSwgY19pZGVudCh0eXApKTsKKyAgICAgICAgZnByaW50Zihmb3V0LCAiXG5cdFx0aWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKVxuXHRcdFx0cmV0dXJuIE5VTEw7Iik7CisgICAgICAgIGZwcmludGYoZm91dCwgIlxuXHR9Iik7CisgICAgICB9CisgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRyZXR1cm4gYTtcbn0iKTsKKyAgICAgIH0KKworICAgICAgYnJlYWs7ICAgCisgICAgICAgICAgIAorICAgIGNhc2UgVHVuaW9uOgorICAgICAgaWYgKGlzX2V4dGVybmFsKHR5cCkpCisgICAgICB7IGZwcmludGYoZmhlYWQsICJcblNPQVBfRk1BQzEgJXMgU09BUF9GTUFDMiBzb2FwX2luXyVzKHN0cnVjdCBzb2FwKiwgaW50KiwgJXMpOyIsIGNfdHlwZV9pZCh0eXAsICIqIiksY19pZGVudCh0eXApLGNfdHlwZV9pZCh0eXAsICIqIikpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBmcHJpbnRmKGZoZWFkLCAiXG5TT0FQX0ZNQUMzICVzIFNPQVBfRk1BQzQgc29hcF9pbl8lcyhzdHJ1Y3Qgc29hcCosIGludCosICVzKTsiLCBjX3R5cGVfaWQodHlwLCAiKiIpLGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiKiIpKTsKKyAgICAgIGZwcmludGYoZm91dCwgIlxuXG5TT0FQX0ZNQUMzICVzIFNPQVBfRk1BQzQgc29hcF9pbl8lcyhzdHJ1Y3Qgc29hcCAqc29hcCwgaW50ICpjaG9pY2UsICVzKVxueyIsIGNfdHlwZV9pZCh0eXAsICIqIiksY19pZGVudCh0eXApLGNfdHlwZV9pZCh0eXAsICIqYSIpKTsKKyAgICAgIGZwcmludGYoZm91dCwgIlx0c29hcC0+ZXJyb3IgPSBTT0FQX1RBR19NSVNNQVRDSDsiKTsKKyAgICAgIHRhYmxlID0gKFRhYmxlICopdHlwLT5yZWY7CisgICAgICBmb3IgKHAgPSB0YWJsZS0+bGlzdDsgcDsgcCA9IHAtPm5leHQpIAorCXsgaWYgKHAtPmluZm8uc3RvICYgKFNjb25zdCB8IFNwcml2YXRlIHwgU3Byb3RlY3RlZCkpCisJICAgIGZwcmludGYoZm91dCwgIlxuXHQvKiBub24tc2VyaWFsaXphYmxlICVzIHNraXBwZWQgKi8iLCBwLT5zeW0tPm5hbWUpOworCSAgZWxzZSBpZiAoaXNfdHJhbnNpZW50KHAtPmluZm8udHlwKSkKKwkgICAgZnByaW50Zihmb3V0LCAiXG5cdC8qIHRyYW5zaWVudCAlcyBza2lwcGVkICovIiwgcC0+c3ltLT5uYW1lKTsKKwkgIGVsc2UgaWYgKHAtPmluZm8uc3RvICYgU2F0dHJpYnV0ZSkKKwkgICAgOworCSAgZWxzZSBpZiAoaXNfcmVwZXRpdGlvbihwKSkKKwkgICAgOworCSAgZWxzZSBpZiAoaXNfYW55dHlwZShwKSkKKwkgICAgOworCSAgZWxzZQorCSAgeyBpZiAoaXNfdW5tYXRjaGVkKHAtPnN5bSkpCisJICAgIHsgaWYgKGlzX1hNTChwLT5pbmZvLnR5cCkgJiYgaXNfc3RyaW5nKHAtPmluZm8udHlwKSkKKwkgICAgICAgIGZwcmludGYoZm91dCwgIlxuXHRpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0ggJiYgc29hcF9pbmxpdGVyYWwoc29hcCwgTlVMTCwgJmEtPiVzKSkiLCBwLT5zeW0tPm5hbWUpOworCSAgICAgIGVsc2UgaWYgKGlzX1hNTChwLT5pbmZvLnR5cCkgJiYgaXNfd3N0cmluZyhwLT5pbmZvLnR5cCkpCisJICAgICAgICBmcHJpbnRmKGZvdXQsICJcblx0aWYgKHNvYXAtPmVycm9yID09IFNPQVBfVEFHX01JU01BVENIICYmIHNvYXBfaW53bGl0ZXJhbChzb2FwLCBOVUxMLCAmYS0+JXMpKSIsIHAtPnN5bS0+bmFtZSk7CisJICAgICAgZWxzZSBpZiAocC0+aW5mby50eXAtPnR5cGUgPT0gVGFycmF5KQorCSAgICAgICAgZnByaW50Zihmb3V0LCAiXG5cdGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCAmJiBzb2FwX2luXyVzKHNvYXAsIE5VTEwsIGEtPiVzLCBcIiVzXCIpKSIsIGNfaWRlbnQocC0+aW5mby50eXApLHAtPnN5bS0+bmFtZSx4c2lfdHlwZShwLT5pbmZvLnR5cCkpOworCSAgICAgIGVsc2UgaWYgKHAtPmluZm8udHlwLT50eXBlID09IFRjbGFzcyAmJiAhaXNfZXh0ZXJuYWwocC0+aW5mby50eXApICYmICFpc192b2xhdGlsZShwLT5pbmZvLnR5cCkgJiYgIWlzX3R5cGVkZWYocC0+aW5mby50eXApKQorCSAgICAgICAgZnByaW50Zihmb3V0LCAiXG5cdGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCAmJiBhLT4lcy5zb2FwX2luKHNvYXAsIE5VTEwsIFwiJXNcIikpIiwgcC0+c3ltLT5uYW1lLHhzaV90eXBlKHAtPmluZm8udHlwKSk7CisJICAgICAgZWxzZSBpZiAocC0+aW5mby50eXAtPnR5cGUgIT0gVGZ1biAmJiAhaXNfdm9pZChwLT5pbmZvLnR5cCkpCisJICAgICAgeyBpZiAocC0+aW5mby50eXAtPnR5cGUgPT0gVHBvaW50ZXIpCisJICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuXHRhLT4lcyA9IE5VTEw7IiwgcC0+c3ltLT5uYW1lKTsKKwkgICAgICAgIGZwcmludGYoZm91dCwgIlxuXHRpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0ggJiYgc29hcF9pbl8lcyhzb2FwLCBOVUxMLCAmYS0+JXMsIFwiJXNcIikpIiwgY19pZGVudChwLT5pbmZvLnR5cCkscC0+c3ltLT5uYW1lLHhzaV90eXBlKHAtPmluZm8udHlwKSk7CisJICAgICAgfQorCSAgICB9CisJICAgIGVsc2UKKwkgICAgeyBpZiAoaXNfWE1MKHAtPmluZm8udHlwKSAmJiBpc19zdHJpbmcocC0+aW5mby50eXApKQorCSAgICAgICAgZnByaW50Zihmb3V0LCAiXG5cdGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCAmJiBzb2FwX2lubGl0ZXJhbChzb2FwLCBcIiVzXCIsICZhLT4lcykpIiwgbnNfYWRkKHAtPnN5bS0+bmFtZSwgbnNlKSwgcC0+c3ltLT5uYW1lKTsKKwkgICAgICBlbHNlIGlmIChpc19YTUwocC0+aW5mby50eXApICYmIGlzX3dzdHJpbmcocC0+aW5mby50eXApKQorCSAgICAgICAgZnByaW50Zihmb3V0LCAiXG5cdGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCAmJiBzb2FwX2lud2xpdGVyYWwoc29hcCwgXCIlc1wiLCAmYS0+JXMpKSIsIG5zX2FkZChwLT5zeW0tPm5hbWUsIG5zZSksIHAtPnN5bS0+bmFtZSk7CisJICAgICAgZWxzZSBpZiAocC0+aW5mby50eXAtPnR5cGUgPT0gVGFycmF5KQorCSAgICAgICAgZnByaW50Zihmb3V0LCAiXG5cdGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCAmJiBzb2FwX2luXyVzKHNvYXAsIFwiJXNcIiwgYS0+JXMsIFwiJXNcIikpIiwgY19pZGVudChwLT5pbmZvLnR5cCksbnNfYWRkKHAtPnN5bS0+bmFtZSwgbnNlKSxwLT5zeW0tPm5hbWUseHNpX3R5cGUocC0+aW5mby50eXApKTsKKwkgICAgICBlbHNlIGlmIChwLT5pbmZvLnR5cC0+dHlwZSA9PSBUY2xhc3MgJiYgIWlzX2V4dGVybmFsKHAtPmluZm8udHlwKSAmJiAhaXNfdm9sYXRpbGUocC0+aW5mby50eXApICYmICFpc190eXBlZGVmKHAtPmluZm8udHlwKSkKKwkgICAgICAgIGZwcmludGYoZm91dCwgIlxuXHRpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0ggJiYgYS0+JXMuc29hcF9pbihzb2FwLCBcIiVzXCIsIFwiJXNcIikpIiwgcC0+c3ltLT5uYW1lLG5zX2FkZChwLT5zeW0tPm5hbWUsIG5zZSkseHNpX3R5cGUocC0+aW5mby50eXApKTsKKwkgICAgICBlbHNlIGlmIChwLT5pbmZvLnR5cC0+dHlwZSAhPSBUZnVuICYmICFpc192b2lkKHAtPmluZm8udHlwKSkKKwkgICAgICB7IGlmIChwLT5pbmZvLnR5cC0+dHlwZSA9PSBUcG9pbnRlcikKKwkgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG5cdGEtPiVzID0gTlVMTDsiLCBwLT5zeW0tPm5hbWUpOworCSAgICAgICAgZnByaW50Zihmb3V0LCAiXG5cdGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCAmJiBzb2FwX2luXyVzKHNvYXAsIFwiJXNcIiwgJmEtPiVzLCBcIiVzXCIpKSIsIGNfaWRlbnQocC0+aW5mby50eXApLG5zX2FkZChwLT5zeW0tPm5hbWUsIG5zZSkscC0+c3ltLT5uYW1lLHhzaV90eXBlKHAtPmluZm8udHlwKSk7CisJICAgICAgfQorCSAgICB9CisJICAgIGZwcmludGYoZm91dCwgIlxuXHR7XHQqY2hvaWNlID0gU09BUF9VTklPTl8lc18lczsiLCBjX2lkZW50KHR5cCksIHAtPnN5bS0+bmFtZSk7CisJICAgIGZwcmludGYoZm91dCwgIlxuXHRcdHJldHVybiBhOyIpOworCSAgICBmcHJpbnRmKGZvdXQsICJcblx0fSIpOworCSAgICBmZmx1c2goZm91dCk7CisJICB9CisgICAgICAgIH0KKyAgICAgIGZwcmludGYoZm91dCwgIlxuXHQqY2hvaWNlID0gMDtcblx0aWYgKCFzb2FwLT5lcnJvcilcblx0XHRzb2FwLT5lcnJvciA9IFNPQVBfVEFHX01JU01BVENIO1xuXHRyZXR1cm4gTlVMTDtcbn0iKTsKKyAgICAgIGJyZWFrOworIAorICAgIGNhc2UgVHBvaW50ZXI6CisgICAgICAKKyAgICAgIGlmIChpc19leHRlcm5hbCh0eXApKQorICAgICAgeyBmcHJpbnRmKGZoZWFkLCJcblNPQVBfRk1BQzEgJXMgU09BUF9GTUFDMiBzb2FwX2luXyVzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosICVzLCBjb25zdCBjaGFyKik7IiwgY190eXBlX2lkKHR5cCwgIioiKSxjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgIioiKSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGZwcmludGYoZmhlYWQsIlxuU09BUF9GTUFDMyAlcyBTT0FQX0ZNQUM0IHNvYXBfaW5fJXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgJXMsIGNvbnN0IGNoYXIqKTsiLCBjX3R5cGVfaWQodHlwLCAiKiIpLGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiKiIpKTsKKyAgICAgIGZwcmludGYoZm91dCwiXG5cblNPQVBfRk1BQzMgJXMgU09BUF9GTUFDNCBzb2FwX2luXyVzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsICVzLCBjb25zdCBjaGFyICp0eXBlKVxueyIsIGNfdHlwZV9pZCh0eXAsICIqIiksY19pZGVudCh0eXApLGNfdHlwZV9pZCh0eXAsICIqYSIpKTsKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAxKSkiKTsKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0cmV0dXJuIE5VTEw7Iik7CisKKyAgICAgIGlmIChpc190ZW1wbGF0ZSh0eXApKQorICAgICAgeyBmcHJpbnRmKGZvdXQsIlxuXHRzb2FwX3JldmVydChzb2FwKTsiKTsKKwlmcHJpbnRmKGZvdXQsIlxuXHRpZiAoIWEpXG5cdFx0aWYgKCEoYSA9ICglcylzb2FwX21hbGxvYyhzb2FwLCBzaXplb2YoJXMpKSkpXG5cdFx0XHRyZXR1cm4gTlVMTDsiLCBjX3R5cGVfaWQodHlwLCAiKiIpLCBjX3R5cGUodHlwKSk7CisJZnByaW50Zihmb3V0LCJcblx0aWYgKCEoKmEgPSBzb2FwX2luXyVzKHNvYXAsIHRhZywgKmEsIHR5cGUpKSlcblx0XHRyZXR1cm4gTlVMTDsiLCBjX2lkZW50KHR5cC0+cmVmKSk7CisJZnByaW50Zihmb3V0LCJcblx0cmV0dXJuIGE7XG59Iik7CisgICAgICB9CisgICAgICBlbHNlIGlmKCgoVG5vZGUgKikgdHlwLT5yZWYpLT50eXBlID09IFRjbGFzcyAmJiAhaXNfZXh0ZXJuYWwodHlwLT5yZWYpICYmICFpc192b2xhdGlsZSh0eXAtPnJlZikgJiYgIWlzX3R5cGVkZWYodHlwLT5yZWYpKQorICAgICAgeworCWZwcmludGYoZm91dCwiXG5cdGlmICghYSlcblx0XHRpZiAoIShhID0gKCVzKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZiglcykpKSlcblx0XHRcdHJldHVybiBOVUxMOyIsIGNfdHlwZV9pZCh0eXAsICIqIiksIGNfdHlwZSh0eXApKTsKKwlmcHJpbnRmKGZvdXQsIlxuXHQqYSA9IE5VTEw7XG5cdGlmICghc29hcC0+bnVsbCAmJiAqc29hcC0+aHJlZiAhPSAnIycpIik7CisJZnByaW50Zihmb3V0LCJcblx0e1x0c29hcF9yZXZlcnQoc29hcCk7Iik7CisJZnByaW50Zihmb3V0LCAiXG5cdFx0aWYgKCEoKmEgPSAoJXMpc29hcF9pbnN0YW50aWF0ZV8lcyhzb2FwLCAtMSwgc29hcC0+dHlwZSwgc29hcC0+YXJyYXlUeXBlLCBOVUxMKSkpIiwgY190eXBlKHR5cCksIGNfaWRlbnQodHlwLT5yZWYpKTsKKwlmcHJpbnRmKGZvdXQsICJcblx0XHRcdHJldHVybiBOVUxMOyIpOworCWZwcmludGYoZm91dCwgIlxuXHRcdCgqYSktPnNvYXBfZGVmYXVsdChzb2FwKTsiKTsKKwlmcHJpbnRmKGZvdXQsICJcblx0XHRpZiAoISgqYSktPnNvYXBfaW4oc29hcCwgdGFnLCBOVUxMKSkiKTsgCisJZnByaW50Zihmb3V0LCAiXG5cdFx0XHRyZXR1cm4gTlVMTDsiKTsKKwlmcHJpbnRmKGZvdXQsIlxuXHR9XG5cdGVsc2Vcblx0e1x0YSA9ICglcylzb2FwX2lkX2xvb2t1cChzb2FwLCBzb2FwLT5ocmVmLCAodm9pZCoqKWEsICVzLCBzaXplb2YoJXMpLCAlZCk7IiwgY190eXBlX2lkKHR5cCwgIioiKSwgc29hcF90eXBlKHR5cC0+cmVmKSwgY190eXBlKHR5cC0+cmVmKSwgcmVmbGV2ZWwodHlwLT5yZWYpICk7CisJZnByaW50Zihmb3V0LCJcblx0XHRpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpXG5cdFx0XHRyZXR1cm4gTlVMTDsiKTsKKwlmcHJpbnRmKGZvdXQsIlxuXHR9XG5cdHJldHVybiBhO1xufSIpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworCWZwcmludGYoZm91dCwiXG5cdGlmICghYSlcblx0XHRpZiAoIShhID0gKCVzKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZiglcykpKSlcblx0XHRcdHJldHVybiBOVUxMOyIsIGNfdHlwZV9pZCh0eXAsICIqIiksIGNfdHlwZSh0eXApKTsKKwlmcHJpbnRmKGZvdXQsIlxuXHQqYSA9IE5VTEw7XG5cdGlmICghc29hcC0+bnVsbCAmJiAqc29hcC0+aHJlZiAhPSAnIycpIik7CisJZnByaW50Zihmb3V0LCJcblx0e1x0c29hcF9yZXZlcnQoc29hcCk7Iik7CisJZnByaW50Zihmb3V0LCJcblx0XHRpZiAoISgqYSA9IHNvYXBfaW5fJXMoc29hcCwgdGFnLCAqYSwgdHlwZSkpKSIsIGNfaWRlbnQodHlwLT5yZWYpKTsKKwlmcHJpbnRmKGZvdXQsIlxuXHRcdFx0cmV0dXJuIE5VTEw7Iik7CisKKwlmcHJpbnRmKGZvdXQsIlxuXHR9XG5cdGVsc2Vcblx0e1x0YSA9ICglcylzb2FwX2lkX2xvb2t1cChzb2FwLCBzb2FwLT5ocmVmLCAodm9pZCoqKWEsICVzLCBzaXplb2YoJXMpLCAlZCk7IiwgY190eXBlX2lkKHR5cCwgIioiKSwgc29hcF90eXBlKHR5cC0+cmVmKSwgY190eXBlKHR5cC0+cmVmKSwgcmVmbGV2ZWwodHlwLT5yZWYpICk7CisJZnByaW50Zihmb3V0LCJcblx0XHRpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpXG5cdFx0XHRyZXR1cm4gTlVMTDsiKTsKKwlmcHJpbnRmKGZvdXQsIlxuXHR9XG5cdHJldHVybiBhO1xufSIpOworICAgICAgfQorICAgIAorICAgICAgYnJlYWs7CisgIAorICAgIGNhc2UgVGFycmF5OgorICAgICAgdGVtcCA9IHR5cDsKKyAgICAgIHdoaWxlKHRlbXAtPnR5cGUgPT0gVGFycmF5KXsKKwl0ZW1wID0gdGVtcC0+cmVmOworICAgICAgfQorICAgICAgaWYgKGlzX2V4dGVybmFsKHR5cCkpCisgICAgICB7IGZwcmludGYoZmhlYWQsIlxuU09BUF9GTUFDMSAlcyBTT0FQX0ZNQUMyIHNvYXBfaW5fJXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgJXMsIGNvbnN0IGNoYXIqKTsiLGNfdHlwZV9pZCh0ZW1wLCAiKiIpLGNfaWRlbnQodHlwKSxjX3R5cGUodHlwKSk7ICAKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgZnByaW50ZihmaGVhZCwiXG5TT0FQX0ZNQUMzICVzIFNPQVBfRk1BQzQgc29hcF9pbl8lcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCAlcywgY29uc3QgY2hhciopOyIsY190eXBlX2lkKHRlbXAsICIqIiksY19pZGVudCh0eXApLGNfdHlwZSh0eXApKTsgIAorICAgICAgZnByaW50Zihmb3V0LCJcblxuU09BUF9GTUFDMyAlcyBTT0FQX0ZNQUM0IHNvYXBfaW5fJXMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgJXMsIGNvbnN0IGNoYXIgKnR5cGUpXG57IixjX3R5cGVfaWQodGVtcCwgIioiKSxjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgImEiKSk7ICAKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkiKTsKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0cmV0dXJuIE5VTEw7Iik7CisgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRpZiAoc29hcF9tYXRjaF9hcnJheShzb2FwLCB0eXBlKSkiKTsKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdHtcdHNvYXAtPmVycm9yID0gU09BUF9UWVBFO1xuXHRcdHJldHVybiBOVUxMO1xuXHR9Iik7CisgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRhID0gKCVzKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIGEsICVzLCBzaXplb2YoJXMpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsiLCBjX3R5cGVfaWQodHlwLT5yZWYsICIoKikiKSwgc29hcF90eXBlKHR5cCksIGNfdHlwZSh0eXApKTsKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdGlmICghYSlcblx0XHRyZXR1cm4gTlVMTDsiKTsKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdHNvYXBfZGVmYXVsdF8lcyhzb2FwLCBhKTsiLGNfaWRlbnQodHlwKSk7CisgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRpZiAoc29hcC0+Ym9keSAmJiAhKnNvYXAtPmhyZWYpIik7CisgICAgICB0b3RhbD1nZXRfZGltZW5zaW9uKHR5cCk7ICAKKyAgICAgIG49dHlwLT5yZWY7CisgICAgICBjYXJkaW5hbGl0eSA9IDE7CisgICAgICB3aGlsZShuLT50eXBlPT1UYXJyYXkpCisJeworCSAgdG90YWw9dG90YWwqZ2V0X2RpbWVuc2lvbihuKTsKKwkgIG4gPSBuLT5yZWY7CisJICBjYXJkaW5hbGl0eSsrOworCX0KKyAgICAgIGZwcmludGYoZm91dCwiXG5cdHtcdGludCBpO1xuXHRcdGZvciAoaSA9IDA7IGkgPCAlZDsgaSsrKSIsZ2V0X2RpbWVuc2lvbih0eXApKTsKKyAgZnByaW50Zihmb3V0LCJcblx0XHR7XHRzb2FwX3BlZWtfZWxlbWVudChzb2FwKTtcblx0XHRcdGlmIChzb2FwLT5wb3NpdGlvbilcblx0XHRcdHtcdGkgPSBzb2FwLT5wb3NpdGlvbnNbMF07XG5cdFx0XHRcdGlmIChpIDwgMCB8fCBpID49ICVkKVxuXHRcdFx0XHR7XHRzb2FwLT5lcnJvciA9IFNPQVBfSU9CO1xuXHRcdFx0XHRcdHJldHVybiBOVUxMO1xuXHRcdFx0XHR9XG5cdFx0XHR9IiwgZ2V0X2RpbWVuc2lvbih0eXApKTsKKwlmcHJpbnRmKGZvdXQsIlxuXHRcdFx0aWYgKCFzb2FwX2luXyVzKHNvYXAsIE5VTEwsIGEiLCBjX2lkZW50KHR5cC0+cmVmKSk7CisKKyAgICAgIGlmKGNhcmRpbmFsaXR5ID4gMSl7CisJZnByaW50Zihmb3V0LCJbaV0iKTsKKyAgICAgIH1lbHNlIHsKKwlmcHJpbnRmKGZvdXQsIitpIik7CisgICAgICB9CisgICAgICBmcHJpbnRmKGZvdXQsIiwgXCIlc1wiKSkiLCB4c2lfdHlwZSh0eXAtPnJlZikpOworICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdHtcdGlmIChzb2FwLT5lcnJvciAhPSBTT0FQX05PX1RBRylcblx0XHRcdFx0XHRyZXR1cm4gTlVMTDsiKTsKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdHNvYXAtPmVycm9yID0gU09BUF9PSzsiKTsKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdGJyZWFrOyIpOworICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdH0iKTsKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0fSIpOworICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRpZiAoc29hcC0+bW9kZSAmIFNPQVBfQ19OT0lPQilcblx0XHRcdHdoaWxlIChzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykgPT0gU09BUF9TWU5UQVhfRVJST1IpXG5cdFx0XHR7XHRzb2FwLT5wZWVrZWQgPSAxO1xuXHRcdFx0XHRzb2FwX2lnbm9yZV9lbGVtZW50KHNvYXApO1xuXHRcdFx0fSIpOworICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRlbHNlIGlmIChzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpXG5cdFx0e1x0aWYgKHNvYXAtPmVycm9yID09IFNPQVBfU1lOVEFYX0VSUk9SKVxuXHRcdFx0XHRzb2FwLT5lcnJvciA9IFNPQVBfSU9CO1xuXHRcdFx0cmV0dXJuIE5VTEw7XG5cdFx0fSIpOworICAgICAgZnByaW50Zihmb3V0LCJcblx0fVxuXHRlbHNlXG5cdHtcdGEgPSAoJXMpc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgYSwgJXMsIHNpemVvZiglcyksIDAsIE5VTEwsIE5VTEwsIE5VTEwpLCAwLCAlcywgMCwgc2l6ZW9mKCVzKSwgMCwgTlVMTCk7IiwgY190eXBlX2lkKHR5cC0+cmVmLCAiKCopIiksIHNvYXBfdHlwZSh0eXApLCBjX3R5cGUodHlwKSwgc29hcF90eXBlKHR5cCksIGNfdHlwZSh0eXApKTsKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0aWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKVxuXHRcdFx0cmV0dXJuIE5VTEw7Iik7CisgICAgICBmcHJpbnRmKGZvdXQsIlxuXHR9XG5cdHJldHVybiAoJXMpYTtcbn0iLCBjX3R5cGVfaWQodGVtcCwgIioiKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVGVudW06CisgICAgICBpZiAoaXNfZXh0ZXJuYWwodHlwKSkKKyAgICAgIHsgZnByaW50ZihmaGVhZCwiXG5TT0FQX0ZNQUMxICVzIFNPQVBfRk1BQzIgc29hcF9pbl8lcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCAlcywgY29uc3QgY2hhciopOyIsY190eXBlX2lkKHR5cCwgIioiKSxjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgIioiKSk7ICAKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgZnByaW50ZihmaGVhZCwiXG5TT0FQX0ZNQUMzICVzIFNPQVBfRk1BQzQgc29hcF9pbl8lcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCAlcywgY29uc3QgY2hhciopOyIsY190eXBlX2lkKHR5cCwgIioiKSxjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgIioiKSk7ICAKKyAgICAgIGlmICghaXNfbWFzayh0eXApKQorICAgICAgeyBmcHJpbnRmKGZoZWFkLCJcblxuU09BUF9GTUFDM1MgaW50IFNPQVBfRk1BQzRTIHNvYXBfczIlcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCAlcyk7IixjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgIioiKSk7ICAKKyAgICAgICAgZnByaW50Zihmb3V0LCJcblxuU09BUF9GTUFDM1MgaW50IFNPQVBfRk1BQzRTIHNvYXBfczIlcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgJXMpXG57XG5cdCIsY19pZGVudCh0eXApLGNfdHlwZV9pZCh0eXAsICIqYSIpKTsgIAorCWlmIChpc190eXBlZGVmKHR5cCkpCisJICBmcHJpbnRmKGZvdXQsICJyZXR1cm4gc29hcF9zMiVzKHNvYXAsIHMsIGEpO1xufSIsIHRfaWRlbnQodHlwKSk7CisJZWxzZQorCXsgZnByaW50Zihmb3V0LCAiY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgKm1hcDsiKTsKKyAgICAgICAgICB0ID0gKFRhYmxlKil0eXAtPnJlZjsKKyAgICAgICAgICBpZiAodCAmJiB0LT5saXN0ICYmIHN0cnN0cihuc19yZW1vdmUxKHQtPmxpc3QtPnN5bS0+bmFtZSksICJfXyIpKQorCSAgICBmcHJpbnRmKGZvdXQsICJcblx0Y2hhciAqdDsiKTsKKwkgIGZwcmludGYoZm91dCwgIlxuXHRpZiAoIXMpXG5cdFx0cmV0dXJuIFNPQVBfT0s7Iik7CisgICAgICAgICAgaWYgKHQgJiYgdC0+bGlzdCAmJiBzdHJzdHIobnNfcmVtb3ZlMSh0LT5saXN0LT5zeW0tPm5hbWUpLCAiX18iKSkKKwkgIHsgZnByaW50Zihmb3V0LCAiXG5cdHNvYXBfczJRTmFtZShzb2FwLCBzLCAmdCk7Iik7CisJICAgIGZwcmludGYoZm91dCwgIlxuXHRtYXAgPSBzb2FwX2NvZGUoc29hcF9jb2Rlc18lcywgdCk7IiwgY19pZGVudCh0eXApKTsKKyAgICAgICAgICB9IAorICAgICAgICAgIGVsc2UKKwkgICAgZnByaW50Zihmb3V0LCAiXG5cdG1hcCA9IHNvYXBfY29kZShzb2FwX2NvZGVzXyVzLCBzKTsiLCBjX2lkZW50KHR5cCkpOworCSAgbSA9IDA7CisgICAgICAgICAgZm9yICh0ID0gKFRhYmxlKil0eXAtPnJlZjsgdDsgdCA9IHQtPnByZXYpCisgICAgICAgICAgICBmb3IgKHAgPSB0LT5saXN0OyBwOyBwID0gcC0+bmV4dCkKKwkgICAgICBpZiAocC0+aW5mby52YWwuaSA+IG0pCisJICAgICAgICBtID0gcC0+aW5mby52YWwuaTsKKwkgIGlmICh0eXAtPnJlZiA9PSBib29sdGFibGUpCisJICAgIGZwcmludGYoZm91dCwgIlxuXHRpZiAobWFwKVxuXHRcdCphID0gKCVzKShtYXAtPmNvZGUgIT0gMCk7XG5cdGVsc2Vcblx0e1x0bG9uZyBuO1xuXHRcdGlmIChzb2FwX3MybG9uZyhzb2FwLCBzLCAmbikgfHwgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiAobiA8IDAgfHwgbiA+ICVsdSkpKVxuXHRcdFx0cmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9UWVBFO1xuXHRcdCphID0gKCVzKShuICE9IDApO1xuXHR9XG5cdHJldHVybiBTT0FQX09LO1xufSIsIGNfdHlwZSh0eXApLCBtLCBjX3R5cGUodHlwKSk7CisJICBlbHNlCisJICAgIGZwcmludGYoZm91dCwgIlxuXHRpZiAobWFwKVxuXHRcdCphID0gKCVzKW1hcC0+Y29kZTtcblx0ZWxzZVxuXHR7XHRsb25nIG47XG5cdFx0aWYgKHNvYXBfczJsb25nKHNvYXAsIHMsICZuKSB8fCAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIChuIDwgMCB8fCBuID4gJWx1KSkpXG5cdFx0XHRyZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7XG5cdFx0KmEgPSAoJXMpbjtcblx0fVxuXHRyZXR1cm4gU09BUF9PSztcbn0iLCBjX3R5cGUodHlwKSwgbSwgY190eXBlKHR5cCkpOworICAgICAgICB9CisgICAgICB9CisgICAgICBmcHJpbnRmKGZvdXQsIlxuXG5TT0FQX0ZNQUMzICVzIFNPQVBfRk1BQzQgc29hcF9pbl8lcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCAlcywgY29uc3QgY2hhciAqdHlwZSlcbnsiLGNfdHlwZV9pZCh0eXAsICIqIiksY19pZGVudCh0eXApLGNfdHlwZV9pZCh0eXAsICIqYSIpKTsgIAorICAgICAgaWYgKGlzX21hc2sodHlwKSkKKyAgICAgICAgZnByaW50Zihmb3V0LCJcblx0Y29uc3QgY2hhciAqcztcblx0TE9ORzY0IGk7Iik7CisgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpIik7CisgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdHJldHVybiBOVUxMOyIpOworICAgICAgaWYgKHR5cC0+c3ltKQorICAgICAgeyBmcHJpbnRmKGZvdXQsIlxuXHRpZiAoKnNvYXAtPnR5cGUgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgXCIlc1wiKSkiLCBiYXNlX3R5cGUodHlwLCAiIikpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRpZiAoKnNvYXAtPnR5cGUgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkpIik7CisgICAgICBmcHJpbnRmKGZvdXQsIlxuXHR7XHRzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTtcblx0XHRyZXR1cm4gTlVMTDtcblx0fSIpOworICAgICAgZnByaW50Zihmb3V0LCJcblx0YSA9ICglcylzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBhLCAlcywgc2l6ZW9mKCVzKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7IiwgY190eXBlX2lkKHR5cCwgIioiKSwgc29hcF90eXBlKHR5cCksIGNfdHlwZSh0eXApKTsKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdGlmICghYSlcblx0XHRyZXR1cm4gTlVMTDsiKTsKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdGlmIChzb2FwLT5ib2R5ICYmICEqc29hcC0+aHJlZilcblx0eyIpOworICAgICAgaWYgKGlzX21hc2sodHlwKSkKKyAgICAgIHsgZnByaW50Zihmb3V0LCJcdGkgPSAwO1xuXHRcdHdoaWxlICgqKHMgPSBzb2FwX3Rva2VuKHNvYXApKSlcblx0XHRcdCIpOworICAgICAgICBmb3IgKHQgPSAoVGFibGUqKXR5cC0+cmVmOyB0OyB0ID0gdC0+cHJldikKKyAgICAgICAgeyBmb3IgKHAgPSB0LT5saXN0OyBwOyBwID0gcC0+bmV4dCkKKwkgICAgZnByaW50Zihmb3V0LCAiaWYgKCFzdHJjbXAocywgXCIlc1wiKSlcblx0XHRcdFx0aSB8PSAoTE9ORzY0KSVzO1xuXHRcdFx0ZWxzZSAiLCBuc19yZW1vdmUyKHAtPnN5bS0+bmFtZSksIHAtPnN5bS0+bmFtZSk7CisgICAgICAgIH0JCisgICAgICAgIGZwcmludGYoZm91dCwgIlxuXHRcdFx0e1x0c29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7XG5cdFx0XHRcdHJldHVybiBOVUxMO1xuXHRcdFx0fSIpOworICAgICAgICBmcHJpbnRmKGZvdXQsICJcblx0XHQqYSA9ICglcylpOyIsIGNfdHlwZSh0eXApKTsKKyAgICAgICAgZnByaW50Zihmb3V0LCAiXG5cdFx0aWYgKHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSlcblx0XHRcdHJldHVybiBOVUxMOyIsIGNfdHlwZSh0eXApKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgZnByaW50Zihmb3V0LCJcdGlmICghYSB8fCBzb2FwX3MyJXMoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgYSkgfHwgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKVxuXHRcdFx0cmV0dXJuIE5VTEw7IiwgY19pZGVudCh0eXApKTsKKyAgICAgIGZwcmludGYoZm91dCwgIlxuXHR9XG5cdGVsc2Vcblx0e1x0YSA9ICglcylzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilhLCAwLCAlcywgMCwgc2l6ZW9mKCVzKSwgMCwgTlVMTCk7IiwgY190eXBlX2lkKHR5cCwgIioiKSwgc29hcF90eXBlKHR5cCksIGNfdHlwZSh0eXApKTsKKyAgICAgIGZwcmludGYoZm91dCwgIlxuXHRcdGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSlcblx0XHRcdHJldHVybiBOVUxMOyIpOworICAgICAgZnByaW50Zihmb3V0LCJcblx0fVxuXHRyZXR1cm4gYTtcbn0iKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUdGVtcGxhdGU6CisgICAgICBpZiAoaXNfZXh0ZXJuYWwodHlwKSkKKyAgICAgIHsgZnByaW50ZihmaGVhZCwiXG5TT0FQX0ZNQUMxICVzIFNPQVBfRk1BQzIgc29hcF9pbl8lcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCAlcywgY29uc3QgY2hhciopOyIsIGNfdHlwZV9pZCh0eXAsICIqIiksY19pZGVudCh0eXApLGNfdHlwZV9pZCh0eXAsICIqIikpOyAKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgZnByaW50ZihmaGVhZCwiXG5TT0FQX0ZNQUMzICVzIFNPQVBfRk1BQzQgc29hcF9pbl8lcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCAlcywgY29uc3QgY2hhciopOyIsIGNfdHlwZV9pZCh0eXAsICIqIiksY19pZGVudCh0eXApLGNfdHlwZV9pZCh0eXAsICIqIikpOyAKKyAgICAgIGZwcmludGYoZm91dCwgIlxuXG5TT0FQX0ZNQUMzICVzIFNPQVBfRk1BQzQgc29hcF9pbl8lcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCAlcywgY29uc3QgY2hhciAqdHlwZSlcbnsiLCBjX3R5cGVfaWQodHlwLCAiKiIpLGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiKmEiKSk7IAorICAgICAgbiA9IHR5cC0+cmVmOworICAgICAgZnByaW50Zihmb3V0LCAiXG5cdGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAxKSlcblx0XHRyZXR1cm4gTlVMTDsiKTsKKyAgICAgIGZwcmludGYoZm91dCwgIlxuXHRpZiAoIWEgJiYgIShhID0gc29hcF9uZXdfJXMoc29hcCwgLTEpKSlcblx0XHRyZXR1cm4gTlVMTDsiLCBjX2lkZW50KHR5cCkpOworICAgICAgLyogZnByaW50Zihmb3V0LCAiXG5cdCVzOjppdGVyYXRvciBpO1xuXHQ7IiwgY190eXBlKHR5cCkpOyAqLworICAgICAgZnByaW50Zihmb3V0LCAiXG5cdCVzO1xuXHQlczsiLCBjX3R5cGVfaWQobiwgIm4iKSwgY190eXBlX2lkKG4sICIqcCIpKTsKKyAgICAgIGZwcmludGYoZm91dCwgIlxuXHRkbyIpOworICAgICAgZnByaW50Zihmb3V0LCAiXG5cdHtcdHNvYXBfcmV2ZXJ0KHNvYXApOyIpOworICAgICAgZnByaW50Zihmb3V0LCAiXG5cdFx0aWYgKCpzb2FwLT5pZCB8fCAqc29hcC0+aHJlZikiKTsKKyAgICAgIGZwcmludGYoZm91dCwgIlxuXHRcdHtcdGlmICghc29hcF9jb250YWluZXJfaWRfZm9yd2FyZChzb2FwLCAqc29hcC0+aWQ/c29hcC0+aWQ6c29hcC0+aHJlZiwgYSwgKHNpemVfdClhLT5zaXplKCksICVzLCAlcywgc2l6ZW9mKCVzKSwgJWQpKVxuXHRcdFx0XHRicmVhaztcblx0XHRcdCIsIHNvYXBfdHlwZShyZWZ0eXBlKG4pKSwgc29hcF90eXBlKHR5cCksIGNfdHlwZShyZWZ0eXBlKG4pKSwgcmVmbGV2ZWwobikpOworICAgICAgaWYgKGlzX1hNTChuKSAmJiBpc19zdHJpbmcobikpCisgICAgICAgIGZwcmludGYoZm91dCwgImlmICghKHAgPSBzb2FwX2lubGl0ZXJhbChzb2FwLCB0YWcsIE5VTEwpKSkiLCB4c2lfdHlwZShuKSk7CisgICAgICBlbHNlIGlmIChpc19YTUwobikgJiYgaXNfd3N0cmluZyhuKSkKKyAgICAgICAgZnByaW50Zihmb3V0LCAiaWYgKCEocCA9IHNvYXBfaW53bGl0ZXJhbChzb2FwLCB0YWcsIE5VTEwpKSkiLCB4c2lfdHlwZShuKSk7CisgICAgICBlbHNlIGlmIChuLT50eXBlPT1UYXJyYXkpCisgICAgICAgIGZwcmludGYoZm91dCwgImlmICghKHAgPSBzb2FwX2luXyVzKHNvYXAsIHRhZywgTlVMTCwgXCIlc1wiKSkpIiwgY19pZGVudChuKSx4c2lfdHlwZShuKSk7CisgICAgICBlbHNlIGlmIChuLT50eXBlICE9IFRmdW4gJiYgIWlzX3ZvaWQobikpCisgICAgICAgIGZwcmludGYoZm91dCwgImlmICghKHAgPSBzb2FwX2luXyVzKHNvYXAsIHRhZywgTlVMTCwgXCIlc1wiKSkpIiwgY19pZGVudChuKSx4c2lfdHlwZShuKSk7CisgICAgICBmcHJpbnRmKGZvdXQsICJcblx0XHRcdFx0YnJlYWs7Iik7CisgICAgICBmcHJpbnRmKGZvdXQsICJcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcdCIpOworICAgICAgaWYgKG4tPnR5cGUgPT0gVHBvaW50ZXIpCisJZnByaW50Zihmb3V0LCJuID0gTlVMTDsiKTsKKyAgICAgIGVsc2UgaWYgKG4tPnR5cGUgPT0gVGFycmF5KQorCWZwcmludGYoZm91dCwic29hcF9kZWZhdWx0XyVzKHNvYXAsICZuKTsiLCBjX2lkZW50KG4pKTsKKyAgICAgIGVsc2UgaWYobi0+dHlwZT09VGNsYXNzICYmICFpc19leHRlcm5hbChuKSAmJiAhaXNfdm9sYXRpbGUobikgJiYgIWlzX3R5cGVkZWYobikpCisJZnByaW50Zihmb3V0LCJuLnNvYXBfZGVmYXVsdChzb2FwKTsiKTsKKyAgICAgIGVsc2UgaWYgKG4tPnR5cGUgIT0gVGZ1biAmJiAhaXNfdm9pZChuKSAmJiAhaXNfWE1MKG4pKQorICAgICAgICBmcHJpbnRmKGZvdXQsInNvYXBfZGVmYXVsdF8lcyhzb2FwLCAmbik7IiwgY19pZGVudChuKSk7CisgICAgICBpZiAoaXNfWE1MKG4pICYmIGlzX3N0cmluZyhuKSkKKyAgICAgICAgZnByaW50Zihmb3V0LCAiXG5cdFx0XHRpZiAoIXNvYXBfaW5saXRlcmFsKHNvYXAsIHRhZywgJm4pKSIsIHhzaV90eXBlKG4pKTsKKyAgICAgIGVsc2UgaWYgKGlzX1hNTChuKSAmJiBpc193c3RyaW5nKG4pKQorICAgICAgICBmcHJpbnRmKGZvdXQsICJcblx0XHRcdGlmICghc29hcF9pbndsaXRlcmFsKHNvYXAsIHRhZywgJm4pKSIsIHhzaV90eXBlKG4pKTsKKyAgICAgIGVsc2UgaWYgKG4tPnR5cGU9PVRhcnJheSkKKyAgICAgICAgZnByaW50Zihmb3V0LCAiXG5cdFx0XHRpZiAoIXNvYXBfaW5fJXMoc29hcCwgdGFnLCAmbiwgXCIlc1wiKSkiLCBjX2lkZW50KG4pLHhzaV90eXBlKG4pKTsKKyAgICAgIGVsc2UgaWYgKG4tPnR5cGUgIT0gVGZ1biAmJiAhaXNfdm9pZChuKSkKKyAgICAgICAgZnByaW50Zihmb3V0LCAiXG5cdFx0XHRpZiAoIXNvYXBfaW5fJXMoc29hcCwgdGFnLCAmbiwgXCIlc1wiKSkiLCBjX2lkZW50KG4pLHhzaV90eXBlKG4pKTsKKyAgICAgIGZwcmludGYoZm91dCwgIlxuXHRcdFx0XHRicmVhazsiKTsKKyAgICAgIGlmICghc3RyY21wKHR5cC0+aWQtPm5hbWUsICJzdGQ6OnZlY3RvciIpIHx8ICFzdHJjbXAodHlwLT5pZC0+bmFtZSwgInN0ZDo6ZGVxdWUiKSkKKyAgICAgICAgZnByaW50Zihmb3V0LCAiXG5cdFx0fVxuXHRcdGEtPnB1c2hfYmFjayhuKTsiKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZnByaW50Zihmb3V0LCAiXG5cdFx0XHRhLT5pbnNlcnQoYS0+ZW5kKCksIG4pO1xuXHRcdH0iKTsKKyAgICAgIGZwcmludGYoZm91dCwgIlxuXHR9XG5cdHdoaWxlICghc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMSkpOyIpOworICAgICAgZnByaW50Zihmb3V0LCAiXG5cdGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCB8fCBzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRylcblx0e1x0c29hcC0+ZXJyb3IgPSBTT0FQX09LO1xuXHRcdHJldHVybiBhO1xuXHR9XG5cdHJldHVybiBOVUxMO1xufSIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgfQorICBmZmx1c2goZm91dCk7Cit9CisKKwordm9pZAorc29hcF9pbl9EYXJyYXkoVG5vZGUgKnR5cCkKK3sgaW50IGksIGosIGQ7CisgIEVudHJ5ICpwLCAqcTsKKyAgVGFibGUgKnQsICp0YWJsZTsKKyAgY2hhciAqbnNhID0gbnNfcXVhbGlmaWVkQXR0cmlidXRlKHR5cCk7CisKKyAgdGFibGU9KFRhYmxlICopdHlwLT5yZWY7CisgIHEgPSB0YWJsZS0+bGlzdDsKKyAgcCA9IGlzX2R5bmFtaWNfYXJyYXkodHlwKTsKKyAgZCA9IGdldF9EYXJyYXlkaW1zKHR5cCk7CisgIAorICBpZiAoaXNfZXh0ZXJuYWwodHlwKSkKKyAgeyBmcHJpbnRmKGZoZWFkLCJcblNPQVBfRk1BQzEgJXMgU09BUF9GTUFDMiBzb2FwX2luXyVzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosICVzLCBjb25zdCBjaGFyKik7IiwgY190eXBlX2lkKHR5cCwgIioiKSxjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgIioiKSk7CisgICAgcmV0dXJuOworICB9CisgIGZwcmludGYoZmhlYWQsIlxuU09BUF9GTUFDMyAlcyBTT0FQX0ZNQUM0IHNvYXBfaW5fJXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgJXMsIGNvbnN0IGNoYXIqKTsiLCBjX3R5cGVfaWQodHlwLCAiKiIpLGNfaWRlbnQodHlwKSxjX3R5cGVfaWQodHlwLCAiKiIpKTsKKyAgaWYgKHR5cC0+dHlwZSA9PSBUY2xhc3MgJiYgIWlzX3ZvbGF0aWxlKHR5cCkgJiYgIWlzX3R5cGVkZWYodHlwKSkKKyAgeyBmcHJpbnRmKGZvdXQsIlxuXG52b2lkIColczo6c29hcF9pbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0eXBlKSIsIGNfdHlwZSh0eXApKTsKKyAgICBmcHJpbnRmKGZvdXQsIlxue1x0cmV0dXJuIHNvYXBfaW5fJXMoc29hcCwgdGFnLCB0aGlzLCB0eXBlKTtcbn0iLCBjX2lkZW50KHR5cCkpOworICB9CisgIGZmbHVzaChmb3V0KTsKKyAgZnByaW50Zihmb3V0LCJcblxuU09BUF9GTUFDMyAlcyBTT0FQX0ZNQUM0IHNvYXBfaW5fJXMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgJXMsIGNvbnN0IGNoYXIgKnR5cGUpIiwgY190eXBlX2lkKHR5cCwgIioiKSxjX2lkZW50KHR5cCksY190eXBlX2lkKHR5cCwgIiphIikpOworICBpZiAoKGhhc19ucyh0eXApIHx8IGlzX3VudHlwZWQodHlwKSkgJiYgaXNfYmluYXJ5KHR5cCkpCisgICAgZnByaW50Zihmb3V0LCJcbnsiKTsKKyAgZWxzZSBpZiAoZCkKKyAgICBmcHJpbnRmKGZvdXQsIlxue1x0aW50IGksIGosIG47XG5cdCVzOyIsIGNfdHlwZV9pZChwLT5pbmZvLnR5cCwgInAiKSk7CisgIGVsc2UKKyAgICBmcHJpbnRmKGZvdXQsIlxue1x0aW50IGksIGo7XG5cdCVzOyIsIGNfdHlwZV9pZChwLT5pbmZvLnR5cCwgInAiKSk7CisgIGZwcmludGYoZm91dCwiXG5cdGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAxKSlcblx0XHRyZXR1cm4gTlVMTDsiKTsKKyAgaWYgKGhhc19ucyh0eXApIHx8IGlzX3VudHlwZWQodHlwKSkKKyAgICBpZiAoaXNfaGV4QmluYXJ5KHR5cCkpCisgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRpZiAoKnNvYXAtPnR5cGUgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgXCI6aGV4QmluYXJ5XCIpKSIpOworICAgIGVsc2UgaWYgKGlzX2JpbmFyeSh0eXApKQorICAgICAgZnByaW50Zihmb3V0LCJcblx0aWYgKCpzb2FwLT50eXBlICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIFwiOmJhc2U2NEJpbmFyeVwiKSAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCBcIjpiYXNlNjRcIikpIik7CisgICAgZWxzZQorICAgICAgZnByaW50Zihmb3V0LCJcblx0aWYgKCpzb2FwLT50eXBlICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpKSIpOworICBlbHNlCisgICAgZnByaW50Zihmb3V0LCJcblx0aWYgKHNvYXBfbWF0Y2hfYXJyYXkoc29hcCwgdHlwZSkpIik7CisgIGZwcmludGYoZm91dCwiXG5cdHtcdHNvYXAtPmVycm9yID0gU09BUF9UWVBFO1xuXHRcdHJldHVybiBOVUxMO1xuXHR9Iik7CisgIGlmICh0eXAtPnR5cGUgPT0gVGNsYXNzKQorICB7IGZwcmludGYoZm91dCwiXG5cdGEgPSAoJXMpc29hcF9jbGFzc19pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgYSwgJXMsIHNpemVvZiglcyksIHNvYXAtPnR5cGUsIHNvYXAtPmFycmF5VHlwZSk7IixjX3R5cGVfaWQodHlwLCAiKiIpLCBzb2FwX3R5cGUodHlwKSwgY190eXBlKHR5cCkpOyAKKyAgICBmcHJpbnRmKGZvdXQsIlxuXHRpZiAoIWEpXG5cdFx0cmV0dXJuIE5VTEw7Iik7CisgICAgZnByaW50Zihmb3V0LCJcblx0aWYgKHNvYXAtPmFsbG9jZWQpXG5cdFx0YS0+c29hcF9kZWZhdWx0KHNvYXApOyIpOworICAgIGZvciAodCA9IChUYWJsZSopdHlwLT5yZWY7IHQ7IHQgPSB0LT5wcmV2KQorICAgIHsgZm9yIChwID0gdC0+bGlzdDsgcDsgcCA9IHAtPm5leHQpIAorCWlmIChwLT5pbmZvLnN0byAmIFNhdHRyaWJ1dGUpCisgICAgICAgICAgc29hcF9hdHRyX3ZhbHVlKHAsIHB0cl9jYXN0KHR5cCwgImEiKSwgcC0+c3ltLT5uYW1lLCBuc19hZGQocC0+c3ltLT5uYW1lLCBuc2EpKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7IGZwcmludGYoZm91dCwiXG5cdGEgPSAoJXMpc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgYSwgJXMsIHNpemVvZiglcyksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOyIsY190eXBlX2lkKHR5cCwgIioiKSwgc29hcF90eXBlKHR5cCksIGNfdHlwZSh0eXApKTsKKyAgICBmcHJpbnRmKGZvdXQsIlxuXHRpZiAoIWEpXG5cdFx0cmV0dXJuIE5VTEw7Iik7CisgICAgLypmcHJpbnRmKGZvdXQsIlxuXHRpZiAoc29hcC0+YWxsb2NlZCkiKTsqLworICAgIGZwcmludGYoZm91dCwiXG5cdHNvYXBfZGVmYXVsdF8lcyhzb2FwLCBhKTsiLCBjX2lkZW50KHR5cCkpOworICAgIGZvciAodCA9IChUYWJsZSopdHlwLT5yZWY7IHQ7IHQgPSB0LT5wcmV2KQorICAgIHsgZm9yIChwID0gdC0+bGlzdDsgcDsgcCA9IHAtPm5leHQpIAorCWlmIChwLT5pbmZvLnN0byAmIFNhdHRyaWJ1dGUpCisgICAgICAgICAgc29hcF9hdHRyX3ZhbHVlKHAsICJhIiwgcC0+c3ltLT5uYW1lLCBuc19hZGQocC0+c3ltLT5uYW1lLCBuc2EpKTsKKyAgICB9CisgIH0KKyAgZnByaW50Zihmb3V0LCJcblx0aWYgKHNvYXAtPmJvZHkgJiYgISpzb2FwLT5ocmVmKVxuXHR7Iik7CisgIHAgPSBpc19keW5hbWljX2FycmF5KHR5cCk7CisgIGlmICgoaGFzX25zKHR5cCkgfHwgaXNfdW50eXBlZCh0eXApKSAmJiBpc19iaW5hcnkodHlwKSkKKyAgeyBpZiAoaXNfaGV4QmluYXJ5KHR5cCkpCisgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdGEtPl9fcHRyID0gc29hcF9nZXRoZXgoc29hcCwgJmEtPl9fc2l6ZSk7Iik7CisgICAgZWxzZQorICAgIHsgZnByaW50Zihmb3V0LCJcblx0XHRhLT5fX3B0ciA9IHNvYXBfZ2V0YmFzZTY0KHNvYXAsICZhLT5fX3NpemUsIDApOyIpOworICAgICAgaWYgKGlzX2F0dGFjaG1lbnQodHlwKSkKKyAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRpZiAoc29hcF94b3BfZm9yd2FyZChzb2FwLCAmYS0+X19wdHIsICZhLT5fX3NpemUsICZhLT5pZCwgJmEtPnR5cGUsICZhLT5vcHRpb25zKSlcblx0XHRcdHJldHVybiBOVUxMOyIpOworICAgIH0KKyAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdGlmICgoIWEtPl9fcHRyICYmIHNvYXAtPmVycm9yKSB8fCBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpXG5cdFx0XHRyZXR1cm4gTlVMTDsiKTsKKyAgfQorICBlbHNlCisgIHsgaWYgKGQpCisgICAgeyBmcHJpbnRmKGZvdXQsIlxuXHRcdG4gPSBzb2FwX2dldHNpemVzKHNvYXAtPmFycmF5U2l6ZSwgYS0+X19zaXplLCAlZCk7IiwgZCk7CisgICAgICBpZiAoaGFzX29mZnNldCh0eXApKQorICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdG4gLT0gaiA9IHNvYXBfZ2V0b2Zmc2V0cyhzb2FwLT5hcnJheU9mZnNldCwgYS0+X19zaXplLCBhLT5fX29mZnNldCwgJWQpOyIsIGQpOworICAgICAgZWxzZQorICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdG4gLT0gaiA9IHNvYXBfZ2V0b2Zmc2V0cyhzb2FwLT5hcnJheU9mZnNldCwgYS0+X19zaXplLCBOVUxMLCAlZCk7IiwgZCk7CisgICAgICBpZiAocC0+aW5mby5taW5PY2N1cnMgPiAxKQorICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgbiA+PSAwICYmIG4gPCAlbGQpXG5cdFx0e1x0c29hcC0+ZXJyb3IgPSBTT0FQX09DQ1VSUztcblx0XHRcdHJldHVybiBOVUxMO1xuXHRcdH0iLCBwLT5pbmZvLm1pbk9jY3Vycyk7CisgICAgICBpZiAocC0+aW5mby5tYXhPY2N1cnMgPiAxKQorICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgbiA+ICVsZClcblx0XHR7XHRzb2FwLT5lcnJvciA9IFNPQVBfT0NDVVJTO1xuXHRcdFx0cmV0dXJuIE5VTEw7XG5cdFx0fSIsIHAtPmluZm8ubWF4T2NjdXJzKTsKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0aWYgKG4gPj0gMCkiKTsKKyAgICAgIGlmICgoKFRub2RlKilwLT5pbmZvLnR5cC0+cmVmKS0+dHlwZSA9PSBUY2xhc3MpCisgICAgICB7IGZwcmludGYoZm91dCwiXG5cdFx0e1x0YS0+JXMgPSBzb2FwX25ld18lcyhzb2FwLCBuKTsiLCBwLT5zeW0tPm5hbWUsIGNfaWRlbnQocC0+aW5mby50eXAtPnJlZikpOworICAgICAgICBpZiAoIWlzX2V4dGVybmFsKHAtPmluZm8udHlwLT5yZWYpICYmICFpc192b2xhdGlsZShwLT5pbmZvLnR5cC0+cmVmKSAmJiAhaXNfdHlwZWRlZihwLT5pbmZvLnR5cC0+cmVmKSkKKyAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcblx0XHRcdGZvciAoaSA9IDA7IGkgPCBuOyBpKyspXG5cdFx0XHRcdChhLT4lcytpKS0+JXM6OnNvYXBfZGVmYXVsdChzb2FwKTsiLCBwLT5zeW0tPm5hbWUsIGNfdHlwZShwLT5pbmZvLnR5cC0+cmVmKSk7CisgICAgICAgIGVsc2UgaWYgKCgoVG5vZGUqKXAtPmluZm8udHlwLT5yZWYpLT50eXBlID09IFRwb2ludGVyKQorICAgICAgICAgIGZwcmludGYoZm91dCwgIlxuXHRcdFx0Zm9yIChpID0gMDsgaSA8IG47IGkrKylcblx0XHRcdFx0c29hcF9kZWZhdWx0XyVzKHNvYXAsIGEtPiVzK2kpOyIsIGNfaWRlbnQocC0+aW5mby50eXAtPnJlZiksIHAtPnN5bS0+bmFtZSk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChoYXNfY2xhc3MocC0+aW5mby50eXAtPnJlZikpCisgICAgICB7IGZwcmludGYoZm91dCwiXG5cdFx0e1x0YS0+JXMgPSBzb2FwX25ld18lcyhzb2FwLCBuKTsiLCBwLT5zeW0tPm5hbWUsIGNfaWRlbnQocC0+aW5mby50eXAtPnJlZikpOworICAgICAgICBmcHJpbnRmKGZvdXQsICJcblx0XHRcdGZvciAoaSA9IDA7IGkgPCBuOyBpKyspXG5cdFx0XHRcdHNvYXBfZGVmYXVsdF8lcyhzb2FwLCBhLT4lcytpKTsiLCBjX2lkZW50KHAtPmluZm8udHlwLT5yZWYpLCBwLT5zeW0tPm5hbWUpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBmcHJpbnRmKGZvdXQsIlxuXHRcdHtcdGEtPiVzID0gKCVzKXNvYXBfbWFsbG9jKHNvYXAsIG4qc2l6ZW9mKCVzKSk7IiwgcC0+c3ltLT5uYW1lLCBjX3R5cGVfaWQocC0+aW5mby50eXAtPnJlZiwgIioiKSwgIGNfdHlwZShwLT5pbmZvLnR5cC0+cmVmKSk7CisgICAgICAgIGlmICgoKFRub2RlKilwLT5pbmZvLnR5cC0+cmVmKS0+dHlwZSA9PSBUcG9pbnRlcikKKyAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcblx0XHRcdGZvciAoaSA9IDA7IGkgPCBuOyBpKyspXG5cdFx0XHRcdGEtPiVzW2ldID0gTlVMTDsiLCBwLT5zeW0tPm5hbWUpOworCWVsc2UgaWYgKCFpc19YTUwocC0+aW5mby50eXAtPnJlZikpCisgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG5cdFx0XHRmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKVxuXHRcdFx0XHRzb2FwX2RlZmF1bHRfJXMoc29hcCwgYS0+JXMraSk7IiwgY19pZGVudChwLT5pbmZvLnR5cC0+cmVmKSwgcC0+c3ltLT5uYW1lKTsKKyAgICAgIH0KKyAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSIpOworICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdHtcdHNvYXBfcGVla19lbGVtZW50KHNvYXApO1xuXHRcdFx0XHRpZiAoc29hcC0+cG9zaXRpb24gPT0gJWQpIiwgZCk7CisgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHR7XHRpID0gIik7CisJZm9yIChpID0gMDsgaSA8IGQ7IGkrKykKKwl7IGZwcmludGYoZm91dCwic29hcC0+cG9zaXRpb25zWyVkXSIsIGkpOworCSAgZm9yIChqID0gMTsgaiA8IGQtaTsgaisrKQorCSAgICBmcHJpbnRmKGZvdXQsIiphLT5fX3NpemVbJWRdIiwgaik7CisJICBpZiAoaSA8IGQtMSkKKwkgICAgZnByaW50Zihmb3V0LCIrIik7CisJfQorCWZwcmludGYoZm91dCwiLWo7Iik7CisJZnByaW50Zihmb3V0LCJcblx0XHRcdFx0XHRpZiAoaSA8IDAgfHwgaSA+PSBuKVxuXHRcdFx0XHRcdHtcdHNvYXAtPmVycm9yID0gU09BUF9JT0I7XG5cdFx0XHRcdFx0XHRyZXR1cm4gTlVMTDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0iKTsKKyAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0aWYgKCFzb2FwX2luXyVzKHNvYXAsIE5VTEwsIGEtPiVzICsgaSwgXCIlc1wiKSkiLCBjX2lkZW50KHAtPmluZm8udHlwLT5yZWYpLCBwLT5zeW0tPm5hbWUsIHhzaV90eXBlKHAtPmluZm8udHlwLT5yZWYpKTsKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdHtcdGlmIChzb2FwLT5lcnJvciAhPSBTT0FQX05PX1RBRylcblx0XHRcdFx0XHRcdHJldHVybiBOVUxMOyIpOworICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0XHRzb2FwLT5lcnJvciA9IFNPQVBfT0s7Iik7CisgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRcdGJyZWFrOyIpOworICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0fSIpOworICAgIH0KKyAgICBlbHNlCisgICAgeyBmcHJpbnRmKGZvdXQsIlxuXHRcdGEtPl9fc2l6ZSA9IHNvYXBfZ2V0c2l6ZShzb2FwLT5hcnJheVNpemUsIHNvYXAtPmFycmF5T2Zmc2V0LCAmaik7Iik7CisgICAgICBpZiAoaGFzX29mZnNldCh0eXApICYmIChwLT5uZXh0LT5uZXh0LT5pbmZvLnN0byAmIFNjb25zdCkgPT0gMCkKKyAgICAgIHsgZnByaW50Zihmb3V0LCJcblx0XHRhLT5fX29mZnNldCA9IGo7Iik7CisgICAgICB9CisgICAgICBpZiAocC0+aW5mby5taW5PY2N1cnMgPiAxKQorICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgYS0+X19zaXplID49IDAgJiYgYS0+X19zaXplIDwgJWxkKVxuXHRcdHtcdHNvYXAtPmVycm9yID0gU09BUF9PQ0NVUlM7XG5cdFx0XHRyZXR1cm4gTlVMTDtcblx0XHR9IiwgcC0+aW5mby5taW5PY2N1cnMpOworICAgICAgaWYgKHAtPmluZm8ubWF4T2NjdXJzID4gMSkKKyAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIGEtPl9fc2l6ZSA+ICVsZClcblx0XHR7XHRzb2FwLT5lcnJvciA9IFNPQVBfT0NDVVJTO1xuXHRcdFx0cmV0dXJuIE5VTEw7XG5cdFx0fSIsIHAtPmluZm8ubWF4T2NjdXJzKTsKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0aWYgKGEtPl9fc2l6ZSA+PSAwKSIpOworICAgICAgaWYgKCgoVG5vZGUqKXAtPmluZm8udHlwLT5yZWYpLT50eXBlID09IFRjbGFzcykKKyAgICAgIHsgZnByaW50Zihmb3V0LCJcblx0XHR7XHRhLT4lcyA9IHNvYXBfbmV3XyVzKHNvYXAsIGEtPl9fc2l6ZSk7IiwgcC0+c3ltLT5uYW1lLCBjX2lkZW50KHAtPmluZm8udHlwLT5yZWYpKTsKKyAgICAgICAgaWYgKCFpc19leHRlcm5hbChwLT5pbmZvLnR5cC0+cmVmKSAmJiAhaXNfdm9sYXRpbGUocC0+aW5mby50eXAtPnJlZikgJiYgIWlzX3R5cGVkZWYocC0+aW5mby50eXAtPnJlZikpCisgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG5cdFx0XHRmb3IgKGkgPSAwOyBpIDwgYS0+X19zaXplOyBpKyspXG5cdFx0XHRcdChhLT4lcytpKS0+JXM6OnNvYXBfZGVmYXVsdChzb2FwKTsiLCBwLT5zeW0tPm5hbWUsIGNfdHlwZShwLT5pbmZvLnR5cC0+cmVmKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBmcHJpbnRmKGZvdXQsICJcblx0XHRcdGZvciAoaSA9IDA7IGkgPCBhLT5fX3NpemU7IGkrKylcblx0XHRcdFx0c29hcF9kZWZhdWx0XyVzKHNvYXAsIGEtPiVzK2kpOyIsIGNfaWRlbnQocC0+aW5mby50eXAtPnJlZiksIHAtPnN5bS0+bmFtZSk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChoYXNfY2xhc3MocC0+aW5mby50eXAtPnJlZikpCisgICAgICB7IGZwcmludGYoZm91dCwiXG5cdFx0e1x0YS0+JXMgPSBzb2FwX25ld18lcyhzb2FwLCBhLT5fX3NpemUpOyIsIHAtPnN5bS0+bmFtZSwgY19pZGVudChwLT5pbmZvLnR5cC0+cmVmKSk7CisgICAgICAgIGZwcmludGYoZm91dCwgIlxuXHRcdFx0Zm9yIChpID0gMDsgaSA8IGEtPl9fc2l6ZTsgaSsrKVxuXHRcdFx0XHRzb2FwX2RlZmF1bHRfJXMoc29hcCwgYS0+JXMraSk7IiwgY19pZGVudChwLT5pbmZvLnR5cC0+cmVmKSwgcC0+c3ltLT5uYW1lKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgZnByaW50Zihmb3V0LCJcblx0XHR7XHRhLT4lcyA9ICglcylzb2FwX21hbGxvYyhzb2FwLCBzaXplb2YoJXMpICogYS0+X19zaXplKTsiLCBwLT5zeW0tPm5hbWUsIGNfdHlwZV9pZChwLT5pbmZvLnR5cC0+cmVmLCAiKiIpLCAgY190eXBlKHAtPmluZm8udHlwLT5yZWYpKTsKKwlpZiAoKChUbm9kZSopcC0+aW5mby50eXAtPnJlZiktPnR5cGUgPT0gVHBvaW50ZXIpCisgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG5cdFx0XHRmb3IgKGkgPSAwOyBpIDwgYS0+X19zaXplOyBpKyspXG5cdFx0XHRcdGEtPiVzW2ldID0gTlVMTDsiLCBwLT5zeW0tPm5hbWUpOworCWVsc2UgaWYgKCFpc19YTUwocC0+aW5mby50eXAtPnJlZikpCisgICAgICAgICAgZnByaW50Zihmb3V0LCAiXG5cdFx0XHRmb3IgKGkgPSAwOyBpIDwgYS0+X19zaXplOyBpKyspXG5cdFx0XHRcdHNvYXBfZGVmYXVsdF8lcyhzb2FwLCBhLT4lcytpKTsiLCBjX2lkZW50KHAtPmluZm8udHlwLT5yZWYpLCBwLT5zeW0tPm5hbWUpOworICAgICAgfQorICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdGZvciAoaSA9IDA7IGkgPCBhLT5fX3NpemU7IGkrKykiKTsKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHR7XHRzb2FwX3BlZWtfZWxlbWVudChzb2FwKTtcblx0XHRcdFx0aWYgKHNvYXAtPnBvc2l0aW9uKVxuXHRcdFx0XHR7XHRpID0gc29hcC0+cG9zaXRpb25zWzBdLWo7XG5cdFx0XHRcdFx0aWYgKGkgPCAwIHx8IGkgPj0gYS0+X19zaXplKVxuXHRcdFx0XHRcdHtcdHNvYXAtPmVycm9yID0gU09BUF9JT0I7XG5cdFx0XHRcdFx0XHRyZXR1cm4gTlVMTDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0iKTsKKyAgICAgIGlmIChpc19YTUwocC0+aW5mby50eXAtPnJlZikgJiYgaXNfc3RyaW5nKHAtPmluZm8udHlwLT5yZWYpKQorICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRpZiAoIXNvYXBfaW5saXRlcmFsKHNvYXAsIE5VTEwsIGEtPiVzICsgaSkpIiwgcC0+c3ltLT5uYW1lKTsKKyAgICAgIGVsc2UgaWYgKGlzX1hNTChwLT5pbmZvLnR5cC0+cmVmKSAmJiBpc193c3RyaW5nKHAtPmluZm8udHlwLT5yZWYpKQorICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRpZiAoIXNvYXBfaW53bGl0ZXJhbChzb2FwLCBOVUxMLCBhLT4lcyArIGkpKSIsIHAtPnN5bS0+bmFtZSk7CisgICAgICBlbHNlCisgICAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdGlmICghc29hcF9pbl8lcyhzb2FwLCBOVUxMLCBhLT4lcyArIGksIFwiJXNcIikpIiwgY19pZGVudChwLT5pbmZvLnR5cC0+cmVmKSwgcC0+c3ltLT5uYW1lLCB4c2lfdHlwZShwLT5pbmZvLnR5cC0+cmVmKSk7CisgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHR7XHRpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9OT19UQUcpXG5cdFx0XHRcdFx0XHRyZXR1cm4gTlVMTDsiKTsKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdFx0c29hcC0+ZXJyb3IgPSBTT0FQX09LOyIpOworICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0XHRicmVhazsiKTsKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdH0iKTsKKyAgICB9CisgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdH1cblx0XHR9XG5cdFx0ZWxzZSIpOworICAgIGlmICgoKFRub2RlKilwLT5pbmZvLnR5cC0+cmVmKS0+dHlwZSA9PSBUY2xhc3MgfHwgaGFzX2NsYXNzKHAtPmluZm8udHlwLT5yZWYpKQorICAgICAgZnByaW50Zihmb3V0LCJcblx0XHR7XHQlcztcblx0XHRcdHNvYXBfbmV3X2Jsb2NrKHNvYXApOyIsIGNfdHlwZV9pZChwLT5pbmZvLnR5cC0+cmVmLCAicSIpKTsKKyAgICBlbHNlCisgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdHtcdHNvYXBfbmV3X2Jsb2NrKHNvYXApOyIpOworICAgIGlmIChwLT5pbmZvLm1heE9jY3VycyA+IDEpCisgICAgeyBpZiAoZCkKKyAgICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdGZvciAoYS0+X19zaXplWzBdID0gMDsgYS0+X19zaXplWzBdIDw9ICVsZDsgYS0+X19zaXplWzBdKyspIiwgcC0+aW5mby5tYXhPY2N1cnMpOworICAgICAgZWxzZQorICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0Zm9yIChhLT5fX3NpemUgPSAwOyBhLT5fX3NpemUgPD0gJWxkOyBhLT5fX3NpemUrKykiLCBwLT5pbmZvLm1heE9jY3Vycyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IGlmIChkKQorICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0Zm9yIChhLT5fX3NpemVbMF0gPSAwOyA7IGEtPl9fc2l6ZVswXSsrKSIpOworICAgICAgZWxzZQorICAgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0Zm9yIChhLT5fX3NpemUgPSAwOyA7IGEtPl9fc2l6ZSsrKSIpOworICAgIH0KKyAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0e1x0cCA9ICglcylzb2FwX3B1c2hfYmxvY2soc29hcCwgc2l6ZW9mKCVzKSk7XG5cdFx0XHRcdGlmICghcClcblx0XHRcdFx0XHRyZXR1cm4gTlVMTDsiLCBjX3R5cGUocC0+aW5mby50eXApLCBjX3R5cGUocC0+aW5mby50eXAtPnJlZikpOworICAgIGlmICgoKFRub2RlKilwLT5pbmZvLnR5cC0+cmVmKS0+dHlwZSA9PSBUY2xhc3MgfHwgaGFzX2NsYXNzKHAtPmluZm8udHlwLT5yZWYpKQorICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0bWVtY3B5KHAsICZxLCBzaXplb2YoJXMpKTsiLCBjX3R5cGUocC0+aW5mby50eXAtPnJlZikpOworICAgIGlmICgoKFRub2RlKilwLT5pbmZvLnR5cC0+cmVmKS0+dHlwZSA9PSBUY2xhc3MgJiYgIWlzX2V4dGVybmFsKHAtPmluZm8udHlwLT5yZWYpICYmICFpc192b2xhdGlsZShwLT5pbmZvLnR5cC0+cmVmKSAmJiAhaXNfdHlwZWRlZihwLT5pbmZvLnR5cC0+cmVmKSkKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdHAtPnNvYXBfZGVmYXVsdChzb2FwKTsiKTsKKyAgICBlbHNlIGlmICgoKFRub2RlKilwLT5pbmZvLnR5cC0+cmVmKS0+dHlwZSA9PSBUcG9pbnRlcikKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdCpwID0gTlVMTDsiKTsKKyAgICBlbHNlIGlmICghaXNfWE1MKHAtPmluZm8udHlwLT5yZWYpKQorICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0c29hcF9kZWZhdWx0XyVzKHNvYXAsIHApOyIsIGNfaWRlbnQocC0+aW5mby50eXAtPnJlZikpOworICAgIGlmIChpc19YTUwocC0+aW5mby50eXAtPnJlZikgJiYgaXNfc3RyaW5nKHAtPmluZm8udHlwLT5yZWYpKQorICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdFx0aWYgKCFzb2FwX2lubGl0ZXJhbChzb2FwLCBOVUxMLCBwKSkiKTsKKyAgICBlbHNlIGlmIChpc19YTUwocC0+aW5mby50eXAtPnJlZikgJiYgaXNfd3N0cmluZyhwLT5pbmZvLnR5cC0+cmVmKSkKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdGlmICghc29hcF9pbndsaXRlcmFsKHNvYXAsIE5VTEwsIHApKSIpOworICAgIGVsc2UKKyAgICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdGlmICghc29hcF9pbl8lcyhzb2FwLCBOVUxMLCBwLCBcIiVzXCIpKSIsIGNfaWRlbnQocC0+aW5mby50eXAtPnJlZiksIHhzaV90eXBlKHAtPmluZm8udHlwLT5yZWYpKTsKKyAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHR7XHRpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9OT19UQUcpXG5cdFx0XHRcdFx0XHRyZXR1cm4gTlVMTDsiKTsKKyAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRcdHNvYXAtPmVycm9yID0gU09BUF9PSzsiKTsKKyAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0XHRcdGJyZWFrOyIpOworICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRcdH0iKTsKKyAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0fSIpOworICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRzb2FwX3BvcF9ibG9jayhzb2FwKTsiKTsKKyAgICBpZiAocC0+aW5mby5taW5PY2N1cnMgPiAxKQorICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgYS0+X19zaXplIDwgJWxkKVxuXHRcdFx0e1x0c29hcC0+ZXJyb3IgPSBTT0FQX09DQ1VSUztcblx0XHRcdFx0cmV0dXJuIE5VTEw7XG5cdFx0XHR9IiwgcC0+aW5mby5taW5PY2N1cnMpOworICAgIGlmIChwLT5pbmZvLm1heE9jY3VycyA+IDEpCisgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0aWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiBhLT5fX3NpemUgPiAlbGQpXG5cdFx0XHR7XHRzb2FwLT5lcnJvciA9IFNPQVBfT0NDVVJTO1xuXHRcdFx0XHRyZXR1cm4gTlVMTDtcblx0XHRcdH0iLCBwLT5pbmZvLm1heE9jY3Vycyk7CisgICAgaWYgKCgoVG5vZGUqKXAtPmluZm8udHlwLT5yZWYpLT50eXBlID09IFRjbGFzcyB8fCBoYXNfY2xhc3MocC0+aW5mby50eXAtPnJlZikpCisgICAgICBmcHJpbnRmKGZvdXQsIlxuXHRcdFx0aWYgKHNvYXAtPmJsaXN0LT5zaXplKVxuXHRcdFx0XHRhLT4lcyA9IHNvYXBfbmV3XyVzKHNvYXAsIHNvYXAtPmJsaXN0LT5zaXplL3NpemVvZiglcykpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRhLT4lcyA9IE5VTEw7IiwgcC0+c3ltLT5uYW1lLCBjX2lkZW50KHAtPmluZm8udHlwLT5yZWYpLCBjX3R5cGUocC0+aW5mby50eXAtPnJlZiksIHAtPnN5bS0+bmFtZSk7CisgICAgZWxzZQorICAgICAgZnByaW50Zihmb3V0LCJcblx0XHRcdGEtPiVzID0gKCVzKXNvYXBfbWFsbG9jKHNvYXAsIHNvYXAtPmJsaXN0LT5zaXplKTsiLCBwLT5zeW0tPm5hbWUsIGNfdHlwZShwLT5pbmZvLnR5cCkpOworICAgIGZwcmludGYoZm91dCwiXG5cdFx0XHRzb2FwX3NhdmVfYmxvY2soc29hcCwgKGNoYXIqKWEtPiVzLCAxKTsiLCBwLT5zeW0tPm5hbWUpOworICAgIGZwcmludGYoZm91dCwiXG5cdFx0fSIpOworICAgIGZwcmludGYoZm91dCwiXG5cdFx0aWYgKHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSlcblx0XHRcdHJldHVybiBOVUxMOyIpOworICB9CisgIGlmIChoYXNfZ2V0dGVyKHR5cCkpCisgICAgZnByaW50Zihmb3V0LCJcblx0XHRpZiAoYS0+Z2V0KHNvYXApKVxuXHRcdFx0cmV0dXJuIE5VTEw7Iik7CisgIGZwcmludGYoZm91dCwiXG5cdH1cblx0ZWxzZVxuXHR7XHQiKTsKKyAgaWYgKGlzX2F0dGFjaG1lbnQodHlwKSkKKyAgICBmcHJpbnRmKGZvdXQsImlmICgqc29hcC0+aHJlZiAhPSAnIycpXG5cdFx0e1x0aWYgKHNvYXBfZGltZV9mb3J3YXJkKHNvYXAsICZhLT5fX3B0ciwgJmEtPl9fc2l6ZSwgJmEtPmlkLCAmYS0+dHlwZSwgJmEtPm9wdGlvbnMpKVxuXHRcdFx0XHRyZXR1cm4gTlVMTDtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdFx0Iik7CisgIGlmICh0eXAtPnR5cGUgPT0gVGNsYXNzKQorICAgIGZwcmludGYoZm91dCwiYSA9ICglcylzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgKHZvaWQqKilhLCAwLCAlcywgMCwgc2l6ZW9mKCVzKSwgMCwgc29hcF9jb3B5XyVzKTsiLCBjX3R5cGVfaWQodHlwLCAiKiIpLCBzb2FwX3R5cGUodHlwKSwgY190eXBlKHR5cCksIGNfaWRlbnQodHlwKSk7CisgIGVsc2UKKyAgICBmcHJpbnRmKGZvdXQsImEgPSAoJXMpc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopYSwgMCwgJXMsIDAsIHNpemVvZiglcyksIDAsIE5VTEwpOyIsIGNfdHlwZV9pZCh0eXAsICIqIiksIHNvYXBfdHlwZSh0eXApLCBjX3R5cGUodHlwKSk7CisgIGZwcmludGYoZm91dCwiXG5cdFx0aWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKVxuXHRcdFx0cmV0dXJuIE5VTEw7Iik7CisgIGZwcmludGYoZm91dCwiXG5cdH0iKTsKKyAgZnByaW50Zihmb3V0LCJcblx0cmV0dXJuIGE7XG59Iik7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZHNvYXAyLmMgYi9zdGRzb2FwMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZWQ0NjAKLS0tIC9kZXYvbnVsbAorKysgYi9zdGRzb2FwMi5jCkBAIC0wLDAgKzEsMTM0NDggQEAKKy8qCisKK3N0ZHNvYXAyLmNbcHBdIDIuNy42ZQorCitnU09BUCBydW50aW1lCisKK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgcGFydCBvZiB0aGUgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXM6CitHUEwsIHRoZSBnU09BUCBwdWJsaWMgbGljZW5zZSwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NvbnRyaWJ1dG9yczoKKworV2luZCBSaXZlciBTeXN0ZW1zIEluYy4sIGZvciB0aGUgZm9sbG93aW5nIGFkZGl0aW9ucyB1bmRlciBnU09BUCBwdWJsaWMgbGljZW5zZToKKyAgLSB2eFdvcmtzIGNvbXBhdGlibGUJKCNkZWZpbmUgVlhXT1JLUykKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBwdWJsaWMgbGljZW5zZS4KKworVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZ1NPQVAgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjMKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcGxpY2Vuc2UuaHRtbAorU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywKK1dJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZQorZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFJvYmVydCBBLiB2YW4gRW5nZWxlbi4KK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0luc3RhbGxhdGlvbiBub3RlOgorCitXaW4zMiBidWlsZCBuZWVkcyB3aW5zb2NrLmRsbCAoVmlzdWFsIEMrKyAid3NvY2szMi5saWIiKQorVG8gZG8gdGhpcyBpbiBWaXN1YWwgQysrIDYuMCwgZ28gdG8gIlByb2plY3QiLCAic2V0dGluZ3MiLCBzZWxlY3QgdGhlICJMaW5rIgordGFiICh0aGUgcHJvamVjdCBmaWxlIG5lZWRzIHRvIGJlIHNlbGVjdGVkIGluIHRoZSBmaWxlIHZpZXcpIGFuZCBhZGQKKyJ3c29jazMyLmxpYiIgdG8gdGhlICJPYmplY3QvbGlicmFyeSBtb2R1bGVzIiBlbnRyeQorCitPbiBNYWMgT1MgWCB3aXRoIGdjYyAoR0NDKSAzLjEgMjAwMjA0MjAgKHByZXJlbGVhc2UpIHlvdSBNVVNUIGNvbXBpbGUgd2l0aAorLWZzdGFja19jaGVjayB3aGVuIHVzaW5nIC1PMiBiZWNhdXNlIGdjYyAzLjEgaGFzIGEgYnVnIHRoYXQgc21hc2hlcyB0aGUgc3RhY2sKK3doZW4gbG9jYWxseSBhbGxvY2F0ZWQgZGF0YSBleGNlZWRzIDY0Sy4KKworKi8KKworI2lmZGVmIEFTNDAwCisjIHByYWdtYSBjb252ZXJ0KDgxOSkJLyogRUJDRElDIHRvIEFTQ0lJICovCisjZW5kaWYKKworI2luY2x1ZGUgInN0ZHNvYXAyLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworU09BUF9TT1VSQ0VfU1RBTVAoIkAoIykgc3Rkc29hcDIuY3BwIHZlciAyLjcuNmUgMjAwNi0wMi0xOCAxMjowMDowMCBHTVQiKQorZXh0ZXJuICJDIiB7CisjZWxzZQorU09BUF9TT1VSQ0VfU1RBTVAoIkAoIykgc3Rkc29hcDIuYyB2ZXIgMi43LjZlIDIwMDYtMDItMTggMTI6MDA6MDAgR01UIikKKyNlbmRpZgorCisvKiA4Yml0IGNoYXJhY3RlciByZXByZXNlbnRpbmcgdW5rbm93bi9ub25yZXByZXNlbnRhYmxlIGNoYXJhY3RlciBkYXRhIChlLmcuIG5vdCBzdXBwb3J0ZWQgYnkgY3VycmVudCBsb2NhbGUgd2l0aCBtdWx0aWJ5dGUgc3VwcG9ydCBlbmFibGVkKSAqLworI2lmbmRlZiBTT0FQX1VOS05PV05fQ0hBUgorI2RlZmluZSBTT0FQX1VOS05PV05fQ0hBUiAoMTI3KQorI2VuZGlmCisKKy8qICAgICAgRU9GPS0xICovCisjZGVmaW5lIFNPQVBfTFQgKHNvYXBfd2NoYXIpKC0yKSAvKiBYTUwgY2hhcmFjdGVyICc8JyAqLworI2RlZmluZSBTT0FQX1RUIChzb2FwX3djaGFyKSgtMykgLyogWE1MIGNoYXJhY3RlciAnPC8nICovCisjZGVmaW5lIFNPQVBfR1QgKHNvYXBfd2NoYXIpKC00KSAvKiBYTUwgY2hhcmFjdGVyICc+JyAqLworI2RlZmluZSBTT0FQX1FUIChzb2FwX3djaGFyKSgtNSkgLyogWE1MIGNoYXJhY3RlciAnIicgKi8KKyNkZWZpbmUgU09BUF9BUCAoc29hcF93Y2hhcikoLTYpIC8qIFhNTCBjaGFyYWN0ZXIgJycnICovCisKKyNkZWZpbmUgc29hcF9ibGFuayhjKQkJKChjKSA+PSAwICYmIChjKSA8PSAzMikKKyNkZWZpbmUgc29hcF9ub3RibGFuayhjKQkoKGMpID4gMzIpCisjZGVmaW5lIHNvYXBfaGFzaF9wdHIocCkJKCgodW5zaWduZWQgbG9uZykocCkgPj4gMykgJiAoU09BUF9QVFJIQVNIIC0gMSkpCisKKyNpZmRlZiBTT0FQX0RFQlVHCitzdGF0aWMgdm9pZCBzb2FwX2luaXRfbG9ncyhzdHJ1Y3Qgc29hcCopOworc3RhdGljIHZvaWQgc29hcF9jbG9zZV9sb2dmaWxlKHN0cnVjdCBzb2FwKiwgaW50KTsKK3N0YXRpYyB2b2lkIHNvYXBfc2V0X2xvZ2ZpbGUoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyB2b2lkIHNvYXBfZnJlZV9taHQoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyB2b2lkIHNvYXBfdHJhY2tfdW5saW5rKHN0cnVjdCBzb2FwKiwgY29uc3Qgdm9pZCopOworI2VuZGlmCisKKyNpZm5kZWYgUEFMTV8yCitzdGF0aWMgaW50IHNvYXBfc2V0X2Vycm9yKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGludCk7CitzdGF0aWMgaW50IHNvYXBfY29weV9mYXVsdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyBpbnQgc29hcF9nZXRhdHRydmFsKHN0cnVjdCBzb2FwKiwgY2hhciosIHNpemVfdCwgc29hcF93Y2hhcik7CisjZW5kaWYKKworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzb2FwX3djaGFyIHNvYXBfY2hhcihzdHJ1Y3Qgc29hcCopOworc3RhdGljIHNvYXBfd2NoYXIgc29hcF9nZXRfcGkoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBpbnQgc29hcF9pc3hkaWdpdChpbnQpOworc3RhdGljIHZvaWQgKmZwbHVnaW4oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKik7CisjaWZuZGVmIFdJVEhfTk9JRFJFRgorc3RhdGljIHZvaWQgc29hcF91cGRhdGVfcHRycyhzdHJ1Y3Qgc29hcCosIGNoYXIqLCBjaGFyKiwgY2hhciosIGNoYXIqKTsKK3N0YXRpYyBpbnQgc29hcF9oYXNfY29waWVzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyB2b2lkIHNvYXBfaW5pdF9paHQoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyB2b2lkIHNvYXBfZnJlZV9paHQoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyB2b2lkIHNvYXBfaW5pdF9waHQoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyB2b2lkIHNvYXBfZnJlZV9waHQoc3RydWN0IHNvYXAqKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgY29uc3QgY2hhciAqc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitzdGF0aWMgaW50IHNvYXBfaXNudW1lcmljKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworc3RhdGljIHRpbWVfdCBzb2FwX3RpbWVnbShzdHJ1Y3QgdG0qKTsKK3N0YXRpYyBzdHJ1Y3Qgc29hcF9ubGlzdCAqc29hcF9sb29rdXBfbnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc2l6ZV90IG4pOworc3RhdGljIHN0cnVjdCBzb2FwX25saXN0ICpzb2FwX3B1c2hfbnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICpucywgc2hvcnQgdXRpbGl6ZWQpOworc3RhdGljIHZvaWQgc29hcF9wb3BfbnMoc3RydWN0IHNvYXAgKnNvYXApOworc3RhdGljIHZvaWQgc29hcF91dGlsaXplX25zKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHNpemVfdCBuKTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHN0cnVjdCBzb2FwX211bHRpcGFydCAqc29hcF9uZXdfbXVsdGlwYXJ0KHN0cnVjdCBzb2FwKiwgc3RydWN0IHNvYXBfbXVsdGlwYXJ0KiosIHN0cnVjdCBzb2FwX211bHRpcGFydCoqLCBjaGFyKiwgc2l6ZV90KTsKK3N0YXRpYyBpbnQgc29hcF9wdXRkaW1lZmllbGQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc2l6ZV90KTsKK3N0YXRpYyBjaGFyICpzb2FwX2dldGRpbWVmaWVsZChzdHJ1Y3Qgc29hcCosIHNpemVfdCk7CitzdGF0aWMgdm9pZCBzb2FwX3NlbGVjdF9taW1lX2JvdW5kYXJ5KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgaW50IHNvYXBfdmFsaWRfbWltZV9ib3VuZGFyeShzdHJ1Y3Qgc29hcCopOworc3RhdGljIGludCBzb2FwX21hdGNoX2NpZChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitzdGF0aWMgdm9pZCBzb2FwX3Jlc29sdmVfYXR0YWNobWVudChzdHJ1Y3Qgc29hcCosIHN0cnVjdCBzb2FwX211bHRpcGFydCopOworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFdJVEhfR1pJUAorc3RhdGljIGludCBzb2FwX2dldGd6aXBoZHIoc3RydWN0IHNvYXAqKTsKKyNlbmRpZgorCisjaWZkZWYgV0lUSF9PUEVOU1NMCitzdGF0aWMgaW50IHNzbF9pbml0X2RvbmUgPSAwOworc3RhdGljIGludCBzc2xfYXV0aF9pbml0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgaW50IHNzbF92ZXJpZnlfY2FsbGJhY2soaW50LCBYNTA5X1NUT1JFX0NUWCopOworc3RhdGljIGludCBzc2xfcGFzc3dvcmQoY2hhciosIGludCwgaW50LCB2b2lkICopOworc3RhdGljIGNvbnN0IGNoYXIgKnNzbF9lcnJvcihzdHJ1Y3Qgc29hcCosIGludCk7CisvKiBUaGlzIGNhbGxiYWNrIGlzIGluY2x1ZGVkIGZvciBmdXR1cmUgcmVmZXJlbmNlcy4gSXQgc2hvdWxkIG5vdCBiZSBkZWxldGVkCitzdGF0aWMgREggKnNzbF90bXBfZGgoU1NMKiwgaW50LCBpbnQpOworKi8KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoV0lUSF9OT0hUVFApIHx8ICFkZWZpbmVkKFdJVEhfTEVBTkVSKQorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBjb25zdCBjaGFyICpzb2FwX2RlY29kZShjaGFyKiwgc2l6ZV90LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzb2FwX3djaGFyIHNvYXBfZ2V0Y2h1bmtjaGFyKHN0cnVjdCBzb2FwKik7CitzdGF0aWMgY29uc3QgY2hhciAqaHR0cF9lcnJvcihzdHJ1Y3Qgc29hcCosIGludCk7CitzdGF0aWMgaW50IGh0dHBfcG9zdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCk7CitzdGF0aWMgaW50IGh0dHBfZ2V0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgaW50IGh0dHBfc2VuZF9oZWFkZXIoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKik7CitzdGF0aWMgaW50IGh0dHBfcG9zdF9oZWFkZXIoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworc3RhdGljIGludCBodHRwX3Jlc3BvbnNlKHN0cnVjdCBzb2FwKiwgaW50LCBzaXplX3QpOworc3RhdGljIGludCBodHRwX3BhcnNlKHN0cnVjdCBzb2FwKik7CitzdGF0aWMgaW50IGh0dHBfcGFyc2VfaGVhZGVyKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludCBmc2VuZChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworc3RhdGljIHNpemVfdCBmcmVjdihzdHJ1Y3Qgc29hcCosIGNoYXIqLCBzaXplX3QpOworc3RhdGljIGludCB0Y3BfaW5pdChzdHJ1Y3Qgc29hcCopOworc3RhdGljIGNvbnN0IGNoYXIgKnRjcF9lcnJvcihzdHJ1Y3Qgc29hcCopOworI2lmbmRlZiBXSVRIX0lQVjYKK3N0YXRpYyBpbnQgdGNwX2dldGhvc3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICphZGRyLCBzdHJ1Y3QgaW5fYWRkciAqaW5hZGRyKTsKKyNlbmRpZgorc3RhdGljIGludCB0Y3BfY29ubmVjdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjb25zdCBjaGFyICpob3N0LCBpbnQgcG9ydCk7CitzdGF0aWMgaW50IHRjcF9hY2NlcHQoc3RydWN0IHNvYXAqLCBpbnQsIHN0cnVjdCBzb2NrYWRkciosIGludCopOworc3RhdGljIGludCB0Y3BfZGlzY29ubmVjdChzdHJ1Y3Qgc29hcCopOworc3RhdGljIGludCB0Y3BfY2xvc2Vzb2NrZXQoc3RydWN0IHNvYXAqLCBTT0FQX1NPQ0tFVCk7CitzdGF0aWMgaW50IHRjcF9zaHV0ZG93bnNvY2tldChzdHJ1Y3Qgc29hcCosIFNPQVBfU09DS0VULCBpbnQpOworc3RhdGljIGNvbnN0IGNoYXIgKnNvYXBfc3RyZXJyb3Ioc3RydWN0IHNvYXAqKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBBTE0pICYmICFkZWZpbmVkKFBBTE1fMikKK3Vuc2lnbmVkIHNob3J0IGVycm5vOworI2VuZGlmCisKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY29uc3QgY2hhciBzb2FwX2VudjFbNDJdID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIjsKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfZW5jMVs0Ml0gPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iOworc3RhdGljIGNvbnN0IGNoYXIgc29hcF9lbnYyWzQwXSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiOworc3RhdGljIGNvbnN0IGNoYXIgc29hcF9lbmMyWzQwXSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW5jb2RpbmciOworc3RhdGljIGNvbnN0IGNoYXIgc29hcF9ycGNbMzVdID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1ycGMiOworI2VuZGlmCisKKyNpZm5kZWYgUEFMTV8xCitjb25zdCBzdHJ1Y3Qgc29hcF9kb3VibGVfbmFuIHNvYXBfZG91YmxlX25hbiA9IHsweEZGRkZGRkZGLCAweEZGRkZGRkZGfTsKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfYmFzZTY0b1s2NV0gPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CitzdGF0aWMgY29uc3QgY2hhciBzb2FwX2Jhc2U2NGlbODFdID0gIlw3NlhYWFw3N1w2NFw2NVw2Nlw2N1w3MFw3MVw3Mlw3M1w3NFw3NVhYWFhYWFhcMDBcMDFcMDJcMDNcMDRcMDVcMDZcMDdcMTBcMTFcMTJcMTNcMTRcMTVcMTZcMTdcMjBcMjFcMjJcMjNcMjRcMjVcMjZcMjdcMzBcMzFYWFhYWFhcMzJcMzNcMzRcMzVcMzZcMzdcNDBcNDFcNDJcNDNcNDRcNDVcNDZcNDdcNTBcNTFcNTJcNTNcNTRcNTVcNTZcNTdcNjBcNjFcNjJcNjMiOworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgY29uc3QgY2hhciBzb2FwX2luZGVudFsxMV0gPSAiXG5cdFx0XHRcdFx0XHRcdFx0XHQiOworLyogQWx0ZXJuYXRpdmUgaW5kZW50YXRpb24gZm9ybSBmb3IgU09BUF9YTUxfSU5ERU5UOgorc3RhdGljIGNvbnN0IGNoYXIgc29hcF9pbmRlbnRbMjFdID0gIlxuICAgICAgICAgICAgICAgICAgICI7CisqLworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfcGFkZGluZ1s0XSA9ICJcMFwwXDAiOworI2RlZmluZSBTT0FQX1NUUl9QQURESU5HIChzb2FwX3BhZGRpbmcpCisjZGVmaW5lIFNPQVBfU1RSX0VPUyAoc29hcF9wYWRkaW5nKQorI2RlZmluZSBTT0FQX05PTl9OVUxMIChzb2FwX3BhZGRpbmcpCisKKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgaHRtbF9lbnRpdHlfY29kZXNbXSA9IC8qIGVudGl0aWVzIGZvciBYSFRNTCBwYXJzaW5nICovCit7IHsgMTYwLCAibmJzcCIgfSwKKyAgeyAxNjEsICJpZXhjbCIgfSwKKyAgeyAxNjIsICJjZW50IiB9LAorICB7IDE2MywgInBvdW5kIiB9LAorICB7IDE2NCwgImN1cnJlbiIgfSwKKyAgeyAxNjUsICJ5ZW4iIH0sCisgIHsgMTY2LCAiYnJ2YmFyIiB9LAorICB7IDE2NywgInNlY3QiIH0sCisgIHsgMTY4LCAidW1sIiB9LAorICB7IDE2OSwgImNvcHkiIH0sCisgIHsgMTcwLCAib3JkZiIgfSwKKyAgeyAxNzEsICJsYXF1byIgfSwKKyAgeyAxNzIsICJub3QiIH0sCisgIHsgMTczLCAic2h5IiB9LAorICB7IDE3NCwgInJlZyIgfSwKKyAgeyAxNzUsICJtYWNyIiB9LAorICB7IDE3NiwgImRlZyIgfSwKKyAgeyAxNzcsICJwbHVzbW4iIH0sCisgIHsgMTc4LCAic3VwMiIgfSwKKyAgeyAxNzksICJzdXAzIiB9LAorICB7IDE4MCwgImFjdXRlIiB9LAorICB7IDE4MSwgIm1pY3JvIiB9LAorICB7IDE4MiwgInBhcmEiIH0sCisgIHsgMTgzLCAibWlkZG90IiB9LAorICB7IDE4NCwgImNlZGlsIiB9LAorICB7IDE4NSwgInN1cDEiIH0sCisgIHsgMTg2LCAib3JkbSIgfSwKKyAgeyAxODcsICJyYXF1byIgfSwKKyAgeyAxODgsICJmcmFjMTQiIH0sCisgIHsgMTg5LCAiZnJhYzEyIiB9LAorICB7IDE5MCwgImZyYWMzNCIgfSwKKyAgeyAxOTEsICJpcXVlc3QiIH0sCisgIHsgMTkyLCAiQWdyYXZlIiB9LAorICB7IDE5MywgIkFhY3V0ZSIgfSwKKyAgeyAxOTQsICJBY2lyYyIgfSwKKyAgeyAxOTUsICJBdGlsZGUiIH0sCisgIHsgMTk2LCAiQXVtbCIgfSwKKyAgeyAxOTcsICJBcmluZyIgfSwKKyAgeyAxOTgsICJBRWxpZyIgfSwKKyAgeyAxOTksICJDY2VkaWwiIH0sCisgIHsgMjAwLCAiRWdyYXZlIiB9LAorICB7IDIwMSwgIkVhY3V0ZSIgfSwKKyAgeyAyMDIsICJFY2lyYyIgfSwKKyAgeyAyMDMsICJFdW1sIiB9LAorICB7IDIwNCwgIklncmF2ZSIgfSwKKyAgeyAyMDUsICJJYWN1dGUiIH0sCisgIHsgMjA2LCAiSWNpcmMiIH0sCisgIHsgMjA3LCAiSXVtbCIgfSwKKyAgeyAyMDgsICJFVEgiIH0sCisgIHsgMjA5LCAiTnRpbGRlIiB9LAorICB7IDIxMCwgIk9ncmF2ZSIgfSwKKyAgeyAyMTEsICJPYWN1dGUiIH0sCisgIHsgMjEyLCAiT2NpcmMiIH0sCisgIHsgMjEzLCAiT3RpbGRlIiB9LAorICB7IDIxNCwgIk91bWwiIH0sCisgIHsgMjE1LCAidGltZXMiIH0sCisgIHsgMjE2LCAiT3NsYXNoIiB9LAorICB7IDIxNywgIlVncmF2ZSIgfSwKKyAgeyAyMTgsICJVYWN1dGUiIH0sCisgIHsgMjE5LCAiVWNpcmMiIH0sCisgIHsgMjIwLCAiVXVtbCIgfSwKKyAgeyAyMjEsICJZYWN1dGUiIH0sCisgIHsgMjIyLCAiVEhPUk4iIH0sCisgIHsgMjIzLCAic3psaWciIH0sCisgIHsgMjI0LCAiYWdyYXZlIiB9LAorICB7IDIyNSwgImFhY3V0ZSIgfSwKKyAgeyAyMjYsICJhY2lyYyIgfSwKKyAgeyAyMjcsICJhdGlsZGUiIH0sCisgIHsgMjI4LCAiYXVtbCIgfSwKKyAgeyAyMjksICJhcmluZyIgfSwKKyAgeyAyMzAsICJhZWxpZyIgfSwKKyAgeyAyMzEsICJjY2VkaWwiIH0sCisgIHsgMjMyLCAiZWdyYXZlIiB9LAorICB7IDIzMywgImVhY3V0ZSIgfSwKKyAgeyAyMzQsICJlY2lyYyIgfSwKKyAgeyAyMzUsICJldW1sIiB9LAorICB7IDIzNiwgImlncmF2ZSIgfSwKKyAgeyAyMzcsICJpYWN1dGUiIH0sCisgIHsgMjM4LCAiaWNpcmMiIH0sCisgIHsgMjM5LCAiaXVtbCIgfSwKKyAgeyAyNDAsICJldGgiIH0sCisgIHsgMjQxLCAibnRpbGRlIiB9LAorICB7IDI0MiwgIm9ncmF2ZSIgfSwKKyAgeyAyNDMsICJvYWN1dGUiIH0sCisgIHsgMjQ0LCAib2NpcmMiIH0sCisgIHsgMjQ1LCAib3RpbGRlIiB9LAorICB7IDI0NiwgIm91bWwiIH0sCisgIHsgMjQ3LCAiZGl2aWRlIiB9LAorICB7IDI0OCwgIm9zbGFzaCIgfSwKKyAgeyAyNDksICJ1Z3JhdmUiIH0sCisgIHsgMjUwLCAidWFjdXRlIiB9LAorICB7IDI1MSwgInVjaXJjIiB9LAorICB7IDI1MiwgInV1bWwiIH0sCisgIHsgMjUzLCAieWFjdXRlIiB9LAorICB7IDI1NCwgInRob3JuIiB9LAorICB7IDI1NSwgInl1bWwiIH0sCisgIHsgICAwLCBOVUxMIH0KK307CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgaF9lcnJvcl9jb2Rlc1tdID0KK3sKKyNpZmRlZiBIT1NUX05PVF9GT1VORCAgIAorICB7IEhPU1RfTk9UX0ZPVU5ELCAiSG9zdCBub3QgZm91bmQiIH0sCisjZW5kaWYKKyNpZmRlZiBUUllfQUdBSU4KKyAgeyBUUllfQUdBSU4sICJUcnkgQWdhaW4iIH0sCisjZW5kaWYKKyNpZmRlZiBOT19SRUNPVkVSWSAgCisgIHsgTk9fUkVDT1ZFUlksICJObyBSZWNvdmVyeSIgfSwKKyNlbmRpZgorI2lmZGVmIE5PX0RBVEEKKyAgeyBOT19EQVRBLCAiTm8gRGF0YSIgfSwKKyNlbmRpZgorI2lmZGVmIE5PX0FERFJFU1MKKyAgeyBOT19BRERSRVNTLCAiTm8gQWRkcmVzcyIgfSwKKyNlbmRpZgorICB7IDAsIE5VTEwgfQorfTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgaF9odHRwX2Vycm9yX2NvZGVzW10gPQoreyB7IDIwMSwgIkNyZWF0ZWQiIH0sCisgIHsgMjAyLCAiQWNjZXB0ZWQiIH0sCisgIHsgMjAzLCAiTm9uLUF1dGhvcml0YXRpdmUgSW5mb3JtYXRpb24iIH0sCisgIHsgMjA0LCAiTm8gQ29udGVudCIgfSwKKyAgeyAyMDUsICJSZXNldCBDb250ZW50IiB9LAorICB7IDIwNiwgIlBhcnRpYWwgQ29udGVudCIgfSwKKyAgeyAzMDAsICJNdWx0aXBsZSBDaG9pY2VzIiB9LAorICB7IDMwMSwgIk1vdmVkIFBlcm1hbmVudGx5IiB9LAorICB7IDMwMiwgIkZvdW5kIiB9LAorICB7IDMwMywgIlNlZSBPdGhlciIgfSwKKyAgeyAzMDQsICJOb3QgTW9kaWZpZWQiIH0sCisgIHsgMzA1LCAiVXNlIFByb3h5IiB9LAorICB7IDMwNywgIlRlbXBvcmFyeSBSZWRpcmVjdCIgfSwKKyAgeyA0MDAsICJCYWQgUmVxdWVzdCIgfSwKKyAgeyA0MDEsICJVbmF1dGhvcml6ZWQiIH0sCisgIHsgNDAyLCAiUGF5bWVudCBSZXF1aXJlZCIgfSwKKyAgeyA0MDMsICJGb3JiaWRkZW4iIH0sCisgIHsgNDA0LCAiTm90IEZvdW5kIiB9LAorICB7IDQwNSwgIk1ldGhvZCBOb3QgQWxsb3dlZCIgfSwKKyAgeyA0MDYsICJOb3QgQWNjZXB0YWJsZSIgfSwKKyAgeyA0MDcsICJQcm94eSBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZCIgfSwKKyAgeyA0MDgsICJSZXF1ZXN0IFRpbWUtb3V0IiB9LAorICB7IDQwOSwgIkNvbmZsaWN0IiB9LAorICB7IDQxMCwgIkdvbmUiIH0sCisgIHsgNDExLCAiTGVuZ3RoIFJlcXVpcmVkIiB9LAorICB7IDQxMiwgIlByZWNvbmRpdGlvbiBGYWlsZWQiIH0sCisgIHsgNDEzLCAiUmVxdWVzdCBFbnRpdHkgVG9vIExhcmdlIiB9LAorICB7IDQxNCwgIlJlcXVlc3QtVVJJIFRvbyBMYXJnZSIgfSwKKyAgeyA0MTUsICJVbnN1cHBvcnRlZCBNZWRpYSBUeXBlIiB9LAorICB7IDQxNiwgIlJlcXVlc3RlZCByYW5nZSBub3Qgc2F0aXNmaWFibGUiIH0sCisgIHsgNDE3LCAiRXhwZWN0YXRpb24gRmFpbGVkIiB9LAorICB7IDUwMCwgIkludGVybmFsIFNlcnZlciBFcnJvciIgfSwKKyAgeyA1MDEsICJOb3QgSW1wbGVtZW50ZWQiIH0sCisgIHsgNTAyLCAiQmFkIEdhdGV3YXkiIH0sCisgIHsgNTAzLCAiU2VydmljZSBVbmF2YWlsYWJsZSIgfSwKKyAgeyA1MDQsICJHYXRld2F5IFRpbWUtb3V0IiB9LAorICB7IDUwNSwgIkhUVFAgVmVyc2lvbiBub3Qgc3VwcG9ydGVkIiB9LAorICB7ICAgMCwgTlVMTCB9Cit9OworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFdJVEhfT1BFTlNTTAorc3RhdGljIGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwIGhfc3NsX2Vycm9yX2NvZGVzW10gPQoreworI2RlZmluZSBfU1NMX0VSUk9SKGUpIHsgZSwgI2UgfQorICBfU1NMX0VSUk9SKFNTTF9FUlJPUl9TU0wpLAorICBfU1NMX0VSUk9SKFNTTF9FUlJPUl9aRVJPX1JFVFVSTiksCisgIF9TU0xfRVJST1IoU1NMX0VSUk9SX1dBTlRfUkVBRCksCisgIF9TU0xfRVJST1IoU1NMX0VSUk9SX1dBTlRfV1JJVEUpLAorICBfU1NMX0VSUk9SKFNTTF9FUlJPUl9XQU5UX0NPTk5FQ1QpLAorICBfU1NMX0VSUk9SKFNTTF9FUlJPUl9XQU5UX1g1MDlfTE9PS1VQKSwKKyAgX1NTTF9FUlJPUihTU0xfRVJST1JfU1lTQ0FMTCksCisgIHsgMCwgTlVMTCB9Cit9OworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCBtaW1lX2NvZGVzW10gPQoreyB7IFNPQVBfTUlNRV83QklULAkJIjdiaXQiIH0sCisgIHsgU09BUF9NSU1FXzhCSVQsCQkiOGJpdCIgfSwKKyAgeyBTT0FQX01JTUVfQklOQVJZLAkJImJpbmFyeSIgfSwKKyAgeyBTT0FQX01JTUVfUVVPVEVEX1BSSU5UQUJMRSwgInF1b3RlZC1wcmludGFibGUiIH0sCisgIHsgU09BUF9NSU1FX0JBU0U2NCwJCSJiYXNlNjQiIH0sCisgIHsgU09BUF9NSU1FX0lFVEZfVE9LRU4sCSJpZXRmLXRva2VuIiB9LAorICB7IFNPQVBfTUlNRV9YX1RPS0VOLAkJIngtdG9rZW4iIH0sCisgIHsgMCwJCQkJTlVMTCB9Cit9OworI2VuZGlmCisKKyNpZmRlZiBXSU4zMgorc3RhdGljIGludCB0Y3BfZG9uZSA9IDA7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorZnNlbmQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBuKQoreyByZWdpc3RlciBpbnQgbndyaXR0ZW47CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgIWRlZmluZWQoV0lUSF9MRUFOKQorICBpZiAoc29hcC0+b3MpCisgIHsgc29hcC0+b3MtPndyaXRlKHMsIG4pOworICAgIGlmIChzb2FwLT5vcy0+Z29vZCgpKQorICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgcmV0dXJuIFNPQVBfRU9GOworICB9CisjZW5kaWYKKyAgd2hpbGUgKG4pCisgIHsgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgICAgeyAKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICBpZiAoc29hcC0+c2VuZF90aW1lb3V0KQorICAgICAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgICAgICBmZF9zZXQgZmQ7CisgICAgICAgIGlmIChzb2FwLT5zZW5kX3RpbWVvdXQgPiAwKQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gc29hcC0+c2VuZF90aW1lb3V0OworICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gLXNvYXAtPnNlbmRfdGltZW91dC8xMDAwMDAwOworICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IC1zb2FwLT5zZW5kX3RpbWVvdXQlMTAwMDAwMDsKKyAgICAgICAgfQorICAgICAgICBGRF9aRVJPKCZmZCk7CisgICAgICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmZmQpOworICAgICAgICBmb3IgKDs7KQorICAgICAgICB7IHJlZ2lzdGVyIGludCByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+c29ja2V0ICsgMSksIE5VTEwsICZmZCwgJmZkLCAmdGltZW91dCk7CisgICAgICAgICAgaWYgKHIgPiAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgaWYgKCFyKQorICAgICAgICAgIHsgc29hcC0+ZXJybnVtID0gMDsKKyAgICAgICAgICAgIHJldHVybiBTT0FQX0VPRjsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FQUdBSU4pCisgICAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICAgIHJldHVybiBTT0FQX0VPRjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyNlbmRpZgorI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgICAgaWYgKHNvYXAtPnNzbCkKKyAgICAgICAgbndyaXR0ZW4gPSBTU0xfd3JpdGUoc29hcC0+c3NsLCBzLCBuKTsKKyAgICAgIGVsc2UgaWYgKHNvYXAtPmJpbykKKyAgICAgICAgbndyaXR0ZW4gPSBCSU9fd3JpdGUoc29hcC0+YmlvLCBzLCBuKTsKKyAgICAgIGVsc2UKKyNlbmRpZgorI2lmZGVmIFdJVEhfVURQCisgICAgICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgICAgeyBpZiAoc29hcC0+cGVlcmxlbikKKwkgIG53cml0dGVuID0gc2VuZHRvKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHMsIG4sIHNvYXAtPnNvY2tldF9mbGFncywgKHN0cnVjdCBzb2NrYWRkciopJnNvYXAtPnBlZXIsIHNvYXAtPnBlZXJsZW4pOworICAgICAgICBlbHNlCisJICBud3JpdHRlbiA9IHNlbmQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgcywgbiwgc29hcC0+c29ja2V0X2ZsYWdzKTsKKwkvKiByZXRyeSBhbmQgYmFjay1vZmYgYWxnb3JpdGhtICovCisJLyogVE9ETzogdGhpcyBpcyBub3QgdmVyeSBjbGVhciBmcm9tIHNwZWNzIHNvIHZlcmlmeSBhbmQgbGltaXQgY29uZGl0aW9ucyB1bmRlciB3aGljaCB3ZSBzaG91bGQgbG9vcCAoZS5nLiBFTk9CVUZTKSAqLworCWlmIChud3JpdHRlbiA8IDApCisgICAgICAgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgICAgICBmZF9zZXQgZmQ7CisJICBpbnQgdWRwX3JlcGVhdDsKKwkgIGludCB1ZHBfZGVsYXk7CisgICAgICAgICAgaWYgKChzb2FwLT5jb25uZWN0X2ZsYWdzICYgU09fQlJPQURDQVNUKSkKKwkgICAgdWRwX3JlcGVhdCA9IDM7IC8qIFNPQVAtb3Zlci1VRFAgTVVMVElDQVNUX1VEUF9SRVBFQVQgLSAxICovCisgICAgICAgICAgZWxzZQorCSAgICB1ZHBfcmVwZWF0ID0gMTsgLyogU09BUC1vdmVyLVVEUCBVTklDQVNUX1VEUF9SRVBFQVQgLSAxICovCisJICB1ZHBfZGVsYXkgPSAoc29hcF9yYW5kb20gJSAyMDEpICsgNTA7IC8qIFVEUF9NSU5fREVMQVkgLi4gVURQX01BWF9ERUxBWSAqLworCSAgZG8KKyAgICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gMDsKKyAgICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDEwMDAgKiB1ZHBfZGVsYXk7IC8qIG1zICovCisgICAgICAgICAgICBGRF9aRVJPKCZmZCk7CisgICAgICAgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJmZkKTsKKyAgICAgICAgICAgIHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCBOVUxMLCBOVUxMLCAmZmQsICZ0aW1lb3V0KTsKKwkgICAgaWYgKHNvYXAtPnBlZXJsZW4pCisJICAgICAgbndyaXR0ZW4gPSBzZW5kdG8oKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgcywgbiwgc29hcC0+c29ja2V0X2ZsYWdzLCAoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlciwgc29hcC0+cGVlcmxlbik7CisgICAgICAgICAgICBlbHNlCisJICAgICAgbndyaXR0ZW4gPSBzZW5kKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHMsIG4sIHNvYXAtPnNvY2tldF9mbGFncyk7CisJICAgIHVkcF9kZWxheSA8PD0gMTsKKwkgICAgaWYgKHVkcF9kZWxheSA+IDUwMCkgLyogVURQX1VQUEVSX0RFTEFZICovCisJICAgICAgdWRwX2RlbGF5ID0gNTAwOworCSAgfQorCSAgd2hpbGUgKG53cml0dGVuIDwgMCAmJiAtLXVkcF9yZXBlYXQgPiAwKTsKKwl9CisgICAgICB9CisgICAgICBlbHNlCisjZW5kaWYKKyNpZiAhZGVmaW5lZChQQUxNKSAmJiAhZGVmaW5lZChBUzQwMCkKKyAgICAgICAgbndyaXR0ZW4gPSBzZW5kKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHMsIG4sIHNvYXAtPnNvY2tldF9mbGFncyk7CisjZWxzZQorICAgICAgICBud3JpdHRlbiA9IHNlbmQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgKHZvaWQqKXMsIG4sIHNvYXAtPnNvY2tldF9mbGFncyk7CisjZW5kaWYKKyAgICAgIGlmIChud3JpdHRlbiA8PSAwKQorICAgICAgeworI2lmZGVmIFdJVEhfT1BFTlNTTAorCWludCBlcnI7CisgICAgICAgIGlmIChzb2FwLT5zc2wgJiYgKGVyciA9IFNTTF9nZXRfZXJyb3Ioc29hcC0+c3NsLCBud3JpdHRlbikpICE9IFNTTF9FUlJPUl9OT05FICYmIGVyciAhPSBTU0xfRVJST1JfV0FOVF9SRUFEICYmIGVyciAhPSBTU0xfRVJST1JfV0FOVF9XUklURSkKKyAgICAgICAgICByZXR1cm4gU09BUF9FT0Y7CisjZW5kaWYKKyAgICAgICAgaWYgKHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FV09VTERCTE9DSyAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VBR0FJTikKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICByZXR1cm4gU09BUF9FT0Y7CisgICAgICAgIH0KKyAgICAgICAgbndyaXR0ZW4gPSAwOyAvKiBhbmQgY2FsbCB3cml0ZSgpIGFnYWluICovCisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisjaWZkZWYgV0lUSF9GQVNUQ0dJCisgICAgICBud3JpdHRlbiA9IGZ3cml0ZSgodm9pZCopcywgMSwgbiwgc3Rkb3V0KTsKKyAgICAgIGZmbHVzaChzdGRvdXQpOworI2Vsc2UKKyNpZmRlZiBVTkRFUl9DRQorICAgICAgbndyaXR0ZW4gPSBmd3JpdGUocywgMSwgbiwgc29hcC0+c2VuZGZkKTsKKyNlbHNlCisjaWZkZWYgVlhXT1JLUworI2lmZGVmIFdNV19SUE1fSU8KKyAgICAgIGlmIChzb2FwLT5ycG1yZXFpZCkKKyAgICAgICAgbndyaXR0ZW4gPSAoaHR0cEJsb2NrUHV0KHNvYXAtPnJwbXJlcWlkLCBzLCBuKSA9PSAwKSA/IG4gOiAtMTsgCisgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgbndyaXR0ZW4gPSBmd3JpdGUocywgc2l6ZW9mKGNoYXIpLCBuLCBmZG9wZW4oc29hcC0+c2VuZGZkLCAidyIpKTsKKyNlbHNlCisgICAgICBud3JpdHRlbiA9IHdyaXRlKChTT0FQX1NPQ0tFVClzb2FwLT5zZW5kZmQsIHMsIG4pOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorICAgICAgaWYgKG53cml0dGVuIDw9IDApCisgICAgICB7IGlmIChzb2FwX2Vycm5vICE9IFNPQVBfRUlOVFIgJiYgc29hcF9lcnJubyAhPSBTT0FQX0VXT1VMREJMT0NLICYmIHNvYXBfZXJybm8gIT0gU09BUF9FQUdBSU4pCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9lcnJubzsKKyAgICAgICAgICByZXR1cm4gU09BUF9FT0Y7CisgICAgICAgIH0KKyAgICAgICAgbndyaXR0ZW4gPSAwOyAvKiBhbmQgY2FsbCB3cml0ZSgpIGFnYWluICovCisgICAgICB9CisgICAgfQorICAgIG4gLT0gbndyaXR0ZW47CisgICAgcyArPSBud3JpdHRlbjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmRfcmF3KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBzaXplX3QgbikKK3sgaWYgKCFuKQorICAgIHJldHVybiBTT0FQX09LOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKQorICB7IHNvYXAtPmNvdW50ICs9IG47CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgICAgaWYgKHNvYXAtPmZwcmVwYXJlc2VuZCAmJiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pICE9IFNPQVBfSU9fU1RPUkUpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBzb2FwLT5mcHJlcGFyZXNlbmQoc29hcCwgcywgbik7CisjZW5kaWYKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pCisgIHsgcmVnaXN0ZXIgc2l6ZV90IGkgPSBTT0FQX0JVRkxFTiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICB3aGlsZSAobiA+PSBpKQorICAgIHsgbWVtY3B5KHNvYXAtPmJ1ZiArIHNvYXAtPmJ1ZmlkeCwgcywgaSk7CisgICAgICBzb2FwLT5idWZpZHggPSBTT0FQX0JVRkxFTjsKKyAgICAgIGlmIChzb2FwX2ZsdXNoKHNvYXApKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBzICs9IGk7CisgICAgICBuIC09IGk7CisgICAgICBpID0gU09BUF9CVUZMRU47CisgICAgfQorICAgIG1lbWNweShzb2FwLT5idWYgKyBzb2FwLT5idWZpZHgsIHMsIG4pOworICAgIHNvYXAtPmJ1ZmlkeCArPSBuOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIHJldHVybiBzb2FwX2ZsdXNoX3Jhdyhzb2FwLCBzLCBuKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9mbHVzaChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IG4gPSBzb2FwLT5idWZpZHg7CisgIGlmIChuKQorICB7IHNvYXAtPmJ1ZmlkeCA9IDA7CisjaWZkZWYgV0lUSF9aTElCCisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKQorICAgIHsgc29hcC0+ZF9zdHJlYW0ubmV4dF9pbiA9IChCeXRlKilzb2FwLT5idWY7CisgICAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbiA9ICh1bnNpZ25lZCBpbnQpbjsKKyNpZmRlZiBXSVRIX0daSVAKKyAgICAgIHNvYXAtPnpfY3JjID0gY3JjMzIoc29hcC0+el9jcmMsIChCeXRlKilzb2FwLT5idWYsICh1bnNpZ25lZCBpbnQpbik7CisjZW5kaWYKKyAgICAgIGRvCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVmbGF0aW5nICV1IGJ5dGVzXG4iLCBzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbikpOworICAgICAgICBpZiAoZGVmbGF0ZSgmc29hcC0+ZF9zdHJlYW0sIFpfTk9fRkxVU0gpICE9IFpfT0spCisgICAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVbmFibGUgdG8gZGVmbGF0ZTogJXNcbiIsIHNvYXAtPmRfc3RyZWFtLm1zZz9zb2FwLT5kX3N0cmVhbS5tc2c6IiIpKTsKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQpCisgICAgICAgIHsgaWYgKHNvYXBfZmx1c2hfcmF3KHNvYXAsIHNvYXAtPnpfYnVmLCBTT0FQX0JVRkxFTikpCisgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZSopc29hcC0+el9idWY7CisgICAgICAgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0ID0gU09BUF9CVUZMRU47CisgICAgICAgIH0KKyAgICAgIH0gd2hpbGUgKHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgICByZXR1cm4gc29hcF9mbHVzaF9yYXcoc29hcCwgc29hcC0+YnVmLCBuKTsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9mbHVzaF9yYXcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBuKQoreyBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX1NUT1JFKQorICB7IHJlZ2lzdGVyIGNoYXIgKnQ7CisgICAgaWYgKCEodCA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgbikpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgbWVtY3B5KHQsIHMsIG4pOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICAgIGlmIChzb2FwLT5mcHJlcGFyZXNlbmQpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBzb2FwLT5mcHJlcGFyZXNlbmQoc29hcCwgcywgbik7CisjZW5kaWYKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKQorICB7IGNoYXIgdFsxNl07CisgICAgc3ByaW50Zih0LCAiXHJcbiVsWFxyXG4iICsgKHNvYXAtPmNodW5rc2l6ZSA/IDAgOiAyKSwgKHVuc2lnbmVkIGxvbmcpbik7CisgICAgREJHTVNHKFNFTlQsIHQsIHN0cmxlbih0KSk7CisgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZzZW5kKHNvYXAsIHQsIHN0cmxlbih0KSkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIHNvYXAtPmNodW5rc2l6ZSArPSBuOworICB9CisgIERCR01TRyhTRU5ULCBzLCBuKTsKKyNlbmRpZgorICByZXR1cm4gc29hcC0+ZXJyb3IgPSBzb2FwLT5mc2VuZChzb2FwLCBzLCBuKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZW5kKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzKQoreyBpZiAocykKKyAgICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCBzdHJsZW4ocykpOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZW5kMihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKQoreyBpZiAoc29hcF9zZW5kKHNvYXAsIHMxKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX3NlbmQoc29hcCwgczIpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2VuZDMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgY29uc3QgY2hhciAqczMpCit7IGlmIChzb2FwX3NlbmQoc29hcCwgczEpCisgICB8fCBzb2FwX3NlbmQoc29hcCwgczIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfc2VuZChzb2FwLCBzMyk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc2l6ZV90CitmcmVjdihzdHJ1Y3Qgc29hcCAqc29hcCwgY2hhciAqcywgc2l6ZV90IG4pCit7IHJlZ2lzdGVyIGludCByOworICBzb2FwLT5lcnJudW0gPSAwOworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpICYmICFkZWZpbmVkKFdJVEhfTEVBTikKKyAgaWYgKHNvYXAtPmlzKQorICB7IGlmIChzb2FwLT5pcy0+Z29vZCgpKQorICAgICAgcmV0dXJuIHNvYXAtPmlzLT5yZWFkKHMsIG4pLmdjb3VudCgpOworICAgIHJldHVybiAwOworICB9CisjZW5kaWYKKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgIHsgZm9yICg7OykKKyAgICB7IAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIGlmIChzb2FwLT5yZWN2X3RpbWVvdXQpCisgICAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICAgIGZkX3NldCBmZDsKKyAgICAgICAgaWYgKHNvYXAtPnJlY3ZfdGltZW91dCA+IDApCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSBzb2FwLT5yZWN2X3RpbWVvdXQ7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSAtc29hcC0+cmVjdl90aW1lb3V0LzEwMDAwMDA7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gLXNvYXAtPnJlY3ZfdGltZW91dCUxMDAwMDAwOworICAgICAgICB9CisgICAgICAgIEZEX1pFUk8oJmZkKTsKKyAgICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZmZCk7CisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCAmZmQsIE5VTEwsICZmZCwgJnRpbWVvdXQpOworICAgICAgICAgIGlmIChyID4gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGlmICghcikKKwkgIHsgc29hcC0+ZXJybnVtID0gMDsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUiAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VBR0FJTikKKwkgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyNlbmRpZgorI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgICAgaWYgKHNvYXAtPnNzbCkKKyAgICAgIHsgaW50IGVycjsKKwlyID0gU1NMX3JlYWQoc29hcC0+c3NsLCBzLCBuKTsKKyAgICAgICAgaWYgKHIgPiAwKQorICAgICAgICAgIHJldHVybiAoc2l6ZV90KXI7CisJZXJyID0gU1NMX2dldF9lcnJvcihzb2FwLT5zc2wsIHIpOworCWlmIChlcnIgIT0gU1NMX0VSUk9SX05PTkUgJiYgZXJyICE9IFNTTF9FUlJPUl9XQU5UX1JFQUQgJiYgZXJyICE9IFNTTF9FUlJPUl9XQU5UX1dSSVRFKQorICAgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgZWxzZSBpZiAoc29hcC0+YmlvKQorICAgICAgeyByID0gQklPX3JlYWQoc29hcC0+YmlvLCBzLCBuKTsKKyAgICAgICAgaWYgKHIgPiAwKQorICAgICAgICAgIHJldHVybiAoc2l6ZV90KXI7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgZWxzZQorI2VuZGlmCisgICAgICB7IAorI2lmZGVmIFdJVEhfVURQCisgICAgICAgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgICAgIHsgU09BUF9TT0NLTEVOX1QgayA9IChTT0FQX1NPQ0tMRU5fVClzaXplb2Yoc29hcC0+cGVlcik7CisJICBtZW1zZXQoKHZvaWQqKSZzb2FwLT5wZWVyLCAwLCBzaXplb2Yoc29hcC0+cGVlcikpOworICAgICAgICAgIHIgPSByZWN2ZnJvbSgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyLCAmayk7CS8qIHBvcnRhYmlsaXR5IG5vdGU6IHNlZSBTT0FQX1NPQ0tMRU5fVCBkZWZpbml0aW9uIGluIHN0ZHNvYXAyLmggKi8KKwkgIHNvYXAtPnBlZXJsZW4gPSAoc2l6ZV90KWs7CisjaWZuZGVmIFdJVEhfSVBWNgorICAgICAgICAgIHNvYXAtPmlwID0gbnRvaGwoc29hcC0+cGVlci5zaW5fYWRkci5zX2FkZHIpOworICAgICAgICAgIHNvYXAtPnBvcnQgPSAoaW50KW50b2hzKHNvYXAtPnBlZXIuc2luX3BvcnQpOworI2VuZGlmCisgICAgICAgIH0KKwllbHNlCisjZW5kaWYKKyAgICAgICAgICByID0gcmVjdigoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MpOworICAgICAgICBpZiAociA+PSAwKQorICAgICAgICAgIHJldHVybiAoc2l6ZV90KXI7CisgICAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUFHQUlOICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRVdPVUxEQkxPQ0spCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgIH0KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICAgIGZkX3NldCBmZDsKKyAgICAgICAgdGltZW91dC50dl9zZWMgPSAwOworICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAxMDAwMDsKKyAgICAgICAgRkRfWkVSTygmZmQpOworICAgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJmZkKTsKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICAgICAgaWYgKHNvYXAtPnNzbCAmJiBTU0xfZ2V0X2Vycm9yKHNvYXAtPnNzbCwgcikgPT0gU1NMX0VSUk9SX1dBTlRfV1JJVEUpCisgICAgICAgICAgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCBOVUxMLCAmZmQsICZmZCwgJnRpbWVvdXQpOworICAgICAgICBlbHNlCisgICAgICAgICAgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCAmZmQsIE5VTEwsICZmZCwgJnRpbWVvdXQpOworI2Vsc2UKKyAgICAgICAgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCAmZmQsIE5VTEwsICZmZCwgJnRpbWVvdXQpOworI2VuZGlmCisgICAgICAgIGlmIChyIDwgMCAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKyAgICB9CisgIH0KKyNpZmRlZiBXSVRIX0ZBU1RDR0kKKyAgcmV0dXJuIGZyZWFkKHMsIDEsIG4sIHN0ZGluKTsKKyNlbHNlCisjaWZkZWYgVU5ERVJfQ0UKKyAgcmV0dXJuIGZyZWFkKHMsIDEsIG4sIHNvYXAtPnJlY3ZmZCk7CisjZWxzZQorI2lmZGVmIFdNV19SUE1fSU8KKyAgaWYgKHNvYXAtPnJwbXJlcWlkKQorICAgIHIgPSBodHRwQmxvY2tSZWFkKHNvYXAtPnJwbXJlcWlkLCBzLCBuKTsKKyAgZWxzZQorI2VuZGlmCisgIHIgPSByZWFkKChTT0FQX1NPQ0tFVClzb2FwLT5yZWN2ZmQsIHMsIG4pOworICBpZiAociA+PSAwKQorICAgIHJldHVybiAoc2l6ZV90KXI7CisgIHNvYXAtPmVycm51bSA9IHNvYXBfZXJybm87CisgIHJldHVybiAwOworI2VuZGlmCisjZW5kaWYKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHNvYXBfd2NoYXIKK3NvYXBfZ2V0Y2h1bmtjaGFyKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcC0+YnVmaWR4IDwgc29hcC0+YnVmbGVuKQorICAgIHJldHVybiBzb2FwLT5idWZbc29hcC0+YnVmaWR4KytdOworICBzb2FwLT5idWZpZHggPSAwOworICBzb2FwLT5idWZsZW4gPSBzb2FwLT5jaHVua2J1ZmxlbiA9IHNvYXAtPmZyZWN2KHNvYXAsIHNvYXAtPmJ1ZiwgU09BUF9CVUZMRU4pOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlYWQgJXUgYnl0ZXMgZnJvbSBzb2NrZXQgJWRcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+YnVmbGVuLCBzb2FwLT5zb2NrZXQpKTsKKyAgREJHTVNHKFJFQ1YsIHNvYXAtPmJ1Ziwgc29hcC0+YnVmbGVuKTsKKyAgaWYgKHNvYXAtPmJ1ZmxlbikKKyAgICByZXR1cm4gc29hcC0+YnVmW3NvYXAtPmJ1ZmlkeCsrXTsKKyAgcmV0dXJuIEVPRjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc29hcF9pc3hkaWdpdChpbnQgYykKK3sgcmV0dXJuIChjID49ICcwJyAmJiBjIDw9ICc5JykgfHwgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKSB8fCAoYyA+PSAnYScgJiYgYyA8PSAnZicpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlY3ZfcmF3KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzaXplX3QgcmV0OworI2lmZGVmIFdJVEhfWkxJQgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIpCisgIHsgaWYgKHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID09IFpfTlVMTCkKKyAgICAgIHJldHVybiBFT0Y7CisgICAgaWYgKHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luIHx8ICFzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQpCisgICAgeyByZWdpc3RlciBpbnQgcjsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5mbGF0aW5nXG4iKSk7CisgICAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IChCeXRlKilzb2FwLT5idWY7CisgICAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgPSBTT0FQX0JVRkxFTjsKKyAgICAgIHIgPSBpbmZsYXRlKCZzb2FwLT5kX3N0cmVhbSwgWl9OT19GTFVTSCk7CisgICAgICBpZiAociA9PSBaX09LIHx8IHIgPT0gWl9TVFJFQU1fRU5EKQorICAgICAgeyBzb2FwLT5idWZpZHggPSAwOworICAgICAgICBzb2FwLT5idWZsZW4gPSBTT0FQX0JVRkxFTiAtIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dDsKKyAgICAgICAgaWYgKHNvYXAtPnpsaWJfaW4gPT0gU09BUF9aTElCX0daSVApCisgICAgICAgICAgc29hcC0+el9jcmMgPSBjcmMzMihzb2FwLT56X2NyYywgKEJ5dGUqKXNvYXAtPmJ1ZiwgKHVuc2lnbmVkIGludClzb2FwLT5idWZsZW4pOworICAgICAgICBpZiAociA9PSBaX1NUUkVBTV9FTkQpCisgICAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbmZsYXRlZCAlbHUtPiVsdSBieXRlc1xuIiwgc29hcC0+ZF9zdHJlYW0udG90YWxfaW4sIHNvYXAtPmRfc3RyZWFtLnRvdGFsX291dCkpOworICAgICAgICAgIHNvYXAtPnpfcmF0aW9faW4gPSAoZmxvYXQpc29hcC0+ZF9zdHJlYW0udG90YWxfaW4gLyAoZmxvYXQpc29hcC0+ZF9zdHJlYW0udG90YWxfb3V0OworICAgICAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gWl9OVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChzb2FwLT5idWZsZW4pCisgICAgICAgIHsgc29hcC0+Y291bnQgKz0gc29hcC0+YnVmbGVuOworICAgICAgICAgIHJldHVybiBTT0FQX09LOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmIChyICE9IFpfQlVGX0VSUk9SKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluZmxhdGUgZXJyb3I6ICVzXG4iLCBzb2FwLT5kX3N0cmVhbS5tc2c/c29hcC0+ZF9zdHJlYW0ubXNnOiIiKSk7CisgICAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gWl9OVUxMOworCXNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgICByZXR1cm4gRU9GOworICAgICAgfQorICAgIH0KK3psaWJfYWdhaW46CisgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSyAmJiAhc29hcC0+Y2h1bmtzaXplKQorICAgIHsgbWVtY3B5KHNvYXAtPmJ1Ziwgc29hcC0+el9idWYsIFNPQVBfQlVGTEVOKTsKKyAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPnpfYnVmbGVuOworICAgIH0KKyAgfQorI2VuZGlmCisjaWZuZGVmIFdJVEhfTk9IVFRQCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspIC8qIHJlYWQgSFRUUCBjaHVua2VkIHRyYW5zZmVyICovCisgIHsgCitjaHVua19hZ2FpbjoKKyAgICBpZiAoc29hcC0+Y2h1bmtzaXplKQorICAgIHsgc29hcC0+YnVmbGVuID0gcmV0ID0gc29hcC0+ZnJlY3Yoc29hcCwgc29hcC0+YnVmLCBzb2FwLT5jaHVua3NpemUgPiBTT0FQX0JVRkxFTiA/IFNPQVBfQlVGTEVOIDogc29hcC0+Y2h1bmtzaXplKTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR2V0dGluZyBjaHVuazogcmVhZCAldSBieXRlc1xuIiwgKHVuc2lnbmVkIGludClyZXQpKTsKKyAgICAgIERCR01TRyhSRUNWLCBzb2FwLT5idWYsIHJldCk7CisgICAgICBzb2FwLT5idWZpZHggPSAwOworICAgICAgc29hcC0+Y2h1bmtzaXplIC09IHJldDsKKyAgICB9CisgICAgZWxzZQorICAgIHsgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICAgICAgY2hhciAqdCwgdG1wWzhdOworICAgICAgdCA9IHRtcDsKKyAgICAgIGlmICghc29hcC0+Y2h1bmtidWZsZW4pCisgICAgICB7IHNvYXAtPmNodW5rYnVmbGVuID0gcmV0ID0gc29hcC0+ZnJlY3Yoc29hcCwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTik7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVhZCAldSBieXRlcyAoY2h1bmtlZCkgZnJvbSBzb2NrZXQgJWRcbiIsICh1bnNpZ25lZCBpbnQpcmV0LCBzb2FwLT5zb2NrZXQpKTsKKyAgICAgICAgREJHTVNHKFJFQ1YsIHNvYXAtPmJ1ZiwgcmV0KTsKKyAgICAgICAgc29hcC0+YnVmaWR4ID0gMDsKKyAgICAgICAgaWYgKCFyZXQpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmFoZWFkID0gRU9GOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBzb2FwLT5idWZpZHggPSBzb2FwLT5idWZsZW47CisgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5jaHVua2J1ZmxlbjsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR2V0dGluZyBjaHVuayBzaXplIChpZHg9JXUgbGVuPSV1KVxuIiwgKHVuc2lnbmVkIGludClzb2FwLT5idWZpZHgsICh1bnNpZ25lZCBpbnQpc29hcC0+YnVmbGVuKSk7CisgICAgICB3aGlsZSAoIXNvYXBfaXN4ZGlnaXQoKGludCkoYyA9IHNvYXBfZ2V0Y2h1bmtjaGFyKHNvYXApKSkpCisgICAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorCSAgcmV0dXJuIHNvYXAtPmFoZWFkID0gRU9GOworICAgICAgZG8KKyAgICAgICAgKnQrKyA9IChjaGFyKWM7CisgICAgICB3aGlsZSAoc29hcF9pc3hkaWdpdCgoaW50KShjID0gc29hcF9nZXRjaHVua2NoYXIoc29hcCkpKSAmJiB0IC0gdG1wIDwgNyk7CisgICAgICB3aGlsZSAoKGludCljICE9IEVPRiAmJiBjICE9ICdcbicpCisgICAgICAgIGMgPSBzb2FwX2dldGNodW5rY2hhcihzb2FwKTsKKyAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICByZXR1cm4gc29hcC0+YWhlYWQgPSBFT0Y7CisgICAgICAqdCA9ICdcMCc7CisgICAgICBzb2FwLT5jaHVua3NpemUgPSBzb2FwX3N0cnRvdWwodG1wLCAmdCwgMTYpOworICAgICAgaWYgKCFzb2FwLT5jaHVua3NpemUpCisgICAgICB7IHNvYXAtPmNodW5rYnVmbGVuID0gMDsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgb2YgY2h1bmtlZCBtZXNzYWdlXG4iKSk7CisJd2hpbGUgKChpbnQpYyAhPSBFT0YgJiYgYyAhPSAnXG4nKQorICAgICAgICAgIGMgPSBzb2FwX2dldGNodW5rY2hhcihzb2FwKTsKKyAgICAgICAgcmV0dXJuIHNvYXAtPmFoZWFkID0gRU9GOworICAgICAgfQorICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+YnVmaWR4ICsgc29hcC0+Y2h1bmtzaXplOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJNb3ZpbmcgYnVmIGxlbiB0byBpZHg9JXUgbGVuPSV1ICglcylcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+YnVmaWR4LCAodW5zaWduZWQgaW50KXNvYXAtPmJ1ZmxlbiwgdG1wKSk7CisgICAgICBpZiAoc29hcC0+YnVmbGVuID4gc29hcC0+Y2h1bmtidWZsZW4pCisgICAgICB7IHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmNodW5rYnVmbGVuOworICAgICAgICBzb2FwLT5jaHVua3NpemUgLT0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgICAgICBzb2FwLT5jaHVua2J1ZmxlbiA9IDA7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUGFzc2VkIGVuZCBvZiBidWZmZXIgZm9yIGNodW5rZWQgSFRUUCAoJXUgYnl0ZXMgbGVmdClcbiIsICh1bnNpZ25lZCBpbnQpKHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeCkpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHNvYXAtPmNodW5rYnVmbGVuKQorICAgICAgICBzb2FwLT5jaHVua3NpemUgPSAwOworICAgICAgcmV0ID0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgICAgaWYgKCFyZXQpCisgICAgICAgIGdvdG8gY2h1bmtfYWdhaW47CisgICAgfQorICB9CisgIGVsc2UKKyNlbmRpZgorICB7IHNvYXAtPmJ1ZmlkeCA9IDA7CisgICAgc29hcC0+YnVmbGVuID0gcmV0ID0gc29hcC0+ZnJlY3Yoc29hcCwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTik7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWFkICV1IGJ5dGVzIGZyb20gc29ja2V0ICVkXG4iLCAodW5zaWduZWQgaW50KXJldCwgc29hcC0+c29ja2V0KSk7CisgICAgREJHTVNHKFJFQ1YsIHNvYXAtPmJ1ZiwgcmV0KTsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+ZnByZXBhcmVyZWN2ICYmIChzb2FwLT5lcnJvciA9IHNvYXAtPmZwcmVwYXJlcmVjdihzb2FwLCBzb2FwLT5idWYsIHJldCkpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNlbmRpZgorI2lmZGVmIFdJVEhfWkxJQgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIpCisgIHsgcmVnaXN0ZXIgaW50IHI7CisgICAgbWVtY3B5KHNvYXAtPnpfYnVmLCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOKTsKKyAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X2luID0gKEJ5dGUqKShzb2FwLT56X2J1ZiArIHNvYXAtPmJ1ZmlkeCk7CisgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4gPSAodW5zaWduZWQgaW50KXJldDsKKyAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IChCeXRlKilzb2FwLT5idWY7CisgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0ID0gU09BUF9CVUZMRU47CisgICAgciA9IGluZmxhdGUoJnNvYXAtPmRfc3RyZWFtLCBaX05PX0ZMVVNIKTsKKyAgICBpZiAociA9PSBaX09LIHx8IHIgPT0gWl9TVFJFQU1fRU5EKQorICAgIHsgc29hcC0+YnVmaWR4ID0gMDsKKyAgICAgIHNvYXAtPnpfYnVmbGVuID0gc29hcC0+YnVmbGVuOworICAgICAgc29hcC0+YnVmbGVuID0gcmV0ID0gU09BUF9CVUZMRU4gLSBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQ7CisgICAgICBpZiAoc29hcC0+emxpYl9pbiA9PSBTT0FQX1pMSUJfR1pJUCkKKyAgICAgICAgc29hcC0+el9jcmMgPSBjcmMzMihzb2FwLT56X2NyYywgKEJ5dGUqKXNvYXAtPmJ1ZiwgKHVuc2lnbmVkIGludClzb2FwLT5idWZsZW4pOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbmZsYXRlZCAldSBieXRlc1xuIiwgKHVuc2lnbmVkIGludClyZXQpKTsKKyAgICAgIGlmICghcmV0KQorICAgICAgICBnb3RvIHpsaWJfYWdhaW47CisgICAgICBpZiAociA9PSBaX1NUUkVBTV9FTkQpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5mbGF0ZWQgJWx1LT4lbHUgYnl0ZXNcbiIsIHNvYXAtPmRfc3RyZWFtLnRvdGFsX2luLCBzb2FwLT5kX3N0cmVhbS50b3RhbF9vdXQpKTsKKyAgICAgICAgc29hcC0+el9yYXRpb19pbiA9IChmbG9hdClzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiAvIChmbG9hdClzb2FwLT5kX3N0cmVhbS50b3RhbF9vdXQ7CisgICAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gWl9OVUxMOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVuYWJsZSB0byBpbmZsYXRlOiAoJWQpICVzXG4iLCByLCBzb2FwLT5kX3N0cmVhbS5tc2c/c29hcC0+ZF9zdHJlYW0ubXNnOiIiKSk7CisgICAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IFpfTlVMTDsKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgcmV0dXJuIEVPRjsKKyAgICB9CisgIH0KKyNlbmRpZgorICBzb2FwLT5jb3VudCArPSByZXQ7CisgIHJldHVybiAhcmV0OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlY3Yoc3RydWN0IHNvYXAgKnNvYXApCit7IAorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpCisgIHsgaWYgKHNvYXAtPmRpbWUuYnVmbGVuKQorICAgIHsgY2hhciAqczsKKyAgICAgIGludCBpOworICAgICAgdW5zaWduZWQgY2hhciB0bXBbMTJdOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJESU1FIGhkciBmb3IgY2h1bmtlZCBESU1FIGlzIGluIGJ1ZmZlclxuIikpOworICAgICAgc29hcC0+Y291bnQgKz0gc29hcC0+ZGltZS5idWZsZW4gLSBzb2FwLT5idWZsZW47CisgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5kaW1lLmJ1ZmxlbjsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2tpcCBwYWRkaW5nICglbGQgYnl0ZXMpXG4iLCAtKGxvbmcpc29hcC0+ZGltZS5zaXplJjMpKTsKKyAgICAgIGZvciAoaSA9IC0obG9uZylzb2FwLT5kaW1lLnNpemUmMzsgaSA+IDA7IGktLSkKKyAgICAgIHsgc29hcC0+YnVmaWR4Kys7CisgICAgICAgIGlmIChzb2FwLT5idWZpZHggPj0gc29hcC0+YnVmbGVuKQorICAgICAgICAgIGlmIChzb2FwX3JlY3ZfcmF3KHNvYXApKQorICAgICAgICAgICAgcmV0dXJuIEVPRjsKKyAgICAgIH0KKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR2V0IERJTUUgaGRyIGZvciBuZXh0IGNodW5rXG4iKSk7CisgICAgICBzID0gKGNoYXIqKXRtcDsKKyAgICAgIGZvciAoaSA9IDEyOyBpID4gMDsgaS0tKQorICAgICAgeyAqcysrID0gc29hcC0+YnVmW3NvYXAtPmJ1ZmlkeCsrXTsKKyAgICAgICAgaWYgKHNvYXAtPmJ1ZmlkeCA+PSBzb2FwLT5idWZsZW4pCisgICAgICAgICAgaWYgKHNvYXBfcmVjdl9yYXcoc29hcCkpCisgICAgICAgICAgICByZXR1cm4gRU9GOworICAgICAgfQorICAgICAgc29hcC0+ZGltZS5mbGFncyA9IHRtcFswXSAmIDB4NzsKKyAgICAgIHNvYXAtPmRpbWUuc2l6ZSA9ICgoc2l6ZV90KXRtcFs4XSA8PCAyNCkgfCAoKHNpemVfdCl0bXBbOV0gPDwgMTYpIHwgKChzaXplX3QpdG1wWzEwXSA8PCA4KSB8ICgoc2l6ZV90KXRtcFsxMV0pOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHZXQgRElNRSBjaHVuayAoJXUgYnl0ZXMpXG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmRpbWUuc2l6ZSkpOworICAgICAgaWYgKHNvYXAtPmRpbWUuZmxhZ3MgJiBTT0FQX0RJTUVfQ0YpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTW9yZSBjaHVua2luZ1xuIikpOworICAgICAgICBzb2FwLT5kaW1lLmNodW5rc2l6ZSA9IHNvYXAtPmRpbWUuc2l6ZTsKKyAgICAgICAgaWYgKHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeCA+PSBzb2FwLT5kaW1lLnNpemUpCisgICAgICAgIHsgc29hcC0+ZGltZS5idWZsZW4gPSBzb2FwLT5idWZsZW47CisgICAgICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+YnVmaWR4ICsgc29hcC0+ZGltZS5jaHVua3NpemU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHNvYXAtPmRpbWUuY2h1bmtzaXplIC09IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJMYXN0IGNodW5rXG4iKSk7CisgICAgICAgIHNvYXAtPmRpbWUuYnVmbGVuID0gMDsKKyAgICAgICAgc29hcC0+ZGltZS5jaHVua3NpemUgPSAwOworICAgICAgfQorICAgICAgc29hcC0+Y291bnQgPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIiV1IGJ5dGVzIHJlbWFpbmluZ1xuIiwgKHVuc2lnbmVkIGludClzb2FwLT5jb3VudCkpOworICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgfQorICAgIGlmIChzb2FwLT5kaW1lLmNodW5rc2l6ZSkKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR2V0IG5leHQgRElNRSBoZHIgZm9yIGNodW5rZWQgRElNRSAoJXUgYnl0ZXMgY2h1bmspXG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmRpbWUuY2h1bmtzaXplKSk7CisgICAgICBpZiAoc29hcF9yZWN2X3Jhdyhzb2FwKSkKKyAgICAgICAgcmV0dXJuIEVPRjsKKyAgICAgIGlmIChzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHggPj0gc29hcC0+ZGltZS5jaHVua3NpemUpCisgICAgICB7IHNvYXAtPmRpbWUuYnVmbGVuID0gc29hcC0+YnVmbGVuOworICAgICAgICBzb2FwLT5jb3VudCAtPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHggLSBzb2FwLT5kaW1lLmNodW5rc2l6ZTsKKyAgICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+YnVmaWR4ICsgc29hcC0+ZGltZS5jaHVua3NpemU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHNvYXAtPmRpbWUuY2h1bmtzaXplIC09IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiJWx1IGJ5dGVzIHJlbWFpbmluZywgY291bnQ9JXVcbiIsICh1bnNpZ25lZCBsb25nKShzb2FwLT5idWZsZW4tc29hcC0+YnVmaWR4KSwgKHVuc2lnbmVkIGludClzb2FwLT5jb3VudCkpOworICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgfQorICB9CisjZW5kaWYKKyAgcmV0dXJuIHNvYXBfcmVjdl9yYXcoc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzb2FwX3djaGFyCitTT0FQX0ZNQUMyCitzb2FwX2dldGNoYXIoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgYyA9IHNvYXAtPmFoZWFkOworICBpZiAoYykKKyAgeyBpZiAoYyAhPSBFT0YpCisgICAgICBzb2FwLT5haGVhZCA9IDA7CisgICAgcmV0dXJuIGM7CisgIH0KKyAgcmV0dXJuIHNvYXBfZ2V0MShzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwKgorU09BUF9GTUFDMgorc29hcF9jb2RlKGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwICptYXAsIGNvbnN0IGNoYXIgKnN0cikKK3sgaWYgKHN0cikKKyAgeyB3aGlsZSAobWFwLT5zdHJpbmcpCisgICAgeyBpZiAoIXN0cmNtcChzdHIsIG1hcC0+c3RyaW5nKSkgLyogY2FzZSBzZW5zaXRpdmUgKi8KKyAgICAgICAgcmV0dXJuIG1hcDsKKyAgICAgIG1hcCsrOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2xvbmcKK1NPQVBfRk1BQzIKK3NvYXBfaW50X2NvZGUoY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgKm1hcCwgY29uc3QgY2hhciAqc3RyLCBsb25nIG90aGVyKQoreyB3aGlsZSAobWFwLT5zdHJpbmcpCisgIHsgaWYgKCFzb2FwX3RhZ19jbXAoc3RyLCBtYXAtPnN0cmluZykpIC8qIGNhc2UgaW5zZW5zaXRpdmUgKi8KKyAgICAgIHJldHVybiBtYXAtPmNvZGU7CisgICAgbWFwKys7CisgIH0KKyAgcmV0dXJuIG90aGVyOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfc3RyX2NvZGUoY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgKm1hcCwgbG9uZyBjb2RlKQoreyB3aGlsZSAobWFwLT5jb2RlICE9IGNvZGUgJiYgbWFwLT5zdHJpbmcpCisgICAgbWFwKys7CisgIHJldHVybiBtYXAtPnN0cmluZzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzb2FwX3djaGFyCitzb2FwX2NoYXIoc3RydWN0IHNvYXAgKnNvYXApCit7IGNoYXIgdG1wWzhdOworICByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICByZWdpc3RlciBjaGFyICpzID0gdG1wOworICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQorICB7IGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgaWYgKGMgPT0gJzsnIHx8IChpbnQpYyA9PSBFT0YpCisgICAgICBicmVhazsKKyAgICAqcysrID0gKGNoYXIpYzsKKyAgfQorICAqcyA9ICdcMCc7CisgIGlmICgqdG1wID09ICcjJykKKyAgeyBpZiAodG1wWzFdID09ICd4JyB8fCB0bXBbMV0gPT0gJ1gnKQorICAgICAgcmV0dXJuIHNvYXBfc3RydG9sKHRtcCArIDIsIE5VTEwsIDE2KTsKKyAgICByZXR1cm4gYXRvbCh0bXAgKyAxKTsKKyAgfQorICBpZiAoIXN0cmNtcCh0bXAsICJsdCIpKQorICAgIHJldHVybiAnPCc7CisgIGlmICghc3RyY21wKHRtcCwgImd0IikpCisgICAgcmV0dXJuICc+JzsKKyAgaWYgKCFzdHJjbXAodG1wLCAiYW1wIikpCisgICAgcmV0dXJuICcmJzsKKyAgaWYgKCFzdHJjbXAodG1wLCAicXVvdCIpKQorICAgIHJldHVybiAnIic7CisgIGlmICghc3RyY21wKHRtcCwgImFwb3MiKSkKKyAgICByZXR1cm4gJ1wnJzsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIHJldHVybiAoc29hcF93Y2hhcilzb2FwX2ludF9jb2RlKGh0bWxfZW50aXR5X2NvZGVzLCB0bXAsIFNPQVBfVU5LTk9XTl9DSEFSKTsKKyNlbHNlCisgIHJldHVybiBTT0FQX1VOS05PV05fQ0hBUjsgLyogdXNlIHRoaXMgdG8gcmVwcmVzZW50IHVua25vd24gY29kZSAqLworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBXSVRIX0xFQU4KK3NvYXBfd2NoYXIKK3NvYXBfZ2V0MChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXAtPmJ1ZmlkeCA+PSBzb2FwLT5idWZsZW4gJiYgc29hcF9yZWN2KHNvYXApKQorICAgIHJldHVybiBFT0Y7CisgIHJldHVybiAodW5zaWduZWQgY2hhcilzb2FwLT5idWZbc29hcC0+YnVmaWR4XTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFdJVEhfTEVBTgorc29hcF93Y2hhcgorc29hcF9nZXQxKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcC0+YnVmaWR4ID49IHNvYXAtPmJ1ZmxlbiAmJiBzb2FwX3JlY3Yoc29hcCkpCisgICAgcmV0dXJuIEVPRjsKKyAgcmV0dXJuICh1bnNpZ25lZCBjaGFyKXNvYXAtPmJ1Zltzb2FwLT5idWZpZHgrK107Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzb2FwX3djaGFyCitTT0FQX0ZNQUMyCitzb2FwX2dldChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICBjID0gc29hcC0+YWhlYWQ7CisgIGlmIChjKQorICB7IGlmIChjICE9IEVPRikKKyAgICAgIHNvYXAtPmFoZWFkID0gMDsKKyAgfQorICBlbHNlCisgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgZm9yICg7OykKKyAgeyBpZiAoc29hcC0+Y2RhdGEpCisgICAgeyBpZiAoYyA9PSAnXScpCisgICAgICB7IGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICAgIGlmIChjID09ICddJykKKyAgICAgICAgeyBzb2FwLT5jZGF0YSA9IDA7CisgICAgICAgICAgc29hcF9nZXQxKHNvYXApOyAvKiBza2lwID4gKi8KKyAgICAgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgICB9CisJZWxzZQorICAgICAgICB7IHNvYXBfcmV2Z2V0MShzb2FwKTsKKyAgICAgICAgICByZXR1cm4gJ10nOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBjOworICAgIH0KKyAgICBzd2l0Y2ggKGMpCisgICAgeyBjYXNlICc8JzoKKyAgICAgICAgZG8gYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgICAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworICAgICAgICBpZiAoYyA9PSAnIScgfHwgYyA9PSAnPycgfHwgYyA9PSAnJScpCisgICAgICAgIHsgcmVnaXN0ZXIgaW50IGsgPSAxOworCSAgaWYgKGMgPT0gJyEnKQorICAgICAgICAgIHsgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgICAgICAgIGlmIChjID09ICdbJykKKyAgICAgICAgICAgIHsgZG8gYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgICAgICAgICAgd2hpbGUgKChpbnQpYyAhPSBFT0YgJiYgYyAhPSAnWycpOworICAgICAgICAgICAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgc29hcC0+Y2RhdGEgPSAxOworICAgICAgICAgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworCSAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGMgPT0gJy0nICYmIChjID0gc29hcF9nZXQxKHNvYXApKSA9PSAnLScpCisgICAgICAgICAgICB7IGRvCisgICAgICAgICAgICAgIHsgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAnLScgJiYgKGMgPSBzb2FwX2dldDEoc29hcCkpID09ICctJykKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9IHdoaWxlICgoaW50KWMgIT0gRU9GKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisJICBlbHNlIGlmIChjID09ICc/JykKKyAgICAgICAgICAgIGMgPSBzb2FwX2dldF9waShzb2FwKTsKKyAgICAgICAgICB3aGlsZSAoKGludCljICE9IEVPRikKKyAgICAgICAgICB7IGlmIChjID09ICc8JykKKwkgICAgICBrKys7CisJICAgIGVsc2UgaWYgKGMgPT0gJz4nKQorCSAgICB7IGlmICgtLWsgPD0gMCkKKwkgICAgICAgIGJyZWFrOworCSAgICB9CisJICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisJICB9CisJICBpZiAoKGludCljID09IEVPRikKKwkgICAgYnJlYWs7CisgICAgICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYyA9PSAnLycpCisgICAgICAgICAgcmV0dXJuIFNPQVBfVFQ7CisgICAgICAgIHNvYXBfcmV2Z2V0MShzb2FwKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfTFQ7CisgICAgICBjYXNlICc+JzoKKyAgICAgICAgcmV0dXJuIFNPQVBfR1Q7CisgICAgICBjYXNlICciJzoKKyAgICAgICAgcmV0dXJuIFNPQVBfUVQ7CisgICAgICBjYXNlICdcJyc6CisgICAgICAgIHJldHVybiBTT0FQX0FQOworICAgICAgY2FzZSAnJic6CisgICAgICAgIHJldHVybiBzb2FwX2NoYXIoc29hcCkgfCAweDgwMDAwMDAwOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gYzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzb2FwX3djaGFyCitzb2FwX2dldF9waShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgY2hhciBidWZbNjRdOworICByZWdpc3RlciBjaGFyICpzID0gYnVmOworICByZWdpc3RlciBpbnQgaSA9IHNpemVvZihidWYpOworICByZWdpc3RlciBzb2FwX3djaGFyIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgIC8qIFRoaXMgaXMgYSBxdWljayB3YXkgdG8gcGFyc2UgWE1MIFBJIGFuZCB3ZSBjb3VsZCB1c2UgYSBjYWxsYmFjayBpbnN0ZWFkIHRvCisgICAqIGVuYWJsZSBhcHBsaWNhdGlvbnMgdG8gaW50ZXJjZXB0IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zICovCisgIHdoaWxlICgoaW50KWMgIT0gRU9GICYmIGMgIT0gJz8nKQorICB7IGlmICgtLWkgPiAwKQorICAgIHsgaWYgKHNvYXBfYmxhbmsoYykpCisgICAgICAgIGMgPSAnICc7CisgICAgICAqcysrID0gKGNoYXIpYzsKKyAgICB9CisgICAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgfQorICAqcyA9ICdcMCc7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiWE1MIFBJIDw/JXM/PlxuIiwgYnVmKSk7CisgIGlmICghc3RybmNtcChidWYsICJ4bWwgIiwgNCkpCisgIHsgcyA9IHN0cnN0cihidWYsICIgZW5jb2Rpbmc9Iik7CisgICAgaWYgKHMgJiYgc1sxMF0pCisgICAgeyBpZiAoIXNvYXBfdGFnX2NtcChzICsgMTEsICJpc28tODg1OS0xKiIpCisgICAgICAgfHwgIXNvYXBfdGFnX2NtcChzICsgMTEsICJsYXRpbjEqIikpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU3dpdGNoaW5nIHRvIGxhdGluMSBlbmNvZGluZ1xuIikpOworICAgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX0xBVElOOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChzICsgMTEsICJ1dGYtOCoiKSkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTd2l0Y2hpbmcgdG8gdXRmLTggZW5jb2RpbmdcbiIpKTsKKyAgICAgICAgc29hcC0+bW9kZSAmPSB+U09BUF9FTkNfTEFUSU47CisgICAgICB9CisgICAgfQorICB9CisgIGlmICgoaW50KWMgIT0gRU9GKQorICAgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgIHJldHVybiBjOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX21vdmUoc3RydWN0IHNvYXAgKnNvYXAsIGxvbmcgbikKK3sgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJNb3ZpbmcgJWxkIGJ5dGVzIGZvcndhcmRcbiIsIChsb25nKW4pKTsKKyAgZm9yICg7IG4gPiAwOyBuLS0pCisgICAgaWYgKChpbnQpc29hcF9nZXRjaGFyKHNvYXApID09IEVPRikKKyAgICAgIHJldHVybiBTT0FQX0VPRjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3NpemVfdAorU09BUF9GTUFDMgorc29hcF90ZWxsKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZXR1cm4gc29hcC0+Y291bnQgLSBzb2FwLT5idWZsZW4gKyBzb2FwLT5idWZpZHggLSAoc29hcC0+YWhlYWQgIT0gMCk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXR1dGY4KHN0cnVjdCBzb2FwICpzb2FwLCByZWdpc3RlciB1bnNpZ25lZCBsb25nIGMpCit7IGNoYXIgdG1wWzE2XTsKKyAgaWYgKGMgPiAwICYmIGMgPCAweDgwKQorICB7ICp0bXAgPSAoY2hhciljOworICAgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsIHRtcCwgMSk7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICB7IHJlZ2lzdGVyIGNoYXIgKnQgPSB0bXA7CisgICAgaWYgKGMgPCAweDA4MDApCisgICAgICAqdCsrID0gKGNoYXIpKDB4QzAgfCAoKGMgPj4gNikgJiAweDFGKSk7CisgICAgZWxzZQorICAgIHsgaWYgKGMgPCAweDAxMDAwMCkKKyAgICAgICAgKnQrKyA9IChjaGFyKSgweEUwIHwgKChjID4+IDEyKSAmIDB4MEYpKTsKKyAgICAgIGVsc2UKKyAgICAgIHsgaWYgKGMgPCAweDIwMDAwMCkKKyAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjAgfCAoKGMgPj4gMTgpICYgMHgwNykpOworICAgICAgICBlbHNlCisgICAgICAgIHsgaWYgKGMgPCAweDA0MDAwMDAwKQorICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEY4IHwgKChjID4+IDI0KSAmIDB4MDMpKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeyAqdCsrID0gKGNoYXIpKDB4RkMgfCAoKGMgPj4gMzApICYgMHgwMSkpOworICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDI0KSAmIDB4M0YpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDE4KSAmIDB4M0YpKTsKKyAgICAgICAgfSAgICAgCisgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAxMikgJiAweDNGKSk7CisgICAgICB9CisgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gNikgJiAweDNGKSk7CisgICAgfQorICAgICp0KysgPSAoY2hhcikoMHg4MCB8IChjICYgMHgzRikpOworICAgICp0ID0gJ1wwJzsKKyAgfQorICBlbHNlCisjZW5kaWYKKyAgICBzcHJpbnRmKHRtcCwgIiYjJWx1OyIsIGMpOworICByZXR1cm4gc29hcF9zZW5kKHNvYXAsIHRtcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzb2FwX3djaGFyCitTT0FQX0ZNQUMyCitzb2FwX2dldHV0Zjgoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYywgYzEsIGMyLCBjMywgYzQ7CisgIGMgPSBzb2FwLT5haGVhZDsKKyAgaWYgKGMgPiAweEZGKQorICB7IHNvYXAtPmFoZWFkID0gMDsKKyAgICByZXR1cm4gYzsKKyAgfQorYWdhaW46CisgIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgaWYgKGMgPCAweDgwIHx8IChzb2FwLT5tb2RlICYgU09BUF9FTkNfTEFUSU4pKQorICAgIHJldHVybiBjOworICBjMSA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgaWYgKGMxIDwgMHg4MCkKKyAgeyBzb2FwX3JldmdldDEoc29hcCk7IC8qIGRvZXNuJ3QgbG9vayBsaWtlIHRoaXMgaXMgVVRGOCAqLworICAgIHJldHVybiBjOworICB9CisgIGMxICY9IDB4M0Y7CisgIGlmIChjIDwgMHhFMCkKKyAgICByZXR1cm4gKChzb2FwX3djaGFyKShjICYgMHgxRikgPDwgNikgfCBjMTsKKyAgYzIgPSAoc29hcF93Y2hhcilzb2FwX2dldDEoc29hcCkgJiAweDNGOworICBpZiAoYyA9PSAweEVGICYmIGMxID09IDB4M0IgJiYgYzIgPT0gMHgzRikJLyogaWdub3JlIFVURi04IEJPTSAqLworICAgIGdvdG8gYWdhaW47CisgIGlmIChjIDwgMHhGMCkKKyAgICByZXR1cm4gKChzb2FwX3djaGFyKShjICYgMHgwRikgPDwgMTIpIHwgKGMxIDw8IDYpIHwgYzI7CisgIGMzID0gKHNvYXBfd2NoYXIpc29hcF9nZXQxKHNvYXApICYgMHgzRjsKKyAgaWYgKGMgPCAweEY4KQorICAgIHJldHVybiAoKHNvYXBfd2NoYXIpKGMgJiAweDA3KSA8PCAxOCkgfCAoYzEgPDwgMTIpIHwgKGMyIDw8IDYpIHwgYzM7CisgIGM0ID0gKHNvYXBfd2NoYXIpc29hcF9nZXQxKHNvYXApICYgMHgzRjsKKyAgaWYgKGMgPCAweEZDKQorICAgIHJldHVybiAoKHNvYXBfd2NoYXIpKGMgJiAweDAzKSA8PCAyNCkgfCAoYzEgPDwgMTgpIHwgKGMyIDw8IDEyKSB8IChjMyA8PCA2KSB8IGM0OworICByZXR1cm4gKChzb2FwX3djaGFyKShjICYgMHgwMSkgPDwgMzApIHwgKGMxIDw8IDI0KSB8IChjMiA8PCAxOCkgfCAoYzMgPDwgMTIpIHwgKGM0IDw8IDYpIHwgKHNvYXBfd2NoYXIpKHNvYXBfZ2V0MShzb2FwKSAmIDB4M0YpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dGhleChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgdW5zaWduZWQgY2hhciAqcywgaW50IG4pCit7IGNoYXIgZFsyXTsKKyAgcmVnaXN0ZXIgaW50IGk7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgaWYgKCEoc29hcC0+ZG9tLT5kYXRhID0gc29hcF9zMmhleChzb2FwLCBzLCBOVUxMLCBuKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNlbmRpZgorICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICB7IHJlZ2lzdGVyIGludCBtID0gKnMrKzsKKyAgICBkWzBdID0gKGNoYXIpKChtID4+IDQpICsgKG0gPiAxNTkgPyAnNycgOiAnMCcpKTsKKyAgICBtICY9IDB4MEY7CisgICAgZFsxXSA9IChjaGFyKShtICsgKG0gPiA5ID8gJzcnIDogJzAnKSk7CisgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgZCwgMikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit1bnNpZ25lZCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9nZXRoZXgoc3RydWN0IHNvYXAgKnNvYXAsIGludCAqbikKK3sKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBzb2FwLT5kb20tPmRhdGEgPSBzb2FwX3N0cmluZ19pbihzb2FwLCAwLCAtMSwgLTEpOworICAgIHJldHVybiAodW5zaWduZWQgY2hhciopc29hcF9oZXgycyhzb2FwLCBzb2FwLT5kb20tPmRhdGEsIE5VTEwsIDAsIG4pOworICB9CisjZW5kaWYKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgc29hcC0+bGFiaWR4ID0gMDsKKyAgZm9yICg7OykKKyAgeyByZWdpc3RlciBjaGFyICpzOworICAgIHJlZ2lzdGVyIGludCBpLCBrOworICAgIGlmIChzb2FwX2FwcGVuZF9sYWIoc29hcCwgTlVMTCwgMCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBzID0gc29hcC0+bGFiYnVmICsgc29hcC0+bGFiaWR4OworICAgIGsgPSBzb2FwLT5sYWJsZW4gLSBzb2FwLT5sYWJpZHg7CisgICAgc29hcC0+bGFiaWR4ID0gc29hcC0+bGFibGVuOworICAgIGZvciAoaSA9IDA7IGkgPCBrOyBpKyspCisgICAgeyByZWdpc3RlciBjaGFyIGQxLCBkMjsKKyAgICAgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgICAgIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgICAgIGlmIChzb2FwX2lzeGRpZ2l0KGMpKQorICAgICAgeyBkMSA9IChjaGFyKWM7CisgICAgICAgIGMgPSBzb2FwX2dldChzb2FwKTsgCisJaWYgKHNvYXBfaXN4ZGlnaXQoYykpCisgICAgICAgICAgZDIgPSAoY2hhciljOworICAgICAgICBlbHNlIAorICAgICAgICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IHVuc2lnbmVkIGNoYXIgKnA7CisgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgIGlmIChuKQorICAgICAgICAgICpuID0gKGludCkoc29hcC0+bGFibGVuIC0gayArIGkpOworICAgICAgICBwID0gKHVuc2lnbmVkIGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHNvYXAtPmxhYmxlbiAtIGsgKyBpKTsKKwlpZiAocCkKKwkgIG1lbWNweShwLCBzb2FwLT5sYWJidWYsIHNvYXAtPmxhYmxlbiAtIGsgKyBpKTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgICB9CisgICAgICAqcysrID0gKChkMSA+PSAnQScgPyAoZDEgJiAweDcpICsgOSA6IGQxIC0gJzAnKSA8PCA0KSArIChkMiA+PSAnQScgPyAoZDIgJiAweDcpICsgOSA6IGQyIC0gJzAnKTsKKyAgICB9CisgIH0KKyNlbHNlCisgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgZm9yICg7OykKKyAgeyByZWdpc3RlciBpbnQgaTsKKyAgICByZWdpc3RlciBjaGFyICpzID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBTT0FQX0JMS0xFTik7CisgICAgaWYgKCFzKQorICAgIHsgc29hcF9lbmRfYmxvY2soc29hcCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IFNPQVBfQkxLTEVOOyBpKyspCisgICAgeyByZWdpc3RlciBjaGFyIGQxLCBkMjsKKyAgICAgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IHNvYXBfZ2V0KHNvYXApOworICAgICAgaWYgKHNvYXBfaXN4ZGlnaXQoYykpCisgICAgICB7IGQxID0gKGNoYXIpYzsKKyAgICAgICAgYyA9IHNvYXBfZ2V0KHNvYXApOyAKKwlpZiAoc29hcF9pc3hkaWdpdChjKSkKKyAgICAgICAgICBkMiA9IChjaGFyKWM7CisgICAgICAgIGVsc2UgCisgICAgICAgIHsgc29hcF9lbmRfYmxvY2soc29hcCk7CisJICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyB1bnNpZ25lZCBjaGFyICpwOworICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICBpZiAobikKKyAgICAgICAgICAqbiA9IHNvYXBfc2l6ZV9ibG9jayhzb2FwLCBpKTsKKyAgICAgICAgcCA9ICh1bnNpZ25lZCBjaGFyKilzb2FwX3NhdmVfYmxvY2soc29hcCwgTlVMTCwgMCk7CisgICAgICAgIHJldHVybiBwOworICAgICAgfQorICAgICAgKnMrKyA9ICgoZDEgPj0gJ0EnID8gKGQxICYgMHg3KSArIDkgOiBkMSAtICcwJykgPDwgNCkgKyAoZDIgPj0gJ0EnID8gKGQyICYgMHg3KSArIDkgOiBkMiAtICcwJyk7CisgICAgfQorICB9CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRiYXNlNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMsIGludCBuKQoreyByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBtOworICBjaGFyIGRbNF07CisgIGlmICghcykKKyAgICByZXR1cm4gU09BUF9PSzsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBpZiAoIShzb2FwLT5kb20tPmRhdGEgPSBzb2FwX3MyYmFzZTY0KHNvYXAsIHMsIE5VTEwsIG4pKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2VuZGlmCisgIGZvciAoOyBuID4gMjsgbiAtPSAzLCBzICs9IDMpCisgIHsgbSA9IHNbMF07CisgICAgbSA9IChtIDw8IDgpIHwgc1sxXTsKKyAgICBtID0gKG0gPDwgOCkgfCBzWzJdOworICAgIGZvciAoaSA9IDQ7IGkgPiAwOyBtID4+PSA2KQorICAgICAgZFstLWldID0gc29hcF9iYXNlNjRvW20gJiAweDNGXTsKKyAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBkLCA0KSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAobiA+IDApCisgIHsgbSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgIG0gPSAobSA8PCA4KSB8ICpzKys7CisgICAgZm9yICg7IGkgPCAzOyBpKyspCisgICAgICBtIDw8PSA4OworICAgIGZvciAoaSsrOyBpID4gMDsgbSA+Pj0gNikKKyAgICAgIGRbLS1pXSA9IHNvYXBfYmFzZTY0b1ttICYgMHgzRl07CisgICAgZm9yIChpID0gMzsgaSA+IG47IGktLSkKKyAgICAgIGRbaV0gPSAnPSc7CisgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgZCwgNCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit1bnNpZ25lZCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9nZXRiYXNlNjQoc3RydWN0IHNvYXAgKnNvYXAsIGludCAqbiwgaW50IG1hbGxvY19mbGFnKQoreyAKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBzb2FwLT5kb20tPmRhdGEgPSBzb2FwX3N0cmluZ19pbihzb2FwLCAwLCAtMSwgLTEpOworICAgIHJldHVybiAodW5zaWduZWQgY2hhciopc29hcF9iYXNlNjQycyhzb2FwLCBzb2FwLT5kb20tPmRhdGEsIE5VTEwsIDAsIG4pOworICB9CisjZW5kaWYKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgc29hcC0+bGFiaWR4ID0gMDsKKyAgZm9yICg7OykKKyAgeyByZWdpc3RlciBpbnQgaSwgazsKKyAgICByZWdpc3RlciBjaGFyICpzOworICAgIGlmIChzb2FwX2FwcGVuZF9sYWIoc29hcCwgTlVMTCwgMikpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBzID0gc29hcC0+bGFiYnVmICsgc29hcC0+bGFiaWR4OworICAgIGsgPSBzb2FwLT5sYWJsZW4gLSBzb2FwLT5sYWJpZHg7CisgICAgc29hcC0+bGFiaWR4ID0gMyAqIChzb2FwLT5sYWJsZW4gLyAzKTsKKyAgICBpZiAoIXMpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgayAtIDI7IGkgKz0gMykKKyAgICB7IHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbSA9IDA7CisgICAgICByZWdpc3RlciBpbnQgaiA9IDA7CisgICAgICBkbworICAgICAgeyByZWdpc3RlciBzb2FwX3djaGFyIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgICAgICAgaWYgKGMgPT0gJz0nIHx8IGMgPCAwKQorICAgICAgICB7IHVuc2lnbmVkIGNoYXIgKnA7CisgICAgICAgICAgc3dpdGNoIChqKQorICAgICAgICAgIHsgY2FzZSAyOgorICAgICAgICAgICAgICAqcysrID0gKGNoYXIpKChtID4+IDQpICYgMHhGRik7CisgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gMTApICYgMHhGRik7CisgICAgICAgICAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gMikgJiAweEZGKTsKKyAgICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobikKKyAgICAgICAgICAgICpuID0gKGludCkoc29hcC0+bGFibGVuIC0gayArIGkpOworICAgICAgICAgIHAgPSAodW5zaWduZWQgY2hhciopc29hcF9tYWxsb2Moc29hcCwgc29hcC0+bGFibGVuIC0gayArIGkpOworCSAgaWYgKHApCisJICAgIG1lbWNweShwLCBzb2FwLT5sYWJidWYsIHNvYXAtPmxhYmxlbiAtIGsgKyBpKTsKKyAgICAgICAgICBpZiAoYyA+PSAwKQorICAgICAgICAgIHsgd2hpbGUgKChpbnQpKChjID0gc29hcF9nZXQoc29hcCkpICE9IEVPRikgJiYgYyAhPSBTT0FQX0xUICYmIGMgIT0gU09BUF9UVCkKKyAgICAgICAgICAgICAgOworCSAgfQorICAgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgIH0KKyAgICAgICAgYyAtPSAnKyc7CisgICAgICAgIGlmIChjID49IDAgJiYgYyA8PSA3OSkKKyAgICAgICAgeyBtID0gKG0gPDwgNikgKyBzb2FwX2Jhc2U2NGlbY107CisgICAgICAgICAgaisrOworICAgICAgICB9CisgICAgICB9IHdoaWxlIChqIDwgNCk7CisgICAgICAqcysrID0gKGNoYXIpKChtID4+IDE2KSAmIDB4RkYpOworICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiA4KSAmIDB4RkYpOworICAgICAgKnMrKyA9IChjaGFyKShtICYgMHhGRik7CisgICAgfQorICB9CisjZWxzZQorICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgcmV0dXJuIE5VTEw7CisgIGZvciAoOzspCisgIHsgcmVnaXN0ZXIgaW50IGk7CisgICAgcmVnaXN0ZXIgY2hhciAqcyA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgMyAqIFNPQVBfQkxLTEVOKTsgLyogbXVzdCBiZSBtdWx0aXBsZSBvZiAzICovCisgICAgaWYgKCFzKQorICAgIHsgc29hcF9lbmRfYmxvY2soc29hcCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IFNPQVBfQkxLTEVOOyBpKyspCisgICAgeyByZWdpc3RlciB1bnNpZ25lZCBsb25nIG0gPSAwOworICAgICAgcmVnaXN0ZXIgaW50IGogPSAwOworICAgICAgZG8KKyAgICAgIHsgcmVnaXN0ZXIgc29hcF93Y2hhciBjID0gc29hcF9nZXQoc29hcCk7CisgICAgICAgIGlmIChjID09ICc9JyB8fCBjIDwgMCkKKyAgICAgICAgeyB1bnNpZ25lZCBjaGFyICpwOworICAgICAgICAgIGkgKj0gMzsKKyAgICAgICAgICBzd2l0Y2ggKGopCisgICAgICAgICAgeyBjYXNlIDI6CisgICAgICAgICAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gNCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiAxMCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiAyKSAmIDB4RkYpOworICAgICAgICAgICAgICBpICs9IDI7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChuKQorCSAgICAqbiA9IChpbnQpc29hcF9zaXplX2Jsb2NrKHNvYXAsIGkpOworICAgICAgICAgIHAgPSAodW5zaWduZWQgY2hhciopc29hcF9zYXZlX2Jsb2NrKHNvYXAsIE5VTEwsIDApOworICAgICAgICAgIGlmIChjID49IDApCisgICAgICAgICAgeyB3aGlsZSAoKGludCkoKGMgPSBzb2FwX2dldChzb2FwKSkgIT0gRU9GKSAmJiBjICE9IFNPQVBfTFQgJiYgYyAhPSBTT0FQX1RUKQorICAgICAgICAgICAgICA7CisJICB9CisgICAgICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgfQorICAgICAgICBjIC09ICcrJzsKKyAgICAgICAgaWYgKGMgPj0gMCAmJiBjIDw9IDc5KQorICAgICAgICB7IG0gPSAobSA8PCA2KSArIHNvYXBfYmFzZTY0aVtjXTsKKyAgICAgICAgICBqKys7CisgICAgICAgIH0KKyAgICAgIH0gd2hpbGUgKGogPCA0KTsKKyAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gMTYpICYgMHhGRik7CisgICAgICAqcysrID0gKGNoYXIpKChtID4+IDgpICYgMHhGRik7CisgICAgICAqcysrID0gKGNoYXIpKG0gJiAweEZGKTsKKyAgICB9CisgIH0KKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3hvcF9mb3J3YXJkKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBjaGFyICoqcHRyLCBpbnQgKnNpemUsIGNoYXIgKippZCwgY2hhciAqKnR5cGUsIGNoYXIgKipvcHRpb25zKQoreyAvKiBDaGVjayBNVE9NIHhvcDpJbmNsdWRlIGVsZW1lbnQgKHdpdGhpbiBoZXgvYmFzZTY0QmluYXJ5KSAqLworICAvKiBUT0RPOiB0aGlzIGNvZGUgdG8gYmUgb2Jzb2xldGVkIHdpdGggbmV3IGltcG9ydC94b3AuaCBjb252ZW50aW9ucyAqLworICBpbnQgYm9keSA9IHNvYXAtPmJvZHk7IC8qIHNob3VsZCBzYXZlIHR5cGUgdG9vPyAqLworICBpZiAoIXNvYXBfcGVla19lbGVtZW50KHNvYXApKQorICB7IGlmICghc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsICJ4b3A6SW5jbHVkZSIsIDApICYmICpzb2FwLT5ocmVmKQorICAgIHsgaWYgKHNvYXBfZGltZV9mb3J3YXJkKHNvYXAsIHB0ciwgc2l6ZSwgaWQsIHR5cGUsIG9wdGlvbnMpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgTlVMTCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgc29hcC0+Ym9keSA9IGJvZHk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZGltZV9mb3J3YXJkKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBjaGFyICoqcHRyLCBpbnQgKnNpemUsIGNoYXIgKippZCwgY2hhciAqKnR5cGUsIGNoYXIgKipvcHRpb25zKQoreyBzdHJ1Y3Qgc29hcF94bGlzdCAqeHAgPSAoc3RydWN0IHNvYXBfeGxpc3QqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF94bGlzdCkpOworICAqcHRyID0gTlVMTDsKKyAgKnNpemUgPSAwOworICAqaWQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT5ocmVmKTsKKyAgKnR5cGUgPSBOVUxMOworICAqb3B0aW9ucyA9IE5VTEw7CisgIGlmICgheHApCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgIHhwLT5uZXh0ID0gc29hcC0+eGxpc3Q7CisgIHhwLT5wdHIgPSBwdHI7CisgIHhwLT5zaXplID0gc2l6ZTsKKyAgeHAtPmlkID0gKmlkOworICB4cC0+dHlwZSA9IHR5cGU7CisgIHhwLT5vcHRpb25zID0gb3B0aW9uczsKKyAgc29hcC0+eGxpc3QgPSB4cDsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9zdHJkdXAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMpCit7IGNoYXIgKnQgPSBOVUxMOworICBpZiAocyAmJiAodCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzdHJsZW4ocykgKyAxKSkpCisgICAgc3RyY3B5KHQsIHMpOworICByZXR1cm4gdDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9uZXdfYmxvY2soc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX2JsaXN0ICpwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk5ldyBibG9jayBzZXF1ZW5jZSAocHJldj0lcClcbiIsIHNvYXAtPmJsaXN0KSk7CisgIGlmICghKHAgPSAoc3RydWN0IHNvYXBfYmxpc3QqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9ibGlzdCkpKSkKKyAgICByZXR1cm4gU09BUF9FT007ICAgCisgIHAtPm5leHQgPSBzb2FwLT5ibGlzdDsgCisgIHAtPnB0ciA9IE5VTEw7CisgIHAtPnNpemUgPSAwOworICBzb2FwLT5ibGlzdCA9IHA7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZCoKK1NPQVBfRk1BQzIKK3NvYXBfcHVzaF9ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCwgc2l6ZV90IG4pCit7IGNoYXIgKnA7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUHVzaCBibG9jayBvZiAldSBieXRlcyAoJXUgYnl0ZXMgdG90YWwpXG4iLCAodW5zaWduZWQgaW50KW4sICh1bnNpZ25lZCBpbnQpc29hcC0+Ymxpc3QtPnNpemUgKyAodW5zaWduZWQgaW50KW4pKTsKKyAgaWYgKCEocCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBuICsgc2l6ZW9mKGNoYXIqKSArIHNpemVvZihzaXplX3QpKSkpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICAqKGNoYXIqKilwID0gc29hcC0+Ymxpc3QtPnB0cjsKKyAgKihzaXplX3QqKShwICsgc2l6ZW9mKGNoYXIqKSkgPSBuOworICBzb2FwLT5ibGlzdC0+cHRyID0gcDsKKyAgc29hcC0+Ymxpc3QtPnNpemUgKz0gbjsKKyAgcmV0dXJuIHAgKyBzaXplb2YoY2hhciopICsgc2l6ZW9mKHNpemVfdCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3BvcF9ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgY2hhciAqcDsKKyAgaWYgKCFzb2FwLT5ibGlzdC0+cHRyKQorICAgIHJldHVybjsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQb3AgYmxvY2tcbiIpKTsKKyAgcCA9IHNvYXAtPmJsaXN0LT5wdHI7CisgIHNvYXAtPmJsaXN0LT5zaXplIC09ICooc2l6ZV90KikocCArIHNpemVvZihjaGFyKikpOworICBzb2FwLT5ibGlzdC0+cHRyID0gKihjaGFyKiopcDsKKyAgU09BUF9GUkVFKHNvYXAsIHApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyB2b2lkCitzb2FwX3VwZGF0ZV9wdHJzKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpzdGFydCwgY2hhciAqZW5kLCBjaGFyICpwMSwgY2hhciAqcDIpCit7IGludCBpOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2ZsaXN0ICpmcDsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfeGxpc3QgKnhwOworI2VuZGlmCisgIHJlZ2lzdGVyIHZvaWQgKnAsICoqcTsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfSURIQVNIOyBpKyspCisgIHsgZm9yIChpcCA9IHNvYXAtPmlodFtpXTsgaXA7IGlwID0gaXAtPm5leHQpCisgICAgeyBpZiAoaXAtPnB0ciAmJiAoY2hhciopaXAtPnB0ciA+PSBzdGFydCAmJiAoY2hhciopaXAtPnB0ciA8IGVuZCkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVcGRhdGUgaWQ9JyVzJyAlcCAtPiAlcFxuIiwgaXAtPmlkLCBpcC0+cHRyLCAoY2hhciopaXAtPnB0ciArIChwMS1wMikpKTsKKyAgICAgICAgaXAtPnB0ciA9IChjaGFyKilpcC0+cHRyICsgKHAxLXAyKTsKKyAgICAgIH0KKyAgICAgIGZvciAocSA9ICZpcC0+bGluazsgcTsgcSA9ICh2b2lkKiopcCkKKyAgICAgIHsgcCA9ICpxOworICAgICAgICBpZiAocCAmJiAoY2hhciopcCA+PSBzdGFydCAmJiAoY2hhciopcCA8IGVuZCkKKyAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkxpbmsgdXBkYXRlIGlkPSclcycgJXBcbiIsIGlwLT5pZCwgcCkpOworICAgICAgICAgICpxID0gKGNoYXIqKXAgKyAocDEtcDIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBmb3IgKHEgPSAmaXAtPmNvcHk7IHE7IHEgPSAodm9pZCoqKXApCisgICAgICB7IHAgPSAqcTsKKyAgICAgICAgaWYgKHAgJiYgKGNoYXIqKXAgPj0gc3RhcnQgJiYgKGNoYXIqKXAgPCBlbmQpCisgICAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5IGNoYWluIHVwZGF0ZSBpZD0nJXMnICVwXG4iLCBpcC0+aWQsIHApKTsKKyAgICAgICAgICAqcSA9IChjaGFyKilwICsgKHAxLXAyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZm9yIChmcCA9IGlwLT5mbGlzdDsgZnA7IGZwID0gZnAtPm5leHQpCisgICAgICB7IGlmICgoY2hhciopZnAtPnB0ciA+PSBzdGFydCAmJiAoY2hhciopZnAtPnB0ciA8IGVuZCkKKyAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHkgbGlzdCB1cGRhdGUgaWQ9JyVzJyAlcFxuIiwgaXAtPmlkLCBmcCkpOworICAgICAgICAgIGZwLT5wdHIgPSAoY2hhciopZnAtPnB0ciArIChwMS1wMik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgZm9yICh4cCA9IHNvYXAtPnhsaXN0OyB4cDsgeHAgPSB4cC0+bmV4dCkKKyAgeyBpZiAoeHAtPnB0ciAmJiAoY2hhciopeHAtPnB0ciA+PSBzdGFydCAmJiAoY2hhciopeHAtPnB0ciA8IGVuZCkKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVXBkYXRlIGlkPSclcycgJXAgLT4gJXBcbiIsIHhwLT5pZD94cC0+aWQ6IiIsIHhwLT5wdHIsIChjaGFyKil4cC0+cHRyICsgKHAxLXAyKSkpOworICAgICAgeHAtPnB0ciA9ICh1bnNpZ25lZCBjaGFyKiopKChjaGFyKil4cC0+cHRyICsgKHAxLXAyKSk7CisgICAgICB4cC0+c2l6ZSA9IChpbnQqKSgoY2hhciopeHAtPnNpemUgKyAocDEtcDIpKTsKKyAgICAgIHhwLT50eXBlID0gKGNoYXIqKikoKGNoYXIqKXhwLT50eXBlICsgKHAxLXAyKSk7CisgICAgICB4cC0+b3B0aW9ucyA9IChjaGFyKiopKChjaGFyKil4cC0+b3B0aW9ucyArIChwMS1wMikpOworICAgIH0KKyAgfQorI2VuZGlmCit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzb2FwX2hhc19jb3BpZXMoc3RydWN0IHNvYXAgKnNvYXAsIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnN0YXJ0LCByZWdpc3RlciBjb25zdCBjaGFyICplbmQpCit7IHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2ZsaXN0ICpmcDsKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqcDsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfSURIQVNIOyBpKyspCisgIHsgZm9yIChpcCA9IHNvYXAtPmlodFtpXTsgaXA7IGlwID0gaXAtPm5leHQpCisgICAgeyBmb3IgKHAgPSAoY29uc3QgY2hhciopaXAtPmNvcHk7IHA7IHAgPSAqKGNvbnN0IGNoYXIqKilwKQorICAgICAgICBpZiAocCA+PSBzdGFydCAmJiBwIDwgZW5kKQorICAgICAgICAgIHJldHVybiBTT0FQX0VSUjsKKyAgICAgIGZvciAoZnAgPSBpcC0+Zmxpc3Q7IGZwOyBmcCA9IGZwLT5uZXh0KQorICAgICAgICBpZiAoKGNvbnN0IGNoYXIqKWZwLT5wdHIgPj0gc3RhcnQgJiYgKGNvbnN0IGNoYXIqKWZwLT5wdHIgPCBlbmQpCisJICByZXR1cm4gU09BUF9FUlI7CisgICAgfQorICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3Jlc29sdmUoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2ZsaXN0ICpmcDsKKyAgc2hvcnQgZmxhZzsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHZpbmcgZm9yd2FyZGVkIGRhdGFcbiIpKTsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfSURIQVNIOyBpKyspCisgIHsgZm9yIChpcCA9IHNvYXAtPmlodFtpXTsgaXA7IGlwID0gaXAtPm5leHQpCisgICAgeyBpZiAoaXAtPnB0cikKKyAgICAgIHsgcmVnaXN0ZXIgdm9pZCAqcCwgKipxLCAqcjsKKyAgICAgICAgcSA9ICh2b2lkKiopaXAtPmxpbms7CisgICAgICAgIGlwLT5saW5rID0gTlVMTDsKKyAgICAgICAgciA9IGlwLT5wdHI7CisgICAgICAgIERCR0xPRyhURVNULCBpZiAocSkgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlRyYXZlcnNpbmcgbGluayBjaGFpbiB0byByZXNvbHZlIGlkPSclcydcbiIsIGlwLT5pZCkpOworICAgICAgICB3aGlsZSAocSkKKyAgICAgICAgeyBwID0gKnE7CisgICAgICAgICAgKnEgPSByOworICAgICAgICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICIuLi4gbGluayAlcCAtPiAlcFxuIiwgcSwgcikpOworICAgICAgICAgIHEgPSAodm9pZCoqKXA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCppcC0+aWQgPT0gJyMnKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk1pc3NpbmcgZGF0YSBmb3IgaWQ9JyVzJ1xuIiwgaXAtPmlkKSk7CisgICAgICAgIHN0cmNweShzb2FwLT5pZCwgaXAtPmlkICsgMSk7CisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTUlTU0lOR19JRDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZG8KKyAgeyBmbGFnID0gMDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc29sdXRpb24gcGhhc2VcbiIpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgU09BUF9JREhBU0g7IGkrKykKKyAgICB7IGZvciAoaXAgPSBzb2FwLT5paHRbaV07IGlwOyBpcCA9IGlwLT5uZXh0KQorICAgICAgeyBpZiAoaXAtPnB0ciAmJiAhc29hcF9oYXNfY29waWVzKHNvYXAsIChjb25zdCBjaGFyKilpcC0+cHRyLCAoY29uc3QgY2hhciopaXAtPnB0ciArIGlwLT5zaXplKSkKKyAgICAgICAgeyBpZiAoaXAtPmNvcHkpCisgICAgICAgICAgeyByZWdpc3RlciB2b2lkICpwLCAqKnEgPSAodm9pZCoqKWlwLT5jb3B5OworICAgICAgICAgICAgREJHTE9HKFRFU1QsIGlmIChxKSBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVHJhdmVyc2luZyBjb3B5IGNoYWluIHRvIHJlc29sdmUgaWQ9JyVzJ1xuIiwgaXAtPmlkKSk7CisgICAgICAgICAgICBpcC0+Y29weSA9IE5VTEw7CisgICAgICAgICAgICBkbworICAgICAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIi4uLiBjb3B5ICVwIC0+ICVwICgldSBieXRlcylcbiIsIGlwLT5wdHIsIHEsICh1bnNpZ25lZCBpbnQpaXAtPnNpemUpKTsKKwkgICAgICBwID0gKnE7CisgICAgICAgICAgICAgIG1lbWNweShxLCBpcC0+cHRyLCBpcC0+c2l6ZSk7CisgICAgICAgICAgICAgIHEgPSAodm9pZCoqKXA7CisgICAgICAgICAgICB9IHdoaWxlIChxKTsKKwkgICAgZmxhZyA9IDE7CisJICB9CisgICAgICAgICAgZm9yIChmcCA9IGlwLT5mbGlzdDsgZnA7IGZwID0gaXAtPmZsaXN0KQorICAgICAgICAgIHsgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGsgPSBmcC0+bGV2ZWw7CisJICAgIHJlZ2lzdGVyIHZvaWQgKnAgPSBpcC0+cHRyOworICAgICAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHZpbmcgZm9yd2FyZGVkIGRhdGEgdHlwZT0lZCBsb2NhdGlvbj0lcCBsZXZlbD0ldSwldSBpZD0nJXMnXG4iLCBpcC0+dHlwZSwgcCwgaXAtPmxldmVsLCBmcC0+bGV2ZWwsIGlwLT5pZCkpOworCSAgICB3aGlsZSAoaXAtPmxldmVsIDwgaykKKyAgICAgICAgICAgIHsgcmVnaXN0ZXIgdm9pZCAqKnEgPSAodm9pZCoqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZih2b2lkKikpOyAgCisJICAgICAgaWYgKCFxKQorCSAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworCSAgICAgICpxID0gcDsKKyAgICAgICAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJEZXNjZW5kaW5nIG9uZSBsZXZlbCwgbmV3IGxvY2F0aW9uPSVwIGhvbGRzPSVwLi4uXG4iLCBxLCAqcSkpOworICAgICAgICAgICAgICBwID0gKHZvaWQqKXE7CisgICAgICAgICAgICAgIGstLTsKKyAgICAgICAgICAgIH0KKwkgICAgaWYgKGZwLT5mY29weSkKKwkgICAgICBmcC0+ZmNvcHkoc29hcCwgaXAtPnR5cGUsIGZwLT50eXBlLCBmcC0+cHRyLCBmcC0+bGVuLCBwLCBpcC0+c2l6ZSk7CisJICAgIGVsc2UKKwkgICAgICBzb2FwX2Zjb3B5KHNvYXAsIGlwLT50eXBlLCBmcC0+dHlwZSwgZnAtPnB0ciwgZnAtPmxlbiwgcCwgaXAtPnNpemUpOworCSAgICBpcC0+Zmxpc3QgPSBmcC0+bmV4dDsKKwkgICAgU09BUF9GUkVFKHNvYXAsIGZwKTsKKwkgICAgZmxhZyA9IDE7CisJICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0gd2hpbGUgKGZsYWcpOworI2lmZGVmIFNPQVBfREVCVUcKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfSURIQVNIOyBpKyspCisgIHsgZm9yIChpcCA9IHNvYXAtPmlodFtpXTsgaXA7IGlwID0gaXAtPm5leHQpCisgICAgeyBpZiAoaXAtPmNvcHkgfHwgaXAtPmZsaXN0KQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc29sdXRpb24gZXJyb3I6IGZvcndhcmRlZCBkYXRhIGZvciBpZD0nJXMnIGNvdWxkIG5vdCBiZSBwcm9wYWdhdGVkLCBwbGVhc2UgcmVwb3J0IHRoaXMgcHJvYmxlbSB0byB0aGUgZGV2ZWxvcGVyc1xuIiwgaXAtPmlkKSk7CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHV0aW9uIGRvbmVcbiIpKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3NpemVfdAorU09BUF9GTUFDMgorc29hcF9zaXplX2Jsb2NrKHN0cnVjdCBzb2FwICpzb2FwLCBzaXplX3QgbikKK3sgaWYgKHNvYXAtPmJsaXN0LT5wdHIpCisgIHsgc29hcC0+Ymxpc3QtPnNpemUgLT0gKihzaXplX3QqKShzb2FwLT5ibGlzdC0+cHRyICsgc2l6ZW9mKGNoYXIqKSkgLSBuOworICAgICooc2l6ZV90Kikoc29hcC0+Ymxpc3QtPnB0ciArIHNpemVvZihjaGFyKikpID0gbjsKKyAgfQorICByZXR1cm4gc29hcC0+Ymxpc3QtPnNpemU7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjaGFyKgorU09BUF9GTUFDMgorc29hcF9maXJzdF9ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgY2hhciAqcCwgKnEsICpyOworICBwID0gc29hcC0+Ymxpc3QtPnB0cjsKKyAgaWYgKCFwKQorICAgIHJldHVybiBOVUxMOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZpcnN0IGJsb2NrXG4iKSk7CisgIHIgPSBOVUxMOworICBkbworICB7IHEgPSAqKGNoYXIqKilwOworICAgICooY2hhcioqKXAgPSByOworICAgIHIgPSBwOworICAgIHAgPSBxOworICB9IHdoaWxlIChwKTsKKyAgc29hcC0+Ymxpc3QtPnB0ciA9IHI7CisgIHJldHVybiByICsgc2l6ZW9mKGNoYXIqKSArIHNpemVvZihzaXplX3QpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfbmV4dF9ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgY2hhciAqcDsKKyAgcCA9IHNvYXAtPmJsaXN0LT5wdHI7CisgIGlmIChwKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTmV4dCBibG9ja1xuIikpOworICAgIHNvYXAtPmJsaXN0LT5wdHIgPSAqKGNoYXIqKilwOworICAgIFNPQVBfRlJFRShzb2FwLCBwKTsKKyAgICBpZiAoc29hcC0+Ymxpc3QtPnB0cikKKyAgICAgIHJldHVybiBzb2FwLT5ibGlzdC0+cHRyICsgc2l6ZW9mKGNoYXIqKSArIHNpemVvZihzaXplX3QpOworICB9CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc2l6ZV90CitTT0FQX0ZNQUMyCitzb2FwX2Jsb2NrX3NpemUoc3RydWN0IHNvYXAgKnNvYXApCit7IHJldHVybiAqKHNpemVfdCopKHNvYXAtPmJsaXN0LT5wdHIgKyBzaXplb2YoY2hhciopKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZW5kX2Jsb2NrKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9ibGlzdCAqYnA7CisgIGNoYXIgKnAsICpxOworICBicCA9IHNvYXAtPmJsaXN0OworICBpZiAoYnApCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgb2YgYmxvY2sgc2VxdWVuY2UsIGZyZWUgYWxsIHJlbWFpbmluZyBibG9ja3NcbiIpKTsKKyAgICBmb3IgKHAgPSBicC0+cHRyOyBwOyBwID0gcSkKKyAgICB7IHEgPSAqKGNoYXIqKilwOworICAgICAgU09BUF9GUkVFKHNvYXAsIHApOworICAgIH0KKyAgICBzb2FwLT5ibGlzdCA9IGJwLT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBicCk7CisgIH0KKyAgREJHTE9HKFRFU1QsIGlmIChzb2FwLT5ibGlzdCkgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc3RvcmUgcHJldmlvdXMgYmxvY2sgc2VxdWVuY2VcbiIpKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3NhdmVfYmxvY2soc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnAsIGludCBmbGFnKQoreyByZWdpc3RlciBzaXplX3QgbjsKKyAgcmVnaXN0ZXIgY2hhciAqcSwgKnM7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2F2ZSBhbGwgYmxvY2tzIGluIGNvbnRpZ3VvdXMgbWVtb3J5IHNwYWNlIG9mICV1IGJ5dGVzICglcC0+JXApXG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmJsaXN0LT5zaXplLCBzb2FwLT5ibGlzdC0+cHRyLCBwKSk7CisgIGlmIChzb2FwLT5ibGlzdC0+c2l6ZSkKKyAgeyBpZiAoIXApCisgICAgICBwID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHNvYXAtPmJsaXN0LT5zaXplKTsKKyAgICBpZiAocCkKKyAgICB7IGZvciAocyA9IHAsIHEgPSBzb2FwX2ZpcnN0X2Jsb2NrKHNvYXApOyBxOyBxID0gc29hcF9uZXh0X2Jsb2NrKHNvYXApKQorICAgICAgeyBuID0gc29hcF9ibG9ja19zaXplKHNvYXApOworI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgICAgICAgaWYgKGZsYWcpCisJICBzb2FwX3VwZGF0ZV9wdHJzKHNvYXAsIHEsIHEgKyBuLCBzLCBxKTsKKyNlbmRpZgorICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHkgJXUgYnl0ZXMgZnJvbSAlcCB0byAlcFxuIiwgKHVuc2lnbmVkIGludCluLCBxLCBzKSk7CisgICAgICAgIG1lbWNweShzLCBxLCBuKTsKKyAgICAgICAgcyArPSBuOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICB9CisgIHNvYXBfZW5kX2Jsb2NrKHNvYXApOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9wdXRzaXplKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgc2l6ZSkKK3sgcmV0dXJuIHNvYXBfcHV0c2l6ZXMoc29hcCwgdHlwZSwgJnNpemUsIDEpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3B1dHNpemVzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBpbnQgKnNpemUsIGludCBkaW0pCit7IHJldHVybiBzb2FwX3B1dHNpemVzb2Zmc2V0cyhzb2FwLCB0eXBlLCBzaXplLCBOVUxMLCBkaW0pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3B1dHNpemVzb2Zmc2V0cyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgaW50ICpzaXplLCBjb25zdCBpbnQgKm9mZnNldCwgaW50IGRpbSkKK3sgaW50IGk7CisgIGlmICghdHlwZSkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgeyBzcHJpbnRmKHNvYXAtPnR5cGUsICIlc1slZCIsIHR5cGUsIHNpemVbMF0pOworICAgIGZvciAoaSA9IDE7IGkgPCBkaW07IGkrKykKKyAgICAgIHNwcmludGYoc29hcC0+dHlwZSArIHN0cmxlbihzb2FwLT50eXBlKSwgIiAlZCIsIHNpemVbaV0pOworICB9CisgIGVsc2UKKyAgeyBpZiAob2Zmc2V0KQorICAgIHsgc3ByaW50Zihzb2FwLT50eXBlLCAiJXNbJWQiLCB0eXBlLCBzaXplWzBdICsgb2Zmc2V0WzBdKTsKKyAgICAgIGZvciAoaSA9IDE7IGkgPCBkaW07IGkrKykKKyAgICAgICAgc3ByaW50Zihzb2FwLT50eXBlICsgc3RybGVuKHNvYXAtPnR5cGUpLCAiLCVkIiwgc2l6ZVtpXSArIG9mZnNldFtpXSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IHNwcmludGYoc29hcC0+dHlwZSwgIiVzWyVkIiwgdHlwZSwgc2l6ZVswXSk7CisgICAgICBmb3IgKGkgPSAxOyBpIDwgZGltOyBpKyspCisgICAgICAgIHNwcmludGYoc29hcC0+dHlwZSArIHN0cmxlbihzb2FwLT50eXBlKSwgIiwlZCIsIHNpemVbaV0pOworICAgIH0KKyAgICBzdHJjYXQoc29hcC0+dHlwZSwgIl0iKTsKKyAgfQorICByZXR1cm4gc29hcC0+dHlwZTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9wdXRvZmZzZXQoc3RydWN0IHNvYXAgKnNvYXAsIGludCBvZmZzZXQpCit7IHJldHVybiBzb2FwX3B1dG9mZnNldHMoc29hcCwgJm9mZnNldCwgMSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfcHV0b2Zmc2V0cyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgaW50ICpvZmZzZXQsIGludCBkaW0pCit7IHJlZ2lzdGVyIGludCBpOworICBzcHJpbnRmKHNvYXAtPmFycmF5T2Zmc2V0LCAiWyVkIiwgb2Zmc2V0WzBdKTsKKyAgZm9yIChpID0gMTsgaSA8IGRpbTsgaSsrKQorICAgIHNwcmludGYoc29hcC0+YXJyYXlPZmZzZXQgKyBzdHJsZW4oc29hcC0+YXJyYXlPZmZzZXQpLCAiLCVkIiwgb2Zmc2V0W2ldKTsKKyAgc3RyY2F0KHNvYXAtPmFycmF5T2Zmc2V0LCAiXSIpOworICByZXR1cm4gc29hcC0+YXJyYXlPZmZzZXQ7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2l6ZShjb25zdCBpbnQgKnNpemUsIGludCBkaW0pCit7IHJlZ2lzdGVyIGludCBpLCBuID0gc2l6ZVswXTsKKyAgZm9yIChpID0gMTsgaSA8IGRpbTsgaSsrKQorICAgIG4gKj0gc2l6ZVtpXTsKKyAgcmV0dXJuIG47Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0b2Zmc2V0cyhjb25zdCBjaGFyICphdHRyLCBjb25zdCBpbnQgKnNpemUsIGludCAqb2Zmc2V0LCBpbnQgZGltKQoreyByZWdpc3RlciBpbnQgaSwgaiA9IDA7CisgIGlmIChvZmZzZXQpCisgICAgZm9yIChpID0gMDsgaSA8IGRpbSAmJiBhdHRyICYmICphdHRyOyBpKyspCisgICAgeyBhdHRyKys7CisgICAgICBqICo9IHNpemVbaV07CisgICAgICBqICs9IG9mZnNldFtpXSA9IChpbnQpYXRvbChhdHRyKTsKKyAgICAgIGF0dHIgPSBzdHJjaHIoYXR0ciwgJywnKTsKKyAgICB9CisgIGVsc2UKKyAgICBmb3IgKGkgPSAwOyBpIDwgZGltICYmIGF0dHIgJiYgKmF0dHI7IGkrKykKKyAgICB7IGF0dHIrKzsKKyAgICAgIGogKj0gc2l6ZVtpXTsKKyAgICAgIGogKz0gKGludClhdG9sKGF0dHIpOworICAgICAgYXR0ciA9IHN0cmNocihhdHRyLCAnLCcpOworICAgIH0KKyAgcmV0dXJuIGo7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0c2l6ZShjb25zdCBjaGFyICphdHRyMSwgY29uc3QgY2hhciAqYXR0cjIsIGludCAqaikKK3sgcmVnaXN0ZXIgaW50IG4sIGs7CisgIGNoYXIgKnM7CisgICpqID0gMDsKKyAgaWYgKCEqYXR0cjEpCisgICAgcmV0dXJuIC0xOworICBpZiAoKmF0dHIxID09ICdbJykKKyAgICBhdHRyMSsrOworICBuID0gMTsKKyAgZm9yICg7OykKKyAgeyBrID0gKGludClzb2FwX3N0cnRvbChhdHRyMSwgJnMsIDEwKTsKKyAgICBuICo9IGs7CisgICAgaWYgKGsgPCAwIHx8IG4gPiBTT0FQX01BWEFSUkFZU0laRSB8fCBzID09IGF0dHIxKQorICAgICAgcmV0dXJuIC0xOworICAgIGF0dHIxID0gc3RyY2hyKHMsICcsJyk7CisgICAgaWYgKCFhdHRyMSkKKyAgICAgIGF0dHIxID0gc3RyY2hyKHMsICcgJyk7CisgICAgaWYgKGF0dHIyICYmICphdHRyMikKKyAgICB7IGF0dHIyKys7CisgICAgICAqaiAqPSBrOworICAgICAgayA9IChpbnQpc29hcF9zdHJ0b2woYXR0cjIsICZzLCAxMCk7CisgICAgICAqaiArPSBrOworICAgICAgaWYgKGsgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgICBhdHRyMiA9IHM7CisgICAgfQorICAgIGlmICghYXR0cjEpCisgICAgICBicmVhazsKKyAgICBhdHRyMSsrOworICB9CisgIHJldHVybiBuIC0gKmo7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0c2l6ZXMoY29uc3QgY2hhciAqYXR0ciwgaW50ICpzaXplLCBpbnQgZGltKQoreyByZWdpc3RlciBpbnQgaSwgaywgbjsKKyAgaWYgKCEqYXR0cikKKyAgICByZXR1cm4gLTE7CisgIGkgPSBzdHJsZW4oYXR0cik7CisgIG4gPSAxOworICBkbworICB7IGZvciAoaSA9IGktMTsgaSA+PSAwOyBpLS0pCisgICAgICBpZiAoYXR0cltpXSA9PSAnWycgfHwgYXR0cltpXSA9PSAnLCcgfHwgYXR0cltpXSA9PSAnICcpCisgICAgICAgIGJyZWFrOworICAgIGsgPSAoaW50KWF0b2woYXR0ciArIGkgKyAxKTsKKyAgICBuICo9IHNpemVbLS1kaW1dID0gazsKKyAgICBpZiAoayA8IDAgfHwgbiA+IFNPQVBfTUFYQVJSQVlTSVpFKQorICAgICAgcmV0dXJuIC0xOworICB9IHdoaWxlIChpID49IDAgJiYgYXR0cltpXSAhPSAnWycpOworICByZXR1cm4gbjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRwb3NpdGlvbihjb25zdCBjaGFyICphdHRyLCBpbnQgKnBvcykKK3sgcmVnaXN0ZXIgaW50IGksIG47CisgIGlmICghKmF0dHIpCisgICAgcmV0dXJuIC0xOworICBuID0gMDsKKyAgaSA9IDE7CisgIGRvCisgIHsgcG9zW24rK10gPSAoaW50KWF0b2woYXR0ciArIGkpOworICAgIHdoaWxlIChhdHRyW2ldICYmIGF0dHJbaV0gIT0gJywnICYmIGF0dHJbaV0gIT0gJ10nKQorICAgICAgaSsrOworICAgIGlmIChhdHRyW2ldID09ICcsJykKKyAgICAgIGkrKzsKKyAgfSB3aGlsZSAobiA8IFNPQVBfTUFYRElNUyAmJiBhdHRyW2ldICYmIGF0dHJbaV0gIT0gJ10nKTsKKyAgcmV0dXJuIG47Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHVzaF9uYW1lc3BhY2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICpucykKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wOworICByZWdpc3RlciBzdHJ1Y3QgTmFtZXNwYWNlICpwOworICByZWdpc3RlciBzaG9ydCBpID0gLTE7CisgIHJlZ2lzdGVyIHNpemVfdCBuLCBrOworICBuID0gc3RybGVuKGlkKTsKKyAgayA9IHN0cmxlbihucykgKyAxOworICBwID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlczsKKyAgaWYgKHApCisgIHsgZm9yIChpID0gMDsgcC0+aWQ7IHArKywgaSsrKQorICAgIHsgaWYgKHAtPm5zICYmICFzdHJjbXAobnMsIHAtPm5zKSkKKyAgICAgIHsgaWYgKHAtPm91dCkKKyAgICAgICAgeyBTT0FQX0ZSRUUoc29hcCwgcC0+b3V0KTsKKyAgICAgICAgICBwLT5vdXQgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKHAtPm91dCkKKyAgICAgIHsgaWYgKCFzdHJjbXAobnMsIHAtPm91dCkpCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlbHNlIGlmIChwLT5pbikKKyAgICAgIHsgaWYgKCFzb2FwX3RhZ19jbXAobnMsIHAtPmluKSkKKyAgICAgICAgeyBpZiAoKHAtPm91dCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBrKSkpCisgICAgICAgICAgICBzdHJjcHkocC0+b3V0LCBucyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFwIHx8ICFwLT5pZCkKKyAgICAgIGkgPSAtMTsKKyAgfQorICBpZiAoaSA+PSAwKQorICAgIGsgPSAwOworICBucCA9IChzdHJ1Y3Qgc29hcF9ubGlzdCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX25saXN0KSArIG4gKyBrKTsKKyAgaWYgKCFucCkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgbnAtPm5leHQgPSBzb2FwLT5ubGlzdDsKKyAgc29hcC0+bmxpc3QgPSBucDsKKyAgbnAtPmxldmVsID0gc29hcC0+bGV2ZWw7CisgIG5wLT5pbmRleCA9IGk7CisgIHN0cmNweShucC0+aWQsIGlkKTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQdXNoIG5hbWVzcGFjZSBiaW5kaW5nIChsZXZlbD0ldSkgJyVzJyAnJXMnXG4iLCBzb2FwLT5sZXZlbCwgaWQsIG5zKSk7CisgIGlmIChpIDwgMCkKKyAgeyBucC0+bnMgPSBucC0+aWQgKyBuICsgMTsKKyAgICBzdHJjcHkobnAtPm5zLCBucyk7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQdXNoIE5PVCBPSzogbm8gbWF0Y2ggZm91bmQgZm9yICclcycgaW4gbmFtZXNwYWNlIG1hcHBpbmcgdGFibGUgKGFkZGVkIHRvIHN0YWNrIGFueXdheSlcbiIsIG5zKSk7CisgIH0KKyAgZWxzZQorICB7IG5wLT5ucyA9IE5VTEw7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQdXNoIE9LICgnJXMnIG1hdGNoZXMgJyVzJyBpbiBuYW1lc3BhY2UgdGFibGUpXG4iLCBpZCwgcC0+aWQpKTsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfcG9wX25hbWVzcGFjZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wOworICB3aGlsZSAoc29hcC0+bmxpc3QgJiYgc29hcC0+bmxpc3QtPmxldmVsID49IHNvYXAtPmxldmVsKQorICB7IG5wID0gc29hcC0+bmxpc3QtPm5leHQ7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQb3BwZWQgbmFtZXNwYWNlIGJpbmRpbmcgKGxldmVsPSV1KSAnJXMnXG4iLCBzb2FwLT5sZXZlbCwgc29hcC0+bmxpc3QtPmlkKSk7CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPm5saXN0KTsKKyAgICBzb2FwLT5ubGlzdCA9IG5wOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfbWF0Y2hfbmFtZXNwYWNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZDEsIGNvbnN0IGNoYXIgKmlkMiwgaW50IG4xLCBpbnQgbjIpIAoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnAgPSBzb2FwLT5ubGlzdDsKKyAgd2hpbGUgKG5wICYmIChzdHJuY21wKG5wLT5pZCwgaWQxLCBuMSkgfHwgbnAtPmlkW24xXSkpCisgICAgbnAgPSBucC0+bmV4dDsKKyAgaWYgKG5wKQorICB7IGlmIChucC0+aW5kZXggPCAwCisgICAgIHx8IChzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW25wLT5pbmRleF0uaWQKKyAgICAgICYmIChzdHJuY21wKHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbbnAtPmluZGV4XS5pZCwgaWQyLCBuMikKKyAgICAgICB8fCBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW25wLT5pbmRleF0uaWRbbjJdKSkpCisgICAgICByZXR1cm4gU09BUF9OQU1FU1BBQ0U7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgaWYgKG4xID09IDMgJiYgbjEgPT0gbjIgJiYgIXN0cmNtcChpZDEsICJ4bWwiKSAmJiAhc3RyY21wKGlkMSwgaWQyKSkKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgcmV0dXJuIFNPQVBfU1lOVEFYX0VSUk9SOyAKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2N1cnJlbnRfbmFtZXNwYWNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucDsKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKKyAgbnAgPSBzb2FwLT5ubGlzdDsKKyAgaWYgKCEocyA9IHN0cmNocih0YWcsICc6JykpKQorICB7IHdoaWxlIChucCAmJiAqbnAtPmlkKSAvKiBmaW5kIGRlZmF1bHQgbmFtZXNwYWNlLCBpZiBwcmVzZW50ICovCisgICAgICBucCA9IG5wLT5uZXh0OworICB9CisgIGVsc2UKKyAgeyB3aGlsZSAobnAgJiYgKHN0cm5jbXAobnAtPmlkLCB0YWcsIHMgLSB0YWcpIHx8IG5wLT5pZFtzIC0gdGFnXSkpCisgICAgICBucCA9IG5wLT5uZXh0OworICAgIGlmICghbnApCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfTkFNRVNQQUNFOworICB9CisgIGlmIChucCkKKyAgeyBpZiAobnAtPmluZGV4ID49IDApCisgICAgICByZXR1cm4gc29hcC0+bmFtZXNwYWNlc1tucC0+aW5kZXhdLm5zOworICAgIGlmIChucC0+bnMpCisgICAgICByZXR1cm4gc29hcF9zdHJkdXAoc29hcCwgbnAtPm5zKTsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF90YWdfY21wKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKnQpCit7IGZvciAoOzspCisgIHsgcmVnaXN0ZXIgaW50IGMxID0gKnM7CisgICAgcmVnaXN0ZXIgaW50IGMyID0gKnQ7CisgICAgaWYgKCFjMSB8fCBjMSA9PSAnIicpCisgICAgICBicmVhazsKKyAgICBpZiAoYzIgIT0gJy0nKQorICAgIHsgaWYgKGMxICE9IGMyKQorICAgICAgeyBpZiAoYzEgPj0gJ0EnICYmIGMxIDw9ICdaJykKKyAgICAgICAgICBjMSArPSAnYScgLSAnQSc7CisgICAgICAgIGlmIChjMiA+PSAnQScgJiYgYzIgPD0gJ1onKQorICAgICAgICAgIGMyICs9ICdhJyAtICdBJzsKKyAgICAgIH0KKyAgICAgIGlmIChjMSAhPSBjMikKKyAgICAgIHsgaWYgKGMyICE9ICcqJykKKyAgICAgICAgICByZXR1cm4gMTsKKwljMiA9ICorK3Q7CisgICAgICAgIGlmICghYzIpCisJICByZXR1cm4gMDsKKyAgICAgICAgaWYgKGMyID49ICdBJyAmJiBjMiA8PSAnWicpCisgICAgICAgICAgYzIgKz0gJ2EnIC0gJ0EnOworICAgICAgICBmb3IgKDs7KQorICAgICAgICB7IGMxID0gKnM7CisJICBpZiAoIWMxIHx8IGMxID09ICciJykKKwkgICAgYnJlYWs7CisJICBpZiAoYzEgPj0gJ0EnICYmIGMxIDw9ICdaJykKKyAgICAgICAgICAgIGMxICs9ICdhJyAtICdBJzsKKyAgICAgICAgICBpZiAoYzEgPT0gYzIgJiYgIXNvYXBfdGFnX2NtcChzICsgMSwgdCArIDEpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisJICBzKys7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHMrKzsKKyAgICB0Kys7CisgIH0KKyAgaWYgKCp0ID09ICcqJyAmJiAhdFsxXSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuICp0OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX21hdGNoX3RhZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnMSwgY29uc3QgY2hhciAqdGFnMikKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqcywgKnQ7CisgIGlmICghdGFnMSB8fCAhdGFnMiB8fCAhKnRhZzIpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIHMgPSBzdHJjaHIodGFnMSwgJzonKTsKKyAgdCA9IHN0cmNocih0YWcyLCAnOicpOworICBpZiAodCkKKyAgeyBpZiAocykKKyAgICB7IGlmICh0WzFdICYmIFNPQVBfU1RSQ01QKHMgKyAxLCB0ICsgMSkpCisgICAgICAgIHJldHVybiBTT0FQX1RBR19NSVNNQVRDSDsKKyAgICAgIGlmICh0ICE9IHRhZzIgJiYgc29hcF9tYXRjaF9uYW1lc3BhY2Uoc29hcCwgdGFnMSwgdGFnMiwgcyAtIHRhZzEsIHQgLSB0YWcyKSkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJUYWdzICclcycgYW5kICclcycgbWF0Y2ggYnV0IG5hbWVzcGFjZXMgZGlmZmVyXG4iLCB0YWcxLCB0YWcyKSk7CisgICAgICAgIHJldHVybiBTT0FQX1RBR19NSVNNQVRDSDsKKyAgICAgIH0KKyAgICB9IAorICAgIGVsc2UgaWYgKFNPQVBfU1RSQ01QKHRhZzEsIHQgKyAxKSkKKyAgICAgIHJldHVybiBTT0FQX1RBR19NSVNNQVRDSDsKKyAgICBlbHNlIGlmICh0ICE9IHRhZzIgJiYgc29hcF9tYXRjaF9uYW1lc3BhY2Uoc29hcCwgdGFnMSwgdGFnMiwgMCwgdCAtIHRhZzIpKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJUYWdzICclcycgYW5kICclcycgbWF0Y2ggYnV0IG5hbWVzcGFjZXMgZGlmZmVyXG4iLCB0YWcxLCB0YWcyKSk7CisgICAgICByZXR1cm4gU09BUF9UQUdfTUlTTUFUQ0g7CisgICAgfQorICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVGFncyBhbmQgKGRlZmF1bHQpIG5hbWVzcGFjZXMgbWF0Y2g6ICclcycgJyVzJ1xuIiwgdGFnMSwgdGFnMikpOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIGlmIChzKQorICB7IGlmIChTT0FQX1NUUkNNUChzICsgMSwgdGFnMikpCisgICAgICByZXR1cm4gU09BUF9UQUdfTUlTTUFUQ0g7CisgIH0KKyAgZWxzZSBpZiAoU09BUF9TVFJDTVAodGFnMSwgdGFnMikpCisgICAgcmV0dXJuIFNPQVBfVEFHX01JU01BVENIOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlRhZ3MgbWF0Y2g6ICclcycgJyVzJ1xuIiwgdGFnMSwgdGFnMikpOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9tYXRjaF9hcnJheShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdHlwZSkKK3sgaWYgKCpzb2FwLT5hcnJheVR5cGUpCisgICAgaWYgKHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPmFycmF5VHlwZSwgdHlwZSkKKyAgICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+YXJyYXlUeXBlLCAieHNkOmFueVR5cGUiKQorICAgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT5hcnJheVR5cGUsICJ4c2Q6dXItdHlwZSIpCisgICAgKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJBcnJheSB0eXBlIG1pc21hdGNoOiAnJXMnICclcydcbiIsIHNvYXAtPmFycmF5VHlwZSwgdHlwZSkpOworICAgICAgcmV0dXJuIFNPQVBfVEFHX01JU01BVENIOworICAgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglTU0wKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgV0lUSF9PUEVOU1NMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yYW5kKCkKK3sgdW5zaWduZWQgY2hhciBidWZbNF07CisgIGlmICghc3NsX2luaXRfZG9uZSkKKyAgICBzb2FwX3NzbF9pbml0KCk7CisgIFJBTkRfcHNldWRvX2J5dGVzKGJ1ZiwgNCk7CisgIHJldHVybiAqKGludCopYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NzbF9zZXJ2ZXJfY29udGV4dChzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgc2hvcnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmtleWZpbGUsIGNvbnN0IGNoYXIgKnBhc3N3b3JkLCBjb25zdCBjaGFyICpjYWZpbGUsIGNvbnN0IGNoYXIgKmNhcGF0aCwgY29uc3QgY2hhciAqZGhmaWxlLCBjb25zdCBjaGFyICpyYW5kZmlsZSwgY29uc3QgY2hhciAqc2lkKQoreyBpbnQgZXJyOworICBzb2FwLT5rZXlmaWxlID0ga2V5ZmlsZTsKKyAgc29hcC0+cGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgc29hcC0+Y2FmaWxlID0gY2FmaWxlOworICBzb2FwLT5jYXBhdGggPSBjYXBhdGg7CisgIGlmIChkaGZpbGUpCisgIHsgc29hcC0+ZGhmaWxlID0gZGhmaWxlOworICAgIHNvYXAtPnJzYSA9IDA7CisgIH0KKyAgZWxzZQorICB7IHNvYXAtPmRoZmlsZSA9IE5VTEw7CisgICAgc29hcC0+cnNhID0gMTsKKyAgfQorICBzb2FwLT5yYW5kZmlsZSA9IHJhbmRmaWxlOworICBzb2FwLT5yZXF1aXJlX2NsaWVudF9hdXRoID0gKGZsYWdzICYgU09BUF9TU0xfUkVRVUlSRV9DTElFTlRfQVVUSEVOVElDQVRJT04pOworICBpZiAoIShlcnIgPSBzb2FwLT5mc3NsYXV0aChzb2FwKSkpCisgIHsgaWYgKHNpZCkKKyAgICAgIFNTTF9DVFhfc2V0X3Nlc3Npb25faWRfY29udGV4dChzb2FwLT5jdHgsICh1bnNpZ25lZCBjaGFyKilzaWQsIHN0cmxlbihzaWQpKTsKKyAgfQorICByZXR1cm4gZXJyOyAKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zc2xfY2xpZW50X2NvbnRleHQoc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIHNob3J0IGZsYWdzLCBjb25zdCBjaGFyICprZXlmaWxlLCBjb25zdCBjaGFyICpwYXNzd29yZCwgY29uc3QgY2hhciAqY2FmaWxlLCBjb25zdCBjaGFyICpjYXBhdGgsIGNvbnN0IGNoYXIgKnJhbmRmaWxlKQoreyBzb2FwLT5rZXlmaWxlID0ga2V5ZmlsZTsKKyAgc29hcC0+cGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgc29hcC0+Y2FmaWxlID0gY2FmaWxlOworICBzb2FwLT5jYXBhdGggPSBjYXBhdGg7CisgIHNvYXAtPmRoZmlsZSA9IE5VTEw7CisgIHNvYXAtPnJzYSA9IDA7CisgIHNvYXAtPnJhbmRmaWxlID0gcmFuZGZpbGU7CisgIHNvYXAtPnJlcXVpcmVfc2VydmVyX2F1dGggPSAoZmxhZ3MgJiBTT0FQX1NTTF9SRVFVSVJFX1NFUlZFUl9BVVRIRU5USUNBVElPTik7CisgIHJldHVybiBzb2FwLT5mc3NsYXV0aChzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc3NsX2luaXQoKQoreyAvKiBOb3RlOiBmb3IgTVQgc3lzdGVtcywgdGhlIG1haW4gcHJvZ3JhbSBNVVNUIGNhbGwgc29hcF9zc2xfaW5pdCgpIGJlZm9yZSBhbnkgdGhyZWFkcyBhcmUgc3RhcnRlZCAqLworICBpZiAoIXNzbF9pbml0X2RvbmUpCisgIHsgc3NsX2luaXRfZG9uZSA9IDE7CisgICAgU1NMX2xpYnJhcnlfaW5pdCgpOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBTU0xfbG9hZF9lcnJvcl9zdHJpbmdzKCk7CisjZW5kaWYKKyAgICBpZiAoIVJBTkRfbG9hZF9maWxlKCIvZGV2L3VyYW5kb20iLCAxMDI0KSkKKyAgICB7IGNoYXIgYnVmWzEwMjRdOworICAgICAgUkFORF9zZWVkKGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgICAgd2hpbGUgKCFSQU5EX3N0YXR1cygpKQorICAgICAgeyBpbnQgciA9IHJhbmQoKTsKKyAgICAgICAgUkFORF9zZWVkKCZyLCBzaXplb2YoaW50KSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY29uc3QgY2hhciAqCitzc2xfZXJyb3Ioc3RydWN0IHNvYXAgKnNvYXAsIGludCByZXQpCit7IGludCBlcnIgPSBTU0xfZ2V0X2Vycm9yKHNvYXAtPnNzbCwgcmV0KTsKKyAgY29uc3QgY2hhciAqbXNnID0gc29hcF9zdHJfY29kZShoX3NzbF9lcnJvcl9jb2RlcywgZXJyKTsKKyAgaWYgKG1zZykKKyAgICBzdHJjcHkoc29hcC0+bXNnYnVmLCBtc2cpOworICBlbHNlCisgICAgcmV0dXJuIEVSUl9lcnJvcl9zdHJpbmcoZXJyLCBzb2FwLT5tc2didWYpOworICBpZiAoRVJSX3BlZWtfZXJyb3IoKSkKKyAgeyB1bnNpZ25lZCBsb25nIHI7CisgICAgc3RyY2F0KHNvYXAtPm1zZ2J1ZiwgIlxuIik7CisgICAgd2hpbGUgKChyID0gRVJSX2dldF9lcnJvcigpKSkKKyAgICAgIEVSUl9lcnJvcl9zdHJpbmdfbihyLCBzb2FwLT5tc2didWYgKyBzdHJsZW4oc29hcC0+bXNnYnVmKSwgc2l6ZW9mKHNvYXAtPm1zZ2J1ZikgLSBzdHJsZW4oc29hcC0+bXNnYnVmKSk7CisgIH0gCisgIGVsc2UKKyAgeyBzd2l0Y2ggKHJldCkKKyAgICB7IGNhc2UgMDoKKyAgICAgICAgc3RyY3B5KHNvYXAtPm1zZ2J1ZiwgIkVPRiB3YXMgb2JzZXJ2ZWQgdGhhdCB2aW9sYXRlcyB0aGUgcHJvdG9jb2wuIFRoZSBjbGllbnQgcHJvYmFibHkgcHJvdmlkZWQgaW52YWxpZCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbi4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIC0xOgorICAgICAgICBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIkVycm9yIG9ic2VydmVkIGJ5IHVuZGVybHlpbmcgQklPOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7ICAKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5tc2didWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzc2xfcGFzc3dvcmQoY2hhciAqYnVmLCBpbnQgbnVtLCBpbnQgcndmbGFnLCB2b2lkICp1c2VyZGF0YSkKK3sgaWYgKG51bSA8IChpbnQpc3RybGVuKChjaGFyKil1c2VyZGF0YSkgKyAxKQorICAgIHJldHVybiAwOworICByZXR1cm4gc3RybGVuKHN0cmNweShidWYsIChjaGFyKil1c2VyZGF0YSkpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUaGlzIGNhbGxiYWNrIGlzIGluY2x1ZGVkIGZvciBmdXR1cmUgcmVmZXJlbmNlcy4gSXQgc2hvdWxkIG5vdCBiZSBkZWxldGVkCisjaWZuZGVmIFBBTE1fMgorc3RhdGljIERIICoKK3NzbF90bXBfZGgoU1NMICpzc2wsIGludCBpc19leHBvcnQsIGludCBrZXlsZW5ndGgpCit7IHN0YXRpYyBESCAqZGg1MTIgPSBOVUxMOworICBzdGF0aWMgREggKmRoMTAyNCA9IE5VTEw7CisgIERIICpkaDsKKyAgc3dpdGNoIChrZXlsZW5ndGgpCisgIHsgY2FzZSA1MTI6CisgICAgICBpZiAoIWRoNTEyKQorICAgICAgeyBCSU8gKmJpbyA9IEJJT19uZXdfZmlsZSgiZGg1MTIucGVtIiwgInIiKTsKKyAgICAgICAgaWYgKGJpbykKKyAgICAgICAgeyBkaDUxMiA9IFBFTV9yZWFkX2Jpb19ESHBhcmFtcyhiaW8sIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgICAgIEJJT19mcmVlKGJpbyk7CisgICAgICAgICAgcmV0dXJuIGRoNTEyOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBkaDUxMjsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKCFkaDEwMjQpCisgICAgICB7IEJJTyAqYmlvID0gQklPX25ld19maWxlKCJkaDEwMjQucGVtIiwgInIiKTsKKyAgICAgICAgaWYgKGJpbykKKyAgICAgICAgeyBkaDEwMjQgPSBQRU1fcmVhZF9iaW9fREhwYXJhbXMoYmlvLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICBCSU9fZnJlZShiaW8pOworICAgICAgICB9CisgICAgICB9CisgICAgICBkaCA9IGRoMTAyNDsKKyAgfQorICByZXR1cm4gZGg7Cit9CisjZW5kaWYKKyovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc3NsX2F1dGhfaW5pdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKCFzc2xfaW5pdF9kb25lKQorICAgIHNvYXBfc3NsX2luaXQoKTsKKyAgaWYgKCFzb2FwLT5jdHgpCisgIHsgaWYgKCEoc29hcC0+Y3R4ID0gU1NMX0NUWF9uZXcoU1NMdjIzX21ldGhvZCgpKSkpCisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCBzZXR1cCBjb250ZXh0IiwgU09BUF9TU0xfRVJST1IpOworICB9CisgIGlmIChzb2FwLT5yYW5kZmlsZSkKKyAgeyBpZiAoIVJBTkRfbG9hZF9maWxlKHNvYXAtPnJhbmRmaWxlLCAtMSkpCisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCBsb2FkIHJhbmRvbW5lc3MiLCBTT0FQX1NTTF9FUlJPUik7CisgIH0KKyAgaWYgKHNvYXAtPmNhZmlsZSB8fCBzb2FwLT5jYXBhdGgpCisgIHsgaWYgKCFTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhzb2FwLT5jdHgsIHNvYXAtPmNhZmlsZSwgc29hcC0+Y2FwYXRoKSkKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHJlYWQgQ0EgZmlsZSBhbmQgZGlyZWN0b3J5IiwgU09BUF9TU0xfRVJST1IpOworICAgIGlmIChzb2FwLT5jYWZpbGUgJiYgc29hcC0+cmVxdWlyZV9jbGllbnRfYXV0aCkKKyAgICAgIFNTTF9DVFhfc2V0X2NsaWVudF9DQV9saXN0KHNvYXAtPmN0eCwgU1NMX2xvYWRfY2xpZW50X0NBX2ZpbGUoc29hcC0+Y2FmaWxlKSk7CisgIH0KKyAgaWYgKCFTU0xfQ1RYX3NldF9kZWZhdWx0X3ZlcmlmeV9wYXRocyhzb2FwLT5jdHgpKQorICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHJlYWQgZGVmYXVsdCBDQSBmaWxlIGFuZC9vciBkaXJlY3RvcnkiLCBTT0FQX1NTTF9FUlJPUik7CisvKiBTZWUgYmVsb3cgKi8KKyAgaWYgKHNvYXAtPmtleWZpbGUpCisgIHsgaWYgKCFTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKHNvYXAtPmN0eCwgc29hcC0+a2V5ZmlsZSkpCisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCByZWFkIGNlcnRpZmljYXRlIGtleSBmaWxlIiwgU09BUF9TU0xfRVJST1IpOworICAgIGlmIChzb2FwLT5wYXNzd29yZCkKKyAgICB7IFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiX3VzZXJkYXRhKHNvYXAtPmN0eCwgKHZvaWQqKXNvYXAtPnBhc3N3b3JkKTsKKyAgICAgIFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiKHNvYXAtPmN0eCwgc3NsX3Bhc3N3b3JkKTsKKyAgICB9CisgICAgaWYgKCFTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X2ZpbGUoc29hcC0+Y3R4LCBzb2FwLT5rZXlmaWxlLCBTU0xfRklMRVRZUEVfUEVNKSkKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHJlYWQga2V5IGZpbGUiLCBTT0FQX1NTTF9FUlJPUik7CisgIH0KKy8qIFN1Z2dlc3RlZCBhbHRlcm5hdGl2ZSBhcHByb2FjaCB0byBjaGVjayBjYWZpbGUgZmlyc3QgYmVmb3JlIHRoZSBrZXkgZmlsZToKKyAgaWYgKHNvYXAtPnBhc3N3b3JkKQorICB7IFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiX3VzZXJkYXRhKHNvYXAtPmN0eCwgKHZvaWQqKXNvYXAtPnBhc3N3b3JkKTsKKyAgICBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYihzb2FwLT5jdHgsIHNzbF9wYXNzd29yZCk7CisgIH0KKyAgaWYgKCFzb2FwLT5jYWZpbGUgfHwgIVNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoc29hcC0+Y3R4LCBzb2FwLT5jYWZpbGUpKQorICB7IGlmIChzb2FwLT5rZXlmaWxlKQorICAgIHsgaWYgKCFTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKHNvYXAtPmN0eCwgc29hcC0+a2V5ZmlsZSkpCisgICAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHJlYWQgY2VydGlmaWNhdGUgb3Iga2V5IGZpbGUiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgICBpZiAoIVNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfZmlsZShzb2FwLT5jdHgsIHNvYXAtPmtleWZpbGUsIFNTTF9GSUxFVFlQRV9QRU0pKQorICAgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCByZWFkIGtleSBmaWxlIiwgU09BUF9TU0xfRVJST1IpOworICAgIH0KKyAgfQorKi8KKyAgaWYgKHNvYXAtPnJzYSkKKyAgeyBSU0EgKnJzYSA9IFJTQV9nZW5lcmF0ZV9rZXkoMTAyNCwgUlNBX0Y0LCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoIVNTTF9DVFhfc2V0X3RtcF9yc2Eoc29hcC0+Y3R4LCByc2EpKQorICAgIHsgaWYgKHJzYSkKKyAgICAgICAgUlNBX2ZyZWUocnNhKTsKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHNldCBSU0Ega2V5IiwgU09BUF9TU0xfRVJST1IpOworICAgIH0KKyAgICBSU0FfZnJlZShyc2EpOworICB9CisgIGVsc2UgaWYgKHNvYXAtPmRoZmlsZSkKKyAgeyBESCAqZGggPSAwOworICAgIEJJTyAqYmlvOworICAgIGJpbyA9IEJJT19uZXdfZmlsZShzb2FwLT5kaGZpbGUsICJyIik7CisgICAgaWYgKCFiaW8pCisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCByZWFkIERIIGZpbGUiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgZGggPSBQRU1fcmVhZF9iaW9fREhwYXJhbXMoYmlvLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBCSU9fZnJlZShiaW8pOworICAgIGlmIChTU0xfQ1RYX3NldF90bXBfZGgoc29hcC0+Y3R4LCBkaCkgPCAwKQorICAgIHsgaWYgKGRoKQorICAgICAgICBESF9mcmVlKGRoKTsKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHNldCBESCBwYXJhbWV0ZXJzIiwgU09BUF9TU0xfRVJST1IpOworICAgIH0KKyAgICBESF9mcmVlKGRoKTsKKyAgfQorICBTU0xfQ1RYX3NldF9vcHRpb25zKHNvYXAtPmN0eCwgU1NMX09QX0FMTCB8IFNTTF9PUF9OT19TU0x2Mik7CisgIFNTTF9DVFhfc2V0X3ZlcmlmeShzb2FwLT5jdHgsIHNvYXAtPnJlcXVpcmVfY2xpZW50X2F1dGggPyAoU1NMX1ZFUklGWV9QRUVSIHwgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCkgOiBzb2FwLT5yZXF1aXJlX3NlcnZlcl9hdXRoID8gU1NMX1ZFUklGWV9QRUVSIDogU1NMX1ZFUklGWV9OT05FLCBzb2FwLT5mc3NsdmVyaWZ5KTsKKyNpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA8IDB4MDA5MDUxMDBMKQorICBTU0xfQ1RYX3NldF92ZXJpZnlfZGVwdGgoc29hcC0+Y3R4LCAxKTsgCisjZWxzZQorICBTU0xfQ1RYX3NldF92ZXJpZnlfZGVwdGgoc29hcC0+Y3R4LCA5KTsgCisjZW5kaWYgIAorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NzbF92ZXJpZnlfY2FsbGJhY2soaW50IG9rLCBYNTA5X1NUT1JFX0NUWCAqc3RvcmUpCit7CisjaWZkZWYgU09BUF9ERUJVRworICBpZiAoIW9rKSAKKyAgeyBjaGFyIGRhdGFbMjU2XTsKKyAgICBYNTA5ICpjZXJ0ID0gWDUwOV9TVE9SRV9DVFhfZ2V0X2N1cnJlbnRfY2VydChzdG9yZSk7CisgICAgZnByaW50ZihzdGRlcnIsICJTU0wgdmVyaWZ5IGVycm9yIG9yIHdhcm5pbmcgd2l0aCBjZXJ0aWZpY2F0ZSBhdCBkZXB0aCAlZDogJXNcbiIsIFg1MDlfU1RPUkVfQ1RYX2dldF9lcnJvcl9kZXB0aChzdG9yZSksIFg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKFg1MDlfU1RPUkVfQ1RYX2dldF9lcnJvcihzdG9yZSkpKTsKKyAgICBYNTA5X05BTUVfb25lbGluZShYNTA5X2dldF9pc3N1ZXJfbmFtZShjZXJ0KSwgZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImNlcnRpZmljYXRlIGlzc3VlciAlc1xuIiwgZGF0YSk7CisgICAgWDUwOV9OQU1FX29uZWxpbmUoWDUwOV9nZXRfc3ViamVjdF9uYW1lKGNlcnQpLCBkYXRhLCBzaXplb2YoZGF0YSkpOworICAgIGZwcmludGYoc3RkZXJyLCAiY2VydGlmaWNhdGUgc3ViamVjdCAlc1xuIiwgZGF0YSk7CisgIH0KKyNlbmRpZgorICAvKiBOb3RlOiByZXR1cm4gMSB0byBjb250aW51ZSwgYnV0IHVuc2FmZSBwcm9ncmVzcyB3aWxsIGJlIHRlcm1pbmF0ZWQgYnkgU1NMICovCisgIHJldHVybiBvazsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zc2xfYWNjZXB0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBCSU8gKmJpbzsKKyAgaW50IGksIHI7CisgIGlmICghc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJObyBzb2NrZXQgaW4gc29hcF9zc2xfYWNjZXB0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgIGlmICghc29hcC0+Y3R4ICYmIChzb2FwLT5lcnJvciA9IHNvYXAtPmZzc2xhdXRoKHNvYXApKSkKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgaWYgKCFzb2FwLT5zc2wpCisgIHsgc29hcC0+c3NsID0gU1NMX25ldyhzb2FwLT5jdHgpOworICAgIGlmICghc29hcC0+c3NsKQorICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiU1NMX25ldygpIGZhaWxlZCBpbiBzb2FwX3NzbF9hY2NlcHQoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgfQorICBlbHNlCisgICAgU1NMX2NsZWFyKHNvYXAtPnNzbCk7CisgIHNvYXAtPmltb2RlIHw9IFNPQVBfRU5DX1NTTDsKKyAgc29hcC0+b21vZGUgfD0gU09BUF9FTkNfU1NMOworI2lmIGRlZmluZWQoV0lOMzIpCisgIHsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGSU9OQklPLCAmbm9uYmxvY2tpbmcpOworICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgIHsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICBpb2N0bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGSU9OQklPLCAoaW50KSZub25ibG9ja2luZyk7CisgIH0KKyNlbHNlCisgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfR0VURkwpfE9fTk9OQkxPQ0spOworI2VuZGlmCisgIGJpbyA9IEJJT19uZXdfc29ja2V0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEJJT19OT0NMT1NFKTsKKyAgU1NMX3NldF9iaW8oc29hcC0+c3NsLCBiaW8sIGJpbyk7CisgIGkgPSAxMDA7IC8qIDEwMCAqIDAuMSBtcyByZXRyaWVzICovCisgIHdoaWxlICgociA9IFNTTF9hY2NlcHQoc29hcC0+c3NsKSkgPD0gMCkKKyAgeyBpbnQgZXJyID0gU1NMX2dldF9lcnJvcihzb2FwLT5zc2wsIHIpOworICAgIGlmIChlcnIgPT0gU1NMX0VSUk9SX1dBTlRfUkVBRCB8fCBlcnIgPT0gU1NMX0VSUk9SX1dBTlRfV1JJVEUpCisgICAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgICAgZmRfc2V0IGZkOworICAgICAgaWYgKGktLSA8PSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHRpbWVvdXQudHZfc2VjID0gMDsKKyAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDEwMDAwMDsKKyAgICAgIEZEX1pFUk8oJmZkKTsKKyAgICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmZmQpOworICAgICAgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCAmZmQsIE5VTEwsICZmZCwgJnRpbWVvdXQpOworICAgICAgaWYgKHIgPCAwICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIpCisgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICByZXR1cm4gU09BUF9FT0Y7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7IHNvYXAtPmVycm51bSA9IGVycjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorI2lmIGRlZmluZWQoV0lOMzIpCisgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGSU9OQklPLCAmYmxvY2tpbmcpOworICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICBpb2N0bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGSU9OQklPLCAoaW50KSZibG9ja2luZyk7CisgIH0KKyNlbHNlCisgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfR0VURkwpJn5PX05PTkJMT0NLKTsKKyNlbmRpZgorICBpZiAociA8PSAwKQorICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHNzbF9lcnJvcihzb2FwLCByKSwgIlNTTF9hY2NlcHQoKSBmYWlsZWQgaW4gc29hcF9zc2xfYWNjZXB0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgcmV0dXJuIFNPQVBfU1NMX0VSUk9SOworICB9CisgIGlmIChzb2FwLT5yZXF1aXJlX2NsaWVudF9hdXRoKQorICB7IFg1MDkgKnBlZXI7CisgICAgaW50IGVycjsKKyAgICBpZiAoKGVyciA9IFNTTF9nZXRfdmVyaWZ5X3Jlc3VsdChzb2FwLT5zc2wpKSAhPSBYNTA5X1ZfT0spCisgICAgeyBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgIHJldHVybiBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgWDUwOV92ZXJpZnlfY2VydF9lcnJvcl9zdHJpbmcoZXJyKSwgIlNTTCBjZXJ0aWZpY2F0ZSBwcmVzZW50ZWQgYnkgcGVlciBjYW5ub3QgYmUgdmVyaWZpZWQgaW4gc29hcF9zc2xfYWNjZXB0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgfQorICAgIHBlZXIgPSBTU0xfZ2V0X3BlZXJfY2VydGlmaWNhdGUoc29hcC0+c3NsKTsKKyAgICBpZiAoIXBlZXIpCisgICAgeyBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgIHJldHVybiBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJObyBTU0wgY2VydGlmaWNhdGUgd2FzIHByZXNlbnRlZCBieSB0aGUgcGVlciBpbiBzb2FwX3NzbF9hY2NlcHQoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICB9CisgICAgWDUwOV9mcmVlKHBlZXIpOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZW5kaWYgLyogV0lUSF9PUEVOU1NMICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3RjcF9pbml0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5lcnJtb2RlID0gMTsKKyNpZmRlZiBXSU4zMgorICBpZiAodGNwX2RvbmUpCisgICAgcmV0dXJuIDA7CisgIGVsc2UKKyAgeyBXU0FEQVRBIHc7CisgICAgaWYgKFdTQVN0YXJ0dXAoTUFLRVdPUkQoMSwgMSksICZ3KSkKKyAgICAgIHJldHVybiAtMTsKKyAgICB0Y3BfZG9uZSA9IDE7CisgIH0KKyNlbmRpZgorICByZXR1cm4gMDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9kb25lKHN0cnVjdCBzb2FwICpzb2FwKQoreyAKKyNpZmRlZiBTT0FQX0RFQlVHCisgIGludCBpOworI2VuZGlmCisgIGlmIChzb2FwX2NoZWNrX3N0YXRlKHNvYXApKQorICAgIHJldHVybjsKKyAgc29hcF9mcmVlKHNvYXApOworICB3aGlsZSAoc29hcC0+Y2xpc3QpCisgIHsgc3RydWN0IHNvYXBfY2xpc3QgKnAgPSBzb2FwLT5jbGlzdC0+bmV4dDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+Y2xpc3QpOworICAgIHNvYXAtPmNsaXN0ID0gcDsKKyAgfQorICBzb2FwLT5rZWVwX2FsaXZlID0gMDsgLyogdG8gZm9yY2UgY2xvc2UgdGhlIHNvY2tldCAqLworICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyNpZmRlZiBXSVRIX0NPT0tJRVMKKyAgc29hcF9mcmVlX2Nvb2tpZXMoc29hcCk7CisjZW5kaWYKKyAgd2hpbGUgKHNvYXAtPnBsdWdpbnMpCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGx1Z2luICpwID0gc29hcC0+cGx1Z2lucy0+bmV4dDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlbW92aW5nIHBsdWdpbiAnJXMnXG4iLCBzb2FwLT5wbHVnaW5zLT5pZCkpOworICAgIGlmIChzb2FwLT5wbHVnaW5zLT5mY29weSB8fCBzb2FwLT5zdGF0ZSA9PSBTT0FQX0lOSVQpCisgICAgICBzb2FwLT5wbHVnaW5zLT5mZGVsZXRlKHNvYXAsIHNvYXAtPnBsdWdpbnMpOworICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5wbHVnaW5zKTsKKyAgICBzb2FwLT5wbHVnaW5zID0gcDsKKyAgfQorICBzb2FwLT5mcGx1Z2luID0gZnBsdWdpbjsKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyAgc29hcC0+ZnBvc3QgPSBodHRwX3Bvc3Q7CisgIHNvYXAtPmZnZXQgPSBodHRwX2dldDsKKyAgc29hcC0+ZmZvcm0gPSBOVUxMOworICBzb2FwLT5mcG9zdGhkciA9IGh0dHBfcG9zdF9oZWFkZXI7CisgIHNvYXAtPmZyZXNwb25zZSA9IGh0dHBfcmVzcG9uc2U7CisgIHNvYXAtPmZwYXJzZSA9IGh0dHBfcGFyc2U7CisgIHNvYXAtPmZwYXJzZWhkciA9IGh0dHBfcGFyc2VfaGVhZGVyOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0lQVjYKKyAgc29hcC0+ZnJlc29sdmUgPSB0Y3BfZ2V0aG9zdDsKKyNlbHNlCisgIHNvYXAtPmZyZXNvbHZlID0gTlVMTDsKKyNlbmRpZgorICBzb2FwLT5mYWNjZXB0ID0gdGNwX2FjY2VwdDsKKyAgc29hcC0+Zm9wZW4gPSB0Y3BfY29ubmVjdDsKKyAgc29hcC0+ZmNsb3NlID0gdGNwX2Rpc2Nvbm5lY3Q7CisgIHNvYXAtPmZjbG9zZXNvY2tldCA9IHRjcF9jbG9zZXNvY2tldDsKKyAgc29hcC0+ZnNodXRkb3duc29ja2V0ID0gdGNwX3NodXRkb3duc29ja2V0OworICBzb2FwLT5mc2VuZCA9IGZzZW5kOworICBzb2FwLT5mcmVjdiA9IGZyZWN2OworICBzb2FwLT5mcG9sbCA9IHNvYXBfcG9sbDsKKyNlbHNlCisgIHNvYXAtPmZvcGVuID0gTlVMTDsKKyAgc29hcC0+ZmNsb3NlID0gTlVMTDsKKyAgc29hcC0+ZnBvbGwgPSBOVUxMOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXAtPmZwcmVwYXJlaW5pdCA9IE5VTEw7CisgIHNvYXAtPmZwcmVwYXJlc2VuZCA9IE5VTEw7CisgIHNvYXAtPmZwcmVwYXJlcmVjdiA9IE5VTEw7CisgIHNvYXAtPmZwcmVwYXJlZmluYWwgPSBOVUxMOworI2VuZGlmCisgIHNvYXAtPmZzZXRlcnJvciA9IE5VTEw7CisgIHNvYXAtPmZpZ25vcmUgPSBOVUxMOworICBzb2FwLT5mc2VydmVsb29wID0gTlVMTDsKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgaWYgKHNvYXAtPnNlc3Npb24pCisgIHsgU1NMX1NFU1NJT05fZnJlZShzb2FwLT5zZXNzaW9uKTsKKyAgICBzb2FwLT5zZXNzaW9uID0gTlVMTDsKKyAgfQorI2VuZGlmCisgIGlmIChzb2FwLT5zdGF0ZSA9PSBTT0FQX0lOSVQpCisgIHsgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikpCisgICAgeyBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKXNvYXAtPm1hc3Rlcik7CisgICAgICBzb2FwLT5tYXN0ZXIgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICAgIH0KKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICBpZiAoc29hcC0+Y3R4KQorICAgIHsgU1NMX0NUWF9mcmVlKHNvYXAtPmN0eCk7CisgICAgICBzb2FwLT5jdHggPSBOVUxMOworICAgIH0KKyNlbmRpZgorICB9CisjaWZkZWYgU09BUF9ERUJVRworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWUgbG9nZmlsZXNcbiIpKTsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfTUFYTE9HUzsgaSsrKQorICB7IGlmIChzb2FwLT5sb2dmaWxlW2ldKQorICAgIHsgU09BUF9GUkVFKHNvYXAsICh2b2lkKilzb2FwLT5sb2dmaWxlW2ldKTsKKyAgICAgIHNvYXAtPmxvZ2ZpbGVbaV0gPSBOVUxMOworICAgIH0KKyAgICBzb2FwX2Nsb3NlX2xvZ2ZpbGUoc29hcCwgaSk7CisgIH0KKyAgc29hcF9mcmVlX21odChzb2FwKTsKKyAgc29hcC0+c3RhdGUgPSAwOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9jbGVhbnVwKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwX2RvbmUoc29hcCk7CisjaWZkZWYgV0lOMzIKKyAgaWYgKCF0Y3BfZG9uZSkKKyAgICByZXR1cm47CisgIHRjcF9kb25lID0gMDsKKyAgV1NBQ2xlYW51cCgpOworI2VuZGlmCit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY29uc3QgY2hhcioKK3RjcF9lcnJvcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqbXNnID0gTlVMTDsKKyAgc3dpdGNoIChzb2FwLT5lcnJtb2RlKQorICB7IGNhc2UgMDoKKyAgICAgIG1zZyA9IHNvYXBfc3RyZXJyb3Ioc29hcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICBtc2cgPSAiV1NBU3RhcnR1cCBmYWlsZWQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgIHsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICBtc2cgPSBzb2FwX3N0cl9jb2RlKGhfZXJyb3JfY29kZXMsIHNvYXAtPmVycm51bSk7CisgICAgICBpZiAoIW1zZykKKyNlbmRpZgorICAgICAgeyBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIlRDUC9VRFAgSVAgZXJyb3IgJWQiLCBzb2FwLT5lcnJudW0pOworICAgICAgICBtc2cgPSBzb2FwLT5tc2didWY7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBtc2c7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBjb25zdCBjaGFyKgoraHR0cF9lcnJvcihzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0YXR1cykKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqbXNnID0gU09BUF9TVFJfRU9TOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgbXNnID0gc29hcF9zdHJfY29kZShoX2h0dHBfZXJyb3JfY29kZXMsIHN0YXR1cyk7CisgIGlmICghbXNnKQorICAgIG1zZyA9IFNPQVBfU1RSX0VPUzsKKyNlbmRpZgorICByZXR1cm4gbXNnOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9JUFY2CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3RjcF9nZXRob3N0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICphZGRyLCBzdHJ1Y3QgaW5fYWRkciAqaW5hZGRyKQoreyBzb2FwX2ludDMyIGlhZGQgPSAtMTsKKyAgc3RydWN0IGhvc3RlbnQgaG9zdGVudCwgKmhvc3QgPSAmaG9zdGVudDsKKyNpZmRlZiBWWFdPUktTCisgIGludCBob3N0aW50OworICAvKiBpbmV0X2FkZHIoKSwgYW5kIGhvc3RHZXRCeU5hbWUoKSBleHBlY3QgImNoYXIgKiI7IGFkZHIgaXMgYSAiY29uc3QgY2hhciAqIi4gKi8KKyAgaWFkZCA9IGluZXRfYWRkcigoY2hhciopYWRkcik7CisjZWxzZQorI2lmIGRlZmluZWQoX0FJWFZFUlNJT05fNDMxKSB8fCBkZWZpbmVkKFRSVTY0KQorICBzdHJ1Y3QgaG9zdGVudF9kYXRhIGh0X2RhdGE7CisjZW5kaWYKKyNpZmRlZiBBUzQwMAorICBpYWRkID0gaW5ldF9hZGRyKCh2b2lkKilhZGRyKTsKKyNlbHNlCisgIGlhZGQgPSBpbmV0X2FkZHIoYWRkcik7CisjZW5kaWYKKyNlbmRpZgorICBpZiAoaWFkZCAhPSAtMSkKKyAgeyBtZW1jcHkoaW5hZGRyLCAmaWFkZCwgc2l6ZW9mKGlhZGQpKTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2lmIGRlZmluZWQoX19HTElCQ19fKQorICBpZiAoZ2V0aG9zdGJ5bmFtZV9yKGFkZHIsICZob3N0ZW50LCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOLCAmaG9zdCwgJnNvYXAtPmVycm51bSkgPCAwKQorICAgIGhvc3QgPSBOVUxMOworI2VsaWYgZGVmaW5lZChfQUlYVkVSU0lPTl80MzEpIHx8IGRlZmluZWQoVFJVNjQpCisgIG1lbXNldCgodm9pZCopJmh0X2RhdGEsIDAsIHNpemVvZihodF9kYXRhKSk7CisgIGlmIChnZXRob3N0YnluYW1lX3IoYWRkciwgJmhvc3RlbnQsICZodF9kYXRhKSA8IDApCisgIHsgaG9zdCA9IE5VTEw7CisgICAgc29hcC0+ZXJybnVtID0gaF9lcnJubzsKKyAgfQorI2VsaWYgZGVmaW5lZChIQVZFX0dFVEhPU1RCWU5BTUVfUikKKyAgaG9zdCA9IGdldGhvc3RieW5hbWVfcihhZGRyLCAmaG9zdGVudCwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTiwgJnNvYXAtPmVycm51bSk7CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgIC8qIElmIHRoZSBETlMgcmVzb2x2ZXIgbGlicmFyeSByZXNvbHZMaWIgaGFzIGJlZW4gY29uZmlndXJlZCBpbiB0aGUgdnhXb3JrcworICAgKiBpbWFnZSwgYSBxdWVyeSBmb3IgdGhlIGhvc3QgSVAgYWRkcmVzcyBpcyBzZW50IHRvIHRoZSBETlMgc2VydmVyLCBpZiB0aGUKKyAgICogbmFtZSB3YXMgbm90IGZvdW5kIGluIHRoZSBsb2NhbCBob3N0IHRhYmxlLiAqLworICBob3N0aW50ID0gaG9zdEdldEJ5TmFtZSgoY2hhciopYWRkcik7CisgIGlmIChob3N0aW50ID09IEVSUk9SKQorICB7IGhvc3QgPSBOVUxMOworICAgIHNvYXAtPmVycm51bSA9IHNvYXBfZXJybm87IAorICB9CisjZWxzZQorI2lmZGVmIEFTNDAwCisgIGlmICghKGhvc3QgPSBnZXRob3N0YnluYW1lKCh2b2lkKilhZGRyKSkpCisgICAgc29hcC0+ZXJybnVtID0gaF9lcnJubzsKKyNlbHNlCisgIGlmICghKGhvc3QgPSBnZXRob3N0YnluYW1lKGFkZHIpKSkKKyAgICBzb2FwLT5lcnJudW0gPSBoX2Vycm5vOworI2VuZGlmCisjZW5kaWYKKyAgaWYgKCFob3N0KQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSG9zdCBuYW1lIG5vdCBmb3VuZFxuIikpOworICAgIHJldHVybiBTT0FQX0VSUjsKKyAgfQorI2lmZGVmIFZYV09SS1MKKyAgaW5hZGRyLT5zX2FkZHIgPSBob3N0aW50OworI2Vsc2UKKyAgbWVtY3B5KGluYWRkciwgaG9zdC0+aF9hZGRyLCBob3N0LT5oX2xlbmd0aCk7CisjZW5kaWYKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3RjcF9jb25uZWN0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICplbmRwb2ludCwgY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQpCit7CisjaWZkZWYgV0lUSF9JUFY2CisgIHN0cnVjdCBhZGRyaW5mbyBoaW50cywgKnJlcywgKnJlc3NhdmU7CisgIGludCBlcnI7CisjZW5kaWYKKyAgcmVnaXN0ZXIgaW50IGZkOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaW50IGxlbiA9IFNPQVBfQlVGTEVOOworICBpbnQgc2V0ID0gMTsKKyNlbmRpZgorICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCk7CisgIHNvYXAtPnNvY2tldCA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIGlmICh0Y3BfaW5pdChzb2FwKSkKKyAgeyBzb2FwLT5lcnJudW0gPSAwOworICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJUQ1AgaW5pdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBzb2FwLT5lcnJtb2RlID0gMDsKKyNpZmRlZiBXSVRIX0lQVjYKKyAgbWVtc2V0KCh2b2lkKikmaGludHMsIDAsIHNpemVvZihoaW50cykpOworICBoaW50cy5haV9mYW1pbHkgPSBQRl9VTlNQRUM7CisjaWZkZWYgV0lUSF9VRFAKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfREdSQU07CisgIGVsc2UKKyNlbmRpZgorICAgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisgIHNvYXAtPmVycm1vZGUgPSAyOworICBpZiAoc29hcC0+cHJveHlfaG9zdCkKKyAgICBlcnIgPSBnZXRhZGRyaW5mbyhzb2FwLT5wcm94eV9ob3N0LCBzb2FwX2ludDJzKHNvYXAsIHNvYXAtPnByb3h5X3BvcnQpLCAmaGludHMsICZyZXMpOworICBlbHNlCisgICAgZXJyID0gZ2V0YWRkcmluZm8oaG9zdCwgc29hcF9pbnQycyhzb2FwLCBwb3J0KSwgJmhpbnRzLCAmcmVzKTsKKyAgaWYgKGVycikKKyAgeyBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgZ2FpX3N0cmVycm9yKGVyciksICJnZXRhZGRyaW5mbyBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICByZXNzYXZlID0gcmVzOworYWdhaW46CisgIGZkID0gKGludClzb2NrZXQocmVzLT5haV9mYW1pbHksIHJlcy0+YWlfc29ja3R5cGUsIHJlcy0+YWlfcHJvdG9jb2wpOworICBzb2FwLT5lcnJtb2RlID0gMDsKKyNlbHNlCisjaWZkZWYgV0lUSF9VRFAKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICBmZCA9IChpbnQpc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworICBlbHNlCisjZW5kaWYKKyAgICBmZCA9IChpbnQpc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKyNlbmRpZgorICBpZiAoZmQgPCAwKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzb2NrZXQgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNpZmRlZiBTT0NLRVRfQ0xPU0VfT05fRVhFQworI2lmZGVmIFdJTjMyCisjaWZuZGVmIFVOREVSX0NFCisgIFNldEhhbmRsZUluZm9ybWF0aW9uKChIQU5ETEUpZmQsIEhBTkRMRV9GTEFHX0lOSEVSSVQsIDApOworI2VuZGlmCisjZWxzZQorICBmY250bChmZCwgRl9TRVRGRCwgMSk7CisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPmNvbm5lY3RfZmxhZ3MgJiBTT19MSU5HRVIpCisgIHsgc3RydWN0IGxpbmdlciBsaW5nZXI7CisgICAgbWVtc2V0KCh2b2lkKikmbGluZ2VyLCAwLCBzaXplb2YobGluZ2VyKSk7CisgICAgbGluZ2VyLmxfb25vZmYgPSAxOworICAgIGxpbmdlci5sX2xpbmdlciA9IDA7CisgICAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKWZkLCBTT0xfU09DS0VULCBTT19MSU5HRVIsIChjaGFyKikmbGluZ2VyLCBzaXplb2Yoc3RydWN0IGxpbmdlcikpKQorICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19MSU5HRVIgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgIH0KKyAgfQorICBpZiAoKHNvYXAtPmNvbm5lY3RfZmxhZ3MgJiB+U09fTElOR0VSKSAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClmZCwgU09MX1NPQ0tFVCwgc29hcC0+Y29ubmVjdF9mbGFncyAmIH5TT19MSU5HRVIsIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgaWYgKHNvYXAtPmtlZXBfYWxpdmUgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpZmQsIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19LRUVQQUxJVkUgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKWZkLCBTT0xfU09DS0VULCBTT19TTkRCVUYsIChjaGFyKikmbGVuLCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fU05EQlVGIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIGlmIChzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClmZCwgU09MX1NPQ0tFVCwgU09fUkNWQlVGLCAoY2hhciopJmxlbiwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX1JDVkJVRiBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorI2lmZGVmIFRDUF9OT0RFTEFZCisgIGlmICghKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKWZkLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgVENQX05PREVMQVkgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNlbmRpZgorI2VuZGlmCisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJPcGVuaW5nIHNvY2tldCAlZCB0byBob3N0PSclcycgcG9ydD0lZFxuIiwgZmQsIGhvc3QsIHBvcnQpKTsKKyNpZm5kZWYgV0lUSF9JUFY2CisgIHNvYXAtPnBlZXJsZW4gPSBzaXplb2Yoc29hcC0+cGVlcik7CisgIG1lbXNldCgodm9pZCopJnNvYXAtPnBlZXIsIDAsIHNpemVvZihzb2FwLT5wZWVyKSk7CisgIHNvYXAtPnBlZXIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgIHNvYXAtPmVycm1vZGUgPSAyOworICBpZiAoc29hcC0+cHJveHlfaG9zdCkKKyAgeyBpZiAoc29hcC0+ZnJlc29sdmUoc29hcCwgc29hcC0+cHJveHlfaG9zdCwgJnNvYXAtPnBlZXIuc2luX2FkZHIpKQorICAgIHsgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImdldCBwcm94eSBob3N0IGJ5IG5hbWUgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgIH0KKyAgICBzb2FwLT5wZWVyLnNpbl9wb3J0ID0gaHRvbnMoKHNob3J0KXNvYXAtPnByb3h5X3BvcnQpOworICB9CisgIGVsc2UKKyAgeyBpZiAoc29hcC0+ZnJlc29sdmUoc29hcCwgaG9zdCwgJnNvYXAtPnBlZXIuc2luX2FkZHIpKQorICAgIHsgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImdldCBob3N0IGJ5IG5hbWUgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgIH0KKyAgICBzb2FwLT5wZWVyLnNpbl9wb3J0ID0gaHRvbnMoKHNob3J0KXBvcnQpOworICB9CisgIHNvYXAtPmVycm1vZGUgPSAwOworICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIHJldHVybiBmZDsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPmNvbm5lY3RfdGltZW91dCkKKyNpZiBkZWZpbmVkKFdJTjMyKQorICB7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAmbm9uYmxvY2tpbmcpOworICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgIHsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICBpb2N0bCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sIChpbnQpKCZub25ibG9ja2luZykpOyAvKiBtb2RpZmllZCB0byB1c2UgZmQgKi8KKyAgfQorI2Vsc2UKKyAgICBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9HRVRGTCl8T19OT05CTE9DSyk7CisjZW5kaWYKKyAgZWxzZQorI2lmIGRlZmluZWQoV0lOMzIpCisgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sICZibG9ja2luZyk7CisgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgIGlvY3RsKChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgKGludCkoJmJsb2NraW5nKSk7CisgIH0KKyNlbHNlCisgICAgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfR0VURkwpJn5PX05PTkJMT0NLKTsKKyNlbmRpZgorI2VuZGlmCisgIGZvciAoOzspCisgIHsgCisjaWZkZWYgV0lUSF9JUFY2CisgICAgaWYgKGNvbm5lY3QoKFNPQVBfU09DS0VUKWZkLCByZXMtPmFpX2FkZHIsIHJlcy0+YWlfYWRkcmxlbikpCisjZWxzZQorICAgIGlmIChjb25uZWN0KChTT0FQX1NPQ0tFVClmZCwgKHN0cnVjdCBzb2NrYWRkciopJnNvYXAtPnBlZXIsIHNpemVvZihzb2FwLT5wZWVyKSkpCisjZW5kaWYKKyAgICB7IAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQgJiYgKHNvYXBfc29ja2V0X2Vycm5vID09IFNPQVBfRUlOUFJPR1JFU1MgfHwgc29hcF9zb2NrZXRfZXJybm8gPT0gU09BUF9FV09VTERCTE9DSykpCisgICAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICAgIFNPQVBfU09DS0xFTl9UIGs7CisgICAgICAgIGZkX3NldCBmZHM7CisgICAgICAgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQgPiAwKQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gc29hcC0+Y29ubmVjdF90aW1lb3V0OworICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gLXNvYXAtPmNvbm5lY3RfdGltZW91dC8xMDAwMDAwOworICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IC1zb2FwLT5jb25uZWN0X3RpbWVvdXQlMTAwMDAwMDsKKyAgICAgICAgfQorICAgICAgICBGRF9aRVJPKCZmZHMpOworICAgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKWZkLCAmZmRzKTsKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeyBpbnQgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKGZkICsgMSksIE5VTEwsICZmZHMsIE5VTEwsICZ0aW1lb3V0KTsKKyAgICAgICAgICBpZiAociA+IDApCisJICAgIGJyZWFrOworICAgICAgICAgIGlmICghcikKKyAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IDA7CisgICAgICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvbm5lY3QgdGltZW91dFxuIikpOworICAgICAgICAgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsICJUaW1lb3V0IiwgImNvbm5lY3QgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUikKKyAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgY29ubmVjdCB0byBob3N0XG4iKSk7CisgICAgICAgICAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiY29ubmVjdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgICAgfQorICAgICAgICB9CisJayA9IChTT0FQX1NPQ0tMRU5fVClzaXplb2Yoc29hcC0+ZXJybnVtKTsKKyAgICAgICAgaWYgKCFnZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClmZCwgU09MX1NPQ0tFVCwgU09fRVJST1IsIChjaGFyKikmc29hcC0+ZXJybnVtLCAmaykgJiYgIXNvYXAtPmVycm51bSkJLyogcG9ydGFiaWxpdHkgbm90ZTogc2VlIFNPQVBfU09DS0xFTl9UIGRlZmluaXRpb24gaW4gc3Rkc29hcDIuaCAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBjb25uZWN0IHRvIGhvc3RcbiIpKTsKKyAgICAgICAgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJjb25uZWN0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgICBlbHNlCisjZW5kaWYKKyNpZmRlZiBXSVRIX0lQVjYKKyAgICAgIGlmIChyZXMtPmFpX25leHQpCisgICAgICB7IHJlcyA9IHJlcy0+YWlfbmV4dDsKKyAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIGdvdG8gYWdhaW47CisgICAgICB9CisgICAgICBlbHNlCisjZW5kaWYKKyAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSKQorICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgY29ubmVjdCB0byBob3N0XG4iKSk7CisgICAgICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJjb25uZWN0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgfSAgCisgICAgZWxzZQorICAgICAgYnJlYWs7CisgIH0KKyNpZmRlZiBXSVRIX0lQVjYKKyAgc29hcC0+cGVlcmxlbiA9IDA7IC8qIElQdjY6IGFscmVhZHkgY29ubmVjdGVkIHNvIHVzZSBzZW5kKCkgKi8KKyAgZnJlZWFkZHJpbmZvKHJlc3NhdmUpOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0KQorI2lmIGRlZmluZWQoV0lOMzIpCisgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sICZibG9ja2luZyk7CisgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgIGlvY3RsKChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgKGludCkoJmJsb2NraW5nKSk7CisgIH0KKyNlbHNlCisgICAgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfR0VURkwpJn5PX05PTkJMT0NLKTsKKyNlbmRpZgorI2VuZGlmCisgIHNvYXAtPnNvY2tldCA9IGZkOworICBzb2FwLT5pbW9kZSAmPSB+U09BUF9FTkNfU1NMOworICBzb2FwLT5vbW9kZSAmPSB+U09BUF9FTkNfU1NMOworICBpZiAoIXN0cm5jbXAoZW5kcG9pbnQsICJodHRwczoiLCA2KSkKKyAgeworI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgIEJJTyAqYmlvOworICAgIGludCByOworICAgIGlmIChzb2FwLT5wcm94eV9ob3N0KQorICAgIHsgc2hvcnQgdjsKKyAgICAgIHVuc2lnbmVkIGludCBrID0gc29hcC0+b21vZGU7IC8qIG1ha2Ugc3VyZSB3ZSBvbmx5IHBhcnNlIEhUVFAgKi8KKyAgICAgIHNpemVfdCBuID0gc29hcC0+Y291bnQ7IC8qIHNhdmUgdGhlIGNvbnRlbnQgbGVuZ3RoICovCisgICAgICBjaGFyICp1c2VyaWQsICpwYXNzd2Q7CisgICAgICBzb2FwLT5vbW9kZSAmPSB+U09BUF9FTkM7IC8qIG1hc2sgSU8gYW5kIEVOQyAqLworICAgICAgc29hcC0+b21vZGUgfD0gU09BUF9JT19CVUZGRVI7CisgICAgICBzb2FwX2JlZ2luX3NlbmQoc29hcCk7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvbm5lY3RpbmcgdG8gcHJveHkgc2VydmVyXG4iKSk7CisgICAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIkNPTk5FQ1QgJXM6JWQgSFRUUC8lcyIsIGhvc3QsIHBvcnQsIHNvYXAtPmh0dHBfdmVyc2lvbik7CisgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgc29hcC0+dG1wYnVmLCBOVUxMKSkpCisgICAgICB7IHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICBpZiAoc29hcC0+cHJveHlfdXNlcmlkICYmIHNvYXAtPnByb3h5X3Bhc3N3ZCAmJiBzdHJsZW4oc29hcC0+cHJveHlfdXNlcmlkKSArIHN0cmxlbihzb2FwLT5wcm94eV9wYXNzd2QpIDwgNzYxKQorICAgICAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIDI2MiwgIiVzOiVzIiwgc29hcC0+cHJveHlfdXNlcmlkLCBzb2FwLT5wcm94eV9wYXNzd2QpOworICAgICAgICBzdHJjcHkoc29hcC0+dG1wYnVmLCAiQmFzaWMgIik7CisgICAgICAgIHNvYXBfczJiYXNlNjQoc29hcCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKShzb2FwLT50bXBidWYgKyAyNjIpLCBzb2FwLT50bXBidWYgKyA2LCBzdHJsZW4oc29hcC0+dG1wYnVmICsgMjYyKSk7CisgICAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiUHJveHktQXV0aG9yaXphdGlvbiIsIHNvYXAtPnRtcGJ1ZikpKQorICAgICAgICB7IHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgTlVMTCwgTlVMTCkpCisgICAgICAgfHwgc29hcF9mbHVzaChzb2FwKSkKKyAgICAgIHsgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgICAgc29hcC0+b21vZGUgPSBrOworICAgICAgayA9IHNvYXAtPmltb2RlOworICAgICAgc29hcC0+aW1vZGUgJj0gflNPQVBfRU5DOyAvKiBtYXNrIElPIGFuZCBFTkMgKi8KKyAgICAgIHYgPSBzb2FwLT52ZXJzaW9uOyAvKiBwcmVzZXJ2ZSAqLworICAgICAgdXNlcmlkID0gc29hcC0+dXNlcmlkOyAvKiBwcmVzZXJ2ZSAqLworICAgICAgcGFzc3dkID0gc29hcC0+cGFzc3dkOyAvKiBwcmVzZXJ2ZSAqLworICAgICAgaWYgKHNvYXBfYmVnaW5fcmVjdihzb2FwKSkKKyAgICAgIHsgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgICAgc29hcC0+dXNlcmlkID0gdXNlcmlkOyAvKiByZXN0b3JlICovCisgICAgICBzb2FwLT5wYXNzd2QgPSBwYXNzd2Q7IC8qIHJlc3RvcmUgKi8KKyAgICAgIHNvYXAtPnZlcnNpb24gPSB2OyAvKiByZXN0b3JlICovCisgICAgICBzb2FwLT5pbW9kZSA9IGs7IC8qIHJlc3RvcmUgKi8KKyAgICAgIHNvYXAtPmNvdW50ID0gbjsgLyogcmVzdG9yZSAqLworICAgICAgc29hcF9iZWdpbl9zZW5kKHNvYXApOworICAgIH0KKyAgICBpZiAoIXNvYXAtPmN0eCAmJiAoc29hcC0+ZXJyb3IgPSBzb2FwLT5mc3NsYXV0aChzb2FwKSkpCisgICAgeyBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJTU0wgYXV0aGVudGljYXRpb24gZmFpbGVkIGluIHRjcF9jb25uZWN0KCk6IGNoZWNrIHBhc3N3b3JkLCBrZXkgZmlsZSwgYW5kIGNhIGZpbGUuIiwgU09BUF9TU0xfRVJST1IpOworICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisgICAgc29hcC0+c3NsID0gU1NMX25ldyhzb2FwLT5jdHgpOworICAgIGlmICghc29hcC0+c3NsKQorICAgIHsgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfU1NMX0VSUk9SOworICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorICAgIGlmIChzb2FwLT5zZXNzaW9uKQorICAgIHsgaWYgKCFzdHJjbXAoc29hcC0+c2Vzc2lvbl9ob3N0LCBob3N0KSAmJiBzb2FwLT5zZXNzaW9uX3BvcnQgPT0gcG9ydCkKKyAgICAgICAgU1NMX3NldF9zZXNzaW9uKHNvYXAtPnNzbCwgc29hcC0+c2Vzc2lvbik7CisgICAgICBTU0xfU0VTU0lPTl9mcmVlKHNvYXAtPnNlc3Npb24pOworICAgICAgc29hcC0+c2Vzc2lvbiA9IE5VTEw7CisgICAgfQorICAgIHNvYXAtPmltb2RlIHw9IFNPQVBfRU5DX1NTTDsKKyAgICBzb2FwLT5vbW9kZSB8PSBTT0FQX0VOQ19TU0w7CisgICAgYmlvID0gQklPX25ld19zb2NrZXQoKFNPQVBfU09DS0VUKWZkLCBCSU9fTk9DTE9TRSk7CisgICAgU1NMX3NldF9iaW8oc29hcC0+c3NsLCBiaW8sIGJpbyk7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQpCisjaWYgZGVmaW5lZChXSU4zMikKKyAgICB7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sICZub25ibG9ja2luZyk7CisgICAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICAgIHsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICAgIGlvY3RsKChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgKGludCkoJm5vbmJsb2NraW5nKSk7CisgICAgfQorI2Vsc2UKKyAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX0dFVEZMKXxPX05PTkJMT0NLKTsKKyNlbmRpZgorI2VuZGlmCisgICAgZm9yICg7OykKKyAgICB7IGlmICgociA9IFNTTF9jb25uZWN0KHNvYXAtPnNzbCkpIDw9IDApCisgICAgICB7IGludCBlcnIgPSBTU0xfZ2V0X2Vycm9yKHNvYXAtPnNzbCwgcik7CisgICAgICAgIGlmIChlcnIgIT0gU1NMX0VSUk9SX05PTkUgJiYgZXJyICE9IFNTTF9FUlJPUl9XQU5UX1JFQUQgJiYgZXJyICE9IFNTTF9FUlJPUl9XQU5UX1dSSVRFKQorICAgICAgICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCBzc2xfZXJyb3Ioc29hcCwgciksICJTU0wgY29ubmVjdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0KQorICAgICAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICAgICAgZmRfc2V0IGZkczsKKyAgICAgICAgICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0ID4gMCkKKyAgICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gc29hcC0+Y29ubmVjdF90aW1lb3V0OworICAgICAgICAgICAgdGltZW91dC50dl91c2VjID0gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSAtc29hcC0+Y29ubmVjdF90aW1lb3V0LzEwMDAwMDA7CisgICAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAtc29hcC0+Y29ubmVjdF90aW1lb3V0JTEwMDAwMDA7CisgICAgICAgICAgfQorICAgICAgICAgIEZEX1pFUk8oJmZkcyk7CisgICAgICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClmZCwgJmZkcyk7CisgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICB7IGludCByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoZmQgKyAxKSwgJmZkcywgTlVMTCwgJmZkcywgJnRpbWVvdXQpOworICAgICAgICAgICAgaWYgKHIgPiAwKQorCSAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKCFyKQorICAgICAgICAgICAgeyBzb2FwLT5lcnJudW0gPSAwOworICAgICAgICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvbm5lY3QgdGltZW91dFxuIikpOworICAgICAgICAgICAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgIlRpbWVvdXQiLCAiY29ubmVjdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgICAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKwkgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQpCisjaWZkZWYgV0lOMzIKKyAgICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sICZibG9ja2luZyk7CisgICAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICAgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICAgIGlvY3RsKChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgKGludCkoJmJsb2NraW5nKSk7CisgICAgfQorI2Vsc2UKKyAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX0dFVEZMKSZ+T19OT05CTE9DSyk7CisjZW5kaWYKKyNlbmRpZgorICAgIGlmIChzb2FwLT5yZXF1aXJlX3NlcnZlcl9hdXRoKQorICAgIHsgWDUwOSAqcGVlcjsKKyAgICAgIGludCBlcnI7CisgICAgICBpZiAoKGVyciA9IFNTTF9nZXRfdmVyaWZ5X3Jlc3VsdChzb2FwLT5zc2wpKSAhPSBYNTA5X1ZfT0spCisgICAgICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCBYNTA5X3ZlcmlmeV9jZXJ0X2Vycm9yX3N0cmluZyhlcnIpLCAiU1NMIGNlcnRpZmljYXRlIHByZXNlbnRlZCBieSBwZWVyIGNhbm5vdCBiZSB2ZXJpZmllZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9TU0xfRVJST1IpOworICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgICBwZWVyID0gU1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKHNvYXAtPnNzbCk7CisgICAgICBpZiAoIXBlZXIpCisgICAgICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIk5vIFNTTCBjZXJ0aWZpY2F0ZSB3YXMgcHJlc2VudGVkIGJ5IHRoZSBwZWVyIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyAgICAgIFg1MDlfTkFNRV9nZXRfdGV4dF9ieV9OSUQoWDUwOV9nZXRfc3ViamVjdF9uYW1lKHBlZXIpLCBOSURfY29tbW9uTmFtZSwgc29hcC0+bXNnYnVmLCBzaXplb2Yoc29hcC0+bXNnYnVmKSk7CisgICAgICBYNTA5X2ZyZWUocGVlcik7CisgICAgICBpZiAoc29hcF90YWdfY21wKHNvYXAtPm1zZ2J1ZiwgaG9zdCkpCisgICAgICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIlNTTCBjZXJ0aWZpY2F0ZSBob3N0IG5hbWUgbWlzbWF0Y2ggaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1NTTF9FUlJPUjsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyNlbmRpZgorICB9CisgIHJldHVybiBmZDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9iaW5kKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpob3N0LCBpbnQgcG9ydCwgaW50IGJhY2tsb2cpCit7CisjaWZkZWYgV0lUSF9JUFY2CisgIHN0cnVjdCBhZGRyaW5mbyAqYWRkcmluZm8gPSBOVUxMOworICBzdHJ1Y3QgYWRkcmluZm8gaGludHM7CisgIHN0cnVjdCBhZGRyaW5mbyByZXM7CisgIGludCBlcnI7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGludCBsZW4gPSBTT0FQX0JVRkxFTjsKKyAgaW50IHNldCA9IDE7CisjZW5kaWYKKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikpCisgIHsgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIpOworICAgIHNvYXAtPm1hc3RlciA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgc29hcC0+c29ja2V0ID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgc29hcC0+ZXJybW9kZSA9IDE7CisgIGlmICh0Y3BfaW5pdChzb2FwKSkKKyAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJUQ1AgaW5pdCBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNpZmRlZiBXSVRIX0lQVjYKKyAgbWVtc2V0KCh2b2lkKikmaGludHMsIDAsIHNpemVvZihoaW50cykpOworICBoaW50cy5haV9mYW1pbHkgPSBQRl9VTlNQRUM7CisjaWZkZWYgV0lUSF9VRFAKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfREdSQU07CisgIGVsc2UKKyNlbmRpZgorICAgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisgIGhpbnRzLmFpX2ZsYWdzID0gQUlfUEFTU0lWRTsKKyAgc29hcC0+ZXJybW9kZSA9IDI7CisgIGVyciA9IGdldGFkZHJpbmZvKGhvc3QsIHNvYXBfaW50MnMoc29hcCwgcG9ydCksICZoaW50cywgJmFkZHJpbmZvKTsKKyAgaWYgKGFkZHJpbmZvKQorICB7IHJlcyA9ICphZGRyaW5mbzsKKyAgICBzb2FwLT5wZWVyID0gKigoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UqKWFkZHJpbmZvLT5haV9hZGRyKTsKKyAgICBzb2FwLT5wZWVybGVuID0gYWRkcmluZm8tPmFpX2FkZHJsZW47CisgICAgcmVzLmFpX2FkZHIgPSAoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlcjsKKyAgICByZXMuYWlfYWRkcmxlbiA9IHNvYXAtPnBlZXJsZW47CisgICAgZnJlZWFkZHJpbmZvKGFkZHJpbmZvKTsKKyAgfQorICBpZiAoZXJyKQorICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIGdhaV9zdHJlcnJvcihlcnIpLCAiZ2V0YWRkcmluZm8gZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIHNvYXAtPm1hc3RlciA9IHNvY2tldChyZXMuYWlfZmFtaWx5LCByZXMuYWlfc29ja3R5cGUsIHJlcy5haV9wcm90b2NvbCk7CisjZWxzZQorI2lmZGVmIFdJVEhfVURQCisgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgc29hcC0+bWFzdGVyID0gKGludClzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisgIGVsc2UKKyNlbmRpZgorICAgIHNvYXAtPm1hc3RlciA9IChpbnQpc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKyNlbmRpZgorICBzb2FwLT5lcnJtb2RlID0gMDsKKyAgaWYgKCFzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNvY2tldCBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNpZmRlZiBXSVRIX1VEUAorICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIHNvYXAtPnNvY2tldCA9IHNvYXAtPm1hc3RlcjsKKyNlbmRpZgorI2lmZGVmIFNPQ0tFVF9DTE9TRV9PTl9FWEVDCisjaWZkZWYgV0lOMzIKKyNpZm5kZWYgVU5ERVJfQ0UKKyAgU2V0SGFuZGxlSW5mb3JtYXRpb24oKEhBTkRMRSlzb2FwLT5tYXN0ZXIsIEhBTkRMRV9GTEFHX0lOSEVSSVQsIDApOworI2VuZGlmCisjZWxzZQorICBmY250bChzb2FwLT5tYXN0ZXIsIEZfU0VURkQsIDEpOworI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5iaW5kX2ZsYWdzICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgU09MX1NPQ0tFVCwgc29hcC0+YmluZF9mbGFncywgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBpZiAoKChzb2FwLT5pbW9kZSB8IHNvYXAtPm9tb2RlKSAmIFNPQVBfSU9fS0VFUEFMSVZFKSAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX0tFRVBBTElWRSBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgU09MX1NPQ0tFVCwgU09fU05EQlVGLCAoY2hhciopJmxlbiwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fU05EQlVGIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsIChjaGFyKikmbGVuLCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19SQ1ZCVUYgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisjaWZkZWYgVENQX05PREVMQVkKKyAgaWYgKCEoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBUQ1BfTk9ERUxBWSBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgV0lUSF9JUFY2CisgIHNvYXAtPmVycm1vZGUgPSAwOworICBpZiAoYmluZCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCByZXMuYWlfYWRkciwgcmVzLmFpX2FkZHJsZW4pKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IGJpbmQgdG8gaG9zdFxuIikpOworICAgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImJpbmQgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9ICAKKyNlbHNlCisgIHNvYXAtPnBlZXJsZW4gPSBzaXplb2Yoc29hcC0+cGVlcik7CisgIG1lbXNldCgodm9pZCopJnNvYXAtPnBlZXIsIDAsIHNpemVvZihzb2FwLT5wZWVyKSk7CisgIHNvYXAtPnBlZXIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgIHNvYXAtPmVycm1vZGUgPSAyOworICBpZiAoaG9zdCkKKyAgeyBpZiAoc29hcC0+ZnJlc29sdmUoc29hcCwgaG9zdCwgJnNvYXAtPnBlZXIuc2luX2FkZHIpKQorICAgIHsgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiZ2V0IGhvc3QgYnkgbmFtZSBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIHNvYXAtPnBlZXIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7CisgIHNvYXAtPnBlZXIuc2luX3BvcnQgPSBodG9ucygoc2hvcnQpcG9ydCk7CisgIHNvYXAtPmVycm1vZGUgPSAwOworICBpZiAoYmluZCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCAoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlciwgc29hcC0+cGVlcmxlbikpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgYmluZCB0byBob3N0XG4iKSk7CisgICAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiYmluZCBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNlbmRpZgorICBpZiAoIShzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSAmJiBsaXN0ZW4oKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgYmFja2xvZykpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgYmluZCB0byBob3N0XG4iKSk7CisgICAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAibGlzdGVuIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfSAgCisgIHJldHVybiBzb2FwLT5tYXN0ZXI7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcG9sbChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgCisjaWZuZGVmIFdJVEhfTEVBTgorICBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICBmZF9zZXQgcmZkLCBzZmQsIHhmZDsKKyAgaW50IHI7CisgIHRpbWVvdXQudHZfc2VjID0gMDsKKyAgdGltZW91dC50dl91c2VjID0gMDsKKyAgRkRfWkVSTygmcmZkKTsKKyAgRkRfWkVSTygmc2ZkKTsKKyAgRkRfWkVSTygmeGZkKTsKKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgIHsgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZyZmQpOworICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmc2ZkKTsKKyAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnhmZCk7CisgICAgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCAmcmZkLCAmc2ZkLCAmeGZkLCAmdGltZW91dCk7CisgICAgaWYgKHIgPiAwICYmIEZEX0lTU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZ4ZmQpKQorICAgICAgciA9IC0xOworICB9CisgIGVsc2UgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikpCisgIHsgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsICZzZmQpOworICAgIHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5tYXN0ZXIgKyAxKSwgTlVMTCwgJnNmZCwgTlVMTCwgJnRpbWVvdXQpOworICB9CisgIGVsc2UKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgaWYgKHIgPiAwKQorICB7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgICAgaWYgKHNvYXAtPmltb2RlICYgU09BUF9FTkNfU1NMKQorICAgIHsKKyAgICAgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpCisgICAgICAgJiYgRkRfSVNTRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnNmZCkKKyAgICAgICAmJiAoIUZEX0lTU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZyZmQpCisgICAgICAgIHx8IFNTTF9wZWVrKHNvYXAtPnNzbCwgc29hcC0+dG1wYnVmLCAxKSA+IDApKQorICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KQorICAgICAgICYmIEZEX0lTU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZzZmQpCisgICAgICAgJiYgKCFGRF9JU1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmcmZkKQorICAgICAgICB8fCByZWN2KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHNvYXAtPnRtcGJ1ZiwgMSwgTVNHX1BFRUspID4gMCkpCisgICAgICAgIHJldHVybiBTT0FQX09LOworICB9CisgIGVsc2UgaWYgKHIgPCAwKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIGlmICgoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSB8fCBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKSAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSKQorICAgIHsgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2VsZWN0IGZhaWxlZCBpbiBzb2FwX3BvbGwoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfVENQX0VSUk9SOworICAgIH0KKyAgfQorICBlbHNlCisgICAgc29hcC0+ZXJybnVtID0gMDsKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlBvbGxpbmc6IG90aGVyIGVuZCBkb3duIG9uIHNvY2tldD0lZCBzZWxlY3Q9JWRcbiIsIHNvYXAtPnNvY2tldCwgcikpOworICByZXR1cm4gU09BUF9FT0Y7CisjZWxzZQorICByZXR1cm4gU09BUF9PSzsKKyNlbmRpZgorfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAordGNwX2FjY2VwdChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHMsIHN0cnVjdCBzb2NrYWRkciAqYSwgaW50ICpuKQoreyBpbnQgZmQ7CisgIGZkID0gKGludClhY2NlcHQoKFNPQVBfU09DS0VUKXMsIGEsIChTT0FQX1NPQ0tMRU5fVCopbik7CS8qIHBvcnRhYmlsaXR5IG5vdGU6IHNlZSBTT0FQX1NPQ0tMRU5fVCBkZWZpbml0aW9uIGluIHN0ZHNvYXAyLmggKi8KKyNpZmRlZiBTT0NLRVRfQ0xPU0VfT05fRVhFQworI2lmZGVmIFdJTjMyCisjaWZuZGVmIFVOREVSX0NFCisgIFNldEhhbmRsZUluZm9ybWF0aW9uKChIQU5ETEUpZmQsIEhBTkRMRV9GTEFHX0lOSEVSSVQsIDApOworI2VuZGlmCisjZWxzZQorICBmY250bChmZCwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7CisjZW5kaWYKKyNlbmRpZgorICByZXR1cm4gZmQ7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYWNjZXB0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBpbnQgbiA9IChpbnQpc2l6ZW9mKHNvYXAtPnBlZXIpOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaW50IGxlbiA9IFNPQVBfQlVGTEVOOworICBpbnQgc2V0ID0gMTsKKyNlbmRpZgorICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisjaWZkZWYgV0lUSF9VRFAKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICByZXR1cm4gc29hcC0+c29ja2V0ID0gc29hcC0+bWFzdGVyOworI2VuZGlmCisgIG1lbXNldCgodm9pZCopJnNvYXAtPnBlZXIsIDAsIHNpemVvZihzb2FwLT5wZWVyKSk7CisgIHNvYXAtPnNvY2tldCA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIHNvYXAtPmVycm1vZGUgPSAwOworICBzb2FwLT5rZWVwX2FsaXZlID0gMDsKKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikpCisgIHsgZm9yICg7OykKKyAgICB7IAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIGlmIChzb2FwLT5hY2NlcHRfdGltZW91dCkKKyAgICAgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgICAgZmRfc2V0IGZkOworICAgICAgICBpZiAoc29hcC0+YWNjZXB0X3RpbWVvdXQgPiAwKQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gc29hcC0+YWNjZXB0X3RpbWVvdXQ7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSAtc29hcC0+YWNjZXB0X3RpbWVvdXQvMTAwMDAwMDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAtc29hcC0+YWNjZXB0X3RpbWVvdXQlMTAwMDAwMDsKKyAgICAgICAgfQorICAgICAgICBGRF9aRVJPKCZmZCk7CisgICAgICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCAmZmQpOworICAgICAgICBmb3IgKDs7KQorICAgICAgICB7IGludCByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+bWFzdGVyICsgMSksICZmZCwgJmZkLCBOVUxMLCAmdGltZW91dCk7CisgICAgICAgICAgaWYgKHIgPiAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgaWYgKCFyKQorICAgICAgICAgIHsgc29hcC0+ZXJybnVtID0gMDsKKyAgICAgICAgICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJUaW1lb3V0IiwgImFjY2VwdCBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUikKKyAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgICAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgICAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiYWNjZXB0IGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgICAgfQorICAgICAgICB9CisjaWYgZGVmaW5lZChXSU4zMikKKwl7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgICAgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRklPTkJJTywgJm5vbmJsb2NraW5nKTsKKyAgICAgICAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICAgICAgICB7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgICAgICAgaW9jdGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRklPTkJJTywgKGludCkoJm5vbmJsb2NraW5nKSk7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfR0VURkwpfE9fTk9OQkxPQ0spOworI2VuZGlmCisgICAgICB9CisgICAgICBlbHNlCisjaWYgZGVmaW5lZChXSU4zMikKKyAgICAgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICAgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRklPTkJJTywgJmJsb2NraW5nKTsKKyAgICAgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgICAgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICAgICAgaW9jdGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRklPTkJJTywgKGludCkoJmJsb2NraW5nKSk7CisgICAgICB9CisjZWxzZQorICAgICAgICBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGX0dFVEZMKSZ+T19OT05CTE9DSyk7CisjZW5kaWYKKyNlbmRpZgorICAgICAgc29hcC0+c29ja2V0ID0gc29hcC0+ZmFjY2VwdChzb2FwLCBzb2FwLT5tYXN0ZXIsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyLCAmbik7CisgICAgICBzb2FwLT5wZWVybGVuID0gKHNpemVfdCluOworICAgICAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgICAgICB7CisjaWZkZWYgV0lUSF9JUFY2CisvKiBVc2Ugc29hcC0+aG9zdCB0byBzdG9yZSB0aGUgbnVtZXJpYyBmb3JtIG9mIHRoZSByZW1vdGUgaG9zdCAqLworICAgICAgICBnZXRuYW1laW5mbygoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlciwgbiwgc29hcC0+aG9zdCwgc2l6ZW9mKHNvYXAtPmhvc3QpLCBOVUxMLCAwLCBOSV9OVU1FUklDSE9TVCB8IE5JX05VTUVSSUNTRVJWKTsgCisgICAgICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJBY2NlcHQgc29ja2V0ICVkIGZyb20gJXNcbiIsIHNvYXAtPnNvY2tldCwgc29hcC0+aG9zdCkpOworICAgICAgICBzb2FwLT5pcCA9IDA7IC8qIGluZm8gc3RvcmVkIGluIHNvYXAtPnBlZXIgYW5kIHNvYXAtPmhvc3QgKi8KKyAgICAgICAgc29hcC0+cG9ydCA9IDA7IC8qIGluZm8gc3RvcmVkIGluIHNvYXAtPnBlZXIgYW5kIHNvYXAtPmhvc3QgKi8KKyNlbHNlCisgICAgICAgIHNvYXAtPmlwID0gbnRvaGwoc29hcC0+cGVlci5zaW5fYWRkci5zX2FkZHIpOworICAgICAgICBzb2FwLT5wb3J0ID0gKGludCludG9ocyhzb2FwLT5wZWVyLnNpbl9wb3J0KTsgLyogZG9lcyBub3QgcmV0dXJuIHBvcnQgbnVtYmVyIG9uIHNvbWUgc3lzdGVtcyAqLworICAgICAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiQWNjZXB0IHNvY2tldCAlZCBhdCBwb3J0ICVkIGZyb20gSVAgJWQuJWQuJWQuJWRcbiIsIHNvYXAtPnNvY2tldCwgc29hcC0+cG9ydCwgKGludCkoc29hcC0+aXA+PjI0KSYweEZGLCAoaW50KShzb2FwLT5pcD4+MTYpJjB4RkYsIChpbnQpKHNvYXAtPmlwPj44KSYweEZGLCAoaW50KXNvYXAtPmlwJjB4RkYpKTsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKwlpZiAoc29hcC0+YWNjZXB0X2ZsYWdzICYgU09fTElOR0VSKQorICAgICAgICB7IHN0cnVjdCBsaW5nZXIgbGluZ2VyOworICAgICAgICAgIG1lbXNldCgodm9pZCopJmxpbmdlciwgMCwgc2l6ZW9mKGxpbmdlcikpOworICAgICAgICAgIGxpbmdlci5sX29ub2ZmID0gMTsKKyAgICAgICAgICBsaW5nZXIubF9saW5nZXIgPSAwOworCSAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgU09MX1NPQ0tFVCwgU09fTElOR0VSLCAoY2hhciopJmxpbmdlciwgc2l6ZW9mKHN0cnVjdCBsaW5nZXIpKSkKKyAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworCSAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX0xJTkdFUiBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKwkgICAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKwkgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKHNvYXAtPmFjY2VwdF9mbGFncyAmIH5TT19MSU5HRVIpICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgU09MX1NPQ0tFVCwgc29hcC0+YWNjZXB0X2ZsYWdzICYgflNPX0xJTkdFUiwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworCSAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCgoc29hcC0+aW1vZGUgfCBzb2FwLT5vbW9kZSkgJiBTT0FQX0lPX0tFRVBBTElWRSkgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBTT0xfU09DS0VULCBTT19LRUVQQUxJVkUsIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19LRUVQQUxJVkUgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisJICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBTT0xfU09DS0VULCBTT19TTkRCVUYsIChjaGFyKikmbGVuLCBzaXplb2YoaW50KSkpCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19TTkRCVUYgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisJICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsIChjaGFyKikmbGVuLCBzaXplb2YoaW50KSkpCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19SQ1ZCVUYgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisJICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgfQorI2lmZGVmIFRDUF9OT0RFTEFZCisgICAgICAgIGlmICghKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgVENQX05PREVMQVkgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisJICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgfQorI2VuZGlmCisjZW5kaWYKKyAgICAgICAgaWYgKHNvYXAtPmFjY2VwdF90aW1lb3V0KQorICAgICAgICB7CisjaWYgZGVmaW5lZChXSU4zMikKKyAgICAgICAgICB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgICAgICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZJT05CSU8sICZibG9ja2luZyk7CisgICAgICAgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRklPTkJJTywgJmJsb2NraW5nKTsKKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgICAgICAgICB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgICAgICAgIGlvY3RsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZJT05CSU8sIChpbnQpKCZibG9ja2luZykpOworICAgICAgICAgIGlvY3RsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZJT05CSU8sIChpbnQpKCZibG9ja2luZykpOworI2VsaWYgZGVmaW5lZChQQUxNKQorICAgICAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfR0VURkwsMCkmfk9fTk9OQkxPQ0spOworICAgICAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfR0VURkwsMCkmfk9fTk9OQkxPQ0spOworI2VsaWYgZGVmaW5lZChTWU1CSUFOKQorICAgICAgICAgIGxvbmcgYmxvY2tpbmcgPSAwOworICAgICAgICAgIGlvY3RsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIDAvKkZJT05CSU8qLywgJmJsb2NraW5nKTsKKyNlbHNlCisgICAgICAgICAgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRl9HRVRGTCkmfk9fTk9OQkxPQ0spOworICAgICAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfR0VURkwpJn5PX05PTkJMT0NLKTsKKyNlbmRpZgorCX0KKyAgICAgICAgc29hcC0+a2VlcF9hbGl2ZSA9ICgoKHNvYXAtPmltb2RlIHwgc29hcC0+b21vZGUpICYgU09BUF9JT19LRUVQQUxJVkUpICE9IDApOworICAgICAgICByZXR1cm4gc29hcC0+c29ja2V0OworICAgICAgfQorICAgICAgaWYgKHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FQUdBSU4pCisgICAgICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJBY2NlcHQgZmFpbGVkIGZyb20gJXNcbiIsIHNvYXAtPmhvc3QpKTsKKyAgICAgICAgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImFjY2VwdCBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKwlzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyAgeyBzb2FwLT5lcnJudW0gPSAwOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgIm5vIG1hc3RlciBzb2NrZXQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAordGNwX2Rpc2Nvbm5lY3Qoc3RydWN0IHNvYXAgKnNvYXApCit7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgIGlmIChzb2FwLT5zc2wpCisgIHsgaW50IHIsIHMgPSAwOworICAgIGlmIChzb2FwLT5zZXNzaW9uKQorICAgICAgU1NMX1NFU1NJT05fZnJlZShzb2FwLT5zZXNzaW9uKTsKKyAgICBpZiAoKnNvYXAtPmhvc3QpCisgICAgeyBzb2FwLT5zZXNzaW9uID0gU1NMX2dldDFfc2Vzc2lvbihzb2FwLT5zc2wpOworICAgICAgaWYgKHNvYXAtPnNlc3Npb24pCisgICAgICB7IHN0cmNweShzb2FwLT5zZXNzaW9uX2hvc3QsIHNvYXAtPmhvc3QpOworICAgICAgICBzb2FwLT5zZXNzaW9uX3BvcnQgPSBzb2FwLT5wb3J0OworICAgICAgfQorICAgIH0KKyAgICByID0gU1NMX3NodXRkb3duKHNvYXAtPnNzbCk7CisgICAgaWYgKHIgIT0gMSkKKyAgICB7IHMgPSBFUlJfZ2V0X2Vycm9yKCk7CisgICAgICBpZiAocykKKyAgICAgIHsgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgICAgICAgIHsgc29hcC0+ZnNodXRkb3duc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIDEpOworICAgICAgICAgIHNvYXAtPnNvY2tldCA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgIH0KKyAgICAgICAgciA9IFNTTF9zaHV0ZG93bihzb2FwLT5zc2wpOworICAgICAgfQorICAgIH0KKyAgICBEQkdMT0coVEVTVCwgaWYgKHMpIFNPQVBfTUVTU0FHRShmZGVidWcsICJTaHV0ZG93biBmYWlsZWQ6ICVkXG4iLCBTU0xfZ2V0X2Vycm9yKHNvYXAtPnNzbCwgcikpKTsKKyAgICBTU0xfZnJlZShzb2FwLT5zc2wpOworICAgIHNvYXAtPnNzbCA9IE5VTEw7CisgICAgaWYgKHMpCisgICAgICByZXR1cm4gU09BUF9TU0xfRVJST1I7CisgICAgRVJSX3JlbW92ZV9zdGF0ZSgwKTsKKyAgfQorI2VuZGlmCisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpICYmICEoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgIHsgc29hcC0+ZnNodXRkb3duc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIDIpOworICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0KTsKKyAgICBzb2FwLT5zb2NrZXQgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAordGNwX2Nsb3Nlc29ja2V0KHN0cnVjdCBzb2FwICpzb2FwLCBTT0FQX1NPQ0tFVCBmZCkKK3sgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDbG9zZSBzb2NrZXQgJWRcbiIsIChpbnQpZmQpKTsKKyAgcmV0dXJuIGNsb3Nlc29ja2V0KGZkKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3RjcF9zaHV0ZG93bnNvY2tldChzdHJ1Y3Qgc29hcCAqc29hcCwgU09BUF9TT0NLRVQgZmQsIGludCBob3cpCit7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2h1dGRvd24gc29ja2V0ICVkIGhvdz0lZFxuIiwgKGludClmZCwgaG93KSk7CisgIHJldHVybiBzaHV0ZG93bihmZCwgaG93KTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2Nsb3Nlc29jayhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IHN0YXR1cyA9IHNvYXAtPmVycm9yOworICBpZiAoc3RhdHVzID09IFNPQVBfRU9GIHx8IHN0YXR1cyA9PSBTT0FQX1RDUF9FUlJPUiB8fCBzdGF0dXMgPT0gU09BUF9TU0xfRVJST1IgfHwgIXNvYXAtPmtlZXBfYWxpdmUpCisgIHsgaWYgKHNvYXAtPmZjbG9zZSAmJiAoc29hcC0+ZXJyb3IgPSBzb2FwLT5mY2xvc2Uoc29hcCkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOworICB9CisjaWZkZWYgV0lUSF9aTElCCisgIGlmIChzb2FwLT56bGliX3N0YXRlID09IFNPQVBfWkxJQl9ERUZMQVRFKQorICAgIGRlZmxhdGVFbmQoJnNvYXAtPmRfc3RyZWFtKTsKKyAgZWxzZSBpZiAoc29hcC0+emxpYl9zdGF0ZSA9PSBTT0FQX1pMSUJfSU5GTEFURSkKKyAgICBpbmZsYXRlRW5kKCZzb2FwLT5kX3N0cmVhbSk7CisgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfTk9ORTsKKyNlbmRpZgorICByZXR1cm4gc29hcC0+ZXJyb3IgPSBzdGF0dXM7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorc2l6ZV90CitTT0FQX0ZNQUMyCitzb2FwX2hhc2gocmVnaXN0ZXIgY29uc3QgY2hhciAqcykKK3sgcmVnaXN0ZXIgc2l6ZV90IGggPSAwOworICB3aGlsZSAoKnMpCisgICAgaCA9IDY1NTk5KmggKyAqcysrOworICByZXR1cm4gaCAlIFNPQVBfSURIQVNIOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQKK3NvYXBfaW5pdF9waHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBpOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluaXRpYWxpemluZyBwb2ludGVyIGhhc2h0YWJsZVxuIikpOworICBzb2FwLT5wYmxrID0gTlVMTDsKKyAgc29hcC0+cGlkeCA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCAoaW50KVNPQVBfUFRSSEFTSDsgaSsrKQorICAgIHNvYXAtPnBodFtpXSA9IE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwKgorU09BUF9GTUFDMgorc29hcF9uZXcxKHNvYXBfbW9kZSBtb2RlKQoreyByZXR1cm4gc29hcF9uZXcyKG1vZGUsIG1vZGUpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc3RydWN0IHNvYXAqCitTT0FQX0ZNQUMyCitzb2FwX25ldygpCit7IHJldHVybiBzb2FwX25ldzIoU09BUF9JT19ERUZBVUxULCBTT0FQX0lPX0RFRkFVTFQpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc3RydWN0IHNvYXAqCitTT0FQX0ZNQUMyCitzb2FwX25ldzIoc29hcF9tb2RlIGltb2RlLCBzb2FwX21vZGUgb21vZGUpCit7IHN0cnVjdCBzb2FwICpzb2FwID0gKHN0cnVjdCBzb2FwKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2FwKSk7CisgIGlmIChzb2FwKQorICAgIHNvYXBfaW5pdDIoc29hcCwgaW1vZGUsIG9tb2RlKTsKKyAgcmV0dXJuIHNvYXA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2RlbChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgZnJlZShzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZAorc29hcF9mcmVlX3BodChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGJsayAqcGIsICpuZXh0OworICByZWdpc3RlciBpbnQgaTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIHBvaW50ZXIgaGFzaHRhYmxlXG4iKSk7CisgIGZvciAocGIgPSBzb2FwLT5wYmxrOyBwYjsgcGIgPSBuZXh0KQorICB7IG5leHQgPSBwYi0+bmV4dDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgcGIpOworICB9CisgIHNvYXAtPnBibGsgPSBOVUxMOworICBzb2FwLT5waWR4ID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IChpbnQpU09BUF9QVFJIQVNIOyBpKyspCisgICAgc29hcC0+cGh0W2ldID0gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbWJlZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCwgY29uc3Qgc3RydWN0IHNvYXBfYXJyYXkgKmEsIGludCBuLCBjb25zdCBjaGFyICp0YWcsIGludCB0eXBlKQoreyByZWdpc3RlciBpbnQgaTsKKyAgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICBpZiAoc29hcC0+dmVyc2lvbiAhPSAxKQorICAgIHNvYXAtPmVuY29kaW5nID0gMTsKKyAgaWYgKGEpCisgICAgaSA9IHNvYXBfYXJyYXlfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgYSwgbiwgdHlwZSwgJnBwKTsKKyAgZWxzZQorICAgIGkgPSBzb2FwX3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIHR5cGUsICZwcCk7CisgIGlmIChpKQorICB7IGlmIChzb2FwX2lzX2VtYmVkZGVkKHNvYXAsIHBwKQorICAgICB8fCBzb2FwX2lzX3NpbmdsZShzb2FwLCBwcCkpCisgICAgICByZXR1cm4gMDsKKyAgICBzb2FwX3NldF9lbWJlZGRlZChzb2FwLCBwcCk7CisgIH0KKyAgcmV0dXJuIGk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcG9pbnRlcl9sb29rdXAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnAsIGludCB0eXBlLCBzdHJ1Y3Qgc29hcF9wbGlzdCAqKnBwcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICAqcHBwID0gTlVMTDsKKyAgaWYgKHApCisgIHsgZm9yIChwcCA9IHNvYXAtPnBodFtzb2FwX2hhc2hfcHRyKHApXTsgcHA7IHBwID0gcHAtPm5leHQpCisgICAgeyBpZiAocHAtPnB0ciA9PSBwICYmIHBwLT50eXBlID09IHR5cGUpCisgICAgICB7ICpwcHAgPSBwcDsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJMb29rdXAgbG9jYXRpb249JXAgdHlwZT0lZCBpZD0lZFxuIiwgcCwgdHlwZSwgcHAtPmlkKSk7CisgICAgICAgIHJldHVybiBwcC0+aWQ7CisgICAgICB9CisgICAgfQorICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTG9va3VwIGxvY2F0aW9uPSVwIHR5cGU9JWQ6IG5vdCBmb3VuZFxuIiwgcCwgdHlwZSkpOworICByZXR1cm4gMDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wb2ludGVyX2VudGVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGludCB0eXBlLCBzdHJ1Y3Qgc29hcF9wbGlzdCAqKnBwcCkKK3sgcmVnaXN0ZXIgaW50IGg7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgaWYgKCFzb2FwLT5wYmxrIHx8IHNvYXAtPnBpZHggPj0gU09BUF9QVFJCTEspCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGJsayAqcGIgPSAoc3RydWN0IHNvYXBfcGJsayopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX3BibGspKTsKKyAgICBpZiAoIXBiKQorICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBwYi0+bmV4dCA9IHNvYXAtPnBibGs7CisgICAgc29hcC0+cGJsayA9IHBiOworICAgIHNvYXAtPnBpZHggPSAwOworICB9CisgICpwcHAgPSBwcCA9ICZzb2FwLT5wYmxrLT5wbGlzdFtzb2FwLT5waWR4KytdOworICBpZiAoYSkKKyAgICBoID0gc29hcF9oYXNoX3B0cihhLT5fX3B0cik7CisgIGVsc2UKKyAgICBoID0gc29hcF9oYXNoX3B0cihwKTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQb2ludGVyIGVudGVyIGxvY2F0aW9uPSVwIGFycmF5PSVwIHNpemU9JWQgZGltPSVkIHR5cGU9JWQgaWQ9JWRcbiIsIHAsIGE/YS0+X19wdHI6TlVMTCwgYT9hLT5fX3NpemU6MCwgbiwgdHlwZSwgc29hcC0+aWRudW0rMSkpOworICBwcC0+bmV4dCA9IHNvYXAtPnBodFtoXTsKKyAgcHAtPnR5cGUgPSB0eXBlOworICBwcC0+bWFyazEgPSAwOworICBwcC0+bWFyazIgPSAwOworICBwcC0+cHRyID0gcDsKKyAgcHAtPmFycmF5ID0gYTsKKyAgc29hcC0+cGh0W2hdID0gcHA7CisgIHBwLT5pZCA9ICsrc29hcC0+aWRudW07CisgIHJldHVybiBwcC0+aWQ7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYXJyYXlfcG9pbnRlcl9sb29rdXAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgbiwgaW50IHR5cGUsIHN0cnVjdCBzb2FwX3BsaXN0ICoqcHBwKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgICpwcHAgPSBOVUxMOworICBpZiAoIXAgfHwgIWEtPl9fcHRyKQorICAgIHJldHVybiAwOworICBmb3IgKHBwID0gc29hcC0+cGh0W3NvYXBfaGFzaF9wdHIoYS0+X19wdHIpXTsgcHA7IHBwID0gcHAtPm5leHQpCisgIHsgaWYgKHBwLT50eXBlID09IHR5cGUgJiYgcHAtPmFycmF5ICYmIHBwLT5hcnJheS0+X19wdHIgPT0gYS0+X19wdHIpCisgICAgeyByZWdpc3RlciBpbnQgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgIGlmICgoKGNvbnN0IGludCopJnBwLT5hcnJheS0+X19zaXplKVtpXSAhPSAoKGNvbnN0IGludCopJmEtPl9fc2l6ZSlbaV0pCisJICBicmVhazsKKyAgICAgIGlmIChpID09IG4pCisgICAgICB7ICpwcHAgPSBwcDsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJBcnJheSBsb29rdXAgbG9jYXRpb249JXAgdHlwZT0lZCBpZD0lZFxuIiwgYS0+X19wdHIsIHR5cGUsIHBwLT5pZCkpOworICAgICAgICByZXR1cm4gcHAtPmlkOworICAgICAgfQorICAgIH0KKyAgfQorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFycmF5IGxvb2t1cCBsb2NhdGlvbj0lcCB0eXBlPSVkOiBub3QgZm91bmRcbiIsIGEtPl9fcHRyLCB0eXBlKSk7CisgIHJldHVybiAwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYmVnaW5fY291bnQoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXBfY2xyX2F0dHIoc29hcCk7CisgIHNvYXBfc2V0X2xvY2FsX25hbWVzcGFjZXMoc29hcCk7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpIHx8IChzb2FwLT5vbW9kZSAmIFNPQVBfRU5DX0RJTUUpKQorICAgIHNvYXAtPm1vZGUgPSBzb2FwLT5vbW9kZSB8IFNPQVBfSU9fTEVOR1RIIHwgU09BUF9FTkNfRElNRTsKKyAgZWxzZQorI2VuZGlmCisgIHsgc29hcC0+bW9kZSA9IHNvYXAtPm9tb2RlOworICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fU1RPUkUKKyAgICAgfHwgKCgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTksgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpKQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICAgICAgJiYgIXNvYXAtPmZwcmVwYXJlc2VuZAorI2VuZGlmCisgICAgICApKQorICAgICAgc29hcC0+bW9kZSAmPSB+U09BUF9JT19MRU5HVEg7CisgICAgZWxzZQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX0xFTkdUSDsKKyAgfQorI2lmZGVmIFdJVEhfWkxJQgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fRkxVU0gpCisgIHsgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpKQorICAgICAgc29hcC0+bW9kZSAmPSB+U09BUF9JT19MRU5HVEg7CisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fQlVGRkVSOworICAgIGVsc2UKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19TVE9SRTsKKyAgfQorI2VuZGlmCisgIGlmICghc29hcC0+ZW5jb2RpbmdTdHlsZSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9HUkFQSCkpCisgICAgc29hcC0+bW9kZSB8PSBTT0FQX1hNTF9UUkVFOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpKQorICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfTUlNRTsKKyAgZWxzZQorICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX01UT007CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkKKyAgICBzb2FwX3NlbGVjdF9taW1lX2JvdW5kYXJ5KHNvYXApOworICBzb2FwLT5kaW1lLmxpc3QgPSBzb2FwLT5kaW1lLmxhc3Q7CS8qIGtlZXAgdHJhY2sgb2YgbGFzdCBESU1FIGF0dGFjaG1lbnQgKi8KKyNlbmRpZgorICBzb2FwLT5jb3VudCA9IDA7CisgIHNvYXAtPm5zID0gMDsKKyAgc29hcC0+bnVsbCA9IDA7CisgIHNvYXAtPnBvc2l0aW9uID0gMDsKKyAgc29hcC0+bXVzdFVuZGVyc3RhbmQgPSAwOworICBzb2FwLT5lbmNvZGluZyA9IDA7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0JFR0lOOworICBzb2FwLT5pZG51bSA9IDA7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQmVnaW4gY291bnQgcGhhc2UgKHNvY2tldD0lZCBtb2RlPTB4JXggY291bnQ9JWx1KVxuIiwgc29hcC0+c29ja2V0LCBzb2FwLT5tb2RlLCAodW5zaWduZWQgbG9uZylzb2FwLT5jb3VudCkpOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzb2FwLT5kaW1lLmNvdW50ID0gMDsgLyogY291bnQgIyBvZiBhdHRhY2htZW50cyAqLworICBzb2FwLT5kaW1lLnNpemUgPSAwOyAvKiBhY2N1bXVsYXRlIHRvdGFsIHNpemUgb2YgYXR0YWNobWVudHMgKi8KKyAgaWYgKHNvYXAtPmZwcmVwYXJlaW5pdCAmJiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pICE9IFNPQVBfSU9fU1RPUkUpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gc29hcC0+ZnByZXBhcmVpbml0KHNvYXApOyAgIAorI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VuZF9jb3VudChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5mcHJlcGFyZWZpbmFsKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IHNvYXAtPmZwcmVwYXJlZmluYWwoc29hcCk7CisjZW5kaWYKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgb2YgY291bnQgcGhhc2VcbiIpKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYmVnaW5fc2VuZChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICBzb2FwX2Nscl9hdHRyKHNvYXApOworICBzb2FwX3NldF9sb2NhbF9uYW1lc3BhY2VzKHNvYXApOworICBzb2FwLT5tb2RlID0gc29hcC0+b21vZGUgfCAoc29hcC0+bW9kZSAmIChTT0FQX0lPX0xFTkdUSCB8IFNPQVBfRU5DX0RJTUUpKTsKKyNpZmRlZiBXSVRIX1pMSUIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQikgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0ZMVVNIKQorICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWE1MKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX0JVRkZFUjsKKyAgICBlbHNlCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fU1RPUkU7CisgIH0KKyNlbmRpZgorI2lmZGVmIFdJVEhfVURQCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgeyBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX1hNTDsKKyAgICBpZiAoc29hcC0+Y291bnQgPiBTT0FQX0JVRkxFTikKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfVURQX0VSUk9SOworICB9CisjZW5kaWYKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19GTFVTSCAmJiBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICB7IGlmIChzb2FwLT5jb3VudCB8fCAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKSB8fCAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1hNTCkpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fQlVGRkVSOworICAgIGVsc2UKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19TVE9SRTsKKyAgfQorICBzb2FwLT5tb2RlICY9IH5TT0FQX0lPX0xFTkdUSDsKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19TVE9SRSkKKyAgICBzb2FwX25ld19ibG9jayhzb2FwKTsKKyAgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfSU9fS0VFUEFMSVZFKSkKKyAgICBzb2FwLT5rZWVwX2FsaXZlID0gMDsKKyAgaWYgKCFzb2FwLT5lbmNvZGluZ1N0eWxlICYmICEoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0dSQVBIKSkKKyAgICBzb2FwLT5tb2RlIHw9IFNPQVBfWE1MX1RSRUU7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pICYmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkpCisgIHsgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19NSU1FOworICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX0RJTUU7CisgIH0KKyAgZWxzZQorICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX01UT007CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkKKyAgICBzb2FwX3NlbGVjdF9taW1lX2JvdW5kYXJ5KHNvYXApOworI2lmZGVmIFdJTjMyCisjaWZuZGVmIFVOREVSX0NFCisjaWZuZGVmIFdJVEhfRkFTVENHSQorICBpZiAoIXNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpIC8qIFNldCB3aW4zMiBzdGRvdXQgb3Igc29hcC0+c2VuZGZkIHRvIEJJTkFSWSwgZS5nLiB0byBzdXBwb3J0IERJTUUgKi8KKyNpZmRlZiBfX0JPUkxBTkRDX18KKyAgICBzZXRtb2RlKChTT0FQX1NPQ0tFVClzb2FwLT5zZW5kZmQsIE9fQklOQVJZKTsKKyNlbHNlCisgICAgX3NldG1vZGUoKFNPQVBfU09DS0VUKXNvYXAtPnNlbmRmZCwgX09fQklOQVJZKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JTykKKyAgeyBzb2FwLT5idWZpZHggPSAwOworICAgIHNvYXAtPmJ1ZmxlbiA9IDA7CisgIH0KKyAgc29hcC0+Y2h1bmtzaXplID0gMDsKKyAgc29hcC0+bnMgPSAwOworICBzb2FwLT5udWxsID0gMDsKKyAgc29hcC0+cG9zaXRpb24gPSAwOworICBzb2FwLT5tdXN0VW5kZXJzdGFuZCA9IDA7CisgIHNvYXAtPmVuY29kaW5nID0gMDsKKyAgc29hcC0+aWRudW0gPSAwOworICBzb2FwLT5sZXZlbCA9IDA7CisjaWZkZWYgV0lUSF9aTElCCisgIHNvYXAtPnpfcmF0aW9fb3V0ID0gMS4wOworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKSAmJiBzb2FwLT56bGliX3N0YXRlICE9IFNPQVBfWkxJQl9ERUZMQVRFKQorICB7CisjaWZkZWYgV0lUSF9HWklQCisgICAgbWVtY3B5KHNvYXAtPnpfYnVmLCAiXDM3XDIxM1wxMFwwXDBcMFwwXDBcMFwzNzciLCAxMCk7CisgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZSopc29hcC0+el9idWYgKyAxMDsKKyAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgPSBTT0FQX0JVRkxFTiAtIDEwOworICAgIHNvYXAtPnpfY3JjID0gY3JjMzIoMEwsIE5VTEwsIDApOworICAgIGlmIChkZWZsYXRlSW5pdDIoJnNvYXAtPmRfc3RyZWFtLCBzb2FwLT56X2xldmVsLCBaX0RFRkxBVEVELCAtTUFYX1dCSVRTLCA4LCBaX0RFRkFVTFRfU1RSQVRFR1kpICE9IFpfT0spCisjZWxzZQorICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gKEJ5dGUqKXNvYXAtPnpfYnVmOworICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCA9IFNPQVBfQlVGTEVOOworICAgIGlmIChkZWZsYXRlSW5pdCgmc29hcC0+ZF9zdHJlYW0sIHNvYXAtPnpfbGV2ZWwpICE9IFpfT0spCisjZW5kaWYKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlZmxhdGUgaW5pdGlhbGl6ZWRcbiIpKTsKKyAgICBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX0RFRkxBVEU7CisgIH0KKyNlbmRpZgorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkJlZ2luIHNlbmQgcGhhc2UgKHNvY2tldD0lZCBtb2RlPTB4JXggY291bnQ9JWx1KVxuIiwgc29hcC0+c29ja2V0LCBzb2FwLT5tb2RlLCAodW5zaWduZWQgbG9uZylzb2FwLT5jb3VudCkpOworICBzb2FwLT5wYXJ0ID0gU09BUF9CRUdJTjsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPmZwcmVwYXJlaW5pdCAmJiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fU1RPUkUpCisgICAgc29hcC0+ZnByZXBhcmVpbml0KHNvYXApOyAgIAorI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZW1iZWRkZWQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnAsIGludCB0KQoreyBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgIGlmIChzb2FwX3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIHQsICZwcCkpCisgIHsgcHAtPm1hcmsxID0gMTsKKyAgICBwcC0+bWFyazIgPSAxOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW1iZWRkZWQgJXAgdHlwZT0lZCBtYXJrIHNldCB0byAxXG4iLCBwLCB0KSk7CisgIH0KK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWZlcmVuY2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnAsIGludCB0KQoreyBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgIGlmICghcCB8fCAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1RSRUUpKQorICAgIHJldHVybiAxOworICBpZiAoc29hcF9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCB0LCAmcHApKQorICB7IGlmIChwcC0+bWFyazEgPT0gMCkKKyAgICB7IHBwLT5tYXJrMSA9IDI7CisgICAgICBwcC0+bWFyazIgPSAyOworICAgIH0KKyAgfQorICBlbHNlIGlmIChzb2FwX3BvaW50ZXJfZW50ZXIoc29hcCwgcCwgTlVMTCwgMCwgdCwgJnBwKSkKKyAgeyBwcC0+bWFyazEgPSAwOworICAgIHBwLT5tYXJrMiA9IDA7CisgIH0KKyAgZWxzZQorICAgIHJldHVybiAxOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlZmVyZW5jZSAlcCB0eXBlPSVkICglZCAlZClcbiIsIHAsIHQsIChpbnQpcHAtPm1hcmsxLCAoaW50KXBwLT5tYXJrMikpOworICByZXR1cm4gcHAtPm1hcmsxOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2FycmF5X3JlZmVyZW5jZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCwgY29uc3Qgc3RydWN0IHNvYXBfYXJyYXkgKmEsIGludCBuLCBpbnQgdCkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgaWYgKCFwIHx8ICFhLT5fX3B0cikKKyAgICByZXR1cm4gMTsKKyAgaSA9IHNvYXBfYXJyYXlfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgYSwgbiwgdCwgJnBwKTsKKyAgaWYgKGkpCisgIHsgaWYgKHBwLT5tYXJrMSA9PSAwKQorICAgIHsgcHAtPm1hcmsxID0gMjsKKyAgICAgIHBwLT5tYXJrMiA9IDI7CisgICAgfQorICB9CisgIGVsc2UgaWYgKCFzb2FwX3BvaW50ZXJfZW50ZXIoc29hcCwgcCwgYSwgbiwgdCwgJnBwKSkKKyAgICByZXR1cm4gMTsKKyAgZWxzZQorICB7IHBwLT5tYXJrMSA9IDA7CisgICAgcHAtPm1hcmsyID0gMDsKKyAgfQorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFycmF5IHJlZmVyZW5jZSAlcCBwdHI9JXAgZGltPSVkIHR5cGU9JWQgKCVkICVkKVxuIiwgcCwgYS0+X19wdHIsIG4sIHQsIChpbnQpcHAtPm1hcmsxLCAoaW50KXBwLT5tYXJrMikpOworICByZXR1cm4gcHAtPm1hcmsxOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VtYmVkZGVkX2lkKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgaWQsIGNvbnN0IHZvaWQgKnAsIGludCB0KQoreyBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfVFJFRSkKKyAgICByZXR1cm4gaWQ7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW1iZWRkZWRfaWQgJXAgdHlwZT0lZCBpZD0lZFxuIiwgcCwgdCwgaWQpKTsKKyAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMSAmJiBzb2FwLT5lbmNvZGluZ1N0eWxlICYmICEoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0dSQVBIKSAmJiBzb2FwLT5wYXJ0ICE9IFNPQVBfSU5fSEVBREVSKQorICB7IGlmIChpZCA8IDApCisgICAgeyBpZCA9IHNvYXBfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgdCwgJnBwKTsKKyAgICAgIGlmIChpZCkKKyAgICAgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICAgICAgICBwcC0+bWFyazEgPSAyOworICAgICAgICBlbHNlCisgICAgICAgICAgcHAtPm1hcmsyID0gMjsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbWJlZGRlZF9pZCBtdWx0aXJlZiBpZD0lZCAlcCB0eXBlPSVkID0gKCVkICVkKVxuIiwgaWQsIHAsIHQsIChpbnQpcHAtPm1hcmsxLCAoaW50KXBwLT5tYXJrMikpOworICAgICAgfQorICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gaWQ7CisgIH0KKyAgaWYgKGlkIDwgMCkKKyAgICBpZCA9IHNvYXBfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgdCwgJnBwKTsKKyAgZWxzZSBpZiAoaWQgJiYgIXNvYXBfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgdCwgJnBwKSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKGlkICYmIHBwKQorICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgICBwcC0+bWFyazEgPSAxOworICAgIGVsc2UKKyAgICAgIHBwLT5tYXJrMiA9IDE7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbWJlZGRlZF9pZCBlbWJlZGRlZCByZWYgaWQ9JWQgJXAgdHlwZT0lZCA9ICglZCAlZClcbiIsIGlkLCBwLCB0LCAoaW50KXBwLT5tYXJrMSwgKGludClwcC0+bWFyazIpKTsKKyAgfQorICByZXR1cm4gaWQ7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfaXNfZW1iZWRkZWQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3BsaXN0ICpwcCkKK3sgaWYgKCFwcCkKKyAgICByZXR1cm4gMDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJcyBlbWJlZGRlZD8gJWQgJWRcbiIsIChpbnQpcHAtPm1hcmsxLCAoaW50KXBwLT5tYXJrMikpOworICBpZiAoc29hcC0+dmVyc2lvbiA9PSAxICYmIHNvYXAtPmVuY29kaW5nU3R5bGUgJiYgIShzb2FwLT5tb2RlICYgU09BUF9YTUxfR1JBUEgpICYmIHNvYXAtPnBhcnQgIT0gU09BUF9JTl9IRUFERVIpCisgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICAgIHJldHVybiBwcC0+bWFyazEgIT0gMDsKKyAgICByZXR1cm4gcHAtPm1hcmsyICE9IDA7CisgIH0KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICByZXR1cm4gcHAtPm1hcmsxID09IDE7CisgIHJldHVybiBwcC0+bWFyazIgPT0gMTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9pc19zaW5nbGUoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3BsaXN0ICpwcCkKK3sgaWYgKHNvYXAtPnBhcnQgPT0gU09BUF9JTl9IRUFERVIpCisgICAgcmV0dXJuIDE7CisgIGlmICghcHApCisgICAgcmV0dXJuIDA7CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgcmV0dXJuIHBwLT5tYXJrMSA9PSAwOworICByZXR1cm4gcHAtPm1hcmsyID09IDA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9lbWJlZGRlZChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGxpc3QgKnBwKQoreyBpZiAoIXBwKQorICAgIHJldHVybjsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICBwcC0+bWFyazEgPSAxOworICBlbHNlCisgICAgcHAtPm1hcmsyID0gMTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9hdHRhY2htZW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgdm9pZCAqcCwgY29uc3Qgc3RydWN0IHNvYXBfYXJyYXkgKmEsIGNvbnN0IGNoYXIgKmFpZCwgY29uc3QgY2hhciAqYXR5cGUsIGNvbnN0IGNoYXIgKmFvcHRpb25zLCBpbnQgbiwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpIAoreyBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgIGludCBpOworICBpZiAoIXAgfHwgIWEtPl9fcHRyIHx8ICghYWlkICYmICFhdHlwZSkpCisgICAgcmV0dXJuIHNvYXBfZWxlbWVudF9pZChzb2FwLCB0YWcsIGlkLCBwLCBhLCBuLCB0eXBlLCB0KTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJBdHRhY2htZW50IHRhZz0nJXMnIGlkPSclcycgKCVkKSB0eXBlPSclcydcbiIsIHRhZywgYWlkP2FpZDoiIiwgaWQsIGF0eXBlP2F0eXBlOiIiKSk7CisgIGkgPSBzb2FwX2FycmF5X3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIGEsIG4sIHQsICZwcCk7CisgIGlmICghaSkKKyAgeyBpID0gc29hcF9wb2ludGVyX2VudGVyKHNvYXAsIHAsIGEsIG4sIHQsICZwcCk7CisgICAgaWYgKCFpKQorICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKyAgaWYgKGlkIDw9IDApCisgICAgaWQgPSBpOworICBpZiAoIWFpZCkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1Ziwgc29hcC0+ZGltZV9pZF9mb3JtYXQsIGlkKTsKKyAgICBhaWQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT50bXBidWYpOworICB9CisgIC8qIEFkZCBNVE9NIHhvcDpJbmNsdWRlIGVsZW1lbnQgd2hlbiBuZWNlc3NhcnkgKi8KKyAgLyogVE9ETzogdGhpcyBjb2RlIHRvIGJlIG9ic29sZXRlZCB3aXRoIG5ldyBpbXBvcnQveG9wLmggY29udmVudGlvbnMgKi8KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkgJiYgc3RyY21wKHRhZywgInhvcDpJbmNsdWRlIikpCisgIHsgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCAwLCB0eXBlKQorICAgICB8fCBzb2FwX2VsZW1lbnRfaHJlZihzb2FwLCAieG9wOkluY2x1ZGUiLCAwLCAiaHJlZiIsIGFpZCkKKyAgICAgfHwgc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBlbHNlIGlmIChzb2FwX2VsZW1lbnRfaHJlZihzb2FwLCB0YWcsIDAsICJocmVmIiwgYWlkKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgIHsgaWYgKHBwLT5tYXJrMSAhPSAzKQorICAgIHsgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICAgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKQorICAgICAgICBjb250ZW50ID0gc29hcF9uZXdfbXVsdGlwYXJ0KHNvYXAsICZzb2FwLT5taW1lLmZpcnN0LCAmc29hcC0+bWltZS5sYXN0LCAoY2hhciopYS0+X19wdHIsIGEtPl9fc2l6ZSk7CisgICAgICBlbHNlCisgICAgICAgIGNvbnRlbnQgPSBzb2FwX25ld19tdWx0aXBhcnQoc29hcCwgJnNvYXAtPmRpbWUuZmlyc3QsICZzb2FwLT5kaW1lLmxhc3QsIChjaGFyKilhLT5fX3B0ciwgYS0+X19zaXplKTsKKyAgICAgIGlmICghY29udGVudCkKKyAgICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgaWYgKCFzdHJuY21wKGFpZCwgImNpZDoiLCA0KSkgLyogUkZDIDIxMTEgKi8KKyAgICAgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKQorICAgICAgICB7IGNoYXIgKnMgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc3RybGVuKGFpZCkgLSAxKTsKKwkgIGlmIChzKQorCSAgeyAqcyA9ICc8JzsKKwkgICAgc3RyY3B5KHMgKyAxLCBhaWQgKyA0KTsKKwkgICAgc3RyY2F0KHMsICI+Iik7CisJICAgIGNvbnRlbnQtPmlkID0gczsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIGNvbnRlbnQtPmlkID0gYWlkICsgNDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgY29udGVudC0+aWQgPSBhaWQ7CisgICAgICBjb250ZW50LT50eXBlID0gYXR5cGU7CisgICAgICBjb250ZW50LT5vcHRpb25zID0gYW9wdGlvbnM7CisgICAgICBjb250ZW50LT5lbmNvZGluZyA9IFNPQVBfTUlNRV9CSU5BUlk7CisgICAgICBwcC0+bWFyazEgPSAzOworICAgIH0KKyAgfQorICBlbHNlCisgICAgcHAtPm1hcmsyID0gMzsKKyAgcmV0dXJuIC0xOworfQorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZAorc29hcF9pbml0X2lodChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5pdGlhbGl6aW5nIElEIGhhc2h0YWJsZVxuIikpOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9JREhBU0g7IGkrKykKKyAgICBzb2FwLT5paHRbaV0gPSBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQKK3NvYXBfZnJlZV9paHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXAsICpwOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9mbGlzdCAqZnAsICpmcTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIElEIGhhc2h0YWJsZVxuIikpOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9JREhBU0g7IGkrKykKKyAgeyBmb3IgKGlwID0gc29hcC0+aWh0W2ldOyBpcDsgaXAgPSBwKQorICAgIHsgZm9yIChmcCA9IGlwLT5mbGlzdDsgZnA7IGZwID0gZnEpCisgICAgICB7IGZxID0gZnAtPm5leHQ7CisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBmcCk7CisgICAgICB9CisgICAgICBwID0gaXAtPm5leHQ7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgaXApOworICAgIH0KKyAgICBzb2FwLT5paHRbaV0gPSBOVUxMOworICB9Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcF9pbGlzdCAqCitTT0FQX0ZNQUMyCitzb2FwX2xvb2t1cChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgZm9yIChpcCA9IHNvYXAtPmlodFtzb2FwX2hhc2goaWQpXTsgaXA7IGlwID0gaXAtPm5leHQpCisgICAgaWYgKCFzdHJjbXAoaXAtPmlkLCBpZCkpCisgICAgICByZXR1cm4gaXA7CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorc3RydWN0IHNvYXBfaWxpc3QgKgorU09BUF9GTUFDMgorc29hcF9lbnRlcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQpCit7IHJlZ2lzdGVyIHNpemVfdCBoOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIGlwID0gKHN0cnVjdCBzb2FwX2lsaXN0KilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfaWxpc3QpICsgc3RybGVuKGlkKSk7CisgIGlmIChpcCkKKyAgeyBoID0gc29hcF9oYXNoKGlkKTsKKyAgICBzdHJjcHkoaXAtPmlkLCBpZCk7CisgICAgaXAtPm5leHQgPSBzb2FwLT5paHRbaF07CisgICAgc29hcC0+aWh0W2hdID0gaXA7CisgICAgcmV0dXJuIGlwOworICB9CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkKgorU09BUF9GTUFDMgorc29hcF9tYWxsb2Moc3RydWN0IHNvYXAgKnNvYXAsIHNpemVfdCBuKQoreyByZWdpc3RlciBjaGFyICpwOworICBpZiAoIW4pCisgICAgcmV0dXJuICh2b2lkKilTT0FQX05PTl9OVUxMOworICBpZiAoIXNvYXApCisgICAgcmV0dXJuIFNPQVBfTUFMTE9DKHNvYXAsIG4pOworICBuICs9ICgtKGxvbmcpbikgJiAoc2l6ZW9mKHZvaWQqKS0xKTsgLyogYWxpZ24gYXQgNC0sIDgtIG9yIDE2LWJ5dGUgYm91bmRhcnkgKi8KKyAgaWYgKCEocCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBuICsgc2l6ZW9mKHZvaWQqKSArIHNpemVvZihzaXplX3QpKSkpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICAvKiBrZWVwIGNoYWluIG9mIGFsbG9jZWQgY2VsbHMgZm9yIGxhdGVyIGRlc3RydWN0aW9uICovCisgIHNvYXAtPmFsbG9jZWQgPSAxOworICAqKHZvaWQqKikocCArIG4pID0gc29hcC0+YWxpc3Q7CisgICooc2l6ZV90KikocCArIG4gKyBzaXplb2Yodm9pZCopKSA9IG47CisgIHNvYXAtPmFsaXN0ID0gcCArIG47CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworc3RhdGljIHZvaWQKK3NvYXBfaW5pdF9taHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgKGludClTT0FQX1BUUkhBU0g7IGkrKykKKyAgICBzb2FwLT5taHRbaV0gPSBOVUxMOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworc3RhdGljIHZvaWQKK3NvYXBfZnJlZV9taHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9tbGlzdCAqbXAsICptcTsKKyAgZm9yIChpID0gMDsgaSA8IChpbnQpU09BUF9QVFJIQVNIOyBpKyspCisgIHsgZm9yIChtcCA9IHNvYXAtPm1odFtpXTsgbXA7IG1wID0gbXEpCisgICAgeyBtcSA9IG1wLT5uZXh0OworICAgICAgaWYgKG1wLT5saXZlKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzKCVkKTogbWFsbG9jKCkgPSAlcCBub3QgZnJlZWQgKG1lbW9yeSBsZWFrIG9yIGZvcmdvdCB0byBjYWxsIHNvYXBfZW5kKCk/KVxuIiwgbXAtPmZpbGUsIG1wLT5saW5lLCBtcC0+cHRyKTsKKyAgICAgIGZyZWUobXApOworICAgIH0KKyAgICBzb2FwLT5taHRbaV0gPSBOVUxMOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitTT0FQX0ZNQUMxCit2b2lkKgorU09BUF9GTUFDMgorc29hcF90cmFja19tYWxsb2Moc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBzaXplX3Qgc2l6ZSkKK3sgcmVnaXN0ZXIgdm9pZCAqcCA9IG1hbGxvYyhzaXplKTsKKyAgaWYgKHNvYXApCisgIHsgcmVnaXN0ZXIgaW50IGggPSBzb2FwX2hhc2hfcHRyKHApOworICAgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX21saXN0ICptcCA9IChzdHJ1Y3Qgc29hcF9tbGlzdCopbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc29hcF9tbGlzdCkpOworICAgIGlmIChzb2FwLT5mZGVidWdbU09BUF9JTkRFWF9URVNUXSkKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiJXMoJWQpOiBtYWxsb2MoJWx1KSA9ICVwXG4iLCBmaWxlLCBsaW5lLCAodW5zaWduZWQgbG9uZylzaXplLCBwKSk7CisgICAgbXAtPm5leHQgPSBzb2FwLT5taHRbaF07CisgICAgbXAtPnB0ciA9IHA7CisgICAgbXAtPmZpbGUgPSBmaWxlOworICAgIG1wLT5saW5lID0gbGluZTsKKyAgICBtcC0+bGl2ZSA9IDE7CisgICAgc29hcC0+bWh0W2hdID0gbXA7CisgIH0KKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3RyYWNrX2ZyZWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCB2b2lkICpwKQoreyByZWdpc3RlciBpbnQgaCA9IHNvYXBfaGFzaF9wdHIocCk7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX21saXN0ICptcDsKKyAgZm9yIChtcCA9IHNvYXAtPm1odFtoXTsgbXA7IG1wID0gbXAtPm5leHQpCisgICAgaWYgKG1wLT5wdHIgPT0gcCkKKyAgICAgIGJyZWFrOworICBpZiAobXApCisgIHsgaWYgKG1wLT5saXZlKQorICAgIHsgZnJlZShwKTsKKyAgICAgIGlmIChzb2FwLT5mZGVidWdbU09BUF9JTkRFWF9URVNUXSkKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIlcyglZCk6IGZyZWUoJXApXG4iLCBmaWxlLCBsaW5lLCBwKSk7CisgICAgICBtcC0+bGl2ZSA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMoJWQpOiBmcmVlKCVwKSBkb3VibGUgZnJlZSBvZiBwb2ludGVyIG1hbGxvY2VkIGF0ICVzKCVkKVxuIiwgZmlsZSwgbGluZSwgcCwgbXAtPmZpbGUsIG1wLT5saW5lKTsKKyAgfQorICBlbHNlCisgICAgZnByaW50ZihzdGRlcnIsICIlcyglZCk6IGZyZWUoJXApIHBvaW50ZXIgbm90IG1hbGxvY2VkXG4iLCBmaWxlLCBsaW5lLCBwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK3N0YXRpYyB2b2lkCitzb2FwX3RyYWNrX3VubGluayhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCkKK3sgcmVnaXN0ZXIgaW50IGggPSBzb2FwX2hhc2hfcHRyKHApOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9tbGlzdCAqbXA7CisgIGZvciAobXAgPSBzb2FwLT5taHRbaF07IG1wOyBtcCA9IG1wLT5uZXh0KQorICAgIGlmIChtcC0+cHRyID09IHApCisgICAgICBicmVhazsKKyAgaWYgKG1wKQorICAgIG1wLT5saXZlID0gMDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZGVhbGxvYyhzdHJ1Y3Qgc29hcCAqc29hcCwgdm9pZCAqcCkKK3sgaWYgKCFzb2FwKQorICAgIHJldHVybjsKKyAgaWYgKHApCisgIHsgcmVnaXN0ZXIgY2hhciAqKnE7CisgICAgZm9yIChxID0gKGNoYXIqKikmc29hcC0+YWxpc3Q7ICpxOyBxID0gKihjaGFyKioqKXEpCisgICAgeyBpZiAocCA9PSAodm9pZCopKCpxIC0gKihzaXplX3QqKSgqcSArIHNpemVvZih2b2lkKikpKSkKKyAgICAgIHsgKnEgPSAqKihjaGFyKioqKXE7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZWQgZGF0YSBhdCAlcFxuIiwgcCkpOworICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisgICAgc29hcF9kZWxldGUoc29hcCwgcCk7CisgIH0KKyAgZWxzZQorICB7IHJlZ2lzdGVyIGNoYXIgKnE7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIGFsbCBzb2FwX21hbGxvYygpIGRhdGFcbiIpKTsKKyAgICB3aGlsZSAoc29hcC0+YWxpc3QpCisgICAgeyBxID0gKGNoYXIqKXNvYXAtPmFsaXN0OworICAgICAgc29hcC0+YWxpc3QgPSAqKHZvaWQqKilxOworICAgICAgcSAtPSAqKHNpemVfdCopKHEgKyBzaXplb2Yodm9pZCopKTsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBxKTsKKyAgICB9CisgIH0KKyAgLyogd2UgbXVzdCBhc3N1bWUgdGhlc2Ugd2VyZSBkZWFsbG9jYXRlZDogKi8KKyAgc29hcC0+YWN0aW9uID0gTlVMTDsKKyAgc29hcC0+ZmF1bHQgPSBOVUxMOworICBzb2FwLT5oZWFkZXIgPSBOVUxMOworICBzb2FwLT51c2VyaWQgPSBOVUxMOworICBzb2FwLT5wYXNzd2QgPSBOVUxMOworICBzb2FwLT5hdXRocmVhbG0gPSBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzb2FwX2Nscl9taW1lKHNvYXApOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2RlbGV0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgdm9pZCAqcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfY2xpc3QgKipjcDsKKyAgaWYgKHNvYXBfY2hlY2tfc3RhdGUoc29hcCkpCisgICAgcmV0dXJuOworICBjcCA9ICZzb2FwLT5jbGlzdDsKKyAgaWYgKHApCisgIHsgd2hpbGUgKCpjcCkKKyAgICB7IGlmIChwID09ICgqY3ApLT5wdHIpCisgICAgICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2NsaXN0ICpxID0gKmNwOworICAgICAgICAqY3AgPSBxLT5uZXh0OworICAgICAgICBxLT5mZGVsZXRlKHEpOworICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGNwID0gJigqY3ApLT5uZXh0OworICAgIH0KKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBkZWFsbG9jIGRhdGEgJXA6IGFkZHJlc3Mgbm90IGluIGxpc3RcbiIsIHApKTsKKyAgfQorICBlbHNlCisgIHsgd2hpbGUgKCpjcCkKKyAgICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2NsaXN0ICpxID0gKmNwOworICAgICAgKmNwID0gcS0+bmV4dDsKKyAgICAgIGlmIChxLT5wdHIgPT0gKHZvaWQqKXNvYXAtPmZhdWx0KQorICAgICAgICBzb2FwLT5mYXVsdCA9IE5VTEw7IC8qIHRoaXMgd2FzIGRlYWxsb2NhdGVkICovCisgICAgICBlbHNlIGlmIChxLT5wdHIgPT0gKHZvaWQqKXNvYXAtPmhlYWRlcikKKyAgICAgICAgc29hcC0+aGVhZGVyID0gTlVMTDsgLyogdGhpcyB3YXMgZGVhbGxvY2F0ZWQgKi8KKyAgICAgIHEtPmZkZWxldGUocSk7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgcSk7CisgICAgfQorICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcF9jbGlzdCAqCitTT0FQX0ZNQUMyCitzb2FwX2xpbmsoc3RydWN0IHNvYXAgKnNvYXAsIHZvaWQgKnAsIGludCB0LCBpbnQgbiwgdm9pZCAoKmZkZWxldGUpKHN0cnVjdCBzb2FwX2NsaXN0KikpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2NsaXN0ICpjcDsKKyAgaWYgKChjcCA9IChzdHJ1Y3Qgc29hcF9jbGlzdCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2NsaXN0KSkpKQorICB7IGNwLT5uZXh0ID0gc29hcC0+Y2xpc3Q7CisgICAgY3AtPnR5cGUgPSB0OworICAgIGNwLT5zaXplID0gbjsgCisgICAgY3AtPnB0ciA9IHA7CisgICAgY3AtPmZkZWxldGUgPSBmZGVsZXRlOworICAgIHNvYXAtPmNsaXN0ID0gY3A7CisgIH0KKyAgcmV0dXJuIGNwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF91bmxpbmsoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnApCit7IHJlZ2lzdGVyIGNoYXIgKipxOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9jbGlzdCAqKmNwOworICBpZiAoIXNvYXAgfHwgIXApCisgICAgcmV0dXJuOworICBmb3IgKHEgPSAoY2hhcioqKSZzb2FwLT5hbGlzdDsgKnE7IHEgPSAqKGNoYXIqKiopcSkKKyAgeyBpZiAocCA9PSAodm9pZCopKCpxIC0gKihzaXplX3QqKSgqcSArIHNpemVvZih2b2lkKikpKSkKKyAgICB7ICpxID0gKiooY2hhcioqKilxOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVbmxpbmtlZCBkYXRhICVwXG4iLCBwKSk7CisjaWZkZWYgU09BUF9ERUJVRworICAgICAgc29hcF90cmFja191bmxpbmsoc29hcCwgcCk7CisjZW5kaWYKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgZm9yIChjcCA9ICZzb2FwLT5jbGlzdDsgKmNwOyBjcCA9ICYoKmNwKS0+bmV4dCkKKyAgeyBpZiAocCA9PSAoKmNwKS0+cHRyKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVbmxpbmtlZCBjbGFzcyBpbnN0YW5jZSAlcFxuIiwgcCkpOworICAgICAgcSA9IChjaGFyKiopKmNwOworICAgICAgKmNwID0gKCpjcCktPm5leHQ7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgcSk7CisgICAgICByZXR1cm47CisgICAgfQorICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2xvb2t1cF90eXBlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworICBpZiAoaWQgJiYgKmlkKQorICB7IGlwID0gc29hcF9sb29rdXAoc29hcCwgaWQpOworICAgIGlmIChpcCkKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTG9va3VwIGlkPSclcycgdHlwZT0lZFxuIiwgaWQsIGlwLT50eXBlKSk7CisgICAgICByZXR1cm4gaXAtPnR5cGU7CisgICAgfQorICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAibG9va3VwIHR5cGUgaWQ9JyVzJyBOT1QgRk9VTkQhIE5lZWQgdG8gZ2V0IGl0IGZyb20geHNpOnR5cGVcbiIsIGlkKSk7CisgIHJldHVybiAwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZCoKK1NPQVBfRk1BQzIKK3NvYXBfaWRfbG9va3VwKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgdm9pZCAqKnAsIGludCB0LCBzaXplX3QgbiwgdW5zaWduZWQgaW50IGspCit7IHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgdm9pZCAqKnE7CisgIGlmICghcCB8fCAhaWQgfHwgISppZCkKKyAgICByZXR1cm4gcDsKKyAgaXAgPSBzb2FwX2xvb2t1cChzb2FwLCBpZCk7IC8qIGxvb2t1cCBwb2ludGVyIHRvIGhhc2ggdGFibGUgZW50cnkgZm9yIHN0cmluZyBpZCAqLworICBpZiAoIWlwKQorICB7IGlwID0gc29hcF9lbnRlcihzb2FwLCBpZCk7IC8qIG5ldyBoYXNoIHRhYmxlIGVudHJ5IGZvciBzdHJpbmcgaWQgKi8KKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZvcndhcmRpbmcgZmlyc3QgaHJlZj0nJXMnIHR5cGU9JWQgJXAgKCV1IGJ5dGVzKVxuIiwgaWQsIHQsIHAsICh1bnNpZ25lZCBpbnQpbikpOworICAgIGlwLT50eXBlID0gdDsKKyAgICBpcC0+c2l6ZSA9IG47IAorICAgIGlwLT5saW5rID0gcDsKKyAgICBpcC0+Y29weSA9IE5VTEw7CisgICAgaXAtPmZsaXN0ID0gTlVMTDsKKyAgICBpcC0+cHRyID0gTlVMTDsKKyAgICBpcC0+bGV2ZWwgPSBrOworICAgICpwID0gTlVMTDsKKyAgfQorICBlbHNlIGlmIChpcC0+cHRyKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x2ZWQgaHJlZj0nJXMnIHR5cGU9JWQgbG9jYXRpb249JXAgKCV1IGJ5dGVzKVxuIiwgaWQsIHQsIGlwLT5wdHIsICh1bnNpZ25lZCBpbnQpbikpOworICAgIGlmIChpcC0+dHlwZSAhPSB0KQorICAgIHsgc3RyY3B5KHNvYXAtPmlkLCBpZCk7CisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfSFJFRjsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVHlwZSBpbmNvbXBhdGliaWxpdHk6IGlkIHR5cGU9JWQgaHJlZiB0eXBlPSVkXG4iLCBpcC0+dHlwZSwgdCkpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHdoaWxlIChpcC0+bGV2ZWwgPCBrKQorICAgIHsgcSA9ICh2b2lkKiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHZvaWQqKSk7ICAKKyAgICAgIGlmICghcSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAqcCA9ICh2b2lkKilxOworICAgICAgcCA9IHE7CisgICAgICBrLS07CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlc2NlbmRpbmcgb25lIGxldmVsLi4uXG4iKSk7CisgICAgfQorICAgICpwID0gaXAtPnB0cjsKKyAgfQorICBlbHNlIGlmIChpcC0+bGV2ZWwgPiBrKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x2aW5nIGxldmVsICV1IHBvaW50ZXJzIHRvIGhyZWY9JyVzJ1xuIiwgaXAtPmxldmVsLCBpZCkpOworICAgIHdoaWxlIChpcC0+bGV2ZWwgPiBrKQorICAgIHsgdm9pZCAqcywgKipyID0gJmlwLT5saW5rOworICAgICAgcSA9ICh2b2lkKiopaXAtPmxpbms7CisgICAgICB3aGlsZSAocSkKKyAgICAgIHsgKnIgPSAodm9pZCopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHZvaWQqKSk7CisgICAgICAgIHMgPSAqcTsKKyAgICAgICAgKnEgPSAqcjsKKyAgICAgICAgciA9ICh2b2lkKiopKnI7CisgICAgICAgIHEgPSAodm9pZCoqKXM7CisgICAgICB9CisgICAgICAqciA9IE5VTEw7CisgICAgICBpcC0+c2l6ZSA9IG47IAorICAgICAgaXAtPmNvcHkgPSBOVUxMOworICAgICAgaXAtPmxldmVsID0gaXAtPmxldmVsIC0gMTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVzY2VuZGluZyBvbmUgbGV2ZWwuLi5cbiIpKTsKKyAgICB9CisgICAgcSA9ICh2b2lkKiopaXAtPmxpbms7CisgICAgaXAtPmxpbmsgPSBwOworICAgICpwID0gKHZvaWQqKXE7CisgIH0KKyAgZWxzZQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRm9yd2FyZGVkIGhyZWY9JyVzJyB0eXBlPSVkIGxvY2F0aW9uPSVwICgldSBieXRlcylcbiIsIGlkLCB0LCBwLCAodW5zaWduZWQgaW50KW4pKTsKKyAgICB3aGlsZSAoaXAtPmxldmVsIDwgaykKKyAgICB7IHEgPSAodm9pZCoqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZih2b2lkKikpOyAgCisgICAgICAqcCA9IHE7CisgICAgICBwID0gcTsKKyAgICAgIGstLTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVzY2VuZGluZyBvbmUgbGV2ZWwuLi5cbiIpKTsKKyAgICB9CisgICAgcSA9ICh2b2lkKiopaXAtPmxpbms7CisgICAgaXAtPmxpbmsgPSBwOworICAgICpwID0gKHZvaWQqKXE7CisgIH0KKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkKgorU09BUF9GTUFDMgorc29hcF9pZF9mb3J3YXJkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpocmVmLCB2b2lkICpwLCBzaXplX3QgbGVuLCBpbnQgc3QsIGludCB0dCwgc2l6ZV90IG4sIHVuc2lnbmVkIGludCBrLCB2b2lkICgqZmNvcHkpKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBzaXplX3QsIGNvbnN0IHZvaWQqLCBzaXplX3QpKQoreyBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIGlmICghcCB8fCAhaHJlZiB8fCAhKmhyZWYpCisgICAgcmV0dXJuIHA7CisgIGlwID0gc29hcF9sb29rdXAoc29hcCwgaHJlZik7IC8qIGxvb2t1cCBwb2ludGVyIHRvIGhhc2ggdGFibGUgZW50cnkgZm9yIHN0cmluZyBpZCAqLworICBpZiAoIWlwKQorICB7IGlwID0gc29hcF9lbnRlcihzb2FwLCBocmVmKTsgLyogbmV3IGhhc2ggdGFibGUgZW50cnkgZm9yIHN0cmluZyBpZCAqLworICAgIGlwLT50eXBlID0gc3Q7CisgICAgaXAtPnNpemUgPSBuOworICAgIGlwLT5saW5rID0gTlVMTDsKKyAgICBpcC0+Y29weSA9IE5VTEw7CisgICAgaXAtPnB0ciA9IE5VTEw7CisgICAgaXAtPmxldmVsID0gMDsKKyAgICBpcC0+Zmxpc3QgPSBOVUxMOworICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJOZXcgZW50cnkgaHJlZj0nJXMnIHR5cGU9JWQgc2l6ZT0lbHUgbGV2ZWw9JWQgbG9jYXRpb249JXBcbiIsIGhyZWYsIHN0LCAodW5zaWduZWQgbG9uZyluLCBrLCBwKSk7CisgIH0KKyAgZWxzZSBpZiAoaXAtPnR5cGUgIT0gc3QgfHwgKGlwLT5sZXZlbCA9PSBrICYmIGlwLT5zaXplICE9IG4pKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVHlwZSBpbmNvbXBhdGliaWxpdHkgaWQ9JyVzJyBleHBlY3QgdHlwZT0lZCBzaXplPSVsdSBsZXZlbD0ldSBnb3QgdHlwZT0lZCBzaXplPSVsdVxuIiwgaHJlZiwgaXAtPnR5cGUsICh1bnNpZ25lZCBsb25nKWlwLT5zaXplLCBrLCBzdCwgKHVuc2lnbmVkIGxvbmcpbikpOworICAgIHN0cmNweShzb2FwLT5pZCwgaHJlZik7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0hSRUY7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKGZjb3B5IHx8IG4gPCBzaXplb2Yodm9pZCopIHx8ICpocmVmICE9ICcjJykKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9mbGlzdCAqZnAgPSAoc3RydWN0IHNvYXBfZmxpc3QqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9mbGlzdCkpOworICAgIGlmICghZnApCisgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZwLT5uZXh0ID0gaXAtPmZsaXN0OworICAgIGZwLT50eXBlID0gdHQ7CisgICAgZnAtPnB0ciA9IHA7CisgICAgZnAtPmxldmVsID0gazsKKyAgICBmcC0+bGVuID0gbGVuOworICAgIGlmIChmY29weSkKKyAgICAgIGZwLT5mY29weSA9IGZjb3B5OworICAgIGVsc2UKKyAgICAgIGZwLT5mY29weSA9IHNvYXBfZmNvcHk7CisgICAgaXAtPmZsaXN0ID0gZnA7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGb3J3YXJkaW5nIHR5cGU9JWQgKHRhcmdldCB0eXBlPSVkKSBzaXplPSVsdSBsb2NhdGlvbj0lcCBsZXZlbD0ldSBsZW49JWx1IGhyZWY9JyVzJ1xuIiwgc3QsIHR0LCAodW5zaWduZWQgbG9uZyluLCBwLCBrLCAodW5zaWduZWQgbG9uZylsZW4sIGhyZWYpKTsKKyAgfQorICBlbHNlCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGb3J3YXJkaW5nIGNvcHlpbmcgYWRkcmVzcyAlcCBmb3IgdHlwZT0lZCBocmVmPSclcydcbiIsIHAsIHN0LCBocmVmKSk7CisgICAgKih2b2lkKiopcCA9IGlwLT5jb3B5OworICAgIGlwLT5jb3B5ID0gcDsKKyAgfQorICByZXR1cm4gcDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZCoKK1NPQVBfRk1BQzIKK3NvYXBfaWRfZW50ZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCB2b2lkICpwLCBpbnQgdCwgc2l6ZV90IG4sIHVuc2lnbmVkIGludCBrLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICphcnJheVR5cGUsIHZvaWQgKigqZmluc3RhbnRpYXRlKShzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKSkKK3sKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgIHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyNlbmRpZgorICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW50ZXIgaWQ9JyVzJyB0eXBlPSVkIGxvYz0lcCBzaXplPSVsdSBsZXZlbD0ldVxuIiwgaWQsIHQsIHAsICh1bnNpZ25lZCBsb25nKW4sIGspKTsKKyAgc29hcC0+YWxsb2NlZCA9IDA7CisgIGlmICghcCkKKyAgeyBpZiAoZmluc3RhbnRpYXRlKQorICAgICAgcCA9IGZpbnN0YW50aWF0ZShzb2FwLCB0LCB0eXBlLCBhcnJheVR5cGUsICZuKTsKKyAgICBlbHNlCisgICAgICBwID0gc29hcF9tYWxsb2Moc29hcCwgbik7CisgICAgaWYgKHApCisgICAgICBzb2FwLT5hbGxvY2VkID0gMTsKKyAgfQorI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgaWYgKCFpZCB8fCAhKmlkKQorI2VuZGlmCisgICAgcmV0dXJuIHA7CisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICBpcCA9IHNvYXBfbG9va3VwKHNvYXAsIGlkKTsgLyogbG9va3VwIHBvaW50ZXIgdG8gaGFzaCB0YWJsZSBlbnRyeSBmb3Igc3RyaW5nIGlkICovCisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJMb29rdXAgZW50cnkgaWQ9JyVzIGZvciBsb2NhdGlvbj0lcCdcbiIsIGlkLCBwKSk7CisgIGlmICghaXApCisgIHsgaXAgPSBzb2FwX2VudGVyKHNvYXAsIGlkKTsgLyogbmV3IGhhc2ggdGFibGUgZW50cnkgZm9yIHN0cmluZyBpZCAqLworICAgIGlwLT50eXBlID0gdDsKKyAgICBpcC0+bGluayA9IE5VTEw7CisgICAgaXAtPmNvcHkgPSBOVUxMOworICAgIGlwLT5mbGlzdCA9IE5VTEw7CisgICAgaXAtPnNpemUgPSBuOworICAgIGlwLT5wdHIgPSBwOworICAgIGlwLT5sZXZlbCA9IGs7CisgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk5ldyBlbnRyeSBpZD0nJXMnIHR5cGU9JWQgc2l6ZT0lbHUgbGV2ZWw9JXUgbG9jYXRpb249JXBcbiIsIGlkLCB0LCAodW5zaWduZWQgbG9uZyluLCBrLCBwKSk7CisgIH0KKyAgZWxzZSBpZiAoKGlwLT50eXBlICE9IHQgfHwgKGlwLT5sZXZlbCA9PSBrICYmIGlwLT5zaXplICE9IG4pKSAmJiAoaXAtPmNvcHkgfHwgaXAtPmZsaXN0KSkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlR5cGUgaW5jb21wYXRpYmlsaXR5IGlkPSclcycgZXhwZWN0IHR5cGU9JWQgc2l6ZT0lbHUgbGV2ZWw9JXUgZ290IHR5cGU9JWQgc2l6ZT0lbHVcbiIsIGlkLCBpcC0+dHlwZSwgKHVuc2lnbmVkIGxvbmcpaXAtPnNpemUsIGssIHQsICh1bnNpZ25lZCBsb25nKW4pKTsKKyAgICBzdHJjcHkoc29hcC0+aWQsIGlkKTsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfSFJFRjsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBlbHNlIGlmIChpcC0+cHRyKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTXVsdGlwbHkgZGVmaW5lZCBpZD0nJXMnXG4iLCBpZCkpOworICAgIHN0cmNweShzb2FwLT5pZCwgaWQpOworICAgIHNvYXAtPmVycm9yID0gU09BUF9EVVBMSUNBVEVfSUQ7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZWxzZSAKKyAgeyBpcC0+c2l6ZSA9IG47CisgICAgaXAtPnB0ciA9IHA7CisgICAgaXAtPmxldmVsID0gazsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVwZGF0ZSBlbnRyeSBpZD0nJXMnIHR5cGU9JWQgbG9jYXRpb249JXAgc2l6ZT0lbHUgbGV2ZWw9JXVcbiIsIGlkLCB0LCBwLCAodW5zaWduZWQgbG9uZyluLCBrKSk7CisgIH0KKyAgcmV0dXJuIGlwLT5wdHI7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZmNvcHkoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdCwgaW50IHR0LCB2b2lkICpwLCBzaXplX3QgbGVuLCBjb25zdCB2b2lkICpxLCBzaXplX3QgbikKK3sgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHlpbmcgZGF0YSB0eXBlPSVkICh0YXJnZXQgdHlwZT0lZCkgJXAgLT4gJXAgKCVsdSBieXRlcylcbiIsIHN0LCB0dCwgcSwgcCwgKHVuc2lnbmVkIGxvbmcpbikpOworICBtZW1jcHkocCwgcSwgbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW5kX3NlbmQoc3RydWN0IHNvYXAgKnNvYXApCit7IAorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+ZGltZS5saXN0KQorICB7IC8qIFNPQVAgYm9keSByZWZlcmVuY2VkIGF0dGFjaG1lbnRzIG11c3QgYXBwZWFyIGZpcnN0ICovCisgICAgc29hcC0+ZGltZS5sYXN0LT5uZXh0ID0gc29hcC0+ZGltZS5maXJzdDsKKyAgICBzb2FwLT5kaW1lLmZpcnN0ID0gc29hcC0+ZGltZS5saXN0LT5uZXh0OworICAgIHNvYXAtPmRpbWUubGlzdC0+bmV4dCA9IE5VTEw7CisgICAgc29hcC0+ZGltZS5sYXN0ID0gc29hcC0+ZGltZS5saXN0OworICB9CisgIGlmIChzb2FwX3B1dGRpbWUoc29hcCkgfHwgc29hcF9wdXRtaW1lKHNvYXApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgc29hcC0+bWltZS5saXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGlzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmxhc3QgPSBOVUxMOworI2VuZGlmCisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIHNlbmRcbiIpKTsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSAvKiBuZWVkIHRvIGZsdXNoIHRoZSByZW1haW5pbmcgZGF0YSBpbiBidWZmZXIgKi8KKyAgeyBpZiAoc29hcF9mbHVzaChzb2FwKSkKKyNpZmRlZiBXSVRIX1pMSUIKKyAgICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQiAmJiBzb2FwLT56bGliX3N0YXRlID09IFNPQVBfWkxJQl9ERUZMQVRFKQorICAgICAgeyBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX05PTkU7CisgICAgICAgIGRlZmxhdGVFbmQoJnNvYXAtPmRfc3RyZWFtKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisjZWxzZQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2VuZGlmCisjaWZkZWYgV0lUSF9aTElCCisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKQorICAgIHsgaW50IHI7CisgICAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbiA9IDA7CisgICAgICBkbworICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlZmxhdGluZyByZW1haW5kZXJcbiIpKTsKKyAgICAgICAgciA9IGRlZmxhdGUoJnNvYXAtPmRfc3RyZWFtLCBaX0ZJTklTSCk7CisgICAgICAgIGlmIChzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgIT0gU09BUF9CVUZMRU4pCisgICAgICAgIHsgaWYgKHNvYXBfZmx1c2hfcmF3KHNvYXAsIHNvYXAtPnpfYnVmLCBTT0FQX0JVRkxFTiAtIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCkpCisgICAgICAgICAgeyBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX05PTkU7CisgICAgICAgICAgICBkZWZsYXRlRW5kKCZzb2FwLT5kX3N0cmVhbSk7CisgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisJICB9CisgICAgICAgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZSopc29hcC0+el9idWY7CisgICAgICAgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0ID0gU09BUF9CVUZMRU47CisgICAgICAgIH0KKyAgICAgIH0gd2hpbGUgKHIgPT0gWl9PSyk7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlZmxhdGVkICVsdS0+JWx1IGJ5dGVzXG4iLCBzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiwgc29hcC0+ZF9zdHJlYW0udG90YWxfb3V0KSk7CisgICAgICBzb2FwLT56X3JhdGlvX291dCA9IChmbG9hdClzb2FwLT5kX3N0cmVhbS50b3RhbF9vdXQgLyAoZmxvYXQpc29hcC0+ZF9zdHJlYW0udG90YWxfaW47CisgICAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0VOQ19aTElCOworICAgICAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9OT05FOworICAgICAgaWYgKGRlZmxhdGVFbmQoJnNvYXAtPmRfc3RyZWFtKSAhPSBaX09LIHx8IHIgIT0gWl9TVFJFQU1fRU5EKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVuYWJsZSB0byBlbmQgZGVmbGF0ZTogJXNcbiIsIHNvYXAtPmRfc3RyZWFtLm1zZz9zb2FwLT5kX3N0cmVhbS5tc2c6IiIpKTsKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgfQorI2lmZGVmIFdJVEhfR1pJUAorICAgICAgc29hcC0+el9idWZbMF0gPSBzb2FwLT56X2NyYyAmIDB4RkY7CisgICAgICBzb2FwLT56X2J1ZlsxXSA9IChzb2FwLT56X2NyYyA+PiA4KSAmIDB4RkY7CisgICAgICBzb2FwLT56X2J1ZlsyXSA9IChzb2FwLT56X2NyYyA+PiAxNikgJiAweEZGOworICAgICAgc29hcC0+el9idWZbM10gPSAoc29hcC0+el9jcmMgPj4gMjQpICYgMHhGRjsKKyAgICAgIHNvYXAtPnpfYnVmWzRdID0gc29hcC0+ZF9zdHJlYW0udG90YWxfaW4gJiAweEZGOworICAgICAgc29hcC0+el9idWZbNV0gPSAoc29hcC0+ZF9zdHJlYW0udG90YWxfaW4gPj4gOCkgJiAweEZGOworICAgICAgc29hcC0+el9idWZbNl0gPSAoc29hcC0+ZF9zdHJlYW0udG90YWxfaW4gPj4gMTYpICYgMHhGRjsKKyAgICAgIHNvYXAtPnpfYnVmWzddID0gKHNvYXAtPmRfc3RyZWFtLnRvdGFsX2luID4+IDI0KSAmIDB4RkY7CisgICAgICBpZiAoc29hcF9mbHVzaF9yYXcoc29hcCwgc29hcC0+el9idWYsIDgpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImd6aXAgY3JjMzI9JWx1XG4iLCAodW5zaWduZWQgbG9uZylzb2FwLT56X2NyYykpOworI2VuZGlmCisgICAgfQorI2VuZGlmCisgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19TVE9SRSkKKyAgICB7IGNoYXIgKnA7CisjaWZuZGVmIFdJVEhfTk9IVFRQCisgICAgICBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9FTkNfWE1MKSkKKyAgICAgIHsgc29hcC0+bW9kZS0tOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNlbmRpbmcgYnVmZmVyZWQgbWVzc2FnZSBvZiBsZW5ndGggJXVcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+Ymxpc3QtPnNpemUpKTsKKyAgICAgICAgaWYgKHNvYXAtPnN0YXR1cyA+PSBTT0FQX1BPU1QpCisgICAgICAgICAgc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdChzb2FwLCBzb2FwLT5lbmRwb2ludCwgc29hcC0+aG9zdCwgc29hcC0+cG9ydCwgc29hcC0+cGF0aCwgc29hcC0+YWN0aW9uLCBzb2FwLT5ibGlzdC0+c2l6ZSk7CisgICAgICAgIGVsc2UgaWYgKHNvYXAtPnN0YXR1cyAhPSBTT0FQX1NUT1ApCisgICAgICAgICAgc29hcC0+ZXJyb3IgPSBzb2FwLT5mcmVzcG9uc2Uoc29hcCwgc29hcC0+c3RhdHVzLCBzb2FwLT5ibGlzdC0+c2l6ZSk7CisgICAgICAgIGlmIChzb2FwLT5lcnJvciB8fCBzb2FwX2ZsdXNoKHNvYXApKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgc29hcC0+bW9kZSsrOworICAgICAgfQorI2VuZGlmCisgICAgICBmb3IgKHAgPSBzb2FwX2ZpcnN0X2Jsb2NrKHNvYXApOyBwOyBwID0gc29hcF9uZXh0X2Jsb2NrKHNvYXApKQorICAgICAgeyBEQkdNU0coU0VOVCwgcCwgc29hcF9ibG9ja19zaXplKHNvYXApKTsKKyAgICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZzZW5kKHNvYXAsIHAsIHNvYXBfYmxvY2tfc2l6ZShzb2FwKSkpKQorICAgICAgICB7IHNvYXBfZW5kX2Jsb2NrKHNvYXApOworICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc29hcF9lbmRfYmxvY2soc29hcCk7CisgICAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICAgIGVsc2UgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgICB7IERCR01TRyhTRU5ULCAiXHJcbjBcclxuXHJcbiIsIDcpOworICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZzZW5kKHNvYXAsICJcclxuMFxyXG5cclxuIiwgNykpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorI2VuZGlmCisgIH0KKyNpZmRlZiBXSVRIX1RDUEZJTgorI2lmZGVmIFdJVEhfT1BFTlNTTAorICBpZiAoIXNvYXAtPnNzbCAmJiBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpICYmICFzb2FwLT5rZWVwX2FsaXZlICYmICEoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgc29hcC0+ZnNodXRkb3duc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIDEpOyAvKiBTZW5kIFRDUCBGSU4gKi8KKyNlbHNlCisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpICYmICFzb2FwLT5rZWVwX2FsaXZlICYmICEoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgc29hcC0+ZnNodXRkb3duc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIDEpOyAvKiBTZW5kIFRDUCBGSU4gKi8KKyNlbmRpZgorI2VuZGlmCisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIG9mIHNlbmQgcGhhc2VcbiIpKTsKKyAgc29hcC0+b21vZGUgJj0gflNPQVBfWE1MX1NFQzsKKyAgc29hcC0+Y291bnQgPSAwOworICBzb2FwLT5wYXJ0ID0gU09BUF9FTkQ7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VuZF9yZWN2KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5wYXJ0ID0gU09BUF9FTkQ7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpICYmIHNvYXBfZ2V0ZGltZShzb2FwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHNvYXAtPmRpbWUubGlzdCA9IHNvYXAtPmRpbWUuZmlyc3Q7CisgIHNvYXAtPmRpbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmxhc3QgPSBOVUxMOworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKSAmJiBzb2FwX2dldG1pbWUoc29hcCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBzb2FwLT5taW1lLmxpc3QgPSBzb2FwLT5taW1lLmZpcnN0OworICBzb2FwLT5taW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5sYXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5ib3VuZGFyeSA9IE5VTEw7CisjZW5kaWYKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBvZiByZWNlaXZlIG1lc3NhZ2Ugb2tcbiIpKTsKKyNpZmRlZiBXSVRIX1pMSUIKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKQorICB7IHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX1pMSUI7CisgICAgbWVtY3B5KHNvYXAtPmJ1Ziwgc29hcC0+el9idWYsIFNPQVBfQlVGTEVOKTsKKyAgICBzb2FwLT5idWZpZHggPSAoY2hhciopc29hcC0+ZF9zdHJlYW0ubmV4dF9pbiAtIHNvYXAtPnpfYnVmOworICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPnpfYnVmbGVuOworICAgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfTk9ORTsKKyAgICBpZiAoaW5mbGF0ZUVuZCgmc29hcC0+ZF9zdHJlYW0pICE9IFpfT0spCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisjaWZkZWYgV0lUSF9HWklQCisgICAgaWYgKHNvYXAtPnpsaWJfaW4gPT0gU09BUF9aTElCX0daSVApCisgICAgeyBzb2FwX3djaGFyIGM7CisgICAgICBzaG9ydCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgIHsgaWYgKChpbnQpKGMgPSBzb2FwX2dldGNoYXIoc29hcCkpID09IEVPRikKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAgICAgc29hcC0+el9idWZbaV0gPSAoY2hhciljOworICAgICAgfQorICAgICAgaWYgKHNvYXAtPnpfY3JjICE9ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbMF0gfCAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzFdIDw8IDgpIHwgKCh1TG9uZykodW5zaWduZWQgY2hhcilzb2FwLT56X2J1ZlsyXSA8PCAxNikgfCAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzNdIDw8IDI0KSkpCisgICAgICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJHemlwIGVycm9yOiBjcmMgY2hlY2sgZmFpbGVkLCBtZXNzYWdlIGNvcnJ1cHRlZD8gKGNyYzMyPSVsdSlcbiIsICh1bnNpZ25lZCBsb25nKXNvYXAtPnpfY3JjKSk7CisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICAgIH0KKyAgICAgIGlmIChzb2FwLT5kX3N0cmVhbS50b3RhbF9vdXQgIT0gKCh1TG9uZykodW5zaWduZWQgY2hhcilzb2FwLT56X2J1Zls0XSB8ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbNV0gPDwgOCkgfCAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzZdIDw8IDE2KSB8ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbN10gPDwgMjQpKSkKKyAgICAgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkd6aXAgZXJyb3I6IGluY29ycmVjdCBtZXNzYWdlIGxlbmd0aFxuIikpOworICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgICB9CisgICAgfQorI2VuZGlmCisgIH0KKyNlbmRpZgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKQorICAgIHdoaWxlICgoaW50KXNvYXBfZ2V0Y2hhcihzb2FwKSAhPSBFT0YpIC8qIGFkdmFuY2UgdG8gbGFzdCBjaHVuayAqLworICAgICAgOworICBpZiAoc29hcC0+ZmRpc2Nvbm5lY3QgJiYgKHNvYXAtPmVycm9yID0gc29hcC0+ZmRpc2Nvbm5lY3Qoc29hcCkpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgIHJldHVybiBzb2FwX3Jlc29sdmUoc29hcCk7CisjZWxzZQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+eGxpc3QpCisgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9NSU1FX0hSRUY7CisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9ESU1FX0hSRUY7CisgIH0KKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9mcmVlKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzdHJ1Y3QgTmFtZXNwYWNlICpuczsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIG5hbWVzcGFjZSBzdGFja1xuIikpOworICB3aGlsZSAoc29hcC0+bmxpc3QpCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wID0gc29hcC0+bmxpc3QtPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPm5saXN0KTsKKyAgICBzb2FwLT5ubGlzdCA9IG5wOworICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZSBhbnkgcmVtYWluaW5nIHRlbXAgYmxvY2tzXG4iKSk7CisgIHdoaWxlIChzb2FwLT5ibGlzdCkKKyAgICBzb2FwX2VuZF9ibG9jayhzb2FwKTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIGF0dHJpYnV0ZSBzdG9yYWdlXG4iKSk7CisgIHdoaWxlIChzb2FwLT5hdHRyaWJ1dGVzKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqdHAgPSBzb2FwLT5hdHRyaWJ1dGVzLT5uZXh0OworICAgIGlmIChzb2FwLT5hdHRyaWJ1dGVzLT52YWx1ZSkKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5hdHRyaWJ1dGVzLT52YWx1ZSk7CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPmF0dHJpYnV0ZXMpOworICAgIHNvYXAtPmF0dHJpYnV0ZXMgPSB0cDsKKyAgfQorI2lmZGVmIFdJVEhfRkFTVAorICBpZiAoc29hcC0+bGFiYnVmKQorICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5sYWJidWYpOworICBzb2FwLT5sYWJidWYgPSBOVUxMOworICBzb2FwLT5sYWJsZW4gPSAwOworICBzb2FwLT5sYWJpZHggPSAwOworI2VuZGlmCisgIG5zID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlczsKKyAgaWYgKG5zKQorICB7IGZvciAoOyBucy0+aWQ7IG5zKyspCisgICAgeyBpZiAobnMtPm91dCkKKyAgICAgIHsgaWYgKHNvYXAtPmVuY29kaW5nU3R5bGUgPT0gbnMtPm91dCkKKyAgICAgICAgICBzb2FwLT5lbmNvZGluZ1N0eWxlID0gU09BUF9TVFJfRU9TOworICAgICAgICBTT0FQX0ZSRUUoc29hcCwgbnMtPm91dCk7CisgICAgICAgIG5zLT5vdXQgPSBOVUxMOworICAgICAgfQorICAgICAgaWYgKHNvYXAtPmVuY29kaW5nU3R5bGUgPT0gbnMtPm5zKQorICAgICAgICBzb2FwLT5lbmNvZGluZ1N0eWxlID0gU09BUF9TVFJfRU9TOworICAgIH0KKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+bG9jYWxfbmFtZXNwYWNlcyk7CisgICAgc29hcC0+bG9jYWxfbmFtZXNwYWNlcyA9IE5VTEw7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgd2hpbGUgKHNvYXAtPnhsaXN0KQorICB7IHN0cnVjdCBzb2FwX3hsaXN0ICp4cCA9IHNvYXAtPnhsaXN0LT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT54bGlzdCk7CisgICAgc29hcC0+eGxpc3QgPSB4cDsKKyAgfQorI2VuZGlmCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICBzb2FwX2ZyZWVfcGh0KHNvYXApOworICBzb2FwX2ZyZWVfaWh0KHNvYXApOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitzdGF0aWMgdm9pZAorc29hcF9pbml0X2xvZ3Moc3RydWN0IHNvYXAgKnNvYXApCit7IGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9NQVhMT0dTOyBpKyspCisgIHsgc29hcC0+bG9nZmlsZVtpXSA9IE5VTEw7CisgICAgc29hcC0+ZmRlYnVnW2ldID0gTlVMTDsKKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgIWRlZmluZWQoV0lUSF9MRUFOKSB8fCBkZWZpbmVkKFNPQVBfREVCVUcpCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX29wZW5fbG9nZmlsZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGkpCit7IGlmIChzb2FwLT5sb2dmaWxlW2ldKQorICAgIHNvYXAtPmZkZWJ1Z1tpXSA9IGZvcGVuKHNvYXAtPmxvZ2ZpbGVbaV0sIGkgPCAyID8gImFiIiA6ICJhIik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitzdGF0aWMgdm9pZAorc29hcF9jbG9zZV9sb2dmaWxlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgaSkKK3sgaWYgKHNvYXAtPmZkZWJ1Z1tpXSkKKyAgeyBmY2xvc2Uoc29hcC0+ZmRlYnVnW2ldKTsKKyAgICBzb2FwLT5mZGVidWdbaV0gPSBOVUxMOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2Nsb3NlX2xvZ2ZpbGVzKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfTUFYTE9HUzsgaSsrKQorICAgIHNvYXBfY2xvc2VfbG9nZmlsZShzb2FwLCBpKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK3N0YXRpYyB2b2lkCitzb2FwX3NldF9sb2dmaWxlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgaSwgY29uc3QgY2hhciAqbG9nZmlsZSkKK3sgY2hhciAqcyA9IE5VTEw7CisgIHNvYXBfY2xvc2VfbG9nZmlsZShzb2FwLCBpKTsKKyAgaWYgKHNvYXAtPmxvZ2ZpbGVbaV0pCisgICAgU09BUF9GUkVFKHNvYXAsICh2b2lkKilzb2FwLT5sb2dmaWxlW2ldKTsKKyAgaWYgKGxvZ2ZpbGUpCisgICAgaWYgKChzID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihsb2dmaWxlKSArIDEpKSkKKyAgICAgIHN0cmNweShzLCBsb2dmaWxlKTsKKyAgc29hcC0+bG9nZmlsZVtpXSA9IHM7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9yZWN2X2xvZ2ZpbGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmxvZ2ZpbGUpCit7IHNvYXBfc2V0X2xvZ2ZpbGUoc29hcCwgU09BUF9JTkRFWF9SRUNWLCBsb2dmaWxlKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X3NlbnRfbG9nZmlsZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbG9nZmlsZSkKK3sgc29hcF9zZXRfbG9nZmlsZShzb2FwLCBTT0FQX0lOREVYX1NFTlQsIGxvZ2ZpbGUpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfdGVzdF9sb2dmaWxlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpsb2dmaWxlKQoreyBzb2FwX3NldF9sb2dmaWxlKHNvYXAsIFNPQVBfSU5ERVhfVEVTVCwgbG9nZmlsZSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcCoKK1NPQVBfRk1BQzIKK3NvYXBfY29weShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmV0dXJuIHNvYXBfY29weV9jb250ZXh0KChzdHJ1Y3Qgc29hcCopbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc29hcCkpLCBzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwKgorU09BUF9GTUFDMgorc29hcF9jb3B5X2NvbnRleHQoc3RydWN0IHNvYXAgKmNvcHksIHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcF9jaGVja19zdGF0ZShzb2FwKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKGNvcHkpCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGx1Z2luICpwOworICAgIG1lbWNweShjb3B5LCBzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXApKTsKKyAgICBjb3B5LT5zdGF0ZSA9IFNPQVBfQ09QWTsKKyAgICBjb3B5LT51c2VyID0gTlVMTDsKKyAgICBjb3B5LT5lcnJvciA9IFNPQVBfT0s7CisgICAgY29weS0+dXNlcmlkID0gTlVMTDsKKyAgICBjb3B5LT5wYXNzd2QgPSBOVUxMOworICAgIGNvcHktPm5saXN0ID0gTlVMTDsKKyAgICBjb3B5LT5ibGlzdCA9IE5VTEw7CisgICAgY29weS0+Y2xpc3QgPSBOVUxMOworICAgIGNvcHktPmFsaXN0ID0gTlVMTDsKKyAgICBjb3B5LT5hdHRyaWJ1dGVzID0gTlVMTDsKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgICBjb3B5LT5sYWJidWYgPSBOVUxMOworICAgIGNvcHktPmxhYmxlbiA9IDA7CisgICAgY29weS0+bGFiaWR4ID0gMDsKKyNlbmRpZgorI2lmZGVmIFNPQVBfREVCVUcKKyAgICBzb2FwX2luaXRfbWh0KGNvcHkpOworI2VuZGlmCisgICAgY29weS0+bG9jYWxfbmFtZXNwYWNlcyA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICAgIHNvYXBfaW5pdF9paHQoY29weSk7CisgICAgc29hcF9pbml0X3BodChjb3B5KTsKKyNlbmRpZgorICAgIGNvcHktPmhlYWRlciA9IE5VTEw7CisgICAgY29weS0+ZmF1bHQgPSBOVUxMOworICAgIGNvcHktPmFjdGlvbiA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorI2lmZGVmIFdJVEhfQ09PS0lFUworICAgIGNvcHktPmNvb2tpZXMgPSBzb2FwX2NvcHlfY29va2llcyhjb3B5KTsKKyNlbHNlCisgICAgY29weS0+Y29va2llcyA9IE5VTEw7CisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIFNPQVBfREVCVUcKKyAgICBzb2FwX2luaXRfbG9ncyhjb3B5KTsKKyAgICBzb2FwX3NldF9yZWN2X2xvZ2ZpbGUoY29weSwgc29hcC0+bG9nZmlsZVtTT0FQX0lOREVYX1JFQ1ZdKTsKKyAgICBzb2FwX3NldF9zZW50X2xvZ2ZpbGUoY29weSwgc29hcC0+bG9nZmlsZVtTT0FQX0lOREVYX1NFTlRdKTsKKyAgICBzb2FwX3NldF90ZXN0X2xvZ2ZpbGUoY29weSwgc29hcC0+bG9nZmlsZVtTT0FQX0lOREVYX1RFU1RdKTsKKyNlbmRpZgorICAgIGNvcHktPnBsdWdpbnMgPSBOVUxMOworICAgIGZvciAocCA9IHNvYXAtPnBsdWdpbnM7IHA7IHAgPSBwLT5uZXh0KQorICAgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGx1Z2luICpxID0gKHN0cnVjdCBzb2FwX3BsdWdpbiopU09BUF9NQUxMT0MoY29weSwgc2l6ZW9mKHN0cnVjdCBzb2FwX3BsdWdpbikpOworICAgICAgaWYgKCFxKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weWluZyBwbHVnaW4gJyVzJ1xuIiwgcC0+aWQpKTsKKyAgICAgICpxID0gKnA7CisgICAgICBpZiAocC0+ZmNvcHkgJiYgKHNvYXAtPmVycm9yID0gcC0+ZmNvcHkoY29weSwgcSwgcCkpKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBjb3B5IHBsdWdpbiAnJXMnXG4iLCBwLT5pZCkpOworICAgICAgICBTT0FQX0ZSRUUoY29weSwgcSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgcS0+bmV4dCA9IGNvcHktPnBsdWdpbnM7CisgICAgICBjb3B5LT5wbHVnaW5zID0gcTsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgIHJldHVybiBjb3B5OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9pbml0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5zdGF0ZSA9IFNPQVBfSU5JVDsKKyAgc29hcC0+dmVyc2lvbiA9IDA7CisgIHNvYXBfaW1vZGUoc29hcCwgU09BUF9JT19ERUZBVUxUKTsKKyAgc29hcF9vbW9kZShzb2FwLCBTT0FQX0lPX0RFRkFVTFQpOworICBzb2FwLT5wbHVnaW5zID0gTlVMTDsKKyAgc29hcC0+dXNlciA9IE5VTEw7CisgIHNvYXAtPnVzZXJpZCA9IE5VTEw7CisgIHNvYXAtPnBhc3N3ZCA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTk9IVFRQCisgIHNvYXAtPmZwb3N0ID0gaHR0cF9wb3N0OworICBzb2FwLT5mZ2V0ID0gaHR0cF9nZXQ7CisgIHNvYXAtPmZmb3JtID0gTlVMTDsKKyAgc29hcC0+ZnBvc3RoZHIgPSBodHRwX3Bvc3RfaGVhZGVyOworICBzb2FwLT5mcmVzcG9uc2UgPSBodHRwX3Jlc3BvbnNlOworICBzb2FwLT5mcGFyc2UgPSBodHRwX3BhcnNlOworICBzb2FwLT5mcGFyc2VoZHIgPSBodHRwX3BhcnNlX2hlYWRlcjsKKyNlbmRpZgorICBzb2FwLT5mY29ubmVjdCA9IE5VTEw7CisgIHNvYXAtPmZkaXNjb25uZWN0ID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfSVBWNgorICBzb2FwLT5mcmVzb2x2ZSA9IHRjcF9nZXRob3N0OworI2Vsc2UKKyAgc29hcC0+ZnJlc29sdmUgPSBOVUxMOworI2VuZGlmCisgIHNvYXAtPmZhY2NlcHQgPSB0Y3BfYWNjZXB0OworICBzb2FwLT5mb3BlbiA9IHRjcF9jb25uZWN0OworICBzb2FwLT5mY2xvc2UgPSB0Y3BfZGlzY29ubmVjdDsKKyAgc29hcC0+ZmNsb3Nlc29ja2V0ID0gdGNwX2Nsb3Nlc29ja2V0OworICBzb2FwLT5mc2h1dGRvd25zb2NrZXQgPSB0Y3Bfc2h1dGRvd25zb2NrZXQ7CisgIHNvYXAtPmZzZW5kID0gZnNlbmQ7CisgIHNvYXAtPmZyZWN2ID0gZnJlY3Y7CisgIHNvYXAtPmZwb2xsID0gc29hcF9wb2xsOworI2Vsc2UKKyAgc29hcC0+Zm9wZW4gPSBOVUxMOworICBzb2FwLT5mY2xvc2UgPSBOVUxMOworICBzb2FwLT5mcG9sbCA9IE5VTEw7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcC0+ZnByZXBhcmVpbml0ID0gTlVMTDsKKyAgc29hcC0+ZnByZXBhcmVzZW5kID0gTlVMTDsKKyAgc29hcC0+ZnByZXBhcmVyZWN2ID0gTlVMTDsKKyAgc29hcC0+ZnByZXBhcmVmaW5hbCA9IE5VTEw7CisjZW5kaWYKKyAgc29hcC0+ZnNldGVycm9yID0gTlVMTDsKKyAgc29hcC0+Zmlnbm9yZSA9IE5VTEw7CisgIHNvYXAtPmZzZXJ2ZWxvb3AgPSBOVUxMOworICBzb2FwLT5mcGx1Z2luID0gZnBsdWdpbjsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcC0+ZmRpbWVyZWFkb3BlbiA9IE5VTEw7CisgIHNvYXAtPmZkaW1ld3JpdGVvcGVuID0gTlVMTDsKKyAgc29hcC0+ZmRpbWVyZWFkY2xvc2UgPSBOVUxMOworICBzb2FwLT5mZGltZXdyaXRlY2xvc2UgPSBOVUxMOworICBzb2FwLT5mZGltZXJlYWQgPSBOVUxMOworICBzb2FwLT5mZGltZXdyaXRlID0gTlVMTDsKKyNlbmRpZgorICBzb2FwLT5mbG9hdF9mb3JtYXQgPSAiJS44ZyI7IC8qIC44IHByZXNlcnZlcyBzaW5nbGUgRlAgcHJlY2lzaW9uIGFzIG11Y2ggYXMgcG9zc2libGUsIGJ1dCBtaWdodCBub3QgYmUgdmVyeSBlZmZpY2llbnQgKi8KKyAgc29hcC0+ZG91YmxlX2Zvcm1hdCA9ICIlLjE3bGciOyAvKiAuMTcgcHJlc2VydmVzIGRvdWJsZSBGUCBwcmVjaXNpb24gYXMgbXVjaCBhcyBwb3NzaWJsZSwgYnV0IG1pZ2h0IG5vdCBiZSB2ZXJ5IGVmZmljaWVudCAqLworICBzb2FwLT5kaW1lX2lkX2Zvcm1hdCA9ICJjaWQ6aWQlZCI7IC8qIGRlZmF1bHQgRElNRSBpZCBmb3JtYXQgKi8KKyAgc29hcC0+aHR0cF92ZXJzaW9uID0gIjEuMSI7CisgIHNvYXAtPmFjdG9yID0gTlVMTDsKKyAgc29hcC0+bWF4X2tlZXBfYWxpdmUgPSBTT0FQX01BWEtFRVBBTElWRTsKKyAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7CisgIHNvYXAtPnJlY3ZfdGltZW91dCA9IDA7CisgIHNvYXAtPnNlbmRfdGltZW91dCA9IDA7CisgIHNvYXAtPmNvbm5lY3RfdGltZW91dCA9IDA7CisgIHNvYXAtPmFjY2VwdF90aW1lb3V0ID0gMDsKKyAgc29hcC0+c29ja2V0X2ZsYWdzID0gMDsKKyAgc29hcC0+Y29ubmVjdF9mbGFncyA9IDA7CisgIHNvYXAtPmJpbmRfZmxhZ3MgPSAwOworICBzb2FwLT5hY2NlcHRfZmxhZ3MgPSAwOworICBzb2FwLT5pcCA9IDA7CisjaWZkZWYgV0lUSF9GQVNUCisgIHNvYXAtPmxhYmJ1ZiA9IE5VTEw7CisgIHNvYXAtPmxhYmxlbiA9IDA7CisgIHNvYXAtPmxhYmlkeCA9IDA7CisjZW5kaWYKKyAgc29hcC0+ZW5jb2RpbmdTdHlsZSA9IFNPQVBfU1RSX0VPUzsKKyNpZm5kZWYgV0lUSF9OT05BTUVTUEFDRVMKKyAgc29hcC0+bmFtZXNwYWNlcyA9IG5hbWVzcGFjZXM7CisjZWxzZQorICBzb2FwLT5uYW1lc3BhY2VzID0gTlVMTDsKKyNlbmRpZgorICBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzID0gTlVMTDsKKyAgc29hcC0+bmxpc3QgPSBOVUxMOworICBzb2FwLT5ibGlzdCA9IE5VTEw7CisgIHNvYXAtPmNsaXN0ID0gTlVMTDsKKyAgc29hcC0+YWxpc3QgPSBOVUxMOworICBzb2FwLT5hdHRyaWJ1dGVzID0gTlVMTDsKKyAgc29hcC0+aGVhZGVyID0gTlVMTDsKKyAgc29hcC0+ZmF1bHQgPSBOVUxMOworICBzb2FwLT5tYXN0ZXIgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICBzb2FwLT5zb2NrZXQgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICBzb2FwLT5vcyA9IE5VTEw7CisgIHNvYXAtPmlzID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcC0+ZG9tID0gTlVMTDsKKyAgc29hcC0+ZGltZS5saXN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGlzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmxhc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gTlVMTDsKKyAgc29hcC0+bWltZS5zdGFydCA9IE5VTEw7CisgIHNvYXAtPnhsaXN0ID0gTlVMTDsKKyNlbmRpZgorI2lmbmRlZiBVTkRFUl9DRQorICBzb2FwLT5yZWN2ZmQgPSAwOworICBzb2FwLT5zZW5kZmQgPSAxOworI2Vsc2UKKyAgc29hcC0+cmVjdmZkID0gc3RkaW47CisgIHNvYXAtPnNlbmRmZCA9IHN0ZG91dDsKKyNlbmRpZiAKKyAgc29hcC0+aG9zdFswXSA9ICdcMCc7CisgIHNvYXAtPnBvcnQgPSAwOworICBzb2FwLT5hY3Rpb24gPSBOVUxMOworICBzb2FwLT5wcm94eV9ob3N0ID0gTlVMTDsKKyAgc29hcC0+cHJveHlfcG9ydCA9IDgwODA7CisgIHNvYXAtPnByb3h5X3VzZXJpZCA9IE5VTEw7CisgIHNvYXAtPnByb3h5X3Bhc3N3ZCA9IE5VTEw7CisgIHNvYXAtPmF1dGhyZWFsbSA9IE5VTEw7CisgIHNvYXAtPnByb2xvZyA9IE5VTEw7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgIGlmICghc3NsX2luaXRfZG9uZSkKKyAgICBzb2FwX3NzbF9pbml0KCk7CisgIHNvYXAtPmZzc2xhdXRoID0gc3NsX2F1dGhfaW5pdDsKKyAgc29hcC0+ZnNzbHZlcmlmeSA9IHNzbF92ZXJpZnlfY2FsbGJhY2s7CisgIHNvYXAtPmJpbyA9IE5VTEw7CisgIHNvYXAtPnNzbCA9IE5VTEw7CisgIHNvYXAtPmN0eCA9IE5VTEw7CisgIHNvYXAtPnJlcXVpcmVfc2VydmVyX2F1dGggPSAwOworICBzb2FwLT5yZXF1aXJlX2NsaWVudF9hdXRoID0gMDsKKyAgc29hcC0+cnNhID0gMDsKKyAgc29hcC0+a2V5ZmlsZSA9IE5VTEw7CisgIHNvYXAtPnBhc3N3b3JkID0gTlVMTDsKKyAgc29hcC0+ZGhmaWxlID0gTlVMTDsKKyAgc29hcC0+Y2FmaWxlID0gTlVMTDsKKyAgc29hcC0+Y2FwYXRoID0gTlVMTDsKKyAgc29hcC0+Y3JsZmlsZSA9IE5VTEw7CisgIHNvYXAtPnJhbmRmaWxlID0gTlVMTDsKKyAgc29hcC0+c2Vzc2lvbiA9IE5VTEw7CisjZW5kaWYKKyNpZmRlZiBXSVRIX1pMSUIKKyAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9OT05FOworICBzb2FwLT56bGliX2luID0gU09BUF9aTElCX05PTkU7CisgIHNvYXAtPnpsaWJfb3V0ID0gU09BUF9aTElCX05PTkU7CisgIHNvYXAtPmRfc3RyZWFtLnphbGxvYyA9IE5VTEw7CisgIHNvYXAtPmRfc3RyZWFtLnpmcmVlID0gTlVMTDsKKyAgc29hcC0+ZF9zdHJlYW0ub3BhcXVlID0gTlVMTDsKKyAgc29hcC0+el9sZXZlbCA9IDY7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIHNvYXAtPmMxNG5pbmNsdWRlID0gTlVMTDsKKyAgc29hcC0+YzE0bmV4Y2x1ZGUgPSBOVUxMOworICBzb2FwLT5jb29raWVzID0gTlVMTDsKKyAgc29hcC0+Y29va2llX2RvbWFpbiA9IE5VTEw7CisgIHNvYXAtPmNvb2tpZV9wYXRoID0gTlVMTDsKKyAgc29hcC0+Y29va2llX21heCA9IDMyOworI2VuZGlmCisjaWZkZWYgU09BUF9ERUJVRworICBzb2FwX2luaXRfbWh0KHNvYXApOworICBzb2FwX2luaXRfbG9ncyhzb2FwKTsKKyAgc29hcF9zZXRfcmVjdl9sb2dmaWxlKHNvYXAsICJSRUNWLmxvZyIpOworICBzb2FwX3NldF9zZW50X2xvZ2ZpbGUoc29hcCwgIlNFTlQubG9nIik7CisgIHNvYXBfc2V0X3Rlc3RfbG9nZmlsZShzb2FwLCBOVUxMKTsKKyNlbmRpZgorI2lmZGVmIFdNV19SUE1fSU8KKyAgc29hcC0+cnBtcmVxaWQgPSBOVUxMOworI2VuZGlmCisjaWZkZWYgUEFMTQorICBwYWxtTmV0TGliT3BlbigpOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICBzb2FwX2luaXRfaWh0KHNvYXApOworICBzb2FwX2luaXRfcGh0KHNvYXApOworI2VuZGlmCisgIHNvYXBfYmVnaW4oc29hcCk7CisjaWZkZWYgU09BUF9ERUJVRworICBzb2FwX3NldF90ZXN0X2xvZ2ZpbGUoc29hcCwgIlRFU1QubG9nIik7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfaW5pdDEoc3RydWN0IHNvYXAgKnNvYXAsIHNvYXBfbW9kZSBtb2RlKQoreyBzb2FwX2luaXQyKHNvYXAsIG1vZGUsIG1vZGUpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9pbml0MihzdHJ1Y3Qgc29hcCAqc29hcCwgc29hcF9tb2RlIGltb2RlLCBzb2FwX21vZGUgb21vZGUpCit7IHNvYXBfaW5pdChzb2FwKTsKKyAgc29hcF9pbW9kZShzb2FwLCBpbW9kZSk7CisgIHNvYXBfb21vZGUoc29hcCwgb21vZGUpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9iZWdpbihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbml0aWFsaXppbmdcbiIpKTsKKyAgaWYgKCFzb2FwLT5rZWVwX2FsaXZlKQorICB7IHNvYXAtPmJ1ZmxlbiA9IDA7CisgICAgc29hcC0+YnVmaWR4ID0gMDsKKyAgfQorICBzb2FwLT5rZWVwX2FsaXZlID0gKCgoc29hcC0+aW1vZGUgfCBzb2FwLT5vbW9kZSkgJiBTT0FQX0lPX0tFRVBBTElWRSkgIT0gMCk7CisgIHNvYXAtPm51bGwgPSAwOworICBzb2FwLT5wb3NpdGlvbiA9IDA7CisgIHNvYXAtPmVuY29kaW5nID0gMDsKKyAgc29hcC0+bXVzdFVuZGVyc3RhbmQgPSAwOworICBzb2FwLT5tb2RlID0gMDsKKyAgc29hcC0+bnMgPSAwOworICBzb2FwLT5wYXJ0ID0gU09BUF9FTkQ7CisgIHNvYXAtPmFsbG9jZWQgPSAwOworICBzb2FwLT5jb3VudCA9IDA7CisgIHNvYXAtPmxlbmd0aCA9IDA7CisgIHNvYXAtPmNkYXRhID0gMDsKKyAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICBzb2FwLT5wZWVrZWQgPSAwOworICBzb2FwLT5haGVhZCA9IDA7CisgIHNvYXAtPmlkbnVtID0gMDsKKyAgc29hcC0+bGV2ZWwgPSAwOworICBzb2FwLT5lbmRwb2ludFswXSA9ICdcMCc7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXAtPmRpbWUuY2h1bmtzaXplID0gMDsKKyAgc29hcC0+ZGltZS5idWZsZW4gPSAwOworI2VuZGlmCisgIHNvYXBfZnJlZShzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZW5kKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9jbGlzdCAqY3A7CisgIGlmIChzb2FwX2NoZWNrX3N0YXRlKHNvYXApKQorICAgIHJldHVybjsKKyAgc29hcF9mcmVlKHNvYXApOworICBzb2FwX2RlYWxsb2Moc29hcCwgTlVMTCk7CisgIHdoaWxlIChzb2FwLT5jbGlzdCkKKyAgeyBjcCA9IHNvYXAtPmNsaXN0LT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5jbGlzdCk7CisgICAgc29hcC0+Y2xpc3QgPSBjcDsKKyAgfQorICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyNpZmRlZiBTT0FQX0RFQlVHCisgIHNvYXBfY2xvc2VfbG9nZmlsZXMoc29hcCk7CisjZW5kaWYKKyNpZmRlZiBQQUxNCisgIHBhbG1OZXRMaWJDbG9zZSgpOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X25hbWVzcGFjZXMoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBOYW1lc3BhY2UgKnApCit7IHJlZ2lzdGVyIHN0cnVjdCBOYW1lc3BhY2UgKm5zID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlczsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wLCAqbnEsICpucjsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGxldmVsID0gc29hcC0+bGV2ZWw7CisgIHNvYXAtPm5hbWVzcGFjZXMgPSBwOworICBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzID0gTlVMTDsKKyAgc29hcF9zZXRfbG9jYWxfbmFtZXNwYWNlcyhzb2FwKTsKKyAgLyogcmV2ZXJzZSB0aGUgbmFtZXNwYWNlIGxpc3QgKi8KKyAgbnAgPSBzb2FwLT5ubGlzdDsKKyAgc29hcC0+bmxpc3QgPSBOVUxMOworICBpZiAobnApCisgIHsgbnEgPSBucC0+bmV4dDsKKyAgICBucC0+bmV4dCA9IE5VTEw7CisgICAgd2hpbGUgKG5xKQorICAgIHsgbnIgPSBucS0+bmV4dDsKKyAgICAgIG5xLT5uZXh0ID0gbnA7CisgICAgICBucCA9IG5xOworICAgICAgbnEgPSBucjsKKyAgICB9CisgIH0KKyAgLyogdGhlbiBwdXNoIG9uIG5ldyBzdGFjayAqLworICB3aGlsZSAobnApCisgIHsgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKKyAgICBzb2FwLT5sZXZlbCA9IG5wLT5sZXZlbDsgLyogcHJlc2VydmUgZWxlbWVudCBuZXN0aW5nIGxldmVsICovCisgICAgcyA9IG5wLT5uczsKKyAgICBpZiAoIXMgJiYgbnAtPmluZGV4ID49IDAgJiYgbnMpCisgICAgeyBzID0gbnNbbnAtPmluZGV4XS5vdXQ7CisgICAgICBpZiAoIXMpCisgICAgICAgIHMgPSBuc1tucC0+aW5kZXhdLm5zOworICAgIH0KKyAgICBpZiAocyAmJiBzb2FwX3B1c2hfbmFtZXNwYWNlKHNvYXAsIG5wLT5pZCwgcykpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgbnEgPSBucDsKKyAgICBucCA9IG5wLT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBucSk7CisgIH0KKyAgaWYgKG5zKQorICB7IHJlZ2lzdGVyIGludCBpOworICAgIGZvciAoaSA9IDA7IG5zW2ldLmlkOyBpKyspCisgICAgeyBpZiAobnNbaV0ub3V0KQorICAgICAgeyBTT0FQX0ZSRUUoc29hcCwgbnNbaV0ub3V0KTsKKyAgICAgICAgbnNbaV0ub3V0ID0gTlVMTDsKKyAgICAgIH0KKyAgICB9CisgICAgU09BUF9GUkVFKHNvYXAsIG5zKTsKKyAgfQorICBzb2FwLT5sZXZlbCA9IGxldmVsOyAvKiByZXN0b3JlIGxldmVsICovCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfbG9jYWxfbmFtZXNwYWNlcyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXAtPm5hbWVzcGFjZXMgJiYgIXNvYXAtPmxvY2FsX25hbWVzcGFjZXMpCisgIHsgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IE5hbWVzcGFjZSAqbnMxOworICAgIHJlZ2lzdGVyIHN0cnVjdCBOYW1lc3BhY2UgKm5zMjsKKyAgICByZWdpc3RlciBzaXplX3QgbiA9IDE7CisgICAgZm9yIChuczEgPSBzb2FwLT5uYW1lc3BhY2VzOyBuczEtPmlkOyBuczErKykKKyAgICAgIG4rKzsKKyAgICBuICo9IHNpemVvZihzdHJ1Y3QgTmFtZXNwYWNlKTsKKyAgICBuczIgPSAoc3RydWN0IE5hbWVzcGFjZSopU09BUF9NQUxMT0Moc29hcCwgbik7CisgICAgaWYgKG5zMikKKyAgICB7IG1lbWNweShuczIsIHNvYXAtPm5hbWVzcGFjZXMsIG4pOworICAgICAgaWYgKG5zMlswXS5ucykKKyAgICAgIHsgaWYgKCFzdHJjbXAobnMyWzBdLm5zLCBzb2FwX2VudjEpKQorICAgICAgICAgIHNvYXAtPnZlcnNpb24gPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgc29hcC0+dmVyc2lvbiA9IDI7CisgICAgICB9CisgICAgICBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzID0gbnMyOworICAgIH0KKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIgKgorU09BUF9GTUFDMgorc29hcF9zdHJzZWFyY2goY29uc3QgY2hhciAqYmlnLCBjb25zdCBjaGFyICpsaXR0bGUpCit7IHNpemVfdCBuID0gc3RybGVuKGxpdHRsZSk7CisgIGNvbnN0IGNoYXIgKnMgPSBiaWc7CisgIHdoaWxlIChzKSAKKyAgeyBpZiAoIXN0cm5jbXAocywgbGl0dGxlLCBuKSAmJiAoc1tuXSA9PSAnXDAnIHx8IHNbbl0gPT0gJyAnKSkKKyAgICAgIHJldHVybiBzOworICAgIHMgPSBzdHJjaHIocywgJyAnKTsKKyAgICBpZiAocykKKyAgICAgIHMrKzsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIHN0cnVjdCBzb2FwX25saXN0ICoKK3NvYXBfbG9va3VwX25zKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHNpemVfdCBuKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnA7CisgIGZvciAobnAgPSBzb2FwLT5ubGlzdDsgbnA7IG5wID0gbnAtPm5leHQpCisgIHsgaWYgKCFzdHJuY21wKG5wLT5pZCwgdGFnLCBuKSAmJiAhbnAtPmlkW25dKQorICAgICAgcmV0dXJuIG5wOworICB9CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIHN0cnVjdCBzb2FwX25saXN0ICoKK3NvYXBfcHVzaF9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKm5zLCBzaG9ydCB1dGlsaXplZCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wOworICBzaXplX3QgbiwgazsKKyAgaWYgKHNvYXBfc3Ryc2VhcmNoKHNvYXAtPmMxNG5leGNsdWRlLCBpZCkpCisgICAgcmV0dXJuIE5VTEw7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUHVzaCBuYW1lc3BhY2UgYmluZGluZyAobGV2ZWw9JXUpICclcycgJyVzJ1xuIiwgc29hcC0+bGV2ZWwsIGlkLCBucz9uczoiIikpOworICBpZiAoIXV0aWxpemVkKQorICB7IGZvciAobnAgPSBzb2FwLT5ubGlzdDsgbnA7IG5wID0gbnAtPm5leHQpCisgICAgeyBpZiAoIXN0cmNtcChucC0+aWQsIGlkKSAmJiAoIW5wLT5ucyB8fCAhc3RyY21wKG5wLT5ucywgbnMpKSkKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChucCkKKyAgICB7IGlmIChucC0+aW5kZXggPT0gMSkKKyAgICAgICAgdXRpbGl6ZWQgPSBucC0+aW5kZXg7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgfQorICBuID0gc3RybGVuKGlkKTsKKyAgaWYgKG5zKQorICAgIGsgPSBzdHJsZW4obnMpOworICBlbHNlCisgICAgayA9IDA7CisgIG5wID0gKHN0cnVjdCBzb2FwX25saXN0KilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfbmxpc3QpICsgbiArIGsgKyAxKTsKKyAgaWYgKCFucCkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHJldHVybiBOVUxMOworICB9CisgIG5wLT5uZXh0ID0gc29hcC0+bmxpc3Q7CisgIHNvYXAtPm5saXN0ID0gbnA7CisgIHN0cmNweShucC0+aWQsIGlkKTsKKyAgaWYgKG5zKQorICB7IG5wLT5ucyA9IG5wLT5pZCArIG4gKyAxOworICAgIHN0cmNweShucC0+bnMsIG5zKTsKKyAgfQorICBlbHNlCisgICAgbnAtPm5zID0gTlVMTDsKKyAgbnAtPmxldmVsID0gc29hcC0+bGV2ZWw7CisgIG5wLT5pbmRleCA9IHV0aWxpemVkOworICByZXR1cm4gbnA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgdm9pZAorc29hcF91dGlsaXplX25zKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHNpemVfdCBuKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnAgPSBzb2FwX2xvb2t1cF9ucyhzb2FwLCB0YWcsIG4pOworICBpZiAobnApCisgIHsgaWYgKG5wLT5pbmRleCA9PSAwKQorICAgICAgc29hcF9wdXNoX25zKHNvYXAsIG5wLT5pZCwgbnAtPm5zLCAxKTsKKyAgfQorICBlbHNlCisgIHsgc3RybmNweShzb2FwLT50bXBidWYsIHRhZywgbik7CisgICAgc29hcC0+dG1wYnVmW25dID0gJ1wwJzsKKyAgICBzb2FwX3B1c2hfbnMoc29hcCwgc29hcC0+dG1wYnVmLCBOVUxMLCAxKTsKKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIHZvaWQKK3NvYXBfcG9wX25zKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwX3BvcF9uYW1lc3BhY2Uoc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnR5cGUpCit7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRWxlbWVudCBiZWdpbiB0YWc9JyVzJyBpZD0nJWQnIHR5cGU9JyVzJ1xuIiwgdGFnLCBpZCwgdHlwZT90eXBlOiIiKSk7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKmVsdCA9IChzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50KSk7CisgICAgaWYgKCFlbHQpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICBlbHQtPnNvYXAgPSBzb2FwOworICAgIGVsdC0+bmV4dCA9IE5VTEw7CisgICAgZWx0LT5wcm50ID0gc29hcC0+ZG9tOworICAgIGVsdC0+bmFtZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHRhZyk7CisgICAgZWx0LT5lbHRzID0gTlVMTDsKKyAgICBlbHQtPmF0dHMgPSBOVUxMOworICAgIGVsdC0+bnN0ciA9IE5VTEw7CisgICAgZWx0LT5kYXRhID0gTlVMTDsKKyAgICBlbHQtPndpZGUgPSBOVUxMOworICAgIGVsdC0+bm9kZSA9IE5VTEw7CisgICAgZWx0LT50eXBlID0gMDsKKyAgICBlbHQtPmhlYWQgPSBOVUxMOworICAgIGVsdC0+dGFpbCA9IE5VTEw7CisgICAgaWYgKHNvYXAtPmRvbSkKKyAgICB7IHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICpwID0gc29hcC0+ZG9tLT5lbHRzOworICAgICAgaWYgKHApCisgICAgICB7IHdoaWxlIChwLT5uZXh0KQorICAgICAgICAgIHAgPSBwLT5uZXh0OworICAgICAgICBwLT5uZXh0ID0gZWx0OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBzb2FwLT5kb20tPmVsdHMgPSBlbHQ7CisgICAgfQorICAgIHNvYXAtPmRvbSA9IGVsdDsKKyAgfQorICBlbHNlCisgIHsKKyNlbmRpZgorICAgIHNvYXAtPmxldmVsKys7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmICghc29hcC0+bnMpCisgICAgeyBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICAgICAgICYmIHNvYXBfc2VuZChzb2FwLCBzb2FwLT5wcm9sb2cgPyBzb2FwLT5wcm9sb2cgOiAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBlbHNlIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfSU5ERU5UKQorICAgIHsgaWYgKHNvYXAtPm5zID09IDEgJiYgc29hcF9zZW5kX3Jhdyhzb2FwLCBzb2FwX2luZGVudCwgc29hcC0+bGV2ZWwgPCBzaXplb2Yoc29hcF9pbmRlbnQpID8gc29hcC0+bGV2ZWwgOiBzaXplb2Yoc29hcF9pbmRlbnQpIC0gMSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHNvYXAtPmJvZHkgPSAxOworICAgIH0KKyNlbmRpZgorICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsICI8IiwgMSkKKyAgICAgfHwgc29hcF9zZW5kKHNvYXAsIHRhZykpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjaWZkZWYgV0lUSF9ET00KKyAgfQorI2VuZGlmCisgIGlmICghc29hcC0+bnMpCisgIHsgc3RydWN0IE5hbWVzcGFjZSAqbnM7CisgICAgZm9yIChucyA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXM7IG5zICYmIG5zLT5pZDsgbnMrKykKKyAgICB7IGlmICgqbnMtPmlkICYmIChucy0+b3V0IHx8IG5zLT5ucykpCisgICAgICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAieG1sbnM6JXMiLCBucy0+aWQpOworICAgICAgICBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgc29hcC0+dG1wYnVmLCBucy0+b3V0ID8gbnMtPm91dCA6IG5zLT5ucykpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgIH0gICAKKyAgfQorICBzb2FwLT5ucyA9IDE7IC8qIHN0YXJ0IHdpdGggMCBvciAyLCBidXQgc2hvdWxkIGJlIG9uZSB0byBjb250aW51ZSAqLworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgIHsgY29uc3QgY2hhciAqcyA9IHN0cmNocih0YWcsICc6Jyk7CisgICAgaWYgKHMpCisgICAgICBzb2FwX3V0aWxpemVfbnMoc29hcCwgdGFnLCBzIC0gdGFnKTsKKyAgfQorI2VuZGlmCisgIGlmIChpZCA+IDApCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJfJWQiLCBpZCk7CisgICAgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJpZCIsIHNvYXAtPnRtcGJ1ZikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHR5cGUgJiYgKnR5cGUpCisgIHsgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJ4c2k6dHlwZSIsIHR5cGUpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgICB7IGNvbnN0IGNoYXIgKnMgPSBzdHJjaHIodHlwZSwgJzonKTsKKyAgICAgIGlmIChzKQorICAgICAgICBzb2FwX3V0aWxpemVfbnMoc29hcCwgdHlwZSwgcyAtIHR5cGUpOworICAgIH0KKyNlbmRpZgorICB9CisgIGlmIChzb2FwLT5udWxsICYmIHNvYXAtPnBvc2l0aW9uID4gMCkKKyAgeyBpbnQgaTsKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIlslZCIsIHNvYXAtPnBvc2l0aW9uc1swXSk7CisgICAgZm9yIChpID0gMTsgaSA8IHNvYXAtPnBvc2l0aW9uOyBpKyspCisgICAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIHN0cmxlbihzb2FwLT50bXBidWYpLCAiLCVkIiwgc29hcC0+cG9zaXRpb25zW2ldKTsKKyAgICBzdHJjYXQoc29hcC0+dG1wYnVmLCAiXSIpOworICAgIGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAiU09BUC1FTkM6cG9zaXRpb24iLCBzb2FwLT50bXBidWYpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmIChzb2FwLT5tdXN0VW5kZXJzdGFuZCkKKyAgeyBpZiAoc29hcC0+YWN0b3IgJiYgKnNvYXAtPmFjdG9yKQorICAgIHsgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsIHNvYXAtPnZlcnNpb24gPT0gMiA/ICJTT0FQLUVOVjpyb2xlIiA6ICJTT0FQLUVOVjphY3RvciIsIHNvYXAtPmFjdG9yKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgIlNPQVAtRU5WOm11c3RVbmRlcnN0YW5kIiwgc29hcC0+dmVyc2lvbiA9PSAyID8gInRydWUiIDogIjEiKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBzb2FwLT5tdXN0VW5kZXJzdGFuZCA9IDA7CisgIH0KKyAgaWYgKHNvYXAtPmVuY29kaW5nKQorICB7IGlmIChzb2FwLT5lbmNvZGluZ1N0eWxlICYmIHNvYXAtPmxvY2FsX25hbWVzcGFjZXMpCisgICAgeyBpZiAoISpzb2FwLT5lbmNvZGluZ1N0eWxlKQorICAgICAgeyBpZiAoc29hcC0+bG9jYWxfbmFtZXNwYWNlc1sxXS5vdXQpCisgICAgICAgICAgc29hcC0+ZW5jb2RpbmdTdHlsZSA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbMV0ub3V0OworICAgICAgICBlbHNlCisgICAgICAgICAgc29hcC0+ZW5jb2RpbmdTdHlsZSA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbMV0ubnM7CisgICAgICB9CisgICAgICBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgIlNPQVAtRU5WOmVuY29kaW5nU3R5bGUiLCBzb2FwLT5lbmNvZGluZ1N0eWxlKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBzb2FwLT5lbmNvZGluZyA9IDA7CisgIH0KKyAgc29hcC0+bnVsbCA9IDA7CisgIHNvYXAtPnBvc2l0aW9uID0gMDsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9iZWdpbl9vdXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICp0eXBlKQoreyBpZiAoKnRhZyA9PSAnLScpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIGlmIChzb2FwX2VsZW1lbnQoc29hcCwgdGFnLCBpZCwgdHlwZSkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X3N0YXJ0X2VuZF9vdXQoc29hcCwgTlVMTCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCisjaWZuZGVmIEhBVkVfU1RSUkNIUgorU09BUF9GTUFDMQorY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfc3RycmNocihjb25zdCBjaGFyICpzLCBpbnQgdCkKK3sgcmVnaXN0ZXIgY2hhciAqciA9IE5VTEw7CisgIHdoaWxlICgqcykKKyAgICBpZiAoKnMrKyA9PSB0KQorICAgICAgciA9IChjaGFyKilzIC0gMTsKKyAgcmV0dXJuIHI7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKKyNpZm5kZWYgSEFWRV9TVFJUT0wKK1NPQVBfRk1BQzEKK2xvbmcKK1NPQVBfRk1BQzIKK3NvYXBfc3RydG9sKGNvbnN0IGNoYXIgKnMsIGNoYXIgKip0LCBpbnQgYikKK3sgcmVnaXN0ZXIgbG9uZyBuID0gMDsKKyAgcmVnaXN0ZXIgaW50IGM7CisgIHdoaWxlICgqcyA+IDAgJiYgKnMgPD0gMzIpCisgICAgcysrOworICBpZiAoYiA9PSAxMCkKKyAgeyBzaG9ydCBuZWcgPSAwOworICAgIGlmICgqcyA9PSAnLScpCisgICAgeyBzKys7CisgICAgICBuZWcgPSAxOworICAgIH0KKyAgICBlbHNlIGlmICgqcyA9PSAnKycpCisgICAgICBzKys7CisgICAgd2hpbGUgKChjID0gKnMpICYmIGMgPj0gJzAnICYmIGMgPD0gJzknKQorICAgIHsgaWYgKG4gPj0gMjE0NzQ4MzY0ICYmIChuID4gMjE0NzQ4MzY0IHx8IGMgPj0gJzgnKSkKKyAgICAgICAgYnJlYWs7CisgICAgICBuICo9IDEwOworICAgICAgbiArPSBjIC0gJzAnOworICAgICAgcysrOworICAgIH0KKyAgICBpZiAobmVnKQorICAgICAgbiA9IC1uOworICB9CisgIGVsc2UgLyogYiA9PSAxNiBhbmQgdmFsdWUgaXMgYWx3YXlzIHBvc2l0aXZlICovCisgIHsgd2hpbGUgKChjID0gKnMpKQorICAgIHsgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQorICAgICAgICBjIC09ICcwJzsKKyAgICAgIGVsc2UgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKQorICAgICAgICBjIC09ICdBJyAtIDEwOworICAgICAgZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCisgICAgICAgIGMgLT0gJ2EnIC0gMTA7CisgICAgICBpZiAobiA+IDB4MDdGRkZGRkYpCisgICAgICAgIGJyZWFrOworICAgICAgbiA8PD0gNDsKKyAgICAgIG4gKz0gYzsKKyAgICAgIHMrKzsKKyAgICB9CisgIH0KKyAgaWYgKHQpCisgICAgKnQgPSAoY2hhciopczsKKyAgcmV0dXJuIG47Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKKyNpZm5kZWYgSEFWRV9TVFJUT1VMCitTT0FQX0ZNQUMxCit1bnNpZ25lZCBsb25nCitTT0FQX0ZNQUMyCitzb2FwX3N0cnRvdWwoY29uc3QgY2hhciAqcywgY2hhciAqKnQsIGludCBiKQoreyB1bnNpZ25lZCBsb25nIG4gPSAwOworICByZWdpc3RlciBpbnQgYzsKKyAgd2hpbGUgKCpzID4gMCAmJiAqcyA8PSAzMikKKyAgICBzKys7CisgIGlmIChiID09IDEwKQorICB7IGlmICgqcyA9PSAnKycpCisgICAgICBzKys7CisgICAgd2hpbGUgKChjID0gKnMpICYmIGMgPj0gJzAnICYmIGMgPD0gJzknKQorICAgIHsgaWYgKG4gPj0gNDI5NDk2NzI5ICYmIChuID4gNDI5NDk2NzI5IHx8IGMgPj0gJzYnKSkKKyAgICAgICAgYnJlYWs7CisgICAgICBuICo9IDEwOworICAgICAgbiArPSBjIC0gJzAnOworICAgICAgcysrOworICAgIH0KKyAgfQorICBlbHNlIC8qIGIgPT0gMTYgKi8KKyAgeyB3aGlsZSAoKGMgPSAqcykpCisgICAgeyBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCisgICAgICAgIGMgLT0gJzAnOworICAgICAgZWxzZSBpZiAoYyA+PSAnQScgJiYgYyA8PSAnRicpCisgICAgICAgIGMgLT0gJ0EnIC0gMTA7CisgICAgICBlbHNlIGlmIChjID49ICdhJyAmJiBjIDw9ICdmJykKKyAgICAgICAgYyAtPSAnYScgLSAxMDsKKyAgICAgIGlmIChuID4gMHgwRkZGRkZGRikKKyAgICAgICAgYnJlYWs7CisgICAgICBuIDw8PSA0OworICAgICAgbiArPSBjOworICAgICAgcysrOworICAgIH0KKyAgfQorICBpZiAodCkKKyAgICAqdCA9IChjaGFyKilzOworICByZXR1cm4gbjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2FycmF5X2JlZ2luX291dChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKm9mZnNldCkKK3sgaWYgKHNvYXBfZWxlbWVudChzb2FwLCB0YWcsIGlkLCAiU09BUC1FTkM6QXJyYXkiKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgIHsgY29uc3QgY2hhciAqczsKKyAgICBzID0gc29hcF9zdHJyY2hyKHR5cGUsICdbJyk7CisgICAgaWYgKChzaXplX3QpKHMgLSB0eXBlKSA8IHNpemVvZihzb2FwLT50bXBidWYpKQorICAgIHsgc3RybmNweShzb2FwLT50bXBidWYsIHR5cGUsIHMgLSB0eXBlKTsKKyAgICAgIHNvYXAtPnRtcGJ1ZltzIC0gdHlwZV0gPSAnXDAnOworICAgICAgaWYgKHR5cGUgJiYgKnR5cGUgJiYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJTT0FQLUVOQzppdGVtVHlwZSIsIHNvYXAtPnRtcGJ1ZikpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBpZiAocyAmJiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgIlNPQVAtRU5DOmFycmF5U2l6ZSIsIHMgKyAxKSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7IGlmIChvZmZzZXQgJiYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJTT0FQLUVOQzpvZmZzZXQiLCBvZmZzZXQpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAodHlwZSAmJiAqdHlwZSAmJiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgIlNPQVAtRU5DOmFycmF5VHlwZSIsIHR5cGUpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHR5cGUgJiYgKnR5cGUgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpKQorICB7IGNvbnN0IGNoYXIgKnMgPSBzdHJjaHIodHlwZSwgJzonKTsKKyAgICBpZiAocykKKyAgICAgIHNvYXBfdXRpbGl6ZV9ucyhzb2FwLCB0eXBlLCBzIC0gdHlwZSk7CisgIH0KKyNlbmRpZgorICByZXR1cm4gc29hcF9lbGVtZW50X3N0YXJ0X2VuZF9vdXQoc29hcCwgTlVMTCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqdHA7CisjaWZkZWYgV0lUSF9ET00KKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAqKmF0dDsKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgYXR0ID0gJnNvYXAtPmRvbS0+YXR0czsKKyAgICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgICAgeyBpZiAodHAtPnZpc2libGUpCisgICAgICB7ICphdHQgPSAoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUpKTsKKwlpZiAoISphdHQpCisJICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKwkoKmF0dCktPm5leHQgPSBOVUxMOworICAgICAgICAoKmF0dCktPm5zdHIgPSBOVUxMOworICAgICAgICAoKmF0dCktPm5hbWUgPSBzb2FwX3N0cmR1cChzb2FwLCB0cC0+bmFtZSk7CisgICAgICAgICgqYXR0KS0+ZGF0YSA9IHNvYXBfc3RyZHVwKHNvYXAsIHRwLT52YWx1ZSk7CisgICAgICAgICgqYXR0KS0+d2lkZSA9IE5VTEw7CisgICAgICAgICgqYXR0KS0+c29hcCA9IHNvYXA7CisgICAgICAgIHRwLT52aXNpYmxlID0gMDsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgIHsgc3RydWN0IHNvYXBfbmxpc3QgKm5wOworICAgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgICB7IGlmICh0cC0+dmlzaWJsZSAmJiB0cC0+bmFtZSkKKyAgICAgIHsgY29uc3QgY2hhciAqcyA9IHN0cmNocih0cC0+bmFtZSwgJzonKTsKKyAgICAgICAgaWYgKHMpCisgICAgICAgICAgc29hcF91dGlsaXplX25zKHNvYXAsIHRwLT5uYW1lLCBzIC0gdHAtPm5hbWUpOworICAgICAgfQorICAgIH0KKyAgICBmb3IgKG5wID0gc29hcC0+bmxpc3Q7IG5wOyBucCA9IG5wLT5uZXh0KQorICAgIHsgaWYgKG5wLT5pbmRleCA9PSAxICYmIG5wLT5ucykKKyAgICAgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJ4bWxuczolcyIsIG5wLT5pZCk7CisgICAgICAgIHNvYXBfc2V0X2F0dHIoc29hcCwgc29hcC0+dG1wYnVmLCBucC0+bnMpOworICAgICAgICBucC0+aW5kZXggPSAyOworICAgICAgfQorICAgIH0KKyAgfQorI2VuZGlmCisgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgeyBpZiAodHAtPnZpc2libGUpCisgICAgeyBpZiAoc29hcF9zZW5kKHNvYXAsICIgIikgfHwgc29hcF9zZW5kKHNvYXAsIHRwLT5uYW1lKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgaWYgKHRwLT52aXNpYmxlID09IDIgJiYgdHAtPnZhbHVlKQorICAgICAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAiPVwiIiwgMikKKwkgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHRwLT52YWx1ZSwgMSkKKwkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiXCIiLCAxKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB0cC0+dmlzaWJsZSA9IDA7CisgICAgfQorICB9CisgIGlmICh0YWcpCisgIHsgCisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICAgIHsgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgIj4iLCAxKQorICAgICAgIHx8IHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZykpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgc29hcC0+bGV2ZWwtLTsJLyogZGVjcmVtZW50IGxldmVsIGp1c3QgYmVmb3JlIC8+ICovCisgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgIi8+IiwgMikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgIj4iLCAxKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X2VuZF9vdXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZykKK3sgaWYgKCp0YWcgPT0gJy0nKQorICAgIHJldHVybiBTT0FQX09LOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVsZW1lbnQgZW5kaW5nIHRhZz0nJXMnXG4iLCB0YWcpKTsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBpZiAoc29hcC0+ZG9tLT5wcm50KQorICAgICAgc29hcC0+ZG9tID0gc29hcC0+ZG9tLT5wcm50OworICAgIHJldHVybiBTT0FQX09LOworICB9CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICAgIHNvYXBfcG9wX25zKHNvYXApOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0lOREVOVCkKKyAgeyBpZiAoIXNvYXAtPmJvZHkpCisgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzb2FwX2luZGVudCwgc29hcC0+bGV2ZWwgPCBzaXplb2Yoc29hcF9pbmRlbnQpID8gc29hcC0+bGV2ZWwgOiBzaXplb2Yoc29hcF9pbmRlbnQpIC0gMSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgc29hcC0+Ym9keSA9IDA7CisgIH0KKyNlbmRpZgorICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAiPC8iLCAyKQorICAgfHwgc29hcF9zZW5kKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBzb2FwLT5sZXZlbC0tOwkvKiBkZWNyZW1lbnQgbGV2ZWwganVzdCBiZWZvcmUgPiAqLworICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCAiPiIsIDEpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfcmVmKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgaW50IGhyZWYpCit7IHJlZ2lzdGVyIGludCBuID0gMDsKKyAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgICBuID0gMTsKKyAgc3ByaW50Zihzb2FwLT5ocmVmLCAiI18lZCIsIGhyZWYpOworICByZXR1cm4gc29hcF9lbGVtZW50X2hyZWYoc29hcCwgdGFnLCBpZCwgImhyZWYiICsgbiwgc29hcC0+aHJlZiArIG4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfaHJlZihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnJlZiwgY29uc3QgY2hhciAqdmFsKQoreyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVsZW1lbnQgJyVzJyByZWZlcmVuY2UgJXM9JyVzJ1xuIiwgdGFnLCByZWYsIHZhbCkpOworICBpZiAoc29hcF9lbGVtZW50KHNvYXAsIHRhZywgaWQsIE5VTEwpCisgICB8fCBzb2FwX2F0dHJpYnV0ZShzb2FwLCByZWYsIHZhbCkKKyAgIHx8IHNvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHNvYXAsIHRhZykpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X251bGwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICp0eXBlKQoreyBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKnRwOworICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgICAgaWYgKHRwLT52aXNpYmxlKQorICAgICAgYnJlYWs7CisgIGlmICh0cCB8fCAoc29hcC0+dmVyc2lvbiA9PSAyICYmIHNvYXAtPnBvc2l0aW9uID4gMCkgfHwgaWQgPiAwIHx8IChzb2FwLT5tb2RlICYgU09BUF9YTUxfTklMKSkKKyAgeyBpZiAoc29hcF9lbGVtZW50KHNvYXAsIHRhZywgaWQsIHR5cGUpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmIChzb2FwLT5wYXJ0ICE9IFNPQVBfSU5fSEVBREVSICYmIHNvYXAtPmVuY29kaW5nU3R5bGUpCisgICAgICBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgInhzaTpuaWwiLCAidHJ1ZSIpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgcmV0dXJuIHNvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHNvYXAsIHRhZyk7CisgIH0KKyAgc29hcC0+bnVsbCA9IDE7CisgIHNvYXAtPnBvc2l0aW9uID0gMDsKKyAgc29hcC0+bXVzdFVuZGVyc3RhbmQgPSAwOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X2lkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgdm9pZCAqcCwgY29uc3Qgc3RydWN0IHNvYXBfYXJyYXkgKmEsIGludCBuLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkgCit7IGlmICghcCB8fCAoYSAmJiAhYS0+X19wdHIpKQorICB7IHNvYXBfZWxlbWVudF9udWxsKHNvYXAsIHRhZywgaWQsIHR5cGUpOworICAgIHJldHVybiAtMTsKKyAgfQorI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9UUkVFKQorICAgIHJldHVybiAwOworICBpZiAoaWQgPCAwKQorICB7IHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgICBpZiAoYSkKKyAgICAgIGlkID0gc29hcF9hcnJheV9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCBhLCBuLCB0LCAmcHApOworICAgIGVsc2UKKyAgICAgIGlkID0gc29hcF9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCB0LCAmcHApOworICAgIGlmIChpZCkKKyAgICB7IGlmIChzb2FwX2lzX2VtYmVkZGVkKHNvYXAsIHBwKSkKKyAgICAgIHsgc29hcF9lbGVtZW50X3JlZihzb2FwLCB0YWcsIDAsIGlkKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgaWYgKHNvYXBfaXNfc2luZ2xlKHNvYXAsIHBwKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICBzb2FwX3NldF9lbWJlZGRlZChzb2FwLCBwcCk7CisgICAgfQorICB9CisgIHJldHVybiBpZDsKKyNlbHNlCisgIHJldHVybiAwOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9yZXN1bHQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZykKK3sgaWYgKHNvYXAtPnZlcnNpb24gPT0gMiAmJiBzb2FwLT5lbmNvZGluZ1N0eWxlKQorICAgIGlmIChzb2FwX2VsZW1lbnQoc29hcCwgIlNPQVAtUlBDOnJlc3VsdCIsIDAsIE5VTEwpCisgICAgIHx8IHNvYXBfYXR0cmlidXRlKHNvYXAsICJ4bWxuczpTT0FQLVJQQyIsIHNvYXBfcnBjKQorICAgICB8fCBzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzb2FwLCBOVUxMKQorICAgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgdGFnLCAwKQorICAgICB8fCBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCAiU09BUC1SUEM6cmVzdWx0IikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2F0dHJpYnV0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7IAorI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgKmEgPSAoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUpKTsKKyAgICBhLT5uZXh0ID0gc29hcC0+ZG9tLT5hdHRzOworICAgIGEtPm5zdHIgPSBOVUxMOworICAgIGEtPm5hbWUgPSBzb2FwX3N0cmR1cChzb2FwLCBuYW1lKTsKKyAgICBhLT5kYXRhID0gc29hcF9zdHJkdXAoc29hcCwgdmFsdWUpOworICAgIGEtPndpZGUgPSBOVUxMOworICAgIGEtPnNvYXAgPSBzb2FwOworICAgIHNvYXAtPmRvbS0+YXR0cyA9IGE7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgIHsgLyogVE9ETzogY29uc2lkZXIgdXNpbmcgdGhpcyBjb2RlIHRvIGhhbmRsZSBkZWZhdWx0IG5hbWVzcGFjZQorICAgIGlmICghc3RybmNtcChuYW1lLCAieG1sbnMiLCA1KSAmJiAobmFtZVs1XSA9PSAnOicgfHwgbmFtZVs1XSA9PSAnXDAnKSkKKyAgICB7IGlmIChuYW1lWzVdID09ICc6JykKKyAgICAgICAgc29hcF9wdXNoX25zKHNvYXAsIG5hbWUgKyA2LCB2YWx1ZSwgMCk7CisgICAgICBlbHNlCisgICAgICAgIHNvYXBfcHVzaF9ucyhzb2FwLCAiIiwgdmFsdWUsIDApOworICAgIH0KKyAgICAqLworICAgIGlmICghc3RybmNtcChuYW1lLCAieG1sbnM6IiwgNikpCisgICAgICBzb2FwX3B1c2hfbnMoc29hcCwgbmFtZSArIDYsIHZhbHVlLCAwKTsKKyAgICBlbHNlIGlmIChzb2FwX3NldF9hdHRyKHNvYXAsIG5hbWUsIHZhbHVlKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBlbHNlCisjZW5kaWYKKyAgeyBpZiAoc29hcF9zZW5kKHNvYXAsICIgIikgfHwgc29hcF9zZW5kKHNvYXAsIG5hbWUpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmICh2YWx1ZSkKKyAgICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsICI9XCIiLCAyKQorICAgICAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCB2YWx1ZSwgMSkKKyAgICAgICB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICJcIiIsIDEpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9iZWdpbl9pbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgbmlsbGFibGUpCit7IGlmICghc29hcF9wZWVrX2VsZW1lbnQoc29hcCkpCisgIHsgaWYgKHNvYXAtPm90aGVyKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9UQUdfTUlTTUFUQ0g7CisgICAgaWYgKHRhZyAmJiAqdGFnID09ICctJykKKyAgICAgIHJldHVybiBTT0FQX09LOworICAgIGlmICghKHNvYXAtPmVycm9yID0gc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dGFnLCB0YWcpKSkKKyAgICB7IHNvYXAtPnBlZWtlZCA9IDA7CisgICAgICBpZiAoc29hcC0+Ym9keSkKKyAgICAgICAgc29hcC0+bGV2ZWwrKzsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQmVnaW4gZWxlbWVudCBmb3VuZCAobGV2ZWw9JXUpICclcyc9JyVzJ1xuIiwgc29hcC0+bGV2ZWwsIHNvYXAtPnRhZywgdGFnP3RhZzoiIiApKTsKKyAgICAgIGlmICghbmlsbGFibGUgJiYgc29hcC0+bnVsbCAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTlVMTDsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcgJiYgdGFnICYmICp0YWcgPT0gJy0nKQorICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfZW5kX2luKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcpICAKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICByZWdpc3RlciBjaGFyICpzOworICByZWdpc3RlciBjb25zdCBjaGFyICp0OworICByZWdpc3RlciBpbnQgbiA9IDA7CisgIGlmICh0YWcgJiYgKnRhZyA9PSAnLScpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIHNvYXAtPmxldmVsLS07CisgIHNvYXBfcG9wX25hbWVzcGFjZShzb2FwKTsKKyNpZmRlZiBXSVRIX0RPTQorICAvKiB0aGlzIHdoaXRlc3BhY2Ugb3IgbWl4ZWQgY29udGVudCBpcyBub3QgaW5zaWduaWZpY2FudCBmb3IgRE9NICovCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IGlmICghc29hcC0+cGVla2VkICYmICFzb2FwX3N0cmluZ19pbihzb2FwLCAzLCAtMSwgLTEpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmIChzb2FwLT5kb20tPnBybnQpCisgICAgICBzb2FwLT5kb20gPSBzb2FwLT5kb20tPnBybnQ7CisgIH0KKyNlbmRpZgorICBpZiAoc29hcC0+cGVla2VkKQorICB7IGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgICBpZiAoKnNvYXAtPnRhZykKKyAgICAgIG4rKzsKKyAgICBzb2FwLT5wZWVrZWQgPSAwOworICB9CisgIGRvCisgIHsgd2hpbGUgKCgoYyA9IHNvYXBfZ2V0KHNvYXApKSAhPSBTT0FQX1RUKSkKKyAgICB7IGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAgIGlmIChjID09IFNPQVBfTFQpCisgICAgICAgIG4rKzsKKyAgICAgIGVsc2UgaWYgKGMgPT0gJy8nKQorICAgICAgeyBjID0gc29hcF9nZXQoc29hcCk7CisgICAgICAgIGlmIChjID09IFNPQVBfR1QpCisJICBuLS07CisgICAgICAgIGVsc2UKKwkgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICB9CisgICAgfQorICB9IHdoaWxlIChuLS0pOworICBzID0gc29hcC0+dGFnOworICB3aGlsZSAoc29hcF9ub3RibGFuayhjID0gc29hcF9nZXQoc29hcCkpKQorICAgICpzKysgPSAoY2hhciljOworICAqcyA9ICdcMCc7CisgIGlmICgoaW50KWMgPT0gRU9GKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICB3aGlsZSAoc29hcF9ibGFuayhjKSkKKyAgICBjID0gc29hcF9nZXQoc29hcCk7CisgIGlmIChjICE9IFNPQVBfR1QpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9TWU5UQVhfRVJST1I7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIGVsZW1lbnQgZm91bmQgKGxldmVsPSV1KSAnJXMnPSclcydcbiIsIHNvYXAtPmxldmVsLCBzb2FwLT50YWcsIHRhZz90YWc6IiIpKTsKKyAgaWYgKCF0YWcgfHwgISp0YWcpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIGlmICgocyA9IHN0cmNocihzb2FwLT50YWcsICc6JykpKQorICAgIHMrKzsKKyAgZWxzZQorICAgIHMgPSBzb2FwLT50YWc7CisgIGlmICgodCA9IHN0cmNocih0YWcsICc6JykpKQorICAgIHQrKzsKKyAgZWxzZQorICAgIHQgPSB0YWc7CisgIGlmICghU09BUF9TVFJDTVAocywgdCkpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIGVsZW1lbnQgdGFnIG5hbWUgZG9lcyBub3QgbWF0Y2hcbiIpKTsKKyAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9TWU5UQVhfRVJST1I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfYXR0cl92YWx1ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWcpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqdHA7CisgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgICBpZiAoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCBuYW1lKSkKKyAgICAgIGJyZWFrOworICBpZiAodHAgJiYgdHAtPnZpc2libGUgPT0gMikKKyAgeyBpZiAoZmxhZyA9PSAyICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9QUk9ISUJJVEVEOworICAgIGVsc2UKKyAgICAgIHJldHVybiB0cC0+dmFsdWU7CisgIH0KKyAgZWxzZSBpZiAoZmxhZyA9PSAxICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfUkVRVUlSRUQ7CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NldF9hdHRyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfYXR0cmlidXRlICp0cDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTZXQgYXR0cmlidXRlICVzPSclcydcbiIsIG5hbWUsIHZhbHVlP3ZhbHVlOiIiKSk7CisgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgeyBpZiAoIXN0cmNtcCh0cC0+bmFtZSwgbmFtZSkpCisgICAgICBicmVhazsKKyAgfQorICBpZiAoIXRwKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQWxsb2NhdGUgYXR0cmlidXRlICVzXG4iLCBuYW1lKSk7CisgICAgaWYgKCEodHAgPSAoc3RydWN0IHNvYXBfYXR0cmlidXRlKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfYXR0cmlidXRlKSArIHN0cmxlbihuYW1lKSkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgdHAtPm5zID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgICAgeyBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKip0cHAgPSAmc29hcC0+YXR0cmlidXRlczsKKyAgICAgIGNvbnN0IGNoYXIgKnMgPSBzdHJjaHIobmFtZSwgJzonKTsKKyAgICAgIGlmICghc3RybmNtcChuYW1lLCAieG1sbnMiLCA1KSkKKyAgICAgIHsgZm9yICg7ICp0cHA7IHRwcCA9ICYoKnRwcCktPm5leHQpCisgICAgICAgICAgaWYgKHN0cm5jbXAoKCp0cHApLT5uYW1lLCAieG1sbnMiLCA1KSB8fCBzdHJjbXAoKCp0cHApLT5uYW1lICsgNSwgbmFtZSArIDUpID4gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIXMpCisgICAgICB7IGZvciAoOyAqdHBwOyB0cHAgPSAmKCp0cHApLT5uZXh0KQorICAgICAgICAgIGlmIChzdHJuY21wKCgqdHBwKS0+bmFtZSwgInhtbG5zIiwgNSkgJiYgKCgqdHBwKS0+bnMgfHwgc3RyY21wKCgqdHBwKS0+bmFtZSwgbmFtZSkgPiAwKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBpbnQgazsKKyAgICAgICAgZm9yICg7ICp0cHA7IHRwcCA9ICYoKnRwcCktPm5leHQpCisJeyBpZiAoIXN0cm5jbXAoKCp0cHApLT5uYW1lLCAieG1sbnM6IiwgNikgJiYgIXN0cm5jbXAoKCp0cHApLT5uYW1lICsgNiwgbmFtZSwgcyAtIG5hbWUpICYmICEoKnRwcCktPm5hbWVbNiArIHMgLSBuYW1lXSkKKwkgIHsgaWYgKCF0cC0+bnMpCisgICAgICAgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ2Fub25pY2FsaXphdGlvbjogcHJlZml4ICVzPSVwKCVzKVxuIiwgbmFtZSwgKCp0cHApLT5ucywgKCp0cHApLT5ucykpOworCSAgICAgIHRwLT5ucyA9ICgqdHBwKS0+bnM7CisJICAgIH0KKwkgIH0KKyAgICAgICAgICBlbHNlIGlmIChzdHJuY21wKCgqdHBwKS0+bmFtZSwgInhtbG5zIiwgNSkgJiYgKCp0cHApLT5ucyAmJiB0cC0+bnMgJiYgKChrID0gc3RyY21wKCgqdHBwKS0+bnMsIHRwLT5ucykpID4gMCB8fCAoIWsgJiYgc3RyY21wKCgqdHBwKS0+bmFtZSwgbmFtZSkgPiAwKSkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgdHAtPm5leHQgPSAqdHBwOworICAgICAgKnRwcCA9IHRwOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7IHRwLT5uZXh0ID0gc29hcC0+YXR0cmlidXRlczsKKyAgICAgIHNvYXAtPmF0dHJpYnV0ZXMgPSB0cDsKKyAgICB9CisgICAgc3RyY3B5KHRwLT5uYW1lLCBuYW1lKTsKKyAgICB0cC0+dmFsdWUgPSBOVUxMOworICB9CisgIGVsc2UgaWYgKHRwLT52aXNpYmxlKQorICB7IHJldHVybiBTT0FQX09LOworICB9CisgIGVsc2UgaWYgKHZhbHVlICYmIHRwLT52YWx1ZSAmJiB0cC0+c2l6ZSA8PSBzdHJsZW4odmFsdWUpKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZSBhdHRyaWJ1dGUgdmFsdWUgb2YgJXMgKGZyZWUgJXApXG4iLCBuYW1lLCB0cC0+dmFsdWUpKTsKKyAgICBTT0FQX0ZSRUUoc29hcCwgdHAtPnZhbHVlKTsKKyAgICB0cC0+dmFsdWUgPSBOVUxMOworICAgIHRwLT5ucyA9IE5VTEw7CisgIH0KKyAgaWYgKHZhbHVlKQorICB7IGlmICghdHAtPnZhbHVlKQorICAgIHsgdHAtPnNpemUgPSBzdHJsZW4odmFsdWUpICsgMTsKKyAgICAgIGlmICghKHRwLT52YWx1ZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCB0cC0+c2l6ZSkpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQWxsb2NhdGUgYXR0cmlidXRlIHZhbHVlIG9mICVzICglcClcbiIsIHRwLT5uYW1lLCB0cC0+dmFsdWUpKTsKKyAgICB9CisgICAgc3RyY3B5KHRwLT52YWx1ZSwgdmFsdWUpOworICAgIGlmICghc3RybmNtcCh0cC0+bmFtZSwgInhtbG5zOiIsIDYpKQorICAgICAgdHAtPm5zID0gdHAtPnZhbHVlOworICAgIHRwLT52aXNpYmxlID0gMjsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIndzdTpJZCIpKQorICAgIHsgc29hcC0+cGFydCA9IFNPQVBfQkVHSU5fU0VDVVJJVFk7CisgICAgICBzdHJuY3B5KHNvYXAtPmlkLCB2YWx1ZSwgc2l6ZW9mKHNvYXAtPmlkKSk7CisgICAgICBzb2FwLT5pZFtzaXplb2Yoc29hcC0+aWQpLTFdID0gJ1wwJzsKKyAgICB9CisjZW5kaWYKKyAgfQorICBlbHNlCisgICAgdHAtPnZpc2libGUgPSAxOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfY2xyX2F0dHIoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqdHA7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpKQorICB7IHdoaWxlIChzb2FwLT5hdHRyaWJ1dGVzKQorICAgIHsgdHAgPSBzb2FwLT5hdHRyaWJ1dGVzLT5uZXh0OworICAgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPmF0dHJpYnV0ZXMtPnZhbHVlKTsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5hdHRyaWJ1dGVzKTsKKyAgICAgIHNvYXAtPmF0dHJpYnV0ZXMgPSB0cDsKKyAgICB9CisgIH0KKyAgZWxzZQorI2VuZGlmCisgIHsgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICAgICAgdHAtPnZpc2libGUgPSAwOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitzdGF0aWMgaW50Citzb2FwX2dldGF0dHJ2YWwoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnMsIHNpemVfdCBuLCBzb2FwX3djaGFyIGQpCit7IHJlZ2lzdGVyIHNpemVfdCBpOworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICB7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IHNvYXBfZ2V0KHNvYXApOworICAgIHN3aXRjaCAoYykKKyAgICB7CisgICAgY2FzZSBTT0FQX1RUOgorICAgICAgKnMrKyA9ICc8JzsKKyAgICAgIHNvYXBfdW5nZXQoc29hcCwgJy8nKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9MVDoKKyAgICAgICpzKysgPSAnPCc7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfR1Q6CisgICAgICBpZiAoZCA9PSAnICcpCisgICAgICB7IHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgICpzID0gJ1wwJzsKKyAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgICB9CisgICAgICAqcysrID0gJz4nOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1FUOgorICAgICAgaWYgKGMgPT0gZCkKKyAgICAgIHsgKnMgPSAnXDAnOworICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICAgIH0KKyAgICAgICpzKysgPSAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfQVA6CisgICAgICBpZiAoYyA9PSBkKQorICAgICAgeyAqcyA9ICdcMCc7CisgICAgICAgIHJldHVybiBTT0FQX09LOworICAgICAgfQorICAgICAgKnMrKyA9ICdcJyc7CisgICAgICBicmVhazsKKyAgICBjYXNlICdcdCc6CisgICAgY2FzZSAnXG4nOgorICAgIGNhc2UgJ1xyJzoKKyAgICBjYXNlICcgJzoKKyAgICBjYXNlICcvJzoKKyAgICAgIGlmIChkID09ICcgJykKKyAgICAgIHsgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgKnMgPSAnXDAnOworICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgICAgKnMrKyA9IChjaGFyKWM7CisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgV0lUSF9GQVNUCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3N0b3JlX2xhYihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgc2l6ZV90IG4pCit7IHNvYXAtPmxhYmlkeCA9IDA7CisgIHJldHVybiBzb2FwX2FwcGVuZF9sYWIoc29hcCwgcywgbik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFdJVEhfRkFTVAorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9hcHBlbmRfbGFiKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBzaXplX3QgbikKK3sgaWYgKHNvYXAtPmxhYmlkeCArIG4gPj0gc29hcC0+bGFibGVuKQorICB7IHJlZ2lzdGVyIGNoYXIgKnQgPSBzb2FwLT5sYWJidWY7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmxhcmdpbmcgbG9vay1hc2lkZSBidWZmZXIgdG8gYXBwZW5kIGRhdGEsIG9sZCBzaXplPSVsdSIsICh1bnNpZ25lZCBsb25nKXNvYXAtPmxhYmxlbikpOworICAgIGlmIChzb2FwLT5sYWJsZW4gPT0gMCkKKyAgICAgIHNvYXAtPmxhYmxlbiA9IFNPQVBfTEFCTEVOOworICAgIHdoaWxlIChzb2FwLT5sYWJpZHggKyBuID49IHNvYXAtPmxhYmxlbikKKyAgICAgIHNvYXAtPmxhYmxlbiA8PD0gMTsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIiwgbmV3IHNpemU9JWx1XG4iLCAodW5zaWduZWQgbG9uZylzb2FwLT5sYWJsZW4pKTsKKyAgICBzb2FwLT5sYWJidWYgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc29hcC0+bGFibGVuKTsKKyAgICBpZiAoIXNvYXAtPmxhYmJ1ZikKKyAgICB7IGlmICh0KQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgdCk7CisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICB9CisgICAgaWYgKHQpCisgICAgeyBtZW1jcHkoc29hcC0+bGFiYnVmLCB0LCBzb2FwLT5sYWJpZHgpOworICAgICAgU09BUF9GUkVFKHNvYXAsIHQpOworICAgIH0KKyAgfQorICBpZiAocykKKyAgeyBtZW1jcHkoc29hcC0+bGFiYnVmICsgc29hcC0+bGFiaWR4LCBzLCBuKTsKKyAgICBzb2FwLT5sYWJpZHggKz0gbjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3BlZWtfZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyNpZmRlZiBXSVRIX0RPTQorICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICoqYXR0ID0gTlVMTDsKKyAgcmVnaXN0ZXIgY2hhciAqbGVhZCA9IE5VTEw7CisjZW5kaWYKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfYXR0cmlidXRlICp0cDsKKyAgY29uc3QgY2hhciAqdDsKKyAgcmVnaXN0ZXIgY2hhciAqczsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICByZWdpc3RlciBpbnQgaTsKKyAgaWYgKHNvYXAtPnBlZWtlZCkKKyAgeyBpZiAoISpzb2FwLT50YWcpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX05PX1RBRzsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICBzb2FwLT5wZWVrZWQgPSAxOworICBjID0gc29hcF9nZXR1dGY4KHNvYXApOworI2lmZGVmIFdJVEhfRE9NCisgIC8qIHdoaXRlc3BhY2UgbGVhZGluZyB0byBzdGFydCB0YWcgaXMgbm90IGluc2lnbmlmaWNhbnQgZm9yIERPTSAqLworICBpZiAoc29hcF9ibGFuayhjKSkKKyAgeyBzb2FwLT5sYWJpZHggPSAwOworICAgIGRvCisgICAgeyBpZiAoc29hcF9hcHBlbmRfbGFiKHNvYXAsIE5VTEwsIDApKQorICAgICAgICByZXR1cm4gU09BUF9FT007CisgICAgICBzID0gc29hcC0+bGFiYnVmICsgc29hcC0+bGFiaWR4OworICAgICAgaSA9IHNvYXAtPmxhYmxlbiAtIHNvYXAtPmxhYmlkeDsKKyAgICAgIHNvYXAtPmxhYmlkeCA9IHNvYXAtPmxhYmxlbjsKKyAgICAgIHdoaWxlIChzb2FwX2JsYW5rKGMpICYmIGktLSkKKyAgICAgIHsgKnMrKyA9IGM7CisgICAgICAgIGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisgICAgICB9CisgICAgfQorICAgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyAgICAqcyA9ICdcMCc7CisgICAgbGVhZCA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPmxhYmJ1Zik7CisgIH0KKyNlbHNlCisgIHdoaWxlIChzb2FwX2JsYW5rKGMpKQorICAgIGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisjZW5kaWYKKyAgaWYgKGMgIT0gU09BUF9MVCkKKyAgeyAqc29hcC0+dGFnID0gJ1wwJzsKKyAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisjaWZkZWYgV0lUSF9ET00KKyAgICAvKiB3aGl0ZXNwYWNlIGxlYWRpbmcgdG8gZW5kIHRhZyBpcyBub3QgaW5zaWduaWZpY2FudCBmb3IgRE9NICovCisgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgICAgICBzb2FwLT5kb20tPnRhaWwgPSBzb2FwX3N0cmR1cChzb2FwLCBsZWFkKTsKKyNlbmRpZgorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTk9fVEFHOworICB9CisgIHMgPSBzb2FwLT50YWc7CisgIGRvIGMgPSBzb2FwX2dldDEoc29hcCk7CisgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyAgaSA9IHNpemVvZihzb2FwLT50YWcpOworICB3aGlsZSAoYyAhPSAnPicgJiYgYyAhPSAnLycgJiYgc29hcF9ub3RibGFuayhjKSkKKyAgeyBpZiAoLS1pID4gMCkKKyAgICAgICpzKysgPSAoY2hhciljOworICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgIH0KKyAgd2hpbGUgKHNvYXBfYmxhbmsoYykpCisgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgKnMgPSAnXDAnOworICBzb2FwLT5pZFswXSA9ICdcMCc7CisgIHNvYXAtPmhyZWZbMF0gPSAnXDAnOworICBzb2FwLT50eXBlWzBdID0gJ1wwJzsKKyAgc29hcC0+YXJyYXlUeXBlWzBdID0gJ1wwJzsKKyAgc29hcC0+YXJyYXlTaXplWzBdID0gJ1wwJzsKKyAgc29hcC0+YXJyYXlPZmZzZXRbMF0gPSAnXDAnOworICBzb2FwLT5vdGhlciA9IDA7CisgIHNvYXAtPnJvb3QgPSAtMTsKKyAgc29hcC0+cG9zaXRpb24gPSAwOworICBzb2FwLT5udWxsID0gMDsKKyAgc29hcC0+bXVzdFVuZGVyc3RhbmQgPSAwOworI2lmZGVmIFdJVEhfRE9NCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICplbHQ7CisgICAgZWx0ID0gKHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50Kilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQpKTsKKyAgICBpZiAoIWVsdCkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIGVsdC0+bmV4dCA9IE5VTEw7CisgICAgZWx0LT5uc3RyID0gTlVMTDsKKyAgICBlbHQtPm5hbWUgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT50YWcpOworICAgIGVsdC0+cHJudCA9IHNvYXAtPmRvbTsKKyAgICBlbHQtPmVsdHMgPSBOVUxMOworICAgIGVsdC0+YXR0cyA9IE5VTEw7CisgICAgZWx0LT5kYXRhID0gTlVMTDsKKyAgICBlbHQtPndpZGUgPSBOVUxMOworICAgIGVsdC0+dHlwZSA9IDA7CisgICAgZWx0LT5ub2RlID0gTlVMTDsKKyAgICBlbHQtPmhlYWQgPSBsZWFkOworICAgIGVsdC0+dGFpbCA9IE5VTEw7CisgICAgZWx0LT5zb2FwID0gc29hcDsKKyAgICBpZiAoc29hcC0+ZG9tKQorICAgIHsgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKnAgPSBzb2FwLT5kb20tPmVsdHM7CisgICAgICBpZiAocCkKKyAgICAgIHsgd2hpbGUgKHAtPm5leHQpCisgICAgICAgICAgcCA9IHAtPm5leHQ7CisgICAgICAgIHAtPm5leHQgPSBlbHQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHNvYXAtPmRvbS0+ZWx0cyA9IGVsdDsKKyAgICB9CisgICAgc29hcC0+ZG9tID0gZWx0OworICAgIGF0dCA9ICZlbHQtPmF0dHM7CisgIH0KKyNlbmRpZgorICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgICAgdHAtPnZpc2libGUgPSAwOworICB3aGlsZSAoKGludCljICE9IEVPRiAmJiBjICE9ICc+JyAmJiBjICE9ICcvJykKKyAgeyBzID0gc29hcC0+dG1wYnVmOworICAgIGkgPSBzaXplb2Yoc29hcC0+dG1wYnVmKTsKKyAgICB3aGlsZSAoYyAhPSAnPScgJiYgYyAhPSAnPicgJiYgYyAhPSAnLycgJiYgc29hcF9ub3RibGFuayhjKSkKKyAgICB7IGlmICgtLWkgPiAwKQorICAgICAgICAqcysrID0gKGNoYXIpYzsKKyAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgfQorICAgICpzID0gJ1wwJzsKKyAgICBpZiAoaSA9PSBzaXplb2Yoc29hcC0+dG1wYnVmKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfU1lOVEFYX0VSUk9SOworI2lmZGVmIFdJVEhfRE9NCisgICAgLyogYWRkIGF0dHJpYnV0ZSBuYW1lIHRvIGRvbSAqLworICAgIGlmIChhdHQpCisgICAgeyAqYXR0ID0gKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlKSk7CisgICAgICAgaWYgKCEqYXR0KQorICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICAgKCphdHQpLT5uZXh0ID0gTlVMTDsKKyAgICAgICAoKmF0dCktPm5zdHIgPSBOVUxMOworICAgICAgICgqYXR0KS0+bmFtZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPnRtcGJ1Zik7CisgICAgICAgKCphdHQpLT5kYXRhID0gTlVMTDsKKyAgICAgICAoKmF0dCktPndpZGUgPSBOVUxMOworICAgICAgICgqYXR0KS0+c29hcCA9IHNvYXA7CisgICAgfQorI2VuZGlmCisgICAgaWYgKCFzdHJuY21wKHNvYXAtPnRtcGJ1ZiwgInhtbG5zIiwgNSkpCisgICAgeyBpZiAoc29hcC0+dG1wYnVmWzVdID09ICc6JykKKyAgICAgIHsgc29hcC0+dG1wYnVmWzVdID0gJ1wwJzsKKyAgICAgICAgdCA9IHNvYXAtPnRtcGJ1ZiArIDY7CisgICAgICB9CisgICAgICBlbHNlIGlmIChzb2FwLT50bXBidWZbNV0pCisgICAgICAgIHQgPSBOVUxMOworICAgICAgZWxzZQorICAgICAgICB0ID0gU09BUF9TVFJfRU9TOworICAgIH0KKyAgICBlbHNlCisgICAgICB0ID0gTlVMTDsKKyAgICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgICAgeyBpZiAoIVNPQVBfU1RSQ01QKHRwLT5uYW1lLCBzb2FwLT50bXBidWYpKQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCF0cCkKKyAgICB7IHRwID0gKHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSkgKyBzdHJsZW4oc29hcC0+dG1wYnVmKSk7CisgICAgICBpZiAoIXRwKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgIHN0cmNweSh0cC0+bmFtZSwgc29hcC0+dG1wYnVmKTsKKyAgICAgIHRwLT52YWx1ZSA9IE5VTEw7CisgICAgICB0cC0+c2l6ZSA9IDA7CisgICAgICB0cC0+bmV4dCA9IHNvYXAtPmF0dHJpYnV0ZXM7CisgICAgICBzb2FwLT5hdHRyaWJ1dGVzID0gdHA7CisgICAgfQorICAgIHdoaWxlIChzb2FwX2JsYW5rKGMpKQorICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICBpZiAoYyA9PSAnPScpCisgICAgeyBkbyBjID0gc29hcF9nZXR1dGY4KHNvYXApOworICAgICAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworICAgICAgaWYgKGMgIT0gU09BUF9RVCAmJiBjICE9IFNPQVBfQVApCisgICAgICB7IHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgIGMgPSAnICc7IC8qIGJsYW5rIGRlbGltaXRlciAqLworICAgICAgfQorICAgICAgaWYgKHNvYXBfZ2V0YXR0cnZhbChzb2FwLCB0cC0+dmFsdWUsIHRwLT5zaXplLCBjKSkKKyAgICAgIHsKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgICAgICAgaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfRU9NKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworCWlmIChzb2FwX3N0b3JlX2xhYihzb2FwLCB0cC0+dmFsdWUsIHRwLT5zaXplKSkKKwkgIHJldHVybiBzb2FwLT5lcnJvcjsKKwlpZiAodHAtPnZhbHVlKQorCSAgU09BUF9GUkVFKHNvYXAsIHRwLT52YWx1ZSk7CisJZm9yICg7OykKKwl7IGlmIChzb2FwX2dldGF0dHJ2YWwoc29hcCwgc29hcC0+bGFiYnVmICsgc29hcC0+bGFiaWR4LCBzb2FwLT5sYWJsZW4gLSBzb2FwLT5sYWJpZHgsIGMpKQorCSAgeyBpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9FT00pCisJICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworCSAgICBzb2FwLT5sYWJpZHggPSBzb2FwLT5sYWJsZW47CisJICAgIGlmIChzb2FwX2FwcGVuZF9sYWIoc29hcCwgTlVMTCwgMCkpCisJICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworCSAgfQorCSAgZWxzZQorCSAgICBicmVhazsKKwl9CisJaWYgKHNvYXAtPmxhYmlkeCkKKyAgICAgICAgICB0cC0+c2l6ZSA9IHNvYXAtPmxhYmxlbjsKKwllbHNlCisJeyB0cC0+c2l6ZSA9IHN0cmxlbihzb2FwLT5sYWJidWYpICsgMTsKKyAgICAgICAgICBpZiAodHAtPnNpemUgPCBTT0FQX0xBQkxFTikKKwkgICAgdHAtPnNpemUgPSBTT0FQX0xBQkxFTjsKKyAgICAgICAgfQorCWlmICghKHRwLT52YWx1ZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCB0cC0+c2l6ZSkpKQorCSAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICAgIHN0cmNweSh0cC0+dmFsdWUsIHNvYXAtPmxhYmJ1Zik7CisjZWxzZQorCXNpemVfdCBuOworICAgICAgICBpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9FT00pCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgICAgICAgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsgaWYgKCEocyA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgU09BUF9CTEtMRU4pKSkKKyAgICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgICBpZiAoc29hcF9nZXRhdHRydmFsKHNvYXAsIHMsIFNPQVBfQkxLTEVOLCBjKSkKKyAgICAgICAgICB7IGlmIChzb2FwLT5lcnJvciAhPSBTT0FQX0VPTSkKKyAgICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCW4gPSB0cC0+c2l6ZSArIHNvYXAtPmJsaXN0LT5zaXplOworICAgICAgICBpZiAoIShzID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIG4pKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgICAgaWYgKHRwLT52YWx1ZSkKKyAgICAgICAgeyBtZW1jcHkocywgdHAtPnZhbHVlLCB0cC0+c2l6ZSk7CisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHRwLT52YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgc29hcF9zYXZlX2Jsb2NrKHNvYXAsIHMgKyB0cC0+c2l6ZSwgMCk7CisgICAgICAgIHRwLT52YWx1ZSA9IHM7CisgICAgICAgIHRwLT5zaXplID0gbjsKKyNlbmRpZgorICAgICAgfQorICAgICAgZG8gYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyAgICAgIHRwLT52aXNpYmxlID0gMjsgLyogc2VlbiB0aGlzIGF0dHJpYnV0ZSB3LyB2YWx1ZSAqLworI2lmZGVmIFdJVEhfRE9NCisgICAgICBpZiAoYXR0KQorICAgICAgICAoKmF0dCktPmRhdGEgPSBzb2FwX3N0cmR1cChzb2FwLCB0cC0+dmFsdWUpOworI2VuZGlmCisgICAgfQorICAgIGVsc2UKKyAgICAgIHRwLT52aXNpYmxlID0gMTsgLyogc2VlbiB0aGlzIGF0dHJpYnV0ZSB3L28gdmFsdWUgKi8KKyNpZmRlZiBXSVRIX0RPTQorICAgIGlmIChhdHQpCisgICAgICBhdHQgPSAmKCphdHQpLT5uZXh0OworI2VuZGlmCisgICAgaWYgKHQgJiYgdHAtPnZhbHVlKQorICAgIHsgaWYgKHNvYXBfcHVzaF9uYW1lc3BhY2Uoc29hcCwgdCwgdHAtPnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgdHAtPnZpc2libGUgPSAwOworICAgIH0KKyAgfQorI2lmZGVmIFdJVEhfRE9NCisgIGlmIChhdHQpCisgIHsgc29hcC0+ZG9tLT5uc3RyID0gc29hcF9jdXJyZW50X25hbWVzcGFjZShzb2FwLCBzb2FwLT50YWcpOworICAgIGZvciAoYXR0ID0gJnNvYXAtPmRvbS0+YXR0czsgKmF0dDsgYXR0ID0gJigqYXR0KS0+bmV4dCkKKyAgICAgICgqYXR0KS0+bnN0ciA9IHNvYXBfY3VycmVudF9uYW1lc3BhY2Uoc29hcCwgKCphdHQpLT5uYW1lKTsKKyAgfQorI2VuZGlmCisgIGlmICgoaW50KWMgPT0gRU9GKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICBpZiAoIShzb2FwLT5ib2R5ID0gKGMgIT0gJy8nKSkpCisgICAgZG8gYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICB3aGlsZSAoc29hcF9ibGFuayhjKSk7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pCisgIHsgaWYgKCFzb2FwLT5ib2R5ICYmIHNvYXAtPmRvbS0+cHJudCkKKyAgICAgIHNvYXAtPmRvbSA9IHNvYXAtPmRvbS0+cHJudDsKKyAgfQorI2VuZGlmCisgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgeyBpZiAodHAtPnZpc2libGUgJiYgdHAtPnZhbHVlKQorICAgIHsgaWYgKCFzdHJjbXAodHAtPm5hbWUsICJpZCIpKQorICAgICAgeyAqc29hcC0+aWQgPSAnIyc7CisgICAgICAgIHN0cm5jcHkoc29hcC0+aWQgKyAxLCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT5pZCkgLSAyKTsKKyAgICAgICAgc29hcC0+aWRbc2l6ZW9mKHNvYXAtPmlkKS0xXSA9ICdcMCc7CisgICAgICB9CisgICAgICBlbHNlIGlmICghc3RyY21wKHRwLT5uYW1lLCAiaHJlZiIpKQorICAgICAgeyBzdHJuY3B5KHNvYXAtPmhyZWYsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPmhyZWYpIC0gMSk7CisgICAgICAgIHNvYXAtPmhyZWZbc2l6ZW9mKHNvYXAtPmhyZWYpLTFdID0gJ1wwJzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKChzb2FwLT52ZXJzaW9uID09IDIgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9HUkFQSCkpICYmICFzdHJjbXAodHAtPm5hbWUsICJyZWYiKSkKKyAgICAgIHsgKnNvYXAtPmhyZWYgPSAnIyc7CisgICAgICAgIHN0cm5jcHkoc29hcC0+aHJlZiArIDEsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPmhyZWYpIC0gMik7CisgICAgICAgIHNvYXAtPmhyZWZbc2l6ZW9mKHNvYXAtPmhyZWYpLTFdID0gJ1wwJzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgInhzaTp0eXBlIikpCisgICAgICB7IHN0cm5jcHkoc29hcC0+dHlwZSwgdHAtPnZhbHVlLCBzaXplb2Yoc29hcC0+dHlwZSkgLSAxKTsKKyAgICAgICAgc29hcC0+dHlwZVtzaXplb2Yoc29hcC0+dHlwZSktMV0gPSAnXDAnOworICAgICAgfQorICAgICAgZWxzZSBpZiAoc29hcC0+dmVyc2lvbiA9PSAxICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5DOmFycmF5VHlwZSIpKQorICAgICAgeyBzID0gc29hcF9zdHJyY2hyKHRwLT52YWx1ZSwgJ1snKTsKKyAgICAgICAgaWYgKHMgJiYgKHNpemVfdCkocyAtIHRwLT52YWx1ZSkgPCBzaXplb2Yoc29hcC0+YXJyYXlUeXBlKSkKKyAgICAgICAgeyBzdHJuY3B5KHNvYXAtPmFycmF5VHlwZSwgdHAtPnZhbHVlLCBzIC0gdHAtPnZhbHVlKTsKKyAgICAgICAgICBzb2FwLT5hcnJheVR5cGVbcyAtIHRwLT52YWx1ZV0gPSAnXDAnOworICAgICAgICAgIHN0cm5jcHkoc29hcC0+YXJyYXlTaXplLCBzLCBzaXplb2Yoc29hcC0+YXJyYXlTaXplKSAtIDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzdHJuY3B5KHNvYXAtPmFycmF5VHlwZSwgdHAtPnZhbHVlLCBzaXplb2Yoc29hcC0+YXJyYXlUeXBlKSAtIDEpOworICAgICAgICBzb2FwLT5hcnJheVNpemVbc2l6ZW9mKHNvYXAtPmFycmF5VHlwZSktMV0gPSAnXDAnOworICAgICAgICBzb2FwLT5hcnJheVR5cGVbc2l6ZW9mKHNvYXAtPmFycmF5VHlwZSktMV0gPSAnXDAnOworICAgICAgfQorICAgICAgZWxzZSBpZiAoc29hcC0+dmVyc2lvbiA9PSAyICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5DOml0ZW1UeXBlIikpCisgICAgICAgIHN0cm5jcHkoc29hcC0+YXJyYXlUeXBlLCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT5hcnJheVR5cGUpIC0gMSk7CisgICAgICBlbHNlIGlmIChzb2FwLT52ZXJzaW9uID09IDIgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTkM6YXJyYXlTaXplIikpCisgICAgICAgIHN0cm5jcHkoc29hcC0+YXJyYXlTaXplLCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT5hcnJheVNpemUpIC0gMSk7CisgICAgICBlbHNlIGlmIChzb2FwLT52ZXJzaW9uID09IDEgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTkM6b2Zmc2V0IikpCisgICAgICAgIHN0cm5jcHkoc29hcC0+YXJyYXlPZmZzZXQsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPmFycmF5T2Zmc2V0KSk7CisgICAgICBlbHNlIGlmIChzb2FwLT52ZXJzaW9uID09IDEgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTkM6cG9zaXRpb24iKSkKKyAgICAgICAgc29hcC0+cG9zaXRpb24gPSBzb2FwX2dldHBvc2l0aW9uKHRwLT52YWx1ZSwgc29hcC0+cG9zaXRpb25zKTsKKyAgICAgIGVsc2UgaWYgKHNvYXAtPnZlcnNpb24gPT0gMSAmJiAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOQzpyb290IikpCisgICAgICAgIHNvYXAtPnJvb3QgPSAoKCFzdHJjbXAodHAtPnZhbHVlLCAiMSIpIHx8ICFzdHJjbXAodHAtPnZhbHVlLCAidHJ1ZSIpKSk7CisgICAgICBlbHNlIGlmICgoc29hcC0+dmVyc2lvbiA9PSAxICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5WOmFjdG9yIikpCisgICAgICAgICAgICB8fCAoc29hcC0+dmVyc2lvbiA9PSAyICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5WOnJvbGUiKSkpCisgICAgICB7IGlmICgoIXNvYXAtPmFjdG9yIHx8IHN0cmNtcChzb2FwLT5hY3RvciwgdHAtPnZhbHVlKSkKKyAgICAgICAgICYmIHN0cmNtcCh0cC0+dmFsdWUsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2FjdG9yL25leHQiKQorICAgICAgICAgJiYgc3RyY21wKHRwLT52YWx1ZSwgImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZS9yb2xlL25leHQiKSkKKyAgICAgICAgICBzb2FwLT5vdGhlciA9IDE7CisgICAgICB9CisgICAgICBlbHNlIGlmICghc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOVjptdXN0VW5kZXJzdGFuZCIpCisgICAgICAgICAgICAmJiAoIXN0cmNtcCh0cC0+dmFsdWUsICIxIikgfHwgIXN0cmNtcCh0cC0+dmFsdWUsICJ0cnVlIikpKQorICAgICAgICBzb2FwLT5tdXN0VW5kZXJzdGFuZCA9IDE7CisgICAgICBlbHNlIGlmICgoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAieHNpOm51bGwiKQorICAgICAgICAgICAgIHx8ICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgInhzaTpuaWwiKSkKKyAgICAgICAgICAgICYmICghc3RyY21wKHRwLT52YWx1ZSwgIjEiKQorICAgICAgICAgICAgIHx8ICFzdHJjbXAodHAtPnZhbHVlLCAidHJ1ZSIpKSkKKyAgICAgICAgc29hcC0+bnVsbCA9IDE7CisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3JldHJ5KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIHNvYXBfcmV2ZXJ0KHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9yZXZlcnQoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmICghc29hcC0+cGVla2VkKQorICB7IHNvYXAtPnBlZWtlZCA9IDE7CisgICAgaWYgKHNvYXAtPmJvZHkpCisgICAgICBzb2FwLT5sZXZlbC0tOworICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmV2ZXJ0aW5nIGxhc3QgZWxlbWVudCAobGV2ZWw9JXUpXG4iLCBzb2FwLT5sZXZlbCkpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3N0cmluZ19vdXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGludCBmbGFnKQoreyByZWdpc3RlciBjb25zdCBjaGFyICp0OworICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgbWFzayA9IDB4RkZGRkZGODBVTDsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBzb2FwLT5kb20tPmRhdGEgPSBzb2FwX3N0cmR1cChzb2FwLCBzKTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2VuZGlmCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9DX1VURlNUUklORykKKyAgICBtYXNrID0gMDsKKyAgdCA9IHM7CisgIHdoaWxlICgoYyA9ICp0KyspKQorICB7IHN3aXRjaCAoYykKKyAgICB7IAorICAgIGNhc2UgOToKKyAgICAgIGlmIChmbGFnKQorICAgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIiYjeDk7IiwgNSkpCisJICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHMgPSB0OworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAxMDoKKyAgICAgIGlmIChmbGFnIHx8ICEoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkpCisgICAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiJiN4QTsiLCA1KSkKKwkgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgcyA9IHQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDEzOgorICAgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICImI3hEOyIsIDUpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBzID0gdDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJyYnOgorICAgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICImYW1wOyIsIDUpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBzID0gdDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJzwnOgorICAgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICImbHQ7IiwgNCkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHMgPSB0OworICAgICAgYnJlYWs7CisgICAgY2FzZSAnPic6CisgICAgICBpZiAoIWZsYWcpCisgICAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiJmd0OyIsIDQpKQorCSAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBzID0gdDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJyInOgorICAgICAgaWYgKGZsYWcpCisgICAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiJnF1b3Q7IiwgNikpCisJICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHMgPSB0OworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZmRlZiBIQVZFX01CVE9XQworICAgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0NfTUJTVFJJTkcpCisgICAgICB7IHdjaGFyX3Qgd2M7CisgICAgICAgIHJlZ2lzdGVyIGludCBtID0gbWJ0b3djKCZ3YywgdCAtIDEsIE1CX0NVUl9NQVgpOworICAgICAgICBpZiAobSA+IDAgJiYgd2MgIT0gYykKKyAgICAgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfcHV0dXRmOChzb2FwLCB3YykpCisgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisJICBzID0gdCArPSBtIC0gMTsKKwkgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKyNlbmRpZgorICAgICAgaWYgKGMgJiBtYXNrKQorICAgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfcHV0dXRmOChzb2FwLCAodW5zaWduZWQgY2hhciljKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHMgPSB0OworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3N0cmluZ19pbihzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGZsYWcsIGxvbmcgbWlubGVuLCBsb25nIG1heGxlbikKK3sgcmVnaXN0ZXIgY2hhciAqczsKKyAgY2hhciAqdCA9IE5VTEw7CisgIHJlZ2lzdGVyIHNpemVfdCBpOworICByZWdpc3RlciBsb25nIGwgPSAwOworICByZWdpc3RlciBpbnQgbiA9IDA7CisgIHJlZ2lzdGVyIGludCBtID0gMDsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworI2lmICFkZWZpbmVkKFdJVEhfTEVBTkVSKSAmJiBkZWZpbmVkKEhBVkVfV0NUT01CKQorICBjaGFyIGJ1ZltNQl9MRU5fTUFYID4gOCA/IE1CX0xFTl9NQVggOiA4XTsKKyNlbHNlCisgIGNoYXIgYnVmWzhdOworI2VuZGlmCisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWFkaW5nIHN0cmluZyBjb250ZW50XG4iKSk7CisgIGlmIChzb2FwLT5wZWVrZWQpCisgIHsgaWYgKCFzb2FwLT5ib2R5KQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCpzb2FwLT50YWcpCisgICAgeyBuID0gMTsKKyAgICAgIHNvYXAtPnBlZWtlZCA9IDA7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgdCA9IHNvYXAtPnRtcGJ1ZjsKKyAgICAgIHRbMF0gPSAnPCc7CisgICAgICBzdHJuY3B5KHQgKyAxLCBzb2FwLT50YWcsIHNpemVvZihzb2FwLT50bXBidWYpIC0gMSk7CisgICAgICBzdHJuY2F0KHQsICI+Iiwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZikpOworICAgICAgbSA9IHN0cmxlbihzb2FwLT50YWcpICsgMjsKKyNlbmRpZgorICAgIH0KKyAgfQorI2lmZGVmIFdJVEhfQ0RBVEEKKyAgaWYgKCFmbGFnKQorICB7IHJlZ2lzdGVyIGludCBzdGF0ZSA9IDA7CisjaWZkZWYgV0lUSF9GQVNUCisgICAgc29hcC0+bGFiaWR4ID0gMDsJCQkvKiB1c2UgbG9vay1hc2lkZSBidWZmZXIgKi8KKyNlbHNlCisgICAgaWYgKHNvYXBfbmV3X2Jsb2NrKHNvYXApKQorICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgICBmb3IgKDs7KQorICAgIHsgCisjaWZkZWYgV0lUSF9GQVNUCisgICAgICByZWdpc3RlciBzaXplX3QgazsKKyAgICAgIGlmIChzb2FwX2FwcGVuZF9sYWIoc29hcCwgTlVMTCwgMCkpCS8qIGFsbG9jYXRlIG1vcmUgc3BhY2UgaW4gbG9vay1hc2lkZSBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgcyA9IHNvYXAtPmxhYmJ1ZiArIHNvYXAtPmxhYmlkeDsJLyogc3BhY2UgdG8gcG9wdWxhdGUgKi8KKyAgICAgIGsgPSBzb2FwLT5sYWJsZW4gLSBzb2FwLT5sYWJpZHg7CS8qIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgKi8KKyAgICAgIHNvYXAtPmxhYmlkeCA9IHNvYXAtPmxhYmxlbjsJLyogY2xhaW0gdGhpcyBzcGFjZSAqLworI2Vsc2UKKyAgICAgIHJlZ2lzdGVyIHNpemVfdCBrID0gU09BUF9CTEtMRU47CisgICAgICBpZiAoIShzID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBrKSkpCisgICAgICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgICAgICBmb3IgKGkgPSAwOyBpIDwgazsgaSsrKQorICAgICAgeyBpZiAobSA+IDApCisgICAgICAgIHsgKnMrKyA9ICp0Kys7CS8qIGNvcHkgbXVsdGlieXRlIGNoYXJhY3RlcnMgKi8KKwkgIG0tLTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworCWlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICBpZiAoYyA+PSAweDgwICYmICEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0xBVElOKSkKKyAgICAgICAgeyBzb2FwX3VuZ2V0KHNvYXAsIGMpOworCSAgYyA9IHNvYXBfZ2V0dXRmOChzb2FwKTsKKwkgIGlmIChzb2FwLT5tb2RlICYgU09BUF9DX1VURlNUUklORykKKyAgICAgICAgICB7IGlmICgoYyAmIDB4ODAwMDAwMDApICYmIGMgPj0gLTB4N0ZGRkZGODAgJiYgYyA8IFNPQVBfQVApCisgICAgICAgICAgICB7IGMgJj0gMHg3RkZGRkZGRjsKKyAgICAgICAgICAgICAgdCA9IGJ1ZjsKKyAgICAgICAgICAgICAgaWYgKGMgPCAweDA4MDApCisgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEMwIHwgKChjID4+IDYpICYgMHgxRikpOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsgaWYgKGMgPCAweDAxMDAwMCkKKyAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhFMCB8ICgoYyA+PiAxMikgJiAweDBGKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsgaWYgKGMgPCAweDIwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEYwIHwgKChjID4+IDE4KSAmIDB4MDcpKTsKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHsgaWYgKGMgPCAweDA0MDAwMDAwKQorICAgICAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhGOCB8ICgoYyA+PiAyNCkgJiAweDAzKSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeyAqdCsrID0gKGNoYXIpKDB4RkMgfCAoKGMgPj4gMzApICYgMHgwMSkpOworICAgICAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAyNCkgJiAweDNGKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDE4KSAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgICAgIH0gICAgIAorICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDEyKSAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDYpICYgMHgzRikpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8IChjICYgMHgzRikpOworCSAgICAgIG0gPSAoaW50KSh0IC0gYnVmKSAtIDE7CisgICAgICAgICAgICAgIHQgPSBidWY7CisgICAgICAgICAgICAgICpzKysgPSAqdCsrOworICAgICAgICAgICAgICBjb250aW51ZTsKKwkgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCXN3aXRjaCAoc3RhdGUpCisgICAgICAgIHsgY2FzZSAxOgorICAgICAgICAgICAgaWYgKGMgPT0gJ10nKQorCSAgICAgIHN0YXRlID0gNDsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworCSAgY2FzZSAyOgorCSAgICBpZiAoYyA9PSAnLScpCisgICAgICAgICAgICAgIHN0YXRlID0gNjsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworCSAgY2FzZSAzOgorCSAgICBpZiAoYyA9PSAnPycpCisJICAgICAgc3RhdGUgPSA4OworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisgICAgICAgICAgLyogQ0RBVEEgKi8KKwkgIGNhc2UgNDoKKwkgICAgaWYgKGMgPT0gJ10nKQorICAgICAgICAgICAgICBzdGF0ZSA9IDU7CisJICAgIGVsc2UKKwkgICAgICBzdGF0ZSA9IDE7CisJICAgICpzKysgPSBjOworCSAgICBjb250aW51ZTsKKwkgIGNhc2UgNToKKwkgICAgaWYgKGMgPT0gJz4nKQorCSAgICAgIHN0YXRlID0gMDsKKwkgICAgZWxzZQorCSAgICAgIHN0YXRlID0gMTsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworICAgICAgICAgIC8qIGNvbW1lbnQgKi8KKyAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICBpZiAoYyA9PSAnLScpCisJICAgICAgc3RhdGUgPSA3OworCSAgICBlbHNlCisJICAgICAgc3RhdGUgPSAyOworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgaWYgKGMgPT0gJz4nKQorCSAgICAgIHN0YXRlID0gMDsKKwkgICAgZWxzZQorCSAgICAgIHN0YXRlID0gMjsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworICAgICAgICAgIC8qIFBJICovCisJICBjYXNlIDg6CisgICAgICAgICAgICBpZiAoYyA9PSAnPicpCisJICAgICAgc3RhdGUgPSAwOworCSAgICBlbHNlCisJICAgICAgc3RhdGUgPSAzOworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChjKQorICAgICAgICB7CisgICAgICAgIGNhc2UgJy8nOgorICAgICAgICAgIGlmIChuID4gMCkKKyAgICAgICAgICB7IGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgICAgICAgICAgICBpZiAoYyA9PSAnPicpCisgICAgICAgICAgICAgIG4tLTsKKyAgICAgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgICAgfQorICAgICAgICAgICpzKysgPSAnLyc7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzwnOgorCSAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKwkgIGlmIChjID09ICcvJykKKwkgIHsgaWYgKG4gPT0gMCkKKwkgICAgeyBjID0gU09BUF9UVDsKKwkgICAgICBnb3RvIGVuZDsKKwkgICAgfQorCSAgICBuLS07CisJICB9CisJICBlbHNlIGlmIChjID09ICchJykKKwkgIHsgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKwkgICAgaWYgKGMgPT0gJ1snKQorICAgICAgICAgICAgeyBkbyBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICAgICAgICAgICAgICB3aGlsZSAoKGludCljICE9IEVPRiAmJiBjICE9ICdbJyk7CisgICAgICAgICAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKwkgICAgICB0ID0gKGNoYXIqKSIhW0NEQVRBWyI7CisJICAgICAgbSA9IDg7CisJICAgICAgc3RhdGUgPSAxOworCSAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjID09ICctJykKKwkgICAgeyBpZiAoKGMgPSBzb2FwX2dldGNoYXIoc29hcCkpID09ICctJykKKwkgICAgICAgIHN0YXRlID0gMjsKKwkgICAgICB0ID0gKGNoYXIqKSIhLSI7CisJICAgICAgbSA9IDI7CisJICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsgdCA9IChjaGFyKikiISI7CisJICAgICAgbSA9IDE7CisJICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKwkgICAgfQorCSAgICAqcysrID0gJzwnOworCSAgICBicmVhazsKKwkgIH0KKwkgIGVsc2UgaWYgKGMgPT0gJz8nKQorCSAgICBzdGF0ZSA9IDM7CisJICBlbHNlCisJICAgIG4rKzsKKyAgICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICAgICpzKysgPSAnPCc7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJz4nOgorICAgICAgICAgICpzKysgPSAnPic7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJyInOgorICAgICAgICAgICpzKysgPSAnIic7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZkZWYgSEFWRV9XQ1RPTUIKKyAgICAgICAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfQ19NQlNUUklORykKKyAgICAgICAgICB7IG0gPSB3Y3RvbWIoYnVmLCBjICYgMHg3RkZGRkZGRik7CisgICAgICAgICAgICBpZiAobSA+PSAxICYmIG0gPD0gKGludClNQl9DVVJfTUFYKQorICAgICAgICAgICAgeyB0ID0gYnVmOworICAgICAgICAgICAgICAqcysrID0gKnQrKzsKKyAgICAgICAgICAgICAgbS0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAqcysrID0gU09BUF9VTktOT1dOX0NIQVI7CisJICAgICAgbSA9IDA7CisJICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorI2VuZGlmCisjZW5kaWYKKyAgICAgICAgICAgICpzKysgPSAoY2hhcikoYyAmIDB4RkYpOworICAgICAgICB9CisJbCsrOworICAgICAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIG1heGxlbiA+PSAwICYmIGwgPiBtYXhsZW4pCisgICAgICAgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlN0cmluZyB0b28gbG9uZzogbWF4bGVuPSVsZFxuIiwgbWF4bGVuKSk7CisgICAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0xFTkdUSDsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorI2VuZGlmCisjaWZkZWYgV0lUSF9GQVNUCisgIHNvYXAtPmxhYmlkeCA9IDA7CQkJLyogdXNlIGxvb2stYXNpZGUgYnVmZmVyICovCisjZWxzZQorICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgZm9yICg7OykKKyAgeyAKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgICByZWdpc3RlciBzaXplX3QgazsKKyAgICBpZiAoc29hcF9hcHBlbmRfbGFiKHNvYXAsIE5VTEwsIDApKQkvKiBhbGxvY2F0ZSBtb3JlIHNwYWNlIGluIGxvb2stYXNpZGUgYnVmZmVyIGlmIG5lY2Vzc2FyeSAqLworICAgICAgcmV0dXJuIE5VTEw7CisgICAgcyA9IHNvYXAtPmxhYmJ1ZiArIHNvYXAtPmxhYmlkeDsJLyogc3BhY2UgdG8gcG9wdWxhdGUgKi8KKyAgICBrID0gc29hcC0+bGFibGVuIC0gc29hcC0+bGFiaWR4OwkvKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlICovCisgICAgc29hcC0+bGFiaWR4ID0gc29hcC0+bGFibGVuOwkvKiBjbGFpbSB0aGlzIHNwYWNlICovCisjZWxzZQorICAgIHJlZ2lzdGVyIHNpemVfdCBrID0gU09BUF9CTEtMRU47CisgICAgaWYgKCEocyA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgaykpKQorICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgICBmb3IgKGkgPSAwOyBpIDwgazsgaSsrKQorICAgIHsgaWYgKG0gPiAwKQorICAgICAgeyAqcysrID0gKnQrKzsJLyogY29weSBtdWx0aWJ5dGUgY2hhcmFjdGVycyAqLworICAgICAgICBtLS07CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0NfVVRGU1RSSU5HKQorICAgICAgeyBpZiAoKChjID0gc29hcF9nZXQoc29hcCkpICYgMHg4MDAwMDAwMCkgJiYgYyA+PSAtMHg3RkZGRkY4MCAmJiBjIDwgU09BUF9BUCkKKyAgICAgICAgeyBjICY9IDB4N0ZGRkZGRkY7CisgICAgICAgICAgdCA9IGJ1ZjsKKyAgICAgICAgICBpZiAoYyA8IDB4MDgwMCkKKyAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhDMCB8ICgoYyA+PiA2KSAmIDB4MUYpKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeyBpZiAoYyA8IDB4MDEwMDAwKQorICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RTAgfCAoKGMgPj4gMTIpICYgMHgwRikpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyBpZiAoYyA8IDB4MjAwMDAwKQorICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhGMCB8ICgoYyA+PiAxOCkgJiAweDA3KSk7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeyBpZiAoYyA8IDB4MDQwMDAwMDApCisgICAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjggfCAoKGMgPj4gMjQpICYgMHgwMykpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7ICp0KysgPSAoY2hhcikoMHhGQyB8ICgoYyA+PiAzMCkgJiAweDAxKSk7CisgICAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMjQpICYgMHgzRikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTgpICYgMHgzRikpOworICAgICAgICAgICAgICB9ICAgICAKKyAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDEyKSAmIDB4M0YpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKGMgJiAweDNGKSk7CisJICBtID0gKGludCkodCAtIGJ1ZikgLSAxOworICAgICAgICAgIHQgPSBidWY7CisgICAgICAgICAgKnMrKyA9ICp0Kys7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgYyA9IHNvYXBfZ2V0dXRmOChzb2FwKTsKKyAgICAgIHN3aXRjaCAoYykKKyAgICAgIHsKKyAgICAgIGNhc2UgU09BUF9UVDoKKyAgICAgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgbi0tOworICAgICAgICAqcysrID0gJzwnOworICAgICAgICB0ID0gKGNoYXIqKSIvIjsKKwltID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfTFQ6CisgICAgICAgIG4rKzsKKyAgICAgICAgKnMrKyA9ICc8JzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfR1Q6CisgICAgICAgICpzKysgPSAnPic7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTT0FQX1FUOgorICAgICAgICAqcysrID0gJyInOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9BUDoKKyAgICAgICAgKnMrKyA9ICdcJyc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnLyc6CisgICAgICAgIGlmIChuID4gMCkKKyAgICAgICAgeyBjID0gc29hcF9nZXQoc29hcCk7CisgICAgICAgICAgaWYgKGMgPT0gU09BUF9HVCkKKyAgICAgICAgICAgIG4tLTsKKyAgICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICB9CisgICAgICAgICpzKysgPSAnLyc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnPCcgfCAweDgwMDAwMDAwOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gJzwnOworICAgICAgICBlbHNlCisgICAgICAgIHsgKnMrKyA9ICcmJzsKKyAgICAgICAgICB0ID0gKGNoYXIqKSJsdDsiOworCSAgbSA9IDM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICc+JyB8IDB4ODAwMDAwMDA6CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICpzKysgPSAnPic7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAqcysrID0gJyYnOworICAgICAgICAgIHQgPSAoY2hhciopImd0OyI7CisJICBtID0gMzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJyYnIHwgMHg4MDAwMDAwMDoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9ICcmJzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAnJic7CisgICAgICAgICAgdCA9IChjaGFyKikiYW1wOyI7CisJICBtID0gNDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJyInIHwgMHg4MDAwMDAwMDoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9ICciJzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAnJic7CisgICAgICAgICAgdCA9IChjaGFyKikicXVvdDsiOworCSAgbSA9IDU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdcJycgfCAweDgwMDAwMDAwOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gJ1wnJzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAnJic7CisgICAgICAgICAgdCA9IChjaGFyKikiYXBvczsiOworCSAgbSA9IDU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgICBnb3RvIGVuZDsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZmRlZiBIQVZFX1dDVE9NQgorICAgICAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfQ19NQlNUUklORykKKyAgICAgICAgeyBtID0gd2N0b21iKGJ1ZiwgYyAmIDB4N0ZGRkZGRkYpOworICAgICAgICAgIGlmIChtID49IDEgJiYgbSA8PSAoaW50KU1CX0NVUl9NQVgpCisgICAgICAgICAgeyB0ID0gYnVmOworICAgICAgICAgICAgKnMrKyA9ICp0Kys7CisgICAgICAgICAgICBtLS07CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7ICpzKysgPSBTT0FQX1VOS05PV05fQ0hBUjsKKwkgICAgbSA9IDA7CisJICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmCisjZW5kaWYKKyAgICAgICAgICAqcysrID0gKGNoYXIpKGMgJiAweEZGKTsKKyAgICAgIH0KKyAgICAgIGwrKzsKKyAgICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgbWF4bGVuID49IDAgJiYgbCA+IG1heGxlbikKKyAgICAgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlN0cmluZyB0b28gbG9uZzogbWF4bGVuPSVsZFxuIiwgbWF4bGVuKSk7CisgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9MRU5HVEg7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgIH0KKyAgfQorZW5kOgorICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAqcyA9ICdcMCc7CisjaWZkZWYgV0lUSF9GQVNUCisgIHQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT5sYWJidWYpOworI2Vsc2UKKyAgc29hcF9zaXplX2Jsb2NrKHNvYXAsIGkrMSk7CisgIHQgPSBzb2FwX3NhdmVfYmxvY2soc29hcCwgTlVMTCwgMCk7CisjZW5kaWYKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiBsIDwgbWlubGVuKQorICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJTdHJpbmcgdG9vIHNob3J0OiAlbGQgY2hhcnMsIG1pbmxlbj0lbGRcbiIsIGwsIG1pbmxlbikpOworICAgIHNvYXAtPmVycm9yID0gU09BUF9MRU5HVEg7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBpZiAoZmxhZyA9PSAzKQorICAgICAgc29hcC0+ZG9tLT50YWlsID0gdDsKKyAgICBlbHNlCisgICAgICBzb2FwLT5kb20tPmRhdGEgPSB0OworICB9CisjZW5kaWYKKyAgaWYgKGZsYWcgPT0gMikKKyAgICBpZiAoc29hcF9zMlFOYW1lKHNvYXAsIHQsICZ0KSkKKyAgICAgIHJldHVybiBOVUxMOworICByZXR1cm4gdDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF93c3RyaW5nX291dChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgd2NoYXJfdCAqcywgaW50IGZsYWcpCit7IGNvbnN0IGNoYXIgKnQ7CisgIGNoYXIgdG1wOworICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgd2NoYXJfdCAqciA9ICh3Y2hhcl90KilzOworICAgIGludCBuID0gMTsKKyAgICB3aGlsZSAoKnIrKykKKyAgICAgIG4rKzsKKyAgICBzb2FwLT5kb20tPndpZGUgPSByID0gKHdjaGFyX3QqKXNvYXBfbWFsbG9jKHNvYXAsIG4gKiBzaXplb2Yod2NoYXJfdCkpOworICAgIHdoaWxlIChuLS0pCisgICAgICAqcisrID0gKnMrKzsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2VuZGlmCisgIHdoaWxlICgoYyA9ICpzKyspKQorICB7IHN3aXRjaCAoYykKKyAgICB7IAorICAgIGNhc2UgOToKKyAgICAgIGlmIChmbGFnKQorICAgICAgICB0ID0gIiYjeDk7IjsKKyAgICAgIGVsc2UKKyAgICAgICAgdCA9ICJcdCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEwOgorICAgICAgaWYgKGZsYWcgfHwgIShzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKSkKKyAgICAgICAgdCA9ICImI3hBOyI7CisgICAgICBlbHNlCisgICAgICAgIHQgPSAiXG4iOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMzoKKyAgICAgIHQgPSAiJiN4RDsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnJic6CisgICAgICB0ID0gIiZhbXA7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJzwnOgorICAgICAgdCA9ICImbHQ7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJz4nOgorICAgICAgaWYgKGZsYWcpCisgICAgICAgIHQgPSAiPiI7CisgICAgICBlbHNlCisJdCA9ICImZ3Q7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJyInOgorICAgICAgaWYgKGZsYWcpCisgICAgICAgIHQgPSAiJnF1b3Q7IjsKKyAgICAgIGVsc2UKKyAgICAgICAgdCA9ICJcIiI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKGMgPiAwICYmIGMgPCAweDgwKQorICAgICAgeyB0bXAgPSAoY2hhciljOworICAgICAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAmdG1wLCAxKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB9CisgICAgICBlbHNlIGlmIChzb2FwX3B1dHV0Zjgoc29hcCwgKHVuc2lnbmVkIGxvbmcpYykpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoc29hcF9zZW5kKHNvYXAsIHQpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit3Y2hhcl90ICoKK1NPQVBfRk1BQzIKK3NvYXBfd3N0cmluZ19pbihzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGZsYWcsIGxvbmcgbWlubGVuLCBsb25nIG1heGxlbikKK3sgd2NoYXJfdCAqczsKKyAgcmVnaXN0ZXIgaW50IGksIG4gPSAwOworICByZWdpc3RlciBsb25nIGwgPSAwOworICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIGNvbnN0IGNoYXIgKnQgPSBOVUxMOworICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVhZGluZyB3aWRlIHN0cmluZyBjb250ZW50XG4iKSk7CisgIGlmIChzb2FwLT5wZWVrZWQpCisgIHsgaWYgKCFzb2FwLT5ib2R5KQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCpzb2FwLT50YWcpCisgICAgeyBuID0gMTsKKyAgICAgIHNvYXAtPnBlZWtlZCA9IDA7CisgICAgfQorICB9CisgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgZm9yICg7OykKKyAgeyBpZiAoIShzID0gKHdjaGFyX3QqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBzaXplb2Yod2NoYXJfdCkqU09BUF9CTEtMRU4pKSkKKyAgICAgIHJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0JMS0xFTjsgaSsrKQorICAgIHsgaWYgKHQpCisgICAgICB7ICpzKysgPSAod2NoYXJfdCkqdCsrOworICAgICAgICBpZiAoISp0KQorICAgICAgICAgIHQgPSBOVUxMOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisgICAgICBzd2l0Y2ggKGMpCisgICAgICB7CisgICAgICBjYXNlIFNPQVBfVFQ6CisgICAgICAgIGlmIChuID09IDApCisgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIG4tLTsKKyAgICAgICAgKnMrKyA9ICc8JzsKKyAgICAgICAgc29hcF91bmdldChzb2FwLCAnLycpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9MVDoKKyAgICAgICAgbisrOworICAgICAgICAqcysrID0gJzwnOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9HVDoKKyAgICAgICAgKnMrKyA9ICc+JzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfUVQ6CisgICAgICAgICpzKysgPSAnIic7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTT0FQX0FQOgorICAgICAgICAqcysrID0gJ1wnJzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICcvJzoKKyAgICAgICAgaWYgKG4gPiAwKQorICAgICAgICB7IGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisgICAgICAgICAgaWYgKGMgPT0gU09BUF9HVCkKKyAgICAgICAgICAgIG4tLTsKKyAgICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICB9CisgICAgICAgICpzKysgPSAnLyc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnPCc6CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICpzKysgPSAoc29hcF93Y2hhciknPCc7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAqcysrID0gKHNvYXBfd2NoYXIpJyYnOworICAgICAgICAgIHQgPSAibHQ7IjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJz4nOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gKHNvYXBfd2NoYXIpJz4nOworICAgICAgICBlbHNlCisgICAgICAgIHsgKnMrKyA9IChzb2FwX3djaGFyKScmJzsKKyAgICAgICAgICB0ID0gImd0OyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICciJzoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9IChzb2FwX3djaGFyKSciJzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAoc29hcF93Y2hhciknJic7CisgICAgICAgICAgdCA9ICJxdW90OyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgKnMrKyA9ICh3Y2hhcl90KWMgJiAweDdGRkZGRkZGOworICAgICAgfQorICAgICAgbCsrOworICAgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiBtYXhsZW4gPj0gMCAmJiBsID4gbWF4bGVuKQorICAgICAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiU3RyaW5nIHRvbyBsb25nOiBtYXhsZW49JWxkXG4iLCBtYXhsZW4pKTsKKyAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0xFTkdUSDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgfQorICB9CitlbmQ6CisgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICpzID0gJ1wwJzsKKyAgc29hcF9zaXplX2Jsb2NrKHNvYXAsIHNpemVvZih3Y2hhcl90KSAqIChpICsgMSkpOworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIGwgPCBtaW5sZW4pCisgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlN0cmluZyB0b28gc2hvcnQ6ICVsZCBjaGFycywgbWlubGVuPSVsZFxuIiwgbCwgbWlubGVuKSk7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0xFTkdUSDsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBzID0gKHdjaGFyX3QqKXNvYXBfc2F2ZV9ibG9jayhzb2FwLCBOVUxMLCAwKTsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgICBzb2FwLT5kb20tPndpZGUgPSBzOworI2VuZGlmCisgIHJldHVybiBzOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9pbnQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4pCit7IHJldHVybiBzb2FwX2xvbmcycyhzb2FwLCAobG9uZyluKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRpbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBpbnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfbG9uZzJzKHNvYXAsIChsb25nKSpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMmludChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgaW50ICpwKQoreyBpZiAocykKKyAgeyBjaGFyICpyOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgc29hcF9yZXNldF9lcnJubzsKKyNlbmRpZgorI2VuZGlmCisgICAgKnAgPSAoaW50KXNvYXBfc3RydG9sKHMsICZyLCAxMCk7CisgICAgaWYgKChzID09IHIgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKSB8fCAqcgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgIHx8IHNvYXBfZXJybm8gPT0gU09BUF9FUkFOR0UKKyNlbmRpZgorI2VuZGlmCisgICAgKQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5pbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjppbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpzaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAoaW50Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YoaW50KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKGludCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihpbnQpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMmludChzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9sb25nMnMoc3RydWN0IHNvYXAgKnNvYXAsIGxvbmcgbikKK3sgc3ByaW50Zihzb2FwLT50bXBidWYsICIlbGQiLCBuKTsKKyAgcmV0dXJuIHNvYXAtPnRtcGJ1ZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRsb25nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgbG9uZyAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9sb25nMnMoc29hcCwgKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MybG9uZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgbG9uZyAqcCkKK3sgaWYgKHMpCisgIHsgY2hhciAqcjsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgIHNvYXBfcmVzZXRfZXJybm87CisjZW5kaWYKKyNlbmRpZgorICAgICpwID0gc29hcF9zdHJ0b2wocywgJnIsIDEwKTsKKyAgICBpZiAoKHMgPT0gciAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpIHx8ICpyCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgfHwgc29hcF9lcnJubyA9PSBTT0FQX0VSQU5HRQorI2VuZGlmCisjZW5kaWYKKyAgICApCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitsb25nICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5sb25nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGxvbmcgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6Ynl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9IChsb25nKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YobG9uZyksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChsb25nKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKGxvbmcpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMmxvbmcoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfTE9ORzY0MnMoc3RydWN0IHNvYXAgKnNvYXAsIExPTkc2NCBuKQoreyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgU09BUF9MT05HX0ZPUk1BVCwgbik7CisgIHJldHVybiBzb2FwLT50bXBidWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0TE9ORzY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgTE9ORzY0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX0xPTkc2NDJzKHNvYXAsICpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMkxPTkc2NChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgTE9ORzY0ICpwKQoreyBpZiAocykKKyAgeworI2lmZGVmIEhBVkVfU1RSVE9MTAorICAgIGNoYXIgKnI7CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBzb2FwX3Jlc2V0X2Vycm5vOworI2VuZGlmCisjZW5kaWYKKyAgICAqcCA9IHN0cnRvbGwocywgJnIsIDEwKTsKKyAgICBpZiAoKHMgPT0gciAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpIHx8ICpyCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgICB8fCBzb2FwX2Vycm5vID09IFNPQVBfRVJBTkdFCisjZW5kaWYKKyNlbmRpZgorICAgICAgKQorI2Vsc2UKKyMgaWZkZWYgSEFWRV9TU0NBTkYKKyAgICBpZiAoc3NjYW5mKHMsIFNPQVBfTE9OR19GT1JNQVQsIHApICE9IDEpCisjIGVuZGlmCisjZW5kaWYKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK0xPTkc2NCAqCitTT0FQX0ZNQUMyCitzb2FwX2luTE9ORzY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIExPTkc2NCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6aW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnBvc2l0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOm5lZ2F0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOm5vblBvc2l0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOm5vbk5lZ2F0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmxvbmciKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjppbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpzaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAoTE9ORzY0Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YoTE9ORzY0KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKExPTkc2NCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihMT05HNjQpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMkxPTkc2NChzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9ieXRlMnMoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgbikKK3sgcmV0dXJuIHNvYXBfbG9uZzJzKHNvYXAsIChsb25nKW4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dGJ5dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX2xvbmcycyhzb2FwLCAobG9uZykqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJieXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBjaGFyICpwKQoreyBpZiAocykKKyAgeyBsb25nIG47CisgICAgY2hhciAqcjsKKyAgICBuID0gc29hcF9zdHJ0b2wocywgJnIsIDEwKTsKKyAgICBpZiAocyA9PSByIHx8ICpyIHx8IG4gPCAtMTI4IHx8IG4gPiAxMjcpCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICAqcCA9IChjaGFyKW47CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX2luYnl0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBjaGFyICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpieXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKGNoYXIqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihjaGFyKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKGNoYXIqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YoY2hhciksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MyYnl0ZShzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9zaG9ydDJzKHN0cnVjdCBzb2FwICpzb2FwLCBzaG9ydCBuKQoreyByZXR1cm4gc29hcF9sb25nMnMoc29hcCwgKGxvbmcpbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0c2hvcnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzaG9ydCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9sb25nMnMoc29hcCwgKGxvbmcpKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3Myc2hvcnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHNob3J0ICpwKQoreyBpZiAocykKKyAgeyBsb25nIG47CisgICAgY2hhciAqcjsKKyAgICBuID0gc29hcF9zdHJ0b2wocywgJnIsIDEwKTsKKyAgICBpZiAocyA9PSByIHx8ICpyIHx8IG4gPCAtMzI3NjggfHwgbiA+IDMyNzY3KQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgKnAgPSAoc2hvcnQpbjsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitzaG9ydCAqCitTT0FQX0ZNQUMyCitzb2FwX2luc2hvcnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc2hvcnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6Ynl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9IChzaG9ydCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKHNob3J0KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKHNob3J0Kilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKHNob3J0KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJzaG9ydChzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9mbG9hdDJzKHN0cnVjdCBzb2FwICpzb2FwLCBmbG9hdCBuKQoreyBjb25zdCBjaGFyICpzOworICBpZiAoc29hcF9pc25hbigoZG91YmxlKW4pKQorICAgIHMgPSAiTmFOIjsKKyAgZWxzZSBpZiAoc29hcF9pc3BpbmZmKG4pKQorICAgIHMgPSAiSU5GIjsKKyAgZWxzZSBpZiAoc29hcF9pc25pbmZmKG4pKQorICAgIHMgPSAiLUlORiI7CisgIGVsc2UKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1Ziwgc29hcC0+ZmxvYXRfZm9ybWF0LCBuKTsKKyAgICBzID0gc29hcC0+dG1wYnVmOworICB9CisgIHJldHVybiBzOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dGZsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgZmxvYXQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfZmxvYXQycyhzb2FwLCAqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJmbG9hdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgZmxvYXQgKnApCit7IGlmIChzKQorICB7IGlmICghKnMpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgaWYgKCFzb2FwX3RhZ19jbXAocywgIklORiIpKQorICAgICAgKnAgPSBGTFRfUElORlRZOworICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAocywgIitJTkYiKSkKKyAgICAgICpwID0gRkxUX1BJTkZUWTsKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHMsICItSU5GIikpCisgICAgICAqcCA9IEZMVF9OSU5GVFk7CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChzLCAiTmFOIikpCisgICAgICAqcCA9IEZMVF9OQU47CisgICAgZWxzZQorICAgIHsKKy8qIE9uIHNvbWUgc3lzdGVtcywgc3RydG9mIGFwcGVhcnMgdG8gYmUgYnJva2VuIG9yIGRvZXNuJ3QgbGluazogdXNlIHdpdGggY2F1dGlvbiAqLworI2lmIGRlZmluZWQoSEFWRV9TVFJUT0YpCisgICAgICBjaGFyICpyOworICAgICAgKnAgPSBzdHJ0b2YoKGNoYXIqKXMsICZyKTsKKyAgICAgIGlmICgqcikKKyNlbGlmIGRlZmluZWQoSEFWRV9TVFJUT0QpCisgICAgICBjaGFyICpyOworICAgICAgKnAgPSAoZmxvYXQpc3RydG9kKHMsICZyKTsKKyAgICAgIGlmICgqcikKKyNlbmRpZgorI2lmZGVmIEhBVkVfU1NDQU5GCisgICAgICAgIGlmIChzc2NhbmYocywgIiVnIiwgcCkgIT0gMSkKKyAgICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyNlbHNlCisgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworI2VuZGlmCisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBpbnQgc29hcF9pc251bWVyaWMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnR5cGUpCit7IGlmIChzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpmbG9hdCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmRvdWJsZSIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmRlY2ltYWwiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjppbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6cG9zaXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bmVnYXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bm9uUG9zaXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bm9uTmVnYXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bG9uZyIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6Ynl0ZSIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkTG9uZyIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkSW50IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRTaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkQnl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBTT0FQX0VSUjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2Zsb2F0ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5mbG9hdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBmbG9hdCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZSAhPSAnXDAnICYmIHNvYXBfaXNudW1lcmljKHNvYXAsIHR5cGUpKQorICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgIHAgPSAoZmxvYXQqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihmbG9hdCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChmbG9hdCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihmbG9hdCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MyZmxvYXQoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZG91YmxlMnMoc3RydWN0IHNvYXAgKnNvYXAsIGRvdWJsZSBuKQoreyBjb25zdCBjaGFyICpzOworICBpZiAoc29hcF9pc25hbihuKSkKKyAgICBzID0gIk5hTiI7CisgIGVsc2UgaWYgKHNvYXBfaXNwaW5mZChuKSkKKyAgICBzID0gIklORiI7CisgIGVsc2UgaWYgKHNvYXBfaXNuaW5mZChuKSkKKyAgICBzID0gIi1JTkYiOworICBlbHNlCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsIHNvYXAtPmRvdWJsZV9mb3JtYXQsIG4pOworICAgIHMgPSBzb2FwLT50bXBidWY7CisgIH0KKyAgcmV0dXJuIHM7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0ZG91YmxlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgZG91YmxlICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX2RvdWJsZTJzKHNvYXAsICpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMmRvdWJsZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgZG91YmxlICpwKQoreyBpZiAocykKKyAgeyBpZiAoISpzKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIGlmICghc29hcF90YWdfY21wKHMsICJJTkYiKSkKKyAgICAgICpwID0gREJMX1BJTkZUWTsKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHMsICIrSU5GIikpCisgICAgICAqcCA9IERCTF9QSU5GVFk7CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChzLCAiLUlORiIpKQorICAgICAgKnAgPSBEQkxfTklORlRZOworICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAocywgIk5hTiIpKQorICAgICAgKnAgPSBEQkxfTkFOOworICAgIGVsc2UKKyAgICB7CisjaWZkZWYgSEFWRV9TVFJUT0QKKyAgICAgIGNoYXIgKnI7CisgICAgICAqcCA9IHN0cnRvZChzLCAmcik7CisgICAgICBpZiAoKnIpCisjZW5kaWYKKyNpZmRlZiBIQVZFX1NTQ0FORgorICAgICAgICBpZiAoc3NjYW5mKHMsICIlbGciLCBwKSAhPSAxKQorICAgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworI2Vsc2UKKyAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisjZW5kaWYKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorZG91YmxlICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5kb3VibGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgZG91YmxlICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlICE9ICdcMCcgJiYgc29hcF9pc251bWVyaWMoc29hcCwgdHlwZSkpCisgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgcCA9IChkb3VibGUqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihkb3VibGUpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAoZG91YmxlKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKGRvdWJsZSksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MyZG91YmxlKHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3Vuc2lnbmVkQnl0ZTJzKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBjaGFyIG4pCit7IHJldHVybiBzb2FwX3Vuc2lnbmVkTG9uZzJzKHNvYXAsICh1bnNpZ25lZCBsb25nKW4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHVuc2lnbmVkQnl0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfdW5zaWduZWRMb25nMnMoc29hcCwgKHVuc2lnbmVkIGxvbmcpKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MydW5zaWduZWRCeXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBjaGFyICpwKQoreyBpZiAocykKKyAgeyB1bnNpZ25lZCBsb25nIG47CisgICAgY2hhciAqcjsKKyAgICBuID0gc29hcF9zdHJ0b3VsKHMsICZyLCAxMCk7CisgICAgaWYgKHMgPT0gciB8fCAqciB8fCBuID4gMjU1KQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgKnAgPSAodW5zaWduZWQgY2hhciluOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3Vuc2lnbmVkIGNoYXIgKgorU09BUF9GTUFDMgorc29hcF9pbnVuc2lnbmVkQnl0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB1bnNpZ25lZCBjaGFyICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAodW5zaWduZWQgY2hhciopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAodW5zaWduZWQgY2hhciopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZih1bnNpZ25lZCBjaGFyKSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJ1bnNpZ25lZEJ5dGUoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfdW5zaWduZWRTaG9ydDJzKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBzaG9ydCBuKQoreyByZXR1cm4gc29hcF91bnNpZ25lZExvbmcycyhzb2FwLCAodW5zaWduZWQgbG9uZyluKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXR1bnNpZ25lZFNob3J0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgdW5zaWduZWQgc2hvcnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfdW5zaWduZWRMb25nMnMoc29hcCwgKHVuc2lnbmVkIGxvbmcpKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MydW5zaWduZWRTaG9ydChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgdW5zaWduZWQgc2hvcnQgKnApCit7IGlmIChzKQorICB7IHVuc2lnbmVkIGxvbmcgbjsKKyAgICBjaGFyICpyOworICAgIG4gPSBzb2FwX3N0cnRvdWwocywgJnIsIDEwKTsKKyAgICBpZiAocyA9PSByIHx8ICpyIHx8IG4gPiA2NTUzNSkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgICpwID0gKHVuc2lnbmVkIHNob3J0KW47CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordW5zaWduZWQgc2hvcnQgKgorU09BUF9GTUFDMgorc29hcF9pbnVuc2lnbmVkU2hvcnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgdW5zaWduZWQgc2hvcnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkU2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAodW5zaWduZWQgc2hvcnQqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZih1bnNpZ25lZCBzaG9ydCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9ICh1bnNpZ25lZCBzaG9ydCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZih1bnNpZ25lZCBzaG9ydCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MydW5zaWduZWRTaG9ydChzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF91bnNpZ25lZEludDJzKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBpbnQgbikKK3sgcmV0dXJuIHNvYXBfdW5zaWduZWRMb25nMnMoc29hcCwgKHVuc2lnbmVkIGxvbmcpbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0dW5zaWduZWRJbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCB1bnNpZ25lZCBpbnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfdW5zaWduZWRMb25nMnMoc29hcCwgKHVuc2lnbmVkIGxvbmcpKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MydW5zaWduZWRJbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCAqcCkKK3sgaWYgKHMpCisgIHsgY2hhciAqcjsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgIHNvYXBfcmVzZXRfZXJybm87CisjZW5kaWYKKyNlbmRpZgorICAgICpwID0gKHVuc2lnbmVkIGludClzb2FwX3N0cnRvdWwocywgJnIsIDEwKTsKKyAgICBpZiAoKHMgPT0gciAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpIHx8ICpyCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgfHwgc29hcF9lcnJubyA9PSBTT0FQX0VSQU5HRQorI2VuZGlmCisjZW5kaWYKKyAgICApCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit1bnNpZ25lZCBpbnQgKgorU09BUF9GTUFDMgorc29hcF9pbnVuc2lnbmVkSW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIGludCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRJbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZFNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRCeXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKHVuc2lnbmVkIGludCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKHVuc2lnbmVkIGludCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9ICh1bnNpZ25lZCBpbnQqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YodW5zaWduZWQgaW50KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJ1bnNpZ25lZEludChzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF91bnNpZ25lZExvbmcycyhzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgbG9uZyBuKQoreyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIiVsdSIsIG4pOworICByZXR1cm4gc29hcC0+dG1wYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHVuc2lnbmVkTG9uZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfdW5zaWduZWRMb25nMnMoc29hcCwgKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MydW5zaWduZWRMb25nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBsb25nICpwKQoreyBpZiAocykKKyAgeyBjaGFyICpyOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgc29hcF9yZXNldF9lcnJubzsKKyNlbmRpZgorI2VuZGlmCisgICAgKnAgPSBzb2FwX3N0cnRvdWwocywgJnIsIDEwKTsKKyAgICBpZiAoKHMgPT0gciAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpIHx8ICpyCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgfHwgc29hcF9lcnJubyA9PSBTT0FQX0VSQU5HRQorI2VuZGlmCisjZW5kaWYKKyAgICApCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit1bnNpZ25lZCBsb25nICoKK1NPQVBfRk1BQzIKK3NvYXBfaW51bnNpZ25lZExvbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgdW5zaWduZWQgbG9uZyAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRJbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZFNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRCeXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKHVuc2lnbmVkIGxvbmcqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZih1bnNpZ25lZCBsb25nKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKHVuc2lnbmVkIGxvbmcqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YodW5zaWduZWQgbG9uZyksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MydW5zaWduZWRMb25nKHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX1VMT05HNjQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgVUxPTkc2NCBuKQoreyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgU09BUF9VTE9OR19GT1JNQVQsIG4pOworICByZXR1cm4gc29hcC0+dG1wYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dFVMT05HNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBVTE9ORzY0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX1VMT05HNjQycyhzb2FwLCAqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJVTE9ORzY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBVTE9ORzY0ICpwKQoreyBpZiAocykKKyAgeworI2lmZGVmIEhBVkVfU1RSVE9VTEwKKyAgICBjaGFyICpyOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgc29hcF9yZXNldF9lcnJubzsKKyNlbmRpZgorI2VuZGlmCisgICAgKnAgPSBzdHJ0b3VsbChzLCAmciwgMTApOworICAgIGlmICgocyA9PSByICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkgfHwgKnIKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgIHx8IHNvYXBfZXJybm8gPT0gU09BUF9FUkFOR0UKKyNlbmRpZgorI2VuZGlmCisgICAgICApCisjZWxzZQorIyBpZmRlZiBIQVZFX1NTQ0FORgorICAgIGlmIChzc2NhbmYocywgU09BUF9VTE9OR19GT1JNQVQsIHApICE9IDEpCisjIGVuZGlmCisjZW5kaWYKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK1VMT05HNjQgKgorU09BUF9GTUFDMgorc29hcF9pblVMT05HNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgVUxPTkc2NCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpwb3NpdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpub25OZWdhdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZExvbmciKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkU2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwID0gKFVMT05HNjQqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihVTE9ORzY0KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKFVMT05HNjQqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YoVUxPTkc2NCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MyVUxPTkc2NChzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJzdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGNoYXIgKip0KQoreyAqdCA9IE5VTEw7CisgIGlmIChzKQorICB7IGlmICghKCp0ID0gc29hcF9zdHJkdXAoc29hcCwgcykpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgaWYgKCEoc29hcC0+bW9kZSAmIChTT0FQX0VOQ19MQVRJTiB8IFNPQVBfQ19VVEZTVFJJTkcpKSkKKyAgICB7IC8qIFRPRE86IGNvbnNpZGVyIHRydW5jYXRpbmcgVVRGOCB0byBBU0NJSSBmb3IgcmVndWxhciBYTUwgYXR0cmlidXRlIHN0cmluZ3M/ICovCisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMlFOYW1lKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBjaGFyICoqdCkKK3sgaWYgKHMpCisgIHsgc3RydWN0IHNvYXBfbmxpc3QgKm5wOworICAgIGNvbnN0IGNoYXIgKnA7CisgICAgaWYgKCFzdHJuY21wKHMsICJ4bWw6IiwgNCkpCisgICAgeyAqdCA9IHNvYXBfc3RyZHVwKHNvYXAsIHMpOworICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgfQorICAgIG5wID0gc29hcC0+bmxpc3Q7CisgICAgcCA9IHN0cmNocihzLCAnOicpOworICAgIGlmIChwKQorICAgIHsgcmVnaXN0ZXIgaW50IG4gPSBwIC0gczsKKyAgICAgIHdoaWxlIChucCAmJiAoc3RybmNtcChucC0+aWQsIHMsIG4pIHx8IG5wLT5pZFtuXSkpCisgICAgICAgIG5wID0gbnAtPm5leHQ7CisgICAgICBwKys7CisgICAgfQorICAgIGVsc2UKKyAgICB7IHdoaWxlIChucCAmJiAqbnAtPmlkKQorICAgICAgICBucCA9IG5wLT5uZXh0OworICAgICAgcCA9IHM7CisgICAgfQorICAgIGlmIChucCkKKyAgICB7IGlmIChucC0+aW5kZXggPj0gMCAmJiBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzKQorICAgICAgeyByZWdpc3RlciBjb25zdCBjaGFyICpxID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tucC0+aW5kZXhdLmlkOworICAgICAgICBpZiAocSkKKyAgICAgICAgeyBpZiAoKCp0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihwKSArIHN0cmxlbihxKSArIDIpKSkKKyAgICAgICAgICAgIHNwcmludGYoKnQsICIlczolcyIsIHEsIHApOworICAgICAgICAgIHJldHVybiBTT0FQX09LOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAobnAtPm5zKQorICAgICAgeyBpZiAoKCp0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihwKSArIHN0cmxlbihucC0+bnMpICsgNCkpKQorICAgICAgICAgIHNwcmludGYoKnQsICJcIiVzXCI6JXMiLCBucC0+bnMsIHApOworICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICAgIH0KKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTmFtZXNwYWNlIHByZWZpeCBvZiAnJXMnIG5vdCBkZWZpbmVkIChpbmRleD0lZCwgVVJJPSVzKVxuIiwgcywgbnAtPmluZGV4LCBucC0+bnM/bnAtPm5zOiIiKSk7CisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX05BTUVTUEFDRTsgCisgICAgfQorICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTmFtZXNwYWNlIHByZWZpeCBvZiAnJXMnIG5vdCBkZWZpbmVkLCBhc3N1bWluZyBlbXB0eSBuYW1lc3BhY2VcbiIsIHMpKTsKKyAgICBpZiAoKCp0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihwKSArIDQpKSkKKyAgICAgIHNwcmludGYoKnQsICJcIlwiOiVzIiwgcCk7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfUU5hbWUycyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcykKK3sgc3RydWN0IE5hbWVzcGFjZSAqcDsKKyAgY2hhciAqdDsKKyAgaW50IG47CisgIGlmICghcyB8fCAqcyAhPSAnIicpCisgIHsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKHMgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpKQorICAgIHsgdCA9IChjaGFyKilzdHJjaHIocywgJzonKTsKKyAgICAgIGlmICh0KQorICAgICAgICBzb2FwX3V0aWxpemVfbnMoc29hcCwgcywgdCAtIHMpOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBzOworICB9CisgIHMrKzsKKyAgaWYgKChwID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlcykpCisgIHsgZm9yICg7IHAtPmlkOyBwKyspCisgICAgeyBpZiAocC0+bnMpCisgICAgICAgIGlmICghc29hcF90YWdfY21wKHMsIHAtPm5zKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIGlmIChwLT5pbikKKyAgICAgICAgaWYgKCFzb2FwX3RhZ19jbXAocywgcC0+aW4pKQorICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAocCAmJiBwLT5pZCkKKyAgICB7IHMgPSBzdHJjaHIocywgJyInKTsKKyAgICAgIGlmIChzKQorICAgICAgeyB0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihwLT5pZCkgKyBzdHJsZW4ocykpOworICAgICAgICBzdHJjcHkodCwgcC0+aWQpOworCXN0cmNhdCh0LCBzICsgMSk7CisgICAgICAgIHJldHVybiB0OworICAgICAgfQorICAgIH0KKyAgfQorICB0ID0gKGNoYXIqKXN0cmNocihzLCAnIicpOworICBpZiAodCkKKyAgICBuID0gdCAtIHM7CisgIGVsc2UKKyAgICBuID0gMDsKKyAgdCA9IHNvYXBfc3RyZHVwKHNvYXAsIHMpOworICB0W25dID0gJ1wwJzsKKyAgc3ByaW50Zihzb2FwLT50bXBidWYsICJ4bWxuczpfJWQiLCBzb2FwLT5pZG51bSsrKTsKKyAgc29hcF9zZXRfYXR0cihzb2FwLCBzb2FwLT50bXBidWYsIHQpOworICBzID0gc3RyY2hyKHMsICciJyk7CisgIGlmIChzKQorICB7IHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc3RybGVuKHNvYXAtPnRtcGJ1ZikgKyBzdHJsZW4ocykgLSA2KTsKKyAgICBzdHJjcHkodCwgc29hcC0+dG1wYnVmICsgNik7CisgICAgc3RyY2F0KHQsIHMgKyAxKTsKKyAgfQorICByZXR1cm4gdDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMndjaGFyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCB3Y2hhcl90ICoqdCkKK3sgd2NoYXJfdCAqcjsKKyAgaWYgKCFzKQorICAgICp0ID0gTlVMTDsKKyAgZWxzZQorICB7ICp0ID0gciA9ICh3Y2hhcl90Kilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yod2NoYXJfdCkgKiAoc3RybGVuKHMpICsgMSkpOworICAgIGlmICghcikKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0xBVElOKQorICAgIHsgd2hpbGUgKCpzKQorICAgICAgICAqcisrID0gKHdjaGFyX3QpKnMrKzsKKyAgICB9CisgICAgZWxzZQorICAgIHsgLyogQ29udmVydCBVVEY4IHRvIHdjaGFyICovCisgICAgICB3aGlsZSAoKnMpCisgICAgICB7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYywgYzEsIGMyLCBjMywgYzQ7CisgICAgICAgIGMgPSAqcysrOworICAgICAgICBpZiAoYyA8IDB4ODApCisJICAqcisrID0gKHdjaGFyX3QpYzsKKwllbHNlCisgICAgICAgIHsgYzEgPSAoc29hcF93Y2hhcikqcysrICYgMHgzRjsKKyAgICAgICAgICBpZiAoYyA8IDB4RTApCisgICAgICAgICAgICAqcisrID0gKHdjaGFyX3QpKCgoc29hcF93Y2hhcikoYyAmIDB4MUYpIDw8IDYpIHwgYzEpOworICAgICAgICAgIGVsc2UKKwkgIHsgYzIgPSAoc29hcF93Y2hhcikqcysrICYgMHgzRjsKKyAgICAgICAgICAgIGlmIChjIDwgMHhGMCkKKyAgICAgICAgICAgICAgKnIrKyA9ICh3Y2hhcl90KSgoKHNvYXBfd2NoYXIpKGMgJiAweDBGKSA8PCAxMikgfCAoYzEgPDwgNikgfCBjMik7CisgICAgICAgICAgICBlbHNlCisJICAgIHsgYzMgPSAoc29hcF93Y2hhcikqcysrICYgMHgzRjsKKyAgICAgICAgICAgICAgaWYgKGMgPCAweEY4KQorICAgICAgICAgICAgICAgICpyKysgPSAod2NoYXJfdCkoKChzb2FwX3djaGFyKShjICYgMHgwNykgPDwgMTgpIHwgKGMxIDw8IDEyKSB8IChjMiA8PCA2KSB8IGMzKTsKKyAgICAgICAgICAgICAgZWxzZQorCSAgICAgIHsgYzQgPSAoc29hcF93Y2hhcikqcysrICYgMHgzRjsKKyAgICAgICAgICAgICAgICBpZiAoYyA8IDB4RkMpCisgICAgICAgICAgICAgICAgICAqcisrID0gKHdjaGFyX3QpKCgoc29hcF93Y2hhcikoYyAmIDB4MDMpIDw8IDI0KSB8IChjMSA8PCAxOCkgfCAoYzIgPDwgMTIpIHwgKGMzIDw8IDYpIHwgYzQpOworICAgICAgICAgICAgICAgIGVsc2UKKwkJICAqcisrID0gKHdjaGFyX3QpKCgoc29hcF93Y2hhcikoYyAmIDB4MDEpIDw8IDMwKSB8IChjMSA8PCAyNCkgfCAoYzIgPDwgMTgpIHwgKGMzIDw8IDEyKSB8IChjNCA8PCA2KSB8IChzb2FwX3djaGFyKSgqcysrICYgMHgzRikpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgICpyID0gTCdcMCc7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF93Y2hhcjJzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB3Y2hhcl90ICpzKQoreyByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIHJlZ2lzdGVyIGNoYXIgKnIsICp0OworICBjb25zdCB3Y2hhcl90ICpxID0gczsKKyAgc2l6ZV90IG4gPSAwOworICB3aGlsZSAoKGMgPSAqcSsrKSkKKyAgeyBpZiAoYyA+IDAgJiYgYyA8IDB4ODApCisgICAgICBuKys7CisgICAgZWxzZQorICAgICAgbiArPSA2OworICB9CisgIHIgPSB0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIG4gKyAxKTsKKyAgaWYgKHIpCisgIHsgLyogQ29udmVydCB3Y2hhciB0byBVVEY4ICovCisgICAgd2hpbGUgKChjID0gKnMrKykpCisgICAgeyBpZiAoYyA+IDAgJiYgYyA8IDB4ODApCisgICAgICAgICp0KysgPSAoY2hhciljOworICAgICAgZWxzZQorICAgICAgeyBpZiAoYyA8IDB4MDgwMCkKKyAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4QzAgfCAoKGMgPj4gNikgJiAweDFGKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyBpZiAoYyA8IDB4MDEwMDAwKQorICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEUwIHwgKChjID4+IDEyKSAmIDB4MEYpKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeyBpZiAoYyA8IDB4MjAwMDAwKQorICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjAgfCAoKGMgPj4gMTgpICYgMHgwNykpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyBpZiAoYyA8IDB4MDQwMDAwMDApCisgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEY4IHwgKChjID4+IDI0KSAmIDB4MDMpKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7ICp0KysgPSAoY2hhcikoMHhGQyB8ICgoYyA+PiAzMCkgJiAweDAxKSk7CisgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDI0KSAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTgpICYgMHgzRikpOworICAgICAgICAgICAgfSAgICAgCisgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTIpICYgMHgzRikpOworICAgICAgICAgIH0KKyAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gNikgJiAweDNGKSk7CisgICAgICAgIH0KKyAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKGMgJiAweDNGKSk7CisgICAgICB9CisgICAgfQorICAgICp0ID0gJ1wwJzsKKyAgfQorICByZXR1cm4gcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRzdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjaGFyICpjb25zdCpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikgCit7IGlkID0gc29hcF9lbGVtZW50X2lkKHNvYXAsIHRhZywgaWQsICpwLCBOVUxMLCAwLCB0eXBlLCBuKTsKKyAgaWYgKGlkIDwgMAorICAgfHwgc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIGlkLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsICpwLCAwKQorICAgfHwgc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqKgorU09BUF9GTUFDMgorc29hcF9pbnN0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBjaGFyICoqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQsIGludCBmbGFnLCBsb25nIG1pbmxlbiwgbG9uZyBtYXhsZW4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAxKSkKKyAgeyBpZiAoIXRhZyB8fCAqdGFnICE9ICctJyB8fCBzb2FwLT5lcnJvciAhPSBTT0FQX05PX1RBRykKKyAgICAgIHJldHVybiBOVUxMOworICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgfQorICBpZiAoIXApCisgICAgaWYgKCEocCA9IChjaGFyKiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKGNoYXIqKSkpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIGlmIChzb2FwLT5ib2R5KQorICB7ICpwID0gc29hcF9zdHJpbmdfaW4oc29hcCwgZmxhZywgbWlubGVuLCBtYXhsZW4pOworICAgIGlmICghKnAgfHwgIShjaGFyKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCAqcCwgdCwgc2l6ZW9mKGNoYXIqKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBlbHNlIGlmIChzb2FwLT5udWxsKQorICAgICpwID0gTlVMTDsKKyAgZWxzZQorICAgICpwID0gKGNoYXIqKVNPQVBfU1RSX0VPUzsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAoY2hhcioqKXNvYXBfaWRfbG9va3VwKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopcCwgdCwgc2l6ZW9mKGNoYXIqKiksIDApOworICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHdzdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCB3Y2hhcl90ICpjb25zdCpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikgCit7IGlkID0gc29hcF9lbGVtZW50X2lkKHNvYXAsIHRhZywgaWQsICpwLCBOVUxMLCAwLCB0eXBlLCBuKTsKKyAgaWYgKGlkIDwgMAorICAgfHwgc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIGlkLCB0eXBlKQorICAgfHwgc29hcF93c3RyaW5nX291dChzb2FwLCAqcCwgMCkKKyAgIHx8IHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZykpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQord2NoYXJfdCAqKgorU09BUF9GTUFDMgorc29hcF9pbndzdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgd2NoYXJfdCAqKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0LCBsb25nIG1pbmxlbiwgbG9uZyBtYXhsZW4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAxKSkKKyAgeyBpZiAoIXRhZyB8fCAqdGFnICE9ICctJyB8fCBzb2FwLT5lcnJvciAhPSBTT0FQX05PX1RBRykKKyAgICAgIHJldHVybiBOVUxMOworICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgfQorICBpZiAoIXApCisgICAgaWYgKCEocCA9ICh3Y2hhcl90Kiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHdjaGFyX3QqKSkpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIGlmIChzb2FwLT5ib2R5KQorICB7ICpwID0gc29hcF93c3RyaW5nX2luKHNvYXAsIDEsIG1pbmxlbiwgbWF4bGVuKTsKKyAgICBpZiAoISpwIHx8ICEod2NoYXJfdCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgKnAsIHQsIHNpemVvZih3Y2hhcl90KiksIDAsIE5VTEwsIE5VTEwsIE5VTEwpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZWxzZSBpZiAoc29hcC0+bnVsbCkKKyAgICAqcCA9IE5VTEw7CisgIGVsc2UKKyAgICAqcCA9ICh3Y2hhcl90KilTT0FQX1NUUl9FT1M7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKHdjaGFyX3QqKilzb2FwX2lkX2xvb2t1cChzb2FwLCBzb2FwLT5ocmVmLCAodm9pZCoqKXAsIHQsIHNpemVvZih3Y2hhcl90KiopLCAwKTsKKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIHRpbWVfdAorc29hcF90aW1lZ20oc3RydWN0IHRtICpUKQoreworI2lmIGRlZmluZWQoSEFWRV9USU1FR00pCisgIHJldHVybiB0aW1lZ20oVCk7CisjZWxzZQorICB0aW1lX3QgdCwgZywgejsKKyNpZmRlZiBIQVZFX0dNVElNRV9SCisgIHN0cnVjdCB0bSB0bSwgKnRtcCA9ICZ0bTsKKyNlbHNlCisgIHN0cnVjdCB0bSAqdG1wOworI2VuZGlmCisgIHQgPSBta3RpbWUoVCk7CisgIGlmICh0ID09IC0xKQorICAgIHJldHVybiAtMTsKKyNpZmRlZiBIQVZFX0dNVElNRV9SCisgIGdtdGltZV9yKCZ0LCB0bXApOworI2Vsc2UKKyAgdG1wID0gZ210aW1lKCZ0KTsKKyNlbmRpZgorICB0bXAtPnRtX2lzZHN0ID0gMDsKKyAgZyA9IG1rdGltZSh0bXApOworICBpZiAoZyA9PSAtMSkKKyAgICByZXR1cm4gLTE7CisgIHogPSBnIC0gdDsKKyAgcmV0dXJuIHQgLSB6OworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9kYXRlVGltZTJzKHN0cnVjdCBzb2FwICpzb2FwLCB0aW1lX3QgbikKK3sgc3RydWN0IHRtIFQsICpwVCA9ICZUOworI2lmIGRlZmluZWQoSEFWRV9HTVRJTUVfUikKKyAgaWYgKGdtdGltZV9yKCZuLCBwVCkpCisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTWiIsIHBUKTsKKyAgLyogVGhlIGZvbGxvd2luZyBkZWZpbmVzIHdlcmUgYWRkZWQgZm9yIFZ4V29ya3MqLworI2VsaWYgZGVmaW5lZChIQVZFX1BHTVRJTUVfUikKKyAgaWYgKGdtdGltZV9yKCZuLCBwVCkpCisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTWiIsIHBUKTsKKyNlbGlmIGRlZmluZWQoSEFWRV9QR01USU1FKQorICBpZiAoZ210aW1lKCZuLCBwVCkpCisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTWiIsIHBUKTsKKyNlbGlmIGRlZmluZWQoSEFWRV9HTVRJTUUpCisgIGlmICgocFQgPSBnbXRpbWUoJm4pKSkKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVNaIiwgcFQpOworI2VsaWYgZGVmaW5lZChIQVZFX0dFVFRJTUVPRkRBWSkKKyAgc3RydWN0IHRpbWV6b25lIHR6OworICBtZW1zZXQoKHZvaWQqKSZ0eiwgMCwgc2l6ZW9mKHR6KSk7CisjIGlmIGRlZmluZWQoSEFWRV9MT0NBTFRJTUVfUikKKyAgaWYgKGxvY2FsdGltZV9yKCZuLCBwVCkpCisgIHsgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgZ2V0dGltZW9mZGF5KCZ0diwgJnR6KTsKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwVCk7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYgKyBzdHJsZW4oc29hcC0+dG1wYnVmKSwgIiUrMDNkOiUwMmQiLCAtdHoudHpfbWludXRlc3dlc3QvNjArKHBULT50bV9pc2RzdCE9MCksIGFicyh0ei50el9taW51dGVzd2VzdCklNjApOworICB9CisjIGVsc2UKKyAgaWYgKChwVCA9IGxvY2FsdGltZSgmbikpKQorICB7IHN0cnVjdCB0aW1ldmFsIHR2OworICAgIGdldHRpbWVvZmRheSgmdHYsICZ0eik7CisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmICsgc3RybGVuKHNvYXAtPnRtcGJ1ZiksICIlKzAzZDolMDJkIiwgLXR6LnR6X21pbnV0ZXN3ZXN0LzYwKyhwVC0+dG1faXNkc3QhPTApLCBhYnModHoudHpfbWludXRlc3dlc3QpJTYwKTsKKyAgfQorI2VuZGlmCisjZWxpZiBkZWZpbmVkKEhBVkVfRlRJTUUpCisgIHN0cnVjdCB0aW1lYiB0OworICBtZW1zZXQoKHZvaWQqKSZ0LCAwLCBzaXplb2YodCkpOworIyBpZiBkZWZpbmVkKEhBVkVfTE9DQUxUSU1FX1IpCisgIGlmIChsb2NhbHRpbWVfcigmbiwgcFQpKQorICB7IGZ0aW1lKCZ0KTsKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwVCk7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYgKyBzdHJsZW4oc29hcC0+dG1wYnVmKSwgIiUrMDNkOiUwMmQiLCAtdC50aW1lem9uZS82MCsocFQtPnRtX2lzZHN0IT0wKSwgYWJzKHQudGltZXpvbmUpJTYwKTsKKyAgfQorICAvKiBUaGUgZm9sbG93aW5nIGRlZmluZXMgd2VyZSBhZGRlZCBmb3IgVnhXb3JrcyovCisjIGVsaWYgZGVmaW5lZChIQVZFX1BMT0NBTFRJTUVfUikKKyAgaWYgKGxvY2FsdGltZV9yKCZuLCBwVCkpCisgIHsgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmK3N0cmxlbihzb2FwLT50bXBidWYpLCAiJSswM2Q6JTAyZCIsIHQudGltZXpvbmUvNjAsIGFicyh0LnRpbWV6b25lKSU2MCk7CisgIH0KKyMgZWxzZQorICBpZiAoKHBUID0gbG9jYWx0aW1lKCZuKSkpCisgIHsgZnRpbWUoJnQpOworICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIHN0cmxlbihzb2FwLT50bXBidWYpLCAiJSswM2Q6JTAyZCIsIC10LnRpbWV6b25lLzYwKyhwVC0+dG1faXNkc3QhPTApLCBhYnModC50aW1lem9uZSklNjApOworICB9CisjIGVuZGlmCisjZWxpZiBkZWZpbmVkKEhBVkVfTE9DQUxUSU1FX1IpCisgIGlmIChsb2NhbHRpbWVfcigmbiwgcFQpKQorICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyAgLyogVGhlIGZvbGxvd2luZyBkZWZpbmVzIHdlcmUgYWRkZWQgZm9yIFZ4V29ya3MqLworI2VsaWYgZGVmaW5lZChIQVZFX1BMT0NBTFRJTUVfUikKKyAgaWYgKGxvY2FsdGltZV9yKCZuLCBwVCkpCisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworI2Vsc2UKKyAgaWYgKChwVCA9IGxvY2FsdGltZSgmbikpKQorICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyNlbmRpZgorICBlbHNlCisgICAgc3RyY3B5KHNvYXAtPnRtcGJ1ZiwgIjE5NjktMTItMzFUMjM6NTk6NTlaIik7CisgIHJldHVybiBzb2FwLT50bXBidWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0ZGF0ZVRpbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCB0aW1lX3QgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfZGF0ZVRpbWUycyhzb2FwLCAqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJkYXRlVGltZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgdGltZV90ICpwKQoreyBpZiAocykKKyAgeyBzdHJ1Y3QgdG0gVDsKKyAgICBjaGFyIHpvbmVbMTZdOworICAgIGNvbnN0IGNoYXIgKnQ7CisgICAgbWVtc2V0KCh2b2lkKikmVCwgMCwgc2l6ZW9mKFQpKTsKKyAgICB6b25lW3NpemVvZih6b25lKS0xXSA9ICdcMCc7CisgICAgaWYgKHN0cmNocihzLCAnLScpKQorICAgICAgdCA9ICIlZC0lZC0lZFQlZDolZDolZCUxNXMiOworICAgIGVsc2UgaWYgKHN0cmNocihzLCAnOicpKQorICAgICAgdCA9ICIlNGQlMmQlMmRUJWQ6JWQ6JWQlMTVzIjsKKyAgICBlbHNlIC8qIHBhcnNlIG5vbi1YU0Qtc3RhbmRhcmQgYWx0ZXJuYXRpdmUgSVNPIDg2MDEgZm9ybWF0ICovCisgICAgICB0ID0gIiU0ZCUyZCUyZFQlMmQlMmQlMmQlMTVzIjsKKyAgICBzc2NhbmYocywgdCwgJlQudG1feWVhciwgJlQudG1fbW9uLCAmVC50bV9tZGF5LCAmVC50bV9ob3VyLCAmVC50bV9taW4sICZULnRtX3NlYywgem9uZSk7CisgICAgaWYgKFQudG1feWVhciA9PSAxKQorICAgICAgVC50bV95ZWFyID0gNzA7CisgICAgZWxzZQorICAgICAgVC50bV95ZWFyIC09IDE5MDA7CisgICAgVC50bV9tb24tLTsKKyAgICBpZiAoKnpvbmUpCisgICAgeyBpZiAoKnpvbmUgPT0gJy4nKQorICAgICAgeyBmb3IgKHMgPSB6b25lICsgMTsgKnM7IHMrKykKKyAgICAgICAgICBpZiAoKnMgPCAnMCcgfHwgKnMgPiAnOScpCisgICAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcyA9IHpvbmU7CisgICAgICBpZiAoKnMgPT0gJysnIHx8ICpzID09ICctJykKKyAgICAgIHsgaW50IGggPSAwLCBtID0gMDsKKyAgICAgICAgaWYgKHNbM10gPT0gJzonKQorCXsgc3NjYW5mKHMsICIlZDolZCIsICZoLCAmbSk7CisJICBpZiAoaCA8IDApCisJICAgIG0gPSAtbTsKKwl9CisJZWxzZQorCXsgbSA9IChpbnQpYXRvbChzKTsKKwkgIGggPSBtIC8gMTAwOworCSAgbSA9IG0gJSAxMDA7CisJfQorICAgICAgICBULnRtX2hvdXIgLT0gaDsKKyAgICAgICAgVC50bV9taW4gLT0gbTsKKyAgICAgIH0KKyAgICAgIFQudG1faXNkc3QgPSAwOworICAgICAgKnAgPSBzb2FwX3RpbWVnbSgmVCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IFQudG1faXNkc3QgPSAtMTsKKyAgICAgICpwID0gbWt0aW1lKCZUKTsgLyogbm8gdGltZSB6b25lOiBzdXBwb3NlIGl0IGlzIGxvY2FsdGltZT8gKi8KKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQordGltZV90ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5kYXRlVGltZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB0aW1lX3QgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6ZGF0ZVRpbWUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwID0gKHRpbWVfdCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKHRpbWVfdCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9ICh0aW1lX3QqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YodGltZV90KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJkYXRlVGltZShzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0bGl0ZXJhbChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBjaGFyICpjb25zdCpwKQoreyBpbnQgaTsKKyAgY29uc3QgY2hhciAqdCA9IE5VTEw7CisgIGlmICh0YWcgJiYgKnRhZyAhPSAnLScpCisgIHsgaWYgKHNvYXAtPmxvY2FsX25hbWVzcGFjZXMgJiYgKHQgPSBzdHJjaHIodGFnLCAnOicpKSkKKyAgICB7IHN0cm5jcHkoc29hcC0+dG1wYnVmLCB0YWcsIHQtdGFnKTsKKyAgICAgIHNvYXAtPnRtcGJ1Zlt0LXRhZ10gPSAnXDAnOworICAgICAgZm9yIChpID0gMDsgc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tpXS5pZDsgaSsrKQorICAgICAgICBpZiAoIXN0cmNtcChzb2FwLT50bXBidWYsIHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0uaWQpKQorICAgICAgICAgIGJyZWFrOworICAgICAgdCsrOworICAgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICI8JXMgeG1sbnM9XCIlc1wiPiIsIHQsIHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0ubnMgPyBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW2ldLm5zIDogU09BUF9TVFJfRU9TKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgdCA9IHRhZzsKKyAgICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiPCVzPiIsIHRhZyk7CisgICAgfQorICAgIGlmIChzb2FwX3NlbmQoc29hcCwgc29hcC0+dG1wYnVmKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAocCAmJiAqcCkKKyAgeyBpZiAoc29hcF9zZW5kKHNvYXAsICpwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAodCkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIjwvJXM+IiwgdCk7CisgICAgcmV0dXJuIHNvYXBfc2VuZChzb2FwLCBzb2FwLT50bXBidWYpOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqKgorU09BUF9GTUFDMgorc29hcF9pbmxpdGVyYWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgY2hhciAqKnApCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAxKSkKKyAgeyBpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9OT19UQUcgfHwgc29hcF91bmdldChzb2FwLCBzb2FwX2dldChzb2FwKSkgPT0gU09BUF9UVCkKKyAgICAgIHJldHVybiBOVUxMOworICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgfQorICBpZiAoIXApCisgICAgaWYgKCEocCA9IChjaGFyKiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKGNoYXIqKSkpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIGlmIChzb2FwLT5ib2R5KQorICAgICpwID0gc29hcF9zdHJpbmdfaW4oc29hcCwgMCwgLTEsIC0xKTsKKyAgZWxzZSBpZiAoc29hcC0+bnVsbCkKKyAgICAqcCA9IE5VTEw7CisgIGVsc2UKKyAgICAqcCA9IChjaGFyKilTT0FQX1NUUl9FT1M7CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0d2xpdGVyYWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgd2NoYXJfdCAqY29uc3QqcCkKK3sgaW50IGk7CisgIGNvbnN0IGNoYXIgKnQgPSBOVUxMOworICB3Y2hhcl90IGM7CisgIGNvbnN0IHdjaGFyX3QgKnM7CisgIGlmICh0YWcgJiYgKnRhZyAhPSAnLScpCisgIHsgaWYgKHNvYXAtPmxvY2FsX25hbWVzcGFjZXMgJiYgKHQgPSBzdHJjaHIodGFnLCAnOicpKSkKKyAgICB7IHN0cm5jcHkoc29hcC0+dG1wYnVmLCB0YWcsIHQtdGFnKTsKKyAgICAgIHNvYXAtPnRtcGJ1Zlt0LXRhZ10gPSAnXDAnOworICAgICAgZm9yIChpID0gMDsgc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tpXS5pZDsgaSsrKQorICAgICAgICBpZiAoIXN0cmNtcChzb2FwLT50bXBidWYsIHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0uaWQpKQorICAgICAgICAgIGJyZWFrOworICAgICAgdCsrOworICAgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICI8JXMgeG1sbnM9XCIlc1wiPiIsIHQsIHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0ubnMgPyBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW2ldLm5zIDogU09BUF9TVFJfRU9TKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgdCA9IHRhZzsKKyAgICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiPCVzPiIsIHRhZyk7CisgICAgfQorICAgIGlmIChzb2FwX3NlbmQoc29hcCwgc29hcC0+dG1wYnVmKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAocCkKKyAgeyBzID0gKnA7CisgICAgd2hpbGUgKChjID0gKnMrKykpCisgICAgICBpZiAoc29hcF9wdXR1dGY4KHNvYXAsICh1bnNpZ25lZCBjaGFyKWMpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHQpCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICI8LyVzPiIsIHQpOworICAgIHJldHVybiBzb2FwX3NlbmQoc29hcCwgc29hcC0+dG1wYnVmKTsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQord2NoYXJfdCAqKgorU09BUF9GTUFDMgorc29hcF9pbndsaXRlcmFsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHdjaGFyX3QgKipwKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMSkpCisgIHsgaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfTk9fVEFHIHx8IHNvYXBfdW5nZXQoc29hcCwgc29hcF9nZXQoc29hcCkpID09IFNPQVBfVFQpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIH0KKyAgaWYgKCFwKQorICAgIGlmICghKHAgPSAod2NoYXJfdCoqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZih3Y2hhcl90KikpKSkKKyAgICAgIHJldHVybiBOVUxMOworICBpZiAoc29hcC0+Ym9keSkKKyAgICAqcCA9IHNvYXBfd3N0cmluZ19pbihzb2FwLCAwLCAtMSwgLTEpOworICBlbHNlIGlmIChzb2FwLT5udWxsKQorICAgICpwID0gTlVMTDsKKyAgZWxzZQorICAgICpwID0gKHdjaGFyX3QqKVNPQVBfU1RSX0VPUzsKKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3Rva2VuKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzaXplX3QgaTsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjID0gMDsKKyAgcmVnaXN0ZXIgY2hhciAqcyA9IHNvYXAtPnRtcGJ1ZjsKKyAgaWYgKCFzb2FwLT5ib2R5KQorICAgIHJldHVybiBTT0FQX1NUUl9FT1M7CisgIGRvIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZikgLSAxOyBpKyspCisgIHsgaWYgKGMgPT0gU09BUF9UVCB8fCAoaW50KWMgPT0gRU9GIHx8IHNvYXBfYmxhbmsoYykpCisgICAgICBicmVhazsKKyAgICAqcysrID0gKGNoYXIpYzsKKyAgICBjID0gc29hcF9nZXQoc29hcCk7CisgIH0KKyAgaWYgKChpbnQpYyA9PSBFT0YgfHwgYyA9PSBTT0FQX1RUKQorICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICpzID0gJ1wwJzsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbGVtZW50IGNvbnRlbnQgdmFsdWU9JyVzJ1xuIiwgc29hcC0+dG1wYnVmKSk7CisgIHJldHVybiBzb2FwLT50bXBidWY7IC8qIHJldHVybiBub24tbnVsbCBwb2ludGVyICovCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfdmFsdWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNpemVfdCBpOworICByZWdpc3RlciBzb2FwX3djaGFyIGMgPSAwOworICByZWdpc3RlciBjaGFyICpzID0gc29hcC0+dG1wYnVmOworICBpZiAoIXNvYXAtPmJvZHkpCisgICAgcmV0dXJuIFNPQVBfU1RSX0VPUzsKKyAgZG8gYyA9IHNvYXBfZ2V0KHNvYXApOworICB3aGlsZSAoc29hcF9ibGFuayhjKSk7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc29hcC0+dG1wYnVmKSAtIDE7IGkrKykKKyAgeyBpZiAoYyA9PSBTT0FQX1RUIHx8IChpbnQpYyA9PSBFT0YpCisgICAgICBicmVhazsKKyAgICAqcysrID0gKGNoYXIpYzsKKyAgICBjID0gc29hcF9nZXQoc29hcCk7CisgIH0KKyAgZm9yIChzLS07IGkgPiAwOyBpLS0sIHMtLSkKKyAgICBpZiAoIXNvYXBfYmxhbmsoKnMpKQorICAgICAgYnJlYWs7CisgIHNbMV0gPSAnXDAnOworICBpZiAoKGludCljID09IEVPRiB8fCBjID09IFNPQVBfVFQpCisgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbGVtZW50IGNvbnRlbnQgdmFsdWU9JyVzJ1xuIiwgc29hcC0+dG1wYnVmKSk7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgICAgc29hcC0+ZG9tLT5kYXRhID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+dG1wYnVmKTsKKyNlbmRpZgorICByZXR1cm4gc29hcC0+dG1wYnVmOyAvKiByZXR1cm4gbm9uLW51bGwgcG9pbnRlciAqLworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgIWRlZmluZWQoV0lUSF9MRUFORVIpIHx8ICFkZWZpbmVkKFdJVEhfTk9IVFRQKQorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRsaW5lKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpzLCBpbnQgbGVuKQoreyBpbnQgaSA9IGxlbjsKKyAgc29hcF93Y2hhciBjID0gMDsKKyAgZm9yICg7OykKKyAgeyB3aGlsZSAoLS1pID4gMCkKKyAgICB7IGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgICAgICBpZiAoYyA9PSAnXHInIHx8IGMgPT0gJ1xuJykKKyAgICAgICAgYnJlYWs7CisgICAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgICAqcysrID0gKGNoYXIpYzsKKyAgICB9CisgICAgaWYgKGMgIT0gJ1xuJykKKyAgICAgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7IC8qIGdvdCBcciwgbm93IGdldCBcbiAqLworICAgIGlmIChjID09ICdcbicpCisgICAgeyAqcyA9ICdcMCc7CisgICAgICBpZiAoaSsxID09IGxlbikgLyogZW1wdHkgbGluZTogZW5kIG9mIEhUVFAvTUlNRSBoZWFkZXIgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICBjID0gc29hcF91bmdldChzb2FwLCBzb2FwX2dldGNoYXIoc29hcCkpOworICAgICAgaWYgKGMgIT0gJyAnICYmIGMgIT0gJ1x0JykgLyogSFRUUCBsaW5lIGNvbnRpbnVhdGlvbj8gKi8KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGVsc2UgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHNpemVfdAorc29hcF9jb3VudF9hdHRhY2htZW50cyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgcmVnaXN0ZXIgc2l6ZV90IGNvdW50ID0gc29hcC0+Y291bnQ7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ2FsY3VsYXRpbmcgdGhlIG1lc3NhZ2Ugc2l6ZSB3aXRoIGF0dGFjaG1lbnRzLCBjdXJyZW50IGNvdW50PSVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpY291bnQpKTsKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkgJiYgIShzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkpCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDYWxjdWxhdGluZyB0aGUgc2l6ZSBvZiBESU1FIGF0dGFjaG1lbnRzXG4iKSk7CisgICAgZm9yIChjb250ZW50ID0gc29hcC0+ZGltZS5maXJzdDsgY29udGVudDsgY29udGVudCA9IGNvbnRlbnQtPm5leHQpCisgICAgeyBjb3VudCArPSAxMiArICgoY29udGVudC0+c2l6ZSszKSYofjMpKTsKKyAgICAgIGlmIChjb250ZW50LT5pZCkKKyAgICAgICAgY291bnQgKz0gKChzdHJsZW4oY29udGVudC0+aWQpKzMpJih+MykpOworICAgICAgaWYgKGNvbnRlbnQtPnR5cGUpCisgICAgICAgIGNvdW50ICs9ICgoc3RybGVuKGNvbnRlbnQtPnR5cGUpKzMpJih+MykpOworICAgICAgaWYgKGNvbnRlbnQtPm9wdGlvbnMpCisgICAgICAgIGNvdW50ICs9ICgoKCh1bnNpZ25lZCBjaGFyKWNvbnRlbnQtPm9wdGlvbnNbMl0gPDwgOCkgfCAoKHVuc2lnbmVkIGNoYXIpY29udGVudC0+b3B0aW9uc1szXSkpKzcpJih+Myk7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNpemUgb2YgRElNRSBhdHRhY2htZW50IGNvbnRlbnQgaXMgJWx1IGJ5dGVzXG4iLCAodW5zaWduZWQgbG9uZyljb250ZW50LT5zaXplKSk7CisgICAgfQorICB9CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01JTUUpICYmIHNvYXAtPm1pbWUuYm91bmRhcnkpCisgIHsgcmVnaXN0ZXIgc2l6ZV90IG4gPSBzdHJsZW4oc29hcC0+bWltZS5ib3VuZGFyeSk7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDYWxjdWxhdGluZyB0aGUgc2l6ZSBvZiBNSU1FIGF0dGFjaG1lbnRzXG4iKSk7CisgICAgZm9yIChjb250ZW50ID0gc29hcC0+bWltZS5maXJzdDsgY29udGVudDsgY29udGVudCA9IGNvbnRlbnQtPm5leHQpCisgICAgeyByZWdpc3RlciBjb25zdCBjaGFyICpzOworICAgICAgLyogY291bnQgXHJcbi0tYm91bmRhcnlcclxuICovCisgICAgICBjb3VudCArPSA2ICsgbjsKKyAgICAgIC8qIGNvdW50IENvbnRlbnQtVHlwZTogLi4uXHJcbiAqLworICAgICAgaWYgKGNvbnRlbnQtPnR5cGUpCisgICAgICAgIGNvdW50ICs9IDE2ICsgc3RybGVuKGNvbnRlbnQtPnR5cGUpOworICAgICAgLyogY291bnQgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogLi4uXHJcbiAqLworICAgICAgcyA9IHNvYXBfc3RyX2NvZGUobWltZV9jb2RlcywgY29udGVudC0+ZW5jb2RpbmcpOworICAgICAgaWYgKHMpCisgICAgICAgIGNvdW50ICs9IDI5ICsgc3RybGVuKHMpOworICAgICAgLyogY291bnQgQ29udGVudC1JRDogLi4uXHJcbiAqLworICAgICAgaWYgKGNvbnRlbnQtPmlkKQorICAgICAgICBjb3VudCArPSAxNCArIHN0cmxlbihjb250ZW50LT5pZCk7CisgICAgICAvKiBjb3VudCBDb250ZW50LUxvY2F0aW9uOiAuLi5cclxuICovCisgICAgICBpZiAoY29udGVudC0+bG9jYXRpb24pCisgICAgICAgIGNvdW50ICs9IDIwICsgc3RybGVuKGNvbnRlbnQtPmxvY2F0aW9uKTsKKyAgICAgIC8qIGNvdW50IENvbnRlbnQtRGVzY3JpcHRpb246IC4uLlxyXG4gKi8KKyAgICAgIGlmIChjb250ZW50LT5kZXNjcmlwdGlvbikKKyAgICAgICAgY291bnQgKz0gMjMgKyBzdHJsZW4oY29udGVudC0+bG9jYXRpb24pOworICAgICAgLyogY291bnQgXHJcbi4uLmNvbnRlbnQgKi8KKyAgICAgIGNvdW50ICs9IDIgKyBjb250ZW50LT5zaXplOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTaXplIG9mIE1JTUUgYXR0YWNobWVudCBjb250ZW50IGlzICVsdSBieXRlc1xuIiwgKHVuc2lnbmVkIGxvbmcpY29udGVudC0+c2l6ZSkpOworICAgIH0KKyAgICAvKiBjb3VudCBcclxuLS1ib3VuZGFyeS0tICovCisgICAgY291bnQgKz0gNiArIG47CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJOZXcgY291bnQgaXMgJWx1IGJ5dGVzXG4iLCAodW5zaWduZWQgbG9uZyljb3VudCkpOworICByZXR1cm4gY291bnQ7CisjZWxzZQorICByZXR1cm4gc29hcC0+Y291bnQ7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NvYXBfcHV0ZGltZWZpZWxkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBzaXplX3QgbikKK3sgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgbikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCBTT0FQX1NUUl9QQURESU5HLCAtKGxvbmcpbiYzKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX2RpbWVfb3B0aW9uKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBzaG9ydCBvcHR5cGUsIGNvbnN0IGNoYXIgKm9wdGlvbikKK3sgc2l6ZV90IG47CisgIGNoYXIgKnMgPSBOVUxMOworICBpZiAob3B0aW9uKQorICB7IG4gPSBzdHJsZW4ob3B0aW9uKTsKKyAgICBzID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIG4gKyA1KTsKKyAgICBpZiAocykKKyAgICB7IHNbMF0gPSBvcHR5cGUgPj4gODsKKyAgICAgIHNbMV0gPSBvcHR5cGUgJiAweEZGOworICAgICAgc1syXSA9IG4gPj4gODsKKyAgICAgIHNbM10gPSBuICYgMHhGRjsKKyAgICAgIHN0cmNweShzICsgNCwgb3B0aW9uKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHM7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRkaW1laGRyKHN0cnVjdCBzb2FwICpzb2FwKQoreyB1bnNpZ25lZCBjaGFyIHRtcFsxMl07CisgIHNpemVfdCBvcHRsZW4gPSAwLCBpZGxlbiA9IDAsIHR5cGVsZW4gPSAwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlB1dCBESU1FIGhlYWRlciBpZD0nJXMnXG4iLCBzb2FwLT5kaW1lLmlkP3NvYXAtPmRpbWUuaWQ6IiIpKTsKKyAgaWYgKHNvYXAtPmRpbWUub3B0aW9ucykKKyAgICBvcHRsZW4gPSAoKCh1bnNpZ25lZCBjaGFyKXNvYXAtPmRpbWUub3B0aW9uc1syXSA8PCA4KSB8ICgodW5zaWduZWQgY2hhcilzb2FwLT5kaW1lLm9wdGlvbnNbM10pKSArIDQ7CisgIGlmIChzb2FwLT5kaW1lLmlkKQorICAgIGlkbGVuID0gc3RybGVuKHNvYXAtPmRpbWUuaWQpOworICBpZiAoc29hcC0+ZGltZS50eXBlKQorICAgIHR5cGVsZW4gPSBzdHJsZW4oc29hcC0+ZGltZS50eXBlKTsKKyAgdG1wWzBdID0gU09BUF9ESU1FX1ZFUlNJT04gfCAoc29hcC0+ZGltZS5mbGFncyAmIDB4Nyk7CisgIHRtcFsxXSA9IHNvYXAtPmRpbWUuZmxhZ3MgJiAweEYwOworICB0bXBbMl0gPSBvcHRsZW4gPj4gODsKKyAgdG1wWzNdID0gb3B0bGVuICYgMHhGRjsKKyAgdG1wWzRdID0gaWRsZW4gPj4gODsKKyAgdG1wWzVdID0gaWRsZW4gJiAweEZGOworICB0bXBbNl0gPSB0eXBlbGVuID4+IDg7CisgIHRtcFs3XSA9IHR5cGVsZW4gJiAweEZGOworICB0bXBbOF0gPSBzb2FwLT5kaW1lLnNpemUgPj4gMjQ7CisgIHRtcFs5XSA9IChzb2FwLT5kaW1lLnNpemUgPj4gMTYpICYgMHhGRjsKKyAgdG1wWzEwXSA9IChzb2FwLT5kaW1lLnNpemUgPj4gOCkgJiAweEZGOworICB0bXBbMTFdID0gc29hcC0+ZGltZS5zaXplICYgMHhGRjsKKyAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgKGNoYXIqKXRtcCwgMTIpCisgICB8fCBzb2FwX3B1dGRpbWVmaWVsZChzb2FwLCBzb2FwLT5kaW1lLm9wdGlvbnMsIG9wdGxlbikKKyAgIHx8IHNvYXBfcHV0ZGltZWZpZWxkKHNvYXAsIHNvYXAtPmRpbWUuaWQsIGlkbGVuKQorICAgfHwgc29hcF9wdXRkaW1lZmllbGQoc29hcCwgc29hcC0+ZGltZS50eXBlLCB0eXBlbGVuKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0ZGltZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIGZvciAoY29udGVudCA9IHNvYXAtPmRpbWUuZmlyc3Q7IGNvbnRlbnQ7IGNvbnRlbnQgPSBjb250ZW50LT5uZXh0KQorICB7IHZvaWQgKmhhbmRsZTsKKyAgICBzb2FwLT5kaW1lLnNpemUgPSBjb250ZW50LT5zaXplOworICAgIHNvYXAtPmRpbWUuaWQgPSBjb250ZW50LT5pZDsKKyAgICBzb2FwLT5kaW1lLnR5cGUgPSBjb250ZW50LT50eXBlOworICAgIHNvYXAtPmRpbWUub3B0aW9ucyA9IGNvbnRlbnQtPm9wdGlvbnM7CisgICAgc29hcC0+ZGltZS5mbGFncyA9IFNPQVBfRElNRV9WRVJTSU9OIHwgU09BUF9ESU1FX01FRElBOworICAgIGlmIChzb2FwLT5mZGltZXJlYWRvcGVuICYmICgoaGFuZGxlID0gc29hcC0+ZmRpbWVyZWFkb3Blbihzb2FwLCAodm9pZCopY29udGVudC0+cHRyLCBjb250ZW50LT5pZCwgY29udGVudC0+dHlwZSwgY29udGVudC0+b3B0aW9ucykpIHx8IHNvYXAtPmVycm9yKSkKKyAgICB7IHNpemVfdCBzaXplID0gY29udGVudC0+c2l6ZTsKKyAgICAgIGlmICghaGFuZGxlKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImZkaW1lcmVhZG9wZW4gZmFpbGVkXG4iKSk7CisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIH0KKyAgICAgIGlmICghY29udGVudC0+c2l6ZSAmJiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpIHx8IChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSyB8fCAoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fU1RPUkUpKQorICAgICAgeyBzaXplX3QgY2h1bmtzaXplID0gc2l6ZW9mKHNvYXAtPnRtcGJ1Zik7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ2h1bmtlZCBzdHJlYW1pbmcgRElNRVxuIikpOworICAgICAgICBkbyAKKyAgICAgICAgeyBzaXplID0gc29hcC0+ZmRpbWVyZWFkKHNvYXAsIGhhbmRsZSwgc29hcC0+dG1wYnVmLCBjaHVua3NpemUpOworICAgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZmRpbWVyZWFkIHJldHVybmVkICVsdSBieXRlc1xuIiwgKHVuc2lnbmVkIGxvbmcpc2l6ZSkpOworICAgICAgICAgIGlmIChzaXplIDwgY2h1bmtzaXplKQorIAkgIHsgc29hcC0+ZGltZS5mbGFncyAmPSB+U09BUF9ESU1FX0NGOworICAgICAgICAgICAgaWYgKCFjb250ZW50LT5uZXh0KQorICAgICAgICAgICAgICBzb2FwLT5kaW1lLmZsYWdzIHw9IFNPQVBfRElNRV9NRTsKKwkgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBzb2FwLT5kaW1lLmZsYWdzIHw9IFNPQVBfRElNRV9DRjsKKwkgIHNvYXAtPmRpbWUuc2l6ZSA9IHNpemU7CisgICAgICAgICAgaWYgKHNvYXBfcHV0ZGltZWhkcihzb2FwKQorCSAgIHx8IHNvYXBfcHV0ZGltZWZpZWxkKHNvYXAsIHNvYXAtPnRtcGJ1Ziwgc2l6ZSkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBpZiAoc29hcC0+ZGltZS5pZCkKKyAJICB7IHNvYXAtPmRpbWUuZmxhZ3MgJj0gfihTT0FQX0RJTUVfTUIgfCBTT0FQX0RJTUVfTUVESUEpOworICAgICAgICAgICAgc29hcC0+ZGltZS5pZCA9IE5VTEw7CisgICAgICAgICAgICBzb2FwLT5kaW1lLnR5cGUgPSBOVUxMOworICAgICAgICAgICAgc29hcC0+ZGltZS5vcHRpb25zID0gTlVMTDsKKyAgICAgICAgICB9ICAKKyAgICAgICAgfSB3aGlsZSAoc2l6ZSA+PSBjaHVua3NpemUpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBpZiAoIWNvbnRlbnQtPm5leHQpCisgICAgICAgICAgc29hcC0+ZGltZS5mbGFncyB8PSBTT0FQX0RJTUVfTUU7CisgICAgICAgIGlmIChzb2FwX3B1dGRpbWVoZHIoc29hcCkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBkbworICAgICAgICB7IHNpemVfdCBidWZzaXplOworCSAgaWYgKHNpemUgPCBzaXplb2Yoc29hcC0+dG1wYnVmKSkKKyAgICAgICAgICAgIGJ1ZnNpemUgPSBzaXplOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJ1ZnNpemUgPSBzaXplb2Yoc29hcC0+dG1wYnVmKTsKKyAgICAgICAgICBpZiAoIShidWZzaXplID0gc29hcC0+ZmRpbWVyZWFkKHNvYXAsIGhhbmRsZSwgc29hcC0+dG1wYnVmLCBidWZzaXplKSkpCisgICAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImZkaW1lcmVhZCBmYWlsZWQ6IGluc3VmZmljaWVudCBkYXRhICglbHUgYnl0ZXMgcmVtYWluaW5nIGZyb20gJWx1IGJ5dGVzKVxuIiwgKHVuc2lnbmVkIGxvbmcpc2l6ZSwgKHVuc2lnbmVkIGxvbmcpc29hcC0+ZGltZS5zaXplKSk7CisgICAgICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworCSAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgc29hcC0+dG1wYnVmLCBidWZzaXplKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHNpemUgLT0gYnVmc2l6ZTsKKyAgICAgICAgfSB3aGlsZSAoc2l6ZSk7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZmRpbWVyZWFkY2xvc2VcbiIpKTsKKyAgICAgICAgc29hcF9zZW5kX3Jhdyhzb2FwLCBTT0FQX1NUUl9QQURESU5HLCAtKGxvbmcpc29hcC0+ZGltZS5zaXplJjMpOworICAgICAgfQorICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJmZGltZXJlYWRjbG9zZVxuIikpOworICAgICAgaWYgKHNvYXAtPmZkaW1lcmVhZGNsb3NlKQorICAgICAgICBzb2FwLT5mZGltZXJlYWRjbG9zZShzb2FwLCBoYW5kbGUpOworICAgIH0KKyAgICBlbHNlCisgICAgeyBpZiAoIWNvbnRlbnQtPm5leHQpCisgICAgICAgIHNvYXAtPmRpbWUuZmxhZ3MgfD0gU09BUF9ESU1FX01FOworICAgICAgaWYgKHNvYXBfcHV0ZGltZWhkcihzb2FwKQorICAgICAgIHx8IHNvYXBfcHV0ZGltZWZpZWxkKHNvYXAsIChjaGFyKiljb250ZW50LT5wdHIsIGNvbnRlbnQtPnNpemUpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY2hhciAqCitzb2FwX2dldGRpbWVmaWVsZChzdHJ1Y3Qgc29hcCAqc29hcCwgc2l6ZV90IG4pCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIGNoYXIgKnM7CisgIGNoYXIgKnAgPSBOVUxMOworICBpZiAobikKKyAgeyBwID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIG4gKyAxKTsKKyAgICBpZiAocCkKKyAgICB7IHMgPSBwOworICAgICAgZm9yIChpID0gbjsgaSA+IDA7IGktLSkKKyAgICAgIHsgaWYgKChpbnQpKGMgPSBzb2FwX2dldDEoc29hcCkpID09IEVPRikKKyAgICAgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgICpzKysgPSAoY2hhciljOworICAgICAgfQorICAgICAgKnMgPSAnXDAnOworICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXBfbW92ZShzb2FwLCAtKGxvbmcpbiYzKSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICB9CisgIHJldHVybiBwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0ZGltZWhkcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICByZWdpc3RlciBjaGFyICpzOworICByZWdpc3RlciBpbnQgaTsKKyAgdW5zaWduZWQgY2hhciB0bXBbMTJdOworICBzaXplX3Qgb3B0bGVuLCBpZGxlbiwgdHlwZWxlbjsKKyAgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRElNRV9FTkQ7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR2V0IERJTUUgaGVhZGVyXG4iKSk7CisgIGlmIChzb2FwLT5kaW1lLmJ1ZmxlbiB8fCBzb2FwLT5kaW1lLmNodW5rc2l6ZSkKKyAgeyBpZiAoc29hcF9tb3ZlKHNvYXAsIChsb25nKShzb2FwLT5kaW1lLnNpemUgLSBzb2FwX3RlbGwoc29hcCkpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgIHNvYXBfdW5nZXQoc29hcCwgc29hcF9nZXRjaGFyKHNvYXApKTsgLyogc2tpcCBwYWRkaW5nIGFuZCBnZXQgaGRyICovCisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIuLi4gRnJvbSBjaHVua2VkXG4iKSk7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgcyA9IChjaGFyKil0bXA7CisgIGZvciAoaSA9IDEyOyBpID4gMDsgaS0tKQorICB7IGlmICgoaW50KShjID0gc29hcF9nZXRjaGFyKHNvYXApKSA9PSBFT0YpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAqcysrID0gKGNoYXIpYzsKKyAgfQorICBpZiAoKHRtcFswXSAmIDB4RjgpICE9IFNPQVBfRElNRV9WRVJTSU9OKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRElNRV9NSVNNQVRDSDsKKyAgc29hcC0+ZGltZS5mbGFncyA9ICh0bXBbMF0gJiAweDcpIHwgKHRtcFsxXSAmIDB4RjApOworICBvcHRsZW4gPSAodG1wWzJdIDw8IDgpIHwgdG1wWzNdOworICBpZGxlbiA9ICh0bXBbNF0gPDwgOCkgfCB0bXBbNV07CisgIHR5cGVsZW4gPSAodG1wWzZdIDw8IDgpIHwgdG1wWzddOworICBzb2FwLT5kaW1lLnNpemUgPSAodG1wWzhdIDw8IDI0KSB8ICh0bXBbOV0gPDwgMTYpIHwgKHRtcFsxMF0gPDwgOCkgfCB0bXBbMTFdOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRJTUUgc2l6ZT0lbHUgZmxhZ3M9MHglWFxuIiwgKHVuc2lnbmVkIGxvbmcpc29hcC0+ZGltZS5zaXplLCBzb2FwLT5kaW1lLmZsYWdzKSk7CisgIGlmICghKHNvYXAtPmRpbWUub3B0aW9ucyA9IHNvYXBfZ2V0ZGltZWZpZWxkKHNvYXAsIG9wdGxlbikpICYmIHNvYXAtPmVycm9yKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKCEoc29hcC0+ZGltZS5pZCA9IHNvYXBfZ2V0ZGltZWZpZWxkKHNvYXAsIGlkbGVuKSkgJiYgc29hcC0+ZXJyb3IpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoIShzb2FwLT5kaW1lLnR5cGUgPSBzb2FwX2dldGRpbWVmaWVsZChzb2FwLCB0eXBlbGVuKSkgJiYgc29hcC0+ZXJyb3IpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRJTUUgaWQ9JXMsIHR5cGU9JXMsIG9wdGlvbnM9JXNcbiIsIHNvYXAtPmRpbWUuaWQ/c29hcC0+ZGltZS5pZDoiIiwgc29hcC0+ZGltZS50eXBlP3NvYXAtPmRpbWUudHlwZToiIiwgc29hcC0+ZGltZS5vcHRpb25zP3NvYXAtPmRpbWUub3B0aW9ucys0OiIiKSk7CisgIGlmIChzb2FwLT5kaW1lLmZsYWdzICYgU09BUF9ESU1FX01FKQorICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX0RJTUU7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0ZGltZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgd2hpbGUgKHNvYXAtPmRpbWUuZmxhZ3MgJiBTT0FQX0RJTUVfQ0YpCisgIHsgaWYgKHNvYXBfZ2V0ZGltZWhkcihzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAoc29hcF9tb3ZlKHNvYXAsIHNvYXAtPmRpbWUuc2l6ZSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgfQorICBpZiAoc29hcF9tb3ZlKHNvYXAsICgoc29hcC0+ZGltZS5zaXplKzMpJih+MykpLXNvYXBfdGVsbChzb2FwKSkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIGZvciAoOzspCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICAgIGlmIChzb2FwX2dldGRpbWVoZHIoc29hcCkpCisgICAgICBicmVhazsKKyAgICBpZiAoc29hcC0+ZmRpbWV3cml0ZW9wZW4gJiYgKChzb2FwLT5kaW1lLnB0ciA9IChjaGFyKilzb2FwLT5mZGltZXdyaXRlb3Blbihzb2FwLCBzb2FwLT5kaW1lLmlkLCBzb2FwLT5kaW1lLnR5cGUsIHNvYXAtPmRpbWUub3B0aW9ucykpIHx8IHNvYXAtPmVycm9yKSkKKyAgICB7IGNvbnN0IGNoYXIgKmlkLCAqdHlwZSwgKm9wdGlvbnM7CisgICAgICBzaXplX3Qgc2l6ZSwgbjsKKyAgICAgIGlmICghc29hcC0+ZGltZS5wdHIpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIGlkID0gc29hcC0+ZGltZS5pZDsKKyAgICAgIHR5cGUgPSBzb2FwLT5kaW1lLnR5cGU7CisgICAgICBvcHRpb25zID0gc29hcC0+ZGltZS5vcHRpb25zOworICAgICAgZm9yICg7OykKKyAgICAgIHsgc2l6ZSA9IHNvYXAtPmRpbWUuc2l6ZTsKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeyBuID0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgICAgICAgIGlmIChzaXplIDwgbikKKyAgICAgICAgICAgIG4gPSBzaXplOworICAgICAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mZGltZXdyaXRlKHNvYXAsICh2b2lkKilzb2FwLT5kaW1lLnB0ciwgc29hcC0+YnVmICsgc29hcC0+YnVmaWR4LCBuKSkpCisgICAgICAgICAgICBicmVhazsKKwkgIHNpemUgLT0gbjsKKwkgIGlmICghc2l6ZSkKKwkgIHsgc29hcC0+YnVmaWR4ICs9IG47CisJICAgIGJyZWFrOworCSAgfQorCSAgaWYgKHNvYXBfcmVjdihzb2FwKSkKKyAgICAgICAgICB7IHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisJICAgIGdvdG8gZW5kOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc29hcF9tb3ZlKHNvYXAsIC0obG9uZylzb2FwLT5kaW1lLnNpemUmMykpCisgICAgICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKwkgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICghKHNvYXAtPmRpbWUuZmxhZ3MgJiBTT0FQX0RJTUVfQ0YpKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoc29hcF9nZXRkaW1laGRyKHNvYXApKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorZW5kOgorICAgICAgaWYgKHNvYXAtPmZkaW1ld3JpdGVjbG9zZSkKKyAgICAgICAgc29hcC0+ZmRpbWV3cml0ZWNsb3NlKHNvYXAsICh2b2lkKilzb2FwLT5kaW1lLnB0cik7CisgICAgICBzb2FwLT5kaW1lLnNpemUgPSAwOworICAgICAgc29hcC0+ZGltZS5pZCA9IGlkOworICAgICAgc29hcC0+ZGltZS50eXBlID0gdHlwZTsKKyAgICAgIHNvYXAtPmRpbWUub3B0aW9ucyA9IG9wdGlvbnM7CisgICAgfQorICAgIGVsc2UgaWYgKHNvYXAtPmRpbWUuZmxhZ3MgJiBTT0FQX0RJTUVfQ0YpCisgICAgeyBjb25zdCBjaGFyICppZCwgKnR5cGUsICpvcHRpb25zOworICAgICAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICAgICAgcmVnaXN0ZXIgY2hhciAqczsKKyAgICAgIHJlZ2lzdGVyIGludCBpOworICAgICAgaWQgPSBzb2FwLT5kaW1lLmlkOworICAgICAgdHlwZSA9IHNvYXAtPmRpbWUudHlwZTsKKyAgICAgIG9wdGlvbnMgPSBzb2FwLT5kaW1lLm9wdGlvbnM7CisgICAgICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgICAgIHJldHVybiBTT0FQX0VPTTsKKyAgICAgIGZvciAoOzspCisgICAgICB7IHMgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIHNvYXAtPmRpbWUuc2l6ZSk7CisgICAgICAgIGlmICghcykKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgICAgZm9yIChpID0gc29hcC0+ZGltZS5zaXplOyBpID4gMDsgaS0tKQorICAgICAgICB7IGlmICgoaW50KShjID0gc29hcF9nZXQxKHNvYXApKSA9PSBFT0YpCisgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAgICAgICAqcysrID0gKGNoYXIpYzsKKyAgICAgICAgfQorICAgICAgICBpZiAoc29hcF9tb3ZlKHNvYXAsIC0obG9uZylzb2FwLT5kaW1lLnNpemUmMykpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgICAgIGlmICghKHNvYXAtPmRpbWUuZmxhZ3MgJiBTT0FQX0RJTUVfQ0YpKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoc29hcF9nZXRkaW1laGRyKHNvYXApKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIH0KKyAgICAgIHNvYXAtPmRpbWUuc2l6ZSA9IHNvYXAtPmJsaXN0LT5zaXplKys7IC8qIGFsbG9jYXRlIG9uZSBtb3JlIGZvciAnXDAnICovCisgICAgICBpZiAoIShzb2FwLT5kaW1lLnB0ciA9IHNvYXBfc2F2ZV9ibG9jayhzb2FwLCBOVUxMLCAwKSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHNvYXAtPmRpbWUucHRyW3NvYXAtPmRpbWUuc2l6ZV0gPSAnXDAnOyAvKiBmb3JjZSAwLXRlcm1pbmF0ZWQgKi8KKyAgICAgIHNvYXAtPmRpbWUuaWQgPSBpZDsKKyAgICAgIHNvYXAtPmRpbWUudHlwZSA9IHR5cGU7CisgICAgICBzb2FwLT5kaW1lLm9wdGlvbnMgPSBvcHRpb25zOworICAgIH0KKyAgICBlbHNlCisgICAgICBzb2FwLT5kaW1lLnB0ciA9IHNvYXBfZ2V0ZGltZWZpZWxkKHNvYXAsIHNvYXAtPmRpbWUuc2l6ZSk7CisgICAgY29udGVudCA9IHNvYXBfbmV3X211bHRpcGFydChzb2FwLCAmc29hcC0+ZGltZS5maXJzdCwgJnNvYXAtPmRpbWUubGFzdCwgc29hcC0+ZGltZS5wdHIsIHNvYXAtPmRpbWUuc2l6ZSk7CisgICAgaWYgKCFjb250ZW50KQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgY29udGVudC0+aWQgPSBzb2FwLT5kaW1lLmlkOworICAgIGNvbnRlbnQtPnR5cGUgPSBzb2FwLT5kaW1lLnR5cGU7CisgICAgY29udGVudC0+b3B0aW9ucyA9IHNvYXAtPmRpbWUub3B0aW9uczsKKyAgICBzb2FwX3Jlc29sdmVfYXR0YWNobWVudChzb2FwLCBjb250ZW50KTsKKyAgICBpZiAoc29hcC0+ZXJyb3IpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfRElNRV9FTkQpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0bWltZWhkcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICBkbworICB7IGlmIChzb2FwX2dldGxpbmUoc29hcCwgc29hcC0+bXNnYnVmLCBzaXplb2Yoc29hcC0+bXNnYnVmKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgd2hpbGUgKCEqc29hcC0+bXNnYnVmKTsKKyAgaWYgKHNvYXAtPm1zZ2J1ZlswXSA9PSAnLScgJiYgc29hcC0+bXNnYnVmWzFdID09ICctJykKKyAgeyBjaGFyICpzID0gc29hcC0+bXNnYnVmICsgc3RybGVuKHNvYXAtPm1zZ2J1ZikgLSAxOworICAgIC8qIHJlbW92ZSB3aGl0ZSBzcGFjZSAqLworICAgIHdoaWxlIChzb2FwX2JsYW5rKCpzKSkKKyAgICAgIHMtLTsKKyAgICBzWzFdID0gJ1wwJzsKKyAgICBpZiAoc29hcC0+bWltZS5ib3VuZGFyeSkKKyAgICB7IGlmIChzdHJjbXAoc29hcC0+bXNnYnVmICsgMiwgc29hcC0+bWltZS5ib3VuZGFyeSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTUlNRV9FUlJPUjsKKyAgICB9CisgICAgZWxzZQorICAgICAgc29hcC0+bWltZS5ib3VuZGFyeSA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPm1zZ2J1ZiArIDIpOworICAgIGlmIChzb2FwX2dldGxpbmUoc29hcCwgc29hcC0+bXNnYnVmLCBzaXplb2Yoc29hcC0+bXNnYnVmKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHNvYXBfc2V0X21pbWVfYXR0YWNobWVudChzb2FwLCBOVUxMLCAwLCBTT0FQX01JTUVfTk9ORSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgIGNvbnRlbnQgPSBzb2FwLT5taW1lLmxhc3Q7CisgIGZvciAoOzspCisgIHsgcmVnaXN0ZXIgY2hhciAqa2V5ID0gc29hcC0+bXNnYnVmOworICAgIHJlZ2lzdGVyIGNoYXIgKnZhbDsKKyAgICBpZiAoISprZXkpCisgICAgICBicmVhazsKKyAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiTUlNRSBoZWFkZXI6ICVzXG4iLCBrZXkpKTsKKyAgICB2YWwgPSBzdHJjaHIoc29hcC0+bXNnYnVmLCAnOicpOworICAgIGlmICh2YWwpCisgICAgeyAqdmFsID0gJ1wwJzsKKyAgICAgIGRvIHZhbCsrOworICAgICAgd2hpbGUgKCp2YWwgJiYgKnZhbCA8PSAzMik7CisgICAgICBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LUlEIikpCisgICAgICAgIGNvbnRlbnQtPmlkID0gc29hcF9zdHJkdXAoc29hcCwgdmFsKTsKKyAgICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1Mb2NhdGlvbiIpKQorICAgICAgICBjb250ZW50LT5sb2NhdGlvbiA9IHNvYXBfc3RyZHVwKHNvYXAsIHZhbCk7CisgICAgICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtRGlzcG9zaXRpb24iKSkKKyAgICAgICAgY29udGVudC0+aWQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCwgIm5hbWUiKSk7CisgICAgICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtVHlwZSIpKQorICAgICAgICBjb250ZW50LT50eXBlID0gc29hcF9zdHJkdXAoc29hcCwgdmFsKTsKKyAgICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1EZXNjcmlwdGlvbiIpKQorICAgICAgICBjb250ZW50LT5kZXNjcmlwdGlvbiA9IHNvYXBfc3RyZHVwKHNvYXAsIHZhbCk7CisgICAgICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmciKSkKKyAgICAgICAgY29udGVudC0+ZW5jb2RpbmcgPSAoZW51bSBzb2FwX21pbWVfZW5jb2Rpbmcpc29hcF9pbnRfY29kZShtaW1lX2NvZGVzLCB2YWwsIChsb25nKVNPQVBfTUlNRV9OT05FKTsKKyAgICB9CisgICAgaWYgKHNvYXBfZ2V0bGluZShzb2FwLCBrZXksIHNpemVvZihzb2FwLT5tc2didWYpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldG1pbWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IDA7CisgIGlmICghc29hcC0+bWltZS5sYXN0KQorICAgIHJldHVybiBTT0FQX09LOworICBmb3IgKDs7KQorICB7IHJlZ2lzdGVyIHNpemVfdCBpLCBtID0gMDsKKyAgICByZWdpc3RlciBjaGFyICpzLCAqdCA9IE5VTEw7CisgICAgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50ID0gc29hcC0+bWltZS5sYXN0OworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUGFyc2luZyBNSU1FIGNvbnRlbnQgaWQ9JXMgdHlwZT0lc1xuIiwgY29udGVudC0+aWQ/Y29udGVudC0+aWQ6IiIsIGNvbnRlbnQtPnR5cGU/Y29udGVudC0+dHlwZToiIikpOworICAgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIGZvciAoOzspCisgICAgeyByZWdpc3RlciBzaG9ydCBmbGFnID0gMDsKKyAgICAgIGlmICghKHMgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIFNPQVBfQkxLTEVOKSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgZm9yIChpID0gMDsgaSA8IFNPQVBfQkxLTEVOOyBpKyspCisgICAgICB7IGlmIChtID4gMCkKKyAgICAgICAgeyAqcysrID0gKnQrKzsKKwkgIG0tLTsKKwl9CisJZWxzZQorICAgICAgICB7IGlmICghZmxhZykKKwkgIHsgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKwkgICAgaWYgKChpbnQpYyA9PSBFT0YpCisJICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisJICB9CisJICBpZiAoZmxhZyB8fCBjID09ICdccicpCisJICB7IHQgPSBzb2FwLT50bXBidWY7CisJICAgIG1lbXNldCh0LCAwLCBzaXplb2Yoc29hcC0+dG1wYnVmKSk7CisgICAgICAgICAgICBzdHJjcHkodCwgIlxuLS0iKTsKKyAgICAgICAgICAgIGlmIChzb2FwLT5taW1lLmJvdW5kYXJ5KQorCSAgICAgIHN0cm5jYXQodCwgc29hcC0+bWltZS5ib3VuZGFyeSwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiktNCk7CisJICAgIGRvIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisJICAgIHdoaWxlIChjID09ICp0KyspOworCSAgICBpZiAoKGludCljID09IEVPRikKKwkgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKwkgICAgaWYgKCEqLS10KQorCSAgICAgIGdvdG8gZW5kOworCSAgICAqdCA9IChjaGFyKWM7CisJICAgIGZsYWcgPSAoYyA9PSAnXHInKTsKKwkgICAgbSA9IHQgLSBzb2FwLT50bXBidWYgKyAxIC0gZmxhZzsKKwkgICAgdCA9IHNvYXAtPnRtcGJ1ZjsKKwkgICAgYyA9ICdccic7CisJICB9CisJICAqcysrID0gKGNoYXIpYzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KK2VuZDoKKyAgICAqcyA9ICdcMCc7IC8qIGZvcmNlIDAtdGVybWluYXRlZCAqLworICAgIGNvbnRlbnQtPnNpemUgPSBzb2FwX3NpemVfYmxvY2soc29hcCwgaSsxKS0xOworICAgIGNvbnRlbnQtPnB0ciA9IHNvYXBfc2F2ZV9ibG9jayhzb2FwLCBOVUxMLCAwKTsKKyAgICBzb2FwX3Jlc29sdmVfYXR0YWNobWVudChzb2FwLCBjb250ZW50KTsKKyAgICBpZiAoYyA9PSAnLScgJiYgc29hcF9nZXRjaGFyKHNvYXApID09ICctJykKKyAgICAgIGJyZWFrOworICAgIHdoaWxlIChjICE9ICdccicgJiYgKGludCljICE9IEVPRiAmJiBzb2FwX2JsYW5rKGMpKQorICAgICAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgICBpZiAoYyAhPSAnXHInIHx8IHNvYXBfZ2V0Y2hhcihzb2FwKSAhPSAnXG4nKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9NSU1FX0VSUk9SOworICAgIGlmIChzb2FwX2dldG1pbWVoZHIoc29hcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NvYXBfbWF0Y2hfY2lkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICp0KQoreyByZWdpc3RlciBzaXplX3QgbjsKKyAgaWYgKCFzKQorICAgIHJldHVybiAxOworICBpZiAoIXN0cmNtcChzLCB0KSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKCFzdHJuY21wKHMsICJjaWQ6IiwgNCkpCisgICAgcyArPSA0OworICBuID0gc3RybGVuKHQpOworICBpZiAoKnQgPT0gJzwnKQorICB7IHQrKzsKKyAgICBuIC09IDI7CisgIH0KKyAgaWYgKCFzdHJuY21wKHMsIHQsIG4pICYmICFzW25dKQorICAgIHJldHVybiAwOworICBzb2FwX2RlY29kZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCBzLCBTT0FQX1NUUl9FT1MpOworICBpZiAoIXN0cm5jbXAoc29hcC0+dG1wYnVmLCB0LCBuKSAmJiAhc29hcC0+dG1wYnVmW25dKQorICAgIHJldHVybiAwOworICByZXR1cm4gMTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQKK3NvYXBfcmVzb2x2ZV9hdHRhY2htZW50KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQpCit7IGlmIChjb250ZW50LT5pZCkKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF94bGlzdCAqKnhwID0gJnNvYXAtPnhsaXN0OworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x2aW5nIGF0dGFjaG1lbnQgZGF0YSBmb3IgaWQ9JXNcbiIsIGNvbnRlbnQtPmlkKSk7CisgICAgd2hpbGUgKCp4cCkKKyAgICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3hsaXN0ICp4cSA9ICp4cDsKKyAgICAgIGlmICghc29hcF9tYXRjaF9jaWQoc29hcCwgeHEtPmlkLCBjb250ZW50LT5pZCkpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRm91bmQgbWF0Y2hpbmcgYXR0YWNobWVudCAlcyBmb3IgY29udGVudCBpZD0lc1xuIiwgeHEtPmlkLCBjb250ZW50LT5pZCkpOworCSp4cCA9IHhxLT5uZXh0OworICAgICAgICAqeHEtPnB0ciA9ICh1bnNpZ25lZCBjaGFyKiljb250ZW50LT5wdHI7CisgICAgICAgICp4cS0+c2l6ZSA9IChpbnQpY29udGVudC0+c2l6ZTsKKyAgICAgICAgKnhxLT50eXBlID0gKGNoYXIqKWNvbnRlbnQtPnR5cGU7CisJaWYgKGNvbnRlbnQtPm9wdGlvbnMpCisgICAgICAgICAgKnhxLT5vcHRpb25zID0gKGNoYXIqKWNvbnRlbnQtPm9wdGlvbnM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAqeHEtPm9wdGlvbnMgPSAoY2hhciopY29udGVudC0+ZGVzY3JpcHRpb247CisJU09BUF9GUkVFKHNvYXAsIHhxKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeHAgPSAmKCp4cCktPm5leHQ7CisgICAgfQorICB9Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRtaW1laGRyKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQpCit7IGNvbnN0IGNoYXIgKnM7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTUlNRSBhdHRhY2htZW50IHR5cGU9JXNcbiIsIGNvbnRlbnQtPnR5cGU/Y29udGVudC0+dHlwZToiIikpOworICBpZiAoc29hcF9zZW5kMyhzb2FwLCAiXHJcbi0tIiwgc29hcC0+bWltZS5ib3VuZGFyeSwgIlxyXG4iKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmIChjb250ZW50LT50eXBlICYmIHNvYXBfc2VuZDMoc29hcCwgIkNvbnRlbnQtVHlwZTogIiwgY29udGVudC0+dHlwZSwgIlxyXG4iKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHMgPSBzb2FwX3N0cl9jb2RlKG1pbWVfY29kZXMsIGNvbnRlbnQtPmVuY29kaW5nKTsKKyAgaWYgKHMgJiYgc29hcF9zZW5kMyhzb2FwLCAiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogIiwgcywgIlxyXG4iKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmIChjb250ZW50LT5pZCAmJiBzb2FwX3NlbmQzKHNvYXAsICJDb250ZW50LUlEOiAiLCBjb250ZW50LT5pZCwgIlxyXG4iKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmIChjb250ZW50LT5sb2NhdGlvbiAmJiBzb2FwX3NlbmQzKHNvYXAsICJDb250ZW50LUxvY2F0aW9uOiAiLCBjb250ZW50LT5sb2NhdGlvbiwgIlxyXG4iKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmIChjb250ZW50LT5kZXNjcmlwdGlvbiAmJiBzb2FwX3NlbmQzKHNvYXAsICJDb250ZW50LURlc2NyaXB0aW9uOiAiLCBjb250ZW50LT5kZXNjcmlwdGlvbiwgIlxyXG4iKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsICJcclxuIiwgMik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRtaW1lKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgIGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKSB8fCAhc29hcC0+bWltZS5ib3VuZGFyeSkKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTZW5kaW5nIE1JTUUgYXR0YWNobWVudHNcbiIpKTsKKyAgZm9yIChjb250ZW50ID0gc29hcC0+bWltZS5maXJzdDsgY29udGVudDsgY29udGVudCA9IGNvbnRlbnQtPm5leHQpCisgICAgaWYgKHNvYXBfcHV0bWltZWhkcihzb2FwLCBjb250ZW50KQorICAgICB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsIGNvbnRlbnQtPnB0ciwgY29udGVudC0+c2l6ZSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX3NlbmQzKHNvYXAsICJcclxuLS0iLCBzb2FwLT5taW1lLmJvdW5kYXJ5LCAiLS0iKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfZGltZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+b21vZGUgfD0gU09BUF9FTkNfRElNRTsKKyAgc29hcC0+ZGltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGFzdCA9IE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X21pbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmJvdW5kYXJ5LCBjb25zdCBjaGFyICpzdGFydCkKK3sgc29hcC0+b21vZGUgfD0gU09BUF9FTkNfTUlNRTsKKyAgc29hcC0+bWltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuYm91bmRhcnkgPSBzb2FwX3N0cmR1cChzb2FwLCBib3VuZGFyeSk7CisgIHNvYXAtPm1pbWUuc3RhcnQgPSBzb2FwX3N0cmR1cChzb2FwLCBzdGFydCk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfY2xyX2RpbWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPm9tb2RlICY9IH5TT0FQX0VOQ19ESU1FOworICBzb2FwLT5kaW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5sYXN0ID0gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9jbHJfbWltZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+b21vZGUgJj0gflNPQVBfRU5DX01JTUU7CisgIHNvYXAtPm1pbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmxhc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gTlVMTDsKKyAgc29hcC0+bWltZS5zdGFydCA9IE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqCitzb2FwX25ld19tdWx0aXBhcnQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX211bHRpcGFydCAqKmZpcnN0LCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKipsYXN0LCBjaGFyICpwdHIsIHNpemVfdCBzaXplKQoreyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgIGNvbnRlbnQgPSAoc3RydWN0IHNvYXBfbXVsdGlwYXJ0Kilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfbXVsdGlwYXJ0KSk7CisgIGlmIChjb250ZW50KQorICB7IGNvbnRlbnQtPm5leHQgPSBOVUxMOworICAgIGNvbnRlbnQtPnB0ciA9IHB0cjsKKyAgICBjb250ZW50LT5zaXplID0gc2l6ZTsKKyAgICBjb250ZW50LT5pZCA9IE5VTEw7CisgICAgY29udGVudC0+dHlwZSA9IE5VTEw7CisgICAgY29udGVudC0+b3B0aW9ucyA9IE5VTEw7CisgICAgY29udGVudC0+ZW5jb2RpbmcgPSBTT0FQX01JTUVfTk9ORTsKKyAgICBjb250ZW50LT5sb2NhdGlvbiA9IE5VTEw7CisgICAgY29udGVudC0+ZGVzY3JpcHRpb24gPSBOVUxMOworICAgIGlmICghKmZpcnN0KQorICAgICAgKmZpcnN0ID0gY29udGVudDsKKyAgICBpZiAoKmxhc3QpCisgICAgICAoKmxhc3QpLT5uZXh0ID0gY29udGVudDsKKyAgICAqbGFzdCA9IGNvbnRlbnQ7CisgIH0KKyAgcmV0dXJuIGNvbnRlbnQ7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZXRfZGltZV9hdHRhY2htZW50KHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpwdHIsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICppZCwgdW5zaWduZWQgc2hvcnQgb3B0eXBlLCBjb25zdCBjaGFyICpvcHRpb24pCit7IHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudCA9IHNvYXBfbmV3X211bHRpcGFydChzb2FwLCAmc29hcC0+ZGltZS5maXJzdCwgJnNvYXAtPmRpbWUubGFzdCwgcHRyLCBzaXplKTsKKyAgaWYgKCFjb250ZW50KQorICAgIHJldHVybiBTT0FQX0VPTTsKKyAgY29udGVudC0+aWQgPSBzb2FwX3N0cmR1cChzb2FwLCBpZCk7CisgIGNvbnRlbnQtPnR5cGUgPSBzb2FwX3N0cmR1cChzb2FwLCB0eXBlKTsKKyAgY29udGVudC0+b3B0aW9ucyA9IHNvYXBfZGltZV9vcHRpb24oc29hcCwgb3B0eXBlLCBvcHRpb24pOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NldF9taW1lX2F0dGFjaG1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnB0ciwgc2l6ZV90IHNpemUsIGVudW0gc29hcF9taW1lX2VuY29kaW5nIGVuY29kaW5nLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqbG9jYXRpb24sIGNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uKQoreyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQgPSBzb2FwX25ld19tdWx0aXBhcnQoc29hcCwgJnNvYXAtPm1pbWUuZmlyc3QsICZzb2FwLT5taW1lLmxhc3QsIHB0ciwgc2l6ZSk7CisgIGlmICghY29udGVudCkKKyAgICByZXR1cm4gU09BUF9FT007CisgIGNvbnRlbnQtPmlkID0gc29hcF9zdHJkdXAoc29hcCwgaWQpOworICBjb250ZW50LT50eXBlID0gc29hcF9zdHJkdXAoc29hcCwgdHlwZSk7CisgIGNvbnRlbnQtPmVuY29kaW5nID0gZW5jb2Rpbmc7CisgIGNvbnRlbnQtPmxvY2F0aW9uID0gc29hcF9zdHJkdXAoc29hcCwgbG9jYXRpb24pOworICBjb250ZW50LT5kZXNjcmlwdGlvbiA9IHNvYXBfc3RyZHVwKHNvYXAsIGRlc2NyaXB0aW9uKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwX211bHRpcGFydCoKK1NPQVBfRk1BQzIKK3NvYXBfbmV4dF9tdWx0aXBhcnQoc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50KQoreyBpZiAoY29udGVudCkKKyAgICByZXR1cm4gY29udGVudC0+bmV4dDsKKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyB2b2lkCitzb2FwX3NlbGVjdF9taW1lX2JvdW5kYXJ5KHN0cnVjdCBzb2FwICpzb2FwKQoreyB3aGlsZSAoIXNvYXAtPm1pbWUuYm91bmRhcnkgfHwgc29hcF92YWxpZF9taW1lX2JvdW5kYXJ5KHNvYXApKQorICB7IHJlZ2lzdGVyIGNoYXIgKnMgPSBzb2FwLT5taW1lLmJvdW5kYXJ5OworICAgIHJlZ2lzdGVyIHNpemVfdCBuID0gMDsKKyAgICBpZiAocykKKyAgICAgIG4gPSBzdHJsZW4ocyk7CisgICAgaWYgKG4gPCAxNikKKyAgICB7IG4gPSA2NDsKKyAgICAgIHMgPSBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIG4gKyAxKTsKKyAgICAgIGlmICghcykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdHJjcHkocywgIj09Iik7CisgICAgcyArPSAyOworICAgIG4gLT0gNDsKKyAgICB3aGlsZSAobikKKyAgICB7ICpzKysgPSBzb2FwX2Jhc2U2NG9bc29hcF9yYW5kb20gJiAweDNGXTsKKyAgICAgIG4tLTsKKyAgICB9CisgICAgc3RyY3B5KHMsICI9PSIpOworICB9CisgIGlmICghc29hcC0+bWltZS5zdGFydCkKKyAgICBzb2FwLT5taW1lLnN0YXJ0ID0gIjxTT0FQLUVOVjpFbnZlbG9wZT4iOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzb2FwX3ZhbGlkX21pbWVfYm91bmRhcnkoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgcmVnaXN0ZXIgc2l6ZV90IGsgPSBzdHJsZW4oc29hcC0+bWltZS5ib3VuZGFyeSk7CisgIGZvciAoY29udGVudCA9IHNvYXAtPm1pbWUuZmlyc3Q7IGNvbnRlbnQ7IGNvbnRlbnQgPSBjb250ZW50LT5uZXh0KQorICB7IGlmIChjb250ZW50LT5wdHIgJiYgY29udGVudC0+c2l6ZSA+PSBrKQorICAgIHsgcmVnaXN0ZXIgY29uc3QgY2hhciAqcCA9IChjb25zdCBjaGFyKiljb250ZW50LT5wdHI7IAorICAgICAgcmVnaXN0ZXIgc2l6ZV90IGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgY29udGVudC0+c2l6ZSAtIGs7IGkrKywgcCsrKQorICAgICAgICBpZiAoIXN0cm5jbXAocCwgc29hcC0+bWltZS5ib3VuZGFyeSwgaykpCisgICAgICAgICAgcmV0dXJuIFNPQVBfRVJSOworICAgIH0KKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJSFRUUCBjb29raWUgaGFuZGxpbmcKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgV0lUSF9DT09LSUVTCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQorc2l6ZV90CitTT0FQX0ZNQUMyCitzb2FwX2VuY29kZV9jb29raWUoY29uc3QgY2hhciAqcywgY2hhciAqdCwgc2l6ZV90IGxlbikKK3sgcmVnaXN0ZXIgaW50IGM7CisgIHJlZ2lzdGVyIHNpemVfdCBuID0gbGVuOworICB3aGlsZSAoKGMgPSAqcysrKSAmJiAtLW4gPiAwKQorICB7IGlmIChjID4gJyAnICYmIGMgPCAxMjggJiYgIXN0cmNocigiKCk8PkAsOzpcXFwiL1tdPz17fSIsIGMpKQorICAgICAgKnQrKyA9IGM7CisgICAgZWxzZSBpZiAobiA+IDIpCisgICAgeyAqdCsrID0gJyUnOworICAgICAgKnQrKyA9IChjID4+IDQpICsgKGMgPiAxNTkgPyAnNycgOiAnMCcpOworICAgICAgYyAmPSAweEY7CisgICAgICAqdCsrID0gYyArIChjID4gOSA/ICc3JyA6ICcwJyk7CisgICAgICBuIC09IDI7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGJyZWFrOworICB9CisgICp0ID0gJ1wwJzsKKyAgcmV0dXJuIGxlbiAtIG47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcF9jb29raWUqCitTT0FQX0ZNQUMyCitzb2FwX2Nvb2tpZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIHNpemVfdCBuOworICBpZiAoIWRvbWFpbikKKyAgICBkb21haW4gPSBzb2FwLT5jb29raWVfZG9tYWluOworICBpZiAoIXBhdGgpCisgICAgcGF0aCA9IHNvYXAtPmNvb2tpZV9wYXRoOworICBpZiAoKnBhdGggPT0gJy8nKQorICAgIHBhdGgrKzsKKyAgbiA9IHN0cmxlbihwYXRoKTsKKyAgZm9yIChwID0gc29hcC0+Y29va2llczsgcDsgcCA9IHAtPm5leHQpCisgICAgaWYgKCFzdHJjbXAocC0+bmFtZSwgbmFtZSkKKyAgICAgJiYgZG9tYWluCisgICAgICYmIHAtPmRvbWFpbgorICAgICAmJiAhc3RyY21wKHAtPmRvbWFpbiwgZG9tYWluKQorICAgICAmJiAhc3RybmNtcChwLT5wYXRoLCBwYXRoLCBuKSkKKyAgICAgIGJyZWFrOworICByZXR1cm4gcDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwX2Nvb2tpZSoKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2Nvb2tpZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICoqcCwgKnE7CisgIGludCBuOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNldCBjb29raWU6ICVzPSVzIGRvbWFpbj0lcyBwYXRoPSVzXG4iLCBuYW1lLCB2YWx1ZT92YWx1ZToiIiwgZG9tYWluP2RvbWFpbjoiIiwgcGF0aD9wYXRoOiIiKSk7CisgIGlmICghZG9tYWluKQorICAgIGRvbWFpbiA9IHNvYXAtPmNvb2tpZV9kb21haW47CisgIGlmICghcGF0aCkKKyAgICBwYXRoID0gc29hcC0+Y29va2llX3BhdGg7CisgIGlmICghcGF0aCkKKyAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiQ29va2llIHBhdGggbm90IHNldCIsIE5VTEwsIFNPQVBfSFRUUF9FUlJPUik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKCpwYXRoID09ICcvJykKKyAgICBwYXRoKys7CisgIHEgPSBzb2FwX2Nvb2tpZShzb2FwLCBuYW1lLCBkb21haW4sIHBhdGgpOworICBpZiAoIXEpCisgIHsgaWYgKChxID0gKHN0cnVjdCBzb2FwX2Nvb2tpZSopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2Nvb2tpZSkpKSkKKyAgICB7IGlmICgocS0+bmFtZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4obmFtZSkrMSkpKQorICAgICAgICBzdHJjcHkocS0+bmFtZSwgbmFtZSk7CisgICAgICBxLT52YWx1ZSA9IE5VTEw7CisgICAgICBxLT5kb21haW4gPSBOVUxMOworICAgICAgcS0+cGF0aCA9IE5VTEw7CisgICAgICBxLT5leHBpcmUgPSAtMTsKKyAgICAgIHEtPnZlcnNpb24gPSAwOworICAgICAgcS0+c2VjdXJlID0gMDsKKyAgICAgIHEtPm1vZGlmaWVkID0gMDsKKyAgICAgIGZvciAocCA9ICZzb2FwLT5jb29raWVzLCBuID0gc29hcC0+Y29va2llX21heDsgKnAgJiYgbjsgcCA9ICYoKnApLT5uZXh0LCBuLS0pCisgICAgICAgIGlmICghc3RyY21wKCgqcCktPm5hbWUsIG5hbWUpICYmICgqcCktPnBhdGggJiYgc3RyY21wKCgqcCktPnBhdGgsIHBhdGgpIDwgMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgIGlmIChuKQorICAgICAgeyBxLT5uZXh0ID0gKnA7CisgICAgICAgICpwID0gcTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgU09BUF9GUkVFKHNvYXAsIHEtPm5hbWUpOworICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcSk7CisgICAgICAgIHEgPSBOVUxMOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgICAgcS0+bW9kaWZpZWQgPSAxOworICBpZiAocSkKKyAgeyBpZiAocS0+dmFsdWUpCisgICAgeyBTT0FQX0ZSRUUoc29hcCwgcS0+dmFsdWUpOworICAgICAgcS0+dmFsdWUgPSBOVUxMOworICAgIH0KKyAgICBpZiAocS0+ZG9tYWluKQorICAgIHsgU09BUF9GUkVFKHNvYXAsIHEtPmRvbWFpbik7CisgICAgICBxLT5kb21haW4gPSBOVUxMOworICAgIH0KKyAgICBpZiAocS0+cGF0aCkKKyAgICB7IFNPQVBfRlJFRShzb2FwLCBxLT5wYXRoKTsKKyAgICAgIHEtPnBhdGggPSBOVUxMOworICAgIH0KKyAgICBpZiAodmFsdWUgJiYgKnZhbHVlICYmIChxLT52YWx1ZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4odmFsdWUpKzEpKSkKKyAgICAgIHN0cmNweShxLT52YWx1ZSwgdmFsdWUpOworICAgIGlmIChkb21haW4gJiYgKmRvbWFpbiAmJiAocS0+ZG9tYWluID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihkb21haW4pKzEpKSkKKyAgICAgIHN0cmNweShxLT5kb21haW4sIGRvbWFpbik7CisgICAgaWYgKHBhdGggJiYgKnBhdGggJiYgKHEtPnBhdGggPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHBhdGgpKzEpKSkKKyAgICAgIHN0cmNweShxLT5wYXRoLCBwYXRoKTsKKyAgICBxLT5zZXNzaW9uID0gMTsKKyAgICBxLT5lbnYgPSAwOworICB9CisgIHJldHVybiBxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9jbHJfY29va2llKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqKnAsICpxOworICBpZiAoIWRvbWFpbikKKyAgICBkb21haW4gPSBzb2FwLT5jb29raWVfZG9tYWluOworICBpZiAoIWRvbWFpbikKKyAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiQ29va2llIGRvbWFpbiBub3Qgc2V0IiwgTlVMTCwgU09BUF9IVFRQX0VSUk9SKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFwYXRoKQorICAgIHBhdGggPSBzb2FwLT5jb29raWVfcGF0aDsKKyAgaWYgKCFwYXRoKQorICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJDb29raWUgcGF0aCBub3Qgc2V0IiwgTlVMTCwgU09BUF9IVFRQX0VSUk9SKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCpwYXRoID09ICcvJykKKyAgICBwYXRoKys7CisgIGZvciAocCA9ICZzb2FwLT5jb29raWVzLCBxID0gKnA7IHE7IHEgPSAqcCkKKyAgICBpZiAoIXN0cmNtcChxLT5uYW1lLCBuYW1lKSAmJiAhc3RyY21wKHEtPmRvbWFpbiwgZG9tYWluKSAmJiAhc3RybmNtcChxLT5wYXRoLCBwYXRoLCBzdHJsZW4ocS0+cGF0aCkpKQorICAgIHsgaWYgKHEtPnZhbHVlKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcS0+dmFsdWUpOworICAgICAgaWYgKHEtPmRvbWFpbikKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHEtPmRvbWFpbik7CisgICAgICBpZiAocS0+cGF0aCkKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHEtPnBhdGgpOworICAgICAgKnAgPSBxLT5uZXh0OworICAgICAgU09BUF9GUkVFKHNvYXAsIHEpOworICAgIH0KKyAgICBlbHNlCisgICAgICBwID0gJnEtPm5leHQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfY29va2llX3ZhbHVlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgaWYgKChwID0gc29hcF9jb29raWUoc29hcCwgbmFtZSwgZG9tYWluLCBwYXRoKSkpCisgICAgcmV0dXJuIHAtPnZhbHVlOworICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9lbnZfY29va2llX3ZhbHVlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgaWYgKChwID0gc29hcF9jb29raWUoc29hcCwgbmFtZSwgZG9tYWluLCBwYXRoKSkgJiYgcC0+ZW52KQorICAgIHJldHVybiBwLT52YWx1ZTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitsb25nCitTT0FQX0ZNQUMyCitzb2FwX2Nvb2tpZV9leHBpcmUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBpZiAoKHAgPSBzb2FwX2Nvb2tpZShzb2FwLCBuYW1lLCBkb21haW4sIHBhdGgpKSkKKyAgICByZXR1cm4gcC0+ZXhwaXJlOworICByZXR1cm4gLTE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2Nvb2tpZV9leHBpcmUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGxvbmcgZXhwaXJlLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgaWYgKChwID0gc29hcF9jb29raWUoc29hcCwgbmFtZSwgZG9tYWluLCBwYXRoKSkpCisgIHsgcC0+ZXhwaXJlID0gZXhwaXJlOworICAgIHAtPm1vZGlmaWVkID0gMTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICByZXR1cm4gU09BUF9FUlI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2Nvb2tpZV9zZXNzaW9uKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgaWYgKChwID0gc29hcF9jb29raWUoc29hcCwgbmFtZSwgZG9tYWluLCBwYXRoKSkpCisgIHsgcC0+c2Vzc2lvbiA9IDE7CisgICAgcC0+bW9kaWZpZWQgPSAxOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIHJldHVybiBTT0FQX0VSUjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9jbHJfY29va2llX3Nlc3Npb24oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBpZiAoKHAgPSBzb2FwX2Nvb2tpZShzb2FwLCBuYW1lLCBkb21haW4sIHBhdGgpKSkKKyAgeyBwLT5zZXNzaW9uID0gMDsKKyAgICBwLT5tb2RpZmllZCA9IDE7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgcmV0dXJuIFNPQVBfRVJSOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dHNldGNvb2tpZXMoc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgY2hhciAqcywgdG1wWzQwOTZdOworICBjb25zdCBjaGFyICp0OworICBmb3IgKHAgPSBzb2FwLT5jb29raWVzOyBwOyBwID0gcC0+bmV4dCkKKyAgeyBpZiAocC0+bW9kaWZpZWQgfHwgIXAtPmVudikKKyAgICB7IHMgPSB0bXA7CisgICAgICBpZiAocC0+bmFtZSkKKyAgICAgICAgcyArPSBzb2FwX2VuY29kZV9jb29raWUocC0+bmFtZSwgcywgdG1wLXMrNDA2NCk7CisgICAgICBpZiAocC0+dmFsdWUgJiYgKnAtPnZhbHVlKQorICAgICAgeyAqcysrID0gJz0nOworICAgICAgICBzICs9IHNvYXBfZW5jb2RlX2Nvb2tpZShwLT52YWx1ZSwgcywgdG1wLXMrNDA2NCk7CisgICAgICB9CisgICAgICBpZiAocC0+ZG9tYWluICYmIChpbnQpc3RybGVuKHAtPmRvbWFpbikgPCB0bXAtcys0MDY0KQorICAgICAgICBzcHJpbnRmKHMsICI7RG9tYWluPVwiJXNcIiIsIHAtPmRvbWFpbik7CisgICAgICBlbHNlIGlmIChzb2FwLT5jb29raWVfZG9tYWluICYmIChpbnQpc3RybGVuKHNvYXAtPmNvb2tpZV9kb21haW4pIDwgdG1wLXMrNDA2NCkKKyAgICAgICAgc3ByaW50ZihzLCAiO0RvbWFpbj1cIiVzXCIiLCBzb2FwLT5jb29raWVfZG9tYWluKTsKKyAgICAgIHN0cmNhdChzLCAiO1BhdGg9XCIvIik7CisgICAgICBpZiAocC0+cGF0aCkKKyAgICAgICAgdCA9IHAtPnBhdGg7CisgICAgICBlbHNlCisgICAgICAgIHQgPSBzb2FwLT5jb29raWVfcGF0aDsKKyAgICAgIGlmICh0KQorICAgICAgeyBpZiAoKnQgPT0gJy8nKQorICAgICAgICAgIHQrKzsKKyAgICAgICAgaWYgKChpbnQpc3RybGVuKHQpIDwgdG1wLXMrNDA2NCkKKyAgICAgICAgICBzdHJjYXQocywgdCk7CisgICAgICB9CisgICAgICBzICs9IHN0cmxlbihzKTsKKyAgICAgICpzKysgPSAnIic7CisgICAgICBpZiAocC0+dmVyc2lvbiA+IDApCisgICAgICAgIHNwcmludGYocywgIjtWZXJzaW9uPSV1IiwgcC0+dmVyc2lvbik7CisgICAgICBpZiAocC0+ZXhwaXJlID49IDApCisgICAgICAgIHNwcmludGYocywgIjtNYXgtQWdlPSVsZCIsIHAtPmV4cGlyZSk7CisgICAgICBpZiAocC0+c2VjdXJlKQorICAgICAgICBzdHJjYXQocywgIjtTZWN1cmUiKTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2V0LUNvb2tpZTogJXNcbiIsIHRtcCkpOworICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJTZXQtQ29va2llIiwgdG1wKSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0Y29va2llcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoLCBpbnQgc2VjdXJlKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKipwLCAqcTsKKyAgdW5zaWduZWQgaW50IHZlcnNpb24gPSAwOworICB0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKKyAgY2hhciAqcywgdG1wWzQwOTZdOworICBwID0gJnNvYXAtPmNvb2tpZXM7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2VuZGluZyBjb29raWVzIGZvciBkb21haW49JXMgcGF0aD0lc1xuIiwgZG9tYWluLCBwYXRoKSk7CisgIGlmICgqcGF0aCA9PSAnLycpCisgICAgcGF0aCsrOworICB3aGlsZSAoKHEgPSAqcCkpCisgIHsgaWYgKHEtPmV4cGlyZSAmJiBub3cgPiBxLT5leHBpcmUpCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvb2tpZSAlcyBleHBpcmVkXG4iLCBxLT5uYW1lKSk7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgcS0+bmFtZSk7CisgICAgICBpZiAocS0+dmFsdWUpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBxLT52YWx1ZSk7CisgICAgICBpZiAocS0+ZG9tYWluKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcS0+ZG9tYWluKTsKKyAgICAgIGlmIChxLT5wYXRoKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcS0+cGF0aCk7CisgICAgICAqcCA9IHEtPm5leHQ7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgcSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IHNpemVfdCBkb21sZW4gPSAwOworICAgICAgaWYgKHEtPmRvbWFpbikKKyAgICAgIHsgY29uc3QgY2hhciAqcyA9IHN0cmNocihxLT5kb21haW4sICc6Jyk7CisgICAgICAgIGlmIChzKQorCSAgZG9tbGVuID0gcyAtIHEtPmRvbWFpbjsKKwllbHNlCisgICAgICAgICAgZG9tbGVuID0gc3RybGVuKHEtPmRvbWFpbik7CisgICAgICB9CisgICAgICBpZiAoKCFxLT5kb21haW4gfHwgIXN0cm5jbXAocS0+ZG9tYWluLCBkb21haW4sIGRvbWxlbikpCisgICAgICAgICAgJiYgKCFxLT5wYXRoIHx8ICFzdHJuY21wKHEtPnBhdGgsIHBhdGgsIHN0cmxlbihxLT5wYXRoKSkpCisgICAgICAgICAgJiYgKCFxLT5zZWN1cmUgfHwgc2VjdXJlKSkKKyAgICAgIHsgcyA9IHRtcDsKKyAgICAgICAgaWYgKHEtPnZlcnNpb24gIT0gdmVyc2lvbikKKyAgICAgICAgeyBzcHJpbnRmKHMsICIkVmVyc2lvbj0ldTsiLCBxLT52ZXJzaW9uKTsKKyAgICAgICAgICB2ZXJzaW9uID0gcS0+dmVyc2lvbjsKKyAgICAgICAgfQorICAgICAgICBpZiAocS0+bmFtZSkKKyAgICAgICAgICBzICs9IHNvYXBfZW5jb2RlX2Nvb2tpZShxLT5uYW1lLCBzLCB0bXAtcys0MDgwKTsKKyAgICAgICAgaWYgKHEtPnZhbHVlICYmICpxLT52YWx1ZSkKKyAgICAgICAgeyAqcysrID0gJz0nOworICAgICAgICAgIHMgKz0gc29hcF9lbmNvZGVfY29va2llKHEtPnZhbHVlLCBzLCB0bXAtcys0MDgwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocS0+cGF0aCAmJiAoaW50KXN0cmxlbihxLT5wYXRoKSA8IHRtcC1zKzQwODApCisgICAgICAgIHsgc3ByaW50ZihzLCAiOyRQYXRoPVwiLyVzXCIiLCAoKnEtPnBhdGggPT0gJy8nID8gcS0+cGF0aCArIDEgOiBxLT5wYXRoKSk7CisgICAgICAgICAgcyArPSBzdHJsZW4ocyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHEtPmRvbWFpbiAmJiAoaW50KXN0cmxlbihxLT5kb21haW4pIDwgdG1wLXMrNDA4MCkKKyAgICAgICAgICBzcHJpbnRmKHMsICI7JERvbWFpbj1cIiVzXCIiLCBxLT5kb21haW4pOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvb2tpZTogJXNcbiIsIHRtcCkpOworICAgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkNvb2tpZSIsIHRtcCkpKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIH0KKyAgICAgIHAgPSAmcS0+bmV4dDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2dldGNvb2tpZXMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnZhbCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwID0gTlVMTCwgKnE7CisgIGNvbnN0IGNoYXIgKnM7CisgIGNoYXIgKnQsIHRtcFs0MDk2XTsgLyogY29va2llIHNpemUgaXMgdXAgdG8gNDA5NiBieXRlcyBbUkZDMjEwOV0gKi8KKyAgY2hhciAqZG9tYWluID0gTlVMTDsKKyAgY2hhciAqcGF0aCA9IE5VTEw7CisgIHVuc2lnbmVkIGludCB2ZXJzaW9uID0gMDsKKyAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CisgIGlmICghdmFsKQorICAgIHJldHVybjsKKyAgcyA9IHZhbDsKKyAgd2hpbGUgKCpzKQorICB7IHMgPSBzb2FwX2RlY29kZV9rZXkodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgaWYgKCFzb2FwX3RhZ19jbXAodG1wLCAiJFZlcnNpb24iKSkKKyAgICB7IGlmICgocyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKSkpCisgICAgICB7IGlmIChwKQorICAgICAgICAgIHAtPnZlcnNpb24gPSAoaW50KWF0b2wodG1wKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHZlcnNpb24gPSAoaW50KWF0b2wodG1wKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcCh0bXAsICIkUGF0aCIpKQorICAgIHsgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgIGlmICgqdG1wKQorICAgICAgeyBpZiAoKHQgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHRtcCkrMSkpKQorICAgICAgICAgIHN0cmNweSh0LCB0bXApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB0ID0gTlVMTDsKKyAgICAgIGlmIChwKQorICAgICAgeyBpZiAocC0+cGF0aCkKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+cGF0aCk7CisgICAgICAgIHAtPnBhdGggPSB0OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBpZiAocGF0aCkKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcGF0aCk7CisgICAgICAgIHBhdGggPSB0OworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHRtcCwgIiREb21haW4iKSkKKyAgICB7IHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICBpZiAoKnRtcCkKKyAgICAgIHsgaWYgKCh0ID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbih0bXApKzEpKSkKKyAgICAgICAgICBzdHJjcHkodCwgdG1wKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgdCA9IE5VTEw7CisgICAgICBpZiAocCkKKyAgICAgIHsgaWYgKHAtPmRvbWFpbikKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+ZG9tYWluKTsKKwlwLT5kb21haW4gPSB0OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBpZiAoZG9tYWluKQorICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCBkb21haW4pOworICAgICAgICBkb21haW4gPSB0OworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChwICYmICFzb2FwX3RhZ19jbXAodG1wLCAiUGF0aCIpKQorICAgIHsgaWYgKHAtPnBhdGgpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5wYXRoKTsKKyAgICAgIHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICBpZiAoKnRtcCkKKyAgICAgIHsgaWYgKChwLT5wYXRoID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbih0bXApKzEpKSkKKyAgICAgICAgICBzdHJjcHkocC0+cGF0aCwgdG1wKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcC0+cGF0aCA9IE5VTEw7CisgICAgfQorICAgIGVsc2UgaWYgKHAgJiYgIXNvYXBfdGFnX2NtcCh0bXAsICJEb21haW4iKSkKKyAgICB7IGlmIChwLT5kb21haW4pCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5kb21haW4pOworICAgICAgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgIGlmICgqdG1wKQorICAgICAgeyBpZiAoKHAtPmRvbWFpbiA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4odG1wKSsxKSkpCisgICAgICAgICAgc3RyY3B5KHAtPmRvbWFpbiwgdG1wKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcC0+ZG9tYWluID0gTlVMTDsKKyAgICB9CisgICAgZWxzZSBpZiAocCAmJiAhc29hcF90YWdfY21wKHRtcCwgIlZlcnNpb24iKSkKKyAgICB7IHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICBwLT52ZXJzaW9uID0gKHVuc2lnbmVkIGludClhdG9sKHRtcCk7CisgICAgfQorICAgIGVsc2UgaWYgKHAgJiYgIXNvYXBfdGFnX2NtcCh0bXAsICJNYXgtQWdlIikpCisgICAgeyBzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgICAgcC0+ZXhwaXJlID0gbm93ICsgYXRvbCh0bXApOworICAgIH0KKyAgICBlbHNlIGlmIChwICYmICFzb2FwX3RhZ19jbXAodG1wLCAiRXhwaXJlcyIpKQorICAgIHsgc3RydWN0IHRtIFQ7CisgICAgICBjaGFyIGFbM107IAorICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbW5zW10gPSAiYW5lYmFycHJheXVudWx1Z2VwY3RvdmVjIjsKKyAgICAgIHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICBpZiAoc3RybGVuKHRtcCkgPiAyMCkKKyAgICAgIHsgbWVtc2V0KCh2b2lkKikmVCwgMCwgc2l6ZW9mKFQpKTsKKyAgICAgICAgYVswXSA9IHRtcFs0XTsKKyAgICAgICAgYVsxXSA9IHRtcFs1XTsKKyAgICAgICAgYVsyXSA9ICdcMCc7CisgICAgICAgIFQudG1fbWRheSA9IChpbnQpYXRvbChhKTsKKyAgICAgICAgYVswXSA9IHRtcFs4XTsKKyAgICAgICAgYVsxXSA9IHRtcFs5XTsKKyAgICAgICAgVC50bV9tb24gPSAoc3Ryc3RyKG1ucywgYSkgLSBtbnMpIC8gMjsKKyAgICAgICAgYVswXSA9IHRtcFsxMV07CisgICAgICAgIGFbMV0gPSB0bXBbMTJdOworICAgICAgICBULnRtX3llYXIgPSAxMDAgKyAoaW50KWF0b2woYSk7CisgICAgICAgIGFbMF0gPSB0bXBbMTNdOworICAgICAgICBhWzFdID0gdG1wWzE0XTsKKyAgICAgICAgVC50bV9ob3VyID0gKGludClhdG9sKGEpOworICAgICAgICBhWzBdID0gdG1wWzE2XTsKKyAgICAgICAgYVsxXSA9IHRtcFsxN107CisgICAgICAgIFQudG1fbWluID0gKGludClhdG9sKGEpOworICAgICAgICBhWzBdID0gdG1wWzE5XTsKKyAgICAgICAgYVsxXSA9IHRtcFsyMF07CisgICAgICAgIFQudG1fc2VjID0gKGludClhdG9sKGEpOworICAgICAgICBwLT5leHBpcmUgPSBzb2FwX3RpbWVnbSgmVCk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHAgJiYgIXNvYXBfdGFnX2NtcCh0bXAsICJTZWN1cmUiKSkKKyAgICAgIHAtPnNlY3VyZSA9IDE7CisgICAgZWxzZQorICAgIHsgaWYgKHApCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR290IGVudmlyb25tZW50IGNvb2tpZSAlcz0lcyBkb21haW49JXMgcGF0aD0lcyBleHBpcmU9JWxkIHNlY3VyZT0lZFxuIiwgcC0+bmFtZSwgcC0+dmFsdWU/cC0+dmFsdWU6IiIsIHAtPmRvbWFpbj9wLT5kb21haW46IiIsIHAtPnBhdGg/cC0+cGF0aDoiIiwgcC0+ZXhwaXJlLCBwLT5zZWN1cmUpKTsKKyAgICAgICAgaWYgKChxID0gc29hcF9zZXRfY29va2llKHNvYXAsIHAtPm5hbWUsIHAtPnZhbHVlLCBwLT5kb21haW4sIHAtPnBhdGgpKSkKKyAgICAgICAgeyBxLT52ZXJzaW9uID0gcC0+dmVyc2lvbjsKKyAgICAgICAgICBxLT5leHBpcmUgPSBwLT5leHBpcmU7CisgICAgICAgICAgcS0+c2VjdXJlID0gcC0+c2VjdXJlOworICAgICAgICAgIHEtPmVudiA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHAtPm5hbWUpCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPm5hbWUpOworICAgICAgICBpZiAocC0+dmFsdWUpCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnZhbHVlKTsKKyAgICAgICAgaWYgKHAtPmRvbWFpbikKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+ZG9tYWluKTsKKyAgICAgICAgaWYgKHAtPnBhdGgpCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnBhdGgpOworICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcCk7CisgICAgICB9CisgICAgICBpZiAoKHAgPSAoc3RydWN0IHNvYXBfY29va2llKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfY29va2llKSkpKQorICAgICAgeyBwLT5uYW1lID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbih0bXApKzEpOworICAgICAgICBzdHJjcHkocC0+bmFtZSwgdG1wKTsKKyAgICAgICAgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgICAgaWYgKCp0bXApCisgICAgICAgIHsgcC0+dmFsdWUgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHRtcCkrMSk7CisgICAgICAgICAgc3RyY3B5KHAtPnZhbHVlLCB0bXApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwLT52YWx1ZSA9IE5VTEw7CisgICAgICAgIHAtPmRvbWFpbiA9IGRvbWFpbjsKKyAgICAgICAgcC0+cGF0aCA9IHBhdGg7CisgICAgICAgIHAtPmV4cGlyZSA9IDA7CisgICAgICAgIHAtPnNlY3VyZSA9IDA7CisgICAgICAgIHAtPnZlcnNpb24gPSB2ZXJzaW9uOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAocCkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdvdCBlbnZpcm9ubWVudCBjb29raWUgJXM9JXMgZG9tYWluPSVzIHBhdGg9JXMgZXhwaXJlPSVsZCBzZWN1cmU9JWRcbiIsIHAtPm5hbWUsIHAtPnZhbHVlP3AtPnZhbHVlOiIiLCBwLT5kb21haW4/cC0+ZG9tYWluOiIiLCBwLT5wYXRoP3AtPnBhdGg6IiIsIHAtPmV4cGlyZSwgcC0+c2VjdXJlKSk7CisgICAgaWYgKChxID0gc29hcF9zZXRfY29va2llKHNvYXAsIHAtPm5hbWUsIHAtPnZhbHVlLCBwLT5kb21haW4sIHAtPnBhdGgpKSkKKyAgICB7IHEtPnZlcnNpb24gPSBwLT52ZXJzaW9uOworICAgICAgcS0+ZXhwaXJlID0gcC0+ZXhwaXJlOworICAgICAgcS0+c2VjdXJlID0gcC0+c2VjdXJlOworICAgICAgcS0+ZW52ID0gMTsKKyAgICB9CisgICAgaWYgKHAtPm5hbWUpCisgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+bmFtZSk7CisgICAgaWYgKHAtPnZhbHVlKQorICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnZhbHVlKTsKKyAgICBpZiAocC0+ZG9tYWluKQorICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPmRvbWFpbik7CisgICAgaWYgKHAtPnBhdGgpCisgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+cGF0aCk7CisgICAgU09BUF9GUkVFKHNvYXAsIHApOworICB9CisgIGlmIChkb21haW4pCisgICAgU09BUF9GUkVFKHNvYXAsIGRvbWFpbik7CisgIGlmIChwYXRoKQorICAgIFNPQVBfRlJFRShzb2FwLCBwYXRoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRlbnZfY29va2llcyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBjb25zdCBjaGFyICpzOworICBjaGFyIGtleVs0MDk2XSwgdmFsWzQwOTZdOyAvKiBjb29raWUgc2l6ZSBpcyB1cCB0byA0MDk2IGJ5dGVzIFtSRkMyMTA5XSAqLworICBpZiAoIShzID0gZ2V0ZW52KCJIVFRQX0NPT0tJRSIpKSkKKyAgICByZXR1cm4gU09BUF9FUlI7CisgIGRvCisgIHsgcyA9IHNvYXBfZGVjb2RlX2tleShrZXksIHNpemVvZihrZXkpLCBzKTsKKyAgICBzID0gc29hcF9kZWNvZGVfdmFsKHZhbCwgc2l6ZW9mKHZhbCksIHMpOworICAgIHAgPSBzb2FwX3NldF9jb29raWUoc29hcCwga2V5LCB2YWwsIE5VTEwsIE5VTEwpOworICAgIGlmIChwKQorICAgICAgcC0+ZW52ID0gMTsKKyAgfSB3aGlsZSAoKnMpOworICByZXR1cm4gU09BUF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwX2Nvb2tpZSoKK1NPQVBfRk1BQzIKK3NvYXBfY29weV9jb29raWVzKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnAsICoqcSwgKnI7CisgIHEgPSAmcjsKKyAgZm9yIChwID0gc29hcC0+Y29va2llczsgcDsgcCA9IHAtPm5leHQpCisgIHsgaWYgKCEoKnEgPSAoc3RydWN0IHNvYXBfY29va2llKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfY29va2llKSkpKQorICAgICAgcmV0dXJuIHI7CisgICAgKipxID0gKnA7CisgICAgaWYgKHAtPm5hbWUpCisgICAgeyBpZiAoKCgqcSktPm5hbWUgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHAtPm5hbWUpKzEpKSkKKyAgICAgICAgc3RyY3B5KCgqcSktPm5hbWUsIHAtPm5hbWUpOworICAgIH0KKyAgICBpZiAocC0+dmFsdWUpCisgICAgeyBpZiAoKCgqcSktPnZhbHVlID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihwLT52YWx1ZSkrMSkpKQorICAgICAgICBzdHJjcHkoKCpxKS0+dmFsdWUsIHAtPnZhbHVlKTsKKyAgICB9CisgICAgaWYgKHAtPmRvbWFpbikKKyAgICB7IGlmICgoKCpxKS0+ZG9tYWluID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihwLT5kb21haW4pKzEpKSkKKyAgICAgICAgc3RyY3B5KCgqcSktPmRvbWFpbiwgcC0+ZG9tYWluKTsKKyAgICB9CisgICAgaWYgKHAtPnBhdGgpCisgICAgeyBpZiAoKCgqcSktPnBhdGggPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHAtPnBhdGgpKzEpKSkKKyAgICAgICAgc3RyY3B5KCgqcSktPnBhdGgsIHAtPnBhdGgpOworICAgIH0KKyAgICBxID0gJigqcSktPm5leHQ7CisgIH0KKyAgKnEgPSBOVUxMOworICByZXR1cm4gcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZnJlZV9jb29raWVzKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGZvciAocCA9IHNvYXAtPmNvb2tpZXM7IHA7IHAgPSBzb2FwLT5jb29raWVzKQorICB7IHNvYXAtPmNvb2tpZXMgPSBwLT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBwLT5uYW1lKTsKKyAgICBpZiAocC0+dmFsdWUpCisgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+dmFsdWUpOworICAgIGlmIChwLT5kb21haW4pCisgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+ZG9tYWluKTsKKyAgICBpZiAocC0+cGF0aCkKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5wYXRoKTsKKyAgICBTT0FQX0ZSRUUoc29hcCwgcCk7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNlbmRpZiAvKiBXSVRIX0NPT0tJRVMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBXSVRIX0daSVAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzb2FwX2dldGd6aXBoZHIoc3RydWN0IHNvYXAgKnNvYXApCit7IGludCBpOworICBzb2FwX3djaGFyIGMsIGYgPSAwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdldCBnemlwIGhlYWRlclxuIikpOworICBmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKQorICB7IGlmICgoaW50KShjID0gc29hcF9nZXQxKHNvYXApID09IEVPRikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICBpZiAoaSA9PSAyKQorICAgICAgZiA9IGM7CisgIH0KKyAgaWYgKGYgJiAweDA0KSAvKiBGRVhUUkEgKi8KKyAgeyBmb3IgKGkgPSBzb2FwX2dldDEoc29hcCkgfCAoc29hcF9nZXQxKHNvYXApIDw8IDgpOyBpOyBpLS0pCisgICAgICBpZiAoKGludClzb2FwX2dldDEoc29hcCkgPT0gRU9GKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgfQorICBpZiAoZiAmIDB4MDgpIC8qIEZOQU1FICovCisgICAgZG8KKyAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgd2hpbGUgKGMgJiYgKGludCljICE9IEVPRik7CisgIGlmICgoaW50KWMgIT0gRU9GICYmIChmICYgMHgxMCkpIC8qIEZDT01NRU5UICovCisgICAgZG8KKyAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgd2hpbGUgKGMgJiYgKGludClmICE9IEVPRik7CisgIGlmICgoaW50KWMgIT0gRU9GICYmIChmICYgMHgwMSkpIC8qIEZIQ1JDICovCisgIHsgaWYgKChpbnQpKGMgPSBzb2FwX2dldDEoc29hcCkpICE9IEVPRikKKyAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgIH0KKyAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYmVnaW5fcmVjdihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcF93Y2hhciBjOworICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIHNvYXBfZnJlZShzb2FwKTsKKyAgc29hcF9zZXRfbG9jYWxfbmFtZXNwYWNlcyhzb2FwKTsKKyAgc29hcC0+dmVyc2lvbiA9IDA7CS8qIGRvbid0IGFzc3VtZSB3ZSdyZSBwYXJzaW5nIFNPQVAgY29udGVudCBieSBkZWZhdWx0ICovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICBzb2FwX2ZyZWVfaWh0KHNvYXApOworI2VuZGlmCisgIGlmICgoc29hcC0+aW1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKQorICAgIHNvYXAtPm9tb2RlIHw9IFNPQVBfSU9fQ0hVTks7CisgIHNvYXAtPmltb2RlICY9IH5TT0FQX0lPOworICBzb2FwLT5tb2RlID0gc29hcC0+aW1vZGU7CisgIGlmICghc29hcC0+a2VlcF9hbGl2ZSkKKyAgeyBzb2FwLT5idWZsZW4gPSAwOworICAgIHNvYXAtPmJ1ZmlkeCA9IDA7CisgIH0KKyAgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfSU9fS0VFUEFMSVZFKSkKKyAgICBzb2FwLT5rZWVwX2FsaXZlID0gMDsKKyAgc29hcC0+YWhlYWQgPSAwOworICBzb2FwLT5wZWVrZWQgPSAwOworICBzb2FwLT5sZXZlbCA9IDA7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0JFR0lOOworICBzb2FwLT5hbGxvY2VkID0gMDsKKyAgc29hcC0+Y291bnQgPSAwOworICBzb2FwLT5sZW5ndGggPSAwOworICBzb2FwLT5jZGF0YSA9IDA7CisgICpzb2FwLT5lbmRwb2ludCA9ICdcMCc7CisgIHNvYXAtPmFjdGlvbiA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXAtPmRvbSA9IE5VTEw7CisgIHNvYXAtPmRpbWUuY2h1bmtzaXplID0gMDsKKyAgc29hcC0+ZGltZS5idWZsZW4gPSAwOworICBzb2FwLT5kaW1lLmxpc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5sYXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5saXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuYm91bmRhcnkgPSBOVUxMOworICBzb2FwLT5taW1lLnN0YXJ0ID0gTlVMTDsKKyAgc29hcC0+eGxpc3QgPSBOVUxMOworI2VuZGlmCisjaWZkZWYgV0lOMzIKKyNpZm5kZWYgVU5ERVJfQ0UKKyNpZm5kZWYgV0lUSF9GQVNUQ0dJCisgIGlmICghc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyNpZmRlZiBfX0JPUkxBTkRDX18KKyAgICBzZXRtb2RlKChTT0FQX1NPQ0tFVClzb2FwLT5yZWN2ZmQsIE9fQklOQVJZKTsKKyNlbHNlCisgICAgX3NldG1vZGUoKFNPQVBfU09DS0VUKXNvYXAtPnJlY3ZmZCwgX09fQklOQVJZKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIFdJVEhfWkxJQgorICBzb2FwLT5tb2RlICY9IH5TT0FQX0VOQ19aTElCOworICBzb2FwLT56bGliX2luID0gU09BUF9aTElCX05PTkU7CisgIHNvYXAtPnpsaWJfb3V0ID0gU09BUF9aTElCX05PTkU7CisgIHNvYXAtPmRfc3RyZWFtLm5leHRfaW4gPSBaX05VTEw7CisgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luID0gMDsKKyAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZSopc29hcC0+YnVmOworICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgPSBTT0FQX0JVRkxFTjsKKyAgc29hcC0+el9yYXRpb19pbiA9IDEuMDsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+ZnByZXBhcmVpbml0KQorICAgIHNvYXAtPmZwcmVwYXJlaW5pdChzb2FwKTsKKyNlbmRpZgorICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworI2lmZGVmIFdJVEhfR1pJUAorICBpZiAoYyA9PSAweDFGKQorICB7IGlmIChzb2FwX2dldGd6aXBoZHIoc29hcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKGluZmxhdGVJbml0Migmc29hcC0+ZF9zdHJlYW0sIC1NQVhfV0JJVFMpICE9IFpfT0spCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9JTkZMQVRFOworICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfWkxJQjsKKyAgICBzb2FwLT56bGliX2luID0gU09BUF9aTElCX0daSVA7CisgICAgc29hcC0+el9jcmMgPSBjcmMzMigwTCwgTlVMTCwgMCk7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJnemlwIGluaXRpYWxpemVkXG4iKSk7CisgICAgbWVtY3B5KHNvYXAtPnpfYnVmLCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOKTsKKyAgICAvKiBzaG91bGQgbm90IGNodW5rIG92ZXIgcGxhaW4gdHJhbnNwb3J0LCBzbyB3aHkgYm90aGVyIHRvIGNoZWNrPyAqLworICAgIC8qIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspICovCisgICAgLyogICBzb2FwLT56X2J1ZmxlbiA9IHNvYXAtPmJ1ZmlkeDsgKi8KKyAgICAvKiBlbHNlICovCisgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9pbiA9IChCeXRlKikoc29hcC0+el9idWYgKyBzb2FwLT5idWZpZHgpOworICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luID0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgIHNvYXAtPnpfYnVmbGVuID0gc29hcC0+YnVmbGVuOworICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmJ1ZmlkeDsKKyAgICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICB9ICAKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoYyA9PSAnLScgJiYgc29hcF9nZXQwKHNvYXApID09ICctJykKKyAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX01JTUU7CisgIGVsc2UgaWYgKChjICYgMHhGRkZDKSA9PSAoU09BUF9ESU1FX1ZFUlNJT04gfCBTT0FQX0RJTUVfTUIpICYmIChzb2FwX2dldDAoc29hcCkgJiAweEZGRjApID09IDB4MjApCisgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19ESU1FOworICBlbHNlCisjZW5kaWYKKyAgeyB3aGlsZSAoc29hcF9ibGFuayhjKSkKKyAgICAgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgIH0KKyAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisjaWZuZGVmIFdJVEhfTk9IVFRQCisgIC8qIGlmIG5vdCBYTUwgb3IgKHN0YXJ0IG9mKUJPTSBvciBNSU1FL0RJTUUvWkxJQiwgYXNzdW1lIEhUVFAgaGVhZGVyICovCisgIGlmIChjICE9ICc8JyAmJiBjICE9IDB4RUYgJiYgIShzb2FwLT5tb2RlICYgKFNPQVBfRU5DX01JTUUgfCBTT0FQX0VOQ19ESU1FIHwgU09BUF9FTkNfWkxJQikpKQorICB7IHNvYXAtPm1vZGUgJj0gflNPQVBfSU87CisgICAgc29hcC0+ZXJyb3IgPSBzb2FwLT5mcGFyc2Uoc29hcCk7CisgICAgaWYgKHNvYXAtPmVycm9yICYmIHNvYXAtPmVycm9yIDwgU09BUF9TVE9QKQorICAgIHsgc29hcC0+a2VlcF9hbGl2ZSA9IDA7IC8qIGZvcmNlIGNsb3NlIGxhdGVyICovCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgICAgeyBzb2FwLT5jaHVua2J1ZmxlbiA9IHNvYXAtPmJ1ZmxlbjsKKyAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmJ1ZmlkeDsKKyAgICAgIHNvYXAtPmNodW5rc2l6ZSA9IDA7CisgICAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICAgIGVsc2UgaWYgKHNvYXAtPmZwcmVwYXJlcmVjdiAmJiBzb2FwLT5idWZsZW4gIT0gc29hcC0+YnVmaWR4KQorICAgICAgc29hcC0+ZnByZXBhcmVyZWN2KHNvYXAsIHNvYXAtPmJ1ZiArIHNvYXAtPmJ1ZmlkeCwgc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4KTsKKyNlbmRpZgorI2lmZGVmIFdJVEhfWkxJQgorICAgIGlmIChzb2FwLT56bGliX2luICE9IFNPQVBfWkxJQl9OT05FKQorICAgIHsgLyogZnBhcnNlIHNob3VsZCBub3QgdXNlIHNvYXBfdW5nZXQgdG8gcHVzaCBiYWNrIGxhc3QgY2hhciAqLworI2lmZGVmIFdJVEhfR1pJUAorICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgIGlmIChjID09IDB4MUYpCisgICAgICB7IGlmIChzb2FwX2dldGd6aXBoZHIoc29hcCkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBpZiAoaW5mbGF0ZUluaXQyKCZzb2FwLT5kX3N0cmVhbSwgLU1BWF9XQklUUykgIT0gWl9PSykKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgICAgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfSU5GTEFURTsKKyAgICAgICAgc29hcC0+el9jcmMgPSBjcmMzMigwTCwgTlVMTCwgMCk7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZ3ppcCBpbml0aWFsaXplZFxuIikpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBzb2FwX3JldmdldDEoc29hcCk7CisjZWxzZQorICAgICAgeworI2VuZGlmCisgICAgICAgIGlmIChpbmZsYXRlSW5pdCgmc29hcC0+ZF9zdHJlYW0pICE9IFpfT0spCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgICBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX0lORkxBVEU7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5mbGF0ZSBpbml0aWFsaXplZFxuIikpOworICAgICAgfQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19aTElCOworICAgICAgbWVtY3B5KHNvYXAtPnpfYnVmLCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOKTsKKyAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfaW4gPSAoQnl0ZSopKHNvYXAtPnpfYnVmICsgc29hcC0+YnVmaWR4KTsKKyAgICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luID0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgICAgc29hcC0+el9idWZsZW4gPSBzb2FwLT5idWZsZW47CisgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5idWZpZHg7CisgICAgfQorI2VuZGlmCisgICAgaWYgKHNvYXAtPmVycm9yKQorICAgIHsgaWYgKHNvYXAtPmVycm9yID09IFNPQVBfRk9STSAmJiBzb2FwLT5mZm9ybSkKKyAgICAgIHsgc29hcC0+ZXJyb3IgPSBzb2FwLT5mZm9ybShzb2FwKTsKKyAgICAgICAgaWYgKHNvYXAtPmVycm9yID09IFNPQVBfT0spCisgICAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1NUT1A7IC8qIHByZXZlbnRzIGZ1cnRoZXIgcHJvY2Vzc2luZyAqLworICAgICAgfQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgfQorI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkKKyAgeyBpZiAoc29hcF9nZXRtaW1laGRyKHNvYXApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmIChzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHNvYXAtPm1pbWUuZmlyc3QtPnR5cGUsICJhcHBsaWNhdGlvbi9kaW1lIikpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX0RJTUU7CisgIH0KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKQorICB7IGlmIChzb2FwX2dldGRpbWVoZHIoc29hcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHNvYXAtPmRpbWUuZmxhZ3MgJiBTT0FQX0RJTUVfQ0YpCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNodW5rZWQgRElNRSBTT0FQIG1lc3NhZ2VcbiIpKTsKKyAgICAgIHNvYXAtPmRpbWUuY2h1bmtzaXplID0gc29hcC0+ZGltZS5zaXplOworICAgICAgaWYgKHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeCA+PSBzb2FwLT5kaW1lLmNodW5rc2l6ZSkKKyAgICAgIHsgc29hcC0+ZGltZS5idWZsZW4gPSBzb2FwLT5idWZsZW47CisgICAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmJ1ZmlkeCArIHNvYXAtPmRpbWUuY2h1bmtzaXplOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBzb2FwLT5kaW1lLmNodW5rc2l6ZSAtPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgfQorICAgIHNvYXAtPmNvdW50ID0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICB9CisjZW5kaWYKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50CitodHRwX3BhcnNlKHN0cnVjdCBzb2FwICpzb2FwKQoreyBjaGFyIGhlYWRlcltTT0FQX0hEUkxFTl0sICpzOworICB1bnNpZ25lZCBzaG9ydCBnZXQgPSAwLCBzdGF0dXMgPSAwLCBrID0gMDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJXYWl0aW5nIGZvciBIVFRQIHJlcXVlc3QvcmVzcG9uc2UuLi5cbiIpKTsKKyAgKnNvYXAtPmVuZHBvaW50ID0gJ1wwJzsKKyAgc29hcC0+bGVuZ3RoID0gMDsKKyAgc29hcC0+dXNlcmlkID0gTlVMTDsKKyAgc29hcC0+cGFzc3dkID0gTlVMTDsKKyAgc29hcC0+YWN0aW9uID0gTlVMTDsKKyAgc29hcC0+YXV0aHJlYWxtID0gTlVMTDsKKyAgZG8KKyAgeyBpZiAoc29hcF9nZXRsaW5lKHNvYXAsIHNvYXAtPm1zZ2J1Ziwgc2l6ZW9mKHNvYXAtPm1zZ2J1ZikpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJIVFRQIHN0YXR1czogJXNcbiIsIHNvYXAtPm1zZ2J1ZikpOworICAgIGZvciAoOzspCisgICAgeyBpZiAoc29hcF9nZXRsaW5lKHNvYXAsIGhlYWRlciwgU09BUF9IRFJMRU4pKQorICAgICAgeyBpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9FT0YpCisJeyBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgICAgICAgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVPRiBpbiBIVFRQIGhlYWRlciwgY29udGludWUgYW55d2F5XG4iKSk7CisJICBicmVhazsKKwl9CisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIH0KKyAgICAgIGlmICghKmhlYWRlcikKKyAgICAgICAgYnJlYWs7CisgICAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiSFRUUCBoZWFkZXI6ICVzXG4iLCBoZWFkZXIpKTsKKyAgICAgIHMgPSBzdHJjaHIoaGVhZGVyLCAnOicpOworICAgICAgaWYgKHMpCisgICAgICB7ICpzID0gJ1wwJzsKKyAgICAgICAgZG8gcysrOworICAgICAgICB3aGlsZSAoKnMgJiYgKnMgPD0gMzIpOworICAgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBhcnNlaGRyKHNvYXAsIGhlYWRlciwgcykpKQorICAgICAgICB7IGlmIChzb2FwLT5lcnJvciA8IFNPQVBfU1RPUCkKKwkgICAgcmV0dXJuIHNvYXAtPmVycm9yOworCSAgc3RhdHVzID0gc29hcC0+ZXJyb3I7CisJICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKChzID0gc3RyY2hyKHNvYXAtPm1zZ2J1ZiwgJyAnKSkpCisgICAgeyBrID0gKHVuc2lnbmVkIHNob3J0KXNvYXBfc3RydG91bChzLCAmcywgMTApOworICAgICAgaWYgKCFzb2FwX2JsYW5rKCpzKSkKKyAgICAgICAgayA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGsgPSAwOworICB9IHdoaWxlIChrID09IDEwMCk7CisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJGaW5pc2hlZCBIVFRQIGhlYWRlciBwYXJzaW5nXG4iKSk7CisgIHMgPSBzdHJzdHIoc29hcC0+bXNnYnVmLCAiSFRUUC8iKTsKKyAgaWYgKHMgJiYgc1s3XSAhPSAnMScpCisgIHsgaWYgKHNvYXAtPmtlZXBfYWxpdmUgPT0gMSkKKyAgICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOworICAgIGlmIChrID09IDAgJiYgKHNvYXAtPm9tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykgLyogayA9PSAwIGZvciBIVFRQIHJlcXVlc3QgKi8KKyAgICB7IHNvYXAtPmltb2RlIHw9IFNPQVBfSU9fQ0hVTks7CisgICAgICBzb2FwLT5vbW9kZSA9IChzb2FwLT5vbW9kZSAmIH5TT0FQX0lPKSB8IFNPQVBfSU9fU1RPUkU7CisgICAgfQorICB9CisgIGlmIChzb2FwLT5rZWVwX2FsaXZlIDwgMCkKKyAgICBzb2FwLT5rZWVwX2FsaXZlID0gMTsKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIktlZXAgYWxpdmUgY29ubmVjdGlvbiA9ICVkXG4iLCBzb2FwLT5rZWVwX2FsaXZlKSk7CisgIGlmIChzICYmICgoKGdldCA9ICFzdHJuY21wKHNvYXAtPm1zZ2J1ZiwgIkdFVCAiLCA0KSkpIHx8ICFzdHJuY21wKHNvYXAtPm1zZ2J1ZiwgIlBPU1QgIiwgNSkpKQorICB7IHNpemVfdCBtID0gc3RybGVuKHNvYXAtPmVuZHBvaW50KTsKKyAgICBzaXplX3QgbiA9IG0gKyAocyAtIHNvYXAtPm1zZ2J1ZikgLSA1IC0gKCFnZXQpOworICAgIGlmIChuID49IHNpemVvZihzb2FwLT5lbmRwb2ludCkpCisgICAgICBuID0gc2l6ZW9mKHNvYXAtPmVuZHBvaW50KSAtIDE7CisgICAgc3RybmNweShzb2FwLT5wYXRoLCBzb2FwLT5tc2didWYgKyA0ICsgKCFnZXQpLCBuIC0gbSk7CisgICAgc29hcC0+cGF0aFtuIC0gbV0gPSAnXDAnOworICAgIHN0cmNhdChzb2FwLT5lbmRwb2ludCwgc29hcC0+cGF0aCk7CisgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlRhcmdldCBlbmRwb2ludD0nJXMnXG4iLCBzb2FwLT5lbmRwb2ludCkpOworICAgIGlmIChnZXQpCisgICAgeyBzb2FwLT5lcnJvciA9IHNvYXAtPmZnZXQoc29hcCk7CisgICAgICBpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9PSykKKyAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1NUT1A7IC8qIHByZXZlbnRzIGZ1cnRoZXIgcHJvY2Vzc2luZyAqLworICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBpZiAoc3RhdHVzKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gc3RhdHVzOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIGlmIChrID09IDAgfHwgKGsgPj0gMjAwICYmIGsgPD0gMjk5KSB8fCBrID09IDQwMCB8fCBrID09IDUwMCkKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkhUVFAgZXJyb3IgJWRcbiIsIGspKTsKKyAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJIVFRQIGVycm9yIiwgc29hcC0+bXNnYnVmLCBrKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAoraHR0cF9wYXJzZV9oZWFkZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsKQoreyBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJIb3N0IikpCisgIHsgCisjaWZkZWYgV0lUSF9PUEVOU1NMCisgICAgaWYgKHNvYXAtPmltb2RlICYgU09BUF9FTkNfU1NMKQorICAgICAgc3RyY3B5KHNvYXAtPmVuZHBvaW50LCAiaHR0cHM6Ly8iKTsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgIHN0cmNweShzb2FwLT5lbmRwb2ludCwgImh0dHA6Ly8iKTsKKyAgICBzdHJuY2F0KHNvYXAtPmVuZHBvaW50LCB2YWwsIHNpemVvZihzb2FwLT5lbmRwb2ludCkgLSA4KTsKKyAgICBzb2FwLT5lbmRwb2ludFtzaXplb2Yoc29hcC0+ZW5kcG9pbnQpIC0gMV0gPSAnXDAnOworICB9CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1UeXBlIikpCisgIHsgaWYgKHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAiYXBwbGljYXRpb24vZGltZSIpKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19ESU1FOworICAgIGVsc2UgaWYgKHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAibXVsdGlwYXJ0L3JlbGF0ZWQiKQorICAgICAgICAgIHx8IHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAibXVsdGlwYXJ0L2Zvcm0tZGF0YSIpKQorICAgIHsgc29hcC0+bWltZS5ib3VuZGFyeSA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAiYm91bmRhcnkiKSk7CisgICAgICBzb2FwLT5taW1lLnN0YXJ0ID0gc29hcF9zdHJkdXAoc29hcCwgc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwsICJzdGFydCIpKTsKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfTUlNRTsKKyAgICB9CisgIH0KKyNlbmRpZgorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtTGVuZ3RoIikpCisgICAgc29hcC0+bGVuZ3RoID0gc29hcF9zdHJ0b3VsKHZhbCwgTlVMTCwgMTApOworICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtRW5jb2RpbmciKSkKKyAgeyBpZiAoIXNvYXBfdGFnX2NtcCh2YWwsICJkZWZsYXRlIikpCisjaWZkZWYgV0lUSF9aTElCCisgICAgICBzb2FwLT56bGliX2luID0gU09BUF9aTElCX0RFRkxBVEU7CisjZWxzZQorICAgICAgcmV0dXJuIFNPQVBfWkxJQl9FUlJPUjsKKyNlbmRpZgorICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAodmFsLCAiZ3ppcCIpKQorI2lmZGVmIFdJVEhfR1pJUAorICAgICAgc29hcC0+emxpYl9pbiA9IFNPQVBfWkxJQl9HWklQOworI2Vsc2UKKyAgICAgIHJldHVybiBTT0FQX1pMSUJfRVJST1I7CisjZW5kaWYKKyAgfQorI2lmZGVmIFdJVEhfWkxJQgorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkFjY2VwdC1FbmNvZGluZyIpKQorICB7CisjaWZkZWYgV0lUSF9HWklQCisgICAgaWYgKHN0cmNocih2YWwsICcqJykgfHwgc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwsICJnemlwIikpCisgICAgICBzb2FwLT56bGliX291dCA9IFNPQVBfWkxJQl9HWklQOworICAgIGVsc2UKKyNlbmRpZgorICAgIGlmIChzdHJjaHIodmFsLCAnKicpIHx8IHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAiZGVmbGF0ZSIpKQorICAgICAgc29hcC0+emxpYl9vdXQgPSBTT0FQX1pMSUJfREVGTEFURTsKKyAgICBlbHNlCisgICAgICBzb2FwLT56bGliX291dCA9IFNPQVBfWkxJQl9OT05FOworICB9CisjZW5kaWYKKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJUcmFuc2Zlci1FbmNvZGluZyIpKQorICB7IHNvYXAtPm1vZGUgJj0gflNPQVBfSU87CisgICAgaWYgKCFzb2FwX3RhZ19jbXAodmFsLCAiY2h1bmtlZCIpKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX0NIVU5LOworICB9CisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29ubmVjdGlvbiIpKQorICB7IGlmICghc29hcF90YWdfY21wKHZhbCwgImtlZXAtYWxpdmUiKSkKKyAgICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAtc29hcC0+a2VlcF9hbGl2ZTsKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHZhbCwgImNsb3NlIikpCisgICAgICBzb2FwLT5rZWVwX2FsaXZlID0gMDsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU4KKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJBdXRob3JpemF0aW9uIikpCisgIHsgaWYgKCFzb2FwX3RhZ19jbXAodmFsLCAiQmFzaWMgKiIpKQorICAgIHsgaW50IG47CisgICAgICBjaGFyICpzOworICAgICAgc29hcF9iYXNlNjQycyhzb2FwLCB2YWwgKyA2LCBzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpIC0gMSwgJm4pOworICAgICAgc29hcC0+dG1wYnVmW25dID0gJ1wwJzsKKyAgICAgIGlmICgocyA9IHN0cmNocihzb2FwLT50bXBidWYsICc6JykpKQorICAgICAgeyAqcyA9ICdcMCc7CisJc29hcC0+dXNlcmlkID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+dG1wYnVmKTsKKwlzb2FwLT5wYXNzd2QgPSBzb2FwX3N0cmR1cChzb2FwLCBzICsgMSk7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiV1dXLUF1dGhlbnRpY2F0ZSIpKQorICAgIHNvYXAtPmF1dGhyZWFsbSA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsICsgNiwgInJlYWxtIikpOworICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkV4cGVjdCIpKQorICB7IGlmICghc29hcF90YWdfY21wKHZhbCwgIjEwMC1jb250aW51ZSIpKQorICAgIHsgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJIVFRQLzEuMSAxMDAgQ29udGludWUiLCBOVUxMKSkKKyAgICAgICB8fCAoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCBOVUxMLCBOVUxMKSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgIH0KKyNlbmRpZgorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIlNPQVBBY3Rpb24iKSkKKyAgeyBpZiAoKnZhbCA9PSAnIicpCisgICAgeyBzb2FwLT5hY3Rpb24gPSBzb2FwX3N0cmR1cChzb2FwLCB2YWwgKyAxKTsKKyAgICAgIHNvYXAtPmFjdGlvbltzdHJsZW4oc29hcC0+YWN0aW9uKSAtIDFdID0gJ1wwJzsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJMb2NhdGlvbiIpKQorICB7IHN0cm5jcHkoc29hcC0+ZW5kcG9pbnQsIHZhbCwgc2l6ZW9mKHNvYXAtPmVuZHBvaW50KSk7CisgICAgc29hcC0+ZW5kcG9pbnRbc2l6ZW9mKHNvYXAtPmVuZHBvaW50KSAtIDFdID0gJ1wwJzsKKyAgfQorI2lmZGVmIFdJVEhfQ09PS0lFUworICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvb2tpZSIpIHx8ICFzb2FwX3RhZ19jbXAoa2V5LCAiU2V0LUNvb2tpZSIpKQorICAgIHNvYXBfZ2V0Y29va2llcyhzb2FwLCB2YWwpOworI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAhZGVmaW5lZChXSVRIX05PSFRUUCkgfHwgIWRlZmluZWQoV0lUSF9MRUFORVIpCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmxpbmUsIGNvbnN0IGNoYXIgKmtleSkKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqcyA9IGxpbmU7CisgIGlmIChzKQorICB7IHdoaWxlICgqcykKKyAgICB7IHJlZ2lzdGVyIHNob3J0IGZsYWc7CisgICAgICBzID0gc29hcF9kZWNvZGVfa2V5KHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksIHMpOworICAgICAgZmxhZyA9IHNvYXBfdGFnX2NtcChzb2FwLT50bXBidWYsIGtleSk7CisgICAgICBzID0gc29hcF9kZWNvZGVfdmFsKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksIHMpOworICAgICAgaWYgKCFmbGFnKQorICAgICAgICByZXR1cm4gc29hcC0+dG1wYnVmOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgIWRlZmluZWQoV0lUSF9OT0hUVFApIHx8ICFkZWZpbmVkKFdJVEhfTEVBTkVSKQorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2RlY29kZV9rZXkoY2hhciAqYnVmLCBzaXplX3QgbGVuLCBjb25zdCBjaGFyICp2YWwpCit7IHJldHVybiBzb2FwX2RlY29kZShidWYsIGxlbiwgdmFsLCAiPSw7Iik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmICFkZWZpbmVkKFdJVEhfTk9IVFRQKSB8fCAhZGVmaW5lZChXSVRIX0xFQU5FUikKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9kZWNvZGVfdmFsKGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwgY29uc3QgY2hhciAqdmFsKQoreyBpZiAoKnZhbCAhPSAnPScpCisgIHsgKmJ1ZiA9ICdcMCc7CisgICAgcmV0dXJuIHZhbDsKKyAgfQorICByZXR1cm4gc29hcF9kZWNvZGUoYnVmLCBsZW4sIHZhbCArIDEsICIsOyIpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAhZGVmaW5lZChXSVRIX05PSFRUUCkgfHwgIWRlZmluZWQoV0lUSF9MRUFORVIpCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNvbnN0IGNoYXIqCitzb2FwX2RlY29kZShjaGFyICpidWYsIHNpemVfdCBsZW4sIGNvbnN0IGNoYXIgKnZhbCwgY29uc3QgY2hhciAqc2VwKQoreyBjb25zdCBjaGFyICpzOworICBjaGFyICp0ID0gYnVmOworICBmb3IgKHMgPSB2YWw7ICpzOyBzKyspCisgICAgaWYgKCpzICE9ICcgJyAmJiAqcyAhPSAnXHQnICYmICFzdHJjaHIoc2VwLCAqcykpCisgICAgICBicmVhazsKKyAgaWYgKCpzID09ICciJykKKyAgeyBzKys7CisgICAgd2hpbGUgKCpzICYmICpzICE9ICciJyAmJiAtLWxlbikKKyAgICAgICp0KysgPSAqcysrOworICB9CisgIGVsc2UKKyAgeyB3aGlsZSAoc29hcF9ub3RibGFuaygqcykgJiYgIXN0cmNocihzZXAsICpzKSAmJiAtLWxlbikKKyAgICB7IGlmICgqcyA9PSAnJScpCisgICAgICB7ICp0KysgPSAoKHNbMV0gPj0gJ0EnID8gKHNbMV0gJiAweDcpICsgOSA6IHNbMV0gLSAnMCcpIDw8IDQpCisgICAgICAgICAgICAgICsgKHNbMl0gPj0gJ0EnID8gKHNbMl0gJiAweDcpICsgOSA6IHNbMl0gLSAnMCcpOworICAgICAgICBzICs9IDM7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgICp0KysgPSAqcysrOworICAgIH0KKyAgfQorICAqdCA9ICdcMCc7CisgIHdoaWxlICgqcyAmJiAhc3RyY2hyKHNlcCwgKnMpKQorICAgIHMrKzsKKyAgcmV0dXJuIHM7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbnZlbG9wZV9iZWdpbl9vdXQoc3RydWN0IHNvYXAgKnNvYXApCit7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNpemVfdCBuID0gMDsKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkgJiYgc29hcC0+bWltZS5ib3VuZGFyeSAmJiBzb2FwLT5taW1lLnN0YXJ0KQorICB7IGNvbnN0IGNoYXIgKnM7CisgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkgJiYgIShzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkpCisgICAgICBzID0gImFwcGxpY2F0aW9uL2RpbWUiOworICAgIGVsc2UgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgICAgIHMgPSAiYXBwbGljYXRpb24vc29hcCt4bWw7IGNoYXJzZXQ9dXRmLTgiOworICAgIGVsc2UKKyAgICAgIHMgPSAidGV4dC94bWw7IGNoYXJzZXQ9dXRmLTgiOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiLS0lc1xyXG5Db250ZW50LVR5cGU6ICVzXHJcbkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJpbmFyeVxyXG5Db250ZW50LUlEOiAlc1xyXG5cclxuIiwgc29hcC0+bWltZS5ib3VuZGFyeSwgcywgc29hcC0+bWltZS5zdGFydCk7CisgICAgbiA9IHN0cmxlbihzb2FwLT50bXBidWYpOworICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHNvYXAtPnRtcGJ1ZiwgbikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICBzb2FwLT5kaW1lLnNpemUgPSBzb2FwLT5jb3VudDsJLyogRElNRSBpbiBNSU1FIGNvcnJlY3Rpb24gKi8KKyAgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpKQorICB7IGlmIChzb2FwX3B1dGRpbWVoZHIoc29hcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyNlbmRpZgorICBzb2FwLT5wYXJ0ID0gU09BUF9JTl9FTlZFTE9QRTsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgIlNPQVAtRU5WOkVudmVsb3BlIiwgMCwgTlVMTCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW52ZWxvcGVfZW5kX291dChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsICJTT0FQLUVOVjpFbnZlbG9wZSIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpICYmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkgJiYgIShzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkpCisgIHsgc29hcC0+ZGltZS5zaXplID0gc29hcC0+Y291bnQgLSBzb2FwLT5kaW1lLnNpemU7CS8qIERJTUUgaW4gTUlNRSBjb3JyZWN0aW9uICovCisgICAgc3ByaW50Zihzb2FwLT5pZCwgc29hcC0+ZGltZV9pZF9mb3JtYXQsIDApOworICAgIHNvYXAtPmRpbWUuaWQgPSBzb2FwLT5pZDsKKyAgICBpZiAoc29hcC0+bG9jYWxfbmFtZXNwYWNlcykKKyAgICB7IGlmIChzb2FwLT5sb2NhbF9uYW1lc3BhY2VzWzBdLm91dCkKKyAgICAgICAgc29hcC0+ZGltZS50eXBlID0gKGNoYXIqKXNvYXAtPmxvY2FsX25hbWVzcGFjZXNbMF0ub3V0OworICAgICAgZWxzZQorICAgICAgICBzb2FwLT5kaW1lLnR5cGUgPSAoY2hhciopc29hcC0+bG9jYWxfbmFtZXNwYWNlc1swXS5uczsKKyAgICB9CisgICAgc29hcC0+ZGltZS5vcHRpb25zID0gTlVMTDsKKyAgICBzb2FwLT5kaW1lLmZsYWdzID0gU09BUF9ESU1FX01CIHwgU09BUF9ESU1FX0FCU1VSSTsKKyAgICBpZiAoIXNvYXAtPmRpbWUuZmlyc3QpCisgICAgICBzb2FwLT5kaW1lLmZsYWdzIHw9IFNPQVBfRElNRV9NRTsKKyAgICBzb2FwLT5jb3VudCArPSAxMiArICgoc3RybGVuKHNvYXAtPmRpbWUuaWQpKzMpJih+MykpICsgKChzdHJsZW4oc29hcC0+ZGltZS50eXBlKSszKSYofjMpKTsKKyAgfQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKSkKKyAgICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCBTT0FQX1NUUl9QQURESU5HLCAtKGxvbmcpc29hcC0+ZGltZS5zaXplJjMpOworI2VuZGlmCisgIHNvYXAtPnBhcnQgPSBTT0FQX0VORF9FTlZFTE9QRTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9IAorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VudmVsb3BlX2JlZ2luX2luKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzdHJ1Y3QgTmFtZXNwYWNlICpwOworICBzb2FwLT5wYXJ0ID0gU09BUF9JTl9FTlZFTE9QRTsKKyAgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCAiU09BUC1FTlY6RW52ZWxvcGUiLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1ZFUlNJT05NSVNNQVRDSDsKKyAgcCA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXM7CisgIGlmIChwKQorICB7IGNvbnN0IGNoYXIgKm5zID0gcFswXS5vdXQ7CisgICAgaWYgKCFucykKKyAgICAgIG5zID0gcFswXS5uczsKKyAgICBpZiAoIXN0cmNtcChucywgc29hcF9lbnYxKSkKKyAgICB7IHNvYXAtPnZlcnNpb24gPSAxOyAvKiBtYWtlIHN1cmUgd2UgdXNlIFNPQVAgMS4xICovCisgICAgICBpZiAocFsxXS5vdXQpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwWzFdLm91dCk7CisgICAgICBpZiAoKHBbMV0ub3V0ID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzb2FwX2VuYzEpKSkpCisgICAgICAgIHN0cmNweShwWzFdLm91dCwgc29hcF9lbmMxKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChucywgc29hcF9lbnYyKSkKKyAgICB7IHNvYXAtPnZlcnNpb24gPSAyOyAvKiBtYWtlIHN1cmUgd2UgdXNlIFNPQVAgMS4yICovCisgICAgICBpZiAocFsxXS5vdXQpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwWzFdLm91dCk7CisgICAgICBpZiAoKHBbMV0ub3V0ID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzb2FwX2VuYzIpKSkpCisgICAgICAgIHN0cmNweShwWzFdLm91dCwgc29hcF9lbmMyKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW52ZWxvcGVfZW5kX2luKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5wYXJ0ID0gU09BUF9FTkRfRU5WRUxPUEU7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsICJTT0FQLUVOVjpFbnZlbG9wZSIpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JvZHlfYmVnaW5fb3V0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5wYXJ0ID0gU09BUF9JTl9CT0RZOworICBpZiAoc29hcC0+dmVyc2lvbiA9PSAxKQorICAgIHNvYXAtPmVuY29kaW5nID0gMTsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NFQykgJiYgc29hcF9zZXRfYXR0cihzb2FwLCAid3N1OklkIiwgIkJvZHkiKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjZW5kaWYKKyAgaWYgKHNvYXBfZWxlbWVudChzb2FwLCAiU09BUC1FTlY6Qm9keSIsIDAsIE5VTEwpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHNvYXAsIE5VTEwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JvZHlfZW5kX291dChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsICJTT0FQLUVOVjpCb2R5IikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBzb2FwLT5wYXJ0ID0gU09BUF9FTkRfQk9EWTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYm9keV9iZWdpbl9pbihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+cGFydCA9IFNPQVBfSU5fQk9EWTsKKyAgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCAiU09BUC1FTlY6Qm9keSIsIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKCFzb2FwLT5ib2R5KQorICAgIHNvYXAtPnBhcnQgPSBTT0FQX05PX0JPRFk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JvZHlfZW5kX2luKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcC0+cGFydCA9PSBTT0FQX05PX0JPRFkpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0VORF9CT0RZOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCAiU09BUC1FTlY6Qm9keSIpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlY3ZfaGVhZGVyKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcF9nZXRoZWFkZXIoc29hcCkgJiYgc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9lbmRwb2ludChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZW5kcG9pbnQpCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnM7CisgIHJlZ2lzdGVyIHNpemVfdCBpLCBuOworICBzb2FwLT5lbmRwb2ludFswXSA9ICdcMCc7CisgIHNvYXAtPmhvc3RbMF0gPSAnXDAnOworICBzb2FwLT5wYXRoWzBdID0gJy8nOworICBzb2FwLT5wYXRoWzFdID0gJ1wwJzsKKyAgc29hcC0+cG9ydCA9IDgwOworICBpZiAoIWVuZHBvaW50IHx8ICEqZW5kcG9pbnQpCisgICAgcmV0dXJuOworICBpZiAoIXN0cm5jbXAoZW5kcG9pbnQsICJodHRwczoiLCA2KSkKKyAgICBzb2FwLT5wb3J0ID0gNDQzOworICBzdHJuY3B5KHNvYXAtPmVuZHBvaW50LCBlbmRwb2ludCwgc2l6ZW9mKHNvYXAtPmVuZHBvaW50KSAtIDEpOworICBzID0gc3RyY2hyKGVuZHBvaW50LCAnOicpOworICBpZiAocyAmJiBzWzFdID09ICcvJyAmJiBzWzJdID09ICcvJykKKyAgICBzICs9IDM7CisgIGVsc2UKKyAgICBzID0gZW5kcG9pbnQ7CisgIG4gPSBzdHJsZW4ocyk7CisgIGlmIChuID49IHNpemVvZihzb2FwLT5ob3N0KSkKKyAgICBuID0gc2l6ZW9mKHNvYXAtPmhvc3QpIC0gMTsKKyNpZmRlZiBXSVRIX0lQVjYKKyAgaWYgKHNbMF0gPT0gJ1snKQorICB7IHMrKzsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIHsgc29hcC0+aG9zdFtpXSA9IHNbaV07CisgICAgICBpZiAoc1tpXSA9PSAnXScpCisgICAgICB7IHMrKzsKKyAgICAgICAgYnJlYWs7IAorICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICB7IHNvYXAtPmhvc3RbaV0gPSBzW2ldOworICAgICAgaWYgKHNbaV0gPT0gJy8nIHx8IHNbaV0gPT0gJzonKQorICAgICAgICBicmVhazsgCisgICAgfQorICB9CisjZWxzZQorICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICB7IHNvYXAtPmhvc3RbaV0gPSBzW2ldOworICAgIGlmIChzW2ldID09ICcvJyB8fCBzW2ldID09ICc6JykKKyAgICAgIGJyZWFrOyAKKyAgfQorI2VuZGlmCisgIHNvYXAtPmhvc3RbaV0gPSAnXDAnOworICBpZiAoc1tpXSA9PSAnOicpCisgIHsgc29hcC0+cG9ydCA9IChpbnQpYXRvbChzICsgaSArIDEpOworICAgIGZvciAoaSsrOyBpIDwgbjsgaSsrKQorICAgICAgaWYgKHNbaV0gPT0gJy8nKQorICAgICAgICBicmVhazsKKyAgfQorICBpZiAoc1tpXSkKKyAgeyBzdHJuY3B5KHNvYXAtPnBhdGgsIHMgKyBpLCBzaXplb2Yoc29hcC0+cGF0aCkpOworICAgIHNvYXAtPnBhdGhbc2l6ZW9mKHNvYXAtPnBhdGgpIC0gMV0gPSAnXDAnOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfY29ubmVjdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZW5kcG9pbnQsIGNvbnN0IGNoYXIgKmFjdGlvbikKK3sgcmV0dXJuIHNvYXBfY29ubmVjdF9jb21tYW5kKHNvYXAsIFNPQVBfUE9TVCwgZW5kcG9pbnQsIGFjdGlvbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfY29ubmVjdF9jb21tYW5kKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgaHR0cF9jb21tYW5kLCBjb25zdCBjaGFyICplbmRwb2ludCwgY29uc3QgY2hhciAqYWN0aW9uKQoreyBjaGFyIGhvc3Rbc2l6ZW9mKHNvYXAtPmhvc3QpXTsKKyAgaW50IHBvcnQ7CisgIHNpemVfdCBjb3VudDsKKyAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICBzdHJjcHkoaG9zdCwgc29hcC0+aG9zdCk7IC8qIHNhdmUgdG8gY29tcGFyZSAqLworICBwb3J0ID0gc29hcC0+cG9ydDsgLyogc2F2ZSB0byBjb21wYXJlICovCisgIHNvYXBfc2V0X2VuZHBvaW50KHNvYXAsIGVuZHBvaW50KTsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPmZjb25uZWN0KQorICB7IGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mY29ubmVjdChzb2FwLCBlbmRwb2ludCwgc29hcC0+aG9zdCwgc29hcC0+cG9ydCkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGVsc2UKKyNlbmRpZgorICBpZiAoc29hcC0+Zm9wZW4gJiYgKnNvYXAtPmhvc3QpCisgIHsgc29hcC0+c3RhdHVzID0gaHR0cF9jb21tYW5kOworICAgIGlmICghc29hcC0+a2VlcF9hbGl2ZSB8fCAhc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSB8fCBzdHJjbXAoc29hcC0+aG9zdCwgaG9zdCkgfHwgc29hcC0+cG9ydCAhPSBwb3J0IHx8ICFzb2FwLT5mcG9sbCB8fCBzb2FwLT5mcG9sbChzb2FwKSkKKyAgICB7IHNvYXAtPmtlZXBfYWxpdmUgPSAwOyAvKiB0byBmb3JjZSBjbG9zZSAqLworICAgICAgc29hcC0+b21vZGUgJj0gflNPQVBfSU9fVURQOyAvKiB0byBmb3JjZSBjbG9zZSAqLworICAgICAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29ubmVjdC9yZWNvbm5lY3QgdG8gaG9zdD0nJXMnIHBhdGg9JyVzJyBwb3J0PSVkXG4iLCBzb2FwLT5ob3N0LCBzb2FwLT5wYXRoLCBzb2FwLT5wb3J0KSk7CisjaWZkZWYgV0lUSF9VRFAKKyAgICAgIGlmICghc3RybmNtcChlbmRwb2ludCwgInNvYXAudWRwOiIsIDkpKQorICAgICAgICBzb2FwLT5vbW9kZSB8PSBTT0FQX0lPX1VEUDsKKyNlbmRpZgorICAgICAgc29hcC0+c29ja2V0ID0gc29hcC0+Zm9wZW4oc29hcCwgZW5kcG9pbnQsIHNvYXAtPmhvc3QsIHNvYXAtPnBvcnQpOworICAgICAgaWYgKHNvYXAtPmVycm9yKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBzb2FwLT5rZWVwX2FsaXZlID0gKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fS0VFUEFMSVZFKSAhPSAwKTsKKyAgICB9CisgIH0KKyAgY291bnQgPSBzb2FwX2NvdW50X2F0dGFjaG1lbnRzKHNvYXApOworICBpZiAoc29hcF9iZWdpbl9zZW5kKHNvYXApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgIT0gU09BUF9JT19TVE9SRSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpICYmIGVuZHBvaW50KQorICB7IHVuc2lnbmVkIGludCBrID0gc29hcC0+bW9kZTsKKyAgICBzb2FwLT5tb2RlICY9IH4oU09BUF9JTyB8IFNPQVBfRU5DX1pMSUIpOworICAgIGlmICgoayAmIFNPQVBfSU8pICE9IFNPQVBfSU9fRkxVU0gpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fQlVGRkVSOworICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdChzb2FwLCBlbmRwb2ludCwgc29hcC0+aG9zdCwgc29hcC0+cG9ydCwgc29hcC0+cGF0aCwgYWN0aW9uLCBjb3VudCkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICAgIGlmICgoayAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgICAgeyBpZiAoc29hcF9mbHVzaChzb2FwKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyNlbmRpZgorICAgIHNvYXAtPm1vZGUgPSBrOworICB9CisgIGVsc2UgaWYgKGFjdGlvbikKKyAgICBzb2FwLT5hY3Rpb24gPSBzb2FwX3N0cmR1cChzb2FwLCBhY3Rpb24pOworICBpZiAoaHR0cF9jb21tYW5kICE9IFNPQVBfUE9TVCkKKyAgICByZXR1cm4gc29hcF9lbmRfc2VuZChzb2FwKTsKKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2NoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3MyYmFzZTY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzLCBjaGFyICp0LCBpbnQgbikKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbTsKKyAgcmVnaXN0ZXIgY2hhciAqcDsKKyAgaWYgKCF0KQorICAgIHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgKG4gKyAyKSAvIDMgKiA0ICsgMSk7CisgIGlmICghdCkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHJldHVybiBOVUxMOworICB9CisgIHAgPSB0OworICB0WzBdID0gJ1wwJzsKKyAgaWYgKCFzKQorICAgIHJldHVybiBwOworICBmb3IgKDsgbiA+IDI7IG4gLT0gMywgcyArPSAzKQorICB7IG0gPSBzWzBdOworICAgIG0gPSAobSA8PCA4KSB8IHNbMV07CisgICAgbSA9IChtIDw8IDgpIHwgc1syXTsKKyAgICBmb3IgKGkgPSA0OyBpID4gMDsgbSA+Pj0gNikKKyAgICAgIHRbLS1pXSA9IHNvYXBfYmFzZTY0b1ttICYgMHgzRl07CisgICAgdCArPSA0OworICB9CisgIHRbMF0gPSAnXDAnOworICBpZiAobiA+IDApCisgIHsgbSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgIG0gPSAobSA8PCA4KSB8ICpzKys7CisgICAgZm9yICg7IGkgPCAzOyBpKyspCisgICAgICBtIDw8PSA4OworICAgIGZvciAoaSsrOyBpID4gMDsgbSA+Pj0gNikKKyAgICAgIHRbLS1pXSA9IHNvYXBfYmFzZTY0b1ttICYgMHgzRl07CisgICAgZm9yIChpID0gMzsgaSA+IG47IGktLSkKKyAgICAgIHRbaV0gPSAnPSc7CisgICAgdFs0XSA9ICdcMCc7CisgIH0KKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9iYXNlNjQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgY2hhciAqdCwgc2l6ZV90IGwsIGludCAqbikKK3sgcmVnaXN0ZXIgaW50IGksIGosIGM7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbTsKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqcDsKKyAgaWYgKCFzIHx8ICEqcykKKyAgeyBpZiAobikKKyAgICAgICpuID0gMDsKKyAgICBpZiAoc29hcC0+ZXJyb3IpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gU09BUF9OT05fTlVMTDsKKyAgfQorICBpZiAoIXQpCisgIHsgbCA9IChzdHJsZW4ocykgKyAzKSAvIDQgKiAzOworICAgIHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgbCk7CisgIH0KKyAgaWYgKCF0KQorICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcCA9IHQ7CisgIGlmIChuKQorICAgICpuID0gMDsKKyAgZm9yICg7OykKKyAgeyBmb3IgKGkgPSAwOyBpIDwgU09BUF9CTEtMRU47IGkrKykKKyAgICB7IG0gPSAwOworICAgICAgaiA9IDA7CisgICAgICB3aGlsZSAoaiA8IDQpCisgICAgICB7IGMgPSAqcysrOworICAgICAgICBpZiAoYyA9PSAnPScgfHwgIWMpCisgICAgICAgIHsgaSAqPSAzOworICAgICAgICAgIHN3aXRjaCAoaikKKyAgICAgICAgICB7IGNhc2UgMjoKKyAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgobSA+PiA0KSAmIDB4RkYpOworICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKChtID4+IDEwKSAmIDB4RkYpOworICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKChtID4+IDIpICYgMHhGRik7CisgICAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG4pCisJICAgICpuICs9IGk7CisgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgIH0KKyAgICAgICAgYyAtPSAnKyc7CisgICAgICAgIGlmIChjID49IDAgJiYgYyA8PSA3OSkKKyAgICAgICAgeyBtID0gKG0gPDwgNikgKyBzb2FwX2Jhc2U2NGlbY107CisgICAgICAgICAgaisrOworICAgICAgICB9CisgICAgICB9CisgICAgICAqdCsrID0gKGNoYXIpKChtID4+IDE2KSAmIDB4RkYpOworICAgICAgKnQrKyA9IChjaGFyKSgobSA+PiA4KSAmIDB4RkYpOworICAgICAgKnQrKyA9IChjaGFyKShtICYgMHhGRik7CisgICAgICBpZiAobCA8IDMpCisgICAgICB7IGlmIChuKQorCSAgKm4gKz0gaTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgICB9CisgICAgICBsIC09IDM7CisgICAgfQorICAgIGlmIChuKQorICAgICAgKm4gKz0gMyAqIFNPQVBfQkxLTEVOOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjaGFyKgorU09BUF9GTUFDMgorc29hcF9zMmhleChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgdW5zaWduZWQgY2hhciAqcywgY2hhciAqdCwgaW50IG4pCit7IHJlZ2lzdGVyIGNoYXIgKnA7CisgIGlmICghdCkKKyAgICB0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIDIgKiBuICsgMSk7CisgIGlmICghdCkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHJldHVybiBOVUxMOworICB9CisgIHAgPSB0OworICB0WzBdID0gJ1wwJzsKKyAgaWYgKHMpCisgIHsgZm9yICg7IG4gPiAwOyBuLS0pCisgICAgeyByZWdpc3RlciBpbnQgbSA9ICpzKys7CisgICAgICAqdCsrID0gKGNoYXIpKChtID4+IDQpICsgKG0gPiAxNTkgPyAnYScgLSAxMCA6ICcwJykpOworICAgICAgbSAmPSAweDBGOworICAgICAgKnQrKyA9IChjaGFyKShtICsgKG0gPiA5ID8gJ2EnIC0gMTAgOiAnMCcpKTsKKyAgICB9CisgIH0KKyAgKnQrKyA9ICdcMCc7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfaGV4MnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGNoYXIgKnQsIHNpemVfdCBsLCBpbnQgKm4pCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnA7CisgIGlmICghcyB8fCAhKnMpCisgIHsgaWYgKG4pCisgICAgICAqbiA9IDA7CisgICAgaWYgKHNvYXAtPmVycm9yKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFNPQVBfTk9OX05VTEw7CisgIH0KKyAgaWYgKCF0KQorICB7IGwgPSBzdHJsZW4ocykgLyAyOworICAgIHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgbCk7CisgIH0KKyAgaWYgKCF0KQorICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcCA9IHQ7CisgIHdoaWxlIChsKQorICB7IHJlZ2lzdGVyIGludCBkMSwgZDI7CisgICAgZDEgPSAqcysrOworICAgIGlmICghZDEpCisgICAgICBicmVhazsKKyAgICBkMiA9ICpzKys7CisgICAgaWYgKCFkMikKKyAgICAgIGJyZWFrOworICAgICp0KysgPSAoKGQxID49ICdBJyA/IChkMSAmIDB4NykgKyA5IDogZDEgLSAnMCcpIDw8IDQpICsgKGQyID49ICdBJyA/IChkMiAmIDB4NykgKyA5IDogZDIgLSAnMCcpOworICAgIGwtLTsKKyAgfQorICBpZiAobikKKyAgICAqbiA9IHQgLSBwOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRodHRwaGRyKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3RhdHVzLCBzaXplX3QgY291bnQpCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnMgPSBOVUxMOworICByZWdpc3RlciBpbnQgZXJyID0gU09BUF9PSzsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqciA9IE5VTEw7CisjZW5kaWYKKyAgaWYgKHN0YXR1cyA9PSBTT0FQX0ZJTEUgJiYgc29hcC0+aHR0cF9jb250ZW50KQorICAgIHMgPSBzb2FwLT5odHRwX2NvbnRlbnQ7CisgIGVsc2UgaWYgKHN0YXR1cyA9PSBTT0FQX0hUTUwpCisgICAgcyA9ICJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiOworICBlbHNlIGlmIChjb3VudCB8fCAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKSkKKyAgeyBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICAgICAgcyA9ICJhcHBsaWNhdGlvbi9zb2FwK3htbDsgY2hhcnNldD11dGYtOCI7CisgICAgZWxzZQorICAgICAgcyA9ICJ0ZXh0L3htbDsgY2hhcnNldD11dGYtOCI7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPm1vZGUgJiAoU09BUF9FTkNfRElNRSB8IFNPQVBfRU5DX01UT00pKQorICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkKKyAgICB7IHIgPSBzOworICAgICAgcyA9ICJhcHBsaWNhdGlvbi94b3AreG1sOyBjaGFyc2V0PXV0Zi04IjsKKyAgICB9CisgICAgZWxzZQorICAgICAgcyA9ICJhcHBsaWNhdGlvbi9kaW1lIjsKKyAgfQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKSAmJiBzb2FwLT5taW1lLmJvdW5kYXJ5ICYmIHNvYXAtPnN0YXR1cyAhPSBTT0FQX0dFVCkKKyAgeyByZWdpc3RlciBjb25zdCBjaGFyICp0ID0gc3RyY2hyKHMsICc7Jyk7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICJtdWx0aXBhcnQvcmVsYXRlZDsgYm91bmRhcnk9XCIlc1wiOyB0eXBlPVwiIiwgc29hcC0+bWltZS5ib3VuZGFyeSk7CisgICAgaWYgKHQpCisgICAgICBzdHJuY2F0KHNvYXAtPnRtcGJ1ZiwgcywgdCAtIHMpOworICAgIGVsc2UKKyAgICAgIHN0cmNhdChzb2FwLT50bXBidWYsIHMpOworICAgIGlmIChzb2FwLT5taW1lLnN0YXJ0KQorICAgIHsgc3RyY2F0KHNvYXAtPnRtcGJ1ZiwgIlwiOyBzdGFydD1cIiIpOworICAgICAgc3RyY2F0KHNvYXAtPnRtcGJ1Ziwgc29hcC0+bWltZS5zdGFydCk7CisgICAgfQorICAgIHN0cmNhdChzb2FwLT50bXBidWYsICJcIiIpOworICAgIGlmIChyKQorICAgIHsgc3RyY2F0KHNvYXAtPnRtcGJ1ZiwgIjsgc3RhcnQtaW5mbz1cIiIpOworICAgICAgc3RyY2F0KHNvYXAtPnRtcGJ1Ziwgcik7CisgICAgICBzdHJjYXQoc29hcC0+dG1wYnVmLCAiXCIiKTsKKyAgICB9CisgICAgcyA9IHNvYXAtPnRtcGJ1ZjsKKyAgfQorI2VuZGlmCisgIGlmIChzICYmIChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQ29udGVudC1UeXBlIiwgcykpKQorICAgIHJldHVybiBlcnI7CisjaWZkZWYgV0lUSF9aTElCCisgIGlmIChzb2FwLT5vbW9kZSAmIFNPQVBfRU5DX1pMSUIpCisgIHsKKyNpZmRlZiBXSVRIX0daSVAKKyAgICBlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQ29udGVudC1FbmNvZGluZyIsICJnemlwIik7CisjZWxzZQorICAgIGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJDb250ZW50LUVuY29kaW5nIiwgImRlZmxhdGUiKTsKKyNlbmRpZgorICAgIGlmIChlcnIpCisgICAgICByZXR1cm4gZXJyOworICB9CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgICAgZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlRyYW5zZmVyLUVuY29kaW5nIiwgImNodW5rZWQiKTsKKyAgZWxzZQorI2VuZGlmCisgIGlmIChzb2FwLT5zdGF0dXMgIT0gU09BUF9HRVQpCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICIlbHUiLCAodW5zaWduZWQgbG9uZyljb3VudCk7CisgICAgZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkNvbnRlbnQtTGVuZ3RoIiwgc29hcC0+dG1wYnVmKTsKKyAgfQorICBpZiAoZXJyKQorICAgIHJldHVybiBlcnI7CisgIHJldHVybiBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQ29ubmVjdGlvbiIsIHNvYXAtPmtlZXBfYWxpdmUgPyAia2VlcC1hbGl2ZSIgOiAiY2xvc2UiKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAoraHR0cF9nZXQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJldHVybiBTT0FQX0dFVF9NRVRIT0Q7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK2h0dHBfcG9zdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZW5kcG9pbnQsIGNvbnN0IGNoYXIgKmhvc3QsIGludCBwb3J0LCBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICphY3Rpb24sIHNpemVfdCBjb3VudCkKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKKyAgcmVnaXN0ZXIgaW50IGVycjsKKyAgaWYgKHNvYXAtPnN0YXR1cyA9PSBTT0FQX0dFVCkKKyAgICBzID0gIkdFVCI7CisgIGVsc2UKKyAgICBzID0gIlBPU1QiOworI2lmZGVmIFBBTE0KKyAgaWYgKCFlbmRwb2ludCB8fCAoc3RybmNtcChlbmRwb2ludCwgImh0dHA6IiwgNSkgJiYgc3RybmNtcChlbmRwb2ludCwgImh0dHBzOiIsIDYpICYmIHN0cm5jbXAoZW5kcG9pbnQsICJodHRwZzoiLCA2KSkgJiYgc3RybmNtcChlbmRwb2ludCwgIl9iZWFtOiIsIDYpICYmIHN0cm5jbXAoZW5kcG9pbnQsICJfbG9jYWw6IiwgNykgJiYgc3RybmNtcChlbmRwb2ludCwgIl9idG9iZXg6IiwgOCkpCisjZWxzZQorICBpZiAoIWVuZHBvaW50IHx8IChzdHJuY21wKGVuZHBvaW50LCAiaHR0cDoiLCA1KSAmJiBzdHJuY21wKGVuZHBvaW50LCAiaHR0cHM6IiwgNikgJiYgc3RybmNtcChlbmRwb2ludCwgImh0dHBnOiIsIDYpKSkKKyNlbmRpZgorICAgIHJldHVybiBTT0FQX09LOworICBpZiAoc29hcC0+cHJveHlfaG9zdCAmJiBzdHJuY21wKGVuZHBvaW50LCAiaHR0cHM6IiwgNikpCisgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICIlcyAlcyBIVFRQLyVzIiwgcywgZW5kcG9pbnQsIHNvYXAtPmh0dHBfdmVyc2lvbik7CisgIGVsc2UKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIiVzIC8lcyBIVFRQLyVzIiwgcywgKCpwYXRoID09ICcvJyA/IHBhdGggKyAxIDogcGF0aCksIHNvYXAtPmh0dHBfdmVyc2lvbik7CisgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgc29hcC0+dG1wYnVmLCBOVUxMKSkpCisgICAgcmV0dXJuIGVycjsKKyAgaWYgKHBvcnQgIT0gODApCisgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICIlczolZCIsIGhvc3QsIHBvcnQpOworICBlbHNlCisgICAgc3RyY3B5KHNvYXAtPnRtcGJ1ZiwgaG9zdCk7IAorICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJIb3N0Iiwgc29hcC0+dG1wYnVmKSkKKyAgIHx8IChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiVXNlci1BZ2VudCIsICJnU09BUC8yLjciKSkKKyAgIHx8IChlcnIgPSBzb2FwX3B1dGh0dHBoZHIoc29hcCwgU09BUF9PSywgY291bnQpKSkKKyAgICByZXR1cm4gZXJyOworI2lmZGVmIFdJVEhfWkxJQgorI2lmZGVmIFdJVEhfR1pJUAorICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJBY2NlcHQtRW5jb2RpbmciLCAiZ3ppcCwgZGVmbGF0ZSIpKSkKKyNlbHNlCisgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkFjY2VwdC1FbmNvZGluZyIsICJkZWZsYXRlIikpKQorI2VuZGlmCisgICAgcmV0dXJuIGVycjsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPnVzZXJpZCAmJiBzb2FwLT5wYXNzd2QgJiYgc3RybGVuKHNvYXAtPnVzZXJpZCkgKyBzdHJsZW4oc29hcC0+cGFzc3dkKSA8IDc2MSkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIDI2MiwgIiVzOiVzIiwgc29hcC0+dXNlcmlkLCBzb2FwLT5wYXNzd2QpOworICAgIHN0cmNweShzb2FwLT50bXBidWYsICJCYXNpYyAiKTsKKyAgICBzb2FwX3MyYmFzZTY0KHNvYXAsIChjb25zdCB1bnNpZ25lZCBjaGFyKikoc29hcC0+dG1wYnVmICsgMjYyKSwgc29hcC0+dG1wYnVmICsgNiwgc3RybGVuKHNvYXAtPnRtcGJ1ZiArIDI2MikpOworICAgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkF1dGhvcml6YXRpb24iLCBzb2FwLT50bXBidWYpKSkKKyAgICAgIHJldHVybiBlcnI7CisgIH0KKyAgaWYgKHNvYXAtPnByb3h5X3VzZXJpZCAmJiBzb2FwLT5wcm94eV9wYXNzd2QgJiYgc3RybGVuKHNvYXAtPnByb3h5X3VzZXJpZCkgKyBzdHJsZW4oc29hcC0+cHJveHlfcGFzc3dkKSA8IDc2MSkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIDI2MiwgIiVzOiVzIiwgc29hcC0+cHJveHlfdXNlcmlkLCBzb2FwLT5wcm94eV9wYXNzd2QpOworICAgIHN0cmNweShzb2FwLT50bXBidWYsICJCYXNpYyAiKTsKKyAgICBzb2FwX3MyYmFzZTY0KHNvYXAsIChjb25zdCB1bnNpZ25lZCBjaGFyKikoc29hcC0+dG1wYnVmICsgMjYyKSwgc29hcC0+dG1wYnVmICsgNiwgc3RybGVuKHNvYXAtPnRtcGJ1ZiArIDI2MikpOworICAgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlByb3h5LUF1dGhvcml6YXRpb24iLCBzb2FwLT50bXBidWYpKSkKKyAgICAgIHJldHVybiBlcnI7CisgIH0KKyNlbmRpZgorI2lmZGVmIFdJVEhfQ09PS0lFUworI2lmZGVmIFdJVEhfT1BFTlNTTAorICBpZiAoc29hcF9wdXRjb29raWVzKHNvYXAsIGhvc3QsIHBhdGgsIHNvYXAtPnNzbCAhPSBOVUxMKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjZWxzZQorICBpZiAoc29hcF9wdXRjb29raWVzKHNvYXAsIGhvc3QsIHBhdGgsIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNlbmRpZgorI2VuZGlmCisgIGlmIChhY3Rpb24gJiYgc29hcC0+dmVyc2lvbiA9PSAxKQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiXCIlc1wiIiwgYWN0aW9uKTsKKyAgICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJTT0FQQWN0aW9uIiwgc29hcC0+dG1wYnVmKSkpCisgICAgICByZXR1cm4gZXJyOworICB9CisgIHJldHVybiBzb2FwLT5mcG9zdGhkcihzb2FwLCBOVUxMLCBOVUxMKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAoraHR0cF9zZW5kX2hlYWRlcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcykKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqdDsKKyAgZG8KKyAgeyB0ID0gc3RyY2hyKHMsICdcbicpOyAvKiBkaXNhbGxvdyBcbiBpbiBIVFRQIGhlYWRlcnMgKi8KKyAgICBpZiAoIXQpCisgICAgICB0ID0gcyArIHN0cmxlbihzKTsKKyAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcykpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgcyA9IHQgKyAxOworICB9IHdoaWxlICgqdCk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50CitodHRwX3Bvc3RfaGVhZGVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbCkKK3sgaWYgKGtleSkKKyAgeyBpZiAoaHR0cF9zZW5kX2hlYWRlcihzb2FwLCBrZXkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmICh2YWwgJiYgKHNvYXBfc2VuZF9yYXcoc29hcCwgIjogIiwgMikgfHwgaHR0cF9zZW5kX2hlYWRlcihzb2FwLCB2YWwpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCAiXHJcbiIsIDIpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50CitodHRwX3Jlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3RhdHVzLCBzaXplX3QgY291bnQpCit7IHJlZ2lzdGVyIGludCBlcnI7CisjaWZkZWYgV01XX1JQTV9JTworICBpZiAoc29hcC0+cnBtcmVxaWQpCisgICAgaHR0cE91dHB1dEVuYWJsZShzb2FwLT5ycG1yZXFpZCk7CisjZW5kaWYKKyAgaWYgKCFzdGF0dXMgfHwgc3RhdHVzID09IFNPQVBfSFRNTCB8fCBzdGF0dXMgPT0gU09BUF9GSUxFKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiT0sgMjAwXG4iKSk7CisjaWZkZWYgV01XX1JQTV9JTworICAgIGlmIChzb2FwLT5ycG1yZXFpZCB8fCBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpIHx8IHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpIC8qIFJQTSBiZWhhdmVzIGFzIGlmIHN0YW5kYWxvbmUgKi8KKyNlbHNlCisgICAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikgfHwgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkgLyogc3RhbmRhbG9uZSBhcHBsaWNhdGlvbiAqLworI2VuZGlmCisgICAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIkhUVFAvJXMgMjAwIE9LIiwgc29hcC0+aHR0cF92ZXJzaW9uKTsKKyAgICAgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgc29hcC0+dG1wYnVmLCBOVUxMKSkpCisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGVsc2UgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiU3RhdHVzIiwgIjIwMCBPSyIpKSkKKyAgICAgIHJldHVybiBlcnI7CisgIH0KKyAgZWxzZSBpZiAoc3RhdHVzID4gMjAwICYmIHN0YXR1cyA8IDYwMCkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIkhUVFAvJXMgJWQgJXMiLCBzb2FwLT5odHRwX3ZlcnNpb24sIHN0YXR1cywgaHR0cF9lcnJvcihzb2FwLCBzdGF0dXMpKTsKKyAgICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgTlVMTCkpKQorICAgICAgcmV0dXJuIGVycjsKKyNpZm5kZWYgV0lUSF9MRUFOIAorICAgIGlmIChzdGF0dXMgPT0gNDAxKQorICAgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJCYXNpYyByZWFsbT1cIiVzXCIiLCBzb2FwLT5hdXRocmVhbG0gPyBzb2FwLT5hdXRocmVhbG0gOiAiZ1NPQVAgV2ViIFNlcnZpY2UiKTsKKyAgICAgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIldXVy1BdXRoZW50aWNhdGUiLCBzb2FwLT50bXBidWYpKSkKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgZWxzZSBpZiAoKHN0YXR1cyA+PSAzMDEgJiYgc3RhdHVzIDw9IDMwMykgfHwgc3RhdHVzID09IDMwNykKKyAgICB7IGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkxvY2F0aW9uIiwgc29hcC0+ZW5kcG9pbnQpKSkKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisjZW5kaWYKKyAgfQorICBlbHNlCisgIHsgY29uc3QgY2hhciAqcyA9ICpzb2FwX2ZhdWx0Y29kZShzb2FwKTsKKyAgICBpZiAoc29hcC0+dmVyc2lvbiA9PSAyICYmICFzdHJjbXAocywgIlNPQVAtRU5WOlNlbmRlciIpKQorICAgICAgcyA9ICI0MDAgQmFkIFJlcXVlc3QiOworICAgIGVsc2UKKyAgICAgIHMgPSAiNTAwIEludGVybmFsIFNlcnZlciBFcnJvciI7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFcnJvciAlcyAoc3RhdHVzPSVkKVxuIiwgcywgc3RhdHVzKSk7CisjaWZkZWYgV01XX1JQTV9JTworICAgIGlmIChzb2FwLT5ycG1yZXFpZCB8fCBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpIHx8IHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpIC8qIFJQTSBiZWhhdmVzIGFzIGlmIHN0YW5kYWxvbmUgKi8KKyNlbHNlCisgICAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikgfHwgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkgLyogc3RhbmRhbG9uZSBhcHBsaWNhdGlvbiAqLworI2VuZGlmCisgICAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIkhUVFAvJXMgJXMiLCBzb2FwLT5odHRwX3ZlcnNpb24sIHMpOworICAgICAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCBzb2FwLT50bXBidWYsIE5VTEwpKSkKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgZWxzZSBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJTdGF0dXMiLCBzKSkpCisgICAgICByZXR1cm4gZXJyOworICB9CisgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlNlcnZlciIsICJnU09BUC8yLjciKSkKKyAgIHx8IChlcnIgPSBzb2FwX3B1dGh0dHBoZHIoc29hcCwgc3RhdHVzLCBjb3VudCkpKQorICAgIHJldHVybiBlcnI7CisjaWZkZWYgV0lUSF9DT09LSUVTCisgIGlmIChzb2FwX3B1dHNldGNvb2tpZXMoc29hcCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2VuZGlmCisgIHJldHVybiBzb2FwLT5mcG9zdGhkcihzb2FwLCBOVUxMLCBOVUxMKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3Jlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3RhdHVzKQoreyByZWdpc3RlciBzaXplX3QgY291bnQ7CisgIGlmICghKHNvYXAtPm9tb2RlICYgKFNPQVBfRU5DX1hNTCB8IFNPQVBfSU9fU1RPUkUgLyogdGhpcyB0ZXN0cyBmb3IgY2h1bmtpbmcgdG9vICovKSkKKyAgICYmIChzdGF0dXMgPT0gU09BUF9IVE1MIHx8IHN0YXR1cyA9PSBTT0FQX0ZJTEUpKQorICB7IHNvYXAtPm9tb2RlICY9IH5TT0FQX0lPOworICAgIHNvYXAtPm9tb2RlIHw9IFNPQVBfSU9fU1RPUkU7CisgIH0KKyAgc29hcC0+c3RhdHVzID0gc3RhdHVzOworICBjb3VudCA9IHNvYXBfY291bnRfYXR0YWNobWVudHMoc29hcCk7CisgIGlmIChzb2FwX2JlZ2luX3NlbmQoc29hcCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmbmRlZiBXSVRIX05PSFRUUAorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSAhPSBTT0FQX0lPX1NUT1JFICYmICEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1hNTCkpCisgIHsgcmVnaXN0ZXIgaW50IG4gPSBzb2FwLT5tb2RlOworICAgIHNvYXAtPm1vZGUgJj0gfihTT0FQX0lPIHwgU09BUF9FTkNfWkxJQik7CisgICAgaWYgKChuICYgU09BUF9JTykgIT0gU09BUF9JT19GTFVTSCkKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19CVUZGRVI7CisgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZyZXNwb25zZShzb2FwLCBzdGF0dXMsIGNvdW50KSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgICAgaWYgKChuICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgICB7IGlmIChzb2FwX2ZsdXNoKHNvYXApKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorI2VuZGlmCisgICAgc29hcC0+bW9kZSA9IG47CisgIH0KKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBjb25zdCBjaGFyKgorc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqdCkKK3sgaWYgKCpzb2FwLT50YWcpCisgICAgc3ByaW50Zihzb2FwLT5tc2didWYsICJWYWxpZGF0aW9uIGNvbnN0cmFpbnQgdmlvbGF0aW9uOiAlcyVzIGluIGVsZW1lbnQgPCVzPiIsIHMsIHQ/dDpTT0FQX1NUUl9FT1MsIHNvYXAtPnRhZyk7CisgIGVsc2UKKyAgICBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIlZhbGlkYXRpb24gY29uc3RyYWludCB2aW9sYXRpb246ICVzJXMiLCBzLCB0P3Q6U09BUF9TVFJfRU9TKTsKKyAgcmV0dXJuIHNvYXAtPm1zZ2J1ZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBjb25zdCBjaGFyICoqYyA9IHNvYXBfZmF1bHRjb2RlKHNvYXApOworICBjb25zdCBjaGFyICoqcyA9IHNvYXBfZmF1bHRzdHJpbmcoc29hcCk7CisgIGlmICghKmMgJiYgISpzICYmIHNvYXAtPmZzZXRlcnJvcikKKyAgICBzb2FwLT5mc2V0ZXJyb3Ioc29hcCwgYywgcyk7CisgIGlmICghKmMpCisgIHsgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgICAgICpjID0gIlNPQVAtRU5WOlNlbmRlciI7CisgICAgZWxzZQorICAgICAgKmMgPSAiU09BUC1FTlY6Q2xpZW50IjsKKyAgfQorICBpZiAoKnMpCisgICAgcmV0dXJuOworICBzd2l0Y2ggKHNvYXAtPmVycm9yKQorICB7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGNhc2UgU09BUF9DTElfRkFVTFQ6CisgICAgICAqcyA9ICJDbGllbnQgZmF1bHQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1NWUl9GQVVMVDoKKyAgICAgICpzID0gIlNlcnZlciBmYXVsdCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfVEFHX01JU01BVENIOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJ0YWcgbmFtZSBvciBuYW1lc3BhY2UgbWlzbWF0Y2giLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9UWVBFOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJkYXRhIHR5cGUgbWlzbWF0Y2ggIiwgc29hcC0+dHlwZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfU1lOVEFYX0VSUk9SOgorICAgICAgKnMgPSAiV2VsbC1mb3JtZWRuZXNzIHZpb2xhdGlvbiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTk9fVEFHOgorICAgICAgKnMgPSAiTm8gWE1MIGVsZW1lbnQgdGFnIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9NVVNUVU5ERVJTVEFORDoKKyAgICAgICpjID0gIlNPQVAtRU5WOk11c3RVbmRlcnN0YW5kIjsKKyAgICAgIHNwcmludGYoc29hcC0+bXNnYnVmLCAiVGhlIGRhdGEgaW4gZWxlbWVudCAnJXMnIG11c3QgYmUgdW5kZXJzdG9vZCBidXQgY2Fubm90IGJlIGhhbmRsZWQiLCBzb2FwLT50YWcpOworICAgICAgKnMgPSBzb2FwLT5tc2didWY7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfVkVSU0lPTk1JU01BVENIOgorICAgICAgKmMgPSAiU09BUC1FTlY6VmVyc2lvbk1pc21hdGNoIjsKKyAgICAgICpzID0gIlNPQVAgdmVyc2lvbiBtaXNtYXRjaCBvciBpbnZhbGlkIFNPQVAgbWVzc2FnZSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfREFUQUVOQ09ESU5HVU5LTk9XTjoKKyAgICAgICpjID0gIlNPQVAtRU5WOkRhdGFFbmNvZGluZ1Vua25vd24iOworICAgICAgKnMgPSAiVW5zdXBwb3J0ZWQgU09BUCBkYXRhIGVuY29kaW5nIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9OQU1FU1BBQ0U6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgIm5hbWVzcGFjZSBtaXNtYXRjaCIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1VTRVJfRVJST1I6CisgICAgICAqcyA9ICJVc2VyIGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9GQVRBTF9FUlJPUjoKKyAgICAgICpzID0gIkZhdGFsIGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9OT19NRVRIT0Q6CisgICAgICBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIk1ldGhvZCAnJXMnIG5vdCBpbXBsZW1lbnRlZDogbWV0aG9kIG5hbWUgb3IgbmFtZXNwYWNlIG5vdCByZWNvZ25pemVkIiwgc29hcC0+dGFnKTsKKyAgICAgICpzID0gc29hcC0+bXNnYnVmOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0dFVF9NRVRIT0Q6CisgICAgICAqcyA9ICJIVFRQIEdFVCBtZXRob2Qgbm90IGltcGxlbWVudGVkIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9FT006CisgICAgICAqcyA9ICJPdXQgb2YgbWVtb3J5IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9JT0I6CisgICAgICAqcyA9ICJBcnJheSBpbmRleCBvdXQgb2YgYm91bmRzIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9OVUxMOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJuaWwgbm90IGFsbG93ZWQiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9EVVBMSUNBVEVfSUQ6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgIm11bHRpcGxlIGRlZmluaXRpb25zIG9mIGlkICIsIHNvYXAtPmlkKTsKKyAgICAgIGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgICAgICAgICpzb2FwX2ZhdWx0c3ViY29kZShzb2FwKSA9ICJTT0FQLUVOQzpEdXBsaWNhdGVJRCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTUlTU0lOR19JRDoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAibWlzc2luZyBpZCBmb3IgcmVmICIsIHNvYXAtPmlkKTsKKyAgICAgIGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgICAgICAgICpzb2FwX2ZhdWx0c3ViY29kZShzb2FwKSA9ICJTT0FQLUVOQzpNaXNzaW5nSUQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0hSRUY6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgImluY29tcGF0aWJsZSBvYmplY3QgcmVmICIsIHNvYXAtPmlkKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9GQVVMVDoKKyAgICAgIGJyZWFrOworI2lmbmRlZiBXSVRIX05PSU8KKyAgICBjYXNlIFNPQVBfVURQX0VSUk9SOgorICAgICAgKnMgPSAiTWVzc2FnZSB0b28gbGFyZ2UgZm9yIFVEUCBwYWNrZXQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1RDUF9FUlJPUjoKKyAgICAgICpzID0gdGNwX2Vycm9yKHNvYXApOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIFNPQVBfSFRUUF9FUlJPUjoKKyAgICAgICpzID0gIkhUVFAgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1NTTF9FUlJPUjoKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICAgICpzID0gIlNTTCBlcnJvciI7CisjZWxzZQorICAgICAgKnMgPSAiT3BlblNTTCBub3QgaW5zdGFsbGVkOiByZWNvbXBpbGUgd2l0aCAtRFdJVEhfT1BFTlNTTCI7CisjZW5kaWYKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9QTFVHSU5fRVJST1I6CisgICAgICAqcyA9ICJQbHVnaW4gcmVnaXN0cnkgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0RJTUVfRVJST1I6CisgICAgICAqcyA9ICJESU1FIGZvcm1hdCBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfRElNRV9IUkVGOgorICAgICAgKnMgPSAiRElNRSBocmVmIHRvIG1pc3NpbmcgYXR0YWNobWVudCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfRElNRV9NSVNNQVRDSDoKKyAgICAgICpzID0gIkRJTUUgdmVyc2lvbi90cmFuc21pc3Npb24gZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0RJTUVfRU5EOgorICAgICAgKnMgPSAiRW5kIG9mIERJTUUgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX01JTUVfRVJST1I6CisgICAgICAqcyA9ICJNSU1FIGZvcm1hdCBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTUlNRV9IUkVGOgorICAgICAgKnMgPSAiTUlNRSBocmVmIHRvIG1pc3NpbmcgYXR0YWNobWVudCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTUlNRV9FTkQ6CisgICAgICAqcyA9ICJFbmQgb2YgTUlNRSBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfWkxJQl9FUlJPUjoKKyNpZmRlZiBXSVRIX1pMSUIKKyAgICAgIHNwcmludGYoc29hcC0+bXNnYnVmLCAiWmxpYi9nemlwIGVycm9yOiAnJXMnIiwgc29hcC0+ZF9zdHJlYW0ubXNnP3NvYXAtPmRfc3RyZWFtLm1zZzoiIik7CisgICAgICAqcyA9IHNvYXAtPm1zZ2J1ZjsKKyNlbHNlCisgICAgICAqcyA9ICJabGliL2d6aXAgbm90IGluc3RhbGxlZCBmb3IgKGRlKWNvbXByZXNzaW9uOiByZWNvbXBpbGUgd2l0aCAtRFdJVEhfR1pJUCI7CisjZW5kaWYKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9SRVFVSVJFRDoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAibWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGUiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9QUk9ISUJJVEVEOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJwcm9oaWJpdGVkIGF0dHJpYnV0ZSBwcmVzZW50IiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfT0NDVVJTOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJtaW4vbWF4T2NjdXJzIHZpb2xhdGlvbiIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0xFTkdUSDoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAiY29udGVudCBsZW5ndGggdmlvbGF0aW9uIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfU1RPUDoKKyAgICAgICpzID0gIlN0b3BwZWQ6IG5vIHJlc3BvbnNlIHNlbnQiOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIFNPQVBfRU9GOgorI2lmbmRlZiBXSVRIX05PSU8KKyAgICAgIHNwcmludGYoc29hcC0+bXNnYnVmLCAiRW5kIG9mIGZpbGUgb3Igbm8gaW5wdXQ6ICclcyciLCBzb2FwX3N0cmVycm9yKHNvYXApKTsKKyAgICAgICpzID0gc29hcC0+bXNnYnVmOworICAgICAgYnJlYWs7CisjZWxzZQorICAgICAgKnMgPSAiRW5kIG9mIGZpbGUgb3Igbm8gaW5wdXQiOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIGlmIChzb2FwLT5lcnJvciA+IDIwMCAmJiBzb2FwLT5lcnJvciA8IDYwMCkKKyAgICAgIHsgc3ByaW50Zihzb2FwLT5tc2didWYsICJIVFRQIEVycm9yOiAlZCAlcyIsIHNvYXAtPmVycm9yLCBodHRwX2Vycm9yKHNvYXAsIHNvYXAtPmVycm9yKSk7CisgICAgICAgICpzID0gc29hcC0+bXNnYnVmOworICAgICAgfQorICAgICAgZWxzZQorI2VuZGlmCisjZW5kaWYKKyAgICAgIHsgc3ByaW50Zihzb2FwLT5tc2didWYsICJFcnJvciAlZCIsIHNvYXAtPmVycm9yKTsKKyAgICAgICAgKnMgPSBzb2FwLT5tc2didWY7CisgICAgICB9CisgICAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmRfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBzdGF0dXMgPSBzb2FwLT5lcnJvcjsKKyAgaW50IHIgPSAxOworICBpZiAoc3RhdHVzID09IFNPQVBfU1RPUCkKKyAgICByZXR1cm4gc3RhdHVzOworICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2VuZGluZyBiYWNrIGZhdWx0IHN0cnVjdCBmb3IgZXJyb3IgY29kZSAlZFxuIiwgc29hcC0+ZXJyb3IpKTsKKyAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7IC8qIHRvIHRlcm1pbmF0ZSBjb25uZWN0aW9uICovCisgIHNvYXBfc2V0X2ZhdWx0KHNvYXApOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgZmRfc2V0IHJmZCwgc2ZkOworICAgIHRpbWVvdXQudHZfc2VjID0gMDsKKyAgICB0aW1lb3V0LnR2X3VzZWMgPSAwOworICAgIEZEX1pFUk8oJnJmZCk7CisgICAgRkRfWkVSTygmc2ZkKTsKKyAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnJmZCk7CisgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZzZmQpOworICAgIHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgJnJmZCwgJnNmZCwgTlVMTCwgJnRpbWVvdXQpOworICAgIGlmIChyID4gMCkKKyAgICB7IGlmICghRkRfSVNTRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnNmZCkKKyAgICAgICB8fCAoRkRfSVNTRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnJmZCkKKyAgICAgICAgJiYgcmVjdigoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzb2FwLT50bXBidWYsIDEsIE1TR19QRUVLKSA8IDApKQorICAgICAgICByID0gMDsKKyAgICB9CisgIH0KKyNlbmRpZgorI2VuZGlmCisgIGlmICgoc3RhdHVzICE9IFNPQVBfRU9GIHx8ICghc29hcC0+cmVjdl90aW1lb3V0ICYmICFzb2FwLT5zZW5kX3RpbWVvdXQpKSAmJiByID4gMCkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgICAgc29hcF9zZXJpYWxpemVoZWFkZXIoc29hcCk7CisgICAgc29hcF9zZXJpYWxpemVmYXVsdChzb2FwKTsKKyAgICBzb2FwX2JlZ2luX2NvdW50KHNvYXApOworICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgeyBzb2FwX2VudmVsb3BlX2JlZ2luX291dChzb2FwKTsKKyAgICAgIHNvYXBfcHV0aGVhZGVyKHNvYXApOworICAgICAgc29hcF9ib2R5X2JlZ2luX291dChzb2FwKTsKKyAgICAgIHNvYXBfcHV0ZmF1bHQoc29hcCk7CisgICAgICBzb2FwX2JvZHlfZW5kX291dChzb2FwKTsKKyAgICAgIHNvYXBfZW52ZWxvcGVfZW5kX291dChzb2FwKTsKKyAgICB9CisgICAgc29hcF9lbmRfY291bnQoc29hcCk7CisgICAgaWYgKHNvYXBfcmVzcG9uc2Uoc29hcCwgc3RhdHVzKQorICAgICB8fCBzb2FwX2VudmVsb3BlX2JlZ2luX291dChzb2FwKQorICAgICB8fCBzb2FwX3B1dGhlYWRlcihzb2FwKQorICAgICB8fCBzb2FwX2JvZHlfYmVnaW5fb3V0KHNvYXApCisgICAgIHx8IHNvYXBfcHV0ZmF1bHQoc29hcCkKKyAgICAgfHwgc29hcF9ib2R5X2VuZF9vdXQoc29hcCkKKyAgICAgfHwgc29hcF9lbnZlbG9wZV9lbmRfb3V0KHNvYXApKQorICAgICAgcmV0dXJuIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgIHNvYXBfZW5kX3NlbmQoc29hcCk7CisgIH0KKyAgc29hcC0+ZXJyb3IgPSBzdGF0dXM7CisgIHJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWN2X2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgc3RhdHVzID0gc29hcC0+ZXJyb3I7CisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWNlaXZpbmcgU09BUCBGYXVsdFxuIikpOworICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIGlmIChzb2FwX2dldGZhdWx0KHNvYXApKQorICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJFcnJvcjogc29hcF9nZXRfc29hcGZhdWx0KCkgZmFpbGVkLiBJcyB0aGlzIGEgU09BUCBtZXNzYWdlIGF0IGFsbD9cbiIpKTsKKyAgICAqc29hcF9mYXVsdGNvZGUoc29hcCkgPSAoc29hcC0+dmVyc2lvbiA9PSAyID8gIlNPQVAtRU5WOlNlbmRlciIgOiAiU09BUC1FTlY6Q2xpZW50Iik7CisgICAgc29hcC0+ZXJyb3IgPSBzdGF0dXM7CisgICAgc29hcF9zZXRfZmF1bHQoc29hcCk7CisgIH0KKyAgZWxzZQorICB7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnMgPSAqc29hcF9mYXVsdGNvZGUoc29hcCk7CisgICAgaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCBzLCAiU09BUC1FTlY6U2VydmVyIikgfHwgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHMsICJTT0FQLUVOVjpSZWNlaXZlciIpKQorICAgICAgc3RhdHVzID0gU09BUF9TVlJfRkFVTFQ7IAorICAgIGVsc2UgaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCBzLCAiU09BUC1FTlY6Q2xpZW50IikgfHwgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHMsICJTT0FQLUVOVjpTZW5kZXIiKSkKKyAgICAgIHN0YXR1cyA9IFNPQVBfQ0xJX0ZBVUxUOworICAgIGVsc2UgaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCBzLCAiU09BUC1FTlY6TXVzdFVuZGVyc3RhbmQiKSkKKyAgICAgIHN0YXR1cyA9IFNPQVBfTVVTVFVOREVSU1RBTkQ7CisgICAgZWxzZSBpZiAoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHMsICJTT0FQLUVOVjpWZXJzaW9uTWlzbWF0Y2giKSkKKyAgICAgIHN0YXR1cyA9IFNPQVBfVkVSU0lPTk1JU01BVENIOworICAgIGVsc2UKKyAgICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJGYXVsdCBjb2RlICVzXG4iLCBzKSk7CisgICAgICBzdGF0dXMgPSBTT0FQX0ZBVUxUOworICAgIH0KKyAgICBpZiAoc29hcF9ib2R5X2VuZF9pbihzb2FwKQorICAgICB8fCBzb2FwX2VudmVsb3BlX2VuZF9pbihzb2FwKQorICAgICB8fCBzb2FwX2VuZF9yZWN2KHNvYXApKQorICAgICAgcmV0dXJuIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgIHNvYXAtPmVycm9yID0gc3RhdHVzOworICB9CisgIHJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZW5kX2VtcHR5X3Jlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5jb3VudCA9IDA7CisgIGlmIChzb2FwX3Jlc3BvbnNlKHNvYXAsIFNPQVBfT0spIHx8IHNvYXBfZW5kX3NlbmQoc29hcCkpCisgICAgcmV0dXJuIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlY3ZfZW1wdHlfcmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwX2JlZ2luX3JlY3Yoc29hcCkgfHwgc29hcF9lbmRfcmVjdihzb2FwKSkKKyAgICByZXR1cm4gc29hcF9jbG9zZXNvY2soc29hcCk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNvbnN0IGNoYXIqCitzb2FwX3N0cmVycm9yKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgZXJyID0gc29hcC0+ZXJybnVtOworICBpZiAoZXJyKQorICB7CisjaWZuZGVmIFdJTjMyCisgICAgcmV0dXJuIHN0cmVycm9yKGVycik7CisjZWxzZQorICAgIEZvcm1hdE1lc3NhZ2UoRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU18Rk9STUFUX01FU1NBR0VfSUdOT1JFX0lOU0VSVFMsIE5VTEwsIGVyciwgMCwgKExQVFNUUikmc29hcC0+ZXJyb3JzdHIsIHNpemVvZihzb2FwLT5lcnJvcnN0ciksIE5VTEwpOworICAgIHJldHVybiBzb2FwLT5lcnJvcnN0cjsKKyNlbmRpZgorICB9CisgIHJldHVybiAiT3BlcmF0aW9uIGludGVycnVwdGVkIG9yIHRpbWVkIG91dCI7Cit9CisjZW5kaWYKKyNlbmRpZiAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitzdGF0aWMgaW50Citzb2FwX3NldF9lcnJvcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRjb2RlLCBjb25zdCBjaGFyICpmYXVsdHN1YmNvZGUsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCwgaW50IHNvYXBlcnJvcikKK3sgKnNvYXBfZmF1bHRjb2RlKHNvYXApID0gZmF1bHRjb2RlOworICBpZiAoZmF1bHRzdWJjb2RlKQorICAgICpzb2FwX2ZhdWx0c3ViY29kZShzb2FwKSA9IGZhdWx0c3ViY29kZTsKKyAgKnNvYXBfZmF1bHRzdHJpbmcoc29hcCkgPSBmYXVsdHN0cmluZzsKKyAgaWYgKGZhdWx0ZGV0YWlsICYmICpmYXVsdGRldGFpbCkKKyAgeyByZWdpc3RlciBjb25zdCBjaGFyICoqcyA9IHNvYXBfZmF1bHRkZXRhaWwoc29hcCk7CisgICAgaWYgKHMpCisgICAgICAqcyA9IGZhdWx0ZGV0YWlsOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvciA9IHNvYXBlcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZXRfc2VuZGVyX2Vycm9yKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdHN0cmluZywgY29uc3QgY2hhciAqZmF1bHRkZXRhaWwsIGludCBzb2FwZXJyb3IpCit7IHJldHVybiBzb2FwX3NldF9lcnJvcihzb2FwLCBzb2FwLT52ZXJzaW9uID09IDIgPyAiU09BUC1FTlY6U2VuZGVyIiA6ICJTT0FQLUVOVjpDbGllbnQiLCBOVUxMLCBmYXVsdHN0cmluZywgZmF1bHRkZXRhaWwsIHNvYXBlcnJvcik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdHN0cmluZywgY29uc3QgY2hhciAqZmF1bHRkZXRhaWwsIGludCBzb2FwZXJyb3IpCit7IHJldHVybiBzb2FwX3NldF9lcnJvcihzb2FwLCBzb2FwLT52ZXJzaW9uID09IDIgPyAiU09BUC1FTlY6UmVjZWl2ZXIiIDogIlNPQVAtRU5WOlNlcnZlciIsIE5VTEwsIGZhdWx0c3RyaW5nLCBmYXVsdGRldGFpbCwgc29hcGVycm9yKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK3N0YXRpYyBpbnQKK3NvYXBfY29weV9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRjb2RlLCBjb25zdCBjaGFyICpmYXVsdHN1YmNvZGUsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCkKK3sgY2hhciAqciA9IE5VTEwsICpzID0gTlVMTCwgKnQgPSBOVUxMOworICBpZiAoZmF1bHRzdWJjb2RlKQorICAgIHIgPSBzb2FwX3N0cmR1cChzb2FwLCBmYXVsdHN1YmNvZGUpOworICBpZiAoZmF1bHRzdHJpbmcpCisgICAgcyA9IHNvYXBfc3RyZHVwKHNvYXAsIGZhdWx0c3RyaW5nKTsKKyAgaWYgKGZhdWx0ZGV0YWlsKQorICAgIHQgPSBzb2FwX3N0cmR1cChzb2FwLCBmYXVsdGRldGFpbCk7CisgIHJldHVybiBzb2FwX3NldF9lcnJvcihzb2FwLCBmYXVsdGNvZGUsIHIsIHMsIHQsIFNPQVBfRkFVTFQpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmRlcl9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRzdHJpbmcsIGNvbnN0IGNoYXIgKmZhdWx0ZGV0YWlsKQoreyByZXR1cm4gc29hcF9zZW5kZXJfZmF1bHRfc3ViY29kZShzb2FwLCBOVUxMLCBmYXVsdHN0cmluZywgZmF1bHRkZXRhaWwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmRlcl9mYXVsdF9zdWJjb2RlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdHN1YmNvZGUsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCkKK3sgcmV0dXJuIHNvYXBfY29weV9mYXVsdChzb2FwLCBzb2FwLT52ZXJzaW9uID09IDIgPyAiU09BUC1FTlY6U2VuZGVyIiA6ICJTT0FQLUVOVjpDbGllbnQiLCBmYXVsdHN1YmNvZGUsIGZhdWx0c3RyaW5nLCBmYXVsdGRldGFpbCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVjZWl2ZXJfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCkKK3sgcmV0dXJuIHNvYXBfcmVjZWl2ZXJfZmF1bHRfc3ViY29kZShzb2FwLCBOVUxMLCBmYXVsdHN0cmluZywgZmF1bHRkZXRhaWwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlY2VpdmVyX2ZhdWx0X3N1YmNvZGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZhdWx0c3ViY29kZSwgY29uc3QgY2hhciAqZmF1bHRzdHJpbmcsIGNvbnN0IGNoYXIgKmZhdWx0ZGV0YWlsKQoreyByZXR1cm4gc29hcF9jb3B5X2ZhdWx0KHNvYXAsIHNvYXAtPnZlcnNpb24gPT0gMiA/ICJTT0FQLUVOVjpSZWNlaXZlciIgOiAiU09BUC1FTlY6U2VydmVyIiwgZmF1bHRzdWJjb2RlLCBmYXVsdHN0cmluZywgZmF1bHRkZXRhaWwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorI2lmbmRlZiBXSVRIX05PU1RETElCCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3ByaW50X2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwLCBGSUxFICpmZCkKK3sgaWYgKHNvYXBfY2hlY2tfc3RhdGUoc29hcCkpCisgICAgZnByaW50ZihmZCwgIkVycm9yOiBzb2FwIHN0cnVjdCBub3QgaW5pdGlhbGl6ZWRcbiIpOworICBlbHNlIGlmIChzb2FwLT5lcnJvcikKKyAgeyBjb25zdCBjaGFyICpjLCAqdiA9IE5VTEwsICpzLCAqKmQ7CisgICAgZCA9IHNvYXBfZmF1bHRjb2RlKHNvYXApOworICAgIGlmICghKmQpCisgICAgICBzb2FwX3NldF9mYXVsdChzb2FwKTsKKyAgICBjID0gKmQ7CisgICAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgICAgIHYgPSAqc29hcF9mYXVsdHN1YmNvZGUoc29hcCk7CisgICAgcyA9ICpzb2FwX2ZhdWx0c3RyaW5nKHNvYXApOworICAgIGQgPSBzb2FwX2ZhdWx0ZGV0YWlsKHNvYXApOworICAgIGZwcmludGYoZmQsICIlcyVkIGZhdWx0OiAlcyBbJXNdXG5cIiVzXCJcbkRldGFpbDogJXNcbiIsIHNvYXAtPnZlcnNpb24gPyAiU09BUCAxLiIgOiAiRXJyb3IgIiwgc29hcC0+dmVyc2lvbiA/IChpbnQpc29hcC0+dmVyc2lvbiA6IHNvYXAtPmVycm9yLCBjLCB2ID8gdiA6ICJubyBzdWJjb2RlIiwgcyA/IHMgOiAiW25vIHJlYXNvbl0iLCBkICYmICpkID8gKmQgOiAiW25vIGRldGFpbF0iKTsKKyAgfQorfQorI2VuZGlmCisjZW5kaWYKKyAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorI2lmbmRlZiBXSVRIX05PU1RETElCCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3ByaW50X2ZhdWx0X2xvY2F0aW9uKHN0cnVjdCBzb2FwICpzb2FwLCBGSUxFICpmZCkKK3sgCisjaWZuZGVmIFdJVEhfTEVBTgorICBpbnQgaSwgaiwgYzEsIGMyOworICBpZiAoc29hcC0+ZXJyb3IgJiYgc29hcC0+YnVmbGVuID4gMCkKKyAgeyBpID0gKGludClzb2FwLT5idWZpZHggLSAxOworICAgIGlmIChpIDw9IDApCisgICAgICBpID0gMDsKKyAgICBjMSA9IHNvYXAtPmJ1ZltpXTsKKyAgICBzb2FwLT5idWZbaV0gPSAnXDAnOworICAgIGlmICgoaW50KXNvYXAtPmJ1ZmxlbiA+PSBpICsgMTAyNCkKKyAgICAgIGogPSBpICsgMTAyMzsKKyAgICBlbHNlCisgICAgICBqID0gKGludClzb2FwLT5idWZsZW4gLSAxOworICAgIGMyID0gc29hcC0+YnVmW2pdOworICAgIHNvYXAtPmJ1ZltqXSA9ICdcMCc7CisgICAgZnByaW50ZihmZCwgIiVzJWNcbioqIEhFUkUgKipcbiIsIHNvYXAtPmJ1ZiwgYzEpOworICAgIGlmIChzb2FwLT5idWZpZHggPCBzb2FwLT5idWZsZW4pCisgICAgICBmcHJpbnRmKGZkLCAiJXNcbiIsIHNvYXAtPmJ1ZiArIHNvYXAtPmJ1ZmlkeCk7CisgICAgc29hcC0+YnVmW2ldID0gYzE7CisgICAgc29hcC0+YnVmW2pdID0gYzI7CisgIH0KKyNlbmRpZgorfQorI2VuZGlmCisjZW5kaWYKKyAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlZ2lzdGVyX3BsdWdpbl9hcmcoc3RydWN0IHNvYXAgKnNvYXAsIGludCAoKmZjcmVhdGUpKHN0cnVjdCBzb2FwKiwgc3RydWN0IHNvYXBfcGx1Z2luKiwgdm9pZCopLCB2b2lkICphcmcpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BsdWdpbiAqcDsKKyAgcmVnaXN0ZXIgaW50IHI7CisgIGlmICghKHAgPSAoc3RydWN0IHNvYXBfcGx1Z2luKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfcGx1Z2luKSkpKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICBwLT5pZCA9IE5VTEw7CisgIHAtPmRhdGEgPSBOVUxMOworICBwLT5mY29weSA9IE5VTEw7CisgIHAtPmZkZWxldGUgPSBOVUxMOworICByID0gZmNyZWF0ZShzb2FwLCBwLCBhcmcpOworICBpZiAoIXIgJiYgcC0+ZmRlbGV0ZSkKKyAgeyBwLT5uZXh0ID0gc29hcC0+cGx1Z2luczsKKyAgICBzb2FwLT5wbHVnaW5zID0gcDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlZ2lzdGVyZWQgJyVzJyBwbHVnaW5cbiIsIHAtPmlkKSk7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgcmVnaXN0ZXIgcGx1Z2luICclcyc6IHBsdWdpbiByZXR1cm5lZCBlcnJvciAlZCAob3IgZmRlbGV0ZSBjYWxsYmFjayBub3Qgc2V0KVxuIiwgcC0+aWQ/cC0+aWQ6Ij8iLCByKSk7CisgIFNPQVBfRlJFRShzb2FwLCBwKTsKKyAgcmV0dXJuIHI7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZCAqCitmcGx1Z2luKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGx1Z2luICpwOworICBmb3IgKHAgPSBzb2FwLT5wbHVnaW5zOyBwOyBwID0gcC0+bmV4dCkKKyAgICBpZiAocC0+aWQgPT0gaWQgfHwgIXN0cmNtcChwLT5pZCwgaWQpKQorICAgICAgcmV0dXJuIHAtPmRhdGE7CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZCAqCitTT0FQX0ZNQUMyCitzb2FwX2xvb2t1cF9wbHVnaW4oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkKQoreyByZXR1cm4gc29hcC0+ZnBsdWdpbihzb2FwLCBpZCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworI2lmbmRlZiBXSVRIX0xFQU4KK3NvYXA6OnNvYXAoKQoreyBzb2FwX2luaXQodGhpcyk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqCUMrKyBzb2FwIHN0cnVjdCBtZXRob2RzCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworI2lmbmRlZiBXSVRIX0xFQU4KK3NvYXA6OnNvYXAoc29hcF9tb2RlIG1vZGUpCit7IHNvYXBfaW5pdDEodGhpcywgbW9kZSk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIF9fY3BsdXNwbHVzCisjaWZuZGVmIFdJVEhfTEVBTgorc29hcDo6c29hcChzb2FwX21vZGUgaW1vZGUsIHNvYXBfbW9kZSBvbW9kZSkKK3sgc29hcF9pbml0Mih0aGlzLCBpbW9kZSwgb21vZGUpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworI2lmbmRlZiBXSVRIX0xFQU4KK3NvYXA6OnNvYXAoc3RydWN0IHNvYXAmIHNvYXApCit7IHNvYXBfY29weV9jb250ZXh0KHRoaXMsICZzb2FwKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpZm5kZWYgV0lUSF9MRUFOCitzb2FwOjp+c29hcCgpCit7IHNvYXBfZGVzdHJveSh0aGlzKTsKKyAgc29hcF9lbmQodGhpcyk7CisgIHNvYXBfZG9uZSh0aGlzKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9zdGRzb2FwMi5jcHAgYi9zdGRzb2FwMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA5OTI5OAotLS0gL2Rldi9udWxsCisrKyBiL3N0ZHNvYXAyLmNwcApAQCAtMCwwICsxLDEzNDQ4IEBACisvKgorCitzdGRzb2FwMi5jW3BwXSAyLjcuNmUKKworZ1NPQVAgcnVudGltZQorCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHBhcnQgb2YgdGhlIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2VzOgorR1BMLCB0aGUgZ1NPQVAgcHVibGljIGxpY2Vuc2UsIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDb250cmlidXRvcnM6CisKK1dpbmQgUml2ZXIgU3lzdGVtcyBJbmMuLCBmb3IgdGhlIGZvbGxvd2luZyBhZGRpdGlvbnMgdW5kZXIgZ1NPQVAgcHVibGljIGxpY2Vuc2U6CisgIC0gdnhXb3JrcyBjb21wYXRpYmxlCSgjZGVmaW5lIFZYV09SS1MpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgcHVibGljIGxpY2Vuc2UuCisKK1RoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGdTT0FQIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4zCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKK0xpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoraHR0cDovL3d3dy5jcy5mc3UuZWR1L35lbmdlbGVuL3NvYXBsaWNlbnNlLmh0bWwKK1NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCitXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKK2ZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK1RoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBSb2JlcnQgQS4gdmFuIEVuZ2VsZW4uCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJbnN0YWxsYXRpb24gbm90ZToKKworV2luMzIgYnVpbGQgbmVlZHMgd2luc29jay5kbGwgKFZpc3VhbCBDKysgIndzb2NrMzIubGliIikKK1RvIGRvIHRoaXMgaW4gVmlzdWFsIEMrKyA2LjAsIGdvIHRvICJQcm9qZWN0IiwgInNldHRpbmdzIiwgc2VsZWN0IHRoZSAiTGluayIKK3RhYiAodGhlIHByb2plY3QgZmlsZSBuZWVkcyB0byBiZSBzZWxlY3RlZCBpbiB0aGUgZmlsZSB2aWV3KSBhbmQgYWRkCisid3NvY2szMi5saWIiIHRvIHRoZSAiT2JqZWN0L2xpYnJhcnkgbW9kdWxlcyIgZW50cnkKKworT24gTWFjIE9TIFggd2l0aCBnY2MgKEdDQykgMy4xIDIwMDIwNDIwIChwcmVyZWxlYXNlKSB5b3UgTVVTVCBjb21waWxlIHdpdGgKKy1mc3RhY2tfY2hlY2sgd2hlbiB1c2luZyAtTzIgYmVjYXVzZSBnY2MgMy4xIGhhcyBhIGJ1ZyB0aGF0IHNtYXNoZXMgdGhlIHN0YWNrCit3aGVuIGxvY2FsbHkgYWxsb2NhdGVkIGRhdGEgZXhjZWVkcyA2NEsuCisKKyovCisKKyNpZmRlZiBBUzQwMAorIyBwcmFnbWEgY29udmVydCg4MTkpCS8qIEVCQ0RJQyB0byBBU0NJSSAqLworI2VuZGlmCisKKyNpbmNsdWRlICJzdGRzb2FwMi5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK1NPQVBfU09VUkNFX1NUQU1QKCJAKCMpIHN0ZHNvYXAyLmNwcCB2ZXIgMi43LjZlIDIwMDYtMDItMTggMTI6MDA6MDAgR01UIikKK2V4dGVybiAiQyIgeworI2Vsc2UKK1NPQVBfU09VUkNFX1NUQU1QKCJAKCMpIHN0ZHNvYXAyLmMgdmVyIDIuNy42ZSAyMDA2LTAyLTE4IDEyOjAwOjAwIEdNVCIpCisjZW5kaWYKKworLyogOGJpdCBjaGFyYWN0ZXIgcmVwcmVzZW50aW5nIHVua25vd24vbm9ucmVwcmVzZW50YWJsZSBjaGFyYWN0ZXIgZGF0YSAoZS5nLiBub3Qgc3VwcG9ydGVkIGJ5IGN1cnJlbnQgbG9jYWxlIHdpdGggbXVsdGlieXRlIHN1cHBvcnQgZW5hYmxlZCkgKi8KKyNpZm5kZWYgU09BUF9VTktOT1dOX0NIQVIKKyNkZWZpbmUgU09BUF9VTktOT1dOX0NIQVIgKDEyNykKKyNlbmRpZgorCisvKiAgICAgIEVPRj0tMSAqLworI2RlZmluZSBTT0FQX0xUIChzb2FwX3djaGFyKSgtMikgLyogWE1MIGNoYXJhY3RlciAnPCcgKi8KKyNkZWZpbmUgU09BUF9UVCAoc29hcF93Y2hhcikoLTMpIC8qIFhNTCBjaGFyYWN0ZXIgJzwvJyAqLworI2RlZmluZSBTT0FQX0dUIChzb2FwX3djaGFyKSgtNCkgLyogWE1MIGNoYXJhY3RlciAnPicgKi8KKyNkZWZpbmUgU09BUF9RVCAoc29hcF93Y2hhcikoLTUpIC8qIFhNTCBjaGFyYWN0ZXIgJyInICovCisjZGVmaW5lIFNPQVBfQVAgKHNvYXBfd2NoYXIpKC02KSAvKiBYTUwgY2hhcmFjdGVyICcnJyAqLworCisjZGVmaW5lIHNvYXBfYmxhbmsoYykJCSgoYykgPj0gMCAmJiAoYykgPD0gMzIpCisjZGVmaW5lIHNvYXBfbm90YmxhbmsoYykJKChjKSA+IDMyKQorI2RlZmluZSBzb2FwX2hhc2hfcHRyKHApCSgoKHVuc2lnbmVkIGxvbmcpKHApID4+IDMpICYgKFNPQVBfUFRSSEFTSCAtIDEpKQorCisjaWZkZWYgU09BUF9ERUJVRworc3RhdGljIHZvaWQgc29hcF9pbml0X2xvZ3Moc3RydWN0IHNvYXAqKTsKK3N0YXRpYyB2b2lkIHNvYXBfY2xvc2VfbG9nZmlsZShzdHJ1Y3Qgc29hcCosIGludCk7CitzdGF0aWMgdm9pZCBzb2FwX3NldF9sb2dmaWxlKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKik7CitzdGF0aWMgdm9pZCBzb2FwX2ZyZWVfbWh0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgdm9pZCBzb2FwX3RyYWNrX3VubGluayhzdHJ1Y3Qgc29hcCosIGNvbnN0IHZvaWQqKTsKKyNlbmRpZgorCisjaWZuZGVmIFBBTE1fMgorc3RhdGljIGludCBzb2FwX3NldF9lcnJvcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBpbnQpOworc3RhdGljIGludCBzb2FwX2NvcHlfZmF1bHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitzdGF0aWMgaW50IHNvYXBfZ2V0YXR0cnZhbChzdHJ1Y3Qgc29hcCosIGNoYXIqLCBzaXplX3QsIHNvYXBfd2NoYXIpOworI2VuZGlmCisKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc29hcF93Y2hhciBzb2FwX2NoYXIoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBzb2FwX3djaGFyIHNvYXBfZ2V0X3BpKHN0cnVjdCBzb2FwKik7CitzdGF0aWMgaW50IHNvYXBfaXN4ZGlnaXQoaW50KTsKK3N0YXRpYyB2b2lkICpmcGx1Z2luKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworI2lmbmRlZiBXSVRIX05PSURSRUYKK3N0YXRpYyB2b2lkIHNvYXBfdXBkYXRlX3B0cnMoc3RydWN0IHNvYXAqLCBjaGFyKiwgY2hhciosIGNoYXIqLCBjaGFyKik7CitzdGF0aWMgaW50IHNvYXBfaGFzX2NvcGllcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitzdGF0aWMgdm9pZCBzb2FwX2luaXRfaWh0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgdm9pZCBzb2FwX2ZyZWVfaWh0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgdm9pZCBzb2FwX2luaXRfcGh0KHN0cnVjdCBzb2FwKik7CitzdGF0aWMgdm9pZCBzb2FwX2ZyZWVfcGh0KHN0cnVjdCBzb2FwKik7CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIGNvbnN0IGNoYXIgKnNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworc3RhdGljIGludCBzb2FwX2lzbnVtZXJpYyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyB0aW1lX3Qgc29hcF90aW1lZ20oc3RydWN0IHRtKik7CitzdGF0aWMgc3RydWN0IHNvYXBfbmxpc3QgKnNvYXBfbG9va3VwX25zKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHNpemVfdCBuKTsKK3N0YXRpYyBzdHJ1Y3Qgc29hcF9ubGlzdCAqc29hcF9wdXNoX25zKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqbnMsIHNob3J0IHV0aWxpemVkKTsKK3N0YXRpYyB2b2lkIHNvYXBfcG9wX25zKHN0cnVjdCBzb2FwICpzb2FwKTsKK3N0YXRpYyB2b2lkIHNvYXBfdXRpbGl6ZV9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBzaXplX3Qgbik7CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKnNvYXBfbmV3X211bHRpcGFydChzdHJ1Y3Qgc29hcCosIHN0cnVjdCBzb2FwX211bHRpcGFydCoqLCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKiwgY2hhciosIHNpemVfdCk7CitzdGF0aWMgaW50IHNvYXBfcHV0ZGltZWZpZWxkKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHNpemVfdCk7CitzdGF0aWMgY2hhciAqc29hcF9nZXRkaW1lZmllbGQoc3RydWN0IHNvYXAqLCBzaXplX3QpOworc3RhdGljIHZvaWQgc29hcF9zZWxlY3RfbWltZV9ib3VuZGFyeShzdHJ1Y3Qgc29hcCopOworc3RhdGljIGludCBzb2FwX3ZhbGlkX21pbWVfYm91bmRhcnkoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBpbnQgc29hcF9tYXRjaF9jaWQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworc3RhdGljIHZvaWQgc29hcF9yZXNvbHZlX2F0dGFjaG1lbnQoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBXSVRIX0daSVAKK3N0YXRpYyBpbnQgc29hcF9nZXRnemlwaGRyKHN0cnVjdCBzb2FwKik7CisjZW5kaWYKKworI2lmZGVmIFdJVEhfT1BFTlNTTAorc3RhdGljIGludCBzc2xfaW5pdF9kb25lID0gMDsKK3N0YXRpYyBpbnQgc3NsX2F1dGhfaW5pdChzdHJ1Y3Qgc29hcCopOworc3RhdGljIGludCBzc2xfdmVyaWZ5X2NhbGxiYWNrKGludCwgWDUwOV9TVE9SRV9DVFgqKTsKK3N0YXRpYyBpbnQgc3NsX3Bhc3N3b3JkKGNoYXIqLCBpbnQsIGludCwgdm9pZCAqKTsKK3N0YXRpYyBjb25zdCBjaGFyICpzc2xfZXJyb3Ioc3RydWN0IHNvYXAqLCBpbnQpOworLyogVGhpcyBjYWxsYmFjayBpcyBpbmNsdWRlZCBmb3IgZnV0dXJlIHJlZmVyZW5jZXMuIEl0IHNob3VsZCBub3QgYmUgZGVsZXRlZAorc3RhdGljIERIICpzc2xfdG1wX2RoKFNTTCosIGludCwgaW50KTsKKyovCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFdJVEhfTk9IVFRQKSB8fCAhZGVmaW5lZChXSVRIX0xFQU5FUikKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY29uc3QgY2hhciAqc29hcF9kZWNvZGUoY2hhciosIHNpemVfdCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgc29hcF93Y2hhciBzb2FwX2dldGNodW5rY2hhcihzdHJ1Y3Qgc29hcCopOworc3RhdGljIGNvbnN0IGNoYXIgKmh0dHBfZXJyb3Ioc3RydWN0IHNvYXAqLCBpbnQpOworc3RhdGljIGludCBodHRwX3Bvc3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworc3RhdGljIGludCBodHRwX2dldChzdHJ1Y3Qgc29hcCopOworc3RhdGljIGludCBodHRwX3NlbmRfaGVhZGVyKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworc3RhdGljIGludCBodHRwX3Bvc3RfaGVhZGVyKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK3N0YXRpYyBpbnQgaHR0cF9yZXNwb25zZShzdHJ1Y3Qgc29hcCosIGludCwgc2l6ZV90KTsKK3N0YXRpYyBpbnQgaHR0cF9wYXJzZShzdHJ1Y3Qgc29hcCopOworc3RhdGljIGludCBodHRwX3BhcnNlX2hlYWRlcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQgZnNlbmQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc2l6ZV90KTsKK3N0YXRpYyBzaXplX3QgZnJlY3Yoc3RydWN0IHNvYXAqLCBjaGFyKiwgc2l6ZV90KTsKK3N0YXRpYyBpbnQgdGNwX2luaXQoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBjb25zdCBjaGFyICp0Y3BfZXJyb3Ioc3RydWN0IHNvYXAqKTsKKyNpZm5kZWYgV0lUSF9JUFY2CitzdGF0aWMgaW50IHRjcF9nZXRob3N0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqYWRkciwgc3RydWN0IGluX2FkZHIgKmluYWRkcik7CisjZW5kaWYKK3N0YXRpYyBpbnQgdGNwX2Nvbm5lY3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICplbmRwb2ludCwgY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQpOworc3RhdGljIGludCB0Y3BfYWNjZXB0KHN0cnVjdCBzb2FwKiwgaW50LCBzdHJ1Y3Qgc29ja2FkZHIqLCBpbnQqKTsKK3N0YXRpYyBpbnQgdGNwX2Rpc2Nvbm5lY3Qoc3RydWN0IHNvYXAqKTsKK3N0YXRpYyBpbnQgdGNwX2Nsb3Nlc29ja2V0KHN0cnVjdCBzb2FwKiwgU09BUF9TT0NLRVQpOworc3RhdGljIGludCB0Y3Bfc2h1dGRvd25zb2NrZXQoc3RydWN0IHNvYXAqLCBTT0FQX1NPQ0tFVCwgaW50KTsKK3N0YXRpYyBjb25zdCBjaGFyICpzb2FwX3N0cmVycm9yKHN0cnVjdCBzb2FwKik7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQQUxNKSAmJiAhZGVmaW5lZChQQUxNXzIpCit1bnNpZ25lZCBzaG9ydCBlcnJubzsKKyNlbmRpZgorCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNvbnN0IGNoYXIgc29hcF9lbnYxWzQyXSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI7CitzdGF0aWMgY29uc3QgY2hhciBzb2FwX2VuYzFbNDJdID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIjsKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfZW52Mls0MF0gPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIjsKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfZW5jMls0MF0gPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVuY29kaW5nIjsKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfcnBjWzM1XSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtcnBjIjsKKyNlbmRpZgorCisjaWZuZGVmIFBBTE1fMQorY29uc3Qgc3RydWN0IHNvYXBfZG91YmxlX25hbiBzb2FwX2RvdWJsZV9uYW4gPSB7MHhGRkZGRkZGRiwgMHhGRkZGRkZGRn07CitzdGF0aWMgY29uc3QgY2hhciBzb2FwX2Jhc2U2NG9bNjVdID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOworc3RhdGljIGNvbnN0IGNoYXIgc29hcF9iYXNlNjRpWzgxXSA9ICJcNzZYWFhcNzdcNjRcNjVcNjZcNjdcNzBcNzFcNzJcNzNcNzRcNzVYWFhYWFhYXDAwXDAxXDAyXDAzXDA0XDA1XDA2XDA3XDEwXDExXDEyXDEzXDE0XDE1XDE2XDE3XDIwXDIxXDIyXDIzXDI0XDI1XDI2XDI3XDMwXDMxWFhYWFhYXDMyXDMzXDM0XDM1XDM2XDM3XDQwXDQxXDQyXDQzXDQ0XDQ1XDQ2XDQ3XDUwXDUxXDUyXDUzXDU0XDU1XDU2XDU3XDYwXDYxXDYyXDYzIjsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIGNvbnN0IGNoYXIgc29hcF9pbmRlbnRbMTFdID0gIlxuXHRcdFx0XHRcdFx0XHRcdFx0IjsKKy8qIEFsdGVybmF0aXZlIGluZGVudGF0aW9uIGZvcm0gZm9yIFNPQVBfWE1MX0lOREVOVDoKK3N0YXRpYyBjb25zdCBjaGFyIHNvYXBfaW5kZW50WzIxXSA9ICJcbiAgICAgICAgICAgICAgICAgICAiOworKi8KKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciBzb2FwX3BhZGRpbmdbNF0gPSAiXDBcMFwwIjsKKyNkZWZpbmUgU09BUF9TVFJfUEFERElORyAoc29hcF9wYWRkaW5nKQorI2RlZmluZSBTT0FQX1NUUl9FT1MgKHNvYXBfcGFkZGluZykKKyNkZWZpbmUgU09BUF9OT05fTlVMTCAoc29hcF9wYWRkaW5nKQorCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwIGh0bWxfZW50aXR5X2NvZGVzW10gPSAvKiBlbnRpdGllcyBmb3IgWEhUTUwgcGFyc2luZyAqLworeyB7IDE2MCwgIm5ic3AiIH0sCisgIHsgMTYxLCAiaWV4Y2wiIH0sCisgIHsgMTYyLCAiY2VudCIgfSwKKyAgeyAxNjMsICJwb3VuZCIgfSwKKyAgeyAxNjQsICJjdXJyZW4iIH0sCisgIHsgMTY1LCAieWVuIiB9LAorICB7IDE2NiwgImJydmJhciIgfSwKKyAgeyAxNjcsICJzZWN0IiB9LAorICB7IDE2OCwgInVtbCIgfSwKKyAgeyAxNjksICJjb3B5IiB9LAorICB7IDE3MCwgIm9yZGYiIH0sCisgIHsgMTcxLCAibGFxdW8iIH0sCisgIHsgMTcyLCAibm90IiB9LAorICB7IDE3MywgInNoeSIgfSwKKyAgeyAxNzQsICJyZWciIH0sCisgIHsgMTc1LCAibWFjciIgfSwKKyAgeyAxNzYsICJkZWciIH0sCisgIHsgMTc3LCAicGx1c21uIiB9LAorICB7IDE3OCwgInN1cDIiIH0sCisgIHsgMTc5LCAic3VwMyIgfSwKKyAgeyAxODAsICJhY3V0ZSIgfSwKKyAgeyAxODEsICJtaWNybyIgfSwKKyAgeyAxODIsICJwYXJhIiB9LAorICB7IDE4MywgIm1pZGRvdCIgfSwKKyAgeyAxODQsICJjZWRpbCIgfSwKKyAgeyAxODUsICJzdXAxIiB9LAorICB7IDE4NiwgIm9yZG0iIH0sCisgIHsgMTg3LCAicmFxdW8iIH0sCisgIHsgMTg4LCAiZnJhYzE0IiB9LAorICB7IDE4OSwgImZyYWMxMiIgfSwKKyAgeyAxOTAsICJmcmFjMzQiIH0sCisgIHsgMTkxLCAiaXF1ZXN0IiB9LAorICB7IDE5MiwgIkFncmF2ZSIgfSwKKyAgeyAxOTMsICJBYWN1dGUiIH0sCisgIHsgMTk0LCAiQWNpcmMiIH0sCisgIHsgMTk1LCAiQXRpbGRlIiB9LAorICB7IDE5NiwgIkF1bWwiIH0sCisgIHsgMTk3LCAiQXJpbmciIH0sCisgIHsgMTk4LCAiQUVsaWciIH0sCisgIHsgMTk5LCAiQ2NlZGlsIiB9LAorICB7IDIwMCwgIkVncmF2ZSIgfSwKKyAgeyAyMDEsICJFYWN1dGUiIH0sCisgIHsgMjAyLCAiRWNpcmMiIH0sCisgIHsgMjAzLCAiRXVtbCIgfSwKKyAgeyAyMDQsICJJZ3JhdmUiIH0sCisgIHsgMjA1LCAiSWFjdXRlIiB9LAorICB7IDIwNiwgIkljaXJjIiB9LAorICB7IDIwNywgIkl1bWwiIH0sCisgIHsgMjA4LCAiRVRIIiB9LAorICB7IDIwOSwgIk50aWxkZSIgfSwKKyAgeyAyMTAsICJPZ3JhdmUiIH0sCisgIHsgMjExLCAiT2FjdXRlIiB9LAorICB7IDIxMiwgIk9jaXJjIiB9LAorICB7IDIxMywgIk90aWxkZSIgfSwKKyAgeyAyMTQsICJPdW1sIiB9LAorICB7IDIxNSwgInRpbWVzIiB9LAorICB7IDIxNiwgIk9zbGFzaCIgfSwKKyAgeyAyMTcsICJVZ3JhdmUiIH0sCisgIHsgMjE4LCAiVWFjdXRlIiB9LAorICB7IDIxOSwgIlVjaXJjIiB9LAorICB7IDIyMCwgIlV1bWwiIH0sCisgIHsgMjIxLCAiWWFjdXRlIiB9LAorICB7IDIyMiwgIlRIT1JOIiB9LAorICB7IDIyMywgInN6bGlnIiB9LAorICB7IDIyNCwgImFncmF2ZSIgfSwKKyAgeyAyMjUsICJhYWN1dGUiIH0sCisgIHsgMjI2LCAiYWNpcmMiIH0sCisgIHsgMjI3LCAiYXRpbGRlIiB9LAorICB7IDIyOCwgImF1bWwiIH0sCisgIHsgMjI5LCAiYXJpbmciIH0sCisgIHsgMjMwLCAiYWVsaWciIH0sCisgIHsgMjMxLCAiY2NlZGlsIiB9LAorICB7IDIzMiwgImVncmF2ZSIgfSwKKyAgeyAyMzMsICJlYWN1dGUiIH0sCisgIHsgMjM0LCAiZWNpcmMiIH0sCisgIHsgMjM1LCAiZXVtbCIgfSwKKyAgeyAyMzYsICJpZ3JhdmUiIH0sCisgIHsgMjM3LCAiaWFjdXRlIiB9LAorICB7IDIzOCwgImljaXJjIiB9LAorICB7IDIzOSwgIml1bWwiIH0sCisgIHsgMjQwLCAiZXRoIiB9LAorICB7IDI0MSwgIm50aWxkZSIgfSwKKyAgeyAyNDIsICJvZ3JhdmUiIH0sCisgIHsgMjQzLCAib2FjdXRlIiB9LAorICB7IDI0NCwgIm9jaXJjIiB9LAorICB7IDI0NSwgIm90aWxkZSIgfSwKKyAgeyAyNDYsICJvdW1sIiB9LAorICB7IDI0NywgImRpdmlkZSIgfSwKKyAgeyAyNDgsICJvc2xhc2giIH0sCisgIHsgMjQ5LCAidWdyYXZlIiB9LAorICB7IDI1MCwgInVhY3V0ZSIgfSwKKyAgeyAyNTEsICJ1Y2lyYyIgfSwKKyAgeyAyNTIsICJ1dW1sIiB9LAorICB7IDI1MywgInlhY3V0ZSIgfSwKKyAgeyAyNTQsICJ0aG9ybiIgfSwKKyAgeyAyNTUsICJ5dW1sIiB9LAorICB7ICAgMCwgTlVMTCB9Cit9OworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwIGhfZXJyb3JfY29kZXNbXSA9Cit7CisjaWZkZWYgSE9TVF9OT1RfRk9VTkQgICAKKyAgeyBIT1NUX05PVF9GT1VORCwgIkhvc3Qgbm90IGZvdW5kIiB9LAorI2VuZGlmCisjaWZkZWYgVFJZX0FHQUlOCisgIHsgVFJZX0FHQUlOLCAiVHJ5IEFnYWluIiB9LAorI2VuZGlmCisjaWZkZWYgTk9fUkVDT1ZFUlkgIAorICB7IE5PX1JFQ09WRVJZLCAiTm8gUmVjb3ZlcnkiIH0sCisjZW5kaWYKKyNpZmRlZiBOT19EQVRBCisgIHsgTk9fREFUQSwgIk5vIERhdGEiIH0sCisjZW5kaWYKKyNpZmRlZiBOT19BRERSRVNTCisgIHsgTk9fQUREUkVTUywgIk5vIEFkZHJlc3MiIH0sCisjZW5kaWYKKyAgeyAwLCBOVUxMIH0KK307CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwIGhfaHR0cF9lcnJvcl9jb2Rlc1tdID0KK3sgeyAyMDEsICJDcmVhdGVkIiB9LAorICB7IDIwMiwgIkFjY2VwdGVkIiB9LAorICB7IDIwMywgIk5vbi1BdXRob3JpdGF0aXZlIEluZm9ybWF0aW9uIiB9LAorICB7IDIwNCwgIk5vIENvbnRlbnQiIH0sCisgIHsgMjA1LCAiUmVzZXQgQ29udGVudCIgfSwKKyAgeyAyMDYsICJQYXJ0aWFsIENvbnRlbnQiIH0sCisgIHsgMzAwLCAiTXVsdGlwbGUgQ2hvaWNlcyIgfSwKKyAgeyAzMDEsICJNb3ZlZCBQZXJtYW5lbnRseSIgfSwKKyAgeyAzMDIsICJGb3VuZCIgfSwKKyAgeyAzMDMsICJTZWUgT3RoZXIiIH0sCisgIHsgMzA0LCAiTm90IE1vZGlmaWVkIiB9LAorICB7IDMwNSwgIlVzZSBQcm94eSIgfSwKKyAgeyAzMDcsICJUZW1wb3JhcnkgUmVkaXJlY3QiIH0sCisgIHsgNDAwLCAiQmFkIFJlcXVlc3QiIH0sCisgIHsgNDAxLCAiVW5hdXRob3JpemVkIiB9LAorICB7IDQwMiwgIlBheW1lbnQgUmVxdWlyZWQiIH0sCisgIHsgNDAzLCAiRm9yYmlkZGVuIiB9LAorICB7IDQwNCwgIk5vdCBGb3VuZCIgfSwKKyAgeyA0MDUsICJNZXRob2QgTm90IEFsbG93ZWQiIH0sCisgIHsgNDA2LCAiTm90IEFjY2VwdGFibGUiIH0sCisgIHsgNDA3LCAiUHJveHkgQXV0aGVudGljYXRpb24gUmVxdWlyZWQiIH0sCisgIHsgNDA4LCAiUmVxdWVzdCBUaW1lLW91dCIgfSwKKyAgeyA0MDksICJDb25mbGljdCIgfSwKKyAgeyA0MTAsICJHb25lIiB9LAorICB7IDQxMSwgIkxlbmd0aCBSZXF1aXJlZCIgfSwKKyAgeyA0MTIsICJQcmVjb25kaXRpb24gRmFpbGVkIiB9LAorICB7IDQxMywgIlJlcXVlc3QgRW50aXR5IFRvbyBMYXJnZSIgfSwKKyAgeyA0MTQsICJSZXF1ZXN0LVVSSSBUb28gTGFyZ2UiIH0sCisgIHsgNDE1LCAiVW5zdXBwb3J0ZWQgTWVkaWEgVHlwZSIgfSwKKyAgeyA0MTYsICJSZXF1ZXN0ZWQgcmFuZ2Ugbm90IHNhdGlzZmlhYmxlIiB9LAorICB7IDQxNywgIkV4cGVjdGF0aW9uIEZhaWxlZCIgfSwKKyAgeyA1MDAsICJJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IiIH0sCisgIHsgNTAxLCAiTm90IEltcGxlbWVudGVkIiB9LAorICB7IDUwMiwgIkJhZCBHYXRld2F5IiB9LAorICB7IDUwMywgIlNlcnZpY2UgVW5hdmFpbGFibGUiIH0sCisgIHsgNTA0LCAiR2F0ZXdheSBUaW1lLW91dCIgfSwKKyAgeyA1MDUsICJIVFRQIFZlcnNpb24gbm90IHN1cHBvcnRlZCIgfSwKKyAgeyAgIDAsIE5VTEwgfQorfTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBXSVRIX09QRU5TU0wKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCBoX3NzbF9lcnJvcl9jb2Rlc1tdID0KK3sKKyNkZWZpbmUgX1NTTF9FUlJPUihlKSB7IGUsICNlIH0KKyAgX1NTTF9FUlJPUihTU0xfRVJST1JfU1NMKSwKKyAgX1NTTF9FUlJPUihTU0xfRVJST1JfWkVST19SRVRVUk4pLAorICBfU1NMX0VSUk9SKFNTTF9FUlJPUl9XQU5UX1JFQUQpLAorICBfU1NMX0VSUk9SKFNTTF9FUlJPUl9XQU5UX1dSSVRFKSwKKyAgX1NTTF9FUlJPUihTU0xfRVJST1JfV0FOVF9DT05ORUNUKSwKKyAgX1NTTF9FUlJPUihTU0xfRVJST1JfV0FOVF9YNTA5X0xPT0tVUCksCisgIF9TU0xfRVJST1IoU1NMX0VSUk9SX1NZU0NBTEwpLAorICB7IDAsIE5VTEwgfQorfTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTkVSCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgbWltZV9jb2Rlc1tdID0KK3sgeyBTT0FQX01JTUVfN0JJVCwJCSI3Yml0IiB9LAorICB7IFNPQVBfTUlNRV84QklULAkJIjhiaXQiIH0sCisgIHsgU09BUF9NSU1FX0JJTkFSWSwJCSJiaW5hcnkiIH0sCisgIHsgU09BUF9NSU1FX1FVT1RFRF9QUklOVEFCTEUsICJxdW90ZWQtcHJpbnRhYmxlIiB9LAorICB7IFNPQVBfTUlNRV9CQVNFNjQsCQkiYmFzZTY0IiB9LAorICB7IFNPQVBfTUlNRV9JRVRGX1RPS0VOLAkiaWV0Zi10b2tlbiIgfSwKKyAgeyBTT0FQX01JTUVfWF9UT0tFTiwJCSJ4LXRva2VuIiB9LAorICB7IDAsCQkJCU5VTEwgfQorfTsKKyNlbmRpZgorCisjaWZkZWYgV0lOMzIKK3N0YXRpYyBpbnQgdGNwX2RvbmUgPSAwOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK2ZzZW5kKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBzaXplX3QgbikKK3sgcmVnaXN0ZXIgaW50IG53cml0dGVuOworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpICAmJiAoIWRlZmluZWQoV0lUSF9MRUFOKSB8fCBkZWZpbmVkKFVOREVSX0NFKSkKKyAgaWYgKHNvYXAtPm9zKQorICB7IHNvYXAtPm9zLT53cml0ZShzLCBuKTsKKyAgICBpZiAoc29hcC0+b3MtPmdvb2QoKSkKKyAgICAgIHJldHVybiBTT0FQX09LOworICAgIHJldHVybiBTT0FQX0VPRjsKKyAgfQorI2VuZGlmCisgIHdoaWxlIChuKQorICB7IGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICAgIHsgCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgaWYgKHNvYXAtPnNlbmRfdGltZW91dCkKKyAgICAgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgICAgZmRfc2V0IGZkOworICAgICAgICBpZiAoc29hcC0+c2VuZF90aW1lb3V0ID4gMCkKKyAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IHNvYXAtPnNlbmRfdGltZW91dDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IC1zb2FwLT5zZW5kX3RpbWVvdXQvMTAwMDAwMDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAtc29hcC0+c2VuZF90aW1lb3V0JTEwMDAwMDA7CisgICAgICAgIH0KKyAgICAgICAgRkRfWkVSTygmZmQpOworICAgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJmZkKTsKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeyByZWdpc3RlciBpbnQgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCBOVUxMLCAmZmQsICZmZCwgJnRpbWVvdXQpOworICAgICAgICAgIGlmIChyID4gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGlmICghcikKKyAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IDA7CisgICAgICAgICAgICByZXR1cm4gU09BUF9FT0Y7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUFHQUlOKQorICAgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgICByZXR1cm4gU09BUF9FT0Y7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICAgIGlmIChzb2FwLT5zc2wpCisgICAgICAgIG53cml0dGVuID0gU1NMX3dyaXRlKHNvYXAtPnNzbCwgcywgbik7CisgICAgICBlbHNlIGlmIChzb2FwLT5iaW8pCisgICAgICAgIG53cml0dGVuID0gQklPX3dyaXRlKHNvYXAtPmJpbywgcywgbik7CisgICAgICBlbHNlCisjZW5kaWYKKyNpZmRlZiBXSVRIX1VEUAorICAgICAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICAgIHsgaWYgKHNvYXAtPnBlZXJsZW4pCisJICBud3JpdHRlbiA9IHNlbmR0bygoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyLCBzb2FwLT5wZWVybGVuKTsKKyAgICAgICAgZWxzZQorCSAgbndyaXR0ZW4gPSBzZW5kKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHMsIG4sIHNvYXAtPnNvY2tldF9mbGFncyk7CisJLyogcmV0cnkgYW5kIGJhY2stb2ZmIGFsZ29yaXRobSAqLworCS8qIFRPRE86IHRoaXMgaXMgbm90IHZlcnkgY2xlYXIgZnJvbSBzcGVjcyBzbyB2ZXJpZnkgYW5kIGxpbWl0IGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggd2Ugc2hvdWxkIGxvb3AgKGUuZy4gRU5PQlVGUykgKi8KKwlpZiAobndyaXR0ZW4gPCAwKQorICAgICAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICAgICAgZmRfc2V0IGZkOworCSAgaW50IHVkcF9yZXBlYXQ7CisJICBpbnQgdWRwX2RlbGF5OworICAgICAgICAgIGlmICgoc29hcC0+Y29ubmVjdF9mbGFncyAmIFNPX0JST0FEQ0FTVCkpCisJICAgIHVkcF9yZXBlYXQgPSAzOyAvKiBTT0FQLW92ZXItVURQIE1VTFRJQ0FTVF9VRFBfUkVQRUFUIC0gMSAqLworICAgICAgICAgIGVsc2UKKwkgICAgdWRwX3JlcGVhdCA9IDE7IC8qIFNPQVAtb3Zlci1VRFAgVU5JQ0FTVF9VRFBfUkVQRUFUIC0gMSAqLworCSAgdWRwX2RlbGF5ID0gKHNvYXBfcmFuZG9tICUgMjAxKSArIDUwOyAvKiBVRFBfTUlOX0RFTEFZIC4uIFVEUF9NQVhfREVMQVkgKi8KKwkgIGRvCisgICAgICAgICAgeyB0aW1lb3V0LnR2X3NlYyA9IDA7CisgICAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAxMDAwICogdWRwX2RlbGF5OyAvKiBtcyAqLworICAgICAgICAgICAgRkRfWkVSTygmZmQpOworICAgICAgICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZmZCk7CisgICAgICAgICAgICBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgTlVMTCwgTlVMTCwgJmZkLCAmdGltZW91dCk7CisJICAgIGlmIChzb2FwLT5wZWVybGVuKQorCSAgICAgIG53cml0dGVuID0gc2VuZHRvKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHMsIG4sIHNvYXAtPnNvY2tldF9mbGFncywgKHN0cnVjdCBzb2NrYWRkciopJnNvYXAtPnBlZXIsIHNvYXAtPnBlZXJsZW4pOworICAgICAgICAgICAgZWxzZQorCSAgICAgIG53cml0dGVuID0gc2VuZCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MpOworCSAgICB1ZHBfZGVsYXkgPDw9IDE7CisJICAgIGlmICh1ZHBfZGVsYXkgPiA1MDApIC8qIFVEUF9VUFBFUl9ERUxBWSAqLworCSAgICAgIHVkcF9kZWxheSA9IDUwMDsKKwkgIH0KKwkgIHdoaWxlIChud3JpdHRlbiA8IDAgJiYgLS11ZHBfcmVwZWF0ID4gMCk7CisJfQorICAgICAgfQorICAgICAgZWxzZQorI2VuZGlmCisjaWYgIWRlZmluZWQoUEFMTSkgJiYgIWRlZmluZWQoQVM0MDApCisgICAgICAgIG53cml0dGVuID0gc2VuZCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MpOworI2Vsc2UKKyAgICAgICAgbndyaXR0ZW4gPSBzZW5kKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICh2b2lkKilzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MpOworI2VuZGlmCisgICAgICBpZiAobndyaXR0ZW4gPD0gMCkKKyAgICAgIHsKKyNpZmRlZiBXSVRIX09QRU5TU0wKKwlpbnQgZXJyOworICAgICAgICBpZiAoc29hcC0+c3NsICYmIChlcnIgPSBTU0xfZ2V0X2Vycm9yKHNvYXAtPnNzbCwgbndyaXR0ZW4pKSAhPSBTU0xfRVJST1JfTk9ORSAmJiBlcnIgIT0gU1NMX0VSUk9SX1dBTlRfUkVBRCAmJiBlcnIgIT0gU1NMX0VSUk9SX1dBTlRfV1JJVEUpCisgICAgICAgICAgcmV0dXJuIFNPQVBfRU9GOworI2VuZGlmCisgICAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRVdPVUxEQkxPQ0sgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FQUdBSU4pCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgcmV0dXJuIFNPQVBfRU9GOworICAgICAgICB9CisgICAgICAgIG53cml0dGVuID0gMDsgLyogYW5kIGNhbGwgd3JpdGUoKSBhZ2FpbiAqLworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworI2lmZGVmIFdJVEhfRkFTVENHSQorICAgICAgbndyaXR0ZW4gPSBmd3JpdGUoKHZvaWQqKXMsIDEsIG4sIHN0ZG91dCk7CisgICAgICBmZmx1c2goc3Rkb3V0KTsKKyNlbHNlCisjaWZkZWYgVU5ERVJfQ0UKKyAgICAgIG53cml0dGVuID0gZndyaXRlKHMsIDEsIG4sIHNvYXAtPnNlbmRmZCk7CisjZWxzZQorI2lmZGVmIFZYV09SS1MKKyNpZmRlZiBXTVdfUlBNX0lPCisgICAgICBpZiAoc29hcC0+cnBtcmVxaWQpCisgICAgICAgIG53cml0dGVuID0gKGh0dHBCbG9ja1B1dChzb2FwLT5ycG1yZXFpZCwgcywgbikgPT0gMCkgPyBuIDogLTE7IAorICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgIG53cml0dGVuID0gZndyaXRlKHMsIHNpemVvZihjaGFyKSwgbiwgZmRvcGVuKHNvYXAtPnNlbmRmZCwgInciKSk7CisjZWxzZQorICAgICAgbndyaXR0ZW4gPSB3cml0ZSgoU09BUF9TT0NLRVQpc29hcC0+c2VuZGZkLCBzLCBuKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyAgICAgIGlmIChud3JpdHRlbiA8PSAwKQorICAgICAgeyBpZiAoc29hcF9lcnJubyAhPSBTT0FQX0VJTlRSICYmIHNvYXBfZXJybm8gIT0gU09BUF9FV09VTERCTE9DSyAmJiBzb2FwX2Vycm5vICE9IFNPQVBfRUFHQUlOKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfZXJybm87CisgICAgICAgICAgcmV0dXJuIFNPQVBfRU9GOworICAgICAgICB9CisgICAgICAgIG53cml0dGVuID0gMDsgLyogYW5kIGNhbGwgd3JpdGUoKSBhZ2FpbiAqLworICAgICAgfQorICAgIH0KKyAgICBuIC09IG53cml0dGVuOworICAgIHMgKz0gbndyaXR0ZW47CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZW5kX3JhdyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgc2l6ZV90IG4pCit7IGlmICghbikKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgeyBzb2FwLT5jb3VudCArPSBuOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICAgIGlmIChzb2FwLT5mcHJlcGFyZXNlbmQgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSAhPSBTT0FQX0lPX1NUT1JFKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gc29hcC0+ZnByZXBhcmVzZW5kKHNvYXAsIHMsIG4pOworI2VuZGlmCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKQorICB7IHJlZ2lzdGVyIHNpemVfdCBpID0gU09BUF9CVUZMRU4gLSBzb2FwLT5idWZpZHg7CisgICAgd2hpbGUgKG4gPj0gaSkKKyAgICB7IG1lbWNweShzb2FwLT5idWYgKyBzb2FwLT5idWZpZHgsIHMsIGkpOworICAgICAgc29hcC0+YnVmaWR4ID0gU09BUF9CVUZMRU47CisgICAgICBpZiAoc29hcF9mbHVzaChzb2FwKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgcyArPSBpOworICAgICAgbiAtPSBpOworICAgICAgaSA9IFNPQVBfQlVGTEVOOworICAgIH0KKyAgICBtZW1jcHkoc29hcC0+YnVmICsgc29hcC0+YnVmaWR4LCBzLCBuKTsKKyAgICBzb2FwLT5idWZpZHggKz0gbjsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICByZXR1cm4gc29hcF9mbHVzaF9yYXcoc29hcCwgcywgbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZmx1c2goc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBuID0gc29hcC0+YnVmaWR4OworICBpZiAobikKKyAgeyBzb2FwLT5idWZpZHggPSAwOworI2lmZGVmIFdJVEhfWkxJQgorICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQikKKyAgICB7IHNvYXAtPmRfc3RyZWFtLm5leHRfaW4gPSAoQnl0ZSopc29hcC0+YnVmOworICAgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4gPSAodW5zaWduZWQgaW50KW47CisjaWZkZWYgV0lUSF9HWklQCisgICAgICBzb2FwLT56X2NyYyA9IGNyYzMyKHNvYXAtPnpfY3JjLCAoQnl0ZSopc29hcC0+YnVmLCAodW5zaWduZWQgaW50KW4pOworI2VuZGlmCisgICAgICBkbworICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlZmxhdGluZyAldSBieXRlc1xuIiwgc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4pKTsKKyAgICAgICAgaWYgKGRlZmxhdGUoJnNvYXAtPmRfc3RyZWFtLCBaX05PX0ZMVVNIKSAhPSBaX09LKQorICAgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVW5hYmxlIHRvIGRlZmxhdGU6ICVzXG4iLCBzb2FwLT5kX3N0cmVhbS5tc2c/c29hcC0+ZF9zdHJlYW0ubXNnOiIiKSk7CisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGlmICghc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0KQorICAgICAgICB7IGlmIChzb2FwX2ZsdXNoX3Jhdyhzb2FwLCBzb2FwLT56X2J1ZiwgU09BUF9CVUZMRU4pKQorICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gKEJ5dGUqKXNvYXAtPnpfYnVmOworICAgICAgICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCA9IFNPQVBfQlVGTEVOOworICAgICAgICB9CisgICAgICB9IHdoaWxlIChzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbik7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgICAgcmV0dXJuIHNvYXBfZmx1c2hfcmF3KHNvYXAsIHNvYXAtPmJ1Ziwgbik7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZmx1c2hfcmF3KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBzaXplX3QgbikKK3sgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19TVE9SRSkKKyAgeyByZWdpc3RlciBjaGFyICp0OworICAgIGlmICghKHQgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIG4pKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIG1lbWNweSh0LCBzLCBuKTsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgICBpZiAoc29hcC0+ZnByZXBhcmVzZW5kKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gc29hcC0+ZnByZXBhcmVzZW5kKHNvYXAsIHMsIG4pOworI2VuZGlmCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgeyBjaGFyIHRbMTZdOworICAgIHNwcmludGYodCwgIlxyXG4lbFhcclxuIiArIChzb2FwLT5jaHVua3NpemUgPyAwIDogMiksICh1bnNpZ25lZCBsb25nKW4pOworICAgIERCR01TRyhTRU5ULCB0LCBzdHJsZW4odCkpOworICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mc2VuZChzb2FwLCB0LCBzdHJsZW4odCkpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBzb2FwLT5jaHVua3NpemUgKz0gbjsKKyAgfQorICBEQkdNU0coU0VOVCwgcywgbik7CisjZW5kaWYKKyAgcmV0dXJuIHNvYXAtPmVycm9yID0gc29hcC0+ZnNlbmQoc29hcCwgcywgbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2VuZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcykKK3sgaWYgKHMpCisgICAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgcywgc3RybGVuKHMpKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2VuZDIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMikKK3sgaWYgKHNvYXBfc2VuZChzb2FwLCBzMSkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9zZW5kKHNvYXAsIHMyKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmQzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIGNvbnN0IGNoYXIgKnMzKQoreyBpZiAoc29hcF9zZW5kKHNvYXAsIHMxKQorICAgfHwgc29hcF9zZW5kKHNvYXAsIHMyKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX3NlbmQoc29hcCwgczMpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHNpemVfdAorZnJlY3Yoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnMsIHNpemVfdCBuKQoreyByZWdpc3RlciBpbnQgcjsKKyAgc29hcC0+ZXJybnVtID0gMDsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiAoIWRlZmluZWQoV0lUSF9MRUFOKSB8fCBkZWZpbmVkKFVOREVSX0NFKSkKKyAgaWYgKHNvYXAtPmlzKQorICB7IGlmIChzb2FwLT5pcy0+Z29vZCgpKQorICAgICAgcmV0dXJuIHNvYXAtPmlzLT5yZWFkKHMsIG4pLmdjb3VudCgpOworICAgIHJldHVybiAwOworICB9CisjZW5kaWYKKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgIHsgZm9yICg7OykKKyAgICB7IAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIGlmIChzb2FwLT5yZWN2X3RpbWVvdXQpCisgICAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICAgIGZkX3NldCBmZDsKKyAgICAgICAgaWYgKHNvYXAtPnJlY3ZfdGltZW91dCA+IDApCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSBzb2FwLT5yZWN2X3RpbWVvdXQ7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSAtc29hcC0+cmVjdl90aW1lb3V0LzEwMDAwMDA7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gLXNvYXAtPnJlY3ZfdGltZW91dCUxMDAwMDAwOworICAgICAgICB9CisgICAgICAgIEZEX1pFUk8oJmZkKTsKKyAgICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZmZCk7CisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCAmZmQsIE5VTEwsICZmZCwgJnRpbWVvdXQpOworICAgICAgICAgIGlmIChyID4gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGlmICghcikKKwkgIHsgc29hcC0+ZXJybnVtID0gMDsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUiAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VBR0FJTikKKwkgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyNlbmRpZgorI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgICAgaWYgKHNvYXAtPnNzbCkKKyAgICAgIHsgaW50IGVycjsKKwlyID0gU1NMX3JlYWQoc29hcC0+c3NsLCBzLCBuKTsKKyAgICAgICAgaWYgKHIgPiAwKQorICAgICAgICAgIHJldHVybiAoc2l6ZV90KXI7CisJZXJyID0gU1NMX2dldF9lcnJvcihzb2FwLT5zc2wsIHIpOworCWlmIChlcnIgIT0gU1NMX0VSUk9SX05PTkUgJiYgZXJyICE9IFNTTF9FUlJPUl9XQU5UX1JFQUQgJiYgZXJyICE9IFNTTF9FUlJPUl9XQU5UX1dSSVRFKQorICAgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgZWxzZSBpZiAoc29hcC0+YmlvKQorICAgICAgeyByID0gQklPX3JlYWQoc29hcC0+YmlvLCBzLCBuKTsKKyAgICAgICAgaWYgKHIgPiAwKQorICAgICAgICAgIHJldHVybiAoc2l6ZV90KXI7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgZWxzZQorI2VuZGlmCisgICAgICB7IAorI2lmZGVmIFdJVEhfVURQCisgICAgICAgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgICAgIHsgU09BUF9TT0NLTEVOX1QgayA9IChTT0FQX1NPQ0tMRU5fVClzaXplb2Yoc29hcC0+cGVlcik7CisJICBtZW1zZXQoKHZvaWQqKSZzb2FwLT5wZWVyLCAwLCBzaXplb2Yoc29hcC0+cGVlcikpOworICAgICAgICAgIHIgPSByZWN2ZnJvbSgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyLCAmayk7CS8qIHBvcnRhYmlsaXR5IG5vdGU6IHNlZSBTT0FQX1NPQ0tMRU5fVCBkZWZpbml0aW9uIGluIHN0ZHNvYXAyLmggKi8KKwkgIHNvYXAtPnBlZXJsZW4gPSAoc2l6ZV90KWs7CisjaWZuZGVmIFdJVEhfSVBWNgorICAgICAgICAgIHNvYXAtPmlwID0gbnRvaGwoc29hcC0+cGVlci5zaW5fYWRkci5zX2FkZHIpOworICAgICAgICAgIHNvYXAtPnBvcnQgPSAoaW50KW50b2hzKHNvYXAtPnBlZXIuc2luX3BvcnQpOworI2VuZGlmCisgICAgICAgIH0KKwllbHNlCisjZW5kaWYKKyAgICAgICAgICByID0gcmVjdigoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzLCBuLCBzb2FwLT5zb2NrZXRfZmxhZ3MpOworICAgICAgICBpZiAociA+PSAwKQorICAgICAgICAgIHJldHVybiAoc2l6ZV90KXI7CisgICAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUFHQUlOICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRVdPVUxEQkxPQ0spCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgIH0KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICAgIGZkX3NldCBmZDsKKyAgICAgICAgdGltZW91dC50dl9zZWMgPSAwOworICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAxMDAwMDsKKyAgICAgICAgRkRfWkVSTygmZmQpOworICAgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJmZkKTsKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICAgICAgaWYgKHNvYXAtPnNzbCAmJiBTU0xfZ2V0X2Vycm9yKHNvYXAtPnNzbCwgcikgPT0gU1NMX0VSUk9SX1dBTlRfV1JJVEUpCisgICAgICAgICAgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCBOVUxMLCAmZmQsICZmZCwgJnRpbWVvdXQpOworICAgICAgICBlbHNlCisgICAgICAgICAgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCAmZmQsIE5VTEwsICZmZCwgJnRpbWVvdXQpOworI2Vsc2UKKyAgICAgICAgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCAmZmQsIE5VTEwsICZmZCwgJnRpbWVvdXQpOworI2VuZGlmCisgICAgICAgIGlmIChyIDwgMCAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKyAgICB9CisgIH0KKyNpZmRlZiBXSVRIX0ZBU1RDR0kKKyAgcmV0dXJuIGZyZWFkKHMsIDEsIG4sIHN0ZGluKTsKKyNlbHNlCisjaWZkZWYgVU5ERVJfQ0UKKyAgcmV0dXJuIGZyZWFkKHMsIDEsIG4sIHNvYXAtPnJlY3ZmZCk7CisjZWxzZQorI2lmZGVmIFdNV19SUE1fSU8KKyAgaWYgKHNvYXAtPnJwbXJlcWlkKQorICAgIHIgPSBodHRwQmxvY2tSZWFkKHNvYXAtPnJwbXJlcWlkLCBzLCBuKTsKKyAgZWxzZQorI2VuZGlmCisgIHIgPSByZWFkKChTT0FQX1NPQ0tFVClzb2FwLT5yZWN2ZmQsIHMsIG4pOworICBpZiAociA+PSAwKQorICAgIHJldHVybiAoc2l6ZV90KXI7CisgIHNvYXAtPmVycm51bSA9IHNvYXBfZXJybm87CisgIHJldHVybiAwOworI2VuZGlmCisjZW5kaWYKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHNvYXBfd2NoYXIKK3NvYXBfZ2V0Y2h1bmtjaGFyKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcC0+YnVmaWR4IDwgc29hcC0+YnVmbGVuKQorICAgIHJldHVybiBzb2FwLT5idWZbc29hcC0+YnVmaWR4KytdOworICBzb2FwLT5idWZpZHggPSAwOworICBzb2FwLT5idWZsZW4gPSBzb2FwLT5jaHVua2J1ZmxlbiA9IHNvYXAtPmZyZWN2KHNvYXAsIHNvYXAtPmJ1ZiwgU09BUF9CVUZMRU4pOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlYWQgJXUgYnl0ZXMgZnJvbSBzb2NrZXQgJWRcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+YnVmbGVuLCBzb2FwLT5zb2NrZXQpKTsKKyAgREJHTVNHKFJFQ1YsIHNvYXAtPmJ1Ziwgc29hcC0+YnVmbGVuKTsKKyAgaWYgKHNvYXAtPmJ1ZmxlbikKKyAgICByZXR1cm4gc29hcC0+YnVmW3NvYXAtPmJ1ZmlkeCsrXTsKKyAgcmV0dXJuIEVPRjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc29hcF9pc3hkaWdpdChpbnQgYykKK3sgcmV0dXJuIChjID49ICcwJyAmJiBjIDw9ICc5JykgfHwgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKSB8fCAoYyA+PSAnYScgJiYgYyA8PSAnZicpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlY3ZfcmF3KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzaXplX3QgcmV0OworI2lmZGVmIFdJVEhfWkxJQgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIpCisgIHsgaWYgKHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID09IFpfTlVMTCkKKyAgICAgIHJldHVybiBFT0Y7CisgICAgaWYgKHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luIHx8ICFzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQpCisgICAgeyByZWdpc3RlciBpbnQgcjsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5mbGF0aW5nXG4iKSk7CisgICAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IChCeXRlKilzb2FwLT5idWY7CisgICAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgPSBTT0FQX0JVRkxFTjsKKyAgICAgIHIgPSBpbmZsYXRlKCZzb2FwLT5kX3N0cmVhbSwgWl9OT19GTFVTSCk7CisgICAgICBpZiAociA9PSBaX09LIHx8IHIgPT0gWl9TVFJFQU1fRU5EKQorICAgICAgeyBzb2FwLT5idWZpZHggPSAwOworICAgICAgICBzb2FwLT5idWZsZW4gPSBTT0FQX0JVRkxFTiAtIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dDsKKyAgICAgICAgaWYgKHNvYXAtPnpsaWJfaW4gPT0gU09BUF9aTElCX0daSVApCisgICAgICAgICAgc29hcC0+el9jcmMgPSBjcmMzMihzb2FwLT56X2NyYywgKEJ5dGUqKXNvYXAtPmJ1ZiwgKHVuc2lnbmVkIGludClzb2FwLT5idWZsZW4pOworICAgICAgICBpZiAociA9PSBaX1NUUkVBTV9FTkQpCisgICAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbmZsYXRlZCAlbHUtPiVsdSBieXRlc1xuIiwgc29hcC0+ZF9zdHJlYW0udG90YWxfaW4sIHNvYXAtPmRfc3RyZWFtLnRvdGFsX291dCkpOworICAgICAgICAgIHNvYXAtPnpfcmF0aW9faW4gPSAoZmxvYXQpc29hcC0+ZF9zdHJlYW0udG90YWxfaW4gLyAoZmxvYXQpc29hcC0+ZF9zdHJlYW0udG90YWxfb3V0OworICAgICAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gWl9OVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChzb2FwLT5idWZsZW4pCisgICAgICAgIHsgc29hcC0+Y291bnQgKz0gc29hcC0+YnVmbGVuOworICAgICAgICAgIHJldHVybiBTT0FQX09LOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmIChyICE9IFpfQlVGX0VSUk9SKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluZmxhdGUgZXJyb3I6ICVzXG4iLCBzb2FwLT5kX3N0cmVhbS5tc2c/c29hcC0+ZF9zdHJlYW0ubXNnOiIiKSk7CisgICAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gWl9OVUxMOworCXNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgICByZXR1cm4gRU9GOworICAgICAgfQorICAgIH0KK3psaWJfYWdhaW46CisgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSyAmJiAhc29hcC0+Y2h1bmtzaXplKQorICAgIHsgbWVtY3B5KHNvYXAtPmJ1Ziwgc29hcC0+el9idWYsIFNPQVBfQlVGTEVOKTsKKyAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPnpfYnVmbGVuOworICAgIH0KKyAgfQorI2VuZGlmCisjaWZuZGVmIFdJVEhfTk9IVFRQCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspIC8qIHJlYWQgSFRUUCBjaHVua2VkIHRyYW5zZmVyICovCisgIHsgCitjaHVua19hZ2FpbjoKKyAgICBpZiAoc29hcC0+Y2h1bmtzaXplKQorICAgIHsgc29hcC0+YnVmbGVuID0gcmV0ID0gc29hcC0+ZnJlY3Yoc29hcCwgc29hcC0+YnVmLCBzb2FwLT5jaHVua3NpemUgPiBTT0FQX0JVRkxFTiA/IFNPQVBfQlVGTEVOIDogc29hcC0+Y2h1bmtzaXplKTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR2V0dGluZyBjaHVuazogcmVhZCAldSBieXRlc1xuIiwgKHVuc2lnbmVkIGludClyZXQpKTsKKyAgICAgIERCR01TRyhSRUNWLCBzb2FwLT5idWYsIHJldCk7CisgICAgICBzb2FwLT5idWZpZHggPSAwOworICAgICAgc29hcC0+Y2h1bmtzaXplIC09IHJldDsKKyAgICB9CisgICAgZWxzZQorICAgIHsgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICAgICAgY2hhciAqdCwgdG1wWzhdOworICAgICAgdCA9IHRtcDsKKyAgICAgIGlmICghc29hcC0+Y2h1bmtidWZsZW4pCisgICAgICB7IHNvYXAtPmNodW5rYnVmbGVuID0gcmV0ID0gc29hcC0+ZnJlY3Yoc29hcCwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTik7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVhZCAldSBieXRlcyAoY2h1bmtlZCkgZnJvbSBzb2NrZXQgJWRcbiIsICh1bnNpZ25lZCBpbnQpcmV0LCBzb2FwLT5zb2NrZXQpKTsKKyAgICAgICAgREJHTVNHKFJFQ1YsIHNvYXAtPmJ1ZiwgcmV0KTsKKyAgICAgICAgc29hcC0+YnVmaWR4ID0gMDsKKyAgICAgICAgaWYgKCFyZXQpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmFoZWFkID0gRU9GOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBzb2FwLT5idWZpZHggPSBzb2FwLT5idWZsZW47CisgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5jaHVua2J1ZmxlbjsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR2V0dGluZyBjaHVuayBzaXplIChpZHg9JXUgbGVuPSV1KVxuIiwgKHVuc2lnbmVkIGludClzb2FwLT5idWZpZHgsICh1bnNpZ25lZCBpbnQpc29hcC0+YnVmbGVuKSk7CisgICAgICB3aGlsZSAoIXNvYXBfaXN4ZGlnaXQoKGludCkoYyA9IHNvYXBfZ2V0Y2h1bmtjaGFyKHNvYXApKSkpCisgICAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorCSAgcmV0dXJuIHNvYXAtPmFoZWFkID0gRU9GOworICAgICAgZG8KKyAgICAgICAgKnQrKyA9IChjaGFyKWM7CisgICAgICB3aGlsZSAoc29hcF9pc3hkaWdpdCgoaW50KShjID0gc29hcF9nZXRjaHVua2NoYXIoc29hcCkpKSAmJiB0IC0gdG1wIDwgNyk7CisgICAgICB3aGlsZSAoKGludCljICE9IEVPRiAmJiBjICE9ICdcbicpCisgICAgICAgIGMgPSBzb2FwX2dldGNodW5rY2hhcihzb2FwKTsKKyAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICByZXR1cm4gc29hcC0+YWhlYWQgPSBFT0Y7CisgICAgICAqdCA9ICdcMCc7CisgICAgICBzb2FwLT5jaHVua3NpemUgPSBzb2FwX3N0cnRvdWwodG1wLCAmdCwgMTYpOworICAgICAgaWYgKCFzb2FwLT5jaHVua3NpemUpCisgICAgICB7IHNvYXAtPmNodW5rYnVmbGVuID0gMDsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgb2YgY2h1bmtlZCBtZXNzYWdlXG4iKSk7CisJd2hpbGUgKChpbnQpYyAhPSBFT0YgJiYgYyAhPSAnXG4nKQorICAgICAgICAgIGMgPSBzb2FwX2dldGNodW5rY2hhcihzb2FwKTsKKyAgICAgICAgcmV0dXJuIHNvYXAtPmFoZWFkID0gRU9GOworICAgICAgfQorICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+YnVmaWR4ICsgc29hcC0+Y2h1bmtzaXplOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJNb3ZpbmcgYnVmIGxlbiB0byBpZHg9JXUgbGVuPSV1ICglcylcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+YnVmaWR4LCAodW5zaWduZWQgaW50KXNvYXAtPmJ1ZmxlbiwgdG1wKSk7CisgICAgICBpZiAoc29hcC0+YnVmbGVuID4gc29hcC0+Y2h1bmtidWZsZW4pCisgICAgICB7IHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmNodW5rYnVmbGVuOworICAgICAgICBzb2FwLT5jaHVua3NpemUgLT0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgICAgICBzb2FwLT5jaHVua2J1ZmxlbiA9IDA7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUGFzc2VkIGVuZCBvZiBidWZmZXIgZm9yIGNodW5rZWQgSFRUUCAoJXUgYnl0ZXMgbGVmdClcbiIsICh1bnNpZ25lZCBpbnQpKHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeCkpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHNvYXAtPmNodW5rYnVmbGVuKQorICAgICAgICBzb2FwLT5jaHVua3NpemUgPSAwOworICAgICAgcmV0ID0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgICAgaWYgKCFyZXQpCisgICAgICAgIGdvdG8gY2h1bmtfYWdhaW47CisgICAgfQorICB9CisgIGVsc2UKKyNlbmRpZgorICB7IHNvYXAtPmJ1ZmlkeCA9IDA7CisgICAgc29hcC0+YnVmbGVuID0gcmV0ID0gc29hcC0+ZnJlY3Yoc29hcCwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTik7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWFkICV1IGJ5dGVzIGZyb20gc29ja2V0ICVkXG4iLCAodW5zaWduZWQgaW50KXJldCwgc29hcC0+c29ja2V0KSk7CisgICAgREJHTVNHKFJFQ1YsIHNvYXAtPmJ1ZiwgcmV0KTsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+ZnByZXBhcmVyZWN2ICYmIChzb2FwLT5lcnJvciA9IHNvYXAtPmZwcmVwYXJlcmVjdihzb2FwLCBzb2FwLT5idWYsIHJldCkpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNlbmRpZgorI2lmZGVmIFdJVEhfWkxJQgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1pMSUIpCisgIHsgcmVnaXN0ZXIgaW50IHI7CisgICAgbWVtY3B5KHNvYXAtPnpfYnVmLCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOKTsKKyAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X2luID0gKEJ5dGUqKShzb2FwLT56X2J1ZiArIHNvYXAtPmJ1ZmlkeCk7CisgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfaW4gPSAodW5zaWduZWQgaW50KXJldDsKKyAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IChCeXRlKilzb2FwLT5idWY7CisgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0ID0gU09BUF9CVUZMRU47CisgICAgciA9IGluZmxhdGUoJnNvYXAtPmRfc3RyZWFtLCBaX05PX0ZMVVNIKTsKKyAgICBpZiAociA9PSBaX09LIHx8IHIgPT0gWl9TVFJFQU1fRU5EKQorICAgIHsgc29hcC0+YnVmaWR4ID0gMDsKKyAgICAgIHNvYXAtPnpfYnVmbGVuID0gc29hcC0+YnVmbGVuOworICAgICAgc29hcC0+YnVmbGVuID0gcmV0ID0gU09BUF9CVUZMRU4gLSBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQ7CisgICAgICBpZiAoc29hcC0+emxpYl9pbiA9PSBTT0FQX1pMSUJfR1pJUCkKKyAgICAgICAgc29hcC0+el9jcmMgPSBjcmMzMihzb2FwLT56X2NyYywgKEJ5dGUqKXNvYXAtPmJ1ZiwgKHVuc2lnbmVkIGludClzb2FwLT5idWZsZW4pOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbmZsYXRlZCAldSBieXRlc1xuIiwgKHVuc2lnbmVkIGludClyZXQpKTsKKyAgICAgIGlmICghcmV0KQorICAgICAgICBnb3RvIHpsaWJfYWdhaW47CisgICAgICBpZiAociA9PSBaX1NUUkVBTV9FTkQpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5mbGF0ZWQgJWx1LT4lbHUgYnl0ZXNcbiIsIHNvYXAtPmRfc3RyZWFtLnRvdGFsX2luLCBzb2FwLT5kX3N0cmVhbS50b3RhbF9vdXQpKTsKKyAgICAgICAgc29hcC0+el9yYXRpb19pbiA9IChmbG9hdClzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiAvIChmbG9hdClzb2FwLT5kX3N0cmVhbS50b3RhbF9vdXQ7CisgICAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gWl9OVUxMOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVuYWJsZSB0byBpbmZsYXRlOiAoJWQpICVzXG4iLCByLCBzb2FwLT5kX3N0cmVhbS5tc2c/c29hcC0+ZF9zdHJlYW0ubXNnOiIiKSk7CisgICAgICBzb2FwLT5kX3N0cmVhbS5uZXh0X291dCA9IFpfTlVMTDsKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgcmV0dXJuIEVPRjsKKyAgICB9CisgIH0KKyNlbmRpZgorICBzb2FwLT5jb3VudCArPSByZXQ7CisgIHJldHVybiAhcmV0OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlY3Yoc3RydWN0IHNvYXAgKnNvYXApCit7IAorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpCisgIHsgaWYgKHNvYXAtPmRpbWUuYnVmbGVuKQorICAgIHsgY2hhciAqczsKKyAgICAgIGludCBpOworICAgICAgdW5zaWduZWQgY2hhciB0bXBbMTJdOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJESU1FIGhkciBmb3IgY2h1bmtlZCBESU1FIGlzIGluIGJ1ZmZlclxuIikpOworICAgICAgc29hcC0+Y291bnQgKz0gc29hcC0+ZGltZS5idWZsZW4gLSBzb2FwLT5idWZsZW47CisgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5kaW1lLmJ1ZmxlbjsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2tpcCBwYWRkaW5nICglbGQgYnl0ZXMpXG4iLCAtKGxvbmcpc29hcC0+ZGltZS5zaXplJjMpKTsKKyAgICAgIGZvciAoaSA9IC0obG9uZylzb2FwLT5kaW1lLnNpemUmMzsgaSA+IDA7IGktLSkKKyAgICAgIHsgc29hcC0+YnVmaWR4Kys7CisgICAgICAgIGlmIChzb2FwLT5idWZpZHggPj0gc29hcC0+YnVmbGVuKQorICAgICAgICAgIGlmIChzb2FwX3JlY3ZfcmF3KHNvYXApKQorICAgICAgICAgICAgcmV0dXJuIEVPRjsKKyAgICAgIH0KKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR2V0IERJTUUgaGRyIGZvciBuZXh0IGNodW5rXG4iKSk7CisgICAgICBzID0gKGNoYXIqKXRtcDsKKyAgICAgIGZvciAoaSA9IDEyOyBpID4gMDsgaS0tKQorICAgICAgeyAqcysrID0gc29hcC0+YnVmW3NvYXAtPmJ1ZmlkeCsrXTsKKyAgICAgICAgaWYgKHNvYXAtPmJ1ZmlkeCA+PSBzb2FwLT5idWZsZW4pCisgICAgICAgICAgaWYgKHNvYXBfcmVjdl9yYXcoc29hcCkpCisgICAgICAgICAgICByZXR1cm4gRU9GOworICAgICAgfQorICAgICAgc29hcC0+ZGltZS5mbGFncyA9IHRtcFswXSAmIDB4NzsKKyAgICAgIHNvYXAtPmRpbWUuc2l6ZSA9ICgoc2l6ZV90KXRtcFs4XSA8PCAyNCkgfCAoKHNpemVfdCl0bXBbOV0gPDwgMTYpIHwgKChzaXplX3QpdG1wWzEwXSA8PCA4KSB8ICgoc2l6ZV90KXRtcFsxMV0pOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJHZXQgRElNRSBjaHVuayAoJXUgYnl0ZXMpXG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmRpbWUuc2l6ZSkpOworICAgICAgaWYgKHNvYXAtPmRpbWUuZmxhZ3MgJiBTT0FQX0RJTUVfQ0YpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTW9yZSBjaHVua2luZ1xuIikpOworICAgICAgICBzb2FwLT5kaW1lLmNodW5rc2l6ZSA9IHNvYXAtPmRpbWUuc2l6ZTsKKyAgICAgICAgaWYgKHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeCA+PSBzb2FwLT5kaW1lLnNpemUpCisgICAgICAgIHsgc29hcC0+ZGltZS5idWZsZW4gPSBzb2FwLT5idWZsZW47CisgICAgICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+YnVmaWR4ICsgc29hcC0+ZGltZS5jaHVua3NpemU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHNvYXAtPmRpbWUuY2h1bmtzaXplIC09IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJMYXN0IGNodW5rXG4iKSk7CisgICAgICAgIHNvYXAtPmRpbWUuYnVmbGVuID0gMDsKKyAgICAgICAgc29hcC0+ZGltZS5jaHVua3NpemUgPSAwOworICAgICAgfQorICAgICAgc29hcC0+Y291bnQgPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIiV1IGJ5dGVzIHJlbWFpbmluZ1xuIiwgKHVuc2lnbmVkIGludClzb2FwLT5jb3VudCkpOworICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgfQorICAgIGlmIChzb2FwLT5kaW1lLmNodW5rc2l6ZSkKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR2V0IG5leHQgRElNRSBoZHIgZm9yIGNodW5rZWQgRElNRSAoJXUgYnl0ZXMgY2h1bmspXG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmRpbWUuY2h1bmtzaXplKSk7CisgICAgICBpZiAoc29hcF9yZWN2X3Jhdyhzb2FwKSkKKyAgICAgICAgcmV0dXJuIEVPRjsKKyAgICAgIGlmIChzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHggPj0gc29hcC0+ZGltZS5jaHVua3NpemUpCisgICAgICB7IHNvYXAtPmRpbWUuYnVmbGVuID0gc29hcC0+YnVmbGVuOworICAgICAgICBzb2FwLT5jb3VudCAtPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHggLSBzb2FwLT5kaW1lLmNodW5rc2l6ZTsKKyAgICAgICAgc29hcC0+YnVmbGVuID0gc29hcC0+YnVmaWR4ICsgc29hcC0+ZGltZS5jaHVua3NpemU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHNvYXAtPmRpbWUuY2h1bmtzaXplIC09IHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeDsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiJWx1IGJ5dGVzIHJlbWFpbmluZywgY291bnQ9JXVcbiIsICh1bnNpZ25lZCBsb25nKShzb2FwLT5idWZsZW4tc29hcC0+YnVmaWR4KSwgKHVuc2lnbmVkIGludClzb2FwLT5jb3VudCkpOworICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgfQorICB9CisjZW5kaWYKKyAgcmV0dXJuIHNvYXBfcmVjdl9yYXcoc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzb2FwX3djaGFyCitTT0FQX0ZNQUMyCitzb2FwX2dldGNoYXIoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgYyA9IHNvYXAtPmFoZWFkOworICBpZiAoYykKKyAgeyBpZiAoYyAhPSBFT0YpCisgICAgICBzb2FwLT5haGVhZCA9IDA7CisgICAgcmV0dXJuIGM7CisgIH0KKyAgcmV0dXJuIHNvYXBfZ2V0MShzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwKgorU09BUF9GTUFDMgorc29hcF9jb2RlKGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwICptYXAsIGNvbnN0IGNoYXIgKnN0cikKK3sgaWYgKHN0cikKKyAgeyB3aGlsZSAobWFwLT5zdHJpbmcpCisgICAgeyBpZiAoIXN0cmNtcChzdHIsIG1hcC0+c3RyaW5nKSkgLyogY2FzZSBzZW5zaXRpdmUgKi8KKyAgICAgICAgcmV0dXJuIG1hcDsKKyAgICAgIG1hcCsrOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2xvbmcKK1NPQVBfRk1BQzIKK3NvYXBfaW50X2NvZGUoY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgKm1hcCwgY29uc3QgY2hhciAqc3RyLCBsb25nIG90aGVyKQoreyB3aGlsZSAobWFwLT5zdHJpbmcpCisgIHsgaWYgKCFzb2FwX3RhZ19jbXAoc3RyLCBtYXAtPnN0cmluZykpIC8qIGNhc2UgaW5zZW5zaXRpdmUgKi8KKyAgICAgIHJldHVybiBtYXAtPmNvZGU7CisgICAgbWFwKys7CisgIH0KKyAgcmV0dXJuIG90aGVyOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfc3RyX2NvZGUoY29uc3Qgc3RydWN0IHNvYXBfY29kZV9tYXAgKm1hcCwgbG9uZyBjb2RlKQoreyB3aGlsZSAobWFwLT5jb2RlICE9IGNvZGUgJiYgbWFwLT5zdHJpbmcpCisgICAgbWFwKys7CisgIHJldHVybiBtYXAtPnN0cmluZzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzb2FwX3djaGFyCitzb2FwX2NoYXIoc3RydWN0IHNvYXAgKnNvYXApCit7IGNoYXIgdG1wWzhdOworICByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICByZWdpc3RlciBjaGFyICpzID0gdG1wOworICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQorICB7IGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgaWYgKGMgPT0gJzsnIHx8IChpbnQpYyA9PSBFT0YpCisgICAgICBicmVhazsKKyAgICAqcysrID0gKGNoYXIpYzsKKyAgfQorICAqcyA9ICdcMCc7CisgIGlmICgqdG1wID09ICcjJykKKyAgeyBpZiAodG1wWzFdID09ICd4JyB8fCB0bXBbMV0gPT0gJ1gnKQorICAgICAgcmV0dXJuIHNvYXBfc3RydG9sKHRtcCArIDIsIE5VTEwsIDE2KTsKKyAgICByZXR1cm4gYXRvbCh0bXAgKyAxKTsKKyAgfQorICBpZiAoIXN0cmNtcCh0bXAsICJsdCIpKQorICAgIHJldHVybiAnPCc7CisgIGlmICghc3RyY21wKHRtcCwgImd0IikpCisgICAgcmV0dXJuICc+JzsKKyAgaWYgKCFzdHJjbXAodG1wLCAiYW1wIikpCisgICAgcmV0dXJuICcmJzsKKyAgaWYgKCFzdHJjbXAodG1wLCAicXVvdCIpKQorICAgIHJldHVybiAnIic7CisgIGlmICghc3RyY21wKHRtcCwgImFwb3MiKSkKKyAgICByZXR1cm4gJ1wnJzsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIHJldHVybiAoc29hcF93Y2hhcilzb2FwX2ludF9jb2RlKGh0bWxfZW50aXR5X2NvZGVzLCB0bXAsIFNPQVBfVU5LTk9XTl9DSEFSKTsKKyNlbHNlCisgIHJldHVybiBTT0FQX1VOS05PV05fQ0hBUjsgLyogdXNlIHRoaXMgdG8gcmVwcmVzZW50IHVua25vd24gY29kZSAqLworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBXSVRIX0xFQU4KK3NvYXBfd2NoYXIKK3NvYXBfZ2V0MChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXAtPmJ1ZmlkeCA+PSBzb2FwLT5idWZsZW4gJiYgc29hcF9yZWN2KHNvYXApKQorICAgIHJldHVybiBFT0Y7CisgIHJldHVybiAodW5zaWduZWQgY2hhcilzb2FwLT5idWZbc29hcC0+YnVmaWR4XTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFdJVEhfTEVBTgorc29hcF93Y2hhcgorc29hcF9nZXQxKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcC0+YnVmaWR4ID49IHNvYXAtPmJ1ZmxlbiAmJiBzb2FwX3JlY3Yoc29hcCkpCisgICAgcmV0dXJuIEVPRjsKKyAgcmV0dXJuICh1bnNpZ25lZCBjaGFyKXNvYXAtPmJ1Zltzb2FwLT5idWZpZHgrK107Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzb2FwX3djaGFyCitTT0FQX0ZNQUMyCitzb2FwX2dldChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICBjID0gc29hcC0+YWhlYWQ7CisgIGlmIChjKQorICB7IGlmIChjICE9IEVPRikKKyAgICAgIHNvYXAtPmFoZWFkID0gMDsKKyAgfQorICBlbHNlCisgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgZm9yICg7OykKKyAgeyBpZiAoc29hcC0+Y2RhdGEpCisgICAgeyBpZiAoYyA9PSAnXScpCisgICAgICB7IGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgICAgIGlmIChjID09ICddJykKKyAgICAgICAgeyBzb2FwLT5jZGF0YSA9IDA7CisgICAgICAgICAgc29hcF9nZXQxKHNvYXApOyAvKiBza2lwID4gKi8KKyAgICAgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworICAgICAgICB9CisJZWxzZQorICAgICAgICB7IHNvYXBfcmV2Z2V0MShzb2FwKTsKKyAgICAgICAgICByZXR1cm4gJ10nOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBjOworICAgIH0KKyAgICBzd2l0Y2ggKGMpCisgICAgeyBjYXNlICc8JzoKKyAgICAgICAgZG8gYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgICAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworICAgICAgICBpZiAoYyA9PSAnIScgfHwgYyA9PSAnPycgfHwgYyA9PSAnJScpCisgICAgICAgIHsgcmVnaXN0ZXIgaW50IGsgPSAxOworCSAgaWYgKGMgPT0gJyEnKQorICAgICAgICAgIHsgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgICAgICAgIGlmIChjID09ICdbJykKKyAgICAgICAgICAgIHsgZG8gYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgICAgICAgICAgd2hpbGUgKChpbnQpYyAhPSBFT0YgJiYgYyAhPSAnWycpOworICAgICAgICAgICAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgc29hcC0+Y2RhdGEgPSAxOworICAgICAgICAgICAgICBjID0gc29hcF9nZXQxKHNvYXApOworCSAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGMgPT0gJy0nICYmIChjID0gc29hcF9nZXQxKHNvYXApKSA9PSAnLScpCisgICAgICAgICAgICB7IGRvCisgICAgICAgICAgICAgIHsgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAnLScgJiYgKGMgPSBzb2FwX2dldDEoc29hcCkpID09ICctJykKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9IHdoaWxlICgoaW50KWMgIT0gRU9GKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisJICBlbHNlIGlmIChjID09ICc/JykKKyAgICAgICAgICAgIGMgPSBzb2FwX2dldF9waShzb2FwKTsKKyAgICAgICAgICB3aGlsZSAoKGludCljICE9IEVPRikKKyAgICAgICAgICB7IGlmIChjID09ICc8JykKKwkgICAgICBrKys7CisJICAgIGVsc2UgaWYgKGMgPT0gJz4nKQorCSAgICB7IGlmICgtLWsgPD0gMCkKKwkgICAgICAgIGJyZWFrOworCSAgICB9CisJICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisJICB9CisJICBpZiAoKGludCljID09IEVPRikKKwkgICAgYnJlYWs7CisgICAgICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYyA9PSAnLycpCisgICAgICAgICAgcmV0dXJuIFNPQVBfVFQ7CisgICAgICAgIHNvYXBfcmV2Z2V0MShzb2FwKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfTFQ7CisgICAgICBjYXNlICc+JzoKKyAgICAgICAgcmV0dXJuIFNPQVBfR1Q7CisgICAgICBjYXNlICciJzoKKyAgICAgICAgcmV0dXJuIFNPQVBfUVQ7CisgICAgICBjYXNlICdcJyc6CisgICAgICAgIHJldHVybiBTT0FQX0FQOworICAgICAgY2FzZSAnJic6CisgICAgICAgIHJldHVybiBzb2FwX2NoYXIoc29hcCkgfCAweDgwMDAwMDAwOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gYzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzb2FwX3djaGFyCitzb2FwX2dldF9waShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgY2hhciBidWZbNjRdOworICByZWdpc3RlciBjaGFyICpzID0gYnVmOworICByZWdpc3RlciBpbnQgaSA9IHNpemVvZihidWYpOworICByZWdpc3RlciBzb2FwX3djaGFyIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgIC8qIFRoaXMgaXMgYSBxdWljayB3YXkgdG8gcGFyc2UgWE1MIFBJIGFuZCB3ZSBjb3VsZCB1c2UgYSBjYWxsYmFjayBpbnN0ZWFkIHRvCisgICAqIGVuYWJsZSBhcHBsaWNhdGlvbnMgdG8gaW50ZXJjZXB0IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zICovCisgIHdoaWxlICgoaW50KWMgIT0gRU9GICYmIGMgIT0gJz8nKQorICB7IGlmICgtLWkgPiAwKQorICAgIHsgaWYgKHNvYXBfYmxhbmsoYykpCisgICAgICAgIGMgPSAnICc7CisgICAgICAqcysrID0gKGNoYXIpYzsKKyAgICB9CisgICAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgfQorICAqcyA9ICdcMCc7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiWE1MIFBJIDw/JXM/PlxuIiwgYnVmKSk7CisgIGlmICghc3RybmNtcChidWYsICJ4bWwgIiwgNCkpCisgIHsgcyA9IHN0cnN0cihidWYsICIgZW5jb2Rpbmc9Iik7CisgICAgaWYgKHMgJiYgc1sxMF0pCisgICAgeyBpZiAoIXNvYXBfdGFnX2NtcChzICsgMTEsICJpc28tODg1OS0xKiIpCisgICAgICAgfHwgIXNvYXBfdGFnX2NtcChzICsgMTEsICJsYXRpbjEqIikpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU3dpdGNoaW5nIHRvIGxhdGluMSBlbmNvZGluZ1xuIikpOworICAgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX0xBVElOOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChzICsgMTEsICJ1dGYtOCoiKSkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTd2l0Y2hpbmcgdG8gdXRmLTggZW5jb2RpbmdcbiIpKTsKKyAgICAgICAgc29hcC0+bW9kZSAmPSB+U09BUF9FTkNfTEFUSU47CisgICAgICB9CisgICAgfQorICB9CisgIGlmICgoaW50KWMgIT0gRU9GKQorICAgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgIHJldHVybiBjOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX21vdmUoc3RydWN0IHNvYXAgKnNvYXAsIGxvbmcgbikKK3sgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJNb3ZpbmcgJWxkIGJ5dGVzIGZvcndhcmRcbiIsIChsb25nKW4pKTsKKyAgZm9yICg7IG4gPiAwOyBuLS0pCisgICAgaWYgKChpbnQpc29hcF9nZXRjaGFyKHNvYXApID09IEVPRikKKyAgICAgIHJldHVybiBTT0FQX0VPRjsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3NpemVfdAorU09BUF9GTUFDMgorc29hcF90ZWxsKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZXR1cm4gc29hcC0+Y291bnQgLSBzb2FwLT5idWZsZW4gKyBzb2FwLT5idWZpZHggLSAoc29hcC0+YWhlYWQgIT0gMCk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXR1dGY4KHN0cnVjdCBzb2FwICpzb2FwLCByZWdpc3RlciB1bnNpZ25lZCBsb25nIGMpCit7IGNoYXIgdG1wWzE2XTsKKyAgaWYgKGMgPiAwICYmIGMgPCAweDgwKQorICB7ICp0bXAgPSAoY2hhciljOworICAgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsIHRtcCwgMSk7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICB7IHJlZ2lzdGVyIGNoYXIgKnQgPSB0bXA7CisgICAgaWYgKGMgPCAweDA4MDApCisgICAgICAqdCsrID0gKGNoYXIpKDB4QzAgfCAoKGMgPj4gNikgJiAweDFGKSk7CisgICAgZWxzZQorICAgIHsgaWYgKGMgPCAweDAxMDAwMCkKKyAgICAgICAgKnQrKyA9IChjaGFyKSgweEUwIHwgKChjID4+IDEyKSAmIDB4MEYpKTsKKyAgICAgIGVsc2UKKyAgICAgIHsgaWYgKGMgPCAweDIwMDAwMCkKKyAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjAgfCAoKGMgPj4gMTgpICYgMHgwNykpOworICAgICAgICBlbHNlCisgICAgICAgIHsgaWYgKGMgPCAweDA0MDAwMDAwKQorICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEY4IHwgKChjID4+IDI0KSAmIDB4MDMpKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeyAqdCsrID0gKGNoYXIpKDB4RkMgfCAoKGMgPj4gMzApICYgMHgwMSkpOworICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDI0KSAmIDB4M0YpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDE4KSAmIDB4M0YpKTsKKyAgICAgICAgfSAgICAgCisgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAxMikgJiAweDNGKSk7CisgICAgICB9CisgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gNikgJiAweDNGKSk7CisgICAgfQorICAgICp0KysgPSAoY2hhcikoMHg4MCB8IChjICYgMHgzRikpOworICAgICp0ID0gJ1wwJzsKKyAgfQorICBlbHNlCisjZW5kaWYKKyAgICBzcHJpbnRmKHRtcCwgIiYjJWx1OyIsIGMpOworICByZXR1cm4gc29hcF9zZW5kKHNvYXAsIHRtcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzb2FwX3djaGFyCitTT0FQX0ZNQUMyCitzb2FwX2dldHV0Zjgoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYywgYzEsIGMyLCBjMywgYzQ7CisgIGMgPSBzb2FwLT5haGVhZDsKKyAgaWYgKGMgPiAweEZGKQorICB7IHNvYXAtPmFoZWFkID0gMDsKKyAgICByZXR1cm4gYzsKKyAgfQorYWdhaW46CisgIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgaWYgKGMgPCAweDgwIHx8IChzb2FwLT5tb2RlICYgU09BUF9FTkNfTEFUSU4pKQorICAgIHJldHVybiBjOworICBjMSA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgaWYgKGMxIDwgMHg4MCkKKyAgeyBzb2FwX3JldmdldDEoc29hcCk7IC8qIGRvZXNuJ3QgbG9vayBsaWtlIHRoaXMgaXMgVVRGOCAqLworICAgIHJldHVybiBjOworICB9CisgIGMxICY9IDB4M0Y7CisgIGlmIChjIDwgMHhFMCkKKyAgICByZXR1cm4gKChzb2FwX3djaGFyKShjICYgMHgxRikgPDwgNikgfCBjMTsKKyAgYzIgPSAoc29hcF93Y2hhcilzb2FwX2dldDEoc29hcCkgJiAweDNGOworICBpZiAoYyA9PSAweEVGICYmIGMxID09IDB4M0IgJiYgYzIgPT0gMHgzRikJLyogaWdub3JlIFVURi04IEJPTSAqLworICAgIGdvdG8gYWdhaW47CisgIGlmIChjIDwgMHhGMCkKKyAgICByZXR1cm4gKChzb2FwX3djaGFyKShjICYgMHgwRikgPDwgMTIpIHwgKGMxIDw8IDYpIHwgYzI7CisgIGMzID0gKHNvYXBfd2NoYXIpc29hcF9nZXQxKHNvYXApICYgMHgzRjsKKyAgaWYgKGMgPCAweEY4KQorICAgIHJldHVybiAoKHNvYXBfd2NoYXIpKGMgJiAweDA3KSA8PCAxOCkgfCAoYzEgPDwgMTIpIHwgKGMyIDw8IDYpIHwgYzM7CisgIGM0ID0gKHNvYXBfd2NoYXIpc29hcF9nZXQxKHNvYXApICYgMHgzRjsKKyAgaWYgKGMgPCAweEZDKQorICAgIHJldHVybiAoKHNvYXBfd2NoYXIpKGMgJiAweDAzKSA8PCAyNCkgfCAoYzEgPDwgMTgpIHwgKGMyIDw8IDEyKSB8IChjMyA8PCA2KSB8IGM0OworICByZXR1cm4gKChzb2FwX3djaGFyKShjICYgMHgwMSkgPDwgMzApIHwgKGMxIDw8IDI0KSB8IChjMiA8PCAxOCkgfCAoYzMgPDwgMTIpIHwgKGM0IDw8IDYpIHwgKHNvYXBfd2NoYXIpKHNvYXBfZ2V0MShzb2FwKSAmIDB4M0YpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dGhleChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgdW5zaWduZWQgY2hhciAqcywgaW50IG4pCit7IGNoYXIgZFsyXTsKKyAgcmVnaXN0ZXIgaW50IGk7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgaWYgKCEoc29hcC0+ZG9tLT5kYXRhID0gc29hcF9zMmhleChzb2FwLCBzLCBOVUxMLCBuKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNlbmRpZgorICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICB7IHJlZ2lzdGVyIGludCBtID0gKnMrKzsKKyAgICBkWzBdID0gKGNoYXIpKChtID4+IDQpICsgKG0gPiAxNTkgPyAnNycgOiAnMCcpKTsKKyAgICBtICY9IDB4MEY7CisgICAgZFsxXSA9IChjaGFyKShtICsgKG0gPiA5ID8gJzcnIDogJzAnKSk7CisgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgZCwgMikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit1bnNpZ25lZCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9nZXRoZXgoc3RydWN0IHNvYXAgKnNvYXAsIGludCAqbikKK3sKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBzb2FwLT5kb20tPmRhdGEgPSBzb2FwX3N0cmluZ19pbihzb2FwLCAwLCAtMSwgLTEpOworICAgIHJldHVybiAodW5zaWduZWQgY2hhciopc29hcF9oZXgycyhzb2FwLCBzb2FwLT5kb20tPmRhdGEsIE5VTEwsIDAsIG4pOworICB9CisjZW5kaWYKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgc29hcC0+bGFiaWR4ID0gMDsKKyAgZm9yICg7OykKKyAgeyByZWdpc3RlciBjaGFyICpzOworICAgIHJlZ2lzdGVyIGludCBpLCBrOworICAgIGlmIChzb2FwX2FwcGVuZF9sYWIoc29hcCwgTlVMTCwgMCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBzID0gc29hcC0+bGFiYnVmICsgc29hcC0+bGFiaWR4OworICAgIGsgPSBzb2FwLT5sYWJsZW4gLSBzb2FwLT5sYWJpZHg7CisgICAgc29hcC0+bGFiaWR4ID0gc29hcC0+bGFibGVuOworICAgIGZvciAoaSA9IDA7IGkgPCBrOyBpKyspCisgICAgeyByZWdpc3RlciBjaGFyIGQxLCBkMjsKKyAgICAgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgICAgIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgICAgIGlmIChzb2FwX2lzeGRpZ2l0KGMpKQorICAgICAgeyBkMSA9IChjaGFyKWM7CisgICAgICAgIGMgPSBzb2FwX2dldChzb2FwKTsgCisJaWYgKHNvYXBfaXN4ZGlnaXQoYykpCisgICAgICAgICAgZDIgPSAoY2hhciljOworICAgICAgICBlbHNlIAorICAgICAgICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IHVuc2lnbmVkIGNoYXIgKnA7CisgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgIGlmIChuKQorICAgICAgICAgICpuID0gKGludCkoc29hcC0+bGFibGVuIC0gayArIGkpOworICAgICAgICBwID0gKHVuc2lnbmVkIGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHNvYXAtPmxhYmxlbiAtIGsgKyBpKTsKKwlpZiAocCkKKwkgIG1lbWNweShwLCBzb2FwLT5sYWJidWYsIHNvYXAtPmxhYmxlbiAtIGsgKyBpKTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgICB9CisgICAgICAqcysrID0gKChkMSA+PSAnQScgPyAoZDEgJiAweDcpICsgOSA6IGQxIC0gJzAnKSA8PCA0KSArIChkMiA+PSAnQScgPyAoZDIgJiAweDcpICsgOSA6IGQyIC0gJzAnKTsKKyAgICB9CisgIH0KKyNlbHNlCisgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgZm9yICg7OykKKyAgeyByZWdpc3RlciBpbnQgaTsKKyAgICByZWdpc3RlciBjaGFyICpzID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBTT0FQX0JMS0xFTik7CisgICAgaWYgKCFzKQorICAgIHsgc29hcF9lbmRfYmxvY2soc29hcCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IFNPQVBfQkxLTEVOOyBpKyspCisgICAgeyByZWdpc3RlciBjaGFyIGQxLCBkMjsKKyAgICAgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IHNvYXBfZ2V0KHNvYXApOworICAgICAgaWYgKHNvYXBfaXN4ZGlnaXQoYykpCisgICAgICB7IGQxID0gKGNoYXIpYzsKKyAgICAgICAgYyA9IHNvYXBfZ2V0KHNvYXApOyAKKwlpZiAoc29hcF9pc3hkaWdpdChjKSkKKyAgICAgICAgICBkMiA9IChjaGFyKWM7CisgICAgICAgIGVsc2UgCisgICAgICAgIHsgc29hcF9lbmRfYmxvY2soc29hcCk7CisJICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyB1bnNpZ25lZCBjaGFyICpwOworICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICBpZiAobikKKyAgICAgICAgICAqbiA9IHNvYXBfc2l6ZV9ibG9jayhzb2FwLCBpKTsKKyAgICAgICAgcCA9ICh1bnNpZ25lZCBjaGFyKilzb2FwX3NhdmVfYmxvY2soc29hcCwgTlVMTCwgMCk7CisgICAgICAgIHJldHVybiBwOworICAgICAgfQorICAgICAgKnMrKyA9ICgoZDEgPj0gJ0EnID8gKGQxICYgMHg3KSArIDkgOiBkMSAtICcwJykgPDwgNCkgKyAoZDIgPj0gJ0EnID8gKGQyICYgMHg3KSArIDkgOiBkMiAtICcwJyk7CisgICAgfQorICB9CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRiYXNlNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMsIGludCBuKQoreyByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBtOworICBjaGFyIGRbNF07CisgIGlmICghcykKKyAgICByZXR1cm4gU09BUF9PSzsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBpZiAoIShzb2FwLT5kb20tPmRhdGEgPSBzb2FwX3MyYmFzZTY0KHNvYXAsIHMsIE5VTEwsIG4pKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2VuZGlmCisgIGZvciAoOyBuID4gMjsgbiAtPSAzLCBzICs9IDMpCisgIHsgbSA9IHNbMF07CisgICAgbSA9IChtIDw8IDgpIHwgc1sxXTsKKyAgICBtID0gKG0gPDwgOCkgfCBzWzJdOworICAgIGZvciAoaSA9IDQ7IGkgPiAwOyBtID4+PSA2KQorICAgICAgZFstLWldID0gc29hcF9iYXNlNjRvW20gJiAweDNGXTsKKyAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBkLCA0KSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAobiA+IDApCisgIHsgbSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgIG0gPSAobSA8PCA4KSB8ICpzKys7CisgICAgZm9yICg7IGkgPCAzOyBpKyspCisgICAgICBtIDw8PSA4OworICAgIGZvciAoaSsrOyBpID4gMDsgbSA+Pj0gNikKKyAgICAgIGRbLS1pXSA9IHNvYXBfYmFzZTY0b1ttICYgMHgzRl07CisgICAgZm9yIChpID0gMzsgaSA+IG47IGktLSkKKyAgICAgIGRbaV0gPSAnPSc7CisgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgZCwgNCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit1bnNpZ25lZCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9nZXRiYXNlNjQoc3RydWN0IHNvYXAgKnNvYXAsIGludCAqbiwgaW50IG1hbGxvY19mbGFnKQoreyAKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBzb2FwLT5kb20tPmRhdGEgPSBzb2FwX3N0cmluZ19pbihzb2FwLCAwLCAtMSwgLTEpOworICAgIHJldHVybiAodW5zaWduZWQgY2hhciopc29hcF9iYXNlNjQycyhzb2FwLCBzb2FwLT5kb20tPmRhdGEsIE5VTEwsIDAsIG4pOworICB9CisjZW5kaWYKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgc29hcC0+bGFiaWR4ID0gMDsKKyAgZm9yICg7OykKKyAgeyByZWdpc3RlciBpbnQgaSwgazsKKyAgICByZWdpc3RlciBjaGFyICpzOworICAgIGlmIChzb2FwX2FwcGVuZF9sYWIoc29hcCwgTlVMTCwgMikpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBzID0gc29hcC0+bGFiYnVmICsgc29hcC0+bGFiaWR4OworICAgIGsgPSBzb2FwLT5sYWJsZW4gLSBzb2FwLT5sYWJpZHg7CisgICAgc29hcC0+bGFiaWR4ID0gMyAqIChzb2FwLT5sYWJsZW4gLyAzKTsKKyAgICBpZiAoIXMpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgayAtIDI7IGkgKz0gMykKKyAgICB7IHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbSA9IDA7CisgICAgICByZWdpc3RlciBpbnQgaiA9IDA7CisgICAgICBkbworICAgICAgeyByZWdpc3RlciBzb2FwX3djaGFyIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgICAgICAgaWYgKGMgPT0gJz0nIHx8IGMgPCAwKQorICAgICAgICB7IHVuc2lnbmVkIGNoYXIgKnA7CisgICAgICAgICAgc3dpdGNoIChqKQorICAgICAgICAgIHsgY2FzZSAyOgorICAgICAgICAgICAgICAqcysrID0gKGNoYXIpKChtID4+IDQpICYgMHhGRik7CisgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gMTApICYgMHhGRik7CisgICAgICAgICAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gMikgJiAweEZGKTsKKyAgICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobikKKyAgICAgICAgICAgICpuID0gKGludCkoc29hcC0+bGFibGVuIC0gayArIGkpOworICAgICAgICAgIHAgPSAodW5zaWduZWQgY2hhciopc29hcF9tYWxsb2Moc29hcCwgc29hcC0+bGFibGVuIC0gayArIGkpOworCSAgaWYgKHApCisJICAgIG1lbWNweShwLCBzb2FwLT5sYWJidWYsIHNvYXAtPmxhYmxlbiAtIGsgKyBpKTsKKyAgICAgICAgICBpZiAoYyA+PSAwKQorICAgICAgICAgIHsgd2hpbGUgKChpbnQpKChjID0gc29hcF9nZXQoc29hcCkpICE9IEVPRikgJiYgYyAhPSBTT0FQX0xUICYmIGMgIT0gU09BUF9UVCkKKyAgICAgICAgICAgICAgOworCSAgfQorICAgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgIH0KKyAgICAgICAgYyAtPSAnKyc7CisgICAgICAgIGlmIChjID49IDAgJiYgYyA8PSA3OSkKKyAgICAgICAgeyBtID0gKG0gPDwgNikgKyBzb2FwX2Jhc2U2NGlbY107CisgICAgICAgICAgaisrOworICAgICAgICB9CisgICAgICB9IHdoaWxlIChqIDwgNCk7CisgICAgICAqcysrID0gKGNoYXIpKChtID4+IDE2KSAmIDB4RkYpOworICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiA4KSAmIDB4RkYpOworICAgICAgKnMrKyA9IChjaGFyKShtICYgMHhGRik7CisgICAgfQorICB9CisjZWxzZQorICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgcmV0dXJuIE5VTEw7CisgIGZvciAoOzspCisgIHsgcmVnaXN0ZXIgaW50IGk7CisgICAgcmVnaXN0ZXIgY2hhciAqcyA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgMyAqIFNPQVBfQkxLTEVOKTsgLyogbXVzdCBiZSBtdWx0aXBsZSBvZiAzICovCisgICAgaWYgKCFzKQorICAgIHsgc29hcF9lbmRfYmxvY2soc29hcCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IFNPQVBfQkxLTEVOOyBpKyspCisgICAgeyByZWdpc3RlciB1bnNpZ25lZCBsb25nIG0gPSAwOworICAgICAgcmVnaXN0ZXIgaW50IGogPSAwOworICAgICAgZG8KKyAgICAgIHsgcmVnaXN0ZXIgc29hcF93Y2hhciBjID0gc29hcF9nZXQoc29hcCk7CisgICAgICAgIGlmIChjID09ICc9JyB8fCBjIDwgMCkKKyAgICAgICAgeyB1bnNpZ25lZCBjaGFyICpwOworICAgICAgICAgIGkgKj0gMzsKKyAgICAgICAgICBzd2l0Y2ggKGopCisgICAgICAgICAgeyBjYXNlIDI6CisgICAgICAgICAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gNCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiAxMCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgKnMrKyA9IChjaGFyKSgobSA+PiAyKSAmIDB4RkYpOworICAgICAgICAgICAgICBpICs9IDI7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChuKQorCSAgICAqbiA9IChpbnQpc29hcF9zaXplX2Jsb2NrKHNvYXAsIGkpOworICAgICAgICAgIHAgPSAodW5zaWduZWQgY2hhciopc29hcF9zYXZlX2Jsb2NrKHNvYXAsIE5VTEwsIDApOworICAgICAgICAgIGlmIChjID49IDApCisgICAgICAgICAgeyB3aGlsZSAoKGludCkoKGMgPSBzb2FwX2dldChzb2FwKSkgIT0gRU9GKSAmJiBjICE9IFNPQVBfTFQgJiYgYyAhPSBTT0FQX1RUKQorICAgICAgICAgICAgICA7CisJICB9CisgICAgICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgfQorICAgICAgICBjIC09ICcrJzsKKyAgICAgICAgaWYgKGMgPj0gMCAmJiBjIDw9IDc5KQorICAgICAgICB7IG0gPSAobSA8PCA2KSArIHNvYXBfYmFzZTY0aVtjXTsKKyAgICAgICAgICBqKys7CisgICAgICAgIH0KKyAgICAgIH0gd2hpbGUgKGogPCA0KTsKKyAgICAgICpzKysgPSAoY2hhcikoKG0gPj4gMTYpICYgMHhGRik7CisgICAgICAqcysrID0gKGNoYXIpKChtID4+IDgpICYgMHhGRik7CisgICAgICAqcysrID0gKGNoYXIpKG0gJiAweEZGKTsKKyAgICB9CisgIH0KKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3hvcF9mb3J3YXJkKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBjaGFyICoqcHRyLCBpbnQgKnNpemUsIGNoYXIgKippZCwgY2hhciAqKnR5cGUsIGNoYXIgKipvcHRpb25zKQoreyAvKiBDaGVjayBNVE9NIHhvcDpJbmNsdWRlIGVsZW1lbnQgKHdpdGhpbiBoZXgvYmFzZTY0QmluYXJ5KSAqLworICAvKiBUT0RPOiB0aGlzIGNvZGUgdG8gYmUgb2Jzb2xldGVkIHdpdGggbmV3IGltcG9ydC94b3AuaCBjb252ZW50aW9ucyAqLworICBpbnQgYm9keSA9IHNvYXAtPmJvZHk7IC8qIHNob3VsZCBzYXZlIHR5cGUgdG9vPyAqLworICBpZiAoIXNvYXBfcGVla19lbGVtZW50KHNvYXApKQorICB7IGlmICghc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsICJ4b3A6SW5jbHVkZSIsIDApICYmICpzb2FwLT5ocmVmKQorICAgIHsgaWYgKHNvYXBfZGltZV9mb3J3YXJkKHNvYXAsIHB0ciwgc2l6ZSwgaWQsIHR5cGUsIG9wdGlvbnMpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgTlVMTCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgc29hcC0+Ym9keSA9IGJvZHk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZGltZV9mb3J3YXJkKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBjaGFyICoqcHRyLCBpbnQgKnNpemUsIGNoYXIgKippZCwgY2hhciAqKnR5cGUsIGNoYXIgKipvcHRpb25zKQoreyBzdHJ1Y3Qgc29hcF94bGlzdCAqeHAgPSAoc3RydWN0IHNvYXBfeGxpc3QqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF94bGlzdCkpOworICAqcHRyID0gTlVMTDsKKyAgKnNpemUgPSAwOworICAqaWQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT5ocmVmKTsKKyAgKnR5cGUgPSBOVUxMOworICAqb3B0aW9ucyA9IE5VTEw7CisgIGlmICgheHApCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgIHhwLT5uZXh0ID0gc29hcC0+eGxpc3Q7CisgIHhwLT5wdHIgPSBwdHI7CisgIHhwLT5zaXplID0gc2l6ZTsKKyAgeHAtPmlkID0gKmlkOworICB4cC0+dHlwZSA9IHR5cGU7CisgIHhwLT5vcHRpb25zID0gb3B0aW9uczsKKyAgc29hcC0+eGxpc3QgPSB4cDsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9zdHJkdXAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMpCit7IGNoYXIgKnQgPSBOVUxMOworICBpZiAocyAmJiAodCA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzdHJsZW4ocykgKyAxKSkpCisgICAgc3RyY3B5KHQsIHMpOworICByZXR1cm4gdDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9uZXdfYmxvY2soc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX2JsaXN0ICpwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk5ldyBibG9jayBzZXF1ZW5jZSAocHJldj0lcClcbiIsIHNvYXAtPmJsaXN0KSk7CisgIGlmICghKHAgPSAoc3RydWN0IHNvYXBfYmxpc3QqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9ibGlzdCkpKSkKKyAgICByZXR1cm4gU09BUF9FT007ICAgCisgIHAtPm5leHQgPSBzb2FwLT5ibGlzdDsgCisgIHAtPnB0ciA9IE5VTEw7CisgIHAtPnNpemUgPSAwOworICBzb2FwLT5ibGlzdCA9IHA7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZCoKK1NPQVBfRk1BQzIKK3NvYXBfcHVzaF9ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCwgc2l6ZV90IG4pCit7IGNoYXIgKnA7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUHVzaCBibG9jayBvZiAldSBieXRlcyAoJXUgYnl0ZXMgdG90YWwpXG4iLCAodW5zaWduZWQgaW50KW4sICh1bnNpZ25lZCBpbnQpc29hcC0+Ymxpc3QtPnNpemUgKyAodW5zaWduZWQgaW50KW4pKTsKKyAgaWYgKCEocCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBuICsgc2l6ZW9mKGNoYXIqKSArIHNpemVvZihzaXplX3QpKSkpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICAqKGNoYXIqKilwID0gc29hcC0+Ymxpc3QtPnB0cjsKKyAgKihzaXplX3QqKShwICsgc2l6ZW9mKGNoYXIqKSkgPSBuOworICBzb2FwLT5ibGlzdC0+cHRyID0gcDsKKyAgc29hcC0+Ymxpc3QtPnNpemUgKz0gbjsKKyAgcmV0dXJuIHAgKyBzaXplb2YoY2hhciopICsgc2l6ZW9mKHNpemVfdCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3BvcF9ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgY2hhciAqcDsKKyAgaWYgKCFzb2FwLT5ibGlzdC0+cHRyKQorICAgIHJldHVybjsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQb3AgYmxvY2tcbiIpKTsKKyAgcCA9IHNvYXAtPmJsaXN0LT5wdHI7CisgIHNvYXAtPmJsaXN0LT5zaXplIC09ICooc2l6ZV90KikocCArIHNpemVvZihjaGFyKikpOworICBzb2FwLT5ibGlzdC0+cHRyID0gKihjaGFyKiopcDsKKyAgU09BUF9GUkVFKHNvYXAsIHApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyB2b2lkCitzb2FwX3VwZGF0ZV9wdHJzKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpzdGFydCwgY2hhciAqZW5kLCBjaGFyICpwMSwgY2hhciAqcDIpCit7IGludCBpOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2ZsaXN0ICpmcDsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfeGxpc3QgKnhwOworI2VuZGlmCisgIHJlZ2lzdGVyIHZvaWQgKnAsICoqcTsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfSURIQVNIOyBpKyspCisgIHsgZm9yIChpcCA9IHNvYXAtPmlodFtpXTsgaXA7IGlwID0gaXAtPm5leHQpCisgICAgeyBpZiAoaXAtPnB0ciAmJiAoY2hhciopaXAtPnB0ciA+PSBzdGFydCAmJiAoY2hhciopaXAtPnB0ciA8IGVuZCkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVcGRhdGUgaWQ9JyVzJyAlcCAtPiAlcFxuIiwgaXAtPmlkLCBpcC0+cHRyLCAoY2hhciopaXAtPnB0ciArIChwMS1wMikpKTsKKyAgICAgICAgaXAtPnB0ciA9IChjaGFyKilpcC0+cHRyICsgKHAxLXAyKTsKKyAgICAgIH0KKyAgICAgIGZvciAocSA9ICZpcC0+bGluazsgcTsgcSA9ICh2b2lkKiopcCkKKyAgICAgIHsgcCA9ICpxOworICAgICAgICBpZiAocCAmJiAoY2hhciopcCA+PSBzdGFydCAmJiAoY2hhciopcCA8IGVuZCkKKyAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkxpbmsgdXBkYXRlIGlkPSclcycgJXBcbiIsIGlwLT5pZCwgcCkpOworICAgICAgICAgICpxID0gKGNoYXIqKXAgKyAocDEtcDIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBmb3IgKHEgPSAmaXAtPmNvcHk7IHE7IHEgPSAodm9pZCoqKXApCisgICAgICB7IHAgPSAqcTsKKyAgICAgICAgaWYgKHAgJiYgKGNoYXIqKXAgPj0gc3RhcnQgJiYgKGNoYXIqKXAgPCBlbmQpCisgICAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3B5IGNoYWluIHVwZGF0ZSBpZD0nJXMnICVwXG4iLCBpcC0+aWQsIHApKTsKKyAgICAgICAgICAqcSA9IChjaGFyKilwICsgKHAxLXAyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZm9yIChmcCA9IGlwLT5mbGlzdDsgZnA7IGZwID0gZnAtPm5leHQpCisgICAgICB7IGlmICgoY2hhciopZnAtPnB0ciA+PSBzdGFydCAmJiAoY2hhciopZnAtPnB0ciA8IGVuZCkKKyAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHkgbGlzdCB1cGRhdGUgaWQ9JyVzJyAlcFxuIiwgaXAtPmlkLCBmcCkpOworICAgICAgICAgIGZwLT5wdHIgPSAoY2hhciopZnAtPnB0ciArIChwMS1wMik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgZm9yICh4cCA9IHNvYXAtPnhsaXN0OyB4cDsgeHAgPSB4cC0+bmV4dCkKKyAgeyBpZiAoeHAtPnB0ciAmJiAoY2hhciopeHAtPnB0ciA+PSBzdGFydCAmJiAoY2hhciopeHAtPnB0ciA8IGVuZCkKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVXBkYXRlIGlkPSclcycgJXAgLT4gJXBcbiIsIHhwLT5pZD94cC0+aWQ6IiIsIHhwLT5wdHIsIChjaGFyKil4cC0+cHRyICsgKHAxLXAyKSkpOworICAgICAgeHAtPnB0ciA9ICh1bnNpZ25lZCBjaGFyKiopKChjaGFyKil4cC0+cHRyICsgKHAxLXAyKSk7CisgICAgICB4cC0+c2l6ZSA9IChpbnQqKSgoY2hhciopeHAtPnNpemUgKyAocDEtcDIpKTsKKyAgICAgIHhwLT50eXBlID0gKGNoYXIqKikoKGNoYXIqKXhwLT50eXBlICsgKHAxLXAyKSk7CisgICAgICB4cC0+b3B0aW9ucyA9IChjaGFyKiopKChjaGFyKil4cC0+b3B0aW9ucyArIChwMS1wMikpOworICAgIH0KKyAgfQorI2VuZGlmCit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzb2FwX2hhc19jb3BpZXMoc3RydWN0IHNvYXAgKnNvYXAsIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnN0YXJ0LCByZWdpc3RlciBjb25zdCBjaGFyICplbmQpCit7IHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2ZsaXN0ICpmcDsKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqcDsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfSURIQVNIOyBpKyspCisgIHsgZm9yIChpcCA9IHNvYXAtPmlodFtpXTsgaXA7IGlwID0gaXAtPm5leHQpCisgICAgeyBmb3IgKHAgPSAoY29uc3QgY2hhciopaXAtPmNvcHk7IHA7IHAgPSAqKGNvbnN0IGNoYXIqKilwKQorICAgICAgICBpZiAocCA+PSBzdGFydCAmJiBwIDwgZW5kKQorICAgICAgICAgIHJldHVybiBTT0FQX0VSUjsKKyAgICAgIGZvciAoZnAgPSBpcC0+Zmxpc3Q7IGZwOyBmcCA9IGZwLT5uZXh0KQorICAgICAgICBpZiAoKGNvbnN0IGNoYXIqKWZwLT5wdHIgPj0gc3RhcnQgJiYgKGNvbnN0IGNoYXIqKWZwLT5wdHIgPCBlbmQpCisJICByZXR1cm4gU09BUF9FUlI7CisgICAgfQorICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3Jlc29sdmUoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2ZsaXN0ICpmcDsKKyAgc2hvcnQgZmxhZzsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHZpbmcgZm9yd2FyZGVkIGRhdGFcbiIpKTsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfSURIQVNIOyBpKyspCisgIHsgZm9yIChpcCA9IHNvYXAtPmlodFtpXTsgaXA7IGlwID0gaXAtPm5leHQpCisgICAgeyBpZiAoaXAtPnB0cikKKyAgICAgIHsgcmVnaXN0ZXIgdm9pZCAqcCwgKipxLCAqcjsKKyAgICAgICAgcSA9ICh2b2lkKiopaXAtPmxpbms7CisgICAgICAgIGlwLT5saW5rID0gTlVMTDsKKyAgICAgICAgciA9IGlwLT5wdHI7CisgICAgICAgIERCR0xPRyhURVNULCBpZiAocSkgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlRyYXZlcnNpbmcgbGluayBjaGFpbiB0byByZXNvbHZlIGlkPSclcydcbiIsIGlwLT5pZCkpOworICAgICAgICB3aGlsZSAocSkKKyAgICAgICAgeyBwID0gKnE7CisgICAgICAgICAgKnEgPSByOworICAgICAgICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICIuLi4gbGluayAlcCAtPiAlcFxuIiwgcSwgcikpOworICAgICAgICAgIHEgPSAodm9pZCoqKXA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCppcC0+aWQgPT0gJyMnKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk1pc3NpbmcgZGF0YSBmb3IgaWQ9JyVzJ1xuIiwgaXAtPmlkKSk7CisgICAgICAgIHN0cmNweShzb2FwLT5pZCwgaXAtPmlkICsgMSk7CisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTUlTU0lOR19JRDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZG8KKyAgeyBmbGFnID0gMDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc29sdXRpb24gcGhhc2VcbiIpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgU09BUF9JREhBU0g7IGkrKykKKyAgICB7IGZvciAoaXAgPSBzb2FwLT5paHRbaV07IGlwOyBpcCA9IGlwLT5uZXh0KQorICAgICAgeyBpZiAoaXAtPnB0ciAmJiAhc29hcF9oYXNfY29waWVzKHNvYXAsIChjb25zdCBjaGFyKilpcC0+cHRyLCAoY29uc3QgY2hhciopaXAtPnB0ciArIGlwLT5zaXplKSkKKyAgICAgICAgeyBpZiAoaXAtPmNvcHkpCisgICAgICAgICAgeyByZWdpc3RlciB2b2lkICpwLCAqKnEgPSAodm9pZCoqKWlwLT5jb3B5OworICAgICAgICAgICAgREJHTE9HKFRFU1QsIGlmIChxKSBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVHJhdmVyc2luZyBjb3B5IGNoYWluIHRvIHJlc29sdmUgaWQ9JyVzJ1xuIiwgaXAtPmlkKSk7CisgICAgICAgICAgICBpcC0+Y29weSA9IE5VTEw7CisgICAgICAgICAgICBkbworICAgICAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIi4uLiBjb3B5ICVwIC0+ICVwICgldSBieXRlcylcbiIsIGlwLT5wdHIsIHEsICh1bnNpZ25lZCBpbnQpaXAtPnNpemUpKTsKKwkgICAgICBwID0gKnE7CisgICAgICAgICAgICAgIG1lbWNweShxLCBpcC0+cHRyLCBpcC0+c2l6ZSk7CisgICAgICAgICAgICAgIHEgPSAodm9pZCoqKXA7CisgICAgICAgICAgICB9IHdoaWxlIChxKTsKKwkgICAgZmxhZyA9IDE7CisJICB9CisgICAgICAgICAgZm9yIChmcCA9IGlwLT5mbGlzdDsgZnA7IGZwID0gaXAtPmZsaXN0KQorICAgICAgICAgIHsgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGsgPSBmcC0+bGV2ZWw7CisJICAgIHJlZ2lzdGVyIHZvaWQgKnAgPSBpcC0+cHRyOworICAgICAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHZpbmcgZm9yd2FyZGVkIGRhdGEgdHlwZT0lZCBsb2NhdGlvbj0lcCBsZXZlbD0ldSwldSBpZD0nJXMnXG4iLCBpcC0+dHlwZSwgcCwgaXAtPmxldmVsLCBmcC0+bGV2ZWwsIGlwLT5pZCkpOworCSAgICB3aGlsZSAoaXAtPmxldmVsIDwgaykKKyAgICAgICAgICAgIHsgcmVnaXN0ZXIgdm9pZCAqKnEgPSAodm9pZCoqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZih2b2lkKikpOyAgCisJICAgICAgaWYgKCFxKQorCSAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworCSAgICAgICpxID0gcDsKKyAgICAgICAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJEZXNjZW5kaW5nIG9uZSBsZXZlbCwgbmV3IGxvY2F0aW9uPSVwIGhvbGRzPSVwLi4uXG4iLCBxLCAqcSkpOworICAgICAgICAgICAgICBwID0gKHZvaWQqKXE7CisgICAgICAgICAgICAgIGstLTsKKyAgICAgICAgICAgIH0KKwkgICAgaWYgKGZwLT5mY29weSkKKwkgICAgICBmcC0+ZmNvcHkoc29hcCwgaXAtPnR5cGUsIGZwLT50eXBlLCBmcC0+cHRyLCBmcC0+bGVuLCBwLCBpcC0+c2l6ZSk7CisJICAgIGVsc2UKKwkgICAgICBzb2FwX2Zjb3B5KHNvYXAsIGlwLT50eXBlLCBmcC0+dHlwZSwgZnAtPnB0ciwgZnAtPmxlbiwgcCwgaXAtPnNpemUpOworCSAgICBpcC0+Zmxpc3QgPSBmcC0+bmV4dDsKKwkgICAgU09BUF9GUkVFKHNvYXAsIGZwKTsKKwkgICAgZmxhZyA9IDE7CisJICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0gd2hpbGUgKGZsYWcpOworI2lmZGVmIFNPQVBfREVCVUcKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfSURIQVNIOyBpKyspCisgIHsgZm9yIChpcCA9IHNvYXAtPmlodFtpXTsgaXA7IGlwID0gaXAtPm5leHQpCisgICAgeyBpZiAoaXAtPmNvcHkgfHwgaXAtPmZsaXN0KQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc29sdXRpb24gZXJyb3I6IGZvcndhcmRlZCBkYXRhIGZvciBpZD0nJXMnIGNvdWxkIG5vdCBiZSBwcm9wYWdhdGVkLCBwbGVhc2UgcmVwb3J0IHRoaXMgcHJvYmxlbSB0byB0aGUgZGV2ZWxvcGVyc1xuIiwgaXAtPmlkKSk7CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJSZXNvbHV0aW9uIGRvbmVcbiIpKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3NpemVfdAorU09BUF9GTUFDMgorc29hcF9zaXplX2Jsb2NrKHN0cnVjdCBzb2FwICpzb2FwLCBzaXplX3QgbikKK3sgaWYgKHNvYXAtPmJsaXN0LT5wdHIpCisgIHsgc29hcC0+Ymxpc3QtPnNpemUgLT0gKihzaXplX3QqKShzb2FwLT5ibGlzdC0+cHRyICsgc2l6ZW9mKGNoYXIqKSkgLSBuOworICAgICooc2l6ZV90Kikoc29hcC0+Ymxpc3QtPnB0ciArIHNpemVvZihjaGFyKikpID0gbjsKKyAgfQorICByZXR1cm4gc29hcC0+Ymxpc3QtPnNpemU7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjaGFyKgorU09BUF9GTUFDMgorc29hcF9maXJzdF9ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgY2hhciAqcCwgKnEsICpyOworICBwID0gc29hcC0+Ymxpc3QtPnB0cjsKKyAgaWYgKCFwKQorICAgIHJldHVybiBOVUxMOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZpcnN0IGJsb2NrXG4iKSk7CisgIHIgPSBOVUxMOworICBkbworICB7IHEgPSAqKGNoYXIqKilwOworICAgICooY2hhcioqKXAgPSByOworICAgIHIgPSBwOworICAgIHAgPSBxOworICB9IHdoaWxlIChwKTsKKyAgc29hcC0+Ymxpc3QtPnB0ciA9IHI7CisgIHJldHVybiByICsgc2l6ZW9mKGNoYXIqKSArIHNpemVvZihzaXplX3QpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfbmV4dF9ibG9jayhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgY2hhciAqcDsKKyAgcCA9IHNvYXAtPmJsaXN0LT5wdHI7CisgIGlmIChwKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTmV4dCBibG9ja1xuIikpOworICAgIHNvYXAtPmJsaXN0LT5wdHIgPSAqKGNoYXIqKilwOworICAgIFNPQVBfRlJFRShzb2FwLCBwKTsKKyAgICBpZiAoc29hcC0+Ymxpc3QtPnB0cikKKyAgICAgIHJldHVybiBzb2FwLT5ibGlzdC0+cHRyICsgc2l6ZW9mKGNoYXIqKSArIHNpemVvZihzaXplX3QpOworICB9CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc2l6ZV90CitTT0FQX0ZNQUMyCitzb2FwX2Jsb2NrX3NpemUoc3RydWN0IHNvYXAgKnNvYXApCit7IHJldHVybiAqKHNpemVfdCopKHNvYXAtPmJsaXN0LT5wdHIgKyBzaXplb2YoY2hhciopKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZW5kX2Jsb2NrKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9ibGlzdCAqYnA7CisgIGNoYXIgKnAsICpxOworICBicCA9IHNvYXAtPmJsaXN0OworICBpZiAoYnApCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgb2YgYmxvY2sgc2VxdWVuY2UsIGZyZWUgYWxsIHJlbWFpbmluZyBibG9ja3NcbiIpKTsKKyAgICBmb3IgKHAgPSBicC0+cHRyOyBwOyBwID0gcSkKKyAgICB7IHEgPSAqKGNoYXIqKilwOworICAgICAgU09BUF9GUkVFKHNvYXAsIHApOworICAgIH0KKyAgICBzb2FwLT5ibGlzdCA9IGJwLT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBicCk7CisgIH0KKyAgREJHTE9HKFRFU1QsIGlmIChzb2FwLT5ibGlzdCkgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlc3RvcmUgcHJldmlvdXMgYmxvY2sgc2VxdWVuY2VcbiIpKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3NhdmVfYmxvY2soc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnAsIGludCBmbGFnKQoreyByZWdpc3RlciBzaXplX3QgbjsKKyAgcmVnaXN0ZXIgY2hhciAqcSwgKnM7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2F2ZSBhbGwgYmxvY2tzIGluIGNvbnRpZ3VvdXMgbWVtb3J5IHNwYWNlIG9mICV1IGJ5dGVzICglcC0+JXApXG4iLCAodW5zaWduZWQgaW50KXNvYXAtPmJsaXN0LT5zaXplLCBzb2FwLT5ibGlzdC0+cHRyLCBwKSk7CisgIGlmIChzb2FwLT5ibGlzdC0+c2l6ZSkKKyAgeyBpZiAoIXApCisgICAgICBwID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHNvYXAtPmJsaXN0LT5zaXplKTsKKyAgICBpZiAocCkKKyAgICB7IGZvciAocyA9IHAsIHEgPSBzb2FwX2ZpcnN0X2Jsb2NrKHNvYXApOyBxOyBxID0gc29hcF9uZXh0X2Jsb2NrKHNvYXApKQorICAgICAgeyBuID0gc29hcF9ibG9ja19zaXplKHNvYXApOworI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgICAgICAgaWYgKGZsYWcpCisJICBzb2FwX3VwZGF0ZV9wdHJzKHNvYXAsIHEsIHEgKyBuLCBzLCBxKTsKKyNlbmRpZgorICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHkgJXUgYnl0ZXMgZnJvbSAlcCB0byAlcFxuIiwgKHVuc2lnbmVkIGludCluLCBxLCBzKSk7CisgICAgICAgIG1lbWNweShzLCBxLCBuKTsKKyAgICAgICAgcyArPSBuOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICB9CisgIHNvYXBfZW5kX2Jsb2NrKHNvYXApOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9wdXRzaXplKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgc2l6ZSkKK3sgcmV0dXJuIHNvYXBfcHV0c2l6ZXMoc29hcCwgdHlwZSwgJnNpemUsIDEpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3B1dHNpemVzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBpbnQgKnNpemUsIGludCBkaW0pCit7IHJldHVybiBzb2FwX3B1dHNpemVzb2Zmc2V0cyhzb2FwLCB0eXBlLCBzaXplLCBOVUxMLCBkaW0pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3B1dHNpemVzb2Zmc2V0cyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgaW50ICpzaXplLCBjb25zdCBpbnQgKm9mZnNldCwgaW50IGRpbSkKK3sgaW50IGk7CisgIGlmICghdHlwZSkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgeyBzcHJpbnRmKHNvYXAtPnR5cGUsICIlc1slZCIsIHR5cGUsIHNpemVbMF0pOworICAgIGZvciAoaSA9IDE7IGkgPCBkaW07IGkrKykKKyAgICAgIHNwcmludGYoc29hcC0+dHlwZSArIHN0cmxlbihzb2FwLT50eXBlKSwgIiAlZCIsIHNpemVbaV0pOworICB9CisgIGVsc2UKKyAgeyBpZiAob2Zmc2V0KQorICAgIHsgc3ByaW50Zihzb2FwLT50eXBlLCAiJXNbJWQiLCB0eXBlLCBzaXplWzBdICsgb2Zmc2V0WzBdKTsKKyAgICAgIGZvciAoaSA9IDE7IGkgPCBkaW07IGkrKykKKyAgICAgICAgc3ByaW50Zihzb2FwLT50eXBlICsgc3RybGVuKHNvYXAtPnR5cGUpLCAiLCVkIiwgc2l6ZVtpXSArIG9mZnNldFtpXSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IHNwcmludGYoc29hcC0+dHlwZSwgIiVzWyVkIiwgdHlwZSwgc2l6ZVswXSk7CisgICAgICBmb3IgKGkgPSAxOyBpIDwgZGltOyBpKyspCisgICAgICAgIHNwcmludGYoc29hcC0+dHlwZSArIHN0cmxlbihzb2FwLT50eXBlKSwgIiwlZCIsIHNpemVbaV0pOworICAgIH0KKyAgICBzdHJjYXQoc29hcC0+dHlwZSwgIl0iKTsKKyAgfQorICByZXR1cm4gc29hcC0+dHlwZTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9wdXRvZmZzZXQoc3RydWN0IHNvYXAgKnNvYXAsIGludCBvZmZzZXQpCit7IHJldHVybiBzb2FwX3B1dG9mZnNldHMoc29hcCwgJm9mZnNldCwgMSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfcHV0b2Zmc2V0cyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgaW50ICpvZmZzZXQsIGludCBkaW0pCit7IHJlZ2lzdGVyIGludCBpOworICBzcHJpbnRmKHNvYXAtPmFycmF5T2Zmc2V0LCAiWyVkIiwgb2Zmc2V0WzBdKTsKKyAgZm9yIChpID0gMTsgaSA8IGRpbTsgaSsrKQorICAgIHNwcmludGYoc29hcC0+YXJyYXlPZmZzZXQgKyBzdHJsZW4oc29hcC0+YXJyYXlPZmZzZXQpLCAiLCVkIiwgb2Zmc2V0W2ldKTsKKyAgc3RyY2F0KHNvYXAtPmFycmF5T2Zmc2V0LCAiXSIpOworICByZXR1cm4gc29hcC0+YXJyYXlPZmZzZXQ7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2l6ZShjb25zdCBpbnQgKnNpemUsIGludCBkaW0pCit7IHJlZ2lzdGVyIGludCBpLCBuID0gc2l6ZVswXTsKKyAgZm9yIChpID0gMTsgaSA8IGRpbTsgaSsrKQorICAgIG4gKj0gc2l6ZVtpXTsKKyAgcmV0dXJuIG47Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0b2Zmc2V0cyhjb25zdCBjaGFyICphdHRyLCBjb25zdCBpbnQgKnNpemUsIGludCAqb2Zmc2V0LCBpbnQgZGltKQoreyByZWdpc3RlciBpbnQgaSwgaiA9IDA7CisgIGlmIChvZmZzZXQpCisgICAgZm9yIChpID0gMDsgaSA8IGRpbSAmJiBhdHRyICYmICphdHRyOyBpKyspCisgICAgeyBhdHRyKys7CisgICAgICBqICo9IHNpemVbaV07CisgICAgICBqICs9IG9mZnNldFtpXSA9IChpbnQpYXRvbChhdHRyKTsKKyAgICAgIGF0dHIgPSBzdHJjaHIoYXR0ciwgJywnKTsKKyAgICB9CisgIGVsc2UKKyAgICBmb3IgKGkgPSAwOyBpIDwgZGltICYmIGF0dHIgJiYgKmF0dHI7IGkrKykKKyAgICB7IGF0dHIrKzsKKyAgICAgIGogKj0gc2l6ZVtpXTsKKyAgICAgIGogKz0gKGludClhdG9sKGF0dHIpOworICAgICAgYXR0ciA9IHN0cmNocihhdHRyLCAnLCcpOworICAgIH0KKyAgcmV0dXJuIGo7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0c2l6ZShjb25zdCBjaGFyICphdHRyMSwgY29uc3QgY2hhciAqYXR0cjIsIGludCAqaikKK3sgcmVnaXN0ZXIgaW50IG4sIGs7CisgIGNoYXIgKnM7CisgICpqID0gMDsKKyAgaWYgKCEqYXR0cjEpCisgICAgcmV0dXJuIC0xOworICBpZiAoKmF0dHIxID09ICdbJykKKyAgICBhdHRyMSsrOworICBuID0gMTsKKyAgZm9yICg7OykKKyAgeyBrID0gKGludClzb2FwX3N0cnRvbChhdHRyMSwgJnMsIDEwKTsKKyAgICBuICo9IGs7CisgICAgaWYgKGsgPCAwIHx8IG4gPiBTT0FQX01BWEFSUkFZU0laRSB8fCBzID09IGF0dHIxKQorICAgICAgcmV0dXJuIC0xOworICAgIGF0dHIxID0gc3RyY2hyKHMsICcsJyk7CisgICAgaWYgKCFhdHRyMSkKKyAgICAgIGF0dHIxID0gc3RyY2hyKHMsICcgJyk7CisgICAgaWYgKGF0dHIyICYmICphdHRyMikKKyAgICB7IGF0dHIyKys7CisgICAgICAqaiAqPSBrOworICAgICAgayA9IChpbnQpc29hcF9zdHJ0b2woYXR0cjIsICZzLCAxMCk7CisgICAgICAqaiArPSBrOworICAgICAgaWYgKGsgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgICBhdHRyMiA9IHM7CisgICAgfQorICAgIGlmICghYXR0cjEpCisgICAgICBicmVhazsKKyAgICBhdHRyMSsrOworICB9CisgIHJldHVybiBuIC0gKmo7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0c2l6ZXMoY29uc3QgY2hhciAqYXR0ciwgaW50ICpzaXplLCBpbnQgZGltKQoreyByZWdpc3RlciBpbnQgaSwgaywgbjsKKyAgaWYgKCEqYXR0cikKKyAgICByZXR1cm4gLTE7CisgIGkgPSBzdHJsZW4oYXR0cik7CisgIG4gPSAxOworICBkbworICB7IGZvciAoaSA9IGktMTsgaSA+PSAwOyBpLS0pCisgICAgICBpZiAoYXR0cltpXSA9PSAnWycgfHwgYXR0cltpXSA9PSAnLCcgfHwgYXR0cltpXSA9PSAnICcpCisgICAgICAgIGJyZWFrOworICAgIGsgPSAoaW50KWF0b2woYXR0ciArIGkgKyAxKTsKKyAgICBuICo9IHNpemVbLS1kaW1dID0gazsKKyAgICBpZiAoayA8IDAgfHwgbiA+IFNPQVBfTUFYQVJSQVlTSVpFKQorICAgICAgcmV0dXJuIC0xOworICB9IHdoaWxlIChpID49IDAgJiYgYXR0cltpXSAhPSAnWycpOworICByZXR1cm4gbjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRwb3NpdGlvbihjb25zdCBjaGFyICphdHRyLCBpbnQgKnBvcykKK3sgcmVnaXN0ZXIgaW50IGksIG47CisgIGlmICghKmF0dHIpCisgICAgcmV0dXJuIC0xOworICBuID0gMDsKKyAgaSA9IDE7CisgIGRvCisgIHsgcG9zW24rK10gPSAoaW50KWF0b2woYXR0ciArIGkpOworICAgIHdoaWxlIChhdHRyW2ldICYmIGF0dHJbaV0gIT0gJywnICYmIGF0dHJbaV0gIT0gJ10nKQorICAgICAgaSsrOworICAgIGlmIChhdHRyW2ldID09ICcsJykKKyAgICAgIGkrKzsKKyAgfSB3aGlsZSAobiA8IFNPQVBfTUFYRElNUyAmJiBhdHRyW2ldICYmIGF0dHJbaV0gIT0gJ10nKTsKKyAgcmV0dXJuIG47Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHVzaF9uYW1lc3BhY2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICpucykKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wOworICByZWdpc3RlciBzdHJ1Y3QgTmFtZXNwYWNlICpwOworICByZWdpc3RlciBzaG9ydCBpID0gLTE7CisgIHJlZ2lzdGVyIHNpemVfdCBuLCBrOworICBuID0gc3RybGVuKGlkKTsKKyAgayA9IHN0cmxlbihucykgKyAxOworICBwID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlczsKKyAgaWYgKHApCisgIHsgZm9yIChpID0gMDsgcC0+aWQ7IHArKywgaSsrKQorICAgIHsgaWYgKHAtPm5zICYmICFzdHJjbXAobnMsIHAtPm5zKSkKKyAgICAgIHsgaWYgKHAtPm91dCkKKyAgICAgICAgeyBTT0FQX0ZSRUUoc29hcCwgcC0+b3V0KTsKKyAgICAgICAgICBwLT5vdXQgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKHAtPm91dCkKKyAgICAgIHsgaWYgKCFzdHJjbXAobnMsIHAtPm91dCkpCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlbHNlIGlmIChwLT5pbikKKyAgICAgIHsgaWYgKCFzb2FwX3RhZ19jbXAobnMsIHAtPmluKSkKKyAgICAgICAgeyBpZiAoKHAtPm91dCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBrKSkpCisgICAgICAgICAgICBzdHJjcHkocC0+b3V0LCBucyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFwIHx8ICFwLT5pZCkKKyAgICAgIGkgPSAtMTsKKyAgfQorICBpZiAoaSA+PSAwKQorICAgIGsgPSAwOworICBucCA9IChzdHJ1Y3Qgc29hcF9ubGlzdCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX25saXN0KSArIG4gKyBrKTsKKyAgaWYgKCFucCkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgbnAtPm5leHQgPSBzb2FwLT5ubGlzdDsKKyAgc29hcC0+bmxpc3QgPSBucDsKKyAgbnAtPmxldmVsID0gc29hcC0+bGV2ZWw7CisgIG5wLT5pbmRleCA9IGk7CisgIHN0cmNweShucC0+aWQsIGlkKTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQdXNoIG5hbWVzcGFjZSBiaW5kaW5nIChsZXZlbD0ldSkgJyVzJyAnJXMnXG4iLCBzb2FwLT5sZXZlbCwgaWQsIG5zKSk7CisgIGlmIChpIDwgMCkKKyAgeyBucC0+bnMgPSBucC0+aWQgKyBuICsgMTsKKyAgICBzdHJjcHkobnAtPm5zLCBucyk7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQdXNoIE5PVCBPSzogbm8gbWF0Y2ggZm91bmQgZm9yICclcycgaW4gbmFtZXNwYWNlIG1hcHBpbmcgdGFibGUgKGFkZGVkIHRvIHN0YWNrIGFueXdheSlcbiIsIG5zKSk7CisgIH0KKyAgZWxzZQorICB7IG5wLT5ucyA9IE5VTEw7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQdXNoIE9LICgnJXMnIG1hdGNoZXMgJyVzJyBpbiBuYW1lc3BhY2UgdGFibGUpXG4iLCBpZCwgcC0+aWQpKTsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfcG9wX25hbWVzcGFjZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wOworICB3aGlsZSAoc29hcC0+bmxpc3QgJiYgc29hcC0+bmxpc3QtPmxldmVsID49IHNvYXAtPmxldmVsKQorICB7IG5wID0gc29hcC0+bmxpc3QtPm5leHQ7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQb3BwZWQgbmFtZXNwYWNlIGJpbmRpbmcgKGxldmVsPSV1KSAnJXMnXG4iLCBzb2FwLT5sZXZlbCwgc29hcC0+bmxpc3QtPmlkKSk7CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPm5saXN0KTsKKyAgICBzb2FwLT5ubGlzdCA9IG5wOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfbWF0Y2hfbmFtZXNwYWNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZDEsIGNvbnN0IGNoYXIgKmlkMiwgaW50IG4xLCBpbnQgbjIpIAoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnAgPSBzb2FwLT5ubGlzdDsKKyAgd2hpbGUgKG5wICYmIChzdHJuY21wKG5wLT5pZCwgaWQxLCBuMSkgfHwgbnAtPmlkW24xXSkpCisgICAgbnAgPSBucC0+bmV4dDsKKyAgaWYgKG5wKQorICB7IGlmIChucC0+aW5kZXggPCAwCisgICAgIHx8IChzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW25wLT5pbmRleF0uaWQKKyAgICAgICYmIChzdHJuY21wKHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbbnAtPmluZGV4XS5pZCwgaWQyLCBuMikKKyAgICAgICB8fCBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW25wLT5pbmRleF0uaWRbbjJdKSkpCisgICAgICByZXR1cm4gU09BUF9OQU1FU1BBQ0U7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgaWYgKG4xID09IDMgJiYgbjEgPT0gbjIgJiYgIXN0cmNtcChpZDEsICJ4bWwiKSAmJiAhc3RyY21wKGlkMSwgaWQyKSkKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgcmV0dXJuIFNPQVBfU1lOVEFYX0VSUk9SOyAKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2N1cnJlbnRfbmFtZXNwYWNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX25saXN0ICpucDsKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKKyAgbnAgPSBzb2FwLT5ubGlzdDsKKyAgaWYgKCEocyA9IHN0cmNocih0YWcsICc6JykpKQorICB7IHdoaWxlIChucCAmJiAqbnAtPmlkKSAvKiBmaW5kIGRlZmF1bHQgbmFtZXNwYWNlLCBpZiBwcmVzZW50ICovCisgICAgICBucCA9IG5wLT5uZXh0OworICB9CisgIGVsc2UKKyAgeyB3aGlsZSAobnAgJiYgKHN0cm5jbXAobnAtPmlkLCB0YWcsIHMgLSB0YWcpIHx8IG5wLT5pZFtzIC0gdGFnXSkpCisgICAgICBucCA9IG5wLT5uZXh0OworICAgIGlmICghbnApCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfTkFNRVNQQUNFOworICB9CisgIGlmIChucCkKKyAgeyBpZiAobnAtPmluZGV4ID49IDApCisgICAgICByZXR1cm4gc29hcC0+bmFtZXNwYWNlc1tucC0+aW5kZXhdLm5zOworICAgIGlmIChucC0+bnMpCisgICAgICByZXR1cm4gc29hcF9zdHJkdXAoc29hcCwgbnAtPm5zKTsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF90YWdfY21wKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKnQpCit7IGZvciAoOzspCisgIHsgcmVnaXN0ZXIgaW50IGMxID0gKnM7CisgICAgcmVnaXN0ZXIgaW50IGMyID0gKnQ7CisgICAgaWYgKCFjMSB8fCBjMSA9PSAnIicpCisgICAgICBicmVhazsKKyAgICBpZiAoYzIgIT0gJy0nKQorICAgIHsgaWYgKGMxICE9IGMyKQorICAgICAgeyBpZiAoYzEgPj0gJ0EnICYmIGMxIDw9ICdaJykKKyAgICAgICAgICBjMSArPSAnYScgLSAnQSc7CisgICAgICAgIGlmIChjMiA+PSAnQScgJiYgYzIgPD0gJ1onKQorICAgICAgICAgIGMyICs9ICdhJyAtICdBJzsKKyAgICAgIH0KKyAgICAgIGlmIChjMSAhPSBjMikKKyAgICAgIHsgaWYgKGMyICE9ICcqJykKKyAgICAgICAgICByZXR1cm4gMTsKKwljMiA9ICorK3Q7CisgICAgICAgIGlmICghYzIpCisJICByZXR1cm4gMDsKKyAgICAgICAgaWYgKGMyID49ICdBJyAmJiBjMiA8PSAnWicpCisgICAgICAgICAgYzIgKz0gJ2EnIC0gJ0EnOworICAgICAgICBmb3IgKDs7KQorICAgICAgICB7IGMxID0gKnM7CisJICBpZiAoIWMxIHx8IGMxID09ICciJykKKwkgICAgYnJlYWs7CisJICBpZiAoYzEgPj0gJ0EnICYmIGMxIDw9ICdaJykKKyAgICAgICAgICAgIGMxICs9ICdhJyAtICdBJzsKKyAgICAgICAgICBpZiAoYzEgPT0gYzIgJiYgIXNvYXBfdGFnX2NtcChzICsgMSwgdCArIDEpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisJICBzKys7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHMrKzsKKyAgICB0Kys7CisgIH0KKyAgaWYgKCp0ID09ICcqJyAmJiAhdFsxXSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuICp0OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX21hdGNoX3RhZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnMSwgY29uc3QgY2hhciAqdGFnMikKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqcywgKnQ7CisgIGlmICghdGFnMSB8fCAhdGFnMiB8fCAhKnRhZzIpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIHMgPSBzdHJjaHIodGFnMSwgJzonKTsKKyAgdCA9IHN0cmNocih0YWcyLCAnOicpOworICBpZiAodCkKKyAgeyBpZiAocykKKyAgICB7IGlmICh0WzFdICYmIFNPQVBfU1RSQ01QKHMgKyAxLCB0ICsgMSkpCisgICAgICAgIHJldHVybiBTT0FQX1RBR19NSVNNQVRDSDsKKyAgICAgIGlmICh0ICE9IHRhZzIgJiYgc29hcF9tYXRjaF9uYW1lc3BhY2Uoc29hcCwgdGFnMSwgdGFnMiwgcyAtIHRhZzEsIHQgLSB0YWcyKSkKKyAgICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJUYWdzICclcycgYW5kICclcycgbWF0Y2ggYnV0IG5hbWVzcGFjZXMgZGlmZmVyXG4iLCB0YWcxLCB0YWcyKSk7CisgICAgICAgIHJldHVybiBTT0FQX1RBR19NSVNNQVRDSDsKKyAgICAgIH0KKyAgICB9IAorICAgIGVsc2UgaWYgKFNPQVBfU1RSQ01QKHRhZzEsIHQgKyAxKSkKKyAgICAgIHJldHVybiBTT0FQX1RBR19NSVNNQVRDSDsKKyAgICBlbHNlIGlmICh0ICE9IHRhZzIgJiYgc29hcF9tYXRjaF9uYW1lc3BhY2Uoc29hcCwgdGFnMSwgdGFnMiwgMCwgdCAtIHRhZzIpKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJUYWdzICclcycgYW5kICclcycgbWF0Y2ggYnV0IG5hbWVzcGFjZXMgZGlmZmVyXG4iLCB0YWcxLCB0YWcyKSk7CisgICAgICByZXR1cm4gU09BUF9UQUdfTUlTTUFUQ0g7CisgICAgfQorICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVGFncyBhbmQgKGRlZmF1bHQpIG5hbWVzcGFjZXMgbWF0Y2g6ICclcycgJyVzJ1xuIiwgdGFnMSwgdGFnMikpOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIGlmIChzKQorICB7IGlmIChTT0FQX1NUUkNNUChzICsgMSwgdGFnMikpCisgICAgICByZXR1cm4gU09BUF9UQUdfTUlTTUFUQ0g7CisgIH0KKyAgZWxzZSBpZiAoU09BUF9TVFJDTVAodGFnMSwgdGFnMikpCisgICAgcmV0dXJuIFNPQVBfVEFHX01JU01BVENIOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlRhZ3MgbWF0Y2g6ICclcycgJyVzJ1xuIiwgdGFnMSwgdGFnMikpOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9tYXRjaF9hcnJheShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdHlwZSkKK3sgaWYgKCpzb2FwLT5hcnJheVR5cGUpCisgICAgaWYgKHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPmFycmF5VHlwZSwgdHlwZSkKKyAgICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+YXJyYXlUeXBlLCAieHNkOmFueVR5cGUiKQorICAgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT5hcnJheVR5cGUsICJ4c2Q6dXItdHlwZSIpCisgICAgKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJBcnJheSB0eXBlIG1pc21hdGNoOiAnJXMnICclcydcbiIsIHNvYXAtPmFycmF5VHlwZSwgdHlwZSkpOworICAgICAgcmV0dXJuIFNPQVBfVEFHX01JU01BVENIOworICAgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqCisgKglTU0wKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgV0lUSF9PUEVOU1NMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yYW5kKCkKK3sgdW5zaWduZWQgY2hhciBidWZbNF07CisgIGlmICghc3NsX2luaXRfZG9uZSkKKyAgICBzb2FwX3NzbF9pbml0KCk7CisgIFJBTkRfcHNldWRvX2J5dGVzKGJ1ZiwgNCk7CisgIHJldHVybiAqKGludCopYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NzbF9zZXJ2ZXJfY29udGV4dChzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgc2hvcnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmtleWZpbGUsIGNvbnN0IGNoYXIgKnBhc3N3b3JkLCBjb25zdCBjaGFyICpjYWZpbGUsIGNvbnN0IGNoYXIgKmNhcGF0aCwgY29uc3QgY2hhciAqZGhmaWxlLCBjb25zdCBjaGFyICpyYW5kZmlsZSwgY29uc3QgY2hhciAqc2lkKQoreyBpbnQgZXJyOworICBzb2FwLT5rZXlmaWxlID0ga2V5ZmlsZTsKKyAgc29hcC0+cGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgc29hcC0+Y2FmaWxlID0gY2FmaWxlOworICBzb2FwLT5jYXBhdGggPSBjYXBhdGg7CisgIGlmIChkaGZpbGUpCisgIHsgc29hcC0+ZGhmaWxlID0gZGhmaWxlOworICAgIHNvYXAtPnJzYSA9IDA7CisgIH0KKyAgZWxzZQorICB7IHNvYXAtPmRoZmlsZSA9IE5VTEw7CisgICAgc29hcC0+cnNhID0gMTsKKyAgfQorICBzb2FwLT5yYW5kZmlsZSA9IHJhbmRmaWxlOworICBzb2FwLT5yZXF1aXJlX2NsaWVudF9hdXRoID0gKGZsYWdzICYgU09BUF9TU0xfUkVRVUlSRV9DTElFTlRfQVVUSEVOVElDQVRJT04pOworICBpZiAoIShlcnIgPSBzb2FwLT5mc3NsYXV0aChzb2FwKSkpCisgIHsgaWYgKHNpZCkKKyAgICAgIFNTTF9DVFhfc2V0X3Nlc3Npb25faWRfY29udGV4dChzb2FwLT5jdHgsICh1bnNpZ25lZCBjaGFyKilzaWQsIHN0cmxlbihzaWQpKTsKKyAgfQorICByZXR1cm4gZXJyOyAKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zc2xfY2xpZW50X2NvbnRleHQoc3RydWN0IHNvYXAgKnNvYXAsIHVuc2lnbmVkIHNob3J0IGZsYWdzLCBjb25zdCBjaGFyICprZXlmaWxlLCBjb25zdCBjaGFyICpwYXNzd29yZCwgY29uc3QgY2hhciAqY2FmaWxlLCBjb25zdCBjaGFyICpjYXBhdGgsIGNvbnN0IGNoYXIgKnJhbmRmaWxlKQoreyBzb2FwLT5rZXlmaWxlID0ga2V5ZmlsZTsKKyAgc29hcC0+cGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgc29hcC0+Y2FmaWxlID0gY2FmaWxlOworICBzb2FwLT5jYXBhdGggPSBjYXBhdGg7CisgIHNvYXAtPmRoZmlsZSA9IE5VTEw7CisgIHNvYXAtPnJzYSA9IDA7CisgIHNvYXAtPnJhbmRmaWxlID0gcmFuZGZpbGU7CisgIHNvYXAtPnJlcXVpcmVfc2VydmVyX2F1dGggPSAoZmxhZ3MgJiBTT0FQX1NTTF9SRVFVSVJFX1NFUlZFUl9BVVRIRU5USUNBVElPTik7CisgIHJldHVybiBzb2FwLT5mc3NsYXV0aChzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc3NsX2luaXQoKQoreyAvKiBOb3RlOiBmb3IgTVQgc3lzdGVtcywgdGhlIG1haW4gcHJvZ3JhbSBNVVNUIGNhbGwgc29hcF9zc2xfaW5pdCgpIGJlZm9yZSBhbnkgdGhyZWFkcyBhcmUgc3RhcnRlZCAqLworICBpZiAoIXNzbF9pbml0X2RvbmUpCisgIHsgc3NsX2luaXRfZG9uZSA9IDE7CisgICAgU1NMX2xpYnJhcnlfaW5pdCgpOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBTU0xfbG9hZF9lcnJvcl9zdHJpbmdzKCk7CisjZW5kaWYKKyAgICBpZiAoIVJBTkRfbG9hZF9maWxlKCIvZGV2L3VyYW5kb20iLCAxMDI0KSkKKyAgICB7IGNoYXIgYnVmWzEwMjRdOworICAgICAgUkFORF9zZWVkKGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgICAgd2hpbGUgKCFSQU5EX3N0YXR1cygpKQorICAgICAgeyBpbnQgciA9IHJhbmQoKTsKKyAgICAgICAgUkFORF9zZWVkKCZyLCBzaXplb2YoaW50KSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY29uc3QgY2hhciAqCitzc2xfZXJyb3Ioc3RydWN0IHNvYXAgKnNvYXAsIGludCByZXQpCit7IGludCBlcnIgPSBTU0xfZ2V0X2Vycm9yKHNvYXAtPnNzbCwgcmV0KTsKKyAgY29uc3QgY2hhciAqbXNnID0gc29hcF9zdHJfY29kZShoX3NzbF9lcnJvcl9jb2RlcywgZXJyKTsKKyAgaWYgKG1zZykKKyAgICBzdHJjcHkoc29hcC0+bXNnYnVmLCBtc2cpOworICBlbHNlCisgICAgcmV0dXJuIEVSUl9lcnJvcl9zdHJpbmcoZXJyLCBzb2FwLT5tc2didWYpOworICBpZiAoRVJSX3BlZWtfZXJyb3IoKSkKKyAgeyB1bnNpZ25lZCBsb25nIHI7CisgICAgc3RyY2F0KHNvYXAtPm1zZ2J1ZiwgIlxuIik7CisgICAgd2hpbGUgKChyID0gRVJSX2dldF9lcnJvcigpKSkKKyAgICAgIEVSUl9lcnJvcl9zdHJpbmdfbihyLCBzb2FwLT5tc2didWYgKyBzdHJsZW4oc29hcC0+bXNnYnVmKSwgc2l6ZW9mKHNvYXAtPm1zZ2J1ZikgLSBzdHJsZW4oc29hcC0+bXNnYnVmKSk7CisgIH0gCisgIGVsc2UKKyAgeyBzd2l0Y2ggKHJldCkKKyAgICB7IGNhc2UgMDoKKyAgICAgICAgc3RyY3B5KHNvYXAtPm1zZ2J1ZiwgIkVPRiB3YXMgb2JzZXJ2ZWQgdGhhdCB2aW9sYXRlcyB0aGUgcHJvdG9jb2wuIFRoZSBjbGllbnQgcHJvYmFibHkgcHJvdmlkZWQgaW52YWxpZCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbi4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIC0xOgorICAgICAgICBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIkVycm9yIG9ic2VydmVkIGJ5IHVuZGVybHlpbmcgQklPOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7ICAKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5tc2didWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzc2xfcGFzc3dvcmQoY2hhciAqYnVmLCBpbnQgbnVtLCBpbnQgcndmbGFnLCB2b2lkICp1c2VyZGF0YSkKK3sgaWYgKG51bSA8IChpbnQpc3RybGVuKChjaGFyKil1c2VyZGF0YSkgKyAxKQorICAgIHJldHVybiAwOworICByZXR1cm4gc3RybGVuKHN0cmNweShidWYsIChjaGFyKil1c2VyZGF0YSkpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUaGlzIGNhbGxiYWNrIGlzIGluY2x1ZGVkIGZvciBmdXR1cmUgcmVmZXJlbmNlcy4gSXQgc2hvdWxkIG5vdCBiZSBkZWxldGVkCisjaWZuZGVmIFBBTE1fMgorc3RhdGljIERIICoKK3NzbF90bXBfZGgoU1NMICpzc2wsIGludCBpc19leHBvcnQsIGludCBrZXlsZW5ndGgpCit7IHN0YXRpYyBESCAqZGg1MTIgPSBOVUxMOworICBzdGF0aWMgREggKmRoMTAyNCA9IE5VTEw7CisgIERIICpkaDsKKyAgc3dpdGNoIChrZXlsZW5ndGgpCisgIHsgY2FzZSA1MTI6CisgICAgICBpZiAoIWRoNTEyKQorICAgICAgeyBCSU8gKmJpbyA9IEJJT19uZXdfZmlsZSgiZGg1MTIucGVtIiwgInIiKTsKKyAgICAgICAgaWYgKGJpbykKKyAgICAgICAgeyBkaDUxMiA9IFBFTV9yZWFkX2Jpb19ESHBhcmFtcyhiaW8sIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgICAgIEJJT19mcmVlKGJpbyk7CisgICAgICAgICAgcmV0dXJuIGRoNTEyOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBkaDUxMjsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKCFkaDEwMjQpCisgICAgICB7IEJJTyAqYmlvID0gQklPX25ld19maWxlKCJkaDEwMjQucGVtIiwgInIiKTsKKyAgICAgICAgaWYgKGJpbykKKyAgICAgICAgeyBkaDEwMjQgPSBQRU1fcmVhZF9iaW9fREhwYXJhbXMoYmlvLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICBCSU9fZnJlZShiaW8pOworICAgICAgICB9CisgICAgICB9CisgICAgICBkaCA9IGRoMTAyNDsKKyAgfQorICByZXR1cm4gZGg7Cit9CisjZW5kaWYKKyovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAorc3NsX2F1dGhfaW5pdChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKCFzc2xfaW5pdF9kb25lKQorICAgIHNvYXBfc3NsX2luaXQoKTsKKyAgaWYgKCFzb2FwLT5jdHgpCisgIHsgaWYgKCEoc29hcC0+Y3R4ID0gU1NMX0NUWF9uZXcoU1NMdjIzX21ldGhvZCgpKSkpCisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCBzZXR1cCBjb250ZXh0IiwgU09BUF9TU0xfRVJST1IpOworICB9CisgIGlmIChzb2FwLT5yYW5kZmlsZSkKKyAgeyBpZiAoIVJBTkRfbG9hZF9maWxlKHNvYXAtPnJhbmRmaWxlLCAtMSkpCisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCBsb2FkIHJhbmRvbW5lc3MiLCBTT0FQX1NTTF9FUlJPUik7CisgIH0KKyAgaWYgKHNvYXAtPmNhZmlsZSB8fCBzb2FwLT5jYXBhdGgpCisgIHsgaWYgKCFTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhzb2FwLT5jdHgsIHNvYXAtPmNhZmlsZSwgc29hcC0+Y2FwYXRoKSkKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHJlYWQgQ0EgZmlsZSBhbmQgZGlyZWN0b3J5IiwgU09BUF9TU0xfRVJST1IpOworICAgIGlmIChzb2FwLT5jYWZpbGUgJiYgc29hcC0+cmVxdWlyZV9jbGllbnRfYXV0aCkKKyAgICAgIFNTTF9DVFhfc2V0X2NsaWVudF9DQV9saXN0KHNvYXAtPmN0eCwgU1NMX2xvYWRfY2xpZW50X0NBX2ZpbGUoc29hcC0+Y2FmaWxlKSk7CisgIH0KKyAgaWYgKCFTU0xfQ1RYX3NldF9kZWZhdWx0X3ZlcmlmeV9wYXRocyhzb2FwLT5jdHgpKQorICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHJlYWQgZGVmYXVsdCBDQSBmaWxlIGFuZC9vciBkaXJlY3RvcnkiLCBTT0FQX1NTTF9FUlJPUik7CisvKiBTZWUgYmVsb3cgKi8KKyAgaWYgKHNvYXAtPmtleWZpbGUpCisgIHsgaWYgKCFTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKHNvYXAtPmN0eCwgc29hcC0+a2V5ZmlsZSkpCisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCByZWFkIGNlcnRpZmljYXRlIGtleSBmaWxlIiwgU09BUF9TU0xfRVJST1IpOworICAgIGlmIChzb2FwLT5wYXNzd29yZCkKKyAgICB7IFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiX3VzZXJkYXRhKHNvYXAtPmN0eCwgKHZvaWQqKXNvYXAtPnBhc3N3b3JkKTsKKyAgICAgIFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiKHNvYXAtPmN0eCwgc3NsX3Bhc3N3b3JkKTsKKyAgICB9CisgICAgaWYgKCFTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X2ZpbGUoc29hcC0+Y3R4LCBzb2FwLT5rZXlmaWxlLCBTU0xfRklMRVRZUEVfUEVNKSkKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHJlYWQga2V5IGZpbGUiLCBTT0FQX1NTTF9FUlJPUik7CisgIH0KKy8qIFN1Z2dlc3RlZCBhbHRlcm5hdGl2ZSBhcHByb2FjaCB0byBjaGVjayBjYWZpbGUgZmlyc3QgYmVmb3JlIHRoZSBrZXkgZmlsZToKKyAgaWYgKHNvYXAtPnBhc3N3b3JkKQorICB7IFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiX3VzZXJkYXRhKHNvYXAtPmN0eCwgKHZvaWQqKXNvYXAtPnBhc3N3b3JkKTsKKyAgICBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYihzb2FwLT5jdHgsIHNzbF9wYXNzd29yZCk7CisgIH0KKyAgaWYgKCFzb2FwLT5jYWZpbGUgfHwgIVNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoc29hcC0+Y3R4LCBzb2FwLT5jYWZpbGUpKQorICB7IGlmIChzb2FwLT5rZXlmaWxlKQorICAgIHsgaWYgKCFTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKHNvYXAtPmN0eCwgc29hcC0+a2V5ZmlsZSkpCisgICAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHJlYWQgY2VydGlmaWNhdGUgb3Iga2V5IGZpbGUiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgICBpZiAoIVNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfZmlsZShzb2FwLT5jdHgsIHNvYXAtPmtleWZpbGUsIFNTTF9GSUxFVFlQRV9QRU0pKQorICAgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCByZWFkIGtleSBmaWxlIiwgU09BUF9TU0xfRVJST1IpOworICAgIH0KKyAgfQorKi8KKyAgaWYgKHNvYXAtPnJzYSkKKyAgeyBSU0EgKnJzYSA9IFJTQV9nZW5lcmF0ZV9rZXkoMTAyNCwgUlNBX0Y0LCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoIVNTTF9DVFhfc2V0X3RtcF9yc2Eoc29hcC0+Y3R4LCByc2EpKQorICAgIHsgaWYgKHJzYSkKKyAgICAgICAgUlNBX2ZyZWUocnNhKTsKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHNldCBSU0Ega2V5IiwgU09BUF9TU0xfRVJST1IpOworICAgIH0KKyAgICBSU0FfZnJlZShyc2EpOworICB9CisgIGVsc2UgaWYgKHNvYXAtPmRoZmlsZSkKKyAgeyBESCAqZGggPSAwOworICAgIEJJTyAqYmlvOworICAgIGJpbyA9IEJJT19uZXdfZmlsZShzb2FwLT5kaGZpbGUsICJyIik7CisgICAgaWYgKCFiaW8pCisgICAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJDYW4ndCByZWFkIERIIGZpbGUiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgZGggPSBQRU1fcmVhZF9iaW9fREhwYXJhbXMoYmlvLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBCSU9fZnJlZShiaW8pOworICAgIGlmIChTU0xfQ1RYX3NldF90bXBfZGgoc29hcC0+Y3R4LCBkaCkgPCAwKQorICAgIHsgaWYgKGRoKQorICAgICAgICBESF9mcmVlKGRoKTsKKyAgICAgIHJldHVybiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIkNhbid0IHNldCBESCBwYXJhbWV0ZXJzIiwgU09BUF9TU0xfRVJST1IpOworICAgIH0KKyAgICBESF9mcmVlKGRoKTsKKyAgfQorICBTU0xfQ1RYX3NldF9vcHRpb25zKHNvYXAtPmN0eCwgU1NMX09QX0FMTCB8IFNTTF9PUF9OT19TU0x2Mik7CisgIFNTTF9DVFhfc2V0X3ZlcmlmeShzb2FwLT5jdHgsIHNvYXAtPnJlcXVpcmVfY2xpZW50X2F1dGggPyAoU1NMX1ZFUklGWV9QRUVSIHwgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCkgOiBzb2FwLT5yZXF1aXJlX3NlcnZlcl9hdXRoID8gU1NMX1ZFUklGWV9QRUVSIDogU1NMX1ZFUklGWV9OT05FLCBzb2FwLT5mc3NsdmVyaWZ5KTsKKyNpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA8IDB4MDA5MDUxMDBMKQorICBTU0xfQ1RYX3NldF92ZXJpZnlfZGVwdGgoc29hcC0+Y3R4LCAxKTsgCisjZWxzZQorICBTU0xfQ1RYX3NldF92ZXJpZnlfZGVwdGgoc29hcC0+Y3R4LCA5KTsgCisjZW5kaWYgIAorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NzbF92ZXJpZnlfY2FsbGJhY2soaW50IG9rLCBYNTA5X1NUT1JFX0NUWCAqc3RvcmUpCit7CisjaWZkZWYgU09BUF9ERUJVRworICBpZiAoIW9rKSAKKyAgeyBjaGFyIGRhdGFbMjU2XTsKKyAgICBYNTA5ICpjZXJ0ID0gWDUwOV9TVE9SRV9DVFhfZ2V0X2N1cnJlbnRfY2VydChzdG9yZSk7CisgICAgZnByaW50ZihzdGRlcnIsICJTU0wgdmVyaWZ5IGVycm9yIG9yIHdhcm5pbmcgd2l0aCBjZXJ0aWZpY2F0ZSBhdCBkZXB0aCAlZDogJXNcbiIsIFg1MDlfU1RPUkVfQ1RYX2dldF9lcnJvcl9kZXB0aChzdG9yZSksIFg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKFg1MDlfU1RPUkVfQ1RYX2dldF9lcnJvcihzdG9yZSkpKTsKKyAgICBYNTA5X05BTUVfb25lbGluZShYNTA5X2dldF9pc3N1ZXJfbmFtZShjZXJ0KSwgZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImNlcnRpZmljYXRlIGlzc3VlciAlc1xuIiwgZGF0YSk7CisgICAgWDUwOV9OQU1FX29uZWxpbmUoWDUwOV9nZXRfc3ViamVjdF9uYW1lKGNlcnQpLCBkYXRhLCBzaXplb2YoZGF0YSkpOworICAgIGZwcmludGYoc3RkZXJyLCAiY2VydGlmaWNhdGUgc3ViamVjdCAlc1xuIiwgZGF0YSk7CisgIH0KKyNlbmRpZgorICAvKiBOb3RlOiByZXR1cm4gMSB0byBjb250aW51ZSwgYnV0IHVuc2FmZSBwcm9ncmVzcyB3aWxsIGJlIHRlcm1pbmF0ZWQgYnkgU1NMICovCisgIHJldHVybiBvazsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zc2xfYWNjZXB0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBCSU8gKmJpbzsKKyAgaW50IGksIHI7CisgIGlmICghc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgICByZXR1cm4gc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJObyBzb2NrZXQgaW4gc29hcF9zc2xfYWNjZXB0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgIGlmICghc29hcC0+Y3R4ICYmIChzb2FwLT5lcnJvciA9IHNvYXAtPmZzc2xhdXRoKHNvYXApKSkKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgaWYgKCFzb2FwLT5zc2wpCisgIHsgc29hcC0+c3NsID0gU1NMX25ldyhzb2FwLT5jdHgpOworICAgIGlmICghc29hcC0+c3NsKQorICAgICAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJTU0wgZXJyb3IiLCAiU1NMX25ldygpIGZhaWxlZCBpbiBzb2FwX3NzbF9hY2NlcHQoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgfQorICBlbHNlCisgICAgU1NMX2NsZWFyKHNvYXAtPnNzbCk7CisgIHNvYXAtPmltb2RlIHw9IFNPQVBfRU5DX1NTTDsKKyAgc29hcC0+b21vZGUgfD0gU09BUF9FTkNfU1NMOworI2lmIGRlZmluZWQoV0lOMzIpCisgIHsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGSU9OQklPLCAmbm9uYmxvY2tpbmcpOworICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgIHsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICBpb2N0bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGSU9OQklPLCAoaW50KSZub25ibG9ja2luZyk7CisgIH0KKyNlbHNlCisgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfR0VURkwpfE9fTk9OQkxPQ0spOworI2VuZGlmCisgIGJpbyA9IEJJT19uZXdfc29ja2V0KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEJJT19OT0NMT1NFKTsKKyAgU1NMX3NldF9iaW8oc29hcC0+c3NsLCBiaW8sIGJpbyk7CisgIGkgPSAxMDA7IC8qIDEwMCAqIDAuMSBtcyByZXRyaWVzICovCisgIHdoaWxlICgociA9IFNTTF9hY2NlcHQoc29hcC0+c3NsKSkgPD0gMCkKKyAgeyBpbnQgZXJyID0gU1NMX2dldF9lcnJvcihzb2FwLT5zc2wsIHIpOworICAgIGlmIChlcnIgPT0gU1NMX0VSUk9SX1dBTlRfUkVBRCB8fCBlcnIgPT0gU1NMX0VSUk9SX1dBTlRfV1JJVEUpCisgICAgeyBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgICAgZmRfc2V0IGZkOworICAgICAgaWYgKGktLSA8PSAwKQorICAgICAgICBicmVhazsKKyAgICAgIHRpbWVvdXQudHZfc2VjID0gMDsKKyAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDEwMDAwMDsKKyAgICAgIEZEX1pFUk8oJmZkKTsKKyAgICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmZmQpOworICAgICAgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCAmZmQsIE5VTEwsICZmZCwgJnRpbWVvdXQpOworICAgICAgaWYgKHIgPCAwICYmIHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIpCisgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICByZXR1cm4gU09BUF9FT0Y7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7IHNvYXAtPmVycm51bSA9IGVycjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorI2lmIGRlZmluZWQoV0lOMzIpCisgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGSU9OQklPLCAmYmxvY2tpbmcpOworICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICBpb2N0bCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBGSU9OQklPLCAoaW50KSZibG9ja2luZyk7CisgIH0KKyNlbHNlCisgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfR0VURkwpJn5PX05PTkJMT0NLKTsKKyNlbmRpZgorICBpZiAociA8PSAwKQorICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHNzbF9lcnJvcihzb2FwLCByKSwgIlNTTF9hY2NlcHQoKSBmYWlsZWQgaW4gc29hcF9zc2xfYWNjZXB0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgcmV0dXJuIFNPQVBfU1NMX0VSUk9SOworICB9CisgIGlmIChzb2FwLT5yZXF1aXJlX2NsaWVudF9hdXRoKQorICB7IFg1MDkgKnBlZXI7CisgICAgaW50IGVycjsKKyAgICBpZiAoKGVyciA9IFNTTF9nZXRfdmVyaWZ5X3Jlc3VsdChzb2FwLT5zc2wpKSAhPSBYNTA5X1ZfT0spCisgICAgeyBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgIHJldHVybiBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgWDUwOV92ZXJpZnlfY2VydF9lcnJvcl9zdHJpbmcoZXJyKSwgIlNTTCBjZXJ0aWZpY2F0ZSBwcmVzZW50ZWQgYnkgcGVlciBjYW5ub3QgYmUgdmVyaWZpZWQgaW4gc29hcF9zc2xfYWNjZXB0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgfQorICAgIHBlZXIgPSBTU0xfZ2V0X3BlZXJfY2VydGlmaWNhdGUoc29hcC0+c3NsKTsKKyAgICBpZiAoIXBlZXIpCisgICAgeyBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgIHJldHVybiBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJObyBTU0wgY2VydGlmaWNhdGUgd2FzIHByZXNlbnRlZCBieSB0aGUgcGVlciBpbiBzb2FwX3NzbF9hY2NlcHQoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICB9CisgICAgWDUwOV9mcmVlKHBlZXIpOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZW5kaWYgLyogV0lUSF9PUEVOU1NMICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3RjcF9pbml0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5lcnJtb2RlID0gMTsKKyNpZmRlZiBXSU4zMgorICBpZiAodGNwX2RvbmUpCisgICAgcmV0dXJuIDA7CisgIGVsc2UKKyAgeyBXU0FEQVRBIHc7CisgICAgaWYgKFdTQVN0YXJ0dXAoTUFLRVdPUkQoMSwgMSksICZ3KSkKKyAgICAgIHJldHVybiAtMTsKKyAgICB0Y3BfZG9uZSA9IDE7CisgIH0KKyNlbmRpZgorICByZXR1cm4gMDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9kb25lKHN0cnVjdCBzb2FwICpzb2FwKQoreyAKKyNpZmRlZiBTT0FQX0RFQlVHCisgIGludCBpOworI2VuZGlmCisgIGlmIChzb2FwX2NoZWNrX3N0YXRlKHNvYXApKQorICAgIHJldHVybjsKKyAgc29hcF9mcmVlKHNvYXApOworICB3aGlsZSAoc29hcC0+Y2xpc3QpCisgIHsgc3RydWN0IHNvYXBfY2xpc3QgKnAgPSBzb2FwLT5jbGlzdC0+bmV4dDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+Y2xpc3QpOworICAgIHNvYXAtPmNsaXN0ID0gcDsKKyAgfQorICBzb2FwLT5rZWVwX2FsaXZlID0gMDsgLyogdG8gZm9yY2UgY2xvc2UgdGhlIHNvY2tldCAqLworICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyNpZmRlZiBXSVRIX0NPT0tJRVMKKyAgc29hcF9mcmVlX2Nvb2tpZXMoc29hcCk7CisjZW5kaWYKKyAgd2hpbGUgKHNvYXAtPnBsdWdpbnMpCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGx1Z2luICpwID0gc29hcC0+cGx1Z2lucy0+bmV4dDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlbW92aW5nIHBsdWdpbiAnJXMnXG4iLCBzb2FwLT5wbHVnaW5zLT5pZCkpOworICAgIGlmIChzb2FwLT5wbHVnaW5zLT5mY29weSB8fCBzb2FwLT5zdGF0ZSA9PSBTT0FQX0lOSVQpCisgICAgICBzb2FwLT5wbHVnaW5zLT5mZGVsZXRlKHNvYXAsIHNvYXAtPnBsdWdpbnMpOworICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5wbHVnaW5zKTsKKyAgICBzb2FwLT5wbHVnaW5zID0gcDsKKyAgfQorICBzb2FwLT5mcGx1Z2luID0gZnBsdWdpbjsKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyAgc29hcC0+ZnBvc3QgPSBodHRwX3Bvc3Q7CisgIHNvYXAtPmZnZXQgPSBodHRwX2dldDsKKyAgc29hcC0+ZmZvcm0gPSBOVUxMOworICBzb2FwLT5mcG9zdGhkciA9IGh0dHBfcG9zdF9oZWFkZXI7CisgIHNvYXAtPmZyZXNwb25zZSA9IGh0dHBfcmVzcG9uc2U7CisgIHNvYXAtPmZwYXJzZSA9IGh0dHBfcGFyc2U7CisgIHNvYXAtPmZwYXJzZWhkciA9IGh0dHBfcGFyc2VfaGVhZGVyOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0lQVjYKKyAgc29hcC0+ZnJlc29sdmUgPSB0Y3BfZ2V0aG9zdDsKKyNlbHNlCisgIHNvYXAtPmZyZXNvbHZlID0gTlVMTDsKKyNlbmRpZgorICBzb2FwLT5mYWNjZXB0ID0gdGNwX2FjY2VwdDsKKyAgc29hcC0+Zm9wZW4gPSB0Y3BfY29ubmVjdDsKKyAgc29hcC0+ZmNsb3NlID0gdGNwX2Rpc2Nvbm5lY3Q7CisgIHNvYXAtPmZjbG9zZXNvY2tldCA9IHRjcF9jbG9zZXNvY2tldDsKKyAgc29hcC0+ZnNodXRkb3duc29ja2V0ID0gdGNwX3NodXRkb3duc29ja2V0OworICBzb2FwLT5mc2VuZCA9IGZzZW5kOworICBzb2FwLT5mcmVjdiA9IGZyZWN2OworICBzb2FwLT5mcG9sbCA9IHNvYXBfcG9sbDsKKyNlbHNlCisgIHNvYXAtPmZvcGVuID0gTlVMTDsKKyAgc29hcC0+ZmNsb3NlID0gTlVMTDsKKyAgc29hcC0+ZnBvbGwgPSBOVUxMOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXAtPmZwcmVwYXJlaW5pdCA9IE5VTEw7CisgIHNvYXAtPmZwcmVwYXJlc2VuZCA9IE5VTEw7CisgIHNvYXAtPmZwcmVwYXJlcmVjdiA9IE5VTEw7CisgIHNvYXAtPmZwcmVwYXJlZmluYWwgPSBOVUxMOworI2VuZGlmCisgIHNvYXAtPmZzZXRlcnJvciA9IE5VTEw7CisgIHNvYXAtPmZpZ25vcmUgPSBOVUxMOworICBzb2FwLT5mc2VydmVsb29wID0gTlVMTDsKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgaWYgKHNvYXAtPnNlc3Npb24pCisgIHsgU1NMX1NFU1NJT05fZnJlZShzb2FwLT5zZXNzaW9uKTsKKyAgICBzb2FwLT5zZXNzaW9uID0gTlVMTDsKKyAgfQorI2VuZGlmCisgIGlmIChzb2FwLT5zdGF0ZSA9PSBTT0FQX0lOSVQpCisgIHsgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikpCisgICAgeyBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKXNvYXAtPm1hc3Rlcik7CisgICAgICBzb2FwLT5tYXN0ZXIgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICAgIH0KKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICBpZiAoc29hcC0+Y3R4KQorICAgIHsgU1NMX0NUWF9mcmVlKHNvYXAtPmN0eCk7CisgICAgICBzb2FwLT5jdHggPSBOVUxMOworICAgIH0KKyNlbmRpZgorICB9CisjaWZkZWYgU09BUF9ERUJVRworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZyZWUgbG9nZmlsZXNcbiIpKTsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfTUFYTE9HUzsgaSsrKQorICB7IGlmIChzb2FwLT5sb2dmaWxlW2ldKQorICAgIHsgU09BUF9GUkVFKHNvYXAsICh2b2lkKilzb2FwLT5sb2dmaWxlW2ldKTsKKyAgICAgIHNvYXAtPmxvZ2ZpbGVbaV0gPSBOVUxMOworICAgIH0KKyAgICBzb2FwX2Nsb3NlX2xvZ2ZpbGUoc29hcCwgaSk7CisgIH0KKyAgc29hcF9mcmVlX21odChzb2FwKTsKKyAgc29hcC0+c3RhdGUgPSAwOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9jbGVhbnVwKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwX2RvbmUoc29hcCk7CisjaWZkZWYgV0lOMzIKKyAgaWYgKCF0Y3BfZG9uZSkKKyAgICByZXR1cm47CisgIHRjcF9kb25lID0gMDsKKyAgV1NBQ2xlYW51cCgpOworI2VuZGlmCit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY29uc3QgY2hhcioKK3RjcF9lcnJvcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqbXNnID0gTlVMTDsKKyAgc3dpdGNoIChzb2FwLT5lcnJtb2RlKQorICB7IGNhc2UgMDoKKyAgICAgIG1zZyA9IHNvYXBfc3RyZXJyb3Ioc29hcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICBtc2cgPSAiV1NBU3RhcnR1cCBmYWlsZWQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgIHsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICBtc2cgPSBzb2FwX3N0cl9jb2RlKGhfZXJyb3JfY29kZXMsIHNvYXAtPmVycm51bSk7CisgICAgICBpZiAoIW1zZykKKyNlbmRpZgorICAgICAgeyBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIlRDUC9VRFAgSVAgZXJyb3IgJWQiLCBzb2FwLT5lcnJudW0pOworICAgICAgICBtc2cgPSBzb2FwLT5tc2didWY7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBtc2c7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBjb25zdCBjaGFyKgoraHR0cF9lcnJvcihzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHN0YXR1cykKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqbXNnID0gU09BUF9TVFJfRU9TOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgbXNnID0gc29hcF9zdHJfY29kZShoX2h0dHBfZXJyb3JfY29kZXMsIHN0YXR1cyk7CisgIGlmICghbXNnKQorICAgIG1zZyA9IFNPQVBfU1RSX0VPUzsKKyNlbmRpZgorICByZXR1cm4gbXNnOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9JUFY2CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3RjcF9nZXRob3N0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICphZGRyLCBzdHJ1Y3QgaW5fYWRkciAqaW5hZGRyKQoreyBzb2FwX2ludDMyIGlhZGQgPSAtMTsKKyAgc3RydWN0IGhvc3RlbnQgaG9zdGVudCwgKmhvc3QgPSAmaG9zdGVudDsKKyNpZmRlZiBWWFdPUktTCisgIGludCBob3N0aW50OworICAvKiBpbmV0X2FkZHIoKSwgYW5kIGhvc3RHZXRCeU5hbWUoKSBleHBlY3QgImNoYXIgKiI7IGFkZHIgaXMgYSAiY29uc3QgY2hhciAqIi4gKi8KKyAgaWFkZCA9IGluZXRfYWRkcigoY2hhciopYWRkcik7CisjZWxzZQorI2lmIGRlZmluZWQoX0FJWFZFUlNJT05fNDMxKSB8fCBkZWZpbmVkKFRSVTY0KQorICBzdHJ1Y3QgaG9zdGVudF9kYXRhIGh0X2RhdGE7CisjZW5kaWYKKyNpZmRlZiBBUzQwMAorICBpYWRkID0gaW5ldF9hZGRyKCh2b2lkKilhZGRyKTsKKyNlbHNlCisgIGlhZGQgPSBpbmV0X2FkZHIoYWRkcik7CisjZW5kaWYKKyNlbmRpZgorICBpZiAoaWFkZCAhPSAtMSkKKyAgeyBtZW1jcHkoaW5hZGRyLCAmaWFkZCwgc2l6ZW9mKGlhZGQpKTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2lmIGRlZmluZWQoX19HTElCQ19fKQorICBpZiAoZ2V0aG9zdGJ5bmFtZV9yKGFkZHIsICZob3N0ZW50LCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOLCAmaG9zdCwgJnNvYXAtPmVycm51bSkgPCAwKQorICAgIGhvc3QgPSBOVUxMOworI2VsaWYgZGVmaW5lZChfQUlYVkVSU0lPTl80MzEpIHx8IGRlZmluZWQoVFJVNjQpCisgIG1lbXNldCgodm9pZCopJmh0X2RhdGEsIDAsIHNpemVvZihodF9kYXRhKSk7CisgIGlmIChnZXRob3N0YnluYW1lX3IoYWRkciwgJmhvc3RlbnQsICZodF9kYXRhKSA8IDApCisgIHsgaG9zdCA9IE5VTEw7CisgICAgc29hcC0+ZXJybnVtID0gaF9lcnJubzsKKyAgfQorI2VsaWYgZGVmaW5lZChIQVZFX0dFVEhPU1RCWU5BTUVfUikKKyAgaG9zdCA9IGdldGhvc3RieW5hbWVfcihhZGRyLCAmaG9zdGVudCwgc29hcC0+YnVmLCBTT0FQX0JVRkxFTiwgJnNvYXAtPmVycm51bSk7CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgIC8qIElmIHRoZSBETlMgcmVzb2x2ZXIgbGlicmFyeSByZXNvbHZMaWIgaGFzIGJlZW4gY29uZmlndXJlZCBpbiB0aGUgdnhXb3JrcworICAgKiBpbWFnZSwgYSBxdWVyeSBmb3IgdGhlIGhvc3QgSVAgYWRkcmVzcyBpcyBzZW50IHRvIHRoZSBETlMgc2VydmVyLCBpZiB0aGUKKyAgICogbmFtZSB3YXMgbm90IGZvdW5kIGluIHRoZSBsb2NhbCBob3N0IHRhYmxlLiAqLworICBob3N0aW50ID0gaG9zdEdldEJ5TmFtZSgoY2hhciopYWRkcik7CisgIGlmIChob3N0aW50ID09IEVSUk9SKQorICB7IGhvc3QgPSBOVUxMOworICAgIHNvYXAtPmVycm51bSA9IHNvYXBfZXJybm87IAorICB9CisjZWxzZQorI2lmZGVmIEFTNDAwCisgIGlmICghKGhvc3QgPSBnZXRob3N0YnluYW1lKCh2b2lkKilhZGRyKSkpCisgICAgc29hcC0+ZXJybnVtID0gaF9lcnJubzsKKyNlbHNlCisgIGlmICghKGhvc3QgPSBnZXRob3N0YnluYW1lKGFkZHIpKSkKKyAgICBzb2FwLT5lcnJudW0gPSBoX2Vycm5vOworI2VuZGlmCisjZW5kaWYKKyAgaWYgKCFob3N0KQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSG9zdCBuYW1lIG5vdCBmb3VuZFxuIikpOworICAgIHJldHVybiBTT0FQX0VSUjsKKyAgfQorI2lmZGVmIFZYV09SS1MKKyAgaW5hZGRyLT5zX2FkZHIgPSBob3N0aW50OworI2Vsc2UKKyAgbWVtY3B5KGluYWRkciwgaG9zdC0+aF9hZGRyLCBob3N0LT5oX2xlbmd0aCk7CisjZW5kaWYKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3RjcF9jb25uZWN0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICplbmRwb2ludCwgY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQpCit7CisjaWZkZWYgV0lUSF9JUFY2CisgIHN0cnVjdCBhZGRyaW5mbyBoaW50cywgKnJlcywgKnJlc3NhdmU7CisgIGludCBlcnI7CisjZW5kaWYKKyAgcmVnaXN0ZXIgaW50IGZkOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaW50IGxlbiA9IFNPQVBfQlVGTEVOOworICBpbnQgc2V0ID0gMTsKKyNlbmRpZgorICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCk7CisgIHNvYXAtPnNvY2tldCA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIGlmICh0Y3BfaW5pdChzb2FwKSkKKyAgeyBzb2FwLT5lcnJudW0gPSAwOworICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJUQ1AgaW5pdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBzb2FwLT5lcnJtb2RlID0gMDsKKyNpZmRlZiBXSVRIX0lQVjYKKyAgbWVtc2V0KCh2b2lkKikmaGludHMsIDAsIHNpemVvZihoaW50cykpOworICBoaW50cy5haV9mYW1pbHkgPSBQRl9VTlNQRUM7CisjaWZkZWYgV0lUSF9VRFAKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfREdSQU07CisgIGVsc2UKKyNlbmRpZgorICAgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisgIHNvYXAtPmVycm1vZGUgPSAyOworICBpZiAoc29hcC0+cHJveHlfaG9zdCkKKyAgICBlcnIgPSBnZXRhZGRyaW5mbyhzb2FwLT5wcm94eV9ob3N0LCBzb2FwX2ludDJzKHNvYXAsIHNvYXAtPnByb3h5X3BvcnQpLCAmaGludHMsICZyZXMpOworICBlbHNlCisgICAgZXJyID0gZ2V0YWRkcmluZm8oaG9zdCwgc29hcF9pbnQycyhzb2FwLCBwb3J0KSwgJmhpbnRzLCAmcmVzKTsKKyAgaWYgKGVycikKKyAgeyBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgZ2FpX3N0cmVycm9yKGVyciksICJnZXRhZGRyaW5mbyBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICByZXNzYXZlID0gcmVzOworYWdhaW46CisgIGZkID0gKGludClzb2NrZXQocmVzLT5haV9mYW1pbHksIHJlcy0+YWlfc29ja3R5cGUsIHJlcy0+YWlfcHJvdG9jb2wpOworICBzb2FwLT5lcnJtb2RlID0gMDsKKyNlbHNlCisjaWZkZWYgV0lUSF9VRFAKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICBmZCA9IChpbnQpc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworICBlbHNlCisjZW5kaWYKKyAgICBmZCA9IChpbnQpc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKyNlbmRpZgorICBpZiAoZmQgPCAwKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzb2NrZXQgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNpZmRlZiBTT0NLRVRfQ0xPU0VfT05fRVhFQworI2lmZGVmIFdJTjMyCisjaWZuZGVmIFVOREVSX0NFCisgIFNldEhhbmRsZUluZm9ybWF0aW9uKChIQU5ETEUpZmQsIEhBTkRMRV9GTEFHX0lOSEVSSVQsIDApOworI2VuZGlmCisjZWxzZQorICBmY250bChmZCwgRl9TRVRGRCwgMSk7CisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPmNvbm5lY3RfZmxhZ3MgJiBTT19MSU5HRVIpCisgIHsgc3RydWN0IGxpbmdlciBsaW5nZXI7CisgICAgbWVtc2V0KCh2b2lkKikmbGluZ2VyLCAwLCBzaXplb2YobGluZ2VyKSk7CisgICAgbGluZ2VyLmxfb25vZmYgPSAxOworICAgIGxpbmdlci5sX2xpbmdlciA9IDA7CisgICAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKWZkLCBTT0xfU09DS0VULCBTT19MSU5HRVIsIChjaGFyKikmbGluZ2VyLCBzaXplb2Yoc3RydWN0IGxpbmdlcikpKQorICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19MSU5HRVIgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgIH0KKyAgfQorICBpZiAoKHNvYXAtPmNvbm5lY3RfZmxhZ3MgJiB+U09fTElOR0VSKSAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClmZCwgU09MX1NPQ0tFVCwgc29hcC0+Y29ubmVjdF9mbGFncyAmIH5TT19MSU5HRVIsIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgaWYgKHNvYXAtPmtlZXBfYWxpdmUgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpZmQsIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19LRUVQQUxJVkUgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKWZkLCBTT0xfU09DS0VULCBTT19TTkRCVUYsIChjaGFyKikmbGVuLCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fU05EQlVGIGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIGlmIChzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClmZCwgU09MX1NPQ0tFVCwgU09fUkNWQlVGLCAoY2hhciopJmxlbiwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX1JDVkJVRiBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorI2lmZGVmIFRDUF9OT0RFTEFZCisgIGlmICghKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKWZkLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgVENQX05PREVMQVkgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNlbmRpZgorI2VuZGlmCisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJPcGVuaW5nIHNvY2tldCAlZCB0byBob3N0PSclcycgcG9ydD0lZFxuIiwgZmQsIGhvc3QsIHBvcnQpKTsKKyNpZm5kZWYgV0lUSF9JUFY2CisgIHNvYXAtPnBlZXJsZW4gPSBzaXplb2Yoc29hcC0+cGVlcik7CisgIG1lbXNldCgodm9pZCopJnNvYXAtPnBlZXIsIDAsIHNpemVvZihzb2FwLT5wZWVyKSk7CisgIHNvYXAtPnBlZXIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgIHNvYXAtPmVycm1vZGUgPSAyOworICBpZiAoc29hcC0+cHJveHlfaG9zdCkKKyAgeyBpZiAoc29hcC0+ZnJlc29sdmUoc29hcCwgc29hcC0+cHJveHlfaG9zdCwgJnNvYXAtPnBlZXIuc2luX2FkZHIpKQorICAgIHsgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImdldCBwcm94eSBob3N0IGJ5IG5hbWUgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgIH0KKyAgICBzb2FwLT5wZWVyLnNpbl9wb3J0ID0gaHRvbnMoKHNob3J0KXNvYXAtPnByb3h5X3BvcnQpOworICB9CisgIGVsc2UKKyAgeyBpZiAoc29hcC0+ZnJlc29sdmUoc29hcCwgaG9zdCwgJnNvYXAtPnBlZXIuc2luX2FkZHIpKQorICAgIHsgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImdldCBob3N0IGJ5IG5hbWUgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgIH0KKyAgICBzb2FwLT5wZWVyLnNpbl9wb3J0ID0gaHRvbnMoKHNob3J0KXBvcnQpOworICB9CisgIHNvYXAtPmVycm1vZGUgPSAwOworICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIHJldHVybiBmZDsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPmNvbm5lY3RfdGltZW91dCkKKyNpZiBkZWZpbmVkKFdJTjMyKQorICB7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKWZkLCBGSU9OQklPLCAmbm9uYmxvY2tpbmcpOworICB9CisjZWxpZiBkZWZpbmVkKFZYV09SS1MpCisgIHsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICBpb2N0bCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sIChpbnQpKCZub25ibG9ja2luZykpOyAvKiBtb2RpZmllZCB0byB1c2UgZmQgKi8KKyAgfQorI2Vsc2UKKyAgICBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9HRVRGTCl8T19OT05CTE9DSyk7CisjZW5kaWYKKyAgZWxzZQorI2lmIGRlZmluZWQoV0lOMzIpCisgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sICZibG9ja2luZyk7CisgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgIGlvY3RsKChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgKGludCkoJmJsb2NraW5nKSk7CisgIH0KKyNlbHNlCisgICAgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfR0VURkwpJn5PX05PTkJMT0NLKTsKKyNlbmRpZgorI2VuZGlmCisgIGZvciAoOzspCisgIHsgCisjaWZkZWYgV0lUSF9JUFY2CisgICAgaWYgKGNvbm5lY3QoKFNPQVBfU09DS0VUKWZkLCByZXMtPmFpX2FkZHIsIHJlcy0+YWlfYWRkcmxlbikpCisjZWxzZQorICAgIGlmIChjb25uZWN0KChTT0FQX1NPQ0tFVClmZCwgKHN0cnVjdCBzb2NrYWRkciopJnNvYXAtPnBlZXIsIHNpemVvZihzb2FwLT5wZWVyKSkpCisjZW5kaWYKKyAgICB7IAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQgJiYgKHNvYXBfc29ja2V0X2Vycm5vID09IFNPQVBfRUlOUFJPR1JFU1MgfHwgc29hcF9zb2NrZXRfZXJybm8gPT0gU09BUF9FV09VTERCTE9DSykpCisgICAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICAgIFNPQVBfU09DS0xFTl9UIGs7CisgICAgICAgIGZkX3NldCBmZHM7CisgICAgICAgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQgPiAwKQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gc29hcC0+Y29ubmVjdF90aW1lb3V0OworICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gLXNvYXAtPmNvbm5lY3RfdGltZW91dC8xMDAwMDAwOworICAgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IC1zb2FwLT5jb25uZWN0X3RpbWVvdXQlMTAwMDAwMDsKKyAgICAgICAgfQorICAgICAgICBGRF9aRVJPKCZmZHMpOworICAgICAgICBGRF9TRVQoKFNPQVBfU09DS0VUKWZkLCAmZmRzKTsKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeyBpbnQgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKGZkICsgMSksIE5VTEwsICZmZHMsIE5VTEwsICZ0aW1lb3V0KTsKKyAgICAgICAgICBpZiAociA+IDApCisJICAgIGJyZWFrOworICAgICAgICAgIGlmICghcikKKyAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IDA7CisgICAgICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvbm5lY3QgdGltZW91dFxuIikpOworICAgICAgICAgICAgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHNvYXAsICJUaW1lb3V0IiwgImNvbm5lY3QgZmFpbGVkIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUikKKyAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgY29ubmVjdCB0byBob3N0XG4iKSk7CisgICAgICAgICAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiY29ubmVjdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgICAgfQorICAgICAgICB9CisJayA9IChTT0FQX1NPQ0tMRU5fVClzaXplb2Yoc29hcC0+ZXJybnVtKTsKKyAgICAgICAgaWYgKCFnZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClmZCwgU09MX1NPQ0tFVCwgU09fRVJST1IsIChjaGFyKikmc29hcC0+ZXJybnVtLCAmaykgJiYgIXNvYXAtPmVycm51bSkJLyogcG9ydGFiaWxpdHkgbm90ZTogc2VlIFNPQVBfU09DS0xFTl9UIGRlZmluaXRpb24gaW4gc3Rkc29hcDIuaCAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBjb25uZWN0IHRvIGhvc3RcbiIpKTsKKyAgICAgICAgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJjb25uZWN0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgICBlbHNlCisjZW5kaWYKKyNpZmRlZiBXSVRIX0lQVjYKKyAgICAgIGlmIChyZXMtPmFpX25leHQpCisgICAgICB7IHJlcyA9IHJlcy0+YWlfbmV4dDsKKyAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIGdvdG8gYWdhaW47CisgICAgICB9CisgICAgICBlbHNlCisjZW5kaWYKKyAgICAgIGlmIChzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSKQorICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgY29ubmVjdCB0byBob3N0XG4iKSk7CisgICAgICAgIHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJjb25uZWN0IGZhaWxlZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgfSAgCisgICAgZWxzZQorICAgICAgYnJlYWs7CisgIH0KKyNpZmRlZiBXSVRIX0lQVjYKKyAgc29hcC0+cGVlcmxlbiA9IDA7IC8qIElQdjY6IGFscmVhZHkgY29ubmVjdGVkIHNvIHVzZSBzZW5kKCkgKi8KKyAgZnJlZWFkZHJpbmZvKHJlc3NhdmUpOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0KQorI2lmIGRlZmluZWQoV0lOMzIpCisgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sICZibG9ja2luZyk7CisgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgeyB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgIGlvY3RsKChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgKGludCkoJmJsb2NraW5nKSk7CisgIH0KKyNlbHNlCisgICAgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpZmQsIEZfR0VURkwpJn5PX05PTkJMT0NLKTsKKyNlbmRpZgorI2VuZGlmCisgIHNvYXAtPnNvY2tldCA9IGZkOworICBzb2FwLT5pbW9kZSAmPSB+U09BUF9FTkNfU1NMOworICBzb2FwLT5vbW9kZSAmPSB+U09BUF9FTkNfU1NMOworICBpZiAoIXN0cm5jbXAoZW5kcG9pbnQsICJodHRwczoiLCA2KSkKKyAgeworI2lmZGVmIFdJVEhfT1BFTlNTTAorICAgIEJJTyAqYmlvOworICAgIGludCByOworICAgIGlmIChzb2FwLT5wcm94eV9ob3N0KQorICAgIHsgc2hvcnQgdjsKKyAgICAgIHVuc2lnbmVkIGludCBrID0gc29hcC0+b21vZGU7IC8qIG1ha2Ugc3VyZSB3ZSBvbmx5IHBhcnNlIEhUVFAgKi8KKyAgICAgIHNpemVfdCBuID0gc29hcC0+Y291bnQ7IC8qIHNhdmUgdGhlIGNvbnRlbnQgbGVuZ3RoICovCisgICAgICBjaGFyICp1c2VyaWQsICpwYXNzd2Q7CisgICAgICBzb2FwLT5vbW9kZSAmPSB+U09BUF9FTkM7IC8qIG1hc2sgSU8gYW5kIEVOQyAqLworICAgICAgc29hcC0+b21vZGUgfD0gU09BUF9JT19CVUZGRVI7CisgICAgICBzb2FwX2JlZ2luX3NlbmQoc29hcCk7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvbm5lY3RpbmcgdG8gcHJveHkgc2VydmVyXG4iKSk7CisgICAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIkNPTk5FQ1QgJXM6JWQgSFRUUC8lcyIsIGhvc3QsIHBvcnQsIHNvYXAtPmh0dHBfdmVyc2lvbik7CisgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgc29hcC0+dG1wYnVmLCBOVUxMKSkpCisgICAgICB7IHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgICBpZiAoc29hcC0+cHJveHlfdXNlcmlkICYmIHNvYXAtPnByb3h5X3Bhc3N3ZCAmJiBzdHJsZW4oc29hcC0+cHJveHlfdXNlcmlkKSArIHN0cmxlbihzb2FwLT5wcm94eV9wYXNzd2QpIDwgNzYxKQorICAgICAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIDI2MiwgIiVzOiVzIiwgc29hcC0+cHJveHlfdXNlcmlkLCBzb2FwLT5wcm94eV9wYXNzd2QpOworICAgICAgICBzdHJjcHkoc29hcC0+dG1wYnVmLCAiQmFzaWMgIik7CisgICAgICAgIHNvYXBfczJiYXNlNjQoc29hcCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKShzb2FwLT50bXBidWYgKyAyNjIpLCBzb2FwLT50bXBidWYgKyA2LCBzdHJsZW4oc29hcC0+dG1wYnVmICsgMjYyKSk7CisgICAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiUHJveHktQXV0aG9yaXphdGlvbiIsIHNvYXAtPnRtcGJ1ZikpKQorICAgICAgICB7IHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgTlVMTCwgTlVMTCkpCisgICAgICAgfHwgc29hcF9mbHVzaChzb2FwKSkKKyAgICAgIHsgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgICAgc29hcC0+b21vZGUgPSBrOworICAgICAgayA9IHNvYXAtPmltb2RlOworICAgICAgc29hcC0+aW1vZGUgJj0gflNPQVBfRU5DOyAvKiBtYXNrIElPIGFuZCBFTkMgKi8KKyAgICAgIHYgPSBzb2FwLT52ZXJzaW9uOyAvKiBwcmVzZXJ2ZSAqLworICAgICAgdXNlcmlkID0gc29hcC0+dXNlcmlkOyAvKiBwcmVzZXJ2ZSAqLworICAgICAgcGFzc3dkID0gc29hcC0+cGFzc3dkOyAvKiBwcmVzZXJ2ZSAqLworICAgICAgaWYgKHNvYXBfYmVnaW5fcmVjdihzb2FwKSkKKyAgICAgIHsgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgICAgc29hcC0+dXNlcmlkID0gdXNlcmlkOyAvKiByZXN0b3JlICovCisgICAgICBzb2FwLT5wYXNzd2QgPSBwYXNzd2Q7IC8qIHJlc3RvcmUgKi8KKyAgICAgIHNvYXAtPnZlcnNpb24gPSB2OyAvKiByZXN0b3JlICovCisgICAgICBzb2FwLT5pbW9kZSA9IGs7IC8qIHJlc3RvcmUgKi8KKyAgICAgIHNvYXAtPmNvdW50ID0gbjsgLyogcmVzdG9yZSAqLworICAgICAgc29hcF9iZWdpbl9zZW5kKHNvYXApOworICAgIH0KKyAgICBpZiAoIXNvYXAtPmN0eCAmJiAoc29hcC0+ZXJyb3IgPSBzb2FwLT5mc3NsYXV0aChzb2FwKSkpCisgICAgeyBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgIlNTTCBlcnJvciIsICJTU0wgYXV0aGVudGljYXRpb24gZmFpbGVkIGluIHRjcF9jb25uZWN0KCk6IGNoZWNrIHBhc3N3b3JkLCBrZXkgZmlsZSwgYW5kIGNhIGZpbGUuIiwgU09BUF9TU0xfRVJST1IpOworICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisgICAgc29hcC0+c3NsID0gU1NMX25ldyhzb2FwLT5jdHgpOworICAgIGlmICghc29hcC0+c3NsKQorICAgIHsgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfU1NMX0VSUk9SOworICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorICAgIGlmIChzb2FwLT5zZXNzaW9uKQorICAgIHsgaWYgKCFzdHJjbXAoc29hcC0+c2Vzc2lvbl9ob3N0LCBob3N0KSAmJiBzb2FwLT5zZXNzaW9uX3BvcnQgPT0gcG9ydCkKKyAgICAgICAgU1NMX3NldF9zZXNzaW9uKHNvYXAtPnNzbCwgc29hcC0+c2Vzc2lvbik7CisgICAgICBTU0xfU0VTU0lPTl9mcmVlKHNvYXAtPnNlc3Npb24pOworICAgICAgc29hcC0+c2Vzc2lvbiA9IE5VTEw7CisgICAgfQorICAgIHNvYXAtPmltb2RlIHw9IFNPQVBfRU5DX1NTTDsKKyAgICBzb2FwLT5vbW9kZSB8PSBTT0FQX0VOQ19TU0w7CisgICAgYmlvID0gQklPX25ld19zb2NrZXQoKFNPQVBfU09DS0VUKWZkLCBCSU9fTk9DTE9TRSk7CisgICAgU1NMX3NldF9iaW8oc29hcC0+c3NsLCBiaW8sIGJpbyk7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQpCisjaWYgZGVmaW5lZChXSU4zMikKKyAgICB7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sICZub25ibG9ja2luZyk7CisgICAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICAgIHsgdV9sb25nIG5vbmJsb2NraW5nID0gMTsKKyAgICAgIGlvY3RsKChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgKGludCkoJm5vbmJsb2NraW5nKSk7CisgICAgfQorI2Vsc2UKKyAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX0dFVEZMKXxPX05PTkJMT0NLKTsKKyNlbmRpZgorI2VuZGlmCisgICAgZm9yICg7OykKKyAgICB7IGlmICgociA9IFNTTF9jb25uZWN0KHNvYXAtPnNzbCkpIDw9IDApCisgICAgICB7IGludCBlcnIgPSBTU0xfZ2V0X2Vycm9yKHNvYXAtPnNzbCwgcik7CisgICAgICAgIGlmIChlcnIgIT0gU1NMX0VSUk9SX05PTkUgJiYgZXJyICE9IFNTTF9FUlJPUl9XQU5UX1JFQUQgJiYgZXJyICE9IFNTTF9FUlJPUl9XQU5UX1dSSVRFKQorICAgICAgICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCBzc2xfZXJyb3Ioc29hcCwgciksICJTU0wgY29ubmVjdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0KQorICAgICAgICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgICAgICAgZmRfc2V0IGZkczsKKyAgICAgICAgICBpZiAoc29hcC0+Y29ubmVjdF90aW1lb3V0ID4gMCkKKyAgICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gc29hcC0+Y29ubmVjdF90aW1lb3V0OworICAgICAgICAgICAgdGltZW91dC50dl91c2VjID0gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSAtc29hcC0+Y29ubmVjdF90aW1lb3V0LzEwMDAwMDA7CisgICAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAtc29hcC0+Y29ubmVjdF90aW1lb3V0JTEwMDAwMDA7CisgICAgICAgICAgfQorICAgICAgICAgIEZEX1pFUk8oJmZkcyk7CisgICAgICAgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClmZCwgJmZkcyk7CisgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICB7IGludCByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoZmQgKyAxKSwgJmZkcywgTlVMTCwgJmZkcywgJnRpbWVvdXQpOworICAgICAgICAgICAgaWYgKHIgPiAwKQorCSAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKCFyKQorICAgICAgICAgICAgeyBzb2FwLT5lcnJudW0gPSAwOworICAgICAgICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvbm5lY3QgdGltZW91dFxuIikpOworICAgICAgICAgICAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgIlRpbWVvdXQiLCAiY29ubmVjdCBmYWlsZWQgaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgICAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKwkgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmIChzb2FwLT5jb25uZWN0X3RpbWVvdXQpCisjaWZkZWYgV0lOMzIKKyAgICB7IHVfbG9uZyBibG9ja2luZyA9IDA7CisgICAgICBpb2N0bHNvY2tldCgoU09BUF9TT0NLRVQpZmQsIEZJT05CSU8sICZibG9ja2luZyk7CisgICAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICAgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICAgIGlvY3RsKChTT0FQX1NPQ0tFVClmZCwgRklPTkJJTywgKGludCkoJmJsb2NraW5nKSk7CisgICAgfQorI2Vsc2UKKyAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClmZCwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKWZkLCBGX0dFVEZMKSZ+T19OT05CTE9DSyk7CisjZW5kaWYKKyNlbmRpZgorICAgIGlmIChzb2FwLT5yZXF1aXJlX3NlcnZlcl9hdXRoKQorICAgIHsgWDUwOSAqcGVlcjsKKyAgICAgIGludCBlcnI7CisgICAgICBpZiAoKGVyciA9IFNTTF9nZXRfdmVyaWZ5X3Jlc3VsdChzb2FwLT5zc2wpKSAhPSBYNTA5X1ZfT0spCisgICAgICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCBYNTA5X3ZlcmlmeV9jZXJ0X2Vycm9yX3N0cmluZyhlcnIpLCAiU1NMIGNlcnRpZmljYXRlIHByZXNlbnRlZCBieSBwZWVyIGNhbm5vdCBiZSB2ZXJpZmllZCBpbiB0Y3BfY29ubmVjdCgpIiwgU09BUF9TU0xfRVJST1IpOworICAgICAgICBzb2FwLT5mY2xvc2Vzb2NrZXQoc29hcCwgKFNPQVBfU09DS0VUKWZkKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgICBwZWVyID0gU1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKHNvYXAtPnNzbCk7CisgICAgICBpZiAoIXBlZXIpCisgICAgICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIk5vIFNTTCBjZXJ0aWZpY2F0ZSB3YXMgcHJlc2VudGVkIGJ5IHRoZSBwZWVyIGluIHRjcF9jb25uZWN0KCkiLCBTT0FQX1NTTF9FUlJPUik7CisgICAgICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpZmQpOworICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgIH0KKyAgICAgIFg1MDlfTkFNRV9nZXRfdGV4dF9ieV9OSUQoWDUwOV9nZXRfc3ViamVjdF9uYW1lKHBlZXIpLCBOSURfY29tbW9uTmFtZSwgc29hcC0+bXNnYnVmLCBzaXplb2Yoc29hcC0+bXNnYnVmKSk7CisgICAgICBYNTA5X2ZyZWUocGVlcik7CisgICAgICBpZiAoc29hcF90YWdfY21wKHNvYXAtPm1zZ2J1ZiwgaG9zdCkpCisgICAgICB7IHNvYXBfc2V0X3NlbmRlcl9lcnJvcihzb2FwLCAiU1NMIGVycm9yIiwgIlNTTCBjZXJ0aWZpY2F0ZSBob3N0IG5hbWUgbWlzbWF0Y2ggaW4gdGNwX2Nvbm5lY3QoKSIsIFNPQVBfU1NMX0VSUk9SKTsKKyAgICAgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClmZCk7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1NTTF9FUlJPUjsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyNlbmRpZgorICB9CisgIHJldHVybiBmZDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9iaW5kKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpob3N0LCBpbnQgcG9ydCwgaW50IGJhY2tsb2cpCit7CisjaWZkZWYgV0lUSF9JUFY2CisgIHN0cnVjdCBhZGRyaW5mbyAqYWRkcmluZm8gPSBOVUxMOworICBzdHJ1Y3QgYWRkcmluZm8gaGludHM7CisgIHN0cnVjdCBhZGRyaW5mbyByZXM7CisgIGludCBlcnI7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGludCBsZW4gPSBTT0FQX0JVRkxFTjsKKyAgaW50IHNldCA9IDE7CisjZW5kaWYKKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikpCisgIHsgc29hcC0+ZmNsb3Nlc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIpOworICAgIHNvYXAtPm1hc3RlciA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgc29hcC0+c29ja2V0ID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgc29hcC0+ZXJybW9kZSA9IDE7CisgIGlmICh0Y3BfaW5pdChzb2FwKSkKKyAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJUQ1AgaW5pdCBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNpZmRlZiBXSVRIX0lQVjYKKyAgbWVtc2V0KCh2b2lkKikmaGludHMsIDAsIHNpemVvZihoaW50cykpOworICBoaW50cy5haV9mYW1pbHkgPSBQRl9VTlNQRUM7CisjaWZkZWYgV0lUSF9VRFAKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfREdSQU07CisgIGVsc2UKKyNlbmRpZgorICAgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisgIGhpbnRzLmFpX2ZsYWdzID0gQUlfUEFTU0lWRTsKKyAgc29hcC0+ZXJybW9kZSA9IDI7CisgIGVyciA9IGdldGFkZHJpbmZvKGhvc3QsIHNvYXBfaW50MnMoc29hcCwgcG9ydCksICZoaW50cywgJmFkZHJpbmZvKTsKKyAgaWYgKGFkZHJpbmZvKQorICB7IHJlcyA9ICphZGRyaW5mbzsKKyAgICBzb2FwLT5wZWVyID0gKigoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UqKWFkZHJpbmZvLT5haV9hZGRyKTsKKyAgICBzb2FwLT5wZWVybGVuID0gYWRkcmluZm8tPmFpX2FkZHJsZW47CisgICAgcmVzLmFpX2FkZHIgPSAoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlcjsKKyAgICByZXMuYWlfYWRkcmxlbiA9IHNvYXAtPnBlZXJsZW47CisgICAgZnJlZWFkZHJpbmZvKGFkZHJpbmZvKTsKKyAgfQorICBpZiAoZXJyKQorICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIGdhaV9zdHJlcnJvcihlcnIpLCAiZ2V0YWRkcmluZm8gZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIHNvYXAtPm1hc3RlciA9IHNvY2tldChyZXMuYWlfZmFtaWx5LCByZXMuYWlfc29ja3R5cGUsIHJlcy5haV9wcm90b2NvbCk7CisjZWxzZQorI2lmZGVmIFdJVEhfVURQCisgIGlmICgoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgc29hcC0+bWFzdGVyID0gKGludClzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisgIGVsc2UKKyNlbmRpZgorICAgIHNvYXAtPm1hc3RlciA9IChpbnQpc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKyNlbmRpZgorICBzb2FwLT5lcnJtb2RlID0gMDsKKyAgaWYgKCFzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNvY2tldCBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNpZmRlZiBXSVRIX1VEUAorICBpZiAoKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApKQorICAgIHNvYXAtPnNvY2tldCA9IHNvYXAtPm1hc3RlcjsKKyNlbmRpZgorI2lmZGVmIFNPQ0tFVF9DTE9TRV9PTl9FWEVDCisjaWZkZWYgV0lOMzIKKyNpZm5kZWYgVU5ERVJfQ0UKKyAgU2V0SGFuZGxlSW5mb3JtYXRpb24oKEhBTkRMRSlzb2FwLT5tYXN0ZXIsIEhBTkRMRV9GTEFHX0lOSEVSSVQsIDApOworI2VuZGlmCisjZWxzZQorICBmY250bChzb2FwLT5tYXN0ZXIsIEZfU0VURkQsIDEpOworI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5iaW5kX2ZsYWdzICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgU09MX1NPQ0tFVCwgc29hcC0+YmluZF9mbGFncywgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBpZiAoKChzb2FwLT5pbW9kZSB8IHNvYXAtPm9tb2RlKSAmIFNPQVBfSU9fS0VFUEFMSVZFKSAmJiBzZXRzb2Nrb3B0KChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX0tFRVBBTElWRSBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgU09MX1NPQ0tFVCwgU09fU05EQlVGLCAoY2hhciopJmxlbiwgc2l6ZW9mKGludCkpKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgU09fU05EQlVGIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsIChjaGFyKikmbGVuLCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19SQ1ZCVUYgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisjaWZkZWYgVENQX05PREVMQVkKKyAgaWYgKCEoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBUQ1BfTk9ERUxBWSBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgV0lUSF9JUFY2CisgIHNvYXAtPmVycm1vZGUgPSAwOworICBpZiAoYmluZCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCByZXMuYWlfYWRkciwgcmVzLmFpX2FkZHJsZW4pKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ291bGQgbm90IGJpbmQgdG8gaG9zdFxuIikpOworICAgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImJpbmQgZmFpbGVkIGluIHNvYXBfYmluZCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICB9ICAKKyNlbHNlCisgIHNvYXAtPnBlZXJsZW4gPSBzaXplb2Yoc29hcC0+cGVlcik7CisgIG1lbXNldCgodm9pZCopJnNvYXAtPnBlZXIsIDAsIHNpemVvZihzb2FwLT5wZWVyKSk7CisgIHNvYXAtPnBlZXIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgIHNvYXAtPmVycm1vZGUgPSAyOworICBpZiAoaG9zdCkKKyAgeyBpZiAoc29hcC0+ZnJlc29sdmUoc29hcCwgaG9zdCwgJnNvYXAtPnBlZXIuc2luX2FkZHIpKQorICAgIHsgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiZ2V0IGhvc3QgYnkgbmFtZSBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIHNvYXAtPnBlZXIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7CisgIHNvYXAtPnBlZXIuc2luX3BvcnQgPSBodG9ucygoc2hvcnQpcG9ydCk7CisgIHNvYXAtPmVycm1vZGUgPSAwOworICBpZiAoYmluZCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCAoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlciwgc29hcC0+cGVlcmxlbikpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgYmluZCB0byBob3N0XG4iKSk7CisgICAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiYmluZCBmYWlsZWQgaW4gc29hcF9iaW5kKCkiLCBTT0FQX1RDUF9FUlJPUik7CisgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIH0KKyNlbmRpZgorICBpZiAoIShzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSAmJiBsaXN0ZW4oKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgYmFja2xvZykpCisgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgYmluZCB0byBob3N0XG4iKSk7CisgICAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAibGlzdGVuIGZhaWxlZCBpbiBzb2FwX2JpbmQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfSAgCisgIHJldHVybiBzb2FwLT5tYXN0ZXI7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcG9sbChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgCisjaWZuZGVmIFdJVEhfTEVBTgorICBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICBmZF9zZXQgcmZkLCBzZmQsIHhmZDsKKyAgaW50IHI7CisgIHRpbWVvdXQudHZfc2VjID0gMDsKKyAgdGltZW91dC50dl91c2VjID0gMDsKKyAgRkRfWkVSTygmcmZkKTsKKyAgRkRfWkVSTygmc2ZkKTsKKyAgRkRfWkVSTygmeGZkKTsKKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgIHsgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZyZmQpOworICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmc2ZkKTsKKyAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnhmZCk7CisgICAgciA9IHNlbGVjdCgoU09BUF9TT0NLRVQpKHNvYXAtPnNvY2tldCArIDEpLCAmcmZkLCAmc2ZkLCAmeGZkLCAmdGltZW91dCk7CisgICAgaWYgKHIgPiAwICYmIEZEX0lTU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZ4ZmQpKQorICAgICAgciA9IC0xOworICB9CisgIGVsc2UgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikpCisgIHsgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsICZzZmQpOworICAgIHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5tYXN0ZXIgKyAxKSwgTlVMTCwgJnNmZCwgTlVMTCwgJnRpbWVvdXQpOworICB9CisgIGVsc2UKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgaWYgKHIgPiAwKQorICB7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgICAgaWYgKHNvYXAtPmltb2RlICYgU09BUF9FTkNfU1NMKQorICAgIHsKKyAgICAgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpCisgICAgICAgJiYgRkRfSVNTRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnNmZCkKKyAgICAgICAmJiAoIUZEX0lTU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZyZmQpCisgICAgICAgIHx8IFNTTF9wZWVrKHNvYXAtPnNzbCwgc29hcC0+dG1wYnVmLCAxKSA+IDApKQorICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgICBpZiAoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KQorICAgICAgICYmIEZEX0lTU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZzZmQpCisgICAgICAgJiYgKCFGRF9JU1NFVCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCAmcmZkKQorICAgICAgICB8fCByZWN2KChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIHNvYXAtPnRtcGJ1ZiwgMSwgTVNHX1BFRUspID4gMCkpCisgICAgICAgIHJldHVybiBTT0FQX09LOworICB9CisgIGVsc2UgaWYgKHIgPCAwKQorICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgIGlmICgoc29hcF92YWxpZF9zb2NrZXQoc29hcC0+bWFzdGVyKSB8fCBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKSAmJiBzb2FwX3NvY2tldF9lcnJubyAhPSBTT0FQX0VJTlRSKQorICAgIHsgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2VsZWN0IGZhaWxlZCBpbiBzb2FwX3BvbGwoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfVENQX0VSUk9SOworICAgIH0KKyAgfQorICBlbHNlCisgICAgc29hcC0+ZXJybnVtID0gMDsKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlBvbGxpbmc6IG90aGVyIGVuZCBkb3duIG9uIHNvY2tldD0lZCBzZWxlY3Q9JWRcbiIsIHNvYXAtPnNvY2tldCwgcikpOworICByZXR1cm4gU09BUF9FT0Y7CisjZWxzZQorICByZXR1cm4gU09BUF9PSzsKKyNlbmRpZgorfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAordGNwX2FjY2VwdChzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IHMsIHN0cnVjdCBzb2NrYWRkciAqYSwgaW50ICpuKQoreyBpbnQgZmQ7CisgIGZkID0gKGludClhY2NlcHQoKFNPQVBfU09DS0VUKXMsIGEsIChTT0FQX1NPQ0tMRU5fVCopbik7CS8qIHBvcnRhYmlsaXR5IG5vdGU6IHNlZSBTT0FQX1NPQ0tMRU5fVCBkZWZpbml0aW9uIGluIHN0ZHNvYXAyLmggKi8KKyNpZmRlZiBTT0NLRVRfQ0xPU0VfT05fRVhFQworI2lmZGVmIFdJTjMyCisjaWZuZGVmIFVOREVSX0NFCisgIFNldEhhbmRsZUluZm9ybWF0aW9uKChIQU5ETEUpZmQsIEhBTkRMRV9GTEFHX0lOSEVSSVQsIDApOworI2VuZGlmCisjZWxzZQorICBmY250bChmZCwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7CisjZW5kaWYKKyNlbmRpZgorICByZXR1cm4gZmQ7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYWNjZXB0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBpbnQgbiA9IChpbnQpc2l6ZW9mKHNvYXAtPnBlZXIpOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaW50IGxlbiA9IFNPQVBfQlVGTEVOOworICBpbnQgc2V0ID0gMTsKKyNlbmRpZgorICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisjaWZkZWYgV0lUSF9VRFAKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgICByZXR1cm4gc29hcC0+c29ja2V0ID0gc29hcC0+bWFzdGVyOworI2VuZGlmCisgIG1lbXNldCgodm9pZCopJnNvYXAtPnBlZXIsIDAsIHNpemVvZihzb2FwLT5wZWVyKSk7CisgIHNvYXAtPnNvY2tldCA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgIHNvYXAtPmVycm1vZGUgPSAwOworICBzb2FwLT5rZWVwX2FsaXZlID0gMDsKKyAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikpCisgIHsgZm9yICg7OykKKyAgICB7IAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIGlmIChzb2FwLT5hY2NlcHRfdGltZW91dCkKKyAgICAgIHsgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICAgICAgZmRfc2V0IGZkOworICAgICAgICBpZiAoc29hcC0+YWNjZXB0X3RpbWVvdXQgPiAwKQorICAgICAgICB7IHRpbWVvdXQudHZfc2VjID0gc29hcC0+YWNjZXB0X3RpbWVvdXQ7CisgICAgICAgICAgdGltZW91dC50dl91c2VjID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgdGltZW91dC50dl9zZWMgPSAtc29hcC0+YWNjZXB0X3RpbWVvdXQvMTAwMDAwMDsKKyAgICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAtc29hcC0+YWNjZXB0X3RpbWVvdXQlMTAwMDAwMDsKKyAgICAgICAgfQorICAgICAgICBGRF9aRVJPKCZmZCk7CisgICAgICAgIEZEX1NFVCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCAmZmQpOworICAgICAgICBmb3IgKDs7KQorICAgICAgICB7IGludCByID0gc2VsZWN0KChTT0FQX1NPQ0tFVCkoc29hcC0+bWFzdGVyICsgMSksICZmZCwgJmZkLCBOVUxMLCAmdGltZW91dCk7CisgICAgICAgICAgaWYgKHIgPiAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgaWYgKCFyKQorICAgICAgICAgIHsgc29hcC0+ZXJybnVtID0gMDsKKyAgICAgICAgICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJUaW1lb3V0IiwgImFjY2VwdCBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICAgICAgICAgIHJldHVybiBTT0FQX0lOVkFMSURfU09DS0VUOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FSU5UUikKKyAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgICAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgICAgICBzb2FwX3NldF9zZW5kZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAiYWNjZXB0IGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworICAgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgICAgfQorICAgICAgICB9CisjaWYgZGVmaW5lZChXSU4zMikKKwl7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgICAgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRklPTkJJTywgJm5vbmJsb2NraW5nKTsKKyAgICAgICAgfQorI2VsaWYgZGVmaW5lZChWWFdPUktTKQorICAgICAgICB7IHVfbG9uZyBub25ibG9ja2luZyA9IDE7CisgICAgICAgICAgaW9jdGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRklPTkJJTywgKGludCkoJm5vbmJsb2NraW5nKSk7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfR0VURkwpfE9fTk9OQkxPQ0spOworI2VuZGlmCisgICAgICB9CisgICAgICBlbHNlCisjaWYgZGVmaW5lZChXSU4zMikKKyAgICAgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICAgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRklPTkJJTywgJmJsb2NraW5nKTsKKyAgICAgIH0KKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgICAgIHsgdV9sb25nIGJsb2NraW5nID0gMDsKKyAgICAgICAgaW9jdGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRklPTkJJTywgKGludCkoJmJsb2NraW5nKSk7CisgICAgICB9CisjZWxzZQorICAgICAgICBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGX1NFVEZMLCBmY250bCgoU09BUF9TT0NLRVQpc29hcC0+bWFzdGVyLCBGX0dFVEZMKSZ+T19OT05CTE9DSyk7CisjZW5kaWYKKyNlbmRpZgorICAgICAgc29hcC0+c29ja2V0ID0gc29hcC0+ZmFjY2VwdChzb2FwLCBzb2FwLT5tYXN0ZXIsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzb2FwLT5wZWVyLCAmbik7CisgICAgICBzb2FwLT5wZWVybGVuID0gKHNpemVfdCluOworICAgICAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgICAgICB7CisjaWZkZWYgV0lUSF9JUFY2CisvKiBVc2Ugc29hcC0+aG9zdCB0byBzdG9yZSB0aGUgbnVtZXJpYyBmb3JtIG9mIHRoZSByZW1vdGUgaG9zdCAqLworICAgICAgICBnZXRuYW1laW5mbygoc3RydWN0IHNvY2thZGRyKikmc29hcC0+cGVlciwgbiwgc29hcC0+aG9zdCwgc2l6ZW9mKHNvYXAtPmhvc3QpLCBOVUxMLCAwLCBOSV9OVU1FUklDSE9TVCB8IE5JX05VTUVSSUNTRVJWKTsgCisgICAgICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJBY2NlcHQgc29ja2V0ICVkIGZyb20gJXNcbiIsIHNvYXAtPnNvY2tldCwgc29hcC0+aG9zdCkpOworICAgICAgICBzb2FwLT5pcCA9IDA7IC8qIGluZm8gc3RvcmVkIGluIHNvYXAtPnBlZXIgYW5kIHNvYXAtPmhvc3QgKi8KKyAgICAgICAgc29hcC0+cG9ydCA9IDA7IC8qIGluZm8gc3RvcmVkIGluIHNvYXAtPnBlZXIgYW5kIHNvYXAtPmhvc3QgKi8KKyNlbHNlCisgICAgICAgIHNvYXAtPmlwID0gbnRvaGwoc29hcC0+cGVlci5zaW5fYWRkci5zX2FkZHIpOworICAgICAgICBzb2FwLT5wb3J0ID0gKGludCludG9ocyhzb2FwLT5wZWVyLnNpbl9wb3J0KTsgLyogZG9lcyBub3QgcmV0dXJuIHBvcnQgbnVtYmVyIG9uIHNvbWUgc3lzdGVtcyAqLworICAgICAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiQWNjZXB0IHNvY2tldCAlZCBhdCBwb3J0ICVkIGZyb20gSVAgJWQuJWQuJWQuJWRcbiIsIHNvYXAtPnNvY2tldCwgc29hcC0+cG9ydCwgKGludCkoc29hcC0+aXA+PjI0KSYweEZGLCAoaW50KShzb2FwLT5pcD4+MTYpJjB4RkYsIChpbnQpKHNvYXAtPmlwPj44KSYweEZGLCAoaW50KXNvYXAtPmlwJjB4RkYpKTsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKwlpZiAoc29hcC0+YWNjZXB0X2ZsYWdzICYgU09fTElOR0VSKQorICAgICAgICB7IHN0cnVjdCBsaW5nZXIgbGluZ2VyOworICAgICAgICAgIG1lbXNldCgodm9pZCopJmxpbmdlciwgMCwgc2l6ZW9mKGxpbmdlcikpOworICAgICAgICAgIGxpbmdlci5sX29ub2ZmID0gMTsKKyAgICAgICAgICBsaW5nZXIubF9saW5nZXIgPSAwOworCSAgaWYgKHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgU09MX1NPQ0tFVCwgU09fTElOR0VSLCAoY2hhciopJmxpbmdlciwgc2l6ZW9mKHN0cnVjdCBsaW5nZXIpKSkKKyAgICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworCSAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IFNPX0xJTkdFUiBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKwkgICAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKwkgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKHNvYXAtPmFjY2VwdF9mbGFncyAmIH5TT19MSU5HRVIpICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgU09MX1NPQ0tFVCwgc29hcC0+YWNjZXB0X2ZsYWdzICYgflNPX0xJTkdFUiwgKGNoYXIqKSZzZXQsIHNpemVvZihpbnQpKSkKKyAgICAgICAgeyBzb2FwLT5lcnJudW0gPSBzb2FwX3NvY2tldF9lcnJubzsKKyAgICAgICAgICBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCB0Y3BfZXJyb3Ioc29hcCksICJzZXRzb2Nrb3B0IGZhaWxlZCBpbiBzb2FwX2FjY2VwdCgpIiwgU09BUF9UQ1BfRVJST1IpOworCSAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCgoc29hcC0+aW1vZGUgfCBzb2FwLT5vbW9kZSkgJiBTT0FQX0lPX0tFRVBBTElWRSkgJiYgc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBTT0xfU09DS0VULCBTT19LRUVQQUxJVkUsIChjaGFyKikmc2V0LCBzaXplb2YoaW50KSkpCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19LRUVQQUxJVkUgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisJICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBTT0xfU09DS0VULCBTT19TTkRCVUYsIChjaGFyKikmbGVuLCBzaXplb2YoaW50KSkpCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19TTkRCVUYgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisJICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2V0c29ja29wdCgoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsIChjaGFyKikmbGVuLCBzaXplb2YoaW50KSkpCisgICAgICAgIHsgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgICAgc29hcF9zZXRfcmVjZWl2ZXJfZXJyb3Ioc29hcCwgdGNwX2Vycm9yKHNvYXApLCAic2V0c29ja29wdCBTT19SQ1ZCVUYgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisJICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgfQorI2lmZGVmIFRDUF9OT0RFTEFZCisgICAgICAgIGlmICghKHNvYXAtPm9tb2RlICYgU09BUF9JT19VRFApICYmIHNldHNvY2tvcHQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCAoY2hhciopJnNldCwgc2l6ZW9mKGludCkpKQorICAgICAgICB7IHNvYXAtPmVycm51bSA9IHNvYXBfc29ja2V0X2Vycm5vOworICAgICAgICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgInNldHNvY2tvcHQgVENQX05PREVMQVkgZmFpbGVkIGluIHNvYXBfYWNjZXB0KCkiLCBTT0FQX1RDUF9FUlJPUik7CisJICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgfQorI2VuZGlmCisjZW5kaWYKKyAgICAgICAgaWYgKHNvYXAtPmFjY2VwdF90aW1lb3V0KQorICAgICAgICB7CisjaWYgZGVmaW5lZChXSU4zMikKKyAgICAgICAgICB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgICAgICAgIGlvY3Rsc29ja2V0KChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZJT05CSU8sICZibG9ja2luZyk7CisgICAgICAgICAgaW9jdGxzb2NrZXQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgRklPTkJJTywgJmJsb2NraW5nKTsKKyNlbGlmIGRlZmluZWQoVlhXT1JLUykKKyAgICAgICAgICB1X2xvbmcgYmxvY2tpbmcgPSAwOworICAgICAgICAgIGlvY3RsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZJT05CSU8sIChpbnQpKCZibG9ja2luZykpOworICAgICAgICAgIGlvY3RsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZJT05CSU8sIChpbnQpKCZibG9ja2luZykpOworI2VsaWYgZGVmaW5lZChQQUxNKQorICAgICAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIEZfR0VURkwsMCkmfk9fTk9OQkxPQ0spOworICAgICAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfR0VURkwsMCkmfk9fTk9OQkxPQ0spOworI2VsaWYgZGVmaW5lZChTWU1CSUFOKQorICAgICAgICAgIGxvbmcgYmxvY2tpbmcgPSAwOworICAgICAgICAgIGlvY3RsKChTT0FQX1NPQ0tFVClzb2FwLT5tYXN0ZXIsIDAvKkZJT05CSU8qLywgJmJsb2NraW5nKTsKKyNlbHNlCisgICAgICAgICAgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRl9TRVRGTCwgZmNudGwoKFNPQVBfU09DS0VUKXNvYXAtPm1hc3RlciwgRl9HRVRGTCkmfk9fTk9OQkxPQ0spOworICAgICAgICAgIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfU0VURkwsIGZjbnRsKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIEZfR0VURkwpJn5PX05PTkJMT0NLKTsKKyNlbmRpZgorCX0KKyAgICAgICAgc29hcC0+a2VlcF9hbGl2ZSA9ICgoKHNvYXAtPmltb2RlIHwgc29hcC0+b21vZGUpICYgU09BUF9JT19LRUVQQUxJVkUpICE9IDApOworICAgICAgICByZXR1cm4gc29hcC0+c29ja2V0OworICAgICAgfQorICAgICAgaWYgKHNvYXBfc29ja2V0X2Vycm5vICE9IFNPQVBfRUlOVFIgJiYgc29hcF9zb2NrZXRfZXJybm8gIT0gU09BUF9FQUdBSU4pCisgICAgICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJBY2NlcHQgZmFpbGVkIGZyb20gJXNcbiIsIHNvYXAtPmhvc3QpKTsKKyAgICAgICAgc29hcC0+ZXJybnVtID0gc29hcF9zb2NrZXRfZXJybm87CisgICAgICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgImFjY2VwdCBmYWlsZWQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKwlzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyAgICAgICAgcmV0dXJuIFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyAgeyBzb2FwLT5lcnJudW0gPSAwOworICAgIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsIHRjcF9lcnJvcihzb2FwKSwgIm5vIG1hc3RlciBzb2NrZXQgaW4gc29hcF9hY2NlcHQoKSIsIFNPQVBfVENQX0VSUk9SKTsKKyAgICByZXR1cm4gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAordGNwX2Rpc2Nvbm5lY3Qoc3RydWN0IHNvYXAgKnNvYXApCit7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgIGlmIChzb2FwLT5zc2wpCisgIHsgaW50IHIsIHMgPSAwOworICAgIGlmIChzb2FwLT5zZXNzaW9uKQorICAgICAgU1NMX1NFU1NJT05fZnJlZShzb2FwLT5zZXNzaW9uKTsKKyAgICBpZiAoKnNvYXAtPmhvc3QpCisgICAgeyBzb2FwLT5zZXNzaW9uID0gU1NMX2dldDFfc2Vzc2lvbihzb2FwLT5zc2wpOworICAgICAgaWYgKHNvYXAtPnNlc3Npb24pCisgICAgICB7IHN0cmNweShzb2FwLT5zZXNzaW9uX2hvc3QsIHNvYXAtPmhvc3QpOworICAgICAgICBzb2FwLT5zZXNzaW9uX3BvcnQgPSBzb2FwLT5wb3J0OworICAgICAgfQorICAgIH0KKyAgICByID0gU1NMX3NodXRkb3duKHNvYXAtPnNzbCk7CisgICAgaWYgKHIgIT0gMSkKKyAgICB7IHMgPSBFUlJfZ2V0X2Vycm9yKCk7CisgICAgICBpZiAocykKKyAgICAgIHsgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpCisgICAgICAgIHsgc29hcC0+ZnNodXRkb3duc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIDEpOworICAgICAgICAgIHNvYXAtPnNvY2tldCA9IFNPQVBfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgIH0KKyAgICAgICAgciA9IFNTTF9zaHV0ZG93bihzb2FwLT5zc2wpOworICAgICAgfQorICAgIH0KKyAgICBEQkdMT0coVEVTVCwgaWYgKHMpIFNPQVBfTUVTU0FHRShmZGVidWcsICJTaHV0ZG93biBmYWlsZWQ6ICVkXG4iLCBTU0xfZ2V0X2Vycm9yKHNvYXAtPnNzbCwgcikpKTsKKyAgICBTU0xfZnJlZShzb2FwLT5zc2wpOworICAgIHNvYXAtPnNzbCA9IE5VTEw7CisgICAgaWYgKHMpCisgICAgICByZXR1cm4gU09BUF9TU0xfRVJST1I7CisgICAgRVJSX3JlbW92ZV9zdGF0ZSgwKTsKKyAgfQorI2VuZGlmCisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpICYmICEoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgIHsgc29hcC0+ZnNodXRkb3duc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIDIpOworICAgIHNvYXAtPmZjbG9zZXNvY2tldChzb2FwLCAoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0KTsKKyAgICBzb2FwLT5zb2NrZXQgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAordGNwX2Nsb3Nlc29ja2V0KHN0cnVjdCBzb2FwICpzb2FwLCBTT0FQX1NPQ0tFVCBmZCkKK3sgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDbG9zZSBzb2NrZXQgJWRcbiIsIChpbnQpZmQpKTsKKyAgcmV0dXJuIGNsb3Nlc29ja2V0KGZkKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3RjcF9zaHV0ZG93bnNvY2tldChzdHJ1Y3Qgc29hcCAqc29hcCwgU09BUF9TT0NLRVQgZmQsIGludCBob3cpCit7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2h1dGRvd24gc29ja2V0ICVkIGhvdz0lZFxuIiwgKGludClmZCwgaG93KSk7CisgIHJldHVybiBzaHV0ZG93bihmZCwgaG93KTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2Nsb3Nlc29jayhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IHN0YXR1cyA9IHNvYXAtPmVycm9yOworICBpZiAoc3RhdHVzID09IFNPQVBfRU9GIHx8IHN0YXR1cyA9PSBTT0FQX1RDUF9FUlJPUiB8fCBzdGF0dXMgPT0gU09BUF9TU0xfRVJST1IgfHwgIXNvYXAtPmtlZXBfYWxpdmUpCisgIHsgaWYgKHNvYXAtPmZjbG9zZSAmJiAoc29hcC0+ZXJyb3IgPSBzb2FwLT5mY2xvc2Uoc29hcCkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOworICB9CisjaWZkZWYgV0lUSF9aTElCCisgIGlmIChzb2FwLT56bGliX3N0YXRlID09IFNPQVBfWkxJQl9ERUZMQVRFKQorICAgIGRlZmxhdGVFbmQoJnNvYXAtPmRfc3RyZWFtKTsKKyAgZWxzZSBpZiAoc29hcC0+emxpYl9zdGF0ZSA9PSBTT0FQX1pMSUJfSU5GTEFURSkKKyAgICBpbmZsYXRlRW5kKCZzb2FwLT5kX3N0cmVhbSk7CisgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfTk9ORTsKKyNlbmRpZgorICByZXR1cm4gc29hcC0+ZXJyb3IgPSBzdGF0dXM7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorc2l6ZV90CitTT0FQX0ZNQUMyCitzb2FwX2hhc2gocmVnaXN0ZXIgY29uc3QgY2hhciAqcykKK3sgcmVnaXN0ZXIgc2l6ZV90IGggPSAwOworICB3aGlsZSAoKnMpCisgICAgaCA9IDY1NTk5KmggKyAqcysrOworICByZXR1cm4gaCAlIFNPQVBfSURIQVNIOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQKK3NvYXBfaW5pdF9waHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBpOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkluaXRpYWxpemluZyBwb2ludGVyIGhhc2h0YWJsZVxuIikpOworICBzb2FwLT5wYmxrID0gTlVMTDsKKyAgc29hcC0+cGlkeCA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCAoaW50KVNPQVBfUFRSSEFTSDsgaSsrKQorICAgIHNvYXAtPnBodFtpXSA9IE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwKgorU09BUF9GTUFDMgorc29hcF9uZXcxKHNvYXBfbW9kZSBtb2RlKQoreyByZXR1cm4gc29hcF9uZXcyKG1vZGUsIG1vZGUpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc3RydWN0IHNvYXAqCitTT0FQX0ZNQUMyCitzb2FwX25ldygpCit7IHJldHVybiBzb2FwX25ldzIoU09BUF9JT19ERUZBVUxULCBTT0FQX0lPX0RFRkFVTFQpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorc3RydWN0IHNvYXAqCitTT0FQX0ZNQUMyCitzb2FwX25ldzIoc29hcF9tb2RlIGltb2RlLCBzb2FwX21vZGUgb21vZGUpCit7IHN0cnVjdCBzb2FwICpzb2FwID0gKHN0cnVjdCBzb2FwKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2FwKSk7CisgIGlmIChzb2FwKQorICAgIHNvYXBfaW5pdDIoc29hcCwgaW1vZGUsIG9tb2RlKTsKKyAgcmV0dXJuIHNvYXA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2RlbChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgZnJlZShzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZAorc29hcF9mcmVlX3BodChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGJsayAqcGIsICpuZXh0OworICByZWdpc3RlciBpbnQgaTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIHBvaW50ZXIgaGFzaHRhYmxlXG4iKSk7CisgIGZvciAocGIgPSBzb2FwLT5wYmxrOyBwYjsgcGIgPSBuZXh0KQorICB7IG5leHQgPSBwYi0+bmV4dDsKKyAgICBTT0FQX0ZSRUUoc29hcCwgcGIpOworICB9CisgIHNvYXAtPnBibGsgPSBOVUxMOworICBzb2FwLT5waWR4ID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IChpbnQpU09BUF9QVFJIQVNIOyBpKyspCisgICAgc29hcC0+cGh0W2ldID0gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbWJlZChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCwgY29uc3Qgc3RydWN0IHNvYXBfYXJyYXkgKmEsIGludCBuLCBjb25zdCBjaGFyICp0YWcsIGludCB0eXBlKQoreyByZWdpc3RlciBpbnQgaTsKKyAgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICBpZiAoc29hcC0+dmVyc2lvbiAhPSAxKQorICAgIHNvYXAtPmVuY29kaW5nID0gMTsKKyAgaWYgKGEpCisgICAgaSA9IHNvYXBfYXJyYXlfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgYSwgbiwgdHlwZSwgJnBwKTsKKyAgZWxzZQorICAgIGkgPSBzb2FwX3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIHR5cGUsICZwcCk7CisgIGlmIChpKQorICB7IGlmIChzb2FwX2lzX2VtYmVkZGVkKHNvYXAsIHBwKQorICAgICB8fCBzb2FwX2lzX3NpbmdsZShzb2FwLCBwcCkpCisgICAgICByZXR1cm4gMDsKKyAgICBzb2FwX3NldF9lbWJlZGRlZChzb2FwLCBwcCk7CisgIH0KKyAgcmV0dXJuIGk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcG9pbnRlcl9sb29rdXAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnAsIGludCB0eXBlLCBzdHJ1Y3Qgc29hcF9wbGlzdCAqKnBwcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGxpc3QgKnBwOworICAqcHBwID0gTlVMTDsKKyAgaWYgKHApCisgIHsgZm9yIChwcCA9IHNvYXAtPnBodFtzb2FwX2hhc2hfcHRyKHApXTsgcHA7IHBwID0gcHAtPm5leHQpCisgICAgeyBpZiAocHAtPnB0ciA9PSBwICYmIHBwLT50eXBlID09IHR5cGUpCisgICAgICB7ICpwcHAgPSBwcDsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJMb29rdXAgbG9jYXRpb249JXAgdHlwZT0lZCBpZD0lZFxuIiwgcCwgdHlwZSwgcHAtPmlkKSk7CisgICAgICAgIHJldHVybiBwcC0+aWQ7CisgICAgICB9CisgICAgfQorICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTG9va3VwIGxvY2F0aW9uPSVwIHR5cGU9JWQ6IG5vdCBmb3VuZFxuIiwgcCwgdHlwZSkpOworICByZXR1cm4gMDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wb2ludGVyX2VudGVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGludCB0eXBlLCBzdHJ1Y3Qgc29hcF9wbGlzdCAqKnBwcCkKK3sgcmVnaXN0ZXIgaW50IGg7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgaWYgKCFzb2FwLT5wYmxrIHx8IHNvYXAtPnBpZHggPj0gU09BUF9QVFJCTEspCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGJsayAqcGIgPSAoc3RydWN0IHNvYXBfcGJsayopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX3BibGspKTsKKyAgICBpZiAoIXBiKQorICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBwYi0+bmV4dCA9IHNvYXAtPnBibGs7CisgICAgc29hcC0+cGJsayA9IHBiOworICAgIHNvYXAtPnBpZHggPSAwOworICB9CisgICpwcHAgPSBwcCA9ICZzb2FwLT5wYmxrLT5wbGlzdFtzb2FwLT5waWR4KytdOworICBpZiAoYSkKKyAgICBoID0gc29hcF9oYXNoX3B0cihhLT5fX3B0cik7CisgIGVsc2UKKyAgICBoID0gc29hcF9oYXNoX3B0cihwKTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJQb2ludGVyIGVudGVyIGxvY2F0aW9uPSVwIGFycmF5PSVwIHNpemU9JWQgZGltPSVkIHR5cGU9JWQgaWQ9JWRcbiIsIHAsIGE/YS0+X19wdHI6TlVMTCwgYT9hLT5fX3NpemU6MCwgbiwgdHlwZSwgc29hcC0+aWRudW0rMSkpOworICBwcC0+bmV4dCA9IHNvYXAtPnBodFtoXTsKKyAgcHAtPnR5cGUgPSB0eXBlOworICBwcC0+bWFyazEgPSAwOworICBwcC0+bWFyazIgPSAwOworICBwcC0+cHRyID0gcDsKKyAgcHAtPmFycmF5ID0gYTsKKyAgc29hcC0+cGh0W2hdID0gcHA7CisgIHBwLT5pZCA9ICsrc29hcC0+aWRudW07CisgIHJldHVybiBwcC0+aWQ7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYXJyYXlfcG9pbnRlcl9sb29rdXAoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgbiwgaW50IHR5cGUsIHN0cnVjdCBzb2FwX3BsaXN0ICoqcHBwKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgICpwcHAgPSBOVUxMOworICBpZiAoIXAgfHwgIWEtPl9fcHRyKQorICAgIHJldHVybiAwOworICBmb3IgKHBwID0gc29hcC0+cGh0W3NvYXBfaGFzaF9wdHIoYS0+X19wdHIpXTsgcHA7IHBwID0gcHAtPm5leHQpCisgIHsgaWYgKHBwLT50eXBlID09IHR5cGUgJiYgcHAtPmFycmF5ICYmIHBwLT5hcnJheS0+X19wdHIgPT0gYS0+X19wdHIpCisgICAgeyByZWdpc3RlciBpbnQgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgIGlmICgoKGNvbnN0IGludCopJnBwLT5hcnJheS0+X19zaXplKVtpXSAhPSAoKGNvbnN0IGludCopJmEtPl9fc2l6ZSlbaV0pCisJICBicmVhazsKKyAgICAgIGlmIChpID09IG4pCisgICAgICB7ICpwcHAgPSBwcDsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJBcnJheSBsb29rdXAgbG9jYXRpb249JXAgdHlwZT0lZCBpZD0lZFxuIiwgYS0+X19wdHIsIHR5cGUsIHBwLT5pZCkpOworICAgICAgICByZXR1cm4gcHAtPmlkOworICAgICAgfQorICAgIH0KKyAgfQorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFycmF5IGxvb2t1cCBsb2NhdGlvbj0lcCB0eXBlPSVkOiBub3QgZm91bmRcbiIsIGEtPl9fcHRyLCB0eXBlKSk7CisgIHJldHVybiAwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYmVnaW5fY291bnQoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXBfY2xyX2F0dHIoc29hcCk7CisgIHNvYXBfc2V0X2xvY2FsX25hbWVzcGFjZXMoc29hcCk7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpIHx8IChzb2FwLT5vbW9kZSAmIFNPQVBfRU5DX0RJTUUpKQorICAgIHNvYXAtPm1vZGUgPSBzb2FwLT5vbW9kZSB8IFNPQVBfSU9fTEVOR1RIIHwgU09BUF9FTkNfRElNRTsKKyAgZWxzZQorI2VuZGlmCisgIHsgc29hcC0+bW9kZSA9IHNvYXAtPm9tb2RlOworICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fU1RPUkUKKyAgICAgfHwgKCgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTksgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpKQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICAgICAgJiYgIXNvYXAtPmZwcmVwYXJlc2VuZAorI2VuZGlmCisgICAgICApKQorICAgICAgc29hcC0+bW9kZSAmPSB+U09BUF9JT19MRU5HVEg7CisgICAgZWxzZQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX0xFTkdUSDsKKyAgfQorI2lmZGVmIFdJVEhfWkxJQgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fRkxVU0gpCisgIHsgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpKQorICAgICAgc29hcC0+bW9kZSAmPSB+U09BUF9JT19MRU5HVEg7CisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fQlVGRkVSOworICAgIGVsc2UKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19TVE9SRTsKKyAgfQorI2VuZGlmCisgIGlmICghc29hcC0+ZW5jb2RpbmdTdHlsZSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9HUkFQSCkpCisgICAgc29hcC0+bW9kZSB8PSBTT0FQX1hNTF9UUkVFOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpKQorICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfTUlNRTsKKyAgZWxzZQorICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX01UT007CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkKKyAgICBzb2FwX3NlbGVjdF9taW1lX2JvdW5kYXJ5KHNvYXApOworICBzb2FwLT5kaW1lLmxpc3QgPSBzb2FwLT5kaW1lLmxhc3Q7CS8qIGtlZXAgdHJhY2sgb2YgbGFzdCBESU1FIGF0dGFjaG1lbnQgKi8KKyNlbmRpZgorICBzb2FwLT5jb3VudCA9IDA7CisgIHNvYXAtPm5zID0gMDsKKyAgc29hcC0+bnVsbCA9IDA7CisgIHNvYXAtPnBvc2l0aW9uID0gMDsKKyAgc29hcC0+bXVzdFVuZGVyc3RhbmQgPSAwOworICBzb2FwLT5lbmNvZGluZyA9IDA7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0JFR0lOOworICBzb2FwLT5pZG51bSA9IDA7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQmVnaW4gY291bnQgcGhhc2UgKHNvY2tldD0lZCBtb2RlPTB4JXggY291bnQ9JWx1KVxuIiwgc29hcC0+c29ja2V0LCBzb2FwLT5tb2RlLCAodW5zaWduZWQgbG9uZylzb2FwLT5jb3VudCkpOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzb2FwLT5kaW1lLmNvdW50ID0gMDsgLyogY291bnQgIyBvZiBhdHRhY2htZW50cyAqLworICBzb2FwLT5kaW1lLnNpemUgPSAwOyAvKiBhY2N1bXVsYXRlIHRvdGFsIHNpemUgb2YgYXR0YWNobWVudHMgKi8KKyAgaWYgKHNvYXAtPmZwcmVwYXJlaW5pdCAmJiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pICE9IFNPQVBfSU9fU1RPUkUpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gc29hcC0+ZnByZXBhcmVpbml0KHNvYXApOyAgIAorI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VuZF9jb3VudChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5mcHJlcGFyZWZpbmFsKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IHNvYXAtPmZwcmVwYXJlZmluYWwoc29hcCk7CisjZW5kaWYKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmQgb2YgY291bnQgcGhhc2VcbiIpKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYmVnaW5fc2VuZChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICBzb2FwX2Nscl9hdHRyKHNvYXApOworICBzb2FwX3NldF9sb2NhbF9uYW1lc3BhY2VzKHNvYXApOworICBzb2FwLT5tb2RlID0gc29hcC0+b21vZGUgfCAoc29hcC0+bW9kZSAmIChTT0FQX0lPX0xFTkdUSCB8IFNPQVBfRU5DX0RJTUUpKTsKKyNpZmRlZiBXSVRIX1pMSUIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQikgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0ZMVVNIKQorICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWE1MKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX0JVRkZFUjsKKyAgICBlbHNlCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fU1RPUkU7CisgIH0KKyNlbmRpZgorI2lmZGVmIFdJVEhfVURQCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU9fVURQKSkKKyAgeyBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX1hNTDsKKyAgICBpZiAoc29hcC0+Y291bnQgPiBTT0FQX0JVRkxFTikKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfVURQX0VSUk9SOworICB9CisjZW5kaWYKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19GTFVTSCAmJiBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICB7IGlmIChzb2FwLT5jb3VudCB8fCAoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKSB8fCAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1hNTCkpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fQlVGRkVSOworICAgIGVsc2UKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19TVE9SRTsKKyAgfQorICBzb2FwLT5tb2RlICY9IH5TT0FQX0lPX0xFTkdUSDsKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19TVE9SRSkKKyAgICBzb2FwX25ld19ibG9jayhzb2FwKTsKKyAgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfSU9fS0VFUEFMSVZFKSkKKyAgICBzb2FwLT5rZWVwX2FsaXZlID0gMDsKKyAgaWYgKCFzb2FwLT5lbmNvZGluZ1N0eWxlICYmICEoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0dSQVBIKSkKKyAgICBzb2FwLT5tb2RlIHw9IFNPQVBfWE1MX1RSRUU7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01UT00pICYmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkpCisgIHsgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19NSU1FOworICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX0RJTUU7CisgIH0KKyAgZWxzZQorICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX01UT007CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkKKyAgICBzb2FwX3NlbGVjdF9taW1lX2JvdW5kYXJ5KHNvYXApOworI2lmZGVmIFdJTjMyCisjaWZuZGVmIFVOREVSX0NFCisjaWZuZGVmIFdJVEhfRkFTVENHSQorICBpZiAoIXNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpIC8qIFNldCB3aW4zMiBzdGRvdXQgb3Igc29hcC0+c2VuZGZkIHRvIEJJTkFSWSwgZS5nLiB0byBzdXBwb3J0IERJTUUgKi8KKyNpZmRlZiBfX0JPUkxBTkRDX18KKyAgICBzZXRtb2RlKChTT0FQX1NPQ0tFVClzb2FwLT5zZW5kZmQsIE9fQklOQVJZKTsKKyNlbHNlCisgICAgX3NldG1vZGUoKFNPQVBfU09DS0VUKXNvYXAtPnNlbmRmZCwgX09fQklOQVJZKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JTykKKyAgeyBzb2FwLT5idWZpZHggPSAwOworICAgIHNvYXAtPmJ1ZmxlbiA9IDA7CisgIH0KKyAgc29hcC0+Y2h1bmtzaXplID0gMDsKKyAgc29hcC0+bnMgPSAwOworICBzb2FwLT5udWxsID0gMDsKKyAgc29hcC0+cG9zaXRpb24gPSAwOworICBzb2FwLT5tdXN0VW5kZXJzdGFuZCA9IDA7CisgIHNvYXAtPmVuY29kaW5nID0gMDsKKyAgc29hcC0+aWRudW0gPSAwOworICBzb2FwLT5sZXZlbCA9IDA7CisjaWZkZWYgV0lUSF9aTElCCisgIHNvYXAtPnpfcmF0aW9fb3V0ID0gMS4wOworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKSAmJiBzb2FwLT56bGliX3N0YXRlICE9IFNPQVBfWkxJQl9ERUZMQVRFKQorICB7CisjaWZkZWYgV0lUSF9HWklQCisgICAgbWVtY3B5KHNvYXAtPnpfYnVmLCAiXDM3XDIxM1wxMFwwXDBcMFwwXDBcMFwzNzciLCAxMCk7CisgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZSopc29hcC0+el9idWYgKyAxMDsKKyAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgPSBTT0FQX0JVRkxFTiAtIDEwOworICAgIHNvYXAtPnpfY3JjID0gY3JjMzIoMEwsIE5VTEwsIDApOworICAgIGlmIChkZWZsYXRlSW5pdDIoJnNvYXAtPmRfc3RyZWFtLCBzb2FwLT56X2xldmVsLCBaX0RFRkxBVEVELCAtTUFYX1dCSVRTLCA4LCBaX0RFRkFVTFRfU1RSQVRFR1kpICE9IFpfT0spCisjZWxzZQorICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfb3V0ID0gKEJ5dGUqKXNvYXAtPnpfYnVmOworICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCA9IFNPQVBfQlVGTEVOOworICAgIGlmIChkZWZsYXRlSW5pdCgmc29hcC0+ZF9zdHJlYW0sIHNvYXAtPnpfbGV2ZWwpICE9IFpfT0spCisjZW5kaWYKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlZmxhdGUgaW5pdGlhbGl6ZWRcbiIpKTsKKyAgICBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX0RFRkxBVEU7CisgIH0KKyNlbmRpZgorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkJlZ2luIHNlbmQgcGhhc2UgKHNvY2tldD0lZCBtb2RlPTB4JXggY291bnQ9JWx1KVxuIiwgc29hcC0+c29ja2V0LCBzb2FwLT5tb2RlLCAodW5zaWduZWQgbG9uZylzb2FwLT5jb3VudCkpOworICBzb2FwLT5wYXJ0ID0gU09BUF9CRUdJTjsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPmZwcmVwYXJlaW5pdCAmJiAoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fU1RPUkUpCisgICAgc29hcC0+ZnByZXBhcmVpbml0KHNvYXApOyAgIAorI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZW1iZWRkZWQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnAsIGludCB0KQoreyBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgIGlmIChzb2FwX3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIHQsICZwcCkpCisgIHsgcHAtPm1hcmsxID0gMTsKKyAgICBwcC0+bWFyazIgPSAxOworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW1iZWRkZWQgJXAgdHlwZT0lZCBtYXJrIHNldCB0byAxXG4iLCBwLCB0KSk7CisgIH0KK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWZlcmVuY2Uoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnAsIGludCB0KQoreyBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgIGlmICghcCB8fCAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1RSRUUpKQorICAgIHJldHVybiAxOworICBpZiAoc29hcF9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCB0LCAmcHApKQorICB7IGlmIChwcC0+bWFyazEgPT0gMCkKKyAgICB7IHBwLT5tYXJrMSA9IDI7CisgICAgICBwcC0+bWFyazIgPSAyOworICAgIH0KKyAgfQorICBlbHNlIGlmIChzb2FwX3BvaW50ZXJfZW50ZXIoc29hcCwgcCwgTlVMTCwgMCwgdCwgJnBwKSkKKyAgeyBwcC0+bWFyazEgPSAwOworICAgIHBwLT5tYXJrMiA9IDA7CisgIH0KKyAgZWxzZQorICAgIHJldHVybiAxOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlZmVyZW5jZSAlcCB0eXBlPSVkICglZCAlZClcbiIsIHAsIHQsIChpbnQpcHAtPm1hcmsxLCAoaW50KXBwLT5tYXJrMikpOworICByZXR1cm4gcHAtPm1hcmsxOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2FycmF5X3JlZmVyZW5jZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCwgY29uc3Qgc3RydWN0IHNvYXBfYXJyYXkgKmEsIGludCBuLCBpbnQgdCkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgaWYgKCFwIHx8ICFhLT5fX3B0cikKKyAgICByZXR1cm4gMTsKKyAgaSA9IHNvYXBfYXJyYXlfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgYSwgbiwgdCwgJnBwKTsKKyAgaWYgKGkpCisgIHsgaWYgKHBwLT5tYXJrMSA9PSAwKQorICAgIHsgcHAtPm1hcmsxID0gMjsKKyAgICAgIHBwLT5tYXJrMiA9IDI7CisgICAgfQorICB9CisgIGVsc2UgaWYgKCFzb2FwX3BvaW50ZXJfZW50ZXIoc29hcCwgcCwgYSwgbiwgdCwgJnBwKSkKKyAgICByZXR1cm4gMTsKKyAgZWxzZQorICB7IHBwLT5tYXJrMSA9IDA7CisgICAgcHAtPm1hcmsyID0gMDsKKyAgfQorICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkFycmF5IHJlZmVyZW5jZSAlcCBwdHI9JXAgZGltPSVkIHR5cGU9JWQgKCVkICVkKVxuIiwgcCwgYS0+X19wdHIsIG4sIHQsIChpbnQpcHAtPm1hcmsxLCAoaW50KXBwLT5tYXJrMikpOworICByZXR1cm4gcHAtPm1hcmsxOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VtYmVkZGVkX2lkKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgaWQsIGNvbnN0IHZvaWQgKnAsIGludCB0KQoreyBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfVFJFRSkKKyAgICByZXR1cm4gaWQ7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW1iZWRkZWRfaWQgJXAgdHlwZT0lZCBpZD0lZFxuIiwgcCwgdCwgaWQpKTsKKyAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMSAmJiBzb2FwLT5lbmNvZGluZ1N0eWxlICYmICEoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0dSQVBIKSAmJiBzb2FwLT5wYXJ0ICE9IFNPQVBfSU5fSEVBREVSKQorICB7IGlmIChpZCA8IDApCisgICAgeyBpZCA9IHNvYXBfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgdCwgJnBwKTsKKyAgICAgIGlmIChpZCkKKyAgICAgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICAgICAgICBwcC0+bWFyazEgPSAyOworICAgICAgICBlbHNlCisgICAgICAgICAgcHAtPm1hcmsyID0gMjsKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbWJlZGRlZF9pZCBtdWx0aXJlZiBpZD0lZCAlcCB0eXBlPSVkID0gKCVkICVkKVxuIiwgaWQsIHAsIHQsIChpbnQpcHAtPm1hcmsxLCAoaW50KXBwLT5tYXJrMikpOworICAgICAgfQorICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gaWQ7CisgIH0KKyAgaWYgKGlkIDwgMCkKKyAgICBpZCA9IHNvYXBfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgdCwgJnBwKTsKKyAgZWxzZSBpZiAoaWQgJiYgIXNvYXBfcG9pbnRlcl9sb29rdXAoc29hcCwgcCwgdCwgJnBwKSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKGlkICYmIHBwKQorICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgICBwcC0+bWFyazEgPSAxOworICAgIGVsc2UKKyAgICAgIHBwLT5tYXJrMiA9IDE7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbWJlZGRlZF9pZCBlbWJlZGRlZCByZWYgaWQ9JWQgJXAgdHlwZT0lZCA9ICglZCAlZClcbiIsIGlkLCBwLCB0LCAoaW50KXBwLT5tYXJrMSwgKGludClwcC0+bWFyazIpKTsKKyAgfQorICByZXR1cm4gaWQ7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfaXNfZW1iZWRkZWQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3BsaXN0ICpwcCkKK3sgaWYgKCFwcCkKKyAgICByZXR1cm4gMDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJcyBlbWJlZGRlZD8gJWQgJWRcbiIsIChpbnQpcHAtPm1hcmsxLCAoaW50KXBwLT5tYXJrMikpOworICBpZiAoc29hcC0+dmVyc2lvbiA9PSAxICYmIHNvYXAtPmVuY29kaW5nU3R5bGUgJiYgIShzb2FwLT5tb2RlICYgU09BUF9YTUxfR1JBUEgpICYmIHNvYXAtPnBhcnQgIT0gU09BUF9JTl9IRUFERVIpCisgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICAgIHJldHVybiBwcC0+bWFyazEgIT0gMDsKKyAgICByZXR1cm4gcHAtPm1hcmsyICE9IDA7CisgIH0KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICByZXR1cm4gcHAtPm1hcmsxID09IDE7CisgIHJldHVybiBwcC0+bWFyazIgPT0gMTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9pc19zaW5nbGUoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX3BsaXN0ICpwcCkKK3sgaWYgKHNvYXAtPnBhcnQgPT0gU09BUF9JTl9IRUFERVIpCisgICAgcmV0dXJuIDE7CisgIGlmICghcHApCisgICAgcmV0dXJuIDA7CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgcmV0dXJuIHBwLT5tYXJrMSA9PSAwOworICByZXR1cm4gcHAtPm1hcmsyID09IDA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9lbWJlZGRlZChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGxpc3QgKnBwKQoreyBpZiAoIXBwKQorICAgIHJldHVybjsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICBwcC0+bWFyazEgPSAxOworICBlbHNlCisgICAgcHAtPm1hcmsyID0gMTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9hdHRhY2htZW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgdm9pZCAqcCwgY29uc3Qgc3RydWN0IHNvYXBfYXJyYXkgKmEsIGNvbnN0IGNoYXIgKmFpZCwgY29uc3QgY2hhciAqYXR5cGUsIGNvbnN0IGNoYXIgKmFvcHRpb25zLCBpbnQgbiwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpIAoreyBzdHJ1Y3Qgc29hcF9wbGlzdCAqcHA7CisgIGludCBpOworICBpZiAoIXAgfHwgIWEtPl9fcHRyIHx8ICghYWlkICYmICFhdHlwZSkpCisgICAgcmV0dXJuIHNvYXBfZWxlbWVudF9pZChzb2FwLCB0YWcsIGlkLCBwLCBhLCBuLCB0eXBlLCB0KTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJBdHRhY2htZW50IHRhZz0nJXMnIGlkPSclcycgKCVkKSB0eXBlPSclcydcbiIsIHRhZywgYWlkP2FpZDoiIiwgaWQsIGF0eXBlP2F0eXBlOiIiKSk7CisgIGkgPSBzb2FwX2FycmF5X3BvaW50ZXJfbG9va3VwKHNvYXAsIHAsIGEsIG4sIHQsICZwcCk7CisgIGlmICghaSkKKyAgeyBpID0gc29hcF9wb2ludGVyX2VudGVyKHNvYXAsIHAsIGEsIG4sIHQsICZwcCk7CisgICAgaWYgKCFpKQorICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKyAgaWYgKGlkIDw9IDApCisgICAgaWQgPSBpOworICBpZiAoIWFpZCkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1Ziwgc29hcC0+ZGltZV9pZF9mb3JtYXQsIGlkKTsKKyAgICBhaWQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT50bXBidWYpOworICB9CisgIC8qIEFkZCBNVE9NIHhvcDpJbmNsdWRlIGVsZW1lbnQgd2hlbiBuZWNlc3NhcnkgKi8KKyAgLyogVE9ETzogdGhpcyBjb2RlIHRvIGJlIG9ic29sZXRlZCB3aXRoIG5ldyBpbXBvcnQveG9wLmggY29udmVudGlvbnMgKi8KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkgJiYgc3RyY21wKHRhZywgInhvcDpJbmNsdWRlIikpCisgIHsgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCAwLCB0eXBlKQorICAgICB8fCBzb2FwX2VsZW1lbnRfaHJlZihzb2FwLCAieG9wOkluY2x1ZGUiLCAwLCAiaHJlZiIsIGFpZCkKKyAgICAgfHwgc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBlbHNlIGlmIChzb2FwX2VsZW1lbnRfaHJlZihzb2FwLCB0YWcsIDAsICJocmVmIiwgYWlkKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgIHsgaWYgKHBwLT5tYXJrMSAhPSAzKQorICAgIHsgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICAgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKQorICAgICAgICBjb250ZW50ID0gc29hcF9uZXdfbXVsdGlwYXJ0KHNvYXAsICZzb2FwLT5taW1lLmZpcnN0LCAmc29hcC0+bWltZS5sYXN0LCAoY2hhciopYS0+X19wdHIsIGEtPl9fc2l6ZSk7CisgICAgICBlbHNlCisgICAgICAgIGNvbnRlbnQgPSBzb2FwX25ld19tdWx0aXBhcnQoc29hcCwgJnNvYXAtPmRpbWUuZmlyc3QsICZzb2FwLT5kaW1lLmxhc3QsIChjaGFyKilhLT5fX3B0ciwgYS0+X19zaXplKTsKKyAgICAgIGlmICghY29udGVudCkKKyAgICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgaWYgKCFzdHJuY21wKGFpZCwgImNpZDoiLCA0KSkgLyogUkZDIDIxMTEgKi8KKyAgICAgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKQorICAgICAgICB7IGNoYXIgKnMgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc3RybGVuKGFpZCkgLSAxKTsKKwkgIGlmIChzKQorCSAgeyAqcyA9ICc8JzsKKwkgICAgc3RyY3B5KHMgKyAxLCBhaWQgKyA0KTsKKwkgICAgc3RyY2F0KHMsICI+Iik7CisJICAgIGNvbnRlbnQtPmlkID0gczsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIGNvbnRlbnQtPmlkID0gYWlkICsgNDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgY29udGVudC0+aWQgPSBhaWQ7CisgICAgICBjb250ZW50LT50eXBlID0gYXR5cGU7CisgICAgICBjb250ZW50LT5vcHRpb25zID0gYW9wdGlvbnM7CisgICAgICBjb250ZW50LT5lbmNvZGluZyA9IFNPQVBfTUlNRV9CSU5BUlk7CisgICAgICBwcC0+bWFyazEgPSAzOworICAgIH0KKyAgfQorICBlbHNlCisgICAgcHAtPm1hcmsyID0gMzsKKyAgcmV0dXJuIC0xOworfQorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZAorc29hcF9pbml0X2lodChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgaW50IGk7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5pdGlhbGl6aW5nIElEIGhhc2h0YWJsZVxuIikpOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9JREhBU0g7IGkrKykKKyAgICBzb2FwLT5paHRbaV0gPSBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQKK3NvYXBfZnJlZV9paHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXAsICpwOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9mbGlzdCAqZnAsICpmcTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIElEIGhhc2h0YWJsZVxuIikpOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9JREhBU0g7IGkrKykKKyAgeyBmb3IgKGlwID0gc29hcC0+aWh0W2ldOyBpcDsgaXAgPSBwKQorICAgIHsgZm9yIChmcCA9IGlwLT5mbGlzdDsgZnA7IGZwID0gZnEpCisgICAgICB7IGZxID0gZnAtPm5leHQ7CisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBmcCk7CisgICAgICB9CisgICAgICBwID0gaXAtPm5leHQ7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgaXApOworICAgIH0KKyAgICBzb2FwLT5paHRbaV0gPSBOVUxMOworICB9Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcF9pbGlzdCAqCitTT0FQX0ZNQUMyCitzb2FwX2xvb2t1cChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgZm9yIChpcCA9IHNvYXAtPmlodFtzb2FwX2hhc2goaWQpXTsgaXA7IGlwID0gaXAtPm5leHQpCisgICAgaWYgKCFzdHJjbXAoaXAtPmlkLCBpZCkpCisgICAgICByZXR1cm4gaXA7CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorc3RydWN0IHNvYXBfaWxpc3QgKgorU09BUF9GTUFDMgorc29hcF9lbnRlcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQpCit7IHJlZ2lzdGVyIHNpemVfdCBoOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIGlwID0gKHN0cnVjdCBzb2FwX2lsaXN0KilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfaWxpc3QpICsgc3RybGVuKGlkKSk7CisgIGlmIChpcCkKKyAgeyBoID0gc29hcF9oYXNoKGlkKTsKKyAgICBzdHJjcHkoaXAtPmlkLCBpZCk7CisgICAgaXAtPm5leHQgPSBzb2FwLT5paHRbaF07CisgICAgc29hcC0+aWh0W2hdID0gaXA7CisgICAgcmV0dXJuIGlwOworICB9CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkKgorU09BUF9GTUFDMgorc29hcF9tYWxsb2Moc3RydWN0IHNvYXAgKnNvYXAsIHNpemVfdCBuKQoreyByZWdpc3RlciBjaGFyICpwOworICBpZiAoIW4pCisgICAgcmV0dXJuICh2b2lkKilTT0FQX05PTl9OVUxMOworICBpZiAoIXNvYXApCisgICAgcmV0dXJuIFNPQVBfTUFMTE9DKHNvYXAsIG4pOworICBuICs9ICgtKGxvbmcpbikgJiAoc2l6ZW9mKHZvaWQqKS0xKTsgLyogYWxpZ24gYXQgNC0sIDgtIG9yIDE2LWJ5dGUgYm91bmRhcnkgKi8KKyAgaWYgKCEocCA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBuICsgc2l6ZW9mKHZvaWQqKSArIHNpemVvZihzaXplX3QpKSkpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICAvKiBrZWVwIGNoYWluIG9mIGFsbG9jZWQgY2VsbHMgZm9yIGxhdGVyIGRlc3RydWN0aW9uICovCisgIHNvYXAtPmFsbG9jZWQgPSAxOworICAqKHZvaWQqKikocCArIG4pID0gc29hcC0+YWxpc3Q7CisgICooc2l6ZV90KikocCArIG4gKyBzaXplb2Yodm9pZCopKSA9IG47CisgIHNvYXAtPmFsaXN0ID0gcCArIG47CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworc3RhdGljIHZvaWQKK3NvYXBfaW5pdF9taHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgKGludClTT0FQX1BUUkhBU0g7IGkrKykKKyAgICBzb2FwLT5taHRbaV0gPSBOVUxMOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworc3RhdGljIHZvaWQKK3NvYXBfZnJlZV9taHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9tbGlzdCAqbXAsICptcTsKKyAgZm9yIChpID0gMDsgaSA8IChpbnQpU09BUF9QVFJIQVNIOyBpKyspCisgIHsgZm9yIChtcCA9IHNvYXAtPm1odFtpXTsgbXA7IG1wID0gbXEpCisgICAgeyBtcSA9IG1wLT5uZXh0OworICAgICAgaWYgKG1wLT5saXZlKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzKCVkKTogbWFsbG9jKCkgPSAlcCBub3QgZnJlZWQgKG1lbW9yeSBsZWFrIG9yIGZvcmdvdCB0byBjYWxsIHNvYXBfZW5kKCk/KVxuIiwgbXAtPmZpbGUsIG1wLT5saW5lLCBtcC0+cHRyKTsKKyAgICAgIGZyZWUobXApOworICAgIH0KKyAgICBzb2FwLT5taHRbaV0gPSBOVUxMOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitTT0FQX0ZNQUMxCit2b2lkKgorU09BUF9GTUFDMgorc29hcF90cmFja19tYWxsb2Moc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBzaXplX3Qgc2l6ZSkKK3sgcmVnaXN0ZXIgdm9pZCAqcCA9IG1hbGxvYyhzaXplKTsKKyAgaWYgKHNvYXApCisgIHsgcmVnaXN0ZXIgaW50IGggPSBzb2FwX2hhc2hfcHRyKHApOworICAgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX21saXN0ICptcCA9IChzdHJ1Y3Qgc29hcF9tbGlzdCopbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc29hcF9tbGlzdCkpOworICAgIGlmIChzb2FwLT5mZGVidWdbU09BUF9JTkRFWF9URVNUXSkKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiJXMoJWQpOiBtYWxsb2MoJWx1KSA9ICVwXG4iLCBmaWxlLCBsaW5lLCAodW5zaWduZWQgbG9uZylzaXplLCBwKSk7CisgICAgbXAtPm5leHQgPSBzb2FwLT5taHRbaF07CisgICAgbXAtPnB0ciA9IHA7CisgICAgbXAtPmZpbGUgPSBmaWxlOworICAgIG1wLT5saW5lID0gbGluZTsKKyAgICBtcC0+bGl2ZSA9IDE7CisgICAgc29hcC0+bWh0W2hdID0gbXA7CisgIH0KKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3RyYWNrX2ZyZWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCB2b2lkICpwKQoreyByZWdpc3RlciBpbnQgaCA9IHNvYXBfaGFzaF9wdHIocCk7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX21saXN0ICptcDsKKyAgZm9yIChtcCA9IHNvYXAtPm1odFtoXTsgbXA7IG1wID0gbXAtPm5leHQpCisgICAgaWYgKG1wLT5wdHIgPT0gcCkKKyAgICAgIGJyZWFrOworICBpZiAobXApCisgIHsgaWYgKG1wLT5saXZlKQorICAgIHsgZnJlZShwKTsKKyAgICAgIGlmIChzb2FwLT5mZGVidWdbU09BUF9JTkRFWF9URVNUXSkKKyAgICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIlcyglZCk6IGZyZWUoJXApXG4iLCBmaWxlLCBsaW5lLCBwKSk7CisgICAgICBtcC0+bGl2ZSA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMoJWQpOiBmcmVlKCVwKSBkb3VibGUgZnJlZSBvZiBwb2ludGVyIG1hbGxvY2VkIGF0ICVzKCVkKVxuIiwgZmlsZSwgbGluZSwgcCwgbXAtPmZpbGUsIG1wLT5saW5lKTsKKyAgfQorICBlbHNlCisgICAgZnByaW50ZihzdGRlcnIsICIlcyglZCk6IGZyZWUoJXApIHBvaW50ZXIgbm90IG1hbGxvY2VkXG4iLCBmaWxlLCBsaW5lLCBwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK3N0YXRpYyB2b2lkCitzb2FwX3RyYWNrX3VubGluayhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgdm9pZCAqcCkKK3sgcmVnaXN0ZXIgaW50IGggPSBzb2FwX2hhc2hfcHRyKHApOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9tbGlzdCAqbXA7CisgIGZvciAobXAgPSBzb2FwLT5taHRbaF07IG1wOyBtcCA9IG1wLT5uZXh0KQorICAgIGlmIChtcC0+cHRyID09IHApCisgICAgICBicmVhazsKKyAgaWYgKG1wKQorICAgIG1wLT5saXZlID0gMDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZGVhbGxvYyhzdHJ1Y3Qgc29hcCAqc29hcCwgdm9pZCAqcCkKK3sgaWYgKCFzb2FwKQorICAgIHJldHVybjsKKyAgaWYgKHApCisgIHsgcmVnaXN0ZXIgY2hhciAqKnE7CisgICAgZm9yIChxID0gKGNoYXIqKikmc29hcC0+YWxpc3Q7ICpxOyBxID0gKihjaGFyKioqKXEpCisgICAgeyBpZiAocCA9PSAodm9pZCopKCpxIC0gKihzaXplX3QqKSgqcSArIHNpemVvZih2b2lkKikpKSkKKyAgICAgIHsgKnEgPSAqKihjaGFyKioqKXE7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZWQgZGF0YSBhdCAlcFxuIiwgcCkpOworICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisgICAgc29hcF9kZWxldGUoc29hcCwgcCk7CisgIH0KKyAgZWxzZQorICB7IHJlZ2lzdGVyIGNoYXIgKnE7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIGFsbCBzb2FwX21hbGxvYygpIGRhdGFcbiIpKTsKKyAgICB3aGlsZSAoc29hcC0+YWxpc3QpCisgICAgeyBxID0gKGNoYXIqKXNvYXAtPmFsaXN0OworICAgICAgc29hcC0+YWxpc3QgPSAqKHZvaWQqKilxOworICAgICAgcSAtPSAqKHNpemVfdCopKHEgKyBzaXplb2Yodm9pZCopKTsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBxKTsKKyAgICB9CisgIH0KKyAgLyogd2UgbXVzdCBhc3N1bWUgdGhlc2Ugd2VyZSBkZWFsbG9jYXRlZDogKi8KKyAgc29hcC0+YWN0aW9uID0gTlVMTDsKKyAgc29hcC0+ZmF1bHQgPSBOVUxMOworICBzb2FwLT5oZWFkZXIgPSBOVUxMOworICBzb2FwLT51c2VyaWQgPSBOVUxMOworICBzb2FwLT5wYXNzd2QgPSBOVUxMOworICBzb2FwLT5hdXRocmVhbG0gPSBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzb2FwX2Nscl9taW1lKHNvYXApOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2RlbGV0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgdm9pZCAqcCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfY2xpc3QgKipjcDsKKyAgaWYgKHNvYXBfY2hlY2tfc3RhdGUoc29hcCkpCisgICAgcmV0dXJuOworICBjcCA9ICZzb2FwLT5jbGlzdDsKKyAgaWYgKHApCisgIHsgd2hpbGUgKCpjcCkKKyAgICB7IGlmIChwID09ICgqY3ApLT5wdHIpCisgICAgICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2NsaXN0ICpxID0gKmNwOworICAgICAgICAqY3AgPSBxLT5uZXh0OworICAgICAgICBxLT5mZGVsZXRlKHEpOworICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGNwID0gJigqY3ApLT5uZXh0OworICAgIH0KKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBkZWFsbG9jIGRhdGEgJXA6IGFkZHJlc3Mgbm90IGluIGxpc3RcbiIsIHApKTsKKyAgfQorICBlbHNlCisgIHsgd2hpbGUgKCpjcCkKKyAgICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2NsaXN0ICpxID0gKmNwOworICAgICAgKmNwID0gcS0+bmV4dDsKKyAgICAgIGlmIChxLT5wdHIgPT0gKHZvaWQqKXNvYXAtPmZhdWx0KQorICAgICAgICBzb2FwLT5mYXVsdCA9IE5VTEw7IC8qIHRoaXMgd2FzIGRlYWxsb2NhdGVkICovCisgICAgICBlbHNlIGlmIChxLT5wdHIgPT0gKHZvaWQqKXNvYXAtPmhlYWRlcikKKyAgICAgICAgc29hcC0+aGVhZGVyID0gTlVMTDsgLyogdGhpcyB3YXMgZGVhbGxvY2F0ZWQgKi8KKyAgICAgIHEtPmZkZWxldGUocSk7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgcSk7CisgICAgfQorICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcF9jbGlzdCAqCitTT0FQX0ZNQUMyCitzb2FwX2xpbmsoc3RydWN0IHNvYXAgKnNvYXAsIHZvaWQgKnAsIGludCB0LCBpbnQgbiwgdm9pZCAoKmZkZWxldGUpKHN0cnVjdCBzb2FwX2NsaXN0KikpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2NsaXN0ICpjcDsKKyAgaWYgKChjcCA9IChzdHJ1Y3Qgc29hcF9jbGlzdCopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2NsaXN0KSkpKQorICB7IGNwLT5uZXh0ID0gc29hcC0+Y2xpc3Q7CisgICAgY3AtPnR5cGUgPSB0OworICAgIGNwLT5zaXplID0gbjsgCisgICAgY3AtPnB0ciA9IHA7CisgICAgY3AtPmZkZWxldGUgPSBmZGVsZXRlOworICAgIHNvYXAtPmNsaXN0ID0gY3A7CisgIH0KKyAgcmV0dXJuIGNwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF91bmxpbmsoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IHZvaWQgKnApCit7IHJlZ2lzdGVyIGNoYXIgKipxOworICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9jbGlzdCAqKmNwOworICBpZiAoIXNvYXAgfHwgIXApCisgICAgcmV0dXJuOworICBmb3IgKHEgPSAoY2hhcioqKSZzb2FwLT5hbGlzdDsgKnE7IHEgPSAqKGNoYXIqKiopcSkKKyAgeyBpZiAocCA9PSAodm9pZCopKCpxIC0gKihzaXplX3QqKSgqcSArIHNpemVvZih2b2lkKikpKSkKKyAgICB7ICpxID0gKiooY2hhcioqKilxOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVbmxpbmtlZCBkYXRhICVwXG4iLCBwKSk7CisjaWZkZWYgU09BUF9ERUJVRworICAgICAgc29hcF90cmFja191bmxpbmsoc29hcCwgcCk7CisjZW5kaWYKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgZm9yIChjcCA9ICZzb2FwLT5jbGlzdDsgKmNwOyBjcCA9ICYoKmNwKS0+bmV4dCkKKyAgeyBpZiAocCA9PSAoKmNwKS0+cHRyKQorICAgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJVbmxpbmtlZCBjbGFzcyBpbnN0YW5jZSAlcFxuIiwgcCkpOworICAgICAgcSA9IChjaGFyKiopKmNwOworICAgICAgKmNwID0gKCpjcCktPm5leHQ7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgcSk7CisgICAgICByZXR1cm47CisgICAgfQorICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2xvb2t1cF90eXBlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfaWxpc3QgKmlwOworICBpZiAoaWQgJiYgKmlkKQorICB7IGlwID0gc29hcF9sb29rdXAoc29hcCwgaWQpOworICAgIGlmIChpcCkKKyAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTG9va3VwIGlkPSclcycgdHlwZT0lZFxuIiwgaWQsIGlwLT50eXBlKSk7CisgICAgICByZXR1cm4gaXAtPnR5cGU7CisgICAgfQorICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAibG9va3VwIHR5cGUgaWQ9JyVzJyBOT1QgRk9VTkQhIE5lZWQgdG8gZ2V0IGl0IGZyb20geHNpOnR5cGVcbiIsIGlkKSk7CisgIHJldHVybiAwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZCoKK1NPQVBfRk1BQzIKK3NvYXBfaWRfbG9va3VwKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCwgdm9pZCAqKnAsIGludCB0LCBzaXplX3QgbiwgdW5zaWduZWQgaW50IGspCit7IHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyAgdm9pZCAqKnE7CisgIGlmICghcCB8fCAhaWQgfHwgISppZCkKKyAgICByZXR1cm4gcDsKKyAgaXAgPSBzb2FwX2xvb2t1cChzb2FwLCBpZCk7IC8qIGxvb2t1cCBwb2ludGVyIHRvIGhhc2ggdGFibGUgZW50cnkgZm9yIHN0cmluZyBpZCAqLworICBpZiAoIWlwKQorICB7IGlwID0gc29hcF9lbnRlcihzb2FwLCBpZCk7IC8qIG5ldyBoYXNoIHRhYmxlIGVudHJ5IGZvciBzdHJpbmcgaWQgKi8KKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkZvcndhcmRpbmcgZmlyc3QgaHJlZj0nJXMnIHR5cGU9JWQgJXAgKCV1IGJ5dGVzKVxuIiwgaWQsIHQsIHAsICh1bnNpZ25lZCBpbnQpbikpOworICAgIGlwLT50eXBlID0gdDsKKyAgICBpcC0+c2l6ZSA9IG47IAorICAgIGlwLT5saW5rID0gcDsKKyAgICBpcC0+Y29weSA9IE5VTEw7CisgICAgaXAtPmZsaXN0ID0gTlVMTDsKKyAgICBpcC0+cHRyID0gTlVMTDsKKyAgICBpcC0+bGV2ZWwgPSBrOworICAgICpwID0gTlVMTDsKKyAgfQorICBlbHNlIGlmIChpcC0+cHRyKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x2ZWQgaHJlZj0nJXMnIHR5cGU9JWQgbG9jYXRpb249JXAgKCV1IGJ5dGVzKVxuIiwgaWQsIHQsIGlwLT5wdHIsICh1bnNpZ25lZCBpbnQpbikpOworICAgIGlmIChpcC0+dHlwZSAhPSB0KQorICAgIHsgc3RyY3B5KHNvYXAtPmlkLCBpZCk7CisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfSFJFRjsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVHlwZSBpbmNvbXBhdGliaWxpdHk6IGlkIHR5cGU9JWQgaHJlZiB0eXBlPSVkXG4iLCBpcC0+dHlwZSwgdCkpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHdoaWxlIChpcC0+bGV2ZWwgPCBrKQorICAgIHsgcSA9ICh2b2lkKiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHZvaWQqKSk7ICAKKyAgICAgIGlmICghcSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAqcCA9ICh2b2lkKilxOworICAgICAgcCA9IHE7CisgICAgICBrLS07CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlc2NlbmRpbmcgb25lIGxldmVsLi4uXG4iKSk7CisgICAgfQorICAgICpwID0gaXAtPnB0cjsKKyAgfQorICBlbHNlIGlmIChpcC0+bGV2ZWwgPiBrKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x2aW5nIGxldmVsICV1IHBvaW50ZXJzIHRvIGhyZWY9JyVzJ1xuIiwgaXAtPmxldmVsLCBpZCkpOworICAgIHdoaWxlIChpcC0+bGV2ZWwgPiBrKQorICAgIHsgdm9pZCAqcywgKipyID0gJmlwLT5saW5rOworICAgICAgcSA9ICh2b2lkKiopaXAtPmxpbms7CisgICAgICB3aGlsZSAocSkKKyAgICAgIHsgKnIgPSAodm9pZCopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHZvaWQqKSk7CisgICAgICAgIHMgPSAqcTsKKyAgICAgICAgKnEgPSAqcjsKKyAgICAgICAgciA9ICh2b2lkKiopKnI7CisgICAgICAgIHEgPSAodm9pZCoqKXM7CisgICAgICB9CisgICAgICAqciA9IE5VTEw7CisgICAgICBpcC0+c2l6ZSA9IG47IAorICAgICAgaXAtPmNvcHkgPSBOVUxMOworICAgICAgaXAtPmxldmVsID0gaXAtPmxldmVsIC0gMTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVzY2VuZGluZyBvbmUgbGV2ZWwuLi5cbiIpKTsKKyAgICB9CisgICAgcSA9ICh2b2lkKiopaXAtPmxpbms7CisgICAgaXAtPmxpbmsgPSBwOworICAgICpwID0gKHZvaWQqKXE7CisgIH0KKyAgZWxzZQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRm9yd2FyZGVkIGhyZWY9JyVzJyB0eXBlPSVkIGxvY2F0aW9uPSVwICgldSBieXRlcylcbiIsIGlkLCB0LCBwLCAodW5zaWduZWQgaW50KW4pKTsKKyAgICB3aGlsZSAoaXAtPmxldmVsIDwgaykKKyAgICB7IHEgPSAodm9pZCoqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZih2b2lkKikpOyAgCisgICAgICAqcCA9IHE7CisgICAgICBwID0gcTsKKyAgICAgIGstLTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRGVzY2VuZGluZyBvbmUgbGV2ZWwuLi5cbiIpKTsKKyAgICB9CisgICAgcSA9ICh2b2lkKiopaXAtPmxpbms7CisgICAgaXAtPmxpbmsgPSBwOworICAgICpwID0gKHZvaWQqKXE7CisgIH0KKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSURSRUYKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkKgorU09BUF9GTUFDMgorc29hcF9pZF9mb3J3YXJkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpocmVmLCB2b2lkICpwLCBzaXplX3QgbGVuLCBpbnQgc3QsIGludCB0dCwgc2l6ZV90IG4sIHVuc2lnbmVkIGludCBrLCB2b2lkICgqZmNvcHkpKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBzaXplX3QsIGNvbnN0IHZvaWQqLCBzaXplX3QpKQoreyBzdHJ1Y3Qgc29hcF9pbGlzdCAqaXA7CisgIGlmICghcCB8fCAhaHJlZiB8fCAhKmhyZWYpCisgICAgcmV0dXJuIHA7CisgIGlwID0gc29hcF9sb29rdXAoc29hcCwgaHJlZik7IC8qIGxvb2t1cCBwb2ludGVyIHRvIGhhc2ggdGFibGUgZW50cnkgZm9yIHN0cmluZyBpZCAqLworICBpZiAoIWlwKQorICB7IGlwID0gc29hcF9lbnRlcihzb2FwLCBocmVmKTsgLyogbmV3IGhhc2ggdGFibGUgZW50cnkgZm9yIHN0cmluZyBpZCAqLworICAgIGlwLT50eXBlID0gc3Q7CisgICAgaXAtPnNpemUgPSBuOworICAgIGlwLT5saW5rID0gTlVMTDsKKyAgICBpcC0+Y29weSA9IE5VTEw7CisgICAgaXAtPnB0ciA9IE5VTEw7CisgICAgaXAtPmxldmVsID0gMDsKKyAgICBpcC0+Zmxpc3QgPSBOVUxMOworICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJOZXcgZW50cnkgaHJlZj0nJXMnIHR5cGU9JWQgc2l6ZT0lbHUgbGV2ZWw9JWQgbG9jYXRpb249JXBcbiIsIGhyZWYsIHN0LCAodW5zaWduZWQgbG9uZyluLCBrLCBwKSk7CisgIH0KKyAgZWxzZSBpZiAoaXAtPnR5cGUgIT0gc3QgfHwgKGlwLT5sZXZlbCA9PSBrICYmIGlwLT5zaXplICE9IG4pKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiVHlwZSBpbmNvbXBhdGliaWxpdHkgaWQ9JyVzJyBleHBlY3QgdHlwZT0lZCBzaXplPSVsdSBsZXZlbD0ldSBnb3QgdHlwZT0lZCBzaXplPSVsdVxuIiwgaHJlZiwgaXAtPnR5cGUsICh1bnNpZ25lZCBsb25nKWlwLT5zaXplLCBrLCBzdCwgKHVuc2lnbmVkIGxvbmcpbikpOworICAgIHN0cmNweShzb2FwLT5pZCwgaHJlZik7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0hSRUY7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKGZjb3B5IHx8IG4gPCBzaXplb2Yodm9pZCopIHx8ICpocmVmICE9ICcjJykKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9mbGlzdCAqZnAgPSAoc3RydWN0IHNvYXBfZmxpc3QqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9mbGlzdCkpOworICAgIGlmICghZnApCisgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZwLT5uZXh0ID0gaXAtPmZsaXN0OworICAgIGZwLT50eXBlID0gdHQ7CisgICAgZnAtPnB0ciA9IHA7CisgICAgZnAtPmxldmVsID0gazsKKyAgICBmcC0+bGVuID0gbGVuOworICAgIGlmIChmY29weSkKKyAgICAgIGZwLT5mY29weSA9IGZjb3B5OworICAgIGVsc2UKKyAgICAgIGZwLT5mY29weSA9IHNvYXBfZmNvcHk7CisgICAgaXAtPmZsaXN0ID0gZnA7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGb3J3YXJkaW5nIHR5cGU9JWQgKHRhcmdldCB0eXBlPSVkKSBzaXplPSVsdSBsb2NhdGlvbj0lcCBsZXZlbD0ldSBsZW49JWx1IGhyZWY9JyVzJ1xuIiwgc3QsIHR0LCAodW5zaWduZWQgbG9uZyluLCBwLCBrLCAodW5zaWduZWQgbG9uZylsZW4sIGhyZWYpKTsKKyAgfQorICBlbHNlCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGb3J3YXJkaW5nIGNvcHlpbmcgYWRkcmVzcyAlcCBmb3IgdHlwZT0lZCBocmVmPSclcydcbiIsIHAsIHN0LCBocmVmKSk7CisgICAgKih2b2lkKiopcCA9IGlwLT5jb3B5OworICAgIGlwLT5jb3B5ID0gcDsKKyAgfQorICByZXR1cm4gcDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZCoKK1NPQVBfRk1BQzIKK3NvYXBfaWRfZW50ZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkLCB2b2lkICpwLCBpbnQgdCwgc2l6ZV90IG4sIHVuc2lnbmVkIGludCBrLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICphcnJheVR5cGUsIHZvaWQgKigqZmluc3RhbnRpYXRlKShzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKSkKK3sKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgIHN0cnVjdCBzb2FwX2lsaXN0ICppcDsKKyNlbmRpZgorICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW50ZXIgaWQ9JyVzJyB0eXBlPSVkIGxvYz0lcCBzaXplPSVsdSBsZXZlbD0ldVxuIiwgaWQsIHQsIHAsICh1bnNpZ25lZCBsb25nKW4sIGspKTsKKyAgc29hcC0+YWxsb2NlZCA9IDA7CisgIGlmICghcCkKKyAgeyBpZiAoZmluc3RhbnRpYXRlKQorICAgICAgcCA9IGZpbnN0YW50aWF0ZShzb2FwLCB0LCB0eXBlLCBhcnJheVR5cGUsICZuKTsKKyAgICBlbHNlCisgICAgICBwID0gc29hcF9tYWxsb2Moc29hcCwgbik7CisgICAgaWYgKHApCisgICAgICBzb2FwLT5hbGxvY2VkID0gMTsKKyAgfQorI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgaWYgKCFpZCB8fCAhKmlkKQorI2VuZGlmCisgICAgcmV0dXJuIHA7CisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICBpcCA9IHNvYXBfbG9va3VwKHNvYXAsIGlkKTsgLyogbG9va3VwIHBvaW50ZXIgdG8gaGFzaCB0YWJsZSBlbnRyeSBmb3Igc3RyaW5nIGlkICovCisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJMb29rdXAgZW50cnkgaWQ9JyVzIGZvciBsb2NhdGlvbj0lcCdcbiIsIGlkLCBwKSk7CisgIGlmICghaXApCisgIHsgaXAgPSBzb2FwX2VudGVyKHNvYXAsIGlkKTsgLyogbmV3IGhhc2ggdGFibGUgZW50cnkgZm9yIHN0cmluZyBpZCAqLworICAgIGlwLT50eXBlID0gdDsKKyAgICBpcC0+bGluayA9IE5VTEw7CisgICAgaXAtPmNvcHkgPSBOVUxMOworICAgIGlwLT5mbGlzdCA9IE5VTEw7CisgICAgaXAtPnNpemUgPSBuOworICAgIGlwLT5wdHIgPSBwOworICAgIGlwLT5sZXZlbCA9IGs7CisgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIk5ldyBlbnRyeSBpZD0nJXMnIHR5cGU9JWQgc2l6ZT0lbHUgbGV2ZWw9JXUgbG9jYXRpb249JXBcbiIsIGlkLCB0LCAodW5zaWduZWQgbG9uZyluLCBrLCBwKSk7CisgIH0KKyAgZWxzZSBpZiAoKGlwLT50eXBlICE9IHQgfHwgKGlwLT5sZXZlbCA9PSBrICYmIGlwLT5zaXplICE9IG4pKSAmJiAoaXAtPmNvcHkgfHwgaXAtPmZsaXN0KSkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlR5cGUgaW5jb21wYXRpYmlsaXR5IGlkPSclcycgZXhwZWN0IHR5cGU9JWQgc2l6ZT0lbHUgbGV2ZWw9JXUgZ290IHR5cGU9JWQgc2l6ZT0lbHVcbiIsIGlkLCBpcC0+dHlwZSwgKHVuc2lnbmVkIGxvbmcpaXAtPnNpemUsIGssIHQsICh1bnNpZ25lZCBsb25nKW4pKTsKKyAgICBzdHJjcHkoc29hcC0+aWQsIGlkKTsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfSFJFRjsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBlbHNlIGlmIChpcC0+cHRyKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTXVsdGlwbHkgZGVmaW5lZCBpZD0nJXMnXG4iLCBpZCkpOworICAgIHN0cmNweShzb2FwLT5pZCwgaWQpOworICAgIHNvYXAtPmVycm9yID0gU09BUF9EVVBMSUNBVEVfSUQ7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZWxzZSAKKyAgeyBpcC0+c2l6ZSA9IG47CisgICAgaXAtPnB0ciA9IHA7CisgICAgaXAtPmxldmVsID0gazsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVwZGF0ZSBlbnRyeSBpZD0nJXMnIHR5cGU9JWQgbG9jYXRpb249JXAgc2l6ZT0lbHUgbGV2ZWw9JXVcbiIsIGlkLCB0LCBwLCAodW5zaWduZWQgbG9uZyluLCBrKSk7CisgIH0KKyAgcmV0dXJuIGlwLT5wdHI7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZmNvcHkoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdCwgaW50IHR0LCB2b2lkICpwLCBzaXplX3QgbGVuLCBjb25zdCB2b2lkICpxLCBzaXplX3QgbikKK3sgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvcHlpbmcgZGF0YSB0eXBlPSVkICh0YXJnZXQgdHlwZT0lZCkgJXAgLT4gJXAgKCVsdSBieXRlcylcbiIsIHN0LCB0dCwgcSwgcCwgKHVuc2lnbmVkIGxvbmcpbikpOworICBtZW1jcHkocCwgcSwgbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW5kX3NlbmQoc3RydWN0IHNvYXAgKnNvYXApCit7IAorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+ZGltZS5saXN0KQorICB7IC8qIFNPQVAgYm9keSByZWZlcmVuY2VkIGF0dGFjaG1lbnRzIG11c3QgYXBwZWFyIGZpcnN0ICovCisgICAgc29hcC0+ZGltZS5sYXN0LT5uZXh0ID0gc29hcC0+ZGltZS5maXJzdDsKKyAgICBzb2FwLT5kaW1lLmZpcnN0ID0gc29hcC0+ZGltZS5saXN0LT5uZXh0OworICAgIHNvYXAtPmRpbWUubGlzdC0+bmV4dCA9IE5VTEw7CisgICAgc29hcC0+ZGltZS5sYXN0ID0gc29hcC0+ZGltZS5saXN0OworICB9CisgIGlmIChzb2FwX3B1dGRpbWUoc29hcCkgfHwgc29hcF9wdXRtaW1lKHNvYXApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgc29hcC0+bWltZS5saXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGlzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmxhc3QgPSBOVUxMOworI2VuZGlmCisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIHNlbmRcbiIpKTsKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSAvKiBuZWVkIHRvIGZsdXNoIHRoZSByZW1haW5pbmcgZGF0YSBpbiBidWZmZXIgKi8KKyAgeyBpZiAoc29hcF9mbHVzaChzb2FwKSkKKyNpZmRlZiBXSVRIX1pMSUIKKyAgICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfWkxJQiAmJiBzb2FwLT56bGliX3N0YXRlID09IFNPQVBfWkxJQl9ERUZMQVRFKQorICAgICAgeyBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX05PTkU7CisgICAgICAgIGRlZmxhdGVFbmQoJnNvYXAtPmRfc3RyZWFtKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisjZWxzZQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2VuZGlmCisjaWZkZWYgV0lUSF9aTElCCisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKQorICAgIHsgaW50IHI7CisgICAgICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9pbiA9IDA7CisgICAgICBkbworICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlZmxhdGluZyByZW1haW5kZXJcbiIpKTsKKyAgICAgICAgciA9IGRlZmxhdGUoJnNvYXAtPmRfc3RyZWFtLCBaX0ZJTklTSCk7CisgICAgICAgIGlmIChzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgIT0gU09BUF9CVUZMRU4pCisgICAgICAgIHsgaWYgKHNvYXBfZmx1c2hfcmF3KHNvYXAsIHNvYXAtPnpfYnVmLCBTT0FQX0JVRkxFTiAtIHNvYXAtPmRfc3RyZWFtLmF2YWlsX291dCkpCisgICAgICAgICAgeyBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX05PTkU7CisgICAgICAgICAgICBkZWZsYXRlRW5kKCZzb2FwLT5kX3N0cmVhbSk7CisgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisJICB9CisgICAgICAgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZSopc29hcC0+el9idWY7CisgICAgICAgICAgc29hcC0+ZF9zdHJlYW0uYXZhaWxfb3V0ID0gU09BUF9CVUZMRU47CisgICAgICAgIH0KKyAgICAgIH0gd2hpbGUgKHIgPT0gWl9PSyk7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRlZmxhdGVkICVsdS0+JWx1IGJ5dGVzXG4iLCBzb2FwLT5kX3N0cmVhbS50b3RhbF9pbiwgc29hcC0+ZF9zdHJlYW0udG90YWxfb3V0KSk7CisgICAgICBzb2FwLT56X3JhdGlvX291dCA9IChmbG9hdClzb2FwLT5kX3N0cmVhbS50b3RhbF9vdXQgLyAoZmxvYXQpc29hcC0+ZF9zdHJlYW0udG90YWxfaW47CisgICAgICBzb2FwLT5tb2RlICY9IH5TT0FQX0VOQ19aTElCOworICAgICAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9OT05FOworICAgICAgaWYgKGRlZmxhdGVFbmQoJnNvYXAtPmRfc3RyZWFtKSAhPSBaX09LIHx8IHIgIT0gWl9TVFJFQU1fRU5EKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlVuYWJsZSB0byBlbmQgZGVmbGF0ZTogJXNcbiIsIHNvYXAtPmRfc3RyZWFtLm1zZz9zb2FwLT5kX3N0cmVhbS5tc2c6IiIpKTsKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgfQorI2lmZGVmIFdJVEhfR1pJUAorICAgICAgc29hcC0+el9idWZbMF0gPSBzb2FwLT56X2NyYyAmIDB4RkY7CisgICAgICBzb2FwLT56X2J1ZlsxXSA9IChzb2FwLT56X2NyYyA+PiA4KSAmIDB4RkY7CisgICAgICBzb2FwLT56X2J1ZlsyXSA9IChzb2FwLT56X2NyYyA+PiAxNikgJiAweEZGOworICAgICAgc29hcC0+el9idWZbM10gPSAoc29hcC0+el9jcmMgPj4gMjQpICYgMHhGRjsKKyAgICAgIHNvYXAtPnpfYnVmWzRdID0gc29hcC0+ZF9zdHJlYW0udG90YWxfaW4gJiAweEZGOworICAgICAgc29hcC0+el9idWZbNV0gPSAoc29hcC0+ZF9zdHJlYW0udG90YWxfaW4gPj4gOCkgJiAweEZGOworICAgICAgc29hcC0+el9idWZbNl0gPSAoc29hcC0+ZF9zdHJlYW0udG90YWxfaW4gPj4gMTYpICYgMHhGRjsKKyAgICAgIHNvYXAtPnpfYnVmWzddID0gKHNvYXAtPmRfc3RyZWFtLnRvdGFsX2luID4+IDI0KSAmIDB4RkY7CisgICAgICBpZiAoc29hcF9mbHVzaF9yYXcoc29hcCwgc29hcC0+el9idWYsIDgpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImd6aXAgY3JjMzI9JWx1XG4iLCAodW5zaWduZWQgbG9uZylzb2FwLT56X2NyYykpOworI2VuZGlmCisgICAgfQorI2VuZGlmCisgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19TVE9SRSkKKyAgICB7IGNoYXIgKnA7CisjaWZuZGVmIFdJVEhfTk9IVFRQCisgICAgICBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9FTkNfWE1MKSkKKyAgICAgIHsgc29hcC0+bW9kZS0tOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNlbmRpbmcgYnVmZmVyZWQgbWVzc2FnZSBvZiBsZW5ndGggJXVcbiIsICh1bnNpZ25lZCBpbnQpc29hcC0+Ymxpc3QtPnNpemUpKTsKKyAgICAgICAgaWYgKHNvYXAtPnN0YXR1cyA+PSBTT0FQX1BPU1QpCisgICAgICAgICAgc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdChzb2FwLCBzb2FwLT5lbmRwb2ludCwgc29hcC0+aG9zdCwgc29hcC0+cG9ydCwgc29hcC0+cGF0aCwgc29hcC0+YWN0aW9uLCBzb2FwLT5ibGlzdC0+c2l6ZSk7CisgICAgICAgIGVsc2UgaWYgKHNvYXAtPnN0YXR1cyAhPSBTT0FQX1NUT1ApCisgICAgICAgICAgc29hcC0+ZXJyb3IgPSBzb2FwLT5mcmVzcG9uc2Uoc29hcCwgc29hcC0+c3RhdHVzLCBzb2FwLT5ibGlzdC0+c2l6ZSk7CisgICAgICAgIGlmIChzb2FwLT5lcnJvciB8fCBzb2FwX2ZsdXNoKHNvYXApKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgc29hcC0+bW9kZSsrOworICAgICAgfQorI2VuZGlmCisgICAgICBmb3IgKHAgPSBzb2FwX2ZpcnN0X2Jsb2NrKHNvYXApOyBwOyBwID0gc29hcF9uZXh0X2Jsb2NrKHNvYXApKQorICAgICAgeyBEQkdNU0coU0VOVCwgcCwgc29hcF9ibG9ja19zaXplKHNvYXApKTsKKyAgICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZzZW5kKHNvYXAsIHAsIHNvYXBfYmxvY2tfc2l6ZShzb2FwKSkpKQorICAgICAgICB7IHNvYXBfZW5kX2Jsb2NrKHNvYXApOworICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc29hcF9lbmRfYmxvY2soc29hcCk7CisgICAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICAgIGVsc2UgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgICB7IERCR01TRyhTRU5ULCAiXHJcbjBcclxuXHJcbiIsIDcpOworICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZzZW5kKHNvYXAsICJcclxuMFxyXG5cclxuIiwgNykpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorI2VuZGlmCisgIH0KKyNpZmRlZiBXSVRIX1RDUEZJTgorI2lmZGVmIFdJVEhfT1BFTlNTTAorICBpZiAoIXNvYXAtPnNzbCAmJiBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpICYmICFzb2FwLT5rZWVwX2FsaXZlICYmICEoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgc29hcC0+ZnNodXRkb3duc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIDEpOyAvKiBTZW5kIFRDUCBGSU4gKi8KKyNlbHNlCisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpICYmICFzb2FwLT5rZWVwX2FsaXZlICYmICEoc29hcC0+b21vZGUgJiBTT0FQX0lPX1VEUCkpCisgICAgc29hcC0+ZnNodXRkb3duc29ja2V0KHNvYXAsIChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsIDEpOyAvKiBTZW5kIFRDUCBGSU4gKi8KKyNlbmRpZgorI2VuZGlmCisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIG9mIHNlbmQgcGhhc2VcbiIpKTsKKyAgc29hcC0+b21vZGUgJj0gflNPQVBfWE1MX1NFQzsKKyAgc29hcC0+Y291bnQgPSAwOworICBzb2FwLT5wYXJ0ID0gU09BUF9FTkQ7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VuZF9yZWN2KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5wYXJ0ID0gU09BUF9FTkQ7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpICYmIHNvYXBfZ2V0ZGltZShzb2FwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHNvYXAtPmRpbWUubGlzdCA9IHNvYXAtPmRpbWUuZmlyc3Q7CisgIHNvYXAtPmRpbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmxhc3QgPSBOVUxMOworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKSAmJiBzb2FwX2dldG1pbWUoc29hcCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBzb2FwLT5taW1lLmxpc3QgPSBzb2FwLT5taW1lLmZpcnN0OworICBzb2FwLT5taW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5sYXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5ib3VuZGFyeSA9IE5VTEw7CisjZW5kaWYKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVuZCBvZiByZWNlaXZlIG1lc3NhZ2Ugb2tcbiIpKTsKKyNpZmRlZiBXSVRIX1pMSUIKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19aTElCKQorICB7IHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX1pMSUI7CisgICAgbWVtY3B5KHNvYXAtPmJ1Ziwgc29hcC0+el9idWYsIFNPQVBfQlVGTEVOKTsKKyAgICBzb2FwLT5idWZpZHggPSAoY2hhciopc29hcC0+ZF9zdHJlYW0ubmV4dF9pbiAtIHNvYXAtPnpfYnVmOworICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPnpfYnVmbGVuOworICAgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfTk9ORTsKKyAgICBpZiAoaW5mbGF0ZUVuZCgmc29hcC0+ZF9zdHJlYW0pICE9IFpfT0spCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisjaWZkZWYgV0lUSF9HWklQCisgICAgaWYgKHNvYXAtPnpsaWJfaW4gPT0gU09BUF9aTElCX0daSVApCisgICAgeyBzb2FwX3djaGFyIGM7CisgICAgICBzaG9ydCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgIHsgaWYgKChpbnQpKGMgPSBzb2FwX2dldGNoYXIoc29hcCkpID09IEVPRikKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAgICAgc29hcC0+el9idWZbaV0gPSAoY2hhciljOworICAgICAgfQorICAgICAgaWYgKHNvYXAtPnpfY3JjICE9ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbMF0gfCAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzFdIDw8IDgpIHwgKCh1TG9uZykodW5zaWduZWQgY2hhcilzb2FwLT56X2J1ZlsyXSA8PCAxNikgfCAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzNdIDw8IDI0KSkpCisgICAgICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJHemlwIGVycm9yOiBjcmMgY2hlY2sgZmFpbGVkLCBtZXNzYWdlIGNvcnJ1cHRlZD8gKGNyYzMyPSVsdSlcbiIsICh1bnNpZ25lZCBsb25nKXNvYXAtPnpfY3JjKSk7CisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfWkxJQl9FUlJPUjsKKyAgICAgIH0KKyAgICAgIGlmIChzb2FwLT5kX3N0cmVhbS50b3RhbF9vdXQgIT0gKCh1TG9uZykodW5zaWduZWQgY2hhcilzb2FwLT56X2J1Zls0XSB8ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbNV0gPDwgOCkgfCAoKHVMb25nKSh1bnNpZ25lZCBjaGFyKXNvYXAtPnpfYnVmWzZdIDw8IDE2KSB8ICgodUxvbmcpKHVuc2lnbmVkIGNoYXIpc29hcC0+el9idWZbN10gPDwgMjQpKSkKKyAgICAgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkd6aXAgZXJyb3I6IGluY29ycmVjdCBtZXNzYWdlIGxlbmd0aFxuIikpOworICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgICB9CisgICAgfQorI2VuZGlmCisgIH0KKyNlbmRpZgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKQorICAgIHdoaWxlICgoaW50KXNvYXBfZ2V0Y2hhcihzb2FwKSAhPSBFT0YpIC8qIGFkdmFuY2UgdG8gbGFzdCBjaHVuayAqLworICAgICAgOworICBpZiAoc29hcC0+ZmRpc2Nvbm5lY3QgJiYgKHNvYXAtPmVycm9yID0gc29hcC0+ZmRpc2Nvbm5lY3Qoc29hcCkpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZm5kZWYgV0lUSF9OT0lEUkVGCisgIHJldHVybiBzb2FwX3Jlc29sdmUoc29hcCk7CisjZWxzZQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+eGxpc3QpCisgIHsgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9NSU1FX0hSRUY7CisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9ESU1FX0hSRUY7CisgIH0KKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9mcmVlKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzdHJ1Y3QgTmFtZXNwYWNlICpuczsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIG5hbWVzcGFjZSBzdGFja1xuIikpOworICB3aGlsZSAoc29hcC0+bmxpc3QpCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wID0gc29hcC0+bmxpc3QtPm5leHQ7CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPm5saXN0KTsKKyAgICBzb2FwLT5ubGlzdCA9IG5wOworICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZSBhbnkgcmVtYWluaW5nIHRlbXAgYmxvY2tzXG4iKSk7CisgIHdoaWxlIChzb2FwLT5ibGlzdCkKKyAgICBzb2FwX2VuZF9ibG9jayhzb2FwKTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJGcmVlIGF0dHJpYnV0ZSBzdG9yYWdlXG4iKSk7CisgIHdoaWxlIChzb2FwLT5hdHRyaWJ1dGVzKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqdHAgPSBzb2FwLT5hdHRyaWJ1dGVzLT5uZXh0OworICAgIGlmIChzb2FwLT5hdHRyaWJ1dGVzLT52YWx1ZSkKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5hdHRyaWJ1dGVzLT52YWx1ZSk7CisgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPmF0dHJpYnV0ZXMpOworICAgIHNvYXAtPmF0dHJpYnV0ZXMgPSB0cDsKKyAgfQorI2lmZGVmIFdJVEhfRkFTVAorICBpZiAoc29hcC0+bGFiYnVmKQorICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5sYWJidWYpOworICBzb2FwLT5sYWJidWYgPSBOVUxMOworICBzb2FwLT5sYWJsZW4gPSAwOworICBzb2FwLT5sYWJpZHggPSAwOworI2VuZGlmCisgIG5zID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlczsKKyAgaWYgKG5zKQorICB7IGZvciAoOyBucy0+aWQ7IG5zKyspCisgICAgeyBpZiAobnMtPm91dCkKKyAgICAgIHsgaWYgKHNvYXAtPmVuY29kaW5nU3R5bGUgPT0gbnMtPm91dCkKKyAgICAgICAgICBzb2FwLT5lbmNvZGluZ1N0eWxlID0gU09BUF9TVFJfRU9TOworICAgICAgICBTT0FQX0ZSRUUoc29hcCwgbnMtPm91dCk7CisgICAgICAgIG5zLT5vdXQgPSBOVUxMOworICAgICAgfQorICAgICAgaWYgKHNvYXAtPmVuY29kaW5nU3R5bGUgPT0gbnMtPm5zKQorICAgICAgICBzb2FwLT5lbmNvZGluZ1N0eWxlID0gU09BUF9TVFJfRU9TOworICAgIH0KKyAgICBTT0FQX0ZSRUUoc29hcCwgc29hcC0+bG9jYWxfbmFtZXNwYWNlcyk7CisgICAgc29hcC0+bG9jYWxfbmFtZXNwYWNlcyA9IE5VTEw7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgd2hpbGUgKHNvYXAtPnhsaXN0KQorICB7IHN0cnVjdCBzb2FwX3hsaXN0ICp4cCA9IHNvYXAtPnhsaXN0LT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT54bGlzdCk7CisgICAgc29hcC0+eGxpc3QgPSB4cDsKKyAgfQorI2VuZGlmCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICBzb2FwX2ZyZWVfcGh0KHNvYXApOworICBzb2FwX2ZyZWVfaWh0KHNvYXApOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitzdGF0aWMgdm9pZAorc29hcF9pbml0X2xvZ3Moc3RydWN0IHNvYXAgKnNvYXApCit7IGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgU09BUF9NQVhMT0dTOyBpKyspCisgIHsgc29hcC0+bG9nZmlsZVtpXSA9IE5VTEw7CisgICAgc29hcC0+ZmRlYnVnW2ldID0gTlVMTDsKKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgIWRlZmluZWQoV0lUSF9MRUFOKSB8fCBkZWZpbmVkKFNPQVBfREVCVUcpCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX29wZW5fbG9nZmlsZShzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGkpCit7IGlmIChzb2FwLT5sb2dmaWxlW2ldKQorICAgIHNvYXAtPmZkZWJ1Z1tpXSA9IGZvcGVuKHNvYXAtPmxvZ2ZpbGVbaV0sIGkgPCAyID8gImFiIiA6ICJhIik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitzdGF0aWMgdm9pZAorc29hcF9jbG9zZV9sb2dmaWxlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgaSkKK3sgaWYgKHNvYXAtPmZkZWJ1Z1tpXSkKKyAgeyBmY2xvc2Uoc29hcC0+ZmRlYnVnW2ldKTsKKyAgICBzb2FwLT5mZGVidWdbaV0gPSBOVUxMOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2Nsb3NlX2xvZ2ZpbGVzKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IFNPQVBfTUFYTE9HUzsgaSsrKQorICAgIHNvYXBfY2xvc2VfbG9nZmlsZShzb2FwLCBpKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK3N0YXRpYyB2b2lkCitzb2FwX3NldF9sb2dmaWxlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgaSwgY29uc3QgY2hhciAqbG9nZmlsZSkKK3sgY2hhciAqcyA9IE5VTEw7CisgIHNvYXBfY2xvc2VfbG9nZmlsZShzb2FwLCBpKTsKKyAgaWYgKHNvYXAtPmxvZ2ZpbGVbaV0pCisgICAgU09BUF9GUkVFKHNvYXAsICh2b2lkKilzb2FwLT5sb2dmaWxlW2ldKTsKKyAgaWYgKGxvZ2ZpbGUpCisgICAgaWYgKChzID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihsb2dmaWxlKSArIDEpKSkKKyAgICAgIHN0cmNweShzLCBsb2dmaWxlKTsKKyAgc29hcC0+bG9nZmlsZVtpXSA9IHM7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBTT0FQX0RFQlVHCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9yZWN2X2xvZ2ZpbGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmxvZ2ZpbGUpCit7IHNvYXBfc2V0X2xvZ2ZpbGUoc29hcCwgU09BUF9JTkRFWF9SRUNWLCBsb2dmaWxlKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNPQVBfREVCVUcKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X3NlbnRfbG9nZmlsZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbG9nZmlsZSkKK3sgc29hcF9zZXRfbG9nZmlsZShzb2FwLCBTT0FQX0lOREVYX1NFTlQsIGxvZ2ZpbGUpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgU09BUF9ERUJVRworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfdGVzdF9sb2dmaWxlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpsb2dmaWxlKQoreyBzb2FwX3NldF9sb2dmaWxlKHNvYXAsIFNPQVBfSU5ERVhfVEVTVCwgbG9nZmlsZSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcCoKK1NPQVBfRk1BQzIKK3NvYXBfY29weShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmV0dXJuIHNvYXBfY29weV9jb250ZXh0KChzdHJ1Y3Qgc29hcCopbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc29hcCkpLCBzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwKgorU09BUF9GTUFDMgorc29hcF9jb3B5X2NvbnRleHQoc3RydWN0IHNvYXAgKmNvcHksIHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcF9jaGVja19zdGF0ZShzb2FwKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKGNvcHkpCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGx1Z2luICpwOworICAgIG1lbWNweShjb3B5LCBzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXApKTsKKyAgICBjb3B5LT5zdGF0ZSA9IFNPQVBfQ09QWTsKKyAgICBjb3B5LT51c2VyID0gTlVMTDsKKyAgICBjb3B5LT5lcnJvciA9IFNPQVBfT0s7CisgICAgY29weS0+dXNlcmlkID0gTlVMTDsKKyAgICBjb3B5LT5wYXNzd2QgPSBOVUxMOworICAgIGNvcHktPm5saXN0ID0gTlVMTDsKKyAgICBjb3B5LT5ibGlzdCA9IE5VTEw7CisgICAgY29weS0+Y2xpc3QgPSBOVUxMOworICAgIGNvcHktPmFsaXN0ID0gTlVMTDsKKyAgICBjb3B5LT5hdHRyaWJ1dGVzID0gTlVMTDsKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgICBjb3B5LT5sYWJidWYgPSBOVUxMOworICAgIGNvcHktPmxhYmxlbiA9IDA7CisgICAgY29weS0+bGFiaWR4ID0gMDsKKyNlbmRpZgorI2lmZGVmIFNPQVBfREVCVUcKKyAgICBzb2FwX2luaXRfbWh0KGNvcHkpOworI2VuZGlmCisgICAgY29weS0+bG9jYWxfbmFtZXNwYWNlcyA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICAgIHNvYXBfaW5pdF9paHQoY29weSk7CisgICAgc29hcF9pbml0X3BodChjb3B5KTsKKyNlbmRpZgorICAgIGNvcHktPmhlYWRlciA9IE5VTEw7CisgICAgY29weS0+ZmF1bHQgPSBOVUxMOworICAgIGNvcHktPmFjdGlvbiA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorI2lmZGVmIFdJVEhfQ09PS0lFUworICAgIGNvcHktPmNvb2tpZXMgPSBzb2FwX2NvcHlfY29va2llcyhjb3B5KTsKKyNlbHNlCisgICAgY29weS0+Y29va2llcyA9IE5VTEw7CisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIFNPQVBfREVCVUcKKyAgICBzb2FwX2luaXRfbG9ncyhjb3B5KTsKKyAgICBzb2FwX3NldF9yZWN2X2xvZ2ZpbGUoY29weSwgc29hcC0+bG9nZmlsZVtTT0FQX0lOREVYX1JFQ1ZdKTsKKyAgICBzb2FwX3NldF9zZW50X2xvZ2ZpbGUoY29weSwgc29hcC0+bG9nZmlsZVtTT0FQX0lOREVYX1NFTlRdKTsKKyAgICBzb2FwX3NldF90ZXN0X2xvZ2ZpbGUoY29weSwgc29hcC0+bG9nZmlsZVtTT0FQX0lOREVYX1RFU1RdKTsKKyNlbmRpZgorICAgIGNvcHktPnBsdWdpbnMgPSBOVUxMOworICAgIGZvciAocCA9IHNvYXAtPnBsdWdpbnM7IHA7IHAgPSBwLT5uZXh0KQorICAgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGx1Z2luICpxID0gKHN0cnVjdCBzb2FwX3BsdWdpbiopU09BUF9NQUxMT0MoY29weSwgc2l6ZW9mKHN0cnVjdCBzb2FwX3BsdWdpbikpOworICAgICAgaWYgKCFxKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29weWluZyBwbHVnaW4gJyVzJ1xuIiwgcC0+aWQpKTsKKyAgICAgICpxID0gKnA7CisgICAgICBpZiAocC0+ZmNvcHkgJiYgKHNvYXAtPmVycm9yID0gcC0+ZmNvcHkoY29weSwgcSwgcCkpKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvdWxkIG5vdCBjb3B5IHBsdWdpbiAnJXMnXG4iLCBwLT5pZCkpOworICAgICAgICBTT0FQX0ZSRUUoY29weSwgcSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgcS0+bmV4dCA9IGNvcHktPnBsdWdpbnM7CisgICAgICBjb3B5LT5wbHVnaW5zID0gcTsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgIHJldHVybiBjb3B5OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9pbml0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5zdGF0ZSA9IFNPQVBfSU5JVDsKKyAgc29hcC0+dmVyc2lvbiA9IDA7CisgIHNvYXBfaW1vZGUoc29hcCwgU09BUF9JT19ERUZBVUxUKTsKKyAgc29hcF9vbW9kZShzb2FwLCBTT0FQX0lPX0RFRkFVTFQpOworICBzb2FwLT5wbHVnaW5zID0gTlVMTDsKKyAgc29hcC0+dXNlciA9IE5VTEw7CisgIHNvYXAtPnVzZXJpZCA9IE5VTEw7CisgIHNvYXAtPnBhc3N3ZCA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTk9IVFRQCisgIHNvYXAtPmZwb3N0ID0gaHR0cF9wb3N0OworICBzb2FwLT5mZ2V0ID0gaHR0cF9nZXQ7CisgIHNvYXAtPmZmb3JtID0gTlVMTDsKKyAgc29hcC0+ZnBvc3RoZHIgPSBodHRwX3Bvc3RfaGVhZGVyOworICBzb2FwLT5mcmVzcG9uc2UgPSBodHRwX3Jlc3BvbnNlOworICBzb2FwLT5mcGFyc2UgPSBodHRwX3BhcnNlOworICBzb2FwLT5mcGFyc2VoZHIgPSBodHRwX3BhcnNlX2hlYWRlcjsKKyNlbmRpZgorICBzb2FwLT5mY29ubmVjdCA9IE5VTEw7CisgIHNvYXAtPmZkaXNjb25uZWN0ID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfSVBWNgorICBzb2FwLT5mcmVzb2x2ZSA9IHRjcF9nZXRob3N0OworI2Vsc2UKKyAgc29hcC0+ZnJlc29sdmUgPSBOVUxMOworI2VuZGlmCisgIHNvYXAtPmZhY2NlcHQgPSB0Y3BfYWNjZXB0OworICBzb2FwLT5mb3BlbiA9IHRjcF9jb25uZWN0OworICBzb2FwLT5mY2xvc2UgPSB0Y3BfZGlzY29ubmVjdDsKKyAgc29hcC0+ZmNsb3Nlc29ja2V0ID0gdGNwX2Nsb3Nlc29ja2V0OworICBzb2FwLT5mc2h1dGRvd25zb2NrZXQgPSB0Y3Bfc2h1dGRvd25zb2NrZXQ7CisgIHNvYXAtPmZzZW5kID0gZnNlbmQ7CisgIHNvYXAtPmZyZWN2ID0gZnJlY3Y7CisgIHNvYXAtPmZwb2xsID0gc29hcF9wb2xsOworI2Vsc2UKKyAgc29hcC0+Zm9wZW4gPSBOVUxMOworICBzb2FwLT5mY2xvc2UgPSBOVUxMOworICBzb2FwLT5mcG9sbCA9IE5VTEw7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcC0+ZnByZXBhcmVpbml0ID0gTlVMTDsKKyAgc29hcC0+ZnByZXBhcmVzZW5kID0gTlVMTDsKKyAgc29hcC0+ZnByZXBhcmVyZWN2ID0gTlVMTDsKKyAgc29hcC0+ZnByZXBhcmVmaW5hbCA9IE5VTEw7CisjZW5kaWYKKyAgc29hcC0+ZnNldGVycm9yID0gTlVMTDsKKyAgc29hcC0+Zmlnbm9yZSA9IE5VTEw7CisgIHNvYXAtPmZzZXJ2ZWxvb3AgPSBOVUxMOworICBzb2FwLT5mcGx1Z2luID0gZnBsdWdpbjsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcC0+ZmRpbWVyZWFkb3BlbiA9IE5VTEw7CisgIHNvYXAtPmZkaW1ld3JpdGVvcGVuID0gTlVMTDsKKyAgc29hcC0+ZmRpbWVyZWFkY2xvc2UgPSBOVUxMOworICBzb2FwLT5mZGltZXdyaXRlY2xvc2UgPSBOVUxMOworICBzb2FwLT5mZGltZXJlYWQgPSBOVUxMOworICBzb2FwLT5mZGltZXdyaXRlID0gTlVMTDsKKyNlbmRpZgorICBzb2FwLT5mbG9hdF9mb3JtYXQgPSAiJS44ZyI7IC8qIC44IHByZXNlcnZlcyBzaW5nbGUgRlAgcHJlY2lzaW9uIGFzIG11Y2ggYXMgcG9zc2libGUsIGJ1dCBtaWdodCBub3QgYmUgdmVyeSBlZmZpY2llbnQgKi8KKyAgc29hcC0+ZG91YmxlX2Zvcm1hdCA9ICIlLjE3bGciOyAvKiAuMTcgcHJlc2VydmVzIGRvdWJsZSBGUCBwcmVjaXNpb24gYXMgbXVjaCBhcyBwb3NzaWJsZSwgYnV0IG1pZ2h0IG5vdCBiZSB2ZXJ5IGVmZmljaWVudCAqLworICBzb2FwLT5kaW1lX2lkX2Zvcm1hdCA9ICJjaWQ6aWQlZCI7IC8qIGRlZmF1bHQgRElNRSBpZCBmb3JtYXQgKi8KKyAgc29hcC0+aHR0cF92ZXJzaW9uID0gIjEuMSI7CisgIHNvYXAtPmFjdG9yID0gTlVMTDsKKyAgc29hcC0+bWF4X2tlZXBfYWxpdmUgPSBTT0FQX01BWEtFRVBBTElWRTsKKyAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7CisgIHNvYXAtPnJlY3ZfdGltZW91dCA9IDA7CisgIHNvYXAtPnNlbmRfdGltZW91dCA9IDA7CisgIHNvYXAtPmNvbm5lY3RfdGltZW91dCA9IDA7CisgIHNvYXAtPmFjY2VwdF90aW1lb3V0ID0gMDsKKyAgc29hcC0+c29ja2V0X2ZsYWdzID0gMDsKKyAgc29hcC0+Y29ubmVjdF9mbGFncyA9IDA7CisgIHNvYXAtPmJpbmRfZmxhZ3MgPSAwOworICBzb2FwLT5hY2NlcHRfZmxhZ3MgPSAwOworICBzb2FwLT5pcCA9IDA7CisjaWZkZWYgV0lUSF9GQVNUCisgIHNvYXAtPmxhYmJ1ZiA9IE5VTEw7CisgIHNvYXAtPmxhYmxlbiA9IDA7CisgIHNvYXAtPmxhYmlkeCA9IDA7CisjZW5kaWYKKyAgc29hcC0+ZW5jb2RpbmdTdHlsZSA9IFNPQVBfU1RSX0VPUzsKKyNpZm5kZWYgV0lUSF9OT05BTUVTUEFDRVMKKyAgc29hcC0+bmFtZXNwYWNlcyA9IG5hbWVzcGFjZXM7CisjZWxzZQorICBzb2FwLT5uYW1lc3BhY2VzID0gTlVMTDsKKyNlbmRpZgorICBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzID0gTlVMTDsKKyAgc29hcC0+bmxpc3QgPSBOVUxMOworICBzb2FwLT5ibGlzdCA9IE5VTEw7CisgIHNvYXAtPmNsaXN0ID0gTlVMTDsKKyAgc29hcC0+YWxpc3QgPSBOVUxMOworICBzb2FwLT5hdHRyaWJ1dGVzID0gTlVMTDsKKyAgc29hcC0+aGVhZGVyID0gTlVMTDsKKyAgc29hcC0+ZmF1bHQgPSBOVUxMOworICBzb2FwLT5tYXN0ZXIgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICBzb2FwLT5zb2NrZXQgPSBTT0FQX0lOVkFMSURfU09DS0VUOworICBzb2FwLT5vcyA9IE5VTEw7CisgIHNvYXAtPmlzID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgc29hcC0+ZG9tID0gTlVMTDsKKyAgc29hcC0+ZGltZS5saXN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGlzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmxhc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gTlVMTDsKKyAgc29hcC0+bWltZS5zdGFydCA9IE5VTEw7CisgIHNvYXAtPnhsaXN0ID0gTlVMTDsKKyNlbmRpZgorI2lmbmRlZiBVTkRFUl9DRQorICBzb2FwLT5yZWN2ZmQgPSAwOworICBzb2FwLT5zZW5kZmQgPSAxOworI2Vsc2UKKyAgc29hcC0+cmVjdmZkID0gc3RkaW47CisgIHNvYXAtPnNlbmRmZCA9IHN0ZG91dDsKKyNlbmRpZiAKKyAgc29hcC0+aG9zdFswXSA9ICdcMCc7CisgIHNvYXAtPnBvcnQgPSAwOworICBzb2FwLT5hY3Rpb24gPSBOVUxMOworICBzb2FwLT5wcm94eV9ob3N0ID0gTlVMTDsKKyAgc29hcC0+cHJveHlfcG9ydCA9IDgwODA7CisgIHNvYXAtPnByb3h5X3VzZXJpZCA9IE5VTEw7CisgIHNvYXAtPnByb3h5X3Bhc3N3ZCA9IE5VTEw7CisgIHNvYXAtPmF1dGhyZWFsbSA9IE5VTEw7CisgIHNvYXAtPnByb2xvZyA9IE5VTEw7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgIGlmICghc3NsX2luaXRfZG9uZSkKKyAgICBzb2FwX3NzbF9pbml0KCk7CisgIHNvYXAtPmZzc2xhdXRoID0gc3NsX2F1dGhfaW5pdDsKKyAgc29hcC0+ZnNzbHZlcmlmeSA9IHNzbF92ZXJpZnlfY2FsbGJhY2s7CisgIHNvYXAtPmJpbyA9IE5VTEw7CisgIHNvYXAtPnNzbCA9IE5VTEw7CisgIHNvYXAtPmN0eCA9IE5VTEw7CisgIHNvYXAtPnJlcXVpcmVfc2VydmVyX2F1dGggPSAwOworICBzb2FwLT5yZXF1aXJlX2NsaWVudF9hdXRoID0gMDsKKyAgc29hcC0+cnNhID0gMDsKKyAgc29hcC0+a2V5ZmlsZSA9IE5VTEw7CisgIHNvYXAtPnBhc3N3b3JkID0gTlVMTDsKKyAgc29hcC0+ZGhmaWxlID0gTlVMTDsKKyAgc29hcC0+Y2FmaWxlID0gTlVMTDsKKyAgc29hcC0+Y2FwYXRoID0gTlVMTDsKKyAgc29hcC0+Y3JsZmlsZSA9IE5VTEw7CisgIHNvYXAtPnJhbmRmaWxlID0gTlVMTDsKKyAgc29hcC0+c2Vzc2lvbiA9IE5VTEw7CisjZW5kaWYKKyNpZmRlZiBXSVRIX1pMSUIKKyAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9OT05FOworICBzb2FwLT56bGliX2luID0gU09BUF9aTElCX05PTkU7CisgIHNvYXAtPnpsaWJfb3V0ID0gU09BUF9aTElCX05PTkU7CisgIHNvYXAtPmRfc3RyZWFtLnphbGxvYyA9IE5VTEw7CisgIHNvYXAtPmRfc3RyZWFtLnpmcmVlID0gTlVMTDsKKyAgc29hcC0+ZF9zdHJlYW0ub3BhcXVlID0gTlVMTDsKKyAgc29hcC0+el9sZXZlbCA9IDY7CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIHNvYXAtPmMxNG5pbmNsdWRlID0gTlVMTDsKKyAgc29hcC0+YzE0bmV4Y2x1ZGUgPSBOVUxMOworICBzb2FwLT5jb29raWVzID0gTlVMTDsKKyAgc29hcC0+Y29va2llX2RvbWFpbiA9IE5VTEw7CisgIHNvYXAtPmNvb2tpZV9wYXRoID0gTlVMTDsKKyAgc29hcC0+Y29va2llX21heCA9IDMyOworI2VuZGlmCisjaWZkZWYgU09BUF9ERUJVRworICBzb2FwX2luaXRfbWh0KHNvYXApOworICBzb2FwX2luaXRfbG9ncyhzb2FwKTsKKyAgc29hcF9zZXRfcmVjdl9sb2dmaWxlKHNvYXAsICJSRUNWLmxvZyIpOworICBzb2FwX3NldF9zZW50X2xvZ2ZpbGUoc29hcCwgIlNFTlQubG9nIik7CisgIHNvYXBfc2V0X3Rlc3RfbG9nZmlsZShzb2FwLCBOVUxMKTsKKyNlbmRpZgorI2lmZGVmIFdNV19SUE1fSU8KKyAgc29hcC0+cnBtcmVxaWQgPSBOVUxMOworI2VuZGlmCisjaWZkZWYgUEFMTQorICBwYWxtTmV0TGliT3BlbigpOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICBzb2FwX2luaXRfaWh0KHNvYXApOworICBzb2FwX2luaXRfcGh0KHNvYXApOworI2VuZGlmCisgIHNvYXBfYmVnaW4oc29hcCk7CisjaWZkZWYgU09BUF9ERUJVRworICBzb2FwX3NldF90ZXN0X2xvZ2ZpbGUoc29hcCwgIlRFU1QubG9nIik7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfaW5pdDEoc3RydWN0IHNvYXAgKnNvYXAsIHNvYXBfbW9kZSBtb2RlKQoreyBzb2FwX2luaXQyKHNvYXAsIG1vZGUsIG1vZGUpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9pbml0MihzdHJ1Y3Qgc29hcCAqc29hcCwgc29hcF9tb2RlIGltb2RlLCBzb2FwX21vZGUgb21vZGUpCit7IHNvYXBfaW5pdChzb2FwKTsKKyAgc29hcF9pbW9kZShzb2FwLCBpbW9kZSk7CisgIHNvYXBfb21vZGUoc29hcCwgb21vZGUpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9iZWdpbihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJJbml0aWFsaXppbmdcbiIpKTsKKyAgaWYgKCFzb2FwLT5rZWVwX2FsaXZlKQorICB7IHNvYXAtPmJ1ZmxlbiA9IDA7CisgICAgc29hcC0+YnVmaWR4ID0gMDsKKyAgfQorICBzb2FwLT5rZWVwX2FsaXZlID0gKCgoc29hcC0+aW1vZGUgfCBzb2FwLT5vbW9kZSkgJiBTT0FQX0lPX0tFRVBBTElWRSkgIT0gMCk7CisgIHNvYXAtPm51bGwgPSAwOworICBzb2FwLT5wb3NpdGlvbiA9IDA7CisgIHNvYXAtPmVuY29kaW5nID0gMDsKKyAgc29hcC0+bXVzdFVuZGVyc3RhbmQgPSAwOworICBzb2FwLT5tb2RlID0gMDsKKyAgc29hcC0+bnMgPSAwOworICBzb2FwLT5wYXJ0ID0gU09BUF9FTkQ7CisgIHNvYXAtPmFsbG9jZWQgPSAwOworICBzb2FwLT5jb3VudCA9IDA7CisgIHNvYXAtPmxlbmd0aCA9IDA7CisgIHNvYXAtPmNkYXRhID0gMDsKKyAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICBzb2FwLT5wZWVrZWQgPSAwOworICBzb2FwLT5haGVhZCA9IDA7CisgIHNvYXAtPmlkbnVtID0gMDsKKyAgc29hcC0+bGV2ZWwgPSAwOworICBzb2FwLT5lbmRwb2ludFswXSA9ICdcMCc7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXAtPmRpbWUuY2h1bmtzaXplID0gMDsKKyAgc29hcC0+ZGltZS5idWZsZW4gPSAwOworI2VuZGlmCisgIHNvYXBfZnJlZShzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZW5kKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9jbGlzdCAqY3A7CisgIGlmIChzb2FwX2NoZWNrX3N0YXRlKHNvYXApKQorICAgIHJldHVybjsKKyAgc29hcF9mcmVlKHNvYXApOworICBzb2FwX2RlYWxsb2Moc29hcCwgTlVMTCk7CisgIHdoaWxlIChzb2FwLT5jbGlzdCkKKyAgeyBjcCA9IHNvYXAtPmNsaXN0LT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5jbGlzdCk7CisgICAgc29hcC0+Y2xpc3QgPSBjcDsKKyAgfQorICBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKKyNpZmRlZiBTT0FQX0RFQlVHCisgIHNvYXBfY2xvc2VfbG9nZmlsZXMoc29hcCk7CisjZW5kaWYKKyNpZmRlZiBQQUxNCisgIHBhbG1OZXRMaWJDbG9zZSgpOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X25hbWVzcGFjZXMoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBOYW1lc3BhY2UgKnApCit7IHJlZ2lzdGVyIHN0cnVjdCBOYW1lc3BhY2UgKm5zID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlczsKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wLCAqbnEsICpucjsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGxldmVsID0gc29hcC0+bGV2ZWw7CisgIHNvYXAtPm5hbWVzcGFjZXMgPSBwOworICBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzID0gTlVMTDsKKyAgc29hcF9zZXRfbG9jYWxfbmFtZXNwYWNlcyhzb2FwKTsKKyAgLyogcmV2ZXJzZSB0aGUgbmFtZXNwYWNlIGxpc3QgKi8KKyAgbnAgPSBzb2FwLT5ubGlzdDsKKyAgc29hcC0+bmxpc3QgPSBOVUxMOworICBpZiAobnApCisgIHsgbnEgPSBucC0+bmV4dDsKKyAgICBucC0+bmV4dCA9IE5VTEw7CisgICAgd2hpbGUgKG5xKQorICAgIHsgbnIgPSBucS0+bmV4dDsKKyAgICAgIG5xLT5uZXh0ID0gbnA7CisgICAgICBucCA9IG5xOworICAgICAgbnEgPSBucjsKKyAgICB9CisgIH0KKyAgLyogdGhlbiBwdXNoIG9uIG5ldyBzdGFjayAqLworICB3aGlsZSAobnApCisgIHsgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKKyAgICBzb2FwLT5sZXZlbCA9IG5wLT5sZXZlbDsgLyogcHJlc2VydmUgZWxlbWVudCBuZXN0aW5nIGxldmVsICovCisgICAgcyA9IG5wLT5uczsKKyAgICBpZiAoIXMgJiYgbnAtPmluZGV4ID49IDAgJiYgbnMpCisgICAgeyBzID0gbnNbbnAtPmluZGV4XS5vdXQ7CisgICAgICBpZiAoIXMpCisgICAgICAgIHMgPSBuc1tucC0+aW5kZXhdLm5zOworICAgIH0KKyAgICBpZiAocyAmJiBzb2FwX3B1c2hfbmFtZXNwYWNlKHNvYXAsIG5wLT5pZCwgcykpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgbnEgPSBucDsKKyAgICBucCA9IG5wLT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBucSk7CisgIH0KKyAgaWYgKG5zKQorICB7IHJlZ2lzdGVyIGludCBpOworICAgIGZvciAoaSA9IDA7IG5zW2ldLmlkOyBpKyspCisgICAgeyBpZiAobnNbaV0ub3V0KQorICAgICAgeyBTT0FQX0ZSRUUoc29hcCwgbnNbaV0ub3V0KTsKKyAgICAgICAgbnNbaV0ub3V0ID0gTlVMTDsKKyAgICAgIH0KKyAgICB9CisgICAgU09BUF9GUkVFKHNvYXAsIG5zKTsKKyAgfQorICBzb2FwLT5sZXZlbCA9IGxldmVsOyAvKiByZXN0b3JlIGxldmVsICovCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfbG9jYWxfbmFtZXNwYWNlcyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXAtPm5hbWVzcGFjZXMgJiYgIXNvYXAtPmxvY2FsX25hbWVzcGFjZXMpCisgIHsgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IE5hbWVzcGFjZSAqbnMxOworICAgIHJlZ2lzdGVyIHN0cnVjdCBOYW1lc3BhY2UgKm5zMjsKKyAgICByZWdpc3RlciBzaXplX3QgbiA9IDE7CisgICAgZm9yIChuczEgPSBzb2FwLT5uYW1lc3BhY2VzOyBuczEtPmlkOyBuczErKykKKyAgICAgIG4rKzsKKyAgICBuICo9IHNpemVvZihzdHJ1Y3QgTmFtZXNwYWNlKTsKKyAgICBuczIgPSAoc3RydWN0IE5hbWVzcGFjZSopU09BUF9NQUxMT0Moc29hcCwgbik7CisgICAgaWYgKG5zMikKKyAgICB7IG1lbWNweShuczIsIHNvYXAtPm5hbWVzcGFjZXMsIG4pOworICAgICAgaWYgKG5zMlswXS5ucykKKyAgICAgIHsgaWYgKCFzdHJjbXAobnMyWzBdLm5zLCBzb2FwX2VudjEpKQorICAgICAgICAgIHNvYXAtPnZlcnNpb24gPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgc29hcC0+dmVyc2lvbiA9IDI7CisgICAgICB9CisgICAgICBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzID0gbnMyOworICAgIH0KKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIgKgorU09BUF9GTUFDMgorc29hcF9zdHJzZWFyY2goY29uc3QgY2hhciAqYmlnLCBjb25zdCBjaGFyICpsaXR0bGUpCit7IHNpemVfdCBuID0gc3RybGVuKGxpdHRsZSk7CisgIGNvbnN0IGNoYXIgKnMgPSBiaWc7CisgIHdoaWxlIChzKSAKKyAgeyBpZiAoIXN0cm5jbXAocywgbGl0dGxlLCBuKSAmJiAoc1tuXSA9PSAnXDAnIHx8IHNbbl0gPT0gJyAnKSkKKyAgICAgIHJldHVybiBzOworICAgIHMgPSBzdHJjaHIocywgJyAnKTsKKyAgICBpZiAocykKKyAgICAgIHMrKzsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIHN0cnVjdCBzb2FwX25saXN0ICoKK3NvYXBfbG9va3VwX25zKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHNpemVfdCBuKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnA7CisgIGZvciAobnAgPSBzb2FwLT5ubGlzdDsgbnA7IG5wID0gbnAtPm5leHQpCisgIHsgaWYgKCFzdHJuY21wKG5wLT5pZCwgdGFnLCBuKSAmJiAhbnAtPmlkW25dKQorICAgICAgcmV0dXJuIG5wOworICB9CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIHN0cnVjdCBzb2FwX25saXN0ICoKK3NvYXBfcHVzaF9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKm5zLCBzaG9ydCB1dGlsaXplZCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbmxpc3QgKm5wOworICBzaXplX3QgbiwgazsKKyAgaWYgKHNvYXBfc3Ryc2VhcmNoKHNvYXAtPmMxNG5leGNsdWRlLCBpZCkpCisgICAgcmV0dXJuIE5VTEw7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUHVzaCBuYW1lc3BhY2UgYmluZGluZyAobGV2ZWw9JXUpICclcycgJyVzJ1xuIiwgc29hcC0+bGV2ZWwsIGlkLCBucz9uczoiIikpOworICBpZiAoIXV0aWxpemVkKQorICB7IGZvciAobnAgPSBzb2FwLT5ubGlzdDsgbnA7IG5wID0gbnAtPm5leHQpCisgICAgeyBpZiAoIXN0cmNtcChucC0+aWQsIGlkKSAmJiAoIW5wLT5ucyB8fCAhc3RyY21wKG5wLT5ucywgbnMpKSkKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChucCkKKyAgICB7IGlmIChucC0+aW5kZXggPT0gMSkKKyAgICAgICAgdXRpbGl6ZWQgPSBucC0+aW5kZXg7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgfQorICBuID0gc3RybGVuKGlkKTsKKyAgaWYgKG5zKQorICAgIGsgPSBzdHJsZW4obnMpOworICBlbHNlCisgICAgayA9IDA7CisgIG5wID0gKHN0cnVjdCBzb2FwX25saXN0KilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfbmxpc3QpICsgbiArIGsgKyAxKTsKKyAgaWYgKCFucCkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHJldHVybiBOVUxMOworICB9CisgIG5wLT5uZXh0ID0gc29hcC0+bmxpc3Q7CisgIHNvYXAtPm5saXN0ID0gbnA7CisgIHN0cmNweShucC0+aWQsIGlkKTsKKyAgaWYgKG5zKQorICB7IG5wLT5ucyA9IG5wLT5pZCArIG4gKyAxOworICAgIHN0cmNweShucC0+bnMsIG5zKTsKKyAgfQorICBlbHNlCisgICAgbnAtPm5zID0gTlVMTDsKKyAgbnAtPmxldmVsID0gc29hcC0+bGV2ZWw7CisgIG5wLT5pbmRleCA9IHV0aWxpemVkOworICByZXR1cm4gbnA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitzdGF0aWMgdm9pZAorc29hcF91dGlsaXplX25zKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHNpemVfdCBuKQoreyByZWdpc3RlciBzdHJ1Y3Qgc29hcF9ubGlzdCAqbnAgPSBzb2FwX2xvb2t1cF9ucyhzb2FwLCB0YWcsIG4pOworICBpZiAobnApCisgIHsgaWYgKG5wLT5pbmRleCA9PSAwKQorICAgICAgc29hcF9wdXNoX25zKHNvYXAsIG5wLT5pZCwgbnAtPm5zLCAxKTsKKyAgfQorICBlbHNlCisgIHsgc3RybmNweShzb2FwLT50bXBidWYsIHRhZywgbik7CisgICAgc29hcC0+dG1wYnVmW25dID0gJ1wwJzsKKyAgICBzb2FwX3B1c2hfbnMoc29hcCwgc29hcC0+dG1wYnVmLCBOVUxMLCAxKTsKKyAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIHZvaWQKK3NvYXBfcG9wX25zKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwX3BvcF9uYW1lc3BhY2Uoc29hcCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnR5cGUpCit7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRWxlbWVudCBiZWdpbiB0YWc9JyVzJyBpZD0nJWQnIHR5cGU9JyVzJ1xuIiwgdGFnLCBpZCwgdHlwZT90eXBlOiIiKSk7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKmVsdCA9IChzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50KSk7CisgICAgaWYgKCFlbHQpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICBlbHQtPnNvYXAgPSBzb2FwOworICAgIGVsdC0+bmV4dCA9IE5VTEw7CisgICAgZWx0LT5wcm50ID0gc29hcC0+ZG9tOworICAgIGVsdC0+bmFtZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHRhZyk7CisgICAgZWx0LT5lbHRzID0gTlVMTDsKKyAgICBlbHQtPmF0dHMgPSBOVUxMOworICAgIGVsdC0+bnN0ciA9IE5VTEw7CisgICAgZWx0LT5kYXRhID0gTlVMTDsKKyAgICBlbHQtPndpZGUgPSBOVUxMOworICAgIGVsdC0+bm9kZSA9IE5VTEw7CisgICAgZWx0LT50eXBlID0gMDsKKyAgICBlbHQtPmhlYWQgPSBOVUxMOworICAgIGVsdC0+dGFpbCA9IE5VTEw7CisgICAgaWYgKHNvYXAtPmRvbSkKKyAgICB7IHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICpwID0gc29hcC0+ZG9tLT5lbHRzOworICAgICAgaWYgKHApCisgICAgICB7IHdoaWxlIChwLT5uZXh0KQorICAgICAgICAgIHAgPSBwLT5uZXh0OworICAgICAgICBwLT5uZXh0ID0gZWx0OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBzb2FwLT5kb20tPmVsdHMgPSBlbHQ7CisgICAgfQorICAgIHNvYXAtPmRvbSA9IGVsdDsKKyAgfQorICBlbHNlCisgIHsKKyNlbmRpZgorICAgIHNvYXAtPmxldmVsKys7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmICghc29hcC0+bnMpCisgICAgeyBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICAgICAgICYmIHNvYXBfc2VuZChzb2FwLCBzb2FwLT5wcm9sb2cgPyBzb2FwLT5wcm9sb2cgOiAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBlbHNlIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfSU5ERU5UKQorICAgIHsgaWYgKHNvYXAtPm5zID09IDEgJiYgc29hcF9zZW5kX3Jhdyhzb2FwLCBzb2FwX2luZGVudCwgc29hcC0+bGV2ZWwgPCBzaXplb2Yoc29hcF9pbmRlbnQpID8gc29hcC0+bGV2ZWwgOiBzaXplb2Yoc29hcF9pbmRlbnQpIC0gMSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHNvYXAtPmJvZHkgPSAxOworICAgIH0KKyNlbmRpZgorICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsICI8IiwgMSkKKyAgICAgfHwgc29hcF9zZW5kKHNvYXAsIHRhZykpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjaWZkZWYgV0lUSF9ET00KKyAgfQorI2VuZGlmCisgIGlmICghc29hcC0+bnMpCisgIHsgc3RydWN0IE5hbWVzcGFjZSAqbnM7CisgICAgZm9yIChucyA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXM7IG5zICYmIG5zLT5pZDsgbnMrKykKKyAgICB7IGlmICgqbnMtPmlkICYmIChucy0+b3V0IHx8IG5zLT5ucykpCisgICAgICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAieG1sbnM6JXMiLCBucy0+aWQpOworICAgICAgICBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgc29hcC0+dG1wYnVmLCBucy0+b3V0ID8gbnMtPm91dCA6IG5zLT5ucykpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgfQorICAgIH0gICAKKyAgfQorICBzb2FwLT5ucyA9IDE7IC8qIHN0YXJ0IHdpdGggMCBvciAyLCBidXQgc2hvdWxkIGJlIG9uZSB0byBjb250aW51ZSAqLworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgIHsgY29uc3QgY2hhciAqcyA9IHN0cmNocih0YWcsICc6Jyk7CisgICAgaWYgKHMpCisgICAgICBzb2FwX3V0aWxpemVfbnMoc29hcCwgdGFnLCBzIC0gdGFnKTsKKyAgfQorI2VuZGlmCisgIGlmIChpZCA+IDApCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJfJWQiLCBpZCk7CisgICAgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJpZCIsIHNvYXAtPnRtcGJ1ZikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHR5cGUgJiYgKnR5cGUpCisgIHsgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJ4c2k6dHlwZSIsIHR5cGUpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkKKyAgICB7IGNvbnN0IGNoYXIgKnMgPSBzdHJjaHIodHlwZSwgJzonKTsKKyAgICAgIGlmIChzKQorICAgICAgICBzb2FwX3V0aWxpemVfbnMoc29hcCwgdHlwZSwgcyAtIHR5cGUpOworICAgIH0KKyNlbmRpZgorICB9CisgIGlmIChzb2FwLT5udWxsICYmIHNvYXAtPnBvc2l0aW9uID4gMCkKKyAgeyBpbnQgaTsKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIlslZCIsIHNvYXAtPnBvc2l0aW9uc1swXSk7CisgICAgZm9yIChpID0gMTsgaSA8IHNvYXAtPnBvc2l0aW9uOyBpKyspCisgICAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIHN0cmxlbihzb2FwLT50bXBidWYpLCAiLCVkIiwgc29hcC0+cG9zaXRpb25zW2ldKTsKKyAgICBzdHJjYXQoc29hcC0+dG1wYnVmLCAiXSIpOworICAgIGlmIChzb2FwX2F0dHJpYnV0ZShzb2FwLCAiU09BUC1FTkM6cG9zaXRpb24iLCBzb2FwLT50bXBidWYpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGlmIChzb2FwLT5tdXN0VW5kZXJzdGFuZCkKKyAgeyBpZiAoc29hcC0+YWN0b3IgJiYgKnNvYXAtPmFjdG9yKQorICAgIHsgaWYgKHNvYXBfYXR0cmlidXRlKHNvYXAsIHNvYXAtPnZlcnNpb24gPT0gMiA/ICJTT0FQLUVOVjpyb2xlIiA6ICJTT0FQLUVOVjphY3RvciIsIHNvYXAtPmFjdG9yKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgIlNPQVAtRU5WOm11c3RVbmRlcnN0YW5kIiwgc29hcC0+dmVyc2lvbiA9PSAyID8gInRydWUiIDogIjEiKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBzb2FwLT5tdXN0VW5kZXJzdGFuZCA9IDA7CisgIH0KKyAgaWYgKHNvYXAtPmVuY29kaW5nKQorICB7IGlmIChzb2FwLT5lbmNvZGluZ1N0eWxlICYmIHNvYXAtPmxvY2FsX25hbWVzcGFjZXMpCisgICAgeyBpZiAoISpzb2FwLT5lbmNvZGluZ1N0eWxlKQorICAgICAgeyBpZiAoc29hcC0+bG9jYWxfbmFtZXNwYWNlc1sxXS5vdXQpCisgICAgICAgICAgc29hcC0+ZW5jb2RpbmdTdHlsZSA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbMV0ub3V0OworICAgICAgICBlbHNlCisgICAgICAgICAgc29hcC0+ZW5jb2RpbmdTdHlsZSA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbMV0ubnM7CisgICAgICB9CisgICAgICBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgIlNPQVAtRU5WOmVuY29kaW5nU3R5bGUiLCBzb2FwLT5lbmNvZGluZ1N0eWxlKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBzb2FwLT5lbmNvZGluZyA9IDA7CisgIH0KKyAgc29hcC0+bnVsbCA9IDA7CisgIHNvYXAtPnBvc2l0aW9uID0gMDsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9iZWdpbl9vdXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICp0eXBlKQoreyBpZiAoKnRhZyA9PSAnLScpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIGlmIChzb2FwX2VsZW1lbnQoc29hcCwgdGFnLCBpZCwgdHlwZSkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X3N0YXJ0X2VuZF9vdXQoc29hcCwgTlVMTCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCisjaWZuZGVmIEhBVkVfU1RSUkNIUgorU09BUF9GTUFDMQorY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfc3RycmNocihjb25zdCBjaGFyICpzLCBpbnQgdCkKK3sgcmVnaXN0ZXIgY2hhciAqciA9IE5VTEw7CisgIHdoaWxlICgqcykKKyAgICBpZiAoKnMrKyA9PSB0KQorICAgICAgciA9IChjaGFyKilzIC0gMTsKKyAgcmV0dXJuIHI7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKKyNpZm5kZWYgSEFWRV9TVFJUT0wKK1NPQVBfRk1BQzEKK2xvbmcKK1NPQVBfRk1BQzIKK3NvYXBfc3RydG9sKGNvbnN0IGNoYXIgKnMsIGNoYXIgKip0LCBpbnQgYikKK3sgcmVnaXN0ZXIgbG9uZyBuID0gMDsKKyAgcmVnaXN0ZXIgaW50IGM7CisgIHdoaWxlICgqcyA+IDAgJiYgKnMgPD0gMzIpCisgICAgcysrOworICBpZiAoYiA9PSAxMCkKKyAgeyBzaG9ydCBuZWcgPSAwOworICAgIGlmICgqcyA9PSAnLScpCisgICAgeyBzKys7CisgICAgICBuZWcgPSAxOworICAgIH0KKyAgICBlbHNlIGlmICgqcyA9PSAnKycpCisgICAgICBzKys7CisgICAgd2hpbGUgKChjID0gKnMpICYmIGMgPj0gJzAnICYmIGMgPD0gJzknKQorICAgIHsgaWYgKG4gPj0gMjE0NzQ4MzY0ICYmIChuID4gMjE0NzQ4MzY0IHx8IGMgPj0gJzgnKSkKKyAgICAgICAgYnJlYWs7CisgICAgICBuICo9IDEwOworICAgICAgbiArPSBjIC0gJzAnOworICAgICAgcysrOworICAgIH0KKyAgICBpZiAobmVnKQorICAgICAgbiA9IC1uOworICB9CisgIGVsc2UgLyogYiA9PSAxNiBhbmQgdmFsdWUgaXMgYWx3YXlzIHBvc2l0aXZlICovCisgIHsgd2hpbGUgKChjID0gKnMpKQorICAgIHsgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQorICAgICAgICBjIC09ICcwJzsKKyAgICAgIGVsc2UgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKQorICAgICAgICBjIC09ICdBJyAtIDEwOworICAgICAgZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCisgICAgICAgIGMgLT0gJ2EnIC0gMTA7CisgICAgICBpZiAobiA+IDB4MDdGRkZGRkYpCisgICAgICAgIGJyZWFrOworICAgICAgbiA8PD0gNDsKKyAgICAgIG4gKz0gYzsKKyAgICAgIHMrKzsKKyAgICB9CisgIH0KKyAgaWYgKHQpCisgICAgKnQgPSAoY2hhciopczsKKyAgcmV0dXJuIG47Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKKyNpZm5kZWYgSEFWRV9TVFJUT1VMCitTT0FQX0ZNQUMxCit1bnNpZ25lZCBsb25nCitTT0FQX0ZNQUMyCitzb2FwX3N0cnRvdWwoY29uc3QgY2hhciAqcywgY2hhciAqKnQsIGludCBiKQoreyB1bnNpZ25lZCBsb25nIG4gPSAwOworICByZWdpc3RlciBpbnQgYzsKKyAgd2hpbGUgKCpzID4gMCAmJiAqcyA8PSAzMikKKyAgICBzKys7CisgIGlmIChiID09IDEwKQorICB7IGlmICgqcyA9PSAnKycpCisgICAgICBzKys7CisgICAgd2hpbGUgKChjID0gKnMpICYmIGMgPj0gJzAnICYmIGMgPD0gJzknKQorICAgIHsgaWYgKG4gPj0gNDI5NDk2NzI5ICYmIChuID4gNDI5NDk2NzI5IHx8IGMgPj0gJzYnKSkKKyAgICAgICAgYnJlYWs7CisgICAgICBuICo9IDEwOworICAgICAgbiArPSBjIC0gJzAnOworICAgICAgcysrOworICAgIH0KKyAgfQorICBlbHNlIC8qIGIgPT0gMTYgKi8KKyAgeyB3aGlsZSAoKGMgPSAqcykpCisgICAgeyBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCisgICAgICAgIGMgLT0gJzAnOworICAgICAgZWxzZSBpZiAoYyA+PSAnQScgJiYgYyA8PSAnRicpCisgICAgICAgIGMgLT0gJ0EnIC0gMTA7CisgICAgICBlbHNlIGlmIChjID49ICdhJyAmJiBjIDw9ICdmJykKKyAgICAgICAgYyAtPSAnYScgLSAxMDsKKyAgICAgIGlmIChuID4gMHgwRkZGRkZGRikKKyAgICAgICAgYnJlYWs7CisgICAgICBuIDw8PSA0OworICAgICAgbiArPSBjOworICAgICAgcysrOworICAgIH0KKyAgfQorICBpZiAodCkKKyAgICAqdCA9IChjaGFyKilzOworICByZXR1cm4gbjsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2FycmF5X2JlZ2luX291dChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKm9mZnNldCkKK3sgaWYgKHNvYXBfZWxlbWVudChzb2FwLCB0YWcsIGlkLCAiU09BUC1FTkM6QXJyYXkiKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgIHsgY29uc3QgY2hhciAqczsKKyAgICBzID0gc29hcF9zdHJyY2hyKHR5cGUsICdbJyk7CisgICAgaWYgKChzaXplX3QpKHMgLSB0eXBlKSA8IHNpemVvZihzb2FwLT50bXBidWYpKQorICAgIHsgc3RybmNweShzb2FwLT50bXBidWYsIHR5cGUsIHMgLSB0eXBlKTsKKyAgICAgIHNvYXAtPnRtcGJ1ZltzIC0gdHlwZV0gPSAnXDAnOworICAgICAgaWYgKHR5cGUgJiYgKnR5cGUgJiYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJTT0FQLUVOQzppdGVtVHlwZSIsIHNvYXAtPnRtcGJ1ZikpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBpZiAocyAmJiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgIlNPQVAtRU5DOmFycmF5U2l6ZSIsIHMgKyAxKSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7IGlmIChvZmZzZXQgJiYgKHNvYXBfYXR0cmlidXRlKHNvYXAsICJTT0FQLUVOQzpvZmZzZXQiLCBvZmZzZXQpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAodHlwZSAmJiAqdHlwZSAmJiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgIlNPQVAtRU5DOmFycmF5VHlwZSIsIHR5cGUpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHR5cGUgJiYgKnR5cGUgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpKQorICB7IGNvbnN0IGNoYXIgKnMgPSBzdHJjaHIodHlwZSwgJzonKTsKKyAgICBpZiAocykKKyAgICAgIHNvYXBfdXRpbGl6ZV9ucyhzb2FwLCB0eXBlLCBzIC0gdHlwZSk7CisgIH0KKyNlbmRpZgorICByZXR1cm4gc29hcF9lbGVtZW50X3N0YXJ0X2VuZF9vdXQoc29hcCwgTlVMTCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqdHA7CisjaWZkZWYgV0lUSF9ET00KKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAqKmF0dDsKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgYXR0ID0gJnNvYXAtPmRvbS0+YXR0czsKKyAgICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgICAgeyBpZiAodHAtPnZpc2libGUpCisgICAgICB7ICphdHQgPSAoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUpKTsKKwlpZiAoISphdHQpCisJICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKwkoKmF0dCktPm5leHQgPSBOVUxMOworICAgICAgICAoKmF0dCktPm5zdHIgPSBOVUxMOworICAgICAgICAoKmF0dCktPm5hbWUgPSBzb2FwX3N0cmR1cChzb2FwLCB0cC0+bmFtZSk7CisgICAgICAgICgqYXR0KS0+ZGF0YSA9IHNvYXBfc3RyZHVwKHNvYXAsIHRwLT52YWx1ZSk7CisgICAgICAgICgqYXR0KS0+d2lkZSA9IE5VTEw7CisgICAgICAgICgqYXR0KS0+c29hcCA9IHNvYXA7CisgICAgICAgIHRwLT52aXNpYmxlID0gMDsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgIHsgc3RydWN0IHNvYXBfbmxpc3QgKm5wOworICAgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgICB7IGlmICh0cC0+dmlzaWJsZSAmJiB0cC0+bmFtZSkKKyAgICAgIHsgY29uc3QgY2hhciAqcyA9IHN0cmNocih0cC0+bmFtZSwgJzonKTsKKyAgICAgICAgaWYgKHMpCisgICAgICAgICAgc29hcF91dGlsaXplX25zKHNvYXAsIHRwLT5uYW1lLCBzIC0gdHAtPm5hbWUpOworICAgICAgfQorICAgIH0KKyAgICBmb3IgKG5wID0gc29hcC0+bmxpc3Q7IG5wOyBucCA9IG5wLT5uZXh0KQorICAgIHsgaWYgKG5wLT5pbmRleCA9PSAxICYmIG5wLT5ucykKKyAgICAgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJ4bWxuczolcyIsIG5wLT5pZCk7CisgICAgICAgIHNvYXBfc2V0X2F0dHIoc29hcCwgc29hcC0+dG1wYnVmLCBucC0+bnMpOworICAgICAgICBucC0+aW5kZXggPSAyOworICAgICAgfQorICAgIH0KKyAgfQorI2VuZGlmCisgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgeyBpZiAodHAtPnZpc2libGUpCisgICAgeyBpZiAoc29hcF9zZW5kKHNvYXAsICIgIikgfHwgc29hcF9zZW5kKHNvYXAsIHRwLT5uYW1lKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgaWYgKHRwLT52aXNpYmxlID09IDIgJiYgdHAtPnZhbHVlKQorICAgICAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAiPVwiIiwgMikKKwkgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHRwLT52YWx1ZSwgMSkKKwkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiXCIiLCAxKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB0cC0+dmlzaWJsZSA9IDA7CisgICAgfQorICB9CisgIGlmICh0YWcpCisgIHsgCisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICAgIHsgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgIj4iLCAxKQorICAgICAgIHx8IHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZykpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgc29hcC0+bGV2ZWwtLTsJLyogZGVjcmVtZW50IGxldmVsIGp1c3QgYmVmb3JlIC8+ICovCisgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgIi8+IiwgMikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgcmV0dXJuIHNvYXBfc2VuZF9yYXcoc29hcCwgIj4iLCAxKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X2VuZF9vdXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZykKK3sgaWYgKCp0YWcgPT0gJy0nKQorICAgIHJldHVybiBTT0FQX09LOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVsZW1lbnQgZW5kaW5nIHRhZz0nJXMnXG4iLCB0YWcpKTsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBpZiAoc29hcC0+ZG9tLT5wcm50KQorICAgICAgc29hcC0+ZG9tID0gc29hcC0+ZG9tLT5wcm50OworICAgIHJldHVybiBTT0FQX09LOworICB9CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKQorICAgIHNvYXBfcG9wX25zKHNvYXApOworICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0lOREVOVCkKKyAgeyBpZiAoIXNvYXAtPmJvZHkpCisgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzb2FwX2luZGVudCwgc29hcC0+bGV2ZWwgPCBzaXplb2Yoc29hcF9pbmRlbnQpID8gc29hcC0+bGV2ZWwgOiBzaXplb2Yoc29hcF9pbmRlbnQpIC0gMSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgICAgc29hcC0+Ym9keSA9IDA7CisgIH0KKyNlbmRpZgorICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAiPC8iLCAyKQorICAgfHwgc29hcF9zZW5kKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBzb2FwLT5sZXZlbC0tOwkvKiBkZWNyZW1lbnQgbGV2ZWwganVzdCBiZWZvcmUgPiAqLworICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCAiPiIsIDEpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfcmVmKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgaW50IGhyZWYpCit7IHJlZ2lzdGVyIGludCBuID0gMDsKKyAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgICBuID0gMTsKKyAgc3ByaW50Zihzb2FwLT5ocmVmLCAiI18lZCIsIGhyZWYpOworICByZXR1cm4gc29hcF9lbGVtZW50X2hyZWYoc29hcCwgdGFnLCBpZCwgImhyZWYiICsgbiwgc29hcC0+aHJlZiArIG4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfaHJlZihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnJlZiwgY29uc3QgY2hhciAqdmFsKQoreyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVsZW1lbnQgJyVzJyByZWZlcmVuY2UgJXM9JyVzJ1xuIiwgdGFnLCByZWYsIHZhbCkpOworICBpZiAoc29hcF9lbGVtZW50KHNvYXAsIHRhZywgaWQsIE5VTEwpCisgICB8fCBzb2FwX2F0dHJpYnV0ZShzb2FwLCByZWYsIHZhbCkKKyAgIHx8IHNvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHNvYXAsIHRhZykpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X251bGwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICp0eXBlKQoreyBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKnRwOworICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgICAgaWYgKHRwLT52aXNpYmxlKQorICAgICAgYnJlYWs7CisgIGlmICh0cCB8fCAoc29hcC0+dmVyc2lvbiA9PSAyICYmIHNvYXAtPnBvc2l0aW9uID4gMCkgfHwgaWQgPiAwIHx8IChzb2FwLT5tb2RlICYgU09BUF9YTUxfTklMKSkKKyAgeyBpZiAoc29hcF9lbGVtZW50KHNvYXAsIHRhZywgaWQsIHR5cGUpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmIChzb2FwLT5wYXJ0ICE9IFNPQVBfSU5fSEVBREVSICYmIHNvYXAtPmVuY29kaW5nU3R5bGUpCisgICAgICBpZiAoc29hcF9hdHRyaWJ1dGUoc29hcCwgInhzaTpuaWwiLCAidHJ1ZSIpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgcmV0dXJuIHNvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHNvYXAsIHRhZyk7CisgIH0KKyAgc29hcC0+bnVsbCA9IDE7CisgIHNvYXAtPnBvc2l0aW9uID0gMDsKKyAgc29hcC0+bXVzdFVuZGVyc3RhbmQgPSAwOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbGVtZW50X2lkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3Qgdm9pZCAqcCwgY29uc3Qgc3RydWN0IHNvYXBfYXJyYXkgKmEsIGludCBuLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkgCit7IGlmICghcCB8fCAoYSAmJiAhYS0+X19wdHIpKQorICB7IHNvYXBfZWxlbWVudF9udWxsKHNvYXAsIHRhZywgaWQsIHR5cGUpOworICAgIHJldHVybiAtMTsKKyAgfQorI2lmbmRlZiBXSVRIX05PSURSRUYKKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9UUkVFKQorICAgIHJldHVybiAwOworICBpZiAoaWQgPCAwKQorICB7IHN0cnVjdCBzb2FwX3BsaXN0ICpwcDsKKyAgICBpZiAoYSkKKyAgICAgIGlkID0gc29hcF9hcnJheV9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCBhLCBuLCB0LCAmcHApOworICAgIGVsc2UKKyAgICAgIGlkID0gc29hcF9wb2ludGVyX2xvb2t1cChzb2FwLCBwLCB0LCAmcHApOworICAgIGlmIChpZCkKKyAgICB7IGlmIChzb2FwX2lzX2VtYmVkZGVkKHNvYXAsIHBwKSkKKyAgICAgIHsgc29hcF9lbGVtZW50X3JlZihzb2FwLCB0YWcsIDAsIGlkKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgaWYgKHNvYXBfaXNfc2luZ2xlKHNvYXAsIHBwKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICBzb2FwX3NldF9lbWJlZGRlZChzb2FwLCBwcCk7CisgICAgfQorICB9CisgIHJldHVybiBpZDsKKyNlbHNlCisgIHJldHVybiAwOworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9yZXN1bHQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZykKK3sgaWYgKHNvYXAtPnZlcnNpb24gPT0gMiAmJiBzb2FwLT5lbmNvZGluZ1N0eWxlKQorICAgIGlmIChzb2FwX2VsZW1lbnQoc29hcCwgIlNPQVAtUlBDOnJlc3VsdCIsIDAsIE5VTEwpCisgICAgIHx8IHNvYXBfYXR0cmlidXRlKHNvYXAsICJ4bWxuczpTT0FQLVJQQyIsIHNvYXBfcnBjKQorICAgICB8fCBzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzb2FwLCBOVUxMKQorICAgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgdGFnLCAwKQorICAgICB8fCBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCAiU09BUC1SUEM6cmVzdWx0IikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2F0dHJpYnV0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7IAorI2lmZGVmIFdJVEhfRE9NCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgKmEgPSAoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUpKTsKKyAgICBhLT5uZXh0ID0gc29hcC0+ZG9tLT5hdHRzOworICAgIGEtPm5zdHIgPSBOVUxMOworICAgIGEtPm5hbWUgPSBzb2FwX3N0cmR1cChzb2FwLCBuYW1lKTsKKyAgICBhLT5kYXRhID0gc29hcF9zdHJkdXAoc29hcCwgdmFsdWUpOworICAgIGEtPndpZGUgPSBOVUxMOworICAgIGEtPnNvYXAgPSBzb2FwOworICAgIHNvYXAtPmRvbS0+YXR0cyA9IGE7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgIHsgLyogVE9ETzogY29uc2lkZXIgdXNpbmcgdGhpcyBjb2RlIHRvIGhhbmRsZSBkZWZhdWx0IG5hbWVzcGFjZQorICAgIGlmICghc3RybmNtcChuYW1lLCAieG1sbnMiLCA1KSAmJiAobmFtZVs1XSA9PSAnOicgfHwgbmFtZVs1XSA9PSAnXDAnKSkKKyAgICB7IGlmIChuYW1lWzVdID09ICc6JykKKyAgICAgICAgc29hcF9wdXNoX25zKHNvYXAsIG5hbWUgKyA2LCB2YWx1ZSwgMCk7CisgICAgICBlbHNlCisgICAgICAgIHNvYXBfcHVzaF9ucyhzb2FwLCAiIiwgdmFsdWUsIDApOworICAgIH0KKyAgICAqLworICAgIGlmICghc3RybmNtcChuYW1lLCAieG1sbnM6IiwgNikpCisgICAgICBzb2FwX3B1c2hfbnMoc29hcCwgbmFtZSArIDYsIHZhbHVlLCAwKTsKKyAgICBlbHNlIGlmIChzb2FwX3NldF9hdHRyKHNvYXAsIG5hbWUsIHZhbHVlKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBlbHNlCisjZW5kaWYKKyAgeyBpZiAoc29hcF9zZW5kKHNvYXAsICIgIikgfHwgc29hcF9zZW5kKHNvYXAsIG5hbWUpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmICh2YWx1ZSkKKyAgICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsICI9XCIiLCAyKQorICAgICAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCB2YWx1ZSwgMSkKKyAgICAgICB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICJcIiIsIDEpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZWxlbWVudF9iZWdpbl9pbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgbmlsbGFibGUpCit7IGlmICghc29hcF9wZWVrX2VsZW1lbnQoc29hcCkpCisgIHsgaWYgKHNvYXAtPm90aGVyKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9UQUdfTUlTTUFUQ0g7CisgICAgaWYgKHRhZyAmJiAqdGFnID09ICctJykKKyAgICAgIHJldHVybiBTT0FQX09LOworICAgIGlmICghKHNvYXAtPmVycm9yID0gc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dGFnLCB0YWcpKSkKKyAgICB7IHNvYXAtPnBlZWtlZCA9IDA7CisgICAgICBpZiAoc29hcC0+Ym9keSkKKyAgICAgICAgc29hcC0+bGV2ZWwrKzsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQmVnaW4gZWxlbWVudCBmb3VuZCAobGV2ZWw9JXUpICclcyc9JyVzJ1xuIiwgc29hcC0+bGV2ZWwsIHNvYXAtPnRhZywgdGFnP3RhZzoiIiApKTsKKyAgICAgIGlmICghbmlsbGFibGUgJiYgc29hcC0+bnVsbCAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTlVMTDsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9OT19UQUcgJiYgdGFnICYmICp0YWcgPT0gJy0nKQorICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VsZW1lbnRfZW5kX2luKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcpICAKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICByZWdpc3RlciBjaGFyICpzOworICByZWdpc3RlciBjb25zdCBjaGFyICp0OworICByZWdpc3RlciBpbnQgbiA9IDA7CisgIGlmICh0YWcgJiYgKnRhZyA9PSAnLScpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIHNvYXAtPmxldmVsLS07CisgIHNvYXBfcG9wX25hbWVzcGFjZShzb2FwKTsKKyNpZmRlZiBXSVRIX0RPTQorICAvKiB0aGlzIHdoaXRlc3BhY2Ugb3IgbWl4ZWQgY29udGVudCBpcyBub3QgaW5zaWduaWZpY2FudCBmb3IgRE9NICovCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0RPTSkgJiYgc29hcC0+ZG9tKQorICB7IGlmICghc29hcC0+cGVla2VkICYmICFzb2FwX3N0cmluZ19pbihzb2FwLCAzLCAtMSwgLTEpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmIChzb2FwLT5kb20tPnBybnQpCisgICAgICBzb2FwLT5kb20gPSBzb2FwLT5kb20tPnBybnQ7CisgIH0KKyNlbmRpZgorICBpZiAoc29hcC0+cGVla2VkKQorICB7IGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX05PX1RBRykKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgICBpZiAoKnNvYXAtPnRhZykKKyAgICAgIG4rKzsKKyAgICBzb2FwLT5wZWVrZWQgPSAwOworICB9CisgIGRvCisgIHsgd2hpbGUgKCgoYyA9IHNvYXBfZ2V0KHNvYXApKSAhPSBTT0FQX1RUKSkKKyAgICB7IGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAgIGlmIChjID09IFNPQVBfTFQpCisgICAgICAgIG4rKzsKKyAgICAgIGVsc2UgaWYgKGMgPT0gJy8nKQorICAgICAgeyBjID0gc29hcF9nZXQoc29hcCk7CisgICAgICAgIGlmIChjID09IFNPQVBfR1QpCisJICBuLS07CisgICAgICAgIGVsc2UKKwkgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICB9CisgICAgfQorICB9IHdoaWxlIChuLS0pOworICBzID0gc29hcC0+dGFnOworICB3aGlsZSAoc29hcF9ub3RibGFuayhjID0gc29hcF9nZXQoc29hcCkpKQorICAgICpzKysgPSAoY2hhciljOworICAqcyA9ICdcMCc7CisgIGlmICgoaW50KWMgPT0gRU9GKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICB3aGlsZSAoc29hcF9ibGFuayhjKSkKKyAgICBjID0gc29hcF9nZXQoc29hcCk7CisgIGlmIChjICE9IFNPQVBfR1QpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9TWU5UQVhfRVJST1I7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIGVsZW1lbnQgZm91bmQgKGxldmVsPSV1KSAnJXMnPSclcydcbiIsIHNvYXAtPmxldmVsLCBzb2FwLT50YWcsIHRhZz90YWc6IiIpKTsKKyAgaWYgKCF0YWcgfHwgISp0YWcpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIGlmICgocyA9IHN0cmNocihzb2FwLT50YWcsICc6JykpKQorICAgIHMrKzsKKyAgZWxzZQorICAgIHMgPSBzb2FwLT50YWc7CisgIGlmICgodCA9IHN0cmNocih0YWcsICc6JykpKQorICAgIHQrKzsKKyAgZWxzZQorICAgIHQgPSB0YWc7CisgIGlmICghU09BUF9TVFJDTVAocywgdCkpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRW5kIGVsZW1lbnQgdGFnIG5hbWUgZG9lcyBub3QgbWF0Y2hcbiIpKTsKKyAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9TWU5UQVhfRVJST1I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfYXR0cl92YWx1ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWcpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqdHA7CisgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgICBpZiAoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCBuYW1lKSkKKyAgICAgIGJyZWFrOworICBpZiAodHAgJiYgdHAtPnZpc2libGUgPT0gMikKKyAgeyBpZiAoZmxhZyA9PSAyICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9QUk9ISUJJVEVEOworICAgIGVsc2UKKyAgICAgIHJldHVybiB0cC0+dmFsdWU7CisgIH0KKyAgZWxzZSBpZiAoZmxhZyA9PSAxICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfUkVRVUlSRUQ7CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NldF9hdHRyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfYXR0cmlidXRlICp0cDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTZXQgYXR0cmlidXRlICVzPSclcydcbiIsIG5hbWUsIHZhbHVlP3ZhbHVlOiIiKSk7CisgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgeyBpZiAoIXN0cmNtcCh0cC0+bmFtZSwgbmFtZSkpCisgICAgICBicmVhazsKKyAgfQorICBpZiAoIXRwKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQWxsb2NhdGUgYXR0cmlidXRlICVzXG4iLCBuYW1lKSk7CisgICAgaWYgKCEodHAgPSAoc3RydWN0IHNvYXBfYXR0cmlidXRlKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfYXR0cmlidXRlKSArIHN0cmxlbihuYW1lKSkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgdHAtPm5zID0gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpCisgICAgeyBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKip0cHAgPSAmc29hcC0+YXR0cmlidXRlczsKKyAgICAgIGNvbnN0IGNoYXIgKnMgPSBzdHJjaHIobmFtZSwgJzonKTsKKyAgICAgIGlmICghc3RybmNtcChuYW1lLCAieG1sbnMiLCA1KSkKKyAgICAgIHsgZm9yICg7ICp0cHA7IHRwcCA9ICYoKnRwcCktPm5leHQpCisgICAgICAgICAgaWYgKHN0cm5jbXAoKCp0cHApLT5uYW1lLCAieG1sbnMiLCA1KSB8fCBzdHJjbXAoKCp0cHApLT5uYW1lICsgNSwgbmFtZSArIDUpID4gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIXMpCisgICAgICB7IGZvciAoOyAqdHBwOyB0cHAgPSAmKCp0cHApLT5uZXh0KQorICAgICAgICAgIGlmIChzdHJuY21wKCgqdHBwKS0+bmFtZSwgInhtbG5zIiwgNSkgJiYgKCgqdHBwKS0+bnMgfHwgc3RyY21wKCgqdHBwKS0+bmFtZSwgbmFtZSkgPiAwKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBpbnQgazsKKyAgICAgICAgZm9yICg7ICp0cHA7IHRwcCA9ICYoKnRwcCktPm5leHQpCisJeyBpZiAoIXN0cm5jbXAoKCp0cHApLT5uYW1lLCAieG1sbnM6IiwgNikgJiYgIXN0cm5jbXAoKCp0cHApLT5uYW1lICsgNiwgbmFtZSwgcyAtIG5hbWUpICYmICEoKnRwcCktPm5hbWVbNiArIHMgLSBuYW1lXSkKKwkgIHsgaWYgKCF0cC0+bnMpCisgICAgICAgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ2Fub25pY2FsaXphdGlvbjogcHJlZml4ICVzPSVwKCVzKVxuIiwgbmFtZSwgKCp0cHApLT5ucywgKCp0cHApLT5ucykpOworCSAgICAgIHRwLT5ucyA9ICgqdHBwKS0+bnM7CisJICAgIH0KKwkgIH0KKyAgICAgICAgICBlbHNlIGlmIChzdHJuY21wKCgqdHBwKS0+bmFtZSwgInhtbG5zIiwgNSkgJiYgKCp0cHApLT5ucyAmJiB0cC0+bnMgJiYgKChrID0gc3RyY21wKCgqdHBwKS0+bnMsIHRwLT5ucykpID4gMCB8fCAoIWsgJiYgc3RyY21wKCgqdHBwKS0+bmFtZSwgbmFtZSkgPiAwKSkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgdHAtPm5leHQgPSAqdHBwOworICAgICAgKnRwcCA9IHRwOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7IHRwLT5uZXh0ID0gc29hcC0+YXR0cmlidXRlczsKKyAgICAgIHNvYXAtPmF0dHJpYnV0ZXMgPSB0cDsKKyAgICB9CisgICAgc3RyY3B5KHRwLT5uYW1lLCBuYW1lKTsKKyAgICB0cC0+dmFsdWUgPSBOVUxMOworICB9CisgIGVsc2UgaWYgKHRwLT52aXNpYmxlKQorICB7IHJldHVybiBTT0FQX09LOworICB9CisgIGVsc2UgaWYgKHZhbHVlICYmIHRwLT52YWx1ZSAmJiB0cC0+c2l6ZSA8PSBzdHJsZW4odmFsdWUpKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRnJlZSBhdHRyaWJ1dGUgdmFsdWUgb2YgJXMgKGZyZWUgJXApXG4iLCBuYW1lLCB0cC0+dmFsdWUpKTsKKyAgICBTT0FQX0ZSRUUoc29hcCwgdHAtPnZhbHVlKTsKKyAgICB0cC0+dmFsdWUgPSBOVUxMOworICAgIHRwLT5ucyA9IE5VTEw7CisgIH0KKyAgaWYgKHZhbHVlKQorICB7IGlmICghdHAtPnZhbHVlKQorICAgIHsgdHAtPnNpemUgPSBzdHJsZW4odmFsdWUpICsgMTsKKyAgICAgIGlmICghKHRwLT52YWx1ZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCB0cC0+c2l6ZSkpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQWxsb2NhdGUgYXR0cmlidXRlIHZhbHVlIG9mICVzICglcClcbiIsIHRwLT5uYW1lLCB0cC0+dmFsdWUpKTsKKyAgICB9CisgICAgc3RyY3B5KHRwLT52YWx1ZSwgdmFsdWUpOworICAgIGlmICghc3RybmNtcCh0cC0+bmFtZSwgInhtbG5zOiIsIDYpKQorICAgICAgdHAtPm5zID0gdHAtPnZhbHVlOworICAgIHRwLT52aXNpYmxlID0gMjsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKCFzdHJjbXAobmFtZSwgIndzdTpJZCIpKQorICAgIHsgc29hcC0+cGFydCA9IFNPQVBfQkVHSU5fU0VDVVJJVFk7CisgICAgICBzdHJuY3B5KHNvYXAtPmlkLCB2YWx1ZSwgc2l6ZW9mKHNvYXAtPmlkKSk7CisgICAgICBzb2FwLT5pZFtzaXplb2Yoc29hcC0+aWQpLTFdID0gJ1wwJzsKKyAgICB9CisjZW5kaWYKKyAgfQorICBlbHNlCisgICAgdHAtPnZpc2libGUgPSAxOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfY2xyX2F0dHIoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSAqdHA7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpKQorICB7IHdoaWxlIChzb2FwLT5hdHRyaWJ1dGVzKQorICAgIHsgdHAgPSBzb2FwLT5hdHRyaWJ1dGVzLT5uZXh0OworICAgICAgU09BUF9GUkVFKHNvYXAsIHNvYXAtPmF0dHJpYnV0ZXMtPnZhbHVlKTsKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBzb2FwLT5hdHRyaWJ1dGVzKTsKKyAgICAgIHNvYXAtPmF0dHJpYnV0ZXMgPSB0cDsKKyAgICB9CisgIH0KKyAgZWxzZQorI2VuZGlmCisgIHsgZm9yICh0cCA9IHNvYXAtPmF0dHJpYnV0ZXM7IHRwOyB0cCA9IHRwLT5uZXh0KQorICAgICAgdHAtPnZpc2libGUgPSAwOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitzdGF0aWMgaW50Citzb2FwX2dldGF0dHJ2YWwoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnMsIHNpemVfdCBuLCBzb2FwX3djaGFyIGQpCit7IHJlZ2lzdGVyIHNpemVfdCBpOworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICB7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IHNvYXBfZ2V0KHNvYXApOworICAgIHN3aXRjaCAoYykKKyAgICB7CisgICAgY2FzZSBTT0FQX1RUOgorICAgICAgKnMrKyA9ICc8JzsKKyAgICAgIHNvYXBfdW5nZXQoc29hcCwgJy8nKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9MVDoKKyAgICAgICpzKysgPSAnPCc7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfR1Q6CisgICAgICBpZiAoZCA9PSAnICcpCisgICAgICB7IHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgICpzID0gJ1wwJzsKKyAgICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgICB9CisgICAgICAqcysrID0gJz4nOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1FUOgorICAgICAgaWYgKGMgPT0gZCkKKyAgICAgIHsgKnMgPSAnXDAnOworICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICAgIH0KKyAgICAgICpzKysgPSAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfQVA6CisgICAgICBpZiAoYyA9PSBkKQorICAgICAgeyAqcyA9ICdcMCc7CisgICAgICAgIHJldHVybiBTT0FQX09LOworICAgICAgfQorICAgICAgKnMrKyA9ICdcJyc7CisgICAgICBicmVhazsKKyAgICBjYXNlICdcdCc6CisgICAgY2FzZSAnXG4nOgorICAgIGNhc2UgJ1xyJzoKKyAgICBjYXNlICcgJzoKKyAgICBjYXNlICcvJzoKKyAgICAgIGlmIChkID09ICcgJykKKyAgICAgIHsgc29hcF91bmdldChzb2FwLCBjKTsKKyAgICAgICAgKnMgPSAnXDAnOworICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgICAgKnMrKyA9IChjaGFyKWM7CisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgV0lUSF9GQVNUCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3N0b3JlX2xhYihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgc2l6ZV90IG4pCit7IHNvYXAtPmxhYmlkeCA9IDA7CisgIHJldHVybiBzb2FwX2FwcGVuZF9sYWIoc29hcCwgcywgbik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFdJVEhfRkFTVAorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9hcHBlbmRfbGFiKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBzaXplX3QgbikKK3sgaWYgKHNvYXAtPmxhYmlkeCArIG4gPj0gc29hcC0+bGFibGVuKQorICB7IHJlZ2lzdGVyIGNoYXIgKnQgPSBzb2FwLT5sYWJidWY7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbmxhcmdpbmcgbG9vay1hc2lkZSBidWZmZXIgdG8gYXBwZW5kIGRhdGEsIG9sZCBzaXplPSVsdSIsICh1bnNpZ25lZCBsb25nKXNvYXAtPmxhYmxlbikpOworICAgIGlmIChzb2FwLT5sYWJsZW4gPT0gMCkKKyAgICAgIHNvYXAtPmxhYmxlbiA9IFNPQVBfTEFCTEVOOworICAgIHdoaWxlIChzb2FwLT5sYWJpZHggKyBuID49IHNvYXAtPmxhYmxlbikKKyAgICAgIHNvYXAtPmxhYmxlbiA8PD0gMTsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIiwgbmV3IHNpemU9JWx1XG4iLCAodW5zaWduZWQgbG9uZylzb2FwLT5sYWJsZW4pKTsKKyAgICBzb2FwLT5sYWJidWYgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc29hcC0+bGFibGVuKTsKKyAgICBpZiAoIXNvYXAtPmxhYmJ1ZikKKyAgICB7IGlmICh0KQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgdCk7CisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICB9CisgICAgaWYgKHQpCisgICAgeyBtZW1jcHkoc29hcC0+bGFiYnVmLCB0LCBzb2FwLT5sYWJpZHgpOworICAgICAgU09BUF9GUkVFKHNvYXAsIHQpOworICAgIH0KKyAgfQorICBpZiAocykKKyAgeyBtZW1jcHkoc29hcC0+bGFiYnVmICsgc29hcC0+bGFiaWR4LCBzLCBuKTsKKyAgICBzb2FwLT5sYWJpZHggKz0gbjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3BlZWtfZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyNpZmRlZiBXSVRIX0RPTQorICByZWdpc3RlciBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICoqYXR0ID0gTlVMTDsKKyAgcmVnaXN0ZXIgY2hhciAqbGVhZCA9IE5VTEw7CisjZW5kaWYKKyAgcmVnaXN0ZXIgc3RydWN0IHNvYXBfYXR0cmlidXRlICp0cDsKKyAgY29uc3QgY2hhciAqdDsKKyAgcmVnaXN0ZXIgY2hhciAqczsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICByZWdpc3RlciBpbnQgaTsKKyAgaWYgKHNvYXAtPnBlZWtlZCkKKyAgeyBpZiAoISpzb2FwLT50YWcpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX05PX1RBRzsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICBzb2FwLT5wZWVrZWQgPSAxOworICBjID0gc29hcF9nZXR1dGY4KHNvYXApOworI2lmZGVmIFdJVEhfRE9NCisgIC8qIHdoaXRlc3BhY2UgbGVhZGluZyB0byBzdGFydCB0YWcgaXMgbm90IGluc2lnbmlmaWNhbnQgZm9yIERPTSAqLworICBpZiAoc29hcF9ibGFuayhjKSkKKyAgeyBzb2FwLT5sYWJpZHggPSAwOworICAgIGRvCisgICAgeyBpZiAoc29hcF9hcHBlbmRfbGFiKHNvYXAsIE5VTEwsIDApKQorICAgICAgICByZXR1cm4gU09BUF9FT007CisgICAgICBzID0gc29hcC0+bGFiYnVmICsgc29hcC0+bGFiaWR4OworICAgICAgaSA9IHNvYXAtPmxhYmxlbiAtIHNvYXAtPmxhYmlkeDsKKyAgICAgIHNvYXAtPmxhYmlkeCA9IHNvYXAtPmxhYmxlbjsKKyAgICAgIHdoaWxlIChzb2FwX2JsYW5rKGMpICYmIGktLSkKKyAgICAgIHsgKnMrKyA9IGM7CisgICAgICAgIGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisgICAgICB9CisgICAgfQorICAgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyAgICAqcyA9ICdcMCc7CisgICAgbGVhZCA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPmxhYmJ1Zik7CisgIH0KKyNlbHNlCisgIHdoaWxlIChzb2FwX2JsYW5rKGMpKQorICAgIGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisjZW5kaWYKKyAgaWYgKGMgIT0gU09BUF9MVCkKKyAgeyAqc29hcC0+dGFnID0gJ1wwJzsKKyAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisjaWZkZWYgV0lUSF9ET00KKyAgICAvKiB3aGl0ZXNwYWNlIGxlYWRpbmcgdG8gZW5kIHRhZyBpcyBub3QgaW5zaWduaWZpY2FudCBmb3IgRE9NICovCisgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgICAgICBzb2FwLT5kb20tPnRhaWwgPSBzb2FwX3N0cmR1cChzb2FwLCBsZWFkKTsKKyNlbmRpZgorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTk9fVEFHOworICB9CisgIHMgPSBzb2FwLT50YWc7CisgIGRvIGMgPSBzb2FwX2dldDEoc29hcCk7CisgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyAgaSA9IHNpemVvZihzb2FwLT50YWcpOworICB3aGlsZSAoYyAhPSAnPicgJiYgYyAhPSAnLycgJiYgc29hcF9ub3RibGFuayhjKSkKKyAgeyBpZiAoLS1pID4gMCkKKyAgICAgICpzKysgPSAoY2hhciljOworICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgIH0KKyAgd2hpbGUgKHNvYXBfYmxhbmsoYykpCisgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgKnMgPSAnXDAnOworICBzb2FwLT5pZFswXSA9ICdcMCc7CisgIHNvYXAtPmhyZWZbMF0gPSAnXDAnOworICBzb2FwLT50eXBlWzBdID0gJ1wwJzsKKyAgc29hcC0+YXJyYXlUeXBlWzBdID0gJ1wwJzsKKyAgc29hcC0+YXJyYXlTaXplWzBdID0gJ1wwJzsKKyAgc29hcC0+YXJyYXlPZmZzZXRbMF0gPSAnXDAnOworICBzb2FwLT5vdGhlciA9IDA7CisgIHNvYXAtPnJvb3QgPSAtMTsKKyAgc29hcC0+cG9zaXRpb24gPSAwOworICBzb2FwLT5udWxsID0gMDsKKyAgc29hcC0+bXVzdFVuZGVyc3RhbmQgPSAwOworI2lmZGVmIFdJVEhfRE9NCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKQorICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICplbHQ7CisgICAgZWx0ID0gKHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50Kilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQpKTsKKyAgICBpZiAoIWVsdCkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIGVsdC0+bmV4dCA9IE5VTEw7CisgICAgZWx0LT5uc3RyID0gTlVMTDsKKyAgICBlbHQtPm5hbWUgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT50YWcpOworICAgIGVsdC0+cHJudCA9IHNvYXAtPmRvbTsKKyAgICBlbHQtPmVsdHMgPSBOVUxMOworICAgIGVsdC0+YXR0cyA9IE5VTEw7CisgICAgZWx0LT5kYXRhID0gTlVMTDsKKyAgICBlbHQtPndpZGUgPSBOVUxMOworICAgIGVsdC0+dHlwZSA9IDA7CisgICAgZWx0LT5ub2RlID0gTlVMTDsKKyAgICBlbHQtPmhlYWQgPSBsZWFkOworICAgIGVsdC0+dGFpbCA9IE5VTEw7CisgICAgZWx0LT5zb2FwID0gc29hcDsKKyAgICBpZiAoc29hcC0+ZG9tKQorICAgIHsgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKnAgPSBzb2FwLT5kb20tPmVsdHM7CisgICAgICBpZiAocCkKKyAgICAgIHsgd2hpbGUgKHAtPm5leHQpCisgICAgICAgICAgcCA9IHAtPm5leHQ7CisgICAgICAgIHAtPm5leHQgPSBlbHQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHNvYXAtPmRvbS0+ZWx0cyA9IGVsdDsKKyAgICB9CisgICAgc29hcC0+ZG9tID0gZWx0OworICAgIGF0dCA9ICZlbHQtPmF0dHM7CisgIH0KKyNlbmRpZgorICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgICAgdHAtPnZpc2libGUgPSAwOworICB3aGlsZSAoKGludCljICE9IEVPRiAmJiBjICE9ICc+JyAmJiBjICE9ICcvJykKKyAgeyBzID0gc29hcC0+dG1wYnVmOworICAgIGkgPSBzaXplb2Yoc29hcC0+dG1wYnVmKTsKKyAgICB3aGlsZSAoYyAhPSAnPScgJiYgYyAhPSAnPicgJiYgYyAhPSAnLycgJiYgc29hcF9ub3RibGFuayhjKSkKKyAgICB7IGlmICgtLWkgPiAwKQorICAgICAgICAqcysrID0gKGNoYXIpYzsKKyAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgfQorICAgICpzID0gJ1wwJzsKKyAgICBpZiAoaSA9PSBzaXplb2Yoc29hcC0+dG1wYnVmKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfU1lOVEFYX0VSUk9SOworI2lmZGVmIFdJVEhfRE9NCisgICAgLyogYWRkIGF0dHJpYnV0ZSBuYW1lIHRvIGRvbSAqLworICAgIGlmIChhdHQpCisgICAgeyAqYXR0ID0gKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZihzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlKSk7CisgICAgICAgaWYgKCEqYXR0KQorICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICAgKCphdHQpLT5uZXh0ID0gTlVMTDsKKyAgICAgICAoKmF0dCktPm5zdHIgPSBOVUxMOworICAgICAgICgqYXR0KS0+bmFtZSA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPnRtcGJ1Zik7CisgICAgICAgKCphdHQpLT5kYXRhID0gTlVMTDsKKyAgICAgICAoKmF0dCktPndpZGUgPSBOVUxMOworICAgICAgICgqYXR0KS0+c29hcCA9IHNvYXA7CisgICAgfQorI2VuZGlmCisgICAgaWYgKCFzdHJuY21wKHNvYXAtPnRtcGJ1ZiwgInhtbG5zIiwgNSkpCisgICAgeyBpZiAoc29hcC0+dG1wYnVmWzVdID09ICc6JykKKyAgICAgIHsgc29hcC0+dG1wYnVmWzVdID0gJ1wwJzsKKyAgICAgICAgdCA9IHNvYXAtPnRtcGJ1ZiArIDY7CisgICAgICB9CisgICAgICBlbHNlIGlmIChzb2FwLT50bXBidWZbNV0pCisgICAgICAgIHQgPSBOVUxMOworICAgICAgZWxzZQorICAgICAgICB0ID0gU09BUF9TVFJfRU9TOworICAgIH0KKyAgICBlbHNlCisgICAgICB0ID0gTlVMTDsKKyAgICBmb3IgKHRwID0gc29hcC0+YXR0cmlidXRlczsgdHA7IHRwID0gdHAtPm5leHQpCisgICAgeyBpZiAoIVNPQVBfU1RSQ01QKHRwLT5uYW1lLCBzb2FwLT50bXBidWYpKQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCF0cCkKKyAgICB7IHRwID0gKHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2F0dHJpYnV0ZSkgKyBzdHJsZW4oc29hcC0+dG1wYnVmKSk7CisgICAgICBpZiAoIXRwKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgIHN0cmNweSh0cC0+bmFtZSwgc29hcC0+dG1wYnVmKTsKKyAgICAgIHRwLT52YWx1ZSA9IE5VTEw7CisgICAgICB0cC0+c2l6ZSA9IDA7CisgICAgICB0cC0+bmV4dCA9IHNvYXAtPmF0dHJpYnV0ZXM7CisgICAgICBzb2FwLT5hdHRyaWJ1dGVzID0gdHA7CisgICAgfQorICAgIHdoaWxlIChzb2FwX2JsYW5rKGMpKQorICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICBpZiAoYyA9PSAnPScpCisgICAgeyBkbyBjID0gc29hcF9nZXR1dGY4KHNvYXApOworICAgICAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworICAgICAgaWYgKGMgIT0gU09BUF9RVCAmJiBjICE9IFNPQVBfQVApCisgICAgICB7IHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgIGMgPSAnICc7IC8qIGJsYW5rIGRlbGltaXRlciAqLworICAgICAgfQorICAgICAgaWYgKHNvYXBfZ2V0YXR0cnZhbChzb2FwLCB0cC0+dmFsdWUsIHRwLT5zaXplLCBjKSkKKyAgICAgIHsKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgICAgICAgaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfRU9NKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworCWlmIChzb2FwX3N0b3JlX2xhYihzb2FwLCB0cC0+dmFsdWUsIHRwLT5zaXplKSkKKwkgIHJldHVybiBzb2FwLT5lcnJvcjsKKwlpZiAodHAtPnZhbHVlKQorCSAgU09BUF9GUkVFKHNvYXAsIHRwLT52YWx1ZSk7CisJZm9yICg7OykKKwl7IGlmIChzb2FwX2dldGF0dHJ2YWwoc29hcCwgc29hcC0+bGFiYnVmICsgc29hcC0+bGFiaWR4LCBzb2FwLT5sYWJsZW4gLSBzb2FwLT5sYWJpZHgsIGMpKQorCSAgeyBpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9FT00pCisJICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworCSAgICBzb2FwLT5sYWJpZHggPSBzb2FwLT5sYWJsZW47CisJICAgIGlmIChzb2FwX2FwcGVuZF9sYWIoc29hcCwgTlVMTCwgMCkpCisJICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworCSAgfQorCSAgZWxzZQorCSAgICBicmVhazsKKwl9CisJaWYgKHNvYXAtPmxhYmlkeCkKKyAgICAgICAgICB0cC0+c2l6ZSA9IHNvYXAtPmxhYmxlbjsKKwllbHNlCisJeyB0cC0+c2l6ZSA9IHN0cmxlbihzb2FwLT5sYWJidWYpICsgMTsKKyAgICAgICAgICBpZiAodHAtPnNpemUgPCBTT0FQX0xBQkxFTikKKwkgICAgdHAtPnNpemUgPSBTT0FQX0xBQkxFTjsKKyAgICAgICAgfQorCWlmICghKHRwLT52YWx1ZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCB0cC0+c2l6ZSkpKQorCSAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgICAgIHN0cmNweSh0cC0+dmFsdWUsIHNvYXAtPmxhYmJ1Zik7CisjZWxzZQorCXNpemVfdCBuOworICAgICAgICBpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9FT00pCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgICAgICAgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsgaWYgKCEocyA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgU09BUF9CTEtMRU4pKSkKKyAgICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgICBpZiAoc29hcF9nZXRhdHRydmFsKHNvYXAsIHMsIFNPQVBfQkxLTEVOLCBjKSkKKyAgICAgICAgICB7IGlmIChzb2FwLT5lcnJvciAhPSBTT0FQX0VPTSkKKyAgICAgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCW4gPSB0cC0+c2l6ZSArIHNvYXAtPmJsaXN0LT5zaXplOworICAgICAgICBpZiAoIShzID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIG4pKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgICAgaWYgKHRwLT52YWx1ZSkKKyAgICAgICAgeyBtZW1jcHkocywgdHAtPnZhbHVlLCB0cC0+c2l6ZSk7CisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHRwLT52YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgc29hcF9zYXZlX2Jsb2NrKHNvYXAsIHMgKyB0cC0+c2l6ZSwgMCk7CisgICAgICAgIHRwLT52YWx1ZSA9IHM7CisgICAgICAgIHRwLT5zaXplID0gbjsKKyNlbmRpZgorICAgICAgfQorICAgICAgZG8gYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgIHdoaWxlIChzb2FwX2JsYW5rKGMpKTsKKyAgICAgIHRwLT52aXNpYmxlID0gMjsgLyogc2VlbiB0aGlzIGF0dHJpYnV0ZSB3LyB2YWx1ZSAqLworI2lmZGVmIFdJVEhfRE9NCisgICAgICBpZiAoYXR0KQorICAgICAgICAoKmF0dCktPmRhdGEgPSBzb2FwX3N0cmR1cChzb2FwLCB0cC0+dmFsdWUpOworI2VuZGlmCisgICAgfQorICAgIGVsc2UKKyAgICAgIHRwLT52aXNpYmxlID0gMTsgLyogc2VlbiB0aGlzIGF0dHJpYnV0ZSB3L28gdmFsdWUgKi8KKyNpZmRlZiBXSVRIX0RPTQorICAgIGlmIChhdHQpCisgICAgICBhdHQgPSAmKCphdHQpLT5uZXh0OworI2VuZGlmCisgICAgaWYgKHQgJiYgdHAtPnZhbHVlKQorICAgIHsgaWYgKHNvYXBfcHVzaF9uYW1lc3BhY2Uoc29hcCwgdCwgdHAtPnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgdHAtPnZpc2libGUgPSAwOworICAgIH0KKyAgfQorI2lmZGVmIFdJVEhfRE9NCisgIGlmIChhdHQpCisgIHsgc29hcC0+ZG9tLT5uc3RyID0gc29hcF9jdXJyZW50X25hbWVzcGFjZShzb2FwLCBzb2FwLT50YWcpOworICAgIGZvciAoYXR0ID0gJnNvYXAtPmRvbS0+YXR0czsgKmF0dDsgYXR0ID0gJigqYXR0KS0+bmV4dCkKKyAgICAgICgqYXR0KS0+bnN0ciA9IHNvYXBfY3VycmVudF9uYW1lc3BhY2Uoc29hcCwgKCphdHQpLT5uYW1lKTsKKyAgfQorI2VuZGlmCisgIGlmICgoaW50KWMgPT0gRU9GKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICBpZiAoIShzb2FwLT5ib2R5ID0gKGMgIT0gJy8nKSkpCisgICAgZG8gYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICB3aGlsZSAoc29hcF9ibGFuayhjKSk7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pCisgIHsgaWYgKCFzb2FwLT5ib2R5ICYmIHNvYXAtPmRvbS0+cHJudCkKKyAgICAgIHNvYXAtPmRvbSA9IHNvYXAtPmRvbS0+cHJudDsKKyAgfQorI2VuZGlmCisgIGZvciAodHAgPSBzb2FwLT5hdHRyaWJ1dGVzOyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgeyBpZiAodHAtPnZpc2libGUgJiYgdHAtPnZhbHVlKQorICAgIHsgaWYgKCFzdHJjbXAodHAtPm5hbWUsICJpZCIpKQorICAgICAgeyAqc29hcC0+aWQgPSAnIyc7CisgICAgICAgIHN0cm5jcHkoc29hcC0+aWQgKyAxLCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT5pZCkgLSAyKTsKKyAgICAgICAgc29hcC0+aWRbc2l6ZW9mKHNvYXAtPmlkKS0xXSA9ICdcMCc7CisgICAgICB9CisgICAgICBlbHNlIGlmICghc3RyY21wKHRwLT5uYW1lLCAiaHJlZiIpKQorICAgICAgeyBzdHJuY3B5KHNvYXAtPmhyZWYsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPmhyZWYpIC0gMSk7CisgICAgICAgIHNvYXAtPmhyZWZbc2l6ZW9mKHNvYXAtPmhyZWYpLTFdID0gJ1wwJzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKChzb2FwLT52ZXJzaW9uID09IDIgfHwgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9HUkFQSCkpICYmICFzdHJjbXAodHAtPm5hbWUsICJyZWYiKSkKKyAgICAgIHsgKnNvYXAtPmhyZWYgPSAnIyc7CisgICAgICAgIHN0cm5jcHkoc29hcC0+aHJlZiArIDEsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPmhyZWYpIC0gMik7CisgICAgICAgIHNvYXAtPmhyZWZbc2l6ZW9mKHNvYXAtPmhyZWYpLTFdID0gJ1wwJzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgInhzaTp0eXBlIikpCisgICAgICB7IHN0cm5jcHkoc29hcC0+dHlwZSwgdHAtPnZhbHVlLCBzaXplb2Yoc29hcC0+dHlwZSkgLSAxKTsKKyAgICAgICAgc29hcC0+dHlwZVtzaXplb2Yoc29hcC0+dHlwZSktMV0gPSAnXDAnOworICAgICAgfQorICAgICAgZWxzZSBpZiAoc29hcC0+dmVyc2lvbiA9PSAxICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5DOmFycmF5VHlwZSIpKQorICAgICAgeyBzID0gc29hcF9zdHJyY2hyKHRwLT52YWx1ZSwgJ1snKTsKKyAgICAgICAgaWYgKHMgJiYgKHNpemVfdCkocyAtIHRwLT52YWx1ZSkgPCBzaXplb2Yoc29hcC0+YXJyYXlUeXBlKSkKKyAgICAgICAgeyBzdHJuY3B5KHNvYXAtPmFycmF5VHlwZSwgdHAtPnZhbHVlLCBzIC0gdHAtPnZhbHVlKTsKKyAgICAgICAgICBzb2FwLT5hcnJheVR5cGVbcyAtIHRwLT52YWx1ZV0gPSAnXDAnOworICAgICAgICAgIHN0cm5jcHkoc29hcC0+YXJyYXlTaXplLCBzLCBzaXplb2Yoc29hcC0+YXJyYXlTaXplKSAtIDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzdHJuY3B5KHNvYXAtPmFycmF5VHlwZSwgdHAtPnZhbHVlLCBzaXplb2Yoc29hcC0+YXJyYXlUeXBlKSAtIDEpOworICAgICAgICBzb2FwLT5hcnJheVNpemVbc2l6ZW9mKHNvYXAtPmFycmF5VHlwZSktMV0gPSAnXDAnOworICAgICAgICBzb2FwLT5hcnJheVR5cGVbc2l6ZW9mKHNvYXAtPmFycmF5VHlwZSktMV0gPSAnXDAnOworICAgICAgfQorICAgICAgZWxzZSBpZiAoc29hcC0+dmVyc2lvbiA9PSAyICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5DOml0ZW1UeXBlIikpCisgICAgICAgIHN0cm5jcHkoc29hcC0+YXJyYXlUeXBlLCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT5hcnJheVR5cGUpIC0gMSk7CisgICAgICBlbHNlIGlmIChzb2FwLT52ZXJzaW9uID09IDIgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTkM6YXJyYXlTaXplIikpCisgICAgICAgIHN0cm5jcHkoc29hcC0+YXJyYXlTaXplLCB0cC0+dmFsdWUsIHNpemVvZihzb2FwLT5hcnJheVNpemUpIC0gMSk7CisgICAgICBlbHNlIGlmIChzb2FwLT52ZXJzaW9uID09IDEgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTkM6b2Zmc2V0IikpCisgICAgICAgIHN0cm5jcHkoc29hcC0+YXJyYXlPZmZzZXQsIHRwLT52YWx1ZSwgc2l6ZW9mKHNvYXAtPmFycmF5T2Zmc2V0KSk7CisgICAgICBlbHNlIGlmIChzb2FwLT52ZXJzaW9uID09IDEgJiYgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAiU09BUC1FTkM6cG9zaXRpb24iKSkKKyAgICAgICAgc29hcC0+cG9zaXRpb24gPSBzb2FwX2dldHBvc2l0aW9uKHRwLT52YWx1ZSwgc29hcC0+cG9zaXRpb25zKTsKKyAgICAgIGVsc2UgaWYgKHNvYXAtPnZlcnNpb24gPT0gMSAmJiAhc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOQzpyb290IikpCisgICAgICAgIHNvYXAtPnJvb3QgPSAoKCFzdHJjbXAodHAtPnZhbHVlLCAiMSIpIHx8ICFzdHJjbXAodHAtPnZhbHVlLCAidHJ1ZSIpKSk7CisgICAgICBlbHNlIGlmICgoc29hcC0+dmVyc2lvbiA9PSAxICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5WOmFjdG9yIikpCisgICAgICAgICAgICB8fCAoc29hcC0+dmVyc2lvbiA9PSAyICYmICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgIlNPQVAtRU5WOnJvbGUiKSkpCisgICAgICB7IGlmICgoIXNvYXAtPmFjdG9yIHx8IHN0cmNtcChzb2FwLT5hY3RvciwgdHAtPnZhbHVlKSkKKyAgICAgICAgICYmIHN0cmNtcCh0cC0+dmFsdWUsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2FjdG9yL25leHQiKQorICAgICAgICAgJiYgc3RyY21wKHRwLT52YWx1ZSwgImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZS9yb2xlL25leHQiKSkKKyAgICAgICAgICBzb2FwLT5vdGhlciA9IDE7CisgICAgICB9CisgICAgICBlbHNlIGlmICghc29hcF9tYXRjaF90YWcoc29hcCwgdHAtPm5hbWUsICJTT0FQLUVOVjptdXN0VW5kZXJzdGFuZCIpCisgICAgICAgICAgICAmJiAoIXN0cmNtcCh0cC0+dmFsdWUsICIxIikgfHwgIXN0cmNtcCh0cC0+dmFsdWUsICJ0cnVlIikpKQorICAgICAgICBzb2FwLT5tdXN0VW5kZXJzdGFuZCA9IDE7CisgICAgICBlbHNlIGlmICgoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRwLT5uYW1lLCAieHNpOm51bGwiKQorICAgICAgICAgICAgIHx8ICFzb2FwX21hdGNoX3RhZyhzb2FwLCB0cC0+bmFtZSwgInhzaTpuaWwiKSkKKyAgICAgICAgICAgICYmICghc3RyY21wKHRwLT52YWx1ZSwgIjEiKQorICAgICAgICAgICAgIHx8ICFzdHJjbXAodHAtPnZhbHVlLCAidHJ1ZSIpKSkKKyAgICAgICAgc29hcC0+bnVsbCA9IDE7CisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3JldHJ5KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIHNvYXBfcmV2ZXJ0KHNvYXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9yZXZlcnQoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmICghc29hcC0+cGVla2VkKQorICB7IHNvYXAtPnBlZWtlZCA9IDE7CisgICAgaWYgKHNvYXAtPmJvZHkpCisgICAgICBzb2FwLT5sZXZlbC0tOworICB9CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmV2ZXJ0aW5nIGxhc3QgZWxlbWVudCAobGV2ZWw9JXUpXG4iLCBzb2FwLT5sZXZlbCkpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3N0cmluZ19vdXQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGludCBmbGFnKQoreyByZWdpc3RlciBjb25zdCBjaGFyICp0OworICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIHJlZ2lzdGVyIHNvYXBfd2NoYXIgbWFzayA9IDB4RkZGRkZGODBVTDsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBzb2FwLT5kb20tPmRhdGEgPSBzb2FwX3N0cmR1cChzb2FwLCBzKTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2VuZGlmCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9DX1VURlNUUklORykKKyAgICBtYXNrID0gMDsKKyAgdCA9IHM7CisgIHdoaWxlICgoYyA9ICp0KyspKQorICB7IHN3aXRjaCAoYykKKyAgICB7IAorICAgIGNhc2UgOToKKyAgICAgIGlmIChmbGFnKQorICAgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfc2VuZF9yYXcoc29hcCwgIiYjeDk7IiwgNSkpCisJICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHMgPSB0OworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAxMDoKKyAgICAgIGlmIChmbGFnIHx8ICEoc29hcC0+bW9kZSAmIFNPQVBfWE1MX0NBTk9OSUNBTCkpCisgICAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiJiN4QTsiLCA1KSkKKwkgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgICAgcyA9IHQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDEzOgorICAgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICImI3hEOyIsIDUpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBzID0gdDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJyYnOgorICAgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICImYW1wOyIsIDUpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBzID0gdDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJzwnOgorICAgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgdCAtIHMgLSAxKSB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsICImbHQ7IiwgNCkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHMgPSB0OworICAgICAgYnJlYWs7CisgICAgY2FzZSAnPic6CisgICAgICBpZiAoIWZsYWcpCisgICAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiJmd0OyIsIDQpKQorCSAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBzID0gdDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJyInOgorICAgICAgaWYgKGZsYWcpCisgICAgICB7IGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHMsIHQgLSBzIC0gMSkgfHwgc29hcF9zZW5kX3Jhdyhzb2FwLCAiJnF1b3Q7IiwgNikpCisJICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHMgPSB0OworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZmRlZiBIQVZFX01CVE9XQworICAgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0NfTUJTVFJJTkcpCisgICAgICB7IHdjaGFyX3Qgd2M7CisgICAgICAgIHJlZ2lzdGVyIGludCBtID0gbWJ0b3djKCZ3YywgdCAtIDEsIE1CX0NVUl9NQVgpOworICAgICAgICBpZiAobSA+IDAgJiYgd2MgIT0gYykKKyAgICAgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfcHV0dXRmOChzb2FwLCB3YykpCisgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisJICBzID0gdCArPSBtIC0gMTsKKwkgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKyNlbmRpZgorICAgICAgaWYgKGMgJiBtYXNrKQorICAgICAgeyBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpIHx8IHNvYXBfcHV0dXRmOChzb2FwLCAodW5zaWduZWQgY2hhciljKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICAgIHMgPSB0OworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcyAtIDEpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3N0cmluZ19pbihzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGZsYWcsIGxvbmcgbWlubGVuLCBsb25nIG1heGxlbikKK3sgcmVnaXN0ZXIgY2hhciAqczsKKyAgY2hhciAqdCA9IE5VTEw7CisgIHJlZ2lzdGVyIHNpemVfdCBpOworICByZWdpc3RlciBsb25nIGwgPSAwOworICByZWdpc3RlciBpbnQgbiA9IDA7CisgIHJlZ2lzdGVyIGludCBtID0gMDsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworI2lmICFkZWZpbmVkKFdJVEhfTEVBTkVSKSAmJiBkZWZpbmVkKEhBVkVfV0NUT01CKQorICBjaGFyIGJ1ZltNQl9MRU5fTUFYID4gOCA/IE1CX0xFTl9NQVggOiA4XTsKKyNlbHNlCisgIGNoYXIgYnVmWzhdOworI2VuZGlmCisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWFkaW5nIHN0cmluZyBjb250ZW50XG4iKSk7CisgIGlmIChzb2FwLT5wZWVrZWQpCisgIHsgaWYgKCFzb2FwLT5ib2R5KQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCpzb2FwLT50YWcpCisgICAgeyBuID0gMTsKKyAgICAgIHNvYXAtPnBlZWtlZCA9IDA7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgdCA9IHNvYXAtPnRtcGJ1ZjsKKyAgICAgIHRbMF0gPSAnPCc7CisgICAgICBzdHJuY3B5KHQgKyAxLCBzb2FwLT50YWcsIHNpemVvZihzb2FwLT50bXBidWYpIC0gMSk7CisgICAgICBzdHJuY2F0KHQsICI+Iiwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZikpOworICAgICAgbSA9IHN0cmxlbihzb2FwLT50YWcpICsgMjsKKyNlbmRpZgorICAgIH0KKyAgfQorI2lmZGVmIFdJVEhfQ0RBVEEKKyAgaWYgKCFmbGFnKQorICB7IHJlZ2lzdGVyIGludCBzdGF0ZSA9IDA7CisjaWZkZWYgV0lUSF9GQVNUCisgICAgc29hcC0+bGFiaWR4ID0gMDsJCQkvKiB1c2UgbG9vay1hc2lkZSBidWZmZXIgKi8KKyNlbHNlCisgICAgaWYgKHNvYXBfbmV3X2Jsb2NrKHNvYXApKQorICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgICBmb3IgKDs7KQorICAgIHsgCisjaWZkZWYgV0lUSF9GQVNUCisgICAgICByZWdpc3RlciBzaXplX3QgazsKKyAgICAgIGlmIChzb2FwX2FwcGVuZF9sYWIoc29hcCwgTlVMTCwgMCkpCS8qIGFsbG9jYXRlIG1vcmUgc3BhY2UgaW4gbG9vay1hc2lkZSBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgcyA9IHNvYXAtPmxhYmJ1ZiArIHNvYXAtPmxhYmlkeDsJLyogc3BhY2UgdG8gcG9wdWxhdGUgKi8KKyAgICAgIGsgPSBzb2FwLT5sYWJsZW4gLSBzb2FwLT5sYWJpZHg7CS8qIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgKi8KKyAgICAgIHNvYXAtPmxhYmlkeCA9IHNvYXAtPmxhYmxlbjsJLyogY2xhaW0gdGhpcyBzcGFjZSAqLworI2Vsc2UKKyAgICAgIHJlZ2lzdGVyIHNpemVfdCBrID0gU09BUF9CTEtMRU47CisgICAgICBpZiAoIShzID0gKGNoYXIqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBrKSkpCisgICAgICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgICAgICBmb3IgKGkgPSAwOyBpIDwgazsgaSsrKQorICAgICAgeyBpZiAobSA+IDApCisgICAgICAgIHsgKnMrKyA9ICp0Kys7CS8qIGNvcHkgbXVsdGlieXRlIGNoYXJhY3RlcnMgKi8KKwkgIG0tLTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworCWlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICBpZiAoYyA+PSAweDgwICYmICEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0xBVElOKSkKKyAgICAgICAgeyBzb2FwX3VuZ2V0KHNvYXAsIGMpOworCSAgYyA9IHNvYXBfZ2V0dXRmOChzb2FwKTsKKwkgIGlmIChzb2FwLT5tb2RlICYgU09BUF9DX1VURlNUUklORykKKyAgICAgICAgICB7IGlmICgoYyAmIDB4ODAwMDAwMDApICYmIGMgPj0gLTB4N0ZGRkZGODAgJiYgYyA8IFNPQVBfQVApCisgICAgICAgICAgICB7IGMgJj0gMHg3RkZGRkZGRjsKKyAgICAgICAgICAgICAgdCA9IGJ1ZjsKKyAgICAgICAgICAgICAgaWYgKGMgPCAweDA4MDApCisgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEMwIHwgKChjID4+IDYpICYgMHgxRikpOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsgaWYgKGMgPCAweDAxMDAwMCkKKyAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhFMCB8ICgoYyA+PiAxMikgJiAweDBGKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsgaWYgKGMgPCAweDIwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEYwIHwgKChjID4+IDE4KSAmIDB4MDcpKTsKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHsgaWYgKGMgPCAweDA0MDAwMDAwKQorICAgICAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhGOCB8ICgoYyA+PiAyNCkgJiAweDAzKSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeyAqdCsrID0gKGNoYXIpKDB4RkMgfCAoKGMgPj4gMzApICYgMHgwMSkpOworICAgICAgICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiAyNCkgJiAweDNGKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDE4KSAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgICAgIH0gICAgIAorICAgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDEyKSAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDYpICYgMHgzRikpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8IChjICYgMHgzRikpOworCSAgICAgIG0gPSAoaW50KSh0IC0gYnVmKSAtIDE7CisgICAgICAgICAgICAgIHQgPSBidWY7CisgICAgICAgICAgICAgICpzKysgPSAqdCsrOworICAgICAgICAgICAgICBjb250aW51ZTsKKwkgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCXN3aXRjaCAoc3RhdGUpCisgICAgICAgIHsgY2FzZSAxOgorICAgICAgICAgICAgaWYgKGMgPT0gJ10nKQorCSAgICAgIHN0YXRlID0gNDsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworCSAgY2FzZSAyOgorCSAgICBpZiAoYyA9PSAnLScpCisgICAgICAgICAgICAgIHN0YXRlID0gNjsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworCSAgY2FzZSAzOgorCSAgICBpZiAoYyA9PSAnPycpCisJICAgICAgc3RhdGUgPSA4OworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisgICAgICAgICAgLyogQ0RBVEEgKi8KKwkgIGNhc2UgNDoKKwkgICAgaWYgKGMgPT0gJ10nKQorICAgICAgICAgICAgICBzdGF0ZSA9IDU7CisJICAgIGVsc2UKKwkgICAgICBzdGF0ZSA9IDE7CisJICAgICpzKysgPSBjOworCSAgICBjb250aW51ZTsKKwkgIGNhc2UgNToKKwkgICAgaWYgKGMgPT0gJz4nKQorCSAgICAgIHN0YXRlID0gMDsKKwkgICAgZWxzZQorCSAgICAgIHN0YXRlID0gMTsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworICAgICAgICAgIC8qIGNvbW1lbnQgKi8KKyAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICBpZiAoYyA9PSAnLScpCisJICAgICAgc3RhdGUgPSA3OworCSAgICBlbHNlCisJICAgICAgc3RhdGUgPSAyOworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgaWYgKGMgPT0gJz4nKQorCSAgICAgIHN0YXRlID0gMDsKKwkgICAgZWxzZQorCSAgICAgIHN0YXRlID0gMjsKKwkgICAgKnMrKyA9IGM7CisJICAgIGNvbnRpbnVlOworICAgICAgICAgIC8qIFBJICovCisJICBjYXNlIDg6CisgICAgICAgICAgICBpZiAoYyA9PSAnPicpCisJICAgICAgc3RhdGUgPSAwOworCSAgICBlbHNlCisJICAgICAgc3RhdGUgPSAzOworCSAgICAqcysrID0gYzsKKwkgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChjKQorICAgICAgICB7CisgICAgICAgIGNhc2UgJy8nOgorICAgICAgICAgIGlmIChuID4gMCkKKyAgICAgICAgICB7IGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgICAgICAgICAgICBpZiAoYyA9PSAnPicpCisgICAgICAgICAgICAgIG4tLTsKKyAgICAgICAgICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICAgICAgICAgfQorICAgICAgICAgICpzKysgPSAnLyc7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzwnOgorCSAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKwkgIGlmIChjID09ICcvJykKKwkgIHsgaWYgKG4gPT0gMCkKKwkgICAgeyBjID0gU09BUF9UVDsKKwkgICAgICBnb3RvIGVuZDsKKwkgICAgfQorCSAgICBuLS07CisJICB9CisJICBlbHNlIGlmIChjID09ICchJykKKwkgIHsgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKwkgICAgaWYgKGMgPT0gJ1snKQorICAgICAgICAgICAgeyBkbyBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICAgICAgICAgICAgICB3aGlsZSAoKGludCljICE9IEVPRiAmJiBjICE9ICdbJyk7CisgICAgICAgICAgICAgIGlmICgoaW50KWMgPT0gRU9GKQorICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKwkgICAgICB0ID0gKGNoYXIqKSIhW0NEQVRBWyI7CisJICAgICAgbSA9IDg7CisJICAgICAgc3RhdGUgPSAxOworCSAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjID09ICctJykKKwkgICAgeyBpZiAoKGMgPSBzb2FwX2dldGNoYXIoc29hcCkpID09ICctJykKKwkgICAgICAgIHN0YXRlID0gMjsKKwkgICAgICB0ID0gKGNoYXIqKSIhLSI7CisJICAgICAgbSA9IDI7CisJICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsgdCA9IChjaGFyKikiISI7CisJICAgICAgbSA9IDE7CisJICAgICAgc29hcF91bmdldChzb2FwLCBjKTsKKwkgICAgfQorCSAgICAqcysrID0gJzwnOworCSAgICBicmVhazsKKwkgIH0KKwkgIGVsc2UgaWYgKGMgPT0gJz8nKQorCSAgICBzdGF0ZSA9IDM7CisJICBlbHNlCisJICAgIG4rKzsKKyAgICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICAgICpzKysgPSAnPCc7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJz4nOgorICAgICAgICAgICpzKysgPSAnPic7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJyInOgorICAgICAgICAgICpzKysgPSAnIic7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZkZWYgSEFWRV9XQ1RPTUIKKyAgICAgICAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfQ19NQlNUUklORykKKyAgICAgICAgICB7IG0gPSB3Y3RvbWIoYnVmLCBjICYgMHg3RkZGRkZGRik7CisgICAgICAgICAgICBpZiAobSA+PSAxICYmIG0gPD0gKGludClNQl9DVVJfTUFYKQorICAgICAgICAgICAgeyB0ID0gYnVmOworICAgICAgICAgICAgICAqcysrID0gKnQrKzsKKyAgICAgICAgICAgICAgbS0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAqcysrID0gU09BUF9VTktOT1dOX0NIQVI7CisJICAgICAgbSA9IDA7CisJICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorI2VuZGlmCisjZW5kaWYKKyAgICAgICAgICAgICpzKysgPSAoY2hhcikoYyAmIDB4RkYpOworICAgICAgICB9CisJbCsrOworICAgICAgICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIG1heGxlbiA+PSAwICYmIGwgPiBtYXhsZW4pCisgICAgICAgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlN0cmluZyB0b28gbG9uZzogbWF4bGVuPSVsZFxuIiwgbWF4bGVuKSk7CisgICAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0xFTkdUSDsKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorI2VuZGlmCisjaWZkZWYgV0lUSF9GQVNUCisgIHNvYXAtPmxhYmlkeCA9IDA7CQkJLyogdXNlIGxvb2stYXNpZGUgYnVmZmVyICovCisjZWxzZQorICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgZm9yICg7OykKKyAgeyAKKyNpZmRlZiBXSVRIX0ZBU1QKKyAgICByZWdpc3RlciBzaXplX3QgazsKKyAgICBpZiAoc29hcF9hcHBlbmRfbGFiKHNvYXAsIE5VTEwsIDApKQkvKiBhbGxvY2F0ZSBtb3JlIHNwYWNlIGluIGxvb2stYXNpZGUgYnVmZmVyIGlmIG5lY2Vzc2FyeSAqLworICAgICAgcmV0dXJuIE5VTEw7CisgICAgcyA9IHNvYXAtPmxhYmJ1ZiArIHNvYXAtPmxhYmlkeDsJLyogc3BhY2UgdG8gcG9wdWxhdGUgKi8KKyAgICBrID0gc29hcC0+bGFibGVuIC0gc29hcC0+bGFiaWR4OwkvKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlICovCisgICAgc29hcC0+bGFiaWR4ID0gc29hcC0+bGFibGVuOwkvKiBjbGFpbSB0aGlzIHNwYWNlICovCisjZWxzZQorICAgIHJlZ2lzdGVyIHNpemVfdCBrID0gU09BUF9CTEtMRU47CisgICAgaWYgKCEocyA9IChjaGFyKilzb2FwX3B1c2hfYmxvY2soc29hcCwgaykpKQorICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgICBmb3IgKGkgPSAwOyBpIDwgazsgaSsrKQorICAgIHsgaWYgKG0gPiAwKQorICAgICAgeyAqcysrID0gKnQrKzsJLyogY29weSBtdWx0aWJ5dGUgY2hhcmFjdGVycyAqLworICAgICAgICBtLS07CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0NfVVRGU1RSSU5HKQorICAgICAgeyBpZiAoKChjID0gc29hcF9nZXQoc29hcCkpICYgMHg4MDAwMDAwMCkgJiYgYyA+PSAtMHg3RkZGRkY4MCAmJiBjIDwgU09BUF9BUCkKKyAgICAgICAgeyBjICY9IDB4N0ZGRkZGRkY7CisgICAgICAgICAgdCA9IGJ1ZjsKKyAgICAgICAgICBpZiAoYyA8IDB4MDgwMCkKKyAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhDMCB8ICgoYyA+PiA2KSAmIDB4MUYpKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeyBpZiAoYyA8IDB4MDEwMDAwKQorICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RTAgfCAoKGMgPj4gMTIpICYgMHgwRikpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyBpZiAoYyA8IDB4MjAwMDAwKQorICAgICAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHhGMCB8ICgoYyA+PiAxOCkgJiAweDA3KSk7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeyBpZiAoYyA8IDB4MDQwMDAwMDApCisgICAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjggfCAoKGMgPj4gMjQpICYgMHgwMykpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7ICp0KysgPSAoY2hhcikoMHhGQyB8ICgoYyA+PiAzMCkgJiAweDAxKSk7CisgICAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMjQpICYgMHgzRikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTgpICYgMHgzRikpOworICAgICAgICAgICAgICB9ICAgICAKKyAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDEyKSAmIDB4M0YpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICp0KysgPSAoY2hhcikoMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKGMgJiAweDNGKSk7CisJICBtID0gKGludCkodCAtIGJ1ZikgLSAxOworICAgICAgICAgIHQgPSBidWY7CisgICAgICAgICAgKnMrKyA9ICp0Kys7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgYyA9IHNvYXBfZ2V0dXRmOChzb2FwKTsKKyAgICAgIHN3aXRjaCAoYykKKyAgICAgIHsKKyAgICAgIGNhc2UgU09BUF9UVDoKKyAgICAgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgbi0tOworICAgICAgICAqcysrID0gJzwnOworICAgICAgICB0ID0gKGNoYXIqKSIvIjsKKwltID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfTFQ6CisgICAgICAgIG4rKzsKKyAgICAgICAgKnMrKyA9ICc8JzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfR1Q6CisgICAgICAgICpzKysgPSAnPic7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTT0FQX1FUOgorICAgICAgICAqcysrID0gJyInOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9BUDoKKyAgICAgICAgKnMrKyA9ICdcJyc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnLyc6CisgICAgICAgIGlmIChuID4gMCkKKyAgICAgICAgeyBjID0gc29hcF9nZXQoc29hcCk7CisgICAgICAgICAgaWYgKGMgPT0gU09BUF9HVCkKKyAgICAgICAgICAgIG4tLTsKKyAgICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICB9CisgICAgICAgICpzKysgPSAnLyc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnPCcgfCAweDgwMDAwMDAwOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gJzwnOworICAgICAgICBlbHNlCisgICAgICAgIHsgKnMrKyA9ICcmJzsKKyAgICAgICAgICB0ID0gKGNoYXIqKSJsdDsiOworCSAgbSA9IDM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICc+JyB8IDB4ODAwMDAwMDA6CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICpzKysgPSAnPic7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAqcysrID0gJyYnOworICAgICAgICAgIHQgPSAoY2hhciopImd0OyI7CisJICBtID0gMzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJyYnIHwgMHg4MDAwMDAwMDoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9ICcmJzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAnJic7CisgICAgICAgICAgdCA9IChjaGFyKikiYW1wOyI7CisJICBtID0gNDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJyInIHwgMHg4MDAwMDAwMDoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9ICciJzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAnJic7CisgICAgICAgICAgdCA9IChjaGFyKikicXVvdDsiOworCSAgbSA9IDU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdcJycgfCAweDgwMDAwMDAwOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gJ1wnJzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAnJic7CisgICAgICAgICAgdCA9IChjaGFyKikiYXBvczsiOworCSAgbSA9IDU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgICBnb3RvIGVuZDsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZmRlZiBIQVZFX1dDVE9NQgorICAgICAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfQ19NQlNUUklORykKKyAgICAgICAgeyBtID0gd2N0b21iKGJ1ZiwgYyAmIDB4N0ZGRkZGRkYpOworICAgICAgICAgIGlmIChtID49IDEgJiYgbSA8PSAoaW50KU1CX0NVUl9NQVgpCisgICAgICAgICAgeyB0ID0gYnVmOworICAgICAgICAgICAgKnMrKyA9ICp0Kys7CisgICAgICAgICAgICBtLS07CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7ICpzKysgPSBTT0FQX1VOS05PV05fQ0hBUjsKKwkgICAgbSA9IDA7CisJICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmCisjZW5kaWYKKyAgICAgICAgICAqcysrID0gKGNoYXIpKGMgJiAweEZGKTsKKyAgICAgIH0KKyAgICAgIGwrKzsKKyAgICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkgJiYgbWF4bGVuID49IDAgJiYgbCA+IG1heGxlbikKKyAgICAgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlN0cmluZyB0b28gbG9uZzogbWF4bGVuPSVsZFxuIiwgbWF4bGVuKSk7CisgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9MRU5HVEg7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgIH0KKyAgfQorZW5kOgorICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAqcyA9ICdcMCc7CisjaWZkZWYgV0lUSF9GQVNUCisgIHQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwLT5sYWJidWYpOworI2Vsc2UKKyAgc29hcF9zaXplX2Jsb2NrKHNvYXAsIGkrMSk7CisgIHQgPSBzb2FwX3NhdmVfYmxvY2soc29hcCwgTlVMTCwgMCk7CisjZW5kaWYKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiBsIDwgbWlubGVuKQorICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJTdHJpbmcgdG9vIHNob3J0OiAlbGQgY2hhcnMsIG1pbmxlbj0lbGRcbiIsIGwsIG1pbmxlbikpOworICAgIHNvYXAtPmVycm9yID0gU09BUF9MRU5HVEg7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgeyBpZiAoZmxhZyA9PSAzKQorICAgICAgc29hcC0+ZG9tLT50YWlsID0gdDsKKyAgICBlbHNlCisgICAgICBzb2FwLT5kb20tPmRhdGEgPSB0OworICB9CisjZW5kaWYKKyAgaWYgKGZsYWcgPT0gMikKKyAgICBpZiAoc29hcF9zMlFOYW1lKHNvYXAsIHQsICZ0KSkKKyAgICAgIHJldHVybiBOVUxMOworICByZXR1cm4gdDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF93c3RyaW5nX291dChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3Qgd2NoYXJfdCAqcywgaW50IGZsYWcpCit7IGNvbnN0IGNoYXIgKnQ7CisgIGNoYXIgdG1wOworICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgIHsgd2NoYXJfdCAqciA9ICh3Y2hhcl90KilzOworICAgIGludCBuID0gMTsKKyAgICB3aGlsZSAoKnIrKykKKyAgICAgIG4rKzsKKyAgICBzb2FwLT5kb20tPndpZGUgPSByID0gKHdjaGFyX3QqKXNvYXBfbWFsbG9jKHNvYXAsIG4gKiBzaXplb2Yod2NoYXJfdCkpOworICAgIHdoaWxlIChuLS0pCisgICAgICAqcisrID0gKnMrKzsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorI2VuZGlmCisgIHdoaWxlICgoYyA9ICpzKyspKQorICB7IHN3aXRjaCAoYykKKyAgICB7IAorICAgIGNhc2UgOToKKyAgICAgIGlmIChmbGFnKQorICAgICAgICB0ID0gIiYjeDk7IjsKKyAgICAgIGVsc2UKKyAgICAgICAgdCA9ICJcdCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEwOgorICAgICAgaWYgKGZsYWcgfHwgIShzb2FwLT5tb2RlICYgU09BUF9YTUxfQ0FOT05JQ0FMKSkKKyAgICAgICAgdCA9ICImI3hBOyI7CisgICAgICBlbHNlCisgICAgICAgIHQgPSAiXG4iOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMzoKKyAgICAgIHQgPSAiJiN4RDsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnJic6CisgICAgICB0ID0gIiZhbXA7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJzwnOgorICAgICAgdCA9ICImbHQ7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJz4nOgorICAgICAgaWYgKGZsYWcpCisgICAgICAgIHQgPSAiPiI7CisgICAgICBlbHNlCisJdCA9ICImZ3Q7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJyInOgorICAgICAgaWYgKGZsYWcpCisgICAgICAgIHQgPSAiJnF1b3Q7IjsKKyAgICAgIGVsc2UKKyAgICAgICAgdCA9ICJcIiI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKGMgPiAwICYmIGMgPCAweDgwKQorICAgICAgeyB0bXAgPSAoY2hhciljOworICAgICAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCAmdG1wLCAxKSkKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICB9CisgICAgICBlbHNlIGlmIChzb2FwX3B1dHV0Zjgoc29hcCwgKHVuc2lnbmVkIGxvbmcpYykpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoc29hcF9zZW5kKHNvYXAsIHQpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit3Y2hhcl90ICoKK1NPQVBfRk1BQzIKK3NvYXBfd3N0cmluZ19pbihzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IGZsYWcsIGxvbmcgbWlubGVuLCBsb25nIG1heGxlbikKK3sgd2NoYXJfdCAqczsKKyAgcmVnaXN0ZXIgaW50IGksIG4gPSAwOworICByZWdpc3RlciBsb25nIGwgPSAwOworICByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIGNvbnN0IGNoYXIgKnQgPSBOVUxMOworICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVhZGluZyB3aWRlIHN0cmluZyBjb250ZW50XG4iKSk7CisgIGlmIChzb2FwLT5wZWVrZWQpCisgIHsgaWYgKCFzb2FwLT5ib2R5KQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCpzb2FwLT50YWcpCisgICAgeyBuID0gMTsKKyAgICAgIHNvYXAtPnBlZWtlZCA9IDA7CisgICAgfQorICB9CisgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgZm9yICg7OykKKyAgeyBpZiAoIShzID0gKHdjaGFyX3QqKXNvYXBfcHVzaF9ibG9jayhzb2FwLCBzaXplb2Yod2NoYXJfdCkqU09BUF9CTEtMRU4pKSkKKyAgICAgIHJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCBTT0FQX0JMS0xFTjsgaSsrKQorICAgIHsgaWYgKHQpCisgICAgICB7ICpzKysgPSAod2NoYXJfdCkqdCsrOworICAgICAgICBpZiAoISp0KQorICAgICAgICAgIHQgPSBOVUxMOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisgICAgICBzd2l0Y2ggKGMpCisgICAgICB7CisgICAgICBjYXNlIFNPQVBfVFQ6CisgICAgICAgIGlmIChuID09IDApCisgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIG4tLTsKKyAgICAgICAgKnMrKyA9ICc8JzsKKyAgICAgICAgc29hcF91bmdldChzb2FwLCAnLycpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9MVDoKKyAgICAgICAgbisrOworICAgICAgICAqcysrID0gJzwnOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU09BUF9HVDoKKyAgICAgICAgKnMrKyA9ICc+JzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNPQVBfUVQ6CisgICAgICAgICpzKysgPSAnIic7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTT0FQX0FQOgorICAgICAgICAqcysrID0gJ1wnJzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICcvJzoKKyAgICAgICAgaWYgKG4gPiAwKQorICAgICAgICB7IGMgPSBzb2FwX2dldHV0Zjgoc29hcCk7CisgICAgICAgICAgaWYgKGMgPT0gU09BUF9HVCkKKyAgICAgICAgICAgIG4tLTsKKyAgICAgICAgICBzb2FwX3VuZ2V0KHNvYXAsIGMpOworICAgICAgICB9CisgICAgICAgICpzKysgPSAnLyc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnPCc6CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICpzKysgPSAoc29hcF93Y2hhciknPCc7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAqcysrID0gKHNvYXBfd2NoYXIpJyYnOworICAgICAgICAgIHQgPSAibHQ7IjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJz4nOgorICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAqcysrID0gKHNvYXBfd2NoYXIpJz4nOworICAgICAgICBlbHNlCisgICAgICAgIHsgKnMrKyA9IChzb2FwX3djaGFyKScmJzsKKyAgICAgICAgICB0ID0gImd0OyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICciJzoKKyAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgKnMrKyA9IChzb2FwX3djaGFyKSciJzsKKyAgICAgICAgZWxzZQorICAgICAgICB7ICpzKysgPSAoc29hcF93Y2hhciknJic7CisgICAgICAgICAgdCA9ICJxdW90OyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgKnMrKyA9ICh3Y2hhcl90KWMgJiAweDdGRkZGRkZGOworICAgICAgfQorICAgICAgbCsrOworICAgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSAmJiBtYXhsZW4gPj0gMCAmJiBsID4gbWF4bGVuKQorICAgICAgeyBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiU3RyaW5nIHRvbyBsb25nOiBtYXhsZW49JWxkXG4iLCBtYXhsZW4pKTsKKyAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0xFTkdUSDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgfQorICB9CitlbmQ6CisgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICpzID0gJ1wwJzsKKyAgc29hcF9zaXplX2Jsb2NrKHNvYXAsIHNpemVvZih3Y2hhcl90KSAqIChpICsgMSkpOworICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpICYmIGwgPCBtaW5sZW4pCisgIHsgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlN0cmluZyB0b28gc2hvcnQ6ICVsZCBjaGFycywgbWlubGVuPSVsZFxuIiwgbCwgbWlubGVuKSk7CisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX0xFTkdUSDsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBzID0gKHdjaGFyX3QqKXNvYXBfc2F2ZV9ibG9jayhzb2FwLCBOVUxMLCAwKTsKKyNpZmRlZiBXSVRIX0RPTQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9ET00pICYmIHNvYXAtPmRvbSkKKyAgICBzb2FwLT5kb20tPndpZGUgPSBzOworI2VuZGlmCisgIHJldHVybiBzOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9pbnQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgaW50IG4pCit7IHJldHVybiBzb2FwX2xvbmcycyhzb2FwLCAobG9uZyluKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRpbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBpbnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfbG9uZzJzKHNvYXAsIChsb25nKSpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMmludChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgaW50ICpwKQoreyBpZiAocykKKyAgeyBjaGFyICpyOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgc29hcF9yZXNldF9lcnJubzsKKyNlbmRpZgorI2VuZGlmCisgICAgKnAgPSAoaW50KXNvYXBfc3RydG9sKHMsICZyLCAxMCk7CisgICAgaWYgKChzID09IHIgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9TVFJJQ1QpKSB8fCAqcgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgIHx8IHNvYXBfZXJybm8gPT0gU09BUF9FUkFOR0UKKyNlbmRpZgorI2VuZGlmCisgICAgKQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5pbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjppbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpzaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAoaW50Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YoaW50KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKGludCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihpbnQpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMmludChzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9sb25nMnMoc3RydWN0IHNvYXAgKnNvYXAsIGxvbmcgbikKK3sgc3ByaW50Zihzb2FwLT50bXBidWYsICIlbGQiLCBuKTsKKyAgcmV0dXJuIHNvYXAtPnRtcGJ1ZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRsb25nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgbG9uZyAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9sb25nMnMoc29hcCwgKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MybG9uZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgbG9uZyAqcCkKK3sgaWYgKHMpCisgIHsgY2hhciAqcjsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgIHNvYXBfcmVzZXRfZXJybm87CisjZW5kaWYKKyNlbmRpZgorICAgICpwID0gc29hcF9zdHJ0b2wocywgJnIsIDEwKTsKKyAgICBpZiAoKHMgPT0gciAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpIHx8ICpyCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgfHwgc29hcF9lcnJubyA9PSBTT0FQX0VSQU5HRQorI2VuZGlmCisjZW5kaWYKKyAgICApCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitsb25nICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5sb25nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGxvbmcgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6Ynl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9IChsb25nKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YobG9uZyksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChsb25nKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKGxvbmcpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMmxvbmcoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfTE9ORzY0MnMoc3RydWN0IHNvYXAgKnNvYXAsIExPTkc2NCBuKQoreyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgU09BUF9MT05HX0ZPUk1BVCwgbik7CisgIHJldHVybiBzb2FwLT50bXBidWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0TE9ORzY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgTE9ORzY0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX0xPTkc2NDJzKHNvYXAsICpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMkxPTkc2NChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgTE9ORzY0ICpwKQoreyBpZiAocykKKyAgeworI2lmZGVmIEhBVkVfU1RSVE9MTAorICAgIGNoYXIgKnI7CisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICBzb2FwX3Jlc2V0X2Vycm5vOworI2VuZGlmCisjZW5kaWYKKyAgICAqcCA9IHN0cnRvbGwocywgJnIsIDEwKTsKKyAgICBpZiAoKHMgPT0gciAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpIHx8ICpyCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgICB8fCBzb2FwX2Vycm5vID09IFNPQVBfRVJBTkdFCisjZW5kaWYKKyNlbmRpZgorICAgICAgKQorI2Vsc2UKKyMgaWZkZWYgSEFWRV9TU0NBTkYKKyAgICBpZiAoc3NjYW5mKHMsIFNPQVBfTE9OR19GT1JNQVQsIHApICE9IDEpCisjIGVuZGlmCisjZW5kaWYKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK0xPTkc2NCAqCitTT0FQX0ZNQUMyCitzb2FwX2luTE9ORzY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIExPTkc2NCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6aW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnBvc2l0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOm5lZ2F0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOm5vblBvc2l0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOm5vbk5lZ2F0aXZlSW50ZWdlciIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmxvbmciKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjppbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpzaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAoTE9ORzY0Kilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCBwLCB0LCBzaXplb2YoTE9ORzY0KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKExPTkc2NCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihMT05HNjQpLCAwLCBOVUxMKTsKKyAgZWxzZSBpZiAocCkKKyAgeyBpZiAoc29hcF9zMkxPTkc2NChzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9ieXRlMnMoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgbikKK3sgcmV0dXJuIHNvYXBfbG9uZzJzKHNvYXAsIChsb25nKW4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dGJ5dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX2xvbmcycyhzb2FwLCAobG9uZykqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJieXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBjaGFyICpwKQoreyBpZiAocykKKyAgeyBsb25nIG47CisgICAgY2hhciAqcjsKKyAgICBuID0gc29hcF9zdHJ0b2wocywgJnIsIDEwKTsKKyAgICBpZiAocyA9PSByIHx8ICpyIHx8IG4gPCAtMTI4IHx8IG4gPiAxMjcpCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICAqcCA9IChjaGFyKW47CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX2luYnl0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBjaGFyICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpieXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKGNoYXIqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihjaGFyKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKGNoYXIqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YoY2hhciksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MyYnl0ZShzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9zaG9ydDJzKHN0cnVjdCBzb2FwICpzb2FwLCBzaG9ydCBuKQoreyByZXR1cm4gc29hcF9sb25nMnMoc29hcCwgKGxvbmcpbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0c2hvcnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzaG9ydCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHNvYXAsIHRhZywgc29hcF9lbWJlZGRlZF9pZChzb2FwLCBpZCwgcCwgbiksIHR5cGUpCisgICB8fCBzb2FwX3N0cmluZ19vdXQoc29hcCwgc29hcF9sb25nMnMoc29hcCwgKGxvbmcpKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3Myc2hvcnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHNob3J0ICpwKQoreyBpZiAocykKKyAgeyBsb25nIG47CisgICAgY2hhciAqcjsKKyAgICBuID0gc29hcF9zdHJ0b2wocywgJnIsIDEwKTsKKyAgICBpZiAocyA9PSByIHx8ICpyIHx8IG4gPCAtMzI3NjggfHwgbiA+IDMyNzY3KQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgKnAgPSAoc2hvcnQpbjsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitzaG9ydCAqCitTT0FQX0ZNQUMyCitzb2FwX2luc2hvcnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgc2hvcnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6Ynl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcCA9IChzaG9ydCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKHNob3J0KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKHNob3J0Kilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKHNob3J0KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJzaG9ydChzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9mbG9hdDJzKHN0cnVjdCBzb2FwICpzb2FwLCBmbG9hdCBuKQoreyBjb25zdCBjaGFyICpzOworICBpZiAoc29hcF9pc25hbigoZG91YmxlKW4pKQorICAgIHMgPSAiTmFOIjsKKyAgZWxzZSBpZiAoc29hcF9pc3BpbmZmKG4pKQorICAgIHMgPSAiSU5GIjsKKyAgZWxzZSBpZiAoc29hcF9pc25pbmZmKG4pKQorICAgIHMgPSAiLUlORiI7CisgIGVsc2UKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1Ziwgc29hcC0+ZmxvYXRfZm9ybWF0LCBuKTsKKyAgICBzID0gc29hcC0+dG1wYnVmOworICB9CisgIHJldHVybiBzOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dGZsb2F0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgZmxvYXQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfZmxvYXQycyhzb2FwLCAqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJmbG9hdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgZmxvYXQgKnApCit7IGlmIChzKQorICB7IGlmICghKnMpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgaWYgKCFzb2FwX3RhZ19jbXAocywgIklORiIpKQorICAgICAgKnAgPSBGTFRfUElORlRZOworICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAocywgIitJTkYiKSkKKyAgICAgICpwID0gRkxUX1BJTkZUWTsKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHMsICItSU5GIikpCisgICAgICAqcCA9IEZMVF9OSU5GVFk7CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChzLCAiTmFOIikpCisgICAgICAqcCA9IEZMVF9OQU47CisgICAgZWxzZQorICAgIHsKKy8qIE9uIHNvbWUgc3lzdGVtcywgc3RydG9mIGFwcGVhcnMgdG8gYmUgYnJva2VuIG9yIGRvZXNuJ3QgbGluazogdXNlIHdpdGggY2F1dGlvbiAqLworI2lmIGRlZmluZWQoSEFWRV9TVFJUT0YpCisgICAgICBjaGFyICpyOworICAgICAgKnAgPSBzdHJ0b2YoKGNoYXIqKXMsICZyKTsKKyAgICAgIGlmICgqcikKKyNlbGlmIGRlZmluZWQoSEFWRV9TVFJUT0QpCisgICAgICBjaGFyICpyOworICAgICAgKnAgPSAoZmxvYXQpc3RydG9kKHMsICZyKTsKKyAgICAgIGlmICgqcikKKyNlbmRpZgorI2lmZGVmIEhBVkVfU1NDQU5GCisgICAgICAgIGlmIChzc2NhbmYocywgIiVnIiwgcCkgIT0gMSkKKyAgICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyNlbHNlCisgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworI2VuZGlmCisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBpbnQgc29hcF9pc251bWVyaWMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnR5cGUpCit7IGlmIChzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpmbG9hdCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmRvdWJsZSIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmRlY2ltYWwiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjppbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6cG9zaXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bmVnYXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bm9uUG9zaXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bm9uTmVnYXRpdmVJbnRlZ2VyIikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6bG9uZyIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOmludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6Ynl0ZSIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkTG9uZyIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkSW50IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRTaG9ydCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkQnl0ZSIpKQorICB7IHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIHNvYXBfcmV2ZXJ0KHNvYXApOworICAgIHJldHVybiBTT0FQX0VSUjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2Zsb2F0ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5mbG9hdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBmbG9hdCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZSAhPSAnXDAnICYmIHNvYXBfaXNudW1lcmljKHNvYXAsIHR5cGUpKQorICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgIHAgPSAoZmxvYXQqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihmbG9hdCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9IChmbG9hdCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZihmbG9hdCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MyZmxvYXQoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZG91YmxlMnMoc3RydWN0IHNvYXAgKnNvYXAsIGRvdWJsZSBuKQoreyBjb25zdCBjaGFyICpzOworICBpZiAoc29hcF9pc25hbihuKSkKKyAgICBzID0gIk5hTiI7CisgIGVsc2UgaWYgKHNvYXBfaXNwaW5mZChuKSkKKyAgICBzID0gIklORiI7CisgIGVsc2UgaWYgKHNvYXBfaXNuaW5mZChuKSkKKyAgICBzID0gIi1JTkYiOworICBlbHNlCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsIHNvYXAtPmRvdWJsZV9mb3JtYXQsIG4pOworICAgIHMgPSBzb2FwLT50bXBidWY7CisgIH0KKyAgcmV0dXJuIHM7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0ZG91YmxlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgZG91YmxlICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX2RvdWJsZTJzKHNvYXAsICpwKSwgMCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMmRvdWJsZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgZG91YmxlICpwKQoreyBpZiAocykKKyAgeyBpZiAoISpzKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgIGlmICghc29hcF90YWdfY21wKHMsICJJTkYiKSkKKyAgICAgICpwID0gREJMX1BJTkZUWTsKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHMsICIrSU5GIikpCisgICAgICAqcCA9IERCTF9QSU5GVFk7CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChzLCAiLUlORiIpKQorICAgICAgKnAgPSBEQkxfTklORlRZOworICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAocywgIk5hTiIpKQorICAgICAgKnAgPSBEQkxfTkFOOworICAgIGVsc2UKKyAgICB7CisjaWZkZWYgSEFWRV9TVFJUT0QKKyAgICAgIGNoYXIgKnI7CisgICAgICAqcCA9IHN0cnRvZChzLCAmcik7CisgICAgICBpZiAoKnIpCisjZW5kaWYKKyNpZmRlZiBIQVZFX1NTQ0FORgorICAgICAgICBpZiAoc3NjYW5mKHMsICIlbGciLCBwKSAhPSAxKQorICAgICAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworI2Vsc2UKKyAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisjZW5kaWYKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorZG91YmxlICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5kb3VibGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgZG91YmxlICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlICE9ICdcMCcgJiYgc29hcF9pc251bWVyaWMoc29hcCwgdHlwZSkpCisgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgcCA9IChkb3VibGUqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihkb3VibGUpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAoZG91YmxlKilzb2FwX2lkX2ZvcndhcmQoc29hcCwgc29hcC0+aHJlZiwgcCwgMCwgdCwgMCwgc2l6ZW9mKGRvdWJsZSksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MyZG91YmxlKHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3Vuc2lnbmVkQnl0ZTJzKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBjaGFyIG4pCit7IHJldHVybiBzb2FwX3Vuc2lnbmVkTG9uZzJzKHNvYXAsICh1bnNpZ25lZCBsb25nKW4pOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHVuc2lnbmVkQnl0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfdW5zaWduZWRMb25nMnMoc29hcCwgKHVuc2lnbmVkIGxvbmcpKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MydW5zaWduZWRCeXRlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBjaGFyICpwKQoreyBpZiAocykKKyAgeyB1bnNpZ25lZCBsb25nIG47CisgICAgY2hhciAqcjsKKyAgICBuID0gc29hcF9zdHJ0b3VsKHMsICZyLCAxMCk7CisgICAgaWYgKHMgPT0gciB8fCAqciB8fCBuID4gMjU1KQorICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgKnAgPSAodW5zaWduZWQgY2hhciluOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK3Vuc2lnbmVkIGNoYXIgKgorU09BUF9GTUFDMgorc29hcF9pbnVuc2lnbmVkQnl0ZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB1bnNpZ25lZCBjaGFyICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgdCkKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCB0YWcsIDApKQorICAgIHJldHVybiBOVUxMOworI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAodW5zaWduZWQgY2hhciopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAodW5zaWduZWQgY2hhciopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZih1bnNpZ25lZCBjaGFyKSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJ1bnNpZ25lZEJ5dGUoc29hcCwgc29hcF92YWx1ZShzb2FwKSwgcCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfdW5zaWduZWRTaG9ydDJzKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBzaG9ydCBuKQoreyByZXR1cm4gc29hcF91bnNpZ25lZExvbmcycyhzb2FwLCAodW5zaWduZWQgbG9uZyluKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXR1bnNpZ25lZFNob3J0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgdW5zaWduZWQgc2hvcnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfdW5zaWduZWRMb25nMnMoc29hcCwgKHVuc2lnbmVkIGxvbmcpKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MydW5zaWduZWRTaG9ydChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgdW5zaWduZWQgc2hvcnQgKnApCit7IGlmIChzKQorICB7IHVuc2lnbmVkIGxvbmcgbjsKKyAgICBjaGFyICpyOworICAgIG4gPSBzb2FwX3N0cnRvdWwocywgJnIsIDEwKTsKKyAgICBpZiAocyA9PSByIHx8ICpyIHx8IG4gPiA2NTUzNSkKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICAgICpwID0gKHVuc2lnbmVkIHNob3J0KW47CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordW5zaWduZWQgc2hvcnQgKgorU09BUF9GTUFDMgorc29hcF9pbnVuc2lnbmVkU2hvcnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgdW5zaWduZWQgc2hvcnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTgorICBpZiAoKnNvYXAtPnR5cGUKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsIHR5cGUpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkU2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHAgPSAodW5zaWduZWQgc2hvcnQqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZih1bnNpZ25lZCBzaG9ydCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9ICh1bnNpZ25lZCBzaG9ydCopc29hcF9pZF9mb3J3YXJkKHNvYXAsIHNvYXAtPmhyZWYsIHAsIDAsIHQsIDAsIHNpemVvZih1bnNpZ25lZCBzaG9ydCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MydW5zaWduZWRTaG9ydChzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF91bnNpZ25lZEludDJzKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBpbnQgbikKK3sgcmV0dXJuIHNvYXBfdW5zaWduZWRMb25nMnMoc29hcCwgKHVuc2lnbmVkIGxvbmcpbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0dW5zaWduZWRJbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCB1bnNpZ25lZCBpbnQgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfdW5zaWduZWRMb25nMnMoc29hcCwgKHVuc2lnbmVkIGxvbmcpKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MydW5zaWduZWRJbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCAqcCkKK3sgaWYgKHMpCisgIHsgY2hhciAqcjsKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgIHNvYXBfcmVzZXRfZXJybm87CisjZW5kaWYKKyNlbmRpZgorICAgICpwID0gKHVuc2lnbmVkIGludClzb2FwX3N0cnRvdWwocywgJnIsIDEwKTsKKyAgICBpZiAoKHMgPT0gciAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpIHx8ICpyCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgfHwgc29hcF9lcnJubyA9PSBTT0FQX0VSQU5HRQorI2VuZGlmCisjZW5kaWYKKyAgICApCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit1bnNpZ25lZCBpbnQgKgorU09BUF9GTUFDMgorc29hcF9pbnVuc2lnbmVkSW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIGludCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRJbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZFNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRCeXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKHVuc2lnbmVkIGludCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKHVuc2lnbmVkIGludCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9ICh1bnNpZ25lZCBpbnQqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YodW5zaWduZWQgaW50KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJ1bnNpZ25lZEludChzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF91bnNpZ25lZExvbmcycyhzdHJ1Y3Qgc29hcCAqc29hcCwgdW5zaWduZWQgbG9uZyBuKQoreyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIiVsdSIsIG4pOworICByZXR1cm4gc29hcC0+dG1wYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHVuc2lnbmVkTG9uZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfdW5zaWduZWRMb25nMnMoc29hcCwgKnApLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX291dChzb2FwLCB0YWcpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3MydW5zaWduZWRMb25nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBsb25nICpwKQoreyBpZiAocykKKyAgeyBjaGFyICpyOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgc29hcF9yZXNldF9lcnJubzsKKyNlbmRpZgorI2VuZGlmCisgICAgKnAgPSBzb2FwX3N0cnRvdWwocywgJnIsIDEwKTsKKyAgICBpZiAoKHMgPT0gciAmJiAoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NUUklDVCkpIHx8ICpyCisjaWZuZGVmIFdJVEhfTk9JTworI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgfHwgc29hcF9lcnJubyA9PSBTT0FQX0VSQU5HRQorI2VuZGlmCisjZW5kaWYKKyAgICApCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgfQorICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCit1bnNpZ25lZCBsb25nICoKK1NPQVBfRk1BQzIKK3NvYXBfaW51bnNpZ25lZExvbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgdW5zaWduZWQgbG9uZyAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRJbnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZFNob3J0IikKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6dW5zaWduZWRCeXRlIikpCisgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX1RZUEU7CisgICAgc29hcF9yZXZlcnQoc29hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorICBwID0gKHVuc2lnbmVkIGxvbmcqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZih1bnNpZ25lZCBsb25nKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKHVuc2lnbmVkIGxvbmcqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YodW5zaWduZWQgbG9uZyksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MydW5zaWduZWRMb25nKHNvYXAsIHNvYXBfdmFsdWUoc29hcCksIHApKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX1VMT05HNjQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgVUxPTkc2NCBuKQoreyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgU09BUF9VTE9OR19GT1JNQVQsIG4pOworICByZXR1cm4gc29hcC0+dG1wYnVmOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dFVMT05HNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBVTE9ORzY0ICpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikKK3sgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgdGFnLCBzb2FwX2VtYmVkZGVkX2lkKHNvYXAsIGlkLCBwLCBuKSwgdHlwZSkKKyAgIHx8IHNvYXBfc3RyaW5nX291dChzb2FwLCBzb2FwX1VMT05HNjQycyhzb2FwLCAqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJVTE9ORzY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBVTE9ORzY0ICpwKQoreyBpZiAocykKKyAgeworI2lmZGVmIEhBVkVfU1RSVE9VTEwKKyAgICBjaGFyICpyOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgc29hcF9yZXNldF9lcnJubzsKKyNlbmRpZgorI2VuZGlmCisgICAgKnAgPSBzdHJ0b3VsbChzLCAmciwgMTApOworICAgIGlmICgocyA9PSByICYmIChzb2FwLT5tb2RlICYgU09BUF9YTUxfU1RSSUNUKSkgfHwgKnIKKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFdJVEhfTEVBTgorICAgICAgIHx8IHNvYXBfZXJybm8gPT0gU09BUF9FUkFOR0UKKyNlbmRpZgorI2VuZGlmCisgICAgICApCisjZWxzZQorIyBpZmRlZiBIQVZFX1NTQ0FORgorICAgIGlmIChzc2NhbmYocywgU09BUF9VTE9OR19GT1JNQVQsIHApICE9IDEpCisjIGVuZGlmCisjZW5kaWYKKyAgICAgIHNvYXAtPmVycm9yID0gU09BUF9UWVBFOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK1VMT05HNjQgKgorU09BUF9GTUFDMgorc29hcF9pblVMT05HNjQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgVUxPTkc2NCAqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQpCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAwKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKCpzb2FwLT50eXBlCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCB0eXBlKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpwb3NpdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjpub25OZWdhdGl2ZUludGVnZXIiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZExvbmciKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEludCIpCisgICAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCBzb2FwLT50eXBlLCAiOnVuc2lnbmVkU2hvcnQiKQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgIjp1bnNpZ25lZEJ5dGUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwID0gKFVMT05HNjQqKXNvYXBfaWRfZW50ZXIoc29hcCwgc29hcC0+aWQsIHAsIHQsIHNpemVvZihVTE9ORzY0KSwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKFVMT05HNjQqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YoVUxPTkc2NCksIDAsIE5VTEwpOworICBlbHNlIGlmIChwKQorICB7IGlmIChzb2FwX3MyVUxPTkc2NChzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJzdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGNoYXIgKip0KQoreyAqdCA9IE5VTEw7CisgIGlmIChzKQorICB7IGlmICghKCp0ID0gc29hcF9zdHJkdXAoc29hcCwgcykpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgaWYgKCEoc29hcC0+bW9kZSAmIChTT0FQX0VOQ19MQVRJTiB8IFNPQVBfQ19VVEZTVFJJTkcpKSkKKyAgICB7IC8qIFRPRE86IGNvbnNpZGVyIHRydW5jYXRpbmcgVVRGOCB0byBBU0NJSSBmb3IgcmVndWxhciBYTUwgYXR0cmlidXRlIHN0cmluZ3M/ICovCisgICAgfQorICB9CisgIHJldHVybiBzb2FwLT5lcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMlFOYW1lKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBjaGFyICoqdCkKK3sgaWYgKHMpCisgIHsgc3RydWN0IHNvYXBfbmxpc3QgKm5wOworICAgIGNvbnN0IGNoYXIgKnA7CisgICAgaWYgKCFzdHJuY21wKHMsICJ4bWw6IiwgNCkpCisgICAgeyAqdCA9IHNvYXBfc3RyZHVwKHNvYXAsIHMpOworICAgICAgcmV0dXJuIFNPQVBfT0s7CisgICAgfQorICAgIG5wID0gc29hcC0+bmxpc3Q7CisgICAgcCA9IHN0cmNocihzLCAnOicpOworICAgIGlmIChwKQorICAgIHsgcmVnaXN0ZXIgaW50IG4gPSBwIC0gczsKKyAgICAgIHdoaWxlIChucCAmJiAoc3RybmNtcChucC0+aWQsIHMsIG4pIHx8IG5wLT5pZFtuXSkpCisgICAgICAgIG5wID0gbnAtPm5leHQ7CisgICAgICBwKys7CisgICAgfQorICAgIGVsc2UKKyAgICB7IHdoaWxlIChucCAmJiAqbnAtPmlkKQorICAgICAgICBucCA9IG5wLT5uZXh0OworICAgICAgcCA9IHM7CisgICAgfQorICAgIGlmIChucCkKKyAgICB7IGlmIChucC0+aW5kZXggPj0gMCAmJiBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzKQorICAgICAgeyByZWdpc3RlciBjb25zdCBjaGFyICpxID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tucC0+aW5kZXhdLmlkOworICAgICAgICBpZiAocSkKKyAgICAgICAgeyBpZiAoKCp0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihwKSArIHN0cmxlbihxKSArIDIpKSkKKyAgICAgICAgICAgIHNwcmludGYoKnQsICIlczolcyIsIHEsIHApOworICAgICAgICAgIHJldHVybiBTT0FQX09LOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAobnAtPm5zKQorICAgICAgeyBpZiAoKCp0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihwKSArIHN0cmxlbihucC0+bnMpICsgNCkpKQorICAgICAgICAgIHNwcmludGYoKnQsICJcIiVzXCI6JXMiLCBucC0+bnMsIHApOworICAgICAgICByZXR1cm4gU09BUF9PSzsKKyAgICAgIH0KKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTmFtZXNwYWNlIHByZWZpeCBvZiAnJXMnIG5vdCBkZWZpbmVkIChpbmRleD0lZCwgVVJJPSVzKVxuIiwgcywgbnAtPmluZGV4LCBucC0+bnM/bnAtPm5zOiIiKSk7CisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX05BTUVTUEFDRTsgCisgICAgfQorICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTmFtZXNwYWNlIHByZWZpeCBvZiAnJXMnIG5vdCBkZWZpbmVkLCBhc3N1bWluZyBlbXB0eSBuYW1lc3BhY2VcbiIsIHMpKTsKKyAgICBpZiAoKCp0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihwKSArIDQpKSkKKyAgICAgIHNwcmludGYoKnQsICJcIlwiOiVzIiwgcCk7CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfUU5hbWUycyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcykKK3sgc3RydWN0IE5hbWVzcGFjZSAqcDsKKyAgY2hhciAqdDsKKyAgaW50IG47CisgIGlmICghcyB8fCAqcyAhPSAnIicpCisgIHsKKyNpZm5kZWYgV0lUSF9MRUFOCisgICAgaWYgKHMgJiYgKHNvYXAtPm1vZGUgJiBTT0FQX1hNTF9DQU5PTklDQUwpKQorICAgIHsgdCA9IChjaGFyKilzdHJjaHIocywgJzonKTsKKyAgICAgIGlmICh0KQorICAgICAgICBzb2FwX3V0aWxpemVfbnMoc29hcCwgcywgdCAtIHMpOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBzOworICB9CisgIHMrKzsKKyAgaWYgKChwID0gc29hcC0+bG9jYWxfbmFtZXNwYWNlcykpCisgIHsgZm9yICg7IHAtPmlkOyBwKyspCisgICAgeyBpZiAocC0+bnMpCisgICAgICAgIGlmICghc29hcF90YWdfY21wKHMsIHAtPm5zKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIGlmIChwLT5pbikKKyAgICAgICAgaWYgKCFzb2FwX3RhZ19jbXAocywgcC0+aW4pKQorICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAocCAmJiBwLT5pZCkKKyAgICB7IHMgPSBzdHJjaHIocywgJyInKTsKKyAgICAgIGlmIChzKQorICAgICAgeyB0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihwLT5pZCkgKyBzdHJsZW4ocykpOworICAgICAgICBzdHJjcHkodCwgcC0+aWQpOworCXN0cmNhdCh0LCBzICsgMSk7CisgICAgICAgIHJldHVybiB0OworICAgICAgfQorICAgIH0KKyAgfQorICB0ID0gKGNoYXIqKXN0cmNocihzLCAnIicpOworICBpZiAodCkKKyAgICBuID0gdCAtIHM7CisgIGVsc2UKKyAgICBuID0gMDsKKyAgdCA9IHNvYXBfc3RyZHVwKHNvYXAsIHMpOworICB0W25dID0gJ1wwJzsKKyAgc3ByaW50Zihzb2FwLT50bXBidWYsICJ4bWxuczpfJWQiLCBzb2FwLT5pZG51bSsrKTsKKyAgc29hcF9zZXRfYXR0cihzb2FwLCBzb2FwLT50bXBidWYsIHQpOworICBzID0gc3RyY2hyKHMsICciJyk7CisgIGlmIChzKQorICB7IHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc3RybGVuKHNvYXAtPnRtcGJ1ZikgKyBzdHJsZW4ocykgLSA2KTsKKyAgICBzdHJjcHkodCwgc29hcC0+dG1wYnVmICsgNik7CisgICAgc3RyY2F0KHQsIHMgKyAxKTsKKyAgfQorICByZXR1cm4gdDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zMndjaGFyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCB3Y2hhcl90ICoqdCkKK3sgd2NoYXJfdCAqcjsKKyAgaWYgKCFzKQorICAgICp0ID0gTlVMTDsKKyAgZWxzZQorICB7ICp0ID0gciA9ICh3Y2hhcl90Kilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yod2NoYXJfdCkgKiAoc3RybGVuKHMpICsgMSkpOworICAgIGlmICghcikKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0xBVElOKQorICAgIHsgd2hpbGUgKCpzKQorICAgICAgICAqcisrID0gKHdjaGFyX3QpKnMrKzsKKyAgICB9CisgICAgZWxzZQorICAgIHsgLyogQ29udmVydCBVVEY4IHRvIHdjaGFyICovCisgICAgICB3aGlsZSAoKnMpCisgICAgICB7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYywgYzEsIGMyLCBjMywgYzQ7CisgICAgICAgIGMgPSAqcysrOworICAgICAgICBpZiAoYyA8IDB4ODApCisJICAqcisrID0gKHdjaGFyX3QpYzsKKwllbHNlCisgICAgICAgIHsgYzEgPSAoc29hcF93Y2hhcikqcysrICYgMHgzRjsKKyAgICAgICAgICBpZiAoYyA8IDB4RTApCisgICAgICAgICAgICAqcisrID0gKHdjaGFyX3QpKCgoc29hcF93Y2hhcikoYyAmIDB4MUYpIDw8IDYpIHwgYzEpOworICAgICAgICAgIGVsc2UKKwkgIHsgYzIgPSAoc29hcF93Y2hhcikqcysrICYgMHgzRjsKKyAgICAgICAgICAgIGlmIChjIDwgMHhGMCkKKyAgICAgICAgICAgICAgKnIrKyA9ICh3Y2hhcl90KSgoKHNvYXBfd2NoYXIpKGMgJiAweDBGKSA8PCAxMikgfCAoYzEgPDwgNikgfCBjMik7CisgICAgICAgICAgICBlbHNlCisJICAgIHsgYzMgPSAoc29hcF93Y2hhcikqcysrICYgMHgzRjsKKyAgICAgICAgICAgICAgaWYgKGMgPCAweEY4KQorICAgICAgICAgICAgICAgICpyKysgPSAod2NoYXJfdCkoKChzb2FwX3djaGFyKShjICYgMHgwNykgPDwgMTgpIHwgKGMxIDw8IDEyKSB8IChjMiA8PCA2KSB8IGMzKTsKKyAgICAgICAgICAgICAgZWxzZQorCSAgICAgIHsgYzQgPSAoc29hcF93Y2hhcikqcysrICYgMHgzRjsKKyAgICAgICAgICAgICAgICBpZiAoYyA8IDB4RkMpCisgICAgICAgICAgICAgICAgICAqcisrID0gKHdjaGFyX3QpKCgoc29hcF93Y2hhcikoYyAmIDB4MDMpIDw8IDI0KSB8IChjMSA8PCAxOCkgfCAoYzIgPDwgMTIpIHwgKGMzIDw8IDYpIHwgYzQpOworICAgICAgICAgICAgICAgIGVsc2UKKwkJICAqcisrID0gKHdjaGFyX3QpKCgoc29hcF93Y2hhcikoYyAmIDB4MDEpIDw8IDMwKSB8IChjMSA8PCAyNCkgfCAoYzIgPDwgMTgpIHwgKGMzIDw8IDEyKSB8IChjNCA8PCA2KSB8IChzb2FwX3djaGFyKSgqcysrICYgMHgzRikpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgICpyID0gTCdcMCc7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF93Y2hhcjJzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB3Y2hhcl90ICpzKQoreyByZWdpc3RlciBzb2FwX3djaGFyIGM7CisgIHJlZ2lzdGVyIGNoYXIgKnIsICp0OworICBjb25zdCB3Y2hhcl90ICpxID0gczsKKyAgc2l6ZV90IG4gPSAwOworICB3aGlsZSAoKGMgPSAqcSsrKSkKKyAgeyBpZiAoYyA+IDAgJiYgYyA8IDB4ODApCisgICAgICBuKys7CisgICAgZWxzZQorICAgICAgbiArPSA2OworICB9CisgIHIgPSB0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIG4gKyAxKTsKKyAgaWYgKHIpCisgIHsgLyogQ29udmVydCB3Y2hhciB0byBVVEY4ICovCisgICAgd2hpbGUgKChjID0gKnMrKykpCisgICAgeyBpZiAoYyA+IDAgJiYgYyA8IDB4ODApCisgICAgICAgICp0KysgPSAoY2hhciljOworICAgICAgZWxzZQorICAgICAgeyBpZiAoYyA8IDB4MDgwMCkKKyAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4QzAgfCAoKGMgPj4gNikgJiAweDFGKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyBpZiAoYyA8IDB4MDEwMDAwKQorICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEUwIHwgKChjID4+IDEyKSAmIDB4MEYpKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeyBpZiAoYyA8IDB4MjAwMDAwKQorICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4RjAgfCAoKGMgPj4gMTgpICYgMHgwNykpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyBpZiAoYyA8IDB4MDQwMDAwMDApCisgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweEY4IHwgKChjID4+IDI0KSAmIDB4MDMpKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7ICp0KysgPSAoY2hhcikoMHhGQyB8ICgoYyA+PiAzMCkgJiAweDAxKSk7CisgICAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKChjID4+IDI0KSAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTgpICYgMHgzRikpOworICAgICAgICAgICAgfSAgICAgCisgICAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gMTIpICYgMHgzRikpOworICAgICAgICAgIH0KKyAgICAgICAgICAqdCsrID0gKGNoYXIpKDB4ODAgfCAoKGMgPj4gNikgJiAweDNGKSk7CisgICAgICAgIH0KKyAgICAgICAgKnQrKyA9IChjaGFyKSgweDgwIHwgKGMgJiAweDNGKSk7CisgICAgICB9CisgICAgfQorICAgICp0ID0gJ1wwJzsKKyAgfQorICByZXR1cm4gcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9vdXRzdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjaGFyICpjb25zdCpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikgCit7IGlkID0gc29hcF9lbGVtZW50X2lkKHNvYXAsIHRhZywgaWQsICpwLCBOVUxMLCAwLCB0eXBlLCBuKTsKKyAgaWYgKGlkIDwgMAorICAgfHwgc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIGlkLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsICpwLCAwKQorICAgfHwgc29hcF9lbGVtZW50X2VuZF9vdXQoc29hcCwgdGFnKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqKgorU09BUF9GTUFDMgorc29hcF9pbnN0cmluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBjaGFyICoqcCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHQsIGludCBmbGFnLCBsb25nIG1pbmxlbiwgbG9uZyBtYXhsZW4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAxKSkKKyAgeyBpZiAoIXRhZyB8fCAqdGFnICE9ICctJyB8fCBzb2FwLT5lcnJvciAhPSBTT0FQX05PX1RBRykKKyAgICAgIHJldHVybiBOVUxMOworICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgfQorICBpZiAoIXApCisgICAgaWYgKCEocCA9IChjaGFyKiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKGNoYXIqKSkpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIGlmIChzb2FwLT5ib2R5KQorICB7ICpwID0gc29hcF9zdHJpbmdfaW4oc29hcCwgZmxhZywgbWlubGVuLCBtYXhsZW4pOworICAgIGlmICghKnAgfHwgIShjaGFyKilzb2FwX2lkX2VudGVyKHNvYXAsIHNvYXAtPmlkLCAqcCwgdCwgc2l6ZW9mKGNoYXIqKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBlbHNlIGlmIChzb2FwLT5udWxsKQorICAgICpwID0gTlVMTDsKKyAgZWxzZQorICAgICpwID0gKGNoYXIqKVNPQVBfU1RSX0VPUzsKKyAgaWYgKCpzb2FwLT5ocmVmKQorICAgIHAgPSAoY2hhcioqKXNvYXBfaWRfbG9va3VwKHNvYXAsIHNvYXAtPmhyZWYsICh2b2lkKiopcCwgdCwgc2l6ZW9mKGNoYXIqKiksIDApOworICBpZiAoc29hcC0+Ym9keSAmJiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsIHRhZykpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX291dHdzdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCB3Y2hhcl90ICpjb25zdCpwLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbikgCit7IGlkID0gc29hcF9lbGVtZW50X2lkKHNvYXAsIHRhZywgaWQsICpwLCBOVUxMLCAwLCB0eXBlLCBuKTsKKyAgaWYgKGlkIDwgMAorICAgfHwgc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIGlkLCB0eXBlKQorICAgfHwgc29hcF93c3RyaW5nX291dChzb2FwLCAqcCwgMCkKKyAgIHx8IHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZykpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQord2NoYXJfdCAqKgorU09BUF9GTUFDMgorc29hcF9pbndzdHJpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgd2NoYXJfdCAqKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0LCBsb25nIG1pbmxlbiwgbG9uZyBtYXhsZW4pCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAxKSkKKyAgeyBpZiAoIXRhZyB8fCAqdGFnICE9ICctJyB8fCBzb2FwLT5lcnJvciAhPSBTT0FQX05PX1RBRykKKyAgICAgIHJldHVybiBOVUxMOworICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgfQorICBpZiAoIXApCisgICAgaWYgKCEocCA9ICh3Y2hhcl90Kiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKHdjaGFyX3QqKSkpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIGlmIChzb2FwLT5ib2R5KQorICB7ICpwID0gc29hcF93c3RyaW5nX2luKHNvYXAsIDEsIG1pbmxlbiwgbWF4bGVuKTsKKyAgICBpZiAoISpwIHx8ICEod2NoYXJfdCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgKnAsIHQsIHNpemVvZih3Y2hhcl90KiksIDAsIE5VTEwsIE5VTEwsIE5VTEwpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZWxzZSBpZiAoc29hcC0+bnVsbCkKKyAgICAqcCA9IE5VTEw7CisgIGVsc2UKKyAgICAqcCA9ICh3Y2hhcl90KilTT0FQX1NUUl9FT1M7CisgIGlmICgqc29hcC0+aHJlZikKKyAgICBwID0gKHdjaGFyX3QqKilzb2FwX2lkX2xvb2t1cChzb2FwLCBzb2FwLT5ocmVmLCAodm9pZCoqKXAsIHQsIHNpemVvZih3Y2hhcl90KiopLCAwKTsKKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorc3RhdGljIHRpbWVfdAorc29hcF90aW1lZ20oc3RydWN0IHRtICpUKQoreworI2lmIGRlZmluZWQoSEFWRV9USU1FR00pCisgIHJldHVybiB0aW1lZ20oVCk7CisjZWxzZQorICB0aW1lX3QgdCwgZywgejsKKyNpZmRlZiBIQVZFX0dNVElNRV9SCisgIHN0cnVjdCB0bSB0bSwgKnRtcCA9ICZ0bTsKKyNlbHNlCisgIHN0cnVjdCB0bSAqdG1wOworI2VuZGlmCisgIHQgPSBta3RpbWUoVCk7CisgIGlmICh0ID09IC0xKQorICAgIHJldHVybiAtMTsKKyNpZmRlZiBIQVZFX0dNVElNRV9SCisgIGdtdGltZV9yKCZ0LCB0bXApOworI2Vsc2UKKyAgdG1wID0gZ210aW1lKCZ0KTsKKyNlbmRpZgorICB0bXAtPnRtX2lzZHN0ID0gMDsKKyAgZyA9IG1rdGltZSh0bXApOworICBpZiAoZyA9PSAtMSkKKyAgICByZXR1cm4gLTE7CisgIHogPSBnIC0gdDsKKyAgcmV0dXJuIHQgLSB6OworI2VuZGlmCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9kYXRlVGltZTJzKHN0cnVjdCBzb2FwICpzb2FwLCB0aW1lX3QgbikKK3sgc3RydWN0IHRtIFQsICpwVCA9ICZUOworI2lmIGRlZmluZWQoSEFWRV9HTVRJTUVfUikKKyAgaWYgKGdtdGltZV9yKCZuLCBwVCkpCisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTWiIsIHBUKTsKKyAgLyogVGhlIGZvbGxvd2luZyBkZWZpbmVzIHdlcmUgYWRkZWQgZm9yIFZ4V29ya3MqLworI2VsaWYgZGVmaW5lZChIQVZFX1BHTVRJTUVfUikKKyAgaWYgKGdtdGltZV9yKCZuLCBwVCkpCisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTWiIsIHBUKTsKKyNlbGlmIGRlZmluZWQoSEFWRV9QR01USU1FKQorICBpZiAoZ210aW1lKCZuLCBwVCkpCisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTWiIsIHBUKTsKKyNlbGlmIGRlZmluZWQoSEFWRV9HTVRJTUUpCisgIGlmICgocFQgPSBnbXRpbWUoJm4pKSkKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVNaIiwgcFQpOworI2VsaWYgZGVmaW5lZChIQVZFX0dFVFRJTUVPRkRBWSkKKyAgc3RydWN0IHRpbWV6b25lIHR6OworICBtZW1zZXQoKHZvaWQqKSZ0eiwgMCwgc2l6ZW9mKHR6KSk7CisjIGlmIGRlZmluZWQoSEFWRV9MT0NBTFRJTUVfUikKKyAgaWYgKGxvY2FsdGltZV9yKCZuLCBwVCkpCisgIHsgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgZ2V0dGltZW9mZGF5KCZ0diwgJnR6KTsKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwVCk7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYgKyBzdHJsZW4oc29hcC0+dG1wYnVmKSwgIiUrMDNkOiUwMmQiLCAtdHoudHpfbWludXRlc3dlc3QvNjArKHBULT50bV9pc2RzdCE9MCksIGFicyh0ei50el9taW51dGVzd2VzdCklNjApOworICB9CisjIGVsc2UKKyAgaWYgKChwVCA9IGxvY2FsdGltZSgmbikpKQorICB7IHN0cnVjdCB0aW1ldmFsIHR2OworICAgIGdldHRpbWVvZmRheSgmdHYsICZ0eik7CisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmICsgc3RybGVuKHNvYXAtPnRtcGJ1ZiksICIlKzAzZDolMDJkIiwgLXR6LnR6X21pbnV0ZXN3ZXN0LzYwKyhwVC0+dG1faXNkc3QhPTApLCBhYnModHoudHpfbWludXRlc3dlc3QpJTYwKTsKKyAgfQorI2VuZGlmCisjZWxpZiBkZWZpbmVkKEhBVkVfRlRJTUUpCisgIHN0cnVjdCB0aW1lYiB0OworICBtZW1zZXQoKHZvaWQqKSZ0LCAwLCBzaXplb2YodCkpOworIyBpZiBkZWZpbmVkKEhBVkVfTE9DQUxUSU1FX1IpCisgIGlmIChsb2NhbHRpbWVfcigmbiwgcFQpKQorICB7IGZ0aW1lKCZ0KTsKKyAgICBzdHJmdGltZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwVCk7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYgKyBzdHJsZW4oc29hcC0+dG1wYnVmKSwgIiUrMDNkOiUwMmQiLCAtdC50aW1lem9uZS82MCsocFQtPnRtX2lzZHN0IT0wKSwgYWJzKHQudGltZXpvbmUpJTYwKTsKKyAgfQorICAvKiBUaGUgZm9sbG93aW5nIGRlZmluZXMgd2VyZSBhZGRlZCBmb3IgVnhXb3JrcyovCisjIGVsaWYgZGVmaW5lZChIQVZFX1BMT0NBTFRJTUVfUikKKyAgaWYgKGxvY2FsdGltZV9yKCZuLCBwVCkpCisgIHsgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmK3N0cmxlbihzb2FwLT50bXBidWYpLCAiJSswM2Q6JTAyZCIsIHQudGltZXpvbmUvNjAsIGFicyh0LnRpbWV6b25lKSU2MCk7CisgIH0KKyMgZWxzZQorICBpZiAoKHBUID0gbG9jYWx0aW1lKCZuKSkpCisgIHsgZnRpbWUoJnQpOworICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIHN0cmxlbihzb2FwLT50bXBidWYpLCAiJSswM2Q6JTAyZCIsIC10LnRpbWV6b25lLzYwKyhwVC0+dG1faXNkc3QhPTApLCBhYnModC50aW1lem9uZSklNjApOworICB9CisjIGVuZGlmCisjZWxpZiBkZWZpbmVkKEhBVkVfTE9DQUxUSU1FX1IpCisgIGlmIChsb2NhbHRpbWVfcigmbiwgcFQpKQorICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyAgLyogVGhlIGZvbGxvd2luZyBkZWZpbmVzIHdlcmUgYWRkZWQgZm9yIFZ4V29ya3MqLworI2VsaWYgZGVmaW5lZChIQVZFX1BMT0NBTFRJTUVfUikKKyAgaWYgKGxvY2FsdGltZV9yKCZuLCBwVCkpCisgICAgc3RyZnRpbWUoc29hcC0+dG1wYnVmLCBzaXplb2Yoc29hcC0+dG1wYnVmKSwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgcFQpOworI2Vsc2UKKyAgaWYgKChwVCA9IGxvY2FsdGltZSgmbikpKQorICAgIHN0cmZ0aW1lKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksICIlWS0lbS0lZFQlSDolTTolUyIsIHBUKTsKKyNlbmRpZgorICBlbHNlCisgICAgc3RyY3B5KHNvYXAtPnRtcGJ1ZiwgIjE5NjktMTItMzFUMjM6NTk6NTlaIik7CisgIHJldHVybiBzb2FwLT50bXBidWY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0ZGF0ZVRpbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCB0aW1lX3QgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBuKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX291dChzb2FwLCB0YWcsIHNvYXBfZW1iZWRkZWRfaWQoc29hcCwgaWQsIHAsIG4pLCB0eXBlKQorICAgfHwgc29hcF9zdHJpbmdfb3V0KHNvYXAsIHNvYXBfZGF0ZVRpbWUycyhzb2FwLCAqcCksIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsIHRhZyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfczJkYXRlVGltZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgdGltZV90ICpwKQoreyBpZiAocykKKyAgeyBzdHJ1Y3QgdG0gVDsKKyAgICBjaGFyIHpvbmVbMTZdOworICAgIGNvbnN0IGNoYXIgKnQ7CisgICAgbWVtc2V0KCh2b2lkKikmVCwgMCwgc2l6ZW9mKFQpKTsKKyAgICB6b25lW3NpemVvZih6b25lKS0xXSA9ICdcMCc7CisgICAgaWYgKHN0cmNocihzLCAnLScpKQorICAgICAgdCA9ICIlZC0lZC0lZFQlZDolZDolZCUxNXMiOworICAgIGVsc2UgaWYgKHN0cmNocihzLCAnOicpKQorICAgICAgdCA9ICIlNGQlMmQlMmRUJWQ6JWQ6JWQlMTVzIjsKKyAgICBlbHNlIC8qIHBhcnNlIG5vbi1YU0Qtc3RhbmRhcmQgYWx0ZXJuYXRpdmUgSVNPIDg2MDEgZm9ybWF0ICovCisgICAgICB0ID0gIiU0ZCUyZCUyZFQlMmQlMmQlMmQlMTVzIjsKKyAgICBzc2NhbmYocywgdCwgJlQudG1feWVhciwgJlQudG1fbW9uLCAmVC50bV9tZGF5LCAmVC50bV9ob3VyLCAmVC50bV9taW4sICZULnRtX3NlYywgem9uZSk7CisgICAgaWYgKFQudG1feWVhciA9PSAxKQorICAgICAgVC50bV95ZWFyID0gNzA7CisgICAgZWxzZQorICAgICAgVC50bV95ZWFyIC09IDE5MDA7CisgICAgVC50bV9tb24tLTsKKyAgICBpZiAoKnpvbmUpCisgICAgeyBpZiAoKnpvbmUgPT0gJy4nKQorICAgICAgeyBmb3IgKHMgPSB6b25lICsgMTsgKnM7IHMrKykKKyAgICAgICAgICBpZiAoKnMgPCAnMCcgfHwgKnMgPiAnOScpCisgICAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcyA9IHpvbmU7CisgICAgICBpZiAoKnMgPT0gJysnIHx8ICpzID09ICctJykKKyAgICAgIHsgaW50IGggPSAwLCBtID0gMDsKKyAgICAgICAgaWYgKHNbM10gPT0gJzonKQorCXsgc3NjYW5mKHMsICIlZDolZCIsICZoLCAmbSk7CisJICBpZiAoaCA8IDApCisJICAgIG0gPSAtbTsKKwl9CisJZWxzZQorCXsgbSA9IChpbnQpYXRvbChzKTsKKwkgIGggPSBtIC8gMTAwOworCSAgbSA9IG0gJSAxMDA7CisJfQorICAgICAgICBULnRtX2hvdXIgLT0gaDsKKyAgICAgICAgVC50bV9taW4gLT0gbTsKKyAgICAgIH0KKyAgICAgIFQudG1faXNkc3QgPSAwOworICAgICAgKnAgPSBzb2FwX3RpbWVnbSgmVCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IFQudG1faXNkc3QgPSAtMTsKKyAgICAgICpwID0gbWt0aW1lKCZUKTsgLyogbm8gdGltZSB6b25lOiBzdXBwb3NlIGl0IGlzIGxvY2FsdGltZT8gKi8KKyAgICB9CisgIH0KKyAgcmV0dXJuIHNvYXAtPmVycm9yOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQordGltZV90ICoKK1NPQVBfRk1BQzIKK3NvYXBfaW5kYXRlVGltZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCB0aW1lX3QgKnAsIGNvbnN0IGNoYXIgKnR5cGUsIGludCB0KQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMCkpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmICgqc29hcC0+dHlwZQorICAgJiYgc29hcF9tYXRjaF90YWcoc29hcCwgc29hcC0+dHlwZSwgdHlwZSkKKyAgICYmIHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHNvYXAtPnR5cGUsICI6ZGF0ZVRpbWUiKSkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfVFlQRTsKKyAgICBzb2FwX3JldmVydChzb2FwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwID0gKHRpbWVfdCopc29hcF9pZF9lbnRlcihzb2FwLCBzb2FwLT5pZCwgcCwgdCwgc2l6ZW9mKHRpbWVfdCksIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoKnNvYXAtPmhyZWYpCisgICAgcCA9ICh0aW1lX3QqKXNvYXBfaWRfZm9yd2FyZChzb2FwLCBzb2FwLT5ocmVmLCBwLCAwLCB0LCAwLCBzaXplb2YodGltZV90KSwgMCwgTlVMTCk7CisgIGVsc2UgaWYgKHApCisgIHsgaWYgKHNvYXBfczJkYXRlVGltZShzb2FwLCBzb2FwX3ZhbHVlKHNvYXApLCBwKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0bGl0ZXJhbChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnLCBjaGFyICpjb25zdCpwKQoreyBpbnQgaTsKKyAgY29uc3QgY2hhciAqdCA9IE5VTEw7CisgIGlmICh0YWcgJiYgKnRhZyAhPSAnLScpCisgIHsgaWYgKHNvYXAtPmxvY2FsX25hbWVzcGFjZXMgJiYgKHQgPSBzdHJjaHIodGFnLCAnOicpKSkKKyAgICB7IHN0cm5jcHkoc29hcC0+dG1wYnVmLCB0YWcsIHQtdGFnKTsKKyAgICAgIHNvYXAtPnRtcGJ1Zlt0LXRhZ10gPSAnXDAnOworICAgICAgZm9yIChpID0gMDsgc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tpXS5pZDsgaSsrKQorICAgICAgICBpZiAoIXN0cmNtcChzb2FwLT50bXBidWYsIHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0uaWQpKQorICAgICAgICAgIGJyZWFrOworICAgICAgdCsrOworICAgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICI8JXMgeG1sbnM9XCIlc1wiPiIsIHQsIHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0ubnMgPyBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW2ldLm5zIDogU09BUF9TVFJfRU9TKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgdCA9IHRhZzsKKyAgICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiPCVzPiIsIHRhZyk7CisgICAgfQorICAgIGlmIChzb2FwX3NlbmQoc29hcCwgc29hcC0+dG1wYnVmKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAocCAmJiAqcCkKKyAgeyBpZiAoc29hcF9zZW5kKHNvYXAsICpwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAodCkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIjwvJXM+IiwgdCk7CisgICAgcmV0dXJuIHNvYXBfc2VuZChzb2FwLCBzb2FwLT50bXBidWYpOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY2hhciAqKgorU09BUF9GTUFDMgorc29hcF9pbmxpdGVyYWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgY2hhciAqKnApCit7IGlmIChzb2FwX2VsZW1lbnRfYmVnaW5faW4oc29hcCwgdGFnLCAxKSkKKyAgeyBpZiAoc29hcC0+ZXJyb3IgIT0gU09BUF9OT19UQUcgfHwgc29hcF91bmdldChzb2FwLCBzb2FwX2dldChzb2FwKSkgPT0gU09BUF9UVCkKKyAgICAgIHJldHVybiBOVUxMOworICAgIHNvYXAtPmVycm9yID0gU09BUF9PSzsKKyAgfQorICBpZiAoIXApCisgICAgaWYgKCEocCA9IChjaGFyKiopc29hcF9tYWxsb2Moc29hcCwgc2l6ZW9mKGNoYXIqKSkpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIGlmIChzb2FwLT5ib2R5KQorICAgICpwID0gc29hcF9zdHJpbmdfaW4oc29hcCwgMCwgLTEsIC0xKTsKKyAgZWxzZSBpZiAoc29hcC0+bnVsbCkKKyAgICAqcCA9IE5VTEw7CisgIGVsc2UKKyAgICAqcCA9IChjaGFyKilTT0FQX1NUUl9FT1M7CisgIGlmIChzb2FwLT5ib2R5ICYmIHNvYXBfZWxlbWVudF9lbmRfaW4oc29hcCwgdGFnKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfb3V0d2xpdGVyYWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRhZywgd2NoYXJfdCAqY29uc3QqcCkKK3sgaW50IGk7CisgIGNvbnN0IGNoYXIgKnQgPSBOVUxMOworICB3Y2hhcl90IGM7CisgIGNvbnN0IHdjaGFyX3QgKnM7CisgIGlmICh0YWcgJiYgKnRhZyAhPSAnLScpCisgIHsgaWYgKHNvYXAtPmxvY2FsX25hbWVzcGFjZXMgJiYgKHQgPSBzdHJjaHIodGFnLCAnOicpKSkKKyAgICB7IHN0cm5jcHkoc29hcC0+dG1wYnVmLCB0YWcsIHQtdGFnKTsKKyAgICAgIHNvYXAtPnRtcGJ1Zlt0LXRhZ10gPSAnXDAnOworICAgICAgZm9yIChpID0gMDsgc29hcC0+bG9jYWxfbmFtZXNwYWNlc1tpXS5pZDsgaSsrKQorICAgICAgICBpZiAoIXN0cmNtcChzb2FwLT50bXBidWYsIHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0uaWQpKQorICAgICAgICAgIGJyZWFrOworICAgICAgdCsrOworICAgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICI8JXMgeG1sbnM9XCIlc1wiPiIsIHQsIHNvYXAtPmxvY2FsX25hbWVzcGFjZXNbaV0ubnMgPyBzb2FwLT5sb2NhbF9uYW1lc3BhY2VzW2ldLm5zIDogU09BUF9TVFJfRU9TKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgdCA9IHRhZzsKKyAgICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiPCVzPiIsIHRhZyk7CisgICAgfQorICAgIGlmIChzb2FwX3NlbmQoc29hcCwgc29hcC0+dG1wYnVmKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICBpZiAocCkKKyAgeyBzID0gKnA7CisgICAgd2hpbGUgKChjID0gKnMrKykpCisgICAgICBpZiAoc29hcF9wdXR1dGY4KHNvYXAsICh1bnNpZ25lZCBjaGFyKWMpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHQpCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICI8LyVzPiIsIHQpOworICAgIHJldHVybiBzb2FwX3NlbmQoc29hcCwgc29hcC0+dG1wYnVmKTsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQord2NoYXJfdCAqKgorU09BUF9GTUFDMgorc29hcF9pbndsaXRlcmFsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcsIHdjaGFyX3QgKipwKQoreyBpZiAoc29hcF9lbGVtZW50X2JlZ2luX2luKHNvYXAsIHRhZywgMSkpCisgIHsgaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfTk9fVEFHIHx8IHNvYXBfdW5nZXQoc29hcCwgc29hcF9nZXQoc29hcCkpID09IFNPQVBfVFQpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIH0KKyAgaWYgKCFwKQorICAgIGlmICghKHAgPSAod2NoYXJfdCoqKXNvYXBfbWFsbG9jKHNvYXAsIHNpemVvZih3Y2hhcl90KikpKSkKKyAgICAgIHJldHVybiBOVUxMOworICBpZiAoc29hcC0+Ym9keSkKKyAgICAqcCA9IHNvYXBfd3N0cmluZ19pbihzb2FwLCAwLCAtMSwgLTEpOworICBlbHNlIGlmIChzb2FwLT5udWxsKQorICAgICpwID0gTlVMTDsKKyAgZWxzZQorICAgICpwID0gKHdjaGFyX3QqKVNPQVBfU1RSX0VPUzsKKyAgaWYgKHNvYXAtPmJvZHkgJiYgc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCB0YWcpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQorY29uc3QgY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX3Rva2VuKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzaXplX3QgaTsKKyAgcmVnaXN0ZXIgc29hcF93Y2hhciBjID0gMDsKKyAgcmVnaXN0ZXIgY2hhciAqcyA9IHNvYXAtPnRtcGJ1ZjsKKyAgaWYgKCFzb2FwLT5ib2R5KQorICAgIHJldHVybiBTT0FQX1NUUl9FT1M7CisgIGRvIGMgPSBzb2FwX2dldChzb2FwKTsKKyAgd2hpbGUgKHNvYXBfYmxhbmsoYykpOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZikgLSAxOyBpKyspCisgIHsgaWYgKGMgPT0gU09BUF9UVCB8fCAoaW50KWMgPT0gRU9GIHx8IHNvYXBfYmxhbmsoYykpCisgICAgICBicmVhazsKKyAgICAqcysrID0gKGNoYXIpYzsKKyAgICBjID0gc29hcF9nZXQoc29hcCk7CisgIH0KKyAgaWYgKChpbnQpYyA9PSBFT0YgfHwgYyA9PSBTT0FQX1RUKQorICAgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisgICpzID0gJ1wwJzsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbGVtZW50IGNvbnRlbnQgdmFsdWU9JyVzJ1xuIiwgc29hcC0+dG1wYnVmKSk7CisgIHJldHVybiBzb2FwLT50bXBidWY7IC8qIHJldHVybiBub24tbnVsbCBwb2ludGVyICovCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfdmFsdWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNpemVfdCBpOworICByZWdpc3RlciBzb2FwX3djaGFyIGMgPSAwOworICByZWdpc3RlciBjaGFyICpzID0gc29hcC0+dG1wYnVmOworICBpZiAoIXNvYXAtPmJvZHkpCisgICAgcmV0dXJuIFNPQVBfU1RSX0VPUzsKKyAgZG8gYyA9IHNvYXBfZ2V0KHNvYXApOworICB3aGlsZSAoc29hcF9ibGFuayhjKSk7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc29hcC0+dG1wYnVmKSAtIDE7IGkrKykKKyAgeyBpZiAoYyA9PSBTT0FQX1RUIHx8IChpbnQpYyA9PSBFT0YpCisgICAgICBicmVhazsKKyAgICAqcysrID0gKGNoYXIpYzsKKyAgICBjID0gc29hcF9nZXQoc29hcCk7CisgIH0KKyAgZm9yIChzLS07IGkgPiAwOyBpLS0sIHMtLSkKKyAgICBpZiAoIXNvYXBfYmxhbmsoKnMpKQorICAgICAgYnJlYWs7CisgIHNbMV0gPSAnXDAnOworICBpZiAoKGludCljID09IEVPRiB8fCBjID09IFNPQVBfVFQpCisgICAgc29hcF91bmdldChzb2FwLCBjKTsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFbGVtZW50IGNvbnRlbnQgdmFsdWU9JyVzJ1xuIiwgc29hcC0+dG1wYnVmKSk7CisjaWZkZWYgV0lUSF9ET00KKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9YTUxfRE9NKSAmJiBzb2FwLT5kb20pCisgICAgc29hcC0+ZG9tLT5kYXRhID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+dG1wYnVmKTsKKyNlbmRpZgorICByZXR1cm4gc29hcC0+dG1wYnVmOyAvKiByZXR1cm4gbm9uLW51bGwgcG9pbnRlciAqLworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgIWRlZmluZWQoV0lUSF9MRUFORVIpIHx8ICFkZWZpbmVkKFdJVEhfTk9IVFRQKQorI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRsaW5lKHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpzLCBpbnQgbGVuKQoreyBpbnQgaSA9IGxlbjsKKyAgc29hcF93Y2hhciBjID0gMDsKKyAgZm9yICg7OykKKyAgeyB3aGlsZSAoLS1pID4gMCkKKyAgICB7IGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgICAgICBpZiAoYyA9PSAnXHInIHx8IGMgPT0gJ1xuJykKKyAgICAgICAgYnJlYWs7CisgICAgICBpZiAoKGludCljID09IEVPRikKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgICAqcysrID0gKGNoYXIpYzsKKyAgICB9CisgICAgaWYgKGMgIT0gJ1xuJykKKyAgICAgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7IC8qIGdvdCBcciwgbm93IGdldCBcbiAqLworICAgIGlmIChjID09ICdcbicpCisgICAgeyAqcyA9ICdcMCc7CisgICAgICBpZiAoaSsxID09IGxlbikgLyogZW1wdHkgbGluZTogZW5kIG9mIEhUVFAvTUlNRSBoZWFkZXIgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICBjID0gc29hcF91bmdldChzb2FwLCBzb2FwX2dldGNoYXIoc29hcCkpOworICAgICAgaWYgKGMgIT0gJyAnICYmIGMgIT0gJ1x0JykgLyogSFRUUCBsaW5lIGNvbnRpbnVhdGlvbj8gKi8KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGVsc2UgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHNpemVfdAorc29hcF9jb3VudF9hdHRhY2htZW50cyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHJlZ2lzdGVyIHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgcmVnaXN0ZXIgc2l6ZV90IGNvdW50ID0gc29hcC0+Y291bnQ7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ2FsY3VsYXRpbmcgdGhlIG1lc3NhZ2Ugc2l6ZSB3aXRoIGF0dGFjaG1lbnRzLCBjdXJyZW50IGNvdW50PSVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpY291bnQpKTsKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkgJiYgIShzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkpCisgIHsgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDYWxjdWxhdGluZyB0aGUgc2l6ZSBvZiBESU1FIGF0dGFjaG1lbnRzXG4iKSk7CisgICAgZm9yIChjb250ZW50ID0gc29hcC0+ZGltZS5maXJzdDsgY29udGVudDsgY29udGVudCA9IGNvbnRlbnQtPm5leHQpCisgICAgeyBjb3VudCArPSAxMiArICgoY29udGVudC0+c2l6ZSszKSYofjMpKTsKKyAgICAgIGlmIChjb250ZW50LT5pZCkKKyAgICAgICAgY291bnQgKz0gKChzdHJsZW4oY29udGVudC0+aWQpKzMpJih+MykpOworICAgICAgaWYgKGNvbnRlbnQtPnR5cGUpCisgICAgICAgIGNvdW50ICs9ICgoc3RybGVuKGNvbnRlbnQtPnR5cGUpKzMpJih+MykpOworICAgICAgaWYgKGNvbnRlbnQtPm9wdGlvbnMpCisgICAgICAgIGNvdW50ICs9ICgoKCh1bnNpZ25lZCBjaGFyKWNvbnRlbnQtPm9wdGlvbnNbMl0gPDwgOCkgfCAoKHVuc2lnbmVkIGNoYXIpY29udGVudC0+b3B0aW9uc1szXSkpKzcpJih+Myk7CisgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNpemUgb2YgRElNRSBhdHRhY2htZW50IGNvbnRlbnQgaXMgJWx1IGJ5dGVzXG4iLCAodW5zaWduZWQgbG9uZyljb250ZW50LT5zaXplKSk7CisgICAgfQorICB9CisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfRU5DX01JTUUpICYmIHNvYXAtPm1pbWUuYm91bmRhcnkpCisgIHsgcmVnaXN0ZXIgc2l6ZV90IG4gPSBzdHJsZW4oc29hcC0+bWltZS5ib3VuZGFyeSk7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDYWxjdWxhdGluZyB0aGUgc2l6ZSBvZiBNSU1FIGF0dGFjaG1lbnRzXG4iKSk7CisgICAgZm9yIChjb250ZW50ID0gc29hcC0+bWltZS5maXJzdDsgY29udGVudDsgY29udGVudCA9IGNvbnRlbnQtPm5leHQpCisgICAgeyByZWdpc3RlciBjb25zdCBjaGFyICpzOworICAgICAgLyogY291bnQgXHJcbi0tYm91bmRhcnlcclxuICovCisgICAgICBjb3VudCArPSA2ICsgbjsKKyAgICAgIC8qIGNvdW50IENvbnRlbnQtVHlwZTogLi4uXHJcbiAqLworICAgICAgaWYgKGNvbnRlbnQtPnR5cGUpCisgICAgICAgIGNvdW50ICs9IDE2ICsgc3RybGVuKGNvbnRlbnQtPnR5cGUpOworICAgICAgLyogY291bnQgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogLi4uXHJcbiAqLworICAgICAgcyA9IHNvYXBfc3RyX2NvZGUobWltZV9jb2RlcywgY29udGVudC0+ZW5jb2RpbmcpOworICAgICAgaWYgKHMpCisgICAgICAgIGNvdW50ICs9IDI5ICsgc3RybGVuKHMpOworICAgICAgLyogY291bnQgQ29udGVudC1JRDogLi4uXHJcbiAqLworICAgICAgaWYgKGNvbnRlbnQtPmlkKQorICAgICAgICBjb3VudCArPSAxNCArIHN0cmxlbihjb250ZW50LT5pZCk7CisgICAgICAvKiBjb3VudCBDb250ZW50LUxvY2F0aW9uOiAuLi5cclxuICovCisgICAgICBpZiAoY29udGVudC0+bG9jYXRpb24pCisgICAgICAgIGNvdW50ICs9IDIwICsgc3RybGVuKGNvbnRlbnQtPmxvY2F0aW9uKTsKKyAgICAgIC8qIGNvdW50IENvbnRlbnQtRGVzY3JpcHRpb246IC4uLlxyXG4gKi8KKyAgICAgIGlmIChjb250ZW50LT5kZXNjcmlwdGlvbikKKyAgICAgICAgY291bnQgKz0gMjMgKyBzdHJsZW4oY29udGVudC0+bG9jYXRpb24pOworICAgICAgLyogY291bnQgXHJcbi4uLmNvbnRlbnQgKi8KKyAgICAgIGNvdW50ICs9IDIgKyBjb250ZW50LT5zaXplOworICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTaXplIG9mIE1JTUUgYXR0YWNobWVudCBjb250ZW50IGlzICVsdSBieXRlc1xuIiwgKHVuc2lnbmVkIGxvbmcpY29udGVudC0+c2l6ZSkpOworICAgIH0KKyAgICAvKiBjb3VudCBcclxuLS1ib3VuZGFyeS0tICovCisgICAgY291bnQgKz0gNiArIG47CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJOZXcgY291bnQgaXMgJWx1IGJ5dGVzXG4iLCAodW5zaWduZWQgbG9uZyljb3VudCkpOworICByZXR1cm4gY291bnQ7CisjZWxzZQorICByZXR1cm4gc29hcC0+Y291bnQ7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NvYXBfcHV0ZGltZWZpZWxkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBzaXplX3QgbikKK3sgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgcywgbikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCBTT0FQX1NUUl9QQURESU5HLCAtKGxvbmcpbiYzKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY2hhciAqCitTT0FQX0ZNQUMyCitzb2FwX2RpbWVfb3B0aW9uKHN0cnVjdCBzb2FwICpzb2FwLCB1bnNpZ25lZCBzaG9ydCBvcHR5cGUsIGNvbnN0IGNoYXIgKm9wdGlvbikKK3sgc2l6ZV90IG47CisgIGNoYXIgKnMgPSBOVUxMOworICBpZiAob3B0aW9uKQorICB7IG4gPSBzdHJsZW4ob3B0aW9uKTsKKyAgICBzID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIG4gKyA1KTsKKyAgICBpZiAocykKKyAgICB7IHNbMF0gPSBvcHR5cGUgPj4gODsKKyAgICAgIHNbMV0gPSBvcHR5cGUgJiAweEZGOworICAgICAgc1syXSA9IG4gPj4gODsKKyAgICAgIHNbM10gPSBuICYgMHhGRjsKKyAgICAgIHN0cmNweShzICsgNCwgb3B0aW9uKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHM7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRkaW1laGRyKHN0cnVjdCBzb2FwICpzb2FwKQoreyB1bnNpZ25lZCBjaGFyIHRtcFsxMl07CisgIHNpemVfdCBvcHRsZW4gPSAwLCBpZGxlbiA9IDAsIHR5cGVsZW4gPSAwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlB1dCBESU1FIGhlYWRlciBpZD0nJXMnXG4iLCBzb2FwLT5kaW1lLmlkP3NvYXAtPmRpbWUuaWQ6IiIpKTsKKyAgaWYgKHNvYXAtPmRpbWUub3B0aW9ucykKKyAgICBvcHRsZW4gPSAoKCh1bnNpZ25lZCBjaGFyKXNvYXAtPmRpbWUub3B0aW9uc1syXSA8PCA4KSB8ICgodW5zaWduZWQgY2hhcilzb2FwLT5kaW1lLm9wdGlvbnNbM10pKSArIDQ7CisgIGlmIChzb2FwLT5kaW1lLmlkKQorICAgIGlkbGVuID0gc3RybGVuKHNvYXAtPmRpbWUuaWQpOworICBpZiAoc29hcC0+ZGltZS50eXBlKQorICAgIHR5cGVsZW4gPSBzdHJsZW4oc29hcC0+ZGltZS50eXBlKTsKKyAgdG1wWzBdID0gU09BUF9ESU1FX1ZFUlNJT04gfCAoc29hcC0+ZGltZS5mbGFncyAmIDB4Nyk7CisgIHRtcFsxXSA9IHNvYXAtPmRpbWUuZmxhZ3MgJiAweEYwOworICB0bXBbMl0gPSBvcHRsZW4gPj4gODsKKyAgdG1wWzNdID0gb3B0bGVuICYgMHhGRjsKKyAgdG1wWzRdID0gaWRsZW4gPj4gODsKKyAgdG1wWzVdID0gaWRsZW4gJiAweEZGOworICB0bXBbNl0gPSB0eXBlbGVuID4+IDg7CisgIHRtcFs3XSA9IHR5cGVsZW4gJiAweEZGOworICB0bXBbOF0gPSBzb2FwLT5kaW1lLnNpemUgPj4gMjQ7CisgIHRtcFs5XSA9IChzb2FwLT5kaW1lLnNpemUgPj4gMTYpICYgMHhGRjsKKyAgdG1wWzEwXSA9IChzb2FwLT5kaW1lLnNpemUgPj4gOCkgJiAweEZGOworICB0bXBbMTFdID0gc29hcC0+ZGltZS5zaXplICYgMHhGRjsKKyAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgKGNoYXIqKXRtcCwgMTIpCisgICB8fCBzb2FwX3B1dGRpbWVmaWVsZChzb2FwLCBzb2FwLT5kaW1lLm9wdGlvbnMsIG9wdGxlbikKKyAgIHx8IHNvYXBfcHV0ZGltZWZpZWxkKHNvYXAsIHNvYXAtPmRpbWUuaWQsIGlkbGVuKQorICAgfHwgc29hcF9wdXRkaW1lZmllbGQoc29hcCwgc29hcC0+ZGltZS50eXBlLCB0eXBlbGVuKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0ZGltZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICBpZiAoIShzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIGZvciAoY29udGVudCA9IHNvYXAtPmRpbWUuZmlyc3Q7IGNvbnRlbnQ7IGNvbnRlbnQgPSBjb250ZW50LT5uZXh0KQorICB7IHZvaWQgKmhhbmRsZTsKKyAgICBzb2FwLT5kaW1lLnNpemUgPSBjb250ZW50LT5zaXplOworICAgIHNvYXAtPmRpbWUuaWQgPSBjb250ZW50LT5pZDsKKyAgICBzb2FwLT5kaW1lLnR5cGUgPSBjb250ZW50LT50eXBlOworICAgIHNvYXAtPmRpbWUub3B0aW9ucyA9IGNvbnRlbnQtPm9wdGlvbnM7CisgICAgc29hcC0+ZGltZS5mbGFncyA9IFNPQVBfRElNRV9WRVJTSU9OIHwgU09BUF9ESU1FX01FRElBOworICAgIGlmIChzb2FwLT5mZGltZXJlYWRvcGVuICYmICgoaGFuZGxlID0gc29hcC0+ZmRpbWVyZWFkb3Blbihzb2FwLCAodm9pZCopY29udGVudC0+cHRyLCBjb250ZW50LT5pZCwgY29udGVudC0+dHlwZSwgY29udGVudC0+b3B0aW9ucykpIHx8IHNvYXAtPmVycm9yKSkKKyAgICB7IHNpemVfdCBzaXplID0gY29udGVudC0+c2l6ZTsKKyAgICAgIGlmICghaGFuZGxlKQorICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImZkaW1lcmVhZG9wZW4gZmFpbGVkXG4iKSk7CisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIH0KKyAgICAgIGlmICghY29udGVudC0+c2l6ZSAmJiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpIHx8IChzb2FwLT5tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSyB8fCAoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fU1RPUkUpKQorICAgICAgeyBzaXplX3QgY2h1bmtzaXplID0gc2l6ZW9mKHNvYXAtPnRtcGJ1Zik7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ2h1bmtlZCBzdHJlYW1pbmcgRElNRVxuIikpOworICAgICAgICBkbyAKKyAgICAgICAgeyBzaXplID0gc29hcC0+ZmRpbWVyZWFkKHNvYXAsIGhhbmRsZSwgc29hcC0+dG1wYnVmLCBjaHVua3NpemUpOworICAgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZmRpbWVyZWFkIHJldHVybmVkICVsdSBieXRlc1xuIiwgKHVuc2lnbmVkIGxvbmcpc2l6ZSkpOworICAgICAgICAgIGlmIChzaXplIDwgY2h1bmtzaXplKQorIAkgIHsgc29hcC0+ZGltZS5mbGFncyAmPSB+U09BUF9ESU1FX0NGOworICAgICAgICAgICAgaWYgKCFjb250ZW50LT5uZXh0KQorICAgICAgICAgICAgICBzb2FwLT5kaW1lLmZsYWdzIHw9IFNPQVBfRElNRV9NRTsKKwkgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBzb2FwLT5kaW1lLmZsYWdzIHw9IFNPQVBfRElNRV9DRjsKKwkgIHNvYXAtPmRpbWUuc2l6ZSA9IHNpemU7CisgICAgICAgICAgaWYgKHNvYXBfcHV0ZGltZWhkcihzb2FwKQorCSAgIHx8IHNvYXBfcHV0ZGltZWZpZWxkKHNvYXAsIHNvYXAtPnRtcGJ1Ziwgc2l6ZSkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBpZiAoc29hcC0+ZGltZS5pZCkKKyAJICB7IHNvYXAtPmRpbWUuZmxhZ3MgJj0gfihTT0FQX0RJTUVfTUIgfCBTT0FQX0RJTUVfTUVESUEpOworICAgICAgICAgICAgc29hcC0+ZGltZS5pZCA9IE5VTEw7CisgICAgICAgICAgICBzb2FwLT5kaW1lLnR5cGUgPSBOVUxMOworICAgICAgICAgICAgc29hcC0+ZGltZS5vcHRpb25zID0gTlVMTDsKKyAgICAgICAgICB9ICAKKyAgICAgICAgfSB3aGlsZSAoc2l6ZSA+PSBjaHVua3NpemUpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBpZiAoIWNvbnRlbnQtPm5leHQpCisgICAgICAgICAgc29hcC0+ZGltZS5mbGFncyB8PSBTT0FQX0RJTUVfTUU7CisgICAgICAgIGlmIChzb2FwX3B1dGRpbWVoZHIoc29hcCkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBkbworICAgICAgICB7IHNpemVfdCBidWZzaXplOworCSAgaWYgKHNpemUgPCBzaXplb2Yoc29hcC0+dG1wYnVmKSkKKyAgICAgICAgICAgIGJ1ZnNpemUgPSBzaXplOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJ1ZnNpemUgPSBzaXplb2Yoc29hcC0+dG1wYnVmKTsKKyAgICAgICAgICBpZiAoIShidWZzaXplID0gc29hcC0+ZmRpbWVyZWFkKHNvYXAsIGhhbmRsZSwgc29hcC0+dG1wYnVmLCBidWZzaXplKSkpCisgICAgICAgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgImZkaW1lcmVhZCBmYWlsZWQ6IGluc3VmZmljaWVudCBkYXRhICglbHUgYnl0ZXMgcmVtYWluaW5nIGZyb20gJWx1IGJ5dGVzKVxuIiwgKHVuc2lnbmVkIGxvbmcpc2l6ZSwgKHVuc2lnbmVkIGxvbmcpc29hcC0+ZGltZS5zaXplKSk7CisgICAgICAgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworCSAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHNvYXBfc2VuZF9yYXcoc29hcCwgc29hcC0+dG1wYnVmLCBidWZzaXplKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHNpemUgLT0gYnVmc2l6ZTsKKyAgICAgICAgfSB3aGlsZSAoc2l6ZSk7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZmRpbWVyZWFkY2xvc2VcbiIpKTsKKyAgICAgICAgc29hcF9zZW5kX3Jhdyhzb2FwLCBTT0FQX1NUUl9QQURESU5HLCAtKGxvbmcpc29hcC0+ZGltZS5zaXplJjMpOworICAgICAgfQorICAgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJmZGltZXJlYWRjbG9zZVxuIikpOworICAgICAgaWYgKHNvYXAtPmZkaW1lcmVhZGNsb3NlKQorICAgICAgICBzb2FwLT5mZGltZXJlYWRjbG9zZShzb2FwLCBoYW5kbGUpOworICAgIH0KKyAgICBlbHNlCisgICAgeyBpZiAoIWNvbnRlbnQtPm5leHQpCisgICAgICAgIHNvYXAtPmRpbWUuZmxhZ3MgfD0gU09BUF9ESU1FX01FOworICAgICAgaWYgKHNvYXBfcHV0ZGltZWhkcihzb2FwKQorICAgICAgIHx8IHNvYXBfcHV0ZGltZWZpZWxkKHNvYXAsIChjaGFyKiljb250ZW50LT5wdHIsIGNvbnRlbnQtPnNpemUpKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICB9CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgY2hhciAqCitzb2FwX2dldGRpbWVmaWVsZChzdHJ1Y3Qgc29hcCAqc29hcCwgc2l6ZV90IG4pCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYzsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIGNoYXIgKnM7CisgIGNoYXIgKnAgPSBOVUxMOworICBpZiAobikKKyAgeyBwID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIG4gKyAxKTsKKyAgICBpZiAocCkKKyAgICB7IHMgPSBwOworICAgICAgZm9yIChpID0gbjsgaSA+IDA7IGktLSkKKyAgICAgIHsgaWYgKChpbnQpKGMgPSBzb2FwX2dldDEoc29hcCkpID09IEVPRikKKyAgICAgICAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgICpzKysgPSAoY2hhciljOworICAgICAgfQorICAgICAgKnMgPSAnXDAnOworICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXBfbW92ZShzb2FwLCAtKGxvbmcpbiYzKSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlCisgICAgICBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICB9CisgIHJldHVybiBwOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0ZGltZWhkcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICByZWdpc3RlciBjaGFyICpzOworICByZWdpc3RlciBpbnQgaTsKKyAgdW5zaWduZWQgY2hhciB0bXBbMTJdOworICBzaXplX3Qgb3B0bGVuLCBpZGxlbiwgdHlwZWxlbjsKKyAgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRElNRV9FTkQ7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR2V0IERJTUUgaGVhZGVyXG4iKSk7CisgIGlmIChzb2FwLT5kaW1lLmJ1ZmxlbiB8fCBzb2FwLT5kaW1lLmNodW5rc2l6ZSkKKyAgeyBpZiAoc29hcF9tb3ZlKHNvYXAsIChsb25nKShzb2FwLT5kaW1lLnNpemUgLSBzb2FwX3RlbGwoc29hcCkpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9GOworICAgIHNvYXBfdW5nZXQoc29hcCwgc29hcF9nZXRjaGFyKHNvYXApKTsgLyogc2tpcCBwYWRkaW5nIGFuZCBnZXQgaGRyICovCisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIuLi4gRnJvbSBjaHVua2VkXG4iKSk7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgcyA9IChjaGFyKil0bXA7CisgIGZvciAoaSA9IDEyOyBpID4gMDsgaS0tKQorICB7IGlmICgoaW50KShjID0gc29hcF9nZXRjaGFyKHNvYXApKSA9PSBFT0YpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAqcysrID0gKGNoYXIpYzsKKyAgfQorICBpZiAoKHRtcFswXSAmIDB4RjgpICE9IFNPQVBfRElNRV9WRVJTSU9OKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRElNRV9NSVNNQVRDSDsKKyAgc29hcC0+ZGltZS5mbGFncyA9ICh0bXBbMF0gJiAweDcpIHwgKHRtcFsxXSAmIDB4RjApOworICBvcHRsZW4gPSAodG1wWzJdIDw8IDgpIHwgdG1wWzNdOworICBpZGxlbiA9ICh0bXBbNF0gPDwgOCkgfCB0bXBbNV07CisgIHR5cGVsZW4gPSAodG1wWzZdIDw8IDgpIHwgdG1wWzddOworICBzb2FwLT5kaW1lLnNpemUgPSAodG1wWzhdIDw8IDI0KSB8ICh0bXBbOV0gPDwgMTYpIHwgKHRtcFsxMF0gPDwgOCkgfCB0bXBbMTFdOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRJTUUgc2l6ZT0lbHUgZmxhZ3M9MHglWFxuIiwgKHVuc2lnbmVkIGxvbmcpc29hcC0+ZGltZS5zaXplLCBzb2FwLT5kaW1lLmZsYWdzKSk7CisgIGlmICghKHNvYXAtPmRpbWUub3B0aW9ucyA9IHNvYXBfZ2V0ZGltZWZpZWxkKHNvYXAsIG9wdGxlbikpICYmIHNvYXAtPmVycm9yKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKCEoc29hcC0+ZGltZS5pZCA9IHNvYXBfZ2V0ZGltZWZpZWxkKHNvYXAsIGlkbGVuKSkgJiYgc29hcC0+ZXJyb3IpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBpZiAoIShzb2FwLT5kaW1lLnR5cGUgPSBzb2FwX2dldGRpbWVmaWVsZChzb2FwLCB0eXBlbGVuKSkgJiYgc29hcC0+ZXJyb3IpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkRJTUUgaWQ9JXMsIHR5cGU9JXMsIG9wdGlvbnM9JXNcbiIsIHNvYXAtPmRpbWUuaWQ/c29hcC0+ZGltZS5pZDoiIiwgc29hcC0+ZGltZS50eXBlP3NvYXAtPmRpbWUudHlwZToiIiwgc29hcC0+ZGltZS5vcHRpb25zP3NvYXAtPmRpbWUub3B0aW9ucys0OiIiKSk7CisgIGlmIChzb2FwLT5kaW1lLmZsYWdzICYgU09BUF9ESU1FX01FKQorICAgIHNvYXAtPm1vZGUgJj0gflNPQVBfRU5DX0RJTUU7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0ZGltZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgd2hpbGUgKHNvYXAtPmRpbWUuZmxhZ3MgJiBTT0FQX0RJTUVfQ0YpCisgIHsgaWYgKHNvYXBfZ2V0ZGltZWhkcihzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICBpZiAoc29hcF9tb3ZlKHNvYXAsIHNvYXAtPmRpbWUuc2l6ZSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgfQorICBpZiAoc29hcF9tb3ZlKHNvYXAsICgoc29hcC0+ZGltZS5zaXplKzMpJih+MykpLXNvYXBfdGVsbChzb2FwKSkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIGZvciAoOzspCisgIHsgcmVnaXN0ZXIgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICAgIGlmIChzb2FwX2dldGRpbWVoZHIoc29hcCkpCisgICAgICBicmVhazsKKyAgICBpZiAoc29hcC0+ZmRpbWV3cml0ZW9wZW4gJiYgKChzb2FwLT5kaW1lLnB0ciA9IChjaGFyKilzb2FwLT5mZGltZXdyaXRlb3Blbihzb2FwLCBzb2FwLT5kaW1lLmlkLCBzb2FwLT5kaW1lLnR5cGUsIHNvYXAtPmRpbWUub3B0aW9ucykpIHx8IHNvYXAtPmVycm9yKSkKKyAgICB7IGNvbnN0IGNoYXIgKmlkLCAqdHlwZSwgKm9wdGlvbnM7CisgICAgICBzaXplX3Qgc2l6ZSwgbjsKKyAgICAgIGlmICghc29hcC0+ZGltZS5wdHIpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIGlkID0gc29hcC0+ZGltZS5pZDsKKyAgICAgIHR5cGUgPSBzb2FwLT5kaW1lLnR5cGU7CisgICAgICBvcHRpb25zID0gc29hcC0+ZGltZS5vcHRpb25zOworICAgICAgZm9yICg7OykKKyAgICAgIHsgc2l6ZSA9IHNvYXAtPmRpbWUuc2l6ZTsKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeyBuID0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgICAgICAgIGlmIChzaXplIDwgbikKKyAgICAgICAgICAgIG4gPSBzaXplOworICAgICAgICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mZGltZXdyaXRlKHNvYXAsICh2b2lkKilzb2FwLT5kaW1lLnB0ciwgc29hcC0+YnVmICsgc29hcC0+YnVmaWR4LCBuKSkpCisgICAgICAgICAgICBicmVhazsKKwkgIHNpemUgLT0gbjsKKwkgIGlmICghc2l6ZSkKKwkgIHsgc29hcC0+YnVmaWR4ICs9IG47CisJICAgIGJyZWFrOworCSAgfQorCSAgaWYgKHNvYXBfcmVjdihzb2FwKSkKKyAgICAgICAgICB7IHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisJICAgIGdvdG8gZW5kOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc29hcF9tb3ZlKHNvYXAsIC0obG9uZylzb2FwLT5kaW1lLnNpemUmMykpCisgICAgICAgIHsgc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKwkgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICghKHNvYXAtPmRpbWUuZmxhZ3MgJiBTT0FQX0RJTUVfQ0YpKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoc29hcF9nZXRkaW1laGRyKHNvYXApKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorZW5kOgorICAgICAgaWYgKHNvYXAtPmZkaW1ld3JpdGVjbG9zZSkKKyAgICAgICAgc29hcC0+ZmRpbWV3cml0ZWNsb3NlKHNvYXAsICh2b2lkKilzb2FwLT5kaW1lLnB0cik7CisgICAgICBzb2FwLT5kaW1lLnNpemUgPSAwOworICAgICAgc29hcC0+ZGltZS5pZCA9IGlkOworICAgICAgc29hcC0+ZGltZS50eXBlID0gdHlwZTsKKyAgICAgIHNvYXAtPmRpbWUub3B0aW9ucyA9IG9wdGlvbnM7CisgICAgfQorICAgIGVsc2UgaWYgKHNvYXAtPmRpbWUuZmxhZ3MgJiBTT0FQX0RJTUVfQ0YpCisgICAgeyBjb25zdCBjaGFyICppZCwgKnR5cGUsICpvcHRpb25zOworICAgICAgcmVnaXN0ZXIgc29hcF93Y2hhciBjOworICAgICAgcmVnaXN0ZXIgY2hhciAqczsKKyAgICAgIHJlZ2lzdGVyIGludCBpOworICAgICAgaWQgPSBzb2FwLT5kaW1lLmlkOworICAgICAgdHlwZSA9IHNvYXAtPmRpbWUudHlwZTsKKyAgICAgIG9wdGlvbnMgPSBzb2FwLT5kaW1lLm9wdGlvbnM7CisgICAgICBpZiAoc29hcF9uZXdfYmxvY2soc29hcCkpCisgICAgICAgIHJldHVybiBTT0FQX0VPTTsKKyAgICAgIGZvciAoOzspCisgICAgICB7IHMgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIHNvYXAtPmRpbWUuc2l6ZSk7CisgICAgICAgIGlmICghcykKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPTTsKKyAgICAgICAgZm9yIChpID0gc29hcC0+ZGltZS5zaXplOyBpID4gMDsgaS0tKQorICAgICAgICB7IGlmICgoaW50KShjID0gc29hcF9nZXQxKHNvYXApKSA9PSBFT0YpCisgICAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICAgICAgICAqcysrID0gKGNoYXIpYzsKKyAgICAgICAgfQorICAgICAgICBpZiAoc29hcF9tb3ZlKHNvYXAsIC0obG9uZylzb2FwLT5kaW1lLnNpemUmMykpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgICAgICAgIGlmICghKHNvYXAtPmRpbWUuZmxhZ3MgJiBTT0FQX0RJTUVfQ0YpKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoc29hcF9nZXRkaW1laGRyKHNvYXApKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIH0KKyAgICAgIHNvYXAtPmRpbWUuc2l6ZSA9IHNvYXAtPmJsaXN0LT5zaXplKys7IC8qIGFsbG9jYXRlIG9uZSBtb3JlIGZvciAnXDAnICovCisgICAgICBpZiAoIShzb2FwLT5kaW1lLnB0ciA9IHNvYXBfc2F2ZV9ibG9jayhzb2FwLCBOVUxMLCAwKSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIHNvYXAtPmRpbWUucHRyW3NvYXAtPmRpbWUuc2l6ZV0gPSAnXDAnOyAvKiBmb3JjZSAwLXRlcm1pbmF0ZWQgKi8KKyAgICAgIHNvYXAtPmRpbWUuaWQgPSBpZDsKKyAgICAgIHNvYXAtPmRpbWUudHlwZSA9IHR5cGU7CisgICAgICBzb2FwLT5kaW1lLm9wdGlvbnMgPSBvcHRpb25zOworICAgIH0KKyAgICBlbHNlCisgICAgICBzb2FwLT5kaW1lLnB0ciA9IHNvYXBfZ2V0ZGltZWZpZWxkKHNvYXAsIHNvYXAtPmRpbWUuc2l6ZSk7CisgICAgY29udGVudCA9IHNvYXBfbmV3X211bHRpcGFydChzb2FwLCAmc29hcC0+ZGltZS5maXJzdCwgJnNvYXAtPmRpbWUubGFzdCwgc29hcC0+ZGltZS5wdHIsIHNvYXAtPmRpbWUuc2l6ZSk7CisgICAgaWYgKCFjb250ZW50KQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgY29udGVudC0+aWQgPSBzb2FwLT5kaW1lLmlkOworICAgIGNvbnRlbnQtPnR5cGUgPSBzb2FwLT5kaW1lLnR5cGU7CisgICAgY29udGVudC0+b3B0aW9ucyA9IHNvYXAtPmRpbWUub3B0aW9uczsKKyAgICBzb2FwX3Jlc29sdmVfYXR0YWNobWVudChzb2FwLCBjb250ZW50KTsKKyAgICBpZiAoc29hcC0+ZXJyb3IpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHNvYXAtPmVycm9yICE9IFNPQVBfRElNRV9FTkQpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0bWltZWhkcihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICBkbworICB7IGlmIChzb2FwX2dldGxpbmUoc29hcCwgc29hcC0+bXNnYnVmLCBzaXplb2Yoc29hcC0+bXNnYnVmKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgd2hpbGUgKCEqc29hcC0+bXNnYnVmKTsKKyAgaWYgKHNvYXAtPm1zZ2J1ZlswXSA9PSAnLScgJiYgc29hcC0+bXNnYnVmWzFdID09ICctJykKKyAgeyBjaGFyICpzID0gc29hcC0+bXNnYnVmICsgc3RybGVuKHNvYXAtPm1zZ2J1ZikgLSAxOworICAgIC8qIHJlbW92ZSB3aGl0ZSBzcGFjZSAqLworICAgIHdoaWxlIChzb2FwX2JsYW5rKCpzKSkKKyAgICAgIHMtLTsKKyAgICBzWzFdID0gJ1wwJzsKKyAgICBpZiAoc29hcC0+bWltZS5ib3VuZGFyeSkKKyAgICB7IGlmIChzdHJjbXAoc29hcC0+bXNnYnVmICsgMiwgc29hcC0+bWltZS5ib3VuZGFyeSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfTUlNRV9FUlJPUjsKKyAgICB9CisgICAgZWxzZQorICAgICAgc29hcC0+bWltZS5ib3VuZGFyeSA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXAtPm1zZ2J1ZiArIDIpOworICAgIGlmIChzb2FwX2dldGxpbmUoc29hcCwgc29hcC0+bXNnYnVmLCBzaXplb2Yoc29hcC0+bXNnYnVmKSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHNvYXBfc2V0X21pbWVfYXR0YWNobWVudChzb2FwLCBOVUxMLCAwLCBTT0FQX01JTUVfTk9ORSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT007CisgIGNvbnRlbnQgPSBzb2FwLT5taW1lLmxhc3Q7CisgIGZvciAoOzspCisgIHsgcmVnaXN0ZXIgY2hhciAqa2V5ID0gc29hcC0+bXNnYnVmOworICAgIHJlZ2lzdGVyIGNoYXIgKnZhbDsKKyAgICBpZiAoISprZXkpCisgICAgICBicmVhazsKKyAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiTUlNRSBoZWFkZXI6ICVzXG4iLCBrZXkpKTsKKyAgICB2YWwgPSBzdHJjaHIoc29hcC0+bXNnYnVmLCAnOicpOworICAgIGlmICh2YWwpCisgICAgeyAqdmFsID0gJ1wwJzsKKyAgICAgIGRvIHZhbCsrOworICAgICAgd2hpbGUgKCp2YWwgJiYgKnZhbCA8PSAzMik7CisgICAgICBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJDb250ZW50LUlEIikpCisgICAgICAgIGNvbnRlbnQtPmlkID0gc29hcF9zdHJkdXAoc29hcCwgdmFsKTsKKyAgICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1Mb2NhdGlvbiIpKQorICAgICAgICBjb250ZW50LT5sb2NhdGlvbiA9IHNvYXBfc3RyZHVwKHNvYXAsIHZhbCk7CisgICAgICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtRGlzcG9zaXRpb24iKSkKKyAgICAgICAgY29udGVudC0+aWQgPSBzb2FwX3N0cmR1cChzb2FwLCBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHZhbCwgIm5hbWUiKSk7CisgICAgICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtVHlwZSIpKQorICAgICAgICBjb250ZW50LT50eXBlID0gc29hcF9zdHJkdXAoc29hcCwgdmFsKTsKKyAgICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1EZXNjcmlwdGlvbiIpKQorICAgICAgICBjb250ZW50LT5kZXNjcmlwdGlvbiA9IHNvYXBfc3RyZHVwKHNvYXAsIHZhbCk7CisgICAgICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmciKSkKKyAgICAgICAgY29udGVudC0+ZW5jb2RpbmcgPSAoZW51bSBzb2FwX21pbWVfZW5jb2Rpbmcpc29hcF9pbnRfY29kZShtaW1lX2NvZGVzLCB2YWwsIChsb25nKVNPQVBfTUlNRV9OT05FKTsKKyAgICB9CisgICAgaWYgKHNvYXBfZ2V0bGluZShzb2FwLCBrZXksIHNpemVvZihzb2FwLT5tc2didWYpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2dldG1pbWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHNvYXBfd2NoYXIgYyA9IDA7CisgIGlmICghc29hcC0+bWltZS5sYXN0KQorICAgIHJldHVybiBTT0FQX09LOworICBmb3IgKDs7KQorICB7IHJlZ2lzdGVyIHNpemVfdCBpLCBtID0gMDsKKyAgICByZWdpc3RlciBjaGFyICpzLCAqdCA9IE5VTEw7CisgICAgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50ID0gc29hcC0+bWltZS5sYXN0OworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUGFyc2luZyBNSU1FIGNvbnRlbnQgaWQ9JXMgdHlwZT0lc1xuIiwgY29udGVudC0+aWQ/Y29udGVudC0+aWQ6IiIsIGNvbnRlbnQtPnR5cGU/Y29udGVudC0+dHlwZToiIikpOworICAgIGlmIChzb2FwX25ld19ibG9jayhzb2FwKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIGZvciAoOzspCisgICAgeyByZWdpc3RlciBzaG9ydCBmbGFnID0gMDsKKyAgICAgIGlmICghKHMgPSAoY2hhciopc29hcF9wdXNoX2Jsb2NrKHNvYXAsIFNPQVBfQkxLTEVOKSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgICAgZm9yIChpID0gMDsgaSA8IFNPQVBfQkxLTEVOOyBpKyspCisgICAgICB7IGlmIChtID4gMCkKKyAgICAgICAgeyAqcysrID0gKnQrKzsKKwkgIG0tLTsKKwl9CisJZWxzZQorICAgICAgICB7IGlmICghZmxhZykKKwkgIHsgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKwkgICAgaWYgKChpbnQpYyA9PSBFT0YpCisJICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisJICB9CisJICBpZiAoZmxhZyB8fCBjID09ICdccicpCisJICB7IHQgPSBzb2FwLT50bXBidWY7CisJICAgIG1lbXNldCh0LCAwLCBzaXplb2Yoc29hcC0+dG1wYnVmKSk7CisgICAgICAgICAgICBzdHJjcHkodCwgIlxuLS0iKTsKKyAgICAgICAgICAgIGlmIChzb2FwLT5taW1lLmJvdW5kYXJ5KQorCSAgICAgIHN0cm5jYXQodCwgc29hcC0+bWltZS5ib3VuZGFyeSwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiktNCk7CisJICAgIGRvIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisJICAgIHdoaWxlIChjID09ICp0KyspOworCSAgICBpZiAoKGludCljID09IEVPRikKKwkgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKwkgICAgaWYgKCEqLS10KQorCSAgICAgIGdvdG8gZW5kOworCSAgICAqdCA9IChjaGFyKWM7CisJICAgIGZsYWcgPSAoYyA9PSAnXHInKTsKKwkgICAgbSA9IHQgLSBzb2FwLT50bXBidWYgKyAxIC0gZmxhZzsKKwkgICAgdCA9IHNvYXAtPnRtcGJ1ZjsKKwkgICAgYyA9ICdccic7CisJICB9CisJICAqcysrID0gKGNoYXIpYzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KK2VuZDoKKyAgICAqcyA9ICdcMCc7IC8qIGZvcmNlIDAtdGVybWluYXRlZCAqLworICAgIGNvbnRlbnQtPnNpemUgPSBzb2FwX3NpemVfYmxvY2soc29hcCwgaSsxKS0xOworICAgIGNvbnRlbnQtPnB0ciA9IHNvYXBfc2F2ZV9ibG9jayhzb2FwLCBOVUxMLCAwKTsKKyAgICBzb2FwX3Jlc29sdmVfYXR0YWNobWVudChzb2FwLCBjb250ZW50KTsKKyAgICBpZiAoYyA9PSAnLScgJiYgc29hcF9nZXRjaGFyKHNvYXApID09ICctJykKKyAgICAgIGJyZWFrOworICAgIHdoaWxlIChjICE9ICdccicgJiYgKGludCljICE9IEVPRiAmJiBzb2FwX2JsYW5rKGMpKQorICAgICAgYyA9IHNvYXBfZ2V0Y2hhcihzb2FwKTsKKyAgICBpZiAoYyAhPSAnXHInIHx8IHNvYXBfZ2V0Y2hhcihzb2FwKSAhPSAnXG4nKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9NSU1FX0VSUk9SOworICAgIGlmIChzb2FwX2dldG1pbWVoZHIoc29hcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK3NvYXBfbWF0Y2hfY2lkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICp0KQoreyByZWdpc3RlciBzaXplX3QgbjsKKyAgaWYgKCFzKQorICAgIHJldHVybiAxOworICBpZiAoIXN0cmNtcChzLCB0KSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKCFzdHJuY21wKHMsICJjaWQ6IiwgNCkpCisgICAgcyArPSA0OworICBuID0gc3RybGVuKHQpOworICBpZiAoKnQgPT0gJzwnKQorICB7IHQrKzsKKyAgICBuIC09IDI7CisgIH0KKyAgaWYgKCFzdHJuY21wKHMsIHQsIG4pICYmICFzW25dKQorICAgIHJldHVybiAwOworICBzb2FwX2RlY29kZShzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpLCBzLCBTT0FQX1NUUl9FT1MpOworICBpZiAoIXN0cm5jbXAoc29hcC0+dG1wYnVmLCB0LCBuKSAmJiAhc29hcC0+dG1wYnVmW25dKQorICAgIHJldHVybiAwOworICByZXR1cm4gMTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIHZvaWQKK3NvYXBfcmVzb2x2ZV9hdHRhY2htZW50KHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQpCit7IGlmIChjb250ZW50LT5pZCkKKyAgeyByZWdpc3RlciBzdHJ1Y3Qgc29hcF94bGlzdCAqKnhwID0gJnNvYXAtPnhsaXN0OworICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiUmVzb2x2aW5nIGF0dGFjaG1lbnQgZGF0YSBmb3IgaWQ9JXNcbiIsIGNvbnRlbnQtPmlkKSk7CisgICAgd2hpbGUgKCp4cCkKKyAgICB7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3hsaXN0ICp4cSA9ICp4cDsKKyAgICAgIGlmICghc29hcF9tYXRjaF9jaWQoc29hcCwgeHEtPmlkLCBjb250ZW50LT5pZCkpCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiRm91bmQgbWF0Y2hpbmcgYXR0YWNobWVudCAlcyBmb3IgY29udGVudCBpZD0lc1xuIiwgeHEtPmlkLCBjb250ZW50LT5pZCkpOworCSp4cCA9IHhxLT5uZXh0OworICAgICAgICAqeHEtPnB0ciA9ICh1bnNpZ25lZCBjaGFyKiljb250ZW50LT5wdHI7CisgICAgICAgICp4cS0+c2l6ZSA9IChpbnQpY29udGVudC0+c2l6ZTsKKyAgICAgICAgKnhxLT50eXBlID0gKGNoYXIqKWNvbnRlbnQtPnR5cGU7CisJaWYgKGNvbnRlbnQtPm9wdGlvbnMpCisgICAgICAgICAgKnhxLT5vcHRpb25zID0gKGNoYXIqKWNvbnRlbnQtPm9wdGlvbnM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAqeHEtPm9wdGlvbnMgPSAoY2hhciopY29udGVudC0+ZGVzY3JpcHRpb247CisJU09BUF9GUkVFKHNvYXAsIHhxKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeHAgPSAmKCp4cCktPm5leHQ7CisgICAgfQorICB9Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRtaW1laGRyKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQpCit7IGNvbnN0IGNoYXIgKnM7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiTUlNRSBhdHRhY2htZW50IHR5cGU9JXNcbiIsIGNvbnRlbnQtPnR5cGU/Y29udGVudC0+dHlwZToiIikpOworICBpZiAoc29hcF9zZW5kMyhzb2FwLCAiXHJcbi0tIiwgc29hcC0+bWltZS5ib3VuZGFyeSwgIlxyXG4iKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmIChjb250ZW50LT50eXBlICYmIHNvYXBfc2VuZDMoc29hcCwgIkNvbnRlbnQtVHlwZTogIiwgY29udGVudC0+dHlwZSwgIlxyXG4iKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHMgPSBzb2FwX3N0cl9jb2RlKG1pbWVfY29kZXMsIGNvbnRlbnQtPmVuY29kaW5nKTsKKyAgaWYgKHMgJiYgc29hcF9zZW5kMyhzb2FwLCAiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogIiwgcywgIlxyXG4iKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmIChjb250ZW50LT5pZCAmJiBzb2FwX3NlbmQzKHNvYXAsICJDb250ZW50LUlEOiAiLCBjb250ZW50LT5pZCwgIlxyXG4iKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmIChjb250ZW50LT5sb2NhdGlvbiAmJiBzb2FwX3NlbmQzKHNvYXAsICJDb250ZW50LUxvY2F0aW9uOiAiLCBjb250ZW50LT5sb2NhdGlvbiwgIlxyXG4iKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIGlmIChjb250ZW50LT5kZXNjcmlwdGlvbiAmJiBzb2FwX3NlbmQzKHNvYXAsICJDb250ZW50LURlc2NyaXB0aW9uOiAiLCBjb250ZW50LT5kZXNjcmlwdGlvbiwgIlxyXG4iKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX3NlbmRfcmF3KHNvYXAsICJcclxuIiwgMik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRtaW1lKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgIGlmICghKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKSB8fCAhc29hcC0+bWltZS5ib3VuZGFyeSkKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJTZW5kaW5nIE1JTUUgYXR0YWNobWVudHNcbiIpKTsKKyAgZm9yIChjb250ZW50ID0gc29hcC0+bWltZS5maXJzdDsgY29udGVudDsgY29udGVudCA9IGNvbnRlbnQtPm5leHQpCisgICAgaWYgKHNvYXBfcHV0bWltZWhkcihzb2FwLCBjb250ZW50KQorICAgICB8fCBzb2FwX3NlbmRfcmF3KHNvYXAsIGNvbnRlbnQtPnB0ciwgY29udGVudC0+c2l6ZSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIHJldHVybiBzb2FwX3NlbmQzKHNvYXAsICJcclxuLS0iLCBzb2FwLT5taW1lLmJvdW5kYXJ5LCAiLS0iKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9zZXRfZGltZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+b21vZGUgfD0gU09BUF9FTkNfRElNRTsKKyAgc29hcC0+ZGltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPmRpbWUubGFzdCA9IE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X21pbWUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmJvdW5kYXJ5LCBjb25zdCBjaGFyICpzdGFydCkKK3sgc29hcC0+b21vZGUgfD0gU09BUF9FTkNfTUlNRTsKKyAgc29hcC0+bWltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuYm91bmRhcnkgPSBzb2FwX3N0cmR1cChzb2FwLCBib3VuZGFyeSk7CisgIHNvYXAtPm1pbWUuc3RhcnQgPSBzb2FwX3N0cmR1cChzb2FwLCBzdGFydCk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfY2xyX2RpbWUoc3RydWN0IHNvYXAgKnNvYXApCit7IHNvYXAtPm9tb2RlICY9IH5TT0FQX0VOQ19ESU1FOworICBzb2FwLT5kaW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5sYXN0ID0gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9jbHJfbWltZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+b21vZGUgJj0gflNPQVBfRU5DX01JTUU7CisgIHNvYXAtPm1pbWUuZmlyc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmxhc3QgPSBOVUxMOworICBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gTlVMTDsKKyAgc29hcC0+bWltZS5zdGFydCA9IE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqCitzb2FwX25ld19tdWx0aXBhcnQoc3RydWN0IHNvYXAgKnNvYXAsIHN0cnVjdCBzb2FwX211bHRpcGFydCAqKmZpcnN0LCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKipsYXN0LCBjaGFyICpwdHIsIHNpemVfdCBzaXplKQoreyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQ7CisgIGNvbnRlbnQgPSAoc3RydWN0IHNvYXBfbXVsdGlwYXJ0Kilzb2FwX21hbGxvYyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfbXVsdGlwYXJ0KSk7CisgIGlmIChjb250ZW50KQorICB7IGNvbnRlbnQtPm5leHQgPSBOVUxMOworICAgIGNvbnRlbnQtPnB0ciA9IHB0cjsKKyAgICBjb250ZW50LT5zaXplID0gc2l6ZTsKKyAgICBjb250ZW50LT5pZCA9IE5VTEw7CisgICAgY29udGVudC0+dHlwZSA9IE5VTEw7CisgICAgY29udGVudC0+b3B0aW9ucyA9IE5VTEw7CisgICAgY29udGVudC0+ZW5jb2RpbmcgPSBTT0FQX01JTUVfTk9ORTsKKyAgICBjb250ZW50LT5sb2NhdGlvbiA9IE5VTEw7CisgICAgY29udGVudC0+ZGVzY3JpcHRpb24gPSBOVUxMOworICAgIGlmICghKmZpcnN0KQorICAgICAgKmZpcnN0ID0gY29udGVudDsKKyAgICBpZiAoKmxhc3QpCisgICAgICAoKmxhc3QpLT5uZXh0ID0gY29udGVudDsKKyAgICAqbGFzdCA9IGNvbnRlbnQ7CisgIH0KKyAgcmV0dXJuIGNvbnRlbnQ7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZXRfZGltZV9hdHRhY2htZW50KHN0cnVjdCBzb2FwICpzb2FwLCBjaGFyICpwdHIsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICppZCwgdW5zaWduZWQgc2hvcnQgb3B0eXBlLCBjb25zdCBjaGFyICpvcHRpb24pCit7IHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudCA9IHNvYXBfbmV3X211bHRpcGFydChzb2FwLCAmc29hcC0+ZGltZS5maXJzdCwgJnNvYXAtPmRpbWUubGFzdCwgcHRyLCBzaXplKTsKKyAgaWYgKCFjb250ZW50KQorICAgIHJldHVybiBTT0FQX0VPTTsKKyAgY29udGVudC0+aWQgPSBzb2FwX3N0cmR1cChzb2FwLCBpZCk7CisgIGNvbnRlbnQtPnR5cGUgPSBzb2FwX3N0cmR1cChzb2FwLCB0eXBlKTsKKyAgY29udGVudC0+b3B0aW9ucyA9IHNvYXBfZGltZV9vcHRpb24oc29hcCwgb3B0eXBlLCBvcHRpb24pOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NldF9taW1lX2F0dGFjaG1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNoYXIgKnB0ciwgc2l6ZV90IHNpemUsIGVudW0gc29hcF9taW1lX2VuY29kaW5nIGVuY29kaW5nLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqbG9jYXRpb24sIGNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uKQoreyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmNvbnRlbnQgPSBzb2FwX25ld19tdWx0aXBhcnQoc29hcCwgJnNvYXAtPm1pbWUuZmlyc3QsICZzb2FwLT5taW1lLmxhc3QsIHB0ciwgc2l6ZSk7CisgIGlmICghY29udGVudCkKKyAgICByZXR1cm4gU09BUF9FT007CisgIGNvbnRlbnQtPmlkID0gc29hcF9zdHJkdXAoc29hcCwgaWQpOworICBjb250ZW50LT50eXBlID0gc29hcF9zdHJkdXAoc29hcCwgdHlwZSk7CisgIGNvbnRlbnQtPmVuY29kaW5nID0gZW5jb2Rpbmc7CisgIGNvbnRlbnQtPmxvY2F0aW9uID0gc29hcF9zdHJkdXAoc29hcCwgbG9jYXRpb24pOworICBjb250ZW50LT5kZXNjcmlwdGlvbiA9IHNvYXBfc3RyZHVwKHNvYXAsIGRlc2NyaXB0aW9uKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwX211bHRpcGFydCoKK1NPQVBfRk1BQzIKK3NvYXBfbmV4dF9tdWx0aXBhcnQoc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50KQoreyBpZiAoY29udGVudCkKKyAgICByZXR1cm4gY29udGVudC0+bmV4dDsKKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyB2b2lkCitzb2FwX3NlbGVjdF9taW1lX2JvdW5kYXJ5KHN0cnVjdCBzb2FwICpzb2FwKQoreyB3aGlsZSAoIXNvYXAtPm1pbWUuYm91bmRhcnkgfHwgc29hcF92YWxpZF9taW1lX2JvdW5kYXJ5KHNvYXApKQorICB7IHJlZ2lzdGVyIGNoYXIgKnMgPSBzb2FwLT5taW1lLmJvdW5kYXJ5OworICAgIHJlZ2lzdGVyIHNpemVfdCBuID0gMDsKKyAgICBpZiAocykKKyAgICAgIG4gPSBzdHJsZW4ocyk7CisgICAgaWYgKG4gPCAxNikKKyAgICB7IG4gPSA2NDsKKyAgICAgIHMgPSBzb2FwLT5taW1lLmJvdW5kYXJ5ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIG4gKyAxKTsKKyAgICAgIGlmICghcykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdHJjcHkocywgIj09Iik7CisgICAgcyArPSAyOworICAgIG4gLT0gNDsKKyAgICB3aGlsZSAobikKKyAgICB7ICpzKysgPSBzb2FwX2Jhc2U2NG9bc29hcF9yYW5kb20gJiAweDNGXTsKKyAgICAgIG4tLTsKKyAgICB9CisgICAgc3RyY3B5KHMsICI9PSIpOworICB9CisgIGlmICghc29hcC0+bWltZS5zdGFydCkKKyAgICBzb2FwLT5taW1lLnN0YXJ0ID0gIjxTT0FQLUVOVjpFbnZlbG9wZT4iOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzb2FwX3ZhbGlkX21pbWVfYm91bmRhcnkoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX211bHRpcGFydCAqY29udGVudDsKKyAgcmVnaXN0ZXIgc2l6ZV90IGsgPSBzdHJsZW4oc29hcC0+bWltZS5ib3VuZGFyeSk7CisgIGZvciAoY29udGVudCA9IHNvYXAtPm1pbWUuZmlyc3Q7IGNvbnRlbnQ7IGNvbnRlbnQgPSBjb250ZW50LT5uZXh0KQorICB7IGlmIChjb250ZW50LT5wdHIgJiYgY29udGVudC0+c2l6ZSA+PSBrKQorICAgIHsgcmVnaXN0ZXIgY29uc3QgY2hhciAqcCA9IChjb25zdCBjaGFyKiljb250ZW50LT5wdHI7IAorICAgICAgcmVnaXN0ZXIgc2l6ZV90IGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgY29udGVudC0+c2l6ZSAtIGs7IGkrKywgcCsrKQorICAgICAgICBpZiAoIXN0cm5jbXAocCwgc29hcC0+bWltZS5ib3VuZGFyeSwgaykpCisgICAgICAgICAgcmV0dXJuIFNPQVBfRVJSOworICAgIH0KKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKgorICoJSFRUUCBjb29raWUgaGFuZGxpbmcKKyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgV0lUSF9DT09LSUVTCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQorc2l6ZV90CitTT0FQX0ZNQUMyCitzb2FwX2VuY29kZV9jb29raWUoY29uc3QgY2hhciAqcywgY2hhciAqdCwgc2l6ZV90IGxlbikKK3sgcmVnaXN0ZXIgaW50IGM7CisgIHJlZ2lzdGVyIHNpemVfdCBuID0gbGVuOworICB3aGlsZSAoKGMgPSAqcysrKSAmJiAtLW4gPiAwKQorICB7IGlmIChjID4gJyAnICYmIGMgPCAxMjggJiYgIXN0cmNocigiKCk8PkAsOzpcXFwiL1tdPz17fSIsIGMpKQorICAgICAgKnQrKyA9IGM7CisgICAgZWxzZSBpZiAobiA+IDIpCisgICAgeyAqdCsrID0gJyUnOworICAgICAgKnQrKyA9IChjID4+IDQpICsgKGMgPiAxNTkgPyAnNycgOiAnMCcpOworICAgICAgYyAmPSAweEY7CisgICAgICAqdCsrID0gYyArIChjID4gOSA/ICc3JyA6ICcwJyk7CisgICAgICBuIC09IDI7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGJyZWFrOworICB9CisgICp0ID0gJ1wwJzsKKyAgcmV0dXJuIGxlbiAtIG47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitzdHJ1Y3Qgc29hcF9jb29raWUqCitTT0FQX0ZNQUMyCitzb2FwX2Nvb2tpZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIHNpemVfdCBuOworICBpZiAoIWRvbWFpbikKKyAgICBkb21haW4gPSBzb2FwLT5jb29raWVfZG9tYWluOworICBpZiAoIXBhdGgpCisgICAgcGF0aCA9IHNvYXAtPmNvb2tpZV9wYXRoOworICBpZiAoKnBhdGggPT0gJy8nKQorICAgIHBhdGgrKzsKKyAgbiA9IHN0cmxlbihwYXRoKTsKKyAgZm9yIChwID0gc29hcC0+Y29va2llczsgcDsgcCA9IHAtPm5leHQpCisgICAgaWYgKCFzdHJjbXAocC0+bmFtZSwgbmFtZSkKKyAgICAgJiYgZG9tYWluCisgICAgICYmIHAtPmRvbWFpbgorICAgICAmJiAhc3RyY21wKHAtPmRvbWFpbiwgZG9tYWluKQorICAgICAmJiAhc3RybmNtcChwLT5wYXRoLCBwYXRoLCBuKSkKKyAgICAgIGJyZWFrOworICByZXR1cm4gcDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwX2Nvb2tpZSoKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2Nvb2tpZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICoqcCwgKnE7CisgIGludCBuOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlNldCBjb29raWU6ICVzPSVzIGRvbWFpbj0lcyBwYXRoPSVzXG4iLCBuYW1lLCB2YWx1ZT92YWx1ZToiIiwgZG9tYWluP2RvbWFpbjoiIiwgcGF0aD9wYXRoOiIiKSk7CisgIGlmICghZG9tYWluKQorICAgIGRvbWFpbiA9IHNvYXAtPmNvb2tpZV9kb21haW47CisgIGlmICghcGF0aCkKKyAgICBwYXRoID0gc29hcC0+Y29va2llX3BhdGg7CisgIGlmICghcGF0aCkKKyAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiQ29va2llIHBhdGggbm90IHNldCIsIE5VTEwsIFNPQVBfSFRUUF9FUlJPUik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKCpwYXRoID09ICcvJykKKyAgICBwYXRoKys7CisgIHEgPSBzb2FwX2Nvb2tpZShzb2FwLCBuYW1lLCBkb21haW4sIHBhdGgpOworICBpZiAoIXEpCisgIHsgaWYgKChxID0gKHN0cnVjdCBzb2FwX2Nvb2tpZSopU09BUF9NQUxMT0Moc29hcCwgc2l6ZW9mKHN0cnVjdCBzb2FwX2Nvb2tpZSkpKSkKKyAgICB7IGlmICgocS0+bmFtZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4obmFtZSkrMSkpKQorICAgICAgICBzdHJjcHkocS0+bmFtZSwgbmFtZSk7CisgICAgICBxLT52YWx1ZSA9IE5VTEw7CisgICAgICBxLT5kb21haW4gPSBOVUxMOworICAgICAgcS0+cGF0aCA9IE5VTEw7CisgICAgICBxLT5leHBpcmUgPSAtMTsKKyAgICAgIHEtPnZlcnNpb24gPSAwOworICAgICAgcS0+c2VjdXJlID0gMDsKKyAgICAgIHEtPm1vZGlmaWVkID0gMDsKKyAgICAgIGZvciAocCA9ICZzb2FwLT5jb29raWVzLCBuID0gc29hcC0+Y29va2llX21heDsgKnAgJiYgbjsgcCA9ICYoKnApLT5uZXh0LCBuLS0pCisgICAgICAgIGlmICghc3RyY21wKCgqcCktPm5hbWUsIG5hbWUpICYmICgqcCktPnBhdGggJiYgc3RyY21wKCgqcCktPnBhdGgsIHBhdGgpIDwgMCkKKyAgICAgICAgICBicmVhazsKKyAgICAgIGlmIChuKQorICAgICAgeyBxLT5uZXh0ID0gKnA7CisgICAgICAgICpwID0gcTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgU09BUF9GUkVFKHNvYXAsIHEtPm5hbWUpOworICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcSk7CisgICAgICAgIHEgPSBOVUxMOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgICAgcS0+bW9kaWZpZWQgPSAxOworICBpZiAocSkKKyAgeyBpZiAocS0+dmFsdWUpCisgICAgeyBTT0FQX0ZSRUUoc29hcCwgcS0+dmFsdWUpOworICAgICAgcS0+dmFsdWUgPSBOVUxMOworICAgIH0KKyAgICBpZiAocS0+ZG9tYWluKQorICAgIHsgU09BUF9GUkVFKHNvYXAsIHEtPmRvbWFpbik7CisgICAgICBxLT5kb21haW4gPSBOVUxMOworICAgIH0KKyAgICBpZiAocS0+cGF0aCkKKyAgICB7IFNPQVBfRlJFRShzb2FwLCBxLT5wYXRoKTsKKyAgICAgIHEtPnBhdGggPSBOVUxMOworICAgIH0KKyAgICBpZiAodmFsdWUgJiYgKnZhbHVlICYmIChxLT52YWx1ZSA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4odmFsdWUpKzEpKSkKKyAgICAgIHN0cmNweShxLT52YWx1ZSwgdmFsdWUpOworICAgIGlmIChkb21haW4gJiYgKmRvbWFpbiAmJiAocS0+ZG9tYWluID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihkb21haW4pKzEpKSkKKyAgICAgIHN0cmNweShxLT5kb21haW4sIGRvbWFpbik7CisgICAgaWYgKHBhdGggJiYgKnBhdGggJiYgKHEtPnBhdGggPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHBhdGgpKzEpKSkKKyAgICAgIHN0cmNweShxLT5wYXRoLCBwYXRoKTsKKyAgICBxLT5zZXNzaW9uID0gMTsKKyAgICBxLT5lbnYgPSAwOworICB9CisgIHJldHVybiBxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQordm9pZAorU09BUF9GTUFDMgorc29hcF9jbHJfY29va2llKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqKnAsICpxOworICBpZiAoIWRvbWFpbikKKyAgICBkb21haW4gPSBzb2FwLT5jb29raWVfZG9tYWluOworICBpZiAoIWRvbWFpbikKKyAgeyBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzb2FwLCAiQ29va2llIGRvbWFpbiBub3Qgc2V0IiwgTlVMTCwgU09BUF9IVFRQX0VSUk9SKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFwYXRoKQorICAgIHBhdGggPSBzb2FwLT5jb29raWVfcGF0aDsKKyAgaWYgKCFwYXRoKQorICB7IHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJDb29raWUgcGF0aCBub3Qgc2V0IiwgTlVMTCwgU09BUF9IVFRQX0VSUk9SKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCpwYXRoID09ICcvJykKKyAgICBwYXRoKys7CisgIGZvciAocCA9ICZzb2FwLT5jb29raWVzLCBxID0gKnA7IHE7IHEgPSAqcCkKKyAgICBpZiAoIXN0cmNtcChxLT5uYW1lLCBuYW1lKSAmJiAhc3RyY21wKHEtPmRvbWFpbiwgZG9tYWluKSAmJiAhc3RybmNtcChxLT5wYXRoLCBwYXRoLCBzdHJsZW4ocS0+cGF0aCkpKQorICAgIHsgaWYgKHEtPnZhbHVlKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcS0+dmFsdWUpOworICAgICAgaWYgKHEtPmRvbWFpbikKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHEtPmRvbWFpbik7CisgICAgICBpZiAocS0+cGF0aCkKKyAgICAgICAgU09BUF9GUkVFKHNvYXAsIHEtPnBhdGgpOworICAgICAgKnAgPSBxLT5uZXh0OworICAgICAgU09BUF9GUkVFKHNvYXAsIHEpOworICAgIH0KKyAgICBlbHNlCisgICAgICBwID0gJnEtPm5leHQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitjaGFyICoKK1NPQVBfRk1BQzIKK3NvYXBfY29va2llX3ZhbHVlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgaWYgKChwID0gc29hcF9jb29raWUoc29hcCwgbmFtZSwgZG9tYWluLCBwYXRoKSkpCisgICAgcmV0dXJuIHAtPnZhbHVlOworICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2NoYXIgKgorU09BUF9GTUFDMgorc29hcF9lbnZfY29va2llX3ZhbHVlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgaWYgKChwID0gc29hcF9jb29raWUoc29hcCwgbmFtZSwgZG9tYWluLCBwYXRoKSkgJiYgcC0+ZW52KQorICAgIHJldHVybiBwLT52YWx1ZTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitsb25nCitTT0FQX0ZNQUMyCitzb2FwX2Nvb2tpZV9leHBpcmUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBpZiAoKHAgPSBzb2FwX2Nvb2tpZShzb2FwLCBuYW1lLCBkb21haW4sIHBhdGgpKSkKKyAgICByZXR1cm4gcC0+ZXhwaXJlOworICByZXR1cm4gLTE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2Nvb2tpZV9leHBpcmUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGxvbmcgZXhwaXJlLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgaWYgKChwID0gc29hcF9jb29raWUoc29hcCwgbmFtZSwgZG9tYWluLCBwYXRoKSkpCisgIHsgcC0+ZXhwaXJlID0gZXhwaXJlOworICAgIHAtPm1vZGlmaWVkID0gMTsKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgfQorICByZXR1cm4gU09BUF9FUlI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2Nvb2tpZV9zZXNzaW9uKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgaWYgKChwID0gc29hcF9jb29raWUoc29hcCwgbmFtZSwgZG9tYWluLCBwYXRoKSkpCisgIHsgcC0+c2Vzc2lvbiA9IDE7CisgICAgcC0+bW9kaWZpZWQgPSAxOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIHJldHVybiBTT0FQX0VSUjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9jbHJfY29va2llX3Nlc3Npb24oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBpZiAoKHAgPSBzb2FwX2Nvb2tpZShzb2FwLCBuYW1lLCBkb21haW4sIHBhdGgpKSkKKyAgeyBwLT5zZXNzaW9uID0gMDsKKyAgICBwLT5tb2RpZmllZCA9IDE7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgcmV0dXJuIFNPQVBfRVJSOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3B1dHNldGNvb2tpZXMoc3RydWN0IHNvYXAgKnNvYXApCit7IHN0cnVjdCBzb2FwX2Nvb2tpZSAqcDsKKyAgY2hhciAqcywgdG1wWzQwOTZdOworICBjb25zdCBjaGFyICp0OworICBmb3IgKHAgPSBzb2FwLT5jb29raWVzOyBwOyBwID0gcC0+bmV4dCkKKyAgeyBpZiAocC0+bW9kaWZpZWQgfHwgIXAtPmVudikKKyAgICB7IHMgPSB0bXA7CisgICAgICBpZiAocC0+bmFtZSkKKyAgICAgICAgcyArPSBzb2FwX2VuY29kZV9jb29raWUocC0+bmFtZSwgcywgdG1wLXMrNDA2NCk7CisgICAgICBpZiAocC0+dmFsdWUgJiYgKnAtPnZhbHVlKQorICAgICAgeyAqcysrID0gJz0nOworICAgICAgICBzICs9IHNvYXBfZW5jb2RlX2Nvb2tpZShwLT52YWx1ZSwgcywgdG1wLXMrNDA2NCk7CisgICAgICB9CisgICAgICBpZiAocC0+ZG9tYWluICYmIChpbnQpc3RybGVuKHAtPmRvbWFpbikgPCB0bXAtcys0MDY0KQorICAgICAgICBzcHJpbnRmKHMsICI7RG9tYWluPVwiJXNcIiIsIHAtPmRvbWFpbik7CisgICAgICBlbHNlIGlmIChzb2FwLT5jb29raWVfZG9tYWluICYmIChpbnQpc3RybGVuKHNvYXAtPmNvb2tpZV9kb21haW4pIDwgdG1wLXMrNDA2NCkKKyAgICAgICAgc3ByaW50ZihzLCAiO0RvbWFpbj1cIiVzXCIiLCBzb2FwLT5jb29raWVfZG9tYWluKTsKKyAgICAgIHN0cmNhdChzLCAiO1BhdGg9XCIvIik7CisgICAgICBpZiAocC0+cGF0aCkKKyAgICAgICAgdCA9IHAtPnBhdGg7CisgICAgICBlbHNlCisgICAgICAgIHQgPSBzb2FwLT5jb29raWVfcGF0aDsKKyAgICAgIGlmICh0KQorICAgICAgeyBpZiAoKnQgPT0gJy8nKQorICAgICAgICAgIHQrKzsKKyAgICAgICAgaWYgKChpbnQpc3RybGVuKHQpIDwgdG1wLXMrNDA2NCkKKyAgICAgICAgICBzdHJjYXQocywgdCk7CisgICAgICB9CisgICAgICBzICs9IHN0cmxlbihzKTsKKyAgICAgICpzKysgPSAnIic7CisgICAgICBpZiAocC0+dmVyc2lvbiA+IDApCisgICAgICAgIHNwcmludGYocywgIjtWZXJzaW9uPSV1IiwgcC0+dmVyc2lvbik7CisgICAgICBpZiAocC0+ZXhwaXJlID49IDApCisgICAgICAgIHNwcmludGYocywgIjtNYXgtQWdlPSVsZCIsIHAtPmV4cGlyZSk7CisgICAgICBpZiAocC0+c2VjdXJlKQorICAgICAgICBzdHJjYXQocywgIjtTZWN1cmUiKTsKKyAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2V0LUNvb2tpZTogJXNcbiIsIHRtcCkpOworICAgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJTZXQtQ29va2llIiwgdG1wKSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcHV0Y29va2llcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZG9tYWluLCBjb25zdCBjaGFyICpwYXRoLCBpbnQgc2VjdXJlKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKipwLCAqcTsKKyAgdW5zaWduZWQgaW50IHZlcnNpb24gPSAwOworICB0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKKyAgY2hhciAqcywgdG1wWzQwOTZdOworICBwID0gJnNvYXAtPmNvb2tpZXM7CisgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2VuZGluZyBjb29raWVzIGZvciBkb21haW49JXMgcGF0aD0lc1xuIiwgZG9tYWluLCBwYXRoKSk7CisgIGlmICgqcGF0aCA9PSAnLycpCisgICAgcGF0aCsrOworICB3aGlsZSAoKHEgPSAqcCkpCisgIHsgaWYgKHEtPmV4cGlyZSAmJiBub3cgPiBxLT5leHBpcmUpCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvb2tpZSAlcyBleHBpcmVkXG4iLCBxLT5uYW1lKSk7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgcS0+bmFtZSk7CisgICAgICBpZiAocS0+dmFsdWUpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBxLT52YWx1ZSk7CisgICAgICBpZiAocS0+ZG9tYWluKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcS0+ZG9tYWluKTsKKyAgICAgIGlmIChxLT5wYXRoKQorICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcS0+cGF0aCk7CisgICAgICAqcCA9IHEtPm5leHQ7CisgICAgICBTT0FQX0ZSRUUoc29hcCwgcSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IHNpemVfdCBkb21sZW4gPSAwOworICAgICAgaWYgKHEtPmRvbWFpbikKKyAgICAgIHsgY29uc3QgY2hhciAqcyA9IHN0cmNocihxLT5kb21haW4sICc6Jyk7CisgICAgICAgIGlmIChzKQorCSAgZG9tbGVuID0gcyAtIHEtPmRvbWFpbjsKKwllbHNlCisgICAgICAgICAgZG9tbGVuID0gc3RybGVuKHEtPmRvbWFpbik7CisgICAgICB9CisgICAgICBpZiAoKCFxLT5kb21haW4gfHwgIXN0cm5jbXAocS0+ZG9tYWluLCBkb21haW4sIGRvbWxlbikpCisgICAgICAgICAgJiYgKCFxLT5wYXRoIHx8ICFzdHJuY21wKHEtPnBhdGgsIHBhdGgsIHN0cmxlbihxLT5wYXRoKSkpCisgICAgICAgICAgJiYgKCFxLT5zZWN1cmUgfHwgc2VjdXJlKSkKKyAgICAgIHsgcyA9IHRtcDsKKyAgICAgICAgaWYgKHEtPnZlcnNpb24gIT0gdmVyc2lvbikKKyAgICAgICAgeyBzcHJpbnRmKHMsICIkVmVyc2lvbj0ldTsiLCBxLT52ZXJzaW9uKTsKKyAgICAgICAgICB2ZXJzaW9uID0gcS0+dmVyc2lvbjsKKyAgICAgICAgfQorICAgICAgICBpZiAocS0+bmFtZSkKKyAgICAgICAgICBzICs9IHNvYXBfZW5jb2RlX2Nvb2tpZShxLT5uYW1lLCBzLCB0bXAtcys0MDgwKTsKKyAgICAgICAgaWYgKHEtPnZhbHVlICYmICpxLT52YWx1ZSkKKyAgICAgICAgeyAqcysrID0gJz0nOworICAgICAgICAgIHMgKz0gc29hcF9lbmNvZGVfY29va2llKHEtPnZhbHVlLCBzLCB0bXAtcys0MDgwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocS0+cGF0aCAmJiAoaW50KXN0cmxlbihxLT5wYXRoKSA8IHRtcC1zKzQwODApCisgICAgICAgIHsgc3ByaW50ZihzLCAiOyRQYXRoPVwiLyVzXCIiLCAoKnEtPnBhdGggPT0gJy8nID8gcS0+cGF0aCArIDEgOiBxLT5wYXRoKSk7CisgICAgICAgICAgcyArPSBzdHJsZW4ocyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHEtPmRvbWFpbiAmJiAoaW50KXN0cmxlbihxLT5kb21haW4pIDwgdG1wLXMrNDA4MCkKKyAgICAgICAgICBzcHJpbnRmKHMsICI7JERvbWFpbj1cIiVzXCIiLCBxLT5kb21haW4pOworICAgICAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNvb2tpZTogJXNcbiIsIHRtcCkpOworICAgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkNvb2tpZSIsIHRtcCkpKQorICAgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIH0KKyAgICAgIHAgPSAmcS0+bmV4dDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX2dldGNvb2tpZXMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnZhbCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwID0gTlVMTCwgKnE7CisgIGNvbnN0IGNoYXIgKnM7CisgIGNoYXIgKnQsIHRtcFs0MDk2XTsgLyogY29va2llIHNpemUgaXMgdXAgdG8gNDA5NiBieXRlcyBbUkZDMjEwOV0gKi8KKyAgY2hhciAqZG9tYWluID0gTlVMTDsKKyAgY2hhciAqcGF0aCA9IE5VTEw7CisgIHVuc2lnbmVkIGludCB2ZXJzaW9uID0gMDsKKyAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CisgIGlmICghdmFsKQorICAgIHJldHVybjsKKyAgcyA9IHZhbDsKKyAgd2hpbGUgKCpzKQorICB7IHMgPSBzb2FwX2RlY29kZV9rZXkodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgaWYgKCFzb2FwX3RhZ19jbXAodG1wLCAiJFZlcnNpb24iKSkKKyAgICB7IGlmICgocyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKSkpCisgICAgICB7IGlmIChwKQorICAgICAgICAgIHAtPnZlcnNpb24gPSAoaW50KWF0b2wodG1wKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHZlcnNpb24gPSAoaW50KWF0b2wodG1wKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcCh0bXAsICIkUGF0aCIpKQorICAgIHsgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgIGlmICgqdG1wKQorICAgICAgeyBpZiAoKHQgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHRtcCkrMSkpKQorICAgICAgICAgIHN0cmNweSh0LCB0bXApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB0ID0gTlVMTDsKKyAgICAgIGlmIChwKQorICAgICAgeyBpZiAocC0+cGF0aCkKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+cGF0aCk7CisgICAgICAgIHAtPnBhdGggPSB0OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBpZiAocGF0aCkKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcGF0aCk7CisgICAgICAgIHBhdGggPSB0OworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHRtcCwgIiREb21haW4iKSkKKyAgICB7IHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICBpZiAoKnRtcCkKKyAgICAgIHsgaWYgKCh0ID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbih0bXApKzEpKSkKKyAgICAgICAgICBzdHJjcHkodCwgdG1wKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgdCA9IE5VTEw7CisgICAgICBpZiAocCkKKyAgICAgIHsgaWYgKHAtPmRvbWFpbikKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+ZG9tYWluKTsKKwlwLT5kb21haW4gPSB0OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBpZiAoZG9tYWluKQorICAgICAgICAgIFNPQVBfRlJFRShzb2FwLCBkb21haW4pOworICAgICAgICBkb21haW4gPSB0OworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChwICYmICFzb2FwX3RhZ19jbXAodG1wLCAiUGF0aCIpKQorICAgIHsgaWYgKHAtPnBhdGgpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5wYXRoKTsKKyAgICAgIHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICBpZiAoKnRtcCkKKyAgICAgIHsgaWYgKChwLT5wYXRoID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbih0bXApKzEpKSkKKyAgICAgICAgICBzdHJjcHkocC0+cGF0aCwgdG1wKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcC0+cGF0aCA9IE5VTEw7CisgICAgfQorICAgIGVsc2UgaWYgKHAgJiYgIXNvYXBfdGFnX2NtcCh0bXAsICJEb21haW4iKSkKKyAgICB7IGlmIChwLT5kb21haW4pCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5kb21haW4pOworICAgICAgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgIGlmICgqdG1wKQorICAgICAgeyBpZiAoKHAtPmRvbWFpbiA9IChjaGFyKilTT0FQX01BTExPQyhzb2FwLCBzdHJsZW4odG1wKSsxKSkpCisgICAgICAgICAgc3RyY3B5KHAtPmRvbWFpbiwgdG1wKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcC0+ZG9tYWluID0gTlVMTDsKKyAgICB9CisgICAgZWxzZSBpZiAocCAmJiAhc29hcF90YWdfY21wKHRtcCwgIlZlcnNpb24iKSkKKyAgICB7IHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICBwLT52ZXJzaW9uID0gKHVuc2lnbmVkIGludClhdG9sKHRtcCk7CisgICAgfQorICAgIGVsc2UgaWYgKHAgJiYgIXNvYXBfdGFnX2NtcCh0bXAsICJNYXgtQWdlIikpCisgICAgeyBzID0gc29hcF9kZWNvZGVfdmFsKHRtcCwgc2l6ZW9mKHRtcCksIHMpOworICAgICAgcC0+ZXhwaXJlID0gbm93ICsgYXRvbCh0bXApOworICAgIH0KKyAgICBlbHNlIGlmIChwICYmICFzb2FwX3RhZ19jbXAodG1wLCAiRXhwaXJlcyIpKQorICAgIHsgc3RydWN0IHRtIFQ7CisgICAgICBjaGFyIGFbM107IAorICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbW5zW10gPSAiYW5lYmFycHJheXVudWx1Z2VwY3RvdmVjIjsKKyAgICAgIHMgPSBzb2FwX2RlY29kZV92YWwodG1wLCBzaXplb2YodG1wKSwgcyk7CisgICAgICBpZiAoc3RybGVuKHRtcCkgPiAyMCkKKyAgICAgIHsgbWVtc2V0KCh2b2lkKikmVCwgMCwgc2l6ZW9mKFQpKTsKKyAgICAgICAgYVswXSA9IHRtcFs0XTsKKyAgICAgICAgYVsxXSA9IHRtcFs1XTsKKyAgICAgICAgYVsyXSA9ICdcMCc7CisgICAgICAgIFQudG1fbWRheSA9IChpbnQpYXRvbChhKTsKKyAgICAgICAgYVswXSA9IHRtcFs4XTsKKyAgICAgICAgYVsxXSA9IHRtcFs5XTsKKyAgICAgICAgVC50bV9tb24gPSAoc3Ryc3RyKG1ucywgYSkgLSBtbnMpIC8gMjsKKyAgICAgICAgYVswXSA9IHRtcFsxMV07CisgICAgICAgIGFbMV0gPSB0bXBbMTJdOworICAgICAgICBULnRtX3llYXIgPSAxMDAgKyAoaW50KWF0b2woYSk7CisgICAgICAgIGFbMF0gPSB0bXBbMTNdOworICAgICAgICBhWzFdID0gdG1wWzE0XTsKKyAgICAgICAgVC50bV9ob3VyID0gKGludClhdG9sKGEpOworICAgICAgICBhWzBdID0gdG1wWzE2XTsKKyAgICAgICAgYVsxXSA9IHRtcFsxN107CisgICAgICAgIFQudG1fbWluID0gKGludClhdG9sKGEpOworICAgICAgICBhWzBdID0gdG1wWzE5XTsKKyAgICAgICAgYVsxXSA9IHRtcFsyMF07CisgICAgICAgIFQudG1fc2VjID0gKGludClhdG9sKGEpOworICAgICAgICBwLT5leHBpcmUgPSBzb2FwX3RpbWVnbSgmVCk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHAgJiYgIXNvYXBfdGFnX2NtcCh0bXAsICJTZWN1cmUiKSkKKyAgICAgIHAtPnNlY3VyZSA9IDE7CisgICAgZWxzZQorICAgIHsgaWYgKHApCisgICAgICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiR290IGVudmlyb25tZW50IGNvb2tpZSAlcz0lcyBkb21haW49JXMgcGF0aD0lcyBleHBpcmU9JWxkIHNlY3VyZT0lZFxuIiwgcC0+bmFtZSwgcC0+dmFsdWU/cC0+dmFsdWU6IiIsIHAtPmRvbWFpbj9wLT5kb21haW46IiIsIHAtPnBhdGg/cC0+cGF0aDoiIiwgcC0+ZXhwaXJlLCBwLT5zZWN1cmUpKTsKKyAgICAgICAgaWYgKChxID0gc29hcF9zZXRfY29va2llKHNvYXAsIHAtPm5hbWUsIHAtPnZhbHVlLCBwLT5kb21haW4sIHAtPnBhdGgpKSkKKyAgICAgICAgeyBxLT52ZXJzaW9uID0gcC0+dmVyc2lvbjsKKyAgICAgICAgICBxLT5leHBpcmUgPSBwLT5leHBpcmU7CisgICAgICAgICAgcS0+c2VjdXJlID0gcC0+c2VjdXJlOworICAgICAgICAgIHEtPmVudiA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHAtPm5hbWUpCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPm5hbWUpOworICAgICAgICBpZiAocC0+dmFsdWUpCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnZhbHVlKTsKKyAgICAgICAgaWYgKHAtPmRvbWFpbikKKyAgICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+ZG9tYWluKTsKKyAgICAgICAgaWYgKHAtPnBhdGgpCisgICAgICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnBhdGgpOworICAgICAgICBTT0FQX0ZSRUUoc29hcCwgcCk7CisgICAgICB9CisgICAgICBpZiAoKHAgPSAoc3RydWN0IHNvYXBfY29va2llKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfY29va2llKSkpKQorICAgICAgeyBwLT5uYW1lID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbih0bXApKzEpOworICAgICAgICBzdHJjcHkocC0+bmFtZSwgdG1wKTsKKyAgICAgICAgcyA9IHNvYXBfZGVjb2RlX3ZhbCh0bXAsIHNpemVvZih0bXApLCBzKTsKKyAgICAgICAgaWYgKCp0bXApCisgICAgICAgIHsgcC0+dmFsdWUgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHRtcCkrMSk7CisgICAgICAgICAgc3RyY3B5KHAtPnZhbHVlLCB0bXApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwLT52YWx1ZSA9IE5VTEw7CisgICAgICAgIHAtPmRvbWFpbiA9IGRvbWFpbjsKKyAgICAgICAgcC0+cGF0aCA9IHBhdGg7CisgICAgICAgIHAtPmV4cGlyZSA9IDA7CisgICAgICAgIHAtPnNlY3VyZSA9IDA7CisgICAgICAgIHAtPnZlcnNpb24gPSB2ZXJzaW9uOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAocCkKKyAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdvdCBlbnZpcm9ubWVudCBjb29raWUgJXM9JXMgZG9tYWluPSVzIHBhdGg9JXMgZXhwaXJlPSVsZCBzZWN1cmU9JWRcbiIsIHAtPm5hbWUsIHAtPnZhbHVlP3AtPnZhbHVlOiIiLCBwLT5kb21haW4/cC0+ZG9tYWluOiIiLCBwLT5wYXRoP3AtPnBhdGg6IiIsIHAtPmV4cGlyZSwgcC0+c2VjdXJlKSk7CisgICAgaWYgKChxID0gc29hcF9zZXRfY29va2llKHNvYXAsIHAtPm5hbWUsIHAtPnZhbHVlLCBwLT5kb21haW4sIHAtPnBhdGgpKSkKKyAgICB7IHEtPnZlcnNpb24gPSBwLT52ZXJzaW9uOworICAgICAgcS0+ZXhwaXJlID0gcC0+ZXhwaXJlOworICAgICAgcS0+c2VjdXJlID0gcC0+c2VjdXJlOworICAgICAgcS0+ZW52ID0gMTsKKyAgICB9CisgICAgaWYgKHAtPm5hbWUpCisgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+bmFtZSk7CisgICAgaWYgKHAtPnZhbHVlKQorICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPnZhbHVlKTsKKyAgICBpZiAocC0+ZG9tYWluKQorICAgICAgU09BUF9GUkVFKHNvYXAsIHAtPmRvbWFpbik7CisgICAgaWYgKHAtPnBhdGgpCisgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+cGF0aCk7CisgICAgU09BUF9GUkVFKHNvYXAsIHApOworICB9CisgIGlmIChkb21haW4pCisgICAgU09BUF9GUkVFKHNvYXAsIGRvbWFpbik7CisgIGlmIChwYXRoKQorICAgIFNPQVBfRlJFRShzb2FwLCBwYXRoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9nZXRlbnZfY29va2llcyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc3RydWN0IHNvYXBfY29va2llICpwOworICBjb25zdCBjaGFyICpzOworICBjaGFyIGtleVs0MDk2XSwgdmFsWzQwOTZdOyAvKiBjb29raWUgc2l6ZSBpcyB1cCB0byA0MDk2IGJ5dGVzIFtSRkMyMTA5XSAqLworICBpZiAoIShzID0gZ2V0ZW52KCJIVFRQX0NPT0tJRSIpKSkKKyAgICByZXR1cm4gU09BUF9FUlI7CisgIGRvCisgIHsgcyA9IHNvYXBfZGVjb2RlX2tleShrZXksIHNpemVvZihrZXkpLCBzKTsKKyAgICBzID0gc29hcF9kZWNvZGVfdmFsKHZhbCwgc2l6ZW9mKHZhbCksIHMpOworICAgIHAgPSBzb2FwX3NldF9jb29raWUoc29hcCwga2V5LCB2YWwsIE5VTEwsIE5VTEwpOworICAgIGlmIChwKQorICAgICAgcC0+ZW52ID0gMTsKKyAgfSB3aGlsZSAoKnMpOworICByZXR1cm4gU09BUF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3N0cnVjdCBzb2FwX2Nvb2tpZSoKK1NPQVBfRk1BQzIKK3NvYXBfY29weV9jb29raWVzKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnAsICoqcSwgKnI7CisgIHEgPSAmcjsKKyAgZm9yIChwID0gc29hcC0+Y29va2llczsgcDsgcCA9IHAtPm5leHQpCisgIHsgaWYgKCEoKnEgPSAoc3RydWN0IHNvYXBfY29va2llKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfY29va2llKSkpKQorICAgICAgcmV0dXJuIHI7CisgICAgKipxID0gKnA7CisgICAgaWYgKHAtPm5hbWUpCisgICAgeyBpZiAoKCgqcSktPm5hbWUgPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHAtPm5hbWUpKzEpKSkKKyAgICAgICAgc3RyY3B5KCgqcSktPm5hbWUsIHAtPm5hbWUpOworICAgIH0KKyAgICBpZiAocC0+dmFsdWUpCisgICAgeyBpZiAoKCgqcSktPnZhbHVlID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihwLT52YWx1ZSkrMSkpKQorICAgICAgICBzdHJjcHkoKCpxKS0+dmFsdWUsIHAtPnZhbHVlKTsKKyAgICB9CisgICAgaWYgKHAtPmRvbWFpbikKKyAgICB7IGlmICgoKCpxKS0+ZG9tYWluID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHN0cmxlbihwLT5kb21haW4pKzEpKSkKKyAgICAgICAgc3RyY3B5KCgqcSktPmRvbWFpbiwgcC0+ZG9tYWluKTsKKyAgICB9CisgICAgaWYgKHAtPnBhdGgpCisgICAgeyBpZiAoKCgqcSktPnBhdGggPSAoY2hhciopU09BUF9NQUxMT0Moc29hcCwgc3RybGVuKHAtPnBhdGgpKzEpKSkKKyAgICAgICAgc3RyY3B5KCgqcSktPnBhdGgsIHAtPnBhdGgpOworICAgIH0KKyAgICBxID0gJigqcSktPm5leHQ7CisgIH0KKyAgKnEgPSBOVUxMOworICByZXR1cm4gcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfZnJlZV9jb29raWVzKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzdHJ1Y3Qgc29hcF9jb29raWUgKnA7CisgIGZvciAocCA9IHNvYXAtPmNvb2tpZXM7IHA7IHAgPSBzb2FwLT5jb29raWVzKQorICB7IHNvYXAtPmNvb2tpZXMgPSBwLT5uZXh0OworICAgIFNPQVBfRlJFRShzb2FwLCBwLT5uYW1lKTsKKyAgICBpZiAocC0+dmFsdWUpCisgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+dmFsdWUpOworICAgIGlmIChwLT5kb21haW4pCisgICAgICBTT0FQX0ZSRUUoc29hcCwgcC0+ZG9tYWluKTsKKyAgICBpZiAocC0+cGF0aCkKKyAgICAgIFNPQVBfRlJFRShzb2FwLCBwLT5wYXRoKTsKKyAgICBTT0FQX0ZSRUUoc29hcCwgcCk7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNlbmRpZiAvKiBXSVRIX0NPT0tJRVMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBXSVRIX0daSVAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50Citzb2FwX2dldGd6aXBoZHIoc3RydWN0IHNvYXAgKnNvYXApCit7IGludCBpOworICBzb2FwX3djaGFyIGMsIGYgPSAwOworICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkdldCBnemlwIGhlYWRlclxuIikpOworICBmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKQorICB7IGlmICgoaW50KShjID0gc29hcF9nZXQxKHNvYXApID09IEVPRikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgICBpZiAoaSA9PSAyKQorICAgICAgZiA9IGM7CisgIH0KKyAgaWYgKGYgJiAweDA0KSAvKiBGRVhUUkEgKi8KKyAgeyBmb3IgKGkgPSBzb2FwX2dldDEoc29hcCkgfCAoc29hcF9nZXQxKHNvYXApIDw8IDgpOyBpOyBpLS0pCisgICAgICBpZiAoKGludClzb2FwX2dldDEoc29hcCkgPT0gRU9GKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX0VPRjsKKyAgfQorICBpZiAoZiAmIDB4MDgpIC8qIEZOQU1FICovCisgICAgZG8KKyAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgd2hpbGUgKGMgJiYgKGludCljICE9IEVPRik7CisgIGlmICgoaW50KWMgIT0gRU9GICYmIChmICYgMHgxMCkpIC8qIEZDT01NRU5UICovCisgICAgZG8KKyAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgICAgd2hpbGUgKGMgJiYgKGludClmICE9IEVPRik7CisgIGlmICgoaW50KWMgIT0gRU9GICYmIChmICYgMHgwMSkpIC8qIEZIQ1JDICovCisgIHsgaWYgKChpbnQpKGMgPSBzb2FwX2dldDEoc29hcCkpICE9IEVPRikKKyAgICAgIGMgPSBzb2FwX2dldDEoc29hcCk7CisgIH0KKyAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYmVnaW5fcmVjdihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcF93Y2hhciBjOworICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIHNvYXBfZnJlZShzb2FwKTsKKyAgc29hcF9zZXRfbG9jYWxfbmFtZXNwYWNlcyhzb2FwKTsKKyAgc29hcC0+dmVyc2lvbiA9IDA7CS8qIGRvbid0IGFzc3VtZSB3ZSdyZSBwYXJzaW5nIFNPQVAgY29udGVudCBieSBkZWZhdWx0ICovCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorICBzb2FwX2ZyZWVfaWh0KHNvYXApOworI2VuZGlmCisgIGlmICgoc29hcC0+aW1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKQorICAgIHNvYXAtPm9tb2RlIHw9IFNPQVBfSU9fQ0hVTks7CisgIHNvYXAtPmltb2RlICY9IH5TT0FQX0lPOworICBzb2FwLT5tb2RlID0gc29hcC0+aW1vZGU7CisgIGlmICghc29hcC0+a2VlcF9hbGl2ZSkKKyAgeyBzb2FwLT5idWZsZW4gPSAwOworICAgIHNvYXAtPmJ1ZmlkeCA9IDA7CisgIH0KKyAgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfSU9fS0VFUEFMSVZFKSkKKyAgICBzb2FwLT5rZWVwX2FsaXZlID0gMDsKKyAgc29hcC0+YWhlYWQgPSAwOworICBzb2FwLT5wZWVrZWQgPSAwOworICBzb2FwLT5sZXZlbCA9IDA7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0JFR0lOOworICBzb2FwLT5hbGxvY2VkID0gMDsKKyAgc29hcC0+Y291bnQgPSAwOworICBzb2FwLT5sZW5ndGggPSAwOworICBzb2FwLT5jZGF0YSA9IDA7CisgICpzb2FwLT5lbmRwb2ludCA9ICdcMCc7CisgIHNvYXAtPmFjdGlvbiA9IE5VTEw7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNvYXAtPmRvbSA9IE5VTEw7CisgIHNvYXAtPmRpbWUuY2h1bmtzaXplID0gMDsKKyAgc29hcC0+ZGltZS5idWZsZW4gPSAwOworICBzb2FwLT5kaW1lLmxpc3QgPSBOVUxMOworICBzb2FwLT5kaW1lLmZpcnN0ID0gTlVMTDsKKyAgc29hcC0+ZGltZS5sYXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5saXN0ID0gTlVMTDsKKyAgc29hcC0+bWltZS5maXJzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUubGFzdCA9IE5VTEw7CisgIHNvYXAtPm1pbWUuYm91bmRhcnkgPSBOVUxMOworICBzb2FwLT5taW1lLnN0YXJ0ID0gTlVMTDsKKyAgc29hcC0+eGxpc3QgPSBOVUxMOworI2VuZGlmCisjaWZkZWYgV0lOMzIKKyNpZm5kZWYgVU5ERVJfQ0UKKyNpZm5kZWYgV0lUSF9GQVNUQ0dJCisgIGlmICghc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkKKyNpZmRlZiBfX0JPUkxBTkRDX18KKyAgICBzZXRtb2RlKChTT0FQX1NPQ0tFVClzb2FwLT5yZWN2ZmQsIE9fQklOQVJZKTsKKyNlbHNlCisgICAgX3NldG1vZGUoKFNPQVBfU09DS0VUKXNvYXAtPnJlY3ZmZCwgX09fQklOQVJZKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIFdJVEhfWkxJQgorICBzb2FwLT5tb2RlICY9IH5TT0FQX0VOQ19aTElCOworICBzb2FwLT56bGliX2luID0gU09BUF9aTElCX05PTkU7CisgIHNvYXAtPnpsaWJfb3V0ID0gU09BUF9aTElCX05PTkU7CisgIHNvYXAtPmRfc3RyZWFtLm5leHRfaW4gPSBaX05VTEw7CisgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luID0gMDsKKyAgc29hcC0+ZF9zdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZSopc29hcC0+YnVmOworICBzb2FwLT5kX3N0cmVhbS5hdmFpbF9vdXQgPSBTT0FQX0JVRkxFTjsKKyAgc29hcC0+el9yYXRpb19pbiA9IDEuMDsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoc29hcC0+ZnByZXBhcmVpbml0KQorICAgIHNvYXAtPmZwcmVwYXJlaW5pdChzb2FwKTsKKyNlbmRpZgorICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworI2lmZGVmIFdJVEhfR1pJUAorICBpZiAoYyA9PSAweDFGKQorICB7IGlmIChzb2FwX2dldGd6aXBoZHIoc29hcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKGluZmxhdGVJbml0Migmc29hcC0+ZF9zdHJlYW0sIC1NQVhfV0JJVFMpICE9IFpfT0spCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgc29hcC0+emxpYl9zdGF0ZSA9IFNPQVBfWkxJQl9JTkZMQVRFOworICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfWkxJQjsKKyAgICBzb2FwLT56bGliX2luID0gU09BUF9aTElCX0daSVA7CisgICAgc29hcC0+el9jcmMgPSBjcmMzMigwTCwgTlVMTCwgMCk7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJnemlwIGluaXRpYWxpemVkXG4iKSk7CisgICAgbWVtY3B5KHNvYXAtPnpfYnVmLCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOKTsKKyAgICAvKiBzaG91bGQgbm90IGNodW5rIG92ZXIgcGxhaW4gdHJhbnNwb3J0LCBzbyB3aHkgYm90aGVyIHRvIGNoZWNrPyAqLworICAgIC8qIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspICovCisgICAgLyogICBzb2FwLT56X2J1ZmxlbiA9IHNvYXAtPmJ1ZmlkeDsgKi8KKyAgICAvKiBlbHNlICovCisgICAgc29hcC0+ZF9zdHJlYW0ubmV4dF9pbiA9IChCeXRlKikoc29hcC0+el9idWYgKyBzb2FwLT5idWZpZHgpOworICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luID0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgIHNvYXAtPnpfYnVmbGVuID0gc29hcC0+YnVmbGVuOworICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmJ1ZmlkeDsKKyAgICBjID0gc29hcF9nZXRjaGFyKHNvYXApOworICB9ICAKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU5FUgorICBpZiAoYyA9PSAnLScgJiYgc29hcF9nZXQwKHNvYXApID09ICctJykKKyAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX01JTUU7CisgIGVsc2UgaWYgKChjICYgMHhGRkZDKSA9PSAoU09BUF9ESU1FX1ZFUlNJT04gfCBTT0FQX0RJTUVfTUIpICYmIChzb2FwX2dldDAoc29hcCkgJiAweEZGRjApID09IDB4MjApCisgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19ESU1FOworICBlbHNlCisjZW5kaWYKKyAgeyB3aGlsZSAoc29hcF9ibGFuayhjKSkKKyAgICAgIGMgPSBzb2FwX2dldGNoYXIoc29hcCk7CisgIH0KKyAgaWYgKChpbnQpYyA9PSBFT0YpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9FT0Y7CisgIHNvYXBfdW5nZXQoc29hcCwgYyk7CisjaWZuZGVmIFdJVEhfTk9IVFRQCisgIC8qIGlmIG5vdCBYTUwgb3IgKHN0YXJ0IG9mKUJPTSBvciBNSU1FL0RJTUUvWkxJQiwgYXNzdW1lIEhUVFAgaGVhZGVyICovCisgIGlmIChjICE9ICc8JyAmJiBjICE9IDB4RUYgJiYgIShzb2FwLT5tb2RlICYgKFNPQVBfRU5DX01JTUUgfCBTT0FQX0VOQ19ESU1FIHwgU09BUF9FTkNfWkxJQikpKQorICB7IHNvYXAtPm1vZGUgJj0gflNPQVBfSU87CisgICAgc29hcC0+ZXJyb3IgPSBzb2FwLT5mcGFyc2Uoc29hcCk7CisgICAgaWYgKHNvYXAtPmVycm9yICYmIHNvYXAtPmVycm9yIDwgU09BUF9TVE9QKQorICAgIHsgc29hcC0+a2VlcF9hbGl2ZSA9IDA7IC8qIGZvcmNlIGNsb3NlIGxhdGVyICovCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorICAgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgICAgeyBzb2FwLT5jaHVua2J1ZmxlbiA9IHNvYXAtPmJ1ZmxlbjsKKyAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmJ1ZmlkeDsKKyAgICAgIHNvYXAtPmNodW5rc2l6ZSA9IDA7CisgICAgfQorI2lmbmRlZiBXSVRIX0xFQU5FUgorICAgIGVsc2UgaWYgKHNvYXAtPmZwcmVwYXJlcmVjdiAmJiBzb2FwLT5idWZsZW4gIT0gc29hcC0+YnVmaWR4KQorICAgICAgc29hcC0+ZnByZXBhcmVyZWN2KHNvYXAsIHNvYXAtPmJ1ZiArIHNvYXAtPmJ1ZmlkeCwgc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4KTsKKyNlbmRpZgorI2lmZGVmIFdJVEhfWkxJQgorICAgIGlmIChzb2FwLT56bGliX2luICE9IFNPQVBfWkxJQl9OT05FKQorICAgIHsgLyogZnBhcnNlIHNob3VsZCBub3QgdXNlIHNvYXBfdW5nZXQgdG8gcHVzaCBiYWNrIGxhc3QgY2hhciAqLworI2lmZGVmIFdJVEhfR1pJUAorICAgICAgYyA9IHNvYXBfZ2V0MShzb2FwKTsKKyAgICAgIGlmIChjID09IDB4MUYpCisgICAgICB7IGlmIChzb2FwX2dldGd6aXBoZHIoc29hcCkpCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgICAgICBpZiAoaW5mbGF0ZUluaXQyKCZzb2FwLT5kX3N0cmVhbSwgLU1BWF9XQklUUykgIT0gWl9PSykKKyAgICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1pMSUJfRVJST1I7CisgICAgICAgIHNvYXAtPnpsaWJfc3RhdGUgPSBTT0FQX1pMSUJfSU5GTEFURTsKKyAgICAgICAgc29hcC0+el9jcmMgPSBjcmMzMigwTCwgTlVMTCwgMCk7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiZ3ppcCBpbml0aWFsaXplZFxuIikpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBzb2FwX3JldmdldDEoc29hcCk7CisjZWxzZQorICAgICAgeworI2VuZGlmCisgICAgICAgIGlmIChpbmZsYXRlSW5pdCgmc29hcC0+ZF9zdHJlYW0pICE9IFpfT0spCisgICAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gU09BUF9aTElCX0VSUk9SOworICAgICAgICBzb2FwLT56bGliX3N0YXRlID0gU09BUF9aTElCX0lORkxBVEU7CisgICAgICAgIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiSW5mbGF0ZSBpbml0aWFsaXplZFxuIikpOworICAgICAgfQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19aTElCOworICAgICAgbWVtY3B5KHNvYXAtPnpfYnVmLCBzb2FwLT5idWYsIFNPQVBfQlVGTEVOKTsKKyAgICAgIHNvYXAtPmRfc3RyZWFtLm5leHRfaW4gPSAoQnl0ZSopKHNvYXAtPnpfYnVmICsgc29hcC0+YnVmaWR4KTsKKyAgICAgIHNvYXAtPmRfc3RyZWFtLmF2YWlsX2luID0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICAgICAgc29hcC0+el9idWZsZW4gPSBzb2FwLT5idWZsZW47CisgICAgICBzb2FwLT5idWZsZW4gPSBzb2FwLT5idWZpZHg7CisgICAgfQorI2VuZGlmCisgICAgaWYgKHNvYXAtPmVycm9yKQorICAgIHsgaWYgKHNvYXAtPmVycm9yID09IFNPQVBfRk9STSAmJiBzb2FwLT5mZm9ybSkKKyAgICAgIHsgc29hcC0+ZXJyb3IgPSBzb2FwLT5mZm9ybShzb2FwKTsKKyAgICAgICAgaWYgKHNvYXAtPmVycm9yID09IFNPQVBfT0spCisgICAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1NUT1A7IC8qIHByZXZlbnRzIGZ1cnRoZXIgcHJvY2Vzc2luZyAqLworICAgICAgfQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgfQorI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkKKyAgeyBpZiAoc29hcF9nZXRtaW1laGRyKHNvYXApKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmIChzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHNvYXAsIHNvYXAtPm1pbWUuZmlyc3QtPnR5cGUsICJhcHBsaWNhdGlvbi9kaW1lIikpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfRU5DX0RJTUU7CisgIH0KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKQorICB7IGlmIChzb2FwX2dldGRpbWVoZHIoc29hcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgaWYgKHNvYXAtPmRpbWUuZmxhZ3MgJiBTT0FQX0RJTUVfQ0YpCisgICAgeyBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkNodW5rZWQgRElNRSBTT0FQIG1lc3NhZ2VcbiIpKTsKKyAgICAgIHNvYXAtPmRpbWUuY2h1bmtzaXplID0gc29hcC0+ZGltZS5zaXplOworICAgICAgaWYgKHNvYXAtPmJ1ZmxlbiAtIHNvYXAtPmJ1ZmlkeCA+PSBzb2FwLT5kaW1lLmNodW5rc2l6ZSkKKyAgICAgIHsgc29hcC0+ZGltZS5idWZsZW4gPSBzb2FwLT5idWZsZW47CisgICAgICAgIHNvYXAtPmJ1ZmxlbiA9IHNvYXAtPmJ1ZmlkeCArIHNvYXAtPmRpbWUuY2h1bmtzaXplOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBzb2FwLT5kaW1lLmNodW5rc2l6ZSAtPSBzb2FwLT5idWZsZW4gLSBzb2FwLT5idWZpZHg7CisgICAgfQorICAgIHNvYXAtPmNvdW50ID0gc29hcC0+YnVmbGVuIC0gc29hcC0+YnVmaWR4OworICB9CisjZW5kaWYKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50CitodHRwX3BhcnNlKHN0cnVjdCBzb2FwICpzb2FwKQoreyBjaGFyIGhlYWRlcltTT0FQX0hEUkxFTl0sICpzOworICB1bnNpZ25lZCBzaG9ydCBnZXQgPSAwLCBzdGF0dXMgPSAwLCBrID0gMDsKKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJXYWl0aW5nIGZvciBIVFRQIHJlcXVlc3QvcmVzcG9uc2UuLi5cbiIpKTsKKyAgKnNvYXAtPmVuZHBvaW50ID0gJ1wwJzsKKyAgc29hcC0+bGVuZ3RoID0gMDsKKyAgc29hcC0+dXNlcmlkID0gTlVMTDsKKyAgc29hcC0+cGFzc3dkID0gTlVMTDsKKyAgc29hcC0+YWN0aW9uID0gTlVMTDsKKyAgc29hcC0+YXV0aHJlYWxtID0gTlVMTDsKKyAgZG8KKyAgeyBpZiAoc29hcF9nZXRsaW5lKHNvYXAsIHNvYXAtPm1zZ2J1Ziwgc2l6ZW9mKHNvYXAtPm1zZ2J1ZikpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJIVFRQIHN0YXR1czogJXNcbiIsIHNvYXAtPm1zZ2J1ZikpOworICAgIGZvciAoOzspCisgICAgeyBpZiAoc29hcF9nZXRsaW5lKHNvYXAsIGhlYWRlciwgU09BUF9IRFJMRU4pKQorICAgICAgeyBpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9FT0YpCisJeyBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgICAgICAgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkVPRiBpbiBIVFRQIGhlYWRlciwgY29udGludWUgYW55d2F5XG4iKSk7CisJICBicmVhazsKKwl9CisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICAgIH0KKyAgICAgIGlmICghKmhlYWRlcikKKyAgICAgICAgYnJlYWs7CisgICAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiSFRUUCBoZWFkZXI6ICVzXG4iLCBoZWFkZXIpKTsKKyAgICAgIHMgPSBzdHJjaHIoaGVhZGVyLCAnOicpOworICAgICAgaWYgKHMpCisgICAgICB7ICpzID0gJ1wwJzsKKyAgICAgICAgZG8gcysrOworICAgICAgICB3aGlsZSAoKnMgJiYgKnMgPD0gMzIpOworICAgICAgICBpZiAoKHNvYXAtPmVycm9yID0gc29hcC0+ZnBhcnNlaGRyKHNvYXAsIGhlYWRlciwgcykpKQorICAgICAgICB7IGlmIChzb2FwLT5lcnJvciA8IFNPQVBfU1RPUCkKKwkgICAgcmV0dXJuIHNvYXAtPmVycm9yOworCSAgc3RhdHVzID0gc29hcC0+ZXJyb3I7CisJICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKChzID0gc3RyY2hyKHNvYXAtPm1zZ2J1ZiwgJyAnKSkpCisgICAgeyBrID0gKHVuc2lnbmVkIHNob3J0KXNvYXBfc3RydG91bChzLCAmcywgMTApOworICAgICAgaWYgKCFzb2FwX2JsYW5rKCpzKSkKKyAgICAgICAgayA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGsgPSAwOworICB9IHdoaWxlIChrID09IDEwMCk7CisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJGaW5pc2hlZCBIVFRQIGhlYWRlciBwYXJzaW5nXG4iKSk7CisgIHMgPSBzdHJzdHIoc29hcC0+bXNnYnVmLCAiSFRUUC8iKTsKKyAgaWYgKHMgJiYgc1s3XSAhPSAnMScpCisgIHsgaWYgKHNvYXAtPmtlZXBfYWxpdmUgPT0gMSkKKyAgICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAwOworICAgIGlmIChrID09IDAgJiYgKHNvYXAtPm9tb2RlICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykgLyogayA9PSAwIGZvciBIVFRQIHJlcXVlc3QgKi8KKyAgICB7IHNvYXAtPmltb2RlIHw9IFNPQVBfSU9fQ0hVTks7CisgICAgICBzb2FwLT5vbW9kZSA9IChzb2FwLT5vbW9kZSAmIH5TT0FQX0lPKSB8IFNPQVBfSU9fU1RPUkU7CisgICAgfQorICB9CisgIGlmIChzb2FwLT5rZWVwX2FsaXZlIDwgMCkKKyAgICBzb2FwLT5rZWVwX2FsaXZlID0gMTsKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIktlZXAgYWxpdmUgY29ubmVjdGlvbiA9ICVkXG4iLCBzb2FwLT5rZWVwX2FsaXZlKSk7CisgIGlmIChzICYmICgoKGdldCA9ICFzdHJuY21wKHNvYXAtPm1zZ2J1ZiwgIkdFVCAiLCA0KSkpIHx8ICFzdHJuY21wKHNvYXAtPm1zZ2J1ZiwgIlBPU1QgIiwgNSkpKQorICB7IHNpemVfdCBtID0gc3RybGVuKHNvYXAtPmVuZHBvaW50KTsKKyAgICBzaXplX3QgbiA9IG0gKyAocyAtIHNvYXAtPm1zZ2J1ZikgLSA1IC0gKCFnZXQpOworICAgIGlmIChuID49IHNpemVvZihzb2FwLT5lbmRwb2ludCkpCisgICAgICBuID0gc2l6ZW9mKHNvYXAtPmVuZHBvaW50KSAtIDE7CisgICAgc3RybmNweShzb2FwLT5wYXRoLCBzb2FwLT5tc2didWYgKyA0ICsgKCFnZXQpLCBuIC0gbSk7CisgICAgc29hcC0+cGF0aFtuIC0gbV0gPSAnXDAnOworICAgIHN0cmNhdChzb2FwLT5lbmRwb2ludCwgc29hcC0+cGF0aCk7CisgICAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlRhcmdldCBlbmRwb2ludD0nJXMnXG4iLCBzb2FwLT5lbmRwb2ludCkpOworICAgIGlmIChnZXQpCisgICAgeyBzb2FwLT5lcnJvciA9IHNvYXAtPmZnZXQoc29hcCk7CisgICAgICBpZiAoc29hcC0+ZXJyb3IgPT0gU09BUF9PSykKKyAgICAgICAgc29hcC0+ZXJyb3IgPSBTT0FQX1NUT1A7IC8qIHByZXZlbnRzIGZ1cnRoZXIgcHJvY2Vzc2luZyAqLworICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyAgICBpZiAoc3RhdHVzKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yID0gc3RhdHVzOworICAgIHJldHVybiBTT0FQX09LOworICB9CisgIGlmIChrID09IDAgfHwgKGsgPj0gMjAwICYmIGsgPD0gMjk5KSB8fCBrID09IDQwMCB8fCBrID09IDUwMCkKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgREJHTE9HKFRFU1QsU09BUF9NRVNTQUdFKGZkZWJ1ZywgIkhUVFAgZXJyb3IgJWRcbiIsIGspKTsKKyAgcmV0dXJuIHNvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHNvYXAsICJIVFRQIGVycm9yIiwgc29hcC0+bXNnYnVmLCBrKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAoraHR0cF9wYXJzZV9oZWFkZXIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsKQoreyBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJIb3N0IikpCisgIHsgCisjaWZkZWYgV0lUSF9PUEVOU1NMCisgICAgaWYgKHNvYXAtPmltb2RlICYgU09BUF9FTkNfU1NMKQorICAgICAgc3RyY3B5KHNvYXAtPmVuZHBvaW50LCAiaHR0cHM6Ly8iKTsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgIHN0cmNweShzb2FwLT5lbmRwb2ludCwgImh0dHA6Ly8iKTsKKyAgICBzdHJuY2F0KHNvYXAtPmVuZHBvaW50LCB2YWwsIHNpemVvZihzb2FwLT5lbmRwb2ludCkgLSA4KTsKKyAgICBzb2FwLT5lbmRwb2ludFtzaXplb2Yoc29hcC0+ZW5kcG9pbnQpIC0gMV0gPSAnXDAnOworICB9CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29udGVudC1UeXBlIikpCisgIHsgaWYgKHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAiYXBwbGljYXRpb24vZGltZSIpKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0VOQ19ESU1FOworICAgIGVsc2UgaWYgKHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAibXVsdGlwYXJ0L3JlbGF0ZWQiKQorICAgICAgICAgIHx8IHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAibXVsdGlwYXJ0L2Zvcm0tZGF0YSIpKQorICAgIHsgc29hcC0+bWltZS5ib3VuZGFyeSA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAiYm91bmRhcnkiKSk7CisgICAgICBzb2FwLT5taW1lLnN0YXJ0ID0gc29hcF9zdHJkdXAoc29hcCwgc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwsICJzdGFydCIpKTsKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9FTkNfTUlNRTsKKyAgICB9CisgIH0KKyNlbmRpZgorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtTGVuZ3RoIikpCisgICAgc29hcC0+bGVuZ3RoID0gc29hcF9zdHJ0b3VsKHZhbCwgTlVMTCwgMTApOworICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvbnRlbnQtRW5jb2RpbmciKSkKKyAgeyBpZiAoIXNvYXBfdGFnX2NtcCh2YWwsICJkZWZsYXRlIikpCisjaWZkZWYgV0lUSF9aTElCCisgICAgICBzb2FwLT56bGliX2luID0gU09BUF9aTElCX0RFRkxBVEU7CisjZWxzZQorICAgICAgcmV0dXJuIFNPQVBfWkxJQl9FUlJPUjsKKyNlbmRpZgorICAgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAodmFsLCAiZ3ppcCIpKQorI2lmZGVmIFdJVEhfR1pJUAorICAgICAgc29hcC0+emxpYl9pbiA9IFNPQVBfWkxJQl9HWklQOworI2Vsc2UKKyAgICAgIHJldHVybiBTT0FQX1pMSUJfRVJST1I7CisjZW5kaWYKKyAgfQorI2lmZGVmIFdJVEhfWkxJQgorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkFjY2VwdC1FbmNvZGluZyIpKQorICB7CisjaWZkZWYgV0lUSF9HWklQCisgICAgaWYgKHN0cmNocih2YWwsICcqJykgfHwgc29hcF9nZXRfaGVhZGVyX2F0dHJpYnV0ZShzb2FwLCB2YWwsICJnemlwIikpCisgICAgICBzb2FwLT56bGliX291dCA9IFNPQVBfWkxJQl9HWklQOworICAgIGVsc2UKKyNlbmRpZgorICAgIGlmIChzdHJjaHIodmFsLCAnKicpIHx8IHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsLCAiZGVmbGF0ZSIpKQorICAgICAgc29hcC0+emxpYl9vdXQgPSBTT0FQX1pMSUJfREVGTEFURTsKKyAgICBlbHNlCisgICAgICBzb2FwLT56bGliX291dCA9IFNPQVBfWkxJQl9OT05FOworICB9CisjZW5kaWYKKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJUcmFuc2Zlci1FbmNvZGluZyIpKQorICB7IHNvYXAtPm1vZGUgJj0gflNPQVBfSU87CisgICAgaWYgKCFzb2FwX3RhZ19jbXAodmFsLCAiY2h1bmtlZCIpKQorICAgICAgc29hcC0+bW9kZSB8PSBTT0FQX0lPX0NIVU5LOworICB9CisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiQ29ubmVjdGlvbiIpKQorICB7IGlmICghc29hcF90YWdfY21wKHZhbCwgImtlZXAtYWxpdmUiKSkKKyAgICAgIHNvYXAtPmtlZXBfYWxpdmUgPSAtc29hcC0+a2VlcF9hbGl2ZTsKKyAgICBlbHNlIGlmICghc29hcF90YWdfY21wKHZhbCwgImNsb3NlIikpCisgICAgICBzb2FwLT5rZWVwX2FsaXZlID0gMDsKKyAgfQorI2lmbmRlZiBXSVRIX0xFQU4KKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJBdXRob3JpemF0aW9uIikpCisgIHsgaWYgKCFzb2FwX3RhZ19jbXAodmFsLCAiQmFzaWMgKiIpKQorICAgIHsgaW50IG47CisgICAgICBjaGFyICpzOworICAgICAgc29hcF9iYXNlNjQycyhzb2FwLCB2YWwgKyA2LCBzb2FwLT50bXBidWYsIHNpemVvZihzb2FwLT50bXBidWYpIC0gMSwgJm4pOworICAgICAgc29hcC0+dG1wYnVmW25dID0gJ1wwJzsKKyAgICAgIGlmICgocyA9IHN0cmNocihzb2FwLT50bXBidWYsICc6JykpKQorICAgICAgeyAqcyA9ICdcMCc7CisJc29hcC0+dXNlcmlkID0gc29hcF9zdHJkdXAoc29hcCwgc29hcC0+dG1wYnVmKTsKKwlzb2FwLT5wYXNzd2QgPSBzb2FwX3N0cmR1cChzb2FwLCBzICsgMSk7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UgaWYgKCFzb2FwX3RhZ19jbXAoa2V5LCAiV1dXLUF1dGhlbnRpY2F0ZSIpKQorICAgIHNvYXAtPmF1dGhyZWFsbSA9IHNvYXBfc3RyZHVwKHNvYXAsIHNvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc29hcCwgdmFsICsgNiwgInJlYWxtIikpOworICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkV4cGVjdCIpKQorICB7IGlmICghc29hcF90YWdfY21wKHZhbCwgIjEwMC1jb250aW51ZSIpKQorICAgIHsgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJIVFRQLzEuMSAxMDAgQ29udGludWUiLCBOVUxMKSkKKyAgICAgICB8fCAoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCBOVUxMLCBOVUxMKSkpCisgICAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgICB9CisgIH0KKyNlbmRpZgorICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIlNPQVBBY3Rpb24iKSkKKyAgeyBpZiAoKnZhbCA9PSAnIicpCisgICAgeyBzb2FwLT5hY3Rpb24gPSBzb2FwX3N0cmR1cChzb2FwLCB2YWwgKyAxKTsKKyAgICAgIHNvYXAtPmFjdGlvbltzdHJsZW4oc29hcC0+YWN0aW9uKSAtIDFdID0gJ1wwJzsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoIXNvYXBfdGFnX2NtcChrZXksICJMb2NhdGlvbiIpKQorICB7IHN0cm5jcHkoc29hcC0+ZW5kcG9pbnQsIHZhbCwgc2l6ZW9mKHNvYXAtPmVuZHBvaW50KSk7CisgICAgc29hcC0+ZW5kcG9pbnRbc2l6ZW9mKHNvYXAtPmVuZHBvaW50KSAtIDFdID0gJ1wwJzsKKyAgfQorI2lmZGVmIFdJVEhfQ09PS0lFUworICBlbHNlIGlmICghc29hcF90YWdfY21wKGtleSwgIkNvb2tpZSIpIHx8ICFzb2FwX3RhZ19jbXAoa2V5LCAiU2V0LUNvb2tpZSIpKQorICAgIHNvYXBfZ2V0Y29va2llcyhzb2FwLCB2YWwpOworI2VuZGlmCisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAhZGVmaW5lZChXSVRIX05PSFRUUCkgfHwgIWRlZmluZWQoV0lUSF9MRUFORVIpCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfZ2V0X2hlYWRlcl9hdHRyaWJ1dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmxpbmUsIGNvbnN0IGNoYXIgKmtleSkKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqcyA9IGxpbmU7CisgIGlmIChzKQorICB7IHdoaWxlICgqcykKKyAgICB7IHJlZ2lzdGVyIHNob3J0IGZsYWc7CisgICAgICBzID0gc29hcF9kZWNvZGVfa2V5KHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksIHMpOworICAgICAgZmxhZyA9IHNvYXBfdGFnX2NtcChzb2FwLT50bXBidWYsIGtleSk7CisgICAgICBzID0gc29hcF9kZWNvZGVfdmFsKHNvYXAtPnRtcGJ1Ziwgc2l6ZW9mKHNvYXAtPnRtcGJ1ZiksIHMpOworICAgICAgaWYgKCFmbGFnKQorICAgICAgICByZXR1cm4gc29hcC0+dG1wYnVmOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgIWRlZmluZWQoV0lUSF9OT0hUVFApIHx8ICFkZWZpbmVkKFdJVEhfTEVBTkVSKQorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2NvbnN0IGNoYXIqCitTT0FQX0ZNQUMyCitzb2FwX2RlY29kZV9rZXkoY2hhciAqYnVmLCBzaXplX3QgbGVuLCBjb25zdCBjaGFyICp2YWwpCit7IHJldHVybiBzb2FwX2RlY29kZShidWYsIGxlbiwgdmFsLCAiPSw7Iik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmICFkZWZpbmVkKFdJVEhfTk9IVFRQKSB8fCAhZGVmaW5lZChXSVRIX0xFQU5FUikKKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9kZWNvZGVfdmFsKGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwgY29uc3QgY2hhciAqdmFsKQoreyBpZiAoKnZhbCAhPSAnPScpCisgIHsgKmJ1ZiA9ICdcMCc7CisgICAgcmV0dXJuIHZhbDsKKyAgfQorICByZXR1cm4gc29hcF9kZWNvZGUoYnVmLCBsZW4sIHZhbCArIDEsICIsOyIpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAhZGVmaW5lZChXSVRIX05PSFRUUCkgfHwgIWRlZmluZWQoV0lUSF9MRUFORVIpCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNvbnN0IGNoYXIqCitzb2FwX2RlY29kZShjaGFyICpidWYsIHNpemVfdCBsZW4sIGNvbnN0IGNoYXIgKnZhbCwgY29uc3QgY2hhciAqc2VwKQoreyBjb25zdCBjaGFyICpzOworICBjaGFyICp0ID0gYnVmOworICBmb3IgKHMgPSB2YWw7ICpzOyBzKyspCisgICAgaWYgKCpzICE9ICcgJyAmJiAqcyAhPSAnXHQnICYmICFzdHJjaHIoc2VwLCAqcykpCisgICAgICBicmVhazsKKyAgaWYgKCpzID09ICciJykKKyAgeyBzKys7CisgICAgd2hpbGUgKCpzICYmICpzICE9ICciJyAmJiAtLWxlbikKKyAgICAgICp0KysgPSAqcysrOworICB9CisgIGVsc2UKKyAgeyB3aGlsZSAoc29hcF9ub3RibGFuaygqcykgJiYgIXN0cmNocihzZXAsICpzKSAmJiAtLWxlbikKKyAgICB7IGlmICgqcyA9PSAnJScpCisgICAgICB7ICp0KysgPSAoKHNbMV0gPj0gJ0EnID8gKHNbMV0gJiAweDcpICsgOSA6IHNbMV0gLSAnMCcpIDw8IDQpCisgICAgICAgICAgICAgICsgKHNbMl0gPj0gJ0EnID8gKHNbMl0gJiAweDcpICsgOSA6IHNbMl0gLSAnMCcpOworICAgICAgICBzICs9IDM7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgICp0KysgPSAqcysrOworICAgIH0KKyAgfQorICAqdCA9ICdcMCc7CisgIHdoaWxlICgqcyAmJiAhc3RyY2hyKHNlcCwgKnMpKQorICAgIHMrKzsKKyAgcmV0dXJuIHM7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9lbnZlbG9wZV9iZWdpbl9vdXQoc3RydWN0IHNvYXAgKnNvYXApCit7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIHNpemVfdCBuID0gMDsKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfTUlNRSkgJiYgc29hcC0+bWltZS5ib3VuZGFyeSAmJiBzb2FwLT5taW1lLnN0YXJ0KQorICB7IGNvbnN0IGNoYXIgKnM7CisgICAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkgJiYgIShzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkpCisgICAgICBzID0gImFwcGxpY2F0aW9uL2RpbWUiOworICAgIGVsc2UgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgICAgIHMgPSAiYXBwbGljYXRpb24vc29hcCt4bWw7IGNoYXJzZXQ9dXRmLTgiOworICAgIGVsc2UKKyAgICAgIHMgPSAidGV4dC94bWw7IGNoYXJzZXQ9dXRmLTgiOworICAgIHNwcmludGYoc29hcC0+dG1wYnVmLCAiLS0lc1xyXG5Db250ZW50LVR5cGU6ICVzXHJcbkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJpbmFyeVxyXG5Db250ZW50LUlEOiAlc1xyXG5cclxuIiwgc29hcC0+bWltZS5ib3VuZGFyeSwgcywgc29hcC0+bWltZS5zdGFydCk7CisgICAgbiA9IHN0cmxlbihzb2FwLT50bXBidWYpOworICAgIGlmIChzb2FwX3NlbmRfcmF3KHNvYXAsIHNvYXAtPnRtcGJ1ZiwgbikpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyAgaWYgKHNvYXAtPm1vZGUgJiBTT0FQX0lPX0xFTkdUSCkKKyAgICBzb2FwLT5kaW1lLnNpemUgPSBzb2FwLT5jb3VudDsJLyogRElNRSBpbiBNSU1FIGNvcnJlY3Rpb24gKi8KKyAgaWYgKCEoc29hcC0+bW9kZSAmIFNPQVBfSU9fTEVOR1RIKSAmJiAoc29hcC0+bW9kZSAmIFNPQVBfRU5DX0RJTUUpKQorICB7IGlmIChzb2FwX3B1dGRpbWVoZHIoc29hcCkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgIH0KKyNlbmRpZgorICBzb2FwLT5wYXJ0ID0gU09BUF9JTl9FTlZFTE9QRTsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9iZWdpbl9vdXQoc29hcCwgIlNPQVAtRU5WOkVudmVsb3BlIiwgMCwgTlVMTCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW52ZWxvcGVfZW5kX291dChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsICJTT0FQLUVOVjpFbnZlbG9wZSIpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpICYmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfRElNRSkgJiYgIShzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkpCisgIHsgc29hcC0+ZGltZS5zaXplID0gc29hcC0+Y291bnQgLSBzb2FwLT5kaW1lLnNpemU7CS8qIERJTUUgaW4gTUlNRSBjb3JyZWN0aW9uICovCisgICAgc3ByaW50Zihzb2FwLT5pZCwgc29hcC0+ZGltZV9pZF9mb3JtYXQsIDApOworICAgIHNvYXAtPmRpbWUuaWQgPSBzb2FwLT5pZDsKKyAgICBpZiAoc29hcC0+bG9jYWxfbmFtZXNwYWNlcykKKyAgICB7IGlmIChzb2FwLT5sb2NhbF9uYW1lc3BhY2VzWzBdLm91dCkKKyAgICAgICAgc29hcC0+ZGltZS50eXBlID0gKGNoYXIqKXNvYXAtPmxvY2FsX25hbWVzcGFjZXNbMF0ub3V0OworICAgICAgZWxzZQorICAgICAgICBzb2FwLT5kaW1lLnR5cGUgPSAoY2hhciopc29hcC0+bG9jYWxfbmFtZXNwYWNlc1swXS5uczsKKyAgICB9CisgICAgc29hcC0+ZGltZS5vcHRpb25zID0gTlVMTDsKKyAgICBzb2FwLT5kaW1lLmZsYWdzID0gU09BUF9ESU1FX01CIHwgU09BUF9ESU1FX0FCU1VSSTsKKyAgICBpZiAoIXNvYXAtPmRpbWUuZmlyc3QpCisgICAgICBzb2FwLT5kaW1lLmZsYWdzIHw9IFNPQVBfRElNRV9NRTsKKyAgICBzb2FwLT5jb3VudCArPSAxMiArICgoc3RybGVuKHNvYXAtPmRpbWUuaWQpKzMpJih+MykpICsgKChzdHJsZW4oc29hcC0+ZGltZS50eXBlKSszKSYofjMpKTsKKyAgfQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19ESU1FKSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NVE9NKSkKKyAgICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCBTT0FQX1NUUl9QQURESU5HLCAtKGxvbmcpc29hcC0+ZGltZS5zaXplJjMpOworI2VuZGlmCisgIHNvYXAtPnBhcnQgPSBTT0FQX0VORF9FTlZFTE9QRTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9IAorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2VudmVsb3BlX2JlZ2luX2luKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBzdHJ1Y3QgTmFtZXNwYWNlICpwOworICBzb2FwLT5wYXJ0ID0gU09BUF9JTl9FTlZFTE9QRTsKKyAgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCAiU09BUC1FTlY6RW52ZWxvcGUiLCAwKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3IgPSBTT0FQX1ZFUlNJT05NSVNNQVRDSDsKKyAgcCA9IHNvYXAtPmxvY2FsX25hbWVzcGFjZXM7CisgIGlmIChwKQorICB7IGNvbnN0IGNoYXIgKm5zID0gcFswXS5vdXQ7CisgICAgaWYgKCFucykKKyAgICAgIG5zID0gcFswXS5uczsKKyAgICBpZiAoIXN0cmNtcChucywgc29hcF9lbnYxKSkKKyAgICB7IHNvYXAtPnZlcnNpb24gPSAxOyAvKiBtYWtlIHN1cmUgd2UgdXNlIFNPQVAgMS4xICovCisgICAgICBpZiAocFsxXS5vdXQpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwWzFdLm91dCk7CisgICAgICBpZiAoKHBbMV0ub3V0ID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzb2FwX2VuYzEpKSkpCisgICAgICAgIHN0cmNweShwWzFdLm91dCwgc29hcF9lbmMxKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChucywgc29hcF9lbnYyKSkKKyAgICB7IHNvYXAtPnZlcnNpb24gPSAyOyAvKiBtYWtlIHN1cmUgd2UgdXNlIFNPQVAgMS4yICovCisgICAgICBpZiAocFsxXS5vdXQpCisgICAgICAgIFNPQVBfRlJFRShzb2FwLCBwWzFdLm91dCk7CisgICAgICBpZiAoKHBbMV0ub3V0ID0gKGNoYXIqKVNPQVBfTUFMTE9DKHNvYXAsIHNpemVvZihzb2FwX2VuYzIpKSkpCisgICAgICAgIHN0cmNweShwWzFdLm91dCwgc29hcF9lbmMyKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfZW52ZWxvcGVfZW5kX2luKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5wYXJ0ID0gU09BUF9FTkRfRU5WRUxPUEU7CisgIHJldHVybiBzb2FwX2VsZW1lbnRfZW5kX2luKHNvYXAsICJTT0FQLUVOVjpFbnZlbG9wZSIpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JvZHlfYmVnaW5fb3V0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5wYXJ0ID0gU09BUF9JTl9CT0RZOworICBpZiAoc29hcC0+dmVyc2lvbiA9PSAxKQorICAgIHNvYXAtPmVuY29kaW5nID0gMTsKKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmICgoc29hcC0+bW9kZSAmIFNPQVBfWE1MX1NFQykgJiYgc29hcF9zZXRfYXR0cihzb2FwLCAid3N1OklkIiwgIkJvZHkiKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjZW5kaWYKKyAgaWYgKHNvYXBfZWxlbWVudChzb2FwLCAiU09BUC1FTlY6Qm9keSIsIDAsIE5VTEwpKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgcmV0dXJuIHNvYXBfZWxlbWVudF9zdGFydF9lbmRfb3V0KHNvYXAsIE5VTEwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JvZHlfZW5kX291dChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgaWYgKHNvYXBfZWxlbWVudF9lbmRfb3V0KHNvYXAsICJTT0FQLUVOVjpCb2R5IikpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICBzb2FwLT5wYXJ0ID0gU09BUF9FTkRfQk9EWTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfYm9keV9iZWdpbl9pbihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgc29hcC0+cGFydCA9IFNPQVBfSU5fQk9EWTsKKyAgaWYgKHNvYXBfZWxlbWVudF9iZWdpbl9pbihzb2FwLCAiU09BUC1FTlY6Qm9keSIsIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgaWYgKCFzb2FwLT5ib2R5KQorICAgIHNvYXAtPnBhcnQgPSBTT0FQX05PX0JPRFk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX2JvZHlfZW5kX2luKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcC0+cGFydCA9PSBTT0FQX05PX0JPRFkpCisgICAgcmV0dXJuIFNPQVBfT0s7CisgIHNvYXAtPnBhcnQgPSBTT0FQX0VORF9CT0RZOworICByZXR1cm4gc29hcF9lbGVtZW50X2VuZF9pbihzb2FwLCAiU09BUC1FTlY6Qm9keSIpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlY3ZfaGVhZGVyKHN0cnVjdCBzb2FwICpzb2FwKQoreyBpZiAoc29hcF9nZXRoZWFkZXIoc29hcCkgJiYgc29hcC0+ZXJyb3IgPT0gU09BUF9UQUdfTUlTTUFUQ0gpCisgICAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICByZXR1cm4gc29hcC0+ZXJyb3I7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3NldF9lbmRwb2ludChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZW5kcG9pbnQpCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnM7CisgIHJlZ2lzdGVyIHNpemVfdCBpLCBuOworICBzb2FwLT5lbmRwb2ludFswXSA9ICdcMCc7CisgIHNvYXAtPmhvc3RbMF0gPSAnXDAnOworICBzb2FwLT5wYXRoWzBdID0gJy8nOworICBzb2FwLT5wYXRoWzFdID0gJ1wwJzsKKyAgc29hcC0+cG9ydCA9IDgwOworICBpZiAoIWVuZHBvaW50IHx8ICEqZW5kcG9pbnQpCisgICAgcmV0dXJuOworICBpZiAoIXN0cm5jbXAoZW5kcG9pbnQsICJodHRwczoiLCA2KSkKKyAgICBzb2FwLT5wb3J0ID0gNDQzOworICBzdHJuY3B5KHNvYXAtPmVuZHBvaW50LCBlbmRwb2ludCwgc2l6ZW9mKHNvYXAtPmVuZHBvaW50KSAtIDEpOworICBzID0gc3RyY2hyKGVuZHBvaW50LCAnOicpOworICBpZiAocyAmJiBzWzFdID09ICcvJyAmJiBzWzJdID09ICcvJykKKyAgICBzICs9IDM7CisgIGVsc2UKKyAgICBzID0gZW5kcG9pbnQ7CisgIG4gPSBzdHJsZW4ocyk7CisgIGlmIChuID49IHNpemVvZihzb2FwLT5ob3N0KSkKKyAgICBuID0gc2l6ZW9mKHNvYXAtPmhvc3QpIC0gMTsKKyNpZmRlZiBXSVRIX0lQVjYKKyAgaWYgKHNbMF0gPT0gJ1snKQorICB7IHMrKzsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIHsgc29hcC0+aG9zdFtpXSA9IHNbaV07CisgICAgICBpZiAoc1tpXSA9PSAnXScpCisgICAgICB7IHMrKzsKKyAgICAgICAgYnJlYWs7IAorICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICB7IHNvYXAtPmhvc3RbaV0gPSBzW2ldOworICAgICAgaWYgKHNbaV0gPT0gJy8nIHx8IHNbaV0gPT0gJzonKQorICAgICAgICBicmVhazsgCisgICAgfQorICB9CisjZWxzZQorICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICB7IHNvYXAtPmhvc3RbaV0gPSBzW2ldOworICAgIGlmIChzW2ldID09ICcvJyB8fCBzW2ldID09ICc6JykKKyAgICAgIGJyZWFrOyAKKyAgfQorI2VuZGlmCisgIHNvYXAtPmhvc3RbaV0gPSAnXDAnOworICBpZiAoc1tpXSA9PSAnOicpCisgIHsgc29hcC0+cG9ydCA9IChpbnQpYXRvbChzICsgaSArIDEpOworICAgIGZvciAoaSsrOyBpIDwgbjsgaSsrKQorICAgICAgaWYgKHNbaV0gPT0gJy8nKQorICAgICAgICBicmVhazsKKyAgfQorICBpZiAoc1tpXSkKKyAgeyBzdHJuY3B5KHNvYXAtPnBhdGgsIHMgKyBpLCBzaXplb2Yoc29hcC0+cGF0aCkpOworICAgIHNvYXAtPnBhdGhbc2l6ZW9mKHNvYXAtPnBhdGgpIC0gMV0gPSAnXDAnOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfY29ubmVjdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZW5kcG9pbnQsIGNvbnN0IGNoYXIgKmFjdGlvbikKK3sgcmV0dXJuIHNvYXBfY29ubmVjdF9jb21tYW5kKHNvYXAsIFNPQVBfUE9TVCwgZW5kcG9pbnQsIGFjdGlvbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfY29ubmVjdF9jb21tYW5kKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgaHR0cF9jb21tYW5kLCBjb25zdCBjaGFyICplbmRwb2ludCwgY29uc3QgY2hhciAqYWN0aW9uKQoreyBjaGFyIGhvc3Rbc2l6ZW9mKHNvYXAtPmhvc3QpXTsKKyAgaW50IHBvcnQ7CisgIHNpemVfdCBjb3VudDsKKyAgc29hcC0+ZXJyb3IgPSBTT0FQX09LOworICBzdHJjcHkoaG9zdCwgc29hcC0+aG9zdCk7IC8qIHNhdmUgdG8gY29tcGFyZSAqLworICBwb3J0ID0gc29hcC0+cG9ydDsgLyogc2F2ZSB0byBjb21wYXJlICovCisgIHNvYXBfc2V0X2VuZHBvaW50KHNvYXAsIGVuZHBvaW50KTsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPmZjb25uZWN0KQorICB7IGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mY29ubmVjdChzb2FwLCBlbmRwb2ludCwgc29hcC0+aG9zdCwgc29hcC0+cG9ydCkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICB9CisgIGVsc2UKKyNlbmRpZgorICBpZiAoc29hcC0+Zm9wZW4gJiYgKnNvYXAtPmhvc3QpCisgIHsgc29hcC0+c3RhdHVzID0gaHR0cF9jb21tYW5kOworICAgIGlmICghc29hcC0+a2VlcF9hbGl2ZSB8fCAhc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSB8fCBzdHJjbXAoc29hcC0+aG9zdCwgaG9zdCkgfHwgc29hcC0+cG9ydCAhPSBwb3J0IHx8ICFzb2FwLT5mcG9sbCB8fCBzb2FwLT5mcG9sbChzb2FwKSkKKyAgICB7IHNvYXAtPmtlZXBfYWxpdmUgPSAwOyAvKiB0byBmb3JjZSBjbG9zZSAqLworICAgICAgc29hcC0+b21vZGUgJj0gflNPQVBfSU9fVURQOyAvKiB0byBmb3JjZSBjbG9zZSAqLworICAgICAgc29hcF9jbG9zZXNvY2soc29hcCk7CisgICAgICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiQ29ubmVjdC9yZWNvbm5lY3QgdG8gaG9zdD0nJXMnIHBhdGg9JyVzJyBwb3J0PSVkXG4iLCBzb2FwLT5ob3N0LCBzb2FwLT5wYXRoLCBzb2FwLT5wb3J0KSk7CisjaWZkZWYgV0lUSF9VRFAKKyAgICAgIGlmICghc3RybmNtcChlbmRwb2ludCwgInNvYXAudWRwOiIsIDkpKQorICAgICAgICBzb2FwLT5vbW9kZSB8PSBTT0FQX0lPX1VEUDsKKyNlbmRpZgorICAgICAgc29hcC0+c29ja2V0ID0gc29hcC0+Zm9wZW4oc29hcCwgZW5kcG9pbnQsIHNvYXAtPmhvc3QsIHNvYXAtPnBvcnQpOworICAgICAgaWYgKHNvYXAtPmVycm9yKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgICBzb2FwLT5rZWVwX2FsaXZlID0gKChzb2FwLT5vbW9kZSAmIFNPQVBfSU9fS0VFUEFMSVZFKSAhPSAwKTsKKyAgICB9CisgIH0KKyAgY291bnQgPSBzb2FwX2NvdW50X2F0dGFjaG1lbnRzKHNvYXApOworICBpZiAoc29hcF9iZWdpbl9zZW5kKHNvYXApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyAgaWYgKChzb2FwLT5tb2RlICYgU09BUF9JTykgIT0gU09BUF9JT19TVE9SRSAmJiAhKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19YTUwpICYmIGVuZHBvaW50KQorICB7IHVuc2lnbmVkIGludCBrID0gc29hcC0+bW9kZTsKKyAgICBzb2FwLT5tb2RlICY9IH4oU09BUF9JTyB8IFNPQVBfRU5DX1pMSUIpOworICAgIGlmICgoayAmIFNPQVBfSU8pICE9IFNPQVBfSU9fRkxVU0gpCisgICAgICBzb2FwLT5tb2RlIHw9IFNPQVBfSU9fQlVGRkVSOworICAgIGlmICgoc29hcC0+ZXJyb3IgPSBzb2FwLT5mcG9zdChzb2FwLCBlbmRwb2ludCwgc29hcC0+aG9zdCwgc29hcC0+cG9ydCwgc29hcC0+cGF0aCwgYWN0aW9uLCBjb3VudCkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICAgIGlmICgoayAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgICAgeyBpZiAoc29hcF9mbHVzaChzb2FwKSkKKyAgICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIH0KKyNlbmRpZgorICAgIHNvYXAtPm1vZGUgPSBrOworICB9CisgIGVsc2UgaWYgKGFjdGlvbikKKyAgICBzb2FwLT5hY3Rpb24gPSBzb2FwX3N0cmR1cChzb2FwLCBhY3Rpb24pOworICBpZiAoaHR0cF9jb21tYW5kICE9IFNPQVBfUE9TVCkKKyAgICByZXR1cm4gc29hcF9lbmRfc2VuZChzb2FwKTsKKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK1NPQVBfRk1BQzEKK2NoYXIqCitTT0FQX0ZNQUMyCitzb2FwX3MyYmFzZTY0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzLCBjaGFyICp0LCBpbnQgbikKK3sgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbTsKKyAgcmVnaXN0ZXIgY2hhciAqcDsKKyAgaWYgKCF0KQorICAgIHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgKG4gKyAyKSAvIDMgKiA0ICsgMSk7CisgIGlmICghdCkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHJldHVybiBOVUxMOworICB9CisgIHAgPSB0OworICB0WzBdID0gJ1wwJzsKKyAgaWYgKCFzKQorICAgIHJldHVybiBwOworICBmb3IgKDsgbiA+IDI7IG4gLT0gMywgcyArPSAzKQorICB7IG0gPSBzWzBdOworICAgIG0gPSAobSA8PCA4KSB8IHNbMV07CisgICAgbSA9IChtIDw8IDgpIHwgc1syXTsKKyAgICBmb3IgKGkgPSA0OyBpID4gMDsgbSA+Pj0gNikKKyAgICAgIHRbLS1pXSA9IHNvYXBfYmFzZTY0b1ttICYgMHgzRl07CisgICAgdCArPSA0OworICB9CisgIHRbMF0gPSAnXDAnOworICBpZiAobiA+IDApCisgIHsgbSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgIG0gPSAobSA8PCA4KSB8ICpzKys7CisgICAgZm9yICg7IGkgPCAzOyBpKyspCisgICAgICBtIDw8PSA4OworICAgIGZvciAoaSsrOyBpID4gMDsgbSA+Pj0gNikKKyAgICAgIHRbLS1pXSA9IHNvYXBfYmFzZTY0b1ttICYgMHgzRl07CisgICAgZm9yIChpID0gMzsgaSA+IG47IGktLSkKKyAgICAgIHRbaV0gPSAnPSc7CisgICAgdFs0XSA9ICdcMCc7CisgIH0KKyAgcmV0dXJuIHA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjb25zdCBjaGFyKgorU09BUF9GTUFDMgorc29hcF9iYXNlNjQycyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgY2hhciAqdCwgc2l6ZV90IGwsIGludCAqbikKK3sgcmVnaXN0ZXIgaW50IGksIGosIGM7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbTsKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqcDsKKyAgaWYgKCFzIHx8ICEqcykKKyAgeyBpZiAobikKKyAgICAgICpuID0gMDsKKyAgICBpZiAoc29hcC0+ZXJyb3IpCisgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gU09BUF9OT05fTlVMTDsKKyAgfQorICBpZiAoIXQpCisgIHsgbCA9IChzdHJsZW4ocykgKyAzKSAvIDQgKiAzOworICAgIHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgbCk7CisgIH0KKyAgaWYgKCF0KQorICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcCA9IHQ7CisgIGlmIChuKQorICAgICpuID0gMDsKKyAgZm9yICg7OykKKyAgeyBmb3IgKGkgPSAwOyBpIDwgU09BUF9CTEtMRU47IGkrKykKKyAgICB7IG0gPSAwOworICAgICAgaiA9IDA7CisgICAgICB3aGlsZSAoaiA8IDQpCisgICAgICB7IGMgPSAqcysrOworICAgICAgICBpZiAoYyA9PSAnPScgfHwgIWMpCisgICAgICAgIHsgaSAqPSAzOworICAgICAgICAgIHN3aXRjaCAoaikKKyAgICAgICAgICB7IGNhc2UgMjoKKyAgICAgICAgICAgICAgKnQrKyA9IChjaGFyKSgobSA+PiA0KSAmIDB4RkYpOworICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKChtID4+IDEwKSAmIDB4RkYpOworICAgICAgICAgICAgICAqdCsrID0gKGNoYXIpKChtID4+IDIpICYgMHhGRik7CisgICAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG4pCisJICAgICpuICs9IGk7CisgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgIH0KKyAgICAgICAgYyAtPSAnKyc7CisgICAgICAgIGlmIChjID49IDAgJiYgYyA8PSA3OSkKKyAgICAgICAgeyBtID0gKG0gPDwgNikgKyBzb2FwX2Jhc2U2NGlbY107CisgICAgICAgICAgaisrOworICAgICAgICB9CisgICAgICB9CisgICAgICAqdCsrID0gKGNoYXIpKChtID4+IDE2KSAmIDB4RkYpOworICAgICAgKnQrKyA9IChjaGFyKSgobSA+PiA4KSAmIDB4RkYpOworICAgICAgKnQrKyA9IChjaGFyKShtICYgMHhGRik7CisgICAgICBpZiAobCA8IDMpCisgICAgICB7IGlmIChuKQorCSAgKm4gKz0gaTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgICB9CisgICAgICBsIC09IDM7CisgICAgfQorICAgIGlmIChuKQorICAgICAgKm4gKz0gMyAqIFNPQVBfQkxLTEVOOworICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxCitjaGFyKgorU09BUF9GTUFDMgorc29hcF9zMmhleChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgdW5zaWduZWQgY2hhciAqcywgY2hhciAqdCwgaW50IG4pCit7IHJlZ2lzdGVyIGNoYXIgKnA7CisgIGlmICghdCkKKyAgICB0ID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIDIgKiBuICsgMSk7CisgIGlmICghdCkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICAgIHJldHVybiBOVUxMOworICB9CisgIHAgPSB0OworICB0WzBdID0gJ1wwJzsKKyAgaWYgKHMpCisgIHsgZm9yICg7IG4gPiAwOyBuLS0pCisgICAgeyByZWdpc3RlciBpbnQgbSA9ICpzKys7CisgICAgICAqdCsrID0gKGNoYXIpKChtID4+IDQpICsgKG0gPiAxNTkgPyAnYScgLSAxMCA6ICcwJykpOworICAgICAgbSAmPSAweDBGOworICAgICAgKnQrKyA9IChjaGFyKShtICsgKG0gPiA5ID8gJ2EnIC0gMTAgOiAnMCcpKTsKKyAgICB9CisgIH0KKyAgKnQrKyA9ICdcMCc7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMQorY29uc3QgY2hhcioKK1NPQVBfRk1BQzIKK3NvYXBfaGV4MnMoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnMsIGNoYXIgKnQsIHNpemVfdCBsLCBpbnQgKm4pCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnA7CisgIGlmICghcyB8fCAhKnMpCisgIHsgaWYgKG4pCisgICAgICAqbiA9IDA7CisgICAgaWYgKHNvYXAtPmVycm9yKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFNPQVBfTk9OX05VTEw7CisgIH0KKyAgaWYgKCF0KQorICB7IGwgPSBzdHJsZW4ocykgLyAyOworICAgIHQgPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgbCk7CisgIH0KKyAgaWYgKCF0KQorICB7IHNvYXAtPmVycm9yID0gU09BUF9FT007CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcCA9IHQ7CisgIHdoaWxlIChsKQorICB7IHJlZ2lzdGVyIGludCBkMSwgZDI7CisgICAgZDEgPSAqcysrOworICAgIGlmICghZDEpCisgICAgICBicmVhazsKKyAgICBkMiA9ICpzKys7CisgICAgaWYgKCFkMikKKyAgICAgIGJyZWFrOworICAgICp0KysgPSAoKGQxID49ICdBJyA/IChkMSAmIDB4NykgKyA5IDogZDEgLSAnMCcpIDw8IDQpICsgKGQyID49ICdBJyA/IChkMiAmIDB4NykgKyA5IDogZDIgLSAnMCcpOworICAgIGwtLTsKKyAgfQorICBpZiAobikKKyAgICAqbiA9IHQgLSBwOworICByZXR1cm4gcDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9wdXRodHRwaGRyKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3RhdHVzLCBzaXplX3QgY291bnQpCit7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnMgPSBOVUxMOworICByZWdpc3RlciBpbnQgZXJyID0gU09BUF9PSzsKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqciA9IE5VTEw7CisjZW5kaWYKKyAgaWYgKHN0YXR1cyA9PSBTT0FQX0ZJTEUgJiYgc29hcC0+aHR0cF9jb250ZW50KQorICAgIHMgPSBzb2FwLT5odHRwX2NvbnRlbnQ7CisgIGVsc2UgaWYgKHN0YXR1cyA9PSBTT0FQX0hUTUwpCisgICAgcyA9ICJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiOworICBlbHNlIGlmIChjb3VudCB8fCAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSA9PSBTT0FQX0lPX0NIVU5LKSkKKyAgeyBpZiAoc29hcC0+dmVyc2lvbiA9PSAyKQorICAgICAgcyA9ICJhcHBsaWNhdGlvbi9zb2FwK3htbDsgY2hhcnNldD11dGYtOCI7CisgICAgZWxzZQorICAgICAgcyA9ICJ0ZXh0L3htbDsgY2hhcnNldD11dGYtOCI7CisgIH0KKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKHNvYXAtPm1vZGUgJiAoU09BUF9FTkNfRElNRSB8IFNPQVBfRU5DX01UT00pKQorICB7IGlmIChzb2FwLT5tb2RlICYgU09BUF9FTkNfTVRPTSkKKyAgICB7IHIgPSBzOworICAgICAgcyA9ICJhcHBsaWNhdGlvbi94b3AreG1sOyBjaGFyc2V0PXV0Zi04IjsKKyAgICB9CisgICAgZWxzZQorICAgICAgcyA9ICJhcHBsaWNhdGlvbi9kaW1lIjsKKyAgfQorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0VOQ19NSU1FKSAmJiBzb2FwLT5taW1lLmJvdW5kYXJ5ICYmIHNvYXAtPnN0YXR1cyAhPSBTT0FQX0dFVCkKKyAgeyByZWdpc3RlciBjb25zdCBjaGFyICp0ID0gc3RyY2hyKHMsICc7Jyk7CisgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICJtdWx0aXBhcnQvcmVsYXRlZDsgYm91bmRhcnk9XCIlc1wiOyB0eXBlPVwiIiwgc29hcC0+bWltZS5ib3VuZGFyeSk7CisgICAgaWYgKHQpCisgICAgICBzdHJuY2F0KHNvYXAtPnRtcGJ1ZiwgcywgdCAtIHMpOworICAgIGVsc2UKKyAgICAgIHN0cmNhdChzb2FwLT50bXBidWYsIHMpOworICAgIGlmIChzb2FwLT5taW1lLnN0YXJ0KQorICAgIHsgc3RyY2F0KHNvYXAtPnRtcGJ1ZiwgIlwiOyBzdGFydD1cIiIpOworICAgICAgc3RyY2F0KHNvYXAtPnRtcGJ1Ziwgc29hcC0+bWltZS5zdGFydCk7CisgICAgfQorICAgIHN0cmNhdChzb2FwLT50bXBidWYsICJcIiIpOworICAgIGlmIChyKQorICAgIHsgc3RyY2F0KHNvYXAtPnRtcGJ1ZiwgIjsgc3RhcnQtaW5mbz1cIiIpOworICAgICAgc3RyY2F0KHNvYXAtPnRtcGJ1Ziwgcik7CisgICAgICBzdHJjYXQoc29hcC0+dG1wYnVmLCAiXCIiKTsKKyAgICB9CisgICAgcyA9IHNvYXAtPnRtcGJ1ZjsKKyAgfQorI2VuZGlmCisgIGlmIChzICYmIChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQ29udGVudC1UeXBlIiwgcykpKQorICAgIHJldHVybiBlcnI7CisjaWZkZWYgV0lUSF9aTElCCisgIGlmIChzb2FwLT5vbW9kZSAmIFNPQVBfRU5DX1pMSUIpCisgIHsKKyNpZmRlZiBXSVRIX0daSVAKKyAgICBlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQ29udGVudC1FbmNvZGluZyIsICJnemlwIik7CisjZWxzZQorICAgIGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJDb250ZW50LUVuY29kaW5nIiwgImRlZmxhdGUiKTsKKyNlbmRpZgorICAgIGlmIChlcnIpCisgICAgICByZXR1cm4gZXJyOworICB9CisjZW5kaWYKKyNpZm5kZWYgV0lUSF9MRUFORVIKKyAgaWYgKChzb2FwLT5vbW9kZSAmIFNPQVBfSU8pID09IFNPQVBfSU9fQ0hVTkspCisgICAgZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlRyYW5zZmVyLUVuY29kaW5nIiwgImNodW5rZWQiKTsKKyAgZWxzZQorI2VuZGlmCisgIGlmIChzb2FwLT5zdGF0dXMgIT0gU09BUF9HRVQpCisgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICIlbHUiLCAodW5zaWduZWQgbG9uZyljb3VudCk7CisgICAgZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkNvbnRlbnQtTGVuZ3RoIiwgc29hcC0+dG1wYnVmKTsKKyAgfQorICBpZiAoZXJyKQorICAgIHJldHVybiBlcnI7CisgIHJldHVybiBzb2FwLT5mcG9zdGhkcihzb2FwLCAiQ29ubmVjdGlvbiIsIHNvYXAtPmtlZXBfYWxpdmUgPyAia2VlcC1hbGl2ZSIgOiAiY2xvc2UiKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAoraHR0cF9nZXQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJldHVybiBTT0FQX0dFVF9NRVRIT0Q7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK3N0YXRpYyBpbnQKK2h0dHBfcG9zdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZW5kcG9pbnQsIGNvbnN0IGNoYXIgKmhvc3QsIGludCBwb3J0LCBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICphY3Rpb24sIHNpemVfdCBjb3VudCkKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKKyAgcmVnaXN0ZXIgaW50IGVycjsKKyAgaWYgKHNvYXAtPnN0YXR1cyA9PSBTT0FQX0dFVCkKKyAgICBzID0gIkdFVCI7CisgIGVsc2UKKyAgICBzID0gIlBPU1QiOworI2lmZGVmIFBBTE0KKyAgaWYgKCFlbmRwb2ludCB8fCAoc3RybmNtcChlbmRwb2ludCwgImh0dHA6IiwgNSkgJiYgc3RybmNtcChlbmRwb2ludCwgImh0dHBzOiIsIDYpICYmIHN0cm5jbXAoZW5kcG9pbnQsICJodHRwZzoiLCA2KSkgJiYgc3RybmNtcChlbmRwb2ludCwgIl9iZWFtOiIsIDYpICYmIHN0cm5jbXAoZW5kcG9pbnQsICJfbG9jYWw6IiwgNykgJiYgc3RybmNtcChlbmRwb2ludCwgIl9idG9iZXg6IiwgOCkpCisjZWxzZQorICBpZiAoIWVuZHBvaW50IHx8IChzdHJuY21wKGVuZHBvaW50LCAiaHR0cDoiLCA1KSAmJiBzdHJuY21wKGVuZHBvaW50LCAiaHR0cHM6IiwgNikgJiYgc3RybmNtcChlbmRwb2ludCwgImh0dHBnOiIsIDYpKSkKKyNlbmRpZgorICAgIHJldHVybiBTT0FQX09LOworICBpZiAoc29hcC0+cHJveHlfaG9zdCAmJiBzdHJuY21wKGVuZHBvaW50LCAiaHR0cHM6IiwgNikpCisgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICIlcyAlcyBIVFRQLyVzIiwgcywgZW5kcG9pbnQsIHNvYXAtPmh0dHBfdmVyc2lvbik7CisgIGVsc2UKKyAgICBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIiVzIC8lcyBIVFRQLyVzIiwgcywgKCpwYXRoID09ICcvJyA/IHBhdGggKyAxIDogcGF0aCksIHNvYXAtPmh0dHBfdmVyc2lvbik7CisgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgc29hcC0+dG1wYnVmLCBOVUxMKSkpCisgICAgcmV0dXJuIGVycjsKKyAgaWYgKHBvcnQgIT0gODApCisgICAgc3ByaW50Zihzb2FwLT50bXBidWYsICIlczolZCIsIGhvc3QsIHBvcnQpOworICBlbHNlCisgICAgc3RyY3B5KHNvYXAtPnRtcGJ1ZiwgaG9zdCk7IAorICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJIb3N0Iiwgc29hcC0+dG1wYnVmKSkKKyAgIHx8IChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiVXNlci1BZ2VudCIsICJnU09BUC8yLjciKSkKKyAgIHx8IChlcnIgPSBzb2FwX3B1dGh0dHBoZHIoc29hcCwgU09BUF9PSywgY291bnQpKSkKKyAgICByZXR1cm4gZXJyOworI2lmZGVmIFdJVEhfWkxJQgorI2lmZGVmIFdJVEhfR1pJUAorICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJBY2NlcHQtRW5jb2RpbmciLCAiZ3ppcCwgZGVmbGF0ZSIpKSkKKyNlbHNlCisgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkFjY2VwdC1FbmNvZGluZyIsICJkZWZsYXRlIikpKQorI2VuZGlmCisgICAgcmV0dXJuIGVycjsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgaWYgKHNvYXAtPnVzZXJpZCAmJiBzb2FwLT5wYXNzd2QgJiYgc3RybGVuKHNvYXAtPnVzZXJpZCkgKyBzdHJsZW4oc29hcC0+cGFzc3dkKSA8IDc2MSkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIDI2MiwgIiVzOiVzIiwgc29hcC0+dXNlcmlkLCBzb2FwLT5wYXNzd2QpOworICAgIHN0cmNweShzb2FwLT50bXBidWYsICJCYXNpYyAiKTsKKyAgICBzb2FwX3MyYmFzZTY0KHNvYXAsIChjb25zdCB1bnNpZ25lZCBjaGFyKikoc29hcC0+dG1wYnVmICsgMjYyKSwgc29hcC0+dG1wYnVmICsgNiwgc3RybGVuKHNvYXAtPnRtcGJ1ZiArIDI2MikpOworICAgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkF1dGhvcml6YXRpb24iLCBzb2FwLT50bXBidWYpKSkKKyAgICAgIHJldHVybiBlcnI7CisgIH0KKyAgaWYgKHNvYXAtPnByb3h5X3VzZXJpZCAmJiBzb2FwLT5wcm94eV9wYXNzd2QgJiYgc3RybGVuKHNvYXAtPnByb3h5X3VzZXJpZCkgKyBzdHJsZW4oc29hcC0+cHJveHlfcGFzc3dkKSA8IDc2MSkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiArIDI2MiwgIiVzOiVzIiwgc29hcC0+cHJveHlfdXNlcmlkLCBzb2FwLT5wcm94eV9wYXNzd2QpOworICAgIHN0cmNweShzb2FwLT50bXBidWYsICJCYXNpYyAiKTsKKyAgICBzb2FwX3MyYmFzZTY0KHNvYXAsIChjb25zdCB1bnNpZ25lZCBjaGFyKikoc29hcC0+dG1wYnVmICsgMjYyKSwgc29hcC0+dG1wYnVmICsgNiwgc3RybGVuKHNvYXAtPnRtcGJ1ZiArIDI2MikpOworICAgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlByb3h5LUF1dGhvcml6YXRpb24iLCBzb2FwLT50bXBidWYpKSkKKyAgICAgIHJldHVybiBlcnI7CisgIH0KKyNlbmRpZgorI2lmZGVmIFdJVEhfQ09PS0lFUworI2lmZGVmIFdJVEhfT1BFTlNTTAorICBpZiAoc29hcF9wdXRjb29raWVzKHNvYXAsIGhvc3QsIHBhdGgsIHNvYXAtPnNzbCAhPSBOVUxMKSkKKyAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjZWxzZQorICBpZiAoc29hcF9wdXRjb29raWVzKHNvYXAsIGhvc3QsIHBhdGgsIDApKQorICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyNlbmRpZgorI2VuZGlmCisgIGlmIChhY3Rpb24gJiYgc29hcC0+dmVyc2lvbiA9PSAxKQorICB7IHNwcmludGYoc29hcC0+dG1wYnVmLCAiXCIlc1wiIiwgYWN0aW9uKTsKKyAgICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJTT0FQQWN0aW9uIiwgc29hcC0+dG1wYnVmKSkpCisgICAgICByZXR1cm4gZXJyOworICB9CisgIHJldHVybiBzb2FwLT5mcG9zdGhkcihzb2FwLCBOVUxMLCBOVUxMKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGludAoraHR0cF9zZW5kX2hlYWRlcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcykKK3sgcmVnaXN0ZXIgY29uc3QgY2hhciAqdDsKKyAgZG8KKyAgeyB0ID0gc3RyY2hyKHMsICdcbicpOyAvKiBkaXNhbGxvdyBcbiBpbiBIVFRQIGhlYWRlcnMgKi8KKyAgICBpZiAoIXQpCisgICAgICB0ID0gcyArIHN0cmxlbihzKTsKKyAgICBpZiAoc29hcF9zZW5kX3Jhdyhzb2FwLCBzLCB0IC0gcykpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgcyA9IHQgKyAxOworICB9IHdoaWxlICgqdCk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50CitodHRwX3Bvc3RfaGVhZGVyKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbCkKK3sgaWYgKGtleSkKKyAgeyBpZiAoaHR0cF9zZW5kX2hlYWRlcihzb2FwLCBrZXkpKQorICAgICAgcmV0dXJuIHNvYXAtPmVycm9yOworICAgIGlmICh2YWwgJiYgKHNvYXBfc2VuZF9yYXcoc29hcCwgIjogIiwgMikgfHwgaHR0cF9zZW5kX2hlYWRlcihzb2FwLCB2YWwpKSkKKyAgICAgIHJldHVybiBzb2FwLT5lcnJvcjsKKyAgfQorICByZXR1cm4gc29hcF9zZW5kX3Jhdyhzb2FwLCAiXHJcbiIsIDIpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0hUVFAKKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgaW50CitodHRwX3Jlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3RhdHVzLCBzaXplX3QgY291bnQpCit7IHJlZ2lzdGVyIGludCBlcnI7CisjaWZkZWYgV01XX1JQTV9JTworICBpZiAoc29hcC0+cnBtcmVxaWQpCisgICAgaHR0cE91dHB1dEVuYWJsZShzb2FwLT5ycG1yZXFpZCk7CisjZW5kaWYKKyAgaWYgKCFzdGF0dXMgfHwgc3RhdHVzID09IFNPQVBfSFRNTCB8fCBzdGF0dXMgPT0gU09BUF9GSUxFKQorICB7IERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiT0sgMjAwXG4iKSk7CisjaWZkZWYgV01XX1JQTV9JTworICAgIGlmIChzb2FwLT5ycG1yZXFpZCB8fCBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpIHx8IHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpIC8qIFJQTSBiZWhhdmVzIGFzIGlmIHN0YW5kYWxvbmUgKi8KKyNlbHNlCisgICAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikgfHwgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkgLyogc3RhbmRhbG9uZSBhcHBsaWNhdGlvbiAqLworI2VuZGlmCisgICAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIkhUVFAvJXMgMjAwIE9LIiwgc29hcC0+aHR0cF92ZXJzaW9uKTsKKyAgICAgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgc29hcC0+dG1wYnVmLCBOVUxMKSkpCisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGVsc2UgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCAiU3RhdHVzIiwgIjIwMCBPSyIpKSkKKyAgICAgIHJldHVybiBlcnI7CisgIH0KKyAgZWxzZSBpZiAoc3RhdHVzID4gMjAwICYmIHN0YXR1cyA8IDYwMCkKKyAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIkhUVFAvJXMgJWQgJXMiLCBzb2FwLT5odHRwX3ZlcnNpb24sIHN0YXR1cywgaHR0cF9lcnJvcihzb2FwLCBzdGF0dXMpKTsKKyAgICBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsIHNvYXAtPnRtcGJ1ZiwgTlVMTCkpKQorICAgICAgcmV0dXJuIGVycjsKKyNpZm5kZWYgV0lUSF9MRUFOIAorICAgIGlmIChzdGF0dXMgPT0gNDAxKQorICAgIHsgc3ByaW50Zihzb2FwLT50bXBidWYsICJCYXNpYyByZWFsbT1cIiVzXCIiLCBzb2FwLT5hdXRocmVhbG0gPyBzb2FwLT5hdXRocmVhbG0gOiAiZ1NPQVAgV2ViIFNlcnZpY2UiKTsKKyAgICAgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIldXVy1BdXRoZW50aWNhdGUiLCBzb2FwLT50bXBidWYpKSkKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgZWxzZSBpZiAoKHN0YXR1cyA+PSAzMDEgJiYgc3RhdHVzIDw9IDMwMykgfHwgc3RhdHVzID09IDMwNykKKyAgICB7IGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIkxvY2F0aW9uIiwgc29hcC0+ZW5kcG9pbnQpKSkKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisjZW5kaWYKKyAgfQorICBlbHNlCisgIHsgY29uc3QgY2hhciAqcyA9ICpzb2FwX2ZhdWx0Y29kZShzb2FwKTsKKyAgICBpZiAoc29hcC0+dmVyc2lvbiA9PSAyICYmICFzdHJjbXAocywgIlNPQVAtRU5WOlNlbmRlciIpKQorICAgICAgcyA9ICI0MDAgQmFkIFJlcXVlc3QiOworICAgIGVsc2UKKyAgICAgIHMgPSAiNTAwIEludGVybmFsIFNlcnZlciBFcnJvciI7CisgICAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJFcnJvciAlcyAoc3RhdHVzPSVkKVxuIiwgcywgc3RhdHVzKSk7CisjaWZkZWYgV01XX1JQTV9JTworICAgIGlmIChzb2FwLT5ycG1yZXFpZCB8fCBzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5tYXN0ZXIpIHx8IHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPnNvY2tldCkpIC8qIFJQTSBiZWhhdmVzIGFzIGlmIHN0YW5kYWxvbmUgKi8KKyNlbHNlCisgICAgaWYgKHNvYXBfdmFsaWRfc29ja2V0KHNvYXAtPm1hc3RlcikgfHwgc29hcF92YWxpZF9zb2NrZXQoc29hcC0+c29ja2V0KSkgLyogc3RhbmRhbG9uZSBhcHBsaWNhdGlvbiAqLworI2VuZGlmCisgICAgeyBzcHJpbnRmKHNvYXAtPnRtcGJ1ZiwgIkhUVFAvJXMgJXMiLCBzb2FwLT5odHRwX3ZlcnNpb24sIHMpOworICAgICAgaWYgKChlcnIgPSBzb2FwLT5mcG9zdGhkcihzb2FwLCBzb2FwLT50bXBidWYsIE5VTEwpKSkKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgZWxzZSBpZiAoKGVyciA9IHNvYXAtPmZwb3N0aGRyKHNvYXAsICJTdGF0dXMiLCBzKSkpCisgICAgICByZXR1cm4gZXJyOworICB9CisgIGlmICgoZXJyID0gc29hcC0+ZnBvc3RoZHIoc29hcCwgIlNlcnZlciIsICJnU09BUC8yLjciKSkKKyAgIHx8IChlcnIgPSBzb2FwX3B1dGh0dHBoZHIoc29hcCwgc3RhdHVzLCBjb3VudCkpKQorICAgIHJldHVybiBlcnI7CisjaWZkZWYgV0lUSF9DT09LSUVTCisgIGlmIChzb2FwX3B1dHNldGNvb2tpZXMoc29hcCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2VuZGlmCisgIHJldHVybiBzb2FwLT5mcG9zdGhkcihzb2FwLCBOVUxMLCBOVUxMKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3Jlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwLCBpbnQgc3RhdHVzKQoreyByZWdpc3RlciBzaXplX3QgY291bnQ7CisgIGlmICghKHNvYXAtPm9tb2RlICYgKFNPQVBfRU5DX1hNTCB8IFNPQVBfSU9fU1RPUkUgLyogdGhpcyB0ZXN0cyBmb3IgY2h1bmtpbmcgdG9vICovKSkKKyAgICYmIChzdGF0dXMgPT0gU09BUF9IVE1MIHx8IHN0YXR1cyA9PSBTT0FQX0ZJTEUpKQorICB7IHNvYXAtPm9tb2RlICY9IH5TT0FQX0lPOworICAgIHNvYXAtPm9tb2RlIHw9IFNPQVBfSU9fU1RPUkU7CisgIH0KKyAgc29hcC0+c3RhdHVzID0gc3RhdHVzOworICBjb3VudCA9IHNvYXBfY291bnRfYXR0YWNobWVudHMoc29hcCk7CisgIGlmIChzb2FwX2JlZ2luX3NlbmQoc29hcCkpCisgICAgcmV0dXJuIHNvYXAtPmVycm9yOworI2lmbmRlZiBXSVRIX05PSFRUUAorICBpZiAoKHNvYXAtPm1vZGUgJiBTT0FQX0lPKSAhPSBTT0FQX0lPX1NUT1JFICYmICEoc29hcC0+bW9kZSAmIFNPQVBfRU5DX1hNTCkpCisgIHsgcmVnaXN0ZXIgaW50IG4gPSBzb2FwLT5tb2RlOworICAgIHNvYXAtPm1vZGUgJj0gfihTT0FQX0lPIHwgU09BUF9FTkNfWkxJQik7CisgICAgaWYgKChuICYgU09BUF9JTykgIT0gU09BUF9JT19GTFVTSCkKKyAgICAgIHNvYXAtPm1vZGUgfD0gU09BUF9JT19CVUZGRVI7CisgICAgaWYgKChzb2FwLT5lcnJvciA9IHNvYXAtPmZyZXNwb25zZShzb2FwLCBzdGF0dXMsIGNvdW50KSkpCisgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgICAgaWYgKChuICYgU09BUF9JTykgPT0gU09BUF9JT19DSFVOSykKKyAgICB7IGlmIChzb2FwX2ZsdXNoKHNvYXApKQorICAgICAgICByZXR1cm4gc29hcC0+ZXJyb3I7CisgICAgfQorI2VuZGlmCisgICAgc29hcC0+bW9kZSA9IG47CisgIH0KKyNlbmRpZgorICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX0xFQU4KK3N0YXRpYyBjb25zdCBjaGFyKgorc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqdCkKK3sgaWYgKCpzb2FwLT50YWcpCisgICAgc3ByaW50Zihzb2FwLT5tc2didWYsICJWYWxpZGF0aW9uIGNvbnN0cmFpbnQgdmlvbGF0aW9uOiAlcyVzIGluIGVsZW1lbnQgPCVzPiIsIHMsIHQ/dDpTT0FQX1NUUl9FT1MsIHNvYXAtPnRhZyk7CisgIGVsc2UKKyAgICBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIlZhbGlkYXRpb24gY29uc3RyYWludCB2aW9sYXRpb246ICVzJXMiLCBzLCB0P3Q6U09BUF9TVFJfRU9TKTsKKyAgcmV0dXJuIHNvYXAtPm1zZ2J1ZjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK3ZvaWQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwKQoreyBjb25zdCBjaGFyICoqYyA9IHNvYXBfZmF1bHRjb2RlKHNvYXApOworICBjb25zdCBjaGFyICoqcyA9IHNvYXBfZmF1bHRzdHJpbmcoc29hcCk7CisgIGlmICghKmMgJiYgISpzICYmIHNvYXAtPmZzZXRlcnJvcikKKyAgICBzb2FwLT5mc2V0ZXJyb3Ioc29hcCwgYywgcyk7CisgIGlmICghKmMpCisgIHsgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgICAgICpjID0gIlNPQVAtRU5WOlNlbmRlciI7CisgICAgZWxzZQorICAgICAgKmMgPSAiU09BUC1FTlY6Q2xpZW50IjsKKyAgfQorICBpZiAoKnMpCisgICAgcmV0dXJuOworICBzd2l0Y2ggKHNvYXAtPmVycm9yKQorICB7CisjaWZuZGVmIFdJVEhfTEVBTgorICAgIGNhc2UgU09BUF9DTElfRkFVTFQ6CisgICAgICAqcyA9ICJDbGllbnQgZmF1bHQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1NWUl9GQVVMVDoKKyAgICAgICpzID0gIlNlcnZlciBmYXVsdCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfVEFHX01JU01BVENIOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJ0YWcgbmFtZSBvciBuYW1lc3BhY2UgbWlzbWF0Y2giLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9UWVBFOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJkYXRhIHR5cGUgbWlzbWF0Y2ggIiwgc29hcC0+dHlwZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfU1lOVEFYX0VSUk9SOgorICAgICAgKnMgPSAiV2VsbC1mb3JtZWRuZXNzIHZpb2xhdGlvbiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTk9fVEFHOgorICAgICAgKnMgPSAiTm8gWE1MIGVsZW1lbnQgdGFnIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9NVVNUVU5ERVJTVEFORDoKKyAgICAgICpjID0gIlNPQVAtRU5WOk11c3RVbmRlcnN0YW5kIjsKKyAgICAgIHNwcmludGYoc29hcC0+bXNnYnVmLCAiVGhlIGRhdGEgaW4gZWxlbWVudCAnJXMnIG11c3QgYmUgdW5kZXJzdG9vZCBidXQgY2Fubm90IGJlIGhhbmRsZWQiLCBzb2FwLT50YWcpOworICAgICAgKnMgPSBzb2FwLT5tc2didWY7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfVkVSU0lPTk1JU01BVENIOgorICAgICAgKmMgPSAiU09BUC1FTlY6VmVyc2lvbk1pc21hdGNoIjsKKyAgICAgICpzID0gIlNPQVAgdmVyc2lvbiBtaXNtYXRjaCBvciBpbnZhbGlkIFNPQVAgbWVzc2FnZSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfREFUQUVOQ09ESU5HVU5LTk9XTjoKKyAgICAgICpjID0gIlNPQVAtRU5WOkRhdGFFbmNvZGluZ1Vua25vd24iOworICAgICAgKnMgPSAiVW5zdXBwb3J0ZWQgU09BUCBkYXRhIGVuY29kaW5nIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9OQU1FU1BBQ0U6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgIm5hbWVzcGFjZSBtaXNtYXRjaCIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1VTRVJfRVJST1I6CisgICAgICAqcyA9ICJVc2VyIGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9GQVRBTF9FUlJPUjoKKyAgICAgICpzID0gIkZhdGFsIGVycm9yIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9OT19NRVRIT0Q6CisgICAgICBzcHJpbnRmKHNvYXAtPm1zZ2J1ZiwgIk1ldGhvZCAnJXMnIG5vdCBpbXBsZW1lbnRlZDogbWV0aG9kIG5hbWUgb3IgbmFtZXNwYWNlIG5vdCByZWNvZ25pemVkIiwgc29hcC0+dGFnKTsKKyAgICAgICpzID0gc29hcC0+bXNnYnVmOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0dFVF9NRVRIT0Q6CisgICAgICAqcyA9ICJIVFRQIEdFVCBtZXRob2Qgbm90IGltcGxlbWVudGVkIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9FT006CisgICAgICAqcyA9ICJPdXQgb2YgbWVtb3J5IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9JT0I6CisgICAgICAqcyA9ICJBcnJheSBpbmRleCBvdXQgb2YgYm91bmRzIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9OVUxMOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJuaWwgbm90IGFsbG93ZWQiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9EVVBMSUNBVEVfSUQ6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgIm11bHRpcGxlIGRlZmluaXRpb25zIG9mIGlkICIsIHNvYXAtPmlkKTsKKyAgICAgIGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgICAgICAgICpzb2FwX2ZhdWx0c3ViY29kZShzb2FwKSA9ICJTT0FQLUVOQzpEdXBsaWNhdGVJRCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTUlTU0lOR19JRDoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAibWlzc2luZyBpZCBmb3IgcmVmICIsIHNvYXAtPmlkKTsKKyAgICAgIGlmIChzb2FwLT52ZXJzaW9uID09IDIpCisgICAgICAgICpzb2FwX2ZhdWx0c3ViY29kZShzb2FwKSA9ICJTT0FQLUVOQzpNaXNzaW5nSUQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0hSRUY6CisgICAgICAqcyA9IHNvYXBfc2V0X3ZhbGlkYXRpb25fZmF1bHQoc29hcCwgImluY29tcGF0aWJsZSBvYmplY3QgcmVmICIsIHNvYXAtPmlkKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9GQVVMVDoKKyAgICAgIGJyZWFrOworI2lmbmRlZiBXSVRIX05PSU8KKyAgICBjYXNlIFNPQVBfVURQX0VSUk9SOgorICAgICAgKnMgPSAiTWVzc2FnZSB0b28gbGFyZ2UgZm9yIFVEUCBwYWNrZXQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1RDUF9FUlJPUjoKKyAgICAgICpzID0gdGNwX2Vycm9yKHNvYXApOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIFNPQVBfSFRUUF9FUlJPUjoKKyAgICAgICpzID0gIkhUVFAgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX1NTTF9FUlJPUjoKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgICAgICpzID0gIlNTTCBlcnJvciI7CisjZWxzZQorICAgICAgKnMgPSAiT3BlblNTTCBub3QgaW5zdGFsbGVkOiByZWNvbXBpbGUgd2l0aCAtRFdJVEhfT1BFTlNTTCI7CisjZW5kaWYKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9QTFVHSU5fRVJST1I6CisgICAgICAqcyA9ICJQbHVnaW4gcmVnaXN0cnkgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0RJTUVfRVJST1I6CisgICAgICAqcyA9ICJESU1FIGZvcm1hdCBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfRElNRV9IUkVGOgorICAgICAgKnMgPSAiRElNRSBocmVmIHRvIG1pc3NpbmcgYXR0YWNobWVudCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfRElNRV9NSVNNQVRDSDoKKyAgICAgICpzID0gIkRJTUUgdmVyc2lvbi90cmFuc21pc3Npb24gZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0RJTUVfRU5EOgorICAgICAgKnMgPSAiRW5kIG9mIERJTUUgZXJyb3IiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX01JTUVfRVJST1I6CisgICAgICAqcyA9ICJNSU1FIGZvcm1hdCBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTUlNRV9IUkVGOgorICAgICAgKnMgPSAiTUlNRSBocmVmIHRvIG1pc3NpbmcgYXR0YWNobWVudCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfTUlNRV9FTkQ6CisgICAgICAqcyA9ICJFbmQgb2YgTUlNRSBlcnJvciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfWkxJQl9FUlJPUjoKKyNpZmRlZiBXSVRIX1pMSUIKKyAgICAgIHNwcmludGYoc29hcC0+bXNnYnVmLCAiWmxpYi9nemlwIGVycm9yOiAnJXMnIiwgc29hcC0+ZF9zdHJlYW0ubXNnP3NvYXAtPmRfc3RyZWFtLm1zZzoiIik7CisgICAgICAqcyA9IHNvYXAtPm1zZ2J1ZjsKKyNlbHNlCisgICAgICAqcyA9ICJabGliL2d6aXAgbm90IGluc3RhbGxlZCBmb3IgKGRlKWNvbXByZXNzaW9uOiByZWNvbXBpbGUgd2l0aCAtRFdJVEhfR1pJUCI7CisjZW5kaWYKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9SRVFVSVJFRDoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAibWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGUiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU09BUF9QUk9ISUJJVEVEOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJwcm9oaWJpdGVkIGF0dHJpYnV0ZSBwcmVzZW50IiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfT0NDVVJTOgorICAgICAgKnMgPSBzb2FwX3NldF92YWxpZGF0aW9uX2ZhdWx0KHNvYXAsICJtaW4vbWF4T2NjdXJzIHZpb2xhdGlvbiIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0FQX0xFTkdUSDoKKyAgICAgICpzID0gc29hcF9zZXRfdmFsaWRhdGlvbl9mYXVsdChzb2FwLCAiY29udGVudCBsZW5ndGggdmlvbGF0aW9uIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPQVBfU1RPUDoKKyAgICAgICpzID0gIlN0b3BwZWQ6IG5vIHJlc3BvbnNlIHNlbnQiOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIFNPQVBfRU9GOgorI2lmbmRlZiBXSVRIX05PSU8KKyAgICAgIHNwcmludGYoc29hcC0+bXNnYnVmLCAiRW5kIG9mIGZpbGUgb3Igbm8gaW5wdXQ6ICclcyciLCBzb2FwX3N0cmVycm9yKHNvYXApKTsKKyAgICAgICpzID0gc29hcC0+bXNnYnVmOworICAgICAgYnJlYWs7CisjZWxzZQorICAgICAgKnMgPSAiRW5kIG9mIGZpbGUgb3Igbm8gaW5wdXQiOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBXSVRIX0xFQU4KKyAgICAgIGlmIChzb2FwLT5lcnJvciA+IDIwMCAmJiBzb2FwLT5lcnJvciA8IDYwMCkKKyAgICAgIHsgc3ByaW50Zihzb2FwLT5tc2didWYsICJIVFRQIEVycm9yOiAlZCAlcyIsIHNvYXAtPmVycm9yLCBodHRwX2Vycm9yKHNvYXAsIHNvYXAtPmVycm9yKSk7CisgICAgICAgICpzID0gc29hcC0+bXNnYnVmOworICAgICAgfQorICAgICAgZWxzZQorI2VuZGlmCisjZW5kaWYKKyAgICAgIHsgc3ByaW50Zihzb2FwLT5tc2didWYsICJFcnJvciAlZCIsIHNvYXAtPmVycm9yKTsKKyAgICAgICAgKnMgPSBzb2FwLT5tc2didWY7CisgICAgICB9CisgICAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmRfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXApCit7IHJlZ2lzdGVyIGludCBzdGF0dXMgPSBzb2FwLT5lcnJvcjsKKyAgaW50IHIgPSAxOworICBpZiAoc3RhdHVzID09IFNPQVBfU1RPUCkKKyAgICByZXR1cm4gc3RhdHVzOworICBEQkdMT0coVEVTVCxTT0FQX01FU1NBR0UoZmRlYnVnLCAiU2VuZGluZyBiYWNrIGZhdWx0IHN0cnVjdCBmb3IgZXJyb3IgY29kZSAlZFxuIiwgc29hcC0+ZXJyb3IpKTsKKyAgc29hcC0+a2VlcF9hbGl2ZSA9IDA7IC8qIHRvIHRlcm1pbmF0ZSBjb25uZWN0aW9uICovCisgIHNvYXBfc2V0X2ZhdWx0KHNvYXApOworI2lmbmRlZiBXSVRIX05PSU8KKyNpZm5kZWYgV0lUSF9MRUFOCisgIGlmIChzb2FwX3ZhbGlkX3NvY2tldChzb2FwLT5zb2NrZXQpKQorICB7IHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgZmRfc2V0IHJmZCwgc2ZkOworICAgIHRpbWVvdXQudHZfc2VjID0gMDsKKyAgICB0aW1lb3V0LnR2X3VzZWMgPSAwOworICAgIEZEX1pFUk8oJnJmZCk7CisgICAgRkRfWkVSTygmc2ZkKTsKKyAgICBGRF9TRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnJmZCk7CisgICAgRkRfU0VUKChTT0FQX1NPQ0tFVClzb2FwLT5zb2NrZXQsICZzZmQpOworICAgIHIgPSBzZWxlY3QoKFNPQVBfU09DS0VUKShzb2FwLT5zb2NrZXQgKyAxKSwgJnJmZCwgJnNmZCwgTlVMTCwgJnRpbWVvdXQpOworICAgIGlmIChyID4gMCkKKyAgICB7IGlmICghRkRfSVNTRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnNmZCkKKyAgICAgICB8fCAoRkRfSVNTRVQoKFNPQVBfU09DS0VUKXNvYXAtPnNvY2tldCwgJnJmZCkKKyAgICAgICAgJiYgcmVjdigoU09BUF9TT0NLRVQpc29hcC0+c29ja2V0LCBzb2FwLT50bXBidWYsIDEsIE1TR19QRUVLKSA8IDApKQorICAgICAgICByID0gMDsKKyAgICB9CisgIH0KKyNlbmRpZgorI2VuZGlmCisgIGlmICgoc3RhdHVzICE9IFNPQVBfRU9GIHx8ICghc29hcC0+cmVjdl90aW1lb3V0ICYmICFzb2FwLT5zZW5kX3RpbWVvdXQpKSAmJiByID4gMCkKKyAgeyBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgICAgc29hcF9zZXJpYWxpemVoZWFkZXIoc29hcCk7CisgICAgc29hcF9zZXJpYWxpemVmYXVsdChzb2FwKTsKKyAgICBzb2FwX2JlZ2luX2NvdW50KHNvYXApOworICAgIGlmIChzb2FwLT5tb2RlICYgU09BUF9JT19MRU5HVEgpCisgICAgeyBzb2FwX2VudmVsb3BlX2JlZ2luX291dChzb2FwKTsKKyAgICAgIHNvYXBfcHV0aGVhZGVyKHNvYXApOworICAgICAgc29hcF9ib2R5X2JlZ2luX291dChzb2FwKTsKKyAgICAgIHNvYXBfcHV0ZmF1bHQoc29hcCk7CisgICAgICBzb2FwX2JvZHlfZW5kX291dChzb2FwKTsKKyAgICAgIHNvYXBfZW52ZWxvcGVfZW5kX291dChzb2FwKTsKKyAgICB9CisgICAgc29hcF9lbmRfY291bnQoc29hcCk7CisgICAgaWYgKHNvYXBfcmVzcG9uc2Uoc29hcCwgc3RhdHVzKQorICAgICB8fCBzb2FwX2VudmVsb3BlX2JlZ2luX291dChzb2FwKQorICAgICB8fCBzb2FwX3B1dGhlYWRlcihzb2FwKQorICAgICB8fCBzb2FwX2JvZHlfYmVnaW5fb3V0KHNvYXApCisgICAgIHx8IHNvYXBfcHV0ZmF1bHQoc29hcCkKKyAgICAgfHwgc29hcF9ib2R5X2VuZF9vdXQoc29hcCkKKyAgICAgfHwgc29hcF9lbnZlbG9wZV9lbmRfb3V0KHNvYXApKQorICAgICAgcmV0dXJuIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgIHNvYXBfZW5kX3NlbmQoc29hcCk7CisgIH0KKyAgc29hcC0+ZXJyb3IgPSBzdGF0dXM7CisgIHJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9yZWN2X2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgc3RhdHVzID0gc29hcC0+ZXJyb3I7CisgIERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJSZWNlaXZpbmcgU09BUCBGYXVsdFxuIikpOworICBzb2FwLT5lcnJvciA9IFNPQVBfT0s7CisgIGlmIChzb2FwX2dldGZhdWx0KHNvYXApKQorICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJFcnJvcjogc29hcF9nZXRfc29hcGZhdWx0KCkgZmFpbGVkLiBJcyB0aGlzIGEgU09BUCBtZXNzYWdlIGF0IGFsbD9cbiIpKTsKKyAgICAqc29hcF9mYXVsdGNvZGUoc29hcCkgPSAoc29hcC0+dmVyc2lvbiA9PSAyID8gIlNPQVAtRU5WOlNlbmRlciIgOiAiU09BUC1FTlY6Q2xpZW50Iik7CisgICAgc29hcC0+ZXJyb3IgPSBzdGF0dXM7CisgICAgc29hcF9zZXRfZmF1bHQoc29hcCk7CisgIH0KKyAgZWxzZQorICB7IHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnMgPSAqc29hcF9mYXVsdGNvZGUoc29hcCk7CisgICAgaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCBzLCAiU09BUC1FTlY6U2VydmVyIikgfHwgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHMsICJTT0FQLUVOVjpSZWNlaXZlciIpKQorICAgICAgc3RhdHVzID0gU09BUF9TVlJfRkFVTFQ7IAorICAgIGVsc2UgaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCBzLCAiU09BUC1FTlY6Q2xpZW50IikgfHwgIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHMsICJTT0FQLUVOVjpTZW5kZXIiKSkKKyAgICAgIHN0YXR1cyA9IFNPQVBfQ0xJX0ZBVUxUOworICAgIGVsc2UgaWYgKCFzb2FwX21hdGNoX3RhZyhzb2FwLCBzLCAiU09BUC1FTlY6TXVzdFVuZGVyc3RhbmQiKSkKKyAgICAgIHN0YXR1cyA9IFNPQVBfTVVTVFVOREVSU1RBTkQ7CisgICAgZWxzZSBpZiAoIXNvYXBfbWF0Y2hfdGFnKHNvYXAsIHMsICJTT0FQLUVOVjpWZXJzaW9uTWlzbWF0Y2giKSkKKyAgICAgIHN0YXR1cyA9IFNPQVBfVkVSU0lPTk1JU01BVENIOworICAgIGVsc2UKKyAgICB7IERCR0xPRyhURVNULFNPQVBfTUVTU0FHRShmZGVidWcsICJGYXVsdCBjb2RlICVzXG4iLCBzKSk7CisgICAgICBzdGF0dXMgPSBTT0FQX0ZBVUxUOworICAgIH0KKyAgICBpZiAoc29hcF9ib2R5X2VuZF9pbihzb2FwKQorICAgICB8fCBzb2FwX2VudmVsb3BlX2VuZF9pbihzb2FwKQorICAgICB8fCBzb2FwX2VuZF9yZWN2KHNvYXApKQorICAgICAgcmV0dXJuIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICAgIHNvYXAtPmVycm9yID0gc3RhdHVzOworICB9CisgIHJldHVybiBzb2FwX2Nsb3Nlc29jayhzb2FwKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBXSVRIX05PSFRUUAorI2lmbmRlZiBQQUxNXzEKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZW5kX2VtcHR5X3Jlc3BvbnNlKHN0cnVjdCBzb2FwICpzb2FwKQoreyBzb2FwLT5jb3VudCA9IDA7CisgIGlmIChzb2FwX3Jlc3BvbnNlKHNvYXAsIFNPQVBfT0spIHx8IHNvYXBfZW5kX3NlbmQoc29hcCkpCisgICAgcmV0dXJuIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICByZXR1cm4gU09BUF9PSzsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFdJVEhfTk9IVFRQCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlY3ZfZW1wdHlfcmVzcG9uc2Uoc3RydWN0IHNvYXAgKnNvYXApCit7IGlmIChzb2FwX2JlZ2luX3JlY3Yoc29hcCkgfHwgc29hcF9lbmRfcmVjdihzb2FwKSkKKyAgICByZXR1cm4gc29hcF9jbG9zZXNvY2soc29hcCk7CisgIHJldHVybiBTT0FQX09LOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgV0lUSF9OT0lPCisjaWZuZGVmIFBBTE1fMQorc3RhdGljIGNvbnN0IGNoYXIqCitzb2FwX3N0cmVycm9yKHN0cnVjdCBzb2FwICpzb2FwKQoreyByZWdpc3RlciBpbnQgZXJyID0gc29hcC0+ZXJybnVtOworICBpZiAoZXJyKQorICB7CisjaWZuZGVmIFdJTjMyCisgICAgcmV0dXJuIHN0cmVycm9yKGVycik7CisjZWxzZQorICAgIEZvcm1hdE1lc3NhZ2UoRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU18Rk9STUFUX01FU1NBR0VfSUdOT1JFX0lOU0VSVFMsIE5VTEwsIGVyciwgMCwgKExQVFNUUikmc29hcC0+ZXJyb3JzdHIsIHNpemVvZihzb2FwLT5lcnJvcnN0ciksIE5VTEwpOworICAgIHJldHVybiBzb2FwLT5lcnJvcnN0cjsKKyNlbmRpZgorICB9CisgIHJldHVybiAiT3BlcmF0aW9uIGludGVycnVwdGVkIG9yIHRpbWVkIG91dCI7Cit9CisjZW5kaWYKKyNlbmRpZiAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitzdGF0aWMgaW50Citzb2FwX3NldF9lcnJvcihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRjb2RlLCBjb25zdCBjaGFyICpmYXVsdHN1YmNvZGUsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCwgaW50IHNvYXBlcnJvcikKK3sgKnNvYXBfZmF1bHRjb2RlKHNvYXApID0gZmF1bHRjb2RlOworICBpZiAoZmF1bHRzdWJjb2RlKQorICAgICpzb2FwX2ZhdWx0c3ViY29kZShzb2FwKSA9IGZhdWx0c3ViY29kZTsKKyAgKnNvYXBfZmF1bHRzdHJpbmcoc29hcCkgPSBmYXVsdHN0cmluZzsKKyAgaWYgKGZhdWx0ZGV0YWlsICYmICpmYXVsdGRldGFpbCkKKyAgeyByZWdpc3RlciBjb25zdCBjaGFyICoqcyA9IHNvYXBfZmF1bHRkZXRhaWwoc29hcCk7CisgICAgaWYgKHMpCisgICAgICAqcyA9IGZhdWx0ZGV0YWlsOworICB9CisgIHJldHVybiBzb2FwLT5lcnJvciA9IHNvYXBlcnJvcjsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK1NPQVBfRk1BQzEKK2ludAorU09BUF9GTUFDMgorc29hcF9zZXRfc2VuZGVyX2Vycm9yKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdHN0cmluZywgY29uc3QgY2hhciAqZmF1bHRkZXRhaWwsIGludCBzb2FwZXJyb3IpCit7IHJldHVybiBzb2FwX3NldF9lcnJvcihzb2FwLCBzb2FwLT52ZXJzaW9uID09IDIgPyAiU09BUC1FTlY6U2VuZGVyIiA6ICJTT0FQLUVOVjpDbGllbnQiLCBOVUxMLCBmYXVsdHN0cmluZywgZmF1bHRkZXRhaWwsIHNvYXBlcnJvcik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfc2V0X3JlY2VpdmVyX2Vycm9yKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdHN0cmluZywgY29uc3QgY2hhciAqZmF1bHRkZXRhaWwsIGludCBzb2FwZXJyb3IpCit7IHJldHVybiBzb2FwX3NldF9lcnJvcihzb2FwLCBzb2FwLT52ZXJzaW9uID09IDIgPyAiU09BUC1FTlY6UmVjZWl2ZXIiIDogIlNPQVAtRU5WOlNlcnZlciIsIE5VTEwsIGZhdWx0c3RyaW5nLCBmYXVsdGRldGFpbCwgc29hcGVycm9yKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBQQUxNXzIKK3N0YXRpYyBpbnQKK3NvYXBfY29weV9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRjb2RlLCBjb25zdCBjaGFyICpmYXVsdHN1YmNvZGUsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCkKK3sgY2hhciAqciA9IE5VTEwsICpzID0gTlVMTCwgKnQgPSBOVUxMOworICBpZiAoZmF1bHRzdWJjb2RlKQorICAgIHIgPSBzb2FwX3N0cmR1cChzb2FwLCBmYXVsdHN1YmNvZGUpOworICBpZiAoZmF1bHRzdHJpbmcpCisgICAgcyA9IHNvYXBfc3RyZHVwKHNvYXAsIGZhdWx0c3RyaW5nKTsKKyAgaWYgKGZhdWx0ZGV0YWlsKQorICAgIHQgPSBzb2FwX3N0cmR1cChzb2FwLCBmYXVsdGRldGFpbCk7CisgIHJldHVybiBzb2FwX3NldF9lcnJvcihzb2FwLCBmYXVsdGNvZGUsIHIsIHMsIHQsIFNPQVBfRkFVTFQpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmRlcl9mYXVsdChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqZmF1bHRzdHJpbmcsIGNvbnN0IGNoYXIgKmZhdWx0ZGV0YWlsKQoreyByZXR1cm4gc29hcF9zZW5kZXJfZmF1bHRfc3ViY29kZShzb2FwLCBOVUxMLCBmYXVsdHN0cmluZywgZmF1bHRkZXRhaWwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3NlbmRlcl9mYXVsdF9zdWJjb2RlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpmYXVsdHN1YmNvZGUsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCkKK3sgcmV0dXJuIHNvYXBfY29weV9mYXVsdChzb2FwLCBzb2FwLT52ZXJzaW9uID09IDIgPyAiU09BUC1FTlY6U2VuZGVyIiA6ICJTT0FQLUVOVjpDbGllbnQiLCBmYXVsdHN1YmNvZGUsIGZhdWx0c3RyaW5nLCBmYXVsdGRldGFpbCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8yCitTT0FQX0ZNQUMxCitpbnQKK1NPQVBfRk1BQzIKK3NvYXBfcmVjZWl2ZXJfZmF1bHQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZhdWx0c3RyaW5nLCBjb25zdCBjaGFyICpmYXVsdGRldGFpbCkKK3sgcmV0dXJuIHNvYXBfcmVjZWl2ZXJfZmF1bHRfc3ViY29kZShzb2FwLCBOVUxMLCBmYXVsdHN0cmluZywgZmF1bHRkZXRhaWwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlY2VpdmVyX2ZhdWx0X3N1YmNvZGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmZhdWx0c3ViY29kZSwgY29uc3QgY2hhciAqZmF1bHRzdHJpbmcsIGNvbnN0IGNoYXIgKmZhdWx0ZGV0YWlsKQoreyByZXR1cm4gc29hcF9jb3B5X2ZhdWx0KHNvYXAsIHNvYXAtPnZlcnNpb24gPT0gMiA/ICJTT0FQLUVOVjpSZWNlaXZlciIgOiAiU09BUC1FTlY6U2VydmVyIiwgZmF1bHRzdWJjb2RlLCBmYXVsdHN0cmluZywgZmF1bHRkZXRhaWwpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorI2lmbmRlZiBXSVRIX05PU1RETElCCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3ByaW50X2ZhdWx0KHN0cnVjdCBzb2FwICpzb2FwLCBGSUxFICpmZCkKK3sgaWYgKHNvYXBfY2hlY2tfc3RhdGUoc29hcCkpCisgICAgZnByaW50ZihmZCwgIkVycm9yOiBzb2FwIHN0cnVjdCBub3QgaW5pdGlhbGl6ZWRcbiIpOworICBlbHNlIGlmIChzb2FwLT5lcnJvcikKKyAgeyBjb25zdCBjaGFyICpjLCAqdiA9IE5VTEwsICpzLCAqKmQ7CisgICAgZCA9IHNvYXBfZmF1bHRjb2RlKHNvYXApOworICAgIGlmICghKmQpCisgICAgICBzb2FwX3NldF9mYXVsdChzb2FwKTsKKyAgICBjID0gKmQ7CisgICAgaWYgKHNvYXAtPnZlcnNpb24gPT0gMikKKyAgICAgIHYgPSAqc29hcF9mYXVsdHN1YmNvZGUoc29hcCk7CisgICAgcyA9ICpzb2FwX2ZhdWx0c3RyaW5nKHNvYXApOworICAgIGQgPSBzb2FwX2ZhdWx0ZGV0YWlsKHNvYXApOworICAgIGZwcmludGYoZmQsICIlcyVkIGZhdWx0OiAlcyBbJXNdXG5cIiVzXCJcbkRldGFpbDogJXNcbiIsIHNvYXAtPnZlcnNpb24gPyAiU09BUCAxLiIgOiAiRXJyb3IgIiwgc29hcC0+dmVyc2lvbiA/IChpbnQpc29hcC0+dmVyc2lvbiA6IHNvYXAtPmVycm9yLCBjLCB2ID8gdiA6ICJubyBzdWJjb2RlIiwgcyA/IHMgOiAiW25vIHJlYXNvbl0iLCBkICYmICpkID8gKmQgOiAiW25vIGRldGFpbF0iKTsKKyAgfQorfQorI2VuZGlmCisjZW5kaWYKKyAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorI2lmbmRlZiBXSVRIX05PU1RETElCCitTT0FQX0ZNQUMxCit2b2lkCitTT0FQX0ZNQUMyCitzb2FwX3ByaW50X2ZhdWx0X2xvY2F0aW9uKHN0cnVjdCBzb2FwICpzb2FwLCBGSUxFICpmZCkKK3sgCisjaWZuZGVmIFdJVEhfTEVBTgorICBpbnQgaSwgaiwgYzEsIGMyOworICBpZiAoc29hcC0+ZXJyb3IgJiYgc29hcC0+YnVmbGVuID4gMCkKKyAgeyBpID0gKGludClzb2FwLT5idWZpZHggLSAxOworICAgIGlmIChpIDw9IDApCisgICAgICBpID0gMDsKKyAgICBjMSA9IHNvYXAtPmJ1ZltpXTsKKyAgICBzb2FwLT5idWZbaV0gPSAnXDAnOworICAgIGlmICgoaW50KXNvYXAtPmJ1ZmxlbiA+PSBpICsgMTAyNCkKKyAgICAgIGogPSBpICsgMTAyMzsKKyAgICBlbHNlCisgICAgICBqID0gKGludClzb2FwLT5idWZsZW4gLSAxOworICAgIGMyID0gc29hcC0+YnVmW2pdOworICAgIHNvYXAtPmJ1ZltqXSA9ICdcMCc7CisgICAgZnByaW50ZihmZCwgIiVzJWNcbioqIEhFUkUgKipcbiIsIHNvYXAtPmJ1ZiwgYzEpOworICAgIGlmIChzb2FwLT5idWZpZHggPCBzb2FwLT5idWZsZW4pCisgICAgICBmcHJpbnRmKGZkLCAiJXNcbiIsIHNvYXAtPmJ1ZiArIHNvYXAtPmJ1ZmlkeCk7CisgICAgc29hcC0+YnVmW2ldID0gYzE7CisgICAgc29hcC0+YnVmW2pdID0gYzI7CisgIH0KKyNlbmRpZgorfQorI2VuZGlmCisjZW5kaWYKKyAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMQorU09BUF9GTUFDMQoraW50CitTT0FQX0ZNQUMyCitzb2FwX3JlZ2lzdGVyX3BsdWdpbl9hcmcoc3RydWN0IHNvYXAgKnNvYXAsIGludCAoKmZjcmVhdGUpKHN0cnVjdCBzb2FwKiwgc3RydWN0IHNvYXBfcGx1Z2luKiwgdm9pZCopLCB2b2lkICphcmcpCit7IHJlZ2lzdGVyIHN0cnVjdCBzb2FwX3BsdWdpbiAqcDsKKyAgcmVnaXN0ZXIgaW50IHI7CisgIGlmICghKHAgPSAoc3RydWN0IHNvYXBfcGx1Z2luKilTT0FQX01BTExPQyhzb2FwLCBzaXplb2Yoc3RydWN0IHNvYXBfcGx1Z2luKSkpKQorICAgIHJldHVybiBzb2FwLT5lcnJvciA9IFNPQVBfRU9NOworICBwLT5pZCA9IE5VTEw7CisgIHAtPmRhdGEgPSBOVUxMOworICBwLT5mY29weSA9IE5VTEw7CisgIHAtPmZkZWxldGUgPSBOVUxMOworICByID0gZmNyZWF0ZShzb2FwLCBwLCBhcmcpOworICBpZiAoIXIgJiYgcC0+ZmRlbGV0ZSkKKyAgeyBwLT5uZXh0ID0gc29hcC0+cGx1Z2luczsKKyAgICBzb2FwLT5wbHVnaW5zID0gcDsKKyAgICBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIlJlZ2lzdGVyZWQgJyVzJyBwbHVnaW5cbiIsIHAtPmlkKSk7CisgICAgcmV0dXJuIFNPQVBfT0s7CisgIH0KKyAgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICJDb3VsZCBub3QgcmVnaXN0ZXIgcGx1Z2luICclcyc6IHBsdWdpbiByZXR1cm5lZCBlcnJvciAlZCAob3IgZmRlbGV0ZSBjYWxsYmFjayBub3Qgc2V0KVxuIiwgcC0+aWQ/cC0+aWQ6Ij8iLCByKSk7CisgIFNPQVBfRlJFRShzb2FwLCBwKTsKKyAgcmV0dXJuIHI7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFMTV8xCitzdGF0aWMgdm9pZCAqCitmcGx1Z2luKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICppZCkKK3sgcmVnaXN0ZXIgc3RydWN0IHNvYXBfcGx1Z2luICpwOworICBmb3IgKHAgPSBzb2FwLT5wbHVnaW5zOyBwOyBwID0gcC0+bmV4dCkKKyAgICBpZiAocC0+aWQgPT0gaWQgfHwgIXN0cmNtcChwLT5pZCwgaWQpKQorICAgICAgcmV0dXJuIHAtPmRhdGE7CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBTE1fMgorU09BUF9GTUFDMQordm9pZCAqCitTT0FQX0ZNQUMyCitzb2FwX2xvb2t1cF9wbHVnaW4oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmlkKQoreyByZXR1cm4gc29hcC0+ZnBsdWdpbihzb2FwLCBpZCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworI2lmbmRlZiBXSVRIX0xFQU4KK3NvYXA6OnNvYXAoKQoreyBzb2FwX2luaXQodGhpcyk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICoKKyAqCUMrKyBzb2FwIHN0cnVjdCBtZXRob2RzCisgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworI2lmbmRlZiBXSVRIX0xFQU4KK3NvYXA6OnNvYXAoc29hcF9tb2RlIG1vZGUpCit7IHNvYXBfaW5pdDEodGhpcywgbW9kZSk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIF9fY3BsdXNwbHVzCisjaWZuZGVmIFdJVEhfTEVBTgorc29hcDo6c29hcChzb2FwX21vZGUgaW1vZGUsIHNvYXBfbW9kZSBvbW9kZSkKK3sgc29hcF9pbml0Mih0aGlzLCBpbW9kZSwgb21vZGUpOworfQorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworI2lmbmRlZiBXSVRIX0xFQU4KK3NvYXA6OnNvYXAoc3RydWN0IHNvYXAmIHNvYXApCit7IHNvYXBfY29weV9jb250ZXh0KHRoaXMsICZzb2FwKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpZm5kZWYgV0lUSF9MRUFOCitzb2FwOjp+c29hcCgpCit7IHNvYXBfZGVzdHJveSh0aGlzKTsKKyAgc29hcF9lbmQodGhpcyk7CisgIHNvYXBfZG9uZSh0aGlzKTsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9zdGRzb2FwMi5oIGIvc3Rkc29hcDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzI1OWM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3Rkc29hcDIuaApAQCAtMCwwICsxLDIxMDQgQEAKKy8qCisKK3N0ZHNvYXAyLmggMi43LjZlCisKK2dTT0FQIHJ1bnRpbWUKKworZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlczoKK0dQTCwgdGhlIGdTT0FQIHB1YmxpYyBsaWNlbnNlLCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ29udHJpYnV0b3JzOgorCitXaW5kIFJpdmVyIFN5c3RlbXMsIEluYy4sIGZvciB0aGUgZm9sbG93aW5nIGFkZGl0aW9ucyAobWFya2VkIFdSWy4uLl0pOgorICAtIHZ4V29ya3MgY29tcGF0aWJsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIHB1YmxpYyBsaWNlbnNlLgorCitUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBnU09BUCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMworKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCitMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK2h0dHA6Ly93d3cuY3MuZnN1LmVkdS9+ZW5nZWxlbi9zb2FwbGljZW5zZS5odG1sCitTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLAorV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCitmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgUm9iZXJ0IEEuIHZhbiBFbmdlbGVuLgorQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZmRlZiBXSVRIX1NPQVBERUZTX0gKKyMgaW5jbHVkZSAic29hcGRlZnMuaCIJCS8qIGluY2x1ZGUgdXNlci1kZWZpbmVkIHN0dWZmICovCisjZW5kaWYKKworI2lmbmRlZiBfVEhSRUFEX1NBRkUKKyMgZGVmaW5lIF9USFJFQURfU0FGRQorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNFUlZFUgorIyBpZm5kZWYgX1JFRU5UUkFOVAorIyAgZGVmaW5lIF9SRUVOVFJBTlQKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfRk1BQzEJLyogc3Rkc29hcDIuaCBkZWNsYXJhdGlvbiBtYWNybyAqLworIyBkZWZpbmUgU09BUF9GTUFDMQorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9GTUFDMgkvKiBzdGRzb2FwMi5oIGRlY2xhcmF0aW9uIG1hY3JvICovCisjIGRlZmluZSBTT0FQX0ZNQUMyCisjZW5kaWYKKworI2lmbmRlZiBTT0FQX0ZNQUMzCS8qIChkZSlzZXJpYWxpemVyIGRlY2xhcmF0aW9uIG1hY3JvICovCisjIGRlZmluZSBTT0FQX0ZNQUMzCisjZW5kaWYKKworI2lmbmRlZiBTT0FQX0ZNQUMzUwkvKiBzdHJpbmcgY29udmVydGVyIGZvciAoZGUpc2VyaWFsaXplciBkZWNsYXJhdGlvbiBtYWNybyAqLworIyBkZWZpbmUgU09BUF9GTUFDM1MgU09BUF9GTUFDMworI2VuZGlmCisKKyNpZm5kZWYgU09BUF9GTUFDNAkvKiAoZGUpc2VyaWFsaXplciBkZWNsYXJhdGlvbiBtYWNybyAqLworIyBkZWZpbmUgU09BUF9GTUFDNAorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9GTUFDNFMJLyogc3RyaW5nIGNvbnZlcnRlciBmb3IgKGRlKXNlcmlhbGl6ZXIgZGVjbGFyYXRpb24gbWFjcm8gKi8KKyMgZGVmaW5lIFNPQVBfRk1BQzRTIFNPQVBfRk1BQzQKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfRk1BQzUJLyogc3R1Yi9za2VsZXRvbiBkZWNsYXJhdGlvbiBtYWNybyAqLworIyBkZWZpbmUgU09BUF9GTUFDNQorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9GTUFDNgkvKiBzdHViL3NrZWxldG9uIGRlY2xhcmF0aW9uIG1hY3JvICovCisjIGRlZmluZSBTT0FQX0ZNQUM2CisjZW5kaWYKKworI2lmbmRlZiBTT0FQX0NNQUMJLyogY2xhc3MgZGVjbGFyYXRpb24gbWFjcm8gKi8KKyMgZGVmaW5lIFNPQVBfQ01BQworI2VuZGlmCisKKyNpZm5kZWYgU09BUF9OTUFDCS8qIG5hbWVzcGFjZSB0YWJsZSBkZWNsYXJhdGlvbiBtYWNybyAqLworIyBkZWZpbmUgU09BUF9OTUFDCisjZW5kaWYKKworI2lmbmRlZiBTT0FQX1NPVVJDRV9TVEFNUAorIyBkZWZpbmUgU09BUF9TT1VSQ0VfU1RBTVAoc3RyKQorI2VuZGlmCisKKy8qIGdTT0FQIDIuNy40IGFuZCBoaWdoZXI6IGZhc3QgbG9vay1hc2lkZSBidWZmZXJpbmcgaXMgc3RhYmxlICovCisjaWZuZGVmIFdJVEhfRkFTVAorIyBkZWZpbmUgV0lUSF9GQVNUCisjZW5kaWYKKworI2lmZGVmIFdJVEhfTEVBTkVSCisjIGlmbmRlZiBXSVRIX0xFQU4KKyMgIGRlZmluZSBXSVRIX0xFQU4KKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgV0lUSF9MRUFOCisjIGlmZGVmIFdJVEhfQ09PS0lFUworIyAgZXJyb3IgIkNhbm5vdCBidWlsZCBXSVRIX0xFQU4gY29kZSBXSVRIX0NPT0tJRVMgZW5hYmxlZCIKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFNURFNPQVBfSAorI2RlZmluZSBTVERTT0FQX0gKKworI2lmIGRlZmluZWQoX192eHdvcmtzKSB8fCBkZWZpbmVkKF9fVlhXT1JLU19fKQorIyBkZWZpbmUgVlhXT1JLUworI2VuZGlmCisKKyNpZmRlZiBfV0lOMzIKKyMgaWZuZGVmIFdJTjMyCisjICBkZWZpbmUgV0lOMzIKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgVU5ERVJfQ0UKKyMgaWZuZGVmIFdJTjMyCisjICBkZWZpbmUgV0lOMzIKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19CT1JMQU5EQ19fCisjIGlmZGVmIF9fV0lOMzJfXworIyAgaWZuZGVmIFdJTjMyCisjICAgZGVmaW5lIFdJTjMyCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX0NZR1dJTl9fCisjIGlmbmRlZiBDWUdXSU4KKyMgIGRlZmluZSBDWUdXSU4KKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19TWU1CSUFOMzJfXyAKKyMgZGVmaW5lIFNZTUJJQU4KKyMgdW5kZWYgV0lOMzIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX3BhbG1vc19fKSB8fCBkZWZpbmVkKFBBTE1fR0NDKSB8fCBkZWZpbmVkKF9fUEFMTU9TX1RSQVBTX18pCisjIGlmbmRlZiBQQUxNCisjICBkZWZpbmUgUEFMTQorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9faHB1eCkKKyMgaWZuZGVmIEhQX1VYCisjICBkZWZpbmUgSFBfVVgKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2FscGhhKSAmJiAhZGVmaW5lZChfX1ZNUykKKyMgaWZuZGVmIFRSVTY0CisjICBkZWZpbmUgVFJVNjQgCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fTVZTX18KKyMgaWZuZGVmIE9TMzkwCisjICBkZWZpbmUgT1MzOTAKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlICJjb25maWcuaCIKKyMgaWZkZWYgV0lUSF9PUEVOU1NMCisjICBpZm5kZWYgSEFWRV9PUEVOU1NMX1NTTF9ICisjICAgdW5kZWYgV0lUSF9PUEVOU1NMCisjICBlbmRpZgorIyBlbmRpZgorI2Vsc2UKKyMgaWYgZGVmaW5lZChVTkRFUl9DRSkKKyMgIGRlZmluZSBXSVRIX0xFQU4KKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyBlbGlmIGRlZmluZWQoV0lOMzIpCisjICBkZWZpbmUgSEFWRV9TVFJSQ0hSCisjICBkZWZpbmUgSEFWRV9TVFJUT0QKKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyAgZGVmaW5lIEhBVkVfU1RSVE9MCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMCisjICBkZWZpbmUgSEFWRV9TWVNfVElNRUJfSAorIyAgZGVmaW5lIEhBVkVfRlRJTUUKKyMgIGRlZmluZSBIQVZFX1dDVE9NQgorIyAgZGVmaW5lIEhBVkVfTUJUT1dDCisjICBkZWZpbmUgU09BUF9MT05HX0ZPUk1BVCAiJUk2NGQiCisjICBkZWZpbmUgU09BUF9VTE9OR19GT1JNQVQgIiVJNjR1IgorIyBlbGlmIGRlZmluZWQoQ1lHV0lOKQorIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfU1lTX1RJTUVCX0gKKyMgIGRlZmluZSBIQVZFX0ZUSU1FCisjICBkZWZpbmUgSEFWRV9SQU5EX1IKKyMgIGRlZmluZSBIQVZFX0dNVElNRV9SCisjICBkZWZpbmUgSEFWRV9MT0NBTFRJTUVfUgorIyAgZGVmaW5lIEhBVkVfV0NUT01CCisjICBkZWZpbmUgSEFWRV9NQlRPV0MKKyMgZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykKKyMgIGRlZmluZSBIQVZFX1NUUlJDSFIKKyMgIGRlZmluZSBIQVZFX1NUUlRPRAorIyAgZGVmaW5lIEhBVkVfU1NDQU5GCisjICBkZWZpbmUgSEFWRV9TVFJUT0wKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUwKKyMgIGRlZmluZSBIQVZFX1JBTkRfUgorIyAgZGVmaW5lIEhBVkVfR01USU1FX1IKKyMgIGRlZmluZSBIQVZFX0xPQ0FMVElNRV9SCisjICBkZWZpbmUgSEFWRV9USU1FR00KKyMgIGRlZmluZSBIQVZFX1dDVE9NQgorIyAgZGVmaW5lIEhBVkVfTUJUT1dDCisjIGVsaWYgZGVmaW5lZChfQUlYVkVSU0lPTl80MzEpCisjICBkZWZpbmUgSEFWRV9TVFJSQ0hSCisjICBkZWZpbmUgSEFWRV9TVFJUT0QKKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyAgZGVmaW5lIEhBVkVfU1RSVE9MCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMCisjICBkZWZpbmUgSEFWRV9TWVNfVElNRUJfSAorIyAgZGVmaW5lIEhBVkVfRlRJTUUKKyMgIGRlZmluZSBIQVZFX1JBTkRfUgorIyAgZGVmaW5lIEhBVkVfR01USU1FX1IKKyMgIGRlZmluZSBIQVZFX0xPQ0FMVElNRV9SCisjICBkZWZpbmUgSEFWRV9XQ1RPTUIKKyMgIGRlZmluZSBIQVZFX01CVE9XQworIyBlbGlmIGRlZmluZWQoSFBfVVgpCisjICBkZWZpbmUgSEFWRV9TVFJSQ0hSCisjICBkZWZpbmUgSEFWRV9TVFJUT0QKKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyAgZGVmaW5lIEhBVkVfU1RSVE9MCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMCisjICBkZWZpbmUgSEFWRV9TWVNfVElNRUJfSAorIyAgZGVmaW5lIEhBVkVfRlRJTUUKKyMgIGRlZmluZSBIQVZFX1JBTkRfUgorIyAgZGVmaW5lIEhBVkVfR01USU1FX1IKKyMgIGRlZmluZSBIQVZFX0xPQ0FMVElNRV9SCisjICBkZWZpbmUgSEFWRV9XQ1RPTUIKKyMgIGRlZmluZSBIQVZFX01CVE9XQworIyBlbGlmIGRlZmluZWQoRlJFRUJTRCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKKyMgIGRlZmluZSBIQVZFX1NUUlJDSFIKKyMgIGRlZmluZSBIQVZFX1NUUlRPRAorIyAgZGVmaW5lIEhBVkVfU1NDQU5GCisjICBkZWZpbmUgSEFWRV9TVFJUT0wKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUwKKyMgIGRlZmluZSBIQVZFX1NUUlRPTEwKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUxMCisjICBkZWZpbmUgSEFWRV9HRVRUSU1FT0ZEQVkKKyMgIGRlZmluZSBIQVZFX1JBTkRfUgorIyAgZGVmaW5lIEhBVkVfR01USU1FX1IKKyMgIGRlZmluZSBIQVZFX0xPQ0FMVElNRV9SCisjICBkZWZpbmUgSEFWRV9XQ1RPTUIKKyMgIGRlZmluZSBIQVZFX01CVE9XQworIyAgZGVmaW5lIFNPQVBfTE9OR19GT1JNQVQgIiVxZCIKKyMgIGRlZmluZSBTT0FQX1VMT05HX0ZPUk1BVCAiJXF1IgorIyBlbGlmIGRlZmluZWQoX19WTVMpCisjICBkZWZpbmUgSEFWRV9TVFJSQ0hSCisjICBkZWZpbmUgSEFWRV9TVFJUT0QKKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyAgZGVmaW5lIEhBVkVfU1RSVE9MCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMCisjICBkZWZpbmUgSEFWRV9TWVNfVElNRUJfSAorIyAgZGVmaW5lIEhBVkVfRlRJTUUKKyMgIGRlZmluZSBIQVZFX1JBTkRfUgorIyAgZGVmaW5lIEhBVkVfR01USU1FX1IKKyMgIGRlZmluZSBIQVZFX0xPQ0FMVElNRV9SCisjICBkZWZpbmUgSEFWRV9XQ1RPTUIKKyMgIGRlZmluZSBIQVZFX01CVE9XQworIyBlbGlmIGRlZmluZWQoX19HTElCQ19fKSB8fCBkZWZpbmVkKF9fR05VX18pCisjICBkZWZpbmUgSEFWRV9TVFJSQ0hSCisjICBkZWZpbmUgSEFWRV9TVFJUT0QKKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyAgZGVmaW5lIEhBVkVfU1RSVE9MCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMCisjICBkZWZpbmUgSEFWRV9TVFJUT0xMCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMTAorIyAgZGVmaW5lIEhBVkVfU1lTX1RJTUVCX0gKKyMgIGRlZmluZSBIQVZFX0ZUSU1FCisjICBkZWZpbmUgSEFWRV9SQU5EX1IKKyMgIGRlZmluZSBIQVZFX0dNVElNRV9SCisjICBkZWZpbmUgSEFWRV9MT0NBTFRJTUVfUgorIyAgZGVmaW5lIEhBVkVfVElNRUdNCisjICBkZWZpbmUgSEFWRV9XQ1RPTUIKKyMgIGRlZmluZSBIQVZFX01CVE9XQworIyAgZGVmaW5lIEhBVkVfSVNOQU4KKyMgZWxpZiBkZWZpbmVkKFRSVTY0KQorIyAgZGVmaW5lIEhBVkVfU1RSUkNIUgorIyAgZGVmaW5lIEhBVkVfU1RSVE9ECisjICBkZWZpbmUgSEFWRV9TU0NBTkYKKyMgIGRlZmluZSBIQVZFX1NUUlRPTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9MTAorIyAgZGVmaW5lIEhBVkVfU1RSVE9VTEwKKyMgIGRlZmluZSBIQVZFX0dFVFRJTUVPRkRBWQorIyAgZGVmaW5lIEhBVkVfU1lTX1RJTUVCX0gKKyMgIGRlZmluZSBIQVZFX1JBTkRfUgorIyAgZGVmaW5lIEhBVkVfR01USU1FX1IKKyMgIGRlZmluZSBIQVZFX0xPQ0FMVElNRV9SCisjICBkZWZpbmUgX19VU0VfU1REX0lPU1RSRUFNCisjICBkZWZpbmUgSEFWRV9XQ1RPTUIKKyMgIGRlZmluZSBIQVZFX01CVE9XQworIyAgZGVmaW5lIFNPQVBfTE9OR19GT1JNQVQgIiVsZCIKKyMgIGRlZmluZSBTT0FQX1VMT05HX0ZPUk1BVCAiJWx1IgorIyBlbGlmIGRlZmluZWQoTUFDX0NBUkJPTikKKyMgIGRlZmluZSBXSVRIX05PSU8KKyMgIGRlZmluZSBIQVZFX1NUUlJDSFIKKyMgIGRlZmluZSBIQVZFX1NUUlRPRAorIyAgZGVmaW5lIEhBVkVfU1NDQU5GCisjICBkZWZpbmUgSEFWRV9TVFJUT0wKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUwKKyMgIGRlZmluZSBIQVZFX0ZUSU1FCisjICBkZWZpbmUgSEFWRV9SQU5EX1IKKyMgIGRlZmluZSBIQVZFX0dFVEhPU1RCWU5BTUVfUgorIyAgZGVmaW5lIEhBVkVfR01USU1FX1IKKyMgIGRlZmluZSBIQVZFX0xPQ0FMVElNRV9SCisjICBkZWZpbmUgSEFWRV9XQ1RPTUIKKyMgIGRlZmluZSBIQVZFX01CVE9XQworIyBlbGlmIGRlZmluZWQoUEFMTSkKKyMgIGRlZmluZSBXSVRIX0xFQU4KKyMgIGRlZmluZSBIQVZFX1NUUlRPRCAgIC8qIHN0cnRvZCgpIGlzIGRlZmluZWQgaW4gcGFsbUZ1bmN0aW9ucy5oICovCisjICBpbmNsdWRlIDxzdGRsaWIuaD4JLyogTmVlZHMgdG8gYmUgaW5jbHVkZWQgYmVmb3JlIHVuaXggaGVhZGVycyAqLworIyAgaW5jbHVkZSA8c3lzX3R5cGVzLmg+CisjICBkZWZpbmUgSUdOT1JFX1NURElPX1NUVUJTCisjICBpbmNsdWRlIDxTdGRJT1BhbG0uaD4KKyMgIGRlZmluZSBPX05PTkJMT0NLIEZOT05CSU8KKyMgIGluY2x1ZGUgPHN5c19zb2NrZXQuaD4KKyMgIGluY2x1ZGUgInBhbG1GdW5jdGlvbnMuaCIKKyMgZWxpZiBkZWZpbmVkKFNZTUJJQU4pCisjICBkZWZpbmUgV0lUSF9MRUFOCisjICBkZWZpbmUgV0lUSF9OT05BTUVTUEFDRVMKKyMgIGRlZmluZSBIQVZFX1NUUlRPRAkvKiB1c2UgU1RSVE9EIHNpbmNlIHNzY2FuZiBkb2Vzbid0IHNlZW0gdG8gd29yayAqLworIyAgaW5jbHVkZSA8ZTMyZGVmLmg+CisjICBpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyMgZWxpZiBkZWZpbmVkKFZYV09SS1MpCisjICBkZWZpbmUgSEFWRV9TVFJSQ0hSCisjICBkZWZpbmUgSEFWRV9TVFJUT0QKKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyAgZGVmaW5lIEhBVkVfU1RSVE9MCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMCisjICBkZWZpbmUgSEFWRV9QR01USU1FX1IKKyMgIGRlZmluZSBIQVZFX1BMT0NBTFRJTUVfUgorIyAgZGVmaW5lIEhBVkVfTUtUSU1FCisjIGVsaWYgZGVmaW5lZChPUzM5MCkKKyMgIGRlZmluZSBIQVZFX1NUUlJDSFIKKyMgIGRlZmluZSBIQVZFX1NUUlRPRAorIyAgZGVmaW5lIEhBVkVfU1NDQU5GCisjICBkZWZpbmUgSEFWRV9TVFJUT0wKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUwKKyMgIGRlZmluZSBIQVZFX1NZU19USU1FQl9ICisjICBkZWZpbmUgSEFWRV9GVElNRQorIyAgZGVmaW5lIEhBVkVfUkFORF9SCisjICBkZWZpbmUgSEFWRV9HTVRJTUVfUgorIyAgZGVmaW5lIEhBVkVfTE9DQUxUSU1FX1IKKyMgIGRlZmluZSBIQVZFX1dDVE9NQgorIyAgZGVmaW5lIEhBVkVfTUJUT1dDCisjIGVsaWYgZGVmaW5lZChBUzQwMCkKKyMgIGRlZmluZSBIQVZFX1NUUlJDSFIKKyMgIGRlZmluZSBIQVZFX1NUUlRPRAorIyAgZGVmaW5lIEhBVkVfU1NDQU5GCisjICBkZWZpbmUgSEFWRV9TVFJUT0wKKyMgIGRlZmluZSBIQVZFX1NUUlRPVUwKKyMgIGRlZmluZSBIQVZFX1NZU19USU1FQl9ICisjICBkZWZpbmUgSEFWRV9GVElNRQorIyAgZGVmaW5lIEhBVkVfUkFORF9SCisjICBkZWZpbmUgSEFWRV9HTVRJTUVfUgorIyAgZGVmaW5lIEhBVkVfTE9DQUxUSU1FX1IKKyMgIGRlZmluZSBIQVZFX1dDVE9NQgorIyAgZGVmaW5lIEhBVkVfTUJUT1dDCisjIGVsc2UKKy8qIERlZmF1bHQgYXN1bXB0aW9ucyBvbiBzdXBwb3J0ZWQgZnVuY3Rpb25zICovCisjICBkZWZpbmUgSEFWRV9TVFJSQ0hSCisjICBkZWZpbmUgSEFWRV9TVFJUT0QKKyMgIGRlZmluZSBIQVZFX1NTQ0FORgorIyAgZGVmaW5lIEhBVkVfU1RSVE9MCisjICBkZWZpbmUgSEFWRV9TVFJUT1VMCisjICBkZWZpbmUgSEFWRV9TWVNfVElNRUJfSAorIyAgZGVmaW5lIEhBVkVfRlRJTUUKKyMgIGRlZmluZSBIQVZFX1JBTkRfUgorIyAgZGVmaW5lIEhBVkVfR0VUSE9TVEJZTkFNRV9SCisjICBkZWZpbmUgSEFWRV9HTVRJTUVfUgorIyAgZGVmaW5lIEhBVkVfTE9DQUxUSU1FX1IKKyMgIGRlZmluZSBIQVZFX1dDVE9NQgorIyAgZGVmaW5lIEhBVkVfTUJUT1dDCisjIGVuZGlmCisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVFBOIChKdW1wZXIpIHNwZWNpZmljIGRlZmluaXRpb25zICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBXZSBkbyBub3QgdXNlIHdpZGUtY2hhcmFjdGVycyBhbmQgdGhlc2UgYXJlIG5vdCBhdmFpbGFibGUgb24gQW5kcm9pZCBOREsKKyNpZmRlZiBIQVZFX1dDVE9NQgorI3VuZGVmIEhBVkVfV0NUT01CCisjZW5kaWYKKyNpZmRlZiBIQVZFX01CVE9XQworI3VuZGVmIEhBVkVfTUJUT1dDCisjZW5kaWYKKy8vIEl0IHVzZXMgd3Jvbmcgc2lnbmF0dXJlIGZvciBhbmRyb2lkLiBEaXNhYmxlIGJlY2F1c2Ugd2UgZG9uJ3QgdXNlIG5ldHdvcmtpbmcgYW55d2F5CisjaWZkZWYgSEFWRV9HRVRIT1NUQllOQU1FX1IKKyN1bmRlZiBIQVZFX0dFVEhPU1RCWU5BTUVfUgorI2VuZGlmCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyogUU5YIGRvZXMgbm90IGhhdmUgYSB3b3JraW5nIHZlcnNpb24gb2Ygc3RydG9mICovCisjaWYgZGVmaW5lZChfX1FOWF9fKSB8fCBkZWZpbmVkKFFOWCkKKyMgdW5kZWYgSEFWRV9TVFJUT0YKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfTE9OR19GT1JNQVQKKyMgZGVmaW5lIFNPQVBfTE9OR19GT1JNQVQgIiVsbGQiCS8qIHByaW50ZiBmb3JtYXQgZm9yIDY0IGJpdCBpbnRzICovCisjZW5kaWYKKworI2lmbmRlZiBTT0FQX1VMT05HX0ZPUk1BVAorIyBkZWZpbmUgU09BUF9VTE9OR19GT1JNQVQgIiVsbHUiCS8qIHByaW50ZiBmb3JtYXQgZm9yIHVuc2lnbmVkIDY0IGJpdCBpbnRzICovCisjZW5kaWYKKworI2lmbmRlZiBXSVRIX05PU1RETElCCisjIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBpZm5kZWYgUEFMTQorIyAgaW5jbHVkZSA8c3RkaW8uaD4KKyMgIGluY2x1ZGUgPHN0cmluZy5oPgorIyBlbmRpZgorIyBpbmNsdWRlIDxjdHlwZS5oPgorIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgIWRlZmluZWQoV0lUSF9MRUFOKQorIyBpbmNsdWRlIDxzdHJpbmc+CisjIGluY2x1ZGUgPGlvc3RyZWFtPgorI2VuZGlmCisKKyNpZmRlZiBXSVRIX05PSFRUUAorIyBpZm5kZWYgV0lUSF9OT0lPCisvLy8vIyAgZGVmaW5lIFdJVEhfTk9JTyAgICAgSkNCK0VTTCBUTyBETyAhISEhOiBhZGRlZCB0aGUgY29tbWVudCB0byBtYWtlIHRoaXMgd29yay4gVGhpcyBpcyB2ZXJ5IHN0cmFuZ2UgdGhvdWdoISEKKyMgIHVuZGVmIFdJVEhfQ09PS0lFUworIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgVU5ERVJfQ0UKKyMgaWZuZGVmIFBBTE0KKyMgIGlmbmRlZiBXSVRIX05PSU8KKyMgICBpbmNsdWRlIDxlcnJuby5oPgorIyAgIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyAgZW5kaWYKKyMgIGlmbmRlZiBXSVRIX0xFQU4KKyMgICBpZmRlZiBIQVZFX1NZU19USU1FQl9ICisjICAgIGluY2x1ZGUgPHN5cy90aW1lYi5oPgkJLyogZm9yIGZ0aW1lKCkgKi8KKyMgICBlbmRpZgorIyAgIGluY2x1ZGUgPHRpbWUuaD4KKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIE9QRU5TRVJWRVIKKyMgaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorIyBpbmNsdWRlIDxzeXMvc3RyZWFtLmg+CisjIGluY2x1ZGUgPHN5cy9wcm90b3N3Lmg+CisgIGV4dGVybiBpbnQgaF9lcnJubzsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9JTworIyBpZm5kZWYgV0lOMzIKKyMgIGlmbmRlZiBQQUxNCisjICAgaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorIyAgIGlmZGVmIFZYV09SS1MKKyMgICAgaW5jbHVkZSA8c29ja0xpYi5oPgorIyAgICBpbmNsdWRlIDxzZWxlY3RMaWIuaD4KKyMgICBlbmRpZgorIyAgIGlmbmRlZiBWWFdPUktTCisjICAgIGlmbmRlZiBTWU1CSUFOCisjICAgICBpbmNsdWRlIDxzdHJpbmdzLmg+CisjICAgIGVuZGlmCisjICAgZW5kaWYKKyMgICBpZmRlZiBTVU5fT1MKKyMgICAgaW5jbHVkZSA8c3lzL3N0cmVhbS5oPgkJLyogU1VOICovCisjICAgIGluY2x1ZGUgPHN5cy9zb2NrZXR2YXIuaD4JCS8qIFNVTiA8IDIuOCAoPykgKi8KKyMgICBlbmRpZgorIyAgIGlmZGVmIFZYV09SS1MKKyMgICAgaWZkZWYgX1dSU19LRVJORUwKKyMgICAgIGluY2x1ZGUgPHN5cy90aW1lcy5oPgorIyAgICBlbmRpZgorIyAgIGVsc2UKKyMgICAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyMgICBlbmRpZgorIyAgIGluY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyMgICBpZmRlZiBPUzM5MAorIyAgICBpbmNsdWRlIDxuZXRpbmV0L3RjcF92YXIuaD4KKyMgICBlbHNlCisjICAgIGluY2x1ZGUgPG5ldGluZXQvdGNwLmg+ICAgICAgICAgIC8qIFRDUF9OT0RFTEFZICovCisjICAgZW5kaWYKKyMgICBpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIFdJVEhfRkFTVENHSQorIyBpbmNsdWRlIDxmY2dpX3N0ZGlvLmg+CisjZW5kaWYKKworI2lmZGVmIFdJVEhfT1BFTlNTTAorIyBkZWZpbmUgT1BFTlNTTF9OT19LUkI1CisjIGluY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CisjIGluY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjIGluY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorIyBpZm5kZWYgQUxMT1dfT0xEX1ZFUlNJT05TCisjICBpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA8IDB4MDA5MDUxMDBMKQorIyAgIGVycm9yICJNdXN0IHVzZSBPcGVuU1NMIDAuOS42IG9yIGxhdGVyIgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgV0lUSF9HWklQCisjIGlmbmRlZiBXSVRIX1pMSUIKKyMgIGRlZmluZSBXSVRIX1pMSUIKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgV0lUSF9DQVNFSU5TRU5TSVRJVkVUQUdTCisjIGRlZmluZSBTT0FQX1NUUkNNUCBzb2FwX3RhZ19jbXAJLyogY2FzZSBpbnNlbnNpdHZlIFhNTCBlbGVtZW50L2F0dHJpYnV0ZSBuYW1lcyAqLworI2Vsc2UKKyMgZGVmaW5lIFNPQVBfU1RSQ01QIHN0cmNtcAkJLyogY2FzZSBzZW5zaXRpdmUgWE1MIGVsZW1lbnQvYXR0cmlidXRlIG5hbWVzICovCisjZW5kaWYKKworI2lmZGVmIFdJVEhfWkxJQgorIyBpbmNsdWRlIDx6bGliLmg+CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX05PU1RETElCCisjIGlmbmRlZiBQQUxNCisjICBpbmNsdWRlIDxtYXRoLmg+CS8qIGZvciBpc25hbigpICovCisjIGVuZGlmCisjZW5kaWYKKworLyogI2RlZmluZSBERUJVRyAqLyAvKiBVbmNvbW1lbnQgdG8gZGVidWcgc2VuZGluZyAoaW4gZmlsZSBTRU5ULmxvZykgcmVjZWl2aW5nIChpbiBmaWxlIFJFQ1YubG9nKSBhbmQgbWVzc2FnZXMgKGluIGZpbGUgVEVTVC5sb2cpICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmZGVmIFdJTjMyCisjIGlmbmRlZiBVTkRFUl9DRQorIyAgaW5jbHVkZSA8aW8uaD4KKyMgIGluY2x1ZGUgPGZjbnRsLmg+CisjIGVuZGlmCisvLyMgaW5jbHVkZSA8d2luc29jay5oPgorIyBpbmNsdWRlIDx3aW5zb2NrMi5oPiAvKiBBbHRlcm5hdGl2ZTogdXNlIHdpbnNvY2syIChub3QgYXZhaWxhYmxlIHdpdGggZVZDKSAqLworIyBpZmRlZiBXSVRIX0lQVjYKKyMgIGluY2x1ZGUgPHdzMnRjcGlwLmg+CisjICBpbmNsdWRlIDx3c3BpYXBpLmg+CisjIGVuZGlmCisjZWxzZQorIyBpZmRlZiBWWFdPUktTCisjICBpbmNsdWRlIDxob3N0TGliLmg+CisjICBpbmNsdWRlIDxpb2N0bC5oPgorIyAgaW5jbHVkZSA8aW9MaWIuaD4KKyMgZW5kaWYKKyMgaWZuZGVmIFdJVEhfTk9JTworIyAgaWZuZGVmIFBBTE0KKyMgICBpbmNsdWRlIDxuZXRkYi5oPgorIyAgIGluY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyMgICBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgICBpbmNsdWRlIDxmY250bC5oPgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBQb3J0YWJpbGl0eTogZGVmaW5lIFNPQVBfU09DS0xFTl9UICovCisjaWZuZGVmIFNPQVBfU09DS0xFTl9UCisjaWYgZGVmaW5lZChfQUlYKQorIyBkZWZpbmUgU09BUF9TT0NLTEVOX1Qgc29ja2xlbl90CisjZWxpZiBkZWZpbmVkKFNPQ0tMRU5fVCkKKyMgZGVmaW5lIFNPQVBfU09DS0xFTl9UIFNPQ0tMRU5fVAorI2VsaWYgZGVmaW5lZChfX3NvY2tsZW5fdF9kZWZpbmVkKSB8fCBkZWZpbmVkKF9TT0NLTEVOX1QpIHx8IGRlZmluZWQoQ1lHV0lOKSB8fCBkZWZpbmVkKEZSRUVCU0QpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19RTlhfXykgfHwgZGVmaW5lZChRTlgpCisjIGRlZmluZSBTT0FQX1NPQ0tMRU5fVCBzb2NrbGVuX3QKKyNlbGlmIGRlZmluZWQoSVJJWCkgfHwgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfX0FQUExFX18pIHx8IGRlZmluZWQoSFBfVVgpIHx8IGRlZmluZWQoU1VOX09TKSB8fCBkZWZpbmVkKE9QRU5TRVJWRVIpIHx8IGRlZmluZWQoVFJVNjQpIHx8IGRlZmluZWQoVlhXT1JLUykKKyMgZGVmaW5lIFNPQVBfU09DS0xFTl9UIGludAorI2Vsc2UKKyMgZGVmaW5lIFNPQVBfU09DS0xFTl9UIHNpemVfdAorI2VuZGlmCisjZW5kaWYgLy8gIVNPQVBfU09DS0xFTl9UCisKKyNpZm5kZWYgU09BUF9TT0NLRVQKKyMgaWZkZWYgV0lOMzIKKyMgIGRlZmluZSBTT0FQX1NPQ0tFVCBTT0NLRVQKKyMgZWxzZQorIyAgZGVmaW5lIFNPQVBfU09DS0VUIGludAorIyAgZGVmaW5lIGNsb3Nlc29ja2V0KG4pIGNsb3NlKG4pCisjIGVuZGlmCisjZW5kaWYKKworI2RlZmluZSBTT0FQX0lOVkFMSURfU09DS0VUICgtMSkKKyNkZWZpbmUgc29hcF92YWxpZF9zb2NrZXQobikgKChuKSAhPSBTT0FQX0lOVkFMSURfU09DS0VUKQorCisjaWYgZGVmaW5lZChTWU1CSUFOKQorIyBkZWZpbmUgTE9ORzY0IGxvbmcKKyMgZGVmaW5lIFVMT05HNjQgdW5zaWduZWQgTE9ORzY0CisjZWxpZiAhZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfX0dMSUJDX18pIHx8IGRlZmluZWQoX19HTlVfXykKKyMgaWZuZGVmIExPTkc2NAorIyAgZGVmaW5lIExPTkc2NCBsb25nIGxvbmcKKyMgIGRlZmluZSBVTE9ORzY0IHVuc2lnbmVkIExPTkc2NAorIyBlbmRpZgorI2VsaWYgZGVmaW5lZChVTkRFUl9DRSkKKyMgZGVmaW5lIExPTkc2NCBfX2ludDY0CisjIGRlZmluZSBVTE9ORzY0IHVuc2lnbmVkIExPTkc2NAorI2VsaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pCisjIGRlZmluZSBMT05HNjQgX19pbnQ2NAorIyBkZWZpbmUgVUxPTkc2NCB1bnNpZ25lZCBMT05HNjQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChXSU4zMikKKyMgZGVmaW5lIHNvYXBfaW50MzIgX19pbnQzMgorI2VsaWYgZGVmaW5lZChTWU1CSUFOKQorIyBkZWZpbmUgc29hcF9pbnQzMiBsb25nCisjZWxpZiBkZWZpbmVkKFBBTE0pCisjIGRlZmluZSBzb2FwX2ludDMyIEludDMyCisjZWxzZQorIyBkZWZpbmUgc29hcF9pbnQzMiBpbnQzMl90CisjZW5kaWYKKworI2lmZGVmIFdJTjMyCisjIGRlZmluZSBTT0FQX0VSQU5HRSBFUkFOR0UKKyMgZGVmaW5lIFNPQVBfRUlOVFIgV1NBRUlOVFIKKyMgZGVmaW5lIFNPQVBfRUFHQUlOIFdTQUVXT1VMREJMT0NLCisjIGRlZmluZSBTT0FQX0VXT1VMREJMT0NLIFdTQUVXT1VMREJMT0NLCisjIGRlZmluZSBTT0FQX0VJTlBST0dSRVNTIFdTQUVJTlBST0dSRVNTCisjZWxzZQorIyBkZWZpbmUgU09BUF9FUkFOR0UgRVJBTkdFCisjIGRlZmluZSBTT0FQX0VJTlRSIEVJTlRSCisjIGRlZmluZSBTT0FQX0VBR0FJTiBFQUdBSU4KKyMgaWZkZWYgU1lNQklBTgorIyAgZGVmaW5lIFNPQVBfRVdPVUxEQkxPQ0sgOTg5OAorIyAgZGVmaW5lIFNPQVBfRUlOUFJPR1JFU1MgOTg5OQorIyBlbHNlCisjICBkZWZpbmUgU09BUF9FV09VTERCTE9DSyBFV09VTERCTE9DSworIyAgZGVmaW5lIFNPQVBfRUlOUFJPR1JFU1MgRUlOUFJPR1JFU1MKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgV0lOMzIKKyMgaWZkZWYgVU5ERVJfQ0UKKyMgIGRlZmluZSBzb2FwX2Vycm5vIEdldExhc3RFcnJvcigpCisjICBkZWZpbmUgc29hcF9zb2NrZXRfZXJybm8gR2V0TGFzdEVycm9yKCkKKyMgIGRlZmluZSBzb2FwX3Jlc2V0X2Vycm5vIFNldExhc3RFcnJvcigwKQorIyBlbHNlCisjICBkZWZpbmUgc29hcF9lcnJubyBHZXRMYXN0RXJyb3IoKQorIyAgZGVmaW5lIHNvYXBfc29ja2V0X2Vycm5vIFdTQUdldExhc3RFcnJvcigpCisjICBkZWZpbmUgc29hcF9yZXNldF9lcnJubyBTZXRMYXN0RXJyb3IoMCkKKyMgZW5kaWYKKyNlbHNlCisjIGlmbmRlZiBXSVRIX05PSU8KKyMgIGRlZmluZSBzb2FwX2Vycm5vIGVycm5vCisjICBkZWZpbmUgc29hcF9zb2NrZXRfZXJybm8gZXJybm8KKyMgIGRlZmluZSBzb2FwX3Jlc2V0X2Vycm5vIChlcnJubyA9IDApCisjIGVsc2UKKyMgIGRlZmluZSBzb2FwX2Vycm5vIDAKKyMgIGRlZmluZSBzb2FwX3NvY2tldF9lcnJubyAwCisjICBkZWZpbmUgc29hcF9yZXNldF9lcnJubworIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgU09BUF9CVUZMRU4KKyMgaWZkZWYgV0lUSF9VRFAKKyMgIGRlZmluZSBTT0FQX0JVRkxFTiAoNjU1MzYpIC8qIG1heCBVRFAgcGFja2V0IHNpemUgKi8KKyMgZWxzZQorIyAgaWZuZGVmIFdJVEhfTEVBTgorIyAgIGRlZmluZSBTT0FQX0JVRkxFTiAoNjU1MzYpIC8qIGJ1ZmZlciBsZW5ndGggZm9yIHNvY2tldCBwYWNrZXRzLCBhbHNvIHVzZWQgYnkgZ2V0aG9zdGJ5bmFtZV9yIHNvIGRvbid0IG1ha2UgdGhpcyB0b28gc21hbGwgKi8KKyMgIGVsc2UKKyMgICBkZWZpbmUgU09BUF9CVUZMRU4gICgyMDQ4KQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBTT0FQX0xBQkxFTgorIyBkZWZpbmUgU09BUF9MQUJMRU4gICAgICg2NCkgLyogaW5pdGlhbCBsb29rLWFzaWRlIGJ1ZmZlciBsZW5ndGggKi8KKyNlbmRpZgorI2lmbmRlZiBTT0FQX1BUUkJMSworIyBkZWZpbmUgU09BUF9QVFJCTEsgICAgICgzMikgLyogYmxvY2sgYWxsb2NhdGlvbiBmb3IgcG9pbnRlciBoYXNoIHRhYmxlIGNoYWlucyAqLworI2VuZGlmCisjaWZuZGVmIFNPQVBfUFRSSEFTSAorIyBpZm5kZWYgV0lUSF9MRUFOCisjICBkZWZpbmUgU09BUF9QVFJIQVNIICgxMDI0KSAvKiBzaXplIG9mIHBvaW50ZXIgYW5hbHlzaXMgaGFzaCB0YWJsZSAobXVzdCBiZSBwb3dlciBvZiAyKSAqLworIyBlbHNlCisjICBkZWZpbmUgU09BUF9QVFJIQVNIICAgKDMyKQorIyBlbmRpZgorI2VuZGlmCisjaWZuZGVmIFNPQVBfSURIQVNICisjIGlmbmRlZiBXSVRIX0xFQU4KKyMgIGRlZmluZSBTT0FQX0lESEFTSCAgKDE5OTkpIC8qIHByaW1lIHNpemUgb2YgaGFzaCB0YWJsZSBmb3IgcGFyc2VkIGlkL3JlZiAqLworIyBlbHNlCisjICBkZWZpbmUgU09BUF9JREhBU0ggICAgKDE5KSAvKiAxOSwgMTk5ICovCisjIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgU09BUF9CTEtMRU4KKyMgaWZuZGVmIFdJVEhfTEVBTgorIyAgZGVmaW5lIFNPQVBfQkxLTEVOICAgKDI1NikgLyogc2l6ZSBvZiBibG9ja3MgdG8gY29sbGVjdCBsb25nIHN0cmluZ3MgYW5kIFhNTCBhdHRyaWJ1dGVzICovCisjIGVsc2UKKyMgIGRlZmluZSBTT0FQX0JMS0xFTiAgICAoMzIpCisjIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgU09BUF9UQUdMRU4KKyMgaWZuZGVmIFdJVEhfTEVBTgorIyAgZGVmaW5lIFNPQVBfVEFHTEVOICAoMTAyNCkgLyogbWF4aW11bSBsZW5ndGggb2YgWE1MIGVsZW1lbnQgdGFnL2F0dHJpYnV0ZSBuYW1lIG9yIGhvc3QvcGF0aCBuYW1lICsgMSAqLworIyBlbHNlCisjICBkZWZpbmUgU09BUF9UQUdMRU4gICAgKDY0KQorIyBlbmRpZgorI2VuZGlmCisjaWZuZGVmIFNPQVBfSERSTEVOCisjIGlmbmRlZiBXSVRIX0xFQU4KKyMgIGRlZmluZSBTT0FQX0hEUkxFTiAgKDgxOTIpIC8qIG1heGltdW0gbGVuZ3RoIG9mIEhUVFAgaGVhZGVyIGxpbmUgKG11c3QgYmUgPjQwOTYgdG8gcmVhZCBjb29raWVzKSAqLworIyBlbHNlCisjICBkZWZpbmUgU09BUF9IRFJMRU4gICgxMDI0KQorIyBlbmRpZgorI2VuZGlmCisjaWZuZGVmIFNPQVBfTUFYRElNUworIyBpZm5kZWYgV0lUSF9MRUFOCisjICBkZWZpbmUgU09BUF9NQVhESU1TCSAoMTYpIC8qIG1heGltdW0gYXJyYXkgZGltZW5zaW9ucyAoYXJyYXkgbmVzdGluZ3MpIG11c3QgYmUgbGVzcyB0aGFuIDY0IHRvIHByb3RlY3Qgc29hcC0+dG1wYnVmICovCisjIGVsc2UKKyMgIGRlZmluZSBTT0FQX01BWERJTVMJICAoNCkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfTUFYTE9HUworIyBkZWZpbmUgU09BUF9NQVhMT0dTCSAgKDMpIC8qIG1heCBudW1iZXIgb2YgZGVidWcgbG9ncyBwZXIgc3RydWN0IHNvYXAgZW52aXJvbm1lbnQgKi8KKyMgZGVmaW5lIFNPQVBfSU5ERVhfUkVDViAgKDApCisjIGRlZmluZSBTT0FQX0lOREVYX1NFTlQgICgxKQorIyBkZWZpbmUgU09BUF9JTkRFWF9URVNUICAoMikKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfTUFYS0VFUEFMSVZFCisjIGRlZmluZSBTT0FQX01BWEtFRVBBTElWRSAoMTAwKSAvKiBtYXggaXRlcmF0aW9ucyB0byBrZWVwIHNlcnZlciBjb25uZWN0aW9uIGFsaXZlICovCisjZW5kaWYKKworI2lmbmRlZiBTT0FQX01BWEFSUkFZU0laRQorIyBkZWZpbmUgU09BUF9NQVhBUlJBWVNJWkUgKDEwMDAwMCkgLyogInRydXN0ZWQiIG1heCBzaXplIG9mIGluYm91bmQgU09BUCBhcnJheSBmb3IgY29tcG91bmQgYXJyYXkgYWxsb2NhdGlvbiAqLworI2VuZGlmCisKKyNpZmRlZiBWWFdPUktTCisjIGlmZGVmIF9fSU5DbWF0aGggCisjICBpbmNsdWRlIDxwcml2YXRlL21hdGhQLmg+CisjICBpZm5kZWYgSEFWRV9JU05BTgorIyAgIGRlZmluZSBIQVZFX0lTTkFOCisjICBlbmRpZgorIyAgZGVmaW5lIHNvYXBfaXNuYW4obnVtKSBpc05hbihudW0pCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIFdJTjMyIAorIyBpbmNsdWRlIDxmbG9hdC5oPgorIyBpZm5kZWYgSEFWRV9JU05BTgorIyAgZGVmaW5lIEhBVkVfSVNOQU4KKyMgZW5kaWYKKyMgZGVmaW5lIHNvYXBfaXNuYW4obnVtKSBfaXNuYW4obnVtKQorI2VuZGlmCisKKyNpZmRlZiBTVU5fT1MKKyMgZGVmaW5lIHNvYXBfaXNuYW4obikgaXNuYW4obikKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoSEFWRV9JU05BTikgJiYgKGRlZmluZWQoX01BVEhfSCkgfHwgZGVmaW5lZChfTUFUSF9JTkNMVURFRCkpCisjIGRlZmluZSBIQVZFX0lTTkFOCisjZW5kaWYKKworI2lmbmRlZiBzb2FwX2lzbmFuCisjIGlmZGVmIEhBVkVfSVNOQU4KKyMgIGRlZmluZSBzb2FwX2lzbmFuKG4pIGlzbmFuKG4pCisjIGVsc2UKKyMgIGRlZmluZSBzb2FwX2lzbmFuKF8pICgwKQorIyBlbmRpZgorI2VuZGlmCisKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc29hcF9kb3VibGVfbmFuIHsgdW5zaWduZWQgaW50IG4xLCBuMjsgfSBzb2FwX2RvdWJsZV9uYW47CisKKyNpZmRlZiBWWFdPUktTCisjIGlmbmRlZiBGTFRfTUFYCisjICBkZWZpbmUgRkxUX01BWCBfQVJDSF9GTFRfTUFYCisjIGVuZGlmCisjIGlmbmRlZiBEQkxfTUFYCisjICBkZWZpbmUgREJMX01BWCBfQVJDSF9EQkxfTUFYCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBGTFRfTkFOCisjIGlmZGVmIEhBVkVfSVNOQU4KKyMgIGRlZmluZSBGTFRfTkFOICgqKGZsb2F0Kikodm9pZCopJnNvYXBfZG91YmxlX25hbikKKyMgZWxzZQorIyAgZGVmaW5lIEZMVF9OQU4gKDAuMCkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEZMVF9QSU5GVFkKKyMgaWYgZGVmaW5lZChGTFRfTUFYKQorIyAgZGVmaW5lIEZMVF9QSU5GVFkgRkxUX01BWAorIyBlbGlmIGRlZmluZWQoSFVHRV9WQUxGKQorIyAgZGVmaW5lIEZMVF9QSU5GVFkgKGZsb2F0KUhVR0VfVkFMRgorIyBlbGlmIGRlZmluZWQoSFVHRV9WQUwpCisjICBkZWZpbmUgRkxUX1BJTkZUWSAoZmxvYXQpSFVHRV9WQUwKKyMgZWxpZiBkZWZpbmVkKEZMT0FUX01BWCkKKyMgIGRlZmluZSBGTFRfUElORlRZIEZMT0FUX01BWAorIyBlbHNlCisjICBkZWZpbmUgRkxUX1BJTkZUWSAoMy40MDI4MjM0N2UrMzhGKQorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRkxUX05JTkZUWQorIyBkZWZpbmUgRkxUX05JTkZUWSAoLUZMVF9QSU5GVFkpCisjZW5kaWYKKworI2lmbmRlZiBEQkxfTkFOCisjIGlmZGVmIEhBVkVfSVNOQU4KKyMgIGRlZmluZSBEQkxfTkFOICgqKGRvdWJsZSopKHZvaWQqKSZzb2FwX2RvdWJsZV9uYW4pCisjIGVsc2UKKyMgIGRlZmluZSBEQkxfTkFOICgwLjApCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBEQkxfUElORlRZCisjIGlmIGRlZmluZWQoREJMX01BWCkKKyMgIGRlZmluZSBEQkxfUElORlRZIERCTF9NQVgKKyMgZWxpZiBkZWZpbmVkKEhVR0VfVkFMRikKKyMgIGRlZmluZSBEQkxfUElORlRZIChkb3VibGUpSFVHRV9WQUxGCisjIGVsaWYgZGVmaW5lZChIVUdFX1ZBTCkKKyMgIGRlZmluZSBEQkxfUElORlRZIChkb3VibGUpSFVHRV9WQUwKKyMgZWxpZiBkZWZpbmVkKERPVUJMRV9NQVgpCisjICBkZWZpbmUgREJMX1BJTkZUWSBET1VCTEVfTUFYCisjIGVsc2UKKyMgIGRlZmluZSBEQkxfUElORlRZICgxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOCkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIERCTF9OSU5GVFkKKyMgZGVmaW5lIERCTF9OSU5GVFkgKC1EQkxfUElORlRZKQorI2VuZGlmCisKKyNkZWZpbmUgc29hcF9pc3BpbmZkKG4pICgobikgPj0gREJMX1BJTkZUWSkKKyNkZWZpbmUgc29hcF9pc3BpbmZmKG4pICgobikgPj0gRkxUX1BJTkZUWSkKKyNkZWZpbmUgc29hcF9pc25pbmZkKG4pICgobikgPD0gREJMX05JTkZUWSkKKyNkZWZpbmUgc29hcF9pc25pbmZmKG4pICgobikgPD0gRkxUX05JTkZUWSkKKworLyogZ1NPQVAgZXJyb3IgY29kZXMgKi8KKworI2RlZmluZSBTT0FQX0VPRgkJCUVPRgorI2RlZmluZSBTT0FQX0VSUgkJCUVPRgorI2RlZmluZSBTT0FQX09LCQkJCTAKKyNkZWZpbmUgU09BUF9DTElfRkFVTFQJCQkxCisjZGVmaW5lIFNPQVBfU1ZSX0ZBVUxUCQkJMgorI2RlZmluZSBTT0FQX1RBR19NSVNNQVRDSAkJMworI2RlZmluZSBTT0FQX1RZUEUJCQk0CisjZGVmaW5lIFNPQVBfU1lOVEFYX0VSUk9SCQk1CisjZGVmaW5lIFNPQVBfTk9fVEFHCQkJNgorI2RlZmluZSBTT0FQX0lPQgkJCTcKKyNkZWZpbmUgU09BUF9NVVNUVU5ERVJTVEFORAkJOAorI2RlZmluZSBTT0FQX05BTUVTUEFDRQkJCTkKKyNkZWZpbmUgU09BUF9VU0VSX0VSUk9SCQkJMTAKKyNkZWZpbmUgU09BUF9GQVRBTF9FUlJPUgkJMTEKKyNkZWZpbmUgU09BUF9GQVVMVAkJCTEyCisjZGVmaW5lIFNPQVBfTk9fTUVUSE9ECQkJMTMKKyNkZWZpbmUgU09BUF9HRVRfTUVUSE9ECQkJMTQKKyNkZWZpbmUgU09BUF9FT00JCQkxNQorI2RlZmluZSBTT0FQX05VTEwJCQkxNgorI2RlZmluZSBTT0FQX0RVUExJQ0FURV9JRAkJMTcKKyNkZWZpbmUgU09BUF9NSVNTSU5HX0lECQkJMTgKKyNkZWZpbmUgU09BUF9IUkVGCQkJMTkKKyNkZWZpbmUgU09BUF9VRFBfRVJST1IJCQkyMAorI2RlZmluZSBTT0FQX1RDUF9FUlJPUgkJCTIxCisjZGVmaW5lIFNPQVBfSFRUUF9FUlJPUgkJCTIyCisjZGVmaW5lIFNPQVBfU1NMX0VSUk9SCQkJMjMKKyNkZWZpbmUgU09BUF9aTElCX0VSUk9SCQkJMjQKKyNkZWZpbmUgU09BUF9ESU1FX0VSUk9SCQkJMjUKKyNkZWZpbmUgU09BUF9ESU1FX0hSRUYJCQkyNgorI2RlZmluZSBTT0FQX0RJTUVfTUlTTUFUQ0gJCTI3CisjZGVmaW5lIFNPQVBfRElNRV9FTkQJCQkyOAorI2RlZmluZSBTT0FQX01JTUVfRVJST1IJCQkyOQorI2RlZmluZSBTT0FQX01JTUVfSFJFRgkJCTMwCisjZGVmaW5lIFNPQVBfTUlNRV9FTkQJCQkzMQorI2RlZmluZSBTT0FQX1ZFUlNJT05NSVNNQVRDSAkJMzIKKyNkZWZpbmUgU09BUF9QTFVHSU5fRVJST1IJCTMzCisjZGVmaW5lIFNPQVBfREFUQUVOQ09ESU5HVU5LTk9XTgkzNAorI2RlZmluZSBTT0FQX1JFUVVJUkVECQkJMzUKKyNkZWZpbmUgU09BUF9QUk9ISUJJVEVECQkJMzYKKyNkZWZpbmUgU09BUF9PQ0NVUlMJCQkzNworI2RlZmluZSBTT0FQX0xFTkdUSAkJCTM4CisKKyNkZWZpbmUgc29hcF94bWxfZXJyb3JfY2hlY2soZSkgKChlKSA9PSBTT0FQX1RBR19NSVNNQVRDSCB8fCAoZSkgPT0gU09BUF9UQUdfRU5EIHx8IChlKSA9PSBTT0FQX1NZTlRBWF9FUlJPUiB8fCAoZSkgPT0gU09BUF9OQU1FU1BBQ0UgfHwgKGUpID09IFNPQVBfRFVQTElDQVRFX0lEIHx8IChlKSA9PSBTT0FQX01JU1NJTkdfSUQgfHwgKGUpID09IFNPQVBfUkVRVUlSRUQgfHwgKGUpID09IFNPQVBfUFJPSElCSVRFRCB8fCAoZSkgPT0gU09BUF9PQ0NVUlMgfHwgKGUpID09IFNPQVBfTEVOR1RIIHx8IChlKSA9PSBTT0FQX05VTEwgfHwgKGUpID09IFNPQVBfSFJFRikKKyNkZWZpbmUgc29hcF9zb2FwX2Vycm9yX2NoZWNrKGUpICgoZSkgPT0gU09BUF9DTElfRkFVTFQgfHwgKGUpID09IFNPQVBfU1ZSX0ZBVUxUIHx8IChlKSA9PSBTT0FQX1ZFUlNJT05NSVNNQVRDSCB8fCAoZSkgPT0gU09BUF9NVVNUVU5ERVJTVEFORCB8fCAoZSkgPT0gU09BUF9GQVVMVCB8fCAoZSkgPT0gU09BUF9OT19NRVRIT0QpCisjZGVmaW5lIHNvYXBfdGNwX2Vycm9yX2NoZWNrKGUpICgoZSkgPT0gU09BUF9FT0YgfHwgKGUpID09IFNPQVBfVENQX0VSUk9SKQorI2RlZmluZSBzb2FwX3NzbF9lcnJvcl9jaGVjayhlKSAoKGUpID09IFNPQVBfU1NMX0VSUk9SKQorI2RlZmluZSBzb2FwX3psaWJfZXJyb3JfY2hlY2soZSkgKChlKSA9PSBTT0FQX1pMSUJfRVJST1IpCisjZGVmaW5lIHNvYXBfaHR0cF9lcnJvcl9jaGVjayhlKSAoKGUpID09IFNPQVBfSFRUUF9FUlJPUiB8fCAoZSkgPT0gU09BUF9HRVRfTUVUSE9EIHx8ICgoZSkgPj0gMTAwICYmIChlKSA8IDYwMCkpCisKKy8qIGdTT0FQIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGVzIDEwMCB0byA1OTkgYXJlIHJlc2VydmVkICovCisKKy8qIENvZGVzIDYwMCB0byA5OTkgYXJlIHVzZXIgZGVmaW5hYmxlICovCisKKy8qIEV4Y2VwdGlvbmFsIGdTT0FQIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGVzID49IDEwMDAgKi8KKworI2RlZmluZSBTT0FQX1NUT1AJCTEwMDAJLyogTm8gSFRUUCByZXNwb25zZSAqLworI2RlZmluZSBTT0FQX0ZPUk0JCTEwMDEJLyogRm9ybSByZXF1ZXN0L3Jlc3BvbnNlICovCisjZGVmaW5lIFNPQVBfSFRNTAkJMTAwMgkvKiBDdXN0b20gSFRNTCByZXNwb25zZSAqLworI2RlZmluZSBTT0FQX0ZJTEUJCTEwMDMJLyogQ3VzdG9tIGZpbGUtYmFzZWQgcmVzcG9uc2UgKi8KKworLyogZ1NPQVAgSFRUUCBtZXRob2QgY29kZXMgKi8KKworI2RlZmluZSBTT0FQX1BPU1QJCTIwMDAKKyNkZWZpbmUgU09BUF9HRVQJCTIwMDEKKworLyogZ1NPQVAgRElNRSAqLworCisjZGVmaW5lIFNPQVBfRElNRV9DRgkJMHgwMQorI2RlZmluZSBTT0FQX0RJTUVfTUUJCTB4MDIKKyNkZWZpbmUgU09BUF9ESU1FX01CCQkweDA0CisjZGVmaW5lIFNPQVBfRElNRV9WRVJTSU9OCTB4MDggLyogRElNRSB2ZXJzaW9uIDEgKi8KKyNkZWZpbmUgU09BUF9ESU1FX01FRElBCQkweDEwCisjZGVmaW5lIFNPQVBfRElNRV9BQlNVUkkJMHgyMAorCisvKiBnU09BUCBaTElCICovCisKKyNkZWZpbmUgU09BUF9aTElCX05PTkUJCTB4MDAKKyNkZWZpbmUgU09BUF9aTElCX0RFRkxBVEUJMHgwMQorI2RlZmluZSBTT0FQX1pMSUJfSU5GTEFURQkweDAyCisjZGVmaW5lIFNPQVBfWkxJQl9HWklQCQkweDAyCisKKy8qIGdTT0FQIHRyYW5zcG9ydCwgY29ubmVjdGlvbiwgYW5kIGNvbnRlbnQgZW5jb2RpbmcgbW9kZXMgKi8KKwordHlwZWRlZiBzb2FwX2ludDMyIHNvYXBfbW9kZTsKKworI2RlZmluZSBTT0FQX0lPCQkJMHgwMDAwMDAwMwkvKiBJTyBtYXNrICovCisjZGVmaW5lIFNPQVBfSU9fRkxVU0gJCTB4MDAwMDAwMDAJLyogZmx1c2ggb3V0cHV0IGltbWVkaWF0ZWx5LCBubyBidWZmZXJpbmcgKi8KKyNkZWZpbmUgU09BUF9JT19CVUZGRVIJCTB4MDAwMDAwMDEJLyogYnVmZmVyIG91dHB1dCBpbiBwYWNrZXRzIG9mIHNpemUgU09BUF9CVUZMRU4gKi8KKyNkZWZpbmUgU09BUF9JT19TVE9SRQkJMHgwMDAwMDAwMgkvKiBzdG9yZSBlbnRpcmUgb3V0cHV0IHRvIGRldGVybWluZSBsZW5ndGggZm9yIHRyYW5zcG9ydCAqLworI2RlZmluZSBTT0FQX0lPX0NIVU5LCQkweDAwMDAwMDAzCS8qIHVzZSBIVFRQIGNodW5rZWQgdHJhbnNmZXIgQU5EIGJ1ZmZlciBwYWNrZXRzICovCisKKyNkZWZpbmUgU09BUF9JT19VRFAJCTB4MDAwMDAwMDQKKyNkZWZpbmUgU09BUF9JT19MRU5HVEgJCTB4MDAwMDAwMDgKKyNkZWZpbmUgU09BUF9JT19LRUVQQUxJVkUJMHgwMDAwMDAxMAorCisjZGVmaW5lIFNPQVBfRU5DX0xBVElOCQkweDAwODAwMDIwCS8qIGlzby04ODU5LTEgZW5jb2RpbmcgKi8KKyNkZWZpbmUgU09BUF9FTkNfWE1MCQkweDAwMDAwMDQwCS8qIHBsYWluIFhNTCBlbmNvZGluZywgbm8gSFRUUCBoZWFkZXIgKi8KKyNkZWZpbmUgU09BUF9FTkNfRElNRQkJMHgwMDAwMDA4MAorI2RlZmluZSBTT0FQX0VOQ19NSU1FCQkweDAwMDAwMTAwCisjZGVmaW5lIFNPQVBfRU5DX01UT00JCTB4MDAwMDAyMDAKKyNkZWZpbmUgU09BUF9FTkNfWkxJQgkJMHgwMDAwMDQwMAorI2RlZmluZSBTT0FQX0VOQ19TU0wJCTB4MDAwMDA4MDAKKworI2RlZmluZSBTT0FQX0VOQwkJMHgwMDAwMEZGRgkvKiBJTyBhbmQgRU5DIG1hc2sgKi8KKworI2RlZmluZSBTT0FQX1hNTF9TVFJJQ1QJCTB4MDAwMDEwMDAJLyogc3RyaWN0IHZhbGlkYXRpb24gKi8KKyNkZWZpbmUgU09BUF9YTUxfSU5ERU5UCQkweDAwMDAyMDAwCisjZGVmaW5lIFNPQVBfWE1MX0NBTk9OSUNBTAkweDAwMDA0MDAwCS8qIEVYQyBDMTROIGNhbm9uaWNhbCBYTUwgKi8KKyNkZWZpbmUgU09BUF9YTUxfVFJFRQkJMHgwMDAwODAwMAorI2RlZmluZSBTT0FQX1hNTF9HUkFQSAkJMHgwMDAxMDAwMAorI2RlZmluZSBTT0FQX1hNTF9OSUwJCTB4MDAwMjAwMDAKKyNkZWZpbmUgU09BUF9YTUxfRE9NCQkweDAwMDQwMDAwCisjZGVmaW5lIFNPQVBfWE1MX1NFQwkJMHgwMDA4MDAwMAkvKiByZXNlcnZlZCBmb3IgV1Mgc2VjdXJpdHkgKi8KKworI2RlZmluZSBTT0FQX0NfTk9JT0IJCTB4MDAxMDAwMDAKKyNkZWZpbmUgU09BUF9DX1VURlNUUklORwkweDAwMjAwMDAwCisjZGVmaW5lIFNPQVBfQ19NQlNUUklORwkJMHgwMDQwMDAwMAorCisjZGVmaW5lIFNPQVBfRE9NX1RSRUUJCTB4MDEwMDAwMDAKKyNkZWZpbmUgU09BUF9ET01fTk9ERQkJMHgwMjAwMDAwMAorI2RlZmluZSBTT0FQX0RPTV9BU0lTCQkweDA0MDAwMDAwCisKKyNkZWZpbmUgU09BUF9JT19ERUZBVUxUCQlTT0FQX0lPX0ZMVVNICisKKy8qIFNTTCBjbGllbnQvc2VydmVyIGF1dGhlbnRpY2F0aW9uIHNldHRpbmdzICovCisKKyNkZWZpbmUgU09BUF9TU0xfTk9fQVVUSEVOVElDQVRJT04JCTB4MDAJLyogZm9yIHRlc3RpbmcgcHVycG9zZXMgKi8KKyNkZWZpbmUgU09BUF9TU0xfUkVRVUlSRV9TRVJWRVJfQVVUSEVOVElDQVRJT04JMHgwMQkvKiBjbGllbnQgcmVxdWlyZXMgc2VydmVyIHRvIGF1dGhlbnRpY2F0ZSAqLworI2RlZmluZSBTT0FQX1NTTF9SRVFVSVJFX0NMSUVOVF9BVVRIRU5USUNBVElPTgkweDAyCS8qIHNlcnZlciByZXF1aXJlcyBjbGllbnQgdG8gYXV0aGVudGljYXRlICovCisKKyNkZWZpbmUgU09BUF9TU0xfREVGQVVMVAkJCVNPQVBfU1NMX1JFUVVJUkVfU0VSVkVSX0FVVEhFTlRJQ0FUSU9OCisKKy8qIHN0YXRlICovCisKKyNkZWZpbmUgU09BUF9JTklUCTEKKyNkZWZpbmUgU09BUF9DT1BZCTIKKworI2RlZmluZSBzb2FwX2NoZWNrX3N0YXRlKHNvYXApICghKHNvYXApIHx8ICgoc29hcCktPnN0YXRlICE9IFNPQVBfSU5JVCAmJiAoc29hcCktPnN0YXRlICE9IFNPQVBfQ09QWSkpCisKKy8qIHBhcnQgKi8KKworI2RlZmluZSBTT0FQX0JFR0lOCQkwCisjZGVmaW5lIFNPQVBfSU5fRU5WRUxPUEUJMgorI2RlZmluZSBTT0FQX0lOX0hFQURFUgkJMworI2RlZmluZSBTT0FQX0VORF9IRUFERVIJCTQKKyNkZWZpbmUgU09BUF9OT19CT0RZCQk1CisjZGVmaW5lIFNPQVBfSU5fQk9EWQkJNgorI2RlZmluZSBTT0FQX0VORF9CT0RZCQk3CisjZGVmaW5lIFNPQVBfRU5EX0VOVkVMT1BFCTgKKyNkZWZpbmUgU09BUF9FTkQJCTkKKyNkZWZpbmUgU09BUF9CRUdJTl9TRUNVUklUWQkxMAorI2RlZmluZSBTT0FQX0lOX1NFQ1VSSVRZCTExCisjZGVmaW5lIFNPQVBfRU5EX1NFQ1VSSVRZCTEyCisKKy8qIERFQlVHIG1hY3JvcyAqLworI2lmZGVmIFNPQVBfREVCVUcKKyMgZGVmaW5lIFNPQVBfTUFMTE9DKHNvYXAsIHNpemUpIHNvYXBfdHJhY2tfbWFsbG9jKHNvYXAsIF9fRklMRV9fLCBfX0xJTkVfXywgc2l6ZSkKKyMgZGVmaW5lIFNPQVBfRlJFRShzb2FwLCBwdHIpIHNvYXBfdHJhY2tfZnJlZShzb2FwLCBfX0ZJTEVfXywgX19MSU5FX18sIHB0cikKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfTUFMTE9DCQkJLyogdXNlIGxpYmMgbWFsbG9jICovCisjIGRlZmluZSBTT0FQX01BTExPQyhzb2FwLCBzaXplKSBtYWxsb2Moc2l6ZSkKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfRlJFRQkJCS8qIHVzZSBsaWJjIGZyZWUgKi8KKyMgZGVmaW5lIFNPQVBfRlJFRShzb2FwLCBwdHIpIGZyZWUocHRyKQorI2VuZGlmCisKKyNpZmRlZiBTT0FQX0RFQlVHCisjIGlmbmRlZiBTT0FQX01FU1NBR0UKKyMgIGRlZmluZSBTT0FQX01FU1NBR0UgZnByaW50ZgorIyBlbmRpZgorIyBpZm5kZWYgREJHTE9HCisjICBkZWZpbmUgREJHTE9HKERCR0ZJTEUsIENNRCkgXAoreyBpZiAoc29hcClcCisgIHsgaWYgKCFzb2FwLT5mZGVidWdbU09BUF9JTkRFWF8jI0RCR0ZJTEVdKVwKKyAgICAgIHNvYXBfb3Blbl9sb2dmaWxlKChzdHJ1Y3Qgc29hcCopc29hcCwgU09BUF9JTkRFWF8jI0RCR0ZJTEUpO1wKKyAgICBpZiAoc29hcC0+ZmRlYnVnW1NPQVBfSU5ERVhfIyNEQkdGSUxFXSlcCisgICAgeyBGSUxFICpmZGVidWcgPSBzb2FwLT5mZGVidWdbU09BUF9JTkRFWF8jI0RCR0ZJTEVdO1wKKyAgICAgIENNRDtcCisgICAgICBmZmx1c2goZmRlYnVnKTtcCisgICAgfVwKKyAgfVwKK30KKyMgZW5kaWYKKyMgaWZuZGVmIERCR01TRworIyAgZGVmaW5lIERCR01TRyhEQkdGSUxFLCBNU0csIExFTikgXAoreyBpZiAoc29hcClcCisgIHsgaWYgKCFzb2FwLT5mZGVidWdbU09BUF9JTkRFWF8jI0RCR0ZJTEVdKVwKKyAgICAgIHNvYXBfb3Blbl9sb2dmaWxlKChzdHJ1Y3Qgc29hcCopc29hcCwgU09BUF9JTkRFWF8jI0RCR0ZJTEUpO1wKKyAgICBpZiAoc29hcC0+ZmRlYnVnW1NPQVBfSU5ERVhfIyNEQkdGSUxFXSlcCisgICAgeyBmd3JpdGUoKE1TRyksIDEsIChMRU4pLCBzb2FwLT5mZGVidWdbU09BUF9JTkRFWF8jI0RCR0ZJTEVdKTtcCisgICAgICBmZmx1c2goc29hcC0+ZmRlYnVnW1NPQVBfSU5ERVhfIyNEQkdGSUxFXSk7XAorICAgIH1cCisgIH1cCit9CisjIGVuZGlmCisjIGlmbmRlZiBER0JGVU4KKyMgIGRlZmluZSBEQkdGVU4oRk5BTUUpIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiJXMoJWQpOiAlcygpXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIEZOQU1FKSkKKyMgIGRlZmluZSBEQkdGVU4xKEZOQU1FLCBGTVQsIEFSRykgREJHTE9HKFRFU1QsIFNPQVBfTUVTU0FHRShmZGVidWcsICIlcyglZCk6ICVzKCJGTVQiKVxuIiwgX19GSUxFX18sIF9fTElORV9fLCBGTkFNRSwgKEFSRykpKQorIyAgZGVmaW5lIERCR0ZVTjIoRk5BTUUsIEZNVDEsIEFSRzEsIEZNVDIsIEFSRzIpIERCR0xPRyhURVNULCBTT0FQX01FU1NBR0UoZmRlYnVnLCAiJXMoJWQpOiAlcygiRk1UMSIsICJGTVQyIilcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgRk5BTUUsIChBUkcxKSwgKEFSRzIpKSkKKyMgIGRlZmluZSBEQkdGVU4zKEZOQU1FLCBGTVQxLCBBUkcxLCBGTVQyLCBBUkcyLCBGTVQzLCBBUkczKSBEQkdMT0coVEVTVCwgU09BUF9NRVNTQUdFKGZkZWJ1ZywgIiVzKCVkKTogJXMoIkZNVDEiLCAiRk1UMiIsICJGTVQzIilcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgRk5BTUUsIChBUkcxKSwgKEFSRzIpLCAoQVJHMykpKQorIyBlbmRpZgorIyBpZm5kZWYgREJHSEVYCisjICBkZWZpbmUgREJHSEVYKERCR0ZJTEUsIE1TRywgTEVOKSBcCit7IGlmIChzb2FwKVwKKyAgeyBpZiAoIXNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYXyMjREJHRklMRV0pXAorICAgICAgc29hcF9vcGVuX2xvZ2ZpbGUoc29hcCwgU09BUF9JTkRFWF8jI0RCR0ZJTEUpO1wKKyAgICBpZiAoc29hcC0+ZmRlYnVnW1NPQVBfSU5ERVhfIyNEQkdGSUxFXSlcCisgICAgeyBpbnQgaTsgY2hhciAqcztcCisgICAgICBmb3IgKHMgPSAoY2hhciopKE1TRyksIGkgPSAoTEVOKTsgaTsgaS0tKVwKKyAgICAgICAgZnByaW50Zihzb2FwLT5mZGVidWdbU09BUF9JTkRFWF8jI0RCR0ZJTEVdLCAiJTIuMmhoWCAgIiwgKnMrKyk7XAorICAgICAgZmZsdXNoKHNvYXAtPmZkZWJ1Z1tTT0FQX0lOREVYXyMjREJHRklMRV0pO1wKKyAgICB9XAorICB9XAorfQorIyBlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIERCR0xPRyhEQkdGSUxFLCBDTUQpCisjIGRlZmluZSBEQkdNU0coREJHRklMRSwgTVNHLCBMRU4pCisjIGRlZmluZSBEQkdGVU4oRk5BTUUpCisjIGRlZmluZSBEQkdGVU4xKEZOQU1FLCBGTVQsIEFSRykKKyMgZGVmaW5lIERCR0ZVTjIoRk5BTUUsIEZNVDEsIEFSRzEsIEZNVDIsIEFSRzIpCisjIGRlZmluZSBEQkdGVU4zKEZOQU1FLCBGTVQxLCBBUkcxLCBGTVQyLCBBUkcyLCBGTVQzLCBBUkczKQorIyBkZWZpbmUgREJHSEVYKERCR0ZJTEUsIE1TRywgTEVOKQorI2VuZGlmCisKKy8qIFVDUy00IHJlcXVpcmVzIDMyIGJpdHMgKDAtN0ZGRkZGRkYsIHRoZSBzaWduIGJpdCBpcyB1c2VkIGJ5IGdTT0FQIHRvIGRpc3Rpbmd1aXNoIFhNTCBlbnRpdGllcykgKi8KK3R5cGVkZWYgc29hcF9pbnQzMiBzb2FwX3djaGFyOworCisvKiBuYW1lc3BhY2UgdGFibGUgcm93ICovCitzdHJ1Y3QgTmFtZXNwYWNlCit7IGNvbnN0IGNoYXIgKmlkOworICBjb25zdCBjaGFyICpuczsKKyAgY29uc3QgY2hhciAqaW47CisgIGNoYXIgKm91dDsKK307CisKKy8qIG5hbWVzcGFjZSBzdGFjayAqLworc3RydWN0IHNvYXBfbmxpc3QKK3sgc3RydWN0IHNvYXBfbmxpc3QgKm5leHQ7CisgIHVuc2lnbmVkIGludCBsZXZlbDsgLyogbmVzdGluZyBkZXB0aCBsZXZlbCAqLworICBzaG9ydCBpbmRleDsgLyogY29ycmVzcG9uZGluZyBlbnRyeSBpbiBucyBtYXBwaW5nIHRhYmxlICovCisgIGNoYXIgKm5zOyAvKiBvbmx5IHNldCB3aGVuIHBhcnNlZCBucyBVUkkgaXMgbm90IGluIHRoZSBucyBtYXBwaW5nIHRhYmxlICovCisgIGNoYXIgaWRbMV07IC8qIHRoZSBhY3R1YWwgc3RyaW5nIHZhbHVlIGZsb3dzIGludG8gdGhlIGFsbG9jYXRlZCByZWdpb24gYmVsb3cgdGhpcyBzdHJ1Y3QgKi8KK307CisKKy8qIGJsb2NrIHN0YWNrIGZvciBuZXN0ZWQgYmxvY2sgYWxsb2NhdGlvbnMgKi8KK3N0cnVjdCBzb2FwX2JsaXN0Cit7IHN0cnVjdCBzb2FwX2JsaXN0ICpuZXh0OworICBjaGFyICpwdHI7CisgIHNpemVfdCBzaXplOworfTsKKworLyogYXJyYXkgbGF5b3V0ICovCitzdHJ1Y3Qgc29hcF9hcnJheQoreyB2b2lkICpfX3B0cjsKKyAgaW50IF9fc2l6ZTsKK307CisKKy8qIHBvaW50ZXIgc2VyaWFsaXphdGlvbiBtYW5hZ2VtZW50ICovCitzdHJ1Y3Qgc29hcF9wbGlzdAoreyBzdHJ1Y3Qgc29hcF9wbGlzdCAqbmV4dDsKKyAgY29uc3Qgdm9pZCAqcHRyOworICBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYXJyYXk7CisgIGludCB0eXBlOworICBpbnQgaWQ7CisgIGNoYXIgbWFyazE7CisgIGNoYXIgbWFyazI7Cit9OworCisvKiBibG9jayBhbGxvY2F0aW9uIGZvciBwb2ludGVyIHNlcmlhbGl6YXRpb24gbWFuYWdlbWVudCAqLworc3RydWN0IHNvYXBfcGJsaworeyBzdHJ1Y3Qgc29hcF9wYmxrICpuZXh0OworICBzdHJ1Y3Qgc29hcF9wbGlzdCBwbGlzdFtTT0FQX1BUUkJMS107Cit9OworCisjaWZkZWYgU09BUF9ERUJVRworLyogbWFsbG9jL2ZyZWUgdHJhY2tpbmcgZm9yIGRlYnVnZ2luZyAqLworc3RydWN0IHNvYXBfbWxpc3QKK3sgc3RydWN0IHNvYXBfbWxpc3QgKm5leHQ7CisgIGNvbnN0IHZvaWQgKnB0cjsKKyAgY29uc3QgY2hhciAqZmlsZTsKKyAgaW50IGxpbmU7CisgIHNob3J0IGxpdmU7Cit9OworI2VuZGlmCisKKy8qIGNsYXNzIGFsbG9jYXRpb24gbGlzdCAqLworc3RydWN0IHNvYXBfY2xpc3QKK3sgc3RydWN0IHNvYXBfY2xpc3QgKm5leHQ7CisgIHZvaWQgKnB0cjsKKyAgaW50IHR5cGU7CisgIGludCBzaXplOworICB2b2lkICgqZmRlbGV0ZSkoc3RydWN0IHNvYXBfY2xpc3QqKTsKK307CisKKy8qIGF0dHJpYnV0ZXMgKi8KK3N0cnVjdCBzb2FwX2F0dHJpYnV0ZQoreyBzdHJ1Y3Qgc29hcF9hdHRyaWJ1dGUgKm5leHQ7CisgIGNoYXIgKnZhbHVlOworICBzaXplX3Qgc2l6ZTsKKyAgY2hhciAqbnM7CisgIHNob3J0IHZpc2libGU7CisgIGNoYXIgbmFtZVsxXTsgLyogdGhlIGFjdHVhbCBuYW1lIHN0cmluZyBmbG93cyBpbnRvIHRoZSBhbGxvY2F0ZWQgcmVnaW9uIGJlbG93IHRoaXMgc3RydWN0ICovCit9OworCitzdHJ1Y3Qgc29hcF9jb29raWUKK3sgc3RydWN0IHNvYXBfY29va2llICpuZXh0OworICBjaGFyICpuYW1lOworICBjaGFyICp2YWx1ZTsKKyAgY2hhciAqZG9tYWluOworICBjaGFyICpwYXRoOworICBsb25nIGV4cGlyZTsJCS8qIGNsaWVudC1zaWRlOiBsb2NhbCB0aW1lIHRvIGV4cGlyZTsgc2VydmVyLXNpZGU6IHNlY29uZHMgdG8gZXhwaXJlICovCisgIHVuc2lnbmVkIGludCB2ZXJzaW9uOworICBzaG9ydCBzZWN1cmU7CisgIHNob3J0IHNlc3Npb247CS8qIHNlcnZlci1zaWRlICovCisgIHNob3J0IGVudjsJCS8qIHNlcnZlci1zaWRlOiBnb3QgY29va2llIGZyb20gY2xpZW50IGFuZCBzaG91bGQgbm90IGJlIChyZSlzZW5kICovCisgIHNob3J0IG1vZGlmaWVkOwkvKiBzZXJ2ZXItc2lkZTogY2xpZW50IGNvb2tpZSB3YXMgbW9kaWZpZWQgYW5kIHNob3VsZCBiZSBzZW5kICovCit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK1NPQVBfRk1BQzEgc3RydWN0IHNvYXBfbXVsdGlwYXJ0KiBTT0FQX0ZNQUMyIHNvYXBfbmV4dF9tdWx0aXBhcnQoc3RydWN0IHNvYXBfbXVsdGlwYXJ0Kik7CisKK2NsYXNzIHNvYXBfbXVsdGlwYXJ0X2l0ZXJhdG9yCit7IHB1YmxpYzoKKyAgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpjb250ZW50OworICBib29sIG9wZXJhdG9yPT0oY29uc3Qgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3ImIGl0ZXIpIGNvbnN0CisgICAgeyByZXR1cm4gY29udGVudCA9PSBpdGVyLmNvbnRlbnQ7IH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHNvYXBfbXVsdGlwYXJ0X2l0ZXJhdG9yJiBpdGVyKSBjb25zdAorICAgIHsgcmV0dXJuIGNvbnRlbnQgIT0gaXRlci5jb250ZW50OyB9CisgIHN0cnVjdCBzb2FwX211bHRpcGFydCAmb3BlcmF0b3IqKCkgY29uc3QKKyAgICB7IHJldHVybiAqY29udGVudDsgfQorICBzb2FwX211bHRpcGFydF9pdGVyYXRvciAmb3BlcmF0b3IrKygpCisgICAgeyBjb250ZW50ID0gc29hcF9uZXh0X211bHRpcGFydChjb250ZW50KTsgcmV0dXJuICp0aGlzOyB9CisgIHNvYXBfbXVsdGlwYXJ0X2l0ZXJhdG9yKCkgOiBjb250ZW50KE5VTEwpCisgICAgeyB9CisgIHNvYXBfbXVsdGlwYXJ0X2l0ZXJhdG9yKHN0cnVjdCBzb2FwX211bHRpcGFydCAqcCkgOiBjb250ZW50KHApCisgICAgeyB9Cit9OworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK3N0cnVjdCBzb2FwX2RpbWUKK3sgc2l6ZV90IGNvdW50OworICBzaXplX3Qgc2l6ZTsKKyAgc2l6ZV90IGNodW5rc2l6ZTsKKyAgc2l6ZV90IGJ1ZmxlbjsKKyAgY2hhciBmbGFnczsKKyAgY2hhciAqcHRyOworICBjb25zdCBjaGFyICppZDsKKyAgY29uc3QgY2hhciAqdHlwZTsKKyAgY29uc3QgY2hhciAqb3B0aW9uczsKKyAgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpsaXN0OwkJLyogbGlzdCBvZiBESU1FIGF0dGFjaG1lbnRzIHJlY2VpdmVkICovCisgIHN0cnVjdCBzb2FwX211bHRpcGFydCAqZmlyc3QsICpsYXN0OwkvKiB0ZW1wb3JhcnkgaW4vb3V0IHF1ZXVlICovCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3IgYmVnaW4oKQorICAgIHsgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3IgaXRlcihsaXN0KTsgcmV0dXJuIGl0ZXI7IH07CisgIHNvYXBfbXVsdGlwYXJ0X2l0ZXJhdG9yIGVuZCgpCisgICAgeyBzb2FwX211bHRpcGFydF9pdGVyYXRvciBpdGVyKE5VTEwpOyByZXR1cm4gaXRlcjsgfTsKKyNlbmRpZgorfTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTkVSCitzdHJ1Y3Qgc29hcF9taW1lCit7IGNoYXIgKmJvdW5kYXJ5OwkJCS8qIE1JTUUgYm91bmRhcnkgKi8KKyAgY29uc3QgY2hhciAqc3RhcnQ7CQkJLyogTUlNRSBzdGFydCBJRCAqLworICBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKmxpc3Q7CQkvKiBsaXN0IG9mIE1JTUUgYXR0YWNobWVudHMgcmVjZWl2ZWQgKi8KKyAgc3RydWN0IHNvYXBfbXVsdGlwYXJ0ICpmaXJzdCwgKmxhc3Q7CS8qIHRlbXBvcmFyeSBpbi9vdXQgcXVldWUgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworICBzb2FwX211bHRpcGFydF9pdGVyYXRvciBiZWdpbigpCisgICAgeyBzb2FwX211bHRpcGFydF9pdGVyYXRvciBpdGVyKGxpc3QpOyByZXR1cm4gaXRlcjsgfTsKKyAgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3IgZW5kKCkKKyAgICB7IHNvYXBfbXVsdGlwYXJ0X2l0ZXJhdG9yIGl0ZXIoTlVMTCk7IHJldHVybiBpdGVyOyB9OworI2VuZGlmCit9OworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKKy8qIFJGQzIwNDUgTUlNRSBjb250ZW50IHRyYW5zZmVyIGVuY29kaW5ncyAqLworZW51bSBzb2FwX21pbWVfZW5jb2RpbmcKK3sgU09BUF9NSU1FX05PTkUsCisgIFNPQVBfTUlNRV83QklULAorICBTT0FQX01JTUVfOEJJVCwKKyAgU09BUF9NSU1FX0JJTkFSWSwKKyAgU09BUF9NSU1FX1FVT1RFRF9QUklOVEFCTEUsCisgIFNPQVBfTUlNRV9CQVNFNjQsCisgIFNPQVBfTUlNRV9JRVRGX1RPS0VOLAorICBTT0FQX01JTUVfWF9UT0tFTgorfTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTkVSCisvKiBESU1FL01JTUUgbXVsdGlwYXJ0IGxpc3QgKi8KK3N0cnVjdCBzb2FwX211bHRpcGFydAoreyBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQgKm5leHQ7CisgIGNoYXIgKnB0cjsJCQkJLyogcG9pbnRzIHRvIHJhdyBkYXRhIGNvbnRlbnQgKi8KKyAgc2l6ZV90IHNpemU7CQkJCS8qIHNpemUgb2YgZGF0YSBjb250ZW50ICovCisgIGNvbnN0IGNoYXIgKmlkOwkJCS8qIERJTUUvTUlNRSBjb250ZW50IElEIG9yIGZvcm0gZGF0YSBuYW1lICovCisgIGNvbnN0IGNoYXIgKnR5cGU7CQkJLyogRElNRS9NSU1FIHR5cGUgKE1JTUUgdHlwZSBmb3JtYXQpICovCisgIGNvbnN0IGNoYXIgKm9wdGlvbnM7CQkJLyogRElNRSBvcHRpb25zICovCisgIGVudW0gc29hcF9taW1lX2VuY29kaW5nIGVuY29kaW5nOwkvKiBNSU1FIENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcgKi8KKyAgY29uc3QgY2hhciAqbG9jYXRpb247CQkJLyogTUlNRSBDb250ZW50LUxvY2F0aW9uIChvcHRpb25hbCkgKi8KKyAgY29uc3QgY2hhciAqZGVzY3JpcHRpb247CQkvKiBNSU1FIENvbnRlbnQtRGVzY3JpcHRpb24gKG9wdGlvbmFsKSAqLworI2lmZGVmIF9fY3BsdXNwbHVzCisgIHR5cGVkZWYgc29hcF9tdWx0aXBhcnRfaXRlcmF0b3IgaXRlcmF0b3I7CisjZW5kaWYKK307CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU5FUgorLyogYXR0YWNobWVudCBESU1FIGFuZCBNVE9NIFhPUCBmb3J3YXJkaW5nICovCitzdHJ1Y3Qgc29hcF94bGlzdAoreyBzdHJ1Y3Qgc29hcF94bGlzdCAqbmV4dDsKKyAgdW5zaWduZWQgY2hhciAqKnB0cjsKKyAgaW50ICpzaXplOworICBjaGFyICppZDsKKyAgY2hhciAqKnR5cGU7CisgIGNoYXIgKipvcHRpb25zOworfTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFdJVEhfTEVBTkVSCisjaWZkZWYgX19jcGx1c3BsdXMKK2NsYXNzIHNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcgoreyBwdWJsaWM6CisgIHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgKmF0dDsKKyAgY29uc3QgY2hhciAqbnN0cjsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvciYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3Qgc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yJikgY29uc3Q7CisgIHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgJm9wZXJhdG9yKigpIGNvbnN0OworICBzb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IgJm9wZXJhdG9yKysoKTsKKyAgc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yKCk7CisgIHNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvcihzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlKik7CisgIH5zb2FwX2RvbV9hdHRyaWJ1dGVfaXRlcmF0b3IoKTsKK307CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTkVSCitzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlCit7IHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUgKm5leHQ7CisgIGNvbnN0IGNoYXIgKm5zdHI7CisgIGNoYXIgKm5hbWU7CisgIGNoYXIgKmRhdGE7CisgIHdjaGFyX3QgKndpZGU7CisgIHN0cnVjdCBzb2FwICpzb2FwOworI2lmZGVmIF9fY3BsdXNwbHVzCisgIHR5cGVkZWYgc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yIGl0ZXJhdG9yOworICBzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlICZzZXQoY29uc3QgY2hhciAqbnN0ciwgY29uc3QgY2hhciAqbmFtZSk7CS8qIHNldCBuYW1lc3BhY2UgYW5kIG5hbWUgKi8KKyAgc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAmc2V0KGNvbnN0IGNoYXIgKmRhdGEpOwkJLyogc2V0IGRhdGEgKi8KKyAgc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yIGJlZ2luKCk7CisgIHNvYXBfZG9tX2F0dHJpYnV0ZV9pdGVyYXRvciBlbmQoKTsKKyAgc29hcF9kb21fYXR0cmlidXRlX2l0ZXJhdG9yIGZpbmQoY29uc3QgY2hhciAqbnN0ciwgY29uc3QgY2hhciAqbmFtZSk7CisgIHZvaWQgdW5saW5rKCk7CisgIHNvYXBfZG9tX2F0dHJpYnV0ZSgpOworICBzb2FwX2RvbV9hdHRyaWJ1dGUoc3RydWN0IHNvYXAgKnNvYXApOworICBzb2FwX2RvbV9hdHRyaWJ1dGUoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5zdHIsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRhdGEpOworICB+c29hcF9kb21fYXR0cmlidXRlKCk7CisjZW5kaWYKK307CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU5FUgorI2lmZGVmIF9fY3BsdXNwbHVzCitjbGFzcyBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yCit7IHB1YmxpYzoKKyAgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKmVsdDsKKyAgY29uc3QgY2hhciAqbnN0cjsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgaW50IHR5cGU7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yJikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yJikgY29uc3Q7CisgIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICZvcGVyYXRvciooKSBjb25zdDsKKyAgc29hcF9kb21fZWxlbWVudF9pdGVyYXRvciAmb3BlcmF0b3IrKygpOworICBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yKCk7CisgIHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3Ioc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQqKTsKKyAgfnNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IoKTsKK307CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTEVBTkVSCitzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudAoreyBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqbmV4dDsJLyogbmV4dCBzaWJsaW5nICovCisgIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICpwcm50OwkvKiBwYXJlbnQgKi8KKyAgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKmVsdHM7CS8qIGxpc3Qgb2YgY2hpbGQgZWxlbWVudHMgKi8KKyAgc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAqYXR0czsJLyogbGlzdCBvZiBhdHRyaWJ1dGVzICovCisgIGNvbnN0IGNoYXIgKm5zdHI7CQkJLyogbmFtZXNwYWNlIHN0cmluZyAqLworICBjaGFyICpuYW1lOwkJCQkvKiBlbGVtZW50IHRhZyBuYW1lICovCisgIGNoYXIgKmRhdGE7CQkJCS8qIGVsZW1lbnQgY29udGVudCBkYXRhICh3aXRoIFNPQVBfQ19VVEZTVFJJTkcgZmxhZyBzZXQpICovCisgIHdjaGFyX3QgKndpZGU7CQkJLyogZWxlbWVudCBjb250ZW50IGRhdGEgKi8KKyAgaW50IHR5cGU7CQkJCS8qIG9wdGlvbmFsOiBzZXJpYWxpemVkIEMvQysrIGRhdGEgdHlwZSAqLworICB2b2lkICpub2RlOwkJCQkvKiBvcHRpb25hbDogcG9pbnRlciB0byBzZXJpYWxpemVkIEMvQysrIGRhdGEgKi8KKyAgY2hhciAqaGVhZDsJCQkJLyogbGVhZGluZyB3aGl0ZXNwYWNlIHRvIHN0YXJ0IHRhZyAqLworICBjaGFyICp0YWlsOwkJCQkvKiBsZWFkaW5nIHdoaXRlc3BhY2UgdG8gZW5kIHRhZyAqLworICBzdHJ1Y3Qgc29hcCAqc29hcDsJCQkvKiBzb2FwIGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgbm9kZSAqLworI2lmZGVmIF9fY3BsdXNwbHVzCisgIHR5cGVkZWYgc29hcF9kb21fZWxlbWVudF9pdGVyYXRvciBpdGVyYXRvcjsKKyAgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgJnNldChjb25zdCBjaGFyICpuc3RyLCBjb25zdCBjaGFyICpuYW1lKTsKKyAgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgJnNldChjb25zdCBjaGFyICpkYXRhKTsKKyAgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgJnNldCh2b2lkICpub2RlLCBpbnQgdHlwZSk7CisgIHN0cnVjdCBzb2FwX2RvbV9lbGVtZW50ICZhZGQoc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQqKTsKKyAgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgJmFkZChzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCYpOworICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAmYWRkKHN0cnVjdCBzb2FwX2RvbV9hdHRyaWJ1dGUqKTsKKyAgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgJmFkZChzdHJ1Y3Qgc29hcF9kb21fYXR0cmlidXRlJik7CisgIHNvYXBfZG9tX2VsZW1lbnRfaXRlcmF0b3IgYmVnaW4oKTsKKyAgc29hcF9kb21fZWxlbWVudF9pdGVyYXRvciBlbmQoKTsKKyAgc29hcF9kb21fZWxlbWVudF9pdGVyYXRvciBmaW5kKGNvbnN0IGNoYXIgKm5zdHIsIGNvbnN0IGNoYXIgKm5hbWUpOworICBzb2FwX2RvbV9lbGVtZW50X2l0ZXJhdG9yIGZpbmQoaW50IHR5cGUpOworICB2b2lkIHVubGluaygpOworICBzb2FwX2RvbV9lbGVtZW50KCk7CisgIHNvYXBfZG9tX2VsZW1lbnQoc3RydWN0IHNvYXAgKnNvYXApOworICBzb2FwX2RvbV9lbGVtZW50KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuc3RyLCBjb25zdCBjaGFyICpuYW1lKTsKKyAgc29hcF9kb21fZWxlbWVudChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbnN0ciwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZGF0YSk7CisgIHNvYXBfZG9tX2VsZW1lbnQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5zdHIsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKm5vZGUsIGludCB0eXBlKTsKKyAgfnNvYXBfZG9tX2VsZW1lbnQoKTsKKyNlbmRpZgorfTsKK1NPQVBfRk1BQzEgc3RydWN0IHNvYXBfZG9tX2VsZW1lbnQgKiBTT0FQX0ZNQUMyIHNvYXBfZG9tX25leHRfZWxlbWVudChzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqZWx0KTsKK1NPQVBfRk1BQzEgc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAqIFNPQVBfRk1BQzIgc29hcF9kb21fbmV4dF9hdHRyaWJ1dGUoc3RydWN0IHNvYXBfZG9tX2F0dHJpYnV0ZSAqYXR0KTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgIWRlZmluZWQoV0lUSF9MRUFOKQorfQorZXh0ZXJuIHN0ZDo6b3N0cmVhbSAmb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mLCBjb25zdCBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCYpOworZXh0ZXJuIHN0ZDo6aXN0cmVhbSAmb3BlcmF0b3I+PihzdGQ6OmlzdHJlYW0mLCBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCYpOworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IHNvYXAKK3sgc2hvcnQgc3RhdGU7CQkJLyogMCA9IHVuaW5pdGlhbGl6ZWQsIDEgPSBpbml0aWFsaXplZCwgMiA9IGNvcHkgb2YgYW5vdGhlciBzb2FwIHN0cnVjdCAqLworICBzaG9ydCB2ZXJzaW9uOwkJLyogMSA9IFNPQVAxLjEgYW5kIDIgPSBTT0FQMS4yIChzZXQgYXV0b21hdGljYWxseSBmcm9tIG5hbWVzcGFjZSBVUkkgaW4gbnNtYXAgdGFibGUpICovCisgIHNvYXBfbW9kZSBtb2RlOworICBzb2FwX21vZGUgaW1vZGU7CisgIHNvYXBfbW9kZSBvbW9kZTsKKyAgY29uc3QgY2hhciAqZmxvYXRfZm9ybWF0OwkvKiB1c2VyLWRlZmluYWJsZSBmb3JtYXQgc3RyaW5nIGZvciBmbG9hdHMgKDwxMDI0IGNoYXJzKSAqLworICBjb25zdCBjaGFyICpkb3VibGVfZm9ybWF0OwkvKiB1c2VyLWRlZmluYWJsZSBmb3JtYXQgc3RyaW5nIGZvciBkb3VibGVzICg8MTAyNCBjaGFycykgKi8KKyAgY29uc3QgY2hhciAqZGltZV9pZF9mb3JtYXQ7CS8qIHVzZXItZGVmaW5hYmxlIGZvcm1hdCBzdHJpbmcgZm9yIGludGVnZXIgRElNRSBpZCAoPFNPQVBfVEFHTEVOIGNoYXJzKSAqLworICBjb25zdCBjaGFyICpodHRwX3ZlcnNpb247CS8qIEhUVFAgdmVyc2lvbiB1c2VkICIxLjAiIG9yICIxLjEiICovCisgIGNvbnN0IGNoYXIgKmh0dHBfY29udGVudDsJLyogb3B0aW9uYWwgY3VzdG9tIHJlc3BvbnNlIGNvbnRlbnQgdHlwZSAod2l0aCBTT0FQX0ZJTEUpICovCisgIGNvbnN0IGNoYXIgKmVuY29kaW5nU3R5bGU7CS8qIGRlZmF1bHQgPSBOVUxMIHdoaWNoIG1lYW5zIHRoYXQgU09BUCBlbmNvZGluZyBpcyB1c2VkICovCisgIGNvbnN0IGNoYXIgKmFjdG9yOwkJLyogU09BUC1FTlY6YWN0b3Igb3Igcm9sZSBhdHRyaWJ1dGUgdmFsdWUgKi8KKyAgaW50IHJlY3ZfdGltZW91dDsJCS8qIHdoZW4gPiAwLCBnaXZlcyBzb2NrZXQgcmVjdiB0aW1lb3V0IGluIHNlY29uZHMsIDwgMCBpbiB1c2VjICovCisgIGludCBzZW5kX3RpbWVvdXQ7CQkvKiB3aGVuID4gMCwgZ2l2ZXMgc29ja2V0IHNlbmQgdGltZW91dCBpbiBzZWNvbmRzLCA8IDAgaW4gdXNlYyAqLworICBpbnQgY29ubmVjdF90aW1lb3V0OwkJLyogd2hlbiA+IDAsIGdpdmVzIHNvY2tldCBjb25uZWN0KCkgdGltZW91dCBpbiBzZWNvbmRzLCA8IDAgaW4gdXNlYyAqLworICBpbnQgYWNjZXB0X3RpbWVvdXQ7CQkvKiB3aGVuID4gMCwgZ2l2ZXMgc29ja2V0IGFjY2VwdCgpIHRpbWVvdXQgaW4gc2Vjb25kcywgPCAwIGluIHVzZWMgKi8KKyAgaW50IHNvY2tldF9mbGFnczsJCS8qIHNvY2tldCByZWN2KCkgYW5kIHNlbmQoKSBmbGFncywgZS5nLiBzZXQgdG8gTVNHX05PU0lHTkFMIHRvIGRpc2FibGUgc2lncGlwZSAqLworICBpbnQgY29ubmVjdF9mbGFnczsJCS8qIGNvbm5lY3QoKSBTT0xfU09DS0VUIHNvY2tvcHQgZmxhZ3MsIGUuZy4gc2V0IHRvIFNPX0RFQlVHIHRvIGRlYnVnIHNvY2tldCAqLworICBpbnQgYmluZF9mbGFnczsJCS8qIGJpbmQoKSBTT0xfU09DS0VUIHNvY2tvcHQgZmxhZ3MsIGUuZy4gc2V0IHRvIFNPX1JFVVNFQUREUiB0byBlbmFibGUgcmV1c2UgKi8KKyAgaW50IGFjY2VwdF9mbGFnczsJCS8qIGFjY2VwdCgpIFNPTF9TT0NLRVQgc29ja29wdCBmbGFncyAqLworICBjb25zdCBzdHJ1Y3QgTmFtZXNwYWNlICpuYW1lc3BhY2VzOwkvKiBQb2ludGVyIHRvIGdsb2JhbCBuYW1lc3BhY2UgbWFwcGluZyB0YWJsZSAqLworICBzdHJ1Y3QgTmFtZXNwYWNlICpsb2NhbF9uYW1lc3BhY2VzOwkvKiBMb2NhbCBuYW1lc3BhY2UgbWFwcGluZyB0YWJsZSAqLworICBzdHJ1Y3Qgc29hcF9ubGlzdCAqbmxpc3Q7CS8qIG5hbWVzcGFjZSBzdGFjayAqLworICBzdHJ1Y3Qgc29hcF9ibGlzdCAqYmxpc3Q7CS8qIGJsb2NrIGFsbG9jYXRpb24gc3RhY2sgKi8KKyAgc3RydWN0IHNvYXBfY2xpc3QgKmNsaXN0OwkvKiBjbGFzcyBpbnN0YW5jZSBhbGxvY2F0aW9uIGxpc3QgKi8KKyAgdm9pZCAqYWxpc3Q7CQkJLyogbWVtb3J5IGFsbG9jYXRpb24gKG1hbGxvYykgbGlzdCAqLworICBzdHJ1Y3Qgc29hcF9pbGlzdCAqaWh0W1NPQVBfSURIQVNIXTsKKyAgc3RydWN0IHNvYXBfcGxpc3QgKnBodFtTT0FQX1BUUkhBU0hdOworICBzdHJ1Y3Qgc29hcF9wYmxrICpwYmxrOwkvKiBwbGlzdCBibG9jayBhbGxvY2F0aW9uICovCisgIHNob3J0IHBpZHg7CQkJLyogcGxpc3QgYmxvY2sgYWxsb2NhdGlvbiAqLworICBzdHJ1Y3QgU09BUF9FTlZfX0hlYWRlciAqaGVhZGVyOworICBzdHJ1Y3QgU09BUF9FTlZfX0ZhdWx0ICpmYXVsdDsKKyAgaW50IGlkbnVtOworICB2b2lkICp1c2VyOwkJCS8qIHRvIHBhc3MgdXNlci1kZWZpbmVkIGRhdGEgKi8KKyAgc3RydWN0IHNvYXBfcGx1Z2luICpwbHVnaW5zOwkvKiBsaW5rZWQgbGlzdCBvZiBwbHVnLWluIGRhdGEgKi8KKyAgY2hhciAqdXNlcmlkOwkJCS8qIEhUVFAgQmFzaWMgYXV0aG9yaXphdGlvbiB1c2VyaWQgKi8KKyAgY2hhciAqcGFzc3dkOwkJCS8qIEhUVFAgQmFzaWMgYXV0aG9yaXphdGlvbiBwYXNzd2QgKi8KKyAgaW50ICgqZnBvc3QpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90KTsKKyAgaW50ICgqZmdldCkoc3RydWN0IHNvYXAqKTsKKyAgaW50ICgqZmZvcm0pKHN0cnVjdCBzb2FwKik7CisgIGludCAoKmZwb3N0aGRyKShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CisgIGludCAoKmZyZXNwb25zZSkoc3RydWN0IHNvYXAqLCBpbnQsIHNpemVfdCk7CisgIGludCAoKmZwYXJzZSkoc3RydWN0IHNvYXAqKTsKKyAgaW50ICgqZnBhcnNlaGRyKShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CisgIGludCAoKmZyZXNvbHZlKShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdHJ1Y3QgaW5fYWRkciogaW5hZGRyKTsKKyAgaW50ICgqZmNvbm5lY3QpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBpbnQpOworICBpbnQgKCpmZGlzY29ubmVjdCkoc3RydWN0IHNvYXAqKTsKKyAgaW50ICgqZmNsb3Nlc29ja2V0KShzdHJ1Y3Qgc29hcCosIFNPQVBfU09DS0VUKTsKKyAgaW50ICgqZnNodXRkb3duc29ja2V0KShzdHJ1Y3Qgc29hcCosIFNPQVBfU09DS0VULCBpbnQpOworICBpbnQgKCpmb3Blbikoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGludCk7CisgIGludCAoKmZhY2NlcHQpKHN0cnVjdCBzb2FwKiwgaW50LCBzdHJ1Y3Qgc29ja2FkZHIqLCBpbnQgKm4pOworICBpbnQgKCpmY2xvc2UpKHN0cnVjdCBzb2FwKik7CisgIGludCAoKmZzZW5kKShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworICBzaXplX3QgKCpmcmVjdikoc3RydWN0IHNvYXAqLCBjaGFyKiwgc2l6ZV90KTsKKyAgaW50ICgqZnBvbGwpKHN0cnVjdCBzb2FwKik7CisgIHZvaWQgKCpmc2V0ZXJyb3IpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqKmMsIGNvbnN0IGNoYXIgKipzKTsKKyAgaW50ICgqZmlnbm9yZSkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKik7CisgIGludCAoKmZzZXJ2ZWxvb3ApKHN0cnVjdCBzb2FwKik7CisgIHZvaWQgKigqZnBsdWdpbikoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKik7CisjaWZuZGVmIFdJVEhfTEVBTkVSCisgIGludCAoKmZwcmVwYXJlaW5pdCkoc3RydWN0IHNvYXAqKTsKKyAgaW50ICgqZnByZXBhcmVzZW5kKShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworICBpbnQgKCpmcHJlcGFyZXJlY3YpKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHNpemVfdCk7CisgIGludCAoKmZwcmVwYXJlZmluYWwpKHN0cnVjdCBzb2FwKik7CisgIHZvaWQgKigqZmRpbWVyZWFkb3Blbikoc3RydWN0IHNvYXAqLCB2b2lkKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CisgIHZvaWQgKigqZmRpbWV3cml0ZW9wZW4pKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CisgIHZvaWQgKCpmZGltZXJlYWRjbG9zZSkoc3RydWN0IHNvYXAqLCB2b2lkKik7CisgIHZvaWQgKCpmZGltZXdyaXRlY2xvc2UpKHN0cnVjdCBzb2FwKiwgdm9pZCopOworICBzaXplX3QgKCpmZGltZXJlYWQpKHN0cnVjdCBzb2FwKiwgdm9pZCosIGNoYXIqLCBzaXplX3QpOworICBpbnQgKCpmZGltZXdyaXRlKShzdHJ1Y3Qgc29hcCosIHZvaWQqLCBjb25zdCBjaGFyKiwgc2l6ZV90KTsKKyNlbmRpZgorICBpbnQgbWFzdGVyOworICBpbnQgc29ja2V0OworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpICYmICghZGVmaW5lZChXSVRIX0xFQU4pIHx8IGRlZmluZWQoVU5ERVJfQ0UpKQorICBzdGQ6Om9zdHJlYW0gKm9zOworICBzdGQ6OmlzdHJlYW0gKmlzOworI2Vsc2UKKyAgdm9pZCAqb3M7CS8qIHByZXNlcnZlIGFsaWdubWVudCAqLworICB2b2lkICppczsJLyogcHJlc2VydmUgYWxpZ25tZW50ICovCisjZW5kaWYKKyNpZm5kZWYgVU5ERVJfQ0UKKyAgaW50IHNlbmRmZDsKKyAgaW50IHJlY3ZmZDsKKyNlbHNlCisgIEZJTEUgKnNlbmRmZDsKKyAgRklMRSAqcmVjdmZkOworI2VuZGlmCisjaWZkZWYgV0lOMzIKKyAgY2hhciBlcnJvcnN0clsyNTZdOwkvKiBidWYgZm9yIEZvcm1hdE1lc3NhZ2UoKSAqLworI2VuZGlmCisgIHNpemVfdCBidWZpZHg7CS8qIGluZGV4IGluIHNvYXAuYnVmW10gKi8KKyAgc2l6ZV90IGJ1ZmxlbjsJLyogbGVuZ3RoIG9mIHNvYXAuYnVmW10gY29udGVudCAqLworICBzb2FwX3djaGFyIGFoZWFkOwkvKiBwYXJzZXIgbG9va2FoZWFkICovCisgIHNob3J0IGNkYXRhOwkJLyogQ0RBVEEgcGFyc2VyIHN0YXRlICovCisgIHNob3J0IGJvZHk7CQkvKiBwYXJzZWQgWE1MIGVsZW1lbnQgaGFzIGEgYm9keSBvciBub3QgKi8KKyAgdW5zaWduZWQgaW50IGxldmVsOwkvKiBYTUwgbmVzdGluZyBsZXZlbCAqLworICBzaXplX3QgY291bnQ7CQkvKiBtZXNzYWdlIGxlbmd0aCBjb3VudGVyICovCisgIHNpemVfdCBsZW5ndGg7CS8qIG1lc3NhZ2UgbGVuZ3RoIGFzIHNldCBieSBIVFRQIGhlYWRlciAqLworI2lmZGVmIFdJVEhfRkFTVAorICBjaGFyICpsYWJidWY7CQkvKiBsb29rLWFzaWRlIGJ1ZmZlciAqLworICBzaXplX3QgbGFibGVuOwkvKiBsb29rLWFzaWRlIGJ1ZmZlciBhbGxvY2F0ZWQgbGVuZ3RoICovCisgIHNpemVfdCBsYWJpZHg7CS8qIGxvb2stYXNpZGUgYnVmZmVyIGluZGV4IHRvIGF2YWlsYWJsZSBwYXJ0ICovCisjZW5kaWYKKyAgY2hhciBidWZbU09BUF9CVUZMRU5dOy8qIHNlbmQgYW5kIHJlY2VpdmUgYnVmZmVyICovCisgIGNoYXIgdG1wYnVmWzEwMjRdOwkvKiBpbi9vdXRwdXQgYnVmZmVyIGZvciBIVFRQIGhlYWRlcnMsIHNpbXBsZVR5cGUgdmFsdWVzLCBhdHRyaWJ1dGUgbmFtZXMsIGFuZCBESU1FID49MTAyNCBieXRlcyAqLworICBjaGFyIG1zZ2J1ZlsxMDI0XTsJLyogb3V0cHV0IGJ1ZmZlciBmb3IgKGVycm9yKSBtZXNzYWdlcyA8PTEwMjQgYnl0ZXMgKi8KKyAgY2hhciB0YWdbU09BUF9UQUdMRU5dOworICBjaGFyIGlkW1NPQVBfVEFHTEVOXTsKKyAgY2hhciBocmVmW1NPQVBfVEFHTEVOXTsKKyAgY2hhciB0eXBlW1NPQVBfVEFHTEVOXTsKKyAgY2hhciBhcnJheVR5cGVbU09BUF9UQUdMRU5dOworICBjaGFyIGFycmF5U2l6ZVtTT0FQX1RBR0xFTl07CisgIGNoYXIgYXJyYXlPZmZzZXRbU09BUF9UQUdMRU5dOworICBzaG9ydCBvdGhlcjsKKyAgc2hvcnQgcG9zaXRpb247CisgIGludCBwb3NpdGlvbnNbU09BUF9NQVhESU1TXTsKKyAgc2hvcnQgcm9vdDsKKyAgc3RydWN0IHNvYXBfYXR0cmlidXRlICphdHRyaWJ1dGVzOwkvKiBhdHRyaWJ1dGUgbGlzdCAqLworICBzaG9ydCBlbmNvZGluZzsJLyogd2hlbiBzZXQsIG91dHB1dCBlbmNvZGluZ1N0eWxlICovCisgIHNob3J0IG11c3RVbmRlcnN0YW5kOwkvKiBhIG11c3RVbmRlcnN0YW5kIGVsZW1lbnQgd2FzIHBhcnNlZCBvciBpcyBvdXRwdXQgKi8KKyAgc2hvcnQga2VlcF9hbGl2ZTsJLyogY29ubmVjdGlvbiBzaG91bGQgYmUga2VwdCBvcGVuICovCisgIHNob3J0IG51bGw7CQkvKiBwYXJzZWQgWE1MIGlzIHhzaTpuaWwgKi8KKyAgc2hvcnQgbnM7CQkvKiB3aGVuIG5vdCBzZXQsIG91dHB1dCBmdWxsIHhtbG5zIGJpbmRpbmdzICovCisgIHNob3J0IHBhcnQ7CQkvKiBwYXJzaW5nIHN0YXRlICovCisgIHNob3J0IGFsbG9jZWQ7CisgIHNob3J0IHBlZWtlZDsKKyAgc2l6ZV90IGNodW5rc2l6ZTsKKyAgc2l6ZV90IGNodW5rYnVmbGVuOworICBjaGFyIGVuZHBvaW50W1NPQVBfVEFHTEVOXTsKKyAgY2hhciBwYXRoW1NPQVBfVEFHTEVOXTsKKyAgY2hhciBob3N0W1NPQVBfVEFHTEVOXTsKKyAgY2hhciAqYWN0aW9uOworICBjaGFyICphdXRocmVhbG07CQkvKiBIVFRQIGF1dGhlbnRpY2F0aW9uIHJlYWxtICovCisgIGNoYXIgKnByb2xvZzsJCQkvKiBYTUwgZGVjbGFyYXRpb24gcHJvbG9nICovCisgIHVuc2lnbmVkIGxvbmcgaXA7CQkvKiBJUCBudW1iZXIgKi8KKyAgaW50IHBvcnQ7CQkJLyogcG9ydCBudW1iZXIgKi8KKyAgdW5zaWduZWQgaW50IG1heF9rZWVwX2FsaXZlOworICBjb25zdCBjaGFyICpwcm94eV9ob3N0OwkvKiBQcm94eSBTZXJ2ZXIgaG9zdCBuYW1lICovCisgIGludCBwcm94eV9wb3J0OwkJLyogUHJveHkgU2VydmVyIHBvcnQgKGRlZmF1bHQgPSA4MDgwKSAqLworICBjb25zdCBjaGFyICpwcm94eV91c2VyaWQ7CS8qIFByb3h5IEF1dGhvcml6YXRpb24gdXNlciBuYW1lICovCisgIGNvbnN0IGNoYXIgKnByb3h5X3Bhc3N3ZDsJLyogUHJveHkgQXV0aG9yaXphdGlvbiBwYXNzd29yZCAqLworICBpbnQgc3RhdHVzOwkJCS8qIC0xIHdoZW4gcmVxdWVzdCwgZWxzZSBlcnJvciBjb2RlIHRvIGJlIHJldHVybmVkIGJ5IHNlcnZlciAqLworICBpbnQgZXJyb3I7CisgIGludCBlcnJtb2RlOworICBpbnQgZXJybnVtOworI2lmbmRlZiBXSVRIX0xFQU5FUgorICBzdHJ1Y3Qgc29hcF9kb21fZWxlbWVudCAqZG9tOworICBzdHJ1Y3Qgc29hcF9kaW1lIGRpbWU7CisgIHN0cnVjdCBzb2FwX21pbWUgbWltZTsKKyAgc3RydWN0IHNvYXBfeGxpc3QgKnhsaXN0OworI2VuZGlmCisjaWYgIWRlZmluZWQoV0lUSF9MRUFOKSB8fCBkZWZpbmVkKFNPQVBfREVCVUcpCisgIGNvbnN0IGNoYXIgKmxvZ2ZpbGVbU09BUF9NQVhMT0dTXTsKKyAgRklMRSAqZmRlYnVnW1NPQVBfTUFYTE9HU107CisgIHN0cnVjdCBzb2FwX21saXN0ICptaHRbU09BUF9QVFJIQVNIXTsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX0xFQU4KKyAgY29uc3QgY2hhciAqYzE0bmluY2x1ZGU7CisgIGNvbnN0IGNoYXIgKmMxNG5leGNsdWRlOworICBzdHJ1Y3Qgc29hcF9jb29raWUgKmNvb2tpZXM7CisgIGNvbnN0IGNoYXIgKmNvb2tpZV9kb21haW47CisgIGNvbnN0IGNoYXIgKmNvb2tpZV9wYXRoOworICBpbnQgY29va2llX21heDsKKyNlbmRpZgorI2lmbmRlZiBXSVRIX05PSU8KKyNpZmRlZiBXSVRIX0lQVjYKKyAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgcGVlcjsJLyogSVB2Njogc2V0IGJ5IHNvYXBfYWNjZXB0IGFuZCBieSBVRFAgcmVjdiAqLworI2Vsc2UKKyAgc3RydWN0IHNvY2thZGRyX2luIHBlZXI7CS8qIElQdjQ6IHNldCBieSBzb2FwX2Nvbm5lY3Qvc29hcF9hY2NlcHQgYW5kIGJ5IFVEUCByZWN2ICovCisjZW5kaWYKKyAgc2l6ZV90IHBlZXJsZW47CisjZW5kaWYKKyNpZmRlZiBXSVRIX09QRU5TU0wKKyAgaW50ICgqZnNzbGF1dGgpKHN0cnVjdCBzb2FwKik7CisgIGludCAoKmZzc2x2ZXJpZnkpKGludCwgWDUwOV9TVE9SRV9DVFgqKTsKKyAgQklPICpiaW87CisgIFNTTCAqc3NsOworICBTU0xfQ1RYICpjdHg7CisgIHNob3J0IHJlcXVpcmVfc2VydmVyX2F1dGg7CisgIHNob3J0IHJlcXVpcmVfY2xpZW50X2F1dGg7CisgIHNob3J0IHJzYTsJCQkvKiB3aGVuIHNldCwgdXNlIFJTQSBpbnN0ZWFkIG9mIERIICovCisgIGNvbnN0IGNoYXIgKmtleWZpbGU7CisgIGNvbnN0IGNoYXIgKnBhc3N3b3JkOworICBjb25zdCBjaGFyICpkaGZpbGU7CisgIGNvbnN0IGNoYXIgKmNhZmlsZTsKKyAgY29uc3QgY2hhciAqY2FwYXRoOworICBjb25zdCBjaGFyICpjcmxmaWxlOworICBjb25zdCBjaGFyICpyYW5kZmlsZTsKKyAgU1NMX1NFU1NJT04gKnNlc3Npb247CisgIGNoYXIgc2Vzc2lvbl9ob3N0W1NPQVBfVEFHTEVOXTsKKyAgaW50IHNlc3Npb25fcG9ydDsKKyNlbmRpZgorI2lmZGVmIFdJVEhfWkxJQgorICBzaG9ydCB6bGliX3N0YXRlOwkJLyogU09BUF9aTElCX05PTkUsIFNPQVBfWkxJQl9ERUZMQVRFLCBvciBTT0FQX1pMSUJfSU5GTEFURSAqLworICBzaG9ydCB6bGliX2luOwkJLyogU09BUF9aTElCX05PTkUsIFNPQVBfWkxJQl9ERUZMQVRFLCBvciBTT0FQX1pMSUJfR1pJUCAqLworICBzaG9ydCB6bGliX291dDsJCS8qIFNPQVBfWkxJQl9OT05FLCBTT0FQX1pMSUJfREVGTEFURSwgb3IgU09BUF9aTElCX0daSVAgKi8KKyAgel9zdHJlYW0gZF9zdHJlYW07CQkvKiBkZWNvbXByZXNzaW9uIHN0cmVhbSAqLworICBjaGFyIHpfYnVmW1NPQVBfQlVGTEVOXTsJLyogYnVmZmVyICovCisgIHNpemVfdCB6X2J1ZmxlbjsKKyAgdW5zaWduZWQgc2hvcnQgel9sZXZlbDsJLyogY29tcHJlc3Npb24gbGV2ZWwgdG8gYmUgdXNlZCAoMD1ub25lLCAxPWZhc3QgdG8gOT1iZXN0KSAqLworICB1TG9uZyB6X2NyYzsJCQkvKiBpbnRlcm5hbCBnemlwIGNyYyAqLworICBmbG9hdCB6X3JhdGlvX2luOwkJLyogZGV0ZWN0ZWQgY29tcHJlc3Npb24gcmF0aW8gY29tcHJlc3NlZF9sZW5ndGgvbGVuZ3RoIG9mIGluYm91bmQgbWVzc2FnZSAqLworICBmbG9hdCB6X3JhdGlvX291dDsJCS8qIGRldGVjdGVkIGNvbXByZXNzaW9uIHJhdGlvIGNvbXByZXNzZWRfbGVuZ3RoL2xlbmd0aCBvZiBvdXRib3VuZCBtZXNzYWdlICovCisjZW5kaWYKKyNpZmRlZiBXTVdfUlBNX0lPCisgIHZvaWQgKnJwbXJlcWlkOworI2VuZGlmCisjaWZuZGVmIFdJVEhfTEVBTgorI2lmZGVmIF9fY3BsdXNwbHVzCisgIHNvYXAoKTsKKyAgc29hcChzb2FwX21vZGUpOworICBzb2FwKHNvYXBfbW9kZSwgc29hcF9tb2RlKTsKKyAgc29hcChzdHJ1Y3Qgc29hcCYpOworICB+c29hcCgpOworI2VuZGlmCisjZW5kaWYKK307CisKK3N0cnVjdCBzb2FwX2NvZGVfbWFwCit7IGxvbmcgY29kZTsKKyAgY29uc3QgY2hhciAqc3RyaW5nOworfTsKKworLyogZm9yd2FyZGluZyBsaXN0ICovCitzdHJ1Y3Qgc29hcF9mbGlzdAoreyBzdHJ1Y3Qgc29hcF9mbGlzdCAqbmV4dDsKKyAgaW50IHR5cGU7CisgIHZvaWQgKnB0cjsKKyAgdW5zaWduZWQgaW50IGxldmVsOworICBzaXplX3QgbGVuOworICB2b2lkICgqZmNvcHkpKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBzaXplX3QsIGNvbnN0IHZvaWQqLCBzaXplX3QpOworfTsKKworLyogaWQtcmVmIGZvcndhcmRpbmcgbGlzdCAqLworc3RydWN0IHNvYXBfaWxpc3QKK3sgc3RydWN0IHNvYXBfaWxpc3QgKm5leHQ7CisgIGludCB0eXBlOworICBzaXplX3Qgc2l6ZTsKKyAgdm9pZCAqbGluazsKKyAgdm9pZCAqY29weTsKKyAgc3RydWN0IHNvYXBfZmxpc3QgKmZsaXN0OworICB2b2lkICpwdHI7CisgIHVuc2lnbmVkIGludCBsZXZlbDsKKyAgY2hhciBpZFsxXTsgLyogdGhlIGFjdHVhbCBpZCBzdHJpbmcgdmFsdWUgZmxvd3MgaW50byB0aGUgYWxsb2NhdGVkIHJlZ2lvbiBiZWxvdyB0aGlzIHN0cnVjdCAqLworfTsKKworc3RydWN0IHNvYXBfcGx1Z2luCit7IHN0cnVjdCBzb2FwX3BsdWdpbiAqbmV4dDsKKyAgY29uc3QgY2hhciAqaWQ7CisgIHZvaWQgKmRhdGE7CisgIGludCAoKmZjb3B5KShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RydWN0IHNvYXBfcGx1Z2luICpkc3QsIHN0cnVjdCBzb2FwX3BsdWdpbiAqc3JjKTsKKyAgdm9pZCAoKmZkZWxldGUpKHN0cnVjdCBzb2FwICpzb2FwLCBzdHJ1Y3Qgc29hcF9wbHVnaW4gKnApOyAvKiBzaG91bGQgZGVsZXRlIGZpZWxkcyBvZiBwbHVnaW4gb25seSBhbmQgbm90IGZyZWUocCkgKi8KK307CisKKyNpZm5kZWYgV0lUSF9OT05BTUVTUEFDRVMKK2V4dGVybiBTT0FQX05NQUMgc3RydWN0IE5hbWVzcGFjZSBuYW1lc3BhY2VzW107CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU4KKyMgZGVmaW5lIHNvYXBfZ2V0MChzb2FwKSAoKChzb2FwKS0+YnVmaWR4Pj0oc29hcCktPmJ1ZmxlbiAmJiBzb2FwX3JlY3Yoc29hcCkpID8gRU9GIDogKHVuc2lnbmVkIGNoYXIpKHNvYXApLT5idWZbKHNvYXApLT5idWZpZHhdKQorIyBkZWZpbmUgc29hcF9nZXQxKHNvYXApICgoKHNvYXApLT5idWZpZHg+PShzb2FwKS0+YnVmbGVuICYmIHNvYXBfcmVjdihzb2FwKSkgPyBFT0YgOiAodW5zaWduZWQgY2hhcikoc29hcCktPmJ1Zlsoc29hcCktPmJ1ZmlkeCsrXSkKKyNlbHNlCitzb2FwX3djaGFyIHNvYXBfZ2V0MChzdHJ1Y3Qgc29hcCopOworc29hcF93Y2hhciBzb2FwX2dldDEoc3RydWN0IHNvYXAqKTsKKyNlbmRpZgorCisjZGVmaW5lIHNvYXBfcmV2Z2V0MShzb2FwKSAoKHNvYXApLT5idWZpZHgtLSkKKyNkZWZpbmUgc29hcF91bmdldChzb2FwLCBjKSAoKHNvYXApLT5haGVhZCA9IGMpCisjZGVmaW5lIHNvYXBfcmVnaXN0ZXJfcGx1Z2luKHNvYXAsIHBsdWdpbikgc29hcF9yZWdpc3Rlcl9wbHVnaW5fYXJnKHNvYXAsIHBsdWdpbiwgTlVMTCkKKyNkZWZpbmUgc29hcF9pbW9kZShzb2FwLCBuKSAoKHNvYXApLT5tb2RlID0gKHNvYXApLT5pbW9kZSA9IChuKSkKKyNkZWZpbmUgc29hcF9zZXRfaW1vZGUoc29hcCwgbikgKChzb2FwKS0+aW1vZGUgfD0gKG4pKQorI2RlZmluZSBzb2FwX2Nscl9pbW9kZShzb2FwLCBuKSAoKHNvYXApLT5pbW9kZSAmPSB+KG4pKQorI2RlZmluZSBzb2FwX29tb2RlKHNvYXAsIG4pICgoc29hcCktPm1vZGUgPSAoc29hcCktPm9tb2RlID0gKG4pKQorI2RlZmluZSBzb2FwX3NldF9vbW9kZShzb2FwLCBuKSAoKHNvYXApLT5vbW9kZSB8PSAobikpCisjZGVmaW5lIHNvYXBfY2xyX29tb2RlKHNvYXAsIG4pICgoc29hcCktPm9tb2RlICY9IH4obikpCisjZGVmaW5lIHNvYXBfc2V0X21vZGUoc29hcCwgbikgKChzb2FwKS0+aW1vZGUgfD0gKG4pLCAoc29hcCktPm9tb2RlIHw9IChuKSkKKyNkZWZpbmUgc29hcF9jbHJfbW9kZShzb2FwLCBuKSAoKHNvYXApLT5pbW9kZSAmPSB+KG4pLCAoc29hcCktPm9tb2RlICY9IH4obikpCisjZGVmaW5lIHNvYXBfZGVzdHJveShzb2FwKSBzb2FwX2RlbGV0ZSgoc29hcCksIE5VTEwpCisKKyNpZmRlZiBIQVZFX1NUUlJDSFIKKyMgZGVmaW5lIHNvYXBfc3RycmNocihzLCB0KSBzdHJyY2hyKHMsIHQpCisjZWxzZQorIFNPQVBfRk1BQzEgY2hhciogU09BUF9GTUFDMiBzb2FwX3N0cnJjaHIoY29uc3QgY2hhciAqcywgaW50IHQpOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NUUlRPTAorIyBkZWZpbmUgc29hcF9zdHJ0b2wocywgdCwgYikgc3RydG9sKHMsIHQsIGIpCisjZWxzZQorIFNPQVBfRk1BQzEgbG9uZyBTT0FQX0ZNQUMyIHNvYXBfc3RydG9sKGNvbnN0IGNoYXIgKnMsIGNoYXIgKip0LCBpbnQgYik7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RSVE9VTAorIyBkZWZpbmUgc29hcF9zdHJ0b3VsKHMsIHQsIGIpIHN0cnRvdWwocywgdCwgYikKKyNlbHNlCisgU09BUF9GTUFDMSB1bnNpZ25lZCBsb25nIFNPQVBfRk1BQzIgc29hcF9zdHJ0b3VsKGNvbnN0IGNoYXIgKnMsIGNoYXIgKip0LCBpbnQgYik7CisjZW5kaWYKKworI2lmIGRlZmluZWQoV0lUSF9PUEVOU1NMKQorIyBkZWZpbmUgc29hcF9yYW5kb20gc29hcF9yYW5kKCkKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9yYW5kKCk7CisjZWxpZiBkZWZpbmVkKEhBVkVfUkFORE9NKQorIyBkZWZpbmUgc29hcF9yYW5kb20gKGludClyYW5kb20oKQorI2Vsc2UKKyMgZGVmaW5lIHNvYXBfcmFuZG9tIHJhbmQoKQorI2VuZGlmCisKKyNpZmRlZiBXSVRIX05PSURSRUYKKyMgZGVmaW5lIHNvYXBfZW1iZWRkZWQocywgcCwgdCkgKDApCisjIGRlZmluZSBzb2FwX2lkX2xvb2t1cChzLCBpLCBwLCB0LCBuLCBrKSAocCkKKyMgZGVmaW5lIHNvYXBfaWRfZm9yd2FyZChzLCBoLCBwLCBsZW4sIHN0LCB0dCwgbiwgaywgZmMpIChwKQorIyBkZWZpbmUgc29hcF9yZWZlcmVuY2UocywgYSwgdCkgKDEpCisjIGRlZmluZSBzb2FwX2FycmF5X3JlZmVyZW5jZShzLCBwLCBhLCBuLCB0KSAoMSkKKyMgZGVmaW5lIHNvYXBfZW1iZWQocywgcCwgYSwgbiwgdCwgcHApICgwKQorIyBkZWZpbmUgc29hcF9lbWJlZGRlZF9pZChzLCBpLCBwLCB0KSAoaSkKKyMgZGVmaW5lIHNvYXBfaXNfZW1iZWRkZWQocywgcCkgKDApCisjIGRlZmluZSBzb2FwX2lzX3NpbmdsZShzLCBwKSAoMSkKKyMgZGVmaW5lIHNvYXBfbG9va3VwX3R5cGUocywgaSkgKDApCisjIGRlZmluZSBzb2FwX2dldGluZGVwZW5kZW50KHMpICgwKQorIyBkZWZpbmUgc29hcF9wdXRpbmRlcGVuZGVudChzKSAoMCkKKyMgZGVmaW5lIHNvYXBfZ2V0ZWxlbWVudChzLCBuKSAobikKKyMgZGVmaW5lIHNvYXBfcHV0ZWxlbWVudChzLCBwLCB0LCBpLCBuKSAoMCkKKyMgZGVmaW5lIHNvYXBfbWFya2VsZW1lbnQocywgcCwgbikgKDApCisjZW5kaWYKKworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9mYXVsdChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiogU09BUF9GTUFDMiBzb2FwX2ZhdWx0Y29kZShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiogU09BUF9GTUFDMiBzb2FwX2ZhdWx0c3ViY29kZShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiogU09BUF9GTUFDMiBzb2FwX2ZhdWx0c3RyaW5nKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqKiBTT0FQX0ZNQUMyIHNvYXBfZmF1bHRkZXRhaWwoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfc2VyaWFsaXplaGVhZGVyKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0aGVhZGVyKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZ2V0aGVhZGVyKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NlcmlhbGl6ZWZhdWx0KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0ZmF1bHQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRmYXVsdChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NzbF9pbml0KCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcG9sbChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2Nvbm5lY3RfY29tbWFuZChzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9jb25uZWN0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9iaW5kKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9hY2NlcHQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zc2xfYWNjZXB0KHN0cnVjdCBzb2FwKik7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zc2xfc2VydmVyX2NvbnRleHQoc3RydWN0IHNvYXAqLCB1bnNpZ25lZCBzaG9ydCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NzbF9jbGllbnRfY29udGV4dChzdHJ1Y3Qgc29hcCosIHVuc2lnbmVkIHNob3J0LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0aHR0cGhkcihzdHJ1Y3Qgc29hcCosIGludCBzdGF0dXMsIHNpemVfdCBjb3VudCk7CisKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX2dldF9oZWFkZXJfYXR0cmlidXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX2RlY29kZV9rZXkoY2hhciosIHNpemVfdCwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfZGVjb2RlX3ZhbChjaGFyKiwgc2l6ZV90LCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzEgc2l6ZV90IFNPQVBfRk1BQzIgc29hcF9oYXNoKGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfc2V0X2VuZHBvaW50KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2ZsdXNoX3JhdyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2ZsdXNoKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHNvYXBfd2NoYXIgU09BUF9GTUFDMiBzb2FwX2dldChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBzb2FwX3djaGFyIFNPQVBfRk1BQzIgc29hcF9nZXRjaGFyKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfdGFnX2NtcChjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXRfZmF1bHQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZW5kZXJfZmF1bHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NlbmRlcl9mYXVsdF9zdWJjb2RlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcmVjZWl2ZXJfZmF1bHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3JlY2VpdmVyX2ZhdWx0X3N1YmNvZGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZXRfc2VuZGVyX2Vycm9yKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NldF9yZWNlaXZlcl9lcnJvcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgaW50KTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NlbmRfcmF3KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHNpemVfdCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcmVjdl9yYXcoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9yZWN2KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2VuZChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZW5kMihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2VuZDMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3B1dHV0Zjgoc3RydWN0IHNvYXAqLCB1bnNpZ25lZCBsb25nKTsKK1NPQVBfRk1BQzEgc29hcF93Y2hhciBTT0FQX0ZNQUMyIHNvYXBfZ2V0dXRmOChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0YmFzZTY0KHN0cnVjdCBzb2FwKiwgY29uc3QgdW5zaWduZWQgY2hhciosIGludCk7CitTT0FQX0ZNQUMxIHVuc2lnbmVkIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9nZXRiYXNlNjQoc3RydWN0IHNvYXAqLCBpbnQqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3B1dGhleChzdHJ1Y3Qgc29hcCosIGNvbnN0IHVuc2lnbmVkIGNoYXIqLCBpbnQpOworU09BUF9GTUFDMSB1bnNpZ25lZCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfZ2V0aGV4KHN0cnVjdCBzb2FwKiwgaW50Kik7CisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF94b3BfZm9yd2FyZChzdHJ1Y3Qgc29hcCosIHVuc2lnbmVkIGNoYXIqKiwgaW50KiwgY2hhcioqLCBjaGFyKiosIGNoYXIqKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZGltZV9mb3J3YXJkKHN0cnVjdCBzb2FwKiwgdW5zaWduZWQgY2hhcioqLCBpbnQqLCBjaGFyKiosIGNoYXIqKiwgY2hhcioqKTsKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9JRFJFRgorU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3BvaW50ZXJfbG9va3VwX2lkKHN0cnVjdCBzb2FwKiwgdm9pZCAqcCwgaW50IHQsIHN0cnVjdCBzb2FwX3BsaXN0KiopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3BvaW50ZXJfbG9va3VwKHN0cnVjdCBzb2FwKiwgY29uc3Qgdm9pZCAqcCwgaW50IHQsIHN0cnVjdCBzb2FwX3BsaXN0KiopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3BvaW50ZXJfZW50ZXIoc3RydWN0IHNvYXAqLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGludCB0LCBzdHJ1Y3Qgc29hcF9wbGlzdCoqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9hcnJheV9wb2ludGVyX2xvb2t1cChzdHJ1Y3Qgc29hcCosIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgbiwgaW50IHQsIHN0cnVjdCBzb2FwX3BsaXN0KiopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VtYmVkKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGNvbnN0IGNoYXIgKnRhZywgaW50IHR5cGUpOworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcF9pbGlzdCogU09BUF9GTUFDMiBzb2FwX2xvb2t1cChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgc3RydWN0IHNvYXBfaWxpc3QqIFNPQVBfRk1BQzIgc29hcF9lbnRlcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9yZXNvbHZlKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2VtYmVkZGVkKHN0cnVjdCBzb2FwKiwgY29uc3Qgdm9pZCAqcCwgaW50IHQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3JlZmVyZW5jZShzdHJ1Y3Qgc29hcCosIGNvbnN0IHZvaWQgKnAsIGludCB0KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9hcnJheV9yZWZlcmVuY2Uoc3RydWN0IHNvYXAqLCBjb25zdCB2b2lkICpwLCBjb25zdCBzdHJ1Y3Qgc29hcF9hcnJheSAqYSwgaW50IG4sIGludCB0KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbWJlZGRlZF9pZChzdHJ1Y3Qgc29hcCosIGludCBpZCwgY29uc3Qgdm9pZCAqcCwgaW50IHQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2lzX2VtYmVkZGVkKHN0cnVjdCBzb2FwKiwgc3RydWN0IHNvYXBfcGxpc3QqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9pc19zaW5nbGUoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9wbGlzdCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXRfZW1iZWRkZWQoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9wbGlzdCopOworI2VuZGlmCisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9iZWdpbl9jb3VudChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VuZF9jb3VudChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2JlZ2luX3NlbmQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbmRfc2VuZChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwKiBTT0FQX0ZNQUMyIHNvYXBfY29kZShjb25zdCBzdHJ1Y3Qgc29hcF9jb2RlX21hcCosIGNvbnN0IGNoYXIgKnN0cik7CitTT0FQX0ZNQUMxIGxvbmcgU09BUF9GTUFDMiBzb2FwX2ludF9jb2RlKGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwKiwgY29uc3QgY2hhciAqc3RyLCBsb25nIG90aGVyKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX3N0cl9jb2RlKGNvbnN0IHN0cnVjdCBzb2FwX2NvZGVfbWFwKiwgbG9uZyBjb2RlKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2dldGxpbmUoc3RydWN0IHNvYXAqLCBjaGFyKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9iZWdpbl9yZWN2KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZW5kX3JlY3Yoc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMSB2b2lkKiBTT0FQX0ZNQUMyIHNvYXBfbWFsbG9jKHN0cnVjdCBzb2FwKiwgc2l6ZV90KTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfZGVhbGxvYyhzdHJ1Y3Qgc29hcCosIHZvaWQqKTsKK1NPQVBfRk1BQzEgc3RydWN0IHNvYXBfY2xpc3QgKiBTT0FQX0ZNQUMyIHNvYXBfbGluayhzdHJ1Y3Qgc29hcCosIHZvaWQqLCBpbnQsIGludCwgdm9pZCAoKmZkZWxldGUpKHN0cnVjdCBzb2FwX2NsaXN0KikpOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF91bmxpbmsoc3RydWN0IHNvYXAqLCBjb25zdCB2b2lkKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2ZyZWUoc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMSB2b2lkKiBTT0FQX0ZNQUMyIHNvYXBfdHJhY2tfbWFsbG9jKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgc2l6ZV90KTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfdHJhY2tfZnJlZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIHZvaWQqKTsKKworI2lmbmRlZiBXSVRIX05PSURSRUYKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9sb29rdXBfdHlwZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKmlkKTsKK1NPQVBfRk1BQzEgdm9pZCogU09BUF9GTUFDMiBzb2FwX2lkX2xvb2t1cChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKmlkLCB2b2lkICoqcCwgaW50IHQsIHNpemVfdCBuLCB1bnNpZ25lZCBpbnQgayk7CitTT0FQX0ZNQUMxIHZvaWQqIFNPQVBfRk1BQzIgc29hcF9pZF9mb3J3YXJkKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqaWQsIHZvaWQgKnAsIHNpemVfdCBsZW4sIGludCBzdCwgaW50IHR0LCBzaXplX3QgbiwgdW5zaWduZWQgaW50IGssIHZvaWQoKmZjb3B5KShzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgc2l6ZV90LCBjb25zdCB2b2lkKiwgc2l6ZV90KSk7CisjZW5kaWYKK1NPQVBfRk1BQzEgdm9pZCogU09BUF9GTUFDMiBzb2FwX2lkX2VudGVyKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqaWQsIHZvaWQgKnAsIGludCB0LCBzaXplX3QgbiwgdW5zaWduZWQgaW50IGssIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmFycmF5VHlwZSwgdm9pZCAqKCpmaW5zdGFudGlhdGUpKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfZmNvcHkoc3RydWN0IHNvYXAgKnNvYXAsIGludCBzdCwgaW50IHR0LCB2b2lkICpwLCBzaXplX3QsIGNvbnN0IHZvaWQgKnEsIHNpemVfdCBuKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NpemUoY29uc3QgaW50ICosIGludCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZ2V0b2Zmc2V0cyhjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBpbnQgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRzaXplKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQgKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZ2V0c2l6ZXMoY29uc3QgY2hhciAqLCBpbnQgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRwb3NpdGlvbihjb25zdCBjaGFyICosIGludCAqKTsKKworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfcHV0c2l6ZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgY2hhciogU09BUF9GTUFDMiBzb2FwX3B1dHNpemVzb2Zmc2V0cyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBpbnQpOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfcHV0c2l6ZXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBpbnQpOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfcHV0b2Zmc2V0KHN0cnVjdCBzb2FwKiwgaW50KTsKK1NPQVBfRk1BQzEgY2hhciogU09BUF9GTUFDMiBzb2FwX3B1dG9mZnNldHMoc3RydWN0IHNvYXAqLCBjb25zdCBpbnQgKiwgaW50KTsKKyAKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9jbG9zZXNvY2soc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcCAqU09BUF9GTUFDMiBzb2FwX25ldyh2b2lkKTsKK1NPQVBfRk1BQzEgc3RydWN0IHNvYXAgKlNPQVBfRk1BQzIgc29hcF9uZXcxKHNvYXBfbW9kZSk7CitTT0FQX0ZNQUMxIHN0cnVjdCBzb2FwICpTT0FQX0ZNQUMyIHNvYXBfbmV3Mihzb2FwX21vZGUsIHNvYXBfbW9kZSk7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2RlbChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcCAqU09BUF9GTUFDMiBzb2FwX2NvcHkoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgc3RydWN0IHNvYXAgKlNPQVBfRk1BQzIgc29hcF9jb3B5X2NvbnRleHQoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9pbml0KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2luaXQxKHN0cnVjdCBzb2FwKiwgc29hcF9tb2RlKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfaW5pdDIoc3RydWN0IHNvYXAqLCBzb2FwX21vZGUsIHNvYXBfbW9kZSk7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2RvbmUoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfY2xlYW51cChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9iZWdpbihzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9lbmQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfZGVsZXRlKHN0cnVjdCBzb2FwKiwgdm9pZCopOworCisjaWZkZWYgU09BUF9ERUJVRworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXRfcmVjdl9sb2dmaWxlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXRfc2VudF9sb2dmaWxlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9zZXRfdGVzdF9sb2dmaWxlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9jbG9zZV9sb2dmaWxlcyhzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9vcGVuX2xvZ2ZpbGUoc3RydWN0IHNvYXAqLCBpbnQpOworI2VuZGlmCisKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX3Rva2VuKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF92YWx1ZShzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfbWF0Y2hfdGFnKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfbWF0Y2hfYXJyYXkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbGVtZW50KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfYmVnaW5fb3V0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnR5cGUpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2FycmF5X2JlZ2luX291dChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICpvZmZzZXQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfcmVmKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGludCBocmVmKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbGVtZW50X2hyZWYoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgY2hhciAqcmVmLCBjb25zdCBjaGFyICp2YWwpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfbnVsbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBjaGFyICp0eXBlKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbGVtZW50X2lkKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHZvaWQgKnAsIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5ICphLCBpbnQgZCwgY29uc3QgY2hhciAqdHlwZSwgaW50IG4pOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfcmVzdWx0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9lbGVtZW50X2VuZF9vdXQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfc3RhcnRfZW5kX291dChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZyk7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9hdHRyaWJ1dGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZWxlbWVudF9iZWdpbl9pbihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IG5pbGxhYmxlKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VsZW1lbnRfZW5kX2luKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3BlZWtfZWxlbWVudChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3JldHJ5KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3JldmVydChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9zdHJkdXAoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIgKiBTT0FQX0ZNQUMyIHNvYXBfc3Ryc2VhcmNoKGNvbnN0IGNoYXIgKmJpZywgY29uc3QgY2hhciAqbGl0dGxlKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3N0cmluZ19vdXQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICpzLCBpbnQgZmxhZyk7CitTT0FQX0ZNQUMxIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9zdHJpbmdfaW4oc3RydWN0IHNvYXAqLCBpbnQsIGxvbmcsIGxvbmcpOworCisjaWZuZGVmIFdJVEhfTEVBTkVSCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfd3N0cmluZ19vdXQoc3RydWN0IHNvYXAqLCBjb25zdCB3Y2hhcl90ICpzLCBpbnQgZmxhZyk7CitTT0FQX0ZNQUMxIHdjaGFyX3QqIFNPQVBfRk1BQzIgc29hcF93c3RyaW5nX2luKHN0cnVjdCBzb2FwKiwgaW50LCBsb25nLCBsb25nKTsKKyNlbmRpZgorCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfbWF0Y2hfbmFtZXNwYWNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyKiwgaW50IG4xLCBpbnQgbjIpOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2V0X25hbWVzcGFjZXMoc3RydWN0IHNvYXAqLCBzdHJ1Y3QgTmFtZXNwYWNlKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NldF9sb2NhbF9uYW1lc3BhY2VzKHN0cnVjdCBzb2FwKik7CisKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfcG9wX25hbWVzcGFjZShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3B1c2hfbmFtZXNwYWNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9jdXJyZW50X25hbWVzcGFjZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3N0b3JlX2xhYihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaXplX3QpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2FwcGVuZF9sYWIoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc2l6ZV90KTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX25ld19ibG9jayhzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSB2b2lkKiBTT0FQX0ZNQUMyIHNvYXBfcHVzaF9ibG9jayhzdHJ1Y3Qgc29hcCosIHNpemVfdCk7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3BvcF9ibG9jayhzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBzaXplX3QgU09BUF9GTUFDMiBzb2FwX3NpemVfYmxvY2soc3RydWN0IHNvYXAqLCBzaXplX3QpOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfZmlyc3RfYmxvY2soc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgY2hhciogU09BUF9GTUFDMiBzb2FwX25leHRfYmxvY2soc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgc2l6ZV90IFNPQVBfRk1BQzIgc29hcF9ibG9ja19zaXplKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9zYXZlX2Jsb2NrKHN0cnVjdCBzb2FwKiwgY2hhciosIGludCk7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX2VuZF9ibG9jayhzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZW52ZWxvcGVfYmVnaW5fb3V0KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBzb2FwX2VudmVsb3BlX2VuZF9vdXQoc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2VudmVsb3BlX2JlZ2luX2luKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZW52ZWxvcGVfZW5kX2luKHN0cnVjdCBzb2FwKik7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9ib2R5X2JlZ2luX291dChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2JvZHlfZW5kX291dChzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfYm9keV9iZWdpbl9pbihzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2JvZHlfZW5kX2luKHN0cnVjdCBzb2FwKik7CisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9yZWN2X2hlYWRlcihzdHJ1Y3Qgc29hcCopOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcmVzcG9uc2Uoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2VuZF9lbXB0eV9yZXNwb25zZShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3JlY3ZfZW1wdHlfcmVzcG9uc2Uoc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3NlbmRfZmF1bHQoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9yZWN2X2ZhdWx0KHN0cnVjdCBzb2FwKik7CisKKyNpZm5kZWYgV0lUSF9OT1NURExJQgorU09BUF9GTUFDMSB2b2lkIFNPQVBfRk1BQzIgc29hcF9wcmludF9mYXVsdChzdHJ1Y3Qgc29hcCosIEZJTEUqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfcHJpbnRfZmF1bHRfbG9jYXRpb24oc3RydWN0IHNvYXAqLCBGSUxFKik7CisjZW5kaWYKKworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MyYnl0ZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjaGFyKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfczJzaG9ydChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzaG9ydCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MyaW50KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MybG9uZyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBsb25nKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfczJMT05HNjQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgTE9ORzY0Kik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfczJmbG9hdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBmbG9hdCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MyZG91YmxlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGRvdWJsZSopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MydW5zaWduZWRCeXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVuc2lnbmVkIGNoYXIqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zMnVuc2lnbmVkU2hvcnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdW5zaWduZWQgc2hvcnQqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zMnVuc2lnbmVkSW50KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVuc2lnbmVkIGludCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3MydW5zaWduZWRMb25nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVuc2lnbmVkIGxvbmcqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zMlVMT05HNjQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgVUxPTkc2NCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3Myc3RyaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNoYXIqKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfczJRTmFtZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjaGFyKiopOworCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3Myd2NoYXIoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgd2NoYXJfdCoqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zMmRhdGVUaW1lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHRpbWVfdCopOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfczJiYXNlNjQoc3RydWN0IHNvYXAqLCBjb25zdCB1bnNpZ25lZCBjaGFyKiwgY2hhciosIGludCk7CitTT0FQX0ZNQUMxIGNoYXIqIFNPQVBfRk1BQzIgc29hcF9zMmhleChzdHJ1Y3Qgc29hcCosIGNvbnN0IHVuc2lnbmVkIGNoYXIqLCBjaGFyKiwgaW50KTsKKyNlbmRpZgorCitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9ieXRlMnMoc3RydWN0IHNvYXAqLCBjaGFyKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX3Nob3J0MnMoc3RydWN0IHNvYXAqLCBzaG9ydCk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9pbnQycyhzdHJ1Y3Qgc29hcCosIGludCk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9sb25nMnMoc3RydWN0IHNvYXAqLCBsb25nKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX0xPTkc2NDJzKHN0cnVjdCBzb2FwKiwgTE9ORzY0KTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX2Zsb2F0MnMoc3RydWN0IHNvYXAqLCBmbG9hdCk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9kb3VibGUycyhzdHJ1Y3Qgc29hcCosIGRvdWJsZSk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF91bnNpZ25lZEJ5dGUycyhzdHJ1Y3Qgc29hcCosIHVuc2lnbmVkIGNoYXIpOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfdW5zaWduZWRTaG9ydDJzKHN0cnVjdCBzb2FwKiwgdW5zaWduZWQgc2hvcnQpOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfdW5zaWduZWRJbnQycyhzdHJ1Y3Qgc29hcCosIHVuc2lnbmVkIGludCk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF91bnNpZ25lZExvbmcycyhzdHJ1Y3Qgc29hcCosIHVuc2lnbmVkIGxvbmcpOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfVUxPTkc2NDJzKHN0cnVjdCBzb2FwKiwgVUxPTkc2NCk7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9RTmFtZTJzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfd2NoYXIycyhzdHJ1Y3Qgc29hcCosIGNvbnN0IHdjaGFyX3QqKTsKK1NPQVBfRk1BQzEgY29uc3QgY2hhciogU09BUF9GTUFDMiBzb2FwX2RhdGVUaW1lMnMoc3RydWN0IHNvYXAqLCB0aW1lX3QpOworU09BUF9GTUFDMSBjb25zdCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfYmFzZTY0MnMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY2hhciosIHNpemVfdCwgaW50Kik7CitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9oZXgycyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjaGFyKiwgc2l6ZV90LCBpbnQqKTsKKyNlbmRpZgorCisKK1NPQVBfRk1BQzEgaW50KiBTT0FQX0ZNQUMyIHNvYXBfaW5pbnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfaW5ieXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBjaGFyICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGxvbmcqIFNPQVBfRk1BQzIgc29hcF9pbmxvbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGxvbmcgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgTE9ORzY0KiBTT0FQX0ZNQUMyIHNvYXBfaW5MT05HNjQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIExPTkc2NCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBzaG9ydCogU09BUF9GTUFDMiBzb2FwX2luc2hvcnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHNob3J0ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGZsb2F0KiBTT0FQX0ZNQUMyIHNvYXBfaW5mbG9hdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgZmxvYXQgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgZG91YmxlKiBTT0FQX0ZNQUMyIHNvYXBfaW5kb3VibGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGRvdWJsZSAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSB1bnNpZ25lZCBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfaW51bnNpZ25lZEJ5dGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIGNoYXIgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgdW5zaWduZWQgc2hvcnQqIFNPQVBfRk1BQzIgc29hcF9pbnVuc2lnbmVkU2hvcnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIHNob3J0ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIHVuc2lnbmVkIGludCogU09BUF9GTUFDMiBzb2FwX2ludW5zaWduZWRJbnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIGludCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSB1bnNpZ25lZCBsb25nKiBTT0FQX0ZNQUMyIHNvYXBfaW51bnNpZ25lZExvbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHVuc2lnbmVkIGxvbmcgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgVUxPTkc2NCogU09BUF9GTUFDMiBzb2FwX2luVUxPTkc2NChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgVUxPTkc2NCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBjaGFyKiogU09BUF9GTUFDMiBzb2FwX2luc3RyaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBjaGFyICoqcCwgY29uc3QgY2hhciAqLCBpbnQsIGludCwgbG9uZywgbG9uZyk7CitTT0FQX0ZNQUMxIGNoYXIqKiBTT0FQX0ZNQUMyIHNvYXBfaW5saXRlcmFsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBjaGFyICoqcCk7CisKKyNpZm5kZWYgV0lUSF9MRUFOCitTT0FQX0ZNQUMxIHRpbWVfdCogU09BUF9GTUFDMiBzb2FwX2luZGF0ZVRpbWUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHRpbWVfdCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK1NPQVBfRk1BQzEgd2NoYXJfdCoqIFNPQVBfRk1BQzIgc29hcF9pbndzdHJpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIHdjaGFyX3QgKipwLCBjb25zdCBjaGFyICosIGludCwgbG9uZywgbG9uZyk7CitTT0FQX0ZNQUMxIHdjaGFyX3QqKiBTT0FQX0ZNQUMyIHNvYXBfaW53bGl0ZXJhbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgd2NoYXJfdCAqKnApOworI2VuZGlmCisKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRieXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGNoYXIgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRzaG9ydChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBzaG9ydCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dGludChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgaW50IGlkLCBjb25zdCBpbnQgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRsb25nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IGxvbmcgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRMT05HNjQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgTE9ORzY0ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0ZmxvYXQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgZmxvYXQgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRkb3VibGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgZG91YmxlICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0dW5zaWduZWRCeXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXR1bnNpZ25lZFNob3J0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIHNob3J0ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0dW5zaWduZWRJbnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY29uc3QgdW5zaWduZWQgaW50ICpwLCBjb25zdCBjaGFyICosIGludCk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfb3V0dW5zaWduZWRMb25nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRVTE9ORzY0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IFVMT05HNjQgKnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXRzdHJpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGludCBpZCwgY2hhciAqY29uc3QqcCwgY29uc3QgY2hhciAqLCBpbnQpOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dGxpdGVyYWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0YWcsIGNoYXIgKmNvbnN0KnApOworCisjaWZuZGVmIFdJVEhfTEVBTgorU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX291dGRhdGVUaW1lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIGNvbnN0IHRpbWVfdCAqcCwgY29uc3QgY2hhciAqLCBpbnQpOworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9MRUFORVIKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXR3c3RyaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdGFnLCBpbnQgaWQsIHdjaGFyX3QgKmNvbnN0KnAsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9vdXR3bGl0ZXJhbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRhZywgd2NoYXJfdCAqY29uc3QqcCk7CisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0xFQU5FUgorU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2F0dGFjaG1lbnQoc3RydWN0IHNvYXAgKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgdm9pZCosIGNvbnN0IHN0cnVjdCBzb2FwX2FycmF5KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBjaGFyKiwgaW50KTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9tb3ZlKHN0cnVjdCBzb2FwKiwgbG9uZyk7CitTT0FQX0ZNQUMxIHNpemVfdCBTT0FQX0ZNQUMyIHNvYXBfdGVsbChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfZGltZV9vcHRpb24oc3RydWN0IHNvYXAqLCB1bnNpZ25lZCBzaG9ydCwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX2dldGRpbWVoZHIoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRkaW1lKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcHV0ZGltZWhkcihzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3B1dGRpbWUoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9nZXRtaW1laGRyKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfZ2V0bWltZShzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMSBpbnQgU09BUF9GTUFDMiBzb2FwX3B1dG1pbWVoZHIoc3RydWN0IHNvYXAqLCBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9wdXRtaW1lKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NldF9kaW1lKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIHZvaWQgU09BUF9GTUFDMiBzb2FwX3NldF9taW1lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqYm91bmRhcnksIGNvbnN0IGNoYXIgKnN0YXJ0KTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfY2xyX2RpbWUoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfY2xyX21pbWUoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZXRfZGltZV9hdHRhY2htZW50KHN0cnVjdCBzb2FwKiwgY2hhciAqcHRyLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqaWQsIHVuc2lnbmVkIHNob3J0IG9wdHlwZSwgY29uc3QgY2hhciAqb3B0aW9uKTsKK1NPQVBfRk1BQzEgaW50IFNPQVBfRk1BQzIgc29hcF9zZXRfbWltZV9hdHRhY2htZW50KHN0cnVjdCBzb2FwKiwgY2hhciAqcHRyLCBzaXplX3Qgc2l6ZSwgZW51bSBzb2FwX21pbWVfZW5jb2RpbmcgZW5jb2RpbmcsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBjaGFyICpsb2NhdGlvbiwgY29uc3QgY2hhciAqZGVzY3JpcHRpb24pOworU09BUF9GTUFDMSBzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqIFNPQVBfRk1BQzIgc29hcF9uZXh0X211bHRpcGFydChzdHJ1Y3Qgc29hcF9tdWx0aXBhcnQqKTsKKyNlbmRpZgorCitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfcmVnaXN0ZXJfcGx1Z2luX2FyZyhzdHJ1Y3Qgc29hcCosIGludCAoKmZjcmVhdGUpKHN0cnVjdCBzb2FwKiwgc3RydWN0IHNvYXBfcGx1Z2luKiwgdm9pZCopLCB2b2lkKik7CitTT0FQX0ZNQUMxIHZvaWQqIFNPQVBfRk1BQzIgc29hcF9sb29rdXBfcGx1Z2luKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUMxIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzIgc29hcF9hdHRyX3ZhbHVlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgZmxhZyk7CitTT0FQX0ZNQUMxIGludCBTT0FQX0ZNQUMyIHNvYXBfc2V0X2F0dHIoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKTsKK1NPQVBfRk1BQzEgdm9pZCBTT0FQX0ZNQUMyIHNvYXBfY2xyX2F0dHIoc3RydWN0IHNvYXAgKnNvYXApOworCisjaWZkZWYgV0lUSF9DT09LSUVTCitTT0FQX0ZNQUMxIHNpemVfdCBTT0FQX0ZNQUMyIHNvYXBfZW5jb2RlX2Nvb2tpZShjb25zdCBjaGFyKiwgY2hhciosIHNpemVfdCk7CitTT0FQX0ZNQUMxIGV4dGVybiBzdHJ1Y3Qgc29hcF9jb29raWUqIFNPQVBfRk1BQzIgc29hcF9zZXRfY29va2llKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBleHRlcm4gc3RydWN0IHNvYXBfY29va2llKiBTT0FQX0ZNQUMyIHNvYXBfY29va2llKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGV4dGVybiBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfY29va2llX3ZhbHVlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGV4dGVybiBjaGFyKiBTT0FQX0ZNQUMyIHNvYXBfZW52X2Nvb2tpZV92YWx1ZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBleHRlcm4gbG9uZyBTT0FQX0ZNQUMyIHNvYXBfY29va2llX2V4cGlyZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBleHRlcm4gaW50IFNPQVBfRk1BQzIgc29hcF9zZXRfY29va2llX2V4cGlyZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBsb25nLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMSBleHRlcm4gaW50IFNPQVBfRk1BQzIgc29hcF9zZXRfY29va2llX3Nlc3Npb24oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzEgZXh0ZXJuIGludCBTT0FQX0ZNQUMyIHNvYXBfY2xyX2Nvb2tpZV9zZXNzaW9uKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGV4dGVybiB2b2lkIFNPQVBfRk1BQzIgc29hcF9jbHJfY29va2llKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMxIGV4dGVybiBpbnQgU09BUF9GTUFDMiBzb2FwX2dldGVudl9jb29raWVzKHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMxIGV4dGVybiBzdHJ1Y3Qgc29hcF9jb29raWUqIFNPQVBfRk1BQzIgc29hcF9jb3B5X2Nvb2tpZXMoc3RydWN0IHNvYXAqKTsKK1NPQVBfRk1BQzEgZXh0ZXJuIHZvaWQgU09BUF9GTUFDMiBzb2FwX2ZyZWVfY29va2llcyhzdHJ1Y3Qgc29hcCopOworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBleHRlcm4gIkMiICovCisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3R5cGVtYXAuZGF0IGIvdHlwZW1hcC5kYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc5ZDhjNwotLS0gL2Rldi9udWxsCisrKyBiL3R5cGVtYXAuZGF0CkBAIC0wLDAgKzEsMTcyIEBACisjCXR5cGVtYXAuZGF0CisjCisjCVVzZSB0aGlzIGZpbGUgdG8gZGVmaW5lIG5hbWVzcGFjZSBwcmVmaXggYW5kIHR5cGUgYmluZGluZ3MgZm9yCisjCXRoZSBnZW5lcmF0ZWQgaGVhZGVyIGZpbGVzIGJ5IHRoZSAnd3NkbDJoJyB0b29sLiAgdHlwZW1hcC5kYXQgaXMgdGhlCisjCWRlZmF1bHQgZmlsZSBwcm9jZXNzZWQgYnkgJ3dzZGwyaCcgdG8gY3VzdG9taXplIGl0cyBvdXRwdXQuIFlvdSBjYW4gdXNlCisjCXdzZGwyaCBvcHRpb24gLXQgdG8gc3BlY2lmeSBhbiBhbHRlcm5hdGUgZmlsZS4KKyMKKyMJWE1MIG5hbWVzcGFjZSBwcmVmaXggYmluZGluZ3MgY2FuIGJlIHByb3ZpZGVkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0CisjCWNob2ljZSBvZiB0aGUgbnMxLCBuczIsIC4uLiBwcmVmaXhlcyBnZW5lcmF0ZWQgYnkgd3NkbDJoLiAgSXQgaXMgaGlnaGx5CisjCXJlY29tbWVuZGVkIHRvIHByb3ZpZGUgbmFtZXNwYWNlIHByZWZpeGVzIGZvciB5b3VyIHByb2plY3QncyBYTUwKKyMJbmFtZXNwYWNlcy4gSW4gdGhpcyB3YXksIGNoYW5nZXMgdG8gdGhlIFdTREwgKG9yIG5ld2VyIHJlbGVhc2VzIG9mCisjCXdzZGwyaCkgd2lsbCBoYXZlIGEgbWluaW1hbCBpbXBhY3Qgb24gY29kaW5nLgorIwlCaW5kaW5ncyBmb3IgbmFtZXNwYWNlIHByZWZpeGVzIGFyZSBvZiB0aGUgZm9ybToKKyMJCXByZWZpeCA9ICJVUkkiCisjCisjCVR5cGUgYmluZGluZ3MgY2FuIGJ5IHByb3ZpZGVkIHRvIGJpbmQgWE1MIHNjaGVtYSB0eXBlcyB0byBDL0MrKyB0eXBlcworIwlmb3IgeW91ciBwcm9qZWN0LgorIwlUeXBlIGJpbmRpbmdzIGFyZSBvZiB0aGUgZm9ybToKKyMJCXByZWZpeF9fdHlwZSA9IGRlY2xhcmF0aW9uIHwgdXNlIHwgcHRyLXVzZQorIwl3aGVyZSAnZGVjbGFyYXRpb24nIGludHJvZHVjZXMgdGhlIHR5cGUgaW4gdGhlIGhlYWRlciBmaWxlLCAndXNlJworIwlzcGVjaWZpZXMgaG93IHRoZSB0eXBlIGlzIHVzZWQgZGlyZWN0bHksICdwdHItdXNlJyBzcGVjaWZpZXMgaG93IHRoZQorIwl0eXBlIGlzIHVzZWQgYXMgYSBwb2ludGVyIHR5cGUuCisjCUZvciBleGFtcGxlOgorIwkJeHNkX19zdHJpbmcgPSB8IGNoYXIqIHwgY2hhcioKKyMJQWZ0ZXIgZW5hYmxpbmcgdGhpcyBsaW5lLCBhbGwgWFNEIHN0cmluZ3Mgd2lsbCBiZSBtYXBwZWQgdG8gY2hhciouIE5vdGUKKyMJdGhhdCB0aGUgJ2RlY2xhcmF0aW9uJyBwYXJ0IGlzIGVtcHR5IGluIHRoaXMgY2FzZS4KKyMKKyMJTWVtYmVyIGRhdGEgYW5kIGZ1bmN0aW9ucyBjYW4gYmUgcHJvdmlkZWQgdG8gZXh0ZW5kIGEgZ2VuZXJhdGVkIHN0cnVjdAorIwlvciBjbGFzcy4KKyMJQ2xhc3MgYW5kIHN0cnVjdCBleHRlbnNpb25zIGFyZSBvZiB0aGUgZm9ybToKKyMJCXByZWZpeF9fdHlwZSA9ICQgbWVtYmVyLWRlY2xhcmF0aW9uCisjCUZvciBleGFtcGxlLCB0byBhZGQgYSBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciB0byBjbGFzcyBteW5zX19yZWNvcmQ6CisjCQlteW5zX19yZWNvcmQgPSAkIG15bnNfX3JlY29yZCgpOworIwkJbXluc19fcmVjb3JkID0gJCB+bXluc19fcmVjb3JkKCk7CisjCQorIwlBbnkgb3RoZXIgbWF0ZXJpYWwgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZCBoZWFkZXIgZmlsZSBjYW4gYmUKKyMJcHJvdmlkZWQgYnkgZW5jbG9zaW5nIHRoZSB0ZXh0IHdpdGhpbiBicmFja2V0cyBbIGFuZCBdLiBCcmFja2V0cyBNVVNUCisjCWFwcGVhciBhdCB0aGUgc3RhcnQgb2YgYSBuZXcgbGluZS4KKyMJRm9yIGV4YW1wbGUsIHRvIGluY2x1ZGUgYSBub3RlOgorI1sKKyMvLyBUT0RPOiBEb24ndCBmb3JnZXQgdG8gYmluZCB0aGUgbmFtZXNwYWNlIHByZWZpeGVzIQorI10KKyMJVGhpcyBjb21tZW50IGFwcGVhcnMgYXMgdGhlIGZpcnN0IGxpbmUgaW4gdGhlIGdlbmVyYXRlZCBoZWFkZXIgZmlsZS4KKyMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworI0NvcHlyaWdodCAoQykgMjAwNC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorI1RoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzOgorI0dQTCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI0dQTCBsaWNlbnNlLgorIworI1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCisjdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyNGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorI3ZlcnNpb24uCisjCisjVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorI1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyNQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyNZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisjdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorI1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKyNBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKKyNlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitbCisvLyBSZW1pbmRlcjogTW9kaWZ5IHR5cGVtYXAuZGF0IHRvIGN1c3RvbWl6ZSB0aGUgaGVhZGVyIGZpbGUgZ2VuZXJhdGVkIGJ5IHdzZGwyaAorXQorCisjCUZvciBXaGl0ZU1lc2EgaW50ZXJvcGVyYWJpbGl0eSB0ZXN0aW5nIHJvdW5kIDI6CisKK2kJPSAiaHR0cDovL3d3dy5zb2FwaW50ZXJvcC5vcmcvIgorcwk9ICJodHRwOi8vd3d3LnNvYXBpbnRlcm9wLm9yZy94c2QiCisKKyMJQW1hem9uIFdlYiBTZXJ2aWNlczoKKworYXdzCT0gInVybjpQSS9EZXZDZW50cmFsL1NvYXBTZXJ2aWNlIgorCisjCU1hcHBvaW50IFdlYiBzZXJ2aWNlczoKKworbXB0CT0gImh0dHA6Ly9zLm1hcHBvaW50Lm5ldC9tYXBwb2ludC0zMC8iCisKKyMJTVRPTSB4b3AgYW5kIHhtaW1lIGFyZSBpbXBvcnRlZCBmcm9tIHhvcC5oLCB4bWltZS5oLCBhbmQgeG1sbWltZS5oOgorCit4b3AJPSA8aHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC94b3AvaW5jbHVkZT4KK3htaW1lCT0gPGh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDYveG1sbWltZT4KK3htbG1pbWUJPSA8aHR0cDovL3d3dy53My5vcmcvMjAwNC8xMS94bWxtaW1lPgorCisjCXhtaW1lL3htbG1pbWU6Y29udGVudFR5cGUgYXR0cmlidXRlIGlzIGp1dHMgYSBzdHJpbmc6CisKK194bWltZV9fY29udGVudFR5cGUJPSB8IGNoYXIqIHwgY2hhcioKK194bWxtaW1lX19jb250ZW50VHlwZQk9IHwgY2hhciogfCBjaGFyKgorCisjCVdTLUFkZHJlc3NpbmcgKDIwMDMgYW5kIDIwMDQgc2NoZW1hcykKKyMJU2VlIGltcG9ydC93c2EuaCBhbmQgaW1wb3J0L3dzYTMuaCBmb3IgZGVmaW5pdGlvbnMgYW5kIGNvZGUgZXhhbXBsZXMKKword3NhCT0gPGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZz4KK3dzYTMJPSA8aHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMy8wMy9hZGRyZXNzaW5nPgorCisjCVdTLVBvbGljeQorCit3c3AJPSA8aHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9wb2xpY3k+CisKKyMJd3NzZSAyMDA0IGFuZCBvbGQgd3NzZSAyMDAyIHNjaGVtYQorCit3c3NlCT0gPGh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZD4KK3dzc2UyCT0gPGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDIvMTIvc2VjZXh0PgorCisjCXdzdSAyMDA0CisKK3dzdQk9IDxodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktdXRpbGl0eS0xLjAueHNkPgorCitfd3N1X19JZAkJPSB8IGNoYXIqCitfd3N1X19DcmVhdGVkCQk9IHwgdGltZV90Citfd3N1X19FeHBpcmVzCQk9IHwgdGltZV90CisKK3dzdV9fQXR0cmlidXRlZERhdGVUaW1lCT0gfCB0aW1lX3QKK3dzdV9fQXR0cmlidXRlZFVSSQk9IHwgY2hhcioKKworIwlCaW5kaW5ncyBmb3IgZHMgYW5kIHhlbmMgZm9yIFdTLVNlY3VyaXR5IHByb3RvY29sczoKKworZHMJPSA8aHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIz4KK3hlbmMJPSA8aHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxlbmMjPgorCisjCXhsaW5rCisKK3hsaW5rCT0gPGh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbms+CisKK194bGlua19fYWN0dWF0ZQkJPSB8IGNoYXIqCitfeGxpbmtfX2FyY3JvbGUJCT0gfCBjaGFyKgorX3hsaW5rX19mcm9tCQk9IHwgY2hhcioKK194bGlua19faHJlZgkJPSB8IGNoYXIqCitfeGxpbmtfX2xhYmVsCQk9IHwgY2hhcioKK194bGlua19fcm9sZQkJPSB8IGNoYXIqCitfeGxpbmtfX3Nob3cJCT0gfCBjaGFyKgorX3hsaW5rX190bwkJPSB8IGNoYXIqCitfeGxpbmtfX3RpdGxlCQk9IHwgY2hhcioKK194bGlua19fdHlwZQkJPSB8IGNoYXIqCisKKyMJd3NycAorCit3c3JwCT0gPGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3JwLz4KKworIwlSZW1lbWJlcjogdHlwZSBiaW5kaW5ncyBhcmUgZ2l2ZW4gb24gYSBzaW5nbGUgbGluZS4KKyMJRXhhbXBsZSBYTUwgc2NoZW1hIGFuZCBDL0MrKyB0eXBlIGJpbmRpbmdzOgorCit4c2RfX2ludAk9IHwgaW50CisKKyMJV2l0aCBTT0FQIGVuY29kZWQgYXJyYXlzLCB0aGUgU09BUC1FTkM6YXJyYXlUeXBlIGF0dHJpYnV0ZSBpcyBkZWZpbmVkCisjCWJ1dCB3ZSByZWFsbHkgZG9uJ3QgbmVlZCBpdCBiZWNhdXNlIHdlIG5ldmVyIHVzZSBpdAorCitTT0FQX0VOQ19fYXJyYXlUeXBlCT0gfCBjaGFyKiB8IGNoYXIqCisKKyMJVG8gdXNlIHJlZ3VsYXIgY2hhciogc3RyaW5ncyBpbnN0ZWFkIG9mIHN0ZDo6c3RyaW5nLCB1c2U6CisKKyMgeHNkX19zdHJpbmcJPSB8IGNoYXIqIHwgY2hhcioKKworIwlUbyB1c2UgcmVndWxhciBjaGFyKiBzdHJpbmdzIHNlcmlhbGl6ZWQgd2l0aCB4c2k6dHlwZSBhdHRyaWJ1dGVzLCB1c2U6CisKKyMgeHNkX19zdHJpbmcJPSB0eXBlZGVmIGNoYXIgKnhzZF9fc3RyaW5nOyB8IHhzZF9fc3RyaW5nIHwgeHNkX19zdHJpbmcKKworIwlNb3JlIGV4YW1wbGVzOgorCisjIHhzZF9fYm9vbGVhbiA9IGVudW0geHNkX19ib29sZWFuIHsgZmFsc2VfLCB0cnVlXyB9OyB8IGVudW0geHNkX19ib29sZWFuCisKKyMgeHNkX19iYXNlNjRCaW5hcnkgPSBjbGFzcyB4c2RfX2Jhc2U2NEJpbmFyeSB7IHVuc2lnbmVkIGNoYXIgKl9fcHRyOyBpbnQgX19zaXplOyB9OyB8IHhzZF9fYmFzZTY0QmluYXJ5IHwgeHNkX19iYXNlNjRCaW5hcnkKZGlmZiAtLWdpdCBhL3VkZGkyL0RveHlmaWxlIGIvdWRkaTIvRG94eWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZmMDBkYQotLS0gL2Rldi9udWxsCisrKyBiL3VkZGkyL0RveHlmaWxlCkBAIC0wLDAgKzEsMjU5IEBACisjIERveHlmaWxlIDEuMy44CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHJvamVjdCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUFJPSkVDVF9OQU1FICAgICAgICAgICA9ICJnU09BUCBVRERJIHYyIgorUFJPSkVDVF9OVU1CRVIgICAgICAgICA9IAorT1VUUFVUX0RJUkVDVE9SWSAgICAgICA9IAorQ1JFQVRFX1NVQkRJUlMgICAgICAgICA9IE5PCitPVVRQVVRfTEFOR1VBR0UgICAgICAgID0gRW5nbGlzaAorVVNFX1dJTkRPV1NfRU5DT0RJTkcgICA9IE5PCitCUklFRl9NRU1CRVJfREVTQyAgICAgID0gWUVTCitSRVBFQVRfQlJJRUYgICAgICAgICAgID0gWUVTCitBQkJSRVZJQVRFX0JSSUVGICAgICAgID0gIlRoZSAkbmFtZSBjbGFzcyIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgJG5hbWUgd2lkZ2V0IiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSAkbmFtZSBmaWxlIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXByZXNlbnRzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhlCitBTFdBWVNfREVUQUlMRURfU0VDICAgID0gTk8KK0lOTElORV9JTkhFUklURURfTUVNQiAgPSBOTworRlVMTF9QQVRIX05BTUVTICAgICAgICA9IFlFUworU1RSSVBfRlJPTV9QQVRIICAgICAgICA9IC9BcHBsaWNhdGlvbnMvCitTVFJJUF9GUk9NX0lOQ19QQVRIICAgID0gCitTSE9SVF9OQU1FUyAgICAgICAgICAgID0gTk8KK0pBVkFET0NfQVVUT0JSSUVGICAgICAgPSBOTworTVVMVElMSU5FX0NQUF9JU19CUklFRiA9IE5PCitERVRBSUxTX0FUX1RPUCAgICAgICAgID0gTk8KK0lOSEVSSVRfRE9DUyAgICAgICAgICAgPSBZRVMKK0RJU1RSSUJVVEVfR1JPVVBfRE9DICAgPSBOTworVEFCX1NJWkUgICAgICAgICAgICAgICA9IDgKK0FMSUFTRVMgICAgICAgICAgICAgICAgPSAKK09QVElNSVpFX09VVFBVVF9GT1JfQyAgPSBOTworT1BUSU1JWkVfT1VUUFVUX0pBVkEgICA9IE5PCitTVUJHUk9VUElORyAgICAgICAgICAgID0gWUVTCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEJ1aWxkIHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFWFRSQUNUX0FMTCAgICAgICAgICAgID0gWUVTCitFWFRSQUNUX1BSSVZBVEUgICAgICAgID0gWUVTCitFWFRSQUNUX1NUQVRJQyAgICAgICAgID0gWUVTCitFWFRSQUNUX0xPQ0FMX0NMQVNTRVMgID0gWUVTCitFWFRSQUNUX0xPQ0FMX01FVEhPRFMgID0gTk8KK0hJREVfVU5ET0NfTUVNQkVSUyAgICAgPSBOTworSElERV9VTkRPQ19DTEFTU0VTICAgICA9IE5PCitISURFX0ZSSUVORF9DT01QT1VORFMgID0gTk8KK0hJREVfSU5fQk9EWV9ET0NTICAgICAgPSBOTworSU5URVJOQUxfRE9DUyAgICAgICAgICA9IE5PCitDQVNFX1NFTlNFX05BTUVTICAgICAgID0gTk8KK0hJREVfU0NPUEVfTkFNRVMgICAgICAgPSBOTworU0hPV19JTkNMVURFX0ZJTEVTICAgICA9IFlFUworSU5MSU5FX0lORk8gICAgICAgICAgICA9IFlFUworU09SVF9NRU1CRVJfRE9DUyAgICAgICA9IFlFUworU09SVF9CUklFRl9ET0NTICAgICAgICA9IE5PCitTT1JUX0JZX1NDT1BFX05BTUUgICAgID0gTk8KK0dFTkVSQVRFX1RPRE9MSVNUICAgICAgPSBZRVMKK0dFTkVSQVRFX1RFU1RMSVNUICAgICAgPSBZRVMKK0dFTkVSQVRFX0JVR0xJU1QgICAgICAgPSBZRVMKK0dFTkVSQVRFX0RFUFJFQ0FURURMSVNUPSBZRVMKK0VOQUJMRURfU0VDVElPTlMgICAgICAgPSAKK01BWF9JTklUSUFMSVpFUl9MSU5FUyAgPSAzMAorU0hPV19VU0VEX0ZJTEVTICAgICAgICA9IFlFUworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB3YXJuaW5nIGFuZCBwcm9ncmVzcyBtZXNzYWdlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUVVJRVQgICAgICAgICAgICAgICAgICA9IE5PCitXQVJOSU5HUyAgICAgICAgICAgICAgID0gWUVTCitXQVJOX0lGX1VORE9DVU1FTlRFRCAgID0gWUVTCitXQVJOX0lGX0RPQ19FUlJPUiAgICAgID0gWUVTCitXQVJOX0ZPUk1BVCAgICAgICAgICAgID0gIiRmaWxlOiRsaW5lOiAkdGV4dCIKK1dBUk5fTE9HRklMRSAgICAgICAgICAgPSAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGlucHV0IGZpbGVzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitJTlBVVCAgICAgICAgICAgICAgICAgID0gdWRkaV92Mi5oCitGSUxFX1BBVFRFUk5TICAgICAgICAgID0gKi5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmNjIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmN4eCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouYysrIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmphdmEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouaWkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouaXh4IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmlwcCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5pKysgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouaW5sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICouaGggXAorICAgICAgICAgICAgICAgICAgICAgICAgICouaHh4IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmhwcCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5oKysgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouaWRsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLm9kbCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5jcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5waHAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICoucGhwMyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5pbmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICoubSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5tbSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5DIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLkNDIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLkMrKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5JSSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5JKysgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouSCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5ISCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5IKysgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouQ1MgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouUEhQIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLlBIUDMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouTSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5NTQorUkVDVVJTSVZFICAgICAgICAgICAgICA9IE5PCitFWENMVURFICAgICAgICAgICAgICAgID0gCitFWENMVURFX1NZTUxJTktTICAgICAgID0gTk8KK0VYQ0xVREVfUEFUVEVSTlMgICAgICAgPSAKK0VYQU1QTEVfUEFUSCAgICAgICAgICAgPSAKK0VYQU1QTEVfUEFUVEVSTlMgICAgICAgPSAqCitFWEFNUExFX1JFQ1VSU0lWRSAgICAgID0gTk8KK0lNQUdFX1BBVEggICAgICAgICAgICAgPSAKK0lOUFVUX0ZJTFRFUiAgICAgICAgICAgPSAKK0ZJTFRFUl9QQVRURVJOUyAgICAgICAgPSAKK0ZJTFRFUl9TT1VSQ0VfRklMRVMgICAgPSBOTworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBzb3VyY2UgYnJvd3NpbmcKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NPVVJDRV9CUk9XU0VSICAgICAgICAgPSBOTworSU5MSU5FX1NPVVJDRVMgICAgICAgICA9IE5PCitTVFJJUF9DT0RFX0NPTU1FTlRTICAgID0gWUVTCitSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OID0gTk8KK1JFRkVSRU5DRVNfUkVMQVRJT04gICAgPSBOTworVkVSQkFUSU1fSEVBREVSUyAgICAgICA9IE5PCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBhbHBoYWJldGljYWwgY2xhc3MgaW5kZXgKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FMUEhBQkVUSUNBTF9JTkRFWCAgICAgPSBOTworQ09MU19JTl9BTFBIQV9JTkRFWCAgICA9IDUKK0lHTk9SRV9QUkVGSVggICAgICAgICAgPSAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIEhUTUwgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHRU5FUkFURV9IVE1MICAgICAgICAgID0gWUVTCitIVE1MX09VVFBVVCAgICAgICAgICAgID0gaHRtbAorSFRNTF9GSUxFX0VYVEVOU0lPTiAgICA9IC5odG1sCitIVE1MX0hFQURFUiAgICAgICAgICAgID0gCitIVE1MX0ZPT1RFUiAgICAgICAgICAgID0gCitIVE1MX1NUWUxFU0hFRVQgICAgICAgID0gCitIVE1MX0FMSUdOX01FTUJFUlMgICAgID0gWUVTCitHRU5FUkFURV9IVE1MSEVMUCAgICAgID0gTk8KK0NITV9GSUxFICAgICAgICAgICAgICAgPSAKK0hIQ19MT0NBVElPTiAgICAgICAgICAgPSAKK0dFTkVSQVRFX0NISSAgICAgICAgICAgPSBOTworQklOQVJZX1RPQyAgICAgICAgICAgICA9IE5PCitUT0NfRVhQQU5EICAgICAgICAgICAgID0gTk8KK0RJU0FCTEVfSU5ERVggICAgICAgICAgPSBOTworRU5VTV9WQUxVRVNfUEVSX0xJTkUgICA9IDQKK0dFTkVSQVRFX1RSRUVWSUVXICAgICAgPSBZRVMKK1RSRUVWSUVXX1dJRFRIICAgICAgICAgPSAyNTAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIExhVGVYIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR0VORVJBVEVfTEFURVggICAgICAgICA9IE5PCitMQVRFWF9PVVRQVVQgICAgICAgICAgID0gbGF0ZXgKK0xBVEVYX0NNRF9OQU1FICAgICAgICAgPSBsYXRleAorTUFLRUlOREVYX0NNRF9OQU1FICAgICA9IG1ha2VpbmRleAorQ09NUEFDVF9MQVRFWCAgICAgICAgICA9IE5PCitQQVBFUl9UWVBFICAgICAgICAgICAgID0gYTR3aWRlCitFWFRSQV9QQUNLQUdFUyAgICAgICAgID0gCitMQVRFWF9IRUFERVIgICAgICAgICAgID0gCitQREZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8KK1VTRV9QREZMQVRFWCAgICAgICAgICAgPSBOTworTEFURVhfQkFUQ0hNT0RFICAgICAgICA9IE5PCitMQVRFWF9ISURFX0lORElDRVMgICAgID0gTk8KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFJURiBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dFTkVSQVRFX1JURiAgICAgICAgICAgPSBOTworUlRGX09VVFBVVCAgICAgICAgICAgICA9IHJ0ZgorQ09NUEFDVF9SVEYgICAgICAgICAgICA9IE5PCitSVEZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8KK1JURl9TVFlMRVNIRUVUX0ZJTEUgICAgPSAKK1JURl9FWFRFTlNJT05TX0ZJTEUgICAgPSAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIG1hbiBwYWdlIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR0VORVJBVEVfTUFOICAgICAgICAgICA9IE5PCitNQU5fT1VUUFVUICAgICAgICAgICAgID0gbWFuCitNQU5fRVhURU5TSU9OICAgICAgICAgID0gLjMKK01BTl9MSU5LUyAgICAgICAgICAgICAgPSBOTworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgWE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR0VORVJBVEVfWE1MICAgICAgICAgICA9IE5PCitYTUxfT1VUUFVUICAgICAgICAgICAgID0geG1sCitYTUxfU0NIRU1BICAgICAgICAgICAgID0gCitYTUxfRFREICAgICAgICAgICAgICAgID0gCitYTUxfUFJPR1JBTUxJU1RJTkcgICAgID0gWUVTCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIEF1dG9HZW4gRGVmaW5pdGlvbnMgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHRU5FUkFURV9BVVRPR0VOX0RFRiAgID0gTk8KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFBlcmwgbW9kdWxlIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR0VORVJBVEVfUEVSTE1PRCAgICAgICA9IE5PCitQRVJMTU9EX0xBVEVYICAgICAgICAgID0gTk8KK1BFUkxNT0RfUFJFVFRZICAgICAgICAgPSBZRVMKK1BFUkxNT0RfTUFLRVZBUl9QUkVGSVggPSAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIHByZXByb2Nlc3NvciAgIAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRU5BQkxFX1BSRVBST0NFU1NJTkcgICA9IFlFUworTUFDUk9fRVhQQU5TSU9OICAgICAgICA9IE5PCitFWFBBTkRfT05MWV9QUkVERUYgICAgID0gTk8KK1NFQVJDSF9JTkNMVURFUyAgICAgICAgPSBZRVMKK0lOQ0xVREVfUEFUSCAgICAgICAgICAgPSAKK0lOQ0xVREVfRklMRV9QQVRURVJOUyAgPSAKK1BSRURFRklORUQgICAgICAgICAgICAgPSAKK0VYUEFORF9BU19ERUZJTkVEICAgICAgPSAKK1NLSVBfRlVOQ1RJT05fTUFDUk9TICAgPSBZRVMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbjo6YWRkaXRpb25zIHJlbGF0ZWQgdG8gZXh0ZXJuYWwgcmVmZXJlbmNlcyAgIAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVEFHRklMRVMgICAgICAgICAgICAgICA9IAorR0VORVJBVEVfVEFHRklMRSAgICAgICA9IAorQUxMRVhURVJOQUxTICAgICAgICAgICA9IE5PCitFWFRFUk5BTF9HUk9VUFMgICAgICAgID0gWUVTCitQRVJMX1BBVEggICAgICAgICAgICAgID0gL3Vzci9iaW4vcGVybAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgZG90IHRvb2wgICAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NMQVNTX0RJQUdSQU1TICAgICAgICAgPSBZRVMKK0hJREVfVU5ET0NfUkVMQVRJT05TICAgPSBZRVMKK0hBVkVfRE9UICAgICAgICAgICAgICAgPSBOTworQ0xBU1NfR1JBUEggICAgICAgICAgICA9IFlFUworQ09MTEFCT1JBVElPTl9HUkFQSCAgICA9IFlFUworVU1MX0xPT0sgICAgICAgICAgICAgICA9IE5PCitURU1QTEFURV9SRUxBVElPTlMgICAgID0gTk8KK0lOQ0xVREVfR1JBUEggICAgICAgICAgPSBZRVMKK0lOQ0xVREVEX0JZX0dSQVBIICAgICAgPSBZRVMKK0NBTExfR1JBUEggICAgICAgICAgICAgPSBOTworR1JBUEhJQ0FMX0hJRVJBUkNIWSAgICA9IFlFUworRE9UX0lNQUdFX0ZPUk1BVCAgICAgICA9IHBuZworRE9UX1BBVEggICAgICAgICAgICAgICA9IC9BcHBsaWNhdGlvbnMvRG94eWdlbi5hcHAvQ29udGVudHMvUmVzb3VyY2VzLworRE9URklMRV9ESVJTICAgICAgICAgICA9IAorTUFYX0RPVF9HUkFQSF9XSURUSCAgICA9IDEwMjQKK01BWF9ET1RfR1JBUEhfSEVJR0hUICAgPSAxMDI0CitNQVhfRE9UX0dSQVBIX0RFUFRIICAgID0gMTAwMAorR0VORVJBVEVfTEVHRU5EICAgICAgICA9IFlFUworRE9UX0NMRUFOVVAgICAgICAgICAgICA9IFlFUworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uOjphZGRpdGlvbnMgcmVsYXRlZCB0byB0aGUgc2VhcmNoIGVuZ2luZSAgIAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU0VBUkNIRU5HSU5FICAgICAgICAgICA9IE5PCmRpZmYgLS1naXQgYS91ZGRpMi9NYWtlZmlsZSBiL3VkZGkyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNzkyYzgKLS0tIC9kZXYvbnVsbAorKysgYi91ZGRpMi9NYWtlZmlsZQpAQCAtMCwwICsxLDQ3IEBACisuU1VGRklYRVM6IC53c2RsIC54c2QKK1dTREwySD0uLi93c2RsMmgKK1NPQVBDUFA9Li4vc29hcGNwcDIKK0NDPWdjYworQ1BQPWcrKworTElCUz0KKyNDT0ZMQUdTPS1nIC1EREVCVUcgLWZzdGFjay1jaGVjaworQ09GTEFHUz0tTzEKK0NXRkxBR1M9LVdhbGwKK0NJRkxBR1M9LUkuLgorQ01GTEFHUz0tRFdJVEhfTk9OQU1FU1BBQ0VTCitDRkxBR1M9ICQoQ1dGTEFHUykgJChDT0ZMQUdTKSAkKENJRkxBR1MpICQoQ01GTEFHUykKK2FsbDoJCQlleGFtcGxlMSBleGFtcGxlMgorZXhhbXBsZTE6CQlleGFtcGxlMS5jcHAgaW5xQ2xpZW50TGliLm8gaW5xdWlyZV92Mi5vIHN0ZHNvYXAyLm8gZW52Qy5vCisJCQkkKENQUCkgJChDRkxBR1MpIC1vIGV4YW1wbGUxIGV4YW1wbGUxLmNwcCBpbnFDbGllbnRMaWIubyBpbnF1aXJlX3YyLm8gc3Rkc29hcDIubyBlbnZDLm8KK2V4YW1wbGUyOgkJZXhhbXBsZTIuY3BwIGlucUNsaWVudExpYi5vIGlucXVpcmVfdjIubyBzdGRzb2FwMi5vIGVudkMubworCQkJJChDUFApICQoQ0ZMQUdTKSAtbyBleGFtcGxlMiBleGFtcGxlMi5jcHAgaW5xQ2xpZW50TGliLm8gaW5xdWlyZV92Mi5vIHN0ZHNvYXAyLm8gZW52Qy5vCitleGFtcGxlMzoJCWV4YW1wbGUzLmNwcCBwdWJDbGllbnRMaWIubyBwdWJsaXNoX3YyLm8gLi4vc3Rkc29hcDIuY3BwIGVudkMubworCQkJJChDUFApICQoQ0ZMQUdTKSAtRFdJVEhfT1BFTlNTTCAtbyBleGFtcGxlMyBleGFtcGxlMy5jcHAgcHViQ2xpZW50TGliLm8gcHVibGlzaF92Mi5vIC4uL3N0ZHNvYXAyLmNwcCBlbnZDLm8gLWxzc2wgLWxjcnlwdG8KK3VkZGlDbGllbnRMaWIuY3BwOgl1ZGRpX3YyLmggaW5xdWlyZV92Mi5oIHB1Ymxpc2hfdjIuaAorCQkJJChTT0FQQ1BQKSAtSS4uIC1wIHVkZGkgdWRkaV92Mi5oCisJCQkkKFNPQVBDUFApIC1JLi4gLXAgaW5xIGlucXVpcmVfdjIuaAorCQkJJChTT0FQQ1BQKSAtSS4uIC1wIHB1YiBwdWJsaXNoX3YyLmgKK2lucUNsaWVudExpYi5jcHA6CWlucXVpcmVfdjIuaAorCQkJJChTT0FQQ1BQKSAtSS4uIC1wIGlucSBpbnF1aXJlX3YyLmgKK3B1YkNsaWVudExpYi5jcHA6CXB1Ymxpc2hfdjIuaAorCQkJJChTT0FQQ1BQKSAtSS4uIC1wIHB1YiBwdWJsaXNoX3YyLmgKK2VudkMuY3BwOgorCQkJZWNobyAnJyA+IGVudi5oCisJCQkkKFNPQVBDUFApIC1JLi4gLXAgZW52IGVudi5oCitzdGRzb2FwMi5vOgkJLi4vc3Rkc29hcDIuY3BwCisJCQkkKENQUCkgJChDRkxBR1MpIC1jICQ8CisuYy5vOgorCQkJJChDUFApICQoQ0ZMQUdTKSAtYyAkPAorLmNwcC5vOgorCQkJJChDUFApICQoQ0ZMQUdTKSAtYyAkPAordWRkaV92Mi5oOgkJaW5xdWlyZV92Mi53c2RsIHB1Ymxpc2hfdjIud3NkbCB1ZGRpX3YyLnhzZCB1ZGRpMi10eXBlbWFwLmRhdAorCQkJJChXU0RMMkgpIC10dWRkaTItdHlwZW1hcC5kYXQgLW91ZGRpX3YyLmggaW5xdWlyZV92Mi53c2RsIHB1Ymxpc2hfdjIud3NkbAoraW5xdWlyZV92Mi5oOgkJaW5xdWlyZV92Mi53c2RsIHVkZGlfdjIueHNkIHVkZGkyLXR5cGVtYXAuZGF0CisJCQkkKFdTREwySCkgLXR1ZGRpMi10eXBlbWFwLmRhdCBpbnF1aXJlX3YyLndzZGwKK3B1Ymxpc2hfdjIuaDoJCXB1Ymxpc2hfdjIud3NkbCB1ZGRpX3YyLnhzZCB1ZGRpMi10eXBlbWFwLmRhdAorCQkJJChXU0RMMkgpIC10dWRkaTItdHlwZW1hcC5kYXQgcHVibGlzaF92Mi53c2RsCitjbGVhbjoJCQorCQkJcm0gLWYgKi5vICoubG9nICoueG1sICoubnNtYXAgKlN0dWIuaCAqUHJveHkuaCAqT2JqZWN0LmggaW5xQyouY3BwIGlucVMqLmNwcCBwdWJDKi5jcHAgcHViUyouY3BwIHVkZGlDKi5jcHAgdWRkaVMqLmNwcCBlbnYqLmggZW52Ki5jcHAKK2Rpc3RjbGVhbjoJCQorCQkJcm0gLWYgKi5vICoubG9nICoueG1sICoubnNtYXAgKlN0dWIuaCAqUHJveHkuaCAqT2JqZWN0LmggaW5xQyouY3BwIGlucVMqLmNwcCBwdWJDKi5jcHAgcHViUyouY3BwIHVkZGlDKi5jcHAgdWRkaVMqLmNwcCBlbnYqLmggZW52Ki5jcHAKKwkJCXJtIC1mIGV4YW1wbGUxIGV4YW1wbGUyIGV4YW1wbGUzCmRpZmYgLS1naXQgYS91ZGRpMi9SRUFETUUudHh0IGIvdWRkaTIvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODljNTE5Ci0tLSAvZGV2L251bGwKKysrIGIvdWRkaTIvUkVBRE1FLnR4dApAQCAtMCwwICsxLDM5IEBACitnU09BUCBVRERJIHYyCisKK1NlZSBkaXJlY3RvcnkgZG9jL2luZGV4Lmh0bWwgKGZyb20gdGhlIGdTT0FQIGluc3RhbGxhdGlvbiByb290KSBmb3IKK2RvY3VtZW50YXRpb24gYW5kIGV4YW1wbGVzIG9mIHRoZSBVRERJIHYyIEFQSSBnZW5lcmF0ZWQgd2l0aCBnU09BUCBhbmQKK0RveHlnZW4uIFRoZSBBUEkgaXMgd3JpdHRlbiBpbiBDKysuIEhvd2V2ZXIsIHdzZGwyaCBvcHRpb24gLWMgY2FuIGJlIHVzZWQgdG8KK2dlbmVyYXRlIEMgY29kZSBzZXJpYWxpemVycyBmb3IgVURESSB2MiBidXQgeW91IHdpbGwgaGF2ZSB0byBwcm9ncmFtIGF0IGEgbXVjaAorbG93ZXIgbGV2ZWwuCisKK1RoZSBBUEkgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgVURESSB2MiBpbnF1aXJ5IGFuZCBwdWJsaXNoIG9wZXJhdGlvbnMuCisKK0EgTWFrZWZpbGUgaXMgaW5jbHVkZWQgdG8gYnVpbGQgdHdvIGV4YW1wbGUgQysrIGNsaWVudHMsIGV4YW1wbGUxIGFuZCBleGFtcGxlMiwKK3RvIHNlYXJjaCBzZXJ2aWNlcyBhbmQgYnVzaW5lc3NlcywgcmVzcGVjdGl2ZWx5LgorCitDb2RlIGNhbiBiZSBnZW5lcmF0ZWQgZm9yIHRoZSBpbnF1aXJ5IEFQSSwgcHVibGlzaCBBUEksIGFuZCBib3RoIGNvbWJpbmVkLiBUbworZG8gc28sIHJ1biB3c2RsMmggb24gaW5xdWlyZV92Mi53c2RsIGFuZC9vciBwdWJsaXNoX3YyLndzZGwKKworQ09NUElMQVRJT04KKworVGhlIGJ1aWxkIHN0ZXBzIGFyZSBnZW5lcmFsbHkgYXMgZm9sbG93czoKKworIyBSdW4gd3NkbDJoIHdpdGggbWFwcGluZyBzcGVjaWZpZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQgb24gdGhlIFVEREkgV1NETChzKToKKyQgd3NkbDJoIC10dWRkaTItdHlwZW1hcC5kYXQgLW91ZGRpX3YyLmggaW5xdWlyZV92Mi53c2RsIHB1Ymxpc2hfdjIud3NkbAorCisjIFJ1biBzb2FwY3BwMiBvbiB0aGUgZ2VuZXJhdGVkIC5oIGZpbGUgKC1wdWRkaSBzYXZlcyBzb3VyY2VzIGFzIHVkZGlYWVopOgorJCBzb2FwY3BwMiAtSS4uIC1wdWRkaSB1ZGRpX3YyLmgKKworIyBDb21wbGV0ZSB0aGUgYnVpbGQ6CiskIGcrKyAtRFdJVEhfTk9OQU1FU1BBQ0VTIC1JLi4gLW8gbWFpbiBtYWluLmNwcCBpbnF1aXJlX3YyLmNwcCBwdWJsaXNoX3YyLmNwcCB1ZGRpQy5jcHAgdWRkaUNsaWVudC5jcHAgLi4vc3Rkc29hcDIuY3BwCisKKyMgVG8gYXZvaWQgbGluayBlcnJvcnMgY29tYmluaW5nIG11bHRpcGxlIHNlcnZpY2VzLCByZXBsYWNlIHRoZSBsYXN0IHN0ZXAgd2l0aDoKKyQgZWNobyAnJyA+IGVudi5oCiskIHNvYXBjcHAyIC1JLi4gLXBlbnYgZW52LmgKKyQgZysrIC1EV0lUSF9OT05BTUVTUEFDRVMgLUkuLiAtbyBtYWluIG1haW4uY3BwIGlucXVpcmVfdjIuY3BwIHB1Ymxpc2hfdjIuY3BwIHVkZGlDbGllbnRMaWIuY3BwIC4uL3N0ZHNvYXAyLmNwcAorCitVU0lORyBET1hZR0VOCisKK1RvIGdlbmVyYXRlIGRvY3VtZW50YXRpb24sIHVzZSBEb3h5Z2VuIG9uIHRoZSBnZW5lcmF0ZWQgaGVhZGVyIGZpbGUsIGUuZy4KK3VkZGlfdjIuaC4gUGFydCBvZiB0aGUgZG9jdW1lbnRhdGlvbiBpcyBpbmNsdWRlZCBpbiB0aGUgdWRkaTItdHlwZW1hcC5kYXQKK2ZpbGUsIHdoaWNoIHdhcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBoZWFkZXIgZmlsZShzKSB3aXRoIHdzZGwyaC4KZGlmZiAtLWdpdCBhL3VkZGkyL2NhY2VydHMucGVtIGIvdWRkaTIvY2FjZXJ0cy5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk4M2Q4OAotLS0gL2Rldi9udWxsCisrKyBiL3VkZGkyL2NhY2VydHMucGVtCkBAIC0wLDAgKzEsNDM1NCBAQAorQUJBZWNvbSAoc3ViLiwgQW0uIEJhbmtlcnMgQXNzbi4pIFJvb3QgQ0EKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IDgyOjEyOkY3Ojg5OkUxOjBCOjkxOjYwOkE0OkI2OjIyOjlGOjk0OjY4OjExOjkyCitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRCtEQ0NBdUNnQXdJQkFnSVJBTkFlUUpBQUFDZExBQUFBQVFBQUFBUXdEUVlKS29aSWh2Y05BUUVGQlFBdworZ1l3eEN6QUpCZ05WQkFZVEFsVlRNUTB3Q3dZRFZRUUlFd1JWZEdGb01SY3dGUVlEVlFRSEV3NVRZV3gwSUV4aAorYTJVZ1EybDBlVEVZTUJZR0ExVUVDaE1QV0dObGNuUWdSVm9nWW5rZ1JGTlVNUmd3RmdZRFZRUURFdzlZWTJWeQorZENCRldpQmllU0JFVTFReElUQWZCZ2txaGtpRzl3MEJDUUVXRW1OaFFHUnBaM05wWjNSeWRYTjBMbU52YlRBZQorRncwNU9UQTNNVFF4TmpFME1UaGFGdzB3T1RBM01URXhOakUwTVRoYU1JR01NUXN3Q1FZRFZRUUdFd0pWVXpFTgorTUFzR0ExVUVDQk1FVlhSaGFERVhNQlVHQTFVRUJ4TU9VMkZzZENCTVlXdGxJRU5wZEhreEdEQVdCZ05WQkFvVAorRDFoalpYSjBJRVZhSUdKNUlFUlRWREVZTUJZR0ExVUVBeE1QV0dObGNuUWdSVm9nWW5rZ1JGTlVNU0V3SHdZSgorS29aSWh2Y05BUWtCRmhKallVQmthV2R6YVdkMGNuVnpkQzVqYjIwd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQQorQTRJQkR3QXdnZ0VLQW9JQkFRQ3RWQmpldEwvM3JlaDBxdTJMZkkvQzFIVWExWVM1dG1MOGllL2tsMkdTK3gyNAorNFZwSE5KNmVCaUw3MCtvNHk3aUxCL2Nhb0JkM0Ixb3dITlFwT0NEWEowRFlVSk5EdjlJWW9pbDJCWEtxYTdacAorbUt0NUhoeGw5V3FML01VV3FxSnkybUR0VG00WkpYb0tIVERqVUp0Q1BFVHJvYkFnSHRzQ2Z2NDlINy9RQUlyYgorUUhhbUdLVVZwMWUyVXNJQkY1aDNqNHFCeGhxMGFpcm1yNm5XQUt6UDJCVkpmTnNib2Y2QitvZjUwNURCQXNENQorMEVMcGtXZ2xYOGEvaHpucGxRQmdLTCtETE1EblhyYlhOaGJuWUlkMjZPY25zaVVOaTNybHFoM2xXYzNPQ3c1dgoreHNpYzR4RFpoVG5UdDV2NnhycDhkTkpkZFZhcmRLU2lVYjlTZk81eEFnTUJBQUdqVXpCUk1BOEdBMVVkRXdFQgorL3dRRk1BTUJBZjh3SHdZRFZSMGpCQmd3Rm9BVUNDQnNadXVCQ214YzFiV21QRUhkSEphUkozY3dIUVlEVlIwTworQkJZRUZBZ2diR2JyZ1Fwc1hOVzFwanhCM1J5V2tTZDNNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUJhaDFpUAorTGF0MklXdFVETm54UWZaT3pTdWU0eCtib3kxLzJTdDlXTWhucENuMTZlelZ2WlkvbzNQNHhGczJmTkJqTERRNQorbTBpNFBXLzJGTVdlWSthbk5HN1Q2RE96eHp3WWJpT3VRNUtaUDVqRmFURHhOanV0dVRDQzFyWlpGcFlDQ3lrUworWWJRUmlmY01MNVNRaFpnb25GTnNmbVBkYy9RWi8wcUIwYkpTSS8wOFNqVE9XaHZnVUlydFQ0R1YyR0RuNU1RTgordTFnK1dQZE9hRzgrWjhuTGVwY1dKK3hDWVJSMnV3REY2d2c5Rlg5THRpSmRoenVROVBQQS9qZXo2ZGxpRE1ERAorV2E5Z3ZSOE4yNkUwSHpERVBZdXRzQjBFaysxZjFlUy9JREFFOUVqcE13SFJMcEFuVXJPYjNqb2NxNm1YZjV2cgord28zQ2JlemNFOU5HeFhsOAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOgorICAgICAgICAgICAgZDA6MWU6NDA6OTA6MDA6MDA6Mjc6NGI6MDA6MDA6MDA6MDE6MDA6MDA6MDA6MDQKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1VUywgU1Q9VXRhaCwgTD1TYWx0IExha2UgQ2l0eSwgTz1YY2VydCBFWiBieSBEU1QsIENOPVhjZXJ0IEVaIGJ5IERTVC9FbWFpbD1jYUBkaWdzaWd0cnVzdC5jb20KKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IEp1bCAxNCAxNjoxNDoxOCAxOTk5IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogSnVsIDExIDE2OjE0OjE4IDIwMDkgR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIFNUPVV0YWgsIEw9U2FsdCBMYWtlIENpdHksIE89WGNlcnQgRVogYnkgRFNULCBDTj1YY2VydCBFWiBieSBEU1QvRW1haWw9Y2FAZGlnc2lndHJ1c3QuY29tCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMjA0OCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMjA0OCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDphZDo1NDoxODpkZTpiNDpiZjpmNzphZDplODo3NDphYTplZDo4Yjo3YzoKKyAgICAgICAgICAgICAgICAgICAgOGY6YzI6ZDQ6NzU6MWE6ZDU6ODQ6Yjk6YjY6NjI6ZmM6ODk6ZWY6ZTQ6OTc6CisgICAgICAgICAgICAgICAgICAgIDYxOjkyOmZiOjFkOmI4OmUxOjVhOjQ3OjM0OjllOjllOjA2OjIyOmZiOmQzOgorICAgICAgICAgICAgICAgICAgICBlYTozODpjYjpiODo4YjowNzpmNzoxYTphMDoxNzo3NzowNzo1YTozMDoxYzoKKyAgICAgICAgICAgICAgICAgICAgZDQ6Mjk6Mzg6MjA6ZDc6Mjc6NDA6ZDg6NTA6OTM6NDM6YmY6ZDI6MTg6YTI6CisgICAgICAgICAgICAgICAgICAgIDI5Ojc2OjA1OjcyOmFhOjZiOmI2OjY5Ojk4OmFiOjc5OjFlOjFjOjY1OmY1OgorICAgICAgICAgICAgICAgICAgICA2YTo4YjpmYzpjNToxNjphYTphMjo3MjpkYTo2MDplZDo0ZTo2ZToxOToyNToKKyAgICAgICAgICAgICAgICAgICAgN2E6MGE6MWQ6MzA6ZTM6NTA6OWI6NDI6M2M6NDQ6ZWI6YTE6YjA6MjA6MWU6CisgICAgICAgICAgICAgICAgICAgIGRiOjAyOjdlOmZlOjNkOjFmOmJmOmQwOjAwOjhhOmRiOjQwOjc2OmE2OjE4OgorICAgICAgICAgICAgICAgICAgICBhNToxNTphNzo1NzpiNjo1MjpjMjowMToxNzo5ODo3Nzo4Zjo4YTo4MTpjNjoKKyAgICAgICAgICAgICAgICAgICAgMWE6YjQ6NmE6MmE6ZTY6YWY6YTk6ZDY6MDA6YWM6Y2Y6ZDg6MTU6NDk6N2M6CisgICAgICAgICAgICAgICAgICAgIGRiOjFiOmExOmZlOjgxOmZhOjg3OmY5OmQzOjkwOmMxOjAyOmMwOmY5OmQwOgorICAgICAgICAgICAgICAgICAgICA0MjplOTo5MTo2ODoyNTo1ZjpjNjpiZjo4NzozOTplOTo5NTowMDo2MDoyODoKKyAgICAgICAgICAgICAgICAgICAgYmY6ODM6MmM6YzA6ZTc6NWU6YjY6ZDc6MzY6MTY6ZTc6NjA6ODc6NzY6ZTg6CisgICAgICAgICAgICAgICAgICAgIGU3OjI3OmIyOjI1OjBkOjhiOjdhOmU1OmFhOjFkOmU1OjU5OmNkOmNlOjBiOgorICAgICAgICAgICAgICAgICAgICAwZTo2ZjpjNjpjODo5YzplMzoxMDpkOTo4NTozOTpkMzpiNzo5YjpmYTpjNjoKKyAgICAgICAgICAgICAgICAgICAgYmE6N2M6NzQ6ZDI6NWQ6NzU6NTY6YWI6NzQ6YTQ6YTI6NTE6YmY6NTI6N2M6CisgICAgICAgICAgICAgICAgICAgIGVlOjcxCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogY3JpdGljYWwKKyAgICAgICAgICAgICAgICBDQTpUUlVFCisgICAgICAgICAgICBYNTA5djMgQXV0aG9yaXR5IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICBrZXlpZDowODoyMDo2Qzo2NjpFQjo4MTowQTo2Qzo1QzpENTpCNTpBNjozQzo0MTpERDoxQzo5Njo5MToyNzo3NworCisgICAgICAgICAgICBYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAgMDg6MjA6NkM6NjY6RUI6ODE6MEE6NkM6NUM6RDU6QjU6QTY6M0M6NDE6REQ6MUM6OTY6OTE6Mjc6NzcKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgNWE6ODc6NTg6OGY6MmQ6YWI6NzY6MjE6NmI6NTQ6MGM6ZDk6ZjE6NDE6ZjY6NGU6Y2Q6MmI6CisgICAgICAgIDllOmUzOjFmOjliOmEzOjJkOjdmOmQ5OjJiOjdkOjU4OmM4OjY3OmE0OjI5OmY1OmU5OmVjOgorICAgICAgICBkNTpiZDo5NjozZjphMzo3MzpmODpjNDo1YjozNjo3YzpkMDo2MzoyYzozNDozOTo5Yjo0ODoKKyAgICAgICAgYjg6M2Q6NmY6ZjY6MTQ6YzU6OWU6NjM6ZTY6YTc6MzQ6NmU6ZDM6ZTg6MzM6YjM6Yzc6M2M6CisgICAgICAgIDE4OjZlOjIzOmFlOjQzOjkyOjk5OjNmOjk4OmM1OjY5OjMwOmYxOjM2OjNiOmFkOmI5OjMwOgorICAgICAgICA4MjpkNjpiNjo1OToxNjo5NjowMjowYjoyOToxMjo2MTpiNDoxMTo4OTpmNzowYzoyZjo5NDoKKyAgICAgICAgOTA6ODU6OTg6Mjg6OWM6NTM6NmM6N2U6NjM6ZGQ6NzM6ZjQ6MTk6ZmY6NGE6ODE6ZDE6YjI6CisgICAgICAgIDUyOjIzOmZkOjNjOjRhOjM0OmNlOjVhOjFiOmUwOjUwOjhhOmVkOjRmOjgxOjk1OmQ4OjYwOgorICAgICAgICBlNzplNDpjNDowZDpiYjo1ODozZTo1ODpmNzo0ZTo2ODo2ZjozZTo2NzpjOTpjYjo3YTo5NzoKKyAgICAgICAgMTY6Mjc6ZWM6NDI6NjE6MTQ6NzY6YmI6MDA6YzU6ZWI6MDg6M2Q6MTU6N2Y6NGI6YjY6MjI6CisgICAgICAgIDVkOjg3OjNiOjkwOmY0OmYzOmMwOmZlOjM3OmIzOmU5OmQ5OjYyOjBjOmMwOmMzOjU5OmFmOgorICAgICAgICA2MDpiZDoxZjowZDpkYjphMTozNDoxZjozMDpjNDozZDo4YjphZDpiMDoxZDowNDo5MzplZDoKKyAgICAgICAgNWY6ZDU6ZTQ6YmY6MjA6MzA6MDQ6ZjQ6NDg6ZTk6MzM6MDE6ZDE6MmU6OTA6Mjc6NTI6YjM6CisgICAgICAgIDliOmRlOjNhOjFjOmFiOmE5Ojk3OjdmOjliOmViOmMyOjhkOmMyOjZkOmVjOmRjOjEzOmQzOgorICAgICAgICA0NjpjNTo3OTo3YworCitBTlggTmV0d29yayBDQSBieSBEU1QKKz09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiBBODpFRDpERTpFQjo5Mzo4ODo2NjpEODoyRjpDMzpCRDoxRDpCRTo0NTpCRTo0RAorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURUVENDQXJhZ0F3SUJBZ0lFTm02aWJ6QU5CZ2txaGtpRzl3MEJBUVVGQURCU01Rc3dDUVlEVlFRR0V3SlYKK1V6RWtNQ0lHQTFVRUNoTWJSR2xuYVhSaGJDQlRhV2R1WVhSMWNtVWdWSEoxYzNRZ1EyOHVNUjB3R3dZRFZRUUwKK0V4UkVVMVFnS0VGT1dDQk9aWFIzYjNKcktTQkRRVEFlRncwNU9ERXlNRGt4TlRRMk5EaGFGdzB4T0RFeU1Ea3gKK05qRTJORGhhTUZJeEN6QUpCZ05WQkFZVEFsVlRNU1F3SWdZRFZRUUtFeHRFYVdkcGRHRnNJRk5wWjI1aGRIVnkKK1pTQlVjblZ6ZENCRGJ5NHhIVEFiQmdOVkJBc1RGRVJUVkNBb1FVNVlJRTVsZEhkdmNtc3BJRU5CTUlHZE1BMEcKK0NTcUdTSWIzRFFFQkFRVUFBNEdMQURDQmh3S0JnUUMwU0JHQVdLRFZwWmtQOWpjc1JMWnUwWHp6S211ZUViYUkKK0l3UmNjU1dlYWhKM0VXNi9hRGxscVBheTlxSVlzb2tWb0dlM2Vvd2lTR3YyaERRZnRzcjNHM0xMOGx0STA0Y2UKK0luWVRCTFNzYkpaLzV3NEl5VEpSTUMzVmdPZ2haN3J6WGdna0xBZFpuWkFhN2tiSnRhUWVsclJCa2RSLzBvMDQKK0pyQnZRMjRKZlFJQkE2T0NBVEF3Z2dFc01CRUdDV0NHU0FHRytFSUJBUVFFQXdJQUJ6QjBCZ05WSFI4RWJUQnIKK01HbWdaNkJscEdNd1lURUxNQWtHQTFVRUJoTUNWVk14SkRBaUJnTlZCQW9URzBScFoybDBZV3dnVTJsbmJtRjAKK2RYSmxJRlJ5ZFhOMElFTnZMakVkTUJzR0ExVUVDeE1VUkZOVUlDaEJUbGdnVG1WMGQyOXlheWtnUTBFeERUQUwKK0JnTlZCQU1UQkVOU1RERXdLd1lEVlIwUUJDUXdJb0FQTVRrNU9ERXlNRGt4TlRRMk5EaGFnUTh5TURFNE1USXcKK09URTFORFkwT0Zvd0N3WURWUjBQQkFRREFnRUdNQjhHQTFVZEl3UVlNQmFBRkl3V1ZYRE1GZ3BUWk1LbGhLcXoKK1pCZERQNEkyTUIwR0ExVWREZ1FXQkJTTUZsVnd6QllLVTJUQ3BZU3FzMlFYUXorQ05qQU1CZ05WSFJNRUJUQUQKK0FRSC9NQmtHQ1NxR1NJYjJmUWRCQUFRTU1Bb2JCRlkwTGpBREFnU1FNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0R0IKK0FFa2x5V0N4REYrcE9SRFR4VFJWZmM5NXd5bnIzdm5DUVBub1ZzWHdMK3owMmV4SVViaGpPRjZUYmhpV2hibksKK1VKeWt1T3BtSm1pVGhXOXZUSEhRdm5vTFBERzU5NzVwbmhEWDBVRG9yQlp4cTY2ck9PRndzY3FTRnVCZGhhWVkKK2dBWUFuT0dtR0VKUnAyaG9XZThtbEYrdE1ReitLUjRYQVlRM1crZ1NNcU5kCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAzICgweDIpCisgICAgICAgIFNlcmlhbCBOdW1iZXI6IDkxMzIyMDIwNyAoMHgzNjZlYTI2ZikKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1VUywgTz1EaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4sIE9VPURTVCAoQU5YIE5ldHdvcmspIENBCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBEZWMgIDkgMTU6NDY6NDggMTk5OCBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IERlYyAgOSAxNjoxNjo0OCAyMDE4IEdNVAorICAgICAgICBTdWJqZWN0OiBDPVVTLCBPPURpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLiwgT1U9RFNUIChBTlggTmV0d29yaykgQ0EKKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgxMDI0IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgxMDI0IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmI0OjQ4OjExOjgwOjU4OmEwOmQ1OmE1Ojk5OjBmOmY2OjM3OjJjOjQ0OgorICAgICAgICAgICAgICAgICAgICBiNjo2ZTpkMTo3YzpmMzoyYTo2Yjo5ZToxMTpiNjo4ODoyMzowNDo1Yzo3MToKKyAgICAgICAgICAgICAgICAgICAgMjU6OWU6NmE6MTI6Nzc6MTE6NmU6YmY6Njg6Mzk6NjU6YTg6ZjY6YjI6ZjY6CisgICAgICAgICAgICAgICAgICAgIGEyOjE4OmIyOjg5OjE1OmEwOjY3OmI3OjdhOjhjOjIyOjQ4OjZiOmY2Ojg0OgorICAgICAgICAgICAgICAgICAgICAzNDoxZjpiNjpjYTpmNzoxYjo3MjpjYjpmMjo1Yjo0ODpkMzo4NzoxZToyMjoKKyAgICAgICAgICAgICAgICAgICAgNzY6MTM6MDQ6YjQ6YWM6NmM6OTY6N2Y6ZTc6MGU6MDg6Yzk6MzI6NTE6MzA6CisgICAgICAgICAgICAgICAgICAgIDJkOmQ1OjgwOmU4OjIxOjY3OmJhOmYzOjVlOjA4OjI0OjJjOjA3OjU5OjlkOgorICAgICAgICAgICAgICAgICAgICA5MDoxYTplZTo0NjpjOTpiNTphNDoxZTo5NjpiNDo0MTo5MTpkNDo3ZjpkMjoKKyAgICAgICAgICAgICAgICAgICAgOGQ6Mzg6MjY6YjA6NmY6NDM6NmU6MDk6N2QKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogMyAoMHgzKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIE5ldHNjYXBlIENlcnQgVHlwZTogCisgICAgICAgICAgICAgICAgU1NMIENBLCBTL01JTUUgQ0EsIE9iamVjdCBTaWduaW5nIENBCisgICAgICAgICAgICBYNTA5djMgQ1JMIERpc3RyaWJ1dGlvbiBQb2ludHM6IAorICAgICAgICAgICAgICAgIERpck5hbWU6L0M9VVMvTz1EaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4vT1U9RFNUIChBTlggTmV0d29yaykgQ0EvQ049Q1JMMQorCisgICAgICAgICAgICBYNTA5djMgUHJpdmF0ZSBLZXkgVXNhZ2UgUGVyaW9kOiAKKyAgICAgICAgICAgICAgICBOb3QgQmVmb3JlOiBEZWMgIDkgMTU6NDY6NDggMTk5OCBHTVQsIE5vdCBBZnRlcjogRGVjICA5IDE1OjQ2OjQ4IDIwMTggR01UCisgICAgICAgICAgICBYNTA5djMgS2V5IFVzYWdlOiAKKyAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZSBTaWduLCBDUkwgU2lnbgorICAgICAgICAgICAgWDUwOXYzIEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAga2V5aWQ6OEM6MTY6NTU6NzA6Q0M6MTY6MEE6NTM6NjQ6QzI6QTU6ODQ6QUE6QjM6NjQ6MTc6NDM6M0Y6ODI6MzYKKworICAgICAgICAgICAgWDUwOXYzIFN1YmplY3QgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIDhDOjE2OjU1OjcwOkNDOjE2OjBBOjUzOjY0OkMyOkE1Ojg0OkFBOkIzOjY0OjE3OjQzOjNGOjgyOjM2CisgICAgICAgICAgICBYNTA5djMgQmFzaWMgQ29uc3RyYWludHM6IAorICAgICAgICAgICAgICAgIENBOlRSVUUKKyAgICAgICAgICAgIDEuMi44NDAuMTEzNTMzLjcuNjUuMDogCisgICAgICAgICAgICAgICAgMAorLi5WNC4wLi4uLgorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA0OToyNTpjOTo2MDpiMTowYzo1ZjphOTozOToxMDpkMzpjNTozNDo1NTo3ZDpjZjo3OTpjMzoKKyAgICAgICAgMjk6ZWI6ZGU6Zjk6YzI6NDA6Zjk6ZTg6NTY6YzU6ZjA6MmY6ZWM6ZjQ6ZDk6ZWM6NDg6NTE6CisgICAgICAgIGI4OjYzOjM4OjVlOjkzOjZlOjE4Ojk2Ojg1OmI5OmNhOjUwOjljOmE0OmI4OmVhOjY2OjI2OgorICAgICAgICA2ODo5Mzo4NTo2Zjo2Zjo0Yzo3MTpkMDpiZTo3YTowYjozYzozMTpiOTpmNzpiZTo2OTo5ZToKKyAgICAgICAgMTA6ZDc6ZDE6NDA6ZTg6YWM6MTY6NzE6YWI6YWU6YWI6Mzg6ZTE6NzA6YjE6Y2E6OTI6MTY6CisgICAgICAgIGUwOjVkOjg1OmE2OjE4OjgwOjA2OjAwOjljOmUxOmE2OjE4OjQyOjUxOmE3OjY4OjY4OjU5OgorICAgICAgICBlZjoyNjo5NDo1ZjphZDozMTowYzpmZToyOToxZToxNzowMTo4NDozNzo1YjplODoxMjozMjoKKyAgICAgICAgYTM6NWQKKworQW1lcmljYW4gRXhwcmVzcyBDQQorPT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiAxQzpENTo4RTo4MjpCRTo3MDo1NTo4RTozOTo2MTpERjpBRDo1MTpEQjo2QjpBMAorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUNrRENDQWZrQ0FnQ05NQTBHQ1NxR1NJYjNEUUVCQkFVQU1JR1BNUXN3Q1FZRFZRUUdFd0pWVXpFbk1DVUcKK0ExVUVDaE1lUVcxbGNtbGpZVzRnUlhod2NtVnpjeUJEYjIxd1lXNTVMQ0JKYm1NdU1TWXdKQVlEVlFRTEV4MUIKK2JXVnlhV05oYmlCRmVIQnlaWE56SUZSbFkyaHViMnh2WjJsbGN6RXZNQzBHQTFVRUF4TW1RVzFsY21sallXNGcKK1JYaHdjbVZ6Y3lCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3dIaGNOT1Rnd09ERTBNakl3TVRBd1doY04KK01EWXdPREUwTWpNMU9UQXdXakNCanpFTE1Ba0dBMVVFQmhNQ1ZWTXhKekFsQmdOVkJBb1RIa0Z0WlhKcFkyRnUKK0lFVjRjSEpsYzNNZ1EyOXRjR0Z1ZVN3Z1NXNWpMakVtTUNRR0ExVUVDeE1kUVcxbGNtbGpZVzRnUlhod2NtVnoKK2N5QlVaV05vYm05c2IyZHBaWE14THpBdEJnTlZCQU1USmtGdFpYSnBZMkZ1SUVWNGNISmxjM01nUTJWeWRHbG0KK2FXTmhkR1VnUVhWMGFHOXlhWFI1TUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FESjhrbVMKK2hjcjlGU20xQnJaRTdQeUlvL0tHenY4VVR5UWNrdm5DSThIT1E5OWROTWk0Rk96VktuQ1JTWlhYVnMyVThhbVQKKzBHZ2kzRTE5b0FweUtrZnFKZkNGQUY4MlZHSFBDL2szV21lZDZSL3BaRDl3bFdHbjBEQUMzaVlvcEdZREJPa3cKKys0OHpCL2x2WVllaWN0dnphSGhqWmxtcHliZG00Uld5U0RZcytRSURBUUFCTUEwR0NTcUdTSWIzRFFFQkJBVUEKK0E0R0JBR2dYWXJoemkweHM2MHFsUHF2bG5TN1N6WW9IVi9QR1daZDJGeGY0VW80bms5aFkyQ2hzOUtJRWVvckMKK2RpU3hBclRmS1BMMzg2aW5maU5JWVlqMEVXaXVKbDMyb1V0VEpXcllLaFFDRHVDSElHNmVHVnh6a0FzajRqR1gKK0l6L1ZJcUxUQm52YU4vWFh0VUZFRjNwRkF0bUZSV2JXanNmd2VneVpZaUpwVyszUworLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMSAoMHgwKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiAxNDEgKDB4OGQpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1VUywgTz1BbWVyaWNhbiBFeHByZXNzIENvbXBhbnksIEluYy4sIE9VPUFtZXJpY2FuIEV4cHJlc3MgVGVjaG5vbG9naWVzLCBDTj1BbWVyaWNhbiBFeHByZXNzIENlcnRpZmljYXRlIEF1dGhvcml0eQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogQXVnIDE0IDIyOjAxOjAwIDE5OTggR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBBdWcgMTQgMjM6NTk6MDAgMjAwNiBHTVQKKyAgICAgICAgU3ViamVjdDogQz1VUywgTz1BbWVyaWNhbiBFeHByZXNzIENvbXBhbnksIEluYy4sIE9VPUFtZXJpY2FuIEV4cHJlc3MgVGVjaG5vbG9naWVzLCBDTj1BbWVyaWNhbiBFeHByZXNzIENlcnRpZmljYXRlIEF1dGhvcml0eQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6Yzk6ZjI6NDk6OTI6ODU6Y2E6ZmQ6MTU6Mjk6YjU6MDY6YjY6NDQ6ZWM6CisgICAgICAgICAgICAgICAgICAgIGZjOjg4OmEzOmYyOjg2OmNlOmZmOjE0OjRmOjI0OjFjOjkyOmY5OmMyOjIzOgorICAgICAgICAgICAgICAgICAgICBjMTpjZTo0MzpkZjo1ZDozNDpjODpiODoxNDplYzpkNToyYTo3MDo5MTo0OToKKyAgICAgICAgICAgICAgICAgICAgOTU6ZDc6NTY6Y2Q6OTQ6ZjE6YTk6OTM6ZDA6Njg6MjI6ZGM6NGQ6N2Q6YTA6CisgICAgICAgICAgICAgICAgICAgIDBhOjcyOjJhOjQ3OmVhOjI1OmYwOjg1OjAwOjVmOjM2OjU0OjYxOmNmOjBiOgorICAgICAgICAgICAgICAgICAgICBmOTozNzo1YTo2Nzo5ZDplOToxZjplOTo2NDozZjo3MDo5NTo2MTphNzpkMDoKKyAgICAgICAgICAgICAgICAgICAgMzA6MDI6ZGU6MjY6Mjg6YTQ6NjY6MDM6MDQ6ZTk6MzA6ZmI6OGY6MzM6MDc6CisgICAgICAgICAgICAgICAgICAgIGY5OjZmOjYxOjg3OmEyOjcyOmRiOmYzOjY4Ojc4OjYzOjY2OjU5OmE5OmM5OgorICAgICAgICAgICAgICAgICAgICBiNzo2NjplMToxNTpiMjo0ODozNjoyYzpmOQorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA2ODoxNzo2MjpiODo3Mzo4Yjo0Yzo2YzplYjo0YTphNTozZTphYjplNTo5ZDoyZTpkMjpjZDoKKyAgICAgICAgOGE6MDc6NTc6ZjM6YzY6NTk6OTc6NzY6MTc6MTc6Zjg6NTI6OGU6Mjc6OTM6ZDg6NTg6ZDg6CisgICAgICAgIDI4OjZjOmY0OmEyOjA0OjdhOjhhOmMyOjc2OjI0OmIxOjAyOmI0OmRmOjI4OmYyOmY3OmYzOgorICAgICAgICBhODphNzo3ZToyMzo0ODo2MTo4ODpmNDoxMTo2ODphZToyNjo1ZDpmNjphMTo0Yjo1MzoyNToKKyAgICAgICAgNmE6ZDg6MmE6MTQ6MDI6MGU6ZTA6ODc6MjA6NmU6OWU6MTk6NWM6NzM6OTA6MGI6MjM6ZTI6CisgICAgICAgIDMxOjk3OjIzOjNmOmQ1OjIyOmEyOmQzOjA2OjdiOmRhOjM3OmY1OmQ3OmI1OjQxOjQ0OjE3OgorICAgICAgICA3YTo0NTowMjpkOTo4NTo0NTo2NjpkNjo4ZTpjNzpmMDo3YTowYzo5OTo2MjoyMjo2OTo1YjoKKyAgICAgICAgZWQ6ZDIKKworQW1lcmljYW4gRXhwcmVzcyBHbG9iYWwgQ0EKKz09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IDYzOjFCOjY2OjkzOjhDOkYzOjY2OkNCOjNDOjc5OjU3OkRDOjA1OjQ5OkVBOkRCCitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRUJEQ0NBdXlnQXdJQkFnSUNBSVV3RFFZSktvWklodmNOQVFFRkJRQXdnWll4Q3pBSkJnTlZCQVlUQWxWVAorTVNjd0pRWURWUVFLRXg1QmJXVnlhV05oYmlCRmVIQnlaWE56SUVOdmJYQmhibmtzSUVsdVl5NHhKakFrQmdOVgorQkFzVEhVRnRaWEpwWTJGdUlFVjRjSEpsYzNNZ1ZHVmphRzV2Ykc5bmFXVnpNVFl3TkFZRFZRUURFeTFCYldWeQorYVdOaGJpQkZlSEJ5WlhOeklFZHNiMkpoYkNCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3dIaGNOT1RndworT0RFME1Ua3dOakF3V2hjTk1UTXdPREUwTWpNMU9UQXdXakNCbGpFTE1Ba0dBMVVFQmhNQ1ZWTXhKekFsQmdOVgorQkFvVEhrRnRaWEpwWTJGdUlFVjRjSEpsYzNNZ1EyOXRjR0Z1ZVN3Z1NXNWpMakVtTUNRR0ExVUVDeE1kUVcxbAorY21sallXNGdSWGh3Y21WemN5QlVaV05vYm05c2IyZHBaWE14TmpBMEJnTlZCQU1UTFVGdFpYSnBZMkZ1SUVWNAorY0hKbGMzTWdSMnh2WW1Gc0lFTmxjblJwWm1sallYUmxJRUYxZEdodmNtbDBlVENDQVNJd0RRWUpLb1pJaHZjTgorQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQVBBa0ptWXUrK3RLYzNGVGlVZkxKanhUa3BSTXlzS0Z0UTM0dzFlOQorTHlvZmFoaTNWNjhNQUJiNm9MYVFwdmNhb1M1bUpzZG9vNHFUYVdhMVJsWXRIWUxxa0F3S0lzS0pVSTBGODlTcgorYzBId3p4S3NLTFJ2RkpTV1dVdWVrSFdHMytKSDYrSHBUME4raDhvbkdHYWV0Y0ZBWlgzOFlXK3RtM0xQcVY3WQorOC9uYWJwRVEra3kxNm40ZzNxazVML1dJNUlwdk5jWWduQ3VHUmpNSy9ERlZwV3VzRmtEcHpUVlpieklFdzN1MQorRDN0M2NQTkl1eXBTZ3M2dktXM3hFVzl0NWdjQUFlK2E4eVlOcG5rVFo2LzRxeHgxckpHMWE3NUFzTjZjRExGcAoraFJseGtSTkZ5dC9SL2VheXlwYURlZHZGdUtwYmVwQUxlRlkreHRlZmxFZ1I5YTBDQXdFQUFhTmFNRmd3RWdZRAorVlIwVEFRSC9CQWd3QmdFQi93SUJCVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXdGd1lEVlIwZ0JCQXdEakFNQmdvcQoraGtpRytROEtBUVVCTUJrR0ExVWREZ1FTQkJCWFJ6VjdOaWNScUFqOEwwWWw2eVJwTUEwR0NTcUdTSWIzRFFFQgorQlFVQUE0SUJBUURIWVVXb2luRzV2alRwSVhzaHpWWVRtTlV3WStrWXFrdVNGYjhMSGJ2c2ttbkZMc05oaStndworUmNzUVJzRnpPRnlMR2RJcjgwRHJmSEt6TGg0bjQzV1ZpaHliTHNTVkJZWnkwRlgwb1pKU2VWemI5UGpjNWRjUworc1VESFBJYmtNV1ZLeWpmRzNuWlhHV2xNUm1uOEtxMFdOM3FUclBjaFN5Mzc2NmxReThIUlFBamFBMm1IcHpkZQorVmNIRjdjVGpqZ3dtbDV0Y1YwdHk0L0lEQmRBQ095WURRSkNldmd0YlNReDQ4ZFZNVlNuZzl2MU1BNmxVQWpMUgorVjFxRnJFUHRXenNXWDZDL05kdExubnZvLytjTlBEdW9tMGxCUnZWelR2K1NaU0dERTFWeDYwazhmNGdhd2hJbworSmFGR1MwRTNsMy9zanZIVW9aYkNJTFplcmFrY0hoR2cKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjogMTMzICgweDg1KQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBPPUFtZXJpY2FuIEV4cHJlc3MgQ29tcGFueSwgSW5jLiwgT1U9QW1lcmljYW4gRXhwcmVzcyBUZWNobm9sb2dpZXMsIENOPUFtZXJpY2FuIEV4cHJlc3MgR2xvYmFsIENlcnRpZmljYXRlIEF1dGhvcml0eQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogQXVnIDE0IDE5OjA2OjAwIDE5OTggR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBBdWcgMTQgMjM6NTk6MDAgMjAxMyBHTVQKKyAgICAgICAgU3ViamVjdDogQz1VUywgTz1BbWVyaWNhbiBFeHByZXNzIENvbXBhbnksIEluYy4sIE9VPUFtZXJpY2FuIEV4cHJlc3MgVGVjaG5vbG9naWVzLCBDTj1BbWVyaWNhbiBFeHByZXNzIEdsb2JhbCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkKKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgyMDQ4IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgyMDQ4IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmYwOjI0OjI2OjY2OjJlOmZiOmViOjRhOjczOjcxOjUzOjg5OjQ3OmNiOgorICAgICAgICAgICAgICAgICAgICAyNjozYzo1Mzo5Mjo5NDo0YzpjYTpjMjo4NTpiNTowZDpmODpjMzo1NzpiZDoKKyAgICAgICAgICAgICAgICAgICAgMmY6MmE6MWY6NmE6MTg6Yjc6NTc6YWY6MGM6MDA6MTY6ZmE6YTA6YjY6OTA6CisgICAgICAgICAgICAgICAgICAgIGE2OmY3OjFhOmExOjJlOjY2OjI2OmM3OjY4OmEzOjhhOjkzOjY5OjY2OmI1OgorICAgICAgICAgICAgICAgICAgICA0Njo1NjoyZDoxZDo4MjplYTo5MDowYzowYToyMjpjMjo4OTo1MDo4ZDowNToKKyAgICAgICAgICAgICAgICAgICAgZjM6ZDQ6YWI6NzM6NDE6ZjA6Y2Y6MTI6YWM6Mjg6YjQ6NmY6MTQ6OTQ6OTY6CisgICAgICAgICAgICAgICAgICAgIDU5OjRiOjllOjkwOjc1Ojg2OmRmOmUyOjQ3OmViOmUxOmU5OjRmOjQzOjdlOgorICAgICAgICAgICAgICAgICAgICA4NzpjYToyNzoxODo2Njo5ZTpiNTpjMTo0MDo2NTo3ZDpmYzo2MTo2ZjphZDoKKyAgICAgICAgICAgICAgICAgICAgOWI6NzI6Y2Y6YTk6NWU6ZDg6ZjM6Zjk6ZGE6NmU6OTE6MTA6ZmE6NGM6YjU6CisgICAgICAgICAgICAgICAgICAgIGVhOjdlOjIwOmRlOmE5OjM5OjJmOmY1Ojg4OmU0OjhhOjZmOjM1OmM2OjIwOgorICAgICAgICAgICAgICAgICAgICA5YzoyYjo4Njo0NjozMzowYTpmYzozMTo1NTphNTo2YjphYzoxNjo0MDplOToKKyAgICAgICAgICAgICAgICAgICAgY2Q6MzU6NTk6NmY6MzI6MDQ6YzM6N2I6YjU6MGY6N2I6Nzc6NzA6ZjM6NDg6CisgICAgICAgICAgICAgICAgICAgIGJiOjJhOjUyOjgyOmNlOmFmOjI5OjZkOmYxOjExOjZmOjZkOmU2OjA3OjAwOgorICAgICAgICAgICAgICAgICAgICAwMTplZjo5YTpmMzoyNjowZDphNjo3OToxMzo2NzphZjpmODphYjoxYzo3NToKKyAgICAgICAgICAgICAgICAgICAgYWM6OTE6YjU6NmI6YmU6NDA6YjA6ZGU6OWM6MGM6YjE6Njk6ODU6MTk6NzE6CisgICAgICAgICAgICAgICAgICAgIDkxOjEzOjQ1OmNhOmRmOmQxOmZkOmU2OmIyOmNhOjk2OjgzOjc5OmRiOmM1OgorICAgICAgICAgICAgICAgICAgICBiODphYTo1Yjo3YTo5MDowYjo3ODo1NjozZTpjNjpkNzo5Zjo5NDo0ODoxMToKKyAgICAgICAgICAgICAgICAgICAgZjU6YWQKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgICAgIFg1MDl2MyBleHRlbnNpb25zOgorICAgICAgICAgICAgWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzOiBjcml0aWNhbAorICAgICAgICAgICAgICAgIENBOlRSVUUsIHBhdGhsZW46NQorICAgICAgICAgICAgWDUwOXYzIEtleSBVc2FnZTogY3JpdGljYWwKKyAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZSBTaWduLCBDUkwgU2lnbgorICAgICAgICAgICAgWDUwOXYzIENlcnRpZmljYXRlIFBvbGljaWVzOiAKKyAgICAgICAgICAgICAgICBQb2xpY3k6IDEuMi44NDAuMTEzODA3LjEwLjEuNS4xCisKKyAgICAgICAgICAgIFg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICA1Nzo0NzozNTo3QjozNjoyNzoxMTpBODowODpGQzoyRjo0NjoyNTpFQjoyNDo2OQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBjNzo2MTo0NTphODo4YTo3MTpiOTpiZTozNDplOToyMTo3YjoyMTpjZDo1NjoxMzo5ODpkNToKKyAgICAgICAgMzA6NjM6ZTk6MTg6YWE6NGI6OTI6MTU6YmY6MGI6MWQ6YmI6ZWM6OTI6Njk6YzU6MmU6YzM6CisgICAgICAgIDYxOjhiOmU4OjMwOjQ1OmNiOjEwOjQ2OmMxOjczOjM4OjVjOjhiOjE5OmQyOjJiOmYzOjQwOgorICAgICAgICBlYjo3Yzo3MjpiMzoyZToxZToyNzplMzo3NTo5NTo4YToxYzo5YjoyZTpjNDo5NTowNTo4NjoKKyAgICAgICAgNzI6ZDA6NTU6ZjQ6YTE6OTI6NTI6Nzk6NWM6ZGI6ZjQ6Zjg6ZGM6ZTU6ZDc6MTI6YjE6NDA6CisgICAgICAgIGM3OjNjOjg2OmU0OjMxOjY1OjRhOmNhOjM3OmM2OmRlOjc2OjU3OjE5OjY5OjRjOjQ2OjY5OgorICAgICAgICBmYzoyYTphZDoxNjozNzo3YTo5MzphYzpmNzoyMTo0YjoyZDpmYjplYjphOTo1MDpjYjpjMToKKyAgICAgICAgZDE6NDA6MDg6ZGE6MDM6Njk6ODc6YTc6Mzc6NWU6NTU6YzE6YzU6ZWQ6YzQ6ZTM6OGU6MGM6CisgICAgICAgIDI2Ojk3OjliOjVjOjU3OjRiOjcyOmUzOmYyOjAzOjA1OmQwOjAyOjNiOjI2OjAzOjQwOjkwOgorICAgICAgICA5ZTpiZTowYjo1Yjo0OTowYzo3ODpmMTpkNTo0Yzo1NToyOTplMDpmNjpmZDo0YzowMzphOToKKyAgICAgICAgNTQ6MDI6MzI6ZDE6NTc6NWE6ODU6YWM6NDM6ZWQ6NWI6M2I6MTY6NWY6YTA6YmY6MzU6ZGI6CisgICAgICAgIDRiOjllOjdiOmU4OmZmOmU3OjBkOjNjOjNiOmE4OjliOjQ5OjQxOjQ2OmY1OjczOjRlOmZmOgorICAgICAgICA5Mjo2NToyMTo4MzoxMzo1NTo3MTplYjo0OTozYzo3Zjo4ODoxYTpjMjoxMjoyODoyNTphMToKKyAgICAgICAgNDY6NGI6NDE6Mzc6OTc6N2Y6ZWM6OGU6ZjE6ZDQ6YTE6OTY6YzI6MjA6YjY6NWU6YWQ6YTk6CisgICAgICAgIDFjOjFlOjExOmEwCisKK0JlbFNpZ24gT2JqZWN0IFB1Ymxpc2hpbmcgQ0EKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogOEE6MDI6Rjg6REY6Qjg6RTE6ODQ6OUY6NUE6QzI6NjA6MjQ6NjU6RDE6NzM6RkIKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEQXpDQ0FteWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVFGQURDQnV6RUxNQWtHQTFVRUJoTUNRa1V4CitFVEFQQmdOVkJBY1RDRUp5ZFhOelpXeHpNUk13RVFZRFZRUUtFd3BDWld4VGFXZHVJRTVXTVRnd05nWURWUVFMCitFeTlDWld4VGFXZHVJRTlpYW1WamRDQlFkV0pzYVhOb2FXNW5JRU5sY25ScFptbGpZWFJsSUVGMWRHaHZjbWwwCitlVEVsTUNNR0ExVUVBeE1jUW1Wc1UybG5iaUJQWW1wbFkzUWdVSFZpYkdsemFHbHVaeUJEUVRFak1DRUdDU3FHCitTSWIzRFFFSkFSWVVkMlZpYldGemRHVnlRR0psYkhOcFoyNHVZbVV3SGhjTk9UY3dPVEU1TWpJd016QXdXaGNOCitNRGN3T1RFNU1qSXdNekF3V2pDQnV6RUxNQWtHQTFVRUJoTUNRa1V4RVRBUEJnTlZCQWNUQ0VKeWRYTnpaV3h6CitNUk13RVFZRFZRUUtFd3BDWld4VGFXZHVJRTVXTVRnd05nWURWUVFMRXk5Q1pXeFRhV2R1SUU5aWFtVmpkQ0JRCitkV0pzYVhOb2FXNW5JRU5sY25ScFptbGpZWFJsSUVGMWRHaHZjbWwwZVRFbE1DTUdBMVVFQXhNY1FtVnNVMmxuCitiaUJQWW1wbFkzUWdVSFZpYkdsemFHbHVaeUJEUVRFak1DRUdDU3FHU0liM0RRRUpBUllVZDJWaWJXRnpkR1Z5CitRR0psYkhOcFoyNHVZbVV3Z1o4d0RRWUpLb1pJaHZjTkFRRUJCUUFEZ1kwQU1JR0pBb0dCQU1RdUg3YS83b0pBCiszZm0zTGtIVm5nV3hXdEFtZkdKVkE1djh5MkhlUysvKzZKbitoN21JejVEYUR3azhkdDhYbDdiTFB5VkYvYlM4CitXQUMrc0ZxMkZJZVA3bWRrclIySWc3dG5uMlZoQUZnSWdGQ2ZnTWt4OWlxUUhDMzNTbXdROWlORFhUZ0pZSWhYCitBczBXYkJqOHpmdVNLbmZRbnBPalhZaGswTWo0WFZSUkFnTUJBQUdqRlRBVE1CRUdDV0NHU0FHRytFSUJBUVFFCitBd0lBQnpBTkJna3Foa2lHOXcwQkFRUUZBQU9CZ1FCamRoZDhsdkJUcFYwQkhGUE9LY0orZGF4TURhSUljN1JxCitNZjBDQmhTWjNGUUVwTC9JbG9hZk1VTXlKVmYyaGZZbHV6ZStvWGtqeVZjR0pYRnJSVS80OUFKQUZvSWlyMVRxCitNaWoyRGU2WnVrc0lVUTl1aGlNaFRDMGxpSUhFTGc3eEV5dzRpcFVDSk1NNmxXUGtrNDVJdXdoSGNsK3U1anBhCitSOVp4eHA2YVVnPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjogMSAoMHgxKQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9QkUsIEw9QnJ1c3NlbHMsIE89QmVsU2lnbiBOViwgT1U9QmVsU2lnbiBPYmplY3QgUHVibGlzaGluZyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHksIENOPUJlbFNpZ24gT2JqZWN0IFB1Ymxpc2hpbmcgQ0EvRW1haWw9d2VibWFzdGVyQGJlbHNpZ24uYmUKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IFNlcCAxOSAyMjowMzowMCAxOTk3IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogU2VwIDE5IDIyOjAzOjAwIDIwMDcgR01UCisgICAgICAgIFN1YmplY3Q6IEM9QkUsIEw9QnJ1c3NlbHMsIE89QmVsU2lnbiBOViwgT1U9QmVsU2lnbiBPYmplY3QgUHVibGlzaGluZyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHksIENOPUJlbFNpZ24gT2JqZWN0IFB1Ymxpc2hpbmcgQ0EvRW1haWw9d2VibWFzdGVyQGJlbHNpZ24uYmUKKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgxMDI0IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgxMDI0IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmM0OjJlOjFmOmI2OmJmOmVlOjgyOjQwOmRkOmY5OmI3OjJlOjQxOmQ1OgorICAgICAgICAgICAgICAgICAgICA5ZTowNTpiMTo1YTpkMDoyNjo3Yzo2Mjo1NTowMzo5YjpmYzpjYjo2MTpkZToKKyAgICAgICAgICAgICAgICAgICAgNGI6ZWY6ZmU6ZTg6OTk6ZmU6ODc6Yjk6ODg6Y2Y6OTA6ZGE6MGY6MDk6M2M6CisgICAgICAgICAgICAgICAgICAgIDc2OmRmOjE3Ojk3OmI2OmNiOjNmOjI1OjQ1OmZkOmI0OmJjOjU4OjAwOmJlOgorICAgICAgICAgICAgICAgICAgICBiMDo1YTpiNjoxNDo4Nzo4ZjplZTo2Nzo2NDphZDoxZDo4ODo4MzpiYjo2NzoKKyAgICAgICAgICAgICAgICAgICAgOWY6NjU6NjE6MDA6NTg6MDg6ODA6NTA6OWY6ODA6Yzk6MzE6ZjY6MmE6OTA6CisgICAgICAgICAgICAgICAgICAgIDFjOjJkOmY3OjRhOjZjOjEwOmY2OjIzOjQzOjVkOjM4OjA5OjYwOjg4OjU3OgorICAgICAgICAgICAgICAgICAgICAwMjpjZDoxNjo2YzoxODpmYzpjZDpmYjo5MjoyYTo3NzpkMDo5ZTo5MzphMzoKKyAgICAgICAgICAgICAgICAgICAgNWQ6ODg6NjQ6ZDA6Yzg6Zjg6NWQ6NTQ6NTEKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgICAgIFg1MDl2MyBleHRlbnNpb25zOgorICAgICAgICAgICAgTmV0c2NhcGUgQ2VydCBUeXBlOiAKKyAgICAgICAgICAgICAgICBTU0wgQ0EsIFMvTUlNRSBDQSwgT2JqZWN0IFNpZ25pbmcgQ0EKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA2Mzo3NjoxNzo3Yzo5NjpmMDo1MzphNTo1ZDowMToxYzo1MzpjZToyOTpjMjo3ZTo3NTphYzoKKyAgICAgICAgNGM6MGQ6YTI6MDg6NzM6YjQ6NmE6MzE6ZmQ6MDI6MDY6MTQ6OTk6ZGM6NTQ6MDQ6YTQ6YmY6CisgICAgICAgIGM4Ojk2Ojg2OjlmOjMxOjQzOjMyOjI1OjU3OmY2Ojg1OmY2OjI1OmJiOjM3OmJlOmExOjc5OgorICAgICAgICAyMzpjOTo1NzowNjoyNTo3MTo2Yjo0NTo0ZjpmODpmNDowMjo0MDoxNjo4MjoyMjphZjo1NDoKKyAgICAgICAgZWE6MzI6Mjg6ZjY6MGQ6ZWU6OTk6YmE6NGI6MDg6NTE6MGY6NmU6ODY6MjM6MjE6NGM6MmQ6CisgICAgICAgIDI1Ojg4OjgxOmM0OjJlOjBlOmYxOjEzOjJjOjM4OjhhOjk1OjAyOjI0OmMzOjNhOjk1OjYzOgorICAgICAgICBlNDo5Mzo4ZTo0ODpiYjowODo0Nzo3Mjo1ZjphZTplNjozYTo1YTo0NzpkNjo3MTpjNjo5ZToKKyAgICAgICAgOWE6NTIKKworQmVsU2lnbiBTZWN1cmUgU2VydmVyIENBCis9PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogM0Q6NUU6ODI6QzY6RDk6QUQ6RDk6OEI6OTM6NkI6MEM6MTA6Qjk6NDk6MEE6QjEKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlDOHpDQ0FseWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVFGQURDQnN6RUxNQWtHQTFVRUJoTUNRa1V4CitFVEFQQmdOVkJBY1RDRUp5ZFhOelpXeHpNUk13RVFZRFZRUUtFd3BDWld4VGFXZHVJRTVXTVRRd01nWURWUVFMCitFeXRDWld4VGFXZHVJRk5sWTNWeVpTQlRaWEoyWlhJZ1EyVnlkR2xtYVdOaGRHVWdRWFYwYUc5eWFYUjVNU0V3CitId1lEVlFRREV4aENaV3hUYVdkdUlGTmxZM1Z5WlNCVFpYSjJaWElnUTBFeEl6QWhCZ2txaGtpRzl3MEJDUUVXCitGSGRsWW0xaGMzUmxja0JpWld4emFXZHVMbUpsTUI0WERUazNNRGN4TmpJeU1EQTFORm9YRFRBM01EY3hOakl5CitNREExTkZvd2diTXhDekFKQmdOVkJBWVRBa0pGTVJFd0R3WURWUVFIRXdoQ2NuVnpjMlZzY3pFVE1CRUdBMVVFCitDaE1LUW1Wc1UybG5iaUJPVmpFME1ESUdBMVVFQ3hNclFtVnNVMmxuYmlCVFpXTjFjbVVnVTJWeWRtVnlJRU5sCitjblJwWm1sallYUmxJRUYxZEdodmNtbDBlVEVoTUI4R0ExVUVBeE1ZUW1Wc1UybG5iaUJUWldOMWNtVWdVMlZ5CitkbVZ5SUVOQk1TTXdJUVlKS29aSWh2Y05BUWtCRmhSM1pXSnRZWE4wWlhKQVltVnNjMmxuYmk1aVpUQ0JuekFOCitCZ2txaGtpRzl3MEJBUUVGQUFPQmpRQXdnWWtDZ1lFQTFnRVNlSkw0QkVKL3ljY2lnL3g4UjNBd0swa0xQalpBCitrQ2phSVhPRFUvTEUwUlpBd0ZQL3JxYkdKTE1uYmFXelBUbDNYYWdHOXVicHZHTVJUZ1psY0FxZGsvbWlRSXQvCitTb1FPalJheDFzd0laQklNNENoTHlLV0VrQmY3RVVZdTFxZUZHTXNZcm1PYXNGZ0c5QURQK01RSkdqVU1vZm51CitTdjF0M3Y0bXBUc0NBd0VBQWFNVk1CTXdFUVlKWUlaSUFZYjRRZ0VCQkFRREFnQ2dNQTBHQ1NxR1NJYjNEUUVCCitCQVVBQTRHQkFHdzltY01GNGgzSzVTMnFhSVdMUURFZ1poTm81bGc2aWRDTmRiTEZZdGg5Z28vMzJUS0JkL1kxCitXNFVwem1leXVid3JHWGpQODRmOVJ2R1ZkYklKVndNd3dYck5ja2R4Z01wOW5jbGxQRWNSSW4zNkJ3c29lS0dUCis2QVZGU09JeU1rbzk2Rk1jRUxmSGM0d0hVT0g1eVN0VFFmV0RqZVVKT1VxT0EyS3FRR09MCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAzICgweDIpCisgICAgICAgIFNlcmlhbCBOdW1iZXI6IDEgKDB4MSkKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPUJFLCBMPUJydXNzZWxzLCBPPUJlbFNpZ24gTlYsIE9VPUJlbFNpZ24gU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHksIENOPUJlbFNpZ24gU2VjdXJlIFNlcnZlciBDQS9FbWFpbD13ZWJtYXN0ZXJAYmVsc2lnbi5iZQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogSnVsIDE2IDIyOjAwOjU0IDE5OTcgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBKdWwgMTYgMjI6MDA6NTQgMjAwNyBHTVQKKyAgICAgICAgU3ViamVjdDogQz1CRSwgTD1CcnVzc2VscywgTz1CZWxTaWduIE5WLCBPVT1CZWxTaWduIFNlY3VyZSBTZXJ2ZXIgQ2VydGlmaWNhdGUgQXV0aG9yaXR5LCBDTj1CZWxTaWduIFNlY3VyZSBTZXJ2ZXIgQ0EvRW1haWw9d2VibWFzdGVyQGJlbHNpZ24uYmUKKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgxMDI0IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgxMDI0IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmQ2OjAxOjEyOjc4OjkyOmY4OjA0OjQyOjdmOmM5OmM3OjIyOjgzOmZjOgorICAgICAgICAgICAgICAgICAgICA3Yzo0Nzo3MDozMDoyYjo0OTowYjozZTozNjo0MDo5MDoyODpkYToyMTo3MzoKKyAgICAgICAgICAgICAgICAgICAgODM6NTM6ZjI6YzQ6ZDE6MTY6NDA6YzA6NTM6ZmY6YWU6YTY6YzY6MjQ6YjM6CisgICAgICAgICAgICAgICAgICAgIDI3OjZkOmE1OmIzOjNkOjM5Ojc3OjVkOmE4OjA2OmY2OmU2OmU5OmJjOjYzOgorICAgICAgICAgICAgICAgICAgICAxMTo0ZTowNjo2NTo3MDowYTo5ZDo5MzpmOTphMjo0MDo4Yjo3Zjo0YTo4NDoKKyAgICAgICAgICAgICAgICAgICAgMGU6OGQ6MTY6YjE6ZDY6Y2M6MDg6NjQ6MTI6MGM6ZTA6Mjg6NGI6Yzg6YTU6CisgICAgICAgICAgICAgICAgICAgIDg0OjkwOjE3OmZiOjExOjQ2OjJlOmQ2OmE3Ojg1OjE4OmNiOjE4OmFlOjYzOgorICAgICAgICAgICAgICAgICAgICA5YTpiMDo1ODowNjpmNDowMDpjZjpmODpjNDowOToxYTozNTowYzphMTpmOToKKyAgICAgICAgICAgICAgICAgICAgZWU6NGE6ZmQ6NmQ6ZGU6ZmU6MjY6YTU6M2IKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgICAgIFg1MDl2MyBleHRlbnNpb25zOgorICAgICAgICAgICAgTmV0c2NhcGUgQ2VydCBUeXBlOiAKKyAgICAgICAgICAgICAgICBTU0wgQ2xpZW50LCBTL01JTUUKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA2YzozZDo5OTpjMzowNTplMjoxZDpjYTplNToyZDphYTo2ODo4NTo4Yjo0MDozMToyMDo2NjoKKyAgICAgICAgMTM6Njg6ZTY6NTg6M2E6ODk6ZDA6OGQ6NzU6YjI6YzU6NjI6ZDg6N2Q6ODI6OGY6Zjc6ZDk6CisgICAgICAgIDMyOjgxOjc3OmY2OjM1OjViOjg1OjI5OmNlOjY3OmIyOmI5OmJjOjJiOjE5Ojc4OmNmOmYzOgorICAgICAgICA4NzpmZDo0NjpmMTo5NTo3NTpiMjowOTo1NzowMzozMDpjMTo3YTpjZDo3Mjo0Nzo3MTo4MDoKKyAgICAgICAgY2E6N2Q6OWQ6Yzk6NjU6M2M6NDc6MTE6MjI6N2Q6ZmE6MDc6MGI6Mjg6Nzg6YTE6OTM6ZTg6CisgICAgICAgIDA1OjQ1OjQ4OmUyOjMyOjMyOjRhOjNkOmU4OjUzOjFjOjEwOmI3OmM3OjczOjhjOjA3OjUwOgorICAgICAgICBlMTpmOTpjOToyYjo1Mzo0MTpmNTo4Mzo4ZDplNTowOTozOTo0YTo4ZTowMzo2MjphYTo0MDoKKyAgICAgICAgNjM6OGIKKworRGV1dHNjaGUgVGVsZWtvbSBBRyBSb290IENBCis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogNzc6REU6MDQ6OTQ6Nzc6RDA6MEM6NUY6QTc6QjE6RjQ6MzA6MTg6ODc6RkI6NTUKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlDampDQ0FmZWdBd0lCQWdJQkJqQU5CZ2txaGtpRzl3MEJBUVFGQURCdE1Rc3dDUVlEVlFRR0V3SkVSVEVjCitNQm9HQTFVRUNoTVRSR1YxZEhOamFHVWdWR1ZzWld0dmJTQkJSekVkTUJzR0ExVUVDeE1VVkdWc1pWTmxZeUJVCitjblZ6ZENCRFpXNTBaWEl4SVRBZkJnTlZCQU1UR0VSbGRYUnpZMmhsSUZSbGJHVnJiMjBnVW05dmRDQkRRVEFlCitGdzA1T0RFeU1Ea3dPVEV4TURCYUZ3MHdOREV5TURreU16VTVNREJhTUcweEN6QUpCZ05WQkFZVEFrUkZNUnd3CitHZ1lEVlFRS0V4TkVaWFYwYzJOb1pTQlVaV3hsYTI5dElFRkhNUjB3R3dZRFZRUUxFeFJVWld4bFUyVmpJRlJ5CitkWE4wSUVObGJuUmxjakVoTUI4R0ExVUVBeE1ZUkdWMWRITmphR1VnVkdWc1pXdHZiU0JTYjI5MElFTkJNSUdmCitNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R05BRENCaVFLQmdRRGRCU3o1QmJPNUV0ZHBjZmZxVmpBSVZ4UkRlN3NhCituRzB2VjJIWDR2VkVhKzQyUVpiMlpNN2h3Yks1cEJRRW1GRG9jUGlPTlpwOVNjRmhIVm11MmdZWWxYMnR6dXlwCit2dEVZRDBDUmRpcWo1ZjMraVJYMFYvZmdWZHAxclFEMExNRTF6TFJESmxWaVJDNEJKWnlLVy9EQjBBQTFlUDQxCiszcFJBWkhpRG9jdzVpUUlEQVFBQm96NHdQREFQQmdOVkhSTUVDREFHQVFIL0FnRUZNQTRHQTFVZER3RUIvd1FFCitBd0lCQmpBWkJnTlZIUTRFRWdRUUxJZFpINHNUZ0xMNWhwMCtFbjVZbGpBTkJna3Foa2lHOXcwQkFRUUZBQU9CCitnUUFQL25PMUI0aHZvQXVKNnNwUUg1VGVsQ3NMSjE1UDlSeVZKdHFNbGxTdEdaRTNRMTJyeVl1enpXK1lPVDN0CiszVFhqY2JmdEU1T0Q2SWJsS1RNVEU3dzFlLzBvTDNCWjFkTzBqU2dUV1R2STFYVDVSY0lIWUtxNEdGVDVwV2ovCisxd1hWajdZRk1TNUJTdlFRSDJCSEdndUxHVTJTVnlEUzcxQVo2TTNRY0x5OE5nPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjogNiAoMHg2KQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9REUsIE89RGV1dHNjaGUgVGVsZWtvbSBBRywgT1U9VGVsZVNlYyBUcnVzdCBDZW50ZXIsIENOPURldXRzY2hlIFRlbGVrb20gUm9vdCBDQQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogRGVjICA5IDA5OjExOjAwIDE5OTggR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBEZWMgIDkgMjM6NTk6MDAgMjAwNCBHTVQKKyAgICAgICAgU3ViamVjdDogQz1ERSwgTz1EZXV0c2NoZSBUZWxla29tIEFHLCBPVT1UZWxlU2VjIFRydXN0IENlbnRlciwgQ049RGV1dHNjaGUgVGVsZWtvbSBSb290IENBCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpkZDowNToyYzpmOTowNTpiMzpiOToxMjpkNzo2OTo3MTpmNzplYTo1NjoKKyAgICAgICAgICAgICAgICAgICAgMzA6MDg6NTc6MTQ6NDM6N2I6YmI6MWE6OWM6NmQ6MmY6NTc6NjE6ZDc6ZTI6CisgICAgICAgICAgICAgICAgICAgIGY1OjQ0OjZiOmVlOjM2OjQxOjk2OmY2OjY0OmNlOmUxOmMxOmIyOmI5OmE0OgorICAgICAgICAgICAgICAgICAgICAxNDowNDo5ODo1MDplODo3MDpmODo4ZTozNTo5YTo3ZDo0OTpjMTo2MToxZDoKKyAgICAgICAgICAgICAgICAgICAgNTk6YWU6ZGE6MDY6MTg6OTU6N2Q6YWQ6Y2U6ZWM6YTk6YmU6ZDE6MTg6MGY6CisgICAgICAgICAgICAgICAgICAgIDQwOjkxOjc2OjJhOmEzOmU1OmZkOmZlOjg5OjE1OmY0OjU3OmY3OmUwOjU1OgorICAgICAgICAgICAgICAgICAgICBkYTo3NTphZDowMDpmNDoyYzpjMTozNTpjYzpiNDo0MzoyNjo1NTo2Mjo0NDoKKyAgICAgICAgICAgICAgICAgICAgMmU6MDE6MjU6OWM6OGE6NWI6ZjA6YzE6ZDA6MDA6MzU6Nzg6ZmU6MzU6ZGU6CisgICAgICAgICAgICAgICAgICAgIDk0OjQwOjY0Ojc4OjgzOmExOmNjOjM5Ojg5CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogCisgICAgICAgICAgICAgICAgQ0E6VFJVRSwgcGF0aGxlbjo1CisgICAgICAgICAgICBYNTA5djMgS2V5IFVzYWdlOiBjcml0aWNhbAorICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIFNpZ24sIENSTCBTaWduCisgICAgICAgICAgICBYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAgMkM6ODc6NTk6MUY6OEI6MTM6ODA6QjI6Rjk6ODY6OUQ6M0U6MTI6N0U6NTg6OTYKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICAwZjpmZTo3MzpiNTowNzo4ODo2ZjphMDowYjo4OTplYTpjYTo1MDoxZjo5NDpkZTo5NDoyYjoKKyAgICAgICAgMGI6Mjc6NWU6NGY6ZjU6MWM6OTU6MjY6ZGE6OGM6OTY6NTQ6YWQ6MTk6OTE6Mzc6NDM6NWQ6CisgICAgICAgIGFiOmM5OjhiOmIzOmNkOjZmOjk4OjM5OjNkOmVkOmRkOjM1OmUzOjcxOmI3OmVkOjEzOjkzOgorICAgICAgICA4MzplODo4NjplNToyOTozMzoxMzoxMzpiYzozNTo3YjpmZDoyODoyZjo3MDo1OTpkNTpkMzoKKyAgICAgICAgYjQ6OGQ6Mjg6MTM6NTk6M2I6Yzg6ZDU6NzQ6Zjk6NDU6YzI6MDc6NjA6YWE6Yjg6MTg6NTQ6CisgICAgICAgIGY5OmE1OjY4OmZmOmQ3OjA1OmQ1OjhmOmI2OjA1OjMxOjJlOjQxOjRhOmY0OjEwOjFmOjYwOgorICAgICAgICA0NzoxYTowYjo4YjoxOTo0ZDo5Mjo1NzoyMDpkMjplZjo1MDoxOTplODpjZDpkMDo3MDpiYzoKKyAgICAgICAgYmM6MzYKKworRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uIEdsb2JhbCBDQSAxCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogMjU6N0E6QkE6ODM6MkU6QjY6QTI6MEI6REE6RkU6RjU6MDI6MEY6MDg6RDc6QUQKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlES1RDQ0FwS2dBd0lCQWdJRU5uQVZsakFOQmdrcWhraUc5dzBCQVFVRkFEQkdNUXN3Q1FZRFZRUUdFd0pWCitVekVrTUNJR0ExVUVDaE1iUkdsbmFYUmhiQ0JUYVdkdVlYUjFjbVVnVkhKMWMzUWdRMjh1TVJFd0R3WURWUVFMCitFd2hFVTFSRFFTQkZNVEFlRncwNU9ERXlNVEF4T0RFd01qTmFGdzB4T0RFeU1UQXhPRFF3TWpOYU1FWXhDekFKCitCZ05WQkFZVEFsVlRNU1F3SWdZRFZRUUtFeHRFYVdkcGRHRnNJRk5wWjI1aGRIVnlaU0JVY25WemRDQkRieTR4CitFVEFQQmdOVkJBc1RDRVJUVkVOQklFVXhNSUdkTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdMQURDQmh3S0JnUUNnCitiSUdwenpRZUpOMytoaWpNM29NditWN1VRdExvZEdCbUU1Z0dIS2xSRW1sdk1WVzVTWElBQ0g3VHBXSkVOeVNaCitqOW1EU0krWmJaVVR1ME03TGtsT2lEZkJ1MWgvL3VHOStMdGh6Zk5Id0ptbThmT1I2SGg4QU10aHlVUW5jV2xWCitTbjVKVGUyaW83NENUQURLQXFqdUFRSXhaQTlTTFJOMGRqYTFlclF0Y1FJQkE2T0NBU1F3Z2dFZ01CRUdDV0NHCitTQUdHK0VJQkFRUUVBd0lBQnpCb0JnTlZIUjhFWVRCZk1GMmdXNkJacEZjd1ZURUxNQWtHQTFVRUJoTUNWVk14CitKREFpQmdOVkJBb1RHMFJwWjJsMFlXd2dVMmxuYm1GMGRYSmxJRlJ5ZFhOMElFTnZMakVSTUE4R0ExVUVDeE1JCitSRk5VUTBFZ1JURXhEVEFMQmdOVkJBTVRCRU5TVERFd0t3WURWUjBRQkNRd0lvQVBNVGs1T0RFeU1UQXhPREV3CitNak5hZ1E4eU1ERTRNVEl4TURFNE1UQXlNMW93Q3dZRFZSMFBCQVFEQWdFR01COEdBMVVkSXdRWU1CYUFGR3A1CitmcEZwUmhnVENnSjNwVmxiWUpnbERxTDRNQjBHQTFVZERnUVdCQlJxZVg2UmFVWVlFd29DZDZWWlcyQ1lKUTZpCisrREFNQmdOVkhSTUVCVEFEQVFIL01Ca0dDU3FHU0liMmZRZEJBQVFNTUFvYkJGWTBMakFEQWdTUU1BMEdDU3FHCitTSWIzRFFFQkJRVUFBNEdCQUNJUzJIb2QzSUVHdGdsbHNvZklIMTYwTCtuRUh2STh3YnNFa0JGS2cwNStrN2xOCitRc2VTSnFCY05KbzRjdmo5YXhZK0lPNkNpekVxa3phRkk0aUtQQU5vMDhrSkQwMzhiS1RhS0hLVERvbUFzSDMrCitnRzlsYlJnemw0dkNhNG51WUQzSW0rOS9LekppYzVQTFBPTjc0blo0UmJ5aGt3UzdocDg2VzBONnc0cGwKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjogOTEzMzE1MjIyICgweDM2NzAxNTk2KQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBPPURpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLiwgT1U9RFNUQ0EgRTEKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IERlYyAxMCAxODoxMDoyMyAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogRGVjIDEwIDE4OjQwOjIzIDIwMTggR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89RGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uLCBPVT1EU1RDQSBFMQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6YTA6NmM6ODE6YTk6Y2Y6MzQ6MWU6MjQ6ZGQ6ZmU6ODY6Mjg6Y2M6ZGU6CisgICAgICAgICAgICAgICAgICAgIDgzOjJmOmY5OjVlOmQ0OjQyOmQyOmU4Ojc0OjYwOjY2OjEzOjk4OjA2OjFjOgorICAgICAgICAgICAgICAgICAgICBhOTo1MToxMjo2OTo2ZjozMTo1NTpiOTo0OTo3MjowMDowODo3ZTpkMzphNToKKyAgICAgICAgICAgICAgICAgICAgNjI6NDQ6Mzc6MjQ6OTk6OGY6ZDk6ODM6NDg6OGY6OTk6NmQ6OTU6MTM6YmI6CisgICAgICAgICAgICAgICAgICAgIDQzOjNiOjJlOjQ5OjRlOjg4OjM3OmMxOmJiOjU4OjdmOmZlOmUxOmJkOmY4OgorICAgICAgICAgICAgICAgICAgICBiYjo2MTpjZDpmMzo0NzpjMDo5OTphNjpmMTpmMzo5MTplODo3ODo3YzowMDoKKyAgICAgICAgICAgICAgICAgICAgY2I6NjE6Yzk6NDQ6Mjc6NzE6Njk6NTU6NGE6N2U6NDk6NGQ6ZWQ6YTI6YTM6CisgICAgICAgICAgICAgICAgICAgIGJlOjAyOjRjOjAwOmNhOjAyOmE4OmVlOjAxOjAyOjMxOjY0OjBmOjUyOjJkOgorICAgICAgICAgICAgICAgICAgICAxMzo3NDo3NjozNjpiNTo3YTpiNDoyZDo3MQorICAgICAgICAgICAgICAgIEV4cG9uZW50OiAzICgweDMpCisgICAgICAgIFg1MDl2MyBleHRlbnNpb25zOgorICAgICAgICAgICAgTmV0c2NhcGUgQ2VydCBUeXBlOiAKKyAgICAgICAgICAgICAgICBTU0wgQ0EsIFMvTUlNRSBDQSwgT2JqZWN0IFNpZ25pbmcgQ0EKKyAgICAgICAgICAgIFg1MDl2MyBDUkwgRGlzdHJpYnV0aW9uIFBvaW50czogCisgICAgICAgICAgICAgICAgRGlyTmFtZTovQz1VUy9PPURpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLi9PVT1EU1RDQSBFMS9DTj1DUkwxCisKKyAgICAgICAgICAgIFg1MDl2MyBQcml2YXRlIEtleSBVc2FnZSBQZXJpb2Q6IAorICAgICAgICAgICAgICAgIE5vdCBCZWZvcmU6IERlYyAxMCAxODoxMDoyMyAxOTk4IEdNVCwgTm90IEFmdGVyOiBEZWMgMTAgMTg6MTA6MjMgMjAxOCBHTVQKKyAgICAgICAgICAgIFg1MDl2MyBLZXkgVXNhZ2U6IAorICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIFNpZ24sIENSTCBTaWduCisgICAgICAgICAgICBYNTA5djMgQXV0aG9yaXR5IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICBrZXlpZDo2QTo3OTo3RTo5MTo2OTo0NjoxODoxMzowQTowMjo3NzpBNTo1OTo1Qjo2MDo5ODoyNTowRTpBMjpGOAorCisgICAgICAgICAgICBYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAgNkE6Nzk6N0U6OTE6Njk6NDY6MTg6MTM6MEE6MDI6Nzc6QTU6NTk6NUI6NjA6OTg6MjU6MEU6QTI6RjgKKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogCisgICAgICAgICAgICAgICAgQ0E6VFJVRQorICAgICAgICAgICAgMS4yLjg0MC4xMTM1MzMuNy42NS4wOiAKKyAgICAgICAgICAgICAgICAwCisuLlY0LjAuLi4uCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDIyOjEyOmQ4OjdhOjFkOmRjOjgxOjA2OmI2OjA5OjY1OmIyOjg3OmM4OjFmOjVlOmI0OjJmOgorICAgICAgICBlOTpjNDoxZTpmMjozYzpjMTpiYjowNDo5MDoxMTo0YTo4Mzo0ZTo3ZTo5MzpiOTo0ZDo0MjoKKyAgICAgICAgYzc6OTI6MjY6YTA6NWM6MzQ6OWE6Mzg6NzI6Zjg6ZmQ6NmI6MTY6M2U6MjA6ZWU6ODI6OGI6CisgICAgICAgIDMxOjJhOjkzOjM2Ojg1OjIzOjg4OjhhOjNjOjAzOjY4OmQzOmM5OjA5OjBmOjRkOmZjOjZjOgorICAgICAgICBhNDpkYToyODo3Mjo5MzowZTo4OTo4MDpiMDo3ZDpmZTo4MDo2Zjo2NTo2ZDoxODozMzo5NzoKKyAgICAgICAgOGI6YzI6NmI6ODk6ZWU6NjA6M2Q6Yzg6OWI6ZWY6N2Y6MmI6MzI6NjI6NzM6OTM6Y2I6M2M6CisgICAgICAgIGUzOjdiOmUyOjc2Ojc4OjQ1OmJjOmExOjkzOjA0OmJiOjg2OjlmOjNhOjViOjQzOjdhOmMzOgorICAgICAgICA4YTo2NQorCitEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4gR2xvYmFsIENBIDIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiA2QzpDOTpBNzo2RTo0NzpGMTowQzpFMzo1MzozQjo3ODo0Qzo0RDpDMjo2QTpDNQorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUQyRENDQXNBQ0VRRFFIa0NMQUFBQ2ZBQUFBQUlBQUFBQk1BMEdDU3FHU0liM0RRRUJCUVVBTUlHcE1Rc3cKK0NRWURWUVFHRXdKMWN6RU5NQXNHQTFVRUNCTUVWWFJoYURFWE1CVUdBMVVFQnhNT1UyRnNkQ0JNWVd0bElFTnAKK2RIa3hKREFpQmdOVkJBb1RHMFJwWjJsMFlXd2dVMmxuYm1GMGRYSmxJRlJ5ZFhOMElFTnZMakVSTUE4R0ExVUUKK0N4TUlSRk5VUTBFZ1dERXhGakFVQmdOVkJBTVREVVJUVkNCU2IyOTBRMEVnV0RFeElUQWZCZ2txaGtpRzl3MEIKK0NRRVdFbU5oUUdScFozTnBaM1J5ZFhOMExtTnZiVEFlRncwNU9ERXlNREV4T0RFNE5UVmFGdzB3T0RFeE1qZ3gKK09ERTROVFZhTUlHcE1Rc3dDUVlEVlFRR0V3SjFjekVOTUFzR0ExVUVDQk1FVlhSaGFERVhNQlVHQTFVRUJ4TU8KK1UyRnNkQ0JNWVd0bElFTnBkSGt4SkRBaUJnTlZCQW9URzBScFoybDBZV3dnVTJsbmJtRjBkWEpsSUZSeWRYTjAKK0lFTnZMakVSTUE4R0ExVUVDeE1JUkZOVVEwRWdXREV4RmpBVUJnTlZCQU1URFVSVFZDQlNiMjkwUTBFZ1dERXgKK0lUQWZCZ2txaGtpRzl3MEJDUUVXRW1OaFFHUnBaM05wWjNSeWRYTjBMbU52YlRDQ0FTSXdEUVlKS29aSWh2Y04KK0FRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFOTEdKcmJucFQzQnhHalZVRzlUeFc5SkV3bTRyeXhJalJScW94ZGYKK1d2blRMblV2MkNoaTBaTXYvRTNVcTRmbENNZVo1NUkvZGIzckpiUVZ3WnNaUGRKRWpkZDBJRzAzQW85cGsxdUsKK3hCbWQ5TElPL0Jac3ViRUZrb1BSaFN4Z2xENUZWYURacXdnaDVtRG9PM1R5bVZCUmFOQURMYkdBdnFQWVVyQkUKK3pVTktjSTVZaFpYaFRpeldMVUZ2MW9UbnlKaEV5a2ZiTENTbGFTYlBhN2duWXNQMHlYcVNJKzBUWjRLdVJTNUYKKzVYNXlQNFdkbEdJUTVqeVJvYTEzQU9BVjdQT0VnSEo2am01Z2w4Y2tXUkEwZzF2aHBhUnB0bGMxSEhoWnh0TXYKK09uTm43cFRLQkJNRllnWndJN1AwZk81RjJXUUxXMG1xcEVQT0pzUkVFbXk0M1hrQ0F3RUFBVEFOQmdrcWhraUcKKzl3MEJBUVVGQUFPQ0FRRUFvamV5UDJuNzE0WjVWRWt4bFRNcjg5RUpGRWxpWUlhbHNCSGlVTUlkQmxjK0xlZ3oKK1pMNmJxcTFmRzAzVW1aV2lpNXJKWW5LMWFlclpXS3MxN1JXaVE5YTJ2QWQ1WldSemZkZDV5bnZWV2xIRzRWTUUKK2xvMDR6Nk1YckRseGF3SERpMU04WStudWVjRGt2cEl5Wkhxekg1ZVVZcjNxc2lBVmxmdVg4bmd2WXpaQU9PTkcKK0R4M2RySlhLNTB1UWU3RkxxZFRGNjVyYXF0V2psQlJHalMwZjh6cldrenIyUG5uODZPYXdkZTN1UGNsd3gxMnEKK2dVdEdKUnpIYkJYamxVNFBxakkzbEFvWEpKSVRoRmpTWTI4cjkrWmJZZ3NURjdBTlVreisvbTljNHBGdUhmMmsKK1l0ZG8rbzU2VDlJSTJwUGM4SklSZXREY2NwTU1jNU5paFdqUTlBPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDEgKDB4MCkKKyAgICAgICAgU2VyaWFsIE51bWJlcjoKKyAgICAgICAgICAgIGQwOjFlOjQwOjhiOjAwOjAwOjAyOjdjOjAwOjAwOjAwOjAyOjAwOjAwOjAwOjAxCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9dXMsIFNUPVV0YWgsIEw9U2FsdCBMYWtlIENpdHksIE89RGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uLCBPVT1EU1RDQSBYMSwgQ049RFNUIFJvb3RDQSBYMS9FbWFpbD1jYUBkaWdzaWd0cnVzdC5jb20KKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IERlYyAgMSAxODoxODo1NSAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogTm92IDI4IDE4OjE4OjU1IDIwMDggR01UCisgICAgICAgIFN1YmplY3Q6IEM9dXMsIFNUPVV0YWgsIEw9U2FsdCBMYWtlIENpdHksIE89RGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uLCBPVT1EU1RDQSBYMSwgQ049RFNUIFJvb3RDQSBYMS9FbWFpbD1jYUBkaWdzaWd0cnVzdC5jb20KKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgyMDQ4IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgyMDQ4IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmQyOmM2OjI2OmI2OmU3OmE1OjNkOmMxOmM0OjY4OmQ1OjUwOjZmOjUzOgorICAgICAgICAgICAgICAgICAgICBjNTo2Zjo0OToxMzowOTpiODphZjoyYzo0ODo4ZDoxNDo2YTphMzoxNzo1ZjoKKyAgICAgICAgICAgICAgICAgICAgNWE6Zjk6ZDM6MmU6NzU6MmY6ZDg6Mjg6NjI6ZDE6OTM6MmY6ZmM6NGQ6ZDQ6CisgICAgICAgICAgICAgICAgICAgIGFiOjg3OmU1OjA4OmM3Ojk5OmU3OjkyOjNmOjc1OmJkOmViOjI1OmI0OjE1OgorICAgICAgICAgICAgICAgICAgICBjMTo5YjoxOTozZDpkMjo0NDo4ZDpkNzo3NDoyMDo2ZDozNzowMjo4Zjo2OToKKyAgICAgICAgICAgICAgICAgICAgOTM6NWI6OGE6YzQ6MTk6OWQ6ZjQ6YjI6MGU6ZmM6MTY6NmM6Yjk6YjE6MDU6CisgICAgICAgICAgICAgICAgICAgIDkyOjgzOmQxOjg1OjJjOjYwOjk0OjNlOjQ1OjU1OmEwOmQ5OmFiOjA4OjIxOgorICAgICAgICAgICAgICAgICAgICBlNjo2MDplODozYjo3NDpmMjo5OTo1MDo1MTo2ODpkMDowMzoyZDpiMTo4MDoKKyAgICAgICAgICAgICAgICAgICAgYmU6YTM6ZDg6NTI6YjA6NDQ6Y2Q6NDM6NGE6NzA6OGU6NTg6ODU6OTU6ZTE6CisgICAgICAgICAgICAgICAgICAgIDRlOjJjOmQ2OjJkOjQxOjZmOmQ2Ojg0OmU3OmM4Ojk4OjQ0OmNhOjQ3OmRiOgorICAgICAgICAgICAgICAgICAgICAyYzoyNDphNTo2OToyNjpjZjo2YjpiODoyNzo2MjpjMzpmNDpjOTo3YTo5MjoKKyAgICAgICAgICAgICAgICAgICAgMjM6ZWQ6MTM6Njc6ODI6YWU6NDU6MmU6NDU6ZTU6N2U6NzI6M2Y6ODU6OWQ6CisgICAgICAgICAgICAgICAgICAgIDk0OjYyOjEwOmU2OjNjOjkxOmExOmFkOjc3OjAwOmUwOjE1OmVjOmYzOjg0OgorICAgICAgICAgICAgICAgICAgICA4MDo3Mjo3YTo4ZTo2ZTo2MDo5NzpjNzoyNDo1OToxMDozNDo4Mzo1YjplMToKKyAgICAgICAgICAgICAgICAgICAgYTU6YTQ6Njk6YjY6NTc6MzU6MWM6Nzg6NTk6YzY6ZDM6MmY6M2E6NzM6Njc6CisgICAgICAgICAgICAgICAgICAgIGVlOjk0OmNhOjA0OjEzOjA1OjYyOjA2OjcwOjIzOmIzOmY0OjdjOmVlOjQ1OgorICAgICAgICAgICAgICAgICAgICBkOTo2NDowYjo1Yjo0OTphYTphNDo0MzpjZToyNjpjNDo0NDoxMjo2YzpiODoKKyAgICAgICAgICAgICAgICAgICAgZGQ6NzkKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIGEyOjM3OmIyOjNmOjY5OmZiOmQ3Ojg2Ojc5OjU0OjQ5OjMxOjk1OjMzOjJiOmYzOmQxOjA5OgorICAgICAgICAxNDo0OTo2Mjo2MDo4NjphNTpiMDoxMTplMjo1MDpjMjoxZDowNjo1NzozZToyZDplODozMzoKKyAgICAgICAgNjQ6YmU6OWI6YWE6YWQ6NWY6MWI6NGQ6ZDQ6OTk6OTU6YTI6OGI6OWE6Yzk6NjI6NzI6YjU6CisgICAgICAgIDY5OmVhOmQ5OjU4OmFiOjM1OmVkOjE1OmEyOjQzOmQ2OmI2OmJjOjA3Ojc5OjY1OjY0OjczOgorICAgICAgICA3ZDpkNzo3OTpjYTo3YjpkNTo1YTo1MTpjNjplMTo1MzowNDo5Njo4ZDozODpjZjphMzoxNzoKKyAgICAgICAgYWM6Mzk6NzE6NmI6MDE6YzM6OGI6NTM6M2M6NjM6ZTk6ZWU6Nzk6YzA6ZTQ6YmU6OTI6MzI6CisgICAgICAgIDY0OjdhOmIzOjFmOjk3Ojk0OjYyOmJkOmVhOmIyOjIwOjE1Ojk1OmZiOjk3OmYyOjc4OjJmOgorICAgICAgICA2MzozNjo0MDozODplMzo0NjowZjoxZDpkZDphYzo5NTpjYTplNzo0Yjo5MDo3YjpiMTo0YjoKKyAgICAgICAgYTk6ZDQ6YzU6ZWI6OWE6ZGE6YWE6ZDU6YTM6OTQ6MTQ6NDY6OGQ6MmQ6MWY6ZjM6M2E6ZDY6CisgICAgICAgIDkzOjNhOmY2OjNlOjc5OmZjOmU4OmU2OmIwOjc1OmVkOmVlOjNkOmM5OjcwOmM3OjVkOmFhOgorICAgICAgICA4MTo0Yjo0NjoyNToxYzpjNzo2YzoxNTplMzo5NTo0ZTowZjphYTozMjozNzo5NDowYToxNzoKKyAgICAgICAgMjQ6OTI6MTM6ODQ6NTg6ZDI6NjM6NmY6MmI6Zjc6ZTY6NWI6NjI6MGI6MTM6MTc6YjA6MGQ6CisgICAgICAgIDUyOjRjOmZlOmZlOjZmOjVjOmUyOjkxOjZlOjFkOmZkOmE0OjYyOmQ3OjY4OmZhOjhlOjdhOgorICAgICAgICA0ZjpkMjowODpkYTo5MzpkYzpmMDo5MjoxMTo3YTpkMDpkYzo3Mjo5MzowYzo3Mzo5Mzo2MjoKKyAgICAgICAgODU6Njg6ZDA6ZjQKKworRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uIEdsb2JhbCBDQSAzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogOTM6QzI6OEU6MTE6N0I6RDQ6RjM6MDM6MTk6QkQ6Mjg6NzU6MTM6NEE6NDU6NEEKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlES1RDQ0FwS2dBd0lCQWdJRU5tN1R6akFOQmdrcWhraUc5dzBCQVFVRkFEQkdNUXN3Q1FZRFZRUUdFd0pWCitVekVrTUNJR0ExVUVDaE1iUkdsbmFYUmhiQ0JUYVdkdVlYUjFjbVVnVkhKMWMzUWdRMjh1TVJFd0R3WURWUVFMCitFd2hFVTFSRFFTQkZNakFlRncwNU9ERXlNRGt4T1RFM01qWmFGdzB4T0RFeU1Ea3hPVFEzTWpaYU1FWXhDekFKCitCZ05WQkFZVEFsVlRNU1F3SWdZRFZRUUtFeHRFYVdkcGRHRnNJRk5wWjI1aGRIVnlaU0JVY25WemRDQkRieTR4CitFVEFQQmdOVkJBc1RDRVJUVkVOQklFVXlNSUdkTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdMQURDQmh3S0JnUUMvCitrNDhYa3U4ekV4anJFSDlPRnIvL0JvOHFoYnhlK1NTbUpJaTJBN2ZCdzE4RFc5RnZybjVDNm1ZanVHT0RWdnNvCitMZUU0aTdUdXFBSGh6aHkyaUNvaVJvWDduNmR3cVVjVVA4N2VaZkNvY2ZkUEpteU12TWExNzk1SkovOUlLbjNvCitUUVBNeDdKU3hoY3hFenUxVGR2SXhQYkREeVFxMmd5ZDU1RmJnTTJVblFJQkE2T0NBU1F3Z2dFZ01CRUdDV0NHCitTQUdHK0VJQkFRUUVBd0lBQnpCb0JnTlZIUjhFWVRCZk1GMmdXNkJacEZjd1ZURUxNQWtHQTFVRUJoTUNWVk14CitKREFpQmdOVkJBb1RHMFJwWjJsMFlXd2dVMmxuYm1GMGRYSmxJRlJ5ZFhOMElFTnZMakVSTUE4R0ExVUVDeE1JCitSRk5VUTBFZ1JUSXhEVEFMQmdOVkJBTVRCRU5TVERFd0t3WURWUjBRQkNRd0lvQVBNVGs1T0RFeU1Ea3hPVEUzCitNalphZ1E4eU1ERTRNVEl3T1RFNU1UY3lObG93Q3dZRFZSMFBCQVFEQWdFR01COEdBMVVkSXdRWU1CYUFGQjZDCitUU2hsZ0R6SlFXNnNOUzVheTk3dStEbGJNQjBHQTFVZERnUVdCQlFlZ2swb1pZQTh5VUZ1ckRVdVdzdmU3dmc1CitXekFNQmdOVkhSTUVCVEFEQVFIL01Ca0dDU3FHU0liMmZRZEJBQVFNTUFvYkJGWTBMakFEQWdTUU1BMEdDU3FHCitTSWIzRFFFQkJRVUFBNEdCQUVlTmc2MWk4dHV3bmtVaUJibWkxZ01PT0hMbm52eDc1cE8ybXFXaWxNZzBIWkhSCit4ZGYwQ2lVUFBYaUJuZyt4WjhTUVRHUGRYcWZpdXAvMTkwMmxNWHVjS1MxTS9tUSs3TFpUL3VxYjdZTGJkSFZMCitCM2x1SHRnWmczUGU5VDdRdGQ3blMyaDlReTRxSU9GK29IaEVuZ2oxbVBuSGZ4c2IxZ1lnQWxpaHc2SUQKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjogOTEzMjMyODQ2ICgweDM2NmVkM2NlKQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBPPURpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLiwgT1U9RFNUQ0EgRTIKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IERlYyAgOSAxOToxNzoyNiAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogRGVjICA5IDE5OjQ3OjI2IDIwMTggR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89RGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uLCBPVT1EU1RDQSBFMgorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6YmY6OTM6OGY6MTc6OTI6ZWY6MzM6MTM6MTg6ZWI6MTA6N2Y6NGU6MTY6CisgICAgICAgICAgICAgICAgICAgIGJmOmZmOjA2OjhmOjJhOjg1OmJjOjVlOmY5OjI0OmE2OjI0Ojg4OmI2OjAzOgorICAgICAgICAgICAgICAgICAgICBiNzpjMTpjMzo1ZjowMzo1YjpkMTo2ZjphZTo3ZTo0MjplYTo2NjoyMzpiODoKKyAgICAgICAgICAgICAgICAgICAgNjM6ODM6NTY6ZmI6Mjg6MmQ6ZTE6Mzg6OGI6YjQ6ZWU6YTg6MDE6ZTE6Y2U6CisgICAgICAgICAgICAgICAgICAgIDFjOmI2Ojg4OjJhOjIyOjQ2Ojg1OmZiOjlmOmE3OjcwOmE5OjQ3OjE0OjNmOgorICAgICAgICAgICAgICAgICAgICBjZTpkZTo2NTpmMDphODo3MTpmNzo0ZjoyNjo2Yzo4YzpiYzpjNjpiNTplZjoKKyAgICAgICAgICAgICAgICAgICAgZGU6NDk6Mjc6ZmY6NDg6MmE6N2Q6ZTg6NGQ6MDM6Y2M6Yzc6YjI6NTI6YzY6CisgICAgICAgICAgICAgICAgICAgIDE3OjMxOjEzOjNiOmI1OjRkOmRiOmM4OmM0OmY2OmMzOjBmOjI0OjJhOmRhOgorICAgICAgICAgICAgICAgICAgICAwYzo5ZDplNzo5MTo1Yjo4MDpjZDo5NDo5ZAorICAgICAgICAgICAgICAgIEV4cG9uZW50OiAzICgweDMpCisgICAgICAgIFg1MDl2MyBleHRlbnNpb25zOgorICAgICAgICAgICAgTmV0c2NhcGUgQ2VydCBUeXBlOiAKKyAgICAgICAgICAgICAgICBTU0wgQ0EsIFMvTUlNRSBDQSwgT2JqZWN0IFNpZ25pbmcgQ0EKKyAgICAgICAgICAgIFg1MDl2MyBDUkwgRGlzdHJpYnV0aW9uIFBvaW50czogCisgICAgICAgICAgICAgICAgRGlyTmFtZTovQz1VUy9PPURpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLi9PVT1EU1RDQSBFMi9DTj1DUkwxCisKKyAgICAgICAgICAgIFg1MDl2MyBQcml2YXRlIEtleSBVc2FnZSBQZXJpb2Q6IAorICAgICAgICAgICAgICAgIE5vdCBCZWZvcmU6IERlYyAgOSAxOToxNzoyNiAxOTk4IEdNVCwgTm90IEFmdGVyOiBEZWMgIDkgMTk6MTc6MjYgMjAxOCBHTVQKKyAgICAgICAgICAgIFg1MDl2MyBLZXkgVXNhZ2U6IAorICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIFNpZ24sIENSTCBTaWduCisgICAgICAgICAgICBYNTA5djMgQXV0aG9yaXR5IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICBrZXlpZDoxRTo4Mjo0RDoyODo2NTo4MDozQzpDOTo0MTo2RTpBQzozNToyRTo1QTpDQjpERTpFRTpGODozOTo1QgorCisgICAgICAgICAgICBYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAgMUU6ODI6NEQ6Mjg6NjU6ODA6M0M6Qzk6NDE6NkU6QUM6MzU6MkU6NUE6Q0I6REU6RUU6Rjg6Mzk6NUIKKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogCisgICAgICAgICAgICAgICAgQ0E6VFJVRQorICAgICAgICAgICAgMS4yLjg0MC4xMTM1MzMuNy42NS4wOiAKKyAgICAgICAgICAgICAgICAwCisuLlY0LjAuLi4uCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDQ3OjhkOjgzOmFkOjYyOmYyOmRiOmIwOjllOjQ1OjIyOjA1OmI5OmEyOmQ2OjAzOjBlOjM4OgorICAgICAgICA3MjplNzo5ZTpmYzo3YjplNjo5MzpiNjo5YTphNTphMjo5NDpjODozNDoxZDo5MTpkMTpjNToKKyAgICAgICAgZDc6ZjQ6MGE6MjU6MGY6M2Q6Nzg6ODE6OWU6MGY6YjE6Njc6YzQ6OTA6NGM6NjM6ZGQ6NWU6CisgICAgICAgIGE3OmUyOmJhOjlmOmY1OmY3OjRkOmE1OjMxOjdiOjljOjI5OjJkOjRjOmZlOjY0OjNlOmVjOgorICAgICAgICBiNjo1MzpmZTplYTo5YjplZDo4MjpkYjo3NDo3NTo0YjowNzo3OTo2ZToxZTpkODoxOTo4MzoKKyAgICAgICAgNzM6ZGU6ZjU6M2U6ZDA6YjU6ZGU6ZTc6NGI6Njg6N2Q6NDM6MmU6MmE6MjA6ZTE6N2U6YTA6CisgICAgICAgIDc4OjQ0OjllOjA4OmY1Ojk4OmY5OmM3OjdmOjFiOjFiOmQ2OjA2OjIwOjAyOjU4OmExOmMzOgorICAgICAgICBhMjowMworCitEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4gR2xvYmFsIENBIDQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiBDRDozQjozRDo2Mjo1QjowOTpCODowOTozNjo4Nzo5RToxMjoyRjo3MTo2NDpCQQorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUQyRENDQXNBQ0VRRFFIa0NMQUFCM2JRQUFBQUVBQUFBRU1BMEdDU3FHU0liM0RRRUJCUVVBTUlHcE1Rc3cKK0NRWURWUVFHRXdKMWN6RU5NQXNHQTFVRUNCTUVWWFJoYURFWE1CVUdBMVVFQnhNT1UyRnNkQ0JNWVd0bElFTnAKK2RIa3hKREFpQmdOVkJBb1RHMFJwWjJsMFlXd2dVMmxuYm1GMGRYSmxJRlJ5ZFhOMElFTnZMakVSTUE4R0ExVUUKK0N4TUlSRk5VUTBFZ1dESXhGakFVQmdOVkJBTVREVVJUVkNCU2IyOTBRMEVnV0RJeElUQWZCZ2txaGtpRzl3MEIKK0NRRVdFbU5oUUdScFozTnBaM1J5ZFhOMExtTnZiVEFlRncwNU9ERXhNekF5TWpRMk1UWmFGdzB3T0RFeE1qY3kKK01qUTJNVFphTUlHcE1Rc3dDUVlEVlFRR0V3SjFjekVOTUFzR0ExVUVDQk1FVlhSaGFERVhNQlVHQTFVRUJ4TU8KK1UyRnNkQ0JNWVd0bElFTnBkSGt4SkRBaUJnTlZCQW9URzBScFoybDBZV3dnVTJsbmJtRjBkWEpsSUZSeWRYTjAKK0lFTnZMakVSTUE4R0ExVUVDeE1JUkZOVVEwRWdXREl4RmpBVUJnTlZCQU1URFVSVFZDQlNiMjkwUTBFZ1dESXgKK0lUQWZCZ2txaGtpRzl3MEJDUUVXRW1OaFFHUnBaM05wWjNSeWRYTjBMbU52YlRDQ0FTSXdEUVlKS29aSWh2Y04KK0FRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFOeDE4SXpBZFphYXdHSWZKdmZFNFpycTRGWnpXNW5OQVVTb0NMYlYKK3A5b2FCQmc1a2twNG80SEM5WGQ2VUxSdy81cXJ4c2ZLYm9OUFFwajdKZ3ZhM0czV3FabFZVbWZwS0FPUzNPV3cKK0Jab1BGZmxyV1hKVzh2bzUvS3BvN2c4ZkVJTXYvSjM2RjViZGd1UG1SWDNBUzRCRUgrMHM0SVQ5a1Z5U1ZHa2wKKzVXSnAzT1h1QUZLOU13dXRkUUtGcDJSUUxjVVpHVERBSnR2SjAvMHVtYTFadFF0TjFFR3VoVWhEV2R5M3FPS2kKKzNzT1AxN2loWXFab1VGTGt6ekdubElYYW4wWXlGMWJsOHV0bVBSTC9ROXVZNzNmUHk0R05OTEhHVUVvbTBlUSsKK1FWQ3ZiSzRpTkM3VmEyNkR1bm00ZG1WSTJna3BaR01pdWZ0SGRvV01oa1RMQ2RzQ0F3RUFBVEFOQmdrcWhraUcKKzl3MEJBUVVGQUFPQ0FRRUF0VFlPWGVGaEtGb1JaY0EvZ3dONVRiNG9wZ3NIQWxLRnpmaVIwQkJzdFdvZ1d4eVEKKzJUQTh4a2llaWw1aythRnhkKzhFSng4SDYrUW05M04weVVRWUdtYlQ0RU92a1R2Unl5ellkRlE2SEUzSzFHak4KK0kzd2RFSjVGNmZZQWJxYk5HZjlQTENtUFYwM0VkNUsrNEV3SisxMUVobVlocUxreW9sYlY2WXlEZkZrL3hQRUwKKzU1M3NucjJjR0E0K3dqbDVLTGNERFFqTHh1ZlpBVGRRRU96TVlSWkExSzh4ZEh2OFB6R24wRWR6TXprYnpFNXEKKzEwbURFUWIrNjRKWU16Sk04RmFzSHB3dlZwcDd3VW9jcGYxVk5zNzhsazMwc1BEc3QyeUM3Uzh4bVVKTXFiSU4KK3VCVmQ4ZCs2eWJWSzFHU1lzeWFwTU1qOXB1eXJsaUd0ZjhKNHRnPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDEgKDB4MCkKKyAgICAgICAgU2VyaWFsIE51bWJlcjoKKyAgICAgICAgICAgIGQwOjFlOjQwOjhiOjAwOjAwOjc3OjZkOjAwOjAwOjAwOjAxOjAwOjAwOjAwOjA0CisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9dXMsIFNUPVV0YWgsIEw9U2FsdCBMYWtlIENpdHksIE89RGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uLCBPVT1EU1RDQSBYMiwgQ049RFNUIFJvb3RDQSBYMi9FbWFpbD1jYUBkaWdzaWd0cnVzdC5jb20KKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IE5vdiAzMCAyMjo0NjoxNiAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogTm92IDI3IDIyOjQ2OjE2IDIwMDggR01UCisgICAgICAgIFN1YmplY3Q6IEM9dXMsIFNUPVV0YWgsIEw9U2FsdCBMYWtlIENpdHksIE89RGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uLCBPVT1EU1RDQSBYMiwgQ049RFNUIFJvb3RDQSBYMi9FbWFpbD1jYUBkaWdzaWd0cnVzdC5jb20KKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgyMDQ4IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgyMDQ4IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmRjOjc1OmYwOjhjOmMwOjc1Ojk2OjlhOmMwOjYyOjFmOjI2OmY3OmM0OgorICAgICAgICAgICAgICAgICAgICBlMTo5YTplYTplMDo1Njo3Mzo1Yjo5OTpjZDowMTo0NDphODowODpiNjpkNToKKyAgICAgICAgICAgICAgICAgICAgYTc6ZGE6MWE6MDQ6MTg6Mzk6OTI6NGE6Nzg6YTM6ODE6YzI6ZjU6Nzc6N2E6CisgICAgICAgICAgICAgICAgICAgIDUwOmI0OjcwOmZmOjlhOmFiOmM2OmM3OmNhOjZlOjgzOjRmOjQyOjk4OmZiOgorICAgICAgICAgICAgICAgICAgICAyNjowYjpkYTpkYzo2ZDpkNjphOTo5OTo1NTo1Mjo2NzplOToyODowMzo5MjoKKyAgICAgICAgICAgICAgICAgICAgZGM6ZTU6YjA6MDU6OWE6MGY6MTU6Zjk6NmI6NTk6NzI6NTY6ZjI6ZmE6Mzk6CisgICAgICAgICAgICAgICAgICAgIGZjOmFhOjY4OmVlOjBmOjFmOjEwOjgzOjJmOmZjOjlkOmZhOjE3Ojk2OmRkOgorICAgICAgICAgICAgICAgICAgICA4MjplMzplNjo0NTo3ZDpjMDo0Yjo4MDo0NDoxZjplZDoyYzplMDo4NDpmZDoKKyAgICAgICAgICAgICAgICAgICAgOTE6NWM6OTI6NTQ6Njk6MjU6ZTU6NjI6Njk6ZGM6ZTU6ZWU6MDA6NTI6YmQ6CisgICAgICAgICAgICAgICAgICAgIDMzOjBiOmFkOjc1OjAyOjg1OmE3OjY0OjUwOjJkOmM1OjE5OjE5OjMwOmMwOgorICAgICAgICAgICAgICAgICAgICAyNjpkYjpjOTpkMzpmZDoyZTo5OTphZDo1OTpiNTowYjo0ZDpkNDo0MTphZToKKyAgICAgICAgICAgICAgICAgICAgODU6NDg6NDM6NTk6ZGM6Yjc6YTg6ZTI6YTI6ZGU6YzM6OGY6ZDc6Yjg6YTE6CisgICAgICAgICAgICAgICAgICAgIDYyOmE2OjY4OjUwOjUyOmU0OmNmOjMxOmE3Ojk0Ojg1OmRhOjlmOjQ2OjMyOgorICAgICAgICAgICAgICAgICAgICAxNzo1NjplNTpmMjplYjo2NjozZDoxMjpmZjo0MzpkYjo5ODplZjo3NzpjZjoKKyAgICAgICAgICAgICAgICAgICAgY2I6ODE6OGQ6MzQ6YjE6YzY6NTA6NGE6MjY6ZDE6ZTQ6M2U6NDE6NTA6YWY6CisgICAgICAgICAgICAgICAgICAgIDZjOmFlOjIyOjM0OjJlOmQ1OjZiOjZlOjgzOmJhOjc5OmI4Ojc2OjY1OjQ4OgorICAgICAgICAgICAgICAgICAgICBkYTowOToyOTo2NDo2MzoyMjpiOTpmYjo0Nzo3Njo4NTo4Yzo4Njo0NDpjYjoKKyAgICAgICAgICAgICAgICAgICAgMDk6ZGIKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIGI1OjM2OjBlOjVkOmUxOjYxOjI4OjVhOjExOjY1OmMwOjNmOjgzOjAzOjc5OjRkOmJlOjI4OgorICAgICAgICBhNjowYjowNzowMjo1Mjo4NTpjZDpmODo5MTpkMDoxMDo2YzpiNTo2YToyMDo1YjoxYzo5MDoKKyAgICAgICAgZDk6MzA6M2M6YzY6NDg6OWU6OGE6NWU6NjQ6Zjk6YTE6NzE6Nzc6ZWY6MDQ6Mjc6MWY6MDc6CisgICAgICAgIGViOmU0OjI2OmY3OjczOjc0OmM5OjQ0OjE4OjFhOjY2OmQzOmUwOjQzOmFmOjkxOjNiOmQxOgorICAgICAgICBjYjoyYzpkODo3NDo1NDozYToxYzo0ZDpjYTpkNDo2ODpjZDoyMzo3YzoxZDoxMDo5ZTo0NToKKyAgICAgICAgZTk6ZjY6MDA6NmU6YTY6Y2Q6MTk6ZmY6NGY6MmM6Mjk6OGY6NTc6NGQ6YzQ6Nzc6OTI6YmU6CisgICAgICAgIGUwOjRjOjA5OmZiOjVkOjQ0Ojg2OjY2OjIxOmE4OmI5OjMyOmEyOjU2OmQ1OmU5OjhjOjgzOgorICAgICAgICA3Yzo1OTozZjpjNDpmMTowYjplNzo5ZDplYzo5ZTpiZDo5YzoxODowZTozZTpjMjozOTo3OToKKyAgICAgICAgMjg6Yjc6MDM6MGQ6MDg6Y2I6YzY6ZTc6ZDk6MDE6Mzc6NTA6MTA6ZWM6Y2M6NjE6MTY6NDA6CisgICAgICAgIGQ0OmFmOjMxOjc0OjdiOmZjOjNmOjMxOmE3OmQwOjQ3OjczOjMzOjM5OjFiOmNjOjRlOjZhOgorICAgICAgICBkNzo0OTo4MzoxMTowNjpmZTplYjo4Mjo1ODozMzozMjo0YzpmMDo1NjphYzoxZTo5YzoyZjoKKyAgICAgICAgNTY6OWE6N2I6YzE6NGE6MWM6YTU6ZmQ6NTU6MzY6Y2U6ZmM6OTY6NGQ6ZjQ6YjA6ZjA6ZWM6CisgICAgICAgIGI3OjZjOjgyOmVkOjJmOjMxOjk5OjQyOjRjOmE5OmIyOjBkOmI4OjE1OjVkOmYxOmRmOmJhOgorICAgICAgICBjOTpiNTo0YTpkNDo2NDo5ODpiMzoyNjphOTozMDpjODpmZDphNjplYzphYjo5NjoyMTphZDoKKyAgICAgICAgN2Y6YzI6Nzg6YjYKKworRW50cnVzdCBXb3JsZHdpZGUgYnkgRFNUCis9PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogQjQ6NjU6MjI6MEE6N0M6QUQ6REY6NDE6Qjc6RDU6NDQ6RDU6QUQ6RkE6OUE6NzUKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEUnpDQ0FyQ2dBd0lCQWdJRU5tM0ZHREFOQmdrcWhraUc5dzBCQVFVRkFEQlFNUXN3Q1FZRFZRUUdFd0pWCitVekVrTUNJR0ExVUVDaE1iUkdsbmFYUmhiQ0JUYVdkdVlYUjFjbVVnVkhKMWMzUWdRMjh1TVJzd0dRWURWUVFMCitFeEpFVTFRdFJXNTBjblZ6ZENCSFZFa2dRMEV3SGhjTk9UZ3hNakE1TURBd01qSTBXaGNOTVRneE1qQTVNREF6CitNakkwV2pCUU1Rc3dDUVlEVlFRR0V3SlZVekVrTUNJR0ExVUVDaE1iUkdsbmFYUmhiQ0JUYVdkdVlYUjFjbVVnCitWSEoxYzNRZ1EyOHVNUnN3R1FZRFZRUUxFeEpFVTFRdFJXNTBjblZ6ZENCSFZFa2dRMEV3Z1owd0RRWUpLb1pJCitodmNOQVFFQkJRQURnWXNBTUlHSEFvR0JBTFlkOTB1TkR4UGpFdlVKL2dZeURxOU1RZlY5MUVjOUtncmZnd1hlCiszbjNtQXhiMlVUckxSeHBLclg3RS9SMjB2blNLZU4wTGc0NjBoQlBFKy9odEthNmg0UThQUStPMVhtQnArb09VCisvSG5tM0hidDBVUXJqdjBTdS80WGR4Y01pZTJuNzFGOXhPMDR3enVqZXZ2aVRhQmd0Zkw5RTJYVHh1dy92aldjCitQU0x2QWdFRG80SUJMakNDQVNvd0VRWUpZSVpJQVliNFFnRUJCQVFEQWdBSE1ISUdBMVVkSHdSck1Ha3daNkJsCitvR09rWVRCZk1Rc3dDUVlEVlFRR0V3SlZVekVrTUNJR0ExVUVDaE1iUkdsbmFYUmhiQ0JUYVdkdVlYUjFjbVVnCitWSEoxYzNRZ1EyOHVNUnN3R1FZRFZRUUxFeEpFVTFRdFJXNTBjblZ6ZENCSFZFa2dRMEV4RFRBTEJnTlZCQU1UCitCRU5TVERFd0t3WURWUjBRQkNRd0lvQVBNVGs1T0RFeU1Ea3dNREF5TWpSYWdROHlNREU0TVRJd09UQXdNREl5CitORm93Q3dZRFZSMFBCQVFEQWdFR01COEdBMVVkSXdRWU1CYUFGSk9hUk1yUWVGT0FLVWtFMzhldk16K1pkVit1CitNQjBHQTFVZERnUVdCQlNUbWtUSzBIaFRnQ2xKQk4vSHJ6TS9tWFZmcmpBTUJnTlZIUk1FQlRBREFRSC9NQmtHCitDU3FHU0liMmZRZEJBQVFNTUFvYkJGWTBMakFEQWdTUU1BMEdDU3FHU0liM0RRRUJCUVVBQTRHQkFHU0p6QU9uCiszQXJ5V0NEbi9SZWdLSExOaDdETm1MVWtSMk16TVJBUXN1K0tWM0t1VEFQZ1o1K3NZRU9FSXNHcG8rV3hwOTRKCisxTThOZUVZalc0OUplLzRUSXBlVTZuSkk0U3dnZUpicFprVVp5d2xsWTJFLzBVbVlzWFlRVmRWalNtWkxwQWRyCiszbnQvdWVhVFd4b0NXNEFPM1kwWTFJcWp3bWp4bytBWTBVNU0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjogOTEzMTYzNTQ0ICgweDM2NmRjNTE4KQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBPPURpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLiwgT1U9RFNULUVudHJ1c3QgR1RJIENBCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBEZWMgIDkgMDA6MDI6MjQgMTk5OCBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IERlYyAgOSAwMDozMjoyNCAyMDE4IEdNVAorICAgICAgICBTdWJqZWN0OiBDPVVTLCBPPURpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLiwgT1U9RFNULUVudHJ1c3QgR1RJIENBCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpiNjoxZDpmNzo0Yjo4ZDowZjoxMzplMzoxMjpmNTowOTpmZTowNjozMjoKKyAgICAgICAgICAgICAgICAgICAgMGU6YWY6NGM6NDE6ZjU6N2Q6ZDQ6NDc6M2Q6MmE6MGE6ZGY6ODM6MDU6ZGU6CisgICAgICAgICAgICAgICAgICAgIGRlOjdkOmU2OjAzOjE2OmY2OjUxOjNhOmNiOjQ3OjFhOjRhOmFkOjdlOmM0OgorICAgICAgICAgICAgICAgICAgICBmZDoxZDpiNDpiZTo3NDo4YTo3ODpkZDowYjo4Mzo4ZTpiNDo4NDoxMzpjNDoKKyAgICAgICAgICAgICAgICAgICAgZmI6Zjg6NmQ6Mjk6YWU6YTE6ZTE6MGY6MGY6NDM6ZTM6YjU6NWU6NjA6Njk6CisgICAgICAgICAgICAgICAgICAgIGZhOjgzOjk0OmZjOjc5OmU2OmRjOjc2OmVkOmQxOjQ0OjJiOjhlOmZkOjEyOgorICAgICAgICAgICAgICAgICAgICBiYjpmZToxNzo3NzoxNzowYzo4OTplZDphNzplZjo1MTo3ZDpjNDplZDozODoKKyAgICAgICAgICAgICAgICAgICAgYzM6M2I6YTM6N2E6ZmI6ZTI6NGQ6YTA6NjA6YjU6ZjI6ZmQ6MTM6NjU6ZDM6CisgICAgICAgICAgICAgICAgICAgIGM2OmVjOjNmOmJlOjM1OjljOjNkOjIyOmVmCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDMgKDB4MykKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBOZXRzY2FwZSBDZXJ0IFR5cGU6IAorICAgICAgICAgICAgICAgIFNTTCBDQSwgUy9NSU1FIENBLCBPYmplY3QgU2lnbmluZyBDQQorICAgICAgICAgICAgWDUwOXYzIENSTCBEaXN0cmlidXRpb24gUG9pbnRzOiAKKyAgICAgICAgICAgICAgICBEaXJOYW1lOi9DPVVTL089RGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uL09VPURTVC1FbnRydXN0IEdUSSBDQS9DTj1DUkwxCisKKyAgICAgICAgICAgIFg1MDl2MyBQcml2YXRlIEtleSBVc2FnZSBQZXJpb2Q6IAorICAgICAgICAgICAgICAgIE5vdCBCZWZvcmU6IERlYyAgOSAwMDowMjoyNCAxOTk4IEdNVCwgTm90IEFmdGVyOiBEZWMgIDkgMDA6MDI6MjQgMjAxOCBHTVQKKyAgICAgICAgICAgIFg1MDl2MyBLZXkgVXNhZ2U6IAorICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIFNpZ24sIENSTCBTaWduCisgICAgICAgICAgICBYNTA5djMgQXV0aG9yaXR5IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICBrZXlpZDo5Mzo5QTo0NDpDQTpEMDo3ODo1Mzo4MDoyOTo0OTowNDpERjpDNzpBRjozMzozRjo5OTo3NTo1RjpBRQorCisgICAgICAgICAgICBYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAgOTM6OUE6NDQ6Q0E6RDA6Nzg6NTM6ODA6Mjk6NDk6MDQ6REY6Qzc6QUY6MzM6M0Y6OTk6NzU6NUY6QUUKKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogCisgICAgICAgICAgICAgICAgQ0E6VFJVRQorICAgICAgICAgICAgMS4yLjg0MC4xMTM1MzMuNy42NS4wOiAKKyAgICAgICAgICAgICAgICAwCisuLlY0LjAuLi4uCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDY0Ojg5OmNjOjAzOmE3OmRjOjBhOmYyOjU4OjIwOmU3OmZkOjE3OmEwOjI4OjcyOmNkOjg3OgorICAgICAgICBiMDpjZDo5ODpiNToyNDo0Nzo2MzozMzozMToxMDoxMDpiMjplZjo4YTo1Nzo3MjphZTo0YzoKKyAgICAgICAgMDM6ZTA6Njc6OWY6YWM6NjA6NDM6ODQ6MjI6YzE6YTk6YTM6ZTU6YjE6YTc6ZGU6MDk6ZDQ6CisgICAgICAgIGNmOjBkOjc4OjQ2OjIzOjViOjhmOjQ5OjdiOmZlOjEzOjIyOjk3Ojk0OmVhOjcyOjQ4OmUxOgorICAgICAgICAyYzoyMDo3ODo5NjplOTo2Njo0NToxOTpjYjowOTo2NTo2Mzo2MTozZjpkMTo0OTo5ODpiMToKKyAgICAgICAgNzY6MTA6NTU6ZDU6NjM6NGE6NjY6NGI6YTQ6MDc6NmI6ZGU6N2I6N2Y6Yjk6ZTY6OTM6NWI6CisgICAgICAgIDFhOjAyOjViOjgwOjBlOmRkOjhkOjE4OmQ0OjhhOmEzOmMyOjY4OmYxOmEzOmUwOjE4OmQxOgorICAgICAgICA0ZTo0YworCitFbnRydXN0Lm5ldCBQcmVtaXVtIDIwNDggU2VjdXJlIFNlcnZlciBDQQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogQkE6MjE6RUE6MjA6RDY6REQ6REI6OEY6QzE6NTc6OEI6NDA6QUQ6QTE6RkM6RkMKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFWERDQ0EwU2dBd0lCQWdJRU9HTzVaakFOQmdrcWhraUc5dzBCQVFVRkFEQ0J0REVVTUJJR0ExVUVDaE1MCitSVzUwY25WemRDNXVaWFF4UURBK0JnTlZCQXNVTjNkM2R5NWxiblJ5ZFhOMExtNWxkQzlEVUZOZk1qQTBPQ0JwCitibU52Y25BdUlHSjVJSEpsWmk0Z0tHeHBiV2wwY3lCc2FXRmlMaWt4SlRBakJnTlZCQXNUSENoaktTQXhPVGs1CitJRVZ1ZEhKMWMzUXVibVYwSUV4cGJXbDBaV1F4TXpBeEJnTlZCQU1US2tWdWRISjFjM1F1Ym1WMElFTmxjblJwCitabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVJQ2d5TURRNEtUQWVGdzA1T1RFeU1qUXhOelV3TlRGYUZ3MHhPVEV5CitNalF4T0RJd05URmFNSUcwTVJRd0VnWURWUVFLRXd0RmJuUnlkWE4wTG01bGRERkFNRDRHQTFVRUN4UTNkM2QzCitMbVZ1ZEhKMWMzUXVibVYwTDBOUVUxOHlNRFE0SUdsdVkyOXljQzRnWW5rZ2NtVm1MaUFvYkdsdGFYUnpJR3hwCitZV0l1S1RFbE1DTUdBMVVFQ3hNY0tHTXBJREU1T1RrZ1JXNTBjblZ6ZEM1dVpYUWdUR2x0YVhSbFpERXpNREVHCitBMVVFQXhNcVJXNTBjblZ6ZEM1dVpYUWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZ0tESXdORGdwCitNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXJVMUxxUktHc3VxaklBY1ZGbVFxCitLMHZSdnd0S1RZN3RnSGFsWjdkNFFNQnpRc2hvd050VEs5MWV1SGFZTlpPTEdwMThFem9PSDF1M0hzL2xKQlFlCitzWUdwalgyNHpHdExBL0VDRE55cnBVQWtBSDkwbEtHZENDbXppQXYxaDNlZFZjM2t3MzdYYW1TcmhSU0dsVnVYCitNbEJ2UGNpNlpnemovTDI0U2NGMmlVa1ovY0Nvdlltalp5L0duN3h4R1dDNExla3N5WkIyWm51VTRxOTQxbVZUCitYVHpXbkxMUEtRUDVMNlJRc3RSSXpnVXlWWXI5c21STUR1U1lCM1hiZjkrNUNGVmdoVEFwK1h0SXBHbUc0elUvCitIb1pkZW5vVnZlOEFqaFVpVkJjQWtDYVR2QTVKYUpHLytFZlRuWlZDd1E1TjMyOG16OE1ZSVdKbVEzRFcxY0FICis0UUlEQVFBQm8zUXdjakFSQmdsZ2hrZ0JodmhDQVFFRUJBTUNBQWN3SHdZRFZSMGpCQmd3Rm9BVVZlU0IwUkdBCit2dGlKdVFpak1mbWhKQWtXdVhBd0hRWURWUjBPQkJZRUZGWGtnZEVSZ0w3WWlia0lvekg1b1NRSkZybHdNQjBHCitDU3FHU0liMmZRZEJBQVFRTUE0YkNGWTFMakE2TkM0d0F3SUVrREFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBCitXVWVzSVlTS0Y4bWNpVk1ldW9DRkdzWThUajZ4bkxaOHhwSmRHR1FDNDlNR0NCRmhmR1BqSzUweEEzQjIwcU1vCitvUFM3bW1OejdXM2xLdHZ0RktrcnhqWVIwQ3ZyQjR1bDJwNWNHWjFXRXZWVUtjZ0Y3YklTS28zMEF4di81NUlRCitoN0E2dGNPZEJUY1NvOGYwRmJuVnBEa1dtMU02STVIeHFJS2lhb2hvd1hrQ0lyeXFwdGF1MzdBVVg3aUgwTjE4CitmM3Yvcnh6UDV0c0hyVjdiaFozUUt3MHoyd1RSNWtsQUV5dDIrejdwbklrUEZjNFlzSVY0SVU5clR3NzZObWZOCitCL0wvQ05EaTN0bS9LcSs0aDRZaFBBVEt0NVJvZjg4ODZaalhPUC9zd05sUThDNUxXSzVHYjlBdXcyRGFjbFZ5Cit2VXhGbm1HNnY0U0JrZ1BSMG1sOHhRPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjogOTQ2MDU5NjIyICgweDM4NjNiOTY2KQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBPPUVudHJ1c3QubmV0LCBPVT13d3cuZW50cnVzdC5uZXQvQ1BTXzIwNDggaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pLCBPVT0oYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVkLCBDTj1FbnRydXN0Lm5ldCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAoMjA0OCkKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IERlYyAyNCAxNzo1MDo1MSAxOTk5IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogRGVjIDI0IDE4OjIwOjUxIDIwMTkgR01UCisgICAgICAgIFN1YmplY3Q6IE89RW50cnVzdC5uZXQsIE9VPXd3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLiksIE9VPShjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQsIENOPUVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDIwNDggYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDIwNDggYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6YWQ6NGQ6NGI6YTk6MTI6ODY6YjI6ZWE6YTM6MjA6MDc6MTU6MTY6NjQ6CisgICAgICAgICAgICAgICAgICAgIDJhOjJiOjRiOmQxOmJmOjBiOjRhOjRkOjhlOmVkOjgwOjc2OmE1OjY3OmI3OgorICAgICAgICAgICAgICAgICAgICA3ODo0MDpjMDo3Mzo0MjpjODo2ODpjMDpkYjo1MzoyYjpkZDo1ZTpiODo3NjoKKyAgICAgICAgICAgICAgICAgICAgOTg6MzU6OTM6OGI6MWE6OWQ6N2M6MTM6M2E6MGU6MWY6NWI6Yjc6MWU6Y2Y6CisgICAgICAgICAgICAgICAgICAgIGU1OjI0OjE0OjFlOmIxOjgxOmE5OjhkOjdkOmI4OmNjOjZiOjRiOjAzOmYxOgorICAgICAgICAgICAgICAgICAgICAwMjowYzpkYzphYjphNTo0MDoyNDowMDo3Zjo3NDo5NDphMTo5ZDowODoyOToKKyAgICAgICAgICAgICAgICAgICAgYjM6ODg6MGI6ZjU6ODc6Nzc6OWQ6NTU6Y2Q6ZTQ6YzM6N2U6ZDc6NmE6NjQ6CisgICAgICAgICAgICAgICAgICAgIGFiOjg1OjE0Ojg2Ojk1OjViOjk3OjMyOjUwOjZmOjNkOmM4OmJhOjY2OjBjOgorICAgICAgICAgICAgICAgICAgICBlMzpmYzpiZDpiODo0OTpjMTo3Njo4OTo0OToxOTpmZDpjMDphODpiZDo4OToKKyAgICAgICAgICAgICAgICAgICAgYTM6Njc6MmY6YzY6OWY6YmM6NzE6MTk6NjA6Yjg6MmQ6ZTk6MmM6Yzk6OTA6CisgICAgICAgICAgICAgICAgICAgIDc2OjY2OjdiOjk0OmUyOmFmOjc4OmQ2OjY1OjUzOjVkOjNjOmQ2OjljOmIyOgorICAgICAgICAgICAgICAgICAgICBjZjoyOTowMzpmOToyZjphNDo1MDpiMjpkNDo0ODpjZTowNTozMjo1NTo4YToKKyAgICAgICAgICAgICAgICAgICAgZmQ6YjI6NjQ6NGM6MGU6ZTQ6OTg6MDc6NzU6ZGI6N2Y6ZGY6Yjk6MDg6NTU6CisgICAgICAgICAgICAgICAgICAgIDYwOjg1OjMwOjI5OmY5OjdiOjQ4OmE0OjY5Ojg2OmUzOjM1OjNmOjFlOjg2OgorICAgICAgICAgICAgICAgICAgICA1ZDo3YTo3YToxNTpiZDplZjowMDo4ZToxNToyMjo1NDoxNzowMDo5MDoyNjoKKyAgICAgICAgICAgICAgICAgICAgOTM6YmM6MGU6NDk6Njg6OTE6YmY6Zjg6NDc6ZDM6OWQ6OTU6NDI6YzE6MGU6CisgICAgICAgICAgICAgICAgICAgIDRkOmRmOjZmOjI2OmNmOmMzOjE4OjIxOjYyOjY2OjQzOjcwOmQ2OmQ1OmMwOgorICAgICAgICAgICAgICAgICAgICAwNzplMQorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBOZXRzY2FwZSBDZXJ0IFR5cGU6IAorICAgICAgICAgICAgICAgIFNTTCBDQSwgUy9NSU1FIENBLCBPYmplY3QgU2lnbmluZyBDQQorICAgICAgICAgICAgWDUwOXYzIEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAga2V5aWQ6NTU6RTQ6ODE6RDE6MTE6ODA6QkU6RDg6ODk6Qjk6MDg6QTM6MzE6Rjk6QTE6MjQ6MDk6MTY6Qjk6NzAKKworICAgICAgICAgICAgWDUwOXYzIFN1YmplY3QgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIDU1OkU0OjgxOkQxOjExOjgwOkJFOkQ4Ojg5OkI5OjA4OkEzOjMxOkY5OkExOjI0OjA5OjE2OkI5OjcwCisgICAgICAgICAgICAxLjIuODQwLjExMzUzMy43LjY1LjA6IAorICAgICAgICAgICAgICAgIDAuLi5WNS4wOjQuMC4uLi4KKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgNTk6NDc6YWM6MjE6ODQ6OGE6MTc6Yzk6OWM6ODk6NTM6MWU6YmE6ODA6ODU6MWE6YzY6M2M6CisgICAgICAgIDRlOjNlOmIxOjljOmI2OjdjOmM2OjkyOjVkOjE4OjY0OjAyOmUzOmQzOjA2OjA4OjExOjYxOgorICAgICAgICA3Yzo2MzplMzoyYjo5ZDozMTowMzo3MDo3NjpkMjphMzoyODphMDpmNDpiYjo5YTo2Mzo3MzoKKyAgICAgICAgZWQ6NmQ6ZTU6MmE6ZGI6ZWQ6MTQ6YTk6MmI6YzY6MzY6MTE6ZDA6MmI6ZWI6MDc6OGI6YTU6CisgICAgICAgIGRhOjllOjVjOjE5OjlkOjU2OjEyOmY1OjU0OjI5OmM4OjA1OmVkOmIyOjEyOjJhOjhkOmY0OgorICAgICAgICAwMzoxYjpmZjplNzo5MjoxMDo4NzpiMDozYTpiNTpjMzo5ZDowNTozNzoxMjphMzpjNzpmNDoKKyAgICAgICAgMTU6Yjk6ZDU6YTQ6Mzk6MTY6OWI6NTM6M2E6MjM6OTE6ZjE6YTg6ODI6YTI6NmE6ODg6Njg6CisgICAgICAgIGMxOjc5OjAyOjIyOmJjOmFhOmE2OmQ2OmFlOmRmOmIwOjE0OjVmOmI4Ojg3OmQwOmRkOjdjOgorICAgICAgICA3Zjo3YjpmZjphZjoxYzpjZjplNjpkYjowNzphZDo1ZTpkYjo4NTo5ZDpkMDoyYjowZDozMzoKKyAgICAgICAgZGI6MDQ6ZDE6ZTY6NDk6NDA6MTM6MmI6NzY6ZmI6M2U6ZTk6OWM6ODk6MGY6MTU6Y2U6MTg6CisgICAgICAgIGIwOjg1Ojc4OjIxOjRmOjZiOjRmOjBlOmZhOjM2OjY3OmNkOjA3OmYyOmZmOjA4OmQwOmUyOgorICAgICAgICBkZTpkOTpiZjoyYTphZjpiODo4Nzo4NjoyMTozYzowNDpjYTpiNzo5NDo2ODo3ZjpjZjozYzoKKyAgICAgICAgZTk6OTg6ZDc6Mzg6ZmY6ZWM6YzA6ZDk6NTA6ZjA6MmU6NGI6NTg6YWU6NDY6NmY6ZDA6MmU6CisgICAgICAgIGMzOjYwOmRhOjcyOjU1OjcyOmJkOjRjOjQ1OjllOjYxOmJhOmJmOjg0OjgxOjkyOjAzOmQxOgorICAgICAgICBkMjo2OTo3YzpjNQorCitFbnRydXN0Lm5ldCBTZWN1cmUgUGVyc29uYWwgQ0EKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiAwQzo0MToyRjoxMzo1QjpBMDo1NDpGNTo5Njo2NjoyRDo3RTpDRDowRTowMzpGNAorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUU3VENDQkZhZ0F3SUJBZ0lFT0FPUjdqQU5CZ2txaGtpRzl3MEJBUVFGQURDQnlURUxNQWtHQTFVRUJoTUMKK1ZWTXhGREFTQmdOVkJBb1RDMFZ1ZEhKMWMzUXVibVYwTVVnd1JnWURWUVFMRkQ5M2QzY3VaVzUwY25WemRDNXUKK1pYUXZRMnhwWlc1MFgwTkJYMGx1Wm04dlExQlRJR2x1WTI5eWNDNGdZbmtnY21WbUxpQnNhVzFwZEhNZ2JHbGgKK1lpNHhKVEFqQmdOVkJBc1RIQ2hqS1NBeE9UazVJRVZ1ZEhKMWMzUXVibVYwSUV4cGJXbDBaV1F4TXpBeEJnTlYKK0JBTVRLa1Z1ZEhKMWMzUXVibVYwSUVOc2FXVnVkQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWUKK0Z3MDVPVEV3TVRJeE9USTBNekJhRncweE9URXdNVEl4T1RVME16QmFNSUhKTVFzd0NRWURWUVFHRXdKVlV6RVUKK01CSUdBMVVFQ2hNTFJXNTBjblZ6ZEM1dVpYUXhTREJHQmdOVkJBc1VQM2QzZHk1bGJuUnlkWE4wTG01bGRDOUQKK2JHbGxiblJmUTBGZlNXNW1ieTlEVUZNZ2FXNWpiM0p3TGlCaWVTQnlaV1l1SUd4cGJXbDBjeUJzYVdGaUxqRWwKK01DTUdBMVVFQ3hNY0tHTXBJREU1T1RrZ1JXNTBjblZ6ZEM1dVpYUWdUR2x0YVhSbFpERXpNREVHQTFVRUF4TXEKK1JXNTBjblZ6ZEM1dVpYUWdRMnhwWlc1MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUlHZE1BMEcKK0NTcUdTSWIzRFFFQkFRVUFBNEdMQURDQmh3S0JnUURJT3BsZU1SZmZyQ2R2a0h2a0dmOUZvelRDMjhHb1QvQm8KKzZvVDluM1Y1ejhHS1VaU3Z4MWNEUjJTZXJZSWJXdHAvTjNoSHV6ZVlFcGJPeGhOOTc5SU1NRkdwT1o1VitQdXgKKzV6RGVnN0s2UHZIVmlUczdoYnFxZEN6K1B6RnVyNUdWYmdiVUIwMUxMRlpIR0FSUzJnNFFrNzlqa0p2aDM0em0KK0FxVG1UMTczaXdJQkE2T0NBZUF3Z2dIY01CRUdDV0NHU0FHRytFSUJBUVFFQXdJQUJ6Q0NBU0lHQTFVZEh3U0MKK0FSa3dnZ0VWTUlIa29JSGhvSUhlcElIYk1JSFlNUXN3Q1FZRFZRUUdFd0pWVXpFVU1CSUdBMVVFQ2hNTFJXNTAKK2NuVnpkQzV1WlhReFNEQkdCZ05WQkFzVVAzZDNkeTVsYm5SeWRYTjBMbTVsZEM5RGJHbGxiblJmUTBGZlNXNW0KK2J5OURVRk1nYVc1amIzSndMaUJpZVNCeVpXWXVJR3hwYldsMGN5QnNhV0ZpTGpFbE1DTUdBMVVFQ3hNY0tHTXAKK0lERTVPVGtnUlc1MGNuVnpkQzV1WlhRZ1RHbHRhWFJsWkRFek1ERUdBMVVFQXhNcVJXNTBjblZ6ZEM1dVpYUWcKK1EyeHBaVzUwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNUTB3Q3dZRFZRUURFd1JEVWt3eE1DeWcKK0txQW9oaVpvZEhSd09pOHZkM2QzTG1WdWRISjFjM1F1Ym1WMEwwTlNUQzlEYkdsbGJuUXhMbU55YkRBckJnTlYKK0hSQUVKREFpZ0E4eE9UazVNVEF4TWpFNU1qUXpNRnFCRHpJd01Ua3hNREV5TVRreU5ETXdXakFMQmdOVkhROEUKK0JBTUNBUVl3SHdZRFZSMGpCQmd3Rm9BVXhQdWNLWHVYelV5Vy9PNWJzOHFaZEl1VjZrd3dIUVlEVlIwT0JCWUUKK0ZNVDduQ2w3bDgxTWx2enVXN1BLbVhTTGxlcE1NQXdHQTFVZEV3UUZNQU1CQWY4d0dRWUpLb1pJaHZaOUIwRUEKK0JBd3dDaHNFVmpRdU1BTUNCSkF3RFFZSktvWklodmNOQVFFRUJRQURnWUVBUDY2SzhkZG1Bd1dlUHZycUhFYTcKK3BGdVBlSm9TU0puNTlEWGVERFlIQW1zUU9va1VnWnd4cG55eVFiSnE1d2NCb1V2NW55VTdsc3Fad3o2aFVSenoKK3d5NUU5N0JuUnFxUzVUdmFIQmtVT0REVjRxSXhKUzd4N0VVNDdmZ0dXQU56WXJBUU1ZOUF2MlRnWEQ3RlR4L2EKK0VrUC9UT1lHSnFpYkdhcEVQSGF5WE93PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiA5Mzk3NTgwNjIgKDB4MzgwMzkxZWUpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1VUywgTz1FbnRydXN0Lm5ldCwgT1U9d3d3LmVudHJ1c3QubmV0L0NsaWVudF9DQV9JbmZvL0NQUyBpbmNvcnAuIGJ5IHJlZi4gbGltaXRzIGxpYWIuLCBPVT0oYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVkLCBDTj1FbnRydXN0Lm5ldCBDbGllbnQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IE9jdCAxMiAxOToyNDozMCAxOTk5IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogT2N0IDEyIDE5OjU0OjMwIDIwMTkgR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89RW50cnVzdC5uZXQsIE9VPXd3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0FfSW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLiwgT1U9KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZCwgQ049RW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpjODozYTo5OTo1ZTozMToxNzpkZjphYzoyNzo2Zjo5MDo3YjplNDoxOToKKyAgICAgICAgICAgICAgICAgICAgZmY6NDU6YTM6MzQ6YzI6ZGI6YzE6YTg6NGY6ZjA6Njg6ZWE6ODQ6ZmQ6OWY6CisgICAgICAgICAgICAgICAgICAgIDc1Ojc5OmNmOmMxOjhhOjUxOjk0OmFmOmM3OjU3OjAzOjQ3OjY0OjllOmFkOgorICAgICAgICAgICAgICAgICAgICA4MjoxYjo1YTpkYTo3ZjozNzo3ODo0NzpiYjozNzo5ODoxMjo5NjpjZTpjNjoKKyAgICAgICAgICAgICAgICAgICAgMTM6N2Q6ZWY6ZDI6MGM6MzA6NTE6YTk6Mzk6OWU6NTU6Zjg6ZmI6YjE6ZTc6CisgICAgICAgICAgICAgICAgICAgIDMwOmRlOjgzOmIyOmJhOjNlOmYxOmQ1Ojg5OjNiOjNiOjg1OmJhOmFhOjc0OgorICAgICAgICAgICAgICAgICAgICAyYzpmZTozZjozMTo2ZTphZjo5MTo5NTo2ZTowNjpkNDowNzo0ZDo0YjoyYzoKKyAgICAgICAgICAgICAgICAgICAgNTY6NDc6MTg6MDQ6NTI6ZGE6MGU6MTA6OTM6YmY6NjM6OTA6OWI6ZTE6ZGY6CisgICAgICAgICAgICAgICAgICAgIDhjOmU2OjAyOmE0OmU2OjRmOjVlOmY3OjhiCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDMgKDB4MykKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBOZXRzY2FwZSBDZXJ0IFR5cGU6IAorICAgICAgICAgICAgICAgIFNTTCBDQSwgUy9NSU1FIENBLCBPYmplY3QgU2lnbmluZyBDQQorICAgICAgICAgICAgWDUwOXYzIENSTCBEaXN0cmlidXRpb24gUG9pbnRzOiAKKyAgICAgICAgICAgICAgICBEaXJOYW1lOi9DPVVTL089RW50cnVzdC5uZXQvT1U9d3d3LmVudHJ1c3QubmV0L0NsaWVudF9DQV9JbmZvL0NQUyBpbmNvcnAuIGJ5IHJlZi4gbGltaXRzIGxpYWIuL09VPShjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQvQ049RW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5L0NOPUNSTDEKKyAgICAgICAgICAgICAgICBVUkk6aHR0cDovL3d3dy5lbnRydXN0Lm5ldC9DUkwvQ2xpZW50MS5jcmwKKworICAgICAgICAgICAgWDUwOXYzIFByaXZhdGUgS2V5IFVzYWdlIFBlcmlvZDogCisgICAgICAgICAgICAgICAgTm90IEJlZm9yZTogT2N0IDEyIDE5OjI0OjMwIDE5OTkgR01ULCBOb3QgQWZ0ZXI6IE9jdCAxMiAxOToyNDozMCAyMDE5IEdNVAorICAgICAgICAgICAgWDUwOXYzIEtleSBVc2FnZTogCisgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUgU2lnbiwgQ1JMIFNpZ24KKyAgICAgICAgICAgIFg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIGtleWlkOkM0OkZCOjlDOjI5OjdCOjk3OkNEOjRDOjk2OkZDOkVFOjVCOkIzOkNBOjk5Ojc0OjhCOjk1OkVBOjRDCisKKyAgICAgICAgICAgIFg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICBDNDpGQjo5QzoyOTo3Qjo5NzpDRDo0Qzo5NjpGQzpFRTo1QjpCMzpDQTo5OTo3NDo4Qjo5NTpFQTo0QworICAgICAgICAgICAgWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzOiAKKyAgICAgICAgICAgICAgICBDQTpUUlVFCisgICAgICAgICAgICAxLjIuODQwLjExMzUzMy43LjY1LjA6IAorICAgICAgICAgICAgICAgIDAKKy4uVjQuMC4uLi4KKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICAzZjphZTo4YTpmMTpkNzo2NjowMzowNTo5ZTozZTpmYTplYToxYzo0NjpiYjphNDo1Yjo4ZjoKKyAgICAgICAgNzg6OWE6MTI6NDg6OTk6Zjk6ZjQ6MzU6ZGU6MGM6MzY6MDc6MDI6NmI6MTA6M2E6ODk6MTQ6CisgICAgICAgIDgxOjljOjMxOmE2OjdjOmIyOjQxOmIyOjZhOmU3OjA3OjAxOmExOjRiOmY5OjlmOjI1OjNiOgorICAgICAgICA5NjpjYTo5OTpjMzozZTphMTo1MToxYzpmMzpjMzoyZTo0NDpmNzpiMDo2Nzo0NjphYTo5MjoKKyAgICAgICAgZTU6M2I6ZGE6MWM6MTk6MTQ6Mzg6MzA6ZDU6ZTI6YTI6MzE6MjU6MmU6ZjE6ZWM6NDU6Mzg6CisgICAgICAgIGVkOmY4OjA2OjU4OjAzOjczOjYyOmIwOjEwOjMxOjhmOjQwOmJmOjY0OmUwOjVjOjNlOmM1OgorICAgICAgICA0ZjoxZjpkYToxMjo0MzpmZjo0YzplNjowNjoyNjphODo5YjoxOTphYTo0NDozYzo3NjpiMjoKKyAgICAgICAgNWM6ZWMKKworRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDQQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiBERjpGMjo4MDo3MzpDQzpGMTpFNjo2MTo3MzpGQzpGNTo0MjpFOTpDNTo3QzpFRQorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUUyRENDQkVHZ0F3SUJBZ0lFTjByU1F6QU5CZ2txaGtpRzl3MEJBUVVGQURDQnd6RUxNQWtHQTFVRUJoTUMKK1ZWTXhGREFTQmdOVkJBb1RDMFZ1ZEhKMWMzUXVibVYwTVRzd09RWURWUVFMRXpKM2QzY3VaVzUwY25WemRDNXUKK1pYUXZRMUJUSUdsdVkyOXljQzRnWW5rZ2NtVm1MaUFvYkdsdGFYUnpJR3hwWVdJdUtURWxNQ01HQTFVRUN4TWMKK0tHTXBJREU1T1RrZ1JXNTBjblZ6ZEM1dVpYUWdUR2x0YVhSbFpERTZNRGdHQTFVRUF4TXhSVzUwY25WemRDNXUKK1pYUWdVMlZqZFhKbElGTmxjblpsY2lCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFlRncwNU9UQTEKK01qVXhOakE1TkRCYUZ3MHhPVEExTWpVeE5qTTVOREJhTUlIRE1Rc3dDUVlEVlFRR0V3SlZVekVVTUJJR0ExVUUKK0NoTUxSVzUwY25WemRDNXVaWFF4T3pBNUJnTlZCQXNUTW5kM2R5NWxiblJ5ZFhOMExtNWxkQzlEVUZNZ2FXNWoKK2IzSndMaUJpZVNCeVpXWXVJQ2hzYVcxcGRITWdiR2xoWWk0cE1TVXdJd1lEVlFRTEV4d29ZeWtnTVRrNU9TQkYKK2JuUnlkWE4wTG01bGRDQk1hVzFwZEdWa01Ub3dPQVlEVlFRREV6RkZiblJ5ZFhOMExtNWxkQ0JUWldOMWNtVWcKK1UyVnlkbVZ5SUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNSUdkTUEwR0NTcUdTSWIzRFFFQkFRVUEKK0E0R0xBRENCaHdLQmdRRE5LSU0wVkJ1Sjh3K3ZONUV4LzY4eFlNbW82TElRYU8yZjU1TTI4UXBrdTBmMUJCYy8KK0kwZE54U2NaZ1NZTVZISU5pQzNaSDVvU243eXpjZE9BR1Q5SFpudU1OU2pTdVFyZkpOcWMxbEI1Z1hwYTB6ZjMKK3drcllLWkltWk5Ia21HdzZBSXIxTkp0bCtPM2pFUC85dUVsWTNLRGVnamxyZ2JFV0dXRzVWTGJtUXdJQkE2T0MKK0FkY3dnZ0hUTUJFR0NXQ0dTQUdHK0VJQkFRUUVBd0lBQnpDQ0FSa0dBMVVkSHdTQ0FSQXdnZ0VNTUlIZW9JSGIKK29JSFlwSUhWTUlIU01Rc3dDUVlEVlFRR0V3SlZVekVVTUJJR0ExVUVDaE1MUlc1MGNuVnpkQzV1WlhReE96QTUKK0JnTlZCQXNUTW5kM2R5NWxiblJ5ZFhOMExtNWxkQzlEVUZNZ2FXNWpiM0p3TGlCaWVTQnlaV1l1SUNoc2FXMXAKK2RITWdiR2xoWWk0cE1TVXdJd1lEVlFRTEV4d29ZeWtnTVRrNU9TQkZiblJ5ZFhOMExtNWxkQ0JNYVcxcGRHVmsKK01Ub3dPQVlEVlFRREV6RkZiblJ5ZFhOMExtNWxkQ0JUWldOMWNtVWdVMlZ5ZG1WeUlFTmxjblJwWm1sallYUnAKK2IyNGdRWFYwYUc5eWFYUjVNUTB3Q3dZRFZRUURFd1JEVWt3eE1DbWdKNkFsaGlOb2RIUndPaTh2ZDNkM0xtVnUKK2RISjFjM1F1Ym1WMEwwTlNUQzl1WlhReExtTnliREFyQmdOVkhSQUVKREFpZ0E4eE9UazVNRFV5TlRFMk1EazAKK01GcUJEekl3TVRrd05USTFNVFl3T1RRd1dqQUxCZ05WSFE4RUJBTUNBUVl3SHdZRFZSMGpCQmd3Rm9BVThCZGkKK0UxVTlzLzhLQUd2N1VJU1g4KzFpMEJvd0hRWURWUjBPQkJZRUZQQVhZaE5WUGJQL0NnQnIrMUNFbC9QdFl0QWEKK01Bd0dBMVVkRXdRRk1BTUJBZjh3R1FZSktvWklodlo5QjBFQUJBd3dDaHNFVmpRdU1BTUNCSkF3RFFZSktvWkkKK2h2Y05BUUVGQlFBRGdZRUFrTnd3QXZwa2RNS25DcVY4SVkwMEY2ajdSdzcvSlh5TkV3cjc1SmkxNzR6NHhSQU4KKzk1Sys4Y1BWMVpWcUJMc3N6aVkyWmNneHh1ZnVQK05YZFlSNkVlOUdUeGowMDVpN3FJY3l1bkwyUE9JOW45Y2QKKzJjTmdRNHhZRGlLV0wyS2pMQis2clFYdnF6SjRoNkJVY3htMVhBWDVVajV0TFVVTDl3cVQ2dTBHK2JJPQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiA5Mjc2NTAzNzEgKDB4Mzc0YWQyNDMpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9VVMsIE89RW50cnVzdC5uZXQsIE9VPXd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pLCBPVT0oYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVkLCBDTj1FbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBNYXkgMjUgMTY6MDk6NDAgMTk5OSBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IE1heSAyNSAxNjozOTo0MCAyMDE5IEdNVAorICAgICAgICBTdWJqZWN0OiBDPVVTLCBPPUVudHJ1c3QubmV0LCBPVT13d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKSwgT1U9KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZCwgQ049RW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6Y2Q6Mjg6ODM6MzQ6NTQ6MWI6ODk6ZjM6MGY6YWY6Mzc6OTE6MzE6ZmY6CisgICAgICAgICAgICAgICAgICAgIGFmOjMxOjYwOmM5OmE4OmU4OmIyOjEwOjY4OmVkOjlmOmU3OjkzOjM2OmYxOgorICAgICAgICAgICAgICAgICAgICAwYTo2NDpiYjo0NzpmNTowNDoxNzozZjoyMzo0Nzo0ZDpjNToyNzoxOTo4MToKKyAgICAgICAgICAgICAgICAgICAgMjY6MGM6NTQ6NzI6MGQ6ODg6MmQ6ZDk6MWY6OWE6MTI6OWY6YmM6YjM6NzE6CisgICAgICAgICAgICAgICAgICAgIGQzOjgwOjE5OjNmOjQ3OjY2OjdiOjhjOjM1OjI4OmQyOmI5OjBhOmRmOjI0OgorICAgICAgICAgICAgICAgICAgICBkYTo5YzpkNjo1MDo3OTo4MTo3YTo1YTpkMzozNzpmNzpjMjo0YTpkODoyOToKKyAgICAgICAgICAgICAgICAgICAgOTI6MjY6NjQ6ZDE6ZTQ6OTg6NmM6M2E6MDA6OGE6ZjU6MzQ6OWI6NjU6Zjg6CisgICAgICAgICAgICAgICAgICAgIGVkOmUzOjEwOmZmOmZkOmI4OjQ5OjU4OmRjOmEwOmRlOjgyOjM5OjZiOjgxOgorICAgICAgICAgICAgICAgICAgICBiMToxNjoxOTo2MTpiOTo1NDpiNjplNjo0MworICAgICAgICAgICAgICAgIEV4cG9uZW50OiAzICgweDMpCisgICAgICAgIFg1MDl2MyBleHRlbnNpb25zOgorICAgICAgICAgICAgTmV0c2NhcGUgQ2VydCBUeXBlOiAKKyAgICAgICAgICAgICAgICBTU0wgQ0EsIFMvTUlNRSBDQSwgT2JqZWN0IFNpZ25pbmcgQ0EKKyAgICAgICAgICAgIFg1MDl2MyBDUkwgRGlzdHJpYnV0aW9uIFBvaW50czogCisgICAgICAgICAgICAgICAgRGlyTmFtZTovQz1VUy9PPUVudHJ1c3QubmV0L09VPXd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pL09VPShjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQvQ049RW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eS9DTj1DUkwxCisgICAgICAgICAgICAgICAgVVJJOmh0dHA6Ly93d3cuZW50cnVzdC5uZXQvQ1JML25ldDEuY3JsCisKKyAgICAgICAgICAgIFg1MDl2MyBQcml2YXRlIEtleSBVc2FnZSBQZXJpb2Q6IAorICAgICAgICAgICAgICAgIE5vdCBCZWZvcmU6IE1heSAyNSAxNjowOTo0MCAxOTk5IEdNVCwgTm90IEFmdGVyOiBNYXkgMjUgMTY6MDk6NDAgMjAxOSBHTVQKKyAgICAgICAgICAgIFg1MDl2MyBLZXkgVXNhZ2U6IAorICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIFNpZ24sIENSTCBTaWduCisgICAgICAgICAgICBYNTA5djMgQXV0aG9yaXR5IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICBrZXlpZDpGMDoxNzo2MjoxMzo1NTozRDpCMzpGRjowQTowMDo2QjpGQjo1MDo4NDo5NzpGMzpFRDo2MjpEMDoxQQorCisgICAgICAgICAgICBYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAgRjA6MTc6NjI6MTM6NTU6M0Q6QjM6RkY6MEE6MDA6NkI6RkI6NTA6ODQ6OTc6RjM6RUQ6NjI6RDA6MUEKKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogCisgICAgICAgICAgICAgICAgQ0E6VFJVRQorICAgICAgICAgICAgMS4yLjg0MC4xMTM1MzMuNy42NS4wOiAKKyAgICAgICAgICAgICAgICAwCisuLlY0LjAuLi4uCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDkwOmRjOjMwOjAyOmZhOjY0Ojc0OmMyOmE3OjBhOmE1OjdjOjIxOjhkOjM0OjE3OmE4OmZiOgorICAgICAgICA0NzowZTpmZjoyNTo3Yzo4ZDoxMzowYTpmYjplNDo5ODpiNTplZjo4YzpmODpjNToxMDowZDoKKyAgICAgICAgZjc6OTI6YmU6ZjE6YzM6ZDU6ZDU6OTU6NmE6MDQ6YmI6MmM6Y2U6MjY6MzY6NjU6Yzg6MzE6CisgICAgICAgIGM2OmU3OmVlOjNmOmUzOjU3Ojc1Ojg0OjdhOjExOmVmOjQ2OjRmOjE4OmY0OmQzOjk4OmJiOgorICAgICAgICBhODo4NzozMjpiYTo3MjpmNjozYzplMjozZDo5ZjpkNzoxZDpkOTpjMzo2MDo0Mzo4Yzo1ODoKKyAgICAgICAgMGU6MjI6OTY6MmY6NjI6YTM6MmM6MWY6YmE6YWQ6MDU6ZWY6YWI6MzI6Nzg6ODc6YTA6NTQ6CisgICAgICAgIDczOjE5OmI1OjVjOjA1OmY5OjUyOjNlOjZkOjJkOjQ1OjBiOmY3OjBhOjkzOmVhOmVkOjA2OgorICAgICAgICBmOTpiMgorCitFcXVpZmF4IFByZW1pdW0gQ0EKKz09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiBBOTpFOTpBODo5RDowRTo3MzpFMzpCMToyRjozNzowRDpFODo0ODozRjo4NjpFRAorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURJekNDQW95Z0F3SUJBZ0lFTmVIdkhqQU5CZ2txaGtpRzl3MEJBUVVGQURCUE1Rc3dDUVlEVlFRR0V3SlYKK1V6RVFNQTRHQTFVRUNoTUhSWEYxYVdaaGVERXVNQ3dHQTFVRUN4TWxSWEYxYVdaaGVDQlFjbVZ0YVhWdElFTmwKK2NuUnBabWxqWVhSbElFRjFkR2h2Y21sMGVUQWVGdzA1T0RBNE1qUXlNalUwTWpOYUZ3MHhPREE0TWpReU1qVTAKK01qTmFNRTh4Q3pBSkJnTlZCQVlUQWxWVE1SQXdEZ1lEVlFRS0V3ZEZjWFZwWm1GNE1TNHdMQVlEVlFRTEV5VkYKK2NYVnBabUY0SUZCeVpXMXBkVzBnUTJWeWRHbG1hV05oZEdVZ1FYVjBhRzl5YVhSNU1JR2ZNQTBHQ1NxR1NJYjMKK0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FET29RYU9Cc3dJQzhHR3FONGcxUTBPMFEzRW4rcHEyYlBDTWtkQWI0cUkKK3BBbTlPQ3dkNXN2bXBQTTI2OXJydlB4a3N3ZjJMYnlxenA4WlNHaEsvUFdpUlg0SkVQV1BzMGxjSXdZNTZoT0wKK3VBdk5rUjEyWDlrM29VVDdYNUR5WjdQTkdKbERIM1lTYXdMeWxZTTRROEwyWWpUS3lYaGRYOUxZdXByL3ZoQmcKK1d3SURBUUFCbzRJQkNqQ0NBUVl3Y1FZRFZSMGZCR293YURCbW9HU2dZcVJnTUY0eEN6QUpCZ05WQkFZVEFsVlQKK01SQXdEZ1lEVlFRS0V3ZEZjWFZwWm1GNE1TNHdMQVlEVlFRTEV5VkZjWFZwWm1GNElGQnlaVzFwZFcwZ1EyVnkKK2RHbG1hV05oZEdVZ1FYVjBhRzl5YVhSNU1RMHdDd1lEVlFRREV3UkRVa3d4TUJvR0ExVWRFQVFUTUJHQkR6SXcKK01UZ3dPREkwTWpJMU5ESXpXakFMQmdOVkhROEVCQU1DQVFZd0h3WURWUjBqQkJnd0ZvQVVGZTZ5S0ZtcmJ1WDQKK3o0dUI5Q1Rocmo5MUc1Z3dIUVlEVlIwT0JCWUVGQlh1c2loWnEyN2wrTStMZ2ZRazRhNC9kUnVZTUF3R0ExVWQKK0V3UUZNQU1CQWY4d0dnWUpLb1pJaHZaOUIwRUFCQTB3Q3hzRlZqTXVNR01EQWdiQU1BMEdDU3FHU0liM0RRRUIKK0JRVUFBNEdCQUwwTG5DZXBBOXNvM0ppcFM5RFJqcWVvR2xxUjRKeng5eGg4TGlLZU5oL0pxTFhOUmtwdStqVUgKK0c0WUk2NS9pcVBtZFFTMDZybHhjdGw4MEJPdjhLbUN3KzNUa2hlbGxPSmJ1RmNmR2QyTVN2WXBvSDZ0c2ZkcksKK1hCUE82c25yQ1Z6RmMrY1NBZFhaVXdlZTRBK1c4SXUwdTBWSW40YkZHVldneTViRkEveEkKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjogOTAzOTk5MjYyICgweDM1ZTFlZjFlKQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBPPUVxdWlmYXgsIE9VPUVxdWlmYXggUHJlbWl1bSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IEF1ZyAyNCAyMjo1NDoyMyAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogQXVnIDI0IDIyOjU0OjIzIDIwMTggR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89RXF1aWZheCwgT1U9RXF1aWZheCBQcmVtaXVtIENlcnRpZmljYXRlIEF1dGhvcml0eQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6Y2U6YTE6MDY6OGU6MDY6Y2M6MDg6MGI6YzE6ODY6YTg6ZGU6MjA6ZDU6CisgICAgICAgICAgICAgICAgICAgIDBkOjBlOmQxOjBkOmM0OjlmOmVhOjZhOmQ5OmIzOmMyOjMyOjQ3OjQwOjZmOgorICAgICAgICAgICAgICAgICAgICA4YTo4ODphNDowOTpiZDozODoyYzoxZDplNjpjYjplNjphNDpmMzozNjplYjoKKyAgICAgICAgICAgICAgICAgICAgZGE6ZWI6YmM6ZmM6NjQ6YjM6MDc6ZjY6MmQ6YmM6YWE6Y2U6OWY6MTk6NDg6CisgICAgICAgICAgICAgICAgICAgIDY4OjRhOmZjOmY1OmEyOjQ1OjdlOjA5OjEwOmY1OjhmOmIzOjQ5OjVjOjIzOgorICAgICAgICAgICAgICAgICAgICAwNjozOTplYToxMzo4YjpiODowYjpjZDo5MToxZDo3Njo1ZjpkOTozNzphMToKKyAgICAgICAgICAgICAgICAgICAgNDQ6ZmI6NWY6OTA6ZjI6Njc6YjM6Y2Q6MTg6OTk6NDM6MWY6NzY6MTI6NmI6CisgICAgICAgICAgICAgICAgICAgIDAyOmYyOjk1OjgzOjM4OjQzOmMyOmY2OjYyOjM0OmNhOmM5Ojc4OjVkOjVmOgorICAgICAgICAgICAgICAgICAgICBkMjpkODpiYTo5YTpmZjpiZToxMDo2MDo1YgorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBYNTA5djMgQ1JMIERpc3RyaWJ1dGlvbiBQb2ludHM6IAorICAgICAgICAgICAgICAgIERpck5hbWU6L0M9VVMvTz1FcXVpZmF4L09VPUVxdWlmYXggUHJlbWl1bSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkvQ049Q1JMMQorCisgICAgICAgICAgICBYNTA5djMgUHJpdmF0ZSBLZXkgVXNhZ2UgUGVyaW9kOiAKKyAgICAgICAgICAgICAgICBOb3QgQWZ0ZXI6IEF1ZyAyNCAyMjo1NDoyMyAyMDE4IEdNVAorICAgICAgICAgICAgWDUwOXYzIEtleSBVc2FnZTogCisgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUgU2lnbiwgQ1JMIFNpZ24KKyAgICAgICAgICAgIFg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIGtleWlkOjE1OkVFOkIyOjI4OjU5OkFCOjZFOkU1OkY4OkNGOjhCOjgxOkY0OjI0OkUxOkFFOjNGOjc1OjFCOjk4CisKKyAgICAgICAgICAgIFg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICAxNTpFRTpCMjoyODo1OTpBQjo2RTpFNTpGODpDRjo4Qjo4MTpGNDoyNDpFMTpBRTozRjo3NToxQjo5OAorICAgICAgICAgICAgWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzOiAKKyAgICAgICAgICAgICAgICBDQTpUUlVFCisgICAgICAgICAgICAxLjIuODQwLjExMzUzMy43LjY1LjA6IAorICAgICAgICAgICAgICAgIDAuLi5WMy4wYy4uLi4KKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgYmQ6MGI6OWM6Mjc6YTk6MDM6ZGI6Mjg6ZGM6OTg6YTk6NGI6ZDA6ZDE6OGU6YTc6YTg6MWE6CisgICAgICAgIDVhOjkxOmUwOjljOmYxOmY3OjE4OjdjOjJlOjIyOjllOjM2OjFmOmM5OmE4OmI1OmNkOjQ2OgorICAgICAgICA0YTo2ZTpmYTozNTowNzoxYjo4NjowODplYjo5ZjplMjphODpmOTo5ZDo0MToyZDozYTphZToKKyAgICAgICAgNWM6NWM6YjY6NWY6MzQ6MDQ6ZWI6ZmM6MmE6NjA6YjA6ZmI6NzQ6ZTQ6ODU6ZTk6NjU6Mzg6CisgICAgICAgIDk2OmVlOjE1OmM3OmM2Ojc3OjYzOjEyOmJkOjhhOjY4OjFmOmFiOjZjOjdkOmRhOmNhOjVjOgorICAgICAgICAxMzpjZTplYTpjOTplYjowOTo1YzpjNTo3MzplNzoxMjowMTpkNTpkOTo1MzowNzo5ZTplMDoKKyAgICAgICAgMGY6OTY6ZjA6OGI6YjQ6YmI6NDU6NDg6OWY6ODY6YzU6MTk6NTU6YTA6Y2I6OTY6YzU6MDM6CisgICAgICAgIGZjOjQ4CisKK0VxdWlmYXggU2VjdXJlIENBCis9PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiA2NzpDQjo5RDpDMDoxMzoyNDo4QTo4Mjo5QjpCMjoxNzoxRTpEMToxQjpFQzpENAorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURJRENDQW9tZ0F3SUJBZ0lFTmQ3MHp6QU5CZ2txaGtpRzl3MEJBUVVGQURCT01Rc3dDUVlEVlFRR0V3SlYKK1V6RVFNQTRHQTFVRUNoTUhSWEYxYVdaaGVERXRNQ3NHQTFVRUN4TWtSWEYxYVdaaGVDQlRaV04xY21VZ1EyVnkKK2RHbG1hV05oZEdVZ1FYVjBhRzl5YVhSNU1CNFhEVGs0TURneU1qRTJOREUxTVZvWERURTRNRGd5TWpFMk5ERTEKK01Wb3dUakVMTUFrR0ExVUVCaE1DVlZNeEVEQU9CZ05WQkFvVEIwVnhkV2xtWVhneExUQXJCZ05WQkFzVEpFVngKK2RXbG1ZWGdnVTJWamRYSmxJRU5sY25ScFptbGpZWFJsSUVGMWRHaHZjbWwwZVRDQm56QU5CZ2txaGtpRzl3MEIKK0FRRUZBQU9CalFBd2dZa0NnWUVBd1YyeFdHY0lZdTZnbWkwZkNHMlJGR2lZQ2g3KzJnUnZFNFJpSWNQUmZNNmYKK0JlQzRBZkJPTk96aWlwVUVaS3p4YTFOZkJiUExaNEMvUWdLTy90MEJDZXpoQUJSUC9QdndETjFEdWxzcjRSK0EKK2NKa1ZWNU1XOFErWGFyZkNhQ01jekUxWk1LeFJIanV2SzlidVkwVjd4ZGxmVU5MalVBODZpT2UvRlAzZ3g3a0MKK0F3RUFBYU9DQVFrd2dnRUZNSEFHQTFVZEh3UnBNR2N3WmFCam9HR2tYekJkTVFzd0NRWURWUVFHRXdKVlV6RVEKK01BNEdBMVVFQ2hNSFJYRjFhV1poZURFdE1Dc0dBMVVFQ3hNa1JYRjFhV1poZUNCVFpXTjFjbVVnUTJWeWRHbG0KK2FXTmhkR1VnUVhWMGFHOXlhWFI1TVEwd0N3WURWUVFERXdSRFVrd3hNQm9HQTFVZEVBUVRNQkdCRHpJd01UZ3cKK09ESXlNVFkwTVRVeFdqQUxCZ05WSFE4RUJBTUNBUVl3SHdZRFZSMGpCQmd3Rm9BVVNPWm8rU3ZTc3BYWFI5Z2oKK0lCQlBNNWlRbjlRd0hRWURWUjBPQkJZRUZFam1hUGtyMHJLVjEwZllJeUFRVHpPWWtKL1VNQXdHQTFVZEV3UUYKK01BTUJBZjh3R2dZSktvWklodlo5QjBFQUJBMHdDeHNGVmpNdU1HTURBZ2JBTUEwR0NTcUdTSWIzRFFFQkJRVUEKK0E0R0JBRmpPS2VyODk5NjF6Z0s1RjdXRjBibmo0SlhNSlRFTkFLYVNibisya21PZVVKWFJtbS9rRWQ1amhXNlkKKzdxai9Xc2pUVmJKbWNWZmV3Q0hyUFNxbkkwa0JCSVpDZS96dWY2SVdVclZuWjlOQTJ6c21XTElvZHoydUZIZGgKKzF2b3FaaWVnRGZxbmMxenFjUEdVSVdWRVgvcjg3eWxvcWFLSGVlOTU3MCtzQjNjNAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiA5MDM4MDQxMTEgKDB4MzVkZWY0Y2YpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9VVMsIE89RXF1aWZheCwgT1U9RXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5CisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBBdWcgMjIgMTY6NDE6NTEgMTk5OCBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEF1ZyAyMiAxNjo0MTo1MSAyMDE4IEdNVAorICAgICAgICBTdWJqZWN0OiBDPVVTLCBPPUVxdWlmYXgsIE9VPUVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6YzE6NWQ6YjE6NTg6Njc6MDg6NjI6ZWU6YTA6OWE6MmQ6MWY6MDg6NmQ6CisgICAgICAgICAgICAgICAgICAgIDkxOjE0OjY4Ojk4OjBhOjFlOmZlOmRhOjA0OjZmOjEzOjg0OjYyOjIxOmMzOgorICAgICAgICAgICAgICAgICAgICBkMTo3YzpjZTo5ZjowNTplMDpiODowMTpmMDo0ZTozNDplYzplMjo4YTo5NToKKyAgICAgICAgICAgICAgICAgICAgMDQ6NjQ6YWM6ZjE6NmI6NTM6NWY6MDU6YjM6Y2I6Njc6ODA6YmY6NDI6MDI6CisgICAgICAgICAgICAgICAgICAgIDhlOmZlOmRkOjAxOjA5OmVjOmUxOjAwOjE0OjRmOmZjOmZiOmYwOjBjOmRkOgorICAgICAgICAgICAgICAgICAgICA0MzpiYTo1YjoyYjplMToxZjo4MDo3MDo5OToxNTo1Nzo5MzoxNjpmMTowZjoKKyAgICAgICAgICAgICAgICAgICAgOTc6NmE6Yjc6YzI6Njg6MjM6MWM6Y2M6NGQ6NTk6MzA6YWM6NTE6MWU6M2I6CisgICAgICAgICAgICAgICAgICAgIGFmOjJiOmQ2OmVlOjYzOjQ1OjdiOmM1OmQ5OjVmOjUwOmQyOmUzOjUwOjBmOgorICAgICAgICAgICAgICAgICAgICAzYTo4ODplNzpiZjoxNDpmZDplMDpjNzpiOQorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBYNTA5djMgQ1JMIERpc3RyaWJ1dGlvbiBQb2ludHM6IAorICAgICAgICAgICAgICAgIERpck5hbWU6L0M9VVMvTz1FcXVpZmF4L09VPUVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eS9DTj1DUkwxCisKKyAgICAgICAgICAgIFg1MDl2MyBQcml2YXRlIEtleSBVc2FnZSBQZXJpb2Q6IAorICAgICAgICAgICAgICAgIE5vdCBBZnRlcjogQXVnIDIyIDE2OjQxOjUxIDIwMTggR01UCisgICAgICAgICAgICBYNTA5djMgS2V5IFVzYWdlOiAKKyAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZSBTaWduLCBDUkwgU2lnbgorICAgICAgICAgICAgWDUwOXYzIEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAga2V5aWQ6NDg6RTY6Njg6Rjk6MkI6RDI6QjI6OTU6RDc6NDc6RDg6MjM6MjA6MTA6NEY6MzM6OTg6OTA6OUY6RDQKKworICAgICAgICAgICAgWDUwOXYzIFN1YmplY3QgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIDQ4OkU2OjY4OkY5OjJCOkQyOkIyOjk1OkQ3OjQ3OkQ4OjIzOjIwOjEwOjRGOjMzOjk4OjkwOjlGOkQ0CisgICAgICAgICAgICBYNTA5djMgQmFzaWMgQ29uc3RyYWludHM6IAorICAgICAgICAgICAgICAgIENBOlRSVUUKKyAgICAgICAgICAgIDEuMi44NDAuMTEzNTMzLjcuNjUuMDogCisgICAgICAgICAgICAgICAgMC4uLlYzLjBjLi4uLgorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA1ODpjZToyOTplYTpmYzpmNzpkZTpiNTpjZTowMjpiOToxNzpiNTo4NTpkMTpiOTplMzplMDoKKyAgICAgICAgOTU6Y2M6MjU6MzE6MGQ6MDA6YTY6OTI6NmU6N2Y6YjY6OTI6NjM6OWU6NTA6OTU6ZDE6OWE6CisgICAgICAgIDZmOmU0OjExOmRlOjYzOjg1OjZlOjk4OmVlOmE4OmZmOjVhOmM4OmQzOjU1OmIyOjY2OjcxOgorICAgICAgICA1NzpkZTpjMDoyMTplYjozZDoyYTphNzoyMzo0OTowMTowNDo4Njo0Mjo3YjpmYzplZTo3ZjoKKyAgICAgICAgYTI6MTY6NTI6YjU6Njc6Njc6ZDM6NDA6ZGI6M2I6MjY6NTg6YjI6Mjg6Nzc6M2Q6YWU6MTQ6CisgICAgICAgIDc3OjYxOmQ2OmZhOjJhOjY2OjI3OmEwOjBkOmZhOmE3OjczOjVjOmVhOjcwOmYxOjk0OjIxOgorICAgICAgICA2NTo0NDo1ZjpmYTpmYzplZjoyOTo2ODphOTphMjo4Nzo3OTplZjo3OTplZjo0ZjphYzowNzoKKyAgICAgICAgNzc6MzgKKworR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QKKz09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IENBOjNEOkQzOjY4OkYxOjAzOjVDOkQwOjMyOkZBOkI4OjJCOjU5OkU4OjVBOkRCCitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQ1dqQ0NBY01DQWdHbE1BMEdDU3FHU0liM0RRRUJCQVVBTUhVeEN6QUpCZ05WQkFZVEFsVlRNUmd3RmdZRAorVlFRS0V3OUhWRVVnUTI5eWNHOXlZWFJwYjI0eEp6QWxCZ05WQkFzVEhrZFVSU0JEZVdKbGNsUnlkWE4wSUZOdgorYkhWMGFXOXVjeXdnU1c1akxqRWpNQ0VHQTFVRUF4TWFSMVJGSUVONVltVnlWSEoxYzNRZ1IyeHZZbUZzSUZKdgorYjNRd0hoY05PVGd3T0RFek1EQXlPVEF3V2hjTk1UZ3dPREV6TWpNMU9UQXdXakIxTVFzd0NRWURWUVFHRXdKVgorVXpFWU1CWUdBMVVFQ2hNUFIxUkZJRU52Y25CdmNtRjBhVzl1TVNjd0pRWURWUVFMRXg1SFZFVWdRM2xpWlhKVQorY25WemRDQlRiMngxZEdsdmJuTXNJRWx1WXk0eEl6QWhCZ05WQkFNVEdrZFVSU0JEZVdKbGNsUnlkWE4wSUVkcworYjJKaGJDQlNiMjkwTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FDVkQ2QzI4RkNjNkhySAoraU0zZEZ3NHVzSlRRR3owTzlwVEFpcFRIQnNpUWw4aTRaQnA2Zm13OFUrRTNLSE5nZjdLWFV3ZWZVL2x0V0pUUworcjQxdGlHZUE1dTJ5bGM5eU1jcWxISEs2WEFMblpFTG4rYWtzMWpvTnJJMUNxaVFCT2VhY1B3R0ZWdzFZaDBYNAorMDRXcWsya21oWEJJZ0Q4U0ZjZDV0QjhGTHp0aW1RSURBUUFCTUEwR0NTcUdTSWIzRFFFQkJBVUFBNEdCQUczcgorR3ducFh0bFIyMmNpWWFRcVBFaDM0NkI4cHQ1em9oUURoVDM3cXc0d3hZTVdNNEVUQ0o1N05FN2ZRTWgwMTdsOQorM1BSMlZYMmJZMVFZNmZEcTgxeXgyWXRDSHJuQWxVNjYrdFhpZlBWb1liK083QVdYWDF1dzE2T0ZOTVFrcHcwUAorbFpQdnk1VFluaCtkWElWdHg2cXVUeDhpdGMyVnJicW56UG1yQzNwLworLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMSAoMHgwKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiA0MjEgKDB4MWE1KQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9VVMsIE89R1RFIENvcnBvcmF0aW9uLCBPVT1HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4sIENOPUdURSBDeWJlclRydXN0IEdsb2JhbCBSb290CisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBBdWcgMTMgMDA6Mjk6MDAgMTk5OCBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEF1ZyAxMyAyMzo1OTowMCAyMDE4IEdNVAorICAgICAgICBTdWJqZWN0OiBDPVVTLCBPPUdURSBDb3Jwb3JhdGlvbiwgT1U9R1RFIEN5YmVyVHJ1c3QgU29sdXRpb25zLCBJbmMuLCBDTj1HVEUgQ3liZXJUcnVzdCBHbG9iYWwgUm9vdAorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6OTU6MGY6YTA6YjY6ZjA6NTA6OWM6ZTg6N2E6Yzc6ODg6Y2Q6ZGQ6MTc6CisgICAgICAgICAgICAgICAgICAgIDBlOjJlOmIwOjk0OmQwOjFiOjNkOjBlOmY2Ojk0OmMwOjhhOjk0OmM3OjA2OgorICAgICAgICAgICAgICAgICAgICBjODo5MDo5NzpjODpiODo2NDoxYTo3YTo3ZTo2YzozYzo1MzplMTozNzoyODoKKyAgICAgICAgICAgICAgICAgICAgNzM6NjA6N2Y6YjI6OTc6NTM6MDc6OWY6NTM6Zjk6NmQ6NTg6OTQ6ZDI6YWY6CisgICAgICAgICAgICAgICAgICAgIDhkOjZkOjg4OjY3OjgwOmU2OmVkOmIyOjk1OmNmOjcyOjMxOmNhOmE1OjFjOgorICAgICAgICAgICAgICAgICAgICA3MjpiYTo1YzowMjplNzo2NDo0MjplNzpmOTphOToyYzpkNjozYTowZDphYzoKKyAgICAgICAgICAgICAgICAgICAgOGQ6NDI6YWE6MjQ6MDE6Mzk6ZTY6OWM6M2Y6MDE6ODU6NTc6MGQ6NTg6ODc6CisgICAgICAgICAgICAgICAgICAgIDQ1OmY4OmQzOjg1OmFhOjkzOjY5OjI2Ojg1OjcwOjQ4OjgwOjNmOjEyOjE1OgorICAgICAgICAgICAgICAgICAgICBjNzo3OTpiNDoxZjowNToyZjozYjo2Mjo5OQorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA2ZDplYjoxYjowOTplOTo1ZTpkOTo1MTpkYjo2NzoyMjo2MTphNDoyYTozYzo0ODo3NzplMzoKKyAgICAgICAgYTA6N2M6YTY6ZGU6NzM6YTI6MTQ6MDM6ODU6M2Q6ZmI6YWI6MGU6MzA6YzU6ODM6MTY6MzM6CisgICAgICAgIDgxOjEzOjA4OjllOjdiOjM0OjRlOmRmOjQwOmM4Ojc0OmQ3OmI5OjdkOmRjOmY0Ojc2OjU1OgorICAgICAgICA3ZDo5Yjo2Mzo1NDoxODplOTpmMDplYTpmMzo1YzpiMTpkOTo4Yjo0MjoxZTpiOTpjMDo5NToKKyAgICAgICAgNGU6YmE6ZmE6ZDU6ZTI6N2M6ZjU6Njg6NjE6YmY6OGU6ZWM6MDU6OTc6NWY6NWI6YjA6ZDc6CisgICAgICAgIGEzOjg1OjM0OmM0OjI0OmE3OjBkOjBmOjk1OjkzOmVmOmNiOjk0OmQ4OjllOjFmOjlkOjVjOgorICAgICAgICA4NTo2ZDpjNzphYTphZTo0ZjoxZjoyMjpiNTpjZDo5NTphZDpiYTphNzpjYzpmOTphYjowYjoKKyAgICAgICAgN2E6N2YKKworR1RFIEN5YmVyVHJ1c3QgSmFwYW4gUm9vdCBDQQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiBERTpBQjpGRjo0MzoyQTo2NTozNzowNjo5QjoyODpCNTo3QTpFODo4NDpEMzo4RQorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUNFVENDQVhvQ0FVNHdEUVlKS29aSWh2Y05BUUVFQlFBd1VURUxNQWtHQTFVRUJoTUNTbEF4SHpBZEJnTlYKK0JBb1RGa041WW1WeVZISjFjM1FnU21Gd1lXNHNJRWx1WXk0eElUQWZCZ05WQkFNVEdFTjVZbVZ5VkhKMWMzUWcKK1NrRlFRVTRnVW05dmRDQkRRVEFlRncwNU9EQTRNRFF3TnpVM01EQmFGdzB3TXpBNE1EUXlNelU1TURCYU1GRXgKK0N6QUpCZ05WQkFZVEFrcFFNUjh3SFFZRFZRUUtFeFpEZVdKbGNsUnlkWE4wSUVwaGNHRnVMQ0JKYm1NdU1TRXcKK0h3WURWUVFERXhoRGVXSmxjbFJ5ZFhOMElFcEJVRUZPSUZKdmIzUWdRMEV3Z1o4d0RRWUpLb1pJaHZjTkFRRUIKK0JRQURnWTBBTUlHSkFvR0JBTGV0L01wSEVIYUovV2VzNUhNR2ZJRkxIZGExZkE1SHIreW1WSFdveFAxbHIrZkkKK3NiRnNORFdOOTdsa1Z5Z0xJVnJlZFA3Y2VDNkdSaEpNZnhFZjNKTzlYNzVtbUlhNHQreHRTZE9RMmVGNUFGWm8KK3VxMXNIeXc3SDhrc2pFT3dCRUxxZ1hPbXpqTjFSUTJLUlhJdnFsZFY1QWZEUStKMU9nKzhQTkNFenJydkFnTUIKK0FBRXdEUVlKS29aSWh2Y05BUUVFQlFBRGdZRUF0Nlprb3d5QVBCekUyTzVCTytXR3BKNWdYZFlCTXFocVpDMGcKK2NFQzZjazVtK2dkbFRnT09DLzFXNEswN0lLY3krcklTSG9EZkh1TjZHTXhYMitiSk5HRHZkZXNRRnRDa0xuRFkKK0pDTzRwWGR6UXZrSE90MEJiQWlUQnpVbUVDVmdLZjhKNVdTZmFia1dTZk5jM1NSalJwTU5zRk0yZGJ4SUlMc1oKK3RvL1FJdjA9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAxICgweDApCisgICAgICAgIFNlcmlhbCBOdW1iZXI6IDc4ICgweDRlKQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9SlAsIE89Q3liZXJUcnVzdCBKYXBhbiwgSW5jLiwgQ049Q3liZXJUcnVzdCBKQVBBTiBSb290IENBCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBBdWcgIDQgMDc6NTc6MDAgMTk5OCBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEF1ZyAgNCAyMzo1OTowMCAyMDAzIEdNVAorICAgICAgICBTdWJqZWN0OiBDPUpQLCBPPUN5YmVyVHJ1c3QgSmFwYW4sIEluYy4sIENOPUN5YmVyVHJ1c3QgSkFQQU4gUm9vdCBDQQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6Yjc6YWQ6ZmM6Y2E6NDc6MTA6NzY6ODk6ZmQ6Njc6YWM6ZTQ6NzM6MDY6CisgICAgICAgICAgICAgICAgICAgIDdjOjgxOjRiOjFkOmQ2OmI1OjdjOjBlOjQ3OmFmOmVjOmE2OjU0Ojc1OmE4OgorICAgICAgICAgICAgICAgICAgICBjNDpmZDo2NTphZjplNzpjODpiMTpiMTo2YzozNDozNTo4ZDpmNzpiOTo2NDoKKyAgICAgICAgICAgICAgICAgICAgNTc6Mjg6MGI6MjE6NWE6ZGU6NzQ6ZmU6ZGM6Nzg6MmU6ODY6NDY6MTI6NGM6CisgICAgICAgICAgICAgICAgICAgIDdmOjExOjFmOmRjOjkzOmJkOjVmOmJlOjY2Ojk4Ojg2OmI4OmI3OmVjOjZkOgorICAgICAgICAgICAgICAgICAgICA0OTpkMzo5MDpkOTplMTo3OTowMDo1Njo2ODpiYTphZDo2YzoxZjoyYzozYjoKKyAgICAgICAgICAgICAgICAgICAgMWY6Yzk6MmM6OGM6NDM6YjA6MDQ6NDI6ZWE6ODE6NzM6YTY6Y2U6MzM6NzU6CisgICAgICAgICAgICAgICAgICAgIDQ1OjBkOjhhOjQ1OjcyOjJmOmFhOjU3OjU1OmU0OjA3OmMzOjQzOmUyOjc1OgorICAgICAgICAgICAgICAgICAgICAzYTowZjpiYzozYzpkMDo4NDpjZTpiYTplZgorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBiNzphNjo2NDphMzowYzo4MDozYzoxYzpjNDpkODplZTo0MTozYjplNTo4NjphNDo5ZTo2MDoKKyAgICAgICAgNWQ6ZDY6MDE6MzI6YTg6NmE6NjQ6MmQ6MjA6NzA6NDA6YmE6NzI6NGU6NjY6ZmE6MDc6NjU6CisgICAgICAgIDRlOjAzOjhlOjBiOmZkOjU2OmUwOmFkOjNiOjIwOmE3OjMyOmZhOmIyOjEyOjFlOjgwOmRmOgorICAgICAgICAxZTplMzo3YToxODpjYzo1NzpkYjplNjpjOTozNDo2MDplZjo3NTplYjoxMDoxNjpkMDphNDoKKyAgICAgICAgMmU6NzA6ZDg6MjQ6MjM6Yjg6YTU6Nzc6NzM6NDI6Zjk6MDc6M2E6ZGQ6MDE6NmM6MDg6OTM6CisgICAgICAgIDA3OjM1OjI2OjEwOjI1OjYwOjI5OmZmOjA5OmU1OjY0OjlmOjY5OmI5OjE2OjQ5OmYzOjVjOgorICAgICAgICBkZDoyNDo2Mzo0Njo5MzowZDpiMDo1MzozNjo3NTpiYzo0ODoyMDpiYjoxOTpiNjo4ZjpkMDoKKyAgICAgICAgMjI6ZmQKKworR1RFIEN5YmVyVHJ1c3QgSmFwYW4gU2VjdXJlIFNlcnZlciBDQQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiBERDowRDowRDpCNDo3ODo0Qjo3RDpDRTozMDowQTpBNjozNTpDNjpBQjo0Qzo4OAorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUNJekNDQVl3Q0FVOHdEUVlKS29aSWh2Y05BUUVFQlFBd1dqRUxNQWtHQTFVRUJoTUNTbEF4SHpBZEJnTlYKK0JBb1RGa041WW1WeVZISjFjM1FnU21Gd1lXNHNJRWx1WXk0eEtqQW9CZ05WQkFNVElVTjVZbVZ5VkhKMWMzUWcKK1NrRlFRVTRnVTJWamRYSmxJRk5sY25abGNpQkRRVEFlRncwNU9EQTRNRFF3T0RBMk16SmFGdzB3TXpBNE1EUXkKK016VTVNREJhTUZveEN6QUpCZ05WQkFZVEFrcFFNUjh3SFFZRFZRUUtFeFpEZVdKbGNsUnlkWE4wSUVwaGNHRnUKK0xDQkpibU11TVNvd0tBWURWUVFERXlGRGVXSmxjbFJ5ZFhOMElFcEJVRUZPSUZObFkzVnlaU0JUWlhKMlpYSWcKK1EwRXdnWjh3RFFZSktvWklodmNOQVFFQkJRQURnWTBBTUlHSkFvR0JBS3dtbzZHNGIyckFMQkw1MnpFRmt1ZjkKKyt0U0J0TGpWS3RXUSt2QkRaZndTRmNyczI3bGgzak5qTjArdkFEeC9ramNiR0hQbG56eUk4Um9UUlA1NThzTW0KK2xROEw4SjRVQnlGc1Y4SmR3K0pSc00yTFg4MWZoamo0ZVpjNTdPaS9VaTZ4WHFxcHJvenQ3dGZJdHk0eGk3UTUKK2tqdDhnU2NIR2dGRUwwbHpJTGJKQWdNQkFBRXdEUVlKS29aSWh2Y05BUUVFQlFBRGdZRUFhQjE3RXU1YWVTa3gKK3lnR3NpMUNwSjVrc0FQdzRHaHovd3RYd0UvNGJwem4xZ0JUclVmckFqWHVFRzFtdXNUVlJicUUrMXh2c29KN2YKKzRLV0NsdU94UDlpbzhjdDVnSTczOEVTWmZoVDFJNk1SNDJoTEJUWnVpT09yaHFvNFV3TkNPOU81K2VDL0JlblQKK1g4TktwN2I5dDEyUVNmaWFzcTFtcG9JQWs2NWcveUE9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAxICgweDApCisgICAgICAgIFNlcmlhbCBOdW1iZXI6IDc5ICgweDRmKQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9SlAsIE89Q3liZXJUcnVzdCBKYXBhbiwgSW5jLiwgQ049Q3liZXJUcnVzdCBKQVBBTiBTZWN1cmUgU2VydmVyIENBCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBBdWcgIDQgMDg6MDY6MzIgMTk5OCBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEF1ZyAgNCAyMzo1OTowMCAyMDAzIEdNVAorICAgICAgICBTdWJqZWN0OiBDPUpQLCBPPUN5YmVyVHJ1c3QgSmFwYW4sIEluYy4sIENOPUN5YmVyVHJ1c3QgSkFQQU4gU2VjdXJlIFNlcnZlciBDQQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6YWM6MjY6YTM6YTE6Yjg6NmY6NmE6YzA6MmM6MTI6Zjk6ZGI6MzE6MDU6CisgICAgICAgICAgICAgICAgICAgIDkyOmU3OmZkOmZhOmQ0OjgxOmI0OmI4OmQ1OjJhOmQ1OjkwOmZhOmYwOjQzOgorICAgICAgICAgICAgICAgICAgICA2NTpmYzoxMjoxNTpjYTplYzpkYjpiOTo2MTpkZTozMzo2MzozNzo0ZjphZjoKKyAgICAgICAgICAgICAgICAgICAgMDA6M2M6N2Y6OTI6Mzc6MWI6MTg6NzM6ZTU6OWY6M2M6ODg6ZjE6MWE6MTM6CisgICAgICAgICAgICAgICAgICAgIDQ0OmZlOjc5OmYyOmMzOjI2Ojk1OjBmOjBiOmYwOjllOjE0OjA3OjIxOjZjOgorICAgICAgICAgICAgICAgICAgICA1NzpjMjo1ZDpjMzplMjo1MTpiMDpjZDo4Yjo1ZjpjZDo1Zjo4NjozODpmODoKKyAgICAgICAgICAgICAgICAgICAgNzk6OTc6Mzk6ZWM6ZTg6YmY6NTI6MmU6YjE6NWU6YWE6YTk6YWU6OGM6ZWQ6CisgICAgICAgICAgICAgICAgICAgIGVlOmQ3OmM4OmI3OjJlOjMxOjhiOmI0OjM5OjkyOjNiOjdjOjgxOjI3OjA3OgorICAgICAgICAgICAgICAgICAgICAxYTowMTo0NDoyZjo0OTo3MzoyMDpiNjpjOQorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA2ODoxZDo3YjoxMjplZTo1YTo3OToyOTozMTpjYTowMTphYzo4Yjo1MDphOToyNzo5OToyYzoKKyAgICAgICAgMDA6ZmM6Mzg6MWE6MWM6ZmY6YzI6ZDU6ZjA6MTM6ZmU6MWI6YTc6Mzk6ZjU6ODA6MTQ6ZWI6CisgICAgICAgIDUxOmZhOmMwOjhkOjdiOjg0OjFiOjU5OmFlOmIxOjM1OjUxOjZlOmExOjNlOmQ3OjFiOmVjOgorICAgICAgICBhMDo5ZTpkZjplMDphNTo4Mjo5NjplMzpiMTozZjpkODphODpmMTpjYjo3OTo4MDo4ZTpmNzoKKyAgICAgICAgZjA6NDQ6OTk6N2U6MTQ6ZjU6MjM6YTM6MTE6ZTM6Njg6NGI6MDU6MzY6NmU6ODg6ZTM6YWI6CisgICAgICAgIDg2OmFhOjM4OjUzOjAzOjQyOjNiOmQzOmI5OmY5OmUwOmJmOjA1OmU5OmQzOjVmOmMzOjRhOgorICAgICAgICBhNzpiNjpmZDpiNzo1ZDo5MDo0OTpmODo5YTpiMjphZDo2NjphNjo4MjowMDo5MzphZTo2MDoKKyAgICAgICAgZmY6MjAKKworR1RFIEN5YmVyVHJ1c3QgUm9vdCAyCis9PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogQkE6RUQ6MTc6NTc6OUE6NEI6RkY6N0M6Rjk6Qzk6MUY6QTI6Q0Q6MUE6RDY6ODcKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlDVURDQ0Fia0NBZ0diTUEwR0NTcUdTSWIzRFFFQkJBVUFNSEF4Q3pBSkJnTlZCQVlUQWxWVE1SZ3dGZ1lECitWUVFLRXc5SFZFVWdRMjl5Y0c5eVlYUnBiMjR4SnpBbEJnTlZCQXNUSGtkVVJTQkRlV0psY2xSeWRYTjBJRk52CitiSFYwYVc5dWN5d2dTVzVqTGpFZU1Cd0dBMVVFQXhNVlIxUkZJRU41WW1WeVZISjFjM1FnVW05dmRDQXlNQjRYCitEVGs0TURneE1URXhNelV3TjFvWERUQTRNRGd4TVRFeE1qSXhObG93Y0RFTE1Ba0dBMVVFQmhNQ1ZWTXhHREFXCitCZ05WQkFvVEQwZFVSU0JEYjNKd2IzSmhkR2x2YmpFbk1DVUdBMVVFQ3hNZVIxUkZJRU41WW1WeVZISjFjM1FnCitVMjlzZFhScGIyNXpMQ0JKYm1NdU1SNHdIQVlEVlFRREV4VkhWRVVnUTNsaVpYSlVjblZ6ZENCU2IyOTBJREl3CitnWjh3RFFZSktvWklodmNOQVFFQkJRQURnWTBBTUlHSkFvR0JBTmtzVEU0dmFSb2o0MWE2ODg2RXdBbkFlZkZFCitYek1mRlpGL2lvZ291Q1JGekk4WXpSOTAwYldQY1V6V01mWnpsb1NVUU1XcGcyQWtmYTl2TkxkTFRNSUpnRHRGCitCSjdFUE1RbmRYc0FES0ZrUjdVVVhZSkxVVHBZdTBSTVBkUGxCampvWVZ5WWVMdUFzNXphY29KaW9OK2NYK3Y1CitUM2ZDekdBWUFHczBnaVd6QWdNQkFBRXdEUVlKS29aSWh2Y05BUUVFQlFBRGdZRUFvMlNSYnhEdDUyNmlRa0NVCitlTTc0RkFqUitrT0Y2MGJOa2hUUTd5NHROamtZMmJySko0Z3A2VWdYYi9qQnFzaGhiUzM5UUMxMVF6Q1hPZmdVCitaTDF2NzJPb0swTGZzbG9OSmV4N045ak9rU21DRnZub1lxTGhkc1FDZmQwbGk1amg5ZzFnalBaWmtFQlJSTkhDCisreGtrSGhjNWEzUWhGVFBXVmRlQ0huQXNKNmc9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAxICgweDApCisgICAgICAgIFNlcmlhbCBOdW1iZXI6IDQxMSAoMHgxOWIpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1VUywgTz1HVEUgQ29ycG9yYXRpb24sIE9VPUdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLiwgQ049R1RFIEN5YmVyVHJ1c3QgUm9vdCAyCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBBdWcgMTEgMTE6MzU6MDcgMTk5OCBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEF1ZyAxMSAxMToyMjoxNiAyMDA4IEdNVAorICAgICAgICBTdWJqZWN0OiBDPVVTLCBPPUdURSBDb3Jwb3JhdGlvbiwgT1U9R1RFIEN5YmVyVHJ1c3QgU29sdXRpb25zLCBJbmMuLCBDTj1HVEUgQ3liZXJUcnVzdCBSb290IDIKKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgxMDI0IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgxMDI0IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmQ5OjJjOjRjOjRlOjJmOjY5OjFhOjIzOmUzOjU2OmJhOmYzOmNlOjg0OgorICAgICAgICAgICAgICAgICAgICBjMDowOTpjMDo3OTpmMTo0NDo1ZjozMzoxZjoxNTo5MTo3Zjo4YTo4ODoyODoKKyAgICAgICAgICAgICAgICAgICAgYjg6MjQ6NDU6Y2M6OGY6MTg6Y2Q6MWY6NzQ6ZDE6YjU6OGY6NzE6NGM6ZDY6CisgICAgICAgICAgICAgICAgICAgIDMxOmY2OjczOjk2Ojg0Ojk0OjQwOmM1OmE5OjgzOjYwOjI0OjdkOmFmOjZmOgorICAgICAgICAgICAgICAgICAgICAzNDpiNzo0Yjo0YzpjMjowOTo4MDozYjo0NTowNDo5ZTpjNDozYzpjNDoyNzoKKyAgICAgICAgICAgICAgICAgICAgNzU6N2I6MDA6MGM6YTE6NjQ6NDc6YjU6MTQ6NWQ6ODI6NGI6NTE6M2E6NTg6CisgICAgICAgICAgICAgICAgICAgIGJiOjQ0OjRjOjNkOmQzOmU1OjA2OjM4OmU4OjYxOjVjOjk4Ojc4OmJiOjgwOgorICAgICAgICAgICAgICAgICAgICBiMzo5YzpkYTo3Mjo4Mjo2MjphMDpkZjo5Yzo1ZjplYjpmOTo0Zjo3NzpjMjoKKyAgICAgICAgICAgICAgICAgICAgY2M6NjA6MTg6MDA6NmI6MzQ6ODI6MjU6YjMKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgYTM6NjQ6OTE6NmY6MTA6ZWQ6ZTc6NmU6YTI6NDI6NDA6OTQ6Nzg6Y2U6Zjg6MTQ6MDg6ZDE6CisgICAgICAgIGZhOjQzOjg1OmViOjQ2OmNkOjkyOjE0OmQwOmVmOjJlOjJkOjM2OjM5OjE4OmQ5OmJhOmM5OgorICAgICAgICAyNzo4ODoyOTplOTo0ODoxNzo2ZjpmODpjMTphYTpjODo2MTo2ZDoyZDpmZDo0MDoyZDo3NToKKyAgICAgICAgNDM6MzA6OTc6Mzk6Zjg6MTQ6NjQ6YmQ6NmY6ZWY6NjM6YTg6MmI6NDI6ZGY6YjI6NWE6MGQ6CisgICAgICAgIDI1OmVjOjdiOjM3OmQ4OmNlOjkxOjI5OjgyOjE2OmY5OmU4OjYyOmEyOmUxOjc2OmM0OjAyOgorICAgICAgICA3ZDpkZDoyNTo4Yjo5ODplMTpmNjowZDo2MDo4YzpmNjo1OTo5MDo0MDo1MTo0NDpkMTpjMjoKKyAgICAgICAgZmI6MTk6MjQ6MWU6MTc6Mzk6NmI6NzQ6MjE6MTU6MzM6ZDY6NTU6ZDc6ODI6MWU6NzA6MmM6CisgICAgICAgIDI3OmE4CisKK0dURSBDeWJlclRydXN0IFJvb3QgMworPT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IERCOjgxOjk2OjU3OkFFOjY0OjYxOkVGOjc3OkE3OjgzOkM0OjUxOjI0OjNDOjg3CitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQ1VEQ0NBYmtDQWdHWE1BMEdDU3FHU0liM0RRRUJCUVVBTUhBeEN6QUpCZ05WQkFZVEFsVlRNUmd3RmdZRAorVlFRS0V3OUhWRVVnUTI5eWNHOXlZWFJwYjI0eEp6QWxCZ05WQkFzVEhrZFVSU0JEZVdKbGNsUnlkWE4wSUZOdgorYkhWMGFXOXVjeXdnU1c1akxqRWVNQndHQTFVRUF4TVZSMVJGSUVONVltVnlWSEoxYzNRZ1VtOXZkQ0F6TUI0WAorRFRrNE1EZ3hNREU1TlRrd09Gb1hEVEE0TURneE1ERTVNell6T1Zvd2NERUxNQWtHQTFVRUJoTUNWVk14R0RBVworQmdOVkJBb1REMGRVUlNCRGIzSndiM0poZEdsdmJqRW5NQ1VHQTFVRUN4TWVSMVJGSUVONVltVnlWSEoxYzNRZworVTI5c2RYUnBiMjV6TENCSmJtTXVNUjR3SEFZRFZRUURFeFZIVkVVZ1EzbGlaWEpVY25WemRDQlNiMjkwSURNdworZ1o4d0RRWUpLb1pJaHZjTkFRRUJCUUFEZ1kwQU1JR0pBb0dCQU9IenNTc0x6dHdVMlRTWFlsQVNWbU9FVEZQNgord0lYUCtzSGREOTU1RTM5VCs2b09ZTjNpWXIvRzdrNlpOS3BvUXpXWitLUDk4Mk85QVZScW5ySTZsaXg3ZUNqRworV3JXTkdoVVkvZU9NTHFKUUNWdHgxZzIxR0I4WmpnUXBrNU40cTE4VTUzTkM4Z01NVjZJYlVEc0x1MW5nb0RvRAorN2ljYldreTVzQWpLdVJxSkFnTUJBQUV3RFFZSktvWklodmNOQVFFRkJRQURnWUVBaGV1dGxDQUc2YktpYXp2eQorWnV2alM3Z1NKZ1hsOUpHbzNJZmNtUFNVd2ZSaHZkV2NiRkZ6bFY3UXZkZm1SZHc4ejBhRTFlZTU3T1JuWTI0QQorS0hkeFhVb0Y2Ymw4aHN6Q1JMdmVLVWphNnQyOUY1OGRVUUdvNkJSZXNWZjMvOXFQenBYK0xlMHlFbmYvZkdwaAorbGE0eGNnWUk4UG56RFk3aTc2aFRYWkVEZzk0PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMSAoMHgwKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiA0MDcgKDB4MTk3KQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBPPUdURSBDb3Jwb3JhdGlvbiwgT1U9R1RFIEN5YmVyVHJ1c3QgU29sdXRpb25zLCBJbmMuLCBDTj1HVEUgQ3liZXJUcnVzdCBSb290IDMKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IEF1ZyAxMCAxOTo1OTowOCAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogQXVnIDEwIDE5OjM2OjM5IDIwMDggR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89R1RFIENvcnBvcmF0aW9uLCBPVT1HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4sIENOPUdURSBDeWJlclRydXN0IFJvb3QgMworICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6ZTE6ZjM6YjE6MmI6MGI6Y2U6ZGM6MTQ6ZDk6MzQ6OTc6NjI6NTA6MTI6CisgICAgICAgICAgICAgICAgICAgIDU2OjYzOjg0OjRjOjUzOmZhOmMwOjg1OmNmOmZhOmMxOmRkOjBmOmRlOjc5OgorICAgICAgICAgICAgICAgICAgICAxMzo3Zjo1MzpmYjphYTowZTo2MDpkZDplMjo2MjpiZjpjNjplZTo0ZTo5OToKKyAgICAgICAgICAgICAgICAgICAgMzQ6YWE6Njg6NDM6MzU6OTk6Zjg6YTM6ZmQ6ZjM6NjM6YmQ6MDE6NTQ6NmE6CisgICAgICAgICAgICAgICAgICAgIDllOmIyOjNhOjk2OjJjOjdiOjc4OjI4OmM2OjVhOmI1OjhkOjFhOjE1OjE4OgorICAgICAgICAgICAgICAgICAgICBmZDplMzo4YzoyZTphMjo1MDowOTo1Yjo3MTpkNjowZDpiNToxODoxZjoxOToKKyAgICAgICAgICAgICAgICAgICAgOGU6MDQ6Mjk6OTM6OTM6Nzg6YWI6NWY6MTQ6ZTc6NzM6NDI6ZjI6MDM6MGM6CisgICAgICAgICAgICAgICAgICAgIDU3OmEyOjFiOjUwOjNiOjBiOmJiOjU5OmUwOmEwOjNhOjAzOmVlOjI3OjFiOgorICAgICAgICAgICAgICAgICAgICA1YTo0YzpiOTpiMDowODpjYTpiOToxYTo4OQorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgODU6ZWI6YWQ6OTQ6MjA6MDY6ZTk6YjI6YTI6NmI6M2I6ZjI6NjY6ZWI6ZTM6NGI6Yjg6MTI6CisgICAgICAgIDI2OjA1OmU1OmY0OjkxOmE4OmRjOjg3OmRjOjk4OmY0Ojk0OmMxOmY0OjYxOmJkOmQ1OjljOgorICAgICAgICA2Yzo1MTo3Mzo5NTo1ZTpkMDpiZDpkNzplNjo0NTpkYzozYzpjZjo0Njo4NDpkNTplNzpiOToKKyAgICAgICAgZWM6ZTQ6Njc6NjM6NmU6MDA6Mjg6Nzc6NzE6NWQ6NGE6MDU6ZTk6Yjk6N2M6ODY6Y2M6YzI6CisgICAgICAgIDQ0OmJiOmRlOjI5OjQ4OmRhOmVhOmRkOmJkOjE3OjlmOjFkOjUxOjAxOmE4OmU4OjE0OjVlOgorICAgICAgICBiMTo1NzpmNzpmZjpkYTo4ZjpjZTo5NTpmZToyZDplZDozMjoxMjo3NzpmZjo3Yzo2YTo2MToKKyAgICAgICAgOTU6YWU6MzE6NzI6MDY6MDg6ZjA6Zjk6ZjM6MGQ6OGU6ZTI6ZWY6YTg6NTM6NWQ6OTE6MDM6CisgICAgICAgIDgzOmRlCisKK0dURSBDeWJlclRydXN0IFJvb3QgNAorPT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IDMzOjQzOjAyOkIxOkI5OkUwOjczOkIxOkIxOjIwOkNBOkNCOkM3Ojg0OjAzOjUwCitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRFZUQ0NBajBDQWdHb01BMEdDU3FHU0liM0RRRUJCUVVBTUhBeEN6QUpCZ05WQkFZVEFsVlRNUmd3RmdZRAorVlFRS0V3OUhWRVVnUTI5eWNHOXlZWFJwYjI0eEp6QWxCZ05WQkFzVEhrZFVSU0JEZVdKbGNsUnlkWE4wSUZOdgorYkhWMGFXOXVjeXdnU1c1akxqRWVNQndHQTFVRUF4TVZSMVJGSUVONVltVnlWSEoxYzNRZ1VtOXZkQ0EwTUI0WAorRFRrNE1EZ3hNekV6TlRFd01Gb1hEVEV6TURneE16SXpOVGt3TUZvd2NERUxNQWtHQTFVRUJoTUNWVk14R0RBVworQmdOVkJBb1REMGRVUlNCRGIzSndiM0poZEdsdmJqRW5NQ1VHQTFVRUN4TWVSMVJGSUVONVltVnlWSEoxYzNRZworVTI5c2RYUnBiMjV6TENCSmJtTXVNUjR3SEFZRFZRUURFeFZIVkVVZ1EzbGlaWEpVY25WemRDQlNiMjkwSURRdworZ2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQzZuU0p1ZjlwbVBEbENzYU1xYjlQMwordks2c01WclhFWkJIdVowWkx2bnpHeUtndytHbnVzVDhYZ3FVUzVoYVN5YmtIL1RjOC82T2lOeHNMWHgzaHlaUQord0Y1T3FDaWg2aGRwVDAzR0FRN2FtZzBHVmlZVnRxUmRlald2amUxNFVvYjVPS3V6QWRQYUJaYXh0bENyd0tHdQorRjFQNlF6a2djV1VqMjIzRXR1MllSWVBYMHZiaXFXdjcrWFhNNzhXcmNaWTE2TitPa1p1b0VIVWZ0ODRUam11egorbG5lWEdwRXZ4eXhwbWZBUEttZ0FtSFpFRzR3bzB1dU85SU8wZjZRbFhtdzcyY1pvMVdHNDFGNHhCN1Zia0RWUworVjNzWElPMHR1QjZPaURrK1VzdmY4Rnl4WmJ1bEVyU1FZNzl4blRMQjJyOVFTcFcrQmpyRUsrdk5tSFpFVFF2bAorQWdNQkFBRXdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBRU92SElmSlNicGxpVFJKUE9vSE8wZWllZFNnTzVCcworM24rb1ZNUG9URUF5dk1qc0hPWFpyRUM2L0l3L3duT2M5R1RxMzZudFRsdklBV0R1T1cxREovTi9xZ2pTL2s1dgorRkRKTmZlUTBnS1UxeE5aR1VMUTdvQzFsSDA5bGZqUW9MY0NuZG4weHlRMHpGdllnR1NBUlVMc0R6SEJ0bHJmdgorVEtmYU5oWFB1MDNVbHR5SVRXeVk3Ymx6L2loWG9PMWsrQXFCS1hQMjlwY3loem0wZ2UvWlRSb0hOUGU2UWpYZQorVjl4YzF2ZkY2d29uRElHbXd0Qm9UdjJTVzBpRDloYUtqelpiN1RGc1AwRjZjZmVTUHpHa0NrQk04NGJpWWNFOAorU1lFdHBianZ1cGNQdkNzZG00bnkwbzRlVFlieXdxdjJMWm5BR3lvTm9iWlArU3hZVFQxOU53bz0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDEgKDB4MCkKKyAgICAgICAgU2VyaWFsIE51bWJlcjogNDI0ICgweDFhOCkKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1VUywgTz1HVEUgQ29ycG9yYXRpb24sIE9VPUdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLiwgQ049R1RFIEN5YmVyVHJ1c3QgUm9vdCA0CisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBBdWcgMTMgMTM6NTE6MDAgMTk5OCBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEF1ZyAxMyAyMzo1OTowMCAyMDEzIEdNVAorICAgICAgICBTdWJqZWN0OiBDPVVTLCBPPUdURSBDb3Jwb3JhdGlvbiwgT1U9R1RFIEN5YmVyVHJ1c3QgU29sdXRpb25zLCBJbmMuLCBDTj1HVEUgQ3liZXJUcnVzdCBSb290IDQKKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgyMDQ4IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgyMDQ4IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmJhOjlkOjIyOjZlOjdmOmRhOjY2OjNjOjM5OjQyOmIxOmEzOjJhOjZmOgorICAgICAgICAgICAgICAgICAgICBkMzpmNzpiYzphZTphYzozMTo1YTpkNzoxMTo5MDo0NzpiOTo5ZDoxOToyZToKKyAgICAgICAgICAgICAgICAgICAgZjk6ZjM6MWI6MjI6YTA6YzM6ZTE6YTc6YmE6YzQ6ZmM6NWU6MGE6OTQ6NGI6CisgICAgICAgICAgICAgICAgICAgIDk4OjVhOjRiOjI2OmU0OjFmOmY0OmRjOmYzOmZlOjhlOjg4OmRjOjZjOjJkOgorICAgICAgICAgICAgICAgICAgICA3Yzo3Nzo4NzoyNjo1MDpjMDo1ZTo0ZTphODoyODphMTplYToxNzo2OTo0ZjoKKyAgICAgICAgICAgICAgICAgICAgNGQ6YzY6MDE6MGU6ZGE6OWE6MGQ6MDY6NTY6MjY6MTU6YjY6YTQ6NWQ6N2E6CisgICAgICAgICAgICAgICAgICAgIDM1OmFmOjhkOmVkOjc4OjUyOjg2OmY5OjM4OmFiOmIzOjAxOmQzOmRhOjA1OgorICAgICAgICAgICAgICAgICAgICA5NjpiMTpiNjo1MDphYjpjMDphMTphZToxNzo1MzpmYTo0MzozOToyMDo3MToKKyAgICAgICAgICAgICAgICAgICAgNjU6MjM6ZGI6NmQ6YzQ6YjY6ZWQ6OTg6NDU6ODM6ZDc6ZDI6ZjY6ZTI6YTk6CisgICAgICAgICAgICAgICAgICAgIDZiOmZiOmY5Ojc1OmNjOmVmOmM1OmFiOjcxOjk2OjM1OmU4OmRmOjhlOjkxOgorICAgICAgICAgICAgICAgICAgICA5YjphODoxMDo3NToxZjpiNzpjZToxMzo4ZTo2YjpiMzo5Njo3Nzo5NzoxYToKKyAgICAgICAgICAgICAgICAgICAgOTE6MmY6Yzc6MmM6Njk6OTk6ZjA6MGY6MmE6Njg6MDA6OTg6NzY6NDQ6MWI6CisgICAgICAgICAgICAgICAgICAgIDhjOjI4OmQyOmViOjhlOmY0OjgzOmI0OjdmOmE0OjI1OjVlOjZjOjNiOmQ5OgorICAgICAgICAgICAgICAgICAgICBjNjo2ODpkNTo2MTpiODpkNDo1ZTozMTowNzpiNTo1Yjo5MDozNTo1Mjo1NzoKKyAgICAgICAgICAgICAgICAgICAgN2I6MTc6MjA6ZWQ6MmQ6Yjg6MWU6OGU6ODg6Mzk6M2U6NTI6Y2I6ZGY6ZjA6CisgICAgICAgICAgICAgICAgICAgIDVjOmIxOjY1OmJiOmE1OjEyOmI0OjkwOjYzOmJmOjcxOjlkOjMyOmMxOmRhOgorICAgICAgICAgICAgICAgICAgICBiZjo1MDo0YTo5NTpiZTowNjozYTpjNDoyYjplYjpjZDo5ODo3Njo0NDo0ZDoKKyAgICAgICAgICAgICAgICAgICAgMGI6ZTUKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDQzOmFmOjFjOjg3OmM5OjQ5OmJhOjY1Ojg5OjM0OjQ5OjNjOmVhOjA3OjNiOjQ3OmEyOjc5OgorICAgICAgICBkNDphMDozYjo5MDo2YzpkZTo3ZjphODo1NDpjMzplODo0Yzo0MDozMjpiYzpjODplYzoxYzoKKyAgICAgICAgZTU6ZDk6YWM6NDA6YmE6ZmM6OGM6M2Y6YzI6NzM6OWM6ZjQ6NjQ6ZWE6ZGY6YTk6ZWQ6NGU6CisgICAgICAgIDViOmM4OjAxOjYwOmVlOjM5OjZkOjQzOjI3OmYzOjdmOmFhOjA4OmQyOmZlOjRlOjZmOjE0OgorICAgICAgICAzMjo0ZDo3ZDplNDozNDo4MDphNTozNTpjNDpkNjo0Njo1MDpiNDozYjphMDoyZDo2NToxZjoKKyAgICAgICAgNGY6NjU6N2U6MzQ6Mjg6MmQ6YzA6YTc6NzY6N2Q6MzE6Yzk6MGQ6MzM6MTY6ZjY6MjA6MTk6CisgICAgICAgIDIwOjExOjUwOmJiOjAzOmNjOjcwOjZkOjk2OmI3OmVmOjRjOmE3OmRhOjM2OjE1OmNmOmJiOgorICAgICAgICA0ZDpkNDo5NjpkYzo4ODo0ZDo2Yzo5ODplZDpiOTo3MzpmZToyODo1NzphMDplZDo2NDpmODoKKyAgICAgICAgMGE6ODE6Mjk6NzM6ZjY6ZjY6OTc6MzI6ODc6Mzk6YjQ6ODE6ZWY6ZDk6NGQ6MWE6MDc6MzQ6CisgICAgICAgIGY3OmJhOjQyOjM1OmRlOjU3OmRjOjVjOmQ2OmY3OmM1OmViOjBhOjI3OjBjOjgxOmE2OmMyOgorICAgICAgICBkMDo2ODo0ZTpmZDo5Mjo1Yjo0ODo4MzpmNjoxNjo4YTo4ZjozNjo1YjplZDozMTo2YzozZjoKKyAgICAgICAgNDE6N2E6NzE6Zjc6OTI6M2Y6MzE6YTQ6MGE6NDA6NGM6ZjM6ODY6ZTI6NjE6YzE6M2M6NDk6CisgICAgICAgIDgxOjJkOmE1OmI4OmVmOmJhOjk3OjBmOmJjOjJiOjFkOjliOjg5OmYyOmQyOjhlOjFlOjRkOgorICAgICAgICA4NjpmMjpjMjphYjpmNjoyZDo5OTpjMDoxYjoyYTowZDphMTpiNjo0ZjpmOToyYzo1ODo0ZDoKKyAgICAgICAgM2Q6N2Q6Mzc6MGEKKworR1RFIEN5YmVyVHJ1c3QgUm9vdCA1Cis9PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogN0Q6NkM6ODY6RTQ6RkM6NEQ6RDE6MEI6MDA6QkE6MjI6QkI6NEU6N0M6NkE6OEUKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEdGpDQ0FwNmdBd0lCQWdJQ0FiWXdEUVlKS29aSWh2Y05BUUVGQlFBd2NERUxNQWtHQTFVRUJoTUNWVk14CitHREFXQmdOVkJBb1REMGRVUlNCRGIzSndiM0poZEdsdmJqRW5NQ1VHQTFVRUN4TWVSMVJGSUVONVltVnlWSEoxCitjM1FnVTI5c2RYUnBiMjV6TENCSmJtTXVNUjR3SEFZRFZRUURFeFZIVkVVZ1EzbGlaWEpVY25WemRDQlNiMjkwCitJRFV3SGhjTk9UZ3dPREUwTVRRMU1EQXdXaGNOTVRNd09ERTBNak0xT1RBd1dqQndNUXN3Q1FZRFZRUUdFd0pWCitVekVZTUJZR0ExVUVDaE1QUjFSRklFTnZjbkJ2Y21GMGFXOXVNU2N3SlFZRFZRUUxFeDVIVkVVZ1EzbGlaWEpVCitjblZ6ZENCVGIyeDFkR2x2Ym5Nc0lFbHVZeTR4SGpBY0JnTlZCQU1URlVkVVJTQkRlV0psY2xSeWRYTjBJRkp2CitiM1FnTlRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTHdTYmorS2ZIcVhBZXdlCit1emxhQXZSNFJLSklHNDU3U1ZKNnVIdEhzNitVbTIrN2x2b3JhbVZjdUJ5VWM3Ni9pUW9pZ081WC9Jd0Z1M0NmCitsemtFMnFPSFhLamx5cS9BTTVyVk4xeExyT1NBMEtZallQdjljaTZVbmNmT3dnUXk3M2hnWGUydGh3OUZaUjQ4CittZ3FhdmwwZG1lem44dEhHZWhmWnJadFVsbi9FZkdDL2hhb1ZOUjFBMmhHODdGUWhLQzBqb2Fqd3p5M04zZngrCitEMTdoWlFkV3l3ZTAwbGJvWGpITUdHUEVodEl0aGMrVGtxdHQvbWc1Kzk1enZZYjQ1RVo2NnA4TXkvUVovbU84CiswU3g3aURNMjl1VGhuQXhUZ1dBYzJpNnJscWtXaUJOUW1iSzlWZDhWTUg3bzVaajdjSDVzdFFmOC9FYTMwTzAzCitsbjR5L2lFQ0F3RUFBYU5hTUZnd0VnWURWUjBUQVFIL0JBZ3dCZ0VCL3dJQkJUQU9CZ05WSFE4QkFmOEVCQU1DCitBUVl3RndZRFZSMGdCQkF3RGpBTUJnb3Foa2lHK0dNQkFnRURNQmtHQTFVZERnUVNCQkIyQ2traE9FeWYzdmpFCitTY2R4Y1pHZE1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQkJPdFFZVzlxNDNpRWM0WTRKNWZGb05QL2VsdlFICis5YWM4ODZ4S3NadjZrdnFiN2VZeUlhcEtkc1hjVHpqbDM5V0c1TlhJZG4yWTE3SE5qMDIxa1NOc2k0cnI2bnp2CitGSlRFeHZBZlNpMHljV01yWTVFbUFnbTJnQjN0NHN5NGY5dUhZOGpoMEd3bXNUVWRRR1lRRzgyVlZCZ3pZZXdUCitUOW9UOTVtdlB0RFBqcVp5b3JQREJackpKMzJTekg1U2piT3JjRzJlaVo5TjZ4cDF3cGlxMVFJVzF3eUt2eVhrCis2eTI4bU9sWU9CbDh1VGYrMitLWkNITUd4NWVEYW4wUUFTOHl1UmNGU21YbUw4NitYbE9tZ3VtYVV3cUVkQzJECit5c2lVRm5aZmxHRW84SVduT2J2WGk5bW9zaE1kVkFrMEpIMGdnWDFtZnFLUWRGd1F4cjNzcXh2QworLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiA0MzggKDB4MWI2KQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBPPUdURSBDb3Jwb3JhdGlvbiwgT1U9R1RFIEN5YmVyVHJ1c3QgU29sdXRpb25zLCBJbmMuLCBDTj1HVEUgQ3liZXJUcnVzdCBSb290IDUKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IEF1ZyAxNCAxNDo1MDowMCAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogQXVnIDE0IDIzOjU5OjAwIDIwMTMgR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89R1RFIENvcnBvcmF0aW9uLCBPVT1HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4sIENOPUdURSBDeWJlclRydXN0IFJvb3QgNQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDIwNDggYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDIwNDggYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6YmM6MTI6NmU6M2Y6OGE6N2M6N2E6OTc6MDE6ZWM6MWU6YmI6Mzk6NWE6CisgICAgICAgICAgICAgICAgICAgIDAyOmY0Ojc4OjQ0OmEyOjQ4OjFiOjhlOjdiOjQ5OjUyOjdhOmI4OjdiOjQ3OgorICAgICAgICAgICAgICAgICAgICBiMzphZjo5NDo5Yjo2ZjpiYjo5NjpmYToyYjo2YTo2NTo1YzpiODoxYzo5NDoKKyAgICAgICAgICAgICAgICAgICAgNzM6YmU6YmY6ODk6MGE6MjI6ODA6ZWU6NTc6ZmM6OGM6MDU6YmI6NzA6OWY6CisgICAgICAgICAgICAgICAgICAgIDk3OjM5OjA0OmRhOmEzOjg3OjVjOmE4OmU1OmNhOmFmOmMwOjMzOjlhOmQ1OgorICAgICAgICAgICAgICAgICAgICAzNzo1Yzo0YjphYzplNDo4MDpkMDphNjoyMzo2MDpmYjpmZDo3MjoyZTo5NDoKKyAgICAgICAgICAgICAgICAgICAgOWQ6Yzc6Y2U6YzI6MDQ6MzI6ZWY6Nzg6NjA6NWQ6ZWQ6YWQ6ODc6MGY6NDU6CisgICAgICAgICAgICAgICAgICAgIDY1OjFlOjNjOjlhOjBhOjlhOmJlOjVkOjFkOjk5OmVjOmU3OmYyOmQxOmM2OgorICAgICAgICAgICAgICAgICAgICA3YToxNzpkOTphZDo5Yjo1NDo5Njo3ZjpjNDo3Yzo2MDpiZjo4NTphYToxNToKKyAgICAgICAgICAgICAgICAgICAgMzU6MWQ6NDA6ZGE6MTE6YmM6ZWM6NTQ6MjE6Mjg6MmQ6MjM6YTE6YTg6ZjA6CisgICAgICAgICAgICAgICAgICAgIGNmOjJkOmNkOmRkOmZjOjdlOjBmOjVlOmUxOjY1OjA3OjU2OmNiOjA3OmI0OgorICAgICAgICAgICAgICAgICAgICBkMjo1NjplODo1ZTozMTpjYzoxODo2MzpjNDo4NjpkMjoyZDo4NTpjZjo5MzoKKyAgICAgICAgICAgICAgICAgICAgOTI6YWI6NmQ6ZmU6Njg6Mzk6ZmI6ZGU6NzM6YmQ6ODY6Zjg6ZTQ6NDY6N2E6CisgICAgICAgICAgICAgICAgICAgIGVhOjlmOjBjOmNiOmY0OjE5OmZlOjYzOmJjOmQxOjJjOjdiOjg4OjMzOjM2OgorICAgICAgICAgICAgICAgICAgICBmNjplNDplMTo5YzowYzo1Mzo4MTo2MDoxYzpkYToyZTphYjo5NjphOToxNjoKKyAgICAgICAgICAgICAgICAgICAgODg6MTM6NTA6OTk6YjI6YmQ6NTU6ZGY6MTU6MzA6N2U6ZTg6ZTU6OTg6ZmI6CisgICAgICAgICAgICAgICAgICAgIDcwOjdlOjZjOmI1OjA3OmZjOmZjOjQ2OmI3OmQwOmVkOjM3Ojk2OjdlOjMyOgorICAgICAgICAgICAgICAgICAgICBmZToyMQorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBYNTA5djMgQmFzaWMgQ29uc3RyYWludHM6IGNyaXRpY2FsCisgICAgICAgICAgICAgICAgQ0E6VFJVRSwgcGF0aGxlbjo1CisgICAgICAgICAgICBYNTA5djMgS2V5IFVzYWdlOiBjcml0aWNhbAorICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIFNpZ24sIENSTCBTaWduCisgICAgICAgICAgICBYNTA5djMgQ2VydGlmaWNhdGUgUG9saWNpZXM6IAorICAgICAgICAgICAgICAgIFBvbGljeTogMS4yLjg0MC4xMTM3NjMuMS4yLjEuMworCisgICAgICAgICAgICBYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAgNzY6MEE6NDk6MjE6Mzg6NEM6OUY6REU6Rjg6QzQ6NDk6Qzc6NzE6NzE6OTE6OUQKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgNDE6M2E6ZDQ6MTg6NWI6ZGE6Yjg6ZGU6MjE6MWM6ZTE6OGU6MDk6ZTU6ZjE6Njg6MzQ6ZmY6CisgICAgICAgIGRlOjk2OmY0OjA3OmY1OmE3OjNjOmYzOmFjOjRhOmIxOjliOmZhOjkyOmZhOjliOmVkOmU2OgorICAgICAgICAzMjoyMTphYTo0YTo3NjpjNTpkYzo0ZjozODplNTpkZjpkNTo4NjplNDpkNTpjODo3Njo3ZDoKKyAgICAgICAgOTg6ZDc6YjE6Y2Q6OGY6NGQ6YjU6OTE6MjM6NmM6OGI6OGE6ZWI6ZWE6N2M6ZWY6MTQ6OTQ6CisgICAgICAgIGM0OmM2OmYwOjFmOjRhOjJkOjMyOjcxOjYzOjJiOjYzOjkxOjI2OjAyOjA5OmI2OjgwOjFkOgorICAgICAgICBlZDplMjpjYzpiODo3ZjpkYjo4Nzo2MzpjODplMTpkMDo2YzoyNjpiMTozNToxZDo0MDo2NjoKKyAgICAgICAgMTA6MWI6Y2Q6OTU6NTQ6MTg6MzM6NjE6ZWM6MTM6NGY6ZGE6MTM6Zjc6OTk6YWY6M2U6ZDA6CisgICAgICAgIGNmOjhlOmE2OjcyOmEyOmIzOmMzOjA1OjlhOmM5OjI3OjdkOjkyOmNjOjdlOjUyOjhkOmIzOgorICAgICAgICBhYjo3MDo2ZDo5ZTo4OTo5Zjo0ZDplYjoxYTo3NTpjMjo5ODphYTpkNTowMjoxNjpkNzowYzoKKyAgICAgICAgOGE6YmY6MjU6ZTQ6ZWI6MmQ6YmM6OTg6ZTk6NTg6Mzg6MTk6N2M6Yjk6Mzc6ZmU6ZGI6ZTI6CisgICAgICAgIDk5OjA4OjczOjA2OmM3Ojk3OjgzOjZhOjdkOjEwOjAxOjJmOjMyOmI5OjE3OjA1OjRhOjY1OgorICAgICAgICBlNjoyZjpjZTpiZTo1ZTo1MzphNjo4MjplOTo5YTo1MzowYTo4NDo3NDoyZDo4MzpjYTpjODoKKyAgICAgICAgOTQ6MTY6NzY6NWY6OTQ6NjE6Mjg6ZjA6ODU6YTc6Mzk6YmI6ZDc6OGI6ZDk6YTg6YjI6MTM6CisgICAgICAgIDFkOjU0OjA5OjM0OjI0OjdkOjIwOjgxOjdkOjY2OjdlOmEyOjkwOjc0OjVjOjEwOmM2OmJkOgorICAgICAgICBlYzphYjoxYjpjMgorCitHVEUgQ3liZXJUcnVzdCBSb290IENBCis9PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IEM0OkQ3OkYwOkIyOkEzOkM1OjdEOjYxOjY3OkYwOjA0OkNEOjQzOkQzOkJBOjU4CitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQitqQ0NBV01DQWdHak1BMEdDU3FHU0liM0RRRUJCQVVBTUVVeEN6QUpCZ05WQkFZVEFsVlRNUmd3RmdZRAorVlFRS0V3OUhWRVVnUTI5eWNHOXlZWFJwYjI0eEhEQWFCZ05WQkFNVEUwZFVSU0JEZVdKbGNsUnlkWE4wSUZKdgorYjNRd0hoY05PVFl3TWpJek1qTXdNVEF3V2hjTk1EWXdNakl6TWpNMU9UQXdXakJGTVFzd0NRWURWUVFHRXdKVgorVXpFWU1CWUdBMVVFQ2hNUFIxUkZJRU52Y25CdmNtRjBhVzl1TVJ3d0dnWURWUVFERXhOSFZFVWdRM2xpWlhKVQorY25WemRDQlNiMjkwTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FDNDVrKzYyNWg4Y1h5dgorUkxmVEQwYlpaT1dUd1VLT3g3cEpqVFV0ZXVlTHZlVUZNVm5Hc1M4S0RQdWZweitpQ1dhRVZoNDNLUnVINlg0TQoreXBxZnBYLzFGWlNqMWFKR2d0aG9UTkUzRlFab3I3MzRzTFB3S2ZXVldna1dZWGNLSWlYVVQwV3F4NzNsbHQvNQorMUtpT1Fzd2t3QjZSSjBxMWJRYUFZem5Fb2w0NEF3SURBUUFCTUEwR0NTcUdTSWIzRFFFQkJBVUFBNEdCQUJLegorZGNaZkhlRmhWWUFBMUlGTGV6RVBJMlBuUGZNRCtmUTJxTHZaNDZXWFRlb3JLZURXYW5PQjVzQ0pvOVB4NEtXbAorSWplYVk4SklJTFRiY3VQSTl0bDh2ckd2VTlvVXRDRzQxdFdXNC81T0RGbGl0cHBLK1VMZGpHK0JxWEgvOUFweQorYlcxRURwM3pkSFNvMVRSSjZWNmU2YlI2NGVWYUg0UXduTk9mcFNYWQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMSAoMHgwKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiA0MTkgKDB4MWEzKQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9VVMsIE89R1RFIENvcnBvcmF0aW9uLCBDTj1HVEUgQ3liZXJUcnVzdCBSb290CisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBGZWIgMjMgMjM6MDE6MDAgMTk5NiBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEZlYiAyMyAyMzo1OTowMCAyMDA2IEdNVAorICAgICAgICBTdWJqZWN0OiBDPVVTLCBPPUdURSBDb3Jwb3JhdGlvbiwgQ049R1RFIEN5YmVyVHJ1c3QgUm9vdAorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6Yjg6ZTY6NGY6YmE6ZGI6OTg6N2M6NzE6N2M6YWY6NDQ6Yjc6ZDM6MGY6CisgICAgICAgICAgICAgICAgICAgIDQ2OmQ5OjY0OmU1OjkzOmMxOjQyOjhlOmM3OmJhOjQ5OjhkOjM1OjJkOjdhOgorICAgICAgICAgICAgICAgICAgICBlNzo4YjpiZDplNTowNTozMTo1OTpjNjpiMToyZjowYTowYzpmYjo5ZjphNzoKKyAgICAgICAgICAgICAgICAgICAgM2Y6YTI6MDk6NjY6ODQ6NTY6MWU6Mzc6Mjk6MWI6ODc6ZTk6N2U6MGM6Y2E6CisgICAgICAgICAgICAgICAgICAgIDlhOjlmOmE1OjdmOmY1OjE1Ojk0OmEzOmQ1OmEyOjQ2OjgyOmQ4OjY4OjRjOgorICAgICAgICAgICAgICAgICAgICBkMTozNzoxNTowNjo2ODphZjpiZDpmODpiMDpiMzpmMDoyOTpmNTo5NTo1YToKKyAgICAgICAgICAgICAgICAgICAgMDk6MTY6NjE6Nzc6MGE6MjI6MjU6ZDQ6NGY6NDU6YWE6Yzc6YmQ6ZTU6OTY6CisgICAgICAgICAgICAgICAgICAgIGRmOmY5OmQ0OmE4OjhlOjQyOmNjOjI0OmMwOjFlOjkxOjI3OjRhOmI1OjZkOgorICAgICAgICAgICAgICAgICAgICAwNjo4MDo2MzozOTpjNDphMjo1ZTozODowMworICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICAxMjpiMzo3NTpjNjo1ZjoxZDplMTo2MTo1NTo4MDowMDpkNDo4MTo0Yjo3YjozMTowZjoyMzoKKyAgICAgICAgNjM6ZTc6M2Q6ZjM6MDM6Zjk6ZjQ6MzY6YTg6YmI6ZDk6ZTM6YTU6OTc6NGQ6ZWE6MmI6Mjk6CisgICAgICAgIGUwOmQ2OjZhOjczOjgxOmU2OmMwOjg5OmEzOmQzOmYxOmUwOmE1OmE1OjIyOjM3OjlhOjYzOgorICAgICAgICBjMjo0ODoyMDpiNDpkYjo3MjplMzpjODpmNjpkOTo3YzpiZTpiMTphZjo1MzpkYToxNDpiNDoKKyAgICAgICAgMjE6Yjg6ZDY6ZDU6OTY6ZTM6ZmU6NGU6MGM6NTk6NjI6YjY6OWE6NGE6Zjk6NDI6ZGQ6OGM6CisgICAgICAgIDZmOjgxOmE5OjcxOmZmOmY0OjBhOjcyOjZkOjZkOjQ0OjBlOjlkOmYzOjc0Ojc0OmE4OmQ1OgorICAgICAgICAzNDo0OTplOTo1ZTo5ZTplOTpiNDo3YTplMTplNTo1YToxZjo4NDozMDo5YzpkMzo5ZjphNToKKyAgICAgICAgMjU6ZDgKKworR2xvYmFsU2lnbiBQYXJ0bmVycyBDQQorPT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiAzQzo3NTpDRDo0QzpCRDpBOTpEMDo4QTo3OTo0Rjo1MDoxNjozNzo4NDpGNDoyQgorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURuakNDQW9hZ0F3SUJBZ0lMQWdBQUFBQUExbmk1MGE4d0RRWUpLb1pJaHZjTkFRRUVCUUF3VnpFTE1Ba0cKK0ExVUVCaE1DUWtVeEdUQVhCZ05WQkFvVEVFZHNiMkpoYkZOcFoyNGdibll0YzJFeEVEQU9CZ05WQkFzVEIxSnYKK2IzUWdRMEV4R3pBWkJnTlZCQU1URWtkc2IySmhiRk5wWjI0Z1VtOXZkQ0JEUVRBZUZ3MDVPVEF4TWpneE1qQXcKK01EQmFGdzB3T1RBeE1qZ3hNakF3TURCYU1GOHhDekFKQmdOVkJBWVRBa0pGTVJrd0Z3WURWUVFLRXhCSGJHOWkKK1lXeFRhV2R1SUc1MkxYTmhNUlF3RWdZRFZRUUxFd3RRWVhKMGJtVnljeUJEUVRFZk1CMEdBMVVFQXhNV1IyeHYKK1ltRnNVMmxuYmlCUVlYSjBibVZ5Y3lCRFFUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0MKK2dnRUJBTklzK0RLc1NoSjZOOGdwa2FXdWpHNGVEc0EwTTRqbE0zRVdISGlFYU1NWU5GQXVGajZ4bElKUHNacWYKK0FQakdFVFhHYVh1WUFxMEFCb2hzNTB3ektBQ0lKMFlmaDdOeGRXTzhNcnVJM21ZWURsQUdrN1QydkJRM01EMGkKKzN6My9kWDdaQ2hyRm43UDgwS3l6Q0hxSjB3SG9BRnpuU2dzOVRYc21vcmRpQm92YVJ0MlRGejgvV3dKTEM3YUkKK0lCR1NBSzI3eHk3VTQwV3U5WWxhZkkya3JZVmtNc0Fuak1ieWlvQ1NoaVJXV1kxMGFLS0RRck9lUFZCQmhtOGcKK2J2Yjl6dE1aNHpMTWorMmFYbTBmS1BWU3JHNFlYdmc5MFpMbHVtd0JpRXNLOGkzZVpUTUZRcUJNcWpGMnZ2Mi8KK2dYajVjUnhHWGkwVmxTMHdXWTVNUWRGaXF6MENBd0VBQWFOak1HRXdEZ1lEVlIwUEFRSC9CQVFEQWdBR01CMEcKK0ExVWREZ1FXQkJSREpJMXdGUWhpVlp4UERFQVhYWVplRDZKTSt6QWZCZ05WSFNNRUdEQVdnQlJnZTJZYVJRMlgKK3lvbFFMMzBFelRTby8vejlTekFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTBHQ1NxR1NJYjNEUUVCQkFVQUE0SUIKK0FRQm03YlNJYVJHWmdpR0RyS0Z0aTV1RXJROHR5QjZNeW50K3JhclVqdDRIMXA1Rng2VzRuQWM1WUNWVkdzQlAKK0dlWFBGeWxKaVJnMVp1WHJLRUJPVjhtdnMrUzRJQVdqTzVWUWtVbVVLWDBzNVloQnBVV0lYcDJDSi9mUzcxdTEKK1Q1KysvalZsTEZWa24rRlIyaUpoZDdwWVRvL0dlVmxaYmpDQW9rK1FiaUVMcmRCb09aQVFtKzBpWlc4ZUVUam0KK2Y0elM4emx0UjlVaDZPcDFPa0hScmZZV25WMExJYjN6SDJNR0pSM0JIelZ4TE9zZ0dkWEJzT3c5NVcvdEFnYy8KK0UzdG1rdFpFd1pqM1gxQ0xlbHZDYjIydzBmamxkS0JBTjZNbEQrUTl5bVF4azVCY01IdTVPVEdhWGt6TnVVRlAKK1VPUTlPSzdJWnRuSE8xMVJSNnlicS9LdAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOgorICAgICAgICAgICAgMDI6MDA6MDA6MDA6MDA6MDA6ZDY6Nzg6Yjk6ZDE6YWYKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPUJFLCBPPUdsb2JhbFNpZ24gbnYtc2EsIE9VPVJvb3QgQ0EsIENOPUdsb2JhbFNpZ24gUm9vdCBDQQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogSmFuIDI4IDEyOjAwOjAwIDE5OTkgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBKYW4gMjggMTI6MDA6MDAgMjAwOSBHTVQKKyAgICAgICAgU3ViamVjdDogQz1CRSwgTz1HbG9iYWxTaWduIG52LXNhLCBPVT1QYXJ0bmVycyBDQSwgQ049R2xvYmFsU2lnbiBQYXJ0bmVycyBDQQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDIwNDggYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDIwNDggYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6ZDI6MmM6Zjg6MzI6YWM6NGE6MTI6N2E6Mzc6Yzg6Mjk6OTE6YTU6YWU6CisgICAgICAgICAgICAgICAgICAgIDhjOjZlOjFlOjBlOmMwOjM0OjMzOjg4OmU1OjMzOjcxOjE2OjFjOjc4Ojg0OgorICAgICAgICAgICAgICAgICAgICA2ODpjMzoxODozNDo1MDoyZToxNjozZTpiMTo5NDo4Mjo0ZjpiMTo5YTo5ZjoKKyAgICAgICAgICAgICAgICAgICAgMDA6Zjg6YzY6MTE6MzU6YzY6Njk6N2I6OTg6MDI6YWQ6MDA6MDY6ODg6NmM6CisgICAgICAgICAgICAgICAgICAgIGU3OjRjOjMzOjI4OjAwOjg4OjI3OjQ2OjFmOjg3OmIzOjcxOjc1OjYzOmJjOgorICAgICAgICAgICAgICAgICAgICAzMjpiYjo4ODpkZTo2NjoxODowZTo1MDowNjo5MzpiNDpmNjpiYzoxNDozNzoKKyAgICAgICAgICAgICAgICAgICAgMzA6M2Q6MjI6ZGY6M2Q6ZmY6NzU6N2U6ZDk6MGE6MWE6YzU6OWY6YjM6ZmM6CisgICAgICAgICAgICAgICAgICAgIGQwOmFjOmIzOjA4OjdhOjg5OmQzOjAxOmU4OjAwOjVjOmU3OjRhOjBiOjNkOgorICAgICAgICAgICAgICAgICAgICA0ZDo3YjoyNjphMjpiNzo2MjowNjo4YjpkYTo0NjpkZDo5MzoxNzozZjozZjoKKyAgICAgICAgICAgICAgICAgICAgNWI6MDI6NGI6MGI6YjY6ODg6MjA6MTE6OTI6MDA6YWQ6YmI6Yzc6MmU6ZDQ6CisgICAgICAgICAgICAgICAgICAgIGUzOjQ1OmFlOmY1Ojg5OjVhOjdjOjhkOmE0OmFkOjg1OjY0OjMyOmMwOjI3OgorICAgICAgICAgICAgICAgICAgICA4YzpjNjpmMjo4YTo4MDo5Mjo4NjoyNDo1Njo1OTo4ZDo3NDo2ODphMjo4MzoKKyAgICAgICAgICAgICAgICAgICAgNDI6YjM6OWU6M2Q6NTA6NDE6ODY6NmY6MjA6NmU6ZjY6ZmQ6Y2U6ZDM6MTk6CisgICAgICAgICAgICAgICAgICAgIGUzOjMyOmNjOjhmOmVkOjlhOjVlOjZkOjFmOjI4OmY1OjUyOmFjOjZlOjE4OgorICAgICAgICAgICAgICAgICAgICA1ZTpmODozZDpkMTo5MjplNTpiYTo2YzowMTo4ODo0YjowYTpmMjoyZDpkZToKKyAgICAgICAgICAgICAgICAgICAgNjU6MzM6MDU6NDI6YTA6NGM6YWE6MzE6NzY6YmU6ZmQ6YmY6ODE6Nzg6Zjk6CisgICAgICAgICAgICAgICAgICAgIDcxOjFjOjQ2OjVlOjJkOjE1Ojk1OjJkOjMwOjU5OjhlOjRjOjQxOmQxOjYyOgorICAgICAgICAgICAgICAgICAgICBhYjozZAorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBYNTA5djMgS2V5IFVzYWdlOiBjcml0aWNhbAorICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIFNpZ24sIENSTCBTaWduCisgICAgICAgICAgICBYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAgNDM6MjQ6OEQ6NzA6MTU6MDg6NjI6NTU6OUM6NEY6MEM6NDA6MTc6NUQ6ODY6NUU6MEY6QTI6NEM6RkIKKyAgICAgICAgICAgIFg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIGtleWlkOjYwOjdCOjY2OjFBOjQ1OjBEOjk3OkNBOjg5OjUwOjJGOjdEOjA0OkNEOjM0OkE4OkZGOkZDOkZEOjRCCisKKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogY3JpdGljYWwKKyAgICAgICAgICAgICAgICBDQTpUUlVFCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgNjY6ZWQ6YjQ6ODg6Njk6MTE6OTk6ODI6MjE6ODM6YWM6YTE6NmQ6OGI6OWI6ODQ6YWQ6MGY6CisgICAgICAgIDJkOmM4OjFlOjhjOmNhOjdiOjdlOmFkOmFhOmQ0OjhlOmRlOjA3OmQ2OjllOjQ1OmM3OmE1OgorICAgICAgICBiODo5YzowNzozOTo2MDoyNTo1NToxYTpjMDo0ZjoxOTplNTpjZjoxNzoyOTo0OTo4OToxODoKKyAgICAgICAgMzU6NjY6ZTU6ZWI6Mjg6NDA6NGU6NTc6Yzk6YWY6YjM6ZTQ6Yjg6MjA6MDU6YTM6M2I6OTU6CisgICAgICAgIDUwOjkxOjQ5Ojk0OjI5OjdkOjJjOmU1Ojg4OjQxOmE1OjQ1Ojg4OjVlOjlkOjgyOjI3OmY3OgorICAgICAgICBkMjplZjo1YjpiNTo0Zjo5ZjpiZTpmZTozNTo2NToyYzo1NTo2NDo5ZjplMTo1MTpkYToyMjoKKyAgICAgICAgNjE6Nzc6YmE6NTg6NGU6OGY6YzY6Nzk6NTk6NTk6NmU6MzA6ODA6YTI6NGY6OTA6NmU6MjE6CisgICAgICAgIDBiOmFkOmQwOjY4OjM5OjkwOjEwOjliOmVkOjIyOjY1OjZmOjFlOjExOjM4OmU2OjdmOjhjOgorICAgICAgICBkMjpmMzozOTo2ZDo0NzpkNToyMTplODplYTo3NTozYTo0MTpkMTphZDpmNjoxNjo5ZDo1ZDoKKyAgICAgICAgMGI6MjE6YmQ6ZjM6MWY6NjM6MDY6MjU6MWQ6YzE6MWY6MzU6NzE6MmM6ZWI6MjA6MTk6ZDU6CisgICAgICAgIGMxOmIwOmVjOjNkOmU1OjZmOmVkOjAyOjA3OjNmOjEzOjdiOjY2OjkyOmQ2OjQ0OmMxOjk4OgorICAgICAgICBmNzo1Zjo1MDo4Yjo3YTo1YjpjMjo2Zjo2ZDpiMDpkMTpmODplNTo3NDphMDo0MDozNzphMzoKKyAgICAgICAgMjU6MGY6ZTQ6M2Q6Y2E6NjQ6MzE6OTM6OTA6NWM6MzA6N2I6Yjk6Mzk6MzE6OWE6NWU6NGM6CisgICAgICAgIGNkOmI5OjQxOjRmOjUwOmU0OjNkOjM4OmFlOmM4OjY2OmQ5OmM3OjNiOjVkOjUxOjQ3OmFjOgorICAgICAgICA5YjphYjpmMjphZAorCitHbG9iYWxTaWduIFByaW1hcnkgQ2xhc3MgMSBDQQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogNUM6QUM6NTk6MDE6QTQ6ODY6NTM6Q0I6MTA6NjY6QjU6RDY6RDY6NzE6RkY6MDEKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEckRDQ0FwU2dBd0lCQWdJTEFnQUFBQUFBMW5pNE44OHdEUVlKS29aSWh2Y05BUUVFQlFBd1Z6RUxNQWtHCitBMVVFQmhNQ1FrVXhHVEFYQmdOVkJBb1RFRWRzYjJKaGJGTnBaMjRnYm5ZdGMyRXhFREFPQmdOVkJBc1RCMUp2CitiM1FnUTBFeEd6QVpCZ05WQkFNVEVrZHNiMkpoYkZOcFoyNGdVbTl2ZENCRFFUQWVGdzA1T0RBNU1UVXhNakF3CitNREJhRncwd09UQXhNamd4TWpBd01EQmFNRzB4Q3pBSkJnTlZCQVlUQWtKRk1Sa3dGd1lEVlFRS0V4QkhiRzlpCitZV3hUYVdkdUlHNTJMWE5oTVJzd0dRWURWUVFMRXhKUWNtbHRZWEo1SUVOc1lYTnpJREVnUTBFeEpqQWtCZ05WCitCQU1USFVkc2IySmhiRk5wWjI0Z1VISnBiV0Z5ZVNCRGJHRnpjeUF4SUVOQk1JSUJJakFOQmdrcWhraUc5dzBCCitBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF2U0ExUjlFbzFnaWpFamtqUncyOWNDRlNEbGN4bGFZMFYydnNma041Cit3d1pTU00yOHRhR1p2ZGdmTXJ6UDEyNXliUzUzSXBDQ1RrdVBtZ3dCUXByWmNGbTJuUi9tWTlFTXJSMU8rSVdCCisrYTd2bjZaU1lVUjVHblZGNEdGV1JXMUNqRDF5eTZha0VyZWE5ZFpnMEdCUXM0Nm1wdXkwOUJMTmY2ak83N1BoCitoVEQrY3NUbTUzZXpubGhCMWxHRGlBZkd0bWxQTnQ3UkMwZy92ZGFmSVhSa2J5Y0dQa3Y5RHFhYnY2UklWNHlRCis3b2tZQ3dLQkdMNW4vbE5naUNlNm8zTTBTMXBXdE41ekJlMllsbDNzU3VkQS9Fc0pZdXZRNHpGUGhkRjZxMWxuCitLL3VJRCt1cWc3MDEvV0VuN0dZT1FsZjNhY0lNNy94cXdtNUoybzlCT0s1SXFRSURBUUFCbzJNd1lUQU9CZ05WCitIUThCQWY4RUJBTUNBQVl3SFFZRFZSME9CQllFRlB6Z1p2WmFOWm5yUUI3U3VCNUR2SmlPSDRyRE1COEdBMVVkCitJd1FZTUJhQUZHQjdaaHBGRFpmS2lWQXZmUVROTktqLy9QMUxNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKCitLb1pJaHZjTkFRRUVCUUFEZ2dFQkFKdWpDRVRPOHBDZGNmTXlzd1ZxdGVyUEtaamVWVDZnRm4wR2VrVFdyOUw2CitFMWlNK0J6SHF4MjBHKzlwYUpoY0NEbVA0UGY3U013aDU3Z3oyd1dxTkNSc1N1WHBlMkRlZzdNZkNyNUJkZnpNCitNRWkzd1NZZEJET3F0bmp0S3N1NlZwY3lidmN4bFM1RzhoVHVKOGYzWW9tNVhGclRPSXBrOVRlMDhiTTBjdFhWCitJVDFMMTNpVDF6Rm1OUjZqMkVkSmJ4eXQ0WUIvK0pna2JIT3NEc0lhZHdLakpnZTN4MnRkdklMVktrZ2RZODlRCitNcWI3SEJoSEZRcGJERnc0SkpvRW1LZ0lTRjk4TklkanF5Mk5UQUIzbEJ0MnV2VVdHS01WcnkrVTlpa0Fkc0VWCitGOVBwTjAxMjFNdExLVmtrck5wS29PcGozbDlVc2ZyejBVWEx4V1MwY3lFPQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOgorICAgICAgICAgICAgMDI6MDA6MDA6MDA6MDA6MDA6ZDY6Nzg6Yjg6Mzc6Y2YKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPUJFLCBPPUdsb2JhbFNpZ24gbnYtc2EsIE9VPVJvb3QgQ0EsIENOPUdsb2JhbFNpZ24gUm9vdCBDQQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogU2VwIDE1IDEyOjAwOjAwIDE5OTggR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBKYW4gMjggMTI6MDA6MDAgMjAwOSBHTVQKKyAgICAgICAgU3ViamVjdDogQz1CRSwgTz1HbG9iYWxTaWduIG52LXNhLCBPVT1QcmltYXJ5IENsYXNzIDEgQ0EsIENOPUdsb2JhbFNpZ24gUHJpbWFyeSBDbGFzcyAxIENBCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMjA0OCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMjA0OCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpiZDoyMDozNTo0NzpkMToyODpkNjowODphMzoxMjozOToyMzo0NzowZDoKKyAgICAgICAgICAgICAgICAgICAgYmQ6NzA6MjE6NTI6MGU6NTc6MzE6OTU6YTY6MzQ6NTc6NmI6ZWM6N2U6NDM6CisgICAgICAgICAgICAgICAgICAgIDc5OmMzOjA2OjUyOjQ4OmNkOmJjOmI1OmExOjk5OmJkOmQ4OjFmOjMyOmJjOgorICAgICAgICAgICAgICAgICAgICBjZjpkNzo2ZTo3Mjo2ZDoyZTo3NzoyMjo5MDo4Mjo0ZTo0Yjo4Zjo5YTowYzoKKyAgICAgICAgICAgICAgICAgICAgMDE6NDI6OWE6ZDk6NzA6NTk6YjY6OWQ6MWY6ZTY6NjM6ZDE6MGM6YWQ6MWQ6CisgICAgICAgICAgICAgICAgICAgIDRlOmY4Ojg1OjgxOmY5OmFlOmVmOjlmOmE2OjUyOjYxOjQ0Ojc5OjFhOjc1OgorICAgICAgICAgICAgICAgICAgICA0NTplMDo2MTo1Njo0NTo2ZDo0Mjo4YzozZDo3MjpjYjphNjphNDoxMjpiNzoKKyAgICAgICAgICAgICAgICAgICAgOWE6ZjU6ZDY6NjA6ZDA6NjA6NTA6YjM6OGU6YTY6YTY6ZWM6YjQ6ZjQ6MTI6CisgICAgICAgICAgICAgICAgICAgIGNkOjdmOmE4OmNlOmVmOmIzOmUxOjg1OjMwOmZlOjcyOmM0OmU2OmU3Ojc3OgorICAgICAgICAgICAgICAgICAgICBiMzo5ZTo1ODo0MTpkNjo1MTo4Mzo4ODowNzpjNjpiNjo2OTo0ZjozNjpkZToKKyAgICAgICAgICAgICAgICAgICAgZDE6MGI6NDg6M2Y6YmQ6ZDY6OWY6MjE6NzQ6NjQ6NmY6Mjc6MDY6M2U6NGI6CisgICAgICAgICAgICAgICAgICAgIGZkOjBlOmE2OjliOmJmOmE0OjQ4OjU3OjhjOjkwOmVlOjg5OjE4OjBiOjAyOgorICAgICAgICAgICAgICAgICAgICA4MToxODpiZTo2NzpmZTo1Mzo2MDo4ODoyNzpiYTphMzo3MzozNDo0Yjo1YToKKyAgICAgICAgICAgICAgICAgICAgNTY6YjQ6ZGU6NzM6MDU6ZWQ6OTg6OTY6NWQ6ZWM6NGE6ZTc6NDA6ZmM6NGI6CisgICAgICAgICAgICAgICAgICAgIDA5OjYyOmViOmQwOmUzOjMxOjRmOjg1OmQxOjdhOmFiOjU5OjY3OjJiOmZiOgorICAgICAgICAgICAgICAgICAgICA4ODowZjplYjphYTo4MzpiZDozNTpmZDo2MToyNzplYzo2NjowZTo0Mjo1NzoKKyAgICAgICAgICAgICAgICAgICAgZjc6Njk6YzI6MGM6ZWY6ZmM6NmE6YzI6NmU6NDk6ZGE6OGY6NDE6Mzg6YWU6CisgICAgICAgICAgICAgICAgICAgIDQ4OmE5CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIFg1MDl2MyBLZXkgVXNhZ2U6IGNyaXRpY2FsCisgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUgU2lnbiwgQ1JMIFNpZ24KKyAgICAgICAgICAgIFg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICBGQzpFMDo2NjpGNjo1QTozNTo5OTpFQjo0MDoxRTpEMjpCODoxRTo0MzpCQzo5ODo4RToxRjo4QTpDMworICAgICAgICAgICAgWDUwOXYzIEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAga2V5aWQ6NjA6N0I6NjY6MUE6NDU6MEQ6OTc6Q0E6ODk6NTA6MkY6N0Q6MDQ6Q0Q6MzQ6QTg6RkY6RkM6RkQ6NEIKKworICAgICAgICAgICAgWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzOiBjcml0aWNhbAorICAgICAgICAgICAgICAgIENBOlRSVUUKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA5YjphMzowODo0NDpjZTpmMjo5MDo5ZDo3MTpmMzozMjpiMzowNTo2YTpiNTplYTpjZjoyOToKKyAgICAgICAgOTg6ZGU6NTU6M2U6YTA6MTY6N2Q6MDY6N2E6NDQ6ZDY6YWY6ZDI6ZmE6MTM6NTg6OGM6Zjg6CisgICAgICAgIDFjOmM3OmFiOjFkOmI0OjFiOmVmOjY5OjY4Ojk4OjVjOjA4OjM5OjhmOmUwOmY3OmZiOjQ4OgorICAgICAgICBjYzoyMTplNzpiODozMzpkYjowNTphYTozNDoyNDo2Yzo0YTplNTplOTo3Yjo2MDpkZTo4MzoKKyAgICAgICAgYjM6MWY6MGE6YmU6NDE6NzU6ZmM6Y2M6MzA6NDg6Yjc6YzE6MjY6MWQ6MDQ6MzM6YWE6YjY6CisgICAgICAgIDc4OmVkOjJhOmNiOmJhOjU2Ojk3OjMyOjZlOmY3OjMxOjk1OjJlOjQ2OmYyOjE0OmVlOjI3OgorICAgICAgICBjNzpmNzo2Mjo4OTpiOTo1Yzo1YTpkMzozODo4YTo2NDpmNTozNzpiNDpmMTpiMzozNDo3MjoKKyAgICAgICAgZDU6ZDU6MjE6M2Q6NGI6ZDc6Nzg6OTM6ZDc6MzE6NjY6MzU6MWU6YTM6ZDg6NDc6NDk6NmY6CisgICAgICAgIDFjOmFkOmUxOjgwOjdmOmY4Ojk4OjI0OjZjOjczOmFjOjBlOmMyOjFhOjc3OjAyOmEzOjI2OgorICAgICAgICAwNzpiNzpjNzo2Yjo1ZDpiYzo4MjpkNToyYTo0ODoxZDo2MzpjZjo1MDozMjphNjpmYjoxYzoKKyAgICAgICAgMTg6NDc6MTU6MGE6NWI6MGM6NWM6Mzg6MjQ6OWE6MDQ6OTg6YTg6MDg6NDg6NWY6N2M6MzQ6CisgICAgICAgIDg3OjYzOmFiOjJkOjhkOjRjOjAwOjc3Ojk0OjFiOjc2OmJhOmY1OjE2OjE4OmEzOjE1OmFmOgorICAgICAgICAyZjo5NDpmNjoyOTowMDo3NjpjMToxNToxNzpkMzplOTozNzo0ZDo3NjpkNDpjYjo0YjoyOToKKyAgICAgICAgNTk6MjQ6YWM6ZGE6NGE6YTA6ZWE6NjM6ZGU6NWY6NTQ6YjE6ZmE6ZjM6ZDE6NDU6Y2I6YzU6CisgICAgICAgIDY0OmI0OjczOjIxCisKK0dsb2JhbFNpZ24gUHJpbWFyeSBDbGFzcyAyIENBCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiBBOTpBOTo0Mjo1OTo3RTpCRTo1QTo5NDpFNDoyQzpDNjo4QjoxQzoyQTo0NDpCNgorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURyRENDQXBTZ0F3SUJBZ0lMQWdBQUFBQUExbmk0alkwd0RRWUpLb1pJaHZjTkFRRUVCUUF3VnpFTE1Ba0cKK0ExVUVCaE1DUWtVeEdUQVhCZ05WQkFvVEVFZHNiMkpoYkZOcFoyNGdibll0YzJFeEVEQU9CZ05WQkFzVEIxSnYKK2IzUWdRMEV4R3pBWkJnTlZCQU1URWtkc2IySmhiRk5wWjI0Z1VtOXZkQ0JEUVRBZUZ3MDVPVEF4TWpneE1qQXcKK01EQmFGdzB3T1RBeE1qZ3hNakF3TURCYU1HMHhDekFKQmdOVkJBWVRBa0pGTVJrd0Z3WURWUVFLRXhCSGJHOWkKK1lXeFRhV2R1SUc1MkxYTmhNUnN3R1FZRFZRUUxFeEpRY21sdFlYSjVJRU5zWVhOeklESWdRMEV4SmpBa0JnTlYKK0JBTVRIVWRzYjJKaGJGTnBaMjRnVUhKcGJXRnllU0JEYkdGemN5QXlJRU5CTUlJQklqQU5CZ2txaGtpRzl3MEIKK0FRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQWtveis3L1JGamhkQmJ2ell2eUZ2cXdhZFVzRXNBSjAvam9XNGYwcVAKK3ZhQmpLc3BKSjY1YWd2UjA0bFdTLzhMUnFubWl0dnJWbllJRVQ4YXl4bDVqcHpxNjJPN3JpbStmdHJzb1FjQWkKKyswNUlHZ2FTMTcvWHo3blp2VGhQT3cxRWJsVkIvdndKMjlpLzg0NGg4ZWdTdGZZVHBkUEdUSk1pc0FMLzdoME0KK3hLaHJUM1ZvVnVqY0tCSlE5NmdrblM0a09mc0pCZDdsbzJSSklkQm9mbkV3a2JGZzREbjBVUGg2VFpnQWEzeDUKK3VrN09TdUs2TmgyM3hUWVZsWnhrUXVwZnhMcjFRQVcrNFRwWnZZU25HYmplVFZOUXpnZlIwbEhUN3cyQmJPYm4KK2JjdGRmRDk4ek94UGd5Y2wvM0JROW9OWmRZUUdabGdzM29tTkFLWkorYVZEZHdJREFRQUJvMk13WVRBT0JnTlYKK0hROEJBZjhFQkFNQ0FBWXdIUVlEVlIwT0JCWUVGSHpuc3JFczNyR25hK2wyRE9Hai9VNXN4N24yTUI4R0ExVWQKK0l3UVlNQmFBRkdCN1pocEZEWmZLaVZBdmZRVE5OS2ovL1AxTE1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUoKK0tvWklodmNOQVFFRUJRQURnZ0VCQUdQZFdjNktlYXFZblU3RmlXUTNmb3FUWnk4UTZtOG53NDEzYmZKY1ZwUVoKK0dtbGdNRVpkai9KdFJUeU9OWmQ4TDdoUjR1aUp2WWpQSnh3SU5GeUl3V2drMjVHRjVNLzcrME9ONkNVQkc4UU8KKzl3QkNTSVlmSkFoWVdveU44bXRITEdpUnNXbEMvUTJOeVNibWtvYW1aRzZTeGM0K1BIMXg0eU9rcThmVnFLbmYKK2dxYzc2SWJWdzA4WTQwVFE0Tnp6eFdndS9xVXZCWVRJZmtkQ1UydUhTdjR5LzE0K2NJeTNxQlhNRjhML1J1elEKKzdDMjBiaElvcWZsQTZldlVacGRUcVdsVndLbXFzaTdOMFduMHZ2aTdmR251VktiYm52dGFwajcrbXUrVVVVdDEKKzd0alU0WnJ4QWxZVGlRNm5Rb3VXaTRVTUc0VytKcTZycHBtOEl2RnozMEk9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAzICgweDIpCisgICAgICAgIFNlcmlhbCBOdW1iZXI6CisgICAgICAgICAgICAwMjowMDowMDowMDowMDowMDpkNjo3ODpiODo4ZDo4ZAorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9QkUsIE89R2xvYmFsU2lnbiBudi1zYSwgT1U9Um9vdCBDQSwgQ049R2xvYmFsU2lnbiBSb290IENBCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBKYW4gMjggMTI6MDA6MDAgMTk5OSBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEphbiAyOCAxMjowMDowMCAyMDA5IEdNVAorICAgICAgICBTdWJqZWN0OiBDPUJFLCBPPUdsb2JhbFNpZ24gbnYtc2EsIE9VPVByaW1hcnkgQ2xhc3MgMiBDQSwgQ049R2xvYmFsU2lnbiBQcmltYXJ5IENsYXNzIDIgQ0EKKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgyMDQ4IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgyMDQ4IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOjkyOjhjOmZlOmVmOmY0OjQ1OjhlOjE3OjQxOjZlOmZjOmQ4OmJmOjIxOgorICAgICAgICAgICAgICAgICAgICA2ZjphYjowNjo5ZDo1MjpjMToyYzowMDo5ZDozZjo4ZTo4NTpiODo3Zjo0YToKKyAgICAgICAgICAgICAgICAgICAgOGY6YmQ6YTA6NjM6MmE6Y2E6NDk6Mjc6YWU6NWE6ODI6ZjQ6NzQ6ZTI6NTU6CisgICAgICAgICAgICAgICAgICAgIDkyOmZmOmMyOmQxOmFhOjc5OmEyOmI2OmZhOmQ1OjlkOjgyOjA0OjRmOmM2OgorICAgICAgICAgICAgICAgICAgICBiMjpjNjo1ZTo2MzphNzozYTpiYTpkODplZTplYjo4YTo2Zjo5ZjpiNjpiYjoKKyAgICAgICAgICAgICAgICAgICAgMjg6NDE6YzA6MjI6ZmI6NGU6NDg6MWE6MDY6OTI6ZDc6YmY6ZDc6Y2Y6Yjk6CisgICAgICAgICAgICAgICAgICAgIGQ5OmJkOjM4OjRmOjNiOjBkOjQ0OjZlOjU1OjQxOmZlOmZjOjA5OmRiOmQ4OgorICAgICAgICAgICAgICAgICAgICBiZjpmMzo4ZToyMTpmMTplODoxMjpiNTpmNjoxMzphNTpkMzpjNjo0Yzo5MzoKKyAgICAgICAgICAgICAgICAgICAgMjI6YjA6MDI6ZmY6ZWU6MWQ6MGM6YzQ6YTg6NmI6NGY6NzU6Njg6NTY6ZTg6CisgICAgICAgICAgICAgICAgICAgIGRjOjI4OjEyOjUwOmY3OmE4OjI0OjlkOjJlOjI0OjM5OmZiOjA5OjA1OmRlOgorICAgICAgICAgICAgICAgICAgICBlNTphMzo2NDo0OToyMTpkMDo2ODo3ZTo3MTozMDo5MTpiMTo2MDplMDozOToKKyAgICAgICAgICAgICAgICAgICAgZjQ6NTA6Zjg6N2E6NGQ6OTg6MDA6NmI6N2M6Nzk6YmE6NGU6Y2U6NGE6ZTI6CisgICAgICAgICAgICAgICAgICAgIGJhOjM2OjFkOmI3OmM1OjM2OjE1Ojk1OjljOjY0OjQyOmVhOjVmOmM0OmJhOgorICAgICAgICAgICAgICAgICAgICBmNTo0MDowNTpiZTplMTozYTo1OTpiZDo4NDphNzoxOTpiODpkZTo0ZDo1MzoKKyAgICAgICAgICAgICAgICAgICAgNTA6Y2U6MDc6ZDE6ZDI6NTE6ZDM6ZWY6MGQ6ODE6NmM6ZTY6ZTc6NmQ6Y2I6CisgICAgICAgICAgICAgICAgICAgIDVkOjdjOjNmOjdjOmNjOmVjOjRmOjgzOjI3OjI1OmZmOjcwOjUwOmY2OjgzOgorICAgICAgICAgICAgICAgICAgICA1OTo3NTo4NDowNjo2Njo1ODoyYzpkZTo4OTo4ZDowMDphNjo0OTpmOTphNToKKyAgICAgICAgICAgICAgICAgICAgNDM6NzcKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgICAgIFg1MDl2MyBleHRlbnNpb25zOgorICAgICAgICAgICAgWDUwOXYzIEtleSBVc2FnZTogY3JpdGljYWwKKyAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZSBTaWduLCBDUkwgU2lnbgorICAgICAgICAgICAgWDUwOXYzIFN1YmplY3QgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIDdDOkU3OkIyOkIxOjJDOkRFOkIxOkE3OjZCOkU5Ojc2OjBDOkUxOkEzOkZEOjRFOjZDOkM3OkI5OkY2CisgICAgICAgICAgICBYNTA5djMgQXV0aG9yaXR5IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICBrZXlpZDo2MDo3Qjo2NjoxQTo0NTowRDo5NzpDQTo4OTo1MDoyRjo3RDowNDpDRDozNDpBODpGRjpGQzpGRDo0QgorCisgICAgICAgICAgICBYNTA5djMgQmFzaWMgQ29uc3RyYWludHM6IGNyaXRpY2FsCisgICAgICAgICAgICAgICAgQ0E6VFJVRQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDYzOmRkOjU5OmNlOjhhOjc5OmFhOjk4OjlkOjRlOmM1Ojg5OjY0OjM3OjdlOjhhOjkzOjY3OgorICAgICAgICAyZjoxMDplYTo2ZjoyNzpjMzo4ZDo3Nzo2ZDpmMjo1Yzo1Njo5NDoxOToxYTo2OTo2MDozMDoKKyAgICAgICAgNDY6NWQ6OGY6ZjI6NmQ6NDU6M2M6OGU6MzU6OTc6N2M6MmY6Yjg6NTE6ZTI6ZTg6ODk6YmQ6CisgICAgICAgIDg4OmNmOjI3OjFjOjA4OjM0OjVjOjg4OmMxOjY4OjI0OmRiOjkxOjg1OmU0OmNmOmZiOmZiOgorICAgICAgICA0Mzo4ZDplODoyNTowMToxYjpjNDowZTpmNzowMDo0Mjo0ODo4NjoxZjoyNDowODo1ODo1YToKKyAgICAgICAgOGM6OGQ6ZjI6NmI6NDc6MmM6Njg6OTE6YjE6Njk6NDI6ZmQ6MGQ6OGQ6Yzk6MjY6ZTY6OTI6CisgICAgICAgIDg2OmE2OjY0OjZlOjkyOmM1OmNlOjNlOjNjOjdkOjcxOmUzOjIzOmE0OmFiOmM3OmQ1OmE4OgorICAgICAgICBhOTpkZjo4MjphNzozYjplODo4NjpkNTpjMzo0ZjoxODplMzo0NDpkMDplMDpkYzpmMzpjNToKKyAgICAgICAgNjg6MmU6ZmU6YTU6MmY6MDU6ODQ6Yzg6N2U6NDc6NDI6NTM6NmI6ODc6NGE6ZmU6MzI6ZmY6CisgICAgICAgIDVlOjNlOjcwOjhjOmI3OmE4OjE1OmNjOjE3OmMyOmZmOjQ2OmVjOmQwOmVjOjJkOmI0OjZlOgorICAgICAgICAxMjoyODphOTpmOTo0MDplOTplYjpkNDo2Njo5Nzo1MzphOTo2OTo1NTpjMDphOTphYTpiMjoKKyAgICAgICAgMmU6Y2Q6ZDE6Njk6ZjQ6YmU6Zjg6YmI6N2M6Njk6ZWU6NTQ6YTY6ZGI6OWU6ZmI6NWE6YTY6CisgICAgICAgIDNlOmZlOjlhOmVmOjk0OjUxOjRiOjc1OmVlOmQ4OmQ0OmUxOjlhOmYxOjAyOjU2OjEzOjg5OgorICAgICAgICAwZTphNzo0Mjo4Yjo5Njo4Yjo4NTowYzoxYjo4NTpiZToyNjphZTphYjphNjo5OTpiYzoyMjoKKyAgICAgICAgZjE6NzM6ZGY6NDIKKworR2xvYmFsU2lnbiBQcmltYXJ5IENsYXNzIDMgQ0EKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IDk4OjEyOkEzOjRCOjk1OkE5Ojk2OjY0Ojk0OkU3OjUwOjhDOjNFOkUxOjgzOjVBCitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRHJEQ0NBcFNnQXdJQkFnSUxBZ0FBQUFBQTFuaTQxc013RFFZSktvWklodmNOQVFFRUJRQXdWekVMTUFrRworQTFVRUJoTUNRa1V4R1RBWEJnTlZCQW9URUVkc2IySmhiRk5wWjI0Z2JuWXRjMkV4RURBT0JnTlZCQXNUQjFKdgorYjNRZ1EwRXhHekFaQmdOVkJBTVRFa2RzYjJKaGJGTnBaMjRnVW05dmRDQkRRVEFlRncwNU9UQXhNamd4TWpBdworTURCYUZ3MHdPVEF4TWpneE1qQXdNREJhTUcweEN6QUpCZ05WQkFZVEFrSkZNUmt3RndZRFZRUUtFeEJIYkc5aQorWVd4VGFXZHVJRzUyTFhOaE1Sc3dHUVlEVlFRTEV4SlFjbWx0WVhKNUlFTnNZWE56SURNZ1EwRXhKakFrQmdOVgorQkFNVEhVZHNiMkpoYkZOcFoyNGdVSEpwYldGeWVTQkRiR0Z6Y3lBeklFTkJNSUlCSWpBTkJna3Foa2lHOXcwQgorQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBa1Y1V1pkYkF3QVNjdjBmRVhIdDZNUUg1V0phWjR4eUVMOXhXajYzMQorV1lIVlEyWmRXcE9NZGNxcDV4SEJVUkFVWU1rczFIdXZ4bmVHcTNvbnJtK1Z1UXZLdGtiN2ZocjBEUlJ0MHNsTworc3E3d1ZQWmNRRXcyU0hUb1ZJeGxaaENudlN1M0lJMEZTYTE0ZmRJa0kxRGo4TFI1bXdFNS82ODcweTN1NFVtTgoralM4OGFrRkZMNXZqUGVFUzVKRjFucytnUGp5U2dXK0tMaGpjNFBLTWpQMkgyUWYwUUpUSlRrOUQzMmRXYjcwRAorVUh5Wlo2UzVQSkZzQW02RTF2eEc5OHh2R0Q0WDhPOExaQlpYNXF5RzhVaXFROEhKSjNoelJFWGloWDI2LzdQaAorK3hzRnBFczdtUklsQVZBVWFxOWQ2c2dNN3VUYTdFdUxYR2dUbGR6RHRUQTYxd0lEQVFBQm8yTXdZVEFPQmdOVgorSFE4QkFmOEVCQU1DQUFZd0hRWURWUjBPQkJZRUZNdzJ6QmUwUlpFdjdjODdNRWgzKzdVVW1iN2pNQjhHQTFVZAorSXdRWU1CYUFGR0I3WmhwRkRaZktpVkF2ZlFUTk5Lai8vUDFMTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSgorS29aSWh2Y05BUUVFQlFBRGdnRUJBRmV5Vk15OWxSZGtZSW0yVTVFTVJaTERQYWhzdzh5eUdQVjRRWFRZZmFNbgorcjNjTldUNlVIV242aWRNTXZSb0I5RC9vNEhjYWdpaGE1bUxYdCtNMnlRNmZldVBDMDh4WmlRenZGb3Z3Tm5jaQoreXFTMnQ4RkNad0ZBWTh6bk9HU0hXeFNXWm5zdEZPNjlTVzMvZDlEaVRsdlRnTUpORDhxNG5ZR1hwelJ1eCtPYworU09XMHFrWDE5bVZNU1BJU3d0S1RqTUlWSlBNclV2L2pDSzY0YnRZc0VzODV5eElxNTZsN1g1ZzlvK0hNcG1PSgorWEgweGRmblYxbDN5ME5ROTM1NXhxQTdjNUNDWGVPWi9VNlFOVVUrT093T3VvdzFhVGNONTV6VlljRUxKWHFGZQordE5raW8wUlROYVRRejNPQXhjK2ZWcGgyK1JSTWQ0ZUN5ZHgrWFRUVk5uVT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjoKKyAgICAgICAgICAgIDAyOjAwOjAwOjAwOjAwOjAwOmQ2Ojc4OmI4OmQ2OmMzCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1CRSwgTz1HbG9iYWxTaWduIG52LXNhLCBPVT1Sb290IENBLCBDTj1HbG9iYWxTaWduIFJvb3QgQ0EKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IEphbiAyOCAxMjowMDowMCAxOTk5IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogSmFuIDI4IDEyOjAwOjAwIDIwMDkgR01UCisgICAgICAgIFN1YmplY3Q6IEM9QkUsIE89R2xvYmFsU2lnbiBudi1zYSwgT1U9UHJpbWFyeSBDbGFzcyAzIENBLCBDTj1HbG9iYWxTaWduIFByaW1hcnkgQ2xhc3MgMyBDQQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDIwNDggYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDIwNDggYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6OTE6NWU6NTY6NjU6ZDY6YzA6YzA6MDQ6OWM6YmY6NDc6YzQ6NWM6N2I6CisgICAgICAgICAgICAgICAgICAgIDdhOjMxOjAxOmY5OjU4Ojk2Ojk5OmUzOjFjOjg0OjJmOmRjOjU2OjhmOmFkOgorICAgICAgICAgICAgICAgICAgICBmNTo1OTo4MTpkNTo0Mzo2Njo1ZDo1YTo5Mzo4Yzo3NTpjYTphOTplNzoxMToKKyAgICAgICAgICAgICAgICAgICAgYzE6NTE6MTA6MTQ6NjA6Yzk6MmM6ZDQ6N2I6YWY6YzY6Nzc6ODY6YWI6N2E6CisgICAgICAgICAgICAgICAgICAgIDI3OmFlOjZmOjk1OmI5OjBiOmNhOmI2OjQ2OmZiOjdlOjFhOmY0OjBkOjE0OgorICAgICAgICAgICAgICAgICAgICA2ZDpkMjpjOTo0ZTpiMjphZTpmMDo1NDpmNjo1Yzo0MDo0YzozNjo0ODo3NDoKKyAgICAgICAgICAgICAgICAgICAgZTg6NTQ6OGM6NjU6NjY6MTA6YTc6YmQ6MmI6Yjc6MjA6OGQ6MDU6NDk6YWQ6CisgICAgICAgICAgICAgICAgICAgIDc4OjdkOmQyOjI0OjIzOjUwOmUzOmYwOmI0Ojc5OjliOjAxOjM5OmZmOmFmOgorICAgICAgICAgICAgICAgICAgICAzYjpkMzoyZDplZTplMTo0OTo4ZDo4ZDoyZjozYzo2YTo0MTo0NToyZjo5YjoKKyAgICAgICAgICAgICAgICAgICAgZTM6M2Q6ZTE6MTI6ZTQ6OTE6NzU6OWU6Y2Y6YTA6M2U6M2M6OTI6ODE6NmY6CisgICAgICAgICAgICAgICAgICAgIDhhOjJlOjE4OmRjOmUwOmYyOjhjOjhjOmZkOjg3OmQ5OjA3OmY0OjQwOjk0OgorICAgICAgICAgICAgICAgICAgICBjOTo0ZTo0Zjo0MzpkZjo2Nzo1Njo2ZjpiZDowMzo1MDo3Yzo5OTo2NzphNDoKKyAgICAgICAgICAgICAgICAgICAgYjk6M2M6OTE6NmM6MDI6NmU6ODQ6ZDY6ZmM6NDY6Zjc6Y2M6NmY6MTg6M2U6CisgICAgICAgICAgICAgICAgICAgIDE3OmYwOmVmOjBiOjY0OjE2OjU3OmU2OmFjOjg2OmYxOjQ4OmFhOjQzOmMxOgorICAgICAgICAgICAgICAgICAgICBjOToyNzo3ODo3Mzo0NDo0NTplMjo4NTo3ZDpiYTpmZjpiMzplMTpmYjoxYjoKKyAgICAgICAgICAgICAgICAgICAgMDU6YTQ6NGI6M2I6OTk6MTI6MjU6MDE6NTA6MTQ6NmE6YWY6NWQ6ZWE6Yzg6CisgICAgICAgICAgICAgICAgICAgIDBjOmVlOmU0OmRhOmVjOjRiOjhiOjVjOjY4OjEzOjk1OmRjOmMzOmI1OjMwOgorICAgICAgICAgICAgICAgICAgICAzYTpkNworICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBYNTA5djMgS2V5IFVzYWdlOiBjcml0aWNhbAorICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIFNpZ24sIENSTCBTaWduCisgICAgICAgICAgICBYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAgQ0M6MzY6Q0M6MTc6QjQ6NDU6OTE6MkY6RUQ6Q0Y6M0I6MzA6NDg6Nzc6RkI6QjU6MTQ6OTk6QkU6RTMKKyAgICAgICAgICAgIFg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIGtleWlkOjYwOjdCOjY2OjFBOjQ1OjBEOjk3OkNBOjg5OjUwOjJGOjdEOjA0OkNEOjM0OkE4OkZGOkZDOkZEOjRCCisKKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogY3JpdGljYWwKKyAgICAgICAgICAgICAgICBDQTpUUlVFCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgNTc6YjI6NTQ6Y2M6YmQ6OTU6MTc6NjQ6NjA6ODk6YjY6NTM6OTE6MGM6NDU6OTI6YzM6M2Q6CisgICAgICAgIGE4OjZjOmMzOmNjOmIyOjE4OmY1Ojc4OjQxOjc0OmQ4OjdkOmEzOjI3OmFmOjc3OjBkOjU5OgorICAgICAgICAzZTo5NDoxZDo2OTpmYTo4OTpkMzowYzpiZDoxYTowMTpmNDozZjplODplMDo3NzoxYTo4MjoKKyAgICAgICAgMjg6NWE6ZTY6NjI6ZDc6Yjc6ZTM6MzY6Yzk6MGU6OWY6N2E6ZTM6YzI6ZDM6Y2M6NTk6ODk6CisgICAgICAgIDBjOmVmOjE2OjhiOmYwOjM2Ojc3OjIyOmNhOmE0OmI2OmI3OmMxOjQyOjY3OjAxOjQwOjYzOgorICAgICAgICBjYzplNzozODo2NDo4Nzo1YjoxNDo5Njo2Njo3YjoyZDoxNDplZTpiZDo0OTo2ZDpmZjo3NzoKKyAgICAgICAgZDA6ZTI6NGU6NWI6ZDM6ODA6YzI6NGQ6MGY6Y2E6Yjg6OWQ6ODE6OTc6YTc6MzQ6NmU6Yzc6CisgICAgICAgIGUzOjljOjQ4OmU1OmI0OmFhOjQ1OmY1OmY2OjY1OjRjOjQ4OmYyOjEyOmMyOmQyOjkzOjhjOgorICAgICAgICBjMjoxNToyNDpmMzoyYjo1MjpmZjplMzowODphZTpiODo2ZTpkNjoyYzoxMjpjZjozOTpjYjoKKyAgICAgICAgMTI6MmE6ZTc6YTk6N2I6NWY6OTg6M2Q6YTM6ZTE6Y2M6YTY6NjM6ODk6NWM6N2Q6MzE6NzU6CisgICAgICAgIGY5OmQ1OmQ2OjVkOmYyOmQwOmQ0OjNkOmRmOjllOjcxOmE4OjBlOmRjOmU0OjIwOjk3Ojc4OgorICAgICAgICBlNjo3Zjo1MzphNDowZDo1MTo0Zjo4ZTozYjowMzphZTphMzowZDo1YTo0ZDpjMzo3OTplNzoKKyAgICAgICAgMzU6NTg6NzA6NDI6Yzk6NWU6YTE6NWU6YjQ6ZDk6MjI6YTM6NDQ6NTM6MzU6YTQ6ZDA6Y2Y6CisgICAgICAgIDczOjgwOmM1OmNmOjlmOjU2Ojk4Ojc2OmY5OjE0OjRjOjc3Ojg3OjgyOmM5OmRjOjdlOjVkOgorICAgICAgICAzNDpkNTozNjo3NQorCitHbG9iYWxTaWduIFJvb3QgQ0EKKz09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiBBQjpCRjpFQTpFMzo2QjoyOTpBNjpDQzpBNjo3ODozNTo5OTpFRjpBRDoyQjo4MAorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURkVENDQWwyZ0F3SUJBZ0lMQWdBQUFBQUExbmkzbEFVd0RRWUpLb1pJaHZjTkFRRUVCUUF3VnpFTE1Ba0cKK0ExVUVCaE1DUWtVeEdUQVhCZ05WQkFvVEVFZHNiMkpoYkZOcFoyNGdibll0YzJFeEVEQU9CZ05WQkFzVEIxSnYKK2IzUWdRMEV4R3pBWkJnTlZCQU1URWtkc2IySmhiRk5wWjI0Z1VtOXZkQ0JEUVRBZUZ3MDVPREE1TURFeE1qQXcKK01EQmFGdzB4TkRBeE1qZ3hNakF3TURCYU1GY3hDekFKQmdOVkJBWVRBa0pGTVJrd0Z3WURWUVFLRXhCSGJHOWkKK1lXeFRhV2R1SUc1MkxYTmhNUkF3RGdZRFZRUUxFd2RTYjI5MElFTkJNUnN3R1FZRFZRUURFeEpIYkc5aVlXeFQKK2FXZHVJRkp2YjNRZ1EwRXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFEYUR1YVoKK2pjNmo0MCtLZnZ2eGk0TWxhK3BJSC9FcXNMbVZFUVM5OEdQUjRtZG16eHpkenh0SUsrNk5pWTZhcnltQVphdnAKK3h5MFN5NnNjVEhBSG9UMEtNTTBWalUvNDNkU01VQlVjNzFEdXhDNzMvT2xTOHBGOTRHM1ZOVENPWGtOejhrSHAKKzFXcmpzb2s2VmprNGJ3WThpR2xiS2szRnAxUzRiSW5NbS9rOHl1WDlpZlVTUEpKNGx0YmNkRzZUUkdIUmpjZEcKK3NuVU9odWdaaXRWdGJOVjRGcFdpNmNnS09PdnlKQk5QYzFTVEU0VTZHN3dlTkxXTEJZeTVkNHV4Mng4Z2thc0oKK1UyNlF6bnMzZExsd1I1RWlVV01XZWE2eHJrRW1DTWdaSzlGR3FraldaQ3JYZ3pUL0xDckJiQmxEU2dlRjU5TjgKKzlpRm83K3J5VXA5L2s1RFBBZ01CQUFHalFqQkFNQTRHQTFVZER3RUIvd1FFQXdJQUJqQWRCZ05WSFE0RUZnUVUKK1lIdG1Ha1VObDhxSlVDOTlCTTAwcVAvOC9Vc3dEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU5CZ2txaGtpRzl3MEIKK0FRUUZBQU9DQVFFQXJxcWYvTGZTeXg5Zk9Ta29HSjQweVd4UGJ4cndaS0p3U2s4VGhwdGdLSjdvZ1VtWWZRcTcKKzViQ2RQVGJiandWUi93a3hLaC9kaVhlZUR5NXNsUVR0aHN1MEFEK0VBazJBYWlvdGVBdXVieXVpZzBTREg4MVEKK2drd2tyNzMzcGJUSVdnLzA1MGRlU1k0M2x2NmFpQVU2MmNEYktZZm1HWlpIcHpxbWpJczhkLzVHWTZkVDJpSFIKK3JINUpva3ZtdzJkWkw3T0tEcnNzdmFtcVFudzF3ZGgvMWFjeE9rNWpRem12Q0xCaE5JelRtS2xETlBZUGh5azcKK25jSldXSmgzdy9jYnJQYWQrRDZxcDFSRjhQWDUxVEZsL210WW5IR3pIdGRTNmpJWC9FQmdIY2w1SkxMMmJQMm8KK1pnNkMzWmpMMnNKRVR5NmdlL0wzYXl4MkVZUkdpbmlqNHc9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMyAoMHgyKQorICAgICAgICBTZXJpYWwgTnVtYmVyOgorICAgICAgICAgICAgMDI6MDA6MDA6MDA6MDA6MDA6ZDY6Nzg6Yjc6OTQ6MDUKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPUJFLCBPPUdsb2JhbFNpZ24gbnYtc2EsIE9VPVJvb3QgQ0EsIENOPUdsb2JhbFNpZ24gUm9vdCBDQQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogU2VwICAxIDEyOjAwOjAwIDE5OTggR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBKYW4gMjggMTI6MDA6MDAgMjAxNCBHTVQKKyAgICAgICAgU3ViamVjdDogQz1CRSwgTz1HbG9iYWxTaWduIG52LXNhLCBPVT1Sb290IENBLCBDTj1HbG9iYWxTaWduIFJvb3QgQ0EKKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgyMDQ4IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgyMDQ4IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmRhOjBlOmU2Ojk5OjhkOmNlOmEzOmUzOjRmOjhhOjdlOmZiOmYxOjhiOgorICAgICAgICAgICAgICAgICAgICA4MzoyNTo2YjplYTo0ODoxZjpmMToyYTpiMDpiOTo5NToxMTowNDpiZDpmMDoKKyAgICAgICAgICAgICAgICAgICAgNjM6ZDE6ZTI6Njc6NjY6Y2Y6MWM6ZGQ6Y2Y6MWI6NDg6MmI6ZWU6OGQ6ODk6CisgICAgICAgICAgICAgICAgICAgIDhlOjlhOmFmOjI5OjgwOjY1OmFiOmU5OmM3OjJkOjEyOmNiOmFiOjFjOjRjOgorICAgICAgICAgICAgICAgICAgICA3MDowNzphMTozZDowYTozMDpjZDoxNTo4ZDo0ZjpmODpkZDpkNDo4Yzo1MDoKKyAgICAgICAgICAgICAgICAgICAgMTU6MWM6ZWY6NTA6ZWU6YzQ6MmU6Zjc6ZmM6ZTk6NTI6ZjI6OTE6N2Q6ZTA6CisgICAgICAgICAgICAgICAgICAgIDZkOmQ1OjM1OjMwOjhlOjVlOjQzOjczOmYyOjQxOmU5OmQ1OjZhOmUzOmIyOgorICAgICAgICAgICAgICAgICAgICA4OTozYTo1NjozOTozODo2ZjowNjozYzo4ODo2OTo1YjoyYTo0ZDpjNTphNzoKKyAgICAgICAgICAgICAgICAgICAgNTQ6Yjg6NmM6ODk6Y2M6OWI6Zjk6M2M6Y2E6ZTU6ZmQ6ODk6ZjU6MTI6M2M6CisgICAgICAgICAgICAgICAgICAgIDkyOjc4Ojk2OmQ2OmRjOjc0OjZlOjkzOjQ0OjYxOmQxOjhkOmM3OjQ2OmIyOgorICAgICAgICAgICAgICAgICAgICA3NTowZTo4NjplODoxOTo4YTpkNTo2ZDo2YzpkNTo3ODoxNjo5NTphMjplOToKKyAgICAgICAgICAgICAgICAgICAgYzg6MGE6Mzg6ZWI6ZjI6MjQ6MTM6NGY6NzM6NTQ6OTM6MTM6ODU6M2E6MWI6CisgICAgICAgICAgICAgICAgICAgIGJjOjFlOjM0OmI1OjhiOjA1OjhjOmI5Ojc3OjhiOmIxOmRiOjFmOjIwOjkxOgorICAgICAgICAgICAgICAgICAgICBhYjowOTo1Mzo2ZTo5MDpjZTo3YjozNzo3NDpiOTo3MDo0Nzo5MToyMjo1MToKKyAgICAgICAgICAgICAgICAgICAgNjM6MTY6Nzk6YWU6YjE6YWU6NDE6MjY6MDg6Yzg6MTk6MmI6ZDE6NDY6YWE6CisgICAgICAgICAgICAgICAgICAgIDQ4OmQ2OjY0OjJhOmQ3OjgzOjM0OmZmOjJjOjJhOmMxOjZjOjE5OjQzOjRhOgorICAgICAgICAgICAgICAgICAgICAwNzo4NTplNzpkMzo3YzpmNjoyMTo2ODplZjplYTpmMjo1Mjo5Zjo3Zjo5MzoKKyAgICAgICAgICAgICAgICAgICAgOTA6Y2YKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgICAgIFg1MDl2MyBleHRlbnNpb25zOgorICAgICAgICAgICAgWDUwOXYzIEtleSBVc2FnZTogY3JpdGljYWwKKyAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZSBTaWduLCBDUkwgU2lnbgorICAgICAgICAgICAgWDUwOXYzIFN1YmplY3QgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIDYwOjdCOjY2OjFBOjQ1OjBEOjk3OkNBOjg5OjUwOjJGOjdEOjA0OkNEOjM0OkE4OkZGOkZDOkZEOjRCCisgICAgICAgICAgICBYNTA5djMgQmFzaWMgQ29uc3RyYWludHM6IGNyaXRpY2FsCisgICAgICAgICAgICAgICAgQ0E6VFJVRQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIGFlOmFhOjlmOmZjOmI3OmQyOmNiOjFmOjVmOjM5OjI5OjI4OjE4OjllOjM0OmM5OjZjOjRmOgorICAgICAgICA2ZjoxYTpmMDo2NDphMjo3MDo0YTo0ZjoxMzo4Njo5Yjo2MDoyODo5ZTplODo4MTo0OTo5ODoKKyAgICAgICAgN2Q6MGE6YmI6ZTU6YjA6OWQ6M2Q6MzY6ZGI6OGY6MDU6NTE6ZmY6MDk6MzE6MmE6MWY6ZGQ6CisgICAgICAgIDg5Ojc3OjllOjBmOjJlOjZjOjk1OjA0OmVkOjg2OmNiOmI0OjAwOjNmOjg0OjAyOjRkOjgwOgorICAgICAgICA2YToyYToyZDo3ODowYjphZTo2ZjoyYjphMjo4Mzo0NDo4MzoxZjpjZDo1MDo4Mjo0YzoyNDoKKyAgICAgICAgYWY6YmQ6Zjc6YTU6YjQ6Yzg6NWE6MGY6ZjQ6ZTc6NDc6NWU6NDk6OGU6Mzc6OTY6ZmU6OWE6CisgICAgICAgIDg4OjA1OjNhOmQ5OmMwOmRiOjI5Ojg3OmU2OjE5Ojk2OjQ3OmE3OjNhOmE2OjhjOjhiOjNjOgorICAgICAgICA3NzpmZTo0Njo2MzphNzo1MzpkYToyMTpkMTphYzo3ZTo0OTphMjo0YjplNjpjMzo2Nzo1OToKKyAgICAgICAgMmY6YjM6OGE6MGU6YmI6MmM6YmQ6YTk6YWE6NDI6N2M6MzU6YzE6ZDg6N2Y6ZDU6YTc6MzE6CisgICAgICAgIDNhOjRlOjYzOjQzOjM5OmFmOjA4OmIwOjYxOjM0OjhjOmQzOjk4OmE5OjQzOjM0OmY2OjBmOgorICAgICAgICA4NzoyOTozYjo5ZDpjMjo1Njo1ODo5ODo3NzpjMzpmNzoxYjphYzpmNjo5ZDpmODozZTphYToKKyAgICAgICAgYTc6NTQ6NDU6ZjA6ZjU6Zjk6ZDU6MzE6NjU6ZmU6NmI6NTg6OWM6NzE6YjM6MWU6ZDc6NTI6CisgICAgICAgIGVhOjMyOjE3OmZjOjQwOjYwOjFkOmM5Ojc5OjI0OmIyOmY2OjZjOmZkOmE4OjY2OjBlOjgyOgorICAgICAgICBkZDo5ODpjYjpkYTpjMjo0NDo0ZjoyZTphMDo3YjpmMjpmNzo2YjoyYzo3NjoxMTo4NDo0NjoKKyAgICAgICAgOGE6Nzg6YTM6ZTMKKworTmF0aW9uYWwgUmV0YWlsIEZlZGVyYXRpb24gYnkgRFNUCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogQUQ6OEU6MEY6OUU6MDE6NkI6QTA6QzU6NzQ6RDU6MEM6RDM6Njg6NjU6NEY6MUUKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFQWpDQ0F1b0NFUURRSGtDS0FBQUNmQUFBQUFNQUFBQUJNQTBHQ1NxR1NJYjNEUUVCQlFVQU1JRytNUXN3CitDUVlEVlFRR0V3SjFjekVOTUFzR0ExVUVDQk1FVlhSaGFERVhNQlVHQTFVRUJ4TU9VMkZzZENCTVlXdGxJRU5wCitkSGt4SkRBaUJnTlZCQW9URzBScFoybDBZV3dnVTJsbmJtRjBkWEpsSUZSeWRYTjBJRU52TGpFak1DRUdBMVVFCitDeE1hVG1GMGFXOXVZV3dnVW1WMFlXbHNJRVpsWkdWeVlYUnBiMjR4R1RBWEJnTlZCQU1URUVSVFZDQW9UbEpHCitLU0JTYjI5MFEwRXhJVEFmQmdrcWhraUc5dzBCQ1FFV0VtTmhRR1JwWjNOcFozUnlkWE4wTG1OdmJUQWVGdzA1CitPREV5TVRFeE5qRTBNVFphRncwd09ERXlNRGd4TmpFME1UWmFNSUcrTVFzd0NRWURWUVFHRXdKMWN6RU5NQXNHCitBMVVFQ0JNRVZYUmhhREVYTUJVR0ExVUVCeE1PVTJGc2RDQk1ZV3RsSUVOcGRIa3hKREFpQmdOVkJBb1RHMFJwCitaMmwwWVd3Z1UybG5ibUYwZFhKbElGUnlkWE4wSUVOdkxqRWpNQ0VHQTFVRUN4TWFUbUYwYVc5dVlXd2dVbVYwCitZV2xzSUVabFpHVnlZWFJwYjI0eEdUQVhCZ05WQkFNVEVFUlRWQ0FvVGxKR0tTQlNiMjkwUTBFeElUQWZCZ2txCitoa2lHOXcwQkNRRVdFbU5oUUdScFozTnBaM1J5ZFhOMExtTnZiVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFECitnZ0VQQURDQ0FRb0NnZ0VCQU5tc20zZjZVTlBNM0xsQXJMbHlhZ0NISS93UGxpSFFKcS9rNHJWZit0T21mU0V3CitMc3dYZ28rWWRQeG5wS2JmaUplaVFpbjFwOXNSay90ZUl6RENxcndpNTBFYjVlMGwzc2cvMjk1WFJYaEFSb095CisxUm85M3c5RmJkVmpBblhZTDhadXE1V1JkRGNOeTAwSlhOSFVXenJhM1E3SWE1blkxVG5NMzRWVnhKSlRBcVBoCis5NERKY0tQYTNEUEVmNkpIQ0J3MWxoK2hBeHd3Zy9URXpQK1l3N0JHUktMQXY2M2Iwb0gyVEpnc3AxNGs4NGJLCitZOVc2ZmZDYXdFclFHMWp1N0tsbnoya0NiQ0xBWUN3czBjZ2c2c2d0KzkyY3U4dFJUTnpuVndRN1ZKc1JwVEowCis3SFFCODVBVld5OThMSk5sdVdabnRJR0lOZVdla1JoL2dhaEJ5TXNDQXdFQUFUQU5CZ2txaGtpRzl3MEJBUVVGCitBQU9DQVFFQWhGNExPK3lnalJ5YjBEd2RjV25rR245a3ZvRmxZY1dNYXRkOEFIVGdlbUpWN1NSODRHSGo4dDBVCis1aEZ1Z3c3aDZxbWVnSzJhSUwvZ1YzN1YwTFdFWXkzWkdPUzlHelVzWHE1aGRxcG5oVHM0NFRHQkh6Ri81dGY0CitXOUs3WTNtR3hJekYzZ3F1MTlIOEFYVC90cllOWW9GbkhMc20rQ1NBNEZ4ZTJLU0tPbzk5eS8rU28vMThxVEpwCitCMWhZWVVLWlVnT3hPRDNHY1c5czh1aDlCcXJCZkZQTEdpMklUOG1wcDZ4cGIvZWtIOWgwZ2ZWS3Y3RlZ0OU4zCitPS2R2d2tySTRuT0owMWR5NFVNdmNqejJIN2Y0QkVwdXdlbVVGK1NYRi9RT0U0WnZqYXZvWHkyMC8yeldvclFmCis3TG1VYXFvU1R4cmQ5WGUxSll6eWlncngvRkpiV0E9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMSAoMHgwKQorICAgICAgICBTZXJpYWwgTnVtYmVyOgorICAgICAgICAgICAgZDA6MWU6NDA6OGE6MDA6MDA6MDI6N2M6MDA6MDA6MDA6MDM6MDA6MDA6MDA6MDEKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz11cywgU1Q9VXRhaCwgTD1TYWx0IExha2UgQ2l0eSwgTz1EaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4sIE9VPU5hdGlvbmFsIFJldGFpbCBGZWRlcmF0aW9uLCBDTj1EU1QgKE5SRikgUm9vdENBL0VtYWlsPWNhQGRpZ3NpZ3RydXN0LmNvbQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogRGVjIDExIDE2OjE0OjE2IDE5OTggR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBEZWMgIDggMTY6MTQ6MTYgMjAwOCBHTVQKKyAgICAgICAgU3ViamVjdDogQz11cywgU1Q9VXRhaCwgTD1TYWx0IExha2UgQ2l0eSwgTz1EaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4sIE9VPU5hdGlvbmFsIFJldGFpbCBGZWRlcmF0aW9uLCBDTj1EU1QgKE5SRikgUm9vdENBL0VtYWlsPWNhQGRpZ3NpZ3RydXN0LmNvbQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDIwNDggYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDIwNDggYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6ZDk6YWM6OWI6Nzc6ZmE6NTA6ZDM6Y2M6ZGM6Yjk6NDA6YWM6Yjk6NzI6CisgICAgICAgICAgICAgICAgICAgIDZhOjAwOjg3OjIzOmZjOjBmOjk2OjIxOmQwOjI2OmFmOmU0OmUyOmI1OjVmOgorICAgICAgICAgICAgICAgICAgICBmYTpkMzphNjo3ZDoyMTozMDoyZTpjYzoxNzo4Mjo4Zjo5ODo3NDpmYzo2NzoKKyAgICAgICAgICAgICAgICAgICAgYTQ6YTY6ZGY6ODg6OTc6YTI6NDI6Mjk6ZjU6YTc6ZGI6MTE6OTM6ZmI6NWU6CisgICAgICAgICAgICAgICAgICAgIDIzOjMwOmMyOmFhOmJjOjIyOmU3OjQxOjFiOmU1OmVkOjI1OmRlOmM4OjNmOgorICAgICAgICAgICAgICAgICAgICBkYjpkZTo1Nzo0NTo3ODo0MDo0Njo4MzpiMjpkNToxYTozZDpkZjowZjo0NToKKyAgICAgICAgICAgICAgICAgICAgNmQ6ZDU6NjM6MDI6NzU6ZDg6MmY6YzY6NmU6YWI6OTU6OTE6NzQ6Mzc6MGQ6CisgICAgICAgICAgICAgICAgICAgIGNiOjRkOjA5OjVjOmQxOmQ0OjViOjNhOmRhOmRkOjBlOmM4OjZiOjk5OmQ4OgorICAgICAgICAgICAgICAgICAgICBkNTozOTpjYzpkZjo4NTo1NTpjNDo5Mjo1MzowMjphMzplMTpmNzo4MDpjOToKKyAgICAgICAgICAgICAgICAgICAgNzA6YTM6ZGE6ZGM6MzM6YzQ6N2Y6YTI6NDc6MDg6MWM6MzU6OTY6MWY6YTE6CisgICAgICAgICAgICAgICAgICAgIDAzOjFjOjMwOjgzOmY0OmM0OmNjOmZmOjk4OmMzOmIwOjQ2OjQ0OmEyOmMwOgorICAgICAgICAgICAgICAgICAgICBiZjphZDpkYjpkMjo4MTpmNjo0Yzo5ODoyYzphNzo1ZToyNDpmMzo4NjpjYToKKyAgICAgICAgICAgICAgICAgICAgNjM6ZDU6YmE6N2Q6ZjA6OWE6YzA6NGE6ZDA6MWI6NTg6ZWU6ZWM6YTk6Njc6CisgICAgICAgICAgICAgICAgICAgIGNmOjY5OjAyOjZjOjIyOmMwOjYwOjJjOjJjOmQxOmM4OjIwOmVhOmM4OjJkOgorICAgICAgICAgICAgICAgICAgICBmYjpkZDo5YzpiYjpjYjo1MTo0YzpkYzplNzo1NzowNDozYjo1NDo5YjoxMToKKyAgICAgICAgICAgICAgICAgICAgYTU6MzI6NzQ6ZWM6NzQ6MDE6ZjM6OTA6MTU6NWI6MmY6N2M6MmM6OTM6NjU6CisgICAgICAgICAgICAgICAgICAgIGI5OjY2OjY3OmI0OjgxOjg4OjM1OmU1OjllOjkxOjE4OjdmOjgxOmE4OjQxOgorICAgICAgICAgICAgICAgICAgICBjODpjYgorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgODQ6NWU6MGI6M2I6ZWM6YTA6OGQ6MWM6OWI6ZDA6M2M6MWQ6NzE6Njk6ZTQ6MWE6N2Y6NjQ6CisgICAgICAgIGJlOjgxOjY1OjYxOmM1OjhjOjZhOmQ3OjdjOjAwOjc0OmUwOjdhOjYyOjU1OmVkOjI0OjdjOgorICAgICAgICBlMDo2MTplMzpmMjpkZDoxNDplNjoxMTo2ZTo4MzowZTplMTplYTphOTo5ZTo4MDphZDo5YToKKyAgICAgICAgMjA6YmY6ZTA6NTc6N2U6ZDU6ZDA6YjU6ODQ6NjM6MmQ6ZDk6MTg6ZTQ6YmQ6MWI6MzU6MmM6CisgICAgICAgIDVlOmFlOjYxOjc2OmFhOjY3Ojg1OjNiOjM4OmUxOjMxOjgxOjFmOjMxOjdmOmU2OmQ3OmY4OgorICAgICAgICA1YjpkMjpiYjo2Mzo3OTo4NjpjNDo4YzpjNTpkZTowYTphZTpkNzpkMTpmYzowMTo3NDpmZjoKKyAgICAgICAgYjY6YjY6MGQ6NjI6ODE6Njc6MWM6YmI6MjY6Zjg6MjQ6ODA6ZTA6NWM6NWU6ZDg6YTQ6OGE6CisgICAgICAgIDNhOjhmOjdkOmNiOmZmOjkyOmEzOmZkOjdjOmE5OjMyOjY5OjA3OjU4OjU4OjYxOjQyOjk5OgorICAgICAgICA1MjowMzpiMTozODozZDpjNjo3MTo2Zjo2YzpmMjplODo3ZDowNjphYTpjMTo3Yzo1MzpjYjoKKyAgICAgICAgMWE6MmQ6ODg6NGY6Yzk6YTk6YTc6YWM6Njk6NmY6Zjc6YTQ6MWY6ZDg6NzQ6ODE6ZjU6NGE6CisgICAgICAgIGJmOmIxOjU1OmI3OmQzOjc3OjM4OmE3OjZmOmMyOjRhOmM4OmUyOjczOjg5OmQzOjU3OjcyOgorICAgICAgICBlMTo0MzoyZjo3MjozYzpmNjoxZjpiNzpmODowNDo0YTo2ZTpjMTplOTo5NDoxNzplNDo5NzoKKyAgICAgICAgMTc6ZjQ6MGU6MTM6ODY6NmY6OGQ6YWI6ZTg6NWY6MmQ6YjQ6ZmY6NmM6ZDY6YTI6YjQ6MWY6CisgICAgICAgIGVjOmI5Ojk0OjZhOmFhOjEyOjRmOjFhOmRkOmY1Ojc3OmI1OjI1OjhjOmYyOjhhOjBhOmYxOgorICAgICAgICBmYzo1Mjo1Yjo1OAorCitUQyBUcnVzdENlbnRlciwgR2VybWFueSwgQ2xhc3MgMSBDQQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogNjQ6M0Y6Rjg6M0U6NTI6MTQ6NEE6NTk6QkE6OTM6NTY6MDQ6MEI6MjM6MDI6RDEKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFTlRDQ0E1NmdBd0lCQWdJQkFqQU5CZ2txaGtpRzl3MEJBUVFGQURDQnZERUxNQWtHQTFVRUJoTUNSRVV4CitFREFPQmdOVkJBZ1RCMGhoYldKMWNtY3hFREFPQmdOVkJBY1RCMGhoYldKMWNtY3hPakE0QmdOVkJBb1RNVlJECitJRlJ5ZFhOMFEyVnVkR1Z5SUdadmNpQlRaV04xY21sMGVTQnBiaUJFWVhSaElFNWxkSGR2Y210eklFZHRZa2d4CitJakFnQmdOVkJBc1RHVlJESUZSeWRYTjBRMlZ1ZEdWeUlFTnNZWE56SURFZ1EwRXhLVEFuQmdrcWhraUc5dzBCCitDUUVXR21ObGNuUnBabWxqWVhSbFFIUnlkWE4wWTJWdWRHVnlMbVJsTUI0WERUazRNRE13T1RFek5UWXpNMW9YCitEVEExTVRJek1URXpOVFl6TTFvd2did3hDekFKQmdOVkJBWVRBa1JGTVJBd0RnWURWUVFJRXdkSVlXMWlkWEpuCitNUkF3RGdZRFZRUUhFd2RJWVcxaWRYSm5NVG93T0FZRFZRUUtFekZVUXlCVWNuVnpkRU5sYm5SbGNpQm1iM0lnCitVMlZqZFhKcGRIa2dhVzRnUkdGMFlTQk9aWFIzYjNKcmN5QkhiV0pJTVNJd0lBWURWUVFMRXhsVVF5QlVjblZ6CitkRU5sYm5SbGNpQkRiR0Z6Y3lBeElFTkJNU2t3SndZSktvWklodmNOQVFrQkZocGpaWEowYVdacFkyRjBaVUIwCitjblZ6ZEdObGJuUmxjaTVrWlRDQm56QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmpRQXdnWWtDZ1lFQXNDbnJ0SGF6CitydGUyVzdSZTU3M2pzWnhKQkZkYm9hdlpmeE1iL2JwaHE5am5jZDh0QUpSZFVVaDlJKzkxWW9TUVBBb2ZXUkYwCitMNDZBcGYwd0FqMHBVczF5R2traG5MekxVbzVJb1dPV3lCQ0ZNR2xYZEVYQVdvYkcxVDNnYUZkOU1Xb2tqVVdYCitQakYrYUdZeWJpUnQ3REkyeVVISzhERkV5S05oeWh1Z05oOENBd0VBQWFPQ0FVTXdnZ0UvTUVBR0NXQ0dTQUdHCisrRUlCQXdRekZqRm9kSFJ3Y3pvdkwzZDNkeTUwY25WemRHTmxiblJsY2k1a1pTOWpaMmt0WW1sdUwyTm9aV05yCitMWEpsZGk1aloyay9NRUFHQ1dDR1NBR0crRUlCQkFRekZqRm9kSFJ3Y3pvdkwzZDNkeTUwY25WemRHTmxiblJsCitjaTVrWlM5aloya3RZbWx1TDJOb1pXTnJMWEpsZGk1aloyay9NRHdHQ1dDR1NBR0crRUlCQndRdkZpMW9kSFJ3Citjem92TDNkM2R5NTBjblZ6ZEdObGJuUmxjaTVrWlM5aloya3RZbWx1TDFKbGJtVjNMbU5uYVQ4d1BnWUpZSVpJCitBWWI0UWdFSUJERVdMMmgwZEhBNkx5OTNkM2N1ZEhKMWMzUmpaVzUwWlhJdVpHVXZaM1ZwWkdWc2FXNWxjeTlwCitibVJsZUM1b2RHMXNNQ2dHQ1dDR1NBR0crRUlCRFFRYkZobFVReUJVY25WemRFTmxiblJsY2lCRGJHRnpjeUF4CitJRU5CTUJFR0NXQ0dTQUdHK0VJQkFRUUVBd0lBQnpBTkJna3Foa2lHOXcwQkFRUUZBQU9CZ1FBRlFsSW1wQXduCitBVVNzWENVb3drUkNWQWk1SGNVK2JGbG14TE5PVUtmNCtKWjFvWloxNkJZNG9NMWRidnA1cHh0N0hSN0RBTGxtCit2bHJXWWcvbjhudTQ3MHpnd0Q5WnJqbTNoQW1lcS9HcExtdHA0cTNNOHVwNENRVWdPRUp4R0g3SHNwZm0xUUlGCitCbGFqWC9HcXdzUlAvdmZ2RmcrZDdLcUZ6ejBwSlBFRXpRPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjogMiAoMHgyKQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9REUsIFNUPUhhbWJ1cmcsIEw9SGFtYnVyZywgTz1UQyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJILCBPVT1UQyBUcnVzdENlbnRlciBDbGFzcyAxIENBL0VtYWlsPWNlcnRpZmljYXRlQHRydXN0Y2VudGVyLmRlCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBNYXIgIDkgMTM6NTY6MzMgMTk5OCBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IERlYyAzMSAxMzo1NjozMyAyMDA1IEdNVAorICAgICAgICBTdWJqZWN0OiBDPURFLCBTVD1IYW1idXJnLCBMPUhhbWJ1cmcsIE89VEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3VyaXR5IGluIERhdGEgTmV0d29ya3MgR21iSCwgT1U9VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMSBDQS9FbWFpbD1jZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6YjA6Mjk6ZWI6YjQ6NzY6YjM6YWU6ZDc6YjY6NWI6YjQ6NWU6ZTc6YmQ6CisgICAgICAgICAgICAgICAgICAgIGUzOmIxOjljOjQ5OjA0OjU3OjViOmExOmFiOmQ5OjdmOjEzOjFiOmZkOmJhOgorICAgICAgICAgICAgICAgICAgICA2MTphYjpkODplNzo3MTpkZjoyZDowMDo5NDo1ZDo1MTo0ODo3ZDoyMzplZjoKKyAgICAgICAgICAgICAgICAgICAgNzU6NjI6ODQ6OTA6M2M6MGE6MWY6NTk6MTE6NzQ6MmY6OGU6ODA6YTU6ZmQ6CisgICAgICAgICAgICAgICAgICAgIDMwOjAyOjNkOjI5OjUyOmNkOjcyOjFhOjQ5OjIxOjljOmJjOmNiOjUyOjhlOgorICAgICAgICAgICAgICAgICAgICA0ODphMTo2Mzo5NjpjODoxMDo4NTozMDo2OTo1Nzo3NDo0NTpjMDo1YTo4NjoKKyAgICAgICAgICAgICAgICAgICAgYzY6ZDU6M2Q6ZTA6Njg6NTc6N2Q6MzE6NmE6MjQ6OGQ6NDU6OTc6M2U6MzE6CisgICAgICAgICAgICAgICAgICAgIDdlOjY4OjY2OjMyOjZlOjI0OjZkOmVjOjMyOjM2OmM5OjQxOmNhOmYwOjMxOgorICAgICAgICAgICAgICAgICAgICA0NDpjODphMzo2MTpjYToxYjphMDozNjoxZgorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBOZXRzY2FwZSBSZXZvY2F0aW9uIFVybDogCisgICAgICAgICAgICAgICAgaHR0cHM6Ly93d3cudHJ1c3RjZW50ZXIuZGUvY2dpLWJpbi9jaGVjay1yZXYuY2dpPworICAgICAgICAgICAgTmV0c2NhcGUgQ0EgUmV2b2NhdGlvbiBVcmw6IAorICAgICAgICAgICAgICAgIGh0dHBzOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NnaS1iaW4vY2hlY2stcmV2LmNnaT8KKyAgICAgICAgICAgIE5ldHNjYXBlIFJlbmV3YWwgVXJsOiAKKyAgICAgICAgICAgICAgICBodHRwczovL3d3dy50cnVzdGNlbnRlci5kZS9jZ2ktYmluL1JlbmV3LmNnaT8KKyAgICAgICAgICAgIE5ldHNjYXBlIENBIFBvbGljeSBVcmw6IAorICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvZ3VpZGVsaW5lcy9pbmRleC5odG1sCisgICAgICAgICAgICBOZXRzY2FwZSBDb21tZW50OiAKKyAgICAgICAgICAgICAgICBUQyBUcnVzdENlbnRlciBDbGFzcyAxIENBCisgICAgICAgICAgICBOZXRzY2FwZSBDZXJ0IFR5cGU6IAorICAgICAgICAgICAgICAgIFNTTCBDQSwgUy9NSU1FIENBLCBPYmplY3QgU2lnbmluZyBDQQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDA1OjQyOjUyOjI2OmE0OjBjOjI3OjAxOjQ0OmFjOjVjOjI1OjI4OmMyOjQ0OjQyOjU0OjA4OgorICAgICAgICBiOToxZDpjNTozZTo2Yzo1OTo2NjpjNDpiMzo0ZTo1MDphNzpmODpmODo5Njo3NTphMTo5NjoKKyAgICAgICAgNzU6ZTg6MTY6Mzg6YTA6Y2Q6NWQ6NmU6ZmE6Nzk6YTc6MWI6N2I6MWQ6MWU6YzM6MDA6Yjk6CisgICAgICAgIDY2OmJlOjVhOmQ2OjYyOjBmOmU3OmYyOjdiOmI4OmVmOjRjOmUwOmMwOjNmOjU5OmFlOjM5OgorICAgICAgICBiNzo4NDowOTo5ZTphYjpmMTphOToyZTo2Yjo2OTplMjphZDpjYzpmMjplYTo3ODowOTowNToKKyAgICAgICAgMjA6Mzg6NDI6NzE6MTg6N2U6Yzc6YjI6OTc6ZTY6ZDU6MDI6MDU6MDY6NTY6YTM6NWY6ZjE6CisgICAgICAgIGFhOmMyOmM0OjRmOmZlOmY3OmVmOjE2OjBmOjlkOmVjOmFhOjg1OmNmOjNkOjI5OjI0OmYxOgorICAgICAgICAwNDpjZAorCitUQyBUcnVzdENlbnRlciwgR2VybWFueSwgQ2xhc3MgMiBDQQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogRTE6RTk6OTY6NTM6Nzc6RTE6RjA6Mzg6QTA6MDI6QUI6OTQ6QzY6OTU6N0I6RkMKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFTlRDQ0E1NmdBd0lCQWdJQkF6QU5CZ2txaGtpRzl3MEJBUVFGQURDQnZERUxNQWtHQTFVRUJoTUNSRVV4CitFREFPQmdOVkJBZ1RCMGhoYldKMWNtY3hFREFPQmdOVkJBY1RCMGhoYldKMWNtY3hPakE0QmdOVkJBb1RNVlJECitJRlJ5ZFhOMFEyVnVkR1Z5SUdadmNpQlRaV04xY21sMGVTQnBiaUJFWVhSaElFNWxkSGR2Y210eklFZHRZa2d4CitJakFnQmdOVkJBc1RHVlJESUZSeWRYTjBRMlZ1ZEdWeUlFTnNZWE56SURJZ1EwRXhLVEFuQmdrcWhraUc5dzBCCitDUUVXR21ObGNuUnBabWxqWVhSbFFIUnlkWE4wWTJWdWRHVnlMbVJsTUI0WERUazRNRE13T1RFek5UYzBORm9YCitEVEExTVRJek1URXpOVGMwTkZvd2did3hDekFKQmdOVkJBWVRBa1JGTVJBd0RnWURWUVFJRXdkSVlXMWlkWEpuCitNUkF3RGdZRFZRUUhFd2RJWVcxaWRYSm5NVG93T0FZRFZRUUtFekZVUXlCVWNuVnpkRU5sYm5SbGNpQm1iM0lnCitVMlZqZFhKcGRIa2dhVzRnUkdGMFlTQk9aWFIzYjNKcmN5QkhiV0pJTVNJd0lBWURWUVFMRXhsVVF5QlVjblZ6CitkRU5sYm5SbGNpQkRiR0Z6Y3lBeUlFTkJNU2t3SndZSktvWklodmNOQVFrQkZocGpaWEowYVdacFkyRjBaVUIwCitjblZ6ZEdObGJuUmxjaTVrWlRDQm56QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmpRQXdnWWtDZ1lFQTJqam83VElBCitLWEdEQVEyL2pBSGMyc2F0T2FTcGlpL1ZpMXhvWDFER1l2Vm12Y3FSSXV5cUhWSFhQYk5Sc29OT1hjdEpzUEJNCitWZVZyTGNlRkN6QWNrazZDMU1vQzdmZHZ2dHpnNHhTNEJWUHltdlJXaTFxZWhaUFJ0SUpXcmsyN3FFdFhGcnorCisrRmllK0NtTnNIdk5lTWxQckl0bkRQR2MrL3hYbTFkY1R3MENBd0VBQWFPQ0FVTXdnZ0UvTUVBR0NXQ0dTQUdHCisrRUlCQXdRekZqRm9kSFJ3Y3pvdkwzZDNkeTUwY25WemRHTmxiblJsY2k1a1pTOWpaMmt0WW1sdUwyTm9aV05yCitMWEpsZGk1aloyay9NRUFHQ1dDR1NBR0crRUlCQkFRekZqRm9kSFJ3Y3pvdkwzZDNkeTUwY25WemRHTmxiblJsCitjaTVrWlM5aloya3RZbWx1TDJOb1pXTnJMWEpsZGk1aloyay9NRHdHQ1dDR1NBR0crRUlCQndRdkZpMW9kSFJ3Citjem92TDNkM2R5NTBjblZ6ZEdObGJuUmxjaTVrWlM5aloya3RZbWx1TDFKbGJtVjNMbU5uYVQ4d1BnWUpZSVpJCitBWWI0UWdFSUJERVdMMmgwZEhBNkx5OTNkM2N1ZEhKMWMzUmpaVzUwWlhJdVpHVXZaM1ZwWkdWc2FXNWxjeTlwCitibVJsZUM1b2RHMXNNQ2dHQ1dDR1NBR0crRUlCRFFRYkZobFVReUJVY25WemRFTmxiblJsY2lCRGJHRnpjeUF5CitJRU5CTUJFR0NXQ0dTQUdHK0VJQkFRUUVBd0lBQnpBTkJna3Foa2lHOXcwQkFRUUZBQU9CZ1FDSkcvVHY2VGppCitiQXoyelc5Snppbk0rNllQK1kwK2xVYlcvRWN5aWJMSUJtRjYwdWNORXdLVUM5bUxWa2YwdStmRlgzdjBZMHl1CitmRFRxRGFLcHN5eUY4K1ArSjFRUWtyQ1Brc0dZUWhod1NOdE9MT3NOSkdqazBmZStDYWtwaDd2bzJ0dytvNGhDCitNZlhSNDMrdTJJNEFXblNZc0UvRy95TjdYSE1BZU1uYlRnPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjogMyAoMHgzKQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9REUsIFNUPUhhbWJ1cmcsIEw9SGFtYnVyZywgTz1UQyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJILCBPVT1UQyBUcnVzdENlbnRlciBDbGFzcyAyIENBL0VtYWlsPWNlcnRpZmljYXRlQHRydXN0Y2VudGVyLmRlCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBNYXIgIDkgMTM6NTc6NDQgMTk5OCBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IERlYyAzMSAxMzo1Nzo0NCAyMDA1IEdNVAorICAgICAgICBTdWJqZWN0OiBDPURFLCBTVD1IYW1idXJnLCBMPUhhbWJ1cmcsIE89VEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3VyaXR5IGluIERhdGEgTmV0d29ya3MgR21iSCwgT1U9VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQS9FbWFpbD1jZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6ZGE6Mzg6ZTg6ZWQ6MzI6MDA6Mjk6NzE6ODM6MDE6MGQ6YmY6OGM6MDE6CisgICAgICAgICAgICAgICAgICAgIGRjOmRhOmM2OmFkOjM5OmE0OmE5OjhhOjJmOmQ1OjhiOjVjOjY4OjVmOjUwOgorICAgICAgICAgICAgICAgICAgICBjNjo2MjpmNTo2NjpiZDpjYTo5MToyMjplYzphYToxZDo1MTpkNzozZDpiMzoKKyAgICAgICAgICAgICAgICAgICAgNTE6YjI6ODM6NGU6NWQ6Y2I6NDk6YjA6ZjA6NGM6NTU6ZTU6NmI6MmQ6Yzc6CisgICAgICAgICAgICAgICAgICAgIDg1OjBiOjMwOjFjOjkyOjRlOjgyOmQ0OmNhOjAyOmVkOmY3OjZmOmJlOmRjOgorICAgICAgICAgICAgICAgICAgICBlMDplMzoxNDpiODowNTo1MzpmMjo5YTpmNDo1Njo4Yjo1YTo5ZTo4NTo5MzoKKyAgICAgICAgICAgICAgICAgICAgZDE6YjQ6ODI6NTY6YWU6NGQ6YmI6YTg6NGI6NTc6MTY6YmM6ZmU6Zjg6NTg6CisgICAgICAgICAgICAgICAgICAgIDllOmY4OjI5OjhkOmIwOjdiOmNkOjc4OmM5OjRmOmFjOjhiOjY3OjBjOmYxOgorICAgICAgICAgICAgICAgICAgICA5YzpmYjpmYzo1Nzo5Yjo1Nzo1Yzo0ZjowZAorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBOZXRzY2FwZSBSZXZvY2F0aW9uIFVybDogCisgICAgICAgICAgICAgICAgaHR0cHM6Ly93d3cudHJ1c3RjZW50ZXIuZGUvY2dpLWJpbi9jaGVjay1yZXYuY2dpPworICAgICAgICAgICAgTmV0c2NhcGUgQ0EgUmV2b2NhdGlvbiBVcmw6IAorICAgICAgICAgICAgICAgIGh0dHBzOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NnaS1iaW4vY2hlY2stcmV2LmNnaT8KKyAgICAgICAgICAgIE5ldHNjYXBlIFJlbmV3YWwgVXJsOiAKKyAgICAgICAgICAgICAgICBodHRwczovL3d3dy50cnVzdGNlbnRlci5kZS9jZ2ktYmluL1JlbmV3LmNnaT8KKyAgICAgICAgICAgIE5ldHNjYXBlIENBIFBvbGljeSBVcmw6IAorICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvZ3VpZGVsaW5lcy9pbmRleC5odG1sCisgICAgICAgICAgICBOZXRzY2FwZSBDb21tZW50OiAKKyAgICAgICAgICAgICAgICBUQyBUcnVzdENlbnRlciBDbGFzcyAyIENBCisgICAgICAgICAgICBOZXRzY2FwZSBDZXJ0IFR5cGU6IAorICAgICAgICAgICAgICAgIFNTTCBDQSwgUy9NSU1FIENBLCBPYmplY3QgU2lnbmluZyBDQQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDg5OjFiOmY0OmVmOmU5OjM4OmUyOjZjOjBjOmY2OmNkOjZmOjQ5OmNlOjI5OmNjOmZiOmE2OgorICAgICAgICAwZjpmOTo4ZDozZTo5NTo0NjpkNjpmYzo0NzozMjo4OTpiMjpjODowNjo2MTo3YTpkMjplNzoKKyAgICAgICAgMGQ6MTM6MDI6OTQ6MGI6ZDk6OGI6NTY6NDc6ZjQ6YmI6ZTc6YzU6NWY6N2I6ZjQ6NjM6NGM6CisgICAgICAgIGFlOjdjOjM0OmVhOjBkOmEyOmE5OmIzOjJjOjg1OmYzOmUzOmZlOjI3OjU0OjEwOjkyOmIwOgorICAgICAgICA4Zjo5MjpjMTo5ODo0MjoxODo3MDo0ODpkYjo0ZToyYzplYjowZDoyNDo2ODplNDpkMTpmNzoKKyAgICAgICAgYmU6MDk6YTk6Mjk6ODc6YmI6ZTg6ZGE6ZGM6M2U6YTM6ODg6NDI6MzE6ZjU6ZDE6ZTM6N2Y6CisgICAgICAgIGFlOmQ4OjhlOjAwOjVhOjc0Ojk4OmIwOjRmOmM2OmZmOjIzOjdiOjVjOjczOjAwOjc4OmM5OgorICAgICAgICBkYjo0ZQorCitUQyBUcnVzdENlbnRlciwgR2VybWFueSwgQ2xhc3MgMyBDQQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogNjI6QUI6QjY6MTU6NEE6QjQ6QjA6MTY6Nzc6RkY6QUU6Q0Y6MTY6MTY6MkI6OEMKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFTlRDQ0E1NmdBd0lCQWdJQkJEQU5CZ2txaGtpRzl3MEJBUVFGQURDQnZERUxNQWtHQTFVRUJoTUNSRVV4CitFREFPQmdOVkJBZ1RCMGhoYldKMWNtY3hFREFPQmdOVkJBY1RCMGhoYldKMWNtY3hPakE0QmdOVkJBb1RNVlJECitJRlJ5ZFhOMFEyVnVkR1Z5SUdadmNpQlRaV04xY21sMGVTQnBiaUJFWVhSaElFNWxkSGR2Y210eklFZHRZa2d4CitJakFnQmdOVkJBc1RHVlJESUZSeWRYTjBRMlZ1ZEdWeUlFTnNZWE56SURNZ1EwRXhLVEFuQmdrcWhraUc5dzBCCitDUUVXR21ObGNuUnBabWxqWVhSbFFIUnlkWE4wWTJWdWRHVnlMbVJsTUI0WERUazRNRE13T1RFek5UZzBPVm9YCitEVEExTVRJek1URXpOVGcwT1Zvd2did3hDekFKQmdOVkJBWVRBa1JGTVJBd0RnWURWUVFJRXdkSVlXMWlkWEpuCitNUkF3RGdZRFZRUUhFd2RJWVcxaWRYSm5NVG93T0FZRFZRUUtFekZVUXlCVWNuVnpkRU5sYm5SbGNpQm1iM0lnCitVMlZqZFhKcGRIa2dhVzRnUkdGMFlTQk9aWFIzYjNKcmN5QkhiV0pJTVNJd0lBWURWUVFMRXhsVVF5QlVjblZ6CitkRU5sYm5SbGNpQkRiR0Z6Y3lBeklFTkJNU2t3SndZSktvWklodmNOQVFrQkZocGpaWEowYVdacFkyRjBaVUIwCitjblZ6ZEdObGJuUmxjaTVrWlRDQm56QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmpRQXdnWWtDZ1lFQXRyVEJOUVV1CitEWTNzb0VCcUhBNG5wbENTYTFBYkI5NHU1M2JNNE5yOGhLaGVqR05xSzAzWlRnSjJFY0VMOG8xNXlnQzI4YkFPCisxL3VrRnoydnEybDZsaWUvcnpPaG1pcFpxc1MxTndqeUVxVXh0a1AxTXBaeEtDaXJqU2lHMzd2dTR3eDlNTmJECitVcXVQWFNlY2E4Q2o1d1ZyVjBsRXMyN3FaTS9Tam5wUWQzY0NBd0VBQWFPQ0FVTXdnZ0UvTUVBR0NXQ0dTQUdHCisrRUlCQXdRekZqRm9kSFJ3Y3pvdkwzZDNkeTUwY25WemRHTmxiblJsY2k1a1pTOWpaMmt0WW1sdUwyTm9aV05yCitMWEpsZGk1aloyay9NRUFHQ1dDR1NBR0crRUlCQkFRekZqRm9kSFJ3Y3pvdkwzZDNkeTUwY25WemRHTmxiblJsCitjaTVrWlM5aloya3RZbWx1TDJOb1pXTnJMWEpsZGk1aloyay9NRHdHQ1dDR1NBR0crRUlCQndRdkZpMW9kSFJ3Citjem92TDNkM2R5NTBjblZ6ZEdObGJuUmxjaTVrWlM5aloya3RZbWx1TDFKbGJtVjNMbU5uYVQ4d1BnWUpZSVpJCitBWWI0UWdFSUJERVdMMmgwZEhBNkx5OTNkM2N1ZEhKMWMzUmpaVzUwWlhJdVpHVXZaM1ZwWkdWc2FXNWxjeTlwCitibVJsZUM1b2RHMXNNQ2dHQ1dDR1NBR0crRUlCRFFRYkZobFVReUJVY25WemRFTmxiblJsY2lCRGJHRnpjeUF6CitJRU5CTUJFR0NXQ0dTQUdHK0VJQkFRUUVBd0lBQnpBTkJna3Foa2lHOXcwQkFRUUZBQU9CZ1FDRWhsQmllYUFuCis0U1c2Q2JFMER4TUo3UzNLbythVitUQ3N6UmVsemoyWG5leDhqeVovd0dIS0l2ZVIzVHcyV1pxYmRmZTg1TWp0Cis3QUsySXFmekxQSElrbmh0dHU3RktPeUFJRSs1YXdqbkw2ZUdIbjJ4Q0o5VXVRQTNQS0RZR3NpV0hQUXlGSnc1CitsYmZ1OEVOSndsN295M2x2VTcvN1NZb3MyRXZaVmZJU2NBPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjogNCAoMHg0KQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9REUsIFNUPUhhbWJ1cmcsIEw9SGFtYnVyZywgTz1UQyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJILCBPVT1UQyBUcnVzdENlbnRlciBDbGFzcyAzIENBL0VtYWlsPWNlcnRpZmljYXRlQHRydXN0Y2VudGVyLmRlCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBNYXIgIDkgMTM6NTg6NDkgMTk5OCBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IERlYyAzMSAxMzo1ODo0OSAyMDA1IEdNVAorICAgICAgICBTdWJqZWN0OiBDPURFLCBTVD1IYW1idXJnLCBMPUhhbWJ1cmcsIE89VEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3VyaXR5IGluIERhdGEgTmV0d29ya3MgR21iSCwgT1U9VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQS9FbWFpbD1jZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6YjY6YjQ6YzE6MzU6MDU6MmU6MGQ6OGQ6ZWM6YTA6NDA6NmE6MWM6MGU6CisgICAgICAgICAgICAgICAgICAgIDI3OmE2OjUwOjkyOjZiOjUwOjFiOjA3OmRlOjJlOmU3Ojc2OmNjOmUwOmRhOgorICAgICAgICAgICAgICAgICAgICBmYzo4NDphODo1ZTo4Yzo2Mzo2YToyYjo0ZDpkOTo0ZTowMjo3NjoxMTpjMToKKyAgICAgICAgICAgICAgICAgICAgMGI6ZjI6OGQ6Nzk6Y2E6MDA6YjY6ZjE6YjA6MGU6ZDc6ZmI6YTQ6MTc6M2Q6CisgICAgICAgICAgICAgICAgICAgIGFmOmFiOjY5OjdhOjk2OjI3OmJmOmFmOjMzOmExOjlhOjJhOjU5OmFhOmM0OgorICAgICAgICAgICAgICAgICAgICBiNTozNzowODpmMjoxMjphNTozMTpiNjo0MzpmNTozMjo5Njo3MToyODoyODoKKyAgICAgICAgICAgICAgICAgICAgYWI6OGQ6Mjg6ODY6ZGY6YmI6ZWU6ZTM6MGM6N2Q6MzA6ZDY6YzM6NTI6YWI6CisgICAgICAgICAgICAgICAgICAgIDhmOjVkOjI3OjljOjZiOmMwOmEzOmU3OjA1OjZiOjU3OjQ5OjQ0OmIzOjZlOgorICAgICAgICAgICAgICAgICAgICBlYTo2NDpjZjpkMjo4ZTo3YTo1MDo3Nzo3NworICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBOZXRzY2FwZSBSZXZvY2F0aW9uIFVybDogCisgICAgICAgICAgICAgICAgaHR0cHM6Ly93d3cudHJ1c3RjZW50ZXIuZGUvY2dpLWJpbi9jaGVjay1yZXYuY2dpPworICAgICAgICAgICAgTmV0c2NhcGUgQ0EgUmV2b2NhdGlvbiBVcmw6IAorICAgICAgICAgICAgICAgIGh0dHBzOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NnaS1iaW4vY2hlY2stcmV2LmNnaT8KKyAgICAgICAgICAgIE5ldHNjYXBlIFJlbmV3YWwgVXJsOiAKKyAgICAgICAgICAgICAgICBodHRwczovL3d3dy50cnVzdGNlbnRlci5kZS9jZ2ktYmluL1JlbmV3LmNnaT8KKyAgICAgICAgICAgIE5ldHNjYXBlIENBIFBvbGljeSBVcmw6IAorICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvZ3VpZGVsaW5lcy9pbmRleC5odG1sCisgICAgICAgICAgICBOZXRzY2FwZSBDb21tZW50OiAKKyAgICAgICAgICAgICAgICBUQyBUcnVzdENlbnRlciBDbGFzcyAzIENBCisgICAgICAgICAgICBOZXRzY2FwZSBDZXJ0IFR5cGU6IAorICAgICAgICAgICAgICAgIFNTTCBDQSwgUy9NSU1FIENBLCBPYmplY3QgU2lnbmluZyBDQQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDg0Ojg2OjUwOjYyOjc5OmEwOjI3OmUxOjI1OmJhOjA5OmIxOjM0OjBmOjEzOjA5OmVkOjJkOgorICAgICAgICBjYTphMzplNjo5NTpmOTozMDphYzpjZDoxNzphNTpjZTozZDo5Nzo5ZDplYzo3Yzo4ZjoyNjoKKyAgICAgICAgN2Y6YzA6NjE6Y2E6MjI6Zjc6OTE6ZGQ6M2M6MzY6NTk6OWE6OWI6NzU6Zjc6YmM6ZTQ6Yzg6CisgICAgICAgIGVkOmVjOjAyOmI2OjIyOmE3OmYzOjJjOmYxOmM4OjkyOjc4OjZkOmI2OmVlOmM1OjI4OmVjOgorICAgICAgICA4MDoyMDo0ZjpiOTo2YjowODplNzoyZjphNzo4NjoxZTo3ZDpiMTowODo5Zjo1NDpiOTowMDoKKyAgICAgICAgMzc6M2M6YTA6ZDg6MWE6Yzg6OTY6MWM6ZjQ6MzI6MTQ6OWM6Mzk6OTU6Yjc6ZWU6ZjA6NDM6CisgICAgICAgIDQ5OmMyOjVlOmU4OmNiOjc5OjZmOjUzOmJmOmZiOjQ5OjhhOjJjOmQ4OjRiOmQ5OjU1OmYyOgorICAgICAgICAxMjo3MAorCitUQyBUcnVzdENlbnRlciwgR2VybWFueSwgQ2xhc3MgNCBDQQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogQkY6QUY6RUM6QzQ6REE6Rjk6MzA6Rjk6Q0E6MzU6Q0E6MjU6RTQ6M0Y6OEQ6ODkKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFTlRDQ0E1NmdBd0lCQWdJQkJUQU5CZ2txaGtpRzl3MEJBUVFGQURDQnZERUxNQWtHQTFVRUJoTUNSRVV4CitFREFPQmdOVkJBZ1RCMGhoYldKMWNtY3hFREFPQmdOVkJBY1RCMGhoYldKMWNtY3hPakE0QmdOVkJBb1RNVlJECitJRlJ5ZFhOMFEyVnVkR1Z5SUdadmNpQlRaV04xY21sMGVTQnBiaUJFWVhSaElFNWxkSGR2Y210eklFZHRZa2d4CitJakFnQmdOVkJBc1RHVlJESUZSeWRYTjBRMlZ1ZEdWeUlFTnNZWE56SURRZ1EwRXhLVEFuQmdrcWhraUc5dzBCCitDUUVXR21ObGNuUnBabWxqWVhSbFFIUnlkWE4wWTJWdWRHVnlMbVJsTUI0WERUazRNRE13T1RFME1EQXlNRm9YCitEVEExTVRJek1URTBNREF5TUZvd2did3hDekFKQmdOVkJBWVRBa1JGTVJBd0RnWURWUVFJRXdkSVlXMWlkWEpuCitNUkF3RGdZRFZRUUhFd2RJWVcxaWRYSm5NVG93T0FZRFZRUUtFekZVUXlCVWNuVnpkRU5sYm5SbGNpQm1iM0lnCitVMlZqZFhKcGRIa2dhVzRnUkdGMFlTQk9aWFIzYjNKcmN5QkhiV0pJTVNJd0lBWURWUVFMRXhsVVF5QlVjblZ6CitkRU5sYm5SbGNpQkRiR0Z6Y3lBMElFTkJNU2t3SndZSktvWklodmNOQVFrQkZocGpaWEowYVdacFkyRjBaVUIwCitjblZ6ZEdObGJuUmxjaTVrWlRDQm56QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmpRQXdnWWtDZ1lFQXZ5OWoxalo3CitzZzNUVmZWa2JPWWxYY2EweUJTNkpUaUQ2MVppcFZXcFphUDBJNW5DUzduUXpWUm5wcU9nbzZrekszYmt2YTEzCitzdTFjRW5URHhiWVBVcHB5azBPUVltWVZEMFdsM2VEZHVHOUFibGZCZVhLallLcTZkaDBTaVZOYS9BSys0UWtUCit4VW92M0QyTEdhM1hpeVJGKzB6MHpWdzFIU2xNVWZQeWJGVUNBd0VBQWFPQ0FVTXdnZ0UvTUVBR0NXQ0dTQUdHCisrRUlCQXdRekZqRm9kSFJ3Y3pvdkwzZDNkeTUwY25WemRHTmxiblJsY2k1a1pTOWpaMmt0WW1sdUwyTm9aV05yCitMWEpsZGk1aloyay9NRUFHQ1dDR1NBR0crRUlCQkFRekZqRm9kSFJ3Y3pvdkwzZDNkeTUwY25WemRHTmxiblJsCitjaTVrWlM5aloya3RZbWx1TDJOb1pXTnJMWEpsZGk1aloyay9NRHdHQ1dDR1NBR0crRUlCQndRdkZpMW9kSFJ3Citjem92TDNkM2R5NTBjblZ6ZEdObGJuUmxjaTVrWlM5aloya3RZbWx1TDFKbGJtVjNMbU5uYVQ4d1BnWUpZSVpJCitBWWI0UWdFSUJERVdMMmgwZEhBNkx5OTNkM2N1ZEhKMWMzUmpaVzUwWlhJdVpHVXZaM1ZwWkdWc2FXNWxjeTlwCitibVJsZUM1b2RHMXNNQ2dHQ1dDR1NBR0crRUlCRFFRYkZobFVReUJVY25WemRFTmxiblJsY2lCRGJHRnpjeUEwCitJRU5CTUJFR0NXQ0dTQUdHK0VJQkFRUUVBd0lBQnpBTkJna3Foa2lHOXcwQkFRUUZBQU9CZ1FDVWFCUWJKWjRwCittYkd5STlKRXM1V2YwWjVWQk4zakw0SXpWWlozR1owcm5tVWMrb3JqeDQ4bC9MRWVWVVlQai85UE55K2tkbG1tCitaT3ZWRm5DOTNaVXpES1FOSk90a1VMUkRFZkpEdmcxeG1DTHNBYS9zOThkY2NjTjFrVmdaNk4yZzlMVHh2QkJLCis4NU8wQmttN0gyYlN2WFJINFpyNTY5ZXJiUis2NFIwczJnPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjogNSAoMHg1KQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9REUsIFNUPUhhbWJ1cmcsIEw9SGFtYnVyZywgTz1UQyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJILCBPVT1UQyBUcnVzdENlbnRlciBDbGFzcyA0IENBL0VtYWlsPWNlcnRpZmljYXRlQHRydXN0Y2VudGVyLmRlCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBNYXIgIDkgMTQ6MDA6MjAgMTk5OCBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IERlYyAzMSAxNDowMDoyMCAyMDA1IEdNVAorICAgICAgICBTdWJqZWN0OiBDPURFLCBTVD1IYW1idXJnLCBMPUhhbWJ1cmcsIE89VEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3VyaXR5IGluIERhdGEgTmV0d29ya3MgR21iSCwgT1U9VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgNCBDQS9FbWFpbD1jZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6YmY6MmY6NjM6ZDY6MzY6N2I6YjI6MGQ6ZDM6NTU6ZjU6NjQ6NmM6ZTY6CisgICAgICAgICAgICAgICAgICAgIDI1OjVkOmM2OmI0OmM4OjE0OmJhOjI1OjM4OjgzOmViOjU2OjYyOmE1OjU1OgorICAgICAgICAgICAgICAgICAgICBhOTo2NTphMzpmNDoyMzo5OTpjMjo0YjpiOTpkMDpjZDo1NDo2NzphNjphMzoKKyAgICAgICAgICAgICAgICAgICAgYTA6YTM6YTk6MzM6MmI6NzY6ZTQ6YmQ6YWQ6Nzc6YjI6ZWQ6NWM6MTI6NzQ6CisgICAgICAgICAgICAgICAgICAgIGMzOmM1OmI2OjBmOjUyOjlhOjcyOjkzOjQzOjkwOjYyOjY2OjE1OjBmOjQ1OgorICAgICAgICAgICAgICAgICAgICBhNTpkZDplMDpkZDpiODo2Zjo0MDo2ZTo1NzpjMTo3OTo3MjphMzo2MDphYToKKyAgICAgICAgICAgICAgICAgICAgYmE6NzY6MWQ6MTI6ODk6NTM6NWE6ZmM6MDI6YmU6ZTE6MDk6MTM6YzU6NGE6CisgICAgICAgICAgICAgICAgICAgIDJmOmRjOjNkOjhiOjE5OmFkOmQ3OjhiOjI0OjQ1OmZiOjRjOmY0OmNkOjVjOgorICAgICAgICAgICAgICAgICAgICAzNToxZDoyOTo0Yzo1MTpmMzpmMjo2Yzo1NQorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBOZXRzY2FwZSBSZXZvY2F0aW9uIFVybDogCisgICAgICAgICAgICAgICAgaHR0cHM6Ly93d3cudHJ1c3RjZW50ZXIuZGUvY2dpLWJpbi9jaGVjay1yZXYuY2dpPworICAgICAgICAgICAgTmV0c2NhcGUgQ0EgUmV2b2NhdGlvbiBVcmw6IAorICAgICAgICAgICAgICAgIGh0dHBzOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NnaS1iaW4vY2hlY2stcmV2LmNnaT8KKyAgICAgICAgICAgIE5ldHNjYXBlIFJlbmV3YWwgVXJsOiAKKyAgICAgICAgICAgICAgICBodHRwczovL3d3dy50cnVzdGNlbnRlci5kZS9jZ2ktYmluL1JlbmV3LmNnaT8KKyAgICAgICAgICAgIE5ldHNjYXBlIENBIFBvbGljeSBVcmw6IAorICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvZ3VpZGVsaW5lcy9pbmRleC5odG1sCisgICAgICAgICAgICBOZXRzY2FwZSBDb21tZW50OiAKKyAgICAgICAgICAgICAgICBUQyBUcnVzdENlbnRlciBDbGFzcyA0IENBCisgICAgICAgICAgICBOZXRzY2FwZSBDZXJ0IFR5cGU6IAorICAgICAgICAgICAgICAgIFNTTCBDQSwgUy9NSU1FIENBLCBPYmplY3QgU2lnbmluZyBDQQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDk0OjY4OjE0OjFiOjI1OjllOjI5Ojk5OmIxOmIyOjIzOmQyOjQ0OmIzOjk1OjlmOmQxOjllOgorICAgICAgICA1NTowNDpkZDplMzoyZjo4MjozMzo1NTo5Njo3NzoxOTo5ZDoyYjo5ZTo2NToxYzpmYTo4YToKKyAgICAgICAgZTM6Yzc6OGY6MjU6ZmM6YjE6MWU6NTU6NDY6MGY6OGY6ZmY6NGY6Mzc6MmY6YTQ6NzY6NTk6CisgICAgICAgIGE2OjY0OmViOmQ1OjE2OjcwOmJkOmRkOjk1OjMzOjBjOmE0OjBkOjI0OmViOjY0OjUwOmI0OgorICAgICAgICA0MzoxMTpmMjo0MzpiZTowZDo3MTo5ODoyMjplYzowMTphZjplYzpmNzpjNzo1Yzo3MTpjMzoKKyAgICAgICAgNzU6OTE6NTg6MTk6ZTg6ZGQ6YTA6ZjQ6YjQ6ZjE6YmM6MTA6NGE6ZjM6OTM6YjQ6MDY6NDk6CisgICAgICAgIGJiOjFmOjY2OmQyOmJkOjc0OjQ3OmUxOjlhOmY5OmViOmQ3OmFiOjZkOjFmOmJhOmUxOjFkOgorICAgICAgICAyYzpkYQorCitUaGF3dGUgUGVyc29uYWwgQmFzaWMgQ0EKKz09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiBFNjowQjpEMjpDOTpDQToyRDo4ODpEQjoxQTo3MTowRTo0Qjo3ODpFQjowMjo0MQorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURJVENDQW9xZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRUUZBRENCeXpFTE1Ba0dBMVVFQmhNQ1drRXgKK0ZUQVRCZ05WQkFnVERGZGxjM1JsY200Z1EyRndaVEVTTUJBR0ExVUVCeE1KUTJGd1pTQlViM2R1TVJvd0dBWUQKK1ZRUUtFeEZVYUdGM2RHVWdRMjl1YzNWc2RHbHVaekVvTUNZR0ExVUVDeE1mUTJWeWRHbG1hV05oZEdsdmJpQlQKK1pYSjJhV05sY3lCRWFYWnBjMmx2YmpFaE1COEdBMVVFQXhNWVZHaGhkM1JsSUZCbGNuTnZibUZzSUVKaGMybGoKK0lFTkJNU2d3SmdZSktvWklodmNOQVFrQkZobHdaWEp6YjI1aGJDMWlZWE5wWTBCMGFHRjNkR1V1WTI5dE1CNFgKK0RUazJNREV3TVRBd01EQXdNRm9YRFRJd01USXpNVEl6TlRrMU9Wb3dnY3N4Q3pBSkJnTlZCQVlUQWxwQk1SVXcKK0V3WURWUVFJRXd4WFpYTjBaWEp1SUVOaGNHVXhFakFRQmdOVkJBY1RDVU5oY0dVZ1ZHOTNiakVhTUJnR0ExVUUKK0NoTVJWR2hoZDNSbElFTnZibk4xYkhScGJtY3hLREFtQmdOVkJBc1RIME5sY25ScFptbGpZWFJwYjI0Z1UyVnkKK2RtbGpaWE1nUkdsMmFYTnBiMjR4SVRBZkJnTlZCQU1UR0ZSb1lYZDBaU0JRWlhKemIyNWhiQ0JDWVhOcFl5QkQKK1FURW9NQ1lHQ1NxR1NJYjNEUUVKQVJZWmNHVnljMjl1WVd3dFltRnphV05BZEdoaGQzUmxMbU52YlRDQm56QU4KK0Jna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBdkx5VFUyM0FVRStDRmVaSWxEV21XcjV2UXZvUFIrNTMKK2RYTGRqVW1ibGxlZ2VOVEtQMUd6YVF1UmRoY2lCNWRxeEZHVFMrQ043emVWb1F4TjJqU1FIUmVKbCtBMU9GZEsKK3dQUUljT2s4Ukh0UWZtR2FrT01qMDRnUlJpZjFDd2NPdTkzUmZ5QUtpTGxXQ3k0Y2dOcng0NTRwN3hTOUNrVDcKK0cxc1kwYjhqa3lFQ0F3RUFBYU1UTUJFd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBTkJna3Foa2lHOXcwQkFRUUYKK0FBT0JnUUF0NHBscnNEMTZpZGRab3BRQkh5dmRFa3RUd3ExL3FxY0FYSkZBVnlWS09LcUVjTG5aZ0ErbGUxejcKK2M4YTkxNHBoWEFQakxTZW9GK0NFaFVMY1hwdkd0N0p0dTNTdjVEL0xwN2V3NEYyK2VJTWxsTkxiZ1E5NUIyMVAKKzlEa1ZXbElCZTk0eTFrMDQ5aEpjQmxEZkJWdTlGRXVoM3ltNk8wR045Mk5Xb2Q4aXNRPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjogMCAoMHgwKQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9WkEsIFNUPVdlc3Rlcm4gQ2FwZSwgTD1DYXBlIFRvd24sIE89VGhhd3RlIENvbnN1bHRpbmcsIE9VPUNlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24sIENOPVRoYXd0ZSBQZXJzb25hbCBCYXNpYyBDQS9FbWFpbD1wZXJzb25hbC1iYXNpY0B0aGF3dGUuY29tCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBKYW4gIDEgMDA6MDA6MDAgMTk5NiBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IERlYyAzMSAyMzo1OTo1OSAyMDIwIEdNVAorICAgICAgICBTdWJqZWN0OiBDPVpBLCBTVD1XZXN0ZXJuIENhcGUsIEw9Q2FwZSBUb3duLCBPPVRoYXd0ZSBDb25zdWx0aW5nLCBPVT1DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uLCBDTj1UaGF3dGUgUGVyc29uYWwgQmFzaWMgQ0EvRW1haWw9cGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6YmM6YmM6OTM6NTM6NmQ6YzA6NTA6NGY6ODI6MTU6ZTY6NDg6OTQ6MzU6CisgICAgICAgICAgICAgICAgICAgIGE2OjVhOmJlOjZmOjQyOmZhOjBmOjQ3OmVlOjc3Ojc1OjcyOmRkOjhkOjQ5OgorICAgICAgICAgICAgICAgICAgICA5Yjo5Njo1NzphMDo3ODpkNDpjYTozZjo1MTpiMzo2OTowYjo5MTo3NjoxNzoKKyAgICAgICAgICAgICAgICAgICAgMjI6MDc6OTc6NmE6YzQ6NTE6OTM6NGI6ZTA6OGQ6ZWY6Mzc6OTU6YTE6MGM6CisgICAgICAgICAgICAgICAgICAgIDRkOmRhOjM0OjkwOjFkOjE3Ojg5Ojk3OmUwOjM1OjM4OjU3OjRhOmMwOmY0OgorICAgICAgICAgICAgICAgICAgICAwODo3MDplOTozYzo0NDo3Yjo1MDo3ZTo2MTo5YTo5MDplMzoyMzpkMzo4ODoKKyAgICAgICAgICAgICAgICAgICAgMTE6NDY6Mjc6ZjU6MGI6MDc6MGU6YmI6ZGQ6ZDE6N2Y6MjA6MGE6ODg6Yjk6CisgICAgICAgICAgICAgICAgICAgIDU2OjBiOjJlOjFjOjgwOmRhOmYxOmUzOjllOjI5OmVmOjE0OmJkOjBhOjQ0OgorICAgICAgICAgICAgICAgICAgICBmYjoxYjo1YjoxODpkMTpiZjoyMzo5MzoyMQorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBYNTA5djMgQmFzaWMgQ29uc3RyYWludHM6IGNyaXRpY2FsCisgICAgICAgICAgICAgICAgQ0E6VFJVRQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDJkOmUyOjk5OjZiOmIwOjNkOjdhOjg5OmQ3OjU5OmEyOjk0OjAxOjFmOjJiOmRkOjEyOjRiOgorICAgICAgICA1MzpjMjphZDo3ZjphYTphNzowMDo1Yzo5MTo0MDo1NzoyNTo0YTozODphYTo4NDo3MDpiOToKKyAgICAgICAgZDk6ODA6MGY6YTU6N2I6NWM6ZmI6NzM6YzY6YmQ6ZDc6OGE6NjE6NWM6MDM6ZTM6MmQ6Mjc6CisgICAgICAgIGE4OjE3OmUwOjg0Ojg1OjQyOmRjOjVlOjliOmM2OmI3OmIyOjZkOmJiOjc0OmFmOmU0OjNmOgorICAgICAgICBjYjphNzpiNzpiMDplMDo1ZDpiZTo3ODo4MzoyNTo5NDpkMjpkYjo4MTowZjo3OTowNzo2ZDoKKyAgICAgICAgNGY6ZjQ6Mzk6MTU6NWE6NTI6MDE6N2I6ZGU6MzI6ZDY6NGQ6Mzg6ZjY6MTI6NWM6MDY6NTA6CisgICAgICAgIGRmOjA1OjViOmJkOjE0OjRiOmExOmRmOjI5OmJhOjNiOjQxOjhkOmY3OjYzOjU2OmExOmRmOgorICAgICAgICAyMjpiMQorCitUaGF3dGUgUGVyc29uYWwgRnJlZW1haWwgQ0EKKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiAxRTo3NDpDMzo4NjozQzowQzozNTpDNTozRTpDMjo3RjpFRjozQzpBQTozQzpEOQorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURMVENDQXBhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRUUZBRENCMFRFTE1Ba0dBMVVFQmhNQ1drRXgKK0ZUQVRCZ05WQkFnVERGZGxjM1JsY200Z1EyRndaVEVTTUJBR0ExVUVCeE1KUTJGd1pTQlViM2R1TVJvd0dBWUQKK1ZRUUtFeEZVYUdGM2RHVWdRMjl1YzNWc2RHbHVaekVvTUNZR0ExVUVDeE1mUTJWeWRHbG1hV05oZEdsdmJpQlQKK1pYSjJhV05sY3lCRWFYWnBjMmx2YmpFa01DSUdBMVVFQXhNYlZHaGhkM1JsSUZCbGNuTnZibUZzSUVaeVpXVnQKK1lXbHNJRU5CTVNzd0tRWUpLb1pJaHZjTkFRa0JGaHh3WlhKemIyNWhiQzFtY21WbGJXRnBiRUIwYUdGM2RHVXUKK1kyOXRNQjRYRFRrMk1ERXdNVEF3TURBd01Gb1hEVEl3TVRJek1USXpOVGsxT1Zvd2dkRXhDekFKQmdOVkJBWVQKK0FscEJNUlV3RXdZRFZRUUlFd3hYWlhOMFpYSnVJRU5oY0dVeEVqQVFCZ05WQkFjVENVTmhjR1VnVkc5M2JqRWEKK01CZ0dBMVVFQ2hNUlZHaGhkM1JsSUVOdmJuTjFiSFJwYm1jeEtEQW1CZ05WQkFzVEgwTmxjblJwWm1sallYUnAKK2IyNGdVMlZ5ZG1salpYTWdSR2wyYVhOcGIyNHhKREFpQmdOVkJBTVRHMVJvWVhkMFpTQlFaWEp6YjI1aGJDQkcKK2NtVmxiV0ZwYkNCRFFURXJNQ2tHQ1NxR1NJYjNEUUVKQVJZY2NHVnljMjl1WVd3dFpuSmxaVzFoYVd4QWRHaGgKK2QzUmxMbU52YlRDQm56QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmpRQXdnWWtDZ1lFQTFHblgxTENVWkZ0eDZVZlkKK0RGRzI2bktSc0lSZWZTME5qM3NTMzRVbGRTaDBPa0lzWXllZmxYdEw3MzRaaHgyRzZxUGR1YzZXWkJyQ0ZHNUUKK3JIem1qK2hORDNFZlFEaW1BS09IZVBiNWxJWmVyZXJBWG5icjJSU2pYVzU2ZkF5bFMxVi9CaGtwZjU2YUp0VnEKK3V6Z2tDR3FZeDdIYW81aVIvWG5iNVZyRUhMa0NBd0VBQWFNVE1CRXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU4KK0Jna3Foa2lHOXcwQkFRUUZBQU9CZ1FESDdKSitUdmoxbHFWbllpcWs4RTBSWU5CdmpXQllZYXdtdTFJMVhBalAKK01QdW9TcGFLSDJKQ0k0d1hEL1M2Wkp3WHJFY3AzNTJZWHRKc1lIRmNvcXpjZWVQbmJnQkhIN1VOS09nQ25lU2EKKy9SUDBwdGw4c2ZqY1h5TW1DWkdBYzlBVUc5NURxWU1sOHVhY0x4WEsvcWFyaWdkMWl3emRVWVJyNVBqUnpuZWkKK2dRPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjogMCAoMHgwKQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9WkEsIFNUPVdlc3Rlcm4gQ2FwZSwgTD1DYXBlIFRvd24sIE89VGhhd3RlIENvbnN1bHRpbmcsIE9VPUNlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24sIENOPVRoYXd0ZSBQZXJzb25hbCBGcmVlbWFpbCBDQS9FbWFpbD1wZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUuY29tCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBKYW4gIDEgMDA6MDA6MDAgMTk5NiBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IERlYyAzMSAyMzo1OTo1OSAyMDIwIEdNVAorICAgICAgICBTdWJqZWN0OiBDPVpBLCBTVD1XZXN0ZXJuIENhcGUsIEw9Q2FwZSBUb3duLCBPPVRoYXd0ZSBDb25zdWx0aW5nLCBPVT1DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uLCBDTj1UaGF3dGUgUGVyc29uYWwgRnJlZW1haWwgQ0EvRW1haWw9cGVyc29uYWwtZnJlZW1haWxAdGhhd3RlLmNvbQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6ZDQ6Njk6ZDc6ZDQ6YjA6OTQ6NjQ6NWI6NzE6ZTk6NDc6ZDg6MGM6NTE6CisgICAgICAgICAgICAgICAgICAgIGI2OmVhOjcyOjkxOmIwOjg0OjVlOjdkOjJkOjBkOjhmOjdiOjEyOmRmOjg1OgorICAgICAgICAgICAgICAgICAgICAyNTo3NToyODo3NDozYTo0MjoyYzo2MzoyNzo5Zjo5NTo3Yjo0YjplZjo3ZToKKyAgICAgICAgICAgICAgICAgICAgMTk6ODc6MWQ6ODY6ZWE6YTM6ZGQ6Yjk6Y2U6OTY6NjQ6MWE6YzI6MTQ6NmU6CisgICAgICAgICAgICAgICAgICAgIDQ0OmFjOjdjOmU2OjhmOmU4OjRkOjBmOjcxOjFmOjQwOjM4OmE2OjAwOmEzOgorICAgICAgICAgICAgICAgICAgICA4Nzo3ODpmNjpmOTo5NDo4Njo1ZTphZDplYTpjMDo1ZTo3NjplYjpkOToxNDoKKyAgICAgICAgICAgICAgICAgICAgYTM6NWQ6NmU6N2E6N2M6MGM6YTU6NGI6NTU6N2Y6MDY6MTk6Mjk6N2Y6OWU6CisgICAgICAgICAgICAgICAgICAgIDlhOjI2OmQ1OjZhOmJiOjM4OjI0OjA4OjZhOjk4OmM3OmIxOmRhOmEzOjk4OgorICAgICAgICAgICAgICAgICAgICA5MTpmZDo3OTpkYjplNTo1YTpjNDoxYzpiOQorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBYNTA5djMgQmFzaWMgQ29uc3RyYWludHM6IGNyaXRpY2FsCisgICAgICAgICAgICAgICAgQ0E6VFJVRQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIGM3OmVjOjkyOjdlOjRlOmY4OmY1Ojk2OmE1OjY3OjYyOjJhOmE0OmYwOjRkOjExOjYwOmQwOgorICAgICAgICA2Zjo4ZDo2MDo1ODo2MTphYzoyNjpiYjo1MjozNTo1YzowODpjZjozMDpmYjphODo0YTo5NjoKKyAgICAgICAgOGE6MWY6NjI6NDI6MjM6OGM6MTc6MGY6ZjQ6YmE6NjQ6OWM6MTc6YWM6NDc6Mjk6ZGY6OWQ6CisgICAgICAgIDk4OjVlOmQyOjZjOjYwOjcxOjVjOmEyOmFjOmRjOjc5OmUzOmU3OjZlOjAwOjQ3OjFmOmI1OgorICAgICAgICAwZDoyODplODowMjo5ZDplNDo5YTpmZDoxMzpmNDphNjpkOTo3YzpiMTpmODpkYzo1ZjoyMzoKKyAgICAgICAgMjY6MDk6OTE6ODA6NzM6ZDA6MTQ6MWI6ZGU6NDM6YTk6ODM6MjU6ZjI6ZTY6OWM6MmY6MTU6CisgICAgICAgIGNhOmZlOmE2OmFiOjhhOjA3Ojc1OjhiOjBjOmRkOjUxOjg0OjZiOmU0OmY4OmQxOmNlOjc3OgorICAgICAgICBhMjo4MQorCitUaGF3dGUgUGVyc29uYWwgUHJlbWl1bSBDQQorPT09PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogM0E6QjI6REU6MjI6OUE6MjA6OTM6NDk6Rjk6RUQ6Qzg6RDI6OEE6RTc6Njg6MEQKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlES1RDQ0FwS2dBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVFGQURDQnp6RUxNQWtHQTFVRUJoTUNXa0V4CitGVEFUQmdOVkJBZ1RERmRsYzNSbGNtNGdRMkZ3WlRFU01CQUdBMVVFQnhNSlEyRndaU0JVYjNkdU1Sb3dHQVlECitWUVFLRXhGVWFHRjNkR1VnUTI5dWMzVnNkR2x1WnpFb01DWUdBMVVFQ3hNZlEyVnlkR2xtYVdOaGRHbHZiaUJUCitaWEoyYVdObGN5QkVhWFpwYzJsdmJqRWpNQ0VHQTFVRUF4TWFWR2hoZDNSbElGQmxjbk52Ym1Gc0lGQnlaVzFwCitkVzBnUTBFeEtqQW9CZ2txaGtpRzl3MEJDUUVXRzNCbGNuTnZibUZzTFhCeVpXMXBkVzFBZEdoaGQzUmxMbU52CitiVEFlRncwNU5qQXhNREV3TURBd01EQmFGdzB5TURFeU16RXlNelU1TlRsYU1JSFBNUXN3Q1FZRFZRUUdFd0phCitRVEVWTUJNR0ExVUVDQk1NVjJWemRHVnliaUJEWVhCbE1SSXdFQVlEVlFRSEV3bERZWEJsSUZSdmQyNHhHakFZCitCZ05WQkFvVEVWUm9ZWGQwWlNCRGIyNXpkV3gwYVc1bk1TZ3dKZ1lEVlFRTEV4OURaWEowYVdacFkyRjBhVzl1CitJRk5sY25acFkyVnpJRVJwZG1semFXOXVNU013SVFZRFZRUURFeHBVYUdGM2RHVWdVR1Z5YzI5dVlXd2dVSEpsCitiV2wxYlNCRFFURXFNQ2dHQ1NxR1NJYjNEUUVKQVJZYmNHVnljMjl1WVd3dGNISmxiV2wxYlVCMGFHRjNkR1V1CitZMjl0TUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FESlp0bjRCMFRQdVl3dThLSHZFMFZzCitCZC9lSnhaUk5rRVJiR3c3N2Y0UWZSS2U1WnRDbXY1Z01jTm10M002U0s1TzBESTNsSWkxRGJiWjgvSkUyZFdJCitFdDEyVGZJYS9HOGpIbnJ4MkpoRlRnY1E3eFpDMEVOMWJVcmU0cXJKTWY4ZkFIQjhaczhRSlFpNit1NEE2VVlECitaaWNSRlR1cVcvS1kzVFpDc3RxSWRRSURBUUFCb3hNd0VUQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BMEdDU3FHCitTSWIzRFFFQkJBVUFBNEdCQUdrMmlmYzBLak55TDIwNzFDS3l1RytheFRabURoczhvYkYxV3ViOU5kUDRxUElICitiNFZuanQ0cnVlSVhzRHFnOEE2aUFKcmY4eFFWYnJ2SWhWcVlnUG4vdm5RZFBmUCtNQ1hSTnpSbitxVnhlVEJoCitLWExBNEN4TSsxYmtPcWh2NVRKWlV0dDFLRkJaRFBnTEdlU3MyYStXalM5UTJ3ZkQ2aCtyTStEMUt6R0oKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjogMCAoMHgwKQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9WkEsIFNUPVdlc3Rlcm4gQ2FwZSwgTD1DYXBlIFRvd24sIE89VGhhd3RlIENvbnN1bHRpbmcsIE9VPUNlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24sIENOPVRoYXd0ZSBQZXJzb25hbCBQcmVtaXVtIENBL0VtYWlsPXBlcnNvbmFsLXByZW1pdW1AdGhhd3RlLmNvbQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogSmFuICAxIDAwOjAwOjAwIDE5OTYgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBEZWMgMzEgMjM6NTk6NTkgMjAyMCBHTVQKKyAgICAgICAgU3ViamVjdDogQz1aQSwgU1Q9V2VzdGVybiBDYXBlLCBMPUNhcGUgVG93biwgTz1UaGF3dGUgQ29uc3VsdGluZywgT1U9Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbiwgQ049VGhhd3RlIFBlcnNvbmFsIFByZW1pdW0gQ0EvRW1haWw9cGVyc29uYWwtcHJlbWl1bUB0aGF3dGUuY29tCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpjOTo2NjpkOTpmODowNzo0NDpjZjpiOTo4YzoyZTpmMDphMTplZjoxMzoKKyAgICAgICAgICAgICAgICAgICAgNDU6NmM6MDU6ZGY6ZGU6Mjc6MTY6NTE6MzY6NDE6MTE6NmM6NmM6M2I6ZWQ6CisgICAgICAgICAgICAgICAgICAgIGZlOjEwOjdkOjEyOjllOmU1OjliOjQyOjlhOmZlOjYwOjMxOmMzOjY2OmI3OgorICAgICAgICAgICAgICAgICAgICA3MzozYTo0ODphZTo0ZTpkMDozMjozNzo5NDo4ODpiNTowZDpiNjpkOTpmMzoKKyAgICAgICAgICAgICAgICAgICAgZjI6NDQ6ZDk6ZDU6ODg6MTI6ZGQ6NzY6NGQ6ZjI6MWE6ZmM6NmY6MjM6MWU6CisgICAgICAgICAgICAgICAgICAgIDdhOmYxOmQ4Ojk4OjQ1OjRlOjA3OjEwOmVmOjE2OjQyOmQwOjQzOjc1OjZkOgorICAgICAgICAgICAgICAgICAgICA0YTpkZTplMjphYTpjOTozMTpmZjoxZjowMDo3MDo3Yzo2NjpjZjoxMDoyNToKKyAgICAgICAgICAgICAgICAgICAgMDg6YmE6ZmE6ZWU6MDA6ZTk6NDY6MDM6NjY6Mjc6MTE6MTU6M2I6YWE6NWI6CisgICAgICAgICAgICAgICAgICAgIGYyOjk4OmRkOjM2OjQyOmIyOmRhOjg4Ojc1CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogY3JpdGljYWwKKyAgICAgICAgICAgICAgICBDQTpUUlVFCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgNjk6MzY6ODk6Zjc6MzQ6MmE6MzM6NzI6MmY6NmQ6M2I6ZDQ6MjI6YjI6Yjg6NmY6OWE6YzU6CisgICAgICAgIDM2OjY2OjBlOjFiOjNjOmExOmIxOjc1OjVhOmU2OmZkOjM1OmQzOmY4OmE4OmYyOjA3OjZmOgorICAgICAgICA4NTo2Nzo4ZTpkZToyYjpiOTplMjoxNzpiMDozYTphMDpmMDowZTphMjowMDo5YTpkZjpmMzoKKyAgICAgICAgMTQ6MTU6NmU6YmI6Yzg6ODU6NWE6OTg6ODA6Zjk6ZmY6YmU6NzQ6MWQ6M2Q6ZjM6ZmU6MzA6CisgICAgICAgIDI1OmQxOjM3OjM0OjY3OmZhOmE1OjcxOjc5OjMwOjYxOjI5OjcyOmMwOmUwOjJjOjRjOmZiOgorICAgICAgICA1NjplNDozYTphODo2ZjplNTozMjo1OTo1MjpkYjo3NToyODo1MDo1OTowYzpmODowYjoxOToKKyAgICAgICAgZTQ6YWM6ZDk6YWY6OTY6OGQ6MmY6NTA6ZGI6MDc6YzM6ZWE6MWY6YWI6MzM6ZTA6ZjU6MmI6CisgICAgICAgIDMxOjg5CisKK1RoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQQorPT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IDA2OjlGOjY5Ojc5OjE2OjY2OjkwOjAyOjFCOjhDOjhDOkEyOkMzOjA3OjZGOjNBCitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJREp6Q0NBcENnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFRRkFEQ0J6akVMTUFrR0ExVUVCaE1DV2tFeAorRlRBVEJnTlZCQWdUREZkbGMzUmxjbTRnUTJGd1pURVNNQkFHQTFVRUJ4TUpRMkZ3WlNCVWIzZHVNUjB3R3dZRAorVlFRS0V4UlVhR0YzZEdVZ1EyOXVjM1ZzZEdsdVp5QmpZekVvTUNZR0ExVUVDeE1mUTJWeWRHbG1hV05oZEdsdgorYmlCVFpYSjJhV05sY3lCRWFYWnBjMmx2YmpFaE1COEdBMVVFQXhNWVZHaGhkM1JsSUZCeVpXMXBkVzBnVTJWeQorZG1WeUlFTkJNU2d3SmdZSktvWklodmNOQVFrQkZobHdjbVZ0YVhWdExYTmxjblpsY2tCMGFHRjNkR1V1WTI5dAorTUI0WERUazJNRGd3TVRBd01EQXdNRm9YRFRJd01USXpNVEl6TlRrMU9Wb3dnYzR4Q3pBSkJnTlZCQVlUQWxwQgorTVJVd0V3WURWUVFJRXd4WFpYTjBaWEp1SUVOaGNHVXhFakFRQmdOVkJBY1RDVU5oY0dVZ1ZHOTNiakVkTUJzRworQTFVRUNoTVVWR2hoZDNSbElFTnZibk4xYkhScGJtY2dZMk14S0RBbUJnTlZCQXNUSDBObGNuUnBabWxqWVhScAorYjI0Z1UyVnlkbWxqWlhNZ1JHbDJhWE5wYjI0eElUQWZCZ05WQkFNVEdGUm9ZWGQwWlNCUWNtVnRhWFZ0SUZObAorY25abGNpQkRRVEVvTUNZR0NTcUdTSWIzRFFFSkFSWVpjSEpsYldsMWJTMXpaWEoyWlhKQWRHaGhkM1JsTG1OdgorYlRDQm56QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmpRQXdnWWtDZ1lFQTBqWTJhb3ZYd2x1ZTJvRkJZbzg0N2trRQorVmRiUTd4d2JsUlpIN3hoSU5UcFM5Q3RxQm84N0wrcFc0NitHalo0WDk1NjBaWFVDVGUvTENhSWhVZGliMEdmUQordWcyU0JoUnoxSlBMbHlvQW5GeE9ETHo2RlZMODhrUnUyaEZLYmdpZkx5M2orYW82aG5PMlJsTll5SWtGdllNUgordUhNL3FnZU45RUpONTBDZEhEY0NBd0VBQWFNVE1CRXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU5CZ2txaGtpRworOXcwQkFRUUZBQU9CZ1FBbVNDd1d3bGo2NkJaMERLcXFYMVEvOHRmSmVHQmVYbTQzWXlKM05uNnlGOFEwdWZVSQoraGZ6SkFUai9UYjd5RmtKRDU3dGFSdnZCeGhFZjhVcXdLRWJKdzhSQ2ZiejZxMWx1MWJkUmlCSGpwSVVaYTRKTQorcEF3U3JlbWtyai94dzBsbG1vekZ5RDRsdDVTWnU1SXljUWZ3aGw3dFVDZW1EYVlqK2J2THBnY1VRZz09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAzICgweDIpCisgICAgICAgIFNlcmlhbCBOdW1iZXI6IDEgKDB4MSkKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVpBLCBTVD1XZXN0ZXJuIENhcGUsIEw9Q2FwZSBUb3duLCBPPVRoYXd0ZSBDb25zdWx0aW5nIGNjLCBPVT1DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uLCBDTj1UaGF3dGUgUHJlbWl1bSBTZXJ2ZXIgQ0EvRW1haWw9cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogQXVnICAxIDAwOjAwOjAwIDE5OTYgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBEZWMgMzEgMjM6NTk6NTkgMjAyMCBHTVQKKyAgICAgICAgU3ViamVjdDogQz1aQSwgU1Q9V2VzdGVybiBDYXBlLCBMPUNhcGUgVG93biwgTz1UaGF3dGUgQ29uc3VsdGluZyBjYywgT1U9Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbiwgQ049VGhhd3RlIFByZW1pdW0gU2VydmVyIENBL0VtYWlsPXByZW1pdW0tc2VydmVyQHRoYXd0ZS5jb20KKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgxMDI0IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgxMDI0IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmQyOjM2OjM2OjZhOjhiOmQ3OmMyOjViOjllOmRhOjgxOjQxOjYyOjhmOgorICAgICAgICAgICAgICAgICAgICAzODplZTo0OTowNDo1NTpkNjpkMDplZjoxYzoxYjo5NToxNjo0NzplZjoxODoKKyAgICAgICAgICAgICAgICAgICAgNDg6MzU6M2E6NTI6ZjQ6MmI6NmE6MDY6OGY6M2I6MmY6ZWE6NTY6ZTM6YWY6CisgICAgICAgICAgICAgICAgICAgIDg2OjhkOjllOjE3OmY3OjllOmI0OjY1Ojc1OjAyOjRkOmVmOmNiOjA5OmEyOgorICAgICAgICAgICAgICAgICAgICAyMTo1MTpkODo5YjpkMDo2NzpkMDpiYTowZDo5MjowNjoxNDo3MzpkNDo5MzoKKyAgICAgICAgICAgICAgICAgICAgY2I6OTc6MmE6MDA6OWM6NWM6NGU6MGM6YmM6ZmE6MTU6NTI6ZmM6ZjI6NDQ6CisgICAgICAgICAgICAgICAgICAgIDZlOmRhOjExOjRhOjZlOjA4OjlmOjJmOjJkOmUzOmY5OmFhOjNhOjg2OjczOgorICAgICAgICAgICAgICAgICAgICBiNjo0Njo1Mzo1ODpjODo4OTowNTpiZDo4MzoxMTpiODo3MzozZjphYTowNzoKKyAgICAgICAgICAgICAgICAgICAgOGQ6ZjQ6NDI6NGQ6ZTc6NDA6OWQ6MWM6MzcKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgICAgIFg1MDl2MyBleHRlbnNpb25zOgorICAgICAgICAgICAgWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzOiBjcml0aWNhbAorICAgICAgICAgICAgICAgIENBOlRSVUUKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDVXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICAyNjo0ODoyYzoxNjpjMjo1ODpmYTplODoxNjo3NDowYzphYTphYTo1Zjo1NDozZjpmMjpkNzoKKyAgICAgICAgYzk6Nzg6NjA6NWU6NWU6NmU6Mzc6NjM6MjI6Nzc6MzY6N2U6YjI6MTc6YzQ6MzQ6Yjk6ZjU6CisgICAgICAgIDA4Ojg1OmZjOmM5OjAxOjM4OmZmOjRkOmJlOmYyOjE2OjQyOjQzOmU3OmJiOjVhOjQ2OmZiOgorICAgICAgICBjMTpjNjoxMToxZjpmMTo0YTpiMDoyODo0NjpjOTpjMzpjNDo0Mjo3ZDpiYzpmYTphYjo1OToKKyAgICAgICAgNmU6ZDU6Yjc6NTE6ODg6MTE6ZTM6YTQ6ODU6MTk6NmI6ODI6NGM6YTQ6MGM6MTI6YWQ6ZTk6CisgICAgICAgIGE0OmFlOjNmOmYxOmMzOjQ5OjY1OjlhOjhjOmM1OmM4OjNlOjI1OmI3Ojk0Ojk5OmJiOjkyOgorICAgICAgICAzMjo3MTowNzpmMDo4Njo1ZTplZDo1MDoyNzphNjowZDphNjoyMzpmOTpiYjpjYjphNjowNzoKKyAgICAgICAgMTQ6NDIKKworVGhhd3RlIFNlcnZlciBDQQorPT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiBDNTo3MDpDNDpBMjpFRDo1Mzo3ODowQzpDODoxMDo1Mzo4MTo2NDpDQjpEMDoxRAorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURFekNDQW55Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRUUZBRENCeERFTE1Ba0dBMVVFQmhNQ1drRXgKK0ZUQVRCZ05WQkFnVERGZGxjM1JsY200Z1EyRndaVEVTTUJBR0ExVUVCeE1KUTJGd1pTQlViM2R1TVIwd0d3WUQKK1ZRUUtFeFJVYUdGM2RHVWdRMjl1YzNWc2RHbHVaeUJqWXpFb01DWUdBMVVFQ3hNZlEyVnlkR2xtYVdOaGRHbHYKK2JpQlRaWEoyYVdObGN5QkVhWFpwYzJsdmJqRVpNQmNHQTFVRUF4TVFWR2hoZDNSbElGTmxjblpsY2lCRFFURW0KK01DUUdDU3FHU0liM0RRRUpBUllYYzJWeWRtVnlMV05sY25SelFIUm9ZWGQwWlM1amIyMHdIaGNOT1RZd09EQXgKK01EQXdNREF3V2hjTk1qQXhNak14TWpNMU9UVTVXakNCeERFTE1Ba0dBMVVFQmhNQ1drRXhGVEFUQmdOVkJBZ1QKK0RGZGxjM1JsY200Z1EyRndaVEVTTUJBR0ExVUVCeE1KUTJGd1pTQlViM2R1TVIwd0d3WURWUVFLRXhSVWFHRjMKK2RHVWdRMjl1YzNWc2RHbHVaeUJqWXpFb01DWUdBMVVFQ3hNZlEyVnlkR2xtYVdOaGRHbHZiaUJUWlhKMmFXTmwKK2N5QkVhWFpwYzJsdmJqRVpNQmNHQTFVRUF4TVFWR2hoZDNSbElGTmxjblpsY2lCRFFURW1NQ1FHQ1NxR1NJYjMKK0RRRUpBUllYYzJWeWRtVnlMV05sY25SelFIUm9ZWGQwWlM1amIyMHdnWjh3RFFZSktvWklodmNOQVFFQkJRQUQKK2dZMEFNSUdKQW9HQkFOT2tVRzdJLzFacjVzOWR0dW9NYUhWSG9xckMyb1FsL0tqMFIxSGFoYlVnZEpTR0hnOTEKK3lla0lZZlVHYlRCdUZSa0M2VkxBWXR0Tm1aN2lhZ3hFT00zK3Z1TmtDWERGL3JGcktiWXZTY2c3MUNjRUpSQ1gKK0wrZVFiY0FvUXBuWFRFUGV3L1VoYlZTZlhjTlk0Y0RrMlZ1d3VOeTBlOTgyT3NLMVppSVMxb2NOQWdNQkFBR2oKK0V6QVJNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVFQlFBRGdZRUFCL3BNYVZ6N2xjeEcKKzdvV0RUU0V3anNyWnFHOUpHdWJhVWVOZ2NHeUVZUkdoR3NoSVBsbERmVStWUGFHTHR3dGltSHAxaXQySVRrNmUKK1FOdW96REowdVc4Tnh1T3pSQXZaaW0rYUtadVpHQ2c3MGVOQUtKcGFQTlcxNXlBYmk4cWtxNDNwVWRuaVRDeFoKK3FkcTVzblViOWtMeTc4ZnlHUG1KdktQL2lpTXVjRWM9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAzICgweDIpCisgICAgICAgIFNlcmlhbCBOdW1iZXI6IDEgKDB4MSkKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVpBLCBTVD1XZXN0ZXJuIENhcGUsIEw9Q2FwZSBUb3duLCBPPVRoYXd0ZSBDb25zdWx0aW5nIGNjLCBPVT1DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uLCBDTj1UaGF3dGUgU2VydmVyIENBL0VtYWlsPXNlcnZlci1jZXJ0c0B0aGF3dGUuY29tCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBBdWcgIDEgMDA6MDA6MDAgMTk5NiBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IERlYyAzMSAyMzo1OTo1OSAyMDIwIEdNVAorICAgICAgICBTdWJqZWN0OiBDPVpBLCBTVD1XZXN0ZXJuIENhcGUsIEw9Q2FwZSBUb3duLCBPPVRoYXd0ZSBDb25zdWx0aW5nIGNjLCBPVT1DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uLCBDTj1UaGF3dGUgU2VydmVyIENBL0VtYWlsPXNlcnZlci1jZXJ0c0B0aGF3dGUuY29tCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpkMzphNDo1MDo2ZTpjODpmZjo1Njo2YjplNjpjZjo1ZDpiNjplYTowYzoKKyAgICAgICAgICAgICAgICAgICAgNjg6NzU6NDc6YTI6YWE6YzI6ZGE6ODQ6MjU6ZmM6YTg6ZjQ6NDc6NTE6ZGE6CisgICAgICAgICAgICAgICAgICAgIDg1OmI1OjIwOjc0Ojk0Ojg2OjFlOjBmOjc1OmM5OmU5OjA4OjYxOmY1OjA2OgorICAgICAgICAgICAgICAgICAgICA2ZDozMDo2ZToxNToxOTowMjplOTo1MjpjMDo2MjpkYjo0ZDo5OTo5ZTplMjoKKyAgICAgICAgICAgICAgICAgICAgNmE6MGM6NDQ6Mzg6Y2Q6ZmU6YmU6ZTM6NjQ6MDk6NzA6YzU6ZmU6YjE6NmI6CisgICAgICAgICAgICAgICAgICAgIDI5OmI2OjJmOjQ5OmM4OjNiOmQ0OjI3OjA0OjI1OjEwOjk3OjJmOmU3OjkwOgorICAgICAgICAgICAgICAgICAgICA2ZDpjMDoyODo0Mjo5OTpkNzo0Yzo0MzpkZTpjMzpmNToyMTo2ZDo1NDo5ZjoKKyAgICAgICAgICAgICAgICAgICAgNWQ6YzM6NTg6ZTE6YzA6ZTQ6ZDk6NWI6YjA6Yjg6ZGM6YjQ6N2I6ZGY6MzY6CisgICAgICAgICAgICAgICAgICAgIDNhOmMyOmI1OjY2OjIyOjEyOmQ2Ojg3OjBkCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogY3JpdGljYWwKKyAgICAgICAgICAgICAgICBDQTpUUlVFCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQ1V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgMDc6ZmE6NGM6Njk6NWM6ZmI6OTU6Y2M6NDY6ZWU6ODU6ODM6NGQ6MjE6MzA6OGU6Y2E6ZDk6CisgICAgICAgIGE4OjZmOjQ5OjFhOmU2OmRhOjUxOmUzOjYwOjcwOjZjOjg0OjYxOjExOmExOjFhOmM4OjQ4OgorICAgICAgICAzZTo1OTo0Mzo3ZDo0Zjo5NTozZDphMTo4YjpiNzowYjo2Mjo5ODo3YTo3NTo4YTpkZDo4ODoKKyAgICAgICAgNGU6NGU6OWU6NDA6ZGI6YTg6Y2M6MzI6NzQ6Yjk6NmY6MGQ6YzY6ZTM6YjM6NDQ6MGI6ZDk6CisgICAgICAgIDhhOjZmOjlhOjI5OjliOjk5OjE4OjI4OjNiOmQxOmUzOjQwOjI4OjlhOjVhOjNjOmQ1OmI1OgorICAgICAgICBlNzoyMDoxYjo4YjpjYTphNDphYjo4ZDplOTo1MTpkOTplMjo0YzoyYzo1OTphOTpkYTpiOToKKyAgICAgICAgYjI6NzU6MWI6ZjY6NDI6ZjI6ZWY6Yzc6ZjI6MTg6Zjk6ODk6YmM6YTM6ZmY6OGE6MjM6MmU6CisgICAgICAgIDcwOjQ3CisKK1RoYXd0ZSBVbml2ZXJzYWwgQ0EgUm9vdAorPT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IDE3OkFGOjcxOjE2OjUyOjdCOjczOjY1OjIyOjA1OjI5OjI4Ojg0OjcxOjlEOjEzCitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJUklqQ0NDUW9DQVFBd0RRWUpLb1pJaHZjTkFRRUZCUUF3VnpFUE1BMEdBMVVFQ2hNR1ZHaGhkM1JsTVNFdworSHdZRFZRUUxFeGhVYUdGM2RHVWdWVzVwZG1WeWMyRnNJRU5CSUZKdmIzUXhJVEFmQmdOVkJBTVRHRlJvWVhkMAorWlNCVmJtbDJaWEp6WVd3Z1EwRWdVbTl2ZERBZUZ3MDVPVEV5TURVeE16VTJNRFZhRncwek56QTBNRE14TXpVMgorTURWYU1GY3hEekFOQmdOVkJBb1RCbFJvWVhkMFpURWhNQjhHQTFVRUN4TVlWR2hoZDNSbElGVnVhWFpsY25OaAorYkNCRFFTQlNiMjkwTVNFd0h3WURWUVFERXhoVWFHRjNkR1VnVlc1cGRtVnljMkZzSUVOQklGSnZiM1F3Z2dnaQorTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElJRHdBd2dnZ0tBb0lJQVFEaWlRVnR3Myt0cG9rNi83dkh6WjAzc2VIUworSVI2YllTb1Y1M3RYVDFVODBMdjUyVDArcHJ6c3RLMVRtaFlDNnd0eS9ZcnlqMFFGeGV2VDViMjJSRG5tKzBlLworYXA0S2xSamlhT0xXbHRZaHJZajk5UmYxMDlwQ3BaRHRLWldXZFRyYWg2SFU5ZE9IM2dWaXB1Tm1kSkxQcGJ5NworMzJqL2NYVldRVmsxNnpOYVpsSHkwcU1Ld1l6T2Mxd1JieTJNbFl5UnNmM1A1YTFXbGN5RmtvT1FWVUhKd25mdAorK2FOMFFncG9DUFBRMFdYOVp5dzAveVIvNTNuSUJ6c2xWOTJrREpnOXZ1RE1HV1hiOGxTaXIwTFVuZUt1aENNbAorQ1RNU3RXb2Vkc1NMMlVrQWJGNjZIL0liMm1mS0o2cWpSQ01iZzRMTzhxc3o3VlNrM01tcldXWFJPQTdCUGh0bgorajlaMUFlQlZJdDEyZCt5TzNmVFBlU0p0dVZjRDlaa0lwencrTlB2RUY2NGpXTTBrOHlQS2FnSW9sQUdCTkxScworYTY2TEdzT2owZ2s4RmxUMU5sOGs0NTlLb2VKa3hoYkRwb0Y2SkRaSGpzRmVEdnY1RlhnRTFnNVoyWjFZWm1MUworbENreU1zaDR1V2IydFZiaGJNWVVTNVpTV1pFQ0pHcFZSOWMvdGlNYVlIZVhMdUpBcjU0RVY1NnRFY1hKUTNEdgorU0xSZXJCeHBMaTZDMVZ1THZvSytHUlJlNXcwaXgxRWIveDZiOFRDUGNURUdzelFuajE5NlpvSlBpaTBUcTBMUAorSVZhZWw0NW1OZytXbStVcjlBS3BLbXFNTE1URHVIQXNMU2tlUDFCM0htMHFWT1JWQ3BFNG9jVzFacUoyV3U0UAordjdSbjRTaHVEK0Uyb1lMUnY5UjM0Y1JuTXBONHlPZFVVLzRqZWVab3pDYVE5aEJqWFNwdmtTMmtjekpSSWZLNworRmQrcUpBaElCdDZobmlhL3VvTy9mS1RJb0l5OTB2KzhoR2tuRXlRWXhFVVlJeVplR0JUS0xvaUhZcU5UNWlHMwordUlWN21vVzdGU1p5K0xuM2FuUVBTVCtTdnFrRnQ1a252NzhKRjB1WlRLMFJFSHpmZERIMmp5WmZxb2l1T0ZmSQorVlMzVCs5Z2JVWm0rSlJzNnVzQjlHKzNPMGttNXovUEZmWW1RZ2RocFNDQVFvL2p2a2xFWU1vc1JHTUEvRzRWVworemxmSjhvSmt4dDhDQ1M1S0VTK3hKMjAzVXZEd0ZtSHhaNDNmaDNLdmg5clArMUNVYnRTVWhldUtMT29oOVpaSworUk5YZ3ptcDBSRTNRQmRPSEZlMDIwS1NMWmxWd2srNUhCc0YrTHFVWWVXZnpLSVh4Y1BjT2c2UitWSjVhZGpMTAorWlJ1NHpmdklLQVBTVkpIUnA4V0ZRd2dYZHFYbUwyY0kyS0dpZ2kwTStNR3ZZOVJRZDIxclJrcEJoZFdRWDNrdAoreE96WEVZZEFpdUZvNG1UNFZUTDdiNU1zMm5mWkljRVg1VFlzVG42UWY2eVVLekpudmpoUWRyaXVRYm5YSWNVSgorVEdESW8xSEVOSnRYTjkvTHlUTlhpK3Y3ZHA4WlRjVnFIeXBGcml2dEw0Mm5wUURMQlBvbFlpNTBTQnZLS295NgorMjdaKzlyc0NmS25EMjFoNG9iL3cvaG9RVlJITzZHbE9sbVhHRndQV0IyaU1WSUt1SENKVlAvSDBDWmNvd0ViMworVGdzbEhmY0gxd2tkT2hoWE9Edm9Nd2JuajNoR0hsdjFCcmJzdUtZTjhib1RTOVlZSU4xcE0wb3pGYTY0eUppSworSnl5VHZDMzc3ak8vWnVaTnVyYWJCbFZnbDB1OFJNMSs5S0hZcWkvQUFpZ2hGbUo0MndoVTh2ejBOT1BHanh4RAorVjg2UUdrdmNManNva1lrL2V0bzFIWTRzN2tuczlET3R5Vk9vako4RVV6NGtIRkxKRXZsaVY2Tzg3aXpyUUh3ZworSTNBcmxmbHpGNHJSd1J4cHByYzRtbWYzY0IxNldneEF6MklQaFR6Q0FrNSt0ZmJGS2ltRXN4ODNLdUdxY2tMRQorN1dzYWo1SWNYYjdSOGx2eXE2cXAwdlc0cEVFcks1RnVFa2pLbU5nM2pjanRBREMxdGdST2ZwemFoT3pBK252bAorSFlpa1UwYXdsT1JjRzZFbExBOUlVbmVYQ1d6c1d4Z3pnd0xsZ243TmhTRXdFZjBuVDgva0h1dy9wVmRzNlNvdworR1NxSTVjTnBPS3R2T1hGL2hPRkJ3K0hNS29rZ1VpNkREMnc1UDBzdEZxd3Q4Q1NzQUhQMG03TUdQd1c0RklVZgorcTU1Y1BKNWluUTV0TzRBSi9BTHFvcGQweXNmNTQxYmh3OHFscHByQWtPQWtFbFBTd292YXZ1MENRMTVuNFltWQorZWU3THFzckRHOXpucFVhbGZHc1doN1phS05mYkp6eGVwYjIyVWQwZlE4ODdKc2c2alNWaHdVbjBQQnZKUk9xdgorSE1JcmxBRXFEakRSVzRzclIrWEQwUVFEbXc0NUxOWW4xT1p3V3RsMXp5cll5UUFGNUJPSTdNTTUrNGRoTURaRAorQThpZW5LSUd3aS9GL1BDQVk3RlVCS0JNcVM3RzlYWjYyTkRrMUpRUjVSVzFlQWJjdUlDUG1ha2dNejBRaFV4bAorQ2NvK1dGNWdrNXFxWWwzQVVRWWNYV0NnRFp4TFEvYW5GaUdraDZyeXdTN3VrakM0bnQvZkVBR0xoZ2x3Mkd5bwordDFBZUZwYTA5MmY5TlRvaGtDb3l4d0I3VFFjUUNia3ZjOWdZZm1lWkJFOEcvRkRIaFp1ZFFKMnpsamY2cGR5eQorY2s3dlRna3MvWkg5VGZlN3BxRStxM3VpQTBDbXFWVW40dnI1R2M2SGRhcnhkVGJ6ODdpUitKSERpM1VUamt4bAorbWhZNWF1VTA2SHFXV1g4MXNBRDlXMm44UXliNjlTaHUvb2ZaZmlUN3RLQ0NibFNpLzY2L1lyVDBjZ0hDeTVoSAorbU9GTXRSZUFnTTZQcGlqdUhrVnErOS94SGZ4YU85YnE5R3dkWWtsWE80cVBodXJ3VXdUT25CWm8vN3E1L0lnUAorUi9jQ1JISkF1TW83TFZPZDNEeFdqRmw3YUJvc2pYRzdiQURIR3M1dlFKS3hveThQMlVUeW8zQXVudTRPcmpMUQorT3o2TEIrcm1lYk5jS2VKOWE2aGUrVm94NkFpV29vd0RtRWJ4dUgyUVZDYnRkbUwrbnVtYWJsN0pTY2RjTkZNcAorVk5uczVFYmhnRHQxMmQvN2VkV0g4YnFlNnhuT1RGSno1bHVIcmlWUE9Ybk14cmo1RUh2czhKdHhwQVdnMHluVAorVG44ZjlDMG9lTXhWbFhzZWtTL01WaGh6aTdMYnZHa0g1dERZVCsyaS8xaUZvMjNnU2xPM1ozMk5ERnhiZTNjbworQWpWRWVnVFRLRVBJYXpBWFhUSzRLVFc2ZHRvN0ZFcDJHRmlrK0pJOG5rMHpiMFpyQ05reFNHamQ5UHNrVmpTeQorejJsbXZralNpbVlpemZKcHpjSlRFMFVwUVNMV1haZ2Z0cVN5bzhMdUFpOVJHOXlEcE94d0phalVDR0V5YitTaAorZ1M1OFkzTDZLV1c4Y0VUUFhRSURBUUFCTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElJQVFCVm1qUnFJZ1pwQ1VVegoreDY2cFhNY0pUcHVHdkVHUTFKUlM5czBqS1pSTElzM292ZjZkelZMeXZlMnJoOG1ycTBZRXRMMmlQeUl3UjFEQQorUzR4MkR3UDFrdEt4TGNSNk5aekpjNGZycHAvZUQzT04wMytaMkxxUGI4VHp2aHF1aTZLVU5wRGk1ZXVOQmZUOAorWmQrVjhjU1VUUmRXMTU4OGoxQTg1M2UvbFlZbVpQdHEvOGJhNll5dVFydHA1VFBHMk9rTnhsVWhTY0VNdEtQNQorbTB0YzNvTlBRUVBPS25sb09IM3dWRWtnOWJZUS93amNNMmFXbS84RzNnQ2UxODVXUTVwUi9IRE45dkJSbzdmTgordEZ5RllzMXh0OFlySXl2ZHcyNUFRdm8zL3pjYzlucFhsSWVGSTlmVXljZGZ3VTB2eVEzWFhPeWNKZTZlTUlLUgorbG5LNGRSMzRDV2hYbDdJdFMrNGw3SG9rS2U1eTFKd1QyNnZjQXdyWVNoVEpDRmRFWGFHMVU0QTA4aFNYejFMZQorb2c2S0VPa1U3OUJndm1HaDhTVmQxUmh6UDVNUXlwYnVzMERTMjZOVnoxZGFwUTVQZFVmZjZ2ZVFtbTMxY0M0ZAorRkJ3M1pBUlpVTERjY29adm5EYzlYU2l2YzFYdjB1NGtkSFFUNzl6Yk1VbjdQMlAxMHdnK002WG5uUXJlVXl4Ugoram1mYm0wRmxRVkM5MUtTV2JJZThFdUNVeDlQQTVNdHpXQUNENGF3bmhkYWRVNTFjdlFvK0EwT2NESkgxYlh2NAorUUhKMXF4RjJrU3ZoeHFvZmNHbDJjQlVKL3BQUTFpMjNGV3FiWjF5MGFaOGxwbjJLKzMwaXFYSHl6azZNdUNFdAorM3Y1QmNRMy9uZXh6cHJzSFQ0Z09XRWN1ZnFuQ3gzamR1bnFlVHVBd1RtTnZoZFFnUWVuNi9rTkY1L3V2ZXJMTworcEFVZElwcFlodC9remt5cC90Z1dwVy83Mk01V2UvWFdJTy9rUjgxakpQKzV2dkZJbzhFQmN1YTl3SzN0SmczSworTkovOEFpMGdUd1VncmlFOURNSWdQRC93QklUY3o0bjl1U1dSanRCRDVyTWdxMXd0MVVDZW9Fdlk5TExNZmZGWQorQ282SDdZaXNOcGJrVnFBUml2S2EwTE5Yb3pTN0dhczQ0WFJySXNReHpnSFZHemJqSGpoTU01UGZRT05aVjA2cworYm5zZVdqM0ZIVnVzeUJDQ05RSWlzdngxNkJDUmpjUjllSk5Ibmh5ZHJHdGlBbGlNMWh3ajFxOTR3b0NjcEtvaworVkJTMUZKakcrQ3NhSk10eE1ncmltdzVwYTkxK2pHVFJMbVB2RG4reFBvaE1uVlhseVc0WEJMZEIvNzJLUWNzbAorTVc5RWR6OUhzZnlCaUFlT0JVa2d0eEhaYVFNcUE1MjVNNFNhMzk5NjQwWnpvOWlpakZNWmlGVk1kTGoyUklRcgorMFJRdFRqa3VrbWovYWZ5RllodnJWVS92SllSaVJablcyRTV2UDFNSWZSMEdsWUdBZjA5T2REYVl0ZUtIY0pqYworMS9YY1VoWG14dFo1bGpsL2o1WFBxNEJUclJzTFJVQU8xQmk5TE42S2QzYjk4a1JIeGlIUTVIVHcyQmdGeUh3dworY3NmZjhidjhBakNwOUVJbVdRMlRCWUtoYyswMDVUaGR6VkNRL3BUOEU3eTkvS2lpaUtkenhMS28wVjJJeEFLaQorZXZFRXlmNk1kTW52SFdSQm42d2VsbWRrcktzb1FjZWQ5OENZRzI0SHdtUjlXb05tVmlnMm5PZjdISGNPS0tERQorOTJ0NU9RUWdoTWRYazd3Ym9PcTg2MExscUJIKy9LeGx6UDM0S0lqMHBacmxjMUhncUpzTkEzZE81ZUNZczRqYQorZmViR25ud1Vac0V1VTBxU0J6ZWdmdWs5Q2VRVmZNLzl1RUdsNzU1bW5jUmVCeDJIK0VHdDZ1Y3Ywa0ZqR0RmNQorRk9OTjBPWDNRLzBWNC9rMmN3WW0zd0ZQcWNOTzNpQkdkNWkwZWlRck8zVXJUbGlObTEya3h4YWd2REtJUDZHRAorOHdESStOaFk2V05kVEN1MThISkIyS3QzTjlaeWRLNjJOcHpJcG9OSlMrREpWZ3NwdmdBd3k5M1d5RUtLQU5ucworRmRFMGNmSmJaSWYySjlLMzY0YXdrTDhwMnlHZU5vempJQytWSTFGc0c4S2sxZWJZQWtObm9QNmJVQU5FZjd2aworY3RYUjVOcVBraFJrKzEwVUVCSktsUWJKWlFncHlpR2pKamdSeVNmZmNHY0UvY3BJTW45anNrVjBNVkJQaDlrZworY05JaGNMSFdFSjB6WFhpRGtXMVZndXphNUdKang0RkcxeGxsY2lwREdaQzQxeU5OVEJ6Z1JLbG1aNnp1Y1hrbgorSm5odGNnNzFYVXNqdFh4OFpla1h4am9MRGQxZUhsSERocmpzZjhjblNxVkc2R290R2NHSG84dVprNGRrb2xVVQorVExkRHBaUFg1OUpPZVVES1pabEdQVDk2Z0hxSWFzd2U1V3N6UnZSUXdOVWZDYmpOaWk2aEordGRjNmZvYXdybAorVjRJcXNQemlWRkpXOEt1cEVzWWpsZ2Nrbk9DOFJxVzBJQVRhQ1pOajVkUXV3bjdGTWUyMUZYU0dGN216OHlhSworSFFKcTJoby82THJ4QkcyVVVWVGlXclJaZ3gxZzBDMXp6QWUxSm96NTE4YUlrZStBejEwUG9XRExSZFJDSXRHeAorY0IzOTBMY3drRHJHU0cxbjVUTGFqOXZqcU9NZElDV2lIT0ZNdWFUMnhqOWNXQTI3eHJKM0FSYVJueGNHRGJkQQorUHN5UGpweEw0SjErbXg0RnE0Z2krdE1vRzFjVVpFbytKQ3c0VFNGcEFITXUwRlV0ZFBJVjZKUkRQa0FxeHNhNQorYWx2ZW9zd1lVRlJkVGlxRmJQYVNpeWtaZnVmcVN1QWlLeVc4OTJiUGQ1cEJkUEk4RkExMGFmVlFnODNOTHlIYgorSWthSzBQZFJHcFZYOGdXTEdobnRPMFhvTnNKdWZ2dFhJZ0FmQmxPcHJwUEdqM0VxTVVXUzU0NXQ1cGtpd0lQOAorNzl4WFpuZFBvall4KzZFVGplWEtvNVY5QVF4a2NEdFRRbWlBeDd1ZHFBQTFhWmdNcUdmWVErV3F6NVhnVVpXaworRno5Q25iZ0V6dE41ZWNqVGloWXlrdURYb3U3WE4wd3ZyTGg3dmtYMjhSZ3puSHMzcGlUWnZFQ3JBT25ETjR1cgorMkxielhvRk9zQlJyQno0ZjdNTDJSQ0tWdTdQbWI5YjVjR1c2Q29ObHFnNFRMNE1USTFPTFFCYjZ6aS84VFFUNAorNjlpc3hUYkNGVmRJT094VnM3UWV1cTNTUWdZWERYUElWNmErbGsycDhzRDdlaUVjOWNsd3FZS1F0ZkVNMUhrUQordm9HbTZWeGhuSGQ1bXFURE55WlhOOGxTTFBvSS85QmZ4bUhBOUhhKy9ONU96NnRSbVhISDMzNzAxczhHVmhrVAorVXd0dGRGbElHWnRUQlMyZE1sVFQ1U3hUaTJRKzFHUjc0NEFKRk16K0ZrWmphM0ZwK1BuTEovYUlWTHhGczg0QworeUpUdVFGdjVRZ0xDLzdEWUxPc29mMTdKSmdHWnB3PT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDEgKDB4MCkKKyAgICAgICAgU2VyaWFsIE51bWJlcjogMCAoMHgwKQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBPPVRoYXd0ZSwgT1U9VGhhd3RlIFVuaXZlcnNhbCBDQSBSb290LCBDTj1UaGF3dGUgVW5pdmVyc2FsIENBIFJvb3QKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IERlYyAgNSAxMzo1NjowNSAxOTk5IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogQXByICAzIDEzOjU2OjA1IDIwMzcgR01UCisgICAgICAgIFN1YmplY3Q6IE89VGhhd3RlLCBPVT1UaGF3dGUgVW5pdmVyc2FsIENBIFJvb3QsIENOPVRoYXd0ZSBVbml2ZXJzYWwgQ0EgUm9vdAorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDE2Mzg0IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgxNjM4NCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDplMjo4OTowNTo2ZDpjMzo3ZjphZDphNjo4OTozYTpmZjpiYjpjNzpjZDoKKyAgICAgICAgICAgICAgICAgICAgOWQ6Mzc6YjE6ZTE6ZDI6MjE6MWU6OWI6NjE6MmE6MTU6ZTc6N2I6NTc6NGY6CisgICAgICAgICAgICAgICAgICAgIDU1OjNjOmQwOmJiOmY5OmQ5OjNkOjNlOmE2OmJjOmVjOmI0OmFkOjUzOjlhOgorICAgICAgICAgICAgICAgICAgICAxNjowMjplYjowYjo3MjpmZDo4YTpmMjo4Zjo0NDowNTpjNTplYjpkMzplNToKKyAgICAgICAgICAgICAgICAgICAgYmQ6YjY6NDQ6Mzk6ZTY6ZmI6NDc6YmY6NmE6OWU6MGE6OTU6MTg6ZTI6Njg6CisgICAgICAgICAgICAgICAgICAgIGUyOmQ2Ojk2OmQ2OjIxOmFkOjg4OmZkOmY1OjE3OmY1OmQzOmRhOjQyOmE1OgorICAgICAgICAgICAgICAgICAgICA5MDplZDoyOTo5NTo5Njo3NTozYTpkYTo4NzphMTpkNDpmNTpkMzo4NzpkZToKKyAgICAgICAgICAgICAgICAgICAgMDU6NjI6YTY6ZTM6NjY6NzQ6OTI6Y2Y6YTU6YmM6YmI6ZGY6Njg6ZmY6NzE6CisgICAgICAgICAgICAgICAgICAgIDc1OjU2OjQxOjU5OjM1OmViOjMzOjVhOjY2OjUxOmYyOmQyOmEzOjBhOmMxOgorICAgICAgICAgICAgICAgICAgICA4YzpjZTo3Mzo1YzoxMTo2ZjoyZDo4Yzo5NTo4Yzo5MTpiMTpmZDpjZjplNToKKyAgICAgICAgICAgICAgICAgICAgYWQ6NTY6OTU6Y2M6ODU6OTI6ODM6OTA6NTU6NDE6Yzk6YzI6Nzc6ZWQ6Zjk6CisgICAgICAgICAgICAgICAgICAgIGEzOjc0OjQyOjBhOjY4OjA4OmYzOmQwOmQxOjY1OmZkOjY3OjJjOjM0OmZmOgorICAgICAgICAgICAgICAgICAgICAyNDo3ZjplNzo3OTpjODowNzozYjoyNTo1NzpkZDphNDowYzo5ODozZDpiZToKKyAgICAgICAgICAgICAgICAgICAgZTA6Y2M6MTk6NjU6ZGI6ZjI6NTQ6YTI6YWY6NDI6ZDQ6OWQ6ZTI6YWU6ODQ6CisgICAgICAgICAgICAgICAgICAgIDIzOjI1OjA5OjMzOjEyOmI1OjZhOjFlOjc2OmM0OjhiOmQ5OjQ5OjAwOjZjOgorICAgICAgICAgICAgICAgICAgICA1ZTpiYToxZjpmMjoxYjpkYTo2NzpjYToyNzphYTphMzo0NDoyMzoxYjo4MzoKKyAgICAgICAgICAgICAgICAgICAgODI6Y2U6ZjI6YWI6MzM6ZWQ6NTQ6YTQ6ZGM6Yzk6YWI6NTk6NjU6ZDE6Mzg6CisgICAgICAgICAgICAgICAgICAgIDBlOmMxOjNlOjFiOjY3OjhmOmQ2Ojc1OjAxOmUwOjU1OjIyOmRkOjc2Ojc3OgorICAgICAgICAgICAgICAgICAgICBlYzo4ZTpkZDpmNDpjZjo3OToyMjo2ZDpiOTo1NzowMzpmNTo5OTowODphNzoKKyAgICAgICAgICAgICAgICAgICAgM2M6M2U6MzQ6ZmI6YzQ6MTc6YWU6MjM6NTg6Y2Q6MjQ6ZjM6MjM6Y2E6NmE6CisgICAgICAgICAgICAgICAgICAgIDAyOjI4Ojk0OjAxOjgxOjM0OmI0OjZjOjZiOmFlOjhiOjFhOmMzOmEzOmQyOgorICAgICAgICAgICAgICAgICAgICAwOTozYzoxNjo1NDpmNTozNjo1ZjoyNDplMzo5Zjo0YTphMTplMjo2NDpjNjoKKyAgICAgICAgICAgICAgICAgICAgMTY6YzM6YTY6ODE6N2E6MjQ6MzY6NDc6OGU6YzE6NWU6MGU6ZmI6Zjk6MTU6CisgICAgICAgICAgICAgICAgICAgIDc4OjA0OmQ2OjBlOjU5OmQ5OjlkOjU4OjY2OjYyOmQyOjk0OjI5OjMyOjMyOgorICAgICAgICAgICAgICAgICAgICBjODo3ODpiOTo2NjpmNjpiNTo1NjplMTo2YzpjNjoxNDo0Yjo5Njo1Mjo1OToKKyAgICAgICAgICAgICAgICAgICAgOTE6MDI6MjQ6NmE6NTU6NDc6ZDc6M2Y6YjY6MjM6MWE6NjA6Nzc6OTc6MmU6CisgICAgICAgICAgICAgICAgICAgIGUyOjQwOmFmOjllOjA0OjU3OjllOmFkOjExOmM1OmM5OjQzOjcwOmVmOjQ4OgorICAgICAgICAgICAgICAgICAgICBiNDo1ZTphYzoxYzo2OToyZToyZTo4MjpkNTo1Yjo4YjpiZTo4MjpiZToxOToKKyAgICAgICAgICAgICAgICAgICAgMTQ6NWU6ZTc6MGQ6MjI6Yzc6NTE6MWI6ZmY6MWU6OWI6ZjE6MzA6OGY6NzE6CisgICAgICAgICAgICAgICAgICAgIDMxOjA2OmIzOjM0OjI3OjhmOjVmOjdhOjY2OjgyOjRmOjhhOjJkOjEzOmFiOgorICAgICAgICAgICAgICAgICAgICA0MjpjZjoyMTo1Njo5ZTo5Nzo4ZTo2NjozNjowZjo5Njo5YjplNToyYjpmNDoKKyAgICAgICAgICAgICAgICAgICAgMDI6YTk6MmE6NmE6OGM6MmM6YzQ6YzM6Yjg6NzA6MmM6MmQ6Mjk6MWU6M2Y6CisgICAgICAgICAgICAgICAgICAgIDUwOjc3OjFlOjZkOjJhOjU0OmU0OjU1OjBhOjkxOjM4OmExOmM1OmI1OjY2OgorICAgICAgICAgICAgICAgICAgICBhMjo3Njo1YTplZTowZjpiZjpiNDo2NzplMToyODo2ZTowZjplMTozNjphMToKKyAgICAgICAgICAgICAgICAgICAgODI6ZDE6YmY6ZDQ6Nzc6ZTE6YzQ6Njc6MzI6OTM6Nzg6Yzg6ZTc6NTQ6NTM6CisgICAgICAgICAgICAgICAgICAgIGZlOjIzOjc5OmU2OjY4OmNjOjI2OjkwOmY2OjEwOjYzOjVkOjJhOjZmOjkxOgorICAgICAgICAgICAgICAgICAgICAyZDphNDo3MzozMjo1MToyMTpmMjpiYjoxNTpkZjphYToyNDowODo0ODowNjoKKyAgICAgICAgICAgICAgICAgICAgZGU6YTE6OWU6MjY6YmY6YmE6ODM6YmY6N2M6YTQ6Yzg6YTA6OGM6YmQ6ZDI6CisgICAgICAgICAgICAgICAgICAgIGZmOmJjOjg0OjY5OjI3OjEzOjI0OjE4OmM0OjQ1OjE4OjIzOjI2OjVlOjE4OgorICAgICAgICAgICAgICAgICAgICAxNDpjYToyZTo4ODo4Nzo2MjphMzo1MzplNjoyMTpiNzpiODo4NTo3Yjo5YToKKyAgICAgICAgICAgICAgICAgICAgODU6YmI6MTU6MjY6NzI6Zjg6Yjk6Zjc6NmE6NzQ6MGY6NDk6M2Y6OTI6YmU6CisgICAgICAgICAgICAgICAgICAgIGE5OjA1OmI3Ojk5OjI3OmJmOmJmOjA5OjE3OjRiOjk5OjRjOmFkOjExOjEwOgorICAgICAgICAgICAgICAgICAgICA3YzpkZjo3NDozMTpmNjo4ZjoyNjo1ZjphYTo4ODphZTozODo1NzpjODo1NToKKyAgICAgICAgICAgICAgICAgICAgMmQ6ZDM6ZmI6ZDg6MWI6NTE6OTk6YmU6MjU6MWI6M2E6YmE6YzA6N2Q6MWI6CisgICAgICAgICAgICAgICAgICAgIGVkOmNlOmQyOjQ5OmI5OmNmOmYzOmM1OjdkOjg5OjkwOjgxOmQ4OjY5OjQ4OgorICAgICAgICAgICAgICAgICAgICAyMDoxMDphMzpmODplZjo5Mjo1MToxODozMjo4YjoxMToxODpjMDozZjoxYjoKKyAgICAgICAgICAgICAgICAgICAgODU6NTY6Y2U6NTc6Yzk6ZjI6ODI6NjQ6YzY6ZGY6MDI6MDk6MmU6NGE6MTE6CisgICAgICAgICAgICAgICAgICAgIDJmOmIxOjI3OjZkOjM3OjUyOmYwOmYwOjE2OjYxOmYxOjY3OjhkOmRmOjg3OgorICAgICAgICAgICAgICAgICAgICA3MjphZjo4NzpkYTpjZjpmYjo1MDo5NDo2ZTpkNDo5NDo4NTplYjo4YToyYzoKKyAgICAgICAgICAgICAgICAgICAgZWE6MjE6ZjU6OTY6NGE6NDQ6ZDU6ZTA6Y2U6NmE6NzQ6NDQ6NGQ6ZDA6MDU6CisgICAgICAgICAgICAgICAgICAgIGQzOjg3OjE1OmVkOjM2OmQwOmE0OjhiOjY2OjU1OjcwOjkzOmVlOjQ3OjA2OgorICAgICAgICAgICAgICAgICAgICBjMTo3ZToyZTphNToxODo3OTo2NzpmMzoyODo4NTpmMTo3MDpmNzowZTo4MzoKKyAgICAgICAgICAgICAgICAgICAgYTQ6N2U6NTQ6OWU6NWE6NzY6MzI6Y2I6NjU6MWI6Yjg6Y2Q6ZmI6Yzg6Mjg6CisgICAgICAgICAgICAgICAgICAgIDAzOmQyOjU0OjkxOmQxOmE3OmM1Ojg1OjQzOjA4OjE3Ojc2OmE1OmU2OjJmOgorICAgICAgICAgICAgICAgICAgICA2NzowODpkODphMTphMjo4MjoyZDowYzpmODpjMTphZjo2MzpkNDo1MDo3NzoKKyAgICAgICAgICAgICAgICAgICAgNmQ6NmI6NDY6NGE6NDE6ODU6ZDU6OTA6NWY6Nzk6MmQ6YzQ6ZWM6ZDc6MTE6CisgICAgICAgICAgICAgICAgICAgIDg3OjQwOjhhOmUxOjY4OmUyOjY0OmY4OjU1OjMyOmZiOjZmOjkzOjJjOmRhOgorICAgICAgICAgICAgICAgICAgICA3NzpkOToyMTpjMToxNzplNTozNjoyYzo0ZTo3ZTo5MDo3ZjphYzo5NDoyYjoKKyAgICAgICAgICAgICAgICAgICAgMzI6Njc6YmU6Mzg6NTA6NzY6Yjg6YWU6NDE6Yjk6ZDc6MjE6YzU6MDk6NGM6CisgICAgICAgICAgICAgICAgICAgIDYwOmM4OmEzOjUxOmM0OjM0OjliOjU3OjM3OmRmOmNiOmM5OjMzOjU3OjhiOgorICAgICAgICAgICAgICAgICAgICBlYjpmYjo3Njo5ZjoxOTo0ZDpjNTo2YToxZjoyYTo0NTphZToyYjplZDoyZjoKKyAgICAgICAgICAgICAgICAgICAgOGQ6YTc6YTU6MDA6Y2I6MDQ6ZmE6MjU6NjI6MmU6NzQ6NDg6MWI6Y2E6MmE6CisgICAgICAgICAgICAgICAgICAgIDhjOmJhOmRiOmI2OjdlOmY2OmJiOjAyOjdjOmE5OmMzOmRiOjU4Ojc4OmExOgorICAgICAgICAgICAgICAgICAgICBiZjpmMDpmZToxYToxMDo1NToxMTpjZTplODo2OTo0ZTo5Njo2NTpjNjoxNzoKKyAgICAgICAgICAgICAgICAgICAgMDM6ZDY6MDc6Njg6OGM6NTQ6ODI6YWU6MWM6MjI6NTU6M2Y6ZjE6ZjQ6MDk6CisgICAgICAgICAgICAgICAgICAgIDk3OjI4OmMwOjQ2OmY3OjRlOjBiOjI1OjFkOmY3OjA3OmQ3OjA5OjFkOjNhOgorICAgICAgICAgICAgICAgICAgICAxODo1NzozODozYjplODozMzowNjplNzo4Zjo3ODo0NjoxZTo1YjpmNTowNjoKKyAgICAgICAgICAgICAgICAgICAgYjY6ZWM6Yjg6YTY6MGQ6ZjE6YmE6MTM6NGI6ZDY6MTg6MjA6ZGQ6Njk6MzM6CisgICAgICAgICAgICAgICAgICAgIDRhOjMzOjE1OmFlOmI4OmM4Ojk4OjhhOjI3OjJjOjkzOmJjOjJkOmZiOmVlOgorICAgICAgICAgICAgICAgICAgICAzMzpiZjo2NjplNjo0ZDpiYTpiNjo5YjowNjo1NTo2MDo5Nzo0YjpiYzo0NDoKKyAgICAgICAgICAgICAgICAgICAgY2Q6N2U6ZjQ6YTE6ZDg6YWE6MmY6YzA6MDI6Mjg6MjE6MTY6NjI6Nzg6ZGI6CisgICAgICAgICAgICAgICAgICAgIDA4OjU0OmYyOmZjOmY0OjM0OmUzOmM2OjhmOjFjOjQzOjU3OmNlOjkwOjFhOgorICAgICAgICAgICAgICAgICAgICA0YjpkYzoyZTozYjoyODo5MTo4OTozZjo3YTpkYTozNToxZDo4ZToyYzplZToKKyAgICAgICAgICAgICAgICAgICAgNDk6ZWM6ZjQ6MzM6YWQ6Yzk6NTM6YTg6OGM6OWY6MDQ6NTM6M2U6MjQ6MWM6CisgICAgICAgICAgICAgICAgICAgIDUyOmM5OjEyOmY5OjYyOjU3OmEzOmJjOmVlOjJjOmViOjQwOjdjOjIwOjIzOgorICAgICAgICAgICAgICAgICAgICA3MDoyYjo5NTpmOTo3MzoxNzo4YTpkMTpjMToxYzo2OTphNjpiNzozODo5YToKKyAgICAgICAgICAgICAgICAgICAgNjc6Zjc6NzA6MWQ6N2E6NWE6MGM6NDA6Y2Y6NjI6MGY6ODU6M2M6YzI6MDI6CisgICAgICAgICAgICAgICAgICAgIDRlOjdlOmI1OmY2OmM1OjJhOjI5Ojg0OmIzOjFmOjM3OjJhOmUxOmFhOjcyOgorICAgICAgICAgICAgICAgICAgICA0MjpjNDplZDo2YjoxYTo4Zjo5MjoxYzo1ZDpiZTpkMTpmMjo1YjpmMjphYjoKKyAgICAgICAgICAgICAgICAgICAgYWE6YTk6ZDI6ZjU6Yjg6YTQ6NDE6MmI6MmI6OTE6NmU6MTI6NDg6Y2E6OTg6CisgICAgICAgICAgICAgICAgICAgIGQ4OjM3OjhkOmM4OmVkOjAwOjMwOmI1OmI2OjA0OjRlOjdlOjljOmRhOjg0OgorICAgICAgICAgICAgICAgICAgICBlYzpjMDpmYTo3YjplNToxZDo4ODphNDo1Mzo0NjpiMDo5NDplNDo1YzoxYjoKKyAgICAgICAgICAgICAgICAgICAgYTE6MjU6MmM6MGY6NDg6NTI6Nzc6OTc6MDk6NmM6ZWM6NWI6MTg6MzM6ODM6CisgICAgICAgICAgICAgICAgICAgIDAyOmU1OjgyOjdlOmNkOjg1OjIxOjMwOjExOmZkOjI3OjRmOmNmOmU0OjFlOgorICAgICAgICAgICAgICAgICAgICBlYzozZjphNTo1Nzo2YzplOToyYTozMDoxOToyYTo4ODplNTpjMzo2OTozODoKKyAgICAgICAgICAgICAgICAgICAgYWI6NmY6Mzk6NzE6N2Y6ODQ6ZTE6NDE6YzM6ZTE6Y2M6MmE6ODk6MjA6NTI6CisgICAgICAgICAgICAgICAgICAgIDJlOjgzOjBmOjZjOjM5OjNmOjRiOjJkOjE2OmFjOjJkOmYwOjI0OmFjOjAwOgorICAgICAgICAgICAgICAgICAgICA3MzpmNDo5YjpiMzowNjozZjowNTpiODoxNDo4NToxZjphYjo5ZTo1YzozYzoKKyAgICAgICAgICAgICAgICAgICAgOWU6NjI6OWQ6MGU6NmQ6M2I6ODA6MDk6ZmM6MDI6ZWE6YTI6OTc6NzQ6Y2E6CisgICAgICAgICAgICAgICAgICAgIGM3OmY5OmUzOjU2OmUxOmMzOmNhOmE1OmE2OjlhOmMwOjkwOmUwOjI0OjEyOgorICAgICAgICAgICAgICAgICAgICA1MzpkMjpjMjo4YjpkYTpiZTplZDowMjo0Mzo1ZTo2NzplMTo4OTo5ODo3OToKKyAgICAgICAgICAgICAgICAgICAgZWU6Y2I6YWE6Y2E6YzM6MWI6ZGM6ZTc6YTU6NDY6YTU6N2M6NmI6MTY6ODc6CisgICAgICAgICAgICAgICAgICAgIGI2OjVhOjI4OmQ3OmRiOjI3OjNjOjVlOmE1OmJkOmI2OjUxOmRkOjFmOjQzOgorICAgICAgICAgICAgICAgICAgICBjZjozYjoyNjpjODozYTo4ZDoyNTo2MTpjMTo0OTpmNDozYzoxYjpjOTo0NDoKKyAgICAgICAgICAgICAgICAgICAgZWE6YWY6MWM6YzI6MmI6OTQ6MDE6MmE6MGU6MzA6ZDE6NWI6OGI6MmI6NDc6CisgICAgICAgICAgICAgICAgICAgIGU1OmMzOmQxOjA0OjAzOjliOjBlOjM5OjJjOmQ2OjI3OmQ0OmU2OjcwOjVhOgorICAgICAgICAgICAgICAgICAgICBkOTo3NTpjZjoyYTpkODpjOTowMDowNTplNDoxMzo4ODplYzpjMzozOTpmYjoKKyAgICAgICAgICAgICAgICAgICAgODc6NjE6MzA6MzY6NDM6MDM6Yzg6OWU6OWM6YTI6MDY6YzI6MmY6YzU6ZmM6CisgICAgICAgICAgICAgICAgICAgIGYwOjgwOjYzOmIxOjU0OjA0OmEwOjRjOmE5OjJlOmM2OmY1Ojc2OjdhOmQ4OgorICAgICAgICAgICAgICAgICAgICBkMDplNDpkNDo5NDoxMTplNToxNTpiNTo3ODowNjpkYzpiODo4MDo4Zjo5OToKKyAgICAgICAgICAgICAgICAgICAgYTk6MjA6MzM6M2Q6MTA6ODU6NGM6NjU6MDk6Y2E6M2U6NTg6NWU6NjA6OTM6CisgICAgICAgICAgICAgICAgICAgIDlhOmFhOjYyOjVkOmMwOjUxOjA2OjFjOjVkOjYwOmEwOjBkOjljOjRiOjQzOgorICAgICAgICAgICAgICAgICAgICBmNjphNzoxNjoyMTphNDo4NzphYTpmMjpjMToyZTplZTo5MjozMDpiODo5ZToKKyAgICAgICAgICAgICAgICAgICAgZGY6ZGY6MTA6MDE6OGI6ODY6MDk6NzA6ZDg6NmM6YTg6Yjc6NTA6MWU6MTY6CisgICAgICAgICAgICAgICAgICAgIDk2OmI0OmY3OjY3OmZkOjM1OjNhOjIxOjkwOjJhOjMyOmM3OjAwOjdiOjRkOgorICAgICAgICAgICAgICAgICAgICAwNzoxMDowOTpiOToyZjo3MzpkODoxODo3ZTo2Nzo5OTowNDo0ZjowNjpmYzoKKyAgICAgICAgICAgICAgICAgICAgNTA6Yzc6ODU6OWI6OWQ6NDA6OWQ6YjM6OTY6Mzc6ZmE6YTU6ZGM6YjI6NzI6CisgICAgICAgICAgICAgICAgICAgIDRlOmVmOjRlOjA5OjJjOmZkOjkxOmZkOjRkOmY3OmJiOmE2OmExOjNlOmFiOgorICAgICAgICAgICAgICAgICAgICA3YjphMjowMzo0MDphNjphOTo1NToyNzplMjpmYTpmOToxOTpjZTo4Nzo3NToKKyAgICAgICAgICAgICAgICAgICAgYWE6ZjE6NzU6MzY6ZjM6ZjM6Yjg6OTE6Zjg6OTE6YzM6OGI6NzU6MTM6OGU6CisgICAgICAgICAgICAgICAgICAgIDRjOjY1OjlhOjE2OjM5OjZhOmU1OjM0OmU4OjdhOjk2OjU5OjdmOjM1OmIwOgorICAgICAgICAgICAgICAgICAgICAwMDpmZDo1Yjo2OTpmYzo0MzoyNjpmYTpmNToyODo2ZTpmZTo4NzpkOTo3ZToKKyAgICAgICAgICAgICAgICAgICAgMjQ6ZmI6YjQ6YTA6ODI6NmU6NTQ6YTI6ZmY6YWU6YmY6NjI6YjQ6ZjQ6NzI6CisgICAgICAgICAgICAgICAgICAgIDAxOmMyOmNiOjk4OjQ3Ojk4OmUxOjRjOmI1OjE3OjgwOjgwOmNlOjhmOmE2OgorICAgICAgICAgICAgICAgICAgICAyODplZToxZTo0NTo2YTpmYjpkZjpmMToxZDpmYzo1YTozYjpkNjplYTpmNDoKKyAgICAgICAgICAgICAgICAgICAgNmM6MWQ6NjI6NDk6NTc6M2I6OGE6OGY6ODY6ZWE6ZjA6NTM6MDQ6Y2U6OWM6CisgICAgICAgICAgICAgICAgICAgIDE2OjY4OmZmOmJhOmI5OmZjOjg4OjBmOjQ3OmY3OjAyOjQ0OjcyOjQwOmI4OgorICAgICAgICAgICAgICAgICAgICBjYTozYjoyZDo1Mzo5ZDpkYzozYzo1Njo4Yzo1OTo3Yjo2ODoxYToyYzo4ZDoKKyAgICAgICAgICAgICAgICAgICAgNzE6YmI6NmM6MDA6Yzc6MWE6Y2U6NmY6NDA6OTI6YjE6YTM6MmY6MGY6ZDk6CisgICAgICAgICAgICAgICAgICAgIDQ0OmYyOmEzOjcwOjJlOjllOmVlOjBlOmFlOjMyOmQwOjNiOjNlOjhiOjA3OgorICAgICAgICAgICAgICAgICAgICBlYTplNjo3OTpiMzo1YzoyOTplMjo3ZDo2YjphODo1ZTpmOTo1YTozMTplODoKKyAgICAgICAgICAgICAgICAgICAgMDg6OTY6YTI6OGM6MDM6OTg6NDY6ZjE6Yjg6N2Q6OTA6NTQ6MjY6ZWQ6NzY6CisgICAgICAgICAgICAgICAgICAgIDYyOmZlOjllOmU5OjlhOjZlOjVlOmM5OjQ5OmM3OjVjOjM0OjUzOjI5OjU0OgorICAgICAgICAgICAgICAgICAgICBkOTplYzplNDo0NjplMTo4MDozYjo3NTpkOTpkZjpmYjo3OTpkNTo4NzpmMToKKyAgICAgICAgICAgICAgICAgICAgYmE6OWU6ZWI6MTk6Y2U6NGM6NTI6NzM6ZTY6NWI6ODc6YWU6MjU6NGY6Mzk6CisgICAgICAgICAgICAgICAgICAgIDc5OmNjOmM2OmI4OmY5OjEwOjdiOmVjOmYwOjliOjcxOmE0OjA1OmEwOmQzOgorICAgICAgICAgICAgICAgICAgICAyOTpkMzo0ZTo3ZjoxZjpmNDoyZDoyODo3ODpjYzo1NTo5NTo3YjoxZTo5MToKKyAgICAgICAgICAgICAgICAgICAgMmY6Y2M6NTY6MTg6NzM6OGI6YjI6ZGI6YmM6Njk6MDc6ZTY6ZDA6ZDg6NGY6CisgICAgICAgICAgICAgICAgICAgIGVkOmEyOmZmOjU4Ojg1OmEzOjZkOmUwOjRhOjUzOmI3OjY3OjdkOjhkOjBjOgorICAgICAgICAgICAgICAgICAgICA1Yzo1Yjo3Yjo3NzoyODowMjozNTo0NDo3YTowNDpkMzoyODo0MzpjODo2YjoKKyAgICAgICAgICAgICAgICAgICAgMzA6MTc6NWQ6MzI6Yjg6Mjk6MzU6YmE6NzY6ZGE6M2I6MTQ6NGE6NzY6MTg6CisgICAgICAgICAgICAgICAgICAgIDU4OmE0OmY4OjkyOjNjOjllOjRkOjMzOjZmOjQ2OjZiOjA4OmQ5OjMxOjQ4OgorICAgICAgICAgICAgICAgICAgICA2ODpkZDpmNDpmYjoyNDo1NjozNDpiMjpjZjo2OTo2NjpiZTo0ODpkMjo4YToKKyAgICAgICAgICAgICAgICAgICAgNjY6MjI6Y2Q6ZjI6Njk6Y2Q6YzI6NTM6MTM6NDU6Mjk6NDE6MjI6ZDY6NWQ6CisgICAgICAgICAgICAgICAgICAgIDk4OjFmOmI2OmE0OmIyOmEzOmMyOmVlOjAyOjJmOjUxOjFiOmRjOjgzOmE0OgorICAgICAgICAgICAgICAgICAgICBlYzo3MDoyNTphODpkNDowODo2MTozMjo2ZjplNDphMTo4MToyZTo3Yzo2MzoKKyAgICAgICAgICAgICAgICAgICAgNzI6ZmE6Mjk6NjU6YmM6NzA6NDQ6Y2Y6NWQKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDU1OjlhOjM0OjZhOjIyOjA2OjY5OjA5OjQ1OjMzOmM3OmFlOmE5OjVjOmM3OjA5OjRlOjliOgorICAgICAgICA4NjpiYzo0MTo5MDpkNDo5NDo1MjpmNjpjZDoyMzoyOTo5NDo0YjoyMjpjZDplODpiZDpmZToKKyAgICAgICAgOWQ6Y2Q6NTI6ZjI6YmQ6ZWQ6YWI6ODc6Yzk6YWI6YWI6NDY6MDQ6YjQ6YmQ6YTI6M2Y6MjI6CisgICAgICAgIDMwOjQ3OjUwOmMwOjRiOjhjOjc2OjBmOjAzOmY1OjkyOmQyOmIxOjJkOmM0OjdhOjM1OjljOgorICAgICAgICBjOTo3Mzo4NzplYjphNjo5ZjpkZTowZjo3Mzo4ZDpkMzo3Zjo5OTpkODpiYTo4Zjo2ZjpjNDoKKyAgICAgICAgZjM6YmU6MWE6YWU6OGI6YTI6OTQ6MzY6OTA6ZTI6ZTU6ZWI6OGQ6MDU6ZjQ6ZmM6NjU6ZGY6CisgICAgICAgIDk1OmYxOmM0Ojk0OjRkOjE3OjU2OmQ3OjlmOjNjOjhmOjUwOjNjOmU3Ojc3OmJmOjk1Ojg2OgorICAgICAgICAyNjo2NDpmYjo2YTpmZjpjNjpkYTplOTo4YzphZTo0MjpiYjo2OTplNTozMzpjNjpkODplOToKKyAgICAgICAgMGQ6YzY6NTU6MjE6NDk6YzE6MGM6YjQ6YTM6Zjk6OWI6NGI6NWM6ZGU6ODM6NGY6NDE6MDM6CisgICAgICAgIGNlOjJhOjc5OjY4OjM4OjdkOmYwOjU0OjQ5OjIwOmY1OmI2OjEwOmZmOjA4OmRjOjMzOjY2OgorICAgICAgICA5Njo5YjpmZjowNjpkZTowMDo5ZTpkNzpjZTo1Njo0Mzo5YTo1MTpmYzo3MDpjZDpmNjpmMDoKKyAgICAgICAgNTE6YTM6Yjc6Y2Q6YjQ6NWM6ODU6NjI6Y2Q6NzE6Yjc6YzY6MmI6MjM6MmI6ZGQ6YzM6NmU6CisgICAgICAgIDQwOjQyOmZhOjM3OmZmOjM3OjFjOmY2OjdhOjU3Ojk0Ojg3Ojg1OjIzOmQ3OmQ0OmM5OmM3OgorICAgICAgICA1ZjpjMTo0ZDoyZjpjOTowZDpkNzo1YzplYzo5YzoyNTplZTo5ZTozMDo4Mjo5MTo5Njo3MjoKKyAgICAgICAgYjg6NzU6MWQ6Zjg6MDk6Njg6NTc6OTc6YjI6MmQ6NGI6ZWU6MjU6ZWM6N2E6MjQ6Mjk6ZWU6CisgICAgICAgIDcyOmQ0OjljOjEzOmRiOmFiOmRjOjAzOjBhOmQ4OjRhOjE0OmM5OjA4OjU3OjQ0OjVkOmExOgorICAgICAgICBiNTo1Mzo4MDozNDpmMjoxNDo5NzpjZjo1MjpkZTphMjowZTo4YToxMDplOToxNDplZjpkMDoKKyAgICAgICAgNjA6YmU6NjE6YTE6ZjE6MjU6NWQ6ZDU6MTg6NzM6M2Y6OTM6MTA6Y2E6OTY6ZWU6YjM6NDA6CisgICAgICAgIGQyOmRiOmEzOjU1OmNmOjU3OjVhOmE1OjBlOjRmOjc1OjQ3OmRmOmVhOmY3OjkwOjlhOjZkOgorICAgICAgICBmNTo3MDoyZToxZDoxNDoxYzozNzo2NDowNDo1OTo1MDpiMDpkYzo3Mjo4Njo2Zjo5YzozNzoKKyAgICAgICAgM2Q6NWQ6Mjg6YWY6NzM6NTU6ZWY6ZDI6ZWU6MjQ6NzQ6NzQ6MTM6ZWY6ZGM6ZGI6MzE6NDk6CisgICAgICAgIGZiOjNmOjYzOmY1OmQzOjA4OjNlOjMzOmE1OmU3OjlkOjBhOmRlOjUzOjJjOjUxOjhlOjY3OgorICAgICAgICBkYjo5Yjo0MTo2NTo0MTo1MDpiZDpkNDphNDo5Njo2Yzo4NzpiYzoxMjplMDo5NDpjNzpkMzoKKyAgICAgICAgYzA6ZTQ6Y2I6NzM6NTg6MDA6ODM6ZTE6YWM6Mjc6ODU6ZDY6OWQ6NTM6OWQ6NWM6YmQ6MGE6CisgICAgICAgIDNlOjAzOjQzOjljOjBjOjkxOmY1OjZkOjdiOmY4OjQwOjcyOjc1OmFiOjExOjc2OjkxOjJiOgorICAgICAgICBlMTpjNjphYToxZjo3MDo2OTo3Njo3MDoxNTowOTpmZTo5MzpkMDpkNjoyZDpiNzoxNTo2YToKKyAgICAgICAgOWI6Njc6NWM6YjQ6Njk6OWY6MjU6YTY6N2Q6OGE6ZmI6N2Q6MjI6YTk6NzE6ZjI6Y2U6NGU6CisgICAgICAgIDhjOmI4OjIxOjJkOmRlOmZlOjQxOjcxOjBkOmZmOjlkOmVjOjczOmE2OmJiOjA3OjRmOjg4OgorICAgICAgICAwZTo1ODo0NzoyZTo3ZTphOTpjMjpjNzo3ODpkZDpiYTo3YTo5ZTo0ZTplMDozMDo0ZTo2MzoKKyAgICAgICAgNmY6ODU6ZDQ6MjA6NDE6ZTk6ZmE6ZmU6NDM6NDU6ZTc6ZmI6YWY6N2E6YjI6Y2U6YTQ6MDU6CisgICAgICAgIDFkOjIyOjlhOjU4Ojg2OmRmOmU0OmNlOjRjOmE5OmZlOmQ4OjE2OmE1OjZmOmZiOmQ4OmNlOgorICAgICAgICA1Njo3YjpmNTpkNjoyMDplZjplNDo0NzpjZDo2MzoyNDpmZjpiOTpiZTpmMTo0ODphMzpjMToKKyAgICAgICAgMDE6NzI6ZTY6YmQ6YzA6YWQ6ZWQ6MjY6MGQ6Y2E6MzQ6OWY6ZmM6MDI6MmQ6MjA6NGY6MDU6CisgICAgICAgIDIwOmFlOjIxOjNkOjBjOmMyOjIwOjNjOjNmOmYwOjA0Ojg0OmRjOmNmOjg5OmZkOmI5OjI1OgorICAgICAgICA5MTo4ZTpkMDo0MzplNjpiMzoyMDphYjo1YzoyZDpkNTo0MDo5ZTphMDo0YjpkODpmNDpiMjoKKyAgICAgICAgY2M6N2Q6ZjE6NTg6MGE6OGU6ODc6ZWQ6ODg6YWM6MzY6OTY6ZTQ6NTY6YTA6MTE6OGE6ZjI6CisgICAgICAgIDlhOmQwOmIzOjU3OmEzOjM0OmJiOjE5OmFiOjM4OmUxOjc0OjZiOjIyOmM0OjMxOmNlOjAxOgorICAgICAgICBkNToxYjozNjplMzoxZTozODo0YzozMzo5MzpkZjo0MDplMzo1OTo1Nzo0ZTphYzo2ZTo3YjoKKyAgICAgICAgMWU6NWE6M2Q6YzU6MWQ6NWI6YWM6Yzg6MTA6ODI6MzU6MDI6MjI6YjI6ZmM6NzU6ZTg6MTA6CisgICAgICAgIDkxOjhkOmM0OjdkOjc4OjkzOjQ3OjllOjFjOjlkOmFjOjZiOjYyOjAyOjU4OjhjOmQ2OjFjOgorICAgICAgICAyMzpkNjphZjo3ODpjMjo4MDo5YzphNDphYToyNDo1NDoxNDpiNToxNDo5ODpjNjpmODoyYjoKKyAgICAgICAgMWE6MjQ6Y2I6NzE6MzI6MGE6ZTI6OWI6MGU6Njk6NmI6ZGQ6N2U6OGM6NjQ6ZDE6MmU6NjM6CisgICAgICAgIGVmOjBlOjdmOmIxOjNlOjg4OjRjOjlkOjU1OmU1OmM5OjZlOjE3OjA0OmI3OjQxOmZmOmJkOgorICAgICAgICA4YTo0MTpjYjoyNTozMTo2Zjo0NDo3NzozZjo0NzpiMTpmYzo4MTo4ODowNzo4ZTowNTo0OToKKyAgICAgICAgMjA6Yjc6MTE6ZDk6Njk6MDM6MmE6MDM6OWQ6Yjk6MzM6ODQ6OWE6ZGY6ZGY6N2E6ZTM6NDY6CisgICAgICAgIDczOmEzOmQ4OmEyOjhjOjUzOjE5Ojg4OjU1OjRjOjc0OmI4OmY2OjQ0Ojg0OjJiOmQxOjE0OgorICAgICAgICAyZDo0ZTozOToyZTo5Mjo2ODpmZjo2OTpmYzo4NTo2MjoxYjplYjo1NTo0ZjplZjoyNTo4NDoKKyAgICAgICAgNjI6NDU6OTk6ZDY6ZDg6NGU6NmY6M2Y6NTM6MDg6N2Q6MWQ6MDY6OTU6ODE6ODA6N2Y6NGY6CisgICAgICAgIDRlOjc0OjM2Ojk4OmI1OmUyOjg3OjcwOjk4OmRjOmQ3OmY1OmRjOjUyOjE1OmU2OmM2OmQ2OgorICAgICAgICA3OTo5NjozOTo3Zjo4Zjo5NTpjZjphYjo4MDo1MzphZDoxYjowYjo0NTo0MDowZTpkNDoxODoKKyAgICAgICAgYmQ6MmM6ZGU6OGE6Nzc6NzY6ZmQ6ZjI6NDQ6NDc6YzY6MjE6ZDA6ZTQ6NzQ6ZjA6ZDg6MTg6CisgICAgICAgIDA1OmM4OjdjOjMwOjcyOmM3OmRmOmYxOmJiOmZjOjAyOjMwOmE5OmY0OjQyOjI2OjU5OjBkOgorICAgICAgICA5MzowNTo4MjphMTo3MzplZDozNDplNTozODo1ZDpjZDo1MDo5MDpmZTo5NDpmYzoxMzpiYzoKKyAgICAgICAgYmQ6ZmM6YTg6YTI6ODg6YTc6NzM6YzQ6YjI6YTg6ZDE6NWQ6ODg6YzQ6MDI6YTI6N2E6ZjE6CisgICAgICAgIDA0OmM5OmZlOjhjOjc0OmM5OmVmOjFkOjY0OjQxOjlmOmFjOjFlOjk2OjY3OjY0OmFjOmFiOgorICAgICAgICAyODo0MTpjNzo5ZDpmNzpjMDo5ODoxYjo2ZTowNzpjMjo2NDo3ZDo1YTo4Mzo2Njo1NjoyODoKKyAgICAgICAgMzY6OWM6ZTc6ZmI6MWM6Nzc6MGU6Mjg6YTA6YzQ6Zjc6NmI6Nzk6Mzk6MDQ6MjA6ODQ6Yzc6CisgICAgICAgIDU3OjkzOmJjOjFiOmEwOmVhOmJjOmViOjQyOmU1OmE4OjExOmZlOmZjOmFjOjY1OmNjOmZkOgorICAgICAgICBmODoyODo4ODpmNDphNTo5YTplNTo3Mzo1MTplMDphODo5YjowZDowMzo3Nzo0ZTplNTplMDoKKyAgICAgICAgOTg6YjM6ODg6ZGE6N2Q6ZTY6YzY6OWU6N2M6MTQ6NjY6YzE6MmU6NTM6NGE6OTI6MDc6Mzc6CisgICAgICAgIGEwOjdlOmU5OjNkOjA5OmU0OjE1OjdjOmNmOmZkOmI4OjQxOmE1OmVmOjllOjY2OjlkOmM0OgorICAgICAgICA1ZTowNzoxZDo4NzpmODo0MTphZDplYTplNzoyZjpkMjo0MTo2MzoxODozNzpmOToxNDplMzoKKyAgICAgICAgNGQ6ZDA6ZTU6Zjc6NDM6ZmQ6MTU6ZTM6Zjk6MzY6NzM6MDY6MjY6ZGY6MDE6NGY6YTk6YzM6CisgICAgICAgIDRlOmRlOjIwOjQ2Ojc3Ojk4OmI0OjdhOjI0OjJiOjNiOjc1OjJiOjRlOjU4OjhkOjliOjVkOgorICAgICAgICBhNDpjNzoxNjphMDpiYzozMjo4ODozZjphMTo4MzpmMzowMDpjODpmODpkODo1ODplOTo2MzoKKyAgICAgICAgNWQ6NGM6MmI6YjU6ZjA6NzI6NDE6ZDg6YWI6Nzc6Mzc6ZDY6NzI6NzQ6YWU6YjY6MzY6OWM6CisgICAgICAgIGM4OmE2OjgzOjQ5OjRiOmUwOmM5OjU2OjBiOjI5OmJlOjAwOjMwOmNiOmRkOmQ2OmM4OjQyOgorICAgICAgICA4YTowMDpkOTplYzoxNTpkMTozNDo3MTpmMjo1Yjo2NDo4NzpmNjoyNzpkMjpiNzplYjo4NjoKKyAgICAgICAgYjA6OTA6YmY6Mjk6ZGI6MjE6OWU6MzY6OGM6ZTM6MjA6MmY6OTU6MjM6NTE6NmM6MWI6YzI6CisgICAgICAgIGE0OmQ1OmU2OmQ4OjAyOjQzOjY3OmEwOmZlOjliOjUwOjAzOjQ0OjdmOmJiOmU0OjcyOmQ1OgorICAgICAgICBkMTplNDpkYTo4Zjo5MjoxNDo2NDpmYjo1ZDoxNDoxMDoxMjo0YTo5NTowNjpjOTo2NTowODoKKyAgICAgICAgMjk6Y2E6MjE6YTM6MjY6Mzg6MTE6Yzk6Mjc6ZGY6NzA6Njc6MDQ6ZmQ6Y2E6NDg6MzI6N2Y6CisgICAgICAgIDYzOmIyOjQ1Ojc0OjMxOjUwOjRmOjg3OmQ5OjIwOjcwOmQyOjIxOjcwOmIxOmQ2OjEwOjlkOgorICAgICAgICAzMzo1ZDo3ODo4Mzo5MTo2ZDo1NTo4MjplYzpkYTplNDo2Mjo2MzpjNzo4MTo0NjpkNzoxOToKKyAgICAgICAgNjU6NzI6MmE6NDM6MTk6OTA6Yjg6ZDc6MjM6NGQ6NGM6MWM6ZTA6NDQ6YTk6NjY6Njc6YWM6CisgICAgICAgIGVlOjcxOjc5OjI3OjI2Ojc4OjZkOjcyOjBlOmY1OjVkOjRiOjIzOmI1OjdjOjdjOjY1OmU5OgorICAgICAgICAxNzpjNjozYTowYjowZDpkZDo1ZToxZTo1MTpjMzo4NjpiODplYzo3ZjpjNzoyNzo0YTphNToKKyAgICAgICAgNDY6ZTg6NmE6MmQ6MTk6YzE6ODc6YTM6Y2I6OTk6OTM6ODc6NjQ6YTI6NTU6MTQ6NGM6Yjc6CisgICAgICAgIDQzOmE1OjkzOmQ3OmU3OmQyOjRlOjc5OjQwOmNhOjY1Ojk5OjQ2OjNkOjNmOjdhOjgwOjdhOgorICAgICAgICA4ODo2YTpjYzoxZTplNTo2YjozMzo0NjpmNDo1MDpjMDpkNToxZjowOTpiODpjZDo4YToyZToKKyAgICAgICAgYTE6Mjc6ZWI6NWQ6NzM6YTc6ZTg6NmI6MGE6ZTU6NTc6ODI6MmE6YjA6ZmM6ZTI6NTQ6NTI6CisgICAgICAgIDU2OmYwOmFiOmE5OjEyOmM2OjIzOjk2OjA3OjI0OjljOmUwOmJjOjQ2OmE1OmI0OjIwOjA0OgorICAgICAgICBkYTowOTo5Mzo2MzplNTpkNDoyZTpjMjo3ZTpjNTozMTplZDpiNToxNTo3NDo4NjoxNzpiOToKKyAgICAgICAgYjM6ZjM6MjY6OGE6MWQ6MDI6NmE6ZGE6MWE6M2Y6ZTg6YmE6ZjE6MDQ6NmQ6OTQ6NTE6NTQ6CisgICAgICAgIGUyOjVhOmI0OjU5OjgzOjFkOjYwOmQwOjJkOjczOmNjOjA3OmI1OjI2OjhjOmY5OmQ3OmM2OgorICAgICAgICA4ODo5MTplZjo4MDpjZjo1ZDowZjphMTo2MDpjYjo0NTpkNDo0MjoyMjpkMTpiMTo3MDoxZDoKKyAgICAgICAgZmQ6ZDA6Yjc6MzA6OTA6M2E6YzY6NDg6NmQ6Njc6ZTU6MzI6ZGE6OGY6ZGI6ZTM6YTg6ZTM6CisgICAgICAgIDFkOjIwOjI1OmEyOjFjOmUxOjRjOmI5OmE0OmY2OmM2OjNmOjVjOjU4OjBkOmJiOmM2OmIyOgorICAgICAgICA3NzowMToxNjo5MTo5ZjoxNzowNjowZDpiNzo0MDozZTpjYzo4Zjo4ZTo5Yzo0YjplMDo5ZDoKKyAgICAgICAgN2U6OWI6MWU6MDU6YWI6ODg6MjI6ZmE6ZDM6Mjg6MWI6NTc6MTQ6NjQ6NGE6M2U6MjQ6MmM6CisgICAgICAgIDM4OjRkOjIxOjY5OjAwOjczOjJlOmQwOjU1OjJkOjc0OmYyOjE1OmU4Ojk0OjQzOjNlOjQwOgorICAgICAgICAyYTpjNjpjNjpiOTo2YTo1YjpkZTphMjpjYzoxODo1MDo1NDo1ZDo0ZToyYTo4NTo2YzpmNjoKKyAgICAgICAgOTI6OGI6Mjk6MTk6N2U6ZTc6ZWE6NGE6ZTA6MjI6MmI6MjU6YmM6Zjc6NjY6Y2Y6Nzc6OWE6CisgICAgICAgIDQxOjc0OmYyOjNjOjE0OjBkOjc0OjY5OmY1OjUwOjgzOmNkOmNkOjJmOjIxOmRiOjIyOjQ2OgorICAgICAgICA4YTpkMDpmNzo1MToxYTo5NTo1NzpmMjowNTo4YjoxYToxOTplZDozYjo0NTplODozNjpjMjoKKyAgICAgICAgNmU6N2U6ZmI6NTc6MjI6MDA6MWY6MDY6NTM6YTk6YWU6OTM6YzY6OGY6NzE6MmE6MzE6NDU6CisgICAgICAgIDkyOmU3OjhlOjZkOmU2Ojk5OjIyOmMwOjgzOmZjOmVmOmRjOjU3OjY2Ojc3OjRmOmEyOjM2OgorICAgICAgICAzMTpmYjphMToxMzo4ZDplNTpjYTphMzo5NTo3ZDowMTowYzo2NDo3MDozYjo1Mzo0Mjo2ODoKKyAgICAgICAgODA6Yzc6YmI6OWQ6YTg6MDA6MzU6Njk6OTg6MGM6YTg6Njc6ZDg6NDM6ZTU6YWE6Y2Y6OTU6CisgICAgICAgIGUwOjUxOjk1OmE0OjE3OjNmOjQyOjlkOmI4OjA0OmNlOmQzOjc5Ojc5OmM4OmQzOjhhOjE2OgorICAgICAgICAzMjo5MjplMDpkNzphMjplZTpkNzozNzo0YzoyZjphYzpiODo3YjpiZTo0NTpmNjpmMToxODoKKyAgICAgICAgMzM6OWM6N2I6Mzc6YTY6MjQ6ZDk6YmM6NDA6YWI6MDA6ZTk6YzM6Mzc6OGI6YWI6ZDg6YjY6CisgICAgICAgIGYzOjVlOjgxOjRlOmIwOjE0OjZiOjA3OjNlOjFmOmVjOmMyOmY2OjQ0OjIyOjk1OmJiOmIzOgorICAgICAgICBlNjo2ZjpkNjpmOTo3MDo2NTpiYTowYTo4Mzo2NTphYTowZToxMzoyZjo4MzoxMzoyMzo1MzoKKyAgICAgICAgOGI6NDA6MTY6ZmE6Y2U6MmY6ZmM6NGQ6MDQ6Zjg6ZWI6ZDg6YWM6YzU6MzY6YzI6MTU6NTc6CisgICAgICAgIDQ4OjM4OmVjOjU1OmIzOmI0OjFlOmJhOmFkOmQyOjQyOjA2OjE3OjBkOjczOmM4OjU3OmE2OgorICAgICAgICBiZTo5Njo0ZDphOTpmMjpjMDpmYjo3YToyMToxYzpmNTpjOTo3MDphOTo4Mjo5MDpiNTpmMToKKyAgICAgICAgMGM6ZDQ6Nzk6MTA6YmU6ODE6YTY6ZTk6NWM6NjE6OWM6Nzc6Nzk6OWE6YTQ6YzM6Mzc6MjY6CisgICAgICAgIDU3OjM3OmM5OjUyOjJjOmZhOjA4OmZmOmQwOjVmOmM2OjYxOmMwOmY0Ojc2OmJlOmZjOmRlOgorICAgICAgICA0ZTpjZjphYjo1MTo5OTo3MTpjNzpkZjo3ZTpmNDpkNjpjZjowNjo1NjoxOToxMzo1MzowYjoKKyAgICAgICAgNmQ6NzQ6NTk6NDg6MTk6OWI6NTM6MDU6MmQ6OWQ6MzI6NTQ6ZDM6ZTU6MmM6NTM6OGI6NjQ6CisgICAgICAgIDNlOmQ0OjY0OjdiOmUzOjgwOjA5OjE0OmNjOmZlOjE2OjQ2OjYzOjZiOjcxOjY5OmY4OmY5OgorICAgICAgICBjYjoyNzpmNjo4ODo1NDpiYzo0NTpiMzpjZTowMjpjODo5NDplZTo0MDo1YjpmOTo0MjowMjoKKyAgICAgICAgYzI6ZmY6YjA6ZDg6MmM6ZWI6Mjg6N2Y6NWU6Yzk6MjY6MDE6OTk6YTcKKworVVBTIERvY3VtZW50IEV4Y2hhbmdlIGJ5IERTVAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiA3ODpBNTpGQjoxMDo0QjpFNDo2MzoyRTpEMjo2QjpGQjpGMjpCNjpDMjo0Qjo4RQorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUQrRENDQXVBQ0VRRFFIa0NMQUFBQ2ZBQUFBQWNBQUFBQk1BMEdDU3FHU0liM0RRRUJCUVVBTUlHNU1Rc3cKK0NRWURWUVFHRXdKMWN6RU5NQXNHQTFVRUNCTUVWWFJoYURFWE1CVUdBMVVFQnhNT1UyRnNkQ0JNWVd0bElFTnAKK2RIa3hKREFpQmdOVkJBb1RHMFJwWjJsMFlXd2dVMmxuYm1GMGRYSmxJRlJ5ZFhOMElFTnZMakVlTUJ3R0ExVUUKK0N4TVZWVzVwZEdWa0lGQmhjbU5sYkNCVFpYSjJhV05sTVJrd0Z3WURWUVFERXhCRVUxUWdLRlZRVXlrZ1VtOXYKK2RFTkJNU0V3SHdZSktvWklodmNOQVFrQkZoSmpZVUJrYVdkemFXZDBjblZ6ZEM1amIyMHdIaGNOT1RneE1qRXcKK01EQXlOVFEyV2hjTk1EZ3hNakEzTURBeU5UUTJXakNCdVRFTE1Ba0dBMVVFQmhNQ2RYTXhEVEFMQmdOVkJBZ1QKK0JGVjBZV2d4RnpBVkJnTlZCQWNURGxOaGJIUWdUR0ZyWlNCRGFYUjVNU1F3SWdZRFZRUUtFeHRFYVdkcGRHRnMKK0lGTnBaMjVoZEhWeVpTQlVjblZ6ZENCRGJ5NHhIakFjQmdOVkJBc1RGVlZ1YVhSbFpDQlFZWEpqWld3Z1UyVnkKK2RtbGpaVEVaTUJjR0ExVUVBeE1RUkZOVUlDaFZVRk1wSUZKdmIzUkRRVEVoTUI4R0NTcUdTSWIzRFFFSkFSWVMKK1kyRkFaR2xuYzJsbmRISjFjM1F1WTI5dE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0MKK0FRRUE3eGZzcnlubTJTc253TnQ3Sko5bTlBU2p3cTBLeXJETmhDdXFOL09Bb1dEdlFvL2xYWGRmVjBKVTNTdmIKK1liSnhYcE43YjEvckpDdm5wUExyOFhPekM0MzFXZGN5MzZ5UWprNHh1aVZOdGd5bThlV3ZET0hsYjFJREZjSGYKK3ZuNUtwcVlZUm5BLzc2ZE5xTnoxZE5saGVrQThvWlFvNnNLVWlNczNGUVVaUEpWaXVod3QreWlNMGNpZWtqeGIKK0VWUTdlTmxITzVzdFN1WStlMnZmOVBZRnp5ajJ1cGcyQUo0OE40VUtuTjYzcElYRlkvMjNZaFJ0Rng3TWlvQ0YKK1FqSVJzQ0hpblhmSmdCWkJudXZsRklsL3Q4TzhUOEdmaDV1VzdHUDIrWkJXRHBXakl3cU1aTnFidXh4M3NFeGQKKzVzam85WDE1TFZja1A4empQU3lZenhLZkZ3SURBUUFCTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFDN09JNEUKK0lpWllEaUZFVnN5OVdYd3BhTXRjRDhpR1ZEK0JlS2V0ajh4Rzl4eFV1SGt0VzNJRmF1Z2gwT3dkSGY2a05GRysKKzd1M096SndXYU9KZGRYTUlRekdSYWhBckVNSkxhZmpKclppby9ianY5cXZ3WHlIdnk0VnJDZTB2U0dhMVlITEEKKzZLREhtTnNPOXh0empUUUlDbnZGZDJLcU1DT2JzQjZMZ0poVTNBV0hzNmxpV2Z5THR4V2FyRVRzenpVYTl3OHUKK1haSkxBY2g3N3FBMzdlUWRnZzJaUVVNWHJkVFZ5dVA1ZlJlaUFkQXdEMEM1M0xrRWdtbUR0dmtQK2dhUzk2ajAKKzFoY2M4RjUveENuSTV1SGkvelpvSVZHdS82bTZoSkt0aW5zejJKRFN3WGx0TXpNNWRLd2JPSEdmTEFlUTZoM2cKKzA0bGZ5KzhValNkVXBiMUcKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDEgKDB4MCkKKyAgICAgICAgU2VyaWFsIE51bWJlcjoKKyAgICAgICAgICAgIGQwOjFlOjQwOjhiOjAwOjAwOjAyOjdjOjAwOjAwOjAwOjA3OjAwOjAwOjAwOjAxCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9dXMsIFNUPVV0YWgsIEw9U2FsdCBMYWtlIENpdHksIE89RGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uLCBPVT1Vbml0ZWQgUGFyY2VsIFNlcnZpY2UsIENOPURTVCAoVVBTKSBSb290Q0EvRW1haWw9Y2FAZGlnc2lndHJ1c3QuY29tCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBEZWMgMTAgMDA6MjU6NDYgMTk5OCBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IERlYyAgNyAwMDoyNTo0NiAyMDA4IEdNVAorICAgICAgICBTdWJqZWN0OiBDPXVzLCBTVD1VdGFoLCBMPVNhbHQgTGFrZSBDaXR5LCBPPURpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLiwgT1U9VW5pdGVkIFBhcmNlbCBTZXJ2aWNlLCBDTj1EU1QgKFVQUykgUm9vdENBL0VtYWlsPWNhQGRpZ3NpZ3RydXN0LmNvbQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDIwNDggYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDIwNDggYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6ZWY6MTc6ZWM6YWY6Mjk6ZTY6ZDk6MmI6Mjc6YzA6ZGI6N2I6MjQ6OWY6CisgICAgICAgICAgICAgICAgICAgIDY2OmY0OjA0OmEzOmMyOmFkOjBhOmNhOmIwOmNkOjg0OjJiOmFhOjM3OmYzOgorICAgICAgICAgICAgICAgICAgICA4MDphMTo2MDplZjo0Mjo4ZjplNTo1ZDo3Nzo1Zjo1Nzo0Mjo1NDpkZDoyYjoKKyAgICAgICAgICAgICAgICAgICAgZGI6NjE6YjI6NzE6NWU6OTM6N2I6NmY6NWY6ZWI6MjQ6MmI6ZTc6YTQ6ZjI6CisgICAgICAgICAgICAgICAgICAgIGViOmYxOjczOmIzOjBiOjhkOmY1OjU5OmQ3OjMyOmRmOmFjOjkwOjhlOjRlOgorICAgICAgICAgICAgICAgICAgICAzMTpiYToyNTo0ZDpiNjowYzphNjpmMTplNTphZjowYzplMTplNTo2Zjo1MjoKKyAgICAgICAgICAgICAgICAgICAgMDM6MTU6YzE6ZGY6YmU6N2U6NGE6YTY6YTY6MTg6NDY6NzA6M2Y6ZWY6YTc6CisgICAgICAgICAgICAgICAgICAgIDRkOmE4OmRjOmY1Ojc0OmQ5OjYxOjdhOjQwOjNjOmExOjk0OjI4OmVhOmMyOgorICAgICAgICAgICAgICAgICAgICA5NDo4ODpjYjozNzoxNTowNToxOTozYzo5NTo2MjpiYToxYzoyZDpmYjoyODoKKyAgICAgICAgICAgICAgICAgICAgOGM6ZDE6Yzg6OWU6OTI6M2M6NWI6MTE6NTQ6M2I6Nzg6ZDk6NDc6M2I6OWI6CisgICAgICAgICAgICAgICAgICAgIDJkOjRhOmU2OjNlOjdiOjZiOmRmOmY0OmY2OjA1OmNmOjI4OmY2OmJhOjk4OgorICAgICAgICAgICAgICAgICAgICAzNjowMDo5ZTozYzozNzo4NTowYTo5YzpkZTpiNzphNDo4NTpjNTo2MzpmZDoKKyAgICAgICAgICAgICAgICAgICAgYjc6NjI6MTQ6NmQ6MTc6MWU6Y2M6OGE6ODA6ODU6NDI6MzI6MTE6YjA6MjE6CisgICAgICAgICAgICAgICAgICAgIGUyOjlkOjc3OmM5OjgwOjE2OjQxOjllOmViOmU1OjE0Ojg5OjdmOmI3OmMzOgorICAgICAgICAgICAgICAgICAgICBiYzo0ZjpjMTo5Zjo4Nzo5Yjo5NjplYzo2MzpmNjpmOTo5MDo1NjowZTo5NToKKyAgICAgICAgICAgICAgICAgICAgYTM6MjM6MGE6OGM6NjQ6ZGE6OWI6YmI6MWM6Nzc6YjA6NGM6NWQ6ZTY6Yzg6CisgICAgICAgICAgICAgICAgICAgIGU4OmY1OjdkOjc5OjJkOjU3OjI0OjNmOmNjOmUzOjNkOjJjOjk4OmNmOjEyOgorICAgICAgICAgICAgICAgICAgICA5ZjoxNworICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgYmI6Mzg6OGU6MDQ6MjI6MjY6NTg6MGU6MjE6NDQ6NTY6Y2M6YmQ6NTk6N2M6Mjk6Njg6Y2I6CisgICAgICAgIDVjOjBmOmM4Ojg2OjU0OjNmOjgxOjc4OmE3OmFkOjhmOmNjOjQ2OmY3OjFjOjU0OmI4Ojc5OgorICAgICAgICAyZDo1Yjo3MjowNTo2YTplODoyMTpkMDplYzoxZDoxZDpmZTphNDozNDo1MTpiZTplZTplZDoKKyAgICAgICAgY2U6Y2M6OWM6MTY6Njg6ZTI6NWQ6NzU6NzM6MDg6NDM6MzE6OTE6NmE6MTA6MmI6MTA6YzI6CisgICAgICAgIDRiOjY5OmY4OmM5OmFkOjk4OmE4OmZkOmI4OmVmOmY2OmFiOmYwOjVmOjIxOmVmOmNiOjg1OgorICAgICAgICA2YjowOTplZDoyZjo0ODo2NjpiNTo2MDo3MjpjMDplODphMDpjNzo5ODpkYjowZTpmNzoxYjoKKyAgICAgICAgNzM6OGQ6MzQ6MDg6MGE6N2I6YzU6Nzc6NjI6YWE6MzA6MjM6OWI6YjA6MWU6OGI6ODA6OTg6CisgICAgICAgIDU0OmRjOjA1Ojg3OmIzOmE5OjYyOjU5OmZjOjhiOmI3OjE1OjlhOmFjOjQ0OmVjOmNmOjM1OgorICAgICAgICAxYTpmNzowZjoyZTo1ZDo5Mjo0YjowMTpjODo3YjplZTphMDozNzplZDplNDoxZDo4MjowZDoKKyAgICAgICAgOTk6NDE6NDM6MTc6YWQ6ZDQ6ZDU6Y2E6ZTM6Zjk6N2Q6MTc6YTI6MDE6ZDA6MzA6MGY6NDA6CisgICAgICAgIGI5OmRjOmI5OjA0OjgyOjY5OjgzOmI2OmY5OjBmOmZhOjA2OjkyOmY3OmE4OmY0OmQ2OjE3OgorICAgICAgICAxYzpmMDo1ZTo3ZjpjNDoyOTpjODplNjplMTplMjpmZjozNjo2ODoyMTo1MTphZTpmZjphOToKKyAgICAgICAgYmE6ODQ6OTI6YWQ6OGE6N2I6MzM6ZDg6OTA6ZDI6YzE6Nzk6NmQ6MzM6MzM6Mzk6NzQ6YWM6CisgICAgICAgIDFiOjM4OjcxOjlmOjJjOjA3OjkwOmVhOjFkOmUwOmQzOjg5OjVmOmNiOmVmOjE0OjhkOjI3OgorICAgICAgICA1NDphNTpiZDo0NgorCitWYWxpQ2VydCBDbGFzcyAxIFZBCis9PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IDY1OjU4OkFCOjE1OkFEOjU3OjZDOjFFOkE4OkE3OkI1OjY5OkFDOkJGOkZGOkVCCitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQzV6Q0NBbEFDQVFFd0RRWUpLb1pJaHZjTkFRRUZCUUF3Z2JzeEpEQWlCZ05WQkFjVEcxWmhiR2xEWlhKMAorSUZaaGJHbGtZWFJwYjI0Z1RtVjBkMjl5YXpFWE1CVUdBMVVFQ2hNT1ZtRnNhVU5sY25Rc0lFbHVZeTR4TlRBegorQmdOVkJBc1RMRlpoYkdsRFpYSjBJRU5zWVhOeklERWdVRzlzYVdONUlGWmhiR2xrWVhScGIyNGdRWFYwYUc5eQorYVhSNU1TRXdId1lEVlFRREV4aG9kSFJ3T2k4dmQzZDNMblpoYkdsalpYSjBMbU52YlM4eElEQWVCZ2txaGtpRworOXcwQkNRRVdFV2x1Wm05QWRtRnNhV05sY25RdVkyOXRNQjRYRFRrNU1EWXlOVEl5TWpNME9Gb1hEVEU1TURZeQorTlRJeU1qTTBPRm93Z2JzeEpEQWlCZ05WQkFjVEcxWmhiR2xEWlhKMElGWmhiR2xrWVhScGIyNGdUbVYwZDI5eQorYXpFWE1CVUdBMVVFQ2hNT1ZtRnNhVU5sY25Rc0lFbHVZeTR4TlRBekJnTlZCQXNUTEZaaGJHbERaWEowSUVOcworWVhOeklERWdVRzlzYVdONUlGWmhiR2xrWVhScGIyNGdRWFYwYUc5eWFYUjVNU0V3SHdZRFZRUURFeGhvZEhSdworT2k4dmQzZDNMblpoYkdsalpYSjBMbU52YlM4eElEQWVCZ2txaGtpRzl3MEJDUUVXRVdsdVptOUFkbUZzYVdObAorY25RdVkyOXRNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0JnUURZV1lKNmliaVd1cVl2YUc5WQorTHFkVUhBWnU5T3FOU0x3eGxCZnc4MDY4c3JnMWtuYXcwS1dsQWRjQUF4SWlHUWo0L3hFam04NEg5YjlwR2liKworVHVuUmY1MHNRQjFaYUc2bStGaXduUnFQMHoveDNCa0dnYWdPNERyZHlGTkZDUWJtRDNERCtrQ21EdUpXQlE4WQorVGZ3Z2d0RnpWWFNOZG5LZ0haMGR3TjAvY1FJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0R0JBRkJvUFVuMAorTEJ3R2xOK1ZZSCtXZXhmK1QzR3RaTWpkZDlMdldWWG9QK2lPQlNvaDhnZlN0YWRTL3B5eHR1SmJkeGRBNm5MVworSThzb2dUTERBSGtZN0ZrWGljbkdhaDV4eWYyM2RLVWxSV25GU0tzWjRVV0tKV3NaN3VXN0V2Vi85NmFOVWNQdworblhTM3FUNmdwZisyU1FNVDJpTE03WEdDSzVuUE9yZjFMWExJCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAxICgweDApCisgICAgICAgIFNlcmlhbCBOdW1iZXI6IDEgKDB4MSkKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogTD1WYWxpQ2VydCBWYWxpZGF0aW9uIE5ldHdvcmssIE89VmFsaUNlcnQsIEluYy4sIE9VPVZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5LCBDTj1odHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8vRW1haWw9aW5mb0B2YWxpY2VydC5jb20KKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IEp1biAyNSAyMjoyMzo0OCAxOTk5IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogSnVuIDI1IDIyOjIzOjQ4IDIwMTkgR01UCisgICAgICAgIFN1YmplY3Q6IEw9VmFsaUNlcnQgVmFsaWRhdGlvbiBOZXR3b3JrLCBPPVZhbGlDZXJ0LCBJbmMuLCBPVT1WYWxpQ2VydCBDbGFzcyAxIFBvbGljeSBWYWxpZGF0aW9uIEF1dGhvcml0eSwgQ049aHR0cDovL3d3dy52YWxpY2VydC5jb20vL0VtYWlsPWluZm9AdmFsaWNlcnQuY29tCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpkODo1OTo4Mjo3YTo4OTpiODo5NjpiYTphNjoyZjo2ODo2Zjo1ODoyZToKKyAgICAgICAgICAgICAgICAgICAgYTc6NTQ6MWM6MDY6NmU6ZjQ6ZWE6OGQ6NDg6YmM6MzE6OTQ6MTc6ZjA6ZjM6CisgICAgICAgICAgICAgICAgICAgIDRlOmJjOmIyOmI4OjM1OjkyOjc2OmIwOmQwOmE1OmE1OjAxOmQ3OjAwOjAzOgorICAgICAgICAgICAgICAgICAgICAxMjoyMjoxOTowODpmODpmZjoxMToyMzo5YjpjZTowNzpmNTpiZjo2OToxYToKKyAgICAgICAgICAgICAgICAgICAgMjY6ZmU6NGU6ZTk6ZDE6N2Y6OWQ6MmM6NDA6MWQ6NTk6Njg6NmU6YTY6Zjg6CisgICAgICAgICAgICAgICAgICAgIDU4OmIwOjlkOjFhOjhmOmQzOjNmOmYxOmRjOjE5OjA2OjgxOmE4OjBlOmUwOgorICAgICAgICAgICAgICAgICAgICAzYTpkZDpjODo1Mzo0NTowOTowNjplNjowZjo3MDpjMzpmYTo0MDphNjowZToKKyAgICAgICAgICAgICAgICAgICAgZTI6NTY6MDU6MGY6MTg6NGQ6ZmM6MjA6ODI6ZDE6NzM6NTU6NzQ6OGQ6NzY6CisgICAgICAgICAgICAgICAgICAgIDcyOmEwOjFkOjlkOjFkOmMwOmRkOjNmOjcxCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA1MDo2ODozZDo0OTpmNDoyYzoxYzowNjo5NDpkZjo5NTo2MDo3Zjo5Njo3YjoxNzpmZTo0ZjoKKyAgICAgICAgNzE6YWQ6NjQ6Yzg6ZGQ6Nzc6ZDI6ZWY6NTk6NTU6ZTg6M2Y6ZTg6OGU6MDU6MmE6MjE6ZjI6CisgICAgICAgIDA3OmQyOmI1OmE3OjUyOmZlOjljOmIxOmI2OmUyOjViOjc3OjE3OjQwOmVhOjcyOmQ2OjIzOgorICAgICAgICBjYjoyODo4MTozMjpjMzowMDo3OToxODplYzo1OToxNzo4OTpjOTpjNjo2YToxZTo3MTpjOToKKyAgICAgICAgZmQ6Yjc6NzQ6YTU6MjU6NDU6Njk6YzU6NDg6YWI6MTk6ZTE6NDU6OGE6MjU6NmI6MTk6ZWU6CisgICAgICAgIGU1OmJiOjEyOmY1OjdmOmY3OmE2OjhkOjUxOmMzOmYwOjlkOjc0OmI3OmE5OjNlOmEwOmE1OgorICAgICAgICBmZjpiNjo0OTowMzoxMzpkYToyMjpjYzplZDo3MTo4MjoyYjo5OTpjZjozYTpiNzpmNToyZDoKKyAgICAgICAgNzI6YzgKKworVmFsaUNlcnQgQ2xhc3MgMiBWQQorPT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiBBOToyMzo3NTo5QjpCQTo0OTozNjo2RTozMTpDMjpEQjpGMjpFNzo2NjpCQTo4NworUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUM1ekNDQWxBQ0FRRXdEUVlKS29aSWh2Y05BUUVGQlFBd2dic3hKREFpQmdOVkJBY1RHMVpoYkdsRFpYSjAKK0lGWmhiR2xrWVhScGIyNGdUbVYwZDI5eWF6RVhNQlVHQTFVRUNoTU9WbUZzYVVObGNuUXNJRWx1WXk0eE5UQXoKK0JnTlZCQXNUTEZaaGJHbERaWEowSUVOc1lYTnpJRElnVUc5c2FXTjVJRlpoYkdsa1lYUnBiMjRnUVhWMGFHOXkKK2FYUjVNU0V3SHdZRFZRUURFeGhvZEhSd09pOHZkM2QzTG5aaGJHbGpaWEowTG1OdmJTOHhJREFlQmdrcWhraUcKKzl3MEJDUUVXRVdsdVptOUFkbUZzYVdObGNuUXVZMjl0TUI0WERUazVNRFl5TmpBd01UazFORm9YRFRFNU1EWXkKK05qQXdNVGsxTkZvd2dic3hKREFpQmdOVkJBY1RHMVpoYkdsRFpYSjBJRlpoYkdsa1lYUnBiMjRnVG1WMGQyOXkKK2F6RVhNQlVHQTFVRUNoTU9WbUZzYVVObGNuUXNJRWx1WXk0eE5UQXpCZ05WQkFzVExGWmhiR2xEWlhKMElFTnMKK1lYTnpJRElnVUc5c2FXTjVJRlpoYkdsa1lYUnBiMjRnUVhWMGFHOXlhWFI1TVNFd0h3WURWUVFERXhob2RIUncKK09pOHZkM2QzTG5aaGJHbGpaWEowTG1OdmJTOHhJREFlQmdrcWhraUc5dzBCQ1FFV0VXbHVabTlBZG1Gc2FXTmwKK2NuUXVZMjl0TUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FET09uSEs1YXZJV1pKVjE2dlkKK2RBNzU3dG4yVlVkWlpVY09CVlhjNjVnMlBGeFRYZE13enpqc3ZVR0o3U1ZDQ1NSckNsNnpmTjFTTFV6bTFOWjkKK1dsbXBaZFJKRXkwa1RSeFFiN1hCaFZRNy9uSGswMXhDK1lEZ2tSb0tXemsyWi9NL1ZYd2JQN1JmWkhNMDQ3UVMKK3Y0ZGsrTm9TL3pjbndiTkR1Kzk3Ymk1cDl3SURBUUFCTUEwR0NTcUdTSWIzRFFFQkJRVUFBNEdCQUR0L1VHOXYKK1VKU1pTV0k0T0I5TCtLWElQcWVDZ2ZZcngrakZ6dWc2RUlMTEdBQ09UYjJvV0graGVRQzF1K21OcjBIWkR6VHUKK0lZRVpvREpKS1BURWpsYlZValA5VU5WK21Xd0Q1TWxNL010c3EyYXpTaUdNNWJVTU1qNFFzc3hzb2R5YW1Fd0MKK1cvUE91WjZsY2c1S3R6ODg1aFpvK0w3dGRFeThXOVZpSDBQZAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMSAoMHgwKQorICAgICAgICBTZXJpYWwgTnVtYmVyOiAxICgweDEpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEw9VmFsaUNlcnQgVmFsaWRhdGlvbiBOZXR3b3JrLCBPPVZhbGlDZXJ0LCBJbmMuLCBPVT1WYWxpQ2VydCBDbGFzcyAyIFBvbGljeSBWYWxpZGF0aW9uIEF1dGhvcml0eSwgQ049aHR0cDovL3d3dy52YWxpY2VydC5jb20vL0VtYWlsPWluZm9AdmFsaWNlcnQuY29tCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBKdW4gMjYgMDA6MTk6NTQgMTk5OSBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEp1biAyNiAwMDoxOTo1NCAyMDE5IEdNVAorICAgICAgICBTdWJqZWN0OiBMPVZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29yaywgTz1WYWxpQ2VydCwgSW5jLiwgT1U9VmFsaUNlcnQgQ2xhc3MgMiBQb2xpY3kgVmFsaWRhdGlvbiBBdXRob3JpdHksIENOPWh0dHA6Ly93d3cudmFsaWNlcnQuY29tLy9FbWFpbD1pbmZvQHZhbGljZXJ0LmNvbQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6Y2U6M2E6NzE6Y2E6ZTU6YWI6Yzg6NTk6OTI6NTU6ZDc6YWI6ZDg6NzQ6CisgICAgICAgICAgICAgICAgICAgIDBlOmY5OmVlOmQ5OmY2OjU1OjQ3OjU5OjY1OjQ3OjBlOjA1OjU1OmRjOmViOgorICAgICAgICAgICAgICAgICAgICA5ODozNjozYzo1Yzo1Mzo1ZDpkMzozMDpjZjozODplYzpiZDo0MTo4OTplZDoKKyAgICAgICAgICAgICAgICAgICAgMjU6NDI6MDk6MjQ6NmI6MGE6NWU6YjM6N2M6ZGQ6NTI6MmQ6NGM6ZTY6ZDQ6CisgICAgICAgICAgICAgICAgICAgIGQ2OjdkOjVhOjU5OmE5OjY1OmQ0OjQ5OjEzOjJkOjI0OjRkOjFjOjUwOjZmOgorICAgICAgICAgICAgICAgICAgICBiNTpjMTo4NTo1NDozYjpmZTo3MTplNDpkMzo1Yzo0MjpmOTo4MDplMDo5MToKKyAgICAgICAgICAgICAgICAgICAgMWE6MGE6NWI6Mzk6MzY6Njc6ZjM6M2Y6NTU6N2M6MWI6M2Y6YjQ6NWY6NjQ6CisgICAgICAgICAgICAgICAgICAgIDczOjM0OmUzOmI0OjEyOmJmOjg3OjY0OmY4OmRhOjEyOmZmOjM3OjI3OmMxOgorICAgICAgICAgICAgICAgICAgICBiMzo0MzpiYjplZjo3Yjo2ZToyZTo2OTpmNworICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgM2I6N2Y6NTA6NmY6NmY6NTA6OTQ6OTk6NDk6NjI6Mzg6Mzg6MWY6NGI6Zjg6YTU6Yzg6M2U6CisgICAgICAgIGE3OjgyOjgxOmY2OjJiOmM3OmU4OmM1OmNlOmU4OjNhOjEwOjgyOmNiOjE4OjAwOjhlOjRkOgorICAgICAgICBiZDphODo1ODo3ZjphMTo3OTowMDpiNTpiYjplOTo4ZDphZjo0MTpkOTowZjozNDplZToyMToKKyAgICAgICAgODE6MTk6YTA6MzI6NDk6Mjg6ZjQ6YzQ6OGU6NTY6ZDU6NTI6MzM6ZmQ6NTA6ZDU6N2U6OTk6CisgICAgICAgIDZjOjAzOmU0OmM5OjRjOmZjOmNiOjZjOmFiOjY2OmIzOjRhOjIxOjhjOmU1OmI1OjBjOjMyOgorICAgICAgICAzZToxMDpiMjpjYzo2YzphMTpkYzo5YTo5ODo0YzowMjo1YjpmMzpjZTpiOTo5ZTphNTo3MjoKKyAgICAgICAgMGU6NGE6Yjc6M2Y6M2M6ZTY6MTY6Njg6Zjg6YmU6ZWQ6NzQ6NGM6YmM6NWI6ZDU6NjI6MWY6CisgICAgICAgIDQzOmRkCisKK1ZhbGlDZXJ0IENsYXNzIDMgVkEKKz09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogQTI6NkY6NTM6Qjc6RUU6NDA6REI6NEE6Njg6RTc6RkE6MTg6RDk6MTA6NEI6NzIKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlDNXpDQ0FsQUNBUUV3RFFZSktvWklodmNOQVFFRkJRQXdnYnN4SkRBaUJnTlZCQWNURzFaaGJHbERaWEowCitJRlpoYkdsa1lYUnBiMjRnVG1WMGQyOXlhekVYTUJVR0ExVUVDaE1PVm1Gc2FVTmxjblFzSUVsdVl5NHhOVEF6CitCZ05WQkFzVExGWmhiR2xEWlhKMElFTnNZWE56SURNZ1VHOXNhV041SUZaaGJHbGtZWFJwYjI0Z1FYVjBhRzl5CithWFI1TVNFd0h3WURWUVFERXhob2RIUndPaTh2ZDNkM0xuWmhiR2xqWlhKMExtTnZiUzh4SURBZUJna3Foa2lHCis5dzBCQ1FFV0VXbHVabTlBZG1Gc2FXTmxjblF1WTI5dE1CNFhEVGs1TURZeU5qQXdNakl6TTFvWERURTVNRFl5CitOakF3TWpJek0xb3dnYnN4SkRBaUJnTlZCQWNURzFaaGJHbERaWEowSUZaaGJHbGtZWFJwYjI0Z1RtVjBkMjl5CithekVYTUJVR0ExVUVDaE1PVm1Gc2FVTmxjblFzSUVsdVl5NHhOVEF6QmdOVkJBc1RMRlpoYkdsRFpYSjBJRU5zCitZWE56SURNZ1VHOXNhV041SUZaaGJHbGtZWFJwYjI0Z1FYVjBhRzl5YVhSNU1TRXdId1lEVlFRREV4aG9kSFJ3CitPaTh2ZDNkM0xuWmhiR2xqWlhKMExtTnZiUzh4SURBZUJna3Foa2lHOXcwQkNRRVdFV2x1Wm05QWRtRnNhV05sCitjblF1WTI5dE1JR2ZNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R05BRENCaVFLQmdRRGptRkdXSE9qVnNRYUJhbGZECitjbldUcTgrZXB2enpGbExXTFUyZk5VU29MZ1JOQjBtS09DbjFkemZudDZ0ZDN6WnhGSm1QM01LUzhlZGdrcGZzCisyRWpjdjhFQ0lNWWtwQ2hNTUZwMmJiRmM4OTNlbmhCeG9ZakhXNXRCYmNxd3VJNFY3cTB6Szg5SEJGeDFjUXFZCitKSmdwcDBsWnBkMzR0ME5pWWZQVDR0QlZQd0lEQVFBQk1BMEdDU3FHU0liM0RRRUJCUVVBQTRHQkFGYTdBbGlFCitad2dzM3gvYmUwa3o5ZE5ubmZTMENoQ3p5Y1VzNHBKcWNYZ244bkNEUXRNK3o2bFU5UEhZa2hhTTBRVExTNnZKCituMFd1UElxcHNIRXpYY2pGVjkrdnFEV3pmNG1INmVnbGtyaC9oWHF1MXJ3ZU4xZ3FaOG1SenlxQlB1M0dPZC9BCitQaG1jR2N3VFRZSkJ0WXplNEQxZ0NDQVBSWDVyb24rampCWHUKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDEgKDB4MCkKKyAgICAgICAgU2VyaWFsIE51bWJlcjogMSAoMHgxKQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBMPVZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29yaywgTz1WYWxpQ2VydCwgSW5jLiwgT1U9VmFsaUNlcnQgQ2xhc3MgMyBQb2xpY3kgVmFsaWRhdGlvbiBBdXRob3JpdHksIENOPWh0dHA6Ly93d3cudmFsaWNlcnQuY29tLy9FbWFpbD1pbmZvQHZhbGljZXJ0LmNvbQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogSnVuIDI2IDAwOjIyOjMzIDE5OTkgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBKdW4gMjYgMDA6MjI6MzMgMjAxOSBHTVQKKyAgICAgICAgU3ViamVjdDogTD1WYWxpQ2VydCBWYWxpZGF0aW9uIE5ldHdvcmssIE89VmFsaUNlcnQsIEluYy4sIE9VPVZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5LCBDTj1odHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8vRW1haWw9aW5mb0B2YWxpY2VydC5jb20KKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgxMDI0IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgxMDI0IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmUzOjk4OjUxOjk2OjFjOmU4OmQ1OmIxOjA2OjgxOjZhOjU3OmMzOjcyOgorICAgICAgICAgICAgICAgICAgICA3NTo5MzphYjpjZjo5ZTphNjpmYzpmMzoxNjo1MjpkNjoyZDo0ZDo5ZjozNToKKyAgICAgICAgICAgICAgICAgICAgNDQ6YTg6MmU6MDQ6NGQ6MDc6NDk6OGE6Mzg6Mjk6ZjU6Nzc6Mzc6ZTc6Yjc6CisgICAgICAgICAgICAgICAgICAgIGFiOjVkOmRmOjM2OjcxOjE0Ojk5OjhmOmRjOmMyOjkyOmYxOmU3OjYwOjkyOgorICAgICAgICAgICAgICAgICAgICA5NzplYzpkODo0ODpkYzpiZjpjMTowMjoyMDpjNjoyNDphNDoyODo0YzozMDoKKyAgICAgICAgICAgICAgICAgICAgNWE6NzY6NmQ6YjE6NWM6ZjM6ZGQ6ZGU6OWU6MTA6NzE6YTE6ODg6Yzc6NWI6CisgICAgICAgICAgICAgICAgICAgIDliOjQxOjZkOmNhOmIwOmI4OjhlOjE1OmVlOmFkOjMzOjJiOmNmOjQ3OjA0OgorICAgICAgICAgICAgICAgICAgICA1Yzo3NTo3MTowYTo5ODoyNDo5ODoyOTphNzo0OTo1OTphNTpkZDpmODpiNzoKKyAgICAgICAgICAgICAgICAgICAgNDM6NjI6NjE6ZjM6ZDM6ZTI6ZDA6NTU6M2YKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDU2OmJiOjAyOjU4Ojg0OjY3OjA4OjJjOmRmOjFmOmRiOjdiOjQ5OjMzOmY1OmQzOjY3OjlkOgorICAgICAgICBmNDpiNDowYToxMDpiMzpjOTpjNToyYzplMjo5Mjo2YTo3MTo3ODoyNzpmMjo3MDo4Mzo0MjoKKyAgICAgICAgZDM6M2U6Y2Y6YTk6NTQ6ZjQ6ZjE6ZDg6OTI6MTY6OGM6ZDE6MDQ6Y2I6NGI6YWI6Yzk6OWY6CisgICAgICAgIDQ1OmFlOjNjOjhhOmE5OmIwOjcxOjMzOjVkOmM4OmM1OjU3OmRmOmFmOmE4OjM1OmIzOjdmOgorICAgICAgICA4OTo4NzplOTplODoyNTo5MjpiODo3Zjo4NTo3YTphZTpkNjpiYzoxZTozNzo1ODoyYTo2NzoKKyAgICAgICAgYzk6OTE6Y2Y6MmE6ODE6M2U6ZWQ6YzY6Mzk6ZGY6YzA6M2U6MTk6OWM6MTk6Y2M6MTM6NGQ6CisgICAgICAgIDgyOjQxOmI1OjhjOmRlOmUwOjNkOjYwOjA4OjIwOjBmOjQ1OjdlOjZiOmEyOjdmOmEzOjhjOgorICAgICAgICAxNTplZQorCitWZXJpU2lnbiBDbGFzcyA0IFByaW1hcnkgQ0EKKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiAxQjpEMTpBRDoxNzo4Qjo3RjoyMjoxMzoyNDpGNToyNjpFMjo1RDo0RTpCOToxMAorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUNNVENDQVpvQ0JRS21BQUFCTUEwR0NTcUdTSWIzRFFFQkFnVUFNRjh4Q3pBSkJnTlZCQVlUQWxWVE1SY3cKK0ZRWURWUVFLRXc1V1pYSnBVMmxuYml3Z1NXNWpMakUzTURVR0ExVUVDeE11UTJ4aGMzTWdOQ0JRZFdKc2FXTWcKK1VISnBiV0Z5ZVNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFlRncwNU5qQXhNamt3TURBd01EQmEKK0Z3MDVPVEV5TXpFeU16VTVOVGxhTUY4eEN6QUpCZ05WQkFZVEFsVlRNUmN3RlFZRFZRUUtFdzVXWlhKcFUybG4KK2Jpd2dTVzVqTGpFM01EVUdBMVVFQ3hNdVEyeGhjM01nTkNCUWRXSnNhV01nVUhKcGJXRnllU0JEWlhKMGFXWnAKK1kyRjBhVzl1SUVGMWRHaHZjbWwwZVRDQm56QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmpRQXdnWWtDZ1lFQTBMSjEKKzlualFybHBROU9sUXFaK00xKytSbEhEbzBpU1Fkb21GMXQrczVnRVhNb0R3blpOSHZKcGxuUitYcnIvcGhuVmoKK0lJbTlnRmlkQkF5ZHFNRWs2UXZsTVhpOS9DME1OMnFlZUlEcFJuWDU3YVA3RTN2SXdVelNvKy8xUExCaWowcGQKK085MlZaNDhUdWNFODFxY21tK3pETzNyWlRieHRtK2dWQWVQd1I2a0NBd0VBQVRBTkJna3Foa2lHOXcwQkFRSUYKK0FBT0JnUUJUM2RQd25DUitRS3JpL0FBYTE5b00vREpodUJVTmx2UDZWeHQvTTN5djZaaWFZY2g2czdmL3NkeVoKK2c5eXNFdnh3eVI4NFF1MUU5b0F1VzJzemFheWMwMXpuWDFvWXg3RXRlUVNXUVpHWlFiRThEYnFFT2NZN2wvQW0KK3lZN3V2Y3hDbGY4ZXh3SS9WQXg0OWJ5cVlId0NhZWpjck9JQ2RtSEVQZ1BxMG9vazBRPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDEgKDB4MCkKKyAgICAgICAgU2VyaWFsIE51bWJlcjoKKyAgICAgICAgICAgIDAyOmE2OjAwOjAwOjAxCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kMldpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1VUywgTz1WZXJpU2lnbiwgSW5jLiwgT1U9Q2xhc3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogSmFuIDI5IDAwOjAwOjAwIDE5OTYgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBEZWMgMzEgMjM6NTk6NTkgMTk5OSBHTVQKKyAgICAgICAgU3ViamVjdDogQz1VUywgTz1WZXJpU2lnbiwgSW5jLiwgT1U9Q2xhc3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6ZDA6YjI6NzU6ZjY6Nzg6ZDA6YWU6NWE6NTA6ZjQ6ZTk6NTA6YTk6OWY6CisgICAgICAgICAgICAgICAgICAgIDhjOmQ3OmVmOjkxOjk0OjcwOmU4OmQyOjI0OjkwOjc2Ojg5Ojg1OmQ2OmRmOgorICAgICAgICAgICAgICAgICAgICBhYzplNjowMToxNzozMjo4MDpmMDo5ZDo5Mzo0NzpiYzo5YTo2NTo5ZDoxZjoKKyAgICAgICAgICAgICAgICAgICAgOTc6YWU6YmY6ZTk6ODY6NzU6NjM6MjA6ODk6YmQ6ODA6NTg6OWQ6MDQ6MGM6CisgICAgICAgICAgICAgICAgICAgIDlkOmE4OmMxOjI0OmU5OjBiOmU1OjMxOjc4OmJkOmZjOjJkOjBjOjM3OjZhOgorICAgICAgICAgICAgICAgICAgICA5ZTo3ODo4MDplOTo0Njo3NTpmOTplZDphMzpmYjoxMzo3YjpjODpjMTo0YzoKKyAgICAgICAgICAgICAgICAgICAgZDI6YTM6ZWY6ZjU6M2M6YjA6NjI6OGY6NGE6NWQ6M2I6ZGQ6OTU6Njc6OGY6CisgICAgICAgICAgICAgICAgICAgIDEzOmI5OmMxOjNjOmQ2OmE3OjI2OjliOmVjOmMzOjNiOjdhOmQ5OjRkOmJjOgorICAgICAgICAgICAgICAgICAgICA2ZDo5YjplODoxNTowMTplMzpmMDo0NzphOQorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDJXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA1MzpkZDpkMzpmMDo5YzoyNDo3ZTo0MDphYTplMjpmYzowMDoxYTpkNzpkYTowYzpmYzozMjoKKyAgICAgICAgNjE6Yjg6MTU6MGQ6OTY6ZjM6ZmE6NTc6MWI6N2Y6MzM6N2M6YWY6ZTk6OTg6OWE6NjE6Yzg6CisgICAgICAgIDdhOmIzOmI3OmZmOmIxOmRjOjk5OjgzOmRjOmFjOjEyOmZjOjcwOmM5OjFmOjM4OjQyOmVkOgorICAgICAgICA0NDpmNjo4MDoyZTo1Yjo2YjozMzo2OTphYzo5YzpkMzo1YzplNzo1Zjo1YToxODpjNzpiMToKKyAgICAgICAgMmQ6Nzk6MDQ6OTY6NDE6OTE6OTk6NDE6YjE6M2M6MGQ6YmE6ODQ6Mzk6YzY6M2I6OTc6ZjA6CisgICAgICAgIDI2OmM5OjhlOmVlOmJkOmNjOjQyOjk1OmZmOjFlOmM3OjAyOjNmOjU0OjBjOjc4OmY1OmJjOgorICAgICAgICBhYTo2MDo3YzowMjo2OTplODpkYzphYzplMjowMjo3Njo2MTpjNDozZTowMzplYTpkMjo4YToKKyAgICAgICAgMjQ6ZDEKKworVmVyaXNpZ24gQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiA5Nzo2MDpFODo1Nzo1RjpEMzo1MDo0NzpFNTo0MzowQzo5NDozNjo4QTpCMDo2MgorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUNQVENDQWFZQ0VRRE51bjlXOE4va3ZGVCtJcXl6Y3FwVk1BMEdDU3FHU0liM0RRRUJBZ1VBTUY4eEN6QUoKK0JnTlZCQVlUQWxWVE1SY3dGUVlEVlFRS0V3NVdaWEpwVTJsbmJpd2dTVzVqTGpFM01EVUdBMVVFQ3hNdVEyeGgKK2MzTWdNU0JRZFdKc2FXTWdVSEpwYldGeWVTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRBZUZ3MDUKK05qQXhNamt3TURBd01EQmFGdzB5T0RBNE1ERXlNelU1TlRsYU1GOHhDekFKQmdOVkJBWVRBbFZUTVJjd0ZRWUQKK1ZRUUtFdzVXWlhKcFUybG5iaXdnU1c1akxqRTNNRFVHQTFVRUN4TXVRMnhoYzNNZ01TQlFkV0pzYVdNZ1VISnAKK2JXRnllU0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQ0JuekFOQmdrcWhraUc5dzBCQVFFRkFBT0IKK2pRQXdnWWtDZ1lFQTVSbS9iYU5XWVMyWlNISDJaOTY1amV1M25vYUFDcEVPK2pnbHIwYUlndVZ6cUtDYkpGME4KK0g4eGxiZ3l3MEZhRUdJZWFCcHNRb1hQZnRGZzVhMjdCOWhYVnFLZy9xaElHalRHc2Y3QTAxNDgwWjRnSnpSUVIKKzRrNUZWbWtmZUFLQTJ0eEhrU203TnNsalhNWGcxeTJIZTZHM01yQjdNTG9xTHpHcTdxTm4ydHNDQXdFQUFUQU4KK0Jna3Foa2lHOXcwQkFRSUZBQU9CZ1FCTVA3aUx4bWpmN2tNekRsM3Bwc3NIaEUxNk0vK1NHL1EycmRpVklqWm8KK0VXeDhRc3p6bkM3RUJ6OFVzQTlQLzVDU2R2bml2RXJwajgyZ2dBcjN4U254Z2lKZHVMSGRnU09qZXlVVlJqQjUKK0Z2anFCVXVVZngzQ0hNamp0L1FRUUR3VHcxOGZVK2hJNUlhMGU2RTFzSHNsdXJqVGpxcy9PSjBBTkFDWTg5RngKK2xBPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDEgKDB4MCkKKyAgICAgICAgU2VyaWFsIE51bWJlcjoKKyAgICAgICAgICAgIGNkOmJhOjdmOjU2OmYwOmRmOmU0OmJjOjU0OmZlOjIyOmFjOmIzOjcyOmFhOjU1CisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kMldpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1VUywgTz1WZXJpU2lnbiwgSW5jLiwgT1U9Q2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogSmFuIDI5IDAwOjAwOjAwIDE5OTYgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBBdWcgIDEgMjM6NTk6NTkgMjAyOCBHTVQKKyAgICAgICAgU3ViamVjdDogQz1VUywgTz1WZXJpU2lnbiwgSW5jLiwgT1U9Q2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6ZTU6MTk6YmY6NmQ6YTM6NTY6NjE6MmQ6OTk6NDg6NzE6ZjY6Njc6ZGU6CisgICAgICAgICAgICAgICAgICAgIGI5OjhkOmViOmI3OjllOjg2OjgwOjBhOjkxOjBlOmZhOjM4OjI1OmFmOjQ2OgorICAgICAgICAgICAgICAgICAgICA4ODo4MjplNTo3MzphODphMDo5YjoyNDo1ZDowZDoxZjpjYzo2NTo2ZTowYzoKKyAgICAgICAgICAgICAgICAgICAgYjA6ZDA6NTY6ODQ6MTg6ODc6OWE6MDY6OWI6MTA6YTE6NzM6ZGY6YjQ6NTg6CisgICAgICAgICAgICAgICAgICAgIDM5OjZiOjZlOmMxOmY2OjE1OmQ1OmE4OmE4OjNmOmFhOjEyOjA2OjhkOjMxOgorICAgICAgICAgICAgICAgICAgICBhYzo3ZjpiMDozNDpkNzo4ZjozNDo2Nzo4ODowOTpjZDoxNDoxMTplMjo0ZToKKyAgICAgICAgICAgICAgICAgICAgNDU6NTY6Njk6MWY6Nzg6MDI6ODA6ZGE6ZGM6NDc6OTE6Mjk6YmI6MzY6Yzk6CisgICAgICAgICAgICAgICAgICAgIDYzOjVjOmM1OmUwOmQ3OjJkOjg3OjdiOmExOmI3OjMyOmIwOjdiOjMwOmJhOgorICAgICAgICAgICAgICAgICAgICAyYToyZjozMTphYTplZTphMzo2NzpkYTpkYgorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDJXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA0YzozZjpiODo4YjpjNjo2ODpkZjplZTo0MzozMzowZTo1ZDplOTphNjpjYjowNzo4NDo0ZDoKKyAgICAgICAgN2E6MzM6ZmY6OTI6MWI6ZjQ6MzY6YWQ6ZDg6OTU6MjI6MzY6Njg6MTE6NmM6N2M6NDI6Y2M6CisgICAgICAgIGYzOjljOjJlOmM0OjA3OjNmOjE0OmIwOjBmOjRmOmZmOjkwOjkyOjc2OmY5OmUyOmJjOjRhOgorICAgICAgICBlOTo4ZjpjZDphMDo4MDowYTpmNzpjNToyOTpmMTo4MjoyMjo1ZDpiODpiMTpkZDo4MToyMzoKKyAgICAgICAgYTM6N2I6MjU6MTU6NDY6MzA6Nzk6MTY6Zjg6ZWE6MDU6NGI6OTQ6N2Y6MWQ6YzI6MWM6Yzg6CisgICAgICAgIGUzOmI3OmY0OjEwOjQwOjNjOjEzOmMzOjVmOjFmOjUzOmU4OjQ4OmU0Ojg2OmI0OjdiOmExOgorICAgICAgICAzNTpiMDo3YjoyNTpiYTpiODpkMzo4ZTphYjozZjozODo5ZDowMDozNDowMDo5ODpmMzpkMToKKyAgICAgICAgNzE6OTQKKworVmVyaXNpZ24gQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogRjI6N0Q6RTk6NTQ6RTQ6QTM6MjI6MEQ6NzY6OUY6RTc6MEI6QkI6QjM6MjQ6MkIKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEQWpDQ0Ftc0NFRG5LVkluK1VDSXkvakxaMi9zYmhCa3dEUVlKS29aSWh2Y05BUUVGQlFBd2djRXhDekFKCitCZ05WQkFZVEFsVlRNUmN3RlFZRFZRUUtFdzVXWlhKcFUybG5iaXdnU1c1akxqRThNRG9HQTFVRUN4TXpRMnhoCitjM01nTVNCUWRXSnNhV01nVUhKcGJXRnllU0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVTQXRJRWN5CitNVG93T0FZRFZRUUxFekVvWXlrZ01UazVPQ0JXWlhKcFUybG5iaXdnU1c1akxpQXRJRVp2Y2lCaGRYUm9iM0pwCitlbVZrSUhWelpTQnZibXg1TVI4d0hRWURWUVFMRXhaV1pYSnBVMmxuYmlCVWNuVnpkQ0JPWlhSM2IzSnJNQjRYCitEVGs0TURVeE9EQXdNREF3TUZvWERURTRNRFV4T0RJek5UazFPVm93Z2NFeEN6QUpCZ05WQkFZVEFsVlRNUmN3CitGUVlEVlFRS0V3NVdaWEpwVTJsbmJpd2dTVzVqTGpFOE1Eb0dBMVVFQ3hNelEyeGhjM01nTVNCUWRXSnNhV01nCitVSEpwYldGeWVTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVNBdElFY3lNVG93T0FZRFZRUUxFekVvCitZeWtnTVRrNU9DQldaWEpwVTJsbmJpd2dTVzVqTGlBdElFWnZjaUJoZFhSb2IzSnBlbVZrSUhWelpTQnZibXg1CitNUjh3SFFZRFZRUUxFeFpXWlhKcFUybG5iaUJVY25WemRDQk9aWFIzYjNKck1JR2ZNQTBHQ1NxR1NJYjNEUUVCCitBUVVBQTRHTkFEQ0JpUUtCZ1FDcTBMcStGaTI0ZzlUSzBnKzhkakhLbE5nZGs0eFdBcnpaYnhwdlVqWnVkVllLCitWZFBmUTRjaEVXV0tmbys5SWQ1ck1qOGJoRFNWQloxQk5ldVM2NWJkcWxrL0FWTnRtVS90NWVJcVdwREJ1Y1NtCitGYy9JUmV1bVhZNmNQdkJrSkhhbHphc2FiN2JZZTFGaGJxWi9oOGppdCtVMDNFR0k2Z2xBdm5PU1BXdm5kUUlECitBUUFCTUEwR0NTcUdTSWIzRFFFQkJRVUFBNEdCQUl2M0doRE9kbHdIcTRPWjNCZUFielE1WFpnK2EzSXM0Y2VpCitlMEFwdVhpSXVrekZvMnBlbm01NzQvSUNRUXhtdnEzN3JxSVV6cEx6b2pTTHRMSzJKUExsMWVESTVXSnRoSHZMCit2cnNEaTN4WHl2QTNxWkN2aXU0RHZoMG9uTmttZHFETnhKMU84SzRIRnRXK3IxY0lhdENnUWtKQ0h2UWd6S1Y0CitncFVtT0lwSAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMSAoMHgwKQorICAgICAgICBTZXJpYWwgTnVtYmVyOgorICAgICAgICAgICAgMzk6Y2E6NTQ6ODk6ZmU6NTA6MjI6MzI6ZmU6MzI6ZDk6ZGI6ZmI6MWI6ODQ6MTkKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1VUywgTz1WZXJpU2lnbiwgSW5jLiwgT1U9Q2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyLCBPVT0oYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5LCBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBNYXkgMTggMDA6MDA6MDAgMTk5OCBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IE1heSAxOCAyMzo1OTo1OSAyMDE4IEdNVAorICAgICAgICBTdWJqZWN0OiBDPVVTLCBPPVZlcmlTaWduLCBJbmMuLCBPVT1DbGFzcyAxIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIsIE9VPShjKSAxOTk4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHksIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsKKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgxMDI0IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgxMDI0IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmFhOmQwOmJhOmJlOjE2OjJkOmI4OjgzOmQ0OmNhOmQyOjBmOmJjOjc2OgorICAgICAgICAgICAgICAgICAgICAzMTpjYTo5NDpkODoxZDo5Mzo4Yzo1NjowMjpiYzpkOTo2ZjoxYTo2Zjo1MjoKKyAgICAgICAgICAgICAgICAgICAgMzY6NmU6NzU6NTY6MGE6NTU6ZDM6ZGY6NDM6ODc6MjE6MTE6NjU6OGE6N2U6CisgICAgICAgICAgICAgICAgICAgIDhmOmJkOjIxOmRlOjZiOjMyOjNmOjFiOjg0OjM0Ojk1OjA1OjlkOjQxOjM1OgorICAgICAgICAgICAgICAgICAgICBlYjo5MjplYjo5NjpkZDphYTo1OTozZjowMTo1Mzo2ZDo5OTo0ZjplZDplNToKKyAgICAgICAgICAgICAgICAgICAgZTI6MmE6NWE6OTA6YzE6Yjk6YzQ6YTY6MTU6Y2Y6Yzg6NDU6ZWI6YTY6NWQ6CisgICAgICAgICAgICAgICAgICAgIDhlOjljOjNlOmYwOjY0OjI0Ojc2OmE1OmNkOmFiOjFhOjZmOmI2OmQ4OjdiOgorICAgICAgICAgICAgICAgICAgICA1MTo2MTo2ZTphNjo3Zjo4NzpjODplMjpiNzplNTozNDpkYzo0MTo4ODplYToKKyAgICAgICAgICAgICAgICAgICAgMDk6NDA6YmU6NzM6OTI6M2Q6NmI6ZTc6NzUKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDhiOmY3OjFhOjEwOmNlOjc2OjVjOjA3OmFiOjgzOjk5OmRjOjE3OjgwOjZmOjM0OjM5OjVkOgorICAgICAgICA5ODozZTo2Yjo3MjoyYzplMTpjNzphMjo3Yjo0MDoyOTpiOTo3ODo4ODpiYTo0YzpjNTphMzoKKyAgICAgICAgNmE6NWU6OWU6NmU6N2I6ZTM6ZjI6MDI6NDE6MGM6NjY6YmU6YWQ6ZmI6YWU6YTI6MTQ6Y2U6CisgICAgICAgIDkyOmYzOmEyOjM0OjhiOmI0OmIyOmI2OjI0OmYyOmU1OmQ1OmUwOmM4OmU1OjYyOjZkOjg0OgorICAgICAgICA3YjpjYjpiZTpiYjowMzo4Yjo3Yzo1NzpjYTpmMDozNzphOTo5MDphZjo4YTplZTowMzpiZToKKyAgICAgICAgMWQ6Mjg6OWM6ZDk6MjY6NzY6YTA6Y2Q6YzQ6OWQ6NGU6ZjA6YWU6MDc6MTY6ZDU6YmU6YWY6CisgICAgICAgIDU3OjA4OjZhOmQwOmEwOjQyOjQyOjQyOjFlOmY0OjIwOmNjOmE1Ojc4OjgyOjk1OjI2OjM4OgorICAgICAgICA4YTo0NworCitWZXJpc2lnbiBDbGFzcyAxIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiBCMTo0NzpCQzoxODo1NzpEMToxODpBMDo3ODoyRDpFQzo3MTpFODoyQTo5NTo3MworUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVHakNDQXdJQ0VRQ0xXM1ZXaEZTRkN3RFByemhJenJHa01BMEdDU3FHU0liM0RRRUJCUVVBTUlIS01Rc3cKK0NRWURWUVFHRXdKVlV6RVhNQlVHQTFVRUNoTU9WbVZ5YVZOcFoyNHNJRWx1WXk0eEh6QWRCZ05WQkFzVEZsWmwKK2NtbFRhV2R1SUZSeWRYTjBJRTVsZEhkdmNtc3hPakE0QmdOVkJBc1RNU2hqS1NBeE9UazVJRlpsY21sVGFXZHUKK0xDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4UlRCREJnTlZCQU1UUEZabGNtbFQKK2FXZHVJRU5zWVhOeklERWdVSFZpYkdsaklGQnlhVzFoY25rZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnAKK2RIa2dMU0JITXpBZUZ3MDVPVEV3TURFd01EQXdNREJhRncwek5qQTNNVFl5TXpVNU5UbGFNSUhLTVFzd0NRWUQKK1ZRUUdFd0pWVXpFWE1CVUdBMVVFQ2hNT1ZtVnlhVk5wWjI0c0lFbHVZeTR4SHpBZEJnTlZCQXNURmxabGNtbFQKK2FXZHVJRlJ5ZFhOMElFNWxkSGR2Y21zeE9qQTRCZ05WQkFzVE1TaGpLU0F4T1RrNUlGWmxjbWxUYVdkdUxDQkoKK2JtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hSVEJEQmdOVkJBTVRQRlpsY21sVGFXZHUKK0lFTnNZWE56SURFZ1VIVmliR2xqSUZCeWFXMWhjbmtnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2cKK0xTQkhNekNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFOMkUxTG0wK2FmWTh3UjQKK25ONDkzR3dURnRsNjNTUlJac0RISmxrTnJBWUl3cFRSTXgvd2d6VWZiaHZJM3FwdUZVNVVKKy9FYlJyc0MrTU8KKzhFU2xWOGRBV0I2alJ4OXg3R0QyYlpUSUdEbnQva0lZVnQva1RFa1FlRTRCZGpWakVqYmRacndCQkRhalZXalYKK29qWUpyS3NoSmxRR3JUL0tGT0NzeXEwR0haWGkrSjN4NEdEL3duOTFLMHpNMnY2SG1TSHF1djQrVk5mU1dYamIKK1BHN1BvQk1BR3Jnbm9lUytaNWJLb01Xem5OM0pkWjdyTUpwZm84M1pybmdaUHlQcFhOc3B2YTFWeUJ0VWpHUDIKKzZLYnF4emNTWEtNcEhnTFoyeDg3dE5jUFZrZUJGUVJLcjRNbjBjVllpTUhkOXFxbm94amFhS3B0RVZIaHYyVnIKK241WjIwVDBDQXdFQUFUQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFxMmFOMTdPNng1cTI1bFhRQmZHZk1ZMWEKK3F0bXFSaVlQY2UybHJWTldZZ0ZIS2tUcC9qOTBDeE9idWZSTkc3TFJYN0syMG9oY3M1L055OVNuMldDVmhEcjQKK3dUY2RZY3Juc01YbGtkcFVwcXd4Z2E2WDNzMElyTGpBbDRCL2JuS2s1MmtUbFdVZnhKTTgvWG1QQk5RK1QrcjMKK25zN05aM3hQWlFML2tZVlVjOGYvTnZlR0xlelFYay8vRVo5eUJ0YTRHdkZNRFNabDRrU0FIc2VmNDkzb0N0cnMKK3BTQ0FhV2loVDM3aGE4OEhRZnFEanJ3NDNiQXVFYkZyc2tMTW1yejVTQ0o1U2hrUHNodytJSFRaYXNPKzhpaDQKK0UxWjVUMjFRNmh1d3RWZXhOMlpZSS9QY0Q5OEtoOFR2aGdYVk9CUmdtYU5MM2dhV2NTenkyN1lmcE84LzdnPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDEgKDB4MCkKKyAgICAgICAgU2VyaWFsIE51bWJlcjoKKyAgICAgICAgICAgIDhiOjViOjc1OjU2Ojg0OjU0Ojg1OjBiOjAwOmNmOmFmOjM4OjQ4OmNlOmIxOmE0CisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9VVMsIE89VmVyaVNpZ24sIEluYy4sIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmssIE9VPShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHksIENOPVZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMworICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogT2N0ICAxIDAwOjAwOjAwIDE5OTkgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBKdWwgMTYgMjM6NTk6NTkgMjAzNiBHTVQKKyAgICAgICAgU3ViamVjdDogQz1VUywgTz1WZXJpU2lnbiwgSW5jLiwgT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yaywgT1U9KGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seSwgQ049VmVyaVNpZ24gQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMjA0OCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMjA0OCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpkZDo4NDpkNDpiOTpiNDpmOTphNzpkODpmMzowNDo3ODo5YzpkZTozZDoKKyAgICAgICAgICAgICAgICAgICAgZGM6NmM6MTM6MTY6ZDk6N2E6ZGQ6MjQ6NTE6NjY6YzA6Yzc6MjY6NTk6MGQ6CisgICAgICAgICAgICAgICAgICAgIGFjOjA2OjA4OmMyOjk0OmQxOjMzOjFmOmYwOjgzOjM1OjFmOjZlOjFiOmM4OgorICAgICAgICAgICAgICAgICAgICBkZTphYTo2ZToxNTo0ZTo1NDoyNzplZjpjNDo2ZDoxYTplYzowYjplMzowZToKKyAgICAgICAgICAgICAgICAgICAgZjA6NDQ6YTU6NTc6Yzc6NDA6NTg6MWU6YTM6NDc6MWY6NzE6ZWM6NjA6ZjY6CisgICAgICAgICAgICAgICAgICAgIDZkOjk0OmM4OjE4OjM5OmVkOmZlOjQyOjE4OjU2OmRmOmU0OjRjOjQ5OjEwOgorICAgICAgICAgICAgICAgICAgICA3ODo0ZTowMTo3NjozNTo2MzoxMjozNjpkZDo2NjpiYzowMTowNDozNjphMzoKKyAgICAgICAgICAgICAgICAgICAgNTU6Njg6ZDU6YTI6MzY6MDk6YWM6YWI6MjE6MjY6NTQ6MDY6YWQ6M2Y6Y2E6CisgICAgICAgICAgICAgICAgICAgIDE0OmUwOmFjOmNhOmFkOjA2OjFkOjk1OmUyOmY4OjlkOmYxOmUwOjYwOmZmOgorICAgICAgICAgICAgICAgICAgICBjMjo3Zjo3NToyYjo0YzpjYzpkYTpmZTo4Nzo5OToyMTplYTpiYTpmZTozZToKKyAgICAgICAgICAgICAgICAgICAgNTQ6ZDc6ZDI6NTk6Nzg6ZGI6M2M6NmU6Y2Y6YTA6MTM6MDA6MWE6Yjg6Mjc6CisgICAgICAgICAgICAgICAgICAgIGExOmU0OmJlOjY3Ojk2OmNhOmEwOmM1OmIzOjljOmRkOmM5Ojc1OjllOmViOgorICAgICAgICAgICAgICAgICAgICAzMDo5YTo1ZjphMzpjZDpkOTphZTo3ODoxOTozZjoyMzplOTo1YzpkYjoyOToKKyAgICAgICAgICAgICAgICAgICAgYmQ6YWQ6NTU6Yzg6MWI6NTQ6OGM6NjM6ZjY6ZTg6YTY6ZWE6Yzc6Mzc6MTI6CisgICAgICAgICAgICAgICAgICAgIDVjOmEzOjI5OjFlOjAyOmQ5OmRiOjFmOjNiOmI0OmQ3OjBmOjU2OjQ3OjgxOgorICAgICAgICAgICAgICAgICAgICAxNTowNDo0YTphZjo4MzoyNzpkMTpjNTo1ODo4ODpjMTpkZDpmNjphYTphNzoKKyAgICAgICAgICAgICAgICAgICAgYTM6MTg6ZGE6Njg6YWE6NmQ6MTE6NTE6ZTE6YmY6NjU6NmI6OWY6OTY6NzY6CisgICAgICAgICAgICAgICAgICAgIGQxOjNkCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBhYjo2Njo4ZDpkNzpiMzpiYTpjNzo5YTpiNjplNjo1NTpkMDowNTpmMTo5ZjozMTo4ZDo1YToKKyAgICAgICAgYWE6ZDk6YWE6NDY6MjY6MGY6NzE6ZWQ6YTU6YWQ6NTM6NTY6NjI6MDE6NDc6MmE6NDQ6ZTk6CisgICAgICAgIGZlOjNmOjc0OjBiOjEzOjliOmI5OmY0OjRkOjFiOmIyOmQxOjVmOmIyOmI2OmQyOjg4OjVjOgorICAgICAgICBiMzo5ZjpjZDpjYjpkNDphNzpkOTo2MDo5NTo4NDozYTpmODpjMTozNzoxZDo2MTpjYTplNzoKKyAgICAgICAgYjA6YzU6ZTU6OTE6ZGE6NTQ6YTY6YWM6MzE6ODE6YWU6OTc6ZGU6Y2Q6MDg6YWM6Yjg6YzA6CisgICAgICAgIDk3OjgwOjdmOjZlOjcyOmE0OmU3OjY5OjEzOjk1OjY1OjFmOmM0OjkzOjNjOmZkOjc5OjhmOgorICAgICAgICAwNDpkNDozZTo0ZjplYTpmNzo5ZTpjZTpjZDo2Nzo3Yzo0Zjo2NTowMjpmZjo5MTo4NTo1NDoKKyAgICAgICAgNzM6Yzc6ZmY6MzY6Zjc6ODY6MmQ6ZWM6ZDA6NWU6NGY6ZmY6MTE6OWY6NzI6MDY6ZDY6Yjg6CisgICAgICAgIDFhOmYxOjRjOjBkOjI2OjY1OmUyOjQ0OjgwOjFlOmM3OjlmOmUzOmRkOmU4OjBhOmRhOmVjOgorICAgICAgICBhNToyMDo4MDo2OTo2ODphMTo0Zjo3ZTplMTo2YjpjZjowNzo0MTpmYTo4Mzo4ZTpiYzozODoKKyAgICAgICAgZGQ6YjA6MmU6MTE6YjE6NmI6YjI6NDI6Y2M6OWE6YmM6Zjk6NDg6MjI6Nzk6NGE6MTk6MGY6CisgICAgICAgIGIyOjFjOjNlOjIwOjc0OmQ5OjZhOmMzOmJlOmYyOjI4Ojc4OjEzOjU2Ojc5OjRmOjZkOjUwOgorICAgICAgICBlYToxYjpiMDpiNTo1NzpiMTozNzo2Njo1ODoyMzpmMzpkYzowZjpkZjowYTo4NzpjNDplZjoKKyAgICAgICAgODY6MDU6ZDU6Mzg6MTQ6NjA6OTk6YTM6NGI6ZGU6MDY6OTY6NzE6MmM6ZjI6ZGI6YjY6MWY6CisgICAgICAgIGE0OmVmOjNmOmVlCisKK1ZlcmlzaWduIENsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogQjM6OUM6MjU6QjE6QzM6MkU6MzI6NTM6ODA6MTU6MzA6OUQ6NEQ6MDI6Nzc6M0UKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlDUERDQ0FhVUNFQzBiL0VvWGphT1I2K2YvOVl0RnZnc3dEUVlKS29aSWh2Y05BUUVDQlFBd1h6RUxNQWtHCitBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1UY3dOUVlEVlFRTEV5NURiR0Z6CitjeUF5SUZCMVlteHBZeUJRY21sdFlYSjVJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1CNFhEVGsyCitNREV5T1RBd01EQXdNRm9YRFRJNE1EZ3dNVEl6TlRrMU9Wb3dYekVMTUFrR0ExVUVCaE1DVlZNeEZ6QVZCZ05WCitCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNVGN3TlFZRFZRUUxFeTVEYkdGemN5QXlJRkIxWW14cFl5QlFjbWx0CitZWEo1SUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOCitBRENCaVFLQmdRQzJXb3VqRFdvamc0QnJ6em1IOUNFVE13Wk1KYUx0VlJLWHhhZUF1ZnFEd1NDZytpOFZEWHloCitZR3QrZVN6NkJnODZydlliYjdIUy95OG9VbCtEZlV2RWVyZjRaaCtBVlB5M3dvNVpTaFJYUnRHYWs3NUJrUU83CitGWUNUWE92bnpBaHNQejZ6U3Z6L1Myd2oxVkNDSmtRWmppUERjZW9aSkVjRW5uVy95S1lBSHdJREFRQUJNQTBHCitDU3FHU0liM0RRRUJBZ1VBQTRHQkFJb2JLL281d1hUWFh0Z1paS0pZU2kwMzRETkhENnp0OTZyYkh1U0xCbHhnCitKOHBGVXM0Vzd6OEdaT2VVYUh4Z014VVJhYStkWW8yakExUnJwcjdsN2dVWVlBUy9Rb0Q5MEtpb0hnRTc5Nk5jCityNlBjNWlhQUl6eTRSSFQzQ3E1SmkyRjR6Q1MvaUlxbkR1cHpHVUg5VFFQd2lOSGxlSTJsS2svMmx3MFhkOHJZCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAxICgweDApCisgICAgICAgIFNlcmlhbCBOdW1iZXI6CisgICAgICAgICAgICAyZDoxYjpmYzo0YToxNzo4ZDphMzo5MTplYjplNzpmZjpmNTo4Yjo0NTpiZTowYgorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDJXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9VVMsIE89VmVyaVNpZ24sIEluYy4sIE9VPUNsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IEphbiAyOSAwMDowMDowMCAxOTk2IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogQXVnICAxIDIzOjU5OjU5IDIwMjggR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89VmVyaVNpZ24sIEluYy4sIE9VPUNsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgxMDI0IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgxMDI0IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmI2OjVhOjhiOmEzOjBkOjZhOjIzOjgzOjgwOjZiOmNmOjM5Ojg3OmY0OgorICAgICAgICAgICAgICAgICAgICAyMToxMzozMzowNjo0YzoyNTphMjplZDo1NToxMjo5NzpjNTphNzo4MDpiOToKKyAgICAgICAgICAgICAgICAgICAgZmE6ODM6YzE6MjA6YTA6ZmE6MmY6MTU6MGQ6N2M6YTE6NjA6NmI6N2U6Nzk6CisgICAgICAgICAgICAgICAgICAgIDJjOmZhOjA2OjBmOjNhOmFlOmY2OjFiOjZmOmIxOmQyOmZmOjJmOjI4OjUyOgorICAgICAgICAgICAgICAgICAgICA1Zjo4Mzo3ZDo0YjpjNDo3YTpiNzpmODo2NjoxZjo4MDo1NDpmYzpiNzpjMjoKKyAgICAgICAgICAgICAgICAgICAgOGU6NTk6NGE6MTQ6NTc6NDY6ZDE6OWE6OTM6YmU6NDE6OTE6MDM6YmI6MTU6CisgICAgICAgICAgICAgICAgICAgIDgwOjkzOjVjOmViOmU3OmNjOjA4OjZjOjNmOjNlOmIzOjRhOmZjOmZmOjRiOgorICAgICAgICAgICAgICAgICAgICA2YzoyMzpkNTo1MDo4MjoyNjo0NDoxOTo4ZToyMzpjMzo3MTplYToxOToyNDoKKyAgICAgICAgICAgICAgICAgICAgNDc6MDQ6OWU6NzU6YmY6Yzg6YTY6MDA6MWYKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQyV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgOGE6MWI6MmI6ZmE6Mzk6YzE6NzQ6ZDc6NWU6ZDg6MTk6NjQ6YTI6NTg6NGE6MmQ6Mzc6ZTA6CisgICAgICAgIDMzOjQ3OjBmOmFjOmVkOmY3OmFhOmRiOjFlOmU0OjhiOjA2OjVjOjYwOjI3OmNhOjQ1OjUyOgorICAgICAgICBjZToxNjplZjozZjowNjo2NDplNzo5NDo2ODo3Yzo2MDozMzoxNToxMTo2OTphZjo5ZDo2MjoKKyAgICAgICAgOGQ6YTM6MDM6NTQ6NmI6YTY6YmU6ZTU6ZWU6MDU6MTg6NjA6MDQ6YmY6NDI6ODA6ZmQ6ZDA6CisgICAgICAgIGE4OmE4OjFlOjAxOjNiOmY3OmEzOjVjOmFmOmEzOmRjOmU2OjI2OjgwOjIzOjNjOmI4OjQ0OgorICAgICAgICA3NDpmNzowYTphZTo0OTo4Yjo2MTo3ODpjYzoyNDpiZjo4ODo4YTphNzowZTplYTo3MzoxOToKKyAgICAgICAgNDE6ZmQ6NGQ6MDM6ZjA6ODg6ZDE6ZTU6Nzg6OGQ6YTU6MmE6NGY6ZjY6OTc6MGQ6MTc6Nzc6CisgICAgICAgIGNhOmQ4CisKK1ZlcmlzaWduIENsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IDJEOkJCOkU1OjI1OkQzOkQxOjY1OjgyOjNBOkI3OjBFOkZBOkU2OkVCOkUyOkUxCitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJREF6Q0NBbXdDRVFDNUwyRE1pSitoZWtZSnVGdHdiSXF2TUEwR0NTcUdTSWIzRFFFQkJRVUFNSUhCTVFzdworQ1FZRFZRUUdFd0pWVXpFWE1CVUdBMVVFQ2hNT1ZtVnlhVk5wWjI0c0lFbHVZeTR4UERBNkJnTlZCQXNUTTBOcworWVhOeklESWdVSFZpYkdsaklGQnlhVzFoY25rZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGtnTFNCSAorTWpFNk1EZ0dBMVVFQ3hNeEtHTXBJREU1T1RnZ1ZtVnlhVk5wWjI0c0lFbHVZeTRnTFNCR2IzSWdZWFYwYUc5eQorYVhwbFpDQjFjMlVnYjI1c2VURWZNQjBHQTFVRUN4TVdWbVZ5YVZOcFoyNGdWSEoxYzNRZ1RtVjBkMjl5YXpBZQorRncwNU9EQTFNVGd3TURBd01EQmFGdzB5T0RBNE1ERXlNelU1TlRsYU1JSEJNUXN3Q1FZRFZRUUdFd0pWVXpFWAorTUJVR0ExVUVDaE1PVm1WeWFWTnBaMjRzSUVsdVl5NHhQREE2QmdOVkJBc1RNME5zWVhOeklESWdVSFZpYkdsagorSUZCeWFXMWhjbmtnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2dMU0JITWpFNk1EZ0dBMVVFQ3hNeAorS0dNcElERTVPVGdnVm1WeWFWTnBaMjRzSUVsdVl5NGdMU0JHYjNJZ1lYVjBhRzl5YVhwbFpDQjFjMlVnYjI1cworZVRFZk1CMEdBMVVFQ3hNV1ZtVnlhVk5wWjI0Z1ZISjFjM1FnVG1WMGQyOXlhekNCbnpBTkJna3Foa2lHOXcwQgorQVFFRkFBT0JqUUF3Z1lrQ2dZRUFwNGdCSVhRczV4b0Q4SmpobHp3UElRanhuTnVYNlpyOHdnUUdFNzVmVXNqTQorSGl3U1ZpeTRBV2tzekprZnJiQ1dybmtFOGhNNXdYdVl1Z2dzNk1LRUV5eXFhZWtKOU1lcEFxUkN3aU5QU3RqdworRHFMN01Xeko1bStaSndmMTV2Uk1lSjV0NjBhRytybUd5VlR5c3NTdjFFWWNXc2tWTVA4TmJQVXREbTNPZjNjQworQXdFQUFUQU5CZ2txaGtpRzl3MEJBUVVGQUFPQmdRQnlMdmwvMGZGeCs4U2U5c1ZlVVlwQW1MaG8rSnNjZzlqaQorbmIzLzdhSG1adW92Q2ZUSzErcWxLNVgySkdDR1RVUXVnNlhFTGFEVHJuaHBiM0xhYks0SThHT1NOK2E3eERBWAorclhmTVNUV3F6OWlQMGI2M0dKWkhjMnBVSWpSa0xiWVdtMWxidEZGWk9yTUxGUFFTMzJlZzlLMHlaRjZ4Um5JbgorakJKN3hVUzByZz09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAxICgweDApCisgICAgICAgIFNlcmlhbCBOdW1iZXI6CisgICAgICAgICAgICBiOToyZjo2MDpjYzo4ODo5ZjphMTo3YTo0NjowOTpiODo1Yjo3MDo2Yzo4YTphZgorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBPPVZlcmlTaWduLCBJbmMuLCBPVT1DbGFzcyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIsIE9VPShjKSAxOTk4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHksIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IE1heSAxOCAwMDowMDowMCAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogQXVnICAxIDIzOjU5OjU5IDIwMjggR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89VmVyaVNpZ24sIEluYy4sIE9VPUNsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMiwgT1U9KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seSwgT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yaworICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6YTc6ODg6MDE6MjE6NzQ6MmM6ZTc6MWE6MDM6ZjA6OTg6ZTE6OTc6M2M6CisgICAgICAgICAgICAgICAgICAgIDBmOjIxOjA4OmYxOjljOmRiOjk3OmU5OjlhOmZjOmMyOjA0OjA2OjEzOmJlOgorICAgICAgICAgICAgICAgICAgICA1Zjo1MjpjODpjYzoxZToyYzoxMjo1NjoyYzpiODowMTo2OToyYzpjYzo5OToKKyAgICAgICAgICAgICAgICAgICAgMWY6YWQ6YjA6OTY6YWU6Nzk6MDQ6ZjI6MTM6Mzk6YzE6N2I6OTg6YmE6MDg6CisgICAgICAgICAgICAgICAgICAgIDJjOmU4OmMyOjg0OjEzOjJjOmFhOjY5OmU5OjA5OmY0OmM3OmE5OjAyOmE0OgorICAgICAgICAgICAgICAgICAgICA0MjpjMjoyMzo0Zjo0YTpkODpmMDowZTphMjpmYjozMTo2YzpjOTplNjo2ZjoKKyAgICAgICAgICAgICAgICAgICAgOTk6Mjc6MDc6ZjU6ZTY6ZjQ6NGM6Nzg6OWU6NmQ6ZWI6NDY6ODY6ZmE6Yjk6CisgICAgICAgICAgICAgICAgICAgIDg2OmM5OjU0OmYyOmIyOmM0OmFmOmQ0OjQ2OjFjOjVhOmM5OjE1OjMwOmZmOgorICAgICAgICAgICAgICAgICAgICAwZDo2YzpmNToyZDowZTo2ZDpjZTo3Zjo3NworICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgNzI6MmU6Zjk6N2Y6ZDE6ZjE6NzE6ZmI6YzQ6OWU6ZjY6YzU6NWU6NTE6OGE6NDA6OTg6Yjg6CisgICAgICAgIDY4OmY4OjliOjFjOjgzOmQ4OmUyOjlkOmJkOmZmOmVkOmExOmU2OjY2OmVhOjJmOjA5OmY0OgorICAgICAgICBjYTpkNzplYTphNToyYjo5NTpmNjoyNDo2MDo4Njo0ZDo0NDoyZTo4MzphNTpjNDoyZDphMDoKKyAgICAgICAgZDM6YWU6Nzg6Njk6NmY6NzI6ZGE6NmM6YWU6MDg6ZjA6NjM6OTI6Mzc6ZTY6YmI6YzQ6MzA6CisgICAgICAgIDE3OmFkOjc3OmNjOjQ5OjM1OmFhOmNmOmQ4OjhmOmQxOmJlOmI3OjE4Ojk2OjQ3OjczOjZhOgorICAgICAgICA1NDoyMjozNDo2NDoyZDpiNjoxNjo5Yjo1OTo1YjpiNDo1MTo1OTozYTpiMzowYjoxNDpmNDoKKyAgICAgICAgMTI6ZGY6Njc6YTA6ZjQ6YWQ6MzI6NjQ6NWU6YjE6NDY6NzI6Mjc6OGM6MTI6N2I6YzU6NDQ6CisgICAgICAgIGI0OmFlCisKK1ZlcmlzaWduIENsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IEY4OkJFOkM0OjYzOjIyOkM5OkE4OjQ2Ojc0OjhCOkI4OjFEOjFFOjRBOjJCOkY2CitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRUdUQ0NBd0VDRUdGd3kwbU1YNWhGS2Vld3B0bFFXM293RFFZSktvWklodmNOQVFFRkJRQXdnY294Q3pBSgorQmdOVkJBWVRBbFZUTVJjd0ZRWURWUVFLRXc1V1pYSnBVMmxuYml3Z1NXNWpMakVmTUIwR0ExVUVDeE1XVm1WeQorYVZOcFoyNGdWSEoxYzNRZ1RtVjBkMjl5YXpFNk1EZ0dBMVVFQ3hNeEtHTXBJREU1T1RrZ1ZtVnlhVk5wWjI0cworSUVsdVl5NGdMU0JHYjNJZ1lYVjBhRzl5YVhwbFpDQjFjMlVnYjI1c2VURkZNRU1HQTFVRUF4TThWbVZ5YVZOcAorWjI0Z1EyeGhjM01nTWlCUWRXSnNhV01nVUhKcGJXRnllU0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMAorZVNBdElFY3pNQjRYRFRrNU1UQXdNVEF3TURBd01Gb1hEVE0yTURjeE5qSXpOVGsxT1Zvd2djb3hDekFKQmdOVgorQkFZVEFsVlRNUmN3RlFZRFZRUUtFdzVXWlhKcFUybG5iaXdnU1c1akxqRWZNQjBHQTFVRUN4TVdWbVZ5YVZOcAorWjI0Z1ZISjFjM1FnVG1WMGQyOXlhekU2TURnR0ExVUVDeE14S0dNcElERTVPVGtnVm1WeWFWTnBaMjRzSUVsdQorWXk0Z0xTQkdiM0lnWVhWMGFHOXlhWHBsWkNCMWMyVWdiMjVzZVRGRk1FTUdBMVVFQXhNOFZtVnlhVk5wWjI0ZworUTJ4aGMzTWdNaUJRZFdKc2FXTWdVSEpwYldGeWVTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVNBdAorSUVjek1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBcndvTnd0VXMyMmU1TGVXVQorSjkybHZ1Q3dUWSt6WVZZODFuekQ5TTAraHN1aWlPTGgyS1JweGJYaXY4R21SMUJlUmptTDFaYTZ0VzhVdnhETworSnhPZUJVZWJNWG9UMkIvWjB3STNpNjBzUi9DT2dRYW5EVEFNNi9jOER5QWQzSEpHN3FVQ3lGdkR5VlpwVE1VWQord1pGN0M5VVRBSnU4NzhOSVBrWmdJSVVxMVpDMnpZdWd6RExkdC8xQVZiSlFIRmF1ekkxM1RjY2dUYWN4ZHU5bwora29xUUhnaUJWckt0YWFOUzBNc2N4Q005SDVuK1RPZ1dZNDdHQ0k3Mk1mYlMrdVYyM2JVY2txTkp6YzBCeldqTgorcVdtNm8rc2REWnlrSUtiQm9NWFJSa3dYYmRLc1pqK1dqT0NFMURiL0lsbkYrUkZncUY4RWZmSWE5aVZDWVEvRQorU3JnK2lRSURBUUFCTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFBMEpoVTh3STFOUTBrZHZla2hrdGRtbkxmZQoreGJqUTVGMWZkaUxBSnZtRU9qcjVqTFg3N0dEeDZNNEVzTWpkcHdPUE1QT1kzNlRtcERIZjB4d0xSdHh5SUQrdQorN2dVOHBETS9Dem1zY0hoelM1a3IzekRDVkxDb08xV2gvaFlvelVLOWRHNkEyeWRFcDg1RVhkUWJrSmdOSGtLVQorc1FBc0JOQjBvd0lGSW1OanpZTzErOEZ0WW10cGRmMWRjRUc1OWI5ODM3N0JNbk1pSVl0WWdYc1ZrWHE2NDJSSQorc0gvN05pWGFsZER4SkJRWDNSaUFhMFlqT1ZUMWptSUpCQjJVa0thYjVpWGlRa1dxdUpDdHZnaVBxUXRDR0pUUAorY2puaHNVUGdLTSszNTFwc0UydEpzLy9qR0h5Sml6TmRyRFBYcC9uYU9sWEpXQkQ1cXU5YXRzOUxTOThxCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAxICgweDApCisgICAgICAgIFNlcmlhbCBOdW1iZXI6CisgICAgICAgICAgICA2MTo3MDpjYjo0OTo4Yzo1Zjo5ODo0NToyOTplNzpiMDphNjpkOTo1MDo1Yjo3YQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBPPVZlcmlTaWduLCBJbmMuLCBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrLCBPVT0oYykgMTk5OSBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5LCBDTj1WZXJpU2lnbiBDbGFzcyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzMKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IE9jdCAgMSAwMDowMDowMCAxOTk5IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogSnVsIDE2IDIzOjU5OjU5IDIwMzYgR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89VmVyaVNpZ24sIEluYy4sIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmssIE9VPShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHksIENOPVZlcmlTaWduIENsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMworICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDIwNDggYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDIwNDggYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6YWY6MGE6MGQ6YzI6ZDU6MmM6ZGI6Njc6Yjk6MmQ6ZTU6OTQ6Mjc6ZGQ6CisgICAgICAgICAgICAgICAgICAgIGE1OmJlOmUwOmIwOjRkOjhmOmIzOjYxOjU2OjNjOmQ2OjdjOmMzOmY0OmNkOgorICAgICAgICAgICAgICAgICAgICAzZTo4NjpjYjphMjo4ODplMjplMTpkODphNDo2OTpjNTpiNTplMjpiZjpjMToKKyAgICAgICAgICAgICAgICAgICAgYTY6NDc6NTA6NWU6NDY6Mzk6OGI6ZDU6OTY6YmE6YjU6NmY6MTQ6YmY6MTA6CisgICAgICAgICAgICAgICAgICAgIGNlOjI3OjEzOjllOjA1OjQ3OjliOjMxOjdhOjEzOmQ4OjFmOmQ5OmQzOjAyOgorICAgICAgICAgICAgICAgICAgICAzNzo4YjphZDoyYzo0NzpmMDo4ZTo4MTowNjphNzowZDozMDowYzplYjpmNzoKKyAgICAgICAgICAgICAgICAgICAgM2M6MGY6MjA6MWQ6ZGM6NzI6NDY6ZWU6YTU6MDI6Yzg6NWI6YzM6Yzk6NTY6CisgICAgICAgICAgICAgICAgICAgIDY5OjRjOmM1OjE4OmMxOjkxOjdiOjBiOmQ1OjEzOjAwOjliOmJjOmVmOmMzOgorICAgICAgICAgICAgICAgICAgICA0ODozZTo0Njo2MDoyMDo4NToyYTpkNTo5MDpiNjpjZDo4YjphMDpjYzozMjoKKyAgICAgICAgICAgICAgICAgICAgZGQ6Yjc6ZmQ6NDA6NTU6YjI6NTA6MWM6NTY6YWU6Y2M6OGQ6Nzc6NGQ6Yzc6CisgICAgICAgICAgICAgICAgICAgIDIwOjRkOmE3OjMxOjc2OmVmOjY4OjkyOjhhOjkwOjFlOjA4OjgxOjU2OmIyOgorICAgICAgICAgICAgICAgICAgICBhZDo2OTphMzo1MjpkMDpjYjoxYzpjNDoyMzozZDoxZjo5OTpmZTo0YzplODoKKyAgICAgICAgICAgICAgICAgICAgMTY6NjM6OGU6YzY6MDg6OGU6ZjY6MzE6ZjY6ZDI6ZmE6ZTU6NzY6ZGQ6YjU6CisgICAgICAgICAgICAgICAgICAgIDFjOjkyOmEzOjQ5OmNkOmNkOjAxOmNkOjY4OmNkOmE5OjY5OmJhOmEzOmViOgorICAgICAgICAgICAgICAgICAgICAxZDowZDo5YzphNDoyMDphNjpjMTphMDpjNTpkMTo0Njo0YzoxNzo2ZDpkMjoKKyAgICAgICAgICAgICAgICAgICAgYWM6NjY6M2Y6OTY6OGM6ZTA6ODQ6ZDQ6MzY6ZmY6MjI6NTk6YzU6Zjk6MTE6CisgICAgICAgICAgICAgICAgICAgIDYwOmE4OjVmOjA0OjdkOmYyOjFhOmY2OjI1OjQyOjYxOjBmOmM0OjRhOmI4OgorICAgICAgICAgICAgICAgICAgICAzZTo4OQorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgMzQ6MjY6MTU6M2M6YzA6OGQ6NGQ6NDM6NDk6MWQ6YmQ6ZTk6MjE6OTI6ZDc6NjY6OWM6Yjc6CisgICAgICAgIGRlOmM1OmI4OmQwOmU0OjVkOjVmOjc2OjIyOmMwOjI2OmY5Ojg0OjNhOjNhOmY5OjhjOmI1OgorICAgICAgICBmYjplYzo2MDpmMTplODpjZTowNDpiMDpjODpkZDphNzowMzo4ZjozMDpmMzo5ODpkZjphNDoKKyAgICAgICAgZTY6YTQ6MzE6ZGY6ZDM6MWM6MGI6NDY6ZGM6NzI6MjA6M2Y6YWU6ZWU6MDU6M2M6YTQ6MzM6CisgICAgICAgIDNmOjBiOjM5OmFjOjcwOjc4OjczOjRiOjk5OjJiOmRmOjMwOmMyOjU0OmIwOmE4OjNiOjU1OgorICAgICAgICBhMTpmZToxNjoyODpjZDo0MjpiZDo3NDo2ZTo4MDpkYjoyNzo0NDphNzpjZTo0NDo1ZDpkNDoKKyAgICAgICAgMWI6OTA6OTg6MGQ6MWU6NDI6OTQ6YjE6MDA6MmM6MDQ6ZDA6NzQ6YTM6MDI6MDU6MjI6NjM6CisgICAgICAgIDYzOmNkOjgzOmI1OmZiOmMxOjZkOjYyOjZiOjY5Ojc1OmZkOjVkOjcwOjQxOmI5OmY1OmJmOgorICAgICAgICA3YzpkZjpiZTpjMTozMjo3MzoyMjoyMTo4Yjo1ODo4MTo3YjoxNTo5MTo3YTpiYTplMzo2NDoKKyAgICAgICAgNDg6YjA6N2Y6ZmI6MzY6MjU6ZGE6OTU6ZDA6ZjE6MjQ6MTQ6MTc6ZGQ6MTg6ODA6NmI6NDY6CisgICAgICAgIDIzOjM5OjU0OmY1OjhlOjYyOjA5OjA0OjFkOjk0OjkwOmE2OjliOmU2OjI1OmUyOjQyOjQ1OgorICAgICAgICBhYTpiODo5MDphZDpiZTowODo4ZjphOTowYjo0MjoxODo5NDpjZjo3MjozOTplMTpiMTo0MzoKKyAgICAgICAgZTA6Mjg6Y2Y6Yjc6ZTc6NWE6NmM6MTM6NmI6NDk6YjM6ZmY6ZTM6MTg6N2M6ODk6OGI6MzM6CisgICAgICAgIDVkOmFjOjMzOmQ3OmE3OmY5OmRhOjNhOjU1OmM5OjU4OjEwOmY5OmFhOmVmOjVhOmI2OmNmOgorICAgICAgICA0Yjo0YjpkZjoyYQorCitWZXJpc2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IDEwOkZDOjYzOjVEOkY2OjI2OjNFOjBEOkYzOjI1OkJFOjVGOjc5OkNEOjY3OjY3CitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQ1BEQ0NBYVVDRUhDNjVCMFEyU2swdGpqS2V3UE11cjh3RFFZSktvWklodmNOQVFFQ0JRQXdYekVMTUFrRworQTFVRUJoTUNWVk14RnpBVkJnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNVGN3TlFZRFZRUUxFeTVEYkdGegorY3lBeklGQjFZbXhwWXlCUWNtbHRZWEo1SUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNQjRYRFRrMgorTURFeU9UQXdNREF3TUZvWERUSTRNRGd3TVRJek5UazFPVm93WHpFTE1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVgorQkFvVERsWmxjbWxUYVdkdUxDQkpibU11TVRjd05RWURWUVFMRXk1RGJHRnpjeUF6SUZCMVlteHBZeUJRY21sdAorWVhKNUlFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTgorQURDQmlRS0JnUURKWEZtZThodUtBUlMwRU44RVFOdmpWNjlxUlVDUGhBd0wwVFBaMlJIUDdnSllIeVgzS3FoRQorQmFyc0F4OTRmNTZUdVpvQXFpTjkxcXlGb21ORngzSW56UFJNeG5WeDBqbnZUMEx3ZGQ4S2tNYU9JRytZRC9pcworSTE5d0tUYWt5WWJuc1pvZ3kxT2xoZWM5dm4yYS9pUkZNOXgyRmUwUG9uRmtUR1V1Z1doRnB3SURBUUFCTUEwRworQ1NxR1NJYjNEUUVCQWdVQUE0R0JBTHRNRWl2UExDWUFUeFFUM2FiNy9Bb1JoSXp6S0J4bmtpOTh0c1g2My9EbworbGJ3ZGoyd3NxRkhNYzlpa3dGUHdUdFltd0hZQlY0R1NYaUh4MGJILzU5QWhXTTFwRitORUhKd1pSRG1KWE55YworQUE5V2pRS1o3YUtRUlV6a3V4Q2tQZkF5QXc3eHp2am95VkdNNW1LZjVwL0FmYmR5bk1rMk9tdWZUcWovWkExaworLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMSAoMHgwKQorICAgICAgICBTZXJpYWwgTnVtYmVyOgorICAgICAgICAgICAgNzA6YmE6ZTQ6MWQ6MTA6ZDk6Mjk6MzQ6YjY6Mzg6Y2E6N2I6MDM6Y2M6YmE6YmYKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQyV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBPPVZlcmlTaWduLCBJbmMuLCBPVT1DbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBKYW4gMjkgMDA6MDA6MDAgMTk5NiBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEF1ZyAgMSAyMzo1OTo1OSAyMDI4IEdNVAorICAgICAgICBTdWJqZWN0OiBDPVVTLCBPPVZlcmlTaWduLCBJbmMuLCBPVT1DbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMTAyNCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMTAyNCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDpjOTo1Yzo1OTo5ZTpmMjoxYjo4YTowMToxNDpiNDoxMDpkZjowNDo0MDoKKyAgICAgICAgICAgICAgICAgICAgZGI6ZTM6NTc6YWY6NmE6NDU6NDA6OGY6ODQ6MGM6MGI6ZDE6MzM6ZDk6ZDk6CisgICAgICAgICAgICAgICAgICAgIDExOmNmOmVlOjAyOjU4OjFmOjI1OmY3OjJhOmE4OjQ0OjA1OmFhOmVjOjAzOgorICAgICAgICAgICAgICAgICAgICAxZjo3ODo3Zjo5ZTo5MzpiOTo5YTowMDphYToyMzo3ZDpkNjphYzo4NTphMjoKKyAgICAgICAgICAgICAgICAgICAgNjM6NDU6Yzc6NzI6Mjc6Y2M6ZjQ6NGM6YzY6NzU6NzE6ZDI6Mzk6ZWY6NGY6CisgICAgICAgICAgICAgICAgICAgIDQyOmYwOjc1OmRmOjBhOjkwOmM2OjhlOjIwOjZmOjk4OjBmOmY4OmFjOjIzOgorICAgICAgICAgICAgICAgICAgICA1Zjo3MDoyOTozNjphNDpjOTo4NjplNzpiMTo5YToyMDpjYjo1MzphNTo4NToKKyAgICAgICAgICAgICAgICAgICAgZTc6M2Q6YmU6N2Q6OWE6ZmU6MjQ6NDU6MzM6ZGM6NzY6MTU6ZWQ6MGY6YTI6CisgICAgICAgICAgICAgICAgICAgIDcxOjY0OjRjOjY1OjJlOjgxOjY4OjQ1OmE3CisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kMldpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIGJiOjRjOjEyOjJiOmNmOjJjOjI2OjAwOjRmOjE0OjEzOmRkOmE2OmZiOmZjOjBhOjExOjg0OgorICAgICAgICA4YzpmMzoyODoxYzo2Nzo5MjoyZjo3YzpiNjpjNTpmYTpkZjpmMDplODo5NTpiYzoxZDo4ZjoKKyAgICAgICAgNmM6MmM6YTg6NTE6Y2M6NzM6ZDg6YTQ6YzA6NTM6ZjA6NGU6ZDY6MjY6YzA6NzY6MDE6NTc6CisgICAgICAgIDgxOjkyOjVlOjIxOmYxOmQxOmIxOmZmOmU3OmQwOjIxOjU4OmNkOjY5OjE3OmUzOjQ0OjFjOgorICAgICAgICA5YzoxOTo0NDozOTo4OTo1YzpkYzo5YzowMDowZjo1Njo4ZDowMjo5OTplZDphMjo5MDo0NToKKyAgICAgICAgNGM6ZTQ6YmI6MTA6YTQ6M2Q6ZjA6MzI6MDM6MGU6ZjE6Y2U6Zjg6ZTg6Yzk6NTE6OGM6ZTY6CisgICAgICAgIDYyOjlmOmU2OjlmOmMwOjdkOmI3OjcyOjljOmM5OjM2OjNhOjZiOjlmOjRlOmE4OmZmOjY0OgorICAgICAgICAwZDo2NAorCitWZXJpc2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiBBMjozMzo5Qjo0Qzo3NDo3ODo3MzpENDo2QzpFNzpDMTpGMzo4RDpDQjo1QzpFOQorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURBakNDQW1zQ0VIM1ovZ2ZQcUI2M0VIbG4rNmVKTk1Zd0RRWUpLb1pJaHZjTkFRRUZCUUF3Z2NFeEN6QUoKK0JnTlZCQVlUQWxWVE1SY3dGUVlEVlFRS0V3NVdaWEpwVTJsbmJpd2dTVzVqTGpFOE1Eb0dBMVVFQ3hNelEyeGgKK2MzTWdNeUJRZFdKc2FXTWdVSEpwYldGeWVTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVNBdElFY3kKK01Ub3dPQVlEVlFRTEV6RW9ZeWtnTVRrNU9DQldaWEpwVTJsbmJpd2dTVzVqTGlBdElFWnZjaUJoZFhSb2IzSnAKK2VtVmtJSFZ6WlNCdmJteDVNUjh3SFFZRFZRUUxFeFpXWlhKcFUybG5iaUJVY25WemRDQk9aWFIzYjNKck1CNFgKK0RUazRNRFV4T0RBd01EQXdNRm9YRFRJNE1EZ3dNVEl6TlRrMU9Wb3dnY0V4Q3pBSkJnTlZCQVlUQWxWVE1SY3cKK0ZRWURWUVFLRXc1V1pYSnBVMmxuYml3Z1NXNWpMakU4TURvR0ExVUVDeE16UTJ4aGMzTWdNeUJRZFdKc2FXTWcKK1VISnBiV0Z5ZVNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlU0F0SUVjeU1Ub3dPQVlEVlFRTEV6RW8KK1l5a2dNVGs1T0NCV1pYSnBVMmxuYml3Z1NXNWpMaUF0SUVadmNpQmhkWFJvYjNKcGVtVmtJSFZ6WlNCdmJteDUKK01SOHdIUVlEVlFRTEV4WldaWEpwVTJsbmJpQlVjblZ6ZENCT1pYUjNiM0pyTUlHZk1BMEdDU3FHU0liM0RRRUIKK0FRVUFBNEdOQURDQmlRS0JnUURNWHRFUlhWeHAwS3ZUdVdwTW1SOVptRENPRm9VZ1JtMUhQOVNGSUlUaGJiUDQKK3BPME04UmNQTy9tbitTWFh3YytFWS9KOFk4K2lSL0xHV3pPT1pFQUVhTUdBdVdRY1JYZkgyRzcxbFNrOFVPZzAKKzEzZ2ZxTHB0UTVHVmowVlhYbjdGKzhxa0JPdnFsemRVTUcrN0FVY3lNODNjVjV0a2FXSDRteDBjaVU5Y1p3SUQKK0FRQUJNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0R0JBRkZOemI1Y3k1Z1puQld5QVRsNExrMFBaM0J3bWNZUVdwU2sKK1UwMVViU3V2RFYxQWkyVFQxKzdlVm1HU1g2YkVIUkJoTnRNc0p6em9LUW01RVdSMHpMVnpueHhJcWJ4aEFlN2kKK0Y2WU00MEFJT3c3bjYwUnpLcHJ4YVpMdmNSVERPYXh4cDVFSmIrUnhCck82V1ZjbWVRRDIrQTJpTXpBbzFLcFkKK29KMmRhWkg5CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAxICgweDApCisgICAgICAgIFNlcmlhbCBOdW1iZXI6CisgICAgICAgICAgICA3ZDpkOTpmZTowNzpjZjphODoxZTpiNzoxMDo3OTo2NzpmYjphNzo4OTozNDpjNgorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBPPVZlcmlTaWduLCBJbmMuLCBPVT1DbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIsIE9VPShjKSAxOTk4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHksIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IE1heSAxOCAwMDowMDowMCAxOTk4IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogQXVnICAxIDIzOjU5OjU5IDIwMjggR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89VmVyaVNpZ24sIEluYy4sIE9VPUNsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMiwgT1U9KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seSwgT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yaworICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMjQgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMjQgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6Y2M6NWU6ZDE6MTE6NWQ6NWM6Njk6ZDA6YWI6ZDM6Yjk6NmE6NGM6OTk6CisgICAgICAgICAgICAgICAgICAgIDFmOjU5Ojk4OjMwOjhlOjE2Ojg1OjIwOjQ2OjZkOjQ3OjNmOmQ0Ojg1OjIwOgorICAgICAgICAgICAgICAgICAgICA4NDplMTo2ZDpiMzpmODphNDplZDowYzpmMToxNzowZjozYjpmOTphNzpmOToKKyAgICAgICAgICAgICAgICAgICAgMjU6ZDc6YzE6Y2Y6ODQ6NjM6ZjI6N2M6NjM6Y2Y6YTI6NDc6ZjI6YzY6NWI6CisgICAgICAgICAgICAgICAgICAgIDMzOjhlOjY0OjQwOjA0OjY4OmMxOjgwOmI5OjY0OjFjOjQ1Ojc3OmM3OmQ4OgorICAgICAgICAgICAgICAgICAgICA2ZTpmNTo5NToyOTozYzo1MDplODozNDpkNzo3ODoxZjphODpiYTo2ZDo0MzoKKyAgICAgICAgICAgICAgICAgICAgOTE6OTU6OGY6NDU6NTc6NWU6N2U6YzU6ZmI6Y2E6YTQ6MDQ6ZWI6ZWE6OTc6CisgICAgICAgICAgICAgICAgICAgIDM3OjU0OjMwOjZmOmJiOjAxOjQ3OjMyOjMzOmNkOmRjOjU3OjliOjY0OjY5OgorICAgICAgICAgICAgICAgICAgICA2MTpmODo5YjoxZDoxYzo4OTo0Zjo1Yzo2NworICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgNTE6NGQ6Y2Q6YmU6NWM6Y2I6OTg6MTk6OWM6MTU6YjI6MDE6Mzk6Nzg6MmU6NGQ6MGY6Njc6CisgICAgICAgIDcwOjcwOjk5OmM2OjEwOjVhOjk0OmE0OjUzOjRkOjU0OjZkOjJiOmFmOjBkOjVkOjQwOjhiOgorICAgICAgICA2NDpkMzpkNzplZTpkZTo1Njo2MTo5Mjo1ZjphNjpjNDoxZDoxMDo2MTozNjpkMzoyYzoyNzoKKyAgICAgICAgM2M6ZTg6Mjk6MDk6Yjk6MTE6NjQ6NzQ6Y2M6YjU6NzM6OWY6MWM6NDg6YTk6YmM6NjE6MDE6CisgICAgICAgIGVlOmUyOjE3OmE2OjBjOmUzOjQwOjA4OjNiOjBlOmU3OmViOjQ0OjczOjJhOjlhOmYxOjY5OgorICAgICAgICA5MjplZjo3MToxNDpjMzozOTphYzo3MTphNzo5MTowOTo2ZjplNDo3MTowNjpiMzpiYTo1OToKKyAgICAgICAgNTc6MjY6Nzk6MDA6ZjY6Zjg6MGQ6YTI6MzM6MzA6Mjg6ZDQ6YWE6NTg6YTA6OWQ6OWQ6Njk6CisgICAgICAgIDkxOmZkCisKK1ZlcmlzaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IENEOjY4OkI2OkE3OkM3OkM0OkNFOjc1OkUwOjFEOjRGOjU3OjQ0OjYxOjkyOjA5CitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRUdqQ0NBd0lDRVFDYmZnWkpvejVpdWRYdWtFaHhLZTlYTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUhLTVFzdworQ1FZRFZRUUdFd0pWVXpFWE1CVUdBMVVFQ2hNT1ZtVnlhVk5wWjI0c0lFbHVZeTR4SHpBZEJnTlZCQXNURmxabAorY21sVGFXZHVJRlJ5ZFhOMElFNWxkSGR2Y21zeE9qQTRCZ05WQkFzVE1TaGpLU0F4T1RrNUlGWmxjbWxUYVdkdQorTENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hSVEJEQmdOVkJBTVRQRlpsY21sVAorYVdkdUlFTnNZWE56SURNZ1VIVmliR2xqSUZCeWFXMWhjbmtnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcAorZEhrZ0xTQkhNekFlRncwNU9URXdNREV3TURBd01EQmFGdzB6TmpBM01UWXlNelU1TlRsYU1JSEtNUXN3Q1FZRAorVlFRR0V3SlZVekVYTUJVR0ExVUVDaE1PVm1WeWFWTnBaMjRzSUVsdVl5NHhIekFkQmdOVkJBc1RGbFpsY21sVAorYVdkdUlGUnlkWE4wSUU1bGRIZHZjbXN4T2pBNEJnTlZCQXNUTVNoaktTQXhPVGs1SUZabGNtbFRhV2R1TENCSgorYm1NdUlDMGdSbTl5SUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreFJUQkRCZ05WQkFNVFBGWmxjbWxUYVdkdQorSUVOc1lYTnpJRE1nVUhWaWJHbGpJRkJ5YVcxaGNua2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZworTFNCSE16Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU11Nm5GTDhlQjhhSG04YgorTjNPOStNbHJsQkl3VC9BMlIvWFFrUXIxRjhpbFljRVdRRTM3aW1HUTVYWWd3UkVHZmFzc2JxYjFFVUdPK2kydAorS21GWnBHY21UTkRvdkZKYmNDQUVXTkY2eWFScHZJTVhaSzBGaTd6UVdNNk5qUFhyOEVKSkM1MlhKMmN5YnVHdQora3hVY2NMd2dUUzhZM3BLSTZHeUZWeEVhNlg3akpoRlVva1dXVllQS01Jbm8zTmlqN1NxQVAzOTVaVmMrRlNCbQorQ0MrVms3K3FSeStvUnBmd0V1TCt3Z29yVWVaMjVyZEd0K0lOcHN5b3cweFpWWW5tNkZOY0hPcWQ4R0lXQzZmSgorWHd6dzNzSjJ6cS8zYXZMNlFhYWlNeFRKNVhwajA1NWlOOVdGWlo0TzVsTWtkQnRlSFJKVFc4Y3M1NE5KT3hXdQoraW1pNVY1Y0NBd0VBQVRBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQUVSU1d3YXVTQ1BjL0w4bXkvdVJhbjJUZQorMnlGUGhwazBkalpYM2RBVkw4V3RmeFVmTjJKelB0VG5YODRYQTlzMStpdmJybUFKWHg1ZmoyNjdDejNxV2hNZQorREdCdnRjQzFJeUl1Qnd2THFYVExSN3Nkd2RlbGE4d3Ywa0w5U2QybmljOVR1dG9BV2lpL2d0LzR1aE1kVUlhQworL1k0d2p5bEdzQjQ5TmRvNFloWVlTcTNtdGxGczNxOWk2d0hRSGlUK2VvOFNHaEpvdVB0bW1SUVVSVnl1NTY1cAorRjRFcldqZkpYaXIweHVLaFhGU2JwbFFBei9EeHdjZVlNQm83TmhiYm8yN3EvYTJ5d3RydkFrY1Rpc0R4c3pHdAorVHh6aFQ1eXZEd3lkOTNnTjJQUTFWb0RhdDIwWGo1MGVnV1RoL3NWRnVxMXJ1UXA2VGs5TGhPNUw4WDNkRVE9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMSAoMHgwKQorICAgICAgICBTZXJpYWwgTnVtYmVyOgorICAgICAgICAgICAgOWI6N2U6MDY6NDk6YTM6M2U6NjI6Yjk6ZDU6ZWU6OTA6NDg6NzE6Mjk6ZWY6NTcKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1VUywgTz1WZXJpU2lnbiwgSW5jLiwgT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yaywgT1U9KGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seSwgQ049VmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBPY3QgIDEgMDA6MDA6MDAgMTk5OSBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEp1bCAxNiAyMzo1OTo1OSAyMDM2IEdNVAorICAgICAgICBTdWJqZWN0OiBDPVVTLCBPPVZlcmlTaWduLCBJbmMuLCBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrLCBPVT0oYykgMTk5OSBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5LCBDTj1WZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzMKKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgyMDQ4IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgyMDQ4IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmNiOmJhOjljOjUyOmZjOjc4OjFmOjFhOjFlOjZmOjFiOjM3OjczOmJkOgorICAgICAgICAgICAgICAgICAgICBmODpjOTo2Yjo5NDoxMjozMDo0ZjpmMDozNjo0NzpmNTpkMDo5MTowYTpmNToKKyAgICAgICAgICAgICAgICAgICAgMTc6Yzg6YTU6NjE6YzE6MTY6NDA6NGQ6ZmI6OGE6NjE6OTA6ZTU6NzY6MjA6CisgICAgICAgICAgICAgICAgICAgIGMxOjExOjA2OjdkOmFiOjJjOjZlOmE2OmY1OjExOjQxOjhlOmZhOjJkOmFkOgorICAgICAgICAgICAgICAgICAgICAyYTo2MTo1OTphNDo2NzoyNjo0YzpkMDplODpiYzo1Mjo1Yjo3MDoyMDowNDoKKyAgICAgICAgICAgICAgICAgICAgNTg6ZDE6N2E6Yzk6YTQ6Njk6YmM6ODM6MTc6NjQ6YWQ6MDU6OGI6YmM6ZDA6CisgICAgICAgICAgICAgICAgICAgIDU4OmNlOjhkOjhjOmY1OmViOmYwOjQyOjQ5OjBiOjlkOjk3OjI3OjY3OjMyOgorICAgICAgICAgICAgICAgICAgICA2ZTplMTphZTo5MzoxNToxYzo3MDpiYzoyMDo0ZDoyZjoxODpkZTo5Mjo4ODoKKyAgICAgICAgICAgICAgICAgICAgZTg6NmM6ODU6NTc6MTE6MWE6ZTk6N2U6ZTM6MjY6MTE6NTQ6YTI6NDU6OTY6CisgICAgICAgICAgICAgICAgICAgIDU1OjgzOmNhOjMwOjg5OmU4OmRjOmQ4OmEzOmVkOjJhOjgwOjNmOjdmOjc5OgorICAgICAgICAgICAgICAgICAgICA2NTo1NzozZToxNToyMDo2NjowODoyZjo5NTo5MzpiZjphYTo0NzoyZjphODoKKyAgICAgICAgICAgICAgICAgICAgNDY6OTc6ZjA6MTI6ZTI6ZmU6YzI6MGE6MmI6NTE6ZTY6NzY6ZTY6Yjc6NDY6CisgICAgICAgICAgICAgICAgICAgIGI3OmUyOjBkOmE2OmNjOmE4OmMzOjRjOjU5OjU1Ojg5OmU2OmU4OjUzOjVjOgorICAgICAgICAgICAgICAgICAgICAxYzplYTo5ZDpmMDo2MjoxNjowYjphNzpjOTo1ZjowYzpmMDpkZTpjMjo3NjoKKyAgICAgICAgICAgICAgICAgICAgY2U6YWY6Zjc6NmE6ZjI6ZmE6NDE6YTY6YTI6MzM6MTQ6Yzk6ZTU6N2E6NjM6CisgICAgICAgICAgICAgICAgICAgIGQzOjllOjYyOjM3OmQ1Ojg1OjY1OjllOjBlOmU2OjUzOjI0Ojc0OjFiOjVlOgorICAgICAgICAgICAgICAgICAgICAxZDoxMjo1Mzo1YjpjNzoyYzplNzo4Mzo0OTozYjoxNTphZTo4YTo2ODpiOToKKyAgICAgICAgICAgICAgICAgICAgNTc6OTcKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDExOjE0Ojk2OmMxOmFiOjkyOjA4OmY3OjNmOjJmOmM5OmIyOmZlOmU0OjVhOjlmOjY0OmRlOgorICAgICAgICBkYjoyMTo0Zjo4Njo5OTozNDo3NjozNjo1NzpkZDpkMDoxNToyZjpjNTphZDo3ZjoxNToxZjoKKyAgICAgICAgMzc6NjI6NzM6M2U6ZDQ6ZTc6NWY6Y2U6MTc6MDM6ZGI6MzU6ZmE6MmI6ZGI6YWU6NjA6MDk6CisgICAgICAgIDVmOjFlOjVmOjhmOjZlOmJiOjBiOjNkOmVhOjVhOjEzOjFlOjBjOjYwOjZmOmI1OmMwOmI1OgorICAgICAgICAyMzoyMjoyZTowNzowYjpjYjphOTo3NDpjYjo0NzpiYjoxZDpjMTpkNzphNTo2YjpjYzoyZjoKKyAgICAgICAgZDI6NDI6ZmQ6NDk6ZGQ6YTc6ODk6Y2Y6NTM6YmE6ZGE6MDA6NWE6Mjg6YmY6ODI6ZGY6Zjg6CisgICAgICAgIGJhOjEzOjFkOjUwOjg2OjgyOmZkOjhlOjMwOjhmOjI5OjQ2OmIwOjFlOjNkOjM1OmRhOjM4OgorICAgICAgICA2MjoxNjoxODo0YTphZDplNjpiNjo1MTo2YzpkZTphZjo2MjplYjowMTpkMDoxZToyNDpmZToKKyAgICAgICAgN2E6OGY6MTI6MWE6MTI6Njg6Yjg6ZmI6NjY6OTk6MTQ6MTQ6NDU6NWM6YWU6ZTc6YWU6Njk6CisgICAgICAgIDE3OjgxOjJiOjVhOjM3OmM5OjVlOjJhOmY0OmM2OmUyOmExOjVjOjU0OjliOmE2OjU0OjAwOgorICAgICAgICBjZjpmMDpmMTpjMTpjNzo5ODozMDoxYTozYjozNjoxNjpkYjphMzo2ZTplYTpmZDphZDpiMjoKKyAgICAgICAgYzI6ZGE6ZWY6MDI6NDc6MTM6OGE6YzA6ZjE6YjM6MzE6YWQ6NGY6MWM6ZTE6NGY6OWM6YWY6CisgICAgICAgIDBmOjBjOjlkOmY3Ojc4OjBkOmQ4OmY0OjM1OjU2OjgwOmRhOmI3OjZkOjE3OjhmOjlkOjFlOgorICAgICAgICA4MTo2NDplMTpmZTpjNTo0NTpiYTphZDo2YjpiOTowYTo3YTo0ZTo0Zjo0Yjo4NDplZTo0YjoKKyAgICAgICAgZjE6N2Q6ZGQ6MTEKKworVmVyaXNpZ24gQ2xhc3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK01ENSBGaW5nZXJwcmludDogMjY6NkQ6MkM6MTk6OTg6QjY6NzA6Njg6Mzg6NTA6NTQ6MTk6RUM6OTA6MzQ6NjAKK1BFTSBEYXRhOgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEQWpDQ0Ftc0NFREtJanByUzllc1RSL2gveENBM0pmZ3dEUVlKS29aSWh2Y05BUUVGQlFBd2djRXhDekFKCitCZ05WQkFZVEFsVlRNUmN3RlFZRFZRUUtFdzVXWlhKcFUybG5iaXdnU1c1akxqRThNRG9HQTFVRUN4TXpRMnhoCitjM01nTkNCUWRXSnNhV01nVUhKcGJXRnllU0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVTQXRJRWN5CitNVG93T0FZRFZRUUxFekVvWXlrZ01UazVPQ0JXWlhKcFUybG5iaXdnU1c1akxpQXRJRVp2Y2lCaGRYUm9iM0pwCitlbVZrSUhWelpTQnZibXg1TVI4d0hRWURWUVFMRXhaV1pYSnBVMmxuYmlCVWNuVnpkQ0JPWlhSM2IzSnJNQjRYCitEVGs0TURVeE9EQXdNREF3TUZvWERUSTRNRGd3TVRJek5UazFPVm93Z2NFeEN6QUpCZ05WQkFZVEFsVlRNUmN3CitGUVlEVlFRS0V3NVdaWEpwVTJsbmJpd2dTVzVqTGpFOE1Eb0dBMVVFQ3hNelEyeGhjM01nTkNCUWRXSnNhV01nCitVSEpwYldGeWVTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVNBdElFY3lNVG93T0FZRFZRUUxFekVvCitZeWtnTVRrNU9DQldaWEpwVTJsbmJpd2dTVzVqTGlBdElFWnZjaUJoZFhSb2IzSnBlbVZrSUhWelpTQnZibXg1CitNUjh3SFFZRFZRUUxFeFpXWlhKcFUybG5iaUJVY25WemRDQk9aWFIzYjNKck1JR2ZNQTBHQ1NxR1NJYjNEUUVCCitBUVVBQTRHTkFEQ0JpUUtCZ1FDNjhPVFArY1N1aFZTNUIxZjVqOFYvYUJINHhCZXdSTnpqTUhQVkttSXF1TkRNCitITzBvVzM2OWF0eXprU1RLUVdJOC9BSUJ2eHdXTVpRRmwzWnVvcTI5WVJkc1RqQ0c4RkUzS2xESHFHS0IzRnRLCitxc0dndEc3ckwrVlh4YkVyUUhEYldrMmhqaCs5QXgvWUE5U1BUSmx4dk9LQ3pGam9tRHFHMDRZNDh3QXBId0lECitBUUFCTUEwR0NTcUdTSWIzRFFFQkJRVUFBNEdCQUlXTUVzR251VkFWZXNzK3JMaERpdHlxM1JTNmlZRitBVHdqCitjU0dJTDRMY1kvb0NSYXhGV2RjcVdFUmJ0NStCTzVKb1BlSTNKUFY3Ykk5Mk5aWUpxRm1kdWM0anEzVFdnLzB5CitjeWZZYVQ1RGRQYXV4WW1hNTFOODZYdjJTL1BCWllQZWpZcWNQSWlOT1ZuOHFqOGlqYUhCWmxDQmNrenRJbVJQCitUOHFBa2JZcAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQ2VydGlmaWNhdGUgSW5ncmVkaWVudHM6CisgICAgRGF0YToKKyAgICAgICAgVmVyc2lvbjogMSAoMHgwKQorICAgICAgICBTZXJpYWwgTnVtYmVyOgorICAgICAgICAgICAgMzI6ODg6OGU6OWE6ZDI6ZjU6ZWI6MTM6NDc6Zjg6N2Y6YzQ6MjA6Mzc6MjU6ZjgKKyAgICAgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1VUywgTz1WZXJpU2lnbiwgSW5jLiwgT1U9Q2xhc3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyLCBPVT0oYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5LCBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBNYXkgMTggMDA6MDA6MDAgMTk5OCBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEF1ZyAgMSAyMzo1OTo1OSAyMDI4IEdNVAorICAgICAgICBTdWJqZWN0OiBDPVVTLCBPPVZlcmlTaWduLCBJbmMuLCBPVT1DbGFzcyA0IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIsIE9VPShjKSAxOTk4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHksIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsKKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgxMDI0IGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgxMDI0IGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmJhOmYwOmU0OmNmOmY5OmM0OmFlOjg1OjU0OmI5OjA3OjU3OmY5OjhmOgorICAgICAgICAgICAgICAgICAgICBjNTo3Zjo2ODoxMTpmODpjNDoxNzpiMDo0NDpkYzplMzozMDo3MzpkNToyYToKKyAgICAgICAgICAgICAgICAgICAgNjI6MmE6Yjg6ZDA6Y2M6MWM6ZWQ6Mjg6NWI6N2U6YmQ6NmE6ZGM6YjM6OTE6CisgICAgICAgICAgICAgICAgICAgIDI0OmNhOjQxOjYyOjNjOmZjOjAyOjAxOmJmOjFjOjE2OjMxOjk0OjA1Ojk3OgorICAgICAgICAgICAgICAgICAgICA3Njo2ZTphMjphZDpiZDo2MToxNzo2Yzo0ZTozMDo4NjpmMDo1MTozNzoyYToKKyAgICAgICAgICAgICAgICAgICAgNTA6Yzc6YTg6NjI6ODE6ZGM6NWI6NGE6YWE6YzE6YTA6YjQ6NmU6ZWI6MmY6CisgICAgICAgICAgICAgICAgICAgIGU1OjU3OmM1OmIxOjJiOjQwOjcwOmRiOjVhOjRkOmExOjhlOjFmOmJkOjAzOgorICAgICAgICAgICAgICAgICAgICAxZjpkODowMzpkNDo4Zjo0Yzo5OTo3MTpiYzplMjo4MjpjYzo1ODplODo5ODoKKyAgICAgICAgICAgICAgICAgICAgM2E6ODY6ZDM6ODY6Mzg6ZjM6MDA6Mjk6MWYKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDg1OjhjOjEyOmMxOmE3OmI5OjUwOjE1OjdhOmNiOjNlOmFjOmI4OjQzOjhhOmRjOmFhOmRkOgorICAgICAgICAxNDpiYTo4OTo4MTo3ZTowMTozYzoyMzo3MToyMTo4ODoyZjo4MjpkYzo2MzpmYTowMjo0NToKKyAgICAgICAgYWM6NDU6NTk6ZDc6MmE6NTg6NDQ6NWI6Yjc6OWY6ODE6M2I6OTI6Njg6M2Q6ZTI6Mzc6MjQ6CisgICAgICAgIGY1OjdiOjZjOjhmOjc2OjM1Ojk2OjA5OmE4OjU5OjlkOmI5OmNlOjIzOmFiOjc0OmQ2OjgzOgorICAgICAgICBmZDozMjo3MzoyNzpkODo2OTozZTo0Mzo3NDpmNjphZTpjNTo4OTo5YTplNzo1Mzo3YzplOToKKyAgICAgICAgN2I6ZjY6NGI6ZjM6YzE6NjU6ODM6ZGU6OGQ6OGE6OWM6M2M6ODg6OGQ6Mzk6NTk6ZmM6YWE6CisgICAgICAgIDNmOjIyOjhkOmExOmMxOjY2OjUwOjgxOjcyOjRjOmVkOjIyOjY0OjRmOjRmOmNhOjgwOjkxOgorICAgICAgICBiNjoyOQorCitWZXJpc2lnbiBDbGFzcyA0IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiBEQjpDODpGMjoyNzoyRTpCMTpFQTo2QToyOToyMzo1RDpGRTo1NjozRTozMzpERgorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVHakNDQXdJQ0VRRHNvS2VMYm5WcUFjL0VmTXd2bEY3WE1BMEdDU3FHU0liM0RRRUJCUVVBTUlIS01Rc3cKK0NRWURWUVFHRXdKVlV6RVhNQlVHQTFVRUNoTU9WbVZ5YVZOcFoyNHNJRWx1WXk0eEh6QWRCZ05WQkFzVEZsWmwKK2NtbFRhV2R1SUZSeWRYTjBJRTVsZEhkdmNtc3hPakE0QmdOVkJBc1RNU2hqS1NBeE9UazVJRlpsY21sVGFXZHUKK0xDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4UlRCREJnTlZCQU1UUEZabGNtbFQKK2FXZHVJRU5zWVhOeklEUWdVSFZpYkdsaklGQnlhVzFoY25rZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnAKK2RIa2dMU0JITXpBZUZ3MDVPVEV3TURFd01EQXdNREJhRncwek5qQTNNVFl5TXpVNU5UbGFNSUhLTVFzd0NRWUQKK1ZRUUdFd0pWVXpFWE1CVUdBMVVFQ2hNT1ZtVnlhVk5wWjI0c0lFbHVZeTR4SHpBZEJnTlZCQXNURmxabGNtbFQKK2FXZHVJRlJ5ZFhOMElFNWxkSGR2Y21zeE9qQTRCZ05WQkFzVE1TaGpLU0F4T1RrNUlGWmxjbWxUYVdkdUxDQkoKK2JtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hSVEJEQmdOVkJBTVRQRlpsY21sVGFXZHUKK0lFTnNZWE56SURRZ1VIVmliR2xqSUZCeWFXMWhjbmtnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2cKK0xTQkhNekNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFLM0xwUkZweGxtcjhZKzEKK0dROVd6c3kxSHlEa25pWWxTK0J6WllsWjN0Q0Q1UFVQdGJ1dDhYem9JZnprNkF6dWZFVWlHWGFTdEJPM0lGc0oKKyttR3VxUEtsallYQ0t0YmVaamJTbXdMMHFKSmdmSnhwdEk4a0h0Q0dVdll5bkVGWUhpSzl6VVZpbFFodTBHYmQKK1U2TE04QkRjVkhPTEJLRkdNek5jRjBDNW5rM1Q4NzVWZytpeGlZNWFmSnFXSXBBN2lDWHkwbE9JQWd3TGVQTG0KK054ZExNRVlINUlCdHB0aVdMdWdzK0JHek9BMW1wcHZxeVNOYjI0N2k4eE9PR2xrdHFnTHc3S1NIWnR6QlAvWFkKK3VmVHNnc2JTUFpVZDVjQlBoTW5abzBRb0JtclhSYXp3YTJydlRsLzRFWUllT0dNMFpsRFVQcE56K2pERFpxMy8KK2t5Mlg3d01DQXdFQUFUQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFqL29sYTA5YjVLUk9KMVdySWhWWlBNcTEKK0N0UksyNnZkb1Y5VHhhQlhPY0xPUnl1K09zaFd2OExaSnhBNnNRVTh3SGN4dXpyVEJYdHRtaHd3aklETGs1TXEKK2c2c0ZVWUlDQUJGbmEvT0lZVWRmQTVQVld3M2c4ZFNoTWpXRnNqcmJzSUtyMGNzS3ZFK01XOFZMQURzZktvS20KK2ZqYUYzSDQ4WndDMTVEdFM0S2pyWFJYNXhtM3dyUjBPaGJlcG1uTVVXbHVQUVNqQTFlZ3RUYVJlemFyWjdjN2MKKzJOVThRaDBYd1JKZFJUakRPUFA4aFM2RFJraXkxeUJma2phUDUza1BtRjZaNlBEUXBMdjFVNzBxemxtd3IyNS8KK2JMdlNIZ0N3SWUzNFFXS0N1ZGl5eEx0R1VQTXh4WThCcUhUcjlYZ24ydWYzWmtQem5vTStJS3JETldDUnpnPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDEgKDB4MCkKKyAgICAgICAgU2VyaWFsIE51bWJlcjoKKyAgICAgICAgICAgIGVjOmEwOmE3OjhiOjZlOjc1OjZhOjAxOmNmOmM0OjdjOmNjOjJmOjk0OjVlOmQ3CisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9VVMsIE89VmVyaVNpZ24sIEluYy4sIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmssIE9VPShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHksIENOPVZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMworICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogT2N0ICAxIDAwOjAwOjAwIDE5OTkgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBKdWwgMTYgMjM6NTk6NTkgMjAzNiBHTVQKKyAgICAgICAgU3ViamVjdDogQz1VUywgTz1WZXJpU2lnbiwgSW5jLiwgT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yaywgT1U9KGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seSwgQ049VmVyaVNpZ24gQ2xhc3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgIFJTQSBQdWJsaWMgS2V5OiAoMjA0OCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1cyAoMjA0OCBiaXQpOgorICAgICAgICAgICAgICAgICAgICAwMDphZDpjYjphNToxMTo2OTpjNjo1OTphYjpmMTo4ZjpiNToxOTowZjo1NjoKKyAgICAgICAgICAgICAgICAgICAgY2U6Y2M6YjU6MWY6MjA6ZTQ6OWU6MjY6MjU6NGI6ZTA6NzM6NjU6ODk6NTk6CisgICAgICAgICAgICAgICAgICAgIGRlOmQwOjgzOmU0OmY1OjBmOmI1OmJiOmFkOmYxOjdjOmU4OjIxOmZjOmU0OgorICAgICAgICAgICAgICAgICAgICBlODowYzplZTo3Yzo0NToyMjoxOTo3Njo5MjpiNDoxMzpiNzoyMDo1YjowOToKKyAgICAgICAgICAgICAgICAgICAgZmE6NjE6YWU6YTg6ZjI6YTU6OGQ6ODU6YzI6MmE6ZDY6ZGU6NjY6MzY6ZDI6CisgICAgICAgICAgICAgICAgICAgIDliOjAyOmY0OmE4OjkyOjYwOjdjOjljOjY5OmI0OjhmOjI0OjFlOmQwOjg2OgorICAgICAgICAgICAgICAgICAgICA1MjpmNjozMjo5Yzo0MTo1ODoxZToyMjpiZDpjZDo0NTo2Mjo5NTowODo2ZToKKyAgICAgICAgICAgICAgICAgICAgZDA6NjY6ZGQ6NTM6YTI6Y2M6ZjA6MTA6ZGM6NTQ6NzM6OGI6MDQ6YTE6NDY6CisgICAgICAgICAgICAgICAgICAgIDMzOjMzOjVjOjE3OjQwOmI5OjllOjRkOmQzOmYzOmJlOjU1OjgzOmU4OmIxOgorICAgICAgICAgICAgICAgICAgICA4OTo4ZTo1YTo3Yzo5YTo5NjoyMjo5MDozYjo4ODoyNTpmMjpkMjo1Mzo4ODoKKyAgICAgICAgICAgICAgICAgICAgMDI6MGM6MGI6Nzg6ZjI6ZTY6Mzc6MTc6NGI6MzA6NDY6MDc6ZTQ6ODA6NmQ6CisgICAgICAgICAgICAgICAgICAgIGE2OmQ4Ojk2OjJlOmU4OjJjOmY4OjExOmIzOjM4OjBkOjY2OmE2OjliOmVhOgorICAgICAgICAgICAgICAgICAgICBjOToyMzo1YjpkYjo4ZTplMjpmMzoxMzo4ZToxYTo1OToyZDphYTowMjpmMDoKKyAgICAgICAgICAgICAgICAgICAgZWM6YTQ6ODc6NjY6ZGM6YzE6M2Y6ZjU6ZDg6Yjk6ZjQ6ZWM6ODI6YzY6ZDI6CisgICAgICAgICAgICAgICAgICAgIDNkOjk1OjFkOmU1OmMwOjRmOjg0OmM5OmQ5OmEzOjQ0OjI4OjA2OjZhOmQ3OgorICAgICAgICAgICAgICAgICAgICA0NTphYzpmMDo2Yjo2YTplZjo0ZTo1ZjpmODoxMTo4MjoxZTozODo2MzozNDoKKyAgICAgICAgICAgICAgICAgICAgNjY6NTA6ZDQ6M2U6OTM6NzM6ZmE6MzA6YzM6NjY6YWQ6ZmY6OTM6MmQ6OTc6CisgICAgICAgICAgICAgICAgICAgIGVmOjAzCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA4ZjpmYToyNTo2Yjo0Zjo1YjplNDphNDo0ZToyNzo1NTphYjoyMjoxNTo1OTozYzpjYTpiNToKKyAgICAgICAgMGE6ZDQ6NGE6ZGI6YWI6ZGQ6YTE6NWY6NTM6YzU6YTA6NTc6Mzk6YzI6Y2U6NDc6MmI6YmU6CisgICAgICAgIDNhOmM4OjU2OmJmOmMyOmQ5OjI3OjEwOjNhOmIxOjA1OjNjOmMwOjc3OjMxOmJiOjNhOmQzOgorICAgICAgICAwNTo3Yjo2ZDo5YToxYzozMDo4Yzo4MDpjYjo5Mzo5MzoyYTo4MzphYjowNTo1MTo4MjowMjoKKyAgICAgICAgMDA6MTE6Njc6NmI6ZjM6ODg6NjE6NDc6NWY6MDM6OTM6ZDU6NWI6MGQ6ZTA6ZjE6ZDQ6YTE6CisgICAgICAgIDMyOjM1Ojg1OmIyOjNhOmRiOmIwOjgyOmFiOmQxOmNiOjBhOmJjOjRmOjhjOjViOmM1OjRiOgorICAgICAgICAwMDozYjoxZjoyYTo4MjphNjo3ZTozNjo4NTpkYzo3ZTozYzo2NzowMDpiNTplNDozYjo1MjoKKyAgICAgICAgZTA6YTg6ZWI6NWQ6MTU6Zjk6YzY6NmQ6ZjA6YWQ6MWQ6MGU6ODU6Yjc6YTk6OWE6NzM6MTQ6CisgICAgICAgIDVhOjViOjhmOjQxOjI4OmMwOmQ1OmU4OjJkOjRkOmE0OjVlOmNkOmFhOmQ5OmVkOmNlOmRjOgorICAgICAgICBkODpkNTozYzo0MjoxZDoxNzpjMToxMjo1ZDo0NTozODpjMzozODpmMzpmYzo4NToyZTo4MzoKKyAgICAgICAgNDY6NDg6YjI6ZDc6MjA6NWY6OTI6MzY6OGY6ZTc6Nzk6MGY6OTg6NWU6OTk6ZTg6ZjA6ZDA6CisgICAgICAgIGE0OmJiOmY1OjUzOmJkOjJhOmNlOjU5OmIwOmFmOjZlOjdmOjZjOmJiOmQyOjFlOjAwOmIwOgorICAgICAgICAyMTplZDpmODo0MTo2Mjo4MjpiOTpkODpiMjpjNDpiYjo0Njo1MDpmMzozMTpjNTo4ZjowMToKKyAgICAgICAgYTg6NzQ6ZWI6ZjU6Nzg6Mjc6ZGE6ZTc6Zjc6NjY6NDM6ZjM6OWU6ODM6M2U6MjA6YWE6YzM6CisgICAgICAgIDM1OjYwOjkxOmNlCisKK1ZlcmlzaWduL1JTQSBDb21tZXJjaWFsIENBCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorTUQ1IEZpbmdlcnByaW50OiA1QTowQjpERDo0Mjo5RTpCMjpCNDo2Mjo5NzozMjo3Rjo3RjowQTpBQTo5QTozOQorUEVNIERhdGE6CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUNJekNDQVpBQ0JRSkJBQUFXTUEwR0NTcUdTSWIzRFFFQkFnVUFNRnd4Q3pBSkJnTlZCQVlUQWxWVE1TQXcKK0hnWURWUVFLRXhkU1UwRWdSR0YwWVNCVFpXTjFjbWwwZVN3Z1NXNWpMakVyTUNrR0ExVUVDeE1pUTI5dGJXVnkKK1kybGhiQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzA1TkRFeE1EUXhPRFU0TXpSYUZ3MDUKK09URXhNRE14T0RVNE16UmFNRnd4Q3pBSkJnTlZCQVlUQWxWVE1TQXdIZ1lEVlFRS0V4ZFNVMEVnUkdGMFlTQlQKK1pXTjFjbWwwZVN3Z1NXNWpMakVyTUNrR0ExVUVDeE1pUTI5dGJXVnlZMmxoYkNCRFpYSjBhV1pwWTJGMGFXOXUKK0lFRjFkR2h2Y21sMGVUQ0JtekFOQmdrcWhraUc5dzBCQVFFRkFBT0JpUUF3Z1lVQ2ZnQ2srNEZpZTg0UUo5M28KKzk3NXNic1p3bWR1NDFRVURhU2lDbkhKL2xqK083S3dwa2orS0ZQaENkcjY5WFFPNWtOVFF2QWF5VVROZnhNSy8KK3RvdVBtYlppSW1EZDI5OGdnclRLb2k4dFVPMlVNdDdnVlkzVWFPTGdUTkxOQlJZdWxXWmNZVkk0SGxHb2dxSEUKKzd5WHBDdWFMSzQ0eFp0bjQyZjI5TzJuWjZ3SURBUUFCTUEwR0NTcUdTSWIzRFFFQkFnVUFBMzRBZHJXMkVQNGoKKzkvZFpZa3V3WDV6QmFMeEp1N05KYnlGSFhTdWRWTVFBS0QrWXVmS0tnNXRnZit0UXg2c0ZFQzA5N1RnQ3dhVkkKKzB2NWxvTUM4NnFZakZtWnNHeVNwOCt4NU5SaFBKc2pqcjFCS3g2Y3hhOUI4R0oxUXY2a20raVlyUnB3VXFidGIKK01KaENLTFZMVTd0RENaSkF1cWlxV3FUR3RvdFhUY1U9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitDZXJ0aWZpY2F0ZSBJbmdyZWRpZW50czoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAxICgweDApCisgICAgICAgIFNlcmlhbCBOdW1iZXI6CisgICAgICAgICAgICAwMjo0MTowMDowMDoxNgorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDJXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9VVMsIE89UlNBIERhdGEgU2VjdXJpdHksIEluYy4sIE9VPUNvbW1lcmNpYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKKyAgICAgICAgVmFsaWRpdHkKKyAgICAgICAgICAgIE5vdCBCZWZvcmU6IE5vdiAgNCAxODo1ODozNCAxOTk0IEdNVAorICAgICAgICAgICAgTm90IEFmdGVyIDogTm92ICAzIDE4OjU4OjM0IDE5OTkgR01UCisgICAgICAgIFN1YmplY3Q6IEM9VVMsIE89UlNBIERhdGEgU2VjdXJpdHksIEluYy4sIE9VPUNvbW1lcmNpYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgUlNBIFB1YmxpYyBLZXk6ICgxMDAwIGJpdCkKKyAgICAgICAgICAgICAgICBNb2R1bHVzICgxMDAwIGJpdCk6CisgICAgICAgICAgICAgICAgICAgIDAwOmE0OmZiOjgxOjYyOjdiOmNlOjEwOjI3OmRkOmU4OmY3OmJlOjZjOjZlOgorICAgICAgICAgICAgICAgICAgICBjNjo3MDo5OTpkYjpiODpkNTowNTowMzo2OToyODo4Mjo5Yzo3Mjo3Zjo5NjoKKyAgICAgICAgICAgICAgICAgICAgM2Y6OGU6ZWM6YWM6Mjk6OTI6M2Y6OGE6MTQ6Zjg6NDI6NzY6YmU6YmQ6NWQ6CisgICAgICAgICAgICAgICAgICAgIDAzOmI5OjkwOmQ0OmQwOmJjOjA2OmIyOjUxOjMzOjVmOmM0OmMyOmJmOmI2OgorICAgICAgICAgICAgICAgICAgICA4Yjo4Zjo5OTpiNjo2MjoyMjo2MDpkZDpkYjpkZjoyMDo4MjpiNDpjYTphMjoKKyAgICAgICAgICAgICAgICAgICAgMmY6MmQ6NTA6ZWQ6OTQ6MzI6ZGU6ZTA6NTU6OGQ6ZDQ6Njg6ZTI6ZTA6NGM6CisgICAgICAgICAgICAgICAgICAgIGQyOmNkOjA1OjE2OjJlOjk1OjY2OjVjOjYxOjUyOjM4OjFlOjUxOmE4OjgyOgorICAgICAgICAgICAgICAgICAgICBhMTpjNDplZjoyNTplOTowYTplNjo4YjoyYjo4ZTozMTo2NjpkOTpmODpkOToKKyAgICAgICAgICAgICAgICAgICAgZmQ6YmQ6M2I6Njk6ZDk6ZWIKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogbWQyV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgNzY6YjU6YjY6MTA6ZmU6MjM6Zjc6Zjc6NTk6NjI6NGI6YjA6NWY6OWM6YzE6Njg6YmM6NDk6CisgICAgICAgIGJiOmIzOjQ5OjZmOjIxOjQ3OjVkOjJiOjlkOjU0OmM0OjAwOjI4OjNmOjk4OmI5OmYyOjhhOgorICAgICAgICA4Mzo5Yjo2MDo3ZjplYjo1MDpjNzphYjowNToxMDoyZDozZDplZDozODowMjpjMTphNTo0ODoKKyAgICAgICAgZDI6ZmU6NjU6YTA6YzA6YmM6ZWE6YTY6MjM6MTY6NjY6NmM6MWI6MjQ6YTk6ZjM6ZWM6Nzk6CisgICAgICAgIDM1OjE4OjRmOjI2OmM4OmUzOmFmOjUwOjRhOmM3OmE3OjMxOjZiOmQwOjdjOjE4OjlkOjUwOgorICAgICAgICBiZjphOToyNjpmYToyNjoyYjo0Njo5YzoxNDphOTpiYjo1YjozMDo5ODo0MjoyODpiNTo0YjoKKyAgICAgICAgNTM6YmI6NDM6MDk6OTI6NDA6YmE6YTg6YWE6NWE6YTQ6YzY6YjY6OGI6NTc6NGQ6YzUKKworVmVyaXNpZ24vUlNBIFNlY3VyZSBTZXJ2ZXIgQ0EKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitNRDUgRmluZ2VycHJpbnQ6IDc0OjdCOjgyOjAzOjQzOkYwOjAwOjlFOjZCOkIzOkVDOjQ3OkJGOjg1OkE1OjkzCitQRU0gRGF0YToKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQ05EQ0NBYUVDRUFLdFpuNU9SZjVlVjI4OG1CbGUzY0F3RFFZSktvWklodmNOQVFFQ0JRQXdYekVMTUFrRworQTFVRUJoTUNWVk14SURBZUJnTlZCQW9URjFKVFFTQkVZWFJoSUZObFkzVnlhWFI1TENCSmJtTXVNUzR3TEFZRAorVlFRTEV5VlRaV04xY21VZ1UyVnlkbVZ5SUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNQjRYRFRrMAorTVRFd09UQXdNREF3TUZvWERURXdNREV3TnpJek5UazFPVm93WHpFTE1Ba0dBMVVFQmhNQ1ZWTXhJREFlQmdOVgorQkFvVEYxSlRRU0JFWVhSaElGTmxZM1Z5YVhSNUxDQkpibU11TVM0d0xBWURWUVFMRXlWVFpXTjFjbVVnVTJWeQorZG1WeUlFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUlHYk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHSgorQURDQmhRSitBSkxPZXNHdWd6NWFxb21EVjZ3bEFYWU1yYTZPTERmTzZ6VjRaRlFENVlSQVVjbS9qd2ppaW9JSQorMGhhR04xWHBzU0VDclhab2dab0Zva3ZKU3lWbUlsWnNpQWVQOTRGWmJZUUhaWEFUY1hZK20zZE00MUNKVnBoSQordVIybktSb1RMa29SV1p3ZUZkVkpWQ3h6T21tQ3NaYzVuRzF3WjBqbDNTM1d5QjU3QWdNQkFBRXdEUVlKS29aSQoraHZjTkFRRUNCUUFEZmdCbDNYN2hzdXl3NGpyZzdIRkdtaGtSdU5QSG9MUURRQ1lDUGdtYzRSS3owVnIyTjZXMworWVFPMld4WnBPOFpFQ0F5SVV3eHJsMG5IUGpYY2JMbTdxdDljdXpvdmsyQzJxVXROOGlEM3pWOS9aSHVPM0FCYworMS9wM3lqa1dXVzhPNnRPMWczOU5UVUpXZHJUSlh3VDRPUGpyMGw5MVg4MTcvT1dPZ0h6OFVBPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK0NlcnRpZmljYXRlIEluZ3JlZGllbnRzOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDEgKDB4MCkKKyAgICAgICAgU2VyaWFsIE51bWJlcjoKKyAgICAgICAgICAgIDAyOmFkOjY2OjdlOjRlOjQ1OmZlOjVlOjU3OjZmOjNjOjk4OjE5OjVlOmRkOmMwCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kMldpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1VUywgTz1SU0EgRGF0YSBTZWN1cml0eSwgSW5jLiwgT1U9U2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogTm92ICA5IDAwOjAwOjAwIDE5OTQgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBKYW4gIDcgMjM6NTk6NTkgMjAxMCBHTVQKKyAgICAgICAgU3ViamVjdDogQz1VUywgTz1SU0EgRGF0YSBTZWN1cml0eSwgSW5jLiwgT1U9U2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICBSU0EgUHVibGljIEtleTogKDEwMDAgYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXMgKDEwMDAgYml0KToKKyAgICAgICAgICAgICAgICAgICAgMDA6OTI6Y2U6N2E6YzE6YWU6ODM6M2U6NWE6YWE6ODk6ODM6NTc6YWM6MjU6CisgICAgICAgICAgICAgICAgICAgIDAxOjc2OjBjOmFkOmFlOjhlOjJjOjM3OmNlOmViOjM1Ojc4OjY0OjU0OjAzOgorICAgICAgICAgICAgICAgICAgICBlNTo4NDo0MDo1MTpjOTpiZjo4ZjowODplMjo4YTo4MjowODpkMjoxNjo4NjoKKyAgICAgICAgICAgICAgICAgICAgMzc6NTU6ZTk6YjE6MjE6MDI6YWQ6NzY6Njg6ODE6OWE6MDU6YTI6NGI6Yzk6CisgICAgICAgICAgICAgICAgICAgIDRiOjI1OjY2OjIyOjU2OjZjOjg4OjA3OjhmOmY3OjgxOjU5OjZkOjg0OjA3OgorICAgICAgICAgICAgICAgICAgICA2NTo3MDoxMzo3MTo3NjozZTo5Yjo3Nzo0YzplMzo1MDo4OTo1Njo5ODo0ODoKKyAgICAgICAgICAgICAgICAgICAgYjk6MWQ6YTc6Mjk6MWE6MTM6MmU6NGE6MTE6NTk6OWM6MWU6MTU6ZDU6NDk6CisgICAgICAgICAgICAgICAgICAgIDU0OjJjOjczOjNhOjY5OjgyOmIxOjk3OjM5OjljOjZkOjcwOjY3OjQ4OmU1OgorICAgICAgICAgICAgICAgICAgICBkZDoyZDpkNjpjODoxZTo3YgorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDJXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA2NTpkZDo3ZTplMTpiMjplYzpiMDplMjozYTplMDplYzo3MTo0Njo5YToxOToxMTpiODpkMzoKKyAgICAgICAgYzc6YTA6YjQ6MDM6NDA6MjY6MDI6M2U6MDk6OWM6ZTE6MTI6YjM6ZDE6NWE6ZjY6Mzc6YTU6CisgICAgICAgIGI3OjYxOjAzOmI2OjViOjE2OjY5OjNiOmM2OjQ0OjA4OjBjOjg4OjUzOjBjOjZiOjk3OjQ5OgorICAgICAgICBjNzozZTozNTpkYzo2YzpiOTpiYjphYTpkZjo1YzpiYjozYToyZjo5Mzo2MDpiNjphOTo0YjoKKyAgICAgICAgNGQ6ZjI6MjA6Zjc6Y2Q6NWY6N2Y6NjQ6N2I6OGU6ZGM6MDA6NWM6ZDc6ZmE6Nzc6Y2E6Mzk6CisgICAgICAgIDE2OjU5OjZmOjBlOmVhOmQzOmI1OjgzOjdmOjRkOjRkOjQyOjU2Ojc2OmI0OmM5OjVmOjA0OgorICAgICAgICBmODozODpmODplYjpkMjo1Zjo3NTo1ZjpjZDo3YjpmYzplNTo4ZTo4MDo3YzpmYzo1MApkaWZmIC0tZ2l0IGEvdWRkaTIvZXhhbXBsZTEuY3BwIGIvdWRkaTIvZXhhbXBsZTEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMzUxY2QKLS0tIC9kZXYvbnVsbAorKysgYi91ZGRpMi9leGFtcGxlMS5jcHAKQEAgLTAsMCArMSw4NiBAQAorLyoKKworZXhhbXBsZTEuY3BwCisKK0V4YW1wbGUgVURESSBWMiBDbGllbnQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwNC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyB0d28gbGljZW5zZXM6CitHUEwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbmNsdWRlICJpbnFILmgiCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sgCisgIGNoYXIgKnNlYXJjaF9zdHJpbmcgPSAibWFnaWMiOworCisgIGlmIChhcmdjID4gMSkKKyAgICBzZWFyY2hfc3RyaW5nID0gYXJndlsxXTsKKworICAvLyBDcmVhdGUgYSBnU09BUCBjb250ZXh0CisgIHN0cnVjdCBzb2FwICpzb2FwID0gc29hcF9uZXcoKTsKKworICAvLyBDcmVhdGUgYW4gb2JqZWN0IHRvIGZpbmQgYSBidXNpbmVzcworICB1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlIGZzKHNvYXAsIHNlYXJjaF9zdHJpbmcpOworCisgIC8vIFNlbmQgdGhlIHJlcXVlc3QKKyAgdWRkaTJfX3NlcnZpY2VMaXN0ICpzbCA9IGZzLnNlbmQoImh0dHA6Ly91ZGRpLnhtZXRob2RzLm5ldC9pbnF1aXJlIik7CisKKyAgLy8gQ2hlY2sgaWYgcmVzdWx0IGlzIE9LCisgIGlmICghc2wpCisgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOworCisgIC8vIElmIE9LLCByZXBvcnQgdGhlIHNlcnZpY2UgbmFtZShzKSBhbmQgdW5pcXVlIGlkZW50aWZpY2F0aW9uIGtleXMKKyAgZWxzZSBpZiAoc2wtPnNlcnZpY2VJbmZvcykKKyAgeworICAgIHN0ZDo6Y291dCA8PCAiU2VhcmNoIHJlc3VsdHMgb24gIiA8PCBzZWFyY2hfc3RyaW5nIDw8ICI6IiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCisgICAgZm9yIChzdGQ6OnZlY3Rvcjx1ZGRpMl9fc2VydmljZUluZm8qPjo6Y29uc3RfaXRlcmF0b3Igc2kgPSBzbC0+c2VydmljZUluZm9zLT5zZXJ2aWNlSW5mby5iZWdpbigpOyBzaSAhPSBzbC0+c2VydmljZUluZm9zLT5zZXJ2aWNlSW5mby5lbmQoKTsgKytzaSkKKyAgICB7CisgICAgICAvLyBSZXBvcnQgc2VydmljZUtleSBhbmQgYnVzaW5lc3NLZXkKKyAgICAgIHN0ZDo6Y291dCA8PCAic2VydmljZUtleT0iIDw8ICgqc2kpLT5zZXJ2aWNlS2V5IDw8IHN0ZDo6ZW5kbCA8PCAiYnVzaW5lc3NLZXk9IiA8PCAoKnNpKS0+YnVzaW5lc3NLZXkgPDwgc3RkOjplbmRsOworCisgICAgICAvLyBSZXBvcnQgbmFtZXMKKyAgICAgIGZvciAoc3RkOjp2ZWN0b3I8dWRkaTJfX25hbWUqPjo6Y29uc3RfaXRlcmF0b3IgbiA9ICgqc2kpLT5uYW1lLmJlZ2luKCk7IG4gIT0gKCpzaSktPm5hbWUuZW5kKCk7ICsrbikKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJuYW1lPSIgPDwgKCpuKS0+X19pdGVtIDw8IHN0ZDo6ZW5kbDsKKworICAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBSZW1vdmUgZGVzZXJpYWxpemVkIG9iamVjdHMKKyAgc29hcF9kZXN0cm95KHNvYXApOworCisgIC8vIFJlbW92ZSB0ZW1wb3JhcnkgZGF0YQorICBzb2FwX2VuZChzb2FwKTsKKworICAvLyBEZXRhY2ggYW5kIGZyZWUgY29udGV4dAorICBzb2FwX2RvbmUoc29hcCk7CisgIGZyZWUoc29hcCk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91ZGRpMi9leGFtcGxlMi5jcHAgYi91ZGRpMi9leGFtcGxlMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIwYjVhZgotLS0gL2Rldi9udWxsCisrKyBiL3VkZGkyL2V4YW1wbGUyLmNwcApAQCAtMCwwICsxLDg2IEBACisvKgorCitleGFtcGxlMi5jcHAKKworRXhhbXBsZSBVRERJIFYyIENsaWVudAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR3byBsaWNlbnNlczoKK0dQTCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2luY2x1ZGUgImlucUguaCIKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreyAKKyAgY2hhciAqc2VhcmNoX3N0cmluZyA9ICJ4bWV0aG9kcyI7CisKKyAgaWYgKGFyZ2MgPiAxKQorICAgIHNlYXJjaF9zdHJpbmcgPSBhcmd2WzFdOworCisgIC8vIENyZWF0ZSBhIGdTT0FQIGNvbnRleHQKKyAgc3RydWN0IHNvYXAgKnNvYXAgPSBzb2FwX25ldygpOworCisgIC8vIENyZWF0ZSBhbiBvYmplY3QgdG8gZmluZCBhIGJ1c2luZXNzCisgIHVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzIGZiKHNvYXAsIHNlYXJjaF9zdHJpbmcpOworCisgIC8vIFNlbmQgdGhlIHJlcXVlc3QKKyAgdWRkaTJfX2J1c2luZXNzTGlzdCAqYmwgPSBmYi5zZW5kKCJodHRwOi8vdWRkaS54bWV0aG9kcy5uZXQvaW5xdWlyZSIpOworCisgIC8vIENoZWNrIGlmIHJlc3VsdCBpcyBPSworICBpZiAoIWJsKQorICAgIHNvYXBfcHJpbnRfZmF1bHQoc29hcCwgc3RkZXJyKTsKKworICAvLyBJZiBPSywgcmVwb3J0IHRoZSBidXNpbmVzcyBuYW1lKHMpIGFuZCB1bmlxdWUgaWRlbnRpZmljYXRpb24ga2V5cworICBlbHNlIGlmIChibC0+YnVzaW5lc3NJbmZvcykKKyAgeworICAgIHN0ZDo6Y291dCA8PCAiU2VhcmNoIHJlc3VsdHMgb24gIiA8PCBzZWFyY2hfc3RyaW5nIDw8ICI6IiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCisgICAgZm9yIChzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NJbmZvKj46OmNvbnN0X2l0ZXJhdG9yIGJpID0gYmwtPmJ1c2luZXNzSW5mb3MtPmJ1c2luZXNzSW5mby5iZWdpbigpOyBiaSAhPSBibC0+YnVzaW5lc3NJbmZvcy0+YnVzaW5lc3NJbmZvLmVuZCgpOyArK2JpKQorICAgIHsKKyAgICAgIC8vIFJlcG9ydCBidXNpbmVzc0tleQorICAgICAgc3RkOjpjb3V0IDw8ICJidXNpbmVzc0tleT0iIDw8ICgqYmkpLT5idXNpbmVzc0tleSA8PCBzdGQ6OmVuZGw7CisKKyAgICAgIC8vIFJlcG9ydCBuYW1lcworICAgICAgZm9yIChzdGQ6OnZlY3Rvcjx1ZGRpMl9fbmFtZSo+Ojpjb25zdF9pdGVyYXRvciBuID0gKCpiaSktPm5hbWUuYmVnaW4oKTsgbiAhPSAoKmJpKS0+bmFtZS5lbmQoKTsgKytuKQorICAgICAgICBzdGQ6OmNvdXQgPDwgIm5hbWU9IiA8PCAoKm4pLT5fX2l0ZW0gPDwgc3RkOjplbmRsOworCisgICAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOworICAgIH0KKyAgfQorCisgIC8vIFJlbW92ZSBkZXNlcmlhbGl6ZWQgb2JqZWN0cworICBzb2FwX2Rlc3Ryb3koc29hcCk7CisKKyAgLy8gUmVtb3ZlIHRlbXBvcmFyeSBkYXRhCisgIHNvYXBfZW5kKHNvYXApOworCisgIC8vIERldGFjaCBhbmQgZnJlZSBjb250ZXh0CisgIHNvYXBfZG9uZShzb2FwKTsKKyAgZnJlZShzb2FwKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3VkZGkyL2V4YW1wbGUzLmNwcCBiL3VkZGkyL2V4YW1wbGUzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTYyNjdmCi0tLSAvZGV2L251bGwKKysrIGIvdWRkaTIvZXhhbXBsZTMuY3BwCkBAIC0wLDAgKzEsMTc4IEBACisvKgorCitleGFtcGxlMy5jcHAKKworRXhhbXBsZSBVRERJIFYyIENsaWVudAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR3byBsaWNlbnNlczoKK0dQTCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2luY2x1ZGUgInB1YkguaCIKKworY29uc3QgY2hhciAqc2VydmVyID0gImh0dHBzOi8vdWRkaS54bWV0aG9kcy5uZXQvcHVibGlzaCI7CisKK2NvbnN0IGNoYXIgKnVzZXJpZCA9ICIuLi4iOyAvLyB1c2VyIElEIHRvIGFjY2VzcyBVRERJIHNlcnZlcgorY29uc3QgY2hhciAqcGFzc3dkID0gIi4uLiI7IC8vIHBhc3N3b3JkIHRvIGFjY2VzcyBVRERJIHNlcnZlcgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7IAorICAvLyBDcmVhdGUgYSBnU09BUCBjb250ZXh0CisgIHN0cnVjdCBzb2FwICpzb2FwID0gc29hcF9uZXcoKTsKKworICAvLyBTZXR1cCBTU0wgY29udGV4dCAob3B0aW9uYWwpIHRvIHZlcmlmeSBzZXJ2ZXIncyBjcmVkZW50aWFscworICBpZiAoc29hcF9zc2xfY2xpZW50X2NvbnRleHQoc29hcCwgU09BUF9TU0xfREVGQVVMVCwgTlVMTCwgTlVMTCwgImNhY2VydHMucGVtIiwgTlVMTCwgTlVMTCkpCisgIHsgCisgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOworICAgIGV4aXQoMSk7CisgIH0KKworICAvLyBTdGVwIDE6IEdldCBhbiBhdXRob3JpemF0aW9uIHRva2VuIGZyb20gdGhlIFVEREkgc2VydmVyCisgIHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuIGdldF9hdXRoVG9rZW4oc29hcCwgdXNlcmlkLCBwYXNzd2QpOworICB1ZGRpMl9fYXV0aFRva2VuICphdXRoVG9rZW4gPSBnZXRfYXV0aFRva2VuLnNlbmQoc2VydmVyKTsKKworICAvLyBDaGVjayBpZiBhdXRob3JpemVkCisgIGlmICghYXV0aFRva2VuKQorICB7CisgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOworICAgIGV4aXQoMSk7CisgIH0KKworICAvLyBBdXRob3JpemF0aW9uIGluZm8gcHJvdmlkZWQgYnkgc2VydmVyIGZvciB0aGlzIHNlc3Npb24KKyAgY2hhciAqYXV0aEluZm8gPSBhdXRoVG9rZW4tPmF1dGhJbmZvOworCisgIC8vIFN0ZXAgMjogQ3JlYXRlIGEgdE1vZGVsIGZvciB0aGUgV1NETCB0byBiZSBwdWJsaXNoZWQKKyAgdWRkaTJfX3RNb2RlbCB0TW9kZWw7CisgIHRNb2RlbC5zb2FwX2RlZmF1bHQoc29hcCk7CisKKyAgLy8gQ3JlYXRlIHRoZSB0TW9kZWwgYW5kIHNlcnZpY2UgbmFtZQorICB0TW9kZWwubmFtZSA9IHNvYXBfbmV3X3VkZGkyX19uYW1lKHNvYXAsIC0xKTsKKyAgdE1vZGVsLm5hbWUtPl9faXRlbSA9ICIuLi4iOworICB0TW9kZWwubmFtZS0+eG1sX19sYW5nXyA9ICJlbiI7CisKKyAgLy8gQ3JlYXRlIFhNZXRob2RzIGRlc2NyaXB0aW9uIGVsZW1lbnRzIChzZWUgaHR0cDovL3d3dy54bWV0aG9kcy5uZXQvdmUyL1VEREkucG8pCisgIHVkZGkyX19kZXNjcmlwdGlvbiAqZGVzY3JpcHRpb24gPSBzb2FwX25ld191ZGRpMl9fZGVzY3JpcHRpb24oc29hcCwgNik7CisgIGRlc2NyaXB0aW9uWzBdLl9faXRlbSA9ICJTSE9SVCBERVNDUklQVElPTjogLi4uIjsKKyAgZGVzY3JpcHRpb25bMF0ueG1sX19sYW5nXyA9ICJlbiI7CisgIGRlc2NyaXB0aW9uWzFdLl9faXRlbSA9ICJTSE9SVCBERVNDUklQVElPTjogLi4uIjsKKyAgZGVzY3JpcHRpb25bMV0ueG1sX19sYW5nXyA9ICJlbiI7CisgIGRlc2NyaXB0aW9uWzJdLl9faXRlbSA9ICJVU0FHRSBOT1RFUzogLi4uIjsKKyAgZGVzY3JpcHRpb25bMl0ueG1sX19sYW5nXyA9ICJlbiI7CisgIGRlc2NyaXB0aW9uWzNdLl9faXRlbSA9ICJIT01FUEFHRSBVUkw6IC4uLiI7CisgIGRlc2NyaXB0aW9uWzNdLnhtbF9fbGFuZ18gPSAiZW4iOworICBkZXNjcmlwdGlvbls0XS5fX2l0ZW0gPSAiQ09OVEFDVCBFTUFJTDogLi4uIjsKKyAgZGVzY3JpcHRpb25bNF0ueG1sX19sYW5nXyA9ICJlbiI7CisgIGRlc2NyaXB0aW9uWzVdLl9faXRlbSA9ICJJTVBMRU1FTlRBVElPTjogLi4uIjsKKyAgZGVzY3JpcHRpb25bNV0ueG1sX19sYW5nXyA9ICJlbiI7CisKKyAgLy8gQWRkIHRoZSBmb3VyIGRlc2NyaXB0aW9uIGVsZW1lbnRzIHRvIHRoZSB0TW9kZWwKKyAgdE1vZGVsLmRlc2NyaXB0aW9uLnB1c2hfYmFjayhkZXNjcmlwdGlvbiArIDApOworICB0TW9kZWwuZGVzY3JpcHRpb24ucHVzaF9iYWNrKGRlc2NyaXB0aW9uICsgMSk7CisgIHRNb2RlbC5kZXNjcmlwdGlvbi5wdXNoX2JhY2soZGVzY3JpcHRpb24gKyAyKTsKKyAgdE1vZGVsLmRlc2NyaXB0aW9uLnB1c2hfYmFjayhkZXNjcmlwdGlvbiArIDQpOworCisgIC8vIEFkZCBhbiBvdmVydmlld0RvYyBlbGVtZW50IHdpdGggZGVzY3JpcHRpb24gYW5kIG92ZXJ2aWV3VVJMCisgIHRNb2RlbC5vdmVydmlld0RvYyA9IHNvYXBfbmV3X3VkZGkyX19vdmVydmlld0RvYyhzb2FwLCAtMSk7CisgIHRNb2RlbC5vdmVydmlld0RvYy0+c29hcF9kZWZhdWx0KHNvYXApOworICB0TW9kZWwub3ZlcnZpZXdEb2MtPmRlc2NyaXB0aW9uLnB1c2hfYmFjayhzb2FwX25ld191ZGRpMl9fZGVzY3JpcHRpb24oc29hcCwgLTEpKTsKKyAgdE1vZGVsLm92ZXJ2aWV3RG9jLT5kZXNjcmlwdGlvblswXS0+X19pdGVtID0gIldTREwgc291cmNlIGRvY3VtZW50IjsKKyAgdE1vZGVsLm92ZXJ2aWV3RG9jLT5kZXNjcmlwdGlvblswXS0+eG1sX19sYW5nXyA9ICJlbiI7CisgIHRNb2RlbC5vdmVydmlld0RvYy0+b3ZlcnZpZXdVUkwgPSAiaHR0cDovLy4uLi9teS53c2RsI2JpbmRpbmdOYW1lIjsKKworICAvLyBPbWl0IGlkZW50aWZpZXIgYmFnCisgIHRNb2RlbC5pZGVudGlmaWVyQmFnID0gTlVMTDsKKworICAvLyBBZGQgYSBjYXRlZ29yeSB3aXRoIGEgV1NETC1zcGVjaWZpYyBrZXllZFJlZmVyZW5jZQorICB0TW9kZWwuY2F0ZWdvcnlCYWcgPSBzb2FwX25ld191ZGRpMl9fY2F0ZWdvcnlCYWcoc29hcCwgLTEpOworICB0TW9kZWwuY2F0ZWdvcnlCYWctPnNvYXBfZGVmYXVsdChzb2FwKTsKKyAgdE1vZGVsLmNhdGVnb3J5QmFnLT5rZXllZFJlZmVyZW5jZS5wdXNoX2JhY2soc29hcF9uZXdfdWRkaTJfX2tleWVkUmVmZXJlbmNlKHNvYXAsIC0xKSk7CisgIHRNb2RlbC5jYXRlZ29yeUJhZy0+a2V5ZWRSZWZlcmVuY2VbMF0tPnRNb2RlbEtleSA9ICIuLi4iOworICB0TW9kZWwuY2F0ZWdvcnlCYWctPmtleWVkUmVmZXJlbmNlWzBdLT5rZXlOYW1lID0gInVkZGktb3JnOnR5cGVzIjsKKyAgdE1vZGVsLmNhdGVnb3J5QmFnLT5rZXllZFJlZmVyZW5jZVswXS0+a2V5VmFsdWUgPSAid3NkbFNwZWMiOworCisgIHRNb2RlbC5hdXRob3JpemVkTmFtZSA9ICIuLi4iOworICB0TW9kZWwub3BlcmF0b3JfID0gIi4uLiI7CisgIHRNb2RlbC50TW9kZWxLZXkgPSAiLi4uIjsKKworICAvLyBTYXZlIHRoZSB0TW9kZWwKKyAgdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsIHNhdmVfdE1vZGVsKHNvYXAsIHRNb2RlbCk7CisgIHVkZGkyX190TW9kZWxEZXRhaWwgKnRNb2RlbERldGFpbCA9IHNhdmVfdE1vZGVsLnNlbmQoc2VydmVyLCBhdXRoSW5mbyk7CisKKyAgLy8gU3RlcCAzOiBDcmVhdGUgYSBuZXcgc2VydmljZSB0byBiZSBwdWJsaXNoZWQKKyAgdWRkaTJfX2J1c2luZXNzU2VydmljZSBzZXJ2aWNlOworICBzZXJ2aWNlLnNvYXBfZGVmYXVsdChzb2FwKTsKKworICAvLyBTZXJ2aWNlIG5hbWUgaXMgdGhlIHRNb2RlbCBuYW1lIChYTWV0aG9kcykKKyAgc2VydmljZS5uYW1lLnB1c2hfYmFjayh0TW9kZWwubmFtZSk7CisKKyAgLy8gQWRkIHR3byBkZXNjcmlwdGlvbiBlbGVtZW50cyB0byB0aGUgc2VydmljZQorICBzZXJ2aWNlLmRlc2NyaXB0aW9uLnB1c2hfYmFjayhkZXNjcmlwdGlvbiArIDQpOworICBzZXJ2aWNlLmRlc2NyaXB0aW9uLnB1c2hfYmFjayhkZXNjcmlwdGlvbiArIDUpOworCisgIC8vIENyZWF0ZSBiaW5kaW5nIHRlbXBsYXRlCisgIHVkZGkyX19iaW5kaW5nVGVtcGxhdGUgYmluZGluZ1RlbXBsYXRlOworICBiaW5kaW5nVGVtcGxhdGUuc29hcF9kZWZhdWx0KHNvYXApOworICBiaW5kaW5nVGVtcGxhdGUudE1vZGVsSW5zdGFuY2VEZXRhaWxzID0gc29hcF9uZXdfdWRkaTJfX3RNb2RlbEluc3RhbmNlRGV0YWlscyhzb2FwLCAtMSk7CisgIGJpbmRpbmdUZW1wbGF0ZS50TW9kZWxJbnN0YW5jZURldGFpbHMtPnRNb2RlbEluc3RhbmNlSW5mby5wdXNoX2JhY2soc29hcF9uZXdfdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyhzb2FwLCAtMSkpOworICBiaW5kaW5nVGVtcGxhdGUudE1vZGVsSW5zdGFuY2VEZXRhaWxzLT50TW9kZWxJbnN0YW5jZUluZm9bMF0tPmluc3RhbmNlRGV0YWlscyA9IE5VTEw7CisgIGJpbmRpbmdUZW1wbGF0ZS50TW9kZWxJbnN0YW5jZURldGFpbHMtPnRNb2RlbEluc3RhbmNlSW5mb1swXS0+dE1vZGVsS2V5ID0gdE1vZGVsLnRNb2RlbEtleTsKKyAgYmluZGluZ1RlbXBsYXRlLmFjY2Vzc1BvaW50ID0gc29hcF9uZXdfdWRkaTJfX2FjY2Vzc1BvaW50KHNvYXAsIC0xKTsKKyAgYmluZGluZ1RlbXBsYXRlLmFjY2Vzc1BvaW50LT5fX2l0ZW0gPSAiLi4uIjsKKyAgYmluZGluZ1RlbXBsYXRlLmFjY2Vzc1BvaW50LT5VUkxUeXBlID0gdWRkaTJfX1VSTFR5cGVfX2h0dHA7CisgIGJpbmRpbmdUZW1wbGF0ZS5ob3N0aW5nUmVkaXJlY3RvciA9IE5VTEw7CisgIGJpbmRpbmdUZW1wbGF0ZS5zZXJ2aWNlS2V5ID0gIi4uLiI7CisgIGJpbmRpbmdUZW1wbGF0ZS5iaW5kaW5nS2V5ID0gIi4uLiI7CisKKyAgLy8gQWRkIGJpbmRpbmcgVGVtcGxhdGUgdG8gc2VydmljZQorICBzZXJ2aWNlLmJpbmRpbmdUZW1wbGF0ZXMgPSBzb2FwX25ld191ZGRpMl9fYmluZGluZ1RlbXBsYXRlcyhzb2FwLCAtMSk7CisgIHNlcnZpY2UuYmluZGluZ1RlbXBsYXRlcy0+c29hcF9kZWZhdWx0KHNvYXApOworICBzZXJ2aWNlLmJpbmRpbmdUZW1wbGF0ZXMtPmJpbmRpbmdUZW1wbGF0ZS5wdXNoX2JhY2soJmJpbmRpbmdUZW1wbGF0ZSk7CisKKyAgc2VydmljZS5jYXRlZ29yeUJhZyA9IE5VTEw7CisgIHNlcnZpY2Uuc2VydmljZUtleSA9ICIuLi4iOworICBzZXJ2aWNlLmJ1c2luZXNzS2V5ID0gIi4uLiI7CisKKyAgLy8gU2F2ZSB0aGUgc2VydmljZQorICB1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlIHNhdmVfc2VydmljZShzb2FwLCBzZXJ2aWNlKTsKKyAgdWRkaTJfX3NlcnZpY2VEZXRhaWwgKnNlcnZpY2VEZXRhaWwgPSBzYXZlX3NlcnZpY2Uuc2VuZChzZXJ2ZXIsIGF1dGhJbmZvKTsKKworICAvLyBTdGVwIDQ6IERpc2NhcmQgYXV0aG9yaXphdGlvbiB0b2tlbgorICB1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4gZGlzY2FyZF9hdXRoVG9rZW4oc29hcCwgYXV0aEluZm8pOworICB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgKmRpc3Bvc2l0aW9uUmVwb3J0ID0gZGlzY2FyZF9hdXRoVG9rZW4uc2VuZChzZXJ2ZXIpOworCisgIC8vIFJlbW92ZSBkZXNlcmlhbGl6ZWQgb2JqZWN0cworICBzb2FwX2Rlc3Ryb3koc29hcCk7CisKKyAgLy8gUmVtb3ZlIHRlbXBvcmFyeSBkYXRhCisgIHNvYXBfZW5kKHNvYXApOworCisgIC8vIERldGFjaCBhbmQgZnJlZSBjb250ZXh0CisgIHNvYXBfZG9uZShzb2FwKTsKKyAgZnJlZShzb2FwKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3VkZGkyL2lucXVpcmVfdjIuY3BwIGIvdWRkaTIvaW5xdWlyZV92Mi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUwNTk1MwotLS0gL2Rldi9udWxsCisrKyBiL3VkZGkyL2lucXVpcmVfdjIuY3BwCkBAIC0wLDAgKzEsNTUxIEBACisvKgorCitpbnF1aXJlX3YyLmNwcAorCitVRERJIFYyIElucXVpcnkgSW50ZXJmYWNlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzOgorR1BMIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaW5jbHVkZSAiaW5xSC5oIgorI2RlZmluZSBTT0FQX05NQUMgc3RhdGljCisjZGVmaW5lIHVkZGlIX0gKKyNpbmNsdWRlICJJbnF1aXJlU29hcC5uc21hcCIKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpmaW5kX2JpbmRpbmcKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nOjp1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwICpzb2FwKQoreworICAvLyBJbml0aWFsaXplIHRoaXMgb2JqZWN0IGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgZ1NPQVAgY29udGV4dAorICBzb2FwX2RlZmF1bHQoc29hcCk7CisKKyAgdGhpcy0+Z2VuZXJpYyA9ICIyLjAiOworfQorCit1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nOjp1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0TW9kZWxLZXkpCit7CisgIC8vIEluaXRpYWxpemUgdGhpcyBvYmplY3QgYW5kIGFzc29jaWF0ZSBpdCB3aXRoIHRoZSBnU09BUCBjb250ZXh0CisgIHNvYXBfZGVmYXVsdChzb2FwKTsKKworICAvLyBDcmVhdGUgYSBuZXcgVURESSB0TW9kZWxLZXkKKyAgdGhpcy0+dE1vZGVsQmFnID0gc29hcF9uZXdfdWRkaTJfX3RNb2RlbEJhZyhzb2FwLCAtMSk7CisgIHRoaXMtPnRNb2RlbEJhZy0+c29hcF9kZWZhdWx0KHNvYXApOworICB0aGlzLT50TW9kZWxCYWctPnRNb2RlbEtleS5wdXNoX2JhY2soc29hcF9zdHJkdXAoc29hcCwgdE1vZGVsS2V5KSk7CisKKyAgdGhpcy0+Z2VuZXJpYyA9ICIyLjAiOworfQorCit1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nOjp1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3RvcjxjaGFyKj4gdE1vZGVsS2V5cykKK3sKKyAgLy8gSW5pdGlhbGl6ZSB0aGlzIG9iamVjdCBhbmQgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGdTT0FQIGNvbnRleHQKKyAgc29hcF9kZWZhdWx0KHNvYXApOworCisgIC8vIENyZWF0ZSBhIG5ldyBVRERJIHRNb2RlbEtleSBCYWcKKyAgdGhpcy0+dE1vZGVsQmFnID0gc29hcF9uZXdfdWRkaTJfX3RNb2RlbEJhZyhzb2FwLCAtMSk7CisgIHRoaXMtPnRNb2RlbEJhZy0+c29hcF9kZWZhdWx0KHNvYXApOworICB0aGlzLT50TW9kZWxCYWctPnRNb2RlbEtleSA9IHRNb2RlbEtleXM7CisKKyAgdGhpcy0+Z2VuZXJpYyA9ICIyLjAiOworfQorCit1ZGRpMl9fYmluZGluZ0RldGFpbCAqdWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZzo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCkKK3sKKyAgLy8gQWxsb2NhdGUgcmVzdWx0CisgIHVkZGkyX19iaW5kaW5nRGV0YWlsICpyZXN1bHQgPSBzb2FwX25ld191ZGRpMl9fYmluZGluZ0RldGFpbChzb2FwLCAtMSk7CisKKyAgLy8gSW52b2tlIHRoZSB3cmFwcGVyCisgIHNvYXBfc2V0X25hbWVzcGFjZXMoc29hcCwgbmFtZXNwYWNlcyk7CisgIGlmIChzb2FwX2NhbGxfX19pbnEyX19maW5kX1VTQ09SRWJpbmRpbmcoc29hcCwgZW5kcG9pbnQsIE5VTEwsIHRoaXMsIHJlc3VsdCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30gCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6ZmluZF9idXNpbmVzcworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3VkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzOjp1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyAgLy8gSW5pdGlhbGl6ZSB0aGlzIG9iamVjdCBhbmQgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGdTT0FQIGNvbnRleHQKKyAgc29hcF9kZWZhdWx0KHNvYXApOworCisgIHRoaXMtPmdlbmVyaWMgPSAiMi4wIjsKK30KKwordWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M6OnVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lKQoreworICAvLyBJbml0aWFsaXplIHRoaXMgb2JqZWN0IGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgZ1NPQVAgY29udGV4dAorICBzb2FwX2RlZmF1bHQoc29hcCk7CisKKyAgLy8gQ3JlYXRlIGEgbmV3IFVEREkgbmFtZQorICB1ZGRpMl9fbmFtZSAqdW5hbWUgPSBzb2FwX25ld191ZGRpMl9fbmFtZShzb2FwLCAtMSk7CisgIHVuYW1lLT5zb2FwX2RlZmF1bHQoc29hcCk7CisgIHVuYW1lLT5fX2l0ZW0gPSBzb2FwX3N0cmR1cChzb2FwLCBuYW1lKTsKKyAgdGhpcy0+bmFtZS5wdXNoX2JhY2sodW5hbWUpOworCisgIHRoaXMtPmdlbmVyaWMgPSAiMi4wIjsKK30KKwordWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M6OnVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UqPiBrZXllZFJlZmVyZW5jZXMpCit7CisgIC8vIEluaXRpYWxpemUgdGhpcyBvYmplY3QgYW5kIGFzc29jaWF0ZSBpdCB3aXRoIHRoZSBnU09BUCBjb250ZXh0CisgIHNvYXBfZGVmYXVsdChzb2FwKTsKKworICAvLyBDcmVhdGUgYSBuZXcgVURESSB0TW9kZWxCYWcKKyAgdGhpcy0+Y2F0ZWdvcnlCYWcgPSBzb2FwX25ld191ZGRpMl9fY2F0ZWdvcnlCYWcoc29hcCwgLTEpOworICB0aGlzLT5jYXRlZ29yeUJhZy0+c29hcF9kZWZhdWx0KHNvYXApOworICB0aGlzLT5jYXRlZ29yeUJhZy0+a2V5ZWRSZWZlcmVuY2UgPSBrZXllZFJlZmVyZW5jZXM7CisKKyAgdGhpcy0+Z2VuZXJpYyA9ICIyLjAiOworfQorCit1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzczo6dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAgKnNvYXAsIHN0ZDo6dmVjdG9yPGNoYXIqPiB0TW9kZWxLZXlzKQoreworICAvLyBJbml0aWFsaXplIHRoaXMgb2JqZWN0IGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgZ1NPQVAgY29udGV4dAorICBzb2FwX2RlZmF1bHQoc29hcCk7CisKKyAgLy8gQ3JlYXRlIGEgbmV3IFVEREkgdE1vZGVsQmFnCisgIHRoaXMtPnRNb2RlbEJhZyA9IHNvYXBfbmV3X3VkZGkyX190TW9kZWxCYWcoc29hcCwgLTEpOworICB0aGlzLT50TW9kZWxCYWctPnNvYXBfZGVmYXVsdChzb2FwKTsKKyAgdGhpcy0+dE1vZGVsQmFnLT50TW9kZWxLZXkgPSB0TW9kZWxLZXlzOworCisgIHRoaXMtPmdlbmVyaWMgPSAiMi4wIjsKK30KKwordWRkaTJfX2J1c2luZXNzTGlzdCAqdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQpCit7CisgIC8vIEFsbG9jYXRlIHJlc3VsdAorICB1ZGRpMl9fYnVzaW5lc3NMaXN0ICpyZXN1bHQgPSBzb2FwX25ld191ZGRpMl9fYnVzaW5lc3NMaXN0KHNvYXAsIC0xKTsKKworICAvLyBJbnZva2UgdGhlIHdyYXBwZXIKKyAgc29hcF9zZXRfbmFtZXNwYWNlcyhzb2FwLCBuYW1lc3BhY2VzKTsKKyAgaWYgKHNvYXBfY2FsbF9fX2lucTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3Moc29hcCwgZW5kcG9pbnQsIE5VTEwsIHRoaXMsIHJlc3VsdCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30gCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6ZmluZF9yZWxhdGVkQnVzaW5lc3NlcworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3VkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzOjp1ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyAgLy8gSW5pdGlhbGl6ZSB0aGlzIG9iamVjdCBhbmQgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGdTT0FQIGNvbnRleHQKKyAgc29hcF9kZWZhdWx0KHNvYXApOworCisgIHRoaXMtPmdlbmVyaWMgPSAiMi4wIjsKK30KKwordWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXM6OnVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpidXNpbmVzc0tleSkKK3sKKyAgLy8gSW5pdGlhbGl6ZSB0aGlzIG9iamVjdCBhbmQgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGdTT0FQIGNvbnRleHQKKyAgc29hcF9kZWZhdWx0KHNvYXApOworCisgIHRoaXMtPmJ1c2luZXNzS2V5ID0gc29hcF9zdHJkdXAoc29hcCwgYnVzaW5lc3NLZXkpOworCisgIHRoaXMtPmdlbmVyaWMgPSAiMi4wIjsKK30KKwordWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdCAqdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXM6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQpCit7CisgIC8vIEFsbG9jYXRlIHJlc3VsdAorICB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0ICpyZXN1bHQgPSBzb2FwX25ld191ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0KHNvYXAsIC0xKTsKKworICAvLyBJbnZva2UgdGhlIHdyYXBwZXIKKyAgc29hcF9zZXRfbmFtZXNwYWNlcyhzb2FwLCBuYW1lc3BhY2VzKTsKKyAgaWYgKHNvYXBfY2FsbF9fX2lucTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMoc29hcCwgZW5kcG9pbnQsIE5VTEwsIHRoaXMsIHJlc3VsdCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30gCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6ZmluZF9zZXJ2aWNlCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZTo6dWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyAgLy8gSW5pdGlhbGl6ZSB0aGlzIG9iamVjdCBhbmQgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGdTT0FQIGNvbnRleHQKKyAgc29hcF9kZWZhdWx0KHNvYXApOworCisgIHRoaXMtPmdlbmVyaWMgPSAiMi4wIjsKK30KKwordWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZTo6dWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgLy8gSW5pdGlhbGl6ZSB0aGlzIG9iamVjdCBhbmQgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGdTT0FQIGNvbnRleHQKKyAgc29hcF9kZWZhdWx0KHNvYXApOworCisgIC8vIENyZWF0ZSBhIG5ldyBVRERJIG5hbWUKKyAgdWRkaTJfX25hbWUgKnVuYW1lID0gc29hcF9uZXdfdWRkaTJfX25hbWUoc29hcCwgLTEpOworICB1bmFtZS0+c29hcF9kZWZhdWx0KHNvYXApOworICB1bmFtZS0+X19pdGVtID0gc29hcF9zdHJkdXAoc29hcCwgbmFtZSk7CisgIHRoaXMtPm5hbWUucHVzaF9iYWNrKHVuYW1lKTsKKworICB0aGlzLT5nZW5lcmljID0gIjIuMCI7Cit9CisKK3VkZGkyX19maW5kX1VTQ09SRXNlcnZpY2U6OnVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0ZDo6dmVjdG9yPHVkZGkyX19rZXllZFJlZmVyZW5jZSo+IGtleWVkUmVmZXJlbmNlcykKK3sKKyAgLy8gSW5pdGlhbGl6ZSB0aGlzIG9iamVjdCBhbmQgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGdTT0FQIGNvbnRleHQKKyAgc29hcF9kZWZhdWx0KHNvYXApOworCisgIC8vIENyZWF0ZSBhIG5ldyBVRERJIHRNb2RlbEJhZworICB0aGlzLT5jYXRlZ29yeUJhZyA9IHNvYXBfbmV3X3VkZGkyX19jYXRlZ29yeUJhZyhzb2FwLCAtMSk7CisgIHRoaXMtPmNhdGVnb3J5QmFnLT5zb2FwX2RlZmF1bHQoc29hcCk7CisgIHRoaXMtPmNhdGVnb3J5QmFnLT5rZXllZFJlZmVyZW5jZSA9IGtleWVkUmVmZXJlbmNlczsKKworICB0aGlzLT5nZW5lcmljID0gIjIuMCI7Cit9CisKK3VkZGkyX19maW5kX1VTQ09SRXNlcnZpY2U6OnVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0ZDo6dmVjdG9yPGNoYXIqPiB0TW9kZWxLZXlzKQoreworICAvLyBJbml0aWFsaXplIHRoaXMgb2JqZWN0IGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgZ1NPQVAgY29udGV4dAorICBzb2FwX2RlZmF1bHQoc29hcCk7CisKKyAgLy8gQ3JlYXRlIGEgbmV3IFVEREkgdE1vZGVsQmFnCisgIHRoaXMtPnRNb2RlbEJhZyA9IHNvYXBfbmV3X3VkZGkyX190TW9kZWxCYWcoc29hcCwgLTEpOworICB0aGlzLT50TW9kZWxCYWctPnNvYXBfZGVmYXVsdChzb2FwKTsKKyAgdGhpcy0+dE1vZGVsQmFnLT50TW9kZWxLZXkgPSB0TW9kZWxLZXlzOworCisgIHRoaXMtPmdlbmVyaWMgPSAiMi4wIjsKK30KKwordWRkaTJfX3NlcnZpY2VMaXN0KiB1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50KQoreworICAvLyBBbGxvY2F0ZSByZXN1bHQKKyAgdWRkaTJfX3NlcnZpY2VMaXN0ICpyZXN1bHQgPSBzb2FwX25ld191ZGRpMl9fc2VydmljZUxpc3Qoc29hcCwgLTEpOworCisgIC8vIEludm9rZSB0aGUgd3JhcHBlcgorICBzb2FwX3NldF9uYW1lc3BhY2VzKHNvYXAsIG5hbWVzcGFjZXMpOworICBpZiAoc29hcF9jYWxsX19faW5xMl9fZmluZF9VU0NPUkVzZXJ2aWNlKHNvYXAsIGVuZHBvaW50LCBOVUxMLCB0aGlzLCByZXN1bHQpKQorICAgIHJldHVybiBOVUxMOworCisgIHJldHVybiByZXN1bHQ7Cit9IAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOmZpbmRfdE1vZGVsCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsOjp1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAgKnNvYXApCit7CisgIC8vIEluaXRpYWxpemUgdGhpcyBvYmplY3QgYW5kIGFzc29jaWF0ZSBpdCB3aXRoIHRoZSBnU09BUCBjb250ZXh0CisgIHNvYXBfZGVmYXVsdChzb2FwKTsKKworICB0aGlzLT5nZW5lcmljID0gIjIuMCI7Cit9CisKK3VkZGkyX19maW5kX1VTQ09SRXRNb2RlbDo6dWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lKQoreworICAvLyBJbml0aWFsaXplIHRoaXMgb2JqZWN0IGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgZ1NPQVAgY29udGV4dAorICBzb2FwX2RlZmF1bHQoc29hcCk7CisKKyAgLy8gQ3JlYXRlIGEgbmV3IFVEREkgbmFtZQorICB0aGlzLT5uYW1lID0gc29hcF9uZXdfdWRkaTJfX25hbWUoc29hcCwgLTEpOworICB0aGlzLT5uYW1lLT5zb2FwX2RlZmF1bHQoc29hcCk7CisgIHRoaXMtPm5hbWUtPl9faXRlbSA9IHNvYXBfc3RyZHVwKHNvYXAsIG5hbWUpOworCisgIHRoaXMtPmdlbmVyaWMgPSAiMi4wIjsKK30KKwordWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsOjp1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAgKnNvYXAsIHN0ZDo6dmVjdG9yPHVkZGkyX19rZXllZFJlZmVyZW5jZSo+IGtleWVkUmVmZXJlbmNlcykKK3sKKyAgLy8gSW5pdGlhbGl6ZSB0aGlzIG9iamVjdCBhbmQgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGdTT0FQIGNvbnRleHQKKyAgc29hcF9kZWZhdWx0KHNvYXApOworCisgIC8vIENyZWF0ZSBhIG5ldyBVRERJIHRNb2RlbEJhZworICB0aGlzLT5jYXRlZ29yeUJhZyA9IHNvYXBfbmV3X3VkZGkyX19jYXRlZ29yeUJhZyhzb2FwLCAtMSk7CisgIHRoaXMtPmNhdGVnb3J5QmFnLT5zb2FwX2RlZmF1bHQoc29hcCk7CisgIHRoaXMtPmNhdGVnb3J5QmFnLT5rZXllZFJlZmVyZW5jZSA9IGtleWVkUmVmZXJlbmNlczsKKworICB0aGlzLT5nZW5lcmljID0gIjIuMCI7Cit9CisKK3VkZGkyX190TW9kZWxMaXN0KiB1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWw6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQpCit7CisgIC8vIEFsbG9jYXRlIHJlc3VsdAorICB1ZGRpMl9fdE1vZGVsTGlzdCAqcmVzdWx0ID0gc29hcF9uZXdfdWRkaTJfX3RNb2RlbExpc3Qoc29hcCwgLTEpOworCisgIC8vIEludm9rZSB0aGUgd3JhcHBlcgorICBzb2FwX3NldF9uYW1lc3BhY2VzKHNvYXAsIG5hbWVzcGFjZXMpOworICBpZiAoc29hcF9jYWxsX19faW5xMl9fZmluZF9VU0NPUkV0TW9kZWwoc29hcCwgZW5kcG9pbnQsIE5VTEwsIHRoaXMsIHJlc3VsdCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30gCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6Z2V0X2JpbmRpbmdEZXRhaWwKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWw6OnVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyAgLy8gSW5pdGlhbGl6ZSB0aGlzIG9iamVjdCBhbmQgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGdTT0FQIGNvbnRleHQKKyAgc29hcF9kZWZhdWx0KHNvYXApOworCisgIHRoaXMtPmdlbmVyaWMgPSAiMi4wIjsKK30KKwordWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmJpbmRpbmdLZXkpCit7CisgIC8vIEluaXRpYWxpemUgdGhpcyBvYmplY3QgYW5kIGFzc29jaWF0ZSBpdCB3aXRoIHRoZSBnU09BUCBjb250ZXh0CisgIHNvYXBfZGVmYXVsdChzb2FwKTsKKworICB0aGlzLT5iaW5kaW5nS2V5LnB1c2hfYmFjayhzb2FwX3N0cmR1cChzb2FwLCBiaW5kaW5nS2V5KSk7CisKKyAgdGhpcy0+Z2VuZXJpYyA9ICIyLjAiOworfQorCit1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWw6OnVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8Y2hhcio+IGJpbmRpbmdLZXlzKQoreworICAvLyBJbml0aWFsaXplIHRoaXMgb2JqZWN0IGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgZ1NPQVAgY29udGV4dAorICBzb2FwX2RlZmF1bHQoc29hcCk7CisKKyAgdGhpcy0+YmluZGluZ0tleSA9IGJpbmRpbmdLZXlzOworCisgIHRoaXMtPmdlbmVyaWMgPSAiMi4wIjsKK30KKwordWRkaTJfX2JpbmRpbmdEZXRhaWwgKnVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbDo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCkKK3sKKyAgLy8gQWxsb2NhdGUgcmVzdWx0CisgIHVkZGkyX19iaW5kaW5nRGV0YWlsICpyZXN1bHQgPSBzb2FwX25ld191ZGRpMl9fYmluZGluZ0RldGFpbChzb2FwLCAtMSk7CisKKyAgLy8gSW52b2tlIHRoZSB3cmFwcGVyCisgIHNvYXBfc2V0X25hbWVzcGFjZXMoc29hcCwgbmFtZXNwYWNlcyk7CisgIGlmIChzb2FwX2NhbGxfX19pbnEyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbChzb2FwLCBlbmRwb2ludCwgTlVMTCwgdGhpcywgcmVzdWx0KSkKKyAgICByZXR1cm4gTlVMTDsKKworICByZXR1cm4gcmVzdWx0OworfSAKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpnZXRfYnVzaW5lc3NEZXRhaWwKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsKHN0cnVjdCBzb2FwICpzb2FwKQoreworICAvLyBJbml0aWFsaXplIHRoaXMgb2JqZWN0IGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgZ1NPQVAgY29udGV4dAorICBzb2FwX2RlZmF1bHQoc29hcCk7CisKKyAgdGhpcy0+Z2VuZXJpYyA9ICIyLjAiOworfQorCit1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpidXNpbmVzc0tleSkKK3sKKyAgLy8gSW5pdGlhbGl6ZSB0aGlzIG9iamVjdCBhbmQgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGdTT0FQIGNvbnRleHQKKyAgc29hcF9kZWZhdWx0KHNvYXApOworCisgIHRoaXMtPmJ1c2luZXNzS2V5LnB1c2hfYmFjayhzb2FwX3N0cmR1cChzb2FwLCBidXNpbmVzc0tleSkpOworCisgIHRoaXMtPmdlbmVyaWMgPSAiMi4wIjsKK30KKwordWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbDo6dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8Y2hhcio+IGJ1c2luZXNzS2V5cykKK3sKKyAgLy8gSW5pdGlhbGl6ZSB0aGlzIG9iamVjdCBhbmQgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGdTT0FQIGNvbnRleHQKKyAgc29hcF9kZWZhdWx0KHNvYXApOworCisgIHRoaXMtPmJ1c2luZXNzS2V5ID0gYnVzaW5lc3NLZXlzOworCisgIHRoaXMtPmdlbmVyaWMgPSAiMi4wIjsKK30KKwordWRkaTJfX2J1c2luZXNzRGV0YWlsICp1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50KQoreworICAvLyBBbGxvY2F0ZSByZXN1bHQKKyAgdWRkaTJfX2J1c2luZXNzRGV0YWlsICpyZXN1bHQgPSBzb2FwX25ld191ZGRpMl9fYnVzaW5lc3NEZXRhaWwoc29hcCwgLTEpOworCisgIC8vIEludm9rZSB0aGUgd3JhcHBlcgorICBzb2FwX3NldF9uYW1lc3BhY2VzKHNvYXAsIG5hbWVzcGFjZXMpOworICBpZiAoc29hcF9jYWxsX19faW5xMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsKHNvYXAsIGVuZHBvaW50LCBOVUxMLCB0aGlzLCByZXN1bHQpKQorICAgIHJldHVybiBOVUxMOworCisgIHJldHVybiByZXN1bHQ7Cit9IAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOmdldF9idXNpbmVzc0RldGFpbEV4dAorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3VkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQ6OnVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQoc3RydWN0IHNvYXAgKnNvYXApCit7CisgIC8vIEluaXRpYWxpemUgdGhpcyBvYmplY3QgYW5kIGFzc29jaWF0ZSBpdCB3aXRoIHRoZSBnU09BUCBjb250ZXh0CisgIHNvYXBfZGVmYXVsdChzb2FwKTsKKworICB0aGlzLT5nZW5lcmljID0gIjIuMCI7Cit9CisKK3VkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQ6OnVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmJ1c2luZXNzS2V5KQoreworICAvLyBJbml0aWFsaXplIHRoaXMgb2JqZWN0IGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgZ1NPQVAgY29udGV4dAorICBzb2FwX2RlZmF1bHQoc29hcCk7CisKKyAgdGhpcy0+YnVzaW5lc3NLZXkucHVzaF9iYWNrKHNvYXBfc3RyZHVwKHNvYXAsIGJ1c2luZXNzS2V5KSk7CisKKyAgdGhpcy0+Z2VuZXJpYyA9ICIyLjAiOworfQorCit1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0Ojp1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0KHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3RvcjxjaGFyKj4gYnVzaW5lc3NLZXlzKQoreworICAvLyBJbml0aWFsaXplIHRoaXMgb2JqZWN0IGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgZ1NPQVAgY29udGV4dAorICBzb2FwX2RlZmF1bHQoc29hcCk7CisKKyAgdGhpcy0+YnVzaW5lc3NLZXkgPSBidXNpbmVzc0tleXM7CisKKyAgdGhpcy0+Z2VuZXJpYyA9ICIyLjAiOworfQorCit1ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHQgKnVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQ6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQpCit7CisgIC8vIEFsbG9jYXRlIHJlc3VsdAorICB1ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHQgKnJlc3VsdCA9IHNvYXBfbmV3X3VkZGkyX19idXNpbmVzc0RldGFpbEV4dChzb2FwLCAtMSk7CisKKyAgLy8gSW52b2tlIHRoZSB3cmFwcGVyCisgIHNvYXBfc2V0X25hbWVzcGFjZXMoc29hcCwgbmFtZXNwYWNlcyk7CisgIGlmIChzb2FwX2NhbGxfX19pbnEyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQoc29hcCwgZW5kcG9pbnQsIE5VTEwsIHRoaXMsIHJlc3VsdCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30gCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6Z2V0X3NlcnZpY2VEZXRhaWwKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWw6OnVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyAgLy8gSW5pdGlhbGl6ZSB0aGlzIG9iamVjdCBhbmQgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGdTT0FQIGNvbnRleHQKKyAgc29hcF9kZWZhdWx0KHNvYXApOworCisgIHRoaXMtPmdlbmVyaWMgPSAiMi4wIjsKK30KKwordWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnNlcnZpY2VLZXkpCit7CisgIC8vIEluaXRpYWxpemUgdGhpcyBvYmplY3QgYW5kIGFzc29jaWF0ZSBpdCB3aXRoIHRoZSBnU09BUCBjb250ZXh0CisgIHNvYXBfZGVmYXVsdChzb2FwKTsKKworICB0aGlzLT5zZXJ2aWNlS2V5LnB1c2hfYmFjayhzb2FwX3N0cmR1cChzb2FwLCBzZXJ2aWNlS2V5KSk7CisKKyAgdGhpcy0+Z2VuZXJpYyA9ICIyLjAiOworfQorCit1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWw6OnVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8Y2hhcio+IHNlcnZpY2VLZXlzKQoreworICAvLyBJbml0aWFsaXplIHRoaXMgb2JqZWN0IGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgZ1NPQVAgY29udGV4dAorICBzb2FwX2RlZmF1bHQoc29hcCk7CisKKyAgdGhpcy0+c2VydmljZUtleSA9IHNlcnZpY2VLZXlzOworCisgIHRoaXMtPmdlbmVyaWMgPSAiMi4wIjsKK30KKwordWRkaTJfX3NlcnZpY2VEZXRhaWwgKnVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbDo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCkKK3sKKyAgLy8gQWxsb2NhdGUgcmVzdWx0CisgIHVkZGkyX19zZXJ2aWNlRGV0YWlsICpyZXN1bHQgPSBzb2FwX25ld191ZGRpMl9fc2VydmljZURldGFpbChzb2FwLCAtMSk7CisKKyAgLy8gSW52b2tlIHRoZSB3cmFwcGVyCisgIHNvYXBfc2V0X25hbWVzcGFjZXMoc29hcCwgbmFtZXNwYWNlcyk7CisgIGlmIChzb2FwX2NhbGxfX19pbnEyX19nZXRfVVNDT1JFc2VydmljZURldGFpbChzb2FwLCBlbmRwb2ludCwgTlVMTCwgdGhpcywgcmVzdWx0KSkKKyAgICByZXR1cm4gTlVMTDsKKworICByZXR1cm4gcmVzdWx0OworfSAKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpnZXRfdE1vZGVsRGV0YWlsCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWw6OnVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsKHN0cnVjdCBzb2FwICpzb2FwKQoreworICAvLyBJbml0aWFsaXplIHRoaXMgb2JqZWN0IGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgZ1NPQVAgY29udGV4dAorICBzb2FwX2RlZmF1bHQoc29hcCk7CisKKyAgdGhpcy0+Z2VuZXJpYyA9ICIyLjAiOworfQorCit1ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbDo6dWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRNb2RlbEtleSkKK3sKKyAgLy8gSW5pdGlhbGl6ZSB0aGlzIG9iamVjdCBhbmQgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGdTT0FQIGNvbnRleHQKKyAgc29hcF9kZWZhdWx0KHNvYXApOworCisgIHRoaXMtPnRNb2RlbEtleS5wdXNoX2JhY2soc29hcF9zdHJkdXAoc29hcCwgdE1vZGVsS2V5KSk7CisKKyAgdGhpcy0+Z2VuZXJpYyA9ICIyLjAiOworfQorCit1ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbDo6dWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwoc3RydWN0IHNvYXAgKnNvYXAsIHN0ZDo6dmVjdG9yPGNoYXIqPiB0TW9kZWxLZXlzKQoreworICAvLyBJbml0aWFsaXplIHRoaXMgb2JqZWN0IGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgZ1NPQVAgY29udGV4dAorICBzb2FwX2RlZmF1bHQoc29hcCk7CisKKyAgdGhpcy0+dE1vZGVsS2V5ID0gdE1vZGVsS2V5czsKKworICB0aGlzLT5nZW5lcmljID0gIjIuMCI7Cit9CisKK3VkZGkyX190TW9kZWxEZXRhaWwgKnVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50KQoreworICAvLyBBbGxvY2F0ZSByZXN1bHQKKyAgdWRkaTJfX3RNb2RlbERldGFpbCAqcmVzdWx0ID0gc29hcF9uZXdfdWRkaTJfX3RNb2RlbERldGFpbChzb2FwLCAtMSk7CisKKyAgLy8gSW52b2tlIHRoZSB3cmFwcGVyCisgIHNvYXBfc2V0X25hbWVzcGFjZXMoc29hcCwgbmFtZXNwYWNlcyk7CisgIGlmIChzb2FwX2NhbGxfX19pbnEyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsKHNvYXAsIGVuZHBvaW50LCBOVUxMLCB0aGlzLCByZXN1bHQpKQorICAgIHJldHVybiBOVUxMOworCisgIHJldHVybiByZXN1bHQ7Cit9IAorCmRpZmYgLS1naXQgYS91ZGRpMi9pbnF1aXJlX3YyLmggYi91ZGRpMi9pbnF1aXJlX3YyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVhNjU5YQotLS0gL2Rldi9udWxsCisrKyBiL3VkZGkyL2lucXVpcmVfdjIuaApAQCAtMCwwICsxLDM3NTQgQEAKKy8qKiBAbWFpbnBhZ2UgZ1NPQVAgVURESSB2MgorCitVbml2ZXJzYWwgRGVzY3JpcHRpb24sIERpc2NvdmVyeSBhbmQgSW50ZWdyYXRpb24sIG9yIFVEREksIGlzIHRoZSBuYW1lIG9mIGEKK2dyb3VwIG9mIHdlYi1iYXNlZCByZWdpc3RyaWVzIHRoYXQgZXhwb3NlIGluZm9ybWF0aW9uIGFib3V0IGEgYnVzaW5lc3Mgb3Igb3RoZXIKK2VudGl0eSBhbmQgaXRzIHRlY2huaWNhbCBpbnRlcmZhY2VzLgorCitTZWUgdGhlIFVEREkgdjIgc3BlY2lmaWNhdGlvbiBAdXJsIGh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bQorZm9yIG1vcmUgZGV0YWlscy4KKworQHNlY3Rpb24gVURESTJfQ0xBU1NFUyBDbGFzc2VzCisKK1NlZSBSZWxhdGVkIFBhZ2VzIGZvciBleGFtcGxlcy4KKworVURESSBJbnF1aXJlIGNsYXNzZXMKKworLSBAcmVmIHVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmcKKy0gQHJlZiB1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzcworLSBAcmVmIHVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzCistIEByZWYgdWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZQorLSBAcmVmIHVkZGkyX19maW5kX1VTQ09SRXRNb2RlbAorLSBAcmVmIHVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbAorLSBAcmVmIHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwKKy0gQHJlZiB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0CistIEByZWYgdWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsCistIEByZWYgdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwKKworVURESSBQdWJsaXNoIGNsYXNzZXMKKworLSBAcmVmIHVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucworLSBAcmVmIHVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZworLSBAcmVmIHVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3MKKy0gQHJlZiB1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UKKy0gQHJlZiB1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbAorLSBAcmVmIHVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucworLSBAcmVmIHVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbgorLSBAcmVmIHVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0CistIEByZWYgdWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW4KKy0gQHJlZiB1ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMKKy0gQHJlZiB1ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvCistIEByZWYgdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZworLSBAcmVmIHVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzCistIEByZWYgdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZQorLSBAcmVmIHVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbAorLSBAcmVmIHVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucworCitAc2VjdGlvbiBVRERJMl9CSU5ESU5HUyBCaW5kaW5nIFJlZmVyZW5jZQorCistIEByZWYgSW5xdWlyZVNvYXAKKy0gQHJlZiBQdWJsaXNoU29hcAorCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOmZpbmRfYmluZGluZworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorQGNsYXNzIHVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmcKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBsb2NhdGUgYmluZGluZ3MgdGhhdCBtZWV0IHRoZSBzcGVjaWZpZWQgcmVxdWlyZW1lbnRzLgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzEyCisqLworCisvKioKK0BmbiB1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nOjp1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmaW5kX1VTQ09SRWJpbmRpbmcgY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nOjp1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0TW9kZWxLZXkpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIHRNb2RlbEtleSBzdHJpbmcKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmluZF9VU0NPUkViaW5kaW5nIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQgdE1vZGVsCitrZXkuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nOjp1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3RvcjxjaGFyKj4gdE1vZGVsS2V5cykKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gdE1vZGVsS2V5cyBjb2xsZWN0aW9uIG9mIHRNb2RlbCBrZXkgc3RyaW5ncworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmaW5kX1VTQ09SRWJpbmRpbmcgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZCB0TW9kZWwKK2tleXMuCisqLworCisvKioKK0BmbiB1ZGRpMl9fYmluZGluZ0RldGFpbCogdWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZzo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCkKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19iaW5kaW5nRGV0YWlsIG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2ZXIgdG8gZmluZCBiaW5kaW5nIGRldGFpbHMuCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOmZpbmRfYnVzaW5lc3MKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzcworQGJyaWVmCisKK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIGxvY2F0ZSBidXNpbmVzc2VzIHRoYXQgbWVldCBzcGVjaWZpYyByZXF1aXJlbWVudHMuIFdoZW4KK3RoZSBzZW5kIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBpbnN0YW5jZSByZXR1cm5zIGEgdWRkaTJfX2J1c2luZXNzTGlzdCBvYmplY3QKK3RoYXQgY29udGFpbnMgYSBsaXN0IG9mIGJ1c2luZXNzIHRoYXQgbWF0Y2hlZCB0aGUgc2VhcmNoIGNyaXRlcmlhLgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzEzCisKK1NlZSBhbHNvIEByZWYgZXhhbXBsZTIuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzczo6dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZpbmRfVVNDT1JFYnVzaW5lc3MgY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzczo6dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZpbmRfVVNDT1JFYnVzaW5lc3MgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZCBuYW1lCitvZiB0aGUgcmVxdWVzdGVkIGJ1c2luZXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M6OnVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UqPiBrZXllZFJlZmVyZW5jZXMpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZpbmRfVVNDT1JFYnVzaW5lc3MgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAorY2F0ZWdvcnkgcmVmZXJlbmNlcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzOjp1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8Y2hhcio+IHRNb2RlbEtleXMpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZpbmRfVVNDT1JFYnVzaW5lc3MgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZCB0TW9kZWwKK2tleXMuCisqLworCisvKioKK0BmbiB1ZGRpMl9fYnVzaW5lc3NMaXN0ICp1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzczo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCkKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19idXNpbmVzc0xpc3Qgb2JqZWN0IG9yIE5VTEwgb24gZXJyb3IKKworU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZlciB0byBmaW5kIGEgbGlzdCBvZiBidXNpbmVzc2VzLgorCitTZWUgYWxzbyBAcmVmIGV4YW1wbGUyLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpmaW5kX3JlbGF0ZWRCdXNpbmVzc2VzCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCitAY2xhc3MgdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBsb2NhdGUgYnVzaW5lc3NlcyB0aGF0IGFyZSByZWxhdGVkIHRvIGEgc3BlY2lmaWMKK2J1c2luZXNzLiBXaGVuIHRoZSBzZW5kIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBpbnN0YW5jZSByZXR1cm5zIGEKK3VkZGkyX19yZWxhdGVkQnVzaW5lc3NMaXN0IG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZiBidXNpbmVzcyB0aGF0IG1hdGNoZWQKK3RoZSByZWxhdGlvbnNoaXAgc2V0LgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzE0CisqLworCisvKioKK0BmbiB1ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3Nlczo6dWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXM6OnVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpidXNpbmVzc0tleSkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gYnVzaW5lc3NLZXkgc3RyaW5nCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK2J1c2luZXNzIGtleS4KKyovCisKKy8qKgorQGZuIHVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3QgKnVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50KQorQGJyaWVmCitAcGFyYW1baW5dIGVuZHBvaW50IFVSTCBvZiB0aGUgVURESSBzZXJ2ZXIKK0ByZXR1cm4gQSBwb2ludGVyIHRvIGEgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0xpc3Qgb2JqZWN0IG9yIE5VTEwgb24gZXJyb3IKKworU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZlciB0byBmaW5kIGEgbGlzdCBvZiByZWxhdGVkIGJ1c2luZXNzZXMuCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOmZpbmRfc2VydmljZQorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorQGNsYXNzIHVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2UKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBsb2NhdGUgc2VydmljZXMgdGhhdCBtZWV0IHRoZSBzcGVjaWZpZWQgcmVxdWlyZW1lbnRzLgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzE1CisKK1NlZSBhbHNvIEByZWYgZXhhbXBsZTEuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlOjp1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmaW5kX1VTQ09SRXNlcnZpY2UgY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlOjp1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBuYW1lIG9mIHRoZSBzZXJ2aWNlCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZpbmRfVVNDT1JFc2VydmljZSBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkIG5hbWUuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlOjp1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UqPiBrZXllZFJlZmVyZW5jZXMpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIGtleWVkUmVmZXJlbmNlcyBjb2xsZWN0aW9uIG9mIGNhdGVnb3J5IGtleXMKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmluZF9VU0NPUkVzZXJ2aWNlIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK2NhdGVnb3J5IGtleXMuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlOjp1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3RvcjxjaGFyKj4gdE1vZGVsS2V5cykKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gdE1vZGVsS2V5cyBjb2xsZWN0aW9uIG9mIHRNb2RlbCBrZXkgc3RyaW5ncworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmaW5kX1VTQ09SRXNlcnZpY2UgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZCB0TW9kZWwKK2tleXMuCisqLworCisvKioKK0BmbiB1ZGRpMl9fc2VydmljZUxpc3QqIHVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2U6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQpCitAYnJpZWYKK0BwYXJhbVtpbl0gZW5kcG9pbnQgVVJMIG9mIHRoZSBVRERJIHNlcnZlcgorQHJldHVybiBBIHBvaW50ZXIgdG8gYSB1ZGRpMl9fc2VydmljZUxpc3Qgb2JqZWN0IG9yIE5VTEwgb24gZXJyb3IKKworU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZlciB0byBmaW5kIGEgbGlzdCBvZiBzZXJ2aWNlcy4KKworU2VlIGFsc28gQHJlZiBleGFtcGxlMS4KKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6ZmluZF90TW9kZWwKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWwKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBsb2NhdGUgYSBsaXN0IG9mIHRNb2RlbCBlbnRyaWVzIHRoYXQgbWF0Y2ggYSBzZXQgb2YKK3NwZWNpZmljIGNyaXRlcmlhLiBUaGUgcmVzdWx0IG9mIGEgc2VhcmNoIGlzIGEgdWRkaTJfX3RNb2RlbExpc3Qgb2JqZWN0IHRoYXQKK2NvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHJlZ2lzdGVyZWQgdE1vZGVsIGRhdGEgdGhhdCBtYXRjaGVzIHRoZSBjcml0ZXJpYS4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzcxNgorKi8KKworLyoqCitAZm4gdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsOjp1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZpbmRfVVNDT1JFdE1vZGVsIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsOjp1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIG5hbWUgb2YgdGhlIHRNb2RlbAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmaW5kX1VTQ09SRXRNb2RlbCBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkIHRNb2RlbAorbmFtZS4KKyovCisKKy8qKgorQGZuIHVkZGkyX19maW5kX1VTQ09SRXRNb2RlbDo6dWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UqPiBrZXllZFJlZmVyZW5jZXMpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIGtleWVkUmVmZXJlbmNlcyBjb2xsZWN0aW9uIG9mIGNhdGVnb3J5IGtleXMKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmluZF9VU0NPUkV0TW9kZWwgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZCBjYXRlZ29yeQora2V5cy4KKyovCisKKy8qKgorQGZuIHVkZGkyX190TW9kZWxMaXN0KiB1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWw6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQpCitAYnJpZWYKK0BwYXJhbVtpbl0gZW5kcG9pbnQgVVJMIG9mIHRoZSBVRERJIHNlcnZlcgorQHJldHVybiBBIHBvaW50ZXIgdG8gYSB1ZGRpMl9fdE1vZGVsTGlzdCBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcgorCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmVyIHRvIGZpbmQgYSB0TW9kZWxMaXN0LgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpnZXRfYmluZGluZ0RldGFpbAorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorQGNsYXNzIHVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbAorQGJyaWVmCisKK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIGdldCBiaW5kaW5nIGRldGFpbHMgZnJvbSBhIFVEREkgc2VydmVyLgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzE3CisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWw6OnVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwgY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWw6OnVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqYmluZGluZ0tleSkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gYmluZGluZ0tleSBzdHJpbmcKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAorYmluZGluZyBrZXkuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWw6OnVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8Y2hhcio+IGJpbmRpbmdLZXlzKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBiaW5kaW5nS2V5cyBjb2xsZWN0aW9uIG9mIGtleSBzdHJpbmdzCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdldF9VU0NPUkViaW5kaW5nRGV0YWlsIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK2NvbGxlY3Rpb24gb2YgYmluZGluZyBrZXlzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2JpbmRpbmdEZXRhaWwqIHVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbDo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCkKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19iaW5kaW5nRGV0YWlsIG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2ZXIgdG8gZ2V0IHRoZSBiaW5kaW5nIGRldGFpbHMuCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOmdldF9idXNpbmVzc0RldGFpbAorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorQGNsYXNzIHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBnZXQgYnVzaW5lc3MgZGV0YWlscyBmcm9tIGEgVURESSBzZXJ2ZXIuCisKK1NlZSBAdXJsIGh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3MTggCisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwgY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpidXNpbmVzc0tleSkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gYnVzaW5lc3NLZXkgc3RyaW5nCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdldF9VU0NPUkVidXNpbmVzc0RldGFpbCBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkCitidXNpbmVzcyBrZXkuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3RvcjxjaGFyKj4gYnVzaW5lc3NLZXlzKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBidXNpbmVzc0tleXMgY29sbGVjdGlvbiBvZiBrZXkgc3RyaW5ncworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAorY29sbGVjdGlvbiBvZiBidXNpbmVzcyBrZXlzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2J1c2luZXNzRGV0YWlsKiB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50KQorQGJyaWVmCitAcGFyYW1baW5dIGVuZHBvaW50IFVSTCBvZiB0aGUgVURESSBzZXJ2ZXIKK0ByZXR1cm4gQSBwb2ludGVyIHRvIGEgdWRkaTJfX2J1c2luZXNzRGV0YWlsIG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2ZXIgdG8gZ2V0IHRoZSBidXNpbmVzcyBkZXRhaWxzLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpnZXRfYnVzaW5lc3NEZXRhaWxFeHQKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0CitAYnJpZWYKKworUmVwcmVzZW50cyBhIHJlcXVlc3QgdG8gZ2V0IGJ1c2luZXNzIGRldGFpbHMgZnJvbSBhIFVEREkgc2VydmVyLgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzE5CisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0Ojp1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0KHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQgY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0Ojp1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpidXNpbmVzc0tleSkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gYnVzaW5lc3NLZXkgc3RyaW5nCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dCBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkCitidXNpbmVzcyBrZXkuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0Ojp1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0KHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3RvcjxjaGFyKj4gYnVzaW5lc3NLZXlzKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBidXNpbmVzc0tleXMgY29sbGVjdGlvbiBvZiBrZXkgc3RyaW5ncworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAorY29sbGVjdGlvbiBvZiBidXNpbmVzcyBrZXlzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0KiB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0OjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50KQorQGJyaWVmCitAcGFyYW1baW5dIGVuZHBvaW50IFVSTCBvZiB0aGUgVURESSBzZXJ2ZXIKK0ByZXR1cm4gQSBwb2ludGVyIHRvIGEgdWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0IG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2ZXIgdG8gZ2V0IHRoZSBidXNpbmVzcyBkZXRhaWxzLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpnZXRfc2VydmljZURldGFpbAorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorQGNsYXNzIHVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbAorQGJyaWVmCisKK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIGdldCBzZXJ2aWNlIGRldGFpbHMgZnJvbSBhIFVEREkgc2VydmVyLgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzIwCisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWw6OnVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwgY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWw6OnVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqc2VydmljZUtleSkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gc2VydmljZUtleSBzdHJpbmcKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAorc2VydmljZSBrZXkuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWw6OnVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8Y2hhcio+IHNlcnZpY2VLZXlzKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBzZXJ2aWNlS2V5cyBjb2xsZWN0aW9uIG9mIGtleSBzdHJpbmdzCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdldF9VU0NPUkVzZXJ2aWNlRGV0YWlsIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK2NvbGxlY3Rpb24gb2Ygc2VydmljZSBrZXlzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX3NlcnZpY2VEZXRhaWwqIHVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbDo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCkKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19zZXJ2aWNlRGV0YWlsIG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2ZXIgdG8gZ2V0IHRoZSBzZXJ2aWNlIGRldGFpbHMuCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOmdldF90TW9kZWxEZXRhaWwKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbAorQGJyaWVmCisKK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIGdldCB0TW9kZWwgZGV0YWlscyBmcm9tIGEgVURESSBzZXJ2ZXIuCisKK1NlZSBAdXJsIGh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3MjEKKyovCisKKy8qKgorQGZuIHVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRXRNb2RlbERldGFpbCBjbGFzcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdE1vZGVsS2V5KQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSB0TW9kZWxLZXkgc3RyaW5nCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdldF9VU0NPUkV0TW9kZWxEZXRhaWwgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAordE1vZGVsIGtleS4KKyovCisKKy8qKgorQGZuIHVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8Y2hhcio+IHRNb2RlbEtleXMpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIHRNb2RlbEtleXMgY29sbGVjdGlvbiBvZiBrZXkgc3RyaW5ncworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFdE1vZGVsRGV0YWlsIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK2NvbGxlY3Rpb24gb2YgdE1vZGVsIGtleXMuCisqLworCisvKioKK0BmbiB1ZGRpMl9fdE1vZGVsRGV0YWlsKiB1ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbDo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCkKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX190TW9kZWxEZXRhaWwgb2JqZWN0IG9yIE5VTEwgb24gZXJyb3IKKworU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZlciB0byBnZXQgdGhlIHRNb2RlbCBkZXRhaWxzLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjphZGRfcHVibGlzaGVyQXNzZXJ0aW9ucworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorQGNsYXNzIHVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucworQGJyaWVmCisKK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIGFkZCBvbmUgb3IgbW9yZSBwdWJsaXNoZXIgYXNzZXJ0aW9ucyB0byB0aGUgYXNzZXJ0aW9uCitjb2xsZWN0aW9uIGZvciBhbiBpbmRpdmlkdWFsIHB1Ymxpc2hlci4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzczMQorKi8KKworLyoqCitAZm4gdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjp1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjp1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAgKnNvYXAsIHN0ZDo6dmVjdG9yPHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24qPiBwdWJsaXNoZXJBc3NlcnRpb25zKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBwdWJsaXNoZXJBc3NlcnRpb25zIGNvbGxlY3Rpb24gb2YgcHVibGlzaGVyIGFzc2VydGlvbnMKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgY2xhc3MgdXNpbmcgdGhlCitzcGVjaWZpZWQgcHVibGlzaGVyIGFzc2VydGlvbnMuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgKnVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pCitAYnJpZWYKK0BwYXJhbVtpbl0gZW5kcG9pbnQgVVJMIG9mIHRoZSBVRERJIHNlcnZlcgorQHBhcmFtW2luXSBhdXRoSW5mbyBhdXRob3JpemF0aW9uIHRva2VuIHByb3ZpZGVkIGJ5IHRoZSBVRERJIHNlcnZlcgorQHJldHVybiBBIHBvaW50ZXIgdG8gYSB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgb2JqZWN0IG9yIE5VTEwgb24gZXJyb3IKKworU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZlciB0byBhZGQgb25lIG9yIG1vcmUgcHVibGlzaGVyIGFzc2VydGlvbnMgdG8gdGhlCithc3NlcnRpb24gY29sbGVjdGlvbiBmb3IgYW4gaW5kaXZpZHVhbCBwdWJsaXNoZXIuCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOmRlbGV0ZV9iaW5kaW5nCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCitAY2xhc3MgdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nCitAYnJpZWYKKworUmVwcmVzZW50cyBhIHJlcXVlc3QgdG8gZGVsZXRlIGEgYmluZGluZyB0aGF0IG1lZXRzIHRoZSBzcGVjaWZpZWQgcmVxdWlyZW1lbnRzLgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzMyCisqLworCisvKioKK0BmbiB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmc6OnVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZgorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWxldGVfVVNDT1JFYmluZGluZyBjbGFzcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZzo6dWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpiaW5kaW5nS2V5KQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBiaW5kaW5nS2V5IGEgYmluZGluZyBrZXkgc3RyaW5nCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGV0ZV9VU0NPUkViaW5kaW5nIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nOjp1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAgKnNvYXAsIHN0ZDo6dmVjdG9yPGNoYXIqPiBiaW5kaW5nS2V5cykKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gYmluZGluZ0tleXMgY29sbGVjdGlvbiBvZiBiaW5kaW5nIGtleXMKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZGVsZXRlX1VTQ09SRWJpbmRpbmcgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAorYmluZGluZyBrZXlzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0ICp1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmc6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKQorQGJyaWVmCitAcGFyYW1baW5dIGVuZHBvaW50IFVSTCBvZiB0aGUgVURESSBzZXJ2ZXIKK0BwYXJhbVtpbl0gYXV0aEluZm8gYXV0aG9yaXphdGlvbiB0b2tlbiBwcm92aWRlZCBieSB0aGUgVURESSBzZXJ2ZXIKK0ByZXR1cm4gQSBwb2ludGVyIHRvIGEgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0IG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2aWNlIHRvIGRlbGV0ZSBhIGJpbmRpbmcgdGhhdCBtZWV0cyB0aGUgc3BlY2lmaWVkCityZXF1aXJlbWVudHMuCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOmRlbGV0ZV9idXNpbmVzcworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorQGNsYXNzIHVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3MKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBkZWxldGUgYSBidXNpbmVzcyB0aGF0IG1lZXRzIHRoZSBzcGVjaWZpZWQgcmVxdWlyZW1lbnRzLgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzMzCisqLworCisvKioKK0BmbiB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzOjp1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWxldGVfVVNDT1JFYnVzaW5lc3MgY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzOjp1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpidXNpbmVzc0tleSkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gYnVzaW5lc3NLZXkgYSBidXNpbmVzcyBrZXkgc3RyaW5nCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGV0ZV9VU0NPUkVidXNpbmVzcyBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkCitidXNpbmVzcyBrZXkuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzOjp1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3RvcjxjaGFyKj4gYnVzaW5lc3NLZXlzKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBidXNpbmVzc0tleXMgY29sbGVjdGlvbiBvZiBidXNpbmVzcyBrZXlzCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGV0ZV9VU0NPUkVidXNpbmVzcyBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkCitidXNpbmVzcyBrZXlzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0ICp1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbykKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcGFyYW1baW5dIGF1dGhJbmZvIGF1dGhvcml6YXRpb24gdG9rZW4gcHJvdmlkZWQgYnkgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcgorCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmljZSB0byBkZWxldGUgYSBidXNpbmVzcyB0aGF0IG1lZXRzIHRoZSBzcGVjaWZpZWQKK3JlcXVpcmVtZW50cy4KKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6ZGVsZXRlX3NlcnZpY2UKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBkZWxldGUgYSBzZXJ2aWNlIHRoYXQgbWVldHMgdGhlIHNwZWNpZmllZCByZXF1aXJlbWVudHMuCisKK1NlZSBAdXJsIGh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3MzUKKyovCisKKy8qKgorQGZuIHVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZTo6dWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWxldGVfVVNDT1JFc2VydmljZSBjbGFzcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZTo6dWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzZXJ2aWNlS2V5KQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBzZXJ2aWNlS2V5IGEgc2VydmljZSBrZXkgc3RyaW5nCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGV0ZV9VU0NPUkVzZXJ2aWNlIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK3NlcnZpY2Uga2V5LgorKi8KKworLyoqCitAZm4gdWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlOjp1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0ZDo6dmVjdG9yPGNoYXIqPiBzZXJ2aWNlS2V5cykKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gc2VydmljZUtleXMgY29sbGVjdGlvbiBvZiBzZXJ2aWNlIGtleXMKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZGVsZXRlX1VTQ09SRXNlcnZpY2UgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAorc2VydmljZSBrZXlzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0ICp1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2U6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKQorQGJyaWVmCitAcGFyYW1baW5dIGVuZHBvaW50IFVSTCBvZiB0aGUgVURESSBzZXJ2ZXIKK0BwYXJhbVtpbl0gYXV0aEluZm8gYXV0aG9yaXphdGlvbiB0b2tlbiBwcm92aWRlZCBieSB0aGUgVURESSBzZXJ2ZXIKK0ByZXR1cm4gQSBwb2ludGVyIHRvIGEgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0IG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2aWNlIHRvIGRlbGV0ZSBhIHNlcnZpY2UgdGhhdCBtZWV0cyB0aGUgc3BlY2lmaWVkCityZXF1aXJlbWVudHMuCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOmRlbGV0ZV90TW9kZWwKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbAorQGJyaWVmCisKK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIGRlbGV0ZSBhIHRNb2RlbCB0aGF0IG1lZXRzIHRoZSBzcGVjaWZpZWQgcmVxdWlyZW1lbnRzLgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzM2CisqLworCisvKioKK0BmbiB1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbDo6dWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGV0ZV9VU0NPUkV0TW9kZWwgY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbDo6dWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRNb2RlbEtleSkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gdE1vZGVsS2V5IGEgdE1vZGVsIGtleSBzdHJpbmcKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZGVsZXRlX1VTQ09SRXRNb2RlbCBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkCit0TW9kZWwga2V5LgorKi8KKworLyoqCitAZm4gdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWw6OnVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3RvcjxjaGFyKj4gdE1vZGVsS2V5cykKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gdE1vZGVsS2V5cyBjb2xsZWN0aW9uIG9mIHRNb2RlbCBrZXlzCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGV0ZV9VU0NPUkV0TW9kZWwgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAordE1vZGVsIGtleXMuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgKnVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbykKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcGFyYW1baW5dIGF1dGhJbmZvIGF1dGhvcml6YXRpb24gdG9rZW4gcHJvdmlkZWQgYnkgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcgorCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmljZSB0byBkZWxldGUgYSB0TW9kZWwgdGhhdCBtZWV0cyB0aGUgc3BlY2lmaWVkCityZXF1aXJlbWVudHMuCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOmRlbGV0ZV9wdWJsaXNoZXJBc3NlcnRpb25zCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCitAY2xhc3MgdWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zCitAYnJpZWYKKworUmVwcmVzZW50cyBhIHJlcXVlc3QgdG8gZGVsZXRlIHB1Ymxpc2hlciBhc3NlcnRpb25zIG1lZXRpbmcgdGhlIHNwZWNpZmllZAorcmVxdWlyZW1lbnRzLgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzM0CisqLworCisvKioKK0BmbiB1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM6OnVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM6OnVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbio+IHB1Ymxpc2hlckFzc2VydGlvbnMpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIHB1Ymxpc2hlckFzc2VydGlvbnMgYSBjb2xsZWN0aW9uIG9mIHB1Ymxpc2hlciBhc3NlcnRpb25zCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zIGNsYXNzIHVzaW5nIHRoZQorc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2YgcHVibGlzaGVyIGFzc2VydGlvbnMuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgKnVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pCitAYnJpZWYKK0BwYXJhbVtpbl0gZW5kcG9pbnQgVVJMIG9mIHRoZSBVRERJIHNlcnZlcgorQHBhcmFtW2luXSBhdXRoSW5mbyBhdXRob3JpemF0aW9uIHRva2VuIHByb3ZpZGVkIGJ5IHRoZSBVRERJIHNlcnZlcgorQHJldHVybiBBIHBvaW50ZXIgdG8gYSB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgb2JqZWN0IG9yIE5VTEwgb24gZXJyb3IKKworU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZpY2UgdG8gZGVsZXRlIHB1Ymxpc2hlciBhc3NlcnRpb25zIG1lZXRpbmcgdGhlCitzcGVjaWZpZWQgcmVxdWlyZW1lbnRzLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpkaXNjYXJkX2F1dGhUb2tlbgorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorQGNsYXNzIHVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbgorQGJyaWVmCisKK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIGRpc2NhcmQgYW4gYXV0aG9yaXphdGlvbiB0b2tlbiBvYnRhaW5lZCB3aXRoIHRoZQorZ2V0X1VTQ09SRWF1dGhUb2tlbiBjbGFzcy4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzczNworKi8KKworLyoqCitAZm4gdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuOjp1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4oc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGV0ZV9VU0NPUkVhdXRoVG9rZW4gY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW46OnVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqYXV0aEluZm8pCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIGF1dGhJbmZvIGF1dGhvcml6YXRpb24gdG9rZW4gcHJvdmlkZWQgYnkgdGhlIFVEREkgc2VydmVyCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGV0ZV9VU0NPUkVhdXRoVG9rZW4gY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAorYXV0aGVudGljYXRpb24gdG9rZW4gc3RyaW5nLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0ICp1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW46OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQpCitAYnJpZWYKK0BwYXJhbVtpbl0gZW5kcG9pbnQgVVJMIG9mIHRoZSBVRERJIHNlcnZlcgorQHJldHVybiBBIHBvaW50ZXIgdG8gYSB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgb2JqZWN0IG9yIE5VTEwgb24gZXJyb3IKKworU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZpY2UgdG8gZGlzY2FyZCBhbiBhdXRoZW50aWNhdGlvbiB0b2tlbi4KKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6Z2V0X2Fzc2VydGlvblN0YXR1c1JlcG9ydAorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorQGNsYXNzIHVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0CitAYnJpZWYKKworUHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gZGV0ZXJtaW5lIHRoZSBzdGF0dXMgb2YgY3VycmVudCBhbmQgb3V0c3RhbmRpbmcKK3B1Ymxpc2hlciBhc3NlcnRpb25zLiBUaGUgcmVzdWx0cyBjYW4gYmUgcmVzdHJpY3RlZCBieSBzZXR0aW5nIHRoZQorY29tcGxldGlvblN0YXR1cyBwcm9wZXJ0eS4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzczOAorKi8KKworLyoqCitAZm4gdWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQ6OnVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0IGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQ6OnVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpjb21wbGV0aW9uU3RhdHVzKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBjb21wbGV0aW9uU3RhdHVzIGNvbXBsZXRpb24gc3RhdHVzIHN0cmluZworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0IGNsYXNzIHVzaW5nIHRoZQorc3BlY2lmaWVkIGNvbXBsZXRpb24gc3RhdHVzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydCAqdWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQ6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKQorQGJyaWVmCitAcGFyYW1baW5dIGVuZHBvaW50IFVSTCBvZiB0aGUgVURESSBzZXJ2ZXIKK0BwYXJhbVtpbl0gYXV0aEluZm8gYXV0aG9yaXphdGlvbiB0b2tlbiBwcm92aWRlZCBieSB0aGUgVURESSBzZXJ2ZXIKK0ByZXR1cm4gQSBwb2ludGVyIHRvIGEgdWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydCBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcgorCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmljZSB0byBnZXQgdGhlIHN0YXR1cyBvZiBjdXJyZW50IGFuZCBvdXRzdGFuZGluZworcHVibGlzaGVyIGFzc2VydGlvbnMuCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOmdldF9hdXRoVG9rZW4KKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbgorQGJyaWVmCisKK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIG9idGFpbiBhbiBhdXRob3JpemF0aW9uIHRva2VuLCB3aGljaCBpcyByZXByZXNlbnRlZCBieQordGhlIHVkZGkyX19hdXRoVG9rZW4gY2xhc3MuCisKK1NlZSBAdXJsIGh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3MzkKKyovCisKKy8qKgorQGZuIHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuOjp1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRWF1dGhUb2tlbiBjbGFzcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuOjp1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdXNlcmlkLCBjb25zdCBjaGFyICpwYXNzd2QpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIHVzZXJpZCB0aGUgdXNlciBJRCBzdHJpbmcKK0BwYXJhbVtpbl0gcGFzc3dkIHRoZSBwYXNzd29yZCBzdHJpbmcKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRWF1dGhUb2tlbiBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkIHVzZXIKK0lEIGFuZCBwYXNzd29yZC4KKyovCisKKy8qKgorQGZuIHVkZGkyX19hdXRoVG9rZW4gKnVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50KQorQGJyaWVmCitAcGFyYW1baW5dIGVuZHBvaW50IFVSTCBvZiB0aGUgVURESSBzZXJ2ZXIKK0ByZXR1cm4gQSBwb2ludGVyIHRvIGEgdWRkaTJfX2F1dGhUb2tlbiBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcgorCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmljZSB0byBnZXQgYSBhdXRob3JpemF0aW9uIHRva2VuIGdpdmVuIGEgdXNlcgorSUQgYW5kIHBhc3N3b3JkLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpnZXRfcHVibGlzaGVyQXNzZXJ0aW9ucworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorQGNsYXNzIHVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucworQGJyaWVmCisKK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIG9idGFpbiB0aGUgZnVsbCBzZXQgb2YgcHVibGlzaGVyIGFzc2VydGlvbnMgdGhhdCBhcmUKK2Fzc29jaWF0ZWQgd2l0aCBhbiBpbmRpdmlkdWFsIHB1Ymxpc2hlci4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzc0MAorKi8KKworLyoqCitAZm4gdWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjp1ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdldF9VU0NPUkVwdWJsaXNoZXJBc3NldGlvbnMgY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9ucyAqdWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbykKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcGFyYW1baW5dIGF1dGhJbmZvIGF1dGhvcml6YXRpb24gdG9rZW4gcHJvdmlkZWQgYnkgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zIG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2aWNlIHRvIGdldCBwdWJsaXNoZXIgYXNzZXJ0aW9ucy4KKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6Z2V0X3JlZ2lzdGVyZWRJbmZvCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCitAY2xhc3MgdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbworQGJyaWVmCisKK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIGdldCBhbGwgcmVnaXN0ZXJlZCBidXNpbmVzcyBlbnRpdGllcyBhbmQgdE1vZGVscworY29udHJvbGxlZCBieSBhbiBpbmRpdmlkdWFsLgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzQxCisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvOjp1ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8gY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fcmVnaXN0ZXJlZEluZm8gKnVkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm86OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKQorQGJyaWVmCitAcGFyYW1baW5dIGVuZHBvaW50IFVSTCBvZiB0aGUgVURESSBzZXJ2ZXIKK0BwYXJhbVtpbl0gYXV0aEluZm8gYXV0aG9yaXphdGlvbiB0b2tlbiBwcm92aWRlZCBieSB0aGUgVURESSBzZXJ2ZXIKK0ByZXR1cm4gQSBwb2ludGVyIHRvIGEgdWRkaTJfX3JlZ2lzdGVyZWRJbmZvIG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2aWNlIHRvIGdldCBhbGwgcmVnaXN0ZXJlZCBidXNpbmVzcyBlbnRpdGllcyBhbmQKK3RNb2RlbHMgY29udHJvbGxlZCBieSBhbiBpbmRpdmlkdWFsLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpzYXZlX2JpbmRpbmcKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nCitAYnJpZWYKKworUmVwcmVzZW50cyBhIHJlcXVlc3QgdG8gcG9zdCBiaW5kaW5nIGluZm9ybWF0aW9uIG9uIGEgVURESSBzZXJ2ZXIuCisKK1NlZSBAdXJsIGh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3NDIKKyovCisKKy8qKgorQGZuIHVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmc6OnVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNhdmVfVVNDT1JFYmluZGluZyBjbGFzcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmc6OnVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAgKnNvYXAsIHVkZGkyX19iaW5kaW5nVGVtcGxhdGUgJmJpbmRpbmdUZW1wbGF0ZSkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gYmluZGluZ1RlbXBsYXRlIGJpbmRpbmcgdGVtcGxhdGUKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc2F2ZV9VU0NPUkViaW5kaW5nIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQgYmluZGluZwordGVtcGxhdGUuCisqLworCisvKioKK0BmbiB1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nOjp1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYmluZGluZ1RlbXBsYXRlKj4gYmluZGluZ1RlbXBsYXRlcykKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gYmluZGluZ1RlbXBsYXRlcyBjb2xsZWN0aW9uIG9mIGJpbmRpbmcgdGVtcGxhdGVzCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNhdmVfVVNDT1JFYmluZGluZyBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkIGJpbmRpbmcKK3RlbXBsYXRlcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19iaW5kaW5nRGV0YWlsICp1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbykKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcGFyYW1baW5dIGF1dGhJbmZvIGF1dGhvcml6YXRpb24gdG9rZW4gcHJvdmlkZWQgYnkgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19iaW5kaW5nRGV0YWlsIG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2ZXIgdG8gcG9zdCBiaW5kaW5nIGluZm9ybWF0aW9uIG9uIHRoZSBzZXJ2ZXIuCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOnNhdmVfYnVzaW5lc3MKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcworQGJyaWVmCisKK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIHBvc3QgYnVzaW5lc3MgaW5mb3JtYXRpb24gb24gYSBVRERJIHNlcnZlci4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzc0MworKi8KKworLyoqCitAZm4gdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M6OnVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzYXZlX1VTQ09SRWJ1c2luZXNzIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M6OnVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwICpzb2FwLCB1ZGRpMl9fYnVzaW5lc3NFbnRpdHkgJmJ1c2luZXNzRW50aXR5KQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBidXNpbmVzc0VudGl0eSBidXNpbmVzcyBlbnRpdHkKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc2F2ZV9VU0NPUkVidXNpbmVzcyBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkCitidXNpbmVzcyBlbnRpdHkuCisqLworCisvKioKK0BmbiB1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzczo6dWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAgKnNvYXAsIHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc0VudGl0eSo+IGJ1c2luZXNzRW50aXRpZXMpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIGJ1c2luZXNzRW50aXRpZXMgY29sbGVjdGlvbiBvZiBidXNpbmVzcyBlbnRpdGllcworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzYXZlX1VTQ09SRWJ1c2luZXNzIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK2J1c2luZXNzIGVudGl0aWVzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2J1c2luZXNzRGV0YWlsICp1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzczo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pCitAYnJpZWYKK0BwYXJhbVtpbl0gZW5kcG9pbnQgVVJMIG9mIHRoZSBVRERJIHNlcnZlcgorQHBhcmFtW2luXSBhdXRoSW5mbyBhdXRob3JpemF0aW9uIHRva2VuIHByb3ZpZGVkIGJ5IHRoZSBVRERJIHNlcnZlcgorQHJldHVybiBBIHBvaW50ZXIgdG8gYSB1ZGRpMl9fYnVzaW5lc3NEZXRhaWwgb2JqZWN0IG9yIE5VTEwgb24gZXJyb3IKKworU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZlciB0byBwb3N0IGJ1c2luZXNzIGluZm9ybWF0aW9uIG9uIHRoZSBzZXJ2ZXIuCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOnNhdmVfc2VydmljZQorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorQGNsYXNzIHVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2UKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBwb3N0IHNlcnZpY2UgaW5mb3JtYXRpb24gb24gYSBVRERJIHNlcnZlci4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzc0NAorKi8KKworLyoqCitAZm4gdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZTo6dWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc2F2ZV9VU0NPUkVzZXJ2aWNlIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZTo6dWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCAqc29hcCwgdWRkaTJfX2J1c2luZXNzU2VydmljZSAmYnVzaW5lc3NTZXJ2aWNlKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBidXNpbmVzc1NlcnZpY2UgYnVzaW5lc3Mgc2VydmljZQorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzYXZlX1VTQ09SRXNlcnZpY2UgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAorc2VydmljZS4KKyovCisKKy8qKgorQGZuIHVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2U6OnVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc1NlcnZpY2UqPiBidXNpbmVzc1NlcnZpY2VzKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBidXNpbmVzc1NlcnZpY2VzIGNvbGxlY3Rpb24gb2YgYnVzaW5lc3Mgc2VydmljZXMKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc2F2ZV9VU0NPUkVzZXJ2aWNlIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK3NlcnZpY2VzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX3NlcnZpY2VEZXRhaWwgKnVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2U6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKQorQGJyaWVmCitAcGFyYW1baW5dIGVuZHBvaW50IFVSTCBvZiB0aGUgVURESSBzZXJ2ZXIKK0BwYXJhbVtpbl0gYXV0aEluZm8gYXV0aG9yaXphdGlvbiB0b2tlbiBwcm92aWRlZCBieSB0aGUgVURESSBzZXJ2ZXIKK0ByZXR1cm4gQSBwb2ludGVyIHRvIGEgdWRkaTJfX3NlcnZpY2VEZXRhaWwgb2JqZWN0IG9yIE5VTEwgb24gZXJyb3IKKworU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZlciB0byBwb3N0IHNlcnZpY2UgaW5mb3JtYXRpb24gb24gdGhlIHNlcnZlci4KKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6c2F2ZV90TW9kZWwKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBwb3N0IHRNb2RlbCBpbmZvcm1hdGlvbiBvbiBhIFVEREkgc2VydmVyLgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzQ1CisqLworCisvKioKK0BmbiB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWw6OnVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc2F2ZV9VU0NPUkV0TW9kZWwgY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWw6OnVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCAqc29hcCwgdWRkaTJfX3RNb2RlbCAmdE1vZGVsKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSB0TW9kZWwgYSB0TW9kZWwKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc2F2ZV9VU0NPUkV0TW9kZWwgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAordE1vZGVsLgorKi8KKworLyoqCitAZm4gdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsOjp1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAgKnNvYXAsIHN0ZDo6dmVjdG9yPHVkZGkyX190TW9kZWwqPiB0TW9kZWxzKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSB0TW9kZWxzIGNvbGxlY3Rpb24gb2YgdE1vZGVscworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzYXZlX1VTQ09SRXRNb2RlbCBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkCit0TW9kZWxzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX3RNb2RlbERldGFpbCAqdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbykKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcGFyYW1baW5dIGF1dGhJbmZvIGF1dGhvcml6YXRpb24gdG9rZW4gcHJvdmlkZWQgYnkgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX190TW9kZWxEZXRhaWwgb2JqZWN0IG9yIE5VTEwgb24gZXJyb3IKKworU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZlciB0byBwb3N0IHRNb2RlbCBpbmZvcm1hdGlvbiBvbiB0aGUgc2VydmVyLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpzZXRfcHVibGlzaGVyQXNzZXJ0aW9ucworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorQGNsYXNzIHVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucworQGJyaWVmCisKK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIG1vZGlmeSB0aGUgZXhpc3RpbmcgcHVibGlzaGVyIGFzc2VydGlvbnMgZm9yIGFuCitpbmRpdmlkdWFsIHB1Ymxpc2hlci4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzc0NgorKi8KKworLyoqCitAZm4gdWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjp1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjp1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAgKnNvYXAsIHN0ZDo6dmVjdG9yPHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24qPiBwdWJsaXNoZXJBc3NlcnRpb25zKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBwdWJsaXNoZXJBc3NlcnRpb25zIGNvbGxlY3Rpb24gb2YgcHVibGlzaGVyIGFzc2VydGlvbnMKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgY2xhc3MgdXNpbmcgdGhlCitzcGVjaWZpZWQgY29sbGVjdGlvbiBvZiBwdWJsaXNoZXIgYXNzZXJ0aW9ucy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zICp1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKQorQGJyaWVmCitAcGFyYW1baW5dIGVuZHBvaW50IFVSTCBvZiB0aGUgVURESSBzZXJ2ZXIKK0BwYXJhbVtpbl0gYXV0aEluZm8gYXV0aG9yaXphdGlvbiB0b2tlbiBwcm92aWRlZCBieSB0aGUgVURESSBzZXJ2ZXIKK0ByZXR1cm4gQSBwb2ludGVyIHRvIGEgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMgb2JqZWN0IG9yIE5VTEwgb24gZXJyb3IKKworU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZlciB0byBwb3N0IHRNb2RlbCBpbmZvcm1hdGlvbiBvbiB0aGUgc2VydmVyLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwlDb2RlIEV4YW1wbGVzCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCitAcGFnZSBleGFtcGxlMSBDb2RlIEV4YW1wbGUgMTogRmluZGluZyBhIHNlcnZpY2UKKworVGhpcyBleGFtcGxlIHNob3dzIHlvdSBob3cgdG8gZmluZCBXZWIgc2VydmljZXMuIEluIHRoaXMgY2FzZSwgdGhlIGV4YW1wbGUKK2ZpbmRzIFdlYiBzZXJ2aWNlcyB3aXRoIG5hbWVzIHRoYXQgYmVnaW4gd2l0aCB0aGUgd29yZCAibWFnaWMiLgorCitAY29kZQorI2luY2x1ZGUgImlucUguaCIKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreyAKKyAgY2hhciAqc2VhcmNoX3N0cmluZyA9ICJtYWdpYyI7CisKKyAgaWYgKGFyZ2MgPiAxKQorICAgIHNlYXJjaF9zdHJpbmcgPSBhcmd2WzFdOworCisgIC8vIENyZWF0ZSBhIGdTT0FQIGNvbnRleHQKKyAgc3RydWN0IHNvYXAgKnNvYXAgPSBzb2FwX25ldygpOworCisgIC8vIENyZWF0ZSBhbiBvYmplY3QgdG8gZmluZCBhIGJ1c2luZXNzCisgIHVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2UgZnMoc29hcCwgc2VhcmNoX3N0cmluZyk7CisKKyAgLy8gU2VuZCB0aGUgcmVxdWVzdAorICB1ZGRpMl9fc2VydmljZUxpc3QgKnNsID0gZnMuc2VuZCgiaHR0cDovL3VkZGkueG1ldGhvZHMubmV0L2lucXVpcmUiKTsKKworICAvLyBDaGVjayBpZiByZXN1bHQgaXMgT0sKKyAgaWYgKCFzbCkKKyAgICBzb2FwX3ByaW50X2ZhdWx0KHNvYXAsIHN0ZGVycik7CisKKyAgLy8gSWYgT0ssIHJlcG9ydCB0aGUgc2VydmljZSBuYW1lKHMpIGFuZCB1bmlxdWUgaWRlbnRpZmljYXRpb24ga2V5cworICBlbHNlIGlmIChzbC0+c2VydmljZUluZm9zKQorICB7CisgICAgc3RkOjpjb3V0IDw8ICJTZWFyY2ggcmVzdWx0cyBvbiAiIDw8IHNlYXJjaF9zdHJpbmcgPDwgIjoiIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPHVkZGkyX19zZXJ2aWNlSW5mbyo+Ojpjb25zdF9pdGVyYXRvciBzaSA9IHNsLT5zZXJ2aWNlSW5mb3MtPnNlcnZpY2VJbmZvLmJlZ2luKCk7IHNpICE9IHNsLT5zZXJ2aWNlSW5mb3MtPnNlcnZpY2VJbmZvLmVuZCgpOyArK3NpKQorICAgIHsKKyAgICAgIC8vIFJlcG9ydCBzZXJ2aWNlS2V5IGFuZCBidXNpbmVzc0tleQorICAgICAgc3RkOjpjb3V0IDw8ICJzZXJ2aWNlS2V5PSIgPDwgKCpzaSktPnNlcnZpY2VLZXkgPDwgc3RkOjplbmRsIDw8ICJidXNpbmVzc0tleT0iIDw8ICgqc2kpLT5idXNpbmVzc0tleSA8PCBzdGQ6OmVuZGw7CisKKyAgICAgIC8vIFJlcG9ydCBuYW1lcworICAgICAgZm9yIChzdGQ6OnZlY3Rvcjx1ZGRpMl9fbmFtZSo+Ojpjb25zdF9pdGVyYXRvciBuID0gKCpzaSktPm5hbWUuYmVnaW4oKTsgbiAhPSAoKnNpKS0+bmFtZS5lbmQoKTsgKytuKQorICAgICAgICBzdGQ6OmNvdXQgPDwgIm5hbWU9IiA8PCAoKm4pLT5fX2l0ZW0gPDwgc3RkOjplbmRsOworCisgICAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOworICAgIH0KKyAgfQorCisgIC8vIFJlbW92ZSBkZXNlcmlhbGl6ZWQgb2JqZWN0cworICBzb2FwX2Rlc3Ryb3koc29hcCk7CisKKyAgLy8gUmVtb3ZlIHRlbXBvcmFyeSBkYXRhCisgIHNvYXBfZW5kKHNvYXApOworCisgIC8vIERldGFjaCBhbmQgZnJlZSBjb250ZXh0CisgIHNvYXBfZG9uZShzb2FwKTsKKyAgZnJlZShzb2FwKTsKKworICByZXR1cm4gMDsKK30KK0BlbmRjb2RlCisKK1RvIGNvbXBpbGU6CistIHdzZGwyaCAtdHVkZGkyLXR5cGVtYXAuZGF0IGlucXVpcmVfdjIud3NkbAorLSBzb2FwY3BwMiAtSS4uIC1waW5xIGlucXVpcmVfdjIuaAorLSBnKysgLURXSVRIX05PTkFNRVNQQUNFUyAtSS4uIC1vIGV4YW1wbGUxIGV4YW1wbGUxLmNwcCBpbnF1aXJlX3YyLmNwcCBpbnFDLmNwcCBpbnFDbGllbnQuY3BwIC4uL3N0ZHNvYXAyLmNwcAorKi8KKworLyoqCitAcGFnZSBleGFtcGxlMiBDb2RlIEV4YW1wbGUgMjogRmluZGluZyBhIGJ1c2luZXNzCisKK1RoaXMgZXhhbXBsZSBzaG93cyB5b3UgaG93IHRvIGZpbmQgYSBidXNpbmVzcyBmcm9tIGEgVURESSBzZXJ2ZXIuCisKK0Bjb2RlCisjaW5jbHVkZSAiaW5xSC5oIgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7IAorICBjaGFyICpzZWFyY2hfc3RyaW5nID0gInhtZXRob2RzIjsKKworICBpZiAoYXJnYyA+IDEpCisgICAgc2VhcmNoX3N0cmluZyA9IGFyZ3ZbMV07CisKKyAgLy8gQ3JlYXRlIGEgZ1NPQVAgY29udGV4dAorICBzdHJ1Y3Qgc29hcCAqc29hcCA9IHNvYXBfbmV3KCk7CisKKyAgLy8gQ3JlYXRlIGFuIG9iamVjdCB0byBmaW5kIGEgYnVzaW5lc3MKKyAgdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MgZmIoc29hcCwgc2VhcmNoX3N0cmluZyk7CisKKyAgLy8gU2VuZCB0aGUgcmVxdWVzdAorICB1ZGRpMl9fYnVzaW5lc3NMaXN0ICpibCA9IGZiLnNlbmQoImh0dHA6Ly91ZGRpLnhtZXRob2RzLm5ldC9pbnF1aXJlIik7CisKKyAgLy8gQ2hlY2sgaWYgcmVzdWx0IGlzIE9LCisgIGlmICghYmwpCisgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOworCisgIC8vIElmIE9LLCByZXBvcnQgdGhlIGJ1c2luZXNzIG5hbWUocykgYW5kIHVuaXF1ZSBpZGVudGlmaWNhdGlvbiBrZXlzCisgIGVsc2UgaWYgKGJsLT5idXNpbmVzc0luZm9zKQorICB7CisgICAgc3RkOjpjb3V0IDw8ICJTZWFyY2ggcmVzdWx0cyBvbiAiIDw8IHNlYXJjaF9zdHJpbmcgPDwgIjoiIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc0luZm8qPjo6Y29uc3RfaXRlcmF0b3IgYmkgPSBibC0+YnVzaW5lc3NJbmZvcy0+YnVzaW5lc3NJbmZvLmJlZ2luKCk7IGJpICE9IGJsLT5idXNpbmVzc0luZm9zLT5idXNpbmVzc0luZm8uZW5kKCk7ICsrYmkpCisgICAgeworICAgICAgLy8gUmVwb3J0IGJ1c2luZXNzS2V5CisgICAgICBzdGQ6OmNvdXQgPDwgImJ1c2luZXNzS2V5PSIgPDwgKCpiaSktPmJ1c2luZXNzS2V5IDw8IHN0ZDo6ZW5kbDsKKworICAgICAgLy8gUmVwb3J0IG5hbWVzCisgICAgICBmb3IgKHN0ZDo6dmVjdG9yPHVkZGkyX19uYW1lKj46OmNvbnN0X2l0ZXJhdG9yIG4gPSAoKmJpKS0+bmFtZS5iZWdpbigpOyBuICE9ICgqYmkpLT5uYW1lLmVuZCgpOyArK24pCisgICAgICAgIHN0ZDo6Y291dCA8PCAibmFtZT0iIDw8ICgqbiktPl9faXRlbSA8PCBzdGQ6OmVuZGw7CisKKyAgICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CisgICAgfQorICB9CisKKyAgLy8gUmVtb3ZlIGRlc2VyaWFsaXplZCBvYmplY3RzCisgIHNvYXBfZGVzdHJveShzb2FwKTsKKworICAvLyBSZW1vdmUgdGVtcG9yYXJ5IGRhdGEKKyAgc29hcF9lbmQoc29hcCk7CisKKyAgLy8gRGV0YWNoIGFuZCBmcmVlIGNvbnRleHQKKyAgc29hcF9kb25lKHNvYXApOworICBmcmVlKHNvYXApOworCisgIHJldHVybiAwOworfQorQGVuZGNvZGUKKworVG8gY29tcGlsZToKKy0gd3NkbDJoIC10dWRkaTItdHlwZW1hcC5kYXQgaW5xdWlyZV92Mi53c2RsCistIHNvYXBjcHAyIC1JLi4gLXBpbnEgaW5xdWlyZV92Mi5oCistIGcrKyAtRFdJVEhfTk9OQU1FU1BBQ0VTIC1JLi4gLW8gZXhhbXBsZTIgZXhhbXBsZTIuY3BwIGlucXVpcmVfdjIuY3BwIGlucUMuY3BwIGlucUNsaWVudC5jcHAgLi4vc3Rkc29hcDIuY3BwCisqLworLyoqCitAcGFnZSBleGFtcGxlMyBDb2RlIEV4YW1wbGUgMzogUHVibGlzaGluZyBhIFdTREwgYW5kIHNlcnZpY2Ugb24gWE1ldGhvZHMKKworVGhpcyBleGFtcGxlIHNob3dzIHlvdSBob3cgdG8gcHVibGlzaCBhIFdlYiBzZXJ2aWNlLiBJbiB0aGlzIGNhc2UsIHRoZSBleGFtcGxlCit0ZW1wbGF0ZSBjb2RlIG9idGFpbnMgYW4gYXV0aG9yaXphdGlvbiB0b2tlbiwgc2F2ZXMgdGhlIHRNb2RlbCB3aXRoIHRoZSBXU0RMCitVUkwgaW4gdGhlIHNlcnZlciwgYW5kIHNhdmVzIHRoZSBidXNpbmVzcyBzZXJ2aWNlIGluZm9ybWF0aW9uIGluIHRoZSBzZXJ2ZXIuCisKK0Bjb2RlCisjaW5jbHVkZSAicHViSC5oIgorCitjb25zdCBjaGFyICpzZXJ2ZXIgPSAiaHR0cHM6Ly91ZGRpLnhtZXRob2RzLm5ldC9wdWJsaXNoIjsKKworY29uc3QgY2hhciAqdXNlcmlkID0gIi4uLiI7IC8vIHVzZXIgSUQgdG8gYWNjZXNzIFVEREkgc2VydmVyCitjb25zdCBjaGFyICpwYXNzd2QgPSAiLi4uIjsgLy8gcGFzc3dvcmQgdG8gYWNjZXNzIFVEREkgc2VydmVyCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sgCisgIC8vIENyZWF0ZSBhIGdTT0FQIGNvbnRleHQKKyAgc3RydWN0IHNvYXAgKnNvYXAgPSBzb2FwX25ldygpOworCisgIC8vIFNldHVwIFNTTCBjb250ZXh0IChvcHRpb25hbCkgdG8gdmVyaWZ5IHNlcnZlcidzIGNyZWRlbnRpYWxzCisgIGlmIChzb2FwX3NzbF9jbGllbnRfY29udGV4dChzb2FwLCBTT0FQX1NTTF9ERUZBVUxULCBOVUxMLCBOVUxMLCAiY2FjZXJ0cy5wZW0iLCBOVUxMLCBOVUxMKSkKKyAgeyAKKyAgICBzb2FwX3ByaW50X2ZhdWx0KHNvYXAsIHN0ZGVycik7CisgICAgZXhpdCgxKTsKKyAgfQorCisgIC8vIFN0ZXAgMTogR2V0IGFuIGF1dGhvcml6YXRpb24gdG9rZW4gZnJvbSB0aGUgVURESSBzZXJ2ZXIKKyAgdWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW4gZ2V0X2F1dGhUb2tlbihzb2FwLCB1c2VyaWQsIHBhc3N3ZCk7CisgIHVkZGkyX19hdXRoVG9rZW4gKmF1dGhUb2tlbiA9IGdldF9hdXRoVG9rZW4uc2VuZChzZXJ2ZXIpOworCisgIC8vIENoZWNrIGlmIGF1dGhvcml6ZWQKKyAgaWYgKCFhdXRoVG9rZW4pCisgIHsKKyAgICBzb2FwX3ByaW50X2ZhdWx0KHNvYXAsIHN0ZGVycik7CisgICAgZXhpdCgxKTsKKyAgfQorCisgIC8vIEF1dGhvcml6YXRpb24gaW5mbyBwcm92aWRlZCBieSBzZXJ2ZXIgZm9yIHRoaXMgc2Vzc2lvbgorICBjaGFyICphdXRoSW5mbyA9IGF1dGhUb2tlbi0+YXV0aEluZm87CisKKyAgLy8gU3RlcCAyOiBDcmVhdGUgYSB0TW9kZWwgZm9yIHRoZSBXU0RMIHRvIGJlIHB1Ymxpc2hlZAorICB1ZGRpMl9fdE1vZGVsIHRNb2RlbDsKKyAgdE1vZGVsLnNvYXBfZGVmYXVsdChzb2FwKTsKKworICAvLyBDcmVhdGUgdGhlIHRNb2RlbCBhbmQgc2VydmljZSBuYW1lCisgIHRNb2RlbC5uYW1lID0gc29hcF9uZXdfdWRkaTJfX25hbWUoc29hcCwgLTEpOworICB0TW9kZWwubmFtZS0+X19pdGVtID0gIi4uLiI7CisgIHRNb2RlbC5uYW1lLT54bWxfX2xhbmdfID0gImVuIjsKKworICAvLyBDcmVhdGUgWE1ldGhvZHMgZGVzY3JpcHRpb24gZWxlbWVudHMgKHNlZSBodHRwOi8vd3d3LnhtZXRob2RzLm5ldC92ZTIvVURESS5wbykKKyAgdWRkaTJfX2Rlc2NyaXB0aW9uICpkZXNjcmlwdGlvbiA9IHNvYXBfbmV3X3VkZGkyX19kZXNjcmlwdGlvbihzb2FwLCA2KTsKKyAgZGVzY3JpcHRpb25bMF0uX19pdGVtID0gIlNIT1JUIERFU0NSSVBUSU9OOiAuLi4iOworICBkZXNjcmlwdGlvblswXS54bWxfX2xhbmdfID0gImVuIjsKKyAgZGVzY3JpcHRpb25bMV0uX19pdGVtID0gIlNIT1JUIERFU0NSSVBUSU9OOiAuLi4iOworICBkZXNjcmlwdGlvblsxXS54bWxfX2xhbmdfID0gImVuIjsKKyAgZGVzY3JpcHRpb25bMl0uX19pdGVtID0gIlVTQUdFIE5PVEVTOiAuLi4iOworICBkZXNjcmlwdGlvblsyXS54bWxfX2xhbmdfID0gImVuIjsKKyAgZGVzY3JpcHRpb25bM10uX19pdGVtID0gIkhPTUVQQUdFIFVSTDogLi4uIjsKKyAgZGVzY3JpcHRpb25bM10ueG1sX19sYW5nXyA9ICJlbiI7CisgIGRlc2NyaXB0aW9uWzRdLl9faXRlbSA9ICJDT05UQUNUIEVNQUlMOiAuLi4iOworICBkZXNjcmlwdGlvbls0XS54bWxfX2xhbmdfID0gImVuIjsKKyAgZGVzY3JpcHRpb25bNV0uX19pdGVtID0gIklNUExFTUVOVEFUSU9OOiAuLi4iOworICBkZXNjcmlwdGlvbls1XS54bWxfX2xhbmdfID0gImVuIjsKKworICAvLyBBZGQgdGhlIGZvdXIgZGVzY3JpcHRpb24gZWxlbWVudHMgdG8gdGhlIHRNb2RlbAorICB0TW9kZWwuZGVzY3JpcHRpb24ucHVzaF9iYWNrKGRlc2NyaXB0aW9uICsgMCk7CisgIHRNb2RlbC5kZXNjcmlwdGlvbi5wdXNoX2JhY2soZGVzY3JpcHRpb24gKyAxKTsKKyAgdE1vZGVsLmRlc2NyaXB0aW9uLnB1c2hfYmFjayhkZXNjcmlwdGlvbiArIDIpOworICB0TW9kZWwuZGVzY3JpcHRpb24ucHVzaF9iYWNrKGRlc2NyaXB0aW9uICsgNCk7CisKKyAgLy8gQWRkIGFuIG92ZXJ2aWV3RG9jIGVsZW1lbnQgd2l0aCBkZXNjcmlwdGlvbiBhbmQgb3ZlcnZpZXdVUkwKKyAgdE1vZGVsLm92ZXJ2aWV3RG9jID0gc29hcF9uZXdfdWRkaTJfX292ZXJ2aWV3RG9jKHNvYXAsIC0xKTsKKyAgdE1vZGVsLm92ZXJ2aWV3RG9jLT5zb2FwX2RlZmF1bHQoc29hcCk7CisgIHRNb2RlbC5vdmVydmlld0RvYy0+ZGVzY3JpcHRpb24ucHVzaF9iYWNrKHNvYXBfbmV3X3VkZGkyX19kZXNjcmlwdGlvbihzb2FwLCAtMSkpOworICB0TW9kZWwub3ZlcnZpZXdEb2MtPmRlc2NyaXB0aW9uWzBdLT5fX2l0ZW0gPSAiV1NETCBzb3VyY2UgZG9jdW1lbnQiOworICB0TW9kZWwub3ZlcnZpZXdEb2MtPmRlc2NyaXB0aW9uWzBdLT54bWxfX2xhbmdfID0gImVuIjsKKyAgdE1vZGVsLm92ZXJ2aWV3RG9jLT5vdmVydmlld1VSTCA9ICJodHRwOi8vLi4uL215LndzZGwjYmluZGluZ05hbWUiOworCisgIC8vIE9taXQgaWRlbnRpZmllciBiYWcKKyAgdE1vZGVsLmlkZW50aWZpZXJCYWcgPSBOVUxMOworCisgIC8vIEFkZCBhIGNhdGVnb3J5IHdpdGggYSBXU0RMLXNwZWNpZmljIGtleWVkUmVmZXJlbmNlCisgIHRNb2RlbC5jYXRlZ29yeUJhZyA9IHNvYXBfbmV3X3VkZGkyX19jYXRlZ29yeUJhZyhzb2FwLCAtMSk7CisgIHRNb2RlbC5jYXRlZ29yeUJhZy0+c29hcF9kZWZhdWx0KHNvYXApOworICB0TW9kZWwuY2F0ZWdvcnlCYWctPmtleWVkUmVmZXJlbmNlLnB1c2hfYmFjayhzb2FwX25ld191ZGRpMl9fa2V5ZWRSZWZlcmVuY2Uoc29hcCwgLTEpKTsKKyAgdE1vZGVsLmNhdGVnb3J5QmFnLT5rZXllZFJlZmVyZW5jZVswXS0+dE1vZGVsS2V5ID0gIi4uLiI7CisgIHRNb2RlbC5jYXRlZ29yeUJhZy0+a2V5ZWRSZWZlcmVuY2VbMF0tPmtleU5hbWUgPSAidWRkaS1vcmc6dHlwZXMiOworICB0TW9kZWwuY2F0ZWdvcnlCYWctPmtleWVkUmVmZXJlbmNlWzBdLT5rZXlWYWx1ZSA9ICJ3c2RsU3BlYyI7CisKKyAgdE1vZGVsLmF1dGhvcml6ZWROYW1lID0gIi4uLiI7CisgIHRNb2RlbC5vcGVyYXRvcl8gPSAiLi4uIjsKKyAgdE1vZGVsLnRNb2RlbEtleSA9ICIuLi4iOworCisgIC8vIFNhdmUgdGhlIHRNb2RlbAorICB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwgc2F2ZV90TW9kZWwoc29hcCwgdE1vZGVsKTsKKyAgdWRkaTJfX3RNb2RlbERldGFpbCAqdE1vZGVsRGV0YWlsID0gc2F2ZV90TW9kZWwuc2VuZChzZXJ2ZXIsIGF1dGhJbmZvKTsKKworICAvLyBTdGVwIDM6IENyZWF0ZSBhIG5ldyBzZXJ2aWNlIHRvIGJlIHB1Ymxpc2hlZAorICB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlIHNlcnZpY2U7CisgIHNlcnZpY2Uuc29hcF9kZWZhdWx0KHNvYXApOworCisgIC8vIFNlcnZpY2UgbmFtZSBpcyB0aGUgdE1vZGVsIG5hbWUgKFhNZXRob2RzKQorICBzZXJ2aWNlLm5hbWUucHVzaF9iYWNrKHRNb2RlbC5uYW1lKTsKKworICAvLyBBZGQgdHdvIGRlc2NyaXB0aW9uIGVsZW1lbnRzIHRvIHRoZSBzZXJ2aWNlCisgIHNlcnZpY2UuZGVzY3JpcHRpb24ucHVzaF9iYWNrKGRlc2NyaXB0aW9uICsgNCk7CisgIHNlcnZpY2UuZGVzY3JpcHRpb24ucHVzaF9iYWNrKGRlc2NyaXB0aW9uICsgNSk7CisKKyAgLy8gQ3JlYXRlIGJpbmRpbmcgdGVtcGxhdGUKKyAgdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZSBiaW5kaW5nVGVtcGxhdGU7CisgIGJpbmRpbmdUZW1wbGF0ZS5zb2FwX2RlZmF1bHQoc29hcCk7CisgIGJpbmRpbmdUZW1wbGF0ZS50TW9kZWxJbnN0YW5jZURldGFpbHMgPSBzb2FwX25ld191ZGRpMl9fdE1vZGVsSW5zdGFuY2VEZXRhaWxzKHNvYXAsIC0xKTsKKyAgYmluZGluZ1RlbXBsYXRlLnRNb2RlbEluc3RhbmNlRGV0YWlscy0+dE1vZGVsSW5zdGFuY2VJbmZvLnB1c2hfYmFjayhzb2FwX25ld191ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvKHNvYXAsIC0xKSk7CisgIGJpbmRpbmdUZW1wbGF0ZS50TW9kZWxJbnN0YW5jZURldGFpbHMtPnRNb2RlbEluc3RhbmNlSW5mb1swXS0+aW5zdGFuY2VEZXRhaWxzID0gTlVMTDsKKyAgYmluZGluZ1RlbXBsYXRlLnRNb2RlbEluc3RhbmNlRGV0YWlscy0+dE1vZGVsSW5zdGFuY2VJbmZvWzBdLT50TW9kZWxLZXkgPSB0TW9kZWwudE1vZGVsS2V5OworICBiaW5kaW5nVGVtcGxhdGUuYWNjZXNzUG9pbnQgPSBzb2FwX25ld191ZGRpMl9fYWNjZXNzUG9pbnQoc29hcCwgLTEpOworICBiaW5kaW5nVGVtcGxhdGUuYWNjZXNzUG9pbnQtPl9faXRlbSA9ICIuLi4iOworICBiaW5kaW5nVGVtcGxhdGUuYWNjZXNzUG9pbnQtPlVSTFR5cGUgPSB1ZGRpMl9fVVJMVHlwZV9faHR0cDsKKyAgYmluZGluZ1RlbXBsYXRlLmhvc3RpbmdSZWRpcmVjdG9yID0gTlVMTDsKKyAgYmluZGluZ1RlbXBsYXRlLnNlcnZpY2VLZXkgPSAiLi4uIjsKKyAgYmluZGluZ1RlbXBsYXRlLmJpbmRpbmdLZXkgPSAiLi4uIjsKKworICAvLyBBZGQgYmluZGluZyBUZW1wbGF0ZSB0byBzZXJ2aWNlCisgIHNlcnZpY2UuYmluZGluZ1RlbXBsYXRlcyA9IHNvYXBfbmV3X3VkZGkyX19iaW5kaW5nVGVtcGxhdGVzKHNvYXAsIC0xKTsKKyAgc2VydmljZS5iaW5kaW5nVGVtcGxhdGVzLT5zb2FwX2RlZmF1bHQoc29hcCk7CisgIHNlcnZpY2UuYmluZGluZ1RlbXBsYXRlcy0+YmluZGluZ1RlbXBsYXRlLnB1c2hfYmFjaygmYmluZGluZ1RlbXBsYXRlKTsKKworICBzZXJ2aWNlLmNhdGVnb3J5QmFnID0gTlVMTDsKKyAgc2VydmljZS5zZXJ2aWNlS2V5ID0gIi4uLiI7CisgIHNlcnZpY2UuYnVzaW5lc3NLZXkgPSAiLi4uIjsKKworICAvLyBTYXZlIHRoZSBzZXJ2aWNlCisgIHVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2Ugc2F2ZV9zZXJ2aWNlKHNvYXAsIHNlcnZpY2UpOworICB1ZGRpMl9fc2VydmljZURldGFpbCAqc2VydmljZURldGFpbCA9IHNhdmVfc2VydmljZS5zZW5kKHNlcnZlciwgYXV0aEluZm8pOworCisgIC8vIFN0ZXAgNDogRGlzY2FyZCBhdXRob3JpemF0aW9uIHRva2VuCisgIHVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbiBkaXNjYXJkX2F1dGhUb2tlbihzb2FwLCBhdXRoSW5mbyk7CisgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCAqZGlzcG9zaXRpb25SZXBvcnQgPSBkaXNjYXJkX2F1dGhUb2tlbi5zZW5kKHNlcnZlcik7CisKKyAgLy8gUmVtb3ZlIGRlc2VyaWFsaXplZCBvYmplY3RzCisgIHNvYXBfZGVzdHJveShzb2FwKTsKKworICAvLyBSZW1vdmUgdGVtcG9yYXJ5IGRhdGEKKyAgc29hcF9lbmQoc29hcCk7CisKKyAgLy8gRGV0YWNoIGFuZCBmcmVlIGNvbnRleHQKKyAgc29hcF9kb25lKHNvYXApOworICBmcmVlKHNvYXApOworCisgIHJldHVybiAwOworfQorQGVuZGNvZGUKK1RvIGNvbXBpbGU6CistIHdzZGwyaCAtdHVkZGkyLXR5cGVtYXAuZGF0IHB1Ymxpc2hfdjIud3NkbAorLSBzb2FwY3BwMiAtSS4uIC1wcHViIHB1Ymxpc2hfdjIuaAorLSBnKysgLURXSVRIX09QRU5TU0wgLURXSVRIX05PTkFNRVNQQUNFUyAtSS4uIC1vIGV4YW1wbGUzIGV4YW1wbGUzLmNwcCBwdWJsaXNoX3YyLmNwcCBwdWJDLmNwcCBwdWJDbGllbnQuY3BwIC4uL3N0ZHNvYXAyLmNwcAorKi8KKy8qIGlucXVpcmVfdjIuaAorICAgR2VuZXJhdGVkIGJ5IHdzZGwyaCAxLjIuMCBmcm9tIGlucXVpcmVfdjIud3NkbCBhbmQgdWRkaTItdHlwZW1hcC5kYXQKKyAgIDIwMDUtMDQtMjQgMDA6Mjk6NDEgR01UCisgICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgVGhpcyBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlczoKKyAgIEdQTCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCisqLworCisvKiBOT1RFOgorCisgLSBDb21waWxlIHRoaXMgZmlsZSB3aXRoIHNvYXBjcHAyIHRvIGNvbXBsZXRlIHRoZSBjb2RlIGdlbmVyYXRpb24gcHJvY2Vzcy4KKyAtIFVzZSB3c2RsMmggb3B0aW9uIC1sIHRvIHZpZXcgdGhlIHNvZnR3YXJlIGxpY2Vuc2UgdGVybXMuCisgLSBVc2Ugd3NkbDJoIG9wdGlvbnMgLWMgYW5kIC1zIHRvIGdlbmVyYXRlIHB1cmUgQyBjb2RlIG9yIEMrKyBjb2RlIHdpdGhvdXQgU1RMLgorIC0gVG8gYnVpbGQgd2l0aCBTVEwsIHN0bHZlY3Rvci5oIGZyb20gdGhlIGdTT0FQIGRpc3RyaWJ1dGlvbiBtdXN0IGJlIGluIHRoZQorICAgY3VycmVudCBkaXJlY3RvcnkuIE9yIHVzZSBzb2FwY3BwMiBvcHRpb24gLUk8cGF0aD4gd2l0aCBwYXRoIHRvIHN0bHZlY3Rvci5oLgorIC0gVXNlIHR5cGVtYXAuZGF0IHRvIGNvbnRyb2wgc2NoZW1hIG5hbWVzcGFjZSBiaW5kaW5ncyBhbmQgdHlwZSBtYXBwaW5ncy4KKyAgIEl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGN1c3RvbWl6ZSB0aGUgbmFtZXMgb2YgdGhlIG5hbWVzcGFjZSBwcmVmaXhlcworICAgZ2VuZXJhdGVkIGJ5IHdzZGwyaC4gVG8gZG8gc28sIG1vZGlmeSB0aGUgcHJlZml4IGJpbmRpbmdzIGluIHRoZSBOYW1lc3BhY2VzCisgICBzZWN0aW9uIGJlbG93IGFuZCBhZGQgdGhlIG1vZGlmaWVkIGxpbmVzIHRvIHR5cGVtYXAuZGF0IHRvIHJlcnVuIHdzZGwyaC4KKyAtIFVzZSBEb3h5Z2VuICh3d3cuZG94eWdlbi5vcmcpIHRvIGJyb3dzZSB0aGlzIGZpbGUuCisKKyovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiB1cm46dWRkaS1vcmc6aW5xdWlyeV92MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBXU0RMIERvY3VtZW50YXRpb246CisKKworCQlDb3B5cmlnaHQgKGMpIDIwMDAgLSAyMDAyIGJ5IEFjY2VudHVyZSwgQXJpYmEsIEluYy4sIENvbW1lcmNlIE9uZSwgSW5jLiAKKwkJRnVqaXRzdSBMaW1pdGVkLCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSwgaTIgVGVjaG5vbG9naWVzLCBJbmMuLCAKKwkJSW50ZWwgQ29ycG9yYXRpb24sIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24sICAKKwkJTWljcm9zb2Z0IENvcnBvcmF0aW9uLCBPcmFjbGUgQ29ycG9yYXRpb24sIFNBUCBBRywgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgCisJCWFuZCBWZXJpU2lnbiwgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKwkJCisJCVdTREwgU2VydmljZSBJbnRlcmZhY2UgZm9yIFVEREkgSW5xdWlyeSBBUEkgVjIuMCAgICAKKwkJCisJCVRoaXMgV1NETCBkb2N1bWVudCBkZWZpbmVzIHRoZSBpbnF1aXJ5IEFQSSBjYWxscyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCAKKwkJdGhlIFVEREkgcmVnaXN0cnkuICBUaGUgY29tcGxldGUgVURESSBBUEkgc3BlY2lmaWNhdGlvbiBpcyBhdmFpbGFibGUKKwkJYXQgaHR0cDovL3d3dy51ZGRpLm9yZy9zcGVjaWZpY2F0aW9uLmh0bWwuCisJCisqLworCisvL2dzb2Fwb3B0IHcKKworI2ltcG9ydCAic3RsdmVjdG9yLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBTY2hlbWEgTmFtZXNwYWNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qIE5PVEU6CisKK0l0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGN1c3RvbWl6ZSB0aGUgbmFtZXMgb2YgdGhlIG5hbWVzcGFjZSBwcmVmaXhlcworZ2VuZXJhdGVkIGJ5IHdzZGwyaC4gVG8gZG8gc28sIG1vZGlmeSB0aGUgcHJlZml4IGJpbmRpbmdzIGJlbG93IGFuZCBhZGQgdGhlCittb2RpZmllZCBsaW5lcyB0byB0eXBlbWFwLmRhdCB0byByZXJ1biB3c2RsMmg6CisKK2lucTIgPSAidXJuOnVkZGktb3JnOmlucXVpcnlfdjIiCit1ZGRpMiA9IHVybjp1ZGRpLW9yZzphcGlfdjIKKworKi8KKworLy9nc29hcCBpbnEyICBzY2hlbWEgbmFtZXNwYWNlOgl1cm46dWRkaS1vcmc6aW5xdWlyeV92MgorLy9nc29hcCB1ZGRpMiBzY2hlbWEgbmFtZXNwYWNlOgl1cm46dWRkaS1vcmc6YXBpX3YyCisvL2dzb2FwIGlucTIgIHNjaGVtYSBmb3JtOgl1bnF1YWxpZmllZAorLy9nc29hcCB1ZGRpMiBzY2hlbWEgZWxlbWVudEZvcm06CXF1YWxpZmllZAorLy9nc29hcCB1ZGRpMiBzY2hlbWEgYXR0cmlidXRlRm9ybToJdW5xdWFsaWZpZWQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFNjaGVtYSBUeXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLy8vIFByaW1pdGl2ZSBidWlsdC1pbiB0eXBlICJ4czpOTVRPS0VOIgordHlwZWRlZiBjaGFyKiB4c2RfX05NVE9LRU47CisKKy8vLyBCdWlsdC1pbiBhdHRyaWJ1dGUgInhtbDpsYW5nIgordHlwZWRlZiBjaGFyKiB4bWxfX2xhbmc7CisKK2NsYXNzIHVkZGkyX19hY2Nlc3NQb2ludDsKK2NsYXNzIHVkZGkyX19hZGRyZXNzOworY2xhc3MgdWRkaTJfX2FkZHJlc3NMaW5lOworY2xhc3MgdWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW07CitjbGFzcyB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlOworY2xhc3MgdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZXM7CitjbGFzcyB1ZGRpMl9fYnVzaW5lc3NFbnRpdHk7CitjbGFzcyB1ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQ7CitjbGFzcyB1ZGRpMl9fYnVzaW5lc3NJbmZvOworY2xhc3MgdWRkaTJfX2J1c2luZXNzSW5mb3M7CitjbGFzcyB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlOworY2xhc3MgdWRkaTJfX2J1c2luZXNzU2VydmljZXM7CitjbGFzcyB1ZGRpMl9fY2F0ZWdvcnlCYWc7CitjbGFzcyB1ZGRpMl9fY29udGFjdDsKK2NsYXNzIHVkZGkyX19jb250YWN0czsKK2NsYXNzIHVkZGkyX19kZXNjcmlwdGlvbjsKK2NsYXNzIHVkZGkyX19kaXNjb3ZlcnlVUkw7CitjbGFzcyB1ZGRpMl9fZGlzY292ZXJ5VVJMczsKK2NsYXNzIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydDsKK2NsYXNzIHVkZGkyX19lbWFpbDsKK2NsYXNzIHVkZGkyX19lcnJJbmZvOworY2xhc3MgdWRkaTJfX2ZpbmRRdWFsaWZpZXJzOworY2xhc3MgdWRkaTJfX2hvc3RpbmdSZWRpcmVjdG9yOworY2xhc3MgdWRkaTJfX2lkZW50aWZpZXJCYWc7CitjbGFzcyB1ZGRpMl9faW5zdGFuY2VEZXRhaWxzOworY2xhc3MgdWRkaTJfX2tleWVkUmVmZXJlbmNlOworY2xhc3MgdWRkaTJfX2tleXNPd25lZDsKK2NsYXNzIHVkZGkyX19uYW1lOworY2xhc3MgdWRkaTJfX292ZXJ2aWV3RG9jOworY2xhc3MgdWRkaTJfX3Bob25lOworY2xhc3MgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbjsKK2NsYXNzIHVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvOworY2xhc3MgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zOworY2xhc3MgdWRkaTJfX3Jlc3VsdDsKK2NsYXNzIHVkZGkyX19zZXJ2aWNlSW5mbzsKK2NsYXNzIHVkZGkyX19zZXJ2aWNlSW5mb3M7CitjbGFzcyB1ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwczsKK2NsYXNzIHVkZGkyX190TW9kZWw7CitjbGFzcyB1ZGRpMl9fdE1vZGVsQmFnOworY2xhc3MgdWRkaTJfX3RNb2RlbEluZm87CitjbGFzcyB1ZGRpMl9fdE1vZGVsSW5mb3M7CitjbGFzcyB1ZGRpMl9fdE1vZGVsSW5zdGFuY2VEZXRhaWxzOworY2xhc3MgdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbzsKK2NsYXNzIHVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczsKK2NsYXNzIHVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZzsKK2NsYXNzIHVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3M7CitjbGFzcyB1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM7CitjbGFzcyB1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2U7CitjbGFzcyB1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbDsKK2NsYXNzIHVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbjsKK2NsYXNzIHVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmc7CitjbGFzcyB1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzczsKK2NsYXNzIHVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzOworY2xhc3MgdWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZTsKK2NsYXNzIHVkZGkyX19maW5kX1VTQ09SRXRNb2RlbDsKK2NsYXNzIHVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0OworY2xhc3MgdWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW47CitjbGFzcyB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWw7CitjbGFzcyB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsOworY2xhc3MgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dDsKK2NsYXNzIHVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczsKK2NsYXNzIHVkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm87CitjbGFzcyB1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWw7CitjbGFzcyB1ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbDsKK2NsYXNzIHVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmc7CitjbGFzcyB1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzczsKK2NsYXNzIHVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2U7CitjbGFzcyB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWw7CitjbGFzcyB1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM7CitjbGFzcyB1ZGRpMl9fdmFsaWRhdGVfVVNDT1JFdmFsdWVzOworY2xhc3MgdWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydDsKK2NsYXNzIHVkZGkyX19hdXRoVG9rZW47CitjbGFzcyB1ZGRpMl9fYmluZGluZ0RldGFpbDsKK2NsYXNzIHVkZGkyX19idXNpbmVzc0RldGFpbDsKK2NsYXNzIHVkZGkyX19idXNpbmVzc0RldGFpbEV4dDsKK2NsYXNzIHVkZGkyX19idXNpbmVzc0xpc3Q7CitjbGFzcyB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uczsKK2NsYXNzIHVkZGkyX19yZWdpc3RlcmVkSW5mbzsKK2NsYXNzIHVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3Q7CitjbGFzcyB1ZGRpMl9fc2VydmljZURldGFpbDsKK2NsYXNzIHVkZGkyX19zZXJ2aWNlTGlzdDsKK2NsYXNzIHVkZGkyX190TW9kZWxEZXRhaWw7CitjbGFzcyB1ZGRpMl9fdE1vZGVsTGlzdDsKKworLy8vIFNjaGVtYSAidXJuOnVkZGktb3JnOmFwaV92MiI6YmluZGluZ0tleSBzaW1wbGVUeXBlIHJlc3RyaWN0aW9uIG9mIHhzOnN0cmluZworCit0eXBlZGVmIGNoYXIqIHVkZGkyX19iaW5kaW5nS2V5OworCisvLy8gU2NoZW1hICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpidXNpbmVzc0tleSBzaW1wbGVUeXBlIHJlc3RyaWN0aW9uIG9mIHhzOnN0cmluZworCit0eXBlZGVmIGNoYXIqIHVkZGkyX19idXNpbmVzc0tleTsKKworLy8vIFNjaGVtYSAidXJuOnVkZGktb3JnOmFwaV92MiI6c2VydmljZUtleSBzaW1wbGVUeXBlIHJlc3RyaWN0aW9uIG9mIHhzOnN0cmluZworCit0eXBlZGVmIGNoYXIqIHVkZGkyX19zZXJ2aWNlS2V5OworCisvLy8gU2NoZW1hICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0TW9kZWxLZXkgc2ltcGxlVHlwZSByZXN0cmljdGlvbiBvZiB4czpzdHJpbmcKKwordHlwZWRlZiBjaGFyKiB1ZGRpMl9fdE1vZGVsS2V5OworCisvLy8gU2NoZW1hICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpkaXJlY3Rpb24gc2ltcGxlVHlwZSByZXN0cmljdGlvbiBvZiB4czpOTVRPS0VOCisKKy8vLyBOb3RlOiBlbnVtIHZhbHVlcyBhcmUgcHJlZml4ZWQgd2l0aCAndWRkaTJfX2RpcmVjdGlvbicgdG8gYXZvaWQgbmFtZSBjbGFzaGVzLCBwbGVhc2UgdXNlIHdzZGwyaCBvcHRpb24gLWUgdG8gb21pdCB0aGlzIHByZWZpeAorZW51bSB1ZGRpMl9fZGlyZWN0aW9uCit7CXVkZGkyX19kaXJlY3Rpb25fX2Zyb21LZXksCS8vLzwgeHM6Tk1UT0tFTiB2YWx1ZT0iZnJvbUtleSIKKwl1ZGRpMl9fZGlyZWN0aW9uX190b0tleSwJLy8vPCB4czpOTVRPS0VOIHZhbHVlPSJ0b0tleSIKK307CisKKy8vLyBTY2hlbWEgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRydW5jYXRlZCBzaW1wbGVUeXBlIHJlc3RyaWN0aW9uIG9mIHhzOk5NVE9LRU4KKworLy8vIE5vdGU6IGVudW0gdmFsdWVzIGFyZSBwcmVmaXhlZCB3aXRoICd1ZGRpMl9fdHJ1bmNhdGVkJyB0byBhdm9pZCBuYW1lIGNsYXNoZXMsIHBsZWFzZSB1c2Ugd3NkbDJoIG9wdGlvbiAtZSB0byBvbWl0IHRoaXMgcHJlZml4CitlbnVtIHVkZGkyX190cnVuY2F0ZWQKK3sJdWRkaTJfX3RydW5jYXRlZF9fdHJ1ZV8sCS8vLzwgeHM6Tk1UT0tFTiB2YWx1ZT0idHJ1ZSIKKwl1ZGRpMl9fdHJ1bmNhdGVkX19mYWxzZV8sCS8vLzwgeHM6Tk1UT0tFTiB2YWx1ZT0iZmFsc2UiCit9OworCisvLy8gU2NoZW1hICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpVUkxUeXBlIHNpbXBsZVR5cGUgcmVzdHJpY3Rpb24gb2YgeHM6Tk1UT0tFTgorCisvLy8gTm90ZTogZW51bSB2YWx1ZXMgYXJlIHByZWZpeGVkIHdpdGggJ3VkZGkyX19VUkxUeXBlJyB0byBhdm9pZCBuYW1lIGNsYXNoZXMsIHBsZWFzZSB1c2Ugd3NkbDJoIG9wdGlvbiAtZSB0byBvbWl0IHRoaXMgcHJlZml4CitlbnVtIHVkZGkyX19VUkxUeXBlCit7CXVkZGkyX19VUkxUeXBlX19tYWlsdG8sCS8vLzwgeHM6Tk1UT0tFTiB2YWx1ZT0ibWFpbHRvIgorCXVkZGkyX19VUkxUeXBlX19odHRwLAkvLy88IHhzOk5NVE9LRU4gdmFsdWU9Imh0dHAiCisJdWRkaTJfX1VSTFR5cGVfX2h0dHBzLAkvLy88IHhzOk5NVE9LRU4gdmFsdWU9Imh0dHBzIgorCXVkZGkyX19VUkxUeXBlX19mdHAsCS8vLzwgeHM6Tk1UT0tFTiB2YWx1ZT0iZnRwIgorCXVkZGkyX19VUkxUeXBlX19mYXgsCS8vLzwgeHM6Tk1UT0tFTiB2YWx1ZT0iZmF4IgorCXVkZGkyX19VUkxUeXBlX19waG9uZSwJLy8vPCB4czpOTVRPS0VOIHZhbHVlPSJwaG9uZSIKKwl1ZGRpMl9fVVJMVHlwZV9fb3RoZXIsCS8vLzwgeHM6Tk1UT0tFTiB2YWx1ZT0ib3RoZXIiCit9OworCisvLy8gU2NoZW1hICJ1cm46dWRkaS1vcmc6YXBpX3YyIjprZXlUeXBlIHNpbXBsZVR5cGUgcmVzdHJpY3Rpb24gb2YgeHM6Tk1UT0tFTgorCisvLy8gTm90ZTogZW51bSB2YWx1ZXMgYXJlIHByZWZpeGVkIHdpdGggJ3VkZGkyX19rZXlUeXBlJyB0byBhdm9pZCBuYW1lIGNsYXNoZXMsIHBsZWFzZSB1c2Ugd3NkbDJoIG9wdGlvbiAtZSB0byBvbWl0IHRoaXMgcHJlZml4CitlbnVtIHVkZGkyX19rZXlUeXBlCit7CXVkZGkyX19rZXlUeXBlX19idXNpbmVzc0tleSwJLy8vPCB4czpOTVRPS0VOIHZhbHVlPSJidXNpbmVzc0tleSIKKwl1ZGRpMl9fa2V5VHlwZV9fdE1vZGVsS2V5LAkvLy88IHhzOk5NVE9LRU4gdmFsdWU9InRNb2RlbEtleSIKKwl1ZGRpMl9fa2V5VHlwZV9fc2VydmljZUtleSwJLy8vPCB4czpOTVRPS0VOIHZhbHVlPSJzZXJ2aWNlS2V5IgorCXVkZGkyX19rZXlUeXBlX19iaW5kaW5nS2V5LAkvLy88IHhzOk5NVE9LRU4gdmFsdWU9ImJpbmRpbmdLZXkiCit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImFkZHJlc3MiCisKK2NsYXNzIHVkZGkyX19hZGRyZXNzCit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2FkZHJlc3NMaW5lKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYWRkcmVzc0xpbmUqICAgID4gYWRkcmVzc0xpbmUgICAgICAgICAgICAgICAgICAgIDA7CisvLy8gQXR0cmlidXRlIHVzZVR5cGUgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIHNvcnRDb2RlIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRDb2RlICAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSB0TW9kZWxLZXkgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dE1vZGVsS2V5CisgICBAdWRkaTJfX3RNb2RlbEtleSAgICAgICAgICAgICAgICAgICAgIHRNb2RlbEtleSAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYXNzZXJ0aW9uU3RhdHVzSXRlbSIKKworY2xhc3MgdWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW0KK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpmcm9tS2V5CisgICAgdWRkaTJfX2J1c2luZXNzS2V5ICAgICAgICAgICAgICAgICAgIGZyb21LZXkgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dG9LZXkKKyAgICB1ZGRpMl9fYnVzaW5lc3NLZXkgICAgICAgICAgICAgICAgICAgdG9LZXkgICAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjprZXllZFJlZmVyZW5jZQorICAgIHVkZGkyX19rZXllZFJlZmVyZW5jZSogICAgICAgICAgICAgICBrZXllZFJlZmVyZW5jZSAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmtleXNPd25lZAorICAgIHVkZGkyX19rZXlzT3duZWQqICAgICAgICAgICAgICAgICAgICBrZXlzT3duZWQgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gQXR0cmlidXRlIGNvbXBsZXRpb25TdGF0dXMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvblN0YXR1cyAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJiaW5kaW5nVGVtcGxhdGUiCisKK2NsYXNzIHVkZGkyX19iaW5kaW5nVGVtcGxhdGUKK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fZGVzY3JpcHRpb24qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19kZXNjcmlwdGlvbiogICAgPiBkZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgMDsKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dE1vZGVsSW5zdGFuY2VEZXRhaWxzCisgICAgdWRkaTJfX3RNb2RlbEluc3RhbmNlRGV0YWlscyogICAgICAgIHRNb2RlbEluc3RhbmNlRGV0YWlscyAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vIENIT0lDRSBPRiBFTEVNRU5UUzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YWNjZXNzUG9pbnQKKyAgICB1ZGRpMl9fYWNjZXNzUG9pbnQqICAgICAgICAgICAgICAgICAgYWNjZXNzUG9pbnQgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpob3N0aW5nUmVkaXJlY3RvcgorICAgIHVkZGkyX19ob3N0aW5nUmVkaXJlY3RvciogICAgICAgICAgICBob3N0aW5nUmVkaXJlY3RvciAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLyBFTkQgQ0hPSUNFCisvLy8gQXR0cmlidXRlIHNlcnZpY2VLZXkgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6c2VydmljZUtleQorICAgQHVkZGkyX19zZXJ2aWNlS2V5ICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlS2V5ICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgYmluZGluZ0tleSBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpiaW5kaW5nS2V5CisgICBAdWRkaTJfX2JpbmRpbmdLZXkgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdLZXkgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYmluZGluZ1RlbXBsYXRlcyIKKworY2xhc3MgdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZXMKK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYmluZGluZ1RlbXBsYXRlKj4gYmluZGluZ1RlbXBsYXRlICAgICAgICAgICAgICAgIDA7CisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJidXNpbmVzc0VudGl0eSIKKworY2xhc3MgdWRkaTJfX2J1c2luZXNzRW50aXR5Cit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6ZGlzY292ZXJ5VVJMcworICAgIHVkZGkyX19kaXNjb3ZlcnlVUkxzKiAgICAgICAgICAgICAgICBkaXNjb3ZlcnlVUkxzICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50CisvLy8gVmVjdG9yIG9mIHVkZGkyX19uYW1lKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fbmFtZSogICAgICAgICAgID4gbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDE7CisvLy8gVmVjdG9yIG9mIHVkZGkyX19kZXNjcmlwdGlvbiogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2Rlc2NyaXB0aW9uKiAgICA+IGRlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAwOworLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpjb250YWN0cworICAgIHVkZGkyX19jb250YWN0cyogICAgICAgICAgICAgICAgICAgICBjb250YWN0cyAgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmJ1c2luZXNzU2VydmljZXMKKyAgICB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlcyogICAgICAgICAgICAgYnVzaW5lc3NTZXJ2aWNlcyAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudAorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjppZGVudGlmaWVyQmFnCisgICAgdWRkaTJfX2lkZW50aWZpZXJCYWcqICAgICAgICAgICAgICAgIGlkZW50aWZpZXJCYWcgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6Y2F0ZWdvcnlCYWcKKyAgICB1ZGRpMl9fY2F0ZWdvcnlCYWcqICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlCYWcgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudAorLy8vIEF0dHJpYnV0ZSBidXNpbmVzc0tleSBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpidXNpbmVzc0tleQorICAgQHVkZGkyX19idXNpbmVzc0tleSAgICAgICAgICAgICAgICAgICBidXNpbmVzc0tleSAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgb3BlcmF0b3Igb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3JfICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIGF1dGhvcml6ZWROYW1lIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcml6ZWROYW1lICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYnVzaW5lc3NFbnRpdHlFeHQiCisKK2NsYXNzIHVkZGkyX19idXNpbmVzc0VudGl0eUV4dAoreyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmJ1c2luZXNzRW50aXR5CisgICAgdWRkaTJfX2J1c2luZXNzRW50aXR5KiAgICAgICAgICAgICAgIGJ1c2luZXNzRW50aXR5ICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vIFRPRE86IDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKy8vICAgICAgIFNjaGVtYSBleHRlbnNpYmlsaXR5IGlzIHVzZXItZGVmaW5hYmxlCisvLyAgICAgICBDb25zdWx0IHRoZSBwcm90b2NvbCBkb2N1bWVudGF0aW9uIHRvIGluc2VydCBkZWNsYXJhdGlvbnMgaGVyZToKKyAgICBfWE1MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19hbnkgICAgICAgICAgICAgICAgICAgICAgICAgOwkvLy88IENhdGNoIGFueSBlbGVtZW50IGNvbnRlbnQgaW4gWE1MIHN0cmluZworLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYnVzaW5lc3NJbmZvIgorCitjbGFzcyB1ZGRpMl9fYnVzaW5lc3NJbmZvCit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX25hbWUqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19uYW1lKiAgICAgICAgICAgPiBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgMTsKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2Rlc2NyaXB0aW9uKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZGVzY3JpcHRpb24qICAgID4gZGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgIDA7CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOnNlcnZpY2VJbmZvcworICAgIHVkZGkyX19zZXJ2aWNlSW5mb3MqICAgICAgICAgICAgICAgICBzZXJ2aWNlSW5mb3MgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gQXR0cmlidXRlIGJ1c2luZXNzS2V5IG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOmJ1c2luZXNzS2V5CisgICBAdWRkaTJfX2J1c2luZXNzS2V5ICAgICAgICAgICAgICAgICAgIGJ1c2luZXNzS2V5ICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYnVzaW5lc3NJbmZvcyIKKworY2xhc3MgdWRkaTJfX2J1c2luZXNzSW5mb3MKK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fYnVzaW5lc3NJbmZvKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NJbmZvKiAgID4gYnVzaW5lc3NJbmZvICAgICAgICAgICAgICAgICAgIDA7CisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJidXNpbmVzc1NlcnZpY2UiCisKK2NsYXNzIHVkZGkyX19idXNpbmVzc1NlcnZpY2UKK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fbmFtZSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX25hbWUqICAgICAgICAgICA+IG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAwOworLy8vIFZlY3RvciBvZiB1ZGRpMl9fZGVzY3JpcHRpb24qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19kZXNjcmlwdGlvbiogICAgPiBkZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgMDsKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YmluZGluZ1RlbXBsYXRlcworICAgIHVkZGkyX19iaW5kaW5nVGVtcGxhdGVzKiAgICAgICAgICAgICBiaW5kaW5nVGVtcGxhdGVzICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmNhdGVnb3J5QmFnCisgICAgdWRkaTJfX2NhdGVnb3J5QmFnKiAgICAgICAgICAgICAgICAgIGNhdGVnb3J5QmFnICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQKKy8vLyBBdHRyaWJ1dGUgc2VydmljZUtleSBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpzZXJ2aWNlS2V5CisgICBAdWRkaTJfX3NlcnZpY2VLZXkgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VLZXkgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBidXNpbmVzc0tleSBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpidXNpbmVzc0tleQorICAgQHVkZGkyX19idXNpbmVzc0tleSAgICAgICAgICAgICAgICAgICBidXNpbmVzc0tleSAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImJ1c2luZXNzU2VydmljZXMiCisKK2NsYXNzIHVkZGkyX19idXNpbmVzc1NlcnZpY2VzCit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2J1c2luZXNzU2VydmljZSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzU2VydmljZSo+IGJ1c2luZXNzU2VydmljZSAgICAgICAgICAgICAgICAwOworLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiY2F0ZWdvcnlCYWciCisKK2NsYXNzIHVkZGkyX19jYXRlZ29yeUJhZworeyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX19rZXllZFJlZmVyZW5jZSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2tleWVkUmVmZXJlbmNlKiA+IGtleWVkUmVmZXJlbmNlICAgICAgICAgICAgICAgICAxOworLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiY29udGFjdCIKKworY2xhc3MgdWRkaTJfX2NvbnRhY3QKK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fZGVzY3JpcHRpb24qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19kZXNjcmlwdGlvbiogICAgPiBkZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgMDsKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6cGVyc29uTmFtZQorICAgIGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzb25OYW1lICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gVmVjdG9yIG9mIHVkZGkyX19waG9uZSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX3Bob25lKiAgICAgICAgICA+IHBob25lICAgICAgICAgICAgICAgICAgICAgICAgICAwOworLy8vIFZlY3RvciBvZiB1ZGRpMl9fZW1haWwqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19lbWFpbCogICAgICAgICAgPiBlbWFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgMDsKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2FkZHJlc3MqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19hZGRyZXNzKiAgICAgICAgPiBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgMDsKKy8vLyBBdHRyaWJ1dGUgdXNlVHlwZSBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VUeXBlICAgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImNvbnRhY3RzIgorCitjbGFzcyB1ZGRpMl9fY29udGFjdHMKK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fY29udGFjdCogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2NvbnRhY3QqICAgICAgICA+IGNvbnRhY3QgICAgICAgICAgICAgICAgICAgICAgICAxOworLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZGlzY292ZXJ5VVJMcyIKKworY2xhc3MgdWRkaTJfX2Rpc2NvdmVyeVVSTHMKK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fZGlzY292ZXJ5VVJMKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZGlzY292ZXJ5VVJMKiAgID4gZGlzY292ZXJ5VVJMICAgICAgICAgICAgICAgICAgIDE7CisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJkaXNwb3NpdGlvblJlcG9ydCIKKworY2xhc3MgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0Cit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX3Jlc3VsdCogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX3Jlc3VsdCogICAgICAgICA+IHJlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAxOworLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBvcGVyYXRvciBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcl8gICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgdHJ1bmNhdGVkIG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRydW5jYXRlZAorICAgQGVudW0gdWRkaTJfX3RydW5jYXRlZCogICAgICAgICAgICAgICB0cnVuY2F0ZWQgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImZpbmRRdWFsaWZpZXJzIgorCitjbGFzcyB1ZGRpMl9fZmluZFF1YWxpZmllcnMKK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiBjaGFyKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3RvcjxjaGFyKiAgICAgICAgICAgICAgICAgID4gZmluZFF1YWxpZmllciAgICAgICAgICAgICAgICAgIDA7CisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJob3N0aW5nUmVkaXJlY3RvciIKKworY2xhc3MgdWRkaTJfX2hvc3RpbmdSZWRpcmVjdG9yCit7IHB1YmxpYzoKKy8vLyBBdHRyaWJ1dGUgYmluZGluZ0tleSBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpiaW5kaW5nS2V5CisgICBAdWRkaTJfX2JpbmRpbmdLZXkgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdLZXkgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiaWRlbnRpZmllckJhZyIKKworY2xhc3MgdWRkaTJfX2lkZW50aWZpZXJCYWcKK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19rZXllZFJlZmVyZW5jZSogPiBrZXllZFJlZmVyZW5jZSAgICAgICAgICAgICAgICAgMTsKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6Imluc3RhbmNlRGV0YWlscyIKKworY2xhc3MgdWRkaTJfX2luc3RhbmNlRGV0YWlscworeyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX19kZXNjcmlwdGlvbiogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2Rlc2NyaXB0aW9uKiAgICA+IGRlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAwOworLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpvdmVydmlld0RvYworICAgIHVkZGkyX19vdmVydmlld0RvYyogICAgICAgICAgICAgICAgICBvdmVydmlld0RvYyAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmluc3RhbmNlUGFybXMKKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VQYXJtcyAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudAorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92Mjoia2V5ZWRSZWZlcmVuY2UiCisKK2NsYXNzIHVkZGkyX19rZXllZFJlZmVyZW5jZQoreyBwdWJsaWM6CisvLy8gQXR0cmlidXRlIHRNb2RlbEtleSBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0TW9kZWxLZXkKKyAgIEB1ZGRpMl9fdE1vZGVsS2V5ICAgICAgICAgICAgICAgICAgICAgdE1vZGVsS2V5ICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIGtleU5hbWUgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5TmFtZSAgICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIGtleVZhbHVlIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92Mjoia2V5c093bmVkIgorCitjbGFzcyB1ZGRpMl9fa2V5c093bmVkCit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6ZnJvbUtleQorICAgIHVkZGkyX19idXNpbmVzc0tleSAgICAgICAgICAgICAgICAgICBmcm9tS2V5ICAgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRvS2V5CisgICAgdWRkaTJfX2J1c2luZXNzS2V5ICAgICAgICAgICAgICAgICAgIHRvS2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6Im92ZXJ2aWV3RG9jIgorCitjbGFzcyB1ZGRpMl9fb3ZlcnZpZXdEb2MKK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fZGVzY3JpcHRpb24qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19kZXNjcmlwdGlvbiogICAgPiBkZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgMDsKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6b3ZlcnZpZXdVUkwKKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnZpZXdVUkwgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudAorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoicHVibGlzaGVyQXNzZXJ0aW9uIgorCitjbGFzcyB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uCit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6ZnJvbUtleQorICAgIHVkZGkyX19idXNpbmVzc0tleSAgICAgICAgICAgICAgICAgICBmcm9tS2V5ICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRvS2V5CisgICAgdWRkaTJfX2J1c2luZXNzS2V5ICAgICAgICAgICAgICAgICAgIHRvS2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6a2V5ZWRSZWZlcmVuY2UKKyAgICB1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UqICAgICAgICAgICAgICAga2V5ZWRSZWZlcmVuY2UgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoicmVsYXRlZEJ1c2luZXNzSW5mbyIKKworY2xhc3MgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8KK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpidXNpbmVzc0tleQorICAgIHVkZGkyX19idXNpbmVzc0tleSAgICAgICAgICAgICAgICAgICBidXNpbmVzc0tleSAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gVmVjdG9yIG9mIHVkZGkyX19uYW1lKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fbmFtZSogICAgICAgICAgID4gbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDE7CisvLy8gVmVjdG9yIG9mIHVkZGkyX19kZXNjcmlwdGlvbiogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2Rlc2NyaXB0aW9uKiAgICA+IGRlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAwOworLy8vIFZlY3RvciBvZiB1ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyogd2l0aCBsZW5ndGggMC4uMgorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzKj4gc2hhcmVkUmVsYXRpb25zaGlwcyAgICAgICAgICAgIDE6MjsKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InJlbGF0ZWRCdXNpbmVzc0luZm9zIgorCitjbGFzcyB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mb3MKK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8qPiByZWxhdGVkQnVzaW5lc3NJbmZvICAgICAgICAgICAgMDsKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InJlc3VsdCIKKworY2xhc3MgdWRkaTJfX3Jlc3VsdAoreyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmVyckluZm8KKyAgICB1ZGRpMl9fZXJySW5mbyogICAgICAgICAgICAgICAgICAgICAgZXJySW5mbyAgICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudAorLy8vIEF0dHJpYnV0ZSBrZXlUeXBlIG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOmtleVR5cGUKKyAgIEBlbnVtIHVkZGkyX19rZXlUeXBlKiAgICAgICAgICAgICAgICAga2V5VHlwZSAgICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIGVycm5vIG9mIHR5cGUgeHM6aW50CisgICBAaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vXyAgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92Mjoic2VydmljZUluZm8iCisKK2NsYXNzIHVkZGkyX19zZXJ2aWNlSW5mbworeyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX19uYW1lKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fbmFtZSogICAgICAgICAgID4gbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDA7CisvLy8gQXR0cmlidXRlIHNlcnZpY2VLZXkgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6c2VydmljZUtleQorICAgQHVkZGkyX19zZXJ2aWNlS2V5ICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlS2V5ICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgYnVzaW5lc3NLZXkgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YnVzaW5lc3NLZXkKKyAgIEB1ZGRpMl9fYnVzaW5lc3NLZXkgICAgICAgICAgICAgICAgICAgYnVzaW5lc3NLZXkgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJzZXJ2aWNlSW5mb3MiCisKK2NsYXNzIHVkZGkyX19zZXJ2aWNlSW5mb3MKK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fc2VydmljZUluZm8qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19zZXJ2aWNlSW5mbyogICAgPiBzZXJ2aWNlSW5mbyAgICAgICAgICAgICAgICAgICAgMDsKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InNoYXJlZFJlbGF0aW9uc2hpcHMiCisKK2NsYXNzIHVkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzCit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2tleWVkUmVmZXJlbmNlKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UqID4ga2V5ZWRSZWZlcmVuY2UgICAgICAgICAgICAgICAgIDE7CisvLy8gQXR0cmlidXRlIGRpcmVjdGlvbiBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpkaXJlY3Rpb24KKyAgIEBlbnVtIHVkZGkyX19kaXJlY3Rpb24gICAgICAgICAgICAgICAgZGlyZWN0aW9uICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJ0TW9kZWwiCisKK2NsYXNzIHVkZGkyX190TW9kZWwKK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpuYW1lCisgICAgdWRkaTJfX25hbWUqICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2Rlc2NyaXB0aW9uKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZGVzY3JpcHRpb24qICAgID4gZGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgIDA7CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOm92ZXJ2aWV3RG9jCisgICAgdWRkaTJfX292ZXJ2aWV3RG9jKiAgICAgICAgICAgICAgICAgIG92ZXJ2aWV3RG9jICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6aWRlbnRpZmllckJhZworICAgIHVkZGkyX19pZGVudGlmaWVyQmFnKiAgICAgICAgICAgICAgICBpZGVudGlmaWVyQmFnICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmNhdGVnb3J5QmFnCisgICAgdWRkaTJfX2NhdGVnb3J5QmFnKiAgICAgICAgICAgICAgICAgIGNhdGVnb3J5QmFnICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQKKy8vLyBBdHRyaWJ1dGUgdE1vZGVsS2V5IG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRNb2RlbEtleQorICAgQHVkZGkyX190TW9kZWxLZXkgICAgICAgICAgICAgICAgICAgICB0TW9kZWxLZXkgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgb3BlcmF0b3Igb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3JfICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIGF1dGhvcml6ZWROYW1lIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcml6ZWROYW1lICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoidE1vZGVsQmFnIgorCitjbGFzcyB1ZGRpMl9fdE1vZGVsQmFnCit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX3RNb2RlbEtleSB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fdE1vZGVsS2V5ICAgICAgID4gdE1vZGVsS2V5ICAgICAgICAgICAgICAgICAgICAgIDE7CisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJ0TW9kZWxJbmZvIgorCitjbGFzcyB1ZGRpMl9fdE1vZGVsSW5mbworeyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOm5hbWUKKyAgICB1ZGRpMl9fbmFtZSogICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIEF0dHJpYnV0ZSB0TW9kZWxLZXkgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dE1vZGVsS2V5CisgICBAdWRkaTJfX3RNb2RlbEtleSAgICAgICAgICAgICAgICAgICAgIHRNb2RlbEtleSAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoidE1vZGVsSW5mb3MiCisKK2NsYXNzIHVkZGkyX190TW9kZWxJbmZvcworeyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX190TW9kZWxJbmZvKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fdE1vZGVsSW5mbyogICAgID4gdE1vZGVsSW5mbyAgICAgICAgICAgICAgICAgICAgIDA7CisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJ0TW9kZWxJbnN0YW5jZURldGFpbHMiCisKK2NsYXNzIHVkZGkyX190TW9kZWxJbnN0YW5jZURldGFpbHMKK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvKj4gdE1vZGVsSW5zdGFuY2VJbmZvICAgICAgICAgICAgIDA7CisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJ0TW9kZWxJbnN0YW5jZUluZm8iCisKK2NsYXNzIHVkZGkyX190TW9kZWxJbnN0YW5jZUluZm8KK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fZGVzY3JpcHRpb24qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19kZXNjcmlwdGlvbiogICAgPiBkZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgMDsKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6aW5zdGFuY2VEZXRhaWxzCisgICAgdWRkaTJfX2luc3RhbmNlRGV0YWlscyogICAgICAgICAgICAgIGluc3RhbmNlRGV0YWlscyAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQKKy8vLyBBdHRyaWJ1dGUgdE1vZGVsS2V5IG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRNb2RlbEtleQorICAgQHVkZGkyX190TW9kZWxLZXkgICAgICAgICAgICAgICAgICAgICB0TW9kZWxLZXkgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImFkZF9wdWJsaXNoZXJBc3NlcnRpb25zIgorCitjbGFzcyB1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMKK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjphdXRoSW5mbworICAgIGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoSW5mbyAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gVmVjdG9yIG9mIHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24qPiBwdWJsaXNoZXJBc3NlcnRpb24gICAgICAgICAgICAgMTsKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKik7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbio+IHB1Ymxpc2hlckFzc2VydGlvbnMpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCogc2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJkZWxldGVfYmluZGluZyIKKworY2xhc3MgdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nCit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YXV0aEluZm8KKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aEluZm8gICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIFZlY3RvciBvZiB1ZGRpMl9fYmluZGluZ0tleSB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYmluZGluZ0tleSAgICAgID4gYmluZGluZ0tleSAgICAgICAgICAgICAgICAgICAgIDE7CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCopOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKmJpbmRpbmdLZXkpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPGNoYXIqPiBiaW5kaW5nS2V5cyk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0KiBzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbyk7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImRlbGV0ZV9idXNpbmVzcyIKKworY2xhc3MgdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcworeyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmF1dGhJbmZvCisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhJbmZvICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2J1c2luZXNzS2V5IHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc0tleSAgICAgPiBidXNpbmVzc0tleSAgICAgICAgICAgICAgICAgICAgMTsKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCopOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICpidXNpbmVzc0tleSk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPGNoYXIqPiBidXNpbmVzc0tleXMpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCogc2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJkZWxldGVfcHVibGlzaGVyQXNzZXJ0aW9ucyIKKworY2xhc3MgdWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zCit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YXV0aEluZm8KKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aEluZm8gICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIFZlY3RvciBvZiB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKj4gcHVibGlzaGVyQXNzZXJ0aW9uICAgICAgICAgICAgIDE7CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCopOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24qPiBwdWJsaXNoZXJBc3NlcnRpb25zKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQqIHNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKTsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZGVsZXRlX3NlcnZpY2UiCisKK2NsYXNzIHVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZQoreyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmF1dGhJbmZvCisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhJbmZvICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX3NlcnZpY2VLZXkgd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX3NlcnZpY2VLZXkgICAgICA+IHNlcnZpY2VLZXkgICAgICAgICAgICAgICAgICAgICAxOworLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICpzZXJ2aWNlS2V5KTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3RvcjxjaGFyKj4gc2VydmljZUtleXMpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCogc2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJkZWxldGVfdE1vZGVsIgorCitjbGFzcyB1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbAoreyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmF1dGhJbmZvCisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhJbmZvICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX3RNb2RlbEtleSB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fdE1vZGVsS2V5ICAgICAgID4gdE1vZGVsS2V5ICAgICAgICAgICAgICAgICAgICAgIDE7CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKik7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0TW9kZWxLZXkpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8Y2hhcio+IHRNb2RlbEtleXMpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCogc2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJkaXNjYXJkX2F1dGhUb2tlbiIKKworY2xhc3MgdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuCit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YXV0aEluZm8KKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aEluZm8gICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4oc3RydWN0IHNvYXAqKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICphdXRoSW5mbyk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0KiBzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50KTsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZmluZF9iaW5kaW5nIgorCitjbGFzcyB1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nCit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6ZmluZFF1YWxpZmllcnMKKyAgICB1ZGRpMl9fZmluZFF1YWxpZmllcnMqICAgICAgICAgICAgICAgZmluZFF1YWxpZmllcnMgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudAorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0TW9kZWxCYWcKKyAgICB1ZGRpMl9fdE1vZGVsQmFnKiAgICAgICAgICAgICAgICAgICAgdE1vZGVsQmFnICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBtYXhSb3dzIG9mIHR5cGUgeHM6aW50CisgICBAaW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJvd3MgICAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBzZXJ2aWNlS2V5IG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOnNlcnZpY2VLZXkKKyAgIEB1ZGRpMl9fc2VydmljZUtleSAgICAgICAgICAgICAgICAgICAgc2VydmljZUtleSAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdE1vZGVsS2V5KTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8Y2hhcio+IHRNb2RlbEtleXMpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19iaW5kaW5nRGV0YWlsICpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50KTsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZmluZF9idXNpbmVzcyIKKworY2xhc3MgdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MKK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpmaW5kUXVhbGlmaWVycworICAgIHVkZGkyX19maW5kUXVhbGlmaWVycyogICAgICAgICAgICAgICBmaW5kUXVhbGlmaWVycyAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50CisvLy8gVmVjdG9yIG9mIHVkZGkyX19uYW1lKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fbmFtZSogICAgICAgICAgID4gbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDA7CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmlkZW50aWZpZXJCYWcKKyAgICB1ZGRpMl9faWRlbnRpZmllckJhZyogICAgICAgICAgICAgICAgaWRlbnRpZmllckJhZyAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudAorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpjYXRlZ29yeUJhZworICAgIHVkZGkyX19jYXRlZ29yeUJhZyogICAgICAgICAgICAgICAgICBjYXRlZ29yeUJhZyAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRNb2RlbEJhZworICAgIHVkZGkyX190TW9kZWxCYWcqICAgICAgICAgICAgICAgICAgICB0TW9kZWxCYWcgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmRpc2NvdmVyeVVSTHMKKyAgICB1ZGRpMl9fZGlzY292ZXJ5VVJMcyogICAgICAgICAgICAgICAgZGlzY292ZXJ5VVJMcyAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudAorLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBtYXhSb3dzIG9mIHR5cGUgeHM6aW50CisgICBAaW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJvd3MgICAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCopOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqbmFtZSk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3RvcjxjaGFyKj4gdE1vZGVsS2V5cyk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UqPiBrZXllZFJlZmVyZW5jZXMpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19idXNpbmVzc0xpc3QgKnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQpOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJmaW5kX3JlbGF0ZWRCdXNpbmVzc2VzIgorCitjbGFzcyB1ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcworeyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmZpbmRRdWFsaWZpZXJzCisgICAgdWRkaTJfX2ZpbmRRdWFsaWZpZXJzKiAgICAgICAgICAgICAgIGZpbmRRdWFsaWZpZXJzICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YnVzaW5lc3NLZXkKKyAgICB1ZGRpMl9fYnVzaW5lc3NLZXkgICAgICAgICAgICAgICAgICAgYnVzaW5lc3NLZXkgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjprZXllZFJlZmVyZW5jZQorICAgIHVkZGkyX19rZXllZFJlZmVyZW5jZSogICAgICAgICAgICAgICBrZXllZFJlZmVyZW5jZSAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIG1heFJvd3Mgb2YgdHlwZSB4czppbnQKKyAgIEBpbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Um93cyAgICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzKHN0cnVjdCBzb2FwKik7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICpidXNpbmVzc0tleSk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdCAqc2VuZChjb25zdCBjaGFyICplbmRwb2ludCk7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImZpbmRfc2VydmljZSIKKworY2xhc3MgdWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZQoreyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmZpbmRRdWFsaWZpZXJzCisgICAgdWRkaTJfX2ZpbmRRdWFsaWZpZXJzKiAgICAgICAgICAgICAgIGZpbmRRdWFsaWZpZXJzICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX25hbWUqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19uYW1lKiAgICAgICAgICAgPiBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgMDsKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6Y2F0ZWdvcnlCYWcKKyAgICB1ZGRpMl9fY2F0ZWdvcnlCYWcqICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlCYWcgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudAorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0TW9kZWxCYWcKKyAgICB1ZGRpMl9fdE1vZGVsQmFnKiAgICAgICAgICAgICAgICAgICAgdE1vZGVsQmFnICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudAorLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBtYXhSb3dzIG9mIHR5cGUgeHM6aW50CisgICBAaW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJvd3MgICAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBidXNpbmVzc0tleSBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpidXNpbmVzc0tleQorICAgQHVkZGkyX19idXNpbmVzc0tleSAgICAgICAgICAgICAgICAgICBidXNpbmVzc0tleSAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCopOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICpuYW1lKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8Y2hhcio+IHRNb2RlbEtleXMpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UqPiBrZXllZFJlZmVyZW5jZXMpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19zZXJ2aWNlTGlzdCogc2VuZChjb25zdCBjaGFyICplbmRwb2ludCk7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImZpbmRfdE1vZGVsIgorCitjbGFzcyB1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWwKK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpmaW5kUXVhbGlmaWVycworICAgIHVkZGkyX19maW5kUXVhbGlmaWVycyogICAgICAgICAgICAgICBmaW5kUXVhbGlmaWVycyAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOm5hbWUKKyAgICB1ZGRpMl9fbmFtZSogICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudAorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjppZGVudGlmaWVyQmFnCisgICAgdWRkaTJfX2lkZW50aWZpZXJCYWcqICAgICAgICAgICAgICAgIGlkZW50aWZpZXJCYWcgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6Y2F0ZWdvcnlCYWcKKyAgICB1ZGRpMl9fY2F0ZWdvcnlCYWcqICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlCYWcgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudAorLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBtYXhSb3dzIG9mIHR5cGUgeHM6aW50CisgICBAaW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJvd3MgICAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICpuYW1lKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UqPiBrZXllZFJlZmVyZW5jZXMpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX190TW9kZWxMaXN0KiBzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50KTsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZ2V0X2Fzc2VydGlvblN0YXR1c1JlcG9ydCIKKworY2xhc3MgdWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQKK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjphdXRoSW5mbworICAgIGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoSW5mbyAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmNvbXBsZXRpb25TdGF0dXMKKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvblN0YXR1cyAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudAorLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydChzdHJ1Y3Qgc29hcCopOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqY29tcGxldGlvblN0YXR1cyk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydCogc2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJnZXRfYXV0aFRva2VuIgorCitjbGFzcyB1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbgoreyBwdWJsaWM6CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIHVzZXJJRCBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgY3JlZCBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW4oc3RydWN0IHNvYXAqKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnVzZXJpZCwgY29uc3QgY2hhciAqcGFzc3dkKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fYXV0aFRva2VuKiBzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50KTsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZ2V0X2JpbmRpbmdEZXRhaWwiCisKK2NsYXNzIHVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbAoreyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX19iaW5kaW5nS2V5IHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19iaW5kaW5nS2V5ICAgICAgPiBiaW5kaW5nS2V5ICAgICAgICAgICAgICAgICAgICAgMTsKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsKHN0cnVjdCBzb2FwKik7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqYmluZGluZ0tleSk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8Y2hhcio+IGJpbmRpbmdLZXlzKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fYmluZGluZ0RldGFpbCogc2VuZChjb25zdCBjaGFyICplbmRwb2ludCk7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImdldF9idXNpbmVzc0RldGFpbCIKKworY2xhc3MgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbAoreyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX19idXNpbmVzc0tleSB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NLZXkgICAgID4gYnVzaW5lc3NLZXkgICAgICAgICAgICAgICAgICAgIDE7CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwoc3RydWN0IHNvYXAqKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqYnVzaW5lc3NLZXkpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3RvcjxjaGFyKj4gYnVzaW5lc3NLZXlzKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fYnVzaW5lc3NEZXRhaWwqIHNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQpOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJnZXRfYnVzaW5lc3NEZXRhaWxFeHQiCisKK2NsYXNzIHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQKK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fYnVzaW5lc3NLZXkgd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzS2V5ICAgICA+IGJ1c2luZXNzS2V5ICAgICAgICAgICAgICAgICAgICAxOworLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0KHN0cnVjdCBzb2FwKik7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKmJ1c2luZXNzS2V5KTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0KHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8Y2hhcio+IGJ1c2luZXNzS2V5cyk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0KiBzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50KTsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZ2V0X3B1Ymxpc2hlckFzc2VydGlvbnMiCisKK2NsYXNzIHVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucworeyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmF1dGhJbmZvCisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhJbmZvICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKik7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMqIHNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKTsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZ2V0X3JlZ2lzdGVyZWRJbmZvIgorCitjbGFzcyB1ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvCit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YXV0aEluZm8KKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aEluZm8gICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvKHN0cnVjdCBzb2FwKik7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX3JlZ2lzdGVyZWRJbmZvKiBzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbyk7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImdldF9zZXJ2aWNlRGV0YWlsIgorCitjbGFzcyB1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwKK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fc2VydmljZUtleSB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fc2VydmljZUtleSAgICAgID4gc2VydmljZUtleSAgICAgICAgICAgICAgICAgICAgIDE7CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbChzdHJ1Y3Qgc29hcCopOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnNlcnZpY2VLZXkpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbChzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPGNoYXIqPiBzZXJ2aWNlS2V5cyk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX3NlcnZpY2VEZXRhaWwqIHNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQpOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJnZXRfdE1vZGVsRGV0YWlsIgorCitjbGFzcyB1ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbAoreyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX190TW9kZWxLZXkgd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbEtleSAgICAgICA+IHRNb2RlbEtleSAgICAgICAgICAgICAgICAgICAgICAxOworLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbChzdHJ1Y3Qgc29hcCopOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdE1vZGVsS2V5KTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbChzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPGNoYXIqPiB0TW9kZWxLZXlzKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fdE1vZGVsRGV0YWlsKiBzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50KTsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92Mjoic2F2ZV9iaW5kaW5nIgorCitjbGFzcyB1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nCit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YXV0aEluZm8KKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aEluZm8gICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIFZlY3RvciBvZiB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYmluZGluZ1RlbXBsYXRlKj4gYmluZGluZ1RlbXBsYXRlICAgICAgICAgICAgICAgIDE7CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZSAmYmluZGluZ1RlbXBsYXRlKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2JpbmRpbmdUZW1wbGF0ZSo+IGJpbmRpbmdUZW1wbGF0ZXMpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19iaW5kaW5nRGV0YWlsKiBzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbyk7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InNhdmVfYnVzaW5lc3MiCisKK2NsYXNzIHVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzCit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YXV0aEluZm8KKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aEluZm8gICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIFZlY3RvciBvZiB1ZGRpMl9fYnVzaW5lc3NFbnRpdHkqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc0VudGl0eSogPiBidXNpbmVzc0VudGl0eSAgICAgICAgICAgICAgICAgMDsKKy8vLyBWZWN0b3Igb2YgY2hhciogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8Y2hhciogICAgICAgICAgICAgICAgICA+IHVwbG9hZFJlZ2lzdGVyICAgICAgICAgICAgICAgICAwOworLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCopOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2J1c2luZXNzRW50aXR5ICZidXNpbmVzc0VudGl0eSk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NFbnRpdHkqPiBidXNpbmVzc0VudGl0aWVzKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fYnVzaW5lc3NEZXRhaWwqIHNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKTsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92Mjoic2F2ZV9zZXJ2aWNlIgorCitjbGFzcyB1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlCit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YXV0aEluZm8KKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aEluZm8gICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIFZlY3RvciBvZiB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlKj4gYnVzaW5lc3NTZXJ2aWNlICAgICAgICAgICAgICAgIDE7CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2J1c2luZXNzU2VydmljZSAmYnVzaW5lc3NTZXJ2aWNlKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzU2VydmljZSo+IGJ1c2luZXNzU2VydmljZXMpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19zZXJ2aWNlRGV0YWlsKiBzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbyk7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InNhdmVfdE1vZGVsIgorCitjbGFzcyB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwKK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjphdXRoSW5mbworICAgIGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoSW5mbyAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gVmVjdG9yIG9mIHVkZGkyX190TW9kZWwqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX190TW9kZWwqICAgICAgICAgPiB0TW9kZWwgICAgICAgICAgICAgICAgICAgICAgICAgMDsKKy8vLyBWZWN0b3Igb2YgY2hhciogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8Y2hhciogICAgICAgICAgICAgICAgICA+IHVwbG9hZFJlZ2lzdGVyICAgICAgICAgICAgICAgICAwOworLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCB1ZGRpMl9fdE1vZGVsICZ0TW9kZWwpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX190TW9kZWwqPiB0TW9kZWxzKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fdE1vZGVsRGV0YWlsKiBzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbyk7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InNldF9wdWJsaXNoZXJBc3NlcnRpb25zIgorCitjbGFzcyB1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMKK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjphdXRoSW5mbworICAgIGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoSW5mbyAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gVmVjdG9yIG9mIHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24qPiBwdWJsaXNoZXJBc3NlcnRpb24gICAgICAgICAgICAgMDsKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKik7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbio+IHB1Ymxpc2hlckFzc2VydGlvbnMpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zKiBzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbyk7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InZhbGlkYXRlX3ZhbHVlcyIKKworY2xhc3MgdWRkaTJfX3ZhbGlkYXRlX1VTQ09SRXZhbHVlcworeyBwdWJsaWM6CisvLyBDSE9JQ0UgT0YgRUxFTUVOVFM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX19idXNpbmVzc0VudGl0eSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzRW50aXR5KiA+IGJ1c2luZXNzRW50aXR5ICAgICAgICAgICAgICAgICAwOworLy8vIFZlY3RvciBvZiB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlKj4gYnVzaW5lc3NTZXJ2aWNlICAgICAgICAgICAgICAgIDA7CisvLy8gVmVjdG9yIG9mIHVkZGkyX190TW9kZWwqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX190TW9kZWwqICAgICAgICAgPiB0TW9kZWwgICAgICAgICAgICAgICAgICAgICAgICAgMDsKKy8vIEVORCBDSE9JQ0UKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImFzc2VydGlvblN0YXR1c1JlcG9ydCIKKworY2xhc3MgdWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydAoreyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbSo+IGFzc2VydGlvblN0YXR1c0l0ZW0gICAgICAgICAgICAwOworLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBvcGVyYXRvciBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcl8gICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImF1dGhUb2tlbiIKKworY2xhc3MgdWRkaTJfX2F1dGhUb2tlbgoreyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmF1dGhJbmZvCisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhJbmZvICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgb3BlcmF0b3Igb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3JfICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJiaW5kaW5nRGV0YWlsIgorCitjbGFzcyB1ZGRpMl9fYmluZGluZ0RldGFpbAoreyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX19iaW5kaW5nVGVtcGxhdGUqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19iaW5kaW5nVGVtcGxhdGUqPiBiaW5kaW5nVGVtcGxhdGUgICAgICAgICAgICAgICAgMDsKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgb3BlcmF0b3Igb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3JfICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIHRydW5jYXRlZCBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0cnVuY2F0ZWQKKyAgIEBlbnVtIHVkZGkyX190cnVuY2F0ZWQqICAgICAgICAgICAgICAgdHJ1bmNhdGVkICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJidXNpbmVzc0RldGFpbCIKKworY2xhc3MgdWRkaTJfX2J1c2luZXNzRGV0YWlsCit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2J1c2luZXNzRW50aXR5KiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NFbnRpdHkqID4gYnVzaW5lc3NFbnRpdHkgICAgICAgICAgICAgICAgIDA7CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIG9wZXJhdG9yIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yXyAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSB0cnVuY2F0ZWQgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dHJ1bmNhdGVkCisgICBAZW51bSB1ZGRpMl9fdHJ1bmNhdGVkKiAgICAgICAgICAgICAgIHRydW5jYXRlZCAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYnVzaW5lc3NEZXRhaWxFeHQiCisKK2NsYXNzIHVkZGkyX19idXNpbmVzc0RldGFpbEV4dAoreyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX19idXNpbmVzc0VudGl0eUV4dCogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzRW50aXR5RXh0Kj4gYnVzaW5lc3NFbnRpdHlFeHQgICAgICAgICAgICAgIDE7CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIG9wZXJhdG9yIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yXyAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSB0cnVuY2F0ZWQgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dHJ1bmNhdGVkCisgICBAZW51bSB1ZGRpMl9fdHJ1bmNhdGVkKiAgICAgICAgICAgICAgIHRydW5jYXRlZCAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYnVzaW5lc3NMaXN0IgorCitjbGFzcyB1ZGRpMl9fYnVzaW5lc3NMaXN0Cit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YnVzaW5lc3NJbmZvcworICAgIHVkZGkyX19idXNpbmVzc0luZm9zKiAgICAgICAgICAgICAgICBidXNpbmVzc0luZm9zICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIG9wZXJhdG9yIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yXyAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSB0cnVuY2F0ZWQgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dHJ1bmNhdGVkCisgICBAZW51bSB1ZGRpMl9fdHJ1bmNhdGVkKiAgICAgICAgICAgICAgIHRydW5jYXRlZCAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoicHVibGlzaGVyQXNzZXJ0aW9ucyIKKworY2xhc3MgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMKK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKj4gcHVibGlzaGVyQXNzZXJ0aW9uICAgICAgICAgICAgIDA7CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIG9wZXJhdG9yIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yXyAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBhdXRob3JpemVkTmFtZSBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JpemVkTmFtZSAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InJlZ2lzdGVyZWRJbmZvIgorCitjbGFzcyB1ZGRpMl9fcmVnaXN0ZXJlZEluZm8KK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpidXNpbmVzc0luZm9zCisgICAgdWRkaTJfX2J1c2luZXNzSW5mb3MqICAgICAgICAgICAgICAgIGJ1c2luZXNzSW5mb3MgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dE1vZGVsSW5mb3MKKyAgICB1ZGRpMl9fdE1vZGVsSW5mb3MqICAgICAgICAgICAgICAgICAgdE1vZGVsSW5mb3MgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBvcGVyYXRvciBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcl8gICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgdHJ1bmNhdGVkIG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRydW5jYXRlZAorICAgQGVudW0gdWRkaTJfX3RydW5jYXRlZCogICAgICAgICAgICAgICB0cnVuY2F0ZWQgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InJlbGF0ZWRCdXNpbmVzc2VzTGlzdCIKKworY2xhc3MgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdAoreyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmJ1c2luZXNzS2V5CisgICAgdWRkaTJfX2J1c2luZXNzS2V5ICAgICAgICAgICAgICAgICAgIGJ1c2luZXNzS2V5ICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6cmVsYXRlZEJ1c2luZXNzSW5mb3MKKyAgICB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mb3MqICAgICAgICAgcmVsYXRlZEJ1c2luZXNzSW5mb3MgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBvcGVyYXRvciBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcl8gICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgdHJ1bmNhdGVkIG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRydW5jYXRlZAorICAgQGVudW0gdWRkaTJfX3RydW5jYXRlZCogICAgICAgICAgICAgICB0cnVuY2F0ZWQgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InNlcnZpY2VEZXRhaWwiCisKK2NsYXNzIHVkZGkyX19zZXJ2aWNlRGV0YWlsCit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2J1c2luZXNzU2VydmljZSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzU2VydmljZSo+IGJ1c2luZXNzU2VydmljZSAgICAgICAgICAgICAgICAwOworLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBvcGVyYXRvciBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcl8gICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgdHJ1bmNhdGVkIG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRydW5jYXRlZAorICAgQGVudW0gdWRkaTJfX3RydW5jYXRlZCogICAgICAgICAgICAgICB0cnVuY2F0ZWQgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InNlcnZpY2VMaXN0IgorCitjbGFzcyB1ZGRpMl9fc2VydmljZUxpc3QKK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpzZXJ2aWNlSW5mb3MKKyAgICB1ZGRpMl9fc2VydmljZUluZm9zKiAgICAgICAgICAgICAgICAgc2VydmljZUluZm9zICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBvcGVyYXRvciBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcl8gICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgdHJ1bmNhdGVkIG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRydW5jYXRlZAorICAgQGVudW0gdWRkaTJfX3RydW5jYXRlZCogICAgICAgICAgICAgICB0cnVuY2F0ZWQgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InRNb2RlbERldGFpbCIKKworY2xhc3MgdWRkaTJfX3RNb2RlbERldGFpbAoreyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX190TW9kZWwqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX190TW9kZWwqICAgICAgICAgPiB0TW9kZWwgICAgICAgICAgICAgICAgICAgICAgICAgMTsKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgb3BlcmF0b3Igb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3JfICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIHRydW5jYXRlZCBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0cnVuY2F0ZWQKKyAgIEBlbnVtIHVkZGkyX190cnVuY2F0ZWQqICAgICAgICAgICAgICAgdHJ1bmNhdGVkICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJ0TW9kZWxMaXN0IgorCitjbGFzcyB1ZGRpMl9fdE1vZGVsTGlzdAoreyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRNb2RlbEluZm9zCisgICAgdWRkaTJfX3RNb2RlbEluZm9zKiAgICAgICAgICAgICAgICAgIHRNb2RlbEluZm9zICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgb3BlcmF0b3Igb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3JfICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIHRydW5jYXRlZCBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0cnVuY2F0ZWQKKyAgIEBlbnVtIHVkZGkyX190cnVuY2F0ZWQqICAgICAgICAgICAgICAgdHJ1bmNhdGVkICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJhY2Nlc3NQb2ludCIKKworY2xhc3MgdWRkaTJfX2FjY2Vzc1BvaW50Cit7IHB1YmxpYzoKKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pdGVtICAgICAgICAgICAgICAgICAgICAgICAgOworLy8vIEF0dHJpYnV0ZSBVUkxUeXBlIG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOlVSTFR5cGUKKyAgIEBlbnVtIHVkZGkyX19VUkxUeXBlICAgICAgICAgICAgICAgICAgVVJMVHlwZSAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJhZGRyZXNzTGluZSIKKworY2xhc3MgdWRkaTJfX2FkZHJlc3NMaW5lCit7IHB1YmxpYzoKKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pdGVtICAgICAgICAgICAgICAgICAgICAgICAgOworLy8vIEF0dHJpYnV0ZSBrZXlOYW1lIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleU5hbWUgICAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBrZXlWYWx1ZSBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImRlc2NyaXB0aW9uIgorCitjbGFzcyB1ZGRpMl9fZGVzY3JpcHRpb24KK3sgcHVibGljOgorICAgIGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2l0ZW0gICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gQXR0cmlidXRlIHJlZmVyZW5jZSB4bWw6bGFuZworICAgQHhtbF9fbGFuZyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxfX2xhbmdfICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImRpc2NvdmVyeVVSTCIKKworY2xhc3MgdWRkaTJfX2Rpc2NvdmVyeVVSTAoreyBwdWJsaWM6CisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXRlbSAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBBdHRyaWJ1dGUgdXNlVHlwZSBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VUeXBlICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImVtYWlsIgorCitjbGFzcyB1ZGRpMl9fZW1haWwKK3sgcHVibGljOgorICAgIGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2l0ZW0gICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gQXR0cmlidXRlIHVzZVR5cGUgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJlcnJJbmZvIgorCitjbGFzcyB1ZGRpMl9fZXJySW5mbworeyBwdWJsaWM6CisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXRlbSAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBBdHRyaWJ1dGUgZXJyQ29kZSBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJDb2RlICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6Im5hbWUiCisKK2NsYXNzIHVkZGkyX19uYW1lCit7IHB1YmxpYzoKKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pdGVtICAgICAgICAgICAgICAgICAgICAgICAgOworLy8vIEF0dHJpYnV0ZSByZWZlcmVuY2UgeG1sOmxhbmcKKyAgIEB4bWxfX2xhbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sX19sYW5nXyAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJwaG9uZSIKKworY2xhc3MgdWRkaTJfX3Bob25lCit7IHB1YmxpYzoKKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pdGVtICAgICAgICAgICAgICAgICAgICAgICAgOworLy8vIEF0dHJpYnV0ZSB1c2VUeXBlIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBTZXJ2aWNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvL2dzb2FwIGlucTIgc2VydmljZSBuYW1lOglJbnF1aXJlU29hcCAKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIHR5cGU6CUlucXVpcmUgCisvL2dzb2FwIGlucTIgc2VydmljZSBuYW1lc3BhY2U6CXVybjp1ZGRpLW9yZzppbnF1aXJ5X3YyIAorCisvKiogQG1haW5wYWdlIFVERElfSW5xdWlyeV9BUElfVjIgRGVmaW5pdGlvbnMKKworQHNlY3Rpb24gVURESV9JbnF1aXJ5X0FQSV9WMl9kb2N1bWVudGF0aW9uIERvY3VtZW50YXRpb24KKworCQlDb3B5cmlnaHQgKGMpIDIwMDAgLSAyMDAyIGJ5IEFjY2VudHVyZSwgQXJpYmEsIEluYy4sIENvbW1lcmNlIE9uZSwgSW5jLiAKKwkJRnVqaXRzdSBMaW1pdGVkLCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSwgaTIgVGVjaG5vbG9naWVzLCBJbmMuLCAKKwkJSW50ZWwgQ29ycG9yYXRpb24sIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24sICAKKwkJTWljcm9zb2Z0IENvcnBvcmF0aW9uLCBPcmFjbGUgQ29ycG9yYXRpb24sIFNBUCBBRywgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgCisJCWFuZCBWZXJpU2lnbiwgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKwkJCisJCVdTREwgU2VydmljZSBJbnRlcmZhY2UgZm9yIFVEREkgSW5xdWlyeSBBUEkgVjIuMCAgICAKKwkJCisJCVRoaXMgV1NETCBkb2N1bWVudCBkZWZpbmVzIHRoZSBpbnF1aXJ5IEFQSSBjYWxscyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCAKKwkJdGhlIFVEREkgcmVnaXN0cnkuICBUaGUgY29tcGxldGUgVURESSBBUEkgc3BlY2lmaWNhdGlvbiBpcyBhdmFpbGFibGUKKwkJYXQgaHR0cDovL3d3dy51ZGRpLm9yZy9zcGVjaWZpY2F0aW9uLmh0bWwuCisJCisKK0BzZWN0aW9uIFVERElfSW5xdWlyeV9BUElfVjJfYmluZGluZ3MgQmluZGluZ3MKKyAgLSBAcmVmIElucXVpcmVTb2FwCisKKyovCisKKy8qKgorCitAcGFnZSBJbnF1aXJlU29hcCBCaW5kaW5nICJJbnF1aXJlU29hcCIKKworQHNlY3Rpb24gSW5xdWlyZVNvYXBfb3BlcmF0aW9ucyBPcGVyYXRpb25zIG9mIEJpbmRpbmcgICJJbnF1aXJlU29hcCIKKyAgLSBAcmVmIF9faW5xMl9fZmluZF9VU0NPUkViaW5kaW5nCisgIC0gQHJlZiBfX2lucTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MKKyAgLSBAcmVmIF9faW5xMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcworICAtIEByZWYgX19pbnEyX19maW5kX1VTQ09SRXNlcnZpY2UKKyAgLSBAcmVmIF9faW5xMl9fZmluZF9VU0NPUkV0TW9kZWwKKyAgLSBAcmVmIF9faW5xMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwKKyAgLSBAcmVmIF9faW5xMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsCisgIC0gQHJlZiBfX2lucTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dAorICAtIEByZWYgX19pbnEyX19nZXRfVVNDT1JFc2VydmljZURldGFpbAorICAtIEByZWYgX19pbnEyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsCisKK0BzZWN0aW9uIElucXVpcmVTb2FwX3BvcnRzIEVuZHBvaW50cyBvZiBCaW5kaW5nICAiSW5xdWlyZVNvYXAiCisKKyovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBTT0FQIEZhdWx0IERldGFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy8gVGhlIFNPQVAgRmF1bHQgRGV0YWlsIGVsZW1lbnQgY29udGFpbnMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHlwZXMgc2VyaWFsaXplZAorLy8gaW4gdGhlIF9fdHlwZSBhbmQgZmF1bHQgZmllbGRzIG9mIHRoZSBTT0FQX0VOVl9fRGV0YWlsIHN0cnVjdCAoc2VlIGRvY3MpCitjbGFzcyBfZGlzcG9zaXRpb25SZXBvcnQKK3sgcHVibGljOgorICAgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCogICAgICAgICAgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydF87CisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBJbnF1aXJlU29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBfX2lucTJfX2ZpbmRfVVNDT1JFYmluZGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8vLyBPcGVyYXRpb24gIl9faW5xMl9fZmluZF9VU0NPUkViaW5kaW5nIiBvZiBzZXJ2aWNlIGJpbmRpbmcgIklucXVpcmVTb2FwIgorCisvKioKKworT3BlcmF0aW9uIGRldGFpbHM6CisKKyAgLSBTT0FQIGRvY3VtZW50L2xpdGVyYWwgc3R5bGUKKyAgLSBTT0FQIGFjdGlvbj0iZmluZF9iaW5kaW5nIgorICAtIFNPQVAgRmF1bHQ6IF9kaXNwb3NpdGlvblJlcG9ydAorCitDIHN0dWIgZnVuY3Rpb24gKGRlZmluZWQgaW4gc29hcENsaWVudC5jW3BwXSk6CitAY29kZQorICBpbnQgc29hcF9jYWxsX19faW5xMl9fZmluZF9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwICpzb2FwLAorICAgIE5VTEwsIC8vIGNoYXIgKmVuZHBvaW50ID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgZW5kcG9pbnQgZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgTlVMTCwgLy8gY2hhciAqYWN0aW9uID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgYWN0aW9uIGZvciB0aGlzIG9wZXJhdGlvbgorICAgIC8vIHJlcXVlc3QgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nKiAgICAgICAgICB1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nXywKKyAgICAvLyByZXNwb25zZSBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX19iaW5kaW5nRGV0YWlsKiAgICAgICAgICAgICAgIHVkZGkyX19iaW5kaW5nRGV0YWlsXworICApOworQGVuZGNvZGUKKworQysrIHByb3h5IGNsYXNzIChkZWZpbmVkIGluIHNvYXBJbnF1aXJlU29hcFByb3h5LmgpOgorICBjbGFzcyBJbnF1aXJlU29hcDsKKworKi8KKworLy9nc29hcCBpbnEyIHNlcnZpY2UgbWV0aG9kLXN0eWxlOglmaW5kX1VTQ09SRWJpbmRpbmcgZG9jdW1lbnQKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1lbmNvZGluZzoJZmluZF9VU0NPUkViaW5kaW5nIGxpdGVyYWwKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1hY3Rpb246CWZpbmRfVVNDT1JFYmluZGluZyBmaW5kX2JpbmRpbmcKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1mYXVsdDoJZmluZF9VU0NPUkViaW5kaW5nIF9kaXNwb3NpdGlvblJlcG9ydAoraW50IF9faW5xMl9fZmluZF9VU0NPUkViaW5kaW5nKAorICAgIHVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmcqICAgICAgICAgIHVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmdfLAorICAgIHVkZGkyX19iaW5kaW5nRGV0YWlsKiAgICAgICAgICAgICAgIHVkZGkyX19iaW5kaW5nRGV0YWlsXyAvLy88IHJlc3BvbnNlIHBhcmFtZXRlcgorKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIF9faW5xMl9fZmluZF9VU0NPUkVidXNpbmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLy8vIE9wZXJhdGlvbiAiX19pbnEyX19maW5kX1VTQ09SRWJ1c2luZXNzIiBvZiBzZXJ2aWNlIGJpbmRpbmcgIklucXVpcmVTb2FwIgorCisvKioKKworT3BlcmF0aW9uIGRldGFpbHM6CisKKyAgLSBTT0FQIGRvY3VtZW50L2xpdGVyYWwgc3R5bGUKKyAgLSBTT0FQIGFjdGlvbj0iZmluZF9idXNpbmVzcyIKKyAgLSBTT0FQIEZhdWx0OiBfZGlzcG9zaXRpb25SZXBvcnQKKworQyBzdHViIGZ1bmN0aW9uIChkZWZpbmVkIGluIHNvYXBDbGllbnQuY1twcF0pOgorQGNvZGUKKyAgaW50IHNvYXBfY2FsbF9fX2lucTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAgKnNvYXAsCisgICAgTlVMTCwgLy8gY2hhciAqZW5kcG9pbnQgPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBlbmRwb2ludCBmb3IgdGhpcyBvcGVyYXRpb24KKyAgICBOVUxMLCAvLyBjaGFyICphY3Rpb24gPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBhY3Rpb24gZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgLy8gcmVxdWVzdCBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzKiAgICAgICAgIHVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzXywKKyAgICAvLyByZXNwb25zZSBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX19idXNpbmVzc0xpc3QqICAgICAgICAgICAgICAgIHVkZGkyX19idXNpbmVzc0xpc3RfCisgICk7CitAZW5kY29kZQorCitDKysgcHJveHkgY2xhc3MgKGRlZmluZWQgaW4gc29hcElucXVpcmVTb2FwUHJveHkuaCk6CisgIGNsYXNzIElucXVpcmVTb2FwOworCisqLworCisvL2dzb2FwIGlucTIgc2VydmljZSBtZXRob2Qtc3R5bGU6CWZpbmRfVVNDT1JFYnVzaW5lc3MgZG9jdW1lbnQKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1lbmNvZGluZzoJZmluZF9VU0NPUkVidXNpbmVzcyBsaXRlcmFsCisvL2dzb2FwIGlucTIgc2VydmljZSBtZXRob2QtYWN0aW9uOglmaW5kX1VTQ09SRWJ1c2luZXNzIGZpbmRfYnVzaW5lc3MKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1mYXVsdDoJZmluZF9VU0NPUkVidXNpbmVzcyBfZGlzcG9zaXRpb25SZXBvcnQKK2ludCBfX2lucTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MoCisgICAgdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MqICAgICAgICAgdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3NfLAorICAgIHVkZGkyX19idXNpbmVzc0xpc3QqICAgICAgICAgICAgICAgIHVkZGkyX19idXNpbmVzc0xpc3RfIC8vLzwgcmVzcG9uc2UgcGFyYW1ldGVyCispOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogX19pbnEyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvLy8gT3BlcmF0aW9uICJfX2lucTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMiIG9mIHNlcnZpY2UgYmluZGluZyAiSW5xdWlyZVNvYXAiCisKKy8qKgorCitPcGVyYXRpb24gZGV0YWlsczoKKworICAtIFNPQVAgZG9jdW1lbnQvbGl0ZXJhbCBzdHlsZQorICAtIFNPQVAgYWN0aW9uPSJmaW5kX3JlbGF0ZWRCdXNpbmVzc2VzIgorICAtIFNPQVAgRmF1bHQ6IF9kaXNwb3NpdGlvblJlcG9ydAorCitDIHN0dWIgZnVuY3Rpb24gKGRlZmluZWQgaW4gc29hcENsaWVudC5jW3BwXSk6CitAY29kZQorICBpbnQgc29hcF9jYWxsX19faW5xMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyhzdHJ1Y3Qgc29hcCAqc29hcCwKKyAgICBOVUxMLCAvLyBjaGFyICplbmRwb2ludCA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGVuZHBvaW50IGZvciB0aGlzIG9wZXJhdGlvbgorICAgIE5VTEwsIC8vIGNoYXIgKmFjdGlvbiA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGFjdGlvbiBmb3IgdGhpcyBvcGVyYXRpb24KKyAgICAvLyByZXF1ZXN0IHBhcmFtZXRlcnM6CisgICAgdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMqIHVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzXywKKyAgICAvLyByZXNwb25zZSBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3QqICAgICAgIHVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3RfCisgICk7CitAZW5kY29kZQorCitDKysgcHJveHkgY2xhc3MgKGRlZmluZWQgaW4gc29hcElucXVpcmVTb2FwUHJveHkuaCk6CisgIGNsYXNzIElucXVpcmVTb2FwOworCisqLworCisvL2dzb2FwIGlucTIgc2VydmljZSBtZXRob2Qtc3R5bGU6CWZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMgZG9jdW1lbnQKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1lbmNvZGluZzoJZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyBsaXRlcmFsCisvL2dzb2FwIGlucTIgc2VydmljZSBtZXRob2QtYWN0aW9uOglmaW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzIGZpbmRfcmVsYXRlZEJ1c2luZXNzZXMKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1mYXVsdDoJZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyBfZGlzcG9zaXRpb25SZXBvcnQKK2ludCBfX2lucTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMoCisgICAgdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMqIHVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzXywKKyAgICB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0KiAgICAgICB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0XyAvLy88IHJlc3BvbnNlIHBhcmFtZXRlcgorKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIF9faW5xMl9fZmluZF9VU0NPUkVzZXJ2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLy8vIE9wZXJhdGlvbiAiX19pbnEyX19maW5kX1VTQ09SRXNlcnZpY2UiIG9mIHNlcnZpY2UgYmluZGluZyAiSW5xdWlyZVNvYXAiCisKKy8qKgorCitPcGVyYXRpb24gZGV0YWlsczoKKworICAtIFNPQVAgZG9jdW1lbnQvbGl0ZXJhbCBzdHlsZQorICAtIFNPQVAgYWN0aW9uPSJmaW5kX3NlcnZpY2UiCisgIC0gU09BUCBGYXVsdDogX2Rpc3Bvc2l0aW9uUmVwb3J0CisKK0Mgc3R1YiBmdW5jdGlvbiAoZGVmaW5lZCBpbiBzb2FwQ2xpZW50LmNbcHBdKToKK0Bjb2RlCisgIGludCBzb2FwX2NhbGxfX19pbnEyX19maW5kX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAgKnNvYXAsCisgICAgTlVMTCwgLy8gY2hhciAqZW5kcG9pbnQgPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBlbmRwb2ludCBmb3IgdGhpcyBvcGVyYXRpb24KKyAgICBOVUxMLCAvLyBjaGFyICphY3Rpb24gPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBhY3Rpb24gZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgLy8gcmVxdWVzdCBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2UqICAgICAgICAgIHVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2VfLAorICAgIC8vIHJlc3BvbnNlIHBhcmFtZXRlcnM6CisgICAgdWRkaTJfX3NlcnZpY2VMaXN0KiAgICAgICAgICAgICAgICAgdWRkaTJfX3NlcnZpY2VMaXN0XworICApOworQGVuZGNvZGUKKworQysrIHByb3h5IGNsYXNzIChkZWZpbmVkIGluIHNvYXBJbnF1aXJlU29hcFByb3h5LmgpOgorICBjbGFzcyBJbnF1aXJlU29hcDsKKworKi8KKworLy9nc29hcCBpbnEyIHNlcnZpY2UgbWV0aG9kLXN0eWxlOglmaW5kX1VTQ09SRXNlcnZpY2UgZG9jdW1lbnQKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1lbmNvZGluZzoJZmluZF9VU0NPUkVzZXJ2aWNlIGxpdGVyYWwKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1hY3Rpb246CWZpbmRfVVNDT1JFc2VydmljZSBmaW5kX3NlcnZpY2UKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1mYXVsdDoJZmluZF9VU0NPUkVzZXJ2aWNlIF9kaXNwb3NpdGlvblJlcG9ydAoraW50IF9faW5xMl9fZmluZF9VU0NPUkVzZXJ2aWNlKAorICAgIHVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2UqICAgICAgICAgIHVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2VfLAorICAgIHVkZGkyX19zZXJ2aWNlTGlzdCogICAgICAgICAgICAgICAgIHVkZGkyX19zZXJ2aWNlTGlzdF8gLy8vPCByZXNwb25zZSBwYXJhbWV0ZXIKKyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBfX2lucTJfX2ZpbmRfVVNDT1JFdE1vZGVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8vLyBPcGVyYXRpb24gIl9faW5xMl9fZmluZF9VU0NPUkV0TW9kZWwiIG9mIHNlcnZpY2UgYmluZGluZyAiSW5xdWlyZVNvYXAiCisKKy8qKgorCitPcGVyYXRpb24gZGV0YWlsczoKKworICAtIFNPQVAgZG9jdW1lbnQvbGl0ZXJhbCBzdHlsZQorICAtIFNPQVAgYWN0aW9uPSJmaW5kX3RNb2RlbCIKKyAgLSBTT0FQIEZhdWx0OiBfZGlzcG9zaXRpb25SZXBvcnQKKworQyBzdHViIGZ1bmN0aW9uIChkZWZpbmVkIGluIHNvYXBDbGllbnQuY1twcF0pOgorQGNvZGUKKyAgaW50IHNvYXBfY2FsbF9fX2lucTJfX2ZpbmRfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwICpzb2FwLAorICAgIE5VTEwsIC8vIGNoYXIgKmVuZHBvaW50ID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgZW5kcG9pbnQgZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgTlVMTCwgLy8gY2hhciAqYWN0aW9uID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgYWN0aW9uIGZvciB0aGlzIG9wZXJhdGlvbgorICAgIC8vIHJlcXVlc3QgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWwqICAgICAgICAgICB1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWxfLAorICAgIC8vIHJlc3BvbnNlIHBhcmFtZXRlcnM6CisgICAgdWRkaTJfX3RNb2RlbExpc3QqICAgICAgICAgICAgICAgICAgdWRkaTJfX3RNb2RlbExpc3RfCisgICk7CitAZW5kY29kZQorCitDKysgcHJveHkgY2xhc3MgKGRlZmluZWQgaW4gc29hcElucXVpcmVTb2FwUHJveHkuaCk6CisgIGNsYXNzIElucXVpcmVTb2FwOworCisqLworCisvL2dzb2FwIGlucTIgc2VydmljZSBtZXRob2Qtc3R5bGU6CWZpbmRfVVNDT1JFdE1vZGVsIGRvY3VtZW50CisvL2dzb2FwIGlucTIgc2VydmljZSBtZXRob2QtZW5jb2Rpbmc6CWZpbmRfVVNDT1JFdE1vZGVsIGxpdGVyYWwKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1hY3Rpb246CWZpbmRfVVNDT1JFdE1vZGVsIGZpbmRfdE1vZGVsCisvL2dzb2FwIGlucTIgc2VydmljZSBtZXRob2QtZmF1bHQ6CWZpbmRfVVNDT1JFdE1vZGVsIF9kaXNwb3NpdGlvblJlcG9ydAoraW50IF9faW5xMl9fZmluZF9VU0NPUkV0TW9kZWwoCisgICAgdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsKiAgICAgICAgICAgdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsXywKKyAgICB1ZGRpMl9fdE1vZGVsTGlzdCogICAgICAgICAgICAgICAgICB1ZGRpMl9fdE1vZGVsTGlzdF8gLy8vPCByZXNwb25zZSBwYXJhbWV0ZXIKKyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBfX2lucTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8vLyBPcGVyYXRpb24gIl9faW5xMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwiIG9mIHNlcnZpY2UgYmluZGluZyAiSW5xdWlyZVNvYXAiCisKKy8qKgorCitPcGVyYXRpb24gZGV0YWlsczoKKworICAtIFNPQVAgZG9jdW1lbnQvbGl0ZXJhbCBzdHlsZQorICAtIFNPQVAgYWN0aW9uPSJnZXRfYmluZGluZ0RldGFpbCIKKyAgLSBTT0FQIEZhdWx0OiBfZGlzcG9zaXRpb25SZXBvcnQKKworQyBzdHViIGZ1bmN0aW9uIChkZWZpbmVkIGluIHNvYXBDbGllbnQuY1twcF0pOgorQGNvZGUKKyAgaW50IHNvYXBfY2FsbF9fX2lucTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsKHN0cnVjdCBzb2FwICpzb2FwLAorICAgIE5VTEwsIC8vIGNoYXIgKmVuZHBvaW50ID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgZW5kcG9pbnQgZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgTlVMTCwgLy8gY2hhciAqYWN0aW9uID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgYWN0aW9uIGZvciB0aGlzIG9wZXJhdGlvbgorICAgIC8vIHJlcXVlc3QgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwqICAgICB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWxfLAorICAgIC8vIHJlc3BvbnNlIHBhcmFtZXRlcnM6CisgICAgdWRkaTJfX2JpbmRpbmdEZXRhaWwqICAgICAgICAgICAgICAgdWRkaTJfX2JpbmRpbmdEZXRhaWxfCisgICk7CitAZW5kY29kZQorCitDKysgcHJveHkgY2xhc3MgKGRlZmluZWQgaW4gc29hcElucXVpcmVTb2FwUHJveHkuaCk6CisgIGNsYXNzIElucXVpcmVTb2FwOworCisqLworCisvL2dzb2FwIGlucTIgc2VydmljZSBtZXRob2Qtc3R5bGU6CWdldF9VU0NPUkViaW5kaW5nRGV0YWlsIGRvY3VtZW50CisvL2dzb2FwIGlucTIgc2VydmljZSBtZXRob2QtZW5jb2Rpbmc6CWdldF9VU0NPUkViaW5kaW5nRGV0YWlsIGxpdGVyYWwKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1hY3Rpb246CWdldF9VU0NPUkViaW5kaW5nRGV0YWlsIGdldF9iaW5kaW5nRGV0YWlsCisvL2dzb2FwIGlucTIgc2VydmljZSBtZXRob2QtZmF1bHQ6CWdldF9VU0NPUkViaW5kaW5nRGV0YWlsIF9kaXNwb3NpdGlvblJlcG9ydAoraW50IF9faW5xMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwoCisgICAgdWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsKiAgICAgdWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsXywKKyAgICB1ZGRpMl9fYmluZGluZ0RldGFpbCogICAgICAgICAgICAgICB1ZGRpMl9fYmluZGluZ0RldGFpbF8gLy8vPCByZXNwb25zZSBwYXJhbWV0ZXIKKyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBfX2lucTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8vLyBPcGVyYXRpb24gIl9faW5xMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsIiBvZiBzZXJ2aWNlIGJpbmRpbmcgIklucXVpcmVTb2FwIgorCisvKioKKworT3BlcmF0aW9uIGRldGFpbHM6CisKKyAgLSBTT0FQIGRvY3VtZW50L2xpdGVyYWwgc3R5bGUKKyAgLSBTT0FQIGFjdGlvbj0iZ2V0X2J1c2luZXNzRGV0YWlsIgorICAtIFNPQVAgRmF1bHQ6IF9kaXNwb3NpdGlvblJlcG9ydAorCitDIHN0dWIgZnVuY3Rpb24gKGRlZmluZWQgaW4gc29hcENsaWVudC5jW3BwXSk6CitAY29kZQorICBpbnQgc29hcF9jYWxsX19faW5xMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsKHN0cnVjdCBzb2FwICpzb2FwLAorICAgIE5VTEwsIC8vIGNoYXIgKmVuZHBvaW50ID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgZW5kcG9pbnQgZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgTlVMTCwgLy8gY2hhciAqYWN0aW9uID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgYWN0aW9uIGZvciB0aGlzIG9wZXJhdGlvbgorICAgIC8vIHJlcXVlc3QgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsKiAgICB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsXywKKyAgICAvLyByZXNwb25zZSBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX19idXNpbmVzc0RldGFpbCogICAgICAgICAgICAgIHVkZGkyX19idXNpbmVzc0RldGFpbF8KKyAgKTsKK0BlbmRjb2RlCisKK0MrKyBwcm94eSBjbGFzcyAoZGVmaW5lZCBpbiBzb2FwSW5xdWlyZVNvYXBQcm94eS5oKToKKyAgY2xhc3MgSW5xdWlyZVNvYXA7CisKKyovCisKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1zdHlsZToJZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsIGRvY3VtZW50CisvL2dzb2FwIGlucTIgc2VydmljZSBtZXRob2QtZW5jb2Rpbmc6CWdldF9VU0NPUkVidXNpbmVzc0RldGFpbCBsaXRlcmFsCisvL2dzb2FwIGlucTIgc2VydmljZSBtZXRob2QtYWN0aW9uOglnZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwgZ2V0X2J1c2luZXNzRGV0YWlsCisvL2dzb2FwIGlucTIgc2VydmljZSBtZXRob2QtZmF1bHQ6CWdldF9VU0NPUkVidXNpbmVzc0RldGFpbCBfZGlzcG9zaXRpb25SZXBvcnQKK2ludCBfX2lucTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbCgKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsKiAgICB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsXywKKyAgICB1ZGRpMl9fYnVzaW5lc3NEZXRhaWwqICAgICAgICAgICAgICB1ZGRpMl9fYnVzaW5lc3NEZXRhaWxfIC8vLzwgcmVzcG9uc2UgcGFyYW1ldGVyCispOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogX19pbnEyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvLy8gT3BlcmF0aW9uICJfX2lucTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dCIgb2Ygc2VydmljZSBiaW5kaW5nICJJbnF1aXJlU29hcCIKKworLyoqCisKK09wZXJhdGlvbiBkZXRhaWxzOgorCisgIC0gU09BUCBkb2N1bWVudC9saXRlcmFsIHN0eWxlCisgIC0gU09BUCBhY3Rpb249ImdldF9idXNpbmVzc0RldGFpbEV4dCIKKyAgLSBTT0FQIEZhdWx0OiBfZGlzcG9zaXRpb25SZXBvcnQKKworQyBzdHViIGZ1bmN0aW9uIChkZWZpbmVkIGluIHNvYXBDbGllbnQuY1twcF0pOgorQGNvZGUKKyAgaW50IHNvYXBfY2FsbF9fX2lucTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dChzdHJ1Y3Qgc29hcCAqc29hcCwKKyAgICBOVUxMLCAvLyBjaGFyICplbmRwb2ludCA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGVuZHBvaW50IGZvciB0aGlzIG9wZXJhdGlvbgorICAgIE5VTEwsIC8vIGNoYXIgKmFjdGlvbiA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGFjdGlvbiBmb3IgdGhpcyBvcGVyYXRpb24KKyAgICAvLyByZXF1ZXN0IHBhcmFtZXRlcnM6CisgICAgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dCogdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dF8sCisgICAgLy8gcmVzcG9uc2UgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHQqICAgICAgICAgICB1ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHRfCisgICk7CitAZW5kY29kZQorCitDKysgcHJveHkgY2xhc3MgKGRlZmluZWQgaW4gc29hcElucXVpcmVTb2FwUHJveHkuaCk6CisgIGNsYXNzIElucXVpcmVTb2FwOworCisqLworCisvL2dzb2FwIGlucTIgc2VydmljZSBtZXRob2Qtc3R5bGU6CWdldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dCBkb2N1bWVudAorLy9nc29hcCBpbnEyIHNlcnZpY2UgbWV0aG9kLWVuY29kaW5nOglnZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQgbGl0ZXJhbAorLy9nc29hcCBpbnEyIHNlcnZpY2UgbWV0aG9kLWFjdGlvbjoJZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0IGdldF9idXNpbmVzc0RldGFpbEV4dAorLy9nc29hcCBpbnEyIHNlcnZpY2UgbWV0aG9kLWZhdWx0OglnZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQgX2Rpc3Bvc2l0aW9uUmVwb3J0CitpbnQgX19pbnEyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQoCisgICAgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dCogdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dF8sCisgICAgdWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0KiAgICAgICAgICAgdWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0XyAvLy88IHJlc3BvbnNlIHBhcmFtZXRlcgorKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIF9faW5xMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLy8vIE9wZXJhdGlvbiAiX19pbnEyX19nZXRfVVNDT1JFc2VydmljZURldGFpbCIgb2Ygc2VydmljZSBiaW5kaW5nICJJbnF1aXJlU29hcCIKKworLyoqCisKK09wZXJhdGlvbiBkZXRhaWxzOgorCisgIC0gU09BUCBkb2N1bWVudC9saXRlcmFsIHN0eWxlCisgIC0gU09BUCBhY3Rpb249ImdldF9zZXJ2aWNlRGV0YWlsIgorICAtIFNPQVAgRmF1bHQ6IF9kaXNwb3NpdGlvblJlcG9ydAorCitDIHN0dWIgZnVuY3Rpb24gKGRlZmluZWQgaW4gc29hcENsaWVudC5jW3BwXSk6CitAY29kZQorICBpbnQgc29hcF9jYWxsX19faW5xMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwoc3RydWN0IHNvYXAgKnNvYXAsCisgICAgTlVMTCwgLy8gY2hhciAqZW5kcG9pbnQgPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBlbmRwb2ludCBmb3IgdGhpcyBvcGVyYXRpb24KKyAgICBOVUxMLCAvLyBjaGFyICphY3Rpb24gPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBhY3Rpb24gZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgLy8gcmVxdWVzdCBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbCogICAgIHVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbF8sCisgICAgLy8gcmVzcG9uc2UgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fc2VydmljZURldGFpbCogICAgICAgICAgICAgICB1ZGRpMl9fc2VydmljZURldGFpbF8KKyAgKTsKK0BlbmRjb2RlCisKK0MrKyBwcm94eSBjbGFzcyAoZGVmaW5lZCBpbiBzb2FwSW5xdWlyZVNvYXBQcm94eS5oKToKKyAgY2xhc3MgSW5xdWlyZVNvYXA7CisKKyovCisKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1zdHlsZToJZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwgZG9jdW1lbnQKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1lbmNvZGluZzoJZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwgbGl0ZXJhbAorLy9nc29hcCBpbnEyIHNlcnZpY2UgbWV0aG9kLWFjdGlvbjoJZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwgZ2V0X3NlcnZpY2VEZXRhaWwKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1mYXVsdDoJZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwgX2Rpc3Bvc2l0aW9uUmVwb3J0CitpbnQgX19pbnEyX19nZXRfVVNDT1JFc2VydmljZURldGFpbCgKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwqICAgICB1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWxfLAorICAgIHVkZGkyX19zZXJ2aWNlRGV0YWlsKiAgICAgICAgICAgICAgIHVkZGkyX19zZXJ2aWNlRGV0YWlsXyAvLy88IHJlc3BvbnNlIHBhcmFtZXRlcgorKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIF9faW5xMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLy8vIE9wZXJhdGlvbiAiX19pbnEyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsIiBvZiBzZXJ2aWNlIGJpbmRpbmcgIklucXVpcmVTb2FwIgorCisvKioKKworT3BlcmF0aW9uIGRldGFpbHM6CisKKyAgLSBTT0FQIGRvY3VtZW50L2xpdGVyYWwgc3R5bGUKKyAgLSBTT0FQIGFjdGlvbj0iZ2V0X3RNb2RlbERldGFpbCIKKyAgLSBTT0FQIEZhdWx0OiBfZGlzcG9zaXRpb25SZXBvcnQKKworQyBzdHViIGZ1bmN0aW9uIChkZWZpbmVkIGluIHNvYXBDbGllbnQuY1twcF0pOgorQGNvZGUKKyAgaW50IHNvYXBfY2FsbF9fX2lucTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwoc3RydWN0IHNvYXAgKnNvYXAsCisgICAgTlVMTCwgLy8gY2hhciAqZW5kcG9pbnQgPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBlbmRwb2ludCBmb3IgdGhpcyBvcGVyYXRpb24KKyAgICBOVUxMLCAvLyBjaGFyICphY3Rpb24gPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBhY3Rpb24gZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgLy8gcmVxdWVzdCBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsKiAgICAgIHVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsXywKKyAgICAvLyByZXNwb25zZSBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX190TW9kZWxEZXRhaWwqICAgICAgICAgICAgICAgIHVkZGkyX190TW9kZWxEZXRhaWxfCisgICk7CitAZW5kY29kZQorCitDKysgcHJveHkgY2xhc3MgKGRlZmluZWQgaW4gc29hcElucXVpcmVTb2FwUHJveHkuaCk6CisgIGNsYXNzIElucXVpcmVTb2FwOworCisqLworCisvL2dzb2FwIGlucTIgc2VydmljZSBtZXRob2Qtc3R5bGU6CWdldF9VU0NPUkV0TW9kZWxEZXRhaWwgZG9jdW1lbnQKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1lbmNvZGluZzoJZ2V0X1VTQ09SRXRNb2RlbERldGFpbCBsaXRlcmFsCisvL2dzb2FwIGlucTIgc2VydmljZSBtZXRob2QtYWN0aW9uOglnZXRfVVNDT1JFdE1vZGVsRGV0YWlsIGdldF90TW9kZWxEZXRhaWwKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1mYXVsdDoJZ2V0X1VTQ09SRXRNb2RlbERldGFpbCBfZGlzcG9zaXRpb25SZXBvcnQKK2ludCBfX2lucTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwoCisgICAgdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwqICAgICAgdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWxfLAorICAgIHVkZGkyX190TW9kZWxEZXRhaWwqICAgICAgICAgICAgICAgIHVkZGkyX190TW9kZWxEZXRhaWxfIC8vLzwgcmVzcG9uc2UgcGFyYW1ldGVyCispOworCisvKiBFbmQgb2YgaW5xdWlyZV92Mi5oICovCmRpZmYgLS1naXQgYS91ZGRpMi9pbnF1aXJlX3YyLndzZGwgYi91ZGRpMi9pbnF1aXJlX3YyLndzZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlhYmUxYgotLS0gL2Rldi9udWxsCisrKyBiL3VkZGkyL2lucXVpcmVfdjIud3NkbApAQCAtMCwwICsxLDI2MSBAQAorPGRlZmluaXRpb25zIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6dG5zPSJ1cm46dWRkaS1vcmc6aW5xdWlyeV92MiIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgeG1sbnM6dWRkaT0idXJuOnVkZGktb3JnOmFwaV92MiIgdGFyZ2V0TmFtZXNwYWNlPSJ1cm46dWRkaS1vcmc6aW5xdWlyeV92MiIgbmFtZT0iVURESV9JbnF1aXJ5X0FQSV9WMiI+CisJPGRvY3VtZW50YXRpb24+CisJCUNvcHlyaWdodCAoYykgMjAwMCAtIDIwMDIgYnkgQWNjZW50dXJlLCBBcmliYSwgSW5jLiwgQ29tbWVyY2UgT25lLCBJbmMuIAorCQlGdWppdHN1IExpbWl0ZWQsIEhld2xldHQtUGFja2FyZCBDb21wYW55LCBpMiBUZWNobm9sb2dpZXMsIEluYy4sIAorCQlJbnRlbCBDb3Jwb3JhdGlvbiwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiwgIAorCQlNaWNyb3NvZnQgQ29ycG9yYXRpb24sIE9yYWNsZSBDb3Jwb3JhdGlvbiwgU0FQIEFHLCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCAKKwkJYW5kIFZlcmlTaWduLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCQkKKwkJV1NETCBTZXJ2aWNlIEludGVyZmFjZSBmb3IgVURESSBJbnF1aXJ5IEFQSSBWMi4wICAgIAorCQkKKwkJVGhpcyBXU0RMIGRvY3VtZW50IGRlZmluZXMgdGhlIGlucXVpcnkgQVBJIGNhbGxzIGZvciBpbnRlcmFjdGluZyB3aXRoIAorCQl0aGUgVURESSByZWdpc3RyeS4gIFRoZSBjb21wbGV0ZSBVRERJIEFQSSBzcGVjaWZpY2F0aW9uIGlzIGF2YWlsYWJsZQorCQlhdCBodHRwOi8vd3d3LnVkZGkub3JnL3NwZWNpZmljYXRpb24uaHRtbC4KKwk8L2RvY3VtZW50YXRpb24+CisJPHR5cGVzPgorCQk8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9InVybjp1ZGRpLW9yZzppbnF1aXJ5X3YyIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KKwkJCTx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0idXJuOnVkZGktb3JnOmFwaV92MiIgc2NoZW1hTG9jYXRpb249InVkZGlfdjIueHNkIi8+CisJCTwveHNkOnNjaGVtYT4KKwk8L3R5cGVzPgorCTxtZXNzYWdlIG5hbWU9ImJpbmRpbmdEZXRhaWwiPgorCQk8cGFydCBuYW1lPSJib2R5IiBlbGVtZW50PSJ1ZGRpOmJpbmRpbmdEZXRhaWwiLz4KKwk8L21lc3NhZ2U+CisJPG1lc3NhZ2UgbmFtZT0iYnVzaW5lc3NEZXRhaWwiPgorCQk8cGFydCBuYW1lPSJib2R5IiBlbGVtZW50PSJ1ZGRpOmJ1c2luZXNzRGV0YWlsIi8+CisJPC9tZXNzYWdlPgorCTxtZXNzYWdlIG5hbWU9ImJ1c2luZXNzRGV0YWlsRXh0Ij4KKwkJPHBhcnQgbmFtZT0iYm9keSIgZWxlbWVudD0idWRkaTpidXNpbmVzc0RldGFpbEV4dCIvPgorCTwvbWVzc2FnZT4KKwk8bWVzc2FnZSBuYW1lPSJidXNpbmVzc0xpc3QiPgorCQk8cGFydCBuYW1lPSJib2R5IiBlbGVtZW50PSJ1ZGRpOmJ1c2luZXNzTGlzdCIvPgorCTwvbWVzc2FnZT4KKwk8bWVzc2FnZSBuYW1lPSJkaXNwb3NpdGlvblJlcG9ydCI+CisJCTxwYXJ0IG5hbWU9ImJvZHkiIGVsZW1lbnQ9InVkZGk6ZGlzcG9zaXRpb25SZXBvcnQiLz4KKwk8L21lc3NhZ2U+CisJPG1lc3NhZ2UgbmFtZT0iZmluZF9iaW5kaW5nIj4KKwkJPHBhcnQgbmFtZT0iYm9keSIgZWxlbWVudD0idWRkaTpmaW5kX2JpbmRpbmciLz4KKwk8L21lc3NhZ2U+CisJPG1lc3NhZ2UgbmFtZT0iZmluZF9idXNpbmVzcyI+CisJCTxwYXJ0IG5hbWU9ImJvZHkiIGVsZW1lbnQ9InVkZGk6ZmluZF9idXNpbmVzcyIvPgorCTwvbWVzc2FnZT4KKwk8bWVzc2FnZSBuYW1lPSJmaW5kX3JlbGF0ZWRCdXNpbmVzc2VzIj4KKwkJPHBhcnQgbmFtZT0iYm9keSIgZWxlbWVudD0idWRkaTpmaW5kX3JlbGF0ZWRCdXNpbmVzc2VzIi8+CisJPC9tZXNzYWdlPgorCTxtZXNzYWdlIG5hbWU9ImZpbmRfc2VydmljZSI+CisJCTxwYXJ0IG5hbWU9ImJvZHkiIGVsZW1lbnQ9InVkZGk6ZmluZF9zZXJ2aWNlIi8+CisJPC9tZXNzYWdlPgorCTxtZXNzYWdlIG5hbWU9ImZpbmRfdE1vZGVsIj4KKwkJPHBhcnQgbmFtZT0iYm9keSIgZWxlbWVudD0idWRkaTpmaW5kX3RNb2RlbCIvPgorCTwvbWVzc2FnZT4KKwk8bWVzc2FnZSBuYW1lPSJnZXRfYmluZGluZ0RldGFpbCI+CisJCTxwYXJ0IG5hbWU9ImJvZHkiIGVsZW1lbnQ9InVkZGk6Z2V0X2JpbmRpbmdEZXRhaWwiLz4KKwk8L21lc3NhZ2U+CisJPG1lc3NhZ2UgbmFtZT0iZ2V0X2J1c2luZXNzRGV0YWlsIj4KKwkJPHBhcnQgbmFtZT0iYm9keSIgZWxlbWVudD0idWRkaTpnZXRfYnVzaW5lc3NEZXRhaWwiLz4KKwk8L21lc3NhZ2U+CisJPG1lc3NhZ2UgbmFtZT0iZ2V0X2J1c2luZXNzRGV0YWlsRXh0Ij4KKwkJPHBhcnQgbmFtZT0iYm9keSIgZWxlbWVudD0idWRkaTpnZXRfYnVzaW5lc3NEZXRhaWxFeHQiLz4KKwk8L21lc3NhZ2U+CisJPG1lc3NhZ2UgbmFtZT0iZ2V0X3NlcnZpY2VEZXRhaWwiPgorCQk8cGFydCBuYW1lPSJib2R5IiBlbGVtZW50PSJ1ZGRpOmdldF9zZXJ2aWNlRGV0YWlsIi8+CisJPC9tZXNzYWdlPgorCTxtZXNzYWdlIG5hbWU9ImdldF90TW9kZWxEZXRhaWwiPgorCQk8cGFydCBuYW1lPSJib2R5IiBlbGVtZW50PSJ1ZGRpOmdldF90TW9kZWxEZXRhaWwiLz4KKwk8L21lc3NhZ2U+CisJPG1lc3NhZ2UgbmFtZT0icmVsYXRlZEJ1c2luZXNzZXNMaXN0Ij4KKwkJPHBhcnQgbmFtZT0iYm9keSIgZWxlbWVudD0idWRkaTpyZWxhdGVkQnVzaW5lc3Nlc0xpc3QiLz4KKwk8L21lc3NhZ2U+CisJPG1lc3NhZ2UgbmFtZT0ic2VydmljZURldGFpbCI+CisJCTxwYXJ0IG5hbWU9ImJvZHkiIGVsZW1lbnQ9InVkZGk6c2VydmljZURldGFpbCIvPgorCTwvbWVzc2FnZT4KKwk8bWVzc2FnZSBuYW1lPSJzZXJ2aWNlTGlzdCI+CisJCTxwYXJ0IG5hbWU9ImJvZHkiIGVsZW1lbnQ9InVkZGk6c2VydmljZUxpc3QiLz4KKwk8L21lc3NhZ2U+CisJPG1lc3NhZ2UgbmFtZT0idE1vZGVsRGV0YWlsIj4KKwkJPHBhcnQgbmFtZT0iYm9keSIgZWxlbWVudD0idWRkaTp0TW9kZWxEZXRhaWwiLz4KKwk8L21lc3NhZ2U+CisJPG1lc3NhZ2UgbmFtZT0idE1vZGVsTGlzdCI+CisJCTxwYXJ0IG5hbWU9ImJvZHkiIGVsZW1lbnQ9InVkZGk6dE1vZGVsTGlzdCIvPgorCTwvbWVzc2FnZT4KKwk8cG9ydFR5cGUgbmFtZT0iSW5xdWlyZSI+CisJCTxkb2N1bWVudGF0aW9uPgorCQkJVGhpcyBwb3J0VHlwZSBkZWZpbmVzIGFsbCBvZiB0aGUgVURESSBpbnF1aXJ5IG9wZXJhdGlvbnMuCisJICA8L2RvY3VtZW50YXRpb24+CisJCTxvcGVyYXRpb24gbmFtZT0iZmluZF9iaW5kaW5nIj4KKwkJCTxpbnB1dCBtZXNzYWdlPSJ0bnM6ZmluZF9iaW5kaW5nIi8+CisJCQk8b3V0cHV0IG1lc3NhZ2U9InRuczpiaW5kaW5nRGV0YWlsIi8+CisJCQk8ZmF1bHQgbmFtZT0iZXJyb3IiIG1lc3NhZ2U9InRuczpkaXNwb3NpdGlvblJlcG9ydCIvPgorCQk8L29wZXJhdGlvbj4KKwkJPG9wZXJhdGlvbiBuYW1lPSJmaW5kX2J1c2luZXNzIj4KKwkJCTxpbnB1dCBtZXNzYWdlPSJ0bnM6ZmluZF9idXNpbmVzcyIvPgorCQkJPG91dHB1dCBtZXNzYWdlPSJ0bnM6YnVzaW5lc3NMaXN0Ii8+CisJCQk8ZmF1bHQgbmFtZT0iZXJyb3IiIG1lc3NhZ2U9InRuczpkaXNwb3NpdGlvblJlcG9ydCIvPgorCQk8L29wZXJhdGlvbj4KKwkJPG9wZXJhdGlvbiBuYW1lPSJmaW5kX3JlbGF0ZWRCdXNpbmVzc2VzIj4KKwkJCTxpbnB1dCBtZXNzYWdlPSJ0bnM6ZmluZF9yZWxhdGVkQnVzaW5lc3NlcyIvPgorCQkJPG91dHB1dCBtZXNzYWdlPSJ0bnM6cmVsYXRlZEJ1c2luZXNzZXNMaXN0Ii8+CisJCQk8ZmF1bHQgbmFtZT0iZXJyb3IiIG1lc3NhZ2U9InRuczpkaXNwb3NpdGlvblJlcG9ydCIvPgorCQk8L29wZXJhdGlvbj4KKwkJPG9wZXJhdGlvbiBuYW1lPSJmaW5kX3NlcnZpY2UiPgorCQkJPGlucHV0IG1lc3NhZ2U9InRuczpmaW5kX3NlcnZpY2UiLz4KKwkJCTxvdXRwdXQgbWVzc2FnZT0idG5zOnNlcnZpY2VMaXN0Ii8+CisJCQk8ZmF1bHQgbmFtZT0iZXJyb3IiIG1lc3NhZ2U9InRuczpkaXNwb3NpdGlvblJlcG9ydCIvPgorCQk8L29wZXJhdGlvbj4KKwkJPG9wZXJhdGlvbiBuYW1lPSJmaW5kX3RNb2RlbCI+CisJCQk8aW5wdXQgbWVzc2FnZT0idG5zOmZpbmRfdE1vZGVsIi8+CisJCQk8b3V0cHV0IG1lc3NhZ2U9InRuczp0TW9kZWxMaXN0Ii8+CisJCQk8ZmF1bHQgbmFtZT0iZXJyb3IiIG1lc3NhZ2U9InRuczpkaXNwb3NpdGlvblJlcG9ydCIvPgorCQk8L29wZXJhdGlvbj4KKwkJPG9wZXJhdGlvbiBuYW1lPSJnZXRfYmluZGluZ0RldGFpbCI+CisJCQk8aW5wdXQgbWVzc2FnZT0idG5zOmdldF9iaW5kaW5nRGV0YWlsIi8+CisJCQk8b3V0cHV0IG1lc3NhZ2U9InRuczpiaW5kaW5nRGV0YWlsIi8+CisJCQk8ZmF1bHQgbmFtZT0iZXJyb3IiIG1lc3NhZ2U9InRuczpkaXNwb3NpdGlvblJlcG9ydCIvPgorCQk8L29wZXJhdGlvbj4KKwkJPG9wZXJhdGlvbiBuYW1lPSJnZXRfYnVzaW5lc3NEZXRhaWwiPgorCQkJPGlucHV0IG1lc3NhZ2U9InRuczpnZXRfYnVzaW5lc3NEZXRhaWwiLz4KKwkJCTxvdXRwdXQgbWVzc2FnZT0idG5zOmJ1c2luZXNzRGV0YWlsIi8+CisJCQk8ZmF1bHQgbmFtZT0iZXJyb3IiIG1lc3NhZ2U9InRuczpkaXNwb3NpdGlvblJlcG9ydCIvPgorCQk8L29wZXJhdGlvbj4KKwkJPG9wZXJhdGlvbiBuYW1lPSJnZXRfYnVzaW5lc3NEZXRhaWxFeHQiPgorCQkJPGlucHV0IG1lc3NhZ2U9InRuczpnZXRfYnVzaW5lc3NEZXRhaWxFeHQiLz4KKwkJCTxvdXRwdXQgbWVzc2FnZT0idG5zOmJ1c2luZXNzRGV0YWlsRXh0Ii8+CisJCQk8ZmF1bHQgbmFtZT0iZXJyb3IiIG1lc3NhZ2U9InRuczpkaXNwb3NpdGlvblJlcG9ydCIvPgorCQk8L29wZXJhdGlvbj4KKwkJPG9wZXJhdGlvbiBuYW1lPSJnZXRfc2VydmljZURldGFpbCI+CisJCQk8aW5wdXQgbWVzc2FnZT0idG5zOmdldF9zZXJ2aWNlRGV0YWlsIi8+CisJCQk8b3V0cHV0IG1lc3NhZ2U9InRuczpzZXJ2aWNlRGV0YWlsIi8+CisJCQk8ZmF1bHQgbmFtZT0iZXJyb3IiIG1lc3NhZ2U9InRuczpkaXNwb3NpdGlvblJlcG9ydCIvPgorCQk8L29wZXJhdGlvbj4KKwkJPG9wZXJhdGlvbiBuYW1lPSJnZXRfdE1vZGVsRGV0YWlsIj4KKwkJCTxpbnB1dCBtZXNzYWdlPSJ0bnM6Z2V0X3RNb2RlbERldGFpbCIvPgorCQkJPG91dHB1dCBtZXNzYWdlPSJ0bnM6dE1vZGVsRGV0YWlsIi8+CisJCQk8ZmF1bHQgbmFtZT0iZXJyb3IiIG1lc3NhZ2U9InRuczpkaXNwb3NpdGlvblJlcG9ydCIvPgorCQk8L29wZXJhdGlvbj4KKwk8L3BvcnRUeXBlPgorCTxiaW5kaW5nIG5hbWU9IklucXVpcmVTb2FwIiB0eXBlPSJ0bnM6SW5xdWlyZSI+CisJCTxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgorCQk8ZG9jdW1lbnRhdGlvbj4KKwkJICBUaGlzIGlzIHRoZSBTT0FQIGJpbmRpbmcgZm9yIHRoZSBVRERJIGlucXVpcnkgb3BlcmF0aW9ucy4KKwkJPC9kb2N1bWVudGF0aW9uPgorCQk8b3BlcmF0aW9uIG5hbWU9ImZpbmRfYmluZGluZyI+CisJCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZmluZF9iaW5kaW5nIiBzdHlsZT0iZG9jdW1lbnQiLz4KKwkJCTxpbnB1dD4KKwkJCQk8c29hcDpib2R5IHBhcnRzPSJib2R5IiB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0idXJuOnVkZGktb3JnOmFwaV92MiIvPgorCQkJPC9pbnB1dD4KKwkJCTxvdXRwdXQ+CisJCQkJPHNvYXA6Ym9keSBwYXJ0cz0iYm9keSIgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9InVybjp1ZGRpLW9yZzphcGlfdjIiLz4KKwkJCTwvb3V0cHV0PgorCQkJPGZhdWx0IG5hbWU9ImVycm9yIj4KKwkJCQk8c29hcDpmYXVsdCBuYW1lPSJlcnJvciIgdXNlPSJsaXRlcmFsIi8+CisJCQk8L2ZhdWx0PgorCQk8L29wZXJhdGlvbj4KKwkJPG9wZXJhdGlvbiBuYW1lPSJmaW5kX2J1c2luZXNzIj4KKwkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJmaW5kX2J1c2luZXNzIiBzdHlsZT0iZG9jdW1lbnQiLz4KKwkJCTxpbnB1dD4KKwkJCQk8c29hcDpib2R5IHBhcnRzPSJib2R5IiB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0idXJuOnVkZGktb3JnOmFwaV92MiIvPgorCQkJPC9pbnB1dD4KKwkJCTxvdXRwdXQ+CisJCQkJPHNvYXA6Ym9keSBwYXJ0cz0iYm9keSIgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9InVybjp1ZGRpLW9yZzphcGlfdjIiLz4KKwkJCTwvb3V0cHV0PgorCQkJPGZhdWx0IG5hbWU9ImVycm9yIj4KKwkJCQk8c29hcDpmYXVsdCBuYW1lPSJlcnJvciIgdXNlPSJsaXRlcmFsIi8+CisJCQk8L2ZhdWx0PgorCQk8L29wZXJhdGlvbj4KKwkJPG9wZXJhdGlvbiBuYW1lPSJmaW5kX3JlbGF0ZWRCdXNpbmVzc2VzIj4KKwkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJmaW5kX3JlbGF0ZWRCdXNpbmVzc2VzIiBzdHlsZT0iZG9jdW1lbnQiLz4KKwkJCTxpbnB1dD4KKwkJCQk8c29hcDpib2R5IHBhcnRzPSJib2R5IiB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0idXJuOnVkZGktb3JnOmFwaV92MiIvPgorCQkJPC9pbnB1dD4KKwkJCTxvdXRwdXQ+CisJCQkJPHNvYXA6Ym9keSBwYXJ0cz0iYm9keSIgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9InVybjp1ZGRpLW9yZzphcGlfdjIiLz4KKwkJCTwvb3V0cHV0PgorCQkJPGZhdWx0IG5hbWU9ImVycm9yIj4KKwkJCQk8c29hcDpmYXVsdCBuYW1lPSJlcnJvciIgdXNlPSJsaXRlcmFsIi8+CisJCQk8L2ZhdWx0PgorCQk8L29wZXJhdGlvbj4KKwkJPG9wZXJhdGlvbiBuYW1lPSJmaW5kX3NlcnZpY2UiPgorCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImZpbmRfc2VydmljZSIgc3R5bGU9ImRvY3VtZW50Ii8+CisJCQk8aW5wdXQ+CisJCQkJPHNvYXA6Ym9keSBwYXJ0cz0iYm9keSIgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9InVybjp1ZGRpLW9yZzphcGlfdjIiLz4KKwkJCTwvaW5wdXQ+CisJCQk8b3V0cHV0PgorCQkJCTxzb2FwOmJvZHkgcGFydHM9ImJvZHkiIHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJ1cm46dWRkaS1vcmc6YXBpX3YyIi8+CisJCQk8L291dHB1dD4KKwkJCTxmYXVsdCBuYW1lPSJlcnJvciI+CisJCQkJPHNvYXA6ZmF1bHQgbmFtZT0iZXJyb3IiIHVzZT0ibGl0ZXJhbCIvPgorCQkJPC9mYXVsdD4KKwkJPC9vcGVyYXRpb24+CisJCTxvcGVyYXRpb24gbmFtZT0iZmluZF90TW9kZWwiPgorCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImZpbmRfdE1vZGVsIiBzdHlsZT0iZG9jdW1lbnQiLz4KKwkJCTxpbnB1dD4KKwkJCQk8c29hcDpib2R5IHBhcnRzPSJib2R5IiB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0idXJuOnVkZGktb3JnOmFwaV92MiIvPgorCQkJPC9pbnB1dD4KKwkJCTxvdXRwdXQ+CisJCQkJPHNvYXA6Ym9keSBwYXJ0cz0iYm9keSIgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9InVybjp1ZGRpLW9yZzphcGlfdjIiLz4KKwkJCTwvb3V0cHV0PgorCQkJPGZhdWx0IG5hbWU9ImVycm9yIj4KKwkJCQk8c29hcDpmYXVsdCBuYW1lPSJlcnJvciIgdXNlPSJsaXRlcmFsIi8+CisJCQk8L2ZhdWx0PgorCQk8L29wZXJhdGlvbj4KKwkJPG9wZXJhdGlvbiBuYW1lPSJnZXRfYmluZGluZ0RldGFpbCI+CisJCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZ2V0X2JpbmRpbmdEZXRhaWwiIHN0eWxlPSJkb2N1bWVudCIvPgorCQkJPGlucHV0PgorCQkJCTxzb2FwOmJvZHkgcGFydHM9ImJvZHkiIHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJ1cm46dWRkaS1vcmc6YXBpX3YyIi8+CisJCQk8L2lucHV0PgorCQkJPG91dHB1dD4KKwkJCQk8c29hcDpib2R5IHBhcnRzPSJib2R5IiB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0idXJuOnVkZGktb3JnOmFwaV92MiIvPgorCQkJPC9vdXRwdXQ+CisJCQk8ZmF1bHQgbmFtZT0iZXJyb3IiPgorCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImVycm9yIiB1c2U9ImxpdGVyYWwiLz4KKwkJCTwvZmF1bHQ+CisJCTwvb3BlcmF0aW9uPgorCQk8b3BlcmF0aW9uIG5hbWU9ImdldF9idXNpbmVzc0RldGFpbCI+CisJCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZ2V0X2J1c2luZXNzRGV0YWlsIiBzdHlsZT0iZG9jdW1lbnQiLz4KKwkJCTxpbnB1dD4KKwkJCQk8c29hcDpib2R5IHBhcnRzPSJib2R5IiB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0idXJuOnVkZGktb3JnOmFwaV92MiIvPgorCQkJPC9pbnB1dD4KKwkJCTxvdXRwdXQ+CisJCQkJPHNvYXA6Ym9keSBwYXJ0cz0iYm9keSIgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9InVybjp1ZGRpLW9yZzphcGlfdjIiLz4KKwkJCTwvb3V0cHV0PgorCQkJPGZhdWx0IG5hbWU9ImVycm9yIj4KKwkJCQk8c29hcDpmYXVsdCBuYW1lPSJlcnJvciIgdXNlPSJsaXRlcmFsIi8+CisJCQk8L2ZhdWx0PgorCQk8L29wZXJhdGlvbj4KKwkJPG9wZXJhdGlvbiBuYW1lPSJnZXRfYnVzaW5lc3NEZXRhaWxFeHQiPgorCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImdldF9idXNpbmVzc0RldGFpbEV4dCIgc3R5bGU9ImRvY3VtZW50Ii8+CisJCQk8aW5wdXQ+CisJCQkJPHNvYXA6Ym9keSBwYXJ0cz0iYm9keSIgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9InVybjp1ZGRpLW9yZzphcGlfdjIiLz4KKwkJCTwvaW5wdXQ+CisJCQk8b3V0cHV0PgorCQkJCTxzb2FwOmJvZHkgcGFydHM9ImJvZHkiIHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJ1cm46dWRkaS1vcmc6YXBpX3YyIi8+CisJCQk8L291dHB1dD4KKwkJCTxmYXVsdCBuYW1lPSJlcnJvciI+CisJCQkJPHNvYXA6ZmF1bHQgbmFtZT0iZXJyb3IiIHVzZT0ibGl0ZXJhbCIvPgorCQkJPC9mYXVsdD4KKwkJPC9vcGVyYXRpb24+CisJCTxvcGVyYXRpb24gbmFtZT0iZ2V0X3NlcnZpY2VEZXRhaWwiPgorCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImdldF9zZXJ2aWNlRGV0YWlsIiBzdHlsZT0iZG9jdW1lbnQiLz4KKwkJCTxpbnB1dD4KKwkJCQk8c29hcDpib2R5IHBhcnRzPSJib2R5IiB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0idXJuOnVkZGktb3JnOmFwaV92MiIvPgorCQkJPC9pbnB1dD4KKwkJCTxvdXRwdXQ+CisJCQkJPHNvYXA6Ym9keSBwYXJ0cz0iYm9keSIgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9InVybjp1ZGRpLW9yZzphcGlfdjIiLz4KKwkJCTwvb3V0cHV0PgorCQkJPGZhdWx0IG5hbWU9ImVycm9yIj4KKwkJCQk8c29hcDpmYXVsdCBuYW1lPSJlcnJvciIgdXNlPSJsaXRlcmFsIi8+CisJCQk8L2ZhdWx0PgorCQk8L29wZXJhdGlvbj4KKwkJPG9wZXJhdGlvbiBuYW1lPSJnZXRfdE1vZGVsRGV0YWlsIj4KKwkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJnZXRfdE1vZGVsRGV0YWlsIiBzdHlsZT0iZG9jdW1lbnQiLz4KKwkJCTxpbnB1dD4KKwkJCQk8c29hcDpib2R5IHBhcnRzPSJib2R5IiB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0idXJuOnVkZGktb3JnOmFwaV92MiIvPgorCQkJPC9pbnB1dD4KKwkJCTxvdXRwdXQ+CisJCQkJPHNvYXA6Ym9keSBwYXJ0cz0iYm9keSIgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9InVybjp1ZGRpLW9yZzphcGlfdjIiLz4KKwkJCTwvb3V0cHV0PgorCQkJPGZhdWx0IG5hbWU9ImVycm9yIj4KKwkJCQk8c29hcDpmYXVsdCBuYW1lPSJlcnJvciIgdXNlPSJsaXRlcmFsIi8+CisJCQk8L2ZhdWx0PgorCQk8L29wZXJhdGlvbj4KKwk8L2JpbmRpbmc+Cis8L2RlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdWRkaTIvcHViSC5oIGIvdWRkaTIvcHViSC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YjBiZjMKLS0tIC9kZXYvbnVsbAorKysgYi91ZGRpMi9wdWJILmgKQEAgLTAsMCArMSwyNzI3IEBACisvKiBwdWJILmgKKyAgIEdlbmVyYXRlZCBieSBnU09BUCAyLjcuMSBmcm9tIHB1Ymxpc2hfdjIuaAorICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICBUaGlzIHBhcnQgb2YgdGhlIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2VzOgorICAgR1BMLCB0aGUgZ1NPQVAgcHVibGljIGxpY2Vuc2UsIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKyovCisjaWZuZGVmIHB1YkhfSAorI2RlZmluZSBwdWJIX0gKKyNpbmNsdWRlICJwdWJTdHViLmgiCisKK1NPQVBfQkVHSU5fTkFNRVNQQUNFKHB1YikKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9pZ25vcmVfZWxlbWVudChzdHJ1Y3Qgc29hcCopOworI2lmbmRlZiBXSVRIX05PSURSRUYKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRpbmRlcGVuZGVudChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX2dldGluZGVwZW5kZW50KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX21hcmtlbGVtZW50KHN0cnVjdCBzb2FwKiwgY29uc3Qgdm9pZCosIGludCk7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0ZWxlbWVudChzdHJ1Y3Qgc29hcCosIGNvbnN0IHZvaWQqLCBjb25zdCBjaGFyKiwgaW50LCBpbnQpOworU09BUF9GTUFDMyB2b2lkICogU09BUF9GTUFDNCBzb2FwX2dldGVsZW1lbnQoc3RydWN0IHNvYXAqLCBpbnQqKTsKKyNlbmRpZgorU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3Jlc29sdmVfYXR0YWNobWVudHMoc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMyB2b2lkICogU09BUF9GTUFDNCBzb2FwX2luc3RhbnRpYXRlKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2ZkZWxldGUoc3RydWN0IHNvYXBfY2xpc3QqKTsKKworU09BUF9GTUFDMyB2b2lkKiBTT0FQX0ZNQUM0IHNvYXBfY2xhc3NfaWRfZW50ZXIoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdm9pZCosIGludCwgc2l6ZV90LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUMzIHZvaWQqIFNPQVBfRk1BQzQgc29hcF9jb250YWluZXJfaWRfZm9yd2FyZChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB2b2lkKiwgaW50LCBpbnQsIHNpemVfdCwgdW5zaWduZWQgaW50KTsKKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9jb250YWluZXJfaW5zZXJ0KHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfYnl0ZQorI2RlZmluZSBTT0FQX1RZUEVfYnl0ZSAoMikKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X2J5dGUoc3RydWN0IHNvYXAqLCBjaGFyICopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9ieXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9ieXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGNoYXIgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X2J5dGUoc3RydWN0IHNvYXAqLCBjaGFyICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGNoYXIgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fYnl0ZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjaGFyICosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfaW50CisjZGVmaW5lIFNPQVBfVFlQRV9pbnQgKDEpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9pbnQoc3RydWN0IHNvYXAqLCBpbnQgKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X2ludChzdHJ1Y3Qgc29hcCosIGNvbnN0IGludCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9pbnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBpbnQgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X2ludChzdHJ1Y3Qgc29hcCosIGludCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgKiBTT0FQX0ZNQUM0IHNvYXBfaW5faW50KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCAqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19rZXlUeXBlCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fa2V5VHlwZSAoOTkpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF91ZGRpMl9fa2V5VHlwZShzdHJ1Y3Qgc29hcCosIGVudW0gdWRkaTJfX2tleVR5cGUgKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X3VkZGkyX19rZXlUeXBlKHN0cnVjdCBzb2FwKiwgY29uc3QgZW51bSB1ZGRpMl9fa2V5VHlwZSAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fa2V5VHlwZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IGVudW0gdWRkaTJfX2tleVR5cGUgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUMzUyBjb25zdCBjaGFyKiBTT0FQX0ZNQUM0UyBzb2FwX3VkZGkyX19rZXlUeXBlMnMoc3RydWN0IHNvYXAqLCBlbnVtIHVkZGkyX19rZXlUeXBlKTsKK1NPQVBfRk1BQzMgZW51bSB1ZGRpMl9fa2V5VHlwZSAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2tleVR5cGUoc3RydWN0IHNvYXAqLCBlbnVtIHVkZGkyX19rZXlUeXBlICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGVudW0gdWRkaTJfX2tleVR5cGUgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2tleVR5cGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgZW51bSB1ZGRpMl9fa2V5VHlwZSAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzNTIGludCBTT0FQX0ZNQUM0UyBzb2FwX3MydWRkaTJfX2tleVR5cGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgZW51bSB1ZGRpMl9fa2V5VHlwZSAqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX1VSTFR5cGUKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19VUkxUeXBlICg5OCkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X3VkZGkyX19VUkxUeXBlKHN0cnVjdCBzb2FwKiwgZW51bSB1ZGRpMl9fVVJMVHlwZSAqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfdWRkaTJfX1VSTFR5cGUoc3RydWN0IHNvYXAqLCBjb25zdCBlbnVtIHVkZGkyX19VUkxUeXBlICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19VUkxUeXBlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgZW51bSB1ZGRpMl9fVVJMVHlwZSAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzNTIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzRTIHNvYXBfdWRkaTJfX1VSTFR5cGUycyhzdHJ1Y3Qgc29hcCosIGVudW0gdWRkaTJfX1VSTFR5cGUpOworU09BUF9GTUFDMyBlbnVtIHVkZGkyX19VUkxUeXBlICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fVVJMVHlwZShzdHJ1Y3Qgc29hcCosIGVudW0gdWRkaTJfX1VSTFR5cGUgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgZW51bSB1ZGRpMl9fVVJMVHlwZSAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fVVJMVHlwZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBlbnVtIHVkZGkyX19VUkxUeXBlICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDM1MgaW50IFNPQVBfRk1BQzRTIHNvYXBfczJ1ZGRpMl9fVVJMVHlwZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBlbnVtIHVkZGkyX19VUkxUeXBlICopOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fdHJ1bmNhdGVkCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fdHJ1bmNhdGVkICg5NykKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X3VkZGkyX190cnVuY2F0ZWQoc3RydWN0IHNvYXAqLCBlbnVtIHVkZGkyX190cnVuY2F0ZWQgKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X3VkZGkyX190cnVuY2F0ZWQoc3RydWN0IHNvYXAqLCBjb25zdCBlbnVtIHVkZGkyX190cnVuY2F0ZWQgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX3RydW5jYXRlZChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IGVudW0gdWRkaTJfX3RydW5jYXRlZCAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzNTIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzRTIHNvYXBfdWRkaTJfX3RydW5jYXRlZDJzKHN0cnVjdCBzb2FwKiwgZW51bSB1ZGRpMl9fdHJ1bmNhdGVkKTsKK1NPQVBfRk1BQzMgZW51bSB1ZGRpMl9fdHJ1bmNhdGVkICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fdHJ1bmNhdGVkKHN0cnVjdCBzb2FwKiwgZW51bSB1ZGRpMl9fdHJ1bmNhdGVkICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGVudW0gdWRkaTJfX3RydW5jYXRlZCAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fdHJ1bmNhdGVkKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGVudW0gdWRkaTJfX3RydW5jYXRlZCAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzNTIGludCBTT0FQX0ZNQUM0UyBzb2FwX3MydWRkaTJfX3RydW5jYXRlZChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBlbnVtIHVkZGkyX190cnVuY2F0ZWQgKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19kaXJlY3Rpb24KKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19kaXJlY3Rpb24gKDk2KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfdWRkaTJfX2RpcmVjdGlvbihzdHJ1Y3Qgc29hcCosIGVudW0gdWRkaTJfX2RpcmVjdGlvbiAqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfdWRkaTJfX2RpcmVjdGlvbihzdHJ1Y3Qgc29hcCosIGNvbnN0IGVudW0gdWRkaTJfX2RpcmVjdGlvbiAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fZGlyZWN0aW9uKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgZW51bSB1ZGRpMl9fZGlyZWN0aW9uICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDM1MgY29uc3QgY2hhciogU09BUF9GTUFDNFMgc29hcF91ZGRpMl9fZGlyZWN0aW9uMnMoc3RydWN0IHNvYXAqLCBlbnVtIHVkZGkyX19kaXJlY3Rpb24pOworU09BUF9GTUFDMyBlbnVtIHVkZGkyX19kaXJlY3Rpb24gKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19kaXJlY3Rpb24oc3RydWN0IHNvYXAqLCBlbnVtIHVkZGkyX19kaXJlY3Rpb24gKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgZW51bSB1ZGRpMl9fZGlyZWN0aW9uICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19kaXJlY3Rpb24oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgZW51bSB1ZGRpMl9fZGlyZWN0aW9uICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDM1MgaW50IFNPQVBfRk1BQzRTIHNvYXBfczJ1ZGRpMl9fZGlyZWN0aW9uKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGVudW0gdWRkaTJfX2RpcmVjdGlvbiAqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfX2Rpc3Bvc2l0aW9uUmVwb3J0CisjZGVmaW5lIFNPQVBfVFlQRV9fZGlzcG9zaXRpb25SZXBvcnQgKDMwNikKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X19kaXNwb3NpdGlvblJlcG9ydChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IF9kaXNwb3NpdGlvblJlcG9ydCAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIF9kaXNwb3NpdGlvblJlcG9ydCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfX2Rpc3Bvc2l0aW9uUmVwb3J0KHN0cnVjdCBzb2FwKiwgX2Rpc3Bvc2l0aW9uUmVwb3J0ICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIF9kaXNwb3NpdGlvblJlcG9ydCAqIFNPQVBfRk1BQzQgc29hcF9pbl9fZGlzcG9zaXRpb25SZXBvcnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgX2Rpc3Bvc2l0aW9uUmVwb3J0ICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSBfZGlzcG9zaXRpb25SZXBvcnQgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X19kaXNwb3NpdGlvblJlcG9ydChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX19kaXNwb3NpdGlvblJlcG9ydChzdHJ1Y3Qgc29hcCosIF9kaXNwb3NpdGlvblJlcG9ydCopOworU09BUF9GTUFDNSBfZGlzcG9zaXRpb25SZXBvcnQgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfX2Rpc3Bvc2l0aW9uUmVwb3J0KHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X19kaXNwb3NpdGlvblJlcG9ydChzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX190TW9kZWxMaXN0CisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fdE1vZGVsTGlzdCAoOTEpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fdE1vZGVsTGlzdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX190TW9kZWxMaXN0ICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3RNb2RlbExpc3QgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX190TW9kZWxMaXN0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX3RNb2RlbExpc3QgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3RNb2RlbExpc3QgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX3RNb2RlbExpc3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3RNb2RlbExpc3QgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX190TW9kZWxMaXN0ICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fdE1vZGVsTGlzdChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX190TW9kZWxMaXN0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX3RNb2RlbExpc3QqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX3RNb2RlbExpc3QgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX3RNb2RlbExpc3Qoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX3RNb2RlbExpc3Qoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fdE1vZGVsRGV0YWlsCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fdE1vZGVsRGV0YWlsICg5MCkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX190TW9kZWxEZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fdE1vZGVsRGV0YWlsICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3RNb2RlbERldGFpbCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX3RNb2RlbERldGFpbChzdHJ1Y3Qgc29hcCosIHVkZGkyX190TW9kZWxEZXRhaWwgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3RNb2RlbERldGFpbCAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fdE1vZGVsRGV0YWlsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX190TW9kZWxEZXRhaWwgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX190TW9kZWxEZXRhaWwgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX190TW9kZWxEZXRhaWwoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fdE1vZGVsRGV0YWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3RNb2RlbERldGFpbCopOworU09BUF9GTUFDNSB1ZGRpMl9fdE1vZGVsRGV0YWlsICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX190TW9kZWxEZXRhaWwoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX3RNb2RlbERldGFpbChzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19zZXJ2aWNlTGlzdAorI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX3NlcnZpY2VMaXN0ICg4OSkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19zZXJ2aWNlTGlzdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19zZXJ2aWNlTGlzdCAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19zZXJ2aWNlTGlzdCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX3NlcnZpY2VMaXN0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NlcnZpY2VMaXN0ICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19zZXJ2aWNlTGlzdCAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fc2VydmljZUxpc3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3NlcnZpY2VMaXN0ICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fc2VydmljZUxpc3QgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19zZXJ2aWNlTGlzdChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19zZXJ2aWNlTGlzdChzdHJ1Y3Qgc29hcCosIHVkZGkyX19zZXJ2aWNlTGlzdCopOworU09BUF9GTUFDNSB1ZGRpMl9fc2VydmljZUxpc3QgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX3NlcnZpY2VMaXN0KHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19zZXJ2aWNlTGlzdChzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19zZXJ2aWNlRGV0YWlsCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fc2VydmljZURldGFpbCAoODgpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fc2VydmljZURldGFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19zZXJ2aWNlRGV0YWlsICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NlcnZpY2VEZXRhaWwgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19zZXJ2aWNlRGV0YWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NlcnZpY2VEZXRhaWwgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NlcnZpY2VEZXRhaWwgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX3NlcnZpY2VEZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3NlcnZpY2VEZXRhaWwgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19zZXJ2aWNlRGV0YWlsICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fc2VydmljZURldGFpbChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19zZXJ2aWNlRGV0YWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NlcnZpY2VEZXRhaWwqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX3NlcnZpY2VEZXRhaWwgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX3NlcnZpY2VEZXRhaWwoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX3NlcnZpY2VEZXRhaWwoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0CisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0ICg4NykKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0ICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdChzdHJ1Y3Qgc29hcCosIHVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3QgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdCAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3QgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3QgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3Qoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdCopOworU09BUF9GTUFDNSB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0ICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3Qoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdChzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19yZWdpc3RlcmVkSW5mbworI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX3JlZ2lzdGVyZWRJbmZvICg4NikKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19yZWdpc3RlcmVkSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19yZWdpc3RlcmVkSW5mbyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19yZWdpc3RlcmVkSW5mbyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX3JlZ2lzdGVyZWRJbmZvKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3JlZ2lzdGVyZWRJbmZvICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19yZWdpc3RlcmVkSW5mbyAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fcmVnaXN0ZXJlZEluZm8oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3JlZ2lzdGVyZWRJbmZvICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fcmVnaXN0ZXJlZEluZm8gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19yZWdpc3RlcmVkSW5mbyhzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19yZWdpc3RlcmVkSW5mbyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19yZWdpc3RlcmVkSW5mbyopOworU09BUF9GTUFDNSB1ZGRpMl9fcmVnaXN0ZXJlZEluZm8gKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX3JlZ2lzdGVyZWRJbmZvKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19yZWdpc3RlcmVkSW5mbyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9ucyAoODUpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fYnVzaW5lc3NMaXN0CisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fYnVzaW5lc3NMaXN0ICg4NCkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19idXNpbmVzc0xpc3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fYnVzaW5lc3NMaXN0ICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2J1c2luZXNzTGlzdCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2J1c2luZXNzTGlzdChzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc0xpc3QgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2J1c2luZXNzTGlzdCAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fYnVzaW5lc3NMaXN0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19idXNpbmVzc0xpc3QgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19idXNpbmVzc0xpc3QgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19idXNpbmVzc0xpc3Qoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fYnVzaW5lc3NMaXN0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX2J1c2luZXNzTGlzdCopOworU09BUF9GTUFDNSB1ZGRpMl9fYnVzaW5lc3NMaXN0ICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19idXNpbmVzc0xpc3Qoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX2J1c2luZXNzTGlzdChzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19idXNpbmVzc0RldGFpbEV4dAorI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0ICg4MykKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19idXNpbmVzc0RldGFpbEV4dChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19idXNpbmVzc0RldGFpbEV4dCAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc0RldGFpbEV4dCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0ICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc0RldGFpbEV4dCAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0ICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHQgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19idXNpbmVzc0RldGFpbEV4dChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19idXNpbmVzc0RldGFpbEV4dChzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc0RldGFpbEV4dCopOworU09BUF9GTUFDNSB1ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHQgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0KHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19idXNpbmVzc0RldGFpbEV4dChzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19idXNpbmVzc0RldGFpbAorI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2J1c2luZXNzRGV0YWlsICg4MikKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19idXNpbmVzc0RldGFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19idXNpbmVzc0RldGFpbCAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc0RldGFpbCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2J1c2luZXNzRGV0YWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2J1c2luZXNzRGV0YWlsICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc0RldGFpbCAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fYnVzaW5lc3NEZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2J1c2luZXNzRGV0YWlsICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fYnVzaW5lc3NEZXRhaWwgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19idXNpbmVzc0RldGFpbChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19idXNpbmVzc0RldGFpbChzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc0RldGFpbCopOworU09BUF9GTUFDNSB1ZGRpMl9fYnVzaW5lc3NEZXRhaWwgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2J1c2luZXNzRGV0YWlsKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19idXNpbmVzc0RldGFpbChzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19iaW5kaW5nRGV0YWlsCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fYmluZGluZ0RldGFpbCAoODEpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fYmluZGluZ0RldGFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19iaW5kaW5nRGV0YWlsICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2JpbmRpbmdEZXRhaWwgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19iaW5kaW5nRGV0YWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2JpbmRpbmdEZXRhaWwgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2JpbmRpbmdEZXRhaWwgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2JpbmRpbmdEZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2JpbmRpbmdEZXRhaWwgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19iaW5kaW5nRGV0YWlsICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fYmluZGluZ0RldGFpbChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19iaW5kaW5nRGV0YWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2JpbmRpbmdEZXRhaWwqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2JpbmRpbmdEZXRhaWwgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2JpbmRpbmdEZXRhaWwoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX2JpbmRpbmdEZXRhaWwoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fYXV0aFRva2VuCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fYXV0aFRva2VuICg4MCkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19hdXRoVG9rZW4oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fYXV0aFRva2VuICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2F1dGhUb2tlbiAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2F1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIHVkZGkyX19hdXRoVG9rZW4gKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2F1dGhUb2tlbiAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19hdXRoVG9rZW4gKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19hdXRoVG9rZW4gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19hdXRoVG9rZW4oc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2F1dGhUb2tlbiopOworU09BUF9GTUFDNSB1ZGRpMl9fYXV0aFRva2VuICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19hdXRoVG9rZW4oc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX2F1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQgKDc5KQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0ICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0ICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydCAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydCAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0Kik7CitTT0FQX0ZNQUM1IHVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydChzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX3ZhbGlkYXRlX1VTQ09SRXZhbHVlcworI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX3ZhbGlkYXRlX1VTQ09SRXZhbHVlcyAoNzgpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fdmFsaWRhdGVfVVNDT1JFdmFsdWVzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX3ZhbGlkYXRlX1VTQ09SRXZhbHVlcyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX192YWxpZGF0ZV9VU0NPUkV2YWx1ZXMgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX192YWxpZGF0ZV9VU0NPUkV2YWx1ZXMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fdmFsaWRhdGVfVVNDT1JFdmFsdWVzICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX192YWxpZGF0ZV9VU0NPUkV2YWx1ZXMgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX3ZhbGlkYXRlX1VTQ09SRXZhbHVlcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fdmFsaWRhdGVfVVNDT1JFdmFsdWVzICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fdmFsaWRhdGVfVVNDT1JFdmFsdWVzICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fdmFsaWRhdGVfVVNDT1JFdmFsdWVzKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX3ZhbGlkYXRlX1VTQ09SRXZhbHVlcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX192YWxpZGF0ZV9VU0NPUkV2YWx1ZXMqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX3ZhbGlkYXRlX1VTQ09SRXZhbHVlcyAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fdmFsaWRhdGVfVVNDT1JFdmFsdWVzKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX192YWxpZGF0ZV9VU0NPUkV2YWx1ZXMoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAoNzcpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19zYXZlX1VTQ09SRXRNb2RlbCAoNzYpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19zYXZlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIHVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbCAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19zYXZlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlICg3NSkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZSAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIHVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2UgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZSAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2UgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2UgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZSopOworU09BUF9GTUFDNSB1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyAoNzQpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3MgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3MgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3MgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3MgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3MqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3MgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nICg3MykKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZyAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZyopOworU09BUF9GTUFDNSB1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbCAoNzIpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbCAoNzEpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbChzdHJ1Y3Qgc29hcCosIHVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbCAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbChzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvICg3MCkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8gKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8gKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8oc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyopOworU09BUF9GTUFDNSB1ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8oc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucworI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICg2OSkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyopOworU09BUF9GTUFDNSB1ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQgKDY4KQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0ICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0ICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dCAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dCAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0Kik7CitTT0FQX0ZNQUM1IHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dChzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0KHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbAorI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbCAoNjcpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbCAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbChzdHJ1Y3Qgc29hcCosIHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbCAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbCAoNjYpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbChzdHJ1Y3Qgc29hcCosIHVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbCAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbChzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbgorI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW4gKDY1KQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW4oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbiAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbiAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW4oc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuKik7CitTT0FQX0ZNQUM1IHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0ICg2NCkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCopOworU09BUF9GTUFDNSB1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydChzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydChzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19maW5kX1VTQ09SRXRNb2RlbAorI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsICg2MykKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19maW5kX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19maW5kX1VTQ09SRXRNb2RlbCAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19maW5kX1VTQ09SRXRNb2RlbCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19maW5kX1VTQ09SRXRNb2RlbCAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWwgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19maW5kX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19maW5kX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIHVkZGkyX19maW5kX1VTQ09SRXRNb2RlbCopOworU09BUF9GTUFDNSB1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWwgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19maW5kX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19maW5kX1VTQ09SRXNlcnZpY2UKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19maW5kX1VTQ09SRXNlcnZpY2UgKDYyKQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2UgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZSAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19maW5kX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZSAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZSAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19maW5kX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlKik7CitTT0FQX0ZNQUM1IHVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2UgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzICg2MSkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyopOworU09BUF9GTUFDNSB1ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyhzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzcyAoNjApCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nICg1OSkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19maW5kX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmcgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZyAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmcgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmcgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19maW5kX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZyopOworU09BUF9GTUFDNSB1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19maW5kX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbgorI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuICg1OCkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbiAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbiAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbiAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIHVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbiopOworU09BUF9GTUFDNSB1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4gKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbCAoNTcpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZSAoNTYpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIHVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZSAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZSAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAoNTUpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzICg1NCkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3MgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3MgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3MgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyopOworU09BUF9GTUFDNSB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZworI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nICg1MykKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyopOworU09BUF9GTUFDNSB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucworI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICg1MikKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyopOworU09BUF9GTUFDNSB1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX190TW9kZWxJbnN0YW5jZUluZm8KKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX190TW9kZWxJbnN0YW5jZUluZm8gKDUxKQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX190TW9kZWxJbnN0YW5jZUluZm8gKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX190TW9kZWxJbnN0YW5jZUluZm8oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyhzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX190TW9kZWxJbnN0YW5jZUluZm8oc3RydWN0IHNvYXAqLCB1ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvKik7CitTT0FQX0ZNQUM1IHVkZGkyX190TW9kZWxJbnN0YW5jZUluZm8gKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyhzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX3RNb2RlbEluc3RhbmNlRGV0YWlscworI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX3RNb2RlbEluc3RhbmNlRGV0YWlscyAoNTApCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fdE1vZGVsSW5zdGFuY2VEZXRhaWxzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX3RNb2RlbEluc3RhbmNlRGV0YWlscyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX190TW9kZWxJbnN0YW5jZURldGFpbHMgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX190TW9kZWxJbnN0YW5jZURldGFpbHMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fdE1vZGVsSW5zdGFuY2VEZXRhaWxzICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX190TW9kZWxJbnN0YW5jZURldGFpbHMgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX3RNb2RlbEluc3RhbmNlRGV0YWlscyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fdE1vZGVsSW5zdGFuY2VEZXRhaWxzICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fdE1vZGVsSW5zdGFuY2VEZXRhaWxzICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fdE1vZGVsSW5zdGFuY2VEZXRhaWxzKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX3RNb2RlbEluc3RhbmNlRGV0YWlscyhzdHJ1Y3Qgc29hcCosIHVkZGkyX190TW9kZWxJbnN0YW5jZURldGFpbHMqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX3RNb2RlbEluc3RhbmNlRGV0YWlscyAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fdE1vZGVsSW5zdGFuY2VEZXRhaWxzKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX190TW9kZWxJbnN0YW5jZURldGFpbHMoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fdE1vZGVsSW5mb3MKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX190TW9kZWxJbmZvcyAoNDkpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fdE1vZGVsSW5mb3Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fdE1vZGVsSW5mb3MgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fdE1vZGVsSW5mb3MgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX190TW9kZWxJbmZvcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX190TW9kZWxJbmZvcyAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fdE1vZGVsSW5mb3MgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX3RNb2RlbEluZm9zKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX190TW9kZWxJbmZvcyAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX3RNb2RlbEluZm9zICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fdE1vZGVsSW5mb3Moc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fdE1vZGVsSW5mb3Moc3RydWN0IHNvYXAqLCB1ZGRpMl9fdE1vZGVsSW5mb3MqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX3RNb2RlbEluZm9zICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX190TW9kZWxJbmZvcyhzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fdE1vZGVsSW5mb3Moc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fdE1vZGVsSW5mbworI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX3RNb2RlbEluZm8gKDQ4KQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX3RNb2RlbEluZm8oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fdE1vZGVsSW5mbyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX190TW9kZWxJbmZvICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fdE1vZGVsSW5mbyhzdHJ1Y3Qgc29hcCosIHVkZGkyX190TW9kZWxJbmZvICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX190TW9kZWxJbmZvICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX190TW9kZWxJbmZvKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX190TW9kZWxJbmZvICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fdE1vZGVsSW5mbyAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX3RNb2RlbEluZm8oc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fdE1vZGVsSW5mbyhzdHJ1Y3Qgc29hcCosIHVkZGkyX190TW9kZWxJbmZvKik7CitTT0FQX0ZNQUM1IHVkZGkyX190TW9kZWxJbmZvICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX190TW9kZWxJbmZvKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX190TW9kZWxJbmZvKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX3RNb2RlbEJhZworI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX3RNb2RlbEJhZyAoNDcpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fdE1vZGVsQmFnKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX3RNb2RlbEJhZyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX190TW9kZWxCYWcgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX190TW9kZWxCYWcoc3RydWN0IHNvYXAqLCB1ZGRpMl9fdE1vZGVsQmFnICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX190TW9kZWxCYWcgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX3RNb2RlbEJhZyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fdE1vZGVsQmFnICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fdE1vZGVsQmFnICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fdE1vZGVsQmFnKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX3RNb2RlbEJhZyhzdHJ1Y3Qgc29hcCosIHVkZGkyX190TW9kZWxCYWcqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX3RNb2RlbEJhZyAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fdE1vZGVsQmFnKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX190TW9kZWxCYWcoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fdE1vZGVsCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fdE1vZGVsICg0NikKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX190TW9kZWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fdE1vZGVsICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3RNb2RlbCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX3RNb2RlbChzdHJ1Y3Qgc29hcCosIHVkZGkyX190TW9kZWwgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3RNb2RlbCAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fdE1vZGVsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX190TW9kZWwgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX190TW9kZWwgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX190TW9kZWwoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fdE1vZGVsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3RNb2RlbCopOworU09BUF9GTUFDNSB1ZGRpMl9fdE1vZGVsICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX190TW9kZWwoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX3RNb2RlbChzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyAoNDUpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyhzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fc2VydmljZUluZm9zCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fc2VydmljZUluZm9zICg0NCkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19zZXJ2aWNlSW5mb3Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fc2VydmljZUluZm9zICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NlcnZpY2VJbmZvcyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX3NlcnZpY2VJbmZvcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19zZXJ2aWNlSW5mb3MgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NlcnZpY2VJbmZvcyAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fc2VydmljZUluZm9zKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19zZXJ2aWNlSW5mb3MgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19zZXJ2aWNlSW5mb3MgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19zZXJ2aWNlSW5mb3Moc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fc2VydmljZUluZm9zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NlcnZpY2VJbmZvcyopOworU09BUF9GTUFDNSB1ZGRpMl9fc2VydmljZUluZm9zICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19zZXJ2aWNlSW5mb3Moc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX3NlcnZpY2VJbmZvcyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19zZXJ2aWNlSW5mbworI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX3NlcnZpY2VJbmZvICg0MykKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19zZXJ2aWNlSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19zZXJ2aWNlSW5mbyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19zZXJ2aWNlSW5mbyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX3NlcnZpY2VJbmZvKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NlcnZpY2VJbmZvICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19zZXJ2aWNlSW5mbyAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fc2VydmljZUluZm8oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3NlcnZpY2VJbmZvICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fc2VydmljZUluZm8gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19zZXJ2aWNlSW5mbyhzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19zZXJ2aWNlSW5mbyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19zZXJ2aWNlSW5mbyopOworU09BUF9GTUFDNSB1ZGRpMl9fc2VydmljZUluZm8gKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX3NlcnZpY2VJbmZvKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19zZXJ2aWNlSW5mbyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19yZXN1bHQKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19yZXN1bHQgKDQyKQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX3Jlc3VsdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19yZXN1bHQgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fcmVzdWx0ICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fcmVzdWx0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX3Jlc3VsdCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fcmVzdWx0ICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19yZXN1bHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3Jlc3VsdCAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX3Jlc3VsdCAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX3Jlc3VsdChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19yZXN1bHQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fcmVzdWx0Kik7CitTT0FQX0ZNQUM1IHVkZGkyX19yZXN1bHQgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX3Jlc3VsdChzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fcmVzdWx0KHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mb3MgKDQxKQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mb3Moc3RydWN0IHNvYXAqLCB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mb3MgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mb3MgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvcyAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zKik7CitTT0FQX0ZNQUM1IHVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvcyAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mb3Moc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8KKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvICg0MCkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8gKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8oc3RydWN0IHNvYXAqLCB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8oc3RydWN0IHNvYXAqLCB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyopOworU09BUF9GTUFDNSB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyhzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24KKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24gKDM5KQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24gKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbiAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbiAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbiAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbihzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24oc3RydWN0IHNvYXAqLCB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKik7CitTT0FQX0ZNQUM1IHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24gKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbihzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX3Bob25lCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fcGhvbmUgKDM4KQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX3Bob25lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX3Bob25lICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3Bob25lICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fcGhvbmUoc3RydWN0IHNvYXAqLCB1ZGRpMl9fcGhvbmUgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3Bob25lICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19waG9uZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fcGhvbmUgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19waG9uZSAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX3Bob25lKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX3Bob25lKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3Bob25lKik7CitTT0FQX0ZNQUM1IHVkZGkyX19waG9uZSAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fcGhvbmUoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX3Bob25lKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX292ZXJ2aWV3RG9jCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fb3ZlcnZpZXdEb2MgKDM3KQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX292ZXJ2aWV3RG9jKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX292ZXJ2aWV3RG9jICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX292ZXJ2aWV3RG9jICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fb3ZlcnZpZXdEb2Moc3RydWN0IHNvYXAqLCB1ZGRpMl9fb3ZlcnZpZXdEb2MgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX292ZXJ2aWV3RG9jICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19vdmVydmlld0RvYyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fb3ZlcnZpZXdEb2MgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19vdmVydmlld0RvYyAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX292ZXJ2aWV3RG9jKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX292ZXJ2aWV3RG9jKHN0cnVjdCBzb2FwKiwgdWRkaTJfX292ZXJ2aWV3RG9jKik7CitTT0FQX0ZNQUM1IHVkZGkyX19vdmVydmlld0RvYyAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fb3ZlcnZpZXdEb2Moc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX292ZXJ2aWV3RG9jKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX25hbWUKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19uYW1lICgzNikKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19uYW1lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX25hbWUgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fbmFtZSAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX25hbWUoc3RydWN0IHNvYXAqLCB1ZGRpMl9fbmFtZSAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fbmFtZSAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fbmFtZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fbmFtZSAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX25hbWUgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19uYW1lKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX25hbWUoc3RydWN0IHNvYXAqLCB1ZGRpMl9fbmFtZSopOworU09BUF9GTUFDNSB1ZGRpMl9fbmFtZSAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fbmFtZShzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fbmFtZShzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19rZXlzT3duZWQKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19rZXlzT3duZWQgKDM1KQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX2tleXNPd25lZChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19rZXlzT3duZWQgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fa2V5c093bmVkICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fa2V5c093bmVkKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2tleXNPd25lZCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fa2V5c093bmVkICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19rZXlzT3duZWQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2tleXNPd25lZCAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX2tleXNPd25lZCAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX2tleXNPd25lZChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19rZXlzT3duZWQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fa2V5c093bmVkKik7CitTT0FQX0ZNQUM1IHVkZGkyX19rZXlzT3duZWQgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2tleXNPd25lZChzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fa2V5c093bmVkKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX2tleWVkUmVmZXJlbmNlCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fa2V5ZWRSZWZlcmVuY2UgKDM0KQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX2tleWVkUmVmZXJlbmNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX2tleWVkUmVmZXJlbmNlICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2tleWVkUmVmZXJlbmNlICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fa2V5ZWRSZWZlcmVuY2Uoc3RydWN0IHNvYXAqLCB1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2tleWVkUmVmZXJlbmNlICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19rZXllZFJlZmVyZW5jZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19rZXllZFJlZmVyZW5jZSAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX2tleWVkUmVmZXJlbmNlKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX2tleWVkUmVmZXJlbmNlKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2tleWVkUmVmZXJlbmNlKik7CitTT0FQX0ZNQUM1IHVkZGkyX19rZXllZFJlZmVyZW5jZSAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fa2V5ZWRSZWZlcmVuY2Uoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX2tleWVkUmVmZXJlbmNlKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX2luc3RhbmNlRGV0YWlscworI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2luc3RhbmNlRGV0YWlscyAoMzMpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9faW5zdGFuY2VEZXRhaWxzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX2luc3RhbmNlRGV0YWlscyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19pbnN0YW5jZURldGFpbHMgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19pbnN0YW5jZURldGFpbHMoc3RydWN0IHNvYXAqLCB1ZGRpMl9faW5zdGFuY2VEZXRhaWxzICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19pbnN0YW5jZURldGFpbHMgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2luc3RhbmNlRGV0YWlscyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9faW5zdGFuY2VEZXRhaWxzICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9faW5zdGFuY2VEZXRhaWxzICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9faW5zdGFuY2VEZXRhaWxzKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX2luc3RhbmNlRGV0YWlscyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19pbnN0YW5jZURldGFpbHMqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2luc3RhbmNlRGV0YWlscyAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9faW5zdGFuY2VEZXRhaWxzKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19pbnN0YW5jZURldGFpbHMoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9faWRlbnRpZmllckJhZworI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2lkZW50aWZpZXJCYWcgKDMyKQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX2lkZW50aWZpZXJCYWcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9faWRlbnRpZmllckJhZyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19pZGVudGlmaWVyQmFnICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9faWRlbnRpZmllckJhZyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19pZGVudGlmaWVyQmFnICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19pZGVudGlmaWVyQmFnICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19pZGVudGlmaWVyQmFnKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19pZGVudGlmaWVyQmFnICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9faWRlbnRpZmllckJhZyAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX2lkZW50aWZpZXJCYWcoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9faWRlbnRpZmllckJhZyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19pZGVudGlmaWVyQmFnKik7CitTT0FQX0ZNQUM1IHVkZGkyX19pZGVudGlmaWVyQmFnICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19pZGVudGlmaWVyQmFnKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19pZGVudGlmaWVyQmFnKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX2hvc3RpbmdSZWRpcmVjdG9yCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9faG9zdGluZ1JlZGlyZWN0b3IgKDMxKQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX2hvc3RpbmdSZWRpcmVjdG9yKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX2hvc3RpbmdSZWRpcmVjdG9yICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2hvc3RpbmdSZWRpcmVjdG9yICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9faG9zdGluZ1JlZGlyZWN0b3Ioc3RydWN0IHNvYXAqLCB1ZGRpMl9faG9zdGluZ1JlZGlyZWN0b3IgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2hvc3RpbmdSZWRpcmVjdG9yICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19ob3N0aW5nUmVkaXJlY3RvcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9faG9zdGluZ1JlZGlyZWN0b3IgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19ob3N0aW5nUmVkaXJlY3RvciAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX2hvc3RpbmdSZWRpcmVjdG9yKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX2hvc3RpbmdSZWRpcmVjdG9yKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2hvc3RpbmdSZWRpcmVjdG9yKik7CitTT0FQX0ZNQUM1IHVkZGkyX19ob3N0aW5nUmVkaXJlY3RvciAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9faG9zdGluZ1JlZGlyZWN0b3Ioc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX2hvc3RpbmdSZWRpcmVjdG9yKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX2ZpbmRRdWFsaWZpZXJzCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fZmluZFF1YWxpZmllcnMgKDMwKQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX2ZpbmRRdWFsaWZpZXJzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX2ZpbmRRdWFsaWZpZXJzICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2ZpbmRRdWFsaWZpZXJzICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fZmluZFF1YWxpZmllcnMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZmluZFF1YWxpZmllcnMgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2ZpbmRRdWFsaWZpZXJzICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19maW5kUXVhbGlmaWVycyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fZmluZFF1YWxpZmllcnMgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19maW5kUXVhbGlmaWVycyAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX2ZpbmRRdWFsaWZpZXJzKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX2ZpbmRRdWFsaWZpZXJzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2ZpbmRRdWFsaWZpZXJzKik7CitTT0FQX0ZNQUM1IHVkZGkyX19maW5kUXVhbGlmaWVycyAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fZmluZFF1YWxpZmllcnMoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX2ZpbmRRdWFsaWZpZXJzKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX2VyckluZm8KKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19lcnJJbmZvICgyOSkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19lcnJJbmZvKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX2VyckluZm8gKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZXJySW5mbyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2VyckluZm8oc3RydWN0IHNvYXAqLCB1ZGRpMl9fZXJySW5mbyAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZXJySW5mbyAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fZXJySW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fZXJySW5mbyAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX2VyckluZm8gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19lcnJJbmZvKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX2VyckluZm8oc3RydWN0IHNvYXAqLCB1ZGRpMl9fZXJySW5mbyopOworU09BUF9GTUFDNSB1ZGRpMl9fZXJySW5mbyAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fZXJySW5mbyhzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fZXJySW5mbyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19lbWFpbAorI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2VtYWlsICgyOCkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19lbWFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19lbWFpbCAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19lbWFpbCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2VtYWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2VtYWlsICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19lbWFpbCAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fZW1haWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2VtYWlsICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fZW1haWwgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19lbWFpbChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19lbWFpbChzdHJ1Y3Qgc29hcCosIHVkZGkyX19lbWFpbCopOworU09BUF9GTUFDNSB1ZGRpMl9fZW1haWwgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2VtYWlsKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19lbWFpbChzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19kaXNwb3NpdGlvblJlcG9ydAorI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0ICgyNykKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19kaXNwb3NpdGlvblJlcG9ydChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0ICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0ICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19kaXNwb3NpdGlvblJlcG9ydChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19kaXNwb3NpdGlvblJlcG9ydChzdHJ1Y3Qgc29hcCosIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCopOworU09BUF9GTUFDNSB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0KHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19kaXNwb3NpdGlvblJlcG9ydChzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19kaXNjb3ZlcnlVUkxzCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fZGlzY292ZXJ5VVJMcyAoMjYpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fZGlzY292ZXJ5VVJMcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19kaXNjb3ZlcnlVUkxzICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2Rpc2NvdmVyeVVSTHMgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19kaXNjb3ZlcnlVUkxzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2Rpc2NvdmVyeVVSTHMgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2Rpc2NvdmVyeVVSTHMgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2Rpc2NvdmVyeVVSTHMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2Rpc2NvdmVyeVVSTHMgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19kaXNjb3ZlcnlVUkxzICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fZGlzY292ZXJ5VVJMcyhzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19kaXNjb3ZlcnlVUkxzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2Rpc2NvdmVyeVVSTHMqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2Rpc2NvdmVyeVVSTHMgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2Rpc2NvdmVyeVVSTHMoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX2Rpc2NvdmVyeVVSTHMoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fZGlzY292ZXJ5VVJMCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fZGlzY292ZXJ5VVJMICgyNSkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19kaXNjb3ZlcnlVUkwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fZGlzY292ZXJ5VVJMICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2Rpc2NvdmVyeVVSTCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2Rpc2NvdmVyeVVSTChzdHJ1Y3Qgc29hcCosIHVkZGkyX19kaXNjb3ZlcnlVUkwgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2Rpc2NvdmVyeVVSTCAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fZGlzY292ZXJ5VVJMKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19kaXNjb3ZlcnlVUkwgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19kaXNjb3ZlcnlVUkwgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19kaXNjb3ZlcnlVUkwoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fZGlzY292ZXJ5VVJMKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2Rpc2NvdmVyeVVSTCopOworU09BUF9GTUFDNSB1ZGRpMl9fZGlzY292ZXJ5VVJMICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19kaXNjb3ZlcnlVUkwoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX2Rpc2NvdmVyeVVSTChzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19kZXNjcmlwdGlvbgorI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2Rlc2NyaXB0aW9uICgyNCkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19kZXNjcmlwdGlvbihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19kZXNjcmlwdGlvbiAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19kZXNjcmlwdGlvbiAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2Rlc2NyaXB0aW9uKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2Rlc2NyaXB0aW9uICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19kZXNjcmlwdGlvbiAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fZGVzY3JpcHRpb24oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2Rlc2NyaXB0aW9uICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fZGVzY3JpcHRpb24gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19kZXNjcmlwdGlvbihzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19kZXNjcmlwdGlvbihzdHJ1Y3Qgc29hcCosIHVkZGkyX19kZXNjcmlwdGlvbiopOworU09BUF9GTUFDNSB1ZGRpMl9fZGVzY3JpcHRpb24gKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2Rlc2NyaXB0aW9uKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19kZXNjcmlwdGlvbihzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19jb250YWN0cworI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2NvbnRhY3RzICgyMykKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19jb250YWN0cyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19jb250YWN0cyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19jb250YWN0cyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2NvbnRhY3RzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2NvbnRhY3RzICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19jb250YWN0cyAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fY29udGFjdHMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2NvbnRhY3RzICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fY29udGFjdHMgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19jb250YWN0cyhzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19jb250YWN0cyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19jb250YWN0cyopOworU09BUF9GTUFDNSB1ZGRpMl9fY29udGFjdHMgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2NvbnRhY3RzKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19jb250YWN0cyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19jb250YWN0CisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fY29udGFjdCAoMjIpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fY29udGFjdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19jb250YWN0ICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2NvbnRhY3QgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19jb250YWN0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX2NvbnRhY3QgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2NvbnRhY3QgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2NvbnRhY3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2NvbnRhY3QgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19jb250YWN0ICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fY29udGFjdChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19jb250YWN0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX2NvbnRhY3QqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2NvbnRhY3QgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2NvbnRhY3Qoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX2NvbnRhY3Qoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fY2F0ZWdvcnlCYWcKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19jYXRlZ29yeUJhZyAoMjEpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fY2F0ZWdvcnlCYWcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fY2F0ZWdvcnlCYWcgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fY2F0ZWdvcnlCYWcgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19jYXRlZ29yeUJhZyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19jYXRlZ29yeUJhZyAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fY2F0ZWdvcnlCYWcgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2NhdGVnb3J5QmFnKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19jYXRlZ29yeUJhZyAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX2NhdGVnb3J5QmFnICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fY2F0ZWdvcnlCYWcoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fY2F0ZWdvcnlCYWcoc3RydWN0IHNvYXAqLCB1ZGRpMl9fY2F0ZWdvcnlCYWcqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2NhdGVnb3J5QmFnICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19jYXRlZ29yeUJhZyhzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fY2F0ZWdvcnlCYWcoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlcworI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2J1c2luZXNzU2VydmljZXMgKDIwKQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX2J1c2luZXNzU2VydmljZXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlcyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc1NlcnZpY2VzICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc1NlcnZpY2VzICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc1NlcnZpY2VzICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19idXNpbmVzc1NlcnZpY2VzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19idXNpbmVzc1NlcnZpY2VzICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlcyAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX2J1c2luZXNzU2VydmljZXMoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc1NlcnZpY2VzKik7CitTT0FQX0ZNQUM1IHVkZGkyX19idXNpbmVzc1NlcnZpY2VzICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19idXNpbmVzc1NlcnZpY2VzKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19idXNpbmVzc1NlcnZpY2VzKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX2J1c2luZXNzU2VydmljZQorI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2J1c2luZXNzU2VydmljZSAoMTkpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX2J1c2luZXNzU2VydmljZSAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc1NlcnZpY2UgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19idXNpbmVzc1NlcnZpY2Uoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc1NlcnZpY2UgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2J1c2luZXNzU2VydmljZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX2J1c2luZXNzU2VydmljZShzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc1NlcnZpY2UqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2J1c2luZXNzU2VydmljZSAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19idXNpbmVzc1NlcnZpY2Uoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fYnVzaW5lc3NJbmZvcworI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2J1c2luZXNzSW5mb3MgKDE4KQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX2J1c2luZXNzSW5mb3Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fYnVzaW5lc3NJbmZvcyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc0luZm9zICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fYnVzaW5lc3NJbmZvcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc0luZm9zICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc0luZm9zICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19idXNpbmVzc0luZm9zKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19idXNpbmVzc0luZm9zICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fYnVzaW5lc3NJbmZvcyAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX2J1c2luZXNzSW5mb3Moc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fYnVzaW5lc3NJbmZvcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc0luZm9zKik7CitTT0FQX0ZNQUM1IHVkZGkyX19idXNpbmVzc0luZm9zICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19idXNpbmVzc0luZm9zKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19idXNpbmVzc0luZm9zKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX2J1c2luZXNzSW5mbworI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2J1c2luZXNzSW5mbyAoMTcpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fYnVzaW5lc3NJbmZvKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX2J1c2luZXNzSW5mbyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc0luZm8gKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19idXNpbmVzc0luZm8oc3RydWN0IHNvYXAqLCB1ZGRpMl9fYnVzaW5lc3NJbmZvICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc0luZm8gKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2J1c2luZXNzSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fYnVzaW5lc3NJbmZvICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fYnVzaW5lc3NJbmZvICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fYnVzaW5lc3NJbmZvKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX2J1c2luZXNzSW5mbyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc0luZm8qKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2J1c2luZXNzSW5mbyAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fYnVzaW5lc3NJbmZvKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19idXNpbmVzc0luZm8oc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19idXNpbmVzc0VudGl0eUV4dCAoMTYpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19idXNpbmVzc0VudGl0eUV4dChzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc0VudGl0eUV4dCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2J1c2luZXNzRW50aXR5RXh0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19idXNpbmVzc0VudGl0eUV4dCAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX2J1c2luZXNzRW50aXR5RXh0ICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2J1c2luZXNzRW50aXR5RXh0ICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19idXNpbmVzc0VudGl0eUV4dChzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fYnVzaW5lc3NFbnRpdHkKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19idXNpbmVzc0VudGl0eSAoMTUpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fYnVzaW5lc3NFbnRpdHkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fYnVzaW5lc3NFbnRpdHkgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fYnVzaW5lc3NFbnRpdHkgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19idXNpbmVzc0VudGl0eShzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc0VudGl0eSAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fYnVzaW5lc3NFbnRpdHkgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2J1c2luZXNzRW50aXR5KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19idXNpbmVzc0VudGl0eSAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX2J1c2luZXNzRW50aXR5ICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fYnVzaW5lc3NFbnRpdHkoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fYnVzaW5lc3NFbnRpdHkoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYnVzaW5lc3NFbnRpdHkqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2J1c2luZXNzRW50aXR5ICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19idXNpbmVzc0VudGl0eShzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fYnVzaW5lc3NFbnRpdHkoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fYmluZGluZ1RlbXBsYXRlcworI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZXMgKDE0KQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlcyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19iaW5kaW5nVGVtcGxhdGVzICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fYmluZGluZ1RlbXBsYXRlcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19iaW5kaW5nVGVtcGxhdGVzICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19iaW5kaW5nVGVtcGxhdGVzICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19iaW5kaW5nVGVtcGxhdGVzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19iaW5kaW5nVGVtcGxhdGVzICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlcyAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZXMoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fYmluZGluZ1RlbXBsYXRlcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19iaW5kaW5nVGVtcGxhdGVzKik7CitTT0FQX0ZNQUM1IHVkZGkyX19iaW5kaW5nVGVtcGxhdGVzICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19iaW5kaW5nVGVtcGxhdGVzKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19iaW5kaW5nVGVtcGxhdGVzKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZQorI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZSAoMTMpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fYmluZGluZ1RlbXBsYXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZSAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19iaW5kaW5nVGVtcGxhdGUgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19iaW5kaW5nVGVtcGxhdGUoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19iaW5kaW5nVGVtcGxhdGUgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fYmluZGluZ1RlbXBsYXRlKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZShzdHJ1Y3Qgc29hcCosIHVkZGkyX19iaW5kaW5nVGVtcGxhdGUqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZSAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fYmluZGluZ1RlbXBsYXRlKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19iaW5kaW5nVGVtcGxhdGUoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbQorI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW0gKDEyKQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW0oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbSAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbShzdHJ1Y3Qgc29hcCosIHVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbSAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW0oc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbShzdHJ1Y3Qgc29hcCosIHVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtKik7CitTT0FQX0ZNQUM1IHVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX2FkZHJlc3NMaW5lCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fYWRkcmVzc0xpbmUgKDExKQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX2FkZHJlc3NMaW5lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX2FkZHJlc3NMaW5lICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2FkZHJlc3NMaW5lICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fYWRkcmVzc0xpbmUoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYWRkcmVzc0xpbmUgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2FkZHJlc3NMaW5lICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19hZGRyZXNzTGluZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fYWRkcmVzc0xpbmUgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19hZGRyZXNzTGluZSAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX2FkZHJlc3NMaW5lKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX2FkZHJlc3NMaW5lKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2FkZHJlc3NMaW5lKik7CitTT0FQX0ZNQUM1IHVkZGkyX19hZGRyZXNzTGluZSAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fYWRkcmVzc0xpbmUoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX2FkZHJlc3NMaW5lKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX2FkZHJlc3MKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19hZGRyZXNzICgxMCkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19hZGRyZXNzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX2FkZHJlc3MgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fYWRkcmVzcyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2FkZHJlc3Moc3RydWN0IHNvYXAqLCB1ZGRpMl9fYWRkcmVzcyAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fYWRkcmVzcyAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fYWRkcmVzcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fYWRkcmVzcyAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX2FkZHJlc3MgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19hZGRyZXNzKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX2FkZHJlc3Moc3RydWN0IHNvYXAqLCB1ZGRpMl9fYWRkcmVzcyopOworU09BUF9GTUFDNSB1ZGRpMl9fYWRkcmVzcyAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fYWRkcmVzcyhzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fYWRkcmVzcyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19hY2Nlc3NQb2ludAorI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2FjY2Vzc1BvaW50ICg5KQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX2FjY2Vzc1BvaW50KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX2FjY2Vzc1BvaW50ICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2FjY2Vzc1BvaW50ICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fYWNjZXNzUG9pbnQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYWNjZXNzUG9pbnQgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2FjY2Vzc1BvaW50ICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19hY2Nlc3NQb2ludChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fYWNjZXNzUG9pbnQgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19hY2Nlc3NQb2ludCAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX2FjY2Vzc1BvaW50KHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX2FjY2Vzc1BvaW50KHN0cnVjdCBzb2FwKiwgdWRkaTJfX2FjY2Vzc1BvaW50Kik7CitTT0FQX0ZNQUM1IHVkZGkyX19hY2Nlc3NQb2ludCAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fYWNjZXNzUG9pbnQoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX2FjY2Vzc1BvaW50KHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBXSVRIX05PR0xPQkFMCisKKyNpZm5kZWYgU09BUF9UWVBFX1NPQVBfRU5WX19GYXVsdAorI2RlZmluZSBTT0FQX1RZUEVfU09BUF9FTlZfX0ZhdWx0ICgzNTkpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1NPQVBfRU5WX19GYXVsdChzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0cnVjdCBTT0FQX0VOVl9fRmF1bHQgKik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfU09BUF9FTlZfX0ZhdWx0KHN0cnVjdCBzb2FwKiwgc3RydWN0IFNPQVBfRU5WX19GYXVsdCAqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfU09BUF9FTlZfX0ZhdWx0KHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RydWN0IFNPQVBfRU5WX19GYXVsdCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9TT0FQX0VOVl9fRmF1bHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdHJ1Y3QgU09BUF9FTlZfX0ZhdWx0ICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RydWN0IFNPQVBfRU5WX19GYXVsdCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfU09BUF9FTlZfX0ZhdWx0KHN0cnVjdCBzb2FwKiwgc3RydWN0IFNPQVBfRU5WX19GYXVsdCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgU09BUF9FTlZfX0ZhdWx0ICogU09BUF9GTUFDNCBzb2FwX2luX1NPQVBfRU5WX19GYXVsdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdHJ1Y3QgU09BUF9FTlZfX0ZhdWx0ICosIGNvbnN0IGNoYXIqKTsKKworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9OT0dMT0JBTAorCisjaWZuZGVmIFNPQVBfVFlQRV9TT0FQX0VOVl9fRGV0YWlsCisjZGVmaW5lIFNPQVBfVFlQRV9TT0FQX0VOVl9fRGV0YWlsICgzNTgpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1NPQVBfRU5WX19EZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgU09BUF9FTlZfX0RldGFpbCAqKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9TT0FQX0VOVl9fRGV0YWlsKHN0cnVjdCBzb2FwKiwgc3RydWN0IFNPQVBfRU5WX19EZXRhaWwgKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1NPQVBfRU5WX19EZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgU09BUF9FTlZfX0RldGFpbCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9TT0FQX0VOVl9fRGV0YWlsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RydWN0IFNPQVBfRU5WX19EZXRhaWwgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgU09BUF9FTlZfX0RldGFpbCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfU09BUF9FTlZfX0RldGFpbChzdHJ1Y3Qgc29hcCosIHN0cnVjdCBTT0FQX0VOVl9fRGV0YWlsICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBTT0FQX0VOVl9fRGV0YWlsICogU09BUF9GTUFDNCBzb2FwX2luX1NPQVBfRU5WX19EZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RydWN0IFNPQVBfRU5WX19EZXRhaWwgKiwgY29uc3QgY2hhciopOworCisjZW5kaWYKKworI2lmbmRlZiBXSVRIX05PR0xPQkFMCisKKyNpZm5kZWYgU09BUF9UWVBFX1NPQVBfRU5WX19Db2RlCisjZGVmaW5lIFNPQVBfVFlQRV9TT0FQX0VOVl9fQ29kZSAoMzU3KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9TT0FQX0VOVl9fQ29kZShzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0cnVjdCBTT0FQX0VOVl9fQ29kZSAqKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9TT0FQX0VOVl9fQ29kZShzdHJ1Y3Qgc29hcCosIHN0cnVjdCBTT0FQX0VOVl9fQ29kZSAqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfU09BUF9FTlZfX0NvZGUoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgU09BUF9FTlZfX0NvZGUgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfU09BUF9FTlZfX0NvZGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdHJ1Y3QgU09BUF9FTlZfX0NvZGUgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgU09BUF9FTlZfX0NvZGUgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1NPQVBfRU5WX19Db2RlKHN0cnVjdCBzb2FwKiwgc3RydWN0IFNPQVBfRU5WX19Db2RlICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBTT0FQX0VOVl9fQ29kZSAqIFNPQVBfRk1BQzQgc29hcF9pbl9TT0FQX0VOVl9fQ29kZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdHJ1Y3QgU09BUF9FTlZfX0NvZGUgKiwgY29uc3QgY2hhciopOworCisjZW5kaWYKKworI2lmbmRlZiBXSVRIX05PR0xPQkFMCisKKyNpZm5kZWYgU09BUF9UWVBFX1NPQVBfRU5WX19IZWFkZXIKKyNkZWZpbmUgU09BUF9UWVBFX1NPQVBfRU5WX19IZWFkZXIgKDM1NikKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfU09BUF9FTlZfX0hlYWRlcihzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0cnVjdCBTT0FQX0VOVl9fSGVhZGVyICopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X1NPQVBfRU5WX19IZWFkZXIoc3RydWN0IHNvYXAqLCBzdHJ1Y3QgU09BUF9FTlZfX0hlYWRlciAqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfU09BUF9FTlZfX0hlYWRlcihzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0cnVjdCBTT0FQX0VOVl9fSGVhZGVyICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1NPQVBfRU5WX19IZWFkZXIoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdHJ1Y3QgU09BUF9FTlZfX0hlYWRlciAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBTT0FQX0VOVl9fSGVhZGVyICogU09BUF9GTUFDNCBzb2FwX2dldF9TT0FQX0VOVl9fSGVhZGVyKHN0cnVjdCBzb2FwKiwgc3RydWN0IFNPQVBfRU5WX19IZWFkZXIgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RydWN0IFNPQVBfRU5WX19IZWFkZXIgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fU09BUF9FTlZfX0hlYWRlcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdHJ1Y3QgU09BUF9FTlZfX0hlYWRlciAqLCBjb25zdCBjaGFyKik7CisKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfVFlQRV9fX3B1YjJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zCisjZGVmaW5lIFNPQVBfVFlQRV9fX3B1YjJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICgzNTQpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX19fcHViMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19wdWIyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9fX3B1YjJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgc3RydWN0IF9fcHViMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X19fcHViMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19wdWIyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9fX3B1YjJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RydWN0IF9fcHViMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgX19wdWIyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfX19wdWIyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIHN0cnVjdCBfX3B1YjJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBfX3B1YjJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICogU09BUF9GTUFDNCBzb2FwX2luX19fcHViMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RydWN0IF9fcHViMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9fX3B1YjJfX3NhdmVfVVNDT1JFdE1vZGVsCisjZGVmaW5lIFNPQVBfVFlQRV9fX3B1YjJfX3NhdmVfVVNDT1JFdE1vZGVsICgzNTEpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX19fcHViMl9fc2F2ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19wdWIyX19zYXZlX1VTQ09SRXRNb2RlbCAqKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9fX3B1YjJfX3NhdmVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgc3RydWN0IF9fcHViMl9fc2F2ZV9VU0NPUkV0TW9kZWwgKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X19fcHViMl9fc2F2ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19wdWIyX19zYXZlX1VTQ09SRXRNb2RlbCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9fX3B1YjJfX3NhdmVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RydWN0IF9fcHViMl9fc2F2ZV9VU0NPUkV0TW9kZWwgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgX19wdWIyX19zYXZlX1VTQ09SRXRNb2RlbCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfX19wdWIyX19zYXZlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIHN0cnVjdCBfX3B1YjJfX3NhdmVfVVNDT1JFdE1vZGVsICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBfX3B1YjJfX3NhdmVfVVNDT1JFdE1vZGVsICogU09BUF9GTUFDNCBzb2FwX2luX19fcHViMl9fc2F2ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RydWN0IF9fcHViMl9fc2F2ZV9VU0NPUkV0TW9kZWwgKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9fX3B1YjJfX3NhdmVfVVNDT1JFc2VydmljZQorI2RlZmluZSBTT0FQX1RZUEVfX19wdWIyX19zYXZlX1VTQ09SRXNlcnZpY2UgKDM0OCkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfX19wdWIyX19zYXZlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19wdWIyX19zYXZlX1VTQ09SRXNlcnZpY2UgKik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfX19wdWIyX19zYXZlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBzdHJ1Y3QgX19wdWIyX19zYXZlX1VTQ09SRXNlcnZpY2UgKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X19fcHViMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RydWN0IF9fcHViMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X19fcHViMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RydWN0IF9fcHViMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RydWN0IF9fcHViMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlICogU09BUF9GTUFDNCBzb2FwX2dldF9fX3B1YjJfX3NhdmVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIHN0cnVjdCBfX3B1YjJfX3NhdmVfVVNDT1JFc2VydmljZSAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgX19wdWIyX19zYXZlX1VTQ09SRXNlcnZpY2UgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fX19wdWIyX19zYXZlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RydWN0IF9fcHViMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlICosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfX19wdWIyX19zYXZlX1VTQ09SRWJ1c2luZXNzCisjZGVmaW5lIFNPQVBfVFlQRV9fX3B1YjJfX3NhdmVfVVNDT1JFYnVzaW5lc3MgKDM0NSkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfX19wdWIyX19zYXZlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RydWN0IF9fcHViMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyAqKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9fX3B1YjJfX3NhdmVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBzdHJ1Y3QgX19wdWIyX19zYXZlX1VTQ09SRWJ1c2luZXNzICopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9fX3B1YjJfX3NhdmVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19wdWIyX19zYXZlX1VTQ09SRWJ1c2luZXNzICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X19fcHViMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHN0cnVjdCBfX3B1YjJfX3NhdmVfVVNDT1JFYnVzaW5lc3MgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgX19wdWIyX19zYXZlX1VTQ09SRWJ1c2luZXNzICogU09BUF9GTUFDNCBzb2FwX2dldF9fX3B1YjJfX3NhdmVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBzdHJ1Y3QgX19wdWIyX19zYXZlX1VTQ09SRWJ1c2luZXNzICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBfX3B1YjJfX3NhdmVfVVNDT1JFYnVzaW5lc3MgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fX19wdWIyX19zYXZlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHN0cnVjdCBfX3B1YjJfX3NhdmVfVVNDT1JFYnVzaW5lc3MgKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9fX3B1YjJfX3NhdmVfVVNDT1JFYmluZGluZworI2RlZmluZSBTT0FQX1RZUEVfX19wdWIyX19zYXZlX1VTQ09SRWJpbmRpbmcgKDM0MikKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfX19wdWIyX19zYXZlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19wdWIyX19zYXZlX1VTQ09SRWJpbmRpbmcgKik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfX19wdWIyX19zYXZlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBzdHJ1Y3QgX19wdWIyX19zYXZlX1VTQ09SRWJpbmRpbmcgKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X19fcHViMl9fc2F2ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RydWN0IF9fcHViMl9fc2F2ZV9VU0NPUkViaW5kaW5nICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X19fcHViMl9fc2F2ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RydWN0IF9fcHViMl9fc2F2ZV9VU0NPUkViaW5kaW5nICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RydWN0IF9fcHViMl9fc2F2ZV9VU0NPUkViaW5kaW5nICogU09BUF9GTUFDNCBzb2FwX2dldF9fX3B1YjJfX3NhdmVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIHN0cnVjdCBfX3B1YjJfX3NhdmVfVVNDT1JFYmluZGluZyAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgX19wdWIyX19zYXZlX1VTQ09SRWJpbmRpbmcgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fX19wdWIyX19zYXZlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RydWN0IF9fcHViMl9fc2F2ZV9VU0NPUkViaW5kaW5nICosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfX19wdWIyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8KKyNkZWZpbmUgU09BUF9UWVBFX19fcHViMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvICgzMzkpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX19fcHViMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RydWN0IF9fcHViMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvICopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X19fcHViMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvKHN0cnVjdCBzb2FwKiwgc3RydWN0IF9fcHViMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvICopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9fX3B1YjJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0cnVjdCBfX3B1YjJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9fX3B1YjJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHN0cnVjdCBfX3B1YjJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBfX3B1YjJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfX19wdWIyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8oc3RydWN0IHNvYXAqLCBzdHJ1Y3QgX19wdWIyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8gKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RydWN0IF9fcHViMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvICogU09BUF9GTUFDNCBzb2FwX2luX19fcHViMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHN0cnVjdCBfX3B1YjJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyAqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX19fcHViMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMKKyNkZWZpbmUgU09BUF9UWVBFX19fcHViMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKDMzNikKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfX19wdWIyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0cnVjdCBfX3B1YjJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X19fcHViMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBzdHJ1Y3QgX19wdWIyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfX19wdWIyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0cnVjdCBfX3B1YjJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X19fcHViMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdHJ1Y3QgX19wdWIyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBfX3B1YjJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICogU09BUF9GTUFDNCBzb2FwX2dldF9fX3B1YjJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgc3RydWN0IF9fcHViMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RydWN0IF9fcHViMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fX19wdWIyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdHJ1Y3QgX19wdWIyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX19fcHViMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbgorI2RlZmluZSBTT0FQX1RZUEVfX19wdWIyX19nZXRfVVNDT1JFYXV0aFRva2VuICgzMzMpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX19fcHViMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0cnVjdCBfX3B1YjJfX2dldF9VU0NPUkVhdXRoVG9rZW4gKik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfX19wdWIyX19nZXRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgc3RydWN0IF9fcHViMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbiAqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfX19wdWIyX19nZXRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RydWN0IF9fcHViMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbiAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9fX3B1YjJfX2dldF9VU0NPUkVhdXRoVG9rZW4oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdHJ1Y3QgX19wdWIyX19nZXRfVVNDT1JFYXV0aFRva2VuICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RydWN0IF9fcHViMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbiAqIFNPQVBfRk1BQzQgc29hcF9nZXRfX19wdWIyX19nZXRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgc3RydWN0IF9fcHViMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbiAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgX19wdWIyX19nZXRfVVNDT1JFYXV0aFRva2VuICogU09BUF9GTUFDNCBzb2FwX2luX19fcHViMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdHJ1Y3QgX19wdWIyX19nZXRfVVNDT1JFYXV0aFRva2VuICosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfX19wdWIyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0CisjZGVmaW5lIFNPQVBfVFlQRV9fX3B1YjJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQgKDMzMCkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfX19wdWIyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RydWN0IF9fcHViMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCAqKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9fX3B1YjJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQoc3RydWN0IHNvYXAqLCBzdHJ1Y3QgX19wdWIyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0ICopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9fX3B1YjJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19wdWIyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0ICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X19fcHViMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHN0cnVjdCBfX3B1YjJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgX19wdWIyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0ICogU09BUF9GTUFDNCBzb2FwX2dldF9fX3B1YjJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQoc3RydWN0IHNvYXAqLCBzdHJ1Y3QgX19wdWIyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0ICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBfX3B1YjJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fX19wdWIyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHN0cnVjdCBfX3B1YjJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQgKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9fX3B1YjJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuCisjZGVmaW5lIFNPQVBfVFlQRV9fX3B1YjJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuICgzMjcpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX19fcHViMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4oc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19wdWIyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbiAqKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9fX3B1YjJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgc3RydWN0IF9fcHViMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4gKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X19fcHViMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4oc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19wdWIyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbiAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9fX3B1YjJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RydWN0IF9fcHViMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4gKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgX19wdWIyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbiAqIFNPQVBfRk1BQzQgc29hcF9nZXRfX19wdWIyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIHN0cnVjdCBfX3B1YjJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBfX3B1YjJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuICogU09BUF9GTUFDNCBzb2FwX2luX19fcHViMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RydWN0IF9fcHViMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4gKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9fX3B1YjJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwKKyNkZWZpbmUgU09BUF9UWVBFX19fcHViMl9fZGVsZXRlX1VTQ09SRXRNb2RlbCAoMzI0KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9fX3B1YjJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19wdWIyX19kZWxldGVfVVNDT1JFdE1vZGVsICopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X19fcHViMl9fZGVsZXRlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIHN0cnVjdCBfX3B1YjJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwgKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X19fcHViMl9fZGVsZXRlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0cnVjdCBfX3B1YjJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfX19wdWIyX19kZWxldGVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RydWN0IF9fcHViMl9fZGVsZXRlX1VTQ09SRXRNb2RlbCAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBfX3B1YjJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X19fcHViMl9fZGVsZXRlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIHN0cnVjdCBfX3B1YjJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RydWN0IF9fcHViMl9fZGVsZXRlX1VTQ09SRXRNb2RlbCAqIFNPQVBfRk1BQzQgc29hcF9pbl9fX3B1YjJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RydWN0IF9fcHViMl9fZGVsZXRlX1VTQ09SRXRNb2RlbCAqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX19fcHViMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UKKyNkZWZpbmUgU09BUF9UWVBFX19fcHViMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UgKDMyMSkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfX19wdWIyX19kZWxldGVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0cnVjdCBfX3B1YjJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlICopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X19fcHViMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBzdHJ1Y3QgX19wdWIyX19kZWxldGVfVVNDT1JFc2VydmljZSAqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfX19wdWIyX19kZWxldGVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0cnVjdCBfX3B1YjJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X19fcHViMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdHJ1Y3QgX19wdWIyX19kZWxldGVfVVNDT1JFc2VydmljZSAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBfX3B1YjJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlICogU09BUF9GTUFDNCBzb2FwX2dldF9fX3B1YjJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgc3RydWN0IF9fcHViMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RydWN0IF9fcHViMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fX19wdWIyX19kZWxldGVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdHJ1Y3QgX19wdWIyX19kZWxldGVfVVNDT1JFc2VydmljZSAqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX19fcHViMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMKKyNkZWZpbmUgU09BUF9UWVBFX19fcHViMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKDMxOCkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfX19wdWIyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0cnVjdCBfX3B1YjJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X19fcHViMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBzdHJ1Y3QgX19wdWIyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfX19wdWIyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0cnVjdCBfX3B1YjJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X19fcHViMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdHJ1Y3QgX19wdWIyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBfX3B1YjJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICogU09BUF9GTUFDNCBzb2FwX2dldF9fX3B1YjJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgc3RydWN0IF9fcHViMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RydWN0IF9fcHViMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fX19wdWIyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdHJ1Y3QgX19wdWIyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX19fcHViMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzCisjZGVmaW5lIFNPQVBfVFlQRV9fX3B1YjJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyAoMzE1KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9fX3B1YjJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0cnVjdCBfX3B1YjJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyAqKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9fX3B1YjJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIHN0cnVjdCBfX3B1YjJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyAqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfX19wdWIyX19kZWxldGVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19wdWIyX19kZWxldGVfVVNDT1JFYnVzaW5lc3MgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfX19wdWIyX19kZWxldGVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdHJ1Y3QgX19wdWIyX19kZWxldGVfVVNDT1JFYnVzaW5lc3MgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgX19wdWIyX19kZWxldGVfVVNDT1JFYnVzaW5lc3MgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X19fcHViMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKiwgc3RydWN0IF9fcHViMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBfX3B1YjJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyAqIFNPQVBfRk1BQzQgc29hcF9pbl9fX3B1YjJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdHJ1Y3QgX19wdWIyX19kZWxldGVfVVNDT1JFYnVzaW5lc3MgKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9fX3B1YjJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nCisjZGVmaW5lIFNPQVBfVFlQRV9fX3B1YjJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nICgzMTIpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX19fcHViMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19wdWIyX19kZWxldGVfVVNDT1JFYmluZGluZyAqKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9fX3B1YjJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgc3RydWN0IF9fcHViMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcgKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X19fcHViMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19wdWIyX19kZWxldGVfVVNDT1JFYmluZGluZyAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9fX3B1YjJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RydWN0IF9fcHViMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgX19wdWIyX19kZWxldGVfVVNDT1JFYmluZGluZyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfX19wdWIyX19kZWxldGVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIHN0cnVjdCBfX3B1YjJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBfX3B1YjJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nICogU09BUF9GTUFDNCBzb2FwX2luX19fcHViMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RydWN0IF9fcHViMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcgKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9fX3B1YjJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zCisjZGVmaW5lIFNPQVBfVFlQRV9fX3B1YjJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICgzMDkpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX19fcHViMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19wdWIyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9fX3B1YjJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgc3RydWN0IF9fcHViMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X19fcHViMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19wdWIyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9fX3B1YjJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RydWN0IF9fcHViMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgX19wdWIyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfX19wdWIyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIHN0cnVjdCBfX3B1YjJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBfX3B1YjJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICogU09BUF9GTUFDNCBzb2FwX2luX19fcHViMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RydWN0IF9fcHViMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFdJVEhfTk9HTE9CQUwKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvU09BUF9FTlZfX0NvZGUKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb1NPQVBfRU5WX19Db2RlICgzNjEpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb1NPQVBfRU5WX19Db2RlKHN0cnVjdCBzb2FwKiwgc3RydWN0IFNPQVBfRU5WX19Db2RlICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG9TT0FQX0VOVl9fQ29kZShzdHJ1Y3Qgc29hcCosIHN0cnVjdCBTT0FQX0VOVl9fQ29kZSAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG9TT0FQX0VOVl9fQ29kZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCBzdHJ1Y3QgU09BUF9FTlZfX0NvZGUgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgc3RydWN0IFNPQVBfRU5WX19Db2RlICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvU09BUF9FTlZfX0NvZGUoc3RydWN0IHNvYXAqLCBzdHJ1Y3QgU09BUF9FTlZfX0NvZGUgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBTT0FQX0VOVl9fQ29kZSAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvU09BUF9FTlZfX0NvZGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RydWN0IFNPQVBfRU5WX19Db2RlICoqLCBjb25zdCBjaGFyKik7CisKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTk9HTE9CQUwKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvU09BUF9FTlZfX0RldGFpbAorI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvU09BUF9FTlZfX0RldGFpbCAoMzYwKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG9TT0FQX0VOVl9fRGV0YWlsKHN0cnVjdCBzb2FwKiwgc3RydWN0IFNPQVBfRU5WX19EZXRhaWwgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb1NPQVBfRU5WX19EZXRhaWwoc3RydWN0IHNvYXAqLCBzdHJ1Y3QgU09BUF9FTlZfX0RldGFpbCAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG9TT0FQX0VOVl9fRGV0YWlsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHN0cnVjdCBTT0FQX0VOVl9fRGV0YWlsICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBTT0FQX0VOVl9fRGV0YWlsICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvU09BUF9FTlZfX0RldGFpbChzdHJ1Y3Qgc29hcCosIHN0cnVjdCBTT0FQX0VOVl9fRGV0YWlsICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgU09BUF9FTlZfX0RldGFpbCAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvU09BUF9FTlZfX0RldGFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdHJ1Y3QgU09BUF9FTlZfX0RldGFpbCAqKiwgY29uc3QgY2hhciopOworCisjZW5kaWYKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKDM1MikKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19zYXZlX1VTQ09SRXRNb2RlbCAoMzQ5KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19zYXZlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIHVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbCAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbCAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19zYXZlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIHVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbCAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2UKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2UgKDM0NikKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIHVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2UgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCB1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZSAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIHVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2UgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2UgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZSAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcworI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3MgKDM0MykKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCB1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCB1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3MgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nICgzNDApCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCB1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZyAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZyAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCB1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbworI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyAoMzM3KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8gKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8gKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucworI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICgzMzQpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW4KKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuICgzMzEpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW4gKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW4gKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW4oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW4gKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW4gKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbiAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW4oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW4gKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0ICgzMjgpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydChzdHJ1Y3Qgc29hcCosIHVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0ICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4gKDMyNSkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4oc3RydWN0IHNvYXAqLCB1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4gKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbiAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4gKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4oc3RydWN0IHNvYXAqLCB1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4gKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbiAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbiAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbAorI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwgKDMyMikKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbCAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbCAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbCAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbCAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbCAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZSAoMzE5KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIHVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZSAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZSAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIHVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZSAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucworI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICgzMTYpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcworI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyAoMzEzKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3MgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3MgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZworI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nICgzMTApCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKDMwNykKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mb3MKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvcyAoMzA1KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mb3Moc3RydWN0IHNvYXAqLCB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mb3MgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvcyAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mb3Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvcyAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvcyAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mb3Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX190TW9kZWxJbmZvcworI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluZm9zICgzMDQpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX190TW9kZWxJbmZvcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX190TW9kZWxJbmZvcyAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluZm9zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3RNb2RlbEluZm9zICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX190TW9kZWxJbmZvcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fdE1vZGVsSW5mb3MgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3RNb2RlbEluZm9zICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluZm9zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3RNb2RlbEluZm9zICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fdE1vZGVsSW5mb3MgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX190TW9kZWxJbmZvcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fdE1vZGVsSW5mb3MgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzSW5mb3MKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc0luZm9zICgzMDMpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc0luZm9zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2J1c2luZXNzSW5mb3MgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc0luZm9zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2J1c2luZXNzSW5mb3MgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzSW5mb3Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2J1c2luZXNzSW5mb3MgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2J1c2luZXNzSW5mb3MgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NJbmZvcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc0luZm9zICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fYnVzaW5lc3NJbmZvcyAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzSW5mb3Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2J1c2luZXNzSW5mb3MgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzRW50aXR5RXh0CisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQgKDMwMSkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzRW50aXR5RXh0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX2J1c2luZXNzRW50aXR5RXh0ICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzRW50aXR5RXh0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19idXNpbmVzc0VudGl0eUV4dCAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc0VudGl0eUV4dCAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzRW50aXR5RXh0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19idXNpbmVzc0VudGl0eUV4dCAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbQorI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW0gKDI5OSkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW0oc3RydWN0IHNvYXAqLCB1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbSAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW0oc3RydWN0IHNvYXAqLCB1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbSAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbSAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbSAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW0gKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbSAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsICgyODcpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX190TW9kZWwoc3RydWN0IHNvYXAqLCB1ZGRpMl9fdE1vZGVsICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3RNb2RlbCAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX190TW9kZWwgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3RNb2RlbCAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX190TW9kZWwoc3RydWN0IHNvYXAqLCB1ZGRpMl9fdE1vZGVsICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fdE1vZGVsICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX190TW9kZWwgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3RNb2RlbERldGFpbAorI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3RNb2RlbERldGFpbCAoMjYzKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsRGV0YWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3RNb2RlbERldGFpbCAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX3RNb2RlbERldGFpbChzdHJ1Y3Qgc29hcCosIHVkZGkyX190TW9kZWxEZXRhaWwgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX3RNb2RlbERldGFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fdE1vZGVsRGV0YWlsICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX190TW9kZWxEZXRhaWwgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsRGV0YWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3RNb2RlbERldGFpbCAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3RNb2RlbERldGFpbCAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX3RNb2RlbERldGFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fdE1vZGVsRGV0YWlsICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19zZXJ2aWNlRGV0YWlsCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fc2VydmljZURldGFpbCAoMjU4KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fc2VydmljZURldGFpbChzdHJ1Y3Qgc29hcCosIHVkZGkyX19zZXJ2aWNlRGV0YWlsICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fc2VydmljZURldGFpbChzdHJ1Y3Qgc29hcCosIHVkZGkyX19zZXJ2aWNlRGV0YWlsICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19zZXJ2aWNlRGV0YWlsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19zZXJ2aWNlRGV0YWlsICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19zZXJ2aWNlRGV0YWlsICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX3NlcnZpY2VEZXRhaWwoc3RydWN0IHNvYXAqLCB1ZGRpMl9fc2VydmljZURldGFpbCAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NlcnZpY2VEZXRhaWwgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19zZXJ2aWNlRGV0YWlsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19zZXJ2aWNlRGV0YWlsICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19yZWdpc3RlcmVkSW5mbworI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3JlZ2lzdGVyZWRJbmZvICgyNTMpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19yZWdpc3RlcmVkSW5mbyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19yZWdpc3RlcmVkSW5mbyAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX3JlZ2lzdGVyZWRJbmZvKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3JlZ2lzdGVyZWRJbmZvICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19yZWdpc3RlcmVkSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fcmVnaXN0ZXJlZEluZm8gKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3JlZ2lzdGVyZWRJbmZvICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX3JlZ2lzdGVyZWRJbmZvKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3JlZ2lzdGVyZWRJbmZvICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fcmVnaXN0ZXJlZEluZm8gKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19yZWdpc3RlcmVkSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fcmVnaXN0ZXJlZEluZm8gKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zICgyNTApCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9ucyAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0CisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHQgKDI0NykKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0ICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHQgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19idXNpbmVzc0RldGFpbEV4dCAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHQgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHQgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc0RldGFpbEV4dCAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19idXNpbmVzc0RldGFpbEV4dCAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NEZXRhaWwKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc0RldGFpbCAoMjQyKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NEZXRhaWwoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYnVzaW5lc3NEZXRhaWwgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc0RldGFpbChzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc0RldGFpbCAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NEZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2J1c2luZXNzRGV0YWlsICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc0RldGFpbCAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc0RldGFpbChzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc0RldGFpbCAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2J1c2luZXNzRGV0YWlsICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NEZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2J1c2luZXNzRGV0YWlsICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19hdXRoVG9rZW4KKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19hdXRoVG9rZW4gKDIzMykKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX2F1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIHVkZGkyX19hdXRoVG9rZW4gKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19hdXRoVG9rZW4oc3RydWN0IHNvYXAqLCB1ZGRpMl9fYXV0aFRva2VuICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19hdXRoVG9rZW4oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2F1dGhUb2tlbiAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fYXV0aFRva2VuICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX2F1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIHVkZGkyX19hdXRoVG9rZW4gKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19hdXRoVG9rZW4gKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19hdXRoVG9rZW4oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2F1dGhUb2tlbiAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0CisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0ICgyMjkpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0ICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydCAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydCAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0ICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0ICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3RNb2RlbExpc3QKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX190TW9kZWxMaXN0ICgyMjUpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX190TW9kZWxMaXN0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX3RNb2RlbExpc3QgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX190TW9kZWxMaXN0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX3RNb2RlbExpc3QgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX3RNb2RlbExpc3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX3RNb2RlbExpc3QgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3RNb2RlbExpc3QgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsTGlzdChzdHJ1Y3Qgc29hcCosIHVkZGkyX190TW9kZWxMaXN0ICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fdE1vZGVsTGlzdCAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX3RNb2RlbExpc3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3RNb2RlbExpc3QgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3NlcnZpY2VMaXN0CisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fc2VydmljZUxpc3QgKDIyMCkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX3NlcnZpY2VMaXN0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NlcnZpY2VMaXN0ICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fc2VydmljZUxpc3Qoc3RydWN0IHNvYXAqLCB1ZGRpMl9fc2VydmljZUxpc3QgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX3NlcnZpY2VMaXN0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19zZXJ2aWNlTGlzdCAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fc2VydmljZUxpc3QgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fc2VydmljZUxpc3Qoc3RydWN0IHNvYXAqLCB1ZGRpMl9fc2VydmljZUxpc3QgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19zZXJ2aWNlTGlzdCAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX3NlcnZpY2VMaXN0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19zZXJ2aWNlTGlzdCAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0CisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0ICgyMTQpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3Qoc3RydWN0IHNvYXAqLCB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0ICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdCAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3QgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdCAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3Qoc3RydWN0IHNvYXAqLCB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0ICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0ICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3QgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzTGlzdAorI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzTGlzdCAoMjEwKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NMaXN0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX2J1c2luZXNzTGlzdCAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzTGlzdChzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc0xpc3QgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzTGlzdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fYnVzaW5lc3NMaXN0ICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc0xpc3QgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NMaXN0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX2J1c2luZXNzTGlzdCAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2J1c2luZXNzTGlzdCAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzTGlzdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fYnVzaW5lc3NMaXN0ICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19iaW5kaW5nRGV0YWlsCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fYmluZGluZ0RldGFpbCAoMjAyKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fYmluZGluZ0RldGFpbChzdHJ1Y3Qgc29hcCosIHVkZGkyX19iaW5kaW5nRGV0YWlsICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fYmluZGluZ0RldGFpbChzdHJ1Y3Qgc29hcCosIHVkZGkyX19iaW5kaW5nRGV0YWlsICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19iaW5kaW5nRGV0YWlsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19iaW5kaW5nRGV0YWlsICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19iaW5kaW5nRGV0YWlsICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX2JpbmRpbmdEZXRhaWwoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYmluZGluZ0RldGFpbCAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2JpbmRpbmdEZXRhaWwgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19iaW5kaW5nRGV0YWlsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19iaW5kaW5nRGV0YWlsICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb2ludAorI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvaW50ICgxOTgpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb2ludChzdHJ1Y3Qgc29hcCosIGludCAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvaW50KHN0cnVjdCBzb2FwKiwgaW50ICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb2ludChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgaW50ICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvaW50KHN0cnVjdCBzb2FwKiwgaW50ICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb2ludChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3RNb2RlbEJhZworI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3RNb2RlbEJhZyAoMTk3KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsQmFnKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3RNb2RlbEJhZyAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX3RNb2RlbEJhZyhzdHJ1Y3Qgc29hcCosIHVkZGkyX190TW9kZWxCYWcgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX3RNb2RlbEJhZyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fdE1vZGVsQmFnICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX190TW9kZWxCYWcgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsQmFnKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3RNb2RlbEJhZyAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3RNb2RlbEJhZyAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX3RNb2RlbEJhZyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fdE1vZGVsQmFnICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19maW5kUXVhbGlmaWVycworI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2ZpbmRRdWFsaWZpZXJzICgxOTYpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19maW5kUXVhbGlmaWVycyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19maW5kUXVhbGlmaWVycyAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX2ZpbmRRdWFsaWZpZXJzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2ZpbmRRdWFsaWZpZXJzICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19maW5kUXVhbGlmaWVycyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fZmluZFF1YWxpZmllcnMgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2ZpbmRRdWFsaWZpZXJzICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX2ZpbmRRdWFsaWZpZXJzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2ZpbmRRdWFsaWZpZXJzICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZmluZFF1YWxpZmllcnMgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19maW5kUXVhbGlmaWVycyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fZmluZFF1YWxpZmllcnMgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0CisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgKDE2NikKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0ICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uICgxNTcpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24oc3RydWN0IHNvYXAqLCB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbiAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24gKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbiAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24oc3RydWN0IHNvYXAqLCB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24gKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2luc3RhbmNlRGV0YWlscworI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2luc3RhbmNlRGV0YWlscyAoMTU2KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9faW5zdGFuY2VEZXRhaWxzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2luc3RhbmNlRGV0YWlscyAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX2luc3RhbmNlRGV0YWlscyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19pbnN0YW5jZURldGFpbHMgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2luc3RhbmNlRGV0YWlscyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9faW5zdGFuY2VEZXRhaWxzICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19pbnN0YW5jZURldGFpbHMgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9faW5zdGFuY2VEZXRhaWxzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2luc3RhbmNlRGV0YWlscyAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2luc3RhbmNlRGV0YWlscyAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2luc3RhbmNlRGV0YWlscyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9faW5zdGFuY2VEZXRhaWxzICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX190TW9kZWxJbnN0YW5jZUluZm8KKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX190TW9kZWxJbnN0YW5jZUluZm8gKDE1NCkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyhzdHJ1Y3Qgc29hcCosIHVkZGkyX190TW9kZWxJbnN0YW5jZUluZm8gKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX190TW9kZWxJbnN0YW5jZUluZm8oc3RydWN0IHNvYXAqLCB1ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX190TW9kZWxJbnN0YW5jZUluZm8oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyhzdHJ1Y3Qgc29hcCosIHVkZGkyX190TW9kZWxJbnN0YW5jZUluZm8gKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX190TW9kZWxJbnN0YW5jZUluZm8gKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX190TW9kZWxJbnN0YW5jZUluZm8oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsSW5mbworI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluZm8gKDE1MikKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluZm8oc3RydWN0IHNvYXAqLCB1ZGRpMl9fdE1vZGVsSW5mbyAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluZm8oc3RydWN0IHNvYXAqLCB1ZGRpMl9fdE1vZGVsSW5mbyAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fdE1vZGVsSW5mbyAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fdE1vZGVsSW5mbyAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX190TW9kZWxJbmZvKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3RNb2RlbEluZm8gKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX190TW9kZWxJbmZvICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fdE1vZGVsSW5mbyAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fc2VydmljZUluZm8KKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19zZXJ2aWNlSW5mbyAoMTQ5KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fc2VydmljZUluZm8oc3RydWN0IHNvYXAqLCB1ZGRpMl9fc2VydmljZUluZm8gKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19zZXJ2aWNlSW5mbyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19zZXJ2aWNlSW5mbyAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fc2VydmljZUluZm8oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX3NlcnZpY2VJbmZvICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19zZXJ2aWNlSW5mbyAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19zZXJ2aWNlSW5mbyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19zZXJ2aWNlSW5mbyAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NlcnZpY2VJbmZvICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fc2VydmljZUluZm8oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3NlcnZpY2VJbmZvICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19rZXlUeXBlCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fa2V5VHlwZSAoMTQ4KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fa2V5VHlwZShzdHJ1Y3Qgc29hcCosIGVudW0gdWRkaTJfX2tleVR5cGUgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19rZXlUeXBlKHN0cnVjdCBzb2FwKiwgZW51bSB1ZGRpMl9fa2V5VHlwZSAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fa2V5VHlwZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCBlbnVtIHVkZGkyX19rZXlUeXBlICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIGVudW0gdWRkaTJfX2tleVR5cGUgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fa2V5VHlwZShzdHJ1Y3Qgc29hcCosIGVudW0gdWRkaTJfX2tleVR5cGUgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGVudW0gdWRkaTJfX2tleVR5cGUgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19rZXlUeXBlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGVudW0gdWRkaTJfX2tleVR5cGUgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2VyckluZm8KKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19lcnJJbmZvICgxNDcpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19lcnJJbmZvKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2VyckluZm8gKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19lcnJJbmZvKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2VyckluZm8gKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2VyckluZm8oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2VyckluZm8gKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2VyckluZm8gKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fZXJySW5mbyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19lcnJJbmZvICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZXJySW5mbyAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2VyckluZm8oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2VyckluZm8gKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8KKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvICgxNDUpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8gKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8gKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8gKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8gKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8gKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzICgxNDMpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX292ZXJ2aWV3RG9jCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fb3ZlcnZpZXdEb2MgKDE0MikKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX292ZXJ2aWV3RG9jKHN0cnVjdCBzb2FwKiwgdWRkaTJfX292ZXJ2aWV3RG9jICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fb3ZlcnZpZXdEb2Moc3RydWN0IHNvYXAqLCB1ZGRpMl9fb3ZlcnZpZXdEb2MgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX292ZXJ2aWV3RG9jKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19vdmVydmlld0RvYyAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fb3ZlcnZpZXdEb2MgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fb3ZlcnZpZXdEb2Moc3RydWN0IHNvYXAqLCB1ZGRpMl9fb3ZlcnZpZXdEb2MgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19vdmVydmlld0RvYyAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX292ZXJ2aWV3RG9jKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19vdmVydmlld0RvYyAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fdHJ1bmNhdGVkCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fdHJ1bmNhdGVkICgxNDApCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX190cnVuY2F0ZWQoc3RydWN0IHNvYXAqLCBlbnVtIHVkZGkyX190cnVuY2F0ZWQgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX190cnVuY2F0ZWQoc3RydWN0IHNvYXAqLCBlbnVtIHVkZGkyX190cnVuY2F0ZWQgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX3RydW5jYXRlZChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCBlbnVtIHVkZGkyX190cnVuY2F0ZWQgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgZW51bSB1ZGRpMl9fdHJ1bmNhdGVkICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX3RydW5jYXRlZChzdHJ1Y3Qgc29hcCosIGVudW0gdWRkaTJfX3RydW5jYXRlZCAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgZW51bSB1ZGRpMl9fdHJ1bmNhdGVkICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fdHJ1bmNhdGVkKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGVudW0gdWRkaTJfX3RydW5jYXRlZCAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fcmVzdWx0CisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fcmVzdWx0ICgxMzgpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19yZXN1bHQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fcmVzdWx0ICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fcmVzdWx0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX3Jlc3VsdCAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fcmVzdWx0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19yZXN1bHQgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3Jlc3VsdCAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19yZXN1bHQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fcmVzdWx0ICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fcmVzdWx0ICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fcmVzdWx0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19yZXN1bHQgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2Rpc2NvdmVyeVVSTAorI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2Rpc2NvdmVyeVVSTCAoMTM2KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fZGlzY292ZXJ5VVJMKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2Rpc2NvdmVyeVVSTCAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX2Rpc2NvdmVyeVVSTChzdHJ1Y3Qgc29hcCosIHVkZGkyX19kaXNjb3ZlcnlVUkwgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2Rpc2NvdmVyeVVSTChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fZGlzY292ZXJ5VVJMICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19kaXNjb3ZlcnlVUkwgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fZGlzY292ZXJ5VVJMKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2Rpc2NvdmVyeVVSTCAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2Rpc2NvdmVyeVVSTCAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2Rpc2NvdmVyeVVSTChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fZGlzY292ZXJ5VVJMICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19jb250YWN0CisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fY29udGFjdCAoMTM0KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fY29udGFjdChzdHJ1Y3Qgc29hcCosIHVkZGkyX19jb250YWN0ICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fY29udGFjdChzdHJ1Y3Qgc29hcCosIHVkZGkyX19jb250YWN0ICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19jb250YWN0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19jb250YWN0ICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19jb250YWN0ICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX2NvbnRhY3Qoc3RydWN0IHNvYXAqLCB1ZGRpMl9fY29udGFjdCAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2NvbnRhY3QgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19jb250YWN0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19jb250YWN0ICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19hZGRyZXNzCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fYWRkcmVzcyAoMTMyKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fYWRkcmVzcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19hZGRyZXNzICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fYWRkcmVzcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19hZGRyZXNzICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19hZGRyZXNzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19hZGRyZXNzICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19hZGRyZXNzICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX2FkZHJlc3Moc3RydWN0IHNvYXAqLCB1ZGRpMl9fYWRkcmVzcyAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2FkZHJlc3MgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19hZGRyZXNzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19hZGRyZXNzICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19lbWFpbAorI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2VtYWlsICgxMzApCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19lbWFpbChzdHJ1Y3Qgc29hcCosIHVkZGkyX19lbWFpbCAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX2VtYWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2VtYWlsICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19lbWFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fZW1haWwgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2VtYWlsICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX2VtYWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2VtYWlsICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZW1haWwgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19lbWFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fZW1haWwgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3Bob25lCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fcGhvbmUgKDEyOCkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX3Bob25lKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3Bob25lICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fcGhvbmUoc3RydWN0IHNvYXAqLCB1ZGRpMl9fcGhvbmUgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX3Bob25lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19waG9uZSAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fcGhvbmUgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fcGhvbmUoc3RydWN0IHNvYXAqLCB1ZGRpMl9fcGhvbmUgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19waG9uZSAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX3Bob25lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19waG9uZSAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlICgxMjUpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc1NlcnZpY2Uoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2J1c2luZXNzU2VydmljZSAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19idXNpbmVzc1NlcnZpY2UgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2J1c2luZXNzU2VydmljZSAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc1NlcnZpY2Uoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19idXNpbmVzc1NlcnZpY2UgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZXMKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19iaW5kaW5nVGVtcGxhdGVzICgxMjQpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19iaW5kaW5nVGVtcGxhdGVzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZXMgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19iaW5kaW5nVGVtcGxhdGVzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZXMgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZXMgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZXMgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fYmluZGluZ1RlbXBsYXRlcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19iaW5kaW5nVGVtcGxhdGVzICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlcyAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZXMgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzSW5mbworI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzSW5mbyAoMTIyKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NJbmZvKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2J1c2luZXNzSW5mbyAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzSW5mbyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc0luZm8gKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fYnVzaW5lc3NJbmZvICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc0luZm8gKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NJbmZvKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2J1c2luZXNzSW5mbyAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2J1c2luZXNzSW5mbyAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fYnVzaW5lc3NJbmZvICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19zZXJ2aWNlSW5mb3MKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19zZXJ2aWNlSW5mb3MgKDEyMSkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX3NlcnZpY2VJbmZvcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19zZXJ2aWNlSW5mb3MgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19zZXJ2aWNlSW5mb3Moc3RydWN0IHNvYXAqLCB1ZGRpMl9fc2VydmljZUluZm9zICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19zZXJ2aWNlSW5mb3Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX3NlcnZpY2VJbmZvcyAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fc2VydmljZUluZm9zICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX3NlcnZpY2VJbmZvcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19zZXJ2aWNlSW5mb3MgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19zZXJ2aWNlSW5mb3MgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19zZXJ2aWNlSW5mb3Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3NlcnZpY2VJbmZvcyAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NFbnRpdHkKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc0VudGl0eSAoMTIwKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NFbnRpdHkoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYnVzaW5lc3NFbnRpdHkgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc0VudGl0eShzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc0VudGl0eSAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NFbnRpdHkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2J1c2luZXNzRW50aXR5ICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc0VudGl0eSAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc0VudGl0eShzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc0VudGl0eSAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2J1c2luZXNzRW50aXR5ICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NFbnRpdHkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2J1c2luZXNzRW50aXR5ICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19jYXRlZ29yeUJhZworI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2NhdGVnb3J5QmFnICgxMTkpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19jYXRlZ29yeUJhZyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19jYXRlZ29yeUJhZyAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX2NhdGVnb3J5QmFnKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2NhdGVnb3J5QmFnICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19jYXRlZ29yeUJhZyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fY2F0ZWdvcnlCYWcgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2NhdGVnb3J5QmFnICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX2NhdGVnb3J5QmFnKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2NhdGVnb3J5QmFnICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fY2F0ZWdvcnlCYWcgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19jYXRlZ29yeUJhZyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fY2F0ZWdvcnlCYWcgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2lkZW50aWZpZXJCYWcKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19pZGVudGlmaWVyQmFnICgxMTgpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19pZGVudGlmaWVyQmFnKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2lkZW50aWZpZXJCYWcgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19pZGVudGlmaWVyQmFnKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2lkZW50aWZpZXJCYWcgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2lkZW50aWZpZXJCYWcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2lkZW50aWZpZXJCYWcgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2lkZW50aWZpZXJCYWcgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9faWRlbnRpZmllckJhZyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19pZGVudGlmaWVyQmFnICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9faWRlbnRpZmllckJhZyAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2lkZW50aWZpZXJCYWcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2lkZW50aWZpZXJCYWcgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzU2VydmljZXMKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc1NlcnZpY2VzICgxMTcpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc1NlcnZpY2VzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2J1c2luZXNzU2VydmljZXMgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc1NlcnZpY2VzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2J1c2luZXNzU2VydmljZXMgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzU2VydmljZXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2J1c2luZXNzU2VydmljZXMgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2J1c2luZXNzU2VydmljZXMgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc1NlcnZpY2VzICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlcyAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzU2VydmljZXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2J1c2luZXNzU2VydmljZXMgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2NvbnRhY3RzCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fY29udGFjdHMgKDExNikKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX2NvbnRhY3RzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2NvbnRhY3RzICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fY29udGFjdHMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fY29udGFjdHMgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2NvbnRhY3RzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19jb250YWN0cyAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fY29udGFjdHMgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fY29udGFjdHMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fY29udGFjdHMgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19jb250YWN0cyAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2NvbnRhY3RzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19jb250YWN0cyAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fbmFtZQorI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX25hbWUgKDExNCkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX25hbWUoc3RydWN0IHNvYXAqLCB1ZGRpMl9fbmFtZSAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX25hbWUoc3RydWN0IHNvYXAqLCB1ZGRpMl9fbmFtZSAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fbmFtZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fbmFtZSAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fbmFtZSAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19uYW1lKHN0cnVjdCBzb2FwKiwgdWRkaTJfX25hbWUgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19uYW1lICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fbmFtZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fbmFtZSAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fZGlzY292ZXJ5VVJMcworI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2Rpc2NvdmVyeVVSTHMgKDExMykKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX2Rpc2NvdmVyeVVSTHMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZGlzY292ZXJ5VVJMcyAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX2Rpc2NvdmVyeVVSTHMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZGlzY292ZXJ5VVJMcyAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fZGlzY292ZXJ5VVJMcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fZGlzY292ZXJ5VVJMcyAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fZGlzY292ZXJ5VVJMcyAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19kaXNjb3ZlcnlVUkxzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2Rpc2NvdmVyeVVSTHMgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19kaXNjb3ZlcnlVUkxzICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fZGlzY292ZXJ5VVJMcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fZGlzY292ZXJ5VVJMcyAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fYmluZGluZ1RlbXBsYXRlCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fYmluZGluZ1RlbXBsYXRlICgxMTEpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19iaW5kaW5nVGVtcGxhdGUoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fYmluZGluZ1RlbXBsYXRlKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZSAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fYmluZGluZ1RlbXBsYXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19iaW5kaW5nVGVtcGxhdGUgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZSAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19iaW5kaW5nVGVtcGxhdGUoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fYmluZGluZ1RlbXBsYXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19iaW5kaW5nVGVtcGxhdGUgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2hvc3RpbmdSZWRpcmVjdG9yCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9faG9zdGluZ1JlZGlyZWN0b3IgKDExMCkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX2hvc3RpbmdSZWRpcmVjdG9yKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2hvc3RpbmdSZWRpcmVjdG9yICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9faG9zdGluZ1JlZGlyZWN0b3Ioc3RydWN0IHNvYXAqLCB1ZGRpMl9faG9zdGluZ1JlZGlyZWN0b3IgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2hvc3RpbmdSZWRpcmVjdG9yKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19ob3N0aW5nUmVkaXJlY3RvciAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9faG9zdGluZ1JlZGlyZWN0b3IgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9faG9zdGluZ1JlZGlyZWN0b3Ioc3RydWN0IHNvYXAqLCB1ZGRpMl9faG9zdGluZ1JlZGlyZWN0b3IgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19ob3N0aW5nUmVkaXJlY3RvciAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2hvc3RpbmdSZWRpcmVjdG9yKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19ob3N0aW5nUmVkaXJlY3RvciAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fYWNjZXNzUG9pbnQKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19hY2Nlc3NQb2ludCAoMTA5KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fYWNjZXNzUG9pbnQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYWNjZXNzUG9pbnQgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19hY2Nlc3NQb2ludChzdHJ1Y3Qgc29hcCosIHVkZGkyX19hY2Nlc3NQb2ludCAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fYWNjZXNzUG9pbnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2FjY2Vzc1BvaW50ICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19hY2Nlc3NQb2ludCAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19hY2Nlc3NQb2ludChzdHJ1Y3Qgc29hcCosIHVkZGkyX19hY2Nlc3NQb2ludCAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2FjY2Vzc1BvaW50ICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fYWNjZXNzUG9pbnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2FjY2Vzc1BvaW50ICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX190TW9kZWxJbnN0YW5jZURldGFpbHMKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX190TW9kZWxJbnN0YW5jZURldGFpbHMgKDEwOCkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluc3RhbmNlRGV0YWlscyhzdHJ1Y3Qgc29hcCosIHVkZGkyX190TW9kZWxJbnN0YW5jZURldGFpbHMgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX190TW9kZWxJbnN0YW5jZURldGFpbHMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fdE1vZGVsSW5zdGFuY2VEZXRhaWxzICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX190TW9kZWxJbnN0YW5jZURldGFpbHMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX3RNb2RlbEluc3RhbmNlRGV0YWlscyAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fdE1vZGVsSW5zdGFuY2VEZXRhaWxzICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluc3RhbmNlRGV0YWlscyhzdHJ1Y3Qgc29hcCosIHVkZGkyX190TW9kZWxJbnN0YW5jZURldGFpbHMgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX190TW9kZWxJbnN0YW5jZURldGFpbHMgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX190TW9kZWxJbnN0YW5jZURldGFpbHMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3RNb2RlbEluc3RhbmNlRGV0YWlscyAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fZGVzY3JpcHRpb24KKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19kZXNjcmlwdGlvbiAoMTA2KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fZGVzY3JpcHRpb24oc3RydWN0IHNvYXAqLCB1ZGRpMl9fZGVzY3JpcHRpb24gKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19kZXNjcmlwdGlvbihzdHJ1Y3Qgc29hcCosIHVkZGkyX19kZXNjcmlwdGlvbiAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fZGVzY3JpcHRpb24oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2Rlc2NyaXB0aW9uICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19kZXNjcmlwdGlvbiAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19kZXNjcmlwdGlvbihzdHJ1Y3Qgc29hcCosIHVkZGkyX19kZXNjcmlwdGlvbiAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2Rlc2NyaXB0aW9uICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fZGVzY3JpcHRpb24oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2Rlc2NyaXB0aW9uICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19rZXlzT3duZWQKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19rZXlzT3duZWQgKDEwNSkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX2tleXNPd25lZChzdHJ1Y3Qgc29hcCosIHVkZGkyX19rZXlzT3duZWQgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19rZXlzT3duZWQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fa2V5c093bmVkICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19rZXlzT3duZWQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2tleXNPd25lZCAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fa2V5c093bmVkICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX2tleXNPd25lZChzdHJ1Y3Qgc29hcCosIHVkZGkyX19rZXlzT3duZWQgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19rZXlzT3duZWQgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19rZXlzT3duZWQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2tleXNPd25lZCAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fa2V5ZWRSZWZlcmVuY2UKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19rZXllZFJlZmVyZW5jZSAoMTA0KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fa2V5ZWRSZWZlcmVuY2Uoc3RydWN0IHNvYXAqLCB1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19rZXllZFJlZmVyZW5jZShzdHJ1Y3Qgc29hcCosIHVkZGkyX19rZXllZFJlZmVyZW5jZSAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fa2V5ZWRSZWZlcmVuY2Uoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2tleWVkUmVmZXJlbmNlICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19rZXllZFJlZmVyZW5jZSAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19rZXllZFJlZmVyZW5jZShzdHJ1Y3Qgc29hcCosIHVkZGkyX19rZXllZFJlZmVyZW5jZSAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2tleWVkUmVmZXJlbmNlICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fa2V5ZWRSZWZlcmVuY2Uoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2tleWVkUmVmZXJlbmNlICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19hZGRyZXNzTGluZQorI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2FkZHJlc3NMaW5lICgxMDApCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19hZGRyZXNzTGluZShzdHJ1Y3Qgc29hcCosIHVkZGkyX19hZGRyZXNzTGluZSAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX2FkZHJlc3NMaW5lKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2FkZHJlc3NMaW5lICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19hZGRyZXNzTGluZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fYWRkcmVzc0xpbmUgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2FkZHJlc3NMaW5lICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX2FkZHJlc3NMaW5lKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2FkZHJlc3NMaW5lICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fYWRkcmVzc0xpbmUgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19hZGRyZXNzTGluZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fYWRkcmVzc0xpbmUgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX3RNb2RlbEtleQorI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX3RNb2RlbEtleSAoOTUpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF91ZGRpMl9fdE1vZGVsS2V5KHN0cnVjdCBzb2FwKiwgY2hhciAqKik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV91ZGRpMl9fdE1vZGVsS2V5KHN0cnVjdCBzb2FwKiwgY2hhciAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfdWRkaTJfX3RNb2RlbEtleShzdHJ1Y3Qgc29hcCosIGNoYXIgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX3RNb2RlbEtleShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNoYXIqY29uc3QqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGNoYXIgKiogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fdE1vZGVsS2V5KHN0cnVjdCBzb2FwKiwgY2hhciAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgY2hhciAqICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX190TW9kZWxLZXkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY2hhciAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fc2VydmljZUtleQorI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX3NlcnZpY2VLZXkgKDk0KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfdWRkaTJfX3NlcnZpY2VLZXkoc3RydWN0IHNvYXAqLCBjaGFyICoqKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX3VkZGkyX19zZXJ2aWNlS2V5KHN0cnVjdCBzb2FwKiwgY2hhciAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfdWRkaTJfX3NlcnZpY2VLZXkoc3RydWN0IHNvYXAqLCBjaGFyICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19zZXJ2aWNlS2V5KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY2hhcipjb25zdCosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgY2hhciAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19zZXJ2aWNlS2V5KHN0cnVjdCBzb2FwKiwgY2hhciAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgY2hhciAqICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19zZXJ2aWNlS2V5KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNoYXIgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX2J1c2luZXNzS2V5CisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fYnVzaW5lc3NLZXkgKDkzKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfdWRkaTJfX2J1c2luZXNzS2V5KHN0cnVjdCBzb2FwKiwgY2hhciAqKik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV91ZGRpMl9fYnVzaW5lc3NLZXkoc3RydWN0IHNvYXAqLCBjaGFyICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF91ZGRpMl9fYnVzaW5lc3NLZXkoc3RydWN0IHNvYXAqLCBjaGFyICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19idXNpbmVzc0tleShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNoYXIqY29uc3QqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGNoYXIgKiogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fYnVzaW5lc3NLZXkoc3RydWN0IHNvYXAqLCBjaGFyICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBjaGFyICogKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2J1c2luZXNzS2V5KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNoYXIgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX2JpbmRpbmdLZXkKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19iaW5kaW5nS2V5ICg5MikKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X3VkZGkyX19iaW5kaW5nS2V5KHN0cnVjdCBzb2FwKiwgY2hhciAqKik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV91ZGRpMl9fYmluZGluZ0tleShzdHJ1Y3Qgc29hcCosIGNoYXIgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X3VkZGkyX19iaW5kaW5nS2V5KHN0cnVjdCBzb2FwKiwgY2hhciAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fYmluZGluZ0tleShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNoYXIqY29uc3QqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGNoYXIgKiogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fYmluZGluZ0tleShzdHJ1Y3Qgc29hcCosIGNoYXIgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGNoYXIgKiAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fYmluZGluZ0tleShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjaGFyICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX3htbF9fbGFuZworI2RlZmluZSBTT0FQX1RZUEVfeG1sX19sYW5nICg4KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfeG1sX19sYW5nKHN0cnVjdCBzb2FwKiwgY2hhciAqKik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV94bWxfX2xhbmcoc3RydWN0IHNvYXAqLCBjaGFyICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF94bWxfX2xhbmcoc3RydWN0IHNvYXAqLCBjaGFyICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3htbF9fbGFuZyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNoYXIqY29uc3QqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGNoYXIgKiogU09BUF9GTUFDNCBzb2FwX2dldF94bWxfX2xhbmcoc3RydWN0IHNvYXAqLCBjaGFyICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBjaGFyICogKiBTT0FQX0ZNQUM0IHNvYXBfaW5feG1sX19sYW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNoYXIgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfeHNkX19OTVRPS0VOCisjZGVmaW5lIFNPQVBfVFlQRV94c2RfX05NVE9LRU4gKDcpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF94c2RfX05NVE9LRU4oc3RydWN0IHNvYXAqLCBjaGFyICoqKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX3hzZF9fTk1UT0tFTihzdHJ1Y3Qgc29hcCosIGNoYXIgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X3hzZF9fTk1UT0tFTihzdHJ1Y3Qgc29hcCosIGNoYXIgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfeHNkX19OTVRPS0VOKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY2hhcipjb25zdCosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgY2hhciAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3hzZF9fTk1UT0tFTihzdHJ1Y3Qgc29hcCosIGNoYXIgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGNoYXIgKiAqIFNPQVBfRk1BQzQgc29hcF9pbl94c2RfX05NVE9LRU4oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY2hhciAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9fUU5hbWUKKyNkZWZpbmUgU09BUF9UWVBFX19RTmFtZSAoNSkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X19RTmFtZShzdHJ1Y3Qgc29hcCosIGNoYXIgKiopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfX1FOYW1lKHN0cnVjdCBzb2FwKiwgY2hhciAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfX1FOYW1lKHN0cnVjdCBzb2FwKiwgY2hhciAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9fUU5hbWUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjaGFyKmNvbnN0KiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBjaGFyICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfX1FOYW1lKHN0cnVjdCBzb2FwKiwgY2hhciAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgY2hhciAqICogU09BUF9GTUFDNCBzb2FwX2luX19RTmFtZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjaGFyICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX3N0cmluZworI2RlZmluZSBTT0FQX1RZUEVfc3RyaW5nICgzKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfc3RyaW5nKHN0cnVjdCBzb2FwKiwgY2hhciAqKik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9zdHJpbmcoc3RydWN0IHNvYXAqLCBjaGFyICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9zdHJpbmcoc3RydWN0IHNvYXAqLCBjaGFyICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3N0cmluZyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNoYXIqY29uc3QqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGNoYXIgKiogU09BUF9GTUFDNCBzb2FwX2dldF9zdHJpbmcoc3RydWN0IHNvYXAqLCBjaGFyICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBjaGFyICogKiBTT0FQX0ZNQUM0IHNvYXBfaW5fc3RyaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNoYXIgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzRW50aXR5RXh0CisjZGVmaW5lIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQgKDMwMikKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzRW50aXR5RXh0KHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzRW50aXR5RXh0ICogPiopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19idXNpbmVzc0VudGl0eUV4dChzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc0VudGl0eUV4dCAqID4qKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzRW50aXR5RXh0KHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzRW50aXR5RXh0ICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19idXNpbmVzc0VudGl0eUV4dChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc0VudGl0eUV4dCAqID4qLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc0VudGl0eUV4dCAqID4qIFNPQVBfRk1BQzQgc29hcF9nZXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzRW50aXR5RXh0KHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzRW50aXR5RXh0ICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc0VudGl0eUV4dCAqID4qIFNPQVBfRk1BQzQgc29hcF9pbl9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzRW50aXR5RXh0ICogPiosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQgKiA+ICogU09BUF9GTUFDNiBzb2FwX25ld19zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQgKiA+Kik7CitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc0VudGl0eUV4dCAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzRW50aXR5RXh0KHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19idXNpbmVzc0VudGl0eUV4dChzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtCisjZGVmaW5lIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbSAoMzAwKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbShzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtICogPiopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW0gKiA+Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW0gKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW0oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbSAqID4qLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPHVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtICogPiogU09BUF9GTUFDNCBzb2FwX2dldF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbShzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPHVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtICogPiogU09BUF9GTUFDNCBzb2FwX2luX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHN0ZDo6dmVjdG9yPHVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtICogPiosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbSAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW0oc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbSAqID4qKTsKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8dWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW0gKiA+ICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3RNb2RlbAorI2RlZmluZSBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3RNb2RlbCAoMjg4KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fdE1vZGVsKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbCAqID4qKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fdE1vZGVsKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbCAqID4qKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3RNb2RlbChzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX190TW9kZWwgKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3RNb2RlbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX190TW9kZWwgKiA+KiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdGQ6OnZlY3Rvcjx1ZGRpMl9fdE1vZGVsICogPiogU09BUF9GTUFDNCBzb2FwX2dldF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fdE1vZGVsKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbCAqID4qLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdGQ6OnZlY3Rvcjx1ZGRpMl9fdE1vZGVsICogPiogU09BUF9GTUFDNCBzb2FwX2luX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX190TW9kZWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbCAqID4qLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbCAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX190TW9kZWwoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fdE1vZGVsKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbCAqID4qKTsKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbCAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3RNb2RlbChzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fdE1vZGVsKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzRW50aXR5CisjZGVmaW5lIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NFbnRpdHkgKDI3MikKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzRW50aXR5KHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzRW50aXR5ICogPiopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19idXNpbmVzc0VudGl0eShzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc0VudGl0eSAqID4qKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzRW50aXR5KHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzRW50aXR5ICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19idXNpbmVzc0VudGl0eShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc0VudGl0eSAqID4qLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc0VudGl0eSAqID4qIFNPQVBfRk1BQzQgc29hcF9nZXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzRW50aXR5KHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzRW50aXR5ICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc0VudGl0eSAqID4qIFNPQVBfRk1BQzQgc29hcF9pbl9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NFbnRpdHkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzRW50aXR5ICogPiosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NFbnRpdHkgKiA+ICogU09BUF9GTUFDNiBzb2FwX25ld19zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NFbnRpdHkoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NFbnRpdHkoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NFbnRpdHkgKiA+Kik7CitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc0VudGl0eSAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzRW50aXR5KHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19idXNpbmVzc0VudGl0eShzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnVkZGkyX19zZXJ2aWNlS2V5CisjZGVmaW5lIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fc2VydmljZUtleSAoMTg0KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fc2VydmljZUtleShzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0ZDo6dmVjdG9yPGNoYXIgKiA+Kik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mdWRkaTJfX3NlcnZpY2VLZXkoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3RvcjxjaGFyICogPiopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fc2VydmljZUtleShzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0ZDo6dmVjdG9yPGNoYXIgKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mdWRkaTJfX3NlcnZpY2VLZXkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdGQ6OnZlY3RvcjxjaGFyICogPiosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8Y2hhciAqID4qIFNPQVBfRk1BQzQgc29hcF9nZXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mdWRkaTJfX3NlcnZpY2VLZXkoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3RvcjxjaGFyICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPGNoYXIgKiA+KiBTT0FQX0ZNQUM0IHNvYXBfaW5fc3RkX192ZWN0b3JUZW1wbGF0ZU9mdWRkaTJfX3NlcnZpY2VLZXkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RkOjp2ZWN0b3I8Y2hhciAqID4qLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8Y2hhciAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnVkZGkyX19zZXJ2aWNlS2V5KHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mdWRkaTJfX3NlcnZpY2VLZXkoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3RvcjxjaGFyICogPiopOworU09BUF9GTUFDNSBzdGQ6OnZlY3RvcjxjaGFyICogPiAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fc2VydmljZUtleShzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fc2VydmljZUtleShzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnVkZGkyX19idXNpbmVzc0tleQorI2RlZmluZSBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mdWRkaTJfX2J1c2luZXNzS2V5ICgxNzYpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnVkZGkyX19idXNpbmVzc0tleShzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0ZDo6dmVjdG9yPGNoYXIgKiA+Kik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mdWRkaTJfX2J1c2luZXNzS2V5KHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8Y2hhciAqID4qKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mdWRkaTJfX2J1c2luZXNzS2V5KHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8Y2hhciAqID4qLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fYnVzaW5lc3NLZXkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdGQ6OnZlY3RvcjxjaGFyICogPiosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8Y2hhciAqID4qIFNPQVBfRk1BQzQgc29hcF9nZXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mdWRkaTJfX2J1c2luZXNzS2V5KHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8Y2hhciAqID4qLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdGQ6OnZlY3RvcjxjaGFyICogPiogU09BUF9GTUFDNCBzb2FwX2luX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnVkZGkyX19idXNpbmVzc0tleShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdGQ6OnZlY3RvcjxjaGFyICogPiosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSBzdGQ6OnZlY3RvcjxjaGFyICogPiAqIFNPQVBfRk1BQzYgc29hcF9uZXdfc3RkX192ZWN0b3JUZW1wbGF0ZU9mdWRkaTJfX2J1c2luZXNzS2V5KHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mdWRkaTJfX2J1c2luZXNzS2V5KHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8Y2hhciAqID4qKTsKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8Y2hhciAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mdWRkaTJfX2J1c2luZXNzS2V5KHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnVkZGkyX19idXNpbmVzc0tleShzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnVkZGkyX19iaW5kaW5nS2V5CisjZGVmaW5lIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fYmluZGluZ0tleSAoMTcwKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fYmluZGluZ0tleShzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0ZDo6dmVjdG9yPGNoYXIgKiA+Kik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mdWRkaTJfX2JpbmRpbmdLZXkoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3RvcjxjaGFyICogPiopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fYmluZGluZ0tleShzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0ZDo6dmVjdG9yPGNoYXIgKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mdWRkaTJfX2JpbmRpbmdLZXkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdGQ6OnZlY3RvcjxjaGFyICogPiosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8Y2hhciAqID4qIFNPQVBfRk1BQzQgc29hcF9nZXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mdWRkaTJfX2JpbmRpbmdLZXkoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3RvcjxjaGFyICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPGNoYXIgKiA+KiBTT0FQX0ZNQUM0IHNvYXBfaW5fc3RkX192ZWN0b3JUZW1wbGF0ZU9mdWRkaTJfX2JpbmRpbmdLZXkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RkOjp2ZWN0b3I8Y2hhciAqID4qLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8Y2hhciAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnVkZGkyX19iaW5kaW5nS2V5KHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mdWRkaTJfX2JpbmRpbmdLZXkoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3RvcjxjaGFyICogPiopOworU09BUF9GTUFDNSBzdGQ6OnZlY3RvcjxjaGFyICogPiAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fYmluZGluZ0tleShzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fYmluZGluZ0tleShzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24KKyNkZWZpbmUgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24gKDE1OCkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbihzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24gKiA+Kik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbihzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24gKiA+Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24oc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uICogPiosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbiAqID4qIFNPQVBfRk1BQzQgc29hcF9nZXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbihzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24gKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbiAqID4qIFNPQVBfRk1BQzQgc29hcF9pbl9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHN0ZDo6dmVjdG9yPHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24gKiA+KiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24gKiA+ICogU09BUF9GTUFDNiBzb2FwX25ld19zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbihzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24gKiA+Kik7CitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24gKiA+ICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24oc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbihzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX190TW9kZWxJbnN0YW5jZUluZm8KKyNkZWZpbmUgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX190TW9kZWxJbnN0YW5jZUluZm8gKDE1NSkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX190TW9kZWxJbnN0YW5jZUluZm8gKiA+Kik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyhzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX190TW9kZWxJbnN0YW5jZUluZm8gKiA+Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX190TW9kZWxJbnN0YW5jZUluZm8oc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX190TW9kZWxJbnN0YW5jZUluZm8oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvICogPiosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyAqID4qIFNPQVBfRk1BQzQgc29hcF9nZXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyhzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX190TW9kZWxJbnN0YW5jZUluZm8gKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyAqID4qIFNPQVBfRk1BQzQgc29hcF9pbl9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHN0ZDo6dmVjdG9yPHVkZGkyX190TW9kZWxJbnN0YW5jZUluZm8gKiA+KiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPHVkZGkyX190TW9kZWxJbnN0YW5jZUluZm8gKiA+ICogU09BUF9GTUFDNiBzb2FwX25ld19zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyhzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX190TW9kZWxJbnN0YW5jZUluZm8gKiA+Kik7CitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPHVkZGkyX190TW9kZWxJbnN0YW5jZUluZm8gKiA+ICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX190TW9kZWxJbnN0YW5jZUluZm8oc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX190TW9kZWxJbmZvCisjZGVmaW5lIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fdE1vZGVsSW5mbyAoMTUzKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fdE1vZGVsSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX190TW9kZWxJbmZvICogPiopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX190TW9kZWxJbmZvKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbEluZm8gKiA+Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX190TW9kZWxJbmZvKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbEluZm8gKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluZm8oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fdE1vZGVsSW5mbyAqID4qLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPHVkZGkyX190TW9kZWxJbmZvICogPiogU09BUF9GTUFDNCBzb2FwX2dldF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fdE1vZGVsSW5mbyhzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX190TW9kZWxJbmZvICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPHVkZGkyX190TW9kZWxJbmZvICogPiogU09BUF9GTUFDNCBzb2FwX2luX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX190TW9kZWxJbmZvKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHN0ZDo6dmVjdG9yPHVkZGkyX190TW9kZWxJbmZvICogPiosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSBzdGQ6OnZlY3Rvcjx1ZGRpMl9fdE1vZGVsSW5mbyAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX190TW9kZWxJbmZvKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluZm8oc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fdE1vZGVsSW5mbyAqID4qKTsKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbEluZm8gKiA+ICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX190TW9kZWxJbmZvKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX190TW9kZWxJbmZvKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mdWRkaTJfX3RNb2RlbEtleQorI2RlZmluZSBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mdWRkaTJfX3RNb2RlbEtleSAoMTUxKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fdE1vZGVsS2V5KHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8Y2hhciAqID4qKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fdE1vZGVsS2V5KHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8Y2hhciAqID4qKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mdWRkaTJfX3RNb2RlbEtleShzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0ZDo6dmVjdG9yPGNoYXIgKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mdWRkaTJfX3RNb2RlbEtleShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHN0ZDo6dmVjdG9yPGNoYXIgKiA+KiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdGQ6OnZlY3RvcjxjaGFyICogPiogU09BUF9GTUFDNCBzb2FwX2dldF9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fdE1vZGVsS2V5KHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8Y2hhciAqID4qLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdGQ6OnZlY3RvcjxjaGFyICogPiogU09BUF9GTUFDNCBzb2FwX2luX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnVkZGkyX190TW9kZWxLZXkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RkOjp2ZWN0b3I8Y2hhciAqID4qLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8Y2hhciAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnVkZGkyX190TW9kZWxLZXkoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fdE1vZGVsS2V5KHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8Y2hhciAqID4qKTsKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8Y2hhciAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mdWRkaTJfX3RNb2RlbEtleShzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fdE1vZGVsS2V5KHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3NlcnZpY2VJbmZvCisjZGVmaW5lIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fc2VydmljZUluZm8gKDE1MCkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3NlcnZpY2VJbmZvKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX3NlcnZpY2VJbmZvICogPiopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19zZXJ2aWNlSW5mbyhzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19zZXJ2aWNlSW5mbyAqID4qKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3NlcnZpY2VJbmZvKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX3NlcnZpY2VJbmZvICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19zZXJ2aWNlSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX19zZXJ2aWNlSW5mbyAqID4qLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPHVkZGkyX19zZXJ2aWNlSW5mbyAqID4qIFNPQVBfRk1BQzQgc29hcF9nZXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3NlcnZpY2VJbmZvKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX3NlcnZpY2VJbmZvICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPHVkZGkyX19zZXJ2aWNlSW5mbyAqID4qIFNPQVBfRk1BQzQgc29hcF9pbl9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fc2VydmljZUluZm8oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX3NlcnZpY2VJbmZvICogPiosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSBzdGQ6OnZlY3Rvcjx1ZGRpMl9fc2VydmljZUluZm8gKiA+ICogU09BUF9GTUFDNiBzb2FwX25ld19zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fc2VydmljZUluZm8oc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fc2VydmljZUluZm8oc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fc2VydmljZUluZm8gKiA+Kik7CitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPHVkZGkyX19zZXJ2aWNlSW5mbyAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3NlcnZpY2VJbmZvKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19zZXJ2aWNlSW5mbyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvCisjZGVmaW5lIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyAoMTQ2KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvICogPiopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8gKiA+Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8gKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyAqID4qLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPHVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvICogPiogU09BUF9GTUFDNCBzb2FwX2dldF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyhzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPHVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvICogPiogU09BUF9GTUFDNCBzb2FwX2luX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHN0ZDo6dmVjdG9yPHVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvICogPiosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8oc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyAqID4qKTsKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8dWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8gKiA+ICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMKKyNkZWZpbmUgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzICgxNDQpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMgKiA+Kik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyAqID4qKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMoc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyAqID4qLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzICogPiosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMgKiA+KiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMgKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMgKiA+KiBTT0FQX0ZNQUM0IHNvYXBfaW5fc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMgKiA+KiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPHVkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzICogPiAqIFNPQVBfRk1BQzYgc29hcF9uZXdfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyhzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzICogPiopOworU09BUF9GTUFDNSBzdGQ6OnZlY3Rvcjx1ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZzdHJpbmcKKyNkZWZpbmUgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnN0cmluZyAoMTQxKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZzdHJpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3RvcjxjaGFyICogPiopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnN0cmluZyhzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPGNoYXIgKiA+Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnN0cmluZyhzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0ZDo6dmVjdG9yPGNoYXIgKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mc3RyaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RkOjp2ZWN0b3I8Y2hhciAqID4qLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPGNoYXIgKiA+KiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnN0cmluZyhzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPGNoYXIgKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8Y2hhciAqID4qIFNPQVBfRk1BQzQgc29hcF9pbl9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZzdHJpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RkOjp2ZWN0b3I8Y2hhciAqID4qLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8Y2hhciAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnN0cmluZyhzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnN0cmluZyhzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPGNoYXIgKiA+Kik7CitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPGNoYXIgKiA+ICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnN0cmluZyhzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZzdHJpbmcoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fcmVzdWx0CisjZGVmaW5lIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fcmVzdWx0ICgxMzkpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19yZXN1bHQoc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcmVzdWx0ICogPiopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19yZXN1bHQoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcmVzdWx0ICogPiopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fcmVzdWx0KHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX3Jlc3VsdCAqID4qLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fcmVzdWx0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX3Jlc3VsdCAqID4qLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPHVkZGkyX19yZXN1bHQgKiA+KiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19yZXN1bHQoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcmVzdWx0ICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPHVkZGkyX19yZXN1bHQgKiA+KiBTT0FQX0ZNQUM0IHNvYXBfaW5fc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3Jlc3VsdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcmVzdWx0ICogPiosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcmVzdWx0ICogPiAqIFNPQVBfRk1BQzYgc29hcF9uZXdfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3Jlc3VsdChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19yZXN1bHQoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcmVzdWx0ICogPiopOworU09BUF9GTUFDNSBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcmVzdWx0ICogPiAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fcmVzdWx0KHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19yZXN1bHQoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fZGlzY292ZXJ5VVJMCisjZGVmaW5lIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fZGlzY292ZXJ5VVJMICgxMzcpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19kaXNjb3ZlcnlVUkwoc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZGlzY292ZXJ5VVJMICogPiopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19kaXNjb3ZlcnlVUkwoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZGlzY292ZXJ5VVJMICogPiopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fZGlzY292ZXJ5VVJMKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX2Rpc2NvdmVyeVVSTCAqID4qLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fZGlzY292ZXJ5VVJMKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX2Rpc2NvdmVyeVVSTCAqID4qLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPHVkZGkyX19kaXNjb3ZlcnlVUkwgKiA+KiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19kaXNjb3ZlcnlVUkwoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZGlzY292ZXJ5VVJMICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPHVkZGkyX19kaXNjb3ZlcnlVUkwgKiA+KiBTT0FQX0ZNQUM0IHNvYXBfaW5fc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2Rpc2NvdmVyeVVSTChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZGlzY292ZXJ5VVJMICogPiosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZGlzY292ZXJ5VVJMICogPiAqIFNPQVBfRk1BQzYgc29hcF9uZXdfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2Rpc2NvdmVyeVVSTChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19kaXNjb3ZlcnlVUkwoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZGlzY292ZXJ5VVJMICogPiopOworU09BUF9GTUFDNSBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZGlzY292ZXJ5VVJMICogPiAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fZGlzY292ZXJ5VVJMKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19kaXNjb3ZlcnlVUkwoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fY29udGFjdAorI2RlZmluZSBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2NvbnRhY3QgKDEzNSkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2NvbnRhY3Qoc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fY29udGFjdCAqID4qKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fY29udGFjdChzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19jb250YWN0ICogPiopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fY29udGFjdChzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX19jb250YWN0ICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19jb250YWN0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX2NvbnRhY3QgKiA+KiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdGQ6OnZlY3Rvcjx1ZGRpMl9fY29udGFjdCAqID4qIFNPQVBfRk1BQzQgc29hcF9nZXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2NvbnRhY3Qoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fY29udGFjdCAqID4qLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdGQ6OnZlY3Rvcjx1ZGRpMl9fY29udGFjdCAqID4qIFNPQVBfRk1BQzQgc29hcF9pbl9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fY29udGFjdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fY29udGFjdCAqID4qLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8dWRkaTJfX2NvbnRhY3QgKiA+ICogU09BUF9GTUFDNiBzb2FwX25ld19zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fY29udGFjdChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19jb250YWN0KHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2NvbnRhY3QgKiA+Kik7CitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPHVkZGkyX19jb250YWN0ICogPiAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fY29udGFjdChzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fY29udGFjdChzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19hZGRyZXNzCisjZGVmaW5lIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYWRkcmVzcyAoMTMzKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYWRkcmVzcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX19hZGRyZXNzICogPiopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19hZGRyZXNzKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2FkZHJlc3MgKiA+Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19hZGRyZXNzKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX2FkZHJlc3MgKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2FkZHJlc3Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYWRkcmVzcyAqID4qLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPHVkZGkyX19hZGRyZXNzICogPiogU09BUF9GTUFDNCBzb2FwX2dldF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYWRkcmVzcyhzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19hZGRyZXNzICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPHVkZGkyX19hZGRyZXNzICogPiogU09BUF9GTUFDNCBzb2FwX2luX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19hZGRyZXNzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHN0ZDo6dmVjdG9yPHVkZGkyX19hZGRyZXNzICogPiosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYWRkcmVzcyAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19hZGRyZXNzKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2FkZHJlc3Moc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYWRkcmVzcyAqID4qKTsKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8dWRkaTJfX2FkZHJlc3MgKiA+ICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19hZGRyZXNzKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19hZGRyZXNzKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2VtYWlsCisjZGVmaW5lIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fZW1haWwgKDEzMSkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2VtYWlsKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX2VtYWlsICogPiopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19lbWFpbChzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19lbWFpbCAqID4qKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2VtYWlsKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX2VtYWlsICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19lbWFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX19lbWFpbCAqID4qLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPHVkZGkyX19lbWFpbCAqID4qIFNPQVBfRk1BQzQgc29hcF9nZXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2VtYWlsKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2VtYWlsICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPHVkZGkyX19lbWFpbCAqID4qIFNPQVBfRk1BQzQgc29hcF9pbl9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fZW1haWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2VtYWlsICogPiosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZW1haWwgKiA+ICogU09BUF9GTUFDNiBzb2FwX25ld19zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fZW1haWwoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fZW1haWwoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZW1haWwgKiA+Kik7CitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPHVkZGkyX19lbWFpbCAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2VtYWlsKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19lbWFpbChzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19waG9uZQorI2RlZmluZSBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3Bob25lICgxMjkpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19waG9uZShzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX19waG9uZSAqID4qKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fcGhvbmUoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcGhvbmUgKiA+Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19waG9uZShzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX19waG9uZSAqID4qLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fcGhvbmUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcGhvbmUgKiA+KiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcGhvbmUgKiA+KiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19waG9uZShzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19waG9uZSAqID4qLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcGhvbmUgKiA+KiBTT0FQX0ZNQUM0IHNvYXBfaW5fc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3Bob25lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHN0ZDo6dmVjdG9yPHVkZGkyX19waG9uZSAqID4qLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8dWRkaTJfX3Bob25lICogPiAqIFNPQVBfRk1BQzYgc29hcF9uZXdfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3Bob25lKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3Bob25lKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX3Bob25lICogPiopOworU09BUF9GTUFDNSBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcGhvbmUgKiA+ICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19waG9uZShzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fcGhvbmUoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fa2V5ZWRSZWZlcmVuY2UKKyNkZWZpbmUgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19rZXllZFJlZmVyZW5jZSAoMTI3KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fa2V5ZWRSZWZlcmVuY2Uoc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UgKiA+Kik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2tleWVkUmVmZXJlbmNlKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2tleWVkUmVmZXJlbmNlICogPiopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fa2V5ZWRSZWZlcmVuY2Uoc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UgKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2tleWVkUmVmZXJlbmNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX2tleWVkUmVmZXJlbmNlICogPiosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX2tleWVkUmVmZXJlbmNlICogPiogU09BUF9GTUFDNCBzb2FwX2dldF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fa2V5ZWRSZWZlcmVuY2Uoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UgKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX2tleWVkUmVmZXJlbmNlICogPiogU09BUF9GTUFDNCBzb2FwX2luX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19rZXllZFJlZmVyZW5jZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UgKiA+KiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPHVkZGkyX19rZXllZFJlZmVyZW5jZSAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19rZXllZFJlZmVyZW5jZShzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19rZXllZFJlZmVyZW5jZShzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19rZXllZFJlZmVyZW5jZSAqID4qKTsKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8dWRkaTJfX2tleWVkUmVmZXJlbmNlICogPiAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fa2V5ZWRSZWZlcmVuY2Uoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2tleWVkUmVmZXJlbmNlKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzU2VydmljZQorI2RlZmluZSBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzU2VydmljZSAoMTI2KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzU2VydmljZSAqID4qKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzU2VydmljZSAqID4qKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzU2VydmljZShzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc1NlcnZpY2UgKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzU2VydmljZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc1NlcnZpY2UgKiA+KiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlICogPiogU09BUF9GTUFDNCBzb2FwX2dldF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzU2VydmljZSAqID4qLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlICogPiogU09BUF9GTUFDNCBzb2FwX2luX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19idXNpbmVzc1NlcnZpY2Uoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzU2VydmljZSAqID4qLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzU2VydmljZSAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19idXNpbmVzc1NlcnZpY2Uoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzU2VydmljZSAqID4qKTsKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzU2VydmljZSAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzU2VydmljZShzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzSW5mbworI2RlZmluZSBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzSW5mbyAoMTIzKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NJbmZvKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzSW5mbyAqID4qKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NJbmZvKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzSW5mbyAqID4qKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc0luZm8gKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc0luZm8gKiA+KiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NJbmZvICogPiogU09BUF9GTUFDNCBzb2FwX2dldF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NJbmZvKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzSW5mbyAqID4qLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NJbmZvICogPiogU09BUF9GTUFDNCBzb2FwX2luX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19idXNpbmVzc0luZm8oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzSW5mbyAqID4qLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzSW5mbyAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19idXNpbmVzc0luZm8oc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NJbmZvKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzSW5mbyAqID4qKTsKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzSW5mbyAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzSW5mbyhzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NJbmZvKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX25hbWUKKyNkZWZpbmUgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19uYW1lICgxMTUpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19uYW1lKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX25hbWUgKiA+Kik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX25hbWUoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fbmFtZSAqID4qKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX25hbWUoc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fbmFtZSAqID4qLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fbmFtZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX19uYW1lICogPiosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX25hbWUgKiA+KiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19uYW1lKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX25hbWUgKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX25hbWUgKiA+KiBTT0FQX0ZNQUM0IHNvYXBfaW5fc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX25hbWUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX25hbWUgKiA+KiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPHVkZGkyX19uYW1lICogPiAqIFNPQVBfRk1BQzYgc29hcF9uZXdfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX25hbWUoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fbmFtZShzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19uYW1lICogPiopOworU09BUF9GTUFDNSBzdGQ6OnZlY3Rvcjx1ZGRpMl9fbmFtZSAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX25hbWUoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX25hbWUoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYmluZGluZ1RlbXBsYXRlCisjZGVmaW5lIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYmluZGluZ1RlbXBsYXRlICgxMTIpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19iaW5kaW5nVGVtcGxhdGUoc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYmluZGluZ1RlbXBsYXRlICogPiopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19iaW5kaW5nVGVtcGxhdGUoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYmluZGluZ1RlbXBsYXRlICogPiopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYmluZGluZ1RlbXBsYXRlKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX2JpbmRpbmdUZW1wbGF0ZSAqID4qLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYmluZGluZ1RlbXBsYXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX2JpbmRpbmdUZW1wbGF0ZSAqID4qLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPHVkZGkyX19iaW5kaW5nVGVtcGxhdGUgKiA+KiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19iaW5kaW5nVGVtcGxhdGUoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYmluZGluZ1RlbXBsYXRlICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPHVkZGkyX19iaW5kaW5nVGVtcGxhdGUgKiA+KiBTT0FQX0ZNQUM0IHNvYXBfaW5fc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYmluZGluZ1RlbXBsYXRlICogPiosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYmluZGluZ1RlbXBsYXRlICogPiAqIFNPQVBfRk1BQzYgc29hcF9uZXdfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZShzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19iaW5kaW5nVGVtcGxhdGUoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYmluZGluZ1RlbXBsYXRlICogPiopOworU09BUF9GTUFDNSBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYmluZGluZ1RlbXBsYXRlICogPiAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYmluZGluZ1RlbXBsYXRlKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19iaW5kaW5nVGVtcGxhdGUoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fZGVzY3JpcHRpb24KKyNkZWZpbmUgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19kZXNjcmlwdGlvbiAoMTA3KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fZGVzY3JpcHRpb24oc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZGVzY3JpcHRpb24gKiA+Kik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2Rlc2NyaXB0aW9uKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2Rlc2NyaXB0aW9uICogPiopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fZGVzY3JpcHRpb24oc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZGVzY3JpcHRpb24gKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2Rlc2NyaXB0aW9uKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX2Rlc2NyaXB0aW9uICogPiosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX2Rlc2NyaXB0aW9uICogPiogU09BUF9GTUFDNCBzb2FwX2dldF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fZGVzY3JpcHRpb24oc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZGVzY3JpcHRpb24gKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX2Rlc2NyaXB0aW9uICogPiogU09BUF9GTUFDNCBzb2FwX2luX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19kZXNjcmlwdGlvbihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZGVzY3JpcHRpb24gKiA+KiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPHVkZGkyX19kZXNjcmlwdGlvbiAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19kZXNjcmlwdGlvbihzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19kZXNjcmlwdGlvbihzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19kZXNjcmlwdGlvbiAqID4qKTsKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8dWRkaTJfX2Rlc2NyaXB0aW9uICogPiAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fZGVzY3JpcHRpb24oc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2Rlc2NyaXB0aW9uKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2FkZHJlc3NMaW5lCisjZGVmaW5lIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYWRkcmVzc0xpbmUgKDEwMSkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2FkZHJlc3NMaW5lKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX2FkZHJlc3NMaW5lICogPiopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19hZGRyZXNzTGluZShzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19hZGRyZXNzTGluZSAqID4qKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2FkZHJlc3NMaW5lKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX2FkZHJlc3NMaW5lICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19hZGRyZXNzTGluZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX19hZGRyZXNzTGluZSAqID4qLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPHVkZGkyX19hZGRyZXNzTGluZSAqID4qIFNPQVBfRk1BQzQgc29hcF9nZXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2FkZHJlc3NMaW5lKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2FkZHJlc3NMaW5lICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPHVkZGkyX19hZGRyZXNzTGluZSAqID4qIFNPQVBfRk1BQzQgc29hcF9pbl9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYWRkcmVzc0xpbmUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2FkZHJlc3NMaW5lICogPiosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYWRkcmVzc0xpbmUgKiA+ICogU09BUF9GTUFDNiBzb2FwX25ld19zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYWRkcmVzc0xpbmUoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYWRkcmVzc0xpbmUoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYWRkcmVzc0xpbmUgKiA+Kik7CitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPHVkZGkyX19hZGRyZXNzTGluZSAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2FkZHJlc3NMaW5lKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19hZGRyZXNzTGluZShzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKK1NPQVBfRU5EX05BTUVTUEFDRShwdWIpCisKKyNlbmRpZgorCisvKiBFbmQgb2YgcHViSC5oICovCmRpZmYgLS1naXQgYS91ZGRpMi9wdWJsaXNoX3YyLmNwcCBiL3VkZGkyL3B1Ymxpc2hfdjIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExM2ZhZTEKLS0tIC9kZXYvbnVsbAorKysgYi91ZGRpMi9wdWJsaXNoX3YyLmNwcApAQCAtMCwwICsxLDczNCBAQAorLyoKKworcHVibGlzaF92Mi5jcHAKKworVURESSBWMiBQdWJsaXNoIEludGVyZmFjZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR3byBsaWNlbnNlczoKK0dQTCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2luY2x1ZGUgInB1YkguaCIKKyNkZWZpbmUgU09BUF9OTUFDIHN0YXRpYworI2RlZmluZSB1ZGRpSF9ICisjaW5jbHVkZSAiUHVibGlzaFNvYXAubnNtYXAiCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6YWRkX3B1Ymxpc2hlckFzc2VydGlvbnMKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM6OnVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyAgLy8gSW5pdGlhbGl6ZSB0aGlzIG9iamVjdCBhbmQgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGdTT0FQIGNvbnRleHQKKyAgc29hcF9kZWZhdWx0KHNvYXApOworCisgIHRoaXMtPmdlbmVyaWMgPSAiMi4wIjsKK30KKwordWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjp1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAgKnNvYXAsIHN0ZDo6dmVjdG9yPHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24qPiBwdWJsaXNoZXJBc3NlcnRpb25zKQoreworICAvLyBJbml0aWFsaXplIHRoaXMgb2JqZWN0IGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgZ1NPQVAgY29udGV4dAorICBzb2FwX2RlZmF1bHQoc29hcCk7CisKKyAgdGhpcy0+cHVibGlzaGVyQXNzZXJ0aW9uID0gcHVibGlzaGVyQXNzZXJ0aW9uczsKKworICB0aGlzLT5nZW5lcmljID0gIjIuMCI7Cit9CisKK3VkZGkyX19kaXNwb3NpdGlvblJlcG9ydCAqdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbykKK3sKKyAgLy8gU2V0IGF1dGhvcml6YXRpb24gdG9rZW4KKyAgdGhpcy0+YXV0aEluZm8gPSBhdXRoSW5mbzsKKworICAvLyBBbGxvY2F0ZSByZXN1bHQKKyAgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0ICpyZXN1bHQgPSBzb2FwX25ld191ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQoc29hcCwgLTEpOworCisgIC8vIEludm9rZSB0aGUgd3JhcHBlcgorICBzb2FwX3NldF9uYW1lc3BhY2VzKHNvYXAsIG5hbWVzcGFjZXMpOworICBpZiAoc29hcF9jYWxsX19fcHViMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc29hcCwgZW5kcG9pbnQsIE5VTEwsIHRoaXMsIHJlc3VsdCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30gCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6ZGVsZXRlX2JpbmRpbmcKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmc6OnVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyAgLy8gSW5pdGlhbGl6ZSB0aGlzIG9iamVjdCBhbmQgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGdTT0FQIGNvbnRleHQKKyAgc29hcF9kZWZhdWx0KHNvYXApOworCisgIHRoaXMtPmdlbmVyaWMgPSAiMi4wIjsKK30KKwordWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nOjp1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmJpbmRpbmdLZXkpCit7CisgIC8vIEluaXRpYWxpemUgdGhpcyBvYmplY3QgYW5kIGFzc29jaWF0ZSBpdCB3aXRoIHRoZSBnU09BUCBjb250ZXh0CisgIHNvYXBfZGVmYXVsdChzb2FwKTsKKworICB0aGlzLT5iaW5kaW5nS2V5LnB1c2hfYmFjayhzb2FwX3N0cmR1cChzb2FwLCBiaW5kaW5nS2V5KSk7CisKKyAgdGhpcy0+Z2VuZXJpYyA9ICIyLjAiOworfQorCit1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmc6OnVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8Y2hhcio+IGJpbmRpbmdLZXlzKQoreworICAvLyBJbml0aWFsaXplIHRoaXMgb2JqZWN0IGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgZ1NPQVAgY29udGV4dAorICBzb2FwX2RlZmF1bHQoc29hcCk7CisKKyAgdGhpcy0+YmluZGluZ0tleSA9IGJpbmRpbmdLZXlzOworCisgIHRoaXMtPmdlbmVyaWMgPSAiMi4wIjsKK30KKwordWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0ICp1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmc6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKQoreworICAvLyBTZXQgYXV0aG9yaXphdGlvbiB0b2tlbgorICB0aGlzLT5hdXRoSW5mbyA9IGF1dGhJbmZvOworCisgIC8vIEFsbG9jYXRlIHJlc3VsdAorICB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgKnJlc3VsdCA9IHNvYXBfbmV3X3VkZGkyX19kaXNwb3NpdGlvblJlcG9ydChzb2FwLCAtMSk7CisKKyAgLy8gSW52b2tlIHRoZSB3cmFwcGVyCisgIHNvYXBfc2V0X25hbWVzcGFjZXMoc29hcCwgbmFtZXNwYWNlcyk7CisgIGlmIChzb2FwX2NhbGxfX19wdWIyX19kZWxldGVfVVNDT1JFYmluZGluZyhzb2FwLCBlbmRwb2ludCwgTlVMTCwgdGhpcywgcmVzdWx0KSkKKyAgICByZXR1cm4gTlVMTDsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOmRlbGV0ZV9idXNpbmVzcworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3VkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3M6OnVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAgKnNvYXApCit7CisgIC8vIEluaXRpYWxpemUgdGhpcyBvYmplY3QgYW5kIGFzc29jaWF0ZSBpdCB3aXRoIHRoZSBnU09BUCBjb250ZXh0CisgIHNvYXBfZGVmYXVsdChzb2FwKTsKKworICB0aGlzLT5nZW5lcmljID0gIjIuMCI7Cit9CisKK3VkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3M6OnVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmJ1c2luZXNzS2V5KQoreworICAvLyBJbml0aWFsaXplIHRoaXMgb2JqZWN0IGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgZ1NPQVAgY29udGV4dAorICBzb2FwX2RlZmF1bHQoc29hcCk7CisKKyAgdGhpcy0+YnVzaW5lc3NLZXkucHVzaF9iYWNrKHNvYXBfc3RyZHVwKHNvYXAsIGJ1c2luZXNzS2V5KSk7CisKKyAgdGhpcy0+Z2VuZXJpYyA9ICIyLjAiOworfQorCit1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzOjp1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3RvcjxjaGFyKj4gYnVzaW5lc3NLZXlzKQoreworICAvLyBJbml0aWFsaXplIHRoaXMgb2JqZWN0IGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgZ1NPQVAgY29udGV4dAorICBzb2FwX2RlZmF1bHQoc29hcCk7CisKKyAgdGhpcy0+YnVzaW5lc3NLZXkgPSBidXNpbmVzc0tleXM7CisKKyAgdGhpcy0+Z2VuZXJpYyA9ICIyLjAiOworfQorCit1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgKnVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3M6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKQoreworICAvLyBTZXQgYXV0aG9yaXphdGlvbiB0b2tlbgorICB0aGlzLT5hdXRoSW5mbyA9IGF1dGhJbmZvOworCisgIC8vIEFsbG9jYXRlIHJlc3VsdAorICB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgKnJlc3VsdCA9IHNvYXBfbmV3X3VkZGkyX19kaXNwb3NpdGlvblJlcG9ydChzb2FwLCAtMSk7CisKKyAgLy8gSW52b2tlIHRoZSB3cmFwcGVyCisgIHNvYXBfc2V0X25hbWVzcGFjZXMoc29hcCwgbmFtZXNwYWNlcyk7CisgIGlmIChzb2FwX2NhbGxfX19wdWIyX19kZWxldGVfVVNDT1JFYnVzaW5lc3Moc29hcCwgZW5kcG9pbnQsIE5VTEwsIHRoaXMsIHJlc3VsdCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpkZWxldGVfc2VydmljZQorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3VkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZTo6dWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwICpzb2FwKQoreworICAvLyBJbml0aWFsaXplIHRoaXMgb2JqZWN0IGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgZ1NPQVAgY29udGV4dAorICBzb2FwX2RlZmF1bHQoc29hcCk7CisKKyAgdGhpcy0+Z2VuZXJpYyA9ICIyLjAiOworfQorCit1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2U6OnVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqc2VydmljZUtleSkKK3sKKyAgLy8gSW5pdGlhbGl6ZSB0aGlzIG9iamVjdCBhbmQgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGdTT0FQIGNvbnRleHQKKyAgc29hcF9kZWZhdWx0KHNvYXApOworCisgIHRoaXMtPnNlcnZpY2VLZXkucHVzaF9iYWNrKHNvYXBfc3RyZHVwKHNvYXAsIHNlcnZpY2VLZXkpKTsKKworICB0aGlzLT5nZW5lcmljID0gIjIuMCI7Cit9CisKK3VkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZTo6dWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3RvcjxjaGFyKj4gc2VydmljZUtleXMpCit7CisgIC8vIEluaXRpYWxpemUgdGhpcyBvYmplY3QgYW5kIGFzc29jaWF0ZSBpdCB3aXRoIHRoZSBnU09BUCBjb250ZXh0CisgIHNvYXBfZGVmYXVsdChzb2FwKTsKKworICB0aGlzLT5zZXJ2aWNlS2V5ID0gc2VydmljZUtleXM7CisKKyAgdGhpcy0+Z2VuZXJpYyA9ICIyLjAiOworfQorCit1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgKnVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZTo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pCit7CisgIC8vIFNldCBhdXRob3JpemF0aW9uIHRva2VuCisgIHRoaXMtPmF1dGhJbmZvID0gYXV0aEluZm87CisKKyAgLy8gQWxsb2NhdGUgcmVzdWx0CisgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCAqcmVzdWx0ID0gc29hcF9uZXdfdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0KHNvYXAsIC0xKTsKKworICAvLyBJbnZva2UgdGhlIHdyYXBwZXIKKyAgc29hcF9zZXRfbmFtZXNwYWNlcyhzb2FwLCBuYW1lc3BhY2VzKTsKKyAgaWYgKHNvYXBfY2FsbF9fX3B1YjJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlKHNvYXAsIGVuZHBvaW50LCBOVUxMLCB0aGlzLCByZXN1bHQpKQorICAgIHJldHVybiBOVUxMOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6ZGVsZXRlX3RNb2RlbAorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3VkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsOjp1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyAgLy8gSW5pdGlhbGl6ZSB0aGlzIG9iamVjdCBhbmQgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGdTT0FQIGNvbnRleHQKKyAgc29hcF9kZWZhdWx0KHNvYXApOworCisgIHRoaXMtPmdlbmVyaWMgPSAiMi4wIjsKK30KKwordWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWw6OnVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0TW9kZWxLZXkpCit7CisgIC8vIEluaXRpYWxpemUgdGhpcyBvYmplY3QgYW5kIGFzc29jaWF0ZSBpdCB3aXRoIHRoZSBnU09BUCBjb250ZXh0CisgIHNvYXBfZGVmYXVsdChzb2FwKTsKKworICB0aGlzLT50TW9kZWxLZXkucHVzaF9iYWNrKHNvYXBfc3RyZHVwKHNvYXAsIHRNb2RlbEtleSkpOworCisgIHRoaXMtPmdlbmVyaWMgPSAiMi4wIjsKK30KKwordWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWw6OnVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3RvcjxjaGFyKj4gdE1vZGVsS2V5cykKK3sKKyAgLy8gSW5pdGlhbGl6ZSB0aGlzIG9iamVjdCBhbmQgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGdTT0FQIGNvbnRleHQKKyAgc29hcF9kZWZhdWx0KHNvYXApOworCisgIHRoaXMtPnRNb2RlbEtleSA9IHRNb2RlbEtleXM7CisKKyAgdGhpcy0+Z2VuZXJpYyA9ICIyLjAiOworfQorCit1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgKnVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbykKK3sKKyAgLy8gU2V0IGF1dGhvcml6YXRpb24gdG9rZW4KKyAgdGhpcy0+YXV0aEluZm8gPSBhdXRoSW5mbzsKKworICAvLyBBbGxvY2F0ZSByZXN1bHQKKyAgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0ICpyZXN1bHQgPSBzb2FwX25ld191ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQoc29hcCwgLTEpOworCisgIC8vIEludm9rZSB0aGUgd3JhcHBlcgorICBzb2FwX3NldF9uYW1lc3BhY2VzKHNvYXAsIG5hbWVzcGFjZXMpOworICBpZiAoc29hcF9jYWxsX19fcHViMl9fZGVsZXRlX1VTQ09SRXRNb2RlbChzb2FwLCBlbmRwb2ludCwgTlVMTCwgdGhpcywgcmVzdWx0KSkKKyAgICByZXR1cm4gTlVMTDsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOmRlbGV0ZV9wdWJsaXNoZXJBc3NlcnRpb25zCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjp1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAgKnNvYXApCit7CisgIC8vIEluaXRpYWxpemUgdGhpcyBvYmplY3QgYW5kIGFzc29jaWF0ZSBpdCB3aXRoIHRoZSBnU09BUCBjb250ZXh0CisgIHNvYXBfZGVmYXVsdChzb2FwKTsKKworICB0aGlzLT5nZW5lcmljID0gIjIuMCI7Cit9CisKK3VkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczo6dWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKj4gcHVibGlzaGVyQXNzZXJ0aW9ucykKK3sKKyAgLy8gSW5pdGlhbGl6ZSB0aGlzIG9iamVjdCBhbmQgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGdTT0FQIGNvbnRleHQKKyAgc29hcF9kZWZhdWx0KHNvYXApOworCisgIHRoaXMtPnB1Ymxpc2hlckFzc2VydGlvbiA9IHB1Ymxpc2hlckFzc2VydGlvbnM7CisKKyAgdGhpcy0+Z2VuZXJpYyA9ICIyLjAiOworfQorCit1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgKnVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pCit7CisgIC8vIFNldCBhdXRob3JpemF0aW9uIHRva2VuCisgIHRoaXMtPmF1dGhJbmZvID0gYXV0aEluZm87CisKKyAgLy8gQWxsb2NhdGUgcmVzdWx0CisgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCAqcmVzdWx0ID0gc29hcF9uZXdfdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0KHNvYXAsIC0xKTsKKworICAvLyBJbnZva2UgdGhlIHdyYXBwZXIKKyAgc29hcF9zZXRfbmFtZXNwYWNlcyhzb2FwLCBuYW1lc3BhY2VzKTsKKyAgaWYgKHNvYXBfY2FsbF9fX3B1YjJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHNvYXAsIGVuZHBvaW50LCBOVUxMLCB0aGlzLCByZXN1bHQpKQorICAgIHJldHVybiBOVUxMOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6ZGlzY2FyZF9hdXRoVG9rZW4KKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW46OnVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyAgLy8gSW5pdGlhbGl6ZSB0aGlzIG9iamVjdCBhbmQgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGdTT0FQIGNvbnRleHQKKyAgc29hcF9kZWZhdWx0KHNvYXApOworCisgIHRoaXMtPmdlbmVyaWMgPSAiMi4wIjsKK30KKwordWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuOjp1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmF1dGhJbmZvKQoreworICAvLyBJbml0aWFsaXplIHRoaXMgb2JqZWN0IGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgZ1NPQVAgY29udGV4dAorICBzb2FwX2RlZmF1bHQoc29hcCk7CisKKyAgdGhpcy0+YXV0aEluZm8gPSBzb2FwX3N0cmR1cChzb2FwLCBhdXRoSW5mbyk7CisKKyAgdGhpcy0+Z2VuZXJpYyA9ICIyLjAiOworfQorCit1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgKnVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbjo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCkKK3sKKyAgLy8gQWxsb2NhdGUgcmVzdWx0CisgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCAqcmVzdWx0ID0gc29hcF9uZXdfdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0KHNvYXAsIC0xKTsKKworICAvLyBJbnZva2UgdGhlIHdyYXBwZXIKKyAgc29hcF9zZXRfbmFtZXNwYWNlcyhzb2FwLCBuYW1lc3BhY2VzKTsKKyAgaWYgKHNvYXBfY2FsbF9fX3B1YjJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuKHNvYXAsIGVuZHBvaW50LCBOVUxMLCB0aGlzLCByZXN1bHQpKQorICAgIHJldHVybiBOVUxMOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6Z2V0X2Fzc2VydGlvblN0YXR1c1JlcG9ydAorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3VkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0Ojp1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyAgLy8gSW5pdGlhbGl6ZSB0aGlzIG9iamVjdCBhbmQgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGdTT0FQIGNvbnRleHQKKyAgc29hcF9kZWZhdWx0KHNvYXApOworCisgIHRoaXMtPmdlbmVyaWMgPSAiMi4wIjsKK30KKwordWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQ6OnVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpjb21wbGV0aW9uU3RhdHVzKQoreworICAvLyBJbml0aWFsaXplIHRoaXMgb2JqZWN0IGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgZ1NPQVAgY29udGV4dAorICBzb2FwX2RlZmF1bHQoc29hcCk7CisKKyAgdGhpcy0+Y29tcGxldGlvblN0YXR1cyA9IHNvYXBfc3RyZHVwKHNvYXAsIGNvbXBsZXRpb25TdGF0dXMpOworCisgIHRoaXMtPmdlbmVyaWMgPSAiMi4wIjsKK30KKwordWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydCAqdWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQ6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKQoreworICAvLyBTZXQgYXV0aG9yaXphdGlvbiB0b2tlbgorICB0aGlzLT5hdXRoSW5mbyA9IGF1dGhJbmZvOworCisgIC8vIEFsbG9jYXRlIHJlc3VsdAorICB1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0ICpyZXN1bHQgPSBzb2FwX25ld191ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KHNvYXAsIC0xKTsKKworICAvLyBJbnZva2UgdGhlIHdyYXBwZXIKKyAgc29hcF9zZXRfbmFtZXNwYWNlcyhzb2FwLCBuYW1lc3BhY2VzKTsKKyAgaWYgKHNvYXBfY2FsbF9fX3B1YjJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQoc29hcCwgZW5kcG9pbnQsIE5VTEwsIHRoaXMsIHJlc3VsdCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpnZXRfYXV0aFRva2VuCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW46OnVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwICpzb2FwKQoreworICAvLyBJbml0aWFsaXplIHRoaXMgb2JqZWN0IGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgZ1NPQVAgY29udGV4dAorICBzb2FwX2RlZmF1bHQoc29hcCk7CisKKyAgdGhpcy0+Z2VuZXJpYyA9ICIyLjAiOworfQorCit1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbjo6dWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW4oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnVzZXJpZCwgY29uc3QgY2hhciAqcGFzc3dkKQoreworICAvLyBJbml0aWFsaXplIHRoaXMgb2JqZWN0IGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgZ1NPQVAgY29udGV4dAorICBzb2FwX2RlZmF1bHQoc29hcCk7CisKKyAgdGhpcy0+dXNlcklEID0gc29hcF9zdHJkdXAoc29hcCwgdXNlcmlkKTsKKyAgdGhpcy0+Y3JlZCA9IHNvYXBfc3RyZHVwKHNvYXAsIHBhc3N3ZCk7CisKKyAgdGhpcy0+Z2VuZXJpYyA9ICIyLjAiOworfQorCit1ZGRpMl9fYXV0aFRva2VuICp1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbjo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCkKK3sKKyAgLy8gQWxsb2NhdGUgcmVzdWx0CisgIHVkZGkyX19hdXRoVG9rZW4gKnJlc3VsdCA9IHNvYXBfbmV3X3VkZGkyX19hdXRoVG9rZW4oc29hcCwgLTEpOworCisgIC8vIEludm9rZSB0aGUgd3JhcHBlcgorICBzb2FwX3NldF9uYW1lc3BhY2VzKHNvYXAsIG5hbWVzcGFjZXMpOworICBpZiAoc29hcF9jYWxsX19fcHViMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbihzb2FwLCBlbmRwb2ludCwgTlVMTCwgdGhpcywgcmVzdWx0KSkKKyAgICByZXR1cm4gTlVMTDsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOmdldF9wdWJsaXNoZXJBc3NlcnRpb25zCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjp1ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAgKnNvYXApCit7CisgIC8vIEluaXRpYWxpemUgdGhpcyBvYmplY3QgYW5kIGFzc29jaWF0ZSBpdCB3aXRoIHRoZSBnU09BUCBjb250ZXh0CisgIHNvYXBfZGVmYXVsdChzb2FwKTsKKworICB0aGlzLT5nZW5lcmljID0gIjIuMCI7Cit9CisKK3VkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zICp1ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKQoreworICAvLyBTZXQgYXV0aG9yaXphdGlvbiB0b2tlbgorICB0aGlzLT5hdXRoSW5mbyA9IGF1dGhJbmZvOworCisgIC8vIEFsbG9jYXRlIHJlc3VsdAorICB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9ucyAqcmVzdWx0ID0gc29hcF9uZXdfdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMoc29hcCwgLTEpOworCisgIC8vIEludm9rZSB0aGUgd3JhcHBlcgorICBzb2FwX3NldF9uYW1lc3BhY2VzKHNvYXAsIG5hbWVzcGFjZXMpOworICBpZiAoc29hcF9jYWxsX19fcHViMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc29hcCwgZW5kcG9pbnQsIE5VTEwsIHRoaXMsIHJlc3VsdCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpnZXRfcmVnaXN0ZXJlZEluZm8KKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit1ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvOjp1ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvKHN0cnVjdCBzb2FwICpzb2FwKQoreworICAvLyBJbml0aWFsaXplIHRoaXMgb2JqZWN0IGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgZ1NPQVAgY29udGV4dAorICBzb2FwX2RlZmF1bHQoc29hcCk7CisKKyAgdGhpcy0+Z2VuZXJpYyA9ICIyLjAiOworfQorCit1ZGRpMl9fcmVnaXN0ZXJlZEluZm8gKnVkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm86OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKQoreworICAvLyBTZXQgYXV0aG9yaXphdGlvbiB0b2tlbgorICB0aGlzLT5hdXRoSW5mbyA9IGF1dGhJbmZvOworCisgIC8vIEFsbG9jYXRlIHJlc3VsdAorICB1ZGRpMl9fcmVnaXN0ZXJlZEluZm8gKnJlc3VsdCA9IHNvYXBfbmV3X3VkZGkyX19yZWdpc3RlcmVkSW5mbyhzb2FwLCAtMSk7CisKKyAgLy8gSW52b2tlIHRoZSB3cmFwcGVyCisgIHNvYXBfc2V0X25hbWVzcGFjZXMoc29hcCwgbmFtZXNwYWNlcyk7CisgIGlmIChzb2FwX2NhbGxfX19wdWIyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8oc29hcCwgZW5kcG9pbnQsIE5VTEwsIHRoaXMsIHJlc3VsdCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpzYXZlX2JpbmRpbmcKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nOjp1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwICpzb2FwKQoreworICAvLyBJbml0aWFsaXplIHRoaXMgb2JqZWN0IGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgZ1NPQVAgY29udGV4dAorICBzb2FwX2RlZmF1bHQoc29hcCk7CisKKyAgdGhpcy0+Z2VuZXJpYyA9ICIyLjAiOworfQorCit1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nOjp1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwICpzb2FwLCB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlICZiaW5kaW5nVGVtcGxhdGUpCit7CisgIC8vIEluaXRpYWxpemUgdGhpcyBvYmplY3QgYW5kIGFzc29jaWF0ZSBpdCB3aXRoIHRoZSBnU09BUCBjb250ZXh0CisgIHNvYXBfZGVmYXVsdChzb2FwKTsKKworICB0aGlzLT5iaW5kaW5nVGVtcGxhdGUucHVzaF9iYWNrKCZiaW5kaW5nVGVtcGxhdGUpOworCisgIHRoaXMtPmdlbmVyaWMgPSAiMi4wIjsKK30KKwordWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZzo6dWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8dWRkaTJfX2JpbmRpbmdUZW1wbGF0ZSo+IGJpbmRpbmdUZW1wbGF0ZXMpCit7CisgIC8vIEluaXRpYWxpemUgdGhpcyBvYmplY3QgYW5kIGFzc29jaWF0ZSBpdCB3aXRoIHRoZSBnU09BUCBjb250ZXh0CisgIHNvYXBfZGVmYXVsdChzb2FwKTsKKworICB0aGlzLT5iaW5kaW5nVGVtcGxhdGUgPSBiaW5kaW5nVGVtcGxhdGVzOworCisgIHRoaXMtPmdlbmVyaWMgPSAiMi4wIjsKK30KKwordWRkaTJfX2JpbmRpbmdEZXRhaWwgKnVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmc6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKQoreworICAvLyBTZXQgYXV0aG9yaXphdGlvbiB0b2tlbgorICB0aGlzLT5hdXRoSW5mbyA9IGF1dGhJbmZvOworCisgIC8vIEFsbG9jYXRlIHJlc3VsdAorICB1ZGRpMl9fYmluZGluZ0RldGFpbCAqcmVzdWx0ID0gc29hcF9uZXdfdWRkaTJfX2JpbmRpbmdEZXRhaWwoc29hcCwgLTEpOworCisgIC8vIEludm9rZSB0aGUgd3JhcHBlcgorICBzb2FwX3NldF9uYW1lc3BhY2VzKHNvYXAsIG5hbWVzcGFjZXMpOworICBpZiAoc29hcF9jYWxsX19fcHViMl9fc2F2ZV9VU0NPUkViaW5kaW5nKHNvYXAsIGVuZHBvaW50LCBOVUxMLCB0aGlzLCByZXN1bHQpKQorICAgIHJldHVybiBOVUxMOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6c2F2ZV9idXNpbmVzcworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3VkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzOjp1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyAgLy8gSW5pdGlhbGl6ZSB0aGlzIG9iamVjdCBhbmQgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGdTT0FQIGNvbnRleHQKKyAgc29hcF9kZWZhdWx0KHNvYXApOworCisgIHRoaXMtPmdlbmVyaWMgPSAiMi4wIjsKK30KKwordWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M6OnVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwICpzb2FwLCB1ZGRpMl9fYnVzaW5lc3NFbnRpdHkgJmJ1c2luZXNzRW50aXR5KQoreworICAvLyBJbml0aWFsaXplIHRoaXMgb2JqZWN0IGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgZ1NPQVAgY29udGV4dAorICBzb2FwX2RlZmF1bHQoc29hcCk7CisKKyAgdGhpcy0+YnVzaW5lc3NFbnRpdHkucHVzaF9iYWNrKCZidXNpbmVzc0VudGl0eSk7CisKKyAgdGhpcy0+Z2VuZXJpYyA9ICIyLjAiOworfQorCit1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzczo6dWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAgKnNvYXAsIHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc0VudGl0eSo+IGJ1c2luZXNzRW50aXRpZXMpCit7CisgIC8vIEluaXRpYWxpemUgdGhpcyBvYmplY3QgYW5kIGFzc29jaWF0ZSBpdCB3aXRoIHRoZSBnU09BUCBjb250ZXh0CisgIHNvYXBfZGVmYXVsdChzb2FwKTsKKworICB0aGlzLT5idXNpbmVzc0VudGl0eSA9IGJ1c2luZXNzRW50aXRpZXM7CisKKyAgdGhpcy0+Z2VuZXJpYyA9ICIyLjAiOworfQorCit1ZGRpMl9fYnVzaW5lc3NEZXRhaWwgKnVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbykKK3sKKyAgLy8gU2V0IGF1dGhvcml6YXRpb24gdG9rZW4KKyAgdGhpcy0+YXV0aEluZm8gPSBhdXRoSW5mbzsKKworICAvLyBBbGxvY2F0ZSByZXN1bHQKKyAgdWRkaTJfX2J1c2luZXNzRGV0YWlsICpyZXN1bHQgPSBzb2FwX25ld191ZGRpMl9fYnVzaW5lc3NEZXRhaWwoc29hcCwgLTEpOworCisgIC8vIEludm9rZSB0aGUgd3JhcHBlcgorICBzb2FwX3NldF9uYW1lc3BhY2VzKHNvYXAsIG5hbWVzcGFjZXMpOworICBpZiAoc29hcF9jYWxsX19fcHViMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyhzb2FwLCBlbmRwb2ludCwgTlVMTCwgdGhpcywgcmVzdWx0KSkKKyAgICByZXR1cm4gTlVMTDsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOnNhdmVfc2VydmljZQorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3VkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2U6OnVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAgKnNvYXApCit7CisgIC8vIEluaXRpYWxpemUgdGhpcyBvYmplY3QgYW5kIGFzc29jaWF0ZSBpdCB3aXRoIHRoZSBnU09BUCBjb250ZXh0CisgIHNvYXBfZGVmYXVsdChzb2FwKTsKKworICB0aGlzLT5nZW5lcmljID0gIjIuMCI7Cit9CisKK3VkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2U6OnVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAgKnNvYXAsIHVkZGkyX19idXNpbmVzc1NlcnZpY2UgJmJ1c2luZXNzU2VydmljZSkKK3sKKyAgLy8gSW5pdGlhbGl6ZSB0aGlzIG9iamVjdCBhbmQgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGdTT0FQIGNvbnRleHQKKyAgc29hcF9kZWZhdWx0KHNvYXApOworCisgIHRoaXMtPmJ1c2luZXNzU2VydmljZS5wdXNoX2JhY2soJmJ1c2luZXNzU2VydmljZSk7CisKKyAgdGhpcy0+Z2VuZXJpYyA9ICIyLjAiOworfQorCit1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlOjp1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlKj4gYnVzaW5lc3NTZXJ2aWNlcykKK3sKKyAgLy8gSW5pdGlhbGl6ZSB0aGlzIG9iamVjdCBhbmQgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGdTT0FQIGNvbnRleHQKKyAgc29hcF9kZWZhdWx0KHNvYXApOworCisgIHRoaXMtPmJ1c2luZXNzU2VydmljZSA9IGJ1c2luZXNzU2VydmljZXM7CisKKyAgdGhpcy0+Z2VuZXJpYyA9ICIyLjAiOworfQorCit1ZGRpMl9fc2VydmljZURldGFpbCAqdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZTo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pCit7CisgIC8vIFNldCBhdXRob3JpemF0aW9uIHRva2VuCisgIHRoaXMtPmF1dGhJbmZvID0gYXV0aEluZm87CisKKyAgLy8gQWxsb2NhdGUgcmVzdWx0CisgIHVkZGkyX19zZXJ2aWNlRGV0YWlsICpyZXN1bHQgPSBzb2FwX25ld191ZGRpMl9fc2VydmljZURldGFpbChzb2FwLCAtMSk7CisKKyAgLy8gSW52b2tlIHRoZSB3cmFwcGVyCisgIHNvYXBfc2V0X25hbWVzcGFjZXMoc29hcCwgbmFtZXNwYWNlcyk7CisgIGlmIChzb2FwX2NhbGxfX19wdWIyX19zYXZlX1VTQ09SRXNlcnZpY2Uoc29hcCwgZW5kcG9pbnQsIE5VTEwsIHRoaXMsIHJlc3VsdCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpzYXZlX3RNb2RlbAorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3VkZGkyX19zYXZlX1VTQ09SRXRNb2RlbDo6dWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwICpzb2FwKQoreworICAvLyBJbml0aWFsaXplIHRoaXMgb2JqZWN0IGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgZ1NPQVAgY29udGV4dAorICBzb2FwX2RlZmF1bHQoc29hcCk7CisKKyAgdGhpcy0+Z2VuZXJpYyA9ICIyLjAiOworfQorCit1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWw6OnVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCAqc29hcCwgdWRkaTJfX3RNb2RlbCAmdE1vZGVsKQoreworICAvLyBJbml0aWFsaXplIHRoaXMgb2JqZWN0IGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgZ1NPQVAgY29udGV4dAorICBzb2FwX2RlZmF1bHQoc29hcCk7CisKKyAgdGhpcy0+dE1vZGVsLnB1c2hfYmFjaygmdE1vZGVsKTsKKworICB0aGlzLT5nZW5lcmljID0gIjIuMCI7Cit9CisKK3VkZGkyX19zYXZlX1VTQ09SRXRNb2RlbDo6dWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fdE1vZGVsKj4gdE1vZGVscykKK3sKKyAgLy8gSW5pdGlhbGl6ZSB0aGlzIG9iamVjdCBhbmQgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGdTT0FQIGNvbnRleHQKKyAgc29hcF9kZWZhdWx0KHNvYXApOworCisgIHRoaXMtPnRNb2RlbCA9IHRNb2RlbHM7CisKKyAgdGhpcy0+Z2VuZXJpYyA9ICIyLjAiOworfQorCit1ZGRpMl9fdE1vZGVsRGV0YWlsICp1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWw6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKQoreworICAvLyBTZXQgYXV0aG9yaXphdGlvbiB0b2tlbgorICB0aGlzLT5hdXRoSW5mbyA9IGF1dGhJbmZvOworCisgIC8vIEFsbG9jYXRlIHJlc3VsdAorICB1ZGRpMl9fdE1vZGVsRGV0YWlsICpyZXN1bHQgPSBzb2FwX25ld191ZGRpMl9fdE1vZGVsRGV0YWlsKHNvYXAsIC0xKTsKKworICAvLyBJbnZva2UgdGhlIHdyYXBwZXIKKyAgc29hcF9zZXRfbmFtZXNwYWNlcyhzb2FwLCBuYW1lc3BhY2VzKTsKKyAgaWYgKHNvYXBfY2FsbF9fX3B1YjJfX3NhdmVfVVNDT1JFdE1vZGVsKHNvYXAsIGVuZHBvaW50LCBOVUxMLCB0aGlzLCByZXN1bHQpKQorICAgIHJldHVybiBOVUxMOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6c2V0X3B1Ymxpc2hlckFzc2VydGlvbnMKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM6OnVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCAqc29hcCkKK3sKKyAgLy8gSW5pdGlhbGl6ZSB0aGlzIG9iamVjdCBhbmQgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGdTT0FQIGNvbnRleHQKKyAgc29hcF9kZWZhdWx0KHNvYXApOworCisgIHRoaXMtPmdlbmVyaWMgPSAiMi4wIjsKK30KKwordWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjp1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAgKnNvYXAsIHN0ZDo6dmVjdG9yPHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24qPiBwdWJsaXNoZXJBc3NlcnRpb25zKQoreworICAvLyBJbml0aWFsaXplIHRoaXMgb2JqZWN0IGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgZ1NPQVAgY29udGV4dAorICBzb2FwX2RlZmF1bHQoc29hcCk7CisKKyAgdGhpcy0+cHVibGlzaGVyQXNzZXJ0aW9uID0gcHVibGlzaGVyQXNzZXJ0aW9uczsKKworICB0aGlzLT5nZW5lcmljID0gIjIuMCI7Cit9CisKK3VkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zICp1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKQoreworICAvLyBTZXQgYXV0aG9yaXphdGlvbiB0b2tlbgorICB0aGlzLT5hdXRoSW5mbyA9IGF1dGhJbmZvOworCisgIC8vIEFsbG9jYXRlIHJlc3VsdAorICB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9ucyAqcmVzdWx0ID0gc29hcF9uZXdfdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMoc29hcCwgLTEpOworCisgIC8vIEludm9rZSB0aGUgd3JhcHBlcgorICBzb2FwX3NldF9uYW1lc3BhY2VzKHNvYXAsIG5hbWVzcGFjZXMpOworICBpZiAoc29hcF9jYWxsX19fcHViMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc29hcCwgZW5kcG9pbnQsIE5VTEwsIHRoaXMsIHJlc3VsdCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwpkaWZmIC0tZ2l0IGEvdWRkaTIvcHVibGlzaF92Mi5oIGIvdWRkaTIvcHVibGlzaF92Mi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMzczMjkKLS0tIC9kZXYvbnVsbAorKysgYi91ZGRpMi9wdWJsaXNoX3YyLmgKQEAgLTAsMCArMSw0MDE4IEBACisvKiogQG1haW5wYWdlIGdTT0FQIFVEREkgdjIKKworVW5pdmVyc2FsIERlc2NyaXB0aW9uLCBEaXNjb3ZlcnkgYW5kIEludGVncmF0aW9uLCBvciBVRERJLCBpcyB0aGUgbmFtZSBvZiBhCitncm91cCBvZiB3ZWItYmFzZWQgcmVnaXN0cmllcyB0aGF0IGV4cG9zZSBpbmZvcm1hdGlvbiBhYm91dCBhIGJ1c2luZXNzIG9yIG90aGVyCitlbnRpdHkgYW5kIGl0cyB0ZWNobmljYWwgaW50ZXJmYWNlcy4KKworU2VlIHRoZSBVRERJIHYyIHNwZWNpZmljYXRpb24gQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0KK2ZvciBtb3JlIGRldGFpbHMuCisKK0BzZWN0aW9uIFVEREkyX0NMQVNTRVMgQ2xhc3NlcworCitTZWUgUmVsYXRlZCBQYWdlcyBmb3IgZXhhbXBsZXMuCisKK1VEREkgSW5xdWlyZSBjbGFzc2VzCisKKy0gQHJlZiB1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nCistIEByZWYgdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MKKy0gQHJlZiB1ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcworLSBAcmVmIHVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2UKKy0gQHJlZiB1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWwKKy0gQHJlZiB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwKKy0gQHJlZiB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsCistIEByZWYgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dAorLSBAcmVmIHVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbAorLSBAcmVmIHVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsCisKK1VEREkgUHVibGlzaCBjbGFzc2VzCisKKy0gQHJlZiB1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMKKy0gQHJlZiB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcKKy0gQHJlZiB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzCistIEByZWYgdWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlCistIEByZWYgdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwKKy0gQHJlZiB1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMKKy0gQHJlZiB1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4KKy0gQHJlZiB1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydAorLSBAcmVmIHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuCistIEByZWYgdWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zCistIEByZWYgdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbworLSBAcmVmIHVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcKKy0gQHJlZiB1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcworLSBAcmVmIHVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2UKKy0gQHJlZiB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwKKy0gQHJlZiB1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMKKworQHNlY3Rpb24gVURESTJfQklORElOR1MgQmluZGluZyBSZWZlcmVuY2UKKworLSBAcmVmIElucXVpcmVTb2FwCistIEByZWYgUHVibGlzaFNvYXAKKworKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpmaW5kX2JpbmRpbmcKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nCitAYnJpZWYKKworUmVwcmVzZW50cyBhIHJlcXVlc3QgdG8gbG9jYXRlIGJpbmRpbmdzIHRoYXQgbWVldCB0aGUgc3BlY2lmaWVkIHJlcXVpcmVtZW50cy4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzcxMgorKi8KKworLyoqCitAZm4gdWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZzo6dWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmluZF9VU0NPUkViaW5kaW5nIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZzo6dWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdE1vZGVsS2V5KQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSB0TW9kZWxLZXkgc3RyaW5nCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZpbmRfVVNDT1JFYmluZGluZyBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkIHRNb2RlbAora2V5LgorKi8KKworLyoqCitAZm4gdWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZzo6dWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8Y2hhcio+IHRNb2RlbEtleXMpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIHRNb2RlbEtleXMgY29sbGVjdGlvbiBvZiB0TW9kZWwga2V5IHN0cmluZ3MKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmluZF9VU0NPUkViaW5kaW5nIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQgdE1vZGVsCitrZXlzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2JpbmRpbmdEZXRhaWwqIHVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmc6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQpCitAYnJpZWYKK0BwYXJhbVtpbl0gZW5kcG9pbnQgVVJMIG9mIHRoZSBVRERJIHNlcnZlcgorQHJldHVybiBBIHBvaW50ZXIgdG8gYSB1ZGRpMl9fYmluZGluZ0RldGFpbCBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcgorCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmVyIHRvIGZpbmQgYmluZGluZyBkZXRhaWxzLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpmaW5kX2J1c2luZXNzCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCitAY2xhc3MgdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBsb2NhdGUgYnVzaW5lc3NlcyB0aGF0IG1lZXQgc3BlY2lmaWMgcmVxdWlyZW1lbnRzLiBXaGVuCit0aGUgc2VuZCBtZXRob2QgaXMgY2FsbGVkLCB0aGUgaW5zdGFuY2UgcmV0dXJucyBhIHVkZGkyX19idXNpbmVzc0xpc3Qgb2JqZWN0Cit0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZiBidXNpbmVzcyB0aGF0IG1hdGNoZWQgdGhlIHNlYXJjaCBjcml0ZXJpYS4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzcxMworCitTZWUgYWxzbyBAcmVmIGV4YW1wbGUyLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M6OnVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmaW5kX1VTQ09SRWJ1c2luZXNzIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M6OnVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmaW5kX1VTQ09SRWJ1c2luZXNzIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQgbmFtZQorb2YgdGhlIHJlcXVlc3RlZCBidXNpbmVzcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzOjp1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8dWRkaTJfX2tleWVkUmVmZXJlbmNlKj4ga2V5ZWRSZWZlcmVuY2VzKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmaW5kX1VTQ09SRWJ1c2luZXNzIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK2NhdGVnb3J5IHJlZmVyZW5jZXMuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzczo6dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAgKnNvYXAsIHN0ZDo6dmVjdG9yPGNoYXIqPiB0TW9kZWxLZXlzKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmaW5kX1VTQ09SRWJ1c2luZXNzIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQgdE1vZGVsCitrZXlzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2J1c2luZXNzTGlzdCAqdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQpCitAYnJpZWYKK0BwYXJhbVtpbl0gZW5kcG9pbnQgVVJMIG9mIHRoZSBVRERJIHNlcnZlcgorQHJldHVybiBBIHBvaW50ZXIgdG8gYSB1ZGRpMl9fYnVzaW5lc3NMaXN0IG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2ZXIgdG8gZmluZCBhIGxpc3Qgb2YgYnVzaW5lc3Nlcy4KKworU2VlIGFsc28gQHJlZiBleGFtcGxlMi4KKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6ZmluZF9yZWxhdGVkQnVzaW5lc3NlcworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorQGNsYXNzIHVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzCitAYnJpZWYKKworUmVwcmVzZW50cyBhIHJlcXVlc3QgdG8gbG9jYXRlIGJ1c2luZXNzZXMgdGhhdCBhcmUgcmVsYXRlZCB0byBhIHNwZWNpZmljCitidXNpbmVzcy4gV2hlbiB0aGUgc2VuZCBtZXRob2QgaXMgY2FsbGVkLCB0aGUgaW5zdGFuY2UgcmV0dXJucyBhCit1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzTGlzdCBvYmplY3QgdGhhdCBjb250YWlucyBhIGxpc3Qgb2YgYnVzaW5lc3MgdGhhdCBtYXRjaGVkCit0aGUgcmVsYXRpb25zaGlwIHNldC4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzcxNAorKi8KKworLyoqCitAZm4gdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXM6OnVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmaW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzcyBjbGFzcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzOjp1ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqYnVzaW5lc3NLZXkpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIGJ1c2luZXNzS2V5IHN0cmluZworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmaW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzcyBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkCitidXNpbmVzcyBrZXkuCisqLworCisvKioKK0BmbiB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0ICp1ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3Nlczo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCkKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19yZWxhdGVkQnVzaW5lc3NMaXN0IG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2ZXIgdG8gZmluZCBhIGxpc3Qgb2YgcmVsYXRlZCBidXNpbmVzc2VzLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpmaW5kX3NlcnZpY2UKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlCitAYnJpZWYKKworUmVwcmVzZW50cyBhIHJlcXVlc3QgdG8gbG9jYXRlIHNlcnZpY2VzIHRoYXQgbWVldCB0aGUgc3BlY2lmaWVkIHJlcXVpcmVtZW50cy4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzcxNQorCitTZWUgYWxzbyBAcmVmIGV4YW1wbGUxLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZTo6dWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmluZF9VU0NPUkVzZXJ2aWNlIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZTo6dWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gbmFtZSBvZiB0aGUgc2VydmljZQorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmaW5kX1VTQ09SRXNlcnZpY2UgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZCBuYW1lLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZTo6dWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8dWRkaTJfX2tleWVkUmVmZXJlbmNlKj4ga2V5ZWRSZWZlcmVuY2VzKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBrZXllZFJlZmVyZW5jZXMgY29sbGVjdGlvbiBvZiBjYXRlZ29yeSBrZXlzCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZpbmRfVVNDT1JFc2VydmljZSBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkCitjYXRlZ29yeSBrZXlzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZTo6dWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8Y2hhcio+IHRNb2RlbEtleXMpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIHRNb2RlbEtleXMgY29sbGVjdGlvbiBvZiB0TW9kZWwga2V5IHN0cmluZ3MKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmluZF9VU0NPUkVzZXJ2aWNlIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQgdE1vZGVsCitrZXlzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX3NlcnZpY2VMaXN0KiB1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50KQorQGJyaWVmCitAcGFyYW1baW5dIGVuZHBvaW50IFVSTCBvZiB0aGUgVURESSBzZXJ2ZXIKK0ByZXR1cm4gQSBwb2ludGVyIHRvIGEgdWRkaTJfX3NlcnZpY2VMaXN0IG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2ZXIgdG8gZmluZCBhIGxpc3Qgb2Ygc2VydmljZXMuCisKK1NlZSBhbHNvIEByZWYgZXhhbXBsZTEuCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOmZpbmRfdE1vZGVsCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCitAY2xhc3MgdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsCitAYnJpZWYKKworUmVwcmVzZW50cyBhIHJlcXVlc3QgdG8gbG9jYXRlIGEgbGlzdCBvZiB0TW9kZWwgZW50cmllcyB0aGF0IG1hdGNoIGEgc2V0IG9mCitzcGVjaWZpYyBjcml0ZXJpYS4gVGhlIHJlc3VsdCBvZiBhIHNlYXJjaCBpcyBhIHVkZGkyX190TW9kZWxMaXN0IG9iamVjdCB0aGF0Citjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCByZWdpc3RlcmVkIHRNb2RlbCBkYXRhIHRoYXQgbWF0Y2hlcyB0aGUgY3JpdGVyaWEuCisKK1NlZSBAdXJsIGh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3MTYKKyovCisKKy8qKgorQGZuIHVkZGkyX19maW5kX1VTQ09SRXRNb2RlbDo6dWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmaW5kX1VTQ09SRXRNb2RlbCBjbGFzcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19maW5kX1VTQ09SRXRNb2RlbDo6dWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBuYW1lIG9mIHRoZSB0TW9kZWwKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmluZF9VU0NPUkV0TW9kZWwgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZCB0TW9kZWwKK25hbWUuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWw6OnVkZGkyX19maW5kX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8dWRkaTJfX2tleWVkUmVmZXJlbmNlKj4ga2V5ZWRSZWZlcmVuY2VzKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBrZXllZFJlZmVyZW5jZXMgY29sbGVjdGlvbiBvZiBjYXRlZ29yeSBrZXlzCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZpbmRfVVNDT1JFdE1vZGVsIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQgY2F0ZWdvcnkKK2tleXMuCisqLworCisvKioKK0BmbiB1ZGRpMl9fdE1vZGVsTGlzdCogdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50KQorQGJyaWVmCitAcGFyYW1baW5dIGVuZHBvaW50IFVSTCBvZiB0aGUgVURESSBzZXJ2ZXIKK0ByZXR1cm4gQSBwb2ludGVyIHRvIGEgdWRkaTJfX3RNb2RlbExpc3Qgb2JqZWN0IG9yIE5VTEwgb24gZXJyb3IKKworU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZlciB0byBmaW5kIGEgdE1vZGVsTGlzdC4KKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6Z2V0X2JpbmRpbmdEZXRhaWwKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBnZXQgYmluZGluZyBkZXRhaWxzIGZyb20gYSBVRERJIHNlcnZlci4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzcxNworKi8KKworLyoqCitAZm4gdWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdldF9VU0NPUkViaW5kaW5nRGV0YWlsIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmJpbmRpbmdLZXkpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIGJpbmRpbmdLZXkgc3RyaW5nCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdldF9VU0NPUkViaW5kaW5nRGV0YWlsIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK2JpbmRpbmcga2V5LgorKi8KKworLyoqCitAZm4gdWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwoc3RydWN0IHNvYXAgKnNvYXAsIHN0ZDo6dmVjdG9yPGNoYXIqPiBiaW5kaW5nS2V5cykKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gYmluZGluZ0tleXMgY29sbGVjdGlvbiBvZiBrZXkgc3RyaW5ncworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFYmluZGluZ0RldGFpbCBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkCitjb2xsZWN0aW9uIG9mIGJpbmRpbmcga2V5cy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19iaW5kaW5nRGV0YWlsKiB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWw6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQpCitAYnJpZWYKK0BwYXJhbVtpbl0gZW5kcG9pbnQgVVJMIG9mIHRoZSBVRERJIHNlcnZlcgorQHJldHVybiBBIHBvaW50ZXIgdG8gYSB1ZGRpMl9fYmluZGluZ0RldGFpbCBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcgorCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmVyIHRvIGdldCB0aGUgYmluZGluZyBkZXRhaWxzLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpnZXRfYnVzaW5lc3NEZXRhaWwKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsCitAYnJpZWYKKworUmVwcmVzZW50cyBhIHJlcXVlc3QgdG8gZ2V0IGJ1c2luZXNzIGRldGFpbHMgZnJvbSBhIFVEREkgc2VydmVyLgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzE4IAorKi8KKworLyoqCitAZm4gdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbDo6dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbDo6dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqYnVzaW5lc3NLZXkpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIGJ1c2luZXNzS2V5IHN0cmluZworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAorYnVzaW5lc3Mga2V5LgorKi8KKworLyoqCitAZm4gdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbDo6dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8Y2hhcio+IGJ1c2luZXNzS2V5cykKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gYnVzaW5lc3NLZXlzIGNvbGxlY3Rpb24gb2Yga2V5IHN0cmluZ3MKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK2NvbGxlY3Rpb24gb2YgYnVzaW5lc3Mga2V5cy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19idXNpbmVzc0RldGFpbCogdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbDo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCkKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19idXNpbmVzc0RldGFpbCBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcgorCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmVyIHRvIGdldCB0aGUgYnVzaW5lc3MgZGV0YWlscy4KKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6Z2V0X2J1c2luZXNzRGV0YWlsRXh0CisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCitAY2xhc3MgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dAorQGJyaWVmCisKK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIGdldCBidXNpbmVzcyBkZXRhaWxzIGZyb20gYSBVRERJIHNlcnZlci4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzcxOQorKi8KKworLyoqCitAZm4gdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dDo6dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dChzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0IGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dDo6dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqYnVzaW5lc3NLZXkpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIGJ1c2luZXNzS2V5IHN0cmluZworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAorYnVzaW5lc3Mga2V5LgorKi8KKworLyoqCitAZm4gdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dDo6dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8Y2hhcio+IGJ1c2luZXNzS2V5cykKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gYnVzaW5lc3NLZXlzIGNvbGxlY3Rpb24gb2Yga2V5IHN0cmluZ3MKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0IGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK2NvbGxlY3Rpb24gb2YgYnVzaW5lc3Mga2V5cy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19idXNpbmVzc0RldGFpbEV4dCogdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dDo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCkKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19idXNpbmVzc0RldGFpbEV4dCBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcgorCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmVyIHRvIGdldCB0aGUgYnVzaW5lc3MgZGV0YWlscy4KKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6Z2V0X3NlcnZpY2VEZXRhaWwKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBnZXQgc2VydmljZSBkZXRhaWxzIGZyb20gYSBVRERJIHNlcnZlci4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzcyMAorKi8KKworLyoqCitAZm4gdWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdldF9VU0NPUkVzZXJ2aWNlRGV0YWlsIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnNlcnZpY2VLZXkpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIHNlcnZpY2VLZXkgc3RyaW5nCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdldF9VU0NPUkVzZXJ2aWNlRGV0YWlsIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK3NlcnZpY2Uga2V5LgorKi8KKworLyoqCitAZm4gdWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwoc3RydWN0IHNvYXAgKnNvYXAsIHN0ZDo6dmVjdG9yPGNoYXIqPiBzZXJ2aWNlS2V5cykKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gc2VydmljZUtleXMgY29sbGVjdGlvbiBvZiBrZXkgc3RyaW5ncworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFc2VydmljZURldGFpbCBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkCitjb2xsZWN0aW9uIG9mIHNlcnZpY2Uga2V5cy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19zZXJ2aWNlRGV0YWlsKiB1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWw6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQpCitAYnJpZWYKK0BwYXJhbVtpbl0gZW5kcG9pbnQgVVJMIG9mIHRoZSBVRERJIHNlcnZlcgorQHJldHVybiBBIHBvaW50ZXIgdG8gYSB1ZGRpMl9fc2VydmljZURldGFpbCBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcgorCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmVyIHRvIGdldCB0aGUgc2VydmljZSBkZXRhaWxzLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpnZXRfdE1vZGVsRGV0YWlsCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCitAY2xhc3MgdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBnZXQgdE1vZGVsIGRldGFpbHMgZnJvbSBhIFVEREkgc2VydmVyLgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzIxCisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbDo6dWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdldF9VU0NPUkV0TW9kZWxEZXRhaWwgY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbDo6dWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRNb2RlbEtleSkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gdE1vZGVsS2V5IHN0cmluZworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFdE1vZGVsRGV0YWlsIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK3RNb2RlbCBrZXkuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbDo6dWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwoc3RydWN0IHNvYXAgKnNvYXAsIHN0ZDo6dmVjdG9yPGNoYXIqPiB0TW9kZWxLZXlzKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSB0TW9kZWxLZXlzIGNvbGxlY3Rpb24gb2Yga2V5IHN0cmluZ3MKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRXRNb2RlbERldGFpbCBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkCitjb2xsZWN0aW9uIG9mIHRNb2RlbCBrZXlzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX3RNb2RlbERldGFpbCogdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWw6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQpCitAYnJpZWYKK0BwYXJhbVtpbl0gZW5kcG9pbnQgVVJMIG9mIHRoZSBVRERJIHNlcnZlcgorQHJldHVybiBBIHBvaW50ZXIgdG8gYSB1ZGRpMl9fdE1vZGVsRGV0YWlsIG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2ZXIgdG8gZ2V0IHRoZSB0TW9kZWwgZGV0YWlscy4KKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6YWRkX3B1Ymxpc2hlckFzc2VydGlvbnMKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBhZGQgb25lIG9yIG1vcmUgcHVibGlzaGVyIGFzc2VydGlvbnMgdG8gdGhlIGFzc2VydGlvbgorY29sbGVjdGlvbiBmb3IgYW4gaW5kaXZpZHVhbCBwdWJsaXNoZXIuCisKK1NlZSBAdXJsIGh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3MzEKKyovCisKKy8qKgorQGZuIHVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczo6dWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyBjbGFzcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczo6dWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKj4gcHVibGlzaGVyQXNzZXJ0aW9ucykKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gcHVibGlzaGVyQXNzZXJ0aW9ucyBjb2xsZWN0aW9uIG9mIHB1Ymxpc2hlciBhc3NlcnRpb25zCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zIGNsYXNzIHVzaW5nIHRoZQorc3BlY2lmaWVkIHB1Ymxpc2hlciBhc3NlcnRpb25zLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0ICp1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKQorQGJyaWVmCitAcGFyYW1baW5dIGVuZHBvaW50IFVSTCBvZiB0aGUgVURESSBzZXJ2ZXIKK0BwYXJhbVtpbl0gYXV0aEluZm8gYXV0aG9yaXphdGlvbiB0b2tlbiBwcm92aWRlZCBieSB0aGUgVURESSBzZXJ2ZXIKK0ByZXR1cm4gQSBwb2ludGVyIHRvIGEgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0IG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2ZXIgdG8gYWRkIG9uZSBvciBtb3JlIHB1Ymxpc2hlciBhc3NlcnRpb25zIHRvIHRoZQorYXNzZXJ0aW9uIGNvbGxlY3Rpb24gZm9yIGFuIGluZGl2aWR1YWwgcHVibGlzaGVyLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpkZWxldGVfYmluZGluZworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorQGNsYXNzIHVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZworQGJyaWVmCisKK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIGRlbGV0ZSBhIGJpbmRpbmcgdGhhdCBtZWV0cyB0aGUgc3BlY2lmaWVkIHJlcXVpcmVtZW50cy4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzczMgorKi8KKworLyoqCitAZm4gdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nOjp1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZGVsZXRlX1VTQ09SRWJpbmRpbmcgY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmc6OnVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqYmluZGluZ0tleSkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gYmluZGluZ0tleSBhIGJpbmRpbmcga2V5IHN0cmluZworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWxldGVfVVNDT1JFYmluZGluZyBjbGFzcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZzo6dWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3RvcjxjaGFyKj4gYmluZGluZ0tleXMpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIGJpbmRpbmdLZXlzIGNvbGxlY3Rpb24gb2YgYmluZGluZyBrZXlzCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGV0ZV9VU0NPUkViaW5kaW5nIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK2JpbmRpbmcga2V5cy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCAqdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbykKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcGFyYW1baW5dIGF1dGhJbmZvIGF1dGhvcml6YXRpb24gdG9rZW4gcHJvdmlkZWQgYnkgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcgorCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmljZSB0byBkZWxldGUgYSBiaW5kaW5nIHRoYXQgbWVldHMgdGhlIHNwZWNpZmllZAorcmVxdWlyZW1lbnRzLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpkZWxldGVfYnVzaW5lc3MKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzCitAYnJpZWYKKworUmVwcmVzZW50cyBhIHJlcXVlc3QgdG8gZGVsZXRlIGEgYnVzaW5lc3MgdGhhdCBtZWV0cyB0aGUgc3BlY2lmaWVkIHJlcXVpcmVtZW50cy4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzczMworKi8KKworLyoqCitAZm4gdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzczo6dWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZGVsZXRlX1VTQ09SRWJ1c2luZXNzIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzczo6dWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqYnVzaW5lc3NLZXkpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIGJ1c2luZXNzS2V5IGEgYnVzaW5lc3Mga2V5IHN0cmluZworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWxldGVfVVNDT1JFYnVzaW5lc3MgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAorYnVzaW5lc3Mga2V5LgorKi8KKworLyoqCitAZm4gdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzczo6dWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8Y2hhcio+IGJ1c2luZXNzS2V5cykKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gYnVzaW5lc3NLZXlzIGNvbGxlY3Rpb24gb2YgYnVzaW5lc3Mga2V5cworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWxldGVfVVNDT1JFYnVzaW5lc3MgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAorYnVzaW5lc3Mga2V5cy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCAqdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzczo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pCitAYnJpZWYKK0BwYXJhbVtpbl0gZW5kcG9pbnQgVVJMIG9mIHRoZSBVRERJIHNlcnZlcgorQHBhcmFtW2luXSBhdXRoSW5mbyBhdXRob3JpemF0aW9uIHRva2VuIHByb3ZpZGVkIGJ5IHRoZSBVRERJIHNlcnZlcgorQHJldHVybiBBIHBvaW50ZXIgdG8gYSB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgb2JqZWN0IG9yIE5VTEwgb24gZXJyb3IKKworU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZpY2UgdG8gZGVsZXRlIGEgYnVzaW5lc3MgdGhhdCBtZWV0cyB0aGUgc3BlY2lmaWVkCityZXF1aXJlbWVudHMuCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOmRlbGV0ZV9zZXJ2aWNlCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCitAY2xhc3MgdWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlCitAYnJpZWYKKworUmVwcmVzZW50cyBhIHJlcXVlc3QgdG8gZGVsZXRlIGEgc2VydmljZSB0aGF0IG1lZXRzIHRoZSBzcGVjaWZpZWQgcmVxdWlyZW1lbnRzLgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzM1CisqLworCisvKioKK0BmbiB1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2U6OnVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZGVsZXRlX1VTQ09SRXNlcnZpY2UgY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2U6OnVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqc2VydmljZUtleSkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gc2VydmljZUtleSBhIHNlcnZpY2Uga2V5IHN0cmluZworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWxldGVfVVNDT1JFc2VydmljZSBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkCitzZXJ2aWNlIGtleS4KKyovCisKKy8qKgorQGZuIHVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZTo6dWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3RvcjxjaGFyKj4gc2VydmljZUtleXMpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIHNlcnZpY2VLZXlzIGNvbGxlY3Rpb24gb2Ygc2VydmljZSBrZXlzCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGV0ZV9VU0NPUkVzZXJ2aWNlIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK3NlcnZpY2Uga2V5cy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCAqdWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbykKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcGFyYW1baW5dIGF1dGhJbmZvIGF1dGhvcml6YXRpb24gdG9rZW4gcHJvdmlkZWQgYnkgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcgorCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmljZSB0byBkZWxldGUgYSBzZXJ2aWNlIHRoYXQgbWVldHMgdGhlIHNwZWNpZmllZAorcmVxdWlyZW1lbnRzLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpkZWxldGVfdE1vZGVsCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCitAY2xhc3MgdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBkZWxldGUgYSB0TW9kZWwgdGhhdCBtZWV0cyB0aGUgc3BlY2lmaWVkIHJlcXVpcmVtZW50cy4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzczNgorKi8KKworLyoqCitAZm4gdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWw6OnVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWxldGVfVVNDT1JFdE1vZGVsIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWw6OnVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0TW9kZWxLZXkpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIHRNb2RlbEtleSBhIHRNb2RlbCBrZXkgc3RyaW5nCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGV0ZV9VU0NPUkV0TW9kZWwgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAordE1vZGVsIGtleS4KKyovCisKKy8qKgorQGZuIHVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsOjp1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8Y2hhcio+IHRNb2RlbEtleXMpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIHRNb2RlbEtleXMgY29sbGVjdGlvbiBvZiB0TW9kZWwga2V5cworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWxldGVfVVNDT1JFdE1vZGVsIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK3RNb2RlbCBrZXlzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0ICp1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbDo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pCitAYnJpZWYKK0BwYXJhbVtpbl0gZW5kcG9pbnQgVVJMIG9mIHRoZSBVRERJIHNlcnZlcgorQHBhcmFtW2luXSBhdXRoSW5mbyBhdXRob3JpemF0aW9uIHRva2VuIHByb3ZpZGVkIGJ5IHRoZSBVRERJIHNlcnZlcgorQHJldHVybiBBIHBvaW50ZXIgdG8gYSB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgb2JqZWN0IG9yIE5VTEwgb24gZXJyb3IKKworU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZpY2UgdG8gZGVsZXRlIGEgdE1vZGVsIHRoYXQgbWVldHMgdGhlIHNwZWNpZmllZAorcmVxdWlyZW1lbnRzLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpkZWxldGVfcHVibGlzaGVyQXNzZXJ0aW9ucworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorQGNsYXNzIHVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucworQGJyaWVmCisKK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIGRlbGV0ZSBwdWJsaXNoZXIgYXNzZXJ0aW9ucyBtZWV0aW5nIHRoZSBzcGVjaWZpZWQKK3JlcXVpcmVtZW50cy4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzczNAorKi8KKworLyoqCitAZm4gdWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjp1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjp1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAgKnNvYXAsIHN0ZDo6dmVjdG9yPHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24qPiBwdWJsaXNoZXJBc3NlcnRpb25zKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBwdWJsaXNoZXJBc3NlcnRpb25zIGEgY29sbGVjdGlvbiBvZiBwdWJsaXNoZXIgYXNzZXJ0aW9ucworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyBjbGFzcyB1c2luZyB0aGUKK3NwZWNpZmllZCBjb2xsZWN0aW9uIG9mIHB1Ymxpc2hlciBhc3NlcnRpb25zLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0ICp1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKQorQGJyaWVmCitAcGFyYW1baW5dIGVuZHBvaW50IFVSTCBvZiB0aGUgVURESSBzZXJ2ZXIKK0BwYXJhbVtpbl0gYXV0aEluZm8gYXV0aG9yaXphdGlvbiB0b2tlbiBwcm92aWRlZCBieSB0aGUgVURESSBzZXJ2ZXIKK0ByZXR1cm4gQSBwb2ludGVyIHRvIGEgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0IG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2aWNlIHRvIGRlbGV0ZSBwdWJsaXNoZXIgYXNzZXJ0aW9ucyBtZWV0aW5nIHRoZQorc3BlY2lmaWVkIHJlcXVpcmVtZW50cy4KKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6ZGlzY2FyZF9hdXRoVG9rZW4KKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4KK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBkaXNjYXJkIGFuIGF1dGhvcml6YXRpb24gdG9rZW4gb2J0YWluZWQgd2l0aCB0aGUKK2dldF9VU0NPUkVhdXRoVG9rZW4gY2xhc3MuCisKK1NlZSBAdXJsIGh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3MzcKKyovCisKKy8qKgorQGZuIHVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbjo6dWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWxldGVfVVNDT1JFYXV0aFRva2VuIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuOjp1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmF1dGhJbmZvKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBhdXRoSW5mbyBhdXRob3JpemF0aW9uIHRva2VuIHByb3ZpZGVkIGJ5IHRoZSBVRERJIHNlcnZlcgorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWxldGVfVVNDT1JFYXV0aFRva2VuIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK2F1dGhlbnRpY2F0aW9uIHRva2VuIHN0cmluZy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCAqdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50KQorQGJyaWVmCitAcGFyYW1baW5dIGVuZHBvaW50IFVSTCBvZiB0aGUgVURESSBzZXJ2ZXIKK0ByZXR1cm4gQSBwb2ludGVyIHRvIGEgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0IG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2aWNlIHRvIGRpc2NhcmQgYW4gYXV0aGVudGljYXRpb24gdG9rZW4uCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOmdldF9hc3NlcnRpb25TdGF0dXNSZXBvcnQKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydAorQGJyaWVmCisKK1Byb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGRldGVybWluZSB0aGUgc3RhdHVzIG9mIGN1cnJlbnQgYW5kIG91dHN0YW5kaW5nCitwdWJsaXNoZXIgYXNzZXJ0aW9ucy4gVGhlIHJlc3VsdHMgY2FuIGJlIHJlc3RyaWN0ZWQgYnkgc2V0dGluZyB0aGUKK2NvbXBsZXRpb25TdGF0dXMgcHJvcGVydHkuCisKK1NlZSBAdXJsIGh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3MzgKKyovCisKKy8qKgorQGZuIHVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0Ojp1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydChzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCBjbGFzcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0Ojp1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqY29tcGxldGlvblN0YXR1cykKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gY29tcGxldGlvblN0YXR1cyBjb21wbGV0aW9uIHN0YXR1cyBzdHJpbmcKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCBjbGFzcyB1c2luZyB0aGUKK3NwZWNpZmllZCBjb21wbGV0aW9uIHN0YXR1cy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQgKnVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0OjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbykKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcGFyYW1baW5dIGF1dGhJbmZvIGF1dGhvcml6YXRpb24gdG9rZW4gcHJvdmlkZWQgYnkgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQgb2JqZWN0IG9yIE5VTEwgb24gZXJyb3IKKworU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZpY2UgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgY3VycmVudCBhbmQgb3V0c3RhbmRpbmcKK3B1Ymxpc2hlciBhc3NlcnRpb25zLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpnZXRfYXV0aFRva2VuCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCitAY2xhc3MgdWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW4KK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBvYnRhaW4gYW4gYXV0aG9yaXphdGlvbiB0b2tlbiwgd2hpY2ggaXMgcmVwcmVzZW50ZWQgYnkKK3RoZSB1ZGRpMl9fYXV0aFRva2VuIGNsYXNzLgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzM5CisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbjo6dWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW4oc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdldF9VU0NPUkVhdXRoVG9rZW4gY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbjo6dWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW4oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnVzZXJpZCwgY29uc3QgY2hhciAqcGFzc3dkKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSB1c2VyaWQgdGhlIHVzZXIgSUQgc3RyaW5nCitAcGFyYW1baW5dIHBhc3N3ZCB0aGUgcGFzc3dvcmQgc3RyaW5nCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdldF9VU0NPUkVhdXRoVG9rZW4gY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZCB1c2VyCitJRCBhbmQgcGFzc3dvcmQuCisqLworCisvKioKK0BmbiB1ZGRpMl9fYXV0aFRva2VuICp1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbjo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCkKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19hdXRoVG9rZW4gb2JqZWN0IG9yIE5VTEwgb24gZXJyb3IKKworU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZpY2UgdG8gZ2V0IGEgYXV0aG9yaXphdGlvbiB0b2tlbiBnaXZlbiBhIHVzZXIKK0lEIGFuZCBwYXNzd29yZC4KKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6Z2V0X3B1Ymxpc2hlckFzc2VydGlvbnMKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBvYnRhaW4gdGhlIGZ1bGwgc2V0IG9mIHB1Ymxpc2hlciBhc3NlcnRpb25zIHRoYXQgYXJlCithc3NvY2lhdGVkIHdpdGggYW4gaW5kaXZpZHVhbCBwdWJsaXNoZXIuCisKK1NlZSBAdXJsIGh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3NDAKKyovCisKKy8qKgorQGZuIHVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczo6dWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFcHVibGlzaGVyQXNzZXRpb25zIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMgKnVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pCitAYnJpZWYKK0BwYXJhbVtpbl0gZW5kcG9pbnQgVVJMIG9mIHRoZSBVRERJIHNlcnZlcgorQHBhcmFtW2luXSBhdXRoSW5mbyBhdXRob3JpemF0aW9uIHRva2VuIHByb3ZpZGVkIGJ5IHRoZSBVRERJIHNlcnZlcgorQHJldHVybiBBIHBvaW50ZXIgdG8gYSB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9ucyBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcgorCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmljZSB0byBnZXQgcHVibGlzaGVyIGFzc2VydGlvbnMuCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOmdldF9yZWdpc3RlcmVkSW5mbworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorQGNsYXNzIHVkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8KK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBnZXQgYWxsIHJlZ2lzdGVyZWQgYnVzaW5lc3MgZW50aXRpZXMgYW5kIHRNb2RlbHMKK2NvbnRyb2xsZWQgYnkgYW4gaW5kaXZpZHVhbC4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzc0MQorKi8KKworLyoqCitAZm4gdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbzo6dWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyhzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX3JlZ2lzdGVyZWRJbmZvICp1ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbykKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcGFyYW1baW5dIGF1dGhJbmZvIGF1dGhvcml6YXRpb24gdG9rZW4gcHJvdmlkZWQgYnkgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19yZWdpc3RlcmVkSW5mbyBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcgorCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmljZSB0byBnZXQgYWxsIHJlZ2lzdGVyZWQgYnVzaW5lc3MgZW50aXRpZXMgYW5kCit0TW9kZWxzIGNvbnRyb2xsZWQgYnkgYW4gaW5kaXZpZHVhbC4KKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6c2F2ZV9iaW5kaW5nCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCitAY2xhc3MgdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZworQGJyaWVmCisKK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIHBvc3QgYmluZGluZyBpbmZvcm1hdGlvbiBvbiBhIFVEREkgc2VydmVyLgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzQyCisqLworCisvKioKK0BmbiB1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nOjp1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzYXZlX1VTQ09SRWJpbmRpbmcgY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nOjp1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwICpzb2FwLCB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlICZiaW5kaW5nVGVtcGxhdGUpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIGJpbmRpbmdUZW1wbGF0ZSBiaW5kaW5nIHRlbXBsYXRlCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNhdmVfVVNDT1JFYmluZGluZyBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkIGJpbmRpbmcKK3RlbXBsYXRlLgorKi8KKworLyoqCitAZm4gdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZzo6dWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8dWRkaTJfX2JpbmRpbmdUZW1wbGF0ZSo+IGJpbmRpbmdUZW1wbGF0ZXMpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIGJpbmRpbmdUZW1wbGF0ZXMgY29sbGVjdGlvbiBvZiBiaW5kaW5nIHRlbXBsYXRlcworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzYXZlX1VTQ09SRWJpbmRpbmcgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZCBiaW5kaW5nCit0ZW1wbGF0ZXMuCisqLworCisvKioKK0BmbiB1ZGRpMl9fYmluZGluZ0RldGFpbCAqdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZzo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pCitAYnJpZWYKK0BwYXJhbVtpbl0gZW5kcG9pbnQgVVJMIG9mIHRoZSBVRERJIHNlcnZlcgorQHBhcmFtW2luXSBhdXRoSW5mbyBhdXRob3JpemF0aW9uIHRva2VuIHByb3ZpZGVkIGJ5IHRoZSBVRERJIHNlcnZlcgorQHJldHVybiBBIHBvaW50ZXIgdG8gYSB1ZGRpMl9fYmluZGluZ0RldGFpbCBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcgorCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmVyIHRvIHBvc3QgYmluZGluZyBpbmZvcm1hdGlvbiBvbiB0aGUgc2VydmVyLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpzYXZlX2J1c2luZXNzCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCitAY2xhc3MgdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3MKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBwb3N0IGJ1c2luZXNzIGluZm9ybWF0aW9uIG9uIGEgVURESSBzZXJ2ZXIuCisKK1NlZSBAdXJsIGh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3NDMKKyovCisKKy8qKgorQGZuIHVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzOjp1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc2F2ZV9VU0NPUkVidXNpbmVzcyBjbGFzcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzOjp1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCAqc29hcCwgdWRkaTJfX2J1c2luZXNzRW50aXR5ICZidXNpbmVzc0VudGl0eSkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gYnVzaW5lc3NFbnRpdHkgYnVzaW5lc3MgZW50aXR5CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNhdmVfVVNDT1JFYnVzaW5lc3MgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAorYnVzaW5lc3MgZW50aXR5LgorKi8KKworLyoqCitAZm4gdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M6OnVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NFbnRpdHkqPiBidXNpbmVzc0VudGl0aWVzKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBidXNpbmVzc0VudGl0aWVzIGNvbGxlY3Rpb24gb2YgYnVzaW5lc3MgZW50aXRpZXMKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc2F2ZV9VU0NPUkVidXNpbmVzcyBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkCitidXNpbmVzcyBlbnRpdGllcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19idXNpbmVzc0RldGFpbCAqdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKQorQGJyaWVmCitAcGFyYW1baW5dIGVuZHBvaW50IFVSTCBvZiB0aGUgVURESSBzZXJ2ZXIKK0BwYXJhbVtpbl0gYXV0aEluZm8gYXV0aG9yaXphdGlvbiB0b2tlbiBwcm92aWRlZCBieSB0aGUgVURESSBzZXJ2ZXIKK0ByZXR1cm4gQSBwb2ludGVyIHRvIGEgdWRkaTJfX2J1c2luZXNzRGV0YWlsIG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2ZXIgdG8gcG9zdCBidXNpbmVzcyBpbmZvcm1hdGlvbiBvbiB0aGUgc2VydmVyLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpzYXZlX3NlcnZpY2UKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlCitAYnJpZWYKKworUmVwcmVzZW50cyBhIHJlcXVlc3QgdG8gcG9zdCBzZXJ2aWNlIGluZm9ybWF0aW9uIG9uIGEgVURESSBzZXJ2ZXIuCisKK1NlZSBAdXJsIGh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3NDQKKyovCisKKy8qKgorQGZuIHVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2U6OnVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNhdmVfVVNDT1JFc2VydmljZSBjbGFzcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2U6OnVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAgKnNvYXAsIHVkZGkyX19idXNpbmVzc1NlcnZpY2UgJmJ1c2luZXNzU2VydmljZSkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gYnVzaW5lc3NTZXJ2aWNlIGJ1c2luZXNzIHNlcnZpY2UKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc2F2ZV9VU0NPUkVzZXJ2aWNlIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK3NlcnZpY2UuCisqLworCisvKioKK0BmbiB1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlOjp1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlKj4gYnVzaW5lc3NTZXJ2aWNlcykKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gYnVzaW5lc3NTZXJ2aWNlcyBjb2xsZWN0aW9uIG9mIGJ1c2luZXNzIHNlcnZpY2VzCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNhdmVfVVNDT1JFc2VydmljZSBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkCitzZXJ2aWNlcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19zZXJ2aWNlRGV0YWlsICp1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbykKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcGFyYW1baW5dIGF1dGhJbmZvIGF1dGhvcml6YXRpb24gdG9rZW4gcHJvdmlkZWQgYnkgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19zZXJ2aWNlRGV0YWlsIG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2ZXIgdG8gcG9zdCBzZXJ2aWNlIGluZm9ybWF0aW9uIG9uIHRoZSBzZXJ2ZXIuCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOnNhdmVfdE1vZGVsCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCitAY2xhc3MgdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsCitAYnJpZWYKKworUmVwcmVzZW50cyBhIHJlcXVlc3QgdG8gcG9zdCB0TW9kZWwgaW5mb3JtYXRpb24gb24gYSBVRERJIHNlcnZlci4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzc0NQorKi8KKworLyoqCitAZm4gdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsOjp1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNhdmVfVVNDT1JFdE1vZGVsIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsOjp1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAgKnNvYXAsIHVkZGkyX190TW9kZWwgJnRNb2RlbCkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gdE1vZGVsIGEgdE1vZGVsCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNhdmVfVVNDT1JFdE1vZGVsIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK3RNb2RlbC4KKyovCisKKy8qKgorQGZuIHVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbDo6dWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fdE1vZGVsKj4gdE1vZGVscykKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gdE1vZGVscyBjb2xsZWN0aW9uIG9mIHRNb2RlbHMKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc2F2ZV9VU0NPUkV0TW9kZWwgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAordE1vZGVscy4KKyovCisKKy8qKgorQGZuIHVkZGkyX190TW9kZWxEZXRhaWwgKnVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbDo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pCitAYnJpZWYKK0BwYXJhbVtpbl0gZW5kcG9pbnQgVVJMIG9mIHRoZSBVRERJIHNlcnZlcgorQHBhcmFtW2luXSBhdXRoSW5mbyBhdXRob3JpemF0aW9uIHRva2VuIHByb3ZpZGVkIGJ5IHRoZSBVRERJIHNlcnZlcgorQHJldHVybiBBIHBvaW50ZXIgdG8gYSB1ZGRpMl9fdE1vZGVsRGV0YWlsIG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2ZXIgdG8gcG9zdCB0TW9kZWwgaW5mb3JtYXRpb24gb24gdGhlIHNlcnZlci4KKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6c2V0X3B1Ymxpc2hlckFzc2VydGlvbnMKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBtb2RpZnkgdGhlIGV4aXN0aW5nIHB1Ymxpc2hlciBhc3NlcnRpb25zIGZvciBhbgoraW5kaXZpZHVhbCBwdWJsaXNoZXIuCisKK1NlZSBAdXJsIGh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3NDYKKyovCisKKy8qKgorQGZuIHVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczo6dWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyBjbGFzcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczo6dWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKj4gcHVibGlzaGVyQXNzZXJ0aW9ucykKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gcHVibGlzaGVyQXNzZXJ0aW9ucyBjb2xsZWN0aW9uIG9mIHB1Ymxpc2hlciBhc3NlcnRpb25zCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zIGNsYXNzIHVzaW5nIHRoZQorc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2YgcHVibGlzaGVyIGFzc2VydGlvbnMuCisqLworCisvKioKK0BmbiB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9ucyAqdWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbykKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcGFyYW1baW5dIGF1dGhJbmZvIGF1dGhvcml6YXRpb24gdG9rZW4gcHJvdmlkZWQgYnkgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zIG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2ZXIgdG8gcG9zdCB0TW9kZWwgaW5mb3JtYXRpb24gb24gdGhlIHNlcnZlci4KKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JQ29kZSBFeGFtcGxlcworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorQHBhZ2UgZXhhbXBsZTEgQ29kZSBFeGFtcGxlIDE6IEZpbmRpbmcgYSBzZXJ2aWNlCisKK1RoaXMgZXhhbXBsZSBzaG93cyB5b3UgaG93IHRvIGZpbmQgV2ViIHNlcnZpY2VzLiBJbiB0aGlzIGNhc2UsIHRoZSBleGFtcGxlCitmaW5kcyBXZWIgc2VydmljZXMgd2l0aCBuYW1lcyB0aGF0IGJlZ2luIHdpdGggdGhlIHdvcmQgIm1hZ2ljIi4KKworQGNvZGUKKyNpbmNsdWRlICJpbnFILmgiCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sgCisgIGNoYXIgKnNlYXJjaF9zdHJpbmcgPSAibWFnaWMiOworCisgIGlmIChhcmdjID4gMSkKKyAgICBzZWFyY2hfc3RyaW5nID0gYXJndlsxXTsKKworICAvLyBDcmVhdGUgYSBnU09BUCBjb250ZXh0CisgIHN0cnVjdCBzb2FwICpzb2FwID0gc29hcF9uZXcoKTsKKworICAvLyBDcmVhdGUgYW4gb2JqZWN0IHRvIGZpbmQgYSBidXNpbmVzcworICB1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlIGZzKHNvYXAsIHNlYXJjaF9zdHJpbmcpOworCisgIC8vIFNlbmQgdGhlIHJlcXVlc3QKKyAgdWRkaTJfX3NlcnZpY2VMaXN0ICpzbCA9IGZzLnNlbmQoImh0dHA6Ly91ZGRpLnhtZXRob2RzLm5ldC9pbnF1aXJlIik7CisKKyAgLy8gQ2hlY2sgaWYgcmVzdWx0IGlzIE9LCisgIGlmICghc2wpCisgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOworCisgIC8vIElmIE9LLCByZXBvcnQgdGhlIHNlcnZpY2UgbmFtZShzKSBhbmQgdW5pcXVlIGlkZW50aWZpY2F0aW9uIGtleXMKKyAgZWxzZSBpZiAoc2wtPnNlcnZpY2VJbmZvcykKKyAgeworICAgIHN0ZDo6Y291dCA8PCAiU2VhcmNoIHJlc3VsdHMgb24gIiA8PCBzZWFyY2hfc3RyaW5nIDw8ICI6IiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCisgICAgZm9yIChzdGQ6OnZlY3Rvcjx1ZGRpMl9fc2VydmljZUluZm8qPjo6Y29uc3RfaXRlcmF0b3Igc2kgPSBzbC0+c2VydmljZUluZm9zLT5zZXJ2aWNlSW5mby5iZWdpbigpOyBzaSAhPSBzbC0+c2VydmljZUluZm9zLT5zZXJ2aWNlSW5mby5lbmQoKTsgKytzaSkKKyAgICB7CisgICAgICAvLyBSZXBvcnQgc2VydmljZUtleSBhbmQgYnVzaW5lc3NLZXkKKyAgICAgIHN0ZDo6Y291dCA8PCAic2VydmljZUtleT0iIDw8ICgqc2kpLT5zZXJ2aWNlS2V5IDw8IHN0ZDo6ZW5kbCA8PCAiYnVzaW5lc3NLZXk9IiA8PCAoKnNpKS0+YnVzaW5lc3NLZXkgPDwgc3RkOjplbmRsOworCisgICAgICAvLyBSZXBvcnQgbmFtZXMKKyAgICAgIGZvciAoc3RkOjp2ZWN0b3I8dWRkaTJfX25hbWUqPjo6Y29uc3RfaXRlcmF0b3IgbiA9ICgqc2kpLT5uYW1lLmJlZ2luKCk7IG4gIT0gKCpzaSktPm5hbWUuZW5kKCk7ICsrbikKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJuYW1lPSIgPDwgKCpuKS0+X19pdGVtIDw8IHN0ZDo6ZW5kbDsKKworICAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBSZW1vdmUgZGVzZXJpYWxpemVkIG9iamVjdHMKKyAgc29hcF9kZXN0cm95KHNvYXApOworCisgIC8vIFJlbW92ZSB0ZW1wb3JhcnkgZGF0YQorICBzb2FwX2VuZChzb2FwKTsKKworICAvLyBEZXRhY2ggYW5kIGZyZWUgY29udGV4dAorICBzb2FwX2RvbmUoc29hcCk7CisgIGZyZWUoc29hcCk7CisKKyAgcmV0dXJuIDA7Cit9CitAZW5kY29kZQorCitUbyBjb21waWxlOgorLSB3c2RsMmggLXR1ZGRpMi10eXBlbWFwLmRhdCBpbnF1aXJlX3YyLndzZGwKKy0gc29hcGNwcDIgLUkuLiAtcGlucSBpbnF1aXJlX3YyLmgKKy0gZysrIC1EV0lUSF9OT05BTUVTUEFDRVMgLUkuLiAtbyBleGFtcGxlMSBleGFtcGxlMS5jcHAgaW5xdWlyZV92Mi5jcHAgaW5xQy5jcHAgaW5xQ2xpZW50LmNwcCAuLi9zdGRzb2FwMi5jcHAKKyovCisKKy8qKgorQHBhZ2UgZXhhbXBsZTIgQ29kZSBFeGFtcGxlIDI6IEZpbmRpbmcgYSBidXNpbmVzcworCitUaGlzIGV4YW1wbGUgc2hvd3MgeW91IGhvdyB0byBmaW5kIGEgYnVzaW5lc3MgZnJvbSBhIFVEREkgc2VydmVyLgorCitAY29kZQorI2luY2x1ZGUgImlucUguaCIKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreyAKKyAgY2hhciAqc2VhcmNoX3N0cmluZyA9ICJ4bWV0aG9kcyI7CisKKyAgaWYgKGFyZ2MgPiAxKQorICAgIHNlYXJjaF9zdHJpbmcgPSBhcmd2WzFdOworCisgIC8vIENyZWF0ZSBhIGdTT0FQIGNvbnRleHQKKyAgc3RydWN0IHNvYXAgKnNvYXAgPSBzb2FwX25ldygpOworCisgIC8vIENyZWF0ZSBhbiBvYmplY3QgdG8gZmluZCBhIGJ1c2luZXNzCisgIHVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzIGZiKHNvYXAsIHNlYXJjaF9zdHJpbmcpOworCisgIC8vIFNlbmQgdGhlIHJlcXVlc3QKKyAgdWRkaTJfX2J1c2luZXNzTGlzdCAqYmwgPSBmYi5zZW5kKCJodHRwOi8vdWRkaS54bWV0aG9kcy5uZXQvaW5xdWlyZSIpOworCisgIC8vIENoZWNrIGlmIHJlc3VsdCBpcyBPSworICBpZiAoIWJsKQorICAgIHNvYXBfcHJpbnRfZmF1bHQoc29hcCwgc3RkZXJyKTsKKworICAvLyBJZiBPSywgcmVwb3J0IHRoZSBidXNpbmVzcyBuYW1lKHMpIGFuZCB1bmlxdWUgaWRlbnRpZmljYXRpb24ga2V5cworICBlbHNlIGlmIChibC0+YnVzaW5lc3NJbmZvcykKKyAgeworICAgIHN0ZDo6Y291dCA8PCAiU2VhcmNoIHJlc3VsdHMgb24gIiA8PCBzZWFyY2hfc3RyaW5nIDw8ICI6IiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCisgICAgZm9yIChzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NJbmZvKj46OmNvbnN0X2l0ZXJhdG9yIGJpID0gYmwtPmJ1c2luZXNzSW5mb3MtPmJ1c2luZXNzSW5mby5iZWdpbigpOyBiaSAhPSBibC0+YnVzaW5lc3NJbmZvcy0+YnVzaW5lc3NJbmZvLmVuZCgpOyArK2JpKQorICAgIHsKKyAgICAgIC8vIFJlcG9ydCBidXNpbmVzc0tleQorICAgICAgc3RkOjpjb3V0IDw8ICJidXNpbmVzc0tleT0iIDw8ICgqYmkpLT5idXNpbmVzc0tleSA8PCBzdGQ6OmVuZGw7CisKKyAgICAgIC8vIFJlcG9ydCBuYW1lcworICAgICAgZm9yIChzdGQ6OnZlY3Rvcjx1ZGRpMl9fbmFtZSo+Ojpjb25zdF9pdGVyYXRvciBuID0gKCpiaSktPm5hbWUuYmVnaW4oKTsgbiAhPSAoKmJpKS0+bmFtZS5lbmQoKTsgKytuKQorICAgICAgICBzdGQ6OmNvdXQgPDwgIm5hbWU9IiA8PCAoKm4pLT5fX2l0ZW0gPDwgc3RkOjplbmRsOworCisgICAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOworICAgIH0KKyAgfQorCisgIC8vIFJlbW92ZSBkZXNlcmlhbGl6ZWQgb2JqZWN0cworICBzb2FwX2Rlc3Ryb3koc29hcCk7CisKKyAgLy8gUmVtb3ZlIHRlbXBvcmFyeSBkYXRhCisgIHNvYXBfZW5kKHNvYXApOworCisgIC8vIERldGFjaCBhbmQgZnJlZSBjb250ZXh0CisgIHNvYXBfZG9uZShzb2FwKTsKKyAgZnJlZShzb2FwKTsKKworICByZXR1cm4gMDsKK30KK0BlbmRjb2RlCisKK1RvIGNvbXBpbGU6CistIHdzZGwyaCAtdHVkZGkyLXR5cGVtYXAuZGF0IGlucXVpcmVfdjIud3NkbAorLSBzb2FwY3BwMiAtSS4uIC1waW5xIGlucXVpcmVfdjIuaAorLSBnKysgLURXSVRIX05PTkFNRVNQQUNFUyAtSS4uIC1vIGV4YW1wbGUyIGV4YW1wbGUyLmNwcCBpbnF1aXJlX3YyLmNwcCBpbnFDLmNwcCBpbnFDbGllbnQuY3BwIC4uL3N0ZHNvYXAyLmNwcAorKi8KKy8qKgorQHBhZ2UgZXhhbXBsZTMgQ29kZSBFeGFtcGxlIDM6IFB1Ymxpc2hpbmcgYSBXU0RMIGFuZCBzZXJ2aWNlIG9uIFhNZXRob2RzCisKK1RoaXMgZXhhbXBsZSBzaG93cyB5b3UgaG93IHRvIHB1Ymxpc2ggYSBXZWIgc2VydmljZS4gSW4gdGhpcyBjYXNlLCB0aGUgZXhhbXBsZQordGVtcGxhdGUgY29kZSBvYnRhaW5zIGFuIGF1dGhvcml6YXRpb24gdG9rZW4sIHNhdmVzIHRoZSB0TW9kZWwgd2l0aCB0aGUgV1NETAorVVJMIGluIHRoZSBzZXJ2ZXIsIGFuZCBzYXZlcyB0aGUgYnVzaW5lc3Mgc2VydmljZSBpbmZvcm1hdGlvbiBpbiB0aGUgc2VydmVyLgorCitAY29kZQorI2luY2x1ZGUgInB1YkguaCIKKworY29uc3QgY2hhciAqc2VydmVyID0gImh0dHBzOi8vdWRkaS54bWV0aG9kcy5uZXQvcHVibGlzaCI7CisKK2NvbnN0IGNoYXIgKnVzZXJpZCA9ICIuLi4iOyAvLyB1c2VyIElEIHRvIGFjY2VzcyBVRERJIHNlcnZlcgorY29uc3QgY2hhciAqcGFzc3dkID0gIi4uLiI7IC8vIHBhc3N3b3JkIHRvIGFjY2VzcyBVRERJIHNlcnZlcgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7IAorICAvLyBDcmVhdGUgYSBnU09BUCBjb250ZXh0CisgIHN0cnVjdCBzb2FwICpzb2FwID0gc29hcF9uZXcoKTsKKworICAvLyBTZXR1cCBTU0wgY29udGV4dCAob3B0aW9uYWwpIHRvIHZlcmlmeSBzZXJ2ZXIncyBjcmVkZW50aWFscworICBpZiAoc29hcF9zc2xfY2xpZW50X2NvbnRleHQoc29hcCwgU09BUF9TU0xfREVGQVVMVCwgTlVMTCwgTlVMTCwgImNhY2VydHMucGVtIiwgTlVMTCwgTlVMTCkpCisgIHsgCisgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOworICAgIGV4aXQoMSk7CisgIH0KKworICAvLyBTdGVwIDE6IEdldCBhbiBhdXRob3JpemF0aW9uIHRva2VuIGZyb20gdGhlIFVEREkgc2VydmVyCisgIHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuIGdldF9hdXRoVG9rZW4oc29hcCwgdXNlcmlkLCBwYXNzd2QpOworICB1ZGRpMl9fYXV0aFRva2VuICphdXRoVG9rZW4gPSBnZXRfYXV0aFRva2VuLnNlbmQoc2VydmVyKTsKKworICAvLyBDaGVjayBpZiBhdXRob3JpemVkCisgIGlmICghYXV0aFRva2VuKQorICB7CisgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOworICAgIGV4aXQoMSk7CisgIH0KKworICAvLyBBdXRob3JpemF0aW9uIGluZm8gcHJvdmlkZWQgYnkgc2VydmVyIGZvciB0aGlzIHNlc3Npb24KKyAgY2hhciAqYXV0aEluZm8gPSBhdXRoVG9rZW4tPmF1dGhJbmZvOworCisgIC8vIFN0ZXAgMjogQ3JlYXRlIGEgdE1vZGVsIGZvciB0aGUgV1NETCB0byBiZSBwdWJsaXNoZWQKKyAgdWRkaTJfX3RNb2RlbCB0TW9kZWw7CisgIHRNb2RlbC5zb2FwX2RlZmF1bHQoc29hcCk7CisKKyAgLy8gQ3JlYXRlIHRoZSB0TW9kZWwgYW5kIHNlcnZpY2UgbmFtZQorICB0TW9kZWwubmFtZSA9IHNvYXBfbmV3X3VkZGkyX19uYW1lKHNvYXAsIC0xKTsKKyAgdE1vZGVsLm5hbWUtPl9faXRlbSA9ICIuLi4iOworICB0TW9kZWwubmFtZS0+eG1sX19sYW5nXyA9ICJlbiI7CisKKyAgLy8gQ3JlYXRlIFhNZXRob2RzIGRlc2NyaXB0aW9uIGVsZW1lbnRzIChzZWUgaHR0cDovL3d3dy54bWV0aG9kcy5uZXQvdmUyL1VEREkucG8pCisgIHVkZGkyX19kZXNjcmlwdGlvbiAqZGVzY3JpcHRpb24gPSBzb2FwX25ld191ZGRpMl9fZGVzY3JpcHRpb24oc29hcCwgNik7CisgIGRlc2NyaXB0aW9uWzBdLl9faXRlbSA9ICJTSE9SVCBERVNDUklQVElPTjogLi4uIjsKKyAgZGVzY3JpcHRpb25bMF0ueG1sX19sYW5nXyA9ICJlbiI7CisgIGRlc2NyaXB0aW9uWzFdLl9faXRlbSA9ICJTSE9SVCBERVNDUklQVElPTjogLi4uIjsKKyAgZGVzY3JpcHRpb25bMV0ueG1sX19sYW5nXyA9ICJlbiI7CisgIGRlc2NyaXB0aW9uWzJdLl9faXRlbSA9ICJVU0FHRSBOT1RFUzogLi4uIjsKKyAgZGVzY3JpcHRpb25bMl0ueG1sX19sYW5nXyA9ICJlbiI7CisgIGRlc2NyaXB0aW9uWzNdLl9faXRlbSA9ICJIT01FUEFHRSBVUkw6IC4uLiI7CisgIGRlc2NyaXB0aW9uWzNdLnhtbF9fbGFuZ18gPSAiZW4iOworICBkZXNjcmlwdGlvbls0XS5fX2l0ZW0gPSAiQ09OVEFDVCBFTUFJTDogLi4uIjsKKyAgZGVzY3JpcHRpb25bNF0ueG1sX19sYW5nXyA9ICJlbiI7CisgIGRlc2NyaXB0aW9uWzVdLl9faXRlbSA9ICJJTVBMRU1FTlRBVElPTjogLi4uIjsKKyAgZGVzY3JpcHRpb25bNV0ueG1sX19sYW5nXyA9ICJlbiI7CisKKyAgLy8gQWRkIHRoZSBmb3VyIGRlc2NyaXB0aW9uIGVsZW1lbnRzIHRvIHRoZSB0TW9kZWwKKyAgdE1vZGVsLmRlc2NyaXB0aW9uLnB1c2hfYmFjayhkZXNjcmlwdGlvbiArIDApOworICB0TW9kZWwuZGVzY3JpcHRpb24ucHVzaF9iYWNrKGRlc2NyaXB0aW9uICsgMSk7CisgIHRNb2RlbC5kZXNjcmlwdGlvbi5wdXNoX2JhY2soZGVzY3JpcHRpb24gKyAyKTsKKyAgdE1vZGVsLmRlc2NyaXB0aW9uLnB1c2hfYmFjayhkZXNjcmlwdGlvbiArIDQpOworCisgIC8vIEFkZCBhbiBvdmVydmlld0RvYyBlbGVtZW50IHdpdGggZGVzY3JpcHRpb24gYW5kIG92ZXJ2aWV3VVJMCisgIHRNb2RlbC5vdmVydmlld0RvYyA9IHNvYXBfbmV3X3VkZGkyX19vdmVydmlld0RvYyhzb2FwLCAtMSk7CisgIHRNb2RlbC5vdmVydmlld0RvYy0+c29hcF9kZWZhdWx0KHNvYXApOworICB0TW9kZWwub3ZlcnZpZXdEb2MtPmRlc2NyaXB0aW9uLnB1c2hfYmFjayhzb2FwX25ld191ZGRpMl9fZGVzY3JpcHRpb24oc29hcCwgLTEpKTsKKyAgdE1vZGVsLm92ZXJ2aWV3RG9jLT5kZXNjcmlwdGlvblswXS0+X19pdGVtID0gIldTREwgc291cmNlIGRvY3VtZW50IjsKKyAgdE1vZGVsLm92ZXJ2aWV3RG9jLT5kZXNjcmlwdGlvblswXS0+eG1sX19sYW5nXyA9ICJlbiI7CisgIHRNb2RlbC5vdmVydmlld0RvYy0+b3ZlcnZpZXdVUkwgPSAiaHR0cDovLy4uLi9teS53c2RsI2JpbmRpbmdOYW1lIjsKKworICAvLyBPbWl0IGlkZW50aWZpZXIgYmFnCisgIHRNb2RlbC5pZGVudGlmaWVyQmFnID0gTlVMTDsKKworICAvLyBBZGQgYSBjYXRlZ29yeSB3aXRoIGEgV1NETC1zcGVjaWZpYyBrZXllZFJlZmVyZW5jZQorICB0TW9kZWwuY2F0ZWdvcnlCYWcgPSBzb2FwX25ld191ZGRpMl9fY2F0ZWdvcnlCYWcoc29hcCwgLTEpOworICB0TW9kZWwuY2F0ZWdvcnlCYWctPnNvYXBfZGVmYXVsdChzb2FwKTsKKyAgdE1vZGVsLmNhdGVnb3J5QmFnLT5rZXllZFJlZmVyZW5jZS5wdXNoX2JhY2soc29hcF9uZXdfdWRkaTJfX2tleWVkUmVmZXJlbmNlKHNvYXAsIC0xKSk7CisgIHRNb2RlbC5jYXRlZ29yeUJhZy0+a2V5ZWRSZWZlcmVuY2VbMF0tPnRNb2RlbEtleSA9ICIuLi4iOworICB0TW9kZWwuY2F0ZWdvcnlCYWctPmtleWVkUmVmZXJlbmNlWzBdLT5rZXlOYW1lID0gInVkZGktb3JnOnR5cGVzIjsKKyAgdE1vZGVsLmNhdGVnb3J5QmFnLT5rZXllZFJlZmVyZW5jZVswXS0+a2V5VmFsdWUgPSAid3NkbFNwZWMiOworCisgIHRNb2RlbC5hdXRob3JpemVkTmFtZSA9ICIuLi4iOworICB0TW9kZWwub3BlcmF0b3JfID0gIi4uLiI7CisgIHRNb2RlbC50TW9kZWxLZXkgPSAiLi4uIjsKKworICAvLyBTYXZlIHRoZSB0TW9kZWwKKyAgdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsIHNhdmVfdE1vZGVsKHNvYXAsIHRNb2RlbCk7CisgIHVkZGkyX190TW9kZWxEZXRhaWwgKnRNb2RlbERldGFpbCA9IHNhdmVfdE1vZGVsLnNlbmQoc2VydmVyLCBhdXRoSW5mbyk7CisKKyAgLy8gU3RlcCAzOiBDcmVhdGUgYSBuZXcgc2VydmljZSB0byBiZSBwdWJsaXNoZWQKKyAgdWRkaTJfX2J1c2luZXNzU2VydmljZSBzZXJ2aWNlOworICBzZXJ2aWNlLnNvYXBfZGVmYXVsdChzb2FwKTsKKworICAvLyBTZXJ2aWNlIG5hbWUgaXMgdGhlIHRNb2RlbCBuYW1lIChYTWV0aG9kcykKKyAgc2VydmljZS5uYW1lLnB1c2hfYmFjayh0TW9kZWwubmFtZSk7CisKKyAgLy8gQWRkIHR3byBkZXNjcmlwdGlvbiBlbGVtZW50cyB0byB0aGUgc2VydmljZQorICBzZXJ2aWNlLmRlc2NyaXB0aW9uLnB1c2hfYmFjayhkZXNjcmlwdGlvbiArIDQpOworICBzZXJ2aWNlLmRlc2NyaXB0aW9uLnB1c2hfYmFjayhkZXNjcmlwdGlvbiArIDUpOworCisgIC8vIENyZWF0ZSBiaW5kaW5nIHRlbXBsYXRlCisgIHVkZGkyX19iaW5kaW5nVGVtcGxhdGUgYmluZGluZ1RlbXBsYXRlOworICBiaW5kaW5nVGVtcGxhdGUuc29hcF9kZWZhdWx0KHNvYXApOworICBiaW5kaW5nVGVtcGxhdGUudE1vZGVsSW5zdGFuY2VEZXRhaWxzID0gc29hcF9uZXdfdWRkaTJfX3RNb2RlbEluc3RhbmNlRGV0YWlscyhzb2FwLCAtMSk7CisgIGJpbmRpbmdUZW1wbGF0ZS50TW9kZWxJbnN0YW5jZURldGFpbHMtPnRNb2RlbEluc3RhbmNlSW5mby5wdXNoX2JhY2soc29hcF9uZXdfdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyhzb2FwLCAtMSkpOworICBiaW5kaW5nVGVtcGxhdGUudE1vZGVsSW5zdGFuY2VEZXRhaWxzLT50TW9kZWxJbnN0YW5jZUluZm9bMF0tPmluc3RhbmNlRGV0YWlscyA9IE5VTEw7CisgIGJpbmRpbmdUZW1wbGF0ZS50TW9kZWxJbnN0YW5jZURldGFpbHMtPnRNb2RlbEluc3RhbmNlSW5mb1swXS0+dE1vZGVsS2V5ID0gdE1vZGVsLnRNb2RlbEtleTsKKyAgYmluZGluZ1RlbXBsYXRlLmFjY2Vzc1BvaW50ID0gc29hcF9uZXdfdWRkaTJfX2FjY2Vzc1BvaW50KHNvYXAsIC0xKTsKKyAgYmluZGluZ1RlbXBsYXRlLmFjY2Vzc1BvaW50LT5fX2l0ZW0gPSAiLi4uIjsKKyAgYmluZGluZ1RlbXBsYXRlLmFjY2Vzc1BvaW50LT5VUkxUeXBlID0gdWRkaTJfX1VSTFR5cGVfX2h0dHA7CisgIGJpbmRpbmdUZW1wbGF0ZS5ob3N0aW5nUmVkaXJlY3RvciA9IE5VTEw7CisgIGJpbmRpbmdUZW1wbGF0ZS5zZXJ2aWNlS2V5ID0gIi4uLiI7CisgIGJpbmRpbmdUZW1wbGF0ZS5iaW5kaW5nS2V5ID0gIi4uLiI7CisKKyAgLy8gQWRkIGJpbmRpbmcgVGVtcGxhdGUgdG8gc2VydmljZQorICBzZXJ2aWNlLmJpbmRpbmdUZW1wbGF0ZXMgPSBzb2FwX25ld191ZGRpMl9fYmluZGluZ1RlbXBsYXRlcyhzb2FwLCAtMSk7CisgIHNlcnZpY2UuYmluZGluZ1RlbXBsYXRlcy0+c29hcF9kZWZhdWx0KHNvYXApOworICBzZXJ2aWNlLmJpbmRpbmdUZW1wbGF0ZXMtPmJpbmRpbmdUZW1wbGF0ZS5wdXNoX2JhY2soJmJpbmRpbmdUZW1wbGF0ZSk7CisKKyAgc2VydmljZS5jYXRlZ29yeUJhZyA9IE5VTEw7CisgIHNlcnZpY2Uuc2VydmljZUtleSA9ICIuLi4iOworICBzZXJ2aWNlLmJ1c2luZXNzS2V5ID0gIi4uLiI7CisKKyAgLy8gU2F2ZSB0aGUgc2VydmljZQorICB1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlIHNhdmVfc2VydmljZShzb2FwLCBzZXJ2aWNlKTsKKyAgdWRkaTJfX3NlcnZpY2VEZXRhaWwgKnNlcnZpY2VEZXRhaWwgPSBzYXZlX3NlcnZpY2Uuc2VuZChzZXJ2ZXIsIGF1dGhJbmZvKTsKKworICAvLyBTdGVwIDQ6IERpc2NhcmQgYXV0aG9yaXphdGlvbiB0b2tlbgorICB1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4gZGlzY2FyZF9hdXRoVG9rZW4oc29hcCwgYXV0aEluZm8pOworICB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgKmRpc3Bvc2l0aW9uUmVwb3J0ID0gZGlzY2FyZF9hdXRoVG9rZW4uc2VuZChzZXJ2ZXIpOworCisgIC8vIFJlbW92ZSBkZXNlcmlhbGl6ZWQgb2JqZWN0cworICBzb2FwX2Rlc3Ryb3koc29hcCk7CisKKyAgLy8gUmVtb3ZlIHRlbXBvcmFyeSBkYXRhCisgIHNvYXBfZW5kKHNvYXApOworCisgIC8vIERldGFjaCBhbmQgZnJlZSBjb250ZXh0CisgIHNvYXBfZG9uZShzb2FwKTsKKyAgZnJlZShzb2FwKTsKKworICByZXR1cm4gMDsKK30KK0BlbmRjb2RlCitUbyBjb21waWxlOgorLSB3c2RsMmggLXR1ZGRpMi10eXBlbWFwLmRhdCBwdWJsaXNoX3YyLndzZGwKKy0gc29hcGNwcDIgLUkuLiAtcHB1YiBwdWJsaXNoX3YyLmgKKy0gZysrIC1EV0lUSF9PUEVOU1NMIC1EV0lUSF9OT05BTUVTUEFDRVMgLUkuLiAtbyBleGFtcGxlMyBleGFtcGxlMy5jcHAgcHVibGlzaF92Mi5jcHAgcHViQy5jcHAgcHViQ2xpZW50LmNwcCAuLi9zdGRzb2FwMi5jcHAKKyovCisvKiBwdWJsaXNoX3YyLmgKKyAgIEdlbmVyYXRlZCBieSB3c2RsMmggMS4yLjAgZnJvbSBwdWJsaXNoX3YyLndzZGwgYW5kIHVkZGkyLXR5cGVtYXAuZGF0CisgICAyMDA1LTA0LTI0IDAwOjI5OjQxIEdNVAorICAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgIFRoaXMgcGFydCBvZiB0aGUgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXM6CisgICBHUEwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorKi8KKworLyogTk9URToKKworIC0gQ29tcGlsZSB0aGlzIGZpbGUgd2l0aCBzb2FwY3BwMiB0byBjb21wbGV0ZSB0aGUgY29kZSBnZW5lcmF0aW9uIHByb2Nlc3MuCisgLSBVc2Ugd3NkbDJoIG9wdGlvbiAtbCB0byB2aWV3IHRoZSBzb2Z0d2FyZSBsaWNlbnNlIHRlcm1zLgorIC0gVXNlIHdzZGwyaCBvcHRpb25zIC1jIGFuZCAtcyB0byBnZW5lcmF0ZSBwdXJlIEMgY29kZSBvciBDKysgY29kZSB3aXRob3V0IFNUTC4KKyAtIFRvIGJ1aWxkIHdpdGggU1RMLCBzdGx2ZWN0b3IuaCBmcm9tIHRoZSBnU09BUCBkaXN0cmlidXRpb24gbXVzdCBiZSBpbiB0aGUKKyAgIGN1cnJlbnQgZGlyZWN0b3J5LiBPciB1c2Ugc29hcGNwcDIgb3B0aW9uIC1JPHBhdGg+IHdpdGggcGF0aCB0byBzdGx2ZWN0b3IuaC4KKyAtIFVzZSB0eXBlbWFwLmRhdCB0byBjb250cm9sIHNjaGVtYSBuYW1lc3BhY2UgYmluZGluZ3MgYW5kIHR5cGUgbWFwcGluZ3MuCisgICBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBjdXN0b21pemUgdGhlIG5hbWVzIG9mIHRoZSBuYW1lc3BhY2UgcHJlZml4ZXMKKyAgIGdlbmVyYXRlZCBieSB3c2RsMmguIFRvIGRvIHNvLCBtb2RpZnkgdGhlIHByZWZpeCBiaW5kaW5ncyBpbiB0aGUgTmFtZXNwYWNlcworICAgc2VjdGlvbiBiZWxvdyBhbmQgYWRkIHRoZSBtb2RpZmllZCBsaW5lcyB0byB0eXBlbWFwLmRhdCB0byByZXJ1biB3c2RsMmguCisgLSBVc2UgRG94eWdlbiAod3d3LmRveHlnZW4ub3JnKSB0byBicm93c2UgdGhpcyBmaWxlLgorCisqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogdXJuOnVkZGktb3JnOnB1YmxpY2F0aW9uX3YyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogV1NETCBEb2N1bWVudGF0aW9uOgorCisKKwkJQ29weXJpZ2h0IChjKSAyMDAwIC0gMjAwMiBieSBBY2NlbnR1cmUsIEFyaWJhLCBJbmMuLCBDb21tZXJjZSBPbmUsIEluYy4gCisJCUZ1aml0c3UgTGltaXRlZCwgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnksIGkyIFRlY2hub2xvZ2llcywgSW5jLiwgCisJCUludGVsIENvcnBvcmF0aW9uLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uLCAgCisJCU1pY3Jvc29mdCBDb3Jwb3JhdGlvbiwgT3JhY2xlIENvcnBvcmF0aW9uLCBTQVAgQUcsIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIAorCQlhbmQgVmVyaVNpZ24sIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisJCQorCQlXU0RMIFNlcnZpY2UgSW50ZXJmYWNlIGZvciBVRERJIFB1YmxpY2F0aW9uIEFQSSBWMi4wCisJCQorCQlUaGlzIFdTREwgZG9jdW1lbnQgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gQVBJIGNhbGxzIGZvciBpbnRlcmFjdGluZyB3aXRoIAorCQl0aGUgVURESSByZWdpc3RyeS4gIFRoZSBjb21wbGV0ZSBVRERJIEFQSSBzcGVjaWZpY2F0aW9uIGlzIGF2YWlsYWJsZQorCQlhdCBodHRwOi8vd3d3LnVkZGkub3JnL3NwZWNpZmljYXRpb24uaHRtbC4KKwkKKyovCisKKy8vZ3NvYXBvcHQgdworCisjaW1wb3J0ICJzdGx2ZWN0b3IuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFNjaGVtYSBOYW1lc3BhY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyogTk9URToKKworSXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gY3VzdG9taXplIHRoZSBuYW1lcyBvZiB0aGUgbmFtZXNwYWNlIHByZWZpeGVzCitnZW5lcmF0ZWQgYnkgd3NkbDJoLiBUbyBkbyBzbywgbW9kaWZ5IHRoZSBwcmVmaXggYmluZGluZ3MgYmVsb3cgYW5kIGFkZCB0aGUKK21vZGlmaWVkIGxpbmVzIHRvIHR5cGVtYXAuZGF0IHRvIHJlcnVuIHdzZGwyaDoKKworcHViMiA9ICJ1cm46dWRkaS1vcmc6cHVibGljYXRpb25fdjIiCit1ZGRpMiA9IHVybjp1ZGRpLW9yZzphcGlfdjIKKworKi8KKworLy9nc29hcCBwdWIyICBzY2hlbWEgbmFtZXNwYWNlOgl1cm46dWRkaS1vcmc6cHVibGljYXRpb25fdjIKKy8vZ3NvYXAgdWRkaTIgc2NoZW1hIG5hbWVzcGFjZToJdXJuOnVkZGktb3JnOmFwaV92MgorLy9nc29hcCBwdWIyICBzY2hlbWEgZm9ybToJdW5xdWFsaWZpZWQKKy8vZ3NvYXAgdWRkaTIgc2NoZW1hIGVsZW1lbnRGb3JtOglxdWFsaWZpZWQKKy8vZ3NvYXAgdWRkaTIgc2NoZW1hIGF0dHJpYnV0ZUZvcm06CXVucXVhbGlmaWVkCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBTY2hlbWEgVHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8vLyBQcmltaXRpdmUgYnVpbHQtaW4gdHlwZSAieHM6Tk1UT0tFTiIKK3R5cGVkZWYgY2hhciogeHNkX19OTVRPS0VOOworCisvLy8gQnVpbHQtaW4gYXR0cmlidXRlICJ4bWw6bGFuZyIKK3R5cGVkZWYgY2hhciogeG1sX19sYW5nOworCitjbGFzcyB1ZGRpMl9fYWNjZXNzUG9pbnQ7CitjbGFzcyB1ZGRpMl9fYWRkcmVzczsKK2NsYXNzIHVkZGkyX19hZGRyZXNzTGluZTsKK2NsYXNzIHVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtOworY2xhc3MgdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZTsKK2NsYXNzIHVkZGkyX19iaW5kaW5nVGVtcGxhdGVzOworY2xhc3MgdWRkaTJfX2J1c2luZXNzRW50aXR5OworY2xhc3MgdWRkaTJfX2J1c2luZXNzRW50aXR5RXh0OworY2xhc3MgdWRkaTJfX2J1c2luZXNzSW5mbzsKK2NsYXNzIHVkZGkyX19idXNpbmVzc0luZm9zOworY2xhc3MgdWRkaTJfX2J1c2luZXNzU2VydmljZTsKK2NsYXNzIHVkZGkyX19idXNpbmVzc1NlcnZpY2VzOworY2xhc3MgdWRkaTJfX2NhdGVnb3J5QmFnOworY2xhc3MgdWRkaTJfX2NvbnRhY3Q7CitjbGFzcyB1ZGRpMl9fY29udGFjdHM7CitjbGFzcyB1ZGRpMl9fZGVzY3JpcHRpb247CitjbGFzcyB1ZGRpMl9fZGlzY292ZXJ5VVJMOworY2xhc3MgdWRkaTJfX2Rpc2NvdmVyeVVSTHM7CitjbGFzcyB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQ7CitjbGFzcyB1ZGRpMl9fZW1haWw7CitjbGFzcyB1ZGRpMl9fZXJySW5mbzsKK2NsYXNzIHVkZGkyX19maW5kUXVhbGlmaWVyczsKK2NsYXNzIHVkZGkyX19ob3N0aW5nUmVkaXJlY3RvcjsKK2NsYXNzIHVkZGkyX19pZGVudGlmaWVyQmFnOworY2xhc3MgdWRkaTJfX2luc3RhbmNlRGV0YWlsczsKK2NsYXNzIHVkZGkyX19rZXllZFJlZmVyZW5jZTsKK2NsYXNzIHVkZGkyX19rZXlzT3duZWQ7CitjbGFzcyB1ZGRpMl9fbmFtZTsKK2NsYXNzIHVkZGkyX19vdmVydmlld0RvYzsKK2NsYXNzIHVkZGkyX19waG9uZTsKK2NsYXNzIHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb247CitjbGFzcyB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbzsKK2NsYXNzIHVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvczsKK2NsYXNzIHVkZGkyX19yZXN1bHQ7CitjbGFzcyB1ZGRpMl9fc2VydmljZUluZm87CitjbGFzcyB1ZGRpMl9fc2VydmljZUluZm9zOworY2xhc3MgdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHM7CitjbGFzcyB1ZGRpMl9fdE1vZGVsOworY2xhc3MgdWRkaTJfX3RNb2RlbEJhZzsKK2NsYXNzIHVkZGkyX190TW9kZWxJbmZvOworY2xhc3MgdWRkaTJfX3RNb2RlbEluZm9zOworY2xhc3MgdWRkaTJfX3RNb2RlbEluc3RhbmNlRGV0YWlsczsKK2NsYXNzIHVkZGkyX190TW9kZWxJbnN0YW5jZUluZm87CitjbGFzcyB1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM7CitjbGFzcyB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmc7CitjbGFzcyB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzOworY2xhc3MgdWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOworY2xhc3MgdWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlOworY2xhc3MgdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWw7CitjbGFzcyB1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW47CitjbGFzcyB1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nOworY2xhc3MgdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M7CitjbGFzcyB1ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlczsKK2NsYXNzIHVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2U7CitjbGFzcyB1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWw7CitjbGFzcyB1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydDsKK2NsYXNzIHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuOworY2xhc3MgdWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsOworY2xhc3MgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbDsKK2NsYXNzIHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQ7CitjbGFzcyB1ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM7CitjbGFzcyB1ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvOworY2xhc3MgdWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsOworY2xhc3MgdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWw7CitjbGFzcyB1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nOworY2xhc3MgdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M7CitjbGFzcyB1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlOworY2xhc3MgdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsOworY2xhc3MgdWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOworY2xhc3MgdWRkaTJfX3ZhbGlkYXRlX1VTQ09SRXZhbHVlczsKK2NsYXNzIHVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQ7CitjbGFzcyB1ZGRpMl9fYXV0aFRva2VuOworY2xhc3MgdWRkaTJfX2JpbmRpbmdEZXRhaWw7CitjbGFzcyB1ZGRpMl9fYnVzaW5lc3NEZXRhaWw7CitjbGFzcyB1ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHQ7CitjbGFzcyB1ZGRpMl9fYnVzaW5lc3NMaXN0OworY2xhc3MgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnM7CitjbGFzcyB1ZGRpMl9fcmVnaXN0ZXJlZEluZm87CitjbGFzcyB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0OworY2xhc3MgdWRkaTJfX3NlcnZpY2VEZXRhaWw7CitjbGFzcyB1ZGRpMl9fc2VydmljZUxpc3Q7CitjbGFzcyB1ZGRpMl9fdE1vZGVsRGV0YWlsOworY2xhc3MgdWRkaTJfX3RNb2RlbExpc3Q7CisKKy8vLyBTY2hlbWEgInVybjp1ZGRpLW9yZzphcGlfdjIiOmJpbmRpbmdLZXkgc2ltcGxlVHlwZSByZXN0cmljdGlvbiBvZiB4czpzdHJpbmcKKwordHlwZWRlZiBjaGFyKiB1ZGRpMl9fYmluZGluZ0tleTsKKworLy8vIFNjaGVtYSAidXJuOnVkZGktb3JnOmFwaV92MiI6YnVzaW5lc3NLZXkgc2ltcGxlVHlwZSByZXN0cmljdGlvbiBvZiB4czpzdHJpbmcKKwordHlwZWRlZiBjaGFyKiB1ZGRpMl9fYnVzaW5lc3NLZXk7CisKKy8vLyBTY2hlbWEgInVybjp1ZGRpLW9yZzphcGlfdjIiOnNlcnZpY2VLZXkgc2ltcGxlVHlwZSByZXN0cmljdGlvbiBvZiB4czpzdHJpbmcKKwordHlwZWRlZiBjaGFyKiB1ZGRpMl9fc2VydmljZUtleTsKKworLy8vIFNjaGVtYSAidXJuOnVkZGktb3JnOmFwaV92MiI6dE1vZGVsS2V5IHNpbXBsZVR5cGUgcmVzdHJpY3Rpb24gb2YgeHM6c3RyaW5nCisKK3R5cGVkZWYgY2hhciogdWRkaTJfX3RNb2RlbEtleTsKKworLy8vIFNjaGVtYSAidXJuOnVkZGktb3JnOmFwaV92MiI6ZGlyZWN0aW9uIHNpbXBsZVR5cGUgcmVzdHJpY3Rpb24gb2YgeHM6Tk1UT0tFTgorCisvLy8gTm90ZTogZW51bSB2YWx1ZXMgYXJlIHByZWZpeGVkIHdpdGggJ3VkZGkyX19kaXJlY3Rpb24nIHRvIGF2b2lkIG5hbWUgY2xhc2hlcywgcGxlYXNlIHVzZSB3c2RsMmggb3B0aW9uIC1lIHRvIG9taXQgdGhpcyBwcmVmaXgKK2VudW0gdWRkaTJfX2RpcmVjdGlvbgorewl1ZGRpMl9fZGlyZWN0aW9uX19mcm9tS2V5LAkvLy88IHhzOk5NVE9LRU4gdmFsdWU9ImZyb21LZXkiCisJdWRkaTJfX2RpcmVjdGlvbl9fdG9LZXksCS8vLzwgeHM6Tk1UT0tFTiB2YWx1ZT0idG9LZXkiCit9OworCisvLy8gU2NoZW1hICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0cnVuY2F0ZWQgc2ltcGxlVHlwZSByZXN0cmljdGlvbiBvZiB4czpOTVRPS0VOCisKKy8vLyBOb3RlOiBlbnVtIHZhbHVlcyBhcmUgcHJlZml4ZWQgd2l0aCAndWRkaTJfX3RydW5jYXRlZCcgdG8gYXZvaWQgbmFtZSBjbGFzaGVzLCBwbGVhc2UgdXNlIHdzZGwyaCBvcHRpb24gLWUgdG8gb21pdCB0aGlzIHByZWZpeAorZW51bSB1ZGRpMl9fdHJ1bmNhdGVkCit7CXVkZGkyX190cnVuY2F0ZWRfX3RydWVfLAkvLy88IHhzOk5NVE9LRU4gdmFsdWU9InRydWUiCisJdWRkaTJfX3RydW5jYXRlZF9fZmFsc2VfLAkvLy88IHhzOk5NVE9LRU4gdmFsdWU9ImZhbHNlIgorfTsKKworLy8vIFNjaGVtYSAidXJuOnVkZGktb3JnOmFwaV92MiI6VVJMVHlwZSBzaW1wbGVUeXBlIHJlc3RyaWN0aW9uIG9mIHhzOk5NVE9LRU4KKworLy8vIE5vdGU6IGVudW0gdmFsdWVzIGFyZSBwcmVmaXhlZCB3aXRoICd1ZGRpMl9fVVJMVHlwZScgdG8gYXZvaWQgbmFtZSBjbGFzaGVzLCBwbGVhc2UgdXNlIHdzZGwyaCBvcHRpb24gLWUgdG8gb21pdCB0aGlzIHByZWZpeAorZW51bSB1ZGRpMl9fVVJMVHlwZQorewl1ZGRpMl9fVVJMVHlwZV9fbWFpbHRvLAkvLy88IHhzOk5NVE9LRU4gdmFsdWU9Im1haWx0byIKKwl1ZGRpMl9fVVJMVHlwZV9faHR0cCwJLy8vPCB4czpOTVRPS0VOIHZhbHVlPSJodHRwIgorCXVkZGkyX19VUkxUeXBlX19odHRwcywJLy8vPCB4czpOTVRPS0VOIHZhbHVlPSJodHRwcyIKKwl1ZGRpMl9fVVJMVHlwZV9fZnRwLAkvLy88IHhzOk5NVE9LRU4gdmFsdWU9ImZ0cCIKKwl1ZGRpMl9fVVJMVHlwZV9fZmF4LAkvLy88IHhzOk5NVE9LRU4gdmFsdWU9ImZheCIKKwl1ZGRpMl9fVVJMVHlwZV9fcGhvbmUsCS8vLzwgeHM6Tk1UT0tFTiB2YWx1ZT0icGhvbmUiCisJdWRkaTJfX1VSTFR5cGVfX290aGVyLAkvLy88IHhzOk5NVE9LRU4gdmFsdWU9Im90aGVyIgorfTsKKworLy8vIFNjaGVtYSAidXJuOnVkZGktb3JnOmFwaV92MiI6a2V5VHlwZSBzaW1wbGVUeXBlIHJlc3RyaWN0aW9uIG9mIHhzOk5NVE9LRU4KKworLy8vIE5vdGU6IGVudW0gdmFsdWVzIGFyZSBwcmVmaXhlZCB3aXRoICd1ZGRpMl9fa2V5VHlwZScgdG8gYXZvaWQgbmFtZSBjbGFzaGVzLCBwbGVhc2UgdXNlIHdzZGwyaCBvcHRpb24gLWUgdG8gb21pdCB0aGlzIHByZWZpeAorZW51bSB1ZGRpMl9fa2V5VHlwZQorewl1ZGRpMl9fa2V5VHlwZV9fYnVzaW5lc3NLZXksCS8vLzwgeHM6Tk1UT0tFTiB2YWx1ZT0iYnVzaW5lc3NLZXkiCisJdWRkaTJfX2tleVR5cGVfX3RNb2RlbEtleSwJLy8vPCB4czpOTVRPS0VOIHZhbHVlPSJ0TW9kZWxLZXkiCisJdWRkaTJfX2tleVR5cGVfX3NlcnZpY2VLZXksCS8vLzwgeHM6Tk1UT0tFTiB2YWx1ZT0ic2VydmljZUtleSIKKwl1ZGRpMl9fa2V5VHlwZV9fYmluZGluZ0tleSwJLy8vPCB4czpOTVRPS0VOIHZhbHVlPSJiaW5kaW5nS2V5IgorfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJhZGRyZXNzIgorCitjbGFzcyB1ZGRpMl9fYWRkcmVzcworeyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX19hZGRyZXNzTGluZSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2FkZHJlc3NMaW5lKiAgICA+IGFkZHJlc3NMaW5lICAgICAgICAgICAgICAgICAgICAwOworLy8vIEF0dHJpYnV0ZSB1c2VUeXBlIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBzb3J0Q29kZSBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0Q29kZSAgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgdE1vZGVsS2V5IG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRNb2RlbEtleQorICAgQHVkZGkyX190TW9kZWxLZXkgICAgICAgICAgICAgICAgICAgICB0TW9kZWxLZXkgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImFzc2VydGlvblN0YXR1c0l0ZW0iCisKK2NsYXNzIHVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtCit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6ZnJvbUtleQorICAgIHVkZGkyX19idXNpbmVzc0tleSAgICAgICAgICAgICAgICAgICBmcm9tS2V5ICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRvS2V5CisgICAgdWRkaTJfX2J1c2luZXNzS2V5ICAgICAgICAgICAgICAgICAgIHRvS2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6a2V5ZWRSZWZlcmVuY2UKKyAgICB1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UqICAgICAgICAgICAgICAga2V5ZWRSZWZlcmVuY2UgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjprZXlzT3duZWQKKyAgICB1ZGRpMl9fa2V5c093bmVkKiAgICAgICAgICAgICAgICAgICAga2V5c093bmVkICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIEF0dHJpYnV0ZSBjb21wbGV0aW9uU3RhdHVzIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25TdGF0dXMgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYmluZGluZ1RlbXBsYXRlIgorCitjbGFzcyB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlCit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2Rlc2NyaXB0aW9uKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZGVzY3JpcHRpb24qICAgID4gZGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgIDA7CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRNb2RlbEluc3RhbmNlRGV0YWlscworICAgIHVkZGkyX190TW9kZWxJbnN0YW5jZURldGFpbHMqICAgICAgICB0TW9kZWxJbnN0YW5jZURldGFpbHMgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLyBDSE9JQ0UgT0YgRUxFTUVOVFM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmFjY2Vzc1BvaW50CisgICAgdWRkaTJfX2FjY2Vzc1BvaW50KiAgICAgICAgICAgICAgICAgIGFjY2Vzc1BvaW50ICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6aG9zdGluZ1JlZGlyZWN0b3IKKyAgICB1ZGRpMl9faG9zdGluZ1JlZGlyZWN0b3IqICAgICAgICAgICAgaG9zdGluZ1JlZGlyZWN0b3IgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8gRU5EIENIT0lDRQorLy8vIEF0dHJpYnV0ZSBzZXJ2aWNlS2V5IG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOnNlcnZpY2VLZXkKKyAgIEB1ZGRpMl9fc2VydmljZUtleSAgICAgICAgICAgICAgICAgICAgc2VydmljZUtleSAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIGJpbmRpbmdLZXkgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YmluZGluZ0tleQorICAgQHVkZGkyX19iaW5kaW5nS2V5ICAgICAgICAgICAgICAgICAgICBiaW5kaW5nS2V5ICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImJpbmRpbmdUZW1wbGF0ZXMiCisKK2NsYXNzIHVkZGkyX19iaW5kaW5nVGVtcGxhdGVzCit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2JpbmRpbmdUZW1wbGF0ZSo+IGJpbmRpbmdUZW1wbGF0ZSAgICAgICAgICAgICAgICAwOworLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYnVzaW5lc3NFbnRpdHkiCisKK2NsYXNzIHVkZGkyX19idXNpbmVzc0VudGl0eQoreyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmRpc2NvdmVyeVVSTHMKKyAgICB1ZGRpMl9fZGlzY292ZXJ5VVJMcyogICAgICAgICAgICAgICAgZGlzY292ZXJ5VVJMcyAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudAorLy8vIFZlY3RvciBvZiB1ZGRpMl9fbmFtZSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX25hbWUqICAgICAgICAgICA+IG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAxOworLy8vIFZlY3RvciBvZiB1ZGRpMl9fZGVzY3JpcHRpb24qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19kZXNjcmlwdGlvbiogICAgPiBkZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgMDsKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6Y29udGFjdHMKKyAgICB1ZGRpMl9fY29udGFjdHMqICAgICAgICAgICAgICAgICAgICAgY29udGFjdHMgICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudAorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpidXNpbmVzc1NlcnZpY2VzCisgICAgdWRkaTJfX2J1c2luZXNzU2VydmljZXMqICAgICAgICAgICAgIGJ1c2luZXNzU2VydmljZXMgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6aWRlbnRpZmllckJhZworICAgIHVkZGkyX19pZGVudGlmaWVyQmFnKiAgICAgICAgICAgICAgICBpZGVudGlmaWVyQmFnICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmNhdGVnb3J5QmFnCisgICAgdWRkaTJfX2NhdGVnb3J5QmFnKiAgICAgICAgICAgICAgICAgIGNhdGVnb3J5QmFnICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQKKy8vLyBBdHRyaWJ1dGUgYnVzaW5lc3NLZXkgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YnVzaW5lc3NLZXkKKyAgIEB1ZGRpMl9fYnVzaW5lc3NLZXkgICAgICAgICAgICAgICAgICAgYnVzaW5lc3NLZXkgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIG9wZXJhdG9yIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yXyAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBhdXRob3JpemVkTmFtZSBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JpemVkTmFtZSAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImJ1c2luZXNzRW50aXR5RXh0IgorCitjbGFzcyB1ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQKK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpidXNpbmVzc0VudGl0eQorICAgIHVkZGkyX19idXNpbmVzc0VudGl0eSogICAgICAgICAgICAgICBidXNpbmVzc0VudGl0eSAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLyBUT0RPOiA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisvLyAgICAgICBTY2hlbWEgZXh0ZW5zaWJpbGl0eSBpcyB1c2VyLWRlZmluYWJsZQorLy8gICAgICAgQ29uc3VsdCB0aGUgcHJvdG9jb2wgZG9jdW1lbnRhdGlvbiB0byBpbnNlcnQgZGVjbGFyYXRpb25zIGhlcmU6CisgICAgX1hNTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYW55ICAgICAgICAgICAgICAgICAgICAgICAgIDsJLy8vPCBDYXRjaCBhbnkgZWxlbWVudCBjb250ZW50IGluIFhNTCBzdHJpbmcKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImJ1c2luZXNzSW5mbyIKKworY2xhc3MgdWRkaTJfX2J1c2luZXNzSW5mbworeyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX19uYW1lKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fbmFtZSogICAgICAgICAgID4gbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDE7CisvLy8gVmVjdG9yIG9mIHVkZGkyX19kZXNjcmlwdGlvbiogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2Rlc2NyaXB0aW9uKiAgICA+IGRlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAwOworLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpzZXJ2aWNlSW5mb3MKKyAgICB1ZGRpMl9fc2VydmljZUluZm9zKiAgICAgICAgICAgICAgICAgc2VydmljZUluZm9zICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIEF0dHJpYnV0ZSBidXNpbmVzc0tleSBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpidXNpbmVzc0tleQorICAgQHVkZGkyX19idXNpbmVzc0tleSAgICAgICAgICAgICAgICAgICBidXNpbmVzc0tleSAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImJ1c2luZXNzSW5mb3MiCisKK2NsYXNzIHVkZGkyX19idXNpbmVzc0luZm9zCit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2J1c2luZXNzSW5mbyogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzSW5mbyogICA+IGJ1c2luZXNzSW5mbyAgICAgICAgICAgICAgICAgICAwOworLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYnVzaW5lc3NTZXJ2aWNlIgorCitjbGFzcyB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlCit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX25hbWUqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19uYW1lKiAgICAgICAgICAgPiBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgMDsKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2Rlc2NyaXB0aW9uKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZGVzY3JpcHRpb24qICAgID4gZGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgIDA7CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmJpbmRpbmdUZW1wbGF0ZXMKKyAgICB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlcyogICAgICAgICAgICAgYmluZGluZ1RlbXBsYXRlcyAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudAorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpjYXRlZ29yeUJhZworICAgIHVkZGkyX19jYXRlZ29yeUJhZyogICAgICAgICAgICAgICAgICBjYXRlZ29yeUJhZyAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50CisvLy8gQXR0cmlidXRlIHNlcnZpY2VLZXkgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6c2VydmljZUtleQorICAgQHVkZGkyX19zZXJ2aWNlS2V5ICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlS2V5ICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgYnVzaW5lc3NLZXkgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YnVzaW5lc3NLZXkKKyAgIEB1ZGRpMl9fYnVzaW5lc3NLZXkgICAgICAgICAgICAgICAgICAgYnVzaW5lc3NLZXkgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJidXNpbmVzc1NlcnZpY2VzIgorCitjbGFzcyB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlcworeyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX19idXNpbmVzc1NlcnZpY2UqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc1NlcnZpY2UqPiBidXNpbmVzc1NlcnZpY2UgICAgICAgICAgICAgICAgMDsKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImNhdGVnb3J5QmFnIgorCitjbGFzcyB1ZGRpMl9fY2F0ZWdvcnlCYWcKK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19rZXllZFJlZmVyZW5jZSogPiBrZXllZFJlZmVyZW5jZSAgICAgICAgICAgICAgICAgMTsKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImNvbnRhY3QiCisKK2NsYXNzIHVkZGkyX19jb250YWN0Cit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2Rlc2NyaXB0aW9uKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZGVzY3JpcHRpb24qICAgID4gZGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgIDA7CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOnBlcnNvbk5hbWUKKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc29uTmFtZSAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIFZlY3RvciBvZiB1ZGRpMl9fcGhvbmUqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19waG9uZSogICAgICAgICAgPiBwaG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgMDsKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2VtYWlsKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZW1haWwqICAgICAgICAgID4gZW1haWwgICAgICAgICAgICAgICAgICAgICAgICAgIDA7CisvLy8gVmVjdG9yIG9mIHVkZGkyX19hZGRyZXNzKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYWRkcmVzcyogICAgICAgID4gYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgIDA7CisvLy8gQXR0cmlidXRlIHVzZVR5cGUgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJjb250YWN0cyIKKworY2xhc3MgdWRkaTJfX2NvbnRhY3RzCit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2NvbnRhY3QqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19jb250YWN0KiAgICAgICAgPiBjb250YWN0ICAgICAgICAgICAgICAgICAgICAgICAgMTsKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImRpc2NvdmVyeVVSTHMiCisKK2NsYXNzIHVkZGkyX19kaXNjb3ZlcnlVUkxzCit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2Rpc2NvdmVyeVVSTCogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2Rpc2NvdmVyeVVSTCogICA+IGRpc2NvdmVyeVVSTCAgICAgICAgICAgICAgICAgICAxOworLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZGlzcG9zaXRpb25SZXBvcnQiCisKK2NsYXNzIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydAoreyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX19yZXN1bHQqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19yZXN1bHQqICAgICAgICAgPiByZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgMTsKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgb3BlcmF0b3Igb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3JfICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIHRydW5jYXRlZCBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0cnVuY2F0ZWQKKyAgIEBlbnVtIHVkZGkyX190cnVuY2F0ZWQqICAgICAgICAgICAgICAgdHJ1bmNhdGVkICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJmaW5kUXVhbGlmaWVycyIKKworY2xhc3MgdWRkaTJfX2ZpbmRRdWFsaWZpZXJzCit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgY2hhciogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8Y2hhciogICAgICAgICAgICAgICAgICA+IGZpbmRRdWFsaWZpZXIgICAgICAgICAgICAgICAgICAwOworLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiaG9zdGluZ1JlZGlyZWN0b3IiCisKK2NsYXNzIHVkZGkyX19ob3N0aW5nUmVkaXJlY3RvcgoreyBwdWJsaWM6CisvLy8gQXR0cmlidXRlIGJpbmRpbmdLZXkgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YmluZGluZ0tleQorICAgQHVkZGkyX19iaW5kaW5nS2V5ICAgICAgICAgICAgICAgICAgICBiaW5kaW5nS2V5ICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImlkZW50aWZpZXJCYWciCisKK2NsYXNzIHVkZGkyX19pZGVudGlmaWVyQmFnCit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2tleWVkUmVmZXJlbmNlKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UqID4ga2V5ZWRSZWZlcmVuY2UgICAgICAgICAgICAgICAgIDE7CisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJpbnN0YW5jZURldGFpbHMiCisKK2NsYXNzIHVkZGkyX19pbnN0YW5jZURldGFpbHMKK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fZGVzY3JpcHRpb24qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19kZXNjcmlwdGlvbiogICAgPiBkZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgMDsKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6b3ZlcnZpZXdEb2MKKyAgICB1ZGRpMl9fb3ZlcnZpZXdEb2MqICAgICAgICAgICAgICAgICAgb3ZlcnZpZXdEb2MgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudAorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjppbnN0YW5jZVBhcm1zCisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlUGFybXMgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImtleWVkUmVmZXJlbmNlIgorCitjbGFzcyB1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UKK3sgcHVibGljOgorLy8vIEF0dHJpYnV0ZSB0TW9kZWxLZXkgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dE1vZGVsS2V5CisgICBAdWRkaTJfX3RNb2RlbEtleSAgICAgICAgICAgICAgICAgICAgIHRNb2RlbEtleSAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBrZXlOYW1lIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleU5hbWUgICAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBrZXlWYWx1ZSBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImtleXNPd25lZCIKKworY2xhc3MgdWRkaTJfX2tleXNPd25lZAoreyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmZyb21LZXkKKyAgICB1ZGRpMl9fYnVzaW5lc3NLZXkgICAgICAgICAgICAgICAgICAgZnJvbUtleSAgICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudAorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0b0tleQorICAgIHVkZGkyX19idXNpbmVzc0tleSAgICAgICAgICAgICAgICAgICB0b0tleSAgICAgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50CisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJvdmVydmlld0RvYyIKKworY2xhc3MgdWRkaTJfX292ZXJ2aWV3RG9jCit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2Rlc2NyaXB0aW9uKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZGVzY3JpcHRpb24qICAgID4gZGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgIDA7CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOm92ZXJ2aWV3VVJMCisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJ2aWV3VVJMICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InB1Ymxpc2hlckFzc2VydGlvbiIKKworY2xhc3MgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbgoreyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmZyb21LZXkKKyAgICB1ZGRpMl9fYnVzaW5lc3NLZXkgICAgICAgICAgICAgICAgICAgZnJvbUtleSAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0b0tleQorICAgIHVkZGkyX19idXNpbmVzc0tleSAgICAgICAgICAgICAgICAgICB0b0tleSAgICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmtleWVkUmVmZXJlbmNlCisgICAgdWRkaTJfX2tleWVkUmVmZXJlbmNlKiAgICAgICAgICAgICAgIGtleWVkUmVmZXJlbmNlICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InJlbGF0ZWRCdXNpbmVzc0luZm8iCisKK2NsYXNzIHVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvCit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YnVzaW5lc3NLZXkKKyAgICB1ZGRpMl9fYnVzaW5lc3NLZXkgICAgICAgICAgICAgICAgICAgYnVzaW5lc3NLZXkgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIFZlY3RvciBvZiB1ZGRpMl9fbmFtZSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX25hbWUqICAgICAgICAgICA+IG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAxOworLy8vIFZlY3RvciBvZiB1ZGRpMl9fZGVzY3JpcHRpb24qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19kZXNjcmlwdGlvbiogICAgPiBkZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgMDsKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMqIHdpdGggbGVuZ3RoIDAuLjIKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyo+IHNoYXJlZFJlbGF0aW9uc2hpcHMgICAgICAgICAgICAxOjI7CisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJyZWxhdGVkQnVzaW5lc3NJbmZvcyIKKworY2xhc3MgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zCit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvKj4gcmVsYXRlZEJ1c2luZXNzSW5mbyAgICAgICAgICAgIDA7CisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJyZXN1bHQiCisKK2NsYXNzIHVkZGkyX19yZXN1bHQKK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjplcnJJbmZvCisgICAgdWRkaTJfX2VyckluZm8qICAgICAgICAgICAgICAgICAgICAgIGVyckluZm8gICAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQKKy8vLyBBdHRyaWJ1dGUga2V5VHlwZSBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjprZXlUeXBlCisgICBAZW51bSB1ZGRpMl9fa2V5VHlwZSogICAgICAgICAgICAgICAgIGtleVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBlcnJubyBvZiB0eXBlIHhzOmludAorICAgQGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub18gICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InNlcnZpY2VJbmZvIgorCitjbGFzcyB1ZGRpMl9fc2VydmljZUluZm8KK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fbmFtZSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX25hbWUqICAgICAgICAgICA+IG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAwOworLy8vIEF0dHJpYnV0ZSBzZXJ2aWNlS2V5IG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOnNlcnZpY2VLZXkKKyAgIEB1ZGRpMl9fc2VydmljZUtleSAgICAgICAgICAgICAgICAgICAgc2VydmljZUtleSAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIGJ1c2luZXNzS2V5IG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOmJ1c2luZXNzS2V5CisgICBAdWRkaTJfX2J1c2luZXNzS2V5ICAgICAgICAgICAgICAgICAgIGJ1c2luZXNzS2V5ICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92Mjoic2VydmljZUluZm9zIgorCitjbGFzcyB1ZGRpMl9fc2VydmljZUluZm9zCit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX3NlcnZpY2VJbmZvKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fc2VydmljZUluZm8qICAgID4gc2VydmljZUluZm8gICAgICAgICAgICAgICAgICAgIDA7CisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJzaGFyZWRSZWxhdGlvbnNoaXBzIgorCitjbGFzcyB1ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcworeyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX19rZXllZFJlZmVyZW5jZSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2tleWVkUmVmZXJlbmNlKiA+IGtleWVkUmVmZXJlbmNlICAgICAgICAgICAgICAgICAxOworLy8vIEF0dHJpYnV0ZSBkaXJlY3Rpb24gb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6ZGlyZWN0aW9uCisgICBAZW51bSB1ZGRpMl9fZGlyZWN0aW9uICAgICAgICAgICAgICAgIGRpcmVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoidE1vZGVsIgorCitjbGFzcyB1ZGRpMl9fdE1vZGVsCit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6bmFtZQorICAgIHVkZGkyX19uYW1lKiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gVmVjdG9yIG9mIHVkZGkyX19kZXNjcmlwdGlvbiogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2Rlc2NyaXB0aW9uKiAgICA+IGRlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAwOworLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpvdmVydmlld0RvYworICAgIHVkZGkyX19vdmVydmlld0RvYyogICAgICAgICAgICAgICAgICBvdmVydmlld0RvYyAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmlkZW50aWZpZXJCYWcKKyAgICB1ZGRpMl9faWRlbnRpZmllckJhZyogICAgICAgICAgICAgICAgaWRlbnRpZmllckJhZyAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudAorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpjYXRlZ29yeUJhZworICAgIHVkZGkyX19jYXRlZ29yeUJhZyogICAgICAgICAgICAgICAgICBjYXRlZ29yeUJhZyAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50CisvLy8gQXR0cmlidXRlIHRNb2RlbEtleSBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0TW9kZWxLZXkKKyAgIEB1ZGRpMl9fdE1vZGVsS2V5ICAgICAgICAgICAgICAgICAgICAgdE1vZGVsS2V5ICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIG9wZXJhdG9yIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yXyAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBhdXRob3JpemVkTmFtZSBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JpemVkTmFtZSAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InRNb2RlbEJhZyIKKworY2xhc3MgdWRkaTJfX3RNb2RlbEJhZworeyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX190TW9kZWxLZXkgd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbEtleSAgICAgICA+IHRNb2RlbEtleSAgICAgICAgICAgICAgICAgICAgICAxOworLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoidE1vZGVsSW5mbyIKKworY2xhc3MgdWRkaTJfX3RNb2RlbEluZm8KK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpuYW1lCisgICAgdWRkaTJfX25hbWUqICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBBdHRyaWJ1dGUgdE1vZGVsS2V5IG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRNb2RlbEtleQorICAgQHVkZGkyX190TW9kZWxLZXkgICAgICAgICAgICAgICAgICAgICB0TW9kZWxLZXkgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InRNb2RlbEluZm9zIgorCitjbGFzcyB1ZGRpMl9fdE1vZGVsSW5mb3MKK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fdE1vZGVsSW5mbyogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbEluZm8qICAgICA+IHRNb2RlbEluZm8gICAgICAgICAgICAgICAgICAgICAwOworLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoidE1vZGVsSW5zdGFuY2VEZXRhaWxzIgorCitjbGFzcyB1ZGRpMl9fdE1vZGVsSW5zdGFuY2VEZXRhaWxzCit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyo+IHRNb2RlbEluc3RhbmNlSW5mbyAgICAgICAgICAgICAwOworLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoidE1vZGVsSW5zdGFuY2VJbmZvIgorCitjbGFzcyB1ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvCit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2Rlc2NyaXB0aW9uKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZGVzY3JpcHRpb24qICAgID4gZGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgIDA7CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmluc3RhbmNlRGV0YWlscworICAgIHVkZGkyX19pbnN0YW5jZURldGFpbHMqICAgICAgICAgICAgICBpbnN0YW5jZURldGFpbHMgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50CisvLy8gQXR0cmlidXRlIHRNb2RlbEtleSBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0TW9kZWxLZXkKKyAgIEB1ZGRpMl9fdE1vZGVsS2V5ICAgICAgICAgICAgICAgICAgICAgdE1vZGVsS2V5ICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJhZGRfcHVibGlzaGVyQXNzZXJ0aW9ucyIKKworY2xhc3MgdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zCit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YXV0aEluZm8KKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aEluZm8gICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIFZlY3RvciBvZiB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKj4gcHVibGlzaGVyQXNzZXJ0aW9uICAgICAgICAgICAgIDE7CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCopOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24qPiBwdWJsaXNoZXJBc3NlcnRpb25zKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQqIHNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKTsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZGVsZXRlX2JpbmRpbmciCisKK2NsYXNzIHVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZworeyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmF1dGhJbmZvCisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhJbmZvICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2JpbmRpbmdLZXkgd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2JpbmRpbmdLZXkgICAgICA+IGJpbmRpbmdLZXkgICAgICAgICAgICAgICAgICAgICAxOworLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICpiaW5kaW5nS2V5KTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3RvcjxjaGFyKj4gYmluZGluZ0tleXMpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCogc2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJkZWxldGVfYnVzaW5lc3MiCisKK2NsYXNzIHVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3MKK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjphdXRoSW5mbworICAgIGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoSW5mbyAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gVmVjdG9yIG9mIHVkZGkyX19idXNpbmVzc0tleSB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NLZXkgICAgID4gYnVzaW5lc3NLZXkgICAgICAgICAgICAgICAgICAgIDE7CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqYnVzaW5lc3NLZXkpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3RvcjxjaGFyKj4gYnVzaW5lc3NLZXlzKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQqIHNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKTsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZGVsZXRlX3B1Ymxpc2hlckFzc2VydGlvbnMiCisKK2NsYXNzIHVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucworeyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmF1dGhJbmZvCisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhJbmZvICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbiogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbio+IHB1Ymxpc2hlckFzc2VydGlvbiAgICAgICAgICAgICAxOworLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKj4gcHVibGlzaGVyQXNzZXJ0aW9ucyk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0KiBzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbyk7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImRlbGV0ZV9zZXJ2aWNlIgorCitjbGFzcyB1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UKK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjphdXRoSW5mbworICAgIGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoSW5mbyAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gVmVjdG9yIG9mIHVkZGkyX19zZXJ2aWNlS2V5IHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19zZXJ2aWNlS2V5ICAgICAgPiBzZXJ2aWNlS2V5ICAgICAgICAgICAgICAgICAgICAgMTsKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKik7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqc2VydmljZUtleSk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8Y2hhcio+IHNlcnZpY2VLZXlzKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQqIHNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKTsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZGVsZXRlX3RNb2RlbCIKKworY2xhc3MgdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwKK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjphdXRoSW5mbworICAgIGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoSW5mbyAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gVmVjdG9yIG9mIHVkZGkyX190TW9kZWxLZXkgd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbEtleSAgICAgICA+IHRNb2RlbEtleSAgICAgICAgICAgICAgICAgICAgICAxOworLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCopOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdE1vZGVsS2V5KTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPGNoYXIqPiB0TW9kZWxLZXlzKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQqIHNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKTsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZGlzY2FyZF9hdXRoVG9rZW4iCisKK2NsYXNzIHVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbgoreyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmF1dGhJbmZvCisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhJbmZvICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKik7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqYXV0aEluZm8pOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCogc2VuZChjb25zdCBjaGFyICplbmRwb2ludCk7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImZpbmRfYmluZGluZyIKKworY2xhc3MgdWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZworeyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmZpbmRRdWFsaWZpZXJzCisgICAgdWRkaTJfX2ZpbmRRdWFsaWZpZXJzKiAgICAgICAgICAgICAgIGZpbmRRdWFsaWZpZXJzICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dE1vZGVsQmFnCisgICAgdWRkaTJfX3RNb2RlbEJhZyogICAgICAgICAgICAgICAgICAgIHRNb2RlbEJhZyAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgbWF4Um93cyBvZiB0eXBlIHhzOmludAorICAgQGludCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhSb3dzICAgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgc2VydmljZUtleSBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpzZXJ2aWNlS2V5CisgICBAdWRkaTJfX3NlcnZpY2VLZXkgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VLZXkgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKik7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRNb2RlbEtleSk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPGNoYXIqPiB0TW9kZWxLZXlzKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fYmluZGluZ0RldGFpbCAqc2VuZChjb25zdCBjaGFyICplbmRwb2ludCk7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImZpbmRfYnVzaW5lc3MiCisKK2NsYXNzIHVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzCit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6ZmluZFF1YWxpZmllcnMKKyAgICB1ZGRpMl9fZmluZFF1YWxpZmllcnMqICAgICAgICAgICAgICAgZmluZFF1YWxpZmllcnMgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudAorLy8vIFZlY3RvciBvZiB1ZGRpMl9fbmFtZSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX25hbWUqICAgICAgICAgICA+IG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAwOworLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjppZGVudGlmaWVyQmFnCisgICAgdWRkaTJfX2lkZW50aWZpZXJCYWcqICAgICAgICAgICAgICAgIGlkZW50aWZpZXJCYWcgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6Y2F0ZWdvcnlCYWcKKyAgICB1ZGRpMl9fY2F0ZWdvcnlCYWcqICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlCYWcgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudAorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0TW9kZWxCYWcKKyAgICB1ZGRpMl9fdE1vZGVsQmFnKiAgICAgICAgICAgICAgICAgICAgdE1vZGVsQmFnICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudAorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpkaXNjb3ZlcnlVUkxzCisgICAgdWRkaTJfX2Rpc2NvdmVyeVVSTHMqICAgICAgICAgICAgICAgIGRpc2NvdmVyeVVSTHMgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgbWF4Um93cyBvZiB0eXBlIHhzOmludAorICAgQGludCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhSb3dzICAgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKm5hbWUpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8Y2hhcio+IHRNb2RlbEtleXMpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2tleWVkUmVmZXJlbmNlKj4ga2V5ZWRSZWZlcmVuY2VzKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fYnVzaW5lc3NMaXN0ICpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50KTsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZmluZF9yZWxhdGVkQnVzaW5lc3NlcyIKKworY2xhc3MgdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMKK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpmaW5kUXVhbGlmaWVycworICAgIHVkZGkyX19maW5kUXVhbGlmaWVycyogICAgICAgICAgICAgICBmaW5kUXVhbGlmaWVycyAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmJ1c2luZXNzS2V5CisgICAgdWRkaTJfX2J1c2luZXNzS2V5ICAgICAgICAgICAgICAgICAgIGJ1c2luZXNzS2V5ICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6a2V5ZWRSZWZlcmVuY2UKKyAgICB1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UqICAgICAgICAgICAgICAga2V5ZWRSZWZlcmVuY2UgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudAorLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBtYXhSb3dzIG9mIHR5cGUgeHM6aW50CisgICBAaW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJvd3MgICAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyhzdHJ1Y3Qgc29hcCopOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqYnVzaW5lc3NLZXkpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3QgKnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQpOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJmaW5kX3NlcnZpY2UiCisKK2NsYXNzIHVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2UKK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpmaW5kUXVhbGlmaWVycworICAgIHVkZGkyX19maW5kUXVhbGlmaWVycyogICAgICAgICAgICAgICBmaW5kUXVhbGlmaWVycyAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50CisvLy8gVmVjdG9yIG9mIHVkZGkyX19uYW1lKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fbmFtZSogICAgICAgICAgID4gbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDA7CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmNhdGVnb3J5QmFnCisgICAgdWRkaTJfX2NhdGVnb3J5QmFnKiAgICAgICAgICAgICAgICAgIGNhdGVnb3J5QmFnICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dE1vZGVsQmFnCisgICAgdWRkaTJfX3RNb2RlbEJhZyogICAgICAgICAgICAgICAgICAgIHRNb2RlbEJhZyAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgbWF4Um93cyBvZiB0eXBlIHhzOmludAorICAgQGludCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhSb3dzICAgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgYnVzaW5lc3NLZXkgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YnVzaW5lc3NLZXkKKyAgIEB1ZGRpMl9fYnVzaW5lc3NLZXkgICAgICAgICAgICAgICAgICAgYnVzaW5lc3NLZXkgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqbmFtZSk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPGNoYXIqPiB0TW9kZWxLZXlzKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2tleWVkUmVmZXJlbmNlKj4ga2V5ZWRSZWZlcmVuY2VzKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fc2VydmljZUxpc3QqIHNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQpOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJmaW5kX3RNb2RlbCIKKworY2xhc3MgdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsCit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6ZmluZFF1YWxpZmllcnMKKyAgICB1ZGRpMl9fZmluZFF1YWxpZmllcnMqICAgICAgICAgICAgICAgZmluZFF1YWxpZmllcnMgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudAorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpuYW1lCisgICAgdWRkaTJfX25hbWUqICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6aWRlbnRpZmllckJhZworICAgIHVkZGkyX19pZGVudGlmaWVyQmFnKiAgICAgICAgICAgICAgICBpZGVudGlmaWVyQmFnICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmNhdGVnb3J5QmFnCisgICAgdWRkaTJfX2NhdGVnb3J5QmFnKiAgICAgICAgICAgICAgICAgIGNhdGVnb3J5QmFnICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgbWF4Um93cyBvZiB0eXBlIHhzOmludAorICAgQGludCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhSb3dzICAgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKik7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqbmFtZSk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2tleWVkUmVmZXJlbmNlKj4ga2V5ZWRSZWZlcmVuY2VzKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fdE1vZGVsTGlzdCogc2VuZChjb25zdCBjaGFyICplbmRwb2ludCk7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImdldF9hc3NlcnRpb25TdGF0dXNSZXBvcnQiCisKK2NsYXNzIHVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0Cit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YXV0aEluZm8KKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aEluZm8gICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpjb21wbGV0aW9uU3RhdHVzCisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25TdGF0dXMgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQoc3RydWN0IHNvYXAqKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKmNvbXBsZXRpb25TdGF0dXMpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQqIHNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKTsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZ2V0X2F1dGhUb2tlbiIKKworY2xhc3MgdWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW4KK3sgcHVibGljOgorLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSB1c2VySUQgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIGNyZWQgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlZCAgICAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKik7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW4oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp1c2VyaWQsIGNvbnN0IGNoYXIgKnBhc3N3ZCk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2F1dGhUb2tlbiogc2VuZChjb25zdCBjaGFyICplbmRwb2ludCk7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImdldF9iaW5kaW5nRGV0YWlsIgorCitjbGFzcyB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwKK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fYmluZGluZ0tleSB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYmluZGluZ0tleSAgICAgID4gYmluZGluZ0tleSAgICAgICAgICAgICAgICAgICAgIDE7CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbChzdHJ1Y3Qgc29hcCopOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKmJpbmRpbmdLZXkpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbChzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPGNoYXIqPiBiaW5kaW5nS2V5cyk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2JpbmRpbmdEZXRhaWwqIHNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQpOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJnZXRfYnVzaW5lc3NEZXRhaWwiCisKK2NsYXNzIHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwKK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fYnVzaW5lc3NLZXkgd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzS2V5ICAgICA+IGJ1c2luZXNzS2V5ICAgICAgICAgICAgICAgICAgICAxOworLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsKHN0cnVjdCBzb2FwKik7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKmJ1c2luZXNzS2V5KTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8Y2hhcio+IGJ1c2luZXNzS2V5cyk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2J1c2luZXNzRGV0YWlsKiBzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50KTsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZ2V0X2J1c2luZXNzRGV0YWlsRXh0IgorCitjbGFzcyB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0Cit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2J1c2luZXNzS2V5IHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc0tleSAgICAgPiBidXNpbmVzc0tleSAgICAgICAgICAgICAgICAgICAgMTsKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dChzdHJ1Y3Qgc29hcCopOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICpidXNpbmVzc0tleSk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dChzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPGNoYXIqPiBidXNpbmVzc0tleXMpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19idXNpbmVzc0RldGFpbEV4dCogc2VuZChjb25zdCBjaGFyICplbmRwb2ludCk7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImdldF9wdWJsaXNoZXJBc3NlcnRpb25zIgorCitjbGFzcyB1ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMKK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjphdXRoSW5mbworICAgIGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoSW5mbyAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCopOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zKiBzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbyk7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImdldF9yZWdpc3RlcmVkSW5mbyIKKworY2xhc3MgdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbworeyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmF1dGhJbmZvCisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhJbmZvICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyhzdHJ1Y3Qgc29hcCopOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19yZWdpc3RlcmVkSW5mbyogc2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJnZXRfc2VydmljZURldGFpbCIKKworY2xhc3MgdWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsCit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX3NlcnZpY2VLZXkgd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX3NlcnZpY2VLZXkgICAgICA+IHNlcnZpY2VLZXkgICAgICAgICAgICAgICAgICAgICAxOworLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwoc3RydWN0IHNvYXAqKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICpzZXJ2aWNlS2V5KTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3RvcjxjaGFyKj4gc2VydmljZUtleXMpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19zZXJ2aWNlRGV0YWlsKiBzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50KTsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZ2V0X3RNb2RlbERldGFpbCIKKworY2xhc3MgdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwKK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fdE1vZGVsS2V5IHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX190TW9kZWxLZXkgICAgICAgPiB0TW9kZWxLZXkgICAgICAgICAgICAgICAgICAgICAgMTsKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwoc3RydWN0IHNvYXAqKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRNb2RlbEtleSk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3RvcjxjaGFyKj4gdE1vZGVsS2V5cyk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX3RNb2RlbERldGFpbCogc2VuZChjb25zdCBjaGFyICplbmRwb2ludCk7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InNhdmVfYmluZGluZyIKKworY2xhc3MgdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZworeyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmF1dGhJbmZvCisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhJbmZvICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2JpbmRpbmdUZW1wbGF0ZSo+IGJpbmRpbmdUZW1wbGF0ZSAgICAgICAgICAgICAgICAxOworLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKik7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19iaW5kaW5nVGVtcGxhdGUgJmJpbmRpbmdUZW1wbGF0ZSk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19iaW5kaW5nVGVtcGxhdGUqPiBiaW5kaW5nVGVtcGxhdGVzKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fYmluZGluZ0RldGFpbCogc2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJzYXZlX2J1c2luZXNzIgorCitjbGFzcyB1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcworeyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmF1dGhJbmZvCisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhJbmZvICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2J1c2luZXNzRW50aXR5KiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NFbnRpdHkqID4gYnVzaW5lc3NFbnRpdHkgICAgICAgICAgICAgICAgIDA7CisvLy8gVmVjdG9yIG9mIGNoYXIqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPGNoYXIqICAgICAgICAgICAgICAgICAgPiB1cGxvYWRSZWdpc3RlciAgICAgICAgICAgICAgICAgMDsKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc0VudGl0eSAmYnVzaW5lc3NFbnRpdHkpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzRW50aXR5Kj4gYnVzaW5lc3NFbnRpdGllcyk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2J1c2luZXNzRGV0YWlsKiBzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbyk7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InNhdmVfc2VydmljZSIKKworY2xhc3MgdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZQoreyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmF1dGhJbmZvCisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhJbmZvICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2J1c2luZXNzU2VydmljZSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzU2VydmljZSo+IGJ1c2luZXNzU2VydmljZSAgICAgICAgICAgICAgICAxOworLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKik7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc1NlcnZpY2UgJmJ1c2luZXNzU2VydmljZSk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc1NlcnZpY2UqPiBidXNpbmVzc1NlcnZpY2VzKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fc2VydmljZURldGFpbCogc2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJzYXZlX3RNb2RlbCIKKworY2xhc3MgdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsCit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YXV0aEluZm8KKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aEluZm8gICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIFZlY3RvciBvZiB1ZGRpMl9fdE1vZGVsKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fdE1vZGVsKiAgICAgICAgID4gdE1vZGVsICAgICAgICAgICAgICAgICAgICAgICAgIDA7CisvLy8gVmVjdG9yIG9mIGNoYXIqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPGNoYXIqICAgICAgICAgICAgICAgICAgPiB1cGxvYWRSZWdpc3RlciAgICAgICAgICAgICAgICAgMDsKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKik7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3RNb2RlbCAmdE1vZGVsKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fdE1vZGVsKj4gdE1vZGVscyk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX3RNb2RlbERldGFpbCogc2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJzZXRfcHVibGlzaGVyQXNzZXJ0aW9ucyIKKworY2xhc3MgdWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zCit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YXV0aEluZm8KKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aEluZm8gICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIFZlY3RvciBvZiB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKj4gcHVibGlzaGVyQXNzZXJ0aW9uICAgICAgICAgICAgIDA7CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCopOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24qPiBwdWJsaXNoZXJBc3NlcnRpb25zKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9ucyogc2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJ2YWxpZGF0ZV92YWx1ZXMiCisKK2NsYXNzIHVkZGkyX192YWxpZGF0ZV9VU0NPUkV2YWx1ZXMKK3sgcHVibGljOgorLy8gQ0hPSUNFIE9GIEVMRU1FTlRTOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fYnVzaW5lc3NFbnRpdHkqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc0VudGl0eSogPiBidXNpbmVzc0VudGl0eSAgICAgICAgICAgICAgICAgMDsKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2J1c2luZXNzU2VydmljZSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzU2VydmljZSo+IGJ1c2luZXNzU2VydmljZSAgICAgICAgICAgICAgICAwOworLy8vIFZlY3RvciBvZiB1ZGRpMl9fdE1vZGVsKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fdE1vZGVsKiAgICAgICAgID4gdE1vZGVsICAgICAgICAgICAgICAgICAgICAgICAgIDA7CisvLyBFTkQgQ0hPSUNFCisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJhc3NlcnRpb25TdGF0dXNSZXBvcnQiCisKK2NsYXNzIHVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQKK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW0qPiBhc3NlcnRpb25TdGF0dXNJdGVtICAgICAgICAgICAgMDsKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgb3BlcmF0b3Igb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3JfICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJhdXRoVG9rZW4iCisKK2NsYXNzIHVkZGkyX19hdXRoVG9rZW4KK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjphdXRoSW5mbworICAgIGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoSW5mbyAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIG9wZXJhdG9yIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yXyAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYmluZGluZ0RldGFpbCIKKworY2xhc3MgdWRkaTJfX2JpbmRpbmdEZXRhaWwKK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYmluZGluZ1RlbXBsYXRlKj4gYmluZGluZ1RlbXBsYXRlICAgICAgICAgICAgICAgIDA7CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIG9wZXJhdG9yIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yXyAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSB0cnVuY2F0ZWQgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dHJ1bmNhdGVkCisgICBAZW51bSB1ZGRpMl9fdHJ1bmNhdGVkKiAgICAgICAgICAgICAgIHRydW5jYXRlZCAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYnVzaW5lc3NEZXRhaWwiCisKK2NsYXNzIHVkZGkyX19idXNpbmVzc0RldGFpbAoreyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX19idXNpbmVzc0VudGl0eSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzRW50aXR5KiA+IGJ1c2luZXNzRW50aXR5ICAgICAgICAgICAgICAgICAwOworLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBvcGVyYXRvciBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcl8gICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgdHJ1bmNhdGVkIG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRydW5jYXRlZAorICAgQGVudW0gdWRkaTJfX3RydW5jYXRlZCogICAgICAgICAgICAgICB0cnVuY2F0ZWQgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImJ1c2luZXNzRGV0YWlsRXh0IgorCitjbGFzcyB1ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHQKK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc0VudGl0eUV4dCo+IGJ1c2luZXNzRW50aXR5RXh0ICAgICAgICAgICAgICAxOworLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBvcGVyYXRvciBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcl8gICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgdHJ1bmNhdGVkIG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRydW5jYXRlZAorICAgQGVudW0gdWRkaTJfX3RydW5jYXRlZCogICAgICAgICAgICAgICB0cnVuY2F0ZWQgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImJ1c2luZXNzTGlzdCIKKworY2xhc3MgdWRkaTJfX2J1c2luZXNzTGlzdAoreyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmJ1c2luZXNzSW5mb3MKKyAgICB1ZGRpMl9fYnVzaW5lc3NJbmZvcyogICAgICAgICAgICAgICAgYnVzaW5lc3NJbmZvcyAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBvcGVyYXRvciBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcl8gICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgdHJ1bmNhdGVkIG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRydW5jYXRlZAorICAgQGVudW0gdWRkaTJfX3RydW5jYXRlZCogICAgICAgICAgICAgICB0cnVuY2F0ZWQgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InB1Ymxpc2hlckFzc2VydGlvbnMiCisKK2NsYXNzIHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zCit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbiogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbio+IHB1Ymxpc2hlckFzc2VydGlvbiAgICAgICAgICAgICAwOworLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBvcGVyYXRvciBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcl8gICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgYXV0aG9yaXplZE5hbWUgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXplZE5hbWUgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJyZWdpc3RlcmVkSW5mbyIKKworY2xhc3MgdWRkaTJfX3JlZ2lzdGVyZWRJbmZvCit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YnVzaW5lc3NJbmZvcworICAgIHVkZGkyX19idXNpbmVzc0luZm9zKiAgICAgICAgICAgICAgICBidXNpbmVzc0luZm9zICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRNb2RlbEluZm9zCisgICAgdWRkaTJfX3RNb2RlbEluZm9zKiAgICAgICAgICAgICAgICAgIHRNb2RlbEluZm9zICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgb3BlcmF0b3Igb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3JfICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIHRydW5jYXRlZCBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0cnVuY2F0ZWQKKyAgIEBlbnVtIHVkZGkyX190cnVuY2F0ZWQqICAgICAgICAgICAgICAgdHJ1bmNhdGVkICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJyZWxhdGVkQnVzaW5lc3Nlc0xpc3QiCisKK2NsYXNzIHVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3QKK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpidXNpbmVzc0tleQorICAgIHVkZGkyX19idXNpbmVzc0tleSAgICAgICAgICAgICAgICAgICBidXNpbmVzc0tleSAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOnJlbGF0ZWRCdXNpbmVzc0luZm9zCisgICAgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zKiAgICAgICAgIHJlbGF0ZWRCdXNpbmVzc0luZm9zICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgb3BlcmF0b3Igb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3JfICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIHRydW5jYXRlZCBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0cnVuY2F0ZWQKKyAgIEBlbnVtIHVkZGkyX190cnVuY2F0ZWQqICAgICAgICAgICAgICAgdHJ1bmNhdGVkICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJzZXJ2aWNlRGV0YWlsIgorCitjbGFzcyB1ZGRpMl9fc2VydmljZURldGFpbAoreyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX19idXNpbmVzc1NlcnZpY2UqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc1NlcnZpY2UqPiBidXNpbmVzc1NlcnZpY2UgICAgICAgICAgICAgICAgMDsKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgb3BlcmF0b3Igb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3JfICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIHRydW5jYXRlZCBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0cnVuY2F0ZWQKKyAgIEBlbnVtIHVkZGkyX190cnVuY2F0ZWQqICAgICAgICAgICAgICAgdHJ1bmNhdGVkICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJzZXJ2aWNlTGlzdCIKKworY2xhc3MgdWRkaTJfX3NlcnZpY2VMaXN0Cit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6c2VydmljZUluZm9zCisgICAgdWRkaTJfX3NlcnZpY2VJbmZvcyogICAgICAgICAgICAgICAgIHNlcnZpY2VJbmZvcyAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgb3BlcmF0b3Igb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3JfICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIHRydW5jYXRlZCBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0cnVuY2F0ZWQKKyAgIEBlbnVtIHVkZGkyX190cnVuY2F0ZWQqICAgICAgICAgICAgICAgdHJ1bmNhdGVkICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJ0TW9kZWxEZXRhaWwiCisKK2NsYXNzIHVkZGkyX190TW9kZWxEZXRhaWwKK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fdE1vZGVsKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fdE1vZGVsKiAgICAgICAgID4gdE1vZGVsICAgICAgICAgICAgICAgICAgICAgICAgIDE7CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIG9wZXJhdG9yIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yXyAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSB0cnVuY2F0ZWQgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dHJ1bmNhdGVkCisgICBAZW51bSB1ZGRpMl9fdHJ1bmNhdGVkKiAgICAgICAgICAgICAgIHRydW5jYXRlZCAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoidE1vZGVsTGlzdCIKKworY2xhc3MgdWRkaTJfX3RNb2RlbExpc3QKK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0TW9kZWxJbmZvcworICAgIHVkZGkyX190TW9kZWxJbmZvcyogICAgICAgICAgICAgICAgICB0TW9kZWxJbmZvcyAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIG9wZXJhdG9yIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yXyAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSB0cnVuY2F0ZWQgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dHJ1bmNhdGVkCisgICBAZW51bSB1ZGRpMl9fdHJ1bmNhdGVkKiAgICAgICAgICAgICAgIHRydW5jYXRlZCAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYWNjZXNzUG9pbnQiCisKK2NsYXNzIHVkZGkyX19hY2Nlc3NQb2ludAoreyBwdWJsaWM6CisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXRlbSAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBBdHRyaWJ1dGUgVVJMVHlwZSBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpVUkxUeXBlCisgICBAZW51bSB1ZGRpMl9fVVJMVHlwZSAgICAgICAgICAgICAgICAgIFVSTFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYWRkcmVzc0xpbmUiCisKK2NsYXNzIHVkZGkyX19hZGRyZXNzTGluZQoreyBwdWJsaWM6CisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXRlbSAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBBdHRyaWJ1dGUga2V5TmFtZSBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlOYW1lICAgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUga2V5VmFsdWUgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5VmFsdWUgICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJkZXNjcmlwdGlvbiIKKworY2xhc3MgdWRkaTJfX2Rlc2NyaXB0aW9uCit7IHB1YmxpYzoKKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pdGVtICAgICAgICAgICAgICAgICAgICAgICAgOworLy8vIEF0dHJpYnV0ZSByZWZlcmVuY2UgeG1sOmxhbmcKKyAgIEB4bWxfX2xhbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sX19sYW5nXyAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJkaXNjb3ZlcnlVUkwiCisKK2NsYXNzIHVkZGkyX19kaXNjb3ZlcnlVUkwKK3sgcHVibGljOgorICAgIGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2l0ZW0gICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gQXR0cmlidXRlIHVzZVR5cGUgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJlbWFpbCIKKworY2xhc3MgdWRkaTJfX2VtYWlsCit7IHB1YmxpYzoKKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pdGVtICAgICAgICAgICAgICAgICAgICAgICAgOworLy8vIEF0dHJpYnV0ZSB1c2VUeXBlIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZXJySW5mbyIKKworY2xhc3MgdWRkaTJfX2VyckluZm8KK3sgcHVibGljOgorICAgIGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2l0ZW0gICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gQXR0cmlidXRlIGVyckNvZGUgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyQ29kZSAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJuYW1lIgorCitjbGFzcyB1ZGRpMl9fbmFtZQoreyBwdWJsaWM6CisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXRlbSAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBBdHRyaWJ1dGUgcmVmZXJlbmNlIHhtbDpsYW5nCisgICBAeG1sX19sYW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbF9fbGFuZ18gICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoicGhvbmUiCisKK2NsYXNzIHVkZGkyX19waG9uZQoreyBwdWJsaWM6CisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXRlbSAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBBdHRyaWJ1dGUgdXNlVHlwZSBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VUeXBlICAgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogU2VydmljZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy9nc29hcCBwdWIyIHNlcnZpY2UgbmFtZToJUHVibGlzaFNvYXAgCisvL2dzb2FwIHB1YjIgc2VydmljZSB0eXBlOglQdWJsaXNoIAorLy9nc29hcCBwdWIyIHNlcnZpY2UgbmFtZXNwYWNlOgl1cm46dWRkaS1vcmc6cHVibGljYXRpb25fdjIgCisKKy8qKiBAbWFpbnBhZ2UgVURESV9QdWJsaWNhdGlvbl9BUElfVjIgRGVmaW5pdGlvbnMKKworQHNlY3Rpb24gVURESV9QdWJsaWNhdGlvbl9BUElfVjJfZG9jdW1lbnRhdGlvbiBEb2N1bWVudGF0aW9uCisKKwkJQ29weXJpZ2h0IChjKSAyMDAwIC0gMjAwMiBieSBBY2NlbnR1cmUsIEFyaWJhLCBJbmMuLCBDb21tZXJjZSBPbmUsIEluYy4gCisJCUZ1aml0c3UgTGltaXRlZCwgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnksIGkyIFRlY2hub2xvZ2llcywgSW5jLiwgCisJCUludGVsIENvcnBvcmF0aW9uLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uLCAgCisJCU1pY3Jvc29mdCBDb3Jwb3JhdGlvbiwgT3JhY2xlIENvcnBvcmF0aW9uLCBTQVAgQUcsIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIAorCQlhbmQgVmVyaVNpZ24sIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisJCQorCQlXU0RMIFNlcnZpY2UgSW50ZXJmYWNlIGZvciBVRERJIFB1YmxpY2F0aW9uIEFQSSBWMi4wCisJCQorCQlUaGlzIFdTREwgZG9jdW1lbnQgZGVmaW5lcyB0aGUgcHVibGljYXRpb24gQVBJIGNhbGxzIGZvciBpbnRlcmFjdGluZyB3aXRoIAorCQl0aGUgVURESSByZWdpc3RyeS4gIFRoZSBjb21wbGV0ZSBVRERJIEFQSSBzcGVjaWZpY2F0aW9uIGlzIGF2YWlsYWJsZQorCQlhdCBodHRwOi8vd3d3LnVkZGkub3JnL3NwZWNpZmljYXRpb24uaHRtbC4KKwkKKworQHNlY3Rpb24gVURESV9QdWJsaWNhdGlvbl9BUElfVjJfYmluZGluZ3MgQmluZGluZ3MKKyAgLSBAcmVmIFB1Ymxpc2hTb2FwCisKKyovCisKKy8qKgorCitAcGFnZSBQdWJsaXNoU29hcCBCaW5kaW5nICJQdWJsaXNoU29hcCIKKworQHNlY3Rpb24gUHVibGlzaFNvYXBfb3BlcmF0aW9ucyBPcGVyYXRpb25zIG9mIEJpbmRpbmcgICJQdWJsaXNoU29hcCIKKyAgLSBAcmVmIF9fcHViMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMKKyAgLSBAcmVmIF9fcHViMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcKKyAgLSBAcmVmIF9fcHViMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzCisgIC0gQHJlZiBfX3B1YjJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zCisgIC0gQHJlZiBfX3B1YjJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlCisgIC0gQHJlZiBfX3B1YjJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwKKyAgLSBAcmVmIF9fcHViMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4KKyAgLSBAcmVmIF9fcHViMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydAorICAtIEByZWYgX19wdWIyX19nZXRfVVNDT1JFYXV0aFRva2VuCisgIC0gQHJlZiBfX3B1YjJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zCisgIC0gQHJlZiBfX3B1YjJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbworICAtIEByZWYgX19wdWIyX19zYXZlX1VTQ09SRWJpbmRpbmcKKyAgLSBAcmVmIF9fcHViMl9fc2F2ZV9VU0NPUkVidXNpbmVzcworICAtIEByZWYgX19wdWIyX19zYXZlX1VTQ09SRXNlcnZpY2UKKyAgLSBAcmVmIF9fcHViMl9fc2F2ZV9VU0NPUkV0TW9kZWwKKyAgLSBAcmVmIF9fcHViMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMKKworQHNlY3Rpb24gUHVibGlzaFNvYXBfcG9ydHMgRW5kcG9pbnRzIG9mIEJpbmRpbmcgICJQdWJsaXNoU29hcCIKKworKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFNPQVAgRmF1bHQgRGV0YWlsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLyBUaGUgU09BUCBGYXVsdCBEZXRhaWwgZWxlbWVudCBjb250YWlucyBvbmUgb2YgdGhlIGZvbGxvd2luZyB0eXBlcyBzZXJpYWxpemVkCisvLyBpbiB0aGUgX190eXBlIGFuZCBmYXVsdCBmaWVsZHMgb2YgdGhlIFNPQVBfRU5WX19EZXRhaWwgc3RydWN0IChzZWUgZG9jcykKK2NsYXNzIF9kaXNwb3NpdGlvblJlcG9ydAoreyBwdWJsaWM6CisgICAgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0KiAgICAgICAgICAgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0XzsKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFB1Ymxpc2hTb2FwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIF9fcHViMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLy8vIE9wZXJhdGlvbiAiX19wdWIyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyIgb2Ygc2VydmljZSBiaW5kaW5nICJQdWJsaXNoU29hcCIKKworLyoqCisKK09wZXJhdGlvbiBkZXRhaWxzOgorCisgIC0gU09BUCBkb2N1bWVudC9saXRlcmFsIHN0eWxlCisgIC0gU09BUCBhY3Rpb249ImFkZF9wdWJsaXNoZXJBc3NlcnRpb25zIgorICAtIFNPQVAgRmF1bHQ6IF9kaXNwb3NpdGlvblJlcG9ydAorCitDIHN0dWIgZnVuY3Rpb24gKGRlZmluZWQgaW4gc29hcENsaWVudC5jW3BwXSk6CitAY29kZQorICBpbnQgc29hcF9jYWxsX19fcHViMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAgKnNvYXAsCisgICAgTlVMTCwgLy8gY2hhciAqZW5kcG9pbnQgPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBlbmRwb2ludCBmb3IgdGhpcyBvcGVyYXRpb24KKyAgICBOVUxMLCAvLyBjaGFyICphY3Rpb24gPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBhY3Rpb24gZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgLy8gcmVxdWVzdCBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyogdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zXywKKyAgICAvLyByZXNwb25zZSBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCogICAgICAgICAgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydF8KKyAgKTsKK0BlbmRjb2RlCisKK0MrKyBwcm94eSBjbGFzcyAoZGVmaW5lZCBpbiBzb2FwUHVibGlzaFNvYXBQcm94eS5oKToKKyAgY2xhc3MgUHVibGlzaFNvYXA7CisKKyovCisKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1zdHlsZToJYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgZG9jdW1lbnQKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1lbmNvZGluZzoJYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgbGl0ZXJhbAorLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWFjdGlvbjoJYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgYWRkX3B1Ymxpc2hlckFzc2VydGlvbnMKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1mYXVsdDoJYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgX2Rpc3Bvc2l0aW9uUmVwb3J0CitpbnQgX19wdWIyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucygKKyAgICB1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMqIHVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uc18sCisgICAgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0KiAgICAgICAgICAgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0XyAvLy88IHJlc3BvbnNlIHBhcmFtZXRlcgorKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIF9fcHViMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLy8vIE9wZXJhdGlvbiAiX19wdWIyX19kZWxldGVfVVNDT1JFYmluZGluZyIgb2Ygc2VydmljZSBiaW5kaW5nICJQdWJsaXNoU29hcCIKKworLyoqCisKK09wZXJhdGlvbiBkZXRhaWxzOgorCisgIC0gU09BUCBkb2N1bWVudC9saXRlcmFsIHN0eWxlCisgIC0gU09BUCBhY3Rpb249ImRlbGV0ZV9iaW5kaW5nIgorICAtIFNPQVAgRmF1bHQ6IF9kaXNwb3NpdGlvblJlcG9ydAorCitDIHN0dWIgZnVuY3Rpb24gKGRlZmluZWQgaW4gc29hcENsaWVudC5jW3BwXSk6CitAY29kZQorICBpbnQgc29hcF9jYWxsX19fcHViMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAgKnNvYXAsCisgICAgTlVMTCwgLy8gY2hhciAqZW5kcG9pbnQgPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBlbmRwb2ludCBmb3IgdGhpcyBvcGVyYXRpb24KKyAgICBOVUxMLCAvLyBjaGFyICphY3Rpb24gPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBhY3Rpb24gZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgLy8gcmVxdWVzdCBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyogICAgICAgIHVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZ18sCisgICAgLy8gcmVzcG9uc2UgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQqICAgICAgICAgICB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnRfCisgICk7CitAZW5kY29kZQorCitDKysgcHJveHkgY2xhc3MgKGRlZmluZWQgaW4gc29hcFB1Ymxpc2hTb2FwUHJveHkuaCk6CisgIGNsYXNzIFB1Ymxpc2hTb2FwOworCisqLworCisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2Qtc3R5bGU6CWRlbGV0ZV9VU0NPUkViaW5kaW5nIGRvY3VtZW50CisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2QtZW5jb2Rpbmc6CWRlbGV0ZV9VU0NPUkViaW5kaW5nIGxpdGVyYWwKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1hY3Rpb246CWRlbGV0ZV9VU0NPUkViaW5kaW5nIGRlbGV0ZV9iaW5kaW5nCisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2QtZmF1bHQ6CWRlbGV0ZV9VU0NPUkViaW5kaW5nIF9kaXNwb3NpdGlvblJlcG9ydAoraW50IF9fcHViMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcoCisgICAgdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nKiAgICAgICAgdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nXywKKyAgICB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQqICAgICAgICAgICB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnRfIC8vLzwgcmVzcG9uc2UgcGFyYW1ldGVyCispOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogX19wdWIyX19kZWxldGVfVVNDT1JFYnVzaW5lc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvLy8gT3BlcmF0aW9uICJfX3B1YjJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyIgb2Ygc2VydmljZSBiaW5kaW5nICJQdWJsaXNoU29hcCIKKworLyoqCisKK09wZXJhdGlvbiBkZXRhaWxzOgorCisgIC0gU09BUCBkb2N1bWVudC9saXRlcmFsIHN0eWxlCisgIC0gU09BUCBhY3Rpb249ImRlbGV0ZV9idXNpbmVzcyIKKyAgLSBTT0FQIEZhdWx0OiBfZGlzcG9zaXRpb25SZXBvcnQKKworQyBzdHViIGZ1bmN0aW9uIChkZWZpbmVkIGluIHNvYXBDbGllbnQuY1twcF0pOgorQGNvZGUKKyAgaW50IHNvYXBfY2FsbF9fX3B1YjJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCAqc29hcCwKKyAgICBOVUxMLCAvLyBjaGFyICplbmRwb2ludCA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGVuZHBvaW50IGZvciB0aGlzIG9wZXJhdGlvbgorICAgIE5VTEwsIC8vIGNoYXIgKmFjdGlvbiA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGFjdGlvbiBmb3IgdGhpcyBvcGVyYXRpb24KKyAgICAvLyByZXF1ZXN0IHBhcmFtZXRlcnM6CisgICAgdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyogICAgICAgdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzc18sCisgICAgLy8gcmVzcG9uc2UgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQqICAgICAgICAgICB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnRfCisgICk7CitAZW5kY29kZQorCitDKysgcHJveHkgY2xhc3MgKGRlZmluZWQgaW4gc29hcFB1Ymxpc2hTb2FwUHJveHkuaCk6CisgIGNsYXNzIFB1Ymxpc2hTb2FwOworCisqLworCisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2Qtc3R5bGU6CWRlbGV0ZV9VU0NPUkVidXNpbmVzcyBkb2N1bWVudAorLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWVuY29kaW5nOglkZWxldGVfVVNDT1JFYnVzaW5lc3MgbGl0ZXJhbAorLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWFjdGlvbjoJZGVsZXRlX1VTQ09SRWJ1c2luZXNzIGRlbGV0ZV9idXNpbmVzcworLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWZhdWx0OglkZWxldGVfVVNDT1JFYnVzaW5lc3MgX2Rpc3Bvc2l0aW9uUmVwb3J0CitpbnQgX19wdWIyX19kZWxldGVfVVNDT1JFYnVzaW5lc3MoCisgICAgdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyogICAgICAgdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzc18sCisgICAgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0KiAgICAgICAgICAgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0XyAvLy88IHJlc3BvbnNlIHBhcmFtZXRlcgorKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIF9fcHViMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLy8vIE9wZXJhdGlvbiAiX19wdWIyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyIgb2Ygc2VydmljZSBiaW5kaW5nICJQdWJsaXNoU29hcCIKKworLyoqCisKK09wZXJhdGlvbiBkZXRhaWxzOgorCisgIC0gU09BUCBkb2N1bWVudC9saXRlcmFsIHN0eWxlCisgIC0gU09BUCBhY3Rpb249ImRlbGV0ZV9wdWJsaXNoZXJBc3NlcnRpb25zIgorICAtIFNPQVAgRmF1bHQ6IF9kaXNwb3NpdGlvblJlcG9ydAorCitDIHN0dWIgZnVuY3Rpb24gKGRlZmluZWQgaW4gc29hcENsaWVudC5jW3BwXSk6CitAY29kZQorICBpbnQgc29hcF9jYWxsX19fcHViMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAgKnNvYXAsCisgICAgTlVMTCwgLy8gY2hhciAqZW5kcG9pbnQgPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBlbmRwb2ludCBmb3IgdGhpcyBvcGVyYXRpb24KKyAgICBOVUxMLCAvLyBjaGFyICphY3Rpb24gPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBhY3Rpb24gZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgLy8gcmVxdWVzdCBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyogdWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zXywKKyAgICAvLyByZXNwb25zZSBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCogICAgICAgICAgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydF8KKyAgKTsKK0BlbmRjb2RlCisKK0MrKyBwcm94eSBjbGFzcyAoZGVmaW5lZCBpbiBzb2FwUHVibGlzaFNvYXBQcm94eS5oKToKKyAgY2xhc3MgUHVibGlzaFNvYXA7CisKKyovCisKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1zdHlsZToJZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgZG9jdW1lbnQKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1lbmNvZGluZzoJZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgbGl0ZXJhbAorLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWFjdGlvbjoJZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgZGVsZXRlX3B1Ymxpc2hlckFzc2VydGlvbnMKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1mYXVsdDoJZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgX2Rpc3Bvc2l0aW9uUmVwb3J0CitpbnQgX19wdWIyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucygKKyAgICB1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMqIHVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uc18sCisgICAgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0KiAgICAgICAgICAgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0XyAvLy88IHJlc3BvbnNlIHBhcmFtZXRlcgorKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIF9fcHViMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLy8vIE9wZXJhdGlvbiAiX19wdWIyX19kZWxldGVfVVNDT1JFc2VydmljZSIgb2Ygc2VydmljZSBiaW5kaW5nICJQdWJsaXNoU29hcCIKKworLyoqCisKK09wZXJhdGlvbiBkZXRhaWxzOgorCisgIC0gU09BUCBkb2N1bWVudC9saXRlcmFsIHN0eWxlCisgIC0gU09BUCBhY3Rpb249ImRlbGV0ZV9zZXJ2aWNlIgorICAtIFNPQVAgRmF1bHQ6IF9kaXNwb3NpdGlvblJlcG9ydAorCitDIHN0dWIgZnVuY3Rpb24gKGRlZmluZWQgaW4gc29hcENsaWVudC5jW3BwXSk6CitAY29kZQorICBpbnQgc29hcF9jYWxsX19fcHViMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAgKnNvYXAsCisgICAgTlVMTCwgLy8gY2hhciAqZW5kcG9pbnQgPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBlbmRwb2ludCBmb3IgdGhpcyBvcGVyYXRpb24KKyAgICBOVUxMLCAvLyBjaGFyICphY3Rpb24gPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBhY3Rpb24gZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgLy8gcmVxdWVzdCBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZSogICAgICAgIHVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZV8sCisgICAgLy8gcmVzcG9uc2UgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQqICAgICAgICAgICB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnRfCisgICk7CitAZW5kY29kZQorCitDKysgcHJveHkgY2xhc3MgKGRlZmluZWQgaW4gc29hcFB1Ymxpc2hTb2FwUHJveHkuaCk6CisgIGNsYXNzIFB1Ymxpc2hTb2FwOworCisqLworCisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2Qtc3R5bGU6CWRlbGV0ZV9VU0NPUkVzZXJ2aWNlIGRvY3VtZW50CisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2QtZW5jb2Rpbmc6CWRlbGV0ZV9VU0NPUkVzZXJ2aWNlIGxpdGVyYWwKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1hY3Rpb246CWRlbGV0ZV9VU0NPUkVzZXJ2aWNlIGRlbGV0ZV9zZXJ2aWNlCisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2QtZmF1bHQ6CWRlbGV0ZV9VU0NPUkVzZXJ2aWNlIF9kaXNwb3NpdGlvblJlcG9ydAoraW50IF9fcHViMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UoCisgICAgdWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlKiAgICAgICAgdWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlXywKKyAgICB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQqICAgICAgICAgICB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnRfIC8vLzwgcmVzcG9uc2UgcGFyYW1ldGVyCispOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogX19wdWIyX19kZWxldGVfVVNDT1JFdE1vZGVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvLy8gT3BlcmF0aW9uICJfX3B1YjJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwiIG9mIHNlcnZpY2UgYmluZGluZyAiUHVibGlzaFNvYXAiCisKKy8qKgorCitPcGVyYXRpb24gZGV0YWlsczoKKworICAtIFNPQVAgZG9jdW1lbnQvbGl0ZXJhbCBzdHlsZQorICAtIFNPQVAgYWN0aW9uPSJkZWxldGVfdE1vZGVsIgorICAtIFNPQVAgRmF1bHQ6IF9kaXNwb3NpdGlvblJlcG9ydAorCitDIHN0dWIgZnVuY3Rpb24gKGRlZmluZWQgaW4gc29hcENsaWVudC5jW3BwXSk6CitAY29kZQorICBpbnQgc29hcF9jYWxsX19fcHViMl9fZGVsZXRlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCAqc29hcCwKKyAgICBOVUxMLCAvLyBjaGFyICplbmRwb2ludCA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGVuZHBvaW50IGZvciB0aGlzIG9wZXJhdGlvbgorICAgIE5VTEwsIC8vIGNoYXIgKmFjdGlvbiA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGFjdGlvbiBmb3IgdGhpcyBvcGVyYXRpb24KKyAgICAvLyByZXF1ZXN0IHBhcmFtZXRlcnM6CisgICAgdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwqICAgICAgICAgdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWxfLAorICAgIC8vIHJlc3BvbnNlIHBhcmFtZXRlcnM6CisgICAgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0KiAgICAgICAgICAgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0XworICApOworQGVuZGNvZGUKKworQysrIHByb3h5IGNsYXNzIChkZWZpbmVkIGluIHNvYXBQdWJsaXNoU29hcFByb3h5LmgpOgorICBjbGFzcyBQdWJsaXNoU29hcDsKKworKi8KKworLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLXN0eWxlOglkZWxldGVfVVNDT1JFdE1vZGVsIGRvY3VtZW50CisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2QtZW5jb2Rpbmc6CWRlbGV0ZV9VU0NPUkV0TW9kZWwgbGl0ZXJhbAorLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWFjdGlvbjoJZGVsZXRlX1VTQ09SRXRNb2RlbCBkZWxldGVfdE1vZGVsCisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2QtZmF1bHQ6CWRlbGV0ZV9VU0NPUkV0TW9kZWwgX2Rpc3Bvc2l0aW9uUmVwb3J0CitpbnQgX19wdWIyX19kZWxldGVfVVNDT1JFdE1vZGVsKAorICAgIHVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsKiAgICAgICAgIHVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsXywKKyAgICB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQqICAgICAgICAgICB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnRfIC8vLzwgcmVzcG9uc2UgcGFyYW1ldGVyCispOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogX19wdWIyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvLy8gT3BlcmF0aW9uICJfX3B1YjJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuIiBvZiBzZXJ2aWNlIGJpbmRpbmcgIlB1Ymxpc2hTb2FwIgorCisvKioKKworT3BlcmF0aW9uIGRldGFpbHM6CisKKyAgLSBTT0FQIGRvY3VtZW50L2xpdGVyYWwgc3R5bGUKKyAgLSBTT0FQIGFjdGlvbj0iZGlzY2FyZF9hdXRoVG9rZW4iCisgIC0gU09BUCBGYXVsdDogX2Rpc3Bvc2l0aW9uUmVwb3J0CisKK0Mgc3R1YiBmdW5jdGlvbiAoZGVmaW5lZCBpbiBzb2FwQ2xpZW50LmNbcHBdKToKK0Bjb2RlCisgIGludCBzb2FwX2NhbGxfX19wdWIyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCAqc29hcCwKKyAgICBOVUxMLCAvLyBjaGFyICplbmRwb2ludCA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGVuZHBvaW50IGZvciB0aGlzIG9wZXJhdGlvbgorICAgIE5VTEwsIC8vIGNoYXIgKmFjdGlvbiA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGFjdGlvbiBmb3IgdGhpcyBvcGVyYXRpb24KKyAgICAvLyByZXF1ZXN0IHBhcmFtZXRlcnM6CisgICAgdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuKiAgICAgdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuXywKKyAgICAvLyByZXNwb25zZSBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCogICAgICAgICAgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydF8KKyAgKTsKK0BlbmRjb2RlCisKK0MrKyBwcm94eSBjbGFzcyAoZGVmaW5lZCBpbiBzb2FwUHVibGlzaFNvYXBQcm94eS5oKToKKyAgY2xhc3MgUHVibGlzaFNvYXA7CisKKyovCisKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1zdHlsZToJZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4gZG9jdW1lbnQKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1lbmNvZGluZzoJZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4gbGl0ZXJhbAorLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWFjdGlvbjoJZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4gZGlzY2FyZF9hdXRoVG9rZW4KKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1mYXVsdDoJZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4gX2Rpc3Bvc2l0aW9uUmVwb3J0CitpbnQgX19wdWIyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbigKKyAgICB1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4qICAgICB1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW5fLAorICAgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCogICAgICAgICAgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydF8gLy8vPCByZXNwb25zZSBwYXJhbWV0ZXIKKyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBfX3B1YjJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8vLyBPcGVyYXRpb24gIl9fcHViMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCIgb2Ygc2VydmljZSBiaW5kaW5nICJQdWJsaXNoU29hcCIKKworLyoqCisKK09wZXJhdGlvbiBkZXRhaWxzOgorCisgIC0gU09BUCBkb2N1bWVudC9saXRlcmFsIHN0eWxlCisgIC0gU09BUCBhY3Rpb249ImdldF9hc3NlcnRpb25TdGF0dXNSZXBvcnQiCisgIC0gU09BUCBGYXVsdDogX2Rpc3Bvc2l0aW9uUmVwb3J0CisKK0Mgc3R1YiBmdW5jdGlvbiAoZGVmaW5lZCBpbiBzb2FwQ2xpZW50LmNbcHBdKToKK0Bjb2RlCisgIGludCBzb2FwX2NhbGxfX19wdWIyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KHN0cnVjdCBzb2FwICpzb2FwLAorICAgIE5VTEwsIC8vIGNoYXIgKmVuZHBvaW50ID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgZW5kcG9pbnQgZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgTlVMTCwgLy8gY2hhciAqYWN0aW9uID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgYWN0aW9uIGZvciB0aGlzIG9wZXJhdGlvbgorICAgIC8vIHJlcXVlc3QgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCogdWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnRfLAorICAgIC8vIHJlc3BvbnNlIHBhcmFtZXRlcnM6CisgICAgdWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydCogICAgICAgdWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydF8KKyAgKTsKK0BlbmRjb2RlCisKK0MrKyBwcm94eSBjbGFzcyAoZGVmaW5lZCBpbiBzb2FwUHVibGlzaFNvYXBQcm94eS5oKToKKyAgY2xhc3MgUHVibGlzaFNvYXA7CisKKyovCisKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1zdHlsZToJZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCBkb2N1bWVudAorLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWVuY29kaW5nOglnZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0IGxpdGVyYWwKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1hY3Rpb246CWdldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQgZ2V0X2Fzc2VydGlvblN0YXR1c1JlcG9ydAorLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWZhdWx0OglnZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0IF9kaXNwb3NpdGlvblJlcG9ydAoraW50IF9fcHViMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCgKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCogdWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnRfLAorICAgIHVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQqICAgICAgIHVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnRfIC8vLzwgcmVzcG9uc2UgcGFyYW1ldGVyCispOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogX19wdWIyX19nZXRfVVNDT1JFYXV0aFRva2VuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvLy8gT3BlcmF0aW9uICJfX3B1YjJfX2dldF9VU0NPUkVhdXRoVG9rZW4iIG9mIHNlcnZpY2UgYmluZGluZyAiUHVibGlzaFNvYXAiCisKKy8qKgorCitPcGVyYXRpb24gZGV0YWlsczoKKworICAtIFNPQVAgZG9jdW1lbnQvbGl0ZXJhbCBzdHlsZQorICAtIFNPQVAgYWN0aW9uPSJnZXRfYXV0aFRva2VuIgorICAtIFNPQVAgRmF1bHQ6IF9kaXNwb3NpdGlvblJlcG9ydAorCitDIHN0dWIgZnVuY3Rpb24gKGRlZmluZWQgaW4gc29hcENsaWVudC5jW3BwXSk6CitAY29kZQorICBpbnQgc29hcF9jYWxsX19fcHViMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCAqc29hcCwKKyAgICBOVUxMLCAvLyBjaGFyICplbmRwb2ludCA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGVuZHBvaW50IGZvciB0aGlzIG9wZXJhdGlvbgorICAgIE5VTEwsIC8vIGNoYXIgKmFjdGlvbiA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGFjdGlvbiBmb3IgdGhpcyBvcGVyYXRpb24KKyAgICAvLyByZXF1ZXN0IHBhcmFtZXRlcnM6CisgICAgdWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW4qICAgICAgICAgdWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW5fLAorICAgIC8vIHJlc3BvbnNlIHBhcmFtZXRlcnM6CisgICAgdWRkaTJfX2F1dGhUb2tlbiogICAgICAgICAgICAgICAgICAgdWRkaTJfX2F1dGhUb2tlbl8KKyAgKTsKK0BlbmRjb2RlCisKK0MrKyBwcm94eSBjbGFzcyAoZGVmaW5lZCBpbiBzb2FwUHVibGlzaFNvYXBQcm94eS5oKToKKyAgY2xhc3MgUHVibGlzaFNvYXA7CisKKyovCisKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1zdHlsZToJZ2V0X1VTQ09SRWF1dGhUb2tlbiBkb2N1bWVudAorLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWVuY29kaW5nOglnZXRfVVNDT1JFYXV0aFRva2VuIGxpdGVyYWwKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1hY3Rpb246CWdldF9VU0NPUkVhdXRoVG9rZW4gZ2V0X2F1dGhUb2tlbgorLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWZhdWx0OglnZXRfVVNDT1JFYXV0aFRva2VuIF9kaXNwb3NpdGlvblJlcG9ydAoraW50IF9fcHViMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbigKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbiogICAgICAgICB1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbl8sCisgICAgdWRkaTJfX2F1dGhUb2tlbiogICAgICAgICAgICAgICAgICAgdWRkaTJfX2F1dGhUb2tlbl8gLy8vPCByZXNwb25zZSBwYXJhbWV0ZXIKKyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBfX3B1YjJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8vLyBPcGVyYXRpb24gIl9fcHViMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMiIG9mIHNlcnZpY2UgYmluZGluZyAiUHVibGlzaFNvYXAiCisKKy8qKgorCitPcGVyYXRpb24gZGV0YWlsczoKKworICAtIFNPQVAgZG9jdW1lbnQvbGl0ZXJhbCBzdHlsZQorICAtIFNPQVAgYWN0aW9uPSJnZXRfcHVibGlzaGVyQXNzZXJ0aW9ucyIKKyAgLSBTT0FQIEZhdWx0OiBfZGlzcG9zaXRpb25SZXBvcnQKKworQyBzdHViIGZ1bmN0aW9uIChkZWZpbmVkIGluIHNvYXBDbGllbnQuY1twcF0pOgorQGNvZGUKKyAgaW50IHNvYXBfY2FsbF9fX3B1YjJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwICpzb2FwLAorICAgIE5VTEwsIC8vIGNoYXIgKmVuZHBvaW50ID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgZW5kcG9pbnQgZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgTlVMTCwgLy8gY2hhciAqYWN0aW9uID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgYWN0aW9uIGZvciB0aGlzIG9wZXJhdGlvbgorICAgIC8vIHJlcXVlc3QgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMqIHVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uc18sCisgICAgLy8gcmVzcG9uc2UgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9ucyogICAgICAgICB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uc18KKyAgKTsKK0BlbmRjb2RlCisKK0MrKyBwcm94eSBjbGFzcyAoZGVmaW5lZCBpbiBzb2FwUHVibGlzaFNvYXBQcm94eS5oKToKKyAgY2xhc3MgUHVibGlzaFNvYXA7CisKKyovCisKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1zdHlsZToJZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgZG9jdW1lbnQKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1lbmNvZGluZzoJZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgbGl0ZXJhbAorLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWFjdGlvbjoJZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgZ2V0X3B1Ymxpc2hlckFzc2VydGlvbnMKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1mYXVsdDoJZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgX2Rpc3Bvc2l0aW9uUmVwb3J0CitpbnQgX19wdWIyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucygKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMqIHVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uc18sCisgICAgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMqICAgICAgICAgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnNfIC8vLzwgcmVzcG9uc2UgcGFyYW1ldGVyCispOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogX19wdWIyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvLy8gT3BlcmF0aW9uICJfX3B1YjJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyIgb2Ygc2VydmljZSBiaW5kaW5nICJQdWJsaXNoU29hcCIKKworLyoqCisKK09wZXJhdGlvbiBkZXRhaWxzOgorCisgIC0gU09BUCBkb2N1bWVudC9saXRlcmFsIHN0eWxlCisgIC0gU09BUCBhY3Rpb249ImdldF9yZWdpc3RlcmVkSW5mbyIKKyAgLSBTT0FQIEZhdWx0OiBfZGlzcG9zaXRpb25SZXBvcnQKKworQyBzdHViIGZ1bmN0aW9uIChkZWZpbmVkIGluIHNvYXBDbGllbnQuY1twcF0pOgorQGNvZGUKKyAgaW50IHNvYXBfY2FsbF9fX3B1YjJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyhzdHJ1Y3Qgc29hcCAqc29hcCwKKyAgICBOVUxMLCAvLyBjaGFyICplbmRwb2ludCA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGVuZHBvaW50IGZvciB0aGlzIG9wZXJhdGlvbgorICAgIE5VTEwsIC8vIGNoYXIgKmFjdGlvbiA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGFjdGlvbiBmb3IgdGhpcyBvcGVyYXRpb24KKyAgICAvLyByZXF1ZXN0IHBhcmFtZXRlcnM6CisgICAgdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyogICAgdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mb18sCisgICAgLy8gcmVzcG9uc2UgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fcmVnaXN0ZXJlZEluZm8qICAgICAgICAgICAgICB1ZGRpMl9fcmVnaXN0ZXJlZEluZm9fCisgICk7CitAZW5kY29kZQorCitDKysgcHJveHkgY2xhc3MgKGRlZmluZWQgaW4gc29hcFB1Ymxpc2hTb2FwUHJveHkuaCk6CisgIGNsYXNzIFB1Ymxpc2hTb2FwOworCisqLworCisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2Qtc3R5bGU6CWdldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyBkb2N1bWVudAorLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWVuY29kaW5nOglnZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8gbGl0ZXJhbAorLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWFjdGlvbjoJZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvIGdldF9yZWdpc3RlcmVkSW5mbworLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWZhdWx0OglnZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8gX2Rpc3Bvc2l0aW9uUmVwb3J0CitpbnQgX19wdWIyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8oCisgICAgdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyogICAgdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mb18sCisgICAgdWRkaTJfX3JlZ2lzdGVyZWRJbmZvKiAgICAgICAgICAgICAgdWRkaTJfX3JlZ2lzdGVyZWRJbmZvXyAvLy88IHJlc3BvbnNlIHBhcmFtZXRlcgorKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIF9fcHViMl9fc2F2ZV9VU0NPUkViaW5kaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLy8vIE9wZXJhdGlvbiAiX19wdWIyX19zYXZlX1VTQ09SRWJpbmRpbmciIG9mIHNlcnZpY2UgYmluZGluZyAiUHVibGlzaFNvYXAiCisKKy8qKgorCitPcGVyYXRpb24gZGV0YWlsczoKKworICAtIFNPQVAgZG9jdW1lbnQvbGl0ZXJhbCBzdHlsZQorICAtIFNPQVAgYWN0aW9uPSJzYXZlX2JpbmRpbmciCisgIC0gU09BUCBGYXVsdDogX2Rpc3Bvc2l0aW9uUmVwb3J0CisKK0Mgc3R1YiBmdW5jdGlvbiAoZGVmaW5lZCBpbiBzb2FwQ2xpZW50LmNbcHBdKToKK0Bjb2RlCisgIGludCBzb2FwX2NhbGxfX19wdWIyX19zYXZlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAgKnNvYXAsCisgICAgTlVMTCwgLy8gY2hhciAqZW5kcG9pbnQgPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBlbmRwb2ludCBmb3IgdGhpcyBvcGVyYXRpb24KKyAgICBOVUxMLCAvLyBjaGFyICphY3Rpb24gPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBhY3Rpb24gZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgLy8gcmVxdWVzdCBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcqICAgICAgICAgIHVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmdfLAorICAgIC8vIHJlc3BvbnNlIHBhcmFtZXRlcnM6CisgICAgdWRkaTJfX2JpbmRpbmdEZXRhaWwqICAgICAgICAgICAgICAgdWRkaTJfX2JpbmRpbmdEZXRhaWxfCisgICk7CitAZW5kY29kZQorCitDKysgcHJveHkgY2xhc3MgKGRlZmluZWQgaW4gc29hcFB1Ymxpc2hTb2FwUHJveHkuaCk6CisgIGNsYXNzIFB1Ymxpc2hTb2FwOworCisqLworCisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2Qtc3R5bGU6CXNhdmVfVVNDT1JFYmluZGluZyBkb2N1bWVudAorLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWVuY29kaW5nOglzYXZlX1VTQ09SRWJpbmRpbmcgbGl0ZXJhbAorLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWFjdGlvbjoJc2F2ZV9VU0NPUkViaW5kaW5nIHNhdmVfYmluZGluZworLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWZhdWx0OglzYXZlX1VTQ09SRWJpbmRpbmcgX2Rpc3Bvc2l0aW9uUmVwb3J0CitpbnQgX19wdWIyX19zYXZlX1VTQ09SRWJpbmRpbmcoCisgICAgdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZyogICAgICAgICAgdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZ18sCisgICAgdWRkaTJfX2JpbmRpbmdEZXRhaWwqICAgICAgICAgICAgICAgdWRkaTJfX2JpbmRpbmdEZXRhaWxfIC8vLzwgcmVzcG9uc2UgcGFyYW1ldGVyCispOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogX19wdWIyX19zYXZlX1VTQ09SRWJ1c2luZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvLy8gT3BlcmF0aW9uICJfX3B1YjJfX3NhdmVfVVNDT1JFYnVzaW5lc3MiIG9mIHNlcnZpY2UgYmluZGluZyAiUHVibGlzaFNvYXAiCisKKy8qKgorCitPcGVyYXRpb24gZGV0YWlsczoKKworICAtIFNPQVAgZG9jdW1lbnQvbGl0ZXJhbCBzdHlsZQorICAtIFNPQVAgYWN0aW9uPSJzYXZlX2J1c2luZXNzIgorICAtIFNPQVAgRmF1bHQ6IF9kaXNwb3NpdGlvblJlcG9ydAorCitDIHN0dWIgZnVuY3Rpb24gKGRlZmluZWQgaW4gc29hcENsaWVudC5jW3BwXSk6CitAY29kZQorICBpbnQgc29hcF9jYWxsX19fcHViMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCAqc29hcCwKKyAgICBOVUxMLCAvLyBjaGFyICplbmRwb2ludCA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGVuZHBvaW50IGZvciB0aGlzIG9wZXJhdGlvbgorICAgIE5VTEwsIC8vIGNoYXIgKmFjdGlvbiA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGFjdGlvbiBmb3IgdGhpcyBvcGVyYXRpb24KKyAgICAvLyByZXF1ZXN0IHBhcmFtZXRlcnM6CisgICAgdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3MqICAgICAgICAgdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3NfLAorICAgIC8vIHJlc3BvbnNlIHBhcmFtZXRlcnM6CisgICAgdWRkaTJfX2J1c2luZXNzRGV0YWlsKiAgICAgICAgICAgICAgdWRkaTJfX2J1c2luZXNzRGV0YWlsXworICApOworQGVuZGNvZGUKKworQysrIHByb3h5IGNsYXNzIChkZWZpbmVkIGluIHNvYXBQdWJsaXNoU29hcFByb3h5LmgpOgorICBjbGFzcyBQdWJsaXNoU29hcDsKKworKi8KKworLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLXN0eWxlOglzYXZlX1VTQ09SRWJ1c2luZXNzIGRvY3VtZW50CisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2QtZW5jb2Rpbmc6CXNhdmVfVVNDT1JFYnVzaW5lc3MgbGl0ZXJhbAorLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWFjdGlvbjoJc2F2ZV9VU0NPUkVidXNpbmVzcyBzYXZlX2J1c2luZXNzCisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2QtZmF1bHQ6CXNhdmVfVVNDT1JFYnVzaW5lc3MgX2Rpc3Bvc2l0aW9uUmVwb3J0CitpbnQgX19wdWIyX19zYXZlX1VTQ09SRWJ1c2luZXNzKAorICAgIHVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzKiAgICAgICAgIHVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzXywKKyAgICB1ZGRpMl9fYnVzaW5lc3NEZXRhaWwqICAgICAgICAgICAgICB1ZGRpMl9fYnVzaW5lc3NEZXRhaWxfIC8vLzwgcmVzcG9uc2UgcGFyYW1ldGVyCispOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogX19wdWIyX19zYXZlX1VTQ09SRXNlcnZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvLy8gT3BlcmF0aW9uICJfX3B1YjJfX3NhdmVfVVNDT1JFc2VydmljZSIgb2Ygc2VydmljZSBiaW5kaW5nICJQdWJsaXNoU29hcCIKKworLyoqCisKK09wZXJhdGlvbiBkZXRhaWxzOgorCisgIC0gU09BUCBkb2N1bWVudC9saXRlcmFsIHN0eWxlCisgIC0gU09BUCBhY3Rpb249InNhdmVfc2VydmljZSIKKyAgLSBTT0FQIEZhdWx0OiBfZGlzcG9zaXRpb25SZXBvcnQKKworQyBzdHViIGZ1bmN0aW9uIChkZWZpbmVkIGluIHNvYXBDbGllbnQuY1twcF0pOgorQGNvZGUKKyAgaW50IHNvYXBfY2FsbF9fX3B1YjJfX3NhdmVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCAqc29hcCwKKyAgICBOVUxMLCAvLyBjaGFyICplbmRwb2ludCA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGVuZHBvaW50IGZvciB0aGlzIG9wZXJhdGlvbgorICAgIE5VTEwsIC8vIGNoYXIgKmFjdGlvbiA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGFjdGlvbiBmb3IgdGhpcyBvcGVyYXRpb24KKyAgICAvLyByZXF1ZXN0IHBhcmFtZXRlcnM6CisgICAgdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZSogICAgICAgICAgdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZV8sCisgICAgLy8gcmVzcG9uc2UgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fc2VydmljZURldGFpbCogICAgICAgICAgICAgICB1ZGRpMl9fc2VydmljZURldGFpbF8KKyAgKTsKK0BlbmRjb2RlCisKK0MrKyBwcm94eSBjbGFzcyAoZGVmaW5lZCBpbiBzb2FwUHVibGlzaFNvYXBQcm94eS5oKToKKyAgY2xhc3MgUHVibGlzaFNvYXA7CisKKyovCisKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1zdHlsZToJc2F2ZV9VU0NPUkVzZXJ2aWNlIGRvY3VtZW50CisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2QtZW5jb2Rpbmc6CXNhdmVfVVNDT1JFc2VydmljZSBsaXRlcmFsCisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2QtYWN0aW9uOglzYXZlX1VTQ09SRXNlcnZpY2Ugc2F2ZV9zZXJ2aWNlCisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2QtZmF1bHQ6CXNhdmVfVVNDT1JFc2VydmljZSBfZGlzcG9zaXRpb25SZXBvcnQKK2ludCBfX3B1YjJfX3NhdmVfVVNDT1JFc2VydmljZSgKKyAgICB1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlKiAgICAgICAgICB1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlXywKKyAgICB1ZGRpMl9fc2VydmljZURldGFpbCogICAgICAgICAgICAgICB1ZGRpMl9fc2VydmljZURldGFpbF8gLy8vPCByZXNwb25zZSBwYXJhbWV0ZXIKKyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBfX3B1YjJfX3NhdmVfVVNDT1JFdE1vZGVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8vLyBPcGVyYXRpb24gIl9fcHViMl9fc2F2ZV9VU0NPUkV0TW9kZWwiIG9mIHNlcnZpY2UgYmluZGluZyAiUHVibGlzaFNvYXAiCisKKy8qKgorCitPcGVyYXRpb24gZGV0YWlsczoKKworICAtIFNPQVAgZG9jdW1lbnQvbGl0ZXJhbCBzdHlsZQorICAtIFNPQVAgYWN0aW9uPSJzYXZlX3RNb2RlbCIKKyAgLSBTT0FQIEZhdWx0OiBfZGlzcG9zaXRpb25SZXBvcnQKKworQyBzdHViIGZ1bmN0aW9uIChkZWZpbmVkIGluIHNvYXBDbGllbnQuY1twcF0pOgorQGNvZGUKKyAgaW50IHNvYXBfY2FsbF9fX3B1YjJfX3NhdmVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwICpzb2FwLAorICAgIE5VTEwsIC8vIGNoYXIgKmVuZHBvaW50ID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgZW5kcG9pbnQgZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgTlVMTCwgLy8gY2hhciAqYWN0aW9uID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgYWN0aW9uIGZvciB0aGlzIG9wZXJhdGlvbgorICAgIC8vIHJlcXVlc3QgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwqICAgICAgICAgICB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWxfLAorICAgIC8vIHJlc3BvbnNlIHBhcmFtZXRlcnM6CisgICAgdWRkaTJfX3RNb2RlbERldGFpbCogICAgICAgICAgICAgICAgdWRkaTJfX3RNb2RlbERldGFpbF8KKyAgKTsKK0BlbmRjb2RlCisKK0MrKyBwcm94eSBjbGFzcyAoZGVmaW5lZCBpbiBzb2FwUHVibGlzaFNvYXBQcm94eS5oKToKKyAgY2xhc3MgUHVibGlzaFNvYXA7CisKKyovCisKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1zdHlsZToJc2F2ZV9VU0NPUkV0TW9kZWwgZG9jdW1lbnQKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1lbmNvZGluZzoJc2F2ZV9VU0NPUkV0TW9kZWwgbGl0ZXJhbAorLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWFjdGlvbjoJc2F2ZV9VU0NPUkV0TW9kZWwgc2F2ZV90TW9kZWwKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1mYXVsdDoJc2F2ZV9VU0NPUkV0TW9kZWwgX2Rpc3Bvc2l0aW9uUmVwb3J0CitpbnQgX19wdWIyX19zYXZlX1VTQ09SRXRNb2RlbCgKKyAgICB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwqICAgICAgICAgICB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWxfLAorICAgIHVkZGkyX190TW9kZWxEZXRhaWwqICAgICAgICAgICAgICAgIHVkZGkyX190TW9kZWxEZXRhaWxfIC8vLzwgcmVzcG9uc2UgcGFyYW1ldGVyCispOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogX19wdWIyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvLy8gT3BlcmF0aW9uICJfX3B1YjJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zIiBvZiBzZXJ2aWNlIGJpbmRpbmcgIlB1Ymxpc2hTb2FwIgorCisvKioKKworT3BlcmF0aW9uIGRldGFpbHM6CisKKyAgLSBTT0FQIGRvY3VtZW50L2xpdGVyYWwgc3R5bGUKKyAgLSBTT0FQIGFjdGlvbj0ic2V0X3B1Ymxpc2hlckFzc2VydGlvbnMiCisgIC0gU09BUCBGYXVsdDogX2Rpc3Bvc2l0aW9uUmVwb3J0CisKK0Mgc3R1YiBmdW5jdGlvbiAoZGVmaW5lZCBpbiBzb2FwQ2xpZW50LmNbcHBdKToKK0Bjb2RlCisgIGludCBzb2FwX2NhbGxfX19wdWIyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwKKyAgICBOVUxMLCAvLyBjaGFyICplbmRwb2ludCA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGVuZHBvaW50IGZvciB0aGlzIG9wZXJhdGlvbgorICAgIE5VTEwsIC8vIGNoYXIgKmFjdGlvbiA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGFjdGlvbiBmb3IgdGhpcyBvcGVyYXRpb24KKyAgICAvLyByZXF1ZXN0IHBhcmFtZXRlcnM6CisgICAgdWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKiB1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnNfLAorICAgIC8vIHJlc3BvbnNlIHBhcmFtZXRlcnM6CisgICAgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMqICAgICAgICAgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnNfCisgICk7CitAZW5kY29kZQorCitDKysgcHJveHkgY2xhc3MgKGRlZmluZWQgaW4gc29hcFB1Ymxpc2hTb2FwUHJveHkuaCk6CisgIGNsYXNzIFB1Ymxpc2hTb2FwOworCisqLworCisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2Qtc3R5bGU6CXNldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zIGRvY3VtZW50CisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2QtZW5jb2Rpbmc6CXNldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zIGxpdGVyYWwKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1hY3Rpb246CXNldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zIHNldF9wdWJsaXNoZXJBc3NlcnRpb25zCisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2QtZmF1bHQ6CXNldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zIF9kaXNwb3NpdGlvblJlcG9ydAoraW50IF9fcHViMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoCisgICAgdWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKiB1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnNfLAorICAgIHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zKiAgICAgICAgIHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zXyAvLy88IHJlc3BvbnNlIHBhcmFtZXRlcgorKTsKKworLyogRW5kIG9mIHB1Ymxpc2hfdjIuaCAqLwpkaWZmIC0tZ2l0IGEvdWRkaTIvcHVibGlzaF92Mi53c2RsIGIvdWRkaTIvcHVibGlzaF92Mi53c2RsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMWFjNDEKLS0tIC9kZXYvbnVsbAorKysgYi91ZGRpMi9wdWJsaXNoX3YyLndzZGwKQEAgLTAsMCArMSwzNzggQEAKKzxkZWZpbml0aW9ucyB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnRucz0idXJuOnVkZGktb3JnOnB1YmxpY2F0aW9uX3YyIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp1ZGRpPSJ1cm46dWRkaS1vcmc6YXBpX3YyIiB0YXJnZXROYW1lc3BhY2U9InVybjp1ZGRpLW9yZzpwdWJsaWNhdGlvbl92MiIgbmFtZT0iVURESV9QdWJsaWNhdGlvbl9BUElfVjIiPgorCTxkb2N1bWVudGF0aW9uPgorCQlDb3B5cmlnaHQgKGMpIDIwMDAgLSAyMDAyIGJ5IEFjY2VudHVyZSwgQXJpYmEsIEluYy4sIENvbW1lcmNlIE9uZSwgSW5jLiAKKwkJRnVqaXRzdSBMaW1pdGVkLCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSwgaTIgVGVjaG5vbG9naWVzLCBJbmMuLCAKKwkJSW50ZWwgQ29ycG9yYXRpb24sIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24sICAKKwkJTWljcm9zb2Z0IENvcnBvcmF0aW9uLCBPcmFjbGUgQ29ycG9yYXRpb24sIFNBUCBBRywgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgCisJCWFuZCBWZXJpU2lnbiwgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKwkJCisJCVdTREwgU2VydmljZSBJbnRlcmZhY2UgZm9yIFVEREkgUHVibGljYXRpb24gQVBJIFYyLjAKKwkJCisJCVRoaXMgV1NETCBkb2N1bWVudCBkZWZpbmVzIHRoZSBwdWJsaWNhdGlvbiBBUEkgY2FsbHMgZm9yIGludGVyYWN0aW5nIHdpdGggCisJCXRoZSBVRERJIHJlZ2lzdHJ5LiAgVGhlIGNvbXBsZXRlIFVEREkgQVBJIHNwZWNpZmljYXRpb24gaXMgYXZhaWxhYmxlCisJCWF0IGh0dHA6Ly93d3cudWRkaS5vcmcvc3BlY2lmaWNhdGlvbi5odG1sLgorCTwvZG9jdW1lbnRhdGlvbj4gCisJPHR5cGVzPgorCQk8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9InVybjp1ZGRpLW9yZzpwdWJsaWNhdGlvbl92MiIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+CisJCQk8eHNkOmltcG9ydCBuYW1lc3BhY2U9InVybjp1ZGRpLW9yZzphcGlfdjIiIHNjaGVtYUxvY2F0aW9uPSJ1ZGRpX3YyLnhzZCIvPgorCQk8L3hzZDpzY2hlbWE+CisJPC90eXBlcz4KKwk8bWVzc2FnZSBuYW1lPSJhZGRfcHVibGlzaGVyQXNzZXJ0aW9ucyI+CisJCTxwYXJ0IG5hbWU9ImJvZHkiIGVsZW1lbnQ9InVkZGk6YWRkX3B1Ymxpc2hlckFzc2VydGlvbnMiLz4KKwk8L21lc3NhZ2U+CisJPG1lc3NhZ2UgbmFtZT0iYXNzZXJ0aW9uU3RhdHVzUmVwb3J0Ij4KKwkJPHBhcnQgbmFtZT0iYm9keSIgZWxlbWVudD0idWRkaTphc3NlcnRpb25TdGF0dXNSZXBvcnQiLz4KKwk8L21lc3NhZ2U+CisJPG1lc3NhZ2UgbmFtZT0iYXV0aFRva2VuIj4KKwkJPHBhcnQgbmFtZT0iYm9keSIgZWxlbWVudD0idWRkaTphdXRoVG9rZW4iLz4KKwk8L21lc3NhZ2U+CisJPG1lc3NhZ2UgbmFtZT0iYmluZGluZ0RldGFpbCI+CisJCTxwYXJ0IG5hbWU9ImJvZHkiIGVsZW1lbnQ9InVkZGk6YmluZGluZ0RldGFpbCIvPgorCTwvbWVzc2FnZT4KKwk8bWVzc2FnZSBuYW1lPSJidXNpbmVzc0RldGFpbCI+CisJCTxwYXJ0IG5hbWU9ImJvZHkiIGVsZW1lbnQ9InVkZGk6YnVzaW5lc3NEZXRhaWwiLz4KKwk8L21lc3NhZ2U+CisJPG1lc3NhZ2UgbmFtZT0iZGVsZXRlX2JpbmRpbmciPgorCQk8cGFydCBuYW1lPSJib2R5IiBlbGVtZW50PSJ1ZGRpOmRlbGV0ZV9iaW5kaW5nIi8+CisJPC9tZXNzYWdlPgorCTxtZXNzYWdlIG5hbWU9ImRlbGV0ZV9idXNpbmVzcyI+CisJCTxwYXJ0IG5hbWU9ImJvZHkiIGVsZW1lbnQ9InVkZGk6ZGVsZXRlX2J1c2luZXNzIi8+CisJPC9tZXNzYWdlPgorCTxtZXNzYWdlIG5hbWU9ImRlbGV0ZV9wdWJsaXNoZXJBc3NlcnRpb25zIj4KKwkJPHBhcnQgbmFtZT0iYm9keSIgZWxlbWVudD0idWRkaTpkZWxldGVfcHVibGlzaGVyQXNzZXJ0aW9ucyIvPgorCTwvbWVzc2FnZT4KKwk8bWVzc2FnZSBuYW1lPSJkZWxldGVfc2VydmljZSI+CisJCTxwYXJ0IG5hbWU9ImJvZHkiIGVsZW1lbnQ9InVkZGk6ZGVsZXRlX3NlcnZpY2UiLz4KKwk8L21lc3NhZ2U+CisJPG1lc3NhZ2UgbmFtZT0iZGVsZXRlX3RNb2RlbCI+CisJCTxwYXJ0IG5hbWU9ImJvZHkiIGVsZW1lbnQ9InVkZGk6ZGVsZXRlX3RNb2RlbCIvPgorCTwvbWVzc2FnZT4KKwk8bWVzc2FnZSBuYW1lPSJkaXNjYXJkX2F1dGhUb2tlbiI+CisJCTxwYXJ0IG5hbWU9ImJvZHkiIGVsZW1lbnQ9InVkZGk6ZGlzY2FyZF9hdXRoVG9rZW4iLz4KKwk8L21lc3NhZ2U+CisJPG1lc3NhZ2UgbmFtZT0iZGlzcG9zaXRpb25SZXBvcnQiPgorCQk8cGFydCBuYW1lPSJib2R5IiBlbGVtZW50PSJ1ZGRpOmRpc3Bvc2l0aW9uUmVwb3J0Ii8+CisJPC9tZXNzYWdlPgorCTxtZXNzYWdlIG5hbWU9ImdldF9hc3NlcnRpb25TdGF0dXNSZXBvcnQiPgorCQk8cGFydCBuYW1lPSJib2R5IiBlbGVtZW50PSJ1ZGRpOmdldF9hc3NlcnRpb25TdGF0dXNSZXBvcnQiLz4KKwk8L21lc3NhZ2U+CisJPG1lc3NhZ2UgbmFtZT0iZ2V0X2F1dGhUb2tlbiI+CisJCTxwYXJ0IG5hbWU9ImJvZHkiIGVsZW1lbnQ9InVkZGk6Z2V0X2F1dGhUb2tlbiIvPgorCTwvbWVzc2FnZT4KKwk8bWVzc2FnZSBuYW1lPSJnZXRfcHVibGlzaGVyQXNzZXJ0aW9ucyI+CisJCTxwYXJ0IG5hbWU9ImJvZHkiIGVsZW1lbnQ9InVkZGk6Z2V0X3B1Ymxpc2hlckFzc2VydGlvbnMiLz4KKwk8L21lc3NhZ2U+CisJPG1lc3NhZ2UgbmFtZT0iZ2V0X3JlZ2lzdGVyZWRJbmZvIj4KKwkJPHBhcnQgbmFtZT0iYm9keSIgZWxlbWVudD0idWRkaTpnZXRfcmVnaXN0ZXJlZEluZm8iLz4KKwk8L21lc3NhZ2U+CisJPG1lc3NhZ2UgbmFtZT0icHVibGlzaGVyQXNzZXJ0aW9ucyI+CisJCTxwYXJ0IG5hbWU9ImJvZHkiIGVsZW1lbnQ9InVkZGk6cHVibGlzaGVyQXNzZXJ0aW9ucyIvPgorCTwvbWVzc2FnZT4KKwk8bWVzc2FnZSBuYW1lPSJyZWdpc3RlcmVkSW5mbyI+CisJCTxwYXJ0IG5hbWU9ImJvZHkiIGVsZW1lbnQ9InVkZGk6cmVnaXN0ZXJlZEluZm8iLz4KKwk8L21lc3NhZ2U+CisJPG1lc3NhZ2UgbmFtZT0ic2F2ZV9iaW5kaW5nIj4KKwkJPHBhcnQgbmFtZT0iYm9keSIgZWxlbWVudD0idWRkaTpzYXZlX2JpbmRpbmciLz4KKwk8L21lc3NhZ2U+CisJPG1lc3NhZ2UgbmFtZT0ic2F2ZV9idXNpbmVzcyI+CisJCTxwYXJ0IG5hbWU9ImJvZHkiIGVsZW1lbnQ9InVkZGk6c2F2ZV9idXNpbmVzcyIvPgorCTwvbWVzc2FnZT4KKwk8bWVzc2FnZSBuYW1lPSJzYXZlX3NlcnZpY2UiPgorCQk8cGFydCBuYW1lPSJib2R5IiBlbGVtZW50PSJ1ZGRpOnNhdmVfc2VydmljZSIvPgorCTwvbWVzc2FnZT4KKwk8bWVzc2FnZSBuYW1lPSJzYXZlX3RNb2RlbCI+CisJCTxwYXJ0IG5hbWU9ImJvZHkiIGVsZW1lbnQ9InVkZGk6c2F2ZV90TW9kZWwiLz4KKwk8L21lc3NhZ2U+CisJPG1lc3NhZ2UgbmFtZT0ic2VydmljZURldGFpbCI+CisJCTxwYXJ0IG5hbWU9ImJvZHkiIGVsZW1lbnQ9InVkZGk6c2VydmljZURldGFpbCIvPgorCTwvbWVzc2FnZT4KKwk8bWVzc2FnZSBuYW1lPSJzZXRfcHVibGlzaGVyQXNzZXJ0aW9ucyI+CisJCTxwYXJ0IG5hbWU9ImJvZHkiIGVsZW1lbnQ9InVkZGk6c2V0X3B1Ymxpc2hlckFzc2VydGlvbnMiLz4KKwk8L21lc3NhZ2U+CisJPG1lc3NhZ2UgbmFtZT0idE1vZGVsRGV0YWlsIj4KKwkJPHBhcnQgbmFtZT0iYm9keSIgZWxlbWVudD0idWRkaTp0TW9kZWxEZXRhaWwiLz4KKwk8L21lc3NhZ2U+CisJPHBvcnRUeXBlIG5hbWU9IlB1Ymxpc2giPgorCQk8ZG9jdW1lbnRhdGlvbj4KKwkJCVRoaXMgcG9ydFR5cGUgZGVmaW5lcyBhbGwgb2YgdGhlIFVEREkgcHVibGlzaCBvcGVyYXRpb25zLgorCSAgPC9kb2N1bWVudGF0aW9uPgorCQk8b3BlcmF0aW9uIG5hbWU9ImFkZF9wdWJsaXNoZXJBc3NlcnRpb25zIj4KKwkJCTxpbnB1dCBtZXNzYWdlPSJ0bnM6YWRkX3B1Ymxpc2hlckFzc2VydGlvbnMiLz4KKwkJCTxvdXRwdXQgbWVzc2FnZT0idG5zOmRpc3Bvc2l0aW9uUmVwb3J0Ii8+CisJCQk8ZmF1bHQgbmFtZT0iZXJyb3IiIG1lc3NhZ2U9InRuczpkaXNwb3NpdGlvblJlcG9ydCIvPgorCQk8L29wZXJhdGlvbj4KKwkJPG9wZXJhdGlvbiBuYW1lPSJkZWxldGVfYmluZGluZyI+CisJCQk8aW5wdXQgbWVzc2FnZT0idG5zOmRlbGV0ZV9iaW5kaW5nIi8+CisJCQk8b3V0cHV0IG1lc3NhZ2U9InRuczpkaXNwb3NpdGlvblJlcG9ydCIvPgorCQkJPGZhdWx0IG5hbWU9ImVycm9yIiBtZXNzYWdlPSJ0bnM6ZGlzcG9zaXRpb25SZXBvcnQiLz4KKwkJPC9vcGVyYXRpb24+CisJCTxvcGVyYXRpb24gbmFtZT0iZGVsZXRlX2J1c2luZXNzIj4KKwkJCTxpbnB1dCBtZXNzYWdlPSJ0bnM6ZGVsZXRlX2J1c2luZXNzIi8+CisJCQk8b3V0cHV0IG1lc3NhZ2U9InRuczpkaXNwb3NpdGlvblJlcG9ydCIvPgorCQkJPGZhdWx0IG5hbWU9ImVycm9yIiBtZXNzYWdlPSJ0bnM6ZGlzcG9zaXRpb25SZXBvcnQiLz4KKwkJPC9vcGVyYXRpb24+CisJCTxvcGVyYXRpb24gbmFtZT0iZGVsZXRlX3B1Ymxpc2hlckFzc2VydGlvbnMiPgorCQkJPGlucHV0IG1lc3NhZ2U9InRuczpkZWxldGVfcHVibGlzaGVyQXNzZXJ0aW9ucyIvPgorCQkJPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZGlzcG9zaXRpb25SZXBvcnQiLz4KKwkJCTxmYXVsdCBuYW1lPSJlcnJvciIgbWVzc2FnZT0idG5zOmRpc3Bvc2l0aW9uUmVwb3J0Ii8+CisJCTwvb3BlcmF0aW9uPgorCQk8b3BlcmF0aW9uIG5hbWU9ImRlbGV0ZV9zZXJ2aWNlIj4KKwkJCTxpbnB1dCBtZXNzYWdlPSJ0bnM6ZGVsZXRlX3NlcnZpY2UiLz4KKwkJCTxvdXRwdXQgbWVzc2FnZT0idG5zOmRpc3Bvc2l0aW9uUmVwb3J0Ii8+CisJCQk8ZmF1bHQgbmFtZT0iZXJyb3IiIG1lc3NhZ2U9InRuczpkaXNwb3NpdGlvblJlcG9ydCIvPgorCQk8L29wZXJhdGlvbj4KKwkJPG9wZXJhdGlvbiBuYW1lPSJkZWxldGVfdE1vZGVsIj4KKwkJCTxpbnB1dCBtZXNzYWdlPSJ0bnM6ZGVsZXRlX3RNb2RlbCIvPgorCQkJPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZGlzcG9zaXRpb25SZXBvcnQiLz4KKwkJCTxmYXVsdCBuYW1lPSJlcnJvciIgbWVzc2FnZT0idG5zOmRpc3Bvc2l0aW9uUmVwb3J0Ii8+CisJCTwvb3BlcmF0aW9uPgorCQk8b3BlcmF0aW9uIG5hbWU9ImRpc2NhcmRfYXV0aFRva2VuIj4KKwkJCTxpbnB1dCBtZXNzYWdlPSJ0bnM6ZGlzY2FyZF9hdXRoVG9rZW4iLz4KKwkJCTxvdXRwdXQgbWVzc2FnZT0idG5zOmRpc3Bvc2l0aW9uUmVwb3J0Ii8+CisJCQk8ZmF1bHQgbmFtZT0iZXJyb3IiIG1lc3NhZ2U9InRuczpkaXNwb3NpdGlvblJlcG9ydCIvPgorCQk8L29wZXJhdGlvbj4KKwkJPG9wZXJhdGlvbiBuYW1lPSJnZXRfYXNzZXJ0aW9uU3RhdHVzUmVwb3J0Ij4KKwkJCTxpbnB1dCBtZXNzYWdlPSJ0bnM6Z2V0X2Fzc2VydGlvblN0YXR1c1JlcG9ydCIvPgorCQkJPG91dHB1dCBtZXNzYWdlPSJ0bnM6YXNzZXJ0aW9uU3RhdHVzUmVwb3J0Ii8+CisJCQk8ZmF1bHQgbmFtZT0iZXJyb3IiIG1lc3NhZ2U9InRuczpkaXNwb3NpdGlvblJlcG9ydCIvPgorCQk8L29wZXJhdGlvbj4KKwkJPG9wZXJhdGlvbiBuYW1lPSJnZXRfYXV0aFRva2VuIj4KKwkJCTxpbnB1dCBtZXNzYWdlPSJ0bnM6Z2V0X2F1dGhUb2tlbiIvPgorCQkJPG91dHB1dCBtZXNzYWdlPSJ0bnM6YXV0aFRva2VuIi8+CisJCQk8ZmF1bHQgbmFtZT0iZXJyb3IiIG1lc3NhZ2U9InRuczpkaXNwb3NpdGlvblJlcG9ydCIvPgorCQk8L29wZXJhdGlvbj4KKwkJPG9wZXJhdGlvbiBuYW1lPSJnZXRfcHVibGlzaGVyQXNzZXJ0aW9ucyI+CisJCQk8aW5wdXQgbWVzc2FnZT0idG5zOmdldF9wdWJsaXNoZXJBc3NlcnRpb25zIi8+CisJCQk8b3V0cHV0IG1lc3NhZ2U9InRuczpwdWJsaXNoZXJBc3NlcnRpb25zIi8+CisJCQk8ZmF1bHQgbmFtZT0iZXJyb3IiIG1lc3NhZ2U9InRuczpkaXNwb3NpdGlvblJlcG9ydCIvPgorCQk8L29wZXJhdGlvbj4KKwkJPG9wZXJhdGlvbiBuYW1lPSJnZXRfcmVnaXN0ZXJlZEluZm8iPgorCQkJPGlucHV0IG1lc3NhZ2U9InRuczpnZXRfcmVnaXN0ZXJlZEluZm8iLz4KKwkJCTxvdXRwdXQgbWVzc2FnZT0idG5zOnJlZ2lzdGVyZWRJbmZvIi8+CisJCQk8ZmF1bHQgbmFtZT0iZXJyb3IiIG1lc3NhZ2U9InRuczpkaXNwb3NpdGlvblJlcG9ydCIvPgorCQk8L29wZXJhdGlvbj4KKwkJPG9wZXJhdGlvbiBuYW1lPSJzYXZlX2JpbmRpbmciPgorCQkJPGlucHV0IG1lc3NhZ2U9InRuczpzYXZlX2JpbmRpbmciLz4KKwkJCTxvdXRwdXQgbWVzc2FnZT0idG5zOmJpbmRpbmdEZXRhaWwiLz4KKwkJCTxmYXVsdCBuYW1lPSJlcnJvciIgbWVzc2FnZT0idG5zOmRpc3Bvc2l0aW9uUmVwb3J0Ii8+CisJCTwvb3BlcmF0aW9uPgorCQk8b3BlcmF0aW9uIG5hbWU9InNhdmVfYnVzaW5lc3MiPgorCQkJPGlucHV0IG1lc3NhZ2U9InRuczpzYXZlX2J1c2luZXNzIi8+CisJCQk8b3V0cHV0IG1lc3NhZ2U9InRuczpidXNpbmVzc0RldGFpbCIvPgorCQkJPGZhdWx0IG5hbWU9ImVycm9yIiBtZXNzYWdlPSJ0bnM6ZGlzcG9zaXRpb25SZXBvcnQiLz4KKwkJPC9vcGVyYXRpb24+CisJCTxvcGVyYXRpb24gbmFtZT0ic2F2ZV9zZXJ2aWNlIj4KKwkJCTxpbnB1dCBtZXNzYWdlPSJ0bnM6c2F2ZV9zZXJ2aWNlIi8+CisJCQk8b3V0cHV0IG1lc3NhZ2U9InRuczpzZXJ2aWNlRGV0YWlsIi8+CisJCQk8ZmF1bHQgbmFtZT0iZXJyb3IiIG1lc3NhZ2U9InRuczpkaXNwb3NpdGlvblJlcG9ydCIvPgorCQk8L29wZXJhdGlvbj4KKwkJPG9wZXJhdGlvbiBuYW1lPSJzYXZlX3RNb2RlbCI+CisJCQk8aW5wdXQgbWVzc2FnZT0idG5zOnNhdmVfdE1vZGVsIi8+CisJCQk8b3V0cHV0IG1lc3NhZ2U9InRuczp0TW9kZWxEZXRhaWwiLz4KKwkJCTxmYXVsdCBuYW1lPSJlcnJvciIgbWVzc2FnZT0idG5zOmRpc3Bvc2l0aW9uUmVwb3J0Ii8+CisJCTwvb3BlcmF0aW9uPgorCQk8b3BlcmF0aW9uIG5hbWU9InNldF9wdWJsaXNoZXJBc3NlcnRpb25zIj4KKwkJCTxpbnB1dCBtZXNzYWdlPSJ0bnM6c2V0X3B1Ymxpc2hlckFzc2VydGlvbnMiLz4KKwkJCTxvdXRwdXQgbWVzc2FnZT0idG5zOnB1Ymxpc2hlckFzc2VydGlvbnMiLz4KKwkJCTxmYXVsdCBuYW1lPSJlcnJvciIgbWVzc2FnZT0idG5zOmRpc3Bvc2l0aW9uUmVwb3J0Ii8+CisJCTwvb3BlcmF0aW9uPgorCTwvcG9ydFR5cGU+CisJPGJpbmRpbmcgbmFtZT0iUHVibGlzaFNvYXAiIHR5cGU9InRuczpQdWJsaXNoIj4KKwkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+CisJCTxkb2N1bWVudGF0aW9uPgorCQkgIFRoaXMgaXMgdGhlIFNPQVAgYmluZGluZyBmb3IgdGhlIFVEREkgcHVibGlzaCBvcGVyYXRpb25zLgorCQk8L2RvY3VtZW50YXRpb24+CisJCTxvcGVyYXRpb24gbmFtZT0iYWRkX3B1Ymxpc2hlckFzc2VydGlvbnMiPgorCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImFkZF9wdWJsaXNoZXJBc3NlcnRpb25zIiBzdHlsZT0iZG9jdW1lbnQiLz4KKwkJCTxpbnB1dD4KKwkJCQk8c29hcDpib2R5IHBhcnRzPSJib2R5IiB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0idXJuOnVkZGktb3JnOmFwaV92MiIvPgorCQkJPC9pbnB1dD4KKwkJCTxvdXRwdXQ+CisJCQkJPHNvYXA6Ym9keSBwYXJ0cz0iYm9keSIgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9InVybjp1ZGRpLW9yZzphcGlfdjIiLz4KKwkJCTwvb3V0cHV0PgorCQkJPGZhdWx0IG5hbWU9ImVycm9yIj4KKwkJCQk8c29hcDpmYXVsdCBuYW1lPSJlcnJvciIgdXNlPSJsaXRlcmFsIi8+CisJCQk8L2ZhdWx0PgorCQk8L29wZXJhdGlvbj4KKwkJPG9wZXJhdGlvbiBuYW1lPSJkZWxldGVfYmluZGluZyI+CisJCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZGVsZXRlX2JpbmRpbmciIHN0eWxlPSJkb2N1bWVudCIvPgorCQkJPGlucHV0PgorCQkJCTxzb2FwOmJvZHkgcGFydHM9ImJvZHkiIHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJ1cm46dWRkaS1vcmc6YXBpX3YyIi8+CisJCQk8L2lucHV0PgorCQkJPG91dHB1dD4KKwkJCQk8c29hcDpib2R5IHBhcnRzPSJib2R5IiB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0idXJuOnVkZGktb3JnOmFwaV92MiIvPgorCQkJPC9vdXRwdXQ+CisJCQk8ZmF1bHQgbmFtZT0iZXJyb3IiPgorCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImVycm9yIiB1c2U9ImxpdGVyYWwiLz4KKwkJCTwvZmF1bHQ+CisJCTwvb3BlcmF0aW9uPgorCQk8b3BlcmF0aW9uIG5hbWU9ImRlbGV0ZV9idXNpbmVzcyI+CisJCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZGVsZXRlX2J1c2luZXNzIiBzdHlsZT0iZG9jdW1lbnQiLz4KKwkJCTxpbnB1dD4KKwkJCQk8c29hcDpib2R5IHBhcnRzPSJib2R5IiB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0idXJuOnVkZGktb3JnOmFwaV92MiIvPgorCQkJPC9pbnB1dD4KKwkJCTxvdXRwdXQ+CisJCQkJPHNvYXA6Ym9keSBwYXJ0cz0iYm9keSIgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9InVybjp1ZGRpLW9yZzphcGlfdjIiLz4KKwkJCTwvb3V0cHV0PgorCQkJPGZhdWx0IG5hbWU9ImVycm9yIj4KKwkJCQk8c29hcDpmYXVsdCBuYW1lPSJlcnJvciIgdXNlPSJsaXRlcmFsIi8+CisJCQk8L2ZhdWx0PgorCQk8L29wZXJhdGlvbj4KKwkJPG9wZXJhdGlvbiBuYW1lPSJkZWxldGVfcHVibGlzaGVyQXNzZXJ0aW9ucyI+CisJCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZGVsZXRlX3B1Ymxpc2hlckFzc2VydGlvbnMiIHN0eWxlPSJkb2N1bWVudCIvPgorCQkJPGlucHV0PgorCQkJCTxzb2FwOmJvZHkgcGFydHM9ImJvZHkiIHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJ1cm46dWRkaS1vcmc6YXBpX3YyIi8+CisJCQk8L2lucHV0PgorCQkJPG91dHB1dD4KKwkJCQk8c29hcDpib2R5IHBhcnRzPSJib2R5IiB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0idXJuOnVkZGktb3JnOmFwaV92MiIvPgorCQkJPC9vdXRwdXQ+CisJCQk8ZmF1bHQgbmFtZT0iZXJyb3IiPgorCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImVycm9yIiB1c2U9ImxpdGVyYWwiLz4KKwkJCTwvZmF1bHQ+CisJCTwvb3BlcmF0aW9uPgorCQk8b3BlcmF0aW9uIG5hbWU9ImRlbGV0ZV9zZXJ2aWNlIj4KKwkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJkZWxldGVfc2VydmljZSIgc3R5bGU9ImRvY3VtZW50Ii8+CisJCQk8aW5wdXQ+CisJCQkJPHNvYXA6Ym9keSBwYXJ0cz0iYm9keSIgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9InVybjp1ZGRpLW9yZzphcGlfdjIiLz4KKwkJCTwvaW5wdXQ+CisJCQk8b3V0cHV0PgorCQkJCTxzb2FwOmJvZHkgcGFydHM9ImJvZHkiIHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJ1cm46dWRkaS1vcmc6YXBpX3YyIi8+CisJCQk8L291dHB1dD4KKwkJCTxmYXVsdCBuYW1lPSJlcnJvciI+CisJCQkJPHNvYXA6ZmF1bHQgbmFtZT0iZXJyb3IiIHVzZT0ibGl0ZXJhbCIvPgorCQkJPC9mYXVsdD4KKwkJPC9vcGVyYXRpb24+CisJCTxvcGVyYXRpb24gbmFtZT0iZGVsZXRlX3RNb2RlbCI+CisJCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZGVsZXRlX3RNb2RlbCIgc3R5bGU9ImRvY3VtZW50Ii8+CisJCQk8aW5wdXQ+CisJCQkJPHNvYXA6Ym9keSBwYXJ0cz0iYm9keSIgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9InVybjp1ZGRpLW9yZzphcGlfdjIiLz4KKwkJCTwvaW5wdXQ+CisJCQk8b3V0cHV0PgorCQkJCTxzb2FwOmJvZHkgcGFydHM9ImJvZHkiIHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJ1cm46dWRkaS1vcmc6YXBpX3YyIi8+CisJCQk8L291dHB1dD4KKwkJCTxmYXVsdCBuYW1lPSJlcnJvciI+CisJCQkJPHNvYXA6ZmF1bHQgbmFtZT0iZXJyb3IiIHVzZT0ibGl0ZXJhbCIvPgorCQkJPC9mYXVsdD4KKwkJPC9vcGVyYXRpb24+CisJCTxvcGVyYXRpb24gbmFtZT0iZGlzY2FyZF9hdXRoVG9rZW4iPgorCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImRpc2NhcmRfYXV0aFRva2VuIiBzdHlsZT0iZG9jdW1lbnQiLz4KKwkJCTxpbnB1dD4KKwkJCQk8c29hcDpib2R5IHBhcnRzPSJib2R5IiB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0idXJuOnVkZGktb3JnOmFwaV92MiIvPgorCQkJPC9pbnB1dD4KKwkJCTxvdXRwdXQ+CisJCQkJPHNvYXA6Ym9keSBwYXJ0cz0iYm9keSIgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9InVybjp1ZGRpLW9yZzphcGlfdjIiLz4KKwkJCTwvb3V0cHV0PgorCQkJPGZhdWx0IG5hbWU9ImVycm9yIj4KKwkJCQk8c29hcDpmYXVsdCBuYW1lPSJlcnJvciIgdXNlPSJsaXRlcmFsIi8+CisJCQk8L2ZhdWx0PgorCQk8L29wZXJhdGlvbj4KKwkJPG9wZXJhdGlvbiBuYW1lPSJnZXRfYXNzZXJ0aW9uU3RhdHVzUmVwb3J0Ij4KKwkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJnZXRfYXNzZXJ0aW9uU3RhdHVzUmVwb3J0IiBzdHlsZT0iZG9jdW1lbnQiLz4KKwkJCTxpbnB1dD4KKwkJCQk8c29hcDpib2R5IHBhcnRzPSJib2R5IiB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0idXJuOnVkZGktb3JnOmFwaV92MiIvPgorCQkJPC9pbnB1dD4KKwkJCTxvdXRwdXQ+CisJCQkJPHNvYXA6Ym9keSBwYXJ0cz0iYm9keSIgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9InVybjp1ZGRpLW9yZzphcGlfdjIiLz4KKwkJCTwvb3V0cHV0PgorCQkJPGZhdWx0IG5hbWU9ImVycm9yIj4KKwkJCQk8c29hcDpmYXVsdCBuYW1lPSJlcnJvciIgdXNlPSJsaXRlcmFsIi8+CisJCQk8L2ZhdWx0PgorCQk8L29wZXJhdGlvbj4KKwkJPG9wZXJhdGlvbiBuYW1lPSJnZXRfYXV0aFRva2VuIj4KKwkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJnZXRfYXV0aFRva2VuIiBzdHlsZT0iZG9jdW1lbnQiLz4KKwkJCTxpbnB1dD4KKwkJCQk8c29hcDpib2R5IHBhcnRzPSJib2R5IiB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0idXJuOnVkZGktb3JnOmFwaV92MiIvPgorCQkJPC9pbnB1dD4KKwkJCTxvdXRwdXQ+CisJCQkJPHNvYXA6Ym9keSBwYXJ0cz0iYm9keSIgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9InVybjp1ZGRpLW9yZzphcGlfdjIiLz4KKwkJCTwvb3V0cHV0PgorCQkJPGZhdWx0IG5hbWU9ImVycm9yIj4KKwkJCQk8c29hcDpmYXVsdCBuYW1lPSJlcnJvciIgdXNlPSJsaXRlcmFsIi8+CisJCQk8L2ZhdWx0PgorCQk8L29wZXJhdGlvbj4KKwkJPG9wZXJhdGlvbiBuYW1lPSJnZXRfcHVibGlzaGVyQXNzZXJ0aW9ucyI+CisJCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZ2V0X3B1Ymxpc2hlckFzc2VydGlvbnMiIHN0eWxlPSJkb2N1bWVudCIvPgorCQkJPGlucHV0PgorCQkJCTxzb2FwOmJvZHkgcGFydHM9ImJvZHkiIHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJ1cm46dWRkaS1vcmc6YXBpX3YyIi8+CisJCQk8L2lucHV0PgorCQkJPG91dHB1dD4KKwkJCQk8c29hcDpib2R5IHBhcnRzPSJib2R5IiB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0idXJuOnVkZGktb3JnOmFwaV92MiIvPgorCQkJPC9vdXRwdXQ+CisJCQk8ZmF1bHQgbmFtZT0iZXJyb3IiPgorCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImVycm9yIiB1c2U9ImxpdGVyYWwiLz4KKwkJCTwvZmF1bHQ+CisJCTwvb3BlcmF0aW9uPgorCQk8b3BlcmF0aW9uIG5hbWU9ImdldF9yZWdpc3RlcmVkSW5mbyI+CisJCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZ2V0X3JlZ2lzdGVyZWRJbmZvIiBzdHlsZT0iZG9jdW1lbnQiLz4KKwkJCTxpbnB1dD4KKwkJCQk8c29hcDpib2R5IHBhcnRzPSJib2R5IiB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0idXJuOnVkZGktb3JnOmFwaV92MiIvPgorCQkJPC9pbnB1dD4KKwkJCTxvdXRwdXQ+CisJCQkJPHNvYXA6Ym9keSBwYXJ0cz0iYm9keSIgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9InVybjp1ZGRpLW9yZzphcGlfdjIiLz4KKwkJCTwvb3V0cHV0PgorCQkJPGZhdWx0IG5hbWU9ImVycm9yIj4KKwkJCQk8c29hcDpmYXVsdCBuYW1lPSJlcnJvciIgdXNlPSJsaXRlcmFsIi8+CisJCQk8L2ZhdWx0PgorCQk8L29wZXJhdGlvbj4KKwkJPG9wZXJhdGlvbiBuYW1lPSJzYXZlX2JpbmRpbmciPgorCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InNhdmVfYmluZGluZyIgc3R5bGU9ImRvY3VtZW50Ii8+CisJCQk8aW5wdXQ+CisJCQkJPHNvYXA6Ym9keSBwYXJ0cz0iYm9keSIgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9InVybjp1ZGRpLW9yZzphcGlfdjIiLz4KKwkJCTwvaW5wdXQ+CisJCQk8b3V0cHV0PgorCQkJCTxzb2FwOmJvZHkgcGFydHM9ImJvZHkiIHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJ1cm46dWRkaS1vcmc6YXBpX3YyIi8+CisJCQk8L291dHB1dD4KKwkJCTxmYXVsdCBuYW1lPSJlcnJvciI+CisJCQkJPHNvYXA6ZmF1bHQgbmFtZT0iZXJyb3IiIHVzZT0ibGl0ZXJhbCIvPgorCQkJPC9mYXVsdD4KKwkJPC9vcGVyYXRpb24+CisJCTxvcGVyYXRpb24gbmFtZT0ic2F2ZV9idXNpbmVzcyI+CisJCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0ic2F2ZV9idXNpbmVzcyIgc3R5bGU9ImRvY3VtZW50Ii8+CisJCQk8aW5wdXQ+CisJCQkJPHNvYXA6Ym9keSBwYXJ0cz0iYm9keSIgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9InVybjp1ZGRpLW9yZzphcGlfdjIiLz4KKwkJCTwvaW5wdXQ+CisJCQk8b3V0cHV0PgorCQkJCTxzb2FwOmJvZHkgcGFydHM9ImJvZHkiIHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJ1cm46dWRkaS1vcmc6YXBpX3YyIi8+CisJCQk8L291dHB1dD4KKwkJCTxmYXVsdCBuYW1lPSJlcnJvciI+CisJCQkJPHNvYXA6ZmF1bHQgbmFtZT0iZXJyb3IiIHVzZT0ibGl0ZXJhbCIvPgorCQkJPC9mYXVsdD4KKwkJPC9vcGVyYXRpb24+CisJCTxvcGVyYXRpb24gbmFtZT0ic2F2ZV9zZXJ2aWNlIj4KKwkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJzYXZlX3NlcnZpY2UiIHN0eWxlPSJkb2N1bWVudCIvPgorCQkJPGlucHV0PgorCQkJCTxzb2FwOmJvZHkgcGFydHM9ImJvZHkiIHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJ1cm46dWRkaS1vcmc6YXBpX3YyIi8+CisJCQk8L2lucHV0PgorCQkJPG91dHB1dD4KKwkJCQk8c29hcDpib2R5IHBhcnRzPSJib2R5IiB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0idXJuOnVkZGktb3JnOmFwaV92MiIvPgorCQkJPC9vdXRwdXQ+CisJCQk8ZmF1bHQgbmFtZT0iZXJyb3IiPgorCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImVycm9yIiB1c2U9ImxpdGVyYWwiLz4KKwkJCTwvZmF1bHQ+CisJCTwvb3BlcmF0aW9uPgorCQk8b3BlcmF0aW9uIG5hbWU9InNhdmVfdE1vZGVsIj4KKwkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJzYXZlX3RNb2RlbCIgc3R5bGU9ImRvY3VtZW50Ii8+CisJCQk8aW5wdXQ+CisJCQkJPHNvYXA6Ym9keSBwYXJ0cz0iYm9keSIgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9InVybjp1ZGRpLW9yZzphcGlfdjIiLz4KKwkJCTwvaW5wdXQ+CisJCQk8b3V0cHV0PgorCQkJCTxzb2FwOmJvZHkgcGFydHM9ImJvZHkiIHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJ1cm46dWRkaS1vcmc6YXBpX3YyIi8+CisJCQk8L291dHB1dD4KKwkJCTxmYXVsdCBuYW1lPSJlcnJvciI+CisJCQkJPHNvYXA6ZmF1bHQgbmFtZT0iZXJyb3IiIHVzZT0ibGl0ZXJhbCIvPgorCQkJPC9mYXVsdD4KKwkJPC9vcGVyYXRpb24+CisJCTxvcGVyYXRpb24gbmFtZT0ic2V0X3B1Ymxpc2hlckFzc2VydGlvbnMiPgorCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InNldF9wdWJsaXNoZXJBc3NlcnRpb25zIiBzdHlsZT0iZG9jdW1lbnQiLz4KKwkJCTxpbnB1dD4KKwkJCQk8c29hcDpib2R5IHBhcnRzPSJib2R5IiB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0idXJuOnVkZGktb3JnOmFwaV92MiIvPgorCQkJPC9pbnB1dD4KKwkJCTxvdXRwdXQ+CisJCQkJPHNvYXA6Ym9keSBwYXJ0cz0iYm9keSIgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9InVybjp1ZGRpLW9yZzphcGlfdjIiLz4KKwkJCTwvb3V0cHV0PgorCQkJPGZhdWx0IG5hbWU9ImVycm9yIj4KKwkJCQk8c29hcDpmYXVsdCBuYW1lPSJlcnJvciIgdXNlPSJsaXRlcmFsIi8+CisJCQk8L2ZhdWx0PgorCQk8L29wZXJhdGlvbj4KKwk8L2JpbmRpbmc+Cis8L2RlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdWRkaTIvdWRkaTItdHlwZW1hcC5kYXQgYi91ZGRpMi91ZGRpMi10eXBlbWFwLmRhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjA0N2MwCi0tLSAvZGV2L251bGwKKysrIGIvdWRkaTIvdWRkaTItdHlwZW1hcC5kYXQKQEAgLTAsMCArMSwxOTU2IEBACisjCXVkZGkybWFwLmRhdAorIworIwlnU09BUCB0eXBlIG1hcCBiaW5kaW5ncyBmb3IgVURESSB2MiB0byBydW4gdGhlIGdTT0FQIFdTREwgdG9vbCAnd3NkbDJoJworIworIwlJbmNsdWRlZCBmdWxsIGRvY3VtZW50YXRpb24gYW5kIGV4YW1wbGVzIG9mIHRoZSBnU09BUCBVRERJIHYyIEFQSQorIworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCisjQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyB0d28gbGljZW5zZXM6CisjR1BMIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjR1BMIGxpY2Vuc2UuCisjCisjVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKKyN0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorI0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisjdmVyc2lvbi4KKyMKKyNUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCisjV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorI1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworI1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyN0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCisjUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorIworI0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorI2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1sKKy8qKiBAbWFpbnBhZ2UgZ1NPQVAgVURESSB2MgorCitVbml2ZXJzYWwgRGVzY3JpcHRpb24sIERpc2NvdmVyeSBhbmQgSW50ZWdyYXRpb24sIG9yIFVEREksIGlzIHRoZSBuYW1lIG9mIGEKK2dyb3VwIG9mIHdlYi1iYXNlZCByZWdpc3RyaWVzIHRoYXQgZXhwb3NlIGluZm9ybWF0aW9uIGFib3V0IGEgYnVzaW5lc3Mgb3Igb3RoZXIKK2VudGl0eSBhbmQgaXRzIHRlY2huaWNhbCBpbnRlcmZhY2VzLgorCitTZWUgdGhlIFVEREkgdjIgc3BlY2lmaWNhdGlvbiBAdXJsIGh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bQorZm9yIG1vcmUgZGV0YWlscy4KKworQHNlY3Rpb24gVURESTJfQ0xBU1NFUyBDbGFzc2VzCisKK1NlZSBSZWxhdGVkIFBhZ2VzIGZvciBleGFtcGxlcy4KKworVURESSBJbnF1aXJlIGNsYXNzZXMKKworLSBAcmVmIHVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmcKKy0gQHJlZiB1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzcworLSBAcmVmIHVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzCistIEByZWYgdWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZQorLSBAcmVmIHVkZGkyX19maW5kX1VTQ09SRXRNb2RlbAorLSBAcmVmIHVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbAorLSBAcmVmIHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwKKy0gQHJlZiB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0CistIEByZWYgdWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsCistIEByZWYgdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwKKworVURESSBQdWJsaXNoIGNsYXNzZXMKKworLSBAcmVmIHVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucworLSBAcmVmIHVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZworLSBAcmVmIHVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3MKKy0gQHJlZiB1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UKKy0gQHJlZiB1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbAorLSBAcmVmIHVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucworLSBAcmVmIHVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbgorLSBAcmVmIHVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0CistIEByZWYgdWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW4KKy0gQHJlZiB1ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMKKy0gQHJlZiB1ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvCistIEByZWYgdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZworLSBAcmVmIHVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzCistIEByZWYgdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZQorLSBAcmVmIHVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbAorLSBAcmVmIHVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucworCitAc2VjdGlvbiBVRERJMl9CSU5ESU5HUyBCaW5kaW5nIFJlZmVyZW5jZQorCistIEByZWYgSW5xdWlyZVNvYXAKKy0gQHJlZiBQdWJsaXNoU29hcAorCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOmZpbmRfYmluZGluZworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorQGNsYXNzIHVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmcKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBsb2NhdGUgYmluZGluZ3MgdGhhdCBtZWV0IHRoZSBzcGVjaWZpZWQgcmVxdWlyZW1lbnRzLgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzEyCisqLworCisvKioKK0BmbiB1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nOjp1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmaW5kX1VTQ09SRWJpbmRpbmcgY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nOjp1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0TW9kZWxLZXkpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIHRNb2RlbEtleSBzdHJpbmcKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmluZF9VU0NPUkViaW5kaW5nIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQgdE1vZGVsCitrZXkuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nOjp1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3RvcjxjaGFyKj4gdE1vZGVsS2V5cykKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gdE1vZGVsS2V5cyBjb2xsZWN0aW9uIG9mIHRNb2RlbCBrZXkgc3RyaW5ncworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmaW5kX1VTQ09SRWJpbmRpbmcgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZCB0TW9kZWwKK2tleXMuCisqLworCisvKioKK0BmbiB1ZGRpMl9fYmluZGluZ0RldGFpbCogdWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZzo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCkKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19iaW5kaW5nRGV0YWlsIG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2ZXIgdG8gZmluZCBiaW5kaW5nIGRldGFpbHMuCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOmZpbmRfYnVzaW5lc3MKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzcworQGJyaWVmCisKK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIGxvY2F0ZSBidXNpbmVzc2VzIHRoYXQgbWVldCBzcGVjaWZpYyByZXF1aXJlbWVudHMuIFdoZW4KK3RoZSBzZW5kIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBpbnN0YW5jZSByZXR1cm5zIGEgdWRkaTJfX2J1c2luZXNzTGlzdCBvYmplY3QKK3RoYXQgY29udGFpbnMgYSBsaXN0IG9mIGJ1c2luZXNzIHRoYXQgbWF0Y2hlZCB0aGUgc2VhcmNoIGNyaXRlcmlhLgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzEzCisKK1NlZSBhbHNvIEByZWYgZXhhbXBsZTIuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzczo6dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZpbmRfVVNDT1JFYnVzaW5lc3MgY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzczo6dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZpbmRfVVNDT1JFYnVzaW5lc3MgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZCBuYW1lCitvZiB0aGUgcmVxdWVzdGVkIGJ1c2luZXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M6OnVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UqPiBrZXllZFJlZmVyZW5jZXMpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZpbmRfVVNDT1JFYnVzaW5lc3MgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAorY2F0ZWdvcnkgcmVmZXJlbmNlcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzOjp1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8Y2hhcio+IHRNb2RlbEtleXMpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZpbmRfVVNDT1JFYnVzaW5lc3MgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZCB0TW9kZWwKK2tleXMuCisqLworCisvKioKK0BmbiB1ZGRpMl9fYnVzaW5lc3NMaXN0ICp1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzczo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCkKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19idXNpbmVzc0xpc3Qgb2JqZWN0IG9yIE5VTEwgb24gZXJyb3IKKworU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZlciB0byBmaW5kIGEgbGlzdCBvZiBidXNpbmVzc2VzLgorCitTZWUgYWxzbyBAcmVmIGV4YW1wbGUyLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpmaW5kX3JlbGF0ZWRCdXNpbmVzc2VzCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCitAY2xhc3MgdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBsb2NhdGUgYnVzaW5lc3NlcyB0aGF0IGFyZSByZWxhdGVkIHRvIGEgc3BlY2lmaWMKK2J1c2luZXNzLiBXaGVuIHRoZSBzZW5kIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBpbnN0YW5jZSByZXR1cm5zIGEKK3VkZGkyX19yZWxhdGVkQnVzaW5lc3NMaXN0IG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZiBidXNpbmVzcyB0aGF0IG1hdGNoZWQKK3RoZSByZWxhdGlvbnNoaXAgc2V0LgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzE0CisqLworCisvKioKK0BmbiB1ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3Nlczo6dWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXM6OnVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpidXNpbmVzc0tleSkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gYnVzaW5lc3NLZXkgc3RyaW5nCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK2J1c2luZXNzIGtleS4KKyovCisKKy8qKgorQGZuIHVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3QgKnVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50KQorQGJyaWVmCitAcGFyYW1baW5dIGVuZHBvaW50IFVSTCBvZiB0aGUgVURESSBzZXJ2ZXIKK0ByZXR1cm4gQSBwb2ludGVyIHRvIGEgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0xpc3Qgb2JqZWN0IG9yIE5VTEwgb24gZXJyb3IKKworU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZlciB0byBmaW5kIGEgbGlzdCBvZiByZWxhdGVkIGJ1c2luZXNzZXMuCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOmZpbmRfc2VydmljZQorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorQGNsYXNzIHVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2UKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBsb2NhdGUgc2VydmljZXMgdGhhdCBtZWV0IHRoZSBzcGVjaWZpZWQgcmVxdWlyZW1lbnRzLgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzE1CisKK1NlZSBhbHNvIEByZWYgZXhhbXBsZTEuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlOjp1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmaW5kX1VTQ09SRXNlcnZpY2UgY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlOjp1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBuYW1lIG9mIHRoZSBzZXJ2aWNlCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZpbmRfVVNDT1JFc2VydmljZSBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkIG5hbWUuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlOjp1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UqPiBrZXllZFJlZmVyZW5jZXMpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIGtleWVkUmVmZXJlbmNlcyBjb2xsZWN0aW9uIG9mIGNhdGVnb3J5IGtleXMKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmluZF9VU0NPUkVzZXJ2aWNlIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK2NhdGVnb3J5IGtleXMuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlOjp1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3RvcjxjaGFyKj4gdE1vZGVsS2V5cykKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gdE1vZGVsS2V5cyBjb2xsZWN0aW9uIG9mIHRNb2RlbCBrZXkgc3RyaW5ncworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmaW5kX1VTQ09SRXNlcnZpY2UgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZCB0TW9kZWwKK2tleXMuCisqLworCisvKioKK0BmbiB1ZGRpMl9fc2VydmljZUxpc3QqIHVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2U6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQpCitAYnJpZWYKK0BwYXJhbVtpbl0gZW5kcG9pbnQgVVJMIG9mIHRoZSBVRERJIHNlcnZlcgorQHJldHVybiBBIHBvaW50ZXIgdG8gYSB1ZGRpMl9fc2VydmljZUxpc3Qgb2JqZWN0IG9yIE5VTEwgb24gZXJyb3IKKworU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZlciB0byBmaW5kIGEgbGlzdCBvZiBzZXJ2aWNlcy4KKworU2VlIGFsc28gQHJlZiBleGFtcGxlMS4KKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6ZmluZF90TW9kZWwKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWwKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBsb2NhdGUgYSBsaXN0IG9mIHRNb2RlbCBlbnRyaWVzIHRoYXQgbWF0Y2ggYSBzZXQgb2YKK3NwZWNpZmljIGNyaXRlcmlhLiBUaGUgcmVzdWx0IG9mIGEgc2VhcmNoIGlzIGEgdWRkaTJfX3RNb2RlbExpc3Qgb2JqZWN0IHRoYXQKK2NvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHJlZ2lzdGVyZWQgdE1vZGVsIGRhdGEgdGhhdCBtYXRjaGVzIHRoZSBjcml0ZXJpYS4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzcxNgorKi8KKworLyoqCitAZm4gdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsOjp1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZpbmRfVVNDT1JFdE1vZGVsIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsOjp1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKm5hbWUpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIG5hbWUgb2YgdGhlIHRNb2RlbAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmaW5kX1VTQ09SRXRNb2RlbCBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkIHRNb2RlbAorbmFtZS4KKyovCisKKy8qKgorQGZuIHVkZGkyX19maW5kX1VTQ09SRXRNb2RlbDo6dWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UqPiBrZXllZFJlZmVyZW5jZXMpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIGtleWVkUmVmZXJlbmNlcyBjb2xsZWN0aW9uIG9mIGNhdGVnb3J5IGtleXMKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmluZF9VU0NPUkV0TW9kZWwgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZCBjYXRlZ29yeQora2V5cy4KKyovCisKKy8qKgorQGZuIHVkZGkyX190TW9kZWxMaXN0KiB1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWw6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQpCitAYnJpZWYKK0BwYXJhbVtpbl0gZW5kcG9pbnQgVVJMIG9mIHRoZSBVRERJIHNlcnZlcgorQHJldHVybiBBIHBvaW50ZXIgdG8gYSB1ZGRpMl9fdE1vZGVsTGlzdCBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcgorCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmVyIHRvIGZpbmQgYSB0TW9kZWxMaXN0LgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpnZXRfYmluZGluZ0RldGFpbAorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorQGNsYXNzIHVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbAorQGJyaWVmCisKK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIGdldCBiaW5kaW5nIGRldGFpbHMgZnJvbSBhIFVEREkgc2VydmVyLgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzE3CisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWw6OnVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwgY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWw6OnVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqYmluZGluZ0tleSkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gYmluZGluZ0tleSBzdHJpbmcKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAorYmluZGluZyBrZXkuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWw6OnVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8Y2hhcio+IGJpbmRpbmdLZXlzKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBiaW5kaW5nS2V5cyBjb2xsZWN0aW9uIG9mIGtleSBzdHJpbmdzCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdldF9VU0NPUkViaW5kaW5nRGV0YWlsIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK2NvbGxlY3Rpb24gb2YgYmluZGluZyBrZXlzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2JpbmRpbmdEZXRhaWwqIHVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbDo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCkKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19iaW5kaW5nRGV0YWlsIG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2ZXIgdG8gZ2V0IHRoZSBiaW5kaW5nIGRldGFpbHMuCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOmdldF9idXNpbmVzc0RldGFpbAorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorQGNsYXNzIHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBnZXQgYnVzaW5lc3MgZGV0YWlscyBmcm9tIGEgVURESSBzZXJ2ZXIuCisKK1NlZSBAdXJsIGh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3MTggCisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwgY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpidXNpbmVzc0tleSkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gYnVzaW5lc3NLZXkgc3RyaW5nCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdldF9VU0NPUkVidXNpbmVzc0RldGFpbCBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkCitidXNpbmVzcyBrZXkuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3RvcjxjaGFyKj4gYnVzaW5lc3NLZXlzKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBidXNpbmVzc0tleXMgY29sbGVjdGlvbiBvZiBrZXkgc3RyaW5ncworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAorY29sbGVjdGlvbiBvZiBidXNpbmVzcyBrZXlzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2J1c2luZXNzRGV0YWlsKiB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50KQorQGJyaWVmCitAcGFyYW1baW5dIGVuZHBvaW50IFVSTCBvZiB0aGUgVURESSBzZXJ2ZXIKK0ByZXR1cm4gQSBwb2ludGVyIHRvIGEgdWRkaTJfX2J1c2luZXNzRGV0YWlsIG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2ZXIgdG8gZ2V0IHRoZSBidXNpbmVzcyBkZXRhaWxzLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpnZXRfYnVzaW5lc3NEZXRhaWxFeHQKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0CitAYnJpZWYKKworUmVwcmVzZW50cyBhIHJlcXVlc3QgdG8gZ2V0IGJ1c2luZXNzIGRldGFpbHMgZnJvbSBhIFVEREkgc2VydmVyLgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzE5CisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0Ojp1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0KHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQgY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0Ojp1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpidXNpbmVzc0tleSkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gYnVzaW5lc3NLZXkgc3RyaW5nCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dCBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkCitidXNpbmVzcyBrZXkuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0Ojp1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0KHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3RvcjxjaGFyKj4gYnVzaW5lc3NLZXlzKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBidXNpbmVzc0tleXMgY29sbGVjdGlvbiBvZiBrZXkgc3RyaW5ncworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAorY29sbGVjdGlvbiBvZiBidXNpbmVzcyBrZXlzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0KiB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0OjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50KQorQGJyaWVmCitAcGFyYW1baW5dIGVuZHBvaW50IFVSTCBvZiB0aGUgVURESSBzZXJ2ZXIKK0ByZXR1cm4gQSBwb2ludGVyIHRvIGEgdWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0IG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2ZXIgdG8gZ2V0IHRoZSBidXNpbmVzcyBkZXRhaWxzLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpnZXRfc2VydmljZURldGFpbAorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorQGNsYXNzIHVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbAorQGJyaWVmCisKK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIGdldCBzZXJ2aWNlIGRldGFpbHMgZnJvbSBhIFVEREkgc2VydmVyLgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzIwCisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWw6OnVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwgY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWw6OnVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqc2VydmljZUtleSkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gc2VydmljZUtleSBzdHJpbmcKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAorc2VydmljZSBrZXkuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWw6OnVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8Y2hhcio+IHNlcnZpY2VLZXlzKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBzZXJ2aWNlS2V5cyBjb2xsZWN0aW9uIG9mIGtleSBzdHJpbmdzCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdldF9VU0NPUkVzZXJ2aWNlRGV0YWlsIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK2NvbGxlY3Rpb24gb2Ygc2VydmljZSBrZXlzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX3NlcnZpY2VEZXRhaWwqIHVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbDo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCkKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19zZXJ2aWNlRGV0YWlsIG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2ZXIgdG8gZ2V0IHRoZSBzZXJ2aWNlIGRldGFpbHMuCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOmdldF90TW9kZWxEZXRhaWwKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbAorQGJyaWVmCisKK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIGdldCB0TW9kZWwgZGV0YWlscyBmcm9tIGEgVURESSBzZXJ2ZXIuCisKK1NlZSBAdXJsIGh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3MjEKKyovCisKKy8qKgorQGZuIHVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRXRNb2RlbERldGFpbCBjbGFzcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdE1vZGVsS2V5KQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSB0TW9kZWxLZXkgc3RyaW5nCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdldF9VU0NPUkV0TW9kZWxEZXRhaWwgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAordE1vZGVsIGtleS4KKyovCisKKy8qKgorQGZuIHVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8Y2hhcio+IHRNb2RlbEtleXMpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIHRNb2RlbEtleXMgY29sbGVjdGlvbiBvZiBrZXkgc3RyaW5ncworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFdE1vZGVsRGV0YWlsIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK2NvbGxlY3Rpb24gb2YgdE1vZGVsIGtleXMuCisqLworCisvKioKK0BmbiB1ZGRpMl9fdE1vZGVsRGV0YWlsKiB1ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbDo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCkKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX190TW9kZWxEZXRhaWwgb2JqZWN0IG9yIE5VTEwgb24gZXJyb3IKKworU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZlciB0byBnZXQgdGhlIHRNb2RlbCBkZXRhaWxzLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjphZGRfcHVibGlzaGVyQXNzZXJ0aW9ucworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorQGNsYXNzIHVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucworQGJyaWVmCisKK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIGFkZCBvbmUgb3IgbW9yZSBwdWJsaXNoZXIgYXNzZXJ0aW9ucyB0byB0aGUgYXNzZXJ0aW9uCitjb2xsZWN0aW9uIGZvciBhbiBpbmRpdmlkdWFsIHB1Ymxpc2hlci4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzczMQorKi8KKworLyoqCitAZm4gdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjp1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjp1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAgKnNvYXAsIHN0ZDo6dmVjdG9yPHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24qPiBwdWJsaXNoZXJBc3NlcnRpb25zKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBwdWJsaXNoZXJBc3NlcnRpb25zIGNvbGxlY3Rpb24gb2YgcHVibGlzaGVyIGFzc2VydGlvbnMKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgY2xhc3MgdXNpbmcgdGhlCitzcGVjaWZpZWQgcHVibGlzaGVyIGFzc2VydGlvbnMuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgKnVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pCitAYnJpZWYKK0BwYXJhbVtpbl0gZW5kcG9pbnQgVVJMIG9mIHRoZSBVRERJIHNlcnZlcgorQHBhcmFtW2luXSBhdXRoSW5mbyBhdXRob3JpemF0aW9uIHRva2VuIHByb3ZpZGVkIGJ5IHRoZSBVRERJIHNlcnZlcgorQHJldHVybiBBIHBvaW50ZXIgdG8gYSB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgb2JqZWN0IG9yIE5VTEwgb24gZXJyb3IKKworU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZlciB0byBhZGQgb25lIG9yIG1vcmUgcHVibGlzaGVyIGFzc2VydGlvbnMgdG8gdGhlCithc3NlcnRpb24gY29sbGVjdGlvbiBmb3IgYW4gaW5kaXZpZHVhbCBwdWJsaXNoZXIuCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOmRlbGV0ZV9iaW5kaW5nCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCitAY2xhc3MgdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nCitAYnJpZWYKKworUmVwcmVzZW50cyBhIHJlcXVlc3QgdG8gZGVsZXRlIGEgYmluZGluZyB0aGF0IG1lZXRzIHRoZSBzcGVjaWZpZWQgcmVxdWlyZW1lbnRzLgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzMyCisqLworCisvKioKK0BmbiB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmc6OnVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZgorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWxldGVfVVNDT1JFYmluZGluZyBjbGFzcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZzo6dWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpiaW5kaW5nS2V5KQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBiaW5kaW5nS2V5IGEgYmluZGluZyBrZXkgc3RyaW5nCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGV0ZV9VU0NPUkViaW5kaW5nIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nOjp1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAgKnNvYXAsIHN0ZDo6dmVjdG9yPGNoYXIqPiBiaW5kaW5nS2V5cykKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gYmluZGluZ0tleXMgY29sbGVjdGlvbiBvZiBiaW5kaW5nIGtleXMKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZGVsZXRlX1VTQ09SRWJpbmRpbmcgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAorYmluZGluZyBrZXlzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0ICp1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmc6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKQorQGJyaWVmCitAcGFyYW1baW5dIGVuZHBvaW50IFVSTCBvZiB0aGUgVURESSBzZXJ2ZXIKK0BwYXJhbVtpbl0gYXV0aEluZm8gYXV0aG9yaXphdGlvbiB0b2tlbiBwcm92aWRlZCBieSB0aGUgVURESSBzZXJ2ZXIKK0ByZXR1cm4gQSBwb2ludGVyIHRvIGEgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0IG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2aWNlIHRvIGRlbGV0ZSBhIGJpbmRpbmcgdGhhdCBtZWV0cyB0aGUgc3BlY2lmaWVkCityZXF1aXJlbWVudHMuCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOmRlbGV0ZV9idXNpbmVzcworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorQGNsYXNzIHVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3MKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBkZWxldGUgYSBidXNpbmVzcyB0aGF0IG1lZXRzIHRoZSBzcGVjaWZpZWQgcmVxdWlyZW1lbnRzLgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzMzCisqLworCisvKioKK0BmbiB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzOjp1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWxldGVfVVNDT1JFYnVzaW5lc3MgY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzOjp1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpidXNpbmVzc0tleSkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gYnVzaW5lc3NLZXkgYSBidXNpbmVzcyBrZXkgc3RyaW5nCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGV0ZV9VU0NPUkVidXNpbmVzcyBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkCitidXNpbmVzcyBrZXkuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzOjp1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3RvcjxjaGFyKj4gYnVzaW5lc3NLZXlzKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBidXNpbmVzc0tleXMgY29sbGVjdGlvbiBvZiBidXNpbmVzcyBrZXlzCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGV0ZV9VU0NPUkVidXNpbmVzcyBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkCitidXNpbmVzcyBrZXlzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0ICp1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbykKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcGFyYW1baW5dIGF1dGhJbmZvIGF1dGhvcml6YXRpb24gdG9rZW4gcHJvdmlkZWQgYnkgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcgorCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmljZSB0byBkZWxldGUgYSBidXNpbmVzcyB0aGF0IG1lZXRzIHRoZSBzcGVjaWZpZWQKK3JlcXVpcmVtZW50cy4KKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6ZGVsZXRlX3NlcnZpY2UKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBkZWxldGUgYSBzZXJ2aWNlIHRoYXQgbWVldHMgdGhlIHNwZWNpZmllZCByZXF1aXJlbWVudHMuCisKK1NlZSBAdXJsIGh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3MzUKKyovCisKKy8qKgorQGZuIHVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZTo6dWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWxldGVfVVNDT1JFc2VydmljZSBjbGFzcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZTo6dWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpzZXJ2aWNlS2V5KQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBzZXJ2aWNlS2V5IGEgc2VydmljZSBrZXkgc3RyaW5nCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGV0ZV9VU0NPUkVzZXJ2aWNlIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK3NlcnZpY2Uga2V5LgorKi8KKworLyoqCitAZm4gdWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlOjp1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0ZDo6dmVjdG9yPGNoYXIqPiBzZXJ2aWNlS2V5cykKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gc2VydmljZUtleXMgY29sbGVjdGlvbiBvZiBzZXJ2aWNlIGtleXMKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZGVsZXRlX1VTQ09SRXNlcnZpY2UgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAorc2VydmljZSBrZXlzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0ICp1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2U6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKQorQGJyaWVmCitAcGFyYW1baW5dIGVuZHBvaW50IFVSTCBvZiB0aGUgVURESSBzZXJ2ZXIKK0BwYXJhbVtpbl0gYXV0aEluZm8gYXV0aG9yaXphdGlvbiB0b2tlbiBwcm92aWRlZCBieSB0aGUgVURESSBzZXJ2ZXIKK0ByZXR1cm4gQSBwb2ludGVyIHRvIGEgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0IG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2aWNlIHRvIGRlbGV0ZSBhIHNlcnZpY2UgdGhhdCBtZWV0cyB0aGUgc3BlY2lmaWVkCityZXF1aXJlbWVudHMuCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOmRlbGV0ZV90TW9kZWwKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbAorQGJyaWVmCisKK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIGRlbGV0ZSBhIHRNb2RlbCB0aGF0IG1lZXRzIHRoZSBzcGVjaWZpZWQgcmVxdWlyZW1lbnRzLgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzM2CisqLworCisvKioKK0BmbiB1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbDo6dWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGV0ZV9VU0NPUkV0TW9kZWwgY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbDo6dWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRNb2RlbEtleSkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gdE1vZGVsS2V5IGEgdE1vZGVsIGtleSBzdHJpbmcKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZGVsZXRlX1VTQ09SRXRNb2RlbCBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkCit0TW9kZWwga2V5LgorKi8KKworLyoqCitAZm4gdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWw6OnVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3RvcjxjaGFyKj4gdE1vZGVsS2V5cykKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gdE1vZGVsS2V5cyBjb2xsZWN0aW9uIG9mIHRNb2RlbCBrZXlzCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGV0ZV9VU0NPUkV0TW9kZWwgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAordE1vZGVsIGtleXMuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgKnVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbykKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcGFyYW1baW5dIGF1dGhJbmZvIGF1dGhvcml6YXRpb24gdG9rZW4gcHJvdmlkZWQgYnkgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcgorCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmljZSB0byBkZWxldGUgYSB0TW9kZWwgdGhhdCBtZWV0cyB0aGUgc3BlY2lmaWVkCityZXF1aXJlbWVudHMuCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOmRlbGV0ZV9wdWJsaXNoZXJBc3NlcnRpb25zCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCitAY2xhc3MgdWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zCitAYnJpZWYKKworUmVwcmVzZW50cyBhIHJlcXVlc3QgdG8gZGVsZXRlIHB1Ymxpc2hlciBhc3NlcnRpb25zIG1lZXRpbmcgdGhlIHNwZWNpZmllZAorcmVxdWlyZW1lbnRzLgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzM0CisqLworCisvKioKK0BmbiB1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM6OnVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM6OnVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbio+IHB1Ymxpc2hlckFzc2VydGlvbnMpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIHB1Ymxpc2hlckFzc2VydGlvbnMgYSBjb2xsZWN0aW9uIG9mIHB1Ymxpc2hlciBhc3NlcnRpb25zCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zIGNsYXNzIHVzaW5nIHRoZQorc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2YgcHVibGlzaGVyIGFzc2VydGlvbnMuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgKnVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pCitAYnJpZWYKK0BwYXJhbVtpbl0gZW5kcG9pbnQgVVJMIG9mIHRoZSBVRERJIHNlcnZlcgorQHBhcmFtW2luXSBhdXRoSW5mbyBhdXRob3JpemF0aW9uIHRva2VuIHByb3ZpZGVkIGJ5IHRoZSBVRERJIHNlcnZlcgorQHJldHVybiBBIHBvaW50ZXIgdG8gYSB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgb2JqZWN0IG9yIE5VTEwgb24gZXJyb3IKKworU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZpY2UgdG8gZGVsZXRlIHB1Ymxpc2hlciBhc3NlcnRpb25zIG1lZXRpbmcgdGhlCitzcGVjaWZpZWQgcmVxdWlyZW1lbnRzLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpkaXNjYXJkX2F1dGhUb2tlbgorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorQGNsYXNzIHVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbgorQGJyaWVmCisKK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIGRpc2NhcmQgYW4gYXV0aG9yaXphdGlvbiB0b2tlbiBvYnRhaW5lZCB3aXRoIHRoZQorZ2V0X1VTQ09SRWF1dGhUb2tlbiBjbGFzcy4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzczNworKi8KKworLyoqCitAZm4gdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuOjp1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4oc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGV0ZV9VU0NPUkVhdXRoVG9rZW4gY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW46OnVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqYXV0aEluZm8pCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIGF1dGhJbmZvIGF1dGhvcml6YXRpb24gdG9rZW4gcHJvdmlkZWQgYnkgdGhlIFVEREkgc2VydmVyCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGV0ZV9VU0NPUkVhdXRoVG9rZW4gY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAorYXV0aGVudGljYXRpb24gdG9rZW4gc3RyaW5nLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0ICp1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW46OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQpCitAYnJpZWYKK0BwYXJhbVtpbl0gZW5kcG9pbnQgVVJMIG9mIHRoZSBVRERJIHNlcnZlcgorQHJldHVybiBBIHBvaW50ZXIgdG8gYSB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgb2JqZWN0IG9yIE5VTEwgb24gZXJyb3IKKworU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZpY2UgdG8gZGlzY2FyZCBhbiBhdXRoZW50aWNhdGlvbiB0b2tlbi4KKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6Z2V0X2Fzc2VydGlvblN0YXR1c1JlcG9ydAorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorQGNsYXNzIHVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0CitAYnJpZWYKKworUHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gZGV0ZXJtaW5lIHRoZSBzdGF0dXMgb2YgY3VycmVudCBhbmQgb3V0c3RhbmRpbmcKK3B1Ymxpc2hlciBhc3NlcnRpb25zLiBUaGUgcmVzdWx0cyBjYW4gYmUgcmVzdHJpY3RlZCBieSBzZXR0aW5nIHRoZQorY29tcGxldGlvblN0YXR1cyBwcm9wZXJ0eS4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzczOAorKi8KKworLyoqCitAZm4gdWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQ6OnVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0IGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQ6OnVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpjb21wbGV0aW9uU3RhdHVzKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBjb21wbGV0aW9uU3RhdHVzIGNvbXBsZXRpb24gc3RhdHVzIHN0cmluZworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0IGNsYXNzIHVzaW5nIHRoZQorc3BlY2lmaWVkIGNvbXBsZXRpb24gc3RhdHVzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydCAqdWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQ6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKQorQGJyaWVmCitAcGFyYW1baW5dIGVuZHBvaW50IFVSTCBvZiB0aGUgVURESSBzZXJ2ZXIKK0BwYXJhbVtpbl0gYXV0aEluZm8gYXV0aG9yaXphdGlvbiB0b2tlbiBwcm92aWRlZCBieSB0aGUgVURESSBzZXJ2ZXIKK0ByZXR1cm4gQSBwb2ludGVyIHRvIGEgdWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydCBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcgorCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmljZSB0byBnZXQgdGhlIHN0YXR1cyBvZiBjdXJyZW50IGFuZCBvdXRzdGFuZGluZworcHVibGlzaGVyIGFzc2VydGlvbnMuCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOmdldF9hdXRoVG9rZW4KKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbgorQGJyaWVmCisKK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIG9idGFpbiBhbiBhdXRob3JpemF0aW9uIHRva2VuLCB3aGljaCBpcyByZXByZXNlbnRlZCBieQordGhlIHVkZGkyX19hdXRoVG9rZW4gY2xhc3MuCisKK1NlZSBAdXJsIGh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3MzkKKyovCisKKy8qKgorQGZuIHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuOjp1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRWF1dGhUb2tlbiBjbGFzcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuOjp1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdXNlcmlkLCBjb25zdCBjaGFyICpwYXNzd2QpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIHVzZXJpZCB0aGUgdXNlciBJRCBzdHJpbmcKK0BwYXJhbVtpbl0gcGFzc3dkIHRoZSBwYXNzd29yZCBzdHJpbmcKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRWF1dGhUb2tlbiBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkIHVzZXIKK0lEIGFuZCBwYXNzd29yZC4KKyovCisKKy8qKgorQGZuIHVkZGkyX19hdXRoVG9rZW4gKnVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50KQorQGJyaWVmCitAcGFyYW1baW5dIGVuZHBvaW50IFVSTCBvZiB0aGUgVURESSBzZXJ2ZXIKK0ByZXR1cm4gQSBwb2ludGVyIHRvIGEgdWRkaTJfX2F1dGhUb2tlbiBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcgorCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmljZSB0byBnZXQgYSBhdXRob3JpemF0aW9uIHRva2VuIGdpdmVuIGEgdXNlcgorSUQgYW5kIHBhc3N3b3JkLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpnZXRfcHVibGlzaGVyQXNzZXJ0aW9ucworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorQGNsYXNzIHVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucworQGJyaWVmCisKK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIG9idGFpbiB0aGUgZnVsbCBzZXQgb2YgcHVibGlzaGVyIGFzc2VydGlvbnMgdGhhdCBhcmUKK2Fzc29jaWF0ZWQgd2l0aCBhbiBpbmRpdmlkdWFsIHB1Ymxpc2hlci4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzc0MAorKi8KKworLyoqCitAZm4gdWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjp1ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdldF9VU0NPUkVwdWJsaXNoZXJBc3NldGlvbnMgY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9ucyAqdWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbykKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcGFyYW1baW5dIGF1dGhJbmZvIGF1dGhvcml6YXRpb24gdG9rZW4gcHJvdmlkZWQgYnkgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zIG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2aWNlIHRvIGdldCBwdWJsaXNoZXIgYXNzZXJ0aW9ucy4KKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6Z2V0X3JlZ2lzdGVyZWRJbmZvCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCitAY2xhc3MgdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbworQGJyaWVmCisKK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIGdldCBhbGwgcmVnaXN0ZXJlZCBidXNpbmVzcyBlbnRpdGllcyBhbmQgdE1vZGVscworY29udHJvbGxlZCBieSBhbiBpbmRpdmlkdWFsLgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzQxCisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvOjp1ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8gY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fcmVnaXN0ZXJlZEluZm8gKnVkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm86OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKQorQGJyaWVmCitAcGFyYW1baW5dIGVuZHBvaW50IFVSTCBvZiB0aGUgVURESSBzZXJ2ZXIKK0BwYXJhbVtpbl0gYXV0aEluZm8gYXV0aG9yaXphdGlvbiB0b2tlbiBwcm92aWRlZCBieSB0aGUgVURESSBzZXJ2ZXIKK0ByZXR1cm4gQSBwb2ludGVyIHRvIGEgdWRkaTJfX3JlZ2lzdGVyZWRJbmZvIG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2aWNlIHRvIGdldCBhbGwgcmVnaXN0ZXJlZCBidXNpbmVzcyBlbnRpdGllcyBhbmQKK3RNb2RlbHMgY29udHJvbGxlZCBieSBhbiBpbmRpdmlkdWFsLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpzYXZlX2JpbmRpbmcKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nCitAYnJpZWYKKworUmVwcmVzZW50cyBhIHJlcXVlc3QgdG8gcG9zdCBiaW5kaW5nIGluZm9ybWF0aW9uIG9uIGEgVURESSBzZXJ2ZXIuCisKK1NlZSBAdXJsIGh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3NDIKKyovCisKKy8qKgorQGZuIHVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmc6OnVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNhdmVfVVNDT1JFYmluZGluZyBjbGFzcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmc6OnVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAgKnNvYXAsIHVkZGkyX19iaW5kaW5nVGVtcGxhdGUgJmJpbmRpbmdUZW1wbGF0ZSkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gYmluZGluZ1RlbXBsYXRlIGJpbmRpbmcgdGVtcGxhdGUKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc2F2ZV9VU0NPUkViaW5kaW5nIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQgYmluZGluZwordGVtcGxhdGUuCisqLworCisvKioKK0BmbiB1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nOjp1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYmluZGluZ1RlbXBsYXRlKj4gYmluZGluZ1RlbXBsYXRlcykKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gYmluZGluZ1RlbXBsYXRlcyBjb2xsZWN0aW9uIG9mIGJpbmRpbmcgdGVtcGxhdGVzCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNhdmVfVVNDT1JFYmluZGluZyBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkIGJpbmRpbmcKK3RlbXBsYXRlcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19iaW5kaW5nRGV0YWlsICp1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbykKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcGFyYW1baW5dIGF1dGhJbmZvIGF1dGhvcml6YXRpb24gdG9rZW4gcHJvdmlkZWQgYnkgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19iaW5kaW5nRGV0YWlsIG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2ZXIgdG8gcG9zdCBiaW5kaW5nIGluZm9ybWF0aW9uIG9uIHRoZSBzZXJ2ZXIuCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOnNhdmVfYnVzaW5lc3MKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcworQGJyaWVmCisKK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIHBvc3QgYnVzaW5lc3MgaW5mb3JtYXRpb24gb24gYSBVRERJIHNlcnZlci4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzc0MworKi8KKworLyoqCitAZm4gdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M6OnVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzYXZlX1VTQ09SRWJ1c2luZXNzIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M6OnVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwICpzb2FwLCB1ZGRpMl9fYnVzaW5lc3NFbnRpdHkgJmJ1c2luZXNzRW50aXR5KQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBidXNpbmVzc0VudGl0eSBidXNpbmVzcyBlbnRpdHkKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc2F2ZV9VU0NPUkVidXNpbmVzcyBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkCitidXNpbmVzcyBlbnRpdHkuCisqLworCisvKioKK0BmbiB1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzczo6dWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAgKnNvYXAsIHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc0VudGl0eSo+IGJ1c2luZXNzRW50aXRpZXMpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIGJ1c2luZXNzRW50aXRpZXMgY29sbGVjdGlvbiBvZiBidXNpbmVzcyBlbnRpdGllcworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzYXZlX1VTQ09SRWJ1c2luZXNzIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK2J1c2luZXNzIGVudGl0aWVzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2J1c2luZXNzRGV0YWlsICp1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzczo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pCitAYnJpZWYKK0BwYXJhbVtpbl0gZW5kcG9pbnQgVVJMIG9mIHRoZSBVRERJIHNlcnZlcgorQHBhcmFtW2luXSBhdXRoSW5mbyBhdXRob3JpemF0aW9uIHRva2VuIHByb3ZpZGVkIGJ5IHRoZSBVRERJIHNlcnZlcgorQHJldHVybiBBIHBvaW50ZXIgdG8gYSB1ZGRpMl9fYnVzaW5lc3NEZXRhaWwgb2JqZWN0IG9yIE5VTEwgb24gZXJyb3IKKworU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZlciB0byBwb3N0IGJ1c2luZXNzIGluZm9ybWF0aW9uIG9uIHRoZSBzZXJ2ZXIuCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOnNhdmVfc2VydmljZQorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorQGNsYXNzIHVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2UKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBwb3N0IHNlcnZpY2UgaW5mb3JtYXRpb24gb24gYSBVRERJIHNlcnZlci4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzc0NAorKi8KKworLyoqCitAZm4gdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZTo6dWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc2F2ZV9VU0NPUkVzZXJ2aWNlIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZTo6dWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCAqc29hcCwgdWRkaTJfX2J1c2luZXNzU2VydmljZSAmYnVzaW5lc3NTZXJ2aWNlKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBidXNpbmVzc1NlcnZpY2UgYnVzaW5lc3Mgc2VydmljZQorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzYXZlX1VTQ09SRXNlcnZpY2UgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAorc2VydmljZS4KKyovCisKKy8qKgorQGZuIHVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2U6OnVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAgKnNvYXAsIHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc1NlcnZpY2UqPiBidXNpbmVzc1NlcnZpY2VzKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBidXNpbmVzc1NlcnZpY2VzIGNvbGxlY3Rpb24gb2YgYnVzaW5lc3Mgc2VydmljZXMKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc2F2ZV9VU0NPUkVzZXJ2aWNlIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK3NlcnZpY2VzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX3NlcnZpY2VEZXRhaWwgKnVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2U6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKQorQGJyaWVmCitAcGFyYW1baW5dIGVuZHBvaW50IFVSTCBvZiB0aGUgVURESSBzZXJ2ZXIKK0BwYXJhbVtpbl0gYXV0aEluZm8gYXV0aG9yaXphdGlvbiB0b2tlbiBwcm92aWRlZCBieSB0aGUgVURESSBzZXJ2ZXIKK0ByZXR1cm4gQSBwb2ludGVyIHRvIGEgdWRkaTJfX3NlcnZpY2VEZXRhaWwgb2JqZWN0IG9yIE5VTEwgb24gZXJyb3IKKworU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZlciB0byBwb3N0IHNlcnZpY2UgaW5mb3JtYXRpb24gb24gdGhlIHNlcnZlci4KKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6c2F2ZV90TW9kZWwKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBwb3N0IHRNb2RlbCBpbmZvcm1hdGlvbiBvbiBhIFVEREkgc2VydmVyLgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzQ1CisqLworCisvKioKK0BmbiB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWw6OnVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc2F2ZV9VU0NPUkV0TW9kZWwgY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWw6OnVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCAqc29hcCwgdWRkaTJfX3RNb2RlbCAmdE1vZGVsKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSB0TW9kZWwgYSB0TW9kZWwKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc2F2ZV9VU0NPUkV0TW9kZWwgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAordE1vZGVsLgorKi8KKworLyoqCitAZm4gdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsOjp1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAgKnNvYXAsIHN0ZDo6dmVjdG9yPHVkZGkyX190TW9kZWwqPiB0TW9kZWxzKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSB0TW9kZWxzIGNvbGxlY3Rpb24gb2YgdE1vZGVscworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzYXZlX1VTQ09SRXRNb2RlbCBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkCit0TW9kZWxzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX3RNb2RlbERldGFpbCAqdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbykKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcGFyYW1baW5dIGF1dGhJbmZvIGF1dGhvcml6YXRpb24gdG9rZW4gcHJvdmlkZWQgYnkgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX190TW9kZWxEZXRhaWwgb2JqZWN0IG9yIE5VTEwgb24gZXJyb3IKKworU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZlciB0byBwb3N0IHRNb2RlbCBpbmZvcm1hdGlvbiBvbiB0aGUgc2VydmVyLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpzZXRfcHVibGlzaGVyQXNzZXJ0aW9ucworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorQGNsYXNzIHVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucworQGJyaWVmCisKK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIG1vZGlmeSB0aGUgZXhpc3RpbmcgcHVibGlzaGVyIGFzc2VydGlvbnMgZm9yIGFuCitpbmRpdmlkdWFsIHB1Ymxpc2hlci4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzc0NgorKi8KKworLyoqCitAZm4gdWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjp1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjp1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAgKnNvYXAsIHN0ZDo6dmVjdG9yPHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24qPiBwdWJsaXNoZXJBc3NlcnRpb25zKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBwdWJsaXNoZXJBc3NlcnRpb25zIGNvbGxlY3Rpb24gb2YgcHVibGlzaGVyIGFzc2VydGlvbnMKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgY2xhc3MgdXNpbmcgdGhlCitzcGVjaWZpZWQgY29sbGVjdGlvbiBvZiBwdWJsaXNoZXIgYXNzZXJ0aW9ucy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zICp1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKQorQGJyaWVmCitAcGFyYW1baW5dIGVuZHBvaW50IFVSTCBvZiB0aGUgVURESSBzZXJ2ZXIKK0BwYXJhbVtpbl0gYXV0aEluZm8gYXV0aG9yaXphdGlvbiB0b2tlbiBwcm92aWRlZCBieSB0aGUgVURESSBzZXJ2ZXIKK0ByZXR1cm4gQSBwb2ludGVyIHRvIGEgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMgb2JqZWN0IG9yIE5VTEwgb24gZXJyb3IKKworU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZlciB0byBwb3N0IHRNb2RlbCBpbmZvcm1hdGlvbiBvbiB0aGUgc2VydmVyLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwlDb2RlIEV4YW1wbGVzCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCitAcGFnZSBleGFtcGxlMSBDb2RlIEV4YW1wbGUgMTogRmluZGluZyBhIHNlcnZpY2UKKworVGhpcyBleGFtcGxlIHNob3dzIHlvdSBob3cgdG8gZmluZCBXZWIgc2VydmljZXMuIEluIHRoaXMgY2FzZSwgdGhlIGV4YW1wbGUKK2ZpbmRzIFdlYiBzZXJ2aWNlcyB3aXRoIG5hbWVzIHRoYXQgYmVnaW4gd2l0aCB0aGUgd29yZCAibWFnaWMiLgorCitAY29kZQorI2luY2x1ZGUgImlucUguaCIKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreyAKKyAgY2hhciAqc2VhcmNoX3N0cmluZyA9ICJtYWdpYyI7CisKKyAgaWYgKGFyZ2MgPiAxKQorICAgIHNlYXJjaF9zdHJpbmcgPSBhcmd2WzFdOworCisgIC8vIENyZWF0ZSBhIGdTT0FQIGNvbnRleHQKKyAgc3RydWN0IHNvYXAgKnNvYXAgPSBzb2FwX25ldygpOworCisgIC8vIENyZWF0ZSBhbiBvYmplY3QgdG8gZmluZCBhIGJ1c2luZXNzCisgIHVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2UgZnMoc29hcCwgc2VhcmNoX3N0cmluZyk7CisKKyAgLy8gU2VuZCB0aGUgcmVxdWVzdAorICB1ZGRpMl9fc2VydmljZUxpc3QgKnNsID0gZnMuc2VuZCgiaHR0cDovL3VkZGkueG1ldGhvZHMubmV0L2lucXVpcmUiKTsKKworICAvLyBDaGVjayBpZiByZXN1bHQgaXMgT0sKKyAgaWYgKCFzbCkKKyAgICBzb2FwX3ByaW50X2ZhdWx0KHNvYXAsIHN0ZGVycik7CisKKyAgLy8gSWYgT0ssIHJlcG9ydCB0aGUgc2VydmljZSBuYW1lKHMpIGFuZCB1bmlxdWUgaWRlbnRpZmljYXRpb24ga2V5cworICBlbHNlIGlmIChzbC0+c2VydmljZUluZm9zKQorICB7CisgICAgc3RkOjpjb3V0IDw8ICJTZWFyY2ggcmVzdWx0cyBvbiAiIDw8IHNlYXJjaF9zdHJpbmcgPDwgIjoiIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPHVkZGkyX19zZXJ2aWNlSW5mbyo+Ojpjb25zdF9pdGVyYXRvciBzaSA9IHNsLT5zZXJ2aWNlSW5mb3MtPnNlcnZpY2VJbmZvLmJlZ2luKCk7IHNpICE9IHNsLT5zZXJ2aWNlSW5mb3MtPnNlcnZpY2VJbmZvLmVuZCgpOyArK3NpKQorICAgIHsKKyAgICAgIC8vIFJlcG9ydCBzZXJ2aWNlS2V5IGFuZCBidXNpbmVzc0tleQorICAgICAgc3RkOjpjb3V0IDw8ICJzZXJ2aWNlS2V5PSIgPDwgKCpzaSktPnNlcnZpY2VLZXkgPDwgc3RkOjplbmRsIDw8ICJidXNpbmVzc0tleT0iIDw8ICgqc2kpLT5idXNpbmVzc0tleSA8PCBzdGQ6OmVuZGw7CisKKyAgICAgIC8vIFJlcG9ydCBuYW1lcworICAgICAgZm9yIChzdGQ6OnZlY3Rvcjx1ZGRpMl9fbmFtZSo+Ojpjb25zdF9pdGVyYXRvciBuID0gKCpzaSktPm5hbWUuYmVnaW4oKTsgbiAhPSAoKnNpKS0+bmFtZS5lbmQoKTsgKytuKQorICAgICAgICBzdGQ6OmNvdXQgPDwgIm5hbWU9IiA8PCAoKm4pLT5fX2l0ZW0gPDwgc3RkOjplbmRsOworCisgICAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOworICAgIH0KKyAgfQorCisgIC8vIFJlbW92ZSBkZXNlcmlhbGl6ZWQgb2JqZWN0cworICBzb2FwX2Rlc3Ryb3koc29hcCk7CisKKyAgLy8gUmVtb3ZlIHRlbXBvcmFyeSBkYXRhCisgIHNvYXBfZW5kKHNvYXApOworCisgIC8vIERldGFjaCBhbmQgZnJlZSBjb250ZXh0CisgIHNvYXBfZG9uZShzb2FwKTsKKyAgZnJlZShzb2FwKTsKKworICByZXR1cm4gMDsKK30KK0BlbmRjb2RlCisKK1RvIGNvbXBpbGU6CistIHdzZGwyaCAtdHVkZGkyLXR5cGVtYXAuZGF0IGlucXVpcmVfdjIud3NkbAorLSBzb2FwY3BwMiAtSS4uIC1waW5xIGlucXVpcmVfdjIuaAorLSBnKysgLURXSVRIX05PTkFNRVNQQUNFUyAtSS4uIC1vIGV4YW1wbGUxIGV4YW1wbGUxLmNwcCBpbnF1aXJlX3YyLmNwcCBpbnFDLmNwcCBpbnFDbGllbnQuY3BwIC4uL3N0ZHNvYXAyLmNwcAorKi8KKworLyoqCitAcGFnZSBleGFtcGxlMiBDb2RlIEV4YW1wbGUgMjogRmluZGluZyBhIGJ1c2luZXNzCisKK1RoaXMgZXhhbXBsZSBzaG93cyB5b3UgaG93IHRvIGZpbmQgYSBidXNpbmVzcyBmcm9tIGEgVURESSBzZXJ2ZXIuCisKK0Bjb2RlCisjaW5jbHVkZSAiaW5xSC5oIgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7IAorICBjaGFyICpzZWFyY2hfc3RyaW5nID0gInhtZXRob2RzIjsKKworICBpZiAoYXJnYyA+IDEpCisgICAgc2VhcmNoX3N0cmluZyA9IGFyZ3ZbMV07CisKKyAgLy8gQ3JlYXRlIGEgZ1NPQVAgY29udGV4dAorICBzdHJ1Y3Qgc29hcCAqc29hcCA9IHNvYXBfbmV3KCk7CisKKyAgLy8gQ3JlYXRlIGFuIG9iamVjdCB0byBmaW5kIGEgYnVzaW5lc3MKKyAgdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MgZmIoc29hcCwgc2VhcmNoX3N0cmluZyk7CisKKyAgLy8gU2VuZCB0aGUgcmVxdWVzdAorICB1ZGRpMl9fYnVzaW5lc3NMaXN0ICpibCA9IGZiLnNlbmQoImh0dHA6Ly91ZGRpLnhtZXRob2RzLm5ldC9pbnF1aXJlIik7CisKKyAgLy8gQ2hlY2sgaWYgcmVzdWx0IGlzIE9LCisgIGlmICghYmwpCisgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOworCisgIC8vIElmIE9LLCByZXBvcnQgdGhlIGJ1c2luZXNzIG5hbWUocykgYW5kIHVuaXF1ZSBpZGVudGlmaWNhdGlvbiBrZXlzCisgIGVsc2UgaWYgKGJsLT5idXNpbmVzc0luZm9zKQorICB7CisgICAgc3RkOjpjb3V0IDw8ICJTZWFyY2ggcmVzdWx0cyBvbiAiIDw8IHNlYXJjaF9zdHJpbmcgPDwgIjoiIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc0luZm8qPjo6Y29uc3RfaXRlcmF0b3IgYmkgPSBibC0+YnVzaW5lc3NJbmZvcy0+YnVzaW5lc3NJbmZvLmJlZ2luKCk7IGJpICE9IGJsLT5idXNpbmVzc0luZm9zLT5idXNpbmVzc0luZm8uZW5kKCk7ICsrYmkpCisgICAgeworICAgICAgLy8gUmVwb3J0IGJ1c2luZXNzS2V5CisgICAgICBzdGQ6OmNvdXQgPDwgImJ1c2luZXNzS2V5PSIgPDwgKCpiaSktPmJ1c2luZXNzS2V5IDw8IHN0ZDo6ZW5kbDsKKworICAgICAgLy8gUmVwb3J0IG5hbWVzCisgICAgICBmb3IgKHN0ZDo6dmVjdG9yPHVkZGkyX19uYW1lKj46OmNvbnN0X2l0ZXJhdG9yIG4gPSAoKmJpKS0+bmFtZS5iZWdpbigpOyBuICE9ICgqYmkpLT5uYW1lLmVuZCgpOyArK24pCisgICAgICAgIHN0ZDo6Y291dCA8PCAibmFtZT0iIDw8ICgqbiktPl9faXRlbSA8PCBzdGQ6OmVuZGw7CisKKyAgICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CisgICAgfQorICB9CisKKyAgLy8gUmVtb3ZlIGRlc2VyaWFsaXplZCBvYmplY3RzCisgIHNvYXBfZGVzdHJveShzb2FwKTsKKworICAvLyBSZW1vdmUgdGVtcG9yYXJ5IGRhdGEKKyAgc29hcF9lbmQoc29hcCk7CisKKyAgLy8gRGV0YWNoIGFuZCBmcmVlIGNvbnRleHQKKyAgc29hcF9kb25lKHNvYXApOworICBmcmVlKHNvYXApOworCisgIHJldHVybiAwOworfQorQGVuZGNvZGUKKworVG8gY29tcGlsZToKKy0gd3NkbDJoIC10dWRkaTItdHlwZW1hcC5kYXQgaW5xdWlyZV92Mi53c2RsCistIHNvYXBjcHAyIC1JLi4gLXBpbnEgaW5xdWlyZV92Mi5oCistIGcrKyAtRFdJVEhfTk9OQU1FU1BBQ0VTIC1JLi4gLW8gZXhhbXBsZTIgZXhhbXBsZTIuY3BwIGlucXVpcmVfdjIuY3BwIGlucUMuY3BwIGlucUNsaWVudC5jcHAgLi4vc3Rkc29hcDIuY3BwCisqLworLyoqCitAcGFnZSBleGFtcGxlMyBDb2RlIEV4YW1wbGUgMzogUHVibGlzaGluZyBhIFdTREwgYW5kIHNlcnZpY2Ugb24gWE1ldGhvZHMKKworVGhpcyBleGFtcGxlIHNob3dzIHlvdSBob3cgdG8gcHVibGlzaCBhIFdlYiBzZXJ2aWNlLiBJbiB0aGlzIGNhc2UsIHRoZSBleGFtcGxlCit0ZW1wbGF0ZSBjb2RlIG9idGFpbnMgYW4gYXV0aG9yaXphdGlvbiB0b2tlbiwgc2F2ZXMgdGhlIHRNb2RlbCB3aXRoIHRoZSBXU0RMCitVUkwgaW4gdGhlIHNlcnZlciwgYW5kIHNhdmVzIHRoZSBidXNpbmVzcyBzZXJ2aWNlIGluZm9ybWF0aW9uIGluIHRoZSBzZXJ2ZXIuCisKK0Bjb2RlCisjaW5jbHVkZSAicHViSC5oIgorCitjb25zdCBjaGFyICpzZXJ2ZXIgPSAiaHR0cHM6Ly91ZGRpLnhtZXRob2RzLm5ldC9wdWJsaXNoIjsKKworY29uc3QgY2hhciAqdXNlcmlkID0gIi4uLiI7IC8vIHVzZXIgSUQgdG8gYWNjZXNzIFVEREkgc2VydmVyCitjb25zdCBjaGFyICpwYXNzd2QgPSAiLi4uIjsgLy8gcGFzc3dvcmQgdG8gYWNjZXNzIFVEREkgc2VydmVyCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sgCisgIC8vIENyZWF0ZSBhIGdTT0FQIGNvbnRleHQKKyAgc3RydWN0IHNvYXAgKnNvYXAgPSBzb2FwX25ldygpOworCisgIC8vIFNldHVwIFNTTCBjb250ZXh0IChvcHRpb25hbCkgdG8gdmVyaWZ5IHNlcnZlcidzIGNyZWRlbnRpYWxzCisgIGlmIChzb2FwX3NzbF9jbGllbnRfY29udGV4dChzb2FwLCBTT0FQX1NTTF9ERUZBVUxULCBOVUxMLCBOVUxMLCAiY2FjZXJ0cy5wZW0iLCBOVUxMLCBOVUxMKSkKKyAgeyAKKyAgICBzb2FwX3ByaW50X2ZhdWx0KHNvYXAsIHN0ZGVycik7CisgICAgZXhpdCgxKTsKKyAgfQorCisgIC8vIFN0ZXAgMTogR2V0IGFuIGF1dGhvcml6YXRpb24gdG9rZW4gZnJvbSB0aGUgVURESSBzZXJ2ZXIKKyAgdWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW4gZ2V0X2F1dGhUb2tlbihzb2FwLCB1c2VyaWQsIHBhc3N3ZCk7CisgIHVkZGkyX19hdXRoVG9rZW4gKmF1dGhUb2tlbiA9IGdldF9hdXRoVG9rZW4uc2VuZChzZXJ2ZXIpOworCisgIC8vIENoZWNrIGlmIGF1dGhvcml6ZWQKKyAgaWYgKCFhdXRoVG9rZW4pCisgIHsKKyAgICBzb2FwX3ByaW50X2ZhdWx0KHNvYXAsIHN0ZGVycik7CisgICAgZXhpdCgxKTsKKyAgfQorCisgIC8vIEF1dGhvcml6YXRpb24gaW5mbyBwcm92aWRlZCBieSBzZXJ2ZXIgZm9yIHRoaXMgc2Vzc2lvbgorICBjaGFyICphdXRoSW5mbyA9IGF1dGhUb2tlbi0+YXV0aEluZm87CisKKyAgLy8gU3RlcCAyOiBDcmVhdGUgYSB0TW9kZWwgZm9yIHRoZSBXU0RMIHRvIGJlIHB1Ymxpc2hlZAorICB1ZGRpMl9fdE1vZGVsIHRNb2RlbDsKKyAgdE1vZGVsLnNvYXBfZGVmYXVsdChzb2FwKTsKKworICAvLyBDcmVhdGUgdGhlIHRNb2RlbCBhbmQgc2VydmljZSBuYW1lCisgIHRNb2RlbC5uYW1lID0gc29hcF9uZXdfdWRkaTJfX25hbWUoc29hcCwgLTEpOworICB0TW9kZWwubmFtZS0+X19pdGVtID0gIi4uLiI7CisgIHRNb2RlbC5uYW1lLT54bWxfX2xhbmdfID0gImVuIjsKKworICAvLyBDcmVhdGUgWE1ldGhvZHMgZGVzY3JpcHRpb24gZWxlbWVudHMgKHNlZSBodHRwOi8vd3d3LnhtZXRob2RzLm5ldC92ZTIvVURESS5wbykKKyAgdWRkaTJfX2Rlc2NyaXB0aW9uICpkZXNjcmlwdGlvbiA9IHNvYXBfbmV3X3VkZGkyX19kZXNjcmlwdGlvbihzb2FwLCA2KTsKKyAgZGVzY3JpcHRpb25bMF0uX19pdGVtID0gIlNIT1JUIERFU0NSSVBUSU9OOiAuLi4iOworICBkZXNjcmlwdGlvblswXS54bWxfX2xhbmdfID0gImVuIjsKKyAgZGVzY3JpcHRpb25bMV0uX19pdGVtID0gIlNIT1JUIERFU0NSSVBUSU9OOiAuLi4iOworICBkZXNjcmlwdGlvblsxXS54bWxfX2xhbmdfID0gImVuIjsKKyAgZGVzY3JpcHRpb25bMl0uX19pdGVtID0gIlVTQUdFIE5PVEVTOiAuLi4iOworICBkZXNjcmlwdGlvblsyXS54bWxfX2xhbmdfID0gImVuIjsKKyAgZGVzY3JpcHRpb25bM10uX19pdGVtID0gIkhPTUVQQUdFIFVSTDogLi4uIjsKKyAgZGVzY3JpcHRpb25bM10ueG1sX19sYW5nXyA9ICJlbiI7CisgIGRlc2NyaXB0aW9uWzRdLl9faXRlbSA9ICJDT05UQUNUIEVNQUlMOiAuLi4iOworICBkZXNjcmlwdGlvbls0XS54bWxfX2xhbmdfID0gImVuIjsKKyAgZGVzY3JpcHRpb25bNV0uX19pdGVtID0gIklNUExFTUVOVEFUSU9OOiAuLi4iOworICBkZXNjcmlwdGlvbls1XS54bWxfX2xhbmdfID0gImVuIjsKKworICAvLyBBZGQgdGhlIGZvdXIgZGVzY3JpcHRpb24gZWxlbWVudHMgdG8gdGhlIHRNb2RlbAorICB0TW9kZWwuZGVzY3JpcHRpb24ucHVzaF9iYWNrKGRlc2NyaXB0aW9uICsgMCk7CisgIHRNb2RlbC5kZXNjcmlwdGlvbi5wdXNoX2JhY2soZGVzY3JpcHRpb24gKyAxKTsKKyAgdE1vZGVsLmRlc2NyaXB0aW9uLnB1c2hfYmFjayhkZXNjcmlwdGlvbiArIDIpOworICB0TW9kZWwuZGVzY3JpcHRpb24ucHVzaF9iYWNrKGRlc2NyaXB0aW9uICsgNCk7CisKKyAgLy8gQWRkIGFuIG92ZXJ2aWV3RG9jIGVsZW1lbnQgd2l0aCBkZXNjcmlwdGlvbiBhbmQgb3ZlcnZpZXdVUkwKKyAgdE1vZGVsLm92ZXJ2aWV3RG9jID0gc29hcF9uZXdfdWRkaTJfX292ZXJ2aWV3RG9jKHNvYXAsIC0xKTsKKyAgdE1vZGVsLm92ZXJ2aWV3RG9jLT5zb2FwX2RlZmF1bHQoc29hcCk7CisgIHRNb2RlbC5vdmVydmlld0RvYy0+ZGVzY3JpcHRpb24ucHVzaF9iYWNrKHNvYXBfbmV3X3VkZGkyX19kZXNjcmlwdGlvbihzb2FwLCAtMSkpOworICB0TW9kZWwub3ZlcnZpZXdEb2MtPmRlc2NyaXB0aW9uWzBdLT5fX2l0ZW0gPSAiV1NETCBzb3VyY2UgZG9jdW1lbnQiOworICB0TW9kZWwub3ZlcnZpZXdEb2MtPmRlc2NyaXB0aW9uWzBdLT54bWxfX2xhbmdfID0gImVuIjsKKyAgdE1vZGVsLm92ZXJ2aWV3RG9jLT5vdmVydmlld1VSTCA9ICJodHRwOi8vLi4uL215LndzZGwjYmluZGluZ05hbWUiOworCisgIC8vIE9taXQgaWRlbnRpZmllciBiYWcKKyAgdE1vZGVsLmlkZW50aWZpZXJCYWcgPSBOVUxMOworCisgIC8vIEFkZCBhIGNhdGVnb3J5IHdpdGggYSBXU0RMLXNwZWNpZmljIGtleWVkUmVmZXJlbmNlCisgIHRNb2RlbC5jYXRlZ29yeUJhZyA9IHNvYXBfbmV3X3VkZGkyX19jYXRlZ29yeUJhZyhzb2FwLCAtMSk7CisgIHRNb2RlbC5jYXRlZ29yeUJhZy0+c29hcF9kZWZhdWx0KHNvYXApOworICB0TW9kZWwuY2F0ZWdvcnlCYWctPmtleWVkUmVmZXJlbmNlLnB1c2hfYmFjayhzb2FwX25ld191ZGRpMl9fa2V5ZWRSZWZlcmVuY2Uoc29hcCwgLTEpKTsKKyAgdE1vZGVsLmNhdGVnb3J5QmFnLT5rZXllZFJlZmVyZW5jZVswXS0+dE1vZGVsS2V5ID0gIi4uLiI7CisgIHRNb2RlbC5jYXRlZ29yeUJhZy0+a2V5ZWRSZWZlcmVuY2VbMF0tPmtleU5hbWUgPSAidWRkaS1vcmc6dHlwZXMiOworICB0TW9kZWwuY2F0ZWdvcnlCYWctPmtleWVkUmVmZXJlbmNlWzBdLT5rZXlWYWx1ZSA9ICJ3c2RsU3BlYyI7CisKKyAgdE1vZGVsLmF1dGhvcml6ZWROYW1lID0gIi4uLiI7CisgIHRNb2RlbC5vcGVyYXRvcl8gPSAiLi4uIjsKKyAgdE1vZGVsLnRNb2RlbEtleSA9ICIuLi4iOworCisgIC8vIFNhdmUgdGhlIHRNb2RlbAorICB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwgc2F2ZV90TW9kZWwoc29hcCwgdE1vZGVsKTsKKyAgdWRkaTJfX3RNb2RlbERldGFpbCAqdE1vZGVsRGV0YWlsID0gc2F2ZV90TW9kZWwuc2VuZChzZXJ2ZXIsIGF1dGhJbmZvKTsKKworICAvLyBTdGVwIDM6IENyZWF0ZSBhIG5ldyBzZXJ2aWNlIHRvIGJlIHB1Ymxpc2hlZAorICB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlIHNlcnZpY2U7CisgIHNlcnZpY2Uuc29hcF9kZWZhdWx0KHNvYXApOworCisgIC8vIFNlcnZpY2UgbmFtZSBpcyB0aGUgdE1vZGVsIG5hbWUgKFhNZXRob2RzKQorICBzZXJ2aWNlLm5hbWUucHVzaF9iYWNrKHRNb2RlbC5uYW1lKTsKKworICAvLyBBZGQgdHdvIGRlc2NyaXB0aW9uIGVsZW1lbnRzIHRvIHRoZSBzZXJ2aWNlCisgIHNlcnZpY2UuZGVzY3JpcHRpb24ucHVzaF9iYWNrKGRlc2NyaXB0aW9uICsgNCk7CisgIHNlcnZpY2UuZGVzY3JpcHRpb24ucHVzaF9iYWNrKGRlc2NyaXB0aW9uICsgNSk7CisKKyAgLy8gQ3JlYXRlIGJpbmRpbmcgdGVtcGxhdGUKKyAgdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZSBiaW5kaW5nVGVtcGxhdGU7CisgIGJpbmRpbmdUZW1wbGF0ZS5zb2FwX2RlZmF1bHQoc29hcCk7CisgIGJpbmRpbmdUZW1wbGF0ZS50TW9kZWxJbnN0YW5jZURldGFpbHMgPSBzb2FwX25ld191ZGRpMl9fdE1vZGVsSW5zdGFuY2VEZXRhaWxzKHNvYXAsIC0xKTsKKyAgYmluZGluZ1RlbXBsYXRlLnRNb2RlbEluc3RhbmNlRGV0YWlscy0+dE1vZGVsSW5zdGFuY2VJbmZvLnB1c2hfYmFjayhzb2FwX25ld191ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvKHNvYXAsIC0xKSk7CisgIGJpbmRpbmdUZW1wbGF0ZS50TW9kZWxJbnN0YW5jZURldGFpbHMtPnRNb2RlbEluc3RhbmNlSW5mb1swXS0+aW5zdGFuY2VEZXRhaWxzID0gTlVMTDsKKyAgYmluZGluZ1RlbXBsYXRlLnRNb2RlbEluc3RhbmNlRGV0YWlscy0+dE1vZGVsSW5zdGFuY2VJbmZvWzBdLT50TW9kZWxLZXkgPSB0TW9kZWwudE1vZGVsS2V5OworICBiaW5kaW5nVGVtcGxhdGUuYWNjZXNzUG9pbnQgPSBzb2FwX25ld191ZGRpMl9fYWNjZXNzUG9pbnQoc29hcCwgLTEpOworICBiaW5kaW5nVGVtcGxhdGUuYWNjZXNzUG9pbnQtPl9faXRlbSA9ICIuLi4iOworICBiaW5kaW5nVGVtcGxhdGUuYWNjZXNzUG9pbnQtPlVSTFR5cGUgPSB1ZGRpMl9fVVJMVHlwZV9faHR0cDsKKyAgYmluZGluZ1RlbXBsYXRlLmhvc3RpbmdSZWRpcmVjdG9yID0gTlVMTDsKKyAgYmluZGluZ1RlbXBsYXRlLnNlcnZpY2VLZXkgPSAiLi4uIjsKKyAgYmluZGluZ1RlbXBsYXRlLmJpbmRpbmdLZXkgPSAiLi4uIjsKKworICAvLyBBZGQgYmluZGluZyBUZW1wbGF0ZSB0byBzZXJ2aWNlCisgIHNlcnZpY2UuYmluZGluZ1RlbXBsYXRlcyA9IHNvYXBfbmV3X3VkZGkyX19iaW5kaW5nVGVtcGxhdGVzKHNvYXAsIC0xKTsKKyAgc2VydmljZS5iaW5kaW5nVGVtcGxhdGVzLT5zb2FwX2RlZmF1bHQoc29hcCk7CisgIHNlcnZpY2UuYmluZGluZ1RlbXBsYXRlcy0+YmluZGluZ1RlbXBsYXRlLnB1c2hfYmFjaygmYmluZGluZ1RlbXBsYXRlKTsKKworICBzZXJ2aWNlLmNhdGVnb3J5QmFnID0gTlVMTDsKKyAgc2VydmljZS5zZXJ2aWNlS2V5ID0gIi4uLiI7CisgIHNlcnZpY2UuYnVzaW5lc3NLZXkgPSAiLi4uIjsKKworICAvLyBTYXZlIHRoZSBzZXJ2aWNlCisgIHVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2Ugc2F2ZV9zZXJ2aWNlKHNvYXAsIHNlcnZpY2UpOworICB1ZGRpMl9fc2VydmljZURldGFpbCAqc2VydmljZURldGFpbCA9IHNhdmVfc2VydmljZS5zZW5kKHNlcnZlciwgYXV0aEluZm8pOworCisgIC8vIFN0ZXAgNDogRGlzY2FyZCBhdXRob3JpemF0aW9uIHRva2VuCisgIHVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbiBkaXNjYXJkX2F1dGhUb2tlbihzb2FwLCBhdXRoSW5mbyk7CisgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCAqZGlzcG9zaXRpb25SZXBvcnQgPSBkaXNjYXJkX2F1dGhUb2tlbi5zZW5kKHNlcnZlcik7CisKKyAgLy8gUmVtb3ZlIGRlc2VyaWFsaXplZCBvYmplY3RzCisgIHNvYXBfZGVzdHJveShzb2FwKTsKKworICAvLyBSZW1vdmUgdGVtcG9yYXJ5IGRhdGEKKyAgc29hcF9lbmQoc29hcCk7CisKKyAgLy8gRGV0YWNoIGFuZCBmcmVlIGNvbnRleHQKKyAgc29hcF9kb25lKHNvYXApOworICBmcmVlKHNvYXApOworCisgIHJldHVybiAwOworfQorQGVuZGNvZGUKK1RvIGNvbXBpbGU6CistIHdzZGwyaCAtdHVkZGkyLXR5cGVtYXAuZGF0IHB1Ymxpc2hfdjIud3NkbAorLSBzb2FwY3BwMiAtSS4uIC1wcHViIHB1Ymxpc2hfdjIuaAorLSBnKysgLURXSVRIX09QRU5TU0wgLURXSVRIX05PTkFNRVNQQUNFUyAtSS4uIC1vIGV4YW1wbGUzIGV4YW1wbGUzLmNwcCBwdWJsaXNoX3YyLmNwcCBwdWJDLmNwcCBwdWJDbGllbnQuY3BwIC4uL3N0ZHNvYXAyLmNwcAorKi8KK10KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMJVURESSB2MiBYTUwgbmFtZXNwYWNlcworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaW5xMgk9ICJ1cm46dWRkaS1vcmc6aW5xdWlyeV92MiIKK3B1YjIJPSAidXJuOnVkZGktb3JnOnB1YmxpY2F0aW9uX3YyIgordWRkaTIJPSAidXJuOnVkZGktb3JnOmFwaV92MiIKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMJVHlwZSBEZWZpbml0aW9ucworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIwlVc2UgcmVndWxhciBDIHN0cmluZ3Mgb25seToKKworeHNkX19zdHJpbmcJPSB8IGNoYXIqIHwgY2hhcioKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMJQ2xhc3MvU3RydWN0IEV4dGVuc2lvbnMKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMJdWRkaTI6ZmluZF9iaW5kaW5nIG9iamVjdCBleHRlbmRlZCB3aXRoIGNvbi9kZS1zdHJ1Y3RvcnMgYW5kIHNlbmQoKQorCit1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nID0gJCB1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKik7CisKK3VkZGkyX19maW5kX1VTQ09SRWJpbmRpbmcgPSAkIHVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0TW9kZWxLZXkpOworCit1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nID0gJCB1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8Y2hhcio+IHRNb2RlbEtleXMpOworCit1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nID0gJCB1ZGRpMl9fYmluZGluZ0RldGFpbCAqc2VuZChjb25zdCBjaGFyICplbmRwb2ludCk7CisKKyMJdWRkaTI6ZmluZF9idXNpbmVzcyBvYmplY3QgZXh0ZW5kZWQgd2l0aCBjb24vZGUtc3RydWN0b3JzIGFuZCBzZW5kKCkKKwordWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MgPSAkIHVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKik7CisKK3VkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzID0gJCB1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKm5hbWUpOworCit1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzcyA9ICQgdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3RvcjxjaGFyKj4gdE1vZGVsS2V5cyk7CisKK3VkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzID0gJCB1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19rZXllZFJlZmVyZW5jZSo+IGtleWVkUmVmZXJlbmNlcyk7CisKK3VkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzID0gJCB1ZGRpMl9fYnVzaW5lc3NMaXN0ICpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50KTsKKworIwl1ZGRpMjpmaW5kX3JlbGF0ZWRCdXNpbmVzc2VzIG9iamVjdCBleHRlbmRlZCB3aXRoIGNvbi9kZS1zdHJ1Y3RvcnMgYW5kIHNlbmQoKQorCit1ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyA9ICQgdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMoc3RydWN0IHNvYXAqKTsKKwordWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMgPSAkIHVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqYnVzaW5lc3NLZXkpOworCit1ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyA9ICQgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdCAqc2VuZChjb25zdCBjaGFyICplbmRwb2ludCk7CisKKyMJdWRkaTI6ZmluZF9zZXJ2aWNlIG9iamVjdCBleHRlbmRlZCB3aXRoIGNvbi9kZS1zdHJ1Y3RvcnMgYW5kIHNlbmQoKQorCit1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlID0gJCB1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKik7CisKK3VkZGkyX19maW5kX1VTQ09SRXNlcnZpY2UgPSAkIHVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICpuYW1lKTsKKwordWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZSA9ICQgdWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPGNoYXIqPiB0TW9kZWxLZXlzKTsKKwordWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZSA9ICQgdWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19rZXllZFJlZmVyZW5jZSo+IGtleWVkUmVmZXJlbmNlcyk7CisKK3VkZGkyX19maW5kX1VTQ09SRXNlcnZpY2UgPSAkIHVkZGkyX19zZXJ2aWNlTGlzdCogc2VuZChjb25zdCBjaGFyICplbmRwb2ludCk7CisKKyMJdWRkaTI6ZmluZF90TW9kZWwgb2JqZWN0IGV4dGVuZGVkIHdpdGggY29uL2RlLXN0cnVjdG9ycyBhbmQgc2VuZCgpCisKK3VkZGkyX19maW5kX1VTQ09SRXRNb2RlbCA9ICQgdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKik7CisKK3VkZGkyX19maW5kX1VTQ09SRXRNb2RlbCA9ICQgdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqbmFtZSk7CisKK3VkZGkyX19maW5kX1VTQ09SRXRNb2RlbCA9ICQgdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2tleWVkUmVmZXJlbmNlKj4ga2V5ZWRSZWZlcmVuY2VzKTsKKwordWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsID0gJCB1ZGRpMl9fdE1vZGVsTGlzdCogc2VuZChjb25zdCBjaGFyICplbmRwb2ludCk7CisKKyMJdWRkaTI6Z2V0X2JpbmRpbmdEZXRhaWwgb2JqZWN0IGV4dGVuZGVkIHdpdGggY29uL2RlLXN0cnVjdG9ycyBhbmQgc2VuZCgpCisKK3VkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbCA9ICQgdWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsKHN0cnVjdCBzb2FwKik7CisKK3VkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbCA9ICQgdWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqYmluZGluZ0tleSk7CisKK3VkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbCA9ICQgdWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8Y2hhcio+IGJpbmRpbmdLZXlzKTsKKwordWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsID0gJCB1ZGRpMl9fYmluZGluZ0RldGFpbCogc2VuZChjb25zdCBjaGFyICplbmRwb2ludCk7CisKKyMJdWRkaTI6Z2V0X2J1c2luZXNzRGV0YWlsIG9iamVjdCBleHRlbmRlZCB3aXRoIGNvbi9kZS1zdHJ1Y3RvcnMgYW5kIHNlbmQoKQorCit1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsID0gJCB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsKHN0cnVjdCBzb2FwKik7CisKK3VkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwgPSAkIHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICpidXNpbmVzc0tleSk7CisKK3VkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwgPSAkIHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3RvcjxjaGFyKj4gYnVzaW5lc3NLZXlzKTsKKwordWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbCA9ICQgdWRkaTJfX2J1c2luZXNzRGV0YWlsKiBzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50KTsKKworIwl1ZGRpMjpnZXRfYnVzaW5lc3NEZXRhaWxFeHQgb2JqZWN0IGV4dGVuZGVkIHdpdGggY29uL2RlLXN0cnVjdG9ycyBhbmQgc2VuZCgpCisKK3VkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQgPSAkIHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQoc3RydWN0IHNvYXAqKTsKKwordWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dCA9ICQgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKmJ1c2luZXNzS2V5KTsKKwordWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dCA9ICQgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dChzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPGNoYXIqPiBidXNpbmVzc0tleXMpOworCit1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0ID0gJCB1ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHQqIHNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQpOworCisjCXVkZGkyOmdldF9zZXJ2aWNlRGV0YWlsIG9iamVjdCBleHRlbmRlZCB3aXRoIGNvbi9kZS1zdHJ1Y3RvcnMgYW5kIHNlbmQoKQorCit1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwgPSAkIHVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbChzdHJ1Y3Qgc29hcCopOworCit1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwgPSAkIHVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnNlcnZpY2VLZXkpOworCit1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwgPSAkIHVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbChzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPGNoYXIqPiBzZXJ2aWNlS2V5cyk7CisKK3VkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbCA9ICQgdWRkaTJfX3NlcnZpY2VEZXRhaWwqIHNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQpOworCisjCXVkZGkyOmdldF90TW9kZWxEZXRhaWwgb2JqZWN0IGV4dGVuZGVkIHdpdGggY29uL2RlLXN0cnVjdG9ycyBhbmQgc2VuZCgpCisKK3VkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsID0gJCB1ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbChzdHJ1Y3Qgc29hcCopOworCit1ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbCA9ICQgdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0TW9kZWxLZXkpOworCit1ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbCA9ICQgdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3RvcjxjaGFyKj4gdE1vZGVsS2V5cyk7CisKK3VkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsID0gJCB1ZGRpMl9fdE1vZGVsRGV0YWlsKiBzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50KTsKKworIwl1ZGRpMjphZGRfcHVibGlzaGVyQXNzZXJ0aW9ucyBvYmplY3QgZXh0ZW5kZWQgd2l0aCBjb24vZGUtc3RydWN0b3JzIGFuZCBzZW5kKCkKKwordWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zID0gJCB1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqKTsKKwordWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zID0gJCB1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKj4gcHVibGlzaGVyQXNzZXJ0aW9ucyk7CisKK3VkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyA9ICQgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0KiBzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbyk7CisKKyMJdWRkaTI6ZGVsZXRlX2JpbmRpbmcgb2JqZWN0IGV4dGVuZGVkIHdpdGggY29uL2RlLXN0cnVjdG9ycyBhbmQgc2VuZCgpCisKK3VkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyA9ICQgdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKik7CisKK3VkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyA9ICQgdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqYmluZGluZ0tleSk7CisKK3VkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyA9ICQgdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8Y2hhcio+IGJpbmRpbmdLZXlzKTsKKwordWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nID0gJCB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQqIHNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKTsKKworIwl1ZGRpMjpkZWxldGVfYnVzaW5lc3Mgb2JqZWN0IGV4dGVuZGVkIHdpdGggY29uL2RlLXN0cnVjdG9ycyBhbmQgc2VuZCgpCisKK3VkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3MgPSAkIHVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqKTsKKwordWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyA9ICQgdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKmJ1c2luZXNzS2V5KTsKKwordWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyA9ICQgdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPGNoYXIqPiBidXNpbmVzc0tleXMpOworCit1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzID0gJCB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQqIHNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKTsKKworIwl1ZGRpMjpkZWxldGVfc2VydmljZSBvYmplY3QgZXh0ZW5kZWQgd2l0aCBjb24vZGUtc3RydWN0b3JzIGFuZCBzZW5kKCkKKwordWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlID0gJCB1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqKTsKKwordWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlID0gJCB1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICpzZXJ2aWNlS2V5KTsKKwordWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlID0gJCB1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3RvcjxjaGFyKj4gc2VydmljZUtleXMpOworCit1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UgPSAkIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCogc2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pOworCisjCXVkZGkyOmRlbGV0ZV90TW9kZWwgb2JqZWN0IGV4dGVuZGVkIHdpdGggY29uL2RlLXN0cnVjdG9ycyBhbmQgc2VuZCgpCisKK3VkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsID0gJCB1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCopOworCit1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbCA9ICQgdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0TW9kZWxLZXkpOworCit1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbCA9ICQgdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3RvcjxjaGFyKj4gdE1vZGVsS2V5cyk7CisKK3VkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsID0gJCB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQqIHNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKTsKKworIwl1ZGRpMjpkZWxldGVfcHVibGlzaGVyQXNzZXJ0aW9ucyBvYmplY3QgZXh0ZW5kZWQgd2l0aCBjb24vZGUtc3RydWN0b3JzIGFuZCBzZW5kKCkKKwordWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zID0gJCB1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqKTsKKwordWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zID0gJCB1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKj4gcHVibGlzaGVyQXNzZXJ0aW9ucyk7CisKK3VkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyA9ICQgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0KiBzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbyk7CisKKyMJdWRkaTI6ZGlzY2FyZF9hdXRoVG9rZW4gb2JqZWN0IGV4dGVuZGVkIHdpdGggY29uL2RlLXN0cnVjdG9ycyBhbmQgc2VuZCgpCisKK3VkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbiA9ICQgdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKik7CisKK3VkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbiA9ICQgdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqYXV0aEluZm8pOworCit1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4gPSAkIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCogc2VuZChjb25zdCBjaGFyICplbmRwb2ludCk7CisKKyMJdWRkaTI6Z2V0X2Fzc2VydGlvblN0YXR1c1JlcG9ydCBvYmplY3QgZXh0ZW5kZWQgd2l0aCBjb24vZGUtc3RydWN0b3JzIGFuZCBzZW5kKCkKKwordWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQgPSAkIHVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KHN0cnVjdCBzb2FwKik7CisKK3VkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0ID0gJCB1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKmNvbXBsZXRpb25TdGF0dXMpOworCit1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCA9ICQgdWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydCogc2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pOworCisjCXVkZGkyOmdldF9hdXRoVG9rZW4gb2JqZWN0IGV4dGVuZGVkIHdpdGggY29uL2RlLXN0cnVjdG9ycyBhbmQgc2VuZCgpCisKK3VkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuID0gJCB1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCopOworCit1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbiA9ICQgdWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW4oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp1c2VyaWQsIGNvbnN0IGNoYXIgKnBhc3N3ZCk7CisKK3VkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuID0gJCB1ZGRpMl9fYXV0aFRva2VuKiBzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50KTsKKworIwl1ZGRpMjpnZXRfcHVibGlzaGVyQXNzZXJ0aW9ucyBvYmplY3QgZXh0ZW5kZWQgd2l0aCBjb24vZGUtc3RydWN0b3JzIGFuZCBzZW5kKCkKKwordWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zID0gJCB1ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqKTsKKwordWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zID0gJCB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9ucyogc2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pOworCisjCXVkZGkyOmdldF9yZWdpc3RlcmVkSW5mbyBvYmplY3QgZXh0ZW5kZWQgd2l0aCBjb24vZGUtc3RydWN0b3JzIGFuZCBzZW5kKCkKKwordWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyA9ICQgdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyhzdHJ1Y3Qgc29hcCopOworCit1ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvID0gJCB1ZGRpMl9fcmVnaXN0ZXJlZEluZm8qIHNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKTsKKworIwl1ZGRpMjpzYXZlX2JpbmRpbmcgb2JqZWN0IGV4dGVuZGVkIHdpdGggY29uL2RlLXN0cnVjdG9ycyBhbmQgc2VuZCgpCisKK3VkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcgPSAkIHVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqKTsKKwordWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZyA9ICQgdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19iaW5kaW5nVGVtcGxhdGUgJmJpbmRpbmdUZW1wbGF0ZSk7CisKK3VkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcgPSAkIHVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYmluZGluZ1RlbXBsYXRlKj4gYmluZGluZ1RlbXBsYXRlcyk7CisKK3VkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcgPSAkIHVkZGkyX19iaW5kaW5nRGV0YWlsKiBzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbyk7CisKKyMJdWRkaTI6c2F2ZV9idXNpbmVzcyBvYmplY3QgZXh0ZW5kZWQgd2l0aCBjb24vZGUtc3RydWN0b3JzIGFuZCBzZW5kKCkKKwordWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3MgPSAkIHVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKik7CisKK3VkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzID0gJCB1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc0VudGl0eSAmYnVzaW5lc3NFbnRpdHkpOworCit1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyA9ICQgdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NFbnRpdHkqPiBidXNpbmVzc0VudGl0aWVzKTsKKwordWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3MgPSAkIHVkZGkyX19idXNpbmVzc0RldGFpbCogc2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pOworCisjCXVkZGkyOnNhdmVfc2VydmljZSBvYmplY3QgZXh0ZW5kZWQgd2l0aCBjb24vZGUtc3RydWN0b3JzIGFuZCBzZW5kKCkKKwordWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZSA9ICQgdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCopOworCit1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlID0gJCB1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2J1c2luZXNzU2VydmljZSAmYnVzaW5lc3NTZXJ2aWNlKTsKKwordWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZSA9ICQgdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc1NlcnZpY2UqPiBidXNpbmVzc1NlcnZpY2VzKTsKKwordWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZSA9ICQgdWRkaTJfX3NlcnZpY2VEZXRhaWwqIHNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKTsKKworIwl1ZGRpMjpzYXZlX3RNb2RlbCBvYmplY3QgZXh0ZW5kZWQgd2l0aCBjb24vZGUtc3RydWN0b3JzIGFuZCBzZW5kKCkKKwordWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsID0gJCB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqKTsKKwordWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsID0gJCB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCB1ZGRpMl9fdE1vZGVsICZ0TW9kZWwpOworCit1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwgPSAkIHVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX190TW9kZWwqPiB0TW9kZWxzKTsKKwordWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsID0gJCB1ZGRpMl9fdE1vZGVsRGV0YWlsKiBzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbyk7CisKKyMJdWRkaTI6c2V0X3B1Ymxpc2hlckFzc2VydGlvbnMgb2JqZWN0IGV4dGVuZGVkIHdpdGggY29uL2RlLXN0cnVjdG9ycyBhbmQgc2VuZCgpCisKK3VkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyA9ICQgdWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKik7CisKK3VkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyA9ICQgdWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbio+IHB1Ymxpc2hlckFzc2VydGlvbnMpOworCit1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgPSAkIHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zKiBzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbyk7CisKZGlmZiAtLWdpdCBhL3VkZGkyL3VkZGlILmggYi91ZGRpMi91ZGRpSC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NzcwNTMKLS0tIC9kZXYvbnVsbAorKysgYi91ZGRpMi91ZGRpSC5oCkBAIC0wLDAgKzEsMjkxNyBAQAorLyogdWRkaUguaAorICAgR2VuZXJhdGVkIGJ5IGdTT0FQIDIuNy4xIGZyb20gdWRkaV92Mi5oCisgICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAgIFRoaXMgcGFydCBvZiB0aGUgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXM6CisgICBHUEwsIHRoZSBnU09BUCBwdWJsaWMgbGljZW5zZSwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorKi8KKyNpZm5kZWYgdWRkaUhfSAorI2RlZmluZSB1ZGRpSF9ICisjaW5jbHVkZSAidWRkaVN0dWIuaCIKKworU09BUF9CRUdJTl9OQU1FU1BBQ0UodWRkaSkKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9pZ25vcmVfZWxlbWVudChzdHJ1Y3Qgc29hcCopOworI2lmbmRlZiBXSVRIX05PSURSRUYKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRpbmRlcGVuZGVudChzdHJ1Y3Qgc29hcCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX2dldGluZGVwZW5kZW50KHN0cnVjdCBzb2FwKik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX21hcmtlbGVtZW50KHN0cnVjdCBzb2FwKiwgY29uc3Qgdm9pZCosIGludCk7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0ZWxlbWVudChzdHJ1Y3Qgc29hcCosIGNvbnN0IHZvaWQqLCBjb25zdCBjaGFyKiwgaW50LCBpbnQpOworU09BUF9GTUFDMyB2b2lkICogU09BUF9GTUFDNCBzb2FwX2dldGVsZW1lbnQoc3RydWN0IHNvYXAqLCBpbnQqKTsKKyNlbmRpZgorU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3Jlc29sdmVfYXR0YWNobWVudHMoc3RydWN0IHNvYXAqKTsKKworU09BUF9GTUFDMyB2b2lkICogU09BUF9GTUFDNCBzb2FwX2luc3RhbnRpYXRlKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2ZkZWxldGUoc3RydWN0IHNvYXBfY2xpc3QqKTsKKworU09BUF9GTUFDMyB2b2lkKiBTT0FQX0ZNQUM0IHNvYXBfY2xhc3NfaWRfZW50ZXIoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdm9pZCosIGludCwgc2l6ZV90LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUMzIHZvaWQqIFNPQVBfRk1BQzQgc29hcF9jb250YWluZXJfaWRfZm9yd2FyZChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB2b2lkKiwgaW50LCBpbnQsIHNpemVfdCwgdW5zaWduZWQgaW50KTsKKworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9jb250YWluZXJfaW5zZXJ0KHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfYnl0ZQorI2RlZmluZSBTT0FQX1RZUEVfYnl0ZSAoMikKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X2J5dGUoc3RydWN0IHNvYXAqLCBjaGFyICopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9ieXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9ieXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGNoYXIgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X2J5dGUoc3RydWN0IHNvYXAqLCBjaGFyICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGNoYXIgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fYnl0ZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjaGFyICosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfaW50CisjZGVmaW5lIFNPQVBfVFlQRV9pbnQgKDEpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9pbnQoc3RydWN0IHNvYXAqLCBpbnQgKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X2ludChzdHJ1Y3Qgc29hcCosIGNvbnN0IGludCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9pbnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBpbnQgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X2ludChzdHJ1Y3Qgc29hcCosIGludCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgKiBTT0FQX0ZNQUM0IHNvYXBfaW5faW50KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCAqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19rZXlUeXBlCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fa2V5VHlwZSAoOTkpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF91ZGRpMl9fa2V5VHlwZShzdHJ1Y3Qgc29hcCosIGVudW0gdWRkaTJfX2tleVR5cGUgKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X3VkZGkyX19rZXlUeXBlKHN0cnVjdCBzb2FwKiwgY29uc3QgZW51bSB1ZGRpMl9fa2V5VHlwZSAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fa2V5VHlwZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IGVudW0gdWRkaTJfX2tleVR5cGUgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUMzUyBjb25zdCBjaGFyKiBTT0FQX0ZNQUM0UyBzb2FwX3VkZGkyX19rZXlUeXBlMnMoc3RydWN0IHNvYXAqLCBlbnVtIHVkZGkyX19rZXlUeXBlKTsKK1NPQVBfRk1BQzMgZW51bSB1ZGRpMl9fa2V5VHlwZSAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2tleVR5cGUoc3RydWN0IHNvYXAqLCBlbnVtIHVkZGkyX19rZXlUeXBlICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGVudW0gdWRkaTJfX2tleVR5cGUgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2tleVR5cGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgZW51bSB1ZGRpMl9fa2V5VHlwZSAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzNTIGludCBTT0FQX0ZNQUM0UyBzb2FwX3MydWRkaTJfX2tleVR5cGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgZW51bSB1ZGRpMl9fa2V5VHlwZSAqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX1VSTFR5cGUKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19VUkxUeXBlICg5OCkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X3VkZGkyX19VUkxUeXBlKHN0cnVjdCBzb2FwKiwgZW51bSB1ZGRpMl9fVVJMVHlwZSAqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfdWRkaTJfX1VSTFR5cGUoc3RydWN0IHNvYXAqLCBjb25zdCBlbnVtIHVkZGkyX19VUkxUeXBlICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19VUkxUeXBlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgZW51bSB1ZGRpMl9fVVJMVHlwZSAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzNTIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzRTIHNvYXBfdWRkaTJfX1VSTFR5cGUycyhzdHJ1Y3Qgc29hcCosIGVudW0gdWRkaTJfX1VSTFR5cGUpOworU09BUF9GTUFDMyBlbnVtIHVkZGkyX19VUkxUeXBlICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fVVJMVHlwZShzdHJ1Y3Qgc29hcCosIGVudW0gdWRkaTJfX1VSTFR5cGUgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgZW51bSB1ZGRpMl9fVVJMVHlwZSAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fVVJMVHlwZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBlbnVtIHVkZGkyX19VUkxUeXBlICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDM1MgaW50IFNPQVBfRk1BQzRTIHNvYXBfczJ1ZGRpMl9fVVJMVHlwZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBlbnVtIHVkZGkyX19VUkxUeXBlICopOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fdHJ1bmNhdGVkCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fdHJ1bmNhdGVkICg5NykKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X3VkZGkyX190cnVuY2F0ZWQoc3RydWN0IHNvYXAqLCBlbnVtIHVkZGkyX190cnVuY2F0ZWQgKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X3VkZGkyX190cnVuY2F0ZWQoc3RydWN0IHNvYXAqLCBjb25zdCBlbnVtIHVkZGkyX190cnVuY2F0ZWQgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX3RydW5jYXRlZChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IGVudW0gdWRkaTJfX3RydW5jYXRlZCAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzNTIGNvbnN0IGNoYXIqIFNPQVBfRk1BQzRTIHNvYXBfdWRkaTJfX3RydW5jYXRlZDJzKHN0cnVjdCBzb2FwKiwgZW51bSB1ZGRpMl9fdHJ1bmNhdGVkKTsKK1NPQVBfRk1BQzMgZW51bSB1ZGRpMl9fdHJ1bmNhdGVkICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fdHJ1bmNhdGVkKHN0cnVjdCBzb2FwKiwgZW51bSB1ZGRpMl9fdHJ1bmNhdGVkICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGVudW0gdWRkaTJfX3RydW5jYXRlZCAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fdHJ1bmNhdGVkKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGVudW0gdWRkaTJfX3RydW5jYXRlZCAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzNTIGludCBTT0FQX0ZNQUM0UyBzb2FwX3MydWRkaTJfX3RydW5jYXRlZChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBlbnVtIHVkZGkyX190cnVuY2F0ZWQgKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19kaXJlY3Rpb24KKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19kaXJlY3Rpb24gKDk2KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfdWRkaTJfX2RpcmVjdGlvbihzdHJ1Y3Qgc29hcCosIGVudW0gdWRkaTJfX2RpcmVjdGlvbiAqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfdWRkaTJfX2RpcmVjdGlvbihzdHJ1Y3Qgc29hcCosIGNvbnN0IGVudW0gdWRkaTJfX2RpcmVjdGlvbiAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fZGlyZWN0aW9uKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgZW51bSB1ZGRpMl9fZGlyZWN0aW9uICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDM1MgY29uc3QgY2hhciogU09BUF9GTUFDNFMgc29hcF91ZGRpMl9fZGlyZWN0aW9uMnMoc3RydWN0IHNvYXAqLCBlbnVtIHVkZGkyX19kaXJlY3Rpb24pOworU09BUF9GTUFDMyBlbnVtIHVkZGkyX19kaXJlY3Rpb24gKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19kaXJlY3Rpb24oc3RydWN0IHNvYXAqLCBlbnVtIHVkZGkyX19kaXJlY3Rpb24gKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgZW51bSB1ZGRpMl9fZGlyZWN0aW9uICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19kaXJlY3Rpb24oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgZW51bSB1ZGRpMl9fZGlyZWN0aW9uICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDM1MgaW50IFNPQVBfRk1BQzRTIHNvYXBfczJ1ZGRpMl9fZGlyZWN0aW9uKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGVudW0gdWRkaTJfX2RpcmVjdGlvbiAqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfX2Rpc3Bvc2l0aW9uUmVwb3J0CisjZGVmaW5lIFNPQVBfVFlQRV9fZGlzcG9zaXRpb25SZXBvcnQgKDMwNikKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X19kaXNwb3NpdGlvblJlcG9ydChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IF9kaXNwb3NpdGlvblJlcG9ydCAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIF9kaXNwb3NpdGlvblJlcG9ydCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfX2Rpc3Bvc2l0aW9uUmVwb3J0KHN0cnVjdCBzb2FwKiwgX2Rpc3Bvc2l0aW9uUmVwb3J0ICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIF9kaXNwb3NpdGlvblJlcG9ydCAqIFNPQVBfRk1BQzQgc29hcF9pbl9fZGlzcG9zaXRpb25SZXBvcnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgX2Rpc3Bvc2l0aW9uUmVwb3J0ICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSBfZGlzcG9zaXRpb25SZXBvcnQgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X19kaXNwb3NpdGlvblJlcG9ydChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX19kaXNwb3NpdGlvblJlcG9ydChzdHJ1Y3Qgc29hcCosIF9kaXNwb3NpdGlvblJlcG9ydCopOworU09BUF9GTUFDNSBfZGlzcG9zaXRpb25SZXBvcnQgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfX2Rpc3Bvc2l0aW9uUmVwb3J0KHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X19kaXNwb3NpdGlvblJlcG9ydChzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX190TW9kZWxMaXN0CisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fdE1vZGVsTGlzdCAoOTEpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fdE1vZGVsTGlzdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX190TW9kZWxMaXN0ICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3RNb2RlbExpc3QgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX190TW9kZWxMaXN0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX3RNb2RlbExpc3QgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3RNb2RlbExpc3QgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX3RNb2RlbExpc3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3RNb2RlbExpc3QgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX190TW9kZWxMaXN0ICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fdE1vZGVsTGlzdChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX190TW9kZWxMaXN0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX3RNb2RlbExpc3QqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX3RNb2RlbExpc3QgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX3RNb2RlbExpc3Qoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX3RNb2RlbExpc3Qoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fdE1vZGVsRGV0YWlsCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fdE1vZGVsRGV0YWlsICg5MCkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX190TW9kZWxEZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fdE1vZGVsRGV0YWlsICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3RNb2RlbERldGFpbCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX3RNb2RlbERldGFpbChzdHJ1Y3Qgc29hcCosIHVkZGkyX190TW9kZWxEZXRhaWwgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3RNb2RlbERldGFpbCAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fdE1vZGVsRGV0YWlsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX190TW9kZWxEZXRhaWwgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX190TW9kZWxEZXRhaWwgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX190TW9kZWxEZXRhaWwoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fdE1vZGVsRGV0YWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3RNb2RlbERldGFpbCopOworU09BUF9GTUFDNSB1ZGRpMl9fdE1vZGVsRGV0YWlsICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX190TW9kZWxEZXRhaWwoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX3RNb2RlbERldGFpbChzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19zZXJ2aWNlTGlzdAorI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX3NlcnZpY2VMaXN0ICg4OSkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19zZXJ2aWNlTGlzdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19zZXJ2aWNlTGlzdCAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19zZXJ2aWNlTGlzdCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX3NlcnZpY2VMaXN0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NlcnZpY2VMaXN0ICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19zZXJ2aWNlTGlzdCAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fc2VydmljZUxpc3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3NlcnZpY2VMaXN0ICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fc2VydmljZUxpc3QgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19zZXJ2aWNlTGlzdChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19zZXJ2aWNlTGlzdChzdHJ1Y3Qgc29hcCosIHVkZGkyX19zZXJ2aWNlTGlzdCopOworU09BUF9GTUFDNSB1ZGRpMl9fc2VydmljZUxpc3QgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX3NlcnZpY2VMaXN0KHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19zZXJ2aWNlTGlzdChzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19zZXJ2aWNlRGV0YWlsCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fc2VydmljZURldGFpbCAoODgpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fc2VydmljZURldGFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19zZXJ2aWNlRGV0YWlsICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NlcnZpY2VEZXRhaWwgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19zZXJ2aWNlRGV0YWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NlcnZpY2VEZXRhaWwgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NlcnZpY2VEZXRhaWwgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX3NlcnZpY2VEZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3NlcnZpY2VEZXRhaWwgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19zZXJ2aWNlRGV0YWlsICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fc2VydmljZURldGFpbChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19zZXJ2aWNlRGV0YWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NlcnZpY2VEZXRhaWwqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX3NlcnZpY2VEZXRhaWwgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX3NlcnZpY2VEZXRhaWwoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX3NlcnZpY2VEZXRhaWwoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0CisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0ICg4NykKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0ICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdChzdHJ1Y3Qgc29hcCosIHVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3QgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdCAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3QgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3QgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3Qoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdCopOworU09BUF9GTUFDNSB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0ICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3Qoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdChzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19yZWdpc3RlcmVkSW5mbworI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX3JlZ2lzdGVyZWRJbmZvICg4NikKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19yZWdpc3RlcmVkSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19yZWdpc3RlcmVkSW5mbyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19yZWdpc3RlcmVkSW5mbyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX3JlZ2lzdGVyZWRJbmZvKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3JlZ2lzdGVyZWRJbmZvICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19yZWdpc3RlcmVkSW5mbyAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fcmVnaXN0ZXJlZEluZm8oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3JlZ2lzdGVyZWRJbmZvICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fcmVnaXN0ZXJlZEluZm8gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19yZWdpc3RlcmVkSW5mbyhzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19yZWdpc3RlcmVkSW5mbyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19yZWdpc3RlcmVkSW5mbyopOworU09BUF9GTUFDNSB1ZGRpMl9fcmVnaXN0ZXJlZEluZm8gKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX3JlZ2lzdGVyZWRJbmZvKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19yZWdpc3RlcmVkSW5mbyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9ucyAoODUpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fYnVzaW5lc3NMaXN0CisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fYnVzaW5lc3NMaXN0ICg4NCkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19idXNpbmVzc0xpc3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fYnVzaW5lc3NMaXN0ICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2J1c2luZXNzTGlzdCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2J1c2luZXNzTGlzdChzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc0xpc3QgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2J1c2luZXNzTGlzdCAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fYnVzaW5lc3NMaXN0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19idXNpbmVzc0xpc3QgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19idXNpbmVzc0xpc3QgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19idXNpbmVzc0xpc3Qoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fYnVzaW5lc3NMaXN0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX2J1c2luZXNzTGlzdCopOworU09BUF9GTUFDNSB1ZGRpMl9fYnVzaW5lc3NMaXN0ICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19idXNpbmVzc0xpc3Qoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX2J1c2luZXNzTGlzdChzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19idXNpbmVzc0RldGFpbEV4dAorI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0ICg4MykKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19idXNpbmVzc0RldGFpbEV4dChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19idXNpbmVzc0RldGFpbEV4dCAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc0RldGFpbEV4dCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0ICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc0RldGFpbEV4dCAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0ICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHQgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19idXNpbmVzc0RldGFpbEV4dChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19idXNpbmVzc0RldGFpbEV4dChzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc0RldGFpbEV4dCopOworU09BUF9GTUFDNSB1ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHQgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0KHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19idXNpbmVzc0RldGFpbEV4dChzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19idXNpbmVzc0RldGFpbAorI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2J1c2luZXNzRGV0YWlsICg4MikKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19idXNpbmVzc0RldGFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19idXNpbmVzc0RldGFpbCAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc0RldGFpbCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2J1c2luZXNzRGV0YWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2J1c2luZXNzRGV0YWlsICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc0RldGFpbCAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fYnVzaW5lc3NEZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2J1c2luZXNzRGV0YWlsICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fYnVzaW5lc3NEZXRhaWwgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19idXNpbmVzc0RldGFpbChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19idXNpbmVzc0RldGFpbChzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc0RldGFpbCopOworU09BUF9GTUFDNSB1ZGRpMl9fYnVzaW5lc3NEZXRhaWwgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2J1c2luZXNzRGV0YWlsKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19idXNpbmVzc0RldGFpbChzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19iaW5kaW5nRGV0YWlsCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fYmluZGluZ0RldGFpbCAoODEpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fYmluZGluZ0RldGFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19iaW5kaW5nRGV0YWlsICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2JpbmRpbmdEZXRhaWwgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19iaW5kaW5nRGV0YWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2JpbmRpbmdEZXRhaWwgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2JpbmRpbmdEZXRhaWwgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2JpbmRpbmdEZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2JpbmRpbmdEZXRhaWwgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19iaW5kaW5nRGV0YWlsICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fYmluZGluZ0RldGFpbChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19iaW5kaW5nRGV0YWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2JpbmRpbmdEZXRhaWwqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2JpbmRpbmdEZXRhaWwgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2JpbmRpbmdEZXRhaWwoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX2JpbmRpbmdEZXRhaWwoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fYXV0aFRva2VuCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fYXV0aFRva2VuICg4MCkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19hdXRoVG9rZW4oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fYXV0aFRva2VuICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2F1dGhUb2tlbiAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2F1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIHVkZGkyX19hdXRoVG9rZW4gKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2F1dGhUb2tlbiAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19hdXRoVG9rZW4gKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19hdXRoVG9rZW4gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19hdXRoVG9rZW4oc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2F1dGhUb2tlbiopOworU09BUF9GTUFDNSB1ZGRpMl9fYXV0aFRva2VuICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19hdXRoVG9rZW4oc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX2F1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQgKDc5KQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0ICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0ICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydCAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydCAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0Kik7CitTT0FQX0ZNQUM1IHVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydChzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX3ZhbGlkYXRlX1VTQ09SRXZhbHVlcworI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX3ZhbGlkYXRlX1VTQ09SRXZhbHVlcyAoNzgpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fdmFsaWRhdGVfVVNDT1JFdmFsdWVzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX3ZhbGlkYXRlX1VTQ09SRXZhbHVlcyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX192YWxpZGF0ZV9VU0NPUkV2YWx1ZXMgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX192YWxpZGF0ZV9VU0NPUkV2YWx1ZXMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fdmFsaWRhdGVfVVNDT1JFdmFsdWVzICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX192YWxpZGF0ZV9VU0NPUkV2YWx1ZXMgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX3ZhbGlkYXRlX1VTQ09SRXZhbHVlcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fdmFsaWRhdGVfVVNDT1JFdmFsdWVzICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fdmFsaWRhdGVfVVNDT1JFdmFsdWVzICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fdmFsaWRhdGVfVVNDT1JFdmFsdWVzKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX3ZhbGlkYXRlX1VTQ09SRXZhbHVlcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX192YWxpZGF0ZV9VU0NPUkV2YWx1ZXMqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX3ZhbGlkYXRlX1VTQ09SRXZhbHVlcyAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fdmFsaWRhdGVfVVNDT1JFdmFsdWVzKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX192YWxpZGF0ZV9VU0NPUkV2YWx1ZXMoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAoNzcpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19zYXZlX1VTQ09SRXRNb2RlbCAoNzYpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19zYXZlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIHVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbCAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19zYXZlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlICg3NSkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZSAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIHVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2UgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZSAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2UgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2UgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZSopOworU09BUF9GTUFDNSB1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyAoNzQpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3MgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3MgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3MgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3MgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3MqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3MgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nICg3MykKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZyAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZyopOworU09BUF9GTUFDNSB1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbCAoNzIpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbCAoNzEpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbChzdHJ1Y3Qgc29hcCosIHVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbCAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbChzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvICg3MCkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8gKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8gKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8oc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyopOworU09BUF9GTUFDNSB1ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8oc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucworI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICg2OSkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyopOworU09BUF9GTUFDNSB1ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQgKDY4KQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0ICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0ICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dCAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dCAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0Kik7CitTT0FQX0ZNQUM1IHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dChzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0KHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbAorI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbCAoNjcpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbCAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbChzdHJ1Y3Qgc29hcCosIHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbCAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbCAoNjYpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbChzdHJ1Y3Qgc29hcCosIHVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbCAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbChzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbgorI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW4gKDY1KQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW4oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbiAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbiAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW4oc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuKik7CitTT0FQX0ZNQUM1IHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0ICg2NCkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCopOworU09BUF9GTUFDNSB1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydChzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydChzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19maW5kX1VTQ09SRXRNb2RlbAorI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsICg2MykKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19maW5kX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19maW5kX1VTQ09SRXRNb2RlbCAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19maW5kX1VTQ09SRXRNb2RlbCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19maW5kX1VTQ09SRXRNb2RlbCAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWwgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19maW5kX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19maW5kX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIHVkZGkyX19maW5kX1VTQ09SRXRNb2RlbCopOworU09BUF9GTUFDNSB1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWwgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19maW5kX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19maW5kX1VTQ09SRXNlcnZpY2UKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19maW5kX1VTQ09SRXNlcnZpY2UgKDYyKQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2UgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZSAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19maW5kX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZSAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZSAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19maW5kX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlKik7CitTT0FQX0ZNQUM1IHVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2UgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzICg2MSkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyopOworU09BUF9GTUFDNSB1ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyhzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzcyAoNjApCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nICg1OSkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19maW5kX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmcgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZyAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmcgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmcgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19maW5kX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZyopOworU09BUF9GTUFDNSB1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19maW5kX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbgorI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuICg1OCkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbiAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbiAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbiAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIHVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbiopOworU09BUF9GTUFDNSB1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4gKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbCAoNTcpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZSAoNTYpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIHVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZSAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZSAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAoNTUpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzICg1NCkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3MgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3MgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3MgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyopOworU09BUF9GTUFDNSB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZworI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nICg1MykKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyopOworU09BUF9GTUFDNSB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucworI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICg1MikKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyopOworU09BUF9GTUFDNSB1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX190TW9kZWxJbnN0YW5jZUluZm8KKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX190TW9kZWxJbnN0YW5jZUluZm8gKDUxKQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX190TW9kZWxJbnN0YW5jZUluZm8gKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX190TW9kZWxJbnN0YW5jZUluZm8oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyhzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX190TW9kZWxJbnN0YW5jZUluZm8oc3RydWN0IHNvYXAqLCB1ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvKik7CitTT0FQX0ZNQUM1IHVkZGkyX190TW9kZWxJbnN0YW5jZUluZm8gKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyhzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX3RNb2RlbEluc3RhbmNlRGV0YWlscworI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX3RNb2RlbEluc3RhbmNlRGV0YWlscyAoNTApCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fdE1vZGVsSW5zdGFuY2VEZXRhaWxzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX3RNb2RlbEluc3RhbmNlRGV0YWlscyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX190TW9kZWxJbnN0YW5jZURldGFpbHMgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX190TW9kZWxJbnN0YW5jZURldGFpbHMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fdE1vZGVsSW5zdGFuY2VEZXRhaWxzICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX190TW9kZWxJbnN0YW5jZURldGFpbHMgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX3RNb2RlbEluc3RhbmNlRGV0YWlscyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fdE1vZGVsSW5zdGFuY2VEZXRhaWxzICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fdE1vZGVsSW5zdGFuY2VEZXRhaWxzICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fdE1vZGVsSW5zdGFuY2VEZXRhaWxzKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX3RNb2RlbEluc3RhbmNlRGV0YWlscyhzdHJ1Y3Qgc29hcCosIHVkZGkyX190TW9kZWxJbnN0YW5jZURldGFpbHMqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX3RNb2RlbEluc3RhbmNlRGV0YWlscyAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fdE1vZGVsSW5zdGFuY2VEZXRhaWxzKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX190TW9kZWxJbnN0YW5jZURldGFpbHMoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fdE1vZGVsSW5mb3MKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX190TW9kZWxJbmZvcyAoNDkpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fdE1vZGVsSW5mb3Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fdE1vZGVsSW5mb3MgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fdE1vZGVsSW5mb3MgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX190TW9kZWxJbmZvcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX190TW9kZWxJbmZvcyAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fdE1vZGVsSW5mb3MgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX3RNb2RlbEluZm9zKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX190TW9kZWxJbmZvcyAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX3RNb2RlbEluZm9zICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fdE1vZGVsSW5mb3Moc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fdE1vZGVsSW5mb3Moc3RydWN0IHNvYXAqLCB1ZGRpMl9fdE1vZGVsSW5mb3MqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX3RNb2RlbEluZm9zICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX190TW9kZWxJbmZvcyhzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fdE1vZGVsSW5mb3Moc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fdE1vZGVsSW5mbworI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX3RNb2RlbEluZm8gKDQ4KQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX3RNb2RlbEluZm8oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fdE1vZGVsSW5mbyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX190TW9kZWxJbmZvICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fdE1vZGVsSW5mbyhzdHJ1Y3Qgc29hcCosIHVkZGkyX190TW9kZWxJbmZvICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX190TW9kZWxJbmZvICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX190TW9kZWxJbmZvKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX190TW9kZWxJbmZvICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fdE1vZGVsSW5mbyAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX3RNb2RlbEluZm8oc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fdE1vZGVsSW5mbyhzdHJ1Y3Qgc29hcCosIHVkZGkyX190TW9kZWxJbmZvKik7CitTT0FQX0ZNQUM1IHVkZGkyX190TW9kZWxJbmZvICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX190TW9kZWxJbmZvKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX190TW9kZWxJbmZvKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX3RNb2RlbEJhZworI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX3RNb2RlbEJhZyAoNDcpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fdE1vZGVsQmFnKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX3RNb2RlbEJhZyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX190TW9kZWxCYWcgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX190TW9kZWxCYWcoc3RydWN0IHNvYXAqLCB1ZGRpMl9fdE1vZGVsQmFnICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX190TW9kZWxCYWcgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX3RNb2RlbEJhZyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fdE1vZGVsQmFnICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fdE1vZGVsQmFnICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fdE1vZGVsQmFnKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX3RNb2RlbEJhZyhzdHJ1Y3Qgc29hcCosIHVkZGkyX190TW9kZWxCYWcqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX3RNb2RlbEJhZyAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fdE1vZGVsQmFnKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX190TW9kZWxCYWcoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fdE1vZGVsCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fdE1vZGVsICg0NikKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX190TW9kZWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fdE1vZGVsICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3RNb2RlbCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX3RNb2RlbChzdHJ1Y3Qgc29hcCosIHVkZGkyX190TW9kZWwgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3RNb2RlbCAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fdE1vZGVsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX190TW9kZWwgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX190TW9kZWwgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX190TW9kZWwoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fdE1vZGVsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3RNb2RlbCopOworU09BUF9GTUFDNSB1ZGRpMl9fdE1vZGVsICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX190TW9kZWwoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX3RNb2RlbChzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyAoNDUpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyhzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fc2VydmljZUluZm9zCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fc2VydmljZUluZm9zICg0NCkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19zZXJ2aWNlSW5mb3Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fc2VydmljZUluZm9zICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NlcnZpY2VJbmZvcyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX3NlcnZpY2VJbmZvcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19zZXJ2aWNlSW5mb3MgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NlcnZpY2VJbmZvcyAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fc2VydmljZUluZm9zKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19zZXJ2aWNlSW5mb3MgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19zZXJ2aWNlSW5mb3MgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19zZXJ2aWNlSW5mb3Moc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fc2VydmljZUluZm9zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NlcnZpY2VJbmZvcyopOworU09BUF9GTUFDNSB1ZGRpMl9fc2VydmljZUluZm9zICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19zZXJ2aWNlSW5mb3Moc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX3NlcnZpY2VJbmZvcyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19zZXJ2aWNlSW5mbworI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX3NlcnZpY2VJbmZvICg0MykKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19zZXJ2aWNlSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19zZXJ2aWNlSW5mbyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19zZXJ2aWNlSW5mbyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX3NlcnZpY2VJbmZvKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NlcnZpY2VJbmZvICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19zZXJ2aWNlSW5mbyAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fc2VydmljZUluZm8oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3NlcnZpY2VJbmZvICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fc2VydmljZUluZm8gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19zZXJ2aWNlSW5mbyhzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19zZXJ2aWNlSW5mbyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19zZXJ2aWNlSW5mbyopOworU09BUF9GTUFDNSB1ZGRpMl9fc2VydmljZUluZm8gKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX3NlcnZpY2VJbmZvKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19zZXJ2aWNlSW5mbyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19yZXN1bHQKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19yZXN1bHQgKDQyKQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX3Jlc3VsdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19yZXN1bHQgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fcmVzdWx0ICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fcmVzdWx0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX3Jlc3VsdCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fcmVzdWx0ICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19yZXN1bHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3Jlc3VsdCAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX3Jlc3VsdCAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX3Jlc3VsdChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19yZXN1bHQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fcmVzdWx0Kik7CitTT0FQX0ZNQUM1IHVkZGkyX19yZXN1bHQgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX3Jlc3VsdChzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fcmVzdWx0KHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mb3MgKDQxKQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mb3Moc3RydWN0IHNvYXAqLCB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mb3MgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mb3MgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvcyAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zKik7CitTT0FQX0ZNQUM1IHVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvcyAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mb3Moc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8KKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvICg0MCkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8gKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8oc3RydWN0IHNvYXAqLCB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8oc3RydWN0IHNvYXAqLCB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyopOworU09BUF9GTUFDNSB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyhzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24KKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24gKDM5KQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24gKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbiAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbiAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbiAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbihzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24oc3RydWN0IHNvYXAqLCB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKik7CitTT0FQX0ZNQUM1IHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24gKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbihzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX3Bob25lCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fcGhvbmUgKDM4KQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX3Bob25lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX3Bob25lICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3Bob25lICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fcGhvbmUoc3RydWN0IHNvYXAqLCB1ZGRpMl9fcGhvbmUgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3Bob25lICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19waG9uZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fcGhvbmUgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19waG9uZSAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX3Bob25lKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX3Bob25lKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3Bob25lKik7CitTT0FQX0ZNQUM1IHVkZGkyX19waG9uZSAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fcGhvbmUoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX3Bob25lKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX292ZXJ2aWV3RG9jCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fb3ZlcnZpZXdEb2MgKDM3KQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX292ZXJ2aWV3RG9jKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX292ZXJ2aWV3RG9jICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX292ZXJ2aWV3RG9jICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fb3ZlcnZpZXdEb2Moc3RydWN0IHNvYXAqLCB1ZGRpMl9fb3ZlcnZpZXdEb2MgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX292ZXJ2aWV3RG9jICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19vdmVydmlld0RvYyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fb3ZlcnZpZXdEb2MgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19vdmVydmlld0RvYyAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX292ZXJ2aWV3RG9jKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX292ZXJ2aWV3RG9jKHN0cnVjdCBzb2FwKiwgdWRkaTJfX292ZXJ2aWV3RG9jKik7CitTT0FQX0ZNQUM1IHVkZGkyX19vdmVydmlld0RvYyAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fb3ZlcnZpZXdEb2Moc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX292ZXJ2aWV3RG9jKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX25hbWUKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19uYW1lICgzNikKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19uYW1lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX25hbWUgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fbmFtZSAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX25hbWUoc3RydWN0IHNvYXAqLCB1ZGRpMl9fbmFtZSAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fbmFtZSAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fbmFtZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fbmFtZSAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX25hbWUgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19uYW1lKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX25hbWUoc3RydWN0IHNvYXAqLCB1ZGRpMl9fbmFtZSopOworU09BUF9GTUFDNSB1ZGRpMl9fbmFtZSAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fbmFtZShzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fbmFtZShzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19rZXlzT3duZWQKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19rZXlzT3duZWQgKDM1KQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX2tleXNPd25lZChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19rZXlzT3duZWQgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fa2V5c093bmVkICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fa2V5c093bmVkKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2tleXNPd25lZCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fa2V5c093bmVkICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19rZXlzT3duZWQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2tleXNPd25lZCAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX2tleXNPd25lZCAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX2tleXNPd25lZChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19rZXlzT3duZWQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fa2V5c093bmVkKik7CitTT0FQX0ZNQUM1IHVkZGkyX19rZXlzT3duZWQgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2tleXNPd25lZChzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fa2V5c093bmVkKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX2tleWVkUmVmZXJlbmNlCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fa2V5ZWRSZWZlcmVuY2UgKDM0KQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX2tleWVkUmVmZXJlbmNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX2tleWVkUmVmZXJlbmNlICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2tleWVkUmVmZXJlbmNlICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fa2V5ZWRSZWZlcmVuY2Uoc3RydWN0IHNvYXAqLCB1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2tleWVkUmVmZXJlbmNlICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19rZXllZFJlZmVyZW5jZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19rZXllZFJlZmVyZW5jZSAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX2tleWVkUmVmZXJlbmNlKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX2tleWVkUmVmZXJlbmNlKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2tleWVkUmVmZXJlbmNlKik7CitTT0FQX0ZNQUM1IHVkZGkyX19rZXllZFJlZmVyZW5jZSAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fa2V5ZWRSZWZlcmVuY2Uoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX2tleWVkUmVmZXJlbmNlKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX2luc3RhbmNlRGV0YWlscworI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2luc3RhbmNlRGV0YWlscyAoMzMpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9faW5zdGFuY2VEZXRhaWxzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX2luc3RhbmNlRGV0YWlscyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19pbnN0YW5jZURldGFpbHMgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19pbnN0YW5jZURldGFpbHMoc3RydWN0IHNvYXAqLCB1ZGRpMl9faW5zdGFuY2VEZXRhaWxzICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19pbnN0YW5jZURldGFpbHMgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2luc3RhbmNlRGV0YWlscyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9faW5zdGFuY2VEZXRhaWxzICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9faW5zdGFuY2VEZXRhaWxzICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9faW5zdGFuY2VEZXRhaWxzKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX2luc3RhbmNlRGV0YWlscyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19pbnN0YW5jZURldGFpbHMqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2luc3RhbmNlRGV0YWlscyAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9faW5zdGFuY2VEZXRhaWxzKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19pbnN0YW5jZURldGFpbHMoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9faWRlbnRpZmllckJhZworI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2lkZW50aWZpZXJCYWcgKDMyKQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX2lkZW50aWZpZXJCYWcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9faWRlbnRpZmllckJhZyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19pZGVudGlmaWVyQmFnICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9faWRlbnRpZmllckJhZyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19pZGVudGlmaWVyQmFnICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19pZGVudGlmaWVyQmFnICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19pZGVudGlmaWVyQmFnKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19pZGVudGlmaWVyQmFnICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9faWRlbnRpZmllckJhZyAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX2lkZW50aWZpZXJCYWcoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9faWRlbnRpZmllckJhZyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19pZGVudGlmaWVyQmFnKik7CitTT0FQX0ZNQUM1IHVkZGkyX19pZGVudGlmaWVyQmFnICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19pZGVudGlmaWVyQmFnKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19pZGVudGlmaWVyQmFnKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX2hvc3RpbmdSZWRpcmVjdG9yCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9faG9zdGluZ1JlZGlyZWN0b3IgKDMxKQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX2hvc3RpbmdSZWRpcmVjdG9yKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX2hvc3RpbmdSZWRpcmVjdG9yICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2hvc3RpbmdSZWRpcmVjdG9yICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9faG9zdGluZ1JlZGlyZWN0b3Ioc3RydWN0IHNvYXAqLCB1ZGRpMl9faG9zdGluZ1JlZGlyZWN0b3IgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2hvc3RpbmdSZWRpcmVjdG9yICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19ob3N0aW5nUmVkaXJlY3RvcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9faG9zdGluZ1JlZGlyZWN0b3IgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19ob3N0aW5nUmVkaXJlY3RvciAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX2hvc3RpbmdSZWRpcmVjdG9yKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX2hvc3RpbmdSZWRpcmVjdG9yKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2hvc3RpbmdSZWRpcmVjdG9yKik7CitTT0FQX0ZNQUM1IHVkZGkyX19ob3N0aW5nUmVkaXJlY3RvciAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9faG9zdGluZ1JlZGlyZWN0b3Ioc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX2hvc3RpbmdSZWRpcmVjdG9yKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX2ZpbmRRdWFsaWZpZXJzCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fZmluZFF1YWxpZmllcnMgKDMwKQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX2ZpbmRRdWFsaWZpZXJzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX2ZpbmRRdWFsaWZpZXJzICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2ZpbmRRdWFsaWZpZXJzICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fZmluZFF1YWxpZmllcnMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZmluZFF1YWxpZmllcnMgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2ZpbmRRdWFsaWZpZXJzICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19maW5kUXVhbGlmaWVycyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fZmluZFF1YWxpZmllcnMgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19maW5kUXVhbGlmaWVycyAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX2ZpbmRRdWFsaWZpZXJzKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX2ZpbmRRdWFsaWZpZXJzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2ZpbmRRdWFsaWZpZXJzKik7CitTT0FQX0ZNQUM1IHVkZGkyX19maW5kUXVhbGlmaWVycyAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fZmluZFF1YWxpZmllcnMoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX2ZpbmRRdWFsaWZpZXJzKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX2VyckluZm8KKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19lcnJJbmZvICgyOSkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19lcnJJbmZvKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX2VyckluZm8gKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZXJySW5mbyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2VyckluZm8oc3RydWN0IHNvYXAqLCB1ZGRpMl9fZXJySW5mbyAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZXJySW5mbyAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fZXJySW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fZXJySW5mbyAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX2VyckluZm8gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19lcnJJbmZvKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX2VyckluZm8oc3RydWN0IHNvYXAqLCB1ZGRpMl9fZXJySW5mbyopOworU09BUF9GTUFDNSB1ZGRpMl9fZXJySW5mbyAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fZXJySW5mbyhzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fZXJySW5mbyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19lbWFpbAorI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2VtYWlsICgyOCkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19lbWFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19lbWFpbCAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19lbWFpbCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2VtYWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2VtYWlsICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19lbWFpbCAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fZW1haWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2VtYWlsICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fZW1haWwgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19lbWFpbChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19lbWFpbChzdHJ1Y3Qgc29hcCosIHVkZGkyX19lbWFpbCopOworU09BUF9GTUFDNSB1ZGRpMl9fZW1haWwgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2VtYWlsKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19lbWFpbChzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19kaXNwb3NpdGlvblJlcG9ydAorI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0ICgyNykKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19kaXNwb3NpdGlvblJlcG9ydChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0ICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0ICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19kaXNwb3NpdGlvblJlcG9ydChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19kaXNwb3NpdGlvblJlcG9ydChzdHJ1Y3Qgc29hcCosIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCopOworU09BUF9GTUFDNSB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0KHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19kaXNwb3NpdGlvblJlcG9ydChzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19kaXNjb3ZlcnlVUkxzCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fZGlzY292ZXJ5VVJMcyAoMjYpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fZGlzY292ZXJ5VVJMcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19kaXNjb3ZlcnlVUkxzICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2Rpc2NvdmVyeVVSTHMgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19kaXNjb3ZlcnlVUkxzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2Rpc2NvdmVyeVVSTHMgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2Rpc2NvdmVyeVVSTHMgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2Rpc2NvdmVyeVVSTHMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2Rpc2NvdmVyeVVSTHMgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19kaXNjb3ZlcnlVUkxzICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fZGlzY292ZXJ5VVJMcyhzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19kaXNjb3ZlcnlVUkxzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2Rpc2NvdmVyeVVSTHMqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2Rpc2NvdmVyeVVSTHMgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2Rpc2NvdmVyeVVSTHMoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX2Rpc2NvdmVyeVVSTHMoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fZGlzY292ZXJ5VVJMCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fZGlzY292ZXJ5VVJMICgyNSkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19kaXNjb3ZlcnlVUkwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fZGlzY292ZXJ5VVJMICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2Rpc2NvdmVyeVVSTCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2Rpc2NvdmVyeVVSTChzdHJ1Y3Qgc29hcCosIHVkZGkyX19kaXNjb3ZlcnlVUkwgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2Rpc2NvdmVyeVVSTCAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fZGlzY292ZXJ5VVJMKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19kaXNjb3ZlcnlVUkwgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19kaXNjb3ZlcnlVUkwgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19kaXNjb3ZlcnlVUkwoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fZGlzY292ZXJ5VVJMKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2Rpc2NvdmVyeVVSTCopOworU09BUF9GTUFDNSB1ZGRpMl9fZGlzY292ZXJ5VVJMICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19kaXNjb3ZlcnlVUkwoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX2Rpc2NvdmVyeVVSTChzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19kZXNjcmlwdGlvbgorI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2Rlc2NyaXB0aW9uICgyNCkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19kZXNjcmlwdGlvbihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19kZXNjcmlwdGlvbiAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19kZXNjcmlwdGlvbiAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2Rlc2NyaXB0aW9uKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2Rlc2NyaXB0aW9uICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19kZXNjcmlwdGlvbiAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fZGVzY3JpcHRpb24oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2Rlc2NyaXB0aW9uICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fZGVzY3JpcHRpb24gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19kZXNjcmlwdGlvbihzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19kZXNjcmlwdGlvbihzdHJ1Y3Qgc29hcCosIHVkZGkyX19kZXNjcmlwdGlvbiopOworU09BUF9GTUFDNSB1ZGRpMl9fZGVzY3JpcHRpb24gKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2Rlc2NyaXB0aW9uKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19kZXNjcmlwdGlvbihzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19jb250YWN0cworI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2NvbnRhY3RzICgyMykKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19jb250YWN0cyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19jb250YWN0cyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19jb250YWN0cyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2NvbnRhY3RzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2NvbnRhY3RzICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19jb250YWN0cyAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fY29udGFjdHMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2NvbnRhY3RzICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fY29udGFjdHMgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19jb250YWN0cyhzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19jb250YWN0cyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19jb250YWN0cyopOworU09BUF9GTUFDNSB1ZGRpMl9fY29udGFjdHMgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2NvbnRhY3RzKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19jb250YWN0cyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19jb250YWN0CisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fY29udGFjdCAoMjIpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fY29udGFjdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHVkZGkyX19jb250YWN0ICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2NvbnRhY3QgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19jb250YWN0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX2NvbnRhY3QgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2NvbnRhY3QgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2NvbnRhY3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2NvbnRhY3QgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19jb250YWN0ICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fY29udGFjdChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3VkZGkyX19jb250YWN0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX2NvbnRhY3QqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2NvbnRhY3QgKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfdWRkaTJfX2NvbnRhY3Qoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX2NvbnRhY3Qoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fY2F0ZWdvcnlCYWcKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19jYXRlZ29yeUJhZyAoMjEpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fY2F0ZWdvcnlCYWcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fY2F0ZWdvcnlCYWcgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fY2F0ZWdvcnlCYWcgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19jYXRlZ29yeUJhZyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19jYXRlZ29yeUJhZyAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fY2F0ZWdvcnlCYWcgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2NhdGVnb3J5QmFnKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19jYXRlZ29yeUJhZyAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX2NhdGVnb3J5QmFnICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fY2F0ZWdvcnlCYWcoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fY2F0ZWdvcnlCYWcoc3RydWN0IHNvYXAqLCB1ZGRpMl9fY2F0ZWdvcnlCYWcqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2NhdGVnb3J5QmFnICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19jYXRlZ29yeUJhZyhzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fY2F0ZWdvcnlCYWcoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlcworI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2J1c2luZXNzU2VydmljZXMgKDIwKQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX2J1c2luZXNzU2VydmljZXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlcyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc1NlcnZpY2VzICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc1NlcnZpY2VzICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc1NlcnZpY2VzICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19idXNpbmVzc1NlcnZpY2VzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19idXNpbmVzc1NlcnZpY2VzICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlcyAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX2J1c2luZXNzU2VydmljZXMoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc1NlcnZpY2VzKik7CitTT0FQX0ZNQUM1IHVkZGkyX19idXNpbmVzc1NlcnZpY2VzICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19idXNpbmVzc1NlcnZpY2VzKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19idXNpbmVzc1NlcnZpY2VzKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX2J1c2luZXNzU2VydmljZQorI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2J1c2luZXNzU2VydmljZSAoMTkpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX2J1c2luZXNzU2VydmljZSAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc1NlcnZpY2UgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19idXNpbmVzc1NlcnZpY2Uoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc1NlcnZpY2UgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2J1c2luZXNzU2VydmljZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX2J1c2luZXNzU2VydmljZShzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc1NlcnZpY2UqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2J1c2luZXNzU2VydmljZSAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19idXNpbmVzc1NlcnZpY2Uoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fYnVzaW5lc3NJbmZvcworI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2J1c2luZXNzSW5mb3MgKDE4KQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX2J1c2luZXNzSW5mb3Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fYnVzaW5lc3NJbmZvcyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc0luZm9zICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fYnVzaW5lc3NJbmZvcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc0luZm9zICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc0luZm9zICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19idXNpbmVzc0luZm9zKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19idXNpbmVzc0luZm9zICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fYnVzaW5lc3NJbmZvcyAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX2J1c2luZXNzSW5mb3Moc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fYnVzaW5lc3NJbmZvcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc0luZm9zKik7CitTT0FQX0ZNQUM1IHVkZGkyX19idXNpbmVzc0luZm9zICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19idXNpbmVzc0luZm9zKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19idXNpbmVzc0luZm9zKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX2J1c2luZXNzSW5mbworI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2J1c2luZXNzSW5mbyAoMTcpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fYnVzaW5lc3NJbmZvKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX2J1c2luZXNzSW5mbyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc0luZm8gKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19idXNpbmVzc0luZm8oc3RydWN0IHNvYXAqLCB1ZGRpMl9fYnVzaW5lc3NJbmZvICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc0luZm8gKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2J1c2luZXNzSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fYnVzaW5lc3NJbmZvICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fYnVzaW5lc3NJbmZvICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fYnVzaW5lc3NJbmZvKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX2J1c2luZXNzSW5mbyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc0luZm8qKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2J1c2luZXNzSW5mbyAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fYnVzaW5lc3NJbmZvKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19idXNpbmVzc0luZm8oc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19idXNpbmVzc0VudGl0eUV4dCAoMTYpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19idXNpbmVzc0VudGl0eUV4dChzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc0VudGl0eUV4dCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2J1c2luZXNzRW50aXR5RXh0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19idXNpbmVzc0VudGl0eUV4dCAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX2J1c2luZXNzRW50aXR5RXh0ICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2J1c2luZXNzRW50aXR5RXh0ICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19idXNpbmVzc0VudGl0eUV4dChzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fYnVzaW5lc3NFbnRpdHkKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19idXNpbmVzc0VudGl0eSAoMTUpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fYnVzaW5lc3NFbnRpdHkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fYnVzaW5lc3NFbnRpdHkgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fYnVzaW5lc3NFbnRpdHkgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19idXNpbmVzc0VudGl0eShzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc0VudGl0eSAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fYnVzaW5lc3NFbnRpdHkgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2J1c2luZXNzRW50aXR5KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19idXNpbmVzc0VudGl0eSAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX2J1c2luZXNzRW50aXR5ICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fYnVzaW5lc3NFbnRpdHkoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fYnVzaW5lc3NFbnRpdHkoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYnVzaW5lc3NFbnRpdHkqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2J1c2luZXNzRW50aXR5ICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19idXNpbmVzc0VudGl0eShzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fYnVzaW5lc3NFbnRpdHkoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fYmluZGluZ1RlbXBsYXRlcworI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZXMgKDE0KQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlcyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19iaW5kaW5nVGVtcGxhdGVzICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fYmluZGluZ1RlbXBsYXRlcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19iaW5kaW5nVGVtcGxhdGVzICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19iaW5kaW5nVGVtcGxhdGVzICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19iaW5kaW5nVGVtcGxhdGVzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19iaW5kaW5nVGVtcGxhdGVzICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlcyAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZXMoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fYmluZGluZ1RlbXBsYXRlcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19iaW5kaW5nVGVtcGxhdGVzKik7CitTT0FQX0ZNQUM1IHVkZGkyX19iaW5kaW5nVGVtcGxhdGVzICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19iaW5kaW5nVGVtcGxhdGVzKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19iaW5kaW5nVGVtcGxhdGVzKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZQorI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZSAoMTMpCisjZW5kaWYKKworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fYmluZGluZ1RlbXBsYXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZSAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19iaW5kaW5nVGVtcGxhdGUgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19iaW5kaW5nVGVtcGxhdGUoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19iaW5kaW5nVGVtcGxhdGUgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlICogU09BUF9GTUFDNiBzb2FwX25ld191ZGRpMl9fYmluZGluZ1RlbXBsYXRlKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZShzdHJ1Y3Qgc29hcCosIHVkZGkyX19iaW5kaW5nVGVtcGxhdGUqKTsKK1NPQVBfRk1BQzUgdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZSAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fYmluZGluZ1RlbXBsYXRlKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19iaW5kaW5nVGVtcGxhdGUoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbQorI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW0gKDEyKQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW0oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCB1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbSAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbShzdHJ1Y3Qgc29hcCosIHVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtICosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSB1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbSAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW0oc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV91ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbShzdHJ1Y3Qgc29hcCosIHVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtKik7CitTT0FQX0ZNQUM1IHVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3VkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3VkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX2FkZHJlc3NMaW5lCisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fYWRkcmVzc0xpbmUgKDExKQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX2FkZHJlc3NMaW5lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX2FkZHJlc3NMaW5lICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2FkZHJlc3NMaW5lICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fYWRkcmVzc0xpbmUoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYWRkcmVzc0xpbmUgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2FkZHJlc3NMaW5lICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19hZGRyZXNzTGluZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fYWRkcmVzc0xpbmUgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19hZGRyZXNzTGluZSAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX2FkZHJlc3NMaW5lKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX2FkZHJlc3NMaW5lKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2FkZHJlc3NMaW5lKik7CitTT0FQX0ZNQUM1IHVkZGkyX19hZGRyZXNzTGluZSAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fYWRkcmVzc0xpbmUoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX2FkZHJlc3NMaW5lKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfdWRkaTJfX2FkZHJlc3MKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19hZGRyZXNzICgxMCkKKyNlbmRpZgorCitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19hZGRyZXNzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX2FkZHJlc3MgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fYWRkcmVzcyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX2FkZHJlc3Moc3RydWN0IHNvYXAqLCB1ZGRpMl9fYWRkcmVzcyAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fYWRkcmVzcyAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fYWRkcmVzcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fYWRkcmVzcyAqLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgdWRkaTJfX2FkZHJlc3MgKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3VkZGkyX19hZGRyZXNzKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX2FkZHJlc3Moc3RydWN0IHNvYXAqLCB1ZGRpMl9fYWRkcmVzcyopOworU09BUF9GTUFDNSB1ZGRpMl9fYWRkcmVzcyAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fYWRkcmVzcyhzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV91ZGRpMl9fYWRkcmVzcyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19hY2Nlc3NQb2ludAorI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2FjY2Vzc1BvaW50ICg5KQorI2VuZGlmCisKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX2FjY2Vzc1BvaW50KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3QgdWRkaTJfX2FjY2Vzc1BvaW50ICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2FjY2Vzc1BvaW50ICogU09BUF9GTUFDNCBzb2FwX2dldF91ZGRpMl9fYWNjZXNzUG9pbnQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYWNjZXNzUG9pbnQgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2FjY2Vzc1BvaW50ICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19hY2Nlc3NQb2ludChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fYWNjZXNzUG9pbnQgKiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHVkZGkyX19hY2Nlc3NQb2ludCAqIFNPQVBfRk1BQzYgc29hcF9uZXdfdWRkaTJfX2FjY2Vzc1BvaW50KHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfdWRkaTJfX2FjY2Vzc1BvaW50KHN0cnVjdCBzb2FwKiwgdWRkaTJfX2FjY2Vzc1BvaW50Kik7CitTT0FQX0ZNQUM1IHVkZGkyX19hY2Nlc3NQb2ludCAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV91ZGRpMl9fYWNjZXNzUG9pbnQoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfdWRkaTJfX2FjY2Vzc1BvaW50KHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBXSVRIX05PR0xPQkFMCisKKyNpZm5kZWYgU09BUF9UWVBFX1NPQVBfRU5WX19GYXVsdAorI2RlZmluZSBTT0FQX1RZUEVfU09BUF9FTlZfX0ZhdWx0ICgzODkpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1NPQVBfRU5WX19GYXVsdChzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0cnVjdCBTT0FQX0VOVl9fRmF1bHQgKik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfU09BUF9FTlZfX0ZhdWx0KHN0cnVjdCBzb2FwKiwgc3RydWN0IFNPQVBfRU5WX19GYXVsdCAqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfU09BUF9FTlZfX0ZhdWx0KHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RydWN0IFNPQVBfRU5WX19GYXVsdCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9TT0FQX0VOVl9fRmF1bHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdHJ1Y3QgU09BUF9FTlZfX0ZhdWx0ICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RydWN0IFNPQVBfRU5WX19GYXVsdCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfU09BUF9FTlZfX0ZhdWx0KHN0cnVjdCBzb2FwKiwgc3RydWN0IFNPQVBfRU5WX19GYXVsdCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgU09BUF9FTlZfX0ZhdWx0ICogU09BUF9GTUFDNCBzb2FwX2luX1NPQVBfRU5WX19GYXVsdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdHJ1Y3QgU09BUF9FTlZfX0ZhdWx0ICosIGNvbnN0IGNoYXIqKTsKKworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9OT0dMT0JBTAorCisjaWZuZGVmIFNPQVBfVFlQRV9TT0FQX0VOVl9fRGV0YWlsCisjZGVmaW5lIFNPQVBfVFlQRV9TT0FQX0VOVl9fRGV0YWlsICgzODgpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1NPQVBfRU5WX19EZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgU09BUF9FTlZfX0RldGFpbCAqKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9TT0FQX0VOVl9fRGV0YWlsKHN0cnVjdCBzb2FwKiwgc3RydWN0IFNPQVBfRU5WX19EZXRhaWwgKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1NPQVBfRU5WX19EZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgU09BUF9FTlZfX0RldGFpbCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9TT0FQX0VOVl9fRGV0YWlsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RydWN0IFNPQVBfRU5WX19EZXRhaWwgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgU09BUF9FTlZfX0RldGFpbCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfU09BUF9FTlZfX0RldGFpbChzdHJ1Y3Qgc29hcCosIHN0cnVjdCBTT0FQX0VOVl9fRGV0YWlsICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBTT0FQX0VOVl9fRGV0YWlsICogU09BUF9GTUFDNCBzb2FwX2luX1NPQVBfRU5WX19EZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RydWN0IFNPQVBfRU5WX19EZXRhaWwgKiwgY29uc3QgY2hhciopOworCisjZW5kaWYKKworI2lmbmRlZiBXSVRIX05PR0xPQkFMCisKKyNpZm5kZWYgU09BUF9UWVBFX1NPQVBfRU5WX19Db2RlCisjZGVmaW5lIFNPQVBfVFlQRV9TT0FQX0VOVl9fQ29kZSAoMzg3KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9TT0FQX0VOVl9fQ29kZShzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0cnVjdCBTT0FQX0VOVl9fQ29kZSAqKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9TT0FQX0VOVl9fQ29kZShzdHJ1Y3Qgc29hcCosIHN0cnVjdCBTT0FQX0VOVl9fQ29kZSAqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfU09BUF9FTlZfX0NvZGUoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgU09BUF9FTlZfX0NvZGUgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfU09BUF9FTlZfX0NvZGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdHJ1Y3QgU09BUF9FTlZfX0NvZGUgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgU09BUF9FTlZfX0NvZGUgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1NPQVBfRU5WX19Db2RlKHN0cnVjdCBzb2FwKiwgc3RydWN0IFNPQVBfRU5WX19Db2RlICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBTT0FQX0VOVl9fQ29kZSAqIFNPQVBfRk1BQzQgc29hcF9pbl9TT0FQX0VOVl9fQ29kZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdHJ1Y3QgU09BUF9FTlZfX0NvZGUgKiwgY29uc3QgY2hhciopOworCisjZW5kaWYKKworI2lmbmRlZiBXSVRIX05PR0xPQkFMCisKKyNpZm5kZWYgU09BUF9UWVBFX1NPQVBfRU5WX19IZWFkZXIKKyNkZWZpbmUgU09BUF9UWVBFX1NPQVBfRU5WX19IZWFkZXIgKDM4NikKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfU09BUF9FTlZfX0hlYWRlcihzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0cnVjdCBTT0FQX0VOVl9fSGVhZGVyICopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X1NPQVBfRU5WX19IZWFkZXIoc3RydWN0IHNvYXAqLCBzdHJ1Y3QgU09BUF9FTlZfX0hlYWRlciAqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfU09BUF9FTlZfX0hlYWRlcihzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0cnVjdCBTT0FQX0VOVl9fSGVhZGVyICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1NPQVBfRU5WX19IZWFkZXIoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdHJ1Y3QgU09BUF9FTlZfX0hlYWRlciAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBTT0FQX0VOVl9fSGVhZGVyICogU09BUF9GTUFDNCBzb2FwX2dldF9TT0FQX0VOVl9fSGVhZGVyKHN0cnVjdCBzb2FwKiwgc3RydWN0IFNPQVBfRU5WX19IZWFkZXIgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RydWN0IFNPQVBfRU5WX19IZWFkZXIgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fU09BUF9FTlZfX0hlYWRlcihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdHJ1Y3QgU09BUF9FTlZfX0hlYWRlciAqLCBjb25zdCBjaGFyKik7CisKKyNlbmRpZgorCisjaWZuZGVmIFNPQVBfVFlQRV9fX3B1YjJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zCisjZGVmaW5lIFNPQVBfVFlQRV9fX3B1YjJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICgzODQpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX19fcHViMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19wdWIyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9fX3B1YjJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgc3RydWN0IF9fcHViMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X19fcHViMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19wdWIyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9fX3B1YjJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RydWN0IF9fcHViMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgX19wdWIyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfX19wdWIyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIHN0cnVjdCBfX3B1YjJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBfX3B1YjJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICogU09BUF9GTUFDNCBzb2FwX2luX19fcHViMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RydWN0IF9fcHViMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9fX3B1YjJfX3NhdmVfVVNDT1JFdE1vZGVsCisjZGVmaW5lIFNPQVBfVFlQRV9fX3B1YjJfX3NhdmVfVVNDT1JFdE1vZGVsICgzODEpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX19fcHViMl9fc2F2ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19wdWIyX19zYXZlX1VTQ09SRXRNb2RlbCAqKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9fX3B1YjJfX3NhdmVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgc3RydWN0IF9fcHViMl9fc2F2ZV9VU0NPUkV0TW9kZWwgKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X19fcHViMl9fc2F2ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19wdWIyX19zYXZlX1VTQ09SRXRNb2RlbCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9fX3B1YjJfX3NhdmVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RydWN0IF9fcHViMl9fc2F2ZV9VU0NPUkV0TW9kZWwgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgX19wdWIyX19zYXZlX1VTQ09SRXRNb2RlbCAqIFNPQVBfRk1BQzQgc29hcF9nZXRfX19wdWIyX19zYXZlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIHN0cnVjdCBfX3B1YjJfX3NhdmVfVVNDT1JFdE1vZGVsICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBfX3B1YjJfX3NhdmVfVVNDT1JFdE1vZGVsICogU09BUF9GTUFDNCBzb2FwX2luX19fcHViMl9fc2F2ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RydWN0IF9fcHViMl9fc2F2ZV9VU0NPUkV0TW9kZWwgKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9fX3B1YjJfX3NhdmVfVVNDT1JFc2VydmljZQorI2RlZmluZSBTT0FQX1RZUEVfX19wdWIyX19zYXZlX1VTQ09SRXNlcnZpY2UgKDM3OCkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfX19wdWIyX19zYXZlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19wdWIyX19zYXZlX1VTQ09SRXNlcnZpY2UgKik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfX19wdWIyX19zYXZlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBzdHJ1Y3QgX19wdWIyX19zYXZlX1VTQ09SRXNlcnZpY2UgKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X19fcHViMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RydWN0IF9fcHViMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X19fcHViMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RydWN0IF9fcHViMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RydWN0IF9fcHViMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlICogU09BUF9GTUFDNCBzb2FwX2dldF9fX3B1YjJfX3NhdmVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIHN0cnVjdCBfX3B1YjJfX3NhdmVfVVNDT1JFc2VydmljZSAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgX19wdWIyX19zYXZlX1VTQ09SRXNlcnZpY2UgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fX19wdWIyX19zYXZlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RydWN0IF9fcHViMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlICosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfX19wdWIyX19zYXZlX1VTQ09SRWJ1c2luZXNzCisjZGVmaW5lIFNPQVBfVFlQRV9fX3B1YjJfX3NhdmVfVVNDT1JFYnVzaW5lc3MgKDM3NSkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfX19wdWIyX19zYXZlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RydWN0IF9fcHViMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyAqKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9fX3B1YjJfX3NhdmVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBzdHJ1Y3QgX19wdWIyX19zYXZlX1VTQ09SRWJ1c2luZXNzICopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9fX3B1YjJfX3NhdmVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19wdWIyX19zYXZlX1VTQ09SRWJ1c2luZXNzICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X19fcHViMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHN0cnVjdCBfX3B1YjJfX3NhdmVfVVNDT1JFYnVzaW5lc3MgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgX19wdWIyX19zYXZlX1VTQ09SRWJ1c2luZXNzICogU09BUF9GTUFDNCBzb2FwX2dldF9fX3B1YjJfX3NhdmVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBzdHJ1Y3QgX19wdWIyX19zYXZlX1VTQ09SRWJ1c2luZXNzICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBfX3B1YjJfX3NhdmVfVVNDT1JFYnVzaW5lc3MgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fX19wdWIyX19zYXZlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHN0cnVjdCBfX3B1YjJfX3NhdmVfVVNDT1JFYnVzaW5lc3MgKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9fX3B1YjJfX3NhdmVfVVNDT1JFYmluZGluZworI2RlZmluZSBTT0FQX1RZUEVfX19wdWIyX19zYXZlX1VTQ09SRWJpbmRpbmcgKDM3MikKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfX19wdWIyX19zYXZlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19wdWIyX19zYXZlX1VTQ09SRWJpbmRpbmcgKik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfX19wdWIyX19zYXZlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBzdHJ1Y3QgX19wdWIyX19zYXZlX1VTQ09SRWJpbmRpbmcgKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X19fcHViMl9fc2F2ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RydWN0IF9fcHViMl9fc2F2ZV9VU0NPUkViaW5kaW5nICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X19fcHViMl9fc2F2ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RydWN0IF9fcHViMl9fc2F2ZV9VU0NPUkViaW5kaW5nICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RydWN0IF9fcHViMl9fc2F2ZV9VU0NPUkViaW5kaW5nICogU09BUF9GTUFDNCBzb2FwX2dldF9fX3B1YjJfX3NhdmVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIHN0cnVjdCBfX3B1YjJfX3NhdmVfVVNDT1JFYmluZGluZyAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgX19wdWIyX19zYXZlX1VTQ09SRWJpbmRpbmcgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fX19wdWIyX19zYXZlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RydWN0IF9fcHViMl9fc2F2ZV9VU0NPUkViaW5kaW5nICosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfX19wdWIyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8KKyNkZWZpbmUgU09BUF9UWVBFX19fcHViMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvICgzNjkpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX19fcHViMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RydWN0IF9fcHViMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvICopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X19fcHViMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvKHN0cnVjdCBzb2FwKiwgc3RydWN0IF9fcHViMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvICopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9fX3B1YjJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0cnVjdCBfX3B1YjJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9fX3B1YjJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHN0cnVjdCBfX3B1YjJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBfX3B1YjJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfX19wdWIyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8oc3RydWN0IHNvYXAqLCBzdHJ1Y3QgX19wdWIyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8gKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RydWN0IF9fcHViMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvICogU09BUF9GTUFDNCBzb2FwX2luX19fcHViMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHN0cnVjdCBfX3B1YjJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyAqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX19fcHViMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMKKyNkZWZpbmUgU09BUF9UWVBFX19fcHViMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKDM2NikKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfX19wdWIyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0cnVjdCBfX3B1YjJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X19fcHViMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBzdHJ1Y3QgX19wdWIyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfX19wdWIyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0cnVjdCBfX3B1YjJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X19fcHViMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdHJ1Y3QgX19wdWIyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBfX3B1YjJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICogU09BUF9GTUFDNCBzb2FwX2dldF9fX3B1YjJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgc3RydWN0IF9fcHViMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RydWN0IF9fcHViMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fX19wdWIyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdHJ1Y3QgX19wdWIyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX19fcHViMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbgorI2RlZmluZSBTT0FQX1RZUEVfX19wdWIyX19nZXRfVVNDT1JFYXV0aFRva2VuICgzNjMpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX19fcHViMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0cnVjdCBfX3B1YjJfX2dldF9VU0NPUkVhdXRoVG9rZW4gKik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfX19wdWIyX19nZXRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgc3RydWN0IF9fcHViMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbiAqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfX19wdWIyX19nZXRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RydWN0IF9fcHViMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbiAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9fX3B1YjJfX2dldF9VU0NPUkVhdXRoVG9rZW4oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdHJ1Y3QgX19wdWIyX19nZXRfVVNDT1JFYXV0aFRva2VuICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RydWN0IF9fcHViMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbiAqIFNPQVBfRk1BQzQgc29hcF9nZXRfX19wdWIyX19nZXRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgc3RydWN0IF9fcHViMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbiAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgX19wdWIyX19nZXRfVVNDT1JFYXV0aFRva2VuICogU09BUF9GTUFDNCBzb2FwX2luX19fcHViMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdHJ1Y3QgX19wdWIyX19nZXRfVVNDT1JFYXV0aFRva2VuICosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfX19wdWIyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0CisjZGVmaW5lIFNPQVBfVFlQRV9fX3B1YjJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQgKDM2MCkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfX19wdWIyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RydWN0IF9fcHViMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCAqKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9fX3B1YjJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQoc3RydWN0IHNvYXAqLCBzdHJ1Y3QgX19wdWIyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0ICopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9fX3B1YjJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19wdWIyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0ICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X19fcHViMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHN0cnVjdCBfX3B1YjJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgX19wdWIyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0ICogU09BUF9GTUFDNCBzb2FwX2dldF9fX3B1YjJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQoc3RydWN0IHNvYXAqLCBzdHJ1Y3QgX19wdWIyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0ICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBfX3B1YjJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fX19wdWIyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHN0cnVjdCBfX3B1YjJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQgKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9fX3B1YjJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuCisjZGVmaW5lIFNPQVBfVFlQRV9fX3B1YjJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuICgzNTcpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX19fcHViMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4oc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19wdWIyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbiAqKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9fX3B1YjJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgc3RydWN0IF9fcHViMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4gKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X19fcHViMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4oc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19wdWIyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbiAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9fX3B1YjJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RydWN0IF9fcHViMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4gKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgX19wdWIyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbiAqIFNPQVBfRk1BQzQgc29hcF9nZXRfX19wdWIyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIHN0cnVjdCBfX3B1YjJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBfX3B1YjJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuICogU09BUF9GTUFDNCBzb2FwX2luX19fcHViMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RydWN0IF9fcHViMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4gKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9fX3B1YjJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwKKyNkZWZpbmUgU09BUF9UWVBFX19fcHViMl9fZGVsZXRlX1VTQ09SRXRNb2RlbCAoMzU0KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9fX3B1YjJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19wdWIyX19kZWxldGVfVVNDT1JFdE1vZGVsICopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X19fcHViMl9fZGVsZXRlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIHN0cnVjdCBfX3B1YjJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwgKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X19fcHViMl9fZGVsZXRlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0cnVjdCBfX3B1YjJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfX19wdWIyX19kZWxldGVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RydWN0IF9fcHViMl9fZGVsZXRlX1VTQ09SRXRNb2RlbCAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBfX3B1YjJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X19fcHViMl9fZGVsZXRlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIHN0cnVjdCBfX3B1YjJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RydWN0IF9fcHViMl9fZGVsZXRlX1VTQ09SRXRNb2RlbCAqIFNPQVBfRk1BQzQgc29hcF9pbl9fX3B1YjJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RydWN0IF9fcHViMl9fZGVsZXRlX1VTQ09SRXRNb2RlbCAqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX19fcHViMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UKKyNkZWZpbmUgU09BUF9UWVBFX19fcHViMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UgKDM1MSkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfX19wdWIyX19kZWxldGVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0cnVjdCBfX3B1YjJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlICopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X19fcHViMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBzdHJ1Y3QgX19wdWIyX19kZWxldGVfVVNDT1JFc2VydmljZSAqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfX19wdWIyX19kZWxldGVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0cnVjdCBfX3B1YjJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X19fcHViMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdHJ1Y3QgX19wdWIyX19kZWxldGVfVVNDT1JFc2VydmljZSAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBfX3B1YjJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlICogU09BUF9GTUFDNCBzb2FwX2dldF9fX3B1YjJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgc3RydWN0IF9fcHViMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RydWN0IF9fcHViMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fX19wdWIyX19kZWxldGVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdHJ1Y3QgX19wdWIyX19kZWxldGVfVVNDT1JFc2VydmljZSAqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX19fcHViMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMKKyNkZWZpbmUgU09BUF9UWVBFX19fcHViMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKDM0OCkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfX19wdWIyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0cnVjdCBfX3B1YjJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X19fcHViMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBzdHJ1Y3QgX19wdWIyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfX19wdWIyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0cnVjdCBfX3B1YjJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X19fcHViMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdHJ1Y3QgX19wdWIyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBfX3B1YjJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICogU09BUF9GTUFDNCBzb2FwX2dldF9fX3B1YjJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgc3RydWN0IF9fcHViMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RydWN0IF9fcHViMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fX19wdWIyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdHJ1Y3QgX19wdWIyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX19fcHViMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzCisjZGVmaW5lIFNPQVBfVFlQRV9fX3B1YjJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyAoMzQ1KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9fX3B1YjJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0cnVjdCBfX3B1YjJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyAqKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9fX3B1YjJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIHN0cnVjdCBfX3B1YjJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyAqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfX19wdWIyX19kZWxldGVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19wdWIyX19kZWxldGVfVVNDT1JFYnVzaW5lc3MgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfX19wdWIyX19kZWxldGVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdHJ1Y3QgX19wdWIyX19kZWxldGVfVVNDT1JFYnVzaW5lc3MgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgX19wdWIyX19kZWxldGVfVVNDT1JFYnVzaW5lc3MgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X19fcHViMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKiwgc3RydWN0IF9fcHViMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBfX3B1YjJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyAqIFNPQVBfRk1BQzQgc29hcF9pbl9fX3B1YjJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdHJ1Y3QgX19wdWIyX19kZWxldGVfVVNDT1JFYnVzaW5lc3MgKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9fX3B1YjJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nCisjZGVmaW5lIFNPQVBfVFlQRV9fX3B1YjJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nICgzNDIpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX19fcHViMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19wdWIyX19kZWxldGVfVVNDT1JFYmluZGluZyAqKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9fX3B1YjJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgc3RydWN0IF9fcHViMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcgKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X19fcHViMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19wdWIyX19kZWxldGVfVVNDT1JFYmluZGluZyAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9fX3B1YjJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RydWN0IF9fcHViMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgX19wdWIyX19kZWxldGVfVVNDT1JFYmluZGluZyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfX19wdWIyX19kZWxldGVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIHN0cnVjdCBfX3B1YjJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBfX3B1YjJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nICogU09BUF9GTUFDNCBzb2FwX2luX19fcHViMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RydWN0IF9fcHViMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcgKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9fX3B1YjJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zCisjZGVmaW5lIFNPQVBfVFlQRV9fX3B1YjJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICgzMzkpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX19fcHViMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19wdWIyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9fX3B1YjJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgc3RydWN0IF9fcHViMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X19fcHViMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19wdWIyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9fX3B1YjJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RydWN0IF9fcHViMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgX19wdWIyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfX19wdWIyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIHN0cnVjdCBfX3B1YjJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBfX3B1YjJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICogU09BUF9GTUFDNCBzb2FwX2luX19fcHViMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RydWN0IF9fcHViMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9fX2lucTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwKKyNkZWZpbmUgU09BUF9UWVBFX19faW5xMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbCAoMzM2KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9fX2lucTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19pbnEyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsICopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X19faW5xMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbChzdHJ1Y3Qgc29hcCosIHN0cnVjdCBfX2lucTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwgKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X19faW5xMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0cnVjdCBfX2lucTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfX19pbnEyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RydWN0IF9faW5xMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbCAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBfX2lucTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X19faW5xMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbChzdHJ1Y3Qgc29hcCosIHN0cnVjdCBfX2lucTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RydWN0IF9faW5xMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbCAqIFNPQVBfRk1BQzQgc29hcF9pbl9fX2lucTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RydWN0IF9faW5xMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbCAqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX19faW5xMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwKKyNkZWZpbmUgU09BUF9UWVBFX19faW5xMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwgKDMzMykKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfX19pbnEyX19nZXRfVVNDT1JFc2VydmljZURldGFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0cnVjdCBfX2lucTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsICopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X19faW5xMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwoc3RydWN0IHNvYXAqLCBzdHJ1Y3QgX19pbnEyX19nZXRfVVNDT1JFc2VydmljZURldGFpbCAqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfX19pbnEyX19nZXRfVVNDT1JFc2VydmljZURldGFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0cnVjdCBfX2lucTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X19faW5xMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdHJ1Y3QgX19pbnEyX19nZXRfVVNDT1JFc2VydmljZURldGFpbCAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBfX2lucTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsICogU09BUF9GTUFDNCBzb2FwX2dldF9fX2lucTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsKHN0cnVjdCBzb2FwKiwgc3RydWN0IF9faW5xMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RydWN0IF9faW5xMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fX19pbnEyX19nZXRfVVNDT1JFc2VydmljZURldGFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdHJ1Y3QgX19pbnEyX19nZXRfVVNDT1JFc2VydmljZURldGFpbCAqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX19faW5xMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0CisjZGVmaW5lIFNPQVBfVFlQRV9fX2lucTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dCAoMzMwKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9fX2lucTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dChzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0cnVjdCBfX2lucTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dCAqKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9fX2lucTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dChzdHJ1Y3Qgc29hcCosIHN0cnVjdCBfX2lucTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dCAqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfX19pbnEyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19pbnEyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfX19pbnEyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdHJ1Y3QgX19pbnEyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgX19pbnEyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X19faW5xMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0KHN0cnVjdCBzb2FwKiwgc3RydWN0IF9faW5xMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0ICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBfX2lucTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dCAqIFNPQVBfRk1BQzQgc29hcF9pbl9fX2lucTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdHJ1Y3QgX19pbnEyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQgKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9fX2lucTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbAorI2RlZmluZSBTT0FQX1RZUEVfX19pbnEyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwgKDMyNykKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfX19pbnEyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19pbnEyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwgKik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfX19pbnEyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwoc3RydWN0IHNvYXAqLCBzdHJ1Y3QgX19pbnEyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwgKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X19faW5xMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RydWN0IF9faW5xMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X19faW5xMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RydWN0IF9faW5xMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RydWN0IF9faW5xMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsICogU09BUF9GTUFDNCBzb2FwX2dldF9fX2lucTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbChzdHJ1Y3Qgc29hcCosIHN0cnVjdCBfX2lucTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgX19pbnEyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fX19pbnEyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RydWN0IF9faW5xMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsICosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfX19pbnEyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbAorI2RlZmluZSBTT0FQX1RZUEVfX19pbnEyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbCAoMzI0KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9fX2lucTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RydWN0IF9faW5xMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwgKik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfX19pbnEyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbChzdHJ1Y3Qgc29hcCosIHN0cnVjdCBfX2lucTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsICopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9fX2lucTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RydWN0IF9faW5xMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfX19pbnEyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHN0cnVjdCBfX2lucTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RydWN0IF9faW5xMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X19faW5xMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwoc3RydWN0IHNvYXAqLCBzdHJ1Y3QgX19pbnEyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgX19pbnEyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbCAqIFNPQVBfRk1BQzQgc29hcF9pbl9fX2lucTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHN0cnVjdCBfX2lucTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsICosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfX19pbnEyX19maW5kX1VTQ09SRXRNb2RlbAorI2RlZmluZSBTT0FQX1RZUEVfX19pbnEyX19maW5kX1VTQ09SRXRNb2RlbCAoMzIxKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9fX2lucTJfX2ZpbmRfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RydWN0IF9faW5xMl9fZmluZF9VU0NPUkV0TW9kZWwgKik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfX19pbnEyX19maW5kX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIHN0cnVjdCBfX2lucTJfX2ZpbmRfVVNDT1JFdE1vZGVsICopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9fX2lucTJfX2ZpbmRfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RydWN0IF9faW5xMl9fZmluZF9VU0NPUkV0TW9kZWwgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfX19pbnEyX19maW5kX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHN0cnVjdCBfX2lucTJfX2ZpbmRfVVNDT1JFdE1vZGVsICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RydWN0IF9faW5xMl9fZmluZF9VU0NPUkV0TW9kZWwgKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X19faW5xMl9fZmluZF9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBzdHJ1Y3QgX19pbnEyX19maW5kX1VTQ09SRXRNb2RlbCAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgX19pbnEyX19maW5kX1VTQ09SRXRNb2RlbCAqIFNPQVBfRk1BQzQgc29hcF9pbl9fX2lucTJfX2ZpbmRfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHN0cnVjdCBfX2lucTJfX2ZpbmRfVVNDT1JFdE1vZGVsICosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfX19pbnEyX19maW5kX1VTQ09SRXNlcnZpY2UKKyNkZWZpbmUgU09BUF9UWVBFX19faW5xMl9fZmluZF9VU0NPUkVzZXJ2aWNlICgzMTgpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX19faW5xMl9fZmluZF9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RydWN0IF9faW5xMl9fZmluZF9VU0NPUkVzZXJ2aWNlICopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X19faW5xMl9fZmluZF9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgc3RydWN0IF9faW5xMl9fZmluZF9VU0NPUkVzZXJ2aWNlICopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9fX2lucTJfX2ZpbmRfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0cnVjdCBfX2lucTJfX2ZpbmRfVVNDT1JFc2VydmljZSAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9fX2lucTJfX2ZpbmRfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHN0cnVjdCBfX2lucTJfX2ZpbmRfVVNDT1JFc2VydmljZSAqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBfX2lucTJfX2ZpbmRfVVNDT1JFc2VydmljZSAqIFNPQVBfRk1BQzQgc29hcF9nZXRfX19pbnEyX19maW5kX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBzdHJ1Y3QgX19pbnEyX19maW5kX1VTQ09SRXNlcnZpY2UgKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RydWN0IF9faW5xMl9fZmluZF9VU0NPUkVzZXJ2aWNlICogU09BUF9GTUFDNCBzb2FwX2luX19faW5xMl9fZmluZF9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHN0cnVjdCBfX2lucTJfX2ZpbmRfVVNDT1JFc2VydmljZSAqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX19faW5xMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcworI2RlZmluZSBTT0FQX1RZUEVfX19pbnEyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzICgzMTUpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX19faW5xMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0cnVjdCBfX2lucTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMgKik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfX19pbnEyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzKHN0cnVjdCBzb2FwKiwgc3RydWN0IF9faW5xMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyAqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfX19pbnEyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RydWN0IF9faW5xMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9fX2lucTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdHJ1Y3QgX19pbnEyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RydWN0IF9faW5xMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyAqIFNPQVBfRk1BQzQgc29hcF9nZXRfX19pbnEyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzKHN0cnVjdCBzb2FwKiwgc3RydWN0IF9faW5xMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgX19pbnEyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzICogU09BUF9GTUFDNCBzb2FwX2luX19faW5xMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdHJ1Y3QgX19pbnEyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzICosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfX19pbnEyX19maW5kX1VTQ09SRWJ1c2luZXNzCisjZGVmaW5lIFNPQVBfVFlQRV9fX2lucTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MgKDMxMikKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfX19pbnEyX19maW5kX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RydWN0IF9faW5xMl9fZmluZF9VU0NPUkVidXNpbmVzcyAqKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9fX2lucTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBzdHJ1Y3QgX19pbnEyX19maW5kX1VTQ09SRWJ1c2luZXNzICopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9fX2lucTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19pbnEyX19maW5kX1VTQ09SRWJ1c2luZXNzICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X19faW5xMl9fZmluZF9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHN0cnVjdCBfX2lucTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MgKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgX19pbnEyX19maW5kX1VTQ09SRWJ1c2luZXNzICogU09BUF9GTUFDNCBzb2FwX2dldF9fX2lucTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBzdHJ1Y3QgX19pbnEyX19maW5kX1VTQ09SRWJ1c2luZXNzICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBfX2lucTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fX19pbnEyX19maW5kX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHN0cnVjdCBfX2lucTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MgKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9fX2lucTJfX2ZpbmRfVVNDT1JFYmluZGluZworI2RlZmluZSBTT0FQX1RZUEVfX19pbnEyX19maW5kX1VTQ09SRWJpbmRpbmcgKDMwOSkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfX19pbnEyX19maW5kX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBzdHJ1Y3QgX19pbnEyX19maW5kX1VTQ09SRWJpbmRpbmcgKik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfX19pbnEyX19maW5kX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBzdHJ1Y3QgX19pbnEyX19maW5kX1VTQ09SRWJpbmRpbmcgKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X19faW5xMl9fZmluZF9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RydWN0IF9faW5xMl9fZmluZF9VU0NPUkViaW5kaW5nICosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X19faW5xMl9fZmluZF9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RydWN0IF9faW5xMl9fZmluZF9VU0NPUkViaW5kaW5nICosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RydWN0IF9faW5xMl9fZmluZF9VU0NPUkViaW5kaW5nICogU09BUF9GTUFDNCBzb2FwX2dldF9fX2lucTJfX2ZpbmRfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIHN0cnVjdCBfX2lucTJfX2ZpbmRfVVNDT1JFYmluZGluZyAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgX19pbnEyX19maW5kX1VTQ09SRWJpbmRpbmcgKiBTT0FQX0ZNQUM0IHNvYXBfaW5fX19pbnEyX19maW5kX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RydWN0IF9faW5xMl9fZmluZF9VU0NPUkViaW5kaW5nICosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBXSVRIX05PR0xPQkFMCisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb1NPQVBfRU5WX19Db2RlCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG9TT0FQX0VOVl9fQ29kZSAoMzkxKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG9TT0FQX0VOVl9fQ29kZShzdHJ1Y3Qgc29hcCosIHN0cnVjdCBTT0FQX0VOVl9fQ29kZSAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvU09BUF9FTlZfX0NvZGUoc3RydWN0IHNvYXAqLCBzdHJ1Y3QgU09BUF9FTlZfX0NvZGUgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvU09BUF9FTlZfX0NvZGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgc3RydWN0IFNPQVBfRU5WX19Db2RlICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHN0cnVjdCBTT0FQX0VOVl9fQ29kZSAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb1NPQVBfRU5WX19Db2RlKHN0cnVjdCBzb2FwKiwgc3RydWN0IFNPQVBfRU5WX19Db2RlICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdHJ1Y3QgU09BUF9FTlZfX0NvZGUgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb1NPQVBfRU5WX19Db2RlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHN0cnVjdCBTT0FQX0VOVl9fQ29kZSAqKiwgY29uc3QgY2hhciopOworCisjZW5kaWYKKworI2lmbmRlZiBXSVRIX05PR0xPQkFMCisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb1NPQVBfRU5WX19EZXRhaWwKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb1NPQVBfRU5WX19EZXRhaWwgKDM5MCkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvU09BUF9FTlZfX0RldGFpbChzdHJ1Y3Qgc29hcCosIHN0cnVjdCBTT0FQX0VOVl9fRGV0YWlsICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG9TT0FQX0VOVl9fRGV0YWlsKHN0cnVjdCBzb2FwKiwgc3RydWN0IFNPQVBfRU5WX19EZXRhaWwgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvU09BUF9FTlZfX0RldGFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCBzdHJ1Y3QgU09BUF9FTlZfX0RldGFpbCAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyBzdHJ1Y3QgU09BUF9FTlZfX0RldGFpbCAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb1NPQVBfRU5WX19EZXRhaWwoc3RydWN0IHNvYXAqLCBzdHJ1Y3QgU09BUF9FTlZfX0RldGFpbCAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RydWN0IFNPQVBfRU5WX19EZXRhaWwgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb1NPQVBfRU5WX19EZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RydWN0IFNPQVBfRU5WX19EZXRhaWwgKiosIGNvbnN0IGNoYXIqKTsKKworI2VuZGlmCisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucworI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICgzODIpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwgKDM3OSkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbCAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbCAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbCAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlICgzNzYpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCB1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZSAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2UgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZSAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCB1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2UgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3MKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzICgzNzMpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3MgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3MgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3MgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3MgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3MgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZworI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZyAoMzcwKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZyAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZyAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZyAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8KKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8gKDM2NykKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8gKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8oc3RydWN0IHNvYXAqLCB1ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8gKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8gKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAoMzY0KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbiAoMzYxKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW4oc3RydWN0IHNvYXAqLCB1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbiAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW4gKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0CisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCAoMzU4KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydChzdHJ1Y3Qgc29hcCosIHVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0ICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydChzdHJ1Y3Qgc29hcCosIHVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0ICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0ICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0ICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0ICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbgorI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuICgzNTUpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIHVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbiAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4gKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4gKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4gKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsICgzNTIpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIHVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbCAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UgKDM0OSkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZSAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZSAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZSAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAoMzQ2KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3MKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3MgKDM0MykKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3MgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3MgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3MgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19kZWxldGVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyAoMzQwKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucworI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICgzMzcpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsICgzMzQpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbChzdHJ1Y3Qgc29hcCosIHVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbCAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwgKDMzMSkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbCAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbCAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbCAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0CisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0ICgzMjgpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0ICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dCAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dCAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0ICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0ICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbAorI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbCAoMzI1KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbCAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbChzdHJ1Y3Qgc29hcCosIHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbCAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbCAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbAorI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsICgzMjIpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbChzdHJ1Y3Qgc29hcCosIHVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbCAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWwgKDMxOSkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWwgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19maW5kX1VTQ09SRXRNb2RlbCAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWwgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWwgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19maW5kX1VTQ09SRXRNb2RlbCAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19maW5kX1VTQ09SRXRNb2RlbCAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlICgzMTYpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19maW5kX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZSAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2UgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZSAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19maW5kX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2UgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzICgzMTMpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzICgzMTApCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzcyAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZworI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZyAoMzA3KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZyAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmcgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmcgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZyAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZyAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvcworI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zICgzMDUpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvcyAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mb3MgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm9zICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mb3MgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mb3MgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluZm9zCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsSW5mb3MgKDMwNCkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluZm9zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3RNb2RlbEluZm9zICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsSW5mb3Moc3RydWN0IHNvYXAqLCB1ZGRpMl9fdE1vZGVsSW5mb3MgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluZm9zKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX190TW9kZWxJbmZvcyAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fdE1vZGVsSW5mb3MgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsSW5mb3Moc3RydWN0IHNvYXAqLCB1ZGRpMl9fdE1vZGVsSW5mb3MgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX190TW9kZWxJbmZvcyAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluZm9zKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX190TW9kZWxJbmZvcyAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NJbmZvcworI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzSW5mb3MgKDMwMykKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzSW5mb3Moc3RydWN0IHNvYXAqLCB1ZGRpMl9fYnVzaW5lc3NJbmZvcyAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzSW5mb3Moc3RydWN0IHNvYXAqLCB1ZGRpMl9fYnVzaW5lc3NJbmZvcyAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NJbmZvcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fYnVzaW5lc3NJbmZvcyAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fYnVzaW5lc3NJbmZvcyAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc0luZm9zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2J1c2luZXNzSW5mb3MgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc0luZm9zICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NJbmZvcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fYnVzaW5lc3NJbmZvcyAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc0VudGl0eUV4dCAoMzAxKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc0VudGl0eUV4dChzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc0VudGl0eUV4dCAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2J1c2luZXNzRW50aXR5RXh0ICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc0VudGl0eUV4dCAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc0VudGl0eUV4dChzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc0VudGl0eUV4dCAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2J1c2luZXNzRW50aXR5RXh0ICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2J1c2luZXNzRW50aXR5RXh0ICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbSAoMjk5KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbShzdHJ1Y3Qgc29hcCosIHVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbShzdHJ1Y3Qgc29hcCosIHVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW0oc3RydWN0IHNvYXAqLCB1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbSAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW0gKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX190TW9kZWwKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX190TW9kZWwgKDI4NykKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX3RNb2RlbChzdHJ1Y3Qgc29hcCosIHVkZGkyX190TW9kZWwgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX190TW9kZWwoc3RydWN0IHNvYXAqLCB1ZGRpMl9fdE1vZGVsICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX190TW9kZWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX3RNb2RlbCAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fdE1vZGVsICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX3RNb2RlbChzdHJ1Y3Qgc29hcCosIHVkZGkyX190TW9kZWwgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX190TW9kZWwgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX190TW9kZWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3RNb2RlbCAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsRGV0YWlsCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsRGV0YWlsICgyNjMpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX190TW9kZWxEZXRhaWwoc3RydWN0IHNvYXAqLCB1ZGRpMl9fdE1vZGVsRGV0YWlsICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsRGV0YWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3RNb2RlbERldGFpbCAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsRGV0YWlsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX190TW9kZWxEZXRhaWwgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3RNb2RlbERldGFpbCAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX190TW9kZWxEZXRhaWwoc3RydWN0IHNvYXAqLCB1ZGRpMl9fdE1vZGVsRGV0YWlsICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fdE1vZGVsRGV0YWlsICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsRGV0YWlsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX190TW9kZWxEZXRhaWwgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3NlcnZpY2VEZXRhaWwKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19zZXJ2aWNlRGV0YWlsICgyNTgpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19zZXJ2aWNlRGV0YWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NlcnZpY2VEZXRhaWwgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19zZXJ2aWNlRGV0YWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NlcnZpY2VEZXRhaWwgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX3NlcnZpY2VEZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX3NlcnZpY2VEZXRhaWwgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NlcnZpY2VEZXRhaWwgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fc2VydmljZURldGFpbChzdHJ1Y3Qgc29hcCosIHVkZGkyX19zZXJ2aWNlRGV0YWlsICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fc2VydmljZURldGFpbCAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX3NlcnZpY2VEZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3NlcnZpY2VEZXRhaWwgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3JlZ2lzdGVyZWRJbmZvCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fcmVnaXN0ZXJlZEluZm8gKDI1MykKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX3JlZ2lzdGVyZWRJbmZvKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3JlZ2lzdGVyZWRJbmZvICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fcmVnaXN0ZXJlZEluZm8oc3RydWN0IHNvYXAqLCB1ZGRpMl9fcmVnaXN0ZXJlZEluZm8gKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX3JlZ2lzdGVyZWRJbmZvKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19yZWdpc3RlcmVkSW5mbyAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fcmVnaXN0ZXJlZEluZm8gKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fcmVnaXN0ZXJlZEluZm8oc3RydWN0IHNvYXAqLCB1ZGRpMl9fcmVnaXN0ZXJlZEluZm8gKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19yZWdpc3RlcmVkSW5mbyAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX3JlZ2lzdGVyZWRJbmZvKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19yZWdpc3RlcmVkSW5mbyAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9ucworI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMgKDI1MCkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9ucyAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9ucyAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9ucyAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9ucyAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9ucyAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHQKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc0RldGFpbEV4dCAoMjQ3KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHQgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc0RldGFpbEV4dChzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc0RldGFpbEV4dCAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0ICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc0RldGFpbEV4dCAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc0RldGFpbEV4dChzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc0RldGFpbEV4dCAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0ICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0ICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc0RldGFpbAorI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzRGV0YWlsICgyNDIpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc0RldGFpbChzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc0RldGFpbCAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzRGV0YWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2J1c2luZXNzRGV0YWlsICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc0RldGFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fYnVzaW5lc3NEZXRhaWwgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2J1c2luZXNzRGV0YWlsICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzRGV0YWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2J1c2luZXNzRGV0YWlsICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fYnVzaW5lc3NEZXRhaWwgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc0RldGFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fYnVzaW5lc3NEZXRhaWwgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2F1dGhUb2tlbgorI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2F1dGhUb2tlbiAoMjMzKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2F1dGhUb2tlbiAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX2F1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIHVkZGkyX19hdXRoVG9rZW4gKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2F1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fYXV0aFRva2VuICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19hdXRoVG9rZW4gKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2F1dGhUb2tlbiAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2F1dGhUb2tlbiAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2F1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fYXV0aFRva2VuICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQgKDIyOSkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydChzdHJ1Y3Qgc29hcCosIHVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0ICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydCAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0ICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydChzdHJ1Y3Qgc29hcCosIHVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydCAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsTGlzdAorI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3RNb2RlbExpc3QgKDIyNSkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX3RNb2RlbExpc3Qoc3RydWN0IHNvYXAqLCB1ZGRpMl9fdE1vZGVsTGlzdCAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX3RNb2RlbExpc3Qoc3RydWN0IHNvYXAqLCB1ZGRpMl9fdE1vZGVsTGlzdCAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsTGlzdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fdE1vZGVsTGlzdCAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fdE1vZGVsTGlzdCAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX190TW9kZWxMaXN0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX3RNb2RlbExpc3QgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX190TW9kZWxMaXN0ICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsTGlzdChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fdE1vZGVsTGlzdCAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fc2VydmljZUxpc3QKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19zZXJ2aWNlTGlzdCAoMjIwKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fc2VydmljZUxpc3Qoc3RydWN0IHNvYXAqLCB1ZGRpMl9fc2VydmljZUxpc3QgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19zZXJ2aWNlTGlzdChzdHJ1Y3Qgc29hcCosIHVkZGkyX19zZXJ2aWNlTGlzdCAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fc2VydmljZUxpc3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX3NlcnZpY2VMaXN0ICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19zZXJ2aWNlTGlzdCAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19zZXJ2aWNlTGlzdChzdHJ1Y3Qgc29hcCosIHVkZGkyX19zZXJ2aWNlTGlzdCAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NlcnZpY2VMaXN0ICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fc2VydmljZUxpc3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3NlcnZpY2VMaXN0ICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3QKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3QgKDIxNCkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdChzdHJ1Y3Qgc29hcCosIHVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3QgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3Qoc3RydWN0IHNvYXAqLCB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0ICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdCAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0ICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdChzdHJ1Y3Qgc29hcCosIHVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3QgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3QgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdCAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NMaXN0CisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NMaXN0ICgyMTApCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc0xpc3Qoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYnVzaW5lc3NMaXN0ICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NMaXN0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX2J1c2luZXNzTGlzdCAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NMaXN0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19idXNpbmVzc0xpc3QgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2J1c2luZXNzTGlzdCAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc0xpc3Qoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYnVzaW5lc3NMaXN0ICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fYnVzaW5lc3NMaXN0ICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NMaXN0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19idXNpbmVzc0xpc3QgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2JpbmRpbmdEZXRhaWwKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19iaW5kaW5nRGV0YWlsICgyMDIpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19iaW5kaW5nRGV0YWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2JpbmRpbmdEZXRhaWwgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19iaW5kaW5nRGV0YWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2JpbmRpbmdEZXRhaWwgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2JpbmRpbmdEZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2JpbmRpbmdEZXRhaWwgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2JpbmRpbmdEZXRhaWwgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fYmluZGluZ0RldGFpbChzdHJ1Y3Qgc29hcCosIHVkZGkyX19iaW5kaW5nRGV0YWlsICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fYmluZGluZ0RldGFpbCAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2JpbmRpbmdEZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2JpbmRpbmdEZXRhaWwgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvaW50CisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG9pbnQgKDE5OCkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvaW50KHN0cnVjdCBzb2FwKiwgaW50ICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG9pbnQoc3RydWN0IHNvYXAqLCBpbnQgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvaW50KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIGludCAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyBpbnQgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG9pbnQoc3RydWN0IHNvYXAqLCBpbnQgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvaW50KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsQmFnCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsQmFnICgxOTcpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX190TW9kZWxCYWcoc3RydWN0IHNvYXAqLCB1ZGRpMl9fdE1vZGVsQmFnICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsQmFnKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3RNb2RlbEJhZyAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsQmFnKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX190TW9kZWxCYWcgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3RNb2RlbEJhZyAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX190TW9kZWxCYWcoc3RydWN0IHNvYXAqLCB1ZGRpMl9fdE1vZGVsQmFnICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fdE1vZGVsQmFnICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsQmFnKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX190TW9kZWxCYWcgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2ZpbmRRdWFsaWZpZXJzCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fZmluZFF1YWxpZmllcnMgKDE5NikKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX2ZpbmRRdWFsaWZpZXJzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2ZpbmRRdWFsaWZpZXJzICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fZmluZFF1YWxpZmllcnMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZmluZFF1YWxpZmllcnMgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2ZpbmRRdWFsaWZpZXJzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19maW5kUXVhbGlmaWVycyAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fZmluZFF1YWxpZmllcnMgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fZmluZFF1YWxpZmllcnMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZmluZFF1YWxpZmllcnMgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19maW5kUXVhbGlmaWVycyAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2ZpbmRRdWFsaWZpZXJzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19maW5kUXVhbGlmaWVycyAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19kaXNwb3NpdGlvblJlcG9ydCAoMTY2KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19kaXNwb3NpdGlvblJlcG9ydChzdHJ1Y3Qgc29hcCosIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0ICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19kaXNwb3NpdGlvblJlcG9ydChzdHJ1Y3Qgc29hcCosIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0ICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0ICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24KKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24gKDE1NykKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbihzdHJ1Y3Qgc29hcCosIHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24gKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24oc3RydWN0IHNvYXAqLCB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbiAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbihzdHJ1Y3Qgc29hcCosIHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24gKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24gKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbiAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9faW5zdGFuY2VEZXRhaWxzCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9faW5zdGFuY2VEZXRhaWxzICgxNTYpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19pbnN0YW5jZURldGFpbHMoc3RydWN0IHNvYXAqLCB1ZGRpMl9faW5zdGFuY2VEZXRhaWxzICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9faW5zdGFuY2VEZXRhaWxzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2luc3RhbmNlRGV0YWlscyAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9faW5zdGFuY2VEZXRhaWxzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19pbnN0YW5jZURldGFpbHMgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2luc3RhbmNlRGV0YWlscyAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19pbnN0YW5jZURldGFpbHMoc3RydWN0IHNvYXAqLCB1ZGRpMl9faW5zdGFuY2VEZXRhaWxzICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9faW5zdGFuY2VEZXRhaWxzICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9faW5zdGFuY2VEZXRhaWxzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19pbnN0YW5jZURldGFpbHMgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbworI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyAoMTU0KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyhzdHJ1Y3Qgc29hcCosIHVkZGkyX190TW9kZWxJbnN0YW5jZUluZm8gKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX190TW9kZWxJbnN0YW5jZUluZm8gKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX190TW9kZWxJbmZvCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsSW5mbyAoMTUyKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsSW5mbyhzdHJ1Y3Qgc29hcCosIHVkZGkyX190TW9kZWxJbmZvICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsSW5mbyhzdHJ1Y3Qgc29hcCosIHVkZGkyX190TW9kZWxJbmZvICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX190TW9kZWxJbmZvKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX190TW9kZWxJbmZvICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX190TW9kZWxJbmZvICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluZm8oc3RydWN0IHNvYXAqLCB1ZGRpMl9fdE1vZGVsSW5mbyAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3RNb2RlbEluZm8gKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX190TW9kZWxJbmZvKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX190TW9kZWxJbmZvICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19zZXJ2aWNlSW5mbworI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3NlcnZpY2VJbmZvICgxNDkpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19zZXJ2aWNlSW5mbyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19zZXJ2aWNlSW5mbyAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX3NlcnZpY2VJbmZvKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NlcnZpY2VJbmZvICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19zZXJ2aWNlSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fc2VydmljZUluZm8gKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NlcnZpY2VJbmZvICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX3NlcnZpY2VJbmZvKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NlcnZpY2VJbmZvICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fc2VydmljZUluZm8gKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19zZXJ2aWNlSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fc2VydmljZUluZm8gKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2tleVR5cGUKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19rZXlUeXBlICgxNDgpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19rZXlUeXBlKHN0cnVjdCBzb2FwKiwgZW51bSB1ZGRpMl9fa2V5VHlwZSAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX2tleVR5cGUoc3RydWN0IHNvYXAqLCBlbnVtIHVkZGkyX19rZXlUeXBlICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19rZXlUeXBlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIGVudW0gdWRkaTJfX2tleVR5cGUgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgZW51bSB1ZGRpMl9fa2V5VHlwZSAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19rZXlUeXBlKHN0cnVjdCBzb2FwKiwgZW51bSB1ZGRpMl9fa2V5VHlwZSAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgZW51bSB1ZGRpMl9fa2V5VHlwZSAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2tleVR5cGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgZW51bSB1ZGRpMl9fa2V5VHlwZSAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fZXJySW5mbworI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2VyckluZm8gKDE0NykKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX2VyckluZm8oc3RydWN0IHNvYXAqLCB1ZGRpMl9fZXJySW5mbyAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX2VyckluZm8oc3RydWN0IHNvYXAqLCB1ZGRpMl9fZXJySW5mbyAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fZXJySW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fZXJySW5mbyAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fZXJySW5mbyAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19lcnJJbmZvKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2VyckluZm8gKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19lcnJJbmZvICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fZXJySW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fZXJySW5mbyAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbworI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8gKDE0NSkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8oc3RydWN0IHNvYXAqLCB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8oc3RydWN0IHNvYXAqLCB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8gKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcworI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMgKDE0MykKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fb3ZlcnZpZXdEb2MKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19vdmVydmlld0RvYyAoMTQyKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fb3ZlcnZpZXdEb2Moc3RydWN0IHNvYXAqLCB1ZGRpMl9fb3ZlcnZpZXdEb2MgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19vdmVydmlld0RvYyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19vdmVydmlld0RvYyAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fb3ZlcnZpZXdEb2Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX292ZXJ2aWV3RG9jICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19vdmVydmlld0RvYyAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19vdmVydmlld0RvYyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19vdmVydmlld0RvYyAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX292ZXJ2aWV3RG9jICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fb3ZlcnZpZXdEb2Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX292ZXJ2aWV3RG9jICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX190cnVuY2F0ZWQKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX190cnVuY2F0ZWQgKDE0MCkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX3RydW5jYXRlZChzdHJ1Y3Qgc29hcCosIGVudW0gdWRkaTJfX3RydW5jYXRlZCAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX3RydW5jYXRlZChzdHJ1Y3Qgc29hcCosIGVudW0gdWRkaTJfX3RydW5jYXRlZCAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fdHJ1bmNhdGVkKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIGVudW0gdWRkaTJfX3RydW5jYXRlZCAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyBlbnVtIHVkZGkyX190cnVuY2F0ZWQgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fdHJ1bmNhdGVkKHN0cnVjdCBzb2FwKiwgZW51bSB1ZGRpMl9fdHJ1bmNhdGVkICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBlbnVtIHVkZGkyX190cnVuY2F0ZWQgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX190cnVuY2F0ZWQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgZW51bSB1ZGRpMl9fdHJ1bmNhdGVkICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19yZXN1bHQKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19yZXN1bHQgKDEzOCkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX3Jlc3VsdChzdHJ1Y3Qgc29hcCosIHVkZGkyX19yZXN1bHQgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19yZXN1bHQoc3RydWN0IHNvYXAqLCB1ZGRpMl9fcmVzdWx0ICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19yZXN1bHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX3Jlc3VsdCAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fcmVzdWx0ICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX3Jlc3VsdChzdHJ1Y3Qgc29hcCosIHVkZGkyX19yZXN1bHQgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19yZXN1bHQgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19yZXN1bHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3Jlc3VsdCAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fZGlzY292ZXJ5VVJMCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fZGlzY292ZXJ5VVJMICgxMzYpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19kaXNjb3ZlcnlVUkwoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZGlzY292ZXJ5VVJMICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fZGlzY292ZXJ5VVJMKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2Rpc2NvdmVyeVVSTCAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fZGlzY292ZXJ5VVJMKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19kaXNjb3ZlcnlVUkwgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2Rpc2NvdmVyeVVSTCAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19kaXNjb3ZlcnlVUkwoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZGlzY292ZXJ5VVJMICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZGlzY292ZXJ5VVJMICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fZGlzY292ZXJ5VVJMKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19kaXNjb3ZlcnlVUkwgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2NvbnRhY3QKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19jb250YWN0ICgxMzQpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19jb250YWN0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX2NvbnRhY3QgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19jb250YWN0KHN0cnVjdCBzb2FwKiwgdWRkaTJfX2NvbnRhY3QgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2NvbnRhY3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2NvbnRhY3QgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2NvbnRhY3QgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fY29udGFjdChzdHJ1Y3Qgc29hcCosIHVkZGkyX19jb250YWN0ICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fY29udGFjdCAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2NvbnRhY3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2NvbnRhY3QgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2FkZHJlc3MKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19hZGRyZXNzICgxMzIpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19hZGRyZXNzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2FkZHJlc3MgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19hZGRyZXNzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2FkZHJlc3MgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2FkZHJlc3Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2FkZHJlc3MgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2FkZHJlc3MgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fYWRkcmVzcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19hZGRyZXNzICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fYWRkcmVzcyAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2FkZHJlc3Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2FkZHJlc3MgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2VtYWlsCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fZW1haWwgKDEzMCkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX2VtYWlsKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2VtYWlsICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fZW1haWwoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZW1haWwgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2VtYWlsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19lbWFpbCAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fZW1haWwgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fZW1haWwoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZW1haWwgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19lbWFpbCAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2VtYWlsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19lbWFpbCAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fcGhvbmUKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19waG9uZSAoMTI4KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fcGhvbmUoc3RydWN0IHNvYXAqLCB1ZGRpMl9fcGhvbmUgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19waG9uZShzdHJ1Y3Qgc29hcCosIHVkZGkyX19waG9uZSAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fcGhvbmUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX3Bob25lICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19waG9uZSAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19waG9uZShzdHJ1Y3Qgc29hcCosIHVkZGkyX19waG9uZSAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3Bob25lICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fcGhvbmUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX3Bob25lICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc1NlcnZpY2UKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc1NlcnZpY2UgKDEyNSkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzU2VydmljZShzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc1NlcnZpY2UgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc1NlcnZpY2Uoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc1NlcnZpY2Uoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2J1c2luZXNzU2VydmljZSAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzU2VydmljZShzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc1NlcnZpY2UgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc1NlcnZpY2UgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc1NlcnZpY2Uoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2J1c2luZXNzU2VydmljZSAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fYmluZGluZ1RlbXBsYXRlcworI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZXMgKDEyNCkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZXMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlcyAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZXMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlcyAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fYmluZGluZ1RlbXBsYXRlcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlcyAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlcyAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19iaW5kaW5nVGVtcGxhdGVzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZXMgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19iaW5kaW5nVGVtcGxhdGVzICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fYmluZGluZ1RlbXBsYXRlcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlcyAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NJbmZvCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NJbmZvICgxMjIpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc0luZm8oc3RydWN0IHNvYXAqLCB1ZGRpMl9fYnVzaW5lc3NJbmZvICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NJbmZvKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2J1c2luZXNzSW5mbyAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NJbmZvKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19idXNpbmVzc0luZm8gKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2J1c2luZXNzSW5mbyAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc0luZm8oc3RydWN0IHNvYXAqLCB1ZGRpMl9fYnVzaW5lc3NJbmZvICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fYnVzaW5lc3NJbmZvICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NJbmZvKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19idXNpbmVzc0luZm8gKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3NlcnZpY2VJbmZvcworI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3NlcnZpY2VJbmZvcyAoMTIxKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fc2VydmljZUluZm9zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NlcnZpY2VJbmZvcyAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX3NlcnZpY2VJbmZvcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19zZXJ2aWNlSW5mb3MgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX3NlcnZpY2VJbmZvcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fc2VydmljZUluZm9zICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19zZXJ2aWNlSW5mb3MgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fc2VydmljZUluZm9zKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3NlcnZpY2VJbmZvcyAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3NlcnZpY2VJbmZvcyAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX3NlcnZpY2VJbmZvcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fc2VydmljZUluZm9zICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc0VudGl0eQorI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzRW50aXR5ICgxMjApCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc0VudGl0eShzdHJ1Y3Qgc29hcCosIHVkZGkyX19idXNpbmVzc0VudGl0eSAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzRW50aXR5KHN0cnVjdCBzb2FwKiwgdWRkaTJfX2J1c2luZXNzRW50aXR5ICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc0VudGl0eShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fYnVzaW5lc3NFbnRpdHkgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2J1c2luZXNzRW50aXR5ICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzRW50aXR5KHN0cnVjdCBzb2FwKiwgdWRkaTJfX2J1c2luZXNzRW50aXR5ICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fYnVzaW5lc3NFbnRpdHkgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc0VudGl0eShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fYnVzaW5lc3NFbnRpdHkgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2NhdGVnb3J5QmFnCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fY2F0ZWdvcnlCYWcgKDExOSkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX2NhdGVnb3J5QmFnKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2NhdGVnb3J5QmFnICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fY2F0ZWdvcnlCYWcoc3RydWN0IHNvYXAqLCB1ZGRpMl9fY2F0ZWdvcnlCYWcgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2NhdGVnb3J5QmFnKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19jYXRlZ29yeUJhZyAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fY2F0ZWdvcnlCYWcgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fY2F0ZWdvcnlCYWcoc3RydWN0IHNvYXAqLCB1ZGRpMl9fY2F0ZWdvcnlCYWcgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19jYXRlZ29yeUJhZyAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2NhdGVnb3J5QmFnKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19jYXRlZ29yeUJhZyAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9faWRlbnRpZmllckJhZworI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2lkZW50aWZpZXJCYWcgKDExOCkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX2lkZW50aWZpZXJCYWcoc3RydWN0IHNvYXAqLCB1ZGRpMl9faWRlbnRpZmllckJhZyAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX2lkZW50aWZpZXJCYWcoc3RydWN0IHNvYXAqLCB1ZGRpMl9faWRlbnRpZmllckJhZyAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9faWRlbnRpZmllckJhZyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9faWRlbnRpZmllckJhZyAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9faWRlbnRpZmllckJhZyAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19pZGVudGlmaWVyQmFnKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2lkZW50aWZpZXJCYWcgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19pZGVudGlmaWVyQmFnICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9faWRlbnRpZmllckJhZyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9faWRlbnRpZmllckJhZyAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlcworI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzU2VydmljZXMgKDExNykKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzU2VydmljZXMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlcyAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzU2VydmljZXMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlcyAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlcyAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlcyAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19idXNpbmVzc1NlcnZpY2VzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2J1c2luZXNzU2VydmljZXMgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19idXNpbmVzc1NlcnZpY2VzICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlcyAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fY29udGFjdHMKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19jb250YWN0cyAoMTE2KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fY29udGFjdHMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fY29udGFjdHMgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19jb250YWN0cyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19jb250YWN0cyAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9fY29udGFjdHMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2NvbnRhY3RzICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19jb250YWN0cyAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19jb250YWN0cyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19jb250YWN0cyAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2NvbnRhY3RzICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9fY29udGFjdHMoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2NvbnRhY3RzICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19uYW1lCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fbmFtZSAoMTE0KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fbmFtZShzdHJ1Y3Qgc29hcCosIHVkZGkyX19uYW1lICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fbmFtZShzdHJ1Y3Qgc29hcCosIHVkZGkyX19uYW1lICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19uYW1lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19uYW1lICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19uYW1lICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX25hbWUoc3RydWN0IHNvYXAqLCB1ZGRpMl9fbmFtZSAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX25hbWUgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19uYW1lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19uYW1lICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19kaXNjb3ZlcnlVUkxzCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fZGlzY292ZXJ5VVJMcyAoMTEzKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fZGlzY292ZXJ5VVJMcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19kaXNjb3ZlcnlVUkxzICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fZGlzY292ZXJ5VVJMcyhzdHJ1Y3Qgc29hcCosIHVkZGkyX19kaXNjb3ZlcnlVUkxzICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19kaXNjb3ZlcnlVUkxzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19kaXNjb3ZlcnlVUkxzICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19kaXNjb3ZlcnlVUkxzICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX2Rpc2NvdmVyeVVSTHMoc3RydWN0IHNvYXAqLCB1ZGRpMl9fZGlzY292ZXJ5VVJMcyAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2Rpc2NvdmVyeVVSTHMgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19kaXNjb3ZlcnlVUkxzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19kaXNjb3ZlcnlVUkxzICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19iaW5kaW5nVGVtcGxhdGUKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19iaW5kaW5nVGVtcGxhdGUgKDExMSkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZShzdHJ1Y3Qgc29hcCosIHVkZGkyX19iaW5kaW5nVGVtcGxhdGUgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19iaW5kaW5nVGVtcGxhdGUoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19iaW5kaW5nVGVtcGxhdGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZSAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZShzdHJ1Y3Qgc29hcCosIHVkZGkyX19iaW5kaW5nVGVtcGxhdGUgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19iaW5kaW5nVGVtcGxhdGUgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19iaW5kaW5nVGVtcGxhdGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZSAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9faG9zdGluZ1JlZGlyZWN0b3IKKyNkZWZpbmUgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19ob3N0aW5nUmVkaXJlY3RvciAoMTEwKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9faG9zdGluZ1JlZGlyZWN0b3Ioc3RydWN0IHNvYXAqLCB1ZGRpMl9faG9zdGluZ1JlZGlyZWN0b3IgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X1BvaW50ZXJUb3VkZGkyX19ob3N0aW5nUmVkaXJlY3RvcihzdHJ1Y3Qgc29hcCosIHVkZGkyX19ob3N0aW5nUmVkaXJlY3RvciAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9Qb2ludGVyVG91ZGRpMl9faG9zdGluZ1JlZGlyZWN0b3Ioc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICosIGludCwgdWRkaTJfX2hvc3RpbmdSZWRpcmVjdG9yICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19ob3N0aW5nUmVkaXJlY3RvciAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X1BvaW50ZXJUb3VkZGkyX19ob3N0aW5nUmVkaXJlY3RvcihzdHJ1Y3Qgc29hcCosIHVkZGkyX19ob3N0aW5nUmVkaXJlY3RvciAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2hvc3RpbmdSZWRpcmVjdG9yICoqIFNPQVBfRk1BQzQgc29hcF9pbl9Qb2ludGVyVG91ZGRpMl9faG9zdGluZ1JlZGlyZWN0b3Ioc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgdWRkaTJfX2hvc3RpbmdSZWRpcmVjdG9yICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19hY2Nlc3NQb2ludAorI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2FjY2Vzc1BvaW50ICgxMDkpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19hY2Nlc3NQb2ludChzdHJ1Y3Qgc29hcCosIHVkZGkyX19hY2Nlc3NQb2ludCAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX2FjY2Vzc1BvaW50KHN0cnVjdCBzb2FwKiwgdWRkaTJfX2FjY2Vzc1BvaW50ICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19hY2Nlc3NQb2ludChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fYWNjZXNzUG9pbnQgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2FjY2Vzc1BvaW50ICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX2FjY2Vzc1BvaW50KHN0cnVjdCBzb2FwKiwgdWRkaTJfX2FjY2Vzc1BvaW50ICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fYWNjZXNzUG9pbnQgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19hY2Nlc3NQb2ludChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fYWNjZXNzUG9pbnQgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluc3RhbmNlRGV0YWlscworI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluc3RhbmNlRGV0YWlscyAoMTA4KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsSW5zdGFuY2VEZXRhaWxzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3RNb2RlbEluc3RhbmNlRGV0YWlscyAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluc3RhbmNlRGV0YWlscyhzdHJ1Y3Qgc29hcCosIHVkZGkyX190TW9kZWxJbnN0YW5jZURldGFpbHMgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluc3RhbmNlRGV0YWlscyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fdE1vZGVsSW5zdGFuY2VEZXRhaWxzICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX190TW9kZWxJbnN0YW5jZURldGFpbHMgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fdE1vZGVsSW5zdGFuY2VEZXRhaWxzKHN0cnVjdCBzb2FwKiwgdWRkaTJfX3RNb2RlbEluc3RhbmNlRGV0YWlscyAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX3RNb2RlbEluc3RhbmNlRGV0YWlscyAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluc3RhbmNlRGV0YWlscyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fdE1vZGVsSW5zdGFuY2VEZXRhaWxzICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19kZXNjcmlwdGlvbgorI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2Rlc2NyaXB0aW9uICgxMDYpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19kZXNjcmlwdGlvbihzdHJ1Y3Qgc29hcCosIHVkZGkyX19kZXNjcmlwdGlvbiAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX2Rlc2NyaXB0aW9uKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2Rlc2NyaXB0aW9uICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19kZXNjcmlwdGlvbihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fZGVzY3JpcHRpb24gKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2Rlc2NyaXB0aW9uICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX2Rlc2NyaXB0aW9uKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2Rlc2NyaXB0aW9uICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fZGVzY3JpcHRpb24gKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19kZXNjcmlwdGlvbihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fZGVzY3JpcHRpb24gKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2tleXNPd25lZAorI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2tleXNPd25lZCAoMTA1KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9Qb2ludGVyVG91ZGRpMl9fa2V5c093bmVkKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2tleXNPd25lZCAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX2tleXNPd25lZChzdHJ1Y3Qgc29hcCosIHVkZGkyX19rZXlzT3duZWQgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2tleXNPd25lZChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fa2V5c093bmVkICpjb25zdCosIGNvbnN0IGNoYXIgKik7CitTT0FQX0ZNQUMzIHVkZGkyX19rZXlzT3duZWQgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fa2V5c093bmVkKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2tleXNPd25lZCAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2tleXNPd25lZCAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2tleXNPd25lZChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fa2V5c093bmVkICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX1BvaW50ZXJUb3VkZGkyX19rZXllZFJlZmVyZW5jZQorI2RlZmluZSBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2tleWVkUmVmZXJlbmNlICgxMDQpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX1BvaW50ZXJUb3VkZGkyX19rZXllZFJlZmVyZW5jZShzdHJ1Y3Qgc29hcCosIHVkZGkyX19rZXllZFJlZmVyZW5jZSAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfUG9pbnRlclRvdWRkaTJfX2tleWVkUmVmZXJlbmNlKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2tleWVkUmVmZXJlbmNlICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X1BvaW50ZXJUb3VkZGkyX19rZXllZFJlZmVyZW5jZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKiwgaW50LCB1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UgKmNvbnN0KiwgY29uc3QgY2hhciAqKTsKK1NPQVBfRk1BQzMgdWRkaTJfX2tleWVkUmVmZXJlbmNlICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfUG9pbnRlclRvdWRkaTJfX2tleWVkUmVmZXJlbmNlKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2tleWVkUmVmZXJlbmNlICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyB1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UgKiogU09BUF9GTUFDNCBzb2FwX2luX1BvaW50ZXJUb3VkZGkyX19rZXllZFJlZmVyZW5jZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCB1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfUG9pbnRlclRvdWRkaTJfX2FkZHJlc3NMaW5lCisjZGVmaW5lIFNPQVBfVFlQRV9Qb2ludGVyVG91ZGRpMl9fYWRkcmVzc0xpbmUgKDEwMCkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfUG9pbnRlclRvdWRkaTJfX2FkZHJlc3NMaW5lKHN0cnVjdCBzb2FwKiwgdWRkaTJfX2FkZHJlc3NMaW5lICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9Qb2ludGVyVG91ZGRpMl9fYWRkcmVzc0xpbmUoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYWRkcmVzc0xpbmUgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfUG9pbnRlclRvdWRkaTJfX2FkZHJlc3NMaW5lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqLCBpbnQsIHVkZGkyX19hZGRyZXNzTGluZSAqY29uc3QqLCBjb25zdCBjaGFyICopOworU09BUF9GTUFDMyB1ZGRpMl9fYWRkcmVzc0xpbmUgKiogU09BUF9GTUFDNCBzb2FwX2dldF9Qb2ludGVyVG91ZGRpMl9fYWRkcmVzc0xpbmUoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYWRkcmVzc0xpbmUgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHVkZGkyX19hZGRyZXNzTGluZSAqKiBTT0FQX0ZNQUM0IHNvYXBfaW5fUG9pbnRlclRvdWRkaTJfX2FkZHJlc3NMaW5lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHVkZGkyX19hZGRyZXNzTGluZSAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fdE1vZGVsS2V5CisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fdE1vZGVsS2V5ICg5NSkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X3VkZGkyX190TW9kZWxLZXkoc3RydWN0IHNvYXAqLCBjaGFyICoqKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX3VkZGkyX190TW9kZWxLZXkoc3RydWN0IHNvYXAqLCBjaGFyICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF91ZGRpMl9fdE1vZGVsS2V5KHN0cnVjdCBzb2FwKiwgY2hhciAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF91ZGRpMl9fdE1vZGVsS2V5KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY2hhcipjb25zdCosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgY2hhciAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX190TW9kZWxLZXkoc3RydWN0IHNvYXAqLCBjaGFyICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBjaGFyICogKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX3RNb2RlbEtleShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjaGFyICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX3VkZGkyX19zZXJ2aWNlS2V5CisjZGVmaW5lIFNPQVBfVFlQRV91ZGRpMl9fc2VydmljZUtleSAoOTQpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF91ZGRpMl9fc2VydmljZUtleShzdHJ1Y3Qgc29hcCosIGNoYXIgKiopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfdWRkaTJfX3NlcnZpY2VLZXkoc3RydWN0IHNvYXAqLCBjaGFyICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF91ZGRpMl9fc2VydmljZUtleShzdHJ1Y3Qgc29hcCosIGNoYXIgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX3NlcnZpY2VLZXkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjaGFyKmNvbnN0KiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBjaGFyICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfdWRkaTJfX3NlcnZpY2VLZXkoc3RydWN0IHNvYXAqLCBjaGFyICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBjaGFyICogKiBTT0FQX0ZNQUM0IHNvYXBfaW5fdWRkaTJfX3NlcnZpY2VLZXkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY2hhciAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fYnVzaW5lc3NLZXkKKyNkZWZpbmUgU09BUF9UWVBFX3VkZGkyX19idXNpbmVzc0tleSAoOTMpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF91ZGRpMl9fYnVzaW5lc3NLZXkoc3RydWN0IHNvYXAqLCBjaGFyICoqKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX3VkZGkyX19idXNpbmVzc0tleShzdHJ1Y3Qgc29hcCosIGNoYXIgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X3VkZGkyX19idXNpbmVzc0tleShzdHJ1Y3Qgc29hcCosIGNoYXIgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfdWRkaTJfX2J1c2luZXNzS2V5KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY2hhcipjb25zdCosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgY2hhciAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19idXNpbmVzc0tleShzdHJ1Y3Qgc29hcCosIGNoYXIgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGNoYXIgKiAqIFNPQVBfRk1BQzQgc29hcF9pbl91ZGRpMl9fYnVzaW5lc3NLZXkoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY2hhciAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV91ZGRpMl9fYmluZGluZ0tleQorI2RlZmluZSBTT0FQX1RZUEVfdWRkaTJfX2JpbmRpbmdLZXkgKDkyKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfdWRkaTJfX2JpbmRpbmdLZXkoc3RydWN0IHNvYXAqLCBjaGFyICoqKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX3VkZGkyX19iaW5kaW5nS2V5KHN0cnVjdCBzb2FwKiwgY2hhciAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfdWRkaTJfX2JpbmRpbmdLZXkoc3RydWN0IHNvYXAqLCBjaGFyICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3VkZGkyX19iaW5kaW5nS2V5KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY2hhcipjb25zdCosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgY2hhciAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3VkZGkyX19iaW5kaW5nS2V5KHN0cnVjdCBzb2FwKiwgY2hhciAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgY2hhciAqICogU09BUF9GTUFDNCBzb2FwX2luX3VkZGkyX19iaW5kaW5nS2V5KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNoYXIgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfeG1sX19sYW5nCisjZGVmaW5lIFNPQVBfVFlQRV94bWxfX2xhbmcgKDgpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF94bWxfX2xhbmcoc3RydWN0IHNvYXAqLCBjaGFyICoqKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX3htbF9fbGFuZyhzdHJ1Y3Qgc29hcCosIGNoYXIgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X3htbF9fbGFuZyhzdHJ1Y3Qgc29hcCosIGNoYXIgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfeG1sX19sYW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY2hhcipjb25zdCosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgY2hhciAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3htbF9fbGFuZyhzdHJ1Y3Qgc29hcCosIGNoYXIgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGNoYXIgKiAqIFNPQVBfRk1BQzQgc29hcF9pbl94bWxfX2xhbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY2hhciAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV94c2RfX05NVE9LRU4KKyNkZWZpbmUgU09BUF9UWVBFX3hzZF9fTk1UT0tFTiAoNykKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X3hzZF9fTk1UT0tFTihzdHJ1Y3Qgc29hcCosIGNoYXIgKiopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfeHNkX19OTVRPS0VOKHN0cnVjdCBzb2FwKiwgY2hhciAqY29uc3QqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfeHNkX19OTVRPS0VOKHN0cnVjdCBzb2FwKiwgY2hhciAqY29uc3QqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF94c2RfX05NVE9LRU4oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjaGFyKmNvbnN0KiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBjaGFyICoqIFNPQVBfRk1BQzQgc29hcF9nZXRfeHNkX19OTVRPS0VOKHN0cnVjdCBzb2FwKiwgY2hhciAqKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgY2hhciAqICogU09BUF9GTUFDNCBzb2FwX2luX3hzZF9fTk1UT0tFTihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjaGFyICoqLCBjb25zdCBjaGFyKik7CisKKyNpZm5kZWYgU09BUF9UWVBFX19RTmFtZQorI2RlZmluZSBTT0FQX1RZUEVfX1FOYW1lICg1KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfX1FOYW1lKHN0cnVjdCBzb2FwKiwgY2hhciAqKik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9fUU5hbWUoc3RydWN0IHNvYXAqLCBjaGFyICpjb25zdCopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9fUU5hbWUoc3RydWN0IHNvYXAqLCBjaGFyICpjb25zdCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X19RTmFtZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNoYXIqY29uc3QqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGNoYXIgKiogU09BUF9GTUFDNCBzb2FwX2dldF9fUU5hbWUoc3RydWN0IHNvYXAqLCBjaGFyICoqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBjaGFyICogKiBTT0FQX0ZNQUM0IHNvYXBfaW5fX1FOYW1lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGNoYXIgKiosIGNvbnN0IGNoYXIqKTsKKworI2lmbmRlZiBTT0FQX1RZUEVfc3RyaW5nCisjZGVmaW5lIFNPQVBfVFlQRV9zdHJpbmcgKDMpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9zdHJpbmcoc3RydWN0IHNvYXAqLCBjaGFyICoqKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX3N0cmluZyhzdHJ1Y3Qgc29hcCosIGNoYXIgKmNvbnN0Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X3N0cmluZyhzdHJ1Y3Qgc29hcCosIGNoYXIgKmNvbnN0KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfc3RyaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY2hhcipjb25zdCosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgY2hhciAqKiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3N0cmluZyhzdHJ1Y3Qgc29hcCosIGNoYXIgKiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGNoYXIgKiAqIFNPQVBfRk1BQzQgc29hcF9pbl9zdHJpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY2hhciAqKiwgY29uc3QgY2hhciopOworCisjaWZuZGVmIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQKKyNkZWZpbmUgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19idXNpbmVzc0VudGl0eUV4dCAoMzAyKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQoc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQgKiA+Kik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzRW50aXR5RXh0KHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzRW50aXR5RXh0ICogPiopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQoc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQgKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzRW50aXR5RXh0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzRW50aXR5RXh0ICogPiosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzRW50aXR5RXh0ICogPiogU09BUF9GTUFDNCBzb2FwX2dldF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQgKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzRW50aXR5RXh0ICogPiogU09BUF9GTUFDNCBzb2FwX2luX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19idXNpbmVzc0VudGl0eUV4dChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQgKiA+KiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc0VudGl0eUV4dCAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19idXNpbmVzc0VudGl0eUV4dChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19idXNpbmVzc0VudGl0eUV4dChzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc0VudGl0eUV4dCAqID4qKTsKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzRW50aXR5RXh0ICogPiAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzRW50aXR5RXh0KHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW0KKyNkZWZpbmUgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtICgzMDApCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW0gKiA+Kik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW0oc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbSAqID4qKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW0oc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbSAqID4qLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtICogPiosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW0gKiA+KiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW0gKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW0gKiA+KiBTT0FQX0ZNQUM0IHNvYXBfaW5fc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW0oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW0gKiA+KiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPHVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtICogPiAqIFNPQVBfRk1BQzYgc29hcF9uZXdfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW0oc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbShzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtICogPiopOworU09BUF9GTUFDNSBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbSAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW0oc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW0oc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fdE1vZGVsCisjZGVmaW5lIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fdE1vZGVsICgyODgpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX190TW9kZWwoc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fdE1vZGVsICogPiopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX190TW9kZWwoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fdE1vZGVsICogPiopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fdE1vZGVsKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbCAqID4qLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fdE1vZGVsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbCAqID4qLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPHVkZGkyX190TW9kZWwgKiA+KiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX190TW9kZWwoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fdE1vZGVsICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPHVkZGkyX190TW9kZWwgKiA+KiBTT0FQX0ZNQUM0IHNvYXBfaW5fc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3RNb2RlbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fdE1vZGVsICogPiosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSBzdGQ6OnZlY3Rvcjx1ZGRpMl9fdE1vZGVsICogPiAqIFNPQVBfRk1BQzYgc29hcF9uZXdfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3RNb2RlbChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX190TW9kZWwoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fdE1vZGVsICogPiopOworU09BUF9GTUFDNSBzdGQ6OnZlY3Rvcjx1ZGRpMl9fdE1vZGVsICogPiAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fdE1vZGVsKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX190TW9kZWwoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NFbnRpdHkKKyNkZWZpbmUgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19idXNpbmVzc0VudGl0eSAoMjcyKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NFbnRpdHkoc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NFbnRpdHkgKiA+Kik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzRW50aXR5KHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzRW50aXR5ICogPiopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NFbnRpdHkoc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NFbnRpdHkgKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzRW50aXR5KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzRW50aXR5ICogPiosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzRW50aXR5ICogPiogU09BUF9GTUFDNCBzb2FwX2dldF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NFbnRpdHkoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NFbnRpdHkgKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzRW50aXR5ICogPiogU09BUF9GTUFDNCBzb2FwX2luX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19idXNpbmVzc0VudGl0eShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NFbnRpdHkgKiA+KiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc0VudGl0eSAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19idXNpbmVzc0VudGl0eShzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19idXNpbmVzc0VudGl0eShzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc0VudGl0eSAqID4qKTsKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzRW50aXR5ICogPiAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NFbnRpdHkoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzRW50aXR5KHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mdWRkaTJfX3NlcnZpY2VLZXkKKyNkZWZpbmUgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnVkZGkyX19zZXJ2aWNlS2V5ICgxODQpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnVkZGkyX19zZXJ2aWNlS2V5KHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8Y2hhciAqID4qKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fc2VydmljZUtleShzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPGNoYXIgKiA+Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnVkZGkyX19zZXJ2aWNlS2V5KHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8Y2hhciAqID4qLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fc2VydmljZUtleShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHN0ZDo6dmVjdG9yPGNoYXIgKiA+KiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdGQ6OnZlY3RvcjxjaGFyICogPiogU09BUF9GTUFDNCBzb2FwX2dldF9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fc2VydmljZUtleShzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPGNoYXIgKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8Y2hhciAqID4qIFNPQVBfRk1BQzQgc29hcF9pbl9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fc2VydmljZUtleShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdGQ6OnZlY3RvcjxjaGFyICogPiosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSBzdGQ6OnZlY3RvcjxjaGFyICogPiAqIFNPQVBfRk1BQzYgc29hcF9uZXdfc3RkX192ZWN0b3JUZW1wbGF0ZU9mdWRkaTJfX3NlcnZpY2VLZXkoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fc2VydmljZUtleShzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPGNoYXIgKiA+Kik7CitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPGNoYXIgKiA+ICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnVkZGkyX19zZXJ2aWNlS2V5KHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnVkZGkyX19zZXJ2aWNlS2V5KHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mdWRkaTJfX2J1c2luZXNzS2V5CisjZGVmaW5lIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fYnVzaW5lc3NLZXkgKDE3NikKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mdWRkaTJfX2J1c2luZXNzS2V5KHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8Y2hhciAqID4qKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fYnVzaW5lc3NLZXkoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3RvcjxjaGFyICogPiopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fYnVzaW5lc3NLZXkoc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3RvcjxjaGFyICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnVkZGkyX19idXNpbmVzc0tleShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHN0ZDo6dmVjdG9yPGNoYXIgKiA+KiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdGQ6OnZlY3RvcjxjaGFyICogPiogU09BUF9GTUFDNCBzb2FwX2dldF9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fYnVzaW5lc3NLZXkoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3RvcjxjaGFyICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPGNoYXIgKiA+KiBTT0FQX0ZNQUM0IHNvYXBfaW5fc3RkX192ZWN0b3JUZW1wbGF0ZU9mdWRkaTJfX2J1c2luZXNzS2V5KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHN0ZDo6dmVjdG9yPGNoYXIgKiA+KiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPGNoYXIgKiA+ICogU09BUF9GTUFDNiBzb2FwX25ld19zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fYnVzaW5lc3NLZXkoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fYnVzaW5lc3NLZXkoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3RvcjxjaGFyICogPiopOworU09BUF9GTUFDNSBzdGQ6OnZlY3RvcjxjaGFyICogPiAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fYnVzaW5lc3NLZXkoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfc3RkX192ZWN0b3JUZW1wbGF0ZU9mdWRkaTJfX2J1c2luZXNzS2V5KHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mdWRkaTJfX2JpbmRpbmdLZXkKKyNkZWZpbmUgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnVkZGkyX19iaW5kaW5nS2V5ICgxNzApCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnVkZGkyX19iaW5kaW5nS2V5KHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8Y2hhciAqID4qKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fYmluZGluZ0tleShzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPGNoYXIgKiA+Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnVkZGkyX19iaW5kaW5nS2V5KHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8Y2hhciAqID4qLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fYmluZGluZ0tleShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHN0ZDo6dmVjdG9yPGNoYXIgKiA+KiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdGQ6OnZlY3RvcjxjaGFyICogPiogU09BUF9GTUFDNCBzb2FwX2dldF9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fYmluZGluZ0tleShzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPGNoYXIgKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8Y2hhciAqID4qIFNPQVBfRk1BQzQgc29hcF9pbl9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fYmluZGluZ0tleShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdGQ6OnZlY3RvcjxjaGFyICogPiosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSBzdGQ6OnZlY3RvcjxjaGFyICogPiAqIFNPQVBfRk1BQzYgc29hcF9uZXdfc3RkX192ZWN0b3JUZW1wbGF0ZU9mdWRkaTJfX2JpbmRpbmdLZXkoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fYmluZGluZ0tleShzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPGNoYXIgKiA+Kik7CitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPGNoYXIgKiA+ICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnVkZGkyX19iaW5kaW5nS2V5KHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnVkZGkyX19iaW5kaW5nS2V5KHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbgorI2RlZmluZSBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbiAoMTU4KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbiAqID4qKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbiAqID4qKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbihzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24gKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24gKiA+KiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uICogPiogU09BUF9GTUFDNCBzb2FwX2dldF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbiAqID4qLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uICogPiogU09BUF9GTUFDNCBzb2FwX2luX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbiAqID4qLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbiAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24oc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbiAqID4qKTsKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbiAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbihzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbworI2RlZmluZSBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyAoMTU1KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyAqID4qKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyAqID4qKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX190TW9kZWxJbnN0YW5jZUluZm8gKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX190TW9kZWxJbnN0YW5jZUluZm8gKiA+KiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdGQ6OnZlY3Rvcjx1ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvICogPiogU09BUF9GTUFDNCBzb2FwX2dldF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyAqID4qLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdGQ6OnZlY3Rvcjx1ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvICogPiogU09BUF9GTUFDNCBzb2FwX2luX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX190TW9kZWxJbnN0YW5jZUluZm8oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyAqID4qLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX190TW9kZWxJbnN0YW5jZUluZm8oc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyAqID4qKTsKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyhzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluZm8KKyNkZWZpbmUgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX190TW9kZWxJbmZvICgxNTMpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX190TW9kZWxJbmZvKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbEluZm8gKiA+Kik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluZm8oc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fdE1vZGVsSW5mbyAqID4qKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluZm8oc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fdE1vZGVsSW5mbyAqID4qLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fdE1vZGVsSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX190TW9kZWxJbmZvICogPiosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbEluZm8gKiA+KiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX190TW9kZWxJbmZvKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbEluZm8gKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbEluZm8gKiA+KiBTT0FQX0ZNQUM0IHNvYXBfaW5fc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluZm8oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbEluZm8gKiA+KiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPHVkZGkyX190TW9kZWxJbmZvICogPiAqIFNPQVBfRk1BQzYgc29hcF9uZXdfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluZm8oc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fdE1vZGVsSW5mbyhzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX190TW9kZWxJbmZvICogPiopOworU09BUF9GTUFDNSBzdGQ6OnZlY3Rvcjx1ZGRpMl9fdE1vZGVsSW5mbyAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluZm8oc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3RNb2RlbEluZm8oc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fdE1vZGVsS2V5CisjZGVmaW5lIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fdE1vZGVsS2V5ICgxNTEpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnVkZGkyX190TW9kZWxLZXkoc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3RvcjxjaGFyICogPiopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnVkZGkyX190TW9kZWxLZXkoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3RvcjxjaGFyICogPiopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fdE1vZGVsS2V5KHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8Y2hhciAqID4qLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fdE1vZGVsS2V5KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RkOjp2ZWN0b3I8Y2hhciAqID4qLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPGNoYXIgKiA+KiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnVkZGkyX190TW9kZWxLZXkoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3RvcjxjaGFyICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPGNoYXIgKiA+KiBTT0FQX0ZNQUM0IHNvYXBfaW5fc3RkX192ZWN0b3JUZW1wbGF0ZU9mdWRkaTJfX3RNb2RlbEtleShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdGQ6OnZlY3RvcjxjaGFyICogPiosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSBzdGQ6OnZlY3RvcjxjaGFyICogPiAqIFNPQVBfRk1BQzYgc29hcF9uZXdfc3RkX192ZWN0b3JUZW1wbGF0ZU9mdWRkaTJfX3RNb2RlbEtleShzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnVkZGkyX190TW9kZWxLZXkoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3RvcjxjaGFyICogPiopOworU09BUF9GTUFDNSBzdGQ6OnZlY3RvcjxjaGFyICogPiAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2Z1ZGRpMl9fdE1vZGVsS2V5KHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnVkZGkyX190TW9kZWxLZXkoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fc2VydmljZUluZm8KKyNkZWZpbmUgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19zZXJ2aWNlSW5mbyAoMTUwKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fc2VydmljZUluZm8oc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fc2VydmljZUluZm8gKiA+Kik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3NlcnZpY2VJbmZvKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX3NlcnZpY2VJbmZvICogPiopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fc2VydmljZUluZm8oc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fc2VydmljZUluZm8gKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3NlcnZpY2VJbmZvKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX3NlcnZpY2VJbmZvICogPiosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX3NlcnZpY2VJbmZvICogPiogU09BUF9GTUFDNCBzb2FwX2dldF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fc2VydmljZUluZm8oc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fc2VydmljZUluZm8gKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX3NlcnZpY2VJbmZvICogPiogU09BUF9GTUFDNCBzb2FwX2luX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19zZXJ2aWNlSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fc2VydmljZUluZm8gKiA+KiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPHVkZGkyX19zZXJ2aWNlSW5mbyAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19zZXJ2aWNlSW5mbyhzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19zZXJ2aWNlSW5mbyhzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19zZXJ2aWNlSW5mbyAqID4qKTsKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8dWRkaTJfX3NlcnZpY2VJbmZvICogPiAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fc2VydmljZUluZm8oc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3NlcnZpY2VJbmZvKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8KKyNkZWZpbmUgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvICgxNDYpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8gKiA+Kik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8oc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyAqID4qKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8oc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyAqID4qLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvICogPiosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8gKiA+KiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8gKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8gKiA+KiBTT0FQX0ZNQUM0IHNvYXBfaW5fc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8gKiA+KiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPHVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvICogPiAqIFNPQVBfRk1BQzYgc29hcF9uZXdfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8oc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyhzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvICogPiopOworU09BUF9GTUFDNSBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8oc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm8oc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcworI2RlZmluZSBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMgKDE0NCkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMoc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyAqID4qKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyhzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzICogPiopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMgKiA+KiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdGQ6OnZlY3Rvcjx1ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyAqID4qIFNPQVBfRk1BQzQgc29hcF9nZXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyAqID4qLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdGQ6OnZlY3Rvcjx1ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyAqID4qIFNPQVBfRk1BQzQgc29hcF9pbl9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyAqID4qLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8dWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMgKiA+ICogU09BUF9GTUFDNiBzb2FwX25ld19zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyhzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMgKiA+Kik7CitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPHVkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzICogPiAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyhzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fc2hhcmVkUmVsYXRpb25zaGlwcyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnN0cmluZworI2RlZmluZSBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mc3RyaW5nICgxNDEpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnN0cmluZyhzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0ZDo6dmVjdG9yPGNoYXIgKiA+Kik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mc3RyaW5nKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8Y2hhciAqID4qKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mc3RyaW5nKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8Y2hhciAqID4qLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZzdHJpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdGQ6OnZlY3RvcjxjaGFyICogPiosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8Y2hhciAqID4qIFNPQVBfRk1BQzQgc29hcF9nZXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mc3RyaW5nKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8Y2hhciAqID4qLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdGQ6OnZlY3RvcjxjaGFyICogPiogU09BUF9GTUFDNCBzb2FwX2luX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnN0cmluZyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdGQ6OnZlY3RvcjxjaGFyICogPiosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSBzdGQ6OnZlY3RvcjxjaGFyICogPiAqIFNPQVBfRk1BQzYgc29hcF9uZXdfc3RkX192ZWN0b3JUZW1wbGF0ZU9mc3RyaW5nKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mc3RyaW5nKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8Y2hhciAqID4qKTsKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8Y2hhciAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mc3RyaW5nKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZnN0cmluZyhzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19yZXN1bHQKKyNkZWZpbmUgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19yZXN1bHQgKDEzOSkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3Jlc3VsdChzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX19yZXN1bHQgKiA+Kik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3Jlc3VsdChzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19yZXN1bHQgKiA+Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19yZXN1bHQoc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcmVzdWx0ICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19yZXN1bHQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcmVzdWx0ICogPiosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX3Jlc3VsdCAqID4qIFNPQVBfRk1BQzQgc29hcF9nZXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3Jlc3VsdChzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19yZXN1bHQgKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX3Jlc3VsdCAqID4qIFNPQVBfRk1BQzQgc29hcF9pbl9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fcmVzdWx0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHN0ZDo6dmVjdG9yPHVkZGkyX19yZXN1bHQgKiA+KiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPHVkZGkyX19yZXN1bHQgKiA+ICogU09BUF9GTUFDNiBzb2FwX25ld19zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fcmVzdWx0KHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3Jlc3VsdChzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19yZXN1bHQgKiA+Kik7CitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPHVkZGkyX19yZXN1bHQgKiA+ICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19yZXN1bHQoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3Jlc3VsdChzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19kaXNjb3ZlcnlVUkwKKyNkZWZpbmUgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19kaXNjb3ZlcnlVUkwgKDEzNykKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2Rpc2NvdmVyeVVSTChzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX19kaXNjb3ZlcnlVUkwgKiA+Kik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2Rpc2NvdmVyeVVSTChzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19kaXNjb3ZlcnlVUkwgKiA+Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19kaXNjb3ZlcnlVUkwoc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZGlzY292ZXJ5VVJMICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19kaXNjb3ZlcnlVUkwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZGlzY292ZXJ5VVJMICogPiosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX2Rpc2NvdmVyeVVSTCAqID4qIFNPQVBfRk1BQzQgc29hcF9nZXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2Rpc2NvdmVyeVVSTChzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19kaXNjb3ZlcnlVUkwgKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX2Rpc2NvdmVyeVVSTCAqID4qIFNPQVBfRk1BQzQgc29hcF9pbl9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fZGlzY292ZXJ5VVJMKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHN0ZDo6dmVjdG9yPHVkZGkyX19kaXNjb3ZlcnlVUkwgKiA+KiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPHVkZGkyX19kaXNjb3ZlcnlVUkwgKiA+ICogU09BUF9GTUFDNiBzb2FwX25ld19zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fZGlzY292ZXJ5VVJMKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2Rpc2NvdmVyeVVSTChzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19kaXNjb3ZlcnlVUkwgKiA+Kik7CitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPHVkZGkyX19kaXNjb3ZlcnlVUkwgKiA+ICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19kaXNjb3ZlcnlVUkwoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2Rpc2NvdmVyeVVSTChzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19jb250YWN0CisjZGVmaW5lIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fY29udGFjdCAoMTM1KQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fY29udGFjdChzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX19jb250YWN0ICogPiopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19jb250YWN0KHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2NvbnRhY3QgKiA+Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19jb250YWN0KHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX2NvbnRhY3QgKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2NvbnRhY3Qoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fY29udGFjdCAqID4qLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPHVkZGkyX19jb250YWN0ICogPiogU09BUF9GTUFDNCBzb2FwX2dldF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fY29udGFjdChzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19jb250YWN0ICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPHVkZGkyX19jb250YWN0ICogPiogU09BUF9GTUFDNCBzb2FwX2luX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19jb250YWN0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHN0ZDo6dmVjdG9yPHVkZGkyX19jb250YWN0ICogPiosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSBzdGQ6OnZlY3Rvcjx1ZGRpMl9fY29udGFjdCAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19jb250YWN0KHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2NvbnRhY3Qoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fY29udGFjdCAqID4qKTsKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8dWRkaTJfX2NvbnRhY3QgKiA+ICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19jb250YWN0KHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19jb250YWN0KHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2FkZHJlc3MKKyNkZWZpbmUgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19hZGRyZXNzICgxMzMpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19hZGRyZXNzKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX2FkZHJlc3MgKiA+Kik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2FkZHJlc3Moc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYWRkcmVzcyAqID4qKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2FkZHJlc3Moc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYWRkcmVzcyAqID4qLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYWRkcmVzcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX19hZGRyZXNzICogPiosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX2FkZHJlc3MgKiA+KiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19hZGRyZXNzKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2FkZHJlc3MgKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX2FkZHJlc3MgKiA+KiBTT0FQX0ZNQUM0IHNvYXBfaW5fc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2FkZHJlc3Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2FkZHJlc3MgKiA+KiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPHVkZGkyX19hZGRyZXNzICogPiAqIFNPQVBfRk1BQzYgc29hcF9uZXdfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2FkZHJlc3Moc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYWRkcmVzcyhzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19hZGRyZXNzICogPiopOworU09BUF9GTUFDNSBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYWRkcmVzcyAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2FkZHJlc3Moc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2FkZHJlc3Moc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fZW1haWwKKyNkZWZpbmUgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19lbWFpbCAoMTMxKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fZW1haWwoc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZW1haWwgKiA+Kik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2VtYWlsKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2VtYWlsICogPiopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fZW1haWwoc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZW1haWwgKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2VtYWlsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX2VtYWlsICogPiosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX2VtYWlsICogPiogU09BUF9GTUFDNCBzb2FwX2dldF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fZW1haWwoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZW1haWwgKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX2VtYWlsICogPiogU09BUF9GTUFDNCBzb2FwX2luX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19lbWFpbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZW1haWwgKiA+KiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPHVkZGkyX19lbWFpbCAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19lbWFpbChzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19lbWFpbChzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19lbWFpbCAqID4qKTsKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8dWRkaTJfX2VtYWlsICogPiAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fZW1haWwoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2VtYWlsKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworI2lmbmRlZiBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3Bob25lCisjZGVmaW5lIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fcGhvbmUgKDEyOSkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3Bob25lKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX3Bob25lICogPiopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19waG9uZShzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19waG9uZSAqID4qKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9wdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3Bob25lKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX3Bob25lICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19waG9uZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBpbnQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX19waG9uZSAqID4qLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPHVkZGkyX19waG9uZSAqID4qIFNPQVBfRk1BQzQgc29hcF9nZXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3Bob25lKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX3Bob25lICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPHVkZGkyX19waG9uZSAqID4qIFNPQVBfRk1BQzQgc29hcF9pbl9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fcGhvbmUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX3Bob25lICogPiosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcGhvbmUgKiA+ICogU09BUF9GTUFDNiBzb2FwX25ld19zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fcGhvbmUoc3RydWN0IHNvYXAqLCBpbnQpOworCitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2RlbGV0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fcGhvbmUoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcGhvbmUgKiA+Kik7CitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPHVkZGkyX19waG9uZSAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfaW5zdGFudGlhdGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX3Bob25lKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19waG9uZShzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19rZXllZFJlZmVyZW5jZQorI2RlZmluZSBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2tleWVkUmVmZXJlbmNlICgxMjcpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19rZXllZFJlZmVyZW5jZShzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX19rZXllZFJlZmVyZW5jZSAqID4qKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fa2V5ZWRSZWZlcmVuY2Uoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UgKiA+Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19rZXllZFJlZmVyZW5jZShzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX19rZXllZFJlZmVyZW5jZSAqID4qLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fa2V5ZWRSZWZlcmVuY2Uoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UgKiA+KiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdGQ6OnZlY3Rvcjx1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UgKiA+KiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19rZXllZFJlZmVyZW5jZShzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19rZXllZFJlZmVyZW5jZSAqID4qLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdGQ6OnZlY3Rvcjx1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UgKiA+KiBTT0FQX0ZNQUM0IHNvYXBfaW5fc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2tleWVkUmVmZXJlbmNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHN0ZDo6dmVjdG9yPHVkZGkyX19rZXllZFJlZmVyZW5jZSAqID4qLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8dWRkaTJfX2tleWVkUmVmZXJlbmNlICogPiAqIFNPQVBfRk1BQzYgc29hcF9uZXdfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2tleWVkUmVmZXJlbmNlKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2tleWVkUmVmZXJlbmNlKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2tleWVkUmVmZXJlbmNlICogPiopOworU09BUF9GTUFDNSBzdGQ6OnZlY3Rvcjx1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UgKiA+ICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19rZXllZFJlZmVyZW5jZShzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fa2V5ZWRSZWZlcmVuY2Uoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlCisjZGVmaW5lIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlICgxMjYpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19idXNpbmVzc1NlcnZpY2Uoc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlICogPiopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19idXNpbmVzc1NlcnZpY2Uoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlICogPiopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzU2VydmljZSAqID4qLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzU2VydmljZSAqID4qLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc1NlcnZpY2UgKiA+KiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19idXNpbmVzc1NlcnZpY2Uoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc1NlcnZpY2UgKiA+KiBTT0FQX0ZNQUM0IHNvYXBfaW5fc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzU2VydmljZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlICogPiosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlICogPiAqIFNPQVBfRk1BQzYgc29hcF9uZXdfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzU2VydmljZShzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19idXNpbmVzc1NlcnZpY2Uoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlICogPiopOworU09BUF9GTUFDNSBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlICogPiAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19idXNpbmVzc1NlcnZpY2Uoc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NJbmZvCisjZGVmaW5lIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NJbmZvICgxMjMpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19idXNpbmVzc0luZm8oc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NJbmZvICogPiopOworU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9kZWZhdWx0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19idXNpbmVzc0luZm8oc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NJbmZvICogPiopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NJbmZvKHN0cnVjdCBzb2FwKiwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzSW5mbyAqID4qLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NJbmZvKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzSW5mbyAqID4qLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc0luZm8gKiA+KiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19idXNpbmVzc0luZm8oc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NJbmZvICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc0luZm8gKiA+KiBTT0FQX0ZNQUM0IHNvYXBfaW5fc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzSW5mbyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NJbmZvICogPiosIGNvbnN0IGNoYXIqKTsKKworU09BUF9GTUFDNSBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NJbmZvICogPiAqIFNPQVBfRk1BQzYgc29hcF9uZXdfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2J1c2luZXNzSW5mbyhzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19idXNpbmVzc0luZm8oc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NJbmZvICogPiopOworU09BUF9GTUFDNSBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NJbmZvICogPiAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYnVzaW5lc3NJbmZvKHN0cnVjdCBzb2FwKiwgaW50LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHNpemVfdCopOworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9jb3B5X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19idXNpbmVzc0luZm8oc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fbmFtZQorI2RlZmluZSBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX25hbWUgKDExNSkKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX25hbWUoc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fbmFtZSAqID4qKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fbmFtZShzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19uYW1lICogPiopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fbmFtZShzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX19uYW1lICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19uYW1lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX25hbWUgKiA+KiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdGQ6OnZlY3Rvcjx1ZGRpMl9fbmFtZSAqID4qIFNPQVBfRk1BQzQgc29hcF9nZXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX25hbWUoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fbmFtZSAqID4qLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdGQ6OnZlY3Rvcjx1ZGRpMl9fbmFtZSAqID4qIFNPQVBfRk1BQzQgc29hcF9pbl9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fbmFtZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fbmFtZSAqID4qLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8dWRkaTJfX25hbWUgKiA+ICogU09BUF9GTUFDNiBzb2FwX25ld19zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fbmFtZShzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19uYW1lKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX25hbWUgKiA+Kik7CitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPHVkZGkyX19uYW1lICogPiAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fbmFtZShzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fbmFtZShzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19iaW5kaW5nVGVtcGxhdGUKKyNkZWZpbmUgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19iaW5kaW5nVGVtcGxhdGUgKDExMikKKyNlbmRpZgorU09BUF9GTUFDMyB2b2lkIFNPQVBfRk1BQzQgc29hcF9zZXJpYWxpemVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZShzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX19iaW5kaW5nVGVtcGxhdGUgKiA+Kik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZShzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19iaW5kaW5nVGVtcGxhdGUgKiA+Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19iaW5kaW5nVGVtcGxhdGUoc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYmluZGluZ1RlbXBsYXRlICogPiosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfb3V0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19iaW5kaW5nVGVtcGxhdGUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYmluZGluZ1RlbXBsYXRlICogPiosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX2JpbmRpbmdUZW1wbGF0ZSAqID4qIFNPQVBfRk1BQzQgc29hcF9nZXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZShzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19iaW5kaW5nVGVtcGxhdGUgKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX2JpbmRpbmdUZW1wbGF0ZSAqID4qIFNPQVBfRk1BQzQgc29hcF9pbl9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYmluZGluZ1RlbXBsYXRlKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHN0ZDo6dmVjdG9yPHVkZGkyX19iaW5kaW5nVGVtcGxhdGUgKiA+KiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPHVkZGkyX19iaW5kaW5nVGVtcGxhdGUgKiA+ICogU09BUF9GTUFDNiBzb2FwX25ld19zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYmluZGluZ1RlbXBsYXRlKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZShzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19iaW5kaW5nVGVtcGxhdGUgKiA+Kik7CitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPHVkZGkyX19iaW5kaW5nVGVtcGxhdGUgKiA+ICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19iaW5kaW5nVGVtcGxhdGUoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZShzdHJ1Y3Qgc29hcCosIGludCwgaW50LCB2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisKKyNpZm5kZWYgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19kZXNjcmlwdGlvbgorI2RlZmluZSBTT0FQX1RZUEVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2Rlc2NyaXB0aW9uICgxMDcpCisjZW5kaWYKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfc2VyaWFsaXplX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19kZXNjcmlwdGlvbihzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX19kZXNjcmlwdGlvbiAqID4qKTsKK1NPQVBfRk1BQzMgdm9pZCBTT0FQX0ZNQUM0IHNvYXBfZGVmYXVsdF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fZGVzY3JpcHRpb24oc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZGVzY3JpcHRpb24gKiA+Kik7CitTT0FQX0ZNQUMzIGludCBTT0FQX0ZNQUM0IHNvYXBfcHV0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19kZXNjcmlwdGlvbihzdHJ1Y3Qgc29hcCosIGNvbnN0IHN0ZDo6dmVjdG9yPHVkZGkyX19kZXNjcmlwdGlvbiAqID4qLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX291dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fZGVzY3JpcHRpb24oc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgaW50LCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZGVzY3JpcHRpb24gKiA+KiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZGVzY3JpcHRpb24gKiA+KiBTT0FQX0ZNQUM0IHNvYXBfZ2V0X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19kZXNjcmlwdGlvbihzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19kZXNjcmlwdGlvbiAqID4qLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworU09BUF9GTUFDMyBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZGVzY3JpcHRpb24gKiA+KiBTT0FQX0ZNQUM0IHNvYXBfaW5fc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2Rlc2NyaXB0aW9uKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIHN0ZDo6dmVjdG9yPHVkZGkyX19kZXNjcmlwdGlvbiAqID4qLCBjb25zdCBjaGFyKik7CisKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8dWRkaTJfX2Rlc2NyaXB0aW9uICogPiAqIFNPQVBfRk1BQzYgc29hcF9uZXdfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2Rlc2NyaXB0aW9uKHN0cnVjdCBzb2FwKiwgaW50KTsKKworU09BUF9GTUFDNSB2b2lkIFNPQVBfRk1BQzYgc29hcF9kZWxldGVfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2Rlc2NyaXB0aW9uKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2Rlc2NyaXB0aW9uICogPiopOworU09BUF9GTUFDNSBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZGVzY3JpcHRpb24gKiA+ICogU09BUF9GTUFDNiBzb2FwX2luc3RhbnRpYXRlX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19kZXNjcmlwdGlvbihzdHJ1Y3Qgc29hcCosIGludCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBzaXplX3QqKTsKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfY29weV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fZGVzY3JpcHRpb24oc3RydWN0IHNvYXAqLCBpbnQsIGludCwgdm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOworCisjaWZuZGVmIFNPQVBfVFlQRV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYWRkcmVzc0xpbmUKKyNkZWZpbmUgU09BUF9UWVBFX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19hZGRyZXNzTGluZSAoMTAxKQorI2VuZGlmCitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX3NlcmlhbGl6ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYWRkcmVzc0xpbmUoc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYWRkcmVzc0xpbmUgKiA+Kik7CitTT0FQX0ZNQUMzIHZvaWQgU09BUF9GTUFDNCBzb2FwX2RlZmF1bHRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2FkZHJlc3NMaW5lKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX2FkZHJlc3NMaW5lICogPiopOworU09BUF9GTUFDMyBpbnQgU09BUF9GTUFDNCBzb2FwX3B1dF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYWRkcmVzc0xpbmUoc3RydWN0IHNvYXAqLCBjb25zdCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYWRkcmVzc0xpbmUgKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgaW50IFNPQVBfRk1BQzQgc29hcF9vdXRfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2FkZHJlc3NMaW5lKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciosIGludCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWRkaTJfX2FkZHJlc3NMaW5lICogPiosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX2FkZHJlc3NMaW5lICogPiogU09BUF9GTUFDNCBzb2FwX2dldF9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYWRkcmVzc0xpbmUoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYWRkcmVzc0xpbmUgKiA+KiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK1NPQVBfRk1BQzMgc3RkOjp2ZWN0b3I8dWRkaTJfX2FkZHJlc3NMaW5lICogPiogU09BUF9GTUFDNCBzb2FwX2luX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19hZGRyZXNzTGluZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYWRkcmVzc0xpbmUgKiA+KiwgY29uc3QgY2hhciopOworCitTT0FQX0ZNQUM1IHN0ZDo6dmVjdG9yPHVkZGkyX19hZGRyZXNzTGluZSAqID4gKiBTT0FQX0ZNQUM2IHNvYXBfbmV3X3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19hZGRyZXNzTGluZShzdHJ1Y3Qgc29hcCosIGludCk7CisKK1NPQVBfRk1BQzUgdm9pZCBTT0FQX0ZNQUM2IHNvYXBfZGVsZXRlX3N0ZF9fdmVjdG9yVGVtcGxhdGVPZlBvaW50ZXJUb3VkZGkyX19hZGRyZXNzTGluZShzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19hZGRyZXNzTGluZSAqID4qKTsKK1NPQVBfRk1BQzUgc3RkOjp2ZWN0b3I8dWRkaTJfX2FkZHJlc3NMaW5lICogPiAqIFNPQVBfRk1BQzYgc29hcF9pbnN0YW50aWF0ZV9zdGRfX3ZlY3RvclRlbXBsYXRlT2ZQb2ludGVyVG91ZGRpMl9fYWRkcmVzc0xpbmUoc3RydWN0IHNvYXAqLCBpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90Kik7CitTT0FQX0ZNQUM1IHZvaWQgU09BUF9GTUFDNiBzb2FwX2NvcHlfc3RkX192ZWN0b3JUZW1wbGF0ZU9mUG9pbnRlclRvdWRkaTJfX2FkZHJlc3NMaW5lKHN0cnVjdCBzb2FwKiwgaW50LCBpbnQsIHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKworU09BUF9FTkRfTkFNRVNQQUNFKHVkZGkpCisKKyNlbmRpZgorCisvKiBFbmQgb2YgdWRkaUguaCAqLwpkaWZmIC0tZ2l0IGEvdWRkaTIvdWRkaV92Mi5oIGIvdWRkaTIvdWRkaV92Mi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYzZlYTAKLS0tIC9kZXYvbnVsbAorKysgYi91ZGRpMi91ZGRpX3YyLmgKQEAgLTAsMCArMSw0NDUwIEBACisvKiogQG1haW5wYWdlIGdTT0FQIFVEREkgdjIKKworVW5pdmVyc2FsIERlc2NyaXB0aW9uLCBEaXNjb3ZlcnkgYW5kIEludGVncmF0aW9uLCBvciBVRERJLCBpcyB0aGUgbmFtZSBvZiBhCitncm91cCBvZiB3ZWItYmFzZWQgcmVnaXN0cmllcyB0aGF0IGV4cG9zZSBpbmZvcm1hdGlvbiBhYm91dCBhIGJ1c2luZXNzIG9yIG90aGVyCitlbnRpdHkgYW5kIGl0cyB0ZWNobmljYWwgaW50ZXJmYWNlcy4KKworU2VlIHRoZSBVRERJIHYyIHNwZWNpZmljYXRpb24gQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0KK2ZvciBtb3JlIGRldGFpbHMuCisKK0BzZWN0aW9uIFVEREkyX0NMQVNTRVMgQ2xhc3NlcworCitTZWUgUmVsYXRlZCBQYWdlcyBmb3IgZXhhbXBsZXMuCisKK1VEREkgSW5xdWlyZSBjbGFzc2VzCisKKy0gQHJlZiB1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nCistIEByZWYgdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MKKy0gQHJlZiB1ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcworLSBAcmVmIHVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2UKKy0gQHJlZiB1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWwKKy0gQHJlZiB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwKKy0gQHJlZiB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsCistIEByZWYgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dAorLSBAcmVmIHVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbAorLSBAcmVmIHVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsCisKK1VEREkgUHVibGlzaCBjbGFzc2VzCisKKy0gQHJlZiB1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMKKy0gQHJlZiB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcKKy0gQHJlZiB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzCistIEByZWYgdWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlCistIEByZWYgdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwKKy0gQHJlZiB1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMKKy0gQHJlZiB1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4KKy0gQHJlZiB1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydAorLSBAcmVmIHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuCistIEByZWYgdWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zCistIEByZWYgdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbworLSBAcmVmIHVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcKKy0gQHJlZiB1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcworLSBAcmVmIHVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2UKKy0gQHJlZiB1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwKKy0gQHJlZiB1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMKKworQHNlY3Rpb24gVURESTJfQklORElOR1MgQmluZGluZyBSZWZlcmVuY2UKKworLSBAcmVmIElucXVpcmVTb2FwCistIEByZWYgUHVibGlzaFNvYXAKKworKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpmaW5kX2JpbmRpbmcKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nCitAYnJpZWYKKworUmVwcmVzZW50cyBhIHJlcXVlc3QgdG8gbG9jYXRlIGJpbmRpbmdzIHRoYXQgbWVldCB0aGUgc3BlY2lmaWVkIHJlcXVpcmVtZW50cy4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzcxMgorKi8KKworLyoqCitAZm4gdWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZzo6dWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmluZF9VU0NPUkViaW5kaW5nIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZzo6dWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdE1vZGVsS2V5KQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSB0TW9kZWxLZXkgc3RyaW5nCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZpbmRfVVNDT1JFYmluZGluZyBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkIHRNb2RlbAora2V5LgorKi8KKworLyoqCitAZm4gdWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZzo6dWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8Y2hhcio+IHRNb2RlbEtleXMpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIHRNb2RlbEtleXMgY29sbGVjdGlvbiBvZiB0TW9kZWwga2V5IHN0cmluZ3MKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmluZF9VU0NPUkViaW5kaW5nIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQgdE1vZGVsCitrZXlzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2JpbmRpbmdEZXRhaWwqIHVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmc6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQpCitAYnJpZWYKK0BwYXJhbVtpbl0gZW5kcG9pbnQgVVJMIG9mIHRoZSBVRERJIHNlcnZlcgorQHJldHVybiBBIHBvaW50ZXIgdG8gYSB1ZGRpMl9fYmluZGluZ0RldGFpbCBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcgorCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmVyIHRvIGZpbmQgYmluZGluZyBkZXRhaWxzLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpmaW5kX2J1c2luZXNzCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCitAY2xhc3MgdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBsb2NhdGUgYnVzaW5lc3NlcyB0aGF0IG1lZXQgc3BlY2lmaWMgcmVxdWlyZW1lbnRzLiBXaGVuCit0aGUgc2VuZCBtZXRob2QgaXMgY2FsbGVkLCB0aGUgaW5zdGFuY2UgcmV0dXJucyBhIHVkZGkyX19idXNpbmVzc0xpc3Qgb2JqZWN0Cit0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZiBidXNpbmVzcyB0aGF0IG1hdGNoZWQgdGhlIHNlYXJjaCBjcml0ZXJpYS4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzcxMworCitTZWUgYWxzbyBAcmVmIGV4YW1wbGUyLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M6OnVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmaW5kX1VTQ09SRWJ1c2luZXNzIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M6OnVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmaW5kX1VTQ09SRWJ1c2luZXNzIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQgbmFtZQorb2YgdGhlIHJlcXVlc3RlZCBidXNpbmVzcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzOjp1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8dWRkaTJfX2tleWVkUmVmZXJlbmNlKj4ga2V5ZWRSZWZlcmVuY2VzKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmaW5kX1VTQ09SRWJ1c2luZXNzIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK2NhdGVnb3J5IHJlZmVyZW5jZXMuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzczo6dWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAgKnNvYXAsIHN0ZDo6dmVjdG9yPGNoYXIqPiB0TW9kZWxLZXlzKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmaW5kX1VTQ09SRWJ1c2luZXNzIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQgdE1vZGVsCitrZXlzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2J1c2luZXNzTGlzdCAqdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3M6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQpCitAYnJpZWYKK0BwYXJhbVtpbl0gZW5kcG9pbnQgVVJMIG9mIHRoZSBVRERJIHNlcnZlcgorQHJldHVybiBBIHBvaW50ZXIgdG8gYSB1ZGRpMl9fYnVzaW5lc3NMaXN0IG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2ZXIgdG8gZmluZCBhIGxpc3Qgb2YgYnVzaW5lc3Nlcy4KKworU2VlIGFsc28gQHJlZiBleGFtcGxlMi4KKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6ZmluZF9yZWxhdGVkQnVzaW5lc3NlcworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorQGNsYXNzIHVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzCitAYnJpZWYKKworUmVwcmVzZW50cyBhIHJlcXVlc3QgdG8gbG9jYXRlIGJ1c2luZXNzZXMgdGhhdCBhcmUgcmVsYXRlZCB0byBhIHNwZWNpZmljCitidXNpbmVzcy4gV2hlbiB0aGUgc2VuZCBtZXRob2QgaXMgY2FsbGVkLCB0aGUgaW5zdGFuY2UgcmV0dXJucyBhCit1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzTGlzdCBvYmplY3QgdGhhdCBjb250YWlucyBhIGxpc3Qgb2YgYnVzaW5lc3MgdGhhdCBtYXRjaGVkCit0aGUgcmVsYXRpb25zaGlwIHNldC4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzcxNAorKi8KKworLyoqCitAZm4gdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXM6OnVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmaW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzcyBjbGFzcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzOjp1ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqYnVzaW5lc3NLZXkpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIGJ1c2luZXNzS2V5IHN0cmluZworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmaW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzcyBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkCitidXNpbmVzcyBrZXkuCisqLworCisvKioKK0BmbiB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0ICp1ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3Nlczo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCkKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19yZWxhdGVkQnVzaW5lc3NMaXN0IG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2ZXIgdG8gZmluZCBhIGxpc3Qgb2YgcmVsYXRlZCBidXNpbmVzc2VzLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpmaW5kX3NlcnZpY2UKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlCitAYnJpZWYKKworUmVwcmVzZW50cyBhIHJlcXVlc3QgdG8gbG9jYXRlIHNlcnZpY2VzIHRoYXQgbWVldCB0aGUgc3BlY2lmaWVkIHJlcXVpcmVtZW50cy4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzcxNQorCitTZWUgYWxzbyBAcmVmIGV4YW1wbGUxLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZTo6dWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmluZF9VU0NPUkVzZXJ2aWNlIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZTo6dWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqbmFtZSkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gbmFtZSBvZiB0aGUgc2VydmljZQorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmaW5kX1VTQ09SRXNlcnZpY2UgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZCBuYW1lLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZTo6dWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8dWRkaTJfX2tleWVkUmVmZXJlbmNlKj4ga2V5ZWRSZWZlcmVuY2VzKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBrZXllZFJlZmVyZW5jZXMgY29sbGVjdGlvbiBvZiBjYXRlZ29yeSBrZXlzCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZpbmRfVVNDT1JFc2VydmljZSBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkCitjYXRlZ29yeSBrZXlzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZTo6dWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8Y2hhcio+IHRNb2RlbEtleXMpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIHRNb2RlbEtleXMgY29sbGVjdGlvbiBvZiB0TW9kZWwga2V5IHN0cmluZ3MKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmluZF9VU0NPUkVzZXJ2aWNlIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQgdE1vZGVsCitrZXlzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX3NlcnZpY2VMaXN0KiB1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50KQorQGJyaWVmCitAcGFyYW1baW5dIGVuZHBvaW50IFVSTCBvZiB0aGUgVURESSBzZXJ2ZXIKK0ByZXR1cm4gQSBwb2ludGVyIHRvIGEgdWRkaTJfX3NlcnZpY2VMaXN0IG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2ZXIgdG8gZmluZCBhIGxpc3Qgb2Ygc2VydmljZXMuCisKK1NlZSBhbHNvIEByZWYgZXhhbXBsZTEuCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOmZpbmRfdE1vZGVsCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCitAY2xhc3MgdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsCitAYnJpZWYKKworUmVwcmVzZW50cyBhIHJlcXVlc3QgdG8gbG9jYXRlIGEgbGlzdCBvZiB0TW9kZWwgZW50cmllcyB0aGF0IG1hdGNoIGEgc2V0IG9mCitzcGVjaWZpYyBjcml0ZXJpYS4gVGhlIHJlc3VsdCBvZiBhIHNlYXJjaCBpcyBhIHVkZGkyX190TW9kZWxMaXN0IG9iamVjdCB0aGF0Citjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCByZWdpc3RlcmVkIHRNb2RlbCBkYXRhIHRoYXQgbWF0Y2hlcyB0aGUgY3JpdGVyaWEuCisKK1NlZSBAdXJsIGh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3MTYKKyovCisKKy8qKgorQGZuIHVkZGkyX19maW5kX1VTQ09SRXRNb2RlbDo6dWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmaW5kX1VTQ09SRXRNb2RlbCBjbGFzcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19maW5kX1VTQ09SRXRNb2RlbDo6dWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICpuYW1lKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBuYW1lIG9mIHRoZSB0TW9kZWwKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmluZF9VU0NPUkV0TW9kZWwgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZCB0TW9kZWwKK25hbWUuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWw6OnVkZGkyX19maW5kX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8dWRkaTJfX2tleWVkUmVmZXJlbmNlKj4ga2V5ZWRSZWZlcmVuY2VzKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBrZXllZFJlZmVyZW5jZXMgY29sbGVjdGlvbiBvZiBjYXRlZ29yeSBrZXlzCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZpbmRfVVNDT1JFdE1vZGVsIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQgY2F0ZWdvcnkKK2tleXMuCisqLworCisvKioKK0BmbiB1ZGRpMl9fdE1vZGVsTGlzdCogdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50KQorQGJyaWVmCitAcGFyYW1baW5dIGVuZHBvaW50IFVSTCBvZiB0aGUgVURESSBzZXJ2ZXIKK0ByZXR1cm4gQSBwb2ludGVyIHRvIGEgdWRkaTJfX3RNb2RlbExpc3Qgb2JqZWN0IG9yIE5VTEwgb24gZXJyb3IKKworU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZlciB0byBmaW5kIGEgdE1vZGVsTGlzdC4KKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6Z2V0X2JpbmRpbmdEZXRhaWwKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBnZXQgYmluZGluZyBkZXRhaWxzIGZyb20gYSBVRERJIHNlcnZlci4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzcxNworKi8KKworLyoqCitAZm4gdWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdldF9VU0NPUkViaW5kaW5nRGV0YWlsIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmJpbmRpbmdLZXkpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIGJpbmRpbmdLZXkgc3RyaW5nCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdldF9VU0NPUkViaW5kaW5nRGV0YWlsIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK2JpbmRpbmcga2V5LgorKi8KKworLyoqCitAZm4gdWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwoc3RydWN0IHNvYXAgKnNvYXAsIHN0ZDo6dmVjdG9yPGNoYXIqPiBiaW5kaW5nS2V5cykKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gYmluZGluZ0tleXMgY29sbGVjdGlvbiBvZiBrZXkgc3RyaW5ncworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFYmluZGluZ0RldGFpbCBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkCitjb2xsZWN0aW9uIG9mIGJpbmRpbmcga2V5cy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19iaW5kaW5nRGV0YWlsKiB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWw6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQpCitAYnJpZWYKK0BwYXJhbVtpbl0gZW5kcG9pbnQgVVJMIG9mIHRoZSBVRERJIHNlcnZlcgorQHJldHVybiBBIHBvaW50ZXIgdG8gYSB1ZGRpMl9fYmluZGluZ0RldGFpbCBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcgorCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmVyIHRvIGdldCB0aGUgYmluZGluZyBkZXRhaWxzLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpnZXRfYnVzaW5lc3NEZXRhaWwKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsCitAYnJpZWYKKworUmVwcmVzZW50cyBhIHJlcXVlc3QgdG8gZ2V0IGJ1c2luZXNzIGRldGFpbHMgZnJvbSBhIFVEREkgc2VydmVyLgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzE4IAorKi8KKworLyoqCitAZm4gdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbDo6dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbDo6dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqYnVzaW5lc3NLZXkpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIGJ1c2luZXNzS2V5IHN0cmluZworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAorYnVzaW5lc3Mga2V5LgorKi8KKworLyoqCitAZm4gdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbDo6dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8Y2hhcio+IGJ1c2luZXNzS2V5cykKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gYnVzaW5lc3NLZXlzIGNvbGxlY3Rpb24gb2Yga2V5IHN0cmluZ3MKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK2NvbGxlY3Rpb24gb2YgYnVzaW5lc3Mga2V5cy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19idXNpbmVzc0RldGFpbCogdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbDo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCkKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19idXNpbmVzc0RldGFpbCBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcgorCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmVyIHRvIGdldCB0aGUgYnVzaW5lc3MgZGV0YWlscy4KKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6Z2V0X2J1c2luZXNzRGV0YWlsRXh0CisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCitAY2xhc3MgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dAorQGJyaWVmCisKK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIGdldCBidXNpbmVzcyBkZXRhaWxzIGZyb20gYSBVRERJIHNlcnZlci4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzcxOQorKi8KKworLyoqCitAZm4gdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dDo6dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dChzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0IGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dDo6dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqYnVzaW5lc3NLZXkpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIGJ1c2luZXNzS2V5IHN0cmluZworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAorYnVzaW5lc3Mga2V5LgorKi8KKworLyoqCitAZm4gdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dDo6dWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8Y2hhcio+IGJ1c2luZXNzS2V5cykKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gYnVzaW5lc3NLZXlzIGNvbGxlY3Rpb24gb2Yga2V5IHN0cmluZ3MKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0IGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK2NvbGxlY3Rpb24gb2YgYnVzaW5lc3Mga2V5cy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19idXNpbmVzc0RldGFpbEV4dCogdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dDo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCkKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19idXNpbmVzc0RldGFpbEV4dCBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcgorCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmVyIHRvIGdldCB0aGUgYnVzaW5lc3MgZGV0YWlscy4KKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6Z2V0X3NlcnZpY2VEZXRhaWwKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBnZXQgc2VydmljZSBkZXRhaWxzIGZyb20gYSBVRERJIHNlcnZlci4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzcyMAorKi8KKworLyoqCitAZm4gdWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdldF9VU0NPUkVzZXJ2aWNlRGV0YWlsIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnNlcnZpY2VLZXkpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIHNlcnZpY2VLZXkgc3RyaW5nCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdldF9VU0NPUkVzZXJ2aWNlRGV0YWlsIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK3NlcnZpY2Uga2V5LgorKi8KKworLyoqCitAZm4gdWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsOjp1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwoc3RydWN0IHNvYXAgKnNvYXAsIHN0ZDo6dmVjdG9yPGNoYXIqPiBzZXJ2aWNlS2V5cykKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gc2VydmljZUtleXMgY29sbGVjdGlvbiBvZiBrZXkgc3RyaW5ncworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFc2VydmljZURldGFpbCBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkCitjb2xsZWN0aW9uIG9mIHNlcnZpY2Uga2V5cy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19zZXJ2aWNlRGV0YWlsKiB1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWw6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQpCitAYnJpZWYKK0BwYXJhbVtpbl0gZW5kcG9pbnQgVVJMIG9mIHRoZSBVRERJIHNlcnZlcgorQHJldHVybiBBIHBvaW50ZXIgdG8gYSB1ZGRpMl9fc2VydmljZURldGFpbCBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcgorCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmVyIHRvIGdldCB0aGUgc2VydmljZSBkZXRhaWxzLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpnZXRfdE1vZGVsRGV0YWlsCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCitAY2xhc3MgdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBnZXQgdE1vZGVsIGRldGFpbHMgZnJvbSBhIFVEREkgc2VydmVyLgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzIxCisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbDo6dWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdldF9VU0NPUkV0TW9kZWxEZXRhaWwgY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbDo6dWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwoc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnRNb2RlbEtleSkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gdE1vZGVsS2V5IHN0cmluZworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFdE1vZGVsRGV0YWlsIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK3RNb2RlbCBrZXkuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbDo6dWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwoc3RydWN0IHNvYXAgKnNvYXAsIHN0ZDo6dmVjdG9yPGNoYXIqPiB0TW9kZWxLZXlzKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSB0TW9kZWxLZXlzIGNvbGxlY3Rpb24gb2Yga2V5IHN0cmluZ3MKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRXRNb2RlbERldGFpbCBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkCitjb2xsZWN0aW9uIG9mIHRNb2RlbCBrZXlzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX3RNb2RlbERldGFpbCogdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWw6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQpCitAYnJpZWYKK0BwYXJhbVtpbl0gZW5kcG9pbnQgVVJMIG9mIHRoZSBVRERJIHNlcnZlcgorQHJldHVybiBBIHBvaW50ZXIgdG8gYSB1ZGRpMl9fdE1vZGVsRGV0YWlsIG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2ZXIgdG8gZ2V0IHRoZSB0TW9kZWwgZGV0YWlscy4KKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6YWRkX3B1Ymxpc2hlckFzc2VydGlvbnMKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBhZGQgb25lIG9yIG1vcmUgcHVibGlzaGVyIGFzc2VydGlvbnMgdG8gdGhlIGFzc2VydGlvbgorY29sbGVjdGlvbiBmb3IgYW4gaW5kaXZpZHVhbCBwdWJsaXNoZXIuCisKK1NlZSBAdXJsIGh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3MzEKKyovCisKKy8qKgorQGZuIHVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczo6dWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyBjbGFzcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczo6dWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKj4gcHVibGlzaGVyQXNzZXJ0aW9ucykKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gcHVibGlzaGVyQXNzZXJ0aW9ucyBjb2xsZWN0aW9uIG9mIHB1Ymxpc2hlciBhc3NlcnRpb25zCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zIGNsYXNzIHVzaW5nIHRoZQorc3BlY2lmaWVkIHB1Ymxpc2hlciBhc3NlcnRpb25zLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0ICp1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKQorQGJyaWVmCitAcGFyYW1baW5dIGVuZHBvaW50IFVSTCBvZiB0aGUgVURESSBzZXJ2ZXIKK0BwYXJhbVtpbl0gYXV0aEluZm8gYXV0aG9yaXphdGlvbiB0b2tlbiBwcm92aWRlZCBieSB0aGUgVURESSBzZXJ2ZXIKK0ByZXR1cm4gQSBwb2ludGVyIHRvIGEgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0IG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2ZXIgdG8gYWRkIG9uZSBvciBtb3JlIHB1Ymxpc2hlciBhc3NlcnRpb25zIHRvIHRoZQorYXNzZXJ0aW9uIGNvbGxlY3Rpb24gZm9yIGFuIGluZGl2aWR1YWwgcHVibGlzaGVyLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpkZWxldGVfYmluZGluZworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorQGNsYXNzIHVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZworQGJyaWVmCisKK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIGRlbGV0ZSBhIGJpbmRpbmcgdGhhdCBtZWV0cyB0aGUgc3BlY2lmaWVkIHJlcXVpcmVtZW50cy4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzczMgorKi8KKworLyoqCitAZm4gdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nOjp1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZGVsZXRlX1VTQ09SRWJpbmRpbmcgY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmc6OnVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqYmluZGluZ0tleSkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gYmluZGluZ0tleSBhIGJpbmRpbmcga2V5IHN0cmluZworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWxldGVfVVNDT1JFYmluZGluZyBjbGFzcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19kZWxldGVfVVNDT1JFYmluZGluZzo6dWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3RvcjxjaGFyKj4gYmluZGluZ0tleXMpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIGJpbmRpbmdLZXlzIGNvbGxlY3Rpb24gb2YgYmluZGluZyBrZXlzCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGV0ZV9VU0NPUkViaW5kaW5nIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK2JpbmRpbmcga2V5cy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCAqdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbykKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcGFyYW1baW5dIGF1dGhJbmZvIGF1dGhvcml6YXRpb24gdG9rZW4gcHJvdmlkZWQgYnkgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcgorCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmljZSB0byBkZWxldGUgYSBiaW5kaW5nIHRoYXQgbWVldHMgdGhlIHNwZWNpZmllZAorcmVxdWlyZW1lbnRzLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpkZWxldGVfYnVzaW5lc3MKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzCitAYnJpZWYKKworUmVwcmVzZW50cyBhIHJlcXVlc3QgdG8gZGVsZXRlIGEgYnVzaW5lc3MgdGhhdCBtZWV0cyB0aGUgc3BlY2lmaWVkIHJlcXVpcmVtZW50cy4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzczMworKi8KKworLyoqCitAZm4gdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzczo6dWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZGVsZXRlX1VTQ09SRWJ1c2luZXNzIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzczo6dWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqYnVzaW5lc3NLZXkpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIGJ1c2luZXNzS2V5IGEgYnVzaW5lc3Mga2V5IHN0cmluZworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWxldGVfVVNDT1JFYnVzaW5lc3MgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAorYnVzaW5lc3Mga2V5LgorKi8KKworLyoqCitAZm4gdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzczo6dWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8Y2hhcio+IGJ1c2luZXNzS2V5cykKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gYnVzaW5lc3NLZXlzIGNvbGxlY3Rpb24gb2YgYnVzaW5lc3Mga2V5cworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWxldGVfVVNDT1JFYnVzaW5lc3MgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAorYnVzaW5lc3Mga2V5cy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCAqdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzczo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pCitAYnJpZWYKK0BwYXJhbVtpbl0gZW5kcG9pbnQgVVJMIG9mIHRoZSBVRERJIHNlcnZlcgorQHBhcmFtW2luXSBhdXRoSW5mbyBhdXRob3JpemF0aW9uIHRva2VuIHByb3ZpZGVkIGJ5IHRoZSBVRERJIHNlcnZlcgorQHJldHVybiBBIHBvaW50ZXIgdG8gYSB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgb2JqZWN0IG9yIE5VTEwgb24gZXJyb3IKKworU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZpY2UgdG8gZGVsZXRlIGEgYnVzaW5lc3MgdGhhdCBtZWV0cyB0aGUgc3BlY2lmaWVkCityZXF1aXJlbWVudHMuCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOmRlbGV0ZV9zZXJ2aWNlCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCitAY2xhc3MgdWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlCitAYnJpZWYKKworUmVwcmVzZW50cyBhIHJlcXVlc3QgdG8gZGVsZXRlIGEgc2VydmljZSB0aGF0IG1lZXRzIHRoZSBzcGVjaWZpZWQgcmVxdWlyZW1lbnRzLgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzM1CisqLworCisvKioKK0BmbiB1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2U6OnVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZGVsZXRlX1VTQ09SRXNlcnZpY2UgY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2U6OnVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqc2VydmljZUtleSkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gc2VydmljZUtleSBhIHNlcnZpY2Uga2V5IHN0cmluZworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWxldGVfVVNDT1JFc2VydmljZSBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkCitzZXJ2aWNlIGtleS4KKyovCisKKy8qKgorQGZuIHVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZTo6dWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3RvcjxjaGFyKj4gc2VydmljZUtleXMpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIHNlcnZpY2VLZXlzIGNvbGxlY3Rpb24gb2Ygc2VydmljZSBrZXlzCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGV0ZV9VU0NPUkVzZXJ2aWNlIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK3NlcnZpY2Uga2V5cy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCAqdWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbykKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcGFyYW1baW5dIGF1dGhJbmZvIGF1dGhvcml6YXRpb24gdG9rZW4gcHJvdmlkZWQgYnkgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcgorCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmljZSB0byBkZWxldGUgYSBzZXJ2aWNlIHRoYXQgbWVldHMgdGhlIHNwZWNpZmllZAorcmVxdWlyZW1lbnRzLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpkZWxldGVfdE1vZGVsCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCitAY2xhc3MgdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBkZWxldGUgYSB0TW9kZWwgdGhhdCBtZWV0cyB0aGUgc3BlY2lmaWVkIHJlcXVpcmVtZW50cy4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzczNgorKi8KKworLyoqCitAZm4gdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWw6OnVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWxldGVfVVNDT1JFdE1vZGVsIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWw6OnVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0TW9kZWxLZXkpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIHRNb2RlbEtleSBhIHRNb2RlbCBrZXkgc3RyaW5nCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGV0ZV9VU0NPUkV0TW9kZWwgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAordE1vZGVsIGtleS4KKyovCisKKy8qKgorQGZuIHVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsOjp1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8Y2hhcio+IHRNb2RlbEtleXMpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIHRNb2RlbEtleXMgY29sbGVjdGlvbiBvZiB0TW9kZWwga2V5cworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWxldGVfVVNDT1JFdE1vZGVsIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK3RNb2RlbCBrZXlzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0ICp1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbDo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pCitAYnJpZWYKK0BwYXJhbVtpbl0gZW5kcG9pbnQgVVJMIG9mIHRoZSBVRERJIHNlcnZlcgorQHBhcmFtW2luXSBhdXRoSW5mbyBhdXRob3JpemF0aW9uIHRva2VuIHByb3ZpZGVkIGJ5IHRoZSBVRERJIHNlcnZlcgorQHJldHVybiBBIHBvaW50ZXIgdG8gYSB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgb2JqZWN0IG9yIE5VTEwgb24gZXJyb3IKKworU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZpY2UgdG8gZGVsZXRlIGEgdE1vZGVsIHRoYXQgbWVldHMgdGhlIHNwZWNpZmllZAorcmVxdWlyZW1lbnRzLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpkZWxldGVfcHVibGlzaGVyQXNzZXJ0aW9ucworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorQGNsYXNzIHVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucworQGJyaWVmCisKK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIGRlbGV0ZSBwdWJsaXNoZXIgYXNzZXJ0aW9ucyBtZWV0aW5nIHRoZSBzcGVjaWZpZWQKK3JlcXVpcmVtZW50cy4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzczNAorKi8KKworLyoqCitAZm4gdWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjp1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjp1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAgKnNvYXAsIHN0ZDo6dmVjdG9yPHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24qPiBwdWJsaXNoZXJBc3NlcnRpb25zKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBwdWJsaXNoZXJBc3NlcnRpb25zIGEgY29sbGVjdGlvbiBvZiBwdWJsaXNoZXIgYXNzZXJ0aW9ucworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyBjbGFzcyB1c2luZyB0aGUKK3NwZWNpZmllZCBjb2xsZWN0aW9uIG9mIHB1Ymxpc2hlciBhc3NlcnRpb25zLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0ICp1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnM6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKQorQGJyaWVmCitAcGFyYW1baW5dIGVuZHBvaW50IFVSTCBvZiB0aGUgVURESSBzZXJ2ZXIKK0BwYXJhbVtpbl0gYXV0aEluZm8gYXV0aG9yaXphdGlvbiB0b2tlbiBwcm92aWRlZCBieSB0aGUgVURESSBzZXJ2ZXIKK0ByZXR1cm4gQSBwb2ludGVyIHRvIGEgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0IG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2aWNlIHRvIGRlbGV0ZSBwdWJsaXNoZXIgYXNzZXJ0aW9ucyBtZWV0aW5nIHRoZQorc3BlY2lmaWVkIHJlcXVpcmVtZW50cy4KKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6ZGlzY2FyZF9hdXRoVG9rZW4KKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4KK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBkaXNjYXJkIGFuIGF1dGhvcml6YXRpb24gdG9rZW4gb2J0YWluZWQgd2l0aCB0aGUKK2dldF9VU0NPUkVhdXRoVG9rZW4gY2xhc3MuCisKK1NlZSBAdXJsIGh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3MzcKKyovCisKKy8qKgorQGZuIHVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbjo6dWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWxldGVfVVNDT1JFYXV0aFRva2VuIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuOjp1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKmF1dGhJbmZvKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBhdXRoSW5mbyBhdXRob3JpemF0aW9uIHRva2VuIHByb3ZpZGVkIGJ5IHRoZSBVRERJIHNlcnZlcgorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWxldGVfVVNDT1JFYXV0aFRva2VuIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK2F1dGhlbnRpY2F0aW9uIHRva2VuIHN0cmluZy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCAqdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50KQorQGJyaWVmCitAcGFyYW1baW5dIGVuZHBvaW50IFVSTCBvZiB0aGUgVURESSBzZXJ2ZXIKK0ByZXR1cm4gQSBwb2ludGVyIHRvIGEgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0IG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2aWNlIHRvIGRpc2NhcmQgYW4gYXV0aGVudGljYXRpb24gdG9rZW4uCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOmdldF9hc3NlcnRpb25TdGF0dXNSZXBvcnQKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydAorQGJyaWVmCisKK1Byb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGRldGVybWluZSB0aGUgc3RhdHVzIG9mIGN1cnJlbnQgYW5kIG91dHN0YW5kaW5nCitwdWJsaXNoZXIgYXNzZXJ0aW9ucy4gVGhlIHJlc3VsdHMgY2FuIGJlIHJlc3RyaWN0ZWQgYnkgc2V0dGluZyB0aGUKK2NvbXBsZXRpb25TdGF0dXMgcHJvcGVydHkuCisKK1NlZSBAdXJsIGh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3MzgKKyovCisKKy8qKgorQGZuIHVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0Ojp1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydChzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCBjbGFzcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0Ojp1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydChzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqY29tcGxldGlvblN0YXR1cykKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gY29tcGxldGlvblN0YXR1cyBjb21wbGV0aW9uIHN0YXR1cyBzdHJpbmcKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCBjbGFzcyB1c2luZyB0aGUKK3NwZWNpZmllZCBjb21wbGV0aW9uIHN0YXR1cy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQgKnVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0OjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbykKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcGFyYW1baW5dIGF1dGhJbmZvIGF1dGhvcml6YXRpb24gdG9rZW4gcHJvdmlkZWQgYnkgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19hc3NlcnRpb25TdGF0dXNSZXBvcnQgb2JqZWN0IG9yIE5VTEwgb24gZXJyb3IKKworU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZpY2UgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgY3VycmVudCBhbmQgb3V0c3RhbmRpbmcKK3B1Ymxpc2hlciBhc3NlcnRpb25zLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpnZXRfYXV0aFRva2VuCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCitAY2xhc3MgdWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW4KK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBvYnRhaW4gYW4gYXV0aG9yaXphdGlvbiB0b2tlbiwgd2hpY2ggaXMgcmVwcmVzZW50ZWQgYnkKK3RoZSB1ZGRpMl9fYXV0aFRva2VuIGNsYXNzLgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzM5CisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbjo6dWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW4oc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdldF9VU0NPUkVhdXRoVG9rZW4gY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbjo6dWRkaTJfX2dldF9VU0NPUkVhdXRoVG9rZW4oc3RydWN0IHNvYXAgKnNvYXAsIGNvbnN0IGNoYXIgKnVzZXJpZCwgY29uc3QgY2hhciAqcGFzc3dkKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSB1c2VyaWQgdGhlIHVzZXIgSUQgc3RyaW5nCitAcGFyYW1baW5dIHBhc3N3ZCB0aGUgcGFzc3dvcmQgc3RyaW5nCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdldF9VU0NPUkVhdXRoVG9rZW4gY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZCB1c2VyCitJRCBhbmQgcGFzc3dvcmQuCisqLworCisvKioKK0BmbiB1ZGRpMl9fYXV0aFRva2VuICp1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbjo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCkKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19hdXRoVG9rZW4gb2JqZWN0IG9yIE5VTEwgb24gZXJyb3IKKworU2VuZCBhIHJlcXVlc3QgdG8gYSBVRERJIHNlcnZpY2UgdG8gZ2V0IGEgYXV0aG9yaXphdGlvbiB0b2tlbiBnaXZlbiBhIHVzZXIKK0lEIGFuZCBwYXNzd29yZC4KKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6Z2V0X3B1Ymxpc2hlckFzc2VydGlvbnMKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBvYnRhaW4gdGhlIGZ1bGwgc2V0IG9mIHB1Ymxpc2hlciBhc3NlcnRpb25zIHRoYXQgYXJlCithc3NvY2lhdGVkIHdpdGggYW4gaW5kaXZpZHVhbCBwdWJsaXNoZXIuCisKK1NlZSBAdXJsIGh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3NDAKKyovCisKKy8qKgorQGZuIHVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczo6dWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZXRfVVNDT1JFcHVibGlzaGVyQXNzZXRpb25zIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMgKnVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pCitAYnJpZWYKK0BwYXJhbVtpbl0gZW5kcG9pbnQgVVJMIG9mIHRoZSBVRERJIHNlcnZlcgorQHBhcmFtW2luXSBhdXRoSW5mbyBhdXRob3JpemF0aW9uIHRva2VuIHByb3ZpZGVkIGJ5IHRoZSBVRERJIHNlcnZlcgorQHJldHVybiBBIHBvaW50ZXIgdG8gYSB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9ucyBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcgorCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmljZSB0byBnZXQgcHVibGlzaGVyIGFzc2VydGlvbnMuCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOmdldF9yZWdpc3RlcmVkSW5mbworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorQGNsYXNzIHVkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8KK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBnZXQgYWxsIHJlZ2lzdGVyZWQgYnVzaW5lc3MgZW50aXRpZXMgYW5kIHRNb2RlbHMKK2NvbnRyb2xsZWQgYnkgYW4gaW5kaXZpZHVhbC4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzc0MQorKi8KKworLyoqCitAZm4gdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbzo6dWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyhzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX3JlZ2lzdGVyZWRJbmZvICp1ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbykKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcGFyYW1baW5dIGF1dGhJbmZvIGF1dGhvcml6YXRpb24gdG9rZW4gcHJvdmlkZWQgYnkgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19yZWdpc3RlcmVkSW5mbyBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcgorCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmljZSB0byBnZXQgYWxsIHJlZ2lzdGVyZWQgYnVzaW5lc3MgZW50aXRpZXMgYW5kCit0TW9kZWxzIGNvbnRyb2xsZWQgYnkgYW4gaW5kaXZpZHVhbC4KKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6c2F2ZV9iaW5kaW5nCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCitAY2xhc3MgdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZworQGJyaWVmCisKK1JlcHJlc2VudHMgYSByZXF1ZXN0IHRvIHBvc3QgYmluZGluZyBpbmZvcm1hdGlvbiBvbiBhIFVEREkgc2VydmVyLgorCitTZWUgQHVybCBodHRwOi8vdWRkaS5vcmcvcHVicy9Qcm9ncmFtbWVyc0FQSV92Mi5odG0jX1RvYzI1MTM3NzQyCisqLworCisvKioKK0BmbiB1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nOjp1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzYXZlX1VTQ09SRWJpbmRpbmcgY2xhc3MuCisqLworCisvKioKK0BmbiB1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nOjp1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwICpzb2FwLCB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlICZiaW5kaW5nVGVtcGxhdGUpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIGJpbmRpbmdUZW1wbGF0ZSBiaW5kaW5nIHRlbXBsYXRlCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNhdmVfVVNDT1JFYmluZGluZyBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkIGJpbmRpbmcKK3RlbXBsYXRlLgorKi8KKworLyoqCitAZm4gdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZzo6dWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCAqc29hcCwgc3RkOjp2ZWN0b3I8dWRkaTJfX2JpbmRpbmdUZW1wbGF0ZSo+IGJpbmRpbmdUZW1wbGF0ZXMpCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CitAcGFyYW1baW5dIGJpbmRpbmdUZW1wbGF0ZXMgY29sbGVjdGlvbiBvZiBiaW5kaW5nIHRlbXBsYXRlcworCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzYXZlX1VTQ09SRWJpbmRpbmcgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZCBiaW5kaW5nCit0ZW1wbGF0ZXMuCisqLworCisvKioKK0BmbiB1ZGRpMl9fYmluZGluZ0RldGFpbCAqdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZzo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pCitAYnJpZWYKK0BwYXJhbVtpbl0gZW5kcG9pbnQgVVJMIG9mIHRoZSBVRERJIHNlcnZlcgorQHBhcmFtW2luXSBhdXRoSW5mbyBhdXRob3JpemF0aW9uIHRva2VuIHByb3ZpZGVkIGJ5IHRoZSBVRERJIHNlcnZlcgorQHJldHVybiBBIHBvaW50ZXIgdG8gYSB1ZGRpMl9fYmluZGluZ0RldGFpbCBvYmplY3Qgb3IgTlVMTCBvbiBlcnJvcgorCitTZW5kIGEgcmVxdWVzdCB0byBhIFVEREkgc2VydmVyIHRvIHBvc3QgYmluZGluZyBpbmZvcm1hdGlvbiBvbiB0aGUgc2VydmVyLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpzYXZlX2J1c2luZXNzCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCitAY2xhc3MgdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3MKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBwb3N0IGJ1c2luZXNzIGluZm9ybWF0aW9uIG9uIGEgVURESSBzZXJ2ZXIuCisKK1NlZSBAdXJsIGh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3NDMKKyovCisKKy8qKgorQGZuIHVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzOjp1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCAqc29hcCkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc2F2ZV9VU0NPUkVidXNpbmVzcyBjbGFzcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzOjp1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCAqc29hcCwgdWRkaTJfX2J1c2luZXNzRW50aXR5ICZidXNpbmVzc0VudGl0eSkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gYnVzaW5lc3NFbnRpdHkgYnVzaW5lc3MgZW50aXR5CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNhdmVfVVNDT1JFYnVzaW5lc3MgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAorYnVzaW5lc3MgZW50aXR5LgorKi8KKworLyoqCitAZm4gdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M6OnVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NFbnRpdHkqPiBidXNpbmVzc0VudGl0aWVzKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorQHBhcmFtW2luXSBidXNpbmVzc0VudGl0aWVzIGNvbGxlY3Rpb24gb2YgYnVzaW5lc3MgZW50aXRpZXMKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc2F2ZV9VU0NPUkVidXNpbmVzcyBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkCitidXNpbmVzcyBlbnRpdGllcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19idXNpbmVzc0RldGFpbCAqdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3M6OnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKQorQGJyaWVmCitAcGFyYW1baW5dIGVuZHBvaW50IFVSTCBvZiB0aGUgVURESSBzZXJ2ZXIKK0BwYXJhbVtpbl0gYXV0aEluZm8gYXV0aG9yaXphdGlvbiB0b2tlbiBwcm92aWRlZCBieSB0aGUgVURESSBzZXJ2ZXIKK0ByZXR1cm4gQSBwb2ludGVyIHRvIGEgdWRkaTJfX2J1c2luZXNzRGV0YWlsIG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2ZXIgdG8gcG9zdCBidXNpbmVzcyBpbmZvcm1hdGlvbiBvbiB0aGUgc2VydmVyLgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwl1ZGRpMjpzYXZlX3NlcnZpY2UKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlCitAYnJpZWYKKworUmVwcmVzZW50cyBhIHJlcXVlc3QgdG8gcG9zdCBzZXJ2aWNlIGluZm9ybWF0aW9uIG9uIGEgVURESSBzZXJ2ZXIuCisKK1NlZSBAdXJsIGh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3NDQKKyovCisKKy8qKgorQGZuIHVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2U6OnVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNhdmVfVVNDT1JFc2VydmljZSBjbGFzcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2U6OnVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAgKnNvYXAsIHVkZGkyX19idXNpbmVzc1NlcnZpY2UgJmJ1c2luZXNzU2VydmljZSkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gYnVzaW5lc3NTZXJ2aWNlIGJ1c2luZXNzIHNlcnZpY2UKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc2F2ZV9VU0NPUkVzZXJ2aWNlIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK3NlcnZpY2UuCisqLworCisvKioKK0BmbiB1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlOjp1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlKj4gYnVzaW5lc3NTZXJ2aWNlcykKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gYnVzaW5lc3NTZXJ2aWNlcyBjb2xsZWN0aW9uIG9mIGJ1c2luZXNzIHNlcnZpY2VzCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNhdmVfVVNDT1JFc2VydmljZSBjbGFzcyB1c2luZyB0aGUgc3BlY2lmaWVkCitzZXJ2aWNlcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19zZXJ2aWNlRGV0YWlsICp1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbykKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcGFyYW1baW5dIGF1dGhJbmZvIGF1dGhvcml6YXRpb24gdG9rZW4gcHJvdmlkZWQgYnkgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19zZXJ2aWNlRGV0YWlsIG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2ZXIgdG8gcG9zdCBzZXJ2aWNlIGluZm9ybWF0aW9uIG9uIHRoZSBzZXJ2ZXIuCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXVkZGkyOnNhdmVfdE1vZGVsCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCitAY2xhc3MgdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsCitAYnJpZWYKKworUmVwcmVzZW50cyBhIHJlcXVlc3QgdG8gcG9zdCB0TW9kZWwgaW5mb3JtYXRpb24gb24gYSBVRERJIHNlcnZlci4KKworU2VlIEB1cmwgaHR0cDovL3VkZGkub3JnL3B1YnMvUHJvZ3JhbW1lcnNBUElfdjIuaHRtI19Ub2MyNTEzNzc0NQorKi8KKworLyoqCitAZm4gdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsOjp1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAgKnNvYXApCitAYnJpZWYKK0BwYXJhbVtpbl0gc29hcCBnU09BUCBjb250ZXh0CisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNhdmVfVVNDT1JFdE1vZGVsIGNsYXNzLgorKi8KKworLyoqCitAZm4gdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsOjp1ZGRpMl9fc2F2ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAgKnNvYXAsIHVkZGkyX190TW9kZWwgJnRNb2RlbCkKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gdE1vZGVsIGEgdE1vZGVsCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNhdmVfVVNDT1JFdE1vZGVsIGNsYXNzIHVzaW5nIHRoZSBzcGVjaWZpZWQKK3RNb2RlbC4KKyovCisKKy8qKgorQGZuIHVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbDo6dWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fdE1vZGVsKj4gdE1vZGVscykKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gdE1vZGVscyBjb2xsZWN0aW9uIG9mIHRNb2RlbHMKKworQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc2F2ZV9VU0NPUkV0TW9kZWwgY2xhc3MgdXNpbmcgdGhlIHNwZWNpZmllZAordE1vZGVscy4KKyovCisKKy8qKgorQGZuIHVkZGkyX190TW9kZWxEZXRhaWwgKnVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbDo6c2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pCitAYnJpZWYKK0BwYXJhbVtpbl0gZW5kcG9pbnQgVVJMIG9mIHRoZSBVRERJIHNlcnZlcgorQHBhcmFtW2luXSBhdXRoSW5mbyBhdXRob3JpemF0aW9uIHRva2VuIHByb3ZpZGVkIGJ5IHRoZSBVRERJIHNlcnZlcgorQHJldHVybiBBIHBvaW50ZXIgdG8gYSB1ZGRpMl9fdE1vZGVsRGV0YWlsIG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2ZXIgdG8gcG9zdCB0TW9kZWwgaW5mb3JtYXRpb24gb24gdGhlIHNlcnZlci4KKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdWRkaTI6c2V0X3B1Ymxpc2hlckFzc2VydGlvbnMKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKK0BjbGFzcyB1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMKK0BicmllZgorCitSZXByZXNlbnRzIGEgcmVxdWVzdCB0byBtb2RpZnkgdGhlIGV4aXN0aW5nIHB1Ymxpc2hlciBhc3NlcnRpb25zIGZvciBhbgoraW5kaXZpZHVhbCBwdWJsaXNoZXIuCisKK1NlZSBAdXJsIGh0dHA6Ly91ZGRpLm9yZy9wdWJzL1Byb2dyYW1tZXJzQVBJX3YyLmh0bSNfVG9jMjUxMzc3NDYKKyovCisKKy8qKgorQGZuIHVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczo6dWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwICpzb2FwKQorQGJyaWVmCitAcGFyYW1baW5dIHNvYXAgZ1NPQVAgY29udGV4dAorCitDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyBjbGFzcy4KKyovCisKKy8qKgorQGZuIHVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczo6dWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwICpzb2FwLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKj4gcHVibGlzaGVyQXNzZXJ0aW9ucykKK0BicmllZgorQHBhcmFtW2luXSBzb2FwIGdTT0FQIGNvbnRleHQKK0BwYXJhbVtpbl0gcHVibGlzaGVyQXNzZXJ0aW9ucyBjb2xsZWN0aW9uIG9mIHB1Ymxpc2hlciBhc3NlcnRpb25zCisKK0NyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zIGNsYXNzIHVzaW5nIHRoZQorc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2YgcHVibGlzaGVyIGFzc2VydGlvbnMuCisqLworCisvKioKK0BmbiB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9ucyAqdWRkaTJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOjpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbykKK0BicmllZgorQHBhcmFtW2luXSBlbmRwb2ludCBVUkwgb2YgdGhlIFVEREkgc2VydmVyCitAcGFyYW1baW5dIGF1dGhJbmZvIGF1dGhvcml6YXRpb24gdG9rZW4gcHJvdmlkZWQgYnkgdGhlIFVEREkgc2VydmVyCitAcmV0dXJuIEEgcG9pbnRlciB0byBhIHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zIG9iamVjdCBvciBOVUxMIG9uIGVycm9yCisKK1NlbmQgYSByZXF1ZXN0IHRvIGEgVURESSBzZXJ2ZXIgdG8gcG9zdCB0TW9kZWwgaW5mb3JtYXRpb24gb24gdGhlIHNlcnZlci4KKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JQ29kZSBFeGFtcGxlcworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorQHBhZ2UgZXhhbXBsZTEgQ29kZSBFeGFtcGxlIDE6IEZpbmRpbmcgYSBzZXJ2aWNlCisKK1RoaXMgZXhhbXBsZSBzaG93cyB5b3UgaG93IHRvIGZpbmQgV2ViIHNlcnZpY2VzLiBJbiB0aGlzIGNhc2UsIHRoZSBleGFtcGxlCitmaW5kcyBXZWIgc2VydmljZXMgd2l0aCBuYW1lcyB0aGF0IGJlZ2luIHdpdGggdGhlIHdvcmQgIm1hZ2ljIi4KKworQGNvZGUKKyNpbmNsdWRlICJpbnFILmgiCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sgCisgIGNoYXIgKnNlYXJjaF9zdHJpbmcgPSAibWFnaWMiOworCisgIGlmIChhcmdjID4gMSkKKyAgICBzZWFyY2hfc3RyaW5nID0gYXJndlsxXTsKKworICAvLyBDcmVhdGUgYSBnU09BUCBjb250ZXh0CisgIHN0cnVjdCBzb2FwICpzb2FwID0gc29hcF9uZXcoKTsKKworICAvLyBDcmVhdGUgYW4gb2JqZWN0IHRvIGZpbmQgYSBidXNpbmVzcworICB1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlIGZzKHNvYXAsIHNlYXJjaF9zdHJpbmcpOworCisgIC8vIFNlbmQgdGhlIHJlcXVlc3QKKyAgdWRkaTJfX3NlcnZpY2VMaXN0ICpzbCA9IGZzLnNlbmQoImh0dHA6Ly91ZGRpLnhtZXRob2RzLm5ldC9pbnF1aXJlIik7CisKKyAgLy8gQ2hlY2sgaWYgcmVzdWx0IGlzIE9LCisgIGlmICghc2wpCisgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOworCisgIC8vIElmIE9LLCByZXBvcnQgdGhlIHNlcnZpY2UgbmFtZShzKSBhbmQgdW5pcXVlIGlkZW50aWZpY2F0aW9uIGtleXMKKyAgZWxzZSBpZiAoc2wtPnNlcnZpY2VJbmZvcykKKyAgeworICAgIHN0ZDo6Y291dCA8PCAiU2VhcmNoIHJlc3VsdHMgb24gIiA8PCBzZWFyY2hfc3RyaW5nIDw8ICI6IiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCisgICAgZm9yIChzdGQ6OnZlY3Rvcjx1ZGRpMl9fc2VydmljZUluZm8qPjo6Y29uc3RfaXRlcmF0b3Igc2kgPSBzbC0+c2VydmljZUluZm9zLT5zZXJ2aWNlSW5mby5iZWdpbigpOyBzaSAhPSBzbC0+c2VydmljZUluZm9zLT5zZXJ2aWNlSW5mby5lbmQoKTsgKytzaSkKKyAgICB7CisgICAgICAvLyBSZXBvcnQgc2VydmljZUtleSBhbmQgYnVzaW5lc3NLZXkKKyAgICAgIHN0ZDo6Y291dCA8PCAic2VydmljZUtleT0iIDw8ICgqc2kpLT5zZXJ2aWNlS2V5IDw8IHN0ZDo6ZW5kbCA8PCAiYnVzaW5lc3NLZXk9IiA8PCAoKnNpKS0+YnVzaW5lc3NLZXkgPDwgc3RkOjplbmRsOworCisgICAgICAvLyBSZXBvcnQgbmFtZXMKKyAgICAgIGZvciAoc3RkOjp2ZWN0b3I8dWRkaTJfX25hbWUqPjo6Y29uc3RfaXRlcmF0b3IgbiA9ICgqc2kpLT5uYW1lLmJlZ2luKCk7IG4gIT0gKCpzaSktPm5hbWUuZW5kKCk7ICsrbikKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJuYW1lPSIgPDwgKCpuKS0+X19pdGVtIDw8IHN0ZDo6ZW5kbDsKKworICAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBSZW1vdmUgZGVzZXJpYWxpemVkIG9iamVjdHMKKyAgc29hcF9kZXN0cm95KHNvYXApOworCisgIC8vIFJlbW92ZSB0ZW1wb3JhcnkgZGF0YQorICBzb2FwX2VuZChzb2FwKTsKKworICAvLyBEZXRhY2ggYW5kIGZyZWUgY29udGV4dAorICBzb2FwX2RvbmUoc29hcCk7CisgIGZyZWUoc29hcCk7CisKKyAgcmV0dXJuIDA7Cit9CitAZW5kY29kZQorCitUbyBjb21waWxlOgorLSB3c2RsMmggLXR1ZGRpMi10eXBlbWFwLmRhdCBpbnF1aXJlX3YyLndzZGwKKy0gc29hcGNwcDIgLUkuLiAtcGlucSBpbnF1aXJlX3YyLmgKKy0gZysrIC1EV0lUSF9OT05BTUVTUEFDRVMgLUkuLiAtbyBleGFtcGxlMSBleGFtcGxlMS5jcHAgaW5xdWlyZV92Mi5jcHAgaW5xQy5jcHAgaW5xQ2xpZW50LmNwcCAuLi9zdGRzb2FwMi5jcHAKKyovCisKKy8qKgorQHBhZ2UgZXhhbXBsZTIgQ29kZSBFeGFtcGxlIDI6IEZpbmRpbmcgYSBidXNpbmVzcworCitUaGlzIGV4YW1wbGUgc2hvd3MgeW91IGhvdyB0byBmaW5kIGEgYnVzaW5lc3MgZnJvbSBhIFVEREkgc2VydmVyLgorCitAY29kZQorI2luY2x1ZGUgImlucUguaCIKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreyAKKyAgY2hhciAqc2VhcmNoX3N0cmluZyA9ICJ4bWV0aG9kcyI7CisKKyAgaWYgKGFyZ2MgPiAxKQorICAgIHNlYXJjaF9zdHJpbmcgPSBhcmd2WzFdOworCisgIC8vIENyZWF0ZSBhIGdTT0FQIGNvbnRleHQKKyAgc3RydWN0IHNvYXAgKnNvYXAgPSBzb2FwX25ldygpOworCisgIC8vIENyZWF0ZSBhbiBvYmplY3QgdG8gZmluZCBhIGJ1c2luZXNzCisgIHVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzIGZiKHNvYXAsIHNlYXJjaF9zdHJpbmcpOworCisgIC8vIFNlbmQgdGhlIHJlcXVlc3QKKyAgdWRkaTJfX2J1c2luZXNzTGlzdCAqYmwgPSBmYi5zZW5kKCJodHRwOi8vdWRkaS54bWV0aG9kcy5uZXQvaW5xdWlyZSIpOworCisgIC8vIENoZWNrIGlmIHJlc3VsdCBpcyBPSworICBpZiAoIWJsKQorICAgIHNvYXBfcHJpbnRfZmF1bHQoc29hcCwgc3RkZXJyKTsKKworICAvLyBJZiBPSywgcmVwb3J0IHRoZSBidXNpbmVzcyBuYW1lKHMpIGFuZCB1bmlxdWUgaWRlbnRpZmljYXRpb24ga2V5cworICBlbHNlIGlmIChibC0+YnVzaW5lc3NJbmZvcykKKyAgeworICAgIHN0ZDo6Y291dCA8PCAiU2VhcmNoIHJlc3VsdHMgb24gIiA8PCBzZWFyY2hfc3RyaW5nIDw8ICI6IiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCisgICAgZm9yIChzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NJbmZvKj46OmNvbnN0X2l0ZXJhdG9yIGJpID0gYmwtPmJ1c2luZXNzSW5mb3MtPmJ1c2luZXNzSW5mby5iZWdpbigpOyBiaSAhPSBibC0+YnVzaW5lc3NJbmZvcy0+YnVzaW5lc3NJbmZvLmVuZCgpOyArK2JpKQorICAgIHsKKyAgICAgIC8vIFJlcG9ydCBidXNpbmVzc0tleQorICAgICAgc3RkOjpjb3V0IDw8ICJidXNpbmVzc0tleT0iIDw8ICgqYmkpLT5idXNpbmVzc0tleSA8PCBzdGQ6OmVuZGw7CisKKyAgICAgIC8vIFJlcG9ydCBuYW1lcworICAgICAgZm9yIChzdGQ6OnZlY3Rvcjx1ZGRpMl9fbmFtZSo+Ojpjb25zdF9pdGVyYXRvciBuID0gKCpiaSktPm5hbWUuYmVnaW4oKTsgbiAhPSAoKmJpKS0+bmFtZS5lbmQoKTsgKytuKQorICAgICAgICBzdGQ6OmNvdXQgPDwgIm5hbWU9IiA8PCAoKm4pLT5fX2l0ZW0gPDwgc3RkOjplbmRsOworCisgICAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOworICAgIH0KKyAgfQorCisgIC8vIFJlbW92ZSBkZXNlcmlhbGl6ZWQgb2JqZWN0cworICBzb2FwX2Rlc3Ryb3koc29hcCk7CisKKyAgLy8gUmVtb3ZlIHRlbXBvcmFyeSBkYXRhCisgIHNvYXBfZW5kKHNvYXApOworCisgIC8vIERldGFjaCBhbmQgZnJlZSBjb250ZXh0CisgIHNvYXBfZG9uZShzb2FwKTsKKyAgZnJlZShzb2FwKTsKKworICByZXR1cm4gMDsKK30KK0BlbmRjb2RlCisKK1RvIGNvbXBpbGU6CistIHdzZGwyaCAtdHVkZGkyLXR5cGVtYXAuZGF0IGlucXVpcmVfdjIud3NkbAorLSBzb2FwY3BwMiAtSS4uIC1waW5xIGlucXVpcmVfdjIuaAorLSBnKysgLURXSVRIX05PTkFNRVNQQUNFUyAtSS4uIC1vIGV4YW1wbGUyIGV4YW1wbGUyLmNwcCBpbnF1aXJlX3YyLmNwcCBpbnFDLmNwcCBpbnFDbGllbnQuY3BwIC4uL3N0ZHNvYXAyLmNwcAorKi8KKy8qKgorQHBhZ2UgZXhhbXBsZTMgQ29kZSBFeGFtcGxlIDM6IFB1Ymxpc2hpbmcgYSBXU0RMIGFuZCBzZXJ2aWNlIG9uIFhNZXRob2RzCisKK1RoaXMgZXhhbXBsZSBzaG93cyB5b3UgaG93IHRvIHB1Ymxpc2ggYSBXZWIgc2VydmljZS4gSW4gdGhpcyBjYXNlLCB0aGUgZXhhbXBsZQordGVtcGxhdGUgY29kZSBvYnRhaW5zIGFuIGF1dGhvcml6YXRpb24gdG9rZW4sIHNhdmVzIHRoZSB0TW9kZWwgd2l0aCB0aGUgV1NETAorVVJMIGluIHRoZSBzZXJ2ZXIsIGFuZCBzYXZlcyB0aGUgYnVzaW5lc3Mgc2VydmljZSBpbmZvcm1hdGlvbiBpbiB0aGUgc2VydmVyLgorCitAY29kZQorI2luY2x1ZGUgInB1YkguaCIKKworY29uc3QgY2hhciAqc2VydmVyID0gImh0dHBzOi8vdWRkaS54bWV0aG9kcy5uZXQvcHVibGlzaCI7CisKK2NvbnN0IGNoYXIgKnVzZXJpZCA9ICIuLi4iOyAvLyB1c2VyIElEIHRvIGFjY2VzcyBVRERJIHNlcnZlcgorY29uc3QgY2hhciAqcGFzc3dkID0gIi4uLiI7IC8vIHBhc3N3b3JkIHRvIGFjY2VzcyBVRERJIHNlcnZlcgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7IAorICAvLyBDcmVhdGUgYSBnU09BUCBjb250ZXh0CisgIHN0cnVjdCBzb2FwICpzb2FwID0gc29hcF9uZXcoKTsKKworICAvLyBTZXR1cCBTU0wgY29udGV4dCAob3B0aW9uYWwpIHRvIHZlcmlmeSBzZXJ2ZXIncyBjcmVkZW50aWFscworICBpZiAoc29hcF9zc2xfY2xpZW50X2NvbnRleHQoc29hcCwgU09BUF9TU0xfREVGQVVMVCwgTlVMTCwgTlVMTCwgImNhY2VydHMucGVtIiwgTlVMTCwgTlVMTCkpCisgIHsgCisgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOworICAgIGV4aXQoMSk7CisgIH0KKworICAvLyBTdGVwIDE6IEdldCBhbiBhdXRob3JpemF0aW9uIHRva2VuIGZyb20gdGhlIFVEREkgc2VydmVyCisgIHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuIGdldF9hdXRoVG9rZW4oc29hcCwgdXNlcmlkLCBwYXNzd2QpOworICB1ZGRpMl9fYXV0aFRva2VuICphdXRoVG9rZW4gPSBnZXRfYXV0aFRva2VuLnNlbmQoc2VydmVyKTsKKworICAvLyBDaGVjayBpZiBhdXRob3JpemVkCisgIGlmICghYXV0aFRva2VuKQorICB7CisgICAgc29hcF9wcmludF9mYXVsdChzb2FwLCBzdGRlcnIpOworICAgIGV4aXQoMSk7CisgIH0KKworICAvLyBBdXRob3JpemF0aW9uIGluZm8gcHJvdmlkZWQgYnkgc2VydmVyIGZvciB0aGlzIHNlc3Npb24KKyAgY2hhciAqYXV0aEluZm8gPSBhdXRoVG9rZW4tPmF1dGhJbmZvOworCisgIC8vIFN0ZXAgMjogQ3JlYXRlIGEgdE1vZGVsIGZvciB0aGUgV1NETCB0byBiZSBwdWJsaXNoZWQKKyAgdWRkaTJfX3RNb2RlbCB0TW9kZWw7CisgIHRNb2RlbC5zb2FwX2RlZmF1bHQoc29hcCk7CisKKyAgLy8gQ3JlYXRlIHRoZSB0TW9kZWwgYW5kIHNlcnZpY2UgbmFtZQorICB0TW9kZWwubmFtZSA9IHNvYXBfbmV3X3VkZGkyX19uYW1lKHNvYXAsIC0xKTsKKyAgdE1vZGVsLm5hbWUtPl9faXRlbSA9ICIuLi4iOworICB0TW9kZWwubmFtZS0+eG1sX19sYW5nXyA9ICJlbiI7CisKKyAgLy8gQ3JlYXRlIFhNZXRob2RzIGRlc2NyaXB0aW9uIGVsZW1lbnRzIChzZWUgaHR0cDovL3d3dy54bWV0aG9kcy5uZXQvdmUyL1VEREkucG8pCisgIHVkZGkyX19kZXNjcmlwdGlvbiAqZGVzY3JpcHRpb24gPSBzb2FwX25ld191ZGRpMl9fZGVzY3JpcHRpb24oc29hcCwgNik7CisgIGRlc2NyaXB0aW9uWzBdLl9faXRlbSA9ICJTSE9SVCBERVNDUklQVElPTjogLi4uIjsKKyAgZGVzY3JpcHRpb25bMF0ueG1sX19sYW5nXyA9ICJlbiI7CisgIGRlc2NyaXB0aW9uWzFdLl9faXRlbSA9ICJTSE9SVCBERVNDUklQVElPTjogLi4uIjsKKyAgZGVzY3JpcHRpb25bMV0ueG1sX19sYW5nXyA9ICJlbiI7CisgIGRlc2NyaXB0aW9uWzJdLl9faXRlbSA9ICJVU0FHRSBOT1RFUzogLi4uIjsKKyAgZGVzY3JpcHRpb25bMl0ueG1sX19sYW5nXyA9ICJlbiI7CisgIGRlc2NyaXB0aW9uWzNdLl9faXRlbSA9ICJIT01FUEFHRSBVUkw6IC4uLiI7CisgIGRlc2NyaXB0aW9uWzNdLnhtbF9fbGFuZ18gPSAiZW4iOworICBkZXNjcmlwdGlvbls0XS5fX2l0ZW0gPSAiQ09OVEFDVCBFTUFJTDogLi4uIjsKKyAgZGVzY3JpcHRpb25bNF0ueG1sX19sYW5nXyA9ICJlbiI7CisgIGRlc2NyaXB0aW9uWzVdLl9faXRlbSA9ICJJTVBMRU1FTlRBVElPTjogLi4uIjsKKyAgZGVzY3JpcHRpb25bNV0ueG1sX19sYW5nXyA9ICJlbiI7CisKKyAgLy8gQWRkIHRoZSBmb3VyIGRlc2NyaXB0aW9uIGVsZW1lbnRzIHRvIHRoZSB0TW9kZWwKKyAgdE1vZGVsLmRlc2NyaXB0aW9uLnB1c2hfYmFjayhkZXNjcmlwdGlvbiArIDApOworICB0TW9kZWwuZGVzY3JpcHRpb24ucHVzaF9iYWNrKGRlc2NyaXB0aW9uICsgMSk7CisgIHRNb2RlbC5kZXNjcmlwdGlvbi5wdXNoX2JhY2soZGVzY3JpcHRpb24gKyAyKTsKKyAgdE1vZGVsLmRlc2NyaXB0aW9uLnB1c2hfYmFjayhkZXNjcmlwdGlvbiArIDQpOworCisgIC8vIEFkZCBhbiBvdmVydmlld0RvYyBlbGVtZW50IHdpdGggZGVzY3JpcHRpb24gYW5kIG92ZXJ2aWV3VVJMCisgIHRNb2RlbC5vdmVydmlld0RvYyA9IHNvYXBfbmV3X3VkZGkyX19vdmVydmlld0RvYyhzb2FwLCAtMSk7CisgIHRNb2RlbC5vdmVydmlld0RvYy0+c29hcF9kZWZhdWx0KHNvYXApOworICB0TW9kZWwub3ZlcnZpZXdEb2MtPmRlc2NyaXB0aW9uLnB1c2hfYmFjayhzb2FwX25ld191ZGRpMl9fZGVzY3JpcHRpb24oc29hcCwgLTEpKTsKKyAgdE1vZGVsLm92ZXJ2aWV3RG9jLT5kZXNjcmlwdGlvblswXS0+X19pdGVtID0gIldTREwgc291cmNlIGRvY3VtZW50IjsKKyAgdE1vZGVsLm92ZXJ2aWV3RG9jLT5kZXNjcmlwdGlvblswXS0+eG1sX19sYW5nXyA9ICJlbiI7CisgIHRNb2RlbC5vdmVydmlld0RvYy0+b3ZlcnZpZXdVUkwgPSAiaHR0cDovLy4uLi9teS53c2RsI2JpbmRpbmdOYW1lIjsKKworICAvLyBPbWl0IGlkZW50aWZpZXIgYmFnCisgIHRNb2RlbC5pZGVudGlmaWVyQmFnID0gTlVMTDsKKworICAvLyBBZGQgYSBjYXRlZ29yeSB3aXRoIGEgV1NETC1zcGVjaWZpYyBrZXllZFJlZmVyZW5jZQorICB0TW9kZWwuY2F0ZWdvcnlCYWcgPSBzb2FwX25ld191ZGRpMl9fY2F0ZWdvcnlCYWcoc29hcCwgLTEpOworICB0TW9kZWwuY2F0ZWdvcnlCYWctPnNvYXBfZGVmYXVsdChzb2FwKTsKKyAgdE1vZGVsLmNhdGVnb3J5QmFnLT5rZXllZFJlZmVyZW5jZS5wdXNoX2JhY2soc29hcF9uZXdfdWRkaTJfX2tleWVkUmVmZXJlbmNlKHNvYXAsIC0xKSk7CisgIHRNb2RlbC5jYXRlZ29yeUJhZy0+a2V5ZWRSZWZlcmVuY2VbMF0tPnRNb2RlbEtleSA9ICIuLi4iOworICB0TW9kZWwuY2F0ZWdvcnlCYWctPmtleWVkUmVmZXJlbmNlWzBdLT5rZXlOYW1lID0gInVkZGktb3JnOnR5cGVzIjsKKyAgdE1vZGVsLmNhdGVnb3J5QmFnLT5rZXllZFJlZmVyZW5jZVswXS0+a2V5VmFsdWUgPSAid3NkbFNwZWMiOworCisgIHRNb2RlbC5hdXRob3JpemVkTmFtZSA9ICIuLi4iOworICB0TW9kZWwub3BlcmF0b3JfID0gIi4uLiI7CisgIHRNb2RlbC50TW9kZWxLZXkgPSAiLi4uIjsKKworICAvLyBTYXZlIHRoZSB0TW9kZWwKKyAgdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsIHNhdmVfdE1vZGVsKHNvYXAsIHRNb2RlbCk7CisgIHVkZGkyX190TW9kZWxEZXRhaWwgKnRNb2RlbERldGFpbCA9IHNhdmVfdE1vZGVsLnNlbmQoc2VydmVyLCBhdXRoSW5mbyk7CisKKyAgLy8gU3RlcCAzOiBDcmVhdGUgYSBuZXcgc2VydmljZSB0byBiZSBwdWJsaXNoZWQKKyAgdWRkaTJfX2J1c2luZXNzU2VydmljZSBzZXJ2aWNlOworICBzZXJ2aWNlLnNvYXBfZGVmYXVsdChzb2FwKTsKKworICAvLyBTZXJ2aWNlIG5hbWUgaXMgdGhlIHRNb2RlbCBuYW1lIChYTWV0aG9kcykKKyAgc2VydmljZS5uYW1lLnB1c2hfYmFjayh0TW9kZWwubmFtZSk7CisKKyAgLy8gQWRkIHR3byBkZXNjcmlwdGlvbiBlbGVtZW50cyB0byB0aGUgc2VydmljZQorICBzZXJ2aWNlLmRlc2NyaXB0aW9uLnB1c2hfYmFjayhkZXNjcmlwdGlvbiArIDQpOworICBzZXJ2aWNlLmRlc2NyaXB0aW9uLnB1c2hfYmFjayhkZXNjcmlwdGlvbiArIDUpOworCisgIC8vIENyZWF0ZSBiaW5kaW5nIHRlbXBsYXRlCisgIHVkZGkyX19iaW5kaW5nVGVtcGxhdGUgYmluZGluZ1RlbXBsYXRlOworICBiaW5kaW5nVGVtcGxhdGUuc29hcF9kZWZhdWx0KHNvYXApOworICBiaW5kaW5nVGVtcGxhdGUudE1vZGVsSW5zdGFuY2VEZXRhaWxzID0gc29hcF9uZXdfdWRkaTJfX3RNb2RlbEluc3RhbmNlRGV0YWlscyhzb2FwLCAtMSk7CisgIGJpbmRpbmdUZW1wbGF0ZS50TW9kZWxJbnN0YW5jZURldGFpbHMtPnRNb2RlbEluc3RhbmNlSW5mby5wdXNoX2JhY2soc29hcF9uZXdfdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbyhzb2FwLCAtMSkpOworICBiaW5kaW5nVGVtcGxhdGUudE1vZGVsSW5zdGFuY2VEZXRhaWxzLT50TW9kZWxJbnN0YW5jZUluZm9bMF0tPmluc3RhbmNlRGV0YWlscyA9IE5VTEw7CisgIGJpbmRpbmdUZW1wbGF0ZS50TW9kZWxJbnN0YW5jZURldGFpbHMtPnRNb2RlbEluc3RhbmNlSW5mb1swXS0+dE1vZGVsS2V5ID0gdE1vZGVsLnRNb2RlbEtleTsKKyAgYmluZGluZ1RlbXBsYXRlLmFjY2Vzc1BvaW50ID0gc29hcF9uZXdfdWRkaTJfX2FjY2Vzc1BvaW50KHNvYXAsIC0xKTsKKyAgYmluZGluZ1RlbXBsYXRlLmFjY2Vzc1BvaW50LT5fX2l0ZW0gPSAiLi4uIjsKKyAgYmluZGluZ1RlbXBsYXRlLmFjY2Vzc1BvaW50LT5VUkxUeXBlID0gdWRkaTJfX1VSTFR5cGVfX2h0dHA7CisgIGJpbmRpbmdUZW1wbGF0ZS5ob3N0aW5nUmVkaXJlY3RvciA9IE5VTEw7CisgIGJpbmRpbmdUZW1wbGF0ZS5zZXJ2aWNlS2V5ID0gIi4uLiI7CisgIGJpbmRpbmdUZW1wbGF0ZS5iaW5kaW5nS2V5ID0gIi4uLiI7CisKKyAgLy8gQWRkIGJpbmRpbmcgVGVtcGxhdGUgdG8gc2VydmljZQorICBzZXJ2aWNlLmJpbmRpbmdUZW1wbGF0ZXMgPSBzb2FwX25ld191ZGRpMl9fYmluZGluZ1RlbXBsYXRlcyhzb2FwLCAtMSk7CisgIHNlcnZpY2UuYmluZGluZ1RlbXBsYXRlcy0+c29hcF9kZWZhdWx0KHNvYXApOworICBzZXJ2aWNlLmJpbmRpbmdUZW1wbGF0ZXMtPmJpbmRpbmdUZW1wbGF0ZS5wdXNoX2JhY2soJmJpbmRpbmdUZW1wbGF0ZSk7CisKKyAgc2VydmljZS5jYXRlZ29yeUJhZyA9IE5VTEw7CisgIHNlcnZpY2Uuc2VydmljZUtleSA9ICIuLi4iOworICBzZXJ2aWNlLmJ1c2luZXNzS2V5ID0gIi4uLiI7CisKKyAgLy8gU2F2ZSB0aGUgc2VydmljZQorICB1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlIHNhdmVfc2VydmljZShzb2FwLCBzZXJ2aWNlKTsKKyAgdWRkaTJfX3NlcnZpY2VEZXRhaWwgKnNlcnZpY2VEZXRhaWwgPSBzYXZlX3NlcnZpY2Uuc2VuZChzZXJ2ZXIsIGF1dGhJbmZvKTsKKworICAvLyBTdGVwIDQ6IERpc2NhcmQgYXV0aG9yaXphdGlvbiB0b2tlbgorICB1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4gZGlzY2FyZF9hdXRoVG9rZW4oc29hcCwgYXV0aEluZm8pOworICB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQgKmRpc3Bvc2l0aW9uUmVwb3J0ID0gZGlzY2FyZF9hdXRoVG9rZW4uc2VuZChzZXJ2ZXIpOworCisgIC8vIFJlbW92ZSBkZXNlcmlhbGl6ZWQgb2JqZWN0cworICBzb2FwX2Rlc3Ryb3koc29hcCk7CisKKyAgLy8gUmVtb3ZlIHRlbXBvcmFyeSBkYXRhCisgIHNvYXBfZW5kKHNvYXApOworCisgIC8vIERldGFjaCBhbmQgZnJlZSBjb250ZXh0CisgIHNvYXBfZG9uZShzb2FwKTsKKyAgZnJlZShzb2FwKTsKKworICByZXR1cm4gMDsKK30KK0BlbmRjb2RlCitUbyBjb21waWxlOgorLSB3c2RsMmggLXR1ZGRpMi10eXBlbWFwLmRhdCBwdWJsaXNoX3YyLndzZGwKKy0gc29hcGNwcDIgLUkuLiAtcHB1YiBwdWJsaXNoX3YyLmgKKy0gZysrIC1EV0lUSF9PUEVOU1NMIC1EV0lUSF9OT05BTUVTUEFDRVMgLUkuLiAtbyBleGFtcGxlMyBleGFtcGxlMy5jcHAgcHVibGlzaF92Mi5jcHAgcHViQy5jcHAgcHViQ2xpZW50LmNwcCAuLi9zdGRzb2FwMi5jcHAKKyovCisvKiB1ZGRpX3YyLmgKKyAgIEdlbmVyYXRlZCBieSB3c2RsMmggMS4yLjAgZnJvbSBpbnF1aXJlX3YyLndzZGwgcHVibGlzaF92Mi53c2RsIGFuZCB1ZGRpMi10eXBlbWFwLmRhdAorICAgMjAwNS0wNC0yNCAwMDoyOTo0MSBHTVQKKyAgIENvcHlyaWdodCAoQykgMjAwMS0yMDA1IFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICBUaGlzIHBhcnQgb2YgdGhlIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2VzOgorICAgR1BMIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKyovCisKKy8qIE5PVEU6CisKKyAtIENvbXBpbGUgdGhpcyBmaWxlIHdpdGggc29hcGNwcDIgdG8gY29tcGxldGUgdGhlIGNvZGUgZ2VuZXJhdGlvbiBwcm9jZXNzLgorIC0gVXNlIHdzZGwyaCBvcHRpb24gLWwgdG8gdmlldyB0aGUgc29mdHdhcmUgbGljZW5zZSB0ZXJtcy4KKyAtIFVzZSB3c2RsMmggb3B0aW9ucyAtYyBhbmQgLXMgdG8gZ2VuZXJhdGUgcHVyZSBDIGNvZGUgb3IgQysrIGNvZGUgd2l0aG91dCBTVEwuCisgLSBUbyBidWlsZCB3aXRoIFNUTCwgc3RsdmVjdG9yLmggZnJvbSB0aGUgZ1NPQVAgZGlzdHJpYnV0aW9uIG11c3QgYmUgaW4gdGhlCisgICBjdXJyZW50IGRpcmVjdG9yeS4gT3IgdXNlIHNvYXBjcHAyIG9wdGlvbiAtSTxwYXRoPiB3aXRoIHBhdGggdG8gc3RsdmVjdG9yLmguCisgLSBVc2UgdHlwZW1hcC5kYXQgdG8gY29udHJvbCBzY2hlbWEgbmFtZXNwYWNlIGJpbmRpbmdzIGFuZCB0eXBlIG1hcHBpbmdzLgorICAgSXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gY3VzdG9taXplIHRoZSBuYW1lcyBvZiB0aGUgbmFtZXNwYWNlIHByZWZpeGVzCisgICBnZW5lcmF0ZWQgYnkgd3NkbDJoLiBUbyBkbyBzbywgbW9kaWZ5IHRoZSBwcmVmaXggYmluZGluZ3MgaW4gdGhlIE5hbWVzcGFjZXMKKyAgIHNlY3Rpb24gYmVsb3cgYW5kIGFkZCB0aGUgbW9kaWZpZWQgbGluZXMgdG8gdHlwZW1hcC5kYXQgdG8gcmVydW4gd3NkbDJoLgorIC0gVXNlIERveHlnZW4gKHd3dy5kb3h5Z2VuLm9yZykgdG8gYnJvd3NlIHRoaXMgZmlsZS4KKworKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vZ3NvYXBvcHQgdworCisjaW1wb3J0ICJzdGx2ZWN0b3IuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFNjaGVtYSBOYW1lc3BhY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyogTk9URToKKworSXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gY3VzdG9taXplIHRoZSBuYW1lcyBvZiB0aGUgbmFtZXNwYWNlIHByZWZpeGVzCitnZW5lcmF0ZWQgYnkgd3NkbDJoLiBUbyBkbyBzbywgbW9kaWZ5IHRoZSBwcmVmaXggYmluZGluZ3MgYmVsb3cgYW5kIGFkZCB0aGUKK21vZGlmaWVkIGxpbmVzIHRvIHR5cGVtYXAuZGF0IHRvIHJlcnVuIHdzZGwyaDoKKworaW5xMiA9IHVybjp1ZGRpLW9yZzppbnF1aXJ5X3YyCit1ZGRpMiA9IHVybjp1ZGRpLW9yZzphcGlfdjIKK3B1YjIgPSB1cm46dWRkaS1vcmc6cHVibGljYXRpb25fdjIKKworKi8KKworLy9nc29hcCBpbnEyICBzY2hlbWEgbmFtZXNwYWNlOgl1cm46dWRkaS1vcmc6aW5xdWlyeV92MgorLy9nc29hcCB1ZGRpMiBzY2hlbWEgbmFtZXNwYWNlOgl1cm46dWRkaS1vcmc6YXBpX3YyCisvL2dzb2FwIHB1YjIgIHNjaGVtYSBuYW1lc3BhY2U6CXVybjp1ZGRpLW9yZzpwdWJsaWNhdGlvbl92MgorLy9nc29hcCBpbnEyICBzY2hlbWEgZm9ybToJdW5xdWFsaWZpZWQKKy8vZ3NvYXAgdWRkaTIgc2NoZW1hIGVsZW1lbnRGb3JtOglxdWFsaWZpZWQKKy8vZ3NvYXAgdWRkaTIgc2NoZW1hIGF0dHJpYnV0ZUZvcm06CXVucXVhbGlmaWVkCisvL2dzb2FwIHB1YjIgIHNjaGVtYSBmb3JtOgl1bnF1YWxpZmllZAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogU2NoZW1hIFR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvLy8gUHJpbWl0aXZlIGJ1aWx0LWluIHR5cGUgInhzOk5NVE9LRU4iCit0eXBlZGVmIGNoYXIqIHhzZF9fTk1UT0tFTjsKKworLy8vIEJ1aWx0LWluIGF0dHJpYnV0ZSAieG1sOmxhbmciCit0eXBlZGVmIGNoYXIqIHhtbF9fbGFuZzsKKworY2xhc3MgdWRkaTJfX2FjY2Vzc1BvaW50OworY2xhc3MgdWRkaTJfX2FkZHJlc3M7CitjbGFzcyB1ZGRpMl9fYWRkcmVzc0xpbmU7CitjbGFzcyB1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbTsKK2NsYXNzIHVkZGkyX19iaW5kaW5nVGVtcGxhdGU7CitjbGFzcyB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlczsKK2NsYXNzIHVkZGkyX19idXNpbmVzc0VudGl0eTsKK2NsYXNzIHVkZGkyX19idXNpbmVzc0VudGl0eUV4dDsKK2NsYXNzIHVkZGkyX19idXNpbmVzc0luZm87CitjbGFzcyB1ZGRpMl9fYnVzaW5lc3NJbmZvczsKK2NsYXNzIHVkZGkyX19idXNpbmVzc1NlcnZpY2U7CitjbGFzcyB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlczsKK2NsYXNzIHVkZGkyX19jYXRlZ29yeUJhZzsKK2NsYXNzIHVkZGkyX19jb250YWN0OworY2xhc3MgdWRkaTJfX2NvbnRhY3RzOworY2xhc3MgdWRkaTJfX2Rlc2NyaXB0aW9uOworY2xhc3MgdWRkaTJfX2Rpc2NvdmVyeVVSTDsKK2NsYXNzIHVkZGkyX19kaXNjb3ZlcnlVUkxzOworY2xhc3MgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0OworY2xhc3MgdWRkaTJfX2VtYWlsOworY2xhc3MgdWRkaTJfX2VyckluZm87CitjbGFzcyB1ZGRpMl9fZmluZFF1YWxpZmllcnM7CitjbGFzcyB1ZGRpMl9faG9zdGluZ1JlZGlyZWN0b3I7CitjbGFzcyB1ZGRpMl9faWRlbnRpZmllckJhZzsKK2NsYXNzIHVkZGkyX19pbnN0YW5jZURldGFpbHM7CitjbGFzcyB1ZGRpMl9fa2V5ZWRSZWZlcmVuY2U7CitjbGFzcyB1ZGRpMl9fa2V5c093bmVkOworY2xhc3MgdWRkaTJfX25hbWU7CitjbGFzcyB1ZGRpMl9fb3ZlcnZpZXdEb2M7CitjbGFzcyB1ZGRpMl9fcGhvbmU7CitjbGFzcyB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uOworY2xhc3MgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc0luZm87CitjbGFzcyB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mb3M7CitjbGFzcyB1ZGRpMl9fcmVzdWx0OworY2xhc3MgdWRkaTJfX3NlcnZpY2VJbmZvOworY2xhc3MgdWRkaTJfX3NlcnZpY2VJbmZvczsKK2NsYXNzIHVkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzOworY2xhc3MgdWRkaTJfX3RNb2RlbDsKK2NsYXNzIHVkZGkyX190TW9kZWxCYWc7CitjbGFzcyB1ZGRpMl9fdE1vZGVsSW5mbzsKK2NsYXNzIHVkZGkyX190TW9kZWxJbmZvczsKK2NsYXNzIHVkZGkyX190TW9kZWxJbnN0YW5jZURldGFpbHM7CitjbGFzcyB1ZGRpMl9fdE1vZGVsSW5zdGFuY2VJbmZvOworY2xhc3MgdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOworY2xhc3MgdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nOworY2xhc3MgdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzczsKK2NsYXNzIHVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczsKK2NsYXNzIHVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZTsKK2NsYXNzIHVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsOworY2xhc3MgdWRkaTJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuOworY2xhc3MgdWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZzsKK2NsYXNzIHVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzOworY2xhc3MgdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXM7CitjbGFzcyB1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlOworY2xhc3MgdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsOworY2xhc3MgdWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQ7CitjbGFzcyB1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbjsKK2NsYXNzIHVkZGkyX19nZXRfVVNDT1JFYmluZGluZ0RldGFpbDsKK2NsYXNzIHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWw7CitjbGFzcyB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0OworY2xhc3MgdWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zOworY2xhc3MgdWRkaTJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbzsKK2NsYXNzIHVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbDsKK2NsYXNzIHVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsOworY2xhc3MgdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZzsKK2NsYXNzIHVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzOworY2xhc3MgdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZTsKK2NsYXNzIHVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbDsKK2NsYXNzIHVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uczsKK2NsYXNzIHVkZGkyX192YWxpZGF0ZV9VU0NPUkV2YWx1ZXM7CitjbGFzcyB1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0OworY2xhc3MgdWRkaTJfX2F1dGhUb2tlbjsKK2NsYXNzIHVkZGkyX19iaW5kaW5nRGV0YWlsOworY2xhc3MgdWRkaTJfX2J1c2luZXNzRGV0YWlsOworY2xhc3MgdWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0OworY2xhc3MgdWRkaTJfX2J1c2luZXNzTGlzdDsKK2NsYXNzIHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zOworY2xhc3MgdWRkaTJfX3JlZ2lzdGVyZWRJbmZvOworY2xhc3MgdWRkaTJfX3JlbGF0ZWRCdXNpbmVzc2VzTGlzdDsKK2NsYXNzIHVkZGkyX19zZXJ2aWNlRGV0YWlsOworY2xhc3MgdWRkaTJfX3NlcnZpY2VMaXN0OworY2xhc3MgdWRkaTJfX3RNb2RlbERldGFpbDsKK2NsYXNzIHVkZGkyX190TW9kZWxMaXN0OworCisvLy8gU2NoZW1hICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpiaW5kaW5nS2V5IHNpbXBsZVR5cGUgcmVzdHJpY3Rpb24gb2YgeHM6c3RyaW5nCisKK3R5cGVkZWYgY2hhciogdWRkaTJfX2JpbmRpbmdLZXk7CisKKy8vLyBTY2hlbWEgInVybjp1ZGRpLW9yZzphcGlfdjIiOmJ1c2luZXNzS2V5IHNpbXBsZVR5cGUgcmVzdHJpY3Rpb24gb2YgeHM6c3RyaW5nCisKK3R5cGVkZWYgY2hhciogdWRkaTJfX2J1c2luZXNzS2V5OworCisvLy8gU2NoZW1hICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpzZXJ2aWNlS2V5IHNpbXBsZVR5cGUgcmVzdHJpY3Rpb24gb2YgeHM6c3RyaW5nCisKK3R5cGVkZWYgY2hhciogdWRkaTJfX3NlcnZpY2VLZXk7CisKKy8vLyBTY2hlbWEgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRNb2RlbEtleSBzaW1wbGVUeXBlIHJlc3RyaWN0aW9uIG9mIHhzOnN0cmluZworCit0eXBlZGVmIGNoYXIqIHVkZGkyX190TW9kZWxLZXk7CisKKy8vLyBTY2hlbWEgInVybjp1ZGRpLW9yZzphcGlfdjIiOmRpcmVjdGlvbiBzaW1wbGVUeXBlIHJlc3RyaWN0aW9uIG9mIHhzOk5NVE9LRU4KKworLy8vIE5vdGU6IGVudW0gdmFsdWVzIGFyZSBwcmVmaXhlZCB3aXRoICd1ZGRpMl9fZGlyZWN0aW9uJyB0byBhdm9pZCBuYW1lIGNsYXNoZXMsIHBsZWFzZSB1c2Ugd3NkbDJoIG9wdGlvbiAtZSB0byBvbWl0IHRoaXMgcHJlZml4CitlbnVtIHVkZGkyX19kaXJlY3Rpb24KK3sJdWRkaTJfX2RpcmVjdGlvbl9fZnJvbUtleSwJLy8vPCB4czpOTVRPS0VOIHZhbHVlPSJmcm9tS2V5IgorCXVkZGkyX19kaXJlY3Rpb25fX3RvS2V5LAkvLy88IHhzOk5NVE9LRU4gdmFsdWU9InRvS2V5IgorfTsKKworLy8vIFNjaGVtYSAidXJuOnVkZGktb3JnOmFwaV92MiI6dHJ1bmNhdGVkIHNpbXBsZVR5cGUgcmVzdHJpY3Rpb24gb2YgeHM6Tk1UT0tFTgorCisvLy8gTm90ZTogZW51bSB2YWx1ZXMgYXJlIHByZWZpeGVkIHdpdGggJ3VkZGkyX190cnVuY2F0ZWQnIHRvIGF2b2lkIG5hbWUgY2xhc2hlcywgcGxlYXNlIHVzZSB3c2RsMmggb3B0aW9uIC1lIHRvIG9taXQgdGhpcyBwcmVmaXgKK2VudW0gdWRkaTJfX3RydW5jYXRlZAorewl1ZGRpMl9fdHJ1bmNhdGVkX190cnVlXywJLy8vPCB4czpOTVRPS0VOIHZhbHVlPSJ0cnVlIgorCXVkZGkyX190cnVuY2F0ZWRfX2ZhbHNlXywJLy8vPCB4czpOTVRPS0VOIHZhbHVlPSJmYWxzZSIKK307CisKKy8vLyBTY2hlbWEgInVybjp1ZGRpLW9yZzphcGlfdjIiOlVSTFR5cGUgc2ltcGxlVHlwZSByZXN0cmljdGlvbiBvZiB4czpOTVRPS0VOCisKKy8vLyBOb3RlOiBlbnVtIHZhbHVlcyBhcmUgcHJlZml4ZWQgd2l0aCAndWRkaTJfX1VSTFR5cGUnIHRvIGF2b2lkIG5hbWUgY2xhc2hlcywgcGxlYXNlIHVzZSB3c2RsMmggb3B0aW9uIC1lIHRvIG9taXQgdGhpcyBwcmVmaXgKK2VudW0gdWRkaTJfX1VSTFR5cGUKK3sJdWRkaTJfX1VSTFR5cGVfX21haWx0bywJLy8vPCB4czpOTVRPS0VOIHZhbHVlPSJtYWlsdG8iCisJdWRkaTJfX1VSTFR5cGVfX2h0dHAsCS8vLzwgeHM6Tk1UT0tFTiB2YWx1ZT0iaHR0cCIKKwl1ZGRpMl9fVVJMVHlwZV9faHR0cHMsCS8vLzwgeHM6Tk1UT0tFTiB2YWx1ZT0iaHR0cHMiCisJdWRkaTJfX1VSTFR5cGVfX2Z0cCwJLy8vPCB4czpOTVRPS0VOIHZhbHVlPSJmdHAiCisJdWRkaTJfX1VSTFR5cGVfX2ZheCwJLy8vPCB4czpOTVRPS0VOIHZhbHVlPSJmYXgiCisJdWRkaTJfX1VSTFR5cGVfX3Bob25lLAkvLy88IHhzOk5NVE9LRU4gdmFsdWU9InBob25lIgorCXVkZGkyX19VUkxUeXBlX19vdGhlciwJLy8vPCB4czpOTVRPS0VOIHZhbHVlPSJvdGhlciIKK307CisKKy8vLyBTY2hlbWEgInVybjp1ZGRpLW9yZzphcGlfdjIiOmtleVR5cGUgc2ltcGxlVHlwZSByZXN0cmljdGlvbiBvZiB4czpOTVRPS0VOCisKKy8vLyBOb3RlOiBlbnVtIHZhbHVlcyBhcmUgcHJlZml4ZWQgd2l0aCAndWRkaTJfX2tleVR5cGUnIHRvIGF2b2lkIG5hbWUgY2xhc2hlcywgcGxlYXNlIHVzZSB3c2RsMmggb3B0aW9uIC1lIHRvIG9taXQgdGhpcyBwcmVmaXgKK2VudW0gdWRkaTJfX2tleVR5cGUKK3sJdWRkaTJfX2tleVR5cGVfX2J1c2luZXNzS2V5LAkvLy88IHhzOk5NVE9LRU4gdmFsdWU9ImJ1c2luZXNzS2V5IgorCXVkZGkyX19rZXlUeXBlX190TW9kZWxLZXksCS8vLzwgeHM6Tk1UT0tFTiB2YWx1ZT0idE1vZGVsS2V5IgorCXVkZGkyX19rZXlUeXBlX19zZXJ2aWNlS2V5LAkvLy88IHhzOk5NVE9LRU4gdmFsdWU9InNlcnZpY2VLZXkiCisJdWRkaTJfX2tleVR5cGVfX2JpbmRpbmdLZXksCS8vLzwgeHM6Tk1UT0tFTiB2YWx1ZT0iYmluZGluZ0tleSIKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYWRkcmVzcyIKKworY2xhc3MgdWRkaTJfX2FkZHJlc3MKK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fYWRkcmVzc0xpbmUqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19hZGRyZXNzTGluZSogICAgPiBhZGRyZXNzTGluZSAgICAgICAgICAgICAgICAgICAgMDsKKy8vLyBBdHRyaWJ1dGUgdXNlVHlwZSBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VUeXBlICAgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgc29ydENvZGUgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydENvZGUgICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIHRNb2RlbEtleSBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0TW9kZWxLZXkKKyAgIEB1ZGRpMl9fdE1vZGVsS2V5ICAgICAgICAgICAgICAgICAgICAgdE1vZGVsS2V5ICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJhc3NlcnRpb25TdGF0dXNJdGVtIgorCitjbGFzcyB1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzSXRlbQoreyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmZyb21LZXkKKyAgICB1ZGRpMl9fYnVzaW5lc3NLZXkgICAgICAgICAgICAgICAgICAgZnJvbUtleSAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0b0tleQorICAgIHVkZGkyX19idXNpbmVzc0tleSAgICAgICAgICAgICAgICAgICB0b0tleSAgICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmtleWVkUmVmZXJlbmNlCisgICAgdWRkaTJfX2tleWVkUmVmZXJlbmNlKiAgICAgICAgICAgICAgIGtleWVkUmVmZXJlbmNlICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6a2V5c093bmVkCisgICAgdWRkaTJfX2tleXNPd25lZCogICAgICAgICAgICAgICAgICAgIGtleXNPd25lZCAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBBdHRyaWJ1dGUgY29tcGxldGlvblN0YXR1cyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uU3RhdHVzICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImJpbmRpbmdUZW1wbGF0ZSIKKworY2xhc3MgdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZQoreyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX19kZXNjcmlwdGlvbiogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2Rlc2NyaXB0aW9uKiAgICA+IGRlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAwOworLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0TW9kZWxJbnN0YW5jZURldGFpbHMKKyAgICB1ZGRpMl9fdE1vZGVsSW5zdGFuY2VEZXRhaWxzKiAgICAgICAgdE1vZGVsSW5zdGFuY2VEZXRhaWxzICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8gQ0hPSUNFIE9GIEVMRU1FTlRTOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjphY2Nlc3NQb2ludAorICAgIHVkZGkyX19hY2Nlc3NQb2ludCogICAgICAgICAgICAgICAgICBhY2Nlc3NQb2ludCAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmhvc3RpbmdSZWRpcmVjdG9yCisgICAgdWRkaTJfX2hvc3RpbmdSZWRpcmVjdG9yKiAgICAgICAgICAgIGhvc3RpbmdSZWRpcmVjdG9yICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vIEVORCBDSE9JQ0UKKy8vLyBBdHRyaWJ1dGUgc2VydmljZUtleSBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpzZXJ2aWNlS2V5CisgICBAdWRkaTJfX3NlcnZpY2VLZXkgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VLZXkgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBiaW5kaW5nS2V5IG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOmJpbmRpbmdLZXkKKyAgIEB1ZGRpMl9fYmluZGluZ0tleSAgICAgICAgICAgICAgICAgICAgYmluZGluZ0tleSAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJiaW5kaW5nVGVtcGxhdGVzIgorCitjbGFzcyB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlcworeyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX19iaW5kaW5nVGVtcGxhdGUqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19iaW5kaW5nVGVtcGxhdGUqPiBiaW5kaW5nVGVtcGxhdGUgICAgICAgICAgICAgICAgMDsKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImJ1c2luZXNzRW50aXR5IgorCitjbGFzcyB1ZGRpMl9fYnVzaW5lc3NFbnRpdHkKK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpkaXNjb3ZlcnlVUkxzCisgICAgdWRkaTJfX2Rpc2NvdmVyeVVSTHMqICAgICAgICAgICAgICAgIGRpc2NvdmVyeVVSTHMgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX25hbWUqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19uYW1lKiAgICAgICAgICAgPiBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgMTsKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2Rlc2NyaXB0aW9uKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZGVzY3JpcHRpb24qICAgID4gZGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgIDA7CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmNvbnRhY3RzCisgICAgdWRkaTJfX2NvbnRhY3RzKiAgICAgICAgICAgICAgICAgICAgIGNvbnRhY3RzICAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YnVzaW5lc3NTZXJ2aWNlcworICAgIHVkZGkyX19idXNpbmVzc1NlcnZpY2VzKiAgICAgICAgICAgICBidXNpbmVzc1NlcnZpY2VzICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmlkZW50aWZpZXJCYWcKKyAgICB1ZGRpMl9faWRlbnRpZmllckJhZyogICAgICAgICAgICAgICAgaWRlbnRpZmllckJhZyAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudAorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpjYXRlZ29yeUJhZworICAgIHVkZGkyX19jYXRlZ29yeUJhZyogICAgICAgICAgICAgICAgICBjYXRlZ29yeUJhZyAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50CisvLy8gQXR0cmlidXRlIGJ1c2luZXNzS2V5IG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOmJ1c2luZXNzS2V5CisgICBAdWRkaTJfX2J1c2luZXNzS2V5ICAgICAgICAgICAgICAgICAgIGJ1c2luZXNzS2V5ICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBvcGVyYXRvciBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcl8gICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgYXV0aG9yaXplZE5hbWUgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXplZE5hbWUgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJidXNpbmVzc0VudGl0eUV4dCIKKworY2xhc3MgdWRkaTJfX2J1c2luZXNzRW50aXR5RXh0Cit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YnVzaW5lc3NFbnRpdHkKKyAgICB1ZGRpMl9fYnVzaW5lc3NFbnRpdHkqICAgICAgICAgICAgICAgYnVzaW5lc3NFbnRpdHkgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8gVE9ETzogPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorLy8gICAgICAgU2NoZW1hIGV4dGVuc2liaWxpdHkgaXMgdXNlci1kZWZpbmFibGUKKy8vICAgICAgIENvbnN1bHQgdGhlIHByb3RvY29sIGRvY3VtZW50YXRpb24gdG8gaW5zZXJ0IGRlY2xhcmF0aW9ucyBoZXJlOgorICAgIF9YTUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2FueSAgICAgICAgICAgICAgICAgICAgICAgICA7CS8vLzwgQ2F0Y2ggYW55IGVsZW1lbnQgY29udGVudCBpbiBYTUwgc3RyaW5nCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJidXNpbmVzc0luZm8iCisKK2NsYXNzIHVkZGkyX19idXNpbmVzc0luZm8KK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fbmFtZSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX25hbWUqICAgICAgICAgICA+IG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAxOworLy8vIFZlY3RvciBvZiB1ZGRpMl9fZGVzY3JpcHRpb24qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19kZXNjcmlwdGlvbiogICAgPiBkZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgMDsKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6c2VydmljZUluZm9zCisgICAgdWRkaTJfX3NlcnZpY2VJbmZvcyogICAgICAgICAgICAgICAgIHNlcnZpY2VJbmZvcyAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBBdHRyaWJ1dGUgYnVzaW5lc3NLZXkgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YnVzaW5lc3NLZXkKKyAgIEB1ZGRpMl9fYnVzaW5lc3NLZXkgICAgICAgICAgICAgICAgICAgYnVzaW5lc3NLZXkgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJidXNpbmVzc0luZm9zIgorCitjbGFzcyB1ZGRpMl9fYnVzaW5lc3NJbmZvcworeyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX19idXNpbmVzc0luZm8qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc0luZm8qICAgPiBidXNpbmVzc0luZm8gICAgICAgICAgICAgICAgICAgMDsKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImJ1c2luZXNzU2VydmljZSIKKworY2xhc3MgdWRkaTJfX2J1c2luZXNzU2VydmljZQoreyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX19uYW1lKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fbmFtZSogICAgICAgICAgID4gbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDA7CisvLy8gVmVjdG9yIG9mIHVkZGkyX19kZXNjcmlwdGlvbiogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2Rlc2NyaXB0aW9uKiAgICA+IGRlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAwOworLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpiaW5kaW5nVGVtcGxhdGVzCisgICAgdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZXMqICAgICAgICAgICAgIGJpbmRpbmdUZW1wbGF0ZXMgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6Y2F0ZWdvcnlCYWcKKyAgICB1ZGRpMl9fY2F0ZWdvcnlCYWcqICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlCYWcgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudAorLy8vIEF0dHJpYnV0ZSBzZXJ2aWNlS2V5IG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOnNlcnZpY2VLZXkKKyAgIEB1ZGRpMl9fc2VydmljZUtleSAgICAgICAgICAgICAgICAgICAgc2VydmljZUtleSAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIGJ1c2luZXNzS2V5IG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOmJ1c2luZXNzS2V5CisgICBAdWRkaTJfX2J1c2luZXNzS2V5ICAgICAgICAgICAgICAgICAgIGJ1c2luZXNzS2V5ICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYnVzaW5lc3NTZXJ2aWNlcyIKKworY2xhc3MgdWRkaTJfX2J1c2luZXNzU2VydmljZXMKK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlKj4gYnVzaW5lc3NTZXJ2aWNlICAgICAgICAgICAgICAgIDA7CisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJjYXRlZ29yeUJhZyIKKworY2xhc3MgdWRkaTJfX2NhdGVnb3J5QmFnCit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2tleWVkUmVmZXJlbmNlKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UqID4ga2V5ZWRSZWZlcmVuY2UgICAgICAgICAgICAgICAgIDE7CisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJjb250YWN0IgorCitjbGFzcyB1ZGRpMl9fY29udGFjdAoreyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX19kZXNjcmlwdGlvbiogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2Rlc2NyaXB0aW9uKiAgICA+IGRlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAwOworLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpwZXJzb25OYW1lCisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNvbk5hbWUgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX3Bob25lKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcGhvbmUqICAgICAgICAgID4gcGhvbmUgICAgICAgICAgICAgICAgICAgICAgICAgIDA7CisvLy8gVmVjdG9yIG9mIHVkZGkyX19lbWFpbCogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2VtYWlsKiAgICAgICAgICA+IGVtYWlsICAgICAgICAgICAgICAgICAgICAgICAgICAwOworLy8vIFZlY3RvciBvZiB1ZGRpMl9fYWRkcmVzcyogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2FkZHJlc3MqICAgICAgICA+IGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAwOworLy8vIEF0dHJpYnV0ZSB1c2VUeXBlIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiY29udGFjdHMiCisKK2NsYXNzIHVkZGkyX19jb250YWN0cworeyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX19jb250YWN0KiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fY29udGFjdCogICAgICAgID4gY29udGFjdCAgICAgICAgICAgICAgICAgICAgICAgIDE7CisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJkaXNjb3ZlcnlVUkxzIgorCitjbGFzcyB1ZGRpMl9fZGlzY292ZXJ5VVJMcworeyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX19kaXNjb3ZlcnlVUkwqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19kaXNjb3ZlcnlVUkwqICAgPiBkaXNjb3ZlcnlVUkwgICAgICAgICAgICAgICAgICAgMTsKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImRpc3Bvc2l0aW9uUmVwb3J0IgorCitjbGFzcyB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQKK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fcmVzdWx0KiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcmVzdWx0KiAgICAgICAgID4gcmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgIDE7CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIG9wZXJhdG9yIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yXyAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSB0cnVuY2F0ZWQgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dHJ1bmNhdGVkCisgICBAZW51bSB1ZGRpMl9fdHJ1bmNhdGVkKiAgICAgICAgICAgICAgIHRydW5jYXRlZCAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZmluZFF1YWxpZmllcnMiCisKK2NsYXNzIHVkZGkyX19maW5kUXVhbGlmaWVycworeyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIGNoYXIqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPGNoYXIqICAgICAgICAgICAgICAgICAgPiBmaW5kUXVhbGlmaWVyICAgICAgICAgICAgICAgICAgMDsKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6Imhvc3RpbmdSZWRpcmVjdG9yIgorCitjbGFzcyB1ZGRpMl9faG9zdGluZ1JlZGlyZWN0b3IKK3sgcHVibGljOgorLy8vIEF0dHJpYnV0ZSBiaW5kaW5nS2V5IG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOmJpbmRpbmdLZXkKKyAgIEB1ZGRpMl9fYmluZGluZ0tleSAgICAgICAgICAgICAgICAgICAgYmluZGluZ0tleSAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJpZGVudGlmaWVyQmFnIgorCitjbGFzcyB1ZGRpMl9faWRlbnRpZmllckJhZworeyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX19rZXllZFJlZmVyZW5jZSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2tleWVkUmVmZXJlbmNlKiA+IGtleWVkUmVmZXJlbmNlICAgICAgICAgICAgICAgICAxOworLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiaW5zdGFuY2VEZXRhaWxzIgorCitjbGFzcyB1ZGRpMl9faW5zdGFuY2VEZXRhaWxzCit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2Rlc2NyaXB0aW9uKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZGVzY3JpcHRpb24qICAgID4gZGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgIDA7CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOm92ZXJ2aWV3RG9jCisgICAgdWRkaTJfX292ZXJ2aWV3RG9jKiAgICAgICAgICAgICAgICAgIG92ZXJ2aWV3RG9jICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6aW5zdGFuY2VQYXJtcworICAgIGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVBhcm1zICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50CisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJrZXllZFJlZmVyZW5jZSIKKworY2xhc3MgdWRkaTJfX2tleWVkUmVmZXJlbmNlCit7IHB1YmxpYzoKKy8vLyBBdHRyaWJ1dGUgdE1vZGVsS2V5IG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRNb2RlbEtleQorICAgQHVkZGkyX190TW9kZWxLZXkgICAgICAgICAgICAgICAgICAgICB0TW9kZWxLZXkgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUga2V5TmFtZSBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlOYW1lICAgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUga2V5VmFsdWUgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5VmFsdWUgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJrZXlzT3duZWQiCisKK2NsYXNzIHVkZGkyX19rZXlzT3duZWQKK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpmcm9tS2V5CisgICAgdWRkaTJfX2J1c2luZXNzS2V5ICAgICAgICAgICAgICAgICAgIGZyb21LZXkgICAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dG9LZXkKKyAgICB1ZGRpMl9fYnVzaW5lc3NLZXkgICAgICAgICAgICAgICAgICAgdG9LZXkgICAgICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudAorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92Mjoib3ZlcnZpZXdEb2MiCisKK2NsYXNzIHVkZGkyX19vdmVydmlld0RvYworeyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX19kZXNjcmlwdGlvbiogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2Rlc2NyaXB0aW9uKiAgICA+IGRlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAwOworLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpvdmVydmlld1VSTAorICAgIGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVydmlld1VSTCAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50CisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJwdWJsaXNoZXJBc3NlcnRpb24iCisKK2NsYXNzIHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24KK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpmcm9tS2V5CisgICAgdWRkaTJfX2J1c2luZXNzS2V5ICAgICAgICAgICAgICAgICAgIGZyb21LZXkgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dG9LZXkKKyAgICB1ZGRpMl9fYnVzaW5lc3NLZXkgICAgICAgICAgICAgICAgICAgdG9LZXkgICAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjprZXllZFJlZmVyZW5jZQorICAgIHVkZGkyX19rZXllZFJlZmVyZW5jZSogICAgICAgICAgICAgICBrZXllZFJlZmVyZW5jZSAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJyZWxhdGVkQnVzaW5lc3NJbmZvIgorCitjbGFzcyB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbworeyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmJ1c2luZXNzS2V5CisgICAgdWRkaTJfX2J1c2luZXNzS2V5ICAgICAgICAgICAgICAgICAgIGJ1c2luZXNzS2V5ICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX25hbWUqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19uYW1lKiAgICAgICAgICAgPiBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgMTsKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2Rlc2NyaXB0aW9uKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fZGVzY3JpcHRpb24qICAgID4gZGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgIDA7CisvLy8gVmVjdG9yIG9mIHVkZGkyX19zaGFyZWRSZWxhdGlvbnNoaXBzKiB3aXRoIGxlbmd0aCAwLi4yCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMqPiBzaGFyZWRSZWxhdGlvbnNoaXBzICAgICAgICAgICAgMToyOworLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoicmVsYXRlZEJ1c2luZXNzSW5mb3MiCisKK2NsYXNzIHVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvcworeyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzSW5mbyo+IHJlbGF0ZWRCdXNpbmVzc0luZm8gICAgICAgICAgICAwOworLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoicmVzdWx0IgorCitjbGFzcyB1ZGRpMl9fcmVzdWx0Cit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6ZXJySW5mbworICAgIHVkZGkyX19lcnJJbmZvKiAgICAgICAgICAgICAgICAgICAgICBlcnJJbmZvICAgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50CisvLy8gQXR0cmlidXRlIGtleVR5cGUgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6a2V5VHlwZQorICAgQGVudW0gdWRkaTJfX2tleVR5cGUqICAgICAgICAgICAgICAgICBrZXlUeXBlICAgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgZXJybm8gb2YgdHlwZSB4czppbnQKKyAgIEBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fICAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJzZXJ2aWNlSW5mbyIKKworY2xhc3MgdWRkaTJfX3NlcnZpY2VJbmZvCit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX25hbWUqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19uYW1lKiAgICAgICAgICAgPiBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgMDsKKy8vLyBBdHRyaWJ1dGUgc2VydmljZUtleSBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpzZXJ2aWNlS2V5CisgICBAdWRkaTJfX3NlcnZpY2VLZXkgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VLZXkgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBidXNpbmVzc0tleSBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpidXNpbmVzc0tleQorICAgQHVkZGkyX19idXNpbmVzc0tleSAgICAgICAgICAgICAgICAgICBidXNpbmVzc0tleSAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InNlcnZpY2VJbmZvcyIKKworY2xhc3MgdWRkaTJfX3NlcnZpY2VJbmZvcworeyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX19zZXJ2aWNlSW5mbyogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX3NlcnZpY2VJbmZvKiAgICA+IHNlcnZpY2VJbmZvICAgICAgICAgICAgICAgICAgICAwOworLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92Mjoic2hhcmVkUmVsYXRpb25zaGlwcyIKKworY2xhc3MgdWRkaTJfX3NoYXJlZFJlbGF0aW9uc2hpcHMKK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fa2V5ZWRSZWZlcmVuY2UqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19rZXllZFJlZmVyZW5jZSogPiBrZXllZFJlZmVyZW5jZSAgICAgICAgICAgICAgICAgMTsKKy8vLyBBdHRyaWJ1dGUgZGlyZWN0aW9uIG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOmRpcmVjdGlvbgorICAgQGVudW0gdWRkaTJfX2RpcmVjdGlvbiAgICAgICAgICAgICAgICBkaXJlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InRNb2RlbCIKKworY2xhc3MgdWRkaTJfX3RNb2RlbAoreyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOm5hbWUKKyAgICB1ZGRpMl9fbmFtZSogICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIFZlY3RvciBvZiB1ZGRpMl9fZGVzY3JpcHRpb24qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19kZXNjcmlwdGlvbiogICAgPiBkZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgMDsKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6b3ZlcnZpZXdEb2MKKyAgICB1ZGRpMl9fb3ZlcnZpZXdEb2MqICAgICAgICAgICAgICAgICAgb3ZlcnZpZXdEb2MgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudAorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjppZGVudGlmaWVyQmFnCisgICAgdWRkaTJfX2lkZW50aWZpZXJCYWcqICAgICAgICAgICAgICAgIGlkZW50aWZpZXJCYWcgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6Y2F0ZWdvcnlCYWcKKyAgICB1ZGRpMl9fY2F0ZWdvcnlCYWcqICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlCYWcgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudAorLy8vIEF0dHJpYnV0ZSB0TW9kZWxLZXkgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dE1vZGVsS2V5CisgICBAdWRkaTJfX3RNb2RlbEtleSAgICAgICAgICAgICAgICAgICAgIHRNb2RlbEtleSAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBvcGVyYXRvciBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcl8gICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgYXV0aG9yaXplZE5hbWUgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXplZE5hbWUgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJ0TW9kZWxCYWciCisKK2NsYXNzIHVkZGkyX190TW9kZWxCYWcKK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fdE1vZGVsS2V5IHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX190TW9kZWxLZXkgICAgICAgPiB0TW9kZWxLZXkgICAgICAgICAgICAgICAgICAgICAgMTsKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InRNb2RlbEluZm8iCisKK2NsYXNzIHVkZGkyX190TW9kZWxJbmZvCit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6bmFtZQorICAgIHVkZGkyX19uYW1lKiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gQXR0cmlidXRlIHRNb2RlbEtleSBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0TW9kZWxLZXkKKyAgIEB1ZGRpMl9fdE1vZGVsS2V5ICAgICAgICAgICAgICAgICAgICAgdE1vZGVsS2V5ICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJ0TW9kZWxJbmZvcyIKKworY2xhc3MgdWRkaTJfX3RNb2RlbEluZm9zCit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX3RNb2RlbEluZm8qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX190TW9kZWxJbmZvKiAgICAgPiB0TW9kZWxJbmZvICAgICAgICAgICAgICAgICAgICAgMDsKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InRNb2RlbEluc3RhbmNlRGV0YWlscyIKKworY2xhc3MgdWRkaTJfX3RNb2RlbEluc3RhbmNlRGV0YWlscworeyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX190TW9kZWxJbnN0YW5jZUluZm8qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX190TW9kZWxJbnN0YW5jZUluZm8qPiB0TW9kZWxJbnN0YW5jZUluZm8gICAgICAgICAgICAgMDsKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InRNb2RlbEluc3RhbmNlSW5mbyIKKworY2xhc3MgdWRkaTJfX3RNb2RlbEluc3RhbmNlSW5mbworeyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX19kZXNjcmlwdGlvbiogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2Rlc2NyaXB0aW9uKiAgICA+IGRlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAwOworLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjppbnN0YW5jZURldGFpbHMKKyAgICB1ZGRpMl9faW5zdGFuY2VEZXRhaWxzKiAgICAgICAgICAgICAgaW5zdGFuY2VEZXRhaWxzICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudAorLy8vIEF0dHJpYnV0ZSB0TW9kZWxLZXkgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dE1vZGVsS2V5CisgICBAdWRkaTJfX3RNb2RlbEtleSAgICAgICAgICAgICAgICAgICAgIHRNb2RlbEtleSAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYWRkX3B1Ymxpc2hlckFzc2VydGlvbnMiCisKK2NsYXNzIHVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucworeyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmF1dGhJbmZvCisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhJbmZvICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbiogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbio+IHB1Ymxpc2hlckFzc2VydGlvbiAgICAgICAgICAgICAxOworLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKj4gcHVibGlzaGVyQXNzZXJ0aW9ucyk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0KiBzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbyk7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImRlbGV0ZV9iaW5kaW5nIgorCitjbGFzcyB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcKK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjphdXRoSW5mbworICAgIGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoSW5mbyAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gVmVjdG9yIG9mIHVkZGkyX19iaW5kaW5nS2V5IHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19iaW5kaW5nS2V5ICAgICAgPiBiaW5kaW5nS2V5ICAgICAgICAgICAgICAgICAgICAgMTsKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKik7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqYmluZGluZ0tleSk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8Y2hhcio+IGJpbmRpbmdLZXlzKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQqIHNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKTsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZGVsZXRlX2J1c2luZXNzIgorCitjbGFzcyB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzCit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YXV0aEluZm8KKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aEluZm8gICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIFZlY3RvciBvZiB1ZGRpMl9fYnVzaW5lc3NLZXkgd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzS2V5ICAgICA+IGJ1c2luZXNzS2V5ICAgICAgICAgICAgICAgICAgICAxOworLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKik7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKmJ1c2luZXNzS2V5KTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8Y2hhcio+IGJ1c2luZXNzS2V5cyk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0KiBzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbyk7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImRlbGV0ZV9wdWJsaXNoZXJBc3NlcnRpb25zIgorCitjbGFzcyB1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMKK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjphdXRoSW5mbworICAgIGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoSW5mbyAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gVmVjdG9yIG9mIHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24qPiBwdWJsaXNoZXJBc3NlcnRpb24gICAgICAgICAgICAgMTsKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKik7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbio+IHB1Ymxpc2hlckFzc2VydGlvbnMpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCogc2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJkZWxldGVfc2VydmljZSIKKworY2xhc3MgdWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlCit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YXV0aEluZm8KKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aEluZm8gICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIFZlY3RvciBvZiB1ZGRpMl9fc2VydmljZUtleSB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fc2VydmljZUtleSAgICAgID4gc2VydmljZUtleSAgICAgICAgICAgICAgICAgICAgIDE7CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCopOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnNlcnZpY2VLZXkpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19kZWxldGVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPGNoYXIqPiBzZXJ2aWNlS2V5cyk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0KiBzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbyk7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImRlbGV0ZV90TW9kZWwiCisKK2NsYXNzIHVkZGkyX19kZWxldGVfVVNDT1JFdE1vZGVsCit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YXV0aEluZm8KKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aEluZm8gICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIFZlY3RvciBvZiB1ZGRpMl9fdE1vZGVsS2V5IHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX190TW9kZWxLZXkgICAgICAgPiB0TW9kZWxLZXkgICAgICAgICAgICAgICAgICAgICAgMTsKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKnRNb2RlbEtleSk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3RvcjxjaGFyKj4gdE1vZGVsS2V5cyk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0KiBzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbyk7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImRpc2NhcmRfYXV0aFRva2VuIgorCitjbGFzcyB1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4KK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjphdXRoSW5mbworICAgIGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoSW5mbyAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCopOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKmF1dGhJbmZvKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQqIHNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQpOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJmaW5kX2JpbmRpbmciCisKK2NsYXNzIHVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmcKK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpmaW5kUXVhbGlmaWVycworICAgIHVkZGkyX19maW5kUXVhbGlmaWVycyogICAgICAgICAgICAgICBmaW5kUXVhbGlmaWVycyAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRNb2RlbEJhZworICAgIHVkZGkyX190TW9kZWxCYWcqICAgICAgICAgICAgICAgICAgICB0TW9kZWxCYWcgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIG1heFJvd3Mgb2YgdHlwZSB4czppbnQKKyAgIEBpbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Um93cyAgICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIHNlcnZpY2VLZXkgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6c2VydmljZUtleQorICAgQHVkZGkyX19zZXJ2aWNlS2V5ICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlS2V5ICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2ZpbmRfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCopOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0TW9kZWxLZXkpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3RvcjxjaGFyKj4gdE1vZGVsS2V5cyk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2JpbmRpbmdEZXRhaWwgKnNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQpOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJmaW5kX2J1c2luZXNzIgorCitjbGFzcyB1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzcworeyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmZpbmRRdWFsaWZpZXJzCisgICAgdWRkaTJfX2ZpbmRRdWFsaWZpZXJzKiAgICAgICAgICAgICAgIGZpbmRRdWFsaWZpZXJzICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX25hbWUqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19uYW1lKiAgICAgICAgICAgPiBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgMDsKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6aWRlbnRpZmllckJhZworICAgIHVkZGkyX19pZGVudGlmaWVyQmFnKiAgICAgICAgICAgICAgICBpZGVudGlmaWVyQmFnICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmNhdGVnb3J5QmFnCisgICAgdWRkaTJfX2NhdGVnb3J5QmFnKiAgICAgICAgICAgICAgICAgIGNhdGVnb3J5QmFnICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dE1vZGVsQmFnCisgICAgdWRkaTJfX3RNb2RlbEJhZyogICAgICAgICAgICAgICAgICAgIHRNb2RlbEJhZyAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6ZGlzY292ZXJ5VVJMcworICAgIHVkZGkyX19kaXNjb3ZlcnlVUkxzKiAgICAgICAgICAgICAgICBkaXNjb3ZlcnlVUkxzICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIG1heFJvd3Mgb2YgdHlwZSB4czppbnQKKyAgIEBpbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Um93cyAgICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKik7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICpuYW1lKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPGNoYXIqPiB0TW9kZWxLZXlzKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZmluZF9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19rZXllZFJlZmVyZW5jZSo+IGtleWVkUmVmZXJlbmNlcyk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2J1c2luZXNzTGlzdCAqc2VuZChjb25zdCBjaGFyICplbmRwb2ludCk7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImZpbmRfcmVsYXRlZEJ1c2luZXNzZXMiCisKK2NsYXNzIHVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzCit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6ZmluZFF1YWxpZmllcnMKKyAgICB1ZGRpMl9fZmluZFF1YWxpZmllcnMqICAgICAgICAgICAgICAgZmluZFF1YWxpZmllcnMgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudAorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpidXNpbmVzc0tleQorICAgIHVkZGkyX19idXNpbmVzc0tleSAgICAgICAgICAgICAgICAgICBidXNpbmVzc0tleSAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmtleWVkUmVmZXJlbmNlCisgICAgdWRkaTJfX2tleWVkUmVmZXJlbmNlKiAgICAgICAgICAgICAgIGtleWVkUmVmZXJlbmNlICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgbWF4Um93cyBvZiB0eXBlIHhzOmludAorICAgQGludCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhSb3dzICAgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMoc3RydWN0IHNvYXAqKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKmJ1c2luZXNzS2V5KTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0ICpzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50KTsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZmluZF9zZXJ2aWNlIgorCitjbGFzcyB1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlCit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6ZmluZFF1YWxpZmllcnMKKyAgICB1ZGRpMl9fZmluZFF1YWxpZmllcnMqICAgICAgICAgICAgICAgZmluZFF1YWxpZmllcnMgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudAorLy8vIFZlY3RvciBvZiB1ZGRpMl9fbmFtZSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX25hbWUqICAgICAgICAgICA+IG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAwOworLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpjYXRlZ29yeUJhZworICAgIHVkZGkyX19jYXRlZ29yeUJhZyogICAgICAgICAgICAgICAgICBjYXRlZ29yeUJhZyAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRNb2RlbEJhZworICAgIHVkZGkyX190TW9kZWxCYWcqICAgICAgICAgICAgICAgICAgICB0TW9kZWxCYWcgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIG1heFJvd3Mgb2YgdHlwZSB4czppbnQKKyAgIEBpbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Um93cyAgICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIGJ1c2luZXNzS2V5IG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOmJ1c2luZXNzS2V5CisgICBAdWRkaTJfX2J1c2luZXNzS2V5ICAgICAgICAgICAgICAgICAgIGJ1c2luZXNzS2V5ICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZmluZF9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwKik7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKm5hbWUpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3RvcjxjaGFyKj4gdE1vZGVsS2V5cyk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2ZpbmRfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19rZXllZFJlZmVyZW5jZSo+IGtleWVkUmVmZXJlbmNlcyk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX3NlcnZpY2VMaXN0KiBzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50KTsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZmluZF90TW9kZWwiCisKK2NsYXNzIHVkZGkyX19maW5kX1VTQ09SRXRNb2RlbAoreyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmZpbmRRdWFsaWZpZXJzCisgICAgdWRkaTJfX2ZpbmRRdWFsaWZpZXJzKiAgICAgICAgICAgICAgIGZpbmRRdWFsaWZpZXJzICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGVsZW1lbnQKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6bmFtZQorICAgIHVkZGkyX19uYW1lKiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmlkZW50aWZpZXJCYWcKKyAgICB1ZGRpMl9faWRlbnRpZmllckJhZyogICAgICAgICAgICAgICAgaWRlbnRpZmllckJhZyAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgZWxlbWVudAorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpjYXRlZ29yeUJhZworICAgIHVkZGkyX19jYXRlZ29yeUJhZyogICAgICAgICAgICAgICAgICBjYXRlZ29yeUJhZyAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIG1heFJvd3Mgb2YgdHlwZSB4czppbnQKKyAgIEBpbnQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Um93cyAgICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19maW5kX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCopOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19maW5kX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIgKm5hbWUpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19maW5kX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19rZXllZFJlZmVyZW5jZSo+IGtleWVkUmVmZXJlbmNlcyk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX3RNb2RlbExpc3QqIHNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQpOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJnZXRfYXNzZXJ0aW9uU3RhdHVzUmVwb3J0IgorCitjbGFzcyB1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydAoreyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmF1dGhJbmZvCisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhJbmZvICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6Y29tcGxldGlvblN0YXR1cworICAgIGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uU3RhdHVzICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBlbGVtZW50CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KHN0cnVjdCBzb2FwKik7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICpjb21wbGV0aW9uU3RhdHVzKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KiBzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50LCBjaGFyICphdXRoSW5mbyk7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImdldF9hdXRoVG9rZW4iCisKK2NsYXNzIHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuCit7IHB1YmxpYzoKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgdXNlcklEIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBjcmVkIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbihzdHJ1Y3Qgc29hcCopOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqdXNlcmlkLCBjb25zdCBjaGFyICpwYXNzd2QpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19hdXRoVG9rZW4qIHNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQpOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJnZXRfYmluZGluZ0RldGFpbCIKKworY2xhc3MgdWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsCit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2JpbmRpbmdLZXkgd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2JpbmRpbmdLZXkgICAgICA+IGJpbmRpbmdLZXkgICAgICAgICAgICAgICAgICAgICAxOworLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwoc3RydWN0IHNvYXAqKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICpiaW5kaW5nS2V5KTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3RvcjxjaGFyKj4gYmluZGluZ0tleXMpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19iaW5kaW5nRGV0YWlsKiBzZW5kKGNvbnN0IGNoYXIgKmVuZHBvaW50KTsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZ2V0X2J1c2luZXNzRGV0YWlsIgorCitjbGFzcyB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsCit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2J1c2luZXNzS2V5IHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc0tleSAgICAgPiBidXNpbmVzc0tleSAgICAgICAgICAgICAgICAgICAgMTsKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbChzdHJ1Y3Qgc29hcCopOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICpidXNpbmVzc0tleSk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbChzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPGNoYXIqPiBidXNpbmVzc0tleXMpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19idXNpbmVzc0RldGFpbCogc2VuZChjb25zdCBjaGFyICplbmRwb2ludCk7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImdldF9idXNpbmVzc0RldGFpbEV4dCIKKworY2xhc3MgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dAoreyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX19idXNpbmVzc0tleSB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NLZXkgICAgID4gYnVzaW5lc3NLZXkgICAgICAgICAgICAgICAgICAgIDE7CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQoc3RydWN0IHNvYXAqKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0KHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqYnVzaW5lc3NLZXkpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3RvcjxjaGFyKj4gYnVzaW5lc3NLZXlzKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHQqIHNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQpOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJnZXRfcHVibGlzaGVyQXNzZXJ0aW9ucyIKKworY2xhc3MgdWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zCit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YXV0aEluZm8KKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aEluZm8gICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9ucyogc2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJnZXRfcmVnaXN0ZXJlZEluZm8iCisKK2NsYXNzIHVkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8KK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjphdXRoSW5mbworICAgIGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoSW5mbyAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8oc3RydWN0IHNvYXAqKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fcmVnaXN0ZXJlZEluZm8qIHNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKTsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZ2V0X3NlcnZpY2VEZXRhaWwiCisKK2NsYXNzIHVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbAoreyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX19zZXJ2aWNlS2V5IHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19zZXJ2aWNlS2V5ICAgICAgPiBzZXJ2aWNlS2V5ICAgICAgICAgICAgICAgICAgICAgMTsKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsKHN0cnVjdCBzb2FwKik7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsKHN0cnVjdCBzb2FwKiwgY29uc3QgY2hhciAqc2VydmljZUtleSk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2dldF9VU0NPUkVzZXJ2aWNlRGV0YWlsKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8Y2hhcio+IHNlcnZpY2VLZXlzKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fc2VydmljZURldGFpbCogc2VuZChjb25zdCBjaGFyICplbmRwb2ludCk7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImdldF90TW9kZWxEZXRhaWwiCisKK2NsYXNzIHVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsCit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX3RNb2RlbEtleSB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fdE1vZGVsS2V5ICAgICAgID4gdE1vZGVsS2V5ICAgICAgICAgICAgICAgICAgICAgIDE7CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsKHN0cnVjdCBzb2FwKik7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyICp0TW9kZWxLZXkpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8Y2hhcio+IHRNb2RlbEtleXMpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX190TW9kZWxEZXRhaWwqIHNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQpOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJzYXZlX2JpbmRpbmciCisKK2NsYXNzIHVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcKK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjphdXRoSW5mbworICAgIGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoSW5mbyAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gVmVjdG9yIG9mIHVkZGkyX19iaW5kaW5nVGVtcGxhdGUqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19iaW5kaW5nVGVtcGxhdGUqPiBiaW5kaW5nVGVtcGxhdGUgICAgICAgICAgICAgICAgMTsKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCopOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYmluZGluZ1RlbXBsYXRlICZiaW5kaW5nVGVtcGxhdGUpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19zYXZlX1VTQ09SRWJpbmRpbmcoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYmluZGluZ1RlbXBsYXRlKj4gYmluZGluZ1RlbXBsYXRlcyk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX2JpbmRpbmdEZXRhaWwqIHNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKTsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92Mjoic2F2ZV9idXNpbmVzcyIKKworY2xhc3MgdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3MKK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjphdXRoSW5mbworICAgIGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoSW5mbyAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gVmVjdG9yIG9mIHVkZGkyX19idXNpbmVzc0VudGl0eSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2J1c2luZXNzRW50aXR5KiA+IGJ1c2luZXNzRW50aXR5ICAgICAgICAgICAgICAgICAwOworLy8vIFZlY3RvciBvZiBjaGFyKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3RvcjxjaGFyKiAgICAgICAgICAgICAgICAgID4gdXBsb2FkUmVnaXN0ZXIgICAgICAgICAgICAgICAgIDA7CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19zYXZlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwKik7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAqLCB1ZGRpMl9fYnVzaW5lc3NFbnRpdHkgJmJ1c2luZXNzRW50aXR5KTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyhzdHJ1Y3Qgc29hcCosIHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc0VudGl0eSo+IGJ1c2luZXNzRW50aXRpZXMpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19idXNpbmVzc0RldGFpbCogc2VuZChjb25zdCBjaGFyICplbmRwb2ludCwgY2hhciAqYXV0aEluZm8pOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJzYXZlX3NlcnZpY2UiCisKK2NsYXNzIHVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2UKK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjphdXRoSW5mbworICAgIGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoSW5mbyAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gVmVjdG9yIG9mIHVkZGkyX19idXNpbmVzc1NlcnZpY2UqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc1NlcnZpY2UqPiBidXNpbmVzc1NlcnZpY2UgICAgICAgICAgICAgICAgMTsKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX3NhdmVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCopOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlICZidXNpbmVzc1NlcnZpY2UpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlKj4gYnVzaW5lc3NTZXJ2aWNlcyk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX3NlcnZpY2VEZXRhaWwqIHNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKTsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92Mjoic2F2ZV90TW9kZWwiCisKK2NsYXNzIHVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbAoreyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmF1dGhJbmZvCisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhJbmZvICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX3RNb2RlbCogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbCogICAgICAgICA+IHRNb2RlbCAgICAgICAgICAgICAgICAgICAgICAgICAwOworLy8vIFZlY3RvciBvZiBjaGFyKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3RvcjxjaGFyKiAgICAgICAgICAgICAgICAgID4gdXBsb2FkUmVnaXN0ZXIgICAgICAgICAgICAgICAgIDA7CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCopOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbChzdHJ1Y3Qgc29hcCosIHVkZGkyX190TW9kZWwgJnRNb2RlbCk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX3NhdmVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwKiwgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbCo+IHRNb2RlbHMpOworLy8vIE1lbWJlciBkZWNsYXJlZCBpbiB1ZGRpMi10eXBlbWFwLmRhdAorICAgIHVkZGkyX190TW9kZWxEZXRhaWwqIHNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKTsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92Mjoic2V0X3B1Ymxpc2hlckFzc2VydGlvbnMiCisKK2NsYXNzIHVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucworeyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmF1dGhJbmZvCisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhJbmZvICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbiogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbio+IHB1Ymxpc2hlckFzc2VydGlvbiAgICAgICAgICAgICAwOworLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqKTsKKy8vLyBNZW1iZXIgZGVjbGFyZWQgaW4gdWRkaTItdHlwZW1hcC5kYXQKKyAgICB1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAqLCBzdGQ6OnZlY3Rvcjx1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uKj4gcHVibGlzaGVyQXNzZXJ0aW9ucyk7CisvLy8gTWVtYmVyIGRlY2xhcmVkIGluIHVkZGkyLXR5cGVtYXAuZGF0CisgICAgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMqIHNlbmQoY29uc3QgY2hhciAqZW5kcG9pbnQsIGNoYXIgKmF1dGhJbmZvKTsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoidmFsaWRhdGVfdmFsdWVzIgorCitjbGFzcyB1ZGRpMl9fdmFsaWRhdGVfVVNDT1JFdmFsdWVzCit7IHB1YmxpYzoKKy8vIENIT0lDRSBPRiBFTEVNRU5UUzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2J1c2luZXNzRW50aXR5KiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NFbnRpdHkqID4gYnVzaW5lc3NFbnRpdHkgICAgICAgICAgICAgICAgIDA7CisvLy8gVmVjdG9yIG9mIHVkZGkyX19idXNpbmVzc1NlcnZpY2UqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc1NlcnZpY2UqPiBidXNpbmVzc1NlcnZpY2UgICAgICAgICAgICAgICAgMDsKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX3RNb2RlbCogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbCogICAgICAgICA+IHRNb2RlbCAgICAgICAgICAgICAgICAgICAgICAgICAwOworLy8gRU5EIENIT0lDRQorLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYXNzZXJ0aW9uU3RhdHVzUmVwb3J0IgorCitjbGFzcyB1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0Cit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2Fzc2VydGlvblN0YXR1c0l0ZW0qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19hc3NlcnRpb25TdGF0dXNJdGVtKj4gYXNzZXJ0aW9uU3RhdHVzSXRlbSAgICAgICAgICAgIDA7CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIG9wZXJhdG9yIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yXyAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiYXV0aFRva2VuIgorCitjbGFzcyB1ZGRpMl9fYXV0aFRva2VuCit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YXV0aEluZm8KKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aEluZm8gICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBvcGVyYXRvciBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcl8gICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImJpbmRpbmdEZXRhaWwiCisKK2NsYXNzIHVkZGkyX19iaW5kaW5nRGV0YWlsCit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2JpbmRpbmdUZW1wbGF0ZSogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX2JpbmRpbmdUZW1wbGF0ZSo+IGJpbmRpbmdUZW1wbGF0ZSAgICAgICAgICAgICAgICAwOworLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBvcGVyYXRvciBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcl8gICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgdHJ1bmNhdGVkIG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRydW5jYXRlZAorICAgQGVudW0gdWRkaTJfX3RydW5jYXRlZCogICAgICAgICAgICAgICB0cnVuY2F0ZWQgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImJ1c2luZXNzRGV0YWlsIgorCitjbGFzcyB1ZGRpMl9fYnVzaW5lc3NEZXRhaWwKK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fYnVzaW5lc3NFbnRpdHkqIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19idXNpbmVzc0VudGl0eSogPiBidXNpbmVzc0VudGl0eSAgICAgICAgICAgICAgICAgMDsKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgb3BlcmF0b3Igb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3JfICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIHRydW5jYXRlZCBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0cnVuY2F0ZWQKKyAgIEBlbnVtIHVkZGkyX190cnVuY2F0ZWQqICAgICAgICAgICAgICAgdHJ1bmNhdGVkICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJidXNpbmVzc0RldGFpbEV4dCIKKworY2xhc3MgdWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0Cit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX2J1c2luZXNzRW50aXR5RXh0KiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NFbnRpdHlFeHQqPiBidXNpbmVzc0VudGl0eUV4dCAgICAgICAgICAgICAgMTsKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgb3BlcmF0b3Igb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3JfICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIHRydW5jYXRlZCBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0cnVuY2F0ZWQKKyAgIEBlbnVtIHVkZGkyX190cnVuY2F0ZWQqICAgICAgICAgICAgICAgdHJ1bmNhdGVkICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJidXNpbmVzc0xpc3QiCisKK2NsYXNzIHVkZGkyX19idXNpbmVzc0xpc3QKK3sgcHVibGljOgorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpidXNpbmVzc0luZm9zCisgICAgdWRkaTJfX2J1c2luZXNzSW5mb3MqICAgICAgICAgICAgICAgIGJ1c2luZXNzSW5mb3MgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGVsZW1lbnQKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgb3BlcmF0b3Igb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3JfICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIHRydW5jYXRlZCBvZiB0eXBlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0cnVuY2F0ZWQKKyAgIEBlbnVtIHVkZGkyX190cnVuY2F0ZWQqICAgICAgICAgICAgICAgdHJ1bmNhdGVkICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLy8vIFNjaGVtYSB1cm46dWRkaS1vcmc6YXBpX3YyOiJwdWJsaXNoZXJBc3NlcnRpb25zIgorCitjbGFzcyB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9ucworeyBwdWJsaWM6CisvLy8gVmVjdG9yIG9mIHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24qIHdpdGggbGVuZ3RoIDAuLnVuYm91bmRlZAorICAgIHN0ZDo6dmVjdG9yPHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb24qPiBwdWJsaXNoZXJBc3NlcnRpb24gICAgICAgICAgICAgMDsKKy8vLyBBdHRyaWJ1dGUgZ2VuZXJpYyBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgb3BlcmF0b3Igb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3JfICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIGF1dGhvcml6ZWROYW1lIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcml6ZWROYW1lICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoicmVnaXN0ZXJlZEluZm8iCisKK2NsYXNzIHVkZGkyX19yZWdpc3RlcmVkSW5mbworeyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOmJ1c2luZXNzSW5mb3MKKyAgICB1ZGRpMl9fYnVzaW5lc3NJbmZvcyogICAgICAgICAgICAgICAgYnVzaW5lc3NJbmZvcyAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjp0TW9kZWxJbmZvcworICAgIHVkZGkyX190TW9kZWxJbmZvcyogICAgICAgICAgICAgICAgICB0TW9kZWxJbmZvcyAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIG9wZXJhdG9yIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yXyAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSB0cnVuY2F0ZWQgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dHJ1bmNhdGVkCisgICBAZW51bSB1ZGRpMl9fdHJ1bmNhdGVkKiAgICAgICAgICAgICAgIHRydW5jYXRlZCAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoicmVsYXRlZEJ1c2luZXNzZXNMaXN0IgorCitjbGFzcyB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0Cit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6YnVzaW5lc3NLZXkKKyAgICB1ZGRpMl9fYnVzaW5lc3NLZXkgICAgICAgICAgICAgICAgICAgYnVzaW5lc3NLZXkgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIEVsZW1lbnQgcmVmZXJlbmNlICJ1cm46dWRkaS1vcmc6YXBpX3YyIjpyZWxhdGVkQnVzaW5lc3NJbmZvcworICAgIHVkZGkyX19yZWxhdGVkQnVzaW5lc3NJbmZvcyogICAgICAgICByZWxhdGVkQnVzaW5lc3NJbmZvcyAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIG9wZXJhdG9yIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yXyAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSB0cnVuY2F0ZWQgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dHJ1bmNhdGVkCisgICBAZW51bSB1ZGRpMl9fdHJ1bmNhdGVkKiAgICAgICAgICAgICAgIHRydW5jYXRlZCAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92Mjoic2VydmljZURldGFpbCIKKworY2xhc3MgdWRkaTJfX3NlcnZpY2VEZXRhaWwKK3sgcHVibGljOgorLy8vIFZlY3RvciBvZiB1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlKiB3aXRoIGxlbmd0aCAwLi51bmJvdW5kZWQKKyAgICBzdGQ6OnZlY3Rvcjx1ZGRpMl9fYnVzaW5lc3NTZXJ2aWNlKj4gYnVzaW5lc3NTZXJ2aWNlICAgICAgICAgICAgICAgIDA7CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIG9wZXJhdG9yIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yXyAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSB0cnVuY2F0ZWQgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dHJ1bmNhdGVkCisgICBAZW51bSB1ZGRpMl9fdHJ1bmNhdGVkKiAgICAgICAgICAgICAgIHRydW5jYXRlZCAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92Mjoic2VydmljZUxpc3QiCisKK2NsYXNzIHVkZGkyX19zZXJ2aWNlTGlzdAoreyBwdWJsaWM6CisvLy8gRWxlbWVudCByZWZlcmVuY2UgInVybjp1ZGRpLW9yZzphcGlfdjIiOnNlcnZpY2VJbmZvcworICAgIHVkZGkyX19zZXJ2aWNlSW5mb3MqICAgICAgICAgICAgICAgICBzZXJ2aWNlSW5mb3MgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBlbGVtZW50CisvLy8gQXR0cmlidXRlIGdlbmVyaWMgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIG9wZXJhdG9yIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yXyAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSB0cnVuY2F0ZWQgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dHJ1bmNhdGVkCisgICBAZW51bSB1ZGRpMl9fdHJ1bmNhdGVkKiAgICAgICAgICAgICAgIHRydW5jYXRlZCAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoidE1vZGVsRGV0YWlsIgorCitjbGFzcyB1ZGRpMl9fdE1vZGVsRGV0YWlsCit7IHB1YmxpYzoKKy8vLyBWZWN0b3Igb2YgdWRkaTJfX3RNb2RlbCogd2l0aCBsZW5ndGggMC4udW5ib3VuZGVkCisgICAgc3RkOjp2ZWN0b3I8dWRkaTJfX3RNb2RlbCogICAgICAgICA+IHRNb2RlbCAgICAgICAgICAgICAgICAgICAgICAgICAxOworLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBvcGVyYXRvciBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcl8gICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgdHJ1bmNhdGVkIG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRydW5jYXRlZAorICAgQGVudW0gdWRkaTJfX3RydW5jYXRlZCogICAgICAgICAgICAgICB0cnVuY2F0ZWQgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InRNb2RlbExpc3QiCisKK2NsYXNzIHVkZGkyX190TW9kZWxMaXN0Cit7IHB1YmxpYzoKKy8vLyBFbGVtZW50IHJlZmVyZW5jZSAidXJuOnVkZGktb3JnOmFwaV92MiI6dE1vZGVsSW5mb3MKKyAgICB1ZGRpMl9fdE1vZGVsSW5mb3MqICAgICAgICAgICAgICAgICAgdE1vZGVsSW5mb3MgICAgICAgICAgICAgICAgICAgIDE7CS8vLzwgUmVxdWlyZWQgZWxlbWVudAorLy8vIEF0dHJpYnV0ZSBnZW5lcmljIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEF0dHJpYnV0ZSBvcGVyYXRvciBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcl8gICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBdHRyaWJ1dGUgdHJ1bmNhdGVkIG9mIHR5cGUgInVybjp1ZGRpLW9yZzphcGlfdjIiOnRydW5jYXRlZAorICAgQGVudW0gdWRkaTJfX3RydW5jYXRlZCogICAgICAgICAgICAgICB0cnVuY2F0ZWQgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImFjY2Vzc1BvaW50IgorCitjbGFzcyB1ZGRpMl9fYWNjZXNzUG9pbnQKK3sgcHVibGljOgorICAgIGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2l0ZW0gICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gQXR0cmlidXRlIFVSTFR5cGUgb2YgdHlwZSAidXJuOnVkZGktb3JnOmFwaV92MiI6VVJMVHlwZQorICAgQGVudW0gdWRkaTJfX1VSTFR5cGUgICAgICAgICAgICAgICAgICBVUkxUeXBlICAgICAgICAgICAgICAgICAgICAgICAgMTsJLy8vPCBSZXF1aXJlZCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImFkZHJlc3NMaW5lIgorCitjbGFzcyB1ZGRpMl9fYWRkcmVzc0xpbmUKK3sgcHVibGljOgorICAgIGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2l0ZW0gICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gQXR0cmlidXRlIGtleU5hbWUgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5TmFtZSAgICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQXR0cmlidXRlIGtleVZhbHVlIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlICAgICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZGVzY3JpcHRpb24iCisKK2NsYXNzIHVkZGkyX19kZXNjcmlwdGlvbgoreyBwdWJsaWM6CisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXRlbSAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBBdHRyaWJ1dGUgcmVmZXJlbmNlIHhtbDpsYW5nCisgICBAeG1sX19sYW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbF9fbGFuZ18gICAgICAgICAgICAgICAgICAgICAwOwkvLy88IE9wdGlvbmFsIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZGlzY292ZXJ5VVJMIgorCitjbGFzcyB1ZGRpMl9fZGlzY292ZXJ5VVJMCit7IHB1YmxpYzoKKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pdGVtICAgICAgICAgICAgICAgICAgICAgICAgOworLy8vIEF0dHJpYnV0ZSB1c2VUeXBlIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoiZW1haWwiCisKK2NsYXNzIHVkZGkyX19lbWFpbAoreyBwdWJsaWM6CisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXRlbSAgICAgICAgICAgICAgICAgICAgICAgIDsKKy8vLyBBdHRyaWJ1dGUgdXNlVHlwZSBvZiB0eXBlIHhzOnN0cmluZworICAgQGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VUeXBlICAgICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6ImVyckluZm8iCisKK2NsYXNzIHVkZGkyX19lcnJJbmZvCit7IHB1YmxpYzoKKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pdGVtICAgICAgICAgICAgICAgICAgICAgICAgOworLy8vIEF0dHJpYnV0ZSBlcnJDb2RlIG9mIHR5cGUgeHM6c3RyaW5nCisgICBAY2hhciogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyckNvZGUgICAgICAgICAgICAgICAgICAgICAgICAxOwkvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZQorLy8vIEEgaGFuZGxlIHRvIHRoZSBzb2FwIHN0cnVjdCBjb250ZXh0IHRoYXQgbWFuYWdlcyB0aGlzIGNsYXNzIGluc3RhbmNlCisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8vLyBTY2hlbWEgdXJuOnVkZGktb3JnOmFwaV92MjoibmFtZSIKKworY2xhc3MgdWRkaTJfX25hbWUKK3sgcHVibGljOgorICAgIGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2l0ZW0gICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gQXR0cmlidXRlIHJlZmVyZW5jZSB4bWw6bGFuZworICAgQHhtbF9fbGFuZyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxfX2xhbmdfICAgICAgICAgICAgICAgICAgICAgMDsJLy8vPCBPcHRpb25hbCBhdHRyaWJ1dGUKKy8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgY29udGV4dCB0aGF0IG1hbmFnZXMgdGhpcyBjbGFzcyBpbnN0YW5jZQorICAgIHN0cnVjdCBzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICpzb2FwICAgICAgICAgICAgICAgICAgICAgICAgICA7Cit9OworCisvLy8gU2NoZW1hIHVybjp1ZGRpLW9yZzphcGlfdjI6InBob25lIgorCitjbGFzcyB1ZGRpMl9fcGhvbmUKK3sgcHVibGljOgorICAgIGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2l0ZW0gICAgICAgICAgICAgICAgICAgICAgICA7CisvLy8gQXR0cmlidXRlIHVzZVR5cGUgb2YgdHlwZSB4czpzdHJpbmcKKyAgIEBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgIDA7CS8vLzwgT3B0aW9uYWwgYXR0cmlidXRlCisvLy8gQSBoYW5kbGUgdG8gdGhlIHNvYXAgc3RydWN0IGNvbnRleHQgdGhhdCBtYW5hZ2VzIHRoaXMgY2xhc3MgaW5zdGFuY2UKKyAgICBzdHJ1Y3Qgc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAqc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFNlcnZpY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG5hbWU6CUlucXVpcmVTb2FwIAorLy9nc29hcCBpbnEyIHNlcnZpY2UgdHlwZToJSW5xdWlyZSAKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG5hbWVzcGFjZToJdXJuOnVkZGktb3JnOmlucXVpcnlfdjIgCisvL2dzb2FwIHB1YjIgc2VydmljZSBuYW1lOglQdWJsaXNoU29hcCAKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIHR5cGU6CVB1Ymxpc2ggCisvL2dzb2FwIHB1YjIgc2VydmljZSBuYW1lc3BhY2U6CXVybjp1ZGRpLW9yZzpwdWJsaWNhdGlvbl92MiAKKworLyoqIEBtYWlucGFnZSBTZXJ2aWNlIERlZmluaXRpb25zCisKK0BzZWN0aW9uIFNlcnZpY2VfYmluZGluZ3MgQmluZGluZ3MKKyAgLSBAcmVmIElucXVpcmVTb2FwCisgIC0gQHJlZiBQdWJsaXNoU29hcAorCisqLworCisvKioKKworQHBhZ2UgSW5xdWlyZVNvYXAgQmluZGluZyAiSW5xdWlyZVNvYXAiCisKK0BzZWN0aW9uIElucXVpcmVTb2FwX29wZXJhdGlvbnMgT3BlcmF0aW9ucyBvZiBCaW5kaW5nICAiSW5xdWlyZVNvYXAiCisgIC0gQHJlZiBfX2lucTJfX2ZpbmRfVVNDT1JFYmluZGluZworICAtIEByZWYgX19pbnEyX19maW5kX1VTQ09SRWJ1c2luZXNzCisgIC0gQHJlZiBfX2lucTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMKKyAgLSBAcmVmIF9faW5xMl9fZmluZF9VU0NPUkVzZXJ2aWNlCisgIC0gQHJlZiBfX2lucTJfX2ZpbmRfVVNDT1JFdE1vZGVsCisgIC0gQHJlZiBfX2lucTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsCisgIC0gQHJlZiBfX2lucTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbAorICAtIEByZWYgX19pbnEyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQKKyAgLSBAcmVmIF9faW5xMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwKKyAgLSBAcmVmIF9faW5xMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbAorCitAc2VjdGlvbiBJbnF1aXJlU29hcF9wb3J0cyBFbmRwb2ludHMgb2YgQmluZGluZyAgIklucXVpcmVTb2FwIgorCisqLworCisvKioKKworQHBhZ2UgUHVibGlzaFNvYXAgQmluZGluZyAiUHVibGlzaFNvYXAiCisKK0BzZWN0aW9uIFB1Ymxpc2hTb2FwX29wZXJhdGlvbnMgT3BlcmF0aW9ucyBvZiBCaW5kaW5nICAiUHVibGlzaFNvYXAiCisgIC0gQHJlZiBfX3B1YjJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zCisgIC0gQHJlZiBfX3B1YjJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nCisgIC0gQHJlZiBfX3B1YjJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcworICAtIEByZWYgX19wdWIyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucworICAtIEByZWYgX19wdWIyX19kZWxldGVfVVNDT1JFc2VydmljZQorICAtIEByZWYgX19wdWIyX19kZWxldGVfVVNDT1JFdE1vZGVsCisgIC0gQHJlZiBfX3B1YjJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuCisgIC0gQHJlZiBfX3B1YjJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQKKyAgLSBAcmVmIF9fcHViMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbgorICAtIEByZWYgX19wdWIyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucworICAtIEByZWYgX19wdWIyX19nZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8KKyAgLSBAcmVmIF9fcHViMl9fc2F2ZV9VU0NPUkViaW5kaW5nCisgIC0gQHJlZiBfX3B1YjJfX3NhdmVfVVNDT1JFYnVzaW5lc3MKKyAgLSBAcmVmIF9fcHViMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlCisgIC0gQHJlZiBfX3B1YjJfX3NhdmVfVVNDT1JFdE1vZGVsCisgIC0gQHJlZiBfX3B1YjJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zCisKK0BzZWN0aW9uIFB1Ymxpc2hTb2FwX3BvcnRzIEVuZHBvaW50cyBvZiBCaW5kaW5nICAiUHVibGlzaFNvYXAiCisKKyovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBTT0FQIEZhdWx0IERldGFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy8gVGhlIFNPQVAgRmF1bHQgRGV0YWlsIGVsZW1lbnQgY29udGFpbnMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHlwZXMgc2VyaWFsaXplZAorLy8gaW4gdGhlIF9fdHlwZSBhbmQgZmF1bHQgZmllbGRzIG9mIHRoZSBTT0FQX0VOVl9fRGV0YWlsIHN0cnVjdCAoc2VlIGRvY3MpCitjbGFzcyBfZGlzcG9zaXRpb25SZXBvcnQKK3sgcHVibGljOgorICAgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCogICAgICAgICAgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydF87CisgICAgc3RydWN0IHNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgKnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBJbnF1aXJlU29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBfX2lucTJfX2ZpbmRfVVNDT1JFYmluZGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8vLyBPcGVyYXRpb24gIl9faW5xMl9fZmluZF9VU0NPUkViaW5kaW5nIiBvZiBzZXJ2aWNlIGJpbmRpbmcgIklucXVpcmVTb2FwIgorCisvKioKKworT3BlcmF0aW9uIGRldGFpbHM6CisKKyAgLSBTT0FQIGRvY3VtZW50L2xpdGVyYWwgc3R5bGUKKyAgLSBTT0FQIGFjdGlvbj0iZmluZF9iaW5kaW5nIgorICAtIFNPQVAgRmF1bHQ6IF9kaXNwb3NpdGlvblJlcG9ydAorCitDIHN0dWIgZnVuY3Rpb24gKGRlZmluZWQgaW4gc29hcENsaWVudC5jW3BwXSk6CitAY29kZQorICBpbnQgc29hcF9jYWxsX19faW5xMl9fZmluZF9VU0NPUkViaW5kaW5nKHN0cnVjdCBzb2FwICpzb2FwLAorICAgIE5VTEwsIC8vIGNoYXIgKmVuZHBvaW50ID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgZW5kcG9pbnQgZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgTlVMTCwgLy8gY2hhciAqYWN0aW9uID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgYWN0aW9uIGZvciB0aGlzIG9wZXJhdGlvbgorICAgIC8vIHJlcXVlc3QgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nKiAgICAgICAgICB1ZGRpMl9fZmluZF9VU0NPUkViaW5kaW5nXywKKyAgICAvLyByZXNwb25zZSBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX19iaW5kaW5nRGV0YWlsKiAgICAgICAgICAgICAgIHVkZGkyX19iaW5kaW5nRGV0YWlsXworICApOworQGVuZGNvZGUKKworQysrIHByb3h5IGNsYXNzIChkZWZpbmVkIGluIHNvYXBJbnF1aXJlU29hcFByb3h5LmgpOgorICBjbGFzcyBJbnF1aXJlU29hcDsKKworKi8KKworLy9nc29hcCBpbnEyIHNlcnZpY2UgbWV0aG9kLXN0eWxlOglmaW5kX1VTQ09SRWJpbmRpbmcgZG9jdW1lbnQKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1lbmNvZGluZzoJZmluZF9VU0NPUkViaW5kaW5nIGxpdGVyYWwKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1hY3Rpb246CWZpbmRfVVNDT1JFYmluZGluZyBmaW5kX2JpbmRpbmcKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1mYXVsdDoJZmluZF9VU0NPUkViaW5kaW5nIF9kaXNwb3NpdGlvblJlcG9ydAoraW50IF9faW5xMl9fZmluZF9VU0NPUkViaW5kaW5nKAorICAgIHVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmcqICAgICAgICAgIHVkZGkyX19maW5kX1VTQ09SRWJpbmRpbmdfLAorICAgIHVkZGkyX19iaW5kaW5nRGV0YWlsKiAgICAgICAgICAgICAgIHVkZGkyX19iaW5kaW5nRGV0YWlsXyAvLy88IHJlc3BvbnNlIHBhcmFtZXRlcgorKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIF9faW5xMl9fZmluZF9VU0NPUkVidXNpbmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLy8vIE9wZXJhdGlvbiAiX19pbnEyX19maW5kX1VTQ09SRWJ1c2luZXNzIiBvZiBzZXJ2aWNlIGJpbmRpbmcgIklucXVpcmVTb2FwIgorCisvKioKKworT3BlcmF0aW9uIGRldGFpbHM6CisKKyAgLSBTT0FQIGRvY3VtZW50L2xpdGVyYWwgc3R5bGUKKyAgLSBTT0FQIGFjdGlvbj0iZmluZF9idXNpbmVzcyIKKyAgLSBTT0FQIEZhdWx0OiBfZGlzcG9zaXRpb25SZXBvcnQKKworQyBzdHViIGZ1bmN0aW9uIChkZWZpbmVkIGluIHNvYXBDbGllbnQuY1twcF0pOgorQGNvZGUKKyAgaW50IHNvYXBfY2FsbF9fX2lucTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3Moc3RydWN0IHNvYXAgKnNvYXAsCisgICAgTlVMTCwgLy8gY2hhciAqZW5kcG9pbnQgPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBlbmRwb2ludCBmb3IgdGhpcyBvcGVyYXRpb24KKyAgICBOVUxMLCAvLyBjaGFyICphY3Rpb24gPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBhY3Rpb24gZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgLy8gcmVxdWVzdCBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzKiAgICAgICAgIHVkZGkyX19maW5kX1VTQ09SRWJ1c2luZXNzXywKKyAgICAvLyByZXNwb25zZSBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX19idXNpbmVzc0xpc3QqICAgICAgICAgICAgICAgIHVkZGkyX19idXNpbmVzc0xpc3RfCisgICk7CitAZW5kY29kZQorCitDKysgcHJveHkgY2xhc3MgKGRlZmluZWQgaW4gc29hcElucXVpcmVTb2FwUHJveHkuaCk6CisgIGNsYXNzIElucXVpcmVTb2FwOworCisqLworCisvL2dzb2FwIGlucTIgc2VydmljZSBtZXRob2Qtc3R5bGU6CWZpbmRfVVNDT1JFYnVzaW5lc3MgZG9jdW1lbnQKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1lbmNvZGluZzoJZmluZF9VU0NPUkVidXNpbmVzcyBsaXRlcmFsCisvL2dzb2FwIGlucTIgc2VydmljZSBtZXRob2QtYWN0aW9uOglmaW5kX1VTQ09SRWJ1c2luZXNzIGZpbmRfYnVzaW5lc3MKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1mYXVsdDoJZmluZF9VU0NPUkVidXNpbmVzcyBfZGlzcG9zaXRpb25SZXBvcnQKK2ludCBfX2lucTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MoCisgICAgdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3MqICAgICAgICAgdWRkaTJfX2ZpbmRfVVNDT1JFYnVzaW5lc3NfLAorICAgIHVkZGkyX19idXNpbmVzc0xpc3QqICAgICAgICAgICAgICAgIHVkZGkyX19idXNpbmVzc0xpc3RfIC8vLzwgcmVzcG9uc2UgcGFyYW1ldGVyCispOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogX19pbnEyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvLy8gT3BlcmF0aW9uICJfX2lucTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMiIG9mIHNlcnZpY2UgYmluZGluZyAiSW5xdWlyZVNvYXAiCisKKy8qKgorCitPcGVyYXRpb24gZGV0YWlsczoKKworICAtIFNPQVAgZG9jdW1lbnQvbGl0ZXJhbCBzdHlsZQorICAtIFNPQVAgYWN0aW9uPSJmaW5kX3JlbGF0ZWRCdXNpbmVzc2VzIgorICAtIFNPQVAgRmF1bHQ6IF9kaXNwb3NpdGlvblJlcG9ydAorCitDIHN0dWIgZnVuY3Rpb24gKGRlZmluZWQgaW4gc29hcENsaWVudC5jW3BwXSk6CitAY29kZQorICBpbnQgc29hcF9jYWxsX19faW5xMl9fZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyhzdHJ1Y3Qgc29hcCAqc29hcCwKKyAgICBOVUxMLCAvLyBjaGFyICplbmRwb2ludCA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGVuZHBvaW50IGZvciB0aGlzIG9wZXJhdGlvbgorICAgIE5VTEwsIC8vIGNoYXIgKmFjdGlvbiA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGFjdGlvbiBmb3IgdGhpcyBvcGVyYXRpb24KKyAgICAvLyByZXF1ZXN0IHBhcmFtZXRlcnM6CisgICAgdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMqIHVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzXywKKyAgICAvLyByZXNwb25zZSBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3QqICAgICAgIHVkZGkyX19yZWxhdGVkQnVzaW5lc3Nlc0xpc3RfCisgICk7CitAZW5kY29kZQorCitDKysgcHJveHkgY2xhc3MgKGRlZmluZWQgaW4gc29hcElucXVpcmVTb2FwUHJveHkuaCk6CisgIGNsYXNzIElucXVpcmVTb2FwOworCisqLworCisvL2dzb2FwIGlucTIgc2VydmljZSBtZXRob2Qtc3R5bGU6CWZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMgZG9jdW1lbnQKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1lbmNvZGluZzoJZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyBsaXRlcmFsCisvL2dzb2FwIGlucTIgc2VydmljZSBtZXRob2QtYWN0aW9uOglmaW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzIGZpbmRfcmVsYXRlZEJ1c2luZXNzZXMKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1mYXVsdDoJZmluZF9VU0NPUkVyZWxhdGVkQnVzaW5lc3NlcyBfZGlzcG9zaXRpb25SZXBvcnQKK2ludCBfX2lucTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMoCisgICAgdWRkaTJfX2ZpbmRfVVNDT1JFcmVsYXRlZEJ1c2luZXNzZXMqIHVkZGkyX19maW5kX1VTQ09SRXJlbGF0ZWRCdXNpbmVzc2VzXywKKyAgICB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0KiAgICAgICB1ZGRpMl9fcmVsYXRlZEJ1c2luZXNzZXNMaXN0XyAvLy88IHJlc3BvbnNlIHBhcmFtZXRlcgorKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIF9faW5xMl9fZmluZF9VU0NPUkVzZXJ2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLy8vIE9wZXJhdGlvbiAiX19pbnEyX19maW5kX1VTQ09SRXNlcnZpY2UiIG9mIHNlcnZpY2UgYmluZGluZyAiSW5xdWlyZVNvYXAiCisKKy8qKgorCitPcGVyYXRpb24gZGV0YWlsczoKKworICAtIFNPQVAgZG9jdW1lbnQvbGl0ZXJhbCBzdHlsZQorICAtIFNPQVAgYWN0aW9uPSJmaW5kX3NlcnZpY2UiCisgIC0gU09BUCBGYXVsdDogX2Rpc3Bvc2l0aW9uUmVwb3J0CisKK0Mgc3R1YiBmdW5jdGlvbiAoZGVmaW5lZCBpbiBzb2FwQ2xpZW50LmNbcHBdKToKK0Bjb2RlCisgIGludCBzb2FwX2NhbGxfX19pbnEyX19maW5kX1VTQ09SRXNlcnZpY2Uoc3RydWN0IHNvYXAgKnNvYXAsCisgICAgTlVMTCwgLy8gY2hhciAqZW5kcG9pbnQgPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBlbmRwb2ludCBmb3IgdGhpcyBvcGVyYXRpb24KKyAgICBOVUxMLCAvLyBjaGFyICphY3Rpb24gPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBhY3Rpb24gZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgLy8gcmVxdWVzdCBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2UqICAgICAgICAgIHVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2VfLAorICAgIC8vIHJlc3BvbnNlIHBhcmFtZXRlcnM6CisgICAgdWRkaTJfX3NlcnZpY2VMaXN0KiAgICAgICAgICAgICAgICAgdWRkaTJfX3NlcnZpY2VMaXN0XworICApOworQGVuZGNvZGUKKworQysrIHByb3h5IGNsYXNzIChkZWZpbmVkIGluIHNvYXBJbnF1aXJlU29hcFByb3h5LmgpOgorICBjbGFzcyBJbnF1aXJlU29hcDsKKworKi8KKworLy9nc29hcCBpbnEyIHNlcnZpY2UgbWV0aG9kLXN0eWxlOglmaW5kX1VTQ09SRXNlcnZpY2UgZG9jdW1lbnQKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1lbmNvZGluZzoJZmluZF9VU0NPUkVzZXJ2aWNlIGxpdGVyYWwKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1hY3Rpb246CWZpbmRfVVNDT1JFc2VydmljZSBmaW5kX3NlcnZpY2UKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1mYXVsdDoJZmluZF9VU0NPUkVzZXJ2aWNlIF9kaXNwb3NpdGlvblJlcG9ydAoraW50IF9faW5xMl9fZmluZF9VU0NPUkVzZXJ2aWNlKAorICAgIHVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2UqICAgICAgICAgIHVkZGkyX19maW5kX1VTQ09SRXNlcnZpY2VfLAorICAgIHVkZGkyX19zZXJ2aWNlTGlzdCogICAgICAgICAgICAgICAgIHVkZGkyX19zZXJ2aWNlTGlzdF8gLy8vPCByZXNwb25zZSBwYXJhbWV0ZXIKKyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBfX2lucTJfX2ZpbmRfVVNDT1JFdE1vZGVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8vLyBPcGVyYXRpb24gIl9faW5xMl9fZmluZF9VU0NPUkV0TW9kZWwiIG9mIHNlcnZpY2UgYmluZGluZyAiSW5xdWlyZVNvYXAiCisKKy8qKgorCitPcGVyYXRpb24gZGV0YWlsczoKKworICAtIFNPQVAgZG9jdW1lbnQvbGl0ZXJhbCBzdHlsZQorICAtIFNPQVAgYWN0aW9uPSJmaW5kX3RNb2RlbCIKKyAgLSBTT0FQIEZhdWx0OiBfZGlzcG9zaXRpb25SZXBvcnQKKworQyBzdHViIGZ1bmN0aW9uIChkZWZpbmVkIGluIHNvYXBDbGllbnQuY1twcF0pOgorQGNvZGUKKyAgaW50IHNvYXBfY2FsbF9fX2lucTJfX2ZpbmRfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwICpzb2FwLAorICAgIE5VTEwsIC8vIGNoYXIgKmVuZHBvaW50ID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgZW5kcG9pbnQgZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgTlVMTCwgLy8gY2hhciAqYWN0aW9uID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgYWN0aW9uIGZvciB0aGlzIG9wZXJhdGlvbgorICAgIC8vIHJlcXVlc3QgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWwqICAgICAgICAgICB1ZGRpMl9fZmluZF9VU0NPUkV0TW9kZWxfLAorICAgIC8vIHJlc3BvbnNlIHBhcmFtZXRlcnM6CisgICAgdWRkaTJfX3RNb2RlbExpc3QqICAgICAgICAgICAgICAgICAgdWRkaTJfX3RNb2RlbExpc3RfCisgICk7CitAZW5kY29kZQorCitDKysgcHJveHkgY2xhc3MgKGRlZmluZWQgaW4gc29hcElucXVpcmVTb2FwUHJveHkuaCk6CisgIGNsYXNzIElucXVpcmVTb2FwOworCisqLworCisvL2dzb2FwIGlucTIgc2VydmljZSBtZXRob2Qtc3R5bGU6CWZpbmRfVVNDT1JFdE1vZGVsIGRvY3VtZW50CisvL2dzb2FwIGlucTIgc2VydmljZSBtZXRob2QtZW5jb2Rpbmc6CWZpbmRfVVNDT1JFdE1vZGVsIGxpdGVyYWwKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1hY3Rpb246CWZpbmRfVVNDT1JFdE1vZGVsIGZpbmRfdE1vZGVsCisvL2dzb2FwIGlucTIgc2VydmljZSBtZXRob2QtZmF1bHQ6CWZpbmRfVVNDT1JFdE1vZGVsIF9kaXNwb3NpdGlvblJlcG9ydAoraW50IF9faW5xMl9fZmluZF9VU0NPUkV0TW9kZWwoCisgICAgdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsKiAgICAgICAgICAgdWRkaTJfX2ZpbmRfVVNDT1JFdE1vZGVsXywKKyAgICB1ZGRpMl9fdE1vZGVsTGlzdCogICAgICAgICAgICAgICAgICB1ZGRpMl9fdE1vZGVsTGlzdF8gLy8vPCByZXNwb25zZSBwYXJhbWV0ZXIKKyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBfX2lucTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8vLyBPcGVyYXRpb24gIl9faW5xMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwiIG9mIHNlcnZpY2UgYmluZGluZyAiSW5xdWlyZVNvYXAiCisKKy8qKgorCitPcGVyYXRpb24gZGV0YWlsczoKKworICAtIFNPQVAgZG9jdW1lbnQvbGl0ZXJhbCBzdHlsZQorICAtIFNPQVAgYWN0aW9uPSJnZXRfYmluZGluZ0RldGFpbCIKKyAgLSBTT0FQIEZhdWx0OiBfZGlzcG9zaXRpb25SZXBvcnQKKworQyBzdHViIGZ1bmN0aW9uIChkZWZpbmVkIGluIHNvYXBDbGllbnQuY1twcF0pOgorQGNvZGUKKyAgaW50IHNvYXBfY2FsbF9fX2lucTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsKHN0cnVjdCBzb2FwICpzb2FwLAorICAgIE5VTEwsIC8vIGNoYXIgKmVuZHBvaW50ID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgZW5kcG9pbnQgZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgTlVMTCwgLy8gY2hhciAqYWN0aW9uID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgYWN0aW9uIGZvciB0aGlzIG9wZXJhdGlvbgorICAgIC8vIHJlcXVlc3QgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwqICAgICB1ZGRpMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWxfLAorICAgIC8vIHJlc3BvbnNlIHBhcmFtZXRlcnM6CisgICAgdWRkaTJfX2JpbmRpbmdEZXRhaWwqICAgICAgICAgICAgICAgdWRkaTJfX2JpbmRpbmdEZXRhaWxfCisgICk7CitAZW5kY29kZQorCitDKysgcHJveHkgY2xhc3MgKGRlZmluZWQgaW4gc29hcElucXVpcmVTb2FwUHJveHkuaCk6CisgIGNsYXNzIElucXVpcmVTb2FwOworCisqLworCisvL2dzb2FwIGlucTIgc2VydmljZSBtZXRob2Qtc3R5bGU6CWdldF9VU0NPUkViaW5kaW5nRGV0YWlsIGRvY3VtZW50CisvL2dzb2FwIGlucTIgc2VydmljZSBtZXRob2QtZW5jb2Rpbmc6CWdldF9VU0NPUkViaW5kaW5nRGV0YWlsIGxpdGVyYWwKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1hY3Rpb246CWdldF9VU0NPUkViaW5kaW5nRGV0YWlsIGdldF9iaW5kaW5nRGV0YWlsCisvL2dzb2FwIGlucTIgc2VydmljZSBtZXRob2QtZmF1bHQ6CWdldF9VU0NPUkViaW5kaW5nRGV0YWlsIF9kaXNwb3NpdGlvblJlcG9ydAoraW50IF9faW5xMl9fZ2V0X1VTQ09SRWJpbmRpbmdEZXRhaWwoCisgICAgdWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsKiAgICAgdWRkaTJfX2dldF9VU0NPUkViaW5kaW5nRGV0YWlsXywKKyAgICB1ZGRpMl9fYmluZGluZ0RldGFpbCogICAgICAgICAgICAgICB1ZGRpMl9fYmluZGluZ0RldGFpbF8gLy8vPCByZXNwb25zZSBwYXJhbWV0ZXIKKyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBfX2lucTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8vLyBPcGVyYXRpb24gIl9faW5xMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsIiBvZiBzZXJ2aWNlIGJpbmRpbmcgIklucXVpcmVTb2FwIgorCisvKioKKworT3BlcmF0aW9uIGRldGFpbHM6CisKKyAgLSBTT0FQIGRvY3VtZW50L2xpdGVyYWwgc3R5bGUKKyAgLSBTT0FQIGFjdGlvbj0iZ2V0X2J1c2luZXNzRGV0YWlsIgorICAtIFNPQVAgRmF1bHQ6IF9kaXNwb3NpdGlvblJlcG9ydAorCitDIHN0dWIgZnVuY3Rpb24gKGRlZmluZWQgaW4gc29hcENsaWVudC5jW3BwXSk6CitAY29kZQorICBpbnQgc29hcF9jYWxsX19faW5xMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsKHN0cnVjdCBzb2FwICpzb2FwLAorICAgIE5VTEwsIC8vIGNoYXIgKmVuZHBvaW50ID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgZW5kcG9pbnQgZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgTlVMTCwgLy8gY2hhciAqYWN0aW9uID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgYWN0aW9uIGZvciB0aGlzIG9wZXJhdGlvbgorICAgIC8vIHJlcXVlc3QgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsKiAgICB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsXywKKyAgICAvLyByZXNwb25zZSBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX19idXNpbmVzc0RldGFpbCogICAgICAgICAgICAgIHVkZGkyX19idXNpbmVzc0RldGFpbF8KKyAgKTsKK0BlbmRjb2RlCisKK0MrKyBwcm94eSBjbGFzcyAoZGVmaW5lZCBpbiBzb2FwSW5xdWlyZVNvYXBQcm94eS5oKToKKyAgY2xhc3MgSW5xdWlyZVNvYXA7CisKKyovCisKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1zdHlsZToJZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsIGRvY3VtZW50CisvL2dzb2FwIGlucTIgc2VydmljZSBtZXRob2QtZW5jb2Rpbmc6CWdldF9VU0NPUkVidXNpbmVzc0RldGFpbCBsaXRlcmFsCisvL2dzb2FwIGlucTIgc2VydmljZSBtZXRob2QtYWN0aW9uOglnZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWwgZ2V0X2J1c2luZXNzRGV0YWlsCisvL2dzb2FwIGlucTIgc2VydmljZSBtZXRob2QtZmF1bHQ6CWdldF9VU0NPUkVidXNpbmVzc0RldGFpbCBfZGlzcG9zaXRpb25SZXBvcnQKK2ludCBfX2lucTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbCgKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsKiAgICB1ZGRpMl9fZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsXywKKyAgICB1ZGRpMl9fYnVzaW5lc3NEZXRhaWwqICAgICAgICAgICAgICB1ZGRpMl9fYnVzaW5lc3NEZXRhaWxfIC8vLzwgcmVzcG9uc2UgcGFyYW1ldGVyCispOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogX19pbnEyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvLy8gT3BlcmF0aW9uICJfX2lucTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dCIgb2Ygc2VydmljZSBiaW5kaW5nICJJbnF1aXJlU29hcCIKKworLyoqCisKK09wZXJhdGlvbiBkZXRhaWxzOgorCisgIC0gU09BUCBkb2N1bWVudC9saXRlcmFsIHN0eWxlCisgIC0gU09BUCBhY3Rpb249ImdldF9idXNpbmVzc0RldGFpbEV4dCIKKyAgLSBTT0FQIEZhdWx0OiBfZGlzcG9zaXRpb25SZXBvcnQKKworQyBzdHViIGZ1bmN0aW9uIChkZWZpbmVkIGluIHNvYXBDbGllbnQuY1twcF0pOgorQGNvZGUKKyAgaW50IHNvYXBfY2FsbF9fX2lucTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dChzdHJ1Y3Qgc29hcCAqc29hcCwKKyAgICBOVUxMLCAvLyBjaGFyICplbmRwb2ludCA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGVuZHBvaW50IGZvciB0aGlzIG9wZXJhdGlvbgorICAgIE5VTEwsIC8vIGNoYXIgKmFjdGlvbiA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGFjdGlvbiBmb3IgdGhpcyBvcGVyYXRpb24KKyAgICAvLyByZXF1ZXN0IHBhcmFtZXRlcnM6CisgICAgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dCogdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dF8sCisgICAgLy8gcmVzcG9uc2UgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHQqICAgICAgICAgICB1ZGRpMl9fYnVzaW5lc3NEZXRhaWxFeHRfCisgICk7CitAZW5kY29kZQorCitDKysgcHJveHkgY2xhc3MgKGRlZmluZWQgaW4gc29hcElucXVpcmVTb2FwUHJveHkuaCk6CisgIGNsYXNzIElucXVpcmVTb2FwOworCisqLworCisvL2dzb2FwIGlucTIgc2VydmljZSBtZXRob2Qtc3R5bGU6CWdldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dCBkb2N1bWVudAorLy9nc29hcCBpbnEyIHNlcnZpY2UgbWV0aG9kLWVuY29kaW5nOglnZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQgbGl0ZXJhbAorLy9nc29hcCBpbnEyIHNlcnZpY2UgbWV0aG9kLWFjdGlvbjoJZ2V0X1VTQ09SRWJ1c2luZXNzRGV0YWlsRXh0IGdldF9idXNpbmVzc0RldGFpbEV4dAorLy9nc29hcCBpbnEyIHNlcnZpY2UgbWV0aG9kLWZhdWx0OglnZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQgX2Rpc3Bvc2l0aW9uUmVwb3J0CitpbnQgX19pbnEyX19nZXRfVVNDT1JFYnVzaW5lc3NEZXRhaWxFeHQoCisgICAgdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dCogdWRkaTJfX2dldF9VU0NPUkVidXNpbmVzc0RldGFpbEV4dF8sCisgICAgdWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0KiAgICAgICAgICAgdWRkaTJfX2J1c2luZXNzRGV0YWlsRXh0XyAvLy88IHJlc3BvbnNlIHBhcmFtZXRlcgorKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIF9faW5xMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLy8vIE9wZXJhdGlvbiAiX19pbnEyX19nZXRfVVNDT1JFc2VydmljZURldGFpbCIgb2Ygc2VydmljZSBiaW5kaW5nICJJbnF1aXJlU29hcCIKKworLyoqCisKK09wZXJhdGlvbiBkZXRhaWxzOgorCisgIC0gU09BUCBkb2N1bWVudC9saXRlcmFsIHN0eWxlCisgIC0gU09BUCBhY3Rpb249ImdldF9zZXJ2aWNlRGV0YWlsIgorICAtIFNPQVAgRmF1bHQ6IF9kaXNwb3NpdGlvblJlcG9ydAorCitDIHN0dWIgZnVuY3Rpb24gKGRlZmluZWQgaW4gc29hcENsaWVudC5jW3BwXSk6CitAY29kZQorICBpbnQgc29hcF9jYWxsX19faW5xMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwoc3RydWN0IHNvYXAgKnNvYXAsCisgICAgTlVMTCwgLy8gY2hhciAqZW5kcG9pbnQgPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBlbmRwb2ludCBmb3IgdGhpcyBvcGVyYXRpb24KKyAgICBOVUxMLCAvLyBjaGFyICphY3Rpb24gPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBhY3Rpb24gZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgLy8gcmVxdWVzdCBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbCogICAgIHVkZGkyX19nZXRfVVNDT1JFc2VydmljZURldGFpbF8sCisgICAgLy8gcmVzcG9uc2UgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fc2VydmljZURldGFpbCogICAgICAgICAgICAgICB1ZGRpMl9fc2VydmljZURldGFpbF8KKyAgKTsKK0BlbmRjb2RlCisKK0MrKyBwcm94eSBjbGFzcyAoZGVmaW5lZCBpbiBzb2FwSW5xdWlyZVNvYXBQcm94eS5oKToKKyAgY2xhc3MgSW5xdWlyZVNvYXA7CisKKyovCisKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1zdHlsZToJZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwgZG9jdW1lbnQKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1lbmNvZGluZzoJZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwgbGl0ZXJhbAorLy9nc29hcCBpbnEyIHNlcnZpY2UgbWV0aG9kLWFjdGlvbjoJZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwgZ2V0X3NlcnZpY2VEZXRhaWwKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1mYXVsdDoJZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwgX2Rpc3Bvc2l0aW9uUmVwb3J0CitpbnQgX19pbnEyX19nZXRfVVNDT1JFc2VydmljZURldGFpbCgKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWwqICAgICB1ZGRpMl9fZ2V0X1VTQ09SRXNlcnZpY2VEZXRhaWxfLAorICAgIHVkZGkyX19zZXJ2aWNlRGV0YWlsKiAgICAgICAgICAgICAgIHVkZGkyX19zZXJ2aWNlRGV0YWlsXyAvLy88IHJlc3BvbnNlIHBhcmFtZXRlcgorKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIF9faW5xMl9fZ2V0X1VTQ09SRXRNb2RlbERldGFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLy8vIE9wZXJhdGlvbiAiX19pbnEyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsIiBvZiBzZXJ2aWNlIGJpbmRpbmcgIklucXVpcmVTb2FwIgorCisvKioKKworT3BlcmF0aW9uIGRldGFpbHM6CisKKyAgLSBTT0FQIGRvY3VtZW50L2xpdGVyYWwgc3R5bGUKKyAgLSBTT0FQIGFjdGlvbj0iZ2V0X3RNb2RlbERldGFpbCIKKyAgLSBTT0FQIEZhdWx0OiBfZGlzcG9zaXRpb25SZXBvcnQKKworQyBzdHViIGZ1bmN0aW9uIChkZWZpbmVkIGluIHNvYXBDbGllbnQuY1twcF0pOgorQGNvZGUKKyAgaW50IHNvYXBfY2FsbF9fX2lucTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwoc3RydWN0IHNvYXAgKnNvYXAsCisgICAgTlVMTCwgLy8gY2hhciAqZW5kcG9pbnQgPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBlbmRwb2ludCBmb3IgdGhpcyBvcGVyYXRpb24KKyAgICBOVUxMLCAvLyBjaGFyICphY3Rpb24gPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBhY3Rpb24gZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgLy8gcmVxdWVzdCBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsKiAgICAgIHVkZGkyX19nZXRfVVNDT1JFdE1vZGVsRGV0YWlsXywKKyAgICAvLyByZXNwb25zZSBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX190TW9kZWxEZXRhaWwqICAgICAgICAgICAgICAgIHVkZGkyX190TW9kZWxEZXRhaWxfCisgICk7CitAZW5kY29kZQorCitDKysgcHJveHkgY2xhc3MgKGRlZmluZWQgaW4gc29hcElucXVpcmVTb2FwUHJveHkuaCk6CisgIGNsYXNzIElucXVpcmVTb2FwOworCisqLworCisvL2dzb2FwIGlucTIgc2VydmljZSBtZXRob2Qtc3R5bGU6CWdldF9VU0NPUkV0TW9kZWxEZXRhaWwgZG9jdW1lbnQKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1lbmNvZGluZzoJZ2V0X1VTQ09SRXRNb2RlbERldGFpbCBsaXRlcmFsCisvL2dzb2FwIGlucTIgc2VydmljZSBtZXRob2QtYWN0aW9uOglnZXRfVVNDT1JFdE1vZGVsRGV0YWlsIGdldF90TW9kZWxEZXRhaWwKKy8vZ3NvYXAgaW5xMiBzZXJ2aWNlIG1ldGhvZC1mYXVsdDoJZ2V0X1VTQ09SRXRNb2RlbERldGFpbCBfZGlzcG9zaXRpb25SZXBvcnQKK2ludCBfX2lucTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwoCisgICAgdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWwqICAgICAgdWRkaTJfX2dldF9VU0NPUkV0TW9kZWxEZXRhaWxfLAorICAgIHVkZGkyX190TW9kZWxEZXRhaWwqICAgICAgICAgICAgICAgIHVkZGkyX190TW9kZWxEZXRhaWxfIC8vLzwgcmVzcG9uc2UgcGFyYW1ldGVyCispOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogUHVibGlzaFNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogX19wdWIyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvLy8gT3BlcmF0aW9uICJfX3B1YjJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zIiBvZiBzZXJ2aWNlIGJpbmRpbmcgIlB1Ymxpc2hTb2FwIgorCisvKioKKworT3BlcmF0aW9uIGRldGFpbHM6CisKKyAgLSBTT0FQIGRvY3VtZW50L2xpdGVyYWwgc3R5bGUKKyAgLSBTT0FQIGFjdGlvbj0iYWRkX3B1Ymxpc2hlckFzc2VydGlvbnMiCisgIC0gU09BUCBGYXVsdDogX2Rpc3Bvc2l0aW9uUmVwb3J0CisKK0Mgc3R1YiBmdW5jdGlvbiAoZGVmaW5lZCBpbiBzb2FwQ2xpZW50LmNbcHBdKToKK0Bjb2RlCisgIGludCBzb2FwX2NhbGxfX19wdWIyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwKKyAgICBOVUxMLCAvLyBjaGFyICplbmRwb2ludCA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGVuZHBvaW50IGZvciB0aGlzIG9wZXJhdGlvbgorICAgIE5VTEwsIC8vIGNoYXIgKmFjdGlvbiA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGFjdGlvbiBmb3IgdGhpcyBvcGVyYXRpb24KKyAgICAvLyByZXF1ZXN0IHBhcmFtZXRlcnM6CisgICAgdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKiB1ZGRpMl9fYWRkX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnNfLAorICAgIC8vIHJlc3BvbnNlIHBhcmFtZXRlcnM6CisgICAgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0KiAgICAgICAgICAgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0XworICApOworQGVuZGNvZGUKKworQysrIHByb3h5IGNsYXNzIChkZWZpbmVkIGluIHNvYXBQdWJsaXNoU29hcFByb3h5LmgpOgorICBjbGFzcyBQdWJsaXNoU29hcDsKKworKi8KKworLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLXN0eWxlOglhZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyBkb2N1bWVudAorLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWVuY29kaW5nOglhZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyBsaXRlcmFsCisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2QtYWN0aW9uOglhZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyBhZGRfcHVibGlzaGVyQXNzZXJ0aW9ucworLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWZhdWx0OglhZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyBfZGlzcG9zaXRpb25SZXBvcnQKK2ludCBfX3B1YjJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKAorICAgIHVkZGkyX19hZGRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyogdWRkaTJfX2FkZF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zXywKKyAgICB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQqICAgICAgICAgICB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnRfIC8vLzwgcmVzcG9uc2UgcGFyYW1ldGVyCispOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogX19wdWIyX19kZWxldGVfVVNDT1JFYmluZGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvLy8gT3BlcmF0aW9uICJfX3B1YjJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nIiBvZiBzZXJ2aWNlIGJpbmRpbmcgIlB1Ymxpc2hTb2FwIgorCisvKioKKworT3BlcmF0aW9uIGRldGFpbHM6CisKKyAgLSBTT0FQIGRvY3VtZW50L2xpdGVyYWwgc3R5bGUKKyAgLSBTT0FQIGFjdGlvbj0iZGVsZXRlX2JpbmRpbmciCisgIC0gU09BUCBGYXVsdDogX2Rpc3Bvc2l0aW9uUmVwb3J0CisKK0Mgc3R1YiBmdW5jdGlvbiAoZGVmaW5lZCBpbiBzb2FwQ2xpZW50LmNbcHBdKToKK0Bjb2RlCisgIGludCBzb2FwX2NhbGxfX19wdWIyX19kZWxldGVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCAqc29hcCwKKyAgICBOVUxMLCAvLyBjaGFyICplbmRwb2ludCA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGVuZHBvaW50IGZvciB0aGlzIG9wZXJhdGlvbgorICAgIE5VTEwsIC8vIGNoYXIgKmFjdGlvbiA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGFjdGlvbiBmb3IgdGhpcyBvcGVyYXRpb24KKyAgICAvLyByZXF1ZXN0IHBhcmFtZXRlcnM6CisgICAgdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nKiAgICAgICAgdWRkaTJfX2RlbGV0ZV9VU0NPUkViaW5kaW5nXywKKyAgICAvLyByZXNwb25zZSBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCogICAgICAgICAgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydF8KKyAgKTsKK0BlbmRjb2RlCisKK0MrKyBwcm94eSBjbGFzcyAoZGVmaW5lZCBpbiBzb2FwUHVibGlzaFNvYXBQcm94eS5oKToKKyAgY2xhc3MgUHVibGlzaFNvYXA7CisKKyovCisKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1zdHlsZToJZGVsZXRlX1VTQ09SRWJpbmRpbmcgZG9jdW1lbnQKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1lbmNvZGluZzoJZGVsZXRlX1VTQ09SRWJpbmRpbmcgbGl0ZXJhbAorLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWFjdGlvbjoJZGVsZXRlX1VTQ09SRWJpbmRpbmcgZGVsZXRlX2JpbmRpbmcKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1mYXVsdDoJZGVsZXRlX1VTQ09SRWJpbmRpbmcgX2Rpc3Bvc2l0aW9uUmVwb3J0CitpbnQgX19wdWIyX19kZWxldGVfVVNDT1JFYmluZGluZygKKyAgICB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmcqICAgICAgICB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJpbmRpbmdfLAorICAgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCogICAgICAgICAgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydF8gLy8vPCByZXNwb25zZSBwYXJhbWV0ZXIKKyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBfX3B1YjJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8vLyBPcGVyYXRpb24gIl9fcHViMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzIiBvZiBzZXJ2aWNlIGJpbmRpbmcgIlB1Ymxpc2hTb2FwIgorCisvKioKKworT3BlcmF0aW9uIGRldGFpbHM6CisKKyAgLSBTT0FQIGRvY3VtZW50L2xpdGVyYWwgc3R5bGUKKyAgLSBTT0FQIGFjdGlvbj0iZGVsZXRlX2J1c2luZXNzIgorICAtIFNPQVAgRmF1bHQ6IF9kaXNwb3NpdGlvblJlcG9ydAorCitDIHN0dWIgZnVuY3Rpb24gKGRlZmluZWQgaW4gc29hcENsaWVudC5jW3BwXSk6CitAY29kZQorICBpbnQgc29hcF9jYWxsX19fcHViMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwICpzb2FwLAorICAgIE5VTEwsIC8vIGNoYXIgKmVuZHBvaW50ID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgZW5kcG9pbnQgZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgTlVMTCwgLy8gY2hhciAqYWN0aW9uID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgYWN0aW9uIGZvciB0aGlzIG9wZXJhdGlvbgorICAgIC8vIHJlcXVlc3QgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzKiAgICAgICB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzXywKKyAgICAvLyByZXNwb25zZSBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCogICAgICAgICAgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydF8KKyAgKTsKK0BlbmRjb2RlCisKK0MrKyBwcm94eSBjbGFzcyAoZGVmaW5lZCBpbiBzb2FwUHVibGlzaFNvYXBQcm94eS5oKToKKyAgY2xhc3MgUHVibGlzaFNvYXA7CisKKyovCisKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1zdHlsZToJZGVsZXRlX1VTQ09SRWJ1c2luZXNzIGRvY3VtZW50CisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2QtZW5jb2Rpbmc6CWRlbGV0ZV9VU0NPUkVidXNpbmVzcyBsaXRlcmFsCisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2QtYWN0aW9uOglkZWxldGVfVVNDT1JFYnVzaW5lc3MgZGVsZXRlX2J1c2luZXNzCisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2QtZmF1bHQ6CWRlbGV0ZV9VU0NPUkVidXNpbmVzcyBfZGlzcG9zaXRpb25SZXBvcnQKK2ludCBfX3B1YjJfX2RlbGV0ZV9VU0NPUkVidXNpbmVzcygKKyAgICB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzKiAgICAgICB1ZGRpMl9fZGVsZXRlX1VTQ09SRWJ1c2luZXNzXywKKyAgICB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQqICAgICAgICAgICB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnRfIC8vLzwgcmVzcG9uc2UgcGFyYW1ldGVyCispOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogX19wdWIyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvLy8gT3BlcmF0aW9uICJfX3B1YjJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zIiBvZiBzZXJ2aWNlIGJpbmRpbmcgIlB1Ymxpc2hTb2FwIgorCisvKioKKworT3BlcmF0aW9uIGRldGFpbHM6CisKKyAgLSBTT0FQIGRvY3VtZW50L2xpdGVyYWwgc3R5bGUKKyAgLSBTT0FQIGFjdGlvbj0iZGVsZXRlX3B1Ymxpc2hlckFzc2VydGlvbnMiCisgIC0gU09BUCBGYXVsdDogX2Rpc3Bvc2l0aW9uUmVwb3J0CisKK0Mgc3R1YiBmdW5jdGlvbiAoZGVmaW5lZCBpbiBzb2FwQ2xpZW50LmNbcHBdKToKK0Bjb2RlCisgIGludCBzb2FwX2NhbGxfX19wdWIyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyhzdHJ1Y3Qgc29hcCAqc29hcCwKKyAgICBOVUxMLCAvLyBjaGFyICplbmRwb2ludCA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGVuZHBvaW50IGZvciB0aGlzIG9wZXJhdGlvbgorICAgIE5VTEwsIC8vIGNoYXIgKmFjdGlvbiA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGFjdGlvbiBmb3IgdGhpcyBvcGVyYXRpb24KKyAgICAvLyByZXF1ZXN0IHBhcmFtZXRlcnM6CisgICAgdWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKiB1ZGRpMl9fZGVsZXRlX1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnNfLAorICAgIC8vIHJlc3BvbnNlIHBhcmFtZXRlcnM6CisgICAgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0KiAgICAgICAgICAgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0XworICApOworQGVuZGNvZGUKKworQysrIHByb3h5IGNsYXNzIChkZWZpbmVkIGluIHNvYXBQdWJsaXNoU29hcFByb3h5LmgpOgorICBjbGFzcyBQdWJsaXNoU29hcDsKKworKi8KKworLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLXN0eWxlOglkZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyBkb2N1bWVudAorLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWVuY29kaW5nOglkZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyBsaXRlcmFsCisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2QtYWN0aW9uOglkZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyBkZWxldGVfcHVibGlzaGVyQXNzZXJ0aW9ucworLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWZhdWx0OglkZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyBfZGlzcG9zaXRpb25SZXBvcnQKK2ludCBfX3B1YjJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKAorICAgIHVkZGkyX19kZWxldGVfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyogdWRkaTJfX2RlbGV0ZV9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zXywKKyAgICB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQqICAgICAgICAgICB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnRfIC8vLzwgcmVzcG9uc2UgcGFyYW1ldGVyCispOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogX19wdWIyX19kZWxldGVfVVNDT1JFc2VydmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvLy8gT3BlcmF0aW9uICJfX3B1YjJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlIiBvZiBzZXJ2aWNlIGJpbmRpbmcgIlB1Ymxpc2hTb2FwIgorCisvKioKKworT3BlcmF0aW9uIGRldGFpbHM6CisKKyAgLSBTT0FQIGRvY3VtZW50L2xpdGVyYWwgc3R5bGUKKyAgLSBTT0FQIGFjdGlvbj0iZGVsZXRlX3NlcnZpY2UiCisgIC0gU09BUCBGYXVsdDogX2Rpc3Bvc2l0aW9uUmVwb3J0CisKK0Mgc3R1YiBmdW5jdGlvbiAoZGVmaW5lZCBpbiBzb2FwQ2xpZW50LmNbcHBdKToKK0Bjb2RlCisgIGludCBzb2FwX2NhbGxfX19wdWIyX19kZWxldGVfVVNDT1JFc2VydmljZShzdHJ1Y3Qgc29hcCAqc29hcCwKKyAgICBOVUxMLCAvLyBjaGFyICplbmRwb2ludCA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGVuZHBvaW50IGZvciB0aGlzIG9wZXJhdGlvbgorICAgIE5VTEwsIC8vIGNoYXIgKmFjdGlvbiA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGFjdGlvbiBmb3IgdGhpcyBvcGVyYXRpb24KKyAgICAvLyByZXF1ZXN0IHBhcmFtZXRlcnM6CisgICAgdWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlKiAgICAgICAgdWRkaTJfX2RlbGV0ZV9VU0NPUkVzZXJ2aWNlXywKKyAgICAvLyByZXNwb25zZSBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCogICAgICAgICAgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydF8KKyAgKTsKK0BlbmRjb2RlCisKK0MrKyBwcm94eSBjbGFzcyAoZGVmaW5lZCBpbiBzb2FwUHVibGlzaFNvYXBQcm94eS5oKToKKyAgY2xhc3MgUHVibGlzaFNvYXA7CisKKyovCisKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1zdHlsZToJZGVsZXRlX1VTQ09SRXNlcnZpY2UgZG9jdW1lbnQKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1lbmNvZGluZzoJZGVsZXRlX1VTQ09SRXNlcnZpY2UgbGl0ZXJhbAorLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWFjdGlvbjoJZGVsZXRlX1VTQ09SRXNlcnZpY2UgZGVsZXRlX3NlcnZpY2UKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1mYXVsdDoJZGVsZXRlX1VTQ09SRXNlcnZpY2UgX2Rpc3Bvc2l0aW9uUmVwb3J0CitpbnQgX19wdWIyX19kZWxldGVfVVNDT1JFc2VydmljZSgKKyAgICB1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2UqICAgICAgICB1ZGRpMl9fZGVsZXRlX1VTQ09SRXNlcnZpY2VfLAorICAgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCogICAgICAgICAgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydF8gLy8vPCByZXNwb25zZSBwYXJhbWV0ZXIKKyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBfX3B1YjJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8vLyBPcGVyYXRpb24gIl9fcHViMl9fZGVsZXRlX1VTQ09SRXRNb2RlbCIgb2Ygc2VydmljZSBiaW5kaW5nICJQdWJsaXNoU29hcCIKKworLyoqCisKK09wZXJhdGlvbiBkZXRhaWxzOgorCisgIC0gU09BUCBkb2N1bWVudC9saXRlcmFsIHN0eWxlCisgIC0gU09BUCBhY3Rpb249ImRlbGV0ZV90TW9kZWwiCisgIC0gU09BUCBGYXVsdDogX2Rpc3Bvc2l0aW9uUmVwb3J0CisKK0Mgc3R1YiBmdW5jdGlvbiAoZGVmaW5lZCBpbiBzb2FwQ2xpZW50LmNbcHBdKToKK0Bjb2RlCisgIGludCBzb2FwX2NhbGxfX19wdWIyX19kZWxldGVfVVNDT1JFdE1vZGVsKHN0cnVjdCBzb2FwICpzb2FwLAorICAgIE5VTEwsIC8vIGNoYXIgKmVuZHBvaW50ID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgZW5kcG9pbnQgZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgTlVMTCwgLy8gY2hhciAqYWN0aW9uID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgYWN0aW9uIGZvciB0aGlzIG9wZXJhdGlvbgorICAgIC8vIHJlcXVlc3QgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbCogICAgICAgICB1ZGRpMl9fZGVsZXRlX1VTQ09SRXRNb2RlbF8sCisgICAgLy8gcmVzcG9uc2UgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnQqICAgICAgICAgICB1ZGRpMl9fZGlzcG9zaXRpb25SZXBvcnRfCisgICk7CitAZW5kY29kZQorCitDKysgcHJveHkgY2xhc3MgKGRlZmluZWQgaW4gc29hcFB1Ymxpc2hTb2FwUHJveHkuaCk6CisgIGNsYXNzIFB1Ymxpc2hTb2FwOworCisqLworCisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2Qtc3R5bGU6CWRlbGV0ZV9VU0NPUkV0TW9kZWwgZG9jdW1lbnQKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1lbmNvZGluZzoJZGVsZXRlX1VTQ09SRXRNb2RlbCBsaXRlcmFsCisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2QtYWN0aW9uOglkZWxldGVfVVNDT1JFdE1vZGVsIGRlbGV0ZV90TW9kZWwKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1mYXVsdDoJZGVsZXRlX1VTQ09SRXRNb2RlbCBfZGlzcG9zaXRpb25SZXBvcnQKK2ludCBfX3B1YjJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwoCisgICAgdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWwqICAgICAgICAgdWRkaTJfX2RlbGV0ZV9VU0NPUkV0TW9kZWxfLAorICAgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydCogICAgICAgICAgIHVkZGkyX19kaXNwb3NpdGlvblJlcG9ydF8gLy8vPCByZXNwb25zZSBwYXJhbWV0ZXIKKyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBfX3B1YjJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8vLyBPcGVyYXRpb24gIl9fcHViMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4iIG9mIHNlcnZpY2UgYmluZGluZyAiUHVibGlzaFNvYXAiCisKKy8qKgorCitPcGVyYXRpb24gZGV0YWlsczoKKworICAtIFNPQVAgZG9jdW1lbnQvbGl0ZXJhbCBzdHlsZQorICAtIFNPQVAgYWN0aW9uPSJkaXNjYXJkX2F1dGhUb2tlbiIKKyAgLSBTT0FQIEZhdWx0OiBfZGlzcG9zaXRpb25SZXBvcnQKKworQyBzdHViIGZ1bmN0aW9uIChkZWZpbmVkIGluIHNvYXBDbGllbnQuY1twcF0pOgorQGNvZGUKKyAgaW50IHNvYXBfY2FsbF9fX3B1YjJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwICpzb2FwLAorICAgIE5VTEwsIC8vIGNoYXIgKmVuZHBvaW50ID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgZW5kcG9pbnQgZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgTlVMTCwgLy8gY2hhciAqYWN0aW9uID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgYWN0aW9uIGZvciB0aGlzIG9wZXJhdGlvbgorICAgIC8vIHJlcXVlc3QgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW4qICAgICB1ZGRpMl9fZGlzY2FyZF9VU0NPUkVhdXRoVG9rZW5fLAorICAgIC8vIHJlc3BvbnNlIHBhcmFtZXRlcnM6CisgICAgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0KiAgICAgICAgICAgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0XworICApOworQGVuZGNvZGUKKworQysrIHByb3h5IGNsYXNzIChkZWZpbmVkIGluIHNvYXBQdWJsaXNoU29hcFByb3h5LmgpOgorICBjbGFzcyBQdWJsaXNoU29hcDsKKworKi8KKworLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLXN0eWxlOglkaXNjYXJkX1VTQ09SRWF1dGhUb2tlbiBkb2N1bWVudAorLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWVuY29kaW5nOglkaXNjYXJkX1VTQ09SRWF1dGhUb2tlbiBsaXRlcmFsCisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2QtYWN0aW9uOglkaXNjYXJkX1VTQ09SRWF1dGhUb2tlbiBkaXNjYXJkX2F1dGhUb2tlbgorLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWZhdWx0OglkaXNjYXJkX1VTQ09SRWF1dGhUb2tlbiBfZGlzcG9zaXRpb25SZXBvcnQKK2ludCBfX3B1YjJfX2Rpc2NhcmRfVVNDT1JFYXV0aFRva2VuKAorICAgIHVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbiogICAgIHVkZGkyX19kaXNjYXJkX1VTQ09SRWF1dGhUb2tlbl8sCisgICAgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0KiAgICAgICAgICAgdWRkaTJfX2Rpc3Bvc2l0aW9uUmVwb3J0XyAvLy88IHJlc3BvbnNlIHBhcmFtZXRlcgorKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIF9fcHViMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLy8vIE9wZXJhdGlvbiAiX19wdWIyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0IiBvZiBzZXJ2aWNlIGJpbmRpbmcgIlB1Ymxpc2hTb2FwIgorCisvKioKKworT3BlcmF0aW9uIGRldGFpbHM6CisKKyAgLSBTT0FQIGRvY3VtZW50L2xpdGVyYWwgc3R5bGUKKyAgLSBTT0FQIGFjdGlvbj0iZ2V0X2Fzc2VydGlvblN0YXR1c1JlcG9ydCIKKyAgLSBTT0FQIEZhdWx0OiBfZGlzcG9zaXRpb25SZXBvcnQKKworQyBzdHViIGZ1bmN0aW9uIChkZWZpbmVkIGluIHNvYXBDbGllbnQuY1twcF0pOgorQGNvZGUKKyAgaW50IHNvYXBfY2FsbF9fX3B1YjJfX2dldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQoc3RydWN0IHNvYXAgKnNvYXAsCisgICAgTlVMTCwgLy8gY2hhciAqZW5kcG9pbnQgPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBlbmRwb2ludCBmb3IgdGhpcyBvcGVyYXRpb24KKyAgICBOVUxMLCAvLyBjaGFyICphY3Rpb24gPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBhY3Rpb24gZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgLy8gcmVxdWVzdCBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KiB1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydF8sCisgICAgLy8gcmVzcG9uc2UgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KiAgICAgICB1ZGRpMl9fYXNzZXJ0aW9uU3RhdHVzUmVwb3J0XworICApOworQGVuZGNvZGUKKworQysrIHByb3h5IGNsYXNzIChkZWZpbmVkIGluIHNvYXBQdWJsaXNoU29hcFByb3h5LmgpOgorICBjbGFzcyBQdWJsaXNoU29hcDsKKworKi8KKworLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLXN0eWxlOglnZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0IGRvY3VtZW50CisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2QtZW5jb2Rpbmc6CWdldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQgbGl0ZXJhbAorLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWFjdGlvbjoJZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydCBnZXRfYXNzZXJ0aW9uU3RhdHVzUmVwb3J0CisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2QtZmF1bHQ6CWdldF9VU0NPUkVhc3NlcnRpb25TdGF0dXNSZXBvcnQgX2Rpc3Bvc2l0aW9uUmVwb3J0CitpbnQgX19wdWIyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KAorICAgIHVkZGkyX19nZXRfVVNDT1JFYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KiB1ZGRpMl9fZ2V0X1VTQ09SRWFzc2VydGlvblN0YXR1c1JlcG9ydF8sCisgICAgdWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydCogICAgICAgdWRkaTJfX2Fzc2VydGlvblN0YXR1c1JlcG9ydF8gLy8vPCByZXNwb25zZSBwYXJhbWV0ZXIKKyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBfX3B1YjJfX2dldF9VU0NPUkVhdXRoVG9rZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8vLyBPcGVyYXRpb24gIl9fcHViMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbiIgb2Ygc2VydmljZSBiaW5kaW5nICJQdWJsaXNoU29hcCIKKworLyoqCisKK09wZXJhdGlvbiBkZXRhaWxzOgorCisgIC0gU09BUCBkb2N1bWVudC9saXRlcmFsIHN0eWxlCisgIC0gU09BUCBhY3Rpb249ImdldF9hdXRoVG9rZW4iCisgIC0gU09BUCBGYXVsdDogX2Rpc3Bvc2l0aW9uUmVwb3J0CisKK0Mgc3R1YiBmdW5jdGlvbiAoZGVmaW5lZCBpbiBzb2FwQ2xpZW50LmNbcHBdKToKK0Bjb2RlCisgIGludCBzb2FwX2NhbGxfX19wdWIyX19nZXRfVVNDT1JFYXV0aFRva2VuKHN0cnVjdCBzb2FwICpzb2FwLAorICAgIE5VTEwsIC8vIGNoYXIgKmVuZHBvaW50ID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgZW5kcG9pbnQgZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgTlVMTCwgLy8gY2hhciAqYWN0aW9uID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgYWN0aW9uIGZvciB0aGlzIG9wZXJhdGlvbgorICAgIC8vIHJlcXVlc3QgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbiogICAgICAgICB1ZGRpMl9fZ2V0X1VTQ09SRWF1dGhUb2tlbl8sCisgICAgLy8gcmVzcG9uc2UgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fYXV0aFRva2VuKiAgICAgICAgICAgICAgICAgICB1ZGRpMl9fYXV0aFRva2VuXworICApOworQGVuZGNvZGUKKworQysrIHByb3h5IGNsYXNzIChkZWZpbmVkIGluIHNvYXBQdWJsaXNoU29hcFByb3h5LmgpOgorICBjbGFzcyBQdWJsaXNoU29hcDsKKworKi8KKworLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLXN0eWxlOglnZXRfVVNDT1JFYXV0aFRva2VuIGRvY3VtZW50CisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2QtZW5jb2Rpbmc6CWdldF9VU0NPUkVhdXRoVG9rZW4gbGl0ZXJhbAorLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWFjdGlvbjoJZ2V0X1VTQ09SRWF1dGhUb2tlbiBnZXRfYXV0aFRva2VuCisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2QtZmF1bHQ6CWdldF9VU0NPUkVhdXRoVG9rZW4gX2Rpc3Bvc2l0aW9uUmVwb3J0CitpbnQgX19wdWIyX19nZXRfVVNDT1JFYXV0aFRva2VuKAorICAgIHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuKiAgICAgICAgIHVkZGkyX19nZXRfVVNDT1JFYXV0aFRva2VuXywKKyAgICB1ZGRpMl9fYXV0aFRva2VuKiAgICAgICAgICAgICAgICAgICB1ZGRpMl9fYXV0aFRva2VuXyAvLy88IHJlc3BvbnNlIHBhcmFtZXRlcgorKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIF9fcHViMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLy8vIE9wZXJhdGlvbiAiX19wdWIyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyIgb2Ygc2VydmljZSBiaW5kaW5nICJQdWJsaXNoU29hcCIKKworLyoqCisKK09wZXJhdGlvbiBkZXRhaWxzOgorCisgIC0gU09BUCBkb2N1bWVudC9saXRlcmFsIHN0eWxlCisgIC0gU09BUCBhY3Rpb249ImdldF9wdWJsaXNoZXJBc3NlcnRpb25zIgorICAtIFNPQVAgRmF1bHQ6IF9kaXNwb3NpdGlvblJlcG9ydAorCitDIHN0dWIgZnVuY3Rpb24gKGRlZmluZWQgaW4gc29hcENsaWVudC5jW3BwXSk6CitAY29kZQorICBpbnQgc29hcF9jYWxsX19fcHViMl9fZ2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMoc3RydWN0IHNvYXAgKnNvYXAsCisgICAgTlVMTCwgLy8gY2hhciAqZW5kcG9pbnQgPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBlbmRwb2ludCBmb3IgdGhpcyBvcGVyYXRpb24KKyAgICBOVUxMLCAvLyBjaGFyICphY3Rpb24gPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBhY3Rpb24gZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgLy8gcmVxdWVzdCBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyogdWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zXywKKyAgICAvLyByZXNwb25zZSBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zKiAgICAgICAgIHVkZGkyX19wdWJsaXNoZXJBc3NlcnRpb25zXworICApOworQGVuZGNvZGUKKworQysrIHByb3h5IGNsYXNzIChkZWZpbmVkIGluIHNvYXBQdWJsaXNoU29hcFByb3h5LmgpOgorICBjbGFzcyBQdWJsaXNoU29hcDsKKworKi8KKworLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLXN0eWxlOglnZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyBkb2N1bWVudAorLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWVuY29kaW5nOglnZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyBsaXRlcmFsCisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2QtYWN0aW9uOglnZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyBnZXRfcHVibGlzaGVyQXNzZXJ0aW9ucworLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWZhdWx0OglnZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyBfZGlzcG9zaXRpb25SZXBvcnQKK2ludCBfX3B1YjJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKAorICAgIHVkZGkyX19nZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucyogdWRkaTJfX2dldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zXywKKyAgICB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9ucyogICAgICAgICB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uc18gLy8vPCByZXNwb25zZSBwYXJhbWV0ZXIKKyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBfX3B1YjJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8vLyBPcGVyYXRpb24gIl9fcHViMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvIiBvZiBzZXJ2aWNlIGJpbmRpbmcgIlB1Ymxpc2hTb2FwIgorCisvKioKKworT3BlcmF0aW9uIGRldGFpbHM6CisKKyAgLSBTT0FQIGRvY3VtZW50L2xpdGVyYWwgc3R5bGUKKyAgLSBTT0FQIGFjdGlvbj0iZ2V0X3JlZ2lzdGVyZWRJbmZvIgorICAtIFNPQVAgRmF1bHQ6IF9kaXNwb3NpdGlvblJlcG9ydAorCitDIHN0dWIgZnVuY3Rpb24gKGRlZmluZWQgaW4gc29hcENsaWVudC5jW3BwXSk6CitAY29kZQorICBpbnQgc29hcF9jYWxsX19fcHViMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvKHN0cnVjdCBzb2FwICpzb2FwLAorICAgIE5VTEwsIC8vIGNoYXIgKmVuZHBvaW50ID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgZW5kcG9pbnQgZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgTlVMTCwgLy8gY2hhciAqYWN0aW9uID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgYWN0aW9uIGZvciB0aGlzIG9wZXJhdGlvbgorICAgIC8vIHJlcXVlc3QgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvKiAgICB1ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvXywKKyAgICAvLyByZXNwb25zZSBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX19yZWdpc3RlcmVkSW5mbyogICAgICAgICAgICAgIHVkZGkyX19yZWdpc3RlcmVkSW5mb18KKyAgKTsKK0BlbmRjb2RlCisKK0MrKyBwcm94eSBjbGFzcyAoZGVmaW5lZCBpbiBzb2FwUHVibGlzaFNvYXBQcm94eS5oKToKKyAgY2xhc3MgUHVibGlzaFNvYXA7CisKKyovCisKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1zdHlsZToJZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvIGRvY3VtZW50CisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2QtZW5jb2Rpbmc6CWdldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyBsaXRlcmFsCisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2QtYWN0aW9uOglnZXRfVVNDT1JFcmVnaXN0ZXJlZEluZm8gZ2V0X3JlZ2lzdGVyZWRJbmZvCisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2QtZmF1bHQ6CWdldF9VU0NPUkVyZWdpc3RlcmVkSW5mbyBfZGlzcG9zaXRpb25SZXBvcnQKK2ludCBfX3B1YjJfX2dldF9VU0NPUkVyZWdpc3RlcmVkSW5mbygKKyAgICB1ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvKiAgICB1ZGRpMl9fZ2V0X1VTQ09SRXJlZ2lzdGVyZWRJbmZvXywKKyAgICB1ZGRpMl9fcmVnaXN0ZXJlZEluZm8qICAgICAgICAgICAgICB1ZGRpMl9fcmVnaXN0ZXJlZEluZm9fIC8vLzwgcmVzcG9uc2UgcGFyYW1ldGVyCispOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogX19wdWIyX19zYXZlX1VTQ09SRWJpbmRpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvLy8gT3BlcmF0aW9uICJfX3B1YjJfX3NhdmVfVVNDT1JFYmluZGluZyIgb2Ygc2VydmljZSBiaW5kaW5nICJQdWJsaXNoU29hcCIKKworLyoqCisKK09wZXJhdGlvbiBkZXRhaWxzOgorCisgIC0gU09BUCBkb2N1bWVudC9saXRlcmFsIHN0eWxlCisgIC0gU09BUCBhY3Rpb249InNhdmVfYmluZGluZyIKKyAgLSBTT0FQIEZhdWx0OiBfZGlzcG9zaXRpb25SZXBvcnQKKworQyBzdHViIGZ1bmN0aW9uIChkZWZpbmVkIGluIHNvYXBDbGllbnQuY1twcF0pOgorQGNvZGUKKyAgaW50IHNvYXBfY2FsbF9fX3B1YjJfX3NhdmVfVVNDT1JFYmluZGluZyhzdHJ1Y3Qgc29hcCAqc29hcCwKKyAgICBOVUxMLCAvLyBjaGFyICplbmRwb2ludCA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGVuZHBvaW50IGZvciB0aGlzIG9wZXJhdGlvbgorICAgIE5VTEwsIC8vIGNoYXIgKmFjdGlvbiA9IE5VTEwgc2VsZWN0cyBkZWZhdWx0IGFjdGlvbiBmb3IgdGhpcyBvcGVyYXRpb24KKyAgICAvLyByZXF1ZXN0IHBhcmFtZXRlcnM6CisgICAgdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZyogICAgICAgICAgdWRkaTJfX3NhdmVfVVNDT1JFYmluZGluZ18sCisgICAgLy8gcmVzcG9uc2UgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fYmluZGluZ0RldGFpbCogICAgICAgICAgICAgICB1ZGRpMl9fYmluZGluZ0RldGFpbF8KKyAgKTsKK0BlbmRjb2RlCisKK0MrKyBwcm94eSBjbGFzcyAoZGVmaW5lZCBpbiBzb2FwUHVibGlzaFNvYXBQcm94eS5oKToKKyAgY2xhc3MgUHVibGlzaFNvYXA7CisKKyovCisKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1zdHlsZToJc2F2ZV9VU0NPUkViaW5kaW5nIGRvY3VtZW50CisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2QtZW5jb2Rpbmc6CXNhdmVfVVNDT1JFYmluZGluZyBsaXRlcmFsCisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2QtYWN0aW9uOglzYXZlX1VTQ09SRWJpbmRpbmcgc2F2ZV9iaW5kaW5nCisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2QtZmF1bHQ6CXNhdmVfVVNDT1JFYmluZGluZyBfZGlzcG9zaXRpb25SZXBvcnQKK2ludCBfX3B1YjJfX3NhdmVfVVNDT1JFYmluZGluZygKKyAgICB1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nKiAgICAgICAgICB1ZGRpMl9fc2F2ZV9VU0NPUkViaW5kaW5nXywKKyAgICB1ZGRpMl9fYmluZGluZ0RldGFpbCogICAgICAgICAgICAgICB1ZGRpMl9fYmluZGluZ0RldGFpbF8gLy8vPCByZXNwb25zZSBwYXJhbWV0ZXIKKyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBfX3B1YjJfX3NhdmVfVVNDT1JFYnVzaW5lc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8vLyBPcGVyYXRpb24gIl9fcHViMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyIgb2Ygc2VydmljZSBiaW5kaW5nICJQdWJsaXNoU29hcCIKKworLyoqCisKK09wZXJhdGlvbiBkZXRhaWxzOgorCisgIC0gU09BUCBkb2N1bWVudC9saXRlcmFsIHN0eWxlCisgIC0gU09BUCBhY3Rpb249InNhdmVfYnVzaW5lc3MiCisgIC0gU09BUCBGYXVsdDogX2Rpc3Bvc2l0aW9uUmVwb3J0CisKK0Mgc3R1YiBmdW5jdGlvbiAoZGVmaW5lZCBpbiBzb2FwQ2xpZW50LmNbcHBdKToKK0Bjb2RlCisgIGludCBzb2FwX2NhbGxfX19wdWIyX19zYXZlX1VTQ09SRWJ1c2luZXNzKHN0cnVjdCBzb2FwICpzb2FwLAorICAgIE5VTEwsIC8vIGNoYXIgKmVuZHBvaW50ID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgZW5kcG9pbnQgZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgTlVMTCwgLy8gY2hhciAqYWN0aW9uID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgYWN0aW9uIGZvciB0aGlzIG9wZXJhdGlvbgorICAgIC8vIHJlcXVlc3QgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzcyogICAgICAgICB1ZGRpMl9fc2F2ZV9VU0NPUkVidXNpbmVzc18sCisgICAgLy8gcmVzcG9uc2UgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fYnVzaW5lc3NEZXRhaWwqICAgICAgICAgICAgICB1ZGRpMl9fYnVzaW5lc3NEZXRhaWxfCisgICk7CitAZW5kY29kZQorCitDKysgcHJveHkgY2xhc3MgKGRlZmluZWQgaW4gc29hcFB1Ymxpc2hTb2FwUHJveHkuaCk6CisgIGNsYXNzIFB1Ymxpc2hTb2FwOworCisqLworCisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2Qtc3R5bGU6CXNhdmVfVVNDT1JFYnVzaW5lc3MgZG9jdW1lbnQKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1lbmNvZGluZzoJc2F2ZV9VU0NPUkVidXNpbmVzcyBsaXRlcmFsCisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2QtYWN0aW9uOglzYXZlX1VTQ09SRWJ1c2luZXNzIHNhdmVfYnVzaW5lc3MKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1mYXVsdDoJc2F2ZV9VU0NPUkVidXNpbmVzcyBfZGlzcG9zaXRpb25SZXBvcnQKK2ludCBfX3B1YjJfX3NhdmVfVVNDT1JFYnVzaW5lc3MoCisgICAgdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3MqICAgICAgICAgdWRkaTJfX3NhdmVfVVNDT1JFYnVzaW5lc3NfLAorICAgIHVkZGkyX19idXNpbmVzc0RldGFpbCogICAgICAgICAgICAgIHVkZGkyX19idXNpbmVzc0RldGFpbF8gLy8vPCByZXNwb25zZSBwYXJhbWV0ZXIKKyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBfX3B1YjJfX3NhdmVfVVNDT1JFc2VydmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8vLyBPcGVyYXRpb24gIl9fcHViMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlIiBvZiBzZXJ2aWNlIGJpbmRpbmcgIlB1Ymxpc2hTb2FwIgorCisvKioKKworT3BlcmF0aW9uIGRldGFpbHM6CisKKyAgLSBTT0FQIGRvY3VtZW50L2xpdGVyYWwgc3R5bGUKKyAgLSBTT0FQIGFjdGlvbj0ic2F2ZV9zZXJ2aWNlIgorICAtIFNPQVAgRmF1bHQ6IF9kaXNwb3NpdGlvblJlcG9ydAorCitDIHN0dWIgZnVuY3Rpb24gKGRlZmluZWQgaW4gc29hcENsaWVudC5jW3BwXSk6CitAY29kZQorICBpbnQgc29hcF9jYWxsX19fcHViMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlKHN0cnVjdCBzb2FwICpzb2FwLAorICAgIE5VTEwsIC8vIGNoYXIgKmVuZHBvaW50ID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgZW5kcG9pbnQgZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgTlVMTCwgLy8gY2hhciAqYWN0aW9uID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgYWN0aW9uIGZvciB0aGlzIG9wZXJhdGlvbgorICAgIC8vIHJlcXVlc3QgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlKiAgICAgICAgICB1ZGRpMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlXywKKyAgICAvLyByZXNwb25zZSBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX19zZXJ2aWNlRGV0YWlsKiAgICAgICAgICAgICAgIHVkZGkyX19zZXJ2aWNlRGV0YWlsXworICApOworQGVuZGNvZGUKKworQysrIHByb3h5IGNsYXNzIChkZWZpbmVkIGluIHNvYXBQdWJsaXNoU29hcFByb3h5LmgpOgorICBjbGFzcyBQdWJsaXNoU29hcDsKKworKi8KKworLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLXN0eWxlOglzYXZlX1VTQ09SRXNlcnZpY2UgZG9jdW1lbnQKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1lbmNvZGluZzoJc2F2ZV9VU0NPUkVzZXJ2aWNlIGxpdGVyYWwKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1hY3Rpb246CXNhdmVfVVNDT1JFc2VydmljZSBzYXZlX3NlcnZpY2UKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1mYXVsdDoJc2F2ZV9VU0NPUkVzZXJ2aWNlIF9kaXNwb3NpdGlvblJlcG9ydAoraW50IF9fcHViMl9fc2F2ZV9VU0NPUkVzZXJ2aWNlKAorICAgIHVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2UqICAgICAgICAgIHVkZGkyX19zYXZlX1VTQ09SRXNlcnZpY2VfLAorICAgIHVkZGkyX19zZXJ2aWNlRGV0YWlsKiAgICAgICAgICAgICAgIHVkZGkyX19zZXJ2aWNlRGV0YWlsXyAvLy88IHJlc3BvbnNlIHBhcmFtZXRlcgorKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIF9fcHViMl9fc2F2ZV9VU0NPUkV0TW9kZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLy8vIE9wZXJhdGlvbiAiX19wdWIyX19zYXZlX1VTQ09SRXRNb2RlbCIgb2Ygc2VydmljZSBiaW5kaW5nICJQdWJsaXNoU29hcCIKKworLyoqCisKK09wZXJhdGlvbiBkZXRhaWxzOgorCisgIC0gU09BUCBkb2N1bWVudC9saXRlcmFsIHN0eWxlCisgIC0gU09BUCBhY3Rpb249InNhdmVfdE1vZGVsIgorICAtIFNPQVAgRmF1bHQ6IF9kaXNwb3NpdGlvblJlcG9ydAorCitDIHN0dWIgZnVuY3Rpb24gKGRlZmluZWQgaW4gc29hcENsaWVudC5jW3BwXSk6CitAY29kZQorICBpbnQgc29hcF9jYWxsX19fcHViMl9fc2F2ZV9VU0NPUkV0TW9kZWwoc3RydWN0IHNvYXAgKnNvYXAsCisgICAgTlVMTCwgLy8gY2hhciAqZW5kcG9pbnQgPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBlbmRwb2ludCBmb3IgdGhpcyBvcGVyYXRpb24KKyAgICBOVUxMLCAvLyBjaGFyICphY3Rpb24gPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBhY3Rpb24gZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgLy8gcmVxdWVzdCBwYXJhbWV0ZXJzOgorICAgIHVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbCogICAgICAgICAgIHVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbF8sCisgICAgLy8gcmVzcG9uc2UgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fdE1vZGVsRGV0YWlsKiAgICAgICAgICAgICAgICB1ZGRpMl9fdE1vZGVsRGV0YWlsXworICApOworQGVuZGNvZGUKKworQysrIHByb3h5IGNsYXNzIChkZWZpbmVkIGluIHNvYXBQdWJsaXNoU29hcFByb3h5LmgpOgorICBjbGFzcyBQdWJsaXNoU29hcDsKKworKi8KKworLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLXN0eWxlOglzYXZlX1VTQ09SRXRNb2RlbCBkb2N1bWVudAorLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWVuY29kaW5nOglzYXZlX1VTQ09SRXRNb2RlbCBsaXRlcmFsCisvL2dzb2FwIHB1YjIgc2VydmljZSBtZXRob2QtYWN0aW9uOglzYXZlX1VTQ09SRXRNb2RlbCBzYXZlX3RNb2RlbAorLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWZhdWx0OglzYXZlX1VTQ09SRXRNb2RlbCBfZGlzcG9zaXRpb25SZXBvcnQKK2ludCBfX3B1YjJfX3NhdmVfVVNDT1JFdE1vZGVsKAorICAgIHVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbCogICAgICAgICAgIHVkZGkyX19zYXZlX1VTQ09SRXRNb2RlbF8sCisgICAgdWRkaTJfX3RNb2RlbERldGFpbCogICAgICAgICAgICAgICAgdWRkaTJfX3RNb2RlbERldGFpbF8gLy8vPCByZXNwb25zZSBwYXJhbWV0ZXIKKyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBfX3B1YjJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8vLyBPcGVyYXRpb24gIl9fcHViMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMiIG9mIHNlcnZpY2UgYmluZGluZyAiUHVibGlzaFNvYXAiCisKKy8qKgorCitPcGVyYXRpb24gZGV0YWlsczoKKworICAtIFNPQVAgZG9jdW1lbnQvbGl0ZXJhbCBzdHlsZQorICAtIFNPQVAgYWN0aW9uPSJzZXRfcHVibGlzaGVyQXNzZXJ0aW9ucyIKKyAgLSBTT0FQIEZhdWx0OiBfZGlzcG9zaXRpb25SZXBvcnQKKworQyBzdHViIGZ1bmN0aW9uIChkZWZpbmVkIGluIHNvYXBDbGllbnQuY1twcF0pOgorQGNvZGUKKyAgaW50IHNvYXBfY2FsbF9fX3B1YjJfX3NldF9VU0NPUkVwdWJsaXNoZXJBc3NlcnRpb25zKHN0cnVjdCBzb2FwICpzb2FwLAorICAgIE5VTEwsIC8vIGNoYXIgKmVuZHBvaW50ID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgZW5kcG9pbnQgZm9yIHRoaXMgb3BlcmF0aW9uCisgICAgTlVMTCwgLy8gY2hhciAqYWN0aW9uID0gTlVMTCBzZWxlY3RzIGRlZmF1bHQgYWN0aW9uIGZvciB0aGlzIG9wZXJhdGlvbgorICAgIC8vIHJlcXVlc3QgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMqIHVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uc18sCisgICAgLy8gcmVzcG9uc2UgcGFyYW1ldGVyczoKKyAgICB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9ucyogICAgICAgICB1ZGRpMl9fcHVibGlzaGVyQXNzZXJ0aW9uc18KKyAgKTsKK0BlbmRjb2RlCisKK0MrKyBwcm94eSBjbGFzcyAoZGVmaW5lZCBpbiBzb2FwUHVibGlzaFNvYXBQcm94eS5oKToKKyAgY2xhc3MgUHVibGlzaFNvYXA7CisKKyovCisKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1zdHlsZToJc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgZG9jdW1lbnQKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1lbmNvZGluZzoJc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgbGl0ZXJhbAorLy9nc29hcCBwdWIyIHNlcnZpY2UgbWV0aG9kLWFjdGlvbjoJc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgc2V0X3B1Ymxpc2hlckFzc2VydGlvbnMKKy8vZ3NvYXAgcHViMiBzZXJ2aWNlIG1ldGhvZC1mYXVsdDoJc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMgX2Rpc3Bvc2l0aW9uUmVwb3J0CitpbnQgX19wdWIyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9ucygKKyAgICB1ZGRpMl9fc2V0X1VTQ09SRXB1Ymxpc2hlckFzc2VydGlvbnMqIHVkZGkyX19zZXRfVVNDT1JFcHVibGlzaGVyQXNzZXJ0aW9uc18sCisgICAgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnMqICAgICAgICAgdWRkaTJfX3B1Ymxpc2hlckFzc2VydGlvbnNfIC8vLzwgcmVzcG9uc2UgcGFyYW1ldGVyCispOworCisvKiBFbmQgb2YgdWRkaV92Mi5oICovCmRpZmYgLS1naXQgYS91ZGRpMi91ZGRpX3YyLnhzZCBiL3VkZGkyL3VkZGlfdjIueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NjIyZjQKLS0tIC9kZXYvbnVsbAorKysgYi91ZGRpMi91ZGRpX3YyLnhzZApAQCAtMCwwICsxLDc1MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0idXJuOnVkZGktb3JnOmFwaV92MiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp1ZGRpPSJ1cm46dWRkaS1vcmc6YXBpX3YyIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIiB2ZXJzaW9uPSIyLjAzIiBpZD0idWRkaSI+CisJPCEtLSAKKyAgICBDb3B5cmlnaHQgKGMpIDIwMDAgLSAyMDAyIGJ5IEFjY2VudHVyZSwgQXJpYmEsIEluYy4sIENvbW1lcmNlIE9uZSwgSW5jLiAKKyAgICBGdWppdHN1IExpbWl0ZWQsIEhld2xldHQtUGFja2FyZCBDb21wYW55LCBpMiBUZWNobm9sb2dpZXMsIEluYy4sIAorICAgIEludGVsIENvcnBvcmF0aW9uLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uLCAgCisgICAgTWljcm9zb2Z0IENvcnBvcmF0aW9uLCBPcmFjbGUgQ29ycG9yYXRpb24sIFNBUCBBRywgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgCisgICAgYW5kIFZlcmlTaWduLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgIAorICAgIENvcHlyaWdodCAoYykgT0FTSVMgT3BlbiAyMDAyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICAgICAtLT4KKwk8eHNkOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCIvPgorCTwhLS0gQXR0cmlidXRlIHR5cGUgZGVmaW5pdGlvbnMgLS0+CisJPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImJpbmRpbmdLZXkiPgorCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyIvPgorCTwveHNkOnNpbXBsZVR5cGU+CisJPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImJ1c2luZXNzS2V5Ij4KKwkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciLz4KKwk8L3hzZDpzaW1wbGVUeXBlPgorCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJzZXJ2aWNlS2V5Ij4KKwkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciLz4KKwk8L3hzZDpzaW1wbGVUeXBlPgorCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ0TW9kZWxLZXkiPgorCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyIvPgorCTwveHNkOnNpbXBsZVR5cGU+CisJPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpcmVjdGlvbiI+CisJCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iTk1UT0tFTiI+CisJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmcm9tS2V5Ii8+CisJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0b0tleSIvPgorCQk8L3hzZDpyZXN0cmljdGlvbj4KKwk8L3hzZDpzaW1wbGVUeXBlPgorCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ0cnVuY2F0ZWQiPgorCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9Ik5NVE9LRU4iPgorCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idHJ1ZSIvPgorCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmFsc2UiLz4KKwkJPC94c2Q6cmVzdHJpY3Rpb24+CisJPC94c2Q6c2ltcGxlVHlwZT4KKwk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVVJMVHlwZSI+CisJCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iTk1UT0tFTiI+CisJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtYWlsdG8iLz4KKwkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imh0dHAiLz4KKwkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imh0dHBzIi8+CisJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmdHAiLz4KKwkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZheCIvPgorCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icGhvbmUiLz4KKwkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im90aGVyIi8+CisJCTwveHNkOnJlc3RyaWN0aW9uPgorCTwveHNkOnNpbXBsZVR5cGU+CisJPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImtleVR5cGUiPgorCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9Ik5NVE9LRU4iPgorCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYnVzaW5lc3NLZXkiLz4KKwkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRNb2RlbEtleSIvPgorCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2VydmljZUtleSIvPgorCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYmluZGluZ0tleSIvPgorCQk8L3hzZDpyZXN0cmljdGlvbj4KKwk8L3hzZDpzaW1wbGVUeXBlPgorCTwhLS0gVHlwZSBhbmQgZWxlbWVudCBkZWZpbml0aW9ucyBmb3IgcmVnaXN0cnkgY29udGVudCAtLT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzUG9pbnQiIHR5cGU9InVkZGk6YWNjZXNzUG9pbnQiLz4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFjY2Vzc1BvaW50Ij4KKwkJPHhzZDpzaW1wbGVDb250ZW50PgorCQkJPHhzZDpleHRlbnNpb24gYmFzZT0ic3RyaW5nIj4KKwkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJVUkxUeXBlIiB0eXBlPSJ1ZGRpOlVSTFR5cGUiIHVzZT0icmVxdWlyZWQiLz4KKwkJCTwveHNkOmV4dGVuc2lvbj4KKwkJPC94c2Q6c2ltcGxlQ29udGVudD4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iYWRkcmVzcyIgdHlwZT0idWRkaTphZGRyZXNzIi8+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhZGRyZXNzIj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6YWRkcmVzc0xpbmUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InVzZVR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzb3J0Q29kZSIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InRNb2RlbEtleSIgdHlwZT0idWRkaTp0TW9kZWxLZXkiIHVzZT0ib3B0aW9uYWwiLz4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iYWRkcmVzc0xpbmUiIHR5cGU9InVkZGk6YWRkcmVzc0xpbmUiLz4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFkZHJlc3NMaW5lIj4KKwkJPHhzZDpzaW1wbGVDb250ZW50PgorCQkJPHhzZDpleHRlbnNpb24gYmFzZT0ic3RyaW5nIj4KKwkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJrZXlOYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KKwkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJrZXlWYWx1ZSIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+CisJCQk8L3hzZDpleHRlbnNpb24+CisJCTwveHNkOnNpbXBsZUNvbnRlbnQ+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9ImFzc2VydGlvblN0YXR1c0l0ZW0iIHR5cGU9InVkZGk6YXNzZXJ0aW9uU3RhdHVzSXRlbSIvPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXNzZXJ0aW9uU3RhdHVzSXRlbSI+CisJCTx4c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOmZyb21LZXkiLz4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6dG9LZXkiLz4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6a2V5ZWRSZWZlcmVuY2UiLz4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6a2V5c093bmVkIi8+CisJCTwveHNkOnNlcXVlbmNlPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb21wbGV0aW9uU3RhdHVzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iYXV0aEluZm8iIHR5cGU9InN0cmluZyIvPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJiaW5kaW5nS2V5IiB0eXBlPSJ1ZGRpOmJpbmRpbmdLZXkiLz4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iYmluZGluZ1RlbXBsYXRlIiB0eXBlPSJ1ZGRpOmJpbmRpbmdUZW1wbGF0ZSIvPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmluZGluZ1RlbXBsYXRlIj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6ZGVzY3JpcHRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTx4c2Q6Y2hvaWNlPgorCQkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6YWNjZXNzUG9pbnQiLz4KKwkJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOmhvc3RpbmdSZWRpcmVjdG9yIi8+CisJCQk8L3hzZDpjaG9pY2U+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOnRNb2RlbEluc3RhbmNlRGV0YWlscyIvPgorCQk8L3hzZDpzZXF1ZW5jZT4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2VydmljZUtleSIgdHlwZT0idWRkaTpzZXJ2aWNlS2V5IiB1c2U9Im9wdGlvbmFsIi8+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImJpbmRpbmdLZXkiIHR5cGU9InVkZGk6YmluZGluZ0tleSIgdXNlPSJyZXF1aXJlZCIvPgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJiaW5kaW5nVGVtcGxhdGVzIiB0eXBlPSJ1ZGRpOmJpbmRpbmdUZW1wbGF0ZXMiLz4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJpbmRpbmdUZW1wbGF0ZXMiPgorCQk8eHNkOnNlcXVlbmNlPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTpiaW5kaW5nVGVtcGxhdGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9ImJ1c2luZXNzRW50aXR5IiB0eXBlPSJ1ZGRpOmJ1c2luZXNzRW50aXR5Ii8+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJidXNpbmVzc0VudGl0eSI+CisJCTx4c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOmRpc2NvdmVyeVVSTHMiIG1pbk9jY3Vycz0iMCIvPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTpuYW1lIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTpkZXNjcmlwdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTpjb250YWN0cyIgbWluT2NjdXJzPSIwIi8+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOmJ1c2luZXNzU2VydmljZXMiIG1pbk9jY3Vycz0iMCIvPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTppZGVudGlmaWVyQmFnIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6Y2F0ZWdvcnlCYWciIG1pbk9jY3Vycz0iMCIvPgorCQk8L3hzZDpzZXF1ZW5jZT4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYnVzaW5lc3NLZXkiIHR5cGU9InVkZGk6YnVzaW5lc3NLZXkiIHVzZT0icmVxdWlyZWQiLz4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3BlcmF0b3IiIHR5cGU9InN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdXRob3JpemVkTmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9ImJ1c2luZXNzRW50aXR5RXh0IiB0eXBlPSJ1ZGRpOmJ1c2luZXNzRW50aXR5RXh0Ii8+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJidXNpbmVzc0VudGl0eUV4dCI+CisJCTx4c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOmJ1c2luZXNzRW50aXR5Ii8+CisJCQk8eHNkOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ic3RyaWN0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCTwveHNkOnNlcXVlbmNlPgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJidXNpbmVzc0luZm8iIHR5cGU9InVkZGk6YnVzaW5lc3NJbmZvIi8+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJidXNpbmVzc0luZm8iPgorCQk8eHNkOnNlcXVlbmNlPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTpuYW1lIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTpkZXNjcmlwdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTpzZXJ2aWNlSW5mb3MiLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImJ1c2luZXNzS2V5IiB0eXBlPSJ1ZGRpOmJ1c2luZXNzS2V5IiB1c2U9InJlcXVpcmVkIi8+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9ImJ1c2luZXNzSW5mb3MiIHR5cGU9InVkZGk6YnVzaW5lc3NJbmZvcyIvPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYnVzaW5lc3NJbmZvcyI+CisJCTx4c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOmJ1c2luZXNzSW5mbyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQk8L3hzZDpzZXF1ZW5jZT4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iYnVzaW5lc3NLZXkiIHR5cGU9InVkZGk6YnVzaW5lc3NLZXkiLz4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iYnVzaW5lc3NTZXJ2aWNlIiB0eXBlPSJ1ZGRpOmJ1c2luZXNzU2VydmljZSIvPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYnVzaW5lc3NTZXJ2aWNlIj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6bmFtZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTpkZXNjcmlwdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTpiaW5kaW5nVGVtcGxhdGVzIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6Y2F0ZWdvcnlCYWciIG1pbk9jY3Vycz0iMCIvPgorCQk8L3hzZDpzZXF1ZW5jZT4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2VydmljZUtleSIgdHlwZT0idWRkaTpzZXJ2aWNlS2V5IiB1c2U9InJlcXVpcmVkIi8+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImJ1c2luZXNzS2V5IiB0eXBlPSJ1ZGRpOmJ1c2luZXNzS2V5IiB1c2U9Im9wdGlvbmFsIi8+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9ImJ1c2luZXNzU2VydmljZXMiIHR5cGU9InVkZGk6YnVzaW5lc3NTZXJ2aWNlcyIvPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYnVzaW5lc3NTZXJ2aWNlcyI+CisJCTx4c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOmJ1c2luZXNzU2VydmljZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQk8L3hzZDpzZXF1ZW5jZT4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iY2F0ZWdvcnlCYWciIHR5cGU9InVkZGk6Y2F0ZWdvcnlCYWciLz4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhdGVnb3J5QmFnIj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6a2V5ZWRSZWZlcmVuY2UiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCTwveHNkOnNlcXVlbmNlPgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJjb21wbGV0aW9uU3RhdHVzIiB0eXBlPSJzdHJpbmciLz4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFjdCIgdHlwZT0idWRkaTpjb250YWN0Ii8+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb250YWN0Ij4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6ZGVzY3JpcHRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6cGVyc29uTmFtZSIvPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTpwaG9uZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTplbWFpbCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTphZGRyZXNzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCTwveHNkOnNlcXVlbmNlPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1c2VUeXBlIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFjdHMiIHR5cGU9InVkZGk6Y29udGFjdHMiLz4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbnRhY3RzIj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6Y29udGFjdCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ1ZGRpOmRlc2NyaXB0aW9uIi8+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZXNjcmlwdGlvbiI+CisJCTx4c2Q6c2ltcGxlQ29udGVudD4KKwkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InN0cmluZyI+CisJCQkJPHhzZDphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgorCQkJPC94c2Q6ZXh0ZW5zaW9uPgorCQk8L3hzZDpzaW1wbGVDb250ZW50PgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjb3ZlcnlVUkwiIHR5cGU9InVkZGk6ZGlzY292ZXJ5VVJMIi8+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXNjb3ZlcnlVUkwiPgorCQk8eHNkOnNpbXBsZUNvbnRlbnQ+CisJCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJzdHJpbmciPgorCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InVzZVR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorCQkJPC94c2Q6ZXh0ZW5zaW9uPgorCQk8L3hzZDpzaW1wbGVDb250ZW50PgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjb3ZlcnlVUkxzIiB0eXBlPSJ1ZGRpOmRpc2NvdmVyeVVSTHMiLz4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpc2NvdmVyeVVSTHMiPgorCQk8eHNkOnNlcXVlbmNlPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTpkaXNjb3ZlcnlVUkwiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCTwveHNkOnNlcXVlbmNlPgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwb3NpdGlvblJlcG9ydCIgdHlwZT0idWRkaTpkaXNwb3NpdGlvblJlcG9ydCIvPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlzcG9zaXRpb25SZXBvcnQiPgorCQk8eHNkOnNlcXVlbmNlPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTpyZXN1bHQiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCTwveHNkOnNlcXVlbmNlPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnZW5lcmljIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3BlcmF0b3IiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0cnVuY2F0ZWQiIHR5cGU9InVkZGk6dHJ1bmNhdGVkIiB1c2U9Im9wdGlvbmFsIi8+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9ImVtYWlsIiB0eXBlPSJ1ZGRpOmVtYWlsIi8+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbWFpbCI+CisJCTx4c2Q6c2ltcGxlQ29udGVudD4KKwkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InN0cmluZyI+CisJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idXNlVHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+CisJCQk8L3hzZDpleHRlbnNpb24+CisJCTwveHNkOnNpbXBsZUNvbnRlbnQ+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9ImVyckluZm8iIHR5cGU9InVkZGk6ZXJySW5mbyIvPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXJySW5mbyI+CisJCTx4c2Q6c2ltcGxlQ29udGVudD4KKwkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InN0cmluZyI+CisJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXJyQ29kZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJCQk8L3hzZDpleHRlbnNpb24+CisJCTwveHNkOnNpbXBsZUNvbnRlbnQ+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9ImZpbmRRdWFsaWZpZXIiIHR5cGU9InN0cmluZyIvPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJmaW5kUXVhbGlmaWVycyIgdHlwZT0idWRkaTpmaW5kUXVhbGlmaWVycyIvPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmluZFF1YWxpZmllcnMiPgorCQk8eHNkOnNlcXVlbmNlPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTpmaW5kUXVhbGlmaWVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCTwveHNkOnNlcXVlbmNlPgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJmcm9tS2V5IiB0eXBlPSJ1ZGRpOmJ1c2luZXNzS2V5Ii8+CisJPHhzZDplbGVtZW50IG5hbWU9Imhvc3RpbmdSZWRpcmVjdG9yIiB0eXBlPSJ1ZGRpOmhvc3RpbmdSZWRpcmVjdG9yIi8+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJob3N0aW5nUmVkaXJlY3RvciI+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImJpbmRpbmdLZXkiIHR5cGU9InVkZGk6YmluZGluZ0tleSIgdXNlPSJyZXF1aXJlZCIvPgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJpZGVudGlmaWVyQmFnIiB0eXBlPSJ1ZGRpOmlkZW50aWZpZXJCYWciLz4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImlkZW50aWZpZXJCYWciPgorCQk8eHNkOnNlcXVlbmNlPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTprZXllZFJlZmVyZW5jZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbmNlRGV0YWlscyIgdHlwZT0idWRkaTppbnN0YW5jZURldGFpbHMiLz4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imluc3RhbmNlRGV0YWlscyI+CisJCTx4c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOmRlc2NyaXB0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOm92ZXJ2aWV3RG9jIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6aW5zdGFuY2VQYXJtcyIgbWluT2NjdXJzPSIwIi8+CisJCTwveHNkOnNlcXVlbmNlPgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJpbnN0YW5jZVBhcm1zIiB0eXBlPSJzdHJpbmciLz4KKwk8eHNkOmVsZW1lbnQgbmFtZT0ia2V5ZWRSZWZlcmVuY2UiIHR5cGU9InVkZGk6a2V5ZWRSZWZlcmVuY2UiLz4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImtleWVkUmVmZXJlbmNlIj4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idE1vZGVsS2V5IiB0eXBlPSJ1ZGRpOnRNb2RlbEtleSIgdXNlPSJvcHRpb25hbCIvPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJrZXlOYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ia2V5VmFsdWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJrZXlzT3duZWQiIHR5cGU9InVkZGk6a2V5c093bmVkIi8+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJrZXlzT3duZWQiPgorCQk8eHNkOnNlcXVlbmNlPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTpmcm9tS2V5IiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6dG9LZXkiIG1pbk9jY3Vycz0iMCIvPgorCQk8L3hzZDpzZXF1ZW5jZT4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0idWRkaTpuYW1lIi8+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lIj4KKwkJPHhzZDpzaW1wbGVDb250ZW50PgorCQkJPHhzZDpleHRlbnNpb24gYmFzZT0ic3RyaW5nIj4KKwkJCQk8eHNkOmF0dHJpYnV0ZSByZWY9InhtbDpsYW5nIiB1c2U9Im9wdGlvbmFsIi8+CisJCQk8L3hzZDpleHRlbnNpb24+CisJCTwveHNkOnNpbXBsZUNvbnRlbnQ+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9Im92ZXJ2aWV3RG9jIiB0eXBlPSJ1ZGRpOm92ZXJ2aWV3RG9jIi8+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvdmVydmlld0RvYyI+CisJCTx4c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOmRlc2NyaXB0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOm92ZXJ2aWV3VVJMIiBtaW5PY2N1cnM9IjAiLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9Im92ZXJ2aWV3VVJMIiB0eXBlPSJzdHJpbmciLz4KKwk8eHNkOmVsZW1lbnQgbmFtZT0icGVyc29uTmFtZSIgdHlwZT0ic3RyaW5nIi8+CisJPHhzZDplbGVtZW50IG5hbWU9InBob25lIiB0eXBlPSJ1ZGRpOnBob25lIi8+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwaG9uZSI+CisJCTx4c2Q6c2ltcGxlQ29udGVudD4KKwkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InN0cmluZyI+CisJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idXNlVHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+CisJCQk8L3hzZDpleHRlbnNpb24+CisJCTwveHNkOnNpbXBsZUNvbnRlbnQ+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9InB1Ymxpc2hlckFzc2VydGlvbiIgdHlwZT0idWRkaTpwdWJsaXNoZXJBc3NlcnRpb24iLz4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InB1Ymxpc2hlckFzc2VydGlvbiI+CisJCTx4c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOmZyb21LZXkiLz4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6dG9LZXkiLz4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6a2V5ZWRSZWZlcmVuY2UiLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9InJlbGF0ZWRCdXNpbmVzc0luZm8iIHR5cGU9InVkZGk6cmVsYXRlZEJ1c2luZXNzSW5mbyIvPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRlZEJ1c2luZXNzSW5mbyI+CisJCTx4c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOmJ1c2luZXNzS2V5Ii8+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOm5hbWUiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOmRlc2NyaXB0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOnNoYXJlZFJlbGF0aW9uc2hpcHMiIG1heE9jY3Vycz0iMiIvPgorCQk8L3hzZDpzZXF1ZW5jZT4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0icmVsYXRlZEJ1c2luZXNzSW5mb3MiIHR5cGU9InVkZGk6cmVsYXRlZEJ1c2luZXNzSW5mb3MiLz4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbGF0ZWRCdXNpbmVzc0luZm9zIj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6cmVsYXRlZEJ1c2luZXNzSW5mbyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQk8L3hzZDpzZXF1ZW5jZT4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0icmVzdWx0IiB0eXBlPSJ1ZGRpOnJlc3VsdCIvPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVzdWx0Ij4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6ZXJySW5mbyIgbWluT2NjdXJzPSIwIi8+CisJCTwveHNkOnNlcXVlbmNlPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJrZXlUeXBlIiB0eXBlPSJ1ZGRpOmtleVR5cGUiIHVzZT0ib3B0aW9uYWwiLz4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXJybm8iIHR5cGU9ImludCIgdXNlPSJyZXF1aXJlZCIvPgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlSW5mbyIgdHlwZT0idWRkaTpzZXJ2aWNlSW5mbyIvPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmljZUluZm8iPgorCQk8eHNkOnNlcXVlbmNlPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTpuYW1lIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCTwveHNkOnNlcXVlbmNlPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZXJ2aWNlS2V5IiB0eXBlPSJ1ZGRpOnNlcnZpY2VLZXkiIHVzZT0icmVxdWlyZWQiLz4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYnVzaW5lc3NLZXkiIHR5cGU9InVkZGk6YnVzaW5lc3NLZXkiIHVzZT0icmVxdWlyZWQiLz4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZUluZm9zIiB0eXBlPSJ1ZGRpOnNlcnZpY2VJbmZvcyIvPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmljZUluZm9zIj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6c2VydmljZUluZm8iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2VLZXkiIHR5cGU9InVkZGk6c2VydmljZUtleSIvPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJzaGFyZWRSZWxhdGlvbnNoaXBzIiB0eXBlPSJ1ZGRpOnNoYXJlZFJlbGF0aW9uc2hpcHMiLz4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNoYXJlZFJlbGF0aW9uc2hpcHMiPgorCQk8eHNkOnNlcXVlbmNlPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTprZXllZFJlZmVyZW5jZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpcmVjdGlvbiIgdHlwZT0idWRkaTpkaXJlY3Rpb24iIHVzZT0icmVxdWlyZWQiLz4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0idE1vZGVsIiB0eXBlPSJ1ZGRpOnRNb2RlbCIvPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idE1vZGVsIj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6bmFtZSIvPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTpkZXNjcmlwdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTpvdmVydmlld0RvYyIgbWluT2NjdXJzPSIwIi8+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOmlkZW50aWZpZXJCYWciIG1pbk9jY3Vycz0iMCIvPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTpjYXRlZ29yeUJhZyIgbWluT2NjdXJzPSIwIi8+CisJCTwveHNkOnNlcXVlbmNlPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0TW9kZWxLZXkiIHR5cGU9InVkZGk6dE1vZGVsS2V5IiB1c2U9InJlcXVpcmVkIi8+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wZXJhdG9yIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXV0aG9yaXplZE5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJ0TW9kZWxCYWciIHR5cGU9InVkZGk6dE1vZGVsQmFnIi8+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0TW9kZWxCYWciPgorCQk8eHNkOnNlcXVlbmNlPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTp0TW9kZWxLZXkiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCTwveHNkOnNlcXVlbmNlPgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJ0TW9kZWxJbmZvIiB0eXBlPSJ1ZGRpOnRNb2RlbEluZm8iLz4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRNb2RlbEluZm8iPgorCQk8eHNkOnNlcXVlbmNlPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTpuYW1lIi8+CisJCTwveHNkOnNlcXVlbmNlPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0TW9kZWxLZXkiIHR5cGU9InVkZGk6dE1vZGVsS2V5IiB1c2U9InJlcXVpcmVkIi8+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9InRNb2RlbEluZm9zIiB0eXBlPSJ1ZGRpOnRNb2RlbEluZm9zIi8+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0TW9kZWxJbmZvcyI+CisJCTx4c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOnRNb2RlbEluZm8iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9InRNb2RlbEluc3RhbmNlRGV0YWlscyIgdHlwZT0idWRkaTp0TW9kZWxJbnN0YW5jZURldGFpbHMiLz4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRNb2RlbEluc3RhbmNlRGV0YWlscyI+CisJCTx4c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOnRNb2RlbEluc3RhbmNlSW5mbyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQk8L3hzZDpzZXF1ZW5jZT4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0idE1vZGVsSW5zdGFuY2VJbmZvIiB0eXBlPSJ1ZGRpOnRNb2RlbEluc3RhbmNlSW5mbyIvPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idE1vZGVsSW5zdGFuY2VJbmZvIj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6ZGVzY3JpcHRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6aW5zdGFuY2VEZXRhaWxzIiBtaW5PY2N1cnM9IjAiLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InRNb2RlbEtleSIgdHlwZT0idWRkaTp0TW9kZWxLZXkiIHVzZT0icmVxdWlyZWQiLz4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0idE1vZGVsS2V5IiB0eXBlPSJ1ZGRpOnRNb2RlbEtleSIvPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJ0b0tleSIgdHlwZT0idWRkaTpidXNpbmVzc0tleSIvPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJ1cGxvYWRSZWdpc3RlciIgdHlwZT0ic3RyaW5nIi8+CisJPCEtLSBUeXBlIGFuZCBlbGVtZW50IGRlZmluaXRpb25zIGZvciBpbnB1dCBtZXNzYWdlcyAtLT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iYWRkX3B1Ymxpc2hlckFzc2VydGlvbnMiIHR5cGU9InVkZGk6YWRkX3B1Ymxpc2hlckFzc2VydGlvbnMiLz4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFkZF9wdWJsaXNoZXJBc3NlcnRpb25zIj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6YXV0aEluZm8iLz4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6cHVibGlzaGVyQXNzZXJ0aW9uIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQk8L3hzZDpzZXF1ZW5jZT4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2VuZXJpYyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9ImRlbGV0ZV9iaW5kaW5nIiB0eXBlPSJ1ZGRpOmRlbGV0ZV9iaW5kaW5nIi8+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZWxldGVfYmluZGluZyI+CisJCTx4c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOmF1dGhJbmZvIi8+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOmJpbmRpbmdLZXkiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCTwveHNkOnNlcXVlbmNlPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnZW5lcmljIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iZGVsZXRlX2J1c2luZXNzIiB0eXBlPSJ1ZGRpOmRlbGV0ZV9idXNpbmVzcyIvPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGVsZXRlX2J1c2luZXNzIj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6YXV0aEluZm8iLz4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6YnVzaW5lc3NLZXkiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCTwveHNkOnNlcXVlbmNlPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnZW5lcmljIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iZGVsZXRlX3B1Ymxpc2hlckFzc2VydGlvbnMiIHR5cGU9InVkZGk6ZGVsZXRlX3B1Ymxpc2hlckFzc2VydGlvbnMiLz4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlbGV0ZV9wdWJsaXNoZXJBc3NlcnRpb25zIj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6YXV0aEluZm8iLz4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6cHVibGlzaGVyQXNzZXJ0aW9uIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQk8L3hzZDpzZXF1ZW5jZT4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2VuZXJpYyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9ImRlbGV0ZV9zZXJ2aWNlIiB0eXBlPSJ1ZGRpOmRlbGV0ZV9zZXJ2aWNlIi8+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZWxldGVfc2VydmljZSI+CisJCTx4c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOmF1dGhJbmZvIi8+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOnNlcnZpY2VLZXkiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCTwveHNkOnNlcXVlbmNlPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnZW5lcmljIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iZGVsZXRlX3RNb2RlbCIgdHlwZT0idWRkaTpkZWxldGVfdE1vZGVsIi8+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZWxldGVfdE1vZGVsIj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6YXV0aEluZm8iLz4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6dE1vZGVsS2V5IiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQk8L3hzZDpzZXF1ZW5jZT4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2VuZXJpYyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9ImRpc2NhcmRfYXV0aFRva2VuIiB0eXBlPSJ1ZGRpOmRpc2NhcmRfYXV0aFRva2VuIi8+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXNjYXJkX2F1dGhUb2tlbiI+CisJCTx4c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOmF1dGhJbmZvIi8+CisJCTwveHNkOnNlcXVlbmNlPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnZW5lcmljIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iZmluZF9iaW5kaW5nIiB0eXBlPSJ1ZGRpOmZpbmRfYmluZGluZyIvPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmluZF9iaW5kaW5nIj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6ZmluZFF1YWxpZmllcnMiIG1pbk9jY3Vycz0iMCIvPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTp0TW9kZWxCYWciLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImdlbmVyaWMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXhSb3dzIiB0eXBlPSJpbnQiIHVzZT0ib3B0aW9uYWwiLz4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2VydmljZUtleSIgdHlwZT0idWRkaTpzZXJ2aWNlS2V5IiB1c2U9InJlcXVpcmVkIi8+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9ImZpbmRfYnVzaW5lc3MiIHR5cGU9InVkZGk6ZmluZF9idXNpbmVzcyIvPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmluZF9idXNpbmVzcyI+CisJCTx4c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOmZpbmRRdWFsaWZpZXJzIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6bmFtZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTppZGVudGlmaWVyQmFnIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6Y2F0ZWdvcnlCYWciIG1pbk9jY3Vycz0iMCIvPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTp0TW9kZWxCYWciIG1pbk9jY3Vycz0iMCIvPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTpkaXNjb3ZlcnlVUkxzIiBtaW5PY2N1cnM9IjAiLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImdlbmVyaWMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXhSb3dzIiB0eXBlPSJpbnQiIHVzZT0ib3B0aW9uYWwiLz4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iZmluZF9yZWxhdGVkQnVzaW5lc3NlcyIgdHlwZT0idWRkaTpmaW5kX3JlbGF0ZWRCdXNpbmVzc2VzIi8+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaW5kX3JlbGF0ZWRCdXNpbmVzc2VzIj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6ZmluZFF1YWxpZmllcnMiIG1pbk9jY3Vycz0iMCIvPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTpidXNpbmVzc0tleSIvPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTprZXllZFJlZmVyZW5jZSIgbWluT2NjdXJzPSIwIi8+CisJCTwveHNkOnNlcXVlbmNlPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnZW5lcmljIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWF4Um93cyIgdHlwZT0iaW50IiB1c2U9Im9wdGlvbmFsIi8+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9ImZpbmRfc2VydmljZSIgdHlwZT0idWRkaTpmaW5kX3NlcnZpY2UiLz4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpbmRfc2VydmljZSI+CisJCTx4c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOmZpbmRRdWFsaWZpZXJzIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6bmFtZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTpjYXRlZ29yeUJhZyIgbWluT2NjdXJzPSIwIi8+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOnRNb2RlbEJhZyIgbWluT2NjdXJzPSIwIi8+CisJCTwveHNkOnNlcXVlbmNlPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnZW5lcmljIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWF4Um93cyIgdHlwZT0iaW50IiB1c2U9Im9wdGlvbmFsIi8+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImJ1c2luZXNzS2V5IiB0eXBlPSJ1ZGRpOmJ1c2luZXNzS2V5IiB1c2U9Im9wdGlvbmFsIi8+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9ImZpbmRfdE1vZGVsIiB0eXBlPSJ1ZGRpOmZpbmRfdE1vZGVsIi8+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaW5kX3RNb2RlbCI+CisJCTx4c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOmZpbmRRdWFsaWZpZXJzIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6bmFtZSIgbWluT2NjdXJzPSIwIi8+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOmlkZW50aWZpZXJCYWciIG1pbk9jY3Vycz0iMCIvPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTpjYXRlZ29yeUJhZyIgbWluT2NjdXJzPSIwIi8+CisJCTwveHNkOnNlcXVlbmNlPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnZW5lcmljIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWF4Um93cyIgdHlwZT0iaW50IiB1c2U9Im9wdGlvbmFsIi8+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9ImdldF9hc3NlcnRpb25TdGF0dXNSZXBvcnQiIHR5cGU9InVkZGk6Z2V0X2Fzc2VydGlvblN0YXR1c1JlcG9ydCIvPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZ2V0X2Fzc2VydGlvblN0YXR1c1JlcG9ydCI+CisJCTx4c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOmF1dGhJbmZvIi8+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOmNvbXBsZXRpb25TdGF0dXMiIG1pbk9jY3Vycz0iMCIvPgorCQk8L3hzZDpzZXF1ZW5jZT4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2VuZXJpYyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9ImdldF9hdXRoVG9rZW4iIHR5cGU9InVkZGk6Z2V0X2F1dGhUb2tlbiIvPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZ2V0X2F1dGhUb2tlbiI+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImdlbmVyaWMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1c2VySUQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjcmVkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iZ2V0X2JpbmRpbmdEZXRhaWwiIHR5cGU9InVkZGk6Z2V0X2JpbmRpbmdEZXRhaWwiLz4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImdldF9iaW5kaW5nRGV0YWlsIj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6YmluZGluZ0tleSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImdlbmVyaWMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJnZXRfYnVzaW5lc3NEZXRhaWwiIHR5cGU9InVkZGk6Z2V0X2J1c2luZXNzRGV0YWlsIi8+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJnZXRfYnVzaW5lc3NEZXRhaWwiPgorCQk8eHNkOnNlcXVlbmNlPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTpidXNpbmVzc0tleSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImdlbmVyaWMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJnZXRfYnVzaW5lc3NEZXRhaWxFeHQiIHR5cGU9InVkZGk6Z2V0X2J1c2luZXNzRGV0YWlsRXh0Ii8+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJnZXRfYnVzaW5lc3NEZXRhaWxFeHQiPgorCQk8eHNkOnNlcXVlbmNlPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTpidXNpbmVzc0tleSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImdlbmVyaWMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJnZXRfcHVibGlzaGVyQXNzZXJ0aW9ucyIgdHlwZT0idWRkaTpnZXRfcHVibGlzaGVyQXNzZXJ0aW9ucyIvPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZ2V0X3B1Ymxpc2hlckFzc2VydGlvbnMiPgorCQk8eHNkOnNlcXVlbmNlPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTphdXRoSW5mbyIvPgorCQk8L3hzZDpzZXF1ZW5jZT4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2VuZXJpYyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9ImdldF9yZWdpc3RlcmVkSW5mbyIgdHlwZT0idWRkaTpnZXRfcmVnaXN0ZXJlZEluZm8iLz4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImdldF9yZWdpc3RlcmVkSW5mbyI+CisJCTx4c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOmF1dGhJbmZvIi8+CisJCTwveHNkOnNlcXVlbmNlPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnZW5lcmljIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iZ2V0X3NlcnZpY2VEZXRhaWwiIHR5cGU9InVkZGk6Z2V0X3NlcnZpY2VEZXRhaWwiLz4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImdldF9zZXJ2aWNlRGV0YWlsIj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6c2VydmljZUtleSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImdlbmVyaWMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJnZXRfdE1vZGVsRGV0YWlsIiB0eXBlPSJ1ZGRpOmdldF90TW9kZWxEZXRhaWwiLz4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImdldF90TW9kZWxEZXRhaWwiPgorCQk8eHNkOnNlcXVlbmNlPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTp0TW9kZWxLZXkiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCTwveHNkOnNlcXVlbmNlPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnZW5lcmljIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0ic2F2ZV9iaW5kaW5nIiB0eXBlPSJ1ZGRpOnNhdmVfYmluZGluZyIvPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2F2ZV9iaW5kaW5nIj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6YXV0aEluZm8iLz4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6YmluZGluZ1RlbXBsYXRlIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQk8L3hzZDpzZXF1ZW5jZT4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2VuZXJpYyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9InNhdmVfYnVzaW5lc3MiIHR5cGU9InVkZGk6c2F2ZV9idXNpbmVzcyIvPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2F2ZV9idXNpbmVzcyI+CisJCTx4c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOmF1dGhJbmZvIi8+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOmJ1c2luZXNzRW50aXR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOnVwbG9hZFJlZ2lzdGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCTwveHNkOnNlcXVlbmNlPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnZW5lcmljIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0ic2F2ZV9zZXJ2aWNlIiB0eXBlPSJ1ZGRpOnNhdmVfc2VydmljZSIvPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2F2ZV9zZXJ2aWNlIj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6YXV0aEluZm8iLz4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6YnVzaW5lc3NTZXJ2aWNlIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQk8L3hzZDpzZXF1ZW5jZT4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2VuZXJpYyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9InNhdmVfdE1vZGVsIiB0eXBlPSJ1ZGRpOnNhdmVfdE1vZGVsIi8+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzYXZlX3RNb2RlbCI+CisJCTx4c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOmF1dGhJbmZvIi8+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOnRNb2RlbCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTp1cGxvYWRSZWdpc3RlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQk8L3hzZDpzZXF1ZW5jZT4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2VuZXJpYyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9InNldF9wdWJsaXNoZXJBc3NlcnRpb25zIiB0eXBlPSJ1ZGRpOnNldF9wdWJsaXNoZXJBc3NlcnRpb25zIi8+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXRfcHVibGlzaGVyQXNzZXJ0aW9ucyI+CisJCTx4c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOmF1dGhJbmZvIi8+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOnB1Ymxpc2hlckFzc2VydGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQk8L3hzZDpzZXF1ZW5jZT4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2VuZXJpYyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9InZhbGlkYXRlX3ZhbHVlcyIgdHlwZT0idWRkaTp2YWxpZGF0ZV92YWx1ZXMiLz4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhbGlkYXRlX3ZhbHVlcyI+CisJCTx4c2Q6Y2hvaWNlPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTpidXNpbmVzc0VudGl0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTpidXNpbmVzc1NlcnZpY2UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6dE1vZGVsIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCTwveHNkOmNob2ljZT4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2VuZXJpYyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPCEtLSBUeXBlIGFuZCBlbGVtZW50IGRlZmluaXRpb25zIGZvciByZXNwb25zZSBtZXNzYWdlcyAtLT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iYXNzZXJ0aW9uU3RhdHVzUmVwb3J0IiB0eXBlPSJ1ZGRpOmFzc2VydGlvblN0YXR1c1JlcG9ydCIvPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXNzZXJ0aW9uU3RhdHVzUmVwb3J0Ij4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6YXNzZXJ0aW9uU3RhdHVzSXRlbSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQk8L3hzZDpzZXF1ZW5jZT4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2VuZXJpYyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wZXJhdG9yIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iYXV0aFRva2VuIiB0eXBlPSJ1ZGRpOmF1dGhUb2tlbiIvPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXV0aFRva2VuIj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6YXV0aEluZm8iLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImdlbmVyaWMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRvciIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9ImJpbmRpbmdEZXRhaWwiIHR5cGU9InVkZGk6YmluZGluZ0RldGFpbCIvPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmluZGluZ0RldGFpbCI+CisJCTx4c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOmJpbmRpbmdUZW1wbGF0ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQk8L3hzZDpzZXF1ZW5jZT4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2VuZXJpYyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wZXJhdG9yIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idHJ1bmNhdGVkIiB0eXBlPSJ1ZGRpOnRydW5jYXRlZCIgdXNlPSJvcHRpb25hbCIvPgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJidXNpbmVzc0RldGFpbCIgdHlwZT0idWRkaTpidXNpbmVzc0RldGFpbCIvPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYnVzaW5lc3NEZXRhaWwiPgorCQk8eHNkOnNlcXVlbmNlPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTpidXNpbmVzc0VudGl0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQk8L3hzZDpzZXF1ZW5jZT4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2VuZXJpYyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wZXJhdG9yIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idHJ1bmNhdGVkIiB0eXBlPSJ1ZGRpOnRydW5jYXRlZCIgdXNlPSJvcHRpb25hbCIvPgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJidXNpbmVzc0RldGFpbEV4dCIgdHlwZT0idWRkaTpidXNpbmVzc0RldGFpbEV4dCIvPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYnVzaW5lc3NEZXRhaWxFeHQiPgorCQk8eHNkOnNlcXVlbmNlPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTpidXNpbmVzc0VudGl0eUV4dCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImdlbmVyaWMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRvciIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InRydW5jYXRlZCIgdHlwZT0idWRkaTp0cnVuY2F0ZWQiIHVzZT0ib3B0aW9uYWwiLz4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iYnVzaW5lc3NMaXN0IiB0eXBlPSJ1ZGRpOmJ1c2luZXNzTGlzdCIvPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYnVzaW5lc3NMaXN0Ij4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6YnVzaW5lc3NJbmZvcyIvPgorCQk8L3hzZDpzZXF1ZW5jZT4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2VuZXJpYyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wZXJhdG9yIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idHJ1bmNhdGVkIiB0eXBlPSJ1ZGRpOnRydW5jYXRlZCIgdXNlPSJvcHRpb25hbCIvPgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJwdWJsaXNoZXJBc3NlcnRpb25zIiB0eXBlPSJ1ZGRpOnB1Ymxpc2hlckFzc2VydGlvbnMiLz4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InB1Ymxpc2hlckFzc2VydGlvbnMiPgorCQk8eHNkOnNlcXVlbmNlPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTpwdWJsaXNoZXJBc3NlcnRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImdlbmVyaWMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRvciIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImF1dGhvcml6ZWROYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0icmVnaXN0ZXJlZEluZm8iIHR5cGU9InVkZGk6cmVnaXN0ZXJlZEluZm8iLz4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlZ2lzdGVyZWRJbmZvIj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6YnVzaW5lc3NJbmZvcyIvPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTp0TW9kZWxJbmZvcyIvPgorCQk8L3hzZDpzZXF1ZW5jZT4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2VuZXJpYyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wZXJhdG9yIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idHJ1bmNhdGVkIiB0eXBlPSJ1ZGRpOnRydW5jYXRlZCIgdXNlPSJvcHRpb25hbCIvPgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZWxhdGVkQnVzaW5lc3Nlc0xpc3QiIHR5cGU9InVkZGk6cmVsYXRlZEJ1c2luZXNzZXNMaXN0Ii8+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGVkQnVzaW5lc3Nlc0xpc3QiPgorCQk8eHNkOnNlcXVlbmNlPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTpidXNpbmVzc0tleSIvPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTpyZWxhdGVkQnVzaW5lc3NJbmZvcyIvPgorCQk8L3hzZDpzZXF1ZW5jZT4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2VuZXJpYyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wZXJhdG9yIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idHJ1bmNhdGVkIiB0eXBlPSJ1ZGRpOnRydW5jYXRlZCIgdXNlPSJvcHRpb25hbCIvPgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlRGV0YWlsIiB0eXBlPSJ1ZGRpOnNlcnZpY2VEZXRhaWwiLz4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZpY2VEZXRhaWwiPgorCQk8eHNkOnNlcXVlbmNlPgorCQkJPHhzZDplbGVtZW50IHJlZj0idWRkaTpidXNpbmVzc1NlcnZpY2UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImdlbmVyaWMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRvciIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InRydW5jYXRlZCIgdHlwZT0idWRkaTp0cnVuY2F0ZWQiIHVzZT0ib3B0aW9uYWwiLz4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZUxpc3QiIHR5cGU9InVkZGk6c2VydmljZUxpc3QiLz4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZpY2VMaXN0Ij4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6c2VydmljZUluZm9zIi8+CisJCTwveHNkOnNlcXVlbmNlPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnZW5lcmljIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3BlcmF0b3IiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0cnVuY2F0ZWQiIHR5cGU9InVkZGk6dHJ1bmNhdGVkIiB1c2U9Im9wdGlvbmFsIi8+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9InRNb2RlbERldGFpbCIgdHlwZT0idWRkaTp0TW9kZWxEZXRhaWwiLz4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRNb2RlbERldGFpbCI+CisJCTx4c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJ1ZGRpOnRNb2RlbCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImdlbmVyaWMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRvciIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InRydW5jYXRlZCIgdHlwZT0idWRkaTp0cnVuY2F0ZWQiIHVzZT0ib3B0aW9uYWwiLz4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0idE1vZGVsTGlzdCIgdHlwZT0idWRkaTp0TW9kZWxMaXN0Ii8+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0TW9kZWxMaXN0Ij4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InVkZGk6dE1vZGVsSW5mb3MiLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImdlbmVyaWMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRvciIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InRydW5jYXRlZCIgdHlwZT0idWRkaTp0cnVuY2F0ZWQiIHVzZT0ib3B0aW9uYWwiLz4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKzwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3dzZGwvTWFrZWZpbGUgYi93c2RsL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZWFkOTMKLS0tIC9kZXYvbnVsbAorKysgYi93c2RsL01ha2VmaWxlCkBAIC0wLDAgKzEsNDIgQEAKK0dTT0FQPS4uL3NvYXBjcHAyCitTT0FQSD0uLi9zdGRzb2FwMi5oCitTT0FQQz0uLi9zdGRzb2FwMi5jCitTT0FQQ1BQPS4uL3N0ZHNvYXAyLmNwcAorQ0M9Z2NjCitDUFA9ZysrCitMSUJTPS91c3IvbGliL2xpYmwuYSAtbG0KK0NPRkxBR1M9LU8xCisjQ09GTEFHUz0tRERFQlVHIC1nCitDV0ZMQUdTPS1XYWxsCitDSUZMQUdTPS1JLi4KK0NNRkxBR1M9CitDRkxBR1M9ICQoQ1dGTEFHUykgJChDT0ZMQUdTKSAkKENJRkxBR1MpICQoQ01GTEFHUykKK3dzZGwyaDoJCXdzZGxDLm8gd3NkbC5vIHNjaGVtYS5vIHNvYXAubyBtaW1lLm8gdHlwZXMubyBzZXJ2aWNlLm8gd3NkbDJoLmNwcCAkKFNPQVBDUFApCisJCSQoQ1BQKSAkKENGTEFHUykgLW8gd3NkbDJoIHdzZGwyaC5jcHAgd3NkbEMubyB3c2RsLm8gc2NoZW1hLm8gc29hcC5vIG1pbWUubyB0eXBlcy5vIHNlcnZpY2UubyAkKFNPQVBDUFApICQoTElCUykKKwkJY3AgLWYgd3NkbDJoIC4uCit3c2RsQy5vOgl3c2RsQy5jcHAKKwkJJChDUFApIC1jICQoQ0ZMQUdTKSB3c2RsQy5jcHAKK3dzZGxDLmNwcDoJc2NoZW1hLmggc29hcC5oIG1pbWUuaCBodHRwLmggd3NkbC5oIGluY2x1ZGVzLmggaW1wb3J0cy5oCisJCSQoR1NPQVApIC1DUyAtcHdzZGwgd3NkbC5oCit0eXBlcy5vOgl0eXBlcy5oIHR5cGVzLmNwcAorCQkkKENQUCkgLWMgJChDRkxBR1MpIHR5cGVzLmNwcAorc2VydmljZS5vOgl0eXBlcy5oIHNlcnZpY2UuaCBzZXJ2aWNlLmNwcAorCQkkKENQUCkgLWMgJChDRkxBR1MpIHNlcnZpY2UuY3BwCit3c2RsLm86CQl3c2RsLmggd3NkbC5jcHAgaW5jbHVkZXMuaCBpbXBvcnRzLmgKKwkJJChDUFApIC1jICQoQ0ZMQUdTKSB3c2RsLmNwcAorc2NoZW1hLm86CXNjaGVtYS5oIHNjaGVtYS5jcHAgaW5jbHVkZXMuaCBpbXBvcnRzLmgKKwkJJChDUFApIC1jICQoQ0ZMQUdTKSBzY2hlbWEuY3BwCitzb2FwLm86CQlzb2FwLmggc29hcC5jcHAgaW5jbHVkZXMuaCBpbXBvcnRzLmgKKwkJJChDUFApIC1jICQoQ0ZMQUdTKSBzb2FwLmNwcAorbWltZS5vOgkJbWltZS5oIG1pbWUuY3BwIGluY2x1ZGVzLmggaW1wb3J0cy5oCisJCSQoQ1BQKSAtYyAkKENGTEFHUykgbWltZS5jcHAKK3NlY3VyZToKKwkJdG91Y2ggd3NkbDJoLmNwcAorCQltYWtlIHdzZGwyaF9zZWN1cmUKK3dzZGwyaF9zZWN1cmU6CXdzZGxDLm8gd3NkbC5jcHAgc2NoZW1hLmNwcCBzb2FwLm8gbWltZS5vIHR5cGVzLm8gc2VydmljZS5vIHdzZGwyaC5jcHAgJChTT0FQQ1BQKQorCQkkKENQUCkgJChDRkxBR1MpIC1EV0lUSF9PUEVOU1NMIC1vIHdzZGwyaCB3c2RsMmguY3BwIHdzZGxDLm8gd3NkbC5jcHAgc2NoZW1hLmNwcCBzb2FwLm8gbWltZS5vIHR5cGVzLm8gc2VydmljZS5vICQoU09BUENQUCkgLWxjcnlwdG8gLWxzc2wKKwkJY3AgLWYgd3NkbDJoIC4uCitjbGVhbjoJCQorCQlybSAtZiAqLm8gd3NkbEguaCB3c2RsU3R1Yi5oIHdzZGxDLmNwcCB3c2RsQ2xpZW50LmNwcCB3c2RsU2VydmVyLmNwcCB3c2RsQ2xpZW50TGliLmNwcCB3c2RsU2VydmVyTGliLmNwcAorZGlzdGNsZWFuOgkJCisJCXJtIC1mICoubyAqLndzZGwuICoueHNkICoueG1sICoubnNtYXAgd3NkbDJoIHdzZGxILmggd3NkbFN0dWIuaCB3c2RsQy5jcHAgd3NkbENsaWVudC5jcHAgd3NkbFNlcnZlci5jcHAgd3NkbENsaWVudExpYi5jcHAgd3NkbFNlcnZlckxpYi5jcHAKZGlmZiAtLWdpdCBhL3dzZGwvTWFrZWZpbGVTb2xhcmlzIGIvd3NkbC9NYWtlZmlsZVNvbGFyaXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmViZTY1ZAotLS0gL2Rldi9udWxsCisrKyBiL3dzZGwvTWFrZWZpbGVTb2xhcmlzCkBAIC0wLDAgKzEsNDAgQEAKK0dTT0FQPS4uL3NvYXBjcHAyCitTT0FQSD0uLi9zdGRzb2FwMi5oCitTT0FQQz0uLi9zdGRzb2FwMi5jCitTT0FQQ1BQPS4uL3N0ZHNvYXAyLmNwcAorQ0M9Z2NjCitDUFA9ZysrCitMSUJTPS1seG5ldCAtbG5zbCAtbHNvY2tldAorQ09GTEFHUz0tTzEKK0NXRkxBR1M9LVdhbGwKK0NJRkxBR1M9LUkuLgorQ01GTEFHUz0KK0NGTEFHUz0gJChDV0ZMQUdTKSAkKENPRkxBR1MpICQoQ0lGTEFHUykgJChDTUZMQUdTKQord3NkbDJoOgkJd3NkbEMubyB3c2RsLm8gc2NoZW1hLm8gc29hcC5vIG1pbWUubyB0eXBlcy5vIHNlcnZpY2UubyB3c2RsMmguY3BwICQoU09BUENQUCkKKwkJJChDUFApIC1zICQoQ0ZMQUdTKSAtbyB3c2RsMmggd3NkbDJoLmNwcCB3c2RsQy5vIHdzZGwubyBzY2hlbWEubyBzb2FwLm8gbWltZS5vIHR5cGVzLm8gc2VydmljZS5vICQoU09BUENQUCkgJChMSUJTKQorCQljcCAtZiB3c2RsMmggLi4KK3dzZGxDLm86CXNjaGVtYS5oIHNvYXAuaCBtaW1lLmggZGltZS5oIGh0dHAuaCB3c2RsLmggaW5jbHVkZXMuaCBpbXBvcnRzLmgKKwkJJChHU09BUCkgLVNDIC1wd3NkbCB3c2RsLmgKKwkJJChDUFApIC1jICQoQ0ZMQUdTKSB3c2RsQy5jcHAKK3R5cGVzLm86CXR5cGVzLmggdHlwZXMuY3BwCisJCSQoQ1BQKSAtYyAkKENGTEFHUykgdHlwZXMuY3BwCitzZXJ2aWNlLm86CXR5cGVzLmggc2VydmljZS5oIHNlcnZpY2UuY3BwCisJCSQoQ1BQKSAtYyAkKENGTEFHUykgc2VydmljZS5jcHAKK3dzZGwubzoJCXdzZGwuaCB3c2RsLmNwcCBpbmNsdWRlcy5oIGltcG9ydHMuaAorCQkkKENQUCkgLWMgJChDRkxBR1MpIHdzZGwuY3BwCitzY2hlbWEubzoJc2NoZW1hLmggc2NoZW1hLmNwcCBpbmNsdWRlcy5oIGltcG9ydHMuaAorCQkkKENQUCkgLWMgJChDRkxBR1MpIHNjaGVtYS5jcHAKK3NvYXAubzoJCXNvYXAuaCBzb2FwLmNwcCBpbmNsdWRlcy5oIGltcG9ydHMuaAorCQkkKENQUCkgLWMgJChDRkxBR1MpIHNvYXAuY3BwCittaW1lLm86CQltaW1lLmggbWltZS5jcHAgaW5jbHVkZXMuaCBpbXBvcnRzLmgKKwkJJChDUFApIC1jICQoQ0ZMQUdTKSBtaW1lLmNwcAorc2VjdXJlOgorCQl0b3VjaCB3c2RsMmguY3BwCisJCW1ha2Ugd3NkbDJoX3NlY3VyZQord3NkbDJoX3NlY3VyZToJd3NkbEMubyB3c2RsLmNwcCBzY2hlbWEuY3BwIHNvYXAubyBtaW1lLm8gdHlwZXMubyBzZXJ2aWNlLm8gd3NkbDJoLmNwcCAkKFNPQVBDUFApCisJCSQoQ1BQKSAkKENGTEFHUykgLURXSVRIX09QRU5TU0wgLW8gd3NkbDJoIHdzZGwyaC5jcHAgd3NkbEMubyB3c2RsLmNwcCBzY2hlbWEuY3BwIHNvYXAubyBtaW1lLm8gdHlwZXMubyBzZXJ2aWNlLm8gJChTT0FQQ1BQKSAtbGNyeXB0byAtbHNzbCAkKExJQlMpCisJCWNwIC1mIHdzZGwyaCAuLgorY2xlYW46CQkKKwkJcm0gLWYgKi5vIHdzZGxILmggd3NkbFN0dWIuaCB3c2RsQy5jcHAgd3NkbENsaWVudC5jcHAgd3NkbFNlcnZlci5jcHAgd3NkbENsaWVudExpYi5jcHAgd3NkbFNlcnZlckxpYi5jcHAKK2Rpc3RjbGVhbjoJCQorCQlybSAtZiAqLm8gKi53c2RsLiAqLnhzZCAqLnhtbCAqLm5zbWFwIHdzZGwyaCB3c2RsSC5oIHdzZGxTdHViLmggd3NkbEMuY3BwIHdzZGxDbGllbnQuY3BwIHdzZGxTZXJ2ZXIuY3BwIHdzZGxDbGllbnRMaWIuY3BwIHdzZGxTZXJ2ZXJMaWIuY3BwCmRpZmYgLS1naXQgYS93c2RsL1JFQURNRS50eHQgYi93c2RsL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI3NTM5ZQotLS0gL2Rldi9udWxsCisrKyBiL3dzZGwvUkVBRE1FLnR4dApAQCAtMCwwICsxLDE3OSBAQAorVGhlIGdTT0FQIFdTREwgcGFyc2VyICd3c2RsMmgnCisKK0lOU1RSVUNUSU9OUworCitUaGUgZ1NPQVAgV1NETCBwYXJzZXIgY29udmVydHMgb25lIG9yIG1vcmUgV1NETHMgaW50byBhIGdTT0FQIGhlYWRlciBmaWxlIGZvcgorcHJvY2Vzc2luZyB3aXRoIHRoZSBnU09BUCBzb2FwY3BwMiBjb21waWxlciB0byBnZW5lcmF0ZSBjbGllbnQgc3R1YnMvcHJveGllcworYW5kIHNlcnZlciBza2VsZXRvbnMvb2JqZWN0cyB0byBhY2Nlc3Mgc2VydmljZXMgb3IgYnVpbGQgbmV3IHNlcnZpY2VzLgorCitGb3IgZXhhbXBsZToKKworJCB3c2RsMmggLW8gWE1ldGhvZHNRdWVyeS5oIGh0dHA6Ly93d3cueG1ldGhvZHMubmV0L3dzZGwvcXVlcnkud3NkbAorCitUaGlzIGdlbmVyYXRlcyB0aGUgWE1ldGhvZHNRdWVyeS5oIGhlYWRlciBmaWxlIHdpdGggV2ViIHNlcnZpY2Ugb3BlcmF0aW9ucworYW5kIEMrKyBkYXRhIHR5cGVzLiBUaGlzIGhlYWRlciBmaWxlIGlzIGludGVuZGVkIHRvIGJlIHByb2Nlc3NlZCB3aXRoIHNvYXBjcHAyCit0byBnZW5lcmF0ZSB0aGUgc3R1YiBhbmQvb3Igc2tlbGV0b24gY29kZS4KKworWW91IG5lZWQgdG8gaGF2ZSBzdGx2ZWN0b3IuaCBwcmVzZW50IGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSAoc3RsdmVjdG9yLmggaXMKK2luIHRoZSBwYWNrYWdlKSB0byBzdXBwb3J0IFNUTCB2ZWN0b3JzLiBUbyBidWlsZCB3aXRob3V0IFNUTCwgdXNlIG9wdGlvbiAtczoKKworJCB3c2RsMmggLXMgLW8gWE1ldGhvZHNRdWVyeS5oIGh0dHA6Ly93d3cueG1ldGhvZHMubmV0L3dzZGwvcXVlcnkud3NkbAorCitPciB0byBidWlsZCBhIHB1cmUgQyBhcHBsaWNhdGlvbiwgdXNlIG9wdGlvbiAtYzoKKworJCB3c2RsMmggLWMgLW8gWE1ldGhvZHNRdWVyeS5oIGh0dHA6Ly93d3cueG1ldGhvZHMubmV0L3dzZGwvcXVlcnkud3NkbAorCitPdGhlciB1c2VmdWwgb3B0aW9ucyB0byBjb250cm9sIHRoZSBvdXRwdXQgYXJlIC1lIGFuZCAteSAoc2VlIGJlbG93KS4KKworVGhlIGFib3ZlIGNvbW1hbmRzIGFyZSB0byBiZSBmb2xsb3dlZCBieSB0aGUgc29hcGNwcDIgY29tcGlsYXRpb24gcGhhc2U6CisKKyQgc29hcGNwcDIgLUMgWE1ldGhvZHNRdWVyeS5oCisKK1doZXJlIG9wdGlvbiAtQyBpbmRpY2F0ZXMgY2xpZW50LXNpZGUgb25seSBmaWxlcyAoc29hcGNwcDIgZ2VuZXJhdGVzIGJvdGgKK2NsaWVudCBhbmQgc2VydmVyIHN0dWJzIGFuZCBza2VsZXRvbnMgYnkgZGVmYXVsdCkuCisKK1RoZSBnZW5lcmF0ZWQgWE1ldGhvZHNRdWVyeS5oIGluY2x1ZGVzIHRoZSBkZWZpbml0aW9ucyBvZiBkYXRhIHR5cGVzIGFuZAorc2VydmljZSBvcGVyYXRpb25zIG9mIHRoZSBYTWV0aG9kcyBRdWVyeSBXZWIgc2VydmljZS4gVG8gZGV2ZWxvcCBhIEMrKyBjbGllbnQKK2FwcGxpY2F0aW9uLCB5b3UgY2FuIHVzZSB0aGUgZ2VuZXJhdGVkICdzb2FwWE1ldGhvZHNRdWVyeVNvYXBQcm94eScgY2xhc3MgYW5kCisnWE1ldGhvZHNRdWVyeVNvYXAubnNtYXAnIFhNTCBuYW1lc3BhY2UgdGFibGUgdG8gYWNjZXNzIHRoZSBXZWIgc2VydmljZS4gQm90aAorbmVlZCB0byBiZSAnI2luY2x1ZGUnZCBpbiB5b3VyIHNvdXJjZS4gVGhlbiBjb21waWxlIGFuZCBsaW5rIHRoZSBzb2FwQy5jcHAsCitzb2FwQ2xpZW50LmNwcCwgYW5kIHN0ZHNvYXAyLmNwcCBzb3VyY2VzIHRvIGNvbXBsZXRlIHRoZSBidWlsZC4gTW9yZQoraW5mb3JtYXRpb24gb24gdGhpcyBwcm9jZXNzIGNhbiBiZSBmb3VuZCBpbiB0aGUgZ1NPQVAgZG9jdW1lbnRhdGlvbi4KKworV2hlbiBwYXJzaW5nIGEgV1NETCwgdGhlIG91dHB1dCBmaWxlIG5hbWUgaXMgdGhlIFdTREwgaW5wdXQgZmlsZSBuYW1lIHdpdGgKK2V4dGVuc2lvbiAnLmgnIGluc3RlYWQgb2YgJy53c2RsJy4gV2hlbiBhbiBpbnB1dCBmaWxlIGlzIGFic2VudCBvciBhIFdTREwgZmlsZQorZnJvbSBhIFdlYiBsb2NhdGlvbiBpcyBhY2Nlc3NlZCwgdGhlIGhlYWRlciBvdXRwdXQgd2lsbCBiZSBwcm9kdWNlZCBvbiB0aGUKK3N0YW5kYXJkIG91dHB1dC4gSW5wdXQgbWF5IGFsc28gY29uc2lzdCBvZiBzY2hlbWEgZmlsZXMsIHdoaWNoIGlzIHVzZWZ1bCB3aGVuCit5b3UgdG8gbmVlZCB0byBnZW5lcmF0ZSBjb2RlIGZvciBzZXJpYWxpemluZyBzY2hlbWEgaW5zdGFuY2VzLgorCitVU0lORyBBIFRZUEVNQVAgRklMRSBUTyBDT05UUk9MIFRIRSBPVVRQVVQKKworVGhlIHR5cGVtYXAuZGF0IGZpbGUgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIG5hbWVzcGFjZSBwcmVmaXggYW5kIHR5cGUgYmluZGluZ3MKK2ZvciB0aGUgZ2VuZXJhdGVkIGhlYWRlciBmaWxlcyBieSB0aGUgJ3dzZGwyaCcgdG9vbC4gVGhlIHR5cGVtYXAuZGF0IGlzIHRoZQorZGVmYXVsdCBmaWxlIHByb2Nlc3NlZCBieSAnd3NkbDJoJyB0byBjdXN0b21pemUgaXRzIG91dHB1dC4gWW91IGNhbiB1c2Ugd3NkbDJoCitvcHRpb24gLXQgdG8gc3BlY2lmeSBhbiBhbHRlcm5hdGUgZmlsZS4KKworWE1MIG5hbWVzcGFjZSBwcmVmaXggYmluZGluZ3MgY2FuIGJlIHByb3ZpZGVkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGNob2ljZSBvZgordGhlIG5zMSwgbnMyLCAuLi4gcHJlZml4ZXMgZ2VuZXJhdGVkIGJ5ICd3c2RsMmgnLiAgSXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRvCitwcm92aWRlIG5hbWVzcGFjZSBwcmVmaXhlcyBmb3IgeW91ciBwcm9qZWN0J3MgWE1MIG5hbWVzcGFjZXMuIEluIHRoaXMgd2F5LAorY2hhbmdlcyB0byB0aGUgV1NETCAob3IgbmV3ZXIgcmVsZWFzZXMgb2Ygd3NkbDJoKSB3aWxsIGhhdmUgYSBtaW5pbWFsIGltcGFjdCBvbgorY29kaW5nLgorCitCaW5kaW5ncyBmb3IgbmFtZXNwYWNlIHByZWZpeGVzIGFyZSBvZiB0aGUgZm9ybToKKwlwcmVmaXggPSAiVVJJIgorCitGb3IgZXhhbXBsZSwgdG8gYmluZCB0aGUgJ2dvb2dsZScgcHJlZml4IHRvIHRoZSBHb29nbGUgQVBJJ3MgbmFtZXNwYWNlOgorCWdvb2dsZSA9ICJ1cm46R29vZ2xlU2VhcmNoIgorCitUeXBlIGJpbmRpbmdzIGNhbiBieSBwcm92aWRlZCB0byBiaW5kIFhNTCBzY2hlbWEgdHlwZXMgdG8gQy9DKysgdHlwZXMgZm9yIHlvdXIKK3Byb2plY3QuCisKK1R5cGUgYmluZGluZ3MgYXJlIG9mIHRoZSBmb3JtOgorCXByZWZpeF9fdHlwZSA9IGRlY2xhcmF0aW9uIHwgdXNlIHwgcHRyLXVzZQord2hlcmUgJ2RlY2xhcmF0aW9uJyBpbnRyb2R1Y2VzIHRoZSB0eXBlIGluIHRoZSBoZWFkZXIgZmlsZSwgJ3VzZScgc3BlY2lmaWVzIGhvdwordGhlIHR5cGUgaXMgdXNlZCBkaXJlY3RseSwgJ3B0ci11c2UnIHNwZWNpZmllcyBob3cgdGhlIHR5cGUgaXMgdXNlZCBhcyBhCitwb2ludGVyIHR5cGUuCisKK0ZvciBleGFtcGxlOgorCXhzZF9fc3RyaW5nID0gfCBjaGFyKiB8IGNoYXIqCitBZnRlciBlbmFibGluZyB0aGlzIGxpbmUsIGFsbCBYU0Qgc3RyaW5ncyB3aWxsIGJlIG1hcHBlZCB0byBjaGFyKiBhbmQgc2luY2UKK2NoYXIqIGlzIGFscmVhZHkgYSBwb2ludGVyIHR5cGUsIHRoZSAncHRyLXVzZScgcGFydCBpcyB0aGUgc2FtZSBhcyAndXNlJyBwYXJ0LgorTm90ZSB0aGF0IHRoZSAnZGVjbGFyYXRpb24nIHBhcnQgaXMgZW1wdHkgaW4gdGhlc2UgY2FzZXMuCisKK01lbWJlciBkYXRhIGFuZCBmdW5jdGlvbnMgY2FuIGJlIHByb3ZpZGVkIHRvIGV4dGVuZCBhIGdlbmVyYXRlZCBzdHJ1Y3Qgb3IKK2NsYXNzLgorCitDbGFzcyBhbmQgc3RydWN0IGV4dGVuc2lvbnMgYXJlIG9mIHRoZSBmb3JtOgorCXByZWZpeF9fdHlwZSA9ICQgbWVtYmVyLWRlY2xhcmF0aW9uCisKK0ZvciBleGFtcGxlLCB0byBhZGQgYSBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciB0byBjbGFzcyBteW5zX19yZWNvcmQ6CisJbXluc19fcmVjb3JkID0gJCBteW5zX19yZWNvcmQoKTsKKwlteW5zX19yZWNvcmQgPSAkIH5teW5zX19yZWNvcmQoKTsKKwkKK0FueSBvdGhlciBtYXRlcmlhbCB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhdGVkIGhlYWRlciBmaWxlIGNhbiBiZSBwcm92aWRlZAorYnkgZW5jbG9zaW5nIHRoZSB0ZXh0IHdpdGhpbiBicmFja2V0cyBbIGFuZCBdLiBCcmFja2V0cyBNVVNUIGFwcGVhciBhdCB0aGUKK3N0YXJ0IG9mIGEgbmV3IGxpbmUuCisKK0ZvciBleGFtcGxlLCB0byBpbmNsdWRlIGEgbm90ZToKK1sKKy8vIFRPRE86IERvbid0IGZvcmdldCB0byBiaW5kIHRoZSBuYW1lc3BhY2UgcHJlZml4ZXMhCitdCitUaGlzIGNvbW1lbnQgYXBwZWFycyBhcyB0aGUgZmlyc3QgbGluZSBpbiB0aGUgZ2VuZXJhdGVkIGhlYWRlciBmaWxlLgorCitJTlBVVCBGT1JNQVRTCisKK3dzZGwyaCByZWFkcyBmcm9tIHN0YW5kYXJkIGlucHV0IG9yIHRoZSBmaWxlcyBwcm92aWRlZCBhdCB0aGUgY29tbWFuZCBsaW5lOgorCit3c2RsMmggW29wdGlvbnNdIFstbyBvdXRmaWxlLmhdIFtpbmZpbGUxLndzZGwgaW5maWxlMi53c2RsIGluZmlsZTMueHNkIC4uLiBdCisKK1ZhbGlkIGlucHV0IGZpbGUgZm9ybWF0cyBhcmUgLndzZGwgYW5kIC54c2QgKHNjaGVtYSkgZmlsZXMuCisKK011bHRpcGxlIHdzZGwgYW5kIHNjaGVtYSBmaWxlcyBjYW4gYmUgZ2l2ZW4sIHdoaWNoIHJlc3VsdHMgaW4gYSBjb25zb2xpZGF0ZWQKK2hlYWRlciBmaWxlIHdpdGggYWxsIGRlZmluaXRpb25zIGNvbWJpbmVkLgorCitPVVRQVVQgRk9STUFUCisKK1RoZSBvdXRwdXQgZmlsZSBpcyBhIGdTT0FQLWZvcm1hdHRlZCBoZWFkZXIgZmlsZS4gVGhlIGhlYWRlciBmaWxlIHN5bnRheCBpcworYXVnbWVudGVkIHdpdGggYW5ub3RhdGlvbnMgcmVmbGVjdGluZyBXU0RMIGFuZCBzY2hlbWEtc3BlY2lmaWMgYmluZGluZ3MgYW5kCit2YWxpZGF0aW9uIGNvbnN0cmFpbnRzLgorCitXZSBzdWdnZXN0IHRoZSB1c2Ugb2YgRG94eWdlbiAod3d3LmRveHlnZW4ub3JnKSB0byBwcm9kdWNlIGRvY3VtZW50ZWQgZm9yIHRoZQorZ2VuZXJhdGVkIGhlYWRlciBmaWxlLiBIb3dldmVyLCB3ZSBTVFJPTkdMWSByZWNvbW1lbmQgdXNlciB0byBpbnNwZWN0IHRoZQorZ2VuZXJhdGVkIGhlYWRlciBmaWxlIGZpcnN0IGZvciB3YXJuaW5ncyBhbmQgb3RoZXIgYW5ub3RhdGlvbnMgKHdoaWNoIGRvIG5vdAorYXBwZWFyIGluIERveHlnZW4ncyBvdXRwdXQpIGluZGljYXRpbmcgcG90ZW50aWFsIHByb2JsZW1zLgorCitOb3RlIHRoYXQgRG94eWdlbidzIGxpY2Vuc2UgbW9kZWwgZG9lcyBub3QgaW5maW5nZSBvbiB5b3VyIG93bmVyc2hpcCBvZiB0aGUKK2dlbmVyYXRlZCBnU09BUCBzb3VyY2UgY29kZSBvdXRwdXQgd2hlbiB5b3UgcHVyY2hhc2VkIGEgY29tbWVyY2lhbCBsaWNlbnNlLgorCitDT01NQU5EIExJTkUgT1BUSU9OUworCistYSAgICAgIGdlbmVyYXRlIGluZGV4ZWQgc3RydWN0IG5hbWVzIGZvciBsb2NhbCBlbGVtZW50cyB3aXRoIGFub255bW91cyB0eXBlcworLWMgICAgICBnZW5lcmF0ZSBDIHNvdXJjZSBjb2RlCistZCAgICAgIHVzZSBET00gdG8gcG9wdWxhdGUgeHM6YW55IGFuZCB4c2Q6YW55VHlwZSBlbGVtZW50cworLWUgICAgICBkb24ndCBxdWFsaWZ5IGVudW0gbmFtZXMKKy1mICAgICAgZ2VuZXJhdGUgZmxhdCBDKysgY2xhc3MgaGllcmFyY2h5CistZyAgICAgIGdlbmVyYXRlIGdsb2JhbCB0b3AtbGV2ZWwgZWxlbWVudCBkZWNsYXJhdGlvbnMKKy1oICAgICAgZGlzcGxheSBoZWxwIGluZm8KKy1JcGF0aCAgdXNlIHBhdGggdG8gZmluZCBmaWxlcworLWwgICAgICBpbmNsdWRlIGxpY2Vuc2UgaW5mb3JtYXRpb24gaW4gb3V0cHV0CistbSAgICAgIHVzZSB4c2QuaCBtb2R1bGUgdG8gaW1wb3J0IHByaW1pdGl2ZSB0eXBlcworLW5uYW1lICB1c2UgbmFtZSBhcyB0aGUgYmFzZSBuYW1lc3BhY2UgcHJlZml4IGluc3RlYWQgb2YgJ25zJworLU5uYW1lICB1c2UgbmFtZSBhcyB0aGUgYmFzZSBuYW1lc3BhY2UgcHJlZml4IGZvciBzZXJ2aWNlIG5hbWVzcGFjZXMKKy1vZmlsZSAgb3V0cHV0IHRvIGZpbGUKKy1wICAgICAgY3JlYXRlIHBvbHltb3JwaGljIHR5cGVzIHdpdGggQysrIGluaGVyaXRhbmNlIHdpdGggYmFzZSB4c2RfX2FueVR5cGUKKy1yaG9zdDpwb3J0CisgICAgICAgIGNvbm5lY3QgdmlhIHByb3h5IGhvc3QgYW5kIHBvcnQKKy1zICAgICAgZG9uJ3QgZ2VuZXJhdGUgU1RMIGNvZGUgKG5vIHN0ZDo6c3RyaW5nIGFuZCBubyBzdGQ6OnZlY3RvcikKKy10ZmlsZSAgdXNlIHR5cGUgbWFwIGZpbGUgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBmaWxlIHR5cGVtYXAuZGF0CistdSAgICAgIGRvbid0IGdlbmVyYXRlIHVuaW9ucworLXYgICAgICB2ZXJib3NlIG91dHB1dAorLXcgICAgICBhbHdheXMgd3JhcCByZXNwb25zZSBwYXJhbWV0ZXJzIGluIGEgcmVzcG9uc2Ugc3RydWN0ICg8PTEuMS40IGJlaGF2aW9yKQorLXggICAgICBkb24ndCBnZW5lcmF0ZSBfWE1MIGFueS9hbnlBdHRyaWJ1dGUgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cworLXkgICAgICBnZW5lcmF0ZSB0eXBlZGVmIHN5bm9ueW1zIGZvciBzdHJ1Y3RzIGFuZCBlbnVtcworaW5maWxlLndzZGwgaW5maWxlLnhzZCBodHRwOi8vd3d3Li4uIGxpc3Qgb2YgaW5wdXQgc291cmNlcyAoaWYgbm9uZSB1c2Ugc3RkaW4pCisKK0RPQ1VNRU5UQVRJT04KKworU2VlIHNvYXBkb2MyLnBkZiBmb3IgZG9jdW1lbnRhdGlvbi4KKworSU5TVEFMTEFUSU9OCisKK1R5cGUgJ21ha2UnIGluIHRoZSAnd3NkbCcgZGlyZWN0b3J5IHRvIGJ1aWxkIHdzZGwyaC4gWW91IG11c3QgZmlyc3QgaW5zdGFsbCB0aGUKK2dTT0FQIHBhY2thZ2UgYW5kIGJ1aWxkIHRoZSBnU09BUCBjb21waWxlciBzb2FwY3BwMiB0byByZWJ1aWxkIHRoZSB3c2RsMmggV1NETAorcGFyc2VyLgorCitVU0lORyBTU0wgRk9SIEhUVFBTIFRSQU5TRkVSIE9GIFdTREwgRklMRVMKKworWW91IG11c3QgYnVpbGQgdGhlIFdTREwgcGFyc2VyIHdpdGggJ21ha2Ugc2VjdXJlJyB0byBidWlsZCBhbiBTU0wtZW5hYmxlZAordmVyc2lvbiBvZiB3c2RsMmggdGhhdCBjYW4gYWNjZXNzIEhUVFBTIHNlY3VyZSBzaXRlcy4KKworTElDRU5TRQorCitUaGUgZ1NPQVAgV1NETCBwYXJzZXIgJ3dzZGwyaCcgYW5kIHNvdXJjZSBjb2RlIGFyZSByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgorU2VlIGdwbC50eHQgZm9yIG1vcmUgZGV0YWlscy4gQSBjb21tZXJjaWFsIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYS4KK1BsZWFzZSB2aXNpdCBodHRwOi8vZ2VuaXZpYS5jb20vUHJvZHVjdHMvZ3NvYXAvY29udHJhY3QuaHRtbAorCitDT1BZUklHSFQgTk9USUNFCisKK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMC0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KZGlmZiAtLWdpdCBhL3dzZGwvZGltZS5oIGIvd3NkbC9kaW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNlZDMyNAotLS0gL2Rldi9udWxsCisrKyBiL3dzZGwvZGltZS5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisKK2RpbWUuaAorCitXU0RML0RJTUUgYmluZGluZyBzY2hlbWEKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMS0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyB0d28gbGljZW5zZXM6CitHUEwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKi8KKworLy9nc29hcCBkaW1lIHNjaGVtYSBkb2N1bWVudGF0aW9uOglXU0RML0RJTUUgYmluZGluZyBzY2hlbWEKKy8vZ3NvYXAgZGltZSBzY2hlbWEgbmFtZXNwYWNlOgkJaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMi8wNC9kaW1lL3dzZGwvCisKKyNpbXBvcnQgImltcG9ydHMuaCIKKworY2xhc3MgZGltZV9fbWVzc2FnZQoreyBwdWJsaWM6CisJQHhzZF9fYW55VVJJCQkJbGF5b3V0OworLy8JQHhzZF9fYm9vbGVhbgkJCXdzZGxfX3JlcXVpcmVkOworfTsKZGlmZiAtLWdpdCBhL3dzZGwvZ3BsLnR4dCBiL3dzZGwvZ3BsLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzQyMzdhCi0tLSAvZGV2L251bGwKKysrIGIvd3NkbC9ncGwudHh0CkBAIC0wLDAgKzEsMzA5IEBACitUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkKKworVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlCiszMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoaXMgbGljZW5zZQorZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworUHJlYW1ibGUKKworVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91ciBmcmVlZG9tIHRvIHNoYXJlCithbmQgY2hhbmdlIGl0LiBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGludGVuZGVkIHRvCitndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZQorc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdAorb2YgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZQorYXV0aG9ycyBjb21taXQgdG8gdXNpbmcgaXQuIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcworY292ZXJlZCBieSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgWW91IGNhbiBhcHBseSBpdCB0bworeW91ciBwcm9ncmFtcywgdG9vLgorCitXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90IHByaWNlLiBPdXIKK0dlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSB0aGUgZnJlZWRvbSB0bworZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IgdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwKK3RoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdCBpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZQordGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQgaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdQorY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZCBhbnlvbmUgdG8gZGVueQoreW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLiBUaGVzZSByZXN0cmljdGlvbnMKK3RyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCitzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlciBncmF0aXMgb3IgZm9yCithIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0IHlvdSBoYXZlLiBZb3UgbXVzdCBtYWtlCitzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZSBjb2RlLiBBbmQgeW91IG11c3Qgc2hvdyB0aGVtCit0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIgcmlnaHRzLgorCitXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kICgyKQorb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlCithbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KKworQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4gdGhhdAorZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlIHNvZnR3YXJlLiBJZiB0aGUKK3NvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZSB3YW50IGl0cyByZWNpcGllbnRzIHRvCitrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28gdGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZAorYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsIGF1dGhvcnMnIHJlcHV0YXRpb25zLgorCitGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZSBwYXRlbnRzLiBXZSB3aXNoCit0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlIHByb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkKK29idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlIHByb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50Cit0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkgcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MKK2ZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCisKK1RoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbgorZm9sbG93LgorCitURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucyBhIG5vdGljZQorcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mCit0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuIFRoZSAiUHJvZ3JhbSIsIGJlbG93LCByZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbQorb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iIG1lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkKK2Rlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OiB0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlCitQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IKK3RyYW5zbGF0ZWQgaW50byBhbm90aGVyIGxhbmd1YWdlLiAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQKK2xpbWl0YXRpb24gaW4gdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QgY292ZXJlZCBieQordGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gVGhlIGFjdCBvZiBydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdAorcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbSBpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzCitjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieQorcnVubmluZyB0aGUgUHJvZ3JhbSkuIFdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgorCisxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3Mgc291cmNlIGNvZGUgYXMKK3lvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdSBjb25zcGljdW91c2x5IGFuZAorYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlCithbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OyBhbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUKK1Byb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCitZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQgeW91IG1heQorYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCisKKzIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24gb2YgaXQsIHRodXMKK2Zvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQgZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMKK29yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMSBhYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZgordGhlc2UgY29uZGl0aW9uczoKKworYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdAoreW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCitiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4gd2hvbGUgb3IgaW4KK3BhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueSBwYXJ0IHRoZXJlb2YsIHRvIGJlCitsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcworTGljZW5zZS4KKworYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseSB3aGVuIHJ1biwgeW91CittdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaCBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3QKK29yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbiBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlCitjb3B5cmlnaHQgbm90aWNlIGFuZCBhIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdAoreW91IHByb3ZpZGUgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlciB0aGVzZQorY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMgTGljZW5zZS4KKyhFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQKK3N1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50CithbiBhbm5vdW5jZW1lbnQuKQorCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gSWYgaWRlbnRpZmlhYmxlCitzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sIGFuZCBjYW4gYmUgcmVhc29uYWJseQorY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4gdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZAoraXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2Ugc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlCit3b3Jrcy4gQnV0IHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEKK3dvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zCitvZiB0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZSBlbnRpcmUKK3dob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QgeW91cgorcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0byBleGVyY2lzZSB0aGUKK3JpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yIGNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24KK3RoZSBQcm9ncmFtLgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtIHdpdGggdGhlCitQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YgYSBzdG9yYWdlIG9yCitkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyIHRoZSBzY29wZSBvZiB0aGlzCitMaWNlbnNlLgorCiszLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwgdW5kZXIKK1NlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZAorMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCithKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlLAord2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQorY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCitiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZSB5ZWFycywgdG8gZ2l2ZQorYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcKK3NvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nCitzb3VyY2UgY29kZSwgdG8gYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYQorbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIgdG8gZGlzdHJpYnV0ZQorY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gKFRoaXMgYWx0ZXJuYXRpdmUgaXMgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsCitkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91IHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUKK2Zvcm0gd2l0aCBzdWNoIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQorCitUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yIG1ha2luZworbW9kaWZpY2F0aW9ucyB0byBpdC4gRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlIGNvZGUgbWVhbnMgYWxsIHRoZQorc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueSBhc3NvY2lhdGVkIGludGVyZmFjZQorZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbgorb2YgdGhlIGV4ZWN1dGFibGUuIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZAorbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yCitiaW5hcnkgZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKK29wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50IGl0c2VsZgorYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCisKK0lmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKK2Zyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZQorY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcyBkaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaAordGhpcmQgcGFydGllcyBhcmUgbm90IGNvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisKKzQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBleGNlcHQgYXMKK2V4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuIEFueSBhdHRlbXB0IG90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksCitzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUKK3lvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4gSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yCityaWdodHMsIGZyb20geW91IHVuZGVyIHRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28KK2xvbmcgYXMgc3VjaCBwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKzUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdCBzaWduZWQgaXQuCitIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCitvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gVGhlc2UgYWN0aW9ucyBhcmUgcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdAorYWNjZXB0IHRoaXMgTGljZW5zZS4gVGhlcmVmb3JlLCBieSBtb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvcgorYW55IHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0bworZG8gc28sIGFuZCBhbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSwKK3RoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUgb3JpZ2luYWwgbGljZW5zb3IgdG8KK2NvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8gdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuCitZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIgcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUKK3JpZ2h0cyBncmFudGVkIGhlcmVpbi4gWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5Cit0aGlyZCBwYXJ0aWVzIHRvIHRoaXMgTGljZW5zZS4KKworNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwgY29uZGl0aW9ucworYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3Igb3RoZXJ3aXNlKSB0aGF0Citjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QgZXhjdXNlIHlvdSBmcm9tIHRoZQorY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuIElmIHlvdSBjYW5ub3QgZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5CitzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudAorb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UgbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4KK0ZvciBleGFtcGxlLCBpZiBhIHBhdGVudCBsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uCitvZiB0aGUgUHJvZ3JhbSBieSBhbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaAoreW91LCB0aGVuIHRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhbnkKK3BhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBhcHBseSBhbmQKK3RoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIgY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueSBwYXRlbnRzIG9yCitvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkgc3VjaCBjbGFpbXM7IHRoaXMKK3NlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUgaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlCitkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcyBpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuIE1hbnkKK3Blb3BsZSBoYXZlIG1hZGUgZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcgdG8KK2Rpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdCBpbXBvc2UgdGhhdAorY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8gYmUgYQorY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorCis4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbiBjZXJ0YWluCitjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlIG9yaWdpbmFsCitjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlIG1heSBhZGQgYW4gZXhwbGljaXQKK2dlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLCBzbyB0aGF0CitkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4KK3N1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcyB0aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5CitvZiB0aGlzIExpY2Vuc2UuCisKKzkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zIG9mIHRoZQorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluCitzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zCitvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIElmIHRoZSBQcm9ncmFtIHNwZWNpZmllcworYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueSBsYXRlciB2ZXJzaW9uIiwKK3lvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdAordmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIElmCit0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZQorYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZSBwcm9ncmFtcword2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvciB0byBhc2sgZm9yCitwZXJtaXNzaW9uLiBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKK3dyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuCitPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2FscyBvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZgorYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZCBvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mCitzb2Z0d2FyZSBnZW5lcmFsbHkuCisKK05PIFdBUlJBTlRZCisKKzExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWSBGT1IKK1RIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gRVhDRVBUIFdIRU4gT1RIRVJXSVNFCitTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMgUFJPVklERSBUSEUKK1BST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsCitJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORAorUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuIFNIT1VMRCBUSEUgUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVQorQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORyBXSUxMCitBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUiBSRURJU1RSSUJVVEUgVEhFCitQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywgSU5DTFVESU5HIEFOWQorR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPUgorSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBMT1NTIE9GIERBVEEgT1IgREFUQQorQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEKK0ZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIKK09SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKK0hvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCitJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0IHBvc3NpYmxlCit1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0IGZyZWUgc29mdHdhcmUKK3doaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KKworVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uIEl0IGlzIHNhZmVzdCB0byBhdHRhY2gKK3RoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseSBjb252ZXkgdGhlIGV4Y2x1c2lvbgorb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgdGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEKK3BvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDQsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbDoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKworSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcyB3aGVuIGl0CitzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKKworZ1NPQVAgdmVyc2lvbiBYLlkuWiwgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSwgSW5jLgorZ1NPQVAgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLiBUaGlzIGlzCitmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdCB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7Cit0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgorCitUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKK3BhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heSBiZQorY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCittb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgorCitUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KK3Byb3ByaWV0YXJ5IHByb2dyYW1zLiBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkgY29uc2lkZXIKK2l0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZSBsaWJyYXJ5LiBJZgordGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZAorb2YgdGhpcyBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvd3NkbC9nd3NkbC5oIGIvd3NkbC9nd3NkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5Zjg0OTEKLS0tIC9kZXYvbnVsbAorKysgYi93c2RsL2d3c2RsLmgKQEAgLTAsMCArMSw3NCBAQAorLyoKKworZ3dzZGwuaAorCitPR1NJIEdXU0RMIGJpbmRpbmcgc2NoZW1hIGludGVyZmFjZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyB0d28gbGljZW5zZXM6CitHUEwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKi8KKworLy9nc29hcCBnd3NkbCBzY2hlbWEgZG9jdW1lbnRhdGlvbjoJT0dTSSBHV1NETCBiaW5kaW5nIHNjaGVtYQorLy9nc29hcCBnd3NkbCBzY2hlbWEgbmFtZXNwYWNlOgkJaHR0cDovL3d3dy5ncmlkZm9ydW0ub3JnL25hbWVzcGFjZXMvMjAwMy8wMy9ncmlkV1NETEV4dGVuc2lvbnMKKy8vZ3NvYXAgc2Qgc2NoZW1hIG5hbWVzcGFjZToJCWh0dHA6Ly93d3cuZ3JpZGZvcnVtLm9yZy9uYW1lc3BhY2VzLzIwMDMvMDMvc2VydmljZURhdGEKKworI2ltcG9ydCAic2NoZW1hLmgiCisKK2NsYXNzIHdzZGxfX29wZXJhdGlvbjsKKworZW51bSBzZF9fbXV0YWJpbGl0eSB7IHN0YXRpY18sIGNvbnN0YW50LCBleHRlbmRhYmxlLCBtdXRhYmxlXyB9OworCitjbGFzcyBzZF9fc2VydmljZURhdGEKK3sgcHVibGljOgorCUB4c2RfX05NVE9LRU4JCQluYW1lOworCUB4c2RfX1FOYW1lCQkJdHlwZTsKKwlAeHNkX19ib29sZWFuCQkJbmlsbGFibGUJCT0gZmFsc2U7CisJQHhzZF9fc3RyaW5nCQkJbWluT2NjdXJzOwkJLy8geHNkOm5vbk5lZ2F0aXZlSW50ZWdlcgorCUB4c2RfX3N0cmluZwkJCW1heE9jY3VyczsJCS8vIHhzZDpub25OZWdhdGl2ZUludGVnZXJ8dW5ib3VuZGVkCisJQGVudW0gc2RfX211dGFiaWxpdHkJCW11dGFiaWxpdHkJCT0gZXh0ZW5kYWJsZTsKKwlAeHNkX19ib29sZWFuCQkJbW9kaWZpYWJsZQkJPSBmYWxzZTsKKwkvKiBoYXMgYW55IGNvbnRlbnQgKi8KKyAgcHVibGljOgorfTsKKworY2xhc3Mgc2RfX3N0YXRpY1NlcnZpY2VEYXRhVmFsdWVzCit7IHB1YmxpYzoKKwlpbnQJCQkJX190eXBlOyAvKiBhbnkgY29udGVudCwgcHJvYmFibHkgc2hvdWxkIHVzZSBET00gKi8KKwl2b2lkKgkJCQlfYW55OworfTsKKworY2xhc3MgZ3dzZGxfX3BvcnRUeXBlCit7IHB1YmxpYzoKKwlAeHNkX19OTVRPS0VOCQkJbmFtZTsKKwlAeHNkX19RTmFtZQkJCWV4dGVuZHM7CQkvLyBhY3R1YWxseSBhIGxpc3Qgb2YgUU5hbWVzCisJeHNkX19zdHJpbmcJCQlkb2N1bWVudGF0aW9uOwkJLy8gPHdzZGw6ZG9jdW1lbnRhdGlvbj4/CisJc3RkOjp2ZWN0b3I8d3NkbF9fb3BlcmF0aW9uKj4Jb3BlcmF0aW9uOwkJLy8gPHdzZGw6b3BlcmF0aW9uPioKKwlzdGQ6OnZlY3RvcjxzZF9fc2VydmljZURhdGE+CXNkX19zZXJ2aWNlRGF0YV87CisJc2RfX3N0YXRpY1NlcnZpY2VEYXRhVmFsdWVzCSpzZF9fc3RhdGljU2VydmljZURhdGFWYWx1ZXNfOworICBwdWJsaWM6Cit9OwpkaWZmIC0tZ2l0IGEvd3NkbC9odHRwLmggYi93c2RsL2h0dHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTQ0OTVlCi0tLSAvZGV2L251bGwKKysrIGIvd3NkbC9odHRwLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKworaHR0cC5oCisKK1dTREwvSFRUUCBiaW5kaW5nIHNjaGVtYSBpbnRlcmZhY2UKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMS0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyB0d28gbGljZW5zZXM6CitHUEwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKi8KKworLy9nc29hcCBodHRwIHNjaGVtYSBkb2N1bWVudGF0aW9uOglXU0RML0hUVFAgYmluZGluZyBzY2hlbWEKKy8vZ3NvYXAgaHR0cCBzY2hlbWEgbmFtZXNwYWNlOgkJaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLworCisjaW1wb3J0ICJpbXBvcnRzLmgiCisKK2NsYXNzIGh0dHBfX2FkZHJlc3MKK3sgcHVibGljOgorCUB4c2RfX2FueVVSSQkJbG9jYXRpb247Cit9OworCitjbGFzcyBodHRwX19iaW5kaW5nCit7IHB1YmxpYzoKKwlAeHNkX19OTVRPS0VOCQl2ZXJiOworfTsKKworY2xhc3MgaHR0cF9fb3BlcmF0aW9uCit7IHB1YmxpYzoKKwlAeHNkX19hbnlVUkkJCWxvY2F0aW9uOworfTsKZGlmZiAtLWdpdCBhL3dzZGwvaW1wb3J0cy5oIGIvd3NkbC9pbXBvcnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIwYWI4YQotLS0gL2Rldi9udWxsCisrKyBiL3dzZGwvaW1wb3J0cy5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisKK2ltcG9ydHMuaAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR3byBsaWNlbnNlczoKK0dQTCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqLworCisjaW1wb3J0ICIuLi9pbXBvcnQvc3RsdmVjdG9yLmgiCisKK3R5cGVkZWYgY2hhcgkqeHNkX19hbnlVUkksCisJCSp4c2RfX0lELAorCQkqeHNkX19OQ05hbWUsCisJCSp4c2RfX05NVE9LRU4sCisJCSp4c2RfX05NVE9LRU5TLAorCQkqeHNkX19RTmFtZSwKKwkJKnhzZF9fc3RyaW5nOwordHlwZWRlZiBib29sCXhzZF9fYm9vbGVhbjsKKworZXh0ZXJuIGNsYXNzIG9zdHJlYW07CitleHRlcm4gY2xhc3MgaXN0cmVhbTsKKworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisKK2V4dGVybiBjbGFzcyBTZXRPZlN0cmluZzsKZGlmZiAtLWdpdCBhL3dzZGwvaW5jbHVkZXMuaCBiL3dzZGwvaW5jbHVkZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzM0OGE0Ci0tLSAvZGV2L251bGwKKysrIGIvd3NkbC9pbmNsdWRlcy5oCkBAIC0wLDAgKzEsMTI2IEBACisvKgorCitpbmNsdWRlcy5oCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzOgorR1BMIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyovCisKKyNpZm5kZWYgSU5DTFVERVNfSAorI2RlZmluZSBJTkNMVURFU19ICisKKyNpbmNsdWRlICJzdGRzb2FwMi5oIgorCisjdW5kZWYgVkVSU0lPTgorI2RlZmluZSBWRVJTSU9OICIxLjIuNmUiCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8bWFwPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitzdHJ1Y3QgbHRzdHIKK3sgYm9vbCBvcGVyYXRvcigpKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMikgY29uc3QKKyAgeyByZXR1cm4gc3RyY21wKHMxLCBzMikgPCAwOworICB9Cit9OyAKKwordHlwZWRlZiBzZXQ8Y29uc3QgY2hhciosIGx0c3RyPiBTZXRPZlN0cmluZzsKKwordHlwZWRlZiBwYWlyPGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKj4gUGFpcjsKKworc3RydWN0IGx0cGFpcgoreyBib29sIG9wZXJhdG9yKCkoUGFpciBzMSwgUGFpciBzMikgY29uc3QKKyAgeyBpbnQgY21wID0gc3RyY21wKHMxLmZpcnN0LCBzMi5maXJzdCk7CisgICAgaWYgKGNtcCkKKyAgICAgIHJldHVybiBjbXAgPCAwOworICAgIHJldHVybiBzdHJjbXAoczEuc2Vjb25kLCBzMi5zZWNvbmQpIDwgMDsKKyAgfQorfTsKKwordHlwZWRlZiBtYXA8Y29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBsdHN0cj4gTWFwT2ZTdHJpbmdUb1N0cmluZzsKKwordHlwZWRlZiBtYXA8UGFpciwgY29uc3QgY2hhciosIGx0cGFpcj4gTWFwT2ZQYWlyVG9TdHJpbmc7CisKK3R5cGVkZWYgbWFwPGNvbnN0IGNoYXIqLCBzaXplX3QsIGx0c3RyPiBNYXBPZlN0cmluZ1RvTnVtOworCit0eXBlZGVmIHZlY3Rvcjxjb25zdCBjaGFyKj4gVmVjdG9yT2ZTdHJpbmc7CisKK2V4dGVybiBpbnQgYWZsYWcsCisJICAgY2ZsYWcsCisJICAgZGZsYWcsCisJICAgZWZsYWcsCisJICAgZmZsYWcsCisJICAgZ2ZsYWcsCisJICAgaWZsYWcsCisJICAgbGZsYWcsCisJICAgbWZsYWcsCisJICAgcGZsYWcsCisJICAgc2ZsYWcsCisJICAgdWZsYWcsCisJICAgdmZsYWcsCisJICAgd2ZsYWcsCisJICAgeGZsYWcsCisJICAgeWZsYWcsCisJICAgemZsYWc7CisKK2V4dGVybiBGSUxFICpzdHJlYW07CisKK2V4dGVybiBTZXRPZlN0cmluZyBleHR1cmlzOworCitleHRlcm4gaW50IGluZmlsZXM7CitleHRlcm4gY2hhciAqaW5maWxlWzEwMF0sICpvdXRmaWxlLCAqbWFwZmlsZSwgKnByb3h5X2hvc3QsICppbXBvcnRfcGF0aDsKKworZXh0ZXJuIGludCBwcm94eV9wb3J0OworCitleHRlcm4gY29uc3QgY2hhciAqc2VydmljZV9wcmVmaXg7CitleHRlcm4gY29uc3QgY2hhciAqc2NoZW1hX3ByZWZpeDsKKworZXh0ZXJuIGNoYXIgZWxlbWVudGZvcm1hdFtdOworZXh0ZXJuIGNoYXIgcG9pbnRlcmZvcm1hdFtdOworZXh0ZXJuIGNoYXIgYXR0cmlidXRlZm9ybWF0W107CitleHRlcm4gY2hhciB2ZWN0b3Jmb3JtYXRbXTsKK2V4dGVybiBjaGFyIHBvaW50ZXJ2ZWN0b3Jmb3JtYXRbXTsKK2V4dGVybiBjaGFyIGFycmF5Zm9ybWF0W107CitleHRlcm4gY2hhciBzaXplZm9ybWF0W107CitleHRlcm4gY2hhciBvZmZzZXRmb3JtYXRbXTsKK2V4dGVybiBjaGFyIGNob2ljZWZvcm1hdFtdOworZXh0ZXJuIGNoYXIgc2NoZW1hZm9ybWF0W107CitleHRlcm4gY2hhciBzZXJ2aWNlZm9ybWF0W107CitleHRlcm4gY2hhciBwYXJhZm9ybWF0W107CitleHRlcm4gY2hhciBhbm9uZm9ybWF0W107CitleHRlcm4gY2hhciBjb3B5cmlnaHRub3RpY2VbXTsKK2V4dGVybiBjaGFyIGxpY2Vuc2Vub3RpY2VbXTsKKworZXh0ZXJuIHZvaWQgKmVtYWxsb2Moc2l6ZV90IHNpemUpOworZXh0ZXJuIGNoYXIgKmVzdHJkdXAoY29uc3QgY2hhciAqcyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvd3NkbC9taW1lLmNwcCBiL3dzZGwvbWltZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzllZmZiNwotLS0gL2Rldi9udWxsCisrKyBiL3dzZGwvbWltZS5jcHAKQEAgLTAsMCArMSw2OCBAQAorLyoKKworbWltZS5jcHAKKworV1NETC9NSU1FIGJpbmRpbmcgc2NoZW1hCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzOgorR1BMIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyovCisKKyNpbmNsdWRlICJ3c2RsSC5oIgkJLy8gY2Fubm90IGluY2x1ZGUgInNjaGVtYUguaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKnFuYW1lX3Rva2VuKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JbWltZTptdWx0aXBhcnRSZWxhdGVkCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworaW50IG1pbWVfX211bHRpcGFydFJlbGF0ZWQ6OnRyYXZlcnNlKHdzZGxfX2RlZmluaXRpb25zJiBkZWZpbml0aW9ucykKK3sgaWYgKHZmbGFnKQorICAgIGNlcnIgPDwgIkFuYWx5emluZyBtaW1lIG11bHRwYXJ0UmVsYXRlZCAiIDw8IGVuZGw7CisgIGZvciAodmVjdG9yPG1pbWVfX3BhcnQ+OjppdGVyYXRvciBwdCA9IHBhcnQuYmVnaW4oKTsgcHQgIT0gcGFydC5lbmQoKTsgKytwdCkKKyAgICAoKnB0KS50cmF2ZXJzZShkZWZpbml0aW9ucyk7CisgIHJldHVybiBTT0FQX09LOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCW1pbWU6cGFydAorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2ludCBtaW1lX19wYXJ0Ojp0cmF2ZXJzZSh3c2RsX19kZWZpbml0aW9ucyYgZGVmaW5pdGlvbnMpCit7IGlmICh2ZmxhZykKKyAgICBjZXJyIDw8ICJBbmFseXppbmcgbWltZSBwYXJ0ICIgPDwgZW5kbDsKKyAgZm9yICh2ZWN0b3I8c29hcF9faGVhZGVyPjo6aXRlcmF0b3IgaGQgPSBzb2FwX19oZWFkZXJfLmJlZ2luKCk7IGhkICE9IHNvYXBfX2hlYWRlcl8uZW5kKCk7ICsraGQpCisgICAgKCpoZCkudHJhdmVyc2UoZGVmaW5pdGlvbnMpOworICByZXR1cm4gU09BUF9PSzsKK30KZGlmZiAtLWdpdCBhL3dzZGwvbWltZS5oIGIvd3NkbC9taW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgzZjJmMQotLS0gL2Rldi9udWxsCisrKyBiL3dzZGwvbWltZS5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisKK21pbWUuaAorCitXU0RML01JTUUgYmluZGluZyBzY2hlbWEKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMS0yMDA1LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyB0d28gbGljZW5zZXM6CitHUEwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKi8KKworLy9nc29hcCBtaW1lIHNjaGVtYSBkb2N1bWVudGF0aW9uOglXU0RML01JTUUgYmluZGluZyBzY2hlbWEKKy8vZ3NvYXAgbWltZSBzY2hlbWEgbmFtZXNwYWNlOgkJaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLworCisjaW1wb3J0ICJpbXBvcnRzLmgiCisjaW1wb3J0ICJzb2FwLmgiCisKK2NsYXNzIG1pbWVfX2NvbnRlbnQKK3sgcHVibGljOgorIAlAeHNkX19OTVRPS0VOCQkJcGFydDsKKwlAeHNkX19zdHJpbmcJCQl0eXBlOworfTsKKworY2xhc3MgbWltZV9fcGFydAoreyBwdWJsaWM6CisJc29hcF9fYm9keQkJCSpzb2FwX19ib2R5XzsKKwlzdGQ6OnZlY3Rvcjxzb2FwX19oZWFkZXI+CXNvYXBfX2hlYWRlcl87CisJc3RkOjp2ZWN0b3I8bWltZV9fY29udGVudD4JY29udGVudDsKKyAgcHVibGljOgorICAJaW50CQkJCXRyYXZlcnNlKHdzZGxfX2RlZmluaXRpb25zJik7Cit9OworCitjbGFzcyBtaW1lX19tdWx0aXBhcnRSZWxhdGVkCit7IHB1YmxpYzoKKwlzdGQ6OnZlY3RvcjxtaW1lX19wYXJ0PgkJcGFydDsKKyAgcHVibGljOgorICAJaW50CQkJCXRyYXZlcnNlKHdzZGxfX2RlZmluaXRpb25zJik7Cit9OwpkaWZmIC0tZ2l0IGEvd3NkbC9zY2hlbWEuY3BwIGIvd3NkbC9zY2hlbWEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MjZjYzMKLS0tIC9kZXYvbnVsbAorKysgYi93c2RsL3NjaGVtYS5jcHAKQEAgLTAsMCArMSwxNTY2IEBACisvKgorCitzY2hlbWEuY3BwCisKK1hTRCBiaW5kaW5nIHNjaGVtYSBpbXBsZW1lbnRhdGlvbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR3byBsaWNlbnNlczoKK0dQTCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqLworCisjaW5jbHVkZSAid3NkbEguaCIJCS8vIGNhbm5vdCBpbmNsdWRlICJzY2hlbWFILmgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2V4dGVybiBpbnQgd2Fybl9pZ25vcmUoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKik7CitleHRlcm4gY29uc3QgY2hhciAqcW5hbWVfdG9rZW4oY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKK2V4dGVybiBpbnQgaXNfYnVpbHRpbl9xbmFtZShjb25zdCBjaGFyKik7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8Jc2NoZW1hCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworeHNfX3NjaGVtYTo6eHNfX3NjaGVtYSgpCit7IHNvYXAgPSBzb2FwX25ldzEoU09BUF9YTUxfVFJFRSB8IFNPQVBfQ19VVEZTVFJJTkcpOworI2lmZGVmIFdJVEhfT1BFTlNTTAorICBzb2FwX3NzbF9jbGllbnRfY29udGV4dChzb2FwLCBTT0FQX1NTTF9OT19BVVRIRU5USUNBVElPTiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisjZW5kaWYKKyNpZmRlZiBXSVRIX05PTkFNRVNQQUNFUworICBzb2FwX3NldF9uYW1lc3BhY2VzKHNvYXAsIG5hbWVzcGFjZXMpOworI2VuZGlmCisgIHNvYXBfZGVmYXVsdChzb2FwKTsKKyAgc29hcC0+Zmlnbm9yZSA9IHdhcm5faWdub3JlOworICBzb2FwLT5lbmNvZGluZ1N0eWxlID0gTlVMTDsKKyAgc29hcC0+cHJveHlfaG9zdCA9IHByb3h5X2hvc3Q7CisgIHNvYXAtPnByb3h5X3BvcnQgPSBwcm94eV9wb3J0OworICB0YXJnZXROYW1lc3BhY2UgPSBOVUxMOworICB2ZXJzaW9uID0gTlVMTDsKKyAgdXBkYXRlZCA9IGZhbHNlOworICBsb2NhdGlvbiA9IE5VTEw7CisgIHJlZGlycyA9IDA7Cit9CisKK3hzX19zY2hlbWE6OnhzX19zY2hlbWEoc3RydWN0IHNvYXAgKmNvcHkpCit7IHNvYXAgPSBzb2FwX2NvcHkoY29weSk7CisgIHNvYXBfZGVmYXVsdChzb2FwKTsKKyAgc29hcC0+Zmlnbm9yZSA9IHdhcm5faWdub3JlOworICBzb2FwLT5lbmNvZGluZ1N0eWxlID0gTlVMTDsKKyAgdGFyZ2V0TmFtZXNwYWNlID0gTlVMTDsKKyAgdmVyc2lvbiA9IE5VTEw7CisgIHVwZGF0ZWQgPSBmYWxzZTsKKyAgbG9jYXRpb24gPSBOVUxMOworICByZWRpcnMgPSAwOworfQorCit4c19fc2NoZW1hOjp4c19fc2NoZW1hKHN0cnVjdCBzb2FwICpjb3B5LCBjb25zdCBjaGFyICpjd2QsIGNvbnN0IGNoYXIgKmxvYykKK3sgc29hcCA9IHNvYXBfY29weShjb3B5KTsKKyAgc29hcC0+c29ja2V0ID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgc29hcC0+cmVjdmZkID0gMDsKKyAgc29hcC0+c2VuZGZkID0gMTsKKyAgLyogbm8gbG9uZ2VyIHJlcXVpcmVkLCBzaW5jZSB3ZSBrZWVwIHRoZSBob3N0IG5hbWU6CisgIHN0cmNweShzb2FwLT5ob3N0LCBjb3B5LT5ob3N0KTsKKyAgKi8KKyAgc29hcF9kZWZhdWx0KHNvYXApOworICBzb2FwLT5maWdub3JlID0gd2Fybl9pZ25vcmU7CisgIHNvYXAtPmVuY29kaW5nU3R5bGUgPSBOVUxMOworICB0YXJnZXROYW1lc3BhY2UgPSBOVUxMOworICB2ZXJzaW9uID0gTlVMTDsKKyAgdXBkYXRlZCA9IGZhbHNlOworICBsb2NhdGlvbiA9IE5VTEw7CisgIHJlZGlycyA9IDA7CisgIHJlYWQoY3dkLCBsb2MpOworfQorCit4c19fc2NoZW1hOjp+eHNfX3NjaGVtYSgpCit7IH0KKworaW50IHhzX19zY2hlbWE6OmdldChzdHJ1Y3Qgc29hcCAqc29hcCkKK3sgcmV0dXJuIHByZXByb2Nlc3MoKTsKK30KKworaW50IHhzX19zY2hlbWE6OnByZXByb2Nlc3MoKQoreyAvLyBwcm9jZXNzIGluY2x1ZGUsIGJ1dCBzaG91bGQgY2hlY2sgaWYgbm90IGFscmVhZHkgaW5jbHVkZWQ/CisgIC8vIE5PVEU6IGluY2x1ZGVzIGFyZSBjb250ZXh0IHNlbnNpdGl2ZSAodGFrZSBjb250ZXh0IGluZm8pLCBzbyBrZWVwIGluY2x1ZGluZworICBmb3IgKHZlY3Rvcjx4c19faW5jbHVkZT46Oml0ZXJhdG9yIGluID0gaW5jbHVkZS5iZWdpbigpOyBpbiAhPSBpbmNsdWRlLmVuZCgpOyArK2luKQorICB7ICgqaW4pLnByZXByb2Nlc3MoKnRoaXMpOyAvLyByZWFkIHNjaGVtYSBhbmQgcmVjdXJzZSBvdmVyIDxpbmNsdWRlPgorICAgIGlmICgoKmluKS5zY2hlbWFQdHIoKSkKKyAgICAgIGluc2VydCgqKCppbikuc2NoZW1hUHRyKCkpOworICB9CisgIGZvciAodmVjdG9yPHhzX19yZWRlZmluZT46Oml0ZXJhdG9yIHJlID0gcmVkZWZpbmUuYmVnaW4oKTsgcmUgIT0gcmVkZWZpbmUuZW5kKCk7ICsrcmUpCisgIHsgKCpyZSkucHJlcHJvY2VzcygqdGhpcyk7IC8vIHJlYWQgc2NoZW1hIGFuZCByZWN1cnNlIG92ZXIgPHJlZGVmaW5lPgorICAgIGlmICgoKnJlKS5zY2hlbWFQdHIoKSkKKyAgICAgIGluc2VydCgqKCpyZSkuc2NoZW1hUHRyKCkpOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorCitpbnQgeHNfX3NjaGVtYTo6aW5zZXJ0KHhzX19zY2hlbWEmIHNjaGVtYSkKK3sgYm9vbCBmb3VuZDsKKyAgaWYgKHRhcmdldE5hbWVzcGFjZSAmJiBzY2hlbWEudGFyZ2V0TmFtZXNwYWNlICYmIHN0cmNtcCh0YXJnZXROYW1lc3BhY2UsIHNjaGVtYS50YXJnZXROYW1lc3BhY2UpKQorICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogYXR0ZW1wdCB0byBpbmNsdWRlIHNjaGVtYSB3aXRoIHVuZXF1YWwgdGFyZ2V0TmFtZXNwYWNlICclcycgaW4gc2NoZW1hICclcydcbiIsIHNjaGVtYS50YXJnZXROYW1lc3BhY2UsIHRhcmdldE5hbWVzcGFjZSk7CisgIGlmIChlbGVtZW50Rm9ybURlZmF1bHQgIT0gc2NoZW1hLmVsZW1lbnRGb3JtRGVmYXVsdCkKKyAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IGF0dGVtcHQgdG8gaW5jbHVkZSBzY2hlbWEgd2l0aCB1bmVxdWFsIGVsZW1lbnRGb3JtRGVmYXVsdCBpbiBzY2hlbWEgJyVzJ1xuIiwgdGFyZ2V0TmFtZXNwYWNlP3RhcmdldE5hbWVzcGFjZToiIik7CisgIGlmIChhdHRyaWJ1dGVGb3JtRGVmYXVsdCAhPSBzY2hlbWEuYXR0cmlidXRlRm9ybURlZmF1bHQpCisgICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBhdHRlbXB0IHRvIGluY2x1ZGUgc2NoZW1hIHdpdGggdW5lcXVhbCBhdHRyaWJ1dGVGb3JtRGVmYXVsdCBpbiBzY2hlbWEgJyVzJ1xuIiwgdGFyZ2V0TmFtZXNwYWNlP3RhcmdldE5hbWVzcGFjZToiIik7CisgIC8vIGluc2VydCBpbXBvcnRzLCBidXQgb25seSBhZGQgaW1wb3J0cyB3aXRoIG5ldyBuYW1lc3BhY2UKKyAgZm9yICh2ZWN0b3I8eHNfX2ltcG9ydD46OmNvbnN0X2l0ZXJhdG9yIGltID0gc2NoZW1hLmltcG9ydC5iZWdpbigpOyBpbSAhPSBzY2hlbWEuaW1wb3J0LmVuZCgpOyArK2ltKQorICB7IGZvdW5kID0gZmFsc2U7CisgICAgaWYgKCgqaW0pLm5hbWVzcGFjZV8pCisgICAgeyBmb3IgKHZlY3Rvcjx4c19faW1wb3J0Pjo6Y29uc3RfaXRlcmF0b3IgaSA9IGltcG9ydC5iZWdpbigpOyBpICE9IGltcG9ydC5lbmQoKTsgKytpKQorICAgICAgeyBpZiAoKCppKS5uYW1lc3BhY2VfICYmICFzdHJjbXAoKCppbSkubmFtZXNwYWNlXywgKCppKS5uYW1lc3BhY2VfKSkKKyAgICAgICAgeyBmb3VuZCA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFmb3VuZCkKKyAgICAgIGltcG9ydC5wdXNoX2JhY2soKmltKTsKKyAgfQorICAvLyBpbnNlcnQgYXR0cmlidXRlcywgYnV0IG9ubHkgYWRkIGF0dHJpYnV0ZXMgd2l0aCBuZXcgbmFtZQorICBmb3IgKHZlY3Rvcjx4c19fYXR0cmlidXRlPjo6Y29uc3RfaXRlcmF0b3IgYXQgPSBzY2hlbWEuYXR0cmlidXRlLmJlZ2luKCk7IGF0ICE9IHNjaGVtYS5hdHRyaWJ1dGUuZW5kKCk7ICsrYXQpCisgIHsgZm91bmQgPSBmYWxzZTsKKyAgICBpZiAoKCphdCkubmFtZSkKKyAgICB7IGZvciAodmVjdG9yPHhzX19hdHRyaWJ1dGU+Ojpjb25zdF9pdGVyYXRvciBhID0gYXR0cmlidXRlLmJlZ2luKCk7IGEgIT0gYXR0cmlidXRlLmVuZCgpOyArK2EpCisgICAgICB7IGlmICgoKmEpLm5hbWUgJiYgIXN0cmNtcCgoKmF0KS5uYW1lLCAoKmEpLm5hbWUpKQorICAgICAgICB7IGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICBpZiAoKCphdCkudHlwZSAmJiAoKmEpLnR5cGUgJiYgc3RyY21wKCgqYXQpLnR5cGUsICgqYSkudHlwZSkpCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IGF0dGVtcHQgdG8gcmVkZWZpbmUgYXR0cmlidXRlICclcycgd2l0aCB0eXBlICclcycgaW4gc2NoZW1hICclcydcbiIsICgqYXQpLm5hbWUsICgqYXQpLnR5cGUsIHRhcmdldE5hbWVzcGFjZT90YXJnZXROYW1lc3BhY2U6IiIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmICghZm91bmQpCisgICAgICBhdHRyaWJ1dGUucHVzaF9iYWNrKCphdCk7CisgIH0KKyAgLy8gaW5zZXJ0IGVsZW1lbnRzLCBidXQgb25seSBhZGQgZWxlbWVudHMgd2l0aCBuZXcgbmFtZQorICBmb3IgKHZlY3Rvcjx4c19fZWxlbWVudD46OmNvbnN0X2l0ZXJhdG9yIGVsID0gc2NoZW1hLmVsZW1lbnQuYmVnaW4oKTsgZWwgIT0gc2NoZW1hLmVsZW1lbnQuZW5kKCk7ICsrZWwpCisgIHsgZm91bmQgPSBmYWxzZTsKKyAgICBpZiAoKCplbCkubmFtZSkKKyAgICB7IGZvciAodmVjdG9yPHhzX19lbGVtZW50Pjo6Y29uc3RfaXRlcmF0b3IgZSA9IGVsZW1lbnQuYmVnaW4oKTsgZSAhPSBlbGVtZW50LmVuZCgpOyArK2UpCisgICAgICB7IGlmICgoKmUpLm5hbWUgJiYgIXN0cmNtcCgoKmVsKS5uYW1lLCAoKmUpLm5hbWUpKQorICAgICAgICB7IGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICBpZiAoKCplbCkudHlwZSAmJiAoKmUpLnR5cGUgJiYgc3RyY21wKCgqZWwpLnR5cGUsICgqZSkudHlwZSkpCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IGF0dGVtcHQgdG8gcmVkZWZpbmUgZWxlbWVudCAnJXMnIHdpdGggdHlwZSAnJXMnIGluIHNjaGVtYSAnJXMnXG4iLCAoKmVsKS5uYW1lLCAoKmVsKS50eXBlLCB0YXJnZXROYW1lc3BhY2U/dGFyZ2V0TmFtZXNwYWNlOiIiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAoIWZvdW5kKQorICAgICAgZWxlbWVudC5wdXNoX2JhY2soKmVsKTsKKyAgfQorICAvLyBpbnNlcnQgZ3JvdXBzLCBidXQgb25seSBhZGQgZ3JvdXBzIHdpdGggbmV3IG5hbWUKKyAgZm9yICh2ZWN0b3I8eHNfX2dyb3VwPjo6Y29uc3RfaXRlcmF0b3IgZ3AgPSBzY2hlbWEuZ3JvdXAuYmVnaW4oKTsgZ3AgIT0gc2NoZW1hLmdyb3VwLmVuZCgpOyArK2dwKQorICB7IGZvdW5kID0gZmFsc2U7CisgICAgaWYgKCgqZ3ApLm5hbWUpCisgICAgeyBmb3IgKHZlY3Rvcjx4c19fZ3JvdXA+Ojpjb25zdF9pdGVyYXRvciBnID0gZ3JvdXAuYmVnaW4oKTsgZyAhPSBncm91cC5lbmQoKTsgKytnKQorICAgICAgeyBpZiAoKCpnKS5uYW1lICYmICFzdHJjbXAoKCpncCkubmFtZSwgKCpnKS5uYW1lKSkKKyAgICAgICAgeyBmb3VuZCA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFmb3VuZCkKKyAgICAgIGdyb3VwLnB1c2hfYmFjaygqZ3ApOworICB9CisgIC8vIGluc2VydCBhdHRyaWJ1dGVHcm91cHMsIGJ1dCBvbmx5IGFkZCBhdHRyaWJ1dGVHcm91cHMgd2l0aCBuZXcgbmFtZQorICBmb3IgKHZlY3Rvcjx4c19fYXR0cmlidXRlR3JvdXA+Ojpjb25zdF9pdGVyYXRvciBhZyA9IHNjaGVtYS5hdHRyaWJ1dGVHcm91cC5iZWdpbigpOyBhZyAhPSBzY2hlbWEuYXR0cmlidXRlR3JvdXAuZW5kKCk7ICsrYWcpCisgIHsgZm91bmQgPSBmYWxzZTsKKyAgICBpZiAoKCphZykubmFtZSkKKyAgICB7IGZvciAodmVjdG9yPHhzX19hdHRyaWJ1dGVHcm91cD46OmNvbnN0X2l0ZXJhdG9yIGcgPSBhdHRyaWJ1dGVHcm91cC5iZWdpbigpOyBnICE9IGF0dHJpYnV0ZUdyb3VwLmVuZCgpOyArK2cpCisgICAgICB7IGlmICgoKmcpLm5hbWUgJiYgIXN0cmNtcCgoKmFnKS5uYW1lLCAoKmcpLm5hbWUpKQorICAgICAgICB7IGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAoIWZvdW5kKQorICAgICAgYXR0cmlidXRlR3JvdXAucHVzaF9iYWNrKCphZyk7CisgIH0KKyAgLy8gaW5zZXJ0IHNpbXBsZVR5cGVzLCBidXQgb25seSBhZGQgc2ltcGxlVHlwZXMgd2l0aCBuZXcgbmFtZQorICBmb3IgKHZlY3Rvcjx4c19fc2ltcGxlVHlwZT46OmNvbnN0X2l0ZXJhdG9yIHN0ID0gc2NoZW1hLnNpbXBsZVR5cGUuYmVnaW4oKTsgc3QgIT0gc2NoZW1hLnNpbXBsZVR5cGUuZW5kKCk7ICsrc3QpCisgIHsgZm91bmQgPSBmYWxzZTsKKyAgICBpZiAoKCpzdCkubmFtZSkKKyAgICB7IGZvciAodmVjdG9yPHhzX19zaW1wbGVUeXBlPjo6Y29uc3RfaXRlcmF0b3IgcyA9IHNpbXBsZVR5cGUuYmVnaW4oKTsgcyAhPSBzaW1wbGVUeXBlLmVuZCgpOyArK3MpCisgICAgICB7IGlmICgoKnMpLm5hbWUgJiYgIXN0cmNtcCgoKnN0KS5uYW1lLCAoKnMpLm5hbWUpKQorICAgICAgICB7IGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAoIWZvdW5kKQorICAgICAgc2ltcGxlVHlwZS5wdXNoX2JhY2soKnN0KTsKKyAgfQorICAvLyBpbnNlcnQgY29tcGxleFR5cGVzLCBidXQgb25seSBhZGQgY29tcGxleFR5cGVzIHdpdGggbmV3IG5hbWUKKyAgZm9yICh2ZWN0b3I8eHNfX2NvbXBsZXhUeXBlPjo6Y29uc3RfaXRlcmF0b3IgY3QgPSBzY2hlbWEuY29tcGxleFR5cGUuYmVnaW4oKTsgY3QgIT0gc2NoZW1hLmNvbXBsZXhUeXBlLmVuZCgpOyArK2N0KQorICB7IGZvdW5kID0gZmFsc2U7CisgICAgaWYgKCgqY3QpLm5hbWUpCisgICAgeyBmb3IgKHZlY3Rvcjx4c19fY29tcGxleFR5cGU+Ojpjb25zdF9pdGVyYXRvciBjID0gY29tcGxleFR5cGUuYmVnaW4oKTsgYyAhPSBjb21wbGV4VHlwZS5lbmQoKTsgKytjKQorICAgICAgeyBpZiAoKCpjKS5uYW1lICYmICFzdHJjbXAoKCpjdCkubmFtZSwgKCpjKS5uYW1lKSkKKyAgICAgICAgeyBmb3VuZCA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFmb3VuZCkKKyAgICAgIGNvbXBsZXhUeXBlLnB1c2hfYmFjaygqY3QpOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorCitpbnQgeHNfX3NjaGVtYTo6dHJhdmVyc2UoKQoreyBpZiAodmZsYWcpCisgICAgY2VyciA8PCAiQW5hbHl6aW5nIHNjaGVtYSAiIDw8ICh0YXJnZXROYW1lc3BhY2U/dGFyZ2V0TmFtZXNwYWNlOiIiKSA8PCBlbmRsOworICBpZiAodXBkYXRlZCkKKyAgICByZXR1cm4gU09BUF9PSzsKKyAgdXBkYXRlZCA9IHRydWU7CisgIGlmICghdGFyZ2V0TmFtZXNwYWNlKQorICB7IGlmICh2ZmxhZykKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogU2NoZW1hIGhhcyBubyB0YXJnZXROYW1lc3BhY2VcbiIpOworICAgIHRhcmdldE5hbWVzcGFjZSA9ICIiOworICB9CisgIC8vIHByb2Nlc3MgaW1wb3J0CisgIGZvciAodmVjdG9yPHhzX19pbXBvcnQ+OjppdGVyYXRvciBpbSA9IGltcG9ydC5iZWdpbigpOyBpbSAhPSBpbXBvcnQuZW5kKCk7ICsraW0pCisgICAgKCppbSkudHJhdmVyc2UoKnRoaXMpOworICAvLyBwcm9jZXNzIGF0dHJpYnV0ZXMKKyAgZm9yICh2ZWN0b3I8eHNfX2F0dHJpYnV0ZT46Oml0ZXJhdG9yIGF0ID0gYXR0cmlidXRlLmJlZ2luKCk7IGF0ICE9IGF0dHJpYnV0ZS5lbmQoKTsgKythdCkKKyAgICAoKmF0KS50cmF2ZXJzZSgqdGhpcyk7CisgIC8vIHByb2Nlc3MgZWxlbWVudHMsIGNoZWNrIGNvbmZsaWN0cyB3aXRoIGNvbXBsZXhUeXBlcworICBmb3IgKHZlY3Rvcjx4c19fZWxlbWVudD46Oml0ZXJhdG9yIGVsID0gZWxlbWVudC5iZWdpbigpOyBlbCAhPSBlbGVtZW50LmVuZCgpOyArK2VsKQorICB7ICgqZWwpLnRyYXZlcnNlKCp0aGlzKTsKKyAgICBpZiAoKCplbCkubmFtZSkKKyAgICB7IGZvciAodmVjdG9yPHhzX19zaW1wbGVUeXBlPjo6aXRlcmF0b3Igc3QgPSBzaW1wbGVUeXBlLmJlZ2luKCk7IHN0ICE9IHNpbXBsZVR5cGUuZW5kKCk7ICsrc3QpCisgICAgICB7IGlmICgoKnN0KS5uYW1lICYmICFzdHJjbXAoKCplbCkubmFtZSwgKCpzdCkubmFtZSkpCisgICAgICAgIHsgY29uc3QgY2hhciAqdG9rZW4gPSBxbmFtZV90b2tlbigoKmVsKS50eXBlLCB0YXJnZXROYW1lc3BhY2UpOworICAgICAgICAgIGlmICghdG9rZW4gfHwgc3RyY21wKCgqc3QpLm5hbWUsIHRva2VuKSkKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogdG9wLWxldmVsIGVsZW1lbnQgbmFtZSBhbmQgc2ltcGxlVHlwZSBuYW1lICclcycgY2xhc2ggaW4gc2NoZW1hICclcydcbiIsICgqZWwpLm5hbWUsIHRhcmdldE5hbWVzcGFjZT90YXJnZXROYW1lc3BhY2U6IiIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBmb3IgKHZlY3Rvcjx4c19fY29tcGxleFR5cGU+OjppdGVyYXRvciBjdCA9IGNvbXBsZXhUeXBlLmJlZ2luKCk7IGN0ICE9IGNvbXBsZXhUeXBlLmVuZCgpOyArK2N0KQorICAgICAgeyBpZiAoKCpjdCkubmFtZSAmJiAhc3RyY21wKCgqZWwpLm5hbWUsICgqY3QpLm5hbWUpKQorICAgICAgICB7IGNvbnN0IGNoYXIgKnRva2VuID0gcW5hbWVfdG9rZW4oKCplbCkudHlwZSwgdGFyZ2V0TmFtZXNwYWNlKTsKKyAgICAgICAgICBpZiAoIXRva2VuIHx8IHN0cmNtcCgoKmN0KS5uYW1lLCB0b2tlbikpCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IHRvcC1sZXZlbCBlbGVtZW50IG5hbWUgYW5kIGNvbXBsZXhUeXBlIG5hbWUgJyVzJyBjbGFzaCBpbiBzY2hlbWEgJyVzJ1xuIiwgKCplbCkubmFtZSwgdGFyZ2V0TmFtZXNwYWNlP3RhcmdldE5hbWVzcGFjZToiIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLy8gcHJvY2VzcyBzaW1wbGVUeXBlcywgY2hlY2sgY29uZmxpY3RzIHdpdGggY29tcGxleFR5cGVzCisgIGZvciAodmVjdG9yPHhzX19zaW1wbGVUeXBlPjo6aXRlcmF0b3Igc3QgPSBzaW1wbGVUeXBlLmJlZ2luKCk7IHN0ICE9IHNpbXBsZVR5cGUuZW5kKCk7ICsrc3QpCisgIHsgKCpzdCkudHJhdmVyc2UoKnRoaXMpOworICAgIGlmICgoKnN0KS5uYW1lKQorICAgIHsgZm9yICh2ZWN0b3I8eHNfX2NvbXBsZXhUeXBlPjo6aXRlcmF0b3IgY3QgPSBjb21wbGV4VHlwZS5iZWdpbigpOyBjdCAhPSBjb21wbGV4VHlwZS5lbmQoKTsgKytjdCkKKyAgICAgICAgaWYgKCgqY3QpLm5hbWUgJiYgIXN0cmNtcCgoKnN0KS5uYW1lLCAoKmN0KS5uYW1lKSkKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IHRvcC1sZXZlbCBzaW1wbGVUeXBlIG5hbWUgYW5kIGNvbXBsZXhUeXBlIG5hbWUgJyVzJyBjbGFzaCBpbiBzY2hlbWEgJyVzJ1xuIiwgKCpzdCkubmFtZSwgdGFyZ2V0TmFtZXNwYWNlP3RhcmdldE5hbWVzcGFjZToiIik7CisgICAgfQorICB9CisgIC8vIHByb2Nlc3MgY29tcGxleFR5cGVzCisgIGZvciAodmVjdG9yPHhzX19jb21wbGV4VHlwZT46Oml0ZXJhdG9yIGN0ID0gY29tcGxleFR5cGUuYmVnaW4oKTsgY3QgIT0gY29tcGxleFR5cGUuZW5kKCk7ICsrY3QpCisgICAgKCpjdCkudHJhdmVyc2UoKnRoaXMpOworICAvLyBwcm9jZXNzIGdyb3VwcworICBmb3IgKHZlY3Rvcjx4c19fZ3JvdXA+OjppdGVyYXRvciBncCA9IGdyb3VwLmJlZ2luKCk7IGdwICE9IGdyb3VwLmVuZCgpOyArK2dwKQorICAgICgqZ3ApLnRyYXZlcnNlKCp0aGlzKTsKKyAgLy8gcHJvY2VzcyBhdHRyaWJ1dGVHcm91cHMKKyAgZm9yICh2ZWN0b3I8eHNfX2F0dHJpYnV0ZUdyb3VwPjo6aXRlcmF0b3IgYWcgPSBhdHRyaWJ1dGVHcm91cC5iZWdpbigpOyBhZyAhPSBhdHRyaWJ1dGVHcm91cC5lbmQoKTsgKythZykKKyAgICAoKmFnKS50cmF2ZXJzZSgqdGhpcyk7CisgIGlmICh2ZmxhZykKKyAgICBjZXJyIDw8ICJFbmQgb2Ygc2NoZW1hICIgPDwgKHRhcmdldE5hbWVzcGFjZT90YXJnZXROYW1lc3BhY2U6IiIpIDw8IGVuZGw7CisgIHJldHVybiBTT0FQX09LOworfQorCitpbnQgeHNfX3NjaGVtYTo6cmVhZChjb25zdCBjaGFyICpjd2QsIGNvbnN0IGNoYXIgKmxvYykKK3sgaWYgKHZmbGFnKQorICAgIGZwcmludGYoc3RkZXJyLCAiT3BlbmluZyBzY2hlbWEgJyVzJyBmcm9tICclcydcbiIsIGxvYz9sb2M6IiIsIGN3ZD9jd2Q6IiIpOworICBpZiAobG9jKQorICB7IGlmICghc3RybmNtcChsb2MsICJodHRwOi8vIiwgNykgfHwgIXN0cm5jbXAobG9jLCAiaHR0cHM6Ly8iLCA4KSkKKyAgICB7IGZwcmludGYoc3RkZXJyLCAiQ29ubmVjdGluZyB0byAnJXMnIHRvIHJldHJpZXZlIHNjaGVtYS4uLiAiLCBsb2MpOworICAgICAgbG9jYXRpb24gPSBzb2FwX3N0cmR1cChzb2FwLCBsb2MpOworICAgICAgaWYgKHNvYXBfY29ubmVjdF9jb21tYW5kKHNvYXAsIFNPQVBfR0VULCBsb2NhdGlvbiwgTlVMTCkpCisgICAgICB7IGZwcmludGYoc3RkZXJyLCAiY29ubmVjdGlvbiBmYWlsZWRcbiIpOworICAgICAgICBleGl0KDEpOworICAgICAgfQorICAgICAgZnByaW50ZihzdGRlcnIsICJjb25uZWN0ZWQsIHJlY2VpdmluZy4uLlxuIik7CisgICAgfQorICAgIGVsc2UgaWYgKGN3ZCAmJiAoIXN0cm5jbXAoY3dkLCAiaHR0cDovLyIsIDcpIHx8ICFzdHJuY21wKGN3ZCwgImh0dHBzOi8vIiwgOCkpKQorICAgIHsgY2hhciAqczsKKyAgICAgIGxvY2F0aW9uID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihjd2QpICsgc3RybGVuKGxvYykgKyAyKTsKKyAgICAgIHN0cmNweShsb2NhdGlvbiwgY3dkKTsKKyAgICAgIHMgPSBzdHJyY2hyKGxvY2F0aW9uLCAnLycpOworICAgICAgaWYgKHMpCisgICAgICAgICpzID0gJ1wwJzsKKyAgICAgIHN0cmNhdChsb2NhdGlvbiwgIi8iKTsKKyAgICAgIHN0cmNhdChsb2NhdGlvbiwgbG9jKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiQ29ubmVjdGluZyB0byAnJXMnIHRvIHJldHJpZXZlIHJlbGF0aXZlICclcycgc2NoZW1hLi4uICIsIGxvY2F0aW9uLCBsb2MpOworICAgICAgaWYgKHNvYXBfY29ubmVjdF9jb21tYW5kKHNvYXAsIFNPQVBfR0VULCBsb2NhdGlvbiwgTlVMTCkpCisgICAgICB7IGZwcmludGYoc3RkZXJyLCAiY29ubmVjdGlvbiBmYWlsZWRcbiIpOworICAgICAgICBleGl0KDEpOworICAgICAgfQorICAgICAgZnByaW50ZihzdGRlcnIsICJjb25uZWN0ZWQsIHJlY2VpdmluZy4uLlxuIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7IHNvYXAtPnJlY3ZmZCA9IG9wZW4obG9jLCBPX1JET05MWSwgMCk7CisgICAgICBpZiAoc29hcC0+cmVjdmZkIDwgMCkKKyAgICAgIHsgaWYgKGN3ZCkKKyAgICAgICAgeyBjaGFyICpzOworICAgICAgICAgIGxvY2F0aW9uID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihjd2QpICsgc3RybGVuKGxvYykgKyAyKTsKKyAgICAgICAgICBzdHJjcHkobG9jYXRpb24sIGN3ZCk7CisgICAgICAgICAgcyA9IHN0cnJjaHIobG9jYXRpb24sICcvJyk7CisgICAgICAgICAgaWYgKHMpCisgICAgICAgICAgICAqcyA9ICdcMCc7CisgICAgICAgICAgc3RyY2F0KGxvY2F0aW9uLCAiLyIpOworICAgICAgICAgIHN0cmNhdChsb2NhdGlvbiwgbG9jKTsKKyAgICAgICAgICBzb2FwLT5yZWN2ZmQgPSBvcGVuKGxvY2F0aW9uLCBPX1JET05MWSwgMCk7CisJfQorICAgICAgICBpZiAoc29hcC0+cmVjdmZkIDwgMCAmJiBpbXBvcnRfcGF0aCkKKyAgICAgICAgeyBsb2NhdGlvbiA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzdHJsZW4oaW1wb3J0X3BhdGgpICsgc3RybGVuKGxvYykgKyAyKTsKKyAgICAgICAgICBzdHJjcHkobG9jYXRpb24sIGltcG9ydF9wYXRoKTsKKyAgICAgICAgICBzdHJjYXQobG9jYXRpb24sICIvIik7CisgICAgICAgICAgc3RyY2F0KGxvY2F0aW9uLCBsb2MpOworICAgICAgICAgIHNvYXAtPnJlY3ZmZCA9IG9wZW4obG9jYXRpb24sIE9fUkRPTkxZLCAwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc29hcC0+cmVjdmZkIDwgMCkKKyAgICAgICAgeyBmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBvcGVuICclcycgdG8gcmV0cmlldmUgc2NoZW1hXG4iLCBsb2MpOworICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgbG9jYXRpb24gPSBzb2FwX3N0cmR1cChzb2FwLCBsb2MpOworICAgICAgZnByaW50ZihzdGRlcnIsICJSZWFkaW5nIHNjaGVtYSBmaWxlICclcydcbiIsIGxvY2F0aW9uKTsKKyAgICB9CisgIH0KKyAgaWYgKCFzb2FwX2JlZ2luX3JlY3Yoc29hcCkpCisgICAgdGhpcy0+c29hcF9pbihzb2FwLCAieHM6c2NoZW1hIiwgTlVMTCk7CisgIGlmICgoc29hcC0+ZXJyb3IgPj0gMzAxICYmIHNvYXAtPmVycm9yIDw9IDMwMykgfHwgc29hcC0+ZXJyb3IgPT0gMzA3KSAvLyBIVFRQIHJlZGlyZWN0LCBzb2NrZXQgd2FzIGNsb3NlZAorICB7IGludCByID0gU09BUF9FUlI7CisgICAgZnByaW50ZihzdGRlcnIsICJSZWRpcmVjdGVkIHRvICclcydcbiIsIHNvYXAtPmVuZHBvaW50KTsKKyAgICBpZiAocmVkaXJzKysgPCAxMCkKKyAgICAgIHIgPSByZWFkKGN3ZCwgc29hcC0+ZW5kcG9pbnQpOworICAgIGVsc2UKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiTWF4IHJlZGlyZWN0cyBleGNlZWRlZFxuIik7CisgICAgcmVkaXJzLS07CisgICAgcmV0dXJuIHI7CisgIH0KKyAgaWYgKHNvYXAtPmVycm9yKQorICB7IGZwcmludGYoc3RkZXJyLCAiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcGFyc2luZyBzY2hlbWEgZnJvbSAnJXMnXG4iLCBsb2M/bG9jOiIiKTsKKyAgICBzb2FwX3ByaW50X2ZhdWx0KHNvYXAsIHN0ZGVycik7CisgICAgc29hcF9wcmludF9mYXVsdF9sb2NhdGlvbihzb2FwLCBzdGRlcnIpOworICAgIGV4aXQoMSk7CisgIH0KKyAgc29hcF9lbmRfcmVjdihzb2FwKTsKKyAgaWYgKHNvYXAtPnJlY3ZmZCA+PSAwKQorICB7IGNsb3NlKHNvYXAtPnJlY3ZmZCk7CisgICAgc29hcC0+cmVjdmZkID0gLTE7CisgIH0KKyAgZWxzZQorICAgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICByZXR1cm4gU09BUF9PSzsKK30KKwordm9pZCB4c19fc2NoZW1hOjpzb3VyY2VMb2NhdGlvbihjb25zdCBjaGFyICpsb2MpCit7IGxvY2F0aW9uID0gc29hcF9zdHJkdXAoc29hcCwgbG9jKTsKK30KKworY29uc3QgY2hhciAqeHNfX3NjaGVtYTo6c291cmNlTG9jYXRpb24oKQoreyByZXR1cm4gbG9jYXRpb247Cit9CisKK2ludCB4c19fc2NoZW1hOjplcnJvcigpCit7IHJldHVybiBzb2FwLT5lcnJvcjsKK30KKwordm9pZCB4c19fc2NoZW1hOjpwcmludF9mYXVsdCgpCit7IHNvYXBfcHJpbnRfZmF1bHQoc29hcCwgc3RkZXJyKTsKKyAgc29hcF9wcmludF9mYXVsdF9sb2NhdGlvbihzb2FwLCBzdGRlcnIpOworfQorCit2b2lkIHhzX19zY2hlbWE6OmJ1aWx0aW5UeXBlKGNvbnN0IGNoYXIgKnR5cGUpCit7IGJ1aWx0aW5UeXBlU2V0Lmluc2VydCh0eXBlKTsKK30KKwordm9pZCB4c19fc2NoZW1hOjpidWlsdGluRWxlbWVudChjb25zdCBjaGFyICplbGVtZW50KQoreyBidWlsdGluRWxlbWVudFNldC5pbnNlcnQoZWxlbWVudCk7Cit9CisKK3ZvaWQgeHNfX3NjaGVtYTo6YnVpbHRpbkF0dHJpYnV0ZShjb25zdCBjaGFyICphdHRyaWJ1dGUpCit7IGJ1aWx0aW5BdHRyaWJ1dGVTZXQuaW5zZXJ0KGF0dHJpYnV0ZSk7Cit9CisKK2NvbnN0IFNldE9mU3RyaW5nJiB4c19fc2NoZW1hOjpidWlsdGluVHlwZXMoKSBjb25zdAoreyByZXR1cm4gYnVpbHRpblR5cGVTZXQ7Cit9CisKK2NvbnN0IFNldE9mU3RyaW5nJiB4c19fc2NoZW1hOjpidWlsdGluRWxlbWVudHMoKSBjb25zdAoreyByZXR1cm4gYnVpbHRpbkVsZW1lbnRTZXQ7Cit9CisKK2NvbnN0IFNldE9mU3RyaW5nJiB4c19fc2NoZW1hOjpidWlsdGluQXR0cmlidXRlcygpIGNvbnN0Cit7IHJldHVybiBidWlsdGluQXR0cmlidXRlU2V0OworfQorCit4c19faW5jbHVkZTo6eHNfX2luY2x1ZGUoKQoreyBzY2hlbWFMb2NhdGlvbiA9IE5VTEw7CisgIHNjaGVtYVJlZiA9IE5VTEw7Cit9CisKK2ludCB4c19faW5jbHVkZTo6cHJlcHJvY2Vzcyh4c19fc2NoZW1hICZzY2hlbWEpCit7IGlmICh2ZmxhZykKKyAgICBjZXJyIDw8ICJQcmVwcm9jZXNzaW5nIHNjaGVtYSBpbmNsdWRlICIgPDwgKHNjaGVtYUxvY2F0aW9uP3NjaGVtYUxvY2F0aW9uOiIiKSA8PCBlbmRsOworICBpZiAoIXNjaGVtYVJlZikKKyAgICBpZiAoc2NoZW1hTG9jYXRpb24pCisgICAgICBzY2hlbWFSZWYgPSBuZXcgeHNfX3NjaGVtYShzY2hlbWEuc29hcCwgc2NoZW1hLnNvdXJjZUxvY2F0aW9uKCksIHNjaGVtYUxvY2F0aW9uKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK2ludCB4c19faW5jbHVkZTo6dHJhdmVyc2UoeHNfX3NjaGVtYSAmc2NoZW1hKQoreyByZXR1cm4gU09BUF9PSzsKK30KKwordm9pZCB4c19faW5jbHVkZTo6c2NoZW1hUHRyKHhzX19zY2hlbWEgKnNjaGVtYSkKK3sgc2NoZW1hUmVmID0gc2NoZW1hOworfQorCit4c19fc2NoZW1hICp4c19faW5jbHVkZTo6c2NoZW1hUHRyKCkgY29uc3QKK3sgcmV0dXJuIHNjaGVtYVJlZjsKK30KKworeHNfX3JlZGVmaW5lOjp4c19fcmVkZWZpbmUoKQoreyBzY2hlbWFMb2NhdGlvbiA9IE5VTEw7CisgIHNjaGVtYVJlZiA9IE5VTEw7Cit9CisKK2ludCB4c19fcmVkZWZpbmU6OnByZXByb2Nlc3MoeHNfX3NjaGVtYSAmc2NoZW1hKQoreyBpZiAodmZsYWcpCisgICAgY2VyciA8PCAiUHJlcHJvY2Vzc2luZyBzY2hlbWEgcmVkZWZpbmUgIiA8PCAoc2NoZW1hTG9jYXRpb24/c2NoZW1hTG9jYXRpb246IiIpIDw8IGVuZGw7CisgIGlmICghc2NoZW1hUmVmKQorICB7IGlmIChzY2hlbWFMb2NhdGlvbikKKyAgICB7IHNjaGVtYVJlZiA9IG5ldyB4c19fc2NoZW1hKHNjaGVtYS5zb2FwLCBzY2hlbWEuc291cmNlTG9jYXRpb24oKSwgc2NoZW1hTG9jYXRpb24pOworICAgICAgZm9yICh2ZWN0b3I8eHNfX2dyb3VwPjo6aXRlcmF0b3IgZ3AgPSBzY2hlbWFSZWYtPmdyb3VwLmJlZ2luKCk7IGdwICE9IHNjaGVtYVJlZi0+Z3JvdXAuZW5kKCk7ICsrZ3ApCisgICAgICB7IGlmICgoKmdwKS5uYW1lKQorICAgICAgICB7IGZvciAodmVjdG9yPHhzX19ncm91cD46OmNvbnN0X2l0ZXJhdG9yIGcgPSBncm91cC5iZWdpbigpOyBnICE9IGdyb3VwLmVuZCgpOyArK2cpCisgICAgICAgICAgeyBpZiAoKCpnKS5uYW1lICYmICFzdHJjbXAoKCpncCkubmFtZSwgKCpnKS5uYW1lKSkKKyAgICAgICAgICAgIHsgKmdwID0gKmc7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZm9yICh2ZWN0b3I8eHNfX2F0dHJpYnV0ZUdyb3VwPjo6aXRlcmF0b3IgYWcgPSBzY2hlbWFSZWYtPmF0dHJpYnV0ZUdyb3VwLmJlZ2luKCk7IGFnICE9IHNjaGVtYVJlZi0+YXR0cmlidXRlR3JvdXAuZW5kKCk7ICsrYWcpCisgICAgICB7IGlmICgoKmFnKS5uYW1lKQorICAgICAgICB7IGZvciAodmVjdG9yPHhzX19hdHRyaWJ1dGVHcm91cD46OmNvbnN0X2l0ZXJhdG9yIGcgPSBhdHRyaWJ1dGVHcm91cC5iZWdpbigpOyBnICE9IGF0dHJpYnV0ZUdyb3VwLmVuZCgpOyArK2cpCisgICAgICAgICAgeyBpZiAoKCpnKS5uYW1lICYmICFzdHJjbXAoKCphZykubmFtZSwgKCpnKS5uYW1lKSkKKyAgICAgICAgICAgIHsgKmFnID0gKmc7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZm9yICh2ZWN0b3I8eHNfX3NpbXBsZVR5cGU+OjppdGVyYXRvciBzdCA9IHNjaGVtYVJlZi0+c2ltcGxlVHlwZS5iZWdpbigpOyBzdCAhPSBzY2hlbWFSZWYtPnNpbXBsZVR5cGUuZW5kKCk7ICsrc3QpCisgICAgICB7IGlmICgoKnN0KS5uYW1lKQorICAgICAgICB7IGZvciAodmVjdG9yPHhzX19zaW1wbGVUeXBlPjo6Y29uc3RfaXRlcmF0b3IgcyA9IHNpbXBsZVR5cGUuYmVnaW4oKTsgcyAhPSBzaW1wbGVUeXBlLmVuZCgpOyArK3MpCisgICAgICAgICAgeyBpZiAoKCpzKS5uYW1lICYmICFzdHJjbXAoKCpzdCkubmFtZSwgKCpzKS5uYW1lKSkKKyAgICAgICAgICAgIHsgKnN0ID0gKnM7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZm9yICh2ZWN0b3I8eHNfX2NvbXBsZXhUeXBlPjo6aXRlcmF0b3IgY3QgPSBzY2hlbWFSZWYtPmNvbXBsZXhUeXBlLmJlZ2luKCk7IGN0ICE9IHNjaGVtYVJlZi0+Y29tcGxleFR5cGUuZW5kKCk7ICsrY3QpCisgICAgICB7IGlmICgoKmN0KS5uYW1lKQorICAgICAgICB7IGZvciAodmVjdG9yPHhzX19jb21wbGV4VHlwZT46OmNvbnN0X2l0ZXJhdG9yIGMgPSBjb21wbGV4VHlwZS5iZWdpbigpOyBjICE9IGNvbXBsZXhUeXBlLmVuZCgpOyArK2MpCisgICAgICAgICAgeyBpZiAoKCpjKS5uYW1lICYmICFzdHJjbXAoKCpjdCkubmFtZSwgKCpjKS5uYW1lKSkKKyAgICAgICAgICAgIHsgKmN0ID0gKmM7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKworaW50IHhzX19yZWRlZmluZTo6dHJhdmVyc2UoeHNfX3NjaGVtYSAmc2NoZW1hKQoreyByZXR1cm4gU09BUF9PSzsKK30KKwordm9pZCB4c19fcmVkZWZpbmU6OnNjaGVtYVB0cih4c19fc2NoZW1hICpzY2hlbWEpCit7IHNjaGVtYVJlZiA9IHNjaGVtYTsKK30KKworeHNfX3NjaGVtYSAqeHNfX3JlZGVmaW5lOjpzY2hlbWFQdHIoKSBjb25zdAoreyByZXR1cm4gc2NoZW1hUmVmOworfQorCit4c19faW1wb3J0Ojp4c19faW1wb3J0KCkKK3sgbmFtZXNwYWNlXyA9IE5VTEw7CisgIHNjaGVtYUxvY2F0aW9uID0gTlVMTDsKKyAgc2NoZW1hUmVmID0gTlVMTDsKK30KKworaW50IHhzX19pbXBvcnQ6OnRyYXZlcnNlKHhzX19zY2hlbWEgJnNjaGVtYSkKK3sgaWYgKHZmbGFnKQorICAgIGNlcnIgPDwgIkFuYWx5emluZyBzY2hlbWEgaW1wb3J0ICIgPDwgKG5hbWVzcGFjZV8/bmFtZXNwYWNlXzoiIikgPDwgZW5kbDsKKyAgaWYgKCFzY2hlbWFSZWYpCisgIHsgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgIGlmIChuYW1lc3BhY2VfKQorICAgIHsgZm9yIChTZXRPZlN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaSA9IGV4dHVyaXMuYmVnaW4oKTsgaSAhPSBleHR1cmlzLmVuZCgpOyArK2kpCisgICAgICB7IGlmICghc29hcF90YWdfY21wKG5hbWVzcGFjZV8sICppKSkKKyAgICAgICAgeyBmb3VuZCA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBubyBuYW1lc3BhY2UgaW4gPGltcG9ydD5cbiIpOworICAgIGlmICghZm91bmQgJiYgIWlmbGFnKSAvLyBkb24ndCBpbXBvcnQgYW55IG9mIHRoZSBzY2hlbWFzIGluIHRoZSAubnNtYXAgdGFibGUgKG9yIHdoZW4gLWkgb3B0aW9uIGlzIHVzZWQpCisgICAgeyBjb25zdCBjaGFyICpzID0gc2NoZW1hTG9jYXRpb247CisgICAgICBpZiAoIXMpCisgICAgICAgIHMgPSBuYW1lc3BhY2VfOworICAgICAgc2NoZW1hUmVmID0gbmV3IHhzX19zY2hlbWEoc2NoZW1hLnNvYXAsIHNjaGVtYS5zb3VyY2VMb2NhdGlvbigpLCBzKTsKKyAgICAgIGlmIChzY2hlbWFQdHIoKSkKKyAgICAgIHsgaWYgKCFzY2hlbWFQdHIoKS0+dGFyZ2V0TmFtZXNwYWNlIHx8ICEqc2NoZW1hUHRyKCktPnRhcmdldE5hbWVzcGFjZSkKKyAgICAgICAgICBzY2hlbWFQdHIoKS0+dGFyZ2V0TmFtZXNwYWNlID0gbmFtZXNwYWNlXzsKKyAgICAgICAgZWxzZSBpZiAoIW5hbWVzcGFjZV8gfHwgc3RyY21wKHNjaGVtYVB0cigpLT50YXJnZXROYW1lc3BhY2UsIG5hbWVzcGFjZV8pKQorICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogc2NoZW1hIGltcG9ydCAnJXMnIHdpdGggc2NoZW1hIHRhcmdldE5hbWVzcGFjZSAnJXMnIG1pc21hdGNoXG4iLCBuYW1lc3BhY2VfP25hbWVzcGFjZV86IiIsIHNjaGVtYVB0cigpLT50YXJnZXROYW1lc3BhY2UpOworICAgICAgICBzY2hlbWFQdHIoKS0+dHJhdmVyc2UoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK3ZvaWQgeHNfX2ltcG9ydDo6c2NoZW1hUHRyKHhzX19zY2hlbWEgKnNjaGVtYSkKK3sgc2NoZW1hUmVmID0gc2NoZW1hOworfQorCit4c19fc2NoZW1hICp4c19faW1wb3J0OjpzY2hlbWFQdHIoKSBjb25zdAoreyByZXR1cm4gc2NoZW1hUmVmOworfQorCit4c19fYXR0cmlidXRlOjp4c19fYXR0cmlidXRlKCkKK3sgc2NoZW1hUmVmID0gTlVMTDsKKyAgYXR0cmlidXRlUmVmID0gTlVMTDsKKyAgc2ltcGxlVHlwZVJlZiA9IE5VTEw7Cit9CisKK2ludCB4c19fYXR0cmlidXRlOjp0cmF2ZXJzZSh4c19fc2NoZW1hICZzY2hlbWEpCit7IGlmICh2ZmxhZykKKyAgICBjZXJyIDw8ICJBbmFseXppbmcgc2NoZW1hIGF0dHJpYnV0ZSAiIDw8IChuYW1lP25hbWU6IiIpIDw8IGVuZGw7CisgIHNjaGVtYVJlZiA9ICZzY2hlbWE7CisgIGNvbnN0IGNoYXIgKnRva2VuID0gcW5hbWVfdG9rZW4ocmVmLCBzY2hlbWEudGFyZ2V0TmFtZXNwYWNlKTsKKyAgYXR0cmlidXRlUmVmID0gTlVMTDsKKyAgaWYgKHRva2VuKQorICB7IGZvciAodmVjdG9yPHhzX19hdHRyaWJ1dGU+OjppdGVyYXRvciBpID0gc2NoZW1hLmF0dHJpYnV0ZS5iZWdpbigpOyBpICE9IHNjaGVtYS5hdHRyaWJ1dGUuZW5kKCk7ICsraSkKKyAgICAgIGlmICghc3RyY21wKCgqaSkubmFtZSwgdG9rZW4pKQorICAgICAgeyBhdHRyaWJ1dGVSZWYgPSAmKCppKTsKKyAgICAgICAgaWYgKHZmbGFnKQorICAgICAgICAgIGNlcnIgPDwgIkZvdW5kIGF0dHJpYnV0ZSAiIDw8IChuYW1lP25hbWU6IiIpIDw8ICIgcmVmICIgPDwgKHRva2VuP3Rva2VuOiIiKSA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgfQorICBlbHNlCisgIHsgZm9yICh2ZWN0b3I8eHNfX2ltcG9ydD46Oml0ZXJhdG9yIGkgPSBzY2hlbWEuaW1wb3J0LmJlZ2luKCk7IGkgIT0gc2NoZW1hLmltcG9ydC5lbmQoKTsgKytpKQorICAgIHsgeHNfX3NjaGVtYSAqcyA9ICgqaSkuc2NoZW1hUHRyKCk7CisgICAgICBpZiAocykKKyAgICAgIHsgdG9rZW4gPSBxbmFtZV90b2tlbihyZWYsIHMtPnRhcmdldE5hbWVzcGFjZSk7CisgICAgICAgIGlmICh0b2tlbikKKyAgICAgICAgeyBmb3IgKHZlY3Rvcjx4c19fYXR0cmlidXRlPjo6aXRlcmF0b3IgaiA9IHMtPmF0dHJpYnV0ZS5iZWdpbigpOyBqICE9IHMtPmF0dHJpYnV0ZS5lbmQoKTsgKytqKQorICAgICAgICAgICAgaWYgKCFzdHJjbXAoKCpqKS5uYW1lLCB0b2tlbikpCisgICAgICAgICAgICB7IGF0dHJpYnV0ZVJlZiA9ICYoKmopOworICAgICAgICAgICAgICBpZiAodmZsYWcpCisgICAgICAgICAgICAgICAgY2VyciA8PCAiRm91bmQgYXR0cmlidXRlICIgPDwgKG5hbWU/bmFtZToiIikgPDwgIiByZWYgIiA8PCAodG9rZW4/dG9rZW46IiIpIDw8IGVuZGw7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChzaW1wbGVUeXBlKQorICB7IHNpbXBsZVR5cGUtPnRyYXZlcnNlKHNjaGVtYSk7CisgICAgc2ltcGxlVHlwZVJlZiA9IHNpbXBsZVR5cGU7CisgIH0KKyAgZWxzZQorICB7IHRva2VuID0gcW5hbWVfdG9rZW4odHlwZSwgc2NoZW1hLnRhcmdldE5hbWVzcGFjZSk7CisgICAgc2ltcGxlVHlwZVJlZiA9IE5VTEw7CisgICAgaWYgKHRva2VuKQorICAgIHsgZm9yICh2ZWN0b3I8eHNfX3NpbXBsZVR5cGU+OjppdGVyYXRvciBpID0gc2NoZW1hLnNpbXBsZVR5cGUuYmVnaW4oKTsgaSAhPSBzY2hlbWEuc2ltcGxlVHlwZS5lbmQoKTsgKytpKQorICAgICAgICBpZiAoIXN0cmNtcCgoKmkpLm5hbWUsIHRva2VuKSkKKyAgICAgICAgeyBzaW1wbGVUeXBlUmVmID0gJigqaSk7CisgICAgICAgICAgaWYgKHZmbGFnKQorICAgICAgICAgICAgY2VyciA8PCAiRm91bmQgYXR0cmlidXRlICIgPDwgKG5hbWU/bmFtZToiIikgPDwgIiB0eXBlICIgPDwgKHRva2VuP3Rva2VuOiIiKSA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7IGZvciAodmVjdG9yPHhzX19pbXBvcnQ+OjppdGVyYXRvciBpID0gc2NoZW1hLmltcG9ydC5iZWdpbigpOyBpICE9IHNjaGVtYS5pbXBvcnQuZW5kKCk7ICsraSkKKyAgICAgIHsgeHNfX3NjaGVtYSAqcyA9ICgqaSkuc2NoZW1hUHRyKCk7CisgICAgICAgIGlmIChzKQorICAgICAgICB7IHRva2VuID0gcW5hbWVfdG9rZW4odHlwZSwgcy0+dGFyZ2V0TmFtZXNwYWNlKTsKKyAgICAgICAgICBpZiAodG9rZW4pCisgICAgICAgICAgeyBmb3IgKHZlY3Rvcjx4c19fc2ltcGxlVHlwZT46Oml0ZXJhdG9yIGogPSBzLT5zaW1wbGVUeXBlLmJlZ2luKCk7IGogIT0gcy0+c2ltcGxlVHlwZS5lbmQoKTsgKytqKQorICAgICAgICAgICAgICBpZiAoIXN0cmNtcCgoKmopLm5hbWUsIHRva2VuKSkKKyAgICAgICAgICAgICAgeyBzaW1wbGVUeXBlUmVmID0gJigqaik7CisgICAgICAgICAgICAgICAgaWYgKHZmbGFnKQorICAgICAgICAgICAgICAgICAgY2VyciA8PCAiRm91bmQgYXR0cmlidXRlICIgPDwgKG5hbWU/bmFtZToiIikgPDwgIiB0eXBlICIgPDwgKHRva2VuP3Rva2VuOiIiKSA8PCBlbmRsOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKCFhdHRyaWJ1dGVSZWYgJiYgIXNpbXBsZVR5cGVSZWYpCisgIHsgaWYgKHJlZikKKyAgICB7IGlmIChpc19idWlsdGluX3FuYW1lKHJlZikpCisgICAgICAgIHNjaGVtYS5idWlsdGluQXR0cmlidXRlKHJlZik7CisgICAgICBlbHNlCisgICAgICAgIGNlcnIgPDwgIldhcm5pbmc6IGNvdWxkIG5vdCBmaW5kIGF0dHJpYnV0ZSAnIiA8PCAobmFtZT9uYW1lOiIiKSA8PCAiJyByZWYgJyIgPDwgcmVmIDw8ICInIGluIHNjaGVtYSAiIDw8IChzY2hlbWEudGFyZ2V0TmFtZXNwYWNlP3NjaGVtYS50YXJnZXROYW1lc3BhY2U6IiIpIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUpCisgICAgeyBpZiAoaXNfYnVpbHRpbl9xbmFtZSh0eXBlKSkKKyAgICAgICAgc2NoZW1hLmJ1aWx0aW5UeXBlKHR5cGUpOworICAgICAgZWxzZQorICAgICAgICBjZXJyIDw8ICJXYXJuaW5nOiBjb3VsZCBub3QgZmluZCBhdHRyaWJ1dGUgJyIgPDwgKG5hbWU/bmFtZToiIikgPDwgIicgdHlwZSAnIiA8PCB0eXBlIDw8ICInIGluIHNjaGVtYSAiIDw8IChzY2hlbWEudGFyZ2V0TmFtZXNwYWNlP3NjaGVtYS50YXJnZXROYW1lc3BhY2U6IiIpIDw8IGVuZGw7CisgICAgfQorICB9CisgIHJldHVybiBTT0FQX09LOworfQorCit2b2lkIHhzX19hdHRyaWJ1dGU6OnNjaGVtYVB0cih4c19fc2NoZW1hICpzY2hlbWEpCit7IHNjaGVtYVJlZiA9IHNjaGVtYTsKK30KKworeHNfX3NjaGVtYSogeHNfX2F0dHJpYnV0ZTo6c2NoZW1hUHRyKCkgY29uc3QKK3sgcmV0dXJuIHNjaGVtYVJlZjsKK30KKwordm9pZCB4c19fYXR0cmlidXRlOjphdHRyaWJ1dGVQdHIoeHNfX2F0dHJpYnV0ZSAqYXR0cmlidXRlKQoreyBhdHRyaWJ1dGVSZWYgPSBhdHRyaWJ1dGU7Cit9CisKK3ZvaWQgeHNfX2F0dHJpYnV0ZTo6c2ltcGxlVHlwZVB0cih4c19fc2ltcGxlVHlwZSAqc2ltcGxlVHlwZSkKK3sgc2ltcGxlVHlwZVJlZiA9IHNpbXBsZVR5cGU7Cit9CisKK3hzX19hdHRyaWJ1dGUgKnhzX19hdHRyaWJ1dGU6OmF0dHJpYnV0ZVB0cigpIGNvbnN0Cit7IHJldHVybiBhdHRyaWJ1dGVSZWY7Cit9CisKK3hzX19zaW1wbGVUeXBlICp4c19fYXR0cmlidXRlOjpzaW1wbGVUeXBlUHRyKCkgY29uc3QKK3sgcmV0dXJuIHNpbXBsZVR5cGVSZWY7Cit9CisKK3hzX19lbGVtZW50Ojp4c19fZWxlbWVudCgpCit7IHNjaGVtYVJlZiA9IE5VTEw7CisgIGVsZW1lbnRSZWYgPSBOVUxMOworICBzaW1wbGVUeXBlUmVmID0gTlVMTDsKKyAgY29tcGxleFR5cGVSZWYgPSBOVUxMOworfQorCitpbnQgeHNfX2VsZW1lbnQ6OnRyYXZlcnNlKHhzX19zY2hlbWEgJnNjaGVtYSkKK3sgaWYgKHZmbGFnKQorICAgIGNlcnIgPDwgIkFuYWx5emluZyBzY2hlbWEgZWxlbWVudCAiIDw8IChuYW1lP25hbWU6IiIpIDw8IGVuZGw7CisgIHNjaGVtYVJlZiA9ICZzY2hlbWE7CisgIGNvbnN0IGNoYXIgKnRva2VuID0gcW5hbWVfdG9rZW4ocmVmLCBzY2hlbWEudGFyZ2V0TmFtZXNwYWNlKTsKKyAgZWxlbWVudFJlZiA9IE5VTEw7CisgIGlmICh0b2tlbikKKyAgeyBmb3IgKHZlY3Rvcjx4c19fZWxlbWVudD46Oml0ZXJhdG9yIGkgPSBzY2hlbWEuZWxlbWVudC5iZWdpbigpOyBpICE9IHNjaGVtYS5lbGVtZW50LmVuZCgpOyArK2kpCisgICAgICBpZiAoIXN0cmNtcCgoKmkpLm5hbWUsIHRva2VuKSkKKyAgICAgIHsgZWxlbWVudFJlZiA9ICYoKmkpOworICAgICAgICBpZiAodmZsYWcpCisgICAgICAgICAgY2VyciA8PCAiRm91bmQgZWxlbWVudCAiIDw8IChuYW1lP25hbWU6IiIpIDw8ICIgcmVmICIgPDwgKHRva2VuP3Rva2VuOiIiKSA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgfQorICBlbHNlCisgIHsgZm9yICh2ZWN0b3I8eHNfX2ltcG9ydD46OmNvbnN0X2l0ZXJhdG9yIGkgPSBzY2hlbWEuaW1wb3J0LmJlZ2luKCk7IGkgIT0gc2NoZW1hLmltcG9ydC5lbmQoKTsgKytpKQorICAgIHsgeHNfX3NjaGVtYSAqcyA9ICgqaSkuc2NoZW1hUHRyKCk7CisgICAgICBpZiAocykKKyAgICAgIHsgdG9rZW4gPSBxbmFtZV90b2tlbihyZWYsIHMtPnRhcmdldE5hbWVzcGFjZSk7CisgICAgICAgIGlmICh0b2tlbikKKyAgICAgICAgeyBmb3IgKHZlY3Rvcjx4c19fZWxlbWVudD46Oml0ZXJhdG9yIGogPSBzLT5lbGVtZW50LmJlZ2luKCk7IGogIT0gcy0+ZWxlbWVudC5lbmQoKTsgKytqKQorICAgICAgICAgIHsgaWYgKCFzdHJjbXAoKCpqKS5uYW1lLCB0b2tlbikpCisgICAgICAgICAgICB7IGVsZW1lbnRSZWYgPSAmKCpqKTsKKyAgICAgICAgICAgICAgaWYgKHZmbGFnKQorICAgICAgICAgICAgICAgIGNlcnIgPDwgIkZvdW5kIGVsZW1lbnQgIiA8PCAobmFtZT9uYW1lOiIiKSA8PCAiIHJlZiAiIDw8ICh0b2tlbj90b2tlbjoiIikgPDwgZW5kbDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisJICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKHNpbXBsZVR5cGUpCisgIHsgc2ltcGxlVHlwZS0+dHJhdmVyc2Uoc2NoZW1hKTsKKyAgICBzaW1wbGVUeXBlUmVmID0gc2ltcGxlVHlwZTsKKyAgfQorICBlbHNlCisgIHsgdG9rZW4gPSBxbmFtZV90b2tlbih0eXBlLCBzY2hlbWEudGFyZ2V0TmFtZXNwYWNlKTsKKyAgICBzaW1wbGVUeXBlUmVmID0gTlVMTDsKKyAgICBpZiAodG9rZW4pCisgICAgeyBmb3IgKHZlY3Rvcjx4c19fc2ltcGxlVHlwZT46Oml0ZXJhdG9yIGkgPSBzY2hlbWEuc2ltcGxlVHlwZS5iZWdpbigpOyBpICE9IHNjaGVtYS5zaW1wbGVUeXBlLmVuZCgpOyArK2kpCisgICAgICAgIGlmICghc3RyY21wKCgqaSkubmFtZSwgdG9rZW4pKQorICAgICAgICB7IHNpbXBsZVR5cGVSZWYgPSAmKCppKTsKKyAgICAgICAgICBpZiAodmZsYWcpCisgICAgICAgICAgICBjZXJyIDw8ICJGb3VuZCBlbGVtZW50ICIgPDwgKG5hbWU/bmFtZToiIikgPDwgIiBzaW1wbGVUeXBlICIgPDwgKHRva2VuP3Rva2VuOiIiKSA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7IGZvciAodmVjdG9yPHhzX19pbXBvcnQ+Ojpjb25zdF9pdGVyYXRvciBpID0gc2NoZW1hLmltcG9ydC5iZWdpbigpOyBpICE9IHNjaGVtYS5pbXBvcnQuZW5kKCk7ICsraSkKKyAgICAgIHsgeHNfX3NjaGVtYSAqcyA9ICgqaSkuc2NoZW1hUHRyKCk7CisgICAgICAgIGlmIChzKQorICAgICAgICB7IHRva2VuID0gcW5hbWVfdG9rZW4odHlwZSwgcy0+dGFyZ2V0TmFtZXNwYWNlKTsKKyAgICAgICAgICBpZiAodG9rZW4pCisgICAgICAgICAgeyBmb3IgKHZlY3Rvcjx4c19fc2ltcGxlVHlwZT46Oml0ZXJhdG9yIGogPSBzLT5zaW1wbGVUeXBlLmJlZ2luKCk7IGogIT0gcy0+c2ltcGxlVHlwZS5lbmQoKTsgKytqKQorICAgICAgICAgICAgeyBpZiAoIXN0cmNtcCgoKmopLm5hbWUsIHRva2VuKSkKKyAgICAgICAgICAgICAgeyBzaW1wbGVUeXBlUmVmID0gJigqaik7CisgICAgICAgICAgICAgICAgaWYgKHZmbGFnKQorICAgICAgICAgICAgICAgICAgY2VyciA8PCAiRm91bmQgZWxlbWVudCAiIDw8IChuYW1lP25hbWU6IiIpIDw8ICIgc2ltcGxlVHlwZSAiIDw8ICh0b2tlbj90b2tlbjoiIikgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCSAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKGNvbXBsZXhUeXBlKQorICB7IGNvbXBsZXhUeXBlLT50cmF2ZXJzZShzY2hlbWEpOworICAgIGNvbXBsZXhUeXBlUmVmID0gY29tcGxleFR5cGU7CisgIH0KKyAgZWxzZQorICB7IHRva2VuID0gcW5hbWVfdG9rZW4odHlwZSwgc2NoZW1hLnRhcmdldE5hbWVzcGFjZSk7CisgICAgY29tcGxleFR5cGVSZWYgPSBOVUxMOworICAgIGlmICh0b2tlbikKKyAgICB7IGZvciAodmVjdG9yPHhzX19jb21wbGV4VHlwZT46Oml0ZXJhdG9yIGkgPSBzY2hlbWEuY29tcGxleFR5cGUuYmVnaW4oKTsgaSAhPSBzY2hlbWEuY29tcGxleFR5cGUuZW5kKCk7ICsraSkKKyAgICAgICAgaWYgKCFzdHJjbXAoKCppKS5uYW1lLCB0b2tlbikpCisgICAgICAgIHsgY29tcGxleFR5cGVSZWYgPSAmKCppKTsKKyAgICAgICAgICBpZiAodmZsYWcpCisgICAgICAgICAgICBjZXJyIDw8ICJGb3VuZCBlbGVtZW50ICIgPDwgKG5hbWU/bmFtZToiIikgPDwgIiBjb21wbGV4VHlwZSAiIDw8ICh0b2tlbj90b2tlbjoiIikgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeyBmb3IgKHZlY3Rvcjx4c19faW1wb3J0Pjo6Y29uc3RfaXRlcmF0b3IgaSA9IHNjaGVtYS5pbXBvcnQuYmVnaW4oKTsgaSAhPSBzY2hlbWEuaW1wb3J0LmVuZCgpOyArK2kpCisgICAgICB7IHhzX19zY2hlbWEgKnMgPSAoKmkpLnNjaGVtYVB0cigpOworICAgICAgICBpZiAocykKKyAgICAgICAgeyB0b2tlbiA9IHFuYW1lX3Rva2VuKHR5cGUsIHMtPnRhcmdldE5hbWVzcGFjZSk7CisgICAgICAgICAgaWYgKHRva2VuKQorICAgICAgICAgIHsgZm9yICh2ZWN0b3I8eHNfX2NvbXBsZXhUeXBlPjo6aXRlcmF0b3IgaiA9IHMtPmNvbXBsZXhUeXBlLmJlZ2luKCk7IGogIT0gcy0+Y29tcGxleFR5cGUuZW5kKCk7ICsraikKKyAgICAgICAgICAgIHsgaWYgKCFzdHJjbXAoKCpqKS5uYW1lLCB0b2tlbikpCisgICAgICAgICAgICAgIHsgY29tcGxleFR5cGVSZWYgPSAmKCpqKTsKKyAgICAgICAgICAgICAgICBpZiAodmZsYWcpCisgICAgICAgICAgICAgICAgICBjZXJyIDw8ICJGb3VuZCBlbGVtZW50ICIgPDwgKG5hbWU/bmFtZToiIikgPDwgIiBjb21wbGV4VHlwZSAiIDw8ICh0b2tlbj90b2tlbjoiIikgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCSAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgdG9rZW4gPSBxbmFtZV90b2tlbihzdWJzdGl0dXRpb25Hcm91cCwgc2NoZW1hLnRhcmdldE5hbWVzcGFjZSk7CisgIGlmICh0b2tlbikKKyAgeyBmb3IgKHZlY3Rvcjx4c19fZWxlbWVudD46Oml0ZXJhdG9yIGkgPSBzY2hlbWEuZWxlbWVudC5iZWdpbigpOyBpICE9IHNjaGVtYS5lbGVtZW50LmVuZCgpOyArK2kpCisgICAgICBpZiAoIXN0cmNtcCgoKmkpLm5hbWUsIHRva2VuKSkKKyAgICAgIHsgKCppKS5zdWJzdGl0dXRpb25zLnB1c2hfYmFjayh0aGlzKTsKKyAgICAgICAgaWYgKHZmbGFnKQorICAgICAgICAgIGNlcnIgPDwgIkZvdW5kIHN1YnN0aXR1dGlvbkdyb3VwIGVsZW1lbnQgIiA8PCAobmFtZT9uYW1lOiIiKSA8PCAiIGZvciBhYnN0cmFjdCBlbGVtZW50ICIgPDwgKHRva2VuP3Rva2VuOiIiKSA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgfQorICBlbHNlCisgIHsgZm9yICh2ZWN0b3I8eHNfX2ltcG9ydD46OmNvbnN0X2l0ZXJhdG9yIGkgPSBzY2hlbWEuaW1wb3J0LmJlZ2luKCk7IGkgIT0gc2NoZW1hLmltcG9ydC5lbmQoKTsgKytpKQorICAgIHsgeHNfX3NjaGVtYSAqcyA9ICgqaSkuc2NoZW1hUHRyKCk7CisgICAgICBpZiAocykKKyAgICAgIHsgdG9rZW4gPSBxbmFtZV90b2tlbihzdWJzdGl0dXRpb25Hcm91cCwgcy0+dGFyZ2V0TmFtZXNwYWNlKTsKKyAgICAgICAgaWYgKHRva2VuKQorICAgICAgICB7IGZvciAodmVjdG9yPHhzX19lbGVtZW50Pjo6aXRlcmF0b3IgaiA9IHMtPmVsZW1lbnQuYmVnaW4oKTsgaiAhPSBzLT5lbGVtZW50LmVuZCgpOyArK2opCisgICAgICAgICAgeyBpZiAoIXN0cmNtcCgoKmopLm5hbWUsIHRva2VuKSkKKyAgICAgICAgICAgIHsgKCpqKS5zdWJzdGl0dXRpb25zLnB1c2hfYmFjayh0aGlzKTsKKyAgICAgICAgICAgICAgaWYgKHZmbGFnKQorICAgICAgICAgICAgICAgIGNlcnIgPDwgIkZvdW5kIHN1YnN0aXR1dGlvbkdyb3VwIGVsZW1lbnQgIiA8PCAobmFtZT9uYW1lOiIiKSA8PCAiIGZvciBhYnN0cmFjdCBlbGVtZW50ICIgPDwgKHRva2VuP3Rva2VuOiIiKSA8PCBlbmRsOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKwkgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoIWVsZW1lbnRSZWYgJiYgIXNpbXBsZVR5cGVSZWYgJiYgIWNvbXBsZXhUeXBlUmVmKQorICB7IGlmIChyZWYpCisgICAgeyBpZiAoaXNfYnVpbHRpbl9xbmFtZShyZWYpKQorICAgICAgICBzY2hlbWEuYnVpbHRpbkVsZW1lbnQocmVmKTsKKyAgICAgIGVsc2UKKyAgICAgICAgY2VyciA8PCAiV2FybmluZzogY291bGQgbm90IGZpbmQgZWxlbWVudCAnIiA8PCAobmFtZT9uYW1lOiIiKSA8PCAiJyByZWYgJyIgPDwgcmVmIDw8ICInIGluIHNjaGVtYSAiIDw8IChzY2hlbWEudGFyZ2V0TmFtZXNwYWNlP3NjaGVtYS50YXJnZXROYW1lc3BhY2U6IiIpIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUpCisgICAgeyBpZiAoaXNfYnVpbHRpbl9xbmFtZSh0eXBlKSkKKyAgICAgICAgc2NoZW1hLmJ1aWx0aW5UeXBlKHR5cGUpOworICAgICAgZWxzZQorICAgICAgICBjZXJyIDw8ICJXYXJuaW5nOiBjb3VsZCBub3QgZmluZCBlbGVtZW50ICciIDw8IChuYW1lP25hbWU6IiIpIDw8ICInIHR5cGUgJyIgPDwgdHlwZSA8PCAiJyBpbiBzY2hlbWEgIiA8PCAoc2NoZW1hLnRhcmdldE5hbWVzcGFjZT9zY2hlbWEudGFyZ2V0TmFtZXNwYWNlOiIiKSA8PCBlbmRsOworICAgIH0KKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKwordm9pZCB4c19fZWxlbWVudDo6c2NoZW1hUHRyKHhzX19zY2hlbWEgKnNjaGVtYSkKK3sgc2NoZW1hUmVmID0gc2NoZW1hOworfQorCit4c19fc2NoZW1hKiB4c19fZWxlbWVudDo6c2NoZW1hUHRyKCkgY29uc3QKK3sgcmV0dXJuIHNjaGVtYVJlZjsKK30KKwordm9pZCB4c19fZWxlbWVudDo6ZWxlbWVudFB0cih4c19fZWxlbWVudCAqZWxlbWVudCkKK3sgZWxlbWVudFJlZiA9IGVsZW1lbnQ7Cit9CisKK3ZvaWQgeHNfX2VsZW1lbnQ6OnNpbXBsZVR5cGVQdHIoeHNfX3NpbXBsZVR5cGUgKnNpbXBsZVR5cGUpCit7IHNpbXBsZVR5cGVSZWYgPSBzaW1wbGVUeXBlOworfQorCit2b2lkIHhzX19lbGVtZW50Ojpjb21wbGV4VHlwZVB0cih4c19fY29tcGxleFR5cGUgKmNvbXBsZXhUeXBlKQoreyBjb21wbGV4VHlwZVJlZiA9IGNvbXBsZXhUeXBlOworfQorCit4c19fZWxlbWVudCAqeHNfX2VsZW1lbnQ6OmVsZW1lbnRQdHIoKSBjb25zdAoreyByZXR1cm4gZWxlbWVudFJlZjsKK30KKworY29uc3Qgc3RkOjp2ZWN0b3I8eHNfX2VsZW1lbnQqPiogeHNfX2VsZW1lbnQ6OnN1YnN0aXR1dGlvbnNQdHIoKSBjb25zdAoreyByZXR1cm4gJnN1YnN0aXR1dGlvbnM7Cit9CisKK3hzX19zaW1wbGVUeXBlICp4c19fZWxlbWVudDo6c2ltcGxlVHlwZVB0cigpIGNvbnN0Cit7IHJldHVybiBzaW1wbGVUeXBlUmVmOworfQorCit4c19fY29tcGxleFR5cGUgKnhzX19lbGVtZW50Ojpjb21wbGV4VHlwZVB0cigpIGNvbnN0Cit7IHJldHVybiBjb21wbGV4VHlwZVJlZjsKK30KKworeHNfX3NpbXBsZVR5cGU6OnhzX19zaW1wbGVUeXBlKCkKK3sgbGV2ZWwgPSAwOworfQorCitpbnQgeHNfX3NpbXBsZVR5cGU6OnRyYXZlcnNlKHhzX19zY2hlbWEgJnNjaGVtYSkKK3sgaWYgKHZmbGFnKQorICAgIGNlcnIgPDwgIkFuYWx5emluZyBzY2hlbWEgc2ltcGxlVHlwZSAiIDw8IChuYW1lP25hbWU6IiIpIDw8IGVuZGw7CisgIHNjaGVtYVJlZiA9ICZzY2hlbWE7CisgIGlmIChsaXN0KQorICAgIGxpc3QtPnRyYXZlcnNlKHNjaGVtYSk7CisgIGVsc2UgaWYgKHJlc3RyaWN0aW9uKQorICAgIHJlc3RyaWN0aW9uLT50cmF2ZXJzZShzY2hlbWEpOworICBlbHNlIGlmICh1bmlvbl8pCisgICAgdW5pb25fLT50cmF2ZXJzZShzY2hlbWEpOworICByZXR1cm4gU09BUF9PSzsKK30KKwordm9pZCB4c19fc2ltcGxlVHlwZTo6c2NoZW1hUHRyKHhzX19zY2hlbWEgKnNjaGVtYSkKK3sgc2NoZW1hUmVmID0gc2NoZW1hOworfQorCit4c19fc2NoZW1hICp4c19fc2ltcGxlVHlwZTo6c2NoZW1hUHRyKCkgY29uc3QKK3sgcmV0dXJuIHNjaGVtYVJlZjsKK30KKworaW50IHhzX19zaW1wbGVUeXBlOjpiYXNlTGV2ZWwoKQoreyBpZiAoIWxldmVsKQorICB7IGlmIChyZXN0cmljdGlvbikKKyAgICB7IGxldmVsID0gLTE7CisgICAgICBpZiAocmVzdHJpY3Rpb24tPnNpbXBsZVR5cGVQdHIoKSkKKyAgICAgICAgbGV2ZWwgPSByZXN0cmljdGlvbi0+c2ltcGxlVHlwZVB0cigpLT5iYXNlTGV2ZWwoKSArIDE7CisgICAgICBlbHNlCisgICAgICAgIGxldmVsID0gMjsKKyAgICB9CisgICAgZWxzZSBpZiAobGlzdCAmJiBsaXN0LT5yZXN0cmljdGlvbikKKyAgICB7IGxldmVsID0gLTE7CisgICAgICBpZiAobGlzdC0+cmVzdHJpY3Rpb24tPnNpbXBsZVR5cGVQdHIoKSkKKyAgICAgICAgbGV2ZWwgPSBsaXN0LT5yZXN0cmljdGlvbi0+c2ltcGxlVHlwZVB0cigpLT5iYXNlTGV2ZWwoKSArIDE7CisgICAgICBlbHNlCisgICAgICAgIGxldmVsID0gMjsKKyAgICB9CisgICAgZWxzZQorICAgICAgbGV2ZWwgPSAxOworICB9CisgIGVsc2UgaWYgKGxldmVsIDwgMCkKKyAgeyBjZXJyIDw8ICJDeWNsaWMgcmVzdHJpY3Rpb24vZXh0ZW5zaW9uIGJhc2UgZGVwZW5kZW5jeSIgPDwgZW5kbDsKKyAgfQorICByZXR1cm4gbGV2ZWw7Cit9CisKK3hzX19jb21wbGV4VHlwZTo6eHNfX2NvbXBsZXhUeXBlKCkKK3sgbGV2ZWwgPSAwOworfQorCitpbnQgeHNfX2NvbXBsZXhUeXBlOjp0cmF2ZXJzZSh4c19fc2NoZW1hICZzY2hlbWEpCit7IGlmICh2ZmxhZykKKyAgICBjZXJyIDw8ICJBbmFseXppbmcgc2NoZW1hIGNvbXBsZXhUeXBlICIgPDwgKG5hbWU/bmFtZToiIikgPDwgZW5kbDsKKyAgc2NoZW1hUmVmID0gJnNjaGVtYTsKKyAgaWYgKHNpbXBsZUNvbnRlbnQpCisgICAgc2ltcGxlQ29udGVudC0+dHJhdmVyc2Uoc2NoZW1hKTsKKyAgZWxzZSBpZiAoY29tcGxleENvbnRlbnQpCisgICAgY29tcGxleENvbnRlbnQtPnRyYXZlcnNlKHNjaGVtYSk7CisgIGVsc2UgaWYgKGFsbCkKKyAgICBhbGwtPnRyYXZlcnNlKHNjaGVtYSk7CisgIGVsc2UgaWYgKGNob2ljZSkKKyAgICBjaG9pY2UtPnRyYXZlcnNlKHNjaGVtYSk7CisgIGVsc2UgaWYgKHNlcXVlbmNlKQorICAgIHNlcXVlbmNlLT50cmF2ZXJzZShzY2hlbWEpOworICBlbHNlIGlmIChhbnkpCisgICAgYW55LT50cmF2ZXJzZShzY2hlbWEpOworICBmb3IgKHZlY3Rvcjx4c19fYXR0cmlidXRlPjo6aXRlcmF0b3IgYXQgPSBhdHRyaWJ1dGUuYmVnaW4oKTsgYXQgIT0gYXR0cmlidXRlLmVuZCgpOyArK2F0KQorICAgICgqYXQpLnRyYXZlcnNlKHNjaGVtYSk7CisgIGZvciAodmVjdG9yPHhzX19hdHRyaWJ1dGVHcm91cD46Oml0ZXJhdG9yIGFnID0gYXR0cmlidXRlR3JvdXAuYmVnaW4oKTsgYWcgIT0gYXR0cmlidXRlR3JvdXAuZW5kKCk7ICsrYWcpCisgICAgKCphZykudHJhdmVyc2Uoc2NoZW1hKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK3ZvaWQgeHNfX2NvbXBsZXhUeXBlOjpzY2hlbWFQdHIoeHNfX3NjaGVtYSAqc2NoZW1hKQoreyBzY2hlbWFSZWYgPSBzY2hlbWE7Cit9CisKK3hzX19zY2hlbWEgKnhzX19jb21wbGV4VHlwZTo6c2NoZW1hUHRyKCkgY29uc3QKK3sgcmV0dXJuIHNjaGVtYVJlZjsKK30KKworaW50IHhzX19jb21wbGV4VHlwZTo6YmFzZUxldmVsKCkKK3sgaWYgKCFsZXZlbCkKKyAgeyBpZiAoc2ltcGxlQ29udGVudCkKKyAgICB7IGlmIChzaW1wbGVDb250ZW50LT5yZXN0cmljdGlvbikKKyAgICAgIHsgbGV2ZWwgPSAtMTsKKyAgICAgICAgaWYgKHNpbXBsZUNvbnRlbnQtPnJlc3RyaWN0aW9uLT5zaW1wbGVUeXBlUHRyKCkpCisgICAgICAgICAgbGV2ZWwgPSBzaW1wbGVDb250ZW50LT5yZXN0cmljdGlvbi0+c2ltcGxlVHlwZVB0cigpLT5iYXNlTGV2ZWwoKSArIDE7CisgICAgICAgIGVsc2UgaWYgKHNpbXBsZUNvbnRlbnQtPnJlc3RyaWN0aW9uLT5jb21wbGV4VHlwZVB0cigpKQorICAgICAgICAgIGxldmVsID0gc2ltcGxlQ29udGVudC0+cmVzdHJpY3Rpb24tPmNvbXBsZXhUeXBlUHRyKCktPmJhc2VMZXZlbCgpICsgMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGxldmVsID0gMjsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHNpbXBsZUNvbnRlbnQtPmV4dGVuc2lvbikKKyAgICAgIHsgbGV2ZWwgPSAtMTsKKyAgICAgICAgaWYgKHNpbXBsZUNvbnRlbnQtPmV4dGVuc2lvbi0+c2ltcGxlVHlwZVB0cigpKQorICAgICAgICAgIGxldmVsID0gc2ltcGxlQ29udGVudC0+ZXh0ZW5zaW9uLT5zaW1wbGVUeXBlUHRyKCktPmJhc2VMZXZlbCgpICsgMTsKKyAgICAgICAgZWxzZSBpZiAoc2ltcGxlQ29udGVudC0+ZXh0ZW5zaW9uLT5jb21wbGV4VHlwZVB0cigpKQorICAgICAgICAgIGxldmVsID0gc2ltcGxlQ29udGVudC0+ZXh0ZW5zaW9uLT5jb21wbGV4VHlwZVB0cigpLT5iYXNlTGV2ZWwoKSArIDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBsZXZlbCA9IDI7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKGNvbXBsZXhDb250ZW50KQorICAgIHsgaWYgKGNvbXBsZXhDb250ZW50LT5yZXN0cmljdGlvbikKKyAgICAgIHsgbGV2ZWwgPSAtMTsKKyAgICAgICAgaWYgKGNvbXBsZXhDb250ZW50LT5yZXN0cmljdGlvbi0+c2ltcGxlVHlwZVB0cigpKQorICAgICAgICAgIGxldmVsID0gY29tcGxleENvbnRlbnQtPnJlc3RyaWN0aW9uLT5zaW1wbGVUeXBlUHRyKCktPmJhc2VMZXZlbCgpICsgMTsKKyAgICAgICAgZWxzZSBpZiAoY29tcGxleENvbnRlbnQtPnJlc3RyaWN0aW9uLT5jb21wbGV4VHlwZVB0cigpKQorICAgICAgICAgIGxldmVsID0gY29tcGxleENvbnRlbnQtPnJlc3RyaWN0aW9uLT5jb21wbGV4VHlwZVB0cigpLT5iYXNlTGV2ZWwoKSArIDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBsZXZlbCA9IDI7CisgICAgICB9CisgICAgICBlbHNlIGlmIChjb21wbGV4Q29udGVudC0+ZXh0ZW5zaW9uKQorICAgICAgeyBsZXZlbCA9IC0xOworICAgICAgICBpZiAoY29tcGxleENvbnRlbnQtPmV4dGVuc2lvbi0+c2ltcGxlVHlwZVB0cigpKQorICAgICAgICAgIGxldmVsID0gY29tcGxleENvbnRlbnQtPmV4dGVuc2lvbi0+c2ltcGxlVHlwZVB0cigpLT5iYXNlTGV2ZWwoKSArIDE7CisgICAgICAgIGVsc2UgaWYgKGNvbXBsZXhDb250ZW50LT5leHRlbnNpb24tPmNvbXBsZXhUeXBlUHRyKCkpCisgICAgICAgICAgbGV2ZWwgPSBjb21wbGV4Q29udGVudC0+ZXh0ZW5zaW9uLT5jb21wbGV4VHlwZVB0cigpLT5iYXNlTGV2ZWwoKSArIDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBsZXZlbCA9IDI7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgIGxldmVsID0gMTsKKyAgfQorICBlbHNlIGlmIChsZXZlbCA8IDApCisgIHsgY2VyciA8PCAiQ3ljbGljIHJlc3RyaWN0aW9uL2V4dGVuc2lvbiBiYXNlIGRlcGVuZGVuY3kiIDw8IGVuZGw7CisgIH0KKyAgcmV0dXJuIGxldmVsOworfQorCitpbnQgeHNfX3NpbXBsZUNvbnRlbnQ6OnRyYXZlcnNlKHhzX19zY2hlbWEgJnNjaGVtYSkKK3sgaWYgKHZmbGFnKQorICAgIGNlcnIgPDwgIkFuYWx5emluZyBzY2hlbWEgc2ltcGxlQ29udGVudCIgPDwgZW5kbDsKKyAgaWYgKGV4dGVuc2lvbikKKyAgICBleHRlbnNpb24tPnRyYXZlcnNlKHNjaGVtYSk7CisgIGVsc2UgaWYgKHJlc3RyaWN0aW9uKQorICAgIHJlc3RyaWN0aW9uLT50cmF2ZXJzZShzY2hlbWEpOworICByZXR1cm4gU09BUF9PSzsKK30KKworaW50IHhzX19jb21wbGV4Q29udGVudDo6dHJhdmVyc2UoeHNfX3NjaGVtYSAmc2NoZW1hKQoreyBpZiAodmZsYWcpCisgICAgY2VyciA8PCAiQW5hbHl6aW5nIHNjaGVtYSBjb21wbGV4Q29udGVudCIgPDwgZW5kbDsKKyAgaWYgKGV4dGVuc2lvbikKKyAgICBleHRlbnNpb24tPnRyYXZlcnNlKHNjaGVtYSk7CisgIGVsc2UgaWYgKHJlc3RyaWN0aW9uKQorICAgIHJlc3RyaWN0aW9uLT50cmF2ZXJzZShzY2hlbWEpOworICByZXR1cm4gU09BUF9PSzsKK30KKworeHNfX2V4dGVuc2lvbjo6eHNfX2V4dGVuc2lvbigpCit7IHNpbXBsZVR5cGVSZWYgPSBOVUxMOworICBjb21wbGV4VHlwZVJlZiA9IE5VTEw7Cit9CisKK2ludCB4c19fZXh0ZW5zaW9uOjp0cmF2ZXJzZSh4c19fc2NoZW1hICZzY2hlbWEpCit7IGlmICh2ZmxhZykKKyAgICBjZXJyIDw8ICJBbmFseXppbmcgc2NoZW1hIGV4dGVuc2lvbiAiIDw8IChiYXNlP2Jhc2U6IiIpIDw8IGVuZGw7CisgIGlmIChncm91cCkKKyAgICBncm91cC0+dHJhdmVyc2Uoc2NoZW1hKTsKKyAgZWxzZSBpZiAoYWxsKQorICAgIGFsbC0+dHJhdmVyc2Uoc2NoZW1hKTsKKyAgZWxzZSBpZiAoY2hvaWNlKQorICAgIGNob2ljZS0+dHJhdmVyc2Uoc2NoZW1hKTsKKyAgZWxzZSBpZiAoc2VxdWVuY2UpCisgICAgc2VxdWVuY2UtPnRyYXZlcnNlKHNjaGVtYSk7CisgIGZvciAodmVjdG9yPHhzX19hdHRyaWJ1dGU+OjppdGVyYXRvciBhdCA9IGF0dHJpYnV0ZS5iZWdpbigpOyBhdCAhPSBhdHRyaWJ1dGUuZW5kKCk7ICsrYXQpCisgICAgKCphdCkudHJhdmVyc2Uoc2NoZW1hKTsKKyAgZm9yICh2ZWN0b3I8eHNfX2F0dHJpYnV0ZUdyb3VwPjo6aXRlcmF0b3IgYWcgPSBhdHRyaWJ1dGVHcm91cC5iZWdpbigpOyBhZyAhPSBhdHRyaWJ1dGVHcm91cC5lbmQoKTsgKythZykKKyAgICAoKmFnKS50cmF2ZXJzZShzY2hlbWEpOworICBjb25zdCBjaGFyICp0b2tlbiA9IHFuYW1lX3Rva2VuKGJhc2UsIHNjaGVtYS50YXJnZXROYW1lc3BhY2UpOworICBzaW1wbGVUeXBlUmVmID0gTlVMTDsKKyAgaWYgKHRva2VuKQorICB7IGZvciAodmVjdG9yPHhzX19zaW1wbGVUeXBlPjo6aXRlcmF0b3IgaSA9IHNjaGVtYS5zaW1wbGVUeXBlLmJlZ2luKCk7IGkgIT0gc2NoZW1hLnNpbXBsZVR5cGUuZW5kKCk7ICsraSkKKyAgICAgIGlmICghc3RyY21wKCgqaSkubmFtZSwgdG9rZW4pKQorICAgICAgeyBzaW1wbGVUeXBlUmVmID0gJigqaSk7CisgICAgICAgIGlmICh2ZmxhZykKKyAgICAgICAgICBjZXJyIDw8ICJGb3VuZCBleHRlbnNpb24gYmFzZSB0eXBlICIgPDwgKHRva2VuP3Rva2VuOiIiKSA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgfQorICBlbHNlCisgIHsgZm9yICh2ZWN0b3I8eHNfX2ltcG9ydD46OmNvbnN0X2l0ZXJhdG9yIGkgPSBzY2hlbWEuaW1wb3J0LmJlZ2luKCk7IGkgIT0gc2NoZW1hLmltcG9ydC5lbmQoKTsgKytpKQorICAgIHsgeHNfX3NjaGVtYSAqcyA9ICgqaSkuc2NoZW1hUHRyKCk7CisgICAgICBpZiAocykKKyAgICAgIHsgdG9rZW4gPSBxbmFtZV90b2tlbihiYXNlLCBzLT50YXJnZXROYW1lc3BhY2UpOworICAgICAgICBpZiAodG9rZW4pCisgICAgICAgIHsgZm9yICh2ZWN0b3I8eHNfX3NpbXBsZVR5cGU+OjppdGVyYXRvciBqID0gcy0+c2ltcGxlVHlwZS5iZWdpbigpOyBqICE9IHMtPnNpbXBsZVR5cGUuZW5kKCk7ICsraikKKyAgICAgICAgICAgIGlmICghc3RyY21wKCgqaikubmFtZSwgdG9rZW4pKQorICAgICAgICAgICAgeyBzaW1wbGVUeXBlUmVmID0gJigqaik7CisgICAgICAgICAgICAgIGlmICh2ZmxhZykKKyAgICAgICAgICAgICAgICBjZXJyIDw8ICJGb3VuZCBleHRlbnNpb24gYmFzZSB0eXBlICIgPDwgKHRva2VuP3Rva2VuOiIiKSA8PCBlbmRsOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICB0b2tlbiA9IHFuYW1lX3Rva2VuKGJhc2UsIHNjaGVtYS50YXJnZXROYW1lc3BhY2UpOworICBjb21wbGV4VHlwZVJlZiA9IE5VTEw7CisgIGlmICh0b2tlbikKKyAgeyBmb3IgKHZlY3Rvcjx4c19fY29tcGxleFR5cGU+OjppdGVyYXRvciBpID0gc2NoZW1hLmNvbXBsZXhUeXBlLmJlZ2luKCk7IGkgIT0gc2NoZW1hLmNvbXBsZXhUeXBlLmVuZCgpOyArK2kpCisgICAgICBpZiAoIXN0cmNtcCgoKmkpLm5hbWUsIHRva2VuKSkKKyAgICAgIHsgY29tcGxleFR5cGVSZWYgPSAmKCppKTsKKyAgICAgICAgaWYgKHZmbGFnKQorICAgICAgICAgIGNlcnIgPDwgIkZvdW5kIGV4dGVuc2lvbiBiYXNlIHR5cGUgIiA8PCAodG9rZW4/dG9rZW46IiIpIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICB9CisgIGVsc2UKKyAgeyBmb3IgKHZlY3Rvcjx4c19faW1wb3J0Pjo6Y29uc3RfaXRlcmF0b3IgaSA9IHNjaGVtYS5pbXBvcnQuYmVnaW4oKTsgaSAhPSBzY2hlbWEuaW1wb3J0LmVuZCgpOyArK2kpCisgICAgeyB4c19fc2NoZW1hICpzID0gKCppKS5zY2hlbWFQdHIoKTsKKyAgICAgIGlmIChzKQorICAgICAgeyB0b2tlbiA9IHFuYW1lX3Rva2VuKGJhc2UsIHMtPnRhcmdldE5hbWVzcGFjZSk7CisgICAgICAgIGlmICh0b2tlbikKKyAgICAgICAgeyBmb3IgKHZlY3Rvcjx4c19fY29tcGxleFR5cGU+OjppdGVyYXRvciBqID0gcy0+Y29tcGxleFR5cGUuYmVnaW4oKTsgaiAhPSBzLT5jb21wbGV4VHlwZS5lbmQoKTsgKytqKQorICAgICAgICAgICAgaWYgKCFzdHJjbXAoKCpqKS5uYW1lLCB0b2tlbikpCisgICAgICAgICAgICB7IGNvbXBsZXhUeXBlUmVmID0gJigqaik7CisgICAgICAgICAgICAgIGlmICh2ZmxhZykKKyAgICAgICAgICAgICAgICBjZXJyIDw8ICJGb3VuZCBleHRlbnNpb24gYmFzZSB0eXBlICIgPDwgKHRva2VuP3Rva2VuOiIiKSA8PCBlbmRsOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoIXNpbXBsZVR5cGVSZWYgJiYgIWNvbXBsZXhUeXBlUmVmKQorICB7IGlmIChiYXNlKQorICAgIHsgaWYgKGlzX2J1aWx0aW5fcW5hbWUoYmFzZSkpCisgICAgICAgIHNjaGVtYS5idWlsdGluVHlwZShiYXNlKTsKKyAgICAgIGVsc2UKKyAgICAgICAgY2VyciA8PCAiV2FybmluZzogY291bGQgbm90IGZpbmQgZXh0ZW5zaW9uIGJhc2UgdHlwZSAnIiA8PCBiYXNlIDw8ICInIGluIHNjaGVtYSAiIDw8IChzY2hlbWEudGFyZ2V0TmFtZXNwYWNlP3NjaGVtYS50YXJnZXROYW1lc3BhY2U6IiIpIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGNlcnIgPDwgIkV4dGVuc2lvbiBoYXMgbm8gYmFzZSIgPDwgZW5kbDsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKwordm9pZCB4c19fZXh0ZW5zaW9uOjpzaW1wbGVUeXBlUHRyKHhzX19zaW1wbGVUeXBlICpzaW1wbGVUeXBlKQoreyBzaW1wbGVUeXBlUmVmID0gc2ltcGxlVHlwZTsKK30KKwordm9pZCB4c19fZXh0ZW5zaW9uOjpjb21wbGV4VHlwZVB0cih4c19fY29tcGxleFR5cGUgKmNvbXBsZXhUeXBlKQoreyBjb21wbGV4VHlwZVJlZiA9IGNvbXBsZXhUeXBlOworfQorCit4c19fc2ltcGxlVHlwZSAqeHNfX2V4dGVuc2lvbjo6c2ltcGxlVHlwZVB0cigpIGNvbnN0Cit7IHJldHVybiBzaW1wbGVUeXBlUmVmOworfQorCit4c19fY29tcGxleFR5cGUgKnhzX19leHRlbnNpb246OmNvbXBsZXhUeXBlUHRyKCkgY29uc3QKK3sgcmV0dXJuIGNvbXBsZXhUeXBlUmVmOworfQorCit4c19fcmVzdHJpY3Rpb246OnhzX19yZXN0cmljdGlvbigpCit7IHNpbXBsZVR5cGVSZWYgPSBOVUxMOworICBjb21wbGV4VHlwZVJlZiA9IE5VTEw7Cit9CisKK2ludCB4c19fcmVzdHJpY3Rpb246OnRyYXZlcnNlKHhzX19zY2hlbWEgJnNjaGVtYSkKK3sgaWYgKHZmbGFnKQorICAgIGNlcnIgPDwgIkFuYWx5emluZyBzY2hlbWEgcmVzdHJpY3Rpb24gIiA8PCAoYmFzZT9iYXNlOiIiKSA8PCBlbmRsOworICBpZiAoZ3JvdXApCisgICAgZ3JvdXAtPnRyYXZlcnNlKHNjaGVtYSk7CisgIGVsc2UgaWYgKGFsbCkKKyAgICBhbGwtPnRyYXZlcnNlKHNjaGVtYSk7CisgIGVsc2UgaWYgKGNob2ljZSkKKyAgICBjaG9pY2UtPnRyYXZlcnNlKHNjaGVtYSk7CisgIGVsc2UgaWYgKHNlcXVlbmNlKQorICAgIHNlcXVlbmNlLT50cmF2ZXJzZShzY2hlbWEpOworICBlbHNlCisgIHsgZm9yICh2ZWN0b3I8eHNfX2VudW1lcmF0aW9uPjo6aXRlcmF0b3IgZW4gPSBlbnVtZXJhdGlvbi5iZWdpbigpOyBlbiAhPSBlbnVtZXJhdGlvbi5lbmQoKTsgKytlbikKKyAgICAgICgqZW4pLnRyYXZlcnNlKHNjaGVtYSk7CisgICAgZm9yICh2ZWN0b3I8eHNfX3BhdHRlcm4+OjppdGVyYXRvciBwbiA9IHBhdHRlcm4uYmVnaW4oKTsgcG4gIT0gcGF0dGVybi5lbmQoKTsgKytwbikKKyAgICAgICgqcG4pLnRyYXZlcnNlKHNjaGVtYSk7CisgIH0KKyAgZm9yICh2ZWN0b3I8eHNfX2F0dHJpYnV0ZT46Oml0ZXJhdG9yIGF0ID0gYXR0cmlidXRlLmJlZ2luKCk7IGF0ICE9IGF0dHJpYnV0ZS5lbmQoKTsgKythdCkKKyAgICAoKmF0KS50cmF2ZXJzZShzY2hlbWEpOworICBjb25zdCBjaGFyICp0b2tlbiA9IHFuYW1lX3Rva2VuKGJhc2UsIHNjaGVtYS50YXJnZXROYW1lc3BhY2UpOworICBzaW1wbGVUeXBlUmVmID0gTlVMTDsKKyAgaWYgKHRva2VuKQorICB7IGZvciAodmVjdG9yPHhzX19zaW1wbGVUeXBlPjo6aXRlcmF0b3IgaSA9IHNjaGVtYS5zaW1wbGVUeXBlLmJlZ2luKCk7IGkgIT0gc2NoZW1hLnNpbXBsZVR5cGUuZW5kKCk7ICsraSkKKyAgICAgIGlmICghc3RyY21wKCgqaSkubmFtZSwgdG9rZW4pKQorICAgICAgeyBzaW1wbGVUeXBlUmVmID0gJigqaSk7CisgICAgICAgIGlmICh2ZmxhZykKKyAgICAgICAgICBjZXJyIDw8ICJGb3VuZCByZXN0cmljdGlvbiBiYXNlIHR5cGUgIiA8PCAodG9rZW4/dG9rZW46IiIpIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICB9CisgIGVsc2UKKyAgeyBmb3IgKHZlY3Rvcjx4c19faW1wb3J0Pjo6Y29uc3RfaXRlcmF0b3IgaSA9IHNjaGVtYS5pbXBvcnQuYmVnaW4oKTsgaSAhPSBzY2hlbWEuaW1wb3J0LmVuZCgpOyArK2kpCisgICAgeyB4c19fc2NoZW1hICpzID0gKCppKS5zY2hlbWFQdHIoKTsKKyAgICAgIGlmIChzKQorICAgICAgeyB0b2tlbiA9IHFuYW1lX3Rva2VuKGJhc2UsIHMtPnRhcmdldE5hbWVzcGFjZSk7CisgICAgICAgIGlmICh0b2tlbikKKyAgICAgICAgeyBmb3IgKHZlY3Rvcjx4c19fc2ltcGxlVHlwZT46Oml0ZXJhdG9yIGogPSBzLT5zaW1wbGVUeXBlLmJlZ2luKCk7IGogIT0gcy0+c2ltcGxlVHlwZS5lbmQoKTsgKytqKQorICAgICAgICAgICAgaWYgKCFzdHJjbXAoKCpqKS5uYW1lLCB0b2tlbikpCisgICAgICAgICAgICB7IHNpbXBsZVR5cGVSZWYgPSAmKCpqKTsKKyAgICAgICAgICAgICAgaWYgKHZmbGFnKQorICAgICAgICAgICAgICAgIGNlcnIgPDwgIkZvdW5kIHJlc3RyaWN0aW9uIGJhc2UgdHlwZSAiIDw8ICh0b2tlbj90b2tlbjoiIikgPDwgZW5kbDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgdG9rZW4gPSBxbmFtZV90b2tlbihiYXNlLCBzY2hlbWEudGFyZ2V0TmFtZXNwYWNlKTsKKyAgY29tcGxleFR5cGVSZWYgPSBOVUxMOworICBpZiAodG9rZW4pCisgIHsgZm9yICh2ZWN0b3I8eHNfX2NvbXBsZXhUeXBlPjo6aXRlcmF0b3IgaSA9IHNjaGVtYS5jb21wbGV4VHlwZS5iZWdpbigpOyBpICE9IHNjaGVtYS5jb21wbGV4VHlwZS5lbmQoKTsgKytpKQorICAgICAgaWYgKCFzdHJjbXAoKCppKS5uYW1lLCB0b2tlbikpCisgICAgICB7IGNvbXBsZXhUeXBlUmVmID0gJigqaSk7CisgICAgICAgIGlmICh2ZmxhZykKKyAgICAgICAgICBjZXJyIDw8ICJGb3VuZCByZXN0cmljdGlvbiBiYXNlIHR5cGUgIiA8PCAodG9rZW4/dG9rZW46IiIpIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICB9CisgIGVsc2UKKyAgeyBmb3IgKHZlY3Rvcjx4c19faW1wb3J0Pjo6Y29uc3RfaXRlcmF0b3IgaSA9IHNjaGVtYS5pbXBvcnQuYmVnaW4oKTsgaSAhPSBzY2hlbWEuaW1wb3J0LmVuZCgpOyArK2kpCisgICAgeyB4c19fc2NoZW1hICpzID0gKCppKS5zY2hlbWFQdHIoKTsKKyAgICAgIGlmIChzKQorICAgICAgeyB0b2tlbiA9IHFuYW1lX3Rva2VuKGJhc2UsIHMtPnRhcmdldE5hbWVzcGFjZSk7CisgICAgICAgIGlmICh0b2tlbikKKyAgICAgICAgeyBmb3IgKHZlY3Rvcjx4c19fY29tcGxleFR5cGU+OjppdGVyYXRvciBqID0gcy0+Y29tcGxleFR5cGUuYmVnaW4oKTsgaiAhPSBzLT5jb21wbGV4VHlwZS5lbmQoKTsgKytqKQorICAgICAgICAgICAgaWYgKCFzdHJjbXAoKCpqKS5uYW1lLCB0b2tlbikpCisgICAgICAgICAgICB7IGNvbXBsZXhUeXBlUmVmID0gJigqaik7CisgICAgICAgICAgICAgIGlmICh2ZmxhZykKKyAgICAgICAgICAgICAgICBjZXJyIDw8ICJGb3VuZCByZXN0cmljdGlvbiBiYXNlIHR5cGUgIiA8PCAodG9rZW4/dG9rZW46IiIpIDw8IGVuZGw7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmICghc2ltcGxlVHlwZVJlZiAmJiAhY29tcGxleFR5cGVSZWYpCisgIHsgaWYgKGJhc2UpCisgICAgeyBpZiAoaXNfYnVpbHRpbl9xbmFtZShiYXNlKSkKKyAgICAgICAgc2NoZW1hLmJ1aWx0aW5UeXBlKGJhc2UpOworICAgICAgZWxzZQorICAgICAgICBjZXJyIDw8ICJXYXJuaW5nOiBjb3VsZCBub3QgZmluZCByZXN0cmljdGlvbiBiYXNlIHR5cGUgJyIgPDwgYmFzZSA8PCAiJyBpbiBzY2hlbWEgIiA8PCAoc2NoZW1hLnRhcmdldE5hbWVzcGFjZT9zY2hlbWEudGFyZ2V0TmFtZXNwYWNlOiIiKSA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlCisgICAgICBjZXJyIDw8ICJSZXN0cmljdGlvbiBoYXMgbm8gYmFzZSIgPDwgZW5kbDsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKwordm9pZCB4c19fcmVzdHJpY3Rpb246OnNpbXBsZVR5cGVQdHIoeHNfX3NpbXBsZVR5cGUgKnNpbXBsZVR5cGUpCit7IHNpbXBsZVR5cGVSZWYgPSBzaW1wbGVUeXBlOworfQorCit2b2lkIHhzX19yZXN0cmljdGlvbjo6Y29tcGxleFR5cGVQdHIoeHNfX2NvbXBsZXhUeXBlICpjb21wbGV4VHlwZSkKK3sgY29tcGxleFR5cGVSZWYgPSBjb21wbGV4VHlwZTsKK30KKworeHNfX3NpbXBsZVR5cGUgKnhzX19yZXN0cmljdGlvbjo6c2ltcGxlVHlwZVB0cigpIGNvbnN0Cit7IHJldHVybiBzaW1wbGVUeXBlUmVmOworfQorCit4c19fY29tcGxleFR5cGUgKnhzX19yZXN0cmljdGlvbjo6Y29tcGxleFR5cGVQdHIoKSBjb25zdAoreyByZXR1cm4gY29tcGxleFR5cGVSZWY7Cit9CisKK3hzX19saXN0Ojp4c19fbGlzdCgpCit7IGl0ZW1UeXBlUmVmID0gTlVMTDsKK30KKworaW50IHhzX19saXN0Ojp0cmF2ZXJzZSh4c19fc2NoZW1hICZzY2hlbWEpCit7IGlmICh2ZmxhZykKKyAgICBjZXJyIDw8ICJBbmFseXppbmcgc2NoZW1hIGxpc3QiIDw8IGVuZGw7CisgIGlmIChyZXN0cmljdGlvbikKKyAgICByZXN0cmljdGlvbi0+dHJhdmVyc2Uoc2NoZW1hKTsKKyAgZm9yICh2ZWN0b3I8eHNfX3NpbXBsZVR5cGU+OjppdGVyYXRvciBpID0gc2ltcGxlVHlwZS5iZWdpbigpOyBpICE9IHNpbXBsZVR5cGUuZW5kKCk7ICsraSkKKyAgICAoKmkpLnRyYXZlcnNlKHNjaGVtYSk7CisgIGl0ZW1UeXBlUmVmID0gTlVMTDsKKyAgY29uc3QgY2hhciAqdG9rZW4gPSBxbmFtZV90b2tlbihpdGVtVHlwZSwgc2NoZW1hLnRhcmdldE5hbWVzcGFjZSk7CisgIGlmICh0b2tlbikKKyAgeyBmb3IgKHZlY3Rvcjx4c19fc2ltcGxlVHlwZT46Oml0ZXJhdG9yIGkgPSBzY2hlbWEuc2ltcGxlVHlwZS5iZWdpbigpOyBpICE9IHNjaGVtYS5zaW1wbGVUeXBlLmVuZCgpOyArK2kpCisgICAgICBpZiAoIXN0cmNtcCgoKmkpLm5hbWUsIHRva2VuKSkKKyAgICAgIHsgaXRlbVR5cGVSZWYgPSAmKCppKTsKKyAgICAgICAgaWYgKHZmbGFnKQorICAgICAgICAgIGNlcnIgPDwgIkZvdW5kIGxpc3QgaXRlbVR5cGUgIiA8PCAodG9rZW4/dG9rZW46IiIpIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICB9CisgIGVsc2UKKyAgeyBmb3IgKHZlY3Rvcjx4c19faW1wb3J0Pjo6Y29uc3RfaXRlcmF0b3IgaSA9IHNjaGVtYS5pbXBvcnQuYmVnaW4oKTsgaSAhPSBzY2hlbWEuaW1wb3J0LmVuZCgpOyArK2kpCisgICAgeyB4c19fc2NoZW1hICpzID0gKCppKS5zY2hlbWFQdHIoKTsKKyAgICAgIGlmIChzKQorICAgICAgeyB0b2tlbiA9IHFuYW1lX3Rva2VuKGl0ZW1UeXBlLCBzLT50YXJnZXROYW1lc3BhY2UpOworICAgICAgICBpZiAodG9rZW4pCisgICAgICAgIHsgZm9yICh2ZWN0b3I8eHNfX3NpbXBsZVR5cGU+OjppdGVyYXRvciBqID0gcy0+c2ltcGxlVHlwZS5iZWdpbigpOyBqICE9IHMtPnNpbXBsZVR5cGUuZW5kKCk7ICsraikKKyAgICAgICAgICAgIGlmICghc3RyY21wKCgqaikubmFtZSwgdG9rZW4pKQorICAgICAgICAgICAgeyBpdGVtVHlwZVJlZiA9ICYoKmopOworICAgICAgICAgICAgICBpZiAodmZsYWcpCisgICAgICAgICAgICAgICAgY2VyciA8PCAiRm91bmQgbGlzdCBpdGVtVHlwZSAiIDw8ICh0b2tlbj90b2tlbjoiIikgPDwgZW5kbDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKGl0ZW1UeXBlICYmICFpdGVtVHlwZVJlZikKKyAgeyBpZiAoaXNfYnVpbHRpbl9xbmFtZShpdGVtVHlwZSkpCisgICAgICBzY2hlbWEuYnVpbHRpblR5cGUoaXRlbVR5cGUpOworICAgIGVsc2UKKyAgICAgIGNlcnIgPDwgIldhcm5pbmc6IGNvdWxkIG5vdCBmaW5kIGxpc3QgaXRlbVR5cGUgJyIgPDwgaXRlbVR5cGUgPDwgIicgaW4gc2NoZW1hICIgPDwgKHNjaGVtYS50YXJnZXROYW1lc3BhY2U/c2NoZW1hLnRhcmdldE5hbWVzcGFjZToiIikgPDwgZW5kbDsKKyAgfQorICByZXR1cm4gU09BUF9PSzsKK30KKwordm9pZCB4c19fbGlzdDo6aXRlbVR5cGVQdHIoeHNfX3NpbXBsZVR5cGUgKnNpbXBsZVR5cGUpCit7IGl0ZW1UeXBlUmVmID0gc2ltcGxlVHlwZTsKK30KKworeHNfX3NpbXBsZVR5cGUgKnhzX19saXN0OjppdGVtVHlwZVB0cigpIGNvbnN0Cit7IHJldHVybiBpdGVtVHlwZVJlZjsKK30KKworaW50IHhzX191bmlvbjo6dHJhdmVyc2UoeHNfX3NjaGVtYSAmc2NoZW1hKQoreyBpZiAodmZsYWcpCisgICAgY2VyciA8PCAiQW5hbHl6aW5nIHNjaGVtYSB1bmlvbiIgPDwgZW5kbDsKKyAgZm9yICh2ZWN0b3I8eHNfX3NpbXBsZVR5cGU+OjppdGVyYXRvciBpID0gc2ltcGxlVHlwZS5iZWdpbigpOyBpICE9IHNpbXBsZVR5cGUuZW5kKCk7ICsraSkKKyAgICAoKmkpLnRyYXZlcnNlKHNjaGVtYSk7CisgIHJldHVybiBTT0FQX09LOworfQorCitpbnQgeHNfX2FsbDo6dHJhdmVyc2UoeHNfX3NjaGVtYSAmc2NoZW1hKQoreyBpZiAodmZsYWcpCisgICAgY2VyciA8PCAiQW5hbHl6aW5nIHNjaGVtYSBhbGwiIDw8IGVuZGw7CisgIGZvciAodmVjdG9yPHhzX19lbGVtZW50Pjo6aXRlcmF0b3IgaSA9IGVsZW1lbnQuYmVnaW4oKTsgaSAhPSBlbGVtZW50LmVuZCgpOyArK2kpCisgICAgKCppKS50cmF2ZXJzZShzY2hlbWEpOworICByZXR1cm4gU09BUF9PSzsKK30KKworeHNfX2Nob2ljZTo6eHNfX2Nob2ljZSgpCit7IHNjaGVtYVJlZiA9IE5VTEw7Cit9CisKK2ludCB4c19fY2hvaWNlOjp0cmF2ZXJzZSh4c19fc2NoZW1hICZzY2hlbWEpCit7IGlmICh2ZmxhZykKKyAgICBjZXJyIDw8ICJBbmFseXppbmcgc2NoZW1hIGNob2ljZSIgPDwgZW5kbDsKKyAgc2NoZW1hUmVmID0gJnNjaGVtYTsKKyAgZm9yICh2ZWN0b3I8eHNfX2VsZW1lbnQ+OjppdGVyYXRvciBlbCA9IGVsZW1lbnQuYmVnaW4oKTsgZWwgIT0gZWxlbWVudC5lbmQoKTsgKytlbCkKKyAgICAoKmVsKS50cmF2ZXJzZShzY2hlbWEpOworICBmb3IgKHZlY3Rvcjx4c19fZ3JvdXA+OjppdGVyYXRvciBncCA9IGdyb3VwLmJlZ2luKCk7IGdwICE9IGdyb3VwLmVuZCgpOyArK2dwKQorICAgICgqZ3ApLnRyYXZlcnNlKHNjaGVtYSk7CisgIGZvciAodmVjdG9yPHhzX19zZXF1ZW5jZSo+OjppdGVyYXRvciBzcSA9IHNlcXVlbmNlLmJlZ2luKCk7IHNxICE9IHNlcXVlbmNlLmVuZCgpOyArK3NxKQorICAgICgqc3EpLT50cmF2ZXJzZShzY2hlbWEpOworICBmb3IgKHZlY3Rvcjx4c19fYW55Pjo6aXRlcmF0b3IgYW4gPSBhbnkuYmVnaW4oKTsgYW4gIT0gYW55LmVuZCgpOyArK2FuKQorICAgICgqYW4pLnRyYXZlcnNlKHNjaGVtYSk7CisgIHJldHVybiBTT0FQX09LOworfQorCit2b2lkIHhzX19jaG9pY2U6OnNjaGVtYVB0cih4c19fc2NoZW1hICpzY2hlbWEpCit7IHNjaGVtYVJlZiA9IHNjaGVtYTsKK30KKworeHNfX3NjaGVtYSAqeHNfX2Nob2ljZTo6c2NoZW1hUHRyKCkgY29uc3QKK3sgcmV0dXJuIHNjaGVtYVJlZjsKK30KKworaW50IHhzX19zZXF1ZW5jZTo6dHJhdmVyc2UoeHNfX3NjaGVtYSAmc2NoZW1hKQoreyBpZiAodmZsYWcpCisgICAgY2VyciA8PCAiQW5hbHl6aW5nIHNjaGVtYSBzZXF1ZW5jZSIgPDwgZW5kbDsKKyAgZm9yICh2ZWN0b3I8eHNfX2VsZW1lbnQ+OjppdGVyYXRvciBlbCA9IGVsZW1lbnQuYmVnaW4oKTsgZWwgIT0gZWxlbWVudC5lbmQoKTsgKytlbCkKKyAgICAoKmVsKS50cmF2ZXJzZShzY2hlbWEpOworICBmb3IgKHZlY3Rvcjx4c19fZ3JvdXA+OjppdGVyYXRvciBncCA9IGdyb3VwLmJlZ2luKCk7IGdwICE9IGdyb3VwLmVuZCgpOyArK2dwKQorICAgICgqZ3ApLnRyYXZlcnNlKHNjaGVtYSk7CisgIGZvciAodmVjdG9yPHhzX19jaG9pY2U+OjppdGVyYXRvciBjaCA9IGNob2ljZS5iZWdpbigpOyBjaCAhPSBjaG9pY2UuZW5kKCk7ICsrY2gpCisgICAgKCpjaCkudHJhdmVyc2Uoc2NoZW1hKTsKKyAgZm9yICh2ZWN0b3I8eHNfX3NlcXVlbmNlKj46Oml0ZXJhdG9yIHNxID0gc2VxdWVuY2UuYmVnaW4oKTsgc3EgIT0gc2VxdWVuY2UuZW5kKCk7ICsrc3EpCisgICAgKCpzcSktPnRyYXZlcnNlKHNjaGVtYSk7CisgIGZvciAodmVjdG9yPHhzX19hbnk+OjppdGVyYXRvciBhbiA9IGFueS5iZWdpbigpOyBhbiAhPSBhbnkuZW5kKCk7ICsrYW4pCisgICAgKCphbikudHJhdmVyc2Uoc2NoZW1hKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK3hzX19hdHRyaWJ1dGVHcm91cDo6eHNfX2F0dHJpYnV0ZUdyb3VwKCkKK3sgc2NoZW1hUmVmID0gTlVMTDsKKyAgYXR0cmlidXRlR3JvdXBSZWYgPSBOVUxMOworfQorCitpbnQgeHNfX2F0dHJpYnV0ZUdyb3VwOjp0cmF2ZXJzZSh4c19fc2NoZW1hJiBzY2hlbWEpCit7IGlmICh2ZmxhZykKKyAgICBjZXJyIDw8ICJhdHRyaWJ1dGVHcm91cCIgPDwgZW5kbDsKKyAgc2NoZW1hUmVmID0gJnNjaGVtYTsKKyAgZm9yICh2ZWN0b3I8eHNfX2F0dHJpYnV0ZT46Oml0ZXJhdG9yIGF0ID0gYXR0cmlidXRlLmJlZ2luKCk7IGF0ICE9IGF0dHJpYnV0ZS5lbmQoKTsgKythdCkKKyAgICAoKmF0KS50cmF2ZXJzZShzY2hlbWEpOworICBmb3IgKHZlY3Rvcjx4c19fYXR0cmlidXRlR3JvdXA+OjppdGVyYXRvciBhZyA9IGF0dHJpYnV0ZUdyb3VwLmJlZ2luKCk7IGFnICE9IGF0dHJpYnV0ZUdyb3VwLmVuZCgpOyArK2FnKQorICAgICgqYWcpLnRyYXZlcnNlKHNjaGVtYSk7CisgIGF0dHJpYnV0ZUdyb3VwUmVmID0gTlVMTDsKKyAgaWYgKHJlZikKKyAgeyBjb25zdCBjaGFyICp0b2tlbiA9IHFuYW1lX3Rva2VuKHJlZiwgc2NoZW1hLnRhcmdldE5hbWVzcGFjZSk7CisgICAgaWYgKHRva2VuKQorICAgIHsgZm9yICh2ZWN0b3I8eHNfX2F0dHJpYnV0ZUdyb3VwPjo6aXRlcmF0b3IgaSA9IHNjaGVtYS5hdHRyaWJ1dGVHcm91cC5iZWdpbigpOyBpICE9IHNjaGVtYS5hdHRyaWJ1dGVHcm91cC5lbmQoKTsgKytpKQorICAgICAgICBpZiAoIXN0cmNtcCgoKmkpLm5hbWUsIHRva2VuKSkKKyAgICAgICAgeyBhdHRyaWJ1dGVHcm91cFJlZiA9ICYoKmkpOworICAgICAgICAgIGlmICh2ZmxhZykKKyAgICAgICAgICAgICAgY2VyciA8PCAiRm91bmQgYXR0cmlidXRlR3JvdXAgIiA8PCAobmFtZT9uYW1lOiIiKSA8PCAiIHJlZiAiIDw8ICh0b2tlbj90b2tlbjoiIikgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeyBmb3IgKHZlY3Rvcjx4c19faW1wb3J0Pjo6Y29uc3RfaXRlcmF0b3IgaSA9IHNjaGVtYS5pbXBvcnQuYmVnaW4oKTsgaSAhPSBzY2hlbWEuaW1wb3J0LmVuZCgpOyArK2kpCisgICAgICB7IHhzX19zY2hlbWEgKnMgPSAoKmkpLnNjaGVtYVB0cigpOworICAgICAgICBpZiAocykKKyAgICAgICAgeyB0b2tlbiA9IHFuYW1lX3Rva2VuKHJlZiwgcy0+dGFyZ2V0TmFtZXNwYWNlKTsKKyAgICAgICAgICBpZiAodG9rZW4pCisgICAgICAgICAgeyBmb3IgKHZlY3Rvcjx4c19fYXR0cmlidXRlR3JvdXA+OjppdGVyYXRvciBqID0gcy0+YXR0cmlidXRlR3JvdXAuYmVnaW4oKTsgaiAhPSBzLT5hdHRyaWJ1dGVHcm91cC5lbmQoKTsgKytqKQorICAgICAgICAgICAgICBpZiAoIXN0cmNtcCgoKmopLm5hbWUsIHRva2VuKSkKKyAgICAgICAgICAgICAgeyBhdHRyaWJ1dGVHcm91cFJlZiA9ICYoKmopOworICAgICAgICAgICAgICAgIGlmICh2ZmxhZykKKyAgICAgICAgICAgICAgICAgICAgY2VyciA8PCAiRm91bmQgYXR0cmlidXRlIEdyb3VwICIgPDwgKG5hbWU/bmFtZToiIikgPDwgIiByZWYgIiA8PCAodG9rZW4/dG9rZW46IiIpIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAoIWF0dHJpYnV0ZUdyb3VwUmVmKQorICAgICAgY2VyciA8PCAiV2FybmluZzogY291bGQgbm90IGZpbmQgYXR0cmlidXRlR3JvdXAgJyIgPDwgKG5hbWU/bmFtZToiIikgPDwgIicgcmVmICciIDw8IChyZWY/cmVmOiIiKSA8PCAiJyBpbiBzY2hlbWEgIiA8PCAoc2NoZW1hLnRhcmdldE5hbWVzcGFjZT9zY2hlbWEudGFyZ2V0TmFtZXNwYWNlOiIiKSA8PCBlbmRsOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorCit2b2lkIHhzX19hdHRyaWJ1dGVHcm91cDo6c2NoZW1hUHRyKHhzX19zY2hlbWEgKnNjaGVtYSkKK3sgc2NoZW1hUmVmID0gc2NoZW1hOworfQorCit2b2lkIHhzX19hdHRyaWJ1dGVHcm91cDo6YXR0cmlidXRlR3JvdXBQdHIoeHNfX2F0dHJpYnV0ZUdyb3VwICphdHRyaWJ1dGVHcm91cCkKK3sgYXR0cmlidXRlR3JvdXBSZWYgPSBhdHRyaWJ1dGVHcm91cDsKK30KKworeHNfX3NjaGVtYSAqeHNfX2F0dHJpYnV0ZUdyb3VwOjpzY2hlbWFQdHIoKSBjb25zdAoreyByZXR1cm4gc2NoZW1hUmVmOworfQorCit4c19fYXR0cmlidXRlR3JvdXAgKnhzX19hdHRyaWJ1dGVHcm91cDo6YXR0cmlidXRlR3JvdXBQdHIoKSBjb25zdAoreyByZXR1cm4gYXR0cmlidXRlR3JvdXBSZWY7Cit9CisKK2ludCB4c19fYW55Ojp0cmF2ZXJzZSh4c19fc2NoZW1hICZzY2hlbWEpCit7IGlmICh2ZmxhZykKKyAgICBjZXJyIDw8ICJBbmFseXppbmcgc2NoZW1hIGFueSIgPDwgZW5kbDsKKyAgZm9yICh2ZWN0b3I8eHNfX2VsZW1lbnQ+OjppdGVyYXRvciBpID0gZWxlbWVudC5iZWdpbigpOyBpICE9IGVsZW1lbnQuZW5kKCk7ICsraSkKKyAgICAoKmkpLnRyYXZlcnNlKHNjaGVtYSk7CisgIHJldHVybiBTT0FQX09LOworfQorCit4c19fZ3JvdXA6OnhzX19ncm91cCgpCit7IHNjaGVtYVJlZiA9IE5VTEw7CisgIGdyb3VwUmVmID0gTlVMTDsKK30KKworaW50IHhzX19ncm91cDo6dHJhdmVyc2UoeHNfX3NjaGVtYSAmc2NoZW1hKQoreyBpZiAodmZsYWcpCisgICAgY2VyciA8PCAiQW5hbHl6aW5nIHNjaGVtYSBncm91cCIgPDwgZW5kbDsKKyAgc2NoZW1hUmVmID0gJnNjaGVtYTsKKyAgaWYgKGFsbCkKKyAgICBhbGwtPnRyYXZlcnNlKHNjaGVtYSk7CisgIGVsc2UgaWYgKGNob2ljZSkKKyAgICBjaG9pY2UtPnRyYXZlcnNlKHNjaGVtYSk7CisgIGVsc2UgaWYgKHNlcXVlbmNlKQorICAgIHNlcXVlbmNlLT50cmF2ZXJzZShzY2hlbWEpOworICBncm91cFJlZiA9IE5VTEw7CisgIGlmIChyZWYpCisgIHsgY29uc3QgY2hhciAqdG9rZW4gPSBxbmFtZV90b2tlbihyZWYsIHNjaGVtYS50YXJnZXROYW1lc3BhY2UpOworICAgIGlmICh0b2tlbikKKyAgICB7IGZvciAodmVjdG9yPHhzX19ncm91cD46Oml0ZXJhdG9yIGkgPSBzY2hlbWEuZ3JvdXAuYmVnaW4oKTsgaSAhPSBzY2hlbWEuZ3JvdXAuZW5kKCk7ICsraSkKKyAgICAgICAgaWYgKCFzdHJjbXAoKCppKS5uYW1lLCB0b2tlbikpCisgICAgICAgIHsgZ3JvdXBSZWYgPSAmKCppKTsKKyAgICAgICAgICBpZiAodmZsYWcpCisgICAgICAgICAgICAgIGNlcnIgPDwgIkZvdW5kIGdyb3VwICIgPDwgKG5hbWU/bmFtZToiIikgPDwgIiByZWYgIiA8PCAodG9rZW4/dG9rZW46IiIpIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgZm9yICh2ZWN0b3I8eHNfX2ltcG9ydD46OmNvbnN0X2l0ZXJhdG9yIGkgPSBzY2hlbWEuaW1wb3J0LmJlZ2luKCk7IGkgIT0gc2NoZW1hLmltcG9ydC5lbmQoKTsgKytpKQorICAgICAgeyB4c19fc2NoZW1hICpzID0gKCppKS5zY2hlbWFQdHIoKTsKKyAgICAgICAgaWYgKHMpCisgICAgICAgIHsgdG9rZW4gPSBxbmFtZV90b2tlbihyZWYsIHMtPnRhcmdldE5hbWVzcGFjZSk7CisgICAgICAgICAgaWYgKHRva2VuKQorICAgICAgICAgIHsgZm9yICh2ZWN0b3I8eHNfX2dyb3VwPjo6aXRlcmF0b3IgaiA9IHMtPmdyb3VwLmJlZ2luKCk7IGogIT0gcy0+Z3JvdXAuZW5kKCk7ICsraikKKyAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoKCpqKS5uYW1lLCB0b2tlbikpCisgICAgICAgICAgICAgIHsgZ3JvdXBSZWYgPSAmKCpqKTsKKyAgICAgICAgICAgICAgICBpZiAodmZsYWcpCisgICAgICAgICAgICAgICAgICAgIGNlcnIgPDwgIkZvdW5kIGdyb3VwICIgPDwgKG5hbWU/bmFtZToiIikgPDwgIiByZWYgIiA8PCAodG9rZW4/dG9rZW46IiIpIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAoIWdyb3VwUmVmKQorICAgICAgY2VyciA8PCAiV2FybmluZzogY291bGQgbm90IGZpbmQgZ3JvdXAgJyIgPDwgKG5hbWU/bmFtZToiIikgPDwgIicgcmVmICciIDw8IChyZWY/cmVmOiIiKSA8PCAiJyBpbiBzY2hlbWEgIiA8PCAoc2NoZW1hLnRhcmdldE5hbWVzcGFjZT9zY2hlbWEudGFyZ2V0TmFtZXNwYWNlOiIiKSA8PCBlbmRsOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorCit2b2lkIHhzX19ncm91cDo6c2NoZW1hUHRyKHhzX19zY2hlbWEgKnNjaGVtYSkKK3sgc2NoZW1hUmVmID0gc2NoZW1hOworfQorCit4c19fc2NoZW1hKiB4c19fZ3JvdXA6OnNjaGVtYVB0cigpIGNvbnN0Cit7IHJldHVybiBzY2hlbWFSZWY7Cit9CisKK3ZvaWQgeHNfX2dyb3VwOjpncm91cFB0cih4c19fZ3JvdXAgKmdyb3VwKQoreyBncm91cFJlZiA9IGdyb3VwOworfQorCit4c19fZ3JvdXAqIHhzX19ncm91cDo6Z3JvdXBQdHIoKSBjb25zdAoreyByZXR1cm4gZ3JvdXBSZWY7Cit9CisKK2ludCB4c19fZW51bWVyYXRpb246OnRyYXZlcnNlKHhzX19zY2hlbWEgJnNjaGVtYSkKK3sgaWYgKHZmbGFnKQorICAgIGNlcnIgPDwgIkFuYWx5emluZyBzY2hlbWEgZW51bWVyYXRpb24iIDw8IGVuZGw7CisgIHJldHVybiBTT0FQX09LOworfQorCitpbnQgeHNfX3BhdHRlcm46OnRyYXZlcnNlKHhzX19zY2hlbWEgJnNjaGVtYSkKK3sgaWYgKHZmbGFnKQorICAgIGNlcnIgPDwgIkFuYWx5emluZyBzY2hlbWEgcGF0dGVybiIgPDwgZW5kbDsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JSS9PCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworb3N0cmVhbSAmb3BlcmF0b3I8PChvc3RyZWFtICZvLCBjb25zdCB4c19fc2NoZW1hICZlKQoreyBpZiAoIWUuc29hcCkKKyAgeyBzdHJ1Y3Qgc29hcCBzb2FwOworICAgIHNvYXBfaW5pdDIoJnNvYXAsIFNPQVBfSU9fREVGQVVMVCwgU09BUF9YTUxfVFJFRSB8IFNPQVBfQ19VVEZTVFJJTkcpOworI2lmZGVmIFdJVEhfTk9OQU1FU1BBQ0VTCisgICAgc29hcF9zZXRfbmFtZXNwYWNlcygmc29hcCwgbmFtZXNwYWNlcyk7CisjZW5kaWYKKyAgICBlLnNvYXBfc2VyaWFsaXplKCZzb2FwKTsKKyAgICBzb2FwX2JlZ2luX3NlbmQoJnNvYXApOworICAgIGUuc29hcF9vdXQoJnNvYXAsICJ4czpzY2hlbWEiLCAwLCBOVUxMKTsKKyAgICBzb2FwX2VuZF9zZW5kKCZzb2FwKTsKKyAgICBzb2FwX2VuZCgmc29hcCk7CisgICAgc29hcF9kb25lKCZzb2FwKTsKKyAgfQorICBlbHNlCisgIHsgb3N0cmVhbSAqb3MgPSBlLnNvYXAtPm9zOworICAgIGUuc29hcC0+b3MgPSAmbzsKKyAgICBlLnNvYXBfc2VyaWFsaXplKGUuc29hcCk7CisgICAgc29hcF9iZWdpbl9zZW5kKGUuc29hcCk7CisgICAgZS5zb2FwX291dChlLnNvYXAsICJ4czpzY2hlbWEiLCAwLCBOVUxMKTsKKyAgICBzb2FwX2VuZF9zZW5kKGUuc29hcCk7CisgICAgZS5zb2FwLT5vcyA9IG9zOworICB9CisgIHJldHVybiBvOworfQorCitpc3RyZWFtICZvcGVyYXRvcj4+KGlzdHJlYW0gJmksIHhzX19zY2hlbWEgJmUpCit7IGlmICghZS5zb2FwKQorICAgIGUuc29hcCA9IHNvYXBfbmV3KCk7CisjaWZkZWYgV0lUSF9OT05BTUVTUEFDRVMKKyAgc29hcF9zZXRfbmFtZXNwYWNlcyhlLnNvYXAsIG5hbWVzcGFjZXMpOworI2VuZGlmCisgIGlzdHJlYW0gKmlzID0gZS5zb2FwLT5pczsKKyAgZS5zb2FwLT5pcyA9ICZpOworICBpZiAoc29hcF9iZWdpbl9yZWN2KGUuc29hcCkKKyAgIHx8ICFlLnNvYXBfaW4oZS5zb2FwLCAieHM6c2NoZW1hIiwgTlVMTCkKKyAgIHx8IHNvYXBfZW5kX3JlY3YoZS5zb2FwKSkKKyAgeyAvLyBoYW5kbGUgZXJyb3I/IE5vdGU6IGUuc29hcC0+ZXJyb3IgaXMgc2V0IGFuZCBhcHAgc2hvdWxkIGNoZWNrCisgIH0KKyAgZS5zb2FwLT5pcyA9IGlzOworICByZXR1cm4gaTsKK30KKwpkaWZmIC0tZ2l0IGEvd3NkbC9zY2hlbWEuaCBiL3dzZGwvc2NoZW1hLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRmMzY5MgotLS0gL2Rldi9udWxsCisrKyBiL3dzZGwvc2NoZW1hLmgKQEAgLTAsMCArMSw0ODggQEAKKy8qCisKK3NjaGVtYS5oCisKK1hTRCBiaW5kaW5nIHNjaGVtYSBpbnRlcmZhY2UKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMS0yMDA2LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyB0d28gbGljZW5zZXM6CitHUEwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKi8KKworLy9nc29hcCB4cyBzY2hlbWEgZG9jdW1lbnRhdGlvbjoJWFNEIGJpbmRpbmcgc2NoZW1hCisvL2dzb2FwIHhzIHNjaGVtYSBuYW1lc3BhY2U6CQlodHRwOi8vd3d3LnczLm9yZy8yMDAwLzEwL1hNTFNjaGVtYQorLy9nc29hcCB4cyBzY2hlbWEgZWxlbWVudEZvcm06CQlxdWFsaWZpZWQKKy8vZ3NvYXAgeHMgc2NoZW1hIGF0dHJpYnV0ZUZvcm06CXVucXVhbGlmaWVkCisKKy8qIEZvciB0aGUgd3NkbDphcnJheVR5cGUgYXR0cmlidXRlIHRvIHN1cHBvcnQgb2xkIHN0eWxlIFNPQVAgYXJyYXlzOiAqLworLy9nc29hcCB3c2RsIHNjaGVtYSBuYW1lc3BhY2U6CQlodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLworCisjaW1wb3J0ICJpbXBvcnRzLmgiCisKK2NsYXNzIHhzX19zY2hlbWE7CQkJLy8gZm9yd2FyZCBkZWNsYXJhdGlvbgorY2xhc3MgeHNfX3NpbXBsZVR5cGU7CQkJLy8gZm9yd2FyZCBkZWNsYXJhdGlvbgorY2xhc3MgeHNfX2NvbXBsZXhUeXBlOwkJCS8vIGZvcndhcmQgZGVjbGFyYXRpb24KK2NsYXNzIHhzX19leHRlbnNpb247CQkJLy8gZm9yd2FyZCBkZWNsYXJhdGlvbgorY2xhc3MgeHNfX3Jlc3RyaWN0aW9uOwkJCS8vIGZvcndhcmQgZGVjbGFyYXRpb24KK2NsYXNzIHhzX19zZXF1ZW5jZTsJCQkvLyBmb3J3YXJkIGRlY2xhcmF0aW9uCitjbGFzcyB4c19fY2hvaWNlOwkJCS8vIGZvcndhcmQgZGVjbGFyYXRpb24KK2NsYXNzIHhzX19saXN0OwkJCQkvLyBmb3J3YXJkIGRlY2xhcmF0aW9uCitjbGFzcyB4c19fdW5pb247CQkJLy8gZm9yd2FyZCBkZWNsYXJhdGlvbgorCitjbGFzcyB4c19fYW5ub3RhdGlvbgoreyBwdWJsaWM6CisJY2hhcgkJCQkqZG9jdW1lbnRhdGlvbjsKK307CisKK2NsYXNzIHhzX19lbGVtZW50Cit7IHB1YmxpYzoKKwkvLyBAeHNkX19JRAkJCWlkOworCUB4c2RfX05DTmFtZQkJCW5hbWU7CisJQHhzZF9fUU5hbWUJCQlyZWY7CisJQHhzZF9fUU5hbWUJCQl0eXBlOworCUB4c2RfX3N0cmluZwkJCWRlZmF1bHRfOworCUB4c2RfX3N0cmluZwkJCWZpeGVkOworCUB4c2RfX2Jvb2xlYW4JCQluaWxsYWJsZQkJPSBmYWxzZTsKKwlAeHNkX19ib29sZWFuCQkJYWJzdHJhY3QJCT0gZmFsc2U7CisJQHhzZF9fUU5hbWUJCQlzdWJzdGl0dXRpb25Hcm91cDsKKwlAeHNkX19zdHJpbmcJCQltaW5PY2N1cnM7CQkvLyB4c2Q6bm9uTmVnYXRpdmVJbnRlZ2VyCisJQHhzZF9fc3RyaW5nCQkJbWF4T2NjdXJzOwkJLy8geHNkOm5vbk5lZ2F0aXZlSW50ZWdlcnx1bmJvdW5kZWQKKwl4c19fYW5ub3RhdGlvbgkJCSphbm5vdGF0aW9uOworCXhzX19zaW1wbGVUeXBlCQkJKnNpbXBsZVR5cGU7CQkvLyBjaG9pY2UKKwl4c19fY29tcGxleFR5cGUJCQkqY29tcGxleFR5cGU7CQkvLyBjaG9pY2UKKyAgcHJpdmF0ZToKKwl4c19fc2NoZW1hCQkJKnNjaGVtYVJlZjsJCS8vIHNjaGVtYSB0byB3aGljaCB0aGlzIGJlbG9uZ3MKKyAgCXhzX19lbGVtZW50CQkJKmVsZW1lbnRSZWY7CQkvLyB0cmF2ZXJzZSgpIGZpbmRzIHJlZgorICAJeHNfX3NpbXBsZVR5cGUJCQkqc2ltcGxlVHlwZVJlZjsJCS8vIHRyYXZlcnNlKCkgZmluZHMgdHlwZSBvciA9IHNpbXBsZVR5cGUgYWJvdmUKKyAgCXhzX19jb21wbGV4VHlwZQkJCSpjb21wbGV4VHlwZVJlZjsJLy8gdHJhdmVyc2UoKSBmaW5kcyB0eXBlIG9yID0gY29tcGxleFR5cGUgYWJvdmUKKwlzdGQ6OnZlY3Rvcjx4c19fZWxlbWVudCo+CXN1YnN0aXR1dGlvbnM7CQkvLyB0cmF2ZXJzZSgpIGZpbmRzIHN1YnN0aXR1dGlvbkdyb3VwIGVsZW1lbnRzIGZvciB0aGlzIGFic3RyYWN0IGVsZW1lbnQKKyAgcHVibGljOgorCQkJCQl4c19fZWxlbWVudCgpOworICAJaW50CQkJCXRyYXZlcnNlKHhzX19zY2hlbWEmKTsKKwl2b2lkCQkJCXNjaGVtYVB0cih4c19fc2NoZW1hKik7CisJdm9pZAkJCQllbGVtZW50UHRyKHhzX19lbGVtZW50Kik7CisJdm9pZAkJCQlzaW1wbGVUeXBlUHRyKHhzX19zaW1wbGVUeXBlKik7CisJdm9pZAkJCQljb21wbGV4VHlwZVB0cih4c19fY29tcGxleFR5cGUqKTsKKwl4c19fc2NoZW1hCQkJKnNjaGVtYVB0cigpIGNvbnN0OworCXhzX19lbGVtZW50CQkJKmVsZW1lbnRQdHIoKSBjb25zdDsKKwl4c19fc2ltcGxlVHlwZQkJCSpzaW1wbGVUeXBlUHRyKCkgY29uc3Q7CisJeHNfX2NvbXBsZXhUeXBlCQkJKmNvbXBsZXhUeXBlUHRyKCkgY29uc3Q7CisJY29uc3Qgc3RkOjp2ZWN0b3I8eHNfX2VsZW1lbnQqPgkqc3Vic3RpdHV0aW9uc1B0cigpIGNvbnN0OworfTsKKworZW51bSB4c19fYXR0cmlidXRlX3VzZSB7IG9wdGlvbmFsLCBwcm9oaWJpdGVkLCByZXF1aXJlZCwgZGVmYXVsdF8sIGZpeGVkXyB9OworCitjbGFzcyB4c19fYXR0cmlidXRlCit7IHB1YmxpYzoKKwlAeHNkX19OQ05hbWUJCQluYW1lOworCUB4c2RfX1FOYW1lCQkJcmVmOworCUB4c2RfX1FOYW1lCQkJdHlwZTsKKwlAZW51bSB4c19fYXR0cmlidXRlX3VzZQkJdXNlCQkJPSBvcHRpb25hbDsKKwlAeHNkX19zdHJpbmcJCQl2YWx1ZTsKKwlAeHNkX19RTmFtZQkJCXZhbHVlXzsJCQkvLyBhbHNvIGdldCBRTmFtZSB2YWx1ZSBpZiBhdHRyaWJ1dGUgdHlwZSBpcyBRTmFtZQorCUB4c2RfX1FOYW1lCQkJd3NkbF9fYXJyYXlUeXBlOwkvLyBleHRlbnNpYmlsaXR5IGF0dHJpYnV0ZSBhZGRlZCB0byBzaW1wbGlmeSBXU0RMIHBhcnNpbmcKKwl4c19fYW5ub3RhdGlvbgkJCSphbm5vdGF0aW9uOworCXhzX19zaW1wbGVUeXBlCQkJKnNpbXBsZVR5cGU7CisgIHByaXZhdGU6CisJeHNfX3NjaGVtYQkJCSpzY2hlbWFSZWY7CQkvLyBzY2hlbWEgdG8gd2hpY2ggdGhpcyBiZWxvbmdzCisgIAl4c19fYXR0cmlidXRlCQkJKmF0dHJpYnV0ZVJlZjsJCS8vIHRyYXZlcnNlKCkgZmluZHMgcmVmCisgIAl4c19fc2ltcGxlVHlwZQkJCSpzaW1wbGVUeXBlUmVmOwkJLy8gdHJhdmVyc2UoKSBmaW5kcyB0eXBlIG9yID0gc2ltcGxlVHlwZSBhYm92ZQorICBwdWJsaWM6CisJCQkJCXhzX19hdHRyaWJ1dGUoKTsKKyAgCWludAkJCQl0cmF2ZXJzZSh4c19fc2NoZW1hJik7CisJdm9pZAkJCQlzY2hlbWFQdHIoeHNfX3NjaGVtYSopOworCXZvaWQJCQkJYXR0cmlidXRlUHRyKHhzX19hdHRyaWJ1dGUqKTsKKwl2b2lkCQkJCXNpbXBsZVR5cGVQdHIoeHNfX3NpbXBsZVR5cGUqKTsKKwl4c19fc2NoZW1hCQkJKnNjaGVtYVB0cigpIGNvbnN0OworCXhzX19hdHRyaWJ1dGUJCQkqYXR0cmlidXRlUHRyKCkgY29uc3Q7CisJeHNfX3NpbXBsZVR5cGUJCQkqc2ltcGxlVHlwZVB0cigpIGNvbnN0OworfTsKKworY2xhc3MgeHNfX2FsbAoreyBwdWJsaWM6CisJc3RkOjp2ZWN0b3I8eHNfX2VsZW1lbnQ+CWVsZW1lbnQ7CisgIHB1YmxpYzoKKyAgCWludAkJCQl0cmF2ZXJzZSh4c19fc2NoZW1hJik7Cit9OworCitlbnVtIHhzX19wcm9jZXNzQ29udGVudHMgeyBzdHJpY3QsIHNraXAsIGxheCB9OworCit0eXBlZGVmIGNoYXIgKnhzX19uYW1lc3BhY2VMaXN0OwkvLyAiIyNhbnkiIG9yICIjI290aGVyIiBvciBsaXN0IG9mIFVSSSwgIiMjdGFyZ2V0TmFtZXNwYWNlIiwgIiMjbG9jYWwiCisKK2NsYXNzIHhzX19hbnkKK3sgcHVibGljOgorCUB4c19fbmFtZXNwYWNlTGlzdAkJbmFtZXNwYWNlXwkJPSAiIyNhbnkiOworCUBlbnVtIHhzX19wcm9jZXNzQ29udGVudHMJcHJvY2Vzc0NvbnRlbnRzCQk9IHN0cmljdDsKKwlAeHNkX19zdHJpbmcJCQltaW5PY2N1cnM7CQkvLyB4c2Q6bm9uTmVnYXRpdmVJbnRlZ2VyCisJQHhzZF9fc3RyaW5nCQkJbWF4T2NjdXJzOwkJLy8geHNkOm5vbk5lZ2F0aXZlSW50ZWdlcnx1bmJvdW5kZWQKKwlzdGQ6OnZlY3Rvcjx4c19fZWxlbWVudD4JZWxlbWVudDsKKyAgcHVibGljOgorICAJaW50CQkJCXRyYXZlcnNlKHhzX19zY2hlbWEmKTsKK307CisKK2NsYXNzIHhzX19ncm91cAoreyBwdWJsaWM6CisJQHhzZF9fTkNOYW1lCQkJbmFtZTsKKwlAeHNkX19RTmFtZQkJCXJlZjsKKwl4c19fYW5ub3RhdGlvbgkJCSphbm5vdGF0aW9uOworCXhzX19hbGwJCQkJKmFsbDsJCQkvLyBjaG9pY2UKKwl4c19fY2hvaWNlCQkJKmNob2ljZTsJCS8vIGNob2ljZQorCXhzX19zZXF1ZW5jZQkJCSpzZXF1ZW5jZTsJCS8vIGNob2ljZQorICBwcml2YXRlOgorCXhzX19zY2hlbWEJCQkqc2NoZW1hUmVmOwkJLy8gc2NoZW1hIHRvIHdoaWNoIHRoaXMgYmVsb25ncworICAJeHNfX2dyb3VwCQkJKmdyb3VwUmVmOwkJLy8gdHJhdmVyc2UoKSBmaW5kcyByZWYKKyAgcHVibGljOgorICAJCQkJCXhzX19ncm91cCgpOworICAJaW50CQkJCXRyYXZlcnNlKHhzX19zY2hlbWEmKTsKKwl2b2lkCQkJCXNjaGVtYVB0cih4c19fc2NoZW1hKik7CisJdm9pZAkJCQlncm91cFB0cih4c19fZ3JvdXAqKTsKKwl4c19fc2NoZW1hCQkJKnNjaGVtYVB0cigpIGNvbnN0OworCXhzX19ncm91cAkJCSpncm91cFB0cigpIGNvbnN0OworfTsKKworY2xhc3MgeHNfX2Nob2ljZQoreyBwdWJsaWM6CisJQHhzZF9fc3RyaW5nCQkJbWluT2NjdXJzOwkJLy8geHNkOm5vbk5lZ2F0aXZlSW50ZWdlcgorCUB4c2RfX3N0cmluZwkJCW1heE9jY3VyczsJCS8vIHhzZDpub25OZWdhdGl2ZUludGVnZXJ8dW5ib3VuZGVkCisJc3RkOjp2ZWN0b3I8eHNfX2VsZW1lbnQ+CWVsZW1lbnQ7CisJc3RkOjp2ZWN0b3I8eHNfX2dyb3VwPgkJZ3JvdXA7CisJLy9zdGQ6OnZlY3Rvcjx4c19fY2hvaWNlPgkJY2hvaWNlOworCXN0ZDo6dmVjdG9yPHhzX19zZXF1ZW5jZSo+CXNlcXVlbmNlOworCXN0ZDo6dmVjdG9yPHhzX19hbnk+CQlhbnk7CisJeHNfX2Fubm90YXRpb24JCQkqYW5ub3RhdGlvbjsKKyAgcHJpdmF0ZToKKwl4c19fc2NoZW1hCQkJKnNjaGVtYVJlZjsJCS8vIHNjaGVtYSB0byB3aGljaCB0aGlzIGJlbG9uZ3MKKyAgcHVibGljOgorCQkJCQl4c19fY2hvaWNlKCk7CisgIAlpbnQJCQkJdHJhdmVyc2UoeHNfX3NjaGVtYSYpOworCXZvaWQJCQkJc2NoZW1hUHRyKHhzX19zY2hlbWEqKTsKKwl4c19fc2NoZW1hCQkJKnNjaGVtYVB0cigpIGNvbnN0OworfTsKKworY2xhc3MgeHNfX3NlcXVlbmNlCit7IHB1YmxpYzoKKwlAeHNkX19zdHJpbmcJCQltaW5PY2N1cnM7CQkvLyB4c2Q6bm9uTmVnYXRpdmVJbnRlZ2VyCisJQHhzZF9fc3RyaW5nCQkJbWF4T2NjdXJzOwkJLy8geHNkOm5vbk5lZ2F0aXZlSW50ZWdlcnx1bmJvdW5kZWQKKwlzdGQ6OnZlY3Rvcjx4c19fZWxlbWVudD4JZWxlbWVudDsKKwlzdGQ6OnZlY3Rvcjx4c19fZ3JvdXA+CQlncm91cDsKKwlzdGQ6OnZlY3Rvcjx4c19fY2hvaWNlPgkJY2hvaWNlOworCXN0ZDo6dmVjdG9yPHhzX19zZXF1ZW5jZSo+CXNlcXVlbmNlOworCXN0ZDo6dmVjdG9yPHhzX19hbnk+CQlhbnk7CisJeHNfX2Fubm90YXRpb24JCQkqYW5ub3RhdGlvbjsKKyAgcHVibGljOgorICAJaW50CQkJCXRyYXZlcnNlKHhzX19zY2hlbWEmKTsKK307CisKK2NsYXNzIHhzX19hbnlBdHRyaWJ1dGUKK3sgcHVibGljOgorCUB4c19fbmFtZXNwYWNlTGlzdAkJbmFtZXNwYWNlXwkJPSAiIyNhbnkiOworCUBlbnVtIHhzX19wcm9jZXNzQ29udGVudHMJcHJvY2Vzc0NvbnRlbnRzCQk9IHN0cmljdDsKK307CisKK2NsYXNzIHhzX19hdHRyaWJ1dGVHcm91cAoreyBwdWJsaWM6CisJQHhzZF9fTkNOYW1lCQkJbmFtZTsKKwlAeHNkX19RTmFtZQkJCXJlZjsKKwl4c19fYW5ub3RhdGlvbgkJCSphbm5vdGF0aW9uOworCXN0ZDo6dmVjdG9yPHhzX19hdHRyaWJ1dGU+CWF0dHJpYnV0ZTsKKwlzdGQ6OnZlY3Rvcjx4c19fYXR0cmlidXRlR3JvdXA+CWF0dHJpYnV0ZUdyb3VwOworCXhzX19hbnlBdHRyaWJ1dGUJCSphbnlBdHRyaWJ1dGU7CisgIHByaXZhdGU6CisJeHNfX3NjaGVtYQkJCSpzY2hlbWFSZWY7CisgIAl4c19fYXR0cmlidXRlR3JvdXAJCSphdHRyaWJ1dGVHcm91cFJlZjsKKyAgcHVibGljOgorCQkJCQl4c19fYXR0cmlidXRlR3JvdXAoKTsKKyAgCWludAkJCQl0cmF2ZXJzZSh4c19fc2NoZW1hJik7CisJdm9pZAkJCQlzY2hlbWFQdHIoeHNfX3NjaGVtYSopOworCXZvaWQJCQkJYXR0cmlidXRlR3JvdXBQdHIoeHNfX2F0dHJpYnV0ZUdyb3VwKik7CisJeHNfX3NjaGVtYQkJCSpzY2hlbWFQdHIoKSBjb25zdDsKKwl4c19fYXR0cmlidXRlR3JvdXAJCSphdHRyaWJ1dGVHcm91cFB0cigpIGNvbnN0OworfTsKKworY2xhc3MgeHNfX2VudW1lcmF0aW9uCit7IHB1YmxpYzoKKwlAeHNkX19zdHJpbmcJCQl2YWx1ZTsKKwlAeHNkX19RTmFtZQkJCXZhbHVlXzsJLy8gYWxzbyBnZXQgUU5hbWUgdmFsdWUgaWYgYmFzZSB0eXBlIGlzIFFOYW1lCisJeHNfX2Fubm90YXRpb24JCQkqYW5ub3RhdGlvbjsKKyAgcHVibGljOgorICAJaW50CQkJCXRyYXZlcnNlKHhzX19zY2hlbWEmKTsKK307CisKK2NsYXNzIHhzX19wYXR0ZXJuCit7IHB1YmxpYzoKKwlAeHNkX19zdHJpbmcJCQl2YWx1ZTsKKyAgcHVibGljOgorICAJaW50CQkJCXRyYXZlcnNlKHhzX19zY2hlbWEmKTsKK307CisKK2NsYXNzIHhzX19zaW1wbGVDb250ZW50Cit7IHB1YmxpYzoKKwl4c19fZXh0ZW5zaW9uCQkJKmV4dGVuc2lvbjsJLy8gY2hvaWNlCisgCXhzX19yZXN0cmljdGlvbgkJCSpyZXN0cmljdGlvbjsJLy8gY2hvaWNlCisgIHB1YmxpYzoKKyAgCWludAkJCQl0cmF2ZXJzZSh4c19fc2NoZW1hJik7Cit9OworCitjbGFzcyB4c19fc2ltcGxlVHlwZQoreyBwdWJsaWM6CisJQHhzZF9fTk1UT0tFTgkJCW5hbWU7CisJeHNfX2Fubm90YXRpb24JCQkqYW5ub3RhdGlvbjsKKyAJeHNfX3Jlc3RyaWN0aW9uCQkJKnJlc3RyaWN0aW9uOwkvLyBjaG9pY2UKKyAJeHNfX2xpc3QJCQkqbGlzdDsJCS8vIGNob2ljZQorIAl4c19fdW5pb24JCQkqdW5pb25fOwkvLyBjaG9pY2UKKyAgcHJpdmF0ZToKKwl4c19fc2NoZW1hCQkJKnNjaGVtYVJlZjsKKwlpbnQJCQkJbGV2ZWw7CisgIHB1YmxpYzoKKwkJCQkJeHNfX3NpbXBsZVR5cGUoKTsKKyAgCWludAkJCQl0cmF2ZXJzZSh4c19fc2NoZW1hJik7CisJdm9pZAkJCQlzY2hlbWFQdHIoeHNfX3NjaGVtYSopOworCXhzX19zY2hlbWEJCQkqc2NoZW1hUHRyKCkgY29uc3Q7CisJaW50CQkJCWJhc2VMZXZlbCgpOworfTsKKworY2xhc3MgeHNfX2V4dGVuc2lvbgoreyBwdWJsaWM6CisJQHhzZF9fUU5hbWUJCQliYXNlOworCXhzX19ncm91cAkJCSpncm91cDsKKwl4c19fYWxsCQkJCSphbGw7CisJeHNfX2Nob2ljZQkJCSpjaG9pY2U7CisJeHNfX3NlcXVlbmNlCQkJKnNlcXVlbmNlOworCXN0ZDo6dmVjdG9yPHhzX19hdHRyaWJ1dGU+CWF0dHJpYnV0ZTsKKwlzdGQ6OnZlY3Rvcjx4c19fYXR0cmlidXRlR3JvdXA+CWF0dHJpYnV0ZUdyb3VwOworCXhzX19hbnlBdHRyaWJ1dGUJCSphbnlBdHRyaWJ1dGU7CisgIHByaXZhdGU6CisgIAl4c19fc2ltcGxlVHlwZQkJCSpzaW1wbGVUeXBlUmVmOwkJLy8gdHJhdmVyc2UoKSBmaW5kcyB0eXBlCisgIAl4c19fY29tcGxleFR5cGUJCQkqY29tcGxleFR5cGVSZWY7CS8vIHRyYXZlcnNlKCkgZmluZHMgdHlwZQorICBwdWJsaWM6CisJCQkJCXhzX19leHRlbnNpb24oKTsKKyAgCWludAkJCQl0cmF2ZXJzZSh4c19fc2NoZW1hJik7CisJdm9pZAkJCQlzaW1wbGVUeXBlUHRyKHhzX19zaW1wbGVUeXBlKik7CisJdm9pZAkJCQljb21wbGV4VHlwZVB0cih4c19fY29tcGxleFR5cGUqKTsKKwl4c19fc2ltcGxlVHlwZQkJCSpzaW1wbGVUeXBlUHRyKCkgY29uc3Q7CisJeHNfX2NvbXBsZXhUeXBlCQkJKmNvbXBsZXhUeXBlUHRyKCkgY29uc3Q7Cit9OworCitjbGFzcyB4c19fbGVuZ3RoCit7IHB1YmxpYzoKKwlAeHNkX19zdHJpbmcJCQl2YWx1ZTsKKwlAeHNkX19ib29sZWFuCQkJZml4ZWQ7Cit9OworCitjbGFzcyB4c19fd2hpdGVTcGFjZQoreyBwdWJsaWM6CisJQHhzZF9fc3RyaW5nCQkJdmFsdWU7Cit9OworCitjbGFzcyB4c19fcmVzdHJpY3Rpb24KK3sgcHVibGljOgorCUB4c2RfX1FOYW1lCQkJYmFzZTsKKwl4c19fZ3JvdXAJCQkqZ3JvdXA7CQkvLyBub3QgdXNlZCBpbiA8c2ltcGxlVHlwZT48cmVzdHJpY3Rpb24+CisJeHNfX2FsbAkJCQkqYWxsOwkJLy8gbm90IHVzZWQgaW4gPHNpbXBsZVR5cGU+PHJlc3RyaWN0aW9uPgorCXhzX19jaG9pY2UJCQkqY2hvaWNlOwkvLyBub3QgdXNlZCBpbiA8c2ltcGxlVHlwZT48cmVzdHJpY3Rpb24+CisJeHNfX3NlcXVlbmNlCQkJKnNlcXVlbmNlOwkvLyBub3QgdXNlZCBpbiA8c2ltcGxlVHlwZT48cmVzdHJpY3Rpb24+CisJc3RkOjp2ZWN0b3I8eHNfX2F0dHJpYnV0ZT4JYXR0cmlidXRlOwkvLyBub3QgdXNlZCBpbiA8c2ltcGxlVHlwZT48cmVzdHJpY3Rpb24+CisJeHNfX2FueUF0dHJpYnV0ZQkJKmFueUF0dHJpYnV0ZTsJLy8gbm90IHVzZWQgaW4gPHNpbXBsZVR5cGU+PHJlc3RyaWN0aW9uPgorCXN0ZDo6dmVjdG9yPHhzX19lbnVtZXJhdGlvbj4JZW51bWVyYXRpb247CisJc3RkOjp2ZWN0b3I8eHNfX3BhdHRlcm4+CXBhdHRlcm47CisJeHNfX3doaXRlU3BhY2UJCQkqd2hpdGVTcGFjZTsKKwl4c19fbGVuZ3RoCQkJKmxlbmd0aDsKKwl4c19fbGVuZ3RoCQkJKm1pbkxlbmd0aDsKKwl4c19fbGVuZ3RoCQkJKm1heExlbmd0aDsKKwl4c19fbGVuZ3RoCQkJKnByZWNpc2lvbjsJCS8vIDIwMDAgc2NoZW1hCisJeHNfX2xlbmd0aAkJCSpzY2FsZTsJCQkvLyAyMDAwIHNjaGVtYQorCXhzX19sZW5ndGgJCQkqdG90YWxEaWdpdHM7CQkvLyAyMDAxIHNjaGVtYQorCXhzX19sZW5ndGgJCQkqZnJhY3Rpb25EaWdpdHM7CS8vIDIwMDEgc2NoZW1hCisJeHNfX2xlbmd0aAkJCSptaW5JbmNsdXNpdmU7CisJeHNfX2xlbmd0aAkJCSptYXhJbmNsdXNpdmU7CisJeHNfX2xlbmd0aAkJCSptaW5FeGNsdXNpdmU7CisJeHNfX2xlbmd0aAkJCSptYXhFeGNsdXNpdmU7CisJeHNfX2Fubm90YXRpb24JCQkqYW5ub3RhdGlvbjsKKyAgcHJpdmF0ZToKKyAgCXhzX19zaW1wbGVUeXBlCQkJKnNpbXBsZVR5cGVSZWY7CQkvLyB0cmF2ZXJzZSgpIGZpbmRzIHR5cGUKKyAgCXhzX19jb21wbGV4VHlwZQkJCSpjb21wbGV4VHlwZVJlZjsJLy8gdHJhdmVyc2UoKSBmaW5kcyB0eXBlCisgIHB1YmxpYzoKKwkJCQkJeHNfX3Jlc3RyaWN0aW9uKCk7CisgIAlpbnQJCQkJdHJhdmVyc2UoeHNfX3NjaGVtYSYpOworCXZvaWQJCQkJc2ltcGxlVHlwZVB0cih4c19fc2ltcGxlVHlwZSopOworCXZvaWQJCQkJY29tcGxleFR5cGVQdHIoeHNfX2NvbXBsZXhUeXBlKik7CisJeHNfX3NpbXBsZVR5cGUJCQkqc2ltcGxlVHlwZVB0cigpIGNvbnN0OworCXhzX19jb21wbGV4VHlwZQkJCSpjb21wbGV4VHlwZVB0cigpIGNvbnN0OworfTsKKworY2xhc3MgeHNfX2xpc3QKK3sgcHVibGljOgorCUB4c2RfX1FOYW1lCQkJaXRlbVR5cGU7CisgCXhzX19yZXN0cmljdGlvbgkJCSpyZXN0cmljdGlvbjsJLy8gY2hvaWNlCisJc3RkOjp2ZWN0b3I8eHNfX3NpbXBsZVR5cGU+CXNpbXBsZVR5cGU7CS8vIGNob2ljZQorICBwcml2YXRlOgorICAJeHNfX3NpbXBsZVR5cGUJCQkqaXRlbVR5cGVSZWY7CisgIHB1YmxpYzoKKwkJCQkJeHNfX2xpc3QoKTsKKyAgCWludAkJCQl0cmF2ZXJzZSh4c19fc2NoZW1hJik7CisJdm9pZAkJCQlpdGVtVHlwZVB0cih4c19fc2ltcGxlVHlwZSopOworCXhzX19zaW1wbGVUeXBlCQkJKml0ZW1UeXBlUHRyKCkgY29uc3Q7Cit9OworCitjbGFzcyB4c19fdW5pb24KK3sgcHVibGljOgorCUB4c2RfX05NVE9LRU5TCQkJbWVtYmVyVHlwZXM7CS8vIGNoZWNrIGlmIE5NVE9LRU5TIGlzIG9rPz8/CisJc3RkOjp2ZWN0b3I8eHNfX3NpbXBsZVR5cGU+CXNpbXBsZVR5cGU7CisgIHB1YmxpYzoKKyAgCWludAkJCQl0cmF2ZXJzZSh4c19fc2NoZW1hJik7Cit9OworCitjbGFzcyB4c19fY29tcGxleENvbnRlbnQKK3sgcHVibGljOgorCUB4c2RfX2Jvb2xlYW4JCQltaXhlZAkJCT0gZmFsc2U7CisJeHNfX2V4dGVuc2lvbgkJCSpleHRlbnNpb247CisgCXhzX19yZXN0cmljdGlvbgkJCSpyZXN0cmljdGlvbjsKKyAgcHVibGljOgorICAJaW50CQkJCXRyYXZlcnNlKHhzX19zY2hlbWEmKTsKK307CisKK2NsYXNzIHhzX19jb21wbGV4VHlwZQoreyBwdWJsaWM6CisJQHhzZF9fTk1UT0tFTgkJCW5hbWU7CisJQHhzZF9fYm9vbGVhbgkJCWFic3RyYWN0CQk9IGZhbHNlOworCUB4c2RfX2Jvb2xlYW4JCQltaXhlZAkJCT0gZmFsc2U7CisJeHNfX2Fubm90YXRpb24JCQkqYW5ub3RhdGlvbjsKKwl4c19fc2ltcGxlQ29udGVudAkJKnNpbXBsZUNvbnRlbnQ7CisJeHNfX2NvbXBsZXhDb250ZW50CQkqY29tcGxleENvbnRlbnQ7CisJeHNfX2FsbAkJCQkqYWxsOworCXhzX19jaG9pY2UJCQkqY2hvaWNlOworCXhzX19zZXF1ZW5jZQkJCSpzZXF1ZW5jZTsKKwl4c19fYW55CQkJCSphbnk7CisJc3RkOjp2ZWN0b3I8eHNfX2F0dHJpYnV0ZT4JYXR0cmlidXRlOworCXN0ZDo6dmVjdG9yPHhzX19hdHRyaWJ1dGVHcm91cD4JYXR0cmlidXRlR3JvdXA7CisJeHNfX2FueUF0dHJpYnV0ZQkJKmFueUF0dHJpYnV0ZTsKKyAgcHJpdmF0ZToKKwl4c19fc2NoZW1hCQkJKnNjaGVtYVJlZjsKKyAgCWludAkJCQlsZXZlbDsKKyAgcHVibGljOgorCQkJCQl4c19fY29tcGxleFR5cGUoKTsKKyAgCWludAkJCQl0cmF2ZXJzZSh4c19fc2NoZW1hJik7CisJdm9pZAkJCQlzY2hlbWFQdHIoeHNfX3NjaGVtYSopOworCXhzX19zY2hlbWEJCQkqc2NoZW1hUHRyKCkgY29uc3Q7CisJaW50CQkJCWJhc2VMZXZlbCgpOworfTsKKworY2xhc3MgeHNfX2ltcG9ydAoreyBwdWJsaWM6CisJQHhzZF9fYW55VVJJCQkJbmFtZXNwYWNlXzsKKwlAeHNkX19hbnlVUkkJCQlzY2hlbWFMb2NhdGlvbjsKKyAgcHJpdmF0ZToKKyAgCXhzX19zY2hlbWEJCQkqc2NoZW1hUmVmOwkJLy8gc2V0IGJ5IFdTREwgcGFyc2VyIG9yIHZpYSBzY2hlbWFMb2NhdGlvbgorICBwdWJsaWM6CisJCQkJCXhzX19pbXBvcnQoKTsKKyAgCWludAkJCQl0cmF2ZXJzZSh4c19fc2NoZW1hJik7CisJdm9pZAkJCQlzY2hlbWFQdHIoeHNfX3NjaGVtYSopOworCXhzX19zY2hlbWEJCQkqc2NoZW1hUHRyKCkgY29uc3Q7Cit9OworCitjbGFzcyB4c19faW5jbHVkZQoreyBwdWJsaWM6CisJQHhzZF9fYW55VVJJCQkJc2NoZW1hTG9jYXRpb247CisgIHByaXZhdGU6CisgIAl4c19fc2NoZW1hCQkJKnNjaGVtYVJlZjsKKyAgcHVibGljOgorCQkJCQl4c19faW5jbHVkZSgpOworICAJaW50CQkJCXByZXByb2Nlc3MoeHNfX3NjaGVtYSYpOworICAJaW50CQkJCXRyYXZlcnNlKHhzX19zY2hlbWEmKTsKKwl2b2lkCQkJCXNjaGVtYVB0cih4c19fc2NoZW1hKik7CisJeHNfX3NjaGVtYQkJCSpzY2hlbWFQdHIoKSBjb25zdDsKK307CisJCitjbGFzcyB4c19fcmVkZWZpbmUKK3sgcHVibGljOgorCUB4c2RfX2FueVVSSQkJCXNjaGVtYUxvY2F0aW9uOworCXN0ZDo6dmVjdG9yPHhzX19ncm91cD4JCWdyb3VwOworCXN0ZDo6dmVjdG9yPHhzX19hdHRyaWJ1dGVHcm91cD4JYXR0cmlidXRlR3JvdXA7CisJc3RkOjp2ZWN0b3I8eHNfX3NpbXBsZVR5cGU+CXNpbXBsZVR5cGU7CisJc3RkOjp2ZWN0b3I8eHNfX2NvbXBsZXhUeXBlPgljb21wbGV4VHlwZTsKKyAgcHJpdmF0ZToKKyAgCXhzX19zY2hlbWEJCQkqc2NoZW1hUmVmOworICBwdWJsaWM6CisJCQkJCXhzX19yZWRlZmluZSgpOworICAJaW50CQkJCXByZXByb2Nlc3MoeHNfX3NjaGVtYSYpOworICAJaW50CQkJCXRyYXZlcnNlKHhzX19zY2hlbWEmKTsKKwl2b2lkCQkJCXNjaGVtYVB0cih4c19fc2NoZW1hKik7CisJeHNfX3NjaGVtYQkJCSpzY2hlbWFQdHIoKSBjb25zdDsKK307CisJCitlbnVtIHhzX19mb3JtQ2hvaWNlIHsgdW5xdWFsaWZpZWQsIHF1YWxpZmllZCB9OworCitjbGFzcyB4c19fc2NoZW1hCit7IHB1YmxpYzoKKwlAeHNkX19hbnlVUkkJCQl0YXJnZXROYW1lc3BhY2U7CisJQHhzZF9fc3RyaW5nCQkJdmVyc2lvbjsKKwlAZW51bSB4c19fZm9ybUNob2ljZQkJYXR0cmlidXRlRm9ybURlZmF1bHQJPSB1bnF1YWxpZmllZDsKKwlAZW51bSB4c19fZm9ybUNob2ljZQkJZWxlbWVudEZvcm1EZWZhdWx0CT0gdW5xdWFsaWZpZWQ7CisJc3RkOjp2ZWN0b3I8eHNfX2luY2x1ZGU+CWluY2x1ZGU7CisJc3RkOjp2ZWN0b3I8eHNfX3JlZGVmaW5lPglyZWRlZmluZTsKKwlzdGQ6OnZlY3Rvcjx4c19faW1wb3J0PgkJaW1wb3J0OworCXN0ZDo6dmVjdG9yPHhzX19hdHRyaWJ1dGU+CWF0dHJpYnV0ZTsKKwlzdGQ6OnZlY3Rvcjx4c19fZWxlbWVudD4JZWxlbWVudDsKKwlzdGQ6OnZlY3Rvcjx4c19fZ3JvdXA+CQlncm91cDsKKwlzdGQ6OnZlY3Rvcjx4c19fYXR0cmlidXRlR3JvdXA+CWF0dHJpYnV0ZUdyb3VwOworCXN0ZDo6dmVjdG9yPHhzX19zaW1wbGVUeXBlPglzaW1wbGVUeXBlOworCXN0ZDo6dmVjdG9yPHhzX19jb21wbGV4VHlwZT4JY29tcGxleFR5cGU7CisgIAlzdHJ1Y3Qgc29hcAkJCSpzb2FwOworICBwcml2YXRlOgorCWJvb2wJCQkJdXBkYXRlZDsKKwljaGFyKgkJCQlsb2NhdGlvbjsKKwlpbnQJCQkJcmVkaXJzOworCVNldE9mU3RyaW5nCQkJYnVpbHRpblR5cGVTZXQ7CisJU2V0T2ZTdHJpbmcJCQlidWlsdGluRWxlbWVudFNldDsKKwlTZXRPZlN0cmluZwkJCWJ1aWx0aW5BdHRyaWJ1dGVTZXQ7CisgIHB1YmxpYzoKKwkJCQkJeHNfX3NjaGVtYSgpOworCQkJCQl4c19fc2NoZW1hKHN0cnVjdCBzb2FwKik7CisJCQkJCXhzX19zY2hlbWEoc3RydWN0IHNvYXAqLCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworCXZpcnR1YWwJCQkJfnhzX19zY2hlbWEoKTsKKwlpbnQJCQkJZ2V0KHN0cnVjdCBzb2FwKik7CS8vIGdTT0FQIGdldHRlciBpcyB0cmlnZ2VyZWQgYWZ0ZXIgcGFyc2luZworCWludAkJCQlwcmVwcm9jZXNzKCk7CisJaW50CQkJCWluc2VydCh4c19fc2NoZW1hJik7CisJaW50CQkJCXRyYXZlcnNlKCk7CisJaW50CQkJCXJlYWQoY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKwl2b2lkCQkJCXNvdXJjZUxvY2F0aW9uKGNvbnN0IGNoYXIqKTsKKwljb25zdCBjaGFyKgkJCXNvdXJjZUxvY2F0aW9uKCk7CisJaW50CQkJCWVycm9yKCk7CisJdm9pZAkJCQlwcmludF9mYXVsdCgpOworCXZvaWQJCQkJYnVpbHRpblR5cGUoY29uc3QgY2hhciopOworCXZvaWQJCQkJYnVpbHRpbkVsZW1lbnQoY29uc3QgY2hhciopOworCXZvaWQJCQkJYnVpbHRpbkF0dHJpYnV0ZShjb25zdCBjaGFyKik7CisJY29uc3QgU2V0T2ZTdHJpbmcmCQlidWlsdGluVHlwZXMoKSBjb25zdDsKKwljb25zdCBTZXRPZlN0cmluZyYJCWJ1aWx0aW5FbGVtZW50cygpIGNvbnN0OworCWNvbnN0IFNldE9mU3RyaW5nJgkJYnVpbHRpbkF0dHJpYnV0ZXMoKSBjb25zdDsKKwlmcmllbmQgb3N0cmVhbSYJCQlvcGVyYXRvcjw8KG9zdHJlYW0mLCBjb25zdCB4c19fc2NoZW1hJik7CisJZnJpZW5kIGlzdHJlYW0mCQkJb3BlcmF0b3I+Pihpc3RyZWFtJiwgeHNfX3NjaGVtYSYpOworfTsKKworZXh0ZXJuIG9zdHJlYW0gJm9wZXJhdG9yPDwob3N0cmVhbSAmbywgY29uc3QgeHNfX3NjaGVtYSAmZSk7CitleHRlcm4gaXN0cmVhbSAmb3BlcmF0b3I+Pihpc3RyZWFtICZpLCB4c19fc2NoZW1hICZlKTsKKwpkaWZmIC0tZ2l0IGEvd3NkbC9zZXJ2aWNlLmNwcCBiL3dzZGwvc2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFmMzYxZAotLS0gL2Rldi9udWxsCisrKyBiL3dzZGwvc2VydmljZS5jcHAKQEAgLTAsMCArMSwxNDcyIEBACisvKgorCitzZXJ2aWNlLmNwcAorCitTZXJ2aWNlIHN0cnVjdHVyZXMuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgcGFydCBvZiB0aGUgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXM6CitHUEwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVE9ETzoJY29uc2lkZXIgYWRkaW5nIHN1cHBvcnQgZm9yIG5vbi1TT0FQIEhUVFAgb3BlcmF0aW9ucworICAgICAgICBhZGQgaGVhZGVyZmF1bHQgb3V0cHV0IGRlZmluaXRpb25zCisKKyovCisKKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgInNlcnZpY2UuaCIKKworc3RhdGljIHZvaWQgY29tbWVudChjb25zdCBjaGFyICpzdGFydCwgY29uc3QgY2hhciAqbWlkZGxlLCBjb25zdCBjaGFyICplbmQsIGNvbnN0IGNoYXIgKnRleHQpOworc3RhdGljIHZvaWQgcGFnZShjb25zdCBjaGFyICpwYWdlLCBjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqdGV4dCk7CitzdGF0aWMgdm9pZCBzZWN0aW9uKGNvbnN0IGNoYXIgKnNlY3Rpb24sIGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICp0ZXh0KTsKK3N0YXRpYyB2b2lkIGJhbm5lcihjb25zdCBjaGFyKik7CitzdGF0aWMgdm9pZCBpZGVudCgpOworc3RhdGljIHZvaWQgdGV4dChjb25zdCBjaGFyKik7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JRGVmaW5pdGlvbnMgbWV0aG9kcworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0RlZmluaXRpb25zOjpEZWZpbml0aW9ucygpCit7IH0KKwordm9pZCBEZWZpbml0aW9uczo6Y29sbGVjdChjb25zdCB3c2RsX19kZWZpbml0aW9ucyAmZGVmaW5pdGlvbnMpCit7IC8vIENvbGxlY3QgaW5mb3JtYXRpb246IGFuYWx5emUgV1NETCBkZWZpbml0aW9ucyBhbmQgaW1wb3J0ZWQgZGVmaW5pdGlvbnMKKyAgYW5hbHl6ZShkZWZpbml0aW9ucyk7CisgIGZvciAodmVjdG9yPHdzZGxfX2ltcG9ydD46OmNvbnN0X2l0ZXJhdG9yIGltcG9ydCA9IGRlZmluaXRpb25zLmltcG9ydC5iZWdpbigpOyBpbXBvcnQgIT0gZGVmaW5pdGlvbnMuaW1wb3J0LmVuZCgpOyArK2ltcG9ydCkKKyAgICBpZiAoKCppbXBvcnQpLmRlZmluaXRpb25zUHRyKCkpCisgICAgICBhbmFseXplKCooKmltcG9ydCkuZGVmaW5pdGlvbnNQdHIoKSk7Cit9CisKK3ZvaWQgRGVmaW5pdGlvbnM6OmFuYWx5emUoY29uc3Qgd3NkbF9fZGVmaW5pdGlvbnMgJmRlZmluaXRpb25zKQoreyAvLyBBbmFseXplIFdTREwgYW5kIGJ1aWxkIFNlcnZpY2UgaW5mb3JtYXRpb24KKyAgZm9yICh2ZWN0b3I8d3NkbF9fYmluZGluZz46OmNvbnN0X2l0ZXJhdG9yIGJpbmRpbmcgPSBkZWZpbml0aW9ucy5iaW5kaW5nLmJlZ2luKCk7IGJpbmRpbmcgIT0gZGVmaW5pdGlvbnMuYmluZGluZy5lbmQoKTsgKytiaW5kaW5nKQorICB7IC8vIC9kZWZpbml0aW9ucy9iaW5kaW5nL2RvY3VtZW50YXRpb24KKyAgICBjb25zdCBjaGFyICpiaW5kaW5nX2RvY3VtZW50YXRpb24gPSAoKmJpbmRpbmcpLmRvY3VtZW50YXRpb247CisgICAgLy8gL2RlZmluaXRpb25zL2JpbmRpbmcvc29hcDpiaW5kaW5nCisgICAgc29hcF9fYmluZGluZyAqc29hcF9fYmluZGluZ18gPSAoKmJpbmRpbmcpLnNvYXBfX2JpbmRpbmdfOworICAgIC8vIC9kZWZpbml0aW9ucy9iaW5kaW5nL3NvYXA6YmluZGluZy9AdHJhbnNwb3J0CisgICAgY29uc3QgY2hhciAqc29hcF9fYmluZGluZ190cmFuc3BvcnQgPSBOVUxMOworICAgIGlmIChzb2FwX19iaW5kaW5nXykKKyAgICAgIHNvYXBfX2JpbmRpbmdfdHJhbnNwb3J0ID0gc29hcF9fYmluZGluZ18tPnRyYW5zcG9ydDsKKyAgICAvLyAvZGVmaW5pdGlvbnMvYmluZGluZy9zb2FwOmJpbmRpbmcvQHN0eWxlCisgICAgc29hcF9fc3R5bGVDaG9pY2Ugc29hcF9fYmluZGluZ19zdHlsZSA9IHJwYzsKKyAgICBpZiAoc29hcF9fYmluZGluZ18gJiYgc29hcF9fYmluZGluZ18tPnN0eWxlKQorICAgICAgc29hcF9fYmluZGluZ19zdHlsZSA9ICpzb2FwX19iaW5kaW5nXy0+c3R5bGU7CisgICAgLy8gL2RlZmluaXRpb25zL2JpbmRpbmcvaHR0cDpiaW5kaW5nCisgICAgaHR0cF9fYmluZGluZyAqaHR0cF9fYmluZGluZ18gPSAoKmJpbmRpbmcpLmh0dHBfX2JpbmRpbmdfOworICAgIGNvbnN0IGNoYXIgKmh0dHBfX2JpbmRpbmdfdmVyYiA9IE5VTEw7CisgICAgaWYgKGh0dHBfX2JpbmRpbmdfKQorICAgICAgIGh0dHBfX2JpbmRpbmdfdmVyYiA9IGh0dHBfX2JpbmRpbmdfLT52ZXJiOworICAgIC8vIC9kZWZpbml0aW9ucy9iaW5kaW5nL29wZXJhdGlvbioKKyAgICBmb3IgKHZlY3Rvcjx3c2RsX19iaW5kaW5nX29wZXJhdGlvbj46OmNvbnN0X2l0ZXJhdG9yIG9wZXJhdGlvbiA9ICgqYmluZGluZykub3BlcmF0aW9uLmJlZ2luKCk7IG9wZXJhdGlvbiAhPSAoKmJpbmRpbmcpLm9wZXJhdGlvbi5lbmQoKTsgKytvcGVyYXRpb24pCisgICAgeyAvLyAvZGVmaW5pdGlvbnMvcG9ydFR5cGUvb3BlcmF0aW9uLyBhc3NvY2lhdGVkIHdpdGggL2RlZmluaXRpb25zL2JpbmRpbmcvb3BlcmF0aW9uCisgICAgICB3c2RsX19vcGVyYXRpb24gKndzZGxfX29wZXJhdGlvbl8gPSAoKm9wZXJhdGlvbikub3BlcmF0aW9uUHRyKCk7CisgICAgICAvLyAvZGVmaW5pdGlvbnMvYmluZGluZy9vcGVyYXRpb24vc29hcDpvcGVyYXRpb24KKyAgICAgIHNvYXBfX29wZXJhdGlvbiAqc29hcF9fb3BlcmF0aW9uXyA9ICgqb3BlcmF0aW9uKS5zb2FwX19vcGVyYXRpb25fOworICAgICAgLy8gL2RlZmluaXRpb25zL2JpbmRpbmcvb3BlcmF0aW9uL3NvYXA6b3BlcmF0aW9uL0BzdHlsZQorICAgICAgc29hcF9fc3R5bGVDaG9pY2Ugc29hcF9fb3BlcmF0aW9uX3N0eWxlID0gc29hcF9fYmluZGluZ19zdHlsZTsKKyAgICAgIGlmIChzb2FwX19vcGVyYXRpb25fICYmIHNvYXBfX29wZXJhdGlvbl8tPnN0eWxlKQorICAgICAgICBzb2FwX19vcGVyYXRpb25fc3R5bGUgPSAqc29hcF9fb3BlcmF0aW9uXy0+c3R5bGU7CisgICAgICAvLyAvZGVmaW5pdGlvbnMvYmluZGluZy9vcGVyYXRpb24vaHR0cDpvcGVyYXRpb24KKyAgICAgIGh0dHBfX29wZXJhdGlvbiAqaHR0cF9fb3BlcmF0aW9uXyA9ICgqb3BlcmF0aW9uKS5odHRwX19vcGVyYXRpb25fOworICAgICAgLy8gL2RlZmluaXRpb25zL2JpbmRpbmcvb3BlcmF0aW9uL2h0dHA6b3BlcmF0aW9uL0Bsb2NhdGlvbgorICAgICAgY29uc3QgY2hhciAqaHR0cF9fb3BlcmF0aW9uX2xvY2F0aW9uID0gTlVMTDsKKyAgICAgIGlmIChodHRwX19vcGVyYXRpb25fKQorICAgICAgICBodHRwX19vcGVyYXRpb25fbG9jYXRpb24gPSBodHRwX19vcGVyYXRpb25fLT5sb2NhdGlvbjsKKyAgICAgIC8vIC9kZWZpbml0aW9ucy9iaW5kaW5nL29wZXJhdGlvbi9pbnB1dAorICAgICAgd3NkbF9fZXh0X2lucHV0ICpleHRfaW5wdXQgPSAoKm9wZXJhdGlvbikuaW5wdXQ7CisgICAgICAvLyAvZGVmaW5pdGlvbnMvYmluZGluZy9vcGVyYXRpb24vb3V0cHV0CisgICAgICB3c2RsX19leHRfb3V0cHV0ICpleHRfb3V0cHV0ID0gKCpvcGVyYXRpb24pLm91dHB1dDsKKyAgICAgIC8vIC9kZWZpbml0aW9ucy9wb3J0VHlwZS9vcGVyYXRpb24KKyAgICAgIGlmICh3c2RsX19vcGVyYXRpb25fKQorICAgICAgeyB3c2RsX19pbnB1dCAqaW5wdXQgPSB3c2RsX19vcGVyYXRpb25fLT5pbnB1dDsKKyAgICAgICAgd3NkbF9fb3V0cHV0ICpvdXRwdXQgPSB3c2RsX19vcGVyYXRpb25fLT5vdXRwdXQ7CisgICAgICAgIGlmIChodHRwX19vcGVyYXRpb25fKQorICAgICAgICB7IC8vIFRPRE86IEhUVFAgb3BlcmF0aW9uCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaW5wdXQgJiYgZXh0X2lucHV0KQorCXsgc29hcF9fYm9keSAqaW5wdXRfYm9keSA9IGV4dF9pbnB1dC0+c29hcF9fYm9keV87CisJICBpZiAoZXh0X2lucHV0LT5taW1lX19tdWx0aXBhcnRSZWxhdGVkXykKKwkgIHsgZm9yICh2ZWN0b3I8bWltZV9fcGFydD46OmNvbnN0X2l0ZXJhdG9yIHBhcnQgPSBleHRfaW5wdXQtPm1pbWVfX211bHRpcGFydFJlbGF0ZWRfLT5wYXJ0LmJlZ2luKCk7IHBhcnQgIT0gZXh0X2lucHV0LT5taW1lX19tdWx0aXBhcnRSZWxhdGVkXy0+cGFydC5lbmQoKTsgKytwYXJ0KQorCSAgICAgIGlmICgoKnBhcnQpLnNvYXBfX2JvZHlfKQorCSAgICAgIHsgaW5wdXRfYm9keSA9ICgqcGFydCkuc29hcF9fYm9keV87CisJICAgICAgICBicmVhazsKKwkgICAgICB9CisJICB9CisgICAgICAgICAgLy8gTVVTVCBoYXZlIGFuIGlucHV0LCBvdGhlcndpc2UgY2FuJ3QgZ2VuZXJhdGUgYSBzZXJ2aWNlIG9wZXJhdGlvbgorICAgICAgICAgIGlmIChpbnB1dF9ib2R5KQorICAgICAgICAgIHsgY29uc3QgY2hhciAqVVJJOworICAgICAgICAgICAgaWYgKHNvYXBfX29wZXJhdGlvbl9zdHlsZSA9PSBycGMpCisgICAgICAgICAgICAgIFVSSSA9IGlucHV0X2JvZHktPm5hbWVzcGFjZV87CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIFVSSSA9IGRlZmluaXRpb25zLnRhcmdldE5hbWVzcGFjZTsKKyAgICAgICAgICAgIGlmIChVUkkpCisgICAgICAgICAgICB7IGNvbnN0IGNoYXIgKnByZWZpeCA9IHR5cGVzLm5zcHJlZml4KE5VTEwsIFVSSSk7CisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSB0eXBlcy5hbmFtZShOVUxMLCBOVUxMLCAoKmJpbmRpbmcpLm5hbWUpOyAvLyBuYW1lIG9mIHNlcnZpY2UgaXMgYmluZGluZyBuYW1lCisgICAgICAgICAgICAgIFNlcnZpY2UgKnMgPSBzZXJ2aWNlc1twcmVmaXhdOworICAgICAgICAgICAgICBpZiAoIXMpCisgICAgICAgICAgICAgIHsgcyA9IHNlcnZpY2VzW3ByZWZpeF0gPSBuZXcgU2VydmljZSgpOworICAgICAgICAgICAgICAgIHMtPnByZWZpeCA9IHByZWZpeDsKKyAgICAgICAgICAgICAgICBzLT5VUkkgPSBVUkk7CisgICAgICAgICAgICAgICAgcy0+bmFtZSA9IG5hbWU7CisgICAgICAgICAgICAgICAgcy0+dHJhbnNwb3J0ID0gc29hcF9fYmluZGluZ190cmFuc3BvcnQ7CisgICAgICAgICAgICAgICAgaWYgKCgqYmluZGluZykucG9ydFR5cGVQdHIoKSkKKyAgICAgICAgICAgICAgICAgIHMtPnR5cGUgPSB0eXBlcy5hbmFtZShOVUxMLCBOVUxMLCAoKmJpbmRpbmcpLnBvcnRUeXBlUHRyKCktPm5hbWUpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHMtPnR5cGUgPSBOVUxMOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGZvciAodmVjdG9yPHdzZGxfX3NlcnZpY2U+Ojpjb25zdF9pdGVyYXRvciBzZXJ2aWNlID0gZGVmaW5pdGlvbnMuc2VydmljZS5iZWdpbigpOyBzZXJ2aWNlICE9IGRlZmluaXRpb25zLnNlcnZpY2UuZW5kKCk7ICsrc2VydmljZSkKKyAgICAgICAgICAgICAgeyBmb3IgKHZlY3Rvcjx3c2RsX19wb3J0Pjo6Y29uc3RfaXRlcmF0b3IgcG9ydCA9ICgqc2VydmljZSkucG9ydC5iZWdpbigpOyBwb3J0ICE9ICgqc2VydmljZSkucG9ydC5lbmQoKTsgKytwb3J0KQorICAgICAgICAgICAgICAgIHsgaWYgKCgqcG9ydCkuYmluZGluZ1B0cigpID09ICYoKmJpbmRpbmcpKQorICAgICAgICAgICAgICAgICAgeyBpZiAoKCpwb3J0KS5zb2FwX19hZGRyZXNzXykKKyAgICAgICAgICAgICAgICAgICAgICBzLT5sb2NhdGlvbi5pbnNlcnQoKCpwb3J0KS5zb2FwX19hZGRyZXNzXy0+bG9jYXRpb24pOworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBIVFRQIGFkZHJlc3MgZm9yIEhUVFAgb3BlcmF0aW9ucworICAgICAgICAgICAgICAgICAgICAvLyBpZiAoKCpwb3J0KS5odHRwX19hZGRyZXNzXykKKyAgICAgICAgICAgICAgICAgICAgICAvLyBodHRwX19hZGRyZXNzX2xvY2F0aW9uID0gaHR0cF9fYWRkcmVzc18tPmxvY2F0aW9uOworICAgICAgICAgICAgICAgICAgICBpZiAoKCpzZXJ2aWNlKS5kb2N1bWVudGF0aW9uKQorICAgICAgICAgICAgICAgICAgICAgIHMtPnNlcnZpY2VfZG9jdW1lbnRhdGlvblsoKnNlcnZpY2UpLm5hbWVdID0gKCpzZXJ2aWNlKS5kb2N1bWVudGF0aW9uOworICAgICAgICAgICAgICAgICAgICBpZiAoKCpwb3J0KS5kb2N1bWVudGF0aW9uICYmICgqcG9ydCkubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICBzLT5wb3J0X2RvY3VtZW50YXRpb25bKCpwb3J0KS5uYW1lXSA9ICgqcG9ydCkuZG9jdW1lbnRhdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdfZG9jdW1lbnRhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICBzLT5iaW5kaW5nX2RvY3VtZW50YXRpb25bKCpiaW5kaW5nKS5uYW1lXSA9IGJpbmRpbmdfZG9jdW1lbnRhdGlvbjsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgT3BlcmF0aW9uICpvID0gbmV3IE9wZXJhdGlvbigpOworICAgICAgICAgICAgICBvLT5uYW1lID0gdHlwZXMuYW5hbWUoTlVMTCwgTlVMTCwgd3NkbF9fb3BlcmF0aW9uXy0+bmFtZSk7CisgICAgICAgICAgICAgIG8tPnByZWZpeCA9IHByZWZpeDsKKyAgICAgICAgICAgICAgby0+VVJJID0gVVJJOworICAgICAgICAgICAgICBvLT5zdHlsZSA9IHNvYXBfX29wZXJhdGlvbl9zdHlsZTsKKyAgICAgICAgICAgICAgby0+ZG9jdW1lbnRhdGlvbiA9IHdzZGxfX29wZXJhdGlvbl8tPmRvY3VtZW50YXRpb247CisgICAgICAgICAgICAgIG8tPm9wZXJhdGlvbl9kb2N1bWVudGF0aW9uID0gKCpvcGVyYXRpb24pLmRvY3VtZW50YXRpb247CisgICAgICAgICAgICAgIG8tPnBhcmFtZXRlck9yZGVyID0gd3NkbF9fb3BlcmF0aW9uXy0+cGFyYW1ldGVyT3JkZXI7CisgICAgICAgICAgICAgIGlmICgoKm9wZXJhdGlvbikuc29hcF9fb3BlcmF0aW9uXykKKyAgICAgICAgICAgICAgICBvLT5zb2FwQWN0aW9uID0gKCpvcGVyYXRpb24pLnNvYXBfX29wZXJhdGlvbl8tPnNvYXBBY3Rpb247CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeyBvLT5zb2FwQWN0aW9uID0gIiI7CisgICAgICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIGlmIHdlIHVzZSBTT0FQIDEuMiBpbiB3aGljaCBjYXNlIHNvYXBBY3Rpb24gaXMgYWJzZW50LCB0aGlzIGlzIGEgYml0IG9mIGEgaGFjayBkdWUgdG8gdGhlIGxhY2sgb2YgV1NETDEuMS9TT0FQMS4yIHN1cHBvcnQgYW5kIGJldHRlciBhbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgICAgICBmb3IgKE5hbWVzcGFjZSAqcCA9IGRlZmluaXRpb25zLnNvYXAtPmxvY2FsX25hbWVzcGFjZXM7IHAgJiYgcC0+aWQ7IHArKykKKyAgICAgICAgICAgICAgICB7IGlmIChwLT5vdXQgJiYgIXN0cmNtcChwLT5pZCwgInNvYXAiKSAmJiAhc3RyY21wKHAtPm91dCwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcDEyLyIpKQorICAgICAgICAgICAgICAgICAgeyBvLT5zb2FwQWN0aW9uID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIG8tPmlucHV0ID0gbmV3IE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgby0+aW5wdXQtPm5hbWUgPSAoKm9wZXJhdGlvbikubmFtZTsgLy8gUlBDIHVzZXMgb3BlcmF0aW9uL0BuYW1lCisgICAgICAgICAgICAgIGlmIChzb2FwX19vcGVyYXRpb25fc3R5bGUgPT0gcnBjICYmICFpbnB1dF9ib2R5LT5uYW1lc3BhY2VfKQorICAgICAgICAgICAgICB7IG8tPmlucHV0LT5VUkkgPSAiIjsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBubyBzb2FwOmJvZHkgbmFtZXNwYWNlIGF0dHJpYnV0ZVxuIik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG8tPmlucHV0LT5VUkkgPSBpbnB1dF9ib2R5LT5uYW1lc3BhY2VfOworICAgICAgICAgICAgICBvLT5pbnB1dC0+dXNlID0gaW5wdXRfYm9keS0+dXNlOworICAgICAgICAgICAgICBvLT5pbnB1dC0+ZW5jb2RpbmdTdHlsZSA9IGlucHV0X2JvZHktPmVuY29kaW5nU3R5bGU7CisgICAgICAgICAgICAgIG8tPmlucHV0LT5tZXNzYWdlID0gaW5wdXQtPm1lc3NhZ2VQdHIoKTsKKyAgICAgICAgICAgICAgby0+aW5wdXQtPnBhcnQgPSBOVUxMOworCSAgICAgIG8tPmlucHV0LT5tdWx0aXBhcnRSZWxhdGVkID0gZXh0X2lucHV0LT5taW1lX19tdWx0aXBhcnRSZWxhdGVkXzsKKwkgICAgICBvLT5pbnB1dC0+Y29udGVudCA9IE5VTEw7CisJICAgICAgaWYgKGV4dF9pbnB1dC0+bWltZV9fbXVsdGlwYXJ0UmVsYXRlZF8gJiYgIWV4dF9pbnB1dC0+bWltZV9fbXVsdGlwYXJ0UmVsYXRlZF8tPnBhcnQuZW1wdHkoKSkKKyAgICAgICAgICAgICAgICBvLT5pbnB1dC0+aGVhZGVyID0gZXh0X2lucHV0LT5taW1lX19tdWx0aXBhcnRSZWxhdGVkXy0+cGFydC5mcm9udCgpLnNvYXBfX2hlYWRlcl87CisJICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG8tPmlucHV0LT5oZWFkZXIgPSBleHRfaW5wdXQtPnNvYXBfX2hlYWRlcl87CisJICAgICAgaWYgKGV4dF9pbnB1dC0+bWltZV9fbXVsdGlwYXJ0UmVsYXRlZF8gJiYgIWV4dF9pbnB1dC0+bWltZV9fbXVsdGlwYXJ0UmVsYXRlZF8tPnBhcnQuZW1wdHkoKSAmJiBleHRfaW5wdXQtPm1pbWVfX211bHRpcGFydFJlbGF0ZWRfLT5wYXJ0LmZyb250KCkuc29hcF9fYm9keV8pCisJICAgICAgICBvLT5pbnB1dC0+Ym9keV9wYXJ0cyA9IGV4dF9pbnB1dC0+bWltZV9fbXVsdGlwYXJ0UmVsYXRlZF8tPnBhcnQuZnJvbnQoKS5zb2FwX19ib2R5Xy0+cGFydHM7CisgICAgICAgICAgICAgIGVsc2UKKwkgICAgICAgIG8tPmlucHV0LT5ib2R5X3BhcnRzID0gaW5wdXRfYm9keS0+cGFydHM7CisJICAgICAgaWYgKGV4dF9pbnB1dC0+ZGltZV9fbWVzc2FnZV8pCisJICAgICAgICBvLT5pbnB1dC0+bGF5b3V0ID0gZXh0X2lucHV0LT5kaW1lX19tZXNzYWdlXy0+bGF5b3V0OworCSAgICAgIGVsc2UKKwkgICAgICAgIG8tPmlucHV0LT5sYXlvdXQgPSBOVUxMOworICAgICAgICAgICAgICBvLT5pbnB1dC0+ZG9jdW1lbnRhdGlvbiA9IGlucHV0LT5kb2N1bWVudGF0aW9uOworICAgICAgICAgICAgICBvLT5pbnB1dC0+ZXh0X2RvY3VtZW50YXRpb24gPSBleHRfaW5wdXQtPmRvY3VtZW50YXRpb247CisgICAgICAgICAgICAgIGlmIChzb2FwX19vcGVyYXRpb25fc3R5bGUgPT0gZG9jdW1lbnQpCisgICAgICAgICAgICAgICAgby0+aW5wdXRfbmFtZSA9IHR5cGVzLm9uYW1lKCJfXyIsIG8tPlVSSSwgby0+aW5wdXQtPm5hbWUpOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgby0+aW5wdXRfbmFtZSA9IHR5cGVzLm9uYW1lKE5VTEwsIG8tPmlucHV0LT5VUkksIG8tPmlucHV0LT5uYW1lKTsKKyAgICAgICAgICAgICAgaWYgKG91dHB1dCAmJiBleHRfb3V0cHV0KQorCSAgICAgIHsgc29hcF9fYm9keSAqb3V0cHV0X2JvZHkgPSBleHRfb3V0cHV0LT5zb2FwX19ib2R5XzsKKyAgICAgICAgICAgICAgICBpZiAoZXh0X291dHB1dC0+bWltZV9fbXVsdGlwYXJ0UmVsYXRlZF8pCisJICAgICAgICB7IGZvciAodmVjdG9yPG1pbWVfX3BhcnQ+Ojpjb25zdF9pdGVyYXRvciBwYXJ0ID0gZXh0X291dHB1dC0+bWltZV9fbXVsdGlwYXJ0UmVsYXRlZF8tPnBhcnQuYmVnaW4oKTsgcGFydCAhPSBleHRfb3V0cHV0LT5taW1lX19tdWx0aXBhcnRSZWxhdGVkXy0+cGFydC5lbmQoKTsgKytwYXJ0KQorCSAgICAgICAgICAgIGlmICgoKnBhcnQpLnNvYXBfX2JvZHlfKQorCSAgICAgICAgICAgIHsgb3V0cHV0X2JvZHkgPSAoKnBhcnQpLnNvYXBfX2JvZHlfOworCSAgICAgICAgICAgICAgYnJlYWs7CisJICAgICAgICAgICAgfQorCQl9CisJCWlmIChleHRfb3V0cHV0LT5taW1lX19jb250ZW50XykKKyAgICAgICAgICAgICAgICB7IG8tPm91dHB1dCA9IG5ldyBNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgICBvLT5vdXRwdXQtPm5hbWUgPSBOVUxMOworICAgICAgICAgICAgICAgICAgby0+b3V0cHV0LT5VUkkgPSBOVUxMOworICAgICAgICAgICAgICAgICAgby0+b3V0cHV0LT5lbmNvZGluZ1N0eWxlID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgIG8tPm91dHB1dC0+Ym9keV9wYXJ0cyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICBvLT5vdXRwdXQtPnBhcnQgPSBOVUxMOworICAgICAgICAgICAgICAgICAgby0+b3V0cHV0LT5tdWx0aXBhcnRSZWxhdGVkID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgIG8tPm91dHB1dC0+Y29udGVudCA9IGV4dF9vdXRwdXQtPm1pbWVfX2NvbnRlbnRfOworICAgICAgICAgICAgICAgICAgby0+b3V0cHV0LT5tZXNzYWdlID0gb3V0cHV0LT5tZXNzYWdlUHRyKCk7CisgICAgICAgICAgICAgICAgICBvLT5vdXRwdXQtPmxheW91dCA9IE5VTEw7CisgICAgICAgICAgICAgICAgICBvLT5vdXRwdXQtPmRvY3VtZW50YXRpb24gPSBvdXRwdXQtPmRvY3VtZW50YXRpb247CisgICAgICAgICAgICAgICAgICBvLT5vdXRwdXQtPmV4dF9kb2N1bWVudGF0aW9uID0gZXh0X291dHB1dC0+ZG9jdW1lbnRhdGlvbjsKKwkJfQorCQllbHNlIGlmIChvdXRwdXRfYm9keSkKKyAgICAgICAgICAgICAgICB7IG8tPm91dHB1dCA9IG5ldyBNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgICBvLT5vdXRwdXQtPm5hbWUgPSAoKm9wZXJhdGlvbikubmFtZTsgLy8gUlBDIHVzZXMgb3BlcmF0aW9uL0BuYW1lIHdpdGggc3VmZml4ICdSZXNwb25zZScgYXMgc2V0IGJlbG93CisgICAgICAgICAgICAgICAgICBvLT5vdXRwdXQtPnVzZSA9IG91dHB1dF9ib2R5LT51c2U7CisgICAgICAgICAgICAgICAgICAvLyB0aGUgY29kZSBiZWxvdyBpcyBhIGhhY2sgYXJvdW5kIHRoZSBSUEMgZW5jb2RlZCByZXNwb25zZSBtZXNzYWdlIGVsZW1lbnQgdGFnIG1pc21hdGNoIHdpdGggQXhpczoKKyAgICAgICAgICAgICAgICAgIGlmICghb3V0cHV0X2JvZHktPm5hbWVzcGFjZV8gfHwgb3V0cHV0X2JvZHktPnVzZSA9PSBlbmNvZGVkKQorICAgICAgICAgICAgICAgICAgICBvLT5vdXRwdXQtPlVSSSA9IG8tPmlucHV0LT5VUkk7IC8vIGVuY29kZWQgc2VlbXMgKD8pIHRvIHJlcXVpcmUgdGhlIHJlcXVlc3QncyBuYW1lc3BhY2UKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgby0+b3V0cHV0LT5VUkkgPSBvdXRwdXRfYm9keS0+bmFtZXNwYWNlXzsKKyAgICAgICAgICAgICAgICAgIG8tPm91dHB1dC0+ZW5jb2RpbmdTdHlsZSA9IG91dHB1dF9ib2R5LT5lbmNvZGluZ1N0eWxlOworICAgICAgICAgICAgICAgICAgby0+b3V0cHV0LT5tZXNzYWdlID0gb3V0cHV0LT5tZXNzYWdlUHRyKCk7CisgICAgICAgICAgICAgICAgICBvLT5vdXRwdXQtPnBhcnQgPSBOVUxMOworCSAgICAgICAgICBvLT5vdXRwdXQtPm11bHRpcGFydFJlbGF0ZWQgPSBleHRfb3V0cHV0LT5taW1lX19tdWx0aXBhcnRSZWxhdGVkXzsKKyAgICAgICAgICAgICAgICAgIG8tPm91dHB1dC0+Y29udGVudCA9IE5VTEw7CisJICAgICAgICAgIGlmIChleHRfb3V0cHV0LT5taW1lX19tdWx0aXBhcnRSZWxhdGVkXyAmJiAhZXh0X291dHB1dC0+bWltZV9fbXVsdGlwYXJ0UmVsYXRlZF8tPnBhcnQuZW1wdHkoKSkKKyAgICAgICAgICAgICAgICAgICAgby0+b3V0cHV0LT5oZWFkZXIgPSBleHRfb3V0cHV0LT5taW1lX19tdWx0aXBhcnRSZWxhdGVkXy0+cGFydC5mcm9udCgpLnNvYXBfX2hlYWRlcl87CisJICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgby0+b3V0cHV0LT5oZWFkZXIgPSBleHRfb3V0cHV0LT5zb2FwX19oZWFkZXJfOworCSAgICAgICAgICBpZiAoZXh0X291dHB1dC0+bWltZV9fbXVsdGlwYXJ0UmVsYXRlZF8gJiYgIWV4dF9vdXRwdXQtPm1pbWVfX211bHRpcGFydFJlbGF0ZWRfLT5wYXJ0LmVtcHR5KCkgJiYgZXh0X291dHB1dC0+bWltZV9fbXVsdGlwYXJ0UmVsYXRlZF8tPnBhcnQuZnJvbnQoKS5zb2FwX19ib2R5XykKKwkgICAgICAgICAgICBvLT5vdXRwdXQtPmJvZHlfcGFydHMgPSBleHRfb3V0cHV0LT5taW1lX19tdWx0aXBhcnRSZWxhdGVkXy0+cGFydC5mcm9udCgpLnNvYXBfX2JvZHlfLT5wYXJ0czsKKyAgICAgICAgICAgICAgICAgIGVsc2UKKwkgICAgICAgICAgICBvLT5vdXRwdXQtPmJvZHlfcGFydHMgPSBvdXRwdXRfYm9keS0+cGFydHM7CisJICAgICAgICAgIGlmIChleHRfb3V0cHV0LT5kaW1lX19tZXNzYWdlXykKKwkgICAgICAgICAgICBvLT5vdXRwdXQtPmxheW91dCA9IGV4dF9vdXRwdXQtPmRpbWVfX21lc3NhZ2VfLT5sYXlvdXQ7CisJICAgICAgICAgIGVsc2UKKwkgICAgICAgICAgICBvLT5vdXRwdXQtPmxheW91dCA9IE5VTEw7CisgICAgICAgICAgICAgICAgICBvLT5vdXRwdXQtPmRvY3VtZW50YXRpb24gPSBvdXRwdXQtPmRvY3VtZW50YXRpb247CisgICAgICAgICAgICAgICAgICBvLT5vdXRwdXQtPmV4dF9kb2N1bWVudGF0aW9uID0gZXh0X291dHB1dC0+ZG9jdW1lbnRhdGlvbjsKKyAgICAgICAgICAgICAgICAgIGNoYXIgKnMgPSAoY2hhciopc29hcF9tYWxsb2MoZGVmaW5pdGlvbnMuc29hcCwgc3RybGVuKG8tPm91dHB1dC0+bmFtZSkgKyA5KTsKKyAgICAgICAgICAgICAgICAgIHN0cmNweShzLCBvLT5vdXRwdXQtPm5hbWUpOworICAgICAgICAgICAgICAgICAgc3RyY2F0KHMsICJSZXNwb25zZSIpOworICAgICAgICAgICAgICAgICAgaWYgKHNvYXBfX29wZXJhdGlvbl9zdHlsZSA9PSBkb2N1bWVudCkKKyAgICAgICAgICAgICAgICAgICAgby0+b3V0cHV0X25hbWUgPSB0eXBlcy5vbmFtZSgiX18iLCBvLT5VUkksIHMpOworICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBvLT5vdXRwdXRfbmFtZSA9IHR5cGVzLm9uYW1lKE5VTEwsIG8tPm91dHB1dC0+VVJJLCBzKTsKKwkgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsgby0+b3V0cHV0X25hbWUgPSBOVUxMOworICAgICAgICAgICAgICAgIG8tPm91dHB1dCA9IE5VTEw7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgLy8gY29sbGVjdCBpbnB1dCBoZWFkZXJzIGFuZCBoZWFkZXJmYXVsdHMKKyAgICAgICAgICAgICAgaWYgKGV4dF9pbnB1dCkKKyAgICAgICAgICAgICAgeyBjb25zdCB2ZWN0b3I8c29hcF9faGVhZGVyPiAqc29hcF9faGVhZGVyXyA9IE5VTEw7CisJCS8vIGNoZWNrIGlmIHNvYXAgaGVhZGVyIGlzIGluIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZAorCSAgICAgICAgaWYgKGV4dF9pbnB1dC0+bWltZV9fbXVsdGlwYXJ0UmVsYXRlZF8pCisgICAgICAgICAgICAgICAgeyBmb3IgKHZlY3RvcjxtaW1lX19wYXJ0Pjo6Y29uc3RfaXRlcmF0b3IgcGFydCA9IGV4dF9pbnB1dC0+bWltZV9fbXVsdGlwYXJ0UmVsYXRlZF8tPnBhcnQuYmVnaW4oKTsgcGFydCAhPSBleHRfaW5wdXQtPm1pbWVfX211bHRpcGFydFJlbGF0ZWRfLT5wYXJ0LmVuZCgpOyArK3BhcnQpCisgICAgICAgICAgICAgICAgICBpZiAoISgqcGFydCkuc29hcF9faGVhZGVyXy5lbXB0eSgpKQorICAgICAgICAgICAgICAgICAgeyBzb2FwX19oZWFkZXJfID0gJigqcGFydCkuc29hcF9faGVhZGVyXzsKKwkJICAgIGJyZWFrOworCQkgIH0KKwkJfQorCQlpZiAoIXNvYXBfX2hlYWRlcl8pCisJCSAgc29hcF9faGVhZGVyXyA9ICZleHRfaW5wdXQtPnNvYXBfX2hlYWRlcl87CisJICAgICAgICBmb3IgKHZlY3Rvcjxzb2FwX19oZWFkZXI+Ojpjb25zdF9pdGVyYXRvciBoZWFkZXIgPSBzb2FwX19oZWFkZXJfLT5iZWdpbigpOyBoZWFkZXIgIT0gc29hcF9faGVhZGVyXy0+ZW5kKCk7ICsraGVhZGVyKQorICAgICAgICAgICAgICAgIHsgTWVzc2FnZSAqaCA9IG5ldyBNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgICBoLT5tZXNzYWdlID0gKCpoZWFkZXIpLm1lc3NhZ2VQdHIoKTsKKwkgICAgICAgICAgaC0+Ym9keV9wYXJ0cyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICBoLT5wYXJ0ID0gKCpoZWFkZXIpLnBhcnRQdHIoKTsKKyAgICAgICAgICAgICAgICAgIGgtPlVSSSA9ICgqaGVhZGVyKS5uYW1lc3BhY2VfOworICAgICAgICAgICAgICAgICAgaWYgKGgtPnBhcnQgJiYgaC0+cGFydC0+ZWxlbWVudCkKKyAgICAgICAgICAgICAgICAgICAgaC0+bmFtZSA9IHR5cGVzLmFuYW1lKE5VTEwsIE5VTEwsIGgtPnBhcnQtPmVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaC0+VVJJICYmIGgtPnBhcnQgJiYgaC0+cGFydC0+bmFtZSAmJiBoLT5wYXJ0LT50eXBlKQorICAgICAgICAgICAgICAgICAgICBoLT5uYW1lID0gdHlwZXMuYW5hbWUoTlVMTCwgaC0+VVJJLCBoLT5wYXJ0LT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHsgZnByaW50ZihzdGRlcnIsICJFcnJvciBpbiBTT0FQIEhlYWRlciBwYXJ0IGRlZmluaXRpb246IGlucHV0IHBhcnQgJyVzJyBtaXNzaW5nP1xuIiwgaC0+cGFydCAmJiBoLT5wYXJ0LT5uYW1lID8gaC0+cGFydC0+bmFtZSA6ICI/Iik7CisgICAgICAgICAgICAgICAgICAgIGgtPm5hbWUgPSAiIjsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGgtPmVuY29kaW5nU3R5bGUgPSAoKmhlYWRlcikuZW5jb2RpbmdTdHlsZTsKKyAgICAgICAgICAgICAgICAgIGgtPnVzZSA9ICgqaGVhZGVyKS51c2U7CisJCSAgaC0+bXVsdGlwYXJ0UmVsYXRlZCA9IE5VTEw7CisJCSAgaC0+Y29udGVudCA9IE5VTEw7CisJCSAgaC0+bGF5b3V0ID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgIGgtPmV4dF9kb2N1bWVudGF0aW9uID0gTlVMTDsJLy8gVE9ETzogYWRkIGRvY3VtZW50IGNvbnRlbnQKKyAgICAgICAgICAgICAgICAgIGgtPmRvY3VtZW50YXRpb24gPSBOVUxMOwkJLy8gVE9ETzogYWRkIGRvY3VtZW50IGNvbnRlbnQKKyAgICAgICAgICAgICAgICAgIHMtPmhlYWRlcltoLT5uYW1lXSA9IGg7CisgICAgICAgICAgICAgICAgICBmb3IgKHZlY3Rvcjxzb2FwX19oZWFkZXJmYXVsdD46OmNvbnN0X2l0ZXJhdG9yIGhlYWRlcmZhdWx0ID0gKCpoZWFkZXIpLmhlYWRlcmZhdWx0LmJlZ2luKCk7IGhlYWRlcmZhdWx0ICE9ICgqaGVhZGVyKS5oZWFkZXJmYXVsdC5lbmQoKTsgKytoZWFkZXJmYXVsdCkKKyAgICAgICAgICAgICAgICAgIHsgLy8gVE9ETzogY29tcGxldGUgaGVhZGVyZmF1bHQgcHJvY2Vzc2luZy4gVGhpcyBpcyByYXJlbHkgdXNlZC4KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgLy8gY29sbGVjdCBvdXRwdXQgaGVhZGVycyBhbmQgaGVhZGVyZmF1bHRzCisgICAgICAgICAgICAgIGlmIChleHRfb3V0cHV0KQorICAgICAgICAgICAgICB7IGNvbnN0IHZlY3Rvcjxzb2FwX19oZWFkZXI+ICpzb2FwX19oZWFkZXJfID0gTlVMTDsKKwkJLy8gY2hlY2sgaWYgc29hcCBoZWFkZXIgaXMgaW4gbWltZTptdWx0aXBhcnRSZWxhdGVkCisJICAgICAgICBpZiAoZXh0X291dHB1dC0+bWltZV9fbXVsdGlwYXJ0UmVsYXRlZF8pCisgICAgICAgICAgICAgICAgeyBmb3IgKHZlY3RvcjxtaW1lX19wYXJ0Pjo6Y29uc3RfaXRlcmF0b3IgcGFydCA9IGV4dF9vdXRwdXQtPm1pbWVfX211bHRpcGFydFJlbGF0ZWRfLT5wYXJ0LmJlZ2luKCk7IHBhcnQgIT0gZXh0X291dHB1dC0+bWltZV9fbXVsdGlwYXJ0UmVsYXRlZF8tPnBhcnQuZW5kKCk7ICsrcGFydCkKKyAgICAgICAgICAgICAgICAgIGlmICghKCpwYXJ0KS5zb2FwX19oZWFkZXJfLmVtcHR5KCkpCisgICAgICAgICAgICAgICAgICB7IHNvYXBfX2hlYWRlcl8gPSAmKCpwYXJ0KS5zb2FwX19oZWFkZXJfOworCQkgICAgYnJlYWs7CisJCSAgfQorCQl9CisJCWlmICghc29hcF9faGVhZGVyXykKKwkJICBzb2FwX19oZWFkZXJfID0gJmV4dF9vdXRwdXQtPnNvYXBfX2hlYWRlcl87CisgICAgICAgICAgICAgICAgZm9yICh2ZWN0b3I8c29hcF9faGVhZGVyPjo6Y29uc3RfaXRlcmF0b3IgaGVhZGVyID0gc29hcF9faGVhZGVyXy0+YmVnaW4oKTsgaGVhZGVyICE9IHNvYXBfX2hlYWRlcl8tPmVuZCgpOyArK2hlYWRlcikKKyAgICAgICAgICAgICAgICB7IE1lc3NhZ2UgKmggPSBuZXcgTWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgaC0+bWVzc2FnZSA9ICgqaGVhZGVyKS5tZXNzYWdlUHRyKCk7CisJICAgICAgICAgIGgtPmJvZHlfcGFydHMgPSBOVUxMOworICAgIAkgICAgICAgICAgaC0+cGFydCA9ICgqaGVhZGVyKS5wYXJ0UHRyKCk7CisgICAgCSAgICAgICAgICBoLT5VUkkgPSAoKmhlYWRlcikubmFtZXNwYWNlXzsKKyAgICAJICAgICAgICAgIGlmIChoLT5wYXJ0ICYmIGgtPnBhcnQtPmVsZW1lbnQpCisgICAgCSAgICAgICAgICAgIGgtPm5hbWUgPSB0eXBlcy5hbmFtZShOVUxMLCBOVUxMLCBoLT5wYXJ0LT5lbGVtZW50KTsKKyAgICAJICAgICAgICAgIGVsc2UgaWYgKGgtPlVSSSAmJiBoLT5wYXJ0ICYmIGgtPnBhcnQtPm5hbWUgJiYgaC0+cGFydC0+dHlwZSkKKyAgICAJICAgICAgICAgICAgaC0+bmFtZSA9IHR5cGVzLmFuYW1lKE5VTEwsIGgtPlVSSSwgaC0+cGFydC0+bmFtZSk7CisgICAgCSAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICB7IGZwcmludGYoc3RkZXJyLCAiRXJyb3IgaW4gU09BUCBIZWFkZXIgcGFydCBkZWZpbml0aW9uOiBvdXRwdXQgcGFydCAnJXMnIG1pc3Npbmc/XG4iLCBoLT5wYXJ0ICYmIGgtPnBhcnQtPm5hbWUgPyBoLT5wYXJ0LT5uYW1lIDogIj8iKTsKKyAgICAJICAgICAgICAgICAgaC0+bmFtZSA9ICIiOworICAgIAkgICAgICAgICAgfQorICAgIAkgICAgICAgICAgaC0+ZW5jb2RpbmdTdHlsZSA9ICgqaGVhZGVyKS5lbmNvZGluZ1N0eWxlOworICAgIAkgICAgICAgICAgaC0+dXNlID0gKCpoZWFkZXIpLnVzZTsKKwkJICBoLT5tdWx0aXBhcnRSZWxhdGVkID0gTlVMTDsKKwkJICBoLT5jb250ZW50ID0gTlVMTDsKKwkJICBoLT5sYXlvdXQgPSBOVUxMOworICAgIAkgICAgICAgICAgaC0+ZXh0X2RvY3VtZW50YXRpb24gPSBOVUxMOwkvLyBUT0RPOiBhZGQgZG9jdW1lbnQgY29udGVudAorICAgIAkgICAgICAgICAgaC0+ZG9jdW1lbnRhdGlvbiA9IE5VTEw7CS8vIFRPRE86IGFkZCBkb2N1bWVudCBjb250ZW50CisgICAgCSAgICAgICAgICBzLT5oZWFkZXJbaC0+bmFtZV0gPSBoOworICAgIAkgICAgICAgICAgZm9yICh2ZWN0b3I8c29hcF9faGVhZGVyZmF1bHQ+Ojpjb25zdF9pdGVyYXRvciBoZWFkZXJmYXVsdCA9ICgqaGVhZGVyKS5oZWFkZXJmYXVsdC5iZWdpbigpOyBoZWFkZXJmYXVsdCAhPSAoKmhlYWRlcikuaGVhZGVyZmF1bHQuZW5kKCk7ICsraGVhZGVyZmF1bHQpCisgICAgCSAgICAgICAgICB7IC8vIFRPRE86IGNvbXBsZXRlIGhlYWRlcmZhdWx0IHByb2Nlc3NpbmcuIFRoaXMgaXMgcmFyZWx5IHVzZWQuCisgICAgCSAgICAgICAgICB9CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICB9CisgICAgCSAgICAgIC8vIGNvbGxlY3QgZmF1bHRzCisgICAgICAgICAgICAgIGZvciAodmVjdG9yPHdzZGxfX2V4dF9mYXVsdD46OmNvbnN0X2l0ZXJhdG9yIGV4dF9mYXVsdCA9ICgqb3BlcmF0aW9uKS5mYXVsdC5iZWdpbigpOyBleHRfZmF1bHQgIT0gKCpvcGVyYXRpb24pLmZhdWx0LmVuZCgpOyArK2V4dF9mYXVsdCkKKyAgICAJICAgICAgeyBpZiAoKCpleHRfZmF1bHQpLnNvYXBfX2ZhdWx0XyAmJiAoKmV4dF9mYXVsdCkubWVzc2FnZVB0cigpKQorICAgIAkgICAgICAgIHsgTWVzc2FnZSAqZiA9IG5ldyBNZXNzYWdlKCk7CisgICAgCSAgICAgICAgICBmLT5tZXNzYWdlID0gKCpleHRfZmF1bHQpLm1lc3NhZ2VQdHIoKTsKKwkgICAgICAgICAgZi0+Ym9keV9wYXJ0cyA9IE5VTEw7CisgICAgCSAgICAgICAgICBmLT5wYXJ0ID0gTlVMTDsKKyAgICAJICAgICAgICAgIGYtPmVuY29kaW5nU3R5bGUgPSAoKmV4dF9mYXVsdCkuc29hcF9fZmF1bHRfLT5lbmNvZGluZ1N0eWxlOworICAgIAkgICAgICAgICAgZi0+VVJJID0gKCpleHRfZmF1bHQpLnNvYXBfX2ZhdWx0Xy0+bmFtZXNwYWNlXzsKKyAgICAJICAgICAgICAgIGYtPnVzZSA9ICgqZXh0X2ZhdWx0KS5zb2FwX19mYXVsdF8tPnVzZTsKKwkJICBmLT5tdWx0aXBhcnRSZWxhdGVkID0gTlVMTDsKKwkJICBmLT5jb250ZW50ID0gTlVMTDsKKwkJICBmLT5sYXlvdXQgPSBOVUxMOworICAgIAkgICAgICAgICAgZi0+ZXh0X2RvY3VtZW50YXRpb24gPSAoKmV4dF9mYXVsdCkuZG9jdW1lbnRhdGlvbjsKKyAgICAgICAgICAgICAgICAgIGYtPm5hbWUgPSB0eXBlcy5hbmFtZSgiXyIsIGYtPlVSSSwgZi0+bWVzc2FnZS0+bmFtZSk7CisgICAgCSAgICAgICAgICBmLT5kb2N1bWVudGF0aW9uID0gZi0+bWVzc2FnZS0+ZG9jdW1lbnRhdGlvbjsKKyAgICAJICAgICAgICAgIG8tPmZhdWx0LnB1c2hfYmFjayhmKTsKKyAgICAJICAgICAgICAgIHMtPmZhdWx0W2YtPm5hbWVdID0gZjsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgZWxzZQorICAgIAkgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvcjogbm8gd3NkbDpkZWZpbml0aW9ucy9iaW5kaW5nL29wZXJhdGlvbi9mYXVsdC9zb2FwOmZhdWx0XG4iKTsKKyAgICAJICAgICAgfQorICAgIAkgICAgICBzLT5vcGVyYXRpb24ucHVzaF9iYWNrKG8pOworICAgICAgICAgICAgfQorICAgIAkgICAgZWxzZQorICAgIAkgICAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IG5vIFNPQVAgUlBDIG9wZXJhdGlvbiBuYW1lc3BhY2UsIG9wZXJhdGlvbnMgd2lsbCBiZSBpZ25vcmVkXG4iKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvcjogbm8gd3NkbDpkZWZpbml0aW9ucy9iaW5kaW5nL29wZXJhdGlvbi9pbnB1dC9zb2FwOmJvZHlcbiIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBubyB3c2RsOmRlZmluaXRpb25zL3BvcnRUeXBlL29wZXJhdGlvbi9pbnB1dFxuIik7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3I6IG5vIHdzZGw6ZGVmaW5pdGlvbnMvcG9ydFR5cGUvb3BlcmF0aW9uXG4iKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBEZWZpbml0aW9uczo6Y29tcGlsZShjb25zdCB3c2RsX19kZWZpbml0aW9ucyYgZGVmaW5pdGlvbnMpCit7IC8vIGNvbXBpbGUgdGhlIGRlZmluaXRpb25zIGFuZCBnZW5lcmF0ZSBnU09BUCBoZWFkZXIgZmlsZQorICBjb25zdCBjaGFyICpkZWZzOworICBpZiAoZGVmaW5pdGlvbnMubmFtZSkKKyAgICBkZWZzID0gdHlwZXMuYW5hbWUoTlVMTCwgTlVMTCwgZGVmaW5pdGlvbnMubmFtZSk7CisgIGVsc2UKKyAgICBkZWZzID0gIlNlcnZpY2UiOworICBpZGVudCgpOworICBmcHJpbnRmKHN0cmVhbSwgIi8qIE5PVEU6XG5cbiAtIENvbXBpbGUgdGhpcyBmaWxlIHdpdGggc29hcGNwcDIgdG8gY29tcGxldGUgdGhlIGNvZGUgZ2VuZXJhdGlvbiBwcm9jZXNzLlxuIC0gVXNlIHNvYXBjcHAyIG9wdGlvbiAtSSB0byBzcGVjaWZ5IHBhdGhzIGZvciAjaW1wb3J0XG4gICBUbyBidWlsZCB3aXRoIFNUTCwgJ3N0bHZlY3Rvci5oJyBpcyBpbXBvcnRlZCBmcm9tICdpbXBvcnQnIGRpciBpbiBwYWNrYWdlLlxuIC0gVXNlIHdzZGwyaCBvcHRpb25zIC1jIGFuZCAtcyB0byBnZW5lcmF0ZSBwdXJlIEMgY29kZSBvciBDKysgY29kZSB3aXRob3V0IFNUTC5cbiAtIFVzZSAndHlwZW1hcC5kYXQnIHRvIGNvbnRyb2wgc2NoZW1hIG5hbWVzcGFjZSBiaW5kaW5ncyBhbmQgdHlwZSBtYXBwaW5ncy5cbiAgIEl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGN1c3RvbWl6ZSB0aGUgbmFtZXMgb2YgdGhlIG5hbWVzcGFjZSBwcmVmaXhlc1xuICAgZ2VuZXJhdGVkIGJ5IHdzZGwyaC4gVG8gZG8gc28sIG1vZGlmeSB0aGUgcHJlZml4IGJpbmRpbmdzIGluIHRoZSBOYW1lc3BhY2VzXG4gICBzZWN0aW9uIGJlbG93IGFuZCBhZGQgdGhlIG1vZGlmaWVkIGxpbmVzIHRvICd0eXBlbWFwLmRhdCcgdG8gcmVydW4gd3NkbDJoLlxuIC0gVXNlIERveHlnZW4gKHd3dy5kb3h5Z2VuLm9yZykgdG8gYnJvd3NlIHRoaXMgZmlsZS5cbiAtIFVzZSB3c2RsMmggb3B0aW9uIC1sIHRvIHZpZXcgdGhlIHNvZnR3YXJlIGxpY2Vuc2UgdGVybXMuXG5cbiovXG4iKTsKKyAgYmFubmVyKGRlZmluaXRpb25zLnRhcmdldE5hbWVzcGFjZT9kZWZpbml0aW9ucy50YXJnZXROYW1lc3BhY2U6InRhcmdldE5hbWVzcGFjZSIpOworICAvLyBjb3B5IGRvY3VtZW50YXRpb24gZnJvbSBXU0RMIGRlZmluaXRpb25zCisgIGlmIChkZWZpbml0aW9ucy5kb2N1bWVudGF0aW9uKQorICB7IGZwcmludGYoc3RyZWFtLCAiLyogV1NETCBEb2N1bWVudGF0aW9uOlxuXG4iKTsKKyAgICB0ZXh0KGRlZmluaXRpb25zLmRvY3VtZW50YXRpb24pOworICAgIGZwcmludGYoc3RyZWFtLCAiKi9cblxuIik7CisgIH0KKyAgaWYgKGxmbGFnKQorICB7IGJhbm5lcigiTGljZW5zZSIpOworICAgIGZwcmludGYoc3RyZWFtLCAiLypcbiVzKi9cblxuIiwgbGljZW5zZW5vdGljZSk7CisgIH0KKyAgLy8gZ3NvYXAgY29tcGlsZXIgb3B0aW9uczogJ3cnIGRpc2FibGVzIFdTREwvc2NoZW1hIG91dHB1dCB0byBhdm9pZCBmaWxlIGNvbGxpc2lvbnMKKyAgaWYgKGNmbGFnKQorICAgIGZwcmludGYoc3RyZWFtLCAiLy9nc29hcG9wdCBjd1xuIik7CisgIGVsc2UKKyAgICBmcHJpbnRmKHN0cmVhbSwgIi8vZ3NvYXBvcHQgd1xuIik7CisgIGJhbm5lcigiSW1wb3J0Iik7CisgIGlmIChkZmxhZykKKyAgeyBpZiAoaW1wb3J0X3BhdGgpCisgICAgICBmcHJpbnRmKHN0cmVhbSwgIiNpbXBvcnQgXCIlcy9kb20uaFwiXG4iLCBpbXBvcnRfcGF0aCk7CisgICAgZWxzZQorICAgICAgZnByaW50ZihzdHJlYW0sICIjaW1wb3J0IFwiZG9tLmhcIlxuIik7CisgIH0KKyAgaWYgKCFjZmxhZyAmJiAhc2ZsYWcpCisgIHsgaWYgKGltcG9ydF9wYXRoKQorICAgICAgZnByaW50ZihzdHJlYW0sICIjaW1wb3J0IFwiJXMvc3RsdmVjdG9yLmhcIlxuIiwgaW1wb3J0X3BhdGgpOworICAgIGVsc2UKKyAgICAgIGZwcmludGYoc3RyZWFtLCAiI2ltcG9ydCBcInN0bHZlY3Rvci5oXCJcbiIpOworICB9CisgIGlmIChtZmxhZykKKyAgeyBpZiAoaW1wb3J0X3BhdGgpCisgICAgICBmcHJpbnRmKHN0cmVhbSwgIiNpbXBvcnQgXCIlcy8iLCBpbXBvcnRfcGF0aCk7CisgICAgZWxzZQorICAgICAgZnByaW50ZihzdHJlYW0sICIjaW1wb3J0IFwiIik7CisgICAgZnByaW50ZihzdHJlYW0sICJ4c2QuaFwiXHQvLyBpbXBvcnQgcHJpbWl0aXZlIFhTRCB0eXBlcy5cbiIsIGltcG9ydF9wYXRoKTsKKyAgfQorICBmb3IgKFNldE9mU3RyaW5nOjpjb25zdF9pdGVyYXRvciB1ID0gZXh0dXJpcy5iZWdpbigpOyB1ICE9IGV4dHVyaXMuZW5kKCk7ICsrdSkKKyAgeyBib29sIGZvdW5kID0gZmFsc2U7CisgICAgc2l6ZV90IG4gPSBzdHJsZW4oKnUpOworICAgIGZvciAoU2V0T2ZTdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGkgPSBkZWZpbml0aW9ucy5idWlsdGluVHlwZXMoKS5iZWdpbigpOyBpICE9IGRlZmluaXRpb25zLmJ1aWx0aW5UeXBlcygpLmVuZCgpOyArK2kpCisgICAgeyBpZiAoKippID09ICciJyAmJiAhc3RybmNtcCgqdSwgKmkgKyAxLCBuKSkKKyAgICAgIHsgZm91bmQgPSB0cnVlOworCWJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIWZvdW5kKQorICAgICAgZm9yIChTZXRPZlN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaiA9IGRlZmluaXRpb25zLmJ1aWx0aW5FbGVtZW50cygpLmJlZ2luKCk7IGogIT0gZGVmaW5pdGlvbnMuYnVpbHRpbkVsZW1lbnRzKCkuZW5kKCk7ICsraikKKyAgICAgIHsgaWYgKCoqaiA9PSAnIicgJiYgIXN0cm5jbXAoKnUsICpqICsgMSwgbikpCisgICAgICAgIHsgZm91bmQgPSB0cnVlOworCSAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICBpZiAoIWZvdW5kKQorICAgICAgZm9yIChTZXRPZlN0cmluZzo6Y29uc3RfaXRlcmF0b3IgayA9IGRlZmluaXRpb25zLmJ1aWx0aW5BdHRyaWJ1dGVzKCkuYmVnaW4oKTsgayAhPSBkZWZpbml0aW9ucy5idWlsdGluQXR0cmlidXRlcygpLmVuZCgpOyArK2spCisgICAgICB7IGlmICgqKmsgPT0gJyInICYmICFzdHJuY21wKCp1LCAqayArIDEsIG4pKQorICAgICAgICB7IGZvdW5kID0gdHJ1ZTsKKwkgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgaWYgKGZvdW5kKQorICAgIHsgaWYgKGltcG9ydF9wYXRoKQorICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIiNpbXBvcnQgXCIlcy8lcy5oXCJcdC8vICVzID0gPCVzPlxuIiwgaW1wb3J0X3BhdGgsIHR5cGVzLm5zcHJlZml4KE5VTEwsICp1KSwgdHlwZXMubnNwcmVmaXgoTlVMTCwgKnUpLCAqdSk7CisgICAgICBlbHNlCisgICAgICAgIGZwcmludGYoc3RyZWFtLCAiI2ltcG9ydCBcIiVzLmhcIlx0Ly8gJXMgPSA8JXM+XG4iLCB0eXBlcy5uc3ByZWZpeChOVUxMLCAqdSksIHR5cGVzLm5zcHJlZml4KE5VTEwsICp1KSwgKnUpOworICAgIH0KKyAgfQorICBiYW5uZXIoIlNjaGVtYSBOYW1lc3BhY2VzIik7CisgIC8vIGRldGVybWluZSBpZiB3ZSBtdXN0IHVzZSBTT0FQIDEuMiwgdGhpcyBpcyBhIGJpdCBvZiBhIGhhY2sgZHVlIHRvIHRoZSBsYWNrIG9mIFdTREwxLjEvU09BUDEuMiBzdXBwb3J0IGFuZCBiZXR0ZXIgYWx0ZXJuYXRpdmVzCisgIGZvciAoTmFtZXNwYWNlICpwID0gZGVmaW5pdGlvbnMuc29hcC0+bG9jYWxfbmFtZXNwYWNlczsgcCAmJiBwLT5pZDsgcCsrKQorICB7IC8vIHAtPm91dCBpcyBzZXQgdG8gdGhlIGFjdHVhbCBuYW1lc3BhY2UgbmFtZSB0aGF0IG1hdGNoZXMgdGhlIHAtPmluIHBhdHRlcm4KKyAgICBpZiAocC0+b3V0ICYmICFzdHJjbXAocC0+aWQsICJzb2FwIikgJiYgIXN0cmNtcChwLT5vdXQsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAxMi8iKSkKKyAgICB7IGZwcmludGYoc3RyZWFtLCAiLy8gVGhpcyBzZXJ2aWNlIHVzZXMgU09BUCAxLjIgbmFtZXNwYWNlczpcbiIpOworICAgICAgZnByaW50ZihzdHJlYW0sIHNjaGVtYWZvcm1hdCwgIlNPQVAtRU5WIiwgIm5hbWVzcGFjZSIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiKTsKKyAgICAgIGZwcmludGYoc3RyZWFtLCBzY2hlbWFmb3JtYXQsICJTT0FQLUVOQyIsICJuYW1lc3BhY2UiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVuY29kaW5nIik7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKGRlZmluaXRpb25zLnR5cGVzKQorICB7IGZwcmludGYoc3RyZWFtLCAiXG4vKiBOT1RFOlxuXG5JdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBjdXN0b21pemUgdGhlIG5hbWVzIG9mIHRoZSBuYW1lc3BhY2UgcHJlZml4ZXNcbmdlbmVyYXRlZCBieSB3c2RsMmguIFRvIGRvIHNvLCBtb2RpZnkgdGhlIHByZWZpeCBiaW5kaW5ncyBiZWxvdyBhbmQgYWRkIHRoZVxubW9kaWZpZWQgbGluZXMgdG8gdHlwZW1hcC5kYXQgdG8gcmVydW4gd3NkbDJoOlxuXG4iKTsKKyAgICBpZiAoZGVmaW5pdGlvbnMudGFyZ2V0TmFtZXNwYWNlICYmICpkZWZpbml0aW9ucy50YXJnZXROYW1lc3BhY2UpCisgICAgICBmcHJpbnRmKHN0cmVhbSwgIiVzID0gXCIlc1wiXG4iLCB0eXBlcy5uc3ByZWZpeChzZXJ2aWNlX3ByZWZpeCwgZGVmaW5pdGlvbnMudGFyZ2V0TmFtZXNwYWNlKSwgZGVmaW5pdGlvbnMudGFyZ2V0TmFtZXNwYWNlKTsKKyAgICBmb3IgKHZlY3Rvcjx4c19fc2NoZW1hKj46OmNvbnN0X2l0ZXJhdG9yIHNjaGVtYTEgPSBkZWZpbml0aW9ucy50eXBlcy0+eHNfX3NjaGVtYV8uYmVnaW4oKTsgc2NoZW1hMSAhPSBkZWZpbml0aW9ucy50eXBlcy0+eHNfX3NjaGVtYV8uZW5kKCk7ICsrc2NoZW1hMSkKKyAgICAgIGlmICghZGVmaW5pdGlvbnMudGFyZ2V0TmFtZXNwYWNlIHx8IHN0cmNtcCgoKnNjaGVtYTEpLT50YXJnZXROYW1lc3BhY2UsIGRlZmluaXRpb25zLnRhcmdldE5hbWVzcGFjZSkpCisgICAgICAgIGZwcmludGYoc3RyZWFtLCAiJXMgPSBcIiVzXCJcbiIsIHR5cGVzLm5zcHJlZml4KE5VTEwsICgqc2NoZW1hMSktPnRhcmdldE5hbWVzcGFjZSksICgqc2NoZW1hMSktPnRhcmdldE5hbWVzcGFjZSk7CisgICAgZnByaW50ZihzdHJlYW0sICJcbiovXG5cbiIpOworICAgIGZvciAodmVjdG9yPHhzX19zY2hlbWEqPjo6Y29uc3RfaXRlcmF0b3Igc2NoZW1hMiA9IGRlZmluaXRpb25zLnR5cGVzLT54c19fc2NoZW1hXy5iZWdpbigpOyBzY2hlbWEyICE9IGRlZmluaXRpb25zLnR5cGVzLT54c19fc2NoZW1hXy5lbmQoKTsgKytzY2hlbWEyKQorICAgICAgZnByaW50ZihzdHJlYW0sIHNjaGVtYWZvcm1hdCwgdHlwZXMubnNwcmVmaXgoTlVMTCwgKCpzY2hlbWEyKS0+dGFyZ2V0TmFtZXNwYWNlKSwgIm5hbWVzcGFjZSIsICgqc2NoZW1hMiktPnRhcmdldE5hbWVzcGFjZSk7CisgICAgZm9yICh2ZWN0b3I8eHNfX3NjaGVtYSo+Ojpjb25zdF9pdGVyYXRvciBzY2hlbWEzID0gZGVmaW5pdGlvbnMudHlwZXMtPnhzX19zY2hlbWFfLmJlZ2luKCk7IHNjaGVtYTMgIT0gZGVmaW5pdGlvbnMudHlwZXMtPnhzX19zY2hlbWFfLmVuZCgpOyArK3NjaGVtYTMpCisgICAgeyBpZiAoKCpzY2hlbWEzKS0+ZWxlbWVudEZvcm1EZWZhdWx0ID09ICgqc2NoZW1hMyktPmF0dHJpYnV0ZUZvcm1EZWZhdWx0KQorICAgICAgICBmcHJpbnRmKHN0cmVhbSwgc2NoZW1hZm9ybWF0LCB0eXBlcy5uc3ByZWZpeChOVUxMLCAoKnNjaGVtYTMpLT50YXJnZXROYW1lc3BhY2UpLCAiZm9ybSIsICgqc2NoZW1hMyktPmVsZW1lbnRGb3JtRGVmYXVsdCA9PSBxdWFsaWZpZWQgPyAicXVhbGlmaWVkIiA6ICJ1bnF1YWxpZmllZCIpOworICAgICAgZWxzZQorICAgICAgeyBmcHJpbnRmKHN0cmVhbSwgc2NoZW1hZm9ybWF0LCB0eXBlcy5uc3ByZWZpeChOVUxMLCAoKnNjaGVtYTMpLT50YXJnZXROYW1lc3BhY2UpLCAiZWxlbWVudEZvcm0iLCAoKnNjaGVtYTMpLT5lbGVtZW50Rm9ybURlZmF1bHQgPT0gcXVhbGlmaWVkID8gInF1YWxpZmllZCIgOiAidW5xdWFsaWZpZWQiKTsKKyAgICAgICAgZnByaW50ZihzdHJlYW0sIHNjaGVtYWZvcm1hdCwgdHlwZXMubnNwcmVmaXgoTlVMTCwgKCpzY2hlbWEzKS0+dGFyZ2V0TmFtZXNwYWNlKSwgImF0dHJpYnV0ZUZvcm0iLCAoKnNjaGVtYTMpLT5hdHRyaWJ1dGVGb3JtRGVmYXVsdCA9PSBxdWFsaWZpZWQgPyAicXVhbGlmaWVkIiA6ICJ1bnF1YWxpZmllZCIpOworICAgICAgfQorICAgIH0KKyAgfQorICBiYW5uZXIoIlNjaGVtYSBUeXBlcyIpOworICAvLyBnZW5lcmF0ZSB0aGUgcHJvdG90eXBlcyBmaXJzdDogdGhlc2Ugc2hvdWxkIGFsbG93IHVzZSBiZWZvcmUgZGVmLCBlLmcuIGNsYXNzIG5hbWVzIHRoZW4gZ2VuZXJhdGUgdGhlIGRlZnMKKyAgLy8gY2hlY2sgaWYgeHNkOmFueVR5cGUgaXMgdXNlZAorICBpZiAoIWNmbGFnICYmICFwZmxhZykKKyAgeyBmb3IgKFNldE9mU3RyaW5nOjpjb25zdF9pdGVyYXRvciBpID0gZGVmaW5pdGlvbnMuYnVpbHRpblR5cGVzKCkuYmVnaW4oKTsgaSAhPSBkZWZpbml0aW9ucy5idWlsdGluVHlwZXMoKS5lbmQoKTsgKytpKQorICAgIHsgaWYgKCFjZmxhZyAmJiAhc3RyY21wKCppLCAieHM6YW55VHlwZSIpKQorICAgICAgeyBwZmxhZyA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICAvLyBkZWZpbmUgeHNkOmFueVR5cGUgZmlyc3QsIGlmIHVzZWQKKyAgaWYgKCFjZmxhZyAmJiBwZmxhZykKKyAgeyBjb25zdCBjaGFyICpzLCAqdDsKKyAgICB0ID0gdHlwZXMuY25hbWUoTlVMTCwgTlVMTCwgInhzOmFueVR5cGUiKTsKKyAgICBzID0gdHlwZXMuZGVmdHlwZW1hcFt0XTsKKyAgICBpZiAocykKKyAgICB7IGlmICgqcykKKyAgICAgIHsgaWYgKCFtZmxhZykKKyAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIiVzXG4iLCBzKTsKKyAgICAgIH0KKyAgICAgIHMgPSB0eXBlcy51c2V0eXBlbWFwW3RdOworICAgICAgaWYgKHMpCisgICAgICB7IGlmIChtZmxhZykKKyAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIi8vICB4c2QuaCBtdXN0IGRlZmluZSB0eXBlOiAlc1xuIiwgcyk7CisgICAgICAgIHR5cGVzLmtuYW1lcy5pbnNlcnQocyk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7IGZwcmludGYoc3RkZXJyLCAiRXJyb3I6IG5vIHhzZF9fYW55VHlwZSBkZWZpbmVkIGluIHR5cGUgbWFwXG4iKTsKKyAgICAgIHBmbGFnID0gMDsKKyAgICB9CisgIH0KKyAgLy8gcHJvZHVjZSBidWlsdC1pbiBwcmltaXRpdmUgdHlwZXMsIGxpbWl0ZWQgdG8gdGhlIG9uZXMgdGhhdCBhcmUgdXNlZCBvbmx5CisgIGZvciAoU2V0T2ZTdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGkgPSBkZWZpbml0aW9ucy5idWlsdGluVHlwZXMoKS5iZWdpbigpOyBpICE9IGRlZmluaXRpb25zLmJ1aWx0aW5UeXBlcygpLmVuZCgpOyArK2kpCisgIHsgY29uc3QgY2hhciAqcywgKnQ7CisgICAgaWYgKCFjZmxhZyAmJiBwZmxhZyAmJiAhc3RyY21wKCppLCAieHM6YW55VHlwZSIpKQorICAgICAgY29udGludWU7CisgICAgdCA9IHR5cGVzLmNuYW1lKE5VTEwsIE5VTEwsICppKTsKKyAgICBzID0gdHlwZXMuZGVmdHlwZW1hcFt0XTsKKyAgICBpZiAocykKKyAgICB7IGlmICgqcykKKyAgICAgIHsgaWYgKCoqaSA9PSAnIicpCisJICBmcHJpbnRmKHN0cmVhbSwgIlxuLy8vIEltcG9ydGVkIHR5cGUgJXMgZnJvbSB0eXBlbWFwICVzLlxuIiwgKmksIG1hcGZpbGU/bWFwZmlsZToiIik7CisgICAgICAgIGVsc2UKKwkgIGZwcmludGYoc3RyZWFtLCAiXG4vLy8gQnVpbHQtaW4gdHlwZSBcIiVzXCIuXG4iLCAqaSk7CisJaWYgKG1mbGFnKQorICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiLy8gIChkZWNsYXJhdGlvbiByZW1vdmVkIGJ5IG9wdGlvbiAtbSkgIik7CisgICAgICAgIHR5cGVzLmZvcm1hdChzKTsKKyAgICAgIH0KKyAgICAgIHMgPSB0eXBlcy51c2V0eXBlbWFwW3RdOworICAgICAgaWYgKHMgJiYgKnMpCisgICAgICB7IGlmIChtZmxhZyAmJiAqKmkgIT0gJyInKQorICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiXG4vLyAgeHNkLmggbXVzdCBkZWZpbmUgdHlwZTogJXNcbiIsIHMpOworICAgICAgICBpZiAodHlwZXMua25hbWVzLmZpbmQocykgPT0gdHlwZXMua25hbWVzLmVuZCgpKQorICAgICAgICAgIHR5cGVzLmtuYW1lcy5pbnNlcnQocyk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7IHMgPSB0eXBlcy50bmFtZShOVUxMLCBOVUxMLCAieHNkOnN0cmluZyIpOworICAgICAgaWYgKCFtZmxhZykKKyAgICAgIHsgaWYgKCoqaSA9PSAnIicpCisgICAgICAgICAgZnByaW50ZihzdHJlYW0sICJcbi8vIEltcG9ydGVkIHR5cGUgJXMgZGVmaW5lZCBieSAlc1xuIiwgKmksIHQpOworICAgICAgICBlbHNlCisgICAgICAgIHsgZnByaW50ZihzdHJlYW0sICJcbi8vLyBQcmltaXRpdmUgYnVpbHQtaW4gdHlwZSBcIiVzXCJcbiIsICppKTsKKyAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgInR5cGVkZWYgJXMgJXM7XG4iLCBzLCB0KTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSBpZiAoKippID09ICciJykKKyAgICAgICAgZnByaW50ZihzdHJlYW0sICJcbi8vICBJbXBvcnRlZCB0eXBlICVzIGRlZmluZWQgYnkgJXNcbiIsICppLCB0KTsKKyAgICAgIGVsc2UKKyAgICAgICAgZnByaW50ZihzdHJlYW0sICJcbi8vICB4c2QuaCBtdXN0IGRlZmluZSB0eXBlOiAlc1xuIiwgdCk7CisgICAgICB0eXBlcy5kZWZ0bmFtZShUWVBFREVGLCBOVUxMLCBzdHJjaHIocywgJyonKSAhPSBOVUxMLCBOVUxMLCBOVUxMLCAqaSk7CisgICAgfQorICAgIGlmIChwZmxhZyAmJiAhc3RybmNtcCgqaSwgInhzOiIsIDMpKQkJLy8gb25seSB4c2kgdHlwZXMgYXJlIHBvbHltb3JwaAorICAgIHsgcyA9IHR5cGVzLmFuYW1lKE5VTEwsIE5VTEwsICppKTsKKyAgICAgIGlmICghbWZsYWcpCisgICAgICB7IGZwcmludGYoc3RyZWFtLCAiXG4vLy8gQ2xhc3Mgd3JhcHBlciBmb3IgYnVpbHQtaW4gdHlwZSBcIiVzXCIgZGVyaXZlZCBmcm9tIHhzZF9fYW55VHlwZVxuIiwgKmkpOworICAgICAgICBmcHJpbnRmKHN0cmVhbSwgImNsYXNzICVzIDogcHVibGljIHhzZF9fYW55VHlwZVxueyBwdWJsaWM6XG4iLCBzKTsKKyAgICAgICAgZnByaW50ZihzdHJlYW0sIGVsZW1lbnRmb3JtYXQsIHR5cGVzLnRuYW1lKE5VTEwsIE5VTEwsICppKSwgIl9faXRlbTsiKTsKKyAgICAgICAgZnByaW50ZihzdHJlYW0sICJcbn07XG4iKTsKKyAgICAgIH0KKyAgICAgIHR5cGVzLmtuYW1lcy5pbnNlcnQocyk7CisgICAgfQorICB9CisgIC8vIHByb2R1Y2UgYnVpbHQtaW4gcHJpbWl0aXZlIGVsZW1lbnRzLCBsaW1pdGVkIHRvIHRoZSBvbmVzIHRoYXQgYXJlIHVzZWQgb25seQorICBmb3IgKFNldE9mU3RyaW5nOjpjb25zdF9pdGVyYXRvciBqID0gZGVmaW5pdGlvbnMuYnVpbHRpbkVsZW1lbnRzKCkuYmVnaW4oKTsgaiAhPSBkZWZpbml0aW9ucy5idWlsdGluRWxlbWVudHMoKS5lbmQoKTsgKytqKQorICB7IGNvbnN0IGNoYXIgKnMsICp0OworICAgIHQgPSB0eXBlcy5jbmFtZSgiXyIsIE5VTEwsICpqKTsKKyAgICBzID0gdHlwZXMuZGVmdHlwZW1hcFt0XTsKKyAgICBpZiAocykKKyAgICB7IGlmICgqcykKKyAgICAgIHsgaWYgKCoqaiA9PSAnIicpCisJICBmcHJpbnRmKHN0cmVhbSwgIlxuLy8vIEltcG9ydGVkIGVsZW1lbnQgJXMgZnJvbSB0eXBlbWFwICVzLlxuIiwgKmosIG1hcGZpbGU/bWFwZmlsZToiIik7CisgICAgICAgIGVsc2UKKwkgIGZwcmludGYoc3RyZWFtLCAiXG4vLy8gQnVpbHQtaW4gZWxlbWVudCBcIiVzXCIuXG4iLCAqaik7CisJaWYgKG1mbGFnKQorICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiLy8gIChkZWNsYXJhdGlvbiByZW1vdmVkIGJ5IG9wdGlvbiAtbSkgIik7CisgICAgICAgIHR5cGVzLmZvcm1hdChzKTsKKyAgICAgIH0KKyAgICAgIHMgPSB0eXBlcy51c2V0eXBlbWFwW3RdOworICAgICAgaWYgKHMgJiYgKnMpCisgICAgICB7IGlmIChtZmxhZyAmJiAqKmogIT0gJyInKQorICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiXG4vLyAgeHNkLmggbXVzdCBkZWZpbmUgZWxlbWVudDogJXNcbiIsIHMpOworICAgICAgICBpZiAodHlwZXMua25hbWVzLmZpbmQocykgPT0gdHlwZXMua25hbWVzLmVuZCgpKQorICAgICAgICAgIHR5cGVzLmtuYW1lcy5pbnNlcnQocyk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7IGlmICghbWZsYWcpCisgICAgICB7IGlmICgqKmogPT0gJyInKQorCSAgZnByaW50ZihzdHJlYW0sICJcbi8vIEltcG9ydGVkIGVsZW1lbnQgJXMgZGVjbGFyZWQgYXMgJXNcbiIsICpqLCB0KTsKKyAgICAgICAgZWxzZQorCXsgZnByaW50ZihzdHJlYW0sICJcbi8vLyBCdWlsdC1pbiBlbGVtZW50IFwiJXNcIi5cbiIsICpqKTsKKyAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgInR5cGVkZWYgX1hNTCAlcztcbiIsIHQpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmICgqKmogPT0gJyInKQorCWZwcmludGYoc3RyZWFtLCAiXG4vLyAgSW1wb3J0ZWQgZWxlbWVudCAlcyBkZWNsYXJlZCBhcyAlc1xuIiwgKmosIHQpOworICAgICAgZWxzZQorICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIlxuLy8gIHhzZC5oIG11c3QgZGVmaW5lIGVsZW1lbnQ6ICVzXG4iLCB0KTsKKyAgICAgIHR5cGVzLmRlZnRuYW1lKFRZUEVERUYsIE5VTEwsIHRydWUsIE5VTEwsIE5VTEwsICpqKTsJLy8gYWxyZWFkeSBwb2ludGVyCisgICAgfQorICB9CisgIC8vIHByb2R1Y2UgYnVpbHQtaW4gcHJpbWl0aXZlIGF0dHJpYnV0ZXMsIGxpbWl0ZWQgdG8gdGhlIG9uZXMgdGhhdCBhcmUgdXNlZCBvbmx5CisgIGZvciAoU2V0T2ZTdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGsgPSBkZWZpbml0aW9ucy5idWlsdGluQXR0cmlidXRlcygpLmJlZ2luKCk7IGsgIT0gZGVmaW5pdGlvbnMuYnVpbHRpbkF0dHJpYnV0ZXMoKS5lbmQoKTsgKytrKQorICB7IGNvbnN0IGNoYXIgKnMsICp0OworICAgIHQgPSB0eXBlcy5jbmFtZSgiXyIsIE5VTEwsICprKTsKKyAgICBzID0gdHlwZXMuZGVmdHlwZW1hcFt0XTsKKyAgICBpZiAocykKKyAgICB7IGlmICgqcykKKyAgICAgIHsgaWYgKCoqayA9PSAnIicpCisJICBmcHJpbnRmKHN0cmVhbSwgIlxuLy8vIEltcG9ydGVkIGF0dHJpYnV0ZSAlcyBmcm9tIHR5cGVtYXAgJXMuXG4iLCAqaywgbWFwZmlsZT9tYXBmaWxlOiIiKTsKKyAgICAgICAgZWxzZQorCSAgZnByaW50ZihzdHJlYW0sICJcbi8vLyBCdWlsdC1pbiBhdHRyaWJ1dGUgXCIlc1wiLlxuIiwgKmspOworCWlmIChtZmxhZykKKyAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIi8vICAoZGVjbGFyYXRpb24gcmVtb3ZlZCBieSBvcHRpb24gLW0pICIpOworICAgICAgICB0eXBlcy5mb3JtYXQocyk7CisgICAgICB9CisgICAgICBzID0gdHlwZXMudXNldHlwZW1hcFt0XTsKKyAgICAgIGlmIChzICYmICpzKQorICAgICAgeyBpZiAobWZsYWcgJiYgKiprICE9ICciJykKKyAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIlxuLy8gIHhzZC5oIG11c3QgZGVmaW5lIGF0dHJpYnV0ZTogJXNcbiIsIHMpOworICAgICAgICBpZiAodHlwZXMua25hbWVzLmZpbmQocykgPT0gdHlwZXMua25hbWVzLmVuZCgpKQorICAgICAgICAgIHR5cGVzLmtuYW1lcy5pbnNlcnQocyk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7IHMgPSB0eXBlcy50bmFtZShOVUxMLCBOVUxMLCAieHNkOnN0cmluZyIpOworICAgICAgaWYgKCFtZmxhZykKKyAgICAgIHsgaWYgKCoqayA9PSAnIicpCisgICAgICAgICAgZnByaW50ZihzdHJlYW0sICJcbi8vIEltcG9ydGVkIGF0dHJpYnV0ZSAlcyBkZWNsYXJlZCBhcyAlc1xuIiwgKmssIHQpOworICAgICAgICBlbHNlCisgICAgICAgIHsgZnByaW50ZihzdHJlYW0sICJcbi8vLyBCdWlsdC1pbiBhdHRyaWJ1dGUgXCIlc1wiLlxuIiwgKmspOworICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAidHlwZWRlZiAlcyAlcztcbiIsIHMsIHQpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmICgqKmsgPT0gJyInKQorICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIi8vICBJbXBvcnRlZCBhdHRyaWJ1dGUgJXMgZGVjbGFyZWQgYXMgJXNcbiIsICprLCB0KTsKKyAgICAgIGVsc2UKKyAgICAgICAgZnByaW50ZihzdHJlYW0sICIvLyAgeHNkLmggbXVzdCBkZWZpbmUgYXR0cmlidXRlOiAlc1xuIiwgdCk7CisgICAgICB0eXBlcy5kZWZ0bmFtZShUWVBFREVGLCBOVUxMLCBzdHJjaHIocywgJyonKSAhPSBOVUxMLCBOVUxMLCBOVUxMLCAqayk7CisgICAgfQorICB9CisgIC8vIHByb2R1Y2UgdHlwZXMKKyAgLy8gZGVmaW5lIGNsYXNzL3N0cnVjdCB0eXBlcyBmaXJzdAorICBpZiAoZGVmaW5pdGlvbnMudHlwZXMpCisgIHsgY29tbWVudCgiRGVmaW5pdGlvbnMiLCBkZWZzLCAidHlwZXMiLCBkZWZpbml0aW9ucy50eXBlcy0+ZG9jdW1lbnRhdGlvbik7CisgICAgZnByaW50ZihzdHJlYW0sICJcbiIpOworICAgIGZvciAodmVjdG9yPHhzX19zY2hlbWEqPjo6Y29uc3RfaXRlcmF0b3Igc2NoZW1hNCA9IGRlZmluaXRpb25zLnR5cGVzLT54c19fc2NoZW1hXy5iZWdpbigpOyBzY2hlbWE0ICE9IGRlZmluaXRpb25zLnR5cGVzLT54c19fc2NoZW1hXy5lbmQoKTsgKytzY2hlbWE0KQorICAgIHsgZm9yICh2ZWN0b3I8eHNfX2NvbXBsZXhUeXBlPjo6Y29uc3RfaXRlcmF0b3IgY29tcGxleFR5cGUgPSAoKnNjaGVtYTQpLT5jb21wbGV4VHlwZS5iZWdpbigpOyBjb21wbGV4VHlwZSAhPSAoKnNjaGVtYTQpLT5jb21wbGV4VHlwZS5lbmQoKTsgKytjb21wbGV4VHlwZSkKKyAgICAgICAgdHlwZXMuZGVmaW5lKCgqc2NoZW1hNCktPnRhcmdldE5hbWVzcGFjZSwgTlVMTCwgKmNvbXBsZXhUeXBlKTsKKyAgICAgIGZvciAodmVjdG9yPHhzX19lbGVtZW50Pjo6Y29uc3RfaXRlcmF0b3IgZWxlbWVudCA9ICgqc2NoZW1hNCktPmVsZW1lbnQuYmVnaW4oKTsgZWxlbWVudCAhPSAoKnNjaGVtYTQpLT5lbGVtZW50LmVuZCgpOyArK2VsZW1lbnQpCisgICAgICB7IGlmICghKCplbGVtZW50KS50eXBlKQorICAgICAgICB7IGlmICgoKmVsZW1lbnQpLmNvbXBsZXhUeXBlUHRyKCkpCisgICAgICAgICAgICB0eXBlcy5kZWZpbmUoKCpzY2hlbWE0KS0+dGFyZ2V0TmFtZXNwYWNlLCAoKmVsZW1lbnQpLm5hbWUsICooKmVsZW1lbnQpLmNvbXBsZXhUeXBlUHRyKCkpOworCSAgZWxzZQorICAgICAgICAgIHsgZnByaW50ZihzdHJlYW0sICJcbi8vLyBFbGVtZW50IFwiJXNcIjolcy5cbiIsICgqc2NoZW1hNCktPnRhcmdldE5hbWVzcGFjZSwgKCplbGVtZW50KS5uYW1lKTsKKyAgICAgICAgICAgIGlmIChnZmxhZykKKwkgICAgeyBjb25zdCBjaGFyICp0ID0gdHlwZXMuZGVmdG5hbWUoVFlQRURFRiwgTlVMTCwgZmFsc2UsICJfIiwgKCpzY2hlbWE0KS0+dGFyZ2V0TmFtZXNwYWNlLCAoKmVsZW1lbnQpLm5hbWUpOworICAJICAgICAgZnByaW50ZihzdHJlYW0sICJ0eXBlZGVmIF9YTUwgJXM7XG4iLCB0KTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsgY29uc3QgY2hhciAqcyA9IHR5cGVzLmNuYW1lKCJfIiwgKCpzY2hlbWE0KS0+dGFyZ2V0TmFtZXNwYWNlLCAoKmVsZW1lbnQpLm5hbWUpOworICAgICAgICAgICAgICB0eXBlcy5wdHJ0eXBlbWFwW3NdID0gdHlwZXMudXNldHlwZW1hcFtzXSA9ICJfWE1MIjsKKwkgICAgICBmcHJpbnRmKHN0cmVhbSwgIi8vLyBOb3RlOiB1c2Ugd3NkbDJoIG9wdGlvbiAtZyB0byBnZW5lcmF0ZSB0aGlzIGdsb2JhbCBlbGVtZW50IGRlY2xhcmF0aW9uLlxuIik7CisJICAgIH0KKwkgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0gIAorICAgIC8vIHZpc2l0IHR5cGVzIHdpdGggbG93ZXN0IGJhc2UgbGV2ZWwgZmlyc3QKKyAgICBpbnQgYmFzZUxldmVsID0gMTsKKyAgICBib29sIGZvdW5kOworICAgIGRvCisgICAgeyBmb3VuZCA9IChiYXNlTGV2ZWwgPT0gMSk7CisgICAgICBmb3IgKHZlY3Rvcjx4c19fc2NoZW1hKj46Oml0ZXJhdG9yIHNjaGVtYSA9IGRlZmluaXRpb25zLnR5cGVzLT54c19fc2NoZW1hXy5iZWdpbigpOyBzY2hlbWEgIT0gZGVmaW5pdGlvbnMudHlwZXMtPnhzX19zY2hlbWFfLmVuZCgpOyArK3NjaGVtYSkKKyAgICAgIHsgZm9yICh2ZWN0b3I8eHNfX3NpbXBsZVR5cGU+OjppdGVyYXRvciBzaW1wbGVUeXBlID0gKCpzY2hlbWEpLT5zaW1wbGVUeXBlLmJlZ2luKCk7IHNpbXBsZVR5cGUgIT0gKCpzY2hlbWEpLT5zaW1wbGVUeXBlLmVuZCgpOyArK3NpbXBsZVR5cGUpCisgICAgICAgIHsgaWYgKCgqc2ltcGxlVHlwZSkuYmFzZUxldmVsKCkgPT0gYmFzZUxldmVsKQorICAgICAgICAgIHsgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgdHlwZXMuZ2VuKCgqc2NoZW1hKS0+dGFyZ2V0TmFtZXNwYWNlLCBOVUxMLCAqc2ltcGxlVHlwZSwgZmFsc2UpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKHZlY3Rvcjx4c19fZWxlbWVudD46Oml0ZXJhdG9yIGVsZW1lbnQgPSAoKnNjaGVtYSktPmVsZW1lbnQuYmVnaW4oKTsgZWxlbWVudCAhPSAoKnNjaGVtYSktPmVsZW1lbnQuZW5kKCk7ICsrZWxlbWVudCkKKyAgICAgICAgeyBpZiAoISgqZWxlbWVudCkudHlwZSAmJiAoKmVsZW1lbnQpLnNpbXBsZVR5cGVQdHIoKSAmJiAoKmVsZW1lbnQpLnNpbXBsZVR5cGVQdHIoKS0+YmFzZUxldmVsKCkgPT0gYmFzZUxldmVsKQorICAgICAgICAgIHsgZm91bmQgPSB0cnVlOworCSAgICBpZiAoKCplbGVtZW50KS50eXBlKQorCSAgICAgIGZwcmludGYoc3RyZWFtLCAiLy8vIEVsZW1lbnQgXCIlc1wiOiVzIG9mIHNpbXBsZVR5cGUgJXMuXG4iLCAoKnNjaGVtYSktPnRhcmdldE5hbWVzcGFjZSwgKCplbGVtZW50KS5uYW1lLCAoKmVsZW1lbnQpLnR5cGUpOworCSAgICB0eXBlcy5kb2N1bWVudCgoKmVsZW1lbnQpLmFubm90YXRpb24pOworICAgICAgICAgICAgdHlwZXMuZ2VuKCgqc2NoZW1hKS0+dGFyZ2V0TmFtZXNwYWNlLCAoKmVsZW1lbnQpLm5hbWUsICooKmVsZW1lbnQpLnNpbXBsZVR5cGVQdHIoKSwgZmFsc2UpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoISgqZWxlbWVudCkudHlwZSAmJiAoKmVsZW1lbnQpLmNvbXBsZXhUeXBlUHRyKCkgJiYgKCplbGVtZW50KS5jb21wbGV4VHlwZVB0cigpLT5iYXNlTGV2ZWwoKSA9PSBiYXNlTGV2ZWwpCisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZm9yICh2ZWN0b3I8eHNfX2F0dHJpYnV0ZT46OmNvbnN0X2l0ZXJhdG9yIGF0dHJpYnV0ZSA9ICgqc2NoZW1hKS0+YXR0cmlidXRlLmJlZ2luKCk7IGF0dHJpYnV0ZSAhPSAoKnNjaGVtYSktPmF0dHJpYnV0ZS5lbmQoKTsgKythdHRyaWJ1dGUpCisgICAgICAgIHsgaWYgKCEoKmF0dHJpYnV0ZSkudHlwZSAmJiAoKmF0dHJpYnV0ZSkuc2ltcGxlVHlwZVB0cigpICYmICgqYXR0cmlidXRlKS5zaW1wbGVUeXBlUHRyKCktPmJhc2VMZXZlbCgpID09IGJhc2VMZXZlbCkKKyAgICAgICAgICB7IGZvdW5kID0gdHJ1ZTsKKwkgICAgaWYgKCgqYXR0cmlidXRlKS50eXBlKQorCSAgICAgIGZwcmludGYoc3RyZWFtLCAiLy8vIEF0dHJpYnV0ZSBcIiVzXCI6JXMgb2Ygc2ltcGxlVHlwZSAlcy5cbiIsICgqc2NoZW1hKS0+dGFyZ2V0TmFtZXNwYWNlLCAoKmF0dHJpYnV0ZSkubmFtZSwgKCphdHRyaWJ1dGUpLnR5cGUpOworCSAgICB0eXBlcy5kb2N1bWVudCgoKmF0dHJpYnV0ZSkuYW5ub3RhdGlvbik7CisgICAgICAgICAgICB0eXBlcy5nZW4oKCpzY2hlbWEpLT50YXJnZXROYW1lc3BhY2UsICgqYXR0cmlidXRlKS5uYW1lLCAqKCphdHRyaWJ1dGUpLnNpbXBsZVR5cGVQdHIoKSwgZmFsc2UpOyAvLyBVUkkgPSBOVUxMIHdvbid0IGdlbmVyYXRlIHR5cGUgaW4gc2NoZW1hICh0eXBlIHdpdGhvdXQgbmFtZXNwYWNlIHF1YWxpZmllcikKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yICh2ZWN0b3I8eHNfX2NvbXBsZXhUeXBlPjo6aXRlcmF0b3IgY29tcGxleFR5cGUgPSAoKnNjaGVtYSktPmNvbXBsZXhUeXBlLmJlZ2luKCk7IGNvbXBsZXhUeXBlICE9ICgqc2NoZW1hKS0+Y29tcGxleFR5cGUuZW5kKCk7ICsrY29tcGxleFR5cGUpCisgICAgICAgIHsgaWYgKCgqY29tcGxleFR5cGUpLmJhc2VMZXZlbCgpID09IGJhc2VMZXZlbCkKKyAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgKytiYXNlTGV2ZWw7CisgICAgfSB3aGlsZSAoZm91bmQpOworICAgIC8vIGdlbmVyYXRlIGNvbXBsZXggdHlwZSBkZWZzLiBQcm9ibGVtOiB3aGF0IGlmIGEgc2ltcGxlVHlwZSByZXN0cmljdGlvbi9leHRlbnNpb24gZGVwZW5kcyBvbiBhIGNvbXBsZXhUeXBlIHNpbXBsZUNvbnRlbnQgcmVzdHJpY3Rpb24vZXh0ZW5zaW9uPworICAgIGludCBtYXhMZXZlbCA9IGJhc2VMZXZlbDsKKyAgICBmb3IgKGJhc2VMZXZlbCA9IDE7IGJhc2VMZXZlbCA8IG1heExldmVsOyArK2Jhc2VMZXZlbCkKKyAgICB7IGZvciAodmVjdG9yPHhzX19zY2hlbWEqPjo6aXRlcmF0b3Igc2NoZW1hID0gZGVmaW5pdGlvbnMudHlwZXMtPnhzX19zY2hlbWFfLmJlZ2luKCk7IHNjaGVtYSAhPSBkZWZpbml0aW9ucy50eXBlcy0+eHNfX3NjaGVtYV8uZW5kKCk7ICsrc2NoZW1hKQorICAgICAgeyBmb3IgKHZlY3Rvcjx4c19fY29tcGxleFR5cGU+OjppdGVyYXRvciBjb21wbGV4VHlwZSA9ICgqc2NoZW1hKS0+Y29tcGxleFR5cGUuYmVnaW4oKTsgY29tcGxleFR5cGUgIT0gKCpzY2hlbWEpLT5jb21wbGV4VHlwZS5lbmQoKTsgKytjb21wbGV4VHlwZSkKKyAgICAgICAgeyBpZiAoKCpjb21wbGV4VHlwZSkuYmFzZUxldmVsKCkgPT0gYmFzZUxldmVsKQorICAgICAgICAgICAgdHlwZXMuZ2VuKCgqc2NoZW1hKS0+dGFyZ2V0TmFtZXNwYWNlLCBOVUxMLCAqY29tcGxleFR5cGUsIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHZlY3Rvcjx4c19fZWxlbWVudD46Oml0ZXJhdG9yIGVsZW1lbnQgPSAoKnNjaGVtYSktPmVsZW1lbnQuYmVnaW4oKTsgZWxlbWVudCAhPSAoKnNjaGVtYSktPmVsZW1lbnQuZW5kKCk7ICsrZWxlbWVudCkKKyAgICAgICAgeyBpZiAoISgqZWxlbWVudCkudHlwZSAmJiAoKmVsZW1lbnQpLmNvbXBsZXhUeXBlUHRyKCkgJiYgKCplbGVtZW50KS5jb21wbGV4VHlwZVB0cigpLT5iYXNlTGV2ZWwoKSA9PSBiYXNlTGV2ZWwpCisJICB7IGZwcmludGYoc3RyZWFtLCAiXG5cbi8vLyBFbGVtZW50IFwiJXNcIjolcyBvZiBjb21wbGV4VHlwZS5cbiIsICgqc2NoZW1hKS0+dGFyZ2V0TmFtZXNwYWNlLCAoKmVsZW1lbnQpLm5hbWUpOworCSAgICB0eXBlcy5kb2N1bWVudCgoKmVsZW1lbnQpLmFubm90YXRpb24pOworICAgICAgICAgICAgdHlwZXMuZ2VuKCgqc2NoZW1hKS0+dGFyZ2V0TmFtZXNwYWNlLCAoKmVsZW1lbnQpLm5hbWUsICooKmVsZW1lbnQpLmNvbXBsZXhUeXBlUHRyKCksIGZhbHNlKTsKKwkgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAvLyBvcHRpb24gdG8gY29uc2lkZXI6IGdlbmVyYXRlIGxvY2FsIGNvbXBsZXhUeXBlcyBpdGVyYXRpdmVseQorICAgIC8qCisgICAgZm9yIChNYXBPZlN0cmluZ1RvVHlwZTo6Y29uc3RfaXRlcmF0b3IgbG9jYWwgPSB0eXBlcy5sb2NhbHMuYmVnaW4oKTsgbG9jYWwgIT0gdHlwZXMubG9jYWxzLmVuZCgpOyArK2xvY2FsKQorICAgIHsgdHlwZXMuZ2VuKE5VTEwsICgqbG9jYWwpLmZpcnN0LCAqKCpsb2NhbCkuc2Vjb25kKTsKKyAgICB9CisgICAgKi8KKyAgICBmb3IgKHZlY3Rvcjx4c19fc2NoZW1hKj46Oml0ZXJhdG9yIHNjaGVtYSA9IGRlZmluaXRpb25zLnR5cGVzLT54c19fc2NoZW1hXy5iZWdpbigpOyBzY2hlbWEgIT0gZGVmaW5pdGlvbnMudHlwZXMtPnhzX19zY2hlbWFfLmVuZCgpOyArK3NjaGVtYSkKKyAgICB7IGZvciAodmVjdG9yPHhzX19lbGVtZW50Pjo6aXRlcmF0b3IgZWxlbWVudCA9ICgqc2NoZW1hKS0+ZWxlbWVudC5iZWdpbigpOyBlbGVtZW50ICE9ICgqc2NoZW1hKS0+ZWxlbWVudC5lbmQoKTsgKytlbGVtZW50KQorICAgICAgeyBpZiAoKCplbGVtZW50KS5uYW1lICYmICgqZWxlbWVudCkudHlwZSkKKyAgICAgICAgeyBmcHJpbnRmKHN0cmVhbSwgIlxuLy8vIEVsZW1lbnQgXCIlc1wiOiVzIG9mIHR5cGUgJXMuXG4iLCAoKnNjaGVtYSktPnRhcmdldE5hbWVzcGFjZSwgKCplbGVtZW50KS5uYW1lLCAoKmVsZW1lbnQpLnR5cGUpOworICAgICAgICAgIHR5cGVzLmRvY3VtZW50KCgqZWxlbWVudCkuYW5ub3RhdGlvbik7CisgICAgICAgICAgaWYgKCF0eXBlcy5pc19kZWZpbmVkKCJfIiwgKCpzY2hlbWEpLT50YXJnZXROYW1lc3BhY2UsICgqZWxlbWVudCkubmFtZSkpCisgICAgICAgICAgeyBjb25zdCBjaGFyICpzID0gdHlwZXMudG5hbWUoTlVMTCwgTlVMTCwgKCplbGVtZW50KS50eXBlKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnQgPSB0eXBlcy5kZWZ0bmFtZShUWVBFREVGLCBOVUxMLCBmYWxzZSwgIl8iLCAoKnNjaGVtYSktPnRhcmdldE5hbWVzcGFjZSwgKCplbGVtZW50KS5uYW1lKTsKKyAgCSAgICBpZiAoZ2ZsYWcpCisgIAkgICAgeyBpZiAoc3RybmNtcChzLCAiY2hhciIsIDQpICYmIHN0cmNocihzLCAnKicpKSAvLyBkb24ndCB3YW50IHBvaW50ZXIgdHlwZWRlZiwgdW5sZXNzIGNoYXIqCisgIAkgICAgICB7IHNpemVfdCBuID0gc3RybGVuKHMpOworICAJICAgICAgICBjaGFyICpyID0gKGNoYXIqKW1hbGxvYyhuKTsKKyAgCSAgICAgICAgc3RybmNweShyLCBzLCBuIC0gMSk7CisgIAkgICAgICAgIHJbbiAtIDFdID0gJ1wwJzsKKyAgCSAgICAgICAgZnByaW50ZihzdHJlYW0sICJ0eXBlZGVmICVzICVzO1xuIiwgciwgdCk7CisgIAkgICAgICAgIGZyZWUocik7CisgIAkgICAgICB9CisgIAkgICAgICBlbHNlCisgIAkgICAgICAgIGZwcmludGYoc3RyZWFtLCAidHlwZWRlZiAlcyAlcztcbiIsIHMsIHQpOworICAJICAgIH0KKyAgCSAgICBlbHNlCisgICAgICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiLy8vIE5vdGU6IHVzZSB3c2RsMmggb3B0aW9uIC1nIHRvIGdlbmVyYXRlIHRoaXMgZ2xvYmFsIGVsZW1lbnQgZGVjbGFyYXRpb24uXG4iKTsKKyAgICAgICAgICB9CisJICBlbHNlCisJICB7IGNvbnN0IGNoYXIgKnMgPSB0eXBlcy5jbmFtZSgiXyIsICgqc2NoZW1hKS0+dGFyZ2V0TmFtZXNwYWNlLCAoKmVsZW1lbnQpLm5hbWUpOworICAgICAgICAgICAgY29uc3QgY2hhciAqdCA9IHR5cGVzLmRlZnR5cGVtYXBbc107CisJICAgIGlmICh0ICYmICp0KQorCSAgICB7IGZwcmludGYoc3RyZWFtLCAiLy8vIEltcG9ydGVkIGVsZW1lbnQgJXMgZnJvbSB0eXBlbWFwICVzLlxuIiwgcywgbWFwZmlsZT9tYXBmaWxlOiIiKTsKKwkgICAgICB0eXBlcy5mb3JtYXQodCk7CisJICAgIH0KKwkgICAgZWxzZQorICAgICAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIi8vICclcycgZWxlbWVudCBkZWZpbml0aW9uIGludGVudGlvbmFsbHkgbGVmdCBibGFuay5cbiIsIHR5cGVzLmNuYW1lKCJfIiwgKCpzY2hlbWEpLT50YXJnZXROYW1lc3BhY2UsICgqZWxlbWVudCkubmFtZSkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZm9yICh2ZWN0b3I8eHNfX2F0dHJpYnV0ZT46Oml0ZXJhdG9yIGF0dHJpYnV0ZSA9ICgqc2NoZW1hKS0+YXR0cmlidXRlLmJlZ2luKCk7IGF0dHJpYnV0ZSAhPSAoKnNjaGVtYSktPmF0dHJpYnV0ZS5lbmQoKTsgKythdHRyaWJ1dGUpCisgICAgICB7IGlmICgoKmF0dHJpYnV0ZSkubmFtZSAmJiAoKmF0dHJpYnV0ZSkudHlwZSkKKyAgICAgICAgeyBmcHJpbnRmKHN0cmVhbSwgIlxuLy8vIEF0dHJpYnV0ZSBcIiVzXCI6JXMgb2Ygc2ltcGxlVHlwZSAlcy5cbiIsICgqc2NoZW1hKS0+dGFyZ2V0TmFtZXNwYWNlLCAoKmF0dHJpYnV0ZSkubmFtZSwgKCphdHRyaWJ1dGUpLnR5cGUpOworICAgICAgICAgIHR5cGVzLmRvY3VtZW50KCgqYXR0cmlidXRlKS5hbm5vdGF0aW9uKTsKKyAgICAgICAgICBpZiAoIXR5cGVzLmlzX2RlZmluZWQoIl8iLCAoKnNjaGVtYSktPnRhcmdldE5hbWVzcGFjZSwgKCphdHRyaWJ1dGUpLm5hbWUpKQorICAgICAgICAgIHsgY29uc3QgY2hhciAqcyA9IHR5cGVzLnRuYW1lKE5VTEwsIE5VTEwsICgqYXR0cmlidXRlKS50eXBlKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnQgPSB0eXBlcy5kZWZ0bmFtZShUWVBFREVGLCBOVUxMLCBmYWxzZSwgIl8iLCAoKnNjaGVtYSktPnRhcmdldE5hbWVzcGFjZSwgKCphdHRyaWJ1dGUpLm5hbWUpOworICAJICAgIGlmIChnZmxhZykKKyAgCSAgICB7IGlmIChzdHJuY21wKHMsICJjaGFyIiwgNCkgJiYgc3RyY2hyKHMsICcqJykpIC8vIGRvbid0IHdhbnQgcG9pbnRlciB0eXBlZGVmLCB1bmxlc3MgY2hhcioKKyAgCSAgICAgIHsgc2l6ZV90IG4gPSBzdHJsZW4ocyk7CisgIAkgICAgICAgIGNoYXIgKnIgPSAoY2hhciopbWFsbG9jKG4pOworICAJICAgICAgICBzdHJuY3B5KHIsIHMsIG4gLSAxKTsKKyAgCSAgICAgICAgcltuIC0gMV0gPSAnXDAnOworICAJICAgICAgICBmcHJpbnRmKHN0cmVhbSwgInR5cGVkZWYgJXMgJXM7XG4iLCByLCB0KTsKKyAgCSAgICAgICAgZnJlZShyKTsKKyAgCSAgICAgIH0KKyAgCSAgICAgIGVsc2UKKyAgCSAgICAgICAgZnByaW50ZihzdHJlYW0sICJ0eXBlZGVmICVzICVzO1xuIiwgcywgdCk7CisgIAkgICAgfQorICAJICAgIGVsc2UKKyAgICAgICAgICAgICAgZnByaW50ZihzdHJlYW0sICIvLy8gTm90ZTogdXNlIHdzZGwyaCBvcHRpb24gLWcgdG8gZ2VuZXJhdGUgdGhpcyBnbG9iYWwgYXR0cmlidXRlIGRlY2xhcmF0aW9uLlxuIik7CisgICAgICAgICAgfQorCSAgZWxzZQorCSAgeyBjb25zdCBjaGFyICpzID0gdHlwZXMuY25hbWUoIl8iLCAoKnNjaGVtYSktPnRhcmdldE5hbWVzcGFjZSwgKCphdHRyaWJ1dGUpLm5hbWUpOworICAgICAgICAgICAgY29uc3QgY2hhciAqdCA9IHR5cGVzLmRlZnR5cGVtYXBbc107CisJICAgIGlmICh0ICYmICp0KQorCSAgICB7IGZwcmludGYoc3RyZWFtLCAiLy8vIEltcG9ydGVkIGF0dHJpYnV0ZSAlcyBmcm9tIHR5cGVtYXAgJXMuXG4iLCBzLCBtYXBmaWxlP21hcGZpbGU6IiIpOworCSAgICAgIHR5cGVzLmZvcm1hdCh0KTsKKwkgICAgfQorCSAgICBlbHNlCisgICAgICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiLy8gJyVzJyBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsuXG4iLCB0eXBlcy5jbmFtZSgiXyIsICgqc2NoZW1hKS0+dGFyZ2V0TmFtZXNwYWNlLCAoKmF0dHJpYnV0ZSkubmFtZSkpOworCSAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGNvbGxlY3QoZGVmaW5pdGlvbnMpOworICBpZiAoIXNlcnZpY2VzLmVtcHR5KCkpCisgIHsgYmFubmVyKCJTZXJ2aWNlcyIpOworICAgIGZvciAoTWFwT2ZTdHJpbmdUb1NlcnZpY2U6OmNvbnN0X2l0ZXJhdG9yIHNlcnZpY2UxID0gc2VydmljZXMuYmVnaW4oKTsgc2VydmljZTEgIT0gc2VydmljZXMuZW5kKCk7ICsrc2VydmljZTEpCisgICAgeyBTZXJ2aWNlICpzdiA9ICgqc2VydmljZTEpLnNlY29uZDsKKyAgICAgIGlmIChzdiAmJiBzdi0+cHJlZml4KQorICAgICAgeyBmcHJpbnRmKHN0cmVhbSwgIlxuIik7CisgICAgICAgIGlmIChzdi0+bmFtZSkKKyAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgc2VydmljZWZvcm1hdCwgc3YtPnByZWZpeCwgIm5hbWUiLCBzdi0+bmFtZSwgIiIpOworICAgICAgICBpZiAoc3YtPnR5cGUpCisgICAgICAgICAgZnByaW50ZihzdHJlYW0sIHNlcnZpY2Vmb3JtYXQsIHN2LT5wcmVmaXgsICJ0eXBlIiwgc3YtPnR5cGUsICIiKTsKKyAgICAgICAgZm9yIChTZXRPZlN0cmluZzo6Y29uc3RfaXRlcmF0b3IgcG9ydCA9IHN2LT5sb2NhdGlvbi5iZWdpbigpOyBwb3J0ICE9IHN2LT5sb2NhdGlvbi5lbmQoKTsgKytwb3J0KQorICAgICAgICAgIGZwcmludGYoc3RyZWFtLCBzZXJ2aWNlZm9ybWF0LCBzdi0+cHJlZml4LCAicG9ydCIsICgqcG9ydCksICIiKTsKKyAgICAgICAgaWYgKHN2LT5VUkkpCisgICAgICAgICAgZnByaW50ZihzdHJlYW0sIHNlcnZpY2Vmb3JtYXQsIHN2LT5wcmVmaXgsICJuYW1lc3BhY2UiLCBzdi0+VVJJLCAiIik7CisgICAgICAgIGlmIChzdi0+dHJhbnNwb3J0KQorICAgICAgICAgIGZwcmludGYoc3RyZWFtLCBzZXJ2aWNlZm9ybWF0LCBzdi0+cHJlZml4LCAidHJhbnNwb3J0Iiwgc3YtPnRyYW5zcG9ydCwgIiIpOworICAgICAgfQorICAgIH0KKyAgICBmcHJpbnRmKHN0cmVhbSwgIlxuLyoqIEBtYWlucGFnZSAlcyBEZWZpbml0aW9uc1xuIiwgZGVmaW5pdGlvbnMubmFtZT9kZWZpbml0aW9ucy5uYW1lOiJTZXJ2aWNlIik7CisgICAgaWYgKGRlZmluaXRpb25zLmRvY3VtZW50YXRpb24pCisgICAgeyBzZWN0aW9uKGRlZnMsICJfZG9jdW1lbnRhdGlvbiBEb2N1bWVudGF0aW9uIiwgTlVMTCk7CisgICAgICB0ZXh0KGRlZmluaXRpb25zLmRvY3VtZW50YXRpb24pOworICAgIH0KKyAgICBpZiAoZGVmaW5pdGlvbnMudHlwZXMgJiYgZGVmaW5pdGlvbnMudHlwZXMtPmRvY3VtZW50YXRpb24pCisgICAgeyBzZWN0aW9uKGRlZnMsICJfdHlwZXMgVHlwZXMiLCBOVUxMKTsKKyAgICAgIHRleHQoZGVmaW5pdGlvbnMudHlwZXMtPmRvY3VtZW50YXRpb24pOworICAgIH0KKyAgICBzZWN0aW9uKGRlZnMsICJfYmluZGluZ3MgQmluZGluZ3MiLCBOVUxMKTsKKyAgICBmb3IgKE1hcE9mU3RyaW5nVG9TZXJ2aWNlOjpjb25zdF9pdGVyYXRvciBzZXJ2aWNlMiA9IHNlcnZpY2VzLmJlZ2luKCk7IHNlcnZpY2UyICE9IHNlcnZpY2VzLmVuZCgpOyArK3NlcnZpY2UyKQorICAgIHsgU2VydmljZSAqc3YgPSAoKnNlcnZpY2UyKS5zZWNvbmQ7CisgICAgICBpZiAoc3YgJiYgc3YtPm5hbWUpCisgICAgICAgIGZwcmludGYoc3RyZWFtLCAiICAtIEByZWYgJXNcbiIsIHN2LT5uYW1lKTsKKyAgICB9CisgICAgZnByaW50ZihzdHJlYW0sICJcbiovXG4iKTsKKyAgICBmb3IgKE1hcE9mU3RyaW5nVG9TZXJ2aWNlOjpjb25zdF9pdGVyYXRvciBzZXJ2aWNlMyA9IHNlcnZpY2VzLmJlZ2luKCk7IHNlcnZpY2UzICE9IHNlcnZpY2VzLmVuZCgpOyArK3NlcnZpY2UzKQorICAgIHsgU2VydmljZSAqc3YgPSAoKnNlcnZpY2UzKS5zZWNvbmQ7CisgICAgICBpZiAoc3YgJiYgc3YtPm5hbWUpCisgICAgICB7IGZwcmludGYoc3RyZWFtLCAiXG4vKipcbiIpOworICAgICAgICBwYWdlKHN2LT5uYW1lLCAiIEJpbmRpbmciLCBzdi0+bmFtZSk7CisgICAgICAgIGZvciAoTWFwT2ZTdHJpbmdUb1N0cmluZzo6Y29uc3RfaXRlcmF0b3Igc2VydmljZV9kb2MgPSBzdi0+c2VydmljZV9kb2N1bWVudGF0aW9uLmJlZ2luKCk7IHNlcnZpY2VfZG9jICE9IHN2LT5zZXJ2aWNlX2RvY3VtZW50YXRpb24uZW5kKCk7ICsrc2VydmljZV9kb2MpCisgICAgICAgIHsgY29uc3QgY2hhciAqbmFtZSA9IHR5cGVzLmFuYW1lKE5VTEwsIE5VTEwsICgqc2VydmljZV9kb2MpLmZpcnN0KTsKKwkgIHNlY3Rpb24obmFtZSwgIl9zZXJ2aWNlIFNlcnZpY2UgRG9jdW1lbnRhdGlvbiIsICgqc2VydmljZV9kb2MpLmZpcnN0KTsKKyAgICAgICAgICB0ZXh0KCgqc2VydmljZV9kb2MpLnNlY29uZCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChNYXBPZlN0cmluZ1RvU3RyaW5nOjpjb25zdF9pdGVyYXRvciBwb3J0X2RvYyA9IHN2LT5wb3J0X2RvY3VtZW50YXRpb24uYmVnaW4oKTsgcG9ydF9kb2MgIT0gc3YtPnBvcnRfZG9jdW1lbnRhdGlvbi5lbmQoKTsgKytwb3J0X2RvYykKKyAgICAgICAgeyBjb25zdCBjaGFyICpuYW1lID0gdHlwZXMuYW5hbWUoTlVMTCwgTlVMTCwgKCpwb3J0X2RvYykuZmlyc3QpOworICAgICAgICAgIHNlY3Rpb24obmFtZSwgIl9wb3J0IFBvcnQgRG9jdW1lbnRhdGlvbiIsICgqcG9ydF9kb2MpLmZpcnN0KTsKKyAgICAgICAgICB0ZXh0KCgqcG9ydF9kb2MpLnNlY29uZCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChNYXBPZlN0cmluZ1RvU3RyaW5nOjpjb25zdF9pdGVyYXRvciBiaW5kaW5nX2RvYyA9IHN2LT5iaW5kaW5nX2RvY3VtZW50YXRpb24uYmVnaW4oKTsgYmluZGluZ19kb2MgIT0gc3YtPmJpbmRpbmdfZG9jdW1lbnRhdGlvbi5lbmQoKTsgKytiaW5kaW5nX2RvYykKKyAgICAgICAgeyBjb25zdCBjaGFyICpuYW1lID0gdHlwZXMuYW5hbWUoTlVMTCwgTlVMTCwgKCpiaW5kaW5nX2RvYykuZmlyc3QpOworICAgICAgICAgIHNlY3Rpb24obmFtZSwgIl9iaW5kaW5nIEJpbmRpbmcgRG9jdW1lbnRhdGlvbiIsICgqYmluZGluZ19kb2MpLmZpcnN0KTsKKyAgICAgICAgICB0ZXh0KCgqYmluZGluZ19kb2MpLnNlY29uZCk7CisgICAgICAgIH0KKyAgICAgICAgc2VjdGlvbihzdi0+bmFtZSwgIl9vcGVyYXRpb25zIE9wZXJhdGlvbnMgb2YgQmluZGluZyAiLCBzdi0+bmFtZSk7CisgICAgICAgIGZvciAodmVjdG9yPE9wZXJhdGlvbio+Ojpjb25zdF9pdGVyYXRvciBvcCA9IHN2LT5vcGVyYXRpb24uYmVnaW4oKTsgb3AgIT0gc3YtPm9wZXJhdGlvbi5lbmQoKTsgKytvcCkKKyAgICAgICAgeyBpZiAoKm9wICYmICgqb3ApLT5pbnB1dF9uYW1lKQorICAgICAgICAgICAgZnByaW50ZihzdHJlYW0sICIgIC0gQHJlZiAlc1xuIiwgKCpvcCktPmlucHV0X25hbWUpOworICAgICAgICB9CisgICAgICAgIHNlY3Rpb24oKCpzdikubmFtZSwgIl9wb3J0cyBFbmRwb2ludHMgb2YgQmluZGluZyAiLCBzdi0+bmFtZSk7CisgICAgICAgIGZvciAoU2V0T2ZTdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIHBvcnQgPSBzdi0+bG9jYXRpb24uYmVnaW4oKTsgcG9ydCAhPSBzdi0+bG9jYXRpb24uZW5kKCk7ICsrcG9ydCkKKyAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIiAgLSAlc1xuIiwgKnBvcnQpOworICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIlxuKi9cbiIpOworICAgICAgfQorICAgIH0KKyAgfQorICBnZW5lcmF0ZSgpOworICBmcHJpbnRmKHN0cmVhbSwgIlxuLyogRW5kIG9mICVzICovXG4iLCBvdXRmaWxlP291dGZpbGU6ImZpbGUiKTsKK30KKwordm9pZCBEZWZpbml0aW9uczo6Z2VuZXJhdGUoKQoreyBNYXBPZlN0cmluZ1RvTWVzc2FnZSBoZWFkZXJzOworICBNYXBPZlN0cmluZ1RvTWVzc2FnZSBmYXVsdHM7CisgIGZvciAoTWFwT2ZTdHJpbmdUb1NlcnZpY2U6OmNvbnN0X2l0ZXJhdG9yIHNlcnZpY2UxID0gc2VydmljZXMuYmVnaW4oKTsgc2VydmljZTEgIT0gc2VydmljZXMuZW5kKCk7ICsrc2VydmljZTEpCisgIHsgaWYgKCgqc2VydmljZTEpLnNlY29uZCkKKyAgICB7IGZvciAoTWFwT2ZTdHJpbmdUb01lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGhlYWRlciA9ICgqc2VydmljZTEpLnNlY29uZC0+aGVhZGVyLmJlZ2luKCk7IGhlYWRlciAhPSAoKnNlcnZpY2UxKS5zZWNvbmQtPmhlYWRlci5lbmQoKTsgKytoZWFkZXIpCisgICAgICAgIGhlYWRlcnNbKCpoZWFkZXIpLmZpcnN0XSA9ICgqaGVhZGVyKS5zZWNvbmQ7CisgICAgICBmb3IgKE1hcE9mU3RyaW5nVG9NZXNzYWdlOjpjb25zdF9pdGVyYXRvciBmYXVsdCA9ICgqc2VydmljZTEpLnNlY29uZC0+ZmF1bHQuYmVnaW4oKTsgZmF1bHQgIT0gKCpzZXJ2aWNlMSkuc2Vjb25kLT5mYXVsdC5lbmQoKTsgKytmYXVsdCkKKyAgICAgICAgZmF1bHRzWygqZmF1bHQpLmZpcnN0XSA9ICgqZmF1bHQpLnNlY29uZDsKKyAgICB9CisgIH0KKyAgLy8gR2VuZXJhdGUgU09BUCBIZWFkZXIgZGVmaW5pdGlvbgorICBpZiAoIWhlYWRlcnMuZW1wdHkoKSkKKyAgeyBiYW5uZXIoIlNPQVAgSGVhZGVyIik7CisgICAgZnByaW50ZihzdHJlYW0sICIvKipcblxuVGhlIFNPQVAgSGVhZGVyIGlzIHBhcnQgb2YgdGhlIGdTT0FQIGNvbnRleHQgYW5kIGl0cyBjb250ZW50IGlzIGFjY2Vzc2VkXG50aHJvdWdoIHRoZSBzb2FwLmhlYWRlciB2YXJpYWJsZS4gWW91IG1heSBoYXZlIHRvIHNldCB0aGUgc29hcC5hY3RvciB2YXJpYWJsZVxudG8gc2VyaWFsaXplIFNPQVAgSGVhZGVycyB3aXRoIFNPQVAtRU5WOmFjdG9yIG9yIFNPQVAtRU5WOnJvbGUgYXR0cmlidXRlcy5cblxuKi9cbiIpOworICAgIGZwcmludGYoc3RyZWFtLCAic3RydWN0IFNPQVBfRU5WX19IZWFkZXJcbntcbiIpOworICAgIGZvciAoTWFwT2ZTdHJpbmdUb01lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGhlYWRlciA9IGhlYWRlcnMuYmVnaW4oKTsgaGVhZGVyICE9IGhlYWRlcnMuZW5kKCk7ICsraGVhZGVyKQorICAgIHsgaWYgKCgqaGVhZGVyKS5zZWNvbmQtPlVSSSAmJiAhdHlwZXMudXJpc1soKmhlYWRlcikuc2Vjb25kLT5VUkldKQorICAgICAgICBmcHJpbnRmKHN0cmVhbSwgc2NoZW1hZm9ybWF0LCB0eXBlcy5uc3ByZWZpeChOVUxMLCAoKmhlYWRlcikuc2Vjb25kLT5VUkkpLCAibmFtZXNwYWNlIiwgKCpoZWFkZXIpLnNlY29uZC0+VVJJKTsKKyAgICAgIGNvbW1lbnQoIkhlYWRlciIsICgqaGVhZGVyKS5maXJzdCwgIldTREwiLCAoKmhlYWRlcikuc2Vjb25kLT5leHRfZG9jdW1lbnRhdGlvbik7CisgICAgICBjb21tZW50KCJIZWFkZXIiLCAoKmhlYWRlcikuZmlyc3QsICJTT0FQIiwgKCpoZWFkZXIpLnNlY29uZC0+ZG9jdW1lbnRhdGlvbik7CisgICAgICBpZiAoKCpoZWFkZXIpLnNlY29uZC0+cGFydCAmJiAoKmhlYWRlcikuc2Vjb25kLT5wYXJ0LT5lbGVtZW50UHRyKCkpCisgICAgICB7IGZwcmludGYoc3RyZWFtLCAiLy8vIFwiJXNcIiBTT0FQIEhlYWRlciBwYXJ0IGVsZW1lbnRcbiIsICgqaGVhZGVyKS5zZWNvbmQtPnBhcnQtPm5hbWUpOworICAgICAgICB0eXBlcy5nZW4oTlVMTCwgKigqaGVhZGVyKS5zZWNvbmQtPnBhcnQtPmVsZW1lbnRQdHIoKSk7CisgICAgICB9CisgICAgICBlbHNlIGlmICgoKmhlYWRlcikuc2Vjb25kLT5wYXJ0ICYmICgqaGVhZGVyKS5zZWNvbmQtPnBhcnQtPnR5cGUpCisgICAgICB7IGZwcmludGYoc3RyZWFtLCBlbGVtZW50Zm9ybWF0LCAibXVzdFVuZGVyc3RhbmQiLCAiLy8gbXVzdCBiZSB1bmRlcnN0b29kIGJ5IHJlY2VpdmVyIik7CisgICAgICAgIGZwcmludGYoc3RyZWFtLCAiXG4iKTsKKyAgICAgICAgZnByaW50ZihzdHJlYW0sIGVsZW1lbnRmb3JtYXQsIHR5cGVzLnBuYW1lKHRydWUsIE5VTEwsIE5VTEwsICgqaGVhZGVyKS5zZWNvbmQtPnBhcnQtPnR5cGUpLCAoKmhlYWRlcikuZmlyc3QpOworICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIjtcbiIpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBmcHJpbnRmKHN0cmVhbSwgZWxlbWVudGZvcm1hdCwgIm11c3RVbmRlcnN0YW5kIiwgIi8vIG11c3QgYmUgdW5kZXJzdG9vZCBieSByZWNlaXZlciIpOworICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIlxuIik7CisgICAgICAgIGlmICgoKmhlYWRlcikuc2Vjb25kLT5wYXJ0ICYmICgqaGVhZGVyKS5zZWNvbmQtPnBhcnQtPmVsZW1lbnQpCisJICBmcHJpbnRmKHN0cmVhbSwgcG9pbnRlcmZvcm1hdCwgdHlwZXMucG5hbWUodHJ1ZSwgTlVMTCwgTlVMTCwgKCpoZWFkZXIpLnNlY29uZC0+cGFydC0+ZWxlbWVudCksICgqaGVhZGVyKS5maXJzdCk7CisgICAgICAgIGVsc2UKKwkgIGZwcmludGYoc3RyZWFtLCBwb2ludGVyZm9ybWF0LCAoKmhlYWRlcikuZmlyc3QsICgqaGVhZGVyKS5maXJzdCk7CisgICAgICAgIGZwcmludGYoc3RyZWFtLCAiO1x0Ly8vPCBUT0RPOiBDaGVjayBlbGVtZW50IHR5cGUgKGltcG9ydGVkIHR5cGUpXG4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgZnByaW50ZihzdHJlYW0sICJcbn07XG4iKTsKKyAgfQorICAvLyBHZW5lcmF0ZSBGYXVsdCBkZXRhaWwgZWxlbWVudCBkZWZpbml0aW9ucworICBmb3IgKE1hcE9mU3RyaW5nVG9NZXNzYWdlOjpjb25zdF9pdGVyYXRvciBmYXVsdCA9IGZhdWx0cy5iZWdpbigpOyBmYXVsdCAhPSBmYXVsdHMuZW5kKCk7ICsrZmF1bHQpCisgIHsgYmFubmVyKCJTT0FQIEZhdWx0IERldGFpbCIpOworICAgIGZwcmludGYoc3RyZWFtLCAiLy8vIFRoZSBTT0FQIEZhdWx0IERldGFpbCBlbGVtZW50IGNvbnRhaW5zIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR5cGVzIHNlcmlhbGl6ZWRcbi8vIGluIHRoZSBfX3R5cGUgYW5kIGZhdWx0IGZpZWxkcyBvZiB0aGUgU09BUF9FTlZfX0RldGFpbCBzdHJ1Y3QgKHNlZSBkb2NzKVxuIik7CisgICAgaWYgKCgqZmF1bHQpLnNlY29uZC0+VVJJICYmICF0eXBlcy51cmlzWygqZmF1bHQpLnNlY29uZC0+VVJJXSkKKyAgICAgIGZwcmludGYoc3RyZWFtLCBzY2hlbWFmb3JtYXQsIHR5cGVzLm5zcHJlZml4KE5VTEwsICgqZmF1bHQpLnNlY29uZC0+VVJJKSwgIm5hbWVzcGFjZSIsICgqZmF1bHQpLnNlY29uZC0+VVJJKTsKKyAgICBjb21tZW50KCJGYXVsdCIsICgqZmF1bHQpLmZpcnN0LCAiV1NETCIsICgqZmF1bHQpLnNlY29uZC0+ZXh0X2RvY3VtZW50YXRpb24pOworICAgIGNvbW1lbnQoIkZhdWx0IiwgKCpmYXVsdCkuZmlyc3QsICJTT0FQIiwgKCpmYXVsdCkuc2Vjb25kLT5kb2N1bWVudGF0aW9uKTsKKyAgICBpZiAoY2ZsYWcpCisgICAgICBmcHJpbnRmKHN0cmVhbSwgInN0cnVjdCAlc1xue1xuIiwgKCpmYXVsdCkuZmlyc3QpOworICAgIGVsc2UKKyAgICAgIGZwcmludGYoc3RyZWFtLCAiY2xhc3MgJXNcbnsgcHVibGljOiIsICgqZmF1bHQpLmZpcnN0KTsKKyAgICAoKmZhdWx0KS5zZWNvbmQtPmdlbmVyYXRlKHR5cGVzLCAiOyIsIGZhbHNlLCB0cnVlLCBmYWxzZSk7CisgICAgaWYgKCFjZmxhZykKKyAgICB7IGZwcmludGYoc3RyZWFtLCAiXG4iKTsKKyAgICAgIGZwcmludGYoc3RyZWFtLCBwb2ludGVyZm9ybWF0LCAic3RydWN0IHNvYXAiLCAic29hcCIpOworICAgICAgZnByaW50ZihzdHJlYW0sICI7Iik7CisgICAgfQorICAgIGZwcmludGYoc3RyZWFtLCAiXG59O1xuIik7CisgIH0KKyAgLyogVGhlIFNPQVAgRmF1bHQgc3RydWN0IGJlbG93IGlzIGF1dG9nZW5lcmF0ZWQgYnkgc29hcGNwcDIgKGtlcHQgaGVyZSBmb3IgZnV0dXJlIG1vZHMpCisgIGlmICghbWZsYWcgJiYgIWZhdWx0cy5lbXB0eSgpKQorICB7IGZwcmludGYoc3RyZWFtLCAic3RydWN0IFNPQVBfRU5WX19Db2RlXG57XG4iKTsgCisgICAgZnByaW50ZihzdHJlYW0sIGVsZW1lbnRmb3JtYXQsICJfUU5hbWUiLCAiU09BUF9FTlZfX1ZhbHVlIik7CisgICAgZnByaW50ZihzdHJlYW0sICI7XG4iKTsKKyAgICBmcHJpbnRmKHN0cmVhbSwgcG9pbnRlcmZvcm1hdCwgImNoYXIiLCAiU09BUF9FTlZfX05vZGUiKTsKKyAgICBmcHJpbnRmKHN0cmVhbSwgIjtcbiIpOworICAgIGZwcmludGYoc3RyZWFtLCBwb2ludGVyZm9ybWF0LCAiY2hhciIsICJTT0FQX0VOVl9fUm9sZSIpOworICAgIGZwcmludGYoc3RyZWFtLCAiO1xufTtcbiIpOworICAgIGZwcmludGYoc3RyZWFtLCAic3RydWN0IFNPQVBfRU5WX19EZXRhaWxcbntcbiIpOyAKKyAgICBmcHJpbnRmKHN0cmVhbSwgZWxlbWVudGZvcm1hdCwgImludCIsICJfX3R5cGUiKTsKKyAgICBmcHJpbnRmKHN0cmVhbSwgIjtcbiIpOworICAgIGZwcmludGYoc3RyZWFtLCBwb2ludGVyZm9ybWF0LCAidm9pZCIsICJmYXVsdCIpOworICAgIGZwcmludGYoc3RyZWFtLCAiO1xuIik7CisgICAgZnByaW50ZihzdHJlYW0sIGVsZW1lbnRmb3JtYXQsICJfWE1MIiwgIl9fYW55Iik7CisgICAgZnByaW50ZihzdHJlYW0sICI7XG59O1xuIik7CisgICAgZnByaW50ZihzdHJlYW0sICJzdHJ1Y3QgU09BUF9FTlZfX0ZhdWx0XG57XG4iKTsgCisgICAgZnByaW50ZihzdHJlYW0sIGVsZW1lbnRmb3JtYXQsICJfUU5hbWUiLCAiZmF1bHRjb2RlIik7CisgICAgZnByaW50ZihzdHJlYW0sICI7XG4iKTsKKyAgICBmcHJpbnRmKHN0cmVhbSwgcG9pbnRlcmZvcm1hdCwgImNoYXIiLCAiZmF1bHRzdHJpbmciKTsKKyAgICBmcHJpbnRmKHN0cmVhbSwgIjtcbiIpOworICAgIGZwcmludGYoc3RyZWFtLCBwb2ludGVyZm9ybWF0LCAiY2hhciIsICJmYXVsdGFjdG9yIik7CisgICAgZnByaW50ZihzdHJlYW0sICI7XG4iKTsKKyAgICBmcHJpbnRmKHN0cmVhbSwgcG9pbnRlcmZvcm1hdCwgInN0cnVjdCBTT0FQX0VOVl9fRGV0YWlsIiwgImRldGFpbCIpOworICAgIGZwcmludGYoc3RyZWFtLCAiO1xuIik7CisgICAgZnByaW50ZihzdHJlYW0sIHBvaW50ZXJmb3JtYXQsICJzdHJ1Y3QgU09BUF9FTlZfX0NvZGUiLCAiU09BUF9FTlZfX0NvZGUiKTsKKyAgICBmcHJpbnRmKHN0cmVhbSwgIjtcbiIpOworICAgIGZwcmludGYoc3RyZWFtLCBwb2ludGVyZm9ybWF0LCAiY2hhciIsICJTT0FQX0VOVl9fUmVhc29uIik7CisgICAgZnByaW50ZihzdHJlYW0sICI7XG4iKTsKKyAgICBmcHJpbnRmKHN0cmVhbSwgcG9pbnRlcmZvcm1hdCwgInN0cnVjdCBTT0FQX0VOVl9fRGV0YWlsIiwgIlNPQVBfRU5WX19EZXRhaWwiKTsKKyAgICBmcHJpbnRmKHN0cmVhbSwgIjtcbn07XG4iKTsKKyAgfQorICAqLworICBmb3IgKE1hcE9mU3RyaW5nVG9TZXJ2aWNlOjpjb25zdF9pdGVyYXRvciBzZXJ2aWNlMiA9IHNlcnZpY2VzLmJlZ2luKCk7IHNlcnZpY2UyICE9IHNlcnZpY2VzLmVuZCgpOyArK3NlcnZpY2UyKQorICAgIGlmICgoKnNlcnZpY2UyKS5zZWNvbmQpCisgICAgICAoKnNlcnZpY2UyKS5zZWNvbmQtPmdlbmVyYXRlKHR5cGVzKTsKK30gCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JU2VydmljZSBtZXRob2RzCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworU2VydmljZTo6U2VydmljZSgpCit7IHByZWZpeCA9IE5VTEw7CisgIFVSSSA9IE5VTEw7CisgIG5hbWUgPSBOVUxMOworICB0eXBlID0gTlVMTDsKKyAgdHJhbnNwb3J0ID0gTlVMTDsKK30KKwordm9pZCBTZXJ2aWNlOjpnZW5lcmF0ZShUeXBlcyYgdHlwZXMpCit7IGlmIChuYW1lKQorICAgIGJhbm5lcihuYW1lKTsKKyAgZm9yICh2ZWN0b3I8T3BlcmF0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIG9wMiA9IG9wZXJhdGlvbi5iZWdpbigpOyBvcDIgIT0gb3BlcmF0aW9uLmVuZCgpOyArK29wMikKKyAgeyBpZiAoKm9wMiAmJiAoKm9wMiktPmlucHV0KQorICAgIHsgYm9vbCBmbGFnID0gZmFsc2UsIGFub255bW91cyA9ICgqb3AyKS0+cGFyYW1ldGVyT3JkZXIgIT0gTlVMTDsKKyAgICAgIGJhbm5lcigoKm9wMiktPmlucHV0X25hbWUpOworICAgICAgaWYgKCgqb3AyKS0+b3V0cHV0ICYmICgqb3AyKS0+b3V0cHV0X25hbWUpCisgICAgICB7IGlmICgoKm9wMiktPnN0eWxlID09IGRvY3VtZW50KQorICAgICAgICAgIGZsYWcgPSAoKm9wMiktPm91dHB1dC0+bWVzc2FnZSAmJiAoKm9wMiktPm91dHB1dC0+bWVzc2FnZS0+cGFydC5zaXplKCkgPT0gMTsKKyAgICAgICAgZWxzZSBpZiAoIXdmbGFnKQorICAgICAgICAgIGZsYWcgPSAoKm9wMiktPm91dHB1dC0+bWVzc2FnZSAmJiAoKm9wMiktPm91dHB1dC0+dXNlID09IGVuY29kZWQgJiYgKCpvcDIpLT5vdXRwdXQtPm1lc3NhZ2UtPnBhcnQuc2l6ZSgpID09IDEgJiYgISgqKCpvcDIpLT5vdXRwdXQtPm1lc3NhZ2UtPnBhcnQuYmVnaW4oKSkuc2ltcGxlVHlwZVB0cigpICYmICEoKigqb3AyKS0+b3V0cHV0LT5tZXNzYWdlLT5wYXJ0LmJlZ2luKCkpLmNvbXBsZXhUeXBlUHRyKCk7CisgICAgICAgIGlmIChmbGFnICYmICgqb3AyKS0+aW5wdXQtPm1lc3NhZ2UgJiYgKCooKm9wMiktPm91dHB1dC0+bWVzc2FnZS0+cGFydC5iZWdpbigpKS5lbGVtZW50KQorICAgICAgICAgIGZvciAodmVjdG9yPHdzZGxfX3BhcnQ+Ojpjb25zdF9pdGVyYXRvciBwYXJ0ID0gKCpvcDIpLT5pbnB1dC0+bWVzc2FnZS0+cGFydC5iZWdpbigpOyBwYXJ0ICE9ICgqb3AyKS0+aW5wdXQtPm1lc3NhZ2UtPnBhcnQuZW5kKCk7ICsrcGFydCkKKyAgICAgICAgICAgIGlmICgoKnBhcnQpLmVsZW1lbnQgJiYgIXN0cmNtcCgoKnBhcnQpLmVsZW1lbnQsICgqKCpvcDIpLT5vdXRwdXQtPm1lc3NhZ2UtPnBhcnQuYmVnaW4oKSkuZWxlbWVudCkpCisgICAgICAgICAgICAgIGZsYWcgPSBmYWxzZTsKKwlpZiAoIWZsYWcpCisgICAgICAgIHsgZnByaW50ZihzdHJlYW0sICIvLy8gT3BlcmF0aW9uIHJlc3BvbnNlIHN0cnVjdCBcIiVzXCIgb2Ygc2VydmljZSBiaW5kaW5nIFwiJXNcIiBvcGVyYXRpb24gXCIlc1wiXG4iLCAoKm9wMiktPm91dHB1dF9uYW1lLCBuYW1lLCAoKm9wMiktPmlucHV0X25hbWUpOworICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAic3RydWN0ICVzXG57IiwgKCpvcDIpLT5vdXRwdXRfbmFtZSk7CisgICAgICAgICAgKCpvcDIpLT5vdXRwdXQtPmdlbmVyYXRlKHR5cGVzLCAiOyIsIGFub255bW91cywgdHJ1ZSwgZmFsc2UpOworICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiXG59O1xuIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZwcmludGYoc3RyZWFtLCAiXG4vLy8gT3BlcmF0aW9uIFwiJXNcIiBvZiBzZXJ2aWNlIGJpbmRpbmcgXCIlc1wiXG5cbi8qKlxuXG5PcGVyYXRpb24gZGV0YWlsczpcblxuIiwgKCpvcDIpLT5pbnB1dF9uYW1lLCBuYW1lKTsKKyAgICAgIGlmICgoKm9wMiktPmRvY3VtZW50YXRpb24pCisgICAgICAgIHRleHQoKCpvcDIpLT5kb2N1bWVudGF0aW9uKTsKKyAgICAgIGlmICgoKm9wMiktPm9wZXJhdGlvbl9kb2N1bWVudGF0aW9uKQorICAgICAgICB0ZXh0KCgqb3AyKS0+b3BlcmF0aW9uX2RvY3VtZW50YXRpb24pOworICAgICAgaWYgKCgqb3AyKS0+aW5wdXQtPmRvY3VtZW50YXRpb24pCisgICAgICB7IGZwcmludGYoc3RyZWFtLCAiSW5wdXQgcmVxdWVzdDpcbiIpOworCXRleHQoKCpvcDIpLT5pbnB1dC0+ZG9jdW1lbnRhdGlvbik7CisgICAgICB9CisgICAgICBpZiAoKCpvcDIpLT5pbnB1dC0+ZXh0X2RvY3VtZW50YXRpb24pCisgICAgICB7IGZwcmludGYoc3RyZWFtLCAiSW5wdXQgcmVxdWVzdDpcbiIpOworICAgICAgICB0ZXh0KCgqb3AyKS0+aW5wdXQtPmV4dF9kb2N1bWVudGF0aW9uKTsKKyAgICAgIH0KKyAgICAgIGlmICgoKm9wMiktPm91dHB1dCkKKyAgICAgIHsgaWYgKCgqb3AyKS0+b3V0cHV0LT5kb2N1bWVudGF0aW9uKQorICAgICAgICB7IGZwcmludGYoc3RyZWFtLCAiT3V0cHV0IHJlc3BvbnNlOlxuIik7CisJICB0ZXh0KCgqb3AyKS0+b3V0cHV0LT5kb2N1bWVudGF0aW9uKTsKKwl9CisgICAgICAgIGlmICgoKm9wMiktPm91dHB1dC0+ZXh0X2RvY3VtZW50YXRpb24pCisgICAgICAgIHsgZnByaW50ZihzdHJlYW0sICJPdXRwdXQgcmVzcG9uc2U6XG4iKTsKKwkgIHRleHQoKCpvcDIpLT5vdXRwdXQtPmV4dF9kb2N1bWVudGF0aW9uKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCgqb3AyKS0+b3V0cHV0KQorICAgICAgeyBpZiAoKCpvcDIpLT5vdXRwdXQtPmNvbnRlbnQpCisJeyBmcHJpbnRmKHN0cmVhbSwgIiAgLSBSZXNwb25zZSBoYXMgTUlNRSBjb250ZW50ICclcydcbiIsICgoKm9wMiktPm91dHB1dC0+Y29udGVudC0+dHlwZT8oKm9wMiktPm91dHB1dC0+Y29udGVudC0+dHlwZToiPyIpKTsKKwkgIGZwcmludGYoc3RyZWFtLCAiICAgIFRPRE86IHRoaXMgZm9ybSBvZiBNSU1FIGNvbnRlbnQgcmVzcG9uc2UgaXMgbm90IGF1dG9tYXRpY2FsbHkgaGFuZGxlZC5cbiAgICBVc2Ugb25lLXdheSByZXF1ZXN0IGFuZCBpbXBsZW1lbnQgY29kZSB0byBwYXJzZSByZXNwb25zZS5cbiIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisJZnByaW50ZihzdHJlYW0sICIgIC0gT25lLXdheSBtZXNzYWdlXG4iKTsKKyAgICAgIGlmICgoKm9wMiktPnN0eWxlID09IGRvY3VtZW50KQorICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIiAgLSBTT0FQIGRvY3VtZW50L2xpdGVyYWwgc3R5bGVcbiIpOworICAgICAgZWxzZQorICAgICAgeyBpZiAoKCpvcDIpLT5pbnB1dC0+dXNlID09IGxpdGVyYWwpCisgICAgICAgICAgZnByaW50ZihzdHJlYW0sICIgIC0gU09BUCBSUEMgbGl0ZXJhbCBzdHlsZVxuIik7CisgICAgICAgIGVsc2UgaWYgKCgqb3AyKS0+aW5wdXQtPmVuY29kaW5nU3R5bGUpCisgICAgICAgICAgZnByaW50ZihzdHJlYW0sICIgIC0gU09BUCBSUEMgZW5jb2RpbmdTdHlsZT1cIiVzXCJcbiIsICgqb3AyKS0+aW5wdXQtPmVuY29kaW5nU3R5bGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgZnByaW50ZihzdHJlYW0sICIgIC0gU09BUCBSUEMgZW5jb2RlZFxuIik7CisgICAgICB9CisgICAgICBpZiAoKCpvcDIpLT5vdXRwdXQpCisgICAgICB7IGlmICgoKm9wMiktPmlucHV0LT51c2UgIT0gKCpvcDIpLT5vdXRwdXQtPnVzZSkKKyAgICAgICAgeyBpZiAoKCpvcDIpLT5vdXRwdXQtPnVzZSA9PSBsaXRlcmFsKQorICAgICAgICAgICAgZnByaW50ZihzdHJlYW0sICIgIC0gU09BUCBSUEMgbGl0ZXJhbCByZXNwb25zZVxuIik7CisgICAgICAgICAgZWxzZSBpZiAoKCpvcDIpLT5vdXRwdXQtPmVuY29kaW5nU3R5bGUpCisgICAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIiAgLSBTT0FQIFJQQyByZXNwb25zZSBlbmNvZGluZ1N0eWxlPVwiJXNcIlxuIiwgKCpvcDIpLT5vdXRwdXQtPmVuY29kaW5nU3R5bGUpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiICAtIFNPQVAgUlBDIGVuY29kZWQgcmVzcG9uc2VcbiIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoKCpvcDIpLT5zb2FwQWN0aW9uKQorICAgICAgeyBpZiAoKigqb3AyKS0+c29hcEFjdGlvbikKKyAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIiAgLSBTT0FQIGFjdGlvbj1cIiVzXCJcbiIsICgqb3AyKS0+c29hcEFjdGlvbik7CisgICAgICB9CisgICAgICBmb3IgKHZlY3RvcjxNZXNzYWdlKj46OmNvbnN0X2l0ZXJhdG9yIG1lc3NhZ2UgPSAoKm9wMiktPmZhdWx0LmJlZ2luKCk7IG1lc3NhZ2UgIT0gKCpvcDIpLT5mYXVsdC5lbmQoKTsgKyttZXNzYWdlKQorICAgICAgeyBpZiAoKCptZXNzYWdlKS0+bWVzc2FnZSAmJiAoKm1lc3NhZ2UpLT5tZXNzYWdlLT5uYW1lKQorICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiICAtIFNPQVAgRmF1bHQ6ICVzXG4iLCAoKm1lc3NhZ2UpLT5uYW1lKTsKKyAgICAgIH0KKyAgICAgIGlmICghKCpvcDIpLT5pbnB1dC0+aGVhZGVyLmVtcHR5KCkpCisgICAgICAgIGZwcmludGYoc3RyZWFtLCAiICAtIFJlcXVlc3QgbWVzc2FnZSBoYXMgbWFuZGF0b3J5IGhlYWRlciBwYXJ0KHMpOlxuIik7CisgICAgICBmb3IgKHZlY3Rvcjxzb2FwX19oZWFkZXI+Ojpjb25zdF9pdGVyYXRvciBpbnB1dGhlYWRlciA9ICgqb3AyKS0+aW5wdXQtPmhlYWRlci5iZWdpbigpOyBpbnB1dGhlYWRlciAhPSAoKm9wMiktPmlucHV0LT5oZWFkZXIuZW5kKCk7ICsraW5wdXRoZWFkZXIpCisgICAgICB7IGlmICgoKmlucHV0aGVhZGVyKS5wYXJ0KQorICAgICAgICB7IGlmICgoKmlucHV0aGVhZGVyKS51c2UgPT0gZW5jb2RlZCAmJiAoKmlucHV0aGVhZGVyKS5uYW1lc3BhY2VfKQorICAgICAgICAgICAgZnByaW50ZihzdHJlYW0sICIgICAgLSAlc1xuIiwgdHlwZXMuYW5hbWUoTlVMTCwgKCppbnB1dGhlYWRlcikubmFtZXNwYWNlXywgKCppbnB1dGhlYWRlcikucGFydCkpOworICAgICAgICAgIGVsc2UgaWYgKCgqaW5wdXRoZWFkZXIpLnBhcnRQdHIoKSAmJiAoKmlucHV0aGVhZGVyKS5wYXJ0UHRyKCktPmVsZW1lbnQpCisgICAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIiAgICAtICVzXG4iLCB0eXBlcy5hbmFtZShOVUxMLCBOVUxMLCAoKmlucHV0aGVhZGVyKS5wYXJ0UHRyKCktPmVsZW1lbnQpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCgqb3AyKS0+aW5wdXQtPm11bHRpcGFydFJlbGF0ZWQpCisgICAgICB7IGludCBrID0gMjsKKyAgICAgICAgZnByaW50ZihzdHJlYW0sICIgIC0gUmVxdWVzdCBtZXNzYWdlIGhhcyBNSU1FIG11bHRpcGFydC9yZWxhdGVkIGF0dGFjaG1lbnRzOlxuIik7CisgICAgICAgIGZvciAodmVjdG9yPG1pbWVfX3BhcnQ+Ojpjb25zdF9pdGVyYXRvciBwYXJ0ID0gKCpvcDIpLT5pbnB1dC0+bXVsdGlwYXJ0UmVsYXRlZC0+cGFydC5iZWdpbigpOyBwYXJ0ICE9ICgqb3AyKS0+aW5wdXQtPm11bHRpcGFydFJlbGF0ZWQtPnBhcnQuZW5kKCk7ICsrcGFydCkKKwl7IGlmICgoKnBhcnQpLnNvYXBfX2JvZHlfKQorICAgICAgICAgIHsgZnByaW50ZihzdHJlYW0sICIgICAgLSMgTUlNRSBhdHRhY2htZW50IHdpdGggU09BUCBCb2R5IGFuZCBtYW5kYXRvcnkgaGVhZGVyIHBhcnQocyk6XG4iKTsKKyAgICAgICAgICAgIGZvciAodmVjdG9yPHNvYXBfX2hlYWRlcj46OmNvbnN0X2l0ZXJhdG9yIGhlYWRlciA9ICgqcGFydCkuc29hcF9faGVhZGVyXy5iZWdpbigpOyBoZWFkZXIgIT0gKCpwYXJ0KS5zb2FwX19oZWFkZXJfLmVuZCgpOyArK2hlYWRlcikKKyAgICAgICAgICAgIHsgaWYgKCgqaGVhZGVyKS5wYXJ0KQorICAgICAgICAgICAgICB7IGlmICgoKmhlYWRlcikudXNlID09IGVuY29kZWQgJiYgKCpoZWFkZXIpLm5hbWVzcGFjZV8pCisgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIiAgICAgICAtICVzXG4iLCB0eXBlcy5hbmFtZShOVUxMLCAoKmhlYWRlcikubmFtZXNwYWNlXywgKCpoZWFkZXIpLnBhcnQpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICgoKmhlYWRlcikucGFydFB0cigpICYmICgqaGVhZGVyKS5wYXJ0UHRyKCktPmVsZW1lbnQpCisgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIiAgICAgICAtICVzXG4iLCB0eXBlcy5hbmFtZShOVUxMLCBOVUxMLCAoKmhlYWRlcikucGFydFB0cigpLT5lbGVtZW50KSk7CisgICAgICAgICAgICAgIH0KKwkgICAgfQorCSAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7IGZwcmludGYoc3RyZWFtLCAiICAgIC0jIE1JTUUgYXR0YWNobWVudCAlZDpcbiIsIGsrKyk7CisJICAgIGZvciAodmVjdG9yPG1pbWVfX2NvbnRlbnQ+Ojpjb25zdF9pdGVyYXRvciBjb250ZW50ID0gKCpwYXJ0KS5jb250ZW50LmJlZ2luKCk7IGNvbnRlbnQgIT0gKCpwYXJ0KS5jb250ZW50LmVuZCgpOyArK2NvbnRlbnQpCisJICAgICAgZnByaW50ZihzdHJlYW0sICIgICAgICAgLSBwYXJ0PVwiJXNcIiB0eXBlPVwiJXNcIlxuIiwgKCpjb250ZW50KS5wYXJ0PygqY29udGVudCkucGFydDoiIiwgKCpjb250ZW50KS50eXBlPygqY29udGVudCkudHlwZToiIik7CisJICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICgoKm9wMiktPmlucHV0LT5sYXlvdXQpCisgICAgICAgIGZwcmludGYoc3RyZWFtLCAiICAtIFJlcXVlc3QgbWVzc2FnZSBoYXMgRElNRSBhdHRhY2htZW50cyBpbiBjb21wbGlhbmNlIHdpdGggJXNcbiIsICgqb3AyKS0+aW5wdXQtPmxheW91dCk7CisgICAgICBpZiAoKCpvcDIpLT5vdXRwdXQpCisgICAgICB7IGlmICghKCpvcDIpLT5vdXRwdXQtPmhlYWRlci5lbXB0eSgpKQorICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiICAtIFJlc3BvbnNlIG1lc3NhZ2UgaGFzIG1hbmRhdG9yeSBoZWFkZXIgcGFydChzKTpcbiIpOworICAgICAgICBmb3IgKHZlY3Rvcjxzb2FwX19oZWFkZXI+Ojpjb25zdF9pdGVyYXRvciBvdXRwdXRoZWFkZXIgPSAoKm9wMiktPm91dHB1dC0+aGVhZGVyLmJlZ2luKCk7IG91dHB1dGhlYWRlciAhPSAoKm9wMiktPm91dHB1dC0+aGVhZGVyLmVuZCgpOyArK291dHB1dGhlYWRlcikKKyAgICAgICAgeyBpZiAoKCpvdXRwdXRoZWFkZXIpLnBhcnQpCisgICAgICAgICAgeyBpZiAoKCpvdXRwdXRoZWFkZXIpLnVzZSA9PSBlbmNvZGVkICYmICgqb3V0cHV0aGVhZGVyKS5uYW1lc3BhY2VfKQorICAgICAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIiAgICAtICVzXG4iLCB0eXBlcy5hbmFtZShOVUxMLCAoKm91dHB1dGhlYWRlcikubmFtZXNwYWNlXywgKCpvdXRwdXRoZWFkZXIpLnBhcnQpKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCgqb3V0cHV0aGVhZGVyKS5wYXJ0UHRyKCkgJiYgKCpvdXRwdXRoZWFkZXIpLnBhcnRQdHIoKS0+ZWxlbWVudCkKKyAgICAgICAgICAgICAgZnByaW50ZihzdHJlYW0sICIgICAgLSAlc1xuIiwgdHlwZXMuYW5hbWUoTlVMTCwgTlVMTCwgKCpvdXRwdXRoZWFkZXIpLnBhcnRQdHIoKS0+ZWxlbWVudCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCgqb3AyKS0+b3V0cHV0ICYmICgqb3AyKS0+b3V0cHV0X25hbWUgJiYgKCpvcDIpLT5vdXRwdXQtPm11bHRpcGFydFJlbGF0ZWQpCisgICAgICB7IGludCBrID0gMjsKKyAgICAgICAgZnByaW50ZihzdHJlYW0sICIgIC0gUmVzcG9uc2UgbWVzc2FnZSBoYXMgTUlNRSBtdWx0aXBhcnQvcmVsYXRlZCBhdHRhY2htZW50c1xuIik7CisgICAgICAgIGZvciAodmVjdG9yPG1pbWVfX3BhcnQ+Ojpjb25zdF9pdGVyYXRvciBwYXJ0ID0gKCpvcDIpLT5vdXRwdXQtPm11bHRpcGFydFJlbGF0ZWQtPnBhcnQuYmVnaW4oKTsgcGFydCAhPSAoKm9wMiktPm91dHB1dC0+bXVsdGlwYXJ0UmVsYXRlZC0+cGFydC5lbmQoKTsgKytwYXJ0KQorCXsgaWYgKCgqcGFydCkuc29hcF9fYm9keV8pCisgICAgICAgICAgeyBmcHJpbnRmKHN0cmVhbSwgIiAgICAtIyBNSU1FIGF0dGFjaG1lbnQgd2l0aCBTT0FQIEJvZHkgYW5kIG1hbmRhdG9yeSBoZWFkZXIgcGFydChzKTpcbiIpOworICAgICAgICAgICAgZm9yICh2ZWN0b3I8c29hcF9faGVhZGVyPjo6Y29uc3RfaXRlcmF0b3IgaGVhZGVyID0gKCpwYXJ0KS5zb2FwX19oZWFkZXJfLmJlZ2luKCk7IGhlYWRlciAhPSAoKnBhcnQpLnNvYXBfX2hlYWRlcl8uZW5kKCk7ICsraGVhZGVyKQorICAgICAgICAgICAgeyBpZiAoKCpoZWFkZXIpLnBhcnQpCisgICAgICAgICAgICAgIHsgaWYgKCgqaGVhZGVyKS51c2UgPT0gZW5jb2RlZCAmJiAoKmhlYWRlcikubmFtZXNwYWNlXykKKyAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiICAgICAgIC0gJXNcbiIsIHR5cGVzLmFuYW1lKE5VTEwsICgqaGVhZGVyKS5uYW1lc3BhY2VfLCAoKmhlYWRlcikucGFydCkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCgqaGVhZGVyKS5wYXJ0UHRyKCkgJiYgKCpoZWFkZXIpLnBhcnRQdHIoKS0+ZWxlbWVudCkKKyAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiICAgICAgIC0gJXNcbiIsIHR5cGVzLmFuYW1lKE5VTEwsIE5VTEwsICgqaGVhZGVyKS5wYXJ0UHRyKCktPmVsZW1lbnQpKTsKKyAgICAgICAgICAgICAgfQorCSAgICB9CisJICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsgZnByaW50ZihzdHJlYW0sICIgICAgLSMgTUlNRSBhdHRhY2htZW50ICVkOlxuIiwgaysrKTsKKyAgICAgICAgICAgIGZvciAodmVjdG9yPG1pbWVfX2NvbnRlbnQ+Ojpjb25zdF9pdGVyYXRvciBjb250ZW50ID0gKCpwYXJ0KS5jb250ZW50LmJlZ2luKCk7IGNvbnRlbnQgIT0gKCpwYXJ0KS5jb250ZW50LmVuZCgpOyArK2NvbnRlbnQpCisJICAgICAgZnByaW50ZihzdHJlYW0sICIgICAgICAgLSBwYXJ0PVwiJXNcIiB0eXBlPVwiJXNcIlxuIiwgKCpjb250ZW50KS5wYXJ0PygqY29udGVudCkucGFydDoiIiwgKCpjb250ZW50KS50eXBlPygqY29udGVudCkudHlwZToiIik7CisJICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICgoKm9wMiktPm91dHB1dCAmJiAoKm9wMiktPm91dHB1dF9uYW1lICYmICgqb3AyKS0+b3V0cHV0LT5sYXlvdXQpCisgICAgICAgIGZwcmludGYoc3RyZWFtLCAiICAtIFJlc3BvbnNlIG1lc3NhZ2UgaGFzIERJTUUgYXR0YWNobWVudHMgaW4gY29tcGxpYW5jZSB3aXRoICVzXG4iLCAoKm9wMiktPm91dHB1dC0+bGF5b3V0KTsKKyAgICAgIGZwcmludGYoc3RyZWFtLCAiXG5DIHN0dWIgZnVuY3Rpb24gKGRlZmluZWQgaW4gc29hcENsaWVudC5jW3BwXSBhZnRlciBydW5uaW5nIHNvYXBjcHAyKTpcbkBjb2RlXG4gIGludCBzb2FwX2NhbGxfJXMoc3RydWN0IHNvYXAgKnNvYXAsXG4gICAgTlVMTCwgLy8gY2hhciAqZW5kcG9pbnQgPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBlbmRwb2ludCBmb3IgdGhpcyBvcGVyYXRpb25cbiAgICBOVUxMLCAvLyBjaGFyICphY3Rpb24gPSBOVUxMIHNlbGVjdHMgZGVmYXVsdCBhY3Rpb24gZm9yIHRoaXMgb3BlcmF0aW9uXG4gICAgLy8gcmVxdWVzdCBwYXJhbWV0ZXJzOiIsICgqb3AyKS0+aW5wdXRfbmFtZSk7CisgICAgICAoKm9wMiktPmlucHV0LT5nZW5lcmF0ZSh0eXBlcywgIiwiLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgIGZwcmludGYoc3RyZWFtLCAiXG4gICAgLy8gcmVzcG9uc2UgcGFyYW1ldGVyczoiKTsKKyAgICAgIGlmICgoKm9wMiktPm91dHB1dCAmJiAoKm9wMiktPm91dHB1dF9uYW1lKQorICAgICAgeyBpZiAoZmxhZykKKyAgICAgICAgeyBpZiAoKCpvcDIpLT5zdHlsZSA9PSBkb2N1bWVudCkKKwkgIHsgLy8gU2hvcnRjdXQ6IGRvIG5vdCBnZW5lcmF0ZSB3cmFwcGVyIHN0cnVjdAorICAgICAgICAgICAgKCpvcDIpLT5vdXRwdXQtPmdlbmVyYXRlKHR5cGVzLCAiIiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoKCooKm9wMiktPm91dHB1dC0+bWVzc2FnZS0+cGFydC5iZWdpbigpKS5uYW1lKQorCSAgeyBmcHJpbnRmKHN0cmVhbSwgIlxuIik7CisgICAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgYW5vbnltb3VzID8gYW5vbmZvcm1hdCA6IHBhcmFmb3JtYXQsIHR5cGVzLnRuYW1lKE5VTEwsIE5VTEwsICgqKCpvcDIpLT5vdXRwdXQtPm1lc3NhZ2UtPnBhcnQuYmVnaW4oKSkudHlwZSksIGNmbGFnID8gIioiIDogIiYiLCB0eXBlcy5hbmFtZShOVUxMLCBOVUxMLCAoKigqb3AyKS0+b3V0cHV0LT5tZXNzYWdlLT5wYXJ0LmJlZ2luKCkpLm5hbWUpLCAiIik7CisJICB9CisJfQorICAgICAgICBlbHNlCisgICAgICAgICAgZnByaW50ZihzdHJlYW0sICJcbiAgICBzdHJ1Y3QgJXMlcyIsICgqb3AyKS0+b3V0cHV0X25hbWUsIGNmbGFnID8gIioiIDogIiYiKTsKKyAgICAgIH0KKyAgICAgIGZwcmludGYoc3RyZWFtLCAiXG4gICk7XG5AZW5kY29kZVxuXG4iKTsKKyAgICAgIGlmICghY2ZsYWcpCisgICAgICB7IGZwcmludGYoc3RyZWFtLCAiQysrIHByb3h5IGNsYXNzIChkZWZpbmVkIGluIHNvYXAlc1Byb3h5LmgpOlxuIiwgbmFtZSk7CisgICAgICAgIGZwcmludGYoc3RyZWFtLCAiICBjbGFzcyAlcztcblxuIiwgbmFtZSk7CisgICAgICB9CisgICAgICBmcHJpbnRmKHN0cmVhbSwgIiovXG5cbiIpOworICAgICAgKCpvcDIpLT5nZW5lcmF0ZSh0eXBlcyk7CisgICAgfQorICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JT3BlcmF0aW9uIG1ldGhvZHMKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIE9wZXJhdGlvbjo6Z2VuZXJhdGUoVHlwZXMgJnR5cGVzKQoreyBib29sIGZsYWcgPSBmYWxzZSwgYW5vbnltb3VzID0gcGFyYW1ldGVyT3JkZXIgIT0gTlVMTDsKKyAgY29uc3QgY2hhciAqbWV0aG9kX25hbWUgPSBzdHJzdHIoaW5wdXRfbmFtZSArIDEsICJfXyIpICsgMjsKKyAgaWYgKCFtZXRob2RfbmFtZSkKKyAgICBtZXRob2RfbmFtZSA9IGlucHV0X25hbWU7CisgIGlmIChzdHlsZSA9PSBkb2N1bWVudCkKKyAgICBmcHJpbnRmKHN0cmVhbSwgc2VydmljZWZvcm1hdCwgcHJlZml4LCAibWV0aG9kLXN0eWxlIiwgbWV0aG9kX25hbWUsICJkb2N1bWVudCIpOworICBlbHNlCisgICAgZnByaW50ZihzdHJlYW0sIHNlcnZpY2Vmb3JtYXQsIHByZWZpeCwgIm1ldGhvZC1zdHlsZSIsIG1ldGhvZF9uYW1lLCAicnBjIik7CisgIGlmIChpbnB1dC0+dXNlID09IGxpdGVyYWwpCisgICAgZnByaW50ZihzdHJlYW0sIHNlcnZpY2Vmb3JtYXQsIHByZWZpeCwgIm1ldGhvZC1lbmNvZGluZyIsIG1ldGhvZF9uYW1lLCAibGl0ZXJhbCIpOworICBlbHNlIGlmIChpbnB1dC0+ZW5jb2RpbmdTdHlsZSkKKyAgICBmcHJpbnRmKHN0cmVhbSwgc2VydmljZWZvcm1hdCwgcHJlZml4LCAibWV0aG9kLWVuY29kaW5nIiwgbWV0aG9kX25hbWUsIGlucHV0LT5lbmNvZGluZ1N0eWxlKTsKKyAgZWxzZQorICAgIGZwcmludGYoc3RyZWFtLCBzZXJ2aWNlZm9ybWF0LCBwcmVmaXgsICJtZXRob2QtZW5jb2RpbmciLCBtZXRob2RfbmFtZSwgImVuY29kZWQiKTsKKyAgaWYgKG91dHB1dCkKKyAgeyBpZiAoaW5wdXQtPnVzZSAhPSBvdXRwdXQtPnVzZSkKKyAgICB7IGlmIChvdXRwdXQtPnVzZSA9PSBsaXRlcmFsKQorICAgICAgICBmcHJpbnRmKHN0cmVhbSwgc2VydmljZWZvcm1hdCwgcHJlZml4LCAibWV0aG9kLXJlc3BvbnNlLWVuY29kaW5nIiwgbWV0aG9kX25hbWUsICJsaXRlcmFsIik7CisgICAgICBlbHNlIGlmIChvdXRwdXQtPmVuY29kaW5nU3R5bGUpCisgICAgICAgIGZwcmludGYoc3RyZWFtLCBzZXJ2aWNlZm9ybWF0LCBwcmVmaXgsICJtZXRob2QtcmVzcG9uc2UtZW5jb2RpbmciLCBtZXRob2RfbmFtZSwgb3V0cHV0LT5lbmNvZGluZ1N0eWxlKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZnByaW50ZihzdHJlYW0sIHNlcnZpY2Vmb3JtYXQsIHByZWZpeCwgIm1ldGhvZC1yZXNwb25zZS1lbmNvZGluZyIsIG1ldGhvZF9uYW1lLCAiZW5jb2RlZCIpOworICAgIH0KKyAgICBpZiAoc3R5bGUgPT0gcnBjICYmIGlucHV0LT5VUkkgJiYgb3V0cHV0LT5VUkkgJiYgc3RyY21wKGlucHV0LT5VUkksIG91dHB1dC0+VVJJKSkKKyAgICAgIGZwcmludGYoc3RyZWFtLCBzY2hlbWFmb3JtYXQsIHR5cGVzLm5zcHJlZml4KE5VTEwsIG91dHB1dC0+VVJJKSwgIm5hbWVzcGFjZSIsIG91dHB1dC0+VVJJKTsKKyAgfQorICBpZiAoc29hcEFjdGlvbikKKyAgeyBpZiAoKnNvYXBBY3Rpb24pCisgICAgICBmcHJpbnRmKHN0cmVhbSwgc2VydmljZWZvcm1hdCwgcHJlZml4LCAibWV0aG9kLWFjdGlvbiIsIG1ldGhvZF9uYW1lLCBzb2FwQWN0aW9uKTsKKyAgICBlbHNlCisgICAgICBmcHJpbnRmKHN0cmVhbSwgc2VydmljZWZvcm1hdCwgcHJlZml4LCAibWV0aG9kLWFjdGlvbiIsIG1ldGhvZF9uYW1lLCAiXCJcIiIpOworICB9CisgIGZvciAodmVjdG9yPE1lc3NhZ2UqPjo6Y29uc3RfaXRlcmF0b3IgbWVzc2FnZSA9IGZhdWx0LmJlZ2luKCk7IG1lc3NhZ2UgIT0gZmF1bHQuZW5kKCk7ICsrbWVzc2FnZSkKKyAgeyBpZiAoKCptZXNzYWdlKS0+bWVzc2FnZSAmJiAoKm1lc3NhZ2UpLT5tZXNzYWdlLT5uYW1lKQorICAgICAgZnByaW50ZihzdHJlYW0sIHNlcnZpY2Vmb3JtYXQsIHByZWZpeCwgIm1ldGhvZC1mYXVsdCIsIG1ldGhvZF9uYW1lLCAoKm1lc3NhZ2UpLT5uYW1lKTsKKyAgfQorICBpZiAoaW5wdXQtPm11bHRpcGFydFJlbGF0ZWQpCisgIHsgZm9yICh2ZWN0b3I8bWltZV9fcGFydD46OmNvbnN0X2l0ZXJhdG9yIGlucHV0bWltZSA9IGlucHV0LT5tdWx0aXBhcnRSZWxhdGVkLT5wYXJ0LmJlZ2luKCk7IGlucHV0bWltZSAhPSBpbnB1dC0+bXVsdGlwYXJ0UmVsYXRlZC0+cGFydC5lbmQoKTsgKytpbnB1dG1pbWUpCisgICAgeyBmb3IgKHZlY3Rvcjxzb2FwX19oZWFkZXI+Ojpjb25zdF9pdGVyYXRvciBpbnB1dGhlYWRlciA9ICgqaW5wdXRtaW1lKS5zb2FwX19oZWFkZXJfLmJlZ2luKCk7IGlucHV0aGVhZGVyICE9ICgqaW5wdXRtaW1lKS5zb2FwX19oZWFkZXJfLmVuZCgpOyArK2lucHV0aGVhZGVyKQorICAgICAgeyBpZiAoKCppbnB1dGhlYWRlcikucGFydCkKKyAgICAgICAgeyBpZiAoKCppbnB1dGhlYWRlcikudXNlID09IGVuY29kZWQgJiYgKCppbnB1dGhlYWRlcikubmFtZXNwYWNlXykKKyAgICAgICAgICAgIGZwcmludGYoc3RyZWFtLCBzZXJ2aWNlZm9ybWF0LCBwcmVmaXgsICJtZXRob2QtaW5wdXQtaGVhZGVyLXBhcnQiLCBtZXRob2RfbmFtZSwgdHlwZXMuYW5hbWUoTlVMTCwgKCppbnB1dGhlYWRlcikubmFtZXNwYWNlXywgKCppbnB1dGhlYWRlcikucGFydCkpOworICAgICAgICAgIGVsc2UgaWYgKCgqaW5wdXRoZWFkZXIpLnBhcnRQdHIoKSAmJiAoKmlucHV0aGVhZGVyKS5wYXJ0UHRyKCktPmVsZW1lbnQpCisgICAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgc2VydmljZWZvcm1hdCwgcHJlZml4LCAibWV0aG9kLWlucHV0LWhlYWRlci1wYXJ0IiwgbWV0aG9kX25hbWUsIHR5cGVzLmFuYW1lKE5VTEwsIE5VTEwsICgqaW5wdXRoZWFkZXIpLnBhcnRQdHIoKS0+ZWxlbWVudCkpOworICAgICAgICB9CisgICAgICB9CisgICAgICBmb3IgKHZlY3RvcjxtaW1lX19jb250ZW50Pjo6Y29uc3RfaXRlcmF0b3IgY29udGVudCA9ICgqaW5wdXRtaW1lKS5jb250ZW50LmJlZ2luKCk7IGNvbnRlbnQgIT0gKCppbnB1dG1pbWUpLmNvbnRlbnQuZW5kKCk7ICsrY29udGVudCkKKyAgICAgICAgaWYgKCgqY29udGVudCkudHlwZSkKKyAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgc2VydmljZWZvcm1hdCwgcHJlZml4LCAibWV0aG9kLWlucHV0LW1pbWUtdHlwZSIsIG1ldGhvZF9uYW1lLCAoKmNvbnRlbnQpLnR5cGUpOworICAgIH0KKyAgfQorICAvLyBUT0RPOiBhZGQgaGVhZGVyZmF1bHQgZGlyZWN0aXZlcworICBmb3IgKHZlY3Rvcjxzb2FwX19oZWFkZXI+Ojpjb25zdF9pdGVyYXRvciBpbnB1dGhlYWRlciA9IGlucHV0LT5oZWFkZXIuYmVnaW4oKTsgaW5wdXRoZWFkZXIgIT0gaW5wdXQtPmhlYWRlci5lbmQoKTsgKytpbnB1dGhlYWRlcikKKyAgeyBpZiAoKCppbnB1dGhlYWRlcikucGFydCkKKyAgICB7IGlmICgoKmlucHV0aGVhZGVyKS51c2UgPT0gZW5jb2RlZCAmJiAoKmlucHV0aGVhZGVyKS5uYW1lc3BhY2VfKQorICAgICAgICBmcHJpbnRmKHN0cmVhbSwgc2VydmljZWZvcm1hdCwgcHJlZml4LCAibWV0aG9kLWlucHV0LWhlYWRlci1wYXJ0IiwgbWV0aG9kX25hbWUsIHR5cGVzLmFuYW1lKE5VTEwsICgqaW5wdXRoZWFkZXIpLm5hbWVzcGFjZV8sICgqaW5wdXRoZWFkZXIpLnBhcnQpKTsKKyAgICAgIGVsc2UgaWYgKCgqaW5wdXRoZWFkZXIpLnBhcnRQdHIoKSAmJiAoKmlucHV0aGVhZGVyKS5wYXJ0UHRyKCktPmVsZW1lbnQpCisgICAgICAgIGZwcmludGYoc3RyZWFtLCBzZXJ2aWNlZm9ybWF0LCBwcmVmaXgsICJtZXRob2QtaW5wdXQtaGVhZGVyLXBhcnQiLCBtZXRob2RfbmFtZSwgdHlwZXMuYW5hbWUoTlVMTCwgTlVMTCwgKCppbnB1dGhlYWRlcikucGFydFB0cigpLT5lbGVtZW50KSk7CisgICAgfQorICB9CisgIGlmIChvdXRwdXQpCisgIHsgaWYgKG91dHB1dC0+bXVsdGlwYXJ0UmVsYXRlZCkKKyAgICB7IGZvciAodmVjdG9yPG1pbWVfX3BhcnQ+Ojpjb25zdF9pdGVyYXRvciBvdXRwdXRtaW1lID0gb3V0cHV0LT5tdWx0aXBhcnRSZWxhdGVkLT5wYXJ0LmJlZ2luKCk7IG91dHB1dG1pbWUgIT0gb3V0cHV0LT5tdWx0aXBhcnRSZWxhdGVkLT5wYXJ0LmVuZCgpOyArK291dHB1dG1pbWUpCisgICAgICB7IGZvciAodmVjdG9yPHNvYXBfX2hlYWRlcj46OmNvbnN0X2l0ZXJhdG9yIG91dHB1dGhlYWRlciA9ICgqb3V0cHV0bWltZSkuc29hcF9faGVhZGVyXy5iZWdpbigpOyBvdXRwdXRoZWFkZXIgIT0gKCpvdXRwdXRtaW1lKS5zb2FwX19oZWFkZXJfLmVuZCgpOyArK291dHB1dGhlYWRlcikKKyAgICAgICAgeyBpZiAoKCpvdXRwdXRoZWFkZXIpLnBhcnQpCisgICAgICAgICAgeyBpZiAoKCpvdXRwdXRoZWFkZXIpLnVzZSA9PSBlbmNvZGVkICYmICgqb3V0cHV0aGVhZGVyKS5uYW1lc3BhY2VfKQorICAgICAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgc2VydmljZWZvcm1hdCwgcHJlZml4LCAibWV0aG9kLW91dHB1dC1oZWFkZXItcGFydCIsIG1ldGhvZF9uYW1lLCB0eXBlcy5hbmFtZShOVUxMLCAoKm91dHB1dGhlYWRlcikubmFtZXNwYWNlXywgKCpvdXRwdXRoZWFkZXIpLnBhcnQpKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCgqb3V0cHV0aGVhZGVyKS5wYXJ0UHRyKCkgJiYgKCpvdXRwdXRoZWFkZXIpLnBhcnRQdHIoKS0+ZWxlbWVudCkKKyAgICAgICAgICAgICAgZnByaW50ZihzdHJlYW0sIHNlcnZpY2Vmb3JtYXQsIHByZWZpeCwgIm1ldGhvZC1vdXRwdXQtaGVhZGVyLXBhcnQiLCBtZXRob2RfbmFtZSwgdHlwZXMuYW5hbWUoTlVMTCwgTlVMTCwgKCpvdXRwdXRoZWFkZXIpLnBhcnRQdHIoKS0+ZWxlbWVudCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKHZlY3RvcjxtaW1lX19jb250ZW50Pjo6Y29uc3RfaXRlcmF0b3IgY29udGVudCA9ICgqb3V0cHV0bWltZSkuY29udGVudC5iZWdpbigpOyBjb250ZW50ICE9ICgqb3V0cHV0bWltZSkuY29udGVudC5lbmQoKTsgKytjb250ZW50KQorICAgICAgICAgIGlmICgoKmNvbnRlbnQpLnR5cGUpCisgICAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgc2VydmljZWZvcm1hdCwgcHJlZml4LCAibWV0aG9kLW91dHB1dC1taW1lLXR5cGUiLCBtZXRob2RfbmFtZSwgKCpjb250ZW50KS50eXBlKTsKKyAgICAgIH0KKyAgICB9CisgICAgZm9yICh2ZWN0b3I8c29hcF9faGVhZGVyPjo6Y29uc3RfaXRlcmF0b3Igb3V0cHV0aGVhZGVyID0gb3V0cHV0LT5oZWFkZXIuYmVnaW4oKTsgb3V0cHV0aGVhZGVyICE9IG91dHB1dC0+aGVhZGVyLmVuZCgpOyArK291dHB1dGhlYWRlcikKKyAgICB7IGlmICgoKm91dHB1dGhlYWRlcikucGFydCkKKyAgICAgIHsgaWYgKCgqb3V0cHV0aGVhZGVyKS51c2UgPT0gZW5jb2RlZCAmJiAoKm91dHB1dGhlYWRlcikubmFtZXNwYWNlXykKKyAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgc2VydmljZWZvcm1hdCwgcHJlZml4LCAibWV0aG9kLW91dHB1dC1oZWFkZXItcGFydCIsIG1ldGhvZF9uYW1lLCB0eXBlcy5hbmFtZShOVUxMLCAoKm91dHB1dGhlYWRlcikubmFtZXNwYWNlXywgKCpvdXRwdXRoZWFkZXIpLnBhcnQpKTsKKyAgICAgICAgZWxzZSBpZiAoKCpvdXRwdXRoZWFkZXIpLnBhcnRQdHIoKSAmJiAoKm91dHB1dGhlYWRlcikucGFydFB0cigpLT5lbGVtZW50KQorICAgICAgICAgIGZwcmludGYoc3RyZWFtLCBzZXJ2aWNlZm9ybWF0LCBwcmVmaXgsICJtZXRob2Qtb3V0cHV0LWhlYWRlci1wYXJ0IiwgbWV0aG9kX25hbWUsIHR5cGVzLmFuYW1lKE5VTEwsIE5VTEwsICgqb3V0cHV0aGVhZGVyKS5wYXJ0UHRyKCktPmVsZW1lbnQpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKG91dHB1dF9uYW1lKQorICB7IGlmIChzdHlsZSA9PSBkb2N1bWVudCkKKyAgICAgIGZsYWcgPSBvdXRwdXQtPm1lc3NhZ2UgJiYgb3V0cHV0LT5tZXNzYWdlLT5wYXJ0LnNpemUoKSA9PSAxOworICAgIGVsc2UgaWYgKCF3ZmxhZykKKyAgICAgIGZsYWcgPSBvdXRwdXQtPm1lc3NhZ2UgJiYgb3V0cHV0LT51c2UgPT0gZW5jb2RlZCAmJiBvdXRwdXQtPm1lc3NhZ2UtPnBhcnQuc2l6ZSgpID09IDEgJiYgISgqb3V0cHV0LT5tZXNzYWdlLT5wYXJ0LmJlZ2luKCkpLnNpbXBsZVR5cGVQdHIoKSAmJiAhKCpvdXRwdXQtPm1lc3NhZ2UtPnBhcnQuYmVnaW4oKSkuY29tcGxleFR5cGVQdHIoKTsKKyAgICBpZiAoZmxhZyAmJiBpbnB1dC0+bWVzc2FnZSAmJiAoKm91dHB1dC0+bWVzc2FnZS0+cGFydC5iZWdpbigpKS5lbGVtZW50KQorICAgICAgZm9yICh2ZWN0b3I8d3NkbF9fcGFydD46OmNvbnN0X2l0ZXJhdG9yIHBhcnQgPSBpbnB1dC0+bWVzc2FnZS0+cGFydC5iZWdpbigpOyBwYXJ0ICE9IGlucHV0LT5tZXNzYWdlLT5wYXJ0LmVuZCgpOyArK3BhcnQpCisgICAgICAgIGlmICgoKnBhcnQpLmVsZW1lbnQgJiYgIXN0cmNtcCgoKnBhcnQpLmVsZW1lbnQsICgqb3V0cHV0LT5tZXNzYWdlLT5wYXJ0LmJlZ2luKCkpLmVsZW1lbnQpKQorICAgICAgICAgIGZsYWcgPSBmYWxzZTsKKyAgfQorICBmcHJpbnRmKHN0cmVhbSwgImludCAlcygiLCBpbnB1dF9uYW1lKTsKKyAgaW5wdXQtPmdlbmVyYXRlKHR5cGVzLCAiLCIsIGFub255bW91cywgdHJ1ZSwgZmFsc2UpOworICBpZiAob3V0cHV0X25hbWUpCisgIHsgaWYgKGZsYWcpCisgICAgeyBpZiAoc3R5bGUgPT0gZG9jdW1lbnQpCisgICAgICB7IC8vIFNob3J0Y3V0OiBkbyBub3QgZ2VuZXJhdGUgd3JhcHBlciBzdHJ1Y3QKKyAgICAgICAgb3V0cHV0LT5nZW5lcmF0ZSh0eXBlcywgIiIsIGFub255bW91cywgdHJ1ZSwgdHJ1ZSk7CisgICAgICB9CisgICAgICBlbHNlIGlmICgoKm91dHB1dC0+bWVzc2FnZS0+cGFydC5iZWdpbigpKS5uYW1lKQorICAgICAgeyBmcHJpbnRmKHN0cmVhbSwgIlxuIik7CisgICAgICAgIGZwcmludGYoc3RyZWFtLCBhbm9ueW1vdXMgPyBhbm9uZm9ybWF0IDogcGFyYWZvcm1hdCwgdHlwZXMudG5hbWUoTlVMTCwgTlVMTCwgKCpvdXRwdXQtPm1lc3NhZ2UtPnBhcnQuYmVnaW4oKSkudHlwZSksIGNmbGFnID8gIioiIDogIiYiLCB0eXBlcy5hbmFtZShOVUxMLCBOVUxMLCAoKm91dHB1dC0+bWVzc2FnZS0+cGFydC5iZWdpbigpKS5uYW1lKSwgIiIpOworICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIlx0Ly8vPCBSZXNwb25zZSBwYXJhbWV0ZXIiKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgZnByaW50ZihzdHJlYW0sICJcbiAgICBzdHJ1Y3QgJS0yOHMlcyIsIG91dHB1dF9uYW1lLCBjZmxhZyA/ICIqIiA6ICImIik7CisgICAgICBmcHJpbnRmKHN0cmVhbSwgIlx0Ly8vPCBSZXNwb25zZSBzdHJ1Y3QgcGFyYW1ldGVyIik7CisgICAgfQorICAgIGZwcmludGYoc3RyZWFtLCAiXG4pO1xuIik7CisgIH0KKyAgZWxzZQorICAgIGZwcmludGYoc3RyZWFtLCAiXG4gICAgdm9pZFx0Ly8vPCBPbmUtd2F5IG1lc3NhZ2U6IG5vIHJlc3BvbnNlIHBhcmFtZXRlclxuKTtcbiIpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCU1lc3NhZ2UgbWV0aG9kcworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgTWVzc2FnZTo6Z2VuZXJhdGUoVHlwZXMgJnR5cGVzLCBjb25zdCBjaGFyICpzZXAsIGJvb2wgYW5vbnltb3VzLCBib29sIHJlbWFyaywgYm9vbCByZXNwb25zZSkKK3sgaWYgKG1lc3NhZ2UpCisgIHsgZm9yICh2ZWN0b3I8d3NkbF9fcGFydD46OmNvbnN0X2l0ZXJhdG9yIHBhcnQgPSBtZXNzYWdlLT5wYXJ0LmJlZ2luKCk7IHBhcnQgIT0gbWVzc2FnZS0+cGFydC5lbmQoKTsgKytwYXJ0KQorICAgIHsgaWYgKCEoKnBhcnQpLm5hbWUpCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3I6IG5vIHBhcnQgbmFtZSBpbiBtZXNzYWdlICclcydcbiIsIG1lc3NhZ2UtPm5hbWU/bWVzc2FnZS0+bmFtZToiIik7CisgICAgICBlbHNlIGlmICghYm9keV9wYXJ0cyB8fCBzb2FwX3N0cnNlYXJjaChib2R5X3BhcnRzLCAoKnBhcnQpLm5hbWUpKQorICAgICAgeyBpZiAocmVtYXJrICYmICgqcGFydCkuZG9jdW1lbnRhdGlvbikKKyAgICAgICAgICBjb21tZW50KCIiLCAoKnBhcnQpLm5hbWUsICJwYXJhbWV0ZXIiLCAoKnBhcnQpLmRvY3VtZW50YXRpb24pOworICAgICAgICBlbHNlCisgICAgICAgICAgZnByaW50ZihzdHJlYW0sICJcbiIpOworCWlmICgoKnBhcnQpLmVsZW1lbnQpCisgICAgICAgIHsgaWYgKCgqcGFydCkuZWxlbWVudFB0cigpKQorICAgICAgICAgIHsgY29uc3QgY2hhciAqbmFtZSwgKnR5cGUsICpVUkk7CisgICAgICAgICAgICBuYW1lID0gKCpwYXJ0KS5lbGVtZW50UHRyKCktPm5hbWU7CisgICAgICAgICAgICAvKiBjb21tZW50IG91dCB0byB1c2UgYSB0eXBlIHRoYXQgcmVmZXJzIHRvIGFuIGVsZW1lbnQgZGVmaW5lZCB3aXRoIHR5cGVkZWYgKi8KKyAgICAgICAgICAgIGlmICgoKnBhcnQpLmVsZW1lbnRQdHIoKS0+dHlwZSkKKyAgICAgICAgICAgICAgdHlwZSA9ICgqcGFydCkuZWxlbWVudFB0cigpLT50eXBlOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgLyogKi8KKyAgICAgICAgICAgICAgdHlwZSA9IG5hbWU7CisgICAgICAgICAgICBpZiAoKCpwYXJ0KS5lbGVtZW50UHRyKCktPnNjaGVtYVB0cigpKQorICAgICAgICAgICAgICBVUkkgPSAoKnBhcnQpLmVsZW1lbnRQdHIoKS0+c2NoZW1hUHRyKCktPnRhcmdldE5hbWVzcGFjZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgVVJJID0gTlVMTDsKKwkgICAgaWYgKHJlc3BvbnNlKQorICAgICAgICAgICAgeyBjb25zdCBjaGFyICp0ID0gdHlwZXMudG5hbWUoTlVMTCwgVVJJLCB0eXBlKTsKKwkgICAgICBmcHJpbnRmKHN0cmVhbSwgYW5vbnltb3VzID8gYW5vbmZvcm1hdCA6IHBhcmFmb3JtYXQsIHQsIHN0cmNocih0LCAnKicpICE9IE5VTEwgPyAiICIgOiBjZmxhZyA/ICIqIiA6ICImIiwgdHlwZXMuYW5hbWUoTlVMTCwgVVJJLCBuYW1lKSwgc2VwKTsKKwkgICAgICBpZiAocmVtYXJrKQorCSAgICAgICAgZnByaW50ZihzdHJlYW0sICJcdC8vLzwgUmVzcG9uc2UgcGFyYW1ldGVyIik7CisJICAgIH0KKwkgICAgZWxzZQorICAgICAgICAgICAgeyBmcHJpbnRmKHN0cmVhbSwgYW5vbnltb3VzID8gYW5vbmZvcm1hdCA6IHBhcmFmb3JtYXQsIHR5cGVzLnBuYW1lKGZhbHNlLCBOVUxMLCBVUkksIHR5cGUpLCAiICIsIHR5cGVzLmFuYW1lKE5VTEwsIFVSSSwgbmFtZSksIHNlcCk7CisJICAgICAgaWYgKHJlbWFyayAmJiAqc2VwID09ICcsJykKKwkgICAgICAgIGZwcmludGYoc3RyZWFtLCAiXHQvLy88IFJlcXVlc3QgcGFyYW1ldGVyIik7CisJICAgIH0KKyAgICAgICAgICB9CisJICBlbHNlCisgICAgICAgICAgeyBmcHJpbnRmKHN0cmVhbSwgYW5vbnltb3VzID8gYW5vbmZvcm1hdCA6IHBhcmFmb3JtYXQsIHR5cGVzLnBuYW1lKGZhbHNlLCBOVUxMLCBOVUxMLCAoKnBhcnQpLmVsZW1lbnQpLCAiICIsIHR5cGVzLmFuYW1lKE5VTEwsIE5VTEwsICgqcGFydCkuZWxlbWVudCksIHNlcCk7CisJICAgIGlmIChyZW1hcmspCisgICAgICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiXHQvLy88IFRPRE86IENoZWNrIGVsZW1lbnQgdHlwZSAoaW1wb3J0ZWQgdHlwZSkiKTsKKwkgIH0KKwl9CisgICAgICAgIGVsc2UgaWYgKCgqcGFydCkudHlwZSkKKyAgICAgICAgeyBpZiAodXNlID09IGxpdGVyYWwpCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IHBhcnQgJyVzJyB1c2VzIGxpdGVyYWwgc3R5bGUgYW5kIG11c3QgcmVmZXIgdG8gYW4gZWxlbWVudCByYXRoZXIgdGhhbiBhIHR5cGVcbiIsICgqcGFydCkubmFtZSk7CisJICBpZiAocmVzcG9uc2UpCisgICAgICAgICAgeyBjb25zdCBjaGFyICp0ID0gdHlwZXMudG5hbWUoTlVMTCwgTlVMTCwgKCpwYXJ0KS50eXBlKTsKKwkgICAgZnByaW50ZihzdHJlYW0sIGFub255bW91cyA/IGFub25mb3JtYXQgOiBwYXJhZm9ybWF0LCB0LCBzdHJjaHIodCwgJyonKSAhPSBOVUxMID8gIiAiIDogY2ZsYWcgPyAiKiIgOiAiJiIsIHR5cGVzLmFuYW1lKE5VTEwsIE5VTEwsICgqcGFydCkubmFtZSksIHNlcCk7CisJICAgIGlmIChyZW1hcmspCisgICAgICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiXHQvLy88IFJlc3BvbnNlIHBhcmFtZXRlciIpOworCSAgfQorICAgICAgICAgIGVsc2UKKwkgIHsgZnByaW50ZihzdHJlYW0sIGFub255bW91cyA/IGFub25mb3JtYXQgOiBwYXJhZm9ybWF0LCB0eXBlcy5wbmFtZShmYWxzZSwgTlVMTCwgTlVMTCwgKCpwYXJ0KS50eXBlKSwgIiAiLCB0eXBlcy5hbmFtZShOVUxMLCBOVUxMLCAoKnBhcnQpLm5hbWUpLCBzZXApOworCSAgICBpZiAocmVtYXJrICYmICpzZXAgPT0gJywnKQorICAgICAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIlx0Ly8vPCBSZXF1ZXN0IHBhcmFtZXRlciIpOworCSAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBubyB3c2RsOmRlZmluaXRpb25zL21lc3NhZ2UvcGFydC9AdHlwZSBpbiBwYXJ0ICclcydcbiIsICgqcGFydCkubmFtZSk7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBubyB3c2RsOmRlZmluaXRpb25zL21lc3NhZ2VcbiIpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCU1pc2NlbGxhbmVvdXMKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgdm9pZCBjb21tZW50KGNvbnN0IGNoYXIgKnN0YXJ0LCBjb25zdCBjaGFyICptaWRkbGUsIGNvbnN0IGNoYXIgKmVuZCwgY29uc3QgY2hhciAqdGV4dCkKK3sgaWYgKHRleHQpCisgIHsgaWYgKHN0cmNocih0ZXh0LCAnXHInKSB8fCBzdHJjaHIodGV4dCwgJ1xuJykpCisgICAgICBmcHJpbnRmKHN0cmVhbSwgIlxuLyoqICVzICVzICVzIGRvY3VtZW50YXRpb246XG4lc1xuKi9cblxuIiwgc3RhcnQsIG1pZGRsZSwgZW5kLCB0ZXh0KTsKKyAgICBlbHNlCisgICAgICBmcHJpbnRmKHN0cmVhbSwgIlxuLy8vICVzICVzICVzOiAlc1xuIiwgc3RhcnQsIG1pZGRsZSwgZW5kLCB0ZXh0KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBwYWdlKGNvbnN0IGNoYXIgKnBhZ2UsIGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICp0ZXh0KQoreyBpZiAodGV4dCkKKyAgICBmcHJpbnRmKHN0cmVhbSwgIlxuQHBhZ2UgJXMlcyBcIiVzXCJcbiIsIHBhZ2UsIHRpdGxlLCB0ZXh0KTsKKyAgZWxzZQorICAgIGZwcmludGYoc3RyZWFtLCAiXG5AcGFnZSAlcyVzXG4iLCBwYWdlLCB0aXRsZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNlY3Rpb24oY29uc3QgY2hhciAqc2VjdGlvbiwgY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKnRleHQpCit7IGlmICh0ZXh0KQorICAgIGZwcmludGYoc3RyZWFtLCAiXG5Ac2VjdGlvbiAlcyVzIFwiJXNcIlxuIiwgc2VjdGlvbiwgdGl0bGUsIHRleHQpOworICBlbHNlCisgICAgZnByaW50ZihzdHJlYW0sICJcbkBzZWN0aW9uICVzJXNcbiIsIHNlY3Rpb24sIHRpdGxlKTsKK30KKworc3RhdGljIHZvaWQgYmFubmVyKGNvbnN0IGNoYXIgKnRleHQpCit7IGludCBpOworICBmcHJpbnRmKHN0cmVhbSwgIlxuLyIpOworICBmb3IgKGkgPSAwOyBpIDwgNzg7IGkrKykKKyAgICBmcHV0YygnKicsIHN0cmVhbSk7CisgIGZwcmludGYoc3RyZWFtLCAiXFxcbiAqJTc2cypcbiAqICUtNzVzKlxuIColNzZzKlxuXFwiLCAiIiwgdGV4dCwgIiIpOworICBmb3IgKGkgPSAwOyBpIDwgNzg7IGkrKykKKyAgICBmcHV0YygnKicsIHN0cmVhbSk7CisgIGZwcmludGYoc3RyZWFtLCAiL1xuXG4iKTsKK30KKworc3RhdGljIHZvaWQgaWRlbnQoKQoreyB0aW1lX3QgdCA9IHRpbWUoTlVMTCksICpwID0gJnQ7CisgIGNoYXIgdG1wWzI1Nl07CisgIGludCBpOworICBzdHJmdGltZSh0bXAsIDI1NiwgIiVZLSVtLSVkICVIOiVNOiVTIEdNVCIsIGdtdGltZShwKSk7CisgIGZwcmludGYoc3RyZWFtLCAiLyogJXNcbiAgIEdlbmVyYXRlZCBieSB3c2RsMmggIlZFUlNJT04iIGZyb20gIiwgb3V0ZmlsZT9vdXRmaWxlOiIiKTsKKyAgaWYgKGluZmlsZXMpCisgIHsgZm9yIChpID0gMDsgaSA8IGluZmlsZXM7IGkrKykKKyAgICAgIGZwcmludGYoc3RyZWFtLCAiJXMgIiwgaW5maWxlW2ldKTsKKyAgfQorICBlbHNlCisgICAgZnByaW50ZihzdHJlYW0sICIoc3RkaW4pICIpOworICBmcHJpbnRmKHN0cmVhbSwgImFuZCAlc1xuICAgJXNcbiAgIENvcHlyaWdodCAoQykgMjAwMS0yMDA1IFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICBUaGlzIHBhcnQgb2YgdGhlIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2VzOlxuICAgR1BMIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS5cbiovXG5cbiIsIG1hcGZpbGUsIHRtcCk7Cit9CisKK3N0YXRpYyB2b2lkIHRleHQoY29uc3QgY2hhciAqdGV4dCkKK3sgY29uc3QgY2hhciAqcyA9IHRleHQ7CisgIGlmICghcykKKyAgICByZXR1cm47CisgIHdoaWxlICgqcykKKyAgeyBzd2l0Y2ggKCpzKQorICAgIHsgY2FzZSAnXG4nOgorICAgICAgY2FzZSAnXHQnOgorICAgICAgY2FzZSAnICc6CisJZnB1dGMoKnMsIHN0cmVhbSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnLyc6CisJZnB1dGMoKnMsIHN0cmVhbSk7CisgICAgICAgIGlmIChzWzFdID09ICcqJykKKwkgIGZwdXRjKCcgJywgc3RyZWFtKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICcqJzoKKwlmcHV0Yygqcywgc3RyZWFtKTsKKyAgICAgICAgaWYgKHNbMV0gPT0gJy8nKQorCSAgZnB1dGMoJyAnLCBzdHJlYW0pOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmICgqcyA+IDMyKQorCSAgZnB1dGMoKnMsIHN0cmVhbSk7CisgICAgfQorICAgIHMrKzsKKyAgfQorICBmcHV0YygnXG4nLCBzdHJlYW0pOworfQpkaWZmIC0tZ2l0IGEvd3NkbC9zZXJ2aWNlLmggYi93c2RsL3NlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWMyZTlkCi0tLSAvZGV2L251bGwKKysrIGIvd3NkbC9zZXJ2aWNlLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisKK3NlcnZpY2UuaAorCitTZXJ2aWNlIHN0cnVjdHVyZXMuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzOgorR1BMIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyovCisKKyNpZm5kZWYgU0VSVklDRV9ICisjZGVmaW5lIFNFUlZJQ0VfSAorCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKyNpbmNsdWRlICJ3c2RsSC5oIgorCitjbGFzcyBNZXNzYWdlCit7IHB1YmxpYzoKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIGNvbnN0IGNoYXIgKlVSSTsKKyAgICBzb2FwX191c2VDaG9pY2UgdXNlOworICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nU3R5bGU7CisgICAgd3NkbF9fbWVzc2FnZSAqbWVzc2FnZTsKKyAgICBjb25zdCBjaGFyICpib2R5X3BhcnRzOworICAgIHdzZGxfX3BhcnQgKnBhcnQ7CisgICAgdmVjdG9yPHNvYXBfX2hlYWRlcj4gaGVhZGVyOworICAgIG1pbWVfX211bHRpcGFydFJlbGF0ZWQgKm11bHRpcGFydFJlbGF0ZWQ7CS8vIE1JTUUKKyAgICBtaW1lX19jb250ZW50ICpjb250ZW50OwkJCS8vIE1JTUUKKyAgICBjb25zdCBjaGFyICpsYXlvdXQ7CQkJCS8vIERJTUUKKyAgICBjb25zdCBjaGFyICpkb2N1bWVudGF0aW9uOworICAgIGNvbnN0IGNoYXIgKmV4dF9kb2N1bWVudGF0aW9uOworICAgIHZvaWQgZ2VuZXJhdGUoVHlwZXMmLCBjb25zdCBjaGFyICpzZXAsIGJvb2wgYW5vbnltb3VzLCBib29sIHJlbWFyaywgYm9vbCByZXNwb25zZSk7Cit9OworCit0eXBlZGVmIG1hcDxjb25zdCBjaGFyKiwgTWVzc2FnZSosIGx0c3RyPiBNYXBPZlN0cmluZ1RvTWVzc2FnZTsKKworY2xhc3MgT3BlcmF0aW9uCit7IHB1YmxpYzoKKyAgICBjb25zdCBjaGFyICpwcmVmaXg7CisgICAgY29uc3QgY2hhciAqVVJJOworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgc29hcF9fc3R5bGVDaG9pY2Ugc3R5bGU7CisgICAgY29uc3QgY2hhciAqcGFyYW1ldGVyT3JkZXI7CisgICAgY29uc3QgY2hhciAqc29hcEFjdGlvbjsKKyAgICBjb25zdCBjaGFyICppbnB1dF9uYW1lOworICAgIGNvbnN0IGNoYXIgKm91dHB1dF9uYW1lOworICAgIE1lc3NhZ2UgKmlucHV0OyAJCQkvLyBuYW1lLCB1c2UsIGFuZCBwYXJ0cworICAgIE1lc3NhZ2UgKm91dHB1dDsJCQkvLyBuYW1lLCB1c2UsIGFuZCBwYXJ0cworICAgIHZlY3RvcjxNZXNzYWdlKj4gZmF1bHQ7CisgICAgY29uc3QgY2hhciAqZG9jdW1lbnRhdGlvbjsKKyAgICBjb25zdCBjaGFyICpvcGVyYXRpb25fZG9jdW1lbnRhdGlvbjsKKyAgICB2b2lkIGdlbmVyYXRlKFR5cGVzJik7Cit9OworCitjbGFzcyBTZXJ2aWNlCit7IHB1YmxpYzoKKyAgICBjb25zdCBjaGFyICpwcmVmaXg7CQkJLy8gYSBnU09BUCBzZXJ2aWNlIGhhcyBhIHVuaXF1ZSBuYW1lc3BhY2UKKyAgICBjb25zdCBjaGFyICpVUkk7CisgICAgY29uc3QgY2hhciAqbmFtZTsJCQkvLyBiaW5kaW5nIG5hbWUKKyAgICBjb25zdCBjaGFyICp0eXBlOwkJCS8vIHBvcnRUeXBlCisgICAgY29uc3QgY2hhciAqdHJhbnNwb3J0OwkJLy8gYmluZGluZyB0cmFuc3BvcnQKKyAgICBTZXRPZlN0cmluZyBsb2NhdGlvbjsJCS8vIFdTREwgbWF5IHNwZWNpZnkgbXVsdGlwbGUgbG9jYXRpb25zIHZpYSA8UG9ydD4gLT4gPEJpbmRpbmc+CisgICAgdmVjdG9yPE9wZXJhdGlvbio+IG9wZXJhdGlvbjsKKyAgICBNYXBPZlN0cmluZ1RvTWVzc2FnZSBoZWFkZXI7CisgICAgTWFwT2ZTdHJpbmdUb01lc3NhZ2UgaGVhZGVyZmF1bHQ7CisgICAgTWFwT2ZTdHJpbmdUb01lc3NhZ2UgZmF1bHQ7CisgICAgTWFwT2ZTdHJpbmdUb1N0cmluZyBzZXJ2aWNlX2RvY3VtZW50YXRpb247CisgICAgTWFwT2ZTdHJpbmdUb1N0cmluZyBwb3J0X2RvY3VtZW50YXRpb247CisgICAgTWFwT2ZTdHJpbmdUb1N0cmluZyBiaW5kaW5nX2RvY3VtZW50YXRpb247CisgICAgU2VydmljZSgpOworICAgIHZvaWQgZ2VuZXJhdGUoVHlwZXMmKTsKK307CisKK3R5cGVkZWYgbWFwPGNvbnN0IGNoYXIqLCBTZXJ2aWNlKiwgbHRzdHI+IE1hcE9mU3RyaW5nVG9TZXJ2aWNlOworCitjbGFzcyBEZWZpbml0aW9ucworeyBwdWJsaWM6CisgICAgVHlwZXMgdHlwZXM7CQkJCS8vIHRvIHByb2Nlc3Mgc2NoZW1hIHR5cGUgaW5mb3JtYXRpb24KKyAgICBNYXBPZlN0cmluZ1RvU2VydmljZSBzZXJ2aWNlczsJCS8vIHNlcnZpY2UgaW5mb3JtYXRpb24gZ2F0aGVyZWQKKyAgICBEZWZpbml0aW9ucygpOworICAgIHZvaWQgY29sbGVjdChjb25zdCB3c2RsX19kZWZpbml0aW9ucyYpOworICAgIHZvaWQgY29tcGlsZShjb25zdCB3c2RsX19kZWZpbml0aW9ucyYpOworICBwcml2YXRlOgorICAgIHZvaWQgYW5hbHl6ZShjb25zdCB3c2RsX19kZWZpbml0aW9ucyYpOworICAgIHZvaWQgZ2VuZXJhdGUoKTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvd3NkbC9zb2FwLmNwcCBiL3dzZGwvc29hcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE1NzAxNAotLS0gL2Rldi9udWxsCisrKyBiL3dzZGwvc29hcC5jcHAKQEAgLTAsMCArMSwxODcgQEAKKy8qCisKK3NvYXAuY3BwCisKK1dTREwvU09BUCBiaW5kaW5nIHNjaGVtYQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR3byBsaWNlbnNlczoKK0dQTCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqLworCisjaW5jbHVkZSAid3NkbEguaCIJCS8vIGNhbm5vdCBpbmNsdWRlICJzY2hlbWFILmgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2V4dGVybiBjb25zdCBjaGFyICpxbmFtZV90b2tlbihjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXNvYXA6aGVhZGVyCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworaW50IHNvYXBfX2hlYWRlcjo6dHJhdmVyc2Uod3NkbF9fZGVmaW5pdGlvbnMmIGRlZmluaXRpb25zKQoreyBpZiAodmZsYWcpCisgICAgY2VyciA8PCAiQW5hbHl6aW5nIHNvYXAgaGVhZGVyICIgPDwgZW5kbDsKKyAgbWVzc2FnZVJlZiA9IE5VTEw7CisgIHBhcnRSZWYgPSBOVUxMOworICBjb25zdCBjaGFyICp0b2tlbiA9IHFuYW1lX3Rva2VuKG1lc3NhZ2UsIGRlZmluaXRpb25zLnRhcmdldE5hbWVzcGFjZSk7CisgIGlmICh0b2tlbikKKyAgeyBmb3IgKHZlY3Rvcjx3c2RsX19tZXNzYWdlPjo6aXRlcmF0b3IgbWVzc2FnZSA9IGRlZmluaXRpb25zLm1lc3NhZ2UuYmVnaW4oKTsgbWVzc2FnZSAhPSBkZWZpbml0aW9ucy5tZXNzYWdlLmVuZCgpOyArK21lc3NhZ2UpCisgICAgeyBpZiAoKCptZXNzYWdlKS5uYW1lICYmICFzdHJjbXAoKCptZXNzYWdlKS5uYW1lLCB0b2tlbikpCisgICAgICB7IG1lc3NhZ2VSZWYgPSAmKCptZXNzYWdlKTsKKyAgICAgICAgaWYgKHZmbGFnKQorCSAgY2VyciA8PCAiRm91bmQgaGVhZGVyIHBhcnQgIiA8PCAocGFydD9wYXJ0OiIiKSA8PCAiIG1lc3NhZ2UgIiA8PCAodG9rZW4/dG9rZW46IiIpIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsgZm9yICh2ZWN0b3I8d3NkbF9faW1wb3J0Pjo6aXRlcmF0b3IgaW1wb3J0ID0gZGVmaW5pdGlvbnMuaW1wb3J0LmJlZ2luKCk7IGltcG9ydCAhPSBkZWZpbml0aW9ucy5pbXBvcnQuZW5kKCk7ICsraW1wb3J0KQorICAgIHsgd3NkbF9fZGVmaW5pdGlvbnMgKmltcG9ydGRlZmluaXRpb25zID0gKCppbXBvcnQpLmRlZmluaXRpb25zUHRyKCk7CisgICAgICBpZiAoaW1wb3J0ZGVmaW5pdGlvbnMpCisgICAgICB7IHRva2VuID0gcW5hbWVfdG9rZW4obWVzc2FnZSwgaW1wb3J0ZGVmaW5pdGlvbnMtPnRhcmdldE5hbWVzcGFjZSk7CisgICAgICAgIGlmICh0b2tlbikKKyAgICAgICAgeyBmb3IgKHZlY3Rvcjx3c2RsX19tZXNzYWdlPjo6aXRlcmF0b3IgbWVzc2FnZSA9IGltcG9ydGRlZmluaXRpb25zLT5tZXNzYWdlLmJlZ2luKCk7IG1lc3NhZ2UgIT0gaW1wb3J0ZGVmaW5pdGlvbnMtPm1lc3NhZ2UuZW5kKCk7ICsrbWVzc2FnZSkKKyAgICAgICAgICB7IGlmICgoKm1lc3NhZ2UpLm5hbWUgJiYgIXN0cmNtcCgoKm1lc3NhZ2UpLm5hbWUsIHRva2VuKSkKKyAgICAgICAgICAgIHsgbWVzc2FnZVJlZiA9ICYoKm1lc3NhZ2UpOworICAgICAgICAgICAgICBpZiAodmZsYWcpCisJICAgICAgICBjZXJyIDw8ICJGb3VuZCBoZWFkZXIgcGFydCAiIDw8IChwYXJ0P3BhcnQ6IiIpIDw8ICIgbWVzc2FnZSAiIDw8ICh0b2tlbj90b2tlbjoiIikgPDwgZW5kbDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCX0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKG1lc3NhZ2VSZWYpCisgIHsgaWYgKHBhcnQpCisgICAgeyBmb3IgKHZlY3Rvcjx3c2RsX19wYXJ0Pjo6aXRlcmF0b3IgcHQgPSBtZXNzYWdlUmVmLT5wYXJ0LmJlZ2luKCk7IHB0ICE9IG1lc3NhZ2VSZWYtPnBhcnQuZW5kKCk7ICsrcHQpCisgICAgICAgIGlmICgoKnB0KS5uYW1lICYmICFzdHJjbXAoKCpwdCkubmFtZSwgcGFydCkpCisJeyBwYXJ0UmVmID0gJigqcHQpOworCSAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFwYXJ0UmVmKQorICAgICAgY2VyciA8PCAiV2FybmluZzogc29hcCBoZWFkZXIgaGFzIG5vIG1hdGNoaW5nIHBhcnQgaW4gbWVzc2FnZSAiIDw8IChtZXNzYWdlP21lc3NhZ2U6IiIpIDw8ICIgaW4gV1NETCBkZWZpbml0aW9ucyAiIDw8IGRlZmluaXRpb25zLm5hbWUgPDwgIiBuYW1lc3BhY2UgIiA8PCAoZGVmaW5pdGlvbnMudGFyZ2V0TmFtZXNwYWNlP2RlZmluaXRpb25zLnRhcmdldE5hbWVzcGFjZToiIikgPDwgZW5kbDsKKyAgfQorICBlbHNlCisgICAgY2VyciA8PCAiV2FybmluZzogY291bGQgbm90IGZpbmQgaGVhZGVyIHBhcnQgIiA8PCAocGFydD9wYXJ0OiIiKSA8PCAiIG1lc3NhZ2UgIiA8PCAobWVzc2FnZT9tZXNzYWdlOiIiKSA8PCAiIGluIFdTREwgZGVmaW5pdGlvbnMgIiA8PCBkZWZpbml0aW9ucy5uYW1lIDw8ICIgbmFtZXNwYWNlICIgPDwgKGRlZmluaXRpb25zLnRhcmdldE5hbWVzcGFjZT9kZWZpbml0aW9ucy50YXJnZXROYW1lc3BhY2U6IiIpIDw8IGVuZGw7CisgIGZvciAodmVjdG9yPHNvYXBfX2hlYWRlcmZhdWx0Pjo6aXRlcmF0b3IgaSA9IGhlYWRlcmZhdWx0LmJlZ2luKCk7IGkgIT0gaGVhZGVyZmF1bHQuZW5kKCk7ICsraSkKKyAgICAoKmkpLnRyYXZlcnNlKGRlZmluaXRpb25zKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK3ZvaWQgc29hcF9faGVhZGVyOjptZXNzYWdlUHRyKHdzZGxfX21lc3NhZ2UgKm1lc3NhZ2UpCit7IG1lc3NhZ2VSZWYgPSBtZXNzYWdlOworfQorCit3c2RsX19tZXNzYWdlICpzb2FwX19oZWFkZXI6Om1lc3NhZ2VQdHIoKSBjb25zdAoreyByZXR1cm4gbWVzc2FnZVJlZjsKK30KKwordm9pZCBzb2FwX19oZWFkZXI6OnBhcnRQdHIod3NkbF9fcGFydCAqcGFydCkKK3sgcGFydFJlZiA9IHBhcnQ7Cit9CisKK3dzZGxfX3BhcnQgKnNvYXBfX2hlYWRlcjo6cGFydFB0cigpIGNvbnN0Cit7IHJldHVybiBwYXJ0UmVmOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCXNvYXA6aGVhZGVyZmF1bHQKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitpbnQgc29hcF9faGVhZGVyZmF1bHQ6OnRyYXZlcnNlKHdzZGxfX2RlZmluaXRpb25zJiBkZWZpbml0aW9ucykKK3sgaWYgKHZmbGFnKQorICAgIGNlcnIgPDwgIkFuYWx5emluZyBzb2FwIGhlYWRlcmZhdWx0ICIgPDwgZW5kbDsKKyAgbWVzc2FnZVJlZiA9IE5VTEw7CisgIHBhcnRSZWYgPSBOVUxMOworICBjb25zdCBjaGFyICp0b2tlbiA9IHFuYW1lX3Rva2VuKG1lc3NhZ2UsIGRlZmluaXRpb25zLnRhcmdldE5hbWVzcGFjZSk7CisgIGlmICh0b2tlbikKKyAgeyBmb3IgKHZlY3Rvcjx3c2RsX19tZXNzYWdlPjo6aXRlcmF0b3IgbWVzc2FnZSA9IGRlZmluaXRpb25zLm1lc3NhZ2UuYmVnaW4oKTsgbWVzc2FnZSAhPSBkZWZpbml0aW9ucy5tZXNzYWdlLmVuZCgpOyArK21lc3NhZ2UpCisgICAgeyBpZiAoKCptZXNzYWdlKS5uYW1lICYmICFzdHJjbXAoKCptZXNzYWdlKS5uYW1lLCB0b2tlbikpCisgICAgICB7IG1lc3NhZ2VSZWYgPSAmKCptZXNzYWdlKTsKKyAgICAgICAgaWYgKHZmbGFnKQorCSAgY2VyciA8PCAiRm91bmQgaGVhZGVyZmF1bHQgcGFydCAiIDw8IChwYXJ0P3BhcnQ6IiIpIDw8ICIgbWVzc2FnZSAiIDw8ICh0b2tlbj90b2tlbjoiIikgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyAgeyBmb3IgKHZlY3Rvcjx3c2RsX19pbXBvcnQ+OjppdGVyYXRvciBpbXBvcnQgPSBkZWZpbml0aW9ucy5pbXBvcnQuYmVnaW4oKTsgaW1wb3J0ICE9IGRlZmluaXRpb25zLmltcG9ydC5lbmQoKTsgKytpbXBvcnQpCisgICAgeyB3c2RsX19kZWZpbml0aW9ucyAqaW1wb3J0ZGVmaW5pdGlvbnMgPSAoKmltcG9ydCkuZGVmaW5pdGlvbnNQdHIoKTsKKyAgICAgIGlmIChpbXBvcnRkZWZpbml0aW9ucykKKyAgICAgIHsgdG9rZW4gPSBxbmFtZV90b2tlbihtZXNzYWdlLCBpbXBvcnRkZWZpbml0aW9ucy0+dGFyZ2V0TmFtZXNwYWNlKTsKKyAgICAgICAgaWYgKHRva2VuKQorICAgICAgICB7IGZvciAodmVjdG9yPHdzZGxfX21lc3NhZ2U+OjppdGVyYXRvciBtZXNzYWdlID0gaW1wb3J0ZGVmaW5pdGlvbnMtPm1lc3NhZ2UuYmVnaW4oKTsgbWVzc2FnZSAhPSBpbXBvcnRkZWZpbml0aW9ucy0+bWVzc2FnZS5lbmQoKTsgKyttZXNzYWdlKQorICAgICAgICAgIHsgaWYgKCgqbWVzc2FnZSkubmFtZSAmJiAhc3RyY21wKCgqbWVzc2FnZSkubmFtZSwgdG9rZW4pKQorICAgICAgICAgICAgeyBtZXNzYWdlUmVmID0gJigqbWVzc2FnZSk7CisgICAgICAgICAgICAgIGlmICh2ZmxhZykKKwkgICAgICAgIGNlcnIgPDwgIkZvdW5kIGhlYWRlcmZhdWx0IHBhcnQgIiA8PCAocGFydD9wYXJ0OiIiKSA8PCAiIG1lc3NhZ2UgIiA8PCAodG9rZW4/dG9rZW46IiIpIDw8IGVuZGw7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKwl9CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChtZXNzYWdlUmVmKQorICB7IGlmIChwYXJ0KQorICAgIHsgZm9yICh2ZWN0b3I8d3NkbF9fcGFydD46Oml0ZXJhdG9yIHB0ID0gbWVzc2FnZVJlZi0+cGFydC5iZWdpbigpOyBwdCAhPSBtZXNzYWdlUmVmLT5wYXJ0LmVuZCgpOyArK3B0KQorICAgICAgICBpZiAoKCpwdCkubmFtZSAmJiAhc3RyY21wKCgqcHQpLm5hbWUsIHBhcnQpKQorCXsgcGFydFJlZiA9ICYoKnB0KTsKKwkgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmICghcGFydFJlZikKKyAgICAgIGNlcnIgPDwgIldhcm5pbmc6IHNvYXAgaGVhZGVyZmF1bHQgaGFzIG5vIG1hdGNoaW5nIHBhcnQgaW4gbWVzc2FnZSAiIDw8IChtZXNzYWdlP21lc3NhZ2U6IiIpIDw8ICIgaW4gV1NETCBkZWZpbml0aW9ucyAiIDw8IGRlZmluaXRpb25zLm5hbWUgPDwgIiBuYW1lc3BhY2UgIiA8PCAoZGVmaW5pdGlvbnMudGFyZ2V0TmFtZXNwYWNlP2RlZmluaXRpb25zLnRhcmdldE5hbWVzcGFjZToiIikgPDwgZW5kbDsKKyAgfQorICBlbHNlCisgICAgY2VyciA8PCAiV2FybmluZzogY291bGQgbm90IGZpbmQgaGVhZGVyZmF1bHQgcGFydCAiIDw8IChwYXJ0P3BhcnQ6IiIpIDw8ICIgbWVzc2FnZSAiIDw8IChtZXNzYWdlP21lc3NhZ2U6IiIpIDw8ICIgaW4gV1NETCBkZWZpbml0aW9ucyAiIDw8IGRlZmluaXRpb25zLm5hbWUgPDwgIiBuYW1lc3BhY2UgIiA8PCAoZGVmaW5pdGlvbnMudGFyZ2V0TmFtZXNwYWNlP2RlZmluaXRpb25zLnRhcmdldE5hbWVzcGFjZToiIikgPDwgZW5kbDsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK3ZvaWQgc29hcF9faGVhZGVyZmF1bHQ6Om1lc3NhZ2VQdHIod3NkbF9fbWVzc2FnZSAqbWVzc2FnZSkKK3sgbWVzc2FnZVJlZiA9IG1lc3NhZ2U7Cit9CisKK3dzZGxfX21lc3NhZ2UgKnNvYXBfX2hlYWRlcmZhdWx0OjptZXNzYWdlUHRyKCkgY29uc3QKK3sgcmV0dXJuIG1lc3NhZ2VSZWY7Cit9CisKK3ZvaWQgc29hcF9faGVhZGVyZmF1bHQ6OnBhcnRQdHIod3NkbF9fcGFydCAqcGFydCkKK3sgcGFydFJlZiA9IHBhcnQ7Cit9CisKK3dzZGxfX3BhcnQgKnNvYXBfX2hlYWRlcmZhdWx0OjpwYXJ0UHRyKCkgY29uc3QKK3sgcmV0dXJuIHBhcnRSZWY7Cit9CisKZGlmZiAtLWdpdCBhL3dzZGwvc29hcC5oIGIvd3NkbC9zb2FwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ3Y2E2OAotLS0gL2Rldi9udWxsCisrKyBiL3dzZGwvc29hcC5oCkBAIC0wLDAgKzEsMTE3IEBACisvKgorCitzb2FwLmgKKworV1NETC9TT0FQIGJpbmRpbmcgc2NoZW1hCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzOgorR1BMIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyovCisKKy8vZ3NvYXAgc29hcCBzY2hlbWEgZG9jdW1lbnRhdGlvbjoJV1NETC9TT0FQIGJpbmRpbmcgc2NoZW1hCisvL2dzb2FwIHNvYXAgc2NoZW1hIG5hbWVzcGFjZToJCWh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8KKworI2ltcG9ydCAiaW1wb3J0cy5oIgorCitjbGFzcyB3c2RsX19kZWZpbml0aW9uczsJCS8vIGZvcndhcmQgZGVjbGFyYXRpb24KK2NsYXNzIHdzZGxfX21lc3NhZ2U7CQkJLy8gZm9yd2FyZCBkZWNsYXJhdGlvbgorY2xhc3Mgd3NkbF9fcGFydDsJCQkvLyBmb3J3YXJkIGRlY2xhcmF0aW9uCisKK2VudW0gc29hcF9fc3R5bGVDaG9pY2UgeyBycGMsIGRvY3VtZW50IH07CisKK2NsYXNzIHNvYXBfX2JpbmRpbmcKK3sgcHVibGljOgorCUB4c2RfX2FueVVSSQkJCXRyYW5zcG9ydDsKKyAJQGVudW0gc29hcF9fc3R5bGVDaG9pY2UJCSpzdHlsZTsKK307CisKK2NsYXNzIHNvYXBfX29wZXJhdGlvbgoreyBwdWJsaWM6CisJQHhzZF9fYW55VVJJCQkJc29hcEFjdGlvbjsKKwlAZW51bSBzb2FwX19zdHlsZUNob2ljZQkJKnN0eWxlOworfTsKKworZW51bSBzb2FwX191c2VDaG9pY2UgeyBsaXRlcmFsLCBlbmNvZGVkIH07CisKK2NsYXNzIHNvYXBfX2JvZHkKK3sgcHVibGljOgorCUB4c2RfX2FueVVSSQkJCWVuY29kaW5nU3R5bGU7CisgCUB4c2RfX05NVE9LRU5TCQkJcGFydHM7CisJQGVudW0gc29hcF9fdXNlQ2hvaWNlCQl1c2U7CisJQHhzZF9fYW55VVJJCQkJbmFtZXNwYWNlXzsKK307CisKK2NsYXNzIHNvYXBfX2ZhdWx0Cit7IHB1YmxpYzoKKwlAeHNkX19OTVRPS0VOCQkJbmFtZTsKKwlAeHNkX19hbnlVUkkJCQllbmNvZGluZ1N0eWxlOworCUBlbnVtIHNvYXBfX3VzZUNob2ljZQkJdXNlOworCUB4c2RfX2FueVVSSQkJCW5hbWVzcGFjZV87Cit9OworCitjbGFzcyBzb2FwX19oZWFkZXJmYXVsdAoreyBwdWJsaWM6CisJQHhzZF9fUU5hbWUJCQltZXNzYWdlOworIAlAeHNkX19OTVRPS0VOCQkJcGFydDsKKwlAZW51bSBzb2FwX191c2VDaG9pY2UJCXVzZTsKKwlAeHNkX19hbnlVUkkJCQllbmNvZGluZ1N0eWxlOworCUB4c2RfX2FueVVSSQkJCW5hbWVzcGFjZV87CisgIHByaXZhdGU6CisgIAl3c2RsX19tZXNzYWdlCQkJKm1lc3NhZ2VSZWY7CisgIAl3c2RsX19wYXJ0CQkJKnBhcnRSZWY7CisgIHB1YmxpYzoKKyAgCWludAkJCQl0cmF2ZXJzZSh3c2RsX19kZWZpbml0aW9ucyYpOworCXZvaWQJCQkJbWVzc2FnZVB0cih3c2RsX19tZXNzYWdlKik7CisJdm9pZAkJCQlwYXJ0UHRyKHdzZGxfX3BhcnQqKTsKKwl3c2RsX19tZXNzYWdlCQkJKm1lc3NhZ2VQdHIoKSBjb25zdDsKKwl3c2RsX19wYXJ0CQkJKnBhcnRQdHIoKSBjb25zdDsKK307CisKK2NsYXNzIHNvYXBfX2hlYWRlcgoreyBwdWJsaWM6CisJQHhzZF9fUU5hbWUJCQltZXNzYWdlOworIAlAeHNkX19OTVRPS0VOCQkJcGFydDsKKwlAZW51bSBzb2FwX191c2VDaG9pY2UJCXVzZTsKKwlAeHNkX19hbnlVUkkJCQllbmNvZGluZ1N0eWxlOworCUB4c2RfX2FueVVSSQkJCW5hbWVzcGFjZV87CisJc3RkOjp2ZWN0b3I8c29hcF9faGVhZGVyZmF1bHQ+CWhlYWRlcmZhdWx0OwkJLy8gPHNvYXA6aGVhZGVyZmF1bHQ+KgorICBwcml2YXRlOgorICAJd3NkbF9fbWVzc2FnZQkJCSptZXNzYWdlUmVmOworICAJd3NkbF9fcGFydAkJCSpwYXJ0UmVmOworICBwdWJsaWM6CisgIAlpbnQJCQkJdHJhdmVyc2Uod3NkbF9fZGVmaW5pdGlvbnMmKTsKKwl2b2lkCQkJCW1lc3NhZ2VQdHIod3NkbF9fbWVzc2FnZSopOworCXZvaWQJCQkJcGFydFB0cih3c2RsX19wYXJ0Kik7CisJd3NkbF9fbWVzc2FnZQkJCSptZXNzYWdlUHRyKCkgY29uc3Q7CisJd3NkbF9fcGFydAkJCSpwYXJ0UHRyKCkgY29uc3Q7Cit9OworCitjbGFzcyBzb2FwX19hZGRyZXNzCit7IHB1YmxpYzoKKwlAeHNkX19hbnlVUkkJCQlsb2NhdGlvbjsKK307CmRpZmYgLS1naXQgYS93c2RsL3R5cGVtYXAuZGF0IGIvd3NkbC90eXBlbWFwLmRhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzlkOGM3Ci0tLSAvZGV2L251bGwKKysrIGIvd3NkbC90eXBlbWFwLmRhdApAQCAtMCwwICsxLDE3MiBAQAorIwl0eXBlbWFwLmRhdAorIworIwlVc2UgdGhpcyBmaWxlIHRvIGRlZmluZSBuYW1lc3BhY2UgcHJlZml4IGFuZCB0eXBlIGJpbmRpbmdzIGZvcgorIwl0aGUgZ2VuZXJhdGVkIGhlYWRlciBmaWxlcyBieSB0aGUgJ3dzZGwyaCcgdG9vbC4gIHR5cGVtYXAuZGF0IGlzIHRoZQorIwlkZWZhdWx0IGZpbGUgcHJvY2Vzc2VkIGJ5ICd3c2RsMmgnIHRvIGN1c3RvbWl6ZSBpdHMgb3V0cHV0LiBZb3UgY2FuIHVzZQorIwl3c2RsMmggb3B0aW9uIC10IHRvIHNwZWNpZnkgYW4gYWx0ZXJuYXRlIGZpbGUuCisjCisjCVhNTCBuYW1lc3BhY2UgcHJlZml4IGJpbmRpbmdzIGNhbiBiZSBwcm92aWRlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdAorIwljaG9pY2Ugb2YgdGhlIG5zMSwgbnMyLCAuLi4gcHJlZml4ZXMgZ2VuZXJhdGVkIGJ5IHdzZGwyaC4gIEl0IGlzIGhpZ2hseQorIwlyZWNvbW1lbmRlZCB0byBwcm92aWRlIG5hbWVzcGFjZSBwcmVmaXhlcyBmb3IgeW91ciBwcm9qZWN0J3MgWE1MCisjCW5hbWVzcGFjZXMuIEluIHRoaXMgd2F5LCBjaGFuZ2VzIHRvIHRoZSBXU0RMIChvciBuZXdlciByZWxlYXNlcyBvZgorIwl3c2RsMmgpIHdpbGwgaGF2ZSBhIG1pbmltYWwgaW1wYWN0IG9uIGNvZGluZy4KKyMJQmluZGluZ3MgZm9yIG5hbWVzcGFjZSBwcmVmaXhlcyBhcmUgb2YgdGhlIGZvcm06CisjCQlwcmVmaXggPSAiVVJJIgorIworIwlUeXBlIGJpbmRpbmdzIGNhbiBieSBwcm92aWRlZCB0byBiaW5kIFhNTCBzY2hlbWEgdHlwZXMgdG8gQy9DKysgdHlwZXMKKyMJZm9yIHlvdXIgcHJvamVjdC4KKyMJVHlwZSBiaW5kaW5ncyBhcmUgb2YgdGhlIGZvcm06CisjCQlwcmVmaXhfX3R5cGUgPSBkZWNsYXJhdGlvbiB8IHVzZSB8IHB0ci11c2UKKyMJd2hlcmUgJ2RlY2xhcmF0aW9uJyBpbnRyb2R1Y2VzIHRoZSB0eXBlIGluIHRoZSBoZWFkZXIgZmlsZSwgJ3VzZScKKyMJc3BlY2lmaWVzIGhvdyB0aGUgdHlwZSBpcyB1c2VkIGRpcmVjdGx5LCAncHRyLXVzZScgc3BlY2lmaWVzIGhvdyB0aGUKKyMJdHlwZSBpcyB1c2VkIGFzIGEgcG9pbnRlciB0eXBlLgorIwlGb3IgZXhhbXBsZToKKyMJCXhzZF9fc3RyaW5nID0gfCBjaGFyKiB8IGNoYXIqCisjCUFmdGVyIGVuYWJsaW5nIHRoaXMgbGluZSwgYWxsIFhTRCBzdHJpbmdzIHdpbGwgYmUgbWFwcGVkIHRvIGNoYXIqLiBOb3RlCisjCXRoYXQgdGhlICdkZWNsYXJhdGlvbicgcGFydCBpcyBlbXB0eSBpbiB0aGlzIGNhc2UuCisjCisjCU1lbWJlciBkYXRhIGFuZCBmdW5jdGlvbnMgY2FuIGJlIHByb3ZpZGVkIHRvIGV4dGVuZCBhIGdlbmVyYXRlZCBzdHJ1Y3QKKyMJb3IgY2xhc3MuCisjCUNsYXNzIGFuZCBzdHJ1Y3QgZXh0ZW5zaW9ucyBhcmUgb2YgdGhlIGZvcm06CisjCQlwcmVmaXhfX3R5cGUgPSAkIG1lbWJlci1kZWNsYXJhdGlvbgorIwlGb3IgZXhhbXBsZSwgdG8gYWRkIGEgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgdG8gY2xhc3MgbXluc19fcmVjb3JkOgorIwkJbXluc19fcmVjb3JkID0gJCBteW5zX19yZWNvcmQoKTsKKyMJCW15bnNfX3JlY29yZCA9ICQgfm15bnNfX3JlY29yZCgpOworIwkKKyMJQW55IG90aGVyIG1hdGVyaWFsIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0ZWQgaGVhZGVyIGZpbGUgY2FuIGJlCisjCXByb3ZpZGVkIGJ5IGVuY2xvc2luZyB0aGUgdGV4dCB3aXRoaW4gYnJhY2tldHMgWyBhbmQgXS4gQnJhY2tldHMgTVVTVAorIwlhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIGEgbmV3IGxpbmUuCisjCUZvciBleGFtcGxlLCB0byBpbmNsdWRlIGEgbm90ZToKKyNbCisjLy8gVE9ETzogRG9uJ3QgZm9yZ2V0IHRvIGJpbmQgdGhlIG5hbWVzcGFjZSBwcmVmaXhlcyEKKyNdCisjCVRoaXMgY29tbWVudCBhcHBlYXJzIGFzIHRoZSBmaXJzdCBsaW5lIGluIHRoZSBnZW5lcmF0ZWQgaGVhZGVyIGZpbGUuCisjCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKKyNDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyNUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR3byBsaWNlbnNlczoKKyNHUEwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNHUEwgbGljZW5zZS4KKyMKKyNUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgorI3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisjRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKyN2ZXJzaW9uLgorIworI1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKKyNXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorI3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKKyNQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisjCisjQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CisjZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWworLy8gUmVtaW5kZXI6IE1vZGlmeSB0eXBlbWFwLmRhdCB0byBjdXN0b21pemUgdGhlIGhlYWRlciBmaWxlIGdlbmVyYXRlZCBieSB3c2RsMmgKK10KKworIwlGb3IgV2hpdGVNZXNhIGludGVyb3BlcmFiaWxpdHkgdGVzdGluZyByb3VuZCAyOgorCitpCT0gImh0dHA6Ly93d3cuc29hcGludGVyb3Aub3JnLyIKK3MJPSAiaHR0cDovL3d3dy5zb2FwaW50ZXJvcC5vcmcveHNkIgorCisjCUFtYXpvbiBXZWIgU2VydmljZXM6CisKK2F3cwk9ICJ1cm46UEkvRGV2Q2VudHJhbC9Tb2FwU2VydmljZSIKKworIwlNYXBwb2ludCBXZWIgc2VydmljZXM6CisKK21wdAk9ICJodHRwOi8vcy5tYXBwb2ludC5uZXQvbWFwcG9pbnQtMzAvIgorCisjCU1UT00geG9wIGFuZCB4bWltZSBhcmUgaW1wb3J0ZWQgZnJvbSB4b3AuaCwgeG1pbWUuaCwgYW5kIHhtbG1pbWUuaDoKKworeG9wCT0gPGh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgveG9wL2luY2x1ZGU+Cit4bWltZQk9IDxodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA2L3htbG1pbWU+Cit4bWxtaW1lCT0gPGh0dHA6Ly93d3cudzMub3JnLzIwMDQvMTEveG1sbWltZT4KKworIwl4bWltZS94bWxtaW1lOmNvbnRlbnRUeXBlIGF0dHJpYnV0ZSBpcyBqdXRzIGEgc3RyaW5nOgorCitfeG1pbWVfX2NvbnRlbnRUeXBlCT0gfCBjaGFyKiB8IGNoYXIqCitfeG1sbWltZV9fY29udGVudFR5cGUJPSB8IGNoYXIqIHwgY2hhcioKKworIwlXUy1BZGRyZXNzaW5nICgyMDAzIGFuZCAyMDA0IHNjaGVtYXMpCisjCVNlZSBpbXBvcnQvd3NhLmggYW5kIGltcG9ydC93c2EzLmggZm9yIGRlZmluaXRpb25zIGFuZCBjb2RlIGV4YW1wbGVzCisKK3dzYQk9IDxodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3Npbmc+Cit3c2EzCT0gPGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDMvMDMvYWRkcmVzc2luZz4KKworIwlXUy1Qb2xpY3kKKword3NwCT0gPGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDkvcG9saWN5PgorCisjCXdzc2UgMjAwNCBhbmQgb2xkIHdzc2UgMjAwMiBzY2hlbWEKKword3NzZQk9IDxodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2Q+Cit3c3NlMgk9IDxodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAyLzEyL3NlY2V4dD4KKworIwl3c3UgMjAwNAorCit3c3UJPSA8aHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXV0aWxpdHktMS4wLnhzZD4KKworX3dzdV9fSWQJCT0gfCBjaGFyKgorX3dzdV9fQ3JlYXRlZAkJPSB8IHRpbWVfdAorX3dzdV9fRXhwaXJlcwkJPSB8IHRpbWVfdAorCit3c3VfX0F0dHJpYnV0ZWREYXRlVGltZQk9IHwgdGltZV90Cit3c3VfX0F0dHJpYnV0ZWRVUkkJPSB8IGNoYXIqCisKKyMJQmluZGluZ3MgZm9yIGRzIGFuZCB4ZW5jIGZvciBXUy1TZWN1cml0eSBwcm90b2NvbHM6CisKK2RzCT0gPGh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyM+Cit4ZW5jCT0gPGh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDQveG1sZW5jIz4KKworIwl4bGluaworCit4bGluawk9IDxodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rPgorCitfeGxpbmtfX2FjdHVhdGUJCT0gfCBjaGFyKgorX3hsaW5rX19hcmNyb2xlCQk9IHwgY2hhcioKK194bGlua19fZnJvbQkJPSB8IGNoYXIqCitfeGxpbmtfX2hyZWYJCT0gfCBjaGFyKgorX3hsaW5rX19sYWJlbAkJPSB8IGNoYXIqCitfeGxpbmtfX3JvbGUJCT0gfCBjaGFyKgorX3hsaW5rX19zaG93CQk9IHwgY2hhcioKK194bGlua19fdG8JCT0gfCBjaGFyKgorX3hsaW5rX190aXRsZQkJPSB8IGNoYXIqCitfeGxpbmtfX3R5cGUJCT0gfCBjaGFyKgorCisjCXdzcnAKKword3NycAk9IDxodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9ycC8+CisKKyMJUmVtZW1iZXI6IHR5cGUgYmluZGluZ3MgYXJlIGdpdmVuIG9uIGEgc2luZ2xlIGxpbmUuCisjCUV4YW1wbGUgWE1MIHNjaGVtYSBhbmQgQy9DKysgdHlwZSBiaW5kaW5nczoKKworeHNkX19pbnQJPSB8IGludAorCisjCVdpdGggU09BUCBlbmNvZGVkIGFycmF5cywgdGhlIFNPQVAtRU5DOmFycmF5VHlwZSBhdHRyaWJ1dGUgaXMgZGVmaW5lZAorIwlidXQgd2UgcmVhbGx5IGRvbid0IG5lZWQgaXQgYmVjYXVzZSB3ZSBuZXZlciB1c2UgaXQKKworU09BUF9FTkNfX2FycmF5VHlwZQk9IHwgY2hhciogfCBjaGFyKgorCisjCVRvIHVzZSByZWd1bGFyIGNoYXIqIHN0cmluZ3MgaW5zdGVhZCBvZiBzdGQ6OnN0cmluZywgdXNlOgorCisjIHhzZF9fc3RyaW5nCT0gfCBjaGFyKiB8IGNoYXIqCisKKyMJVG8gdXNlIHJlZ3VsYXIgY2hhciogc3RyaW5ncyBzZXJpYWxpemVkIHdpdGggeHNpOnR5cGUgYXR0cmlidXRlcywgdXNlOgorCisjIHhzZF9fc3RyaW5nCT0gdHlwZWRlZiBjaGFyICp4c2RfX3N0cmluZzsgfCB4c2RfX3N0cmluZyB8IHhzZF9fc3RyaW5nCisKKyMJTW9yZSBleGFtcGxlczoKKworIyB4c2RfX2Jvb2xlYW4gPSBlbnVtIHhzZF9fYm9vbGVhbiB7IGZhbHNlXywgdHJ1ZV8gfTsgfCBlbnVtIHhzZF9fYm9vbGVhbgorCisjIHhzZF9fYmFzZTY0QmluYXJ5ID0gY2xhc3MgeHNkX19iYXNlNjRCaW5hcnkgeyB1bnNpZ25lZCBjaGFyICpfX3B0cjsgaW50IF9fc2l6ZTsgfTsgfCB4c2RfX2Jhc2U2NEJpbmFyeSB8IHhzZF9fYmFzZTY0QmluYXJ5CmRpZmYgLS1naXQgYS93c2RsL3R5cGVzLmNwcCBiL3dzZGwvdHlwZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjN2U2OWUKLS0tIC9kZXYvbnVsbAorKysgYi93c2RsL3R5cGVzLmNwcApAQCAtMCwwICsxLDI0MTEgQEAKKy8qCisKK3R5cGVzLmNwcAorCitXU0RMIHBhcnNlciBhbmQgY29udmVydGVyIHRvIGdTT0FQIGhlYWRlciBmaWxlIGZvcm1hdAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR3byBsaWNlbnNlczoKK0dQTCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqLworCisjaW5jbHVkZSAidHlwZXMuaCIKKworc3RhdGljIGNoYXIgKmdldGxpbmUoY2hhciAqcywgc2l6ZV90IG4sIEZJTEUgKmZkKTsKK3N0YXRpYyBjb25zdCBjaGFyICpub25ibGFuayhjb25zdCBjaGFyICpzKTsKK3N0YXRpYyBjb25zdCBjaGFyICpmaWxsKGNoYXIgKnQsIGludCBuLCBjb25zdCBjaGFyICpzLCBpbnQgZSk7CitzdGF0aWMgY29uc3QgY2hhciAqdXRmOChjaGFyICp0LCBjb25zdCBjaGFyICpzKTsKK3N0YXRpYyBjb25zdCBjaGFyICpjc3RyaW5nKGNvbnN0IGNoYXIgKnMpOworc3RhdGljIGNvbnN0IGNoYXIgKnhzdHJpbmcoY29uc3QgY2hhciAqcyk7CitzdGF0aWMgYm9vbCBpc19pbnRlZ2VyKGNvbnN0IGNoYXIgKnMpOworc3RhdGljIHZvaWQgZG9jdW1lbnRhdGlvbihjb25zdCBjaGFyICp0ZXh0KTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwlLZXl3b3JkcyBhbmQgcmVzZXJ2ZWQgd29yZHMKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgY29uc3QgY2hhciAqa2V5d29yZHNbXSA9Cit7ICJhbmQiLAorICAiYXNtIiwKKyAgImF1dG8iLAorICAiYm9vbCIsCisgICJicmVhayIsCisgICJjYXNlIiwKKyAgImNhdGNoIiwKKyAgImNoYXIiLAorICAiY2xhc3MiLAorICAiY29uc3QiLAorICAiY29uc3RfY2FzdCIsCisgICJjb250aW51ZSIsCisgICJkZWZhdWx0IiwKKyAgImRlbGV0ZSIsCisgICJkbyIsCisgICJkb3VibGUiLAorICAiZHluYW1pY19jYXN0IiwKKyAgImVsc2UiLAkKKyAgImVudW0iLAorICAiZXJybm8iLAorICAiZXhwbGljaXQiLAorICAiZXhwb3J0IiwKKyAgImV4dGVybiIsCisgICJmYWxzZSIsCisgICJGSUxFIiwKKyAgImZsb2F0IiwKKyAgImZvciIsCisgICJmcmllbmQiLAorICAiZ290byIsCisgICJpZiIsCisgICJpbmxpbmUiLAorICAiaW50IiwKKyAgImxvbmciLAorICAiTE9ORzY0IiwKKyAgIm1heCIsCisgICJtaW4iLAorICAibXVzdFVuZGVyc3RhbmQiLAorICAibXV0YWJsZSIsCisgICJuYW1lc3BhY2UiLAorICAibmV3IiwKKyAgIm5vdCIsCisgICJOVUxMIiwKKyAgIm9wZXJhdG9yIiwKKyAgIm9yIiwKKyAgInByaXZhdGUiLAorICAicHJvdGVjdGVkIiwKKyAgInB1YmxpYyIsCisgICJfUU5hbWUiLAorICAicmVnaXN0ZXIiLAorICAicmVpbnRlcnByZXRfY2FzdCIsCisgICJyZXN0cmljdCIsCisgICJyZXR1cm4iLAorICAic2hvcnQiLAorICAic2lnbmVkIiwKKyAgInNpemVfdCIsCisgICJzaXplb2YiLAorICAic3RhdGljIiwKKyAgInN0YXRpY19jYXN0IiwKKyAgInN0cnVjdCIsCisgICJzd2l0Y2giLAorICAidGVtcGxhdGUiLAorICAidGhpcyIsCisgICJ0aHJvdyIsCisgICJ0aW1lX3QiLAorICAidHJ1ZSIsCisgICJ0eXBlZGVmIiwKKyAgInR5cGVpZCIsCisgICJ0eXBlbmFtZSIsCisgICJVTE9ORzY0IiwKKyAgInVuaW9uIiwKKyAgInVuc2lnbmVkIiwKKyAgInVzaW5nIiwKKyAgInZpcnR1YWwiLAorICAidm9pZCIsCisgICJ2b2xhdGlsZSIsCisgICJ3Y2hhcl90IiwKKyAgIndoaWxlIiwKKyAgIlhNTCIsCisgICJfWE1MIiwKKyAgInhvciIsCit9OworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCVR5cGVzIG1ldGhvZHMKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitUeXBlczo6VHlwZXMoKQoreyBpbml0KCk7Cit9CisKK2ludCBUeXBlczo6cmVhZChjb25zdCBjaGFyICpmaWxlKQoreyBGSUxFICpmZCA9IGZvcGVuKGZpbGUsICJyIik7CisgIGNoYXIgYnVmWzEwMjRdLCB4c2RbMTAyNF0sIGRlZlsxMDI0XSwgdXNlWzEwMjRdLCBwdHJbMTAyNF0sIHVyaVsxMDI0XTsKKyAgY29uc3QgY2hhciAqczsKKyAgc2hvcnQgY29weSA9IDA7CisgIGlmICghZmQpCisgIHsgZnByaW50ZihzdGRlcnIsICJDYW5ub3Qgb3BlbiBmaWxlICclcydcbiIsIGZpbGUpOworICAgIHJldHVybiBTT0FQX0VPRjsKKyAgfQorICBmcHJpbnRmKHN0ZGVyciwgIlJlYWRpbmcgdHlwZSBtYXAgZmlsZSAnJXMnXG5cbiIsIGZpbGUpOworICB3aGlsZSAoZ2V0bGluZShidWYsIHNpemVvZihidWYpLCBmZCkpCisgIHsgcyA9IGJ1ZjsKKyAgICBpZiAoY29weSkKKyAgICB7IGlmICgqcyA9PSAnXScpCisgICAgICAgIGNvcHkgPSAwOworICAgICAgZWxzZQorICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIiVzXG4iLCBidWYpOworICAgIH0KKyAgICBlbHNlIGlmICgqcyA9PSAnWycpCisgICAgICBjb3B5ID0gMTsKKyAgICBlbHNlIGlmICgqcyAmJiAqcyAhPSAnIycpCisgICAgeyBzID0gZmlsbCh4c2QsIHNpemVvZih4c2QpLCBzLCAnPScpOworICAgICAgaWYgKHN0cnN0cih4c2QsICJfXyIpKQorICAgICAgeyBzID0gZmlsbChkZWYsIHNpemVvZihkZWYpLCBzLCAnfCcpOworICAgICAgICBzID0gZmlsbCh1c2UsIHNpemVvZih1c2UpLCBzLCAnfCcpOworICAgICAgICBzID0gZmlsbChwdHIsIHNpemVvZihwdHIpLCBzLCAnfCcpOworICAgICAgICBpZiAoKnhzZCkKKyAgICAgICAgeyBzID0gZXN0cmR1cCh4c2QpOworCSAgaWYgKCpkZWYgPT0gJyQnKQorCSAgeyBjb25zdCBjaGFyICp0ID0gbW9kdHlwZW1hcFtzXTsKKwkgICAgaWYgKHQpCisJICAgIHsgY2hhciAqciA9IChjaGFyKillbWFsbG9jKHN0cmxlbih0KSArIHN0cmxlbihkZWYpICsgMSk7CisJICAgICAgc3RyY3B5KHIsIHQpOworCSAgICAgIHN0cmNhdChyLCBkZWYpOworCSAgICAgIGZyZWUoKHZvaWQqKW1vZHR5cGVtYXBbc10pOworCSAgICAgIG1vZHR5cGVtYXBbc10gPSByOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgICBtb2R0eXBlbWFwW3NdID0gZXN0cmR1cChkZWYpOworCSAgfQorICAgICAgICAgIGVsc2UKKwkgIHsgaWYgKCpkZWYpCisgICAgICAgICAgICAgIGRlZnR5cGVtYXBbc10gPSBlc3RyZHVwKGRlZik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGRlZnR5cGVtYXBbc10gPSAiIjsKKyAgICAgICAgICAgIGlmICgqdXNlKQorICAgICAgICAgICAgICB1c2V0eXBlbWFwW3NdID0gZXN0cmR1cCh1c2UpOworCSAgICBlbHNlCisgICAgICAgICAgICAgIHVzZXR5cGVtYXBbc10gPSBlc3RyZHVwKHhzZCk7CisgICAgICAgICAgICBpZiAoKnB0cikKKyAgICAgICAgICAgICAgcHRydHlwZW1hcFtzXSA9IGVzdHJkdXAocHRyKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCp4c2QpCisgICAgICB7IHMgPSBmaWxsKHVyaSwgc2l6ZW9mKHVyaSksIHMsIDApOworICAgICAgICBpZiAodXJpWzBdID09ICciJykKKyAgICAgICAgeyB1cmlbc3RybGVuKHVyaSkgLSAxXSA9ICdcMCc7CisgICAgICAgICAgbnNwcmVmaXgoeHNkLCBlc3RyZHVwKHVyaSArIDEpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh1cmlbMF0gPT0gJzwnKQorICAgICAgICB7IHVyaVtzdHJsZW4odXJpKSAtIDFdID0gJ1wwJzsKKwkgIGNoYXIgKnMgPSBlc3RyZHVwKHVyaSArIDEpOworCSAgbnNwcmVmaXgoeHNkLCBzKTsKKwkgIGV4dHVyaXMuaW5zZXJ0KHMpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBuc3ByZWZpeCh4c2QsIGVzdHJkdXAodXJpKSk7CisgICAgICB9CisgICAgfQorICB9CisgIGZjbG9zZShmZCk7CisgIHJldHVybiBTT0FQX09LOworfQorCit2b2lkIFR5cGVzOjppbml0KCkKK3sgc251bSA9IDE7CisgIHVudW0gPSAxOworICBnbnVtID0gMTsKKyAgd2l0aF91bmlvbiA9IGZhbHNlOworICBmYWtlX3VuaW9uID0gZmFsc2U7CisgIGtuYW1lcy5pbnNlcnQoa2V5d29yZHMsIGtleXdvcmRzICsgc2l6ZW9mKGtleXdvcmRzKS9zaXplb2YoY2hhciopKTsKKyAgaWYgKGNmbGFnKQorICB7IGRlZnR5cGVtYXBbInhzZF9fdXJfdHlwZSJdID0gIiI7CisgICAgaWYgKGRmbGFnKQorICAgIHsgdXNldHlwZW1hcFsieHNkX191cl90eXBlIl0gPSAieHNkX19hbnlUeXBlIjsKKyAgICAgIHB0cnR5cGVtYXBbInhzZF9fdXJfdHlwZSJdID0gInhzZF9fYW55VHlwZSoiOworICAgIH0KKyAgICBlbHNlCisgICAgeyB1c2V0eXBlbWFwWyJ4c2RfX3VyX3R5cGUiXSA9ICJfWE1MIjsKKyAgICAgIHB0cnR5cGVtYXBbInhzZF9fdXJfdHlwZSJdID0gIl9YTUwiOworICAgIH0KKyAgfQorICBlbHNlCisgIHsgZGVmdHlwZW1hcFsieHNkX191cl90eXBlIl0gPSAiY2xhc3MgeHNkX191cl90eXBlIHsgX1hNTCBfX2l0ZW07IHN0cnVjdCBzb2FwICpzb2FwOyB9OyI7CisgICAgdXNldHlwZW1hcFsieHNkX191cl90eXBlIl0gPSAieHNkX191cl90eXBlIjsKKyAgfQorICBpZiAoY2ZsYWcpCisgIHsgZGVmdHlwZW1hcFsieHNkX19hbnlUeXBlIl0gPSAiIjsKKyAgICBpZiAoZGZsYWcpCisgICAgeyB1c2V0eXBlbWFwWyJ4c2RfX2FueVR5cGUiXSA9ICJ4c2RfX2FueVR5cGUiOworICAgICAgcHRydHlwZW1hcFsieHNkX19hbnlUeXBlIl0gPSAieHNkX19hbnlUeXBlKiI7CisgICAgfQorICAgIGVsc2UKKyAgICB7IHVzZXR5cGVtYXBbInhzZF9fYW55VHlwZSJdID0gIl9YTUwiOworICAgICAgcHRydHlwZW1hcFsieHNkX19hbnlUeXBlIl0gPSAiX1hNTCI7CisgICAgfQorICB9CisgIGVsc2UKKyAgeyBkZWZ0eXBlbWFwWyJ4c2RfX2FueVR5cGUiXSA9ICJjbGFzcyB4c2RfX2FueVR5cGUgeyBfWE1MIF9faXRlbTsgc3RydWN0IHNvYXAgKnNvYXA7IH07IjsKKyAgICB1c2V0eXBlbWFwWyJ4c2RfX2FueVR5cGUiXSA9ICJ4c2RfX2FueVR5cGUqIjsKKyAgfQorICBpZiAoY2ZsYWcpCisgIHsgZGVmdHlwZW1hcFsieHNkX19iYXNlNjRCaW5hcnkiXSA9ICJzdHJ1Y3QgeHNkX19iYXNlNjRCaW5hcnlcbntcdHVuc2lnbmVkIGNoYXIgKl9fcHRyO1xuXHRpbnQgX19zaXplO1xuXHRjaGFyICppZCwgKnR5cGUsICpvcHRpb25zOyAvKiBOT1RFOiBmb3IgRElNRSBhbmQgTVRPTSBYT1AgYXR0YWNobWVudHMgb25seSAqL1xufTsiOworICAgIHVzZXR5cGVtYXBbInhzZF9fYmFzZTY0QmluYXJ5Il0gPSAic3RydWN0IHhzZF9fYmFzZTY0QmluYXJ5IjsKKyAgfQorICBlbHNlCisgIHsgZGVmdHlwZW1hcFsieHNkX19iYXNlNjRCaW5hcnkiXSA9ICJjbGFzcyB4c2RfX2Jhc2U2NEJpbmFyeVxue1x0dW5zaWduZWQgY2hhciAqX19wdHI7XG5cdGludCBfX3NpemU7XG5cdGNoYXIgKmlkLCAqdHlwZSwgKm9wdGlvbnM7IC8qIE5PVEU6IGZvciBESU1FIGFuZCBNVE9NIFhPUCBhdHRhY2htZW50cyBvbmx5ICovXG5cdHN0cnVjdCBzb2FwICpzb2FwO1xufTsiOworICAgIHVzZXR5cGVtYXBbInhzZF9fYmFzZTY0QmluYXJ5Il0gPSAieHNkX19iYXNlNjRCaW5hcnkiOworICB9CisgIGlmIChjZmxhZykKKyAgeyBpZiAoZWZsYWcpCisgICAgICBkZWZ0eXBlbWFwWyJ4c2RfX2Jvb2xlYW4iXSA9ICJlbnVtIHhzZF9fYm9vbGVhbiB7IGZhbHNlXywgdHJ1ZV8gfTsiOworICAgIGVsc2UKKyAgICAgIGRlZnR5cGVtYXBbInhzZF9fYm9vbGVhbiJdID0gImVudW0geHNkX19ib29sZWFuIHsgeHNkX19ib29sZWFuX19mYWxzZV8sIHhzZF9fYm9vbGVhbl9fdHJ1ZV8gfTsiOworICAgIHVzZXR5cGVtYXBbInhzZF9fYm9vbGVhbiJdID0gImVudW0geHNkX19ib29sZWFuIjsKKyAgfQorICBlbHNlCisgIHsgZGVmdHlwZW1hcFsieHNkX19ib29sZWFuIl0gPSAiIjsKKyAgICB1c2V0eXBlbWFwWyJ4c2RfX2Jvb2xlYW4iXSA9ICJib29sIjsKKyAgfQorICBkZWZ0eXBlbWFwWyJ4c2RfX2J5dGUiXSA9ICIiOworICB1c2V0eXBlbWFwWyJ4c2RfX2J5dGUiXSA9ICJjaGFyIjsKKyAgcHRydHlwZW1hcFsieHNkX19ieXRlIl0gPSAic2hvcnQqIjsgLy8gYXZvaWQgY2hhcioKKyAgZGVmdHlwZW1hcFsieHNkX19kYXRlVGltZSJdID0gIiI7CisgIHVzZXR5cGVtYXBbInhzZF9fZGF0ZVRpbWUiXSA9ICJ0aW1lX3QiOworICBkZWZ0eXBlbWFwWyJ4c2RfX2RvdWJsZSJdID0gIiI7CisgIHVzZXR5cGVtYXBbInhzZF9fZG91YmxlIl0gPSAiZG91YmxlIjsKKyAgZGVmdHlwZW1hcFsieHNkX19mbG9hdCJdID0gIiI7CisgIHVzZXR5cGVtYXBbInhzZF9fZmxvYXQiXSA9ICJmbG9hdCI7CisgIGlmIChjZmxhZykKKyAgeyBkZWZ0eXBlbWFwWyJ4c2RfX2hleEJpbmFyeSJdID0gInN0cnVjdCB4c2RfX2hleEJpbmFyeSB7IHVuc2lnbmVkIGNoYXIgKl9fcHRyOyBpbnQgX19zaXplOyB9OyI7CisgICAgdXNldHlwZW1hcFsieHNkX19oZXhCaW5hcnkiXSA9ICJzdHJ1Y3QgeHNkX19oZXhCaW5hcnkiOworICB9CisgIGVsc2UKKyAgeyBkZWZ0eXBlbWFwWyJ4c2RfX2hleEJpbmFyeSJdID0gImNsYXNzIHhzZF9faGV4QmluYXJ5IHsgdW5zaWduZWQgY2hhciAqX19wdHI7IGludCBfX3NpemU7IH07IjsKKyAgICB1c2V0eXBlbWFwWyJ4c2RfX2hleEJpbmFyeSJdID0gInhzZF9faGV4QmluYXJ5IjsKKyAgfQorICBkZWZ0eXBlbWFwWyJ4c2RfX2ludCJdID0gIiI7CisgIHVzZXR5cGVtYXBbInhzZF9faW50Il0gPSAiaW50IjsKKyAgZGVmdHlwZW1hcFsieHNkX19sb25nIl0gPSAiIjsKKyAgdXNldHlwZW1hcFsieHNkX19sb25nIl0gPSAiTE9ORzY0IjsKKyAgZGVmdHlwZW1hcFsieHNkX19zaG9ydCJdID0gIiI7CisgIHVzZXR5cGVtYXBbInhzZF9fc2hvcnQiXSA9ICJzaG9ydCI7CisgIGlmIChjZmxhZyB8fCBzZmxhZykKKyAgeyBkZWZ0eXBlbWFwWyJ4c2RfX3N0cmluZyJdID0gIiI7CisgICAgdXNldHlwZW1hcFsieHNkX19zdHJpbmciXSA9ICJjaGFyKiI7CisgIH0KKyAgZWxzZQorICB7IGRlZnR5cGVtYXBbInhzZF9fc3RyaW5nIl0gPSAiIjsKKyAgICB1c2V0eXBlbWFwWyJ4c2RfX3N0cmluZyJdID0gInN0ZDo6c3RyaW5nIjsKKyAgfQorICBkZWZ0eXBlbWFwWyJ4c2RfX3Vuc2lnbmVkQnl0ZSJdID0gIiI7CisgIHVzZXR5cGVtYXBbInhzZF9fdW5zaWduZWRCeXRlIl0gPSAidW5zaWduZWQgY2hhciI7CisgIHB0cnR5cGVtYXBbInhzZF9fdW5zaWduZWRCeXRlIl0gPSAidW5zaWduZWQgc2hvcnQqIjsgLy8gYXZvaWQgdW5zaWduZWQgY2hhcioKKyAgZGVmdHlwZW1hcFsieHNkX191bnNpZ25lZEludCJdID0gIiI7CisgIHVzZXR5cGVtYXBbInhzZF9fdW5zaWduZWRJbnQiXSA9ICJ1bnNpZ25lZCBpbnQiOworICBkZWZ0eXBlbWFwWyJ4c2RfX3Vuc2lnbmVkTG9uZyJdID0gIiI7CisgIHVzZXR5cGVtYXBbInhzZF9fdW5zaWduZWRMb25nIl0gPSAiVUxPTkc2NCI7CisgIGRlZnR5cGVtYXBbInhzZF9fdW5zaWduZWRTaG9ydCJdID0gIiI7CisgIHVzZXR5cGVtYXBbInhzZF9fdW5zaWduZWRTaG9ydCJdID0gInVuc2lnbmVkIHNob3J0IjsKKyAgaWYgKGNmbGFnKQorICB7IGRlZnR5cGVtYXBbIlNPQVBfRU5DX19iYXNlNjRCaW5hcnkiXSA9ICJzdHJ1Y3QgU09BUF9FTkNfX2Jhc2U2NEJpbmFyeSB7IHVuc2lnbmVkIGNoYXIgKl9fcHRyOyBpbnQgX19zaXplOyB9OyI7CisgICAgdXNldHlwZW1hcFsiU09BUF9FTkNfX2Jhc2U2NEJpbmFyeSJdID0gInN0cnVjdCBTT0FQX0VOQ19fYmFzZTY0QmluYXJ5IjsKKyAgfQorICBlbHNlCisgIHsgZGVmdHlwZW1hcFsiU09BUF9FTkNfX2Jhc2U2NEJpbmFyeSJdID0gImNsYXNzIFNPQVBfRU5DX19iYXNlNjRCaW5hcnkgeyB1bnNpZ25lZCBjaGFyICpfX3B0cjsgaW50IF9fc2l6ZTsgfTsiOworICAgIHVzZXR5cGVtYXBbIlNPQVBfRU5DX19iYXNlNjRCaW5hcnkiXSA9ICJTT0FQX0VOQ19fYmFzZTY0QmluYXJ5IjsKKyAgfQorICBpZiAoY2ZsYWcpCisgIHsgZGVmdHlwZW1hcFsiU09BUF9FTkNfX2Jvb2xlYW4iXSA9ICJlbnVtIFNPQVBfRU5DX19ib29sZWFuIHsgZmFsc2VfLCB0cnVlXyB9OyI7CisgICAgdXNldHlwZW1hcFsiU09BUF9FTkNfX2Jvb2xlYW4iXSA9ICJlbnVtIFNPQVBfRU5DX19ib29sZWFuIjsKKyAgfQorICBlbHNlCisgIHsgZGVmdHlwZW1hcFsiU09BUF9FTkNfX2Jvb2xlYW4iXSA9ICIiOworICAgIHVzZXR5cGVtYXBbIlNPQVBfRU5DX19ib29sZWFuIl0gPSAiYm9vbCI7CisgIH0KKyAgZGVmdHlwZW1hcFsiU09BUF9FTkNfX2J5dGUiXSA9ICIiOworICB1c2V0eXBlbWFwWyJTT0FQX0VOQ19fYnl0ZSJdID0gImNoYXIiOworICBkZWZ0eXBlbWFwWyJTT0FQX0VOQ19fZGF0ZVRpbWUiXSA9ICIiOworICB1c2V0eXBlbWFwWyJTT0FQX0VOQ19fZGF0ZVRpbWUiXSA9ICJ0aW1lX3QiOworICBkZWZ0eXBlbWFwWyJTT0FQX0VOQ19fZG91YmxlIl0gPSAiIjsKKyAgdXNldHlwZW1hcFsiU09BUF9FTkNfX2RvdWJsZSJdID0gImRvdWJsZSI7CisgIGRlZnR5cGVtYXBbIlNPQVBfRU5DX19mbG9hdCJdID0gIiI7CisgIHVzZXR5cGVtYXBbIlNPQVBfRU5DX19mbG9hdCJdID0gImZsb2F0IjsKKyAgaWYgKGNmbGFnKQorICB7IGRlZnR5cGVtYXBbIlNPQVBfRU5DX19oZXhCaW5hcnkiXSA9ICJzdHJ1Y3QgU09BUF9FTkNfX2hleEJpbmFyeSB7IHVuc2lnbmVkIGNoYXIgKl9fcHRyOyBpbnQgX19zaXplOyB9OyI7CisgICAgdXNldHlwZW1hcFsiU09BUF9FTkNfX2hleEJpbmFyeSJdID0gInN0cnVjdCBTT0FQX0VOQ19faGV4QmluYXJ5IjsKKyAgfQorICBlbHNlCisgIHsgZGVmdHlwZW1hcFsiU09BUF9FTkNfX2hleEJpbmFyeSJdID0gImNsYXNzIFNPQVBfRU5DX19oZXhCaW5hcnkgeyB1bnNpZ25lZCBjaGFyICpfX3B0cjsgaW50IF9fc2l6ZTsgfTsiOworICAgIHVzZXR5cGVtYXBbIlNPQVBfRU5DX19oZXhCaW5hcnkiXSA9ICJTT0FQX0VOQ19faGV4QmluYXJ5IjsKKyAgfQorICBkZWZ0eXBlbWFwWyJTT0FQX0VOQ19faW50Il0gPSAiIjsKKyAgdXNldHlwZW1hcFsiU09BUF9FTkNfX2ludCJdID0gImludCI7CisgIGRlZnR5cGVtYXBbIlNPQVBfRU5DX19sb25nIl0gPSAiIjsKKyAgdXNldHlwZW1hcFsiU09BUF9FTkNfX2xvbmciXSA9ICJMT05HNjQiOworICBkZWZ0eXBlbWFwWyJTT0FQX0VOQ19fc2hvcnQiXSA9ICIiOworICB1c2V0eXBlbWFwWyJTT0FQX0VOQ19fc2hvcnQiXSA9ICJzaG9ydCI7CisgIHB0cnR5cGVtYXBbIlNPQVBfRU5DX19zaG9ydCJdID0gImludCoiOworICBpZiAoY2ZsYWcgfHwgc2ZsYWcpCisgIHsgZGVmdHlwZW1hcFsiU09BUF9FTkNfX3N0cmluZyJdID0gIiI7CisgICAgdXNldHlwZW1hcFsiU09BUF9FTkNfX3N0cmluZyJdID0gImNoYXIqIjsKKyAgfQorICBlbHNlCisgIHsgZGVmdHlwZW1hcFsiU09BUF9FTkNfX3N0cmluZyJdID0gIiI7CisgICAgdXNldHlwZW1hcFsiU09BUF9FTkNfX3N0cmluZyJdID0gInN0ZDo6c3RyaW5nIjsKKyAgfQorICBkZWZ0eXBlbWFwWyJTT0FQX0VOQ19fdW5zaWduZWRCeXRlIl0gPSAiIjsKKyAgdXNldHlwZW1hcFsiU09BUF9FTkNfX3Vuc2lnbmVkQnl0ZSJdID0gInVuc2lnbmVkIGNoYXIiOworICBwdHJ0eXBlbWFwWyJTT0FQX0VOQ19fdW5zaWduZWRCeXRlIl0gPSAidW5zaWduZWQgc2hvcnQqIjsKKyAgZGVmdHlwZW1hcFsiU09BUF9FTkNfX3Vuc2lnbmVkSW50Il0gPSAiIjsKKyAgdXNldHlwZW1hcFsiU09BUF9FTkNfX3Vuc2lnbmVkSW50Il0gPSAidW5zaWduZWQgbG9uZyI7CisgIGRlZnR5cGVtYXBbIlNPQVBfRU5DX191bnNpZ25lZExvbmciXSA9ICIiOworICB1c2V0eXBlbWFwWyJTT0FQX0VOQ19fdW5zaWduZWRMb25nIl0gPSAiVUxPTkc2NCI7CisgIGRlZnR5cGVtYXBbIlNPQVBfRU5DX191bnNpZ25lZFNob3J0Il0gPSAiIjsKKyAgdXNldHlwZW1hcFsiU09BUF9FTkNfX3Vuc2lnbmVkU2hvcnQiXSA9ICJ1bnNpZ25lZCBzaG9ydCI7CisgIGRlZnR5cGVtYXBbIlNPQVBfRU5DX19BcnJheSJdID0gIiI7CisgIGlmIChyZWFkKG1hcGZpbGUpKQorICAgIGZwcmludGYoc3RkZXJyLCAiUHJvYmxlbSByZWFkaW5nIHR5cGUgbWFwIGZpbGUgJXMuXG5Vc2luZyBpbnRlcm5hbCB0eXBlIGRlZmluaXRpb25zIGZvciAlcyBpbnN0ZWFkLlxuXG4iLCBtYXBmaWxlLCBjZmxhZz8iQyI6IkMrKyIpOworfQorCitjb25zdCBjaGFyICpUeXBlczo6bnNwcmVmaXgoY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpVUkkpCit7IGlmIChVUkkpCisgIHsgY29uc3QgY2hhciAqcyA9IHVyaXNbVVJJXTsKKyAgICBpZiAoIXMpCisgICAgeyBzaXplX3QgbjsKKyAgICAgIGlmICghcHJlZml4IHx8ICEqcHJlZml4IHx8ICpwcmVmaXggPT0gJ18nKQorICAgICAgICBzID0gc2NoZW1hX3ByZWZpeDsKKyAgICAgIGVsc2UKKyAgICAgICAgcyA9IGVzdHJkdXAocHJlZml4KTsKKyAgICAgIGlmICghc3ltc1tzXSkKKyAgICAgICAgbiA9IHN5bXNbc10gPSAxOworICAgICAgZWxzZQorICAgICAgICBuID0gKytzeW1zW3NdOworICAgICAgaWYgKG4gIT0gMSB8fCAhcHJlZml4IHx8ICEqcHJlZml4IHx8ICpwcmVmaXggPT0gJ18nKQorICAgICAgeyBjaGFyICp0ID0gKGNoYXIqKWVtYWxsb2Moc3RybGVuKHMpICsgMTYpOworICAgICAgICBzcHJpbnRmKHQsICIlcyVsdSIsIHMsICh1bnNpZ25lZCBsb25nKW4pOworCXMgPSB0OworICAgICAgfQorICAgICAgdXJpc1tVUkldID0gczsKKyAgICAgIGlmICh2ZmxhZykKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJuYW1lc3BhY2UgcHJlZml4ICVzID0gXCIlc1wiXG4iLCBzLCBVUkkpOworICAgIH0KKyAgICByZXR1cm4gczsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworLy8gRmluZCBhIEMgbmFtZSBmb3IgYSBRTmFtZS4gSWYgdGhlIG5hbWUgaGFzIG5vIHF1YWxpZmllciwgdXNlIFVSSS4gU3VnZ2VzdCBwcmVmaXggZm9yIFVSSQorY29uc3QgY2hhciAqVHlwZXM6OmZuYW1lKGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqVVJJLCBjb25zdCBjaGFyICpxbmFtZSwgU2V0T2ZTdHJpbmcgKnJlc2VydmVkLCBlbnVtIExvb2t1cCBsb29rdXApCit7IGNoYXIgYnVmWzEwMjRdLCAqdDsKKyAgY29uc3QgY2hhciAqcCwgKnMsICpuYW1lOworICBpZiAoIXFuYW1lKQorICB7IGZwcmludGYoc3RyZWFtLCAiLy8gV2FybmluZzogaW50ZXJuYWwgZXJyb3IsIHVuZGVmaW5lZCBxbmFtZSBpbiBmbmFtZSgpXG4iKTsKKyAgICBxbmFtZSA9ICI/IjsKKyAgfQorICBzID0gc3RycmNocihxbmFtZSwgJzonKTsKKyAgaWYgKHMpCisgIHsgbmFtZSA9IHMgKyAxOworICAgIGlmICgqcW5hbWUgPT0gJyInKQorICAgIHsgdCA9IChjaGFyKillbWFsbG9jKHMgLSBxbmFtZSAtIDEpOworICAgICAgc3RybmNweSh0LCBxbmFtZSArIDEsIHMgLSBxbmFtZSAtIDIpOworICAgICAgdFtzIC0gcW5hbWUgLSAyXSA9ICdcMCc7CisgICAgICBVUkkgPSB0OworICAgIH0KKyAgICBlbHNlIGlmICghc3RybmNtcChxbmFtZSwgInhzOiIsIDMpKQkvLyB0aGlzIGhhY2sgaXMgbmVjZXNzYXJ5IHNpbmNlIHRoZSBuc21hcCB0YWJsZSBkZWZpbmVzICJ4cyIgZm9yICJ4c2QiCisgICAgeyBzID0gInhzZCI7CisgICAgICBVUkkgPSBOVUxMOworICAgIH0KKyAgICBlbHNlCisgICAgeyB0ID0gKGNoYXIqKWVtYWxsb2MocyAtIHFuYW1lICsgMSk7CisgICAgICBzdHJuY3B5KHQsIHFuYW1lLCBzIC0gcW5hbWUpOworICAgICAgdFtzIC0gcW5hbWVdID0gJ1wwJzsKKyAgICAgIHMgPSB0OworICAgICAgVVJJID0gTlVMTDsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIG5hbWUgPSBxbmFtZTsKKyAgaWYgKFVSSSkKKyAgICBwID0gbnNwcmVmaXgocHJlZml4LCBVUkkpOworICBlbHNlIGlmIChzKQorICAgIHAgPSBzOworICBlbHNlCisgICAgcCA9ICIiOworICBpZiAobG9va3VwID09IExPT0tVUCkKKyAgeyBzID0gcW5hbWVzW1BhaXIocCxuYW1lKV07CisgICAgaWYgKHMpCisgICAgICByZXR1cm4gczsKKyAgfQorICB0ID0gYnVmOworICBpZiAoIXByZWZpeCB8fCAqcHJlZml4KQorICB7IHMgPSBwOworICAgIGlmIChwcmVmaXggJiYgKnByZWZpeCA9PSAnXycpIC8vIGVuc3VyZXMgbnMgcHJlZml4IHN0YXJ0cyB3aXRoIF8uLi4KKyAgICB7IHN0cmNweSh0LCBwcmVmaXgpOworICAgICAgdCArPSBzdHJsZW4ocHJlZml4KTsKKyAgICB9CisgICAgaWYgKHMgJiYgKnMpCisgICAgeyBmb3IgKDsgKnM7IHMrKykKKyAgICAgIHsgaWYgKGlzYWxudW0oKnMpKQorICAgICAgICAgICp0KysgPSAqczsKKyAgICAgICAgZWxzZSBpZiAoKnMgPT0gJy0nICYmIHMgIT0gcCkKKyAgICAgICAgICAqdCsrID0gJ18nOworICAgICAgICBlbHNlIGlmICgqcyA9PSAnXycpCisgICAgICAgIHsgc3RyY3B5KHQsICJfVVNDT1JFIik7CisgICAgICAgICAgdCArPSA3OworICAgICAgICB9CisgICAgICAgIGVsc2UKKwl7IHMgPSB1dGY4KHQsIHMpOworICAgICAgICAgIHQgKz0gNjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCFwcmVmaXggfHwgKnByZWZpeCAhPSAnKicpCisgICAgICB7ICp0KysgPSAnXyc7CisgICAgICAgICp0KysgPSAnXyc7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKGlzZGlnaXQoKm5hbWUpKQorICAgICAgKnQrKyA9ICdfJzsKKyAgfQorICBmb3IgKHMgPSBuYW1lOyAqczsgcysrKQorICB7IGlmIChpc2FsbnVtKCpzKSkKKyAgICAgICp0KysgPSAqczsKKyAgICBlbHNlIGlmICgqcyA9PSAnLScgJiYgcyAhPSBuYW1lKQorICAgICAgKnQrKyA9ICdfJzsKKyAgICBlbHNlIGlmICgqcyA9PSAnXycpCisgICAgeyBzdHJjcHkodCwgIl9VU0NPUkUiKTsKKyAgICAgIHQgKz0gNzsKKyAgICB9CisgICAgZWxzZQorICAgIHsgcyA9IHV0ZjgodCwgcyk7CisgICAgICB0ICs9IDY7CisgICAgfQorICB9CisgICp0ID0gJ1wwJzsKKyAgd2hpbGUgKGtuYW1lcy5maW5kKGJ1ZikgIT0ga25hbWVzLmVuZCgpIHx8IChyZXNlcnZlZCAmJiByZXNlcnZlZC0+ZmluZChidWYpICE9IHJlc2VydmVkLT5lbmQoKSkpCisgIHsgKnQrKyA9ICdfJzsKKyAgICAqdCA9ICdcMCc7CisgIH0KKyAgaWYgKGlzYWxwaGEoKmJ1ZikgfHwgKmJ1ZiA9PSAnXycpCisgIHsgdCA9IChjaGFyKillbWFsbG9jKHN0cmxlbihidWYpICsgMSk7CisgICAgc3RyY3B5KHQsIGJ1Zik7CisgIH0KKyAgZWxzZQorICB7IHQgPSAoY2hhciopZW1hbGxvYyhzdHJsZW4oYnVmKSArIDIpOworICAgICp0ID0gJ18nOworICAgIHN0cmNweSh0ICsgMSwgYnVmKTsKKyAgfQorICBpZiAobG9va3VwID09IExPT0tVUCkKKyAgICBxbmFtZXNbUGFpcihwLG5hbWUpXSA9IHQ7CisgIC8qCisgIGNlcnIgPDwgIltERUZJTkVEICIgPDwgcCA8PCAiOiIgPDwgbmFtZSA8PCAiPSIgPDwgdCA8PCAiXSIgPDwgZW5kbDsKKyAgZm9yIChNYXBPZlBhaXJUb1N0cmluZzo6Y29uc3RfaXRlcmF0b3IgaSA9IHFuYW1lcy5iZWdpbigpOyBpICE9IHFuYW1lcy5lbmQoKTsgKytpKQorICAgIGNlcnIgPDwgIigiIDw8ICgqaSkuZmlyc3QuZmlyc3QgPDwgIiwiIDw8ICgqaSkuZmlyc3Quc2Vjb25kIDw8ICIpID0gIiA8PCAoKmkpLnNlY29uZCA8PCBlbmRsOworICAqLworICByZXR1cm4gdDsKK30KKworYm9vbCBUeXBlczo6aXNfZGVmaW5lZChjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKlVSSSwgY29uc3QgY2hhciAqcW5hbWUpCit7IGNvbnN0IGNoYXIgKnQgPSBmbmFtZShwcmVmaXgsIFVSSSwgcW5hbWUsIE5VTEwsIExPT0tVUCk7CisgIHJldHVybiB1c2V0eXBlbWFwW3RdICE9IE5VTEw7Cit9CisKK2NvbnN0IGNoYXIgKlR5cGVzOjphbmFtZShjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKlVSSSwgY29uc3QgY2hhciAqcW5hbWUpCit7IHJldHVybiBmbmFtZShwcmVmaXgsIFVSSSwgcW5hbWUsIE5VTEwsIE5PTE9PS1VQKTsKK30KKworY29uc3QgY2hhciAqVHlwZXM6OmNuYW1lKGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqVVJJLCBjb25zdCBjaGFyICpxbmFtZSkKK3sgcmV0dXJuIGZuYW1lKHByZWZpeCwgVVJJLCBxbmFtZSwgTlVMTCwgTE9PS1VQKTsKK30KKworY29uc3QgY2hhciAqVHlwZXM6OnRuYW1lKGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqVVJJLCBjb25zdCBjaGFyICpxbmFtZSkKK3sgY29uc3QgY2hhciAqcywgKnQgPSBjbmFtZShwcmVmaXgsIFVSSSwgcW5hbWUpOworICBzID0gdXNldHlwZW1hcFt0XTsKKyAgaWYgKCFzKQorICB7IHMgPSB0OworICAgIGZwcmludGYoc3RyZWFtLCAiLy8gV2FybmluZzogaW50ZXJuYWwgZXJyb3IsIHVuZGVmaW5lZCBxbmFtZSAnJXMnIGZvciB0eXBlICclcydcbiIsIHFuYW1lP3FuYW1lOiIiLCB0KTsKKyAgfQorICByZXR1cm4gczsKK30KKworY29uc3QgY2hhciAqVHlwZXM6OnRuYW1lcHRyKGJvb2wgZmxhZywgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpVUkksIGNvbnN0IGNoYXIgKnFuYW1lKQoreyBjb25zdCBjaGFyICpzID0gcG5hbWUoZmxhZywgcHJlZml4LCBVUkksIHFuYW1lKTsKKyAgaWYgKGZsYWcpCisgIHsgaWYgKCFzdHJuY21wKHMsICJjaGFyKiIsIDUpKQorICAgICAgcmV0dXJuICJjaGFyKioiOworICAgIGlmICghc3RyY2hyKHMsICcqJykpCisgICAgeyBjaGFyICpyID0gKGNoYXIqKWVtYWxsb2Moc3RybGVuKHMpICsgMik7CisgICAgICBzdHJjcHkociwgcyk7CisgICAgICBzdHJjYXQociwgIioiKTsKKyAgICAgIHJldHVybiByOworICAgIH0KKyAgfQorICByZXR1cm4gczsKK30KKworY29uc3QgY2hhciAqVHlwZXM6OnBuYW1lKGJvb2wgZmxhZywgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpVUkksIGNvbnN0IGNoYXIgKnFuYW1lKQoreyBjb25zdCBjaGFyICpyLCAqcywgKnQgPSBjbmFtZShwcmVmaXgsIFVSSSwgcW5hbWUpOworICBpZiAoZmxhZykKKyAgeyBzID0gcHRydHlwZW1hcFt0XTsKKyAgICBpZiAoIXMpCisgICAgeyBzID0gdXNldHlwZW1hcFt0XTsKKyAgICAgIGlmICghcyB8fCAhKnMpCisgICAgICB7IHMgPSB0OworICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIi8vIFdhcm5pbmc6IGludGVybmFsIGVycm9yLCB1bmRlZmluZWQ6ICVzICVzXG4iLCBxbmFtZSwgdCk7CisgICAgICB9CisgICAgICByID0gczsKKyAgICAgIGRvCisgICAgICB7IHIgPSBzdHJjaHIociArIDEsICcqJyk7CisgICAgICAgIGlmIChyICYmICooci0xKSAhPSAnLycgJiYgKihyKzEpICE9ICcvJykKKwkgIGJyZWFrOworICAgICAgfSB3aGlsZSAocik7CisgICAgICBpZiAoIXIpCS8vIGFscmVhZHkgcG9pbnRlcj8KKyAgICAgIHsgY2hhciAqcCA9IChjaGFyKillbWFsbG9jKHN0cmxlbihzKSArIDIpOworICAgICAgICBzdHJjcHkocCwgcyk7CisgICAgICAgIHN0cmNhdChwLCAiKiIpOworICAgICAgICBzID0gcDsKKyAgICAgIH0KKyAgICAgIHB0cnR5cGVtYXBbdF0gPSBzOworICAgIH0KKyAgfQorICBlbHNlCisgICAgcyA9IHVzZXR5cGVtYXBbdF07CisgIGlmICghcykKKyAgeyBzID0gdDsKKyAgICBmcHJpbnRmKHN0cmVhbSwgIi8vIFdhcm5pbmc6IGludGVybmFsIGVycm9yLCB1bmRlZmluZWQ6ICVzICVzXG4iLCBxbmFtZSwgdCk7CisgIH0KKyAgcmV0dXJuIHM7Cit9CisKK2NvbnN0IGNoYXIgKlR5cGVzOjpkZWZ0bmFtZShlbnVtIFR5cGUgdHlwZSwgY29uc3QgY2hhciAqcG9pbnRlciwgYm9vbCBpc19wb2ludGVyLCBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKlVSSSwgY29uc3QgY2hhciAqcW5hbWUpCit7IGNoYXIgYnVmWzEwMjRdOworICBjb25zdCBjaGFyICpxID0gTlVMTCwgKnQgPSBmbmFtZShwcmVmaXgsIFVSSSwgcW5hbWUsIE5VTEwsIExPT0tVUCk7CisgIGNoYXIgKnM7CisgIGlmIChkZWZ0eXBlbWFwW3RdKQorICAgIHJldHVybiBOVUxMOworICBzd2l0Y2ggKHR5cGUpCisgIHsgY2FzZSBFTlVNOgorICAgICAgcSA9ICJlbnVtIjsKKyAgICAgIGlmICh5ZmxhZykKKyAgICAgICAga25hbWVzLmluc2VydCh0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU1RSVUNUOgorICAgICAgcSA9ICJzdHJ1Y3QiOworICAgICAgaWYgKHlmbGFnKQorICAgICAgICBrbmFtZXMuaW5zZXJ0KHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDTEFTUzoKKyAgICBjYXNlIFRZUEVERUY6CisgICAgICBrbmFtZXMuaW5zZXJ0KHQpOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICBpZiAocSkKKyAgeyBzdHJjcHkoYnVmLCBxKTsKKyAgICBzdHJjYXQoYnVmLCAiICIpOworICB9CisgIGVsc2UKKyAgICBidWZbMF0gPSAnXDAnOworICBzdHJjYXQoYnVmLCB0KTsKKyAgaWYgKHBvaW50ZXIpCisgICAgc3RyY2F0KGJ1ZiwgcG9pbnRlcik7CisgIHMgPSAoY2hhciopZW1hbGxvYyhzdHJsZW4oYnVmKSArIDEpOworICBzdHJjcHkocywgYnVmKTsKKyAgdXNldHlwZW1hcFt0XSA9IHM7CisgIGlmIChwb2ludGVyIHx8IGlzX3BvaW50ZXIpCisgICAgcHRydHlwZW1hcFt0XSA9IHM7CisgIHJldHVybiB0OworfQorCisvLyBnZXQgZW51bWVyYXRpb24gdmFsdWUuIFVSSS90eXBlIHJlZmVycyB0byB0aGUgZW51bSBzaW1wbGVUeXBlLgorY29uc3QgY2hhciAqVHlwZXM6OmVuYW1lKGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKnZhbHVlKQoreyBjb25zdCBjaGFyICpzID0gZW5hbWVzW1BhaXIodHlwZSx2YWx1ZSldOworICBpZiAoIXMpCisgIHsgcyA9IGZuYW1lKE5VTEwsIE5VTEwsIHZhbHVlLCAmcm5hbWVzLCBOT0xPT0tVUCk7CisgICAgaWYgKCFlZmxhZyAmJiAqdHlwZSkKKyAgICB7IC8vIEFkZCBwcmVmaXggdG8gZW51bQorICAgICAgY2hhciAqYnVmID0gKGNoYXIqKWVtYWxsb2Moc3RybGVuKHR5cGUpICsgc3RybGVuKHMpICsgMyk7CisgICAgICBpZiAoc1swXSA9PSAnXycgJiYgc1sxXSAhPSAneCcpCQkvLyBfeFhYWFggaXMgT0sgaGVyZQorICAgICAgICBzcHJpbnRmKGJ1ZiwgIiVzXyVzIiwgdHlwZSwgcyk7CisgICAgICBlbHNlCisgICAgICAgIHNwcmludGYoYnVmLCAiJXNfXyVzIiwgdHlwZSwgcyk7CisgICAgICBzID0gYnVmOworICAgIH0KKyAgICBlbHNlCisgICAgICBybmFtZXMuaW5zZXJ0KHMpOworICAgIGVuYW1lc1tQYWlyKHR5cGUsdmFsdWUpXSA9IHM7CisgIH0KKyAgcmV0dXJuIHM7Cit9CisKKy8vIGdldCBvcGVyYXRpb24gbmFtZQorY29uc3QgY2hhciAqVHlwZXM6Om9uYW1lKGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqVVJJLCBjb25zdCBjaGFyICpxbmFtZSkKK3sgY29uc3QgY2hhciAqcyA9IGZuYW1lKHByZWZpeCwgVVJJLCBxbmFtZSwgTlVMTCwgTE9PS1VQKTsKKyAgaWYgKHMgJiYgdXNldHlwZW1hcFtzXSkKKyAgeyAvLyBBdm9pZCBuYW1lIGNsYXNoIHdpdGggc3RydWN0cy9jbGFzc2VzIG9mIHRoZSBzYW1lIG5hbWUKKyAgICBvbmFtZXMuaW5zZXJ0KHMpOworICB9CisgIHMgPSBmbmFtZShwcmVmaXgsIFVSSSwgcW5hbWUsICZvbmFtZXMsIE5PTE9PS1VQKTsKKyAgb25hbWVzLmluc2VydChzKTsKKyAgcmV0dXJuIHM7Cit9CisKKy8vIGdlbmVyYXRlIHN0cnVjdCBuYW1lCitjb25zdCBjaGFyICpUeXBlczo6c25hbWUoY29uc3QgY2hhciAqVVJJLCBjb25zdCBjaGFyICpuYW1lKQoreyBjb25zdCBjaGFyICpzOworICBjaGFyICp0OworICBpZiAoIWFmbGFnICYmIG5hbWUpCisgIHsgc2l6ZV90IGxlbiA9IDA7CisgICAgZm9yIChWZWN0b3JPZlN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaSA9IHNjb3BlLmJlZ2luKCk7IGkgIT0gc2NvcGUuZW5kKCk7ICsraSkKKyAgICAgIGxlbiArPSBzdHJsZW4oKmkpICsgMTsKKyAgICB0ID0gKGNoYXIqKWVtYWxsb2MobGVuICsgc3RybGVuKG5hbWUpICsgMSk7CisgICAgKnQgPSAnXDAnOworICAgIGZvciAoVmVjdG9yT2ZTdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGogPSBzY29wZS5iZWdpbigpOyBqICE9IHNjb3BlLmVuZCgpOyArK2opCisgICAgeyBzdHJjYXQodCwgKmopOworICAgICAgc3RyY2F0KHQsICItIik7CisgICAgfQorICAgIHN0cmNhdCh0LCBuYW1lKTsKKyAgICBzID0gZm5hbWUoIl8iLCBVUkksIHQsICZybmFtZXMsIE5PTE9PS1VQKTsKKyAgICBybmFtZXMuaW5zZXJ0KHMpOworICB9CisgIGVsc2UgaWYgKFVSSSkKKyAgeyBzID0gbnNwcmVmaXgoTlVMTCwgVVJJKTsKKyAgICB0ID0gKGNoYXIqKWVtYWxsb2Moc3RybGVuKHMpICsgMTYpOworICAgIHNwcmludGYodCwgIl8lc19fc3RydWN0XyVkIiwgcywgc251bSsrKTsKKyAgICBzID0gdDsKKyAgfQorICBlbHNlCisgIHsgdCA9IChjaGFyKillbWFsbG9jKDE2KTsKKyAgICBzcHJpbnRmKHQsICJzdHJ1Y3RfJWQiLCBzbnVtKyspOworICAgIHMgPSB0OworICB9CisgIHJldHVybiBzOworfQorCisvLyBnZW5lcmF0ZSB1bmlvbiBuYW1lCitjb25zdCBjaGFyICpUeXBlczo6dW5hbWUoY29uc3QgY2hhciAqVVJJKQoreyBjb25zdCBjaGFyICpzOworICBjaGFyICp0OworICBpZiAoIWFmbGFnKQorICB7IHNpemVfdCBsZW4gPSAwOworICAgIGZvciAoVmVjdG9yT2ZTdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGkgPSBzY29wZS5iZWdpbigpOyBpICE9IHNjb3BlLmVuZCgpOyArK2kpCisgICAgICBsZW4gKz0gc3RybGVuKCppKSArIDE7CisgICAgdCA9IChjaGFyKillbWFsbG9jKGxlbiArIDYpOworICAgIHN0cmNweSh0LCAidW5pb24iKTsKKyAgICBmb3IgKFZlY3Rvck9mU3RyaW5nOjpjb25zdF9pdGVyYXRvciBqID0gc2NvcGUuYmVnaW4oKTsgaiAhPSBzY29wZS5lbmQoKTsgKytqKQorICAgIHsgc3RyY2F0KHQsICItIik7CisgICAgICBzdHJjYXQodCwgKmopOworICAgIH0KKyAgICBzID0gZm5hbWUoIl8iLCBVUkksIHQsICZybmFtZXMsIE5PTE9PS1VQKTsKKyAgICBybmFtZXMuaW5zZXJ0KHMpOworICB9CisgIGVsc2UgaWYgKFVSSSkKKyAgeyBzID0gbnNwcmVmaXgoTlVMTCwgVVJJKTsKKyAgICB0ID0gKGNoYXIqKWVtYWxsb2Moc3RybGVuKHMpICsgMTYpOworICAgIHNwcmludGYodCwgIl8lc19fdW5pb25fJWQiLCBzLCB1bnVtKyspOworICAgIHMgPSB0OworICB9CisgIGVsc2UKKyAgeyB0ID0gKGNoYXIqKWVtYWxsb2MoMTYpOworICAgIHNwcmludGYodCwgIl91bmlvbl8lZCIsIHVudW0rKyk7CisgICAgcyA9IHQ7CisgIH0KKyAgcmV0dXJuIHM7Cit9CisKKy8vIGdlbmVyYXRlIGVudW0gbmFtZQorY29uc3QgY2hhciAqVHlwZXM6OmduYW1lKGNvbnN0IGNoYXIgKlVSSSwgY29uc3QgY2hhciAqbmFtZSkKK3sgY29uc3QgY2hhciAqczsKKyAgY2hhciAqdDsKKyAgaWYgKCFhZmxhZyAmJiBuYW1lKQorICB7IHNpemVfdCBsZW4gPSAwOworICAgIGZvciAoVmVjdG9yT2ZTdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGkgPSBzY29wZS5iZWdpbigpOyBpICE9IHNjb3BlLmVuZCgpOyArK2kpCisgICAgICBsZW4gKz0gc3RybGVuKCppKSArIDE7CisgICAgdCA9IChjaGFyKillbWFsbG9jKGxlbiArIHN0cmxlbihuYW1lKSArIDEpOworICAgICp0ID0gJ1wwJzsKKyAgICBmb3IgKFZlY3Rvck9mU3RyaW5nOjpjb25zdF9pdGVyYXRvciBqID0gc2NvcGUuYmVnaW4oKTsgaiAhPSBzY29wZS5lbmQoKTsgKytqKQorICAgIHsgc3RyY2F0KHQsICpqKTsKKyAgICAgIHN0cmNhdCh0LCAiLSIpOworICAgIH0KKyAgICBzdHJjYXQodCwgbmFtZSk7CisgICAgcyA9IGZuYW1lKCJfIiwgVVJJLCB0LCAmcm5hbWVzLCBOT0xPT0tVUCk7CisgICAgcm5hbWVzLmluc2VydChzKTsKKyAgfQorICBlbHNlIGlmIChVUkkpCisgIHsgcyA9IG5zcHJlZml4KE5VTEwsIFVSSSk7CisgICAgdCA9IChjaGFyKillbWFsbG9jKHN0cmxlbihzKSArIDE2KTsKKyAgICBzcHJpbnRmKHQsICJfJXNfX2VudW1fJWQiLCBzLCBnbnVtKyspOworICAgIHMgPSB0OworICB9CisgIGVsc2UKKyAgeyB0ID0gKGNoYXIqKWVtYWxsb2MoMTYpOworICAgIHNwcmludGYodCwgImVudW1fJWQiLCBnbnVtKyspOworICAgIHMgPSB0OworICB9CisgIHJldHVybiBzOworfQorCisvLyBjaGVjayBpZiBuaWxsYWJsZSBvciBtaW5PY2N1cnM9MCAoYW5kIG5vIGRlZmF1bHQgdmFsdWUgaXMgcHJlc2VudCkKK2Jvb2wgVHlwZXM6OmlzX25pbGxhYmxlKGNvbnN0IHhzX19lbGVtZW50JiBlbGVtZW50KQoreyByZXR1cm4gIWVsZW1lbnQuZGVmYXVsdF8gJiYgKGVsZW1lbnQubmlsbGFibGUgfHwgKGVsZW1lbnQubWluT2NjdXJzICYmICFzdHJjbXAoZWxlbWVudC5taW5PY2N1cnMsICIwIikpKTsKK30KKworYm9vbCBUeXBlczo6aXNfYmFzZXR5cGUoY29uc3QgY2hhciAqdHlwZSkKK3sgaWYgKCFzdHJjbXAodHlwZSwgInhzOmFueVR5cGUiKQorICAgfHwgIXN0cmNtcCh0bmFtZShOVUxMLCBOVUxMLCB0eXBlKSwgInN0ZDo6c3RyaW5nIikpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gIXN0cm5jbXAodHlwZSwgInhzOiIsIDMpIHx8ICFzdHJuY21wKHR5cGUsICJTT0FQLUVOQzoiLCA5KTsKK30KKwordm9pZCBUeXBlczo6ZGVmaW5lKGNvbnN0IGNoYXIgKlVSSSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgeHNfX2NvbXBsZXhUeXBlJiBjb21wbGV4VHlwZSkKK3sgLy8gZ2VuZXJhdGUgcHJvdG90eXBlIGZvciBzdHJ1Y3RzL2NsYXNzZXMgYW5kIHN0b3JlIG5hbWUKKyAgY29uc3QgY2hhciAqcHJlZml4ID0gTlVMTDsKKyAgaWYgKGNvbXBsZXhUeXBlLm5hbWUpCisgICAgbmFtZSA9IGNvbXBsZXhUeXBlLm5hbWU7CisgIGVsc2UKKyAgICBwcmVmaXggPSAiXyI7CisgIGlmIChjb21wbGV4VHlwZS5jb21wbGV4Q29udGVudCAmJiBjb21wbGV4VHlwZS5jb21wbGV4Q29udGVudC0+cmVzdHJpY3Rpb24gJiYgIXN0cmNtcChjb21wbGV4VHlwZS5jb21wbGV4Q29udGVudC0+cmVzdHJpY3Rpb24tPmJhc2UsICJTT0FQLUVOQzpBcnJheSIpKQorICB7IGlmIChzdHJjbXAoc2NoZW1hX3ByZWZpeCwgIm5zIikpCisgICAgICBwcmVmaXggPSAiKiI7CisgICAgZWxzZQorICAgICAgcHJlZml4ID0gIiI7CisgIH0KKyAgaWYgKGNmbGFnKQorICB7IGNvbnN0IGNoYXIgKnQgPSBkZWZ0bmFtZShTVFJVQ1QsICIqIiwgdHJ1ZSwgcHJlZml4LCBVUkksIG5hbWUpOworICAgIGlmICh0KQorICAgIHsgaWYgKHlmbGFnKQorICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIlxuLy8vIFR5cGVkZWYgc3lub255bSBmb3Igc3RydWN0ICVzLlxudHlwZWRlZiBzdHJ1Y3QgJXMgJXM7XG4iLCB0LCB0LCB0KTsKKyAgICB9CisgICAgZWxzZSBpZiAobmFtZSkKKyAgICB7IHQgPSBkZWZ0eXBlbWFwW2NuYW1lKHByZWZpeCwgVVJJLCBuYW1lKV07CisgICAgICBpZiAodCkKKyAgICAgIHsgZnByaW50ZihzdHJlYW0sICJcbi8vLyBJbXBvcnRlZCBjb21wbGV4VHlwZSBcIiVzXCI6JXMgZnJvbSB0eXBlbWFwICVzLlxuIiwgVVJJLCBuYW1lLCBtYXBmaWxlP21hcGZpbGU6IiIpOworICAgICAgICBkb2N1bWVudChjb21wbGV4VHlwZS5hbm5vdGF0aW9uKTsKKyAgICAgICAgaWYgKCp0KQorCSAgZm9ybWF0KHQpOworICAgICAgICBlbHNlCisJICBmcHJpbnRmKHN0cmVhbSwgIi8vIGNvbXBsZXhUeXBlIGRlZmluaXRpb24gaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rLlxuIik7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UgCisgIHsgY29uc3QgY2hhciAqdCA9IGRlZnRuYW1lKENMQVNTLCAiKiIsIHRydWUsIHByZWZpeCwgVVJJLCBuYW1lKTsKKyAgICBpZiAodCkKKyAgICAgIGZwcmludGYoc3RyZWFtLCAiXG4vLyAgRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBjbGFzcyAlcy5cbmNsYXNzICVzO1xuIiwgdCwgdCk7CisgICAgZWxzZSBpZiAobmFtZSkKKyAgICB7IHQgPSBkZWZ0eXBlbWFwW2NuYW1lKHByZWZpeCwgVVJJLCBuYW1lKV07CisgICAgICBpZiAodCkKKyAgICAgIHsgZnByaW50ZihzdHJlYW0sICJcbi8vLyBJbXBvcnRlZCBjb21wbGV4VHlwZSBcIiVzXCI6JXMgZnJvbSB0eXBlbWFwICVzLlxuIiwgVVJJLCBuYW1lLCBtYXBmaWxlP21hcGZpbGU6IiIpOworICAgICAgICBkb2N1bWVudChjb21wbGV4VHlwZS5hbm5vdGF0aW9uKTsKKyAgICAgICAgaWYgKCp0KQorCSAgZm9ybWF0KHQpOworICAgICAgICBlbHNlCisJICBmcHJpbnRmKHN0cmVhbSwgIi8vIGNvbXBsZXhUeXBlIGRlZmluaXRpb24gaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rLlxuIik7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgVHlwZXM6Omdlbihjb25zdCBjaGFyICpVUkksIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHhzX19zaW1wbGVUeXBlJiBzaW1wbGVUeXBlLCBib29sIGFub255bW91cykKK3sgY29uc3QgY2hhciAqdCA9IE5VTEw7CisgIGNvbnN0IGNoYXIgKnByZWZpeCA9IE5VTEw7CisgIGlmIChzaW1wbGVUeXBlLm5hbWUpCisgICAgbmFtZSA9IHNpbXBsZVR5cGUubmFtZTsKKyAgZWxzZQorICAgIHByZWZpeCA9ICJfIjsKKyAgaWYgKCFhbm9ueW1vdXMpCisgIHsgdCA9IGRlZnR5cGVtYXBbY25hbWUoTlVMTCwgVVJJLCBuYW1lKV07CisgICAgaWYgKHQpCisgICAgeyBmcHJpbnRmKHN0cmVhbSwgIlxuLy8vIEltcG9ydGVkIHNpbXBsZVR5cGUgXCIlc1wiOiVzIGZyb20gdHlwZW1hcCAlcy5cbiIsIFVSSSwgbmFtZSwgbWFwZmlsZT9tYXBmaWxlOiIiKTsKKyAgICAgIGRvY3VtZW50KHNpbXBsZVR5cGUuYW5ub3RhdGlvbik7CisgICAgICBpZiAoKnQpCisJZm9ybWF0KHQpOworICAgICAgZWxzZQorCWZwcmludGYoc3RyZWFtLCAiLy8gc2ltcGxlVHlwZSBkZWZpbml0aW9uIGludGVudGlvbmFsbHkgbGVmdCBibGFuay5cbiIpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBpZiAoc2ltcGxlVHlwZS5yZXN0cmljdGlvbiAmJiBzaW1wbGVUeXBlLnJlc3RyaWN0aW9uLT5iYXNlKQorICB7IGlmICghYW5vbnltb3VzKQorICAgICAgZnByaW50ZihzdHJlYW0sICJcbi8vLyBcIiVzXCI6JXMgaXMgYSBzaW1wbGVUeXBlIHJlc3RyaWN0aW9uIG9mICVzLlxuIiwgVVJJP1VSSToiIiwgbmFtZSwgc2ltcGxlVHlwZS5yZXN0cmljdGlvbi0+YmFzZSk7CisgICAgZG9jdW1lbnQoc2ltcGxlVHlwZS5hbm5vdGF0aW9uKTsKKyAgICBkb2N1bWVudChzaW1wbGVUeXBlLnJlc3RyaWN0aW9uLT5hbm5vdGF0aW9uKTsKKyAgICBpZiAoIXNpbXBsZVR5cGUucmVzdHJpY3Rpb24tPmVudW1lcmF0aW9uLmVtcHR5KCkpCisgICAgeyBib29sIGlzX251bWVyaWMgPSB0cnVlOyAvLyBjaGVjayBpZiBhbGwgZW51bWVyYXRpb24gdmFsdWVzIGFyZSBudW1lcmljCisgICAgICBib29sIGlzX3FuYW1lID0gIXN0cmNtcChzaW1wbGVUeXBlLnJlc3RyaWN0aW9uLT5iYXNlLCAieHM6UU5hbWUiKTsKKyAgICAgIGlmICghYW5vbnltb3VzKQorICAgICAgeyB0ID0gZGVmdG5hbWUoRU5VTSwgTlVMTCwgZmFsc2UsIHByZWZpeCwgVVJJLCBuYW1lKTsKKyAgICAgICAgaWYgKHQgJiYgIWVmbGFnKQorICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiLy8vIE5vdGU6IGVudW0gdmFsdWVzIGFyZSBwcmVmaXhlZCB3aXRoICclcycgdG8gYXZvaWQgbmFtZSBjbGFzaGVzLCBwbGVhc2UgdXNlIHdzZGwyaCBvcHRpb24gLWUgdG8gb21pdCB0aGlzIHByZWZpeFxuIiwgdCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHQgPSBnbmFtZShVUkksIG5hbWUpOworICAgICAgaWYgKCFhbm9ueW1vdXMpCisgICAgICAgIGZwcmludGYoc3RyZWFtLCAiZW51bSAlc1xue1xuIiwgdCk7CisgICAgICBlbHNlCisgICAgICAgIGZwcmludGYoc3RyZWFtLCAiICAgIGVudW0gJXNcbiAgICB7XG4iLCB0KTsKKyAgICAgIGZvciAodmVjdG9yPHhzX19lbnVtZXJhdGlvbj46OmNvbnN0X2l0ZXJhdG9yIGVudW1lcmF0aW9uMSA9IHNpbXBsZVR5cGUucmVzdHJpY3Rpb24tPmVudW1lcmF0aW9uLmJlZ2luKCk7IGVudW1lcmF0aW9uMSAhPSBzaW1wbGVUeXBlLnJlc3RyaWN0aW9uLT5lbnVtZXJhdGlvbi5lbmQoKTsgKytlbnVtZXJhdGlvbjEpCisgICAgICB7IGNvbnN0IGNoYXIgKnM7CisgICAgICAgIGlmICgocyA9ICgqZW51bWVyYXRpb24xKS52YWx1ZSkpCisJICBpc19udW1lcmljICY9IGlzX2ludGVnZXIocyk7CisgICAgICB9CisgICAgICBTZXRPZlN0cmluZyBlbnVtdmFsczsKKyAgICAgIGZvciAodmVjdG9yPHhzX19lbnVtZXJhdGlvbj46OmNvbnN0X2l0ZXJhdG9yIGVudW1lcmF0aW9uMiA9IHNpbXBsZVR5cGUucmVzdHJpY3Rpb24tPmVudW1lcmF0aW9uLmJlZ2luKCk7IGVudW1lcmF0aW9uMiAhPSBzaW1wbGVUeXBlLnJlc3RyaWN0aW9uLT5lbnVtZXJhdGlvbi5lbmQoKTsgKytlbnVtZXJhdGlvbjIpCisgICAgICB7IGNvbnN0IGNoYXIgKnM7CisgICAgICAgIGRvY3VtZW50KCgqZW51bWVyYXRpb24yKS5hbm5vdGF0aW9uKTsKKyAgICAgICAgaWYgKChzID0gKCplbnVtZXJhdGlvbjIpLnZhbHVlKSkKKwl7IGlmICghZW51bXZhbHMuY291bnQocykpCisJICB7IGVudW12YWxzLmluc2VydChzKTsKKwkgICAgaWYgKGlzX251bWVyaWMpCisgICAgICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiXHQlcyA9ICVzLFx0Ly8vPCAlcyB2YWx1ZT1cIiVzXCJcbiIsIGVuYW1lKHQsIHMpLCBzLCBzaW1wbGVUeXBlLnJlc3RyaWN0aW9uLT5iYXNlLCBzKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGlzX3FuYW1lICYmICgqZW51bWVyYXRpb24yKS52YWx1ZV8pCisgICAgICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiXHQlcyxcdC8vLzwgJXMgdmFsdWU9XCIlc1wiXG4iLCBlbmFtZSh0LCAoKmVudW1lcmF0aW9uMikudmFsdWVfKSwgc2ltcGxlVHlwZS5yZXN0cmljdGlvbi0+YmFzZSwgKCplbnVtZXJhdGlvbjIpLnZhbHVlXyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiXHQlcyxcdC8vLzwgJXMgdmFsdWU9XCIlc1wiXG4iLCBlbmFtZSh0LCBzKSwgc2ltcGxlVHlwZS5yZXN0cmljdGlvbi0+YmFzZSwgcyk7CisJICB9CisJfQorICAgICAgICBlbHNlCisgICAgICAgICAgZnByaW50ZihzdHJlYW0sICIvL1x0dW5yZWNvZ25pemVkOiBlbnVtZXJhdGlvbiAnJXMnIGhhcyBubyB2YWx1ZVxuIiwgbmFtZT9uYW1lOiIiKTsKKyAgICAgIH0KKyAgICAgIGlmICghYW5vbnltb3VzKQorICAgICAgeyBmcHJpbnRmKHN0cmVhbSwgIn07XG4iKTsKKyAgICAgICAgaWYgKHlmbGFnKQorCSAgZnByaW50ZihzdHJlYW0sICIvLy8gVHlwZWRlZiBzeW5vbnltIGZvciBlbnVtICVzLlxudHlwZWRlZiBlbnVtICVzICVzO1xuIiwgdCwgdCwgdCk7CisgICAgICAgIGlmIChwZmxhZykKKyAgICAgICAgeyBjb25zdCBjaGFyICpzID0gYW5hbWUocHJlZml4LCBVUkksIG5hbWUpOworCSAga25hbWVzLmluc2VydChzKTsKKyAgICAgICAgICBzID0gYW5hbWUocHJlZml4LCBVUkksIG5hbWUpOworICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiXG4vLy8gQ2xhc3Mgd3JhcHBlclxuIik7CisgICAgICAgICAgZnByaW50ZihzdHJlYW0sICJjbGFzcyAlcyA6IHB1YmxpYyB4c2RfX2FueVR5cGVcbnsgcHVibGljOlxuIiwgcyk7CisgICAgICAgICAgZnByaW50ZihzdHJlYW0sIGVsZW1lbnRmb3JtYXQsIHRuYW1lKHByZWZpeCwgVVJJLCBuYW1lKSwgIl9faXRlbTsiKTsKKwkgIG1vZGlmeShzKTsKKyAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIlxufTtcbiIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIGZwcmludGYoc3RyZWFtLCAiICAgIH1cbiIpOworICAgIH0KKyAgICBlbHNlCisgICAgeyBpZiAoc2ltcGxlVHlwZS5yZXN0cmljdGlvbi0+bGVuZ3RoICYmIHNpbXBsZVR5cGUucmVzdHJpY3Rpb24tPmxlbmd0aC0+dmFsdWUpCisgICAgICAgIGZwcmludGYoc3RyZWFtLCAiLy8vIExlbmd0aCBvZiB0aGlzIHN0cmluZyBpcyBleGFjdGx5ICVzIGNoYXJhY3RlcnNcbiIsIHNpbXBsZVR5cGUucmVzdHJpY3Rpb24tPmxlbmd0aC0+dmFsdWUpOworICAgICAgZWxzZQorICAgICAgeyBjb25zdCBjaGFyICphID0gTlVMTCwgKmIgPSBOVUxMOworICAgICAgICBpZiAoc2ltcGxlVHlwZS5yZXN0cmljdGlvbi0+bWluTGVuZ3RoKQorICAgICAgICAgIGEgPSBzaW1wbGVUeXBlLnJlc3RyaWN0aW9uLT5taW5MZW5ndGgtPnZhbHVlOworICAgICAgICBpZiAoc2ltcGxlVHlwZS5yZXN0cmljdGlvbi0+bWF4TGVuZ3RoKQorICAgICAgICAgIGIgPSBzaW1wbGVUeXBlLnJlc3RyaWN0aW9uLT5tYXhMZW5ndGgtPnZhbHVlOworICAgICAgICBpZiAoYSB8fCBiKQorICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiLy8vIExlbmd0aCBvZiB0aGlzIHN0cmluZyBpcyB3aXRoaW4gJXMuLiVzIGNoYXJhY3RlcnNcbiIsIGE/YToiMCIsIGI/YjoiIik7CisgICAgICB9CisgICAgICBpZiAoc2ltcGxlVHlwZS5yZXN0cmljdGlvbi0+cHJlY2lzaW9uICYmIHNpbXBsZVR5cGUucmVzdHJpY3Rpb24tPnByZWNpc2lvbi0+dmFsdWUpCisgICAgICAgIGZwcmludGYoc3RyZWFtLCAiLy8vICVzcHJlY2lzaW9uIGlzICVzXG4iLCBzaW1wbGVUeXBlLnJlc3RyaWN0aW9uLT5wcmVjaXNpb24tPmZpeGVkPyJmaXhlZCAiOiIiLCBzaW1wbGVUeXBlLnJlc3RyaWN0aW9uLT5wcmVjaXNpb24tPnZhbHVlKTsKKyAgICAgIGlmIChzaW1wbGVUeXBlLnJlc3RyaWN0aW9uLT5zY2FsZSAmJiBzaW1wbGVUeXBlLnJlc3RyaWN0aW9uLT5zY2FsZS0+dmFsdWUpCisgICAgICAgIGZwcmludGYoc3RyZWFtLCAiLy8vICVzc2NhbGUgaXMgJXNcbiIsIHNpbXBsZVR5cGUucmVzdHJpY3Rpb24tPnNjYWxlLT5maXhlZD8iZml4ZWQgIjoiIiwgc2ltcGxlVHlwZS5yZXN0cmljdGlvbi0+c2NhbGUtPnZhbHVlKTsKKyAgICAgIGlmIChzaW1wbGVUeXBlLnJlc3RyaWN0aW9uLT50b3RhbERpZ2l0cyAmJiBzaW1wbGVUeXBlLnJlc3RyaWN0aW9uLT50b3RhbERpZ2l0cy0+dmFsdWUpCisgICAgICAgIGZwcmludGYoc3RyZWFtLCAiLy8vICVzbnVtYmVyIG9mIHRvdGFsIGRpZ2l0cyBpcyAlc1xuIiwgc2ltcGxlVHlwZS5yZXN0cmljdGlvbi0+dG90YWxEaWdpdHMtPmZpeGVkPyJmaXhlZCAiOiIiLCBzaW1wbGVUeXBlLnJlc3RyaWN0aW9uLT50b3RhbERpZ2l0cy0+dmFsdWUpOworICAgICAgaWYgKHNpbXBsZVR5cGUucmVzdHJpY3Rpb24tPmZyYWN0aW9uRGlnaXRzICYmIHNpbXBsZVR5cGUucmVzdHJpY3Rpb24tPmZyYWN0aW9uRGlnaXRzLT52YWx1ZSkKKyAgICAgICAgZnByaW50ZihzdHJlYW0sICIvLy8gJXNudW1iZXIgb2YgZnJhY3Rpb24gZGlnaXRzIGlzICVzXG4iLCBzaW1wbGVUeXBlLnJlc3RyaWN0aW9uLT5mcmFjdGlvbkRpZ2l0cy0+Zml4ZWQ/ImZpeGVkICI6IiIsIHNpbXBsZVR5cGUucmVzdHJpY3Rpb24tPmZyYWN0aW9uRGlnaXRzLT52YWx1ZSk7CisgICAgICBmb3IgKHZlY3Rvcjx4c19fcGF0dGVybj46OmNvbnN0X2l0ZXJhdG9yIHBhdHRlcm4xID0gc2ltcGxlVHlwZS5yZXN0cmljdGlvbi0+cGF0dGVybi5iZWdpbigpOyBwYXR0ZXJuMSAhPSBzaW1wbGVUeXBlLnJlc3RyaWN0aW9uLT5wYXR0ZXJuLmVuZCgpOyArK3BhdHRlcm4xKQorICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIi8vLyBDb250ZW50IHBhdHRlcm4gaXMgXCIlc1wiXG4iLCB4c3RyaW5nKCgqcGF0dGVybjEpLnZhbHVlKSk7CisgICAgICBjb25zdCBjaGFyICphaSA9IE5VTEwsICphZSA9IE5VTEwsICpiaSA9IE5VTEwsICpiZSA9IE5VTEw7CisgICAgICBpZiAoc2ltcGxlVHlwZS5yZXN0cmljdGlvbi0+bWluSW5jbHVzaXZlKQorICAgICAgICBhaSA9IHNpbXBsZVR5cGUucmVzdHJpY3Rpb24tPm1pbkluY2x1c2l2ZS0+dmFsdWU7CisgICAgICBlbHNlIGlmIChzaW1wbGVUeXBlLnJlc3RyaWN0aW9uLT5taW5FeGNsdXNpdmUpCisgICAgICAgIGFlID0gc2ltcGxlVHlwZS5yZXN0cmljdGlvbi0+bWluRXhjbHVzaXZlLT52YWx1ZTsKKyAgICAgIGlmIChzaW1wbGVUeXBlLnJlc3RyaWN0aW9uLT5tYXhJbmNsdXNpdmUpCisgICAgICAgIGJpID0gc2ltcGxlVHlwZS5yZXN0cmljdGlvbi0+bWF4SW5jbHVzaXZlLT52YWx1ZTsKKyAgICAgIGVsc2UgaWYgKHNpbXBsZVR5cGUucmVzdHJpY3Rpb24tPm1heEV4Y2x1c2l2ZSkKKyAgICAgICAgYmUgPSBzaW1wbGVUeXBlLnJlc3RyaWN0aW9uLT5tYXhFeGNsdXNpdmUtPnZhbHVlOworICAgICAgaWYgKGFpIHx8IGFlIHx8IGJpIHx8IGJlKQorICAgICAgeyBmcHJpbnRmKHN0cmVhbSwgIi8vLyBWYWx1ZSByYW5nZSBpcyAiKTsKKyAgICAgICAgaWYgKGFpKQorCSAgZnByaW50ZihzdHJlYW0sICJbJXMuLiIsIGFpKTsKKyAgICAgICAgZWxzZSBpZiAoYWUpCisJICBmcHJpbnRmKHN0cmVhbSwgIiglcy4uIiwgYWUpOworICAgICAgICBlbHNlCisJICBmcHJpbnRmKHN0cmVhbSwgIlstSU5GLi4iKTsKKyAgICAgICAgaWYgKGJpKQorCSAgZnByaW50ZihzdHJlYW0sICIlc11cbiIsIGJpKTsKKyAgICAgICAgZWxzZSBpZiAoYmUpCisJICBmcHJpbnRmKHN0cmVhbSwgIiVzKVxuIiwgYmUpOworICAgICAgICBlbHNlCisJICBmcHJpbnRmKHN0cmVhbSwgIklORl1cbiIpOworICAgICAgfQorICAgICAgaWYgKCFzaW1wbGVUeXBlLnJlc3RyaWN0aW9uLT5hdHRyaWJ1dGUuZW1wdHkoKSkKKyAgICAgIHsgZnByaW50ZihzdGRlcnIsICJcbldhcm5pbmc6IHNpbXBsZVR5cGUgJyVzJyBzaG91bGQgbm90IGhhdmUgYXR0cmlidXRlc1xuIiwgbmFtZT9uYW1lOiIiKTsKKyAgICAgIH0KKyAgICAgIGNvbnN0IGNoYXIgKnMgPSB0bmFtZShOVUxMLCBOVUxMLCBzaW1wbGVUeXBlLnJlc3RyaWN0aW9uLT5iYXNlKTsKKyAgICAgIGlmICghYW5vbnltb3VzKQorICAgICAgeyBib29sIGlzX3B0ciA9IGZhbHNlOworCWlzX3B0ciA9IChzdHJjaHIocywgJyonKSAhPSBOVUxMKSB8fCAocyA9PSBwbmFtZSh0cnVlLCBOVUxMLCBOVUxMLCBzaW1wbGVUeXBlLnJlc3RyaWN0aW9uLT5iYXNlKSk7CisgICAgICAgIHQgPSBkZWZ0bmFtZShUWVBFREVGLCBOVUxMLCBpc19wdHIsIHByZWZpeCwgVVJJLCBuYW1lKTsKKyAgICAgICAgaWYgKHQpCisJICBmcHJpbnRmKHN0cmVhbSwgInR5cGVkZWYgJXMgJXMiLCBzLCB0KTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgdCA9ICIiOworICAgICAgICBmcHJpbnRmKHN0cmVhbSwgZWxlbWVudGZvcm1hdCwgcywgIiIpOworICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIlxuIik7CisgICAgICB9CisgICAgICBpZiAodCkKKyAgICAgIHsgaWYgKCFhbm9ueW1vdXMgJiYgIXNpbXBsZVR5cGUucmVzdHJpY3Rpb24tPnBhdHRlcm4uZW1wdHkoKSkKKyAgICAgICAgeyBmcHJpbnRmKHN0cmVhbSwgIiBcIiIpOworICAgICAgICAgIGZvciAodmVjdG9yPHhzX19wYXR0ZXJuPjo6Y29uc3RfaXRlcmF0b3IgcGF0dGVybjIgPSBzaW1wbGVUeXBlLnJlc3RyaWN0aW9uLT5wYXR0ZXJuLmJlZ2luKCk7IHBhdHRlcm4yICE9IHNpbXBsZVR5cGUucmVzdHJpY3Rpb24tPnBhdHRlcm4uZW5kKCk7ICsrcGF0dGVybjIpCisgICAgICAgICAgeyBpZiAocGF0dGVybjIgIT0gc2ltcGxlVHlwZS5yZXN0cmljdGlvbi0+cGF0dGVybi5iZWdpbigpKQorICAgICAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgInwiKTsKKyAgICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiJXMiLCB4c3RyaW5nKCgqcGF0dGVybjIpLnZhbHVlKSk7CisgICAgICAgICAgfQorICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiXCIiKTsKKyAgICAgICAgfQorCS8vIGFkZCByYW5nZSBpbmZvIG9ubHkgd2hlbiB0eXBlIGlzIG51bWVyaWMKKwlib29sIGlzX251bWVyaWMgPSBmYWxzZTsKKwlpZiAoIXN0cm5jbXAocywgInVuc2lnbmVkICIsIDkpKQorCSAgcyArPSA5OworCWlmIChzdHJzdHIoImNoYXIgc2hvcnQgaW50IExPTkc2NCBmbG9hdCBkb3VibGUgIiwgcykpCisJICBpc19udW1lcmljID0gdHJ1ZTsKKyAgICAgICAgaWYgKCFhbm9ueW1vdXMgJiYgc2ltcGxlVHlwZS5yZXN0cmljdGlvbi0+bWluTGVuZ3RoICYmIHNpbXBsZVR5cGUucmVzdHJpY3Rpb24tPm1pbkxlbmd0aC0+dmFsdWUpCisgICAgICAgICAgZnByaW50ZihzdHJlYW0sICIgJXMiLCBzaW1wbGVUeXBlLnJlc3RyaWN0aW9uLT5taW5MZW5ndGgtPnZhbHVlKTsKKyAgICAgICAgZWxzZSBpZiAoaXNfbnVtZXJpYyAmJiAhYW5vbnltb3VzICYmIHNpbXBsZVR5cGUucmVzdHJpY3Rpb24tPm1pbkluY2x1c2l2ZSAmJiBzaW1wbGVUeXBlLnJlc3RyaWN0aW9uLT5taW5JbmNsdXNpdmUtPnZhbHVlICYmIGlzX2ludGVnZXIoc2ltcGxlVHlwZS5yZXN0cmljdGlvbi0+bWluSW5jbHVzaXZlLT52YWx1ZSkpCisgICAgICAgICAgZnByaW50ZihzdHJlYW0sICIgJXMiLCBzaW1wbGVUeXBlLnJlc3RyaWN0aW9uLT5taW5JbmNsdXNpdmUtPnZhbHVlKTsKKyAgICAgICAgaWYgKCFhbm9ueW1vdXMgJiYgc2ltcGxlVHlwZS5yZXN0cmljdGlvbi0+bWF4TGVuZ3RoICYmIHNpbXBsZVR5cGUucmVzdHJpY3Rpb24tPm1heExlbmd0aC0+dmFsdWUpCisgICAgICAgICAgZnByaW50ZihzdHJlYW0sICI6JXMiLCBzaW1wbGVUeXBlLnJlc3RyaWN0aW9uLT5tYXhMZW5ndGgtPnZhbHVlKTsKKyAgICAgICAgZWxzZSBpZiAoaXNfbnVtZXJpYyAmJiAhYW5vbnltb3VzICYmIHNpbXBsZVR5cGUucmVzdHJpY3Rpb24tPm1heEluY2x1c2l2ZSAmJiBzaW1wbGVUeXBlLnJlc3RyaWN0aW9uLT5tYXhJbmNsdXNpdmUtPnZhbHVlICYmIGlzX2ludGVnZXIoc2ltcGxlVHlwZS5yZXN0cmljdGlvbi0+bWF4SW5jbHVzaXZlLT52YWx1ZSkpCisgICAgICAgICAgZnByaW50ZihzdHJlYW0sICI6JXMiLCBzaW1wbGVUeXBlLnJlc3RyaWN0aW9uLT5tYXhJbmNsdXNpdmUtPnZhbHVlKTsKKyAgICAgICAgaWYgKCFhbm9ueW1vdXMpCisgICAgICAgIHsgZnByaW50ZihzdHJlYW0sICI7XG4iKTsKKyAgICAgICAgICBpZiAocGZsYWcpCisgICAgICAgICAgeyBjb25zdCBjaGFyICpzID0gYW5hbWUocHJlZml4LCBVUkksIG5hbWUpOworCSAgICBrbmFtZXMuaW5zZXJ0KHMpOworICAgICAgICAgICAgcyA9IGFuYW1lKHByZWZpeCwgVVJJLCBuYW1lKTsKKyAgICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiXG4vLy8gQ2xhc3Mgd3JhcHBlclxuIik7CisgICAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgImNsYXNzICVzIDogcHVibGljIHhzZF9fYW55VHlwZVxueyBwdWJsaWM6XG4iLCBzKTsKKyAgICAgICAgICAgIGZwcmludGYoc3RyZWFtLCBlbGVtZW50Zm9ybWF0LCB0bmFtZShwcmVmaXgsIFVSSSwgbmFtZSksICJfX2l0ZW07Iik7CisJICAgIG1vZGlmeShzKTsKKyAgICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiXG59O1xuIik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UgaWYgKHNpbXBsZVR5cGUubGlzdCkKKyAgeyBpZiAoc2ltcGxlVHlwZS5saXN0LT5yZXN0cmljdGlvbiAmJiBzaW1wbGVUeXBlLmxpc3QtPnJlc3RyaWN0aW9uLT5iYXNlKQorICAgIHsgaWYgKCFhbm9ueW1vdXMpCisgICAgICAgIGZwcmludGYoc3RyZWFtLCAiXG4vLy8gXCIlc1wiOiVzIGlzIGEgc2ltcGxlVHlwZSBsaXN0IHJlc3RyaWN0aW9uIG9mICVzLlxuIiwgVVJJP1VSSToiIiwgbmFtZSwgc2ltcGxlVHlwZS5saXN0LT5yZXN0cmljdGlvbi0+YmFzZSk7CisgICAgICBkb2N1bWVudChzaW1wbGVUeXBlLmFubm90YXRpb24pOworICAgICAgaWYgKCFhbm9ueW1vdXMpCisgICAgICB7IHQgPSBkZWZ0bmFtZShFTlVNLCBOVUxMLCBmYWxzZSwgcHJlZml4LCBVUkksIG5hbWUpOworCWlmICh0KQorCSAgZnByaW50ZihzdHJlYW0sICJlbnVtICogJXNcbntcbiIsIHQpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyB0ID0gIiI7CisJZnByaW50ZihzdHJlYW0sICJlbnVtICpcbntcbiIpOworICAgICAgfQorICAgICAgaWYgKHQpCisgICAgICB7IGZvciAodmVjdG9yPHhzX19lbnVtZXJhdGlvbj46OmNvbnN0X2l0ZXJhdG9yIGVudW1lcmF0aW9uID0gc2ltcGxlVHlwZS5saXN0LT5yZXN0cmljdGlvbi0+ZW51bWVyYXRpb24uYmVnaW4oKTsgZW51bWVyYXRpb24gIT0gc2ltcGxlVHlwZS5saXN0LT5yZXN0cmljdGlvbi0+ZW51bWVyYXRpb24uZW5kKCk7ICsrZW51bWVyYXRpb24pCisgICAgICAgIHsgaWYgKCgqZW51bWVyYXRpb24pLnZhbHVlKQorICAgICAgICAgIHsgaWYgKCFzdHJjbXAoc2ltcGxlVHlwZS5saXN0LT5yZXN0cmljdGlvbi0+YmFzZSwgInhzOlFOYW1lIikgJiYgKCplbnVtZXJhdGlvbikudmFsdWVfKQorICAgICAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIlx0JXMsXHQvLy88ICVzIHZhbHVlPVwiJXNcIlxuIiwgZW5hbWUodCwgKCplbnVtZXJhdGlvbikudmFsdWVfKSwgc2ltcGxlVHlwZS5saXN0LT5yZXN0cmljdGlvbi0+YmFzZSwgKCplbnVtZXJhdGlvbikudmFsdWVfKTsKKwkgICAgZWxzZQorICAgICAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIlx0JXMsXHQvLy88ICVzIHZhbHVlPVwiJXNcIlxuIiwgZW5hbWUodCwgKCplbnVtZXJhdGlvbikudmFsdWUpLCBzaW1wbGVUeXBlLmxpc3QtPnJlc3RyaWN0aW9uLT5iYXNlLCAoKmVudW1lcmF0aW9uKS52YWx1ZSk7CisJICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZnByaW50ZihzdHJlYW0sICIvL1x0dW5yZWNvZ25pemVkOiBiaXRtYXNrIGVudW1lcmF0aW9uICclcycgaGFzIG5vIHZhbHVlXG4iLCB0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWFub255bW91cykKKyAgICAgICAgeyBmcHJpbnRmKHN0cmVhbSwgIn07XG4iKTsKKyAgICAgICAgICBpZiAoeWZsYWcpCisJICAgIGZwcmludGYoc3RyZWFtLCAiLy8vIFR5cGVkZWYgc3lub255bSBmb3IgZW51bSAlcy5cbnR5cGVkZWYgZW51bSAlcyAlcztcbiIsIHQsIHQsIHQpOworICAgICAgICAgIGlmIChwZmxhZykKKyAgICAgICAgICB7IGNvbnN0IGNoYXIgKnMgPSBhbmFtZShwcmVmaXgsIFVSSSwgbmFtZSk7CisJICAgIGtuYW1lcy5pbnNlcnQocyk7CisgICAgICAgICAgICBzID0gYW5hbWUocHJlZml4LCBVUkksIG5hbWUpOworICAgICAgICAgICAgZnByaW50ZihzdHJlYW0sICJcbi8vLyBDbGFzcyB3cmFwcGVyXG4iKTsKKyAgICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiY2xhc3MgJXMgOiBwdWJsaWMgeHNkX19hbnlUeXBlXG57IHB1YmxpYzpcbiIsIHMpOworICAgICAgICAgICAgZnByaW50ZihzdHJlYW0sIGVsZW1lbnRmb3JtYXQsIHRuYW1lKHByZWZpeCwgVVJJLCBuYW1lKSwgIl9faXRlbTsiKTsKKwkgICAgbW9kaWZ5KHMpOworICAgICAgICAgICAgZnByaW50ZihzdHJlYW0sICJcbn07XG4iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAifVxuIik7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHNpbXBsZVR5cGUubGlzdC0+aXRlbVR5cGUpCisgICAgeyBjb25zdCB4c19fc2ltcGxlVHlwZSAqcCA9IHNpbXBsZVR5cGUubGlzdC0+aXRlbVR5cGVQdHIoKTsKKyAgICAgIGlmIChwICYmIHAtPnJlc3RyaWN0aW9uICYmIHAtPnJlc3RyaWN0aW9uLT5iYXNlICYmICFwLT5yZXN0cmljdGlvbi0+ZW51bWVyYXRpb24uZW1wdHkoKSAmJiBwLT5yZXN0cmljdGlvbi0+ZW51bWVyYXRpb24uc2l6ZSgpIDw9IDY0KQorICAgICAgeyBpZiAoIWFub255bW91cykKKyAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIlxuLy8vIFwiJXNcIjolcyBpcyBhIHNpbXBsZVR5cGUgbGlzdCBvZiAlcy5cbiIsIFVSST9VUkk6IiIsIG5hbWUsIHNpbXBsZVR5cGUubGlzdC0+aXRlbVR5cGUpOworICAgICAgICBkb2N1bWVudChzaW1wbGVUeXBlLmFubm90YXRpb24pOworICAgICAgICBpZiAoIWFub255bW91cykKKyAgICAgICAgeyB0ID0gZGVmdG5hbWUoRU5VTSwgTlVMTCwgZmFsc2UsIHByZWZpeCwgVVJJLCBuYW1lKTsKKwkgIGlmICh0KQorCSAgICBmcHJpbnRmKHN0cmVhbSwgImVudW0gKiAlc1xue1xuIiwgdCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7IHQgPSAiIjsKKwkgIGZwcmludGYoc3RyZWFtLCAiZW51bSAqXG57XG4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodCkKKwl7IGZvciAodmVjdG9yPHhzX19lbnVtZXJhdGlvbj46OmNvbnN0X2l0ZXJhdG9yIGVudW1lcmF0aW9uID0gcC0+cmVzdHJpY3Rpb24tPmVudW1lcmF0aW9uLmJlZ2luKCk7IGVudW1lcmF0aW9uICE9IHAtPnJlc3RyaWN0aW9uLT5lbnVtZXJhdGlvbi5lbmQoKTsgKytlbnVtZXJhdGlvbikKKyAgICAgICAgICB7IGlmICgoKmVudW1lcmF0aW9uKS52YWx1ZSkKKyAgICAgICAgICAgICAgZnByaW50ZihzdHJlYW0sICJcdCVzLFx0Ly8vPCAlcyB2YWx1ZT1cIiVzXCJcbiIsIGVuYW1lKHQsICgqZW51bWVyYXRpb24pLnZhbHVlKSwgcC0+cmVzdHJpY3Rpb24tPmJhc2UsICgqZW51bWVyYXRpb24pLnZhbHVlKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZnByaW50ZihzdHJlYW0sICIvL1x0dW5yZWNvZ25pemVkOiBiaXRtYXNrIGVudW1lcmF0aW9uICclcycgaGFzIG5vIHZhbHVlXG4iLCB0KTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCFhbm9ueW1vdXMpCisgICAgICAgICAgeyBmcHJpbnRmKHN0cmVhbSwgIn07XG4iKTsKKyAgICAgICAgICAgIGlmICh5ZmxhZykKKwkgICAgICBmcHJpbnRmKHN0cmVhbSwgIi8vLyBUeXBlZGVmIHN5bm9ueW0gZm9yIGVudW0gJXMuXG50eXBlZGVmIGVudW0gJXMgJXM7XG4iLCB0LCB0LCB0KTsKKyAgICAgICAgICAgIGlmIChwZmxhZykKKyAgICAgICAgICAgIHsgY29uc3QgY2hhciAqcyA9IGFuYW1lKHByZWZpeCwgVVJJLCBuYW1lKTsKKwkgICAgICBrbmFtZXMuaW5zZXJ0KHMpOworICAgICAgICAgICAgICBzID0gYW5hbWUocHJlZml4LCBVUkksIG5hbWUpOworICAgICAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIlxuLy8vIENsYXNzIHdyYXBwZXIuXG4iKTsKKyAgICAgICAgICAgICAgZnByaW50ZihzdHJlYW0sICJjbGFzcyAlcyA6IHB1YmxpYyB4c2RfX2FueVR5cGVcbnsgcHVibGljOlxuIiwgcyk7CisgICAgICAgICAgICAgIGZwcmludGYoc3RyZWFtLCBlbGVtZW50Zm9ybWF0LCB0bmFtZShwcmVmaXgsIFVSSSwgbmFtZSksICJfX2l0ZW07Iik7CisJICAgICAgbW9kaWZ5KHMpOworICAgICAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIlxufTtcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIn1cbiIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IGNvbnN0IGNoYXIgKnMgPSB0bmFtZShOVUxMLCBOVUxMLCAieHNkOnN0cmluZyIpOworICAgICAgICBpZiAoIWFub255bW91cykKKyAgICAgICAgeyBmcHJpbnRmKHN0cmVhbSwgIlxuLy8vIFwiJXNcIjolcyBpcyBhIHNpbXBsZVR5cGUgY29udGFpbmluZyBhIHdoaXRlc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgJXMuXG4iLCBVUkk/VVJJOiIiLCBuYW1lLCBzaW1wbGVUeXBlLmxpc3QtPml0ZW1UeXBlKTsKKyAgICAgICAgICB0ID0gZGVmdG5hbWUoVFlQRURFRiwgTlVMTCwgc3RyY2hyKHMsICcqJykgIT0gTlVMTCwgcHJlZml4LCBVUkksIG5hbWUpOworCX0KKyAgICAgICAgZG9jdW1lbnQoc2ltcGxlVHlwZS5hbm5vdGF0aW9uKTsKKyAgICAgICAgaWYgKHQpCisgICAgICAgICAgZnByaW50ZihzdHJlYW0sICJ0eXBlZGVmICVzICVzO1xuIiwgcywgdCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeyBmcHJpbnRmKHN0cmVhbSwgZWxlbWVudGZvcm1hdCwgcywgIiIpOworICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiXG4iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeyBpZiAoIWFub255bW91cykKKyAgICAgICAgZnByaW50ZihzdHJlYW0sICJcbi8vLyBcIiVzXCI6JXMgaXMgYSBzaW1wbGVUeXBlIGxpc3QuXG4iLCBVUkk/VVJJOiIiLCBuYW1lKTsKKyAgICAgIGRvY3VtZW50KHNpbXBsZVR5cGUuYW5ub3RhdGlvbik7CisgICAgICBpZiAoIWFub255bW91cykKKyAgICAgIHsgdCA9IGRlZnRuYW1lKEVOVU0sIE5VTEwsIGZhbHNlLCBwcmVmaXgsIFVSSSwgbmFtZSk7CisgICAgICAgIGlmICh0ICYmICFlZmxhZykKKyAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIi8vLyBOb3RlOiBlbnVtIHZhbHVlcyBhcmUgcHJlZml4ZWQgd2l0aCAnJXMnIHRvIGF2b2lkIG5hbWUgY2xhc2hlcywgcGxlYXNlIHVzZSB3c2RsMmggb3B0aW9uIC1lIHRvIG9taXQgdGhpcyBwcmVmaXhcbiIsIHQpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB0ID0gIiI7CisgICAgICBpZiAodCkKKyAgICAgIHsgZnByaW50ZihzdHJlYW0sICJlbnVtICogJXNcbntcbiIsIHQpOworICAgICAgICBmb3IgKHZlY3Rvcjx4c19fc2ltcGxlVHlwZT46OmNvbnN0X2l0ZXJhdG9yIHNpbXBsZSA9IHNpbXBsZVR5cGUubGlzdC0+c2ltcGxlVHlwZS5iZWdpbigpOyBzaW1wbGUgIT0gc2ltcGxlVHlwZS5saXN0LT5zaW1wbGVUeXBlLmVuZCgpOyArK3NpbXBsZSkKKyAgICAgICAgeyBpZiAoKCpzaW1wbGUpLnJlc3RyaWN0aW9uICYmICgqc2ltcGxlKS5yZXN0cmljdGlvbi0+YmFzZSkKKyAgICAgICAgICB7IGZvciAodmVjdG9yPHhzX19lbnVtZXJhdGlvbj46OmNvbnN0X2l0ZXJhdG9yIGVudW1lcmF0aW9uID0gKCpzaW1wbGUpLnJlc3RyaWN0aW9uLT5lbnVtZXJhdGlvbi5iZWdpbigpOyBlbnVtZXJhdGlvbiAhPSAoKnNpbXBsZSkucmVzdHJpY3Rpb24tPmVudW1lcmF0aW9uLmVuZCgpOyArK2VudW1lcmF0aW9uKQorICAgICAgICAgICAgeyBpZiAoKCplbnVtZXJhdGlvbikudmFsdWUpCisgICAgICAgICAgICAgICAgZnByaW50ZihzdHJlYW0sICJcdCVzLFx0Ly8vPCAlcyB2YWx1ZT1cIiVzXCJcbiIsIGVuYW1lKHQsICgqZW51bWVyYXRpb24pLnZhbHVlKSwgKCpzaW1wbGUpLnJlc3RyaWN0aW9uLT5iYXNlLCAoKmVudW1lcmF0aW9uKS52YWx1ZSk7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIi8vXHR1bnJlY29nbml6ZWQ6IGJpdG1hc2sgZW51bWVyYXRpb24gJyVzJyBoYXMgbm8gdmFsdWVcbiIsIHQpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWFub255bW91cykKKyAgICAgICAgeyBmcHJpbnRmKHN0cmVhbSwgIn07XG4iKTsKKyAgICAgICAgICBpZiAoeWZsYWcpCisJICAgIGZwcmludGYoc3RyZWFtLCAiLy8vIFR5cGVkZWYgc3lub255bSBmb3IgZW51bSAlcy5cbnR5cGVkZWYgZW51bSAlcyAlcztcbiIsIHQsIHQsIHQpOworICAgICAgICAgIGlmIChwZmxhZykKKyAgICAgICAgICB7IGNvbnN0IGNoYXIgKnMgPSBhbmFtZShwcmVmaXgsIFVSSSwgbmFtZSk7CisJICAgIGtuYW1lcy5pbnNlcnQocyk7CisgICAgICAgICAgICBzID0gYW5hbWUocHJlZml4LCBVUkksIG5hbWUpOworICAgICAgICAgICAgZnByaW50ZihzdHJlYW0sICJcbi8vLyBDbGFzcyB3cmFwcGVyLlxuIik7CisgICAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgImNsYXNzICVzIDogcHVibGljIHhzZF9fYW55VHlwZVxueyBwdWJsaWM6XG4iLCBzKTsKKyAgICAgICAgICAgIGZwcmludGYoc3RyZWFtLCBlbGVtZW50Zm9ybWF0LCB0bmFtZShwcmVmaXgsIFVSSSwgbmFtZSksICJfX2l0ZW07Iik7CisJICAgIG1vZGlmeShzKTsKKyAgICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiXG59O1xuIik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIn1cbiIpOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlIGlmIChzaW1wbGVUeXBlLnVuaW9uXykKKyAgeyBpZiAoc2ltcGxlVHlwZS51bmlvbl8tPm1lbWJlclR5cGVzKQorICAgIHsgY29uc3QgY2hhciAqcyA9IHRuYW1lKE5VTEwsIE5VTEwsICJ4c2Q6c3RyaW5nIik7CisgICAgICBpZiAoIWFub255bW91cykKKyAgICAgICAgdCA9IGRlZnRuYW1lKFRZUEVERUYsIE5VTEwsIHN0cmNocihzLCAnKicpICE9IE5VTEwsIHByZWZpeCwgVVJJLCBuYW1lKTsKKyAgICAgIGZwcmludGYoc3RyZWFtLCAiXG4vLy8gdW5pb24gb2YgdmFsdWVzIFwiJXNcIlxuIiwgc2ltcGxlVHlwZS51bmlvbl8tPm1lbWJlclR5cGVzKTsKKyAgICAgIGlmICh0KQorICAgICAgICBmcHJpbnRmKHN0cmVhbSwgInR5cGVkZWYgJXMgJXM7XG4iLCBzLCB0KTsKKyAgICAgIGVsc2UKKyAgICAgIHsgZnByaW50ZihzdHJlYW0sIGVsZW1lbnRmb3JtYXQsIHMsICIiKTsKKyAgICAgICAgZnByaW50ZihzdHJlYW0sICJcbiIpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICghc2ltcGxlVHlwZS51bmlvbl8tPnNpbXBsZVR5cGUuZW1wdHkoKSkKKyAgICB7IGNvbnN0IGNoYXIgKnMgPSB0bmFtZShOVUxMLCBOVUxMLCAieHNkOnN0cmluZyIpOworICAgICAgZnByaW50ZihzdHJlYW0sICJcbiIpOworICAgICAgaWYgKCFhbm9ueW1vdXMpCisgICAgICAgIHQgPSBkZWZ0bmFtZShUWVBFREVGLCBOVUxMLCBzdHJjaHIocywgJyonKSAhPSBOVUxMLCBwcmVmaXgsIFVSSSwgbmFtZSk7CisgICAgICBmb3IgKHZlY3Rvcjx4c19fc2ltcGxlVHlwZT46OmNvbnN0X2l0ZXJhdG9yIHNpbXBsZVR5cGUxID0gc2ltcGxlVHlwZS51bmlvbl8tPnNpbXBsZVR5cGUuYmVnaW4oKTsgc2ltcGxlVHlwZTEgIT0gc2ltcGxlVHlwZS51bmlvbl8tPnNpbXBsZVR5cGUuZW5kKCk7ICsrc2ltcGxlVHlwZTEpCisgICAgICAgIGlmICgoKnNpbXBsZVR5cGUxKS5yZXN0cmljdGlvbikKKwl7IGZwcmludGYoc3RyZWFtLCAiLy8vIHVuaW9uIG9mIHZhbHVlcyBmcm9tIFwiJXNcIlxuIiwgKCpzaW1wbGVUeXBlMSkucmVzdHJpY3Rpb24tPmJhc2UpOworICAgICAgICAgIC8vIFRPRE86IGFyZSB0aGVyZSBhbnkgb3RoZXIgdHlwZXMgd2Ugc2hvdWxkIHJlcG9ydCBoZXJlPworICAgICAgICB9CisgICAgICBpZiAodCkKKyAgICAgICAgZnByaW50ZihzdHJlYW0sICJ0eXBlZGVmICVzICVzO1xuIiwgcywgdCk7CisgICAgICBlbHNlCisgICAgICB7IGZwcmludGYoc3RyZWFtLCBlbGVtZW50Zm9ybWF0LCBzLCAiIik7CisgICAgICAgIGZwcmludGYoc3RyZWFtLCAiXG4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgZnByaW50ZihzdHJlYW0sICIvL1x0dW5yZWNvZ25pemVkXG4iKTsKKyAgfQorICBlbHNlCisgICAgZnByaW50ZihzdHJlYW0sICIvL1x0dW5yZWNvZ25pemVkIHNpbXBsZVR5cGVcbiIpOworfQorCit2b2lkIFR5cGVzOjpnZW4oY29uc3QgY2hhciAqVVJJLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB4c19fY29tcGxleFR5cGUmIGNvbXBsZXhUeXBlLCBib29sIGFub255bW91cykKK3sgY29uc3QgY2hhciAqdCA9IE5VTEw7CisgIGJvb2wgc29hcGZsYWcgPSBmYWxzZTsKKyAgaWYgKGNvbXBsZXhUeXBlLm5hbWUpCisgICAgbmFtZSA9IGNvbXBsZXhUeXBlLm5hbWU7CisgIGlmIChhbm9ueW1vdXMgJiYgbmFtZSkKKyAgICB0ID0gc25hbWUoVVJJLCBuYW1lKTsKKyAgZWxzZSBpZiAobmFtZSkKKyAgeyB0ID0gY25hbWUoTlVMTCwgVVJJLCBuYW1lKTsKKyAgICBpZiAoZGVmdHlwZW1hcFt0XSkKKyAgICAgIHJldHVybjsKKyAgfQorICBpZiAobmFtZSkKKyAgICBzY29wZS5wdXNoX2JhY2sobmFtZSk7CisgIGlmIChjb21wbGV4VHlwZS5zaW1wbGVDb250ZW50KQorICB7IGlmICghYW5vbnltb3VzKQorICAgICAgZnByaW50ZihzdHJlYW0sICJcbi8vLyBcIiVzXCI6JXMgaXMgYSVzIGNvbXBsZXhUeXBlIHdpdGggc2ltcGxlQ29udGVudC5cbiIsIFVSST9VUkk6IiIsIG5hbWUsIGNvbXBsZXhUeXBlLmFic3RyYWN0PyJuIGFic3RyYWN0IjoiIik7CisgICAgZG9jdW1lbnQoY29tcGxleFR5cGUuYW5ub3RhdGlvbik7CisgICAgaWYgKGNvbXBsZXhUeXBlLnNpbXBsZUNvbnRlbnQtPnJlc3RyaWN0aW9uKQorICAgIHsgaWYgKGFub255bW91cykKKyAgICAgICAgZnByaW50ZihzdHJlYW0sICIgICAgc3RydWN0ICVzXG4gICAge1xuIiwgdCk7CisgICAgICBlbHNlIGlmIChjZmxhZykKKyAgICAgICAgZnByaW50ZihzdHJlYW0sICJzdHJ1Y3QgJXNcbntcbiIsIHQpOworICAgICAgZWxzZSBpZiAocGZsYWcpCisgICAgICAgIGZwcmludGYoc3RyZWFtLCAiY2xhc3MgJXMgOiBwdWJsaWMgeHNkX19hbnlUeXBlXG57IHB1YmxpYzpcbiIsIHQpOworICAgICAgZWxzZQorICAgICAgICBmcHJpbnRmKHN0cmVhbSwgImNsYXNzICVzXG57IHB1YmxpYzpcbiIsIHQpOworICAgICAgY29uc3QgY2hhciAqYmFzZSA9ICJ4czpzdHJpbmciOworICAgICAgY29uc3QgeHNfX2NvbXBsZXhUeXBlICpjb21wbGV4dHlwZSA9ICZjb21wbGV4VHlwZTsgCisgICAgICBkbworICAgICAgeyBpZiAoIWNvbXBsZXh0eXBlLT5zaW1wbGVDb250ZW50KQorICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoY29tcGxleHR5cGUtPnNpbXBsZUNvbnRlbnQtPnJlc3RyaWN0aW9uKQorICAgICAgICB7IGlmIChjb21wbGV4dHlwZS0+c2ltcGxlQ29udGVudC0+cmVzdHJpY3Rpb24tPmNvbXBsZXhUeXBlUHRyKCkpCisJICAgIGNvbXBsZXh0eXBlID0gY29tcGxleHR5cGUtPnNpbXBsZUNvbnRlbnQtPnJlc3RyaWN0aW9uLT5jb21wbGV4VHlwZVB0cigpOworCSAgZWxzZQorICAgICAgICAgIHsgYmFzZSA9IGNvbXBsZXh0eXBlLT5zaW1wbGVDb250ZW50LT5yZXN0cmljdGlvbi0+YmFzZTsgICAKKwkgICAgYnJlYWs7CisJICB9CisJfQorICAgICAgICBlbHNlIGlmIChjb21wbGV4dHlwZS0+c2ltcGxlQ29udGVudC0+ZXh0ZW5zaW9uKQorICAgICAgICB7IGlmIChjb21wbGV4dHlwZS0+c2ltcGxlQ29udGVudC0+ZXh0ZW5zaW9uLT5jb21wbGV4VHlwZVB0cigpKQorCSAgICBjb21wbGV4dHlwZSA9IGNvbXBsZXh0eXBlLT5zaW1wbGVDb250ZW50LT5leHRlbnNpb24tPmNvbXBsZXhUeXBlUHRyKCk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsgYmFzZSA9IGNvbXBsZXh0eXBlLT5zaW1wbGVDb250ZW50LT5leHRlbnNpb24tPmJhc2U7ICAgCisJICAgIGJyZWFrOworICAgICAgICAgIH0KKwl9CisJZWxzZQorCSAgYnJlYWs7CisgICAgICB9CisgICAgICB3aGlsZSAoY29tcGxleHR5cGUpOworICAgICAgZnByaW50ZihzdHJlYW0sICIvLy8gX19pdGVtIHdyYXBzICclcycgc2ltcGxlQ29udGVudC5cbiIsIGJhc2UpOworICAgICAgZnByaW50ZihzdHJlYW0sIGVsZW1lbnRmb3JtYXQsIHRuYW1lKE5VTEwsIE5VTEwsIGJhc2UpLCAiX19pdGVtIik7CisgICAgICBmcHJpbnRmKHN0cmVhbSwgIjtcbiIpOworICAgICAgZ2VuKFVSSSwgY29tcGxleFR5cGUuc2ltcGxlQ29udGVudC0+cmVzdHJpY3Rpb24tPmF0dHJpYnV0ZSk7CisgICAgICBpZiAoY29tcGxleFR5cGUuc2ltcGxlQ29udGVudC0+cmVzdHJpY3Rpb24tPmFueUF0dHJpYnV0ZSkKKyAgICAgICAgZ2VuKFVSSSwgKmNvbXBsZXhUeXBlLnNpbXBsZUNvbnRlbnQtPnJlc3RyaWN0aW9uLT5hbnlBdHRyaWJ1dGUpOworICAgIH0KKyAgICBlbHNlIGlmIChjb21wbGV4VHlwZS5zaW1wbGVDb250ZW50LT5leHRlbnNpb24pCisgICAgeyBpZiAoY2ZsYWcgfHwgZmZsYWcgfHwgYW5vbnltb3VzKQorICAgICAgeyBpZiAoYW5vbnltb3VzKQorICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiICAgIHN0cnVjdCAlc1xuICAgIHtcbiIsIHQpOworICAgICAgICBlbHNlIGlmIChjZmxhZykKKyAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgInN0cnVjdCAlc1xue1xuIiwgdCk7CisgICAgICAgIGVsc2UgaWYgKHBmbGFnKQorICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiY2xhc3MgJXMgOiBwdWJsaWMgeHNkX19hbnlUeXBlXG57IHB1YmxpYzpcbiIsIHQpOworICAgICAgICBlbHNlCisgICAgICAgICAgZnByaW50ZihzdHJlYW0sICJjbGFzcyAlc1xueyBwdWJsaWM6XG4iLCB0KTsKKyAgICAgICAgY29uc3QgY2hhciAqYmFzZSA9ICJ4czpzdHJpbmciOworICAgICAgICBjb25zdCB4c19fY29tcGxleFR5cGUgKnAgPSAmY29tcGxleFR5cGU7IAorICAgICAgICBkbworICAgICAgICB7IGlmICghcC0+c2ltcGxlQ29udGVudCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGlmIChwLT5zaW1wbGVDb250ZW50LT5yZXN0cmljdGlvbikKKyAgICAgICAgICB7IGlmIChwLT5zaW1wbGVDb250ZW50LT5yZXN0cmljdGlvbi0+Y29tcGxleFR5cGVQdHIoKSkKKwkgICAgICBwID0gcC0+c2ltcGxlQ29udGVudC0+cmVzdHJpY3Rpb24tPmNvbXBsZXhUeXBlUHRyKCk7CisJICAgIGVsc2UKKyAgICAgICAgICAgIHsgYmFzZSA9IHAtPnNpbXBsZUNvbnRlbnQtPnJlc3RyaWN0aW9uLT5iYXNlOyAgIAorCSAgICAgIGJyZWFrOworCSAgICB9CisJICB9CisgICAgICAgICAgZWxzZSBpZiAocC0+c2ltcGxlQ29udGVudC0+ZXh0ZW5zaW9uKQorICAgICAgICAgIHsgaWYgKHAtPnNpbXBsZUNvbnRlbnQtPmV4dGVuc2lvbi0+Y29tcGxleFR5cGVQdHIoKSkKKwkgICAgICBwID0gcC0+c2ltcGxlQ29udGVudC0+ZXh0ZW5zaW9uLT5jb21wbGV4VHlwZVB0cigpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyBiYXNlID0gcC0+c2ltcGxlQ29udGVudC0+ZXh0ZW5zaW9uLT5iYXNlOyAgIAorCSAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCSAgfQorCSAgZWxzZQorCSAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAocCk7CisgICAgICAgIGZwcmludGYoc3RyZWFtLCAiLy8vIF9faXRlbSB3cmFwcyAnJXMnIHNpbXBsZUNvbnRlbnQuXG4iLCBiYXNlKTsKKyAgICAgICAgZnByaW50ZihzdHJlYW0sIGVsZW1lbnRmb3JtYXQsIHRuYW1lKE5VTEwsIE5VTEwsIGJhc2UpLCAiX19pdGVtIik7CisgICAgICAgIGZwcmludGYoc3RyZWFtLCAiO1xuIik7CisgICAgICAgIHAgPSAmY29tcGxleFR5cGU7IAorICAgICAgICBib29sIGZsYWcgPSB0cnVlOworICAgICAgICBkbworICAgICAgICB7IGlmICghcC0+c2ltcGxlQ29udGVudCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGlmIChwLT5zaW1wbGVDb250ZW50LT5yZXN0cmljdGlvbikKKyAgICAgICAgICB7IGdlbihVUkksIHAtPnNpbXBsZUNvbnRlbnQtPnJlc3RyaWN0aW9uLT5hdHRyaWJ1dGUpOworICAgICAgICAgICAgaWYgKHAtPnNpbXBsZUNvbnRlbnQtPnJlc3RyaWN0aW9uLT5hbnlBdHRyaWJ1dGUgJiYgZmxhZykKKyAgICAgICAgICAgICAgZ2VuKFVSSSwgKnAtPnNpbXBsZUNvbnRlbnQtPnJlc3RyaWN0aW9uLT5hbnlBdHRyaWJ1dGUpOworCSAgICBicmVhazsKKwkgIH0KKyAgICAgICAgICBlbHNlIGlmIChwLT5zaW1wbGVDb250ZW50LT5leHRlbnNpb24pCisgICAgICAgICAgeyBnZW4oVVJJLCBwLT5zaW1wbGVDb250ZW50LT5leHRlbnNpb24tPmF0dHJpYnV0ZSk7CisgICAgICAgICAgICBnZW4oVVJJLCBwLT5zaW1wbGVDb250ZW50LT5leHRlbnNpb24tPmF0dHJpYnV0ZUdyb3VwKTsKKyAgICAgICAgICAgIGlmIChwLT5zaW1wbGVDb250ZW50LT5leHRlbnNpb24tPmFueUF0dHJpYnV0ZSAmJiBmbGFnKQorICAgICAgICAgICAgeyBnZW4oVVJJLCAqcC0+c2ltcGxlQ29udGVudC0+ZXh0ZW5zaW9uLT5hbnlBdHRyaWJ1dGUpOworCSAgICAgIGZsYWcgPSBmYWxzZTsKKwkgICAgfQorICAgICAgICAgICAgaWYgKHAtPnNpbXBsZUNvbnRlbnQtPmV4dGVuc2lvbi0+Y29tcGxleFR5cGVQdHIoKSkKKwkgICAgICBwID0gcC0+c2ltcGxlQ29udGVudC0+ZXh0ZW5zaW9uLT5jb21wbGV4VHlwZVB0cigpOworICAgICAgICAgICAgZWxzZQorCSAgICAgIGJyZWFrOworCSAgfQorCSAgZWxzZQorCSAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAocCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IGlmICgKKyAgICAgICAgLyogVE9ETzogc2hvdWxkIGFkZCBjaGVjayBmb3IgYmFzZSB0eXBlID09IGNsYXNzCisJICBjb21wbGV4VHlwZS5zaW1wbGVDb250ZW50LT5leHRlbnNpb24tPnNpbXBsZVR5cGVQdHIoKQorCSAgfHwKKwkqLworCSAgY29tcGxleFR5cGUuc2ltcGxlQ29udGVudC0+ZXh0ZW5zaW9uLT5jb21wbGV4VHlwZVB0cigpKQorCXsgZnByaW50ZihzdHJlYW0sICJjbGFzcyAlcyA6IHB1YmxpYyAlc1xueyBwdWJsaWM6XG4iLCB0LCBjbmFtZShOVUxMLCBOVUxMLCBjb21wbGV4VHlwZS5zaW1wbGVDb250ZW50LT5leHRlbnNpb24tPmJhc2UpKTsKKwkgIHNvYXBmbGFnID0gdHJ1ZTsKKwl9CisgICAgICAgIGVsc2UKKwl7IGlmIChwZmxhZykKKyAgICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiY2xhc3MgJXMgOiBwdWJsaWMgeHNkX19hbnlUeXBlXG57IHB1YmxpYzpcbiIsIHQpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiY2xhc3MgJXNcbnsgcHVibGljOlxuIiwgdCk7CisgICAgICAgICAgZnByaW50ZihzdHJlYW0sICIvLy8gX19pdGVtIHdyYXBzICclcycgc2ltcGxlQ29udGVudC5cbiIsIGNvbXBsZXhUeXBlLnNpbXBsZUNvbnRlbnQtPmV4dGVuc2lvbi0+YmFzZSk7CisgICAgICAgICAgZnByaW50ZihzdHJlYW0sIGVsZW1lbnRmb3JtYXQsIHRuYW1lKE5VTEwsIE5VTEwsIGNvbXBsZXhUeXBlLnNpbXBsZUNvbnRlbnQtPmV4dGVuc2lvbi0+YmFzZSksICJfX2l0ZW0iKTsKKyAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIjtcbiIpOworCX0KKyAgICAgICAgZ2VuKFVSSSwgY29tcGxleFR5cGUuc2ltcGxlQ29udGVudC0+ZXh0ZW5zaW9uLT5hdHRyaWJ1dGUpOworICAgICAgICBnZW4oVVJJLCBjb21wbGV4VHlwZS5zaW1wbGVDb250ZW50LT5leHRlbnNpb24tPmF0dHJpYnV0ZUdyb3VwKTsKKyAgICAgICAgaWYgKGNvbXBsZXhUeXBlLnNpbXBsZUNvbnRlbnQtPmV4dGVuc2lvbi0+YW55QXR0cmlidXRlKQorICAgICAgICAgIGdlbihVUkksICpjb21wbGV4VHlwZS5zaW1wbGVDb250ZW50LT5leHRlbnNpb24tPmFueUF0dHJpYnV0ZSk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgIGZwcmludGYoc3RyZWFtLCAiLy9cdHVucmVjb2duaXplZFxuIik7CisgIH0KKyAgZWxzZSBpZiAoY29tcGxleFR5cGUuY29tcGxleENvbnRlbnQpCisgIHsgaWYgKGNvbXBsZXhUeXBlLmNvbXBsZXhDb250ZW50LT5yZXN0cmljdGlvbikKKyAgICB7IGlmICghYW5vbnltb3VzKQorICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIlxuLy8vIFwiJXNcIjolcyBpcyBhJXMgY29tcGxleFR5cGUgd2l0aCBjb21wbGV4Q29udGVudCByZXN0cmljdGlvbiBvZiAlcy5cbiIsIFVSST9VUkk6IiIsIG5hbWUsIGNvbXBsZXhUeXBlLmFic3RyYWN0PyJuIGFic3RyYWN0IjoiIiwgY29tcGxleFR5cGUuY29tcGxleENvbnRlbnQtPnJlc3RyaWN0aW9uLT5iYXNlKTsKKyAgICAgIGRvY3VtZW50KGNvbXBsZXhUeXBlLmFubm90YXRpb24pOworICAgICAgaWYgKCFzdHJjbXAoY29tcGxleFR5cGUuY29tcGxleENvbnRlbnQtPnJlc3RyaWN0aW9uLT5iYXNlLCAiU09BUC1FTkM6QXJyYXkiKSkKKyAgICAgIHsgY2hhciAqaXRlbSA9IE5VTEwsICp0eXBlID0gTlVMTDsKKwlpZiAoIWNvbXBsZXhUeXBlLmNvbXBsZXhDb250ZW50LT5yZXN0cmljdGlvbi0+YXR0cmlidXRlLmVtcHR5KCkpCisJeyB4c19fYXR0cmlidXRlJiBhdHRyaWJ1dGUgPSBjb21wbGV4VHlwZS5jb21wbGV4Q29udGVudC0+cmVzdHJpY3Rpb24tPmF0dHJpYnV0ZS5mcm9udCgpOworCSAgaWYgKGF0dHJpYnV0ZS53c2RsX19hcnJheVR5cGUpCisJICB7IHR5cGUgPSAoY2hhciopbWFsbG9jKHN0cmxlbihhdHRyaWJ1dGUud3NkbF9fYXJyYXlUeXBlKSsxKTsKKwkgICAgc3RyY3B5KHR5cGUsIGF0dHJpYnV0ZS53c2RsX19hcnJheVR5cGUpOworCSAgfQorCX0KKyAgICAgICAgaWYgKGNvbXBsZXhUeXBlLmNvbXBsZXhDb250ZW50LT5yZXN0cmljdGlvbi0+c2VxdWVuY2UgJiYgIWNvbXBsZXhUeXBlLmNvbXBsZXhDb250ZW50LT5yZXN0cmljdGlvbi0+c2VxdWVuY2UtPmVsZW1lbnQuZW1wdHkoKSkKKwl7IHhzX19lbGVtZW50JiBlbGVtZW50ID0gY29tcGxleFR5cGUuY29tcGxleENvbnRlbnQtPnJlc3RyaWN0aW9uLT5zZXF1ZW5jZS0+ZWxlbWVudC5mcm9udCgpOworCSAgaWYgKCF0eXBlKQorCSAgeyB0eXBlID0gKGNoYXIqKW1hbGxvYyhzdHJsZW4oZWxlbWVudC50eXBlKSsxKTsKKwkgICAgc3RyY3B5KHR5cGUsIGVsZW1lbnQudHlwZSk7CisJICB9CisJICBpdGVtID0gZWxlbWVudC5uYW1lOworCX0KKwlnZW5fc29hcF9hcnJheShuYW1lLCB0LCBpdGVtLCB0eXBlKTsKKwlpZiAodHlwZSkKKwkgIGZyZWUodHlwZSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IGlmIChhbm9ueW1vdXMpCisgICAgICAgICAgZnByaW50ZihzdHJlYW0sICIgICAgc3RydWN0ICVzXG4gICAge1xuIiwgdCk7CisgICAgICAgIGVsc2UgaWYgKGNmbGFnKQorICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAic3RydWN0ICVzXG57XG4iLCB0KTsKKyAgICAgICAgZWxzZSBpZiAocGZsYWcpCisgICAgICAgICAgZnByaW50ZihzdHJlYW0sICJjbGFzcyAlcyA6IHB1YmxpYyB4c2RfX2FueVR5cGVcbnsgcHVibGljOlxuIiwgdCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgImNsYXNzICVzXG57IHB1YmxpYzpcbiIsIHQpOworCWlmICghY29tcGxleFR5cGUubWl4ZWQpCisgICAgICAgIHsgaWYgKGNvbXBsZXhUeXBlLmNvbXBsZXhDb250ZW50LT5yZXN0cmljdGlvbi0+Z3JvdXApCisgICAgICAgICAgICBnZW4oVVJJLCAqY29tcGxleFR5cGUuY29tcGxleENvbnRlbnQtPnJlc3RyaWN0aW9uLT5ncm91cCk7CisgICAgICAgICAgaWYgKGNvbXBsZXhUeXBlLmNvbXBsZXhDb250ZW50LT5yZXN0cmljdGlvbi0+YWxsKQorICAgICAgICAgICAgZ2VuKFVSSSwgKmNvbXBsZXhUeXBlLmNvbXBsZXhDb250ZW50LT5yZXN0cmljdGlvbi0+YWxsKTsKKyAgICAgICAgICBpZiAoY29tcGxleFR5cGUuY29tcGxleENvbnRlbnQtPnJlc3RyaWN0aW9uLT5zZXF1ZW5jZSkKKyAgICAgICAgICAgIGdlbihVUkksICpjb21wbGV4VHlwZS5jb21wbGV4Q29udGVudC0+cmVzdHJpY3Rpb24tPnNlcXVlbmNlKTsKKyAgICAgICAgICBpZiAoY29tcGxleFR5cGUuY29tcGxleENvbnRlbnQtPnJlc3RyaWN0aW9uLT5jaG9pY2UpCisgICAgICAgICAgICBnZW4oVVJJLCBuYW1lLCAqY29tcGxleFR5cGUuY29tcGxleENvbnRlbnQtPnJlc3RyaWN0aW9uLT5jaG9pY2UpOworICAgICAgICB9CisJZWxzZQorICAgICAgICB7IGZwcmludGYoc3RyZWFtLCAiLy8vIFRPRE86IG1peGVkIGNvbXBsZXhUeXBlL2NvbXBsZXhDb250ZW50IGlzIHVzZXItZGVmaW5hYmxlLlxuLy8gICAgICAgQ29uc3VsdCB0aGUgcHJvdG9jb2wgZG9jdW1lbnRhdGlvbiB0byBjaGFuZ2Ugb3IgaW5zZXJ0IGRlY2xhcmF0aW9ucy5cbiIpOworICAgICAgICAgIGZwcmludGYoc3RyZWFtLCBlbGVtZW50Zm9ybWF0LCAiX1hNTCIsICJfX2FueSIpOworICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiO1x0Ly8vPCBDYXRjaCBhbnkgZWxlbWVudCBjb250ZW50IGluIFhNTCBzdHJpbmdcbiIpOworICAgICAgICB9CisgICAgICAgIGdlbihVUkksIGNvbXBsZXhUeXBlLmNvbXBsZXhDb250ZW50LT5yZXN0cmljdGlvbi0+YXR0cmlidXRlKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoY29tcGxleFR5cGUuY29tcGxleENvbnRlbnQtPmV4dGVuc2lvbikKKyAgICB7IGlmICghYW5vbnltb3VzKQorICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIlxuLy8vIFwiJXNcIjolcyBpcyBhJXMgY29tcGxleFR5cGUgd2l0aCBjb21wbGV4Q29udGVudCBleHRlbnNpb24gb2YgJXMuXG4iLCBVUkk/VVJJOiIiLCBuYW1lLCBjb21wbGV4VHlwZS5hYnN0cmFjdD8ibiBhYnN0cmFjdCI6IiIsIGNvbXBsZXhUeXBlLmNvbXBsZXhDb250ZW50LT5leHRlbnNpb24tPmJhc2UpOworICAgICAgZG9jdW1lbnQoY29tcGxleFR5cGUuYW5ub3RhdGlvbik7CisgICAgICBpZiAoYW5vbnltb3VzKQorICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIiAgICBzdHJ1Y3QgJXNcbiAgICB7XG4iLCB0KTsKKyAgICAgIGVsc2UgaWYgKGNmbGFnKQorICAgICAgICBmcHJpbnRmKHN0cmVhbSwgInN0cnVjdCAlc1xue1xuIiwgdCk7CisgICAgICBlbHNlIGlmIChmZmxhZykKKyAgICAgICAgZnByaW50ZihzdHJlYW0sICJjbGFzcyAlc1xueyBwdWJsaWM6XG4iLCB0KTsKKyAgICAgIGVsc2UgLy8gVE9ETzogd2hhdCB0byBkbyBpZiBiYXNlIGNsYXNzIGlzIGluIGFub3RoZXIgbmFtZXNwYWNlIGFuZCBlbGVtZW50cyBtdXN0IGJlIHF1YWxpZmllZCBpbiBYTUwgcGF5bG9hZD8KKyAgICAgIHsgZnByaW50ZihzdHJlYW0sICJjbGFzcyAlcyA6IHB1YmxpYyAlc1xueyBwdWJsaWM6XG4iLCB0LCBjbmFtZShOVUxMLCBOVUxMLCBjb21wbGV4VHlwZS5jb21wbGV4Q29udGVudC0+ZXh0ZW5zaW9uLT5iYXNlKSk7CisgICAgICAgIHNvYXBmbGFnID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHhzX19jb21wbGV4VHlwZSAqcCA9IGNvbXBsZXhUeXBlLmNvbXBsZXhDb250ZW50LT5leHRlbnNpb24tPmNvbXBsZXhUeXBlUHRyKCk7CisgICAgICB3aGlsZSAocCkKKyAgICAgIHsgY29uc3QgY2hhciAqcFVSSSA9IHAtPnNjaGVtYVB0cigpLT50YXJnZXROYW1lc3BhY2U7CisgICAgICAgIGNvbnN0IGNoYXIgKmIgPSBjbmFtZShOVUxMLCBwVVJJLCBwLT5uYW1lKTsKKyAgICAgICAgc3RhdGljIGludCBuZXN0aW5nID0gMDsKKwlpZiAoY2ZsYWcgfHwgZmZsYWcgfHwgYW5vbnltb3VzKQorICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiLy8vIElOSEVSSVRFRCBGUk9NICVzOlxuIiwgYik7CisgICAgICAgIGVsc2UgaWYgKG5lc3RpbmcgPT0gMCkKKyAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIi8qICBJTkhFUklURUQgRlJPTSAlczpcbiIsIGIpOworICAgICAgICBlbHNlCisgICAgICAgICAgZnByaW50ZihzdHJlYW0sICIgICAgSU5IRVJJVEVEIEZST00gJXM6XG4iLCBiKTsKKwluZXN0aW5nKys7CisgICAgICAgIGlmIChwLT5jb21wbGV4Q29udGVudCAmJiBwLT5jb21wbGV4Q29udGVudC0+ZXh0ZW5zaW9uKQorICAgICAgICB7IGlmIChwLT5jb21wbGV4Q29udGVudC0+ZXh0ZW5zaW9uLT5ncm91cCkKKyAgICAgICAgICAgIGdlbihwVVJJLCAqcC0+Y29tcGxleENvbnRlbnQtPmV4dGVuc2lvbi0+Z3JvdXApOyAvLyBzY2hlbWEgVVJJPworICAgICAgICAgIGlmIChwLT5jb21wbGV4Q29udGVudC0+ZXh0ZW5zaW9uLT5hbGwpCisgICAgICAgICAgICBnZW4ocFVSSSwgKnAtPmNvbXBsZXhDb250ZW50LT5leHRlbnNpb24tPmFsbCk7CisgICAgICAgICAgaWYgKHAtPmNvbXBsZXhDb250ZW50LT5leHRlbnNpb24tPnNlcXVlbmNlKQorICAgICAgICAgICAgZ2VuKHBVUkksICpwLT5jb21wbGV4Q29udGVudC0+ZXh0ZW5zaW9uLT5zZXF1ZW5jZSk7CisgICAgICAgICAgaWYgKHAtPmNvbXBsZXhDb250ZW50LT5leHRlbnNpb24tPmNob2ljZSkKKyAgICAgICAgICAgIGdlbihwVVJJLCBwLT5uYW1lLCAqcC0+Y29tcGxleENvbnRlbnQtPmV4dGVuc2lvbi0+Y2hvaWNlKTsKKyAgICAgICAgICBnZW4ocFVSSSwgcC0+Y29tcGxleENvbnRlbnQtPmV4dGVuc2lvbi0+YXR0cmlidXRlKTsKKyAgICAgICAgICBnZW4ocFVSSSwgcC0+Y29tcGxleENvbnRlbnQtPmV4dGVuc2lvbi0+YXR0cmlidXRlR3JvdXApOworICAgICAgICAgIGlmIChwLT5jb21wbGV4Q29udGVudC0+ZXh0ZW5zaW9uLT5hbnlBdHRyaWJ1dGUpCisgICAgICAgICAgICBnZW4ocFVSSSwgKnAtPmNvbXBsZXhDb250ZW50LT5leHRlbnNpb24tPmFueUF0dHJpYnV0ZSk7CisJICBwID0gcC0+Y29tcGxleENvbnRlbnQtPmV4dGVuc2lvbi0+Y29tcGxleFR5cGVQdHIoKTsKKyAgICAgICAgICBtb2RpZnkoYik7CisJICBuZXN0aW5nLS07CisJICBpZiAoY2ZsYWcgfHwgZmZsYWcgfHwgYW5vbnltb3VzKQorCSAgICBmcHJpbnRmKHN0cmVhbSwgIi8vICBFTkQgT0YgSU5IRVJJVEVEXG4iKTsKKwkgIGVsc2UgaWYgKG5lc3RpbmcgPT0gMCkKKwkgICAgZnByaW50ZihzdHJlYW0sICIgICAgRU5EIE9GIElOSEVSSVRFRCAqL1xuIik7CisJICBlbHNlCisJICAgIGZwcmludGYoc3RyZWFtLCAiICAgIEVORCBPRiBJTkhFUklURURcbiIpOworICAgICAgICB9CisJZWxzZQorICAgICAgICB7IGlmIChwLT5hbGwpCisgICAgICAgICAgICBnZW4ocFVSSSwgcC0+YWxsLT5lbGVtZW50KTsgLy8gd2hhdCBhYm91dCBzY2hlbWEgVVJJPworICAgICAgICAgIGVsc2UgaWYgKHAtPmNob2ljZSkKKwkgICAgZ2VuKHBVUkksIHAtPm5hbWUsICpwLT5jaG9pY2UpOworICAgICAgICAgIGVsc2UgaWYgKHAtPmFsbCkKKyAgICAgICAgICAgIGdlbihwVVJJLCAqcC0+YWxsKTsKKyAgICAgICAgICBlbHNlIGlmIChwLT5zZXF1ZW5jZSkKKyAgICAgICAgICAgIGdlbihwVVJJLCAqcC0+c2VxdWVuY2UpOworICAgICAgICAgIGVsc2UgaWYgKHAtPmFueSkKKyAgICAgICAgICAgIGdlbihwVVJJLCAqcC0+YW55KTsKKyAgICAgICAgICBnZW4ocFVSSSwgcC0+YXR0cmlidXRlKTsKKyAgICAgICAgICBnZW4ocFVSSSwgcC0+YXR0cmlidXRlR3JvdXApOworCSAgaWYgKHAtPmFueUF0dHJpYnV0ZSkKKyAgICAgICAgICAgIGdlbihwVVJJLCAqcC0+YW55QXR0cmlidXRlKTsKKyAgICAgICAgICBtb2RpZnkoYik7CisJICBuZXN0aW5nLS07CisJICBpZiAoY2ZsYWcgfHwgZmZsYWcgfHwgYW5vbnltb3VzKQorCSAgICBmcHJpbnRmKHN0cmVhbSwgIi8vICBFTkQgT0YgSU5IRVJJVEVEXG4iKTsKKwkgIGVsc2UgaWYgKG5lc3RpbmcgPT0gMCkKKwkgICAgZnByaW50ZihzdHJlYW0sICIgICAgRU5EIE9GIElOSEVSSVRFRCAqL1xuIik7CisJICBlbHNlCisJICAgIGZwcmludGYoc3RyZWFtLCAiICAgIEVORCBPRiBJTkhFUklURURcbiIpOworCSAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChjb21wbGV4VHlwZS5jb21wbGV4Q29udGVudC0+ZXh0ZW5zaW9uLT5ncm91cCkKKyAgICAgICAgZ2VuKFVSSSwgKmNvbXBsZXhUeXBlLmNvbXBsZXhDb250ZW50LT5leHRlbnNpb24tPmdyb3VwKTsKKyAgICAgIGlmIChjb21wbGV4VHlwZS5jb21wbGV4Q29udGVudC0+ZXh0ZW5zaW9uLT5hbGwpCisgICAgICAgIGdlbihVUkksICpjb21wbGV4VHlwZS5jb21wbGV4Q29udGVudC0+ZXh0ZW5zaW9uLT5hbGwpOworICAgICAgaWYgKGNvbXBsZXhUeXBlLmNvbXBsZXhDb250ZW50LT5leHRlbnNpb24tPnNlcXVlbmNlKQorICAgICAgICBnZW4oVVJJLCAqY29tcGxleFR5cGUuY29tcGxleENvbnRlbnQtPmV4dGVuc2lvbi0+c2VxdWVuY2UpOworICAgICAgaWYgKGNvbXBsZXhUeXBlLmNvbXBsZXhDb250ZW50LT5leHRlbnNpb24tPmNob2ljZSkKKyAgICAgICAgZ2VuKFVSSSwgbmFtZSwgKmNvbXBsZXhUeXBlLmNvbXBsZXhDb250ZW50LT5leHRlbnNpb24tPmNob2ljZSk7CisgICAgICBnZW4oVVJJLCBjb21wbGV4VHlwZS5jb21wbGV4Q29udGVudC0+ZXh0ZW5zaW9uLT5hdHRyaWJ1dGUpOworICAgICAgZ2VuKFVSSSwgY29tcGxleFR5cGUuY29tcGxleENvbnRlbnQtPmV4dGVuc2lvbi0+YXR0cmlidXRlR3JvdXApOworICAgICAgaWYgKGNvbXBsZXhUeXBlLmNvbXBsZXhDb250ZW50LT5leHRlbnNpb24tPmFueUF0dHJpYnV0ZSkKKyAgICAgICAgZ2VuKFVSSSwgKmNvbXBsZXhUeXBlLmNvbXBsZXhDb250ZW50LT5leHRlbnNpb24tPmFueUF0dHJpYnV0ZSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGZwcmludGYoc3RyZWFtLCAiLy9cdHVucmVjb2duaXplZFxuIik7CisgIH0KKyAgZWxzZQorICB7IGlmICghYW5vbnltb3VzKQorICAgICAgZnByaW50ZihzdHJlYW0sICJcbi8vLyBcIiVzXCI6JXMgaXMgYSVzIGNvbXBsZXhUeXBlLlxuIiwgVVJJP1VSSToiIiwgbmFtZSwgY29tcGxleFR5cGUuYWJzdHJhY3Q/Im4gYWJzdHJhY3QiOiIiKTsKKyAgICBkb2N1bWVudChjb21wbGV4VHlwZS5hbm5vdGF0aW9uKTsKKyAgICBpZiAoYW5vbnltb3VzKQorICAgICAgZnByaW50ZihzdHJlYW0sICIgICAgc3RydWN0ICVzXG4gICAge1xuIiwgdCk7CisgICAgZWxzZSBpZiAoY2ZsYWcpCisgICAgICBmcHJpbnRmKHN0cmVhbSwgInN0cnVjdCAlc1xue1xuIiwgdCk7CisgICAgZWxzZSBpZiAocGZsYWcpCisgICAgICBmcHJpbnRmKHN0cmVhbSwgImNsYXNzICVzIDogcHVibGljIHhzZF9fYW55VHlwZVxueyBwdWJsaWM6XG4iLCB0KTsKKyAgICBlbHNlCisgICAgICBmcHJpbnRmKHN0cmVhbSwgImNsYXNzICVzXG57IHB1YmxpYzpcbiIsIHQpOworICAgIGlmIChjb21wbGV4VHlwZS5hbGwpCisgICAgICBnZW4oVVJJLCAqY29tcGxleFR5cGUuYWxsKTsKKyAgICBlbHNlIGlmIChjb21wbGV4VHlwZS5jaG9pY2UpCisgICAgICBnZW4oVVJJLCBuYW1lLCAqY29tcGxleFR5cGUuY2hvaWNlKTsKKyAgICBlbHNlIGlmIChjb21wbGV4VHlwZS5zZXF1ZW5jZSkKKyAgICAgIGdlbihVUkksICpjb21wbGV4VHlwZS5zZXF1ZW5jZSk7CisgICAgZWxzZSBpZiAoY29tcGxleFR5cGUuYW55KQorICAgICAgZ2VuKFVSSSwgKmNvbXBsZXhUeXBlLmFueSk7CisgIH0KKyAgZ2VuKFVSSSwgY29tcGxleFR5cGUuYXR0cmlidXRlKTsKKyAgZ2VuKFVSSSwgY29tcGxleFR5cGUuYXR0cmlidXRlR3JvdXApOworICBpZiAoY29tcGxleFR5cGUuYW55QXR0cmlidXRlKQorICAgIGdlbihVUkksICpjb21wbGV4VHlwZS5hbnlBdHRyaWJ1dGUpOworICBpZiAoIWFub255bW91cykKKyAgeyBpZiAoIWNmbGFnICYmICFwZmxhZyAmJiAhc29hcGZsYWcpCisgICAgeyBpZiAoIWNvbXBsZXhUeXBlLmNvbXBsZXhDb250ZW50IHx8ICFjb21wbGV4VHlwZS5jb21wbGV4Q29udGVudC0+ZXh0ZW5zaW9uIHx8ICFjb21wbGV4VHlwZS5jb21wbGV4Q29udGVudC0+ZXh0ZW5zaW9uLT5jb21wbGV4VHlwZVB0cigpKQorICAgICAgeyBmcHJpbnRmKHN0cmVhbSwgIi8vLyBBIGhhbmRsZSB0byB0aGUgc29hcCBzdHJ1Y3QgdGhhdCBtYW5hZ2VzIHRoaXMgaW5zdGFuY2UgKGF1dG9tYXRpY2FsbHkgc2V0KVxuIik7CisgICAgICAgIGZwcmludGYoc3RyZWFtLCBwb2ludGVyZm9ybWF0LCAic3RydWN0IHNvYXAiLCAic29hcCIpOworICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIjtcbiIpOworICAgICAgfQorICAgIH0KKyAgICBtb2RpZnkodCk7CisgICAgZnByaW50ZihzdHJlYW0sICJ9O1xuIik7CisgIH0KKyAgc2NvcGUucG9wX2JhY2soKTsKK30KKwordm9pZCBUeXBlczo6Z2VuKGNvbnN0IGNoYXIgKlVSSSwgY29uc3QgdmVjdG9yPHhzX19hdHRyaWJ1dGU+JiBhdHRyaWJ1dGVzKQoreyBmb3IgKHZlY3Rvcjx4c19fYXR0cmlidXRlPjo6Y29uc3RfaXRlcmF0b3IgYXR0cmlidXRlID0gYXR0cmlidXRlcy5iZWdpbigpOyBhdHRyaWJ1dGUgIT0gYXR0cmlidXRlcy5lbmQoKTsgKythdHRyaWJ1dGUpCisgICAgZ2VuKFVSSSwgKmF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgVHlwZXM6Omdlbihjb25zdCBjaGFyICpVUkksIGNvbnN0IHhzX19hdHRyaWJ1dGUmIGF0dHJpYnV0ZSkKK3sgY29uc3QgY2hhciAqbmFtZSwgKnR5cGUsICpuYW1lVVJJID0gTlVMTCwgKnR5cGVVUkkgPSBOVUxMOworICBuYW1lID0gYXR0cmlidXRlLm5hbWU7CisgIHR5cGUgPSBhdHRyaWJ1dGUudHlwZTsKKyAgYm9vbCBpc19vcHRpb25hbCA9IGF0dHJpYnV0ZS51c2UgIT0gcmVxdWlyZWQgJiYgYXR0cmlidXRlLnVzZSAhPSBkZWZhdWx0XzsKKyAgZG9jdW1lbnQoYXR0cmlidXRlLmFubm90YXRpb24pOworICBpZiAoIVVSSSB8fCBzdHJjbXAoVVJJLCBhdHRyaWJ1dGUuc2NoZW1hUHRyKCktPnRhcmdldE5hbWVzcGFjZSkpCisgICAgbmFtZVVSSSA9IGF0dHJpYnV0ZS5zY2hlbWFQdHIoKS0+dGFyZ2V0TmFtZXNwYWNlOworICBpZiAoYXR0cmlidXRlLmF0dHJpYnV0ZVB0cigpKSAvLyBhdHRyaWJ1dGUgcmVmCisgIHsgbmFtZSA9IGF0dHJpYnV0ZS5hdHRyaWJ1dGVQdHIoKS0+bmFtZTsKKyAgICBpZiAoYXR0cmlidXRlLnNjaGVtYVB0cigpICE9IGF0dHJpYnV0ZS5hdHRyaWJ1dGVQdHIoKS0+c2NoZW1hUHRyKCkpCisgICAgICBuYW1lVVJJID0gYXR0cmlidXRlLmF0dHJpYnV0ZVB0cigpLT5zY2hlbWFQdHIoKS0+dGFyZ2V0TmFtZXNwYWNlOworICAgIGlmIChhdHRyaWJ1dGUuYXR0cmlidXRlUHRyKCktPnR5cGUpCisgICAgeyB0eXBlID0gYXR0cmlidXRlLmF0dHJpYnV0ZVB0cigpLT50eXBlOworICAgIH0KKyAgICBlbHNlCisgICAgeyB0eXBlID0gbmFtZTsKKyAgICAgIHR5cGVVUkkgPSBhdHRyaWJ1dGUuYXR0cmlidXRlUHRyKCktPnNjaGVtYVB0cigpLT50YXJnZXROYW1lc3BhY2U7CisgICAgfQorICAgIGZwcmludGYoc3RyZWFtLCAiLy8vIEF0dHJpYnV0ZSByZWZlcmVuY2UgJXMuXG4iLCBhdHRyaWJ1dGUucmVmKTsKKyAgICBkb2N1bWVudChhdHRyaWJ1dGUuYXR0cmlidXRlUHRyKCktPmFubm90YXRpb24pOworICAgIGZwcmludGYoc3RyZWFtLCBhdHRyaWJ1dGVmb3JtYXQsIHBuYW1lKGlzX29wdGlvbmFsLCBOVUxMLCB0eXBlVVJJLCB0eXBlKSwgYW5hbWUoTlVMTCwgbmFtZVVSSSwgbmFtZSkpOyAvLyBtYWtlIHN1cmUgbm8gbmFtZSAtIHR5cGUgY2xhc2gKKyAgfQorICBlbHNlIGlmIChuYW1lICYmIHR5cGUpCisgIHsgZnByaW50ZihzdHJlYW0sICIvLy8gQXR0cmlidXRlICVzIG9mIHR5cGUgJXMuXG4iLCBuYW1lLCB0eXBlKTsKKyAgICBmcHJpbnRmKHN0cmVhbSwgYXR0cmlidXRlZm9ybWF0LCBwbmFtZShpc19vcHRpb25hbCwgTlVMTCwgTlVMTCwgdHlwZSksIGFuYW1lKE5VTEwsIG5hbWVVUkksIG5hbWUpKTsgLy8gbWFrZSBzdXJlIG5vIG5hbWUgLSB0eXBlIGNsYXNoCisgIH0KKyAgZWxzZSBpZiAobmFtZSAmJiBhdHRyaWJ1dGUuc2ltcGxlVHlwZVB0cigpKQorICB7IGZwcmludGYoc3RyZWFtLCAiQCIpOworICAgIGdlbihVUkksIG5hbWUsICphdHRyaWJ1dGUuc2ltcGxlVHlwZVB0cigpLCB0cnVlKTsKKyAgICBmcHJpbnRmKHN0cmVhbSwgZWxlbWVudGZvcm1hdCwgIiIsIGFuYW1lKE5VTEwsIG5hbWVVUkksIG5hbWUpKTsKKyAgfQorICBlbHNlIGlmIChhdHRyaWJ1dGUucmVmKQorICB7IGZwcmludGYoc3RyZWFtLCAiLy8vIEF0dHJpYnV0ZSByZWZlcmVuY2UgJXMuXG4iLCBhdHRyaWJ1dGUucmVmKTsKKyAgICBmcHJpbnRmKHN0cmVhbSwgYXR0cmlidXRlZm9ybWF0LCBwbmFtZShpc19vcHRpb25hbCwgTlVMTCwgTlVMTCwgYXR0cmlidXRlLnJlZiksIGFuYW1lKE5VTEwsIE5VTEwsIGF0dHJpYnV0ZS5yZWYpKTsKKyAgfQorICBlbHNlCisgIHsgZnByaW50ZihzdHJlYW0sICIvLy8gV2FybmluZzogYXR0cmlidXRlICclcycgaGFzIG5vIHR5cGUgb3IgcmVmLiBBc3N1bWluZyBzdHJpbmcgY29udGVudC5cbiIsIG5hbWU/bmFtZToiIik7CisgICAgZnByaW50ZihzdHJlYW0sIGF0dHJpYnV0ZWZvcm1hdCwgdG5hbWUoTlVMTCwgTlVMTCwgInhzOnN0cmluZyIpLCBhbmFtZShOVUxMLCBuYW1lVVJJLCBuYW1lKSk7CisgIH0KKyAgc3dpdGNoIChhdHRyaWJ1dGUudXNlKQorICB7IGNhc2Ugb3B0aW9uYWw6CisgICAgY2FzZSBkZWZhdWx0XzoKKyAgICBjYXNlIGZpeGVkXzoJLy8gaXMgdGhpcyBjb3JyZWN0Pz8/CisgICAgICBmcHJpbnRmKHN0cmVhbSwgIiAwIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHByb2hpYml0ZWQ6CisgICAgICBmcHJpbnRmKHN0cmVhbSwgIiAwOjAiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgcmVxdWlyZWQ6CisgICAgICBmcHJpbnRmKHN0cmVhbSwgIiAxIik7CisgICAgICBicmVhazsKKyAgfQorICBpZiAoYXR0cmlidXRlLnZhbHVlKQorICB7IGlmICh0eXBlKQorICAgIHsgY29uc3QgY2hhciAqdCA9IHRuYW1lKE5VTEwsIE5VTEwsIHR5cGUpOworICAgICAgaWYgKCFzdHJuY21wKHQsICJ1bnNpZ25lZCAiLCA5KSkKKyAgICAgICAgdCArPSA5OworICAgICAgaWYgKCFzdHJjbXAodCwgImJvb2wiKQorICAgICAgIHx8ICFzdHJjbXAodCwgImNoYXIiKQorICAgICAgIHx8ICFzdHJjbXAodCwgImRvdWJsZSIpCisgICAgICAgfHwgIXN0cmNtcCh0LCAiZmxvYXQiKQorICAgICAgIHx8ICFzdHJjbXAodCwgImludCIpCisgICAgICAgfHwgIXN0cmNtcCh0LCAibG9uZyIpCisgICAgICAgfHwgIXN0cmNtcCh0LCAiTE9ORzY0IikKKyAgICAgICB8fCAhc3RyY21wKHQsICJzaG9ydCIpCisgICAgICAgfHwgIXN0cmNtcCh0LCAiVUxPTkc2NCIpKQorICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIiA9ICVzIiwgYXR0cmlidXRlLnZhbHVlKTsKKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAodCwgImNoYXIqIikKKyAgICAgICAgICAgIHx8ICFzdHJjbXAodCwgImNoYXIgKiIpKQkvLyBub3QgZWxlZ2FudAorICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIiA9IFwiJXNcIiIsIGNzdHJpbmcoYXR0cmlidXRlLnZhbHVlKSk7CisgICAgICBlbHNlIGlmICghc3RybmNtcCh0LCAiZW51bSAiLCA1KSkKKyAgICAgICAgZnByaW50ZihzdHJlYW0sICIgPSAlcyIsIGVuYW1lKHQgKyA1LCBhdHRyaWJ1dGUudmFsdWUpKTsKKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAodCwgInN0ZDo6c3RyaW5nIikKKyAgICAgICAgICAgIHx8ICFzdHJjbXAodCwgInN0ZDo6c3RyaW5nKiIpCisJICAgIHx8ICFzdHJjbXAodCwgInN0ZDo6c3RyaW5nICoiKSkJLy8gbm90IGVsZWdhbnQKKyAgICAgICAgZnByaW50ZihzdHJlYW0sICIgPSBcIiVzXCIiLCBjc3RyaW5nKGF0dHJpYnV0ZS52YWx1ZSkpOworICAgICAgZWxzZSBpZiAoIXN0cmNtcCh0LCAieHNkX19RTmFtZSIpICYmIGF0dHJpYnV0ZS52YWx1ZV8pCS8vIFFOYW1lIGlzIGluIHZhbHVlXworICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIiA9IFwiJXNcIiIsIGNzdHJpbmcoYXR0cmlidXRlLnZhbHVlXykpOworICAgIH0KKyAgICBmcHJpbnRmKHN0cmVhbSwgIjtcdC8vLzwgRGVmYXVsdCB2YWx1ZT1cIiVzXCIuXG4iLCBhdHRyaWJ1dGUudmFsdWUpOworICB9CisgIGVsc2UgaWYgKGF0dHJpYnV0ZS51c2UgPT0gcmVxdWlyZWQpCisgICAgZnByaW50ZihzdHJlYW0sICI7XHQvLy88IFJlcXVpcmVkIGF0dHJpYnV0ZS5cbiIpOworICBlbHNlIGlmIChhdHRyaWJ1dGUudXNlID09IHByb2hpYml0ZWQpCisgICAgZnByaW50ZihzdHJlYW0sICI7XHQvLy88IFByb2hpYml0ZWQgYXR0cmlidXRlLlxuIik7CisgIGVsc2UKKyAgICBmcHJpbnRmKHN0cmVhbSwgIjtcdC8vLzwgT3B0aW9uYWwgYXR0cmlidXRlLlxuIik7Cit9CisKK3ZvaWQgVHlwZXM6Omdlbihjb25zdCBjaGFyICpVUkksIGNvbnN0IHZlY3Rvcjx4c19fYXR0cmlidXRlR3JvdXA+JiBhdHRyaWJ1dGVHcm91cHMpCit7IGZvciAodmVjdG9yPHhzX19hdHRyaWJ1dGVHcm91cD46OmNvbnN0X2l0ZXJhdG9yIGF0dHJpYnV0ZUdyb3VwID0gYXR0cmlidXRlR3JvdXBzLmJlZ2luKCk7IGF0dHJpYnV0ZUdyb3VwICE9IGF0dHJpYnV0ZUdyb3Vwcy5lbmQoKTsgKythdHRyaWJ1dGVHcm91cCkKKyAgeyBpZiAoKCphdHRyaWJ1dGVHcm91cCkuYXR0cmlidXRlR3JvdXBQdHIoKSkgLy8gYXR0cmlidXRlR3JvdXAgcmVmCisgICAgeyBpZiAoKCphdHRyaWJ1dGVHcm91cCkuc2NoZW1hUHRyKCkgPT0gKCphdHRyaWJ1dGVHcm91cCkuYXR0cmlidXRlR3JvdXBQdHIoKS0+c2NoZW1hUHRyKCkpCisgICAgICB7IGdlbihVUkksICgqYXR0cmlidXRlR3JvdXApLmF0dHJpYnV0ZUdyb3VwUHRyKCktPmF0dHJpYnV0ZSk7CisgICAgICAgIGdlbihVUkksICgqYXR0cmlidXRlR3JvdXApLmF0dHJpYnV0ZUdyb3VwUHRyKCktPmF0dHJpYnV0ZUdyb3VwKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgZ2VuKCgqYXR0cmlidXRlR3JvdXApLmF0dHJpYnV0ZUdyb3VwUHRyKCktPnNjaGVtYVB0cigpLT50YXJnZXROYW1lc3BhY2UsICgqYXR0cmlidXRlR3JvdXApLmF0dHJpYnV0ZUdyb3VwUHRyKCktPmF0dHJpYnV0ZSk7CisgICAgICAgIGdlbigoKmF0dHJpYnV0ZUdyb3VwKS5hdHRyaWJ1dGVHcm91cFB0cigpLT5zY2hlbWFQdHIoKS0+dGFyZ2V0TmFtZXNwYWNlLCAoKmF0dHJpYnV0ZUdyb3VwKS5hdHRyaWJ1dGVHcm91cFB0cigpLT5hdHRyaWJ1dGVHcm91cCk7CisgICAgICB9CisgICAgICBpZiAoKCphdHRyaWJ1dGVHcm91cCkuYXR0cmlidXRlR3JvdXBQdHIoKS0+YW55QXR0cmlidXRlKQorICAgICAgICBnZW4oVVJJLCAqKCphdHRyaWJ1dGVHcm91cCkuYXR0cmlidXRlR3JvdXBQdHIoKS0+YW55QXR0cmlidXRlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgZ2VuKFVSSSwgKCphdHRyaWJ1dGVHcm91cCkuYXR0cmlidXRlKTsKKyAgICAgIGdlbihVUkksICgqYXR0cmlidXRlR3JvdXApLmF0dHJpYnV0ZUdyb3VwKTsKKyAgICAgIGlmICgoKmF0dHJpYnV0ZUdyb3VwKS5hbnlBdHRyaWJ1dGUpCisgICAgICAgIGdlbihVUkksICooKmF0dHJpYnV0ZUdyb3VwKS5hbnlBdHRyaWJ1dGUpOworICAgIH0KKyAgfQorfQorCit2b2lkIFR5cGVzOjpnZW4oY29uc3QgY2hhciAqVVJJLCBjb25zdCB2ZWN0b3I8eHNfX2FsbD4mIGFsbHMpCit7IGZvciAodmVjdG9yPHhzX19hbGw+Ojpjb25zdF9pdGVyYXRvciBhbGwgPSBhbGxzLmJlZ2luKCk7IGFsbCAhPSBhbGxzLmVuZCgpOyArK2FsbCkKKyAgICBnZW4oVVJJLCAqYWxsKTsKK30KKwordm9pZCBUeXBlczo6Z2VuKGNvbnN0IGNoYXIgKlVSSSwgY29uc3QgeHNfX2FsbCYgYWxsKQoreyBib29sIHRtcF91bmlvbjEgPSB3aXRoX3VuaW9uOworICBib29sIHRtcF91bmlvbjIgPSBmYWtlX3VuaW9uOworICB3aXRoX3VuaW9uID0gZmFsc2U7CisgIGZha2VfdW5pb24gPSBmYWxzZTsKKyAgZ2VuKFVSSSwgYWxsLmVsZW1lbnQpOworICB3aXRoX3VuaW9uID0gdG1wX3VuaW9uMTsKKyAgZmFrZV91bmlvbiA9IHRtcF91bmlvbjI7Cit9CisKK3ZvaWQgVHlwZXM6Omdlbihjb25zdCBjaGFyICpVUkksIGNvbnN0IHZlY3Rvcjx4c19fc2VxdWVuY2U+JiBzZXF1ZW5jZXMpCit7IGZvciAodmVjdG9yPHhzX19zZXF1ZW5jZT46OmNvbnN0X2l0ZXJhdG9yIHNlcXVlbmNlID0gc2VxdWVuY2VzLmJlZ2luKCk7IHNlcXVlbmNlICE9IHNlcXVlbmNlcy5lbmQoKTsgKytzZXF1ZW5jZSkKKyAgICBnZW4oVVJJLCAqc2VxdWVuY2UpOworfQorCit2b2lkIFR5cGVzOjpnZW4oY29uc3QgY2hhciAqVVJJLCBjb25zdCB2ZWN0b3I8eHNfX3NlcXVlbmNlKj4mIHNlcXVlbmNlcykKK3sgZm9yICh2ZWN0b3I8eHNfX3NlcXVlbmNlKj46OmNvbnN0X2l0ZXJhdG9yIHNlcXVlbmNlID0gc2VxdWVuY2VzLmJlZ2luKCk7IHNlcXVlbmNlICE9IHNlcXVlbmNlcy5lbmQoKTsgKytzZXF1ZW5jZSkKKyAgICBnZW4oVVJJLCAqKnNlcXVlbmNlKTsKK30KKwordm9pZCBUeXBlczo6Z2VuKGNvbnN0IGNoYXIgKlVSSSwgY29uc3QgeHNfX3NlcXVlbmNlJiBzZXF1ZW5jZSkKK3sgYm9vbCB0bXBfdW5pb24xID0gd2l0aF91bmlvbjsKKyAgYm9vbCB0bXBfdW5pb24yID0gZmFrZV91bmlvbjsKKyAgd2l0aF91bmlvbiA9IGZhbHNlOworICBmYWtlX3VuaW9uID0gZmFsc2U7CisgIGRvY3VtZW50KHNlcXVlbmNlLmFubm90YXRpb24pOworICBnZW4oVVJJLCBzZXF1ZW5jZS5lbGVtZW50KTsKKyAgZ2VuKFVSSSwgc2VxdWVuY2UuZ3JvdXApOworICBnZW4oVVJJLCBzZXF1ZW5jZS5jaG9pY2UpOworICBnZW4oVVJJLCBzZXF1ZW5jZS5zZXF1ZW5jZSk7CisgIGdlbihVUkksIHNlcXVlbmNlLmFueSk7CisgIHdpdGhfdW5pb24gPSB0bXBfdW5pb24xOworICBmYWtlX3VuaW9uID0gdG1wX3VuaW9uMjsKK30KKwordm9pZCBUeXBlczo6Z2VuKGNvbnN0IGNoYXIgKlVSSSwgY29uc3QgdmVjdG9yPHhzX19lbGVtZW50PiYgZWxlbWVudHMpCit7IGZvciAodmVjdG9yPHhzX19lbGVtZW50Pjo6Y29uc3RfaXRlcmF0b3IgZWxlbWVudCA9IGVsZW1lbnRzLmJlZ2luKCk7IGVsZW1lbnQgIT0gZWxlbWVudHMuZW5kKCk7ICsrZWxlbWVudCkKKyAgICBnZW4oVVJJLCAqZWxlbWVudCk7Cit9CisKK3ZvaWQgVHlwZXM6Omdlbihjb25zdCBjaGFyICpVUkksIGNvbnN0IHhzX19lbGVtZW50JiBlbGVtZW50KQoreyBjb25zdCBjaGFyICpuYW1lLCAqdHlwZSwgKm5hbWVVUkkgPSBOVUxMLCAqdHlwZVVSSSA9IE5VTEw7CisgIG5hbWUgPSBlbGVtZW50Lm5hbWU7CisgIHR5cGUgPSBlbGVtZW50LnR5cGU7CisgIGRvY3VtZW50KGVsZW1lbnQuYW5ub3RhdGlvbik7CisgIGlmICghVVJJIHx8IHN0cmNtcChVUkksIGVsZW1lbnQuc2NoZW1hUHRyKCktPnRhcmdldE5hbWVzcGFjZSkpCisgICAgbmFtZVVSSSA9IGVsZW1lbnQuc2NoZW1hUHRyKCktPnRhcmdldE5hbWVzcGFjZTsKKyAgaWYgKGVsZW1lbnQuZWxlbWVudFB0cigpKSAvLyBlbGVtZW50IHJlZgorICB7IG5hbWUgPSBlbGVtZW50LmVsZW1lbnRQdHIoKS0+bmFtZTsKKyAgICBpZiAoZWxlbWVudC5zY2hlbWFQdHIoKSAhPSBlbGVtZW50LmVsZW1lbnRQdHIoKS0+c2NoZW1hUHRyKCkpCisgICAgICBuYW1lVVJJID0gZWxlbWVudC5lbGVtZW50UHRyKCktPnNjaGVtYVB0cigpLT50YXJnZXROYW1lc3BhY2U7CisgICAgaWYgKGVsZW1lbnQuZWxlbWVudFB0cigpLT50eXBlKQorICAgIHsgdHlwZSA9IGVsZW1lbnQuZWxlbWVudFB0cigpLT50eXBlOworICAgIH0KKyAgICBlbHNlIGlmIChlbGVtZW50LmVsZW1lbnRQdHIoKS0+c2NoZW1hUHRyKCkpCisgICAgeyB0eXBlID0gbmFtZTsKKyAgICAgIHR5cGVVUkkgPSBlbGVtZW50LmVsZW1lbnRQdHIoKS0+c2NoZW1hUHRyKCktPnRhcmdldE5hbWVzcGFjZTsKKyAgICB9CisgICAgZWxzZQorICAgICAgdHlwZSA9IG5hbWU7CisgICAgZG9jdW1lbnQoZWxlbWVudC5lbGVtZW50UHRyKCktPmFubm90YXRpb24pOworICAgIGlmIChlbGVtZW50LmVsZW1lbnRQdHIoKS0+YWJzdHJhY3QpCisgICAgeyBmcHJpbnRmKHN0cmVhbSwgIi8vLyBSZWZlcmVuY2UgJXMgdG8gYWJzdHJhY3QgZWxlbWVudC5cbiIsIGVsZW1lbnQucmVmKTsKKyAgICAgIGdlbl9zdWJzdGl0dXRpb25zKFVSSSwgZWxlbWVudCk7CisgICAgfQorICAgIGVsc2UgaWYgKGVsZW1lbnQubWF4T2NjdXJzICYmIHN0cmNtcChlbGVtZW50Lm1heE9jY3VycywgIjEiKSkgLy8gbWF4T2NjdXJzICE9ICIxIgorICAgIHsgY29uc3QgY2hhciAqcyA9IHRuYW1lcHRyKGNmbGFnICYmICF6ZmxhZywgTlVMTCwgdHlwZVVSSSwgdHlwZSk7CisgICAgICBpZiAoY2ZsYWcgfHwgc2ZsYWcpCisgICAgICB7IGZwcmludGYoc3RyZWFtLCAiLy8vIFNpemUgb2YgdGhlIGR5bmFtaWMgYXJyYXkgb2YgJXMgaXMgJXMuLiVzXG4iLCBzLCBlbGVtZW50Lm1pbk9jY3VycyA/IGVsZW1lbnQubWluT2NjdXJzIDogIjEiLCBlbGVtZW50Lm1heE9jY3Vycyk7CisgICAgICAgIGZwcmludGYoc3RyZWFtLCBzaXplZm9ybWF0LCAiaW50IiwgYW5hbWUoTlVMTCwgTlVMTCwgbmFtZSkpOworICAgICAgICBpZiAoaXNfaW50ZWdlcihlbGVtZW50Lm1heE9jY3VycykpCisJICBmcHJpbnRmKHN0cmVhbSwgIiAlczolcyIsIGVsZW1lbnQubWluT2NjdXJzID8gZWxlbWVudC5taW5PY2N1cnMgOiAiMSIsIGVsZW1lbnQubWF4T2NjdXJzKTsKKwlmcHJpbnRmKHN0cmVhbSwgIjtcbiIpOworCWlmIChjZmxhZyAmJiAhemZsYWcpCisgICAgICAgIHsgZnByaW50ZihzdHJlYW0sICIvLy8gQXJyYXkgb2YgbGVuZ3RoICVzLi4lc1xuIiwgZWxlbWVudC5taW5PY2N1cnMgPyBlbGVtZW50Lm1pbk9jY3VycyA6ICIxIiwgZWxlbWVudC5tYXhPY2N1cnMpOworCSAgZnByaW50ZihzdHJlYW0sIGVsZW1lbnRmb3JtYXQsIHMsIGFuYW1lKE5VTEwsIG5hbWVVUkksIG5hbWUpKTsKKwl9CisJZWxzZQorICAgICAgICB7IGZwcmludGYoc3RyZWFtLCAiLy8vIFBvaW50ZXIgdG8gYXJyYXkgb2YgbGVuZ3RoICVzLi4lc1xuIiwgZWxlbWVudC5taW5PY2N1cnMgPyBlbGVtZW50Lm1pbk9jY3VycyA6ICIxIiwgZWxlbWVudC5tYXhPY2N1cnMpOworCSAgZnByaW50ZihzdHJlYW0sIHBvaW50ZXJmb3JtYXQsIHMsIGFuYW1lKE5VTEwsIG5hbWVVUkksIG5hbWUpKTsKKwl9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IGZwcmludGYoc3RyZWFtLCAiLy8vIFZlY3RvciBvZiAlcyB3aXRoIGxlbmd0aCAlcy4uJXNcbiIsIHMsIGVsZW1lbnQubWluT2NjdXJzID8gZWxlbWVudC5taW5PY2N1cnMgOiAiMSIsIGVsZW1lbnQubWF4T2NjdXJzKTsKKwlpZiAod2l0aF91bmlvbikKKyAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgcG9pbnRlcnZlY3RvcmZvcm1hdCwgcywgYW5hbWUoTlVMTCwgbmFtZVVSSSwgbmFtZSkpOworCWVsc2UKKyAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgdmVjdG9yZm9ybWF0LCBzLCBhbmFtZShOVUxMLCBuYW1lVVJJLCBuYW1lKSk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7IGZwcmludGYoc3RyZWFtLCAiLy8vIEVsZW1lbnQgcmVmZXJlbmNlICVzLlxuIiwgZWxlbWVudC5yZWYpOworICAgICAgZG9jdW1lbnQoZWxlbWVudC5lbGVtZW50UHRyKCktPmFubm90YXRpb24pOworICAgICAgZnByaW50ZihzdHJlYW0sIGVsZW1lbnRmb3JtYXQsIHBuYW1lKGZha2VfdW5pb24gfHwgaXNfbmlsbGFibGUoZWxlbWVudCksIE5VTEwsIHR5cGVVUkksIHR5cGUpLCBhbmFtZShOVUxMLCBuYW1lVVJJLCBuYW1lKSk7CisgICAgfQorICB9CisgIGVsc2UgaWYgKG5hbWUgJiYgdHlwZSkKKyAgeyBpZiAoZWxlbWVudC5hYnN0cmFjdCkKKyAgICB7IGZwcmludGYoc3RyZWFtLCAiLy8vIEFic3RyYWN0IGVsZW1lbnQgJXMgb2YgdHlwZSAlcy5cbiIsIG5hbWUsIHR5cGUpOworICAgICAgZ2VuX3N1YnN0aXR1dGlvbnMoVVJJLCBlbGVtZW50KTsKKyAgICB9CisgICAgZWxzZSBpZiAoZWxlbWVudC5tYXhPY2N1cnMgJiYgc3RyY21wKGVsZW1lbnQubWF4T2NjdXJzLCAiMSIpKSAvLyBtYXhPY2N1cnMgIT0gIjEiCisgICAgeyBjb25zdCBjaGFyICpzID0gdG5hbWVwdHIoY2ZsYWcgJiYgIXpmbGFnLCBOVUxMLCBOVUxMLCB0eXBlKTsKKyAgICAgIGlmIChjZmxhZyB8fCBzZmxhZykKKyAgICAgIHsgZnByaW50ZihzdHJlYW0sICIvLy8gU2l6ZSBvZiBhcnJheSBvZiAlcyBpcyAlcy4uJXNcbiIsIHMsIGVsZW1lbnQubWluT2NjdXJzID8gZWxlbWVudC5taW5PY2N1cnMgOiAiMSIsIGVsZW1lbnQubWF4T2NjdXJzKTsKKyAgICAgICAgZnByaW50ZihzdHJlYW0sIHNpemVmb3JtYXQsICJpbnQiLCBhbmFtZShOVUxMLCBOVUxMLCBuYW1lKSk7CisgICAgICAgIGlmIChpc19pbnRlZ2VyKGVsZW1lbnQubWF4T2NjdXJzKSkKKwkgIGZwcmludGYoc3RyZWFtLCAiICVzOiVzIiwgZWxlbWVudC5taW5PY2N1cnMgPyBlbGVtZW50Lm1pbk9jY3VycyA6ICIxIiwgZWxlbWVudC5tYXhPY2N1cnMpOworCWZwcmludGYoc3RyZWFtLCAiO1xuIik7CisJaWYgKGNmbGFnICYmICF6ZmxhZykKKyAgICAgICAgeyBmcHJpbnRmKHN0cmVhbSwgIi8vLyBBcnJheSBvZiBsZW5ndGggJXMuLiVzXG4iLCBlbGVtZW50Lm1pbk9jY3VycyA/IGVsZW1lbnQubWluT2NjdXJzIDogIjEiLCBlbGVtZW50Lm1heE9jY3Vycyk7CisJICBmcHJpbnRmKHN0cmVhbSwgZWxlbWVudGZvcm1hdCwgcywgYW5hbWUoTlVMTCwgbmFtZVVSSSwgbmFtZSkpOworCX0KKwllbHNlCisgICAgICAgIHsgZnByaW50ZihzdHJlYW0sICIvLy8gUG9pbnRlciB0byBhcnJheSBvZiBsZW5ndGggJXMuLiVzXG4iLCBlbGVtZW50Lm1pbk9jY3VycyA/IGVsZW1lbnQubWluT2NjdXJzIDogIjEiLCBlbGVtZW50Lm1heE9jY3Vycyk7CisJICBmcHJpbnRmKHN0cmVhbSwgcG9pbnRlcmZvcm1hdCwgcywgYW5hbWUoTlVMTCwgbmFtZVVSSSwgbmFtZSkpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IGZwcmludGYoc3RyZWFtLCAiLy8vIFZlY3RvciBvZiAlcyB3aXRoIGxlbmd0aCAlcy4uJXNcbiIsIHMsIGVsZW1lbnQubWluT2NjdXJzID8gZWxlbWVudC5taW5PY2N1cnMgOiAiMSIsIGVsZW1lbnQubWF4T2NjdXJzKTsKKwlpZiAod2l0aF91bmlvbikKKwkgIGZwcmludGYoc3RyZWFtLCBwb2ludGVydmVjdG9yZm9ybWF0LCBzLCBhbmFtZShOVUxMLCBuYW1lVVJJLCBuYW1lKSk7CisJZWxzZQorCSAgZnByaW50ZihzdHJlYW0sIHZlY3RvcmZvcm1hdCwgcywgYW5hbWUoTlVMTCwgbmFtZVVSSSwgbmFtZSkpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeyBmcHJpbnRmKHN0cmVhbSwgIi8vLyBFbGVtZW50ICVzIG9mIHR5cGUgJXMuXG4iLCBuYW1lLCB0eXBlKTsKKyAgICAgIGZwcmludGYoc3RyZWFtLCBlbGVtZW50Zm9ybWF0LCBwbmFtZShmYWtlX3VuaW9uIHx8IGlzX25pbGxhYmxlKGVsZW1lbnQpLCBOVUxMLCBOVUxMLCB0eXBlKSwgYW5hbWUoTlVMTCwgbmFtZVVSSSwgbmFtZSkpOworICAgIH0KKyAgfQorICBlbHNlIGlmIChuYW1lICYmIGVsZW1lbnQuc2ltcGxlVHlwZVB0cigpKQorICB7IGRvY3VtZW50KGVsZW1lbnQuc2ltcGxlVHlwZVB0cigpLT5hbm5vdGF0aW9uKTsKKyAgICBpZiAoZWxlbWVudC5tYXhPY2N1cnMgJiYgc3RyY21wKGVsZW1lbnQubWF4T2NjdXJzLCAiMSIpKSAvLyBtYXhPY2N1cnMgIT0gIjEiCisgICAgeyBmcHJpbnRmKHN0cmVhbSwgIi8vLyBTaXplIG9mICVzIGFycmF5IGlzICVzLi4lc1xuIiwgbmFtZSwgZWxlbWVudC5taW5PY2N1cnMgPyBlbGVtZW50Lm1pbk9jY3VycyA6ICIxIiwgZWxlbWVudC5tYXhPY2N1cnMpOworICAgICAgZnByaW50ZihzdHJlYW0sIHNpemVmb3JtYXQsICJpbnQiLCBhbmFtZShOVUxMLCBOVUxMLCBuYW1lKSk7CisgICAgICBpZiAoaXNfaW50ZWdlcihlbGVtZW50Lm1heE9jY3VycykpCisgICAgICAgIGZwcmludGYoc3RyZWFtLCAiICVzOiVzIiwgZWxlbWVudC5taW5PY2N1cnMgPyBlbGVtZW50Lm1pbk9jY3VycyA6ICIxIiwgZWxlbWVudC5tYXhPY2N1cnMpOworICAgICAgZnByaW50ZihzdHJlYW0sICI7XG4iKTsKKyAgICB9CisgICAgZ2VuKFVSSSwgbmFtZSwgKmVsZW1lbnQuc2ltcGxlVHlwZVB0cigpLCB0cnVlKTsKKyAgICBpZiAoaXNfbmlsbGFibGUoZWxlbWVudCkKKyAgICAgfHwgZWxlbWVudC5tYXhPY2N1cnMgJiYgc3RyY21wKGVsZW1lbnQubWF4T2NjdXJzLCAiMSIpKSAvLyBtYXhPY2N1cnMgIT0gIjEiCisgICAgICBmcHJpbnRmKHN0cmVhbSwgcG9pbnRlcmZvcm1hdCwgIiIsIGFuYW1lKE5VTEwsIG5hbWVVUkksIG5hbWUpKTsKKyAgICBlbHNlCisgICAgICBmcHJpbnRmKHN0cmVhbSwgZWxlbWVudGZvcm1hdCwgIiIsIGFuYW1lKE5VTEwsIG5hbWVVUkksIG5hbWUpKTsKKyAgfQorICBlbHNlIGlmIChuYW1lICYmIGVsZW1lbnQuY29tcGxleFR5cGVQdHIoKSkKKyAgeyBpZiAoZWxlbWVudC5tYXhPY2N1cnMgJiYgc3RyY21wKGVsZW1lbnQubWF4T2NjdXJzLCAiMSIpKSAvLyBtYXhPY2N1cnMgIT0gIjEiCisgICAgeyBmcHJpbnRmKHN0cmVhbSwgIi8vLyBTaXplIG9mICVzIGFycmF5IGlzICVzLi4lc1xuIiwgbmFtZSwgZWxlbWVudC5taW5PY2N1cnMgPyBlbGVtZW50Lm1pbk9jY3VycyA6ICIxIiwgZWxlbWVudC5tYXhPY2N1cnMpOworICAgICAgZnByaW50ZihzdHJlYW0sIHNpemVmb3JtYXQsICJpbnQiLCBhbmFtZShOVUxMLCBOVUxMLCBuYW1lKSk7CisgICAgICBpZiAoaXNfaW50ZWdlcihlbGVtZW50Lm1heE9jY3VycykpCisgICAgICAgIGZwcmludGYoc3RyZWFtLCAiICVzOiVzIiwgZWxlbWVudC5taW5PY2N1cnMgPyBlbGVtZW50Lm1pbk9jY3VycyA6ICIxIiwgZWxlbWVudC5tYXhPY2N1cnMpOworICAgICAgZnByaW50ZihzdHJlYW0sICI7XG4iKTsKKyAgICB9CisgICAgZ2VuKFVSSSwgbmFtZSwgKmVsZW1lbnQuY29tcGxleFR5cGVQdHIoKSwgdHJ1ZSk7CisgICAgaWYgKGlzX25pbGxhYmxlKGVsZW1lbnQpCisgICAgIHx8IGVsZW1lbnQubWF4T2NjdXJzICYmIHN0cmNtcChlbGVtZW50Lm1heE9jY3VycywgIjEiKSkgLy8gbWF4T2NjdXJzICE9ICIxIgorICAgICAgZnByaW50ZihzdHJlYW0sIHBvaW50ZXJmb3JtYXQsICJ9IiwgYW5hbWUoTlVMTCwgbmFtZVVSSSwgbmFtZSkpOworICAgIGVsc2UKKyAgICAgIGZwcmludGYoc3RyZWFtLCBlbGVtZW50Zm9ybWF0LCAifSIsIGFuYW1lKE5VTEwsIG5hbWVVUkksIG5hbWUpKTsKKyAgfQorICBlbHNlIGlmIChlbGVtZW50LnJlZikKKyAgeyBmcHJpbnRmKHN0cmVhbSwgIi8vLyBFbGVtZW50IHJlZmVyZW5jZSAlcy5cbiIsIGVsZW1lbnQucmVmKTsKKyAgICBmcHJpbnRmKHN0cmVhbSwgZWxlbWVudGZvcm1hdCwgdG5hbWUoTlVMTCwgTlVMTCwgZWxlbWVudC5yZWYpLCBhbmFtZShOVUxMLCBOVUxMLCBlbGVtZW50LnJlZikpOworICB9CisgIGVsc2UgaWYgKG5hbWUpCisgIHsgZnByaW50ZihzdHJlYW0sICIvLy8gV2FybmluZzogZWxlbWVudCAnJXMnIGhhcyBubyB0eXBlIG9yIHJlZi4gQXNzdW1pbmcgWE1MIGNvbnRlbnQuXG4iLCBuYW1lP25hbWU6IiIpOworICAgIGlmIChlbGVtZW50Lm1heE9jY3VycyAmJiBzdHJjbXAoZWxlbWVudC5tYXhPY2N1cnMsICIxIikpIC8vIG1heE9jY3VycyAhPSAiMSIKKyAgICB7IGlmIChjZmxhZyB8fCBzZmxhZykKKyAgICAgIHsgZnByaW50ZihzdHJlYW0sIHNpemVmb3JtYXQsICJpbnQiLCBhbmFtZShOVUxMLCBOVUxMLCBuYW1lKSk7CisgICAgICAgIGlmIChpc19pbnRlZ2VyKGVsZW1lbnQubWF4T2NjdXJzKSkKKwkgIGZwcmludGYoc3RyZWFtLCAiICVzOiVzIiwgZWxlbWVudC5taW5PY2N1cnMgPyBlbGVtZW50Lm1pbk9jY3VycyA6ICIxIiwgZWxlbWVudC5tYXhPY2N1cnMpOworCWZwcmludGYoc3RyZWFtLCAiO1xuIik7CisgICAgICAgIGZwcmludGYoc3RyZWFtLCAiLy8vIFBvaW50ZXIgdG8gYXJyYXkgb2YgWE1MLlxuIik7CisJZnByaW50ZihzdHJlYW0sIHBvaW50ZXJmb3JtYXQsICJfWE1MIiwgYW5hbWUoTlVMTCwgbmFtZVVSSSwgbmFtZSkpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBmcHJpbnRmKHN0cmVhbSwgIi8vLyBWZWN0b3Igb2YgWE1MIHdpdGggbGVuZ3RoICVzLi4lc1xuIiwgZWxlbWVudC5taW5PY2N1cnMgPyBlbGVtZW50Lm1pbk9jY3VycyA6ICIxIiwgZWxlbWVudC5tYXhPY2N1cnMpOworCWlmICh3aXRoX3VuaW9uKQorCSAgZnByaW50ZihzdHJlYW0sIHBvaW50ZXJ2ZWN0b3Jmb3JtYXQsICJfWE1MIiwgYW5hbWUoTlVMTCwgbmFtZVVSSSwgbmFtZSkpOworCWVsc2UKKwkgIGZwcmludGYoc3RyZWFtLCB2ZWN0b3Jmb3JtYXQsICJfWE1MIiwgYW5hbWUoTlVMTCwgbmFtZVVSSSwgbmFtZSkpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICBmcHJpbnRmKHN0cmVhbSwgZWxlbWVudGZvcm1hdCwgIl9YTUwiLCBhbmFtZShOVUxMLCBuYW1lVVJJLCBuYW1lKSk7CisgIH0KKyAgZWxzZQorICAgIGZwcmludGYoc3RyZWFtLCAiLy8vIFdhcm5pbmc6IGVsZW1lbnQgaGFzIG5vIHR5cGUgb3IgcmVmLiIpOworICBpZiAoIWVsZW1lbnQuYWJzdHJhY3QgJiYgIShlbGVtZW50LmVsZW1lbnRQdHIoKSAmJiBlbGVtZW50LmVsZW1lbnRQdHIoKS0+YWJzdHJhY3QpKQorICB7IGlmICghZWxlbWVudC5taW5PY2N1cnMgJiYgIWVsZW1lbnQubmlsbGFibGUgJiYgIWVsZW1lbnQuZGVmYXVsdF8pCisgICAgICBmcHJpbnRmKHN0cmVhbSwgIiAxIik7CisgICAgZWxzZSBpZiAoZWxlbWVudC5taW5PY2N1cnMpCisgICAgICBmcHJpbnRmKHN0cmVhbSwgIiAlcyIsIGVsZW1lbnQubWluT2NjdXJzKTsKKyAgICBpZiAoZWxlbWVudC5tYXhPY2N1cnMgJiYgc3RyY21wKGVsZW1lbnQubWF4T2NjdXJzLCAiMSIpICYmIGlzX2ludGVnZXIoZWxlbWVudC5tYXhPY2N1cnMpKQorICAgICAgZnByaW50ZihzdHJlYW0sICI6JXMiLCBlbGVtZW50Lm1heE9jY3Vycyk7CisgICAgaWYgKGVsZW1lbnQuZGVmYXVsdF8pCisgICAgeyAvLyBkZXRlcm1pbmUgd2hldGhlciB0aGUgZWxlbWVudCBjYW4gYmUgYXNzaWduZWQgYSBkZWZhdWx0IHZhbHVlLCB0aGlzIGlzIGRlcGVuZGVudCBvbiB0aGUgY2hvaWNlIG9mIG1hcHBpbmcgZm9yIHByaW1pdGl2ZSB0eXBlcworICAgICAgaWYgKHR5cGUpCisgICAgICB7IGNvbnN0IGNoYXIgKnQgPSB0bmFtZShOVUxMLCBOVUxMLCB0eXBlKTsKKyAgICAgICAgaWYgKCFzdHJuY21wKHQsICJ1bnNpZ25lZCAiLCA5KSkKKyAgICAgICAgICB0ICs9IDk7CisgICAgICAgIGlmICghc3RyY21wKHQsICJib29sIikKKyAgICAgICAgIHx8ICFzdHJjbXAodCwgImNoYXIiKQorICAgICAgICAgfHwgIXN0cmNtcCh0LCAiZG91YmxlIikKKyAgICAgICAgIHx8ICFzdHJjbXAodCwgImZsb2F0IikKKyAgICAgICAgIHx8ICFzdHJjbXAodCwgImludCIpCisgICAgICAgICB8fCAhc3RyY21wKHQsICJsb25nIikKKyAgICAgICAgIHx8ICFzdHJjbXAodCwgIkxPTkc2NCIpCisgICAgICAgICB8fCAhc3RyY21wKHQsICJzaG9ydCIpCisgICAgICAgICB8fCAhc3RyY21wKHQsICJVTE9ORzY0IikpCisgICAgICAgICAgZnByaW50ZihzdHJlYW0sICIgPSAlcyIsIGVsZW1lbnQuZGVmYXVsdF8pOworICAgICAgICBlbHNlIGlmICghc3RyY21wKHQsICJjaGFyKiIpCisgICAgICAgICAgICAgIHx8ICFzdHJjbXAodCwgImNoYXIgKiIpKQkvLyBub3QgZWxlZ2FudAorICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiID0gXCIlc1wiIiwgZWxlbWVudC5kZWZhdWx0Xyk7CisgICAgICAgIGVsc2UgaWYgKCFzdHJuY21wKHQsICJlbnVtICIsIDUpKQorICAgICAgICAgIGZwcmludGYoc3RyZWFtLCAiID0gJXMiLCBlbmFtZSh0ICsgNSwgZWxlbWVudC5kZWZhdWx0XykpOworICAgICAgICBlbHNlIGlmICghc3RyY21wKHQsICJzdGQ6OnN0cmluZyIpIHx8ICFzdHJjbXAodCwgInN0ZDo6c3RyaW5nKiIpIHx8ICFzdHJjbXAodCwgInN0ZDo6c3RyaW5nICoiKSkJLy8gbm90IGVsZWdhbnQKKyAgICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIiA9IFwiJXNcIiIsIGVsZW1lbnQuZGVmYXVsdF8pOworICAgICAgfQorICAgICAgZnByaW50ZihzdHJlYW0sICI7XHQvLy88IERlZmF1bHQgdmFsdWU9XCIlc1wiLlxuIiwgZWxlbWVudC5kZWZhdWx0Xyk7CisgICAgfQorICAgIGVsc2UgaWYgKGVsZW1lbnQubmlsbGFibGUpCisgICAgICBmcHJpbnRmKHN0cmVhbSwgIjtcdC8vLzwgTnVsbGFibGUgcG9pbnRlci5cbiIpOworICAgIGVsc2UgaWYgKCghZWxlbWVudC5taW5PY2N1cnMgfHwgIXN0cmNtcChlbGVtZW50Lm1pbk9jY3VycywgIjEiKSkgJiYgKCFlbGVtZW50Lm1heE9jY3VycyB8fCAhc3RyY21wKGVsZW1lbnQubWF4T2NjdXJzLCAiMSIpKSkKKyAgICAgIGZwcmludGYoc3RyZWFtLCAiO1x0Ly8vPCBSZXF1aXJlZCBlbGVtZW50LlxuIik7CisgICAgZWxzZSBpZiAoZWxlbWVudC5taW5PY2N1cnMgJiYgIXN0cmNtcChlbGVtZW50Lm1pbk9jY3VycywgIjAiKSAmJiAoIWVsZW1lbnQubWF4T2NjdXJzIHx8ICFzdHJjbXAoZWxlbWVudC5tYXhPY2N1cnMsICIxIikpKQorICAgICAgZnByaW50ZihzdHJlYW0sICI7XHQvLy88IE9wdGlvbmFsIGVsZW1lbnQuXG4iKTsKKyAgICBlbHNlCisgICAgICBmcHJpbnRmKHN0cmVhbSwgIjtcbiIpOworICB9Cit9CisKK3ZvaWQgVHlwZXM6Omdlbihjb25zdCBjaGFyICpVUkksIGNvbnN0IHZlY3Rvcjx4c19fZ3JvdXA+JiBncm91cHMpCit7IGZvciAodmVjdG9yPHhzX19ncm91cD46OmNvbnN0X2l0ZXJhdG9yIGdyb3VwID0gZ3JvdXBzLmJlZ2luKCk7IGdyb3VwICE9IGdyb3Vwcy5lbmQoKTsgKytncm91cCkKKyAgICBnZW4oVVJJLCAqZ3JvdXApOworfQorCit2b2lkIFR5cGVzOjpnZW4oY29uc3QgY2hhciAqVVJJLCBjb25zdCB4c19fZ3JvdXAmIGdyb3VwKQoreyBpZiAoZ3JvdXAuZ3JvdXBQdHIoKSkKKyAgeyBpZiAoZ3JvdXAuc2NoZW1hUHRyKCkgPT0gZ3JvdXAuZ3JvdXBQdHIoKS0+c2NoZW1hUHRyKCkpCisgICAgICBnZW4oVVJJLCAqZ3JvdXAuZ3JvdXBQdHIoKSk7CisgICAgZWxzZQorICAgICAgZ2VuKGdyb3VwLmdyb3VwUHRyKCktPnNjaGVtYVB0cigpLT50YXJnZXROYW1lc3BhY2UsICpncm91cC5ncm91cFB0cigpKTsKKyAgfQorICBlbHNlIGlmIChncm91cC5hbGwpCisgICAgZ2VuKFVSSSwgZ3JvdXAuYWxsLT5lbGVtZW50KTsKKyAgZWxzZSBpZiAoZ3JvdXAuc2VxdWVuY2UpCisgICAgZ2VuKFVSSSwgZ3JvdXAuc2VxdWVuY2UtPmVsZW1lbnQpOworICBlbHNlIGlmIChncm91cC5jaG9pY2UpCisgICAgZ2VuKFVSSSwgTlVMTCwgKmdyb3VwLmNob2ljZSk7Cit9CisKK3ZvaWQgVHlwZXM6Omdlbihjb25zdCBjaGFyICpVUkksIGNvbnN0IHZlY3Rvcjx4c19fY2hvaWNlPiYgY2hvaWNlcykKK3sgZm9yICh2ZWN0b3I8eHNfX2Nob2ljZT46OmNvbnN0X2l0ZXJhdG9yIGNob2ljZSA9IGNob2ljZXMuYmVnaW4oKTsgY2hvaWNlICE9IGNob2ljZXMuZW5kKCk7ICsrY2hvaWNlKQorICAgIGdlbihVUkksIE5VTEwsICpjaG9pY2UpOworfQorCit2b2lkIFR5cGVzOjpnZW4oY29uc3QgY2hhciAqVVJJLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB4c19fY2hvaWNlJiBjaG9pY2UpCit7IGNvbnN0IGNoYXIgKnIgPSBOVUxMLCAqcyA9IE5VTEwsICp0ID0gTlVMTDsKKyAgYm9vbCB1c2VfdW5pb24gPSAhdWZsYWc7CisgIGJvb2wgd3JhcF91bmlvbiA9IGZhbHNlOworICBib29sIHRtcF91bmlvbjsKKyAgaWYgKCFVUkkgJiYgY2hvaWNlLnNjaGVtYVB0cigpKQorICAgIFVSSSA9IGNob2ljZS5zY2hlbWFQdHIoKS0+dGFyZ2V0TmFtZXNwYWNlOworICBmcHJpbnRmKHN0cmVhbSwgIi8vLyBDSE9JQ0UgT0YgRUxFTUVOVFMgRk9SIGNob2ljZSIpOworICBkb2N1bWVudChjaG9pY2UuYW5ub3RhdGlvbik7CisgIGlmIChjaG9pY2UubWluT2NjdXJzKQorICAgIGZwcmludGYoc3RyZWFtLCAiIG1pbk9jY3Vycz1cIiVzXCIiLCBjaG9pY2UubWluT2NjdXJzKTsKKyAgaWYgKGNob2ljZS5tYXhPY2N1cnMpCisgICAgZnByaW50ZihzdHJlYW0sICIgbWF4T2NjdXJzPVwiJXNcIiIsIGNob2ljZS5tYXhPY2N1cnMpOworICBmcHJpbnRmKHN0cmVhbSwgIlxuIik7CisgIGlmICghY2hvaWNlLmdyb3VwLmVtcHR5KCkgfHwgIWNob2ljZS5zZXF1ZW5jZS5lbXB0eSgpKQorICAgIHVzZV91bmlvbiA9IGZhbHNlOworICBlbHNlIGlmIChjZmxhZyB8fCBzZmxhZykKKyAgeyBmb3IgKHZlY3Rvcjx4c19fZWxlbWVudD46OmNvbnN0X2l0ZXJhdG9yIGVsID0gY2hvaWNlLmVsZW1lbnQuYmVnaW4oKTsgZWwgIT0gY2hvaWNlLmVsZW1lbnQuZW5kKCk7IGVsKyspCisgICAgeyBpZiAoKCplbCkubWF4T2NjdXJzICYmIHN0cmNtcCgoKmVsKS5tYXhPY2N1cnMsICIxIikpCisgICAgICB7IHVzZV91bmlvbiA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKHVzZV91bmlvbikKKyAgeyB0ID0gdW5hbWUoVVJJKTsKKyAgICBzID0gc3Ryc3RyKHQsICJfX3VuaW9uIik7CisgICAgaWYgKHMpCisgICAgICByID0gcyArIDc7CisgICAgaWYgKCFyIHx8ICEqcikKKyAgICB7IHIgPSB0OworICAgICAgcyA9ICJfX3VuaW9uIjsKKyAgICB9CisgICAgaWYgKGNob2ljZS5tYXhPY2N1cnMgJiYgc3RyY21wKGNob2ljZS5tYXhPY2N1cnMsICIxIikpCisgICAgeyBpZiAod2l0aF91bmlvbikKKyAgICAgIHsgLy8gR2VuZXJhdGUgYSB3cmFwcGVyIHdoZW4gd2UgbmVlZCBhIHVuaW9uIHdpdGhpbiBhIHVuaW9uCisgICAgICAgIHdyYXBfdW5pb24gPSB0cnVlOworICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIiAgICBzdHJ1Y3QgX18lc1xuICAgIHtcbiIsIHQpOworICAgICAgfQorICAgICAgZnByaW50ZihzdHJlYW0sIHNpemVmb3JtYXQsICJpbnQiLCByKTsKKyAgICAgIGlmIChjaG9pY2UubWluT2NjdXJzKQorICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIiAlcyIsIGNob2ljZS5taW5PY2N1cnMpOworICAgICAgaWYgKGNob2ljZS5tYXhPY2N1cnMgJiYgc3RyY21wKGNob2ljZS5tYXhPY2N1cnMsICIxIikgJiYgaXNfaW50ZWdlcihjaG9pY2UubWF4T2NjdXJzKSkKKyAgICAgICAgZnByaW50ZihzdHJlYW0sICI6JXMiLCBjaG9pY2UubWF4T2NjdXJzKTsKKyAgICAgIGZwcmludGYoc3RyZWFtLCAiO1xuICAgIHN0cnVjdCBfJXNcbiAgICB7XG4iLCB0KTsKKyAgICB9CisgICAgaWYgKCF3aXRoX3VuaW9uIHx8IHdyYXBfdW5pb24pCisgICAgeyBmcHJpbnRmKHN0cmVhbSwgY2hvaWNlZm9ybWF0LCAiaW50Iiwgcik7CisgICAgICBpZiAoY2hvaWNlLm1pbk9jY3VycykKKyAgICAgICAgZnByaW50ZihzdHJlYW0sICIgJXMiLCBjaG9pY2UubWluT2NjdXJzKTsKKyAgICAgIGZwcmludGYoc3RyZWFtLCAiO1x0Ly8vPCBVbmlvbiAlcyBzZWxlY3Rvcjogc2V0IHRvIFNPQVBfVU5JT05fJXNfPGZpZWxkbmFtZT4lc1xuIiwgdCwgdCwgY2hvaWNlLm1pbk9jY3VycyAmJiAhc3RyY21wKGNob2ljZS5taW5PY2N1cnMsICIwIikgPyAiIG9yIDAiIDogIiIpOworICAgICAgaWYgKG5hbWUpCisgICAgICAgIGZwcmludGYoc3RyZWFtLCAiLy8vIFVuaW9uIGZvciBjaG9pY2UgaW4gJXNcbiIsIHRuYW1lKE5VTEwsIFVSSSwgbmFtZSkpOworICAgICAgZnByaW50ZihzdHJlYW0sICIgICAgdW5pb24gJXNcbiAgICB7XG4iLCB0KTsKKyAgICB9CisgICAgdG1wX3VuaW9uID0gd2l0aF91bmlvbjsKKyAgICB3aXRoX3VuaW9uID0gdHJ1ZTsKKyAgfQorICBlbHNlCisgIHsgdG1wX3VuaW9uID0gZmFrZV91bmlvbjsKKyAgICBmYWtlX3VuaW9uID0gdHJ1ZTsKKyAgfQorICBnZW4oVVJJLCBjaG9pY2UuZWxlbWVudCk7CisgIGdlbihVUkksIGNob2ljZS5ncm91cCk7CisgIGdlbihVUkksIGNob2ljZS5zZXF1ZW5jZSk7CS8vIFRPRE86IGNoZWNrIHBvdGVudGlhbCBuYW1lIGNvbmZsaWN0cworICBnZW4oVVJJLCBjaG9pY2UuYW55KTsKKyAgaWYgKHVzZV91bmlvbikKKyAgeyB3aXRoX3VuaW9uID0gdG1wX3VuaW9uOworICAgIGlmICghd2l0aF91bmlvbiB8fCB3cmFwX3VuaW9uKQorICAgICAgZnByaW50ZihzdHJlYW0sIGVsZW1lbnRmb3JtYXQsICJ9IiwgcysyKTsKKyAgICBpZiAoY2hvaWNlLm1heE9jY3VycyAmJiBzdHJjbXAoY2hvaWNlLm1heE9jY3VycywgIjEiKSkKKyAgICB7IGZwcmludGYoc3RyZWFtLCAiO1xuIik7CisgICAgICBmcHJpbnRmKHN0cmVhbSwgcG9pbnRlcmZvcm1hdCwgIn0iLCBzKTsKKyAgICB9CisgICAgZnByaW50ZihzdHJlYW0sICI7XG4iKTsKKyAgICBpZiAod3JhcF91bmlvbikKKyAgICB7IGZwcmludGYoc3RyZWFtLCBlbGVtZW50Zm9ybWF0LCAifSIsIHMpOworICAgICAgZnByaW50ZihzdHJlYW0sICI7XG4iKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIGZha2VfdW5pb24gPSB0bXBfdW5pb247CisgIGZwcmludGYoc3RyZWFtLCAiLy8gIEVORCBPRiBDSE9JQ0VcbiIpOworfQorCit2b2lkIFR5cGVzOjpnZW4oY29uc3QgY2hhciAqVVJJLCBjb25zdCB2ZWN0b3I8eHNfX2FueT4mIGFueXMpCit7IGZvciAodmVjdG9yPHhzX19hbnk+Ojpjb25zdF9pdGVyYXRvciBhbnkgPSBhbnlzLmJlZ2luKCk7IGFueSAhPSBhbnlzLmVuZCgpOyArK2FueSkKKyAgICBnZW4oVVJJLCAqYW55KTsKK30KKwordm9pZCBUeXBlczo6Z2VuKGNvbnN0IGNoYXIgKlVSSSwgY29uc3QgeHNfX2FueSYgYW55KQoreyBmcHJpbnRmKHN0cmVhbSwgIi8vLyBUT0RPOiA8YW55Iik7CisgIGlmIChhbnkubmFtZXNwYWNlXykKKyAgICBmcHJpbnRmKHN0cmVhbSwgIiBuYW1lc3BhY2U9XCIlc1wiIiwgYW55Lm5hbWVzcGFjZV8pOworICBpZiAoYW55Lm1pbk9jY3VycykKKyAgICBmcHJpbnRmKHN0cmVhbSwgIiBtaW5PY2N1cnM9XCIlc1wiIiwgYW55Lm1pbk9jY3Vycyk7CisgIGlmIChhbnkubWF4T2NjdXJzKQorICAgIGZwcmludGYoc3RyZWFtLCAiIG1heE9jY3Vycz1cIiVzXCIiLCBhbnkubWF4T2NjdXJzKTsKKyAgZnByaW50ZihzdHJlYW0sICI+XG4vLy8gICAgICAgU2NoZW1hIGV4dGVuc2liaWxpdHkgaXMgdXNlci1kZWZpbmFibGUuXG4vLy8gICAgICAgQ29uc3VsdCB0aGUgcHJvdG9jb2wgZG9jdW1lbnRhdGlvbiB0byBjaGFuZ2UgYW5kL29yIGluc2VydCBkZWNsYXJhdGlvbnMuXG4vLy8gICAgICAgVXNlIHdzZGwyaCBvcHRpb24gLXggdG8gcmVtb3ZlIHRoaXMgZWxlbWVudC5cbi8vLyAgICAgICBVc2Ugd3NkbDJoIG9wdGlvbiAtZCB0byB1c2UgRE9NLlxuIik7CisgIGlmIChkZmxhZykKKyAgeyBmcHJpbnRmKHN0cmVhbSwgcG9pbnRlcmZvcm1hdCwgInhzZF9fYW55VHlwZSIsICJfX2FueSIpOworICAgIGZwcmludGYoc3RyZWFtLCAiO1x0Ly8vPCBDYXRjaCBhbnkgZWxlbWVudCBjb250ZW50IGluIERPTS5cbiIpOworICB9CisgIGVsc2UgaWYgKCF4ZmxhZykKKyAgeyBmcHJpbnRmKHN0cmVhbSwgZWxlbWVudGZvcm1hdCwgIl9YTUwiLCAiX19hbnkiKTsKKyAgICBmcHJpbnRmKHN0cmVhbSwgIjtcdC8vLzwgQ2F0Y2ggYW55IGVsZW1lbnQgY29udGVudCBpbiBYTUwgc3RyaW5nLlxuIik7CisgIH0KK30KKwordm9pZCBUeXBlczo6Z2VuKGNvbnN0IGNoYXIgKlVSSSwgY29uc3QgeHNfX2FueUF0dHJpYnV0ZSYgYW55QXR0cmlidXRlKQoreyBmcHJpbnRmKHN0cmVhbSwgIi8vLyBUT0RPOiA8YW55QXR0cmlidXRlIik7CisgIGlmIChhbnlBdHRyaWJ1dGUubmFtZXNwYWNlXykKKyAgICBmcHJpbnRmKHN0cmVhbSwgIiBuYW1lc3BhY2U9XCIlc1wiIiwgYW55QXR0cmlidXRlLm5hbWVzcGFjZV8pOworICBmcHJpbnRmKHN0cmVhbSwgIj5cbi8vLyAgICAgICBTY2hlbWEgZXh0ZW5zaWJpbGl0eSBpcyB1c2VyLWRlZmluYWJsZS5cbi8vLyAgICAgICBDb25zdWx0IHRoZSBwcm90b2NvbCBkb2N1bWVudGF0aW9uIHRvIGNoYW5nZSBhbmQvb3IgaW5zZXJ0IGRlY2xhcmF0aW9ucy5cbi8vLyAgICAgICBVc2Ugd3NkbDJoIG9wdGlvbiAteCB0byByZW1vdmUgdGhpcyBhdHRyaWJ1dGUuXG4iKTsKKyAgaWYgKCF4ZmxhZykKKyAgeyBmcHJpbnRmKHN0cmVhbSwgYXR0cmlidXRlZm9ybWF0LCAiX1hNTCIsICJfX2FueUF0dHJpYnV0ZSIpOworICAgIGZwcmludGYoc3RyZWFtLCAiO1x0Ly8vPCBDYXRjaCBhbnkgYXR0cmlidXRlIGNvbnRlbnQgaW4gWE1MIHN0cmluZy5cbiIpOworICB9Cit9CisKK3ZvaWQgVHlwZXM6Omdlbl9zb2FwX2FycmF5KGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnQsIGNvbnN0IGNoYXIgKml0ZW0sIGNoYXIgKnR5cGUpCit7IGNoYXIgKmRpbXMgPSBOVUxMLCBzaXplWzhdOworICAqc2l6ZSA9ICdcMCc7CisgIGlmICh0eXBlKQorICAgIGRpbXMgPSBzdHJyY2hyKHR5cGUsICdbJyk7CisgIGlmIChkaW1zKQorICAgICpkaW1zKysgPSAnXDAnOworICBmcHJpbnRmKHN0cmVhbSwgIi8vLyBTT0FQIGVuY29kZWQgYXJyYXkgb2YgJXNcbiIsIHR5cGUgPyB0eXBlIDogInhzOmFueVR5cGUiKTsKKyAgaWYgKGNmbGFnKQorICAgIGZwcmludGYoc3RyZWFtLCAic3RydWN0ICVzXG57XG4iLCB0KTsKKyAgZWxzZSBpZiAocGZsYWcpCisgICAgZnByaW50ZihzdHJlYW0sICJjbGFzcyAlcyA6IHB1YmxpYyB4c2RfX2FueVR5cGVcbnsgcHVibGljOlxuIiwgdCk7CisgIGVsc2UKKyAgICBmcHJpbnRmKHN0cmVhbSwgImNsYXNzICVzXG57IHB1YmxpYzpcbiIsIHQpOworICBpZiAoZGltcykKKyAgeyBjaGFyICpzID0gc3RyY2hyKGRpbXMsICddJyk7CisgICAgaWYgKHMgJiYgcyAhPSBkaW1zKQorICAgICAgc3ByaW50ZihzaXplLCAiWyVkXSIsIChpbnQpKHMgLSBkaW1zICsgMSkpOworICB9CisgIGlmICh0eXBlKQorICB7IGlmIChzdHJjaHIodHlwZSwgJ1snKSAhPSBOVUxMKQorICAgIHsgZ2VuX3NvYXBfYXJyYXkoTlVMTCwgIiIsIGl0ZW0sIHR5cGUpOworICAgICAgZnByaW50ZihzdHJlYW0sIGFycmF5Zm9ybWF0LCAifSIsIGl0ZW0gPyBhbmFtZShOVUxMLCBOVUxMLCBpdGVtKSA6ICIiKTsKKyAgICAgIGZwcmludGYoc3RyZWFtLCAiO1xuIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7IGNvbnN0IGNoYXIgKnMgPSBwbmFtZSghaXNfYmFzZXR5cGUodHlwZSksIE5VTEwsIE5VTEwsIHR5cGUpOworICAgICAgZnByaW50ZihzdHJlYW0sICIvLy8gUG9pbnRlciB0byBhcnJheSBvZiAlcy5cbiIsIHMpOworICAgICAgZnByaW50ZihzdHJlYW0sIGFycmF5Zm9ybWF0LCBzLCBpdGVtID8gYW5hbWUoTlVMTCwgTlVMTCwgaXRlbSkgOiAiIik7CisgICAgICBmcHJpbnRmKHN0cmVhbSwgIjtcbiIpOworICAgIH0KKyAgICBpZiAoKnNpemUpCisgICAgICBmcHJpbnRmKHN0cmVhbSwgIi8vLyBTaXplIG9mIHRoZSBtdWx0aWRpbWVuc2lvbmFsIGR5bmFtaWMgYXJyYXkgd2l0aCBkaW1lbnNpb25zPSVzXG4iLCBzaXplKTsKKyAgICBlbHNlIAorICAgICAgZnByaW50ZihzdHJlYW0sICIvLy8gU2l6ZSBvZiB0aGUgZHluYW1pYyBhcnJheS5cbiIpOworICAgIGZwcmludGYoc3RyZWFtLCBzaXplZm9ybWF0LCAiaW50Iiwgc2l6ZSk7CisgICAgZnByaW50ZihzdHJlYW0sICI7XG4vLy8gT2Zmc2V0IGZvciBwYXJ0aWFsbHkgdHJhbnNtaXR0ZWQgYXJyYXlzICh1bmNvbW1lbnQgb25seSB3aGVuIHJlcXVpcmVkKS5cbiIpOworICAgIGZwcmludGYoc3RyZWFtLCBvZmZzZXRmb3JtYXQsICJpbnQiLCBzaXplKTsKKyAgICBmcHJpbnRmKHN0cmVhbSwgIjtcbiIpOworICB9CisgIGVsc2UKKyAgeyAvLyBUT0RPOiBoYW5kbGUgZ2VuZXJpYyBTT0FQIGFycmF5PyBFLmcuIGFzIGFuIGFycmF5IG9mIGFueVR5cGUKKyAgICBmcHJpbnRmKHN0cmVhbSwgIi8vIFRPRE86IGhhbmRsZSBnZW5lcmljIFNPQVAtRU5DOkFycmF5IChhcnJheSBvZiBhbnlUeXBlKVxuIik7CisgIH0KK30KKwordm9pZCBUeXBlczo6Z2VuX3N1YnN0aXR1dGlvbnMoY29uc3QgY2hhciAqVVJJLCBjb25zdCB4c19fZWxlbWVudCAmZWxlbWVudCkKK3sgY29uc3Qgc3RkOjp2ZWN0b3I8eHNfX2VsZW1lbnQqPiAqc3Vic3RpdHV0aW9uczsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgY29uc3QgY2hhciAqciA9IE5VTEwsICpzID0gTlVMTDsKKyAgYm9vbCB1c2VfdW5pb24gPSAhdWZsYWc7CisgIGJvb2wgd3JhcF91bmlvbiA9IGZhbHNlOworICBib29sIHRtcF91bmlvbjsKKyAgaWYgKCFVUkkgJiYgZWxlbWVudC5zY2hlbWFQdHIoKSkKKyAgICBVUkkgPSBlbGVtZW50LnNjaGVtYVB0cigpLT50YXJnZXROYW1lc3BhY2U7CisgIGlmIChlbGVtZW50LmVsZW1lbnRQdHIoKSkKKyAgeyBuYW1lID0gZWxlbWVudC5lbGVtZW50UHRyKCktPm5hbWU7CisgICAgc3Vic3RpdHV0aW9ucyA9IGVsZW1lbnQuZWxlbWVudFB0cigpLT5zdWJzdGl0dXRpb25zUHRyKCk7CisgIH0KKyAgZWxzZQorICB7IG5hbWUgPSBlbGVtZW50Lm5hbWU7CisgICAgc3Vic3RpdHV0aW9ucyA9IGVsZW1lbnQuc3Vic3RpdHV0aW9uc1B0cigpOworICB9CisgIGZwcmludGYoc3RyZWFtLCAiLy8vIENIT0lDRSBPRiBFTEVNRU5UUyBGT1Igc3Vic3RpdHV0aW9uR3JvdXA9XCIlc1wiIiwgbmFtZSk7CisgIGlmIChlbGVtZW50Lm1pbk9jY3VycykKKyAgICBmcHJpbnRmKHN0cmVhbSwgIiBtaW5PY2N1cnM9XCIlc1wiIiwgZWxlbWVudC5taW5PY2N1cnMpOworICBpZiAoZWxlbWVudC5tYXhPY2N1cnMpCisgICAgZnByaW50ZihzdHJlYW0sICIgbWF4T2NjdXJzPVwiJXNcIiIsIGVsZW1lbnQubWF4T2NjdXJzKTsKKyAgZnByaW50ZihzdHJlYW0sICIgd2l0aCBlbGVtZW50cyIpOworICBmb3IgKHN0ZDo6dmVjdG9yPHhzX19lbGVtZW50Kj46OmNvbnN0X2l0ZXJhdG9yIGkxID0gc3Vic3RpdHV0aW9ucy0+YmVnaW4oKTsgaTEgIT0gc3Vic3RpdHV0aW9ucy0+ZW5kKCk7ICsraTEpCisgICAgZnByaW50ZihzdHJlYW0sICIgJXMiLCAoKmkxKS0+bmFtZSk7CisgIGZwcmludGYoc3RyZWFtLCAiXG4iKTsKKyAgaWYgKHVzZV91bmlvbikKKyAgeyBjb25zdCBjaGFyICp0ID0gdW5hbWUoVVJJKTsKKyAgICBzID0gc3Ryc3RyKHQsICJfX3VuaW9uIik7CisgICAgaWYgKCFzKQorICAgICAgcyA9ICJfX3VuaW9uIjsKKyAgICByID0gYW5hbWUoTlVMTCwgTlVMTCwgbmFtZSk7CisgICAgaWYgKGVsZW1lbnQubWF4T2NjdXJzICYmIHN0cmNtcChlbGVtZW50Lm1heE9jY3VycywgIjEiKSkKKyAgICB7IGlmICh3aXRoX3VuaW9uKQorICAgICAgeyAvLyBHZW5lcmF0ZSBhIHdyYXBwZXIgd2hlbiB3ZSBuZWVkIGEgdW5pb24gd2l0aGluIGEgdW5pb24KKyAgICAgICAgd3JhcF91bmlvbiA9IHRydWU7CisgICAgICAgIGZwcmludGYoc3RyZWFtLCAiICAgIHN0cnVjdCBfXyVzXG4gICAge1xuIiwgdCk7CisgICAgICB9CisgICAgICBmcHJpbnRmKHN0cmVhbSwgc2l6ZWZvcm1hdCwgImludCIsIHIpOworICAgICAgaWYgKGVsZW1lbnQubWluT2NjdXJzKQorICAgICAgICBmcHJpbnRmKHN0cmVhbSwgIiAlcyIsIGVsZW1lbnQubWluT2NjdXJzKTsKKyAgICAgIGlmIChlbGVtZW50Lm1heE9jY3VycyAmJiBzdHJjbXAoZWxlbWVudC5tYXhPY2N1cnMsICIxIikgJiYgaXNfaW50ZWdlcihlbGVtZW50Lm1heE9jY3VycykpCisgICAgICAgIGZwcmludGYoc3RyZWFtLCAiOiVzIiwgZWxlbWVudC5tYXhPY2N1cnMpOworICAgICAgZnByaW50ZihzdHJlYW0sICI7XG4gICAgc3RydWN0IF8lc1xuICAgIHtcbiIsIHQpOworICAgIH0KKyAgICBpZiAoIXdpdGhfdW5pb24gfHwgd3JhcF91bmlvbikKKyAgICB7IGZwcmludGYoc3RyZWFtLCBjaG9pY2Vmb3JtYXQsICJpbnQiLCByKTsKKyAgICAgIGlmIChlbGVtZW50Lm1pbk9jY3VycykKKyAgICAgICAgZnByaW50ZihzdHJlYW0sICIgJXMiLCBlbGVtZW50Lm1pbk9jY3Vycyk7CisgICAgICBmcHJpbnRmKHN0cmVhbSwgIjtcdC8vLzwgVW5pb24gJXMgc2VsZWN0b3I6IHNldCB0byBTT0FQX1VOSU9OXyVzXzxmaWVsZG5hbWU+JXNcbiIsIHQsIHQsIGVsZW1lbnQubWluT2NjdXJzICYmICFzdHJjbXAoZWxlbWVudC5taW5PY2N1cnMsICIwIikgPyAiIG9yIDAiIDogIiIpOworICAgICAgZnByaW50ZihzdHJlYW0sICIvLy8gVW5pb24gZm9yIHN1YnN0aXR1dGlvbkdyb3VwPVwiJXNcIlxuIiwgbmFtZSk7CisgICAgICBmcHJpbnRmKHN0cmVhbSwgIiAgICB1bmlvbiAlc1xuICAgIHtcbiIsIHQpOworICAgIH0KKyAgICB0bXBfdW5pb24gPSB3aXRoX3VuaW9uOworICAgIHdpdGhfdW5pb24gPSB0cnVlOworICB9CisgIGVsc2UKKyAgeyB0bXBfdW5pb24gPSBmYWtlX3VuaW9uOworICAgIGZha2VfdW5pb24gPSB0cnVlOworICB9CisgIGZvciAodmVjdG9yPHhzX19lbGVtZW50Kj46OmNvbnN0X2l0ZXJhdG9yIGkyID0gc3Vic3RpdHV0aW9ucy0+YmVnaW4oKTsgaTIgIT0gc3Vic3RpdHV0aW9ucy0+ZW5kKCk7ICsraTIpCisgICAgIGdlbihVUkksICooKmkyKSk7CisgIGlmICh1c2VfdW5pb24pCisgIHsgd2l0aF91bmlvbiA9IHRtcF91bmlvbjsKKyAgICBpZiAoIXdpdGhfdW5pb24gfHwgd3JhcF91bmlvbikKKyAgICAgIGZwcmludGYoc3RyZWFtLCBlbGVtZW50Zm9ybWF0LCAifSIsIHMpOworICAgIGlmIChlbGVtZW50Lm1heE9jY3VycyAmJiBzdHJjbXAoZWxlbWVudC5tYXhPY2N1cnMsICIxIikpCisgICAgeyBmcHJpbnRmKHN0cmVhbSwgIjtcbiIpOworICAgICAgZnByaW50ZihzdHJlYW0sIHBvaW50ZXJmb3JtYXQsICJ9Iiwgcyk7CisgICAgfQorICAgIGZwcmludGYoc3RyZWFtLCAiO1xuIik7CisgICAgaWYgKHdyYXBfdW5pb24pCisgICAgeyBmcHJpbnRmKHN0cmVhbSwgZWxlbWVudGZvcm1hdCwgIn0iLCBzKTsKKyAgICAgIGZwcmludGYoc3RyZWFtLCAiO1xuIik7CisgICAgfQorICB9CisgIGVsc2UKKyAgICBmYWtlX3VuaW9uID0gdG1wX3VuaW9uOworICBmcHJpbnRmKHN0cmVhbSwgIi8vICBFTkQgT0YgQ0hPSUNFXG4iKTsKK30KKwordm9pZCBUeXBlczo6ZG9jdW1lbnQoY29uc3QgeHNfX2Fubm90YXRpb24gKmFubm90YXRpb24pCit7IGlmIChhbm5vdGF0aW9uICYmIGFubm90YXRpb24tPmRvY3VtZW50YXRpb24pCisgIHsgZnByaW50ZihzdHJlYW0sICIvLy8gQGJyaWVmIik7CisgICAgZG9jdW1lbnRhdGlvbihhbm5vdGF0aW9uLT5kb2N1bWVudGF0aW9uKTsKKyAgfQorfQorCit2b2lkIFR5cGVzOjptb2RpZnkoY29uc3QgY2hhciAqbmFtZSkKK3sgLy8gVE9ETzogY29uc2lkZXIgc3VwcG9ydCByZW1vdmFsIG9mIGVsZW1lbnRzL2F0dHJpYnV0ZXMgd2l0aCBuc19fWCA9ICQtIFkKKyAgY29uc3QgY2hhciAqcyA9IG1vZHR5cGVtYXBbbmFtZV07CisgIGlmIChzKQorICB7IHdoaWxlICgqcykKKyAgICB7IGlmICgqcysrID09ICckJykKKyAgICAgICAgZnByaW50ZihzdHJlYW0sICIvLy8gTWVtYmVyIGRlY2xhcmVkIGluICVzXG4gICAiLCBtYXBmaWxlKTsKKyAgICAgIHMgPSBmb3JtYXQocyk7CisgICAgfQorICB9Cit9CisKK2NvbnN0IGNoYXIqIFR5cGVzOjpmb3JtYXQoY29uc3QgY2hhciAqdGV4dCkKK3sgY29uc3QgY2hhciAqcyA9IHRleHQ7CisgIGlmICghcykKKyAgICByZXR1cm4gTlVMTDsKKyAgd2hpbGUgKCpzICYmICpzICE9ICckJykKKyAgeyBpZiAoKnMgPT0gJ1xcJykKKyAgICB7IHN3aXRjaCAoc1sxXSkKKyAgICAgIHsgY2FzZSAnbic6IAorICAgICAgICAgIGZwdXRjKCdcbicsIHN0cmVhbSk7CisJICBicmVhazsKKyAgICAgICAgY2FzZSAndCc6IAorICAgICAgICAgIGZwdXRjKCdcdCcsIHN0cmVhbSk7CisJICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBmcHV0YyhzWzFdLCBzdHJlYW0pOworICAgICAgfQorICAgICAgcysrOworICAgIH0KKyAgICBlbHNlCisgICAgICBmcHV0Yygqcywgc3RyZWFtKTsKKyAgICBzKys7CisgIH0KKyAgZnB1dGMoJ1xuJywgc3RyZWFtKTsKKyAgcmV0dXJuIHM7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JVHlwZSBtYXAgZmlsZSBwYXJzaW5nCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIGNoYXIgKmdldGxpbmUoY2hhciAqcywgc2l6ZV90IG4sIEZJTEUgKmZkKQoreyBpbnQgYzsKKyAgY2hhciAqdCA9IHM7CisgIGlmIChuKQorICAgIG4tLTsKKyAgZm9yICg7OykKKyAgeyBjID0gZmdldGMoZmQpOworICAgIGlmIChjID09ICdccicpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoYyA9PSAnXFwnKQorICAgIHsgYyA9IGZnZXRjKGZkKTsKKyAgICAgIGlmIChjID09ICdccicpCisgICAgICAgIGMgPSBmZ2V0YyhmZCk7CisgICAgICBpZiAoYyA8ICcgJykKKyAgICAgICAgY29udGludWU7CisgICAgICBpZiAobikKKyAgICAgIHsgKnQrKyA9ICdcXCc7CisgICAgICAgIG4tLTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGMgPT0gJ1xuJyB8fCBjID09IEVPRikKKyAgICAgIGJyZWFrOworICAgIGlmIChuKQorICAgIHsgKnQrKyA9IGM7CisgICAgICBuLS07CisgICAgfQorICB9CisgICp0KysgPSAnXDAnOworICBpZiAoISpzICYmIGMgPT0gRU9GKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gczsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKm5vbmJsYW5rKGNvbnN0IGNoYXIgKnMpCit7IHdoaWxlICgqcyAmJiBpc3NwYWNlKCpzKSkKKyAgICBzKys7CisgIHJldHVybiBzOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZmlsbChjaGFyICp0LCBpbnQgbiwgY29uc3QgY2hhciAqcywgaW50IGUpCit7IGludCBpID0gbjsKKyAgcyA9IG5vbmJsYW5rKHMpOworICB3aGlsZSAoKnMgJiYgKnMgIT0gZSAmJiAtLWkpCisgICAgKnQrKyA9ICpzKys7CisgIHdoaWxlICgqcyAmJiAqcyAhPSBlKQorICAgIHMrKzsKKyAgaWYgKCpzKQorICAgIHMrKzsKKyAgaSA9IG4gLSBpOworICB3aGlsZSAoaXNzcGFjZSgqLS10KSAmJiBpLS0pCisgICAgOworICB0WzFdID0gJ1wwJzsKKyAgcmV0dXJuIHM7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JTWlzY2VsbGFuZW91cworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyBjb25zdCBjaGFyICp1dGY4KGNoYXIgKnQsIGNvbnN0IGNoYXIgKnMpCit7IHVuc2lnbmVkIGludCBjID0gMDsKKyAgaW50IGMxLCBjMiwgYzMsIGM0OworICBjID0gKHVuc2lnbmVkIGNoYXIpKnM7CisgIGlmIChjID49IDB4ODApCisgIHsgYzEgPSAqKytzOworICAgIGlmIChjMSA8IDB4ODApCisgICAgICBzLS07CisgICAgZWxzZQorICAgIHsgYzEgJj0gMHgzRjsKKyAgICAgIGlmIChjIDwgMHhFMCkKKyAgICAgICAgYyA9ICgoYyAmIDB4MUYpIDw8IDYpIHwgYzE7CisgICAgICBlbHNlCisgICAgICB7IGMyID0gKisrcyAmIDB4M0Y7CisgICAgICAgIGlmIChjIDwgMHhGMCkKKyAgICAgICAgICBjID0gKChjICYgMHgwRikgPDwgMTIpIHwgKGMxIDw8IDYpIHwgYzI7CisgICAgICAgIGVsc2UKKwl7IGMzID0gKisrcyAmIDB4M0Y7CisgICAgICAgICAgaWYgKGMgPCAweEY4KQorICAgICAgICAgICAgYyA9ICgoYyAmIDB4MDcpIDw8IDE4KSB8IChjMSA8PCAxMikgfCAoYzIgPDwgNikgfCBjMzsKKyAgICAgICAgICBlbHNlCisJICB7IGM0ID0gKisrcyAmIDB4M0Y7CisgICAgICAgICAgICBpZiAoYyA8IDB4RkMpCisgICAgICAgICAgICAgIGMgPSAoKGMgJiAweDAzKSA8PCAyNCkgfCAoYzEgPDwgMTgpIHwgKGMyIDw8IDEyKSB8IChjMyA8PCA2KSB8IGM0OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBjID0gKChjICYgMHgwMSkgPDwgMzApIHwgKGMxIDw8IDI0KSB8IChjMiA8PCAxOCkgfCAoYzMgPDwgMTIpIHwgKGM0IDw8IDYpIHwgKisrcyAmIDB4M0Y7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHNwcmludGYodCwgIl94JS40eCIsIGMpOworICByZXR1cm4gczsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmNzdHJpbmcoY29uc3QgY2hhciAqcykKK3sgc2l6ZV90IG47CisgIGNoYXIgKnQ7CisgIGNvbnN0IGNoYXIgKnI7CisgIGZvciAobiA9IDAsIHIgPSBzOyAqcjsgbisrLCByKyspCisgICAgaWYgKCpyID09ICciJyB8fCAqciA9PSAnXFwnKQorICAgICAgbisrOworICAgIGVsc2UgaWYgKCpyIDwgMzIpCisgICAgICBuICs9IDM7CisgIHIgPSB0ID0gKGNoYXIqKWVtYWxsb2MobiArIDEpOworICBmb3IgKDsgKnM7IHMrKykKKyAgeyBpZiAoKnMgPT0gJyInIHx8ICpzID09ICdcXCcpCisgICAgeyAqdCsrID0gJ1xcJzsKKyAgICAgICp0KysgPSAqczsKKyAgICB9CisgICAgZWxzZSBpZiAoKnMgPCAzMikKKyAgICB7IHNwcmludGYodCwgIlxcJTAzbyIsICh1bnNpZ25lZCBpbnQpKHVuc2lnbmVkIGNoYXIpKnMpOworICAgICAgdCArPSA0OworICAgIH0KKyAgICBlbHNlCisgICAgICAqdCsrID0gKnM7CisgIH0KKyAgKnQgPSAnXDAnOworICByZXR1cm4gcjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnhzdHJpbmcoY29uc3QgY2hhciAqcykKK3sgc2l6ZV90IG47CisgIGNoYXIgKnQ7CisgIGNvbnN0IGNoYXIgKnI7CisgIGZvciAobiA9IDAsIHIgPSBzOyAqcjsgbisrLCByKyspCisgIHsgaWYgKCpyIDwgMzIgfHwgKnIgPj0gMTI3KQorICAgICAgbiArPSA0OworICAgIGVsc2UgaWYgKCpyID09ICc8JyB8fCAqciA9PSAnPicpCisgICAgICBuICs9IDM7CisgICAgZWxzZSBpZiAoKnIgPT0gJyYnKQorICAgICAgbiArPSA0OworICAgIGVsc2UgaWYgKCpyID09ICciJykKKyAgICAgIG4gKz0gNTsKKyAgfQorICByID0gdCA9IChjaGFyKillbWFsbG9jKG4gKyAxKTsKKyAgZm9yICg7ICpzOyBzKyspCisgIHsgaWYgKCpzIDwgMzIgfHwgKnMgPj0gMTI3KQorICAgIHsgc3ByaW50Zih0LCAiJiMlLjJ4OyIsICh1bnNpZ25lZCBjaGFyKSpzKTsKKyAgICAgIHQgKz0gNTsKKyAgICB9CisgICAgZWxzZSBpZiAoKnMgPT0gJzwnKQorICAgIHsgc3RyY3B5KHQsICImbHQ7Iik7CisgICAgICB0ICs9IDQ7CisgICAgfQorICAgIGVsc2UgaWYgKCpzID09ICc+JykKKyAgICB7IHN0cmNweSh0LCAiJmd0OyIpOworICAgICAgdCArPSA0OworICAgIH0KKyAgICBlbHNlIGlmICgqcyA9PSAnJicpCisgICAgeyBzdHJjcHkodCwgIiZhbXA7Iik7CisgICAgICB0ICs9IDU7CisgICAgfQorICAgIGVsc2UgaWYgKCpzID09ICciJykKKyAgICB7IHN0cmNweSh0LCAiJnF1b3Q7Iik7CisgICAgICB0ICs9IDY7CisgICAgfQorICAgIGVsc2UKKyAgICAgICp0KysgPSAqczsKKyAgfQorICAqdCA9ICdcMCc7CisgIHJldHVybiByOworfQorCitzdGF0aWMgYm9vbCBpc19pbnRlZ2VyKGNvbnN0IGNoYXIgKnMpCit7IGlmICgoKnMgPT0gJy0nIHx8ICpzID09ICcrJykgJiYgc1sxXSkKKyAgICBzKys7CisgIHdoaWxlICgqcyAmJiBpc2RpZ2l0KCpzKSkKKyAgICBzKys7CisgIHJldHVybiAqcyA9PSAnXDAnOworfQorCitzdGF0aWMgdm9pZCBkb2N1bWVudGF0aW9uKGNvbnN0IGNoYXIgKnRleHQpCit7IGNvbnN0IGNoYXIgKnMgPSB0ZXh0OworICBib29sIGZsYWcgPSB0cnVlOworICBpZiAoIXMpCisgICAgcmV0dXJuOworICB3aGlsZSAoKnMpCisgIHsgc3dpdGNoICgqcykKKyAgICB7IGNhc2UgJ1xuJzoKKyAgICAgIGNhc2UgJ1x0JzoKKyAgICAgIGNhc2UgJyAnOgorCWZsYWcgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmICgqcyA+IDMyKQorCXsgaWYgKGZsYWcpCisJICB7IGZwdXRjKCcgJywgc3RyZWFtKTsKKwkgICAgZmxhZyA9IGZhbHNlOworICAgICAgICAgIH0KKwkgIGZwdXRjKCpzLCBzdHJlYW0pOworICAgICAgICB9CisgICAgfQorICAgIHMrKzsKKyAgfQorICBmcHV0YygnXG4nLCBzdHJlYW0pOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCUFsbG9jYXRpb24KKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkICplbWFsbG9jKHNpemVfdCBzaXplKQoreyB2b2lkICpwID0gbWFsbG9jKHNpemUpOworICBpZiAoIXApCisgIHsgZnByaW50ZihzdGRlcnIsICJFcnJvcjogTWFsbG9jIGZhaWxlZFxuIik7CisgICAgZXhpdCgxKTsKKyAgfQorICByZXR1cm4gcDsKK30KKworY2hhciAqZXN0cmR1cChjb25zdCBjaGFyICpzKQoreyBjaGFyICp0ID0gKGNoYXIqKWVtYWxsb2Moc3RybGVuKHMpICsgMSk7CisgIHN0cmNweSh0LCBzKTsKKyAgcmV0dXJuIHQ7Cit9CmRpZmYgLS1naXQgYS93c2RsL3R5cGVzLmggYi93c2RsL3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUwYjI0MgotLS0gL2Rldi9udWxsCisrKyBiL3dzZGwvdHlwZXMuaApAQCAtMCwwICsxLDExMyBAQAorLyoKKwordHlwZXMuaAorCitXU0RMIHBhcnNlciBhbmQgY29udmVydGVyIHRvIGdTT0FQIGhlYWRlciBmaWxlIGZvcm1hdAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ1NPQVAgWE1MIFdlYiBzZXJ2aWNlcyB0b29scworQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUsIFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR3byBsaWNlbnNlczoKK0dQTCBvciBHZW5pdmlhJ3MgbGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR1BMIGxpY2Vuc2UuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCitQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisKK0F1dGhvciBjb250YWN0IGluZm9ybWF0aW9uOgorZW5nZWxlbkBnZW5pdmlhLmNvbSAvIGVuZ2VsZW5AYWNtLm9yZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgY29tbWVyY2lhbCB1c2UgbGljZW5zZSBpcyBhdmFpbGFibGUgZnJvbSBHZW5pdmlhLCBJbmMuLCBjb250YWN0QGdlbml2aWEuY29tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqLworCisjaWZuZGVmIFRZUEVTX0gKKyNkZWZpbmUgVFlQRVNfSAorCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKyNpbmNsdWRlICJ3c2RsSC5oIgorCitlbnVtIFR5cGUgeyBOT05FLCBDTEFTUywgRU5VTSwgU1RSVUNULCBUWVBFREVGIH07CisKK2VudW0gTG9va3VwIHsgTk9MT09LVVAsIExPT0tVUCB9OworCitjbGFzcyBUeXBlcworeyBwdWJsaWM6CisgICAgU2V0T2ZTdHJpbmcJCWtuYW1lczsJLy8ga2V5d29yZHMsIHJlc2VydmVkIHdvcmRzLCBjbGFzcyBuYW1lcywgYW5kIHR5cGVkZWZzCisgICAgTWFwT2ZTdHJpbmdUb1N0cmluZyBtb2R0eXBlbWFwOworICAgIE1hcE9mU3RyaW5nVG9TdHJpbmcgZGVmdHlwZW1hcDsKKyAgICBNYXBPZlN0cmluZ1RvU3RyaW5nIHVzZXR5cGVtYXA7CisgICAgTWFwT2ZTdHJpbmdUb1N0cmluZyBwdHJ0eXBlbWFwOworICAgIE1hcE9mUGFpclRvU3RyaW5nCXFuYW1lczsJLy8gKFVSSSxuYW1lKSAtPiBuYW1lCisgICAgTWFwT2ZTdHJpbmdUb1N0cmluZwl1cmlzOwkvLyBVUkkgLT4gcHJlZml4CisgICAgTWFwT2ZTdHJpbmdUb051bQlzeW1zOwkvLyBwcmVmaXggLT4gY291bnQgKG5zMSwgbnMyLCAuLi4pCisgICAgU2V0T2ZTdHJpbmcJCXJuYW1lczsJLy8gcmVzZXJ2ZWQgc3ltYm9saWMgbmFtZXMgdG8gYXZvaWQgY2xhc2hlcworICAgIFNldE9mU3RyaW5nCQlvbmFtZXM7CS8vIHNlcnZpY2Ugb3BlcmF0b3IgbmFtZXMKKyAgICBNYXBPZlBhaXJUb1N0cmluZwllbmFtZXM7CS8vIGVudW0gc3ltYm9saWMgbmFtZXMKKyAgICBWZWN0b3JPZlN0cmluZwlzY29wZTsJLy8gZGUtYW5vbnltaXplciBzdGFjaworICAgIGludCBzbnVtOyAvLyBzdHJ1Y3QgbmFtZSBpbmRleCwgVE9ETzogY29uc2lkZXIgbWFwIG9mIFVSSSB0byBjb3VudCBwZXIgVVJJCisgICAgaW50IHVudW07IC8vIHVuaW9uIG5hbWUgaW5kZXgsIFRPRE86IGNvbnNpZGVyIG1hcCBvZiBVUkkgdG8gY291bnQgcGVyIFVSSQorICAgIGludCBnbnVtOyAvLyBlbnVtIG5hbWUgaW5kZXgsIFRPRE86IGNvbnNpZGVyIG1hcCBvZiBVUkkgdG8gY291bnQgcGVyIFVSSQorICAgIGJvb2wgd2l0aF91bmlvbjsKKyAgICBib29sIGZha2VfdW5pb247CisgICAgVHlwZXMoKTsKKyAgICB2b2lkIGluaXQoKTsKKyAgICBpbnQgcmVhZChjb25zdCBjaGFyICpmaWxlKTsKKyAgcHJpdmF0ZToKKyAgICBjb25zdCBjaGFyICpmbmFtZShjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKlVSSSwgY29uc3QgY2hhciAqcW5hbWUsIFNldE9mU3RyaW5nICpyZXNlcnZlZCwgZW51bSBMb29rdXAgbG9va3VwKTsKKyAgcHVibGljOgorICAgIGNvbnN0IGNoYXIgKmFuYW1lKGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqVVJJLCBjb25zdCBjaGFyICpxbmFtZSk7CisgICAgY29uc3QgY2hhciAqY25hbWUoY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpVUkksIGNvbnN0IGNoYXIgKnFuYW1lKTsKKyAgICBjb25zdCBjaGFyICp0bmFtZShjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKlVSSSwgY29uc3QgY2hhciAqcW5hbWUpOworICAgIGNvbnN0IGNoYXIgKnRuYW1lcHRyKGJvb2wsIGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqVVJJLCBjb25zdCBjaGFyICpxbmFtZSk7CisgICAgY29uc3QgY2hhciAqcG5hbWUoYm9vbCBmbGFnLCBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKlVSSSwgY29uc3QgY2hhciAqcW5hbWUpOworICAgIGNvbnN0IGNoYXIgKm9uYW1lKGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqVVJJLCBjb25zdCBjaGFyICpxbmFtZSk7CisgICAgY29uc3QgY2hhciAqZW5hbWUoY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqdmFsdWUpOworICAgIGNvbnN0IGNoYXIgKnNuYW1lKGNvbnN0IGNoYXIgKlVSSSwgY29uc3QgY2hhciAqbmFtZSk7CisgICAgY29uc3QgY2hhciAqZ25hbWUoY29uc3QgY2hhciAqVVJJLCBjb25zdCBjaGFyICpuYW1lKTsKKyAgICBjb25zdCBjaGFyICp1bmFtZShjb25zdCBjaGFyICpVUkkpOworICAgIGNvbnN0IGNoYXIgKm5zcHJlZml4KGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqVVJJKTsKKyAgICBjb25zdCBjaGFyICpkZWZ0bmFtZShlbnVtIFR5cGUgdHlwZSwgY29uc3QgY2hhciAqcG9pbnRlciwgYm9vbCBpc19wb2ludGVyLCBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKlVSSSwgY29uc3QgY2hhciAqcW5hbWUpOworICAgIGJvb2wgaXNfZGVmaW5lZChjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKlVSSSwgY29uc3QgY2hhciAqcW5hbWUpOworICAgIGJvb2wgaXNfbmlsbGFibGUoY29uc3QgeHNfX2VsZW1lbnQmIGVsZW1lbnQpOworICAgIGJvb2wgaXNfYmFzZXR5cGUoY29uc3QgY2hhciAqdHlwZSk7CisgICAgdm9pZCBkZWZpbmUoY29uc3QgY2hhciAqVVJJLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB4c19fY29tcGxleFR5cGUmKTsKKyAgICB2b2lkIGdlbihjb25zdCBjaGFyICpVUkksIGNvbnN0IHZlY3Rvcjx4c19fYXR0cmlidXRlPiYpOworICAgIHZvaWQgZ2VuKGNvbnN0IGNoYXIgKlVSSSwgY29uc3QgdmVjdG9yPHhzX19hdHRyaWJ1dGVHcm91cD4mKTsKKyAgICB2b2lkIGdlbihjb25zdCBjaGFyICpVUkksIGNvbnN0IHZlY3Rvcjx4c19fYWxsPiYpOworICAgIHZvaWQgZ2VuKGNvbnN0IGNoYXIgKlVSSSwgY29uc3QgdmVjdG9yPHhzX19zZXF1ZW5jZT4mKTsKKyAgICB2b2lkIGdlbihjb25zdCBjaGFyICpVUkksIGNvbnN0IHZlY3Rvcjx4c19fc2VxdWVuY2UqPiYpOworICAgIHZvaWQgZ2VuKGNvbnN0IGNoYXIgKlVSSSwgY29uc3QgdmVjdG9yPHhzX19lbGVtZW50PiYpOworICAgIHZvaWQgZ2VuKGNvbnN0IGNoYXIgKlVSSSwgY29uc3QgdmVjdG9yPHhzX19ncm91cD4mKTsKKyAgICB2b2lkIGdlbihjb25zdCBjaGFyICpVUkksIGNvbnN0IHZlY3Rvcjx4c19fY2hvaWNlPiYpOworICAgIHZvaWQgZ2VuKGNvbnN0IGNoYXIgKlVSSSwgY29uc3QgdmVjdG9yPHhzX19hbnk+Jik7CisgICAgdm9pZCBnZW4oY29uc3QgY2hhciAqVVJJLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB4c19fc2ltcGxlVHlwZSYsIGJvb2wgYW5vbnltb3VzKTsKKyAgICB2b2lkIGdlbihjb25zdCBjaGFyICpVUkksIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHhzX19jb21wbGV4VHlwZSYsIGJvb2wgYW5vbnltb3VzKTsKKyAgICB2b2lkIGdlbihjb25zdCBjaGFyICpVUkksIGNvbnN0IHhzX19hdHRyaWJ1dGUmKTsKKyAgICB2b2lkIGdlbihjb25zdCBjaGFyICpVUkksIGNvbnN0IHhzX19hbGwmKTsKKyAgICB2b2lkIGdlbihjb25zdCBjaGFyICpVUkksIGNvbnN0IHhzX19zZXF1ZW5jZSYpOworICAgIHZvaWQgZ2VuKGNvbnN0IGNoYXIgKlVSSSwgY29uc3QgeHNfX2VsZW1lbnQmKTsKKyAgICB2b2lkIGdlbihjb25zdCBjaGFyICpVUkksIGNvbnN0IHhzX19ncm91cCYpOworICAgIHZvaWQgZ2VuKGNvbnN0IGNoYXIgKlVSSSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgeHNfX2Nob2ljZSYpOworICAgIHZvaWQgZ2VuKGNvbnN0IGNoYXIgKlVSSSwgY29uc3QgeHNfX2FueSYpOworICAgIHZvaWQgZ2VuKGNvbnN0IGNoYXIgKlVSSSwgY29uc3QgeHNfX2FueUF0dHJpYnV0ZSYpOworICAgIHZvaWQgZ2VuX3NvYXBfYXJyYXkoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdCwgY29uc3QgY2hhciAqaXRlbSwgY2hhciAqdHlwZSk7CisgICAgdm9pZCBnZW5fc3Vic3RpdHV0aW9ucyhjb25zdCBjaGFyICpVUkksIGNvbnN0IHhzX19lbGVtZW50ICZlbGVtZW50KTsKKyAgICB2b2lkIGRvY3VtZW50KGNvbnN0IHhzX19hbm5vdGF0aW9uKik7CisgICAgdm9pZCBtb2RpZnkoY29uc3QgY2hhciAqbmFtZSk7CisgICAgY29uc3QgY2hhciAqZm9ybWF0KGNvbnN0IGNoYXIgKnRleHQpOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS93c2RsL3dzZGwuY3BwIGIvd3NkbC93c2RsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODBlMTU3Ci0tLSAvZGV2L251bGwKKysrIGIvd3NkbC93c2RsLmNwcApAQCAtMCwwICsxLDExMzQgQEAKKy8qCisKK3dzZGwuY3BwCisKK1dTREwgMS4xIGJpbmRpbmcgc2NoZW1hIGltcGxlbWVudGF0aW9uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzOgorR1BMIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyovCisKKyNpbmNsdWRlICJ3c2RsSC5oIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitjb25zdCBjaGFyICpxbmFtZV90b2tlbihjb25zdCBjaGFyICpRTmFtZSwgY29uc3QgY2hhciAqVVJJKQoreyBpZiAoUU5hbWUgJiYgVVJJICYmICpRTmFtZSA9PSAnIicpIC8vIFFOYW1lcyBhcmUgc3RvcmVkIGluIHRoZSBmb3JtYXQgIlVSSSI6bmFtZSwgdW5sZXNzIHRoZSBVUkkgaXMgaW4gdGhlIG5zbWFwCisgIHsgaW50IG4gPSBzdHJsZW4oVVJJKTsKKyAgICBpZiAoIXN0cm5jbXAoUU5hbWUgKyAxLCBVUkksIG4pICYmIFFOYW1lW24gKyAxXSA9PSAnIicpCisgICAgICByZXR1cm4gUU5hbWUgKyBuICsgMzsKKyAgfQorICBlbHNlIGlmIChRTmFtZSAmJiAoIVVSSSB8fCAhKlVSSSkgJiYgKlFOYW1lICE9ICciJyAmJiAhc3RyY2hyKFFOYW1lLCAnOicpKSAvLyBFbXB0eSBuYW1lc3BhY2UKKyAgICByZXR1cm4gUU5hbWU7CisgIHJldHVybiBOVUxMOworfQorCitpbnQgaXNfYnVpbHRpbl9xbmFtZShjb25zdCBjaGFyICpRTmFtZSkKK3sgaWYgKGlmbGFnKQorICAgIHJldHVybiAxOworICBpZiAoUU5hbWUpCisgIHsgaWYgKCpRTmFtZSAhPSAnIicpCisgICAgICByZXR1cm4gMTsJLy8gaWYgdGhlIFFOYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggYSAiLCBpdCBtdXN0IGJlIGluIHRoZSBuc21hcAorICAgIGNvbnN0IGNoYXIgKnMgPSBzdHJjaHIoUU5hbWUgKyAxLCAnIicpOworICAgIGlmIChzKQorICAgIHsgc2l6ZV90IG4gPSBzIC0gUU5hbWUgLSAxOworICAgICAgZm9yIChTZXRPZlN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaSA9IGV4dHVyaXMuYmVnaW4oKTsgaSAhPSBleHR1cmlzLmVuZCgpOyArK2kpCisgICAgICAgIGlmIChzdHJsZW4oKmkpID09IG4gJiYgIXN0cm5jbXAoUU5hbWUgKyAxLCAqaSwgbikpCisgICAgICAgICAgcmV0dXJuIDE7IC8vIFFOYW1lIGlzIGluIGV4dHVyaXMKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8Jd3NkbAorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2ludCB3YXJuX2lnbm9yZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKK2ludCBzaG93X2lnbm9yZShzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqKTsKKword3NkbF9fZGVmaW5pdGlvbnM6OndzZGxfX2RlZmluaXRpb25zKCkKK3sgc29hcCA9IHNvYXBfbmV3MShTT0FQX1hNTF9UUkVFIHwgU09BUF9DX1VURlNUUklORyk7CisjaWZkZWYgV0lUSF9PUEVOU1NMCisgIHNvYXBfc3NsX2NsaWVudF9jb250ZXh0KHNvYXAsIFNPQVBfU1NMX05PX0FVVEhFTlRJQ0FUSU9OLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyNlbmRpZgorI2lmZGVmIFdJVEhfTk9OQU1FU1BBQ0VTCisgIHNvYXBfc2V0X25hbWVzcGFjZXMoc29hcCwgbmFtZXNwYWNlcyk7CisjZW5kaWYKKyAgc29hcF9kZWZhdWx0KHNvYXApOworICBpZiAodmZsYWcpCisgICAgc29hcC0+Zmlnbm9yZSA9IHNob3dfaWdub3JlOworICBlbHNlCisgICAgc29hcC0+Zmlnbm9yZSA9IHdhcm5faWdub3JlOworICBzb2FwLT5lbmNvZGluZ1N0eWxlID0gTlVMTDsKKyAgc29hcC0+cHJveHlfaG9zdCA9IHByb3h5X2hvc3Q7CisgIHNvYXAtPnByb3h5X3BvcnQgPSBwcm94eV9wb3J0OworICBuYW1lID0gTlVMTDsKKyAgdGFyZ2V0TmFtZXNwYWNlID0gIiI7CisgIGRvY3VtZW50YXRpb24gPSBOVUxMOworICB0eXBlcyA9IE5VTEw7CisgIHVwZGF0ZWQgPSBmYWxzZTsKKyAgcmVkaXJzID0gMDsKK30KKword3NkbF9fZGVmaW5pdGlvbnM6OndzZGxfX2RlZmluaXRpb25zKHN0cnVjdCBzb2FwICpjb3B5LCBjb25zdCBjaGFyICpjd2QsIGNvbnN0IGNoYXIgKmxvYykKK3sgc29hcCA9IHNvYXBfY29weShjb3B5KTsKKyAgc29hcC0+c29ja2V0ID0gU09BUF9JTlZBTElEX1NPQ0tFVDsKKyAgc29hcC0+cmVjdmZkID0gMDsKKyAgc29hcC0+c2VuZGZkID0gMTsKKyAgc3RyY3B5KHNvYXAtPmhvc3QsIGNvcHktPmhvc3QpOworICBzb2FwX2RlZmF1bHQoc29hcCk7CisgIHNvYXAtPmZpZ25vcmUgPSB3YXJuX2lnbm9yZTsKKyAgc29hcC0+ZW5jb2RpbmdTdHlsZSA9IE5VTEw7CisgIHVwZGF0ZWQgPSBmYWxzZTsKKyAgcmVkaXJzID0gMDsKKyAgcmVhZChjd2QsIGxvYyk7Cit9CisKK3dzZGxfX2RlZmluaXRpb25zOjp+d3NkbF9fZGVmaW5pdGlvbnMoKQoreyBzb2FwX2Rlc3Ryb3koc29hcCk7CisgIHNvYXBfZW5kKHNvYXApOworICBzb2FwX2RvbmUoc29hcCk7CisgIGZyZWUoc29hcCk7Cit9CisKK2ludCB3c2RsX19kZWZpbml0aW9uczo6Z2V0KHN0cnVjdCBzb2FwICpzb2FwKQoreyByZXR1cm4gcHJlcHJvY2VzcygpOworfQorCitpbnQgd3NkbF9fZGVmaW5pdGlvbnM6OnJlYWQoaW50IG51bSwgY2hhciAqKmxvYykKK3sgaWYgKG51bSA8PSAwKQorICAgIHJldHVybiByZWFkKChjb25zdCBjaGFyKilOVUxMLCAoY29uc3QgY2hhciopTlVMTCk7CisgIGlmIChudW0gPT0gMSkKKyAgICByZXR1cm4gcmVhZCgoY29uc3QgY2hhciopTlVMTCwgbG9jWzBdKTsKKyAgd3NkbF9faW1wb3J0IGltOworICBpbS5uYW1lc3BhY2VfID0gTlVMTDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykKKyAgeyBpbS5sb2NhdGlvbiA9IGxvY1tpXTsKKyAgICBpbXBvcnQucHVzaF9iYWNrKGltKTsKKyAgfQorICByZXR1cm4gcHJlcHJvY2VzcygpOworfQorCitpbnQgd3NkbF9fZGVmaW5pdGlvbnM6OnJlYWQoY29uc3QgY2hhciAqY3dkLCBjb25zdCBjaGFyICpsb2MpCit7IGlmICh2ZmxhZykKKyAgICBmcHJpbnRmKHN0ZGVyciwgIk9wZW5pbmcgV1NETC9YU0QgJyVzJyBmcm9tICclcydcbiIsIGxvYz9sb2M6IiIsIGN3ZD9jd2Q6IiIpOworICBpZiAobG9jKQorICB7IGlmICghc3RybmNtcChsb2MsICJodHRwOi8vIiwgNykgfHwgIXN0cm5jbXAobG9jLCAiaHR0cHM6Ly8iLCA4KSkKKyAgICB7IGZwcmludGYoc3RkZXJyLCAiQ29ubmVjdGluZyB0byAnJXMnIHRvIHJldHJpZXZlIFdTREwvWFNELi4uICIsIGxvYyk7CisgICAgICBsb2NhdGlvbiA9IHNvYXBfc3RyZHVwKHNvYXAsIGxvYyk7CisgICAgICBpZiAoc29hcF9jb25uZWN0X2NvbW1hbmQoc29hcCwgU09BUF9HRVQsIGxvY2F0aW9uLCBOVUxMKSkKKyAgICAgIHsgZnByaW50ZihzdGRlcnIsICJjb25uZWN0aW9uIGZhaWxlZFxuIik7CisgICAgICAgIHNvYXBfcHJpbnRfZmF1bHQoc29hcCwgc3RkZXJyKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICAgIH0KKyAgICAgIGZwcmludGYoc3RkZXJyLCAiY29ubmVjdGVkLCByZWNlaXZpbmcuLi5cbiIpOworICAgIH0KKyAgICBlbHNlIGlmIChjd2QgJiYgKCFzdHJuY21wKGN3ZCwgImh0dHA6Ly8iLCA3KSB8fCAhc3RybmNtcChjd2QsICJodHRwczovLyIsIDgpKSkKKyAgICB7IGNoYXIgKnM7CisgICAgICBsb2NhdGlvbiA9IChjaGFyKilzb2FwX21hbGxvYyhzb2FwLCBzdHJsZW4oY3dkKSArIHN0cmxlbihsb2MpICsgMik7CisgICAgICBzdHJjcHkobG9jYXRpb24sIGN3ZCk7CisgICAgICBzID0gc3RycmNocihsb2NhdGlvbiwgJy8nKTsKKyAgICAgIGlmIChzKQorICAgICAgICAqcyA9ICdcMCc7CisgICAgICBzdHJjYXQobG9jYXRpb24sICIvIik7CisgICAgICBzdHJjYXQobG9jYXRpb24sIGxvYyk7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvbm5lY3RpbmcgdG8gJyVzJyB0byByZXRyaWV2ZSByZWxhdGl2ZSAnJXMnIFdTREwvWFNELi4uICIsIGxvY2F0aW9uLCBsb2MpOworICAgICAgaWYgKHNvYXBfY29ubmVjdF9jb21tYW5kKHNvYXAsIFNPQVBfR0VULCBsb2NhdGlvbiwgTlVMTCkpCisgICAgICB7IGZwcmludGYoc3RkZXJyLCAiY29ubmVjdGlvbiBmYWlsZWRcbiIpOworICAgICAgICBleGl0KDEpOworICAgICAgfQorICAgICAgZnByaW50ZihzdGRlcnIsICJjb25uZWN0ZWQsIHJlY2VpdmluZy4uLlxuIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7IHNvYXAtPnJlY3ZmZCA9IG9wZW4obG9jLCBPX1JET05MWSwgMCk7CisgICAgICBpZiAoc29hcC0+cmVjdmZkIDwgMCkKKyAgICAgIHsgaWYgKGN3ZCkKKyAgICAgICAgeyBjaGFyICpzOworICAgICAgICAgIGxvY2F0aW9uID0gKGNoYXIqKXNvYXBfbWFsbG9jKHNvYXAsIHN0cmxlbihjd2QpICsgc3RybGVuKGxvYykgKyAyKTsKKyAgICAgICAgICBzdHJjcHkobG9jYXRpb24sIGN3ZCk7CisgICAgICAgICAgcyA9IHN0cnJjaHIobG9jYXRpb24sICcvJyk7CisgICAgICAgICAgaWYgKHMpCisgICAgICAgICAgICAqcyA9ICdcMCc7CisgICAgICAgICAgc3RyY2F0KGxvY2F0aW9uLCAiLyIpOworICAgICAgICAgIHN0cmNhdChsb2NhdGlvbiwgbG9jKTsKKyAgICAgICAgICBzb2FwLT5yZWN2ZmQgPSBvcGVuKGxvY2F0aW9uLCBPX1JET05MWSwgMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvYXAtPnJlY3ZmZCA8IDAgJiYgaW1wb3J0X3BhdGgpCisgICAgICAgIHsgbG9jYXRpb24gPSAoY2hhciopc29hcF9tYWxsb2Moc29hcCwgc3RybGVuKGltcG9ydF9wYXRoKSArIHN0cmxlbihsb2MpICsgMik7CisgICAgICAgICAgc3RyY3B5KGxvY2F0aW9uLCBpbXBvcnRfcGF0aCk7CisgICAgICAgICAgc3RyY2F0KGxvY2F0aW9uLCAiLyIpOworICAgICAgICAgIHN0cmNhdChsb2NhdGlvbiwgbG9jKTsKKyAgICAgICAgICBzb2FwLT5yZWN2ZmQgPSBvcGVuKGxvY2F0aW9uLCBPX1JET05MWSwgMCk7CisJfQorICAgICAgICBpZiAoc29hcC0+cmVjdmZkIDwgMCkKKwl7IGZwcmludGYoc3RkZXJyLCAiQ2Fubm90IG9wZW4gJyVzJ1xuIiwgbG9jKTsKKyAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIGxvY2F0aW9uID0gc29hcF9zdHJkdXAoc29hcCwgbG9jKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiUmVhZGluZyBmaWxlICclcydcbiIsIGxvY2F0aW9uKTsKKyAgICB9CisgIH0KKyAgaWYgKCFzb2FwX2JlZ2luX3JlY3Yoc29hcCkpCisgICAgdGhpcy0+c29hcF9pbihzb2FwLCAid3NkbDpkZWZpbml0aW9ucyIsIE5VTEwpOworICBpZiAoc29hcC0+ZXJyb3IpCisgIHsgLy8gZGVhbCB3aXRoIHNsb3BweSBXU0RMcyB0aGF0IGltcG9ydCBzY2hlbWFzIGF0IHRoZSB0b3AgbGV2ZWwgcmF0aGVyIHRoYW4gaW1wb3J0aW5nIHRoZW0gaW4gPHR5cGVzPgorICAgIGlmIChzb2FwLT5lcnJvciA9PSBTT0FQX1RBR19NSVNNQVRDSCAmJiBzb2FwLT5sZXZlbCA9PSAwKQorICAgIHsgc29hcF9yZXRyeShzb2FwKTsKKyAgICAgIHhzX19zY2hlbWEgKnNjaGVtYSA9IG5ldyB4c19fc2NoZW1hKHNvYXApOworICAgICAgc2NoZW1hLT5zb2FwX2luKHNvYXAsICJ4czpzY2hlbWEiLCBOVUxMKTsKKyAgICAgIGlmIChzb2FwLT5lcnJvcikKKyAgICAgIHsgZnByaW50ZihzdGRlcnIsICJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBwYXJzaW5nIFdTREwgb3IgWFNEIGZyb20gJyVzJ1xuIiwgbG9jP2xvYzoiIik7CisgICAgICAgIHNvYXBfcHJpbnRfZmF1bHQoc29hcCwgc3RkZXJyKTsKKyAgICAgICAgc29hcF9wcmludF9mYXVsdF9sb2NhdGlvbihzb2FwLCBzdGRlcnIpOworICAgICAgICBleGl0KDEpOworICAgICAgfQorICAgICAgbmFtZSA9IE5VTEw7CisgICAgICB0YXJnZXROYW1lc3BhY2UgPSBzY2hlbWEtPnRhcmdldE5hbWVzcGFjZTsKKyAgICAgIGlmICh2ZmxhZykKKyAgICAgICAgY2VyciA8PCAiRm91bmQgc2NoZW1hICIgPDwgKHRhcmdldE5hbWVzcGFjZT90YXJnZXROYW1lc3BhY2U6IiIpIDw8ICIgd2hlbiBleHBlY3RpbmcgV1NETCIgPDwgZW5kbDsKKyAgICAgIHR5cGVzID0gbmV3IHdzZGxfX3R5cGVzKCk7CisgICAgICB0eXBlcy0+ZG9jdW1lbnRhdGlvbiA9IE5VTEw7CisgICAgICB0eXBlcy0+eHNfX3NjaGVtYV8ucHVzaF9iYWNrKHNjaGVtYSk7CisgICAgfQorICAgIGVsc2UgaWYgKChzb2FwLT5lcnJvciA+PSAzMDEgJiYgc29hcC0+ZXJyb3IgPD0gMzAzKSB8fCBzb2FwLT5lcnJvciA9PSAzMDcpIC8vIEhUVFAgcmVkaXJlY3QsIHNvY2tldCB3YXMgY2xvc2VkCisgICAgeyBpbnQgciA9IFNPQVBfRVJSOworICAgICAgZnByaW50ZihzdGRlcnIsICJSZWRpcmVjdGVkIHRvICclcydcbiIsIHNvYXAtPmVuZHBvaW50KTsKKyAgICAgIGlmIChyZWRpcnMrKyA8IDEwKQorICAgICAgICByID0gcmVhZChjd2QsIHNvYXAtPmVuZHBvaW50KTsKKyAgICAgIGVsc2UKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJNYXggcmVkaXJlY3RzIGV4Y2VlZGVkXG4iKTsKKyAgICAgIHJlZGlycy0tOworICAgICAgcmV0dXJuIHI7CisgICAgfQorICAgIGVsc2UKKyAgICB7IGZwcmludGYoc3RkZXJyLCAiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcGFyc2luZyBXU0RMIGZyb20gJyVzJ1xuIiwgbG9jP2xvYzoiIik7CisgICAgICBzb2FwX3ByaW50X2ZhdWx0KHNvYXAsIHN0ZGVycik7CisgICAgICBzb2FwX3ByaW50X2ZhdWx0X2xvY2F0aW9uKHNvYXAsIHN0ZGVycik7CisgICAgICBleGl0KDEpOworICAgIH0KKyAgfQorICBpZiAodmZsYWcpCisgICAgZnByaW50ZihzdGRlcnIsICJEb25lIHJlYWRpbmcgJyVzJ1xuIiwgbG9jKTsKKyAgc29hcF9lbmRfcmVjdihzb2FwKTsKKyAgaWYgKHNvYXAtPnJlY3ZmZCA+PSAwKQorICB7IGNsb3NlKHNvYXAtPnJlY3ZmZCk7CisgICAgc29hcC0+cmVjdmZkID0gLTE7CisgIH0KKyAgZWxzZQorICAgIHNvYXBfY2xvc2Vzb2NrKHNvYXApOworICByZXR1cm4gU09BUF9PSzsKK30KKworaW50IHdzZGxfX2RlZmluaXRpb25zOjpwcmVwcm9jZXNzKCkKK3sgLy8gcHJvY2VzcyBpbXBvcnQKKyAgZm9yICh2ZWN0b3I8d3NkbF9faW1wb3J0Pjo6aXRlcmF0b3IgaW0xID0gaW1wb3J0LmJlZ2luKCk7IGltMSAhPSBpbXBvcnQuZW5kKCk7ICsraW0xKQorICAgICgqaW0xKS5wcmVwcm9jZXNzKCp0aGlzKTsKKyAgLy8gbWVyZ2UgbmVzdGVkIGltcG9ydGVkIFdTRExzIGludG8gc2luZ2xlIGltcG9ydCBsaXN0CithZ2FpbjoKKyAgZm9yICh2ZWN0b3I8d3NkbF9faW1wb3J0Pjo6aXRlcmF0b3IgaW0yID0gaW1wb3J0LmJlZ2luKCk7IGltMiAhPSBpbXBvcnQuZW5kKCk7ICsraW0yKQorICB7IGlmICgoKmltMikuZGVmaW5pdGlvbnNQdHIoKSkKKyAgICB7IGZvciAodmVjdG9yPHdzZGxfX2ltcG9ydD46Oml0ZXJhdG9yIGkgPSAoKmltMikuZGVmaW5pdGlvbnNQdHIoKS0+aW1wb3J0LmJlZ2luKCk7IGkgIT0gKCppbTIpLmRlZmluaXRpb25zUHRyKCktPmltcG9ydC5lbmQoKTsgKytpKQorICAgICAgeyBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgIGZvciAodmVjdG9yPHdzZGxfX2ltcG9ydD46Oml0ZXJhdG9yIGogPSBpbXBvcnQuYmVnaW4oKTsgaiAhPSBpbXBvcnQuZW5kKCk7ICsraikKKyAgICAgICAgeyBpZiAoKCgqaSkuZGVmaW5pdGlvbnNQdHIoKSA9PSAoKmopLmRlZmluaXRpb25zUHRyKCkpCisJICAgfHwgKCgqaSkubG9jYXRpb24gJiYgKCpqKS5sb2NhdGlvbiAmJiAhc3RyY21wKCgqaSkubG9jYXRpb24sICgqaikubG9jYXRpb24pKSkKKyAgICAgICAgICB7IGZvdW5kID0gdHJ1ZTsKKwkgICAgYnJlYWs7CisJICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmb3VuZCkKKyAgICAgICAgeyBpZiAodmZsYWcpCisJICAgIGNlcnIgPDwgIkFkZGluZyBpbXBvcnRlZCBXU0RMICIgPDwgKCgqaSkubG9jYXRpb24/KCppKS5sb2NhdGlvbjoiIikgPDwgIiB0byAiIDw8IChuYW1lP25hbWU6IiIpIDw8ICIgbmFtZXNwYWNlICIgPDwgKHRhcmdldE5hbWVzcGFjZT90YXJnZXROYW1lc3BhY2U6IiIpIDw8IGVuZGw7CisJICBpbXBvcnQucHVzaF9iYWNrKCppKTsKKyAgICAgICAgICBnb3RvIGFnYWluOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIC8vIG1lcmdlIDx0eXBlcz4KKyAgZm9yICh2ZWN0b3I8d3NkbF9faW1wb3J0Pjo6aXRlcmF0b3IgaW0zID0gaW1wb3J0LmJlZ2luKCk7IGltMyAhPSBpbXBvcnQuZW5kKCk7ICsraW0zKQorICB7IGlmICgoKmltMykuZGVmaW5pdGlvbnNQdHIoKSAmJiAoKmltMykuZGVmaW5pdGlvbnNQdHIoKS0+dHlwZXMpCisgICAgeyBpZiAoIXR5cGVzKQorICAgICAgeyB0eXBlcyA9IHNvYXBfbmV3X3dzZGxfX3R5cGVzKHNvYXAsIC0xKTsKKyAgICAgICAgdHlwZXMtPnNvYXBfZGVmYXVsdChzb2FwKTsKKyAgICAgIH0KKyAgICAgIC8vIG1lcmdlIDx0eXBlcz4sIGNoZWNrIGZvciBkdXBsaWNhdGVzLCBhZGQgbmFtZXNwYWNlcyBmb3Igc2xvcHB5IGltcG9ydHMKKyAgICAgIGZvciAodmVjdG9yPHhzX19zY2hlbWEqPjo6Y29uc3RfaXRlcmF0b3IgaSA9ICgqaW0zKS5kZWZpbml0aW9uc1B0cigpLT50eXBlcy0+eHNfX3NjaGVtYV8uYmVnaW4oKTsgaSAhPSAoKmltMykuZGVmaW5pdGlvbnNQdHIoKS0+dHlwZXMtPnhzX19zY2hlbWFfLmVuZCgpOyArK2kpCisgICAgICB7IGJvb2wgZm91bmQgPSBmYWxzZTsKKwlpZiAoISgqaSktPnRhcmdldE5hbWVzcGFjZSkKKyAgICAgICAgICBjZXJyIDw8ICJXYXJuaW5nOiBTY2hlbWEgd2l0aG91dCBuYW1lc3BhY2UsIGFzc2lnbmluZyAiIDw8ICh0YXJnZXROYW1lc3BhY2U/dGFyZ2V0TmFtZXNwYWNlOiIiKSA8PCBlbmRsOworCWlmICghKCppKS0+dGFyZ2V0TmFtZXNwYWNlKQorCSAgKCppKS0+dGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOworCWVsc2UKKwl7IGZvciAodmVjdG9yPHhzX19zY2hlbWEqPjo6Y29uc3RfaXRlcmF0b3IgaiA9IHR5cGVzLT54c19fc2NoZW1hXy5iZWdpbigpOyBqICE9IHR5cGVzLT54c19fc2NoZW1hXy5lbmQoKTsgKytqKQorCSAgeyBpZiAoKCpqKS0+dGFyZ2V0TmFtZXNwYWNlICYmICFzdHJjbXAoKCppKS0+dGFyZ2V0TmFtZXNwYWNlLCAoKmopLT50YXJnZXROYW1lc3BhY2UpKQorCSAgICB7IGZvdW5kID0gdHJ1ZTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgfQorCX0KKwlpZiAoIWZvdW5kKQorICAgICAgICB7IGlmICh2ZmxhZykKKwkgICAgY2VyciA8PCAiQWRkaW5nIHNjaGVtYSAiIDw8ICgoKmkpLT50YXJnZXROYW1lc3BhY2U/KCppKS0+dGFyZ2V0TmFtZXNwYWNlOiIiKSA8PCAiIHRvIHR5cGVzIGluIFdTREwgIiA8PCAobmFtZT9uYW1lOiIiKSA8PCAiIG5hbWVzcGFjZSAiIDw8ICh0YXJnZXROYW1lc3BhY2U/dGFyZ2V0TmFtZXNwYWNlOiIiKSA8PCBlbmRsOworCSAgdHlwZXMtPnhzX19zY2hlbWFfLnB1c2hfYmFjaygqaSk7CisJfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZiAodHlwZXMpCisgICAgdHlwZXMtPnByZXByb2Nlc3MoKnRoaXMpOworICByZXR1cm4gU09BUF9PSzsKK30KKworaW50IHdzZGxfX2RlZmluaXRpb25zOjp0cmF2ZXJzZSgpCit7IGlmICh2ZmxhZykKKyAgICBjZXJyIDw8ICJBbmFseXppbmcgd3NkbCBkZWZpbml0aW9ucyAnIiA8PCAobmFtZT9uYW1lOiIiKSA8PCAiJyB0YXJnZXROYW1lc3BhY2UgIiA8PCAodGFyZ2V0TmFtZXNwYWNlP3RhcmdldE5hbWVzcGFjZToiPyIpIDw8IGVuZGw7CisgIGlmICh1cGRhdGVkKQorICAgIHJldHVybiBTT0FQX09LOworICB1cGRhdGVkID0gdHJ1ZTsKKyAgaWYgKCF0YXJnZXROYW1lc3BhY2UpCisgIHsgaWYgKHZmbGFnKQorICAgICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBXU0RMICclcycgaGFzIG5vIHRhcmdldE5hbWVzcGFjZVxuIiwgbmFtZT9uYW1lOiIiKTsKKyAgICB0YXJnZXROYW1lc3BhY2UgPSAiIjsKKyAgfQorICAvLyBwcm9jZXNzIGltcG9ydCBmaXJzdAorICBmb3IgKHZlY3Rvcjx3c2RsX19pbXBvcnQ+OjppdGVyYXRvciBpbSA9IGltcG9ydC5iZWdpbigpOyBpbSAhPSBpbXBvcnQuZW5kKCk7ICsraW0pCisgICAgKCppbSkudHJhdmVyc2UoKnRoaXMpOworICAvLyB0aGVuIHByb2Nlc3MgdGhlIHR5cGVzCisgIGlmICh0eXBlcykKKyAgICB0eXBlcy0+dHJhdmVyc2UoKnRoaXMpOworICAvLyBwcm9jZXNzIG1lc3NhZ2VzIGJlZm9yZSBwb3J0VHlwZXMKKyAgZm9yICh2ZWN0b3I8d3NkbF9fbWVzc2FnZT46Oml0ZXJhdG9yIG1nID0gbWVzc2FnZS5iZWdpbigpOyBtZyAhPSBtZXNzYWdlLmVuZCgpOyArK21nKQorICAgICgqbWcpLnRyYXZlcnNlKCp0aGlzKTsKKyAgLy8gcHJvY2VzcyBwb3J0VHlwZXMgYmVmb3JlIGJpbmRpbmdzCisgIGZvciAodmVjdG9yPHdzZGxfX3BvcnRUeXBlPjo6aXRlcmF0b3IgcHQgPSBwb3J0VHlwZS5iZWdpbigpOyBwdCAhPSBwb3J0VHlwZS5lbmQoKTsgKytwdCkKKyAgICAoKnB0KS50cmF2ZXJzZSgqdGhpcyk7CisgIC8vIHByb2Nlc3MgYmluZGluZ3MKKyAgZm9yICh2ZWN0b3I8d3NkbF9fYmluZGluZz46Oml0ZXJhdG9yIGJnID0gYmluZGluZy5iZWdpbigpOyBiZyAhPSBiaW5kaW5nLmVuZCgpOyArK2JnKQorICAgICgqYmcpLnRyYXZlcnNlKCp0aGlzKTsKKyAgLy8gcHJvY2VzcyBzZXJ2aWNlcworICBmb3IgKHZlY3Rvcjx3c2RsX19zZXJ2aWNlPjo6aXRlcmF0b3Igc3YgPSBzZXJ2aWNlLmJlZ2luKCk7IHN2ICE9IHNlcnZpY2UuZW5kKCk7ICsrc3YpCisgICAgKCpzdikudHJhdmVyc2UoKnRoaXMpOworICBpZiAodmZsYWcpCisgICAgY2VyciA8PCAiRW5kIG9mIHdzZGwgZGVmaW5pdGlvbnMgJyIgPDwgKG5hbWU/bmFtZToiIikgPDwgIicgdGFyZ2V0TmFtZXNwYWNlICIgPDwgKHRhcmdldE5hbWVzcGFjZT90YXJnZXROYW1lc3BhY2U6Ij8iKSA8PCBlbmRsOworICByZXR1cm4gU09BUF9PSzsKK30KKworY29uc3QgY2hhciAqd3NkbF9fZGVmaW5pdGlvbnM6OnNvdXJjZUxvY2F0aW9uKCkKK3sgcmV0dXJuIGxvY2F0aW9uOworfQorCitpbnQgd3NkbF9fZGVmaW5pdGlvbnM6OmVycm9yKCkKK3sgcmV0dXJuIHNvYXAtPmVycm9yOworfQorCit2b2lkIHdzZGxfX2RlZmluaXRpb25zOjpwcmludF9mYXVsdCgpCit7IHNvYXBfcHJpbnRfZmF1bHQoc29hcCwgc3RkZXJyKTsKKyAgc29hcF9wcmludF9mYXVsdF9sb2NhdGlvbihzb2FwLCBzdGRlcnIpOworfQorCit2b2lkIHdzZGxfX2RlZmluaXRpb25zOjpidWlsdGluVHlwZShjb25zdCBjaGFyICp0eXBlKQoreyBidWlsdGluVHlwZVNldC5pbnNlcnQodHlwZSk7Cit9CisKK3ZvaWQgd3NkbF9fZGVmaW5pdGlvbnM6OmJ1aWx0aW5UeXBlcyhjb25zdCBTZXRPZlN0cmluZyYgdHlwZXMpCit7IGZvciAoU2V0T2ZTdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIHRwID0gdHlwZXMuYmVnaW4oKTsgdHAgIT0gdHlwZXMuZW5kKCk7ICsrdHApCisgICAgYnVpbHRpblR5cGVTZXQuaW5zZXJ0KCp0cCk7Cit9CisKK3ZvaWQgd3NkbF9fZGVmaW5pdGlvbnM6OmJ1aWx0aW5FbGVtZW50KGNvbnN0IGNoYXIgKmVsZW1lbnQpCit7IGJ1aWx0aW5FbGVtZW50U2V0Lmluc2VydChlbGVtZW50KTsKK30KKwordm9pZCB3c2RsX19kZWZpbml0aW9uczo6YnVpbHRpbkVsZW1lbnRzKGNvbnN0IFNldE9mU3RyaW5nJiBlbGVtZW50cykKK3sgZm9yIChTZXRPZlN0cmluZzo6Y29uc3RfaXRlcmF0b3IgZWwgPSBlbGVtZW50cy5iZWdpbigpOyBlbCAhPSBlbGVtZW50cy5lbmQoKTsgKytlbCkKKyAgIGJ1aWx0aW5FbGVtZW50U2V0Lmluc2VydCgqZWwpOworfQorCit2b2lkIHdzZGxfX2RlZmluaXRpb25zOjpidWlsdGluQXR0cmlidXRlKGNvbnN0IGNoYXIgKmF0dHJpYnV0ZSkKK3sgYnVpbHRpbkF0dHJpYnV0ZVNldC5pbnNlcnQoYXR0cmlidXRlKTsKK30KKwordm9pZCB3c2RsX19kZWZpbml0aW9uczo6YnVpbHRpbkF0dHJpYnV0ZXMoY29uc3QgU2V0T2ZTdHJpbmcmIGF0dHJpYnV0ZXMpCit7IGZvciAoU2V0T2ZTdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGF0ID0gYXR0cmlidXRlcy5iZWdpbigpOyBhdCAhPSBhdHRyaWJ1dGVzLmVuZCgpOyArK2F0KQorICAgIGJ1aWx0aW5BdHRyaWJ1dGVTZXQuaW5zZXJ0KCphdCk7Cit9CisKK2NvbnN0IFNldE9mU3RyaW5nJiB3c2RsX19kZWZpbml0aW9uczo6YnVpbHRpblR5cGVzKCkgY29uc3QKK3sgcmV0dXJuIGJ1aWx0aW5UeXBlU2V0OworfQorCitjb25zdCBTZXRPZlN0cmluZyYgd3NkbF9fZGVmaW5pdGlvbnM6OmJ1aWx0aW5FbGVtZW50cygpIGNvbnN0Cit7IHJldHVybiBidWlsdGluRWxlbWVudFNldDsKK30KKworY29uc3QgU2V0T2ZTdHJpbmcmIHdzZGxfX2RlZmluaXRpb25zOjpidWlsdGluQXR0cmlidXRlcygpIGNvbnN0Cit7IHJldHVybiBidWlsdGluQXR0cmlidXRlU2V0OworfQorCitpbnQgd3NkbF9fc2VydmljZTo6dHJhdmVyc2Uod3NkbF9fZGVmaW5pdGlvbnMmIGRlZmluaXRpb25zKQoreyBpZiAodmZsYWcpCisgICAgY2VyciA8PCAiQW5hbHl6aW5nIHdzZGwgc2VydmljZSAiIDw8IChuYW1lP25hbWU6IiIpIDw8IGVuZGw7CisgIC8vIHByb2Nlc3MgcG9ydHMKKyAgZm9yICh2ZWN0b3I8d3NkbF9fcG9ydD46Oml0ZXJhdG9yIGkgPSBwb3J0LmJlZ2luKCk7IGkgIT0gcG9ydC5lbmQoKTsgKytpKQorICAgICgqaSkudHJhdmVyc2UoZGVmaW5pdGlvbnMpOworICByZXR1cm4gU09BUF9PSzsKK30KKword3NkbF9fcG9ydDo6d3NkbF9fcG9ydCgpCit7IGJpbmRpbmdSZWYgPSBOVUxMOworfQorCitpbnQgd3NkbF9fcG9ydDo6dHJhdmVyc2Uod3NkbF9fZGVmaW5pdGlvbnMmIGRlZmluaXRpb25zKQoreyBpZiAodmZsYWcpCisgICAgY2VyciA8PCAiQW5hbHl6aW5nIHdzZGwgcG9ydCIgPDwgZW5kbDsKKyAgLy8gc2VhcmNoIGJpbmRpbmcgbmFtZQorICBjb25zdCBjaGFyICp0b2tlbiA9IHFuYW1lX3Rva2VuKGJpbmRpbmcsIGRlZmluaXRpb25zLnRhcmdldE5hbWVzcGFjZSk7CisgIGJpbmRpbmdSZWYgPSBOVUxMOworICBpZiAodG9rZW4pCisgIHsgZm9yICh2ZWN0b3I8d3NkbF9fYmluZGluZz46Oml0ZXJhdG9yIGJpbmRpbmcgPSBkZWZpbml0aW9ucy5iaW5kaW5nLmJlZ2luKCk7IGJpbmRpbmcgIT0gZGVmaW5pdGlvbnMuYmluZGluZy5lbmQoKTsgKytiaW5kaW5nKQorICAgIHsgaWYgKCgqYmluZGluZykubmFtZSAmJiAhc3RyY21wKCgqYmluZGluZykubmFtZSwgdG9rZW4pKQorICAgICAgeyBiaW5kaW5nUmVmID0gJigqYmluZGluZyk7CisgICAgICAgIGlmICh2ZmxhZykKKwkgIGNlcnIgPDwgIkZvdW5kIHBvcnQgIiA8PCAobmFtZT9uYW1lOiIiKSA8PCAiIGJpbmRpbmcgIiA8PCAodG9rZW4/dG9rZW46IiIpIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsgZm9yICh2ZWN0b3I8d3NkbF9faW1wb3J0Pjo6aXRlcmF0b3IgaW1wb3J0ID0gZGVmaW5pdGlvbnMuaW1wb3J0LmJlZ2luKCk7IGltcG9ydCAhPSBkZWZpbml0aW9ucy5pbXBvcnQuZW5kKCk7ICsraW1wb3J0KQorICAgIHsgd3NkbF9fZGVmaW5pdGlvbnMgKmltcG9ydGRlZmluaXRpb25zID0gKCppbXBvcnQpLmRlZmluaXRpb25zUHRyKCk7CisgICAgICBpZiAoaW1wb3J0ZGVmaW5pdGlvbnMpCisgICAgICB7IHRva2VuID0gcW5hbWVfdG9rZW4oYmluZGluZywgaW1wb3J0ZGVmaW5pdGlvbnMtPnRhcmdldE5hbWVzcGFjZSk7CisgICAgICAgIGlmICh0b2tlbikKKyAgICAgICAgeyBmb3IgKHZlY3Rvcjx3c2RsX19iaW5kaW5nPjo6aXRlcmF0b3IgYmluZGluZyA9IGltcG9ydGRlZmluaXRpb25zLT5iaW5kaW5nLmJlZ2luKCk7IGJpbmRpbmcgIT0gaW1wb3J0ZGVmaW5pdGlvbnMtPmJpbmRpbmcuZW5kKCk7ICsrYmluZGluZykKKyAgICAgICAgICB7IGlmICgoKmJpbmRpbmcpLm5hbWUgJiYgIXN0cmNtcCgoKmJpbmRpbmcpLm5hbWUsIHRva2VuKSkKKyAgICAgICAgICAgIHsgYmluZGluZ1JlZiA9ICYoKmJpbmRpbmcpOworICAgICAgICAgICAgICBpZiAodmZsYWcpCisJICAgICAgICBjZXJyIDw8ICJGb3VuZCBwb3J0ICIgPDwgKG5hbWU/bmFtZToiIikgPDwgIiBiaW5kaW5nICIgPDwgKHRva2VuP3Rva2VuOiIiKSA8PCBlbmRsOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisJfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoIWJpbmRpbmdSZWYpCisgICAgY2VyciA8PCAiV2FybmluZzogbm8gcG9ydCAnIiA8PCAobmFtZT9uYW1lOiIiKSA8PCAiJyBiaW5kaW5nICciIDw8IChiaW5kaW5nP2JpbmRpbmc6IiIpIDw8ICInIGluIFdTREwgZGVmaW5pdGlvbnMgJyIgPDwgKGRlZmluaXRpb25zLm5hbWU/ZGVmaW5pdGlvbnMubmFtZToiIikgPDwgIicgbmFtZXNwYWNlICIgPDwgKGRlZmluaXRpb25zLnRhcmdldE5hbWVzcGFjZT9kZWZpbml0aW9ucy50YXJnZXROYW1lc3BhY2U6IiIpIDw8IGVuZGw7CisgIHJldHVybiBTT0FQX09LOworfQorCit2b2lkIHdzZGxfX3BvcnQ6OmJpbmRpbmdQdHIod3NkbF9fYmluZGluZyAqYmluZGluZykKK3sgYmluZGluZ1JlZiA9IGJpbmRpbmc7Cit9CisKK3dzZGxfX2JpbmRpbmcgKndzZGxfX3BvcnQ6OmJpbmRpbmdQdHIoKSBjb25zdAoreyByZXR1cm4gYmluZGluZ1JlZjsKK30KKword3NkbF9fYmluZGluZzo6d3NkbF9fYmluZGluZygpCit7IHBvcnRUeXBlUmVmID0gTlVMTDsKK30KKworaW50IHdzZGxfX2JpbmRpbmc6OnRyYXZlcnNlKHdzZGxfX2RlZmluaXRpb25zJiBkZWZpbml0aW9ucykKK3sgaWYgKHZmbGFnKQorICAgIGNlcnIgPDwgIkFuYWx5emluZyB3c2RsIGJpbmRpbmdzIiA8PCBlbmRsOworICBjb25zdCBjaGFyICp0b2tlbiA9IHFuYW1lX3Rva2VuKHR5cGUsIGRlZmluaXRpb25zLnRhcmdldE5hbWVzcGFjZSk7CisgIHBvcnRUeXBlUmVmID0gTlVMTDsKKyAgaWYgKHRva2VuKQorICB7IGZvciAodmVjdG9yPHdzZGxfX3BvcnRUeXBlPjo6aXRlcmF0b3IgcG9ydFR5cGUgPSBkZWZpbml0aW9ucy5wb3J0VHlwZS5iZWdpbigpOyBwb3J0VHlwZSAhPSBkZWZpbml0aW9ucy5wb3J0VHlwZS5lbmQoKTsgKytwb3J0VHlwZSkKKyAgICB7IGlmICgoKnBvcnRUeXBlKS5uYW1lICYmICFzdHJjbXAoKCpwb3J0VHlwZSkubmFtZSwgdG9rZW4pKQorICAgICAgeyBwb3J0VHlwZVJlZiA9ICYoKnBvcnRUeXBlKTsKKyAgICAgICAgaWYgKHZmbGFnKQorCSAgY2VyciA8PCAiRm91bmQgYmluZGluZyAiIDw8IChuYW1lP25hbWU6IiIpIDw8ICIgcG9ydFR5cGUgIiA8PCAodG9rZW4/dG9rZW46IiIpIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsgZm9yICh2ZWN0b3I8d3NkbF9faW1wb3J0Pjo6aXRlcmF0b3IgaW1wb3J0ID0gZGVmaW5pdGlvbnMuaW1wb3J0LmJlZ2luKCk7IGltcG9ydCAhPSBkZWZpbml0aW9ucy5pbXBvcnQuZW5kKCk7ICsraW1wb3J0KQorICAgIHsgd3NkbF9fZGVmaW5pdGlvbnMgKmltcG9ydGRlZmluaXRpb25zID0gKCppbXBvcnQpLmRlZmluaXRpb25zUHRyKCk7CisgICAgICBpZiAoaW1wb3J0ZGVmaW5pdGlvbnMpCisgICAgICB7IHRva2VuID0gcW5hbWVfdG9rZW4odHlwZSwgaW1wb3J0ZGVmaW5pdGlvbnMtPnRhcmdldE5hbWVzcGFjZSk7CisgICAgICAgIGlmICh0b2tlbikKKyAgICAgICAgeyBmb3IgKHZlY3Rvcjx3c2RsX19wb3J0VHlwZT46Oml0ZXJhdG9yIHBvcnRUeXBlID0gaW1wb3J0ZGVmaW5pdGlvbnMtPnBvcnRUeXBlLmJlZ2luKCk7IHBvcnRUeXBlICE9IGltcG9ydGRlZmluaXRpb25zLT5wb3J0VHlwZS5lbmQoKTsgKytwb3J0VHlwZSkKKyAgICAgICAgICB7IGlmICgoKnBvcnRUeXBlKS5uYW1lICYmICFzdHJjbXAoKCpwb3J0VHlwZSkubmFtZSwgdG9rZW4pKQorICAgICAgICAgICAgeyBwb3J0VHlwZVJlZiA9ICYoKnBvcnRUeXBlKTsKKyAgICAgICAgICAgICAgaWYgKHZmbGFnKQorCSAgICAgICAgY2VyciA8PCAiRm91bmQgYmluZGluZyAiIDw8IChuYW1lP25hbWU6IiIpIDw8ICIgcG9ydFR5cGUgIiA8PCAodG9rZW4/dG9rZW46IiIpIDw8IGVuZGw7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKwl9CisgICAgICB9CisgICAgfQorICB9CisgIGlmICghcG9ydFR5cGVSZWYpCisgICAgY2VyciA8PCAiV2FybmluZzogbm8gYmluZGluZyAnIiA8PCAobmFtZT9uYW1lOiIiKSA8PCAiJyBwb3J0VHlwZSAnIiA8PCAodHlwZT90eXBlOiIiKSA8PCAiJyBpbiBXU0RMIGRlZmluaXRpb25zICciIDw8IChkZWZpbml0aW9ucy5uYW1lP2RlZmluaXRpb25zLm5hbWU6IiIpIDw8ICInIG5hbWVzcGFjZSAiIDw8IChkZWZpbml0aW9ucy50YXJnZXROYW1lc3BhY2U/ZGVmaW5pdGlvbnMudGFyZ2V0TmFtZXNwYWNlOiIiKSA8PCBlbmRsOworICBmb3IgKHZlY3Rvcjx3c2RsX19iaW5kaW5nX29wZXJhdGlvbj46Oml0ZXJhdG9yIGkgPSBvcGVyYXRpb24uYmVnaW4oKTsgaSAhPSBvcGVyYXRpb24uZW5kKCk7ICsraSkKKyAgICAoKmkpLnRyYXZlcnNlKGRlZmluaXRpb25zLCBwb3J0VHlwZVJlZik7CisgIHJldHVybiBTT0FQX09LOworfQorCit2b2lkIHdzZGxfX2JpbmRpbmc6OnBvcnRUeXBlUHRyKHdzZGxfX3BvcnRUeXBlICpwb3J0VHlwZSkKK3sgcG9ydFR5cGVSZWYgPSBwb3J0VHlwZTsKK30KKword3NkbF9fcG9ydFR5cGUgKndzZGxfX2JpbmRpbmc6OnBvcnRUeXBlUHRyKCkgY29uc3QKK3sgcmV0dXJuIHBvcnRUeXBlUmVmOworfQorCit3c2RsX19iaW5kaW5nX29wZXJhdGlvbjo6d3NkbF9fYmluZGluZ19vcGVyYXRpb24oKQoreyBvcGVyYXRpb25SZWYgPSBOVUxMOworfQorCitpbnQgd3NkbF9fYmluZGluZ19vcGVyYXRpb246OnRyYXZlcnNlKHdzZGxfX2RlZmluaXRpb25zJiBkZWZpbml0aW9ucywgd3NkbF9fcG9ydFR5cGUgKnBvcnRUeXBlUmVmKQoreyBpZiAodmZsYWcpCisgICAgY2VyciA8PCAiQW5hbHl6aW5nIHdzZGwgYmluZGluZyBvcGVyYXRpb24iIDw8IGVuZGw7CisgIGlmIChpbnB1dCkKKyAgICBpbnB1dC0+dHJhdmVyc2UoZGVmaW5pdGlvbnMpOworICBpZiAob3V0cHV0KQorICAgIG91dHB1dC0+dHJhdmVyc2UoZGVmaW5pdGlvbnMpOworICBmb3IgKHZlY3Rvcjx3c2RsX19leHRfZmF1bHQ+OjppdGVyYXRvciBpID0gZmF1bHQuYmVnaW4oKTsgaSAhPSBmYXVsdC5lbmQoKTsgKytpKQorICAgICgqaSkudHJhdmVyc2UoZGVmaW5pdGlvbnMpOworICBvcGVyYXRpb25SZWYgPSBOVUxMOworICBpZiAobmFtZSAmJiBwb3J0VHlwZVJlZikKKyAgeyBmb3IgKHZlY3Rvcjx3c2RsX19vcGVyYXRpb24+OjppdGVyYXRvciBpID0gcG9ydFR5cGVSZWYtPm9wZXJhdGlvbi5iZWdpbigpOyBpICE9IHBvcnRUeXBlUmVmLT5vcGVyYXRpb24uZW5kKCk7ICsraSkKKyAgICB7IGlmICgoKmkpLm5hbWUgJiYgIXN0cmNtcCgoKmkpLm5hbWUsIG5hbWUpKQorICAgICAgeyBvcGVyYXRpb25SZWYgPSAmKCppKTsKKyAgICAgICAgaWYgKHZmbGFnKQorICAgICAgICAgIGNlcnIgPDwgIkZvdW5kIG9wZXJhdGlvbiAiIDw8IChuYW1lP25hbWU6IiIpIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoIW9wZXJhdGlvblJlZikKKyAgICBjZXJyIDw8ICJXYXJuaW5nOiBubyBvcGVyYXRpb24gJyIgPDwgKG5hbWU/bmFtZToiIikgPDwgIicgaW4gV1NETCBkZWZpbml0aW9ucyAnIiA8PCAoZGVmaW5pdGlvbnMubmFtZT9kZWZpbml0aW9ucy5uYW1lOiIiKSA8PCAiJyBuYW1lc3BhY2UgIiA8PCAoZGVmaW5pdGlvbnMudGFyZ2V0TmFtZXNwYWNlP2RlZmluaXRpb25zLnRhcmdldE5hbWVzcGFjZToiIikgPDwgZW5kbDsKKyAgZWxzZQorICB7IGZvciAodmVjdG9yPHdzZGxfX2V4dF9mYXVsdD46Oml0ZXJhdG9yIGkgPSBmYXVsdC5iZWdpbigpOyBpICE9IGZhdWx0LmVuZCgpOyArK2kpCisgICAgeyBpZiAoKCppKS5uYW1lKQorICAgICAgeyBmb3IgKHZlY3Rvcjx3c2RsX19mYXVsdD46Oml0ZXJhdG9yIGogPSBvcGVyYXRpb25SZWYtPmZhdWx0LmJlZ2luKCk7IGogIT0gb3BlcmF0aW9uUmVmLT5mYXVsdC5lbmQoKTsgKytqKQorICAgICAgICB7IGlmICgoKmopLm5hbWUgJiYgIXN0cmNtcCgoKmopLm5hbWUsICgqaSkubmFtZSkpCisgICAgICAgICAgeyAoKmkpLm1lc3NhZ2VQdHIoKCpqKS5tZXNzYWdlUHRyKCkpOworICAgICAgICAgICAgaWYgKHZmbGFnKQorICAgICAgICAgICAgICBjZXJyIDw8ICJGb3VuZCBmYXVsdCAiIDw8ICgoKmopLm5hbWU/KCpqKS5uYW1lOiIiKSA8PCAiIG1lc3NhZ2UgIiA8PCBlbmRsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmICgoKmkpLnNvYXBfX2ZhdWx0XyAmJiAoKmkpLnNvYXBfX2ZhdWx0Xy0+bmFtZSkgLy8gdHJ5IHRoZSBzb2FwOmZhdWx0IG5hbWUsIHRoaXMgaXMgbm90IGVsZWdhbnQsIGJ1dCBuZWl0aGVyIGlzIFdTREwgMS4xIAorICAgICAgeyBmb3IgKHZlY3Rvcjx3c2RsX19mYXVsdD46Oml0ZXJhdG9yIGogPSBvcGVyYXRpb25SZWYtPmZhdWx0LmJlZ2luKCk7IGogIT0gb3BlcmF0aW9uUmVmLT5mYXVsdC5lbmQoKTsgKytqKQorICAgICAgICB7IGlmICgoKmopLm5hbWUgJiYgIXN0cmNtcCgoKmopLm5hbWUsICgqaSkuc29hcF9fZmF1bHRfLT5uYW1lKSkKKyAgICAgICAgICB7ICgqaSkubWVzc2FnZVB0cigoKmopLm1lc3NhZ2VQdHIoKSk7CisgICAgICAgICAgICBpZiAodmZsYWcpCisgICAgICAgICAgICAgIGNlcnIgPDwgIkZvdW5kIGZhdWx0ICIgPDwgKCgqaikubmFtZT8oKmopLm5hbWU6IiIpIDw8ICIgbWVzc2FnZSAiIDw8IGVuZGw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICghKCppKS5tZXNzYWdlUHRyKCkpCisgICAgICAgIGNlcnIgPDwgIldhcm5pbmc6IG5vIHNvYXA6ZmF1bHQgbWVzc2FnZSBpbiBXU0RMIGRlZmluaXRpb25zICciIDw8IChkZWZpbml0aW9ucy5uYW1lP2RlZmluaXRpb25zLm5hbWU6IiIpIDw8ICInIG9wZXJhdGlvbiAnIiA8PCAobmFtZT9uYW1lOiIiKSA8PCAiJyBuYW1lc3BhY2UgIiA8PCAoZGVmaW5pdGlvbnMudGFyZ2V0TmFtZXNwYWNlP2RlZmluaXRpb25zLnRhcmdldE5hbWVzcGFjZToiIikgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK3ZvaWQgd3NkbF9fYmluZGluZ19vcGVyYXRpb246Om9wZXJhdGlvblB0cih3c2RsX19vcGVyYXRpb24gKm9wZXJhdGlvbikKK3sgb3BlcmF0aW9uUmVmID0gb3BlcmF0aW9uOworfQorCit3c2RsX19vcGVyYXRpb24gKndzZGxfX2JpbmRpbmdfb3BlcmF0aW9uOjpvcGVyYXRpb25QdHIoKSBjb25zdAoreyByZXR1cm4gb3BlcmF0aW9uUmVmOworfQorCitpbnQgd3NkbF9fZXh0X2lucHV0Ojp0cmF2ZXJzZSh3c2RsX19kZWZpbml0aW9ucyYgZGVmaW5pdGlvbnMpCit7IGlmICh2ZmxhZykKKyAgICBjZXJyIDw8ICJBbmFseXppbmcgd3NkbCBleHQgaW5wdXQiIDw8IGVuZGw7CisgIGZvciAodmVjdG9yPHNvYXBfX2hlYWRlcj46Oml0ZXJhdG9yIGhkID0gc29hcF9faGVhZGVyXy5iZWdpbigpOyBoZCAhPSBzb2FwX19oZWFkZXJfLmVuZCgpOyArK2hkKQorICAgICgqaGQpLnRyYXZlcnNlKGRlZmluaXRpb25zKTsKKyAgaWYgKG1pbWVfX211bHRpcGFydFJlbGF0ZWRfKQorICAgIG1pbWVfX211bHRpcGFydFJlbGF0ZWRfLT50cmF2ZXJzZShkZWZpbml0aW9ucyk7CisgIHJldHVybiBTT0FQX09LOworfQorCitpbnQgd3NkbF9fZXh0X291dHB1dDo6dHJhdmVyc2Uod3NkbF9fZGVmaW5pdGlvbnMmIGRlZmluaXRpb25zKQoreyBpZiAodmZsYWcpCisgICAgY2VyciA8PCAiQW5hbHl6aW5nIHdzZGwgZXh0IG91dHB1dCIgPDwgZW5kbDsKKyAgZm9yICh2ZWN0b3I8c29hcF9faGVhZGVyPjo6aXRlcmF0b3IgaGQgPSBzb2FwX19oZWFkZXJfLmJlZ2luKCk7IGhkICE9IHNvYXBfX2hlYWRlcl8uZW5kKCk7ICsraGQpCisgICAgKCpoZCkudHJhdmVyc2UoZGVmaW5pdGlvbnMpOworICBpZiAobWltZV9fbXVsdGlwYXJ0UmVsYXRlZF8pCisgICAgbWltZV9fbXVsdGlwYXJ0UmVsYXRlZF8tPnRyYXZlcnNlKGRlZmluaXRpb25zKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK3dzZGxfX2V4dF9mYXVsdDo6d3NkbF9fZXh0X2ZhdWx0KCkKK3sgbWVzc2FnZVJlZiA9IE5VTEw7Cit9CisKK2ludCB3c2RsX19leHRfZmF1bHQ6OnRyYXZlcnNlKHdzZGxfX2RlZmluaXRpb25zJiBkZWZpbml0aW9ucykKK3sgaWYgKHZmbGFnKQorICAgIGNlcnIgPDwgIkFuYWx5emluZyB3c2RsIGV4dCBmYXVsdCIgPDwgZW5kbDsKKyAgbWVzc2FnZVJlZiA9IE5VTEw7CisgIHJldHVybiBTT0FQX09LOworfQorCit2b2lkIHdzZGxfX2V4dF9mYXVsdDo6bWVzc2FnZVB0cih3c2RsX19tZXNzYWdlICptZXNzYWdlKQoreyBtZXNzYWdlUmVmID0gbWVzc2FnZTsKK30KKword3NkbF9fbWVzc2FnZSAqd3NkbF9fZXh0X2ZhdWx0OjptZXNzYWdlUHRyKCkgY29uc3QKK3sgcmV0dXJuIG1lc3NhZ2VSZWY7Cit9CisKK2ludCB3c2RsX19wb3J0VHlwZTo6dHJhdmVyc2Uod3NkbF9fZGVmaW5pdGlvbnMmIGRlZmluaXRpb25zKQoreyBpZiAodmZsYWcpCisgICAgY2VyciA8PCAiQW5hbHl6aW5nIHdzZGwgcG9ydFR5cGUiIDw8IGVuZGw7CisgIGZvciAodmVjdG9yPHdzZGxfX29wZXJhdGlvbj46Oml0ZXJhdG9yIGkgPSBvcGVyYXRpb24uYmVnaW4oKTsgaSAhPSBvcGVyYXRpb24uZW5kKCk7ICsraSkKKyAgICAoKmkpLnRyYXZlcnNlKGRlZmluaXRpb25zKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK2ludCB3c2RsX19vcGVyYXRpb246OnRyYXZlcnNlKHdzZGxfX2RlZmluaXRpb25zJiBkZWZpbml0aW9ucykKK3sgaWYgKHZmbGFnKQorICAgIGNlcnIgPDwgIkFuYWx5emluZyB3c2RsIG9wZXJhdGlvbiIgPDwgZW5kbDsKKyAgaWYgKGlucHV0KQorICAgIGlucHV0LT50cmF2ZXJzZShkZWZpbml0aW9ucyk7CisgIGlmIChvdXRwdXQpCisgICAgb3V0cHV0LT50cmF2ZXJzZShkZWZpbml0aW9ucyk7CisgIGZvciAodmVjdG9yPHdzZGxfX2ZhdWx0Pjo6aXRlcmF0b3IgaSA9IGZhdWx0LmJlZ2luKCk7IGkgIT0gZmF1bHQuZW5kKCk7ICsraSkKKyAgICAoKmkpLnRyYXZlcnNlKGRlZmluaXRpb25zKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK3dzZGxfX2lucHV0Ojp3c2RsX19pbnB1dCgpCit7IG1lc3NhZ2VSZWYgPSBOVUxMOworfQorCitpbnQgd3NkbF9faW5wdXQ6OnRyYXZlcnNlKHdzZGxfX2RlZmluaXRpb25zJiBkZWZpbml0aW9ucykKK3sgaWYgKHZmbGFnKQorICAgIGNlcnIgPDwgIkFuYWx5emluZyB3c2RsIGlucHV0IiA8PCBlbmRsOworICBjb25zdCBjaGFyICp0b2tlbiA9IHFuYW1lX3Rva2VuKG1lc3NhZ2UsIGRlZmluaXRpb25zLnRhcmdldE5hbWVzcGFjZSk7CisgIG1lc3NhZ2VSZWYgPSBOVUxMOworICBpZiAodG9rZW4pCisgIHsgZm9yICh2ZWN0b3I8d3NkbF9fbWVzc2FnZT46Oml0ZXJhdG9yIG1lc3NhZ2UgPSBkZWZpbml0aW9ucy5tZXNzYWdlLmJlZ2luKCk7IG1lc3NhZ2UgIT0gZGVmaW5pdGlvbnMubWVzc2FnZS5lbmQoKTsgKyttZXNzYWdlKQorICAgIHsgaWYgKCgqbWVzc2FnZSkubmFtZSAmJiAhc3RyY21wKCgqbWVzc2FnZSkubmFtZSwgdG9rZW4pKQorICAgICAgeyBtZXNzYWdlUmVmID0gJigqbWVzc2FnZSk7CisgICAgICAgIGlmICh2ZmxhZykKKwkgIGNlcnIgPDwgIkZvdW5kIGlucHV0ICIgPDwgKG5hbWU/bmFtZToiIikgPDwgIiBtZXNzYWdlICIgPDwgKHRva2VuP3Rva2VuOiIiKSA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZQorICB7IGZvciAodmVjdG9yPHdzZGxfX2ltcG9ydD46Oml0ZXJhdG9yIGltcG9ydCA9IGRlZmluaXRpb25zLmltcG9ydC5iZWdpbigpOyBpbXBvcnQgIT0gZGVmaW5pdGlvbnMuaW1wb3J0LmVuZCgpOyArK2ltcG9ydCkKKyAgICB7IHdzZGxfX2RlZmluaXRpb25zICppbXBvcnRkZWZpbml0aW9ucyA9ICgqaW1wb3J0KS5kZWZpbml0aW9uc1B0cigpOworICAgICAgaWYgKGltcG9ydGRlZmluaXRpb25zKQorICAgICAgeyB0b2tlbiA9IHFuYW1lX3Rva2VuKG1lc3NhZ2UsIGltcG9ydGRlZmluaXRpb25zLT50YXJnZXROYW1lc3BhY2UpOworICAgICAgICBpZiAodG9rZW4pCisgICAgICAgIHsgZm9yICh2ZWN0b3I8d3NkbF9fbWVzc2FnZT46Oml0ZXJhdG9yIG1lc3NhZ2UgPSBpbXBvcnRkZWZpbml0aW9ucy0+bWVzc2FnZS5iZWdpbigpOyBtZXNzYWdlICE9IGltcG9ydGRlZmluaXRpb25zLT5tZXNzYWdlLmVuZCgpOyArK21lc3NhZ2UpCisgICAgICAgICAgeyBpZiAoKCptZXNzYWdlKS5uYW1lICYmICFzdHJjbXAoKCptZXNzYWdlKS5uYW1lLCB0b2tlbikpCisgICAgICAgICAgICB7IG1lc3NhZ2VSZWYgPSAmKCptZXNzYWdlKTsKKyAgICAgICAgICAgICAgaWYgKHZmbGFnKQorCSAgICAgICAgY2VyciA8PCAiRm91bmQgaW5wdXQgIiA8PCAobmFtZT9uYW1lOiIiKSA8PCAiIG1lc3NhZ2UgIiA8PCAodG9rZW4/dG9rZW46IiIpIDw8IGVuZGw7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKwl9CisgICAgICB9CisgICAgfQorICB9CisgIGlmICghbWVzc2FnZVJlZikKKyAgICBjZXJyIDw8ICJXYXJuaW5nOiBubyBpbnB1dCAnIiA8PCAobmFtZT9uYW1lOiIiKSA8PCAiJyBtZXNzYWdlICciIDw8IChtZXNzYWdlP21lc3NhZ2U6IiIpIDw8ICInIGluIFdTREwgZGVmaW5pdGlvbnMgJyIgPDwgKGRlZmluaXRpb25zLm5hbWU/ZGVmaW5pdGlvbnMubmFtZToiIikgPDwgIicgbmFtZXNwYWNlICIgPDwgKGRlZmluaXRpb25zLnRhcmdldE5hbWVzcGFjZT9kZWZpbml0aW9ucy50YXJnZXROYW1lc3BhY2U6IiIpIDw8IGVuZGw7CisgIHJldHVybiBTT0FQX09LOworfQorCit2b2lkIHdzZGxfX2lucHV0OjptZXNzYWdlUHRyKHdzZGxfX21lc3NhZ2UgKm1lc3NhZ2UpCit7IG1lc3NhZ2VSZWYgPSBtZXNzYWdlOworfQorCit3c2RsX19tZXNzYWdlICp3c2RsX19pbnB1dDo6bWVzc2FnZVB0cigpIGNvbnN0Cit7IHJldHVybiBtZXNzYWdlUmVmOworfQorCit3c2RsX19vdXRwdXQ6OndzZGxfX291dHB1dCgpCit7IG1lc3NhZ2VSZWYgPSBOVUxMOworfQorCitpbnQgd3NkbF9fb3V0cHV0Ojp0cmF2ZXJzZSh3c2RsX19kZWZpbml0aW9ucyYgZGVmaW5pdGlvbnMpCit7IGlmICh2ZmxhZykKKyAgICBjZXJyIDw8ICJBbmFseXppbmcgd3NkbCBvdXRwdXQiIDw8IGVuZGw7CisgIGNvbnN0IGNoYXIgKnRva2VuID0gcW5hbWVfdG9rZW4obWVzc2FnZSwgZGVmaW5pdGlvbnMudGFyZ2V0TmFtZXNwYWNlKTsKKyAgbWVzc2FnZVJlZiA9IE5VTEw7CisgIGlmICh0b2tlbikKKyAgeyBmb3IgKHZlY3Rvcjx3c2RsX19tZXNzYWdlPjo6aXRlcmF0b3IgbWVzc2FnZSA9IGRlZmluaXRpb25zLm1lc3NhZ2UuYmVnaW4oKTsgbWVzc2FnZSAhPSBkZWZpbml0aW9ucy5tZXNzYWdlLmVuZCgpOyArK21lc3NhZ2UpCisgICAgeyBpZiAoKCptZXNzYWdlKS5uYW1lICYmICFzdHJjbXAoKCptZXNzYWdlKS5uYW1lLCB0b2tlbikpCisgICAgICB7IG1lc3NhZ2VSZWYgPSAmKCptZXNzYWdlKTsKKyAgICAgICAgaWYgKHZmbGFnKQorCSAgY2VyciA8PCAiRm91bmQgb3V0cHV0ICIgPDwgKG5hbWU/bmFtZToiIikgPDwgIiBtZXNzYWdlICIgPDwgKHRva2VuP3Rva2VuOiIiKSA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZQorICB7IGZvciAodmVjdG9yPHdzZGxfX2ltcG9ydD46Oml0ZXJhdG9yIGltcG9ydCA9IGRlZmluaXRpb25zLmltcG9ydC5iZWdpbigpOyBpbXBvcnQgIT0gZGVmaW5pdGlvbnMuaW1wb3J0LmVuZCgpOyArK2ltcG9ydCkKKyAgICB7IHdzZGxfX2RlZmluaXRpb25zICppbXBvcnRkZWZpbml0aW9ucyA9ICgqaW1wb3J0KS5kZWZpbml0aW9uc1B0cigpOworICAgICAgaWYgKGltcG9ydGRlZmluaXRpb25zKQorICAgICAgeyB0b2tlbiA9IHFuYW1lX3Rva2VuKG1lc3NhZ2UsIGltcG9ydGRlZmluaXRpb25zLT50YXJnZXROYW1lc3BhY2UpOworICAgICAgICBpZiAodG9rZW4pCisgICAgICAgIHsgZm9yICh2ZWN0b3I8d3NkbF9fbWVzc2FnZT46Oml0ZXJhdG9yIG1lc3NhZ2UgPSBpbXBvcnRkZWZpbml0aW9ucy0+bWVzc2FnZS5iZWdpbigpOyBtZXNzYWdlICE9IGltcG9ydGRlZmluaXRpb25zLT5tZXNzYWdlLmVuZCgpOyArK21lc3NhZ2UpCisgICAgICAgICAgeyBpZiAoKCptZXNzYWdlKS5uYW1lICYmICFzdHJjbXAoKCptZXNzYWdlKS5uYW1lLCB0b2tlbikpCisgICAgICAgICAgICB7IG1lc3NhZ2VSZWYgPSAmKCptZXNzYWdlKTsKKyAgICAgICAgICAgICAgaWYgKHZmbGFnKQorCSAgICAgICAgY2VyciA8PCAiRm91bmQgb3V0cHV0ICIgPDwgKG5hbWU/bmFtZToiIikgPDwgIiBtZXNzYWdlICIgPDwgKHRva2VuP3Rva2VuOiIiKSA8PCBlbmRsOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisJfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoIW1lc3NhZ2VSZWYpCisgICAgY2VyciA8PCAiV2FybmluZzogbm8gb3V0cHV0ICciIDw8IChuYW1lP25hbWU6IiIpIDw8ICInIG1lc3NhZ2UgJyIgPDwgKG1lc3NhZ2U/bWVzc2FnZToiIikgPDwgIicgaW4gV1NETCBkZWZpbml0aW9ucyAnIiA8PCAoZGVmaW5pdGlvbnMubmFtZT9kZWZpbml0aW9ucy5uYW1lOiIiKSA8PCAiJyBuYW1lc3BhY2UgIiA8PCAoZGVmaW5pdGlvbnMudGFyZ2V0TmFtZXNwYWNlP2RlZmluaXRpb25zLnRhcmdldE5hbWVzcGFjZToiIikgPDwgZW5kbDsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK3ZvaWQgd3NkbF9fb3V0cHV0OjptZXNzYWdlUHRyKHdzZGxfX21lc3NhZ2UgKm1lc3NhZ2UpCit7IG1lc3NhZ2VSZWYgPSBtZXNzYWdlOworfQorCit3c2RsX19tZXNzYWdlICp3c2RsX19vdXRwdXQ6Om1lc3NhZ2VQdHIoKSBjb25zdAoreyByZXR1cm4gbWVzc2FnZVJlZjsKK30KKword3NkbF9fZmF1bHQ6OndzZGxfX2ZhdWx0KCkKK3sgbWVzc2FnZVJlZiA9IE5VTEw7Cit9CisKK2ludCB3c2RsX19mYXVsdDo6dHJhdmVyc2Uod3NkbF9fZGVmaW5pdGlvbnMmIGRlZmluaXRpb25zKQoreyBpZiAodmZsYWcpCisgICAgY2VyciA8PCAiQW5hbHl6aW5nIHdzZGwgZmF1bHQiIDw8IGVuZGw7CisgIGNvbnN0IGNoYXIgKnRva2VuID0gcW5hbWVfdG9rZW4obWVzc2FnZSwgZGVmaW5pdGlvbnMudGFyZ2V0TmFtZXNwYWNlKTsKKyAgbWVzc2FnZVJlZiA9IE5VTEw7CisgIGlmICh0b2tlbikKKyAgeyBmb3IgKHZlY3Rvcjx3c2RsX19tZXNzYWdlPjo6aXRlcmF0b3IgbWVzc2FnZSA9IGRlZmluaXRpb25zLm1lc3NhZ2UuYmVnaW4oKTsgbWVzc2FnZSAhPSBkZWZpbml0aW9ucy5tZXNzYWdlLmVuZCgpOyArK21lc3NhZ2UpCisgICAgeyBpZiAoKCptZXNzYWdlKS5uYW1lICYmICFzdHJjbXAoKCptZXNzYWdlKS5uYW1lLCB0b2tlbikpCisgICAgICB7IG1lc3NhZ2VSZWYgPSAmKCptZXNzYWdlKTsKKyAgICAgICAgaWYgKHZmbGFnKQorCSAgY2VyciA8PCAiRm91bmQgZmF1bHQgIiA8PCAobmFtZT9uYW1lOiIiKSA8PCAiIG1lc3NhZ2UgIiA8PCAodG9rZW4/dG9rZW46IiIpIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgIHsgZm9yICh2ZWN0b3I8d3NkbF9faW1wb3J0Pjo6aXRlcmF0b3IgaW1wb3J0ID0gZGVmaW5pdGlvbnMuaW1wb3J0LmJlZ2luKCk7IGltcG9ydCAhPSBkZWZpbml0aW9ucy5pbXBvcnQuZW5kKCk7ICsraW1wb3J0KQorICAgIHsgd3NkbF9fZGVmaW5pdGlvbnMgKmltcG9ydGRlZmluaXRpb25zID0gKCppbXBvcnQpLmRlZmluaXRpb25zUHRyKCk7CisgICAgICBpZiAoaW1wb3J0ZGVmaW5pdGlvbnMpCisgICAgICB7IHRva2VuID0gcW5hbWVfdG9rZW4obWVzc2FnZSwgaW1wb3J0ZGVmaW5pdGlvbnMtPnRhcmdldE5hbWVzcGFjZSk7CisgICAgICAgIGlmICh0b2tlbikKKyAgICAgICAgeyBmb3IgKHZlY3Rvcjx3c2RsX19tZXNzYWdlPjo6aXRlcmF0b3IgbWVzc2FnZSA9IGltcG9ydGRlZmluaXRpb25zLT5tZXNzYWdlLmJlZ2luKCk7IG1lc3NhZ2UgIT0gaW1wb3J0ZGVmaW5pdGlvbnMtPm1lc3NhZ2UuZW5kKCk7ICsrbWVzc2FnZSkKKyAgICAgICAgICB7IGlmICgoKm1lc3NhZ2UpLm5hbWUgJiYgIXN0cmNtcCgoKm1lc3NhZ2UpLm5hbWUsIHRva2VuKSkKKyAgICAgICAgICAgIHsgbWVzc2FnZVJlZiA9ICYoKm1lc3NhZ2UpOworICAgICAgICAgICAgICBpZiAodmZsYWcpCisJICAgICAgICBjZXJyIDw8ICJGb3VuZCBvdXRwdXQgIiA8PCAobmFtZT9uYW1lOiIiKSA8PCAiIG1lc3NhZ2UgIiA8PCAodG9rZW4/dG9rZW46IiIpIDw8IGVuZGw7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKwl9CisgICAgICB9CisgICAgfQorICB9CisgIGlmICghbWVzc2FnZVJlZikKKyAgICBjZXJyIDw8ICJXYXJuaW5nOiBubyBmYXVsdCAnIiA8PCAobmFtZT9uYW1lOiIiKSA8PCAiJyBtZXNzYWdlICciIDw8IChtZXNzYWdlP21lc3NhZ2U6IiIpIDw8ICInIGluIFdTREwgZGVmaW5pdGlvbnMgJyIgPDwgKGRlZmluaXRpb25zLm5hbWU/ZGVmaW5pdGlvbnMubmFtZToiIikgPDwgIicgbmFtZXNwYWNlICIgPDwgKGRlZmluaXRpb25zLnRhcmdldE5hbWVzcGFjZT9kZWZpbml0aW9ucy50YXJnZXROYW1lc3BhY2U6IiIpIDw8IGVuZGw7CisgIHJldHVybiBTT0FQX09LOworfQorCit2b2lkIHdzZGxfX2ZhdWx0OjptZXNzYWdlUHRyKHdzZGxfX21lc3NhZ2UgKm1lc3NhZ2UpCit7IG1lc3NhZ2VSZWYgPSBtZXNzYWdlOworfQorCit3c2RsX19tZXNzYWdlICp3c2RsX19mYXVsdDo6bWVzc2FnZVB0cigpIGNvbnN0Cit7IHJldHVybiBtZXNzYWdlUmVmOworfQorCitpbnQgd3NkbF9fbWVzc2FnZTo6dHJhdmVyc2Uod3NkbF9fZGVmaW5pdGlvbnMmIGRlZmluaXRpb25zKQoreyBpZiAodmZsYWcpCisgICAgY2VyciA8PCAiQW5hbHl6aW5nIHdzZGwgbWVzc2FnZSIgPDwgZW5kbDsKKyAgZm9yICh2ZWN0b3I8d3NkbF9fcGFydD46Oml0ZXJhdG9yIGkgPSBwYXJ0LmJlZ2luKCk7IGkgIT0gcGFydC5lbmQoKTsgKytpKQorICAgICgqaSkudHJhdmVyc2UoZGVmaW5pdGlvbnMpOworICByZXR1cm4gU09BUF9PSzsKK30KKword3NkbF9fcGFydDo6d3NkbF9fcGFydCgpCit7IGVsZW1lbnRSZWYgPSBOVUxMOworICBzaW1wbGVUeXBlUmVmID0gTlVMTDsKKyAgY29tcGxleFR5cGVSZWYgPSBOVUxMOworfQorCitpbnQgd3NkbF9fcGFydDo6dHJhdmVyc2Uod3NkbF9fZGVmaW5pdGlvbnMmIGRlZmluaXRpb25zKQoreyBpZiAodmZsYWcpCisgICAgY2VyciA8PCAiQW5hbHl6aW5nIHdzZGwgcGFydCIgPDwgZW5kbDsKKyAgZWxlbWVudFJlZiA9IE5VTEw7CisgIHNpbXBsZVR5cGVSZWYgPSBOVUxMOworICBjb21wbGV4VHlwZVJlZiA9IE5VTEw7CisgIGlmIChkZWZpbml0aW9ucy50eXBlcykKKyAgeyBmb3IgKHZlY3Rvcjx4c19fc2NoZW1hKj46Oml0ZXJhdG9yIHNjaGVtYSA9IGRlZmluaXRpb25zLnR5cGVzLT54c19fc2NoZW1hXy5iZWdpbigpOyBzY2hlbWEgIT0gZGVmaW5pdGlvbnMudHlwZXMtPnhzX19zY2hlbWFfLmVuZCgpOyArK3NjaGVtYSkKKyAgICB7IGNvbnN0IGNoYXIgKnRva2VuID0gcW5hbWVfdG9rZW4oZWxlbWVudCwgKCpzY2hlbWEpLT50YXJnZXROYW1lc3BhY2UpOworICAgICAgaWYgKHRva2VuKQorICAgICAgeyBmb3IgKHZlY3Rvcjx4c19fZWxlbWVudD46Oml0ZXJhdG9yIGVsZW1lbnQgPSAoKnNjaGVtYSktPmVsZW1lbnQuYmVnaW4oKTsgZWxlbWVudCAhPSAoKnNjaGVtYSktPmVsZW1lbnQuZW5kKCk7ICsrZWxlbWVudCkKKyAgICAgICAgeyBpZiAoKCplbGVtZW50KS5uYW1lICYmICFzdHJjbXAoKCplbGVtZW50KS5uYW1lLCB0b2tlbikpCisgICAgICAgICAgeyBlbGVtZW50UmVmID0gJigqZWxlbWVudCk7CisgICAgICAgICAgICBpZiAodmZsYWcpCisJICAgICAgY2VyciA8PCAiRm91bmQgcGFydCAiIDw8IChuYW1lP25hbWU6IiIpIDw8ICIgZWxlbWVudCAiIDw8ICh0b2tlbj90b2tlbjoiIikgPDwgZW5kbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgdG9rZW4gPSBxbmFtZV90b2tlbih0eXBlLCAoKnNjaGVtYSktPnRhcmdldE5hbWVzcGFjZSk7CisgICAgICBpZiAodG9rZW4pCisgICAgICB7IGZvciAodmVjdG9yPHhzX19zaW1wbGVUeXBlPjo6aXRlcmF0b3Igc2ltcGxlVHlwZSA9ICgqc2NoZW1hKS0+c2ltcGxlVHlwZS5iZWdpbigpOyBzaW1wbGVUeXBlICE9ICgqc2NoZW1hKS0+c2ltcGxlVHlwZS5lbmQoKTsgKytzaW1wbGVUeXBlKQorICAgICAgICB7IGlmICgoKnNpbXBsZVR5cGUpLm5hbWUgJiYgIXN0cmNtcCgoKnNpbXBsZVR5cGUpLm5hbWUsIHRva2VuKSkKKyAgICAgICAgICB7IHNpbXBsZVR5cGVSZWYgPSAmKCpzaW1wbGVUeXBlKTsKKyAgICAgICAgICAgIGlmICh2ZmxhZykKKyAgICAgICAgICAgICAgY2VyciA8PCAiRm91bmQgcGFydCAiIDw8IChuYW1lP25hbWU6IiIpIDw8ICIgc2ltcGxlVHlwZSAiIDw8ICh0b2tlbj90b2tlbjoiIikgPDwgZW5kbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgdG9rZW4gPSBxbmFtZV90b2tlbih0eXBlLCAoKnNjaGVtYSktPnRhcmdldE5hbWVzcGFjZSk7CisgICAgICBpZiAodG9rZW4pCisgICAgICB7IGZvciAodmVjdG9yPHhzX19jb21wbGV4VHlwZT46Oml0ZXJhdG9yIGNvbXBsZXhUeXBlID0gKCpzY2hlbWEpLT5jb21wbGV4VHlwZS5iZWdpbigpOyBjb21wbGV4VHlwZSAhPSAoKnNjaGVtYSktPmNvbXBsZXhUeXBlLmVuZCgpOyArK2NvbXBsZXhUeXBlKQorICAgICAgICB7IGlmICgoKmNvbXBsZXhUeXBlKS5uYW1lICYmICFzdHJjbXAoKCpjb21wbGV4VHlwZSkubmFtZSwgdG9rZW4pKQorICAgICAgICAgIHsgY29tcGxleFR5cGVSZWYgPSAmKCpjb21wbGV4VHlwZSk7CisgICAgICAgICAgICBpZiAodmZsYWcpCisJICAgICAgY2VyciA8PCAiRm91bmQgcGFydCAiIDw8IChuYW1lP25hbWU6IiIpIDw8ICIgY29tcGxleFR5cGUgIiA8PCAodG9rZW4/dG9rZW46IiIpIDw8IGVuZGw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKCFlbGVtZW50UmVmICYmICFzaW1wbGVUeXBlUmVmICYmICFjb21wbGV4VHlwZVJlZikKKyAgeyBpZiAoZWxlbWVudCkKKyAgICB7IGlmIChpc19idWlsdGluX3FuYW1lKGVsZW1lbnQpKQorCWRlZmluaXRpb25zLmJ1aWx0aW5FbGVtZW50KGVsZW1lbnQpOworICAgICAgZWxzZQorICAgICAgICBjZXJyIDw8ICJXYXJuaW5nOiBubyBwYXJ0ICciIDw8IChuYW1lP25hbWU6IiIpIDw8ICInIGVsZW1lbnQgJyIgPDwgZWxlbWVudCA8PCAiJyBpbiBXU0RMIGRlZmluaXRpb25zICciIDw8IChkZWZpbml0aW9ucy5uYW1lP2RlZmluaXRpb25zLm5hbWU6IiIpIDw8ICInIG5hbWVzcGFjZSAiIDw8IChkZWZpbml0aW9ucy50YXJnZXROYW1lc3BhY2U/ZGVmaW5pdGlvbnMudGFyZ2V0TmFtZXNwYWNlOiIiKSA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlKQorICAgIHsgaWYgKGlzX2J1aWx0aW5fcW5hbWUodHlwZSkpCisJZGVmaW5pdGlvbnMuYnVpbHRpblR5cGUodHlwZSk7CisgICAgICBlbHNlCisgICAgICAgIGNlcnIgPDwgIldhcm5pbmc6IG5vIHBhcnQgJyIgPDwgKG5hbWU/bmFtZToiIikgPDwgIicgdHlwZSAnIiA8PCB0eXBlIDw8ICInIGluIFdTREwgZGVmaW5pdGlvbnMgJyIgPDwgKGRlZmluaXRpb25zLm5hbWU/ZGVmaW5pdGlvbnMubmFtZToiIikgPDwgIicgbmFtZXNwYWNlICIgPDwgKGRlZmluaXRpb25zLnRhcmdldE5hbWVzcGFjZT9kZWZpbml0aW9ucy50YXJnZXROYW1lc3BhY2U6IiIpIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGNlcnIgPDwgIldhcm5pbmc6IG5vIHBhcnQgJyIgPDwgKG5hbWU/bmFtZToiIikgPDwgIicgZWxlbWVudCBvciB0eXBlIGluIFdTREwgZGVmaW5pdGlvbnMgJyIgPDwgKGRlZmluaXRpb25zLm5hbWU/ZGVmaW5pdGlvbnMubmFtZToiIikgPDwgIicgbmFtZXNwYWNlICIgPDwgKGRlZmluaXRpb25zLnRhcmdldE5hbWVzcGFjZT9kZWZpbml0aW9ucy50YXJnZXROYW1lc3BhY2U6IiIpIDw8IGVuZGw7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK3ZvaWQgd3NkbF9fcGFydDo6ZWxlbWVudFB0cih4c19fZWxlbWVudCAqZWxlbWVudCkKK3sgZWxlbWVudFJlZiA9IGVsZW1lbnQ7Cit9CisKK3ZvaWQgd3NkbF9fcGFydDo6c2ltcGxlVHlwZVB0cih4c19fc2ltcGxlVHlwZSAqc2ltcGxlVHlwZSkKK3sgc2ltcGxlVHlwZVJlZiA9IHNpbXBsZVR5cGU7Cit9CisKK3ZvaWQgd3NkbF9fcGFydDo6Y29tcGxleFR5cGVQdHIoeHNfX2NvbXBsZXhUeXBlICpjb21wbGV4VHlwZSkKK3sgY29tcGxleFR5cGVSZWYgPSBjb21wbGV4VHlwZTsKK30KKworeHNfX2VsZW1lbnQgKndzZGxfX3BhcnQ6OmVsZW1lbnRQdHIoKSBjb25zdAoreyByZXR1cm4gZWxlbWVudFJlZjsKK30KKworeHNfX3NpbXBsZVR5cGUgKndzZGxfX3BhcnQ6OnNpbXBsZVR5cGVQdHIoKSBjb25zdAoreyByZXR1cm4gc2ltcGxlVHlwZVJlZjsKK30KKworeHNfX2NvbXBsZXhUeXBlICp3c2RsX19wYXJ0Ojpjb21wbGV4VHlwZVB0cigpIGNvbnN0Cit7IHJldHVybiBjb21wbGV4VHlwZVJlZjsKK30KKworaW50IHdzZGxfX3R5cGVzOjpwcmVwcm9jZXNzKHdzZGxfX2RlZmluaXRpb25zJiBkZWZpbml0aW9ucykKK3sgaWYgKHZmbGFnKQorICAgIGNlcnIgPDwgIlByZXByb2Nlc3Npbmcgd3NkbCB0eXBlcyIgPDwgZW5kbDsKKyAgLy8gc2V0IHRoZSBsb2NhdGlvbiBvZiBlYWNoIHNjaGVtYSBpbiA8dHlwZXM+IHRvIHRoZSBXU0RMJ3MgbG9jYXRpb24KKyAgZm9yICh2ZWN0b3I8eHNfX3NjaGVtYSo+OjppdGVyYXRvciBzY2hlbWEwID0geHNfX3NjaGVtYV8uYmVnaW4oKTsgc2NoZW1hMCAhPSB4c19fc2NoZW1hXy5lbmQoKTsgKytzY2hlbWEwKQorICB7IGlmICghKCpzY2hlbWEwKS0+c291cmNlTG9jYXRpb24oKSkKKyAgICAgICgqc2NoZW1hMCktPnNvdXJjZUxvY2F0aW9uKGRlZmluaXRpb25zLnNvdXJjZUxvY2F0aW9uKCkpOworICB9CithZ2FpbjoKKyAgLy8gbGluayBpbXBvcnRlZCBzY2hlbWFzLCBuZWVkIHRvIHJlcGVhdCB3aGVuIDx0eXBlcz4gaXMgZXh0ZW5kZWQgd2l0aCBuZXcgaW1wb3J0ZWQgc2NoZW1hIChmcm9tIGluc2lkZSBhbm90aGVyIHNjaGVtYSwgZXRjLikKKyAgZm9yICh2ZWN0b3I8eHNfX3NjaGVtYSo+OjppdGVyYXRvciBzY2hlbWExID0geHNfX3NjaGVtYV8uYmVnaW4oKTsgc2NoZW1hMSAhPSB4c19fc2NoZW1hXy5lbmQoKTsgKytzY2hlbWExKQorICB7IGZvciAodmVjdG9yPHhzX19pbXBvcnQ+OjppdGVyYXRvciBpbXBvcnQgPSAoKnNjaGVtYTEpLT5pbXBvcnQuYmVnaW4oKTsgaW1wb3J0ICE9ICgqc2NoZW1hMSktPmltcG9ydC5lbmQoKTsgKytpbXBvcnQpCisgICAgeyBpZiAoKCppbXBvcnQpLm5hbWVzcGFjZV8gJiYgISgqaW1wb3J0KS5zY2hlbWFQdHIoKSkKKyAgICAgIHsgZm9yICh2ZWN0b3I8eHNfX3NjaGVtYSo+Ojpjb25zdF9pdGVyYXRvciBzY2hlbWEyID0geHNfX3NjaGVtYV8uYmVnaW4oKTsgc2NoZW1hMiAhPSB4c19fc2NoZW1hXy5lbmQoKTsgKytzY2hlbWEyKQorICAgICAgICB7IGlmICgoKnNjaGVtYTIpLT50YXJnZXROYW1lc3BhY2UgJiYgIXN0cmNtcCgoKmltcG9ydCkubmFtZXNwYWNlXywgKCpzY2hlbWEyKS0+dGFyZ2V0TmFtZXNwYWNlKSkKKyAgICAgICAgICB7ICgqaW1wb3J0KS5zY2hlbWFQdHIoKnNjaGVtYTIpOworCSAgICBicmVhazsKKwkgIH0KKwl9CisgICAgICB9CisgICAgfQorICB9CisgIC8vIGlmIGEgc2NoZW1hIGlzIGltcG9ydGVkIGJ1dCBub3QgaW4gPHR5cGVzPiB0aGVuIGdldCBpdAorICBmb3IgKHZlY3Rvcjx4c19fc2NoZW1hKj46Oml0ZXJhdG9yIHNjaGVtYTIgPSB4c19fc2NoZW1hXy5iZWdpbigpOyBzY2hlbWEyICE9IHhzX19zY2hlbWFfLmVuZCgpOyArK3NjaGVtYTIpCisgIHsgZm9yICh2ZWN0b3I8eHNfX2ltcG9ydD46Oml0ZXJhdG9yIGltcG9ydCA9ICgqc2NoZW1hMiktPmltcG9ydC5iZWdpbigpOyBpbXBvcnQgIT0gKCpzY2hlbWEyKS0+aW1wb3J0LmVuZCgpOyArK2ltcG9ydCkKKyAgICB7IGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgIGlmICgoKmltcG9ydCkubmFtZXNwYWNlXykKKyAgICAgIHsgaWYgKCgqaW1wb3J0KS5zY2hlbWFQdHIoKSkKKwkgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgZWxzZQorCXsgZm9yICh2ZWN0b3I8eHNfX3NjaGVtYSo+Ojpjb25zdF9pdGVyYXRvciBzY2hlbWEzID0geHNfX3NjaGVtYV8uYmVnaW4oKTsgc2NoZW1hMyAhPSB4c19fc2NoZW1hXy5lbmQoKTsgKytzY2hlbWEzKQorICAgICAgICAgIHsgaWYgKCgqc2NoZW1hMyktPnRhcmdldE5hbWVzcGFjZSAmJiAhc3RyY21wKCgqaW1wb3J0KS5uYW1lc3BhY2VfLCAoKnNjaGVtYTMpLT50YXJnZXROYW1lc3BhY2UpKQorICAgICAgICAgICAgeyBmb3VuZCA9IHRydWU7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIH0KKwl9CisJaWYgKCFmb3VuZCkKKwl7IGZvciAoU2V0T2ZTdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGkgPSBleHR1cmlzLmJlZ2luKCk7IGkgIT0gZXh0dXJpcy5lbmQoKTsgKytpKQorCSAgeyBpZiAoIXNvYXBfdGFnX2NtcCgoKmltcG9ydCkubmFtZXNwYWNlXywgKmkpKQorICAgICAgICAgICAgeyBmb3VuZCA9IHRydWU7CisJICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoIWZvdW5kICYmICFpZmxhZykgLy8gZG9uJ3QgaW1wb3J0IGFueSBvZiB0aGUgc2NoZW1hcyBpbiB0aGUgLm5zbWFwIHRhYmxlIChvciB3aGVuIC1pIG9wdGlvbiBpcyB1c2VkKQorICAgICAgeyB4c19fc2NoZW1hICppbXBvcnRzY2hlbWE7CisgICAgICAgIGltcG9ydHNjaGVtYSA9ICgqaW1wb3J0KS5zY2hlbWFQdHIoKTsKKwlpZiAoIWltcG9ydHNjaGVtYSkKKyAgICAgICAgeyBjb25zdCBjaGFyICpzID0gKCppbXBvcnQpLnNjaGVtYUxvY2F0aW9uOworCSAgaWYgKCFzKQorCSAgICBzID0gKCppbXBvcnQpLm5hbWVzcGFjZV87CisJICBpbXBvcnRzY2hlbWEgPSBuZXcgeHNfX3NjaGVtYShkZWZpbml0aW9ucy5zb2FwLCAoKnNjaGVtYTIpLT5zb3VyY2VMb2NhdGlvbigpLCBzKTsKKwkgIGlmICghaW1wb3J0c2NoZW1hLT50YXJnZXROYW1lc3BhY2UpCisJICAgIGltcG9ydHNjaGVtYS0+dGFyZ2V0TmFtZXNwYWNlID0gKCppbXBvcnQpLm5hbWVzcGFjZV87CisJICBlbHNlIGlmICgoKmltcG9ydCkubmFtZXNwYWNlXyAmJiBzdHJjbXAoaW1wb3J0c2NoZW1hLT50YXJnZXROYW1lc3BhY2UsICgqaW1wb3J0KS5uYW1lc3BhY2VfKSkKKwkgICAgY2VyciA8PCAiU2NoZW1hIGltcG9ydCBuYW1lc3BhY2UgIiA8PCAoKCppbXBvcnQpLm5hbWVzcGFjZV8/KCppbXBvcnQpLm5hbWVzcGFjZV86IiIpIDw8ICIgZG9lcyBub3QgY29ycmVzcG9uZCB0byBpbXBvcnRlZCB0YXJnZXROYW1lc3BhY2UgIiA8PCBpbXBvcnRzY2hlbWEtPnRhcmdldE5hbWVzcGFjZSA8PCBlbmRsOworCX0KKyAgICAgICAgZm9yICh2ZWN0b3I8eHNfX3NjaGVtYSo+Ojpjb25zdF9pdGVyYXRvciBzY2hlbWEzID0geHNfX3NjaGVtYV8uYmVnaW4oKTsgc2NoZW1hMyAhPSB4c19fc2NoZW1hXy5lbmQoKTsgKytzY2hlbWEzKQorICAgICAgICB7IGlmICgoKnNjaGVtYTMpLT50YXJnZXROYW1lc3BhY2UgJiYgIXN0cmNtcCgoKmltcG9ydCkubmFtZXNwYWNlXywgKCpzY2hlbWEzKS0+dGFyZ2V0TmFtZXNwYWNlKSkKKyAgICAgICAgICB7IGZvdW5kID0gdHJ1ZTsKKwkgICAgKCppbXBvcnQpLnNjaGVtYVB0cigqc2NoZW1hMyk7CisJICAgIGJyZWFrOworCSAgfQorCX0KKwlpZiAoIWZvdW5kKQorCXsgKCppbXBvcnQpLnNjaGVtYVB0cihpbXBvcnRzY2hlbWEpOworCSAgeHNfX3NjaGVtYV8ucHVzaF9iYWNrKGltcG9ydHNjaGVtYSk7CisJICBnb3RvIGFnYWluOworCX0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK2ludCB3c2RsX190eXBlczo6dHJhdmVyc2Uod3NkbF9fZGVmaW5pdGlvbnMmIGRlZmluaXRpb25zKQoreyBpZiAodmZsYWcpCisgICAgY2VyciA8PCAiQW5hbHl6aW5nIHdzZGwgdHlwZXMiIDw8IGVuZGw7CisgIGZvciAodmVjdG9yPHhzX19zY2hlbWEqPjo6aXRlcmF0b3Igc2NoZW1hMyA9IHhzX19zY2hlbWFfLmJlZ2luKCk7IHNjaGVtYTMgIT0geHNfX3NjaGVtYV8uZW5kKCk7ICsrc2NoZW1hMykKKyAgeyAvLyBhcnRpZmljaWFsbHkgZXh0ZW5kIHRoZSA8aW1wb3J0PiBvZiBlYWNoIHNjaGVtYSB0byBpbmNsdWRlIG90aGVycyBzbyB3aGVuIHdlIHRyYXZlcnNlIHNjaGVtYXMgd2UgY2FuIHJlc29sdmUgcmVmZXJlbmNlcworICAgIGZvciAodmVjdG9yPHhzX19zY2hlbWEqPjo6aXRlcmF0b3IgaW1wb3J0c2NoZW1hID0geHNfX3NjaGVtYV8uYmVnaW4oKTsgaW1wb3J0c2NoZW1hICE9IHhzX19zY2hlbWFfLmVuZCgpOyArK2ltcG9ydHNjaGVtYSkKKyAgICB7IGlmIChzY2hlbWEzICE9IGltcG9ydHNjaGVtYSAmJiAoKmltcG9ydHNjaGVtYSktPnRhcmdldE5hbWVzcGFjZSkKKyAgICAgIHsgeHNfX2ltcG9ydCAqaW1wb3J0ID0gbmV3IHhzX19pbXBvcnQoKTsKKyAgICAgICAgaW1wb3J0LT5uYW1lc3BhY2VfID0gKCppbXBvcnRzY2hlbWEpLT50YXJnZXROYW1lc3BhY2U7CisgICAgICAgIGltcG9ydC0+c2NoZW1hUHRyKCppbXBvcnRzY2hlbWEpOworICAgICAgICAoKnNjaGVtYTMpLT5pbXBvcnQucHVzaF9iYWNrKCppbXBvcnQpOworICAgICAgfQorICAgIH0KKyAgICAvLyBjaGVjayBhbmQgcmVwb3J0CisgICAgZm9yICh2ZWN0b3I8eHNfX2ltcG9ydD46Oml0ZXJhdG9yIGltcG9ydCA9ICgqc2NoZW1hMyktPmltcG9ydC5iZWdpbigpOyBpbXBvcnQgIT0gKCpzY2hlbWEzKS0+aW1wb3J0LmVuZCgpOyArK2ltcG9ydCkKKyAgICB7IGlmICgoKmltcG9ydCkubmFtZXNwYWNlXykKKyAgICAgIHsgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICBmb3IgKHZlY3Rvcjx4c19fc2NoZW1hKj46OmNvbnN0X2l0ZXJhdG9yIGltcG9ydHNjaGVtYSA9IHhzX19zY2hlbWFfLmJlZ2luKCk7IGltcG9ydHNjaGVtYSAhPSB4c19fc2NoZW1hXy5lbmQoKTsgKytpbXBvcnRzY2hlbWEpCisJeyBpZiAoKCppbXBvcnRzY2hlbWEpLT50YXJnZXROYW1lc3BhY2UgJiYgIXN0cmNtcCgoKmltcG9ydCkubmFtZXNwYWNlXywgKCppbXBvcnRzY2hlbWEpLT50YXJnZXROYW1lc3BhY2UpKQorICAgICAgICAgIHsgZm91bmQgPSB0cnVlOworCSAgICBicmVhazsKKwkgIH0KKyAgICAgICAgfQorCWlmICghZm91bmQgJiYgdmZsYWcpCisJICBjZXJyIDw8ICJTY2hlbWEgaW1wb3J0IG5hbWVzcGFjZSAiIDw8ICgqaW1wb3J0KS5uYW1lc3BhY2VfIDw8ICIgcmVmZXJzIHRvIGEga25vd24gZXh0ZXJuYWwgU2NoZW1hIiA8PCBlbmRsOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBjZXJyIDw8ICJXYXJuaW5nOiBTY2hlbWEgaW1wb3J0ICIgPDwgKCgqaW1wb3J0KS5zY2hlbWFMb2NhdGlvbiA/ICgqaW1wb3J0KS5zY2hlbWFMb2NhdGlvbiA6ICIiKSA8PCAiIGhhcyBubyBuYW1lc3BhY2UiIDw8IGVuZGw7CisgICAgfQorICB9CisgIC8vIHRyYXZlcnNlIHRoZSBzY2hlbWFzCisgIGZvciAodmVjdG9yPHhzX19zY2hlbWEqPjo6aXRlcmF0b3Igc2NoZW1hNCA9IHhzX19zY2hlbWFfLmJlZ2luKCk7IHNjaGVtYTQgIT0geHNfX3NjaGVtYV8uZW5kKCk7ICsrc2NoZW1hNCkKKyAgICAoKnNjaGVtYTQpLT50cmF2ZXJzZSgpOworICAvLyBmaW5kIGFsbCBidWlsdC1pbiB0eXBlcywgZWxlbWVudHMsIGFuZCBhdHRyaWJ1dGVzCisgIGZvciAodmVjdG9yPHhzX19zY2hlbWEqPjo6aXRlcmF0b3Igc2NoZW1hNSA9IHhzX19zY2hlbWFfLmJlZ2luKCk7IHNjaGVtYTUgIT0geHNfX3NjaGVtYV8uZW5kKCk7ICsrc2NoZW1hNSkKKyAgeyBpZiAodmZsYWcpCisgICAgICBmb3IgKFNldE9mU3RyaW5nOjpjb25zdF9pdGVyYXRvciBpID0gKCpzY2hlbWE1KS0+YnVpbHRpblR5cGVzKCkuYmVnaW4oKTsgaSAhPSAoKnNjaGVtYTUpLT5idWlsdGluVHlwZXMoKS5lbmQoKTsgKytpKQorICAgICAgICBjZXJyIDw8ICJGb3VuZCBidWlsdC1pbiBzY2hlbWEgdHlwZTogIiA8PCAoKmkpIDw8IGVuZGw7CisgICAgZGVmaW5pdGlvbnMuYnVpbHRpblR5cGVzKCgqc2NoZW1hNSktPmJ1aWx0aW5UeXBlcygpKTsKKyAgICBkZWZpbml0aW9ucy5idWlsdGluRWxlbWVudHMoKCpzY2hlbWE1KS0+YnVpbHRpbkVsZW1lbnRzKCkpOworICAgIGRlZmluaXRpb25zLmJ1aWx0aW5BdHRyaWJ1dGVzKCgqc2NoZW1hNSktPmJ1aWx0aW5BdHRyaWJ1dGVzKCkpOworICB9CisgIHJldHVybiBTT0FQX09LOworfQorCitpbnQgd3NkbF9faW1wb3J0OjpwcmVwcm9jZXNzKHdzZGxfX2RlZmluaXRpb25zJiBkZWZpbml0aW9ucykKK3sgYm9vbCBmb3VuZCA9IGZhbHNlOworICBpZiAodmZsYWcpCisgICAgY2VyciA8PCAiUHJlcHJvY2VzcyB3c2RsIGltcG9ydCAiIDw8IChsb2NhdGlvbj9sb2NhdGlvbjoiIikgPDwgZW5kbDsKKyAgZGVmaW5pdGlvbnNSZWYgPSBOVUxMOworICBpZiAobmFtZXNwYWNlXykKKyAgeyBmb3IgKFNldE9mU3RyaW5nOjpjb25zdF9pdGVyYXRvciBpID0gZXh0dXJpcy5iZWdpbigpOyBpICE9IGV4dHVyaXMuZW5kKCk7ICsraSkKKyAgICB7IGlmICghc29hcF90YWdfY21wKG5hbWVzcGFjZV8sICppKSkKKyAgICAgIHsgZm91bmQgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKCFmb3VuZCAmJiBsb2NhdGlvbikKKyAgeyAvLyBwYXJzZSBpbXBvcnRlZCBkZWZpbml0aW9ucworICAgIGRlZmluaXRpb25zUmVmID0gbmV3IHdzZGxfX2RlZmluaXRpb25zKGRlZmluaXRpb25zLnNvYXAsIGRlZmluaXRpb25zLnNvdXJjZUxvY2F0aW9uKCksIGxvY2F0aW9uKTsKKyAgICBpZiAoIWRlZmluaXRpb25zUmVmKQorICAgICAgcmV0dXJuIFNPQVBfRU9GOworICAgIGlmICghbmFtZXNwYWNlXykKKyAgICAgIG5hbWVzcGFjZV8gPSBkZWZpbml0aW9uc1JlZi0+dGFyZ2V0TmFtZXNwYWNlOworICAgIGVsc2UgaWYgKCFkZWZpbml0aW9uc1JlZi0+dGFyZ2V0TmFtZXNwYWNlIHx8ICEqZGVmaW5pdGlvbnNSZWYtPnRhcmdldE5hbWVzcGFjZSkKKyAgICAgIGRlZmluaXRpb25zUmVmLT50YXJnZXROYW1lc3BhY2UgPSBuYW1lc3BhY2VfOworICAgIGVsc2UgaWYgKHN0cmNtcChuYW1lc3BhY2VfLCBkZWZpbml0aW9uc1JlZi0+dGFyZ2V0TmFtZXNwYWNlKSkKKyAgICAgIGNlcnIgPDwgIkVycm9yOiBXU0RMIGRlZmluaXRpb25zL2ltcG9ydCAiIDw8IGxvY2F0aW9uIDw8ICIgbmFtZXNwYWNlICIgPDwgbmFtZXNwYWNlXyA8PCAiIGRvZXMgbm90IG1hdGNoIGltcG9ydGVkIHRhcmdldE5hbWVzcGFjZSAiIDw8IGRlZmluaXRpb25zUmVmLT50YXJnZXROYW1lc3BhY2UgPDwgZW5kbDsKKyAgfQorICBlbHNlIGlmICghZm91bmQpCisgICAgY2VyciA8PCAiV1NETCBkZWZpbml0aW9ucy9pbXBvcnQgaGFzIG5vIGxvY2F0aW9uIGF0dHJpYnV0ZSIgPDwgZW5kbDsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK2ludCB3c2RsX19pbXBvcnQ6OnRyYXZlcnNlKHdzZGxfX2RlZmluaXRpb25zJiBkZWZpbml0aW9ucykKK3sgaWYgKHZmbGFnKQorICAgIGNlcnIgPDwgIkFuYWx5emluZyB3c2RsIGltcG9ydCAiIDw8IChsb2NhdGlvbj9sb2NhdGlvbjoiIikgPDwgZW5kbDsKKyAgaWYgKGRlZmluaXRpb25zUmVmKQorICB7IGZvciAodmVjdG9yPHdzZGxfX21lc3NhZ2U+OjppdGVyYXRvciBtZyA9IGRlZmluaXRpb25zUmVmLT5tZXNzYWdlLmJlZ2luKCk7IG1nICE9IGRlZmluaXRpb25zUmVmLT5tZXNzYWdlLmVuZCgpOyArK21nKQorICAgICAgKCptZykudHJhdmVyc2UoZGVmaW5pdGlvbnMpOworICAgIC8vIHByb2Nlc3MgcG9ydFR5cGVzIGJlZm9yZSBiaW5kaW5ncworICAgIGZvciAodmVjdG9yPHdzZGxfX3BvcnRUeXBlPjo6aXRlcmF0b3IgcHQgPSBkZWZpbml0aW9uc1JlZi0+cG9ydFR5cGUuYmVnaW4oKTsgcHQgIT0gZGVmaW5pdGlvbnNSZWYtPnBvcnRUeXBlLmVuZCgpOyArK3B0KQorICAgICAgKCpwdCkudHJhdmVyc2UoZGVmaW5pdGlvbnMpOworICAgIC8vIHByb2Nlc3MgYmluZGluZ3MKKyAgICBmb3IgKHZlY3Rvcjx3c2RsX19iaW5kaW5nPjo6aXRlcmF0b3IgYmcgPSBkZWZpbml0aW9uc1JlZi0+YmluZGluZy5iZWdpbigpOyBiZyAhPSBkZWZpbml0aW9uc1JlZi0+YmluZGluZy5lbmQoKTsgKytiZykKKyAgICAgICgqYmcpLnRyYXZlcnNlKGRlZmluaXRpb25zKTsKKyAgICAvLyBwcm9jZXNzIHNlcnZpY2VzCisgICAgZm9yICh2ZWN0b3I8d3NkbF9fc2VydmljZT46Oml0ZXJhdG9yIHN2ID0gZGVmaW5pdGlvbnNSZWYtPnNlcnZpY2UuYmVnaW4oKTsgc3YgIT0gZGVmaW5pdGlvbnNSZWYtPnNlcnZpY2UuZW5kKCk7ICsrc3YpCisgICAgICAoKnN2KS50cmF2ZXJzZShkZWZpbml0aW9ucyk7CisgIH0KKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKK3ZvaWQgd3NkbF9faW1wb3J0OjpkZWZpbml0aW9uc1B0cih3c2RsX19kZWZpbml0aW9ucyAqZGVmaW5pdGlvbnMpCit7IGRlZmluaXRpb25zUmVmID0gZGVmaW5pdGlvbnM7Cit9CisKK3dzZGxfX2RlZmluaXRpb25zICp3c2RsX19pbXBvcnQ6OmRlZmluaXRpb25zUHRyKCkgY29uc3QKK3sgcmV0dXJuIGRlZmluaXRpb25zUmVmOworfQorCit3c2RsX19pbXBvcnQ6OndzZGxfX2ltcG9ydCgpCit7IGRlZmluaXRpb25zUmVmID0gTlVMTDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwlzdHJlYW1zCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworb3N0cmVhbSAmb3BlcmF0b3I8PChvc3RyZWFtICZvLCBjb25zdCB3c2RsX19kZWZpbml0aW9ucyAmZSkKK3sgaWYgKCFlLnNvYXApCisgIHsgc3RydWN0IHNvYXAgc29hcDsKKyAgICBzb2FwX2luaXQyKCZzb2FwLCBTT0FQX0lPX0RFRkFVTFQsIFNPQVBfWE1MX1RSRUUgfCBTT0FQX0NfVVRGU1RSSU5HKTsKKyNpZmRlZiBXSVRIX05PTkFNRVNQQUNFUworICAgIHNvYXBfc2V0X25hbWVzcGFjZXMoJnNvYXAsIG5hbWVzcGFjZXMpOworI2VuZGlmCisgICAgZS5zb2FwX3NlcmlhbGl6ZSgmc29hcCk7CisgICAgc29hcF9iZWdpbl9zZW5kKCZzb2FwKTsKKyAgICBlLnNvYXBfb3V0KCZzb2FwLCAid3NkbDpkZWZpbml0aW9ucyIsIDAsIE5VTEwpOworICAgIHNvYXBfZW5kX3NlbmQoJnNvYXApOworICAgIHNvYXBfZGVzdHJveSgmc29hcCk7CisgICAgc29hcF9lbmQoJnNvYXApOworICAgIHNvYXBfZG9uZSgmc29hcCk7CisgIH0KKyAgZWxzZQorICB7IG9zdHJlYW0gKm9zID0gZS5zb2FwLT5vczsKKyAgICBlLnNvYXAtPm9zID0gJm87CisgICAgZS5zb2FwX3NlcmlhbGl6ZShlLnNvYXApOworICAgIHNvYXBfYmVnaW5fc2VuZChlLnNvYXApOworICAgIGUuc29hcF9vdXQoZS5zb2FwLCAid3NkbDpkZWZpbml0aW9ucyIsIDAsIE5VTEwpOworICAgIHNvYXBfZW5kX3NlbmQoZS5zb2FwKTsKKyAgICBlLnNvYXAtPm9zID0gb3M7CisgIH0KKyAgcmV0dXJuIG87Cit9CisKK2lzdHJlYW0gJm9wZXJhdG9yPj4oaXN0cmVhbSAmaSwgd3NkbF9fZGVmaW5pdGlvbnMgJmUpCit7IGlmICghZS5zb2FwKQorICAgIGUuc29hcCA9IHNvYXBfbmV3MShTT0FQX1hNTF9UUkVFIHwgU09BUF9DX1VURlNUUklORyk7CisjaWZkZWYgV0lUSF9OT05BTUVTUEFDRVMKKyAgc29hcF9zZXRfbmFtZXNwYWNlcyhlLnNvYXAsIG5hbWVzcGFjZXMpOworI2VuZGlmCisgIGlzdHJlYW0gKmlzID0gZS5zb2FwLT5pczsKKyAgZS5zb2FwLT5pcyA9ICZpOworICBpZiAoc29hcF9iZWdpbl9yZWN2KGUuc29hcCkKKyAgIHx8ICFlLnNvYXBfaW4oZS5zb2FwLCAid3NkbDpkZWZpbml0aW9ucyIsIE5VTEwpCisgICB8fCBzb2FwX2VuZF9yZWN2KGUuc29hcCkpCisgIHsgLy8gaGFuZGxlIGVycm9yPyBOb3RlOiBlLnNvYXAtPmVycm9yIGlzIHNldCBhbmQgYXBwIHNob3VsZCBjaGVjaworICB9CisgIGUuc29hcC0+aXMgPSBpczsKKyAgcmV0dXJuIGk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JTWlzY2VsbGFuZW91cworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2ludCB3YXJuX2lnbm9yZShzdHJ1Y3Qgc29hcCAqc29hcCwgY29uc3QgY2hhciAqdGFnKQoreyAvLyBXZSBkb24ndCB3YXJuIGlmIHRoZSBvbWl0dGVkIGVsZW1lbnQgd2FzIGFuIGFubm90YXRpb24gb3IgYSBkb2N1bWVudGF0aW9uIGluIGFuIHVuZXhwZWN0ZWQgcGxhY2UKKyAgaWYgKHNvYXBfbWF0Y2hfdGFnKHNvYXAsIHRhZywgInhzOmFubm90YXRpb24iKSAmJiBzb2FwX21hdGNoX3RhZyhzb2FwLCB0YWcsICJ4czpkb2N1bWVudGF0aW9uIikpCisgICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBlbGVtZW50ICclcycgYXQgbGV2ZWwgJWQgd2FzIG5vdCByZWNvZ25pemVkIGFuZCB3aWxsIGJlIGlnbm9yZWRcbiIsIHRhZywgc29hcC0+bGV2ZWwpOworICByZXR1cm4gU09BUF9PSzsKK30KKworaW50IHNob3dfaWdub3JlKHN0cnVjdCBzb2FwICpzb2FwLCBjb25zdCBjaGFyICp0YWcpCit7IHdhcm5faWdub3JlKHNvYXAsIHRhZyk7CisgIHNvYXBfcHJpbnRfZmF1bHRfbG9jYXRpb24oc29hcCwgc3RkZXJyKTsKKyAgcmV0dXJuIFNPQVBfT0s7Cit9CisKZGlmZiAtLWdpdCBhL3dzZGwvd3NkbC5oIGIvd3NkbC93c2RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcxMWRiZAotLS0gL2Rldi9udWxsCisrKyBiL3dzZGwvd3NkbC5oCkBAIC0wLDAgKzEsMzE0IEBACisvKgorCit3c2RsLmgKKworV1NETCAxLjEgYmluZGluZyBzY2hlbWEgaW50ZXJmYWNlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzCitDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1RoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzOgorR1BMIG9yIEdlbml2aWEncyBsaWNlbnNlIGZvciBjb21tZXJjaWFsIHVzZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHUEwgbGljZW5zZS4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246CitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisvL2dzb2Fwb3B0IHcKKworLy9nc29hcCB3c2RsIHNjaGVtYSBkb2N1bWVudGF0aW9uOglXU0RMIDEuMSBiaW5kaW5nIHNjaGVtYQorLy9nc29hcCB3c2RsIHNjaGVtYSBuYW1lc3BhY2U6CQlodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLworLy9nc29hcCB3c2RsIHNjaGVtYSBlbGVtZW50Rm9ybToJcXVhbGlmaWVkCisvL2dzb2FwIHdzZGwgc2NoZW1hIGF0dHJpYnV0ZUZvcm06CXVucXVhbGlmaWVkCisKKyNpbXBvcnQgImltcG9ydHMuaCIKKyNpbXBvcnQgInNjaGVtYS5oIgorI2ltcG9ydCAic29hcC5oIgorI2ltcG9ydCAibWltZS5oIgorI2ltcG9ydCAiZGltZS5oIgorI2ltcG9ydCAiaHR0cC5oIgorI2ltcG9ydCAiZ3dzZGwuaCIKKworY2xhc3Mgd3NkbF9fZGVmaW5pdGlvbnM7CQkvLyBmb3J3YXJkIGRlY2xhcmF0aW9uCisKK2NsYXNzIHdzZGxfX2ltcG9ydAoreyBwdWJsaWM6CisJQHhzZF9fYW55VVJJCQkJbmFtZXNwYWNlXzsKKwlAeHNkX19hbnlVUkkJCQlsb2NhdGlvbjsKKyAgcHJpdmF0ZToKKyAgCXdzZGxfX2RlZmluaXRpb25zCQkqZGVmaW5pdGlvbnNSZWY7CisgIHB1YmxpYzoKKwkJCQkJd3NkbF9faW1wb3J0KCk7CisJaW50CQkJCXByZXByb2Nlc3Mod3NkbF9fZGVmaW5pdGlvbnMmKTsKKyAgCWludAkJCQl0cmF2ZXJzZSh3c2RsX19kZWZpbml0aW9ucyYpOworCXZvaWQJCQkJZGVmaW5pdGlvbnNQdHIod3NkbF9fZGVmaW5pdGlvbnMqKTsKKwl3c2RsX19kZWZpbml0aW9ucwkJKmRlZmluaXRpb25zUHRyKCkgY29uc3Q7Cit9OworCitjbGFzcyB3c2RsX190eXBlcworeyBwdWJsaWM6CisJeHNkX19zdHJpbmcJCQlkb2N1bWVudGF0aW9uOwkJLy8gPHdzZGw6ZG9jdW1lbnRhdGlvbj4/CisJc3RkOjp2ZWN0b3I8eHNfX3NjaGVtYSo+CXhzX19zY2hlbWFfOyAJCS8vIDx4czpzY2hlbWE+KgorICBwdWJsaWM6CisJaW50CQkJCXByZXByb2Nlc3Mod3NkbF9fZGVmaW5pdGlvbnMmKTsKKwlpbnQJCQkJdHJhdmVyc2Uod3NkbF9fZGVmaW5pdGlvbnMmKTsKK307CisKK2NsYXNzIHdzZGxfX3BhcnQKK3sgcHVibGljOgorCUB4c2RfX05NVE9LRU4JCQluYW1lOworCUB4c2RfX1FOYW1lCQkJZWxlbWVudDsKKwlAeHNkX19RTmFtZQkJCXR5cGU7CisJeHNkX19zdHJpbmcJCQlkb2N1bWVudGF0aW9uOwkJLy8gPHdzZGw6ZG9jdW1lbnRhdGlvbj4/CisgIHByaXZhdGU6CisgIAl4c19fZWxlbWVudAkJCSplbGVtZW50UmVmOwkJLy8gdHJhdmVyc2UoKSBmaW5kcyBlbGVtZW50CisgIAl4c19fc2ltcGxlVHlwZQkJCSpzaW1wbGVUeXBlUmVmOwkJLy8gdHJhdmVyc2UoKSBmaW5kcyBzaW1wbGVUeXBlCisgIAl4c19fY29tcGxleFR5cGUJCQkqY29tcGxleFR5cGVSZWY7CS8vIHRyYXZlcnNlKCkgZmluZHMgY29tcGxleFR5cGUKKyAgcHVibGljOgorCQkJCQl3c2RsX19wYXJ0KCk7CisgIAlpbnQJCQkJdHJhdmVyc2Uod3NkbF9fZGVmaW5pdGlvbnMmKTsKKwl2b2lkCQkJCWVsZW1lbnRQdHIoeHNfX2VsZW1lbnQqKTsKKwl2b2lkCQkJCXNpbXBsZVR5cGVQdHIoeHNfX3NpbXBsZVR5cGUqKTsKKwl2b2lkCQkJCWNvbXBsZXhUeXBlUHRyKHhzX19jb21wbGV4VHlwZSopOworCXhzX19lbGVtZW50CQkJKmVsZW1lbnRQdHIoKSBjb25zdDsKKwl4c19fc2ltcGxlVHlwZQkJCSpzaW1wbGVUeXBlUHRyKCkgY29uc3Q7CisJeHNfX2NvbXBsZXhUeXBlCQkJKmNvbXBsZXhUeXBlUHRyKCkgY29uc3Q7Cit9OworCitjbGFzcyB3c2RsX19tZXNzYWdlCit7IHB1YmxpYzoKKwlAeHNkX19OTVRPS0VOCQkJbmFtZTsKKwl4c2RfX3N0cmluZwkJCWRvY3VtZW50YXRpb247CQkvLyA8d3NkbDpkb2N1bWVudGF0aW9uPj8KKwlzdGQ6OnZlY3Rvcjx3c2RsX19wYXJ0PgkJcGFydDsJCQkvLyA8d3NkbDpwYXJ0PioKKyAgcHVibGljOgorICAJaW50CQkJCXRyYXZlcnNlKHdzZGxfX2RlZmluaXRpb25zJik7Cit9OworCitjbGFzcyB3c2RsX19pbnB1dAoreyBwdWJsaWM6CisJQHhzZF9fTk1UT0tFTgkJCW5hbWU7CisJQHhzZF9fUU5hbWUJCQltZXNzYWdlOworCXhzZF9fc3RyaW5nCQkJZG9jdW1lbnRhdGlvbjsJCS8vIDx3c2RsOmRvY3VtZW50YXRpb24+PworICBwcml2YXRlOgorICAJd3NkbF9fbWVzc2FnZQkJCSptZXNzYWdlUmVmOwkJLy8gdHJhdmVyc2UoKSBmaW5kcyBtZXNzYWdlCisgIHB1YmxpYzoKKyAgCQkJCQl3c2RsX19pbnB1dCgpOworICAJaW50CQkJCXRyYXZlcnNlKHdzZGxfX2RlZmluaXRpb25zJik7CisJdm9pZAkJCQltZXNzYWdlUHRyKHdzZGxfX21lc3NhZ2UqKTsKKwl3c2RsX19tZXNzYWdlCQkJKm1lc3NhZ2VQdHIoKSBjb25zdDsKK307CisKK2NsYXNzIHdzZGxfX291dHB1dAoreyBwdWJsaWM6CisJQHhzZF9fTk1UT0tFTgkJCW5hbWU7CisJQHhzZF9fUU5hbWUJCQltZXNzYWdlOworCXhzZF9fc3RyaW5nCQkJZG9jdW1lbnRhdGlvbjsJCS8vIDx3c2RsOmRvY3VtZW50YXRpb24+PworICBwcml2YXRlOgorICAJd3NkbF9fbWVzc2FnZQkJCSptZXNzYWdlUmVmOwkJLy8gdHJhdmVyc2UoKSBmaW5kcyBtZXNzYWdlCisgIHB1YmxpYzoKKwkJCQkJd3NkbF9fb3V0cHV0KCk7CisgIAlpbnQJCQkJdHJhdmVyc2Uod3NkbF9fZGVmaW5pdGlvbnMmKTsKKwl2b2lkCQkJCW1lc3NhZ2VQdHIod3NkbF9fbWVzc2FnZSopOworCXdzZGxfX21lc3NhZ2UJCQkqbWVzc2FnZVB0cigpIGNvbnN0OworfTsKKworY2xhc3Mgd3NkbF9fZmF1bHQKK3sgcHVibGljOgorCUB4c2RfX05NVE9LRU4JCQluYW1lOworCUB4c2RfX1FOYW1lCQkJbWVzc2FnZTsKKwl4c2RfX3N0cmluZwkJCWRvY3VtZW50YXRpb247CQkvLyA8d3NkbDpkb2N1bWVudGF0aW9uPj8KKyAgcHJpdmF0ZToKKyAgCXdzZGxfX21lc3NhZ2UJCQkqbWVzc2FnZVJlZjsJCS8vIHRyYXZlcnNlKCkgZmluZHMgbWVzc2FnZQorICBwdWJsaWM6CisgIAkJCQkJd3NkbF9fZmF1bHQoKTsKKyAgCWludAkJCQl0cmF2ZXJzZSh3c2RsX19kZWZpbml0aW9ucyYpOworCXZvaWQJCQkJbWVzc2FnZVB0cih3c2RsX19tZXNzYWdlKik7CisJd3NkbF9fbWVzc2FnZQkJCSptZXNzYWdlUHRyKCkgY29uc3Q7Cit9OworCitjbGFzcyB3c2RsX19vcGVyYXRpb24KK3sgcHVibGljOgorCUB4c2RfX05NVE9LRU4JCQluYW1lOworCUB4c2RfX3N0cmluZwkJCXBhcmFtZXRlck9yZGVyOworCXhzZF9fc3RyaW5nCQkJZG9jdW1lbnRhdGlvbjsJCS8vIDx3c2RsOmRvY3VtZW50YXRpb24+PworCXdzZGxfX2lucHV0CQkJKmlucHV0OwkJCS8vIDx3c2RsOmlucHV0Pj8KKwl3c2RsX19vdXRwdXQJCQkqb3V0cHV0OwkJLy8gPHdzZGw6b3V0cHV0Pj8KKwlzdGQ6OnZlY3Rvcjx3c2RsX19mYXVsdD4JZmF1bHQ7CQkJLy8gPHdzZGw6ZmF1bHQ+KgorICBwdWJsaWM6CisgIAlpbnQJCQkJdHJhdmVyc2Uod3NkbF9fZGVmaW5pdGlvbnMmKTsKK307CisKK2NsYXNzIHdzZGxfX3BvcnRUeXBlCit7IHB1YmxpYzoKKwlAeHNkX19OTVRPS0VOCQkJbmFtZTsKKwl4c2RfX3N0cmluZwkJCWRvY3VtZW50YXRpb247CQkvLyA8d3NkbDpkb2N1bWVudGF0aW9uPj8KKwlzdGQ6OnZlY3Rvcjx3c2RsX19vcGVyYXRpb24+CW9wZXJhdGlvbjsJCS8vIDx3c2RsOm9wZXJhdGlvbj4qCisgIHB1YmxpYzoKKyAgCWludAkJCQl0cmF2ZXJzZSh3c2RsX19kZWZpbml0aW9ucyYpOworfTsJCisKK2NsYXNzIHdzZGxfX2V4dF9pbnB1dAkJCS8vIGV4dGVuc2liaWxpdHkgZWxlbWVudAoreyBwdWJsaWM6CisJeHNkX19zdHJpbmcJCQlkb2N1bWVudGF0aW9uOwkJLy8gPHdzZGw6ZG9jdW1lbnRhdGlvbj4/CisJZGltZV9fbWVzc2FnZQkJCSpkaW1lX19tZXNzYWdlXzsJLy8gPGRpbWU6bWVzc2FnZT4/CisJc29hcF9fYm9keQkJCSpzb2FwX19ib2R5XzsJCS8vIDxzb2FwOmJvZHk+PworCW1pbWVfX211bHRpcGFydFJlbGF0ZWQJCSptaW1lX19tdWx0aXBhcnRSZWxhdGVkXzsvLyA8bWltZTptdWx0aXBhcnRSZWxhdGVkPj8KKwltaW1lX19jb250ZW50CQkJKm1pbWVfX2NvbnRlbnRfOwkvLyA8bWltZTpjb250ZW50Pj8KKwlzdGQ6OnZlY3Rvcjxzb2FwX19oZWFkZXI+CXNvYXBfX2hlYWRlcl87CQkvLyA8c29hcDpoZWFkZXI+KgorICBwdWJsaWM6CisgIAlpbnQJCQkJdHJhdmVyc2Uod3NkbF9fZGVmaW5pdGlvbnMmKTsKK307CisKK2NsYXNzIHdzZGxfX2V4dF9vdXRwdXQJCQkvLyBleHRlbnNpYmlsaXR5IGVsZW1lbnQKK3sgcHVibGljOgorCXhzZF9fc3RyaW5nCQkJZG9jdW1lbnRhdGlvbjsJCS8vIDx3c2RsOmRvY3VtZW50YXRpb24+PworCWRpbWVfX21lc3NhZ2UJCQkqZGltZV9fbWVzc2FnZV87CS8vIDxkaW1lOm1lc3NhZ2U+PworCXNvYXBfX2JvZHkJCQkqc29hcF9fYm9keV87CQkvLyA8c29hcDpib2R5Pj8KKwltaW1lX19tdWx0aXBhcnRSZWxhdGVkCQkqbWltZV9fbXVsdGlwYXJ0UmVsYXRlZF87Ly8gPG1pbWU6bXVsdGlwYXJ0UmVsYXRlZD4/CisJbWltZV9fY29udGVudAkJCSptaW1lX19jb250ZW50XzsJLy8gPG1pbWU6Y29udGVudD4/CisJc3RkOjp2ZWN0b3I8c29hcF9faGVhZGVyPglzb2FwX19oZWFkZXJfOwkJLy8gPHNvYXA6aGVhZGVyPioKKyAgcHVibGljOgorICAJaW50CQkJCXRyYXZlcnNlKHdzZGxfX2RlZmluaXRpb25zJik7Cit9OworCitjbGFzcyB3c2RsX19leHRfZmF1bHQJCQkvLyBleHRlbnNpYmlsaXR5IGVsZW1lbnQKK3sgcHVibGljOgorCUB4c2RfX05NVE9LRU4JCQluYW1lOworCXhzZF9fc3RyaW5nCQkJZG9jdW1lbnRhdGlvbjsJCS8vIDx3c2RsOmRvY3VtZW50YXRpb24+PworCXNvYXBfX2ZhdWx0CQkJKnNvYXBfX2ZhdWx0XzsJCS8vIDxzb2FwOmZhdWx0Pj8KKyAgcHJpdmF0ZToKKyAgCXdzZGxfX21lc3NhZ2UJCQkqbWVzc2FnZVJlZjsKKyAgcHVibGljOgorICAJCQkJCXdzZGxfX2V4dF9mYXVsdCgpOworICAJaW50CQkJCXRyYXZlcnNlKHdzZGxfX2RlZmluaXRpb25zJik7CisJdm9pZAkJCQltZXNzYWdlUHRyKHdzZGxfX21lc3NhZ2UqKTsKKwl3c2RsX19tZXNzYWdlCQkJKm1lc3NhZ2VQdHIoKSBjb25zdDsKK307CisKK2NsYXNzIHdzZGxfX2JpbmRpbmdfb3BlcmF0aW9uCit7IHB1YmxpYzoKKwlAeHNkX19OTVRPS0VOCQkJbmFtZTsKKwl4c2RfX3N0cmluZwkJCWRvY3VtZW50YXRpb247CQkvLyA8d3NkbDpkb2N1bWVudGF0aW9uPj8KKwlzb2FwX19vcGVyYXRpb24JCQkqc29hcF9fb3BlcmF0aW9uXzsJLy8gPHNvYXA6b3BlcmF0aW9uPj8KKwlodHRwX19vcGVyYXRpb24JCQkqaHR0cF9fb3BlcmF0aW9uXzsJLy8gPGh0dHA6b3BlcmF0aW9uPj8KKwl3c2RsX19leHRfaW5wdXQJCQkqaW5wdXQ7CQkJLy8gPHdzZGw6aW5wdXQ+PworCXdzZGxfX2V4dF9vdXRwdXQJCSpvdXRwdXQ7CQkvLyA8d3NkbDpvdXRwdXQ+PworCXN0ZDo6dmVjdG9yPHdzZGxfX2V4dF9mYXVsdD4JZmF1bHQ7CQkJLy8gPHdzZGw6ZmF1bHQ+KgorICBwcml2YXRlOgorICAJd3NkbF9fb3BlcmF0aW9uCQkJKm9wZXJhdGlvblJlZjsJCS8vIHRyYXZlcnNlKCkgZmluZHMgb3BlcmF0aW9uIGluIDx3c2RsOnBvcnRUeXBlPgorICBwdWJsaWM6CisgIAkJCQkJd3NkbF9fYmluZGluZ19vcGVyYXRpb24oKTsKKyAgCWludAkJCQl0cmF2ZXJzZSh3c2RsX19kZWZpbml0aW9ucyYsIHdzZGxfX3BvcnRUeXBlKik7CisJdm9pZAkJCQlvcGVyYXRpb25QdHIod3NkbF9fb3BlcmF0aW9uKik7CisJd3NkbF9fb3BlcmF0aW9uCQkJKm9wZXJhdGlvblB0cigpIGNvbnN0OworfTsKKworY2xhc3Mgd3NkbF9fYmluZGluZworeyBwdWJsaWM6CisJQHhzZF9fTk1UT0tFTgkJCW5hbWU7CisJQHhzZF9fUU5hbWUJCQl0eXBlOworCXhzZF9fc3RyaW5nCQkJZG9jdW1lbnRhdGlvbjsJCS8vIDx3c2RsOmRvY3VtZW50YXRpb24+PworCXNvYXBfX2JpbmRpbmcJCQkqc29hcF9fYmluZGluZ187CS8vIDxzb2FwOmJpbmRpbmc+PworCWh0dHBfX2JpbmRpbmcJCQkqaHR0cF9fYmluZGluZ187CS8vIDxodHRwOmJpbmRpbmc+PworCXN0ZDo6dmVjdG9yPHdzZGxfX2JpbmRpbmdfb3BlcmF0aW9uPgorCQkJCQlvcGVyYXRpb247CQkvLyA8d3NkbDpvcGVyYXRpb24+KgorICBwcml2YXRlOgorCXdzZGxfX3BvcnRUeXBlCQkJKnBvcnRUeXBlUmVmOwkJLy8gdHJhdmVyc2UoKSBmaW5kcyBwb3J0VHlwZQorICBwdWJsaWM6CisJCQkJCXdzZGxfX2JpbmRpbmcoKTsKKwlpbnQJCQkJdHJhdmVyc2Uod3NkbF9fZGVmaW5pdGlvbnMmKTsKKwl2b2lkCQkJCXBvcnRUeXBlUHRyKHdzZGxfX3BvcnRUeXBlKik7CisJd3NkbF9fcG9ydFR5cGUJCQkqcG9ydFR5cGVQdHIoKSBjb25zdDsKK307CisKK2NsYXNzIHdzZGxfX3BvcnQKK3sgcHVibGljOgorCUB4c2RfX05NVE9LRU4JCQluYW1lOworCUB4c2RfX1FOYW1lCQkJYmluZGluZzsKKwl4c2RfX3N0cmluZwkJCWRvY3VtZW50YXRpb247CQkvLyA8d3NkbDpkb2N1bWVudGF0aW9uPj8KKwlzb2FwX19hZGRyZXNzCQkJKnNvYXBfX2FkZHJlc3NfOwkvLyA8c29hcDphZGRyZXNzPj8KKwlodHRwX19hZGRyZXNzCQkJKmh0dHBfX2FkZHJlc3NfOwkvLyA8aHR0cDphZGRyZXNzPj8KKyAgcHJpdmF0ZToKKwl3c2RsX19iaW5kaW5nCQkJKmJpbmRpbmdSZWY7CQkvLyB0cmF2ZXJzZSgpIGZpbmRzIGJpbmRpbmcKKyAgcHVibGljOgorICAJCQkJCXdzZGxfX3BvcnQoKTsKKwlpbnQJCQkJdHJhdmVyc2Uod3NkbF9fZGVmaW5pdGlvbnMmKTsKKwl2b2lkCQkJCWJpbmRpbmdQdHIod3NkbF9fYmluZGluZyopOworCXdzZGxfX2JpbmRpbmcJCQkqYmluZGluZ1B0cigpIGNvbnN0OworfTsKKworY2xhc3Mgd3NkbF9fc2VydmljZQoreyBwdWJsaWM6CisJQHhzZF9fTk1UT0tFTgkJCW5hbWU7CisJeHNkX19zdHJpbmcJCQlkb2N1bWVudGF0aW9uOwkJLy8gPHdzZGw6ZG9jdW1lbnRhdGlvbj4/CisJc3RkOjp2ZWN0b3I8d3NkbF9fcG9ydD4JCXBvcnQ7CQkJLy8gPHdzZGw6cG9ydD4qCisgIHB1YmxpYzoKKwlpbnQJCQkJdHJhdmVyc2Uod3NkbF9fZGVmaW5pdGlvbnMmKTsKK307CisKK2NsYXNzIHdzZGxfX2RlZmluaXRpb25zCit7IHB1YmxpYzoKKwlAeHNkX19OTVRPS0VOCQkJbmFtZTsKKwlAeHNkX19hbnlVUkkJCQl0YXJnZXROYW1lc3BhY2UJCT0gIiI7CisJQHhzZF9fTk1UT0tFTgkJCXZlcnNpb247CisJc3RkOjp2ZWN0b3I8d3NkbF9faW1wb3J0PglpbXBvcnQ7CQkJLy8gPHdzZGw6aW1wb3J0PioKKwl4c2RfX3N0cmluZwkJCWRvY3VtZW50YXRpb247CQkvLyA8d3NkbDpkb2N1bWVudGF0aW9uPj8KKwl3c2RsX190eXBlcwkJCSp0eXBlczsJCQkvLyA8d3NkbDp0eXBlcz4/CisJc3RkOjp2ZWN0b3I8d3NkbF9fbWVzc2FnZT4JbWVzc2FnZTsJCS8vIDx3c2RsOm1lc3NhZ2U+KgorCXN0ZDo6dmVjdG9yPHdzZGxfX3BvcnRUeXBlPglwb3J0VHlwZTsJCS8vIDx3c2RsOnBvcnRUeXBlPioKKwlzdGQ6OnZlY3Rvcjx3c2RsX19iaW5kaW5nPgliaW5kaW5nOwkJLy8gPHdzZGw6YmluZGluZz4qCisJc3RkOjp2ZWN0b3I8d3NkbF9fc2VydmljZT4Jc2VydmljZTsJCS8vIDx3c2RsOnNlcnZpY2U+KgorCXN0ZDo6dmVjdG9yPGd3c2RsX19wb3J0VHlwZT4JZ3dzZGxfX3BvcnRUeXBlXzsJLy8gPGd3c2RsOnBvcnRUeXBlPiogRm9yIHRoZSBtb21lbnQsIHdlIHdpbGwgaGFyZGNvZGUgdGhpcyB3aGljaCBtYWtlcyBpdCBlYXNpZXIgdG8gYWNjZXNzLiBXU0RMIDEuMSBkb2VzIG5vdCBhbGxvdyB0aGlzIHRvIGJlIGV4dGVuZGVkIGFueXdheQorCXN0cnVjdCBzb2FwCQkJKnNvYXA7CisgIHByaXZhdGU6CisJYm9vbAkJCQl1cGRhdGVkOworCWNoYXIqCQkJCWxvY2F0aW9uOworCWludAkJCQlyZWRpcnM7CisJU2V0T2ZTdHJpbmcJCQlidWlsdGluVHlwZVNldDsKKwlTZXRPZlN0cmluZwkJCWJ1aWx0aW5FbGVtZW50U2V0OworCVNldE9mU3RyaW5nCQkJYnVpbHRpbkF0dHJpYnV0ZVNldDsKKyAgcHVibGljOgorCQkJCQl3c2RsX19kZWZpbml0aW9ucygpOworCQkJCQl3c2RsX19kZWZpbml0aW9ucyhzdHJ1Y3Qgc29hcCosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CisJdmlydHVhbAkJCQl+d3NkbF9fZGVmaW5pdGlvbnMoKTsKKwlpbnQJCQkJZ2V0KHN0cnVjdCBzb2FwKik7CS8vIGdTT0FQIGdldHRlciBpcyB0cmlnZ2VyZWQgYWZ0ZXIgcGFyc2luZworCWludAkJCQlwcmVwcm9jZXNzKCk7CisJaW50CQkJCXRyYXZlcnNlKCk7CisJaW50CQkJCXJlYWQoaW50LCBjaGFyKiopOworCWludAkJCQlyZWFkKGNvbnN0IGNoYXIgKmN3ZCwgY29uc3QgY2hhciopOworCWNvbnN0IGNoYXIqCQkJc291cmNlTG9jYXRpb24oKTsKKwlpbnQJCQkJZXJyb3IoKTsKKwl2b2lkCQkJCXByaW50X2ZhdWx0KCk7CisJdm9pZAkJCQlidWlsdGluVHlwZShjb25zdCBjaGFyKik7CisJdm9pZAkJCQlidWlsdGluVHlwZXMoY29uc3QgU2V0T2ZTdHJpbmcmKTsKKwl2b2lkCQkJCWJ1aWx0aW5FbGVtZW50KGNvbnN0IGNoYXIqKTsKKwl2b2lkCQkJCWJ1aWx0aW5FbGVtZW50cyhjb25zdCBTZXRPZlN0cmluZyYpOworCXZvaWQJCQkJYnVpbHRpbkF0dHJpYnV0ZShjb25zdCBjaGFyKik7CisJdm9pZAkJCQlidWlsdGluQXR0cmlidXRlcyhjb25zdCBTZXRPZlN0cmluZyYpOworCWNvbnN0IFNldE9mU3RyaW5nJgkJYnVpbHRpblR5cGVzKCkgY29uc3Q7CisJY29uc3QgU2V0T2ZTdHJpbmcmCQlidWlsdGluRWxlbWVudHMoKSBjb25zdDsKKwljb25zdCBTZXRPZlN0cmluZyYJCWJ1aWx0aW5BdHRyaWJ1dGVzKCkgY29uc3Q7CisJZnJpZW5kIG9zdHJlYW0mCQkJb3BlcmF0b3I8PChvc3RyZWFtJiwgY29uc3Qgd3NkbF9fZGVmaW5pdGlvbnMmKTsKKwlmcmllbmQgaXN0cmVhbSYJCQlvcGVyYXRvcj4+KGlzdHJlYW0mLCB3c2RsX19kZWZpbml0aW9ucyYpOworfTsKKworZXh0ZXJuIG9zdHJlYW0gJm9wZXJhdG9yPDwob3N0cmVhbSAmbywgY29uc3Qgd3NkbF9fZGVmaW5pdGlvbnMgJmUpOworZXh0ZXJuIGlzdHJlYW0gJm9wZXJhdG9yPj4oaXN0cmVhbSAmaSwgd3NkbF9fZGVmaW5pdGlvbnMgJmUpOwpkaWZmIC0tZ2l0IGEvd3NkbC93c2RsMmguY3BwIGIvd3NkbC93c2RsMmguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2N2FiYTAKLS0tIC9kZXYvbnVsbAorKysgYi93c2RsL3dzZGwyaC5jcHAKQEAgLTAsMCArMSw0MTAgQEAKKy8qCisKK3dzZGwyaC5jcHAKKworV1NETCBwYXJzZXIgYW5kIGNvbnZlcnRlciB0byBnU09BUCBoZWFkZXIgZmlsZSBmb3JtYXQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dTT0FQIFhNTCBXZWIgc2VydmljZXMgdG9vbHMKK0NvcHlyaWdodCAoQykgMjAwMC0yMDA2LCBSb2JlcnQgdmFuIEVuZ2VsZW4sIEdlbml2aWEgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyB0d28gbGljZW5zZXM6CitHUEwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dQTCBsaWNlbnNlLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorCitBdXRob3IgY29udGFjdCBpbmZvcm1hdGlvbjoKK2VuZ2VsZW5AZ2VuaXZpYS5jb20gLyBlbmdlbGVuQGFjbS5vcmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBIGNvbW1lcmNpYWwgdXNlIGxpY2Vuc2UgaXMgYXZhaWxhYmxlIGZyb20gR2VuaXZpYSwgSW5jLiwgY29udGFjdEBnZW5pdmlhLmNvbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQnVpbGQ6CisJc29hcGNwcDIgLWlwd3NkbCB3c2RsLmgKKwlnKysgLW8gd3NkbDJoIHdzZGwyaC5jcHAgdHlwZXMuY3BwIHNlcnZpY2UuY3BwIHdzZGwuY3BwIHNjaGVtYS5jcHAgd3NkbEMuY3BwIHN0ZHNvYXAyLmNwcAorCQorVE9ETzoKKwlSZXNvbHZlIHJlbGF0aXZlIHZlcnN1cyBhYnNvbHV0ZSBpbXBvcnQgcGF0aHMgZm9yIHJlYWRpbmcgaW1wb3J0ZWQgV1NETC9zY2hlbWEgKHVzZSBVUkwgbG9jYWwgYWRkcmVzc2VzKQorCURvIG5vdCBnZW5lcmF0ZSBhYnN0cmFjdCBjb21wbGV4VHlwZXMsIGJ1dCBpbmNsdWRlIGRlZnMgaW4gZGVyaXZlZCB0eXBlcworCUhhbmRsZSBzaW1wbGVUeXBlIGRlcml2YXRpb24gZnJvbSBiYXNlNjQKKwlPcHRpb24gdG8gZGVmaW5lIGJhc2UgY2xhc3MgZm9yIGFsbCBjbGFzc2VzLCBlLmcuIC1iIHhzZF9fYW55VHlwZQorCUxvb2sgaW50byBpbXByb3ZpbmcgeHM6YW55CisKKyovCisKKyNpbmNsdWRlICJpbmNsdWRlcy5oIgorI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAic2VydmljZS5oIgorCitzdGF0aWMgdm9pZCBpbml0KCk7CitzdGF0aWMgdm9pZCBvcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndik7CisKK2ludCBhZmxhZyA9IDAsCisgICAgY2ZsYWcgPSAwLAorICAgIGRmbGFnID0gMCwKKyAgICBlZmxhZyA9IDAsCisgICAgZmZsYWcgPSAwLAorICAgIGdmbGFnID0gMCwKKyAgICBpZmxhZyA9IDAsCisgICAgbGZsYWcgPSAwLAorICAgIG1mbGFnID0gMCwKKyAgICBwZmxhZyA9IDAsCisgICAgc2ZsYWcgPSAwLAorICAgIHVmbGFnID0gMCwKKyAgICB2ZmxhZyA9IDAsCisgICAgd2ZsYWcgPSAwLAorICAgIHhmbGFnID0gMCwKKyAgICB5ZmxhZyA9IDAsCisgICAgemZsYWcgPSAwOworCitpbnQgaW5maWxlcyA9IDA7CitjaGFyICppbmZpbGVbMTAwXSwKKyAgICAgKm91dGZpbGUgPSBOVUxMLAorICAgICAqbWFwZmlsZSA9ICJ0eXBlbWFwLmRhdCIsCisgICAgICpwcm94eV9ob3N0ID0gTlVMTCwKKyAgICAgKmltcG9ydF9wYXRoID0gTlVMTDsKKworaW50IHByb3h5X3BvcnQgPSA4MDgwOworCitGSUxFICpzdHJlYW0gPSBzdGRvdXQ7CisKK1NldE9mU3RyaW5nIGV4dHVyaXM7CisKK2NvbnN0IGNoYXIgKnNlcnZpY2VfcHJlZml4ID0gTlVMTDsKK2NvbnN0IGNoYXIgKnNjaGVtYV9wcmVmaXggPSAibnMiOworCitjaGFyIGVsZW1lbnRmb3JtYXRbXSAgICAgICA9ICIgICAgJS0zNXMgICUtMzBzIjsKK2NoYXIgcG9pbnRlcmZvcm1hdFtdICAgICAgID0gIiAgICAlLTM1cyAqJS0zMHMiOworY2hhciBhdHRyaWJ1dGVmb3JtYXRbXSAgICAgPSAiICAgQCUtMzVzICAlLTMwcyI7CitjaGFyIHZlY3RvcmZvcm1hdFtdICAgICAgICA9ICIgICAgc3RkOjp2ZWN0b3I8JS0yM3M+ICUtMzBzIjsKK2NoYXIgcG9pbnRlcnZlY3RvcmZvcm1hdFtdID0gIiAgICBzdGQ6OnZlY3RvcjwlLTIycz4gKiUtMzBzIjsKK2NoYXIgYXJyYXlmb3JtYXRbXSAgICAgICAgID0gIiAgICAlLTM1cyAqX19wdHIlLTI1cyI7CitjaGFyIHNpemVmb3JtYXRbXSAgICAgICAgICA9ICIgICAgJS0zNXMgIF9fc2l6ZSUtMjRzIjsKK2NoYXIgb2Zmc2V0Zm9ybWF0W10gICAgICAgID0gIi8vICAlLTM1cyAgX19vZmZzZXQlLTIycyI7CitjaGFyIGNob2ljZWZvcm1hdFtdICAgICAgICA9ICIgICAgJS0zNXMgIF9fdW5pb24lLTIzcyI7CitjaGFyIHNjaGVtYWZvcm1hdFtdICAgICAgICA9ICIvL2dzb2FwICUtNXMgc2NoZW1hICVzOlx0JXNcbiI7CitjaGFyIHNlcnZpY2Vmb3JtYXRbXSAgICAgICA9ICIvL2dzb2FwICUtNHMgc2VydmljZSAlczpcdCVzICVzXG4iOworY2hhciBwYXJhZm9ybWF0W10gICAgICAgICAgPSAiICAgICUtMzVzJXMlcyVzIjsKK2NoYXIgYW5vbmZvcm1hdFtdICAgICAgICAgID0gIiAgICAlLTM1cyVzXyVzJXMiOworCitjaGFyIGNvcHlyaWdodG5vdGljZVtdID0gIlxuKiogIFRoZSBnU09BUCBXU0RMIHBhcnNlciBmb3IgQyBhbmQgQysrICJWRVJTSU9OIlxuKiogIENvcHlyaWdodCAoQykgMjAwMC0yMDA2IFJvYmVydCB2YW4gRW5nZWxlbiwgR2VuaXZpYSBJbmMuXG4qKiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBwcm9kdWN0IGlzIHByb3ZpZGVkIFwiYXMgaXNcIiwgd2l0aG91dCBhbnkgd2FycmFudHkuXG4qKiAgVGhlIGdTT0FQIFdTREwgcGFyc2VyIGlzIHJlbGVhc2VkIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR3byBsaWNlbnNlczpcbioqICBHUEwgb3IgdGhlIGNvbW1lcmNpYWwgbGljZW5zZSBieSBHZW5pdmlhIEluYy4gVXNlIG9wdGlvbiAtbCBmb3IgbW9yZSBpbmZvLlxuXG4iOworCitjaGFyIGxpY2Vuc2Vub3RpY2VbXSAgID0gIlwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cCitnU09BUCBYTUwgV2ViIHNlcnZpY2VzIHRvb2xzXG5cCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNiwgUm9iZXJ0IHZhbiBFbmdlbGVuLCBHZW5pdmlhIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKK1xuXAorVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyB0d28gbGljZW5zZXM6XG5cCitHUEwgb3IgR2VuaXZpYSdzIGxpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlLlxuXAorXG5cCitHUEwgbGljZW5zZS5cblwKK1xuXAorVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXJcblwKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlXG5cCitGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlclxuXAordmVyc2lvbi5cblwKK1xuXAorVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWVxuXAorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQVxuXAorUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG5cCitcblwKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGhcblwKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGVcblwKK1BsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0FcblwKK1xuXAorQXV0aG9yIGNvbnRhY3QgaW5mb3JtYXRpb246XG5cCitlbmdlbGVuQGdlbml2aWEuY29tIC8gZW5nZWxlbkBhY20ub3JnXG5cCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXAorQSBjb21tZXJjaWFsIHVzZSBsaWNlbnNlIGlzIGF2YWlsYWJsZSBmcm9tIEdlbml2aWEsIEluYy4sIGNvbnRhY3RAZ2VuaXZpYS5jb21cblwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7IGluaXQoKTsKKyAgb3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgZnByaW50ZihzdGRlcnIsIGNvcHlyaWdodG5vdGljZSk7CisgIGlmIChsZmxhZykKKyAgeyBmcHJpbnRmKHN0ZGVyciwgbGljZW5zZW5vdGljZSk7CisgICAgaWYgKCFpbmZpbGVzKQorICAgICAgZXhpdCgwKTsKKyAgfQorICB3c2RsX19kZWZpbml0aW9ucyBkZWZpbml0aW9uczsKKyAgaWYgKGluZmlsZXMpCisgIHsgaWYgKCFvdXRmaWxlKQorICAgIHsgaWYgKHN0cm5jbXAoaW5maWxlWzBdLCAiaHR0cDovLyIsIDcpICYmIHN0cm5jbXAoaW5maWxlWzBdLCAiaHR0cHM6Ly8iLCA4KSkKKyAgICAgIHsgY29uc3QgY2hhciAqcyA9IHN0cnJjaHIoaW5maWxlWzBdLCAnLicpOworICAgICAgICBpZiAocyAmJiAoIXN0cmNtcChzLCAiLndzZGwiKSB8fCAhc3RyY21wKHMsICIuZ3dzZGwiKSB8fCAhc3RyY21wKHMsICIueHNkIikpKQorICAgICAgICB7IG91dGZpbGUgPSBlc3RyZHVwKGluZmlsZVswXSk7CisgICAgICAgICAgb3V0ZmlsZVtzIC0gaW5maWxlWzBdICsgMV0gPSAnaCc7CisgICAgICAgICAgb3V0ZmlsZVtzIC0gaW5maWxlWzBdICsgMl0gPSAnXDAnOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyBvdXRmaWxlID0gKGNoYXIqKWVtYWxsb2Moc3RybGVuKGluZmlsZVswXSkgKyAzKTsKKyAgICAgICAgICBzdHJjcHkob3V0ZmlsZSwgaW5maWxlWzBdKTsKKyAgICAgICAgICBzdHJjYXQob3V0ZmlsZSwgIi5oIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKG91dGZpbGUpCisgIHsgc3RyZWFtID0gZm9wZW4ob3V0ZmlsZSwgInciKTsKKyAgICBpZiAoIXN0cmVhbSkKKyAgICB7IGZwcmludGYoc3RkZXJyLCAiQ2Fubm90IHdyaXRlIHRvICVzXG4iLCBvdXRmaWxlKTsKKyAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIGZwcmludGYoc3RkZXJyLCAiU2F2aW5nICVzXG5cbiIsIG91dGZpbGUpOworICB9CisgIERlZmluaXRpb25zIGRlZjsKKyAgZGVmaW5pdGlvbnMucmVhZChpbmZpbGVzLCBpbmZpbGUpOworICBpZiAoZGVmaW5pdGlvbnMuZXJyb3IoKSkKKyAgeyBkZWZpbml0aW9ucy5wcmludF9mYXVsdCgpOworICAgIGV4aXQoMSk7CisgIH0KKyAgZGVmaW5pdGlvbnMudHJhdmVyc2UoKTsKKyAgZGVmLmNvbXBpbGUoZGVmaW5pdGlvbnMpOworICBpZiAob3V0ZmlsZSkKKyAgeyBmY2xvc2Uoc3RyZWFtKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlxuVG8gY29tcGxldGUgdGhlIHByb2Nlc3MsIGNvbXBpbGUgd2l0aDpcbnNvYXBjcHAyICVzXG5cbiIsIG91dGZpbGUpOworICB9CisgIHJldHVybiAwOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vCUluaXRpYWxpemF0aW9uCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIHZvaWQgaW5pdCgpCit7IHN0cnVjdCBOYW1lc3BhY2UgKnAgPSBuYW1lc3BhY2VzOworICBpZiAocCkKKyAgeyBmb3IgKDsgcC0+aWQ7IHArKykKKyAgICB7IGlmIChwLT5pbiAmJiAqcC0+aW4pCisgICAgICAgIGV4dHVyaXMuaW5zZXJ0KHAtPmluKTsKKyAgICAgIGlmIChwLT5ucyAmJiAqcC0+bnMpCisgICAgICAgIGV4dHVyaXMuaW5zZXJ0KHAtPm5zKTsKKyAgICB9CisgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLwlQYXJzZSBjb21tYW5kIGxpbmUgb3B0aW9ucworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyB2b2lkIG9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreyBpbnQgaTsKKyAgaW5maWxlcyA9IDA7CisgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCisgIHsgY2hhciAqYSA9IGFyZ3ZbaV07CisgICAgaWYgKCphID09ICctJworI2lmZGVmIFdJTjMyCisgICAgIHx8ICphID09ICcvJworI2VuZGlmCisgICAgKQorICAgIHsgaW50IGcgPSAxOworICAgICAgd2hpbGUgKGcgJiYgKisrYSkKKyAgICAgIHsgc3dpdGNoICgqYSkKKyAgICAgICAgeyBjYXNlICdhJzoKKyAgICAgICAgICAgIGFmbGFnID0gMTsKKyAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ2MnOgorICAgICAgICAgICAgY2ZsYWcgPSAxOworICAgICAgIAkgICAgYnJlYWs7CisJICBjYXNlICdkJzoKKwkgICAgZGZsYWcgPSAxOworCSAgICBicmVhazsKKwkgIGNhc2UgJ2UnOgorCSAgICBlZmxhZyA9IDE7CisJICAgIGJyZWFrOworCSAgY2FzZSAnZic6CisJICAgIGZmbGFnID0gMTsKKwkgICAgYnJlYWs7CisJICBjYXNlICdnJzoKKwkgICAgZ2ZsYWcgPSAxOworCSAgICBicmVhazsKKwkgIGNhc2UgJ2knOgorCSAgICBpZmxhZyA9IDE7CisJICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ0knOgorICAgICAgICAgICAgYSsrOworICAgICAgICAgICAgZyA9IDA7CisgICAgICAgICAgICBpZiAoKmEpCisgICAgICAgICAgICAgIGltcG9ydF9wYXRoID0gYTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGkgPCBhcmdjICYmIGFyZ3ZbKytpXSkKKyAgICAgICAgICAgICAgaW1wb3J0X3BhdGggPSBhcmd2W2ldOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIndzZGwyaDogT3B0aW9uIC1JIHJlcXVpcmVzIGEgcGF0aCBhcmd1bWVudCIpOworCSAgICBicmVhazsKKwkgIGNhc2UgJ2wnOgorCSAgICBsZmxhZyA9IDE7CisJICAgIGJyZWFrOworCSAgY2FzZSAnbSc6CisJICAgIG1mbGFnID0gMTsKKwkgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAnbic6CisgICAgICAgICAgICBhKys7CisgICAgICAgICAgICBnID0gMDsKKyAgICAgICAgICAgIGlmICgqYSkKKyAgICAgICAgICAgICAgc2NoZW1hX3ByZWZpeCA9IGE7CisgICAgICAgICAgICBlbHNlIGlmIChpIDwgYXJnYyAmJiBhcmd2WysraV0pCisgICAgICAgICAgICAgIHNjaGVtYV9wcmVmaXggPSBhcmd2W2ldOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIndzZGwyaDogT3B0aW9uIC1uIHJlcXVpcmVzIGEgcHJlZml4IG5hbWUgYXJndW1lbnQiKTsKKwkgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAnTic6CisgICAgICAgICAgICBhKys7CisgICAgICAgICAgICBnID0gMDsKKyAgICAgICAgICAgIGlmICgqYSkKKyAgICAgICAgICAgICAgc2VydmljZV9wcmVmaXggPSBhOworICAgICAgICAgICAgZWxzZSBpZiAoaSA8IGFyZ2MgJiYgYXJndlsrK2ldKQorICAgICAgICAgICAgICBzZXJ2aWNlX3ByZWZpeCA9IGFyZ3ZbaV07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAid3NkbDJoOiBPcHRpb24gLU4gcmVxdWlyZXMgYSBwcmVmaXggbmFtZSBhcmd1bWVudCIpOworCSAgICBicmVhazsKKyAgICAgICAgICBjYXNlICdvJzoKKyAgICAgICAgICAgIGErKzsKKyAgICAgICAgICAgIGcgPSAwOworICAgICAgICAgICAgaWYgKCphKQorICAgICAgICAgICAgICBvdXRmaWxlID0gYTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGkgPCBhcmdjICYmIGFyZ3ZbKytpXSkKKyAgICAgICAgICAgICAgb3V0ZmlsZSA9IGFyZ3ZbaV07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAid3NkbDJoOiBPcHRpb24gLW8gcmVxdWlyZXMgYW4gb3V0cHV0IGZpbGUgYXJndW1lbnQiKTsKKwkgICAgYnJlYWs7CisJICBjYXNlICdwJzoKKwkgICAgcGZsYWcgPSAxOworCSAgICBicmVhazsKKwkgIGNhc2UgJ3InOgorICAgICAgICAgICAgYSsrOworICAgICAgICAgICAgZyA9IDA7CisgICAgICAgICAgICBpZiAoKmEpCisgICAgICAgICAgICAgIHByb3h5X2hvc3QgPSBhOworICAgICAgICAgICAgZWxzZSBpZiAoaSA8IGFyZ2MgJiYgYXJndlsrK2ldKQorICAgICAgICAgICAgICBwcm94eV9ob3N0ID0gYXJndltpXTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ3c2RsMmg6IE9wdGlvbiAtciByZXF1aXJlcyBhIHByb3h5IGhvc3Q6cG9ydCBhcmd1bWVudCIpOworICAgICAgICAgICAgaWYgKHByb3h5X2hvc3QpCisJICAgIHsgY2hhciAqcyA9IChjaGFyKillbWFsbG9jKHN0cmxlbihwcm94eV9ob3N0ICsgMSkpOworCSAgICAgIHN0cmNweShzLCBwcm94eV9ob3N0KTsKKwkgICAgICBwcm94eV9ob3N0ID0gczsKKwkgICAgICBzID0gc3RyY2hyKHByb3h5X2hvc3QsICc6Jyk7CisJICAgICAgaWYgKHMpCisJICAgICAgeyBwcm94eV9wb3J0ID0gc29hcF9zdHJ0b2wocyArIDEsIE5VTEwsIDEwKTsKKwkgICAgICAgICpzID0gJ1wwJzsKKwkgICAgICB9CisJICAgIH0KKwkgICAgYnJlYWs7CisJICBjYXNlICdzJzoKKwkgICAgc2ZsYWcgPSAxOworCSAgICBicmVhazsKKyAgICAgICAgICBjYXNlICd0JzoKKyAgICAgICAgICAgIGErKzsKKyAgICAgICAgICAgIGcgPSAwOworICAgICAgICAgICAgaWYgKCphKQorICAgICAgICAgICAgICBtYXBmaWxlID0gYTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGkgPCBhcmdjICYmIGFyZ3ZbKytpXSkKKyAgICAgICAgICAgICAgbWFwZmlsZSA9IGFyZ3ZbaV07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAid3NkbDJoOiBPcHRpb24gLXQgcmVxdWlyZXMgYSB0eXBlIG1hcCBmaWxlIGFyZ3VtZW50Iik7CisJICAgIGJyZWFrOworCSAgY2FzZSAndSc6CisJICAgIHVmbGFnID0gMTsKKwkgICAgYnJlYWs7CisJICBjYXNlICd2JzoKKwkgICAgdmZsYWcgPSAxOworCSAgICBicmVhazsKKwkgIGNhc2UgJ3cnOgorCSAgICB3ZmxhZyA9IDE7CisJICAgIGJyZWFrOworCSAgY2FzZSAneCc6CisJICAgIHhmbGFnID0gMTsKKwkgICAgYnJlYWs7CisJICBjYXNlICd5JzoKKwkgICAgeWZsYWcgPSAxOworCSAgICBicmVhazsKKwkgIGNhc2UgJ3onOgorCSAgICB6ZmxhZyA9IDE7CisJICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJz8nOgorICAgICAgICAgIGNhc2UgJ2gnOgorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogd3NkbDJoIFstYV0gWy1jXSBbLWRdIFstZV0gWy1mXSBbLWddIFstaF0gWy1JIHBhdGhdIFstbF0gWy1tXSBbLW4gbmFtZV0gWy1OIG5hbWVdIFstcF0gWy1yIHByb3h5aG9zdDpwb3J0XSBbLXNdIFstdCB0eXBlbWFwZmlsZS5kYXRdIFstdV0gWy12XSBbLXddIFsteF0gWy15XSBbLXpdIFstbyBvdXRmaWxlLmhdIGluZmlsZS53c2RsIGluZmlsZS54c2QgaHR0cDovL3d3dy4uLiAuLi5cblxuIik7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlwKKy1hICAgICAgZ2VuZXJhdGUgaW5kZXhlZCBzdHJ1Y3QgbmFtZXMgZm9yIGxvY2FsIGVsZW1lbnRzIHdpdGggYW5vbnltb3VzIHR5cGVzXG5cCistYyAgICAgIGdlbmVyYXRlIEMgc291cmNlIGNvZGVcblwKKy1kICAgICAgdXNlIERPTSB0byBwb3B1bGF0ZSB4czphbnkgYW5kIHhzZDphbnlUeXBlIGVsZW1lbnRzXG5cCistZSAgICAgIGRvbid0IHF1YWxpZnkgZW51bSBuYW1lc1xuXAorLWYgICAgICBnZW5lcmF0ZSBmbGF0IEMrKyBjbGFzcyBoaWVyYXJjaHlcblwKKy1nICAgICAgZ2VuZXJhdGUgZ2xvYmFsIHRvcC1sZXZlbCBlbGVtZW50IGRlY2xhcmF0aW9uc1xuXAorLWggICAgICBkaXNwbGF5IGhlbHAgaW5mb1xuXAorLUlwYXRoICB1c2UgcGF0aCB0byBmaW5kIGZpbGVzXG5cCistbCAgICAgIGluY2x1ZGUgbGljZW5zZSBpbmZvcm1hdGlvbiBpbiBvdXRwdXRcblwKKy1tICAgICAgdXNlIHhzZC5oIG1vZHVsZSB0byBpbXBvcnQgcHJpbWl0aXZlIHR5cGVzXG5cCistbm5hbWUgIHVzZSBuYW1lIGFzIHRoZSBiYXNlIG5hbWVzcGFjZSBwcmVmaXggaW5zdGVhZCBvZiAnbnMnXG5cCistTm5hbWUgIHVzZSBuYW1lIGFzIHRoZSBiYXNlIG5hbWVzcGFjZSBwcmVmaXggZm9yIHNlcnZpY2UgbmFtZXNwYWNlc1xuXAorLW9maWxlICBvdXRwdXQgdG8gZmlsZVxuXAorLXAgICAgICBjcmVhdGUgcG9seW1vcnBoaWMgdHlwZXMgd2l0aCBDKysgaW5oZXJpdGFuY2Ugd2l0aCBiYXNlIHhzZF9fYW55VHlwZVxuXAorLXJob3N0OnBvcnRcblwKKyAgICAgICAgY29ubmVjdCB2aWEgcHJveHkgaG9zdCBhbmQgcG9ydFxuXAorLXMgICAgICBkb24ndCBnZW5lcmF0ZSBTVEwgY29kZSAobm8gc3RkOjpzdHJpbmcgYW5kIG5vIHN0ZDo6dmVjdG9yKVxuXAorLXRmaWxlICB1c2UgdHlwZSBtYXAgZmlsZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGZpbGUgdHlwZW1hcC5kYXRcblwKKy11ICAgICAgZG9uJ3QgZ2VuZXJhdGUgdW5pb25zXG5cCistdiAgICAgIHZlcmJvc2Ugb3V0cHV0XG5cCistdyAgICAgIGFsd2F5cyB3cmFwIHJlc3BvbnNlIHBhcmFtZXRlcnMgaW4gYSByZXNwb25zZSBzdHJ1Y3QgKDw9MS4xLjQgYmVoYXZpb3IpXG5cCisteCAgICAgIGRvbid0IGdlbmVyYXRlIF9YTUwgYW55L2FueUF0dHJpYnV0ZSBleHRlbnNpYmlsaXR5IGVsZW1lbnRzXG5cCisteSAgICAgIGdlbmVyYXRlIHR5cGVkZWYgc3lub255bXMgZm9yIHN0cnVjdHMgYW5kIGVudW1zXG5cCisteiAgICAgIGdlbmVyYXRlIHBvaW50ZXItYmFzZWQgYXJyYXlzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IDwgZ1NPQVAgMi43LjZlXG5cCitpbmZpbGUud3NkbCBpbmZpbGUueHNkIGh0dHA6Ly93d3cuLi4gbGlzdCBvZiBpbnB1dCBzb3VyY2VzIChpZiBub25lIHVzZSBzdGRpbilcblwKK1xuIik7CisgICAgICAgICAgICBleGl0KDApOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIndzZGwyaDogVW5rbm93biBvcHRpb24gJXNcbiIsIGEpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeyBpbmZpbGVbaW5maWxlcysrXSA9IGFyZ3ZbaV07CisgICAgICBpZiAoaW5maWxlcyA+PSAxMDApCisgICAgICB7IGZwcmludGYoc3RkZXJyLCAid3NkbDJoOiB0b28gbWFueSBmaWxlc1xuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JTmFtZXNwYWNlcworLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0cnVjdCBOYW1lc3BhY2UgbmFtZXNwYWNlc1tdID0KK3sKKyAgeyJTT0FQLUVOViIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIsICJodHRwOi8vd3d3LnczLm9yZy8qL3NvYXAtZW52ZWxvcGUifSwKKyAgeyJTT0FQLUVOQyIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIsICJodHRwOi8vd3d3LnczLm9yZy8qL3NvYXAtZW5jb2RpbmcifSwKKyAgeyJ4c2kiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UifSwKKyAgeyJ4c2QiLCAiIn0sIC8vIGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIn0sIC8vIGRvbid0IHVzZSB0aGlzLCBpdCBtaWdodCBjb25mbGljdCB3aXRoIHhzCisgIHsieG1sIiwgImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSJ9LAorICB7InhzIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiwgImh0dHA6Ly93d3cudzMub3JnLyovWE1MU2NoZW1hIiB9LAorICB7Imh0dHAiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyJ9LAorICB7InNvYXAiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAqLyJ9LAorICB7Im1pbWUiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyJ9LAorICB7ImRpbWUiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMi8wNC9kaW1lL3dzZGwvIiwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLyovZGltZS93c2RsLyJ9LAorICB7IndzZGwiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8ifSwKKyAgeyJnd3NkbCIsICJodHRwOi8vd3d3LmdyaWRmb3J1bS5vcmcvbmFtZXNwYWNlcy8yMDAzLzAzL2dyaWRXU0RMRXh0ZW5zaW9ucyJ9LAorICB7InNkIiwgImh0dHA6Ly93d3cuZ3JpZGZvcnVtLm9yZy9uYW1lc3BhY2VzLzIwMDMvMDMvc2VydmljZURhdGEifSwKKyAge05VTEwsIE5VTEx9Cit9OwpkaWZmIC0tZ2l0IGEvd3NkbDJoLmV4ZSBiL3dzZGwyaC5leGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTRhMDYxZQotLS0gL2Rldi9udWxsCisrKyBiL3dzZGwyaC5leGUKQmluYXJ5IGZpbGVzIGRpZmZlcgo=